From 53246bfc9488e039dd8cfd9ed5f937845bb1e6ca Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Tue, 9 Jul 2024 08:11:40 -0400 Subject: [PATCH 01/31] Move phylogenetic workflow to phylogenetic directory Following the pathogen-repo-guide * https://github.com/nextstrain/pathogen-repo-guide/tree/e3bfb52c8155058a3d48592f4268a7382bf3e12a --- Snakefile => phylogenetic/Snakefile | 0 {config => phylogenetic/config}/auspice_config.json | 0 {config => phylogenetic/config}/colors.tsv | 0 {config => phylogenetic/config}/dropped_strains.txt | 0 {config => phylogenetic/config}/lassa_l.gb | 0 {config => phylogenetic/config}/lassa_s.gb | 0 {example_data => phylogenetic/example_data}/metadata_l.tsv | 0 {example_data => phylogenetic/example_data}/metadata_s.tsv | 0 {example_data => phylogenetic/example_data}/sequences_l.fasta | 0 {example_data => phylogenetic/example_data}/sequences_s.fasta | 0 10 files changed, 0 insertions(+), 0 deletions(-) rename Snakefile => phylogenetic/Snakefile (100%) rename {config => phylogenetic/config}/auspice_config.json (100%) rename {config => phylogenetic/config}/colors.tsv (100%) rename {config => phylogenetic/config}/dropped_strains.txt (100%) rename {config => phylogenetic/config}/lassa_l.gb (100%) rename {config => phylogenetic/config}/lassa_s.gb (100%) rename {example_data => phylogenetic/example_data}/metadata_l.tsv (100%) rename {example_data => phylogenetic/example_data}/metadata_s.tsv (100%) rename {example_data => phylogenetic/example_data}/sequences_l.fasta (100%) rename {example_data => phylogenetic/example_data}/sequences_s.fasta (100%) diff --git a/Snakefile b/phylogenetic/Snakefile similarity index 100% rename from Snakefile rename to phylogenetic/Snakefile diff --git a/config/auspice_config.json b/phylogenetic/config/auspice_config.json similarity index 100% rename from config/auspice_config.json rename to phylogenetic/config/auspice_config.json diff --git a/config/colors.tsv b/phylogenetic/config/colors.tsv similarity index 100% rename from config/colors.tsv rename to phylogenetic/config/colors.tsv diff --git a/config/dropped_strains.txt b/phylogenetic/config/dropped_strains.txt similarity index 100% rename from config/dropped_strains.txt rename to phylogenetic/config/dropped_strains.txt diff --git a/config/lassa_l.gb b/phylogenetic/config/lassa_l.gb similarity index 100% rename from config/lassa_l.gb rename to phylogenetic/config/lassa_l.gb diff --git a/config/lassa_s.gb b/phylogenetic/config/lassa_s.gb similarity index 100% rename from config/lassa_s.gb rename to phylogenetic/config/lassa_s.gb diff --git a/example_data/metadata_l.tsv b/phylogenetic/example_data/metadata_l.tsv similarity index 100% rename from example_data/metadata_l.tsv rename to phylogenetic/example_data/metadata_l.tsv diff --git a/example_data/metadata_s.tsv b/phylogenetic/example_data/metadata_s.tsv similarity index 100% rename from example_data/metadata_s.tsv rename to phylogenetic/example_data/metadata_s.tsv diff --git a/example_data/sequences_l.fasta b/phylogenetic/example_data/sequences_l.fasta similarity index 100% rename from example_data/sequences_l.fasta rename to phylogenetic/example_data/sequences_l.fasta diff --git a/example_data/sequences_s.fasta b/phylogenetic/example_data/sequences_s.fasta similarity index 100% rename from example_data/sequences_s.fasta rename to phylogenetic/example_data/sequences_s.fasta From bbb7e77ae6ddc1fdc61ed239dc3f8f456538ab6e Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Tue, 9 Jul 2024 08:18:04 -0400 Subject: [PATCH 02/31] Add copy example data custom rules Copy the "copy_example_data" custom rules from the pathogen-repo-guide * https://github.com/nextstrain/pathogen-repo-guide/tree/e3bfb52c8155058a3d48592f4268a7382bf3e12a/phylogenetic/build-configs/ci --- phylogenetic/Snakefile | 22 +++++++++++++++++++ phylogenetic/build-configs/ci/config.yaml | 7 ++++++ .../build-configs/ci/copy_example_data.smk | 17 ++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 phylogenetic/build-configs/ci/config.yaml create mode 100644 phylogenetic/build-configs/ci/copy_example_data.smk diff --git a/phylogenetic/Snakefile b/phylogenetic/Snakefile index dea800b..455e8d6 100644 --- a/phylogenetic/Snakefile +++ b/phylogenetic/Snakefile @@ -1,3 +1,10 @@ +""" +This is the main phylogenetic Snakefile that orchestrates the full phylogenetic +workflow and defines its default output(s). +""" +# The workflow filepaths are written relative to this Snakefile's base directory +workdir: workflow.current_basedir + SEGMENTS = ["l", "s"] rule all: @@ -188,3 +195,18 @@ rule export: --output-tree {output.auspice_tree} \ --output-meta {output.auspice_meta} """ + +# Allow users to import custom rules provided via the config. +# This allows users to run custom rules that can extend or override the workflow. +# A concrete example of using custom rules is the extension of the workflow with +# rules to support the Nextstrain automation that upload files and send internal +# Slack notifications. +# For extensions, the user will have to specify the custom rule targets when +# running the workflow. +# For overrides, the custom Snakefile will have to use the `ruleorder` directive +# to allow Snakemake to handle ambiguous rules +# https://snakemake.readthedocs.io/en/stable/snakefiles/rules.html#handling-ambiguous-rules +if "custom_rules" in config: + for rule_file in config["custom_rules"]: + + include: rule_file diff --git a/phylogenetic/build-configs/ci/config.yaml b/phylogenetic/build-configs/ci/config.yaml new file mode 100644 index 0000000..de89c67 --- /dev/null +++ b/phylogenetic/build-configs/ci/config.yaml @@ -0,0 +1,7 @@ +# This configuration file contains the custom configurations parameters +# for the CI workflow to run with the example data. + +# Custom rules to run as part of the CI automated workflow +# The paths should be relative to the phylogenetic directory. +custom_rules: + - build-configs/ci/copy_example_data.smk diff --git a/phylogenetic/build-configs/ci/copy_example_data.smk b/phylogenetic/build-configs/ci/copy_example_data.smk new file mode 100644 index 0000000..4e47ee4 --- /dev/null +++ b/phylogenetic/build-configs/ci/copy_example_data.smk @@ -0,0 +1,17 @@ +rule copy_example_data: + input: + sequences="example_data/sequences.fasta", + metadata="example_data/metadata.tsv", + output: + sequences="data/sequences.fasta", + metadata="data/metadata.tsv", + shell: + """ + cp -f {input.sequences} {output.sequences} + cp -f {input.metadata} {output.metadata} + """ + +# Add a Snakemake ruleorder directive here if you need to resolve ambiguous rules +# that have the same output as the copy_example_data rule. + +# ruleorder: copy_example_data > ... From 4b3c822ee577728752de545629c8eac776736638 Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Tue, 9 Jul 2024 08:22:25 -0400 Subject: [PATCH 03/31] Since lassa has S and L segments --- phylogenetic/build-configs/ci/copy_example_data.smk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/phylogenetic/build-configs/ci/copy_example_data.smk b/phylogenetic/build-configs/ci/copy_example_data.smk index 4e47ee4..4659824 100644 --- a/phylogenetic/build-configs/ci/copy_example_data.smk +++ b/phylogenetic/build-configs/ci/copy_example_data.smk @@ -1,10 +1,10 @@ rule copy_example_data: input: - sequences="example_data/sequences.fasta", - metadata="example_data/metadata.tsv", + sequences="example_data/sequences_{segment}.fasta", + metadata="example_data/metadata_{segment}.tsv", output: - sequences="data/sequences.fasta", - metadata="data/metadata.tsv", + sequences="data/sequences_{segment}.fasta", + metadata="data/metadata_{segment}.tsv", shell: """ cp -f {input.sequences} {output.sequences} From cf59a92f87222a996e202a6c59d2cf3e243c627d Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Tue, 9 Jul 2024 08:25:52 -0400 Subject: [PATCH 04/31] Update the CI --- .github/workflows/ci.yaml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b231f18..fe9b6f9 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,9 +1,16 @@ name: CI on: - - push - - pull_request + push: + branches: + - main + pull_request: + workflow_dispatch: + # Routinely check that we continue to work in the face of external changes. + schedule: + # Every day at 18:37 UTC / 10:37 Seattle (winter) / 11:37 Seattle (summer) + - cron: "37 18 * * *" jobs: ci: - uses: nextstrain/.github/.github/workflows/pathogen-repo-ci.yaml@v0 + uses: nextstrain/.github/.github/workflows/pathogen-repo-ci.yaml@master From ecb6aa3fe1cfecc656092194749302682c35a1a8 Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Tue, 9 Jul 2024 13:20:14 -0400 Subject: [PATCH 05/31] Move rules for preparing sequences to its own smk file Part of work to update this repo to match the pathogen-repo-guide. --- phylogenetic/Snakefile | 45 +--------------- phylogenetic/rules/prepare_sequences.smk | 69 ++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 44 deletions(-) create mode 100644 phylogenetic/rules/prepare_sequences.smk diff --git a/phylogenetic/Snakefile b/phylogenetic/Snakefile index 455e8d6..8881eae 100644 --- a/phylogenetic/Snakefile +++ b/phylogenetic/Snakefile @@ -21,50 +21,7 @@ rule files: files = rules.files.params -rule filter: - """ - Filtering to - - {params.sequences_per_group} sequence(s) per {params.group_by!s} - - excluding strains in {input.exclude} - """ - input: - sequences = "data/sequences_{segment}.fasta", - metadata = "data/metadata_{segment}.tsv", - exclude = files.dropped_strains - output: - sequences = "results/filtered_{segment}.fasta" - params: - group_by = "country year", - sequences_per_group = 2, - shell: - """ - augur filter \ - --sequences {input.sequences} \ - --metadata {input.metadata} \ - --exclude {input.exclude} \ - --output {output.sequences} \ - --group-by {params.group_by} \ - --sequences-per-group {params.sequences_per_group} - """ - -rule align: - """ - Aligning sequences to {input.reference} - - filling gaps with N - """ - input: - sequences = "results/filtered_{segment}.fasta", - reference = files.reference - output: - alignment = "results/aligned_{segment}.fasta" - shell: - """ - augur align \ - --sequences {input.sequences} \ - --reference-sequence {input.reference} \ - --output {output.alignment} \ - --fill-gaps - """ +include: "rules/prepare_sequences.smk" rule tree: """Building tree""" diff --git a/phylogenetic/rules/prepare_sequences.smk b/phylogenetic/rules/prepare_sequences.smk new file mode 100644 index 0000000..9077202 --- /dev/null +++ b/phylogenetic/rules/prepare_sequences.smk @@ -0,0 +1,69 @@ +""" +This part of the workflow prepares sequences for constructing the phylogenetic tree. + +REQUIRED INPUTS: + + metadata = data/metadata.tsv + sequences = data/sequences.fasta + reference = ../shared/reference.fasta + +OUTPUTS: + + prepared_sequences = results/prepared_sequences.fasta + +This part of the workflow usually includes the following steps: + + - augur index + - augur filter + - augur align + - augur mask + +See Augur's usage docs for these commands for more details. +""" + + +rule filter: + """ + Filtering to + - {params.sequences_per_group} sequence(s) per {params.group_by!s} + - excluding strains in {input.exclude} + """ + input: + sequences = "data/sequences_{segment}.fasta", + metadata = "data/metadata_{segment}.tsv", + exclude = files.dropped_strains + output: + sequences = "results/filtered_{segment}.fasta" + params: + group_by = "country year", + sequences_per_group = 2, + shell: + """ + augur filter \ + --sequences {input.sequences} \ + --metadata {input.metadata} \ + --exclude {input.exclude} \ + --output {output.sequences} \ + --group-by {params.group_by} \ + --sequences-per-group {params.sequences_per_group} + """ + +rule align: + """ + Aligning sequences to {input.reference} + - filling gaps with N + """ + input: + sequences = "results/filtered_{segment}.fasta", + reference = files.reference + output: + alignment = "results/aligned_{segment}.fasta" + shell: + """ + augur align \ + --sequences {input.sequences} \ + --reference-sequence {input.reference} \ + --output {output.alignment} \ + --fill-gaps + """ + From 1fd7d5557b9cc24d3b10214f94509e06c2ec760d Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Tue, 9 Jul 2024 13:21:22 -0400 Subject: [PATCH 06/31] Move rules for constructing phylogeny to its own smk file Part of work to update this repo to match the pathogen-repo-guide. --- phylogenetic/Snakefile | 51 +--------------- phylogenetic/rules/construct_phylogeny.smk | 70 ++++++++++++++++++++++ 2 files changed, 71 insertions(+), 50 deletions(-) create mode 100644 phylogenetic/rules/construct_phylogeny.smk diff --git a/phylogenetic/Snakefile b/phylogenetic/Snakefile index 8881eae..b9ab327 100644 --- a/phylogenetic/Snakefile +++ b/phylogenetic/Snakefile @@ -22,56 +22,7 @@ rule files: files = rules.files.params include: "rules/prepare_sequences.smk" - -rule tree: - """Building tree""" - input: - alignment = "results/aligned_{segment}.fasta" - output: - tree = "results/tree_raw_{segment}.nwk" - params: - method = "iqtree" - shell: - """ - augur tree \ - --alignment {input.alignment} \ - --output {output.tree} \ - --method {params.method} - """ - -rule refine: - """ - Refining tree - - estimate timetree - - use {params.coalescent} coalescent timescale - - estimate {params.date_inference} node dates - - fix clock rate at {params.clock_rate} - """ - input: - tree = "results/tree_raw_{segment}.nwk", - alignment = "results/aligned_{segment}.fasta", - metadata = "data/metadata_{segment}.tsv", - output: - tree = "results/tree_{segment}.nwk", - node_data = "results/branch_lengths_{segment}.json" - params: - coalescent = "opt", - date_inference = "marginal", - clock_rate = 0.0006 - shell: - """ - augur refine \ - --tree {input.tree} \ - --alignment {input.alignment} \ - --metadata {input.metadata} \ - --output-tree {output.tree} \ - --output-node-data {output.node_data} \ - --timetree \ - --coalescent {params.coalescent} \ - --clock-rate {params.clock_rate} \ - --date-confidence \ - --date-inference {params.date_inference} - """ +include: "rules/construct_phylogeny.smk" rule ancestral: """Reconstructing ancestral sequences and mutations""" diff --git a/phylogenetic/rules/construct_phylogeny.smk b/phylogenetic/rules/construct_phylogeny.smk new file mode 100644 index 0000000..942be5c --- /dev/null +++ b/phylogenetic/rules/construct_phylogeny.smk @@ -0,0 +1,70 @@ +""" +This part of the workflow constructs the phylogenetic tree. + +REQUIRED INPUTS: + + metadata = data/metadata.tsv + prepared_sequences = results/prepared_sequences.fasta + +OUTPUTS: + + tree = results/tree.nwk + branch_lengths = results/branch_lengths.json + +This part of the workflow usually includes the following steps: + + - augur tree + - augur refine + +See Augur's usage docs for these commands for more details. +""" + +rule tree: + """Building tree""" + input: + alignment = "results/aligned_{segment}.fasta" + output: + tree = "results/tree_raw_{segment}.nwk" + params: + method = "iqtree" + shell: + """ + augur tree \ + --alignment {input.alignment} \ + --output {output.tree} \ + --method {params.method} + """ + +rule refine: + """ + Refining tree + - estimate timetree + - use {params.coalescent} coalescent timescale + - estimate {params.date_inference} node dates + - fix clock rate at {params.clock_rate} + """ + input: + tree = "results/tree_raw_{segment}.nwk", + alignment = "results/aligned_{segment}.fasta", + metadata = "data/metadata_{segment}.tsv", + output: + tree = "results/tree_{segment}.nwk", + node_data = "results/branch_lengths_{segment}.json" + params: + coalescent = "opt", + date_inference = "marginal", + clock_rate = 0.0006 + shell: + """ + augur refine \ + --tree {input.tree} \ + --alignment {input.alignment} \ + --metadata {input.metadata} \ + --output-tree {output.tree} \ + --output-node-data {output.node_data} \ + --timetree \ + --coalescent {params.coalescent} \ + --clock-rate {params.clock_rate} \ + --date-confidence \ + --date-inference {params.date_inference} + """ From c3fa8f69fc504fde9ceea62f4d0df2514ab50d69 Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Tue, 9 Jul 2024 13:22:56 -0400 Subject: [PATCH 07/31] Move rules for annotating phylogeny to its own smk file Part of work to update this repo to match the pathogen-repo-guide. --- phylogenetic/Snakefile | 55 +-------------- phylogenetic/rules/annotate_phylogeny.smk | 86 +++++++++++++++++++++++ 2 files changed, 87 insertions(+), 54 deletions(-) create mode 100644 phylogenetic/rules/annotate_phylogeny.smk diff --git a/phylogenetic/Snakefile b/phylogenetic/Snakefile index b9ab327..18378c4 100644 --- a/phylogenetic/Snakefile +++ b/phylogenetic/Snakefile @@ -23,60 +23,7 @@ files = rules.files.params include: "rules/prepare_sequences.smk" include: "rules/construct_phylogeny.smk" - -rule ancestral: - """Reconstructing ancestral sequences and mutations""" - input: - tree = "results/tree_{segment}.nwk", - alignment = "results/aligned_{segment}.fasta", - output: - node_data = "results/nt_muts_{segment}.json" - params: - inference = "joint" - shell: - """ - augur ancestral \ - --tree {input.tree} \ - --alignment {input.alignment} \ - --output-node-data {output.node_data} \ - --inference {params.inference} - """ - -rule translate: - """Translating amino acid sequences""" - input: - tree = "results/tree_{segment}.nwk", - node_data = "results/nt_muts_{segment}.json", - reference = files.reference - output: - node_data = "results/aa_muts_{segment}.json" - shell: - """ - augur translate \ - --tree {input.tree} \ - --ancestral-sequences {input.node_data} \ - --reference-sequence {input.reference} \ - --output-node-data {output.node_data} - """ - -rule traits: - """Inferring ancestral traits for {params.columns!s}""" - input: - tree = "results/tree_{segment}.nwk", - metadata = "data/metadata_{segment}.tsv", - output: - node_data = "results/traits_{segment}.json", - params: - columns = "country" - shell: - """ - augur traits \ - --tree {input.tree} \ - --metadata {input.metadata} \ - --output-node-data {output.node_data} \ - --columns {params.columns} \ - --confidence - """ +include: "rules/annotate_phylogeny.smk" rule export: """Exporting data files for for auspice""" diff --git a/phylogenetic/rules/annotate_phylogeny.smk b/phylogenetic/rules/annotate_phylogeny.smk new file mode 100644 index 0000000..74dcc94 --- /dev/null +++ b/phylogenetic/rules/annotate_phylogeny.smk @@ -0,0 +1,86 @@ +""" +This part of the workflow creates additonal annotations for the phylogenetic tree. + +REQUIRED INPUTS: + + metadata = data/metadata.tsv + prepared_sequences = results/prepared_sequences.fasta + tree = results/tree.nwk + +OUTPUTS: + + node_data = results/*.json + + There are no required outputs for this part of the workflow as it depends + on which annotations are created. All outputs are expected to be node data + JSON files that can be fed into `augur export`. + + See Nextstrain's data format docs for more details on node data JSONs: + https://docs.nextstrain.org/page/reference/data-formats.html + +This part of the workflow usually includes the following steps: + + - augur traits + - augur ancestral + - augur translate + - augur clades + +See Augur's usage docs for these commands for more details. + +Custom node data files can also be produced by build-specific scripts in addition +to the ones produced by Augur commands. +""" + +rule ancestral: + """Reconstructing ancestral sequences and mutations""" + input: + tree = "results/tree_{segment}.nwk", + alignment = "results/aligned_{segment}.fasta", + output: + node_data = "results/nt_muts_{segment}.json" + params: + inference = "joint" + shell: + """ + augur ancestral \ + --tree {input.tree} \ + --alignment {input.alignment} \ + --output-node-data {output.node_data} \ + --inference {params.inference} + """ + +rule translate: + """Translating amino acid sequences""" + input: + tree = "results/tree_{segment}.nwk", + node_data = "results/nt_muts_{segment}.json", + reference = files.reference + output: + node_data = "results/aa_muts_{segment}.json" + shell: + """ + augur translate \ + --tree {input.tree} \ + --ancestral-sequences {input.node_data} \ + --reference-sequence {input.reference} \ + --output-node-data {output.node_data} + """ + +rule traits: + """Inferring ancestral traits for {params.columns!s}""" + input: + tree = "results/tree_{segment}.nwk", + metadata = "data/metadata_{segment}.tsv", + output: + node_data = "results/traits_{segment}.json", + params: + columns = "country" + shell: + """ + augur traits \ + --tree {input.tree} \ + --metadata {input.metadata} \ + --output-node-data {output.node_data} \ + --columns {params.columns} \ + --confidence + """ From ee0135ad6aeb9b15fee55a1e635a8ab165a9ef68 Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Tue, 9 Jul 2024 13:24:14 -0400 Subject: [PATCH 08/31] Move rule for exporting auspice json to its own smk file Part of work to update this repo to match the pathogen-repo-guide. --- phylogenetic/Snakefile | 27 +----------------- phylogenetic/rules/export.smk | 52 +++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 26 deletions(-) create mode 100644 phylogenetic/rules/export.smk diff --git a/phylogenetic/Snakefile b/phylogenetic/Snakefile index 18378c4..c35ae21 100644 --- a/phylogenetic/Snakefile +++ b/phylogenetic/Snakefile @@ -24,32 +24,7 @@ files = rules.files.params include: "rules/prepare_sequences.smk" include: "rules/construct_phylogeny.smk" include: "rules/annotate_phylogeny.smk" - -rule export: - """Exporting data files for for auspice""" - input: - tree = "results/tree_{segment}.nwk", - metadata = "data/metadata_{segment}.tsv", - branch_lengths = "results/branch_lengths_{segment}.json", - traits = "results/traits_{segment}.json", - nt_muts = "results/nt_muts_{segment}.json", - aa_muts = "results/aa_muts_{segment}.json", - colors = files.colors, - auspice_config = files.auspice_config - output: - auspice_tree = "auspice/lassa_{segment}_tree.json", - auspice_meta = "auspice/lassa_{segment}_meta.json" - shell: - """ - augur export v1 \ - --tree {input.tree} \ - --metadata {input.metadata} \ - --node-data {input.branch_lengths} {input.traits} {input.nt_muts} {input.aa_muts} \ - --colors {input.colors} \ - --auspice-config {input.auspice_config} \ - --output-tree {output.auspice_tree} \ - --output-meta {output.auspice_meta} - """ +include: "rules/export.smk" # Allow users to import custom rules provided via the config. # This allows users to run custom rules that can extend or override the workflow. diff --git a/phylogenetic/rules/export.smk b/phylogenetic/rules/export.smk new file mode 100644 index 0000000..19120db --- /dev/null +++ b/phylogenetic/rules/export.smk @@ -0,0 +1,52 @@ +""" +This part of the workflow collects the phylogenetic tree and annotations to +export a Nextstrain dataset. + +REQUIRED INPUTS: + + metadata = data/metadata.tsv + tree = results/tree.nwk + branch_lengths = results/branch_lengths.json + node_data = results/*.json + +OUTPUTS: + + auspice_json = auspice/${build_name}.json + + There are optional sidecar JSON files that can be exported as part of the dataset. + See Nextstrain's data format docs for more details on sidecar files: + https://docs.nextstrain.org/page/reference/data-formats.html + +This part of the workflow usually includes the following steps: + + - augur export v2 + - augur frequencies + +See Augur's usage docs for these commands for more details. +""" + +rule export: + """Exporting data files for for auspice""" + input: + tree = "results/tree_{segment}.nwk", + metadata = "data/metadata_{segment}.tsv", + branch_lengths = "results/branch_lengths_{segment}.json", + traits = "results/traits_{segment}.json", + nt_muts = "results/nt_muts_{segment}.json", + aa_muts = "results/aa_muts_{segment}.json", + colors = files.colors, + auspice_config = files.auspice_config + output: + auspice_tree = "auspice/lassa_{segment}_tree.json", + auspice_meta = "auspice/lassa_{segment}_meta.json" + shell: + """ + augur export v1 \ + --tree {input.tree} \ + --metadata {input.metadata} \ + --node-data {input.branch_lengths} {input.traits} {input.nt_muts} {input.aa_muts} \ + --colors {input.colors} \ + --auspice-config {input.auspice_config} \ + --output-tree {output.auspice_tree} \ + --output-meta {output.auspice_meta} + """ From c07871829371a94854a241dccdb9a06e986438b6 Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Tue, 9 Jul 2024 13:39:07 -0400 Subject: [PATCH 09/31] Move config values to config file --- phylogenetic/Snakefile | 12 +++------- phylogenetic/config/config.yaml | 28 ++++++++++++++++++++++ phylogenetic/rules/annotate_phylogeny.smk | 4 ++-- phylogenetic/rules/construct_phylogeny.smk | 6 ++--- phylogenetic/rules/export.smk | 4 ++-- phylogenetic/rules/prepare_sequences.smk | 8 +++---- 6 files changed, 42 insertions(+), 20 deletions(-) create mode 100644 phylogenetic/config/config.yaml diff --git a/phylogenetic/Snakefile b/phylogenetic/Snakefile index c35ae21..c6c7772 100644 --- a/phylogenetic/Snakefile +++ b/phylogenetic/Snakefile @@ -5,6 +5,9 @@ workflow and defines its default output(s). # The workflow filepaths are written relative to this Snakefile's base directory workdir: workflow.current_basedir +# Use default configuration values. Override with Snakemake's --configfile/--config options. +configfile: "config/config.yaml" + SEGMENTS = ["l", "s"] rule all: @@ -12,15 +15,6 @@ rule all: auspice_tree = expand("auspice/lassa_{segment}_tree.json", segment=SEGMENTS), auspice_meta = expand("auspice/lassa_{segment}_meta.json", segment=SEGMENTS) -rule files: - params: - dropped_strains = "config/dropped_strains.txt", - reference = "config/lassa_{segment}.gb", - colors = "config/colors.tsv", - auspice_config = "config/auspice_config.json" - -files = rules.files.params - include: "rules/prepare_sequences.smk" include: "rules/construct_phylogeny.smk" include: "rules/annotate_phylogeny.smk" diff --git a/phylogenetic/config/config.yaml b/phylogenetic/config/config.yaml new file mode 100644 index 0000000..9ce41b0 --- /dev/null +++ b/phylogenetic/config/config.yaml @@ -0,0 +1,28 @@ +# This configuration file should contain all required configuration parameters +# for the phylogenetic workflow to run to completion. +# +# Define optional config parameters with their default values here so that users +# do not have to dig through the workflows to figure out the default values + +filter: + exclude: "config/dropped_strains.txt" + group_by: "country year" + sequences_per_group: 2 + +tree: + method: "iqtree" + +refine: + coalescent: "opt" + date_inference: "marginal" + clock_rate: 0.0006 + +ancestral: + inference: "joint" + +traits: + columns: "country" + +export: + auspice_config: "config/auspice_config.json" + colors: "config/colors.tsv" diff --git a/phylogenetic/rules/annotate_phylogeny.smk b/phylogenetic/rules/annotate_phylogeny.smk index 74dcc94..96ab748 100644 --- a/phylogenetic/rules/annotate_phylogeny.smk +++ b/phylogenetic/rules/annotate_phylogeny.smk @@ -54,7 +54,7 @@ rule translate: input: tree = "results/tree_{segment}.nwk", node_data = "results/nt_muts_{segment}.json", - reference = files.reference + reference = "config/lassa_{segment}.gb" output: node_data = "results/aa_muts_{segment}.json" shell: @@ -74,7 +74,7 @@ rule traits: output: node_data = "results/traits_{segment}.json", params: - columns = "country" + columns = config['traits']['columns'] shell: """ augur traits \ diff --git a/phylogenetic/rules/construct_phylogeny.smk b/phylogenetic/rules/construct_phylogeny.smk index 942be5c..049c3f0 100644 --- a/phylogenetic/rules/construct_phylogeny.smk +++ b/phylogenetic/rules/construct_phylogeny.smk @@ -51,9 +51,9 @@ rule refine: tree = "results/tree_{segment}.nwk", node_data = "results/branch_lengths_{segment}.json" params: - coalescent = "opt", - date_inference = "marginal", - clock_rate = 0.0006 + coalescent = config['refine']['coalescent'], + date_inference = config['refine']['date_inference'], + clock_rate = config['refine']['clock_rate'], shell: """ augur refine \ diff --git a/phylogenetic/rules/export.smk b/phylogenetic/rules/export.smk index 19120db..18ff8b0 100644 --- a/phylogenetic/rules/export.smk +++ b/phylogenetic/rules/export.smk @@ -34,8 +34,8 @@ rule export: traits = "results/traits_{segment}.json", nt_muts = "results/nt_muts_{segment}.json", aa_muts = "results/aa_muts_{segment}.json", - colors = files.colors, - auspice_config = files.auspice_config + colors = config['export']['colors'], + auspice_config = config['export']['auspice_config'], output: auspice_tree = "auspice/lassa_{segment}_tree.json", auspice_meta = "auspice/lassa_{segment}_meta.json" diff --git a/phylogenetic/rules/prepare_sequences.smk b/phylogenetic/rules/prepare_sequences.smk index 9077202..5d0eca2 100644 --- a/phylogenetic/rules/prepare_sequences.smk +++ b/phylogenetic/rules/prepare_sequences.smk @@ -31,12 +31,12 @@ rule filter: input: sequences = "data/sequences_{segment}.fasta", metadata = "data/metadata_{segment}.tsv", - exclude = files.dropped_strains + exclude = config['filter']['exclude'] output: sequences = "results/filtered_{segment}.fasta" params: - group_by = "country year", - sequences_per_group = 2, + group_by = config['filter']['group_by'], + sequences_per_group = config['filter']['sequences_per_group'], shell: """ augur filter \ @@ -55,7 +55,7 @@ rule align: """ input: sequences = "results/filtered_{segment}.fasta", - reference = files.reference + reference = "config/lassa_{segment}.gb" output: alignment = "results/aligned_{segment}.fasta" shell: From 05dcd7dfa3b2b57f322588589bf6f3b0e90b7198 Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Tue, 9 Jul 2024 14:01:53 -0400 Subject: [PATCH 10/31] Update augur export v1 to v2 --- phylogenetic/Snakefile | 3 +- phylogenetic/config/auspice_config.json | 81 ++++++++++++++----------- phylogenetic/rules/export.smk | 9 ++- 3 files changed, 50 insertions(+), 43 deletions(-) diff --git a/phylogenetic/Snakefile b/phylogenetic/Snakefile index c6c7772..36e5713 100644 --- a/phylogenetic/Snakefile +++ b/phylogenetic/Snakefile @@ -12,8 +12,7 @@ SEGMENTS = ["l", "s"] rule all: input: - auspice_tree = expand("auspice/lassa_{segment}_tree.json", segment=SEGMENTS), - auspice_meta = expand("auspice/lassa_{segment}_meta.json", segment=SEGMENTS) + auspice_tree = expand("auspice/lassa_{segment}.json", segment=SEGMENTS) include: "rules/prepare_sequences.smk" include: "rules/construct_phylogeny.smk" diff --git a/phylogenetic/config/auspice_config.json b/phylogenetic/config/auspice_config.json index e5d4437..45dbbf7 100644 --- a/phylogenetic/config/auspice_config.json +++ b/phylogenetic/config/auspice_config.json @@ -1,36 +1,45 @@ -{ - "title": "Real-time tracking of Lassa virus evolution", - "color_options": { - "gt": { - "menuItem": "genotype", - "legendTitle": "Genotype", - "type": "discrete", - "key": "genotype" - }, - "num_date": { - "menuItem": "date", - "legendTitle": "Sampling date", - "type": "continuous", - "key": "num_date" - }, - "authors": { - "key":"authors", - "legendTitle":"Authors", - "menuItem":"authors", - "type":"discrete" - }, - "country": { - } - }, - "geo": [ - "country" - ], - "maintainer": [ - "ACEGID Redeemer's University", - "http://acegid.org/" - ], - "filters": [ - "country", - "authors" - ] -} +{ + "title": "Real-time tracking of Lassa virus evolution", + "data_provenance": [ + { + "name": "GenBank", + "url": "https://www.ncbi.nlm.nih.gov/genbank/" + } + ], + "colorings": [ + { + "key": "gt", + "title": "Genotype", + "type": "categorical" + }, + { + "key": "num_date", + "title": "Date", + "type": "continuous" + }, + { + "key": "author", + "title": "Author", + "type": "categorical" + }, + { + "key": "country", + "title": "Country", + "type": "categorical" + } + ], + "geo_resolutions": [ + "country" + ], + "maintainer": [ + "ACEGID Redeemer's University", + "http://acegid.org/" + ], + "filters": [ + "country", + "author" + ], + "metadata_columns": [ + "genbank_accession" + ] +} diff --git a/phylogenetic/rules/export.smk b/phylogenetic/rules/export.smk index 18ff8b0..3ee444d 100644 --- a/phylogenetic/rules/export.smk +++ b/phylogenetic/rules/export.smk @@ -37,16 +37,15 @@ rule export: colors = config['export']['colors'], auspice_config = config['export']['auspice_config'], output: - auspice_tree = "auspice/lassa_{segment}_tree.json", - auspice_meta = "auspice/lassa_{segment}_meta.json" + auspice = "auspice/lassa_{segment}.json", shell: """ - augur export v1 \ + augur export v2 \ --tree {input.tree} \ --metadata {input.metadata} \ --node-data {input.branch_lengths} {input.traits} {input.nt_muts} {input.aa_muts} \ --colors {input.colors} \ --auspice-config {input.auspice_config} \ - --output-tree {output.auspice_tree} \ - --output-meta {output.auspice_meta} + --output {output.auspice} \ + --include-root-sequence-inline """ From 5bfd527315a818e77aea5119c94677f4e5f4139f Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Tue, 9 Jul 2024 14:08:35 -0400 Subject: [PATCH 11/31] Move config to defaults to match pathogen-repo-guide --- phylogenetic/Snakefile | 2 +- phylogenetic/{config => defaults}/auspice_config.json | 0 phylogenetic/{config => defaults}/colors.tsv | 0 phylogenetic/{config => defaults}/config.yaml | 6 +++--- phylogenetic/{config => defaults}/dropped_strains.txt | 0 phylogenetic/{config => defaults}/lassa_l.gb | 0 phylogenetic/{config => defaults}/lassa_s.gb | 0 phylogenetic/rules/annotate_phylogeny.smk | 2 +- phylogenetic/rules/prepare_sequences.smk | 2 +- 9 files changed, 6 insertions(+), 6 deletions(-) rename phylogenetic/{config => defaults}/auspice_config.json (100%) rename phylogenetic/{config => defaults}/colors.tsv (100%) rename phylogenetic/{config => defaults}/config.yaml (81%) rename phylogenetic/{config => defaults}/dropped_strains.txt (100%) rename phylogenetic/{config => defaults}/lassa_l.gb (100%) rename phylogenetic/{config => defaults}/lassa_s.gb (100%) diff --git a/phylogenetic/Snakefile b/phylogenetic/Snakefile index 36e5713..c9feac8 100644 --- a/phylogenetic/Snakefile +++ b/phylogenetic/Snakefile @@ -6,7 +6,7 @@ workflow and defines its default output(s). workdir: workflow.current_basedir # Use default configuration values. Override with Snakemake's --configfile/--config options. -configfile: "config/config.yaml" +configfile: "defaults/config.yaml" SEGMENTS = ["l", "s"] diff --git a/phylogenetic/config/auspice_config.json b/phylogenetic/defaults/auspice_config.json similarity index 100% rename from phylogenetic/config/auspice_config.json rename to phylogenetic/defaults/auspice_config.json diff --git a/phylogenetic/config/colors.tsv b/phylogenetic/defaults/colors.tsv similarity index 100% rename from phylogenetic/config/colors.tsv rename to phylogenetic/defaults/colors.tsv diff --git a/phylogenetic/config/config.yaml b/phylogenetic/defaults/config.yaml similarity index 81% rename from phylogenetic/config/config.yaml rename to phylogenetic/defaults/config.yaml index 9ce41b0..3de62d0 100644 --- a/phylogenetic/config/config.yaml +++ b/phylogenetic/defaults/config.yaml @@ -5,7 +5,7 @@ # do not have to dig through the workflows to figure out the default values filter: - exclude: "config/dropped_strains.txt" + exclude: "defaults/dropped_strains.txt" group_by: "country year" sequences_per_group: 2 @@ -24,5 +24,5 @@ traits: columns: "country" export: - auspice_config: "config/auspice_config.json" - colors: "config/colors.tsv" + auspice_config: "defaults/auspice_config.json" + colors: "defaults/colors.tsv" diff --git a/phylogenetic/config/dropped_strains.txt b/phylogenetic/defaults/dropped_strains.txt similarity index 100% rename from phylogenetic/config/dropped_strains.txt rename to phylogenetic/defaults/dropped_strains.txt diff --git a/phylogenetic/config/lassa_l.gb b/phylogenetic/defaults/lassa_l.gb similarity index 100% rename from phylogenetic/config/lassa_l.gb rename to phylogenetic/defaults/lassa_l.gb diff --git a/phylogenetic/config/lassa_s.gb b/phylogenetic/defaults/lassa_s.gb similarity index 100% rename from phylogenetic/config/lassa_s.gb rename to phylogenetic/defaults/lassa_s.gb diff --git a/phylogenetic/rules/annotate_phylogeny.smk b/phylogenetic/rules/annotate_phylogeny.smk index 96ab748..f10f5aa 100644 --- a/phylogenetic/rules/annotate_phylogeny.smk +++ b/phylogenetic/rules/annotate_phylogeny.smk @@ -54,7 +54,7 @@ rule translate: input: tree = "results/tree_{segment}.nwk", node_data = "results/nt_muts_{segment}.json", - reference = "config/lassa_{segment}.gb" + reference = "defaults/lassa_{segment}.gb" output: node_data = "results/aa_muts_{segment}.json" shell: diff --git a/phylogenetic/rules/prepare_sequences.smk b/phylogenetic/rules/prepare_sequences.smk index 5d0eca2..d09f28d 100644 --- a/phylogenetic/rules/prepare_sequences.smk +++ b/phylogenetic/rules/prepare_sequences.smk @@ -55,7 +55,7 @@ rule align: """ input: sequences = "results/filtered_{segment}.fasta", - reference = "config/lassa_{segment}.gb" + reference = "defaults/lassa_{segment}.gb" output: alignment = "results/aligned_{segment}.fasta" shell: From 003ecfcc99f9b2bd3035bc8b42ecf68c80e0678b Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Tue, 9 Jul 2024 14:19:01 -0400 Subject: [PATCH 12/31] Add description statement --- phylogenetic/defaults/config.yaml | 1 + phylogenetic/defaults/description.md | 10 ++++++++++ phylogenetic/rules/export.smk | 2 ++ 3 files changed, 13 insertions(+) create mode 100644 phylogenetic/defaults/description.md diff --git a/phylogenetic/defaults/config.yaml b/phylogenetic/defaults/config.yaml index 3de62d0..98a6eff 100644 --- a/phylogenetic/defaults/config.yaml +++ b/phylogenetic/defaults/config.yaml @@ -26,3 +26,4 @@ traits: export: auspice_config: "defaults/auspice_config.json" colors: "defaults/colors.tsv" + description: "defaults/description.md" diff --git a/phylogenetic/defaults/description.md b/phylogenetic/defaults/description.md new file mode 100644 index 0000000..3233a8a --- /dev/null +++ b/phylogenetic/defaults/description.md @@ -0,0 +1,10 @@ +We gratefully acknowledge the authors, originating and submitting laboratories of the genetic sequences and metadata for sharing their work. Please note that although data generators have generously shared data in an open fashion, that does not mean there should be free license to publish on this data. Data generators should be cited where possible and collaborations should be sought in some circumstances. Please try to avoid scooping someone else's work. Reach out if uncertain. + +We curate sequence data and metadata from NCBI as the starting point for our analyses. + + diff --git a/phylogenetic/rules/export.smk b/phylogenetic/rules/export.smk index 3ee444d..2e217f3 100644 --- a/phylogenetic/rules/export.smk +++ b/phylogenetic/rules/export.smk @@ -35,6 +35,7 @@ rule export: nt_muts = "results/nt_muts_{segment}.json", aa_muts = "results/aa_muts_{segment}.json", colors = config['export']['colors'], + description = config['export']['description'], auspice_config = config['export']['auspice_config'], output: auspice = "auspice/lassa_{segment}.json", @@ -45,6 +46,7 @@ rule export: --metadata {input.metadata} \ --node-data {input.branch_lengths} {input.traits} {input.nt_muts} {input.aa_muts} \ --colors {input.colors} \ + --description {input.description} \ --auspice-config {input.auspice_config} \ --output {output.auspice} \ --include-root-sequence-inline From 4d5aeec36f400a9ac63a54c9151cf5d586abd221 Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Tue, 9 Jul 2024 14:20:55 -0400 Subject: [PATCH 13/31] Copy phylogenetic instructions from pathogen-repo-guide --- phylogenetic/README.md | 59 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 phylogenetic/README.md diff --git a/phylogenetic/README.md b/phylogenetic/README.md new file mode 100644 index 0000000..7e961c8 --- /dev/null +++ b/phylogenetic/README.md @@ -0,0 +1,59 @@ +# Phylogenetic + +This workflow uses metadata and sequences to produce one or multiple [Nextstrain datasets][] +that can be visualized in Auspice. + +## Workflow Usage + +The workflow can be run from the top level pathogen repo directory: +``` +nextstrain build phylogenetic +``` + +Alternatively, the workflow can also be run from within the phylogenetic directory: +``` +cd phylogenetic +nextstrain build . +``` + +This produces the default outputs of the phylogenetic workflow: + +- auspice_json(s) = auspice/*.json + +## Data Requirements + +The core phylogenetic workflow will use metadata values as-is, so please do any +desired data formatting and curations as part of the [ingest](../ingest/) workflow. + +1. The metadata must include an ID column that can be used as as exact match for + the sequence ID present in the FASTA headers. +2. The `date` column in the metadata must be in ISO 8601 date format (i.e. YYYY-MM-DD). +3. Ambiguous dates should be masked with `XX` (e.g. 2023-01-XX). + +## Defaults + +The defaults directory contains all of the default configurations for the phylogenetic workflow. + +[defaults/config.yaml](defaults/config.yaml) contains all of the default configuration parameters +used for the phylogenetic workflow. Use Snakemake's `--configfile`/`--config` +options to override these default values. + +## Snakefile and rules + +The rules directory contains separate Snakefiles (`*.smk`) as modules of the core phylogenetic workflow. +The modules of the workflow are in separate files to keep the main phylogenetic [Snakefile](Snakefile) succinct and organized. + +The `workdir` is hardcoded to be the phylogenetic directory so all filepaths for +inputs/outputs should be relative to the phylogenetic directory. + +Modules are all [included](https://snakemake.readthedocs.io/en/stable/snakefiles/modularization.html#includes) +in the main Snakefile in the order that they are expected to run. + +## Build configs + +The build-configs directory contains custom configs and rules that override and/or +extend the default workflow. + +- [ci](build-configs/ci/) - CI build that runs with example data + +[Nextstrain datasets]: https://docs.nextstrain.org/en/latest/reference/glossary.html#term-dataset From d81791cf2a7a22aea0ebc184d63ef1782e1d9627 Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Wed, 10 Jul 2024 11:03:51 -0400 Subject: [PATCH 14/31] Download sequences and metadata from data.nextstrain.org --- phylogenetic/defaults/config.yaml | 5 +++++ phylogenetic/rules/prepare_sequences.smk | 28 +++++++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/phylogenetic/defaults/config.yaml b/phylogenetic/defaults/config.yaml index 98a6eff..add6a29 100644 --- a/phylogenetic/defaults/config.yaml +++ b/phylogenetic/defaults/config.yaml @@ -4,6 +4,11 @@ # Define optional config parameters with their default values here so that users # do not have to dig through the workflows to figure out the default values +# Sequences must be FASTA and metadata must be TSV +# Both files must be zstd compressed +sequences_url: "https://data.nextstrain.org/files/workflows/lassa/{segment}/sequences.fasta.zst" +metadata_url: "https://data.nextstrain.org/files/workflows/lassa/{segment}/metadata.tsv.zst" + filter: exclude: "defaults/dropped_strains.txt" group_by: "country year" diff --git a/phylogenetic/rules/prepare_sequences.smk b/phylogenetic/rules/prepare_sequences.smk index d09f28d..be8ee0e 100644 --- a/phylogenetic/rules/prepare_sequences.smk +++ b/phylogenetic/rules/prepare_sequences.smk @@ -21,6 +21,33 @@ This part of the workflow usually includes the following steps: See Augur's usage docs for these commands for more details. """ +rule download: + """Downloading sequences and metadata from data.nextstrain.org""" + output: + sequences = "data/sequences_{segment}.fasta.zst", + metadata = "data/metadata_{segment}.tsv.zst" + params: + sequences_url = config["sequences_url"], + metadata_url = config["metadata_url"], + shell: + """ + curl -fsSL --compressed {params.sequences_url:q} --output {output.sequences} + curl -fsSL --compressed {params.metadata_url:q} --output {output.metadata} + """ + +rule decompress: + """Decompressing sequences and metadata""" + input: + sequences = "data/sequences_{segment}.fasta.zst", + metadata = "data/metadata_{segment}.tsv.zst" + output: + sequences = "data/sequences_{segment}.fasta", + metadata = "data/metadata_{segment}.tsv" + shell: + """ + zstd -d -c {input.sequences} > {output.sequences} + zstd -d -c {input.metadata} > {output.metadata} + """ rule filter: """ @@ -66,4 +93,3 @@ rule align: --output {output.alignment} \ --fill-gaps """ - From d7b59310d737fdf7f2af858e68d65159d95d864b Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Wed, 10 Jul 2024 11:39:47 -0400 Subject: [PATCH 15/31] Pass curated GenBank data through the rest of pipeline --- phylogenetic/defaults/config.yaml | 2 ++ phylogenetic/rules/annotate_phylogeny.smk | 2 ++ phylogenetic/rules/construct_phylogeny.smk | 2 ++ phylogenetic/rules/export.smk | 3 +++ phylogenetic/rules/prepare_sequences.smk | 5 ++++- 5 files changed, 13 insertions(+), 1 deletion(-) diff --git a/phylogenetic/defaults/config.yaml b/phylogenetic/defaults/config.yaml index add6a29..aca0062 100644 --- a/phylogenetic/defaults/config.yaml +++ b/phylogenetic/defaults/config.yaml @@ -9,6 +9,8 @@ sequences_url: "https://data.nextstrain.org/files/workflows/lassa/{segment}/sequences.fasta.zst" metadata_url: "https://data.nextstrain.org/files/workflows/lassa/{segment}/metadata.tsv.zst" +strain_id_field: "accession" + filter: exclude: "defaults/dropped_strains.txt" group_by: "country year" diff --git a/phylogenetic/rules/annotate_phylogeny.smk b/phylogenetic/rules/annotate_phylogeny.smk index f10f5aa..9951de6 100644 --- a/phylogenetic/rules/annotate_phylogeny.smk +++ b/phylogenetic/rules/annotate_phylogeny.smk @@ -74,12 +74,14 @@ rule traits: output: node_data = "results/traits_{segment}.json", params: + strain_id_field = config["strain_id_field"], columns = config['traits']['columns'] shell: """ augur traits \ --tree {input.tree} \ --metadata {input.metadata} \ + --metadata-id-columns {params.strain_id_field} \ --output-node-data {output.node_data} \ --columns {params.columns} \ --confidence diff --git a/phylogenetic/rules/construct_phylogeny.smk b/phylogenetic/rules/construct_phylogeny.smk index 049c3f0..89fa9e0 100644 --- a/phylogenetic/rules/construct_phylogeny.smk +++ b/phylogenetic/rules/construct_phylogeny.smk @@ -51,6 +51,7 @@ rule refine: tree = "results/tree_{segment}.nwk", node_data = "results/branch_lengths_{segment}.json" params: + strain_id_field = config["strain_id_field"], coalescent = config['refine']['coalescent'], date_inference = config['refine']['date_inference'], clock_rate = config['refine']['clock_rate'], @@ -60,6 +61,7 @@ rule refine: --tree {input.tree} \ --alignment {input.alignment} \ --metadata {input.metadata} \ + --metadata-id-columns {params.strain_id_field} \ --output-tree {output.tree} \ --output-node-data {output.node_data} \ --timetree \ diff --git a/phylogenetic/rules/export.smk b/phylogenetic/rules/export.smk index 2e217f3..a537e34 100644 --- a/phylogenetic/rules/export.smk +++ b/phylogenetic/rules/export.smk @@ -39,11 +39,14 @@ rule export: auspice_config = config['export']['auspice_config'], output: auspice = "auspice/lassa_{segment}.json", + params: + strain_id_field = config["strain_id_field"], shell: """ augur export v2 \ --tree {input.tree} \ --metadata {input.metadata} \ + --metadata-id-columns {params.strain_id_field} \ --node-data {input.branch_lengths} {input.traits} {input.nt_muts} {input.aa_muts} \ --colors {input.colors} \ --description {input.description} \ diff --git a/phylogenetic/rules/prepare_sequences.smk b/phylogenetic/rules/prepare_sequences.smk index be8ee0e..f5253d9 100644 --- a/phylogenetic/rules/prepare_sequences.smk +++ b/phylogenetic/rules/prepare_sequences.smk @@ -62,6 +62,7 @@ rule filter: output: sequences = "results/filtered_{segment}.fasta" params: + strain_id_field = config["strain_id_field"], group_by = config['filter']['group_by'], sequences_per_group = config['filter']['sequences_per_group'], shell: @@ -69,6 +70,7 @@ rule filter: augur filter \ --sequences {input.sequences} \ --metadata {input.metadata} \ + --metadata-id-columns {params.strain_id_field} \ --exclude {input.exclude} \ --output {output.sequences} \ --group-by {params.group_by} \ @@ -91,5 +93,6 @@ rule align: --sequences {input.sequences} \ --reference-sequence {input.reference} \ --output {output.alignment} \ - --fill-gaps + --fill-gaps \ + --remove-reference """ From ee21b9f2a8a68af92061fa61b73e6e8ce55ac1b6 Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Wed, 10 Jul 2024 12:04:07 -0400 Subject: [PATCH 16/31] Bypass duplicate reference strain detected Augur align detects the reference strain in the reference file and the curated dataset, and throws a "duplicate strain error" `Duplicate strains of "KM822127" detected` Usually I bypass this using `augur align --remove-reference` but this error is still showing up. Ergo, adding a postfix to the reference IDs to bypass error. --- phylogenetic/defaults/lassa_l.gb | 4 ++-- phylogenetic/defaults/lassa_s.gb | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/phylogenetic/defaults/lassa_l.gb b/phylogenetic/defaults/lassa_l.gb index d4e8d10..e95e241 100644 --- a/phylogenetic/defaults/lassa_l.gb +++ b/phylogenetic/defaults/lassa_l.gb @@ -1,7 +1,7 @@ -LOCUS KM822127 7272 bp RNA linear VRL 14-OCT-2014 +LOCUS KM822127_REF 7272 bp RNA linear VRL 14-OCT-2014 DEFINITION Lassa virus strain Pinneo-NIG-1969 segment L Z protein (Z) and polymerase (L) genes, complete cds. -ACCESSION KM822127 +ACCESSION KM822127_REF VERSION KM822127.1 DBLINK BioProject: PRJNA254017 KEYWORDS . diff --git a/phylogenetic/defaults/lassa_s.gb b/phylogenetic/defaults/lassa_s.gb index eff9238..fd1a325 100644 --- a/phylogenetic/defaults/lassa_s.gb +++ b/phylogenetic/defaults/lassa_s.gb @@ -1,7 +1,7 @@ -LOCUS GU481068 3377 bp RNA linear VRL 07-MAR-2011 +LOCUS GU481068_REF 3377 bp RNA linear VRL 07-MAR-2011 DEFINITION Lassa virus strain Nig08_04 glycoprotein precursor (GPC) and nucleoprotein (NP) genes, complete cds. -ACCESSION GU481068 +ACCESSION GU481068_REF VERSION GU481068.1 KEYWORDS . SOURCE Lassa mammarenavirus From 543de0bad62c2446909a911ae474212306823279 Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Wed, 10 Jul 2024 12:07:52 -0400 Subject: [PATCH 17/31] Fixup: Add description statement --- phylogenetic/defaults/description.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/phylogenetic/defaults/description.md b/phylogenetic/defaults/description.md index 3233a8a..bf4716c 100644 --- a/phylogenetic/defaults/description.md +++ b/phylogenetic/defaults/description.md @@ -1,10 +1,10 @@ We gratefully acknowledge the authors, originating and submitting laboratories of the genetic sequences and metadata for sharing their work. Please note that although data generators have generously shared data in an open fashion, that does not mean there should be free license to publish on this data. Data generators should be cited where possible and collaborations should be sought in some circumstances. Please try to avoid scooping someone else's work. Reach out if uncertain. -We curate sequence data and metadata from NCBI as the starting point for our analyses. +We curate sequence data and metadata from NCBI as the starting point for our analyses. Curated sequences and metadata are available as flat files at: - +* [data.nextstrain.org/files/workflows/lassa/L/sequences.fasta.zst](https://data.nextstrain.org/files/workflows/lassa/L/sequences.fasta.zst) +* [data.nextstrain.org/files/workflows/lassa/L/metadata.tsv.zst](https://data.nextstrain.org/files/workflows/lassa/L/metadata.tsv.zst) +* [data.nextstrain.org/files/workflows/lassa/S/sequences.fasta.zst](https://data.nextstrain.org/files/workflows/lassa/S/sequences.fasta.zst) +* [data.nextstrain.org/files/workflows/lassa/S/metadata.tsv.zst](https://data.nextstrain.org/files/workflows/lassa/S/metadata.tsv.zst) +* [data.nextstrain.org/files/workflows/lassa/all/sequences.fasta.zst](https://data.nextstrain.org/files/workflows/lassa/all/sequences.fasta.zst) +* [data.nextstrain.org/files/workflows/lassa/all/metadata.tsv.zst](https://data.nextstrain.org/files/workflows/lassa/all/metadata.tsv.zst) From de8645dda8014def979d990ad69ca344747d7500 Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Wed, 10 Jul 2024 12:28:02 -0400 Subject: [PATCH 18/31] Fixup example sequences to ID on accession To match the curated sequences, fixup example sequences to ID on accession. --- phylogenetic/example_data/sequences_l.fasta | 24 +++++++++--------- phylogenetic/example_data/sequences_s.fasta | 28 ++++++++++----------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/phylogenetic/example_data/sequences_l.fasta b/phylogenetic/example_data/sequences_l.fasta index d97784d..7bf07d6 100644 --- a/phylogenetic/example_data/sequences_l.fasta +++ b/phylogenetic/example_data/sequences_l.fasta @@ -1,4 +1,4 @@ ->Z0947_SLE_2011 +>KM822129 CGCACCGGGGATCCTAGGCAATTTGGTTGTTCTTTTTTGAGACCTTTTGCGCTGAACTCC TCCAAATGGGAAACAAACAAGCCAAGGTCCCAGAATCAAAAGACAGCCCGAGAGCCAGCC TAATCCCAGATGCCACACATCTAGGGCCGCAATTCTGTAAGAGTTGCTGGTTCGAAAACA @@ -121,7 +121,7 @@ TAGGTACTTTGATACTAAGTCTTTGACACAGGCTATGTCCTCCTCCATGTTTGGCTGCAG GTATGATGGTCAGATCCCTCAGAACATGTGGTTTGCTAGAGCAACAGTTCACTATGGAAT GAGGTCCTGTAGGGGGCACAAGGGACACAAGAGTCAATTAAAAGCAATTAAATTAGATGG CCTTAATGCCTAGGATCCTCGGTGCG ->ISTH0531_NIG_2011 +>KM821921 CGGGGATCCTAGGCAATTTAACTGCACTTCAGTGGTAAAGCTCATTCTAGTGAATCCCTG AGTTAAAGTGTGTAGTCAAAATGGGCAATAGACAAGCCAAATCGGCAAAAGTCGATGAAC ATCAAAGAGCTCATCTGGTGCCAGATGCGTCCCATTTGGGCCCCCAGTTCTGCAAGAGTT @@ -243,7 +243,7 @@ AGCAGCATCCTAGGTTCAGTTTGGACCAGAAAAGCTAACTTCTGTCTTGATAGCTTCTCA TTATCTGCAAGGTACTTTGAGATAAGGTCTTTAGCATTGGCAATGTCTTCCTCCATCGCC AATTGTGGCACCTGTGTTGGCTTTAGGCTTATGCCTGTGTGGCTTGTAAATCAGCTAGTG GTGCTCCAAAAAACTACTACAGAAATGAGAGACAATATGCCTAGGATCCTCAGTG ->ISTH2217_NIG_2012 +>KM821983 CCGGGGATCCTAGGCAATTCAGCTGGACTTCAGTAGTAAGGCTCTTTTCAGTGAATCCCC GAGTCAAAGCACCCAGCAAAATGGGCAACAAACAGGCTAAATCGACAAAAGTCGATGAAC ATCAAAGAGCTCATCTAGTGCCAGATGCATCCCATCTAGGCCCTCAGTTCTGCAAGAGTT @@ -365,7 +365,7 @@ GAGCAACATTCTGGGTTCGGTCTGGACCAAGAAAGCTAACTTCTGTCTTGATAACTTCTC ATTATCTGCAAGGTACTTTGAGATAAGATCTTTAGCATTGGCAATATCTTCCTCCATCGG CGATTGTTGCACCTGTATTGGGTTTGGGTTTATGCCAGAATGGCTTGTGGGTCAGCTGGT GGTGCCCCACAAAAGCTCCTACAGAAATGAGAGACAATATGCCTAGGATCCTCGGTGC ->G3278_SLE_2013 +>KM821908 GCACCGGGGATCCTAGGCAATTTGGTTGTTCTTCTCTTTTGAGACCTCTTTTAGGCCTTT CTTAGACCCTTTGTGCTGAACTCCACCAGATGGGGAACAAGCAAGTCAAAGCTCCTGAAG CAAGGAACAGTCCGAGGGCCAGCCTGATCCCAGATGCCACACACCTAGGGCCACAGTTCT @@ -488,7 +488,7 @@ ATTTGCTAAGTACTTTGATACTAAATCTTTAACACAAGCTATGTCTTCCTCCATGTTTGG CTGCAAGTATGGTAATCGAAACTCTTGGAATATGTGGTCAACTAGAGTAACGGTTCACTA TGGGATAAGGTCCCATAGGAGATGCAAAGACACAGCTGGTTAATTAAAGACAATTAAATT GGATATCCTTAATGCCTAGGATCC ->ISTH1038_NIG_2011 +>KM821928 CGGGGATCCTAGGCAATTCAGCTGGACTTCAGTGGTGAGGCTTATCCTAGTGAATCCCTG AATCAAAGCACCTAGTCAGAATGGGCAACAAACAGGCCAAATCGACAAAAGCCGATGAAC ATCAAAGAGCTCATCTAGTGCCAGATGCATCCCATCTGGGCCCCCAGTTCTGTAAGAGTT @@ -610,7 +610,7 @@ AGCAACATTCTAGGCTCAGTTTGGACCAGAAAAGCTAACTTCTGTCTTGACAACTTCTCA TTATCTGCAAGGTACTTTGAGATGAGATCTTTAGCATTAGCAATATCTTCCTCCATCGCC AATTGTAGCACCTGTGTTGGATTTGGATTTGTGCCAATATGGCCTGTGGGTCAGCTGGTG ATGCCCAAAAAAGCTCCTACAGAAATGAGAGACAATATGCCTAGGATCCTCG ->G2554_SLE_2012 +>KM821858 CGCACCGGGGATCCTAGGCAATTTGGTTGTTTCTTTTTTGTGGCCTTGTGTGCTGAACTC CTCCAAATGGGAAACAAGCAAGCCAAAACCCCAGAAATAAAAGACAGCCCGAGAGCCAGC CTAATCCCAGATGCTACACACCTAGGGCCACAGTTCTGTAAGAGCTGCTGGTTCGAAAAC @@ -733,7 +733,7 @@ CTAGGTACTTCGATACTAGATCCTTGACGCAGGCTATATCTTCCTCCATGTTTGACTGCA GGTATGATGATCGAAACCCTCAGGGCATATGGTCTGCCAGAACAACAGTTCACTATAGGA CAAAATCCTGTAAAAGGCACAGAAGAAACAAAAGGCAATTAAAGACAATTAAATTGGATA GCCTTAATGC ->G2612_SLE_2012 +>KM821866 GGGGATCCTAGGCAATTTGGTTGTTCTTTTCTGAGGCCTTGTGCGCTGAACTCCTCCAAA TGGGAAACAAGCAAGCCAAAACCCCAGAAACAAAGGACAGTCCAAGAGCCAGCCTGATCC CAGATGCCACACATCTAGGGCCGCAGTTCTGTAAGAGCTGCTGGTTCGAAAACAAGGGCC @@ -856,7 +856,7 @@ ACTTTGATACTAAGTCTTTGACACAGGCTATGTCTTCCTCCATGTTTGGCTGTAGGTATG AAGGTCGGATCCCTCAGAACATGTGGTTTGCTGGAGCAACAGTTTACTGTAGAATGAGGT CCTGTGGGGGGCACAAAGGACACAGGAGTCAATTGAAATCAATTAAAGGCAATTAAATTA GATAGCCTTNNANTG ->G1727_SLE_2011 +>KM821809 CGCACCGGGGATCCTAGGCAATTTGGTTGTTCTTTTTTGAGACCTTGTGCGCTGAACTCC TCCAAATGGGAAACAAACAAGCCAAGGTCCCAGAATCAAAAGACAGCCCGAGAGCCAGCC TAATCCCAGATGCCACACATCTAGGGCCGCAATTCTGTAAGAGTTGCTGGTTCGAAAACA @@ -979,7 +979,7 @@ TAGGTACTTTGATACTAAGTCTTTGACACAGGCTATGTCCTCCTCCATGTTTGGCTGCAG GTATGATGGTCAGATCCCTCAGAACATGTGGTTTGCTAGAGCAACAGTTCACTATAGAAT GAGGACCCGTAGGGGGTACAGAAGACACAAGAGTCAATTAAAAGCAATTAAATTAGATAG CCTTAATGCCTAGGATCCTCGGTGCG ->G2222_SLE_2011 +>KM821831 CGGGGATCCTAGGCAATTTGGTTGTTCTTCTTTCTGAAGCCTTTTGCGCTGAACTCCTCC AAATGGGAAACAAGCAAGCCAAAGCCCCAGAATCAAAGGACAGTCCGAGAGCCAGCCTGA TCCCAGATGCCACACATCTAGGGCCGCAGTTTTGTAAGAGCTGCTGGTTCGAAAACAAGG @@ -1102,7 +1102,7 @@ GGTACTTTGATACTAAGTCTTTGACACAGGCTATGTCTTCCTCCATGTCTGGCTGCAGGT ATGATGGTCAGATCCCTCAGAACATGAGGTCTGCTGGAGCAACAGTTCACTATAGAATAA GGTCCTGTAGGGGGCACAGAAGACACAAGAGTCAAATAAAGGCAATTTAATTAGATAGTC TTAATGC ->G636_SLE_2009 +>KM821778 CGCACCGGGGATCCTAGGCAATTTGGTTGTTCTTCTTTTGAGGCCTTGTGCGCTAAACTT CTCCAAATGGGAAACAAGCAAACCAAAGCCCCAGAATCAAAAAACAGTCCGAGAGCCAGT CTGATCCCAGATGCCACATATCTAGGACCACAGTTCTGCAAGAGCTGCTGGTTCGAAAAC @@ -1225,7 +1225,7 @@ ACTAGGTACTTTGATACTAAGTCTTTGACACAGGCTATGTCTTCCTCCATGTTTCGCTGC AGGTATGATGGTCAGAGCCCTCAGAACATGTGGTCTGCTAGAGCAACAATTCACTATAGG ATGAGGCCTCGTAAGAAGCACAGAAGACACAAGATGAAATTAAAGACAATTTAATTAGAT AGCCTTAATGCCTAGGATCCACTGTGCG ->G3248_SLE_2013 +>KM821905 GGCAATTTGATTGTTCTATTTTTTGAGACATTGTGCGCTGAACTCCTCCAAATGGGGAAT AAGCAAACCAAAACCCCAGAAGTAAAAGACAGTCCGAGAGCTAGCCTGATTCCAGATGCC ACACATCTAGGGCCACAGTTCTGTAAGAGCTGCTGGTTCGAGAACAAGGGCCTGGTTGAG @@ -1347,7 +1347,7 @@ GCACAAGAAATGCCAGCTTCTGCCTTGATAATCTTTCGTTGTCCACTAGGTACTTTGATA CTAAGTCTTTGACGCAGGCTATGTCTTCCTCCATGTTTTACTGCAGGTATGATGGTCAGG GCCCTCAAAACATGTGGTCTGCTACAACAACGATTGACTATAGAGCAGGGTCCTGTAAGA GGCACAGAAGACACAAGAGGCAATTAAAGACAATTAAAATAGATAGCCTAAATG ->G2557_SLE_2012 +>KM821860 CCGGGGATCCTAGGCAATTTGGTTGTTCATTTCTTTTGAGGCCTCATTTAGGTCTTTCTT AGACCCTCTGTGCTGAACTCCACCAGATGGGGAACAAGCAAGTCAAAGCTCCAGAAGCAA GGAACAGTCCGAGGGCCAGTCTGATCCCAGACGCCACACACCTAGGGCCACAGTTCTGCA diff --git a/phylogenetic/example_data/sequences_s.fasta b/phylogenetic/example_data/sequences_s.fasta index ba54814..34be553 100644 --- a/phylogenetic/example_data/sequences_s.fasta +++ b/phylogenetic/example_data/sequences_s.fasta @@ -1,4 +1,4 @@ ->Z0947_SLE_2011 +>KM822130 CCGGGGATCCTAGGCATTTTTGGTTGCGCTATTCAAGTGTCCTATTTAAAATGGGACAAA TAGTGACATTCTTCCAGGAAGTGCCCCATGTCATAGAAGAGGTGATGAACATCGTTCTCA TTGCACTGTCTATACTAGCAGTGTTGAAAGGTCTGTACAATTTTGCAACATGTGGCCTCG @@ -56,7 +56,7 @@ TAAAAGAGCCTGGGCATCCTTCACCACCTGCAGTTTGATGTTGGAGCAGTAACCAGATAA TTCCCTCCTCAAGGATTGTGTCCACAAAAAGGACTTTATTTCCTTTGAGGCACTCATCAC CAGATTATTGCGTTAAATGCACGCAACAGAAAGCTGAGACTATCTGCCAAAGTGTTAAAA GCAAAGCGCAATCCAATAGCCTAGGATCCACTGTGCG ->NGA/2016/ISTH_0104 +>MH053562 CCTAGGCATTTAGGATTGCGCTTTTAGAAATCTTTGTGTGATTGGGTCTCACTAAATCAT GGGGCAAGTCATAACATTCTTCCAAGAGGTGCCTCATGTCATAGAGGAGGTTATGAACAT TGTCCTAATTGCCCTTAGTCTCCTAGCAATACTGAAAGGGATTTACAATGTTGCTACCTG @@ -114,7 +114,7 @@ AGGCCGTGAAGGAGGGCTTGGGCATCCTTGACAACTTGAAGTTTTATATTAGAGCAATAA CCTGAAAGCTCTCTCCTCAATGATTGTGTCCAAAGGAATGATTTCACTTCTTTGGAGGCA CTCATCCTGATCTGAGCACCCTGAAGCTCACTAGTTGAATATATCACCCAGTAAATCAAT AAAAGGCGCAATCCAGTAGCCTAGGATCCACTG ->ISTH2066_NIG_2012 +>KM821976 CCGGGGATCCTAGGCATTTAGGATTGCGCATTTAGAGATCTTTGTGTGATTGGGCTTCAC CAAATCATGGGGCAAATCATAACATTCTTCCAAGAGGTGCCTCATGTCATAGAGGAGGTC ATGAACATCGTCCTAATCGCCCTCAGTCTCCTGGCGATGCTGAAAGGGATTTACAATATT @@ -172,7 +172,7 @@ AGAAGTCAAGGCCGTGAAGGAGGGCTTGGGCATCCTTGACAACTTGAAGCTTTATGTTGG AGCAGTAACCTGAAAGCTCTCTCCTCAGTGATTGTGTCCAAAGGAATGATTTCACTTCTT TGGAAGCACTCATCCTGATCTAAGTATCCTGAAATTTACTAGTTGAAGTGTTTCACCCAG TAAATCAATAATAGGCGCAATCCAGTAGCCTAGGATCCACTGTGCG ->ISTH0531_NIG_2011 +>KM821922 CCGGGGATCCTAGGCATTTAGGATTGCGCTTTTAGAGATCTTTGTGTGAGTGGGCTTCAC TAAGCCATGGGACAAATCATAACATTTTTCCAGGAAGTACCCCATGTCATAGAGGAAGTG ATGAACATTGTCCTGATCGCTCTCAGCCTTCTGGCAATATTGAAAGGGATCTACAATGTT @@ -230,7 +230,7 @@ CAGAAAAGTCAAGACCATGAAGGAGAGCCTGAGCATCTTTAACAACTTGAAGCTTTATGC TGGAGCAATAACCTGAAAGTTCCCTTCTCAATGACTGTGTCCAGAGGAATGACTTTACTT CCTTAGAAGCACTCATCCTGGTCTGAAGACTCAGGGATTTGCTGGTTGAAAGTGTCACAC AGTGAGTCAATGAAAAGCGCAATCCAATAGCCTAGGATCCACTGTGC ->G3278_SLE_2013 +>KM821909 GCGCACCGGGGATCCTAGGCATTTTGGGTTGCGCAATTTGAATGCCCTTGTTGACATGGG ACAAATAGTGACTTTCTTCCAGGAAGTGCCTCATGTGATAGAGGAGGTGATGAACATTGT GCTCATCGCATTGTCTCTACTGGCAGTGTTGAAAGGTCTGTACAATGTTGCAACATGTGG @@ -288,7 +288,7 @@ CCATGTAAAAGAGCCTGGGCATCCTTCACCACCTGTAATTTGATGTTGGAGCAGTAACCA GACAATTCCCTCCTCAAAGATTGTGTCCACAGGAAGGACTTTATCTCCTTTGAGGCACTC ATTGCCAAGTTGTTGTGTTGAACACACACAGCAGAGAGCTGAGACTATCTGCTGAATTGA TAAAGGCAAAGCGCAATCCAATAGCCTAGGA ->ISTH1038_NIG_2011 +>KM821929 CCGGGGATCCTAGGCATTTAGGATTGCGCTTTTAGAGATCTTTGTGTGAGTGGGCTTCAT CAAGCCATGGGACAGATCATAACATTTTTCCAGGAAGTACCTCATGTCATAGAGGAGGTG ATGAACATTGTTCTGATTGCTCTCAGCCTTCTGGCAATACTGAAGGGGATCTACAATGTT @@ -346,7 +346,7 @@ CAGAAAAGTCAAGACCATGAAGGAGAGCCTGAGCATCTTTAACAACTTGAAGTTTTATGC TGGAGCAATAACCTGAAAGCTCCCTCCTCAATGACTGTGTCCAGAGAAAAGACTTCACTT CCTTAGAAGCACTCATCCTGGTCTGGACACTTAGGGATTTACTGGTTGAAAGTTTTACAC AGTAAGTCAATGAAAAGCGCAATCCAATAGCCTAGGATCCAC ->G2554_SLE_2012 +>KM821859 GCGCACCGGGGATCCTAGGCATTTTTGGTTGCGCAATCCAAGTATCTCATTCAAAATGGG ACAAATAGTGACATTCTTCCAAGAAGTGCCTCATGTAATAGAAGAGGTGATGAACATTGT TCTCATCGCACTGTCTATACTAGCAGTGCTGAAGGGTCTGTACAACATTGCAACATGTGG @@ -404,7 +404,7 @@ CCGTGCAAAAGAGCTTGGGCATCTTTCACCACCTGAAGTTTGATGTTGGAGCAGTAACCA GATAGTTCTCTCCTTAAGGATTGTGTCCACAGAAAGGACTTTATTTCCTTTGAGGCACTC ATCGCCGAGTTGCTGTATTGGAGACACGCAGCAAAAAGCTGAAACTATCTGCCAAAATGA CAAAAGCAAAGCGCAATCCAATAGCCTAGGATCCACTGT ->G2612_SLE_2012 +>KM821867 GCGCACCGGGGATCCTAGGCATTTTTGGTTGCGCAATTCAAGTGTCCTATTTAAAATGGG ACAAATAGTGACATTCTTCCAAGAAGTACCCCATGTAATAGAAGAGGTGATGAACATTGT TCTCATTACATTGTCTATACTAGCAGTGTTGAAAGGTCTGTACAATGTTGCGACATGTGG @@ -462,7 +462,7 @@ CCGTGTAAAAGAGCCTGGGCATCTTTCACCACCTGCAGTTTGATGTTGGAGCAGTATCCA GACAATTCCCTCCTCAAGGATTGTGTCCACAAAAAGGATTTTATCTCCTTTGAGGCACTC ATCGCCAGATTATTGTGTTGAATGCACGCAACAAAAAGCTGAGACTATCTTCCAAAGTGA TAAAAGCAAAGCGCAATCCAATAGCC ->G1727_SLE_2011 +>KM821810 GCACCGGGGATCCTAGGCATTTTTGGTTGCGCTATTCAAGTGTCCTATTTAAAATGGGAC AAATAGTGACATTCTTCCAGGAAGTGCCCCATGTCATAGAAGAGGTGATGAACATCGTTC TCATTGCACTGTCTATACTAGCAGTGTTGAAAGGTCTGTACAATTTTGCAACATGTGGCC @@ -520,7 +520,7 @@ ATGTAAAAGAGCCTGGGCATCCTTCACCACCTGCAGCTTGATGTTGGAGCAGTAACCAGA TAATTCCCTCCTCAAAGATTGTGTCCACAAAAAGGATTTTATTTCCTTTGAGGCACTCAT CACCAGATTATTGCGTTGAATGCACGCAACAGAAAGCTGAGACTATCTGCCAAAGTGTTA AAAGCAAAGCGCAATCCAATAGCCTAGGATCCACTGTGCG ->G2222_SLE_2011 +>KM821832 GCGCACCGGGGATCCTAGGCATTTTTGGTTGCGCAATTCAAGTGTCCTATTTAAAATGGG ACAAATAGTTACATTCTTCCAGGAAGTGCCCCATGTAATAGAAGAGGTGATGAACATTGT TCTCATTGCACTGTCCATACTAGCAGTACTGAAAGGTCTGTACAATCTTGCAACATGTGG @@ -578,7 +578,7 @@ CCATGTAAAAGAGCCTGGGCATCTTTCACCACCTGTAGTTTGATGTTGGAGCAGTAACCG GATAGTTCCCTCCTCAAGGATTGTGTCCACAAAAAGGACTTTATTTCCTTTGAGGCACTC ATTGCCAGATTATAGTGCTGAATGCACACAACAAAAACCGAGATTATCTGCCAAAGAGAT AAAAGCAAAGCGCAATCCAATAGCCTAGGATCC ->G636_SLE_2009 +>KM821779 GCGCACAGTGGATCCTAGGCATTTTTGGTTGCGCAATTCAAGTGTCCTATTTAAAATGGG GCAAATAGTGACATTCTTCCAGGAAGTGCCTCATGTAATAGAAGAGGTGATGAACATTGT TCTCATTGCACTGTCCATACTGGCAGTGCTGAAAGGTCTGTACAATCTTGCAACATGTGG @@ -636,7 +636,7 @@ CCATGTAAAAGGGCCTGAGCATCTTTCACCACCTGTAGTTTGATGTTGGAACAGTAACCA GATAACTCCCTCCTCAAAGATTGTGTCCACAAAAAGGATTTTATTTCCTTTGAGGCACTC ATTGCCAGATTGTTGTATTGAGTGCACGTGATAAAACTGAAACTATTTGCCAAAATGACA AAAGCAAAGCGCAATCCAATAGCCTAGGATCCACTGTGCG ->G3248_SLE_2013 +>KM821906 ACCGGGGATCCTAGGCATTTTTGGTTGCGCAATTCAAGTGTCCTACTTTAAAATGGGACA AATAGTGACATTCTTCCAGGAAGTGCCTCATGTAATAGAAGAGGTGATGAACATTGTTCT CATTGCACTGTCAATATTGGCAGTGCTAAAAGGTCTGTATAATTTTGCTACATGTGGCCT @@ -694,7 +694,7 @@ TGCAAAAGAGCCTGAGCATCTTTCACCACCTGAAGTTTGATGTTGGAGCAGTAGCCAGAT AATTCCCTCCTCAAAGATTGTGTCCACAAAAAGGACTTTATTTCTTTTGAGGCACTCATC GCCAAGTTGTTGTGCTAGATGCACGCAGCAGAAAGCTGAGACTATCTGCTAAAATGACAA AAGCAAAGCGCAATCCAATAGCCTAGGATCC ->G2511_SLE_2012 +>KM821857 CCGGGGATCCTAGGCATTTTTGGTTGCGCAATTCAAGTGTCCTATTTAAAATGGGACAAA TAGTGACATTCTTCCAGGAAGTGCCCCATGTGATAGAAGAGGTGATGAACATTGTTCTCA TTGCACTGTCTATACTAGCAGTGTTGAAGGGTCTGTACAATCTTGCAACATGTGGCCTCG @@ -752,7 +752,7 @@ AAAGAGCCTGGGCATCTTTGACCACCTGCAGTTTGATGTTGGAGCAGTAACCAGATAATT CCCTCCTCAAGGATTGTGTCCACAAAAAAGATTTTATTTCCTTTGAGGCACTCATTGCCA GATTATTGTGCTAAATGCACGCAACAAAAAGCTGAGACTATCTGCCAAAGTGATAAAAGC AAAGCGCAATCCAATAGCCTAGGATCCACTGTGCG ->G2557_SLE_2012 +>KM821861 CCGGGGATCCTAGGCATTTTTGGTTGCGCAATTTGAATGTCCTTGTTGACATGGGACAAA TAGTGACTTTCTTCCAGGAGGTGCCTCATGTGATAGAGGAGGTGATGAACATTGTGCTCA TCGCATTGTCTCTACTGGCAGTGTTGAAAGGTCTGTACAATGTTGCAACATGTGGCCTCA From fa12fbdc338d794d072dd2283fe163ce2ff4560b Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Wed, 10 Jul 2024 12:32:22 -0400 Subject: [PATCH 19/31] Fixup AmbiguousRuleException --- phylogenetic/build-configs/ci/copy_example_data.smk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phylogenetic/build-configs/ci/copy_example_data.smk b/phylogenetic/build-configs/ci/copy_example_data.smk index 4659824..88f517f 100644 --- a/phylogenetic/build-configs/ci/copy_example_data.smk +++ b/phylogenetic/build-configs/ci/copy_example_data.smk @@ -14,4 +14,4 @@ rule copy_example_data: # Add a Snakemake ruleorder directive here if you need to resolve ambiguous rules # that have the same output as the copy_example_data rule. -# ruleorder: copy_example_data > ... +ruleorder: copy_example_data > decompress \ No newline at end of file From c5f87aee353e8bdc62593384f914a5c7ac9f700c Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Wed, 10 Jul 2024 12:50:23 -0400 Subject: [PATCH 20/31] Add rule to autogenerate colors Since there are more countries represented then the original lassa build, autogenerate colors for geolocations. This was copied and modified from the "colors" rule in RSV's workflow * https://github.com/nextstrain/rsv/blob/a1788ce2c9c4375fb5a06d1426c64c45cf90225f/workflow/snakemake_rules/export.smk#L13-L27 --- phylogenetic/defaults/color_orderings.tsv | 235 ++++++++++++++++++++++ phylogenetic/defaults/color_schemes.tsv | 150 ++++++++++++++ phylogenetic/defaults/config.yaml | 1 - phylogenetic/rules/export.smk | 18 +- phylogenetic/scripts/assign-colors.py | 78 +++++++ 5 files changed, 480 insertions(+), 2 deletions(-) create mode 100644 phylogenetic/defaults/color_orderings.tsv create mode 100644 phylogenetic/defaults/color_schemes.tsv create mode 100755 phylogenetic/scripts/assign-colors.py diff --git a/phylogenetic/defaults/color_orderings.tsv b/phylogenetic/defaults/color_orderings.tsv new file mode 100644 index 0000000..b45d535 --- /dev/null +++ b/phylogenetic/defaults/color_orderings.tsv @@ -0,0 +1,235 @@ +# Asia +country Israel +country Palestine +country Lebanon +country Jordan +country Syria +country Georgia +country Iraq +country Armenia +country Saudi Arabia +country Kuwait +country Yemen +country Bahrain +country Qatar +country Iran +country United Arab Emirates +country Oman +country Uzbekistan +country Afghanistan +country Kazakhstan +country Pakistan +country Tajikistan +country Maldives +country Kyrgyzstan +country India +country Sri Lanka +country Nepal +country Asia +country Bangladesh +country Myanmar +country Thailand +country Malaysia +country Mongolia +country Laos +country Singapore +country China +country Cambodia +country Vietnam +country Hong Kong +country Indonesia +country Brunei +country Taiwan +country Philippines +country Timor-Leste +country South Korea +country Japan + +# Oceania +country French Polynesia +country Palau +country Australia +country Papua New Guinea +country Oceania +country Micronesia +country Solomon Islands +country Vanuatu +country Marshall Islands +country New Zealand +country Kiribati +country Fiji + +# Africa +country Cabo Verde +country Gambia +country Guinea-Bissau +country Senegal +country Sierra Leone +country Guinea +country Liberia +country Mauritania +country Côte d'Ivoire +country Morocco +country Mali +country Burkina Faso +country Ghana +country Togo +country Benin +country Algeria +country Sao Tome and Principe +country Nigeria +country Tunisia +country Niger +country Equatorial Guinea +country Gabon +country Cameroon +country Republic of the Congo +country Libya +country Namibia +country Angola +country Chad +country Central African Republic +country Democratic Republic of the Congo +country Africa +country Botswana +country South Africa +country Zambia +country Lesotho +country Sudan +country South Sudan +country Zimbabwe +country Burundi +country Rwanda +country Egypt +country Eswatini +country Uganda +country Malawi +country Mozambique +country Tanzania +country Kenya +country Ethiopia +country Djibouti +country Union of the Comoros +country Madagascar +country Somalia +country Seychelles +country Mauritius + +# Europe +country Iceland +country Portugal +country Ireland +country Spain +country United Kingdom +country Andorra +country France +country Belgium +country Netherlands +country Luxembourg +country Monaco +country Switzerland +country Norway +country Denmark +country Liechtenstein +country Germany +country Europe +country Italy +country Malta +country Slovenia +country Sweden +country Austria +country Croatia +country Czech Republic +country Bosnia and Herzegovina +country Poland +country Slovakia +country Montenegro +country Albania +country Hungary +country Serbia +country Kosovo +country North Macedonia +country Greece +country Lithuania +country Romania +country Bulgaria +country Latvia +country Estonia +country Finland +country Belarus +country Moldova +country Ukraine +country Cyprus +country Turkey +country Azerbaijan +country Russia + +# South America +country Argentina +country Uruguay +country Chile +country Paraguay +country Bolivia +country South America +country Brazil +country Peru +country Ecuador +country Colombia +country Suriname +country Guyana +country Venezuela +country Trinidad and Tobago +country Bonaire +country Curacao +country Aruba + +# North America +country Panama +country Costa Rica +country Grenada +country Nicaragua +country Saint Vincent and the Grenadines +country Barbados +country El Salvador +country Saint Lucia +country Honduras +country Dominica +country Guatemala +country Guadeloupe +country Belize +country Antigua and Barbuda +country Saint Kitts and Nevis +country Saint Barthélemy +country Sint Maarten +country Saint Martin +country Jamaica +country Dominican Republic +country Haiti +country Mexico +country Cuba +country Bahamas +country North America +country Bermuda +country USA +country Canada + +################ + +region Asia +region Oceania +region Africa +region Europe +region South America +region North America + +################ + + +recency Older +recency One month ago +recency One week ago +recency 3-7 days ago +recency 1-2 days ago +recency New + +################ diff --git a/phylogenetic/defaults/color_schemes.tsv b/phylogenetic/defaults/color_schemes.tsv new file mode 100644 index 0000000..c9c76ca --- /dev/null +++ b/phylogenetic/defaults/color_schemes.tsv @@ -0,0 +1,150 @@ +#4C90C0 +#529AB6 #AABD52 +#4E94BD #81BA72 #C8B944 +#4A8CC2 #71B486 #ABBD52 #DEA73C +#4784C8 #67AE95 #98BD5E #CDB642 #E68634 +#447CCD #5EA9A1 #8ABB6A #BEBB48 #E29E39 #E2562B +#4272CE #58A2AC #7DB877 #AEBD50 #D8AE3E #E67A32 #DB2823 +#4068CF #5098B9 #6CB28C #94BD62 #BFBB47 #DFA53B #E67131 #DB2823 +#3E5DD0 #4A8CC2 #60AA9E #80B974 #A6BE55 #CBB742 #E29D39 #E56A2F #DB2823 +#3F52CD #4681CA #57A1AD #70B487 #90BC65 #B4BD4C #D3B240 #E59638 #E4642E #DB2823 +#3F47C9 #4274CE #4F97BB #64AC99 #7EB976 #9EBE5A #BEBB48 #D9AE3E #E69036 #E35F2D #DB2823 +#403CC5 #4067CF #4A8BC3 #5AA4A9 #6FB488 #8BBB69 #A9BD53 #C7B944 #DDA93C #E68A35 #E35C2C #DB2823 +#4433BE #3E5ACF #457FCB #529AB6 #64AD98 #7BB77A #96BD60 #B3BD4D #CDB642 #DFA43B #E68434 #E2582C #DB2823 +#492AB5 #3F4CCB #4271CE #4C8FC0 #5AA5A8 #6DB38A #85BA6F #A0BE59 #BBBC49 #D2B340 #E19F3A #E68033 #E2562B #DB2823 +#4D21AD #403FC6 #3F63CF #4783C8 #539BB5 #63AC9B #77B67F #8EBC66 #A8BD53 #C1BA47 #D6B03F #E39C39 #E67C33 #E1532B #DB2823 +#571EA2 #4334BF #3F55CE #4376CD #4C91C0 #59A4A9 #6AB18F #7FB975 #97BD5F #AFBD4F #C7B944 #D9AD3D #E49838 #E67932 #E1512A #DB2823 +#5E1D9D #462EB9 #3F4CCB #416CCE #4887C6 #539CB3 #62AB9C #74B582 #89BB6B #A0BE59 #B7BD4B #CCB742 #DDAA3C #E69537 #E67631 #E14F2A #DB2823 +#5E1D9D #472DB8 #3F48C9 #4066CF #4682C9 #5097BA #5CA7A5 #6CB28D #7FB976 #93BD62 #A9BD53 #BFBB48 #D1B340 #DFA53B #E68F36 #E67231 #E04D29 #DB2823 +#5E1D9D #482BB6 #3F45C8 #3F62D0 #447DCC #4D92BF #58A2AC #66AE96 #76B680 #89BB6B #9DBE5A #B2BD4D #C5B945 #D5B03F #E1A13A #E68B35 #E56E30 #E04B29 #DB2823 +#5E1D9D #492AB5 #4042C7 #3E5DD0 #4377CD #4A8CC2 #549DB2 #60AA9E #6EB389 #80B974 #92BC63 #A6BE55 #B9BC4A #CBB742 #D9AD3D #E29D39 #E68634 #E56A2F #E04929 #DB2823 +#5E1D9D #4929B4 #403FC6 #3E59CF #4272CE #4887C6 #5199B8 #5BA7A6 #69B091 #78B67E #89BB6B #9BBE5B #AEBD50 #C0BB47 #D0B441 #DDAA3C #E49938 #E68234 #E4672E #DF4728 #DB2823 +#5E1D9D #4A28B3 #403DC5 #3F56CE #416DCE #4683C8 #4E95BD #58A2AC #64AC99 #71B486 #80B973 #91BC64 #A3BE57 #B5BD4C #C5B945 #D3B23F #DEA63B #E59638 #E67F33 #E4642E #DF4628 #DB2823 +#5E1D9D #4A27B2 #403AC4 #3F52CD #4169CF #457ECB #4C90C0 #559EB1 #5FA9A0 #6BB18E #79B77C #89BB6B #99BD5D #AABD52 #BBBC49 #CBB842 #D7AF3E #E0A23A #E69237 #E67B32 #E3612D #DF4528 #DB2823 +#5E1D9D #4B26B1 #4138C3 #3F4FCC #4065CF #447ACD #4A8BC3 #529AB6 #5BA6A6 #66AE95 #73B583 #81B973 #91BC64 #A1BE58 #B1BD4E #C0BA47 #CEB541 #DAAD3D #E19F3A #E68E36 #E67832 #E35F2D #DF4328 #DB2823 +#5E1D9D #4B25B1 #4137C2 #3F4CCB #3F62D0 #4376CD #4887C6 #4F97BB #58A2AC #62AB9C #6DB38A #7BB77A #89BB6B #98BD5E #A8BE54 #B7BD4B #C5B945 #D2B340 #DDAA3C #E39C39 #E68B35 #E67631 #E35C2C #DF4227 #DB2823 +#5E1D9D #4C25B0 #4236C0 #3F4ACA #3F5ED0 #4272CE #4783C8 #4D93BE #559EB1 #5EA9A2 #69B091 #75B581 #82BA72 #90BC65 #9FBE59 #AEBD50 #BCBB49 #CAB843 #D5B03F #DEA73B #E49938 #E68735 #E67331 #E25A2C #DF4127 #DB2823 +#5E1D9D #4C24AF #4334BF #3F47C9 #3E5BD0 #416ECE #4580CA #4B8FC1 #529BB5 #5BA5A7 #65AD98 #6FB388 #7CB879 #89BB6B #97BD5F #A5BE55 #B4BD4C #C1BA47 #CDB642 #D8AE3E #DFA43B #E59638 #E68434 #E67030 #E2582C #DF4027 #DB2823 +#5E1D9D #4C24AF #4433BE #3F45C8 #3E58CF #416BCF #447DCC #4A8BC3 #5098B9 #58A2AC #61AA9D #6BB18E #76B680 #82BA71 #8FBC65 #9DBE5A #ABBD52 #B9BC4A #C5B945 #D1B440 #DAAC3D #E1A13A #E69437 #E68134 #E56E30 #E2562B #DE3F27 #DB2823 +#5E1D9D #4D23AE #4432BD #3F43C7 #3F56CE #4067CF #4379CD #4887C6 #4E95BD #559FB0 #5DA8A3 #67AE94 #71B486 #7CB878 #89BB6B #96BD60 #A3BE57 #B1BD4E #BDBB48 #CAB843 #D3B23F #DDAA3C #E29E39 #E69036 #E67F33 #E56B2F #E1552B #DE3E27 #DB2823 +#5E1D9D #4D22AE #4531BC #4041C7 #3F53CD #4064CF #4375CD #4784C8 #4C91BF #539CB4 #5AA5A7 #63AC9A #6CB28C #77B67E #82BA71 #8FBC66 #9CBE5B #A9BD53 #B5BD4C #C1BA46 #CDB642 #D6B03F #DEA73B #E39B39 #E68D36 #E67C33 #E5692F #E1532B #DE3E27 #DB2823 +#5E1D9D #4D22AD #4530BB #403FC6 #3F51CC #3F62D0 #4272CE #4681CA #4B8EC2 #5199B8 #58A2AC #60AA9F #69B091 #72B584 #7DB877 #89BB6B #95BD61 #A1BE58 #AEBD50 #BABC4A #C5B945 #D0B441 #D8AE3E #DFA43B #E49938 #E68B35 #E67A32 #E4672E #E1522A #DE3D27 #DB2823 +#5E1D9D #4D22AD #462FBA #403DC5 #3F4ECB #3F5FD0 #426FCE #457ECB #4A8AC4 #4F96BB #569FB0 #5DA8A4 #65AD97 #6EB389 #78B77D #83BA71 #8FBC66 #9ABE5C #A7BE54 #B3BD4D #BEBB48 #C9B843 #D2B240 #DBAC3D #E0A23A #E59738 #E68835 #E67832 #E4652E #E1512A #DE3C26 #DB2823 +#5E1D9D #4E21AD #462EB9 #403CC5 #3F4CCB #3E5DD0 #416CCE #447BCD #4887C6 #4D93BE #539CB3 #5AA5A8 #62AB9C #6AB18F #74B582 #7EB876 #89BB6B #94BD61 #A0BE59 #ABBD51 #B7BD4B #C2BA46 #CCB742 #D5B13F #DDAA3C #E19F3A #E69537 #E68534 #E67631 #E4632E #E14F2A #DE3C26 #DB2823 +#5E1D9D #4E21AC #472DB8 #403AC4 #3F4ACA #3E5ACF #4169CF #4378CD #4784C7 #4C90C0 #519AB7 #58A2AC #5FA9A0 #67AF94 #6FB488 #79B77C #83BA70 #8EBC67 #99BD5D #A5BE56 #B0BD4F #BBBC49 #C5B945 #CFB541 #D7AF3E #DEA83C #E29D39 #E69237 #E68334 #E67431 #E3612D #E04E2A #DE3B26 #DB2823 +#5E1D9D #4E20AC #472DB8 #4039C4 #3F48C9 #3E58CF #4066CF #4375CD #4682C9 #4B8DC2 #5097BA #569FAF #5CA7A5 #64AD99 #6CB28D #75B581 #7FB976 #89BB6B #93BD62 #9EBE59 #A9BD53 #B4BD4C #BFBB48 #C9B843 #D1B340 #D9AD3D #DFA53B #E39B39 #E68F36 #E68133 #E67231 #E35F2D #E04D29 #DE3B26 #DB2823 +#5E1D9D #4E20AB #472CB7 #4138C3 #3F47C9 #3F56CE #4064CF #4272CE #457FCB #498AC4 #4E95BD #549DB3 #5AA5A8 #61AB9D #69B091 #71B486 #7AB77B #83BA70 #8EBC67 #98BD5E #A3BE57 #AEBD50 #B8BC4A #C2BA46 #CCB742 #D3B23F #DBAC3D #E0A33A #E49938 #E68D36 #E67F33 #E67030 #E35E2D #E04C29 #DE3A26 #DB2823 +#5E1D9D #4E20AB #482BB6 #4137C2 #3F45C8 #3F53CD #3F62D0 #426FCE #447DCC #4887C6 #4D92BF #529AB6 #58A2AC #5EA9A1 #66AE96 #6DB38A #76B680 #7FB975 #89BB6B #93BC63 #9DBE5A #A8BE54 #B2BD4D #BCBB49 #C5B945 #CEB541 #D5B03F #DDAA3C #E1A13A #E59738 #E68B35 #E67D33 #E56E30 #E35C2C #E04B29 #DE3926 #DB2823 +#5E1D9D #4F1FAB #482BB6 #4236C1 #3F43C8 #3F52CC #3F5FD0 #416DCE #437ACD #4785C7 #4B8FC1 #5098B9 #56A0AF #5CA7A5 #63AC9A #6AB18F #72B484 #7BB77A #84BA70 #8EBC67 #97BD5E #A2BE57 #ACBD51 #B6BD4B #BFBB47 #C9B843 #D0B441 #D7AE3E #DEA83C #E19F39 #E59537 #E68835 #E67B32 #E56C2F #E25B2C #E04A29 #DE3926 #DB2823 +#5E1D9D #4F1FAB #492AB5 #4235C0 #4042C7 #3F50CC #3E5DD0 #416ACF #4377CD #4682C9 #4A8CC2 #4F96BC #549DB2 #5AA4A8 #60AA9E #67AF93 #6EB389 #77B67F #80B974 #89BB6B #92BC63 #9CBE5B #A6BE55 #B0BD4F #B9BC4A #C2BA46 #CBB742 #D2B240 #D9AD3D #DEA63B #E29D39 #E69337 #E68634 #E67932 #E56A2F #E25A2C #E04929 #DE3926 #DB2823 +#5E1D9D #4F1FAA #492AB5 #4334BF #4040C7 #3F4ECB #3E5BD0 #4068CF #4374CD #4580CA #498AC4 #4D93BE #529BB5 #58A2AC #5EA8A2 #65AD98 #6BB28D #73B583 #7CB879 #84BA6F #8DBC67 #97BD5F #A0BE58 #AABD52 #B4BD4C #BDBB49 #C5B945 #CDB642 #D4B13F #DBAC3D #DFA43B #E39B39 #E69137 #E68434 #E67732 #E4682F #E2582C #E04828 #DE3826 #DB2823 +#5E1D9D #4F1FAA #4929B4 #4333BE #403FC6 #3F4CCB #3E59CF #4066CF #4272CE #447ECC #4887C6 #4C91C0 #5199B8 #56A0AF #5BA7A6 #62AB9C #69B091 #70B487 #78B67E #80B974 #89BB6B #92BC63 #9BBE5B #A4BE56 #AEBD50 #B7BD4B #C0BB47 #C8B843 #D0B441 #D6AF3E #DDAA3C #E0A23A #E49938 #E68F36 #E68234 #E67631 #E4672E #E2572B #DF4728 #DD3826 #DB2823 +#5E1D9D #4F1EAA #4928B4 #4433BE #403EC6 #3F4BCA #3E57CE #4064CF #426FCE #447BCD #4785C7 #4B8EC1 #4F97BA #549EB2 #5AA4A9 #5FAA9F #66AE95 #6DB28B #74B582 #7CB878 #84BA6F #8DBC67 #96BD60 #9FBE59 #A8BD53 #B2BD4E #BABC4A #C3BA46 #CBB842 #D1B340 #D8AE3E #DDA83C #E1A03A #E59738 #E68D36 #E68033 #E67431 #E4652E #E2562B #DF4728 #DD3726 #DB2823 +#5E1D9D #4F1EA9 #4A28B3 #4432BD #403DC5 #3F49CA #3F56CE #3F62D0 #416DCE #4379CD #4683C8 #4A8CC3 #4E95BD #539BB4 #58A2AC #5DA8A3 #64AC99 #6AB18F #71B486 #79B77D #80B973 #89BB6B #91BC64 #9ABE5C #A3BE57 #ACBD51 #B5BD4C #BDBB48 #C5B945 #CDB642 #D3B23F #DAAD3D #DEA63B #E29E39 #E59638 #E68B35 #E67F33 #E67331 #E4642E #E1552B #DF4628 #DD3725 #DB2823 +#5E1D9D #501EA9 #4A28B3 #4531BC #403BC5 #3F48C9 #3F54CD #3F60D0 #416BCE #4376CD #4681CA #4989C4 #4D92BF #519AB7 #56A0AF #5BA6A6 #61AB9D #67AF93 #6EB38A #75B681 #7DB878 #84BA6F #8DBC68 #95BD60 #9EBE5A #A7BE54 #B0BD4F #B8BC4A #C0BA47 #C8B844 #CFB541 #D5B03F #DBAC3D #DFA43B #E29C39 #E69437 #E68935 #E67D33 #E67130 #E4622E #E1542B #DF4528 #DD3725 #DB2823 +#5E1D9D #501EA9 #4A27B2 #4531BB #403AC4 #3F46C9 #3F52CD #3F5ED0 #4169CF #4274CE #457ECB #4887C6 #4C90C0 #5098B9 #559EB1 #59A4A9 #5FA9A0 #65AD97 #6BB18E #72B485 #79B77C #81B973 #89BB6B #91BC64 #99BD5D #A2BE57 #AABD52 #B3BD4D #BBBC49 #C3BA46 #CBB842 #D1B340 #D7AF3E #DDAA3C #E0A23A #E39B39 #E69237 #E68735 #E67B32 #E66F30 #E3612D #E1532B #DF4528 #DD3625 #DB2823 +#5E1D9D #501EA9 #4A27B2 #4530BB #4039C4 #3F45C8 #3F51CC #3E5CD0 #4067CF #4272CE #447DCC #4785C7 #4B8EC2 #4E96BC #539CB4 #58A2AC #5DA8A3 #63AC9A #69B091 #6FB388 #76B680 #7DB877 #85BA6F #8DBC68 #95BD61 #9DBE5A #A5BE55 #AEBD50 #B6BD4B #BEBB48 #C5B945 #CDB642 #D3B240 #D8AE3E #DDA83C #E1A13A #E49938 #E69036 #E68534 #E67A32 #E56E30 #E3602D #E1522A #DF4428 #DD3625 #DB2823 +#5E1D9D #511EA8 #4B26B1 #462FBA #4138C3 #3F44C8 #3F4FCC #3E5AD0 #4065CF #4270CE #447ACD #4783C8 #4A8BC3 #4D94BE #529AB6 #56A0AE #5BA6A6 #60AA9E #66AE95 #6CB28C #73B583 #7AB77B #81B973 #89BB6B #91BC64 #99BD5E #A1BE58 #A9BD53 #B1BD4E #B9BC4A #C0BA47 #C8B944 #CEB541 #D4B13F #DAAD3D #DEA63B #E19F3A #E49838 #E68E36 #E68334 #E67832 #E56C2F #E35F2D #E1512A #DF4328 #DD3625 #DB2823 +#5E1D9D #511EA8 #4B26B1 #462FBA #4138C2 #3F42C7 #3F4ECB #3E59CF #4063CF #416ECE #4378CD #4681C9 #4989C4 #4C91BF #5098B9 #559EB1 #59A4A9 #5EA9A1 #64AD98 #6AB090 #70B487 #77B67F #7EB877 #85BA6F #8DBC68 #94BD61 #9CBE5B #A4BE56 #ACBD51 #B4BD4C #BCBB49 #C3BA46 #CAB843 #D0B441 #D6B03F #DBAC3D #DFA53B #E29D39 #E59638 #E68C36 #E68234 #E67732 #E56B2F #E35D2D #E1502A #DF4328 #DD3525 #DB2823 +#5E1D9D #511EA8 #4B25B1 #462EB9 #4137C2 #4041C7 #3F4CCB #3E57CE #3F62D0 #416CCE #4376CD #457FCB #4887C6 #4C8FC1 #4F97BB #539CB3 #58A2AC #5CA7A4 #62AB9C #68AF93 #6DB38A #74B582 #7BB77A #81BA72 #89BB6B #90BC65 #98BD5E #A0BE59 #A8BE54 #AFBD4F #B7BD4B #BEBB48 #C5B945 #CCB742 #D2B340 #D7AF3E #DDAA3C #E0A33B #E39C39 #E69537 #E68B35 #E68033 #E67631 #E5692F #E35C2C #E14F2A #DF4227 #DD3525 #DB2823 +#5E1D9D #511EA8 #4B25B0 #472EB9 #4236C1 #4040C6 #3F4BCA #3F56CE #3F60D0 #416ACF #4274CE #447DCC #4885C7 #4B8DC2 #4E95BD #529BB6 #56A0AE #5BA6A7 #60AA9F #65AD96 #6BB18E #71B486 #78B67E #7EB976 #85BA6F #8CBC68 #94BD62 #9BBE5B #A3BE57 #ABBD52 #B2BD4D #BABC4A #C1BA47 #C8B944 #CEB541 #D3B23F #D9AE3E #DDA83C #E0A13A #E39A39 #E69337 #E68935 #E67F33 #E67431 #E4682F #E25B2C #E04E2A #DF4227 #DD3525 #DB2823 +#5E1D9D #521EA7 #4C25B0 #472DB8 #4236C0 #403FC6 #3F4ACA #3F54CD #3F5ED0 #4068CF #4272CE #447CCD #4783C8 #4A8BC3 #4D93BE #5199B8 #559EB1 #59A4A9 #5EA9A2 #63AC99 #69B091 #6EB389 #75B581 #7BB77A #82BA72 #89BB6B #90BC65 #97BD5F #9FBE59 #A6BE55 #AEBD50 #B5BD4C #BCBB49 #C3BA46 #CAB843 #D0B441 #D5B03F #DAAC3D #DEA73B #E1A03A #E49938 #E69137 #E68735 #E67D33 #E67331 #E4672E #E25A2C #E04E2A #DF4127 #DD3525 #DB2823 +#5E1D9D #521EA7 #4C24B0 #472DB8 #4335C0 #403EC6 #3F48C9 #3F53CD #3E5DD0 #4066CF #4270CE #4379CD #4682C9 #4989C4 #4C91C0 #5097BA #549DB3 #58A2AC #5CA7A5 #61AB9D #67AE95 #6CB28D #72B485 #78B77D #7FB976 #85BA6E #8CBB68 #93BD62 #9BBE5C #A2BE57 #A9BD53 #B1BD4E #B8BC4B #BFBB48 #C5B945 #CCB742 #D1B340 #D6AF3E #DCAB3D #DFA53B #E29E39 #E49838 #E68F36 #E68634 #E67C33 #E67231 #E4652E #E2592C #E04D29 #DF4127 #DD3425 #DB2823 +#5E1D9D #521EA7 #4C24AF #472CB7 #4334BF #403DC5 #3F47C9 #3F51CC #3E5BD0 #4065CF #416ECE #4377CD #4580CA #4887C6 #4B8FC1 #4E96BC #529BB5 #56A0AE #5BA5A7 #5FA99F #65AD98 #6AB090 #6FB388 #75B681 #7CB879 #82BA72 #89BB6B #90BC65 #97BD5F #9EBE5A #A5BE55 #ACBD51 #B4BD4C #BABC49 #C1BA47 #C8B944 #CDB642 #D3B240 #D8AE3E #DDAA3C #DFA43B #E29D39 #E59638 #E68E36 #E68434 #E67B32 #E67030 #E4642E #E2582C #E04C29 #DF4027 #DD3425 #DB2823 +#5E1D9D #521EA7 #4C24AF #482CB7 #4334BE #403CC5 #3F46C8 #3F50CC #3E5ACF #3F63CF #416CCE #4376CD #457ECB #4885C7 #4B8DC2 #4D94BE #5199B7 #559FB0 #59A4A9 #5DA8A2 #63AC9B #68AF93 #6DB28B #73B584 #79B77C #7FB975 #85BA6E #8CBB68 #93BC62 #9ABD5C #A1BE58 #A8BD53 #AFBD4F #B6BD4B #BDBB48 #C3BA46 #CAB843 #CFB541 #D4B13F #D9AD3D #DDA93C #E0A23A #E39C39 #E59537 #E68C36 #E68334 #E67932 #E56F30 #E4632E #E2572B #E04C29 #DF4027 #DD3425 #DB2823 +#5E1D9D #531EA7 #4C24AF #482BB6 #4433BE #403BC5 #3F45C8 #3F4FCB #3E58CF #3F62D0 #416BCF #4274CE #447DCC #4784C8 #4A8BC3 #4D92BF #5098B9 #549DB2 #58A2AC #5CA7A5 #61AA9D #66AE96 #6BB18E #70B487 #76B680 #7CB879 #82BA71 #89BB6B #8FBC65 #96BD60 #9DBE5A #A4BE56 #ABBD52 #B2BD4D #B9BC4A #BFBB47 #C5B945 #CCB742 #D1B440 #D5B03F #DAAC3D #DEA73B #E1A13A #E39A39 #E69437 #E68B35 #E68134 #E67832 #E56E30 #E3622D #E2562B #E04B29 #DE3F27 #DD3425 #DB2823 +#5E1D9D #531EA7 #4C23AF #482BB6 #4432BD #403AC4 #3F44C8 #3F4DCB #3E57CE #3F60D0 #4169CF #4272CE #447BCD #4682C9 #4989C4 #4C90C0 #4F96BB #539BB5 #57A0AE #5AA5A7 #5FA9A0 #64AC99 #69B091 #6EB38A #73B583 #79B77C #7FB975 #85BA6E #8CBB68 #93BC63 #99BD5D #A0BE58 #A7BE54 #AEBD50 #B5BD4C #BBBC49 #C1BA47 #C8B944 #CDB642 #D2B340 #D7AF3E #DCAB3D #DFA63B #E19F3A #E49938 #E69237 #E68935 #E68033 #E67732 #E56C30 #E3612D #E2562B #E04A29 #DE3F27 #DD3325 #DB2823 +#5E1D9D #531EA6 #4D23AE #482AB6 #4432BD #4039C4 #3F43C7 #3F4CCB #3F56CE #3F5FD0 #4067CF #4270CE #4379CD #4680CA #4887C6 #4B8EC1 #4E95BD #529AB7 #559FB0 #59A4AA #5DA8A3 #62AB9C #67AE94 #6CB28D #71B486 #77B67F #7CB878 #82BA71 #89BB6B #8FBC66 #96BD60 #9CBE5B #A3BE57 #AABD52 #B1BD4E #B7BD4B #BDBB48 #C3BA46 #CAB843 #CFB541 #D3B23F #D8AE3E #DDAA3C #DFA43B #E29E39 #E49838 #E69036 #E68835 #E67F33 #E67631 #E56B2F #E3602D #E1552B #E04A29 #DE3E27 #DD3325 #DB2823 +#5E1D9D #531EA6 #4D23AE #492AB5 #4431BC #4039C3 #4042C7 #3F4BCA #3F54CD #3E5DD0 #4066CF #416ECE #4377CD #457FCB #4886C7 #4A8CC2 #4D93BE #5098B8 #549DB2 #58A2AC #5CA7A5 #60AA9E #65AD97 #6AB090 #6EB389 #74B582 #7AB77B #80B974 #85BB6E #8CBB69 #92BC63 #99BD5D #9FBE59 #A6BE55 #ADBD51 #B3BD4D #B9BC4A #BFBB47 #C5B945 #CBB742 #D0B441 #D5B13F #D9AD3D #DDA93C #E0A33A #E29D39 #E59738 #E68F36 #E68634 #E67D33 #E67531 #E56A2F #E35F2D #E1542B #E04929 #DE3E27 #DD3325 #DB2823 +#5E1D9D #531EA6 #4D22AE #492AB5 #4531BC #4138C3 #4041C7 #3F4ACA #3F53CD #3E5CD0 #4064CF #416DCE #4375CD #447DCC #4784C8 #4A8BC3 #4C91BF #4F97BA #539CB4 #57A0AE #5AA5A7 #5EA9A1 #63AC9A #68AF93 #6CB28C #72B485 #77B67E #7DB878 #82BA71 #89BB6B #8FBC66 #95BD60 #9CBE5B #A2BE57 #A9BD53 #AFBD4F #B5BD4C #BBBC49 #C1BA46 #C7B944 #CDB642 #D1B340 #D6B03F #DBAC3D #DEA73B #E0A13A #E39B39 #E59637 #E68D36 #E68534 #E67C33 #E67431 #E5692F #E35E2D #E1532B #E04929 #DE3E27 #DD3325 #DB2823 +#5E1D9D #541EA6 #4D22AE #4929B4 #4530BB #4137C2 #4040C6 #3F49C9 #3F52CD #3E5BD0 #3F63CF #416BCE #4274CE #447CCD #4682C9 #4989C5 #4C8FC0 #4E96BC #529AB6 #559FB0 #59A4AA #5DA8A3 #61AB9C #66AE95 #6AB18F #6FB488 #75B581 #7AB77B #80B974 #86BB6E #8CBB69 #92BC63 #98BD5E #9EBE59 #A5BE55 #ABBD51 #B2BD4E #B8BC4B #BEBB48 #C3BA46 #C9B843 #CEB541 #D3B240 #D7AF3E #DCAB3C #DEA63B #E1A03A #E39A39 #E69437 #E68C36 #E68334 #E67B32 #E67231 #E4682F #E35D2D #E1532A #E04828 #DE3D27 #DD3325 #DB2823 +#5E1D9D #541EA6 #4D22AD #4929B4 #4530BB #4137C2 #403FC6 #3F48C9 #3F51CC #3E59CF #3F62D0 #416ACF #4272CE #437ACD #4681CA #4887C6 #4B8EC2 #4D94BD #5199B8 #549DB2 #58A2AC #5BA7A6 #60AA9F #64AD98 #69B091 #6DB38A #72B584 #78B67E #7DB877 #83BA71 #89BB6B #8FBC66 #95BD61 #9BBE5B #A1BE58 #A8BE54 #AEBD50 #B4BD4C #BABC4A #C0BB47 #C5B945 #CBB842 #D0B441 #D4B13F #D8AE3E #DDAA3C #DFA43B #E19F3A #E49938 #E69337 #E68B35 #E68234 #E67A32 #E67130 #E4672E #E35C2C #E1522A #DF4728 #DE3D27 #DD3325 #DB2823 +#5E1D9D #541EA6 #4D22AD #4929B4 #462FBA #4236C1 #403EC6 #3F47C9 #3F4FCC #3E58CF #3F60D0 #4068CF #4270CE #4378CD #457FCB #4886C7 #4A8CC3 #4D92BF #5098BA #539CB4 #57A0AE #5AA5A8 #5EA9A1 #62AC9B #67AF94 #6BB18D #70B487 #75B680 #7BB77A #80B974 #86BB6E #8CBB69 #92BC64 #98BD5E #9EBE5A #A4BE56 #AABD52 #B0BD4E #B6BD4B #BCBB49 #C2BA46 #C7B944 #CCB742 #D1B340 #D5B03F #DAAD3D #DDA93C #E0A33B #E29E39 #E49838 #E69137 #E68935 #E68133 #E67932 #E67030 #E4662E #E25B2C #E1512A #DF4728 #DE3D26 #DD3225 #DB2823 +#5E1D9D #541EA5 #4D22AD #4A28B3 #462FBA #4236C1 #403DC5 #3F46C8 #3F4ECB #3F57CE #3F5FD0 #4067CF #426FCE #4377CD #457ECB #4784C8 #4A8AC4 #4C90C0 #4F96BB #529BB5 #569FB0 #59A3AA #5DA8A4 #61AA9D #65AD97 #6AB090 #6EB389 #73B583 #78B77D #7EB877 #83BA71 #89BB6B #8FBC66 #94BD61 #9ABE5C #A0BE58 #A7BE54 #ADBD51 #B3BD4D #B8BC4A #BEBB48 #C4BA46 #C9B843 #CEB641 #D2B240 #D6AF3E #DBAC3D #DEA73B #E0A23A #E29C39 #E59738 #E69036 #E68835 #E68033 #E67832 #E56F30 #E4652E #E25B2C #E1512A #DF4628 #DE3C26 #DD3225 #DB2823 +#5E1D9D #541EA5 #4D21AD #4A28B3 #462FBA #4235C0 #403DC5 #3F45C8 #3F4DCB #3F56CE #3F5ED0 #4066CF #416DCE #4375CD #447DCC #4683C8 #4989C5 #4B8FC1 #4E95BD #5199B7 #549EB1 #58A2AC #5BA6A6 #5FA9A0 #64AC99 #68AF93 #6CB28C #71B486 #76B680 #7BB87A #80B973 #86BB6E #8CBB69 #91BC64 #97BD5F #9DBE5A #A3BE57 #A9BD53 #AFBD4F #B5BD4C #BABC49 #C0BA47 #C5B945 #CBB842 #CFB541 #D3B23F #D8AE3E #DCAB3C #DEA63B #E1A13A #E39B39 #E59638 #E68F36 #E68735 #E67F33 #E67732 #E56E30 #E4642E #E25A2C #E1502A #DF4628 #DE3C26 #DD3225 #DB2823 +#5E1D9D #541EA5 #4E21AD #4A28B3 #462EB9 #4335C0 #403CC5 #3F44C8 #3F4CCB #3F54CD #3E5DD0 #4064CF #416CCE #4273CE #447BCD #4681C9 #4887C6 #4B8DC2 #4D93BE #5098B9 #539CB3 #57A1AE #5AA5A8 #5EA8A2 #62AB9C #66AE95 #6AB18F #6FB388 #74B582 #79B77C #7EB876 #83BA70 #89BB6B #8EBC66 #94BD61 #9ABD5C #A0BE59 #A6BE55 #ABBD51 #B1BD4E #B7BD4B #BCBB49 #C2BA46 #C7B944 #CCB742 #D0B440 #D5B13F #D9AE3E #DDAA3C #DFA53B #E19F3A #E39A38 #E69537 #E68D36 #E68534 #E67E33 #E67631 #E56C30 #E4632E #E2592C #E14F2A #DF4528 #DE3C26 #DD3225 #DB2823 +#5E1D9D #541EA5 #4E21AC #4A27B3 #462EB9 #4334BF #403BC5 #3F43C7 #3F4BCA #3F53CD #3E5BD0 #3F63CF #416ACF #4272CE #4379CD #4580CA #4886C7 #4A8CC3 #4C92BF #4F97BB #529BB5 #569FAF #59A3AA #5CA7A4 #60AA9E #65AD98 #69B091 #6DB28B #72B485 #77B67F #7CB879 #81B973 #86BB6E #8BBB69 #91BC64 #97BD5F #9CBE5B #A2BE57 #A8BD53 #AEBD50 #B4BD4C #B9BC4A #BEBB48 #C4BA45 #C9B843 #CDB642 #D2B340 #D6B03F #DAAD3D #DDA93C #DFA43B #E29E39 #E49938 #E69437 #E68C36 #E68434 #E67C33 #E67531 #E56B2F #E3622D #E2582C #E14F2A #DF4528 #DE3B26 #DD3225 #DB2823 +#5E1D9D #551EA5 #4E21AC #4A27B2 #472DB8 #4334BF #403AC4 #4042C7 #3F4ACA #3F52CD #3E5ACF #3F62D0 #4169CF #4270CE #4378CD #457ECB #4784C7 #498AC4 #4C90C0 #4E96BC #519AB7 #559EB1 #58A2AC #5BA6A6 #5FA9A0 #63AC9A #67AF94 #6BB18E #6FB488 #74B582 #79B77C #7EB976 #83BA70 #89BB6B #8EBC67 #94BD62 #99BD5D #9FBE59 #A5BE56 #AABD52 #B0BD4F #B6BD4B #BBBC49 #C0BA47 #C5B945 #CBB842 #CFB541 #D3B240 #D7AF3E #DBAC3D #DEA83C #E0A23A #E29D39 #E49838 #E69237 #E68B35 #E68334 #E67B32 #E67431 #E56A2F #E3612D #E2582B #E04E2A #DF4528 #DE3B26 #DD3225 #DB2823 +#5E1D9D #551EA5 #4E21AC #4A27B2 #472DB8 #4333BE #403AC4 #4041C7 #3F49CA #3F51CC #3E59CF #3F60D0 #4068CF #426FCE #4376CD #447DCC #4783C8 #4989C5 #4B8EC1 #4E94BD #5098B8 #549DB3 #57A1AD #5AA5A8 #5DA8A2 #61AB9C #65AE96 #69B090 #6DB38A #72B584 #77B67E #7CB879 #81B973 #86BB6E #8BBB69 #91BC64 #96BD5F #9CBE5B #A1BE57 #A7BE54 #ADBD51 #B2BD4D #B8BC4B #BDBB48 #C2BA46 #C7B944 #CCB742 #D0B441 #D4B13F #D8AE3E #DCAB3C #DEA63B #E0A13A #E39C39 #E59738 #E69136 #E68935 #E68234 #E67A32 #E67331 #E5692F #E3602D #E2572B #E04E29 #DF4428 #DE3B26 #DD3124 #DB2823 +#5E1D9D #551EA5 #4E20AC #4B27B2 #472DB8 #4433BE #4039C4 #4041C7 #3F48C9 #3F50CC #3E58CF #3F5FD0 #4066CF #416ECE #4375CD #447CCD #4682C9 #4887C6 #4B8DC2 #4D92BE #5097BA #539BB5 #569FAF #59A3AA #5CA7A5 #60AA9F #64AD99 #68AF93 #6CB28D #70B487 #75B581 #7AB77B #7FB976 #83BA70 #89BB6B #8EBC67 #93BD62 #99BD5D #9EBE59 #A4BE56 #A9BD53 #AFBD4F #B4BD4C #BABC4A #BFBB48 #C4BA45 #C9B843 #CDB642 #D1B340 #D5B03F #D9AD3D #DDAA3C #DFA53B #E1A03A #E39B39 #E59638 #E68F36 #E68835 #E68133 #E67932 #E67231 #E4682F #E35F2D #E2562B #E04D29 #DF4428 #DE3B26 #DD3124 #DB2823 +#5E1D9D #551EA5 #4E20AC #4B26B1 #472CB7 #4432BD #4138C3 #4040C6 #3F47C9 #3F4FCC #3F57CE #3F5ED0 #4065CF #416CCE #4273CE #447ACD #4680CA #4886C6 #4A8BC3 #4C91BF #4F96BC #529AB6 #559EB1 #58A2AC #5BA6A6 #5FA9A1 #62AC9B #66AE95 #6AB18F #6EB389 #73B583 #78B67E #7CB878 #81B973 #86BB6E #8BBB69 #91BC64 #96BD60 #9BBE5B #A1BE58 #A6BE55 #ACBD51 #B1BD4E #B6BD4B #BBBC49 #C0BA47 #C5B945 #CAB843 #CEB541 #D2B240 #D6AF3E #DAAD3D #DDA93C #DFA43B #E19F3A #E39A38 #E69537 #E68E36 #E68735 #E68033 #E67832 #E67130 #E4682F #E35F2D #E2552B #E04C29 #DF4328 #DE3A26 #DD3124 #DB2823 +#5E1D9D #551EA4 #4E20AB #4B26B1 #472CB7 #4432BD #4138C3 #403FC6 #3F47C9 #3F4ECB #3F56CE #3E5DD0 #4064CF #416BCF #4272CE #4379CD #457FCB #4784C7 #498AC4 #4C8FC0 #4E95BD #5199B8 #549DB3 #57A1AD #5AA5A8 #5DA8A3 #61AB9D #65AD97 #69B091 #6CB28B #71B486 #76B680 #7AB77B #7FB975 #83BA70 #89BB6B #8EBC67 #93BD62 #98BD5E #9EBE5A #A3BE57 #A8BD53 #AEBD50 #B3BD4D #B8BC4A #BDBB48 #C2BA46 #C7B944 #CCB742 #D0B441 #D3B23F #D7AF3E #DBAC3D #DEA83C #E0A33A #E29E39 #E49938 #E69437 #E68D36 #E68634 #E67F33 #E67832 #E67030 #E4672E #E35E2D #E1552B #E04C29 #DF4328 #DE3A26 #DD3124 #DB2823 +#5E1D9D #551EA4 #4E20AB #4B26B1 #482CB7 #4432BC #4137C2 #403EC6 #3F46C8 #3F4DCB #3F55CD #3E5CD0 #3F63CF #416ACF #4270CE #4377CD #457ECC #4783C8 #4989C5 #4B8EC1 #4D93BE #5098B9 #539CB4 #569FAF #59A3AA #5CA7A5 #60AA9F #63AC99 #67AF94 #6BB18E #6FB388 #74B583 #78B67D #7DB878 #81BA72 #86BB6E #8BBB69 #90BC65 #96BD60 #9BBE5C #A0BE58 #A5BE55 #ABBD52 #B0BD4F #B5BD4C #BABC4A #BFBB48 #C4BA45 #C9B843 #CDB642 #D1B340 #D4B13F #D8AE3E #DCAB3C #DEA73B #E0A23A #E29D39 #E49838 #E69337 #E68C36 #E68534 #E67E33 #E67732 #E56F30 #E4662E #E35D2C #E1542B #E04B29 #DF4327 #DE3A26 #DD3124 #DB2823 +#5E1D9D #551EA4 #4E20AB #4B25B1 #482BB6 #4531BC #4137C2 #403EC6 #3F45C8 #3F4CCB #3F53CD #3E5BD0 #3F62D0 #4068CF #426FCE #4376CD #447DCC #4682C9 #4887C6 #4A8DC2 #4D92BF #4F97BB #529AB6 #559EB1 #58A2AC #5BA6A7 #5EA9A1 #62AB9C #66AE96 #69B090 #6DB38A #72B485 #76B680 #7BB77A #7FB975 #84BA70 #89BB6B #8EBC67 #93BC63 #98BD5E #9DBE5A #A2BE57 #A8BE54 #ADBD51 #B2BD4D #B7BD4B #BCBB49 #C1BA47 #C5B945 #CAB843 #CEB541 #D2B340 #D5B03F #D9AD3D #DDAA3C #DFA53B #E1A13A #E39C39 #E59738 #E69137 #E68B35 #E68434 #E67D33 #E67631 #E56E30 #E4652E #E35C2C #E1542B #E04B29 #DF4227 #DE3926 #DD3124 #DB2823 +#5E1D9D #561EA4 #4E20AB #4B25B1 #482BB6 #4531BC #4236C1 #403DC5 #3F44C8 #3F4BCA #3F52CD #3E5ACF #3F61D0 #4067CF #416ECE #4375CD #447BCD #4681CA #4886C6 #4A8BC3 #4C90C0 #4E96BC #5199B7 #549DB2 #57A1AD #5AA4A8 #5DA8A3 #61AA9E #64AD98 #68AF92 #6CB28D #70B487 #74B582 #79B77D #7DB878 #81BA72 #86BB6E #8BBB69 #90BC65 #95BD60 #9ABE5C #9FBE59 #A5BE56 #AABD52 #AFBD4F #B4BD4C #B9BC4A #BEBB48 #C2BA46 #C7B944 #CCB742 #CFB541 #D3B240 #D6AF3E #DAAD3D #DDA93C #DFA43B #E1A03A #E39B39 #E59638 #E69036 #E68935 #E68334 #E67C32 #E67531 #E56D30 #E4642E #E35C2C #E1532B #E04A29 #DF4227 #DE3926 #DD3124 #DB2823 +#5E1D9D #561EA4 #4F1FAB #4B25B0 #482BB6 #4530BB #4236C1 #403CC5 #3F43C8 #3F4ACA #3F52CC #3E59CF #3F5FD0 #4066CF #416DCE #4273CE #437ACD #457FCB #4785C7 #498AC4 #4B8FC1 #4E94BD #5098B9 #539CB4 #56A0AF #59A3AA #5CA7A5 #5FA9A0 #63AC9A #66AE95 #6AB18F #6EB38A #72B484 #77B67F #7BB77A #7FB975 #84BA70 #89BB6B #8EBC67 #93BC63 #97BD5E #9CBE5B #A2BE57 #A7BE54 #ACBD51 #B1BD4E #B6BD4B #BABC49 #BFBB47 #C4BA45 #C9B843 #CDB642 #D0B441 #D4B13F #D7AE3E #DBAC3D #DEA83C #E0A33B #E19F39 #E39A38 #E59537 #E68F36 #E68835 #E68234 #E67B32 #E67431 #E56C2F #E4632E #E25B2C #E1522A #E04A29 #DF4227 #DE3926 #DD3124 #DB2823 +#5E1D9D #561EA4 #4F1FAB #4C25B0 #482AB5 #4530BB #4236C0 #403CC5 #3F43C7 #3F4ACA #3F51CC #3E58CF #3F5ED0 #4065CF #416BCE #4272CE #4378CD #457ECB #4783C8 #4988C5 #4B8EC2 #4D93BE #4F97BA #529BB5 #559EB1 #58A2AC #5BA6A7 #5EA9A2 #61AB9C #65AD97 #69B091 #6CB28C #70B487 #75B581 #79B77C #7DB877 #82BA72 #86BB6D #8BBB69 #90BC65 #95BD61 #9ABD5D #9FBE59 #A4BE56 #A9BD53 #AEBD50 #B3BD4D #B8BC4B #BCBB49 #C1BA47 #C5B945 #CAB843 #CEB641 #D1B340 #D5B03F #D8AE3E #DCAB3C #DEA73B #E0A23A #E29E39 #E49938 #E69537 #E68E36 #E68735 #E68133 #E67A32 #E67331 #E56B2F #E4622E #E25A2C #E1522A #E04A29 #DF4127 #DE3926 #DD3024 #DB2823 +#5E1D9D #561EA4 #4F1FAB #4C25B0 #492AB5 #4530BB #4235C0 #403BC5 #4042C7 #3F49C9 #3F50CC #3F57CE #3E5DD0 #4064CF #416ACF #4271CE #4377CD #447DCC #4682C9 #4887C6 #4A8CC2 #4C91BF #4F96BC #519AB7 #549DB2 #57A1AD #5AA4A8 #5DA8A4 #60AA9E #64AC99 #67AF93 #6BB18E #6EB389 #73B584 #77B67F #7BB87A #80B974 #84BA70 #89BB6B #8DBC67 #92BC63 #97BD5F #9CBE5B #A1BE58 #A6BE55 #ABBD52 #B0BD4F #B5BD4C #B9BC4A #BEBB48 #C2BA46 #C7B944 #CBB742 #CFB541 #D2B240 #D6B03F #D9AD3D #DDAA3C #DEA63B #E0A13A #E29D39 #E49838 #E69337 #E68D36 #E68634 #E68033 #E67932 #E67231 #E56A2F #E3622D #E25A2C #E1512A #E04929 #DF4127 #DE3926 #DD3024 #DB2823 +#5E1D9D #561EA4 #4F1FAA #4C24B0 #492AB5 #462FBA #4335BF #403AC4 #4041C7 #3F48C9 #3F4FCB #3F56CE #3E5CD0 #3F63CF #4169CF #426FCE #4376CD #447CCD #4681CA #4886C6 #4A8BC3 #4C90C0 #4E95BD #5199B8 #539CB4 #56A0AF #59A3AA #5CA7A5 #5FA9A0 #62AC9B #66AE96 #69B090 #6DB28B #71B486 #75B581 #79B77C #7EB877 #82BA72 #86BB6D #8BBB69 #90BC65 #95BD61 #99BD5D #9EBE59 #A3BE57 #A8BD54 #ADBD51 #B2BD4E #B6BD4B #BBBC49 #BFBB47 #C4B945 #C8B843 #CCB742 #D0B441 #D3B23F #D7AF3E #DAAC3D #DDA93C #DFA53B #E1A03A #E39C39 #E59738 #E69237 #E68C36 #E68534 #E67F33 #E67832 #E67130 #E5692F #E3612D #E2592C #E1512A #E04929 #DF4127 #DE3826 #DD3024 #DB2823 +#5E1D9D #561EA4 #4F1FAA #4C24AF #492AB5 #462FBA #4334BF #403AC4 #4040C7 #3F47C9 #3F4ECB #3F55CE #3E5BD0 #3F62D0 #4068CF #416ECE #4374CD #447BCD #4580CA #4785C7 #498AC4 #4B8FC1 #4D93BE #5098BA #529BB5 #559EB0 #58A2AC #5BA5A7 #5EA8A2 #61AB9D #65AD98 #68AF92 #6BB28D #6FB388 #73B583 #77B67E #7CB879 #80B974 #84BA6F #89BB6B #8DBC67 #92BC63 #97BD5F #9BBE5B #A0BE58 #A5BE55 #AABD52 #AFBD4F #B4BD4C #B8BC4A #BDBB49 #C1BA47 #C5B945 #CAB843 #CDB642 #D1B340 #D4B13F #D8AE3E #DBAC3D #DEA83C #DFA43B #E19F3A #E39B39 #E59638 #E69137 #E68B35 #E68434 #E67E33 #E67732 #E67030 #E4682F #E3602D #E2582C #E1502A #E04828 #DF4027 #DE3826 #DD3024 #DB2823 +#5E1D9D #561EA4 #4F1FAA #4C24AF #4929B4 #462FBA #4334BF #4039C4 #4040C6 #3F46C9 #3F4DCB #3F54CD #3E5ACF #3F61D0 #4067CF #416DCE #4273CE #4379CD #457FCB #4784C8 #4988C5 #4B8DC2 #4D92BF #4F96BB #529AB6 #549DB2 #57A1AD #5AA4A9 #5CA8A4 #60AA9F #63AC9A #67AE94 #6AB18F #6DB38A #71B485 #76B680 #7AB77B #7EB876 #82BA72 #86BB6D #8BBB69 #90BC65 #94BD61 #99BD5D #9EBE5A #A2BE57 #A7BE54 #ACBD51 #B1BD4E #B5BD4C #BABC4A #BEBB48 #C3BA46 #C7B944 #CBB842 #CFB541 #D2B340 #D5B03F #D9AE3E #DCAB3C #DEA73B #E0A33A #E29E39 #E39A38 #E59637 #E69036 #E68935 #E68334 #E67D33 #E67731 #E66F30 #E4672F #E3602D #E2582B #E1502A #E04828 #DF4027 #DE3826 #DC3024 #DB2823 +#5E1D9D #561EA3 #4F1FAA #4C24AF #4929B4 #462EB9 #4333BE #4039C3 #403FC6 #3F46C8 #3F4CCB #3F53CD #3E59CF #3F60D0 #4066CF #416CCE #4272CE #4378CD #447ECC #4682C9 #4887C6 #4A8CC3 #4C91C0 #4E96BC #5199B8 #539CB3 #56A0AF #59A3AA #5BA7A6 #5FA9A1 #62AB9C #65AD96 #69B091 #6CB28C #70B487 #74B582 #78B67E #7CB879 #80B974 #84BA6F #89BB6B #8DBC67 #92BC63 #96BD5F #9BBE5B #A0BE59 #A4BE56 #A9BD53 #AEBD50 #B3BD4D #B7BD4B #BBBC49 #C0BB47 #C4B945 #C8B843 #CCB742 #D0B441 #D3B240 #D6AF3E #DAAD3D #DDAA3C #DEA63B #E0A23A #E29D39 #E49938 #E69537 #E68F36 #E68835 #E68234 #E67C33 #E67631 #E56E30 #E4672E #E35F2D #E2572B #E14F2A #DF4728 #DE4027 #DD3826 #DC3024 #DB2823 +#5E1D9D #561EA3 #4F1EAA #4C24AF #4929B4 #462EB9 #4433BE #4138C3 #403EC6 #3F45C8 #3F4BCA #3F52CD #3E58CF #3F5FD0 #4065CF #416BCF #4271CE #4377CD #447DCC #4681C9 #4886C6 #4A8BC3 #4C8FC0 #4E94BD #5098B9 #539BB5 #559FB0 #58A2AC #5AA5A7 #5DA8A2 #61AA9D #64AD98 #67AF93 #6BB18E #6EB389 #72B484 #76B680 #7AB77B #7EB876 #82BA71 #86BB6D #8BBB69 #8FBC65 #94BD62 #98BD5E #9DBE5A #A2BE57 #A6BE54 #ABBD52 #B0BD4F #B4BD4C #B9BC4A #BDBB48 #C1BA47 #C5B945 #CAB843 #CDB642 #D1B440 #D4B13F #D7AF3E #DAAC3D #DDA93C #DFA53B #E1A13A #E29C39 #E49838 #E69437 #E68E36 #E68735 #E68134 #E67B32 #E67531 #E56E30 #E4662E #E35E2D #E2562B #E14F2A #DF4728 #DE3F27 #DD3826 #DC3024 #DB2823 +#5E1D9D #561EA3 #4F1EAA #4C23AF #4928B4 #472EB9 #4433BE #4138C2 #403EC6 #3F44C8 #3F4BCA #3F51CC #3E57CE #3F5ED0 #4064CF #416ACF #426FCE #4375CD #447BCD #4680CA #4785C7 #498AC4 #4B8EC1 #4D93BE #4F97BA #529AB6 #549EB2 #57A1AD #5AA4A9 #5CA7A4 #5FAA9F #63AC9A #66AE95 #69B090 #6DB28B #70B487 #74B582 #78B77D #7CB878 #80B974 #84BA6F #89BB6B #8DBC67 #92BC64 #96BD60 #9BBE5C #9FBE59 #A4BE56 #A8BD53 #ADBD50 #B2BD4E #B6BD4B #BABC4A #BEBB48 #C3BA46 #C7B944 #CBB842 #CEB541 #D1B340 #D5B03F #D8AE3E #DBAC3D #DDA83C #DFA43B #E1A03A #E39C39 #E59738 #E69337 #E68D36 #E68635 #E68033 #E67A32 #E67431 #E56D30 #E4652E #E35E2D #E2562B #E04E2A #DF4728 #DE3F27 #DD3726 #DC3024 #DB2823 +#5E1D9D #571EA3 #4F1EAA #4C23AE #4A28B3 #472DB8 #4432BD #4137C2 #403DC5 #3F43C8 #3F4ACA #3F50CC #3F56CE #3E5DD0 #3F63CF #4068CF #416ECE #4274CD #447ACD #457FCB #4784C8 #4988C5 #4B8DC2 #4D92BF #4E96BC #5199B7 #549DB3 #56A0AF #59A3AA #5BA6A6 #5EA9A1 #62AB9C #65AD97 #68AF92 #6BB18D #6FB389 #73B584 #76B67F #7AB77B #7EB976 #82BA71 #86BB6D #8BBB69 #8FBC66 #94BD62 #98BD5E #9DBE5A #A1BE58 #A6BE55 #AABD52 #AFBD4F #B3BD4D #B8BC4B #BCBB49 #C0BA47 #C4B945 #C8B844 #CCB742 #CFB541 #D2B240 #D6B03F #D9AD3D #DCAB3C #DEA73B #E0A33A #E19F3A #E39B39 #E59738 #E69237 #E68C35 #E68634 #E68033 #E67932 #E67331 #E56C2F #E4642E #E35D2C #E2552B #E04E2A #DF4628 #DE3F27 #DD3725 #DC3024 #DB2823 +#5E1D9D #571EA3 #4F1EA9 #4D23AE #4A28B3 #472DB8 #4432BD #4137C2 #403DC5 #3F43C7 #3F49CA #3F4FCC #3F56CE #3E5CD0 #3F62D0 #4067CF #416DCE #4273CE #4379CD #457ECB #4683C8 #4887C6 #4A8CC3 #4C90C0 #4E95BD #5098B9 #539BB4 #559FB0 #58A2AC #5AA5A7 #5DA8A3 #60AA9E #64AC99 #67AE94 #6AB18F #6DB38A #71B486 #75B581 #79B77D #7CB878 #80B973 #84BA6F #89BB6B #8DBC68 #91BC64 #96BD60 #9ABE5C #9FBE59 #A3BE57 #A8BE54 #ACBD51 #B1BD4E #B5BD4C #B9BC4A #BDBB48 #C1BA46 #C5B945 #CAB843 #CDB642 #D0B441 #D3B23F #D7AF3E #DAAD3D #DDAA3C #DEA63B #E0A23A #E29E39 #E39A38 #E59638 #E69036 #E68B35 #E68534 #E67F33 #E67932 #E67331 #E56B2F #E4642E #E35C2C #E1552B #E04D29 #DF4628 #DE3E27 #DD3725 #DC3024 #DB2823 +#5E1D9D #571EA3 #4F1EA9 #4D23AE #4A28B3 #472DB8 #4432BC #4236C1 #403CC5 #4042C7 #3F48C9 #3F4FCB #3F55CE #3E5BD0 #3F61D0 #4066CF #416CCE #4272CE #4378CD #447DCC #4682C9 #4886C6 #4A8BC3 #4C8FC1 #4D94BE #5097BA #529BB6 #559EB1 #57A1AD #59A4A9 #5CA7A5 #5FA9A0 #62AB9B #65AE96 #69B091 #6CB28D #6FB488 #73B583 #77B67F #7BB77A #7FB976 #82BA71 #87BB6D #8BBB69 #8FBC66 #93BD62 #98BD5E #9CBE5B #A1BE58 #A5BE55 #A9BD53 #AEBD50 #B2BD4D #B6BD4B #BBBC49 #BFBB48 #C3BA46 #C7B944 #CBB842 #CEB541 #D1B340 #D4B13F #D7AF3E #DBAC3D #DDA93C #DFA53B #E0A13A #E29D39 #E49938 #E69537 #E68F36 #E68A35 #E68434 #E67E33 #E67832 #E67231 #E56A2F #E4632E #E35C2C #E1542B #E04D29 #DF4628 #DE3E27 #DD3725 #DC2F24 #DB2823 +#5E1D9D #571EA3 #501EA9 #4D23AE #4A28B3 #472CB7 #4531BC #4236C1 #403BC5 #4041C7 #3F48C9 #3F4ECB #3F54CD #3E5ACF #3F60D0 #4065CF #416BCE #4271CE #4376CD #447CCD #4681CA #4785C7 #4989C4 #4B8EC1 #4D92BF #4F96BB #519AB7 #549DB3 #56A0AF #59A3AA #5BA6A6 #5EA9A1 #61AB9D #64AD98 #67AF93 #6BB18E #6EB38A #71B485 #75B681 #79B77C #7DB878 #81B973 #84BA6F #89BB6B #8DBC68 #91BC64 #95BD60 #9ABD5D #9EBE5A #A2BE57 #A7BE54 #ABBD52 #B0BD4F #B4BD4C #B8BC4A #BCBB49 #C0BA47 #C4B945 #C8B844 #CCB742 #CFB541 #D2B240 #D5B03F #D8AE3E #DBAC3D #DDA83C #DFA43B #E1A03A #E29C39 #E49838 #E69437 #E68E36 #E68935 #E68334 #E67D33 #E67732 #E67130 #E56A2F #E4622E #E25B2C #E1542B #E04D29 #DF4528 #DE3E27 #DD3725 #DC2F24 #DB2823 +#5E1D9D #571EA3 #501EA9 #4D22AE #4A27B2 #472CB7 #4531BC #4236C0 #403BC5 #4041C7 #3F47C9 #3F4DCB #3F53CD #3E59CF #3F5FD0 #4064CF #416ACF #4270CE #4375CD #447BCD #457FCA #4784C8 #4988C5 #4B8DC2 #4C91BF #4E95BC #5199B8 #539CB4 #559FB0 #58A2AC #5AA5A7 #5DA8A3 #60AA9E #63AC9A #66AE95 #69B090 #6CB28C #70B487 #74B583 #77B67E #7BB77A #7FB975 #82BA71 #87BB6D #8BBB6A #8FBC66 #93BD62 #97BD5F #9CBE5B #A0BE58 #A4BE56 #A9BD53 #ADBD50 #B1BD4E #B5BD4C #B9BC4A #BDBB48 #C1BA46 #C5B945 #C9B843 #CDB642 #D0B441 #D3B240 #D6B03F #D9AD3D #DCAB3C #DEA73B #E0A33B #E19F3A #E39B39 #E59838 #E69337 #E68D36 #E68835 #E68234 #E67C33 #E67631 #E67030 #E5692F #E3622D #E25A2C #E1532B #E04C29 #DF4528 #DE3E27 #DD3625 #DC2F24 #DB2823 +#5E1D9D #571EA3 #501EA9 #4D22AE #4A27B2 #482CB7 #4531BB #4235C0 #403AC4 #4040C6 #3F46C9 #3F4CCB #3F52CD #3E58CF #3F5ED0 #4064CF #4169CF #416FCE #4274CE #437ACD #457ECB #4783C8 #4887C6 #4A8CC3 #4C90C0 #4E94BD #5098B9 #529BB5 #559EB1 #57A1AD #59A4A9 #5CA7A5 #5FA9A0 #62AB9C #65AD97 #68AF92 #6BB18E #6EB389 #72B485 #76B680 #79B77C #7DB877 #81B973 #85BA6F #89BB6B #8DBC68 #91BC64 #95BD61 #99BD5D #9EBE5A #A2BE57 #A6BE55 #AABD52 #AFBD4F #B3BD4D #B7BD4B #BBBC49 #BFBB48 #C3BA46 #C7B944 #CBB842 #CEB641 #D1B340 #D4B13F #D7AF3E #DAAD3D #DDAA3C #DEA63B #E0A23A #E29F39 #E39B39 #E59738 #E69237 #E68C36 #E68735 #E68133 #E67B32 #E67631 #E66F30 #E4682F #E3612D #E25A2C #E1532B #E04C29 #DF4528 #DE3D27 #DD3625 #DC2F24 #DB2823 +#5E1D9D #571EA3 #501EA9 #4D22AE #4A27B2 #482CB7 #4530BB #4235C0 #403AC4 #4040C6 #3F46C8 #3F4BCA #3F51CC #3E57CE #3E5DD0 #3F63CF #4068CF #416DCE #4273CE #4378CD #447ECC #4682C9 #4886C6 #4A8AC4 #4B8FC1 #4D93BE #4F97BB #529AB7 #549DB3 #56A0AE #59A3AA #5BA6A6 #5EA8A2 #61AA9D #64AC99 #67AE94 #6AB08F #6DB28B #70B486 #74B582 #78B67E #7BB879 #7FB975 #83BA71 #87BB6D #8BBB6A #8FBC66 #93BC62 #97BD5F #9BBE5B #9FBE59 #A4BE56 #A8BD54 #ACBD51 #B0BD4E #B5BD4C #B8BC4A #BCBB49 #C0BA47 #C4B945 #C8B944 #CCB742 #CFB541 #D2B340 #D5B13F #D8AE3E #DBAC3D #DDA93C #DFA53B #E0A23A #E29E39 #E49A38 #E59638 #E69137 #E68B35 #E68634 #E68033 #E67B32 #E67531 #E56E30 #E4672F #E3602D #E2592C #E1522A #E04B29 #DF4428 #DE3D27 #DD3625 #DC2F24 #DB2823 +#5E1D9D #571EA3 #501EA9 #4D22AD #4A27B2 #482BB6 #4530BB #4335BF #4039C4 #403FC6 #3F45C8 #3F4BCA #3F51CC #3F56CE #3E5CD0 #3F62D0 #4067CF #416CCE #4272CE #4377CD #447DCC #4681CA #4785C7 #4989C4 #4B8EC2 #4D92BF #4E96BC #5199B8 #539CB4 #559FB0 #58A2AC #5AA5A8 #5DA8A3 #60AA9F #63AC9A #66AE96 #69B091 #6CB28D #6FB388 #72B584 #76B680 #7AB77B #7DB877 #81B973 #85BA6F #89BB6B #8DBC68 #91BC64 #95BD61 #99BD5D #9DBE5A #A1BE58 #A5BE55 #AABD52 #AEBD50 #B2BD4D #B6BD4B #BABC4A #BEBB48 #C2BA46 #C5B945 #C9B843 #CDB642 #D0B441 #D3B240 #D5B03F #D8AE3E #DBAC3D #DDA83C #DFA43B #E1A13A #E29D39 #E49938 #E59537 #E69036 #E68B35 #E68534 #E67F33 #E67A32 #E67431 #E56E30 #E4672E #E3602D #E2592C #E1522A #E04B29 #DF4428 #DE3D27 #DD3625 #DC2F24 #DB2823 +#5E1D9D #571EA3 #501EA9 #4D22AD #4B26B2 #482BB6 #4530BB #4334BF #4039C4 #403EC6 #3F44C8 #3F4ACA #3F50CC #3F56CE #3E5BD0 #3F61D0 #4066CF #416BCE #4271CE #4376CD #447BCD #4580CA #4784C8 #4988C5 #4A8CC2 #4C91C0 #4E95BD #5098B9 #529BB5 #559EB1 #57A1AD #59A4A9 #5CA7A5 #5FA9A1 #62AB9C #65AD98 #67AF93 #6AB18F #6DB38A #71B486 #74B582 #78B67D #7CB879 #7FB975 #83BA71 #87BB6D #8BBB6A #8FBC66 #93BC63 #97BD5F #9BBE5C #9FBE59 #A3BE57 #A7BE54 #ABBD51 #AFBD4F #B4BD4C #B7BC4B #BBBC49 #BFBB47 #C3BA46 #C7B944 #CBB843 #CDB642 #D0B440 #D3B23F #D6AF3E #D9AD3D #DCAB3C #DEA73B #DFA43B #E1A03A #E39C39 #E49838 #E69537 #E68F36 #E68A35 #E68434 #E67F33 #E67932 #E67431 #E56D30 #E4662E #E35F2D #E2582C #E1512A #E04B29 #DF4428 #DE3D26 #DD3625 #DC2F24 #DB2823 +#5E1D9D #571EA3 #511EA8 #4D22AD #4B26B1 #482BB6 #462FBA #4334BF #4138C3 #403EC6 #3F44C8 #3F49CA #3F4FCC #3F55CE #3E5AD0 #3F60D0 #4065CF #416ACF #4270CE #4375CD #447ACD #457FCB #4783C8 #4887C6 #4A8BC3 #4C90C0 #4D94BE #4F97BA #529AB6 #549DB2 #56A0AE #59A3AA #5BA6A6 #5EA8A2 #60AA9E #63AC99 #66AE95 #69B090 #6CB28C #6FB488 #73B583 #76B67F #7AB77B #7DB877 #81B973 #85BA6F #89BB6B #8DBC68 #91BC64 #95BD61 #99BD5E #9DBE5A #A1BE58 #A5BE55 #A9BD53 #ADBD50 #B1BD4E #B5BD4C #B9BC4A #BDBB48 #C0BA47 #C4B945 #C8B944 #CBB742 #CEB541 #D1B340 #D4B13F #D7AF3E #DAAD3D #DDAA3C #DEA63B #E0A33A #E19F3A #E39B39 #E49838 #E69437 #E68E36 #E68935 #E68334 #E67E33 #E67832 #E67331 #E56C2F #E4652E #E35F2D #E2582B #E1512A #E04A29 #DF4328 #DE3D26 #DD3625 #DC2F24 #DB2823 +#5E1D9D #571EA3 #511EA8 #4D22AD #4B26B1 #482BB6 #462FBA #4334BE #4138C3 #403DC5 #3F43C7 #3F49C9 #3F4ECB #3F54CD #3E5ACF #3F5FD0 #4064CF #416ACF #426FCE #4274CE #4379CD #457ECB #4682C9 #4886C6 #4A8AC4 #4B8EC1 #4D93BE #4F96BB #5199B7 #539CB4 #569FB0 #58A2AC #5AA5A8 #5DA8A4 #5FAA9F #62AB9B #65AD97 #68AF92 #6BB18E #6EB389 #71B485 #75B581 #78B77D #7CB879 #7FB975 #83BA71 #87BB6D #8BBB6A #8FBC66 #93BC63 #96BD5F #9ABE5C #9EBE59 #A2BE57 #A7BE54 #ABBD52 #AFBD4F #B3BD4D #B7BD4B #BABC4A #BEBB48 #C2BA46 #C5B945 #C9B843 #CCB742 #CFB541 #D2B240 #D5B03F #D8AE3E #DBAC3D #DDA93C #DFA63B #E0A23A #E29E39 #E39B39 #E59738 #E69337 #E68D36 #E68835 #E68234 #E67D33 #E67832 #E67231 #E56B2F #E4652E #E35E2D #E2572B #E1512A #E04A29 #DF4328 #DE3C26 #DD3625 #DC2F24 #DB2823 +#5E1D9D #571EA2 #511EA8 #4D21AD #4B26B1 #482AB5 #462FBA #4333BE #4138C2 #403DC5 #3F42C7 #3F48C9 #3F4ECB #3F53CD #3E59CF #3F5ED0 #4063CF #4069CF #416ECE #4273CE #4378CD #447DCC #4681C9 #4885C7 #4989C4 #4B8DC2 #4C91BF #4E95BC #5098B9 #539BB5 #559EB1 #57A1AD #59A4A9 #5CA7A5 #5EA9A1 #61AB9D #64AD98 #67AF94 #6AB090 #6DB28B #70B487 #73B583 #77B67F #7AB77B #7EB877 #81BA72 #85BA6F #89BB6B #8DBC68 #90BC65 #94BD61 #98BD5E #9CBE5B #A0BE58 #A4BE56 #A8BD53 #ACBD51 #B0BD4E #B4BD4C #B8BC4B #BCBB49 #BFBB47 #C3BA46 #C7B944 #CAB843 #CDB642 #D0B441 #D3B240 #D6B03F #D9AE3E #DBAC3D #DDA83C #DFA53B #E0A13A #E29D39 #E49A38 #E59638 #E69237 #E68C36 #E68735 #E68234 #E67C33 #E67732 #E67130 #E56B2F #E4642E #E35D2D #E2572B #E1502A #E04929 #DF4328 #DE3C26 #DD3525 #DC2F24 #DB2823 +#5E1D9D #571EA2 #511EA8 #4D21AD #4B26B1 #492AB5 #462EB9 #4433BE #4137C2 #403CC5 #4042C7 #3F47C9 #3F4DCB #3F52CD #3E58CF #3E5DD0 #3F63CF #4068CF #416DCE #4272CE #4377CD #447CCD #4580CA #4784C8 #4988C5 #4A8CC2 #4C90C0 #4E94BD #5097BA #529AB6 #549DB2 #56A0AE #59A3AA #5BA6A7 #5DA8A3 #60AA9E #63AC9A #66AE96 #69B091 #6BB28D #6EB389 #72B485 #75B681 #79B77D #7CB879 #80B974 #83BA70 #87BB6D #8BBB6A #8EBC66 #92BC63 #96BD60 #9ABE5C #9EBE5A #A2BE57 #A6BE55 #AABD52 #AEBD50 #B2BD4D #B6BD4C #B9BC4A #BDBB48 #C1BA47 #C4B945 #C8B944 #CBB742 #CEB541 #D1B340 #D4B13F #D7AF3E #D9AD3D #DCAB3C #DEA73C #DFA43B #E1A03A #E29D39 #E49938 #E59637 #E69136 #E68B35 #E68634 #E68133 #E67C32 #E67631 #E67030 #E56A2F #E4632E #E35D2C #E2562B #E1502A #E04929 #DF4327 #DE3C26 #DD3525 #DC2F24 #DB2823 +#5E1D9D #581EA2 #511EA8 #4E21AD #4B25B1 #492AB5 #462EB9 #4433BD #4137C2 #403CC5 #4041C7 #3F47C9 #3F4CCB #3F52CC #3E57CE #3E5DD0 #3F62D0 #4067CF #416CCE #4271CE #4376CD #447BCD #457FCB #4783C8 #4887C6 #4A8BC3 #4C8FC1 #4D93BE #4F97BB #5199B7 #539CB3 #569FAF #58A2AC #5AA5A8 #5CA7A4 #5FA9A0 #62AB9C #65AD97 #68AF93 #6AB18F #6DB38A #70B486 #74B582 #77B67E #7BB77A #7EB876 #81BA72 #85BA6F #89BB6B #8CBC68 #90BC65 #94BD61 #98BD5E #9CBE5B #A0BE59 #A4BE56 #A8BE54 #ABBD51 #AFBD4F #B3BD4D #B7BD4B #BBBC49 #BEBB48 #C2BA46 #C5B945 #C9B843 #CCB742 #CFB541 #D2B340 #D5B13F #D7AF3E #DAAD3D #DDAA3C #DEA73B #E0A33B #E19F3A #E39C39 #E49838 #E69537 #E69036 #E68B35 #E68534 #E68033 #E67B32 #E67631 #E67030 #E5692F #E4632E #E35C2C #E2562B #E14F2A #E04929 #DF4227 #DE3C26 #DD3525 #DC2F24 #DB2823 +#5E1D9D #581EA2 #511EA8 #4E21AC #4B25B1 #492AB5 #462EB9 #4432BD #4237C1 #403BC5 #4041C7 #3F46C8 #3F4CCA #3F51CC #3F56CE #3E5CD0 #3F61D0 #4066CF #416BCF #4270CE #4375CD #437ACD #457ECB #4682C9 #4886C6 #4A8AC4 #4B8EC1 #4D92BF #4E96BC #5199B8 #539BB4 #559EB1 #57A1AD #59A4A9 #5BA7A5 #5EA9A1 #61AB9D #64AC99 #66AE95 #69B090 #6CB28C #6FB388 #72B584 #76B680 #79B77C #7CB878 #80B974 #83BA70 #87BB6D #8BBB6A #8EBC66 #92BC63 #96BD60 #9ABD5D #9DBE5A #A1BE58 #A5BE55 #A9BD53 #ADBD50 #B1BD4E #B5BD4C #B8BC4A #BCBB49 #BFBB47 #C3BA46 #C7B944 #CAB843 #CDB642 #D0B441 #D3B240 #D5B03F #D8AE3E #DBAC3D #DDA93C #DEA63B #E0A23A #E19F3A #E39B39 #E49838 #E69437 #E68F36 #E68A35 #E68534 #E67F33 #E67A32 #E67531 #E56F30 #E5692F #E4622E #E35C2C #E2552B #E14F2A #E04829 #DF4227 #DE3B26 #DD3525 #DC2F24 #DB2823 +#5E1D9D #581EA2 #511EA8 #4E21AC #4B25B0 #4929B5 #472EB9 #4432BD #4236C1 #403BC5 #4040C6 #3F45C8 #3F4BCA #3F50CC #3F56CE #3E5BD0 #3F60D0 #4065CF #416ACF #426FCE #4274CE #4379CD #447DCC #4681C9 #4885C7 #4989C4 #4B8DC2 #4C91BF #4E95BD #5098B9 #529BB6 #549DB2 #56A0AE #59A3AA #5BA6A7 #5DA8A3 #60AA9F #63AC9A #65AD96 #68AF92 #6BB18E #6EB38A #71B486 #74B582 #78B67E #7BB77A #7EB976 #81BA72 #85BA6F #89BB6B #8CBC68 #90BC65 #94BD62 #98BD5E #9BBE5B #9FBE59 #A3BE57 #A7BE54 #ABBD52 #AFBD4F #B2BD4D #B6BD4B #BABC4A #BDBB48 #C1BA47 #C4B945 #C8B944 #CBB742 #CEB541 #D1B440 #D3B23F #D6B03E #D9AE3E #DCAC3D #DDA83C #DFA53B #E0A13A #E29E39 #E39A39 #E59738 #E69337 #E68E36 #E68935 #E68434 #E67F33 #E67A32 #E67431 #E56E30 #E4682F #E3622D #E25B2C #E1552B #E04E2A #E04828 #DF4227 #DE3B26 #DD3525 #DC2E24 #DB2823 +#5E1D9D #581EA2 #511EA8 #4E21AC #4B25B0 #4929B4 #472DB8 #4432BD #4236C1 #403AC4 #4040C6 #3F45C8 #3F4ACA #3F50CC #3F55CE #3E5ACF #3F5FD0 #4064CF #4169CF #416ECE #4273CE #4378CD #447DCC #4680CA #4784C7 #4988C5 #4A8CC3 #4C90C0 #4D94BE #4F97BA #519AB7 #549CB3 #569FAF #58A2AC #5AA5A8 #5CA7A4 #5FA9A0 #62AB9C #64AD98 #67AF94 #6AB090 #6CB28C #6FB488 #73B584 #76B680 #79B77C #7DB878 #80B974 #83BA70 #87BB6D #8BBB6A #8EBC67 #92BC63 #96BD60 #99BD5D #9DBE5A #A1BE58 #A5BE56 #A8BD53 #ACBD51 #B0BD4F #B4BD4C #B7BC4B #BBBC49 #BEBB48 #C2BA46 #C5B945 #C9B843 #CCB742 #CFB541 #D1B340 #D4B13F #D7AF3E #DAAD3D #DCAB3C #DEA83C #DFA43B #E1A13A #E29D39 #E49A38 #E59638 #E69237 #E68D36 #E68835 #E68334 #E67E33 #E67932 #E67431 #E56E30 #E4672F #E3612D #E25B2C #E1542B #E04E2A #E04828 #DF4127 #DE3B26 #DD3525 #DC2E24 #DB2823 +#5E1D9D #581EA2 #521EA7 #4E21AC #4C25B0 #4929B4 #472DB8 #4431BC #4236C0 #403AC4 #403FC6 #3F44C8 #3F4ACA #3F4FCC #3F54CD #3E59CF #3F5ED0 #3F63CF #4068CF #416DCE #4272CE #4377CD #447CCD #4580CA #4783C8 #4887C6 #4A8BC3 #4B8FC1 #4D93BE #4F96BB #5199B8 #539CB4 #559EB1 #57A1AD #59A4A9 #5BA7A6 #5EA9A2 #61AA9E #63AC99 #66AE95 #69B091 #6BB18D #6EB389 #71B485 #75B581 #78B67E #7BB77A #7EB976 #82BA72 #85BA6F #89BB6B #8CBC68 #90BC65 #94BD62 #97BD5F #9BBE5B #9FBE59 #A3BE57 #A6BE55 #AABD52 #AEBD50 #B2BD4E #B5BD4C #B9BC4A #BCBB49 #C0BB47 #C3BA46 #C7B944 #CAB843 #CDB642 #D0B441 #D2B240 #D5B03F #D8AE3E #DAAC3D #DDAA3C #DEA73B #DFA33B #E1A03A #E29D39 #E49938 #E59637 #E69137 #E68C36 #E68735 #E68234 #E67D33 #E67832 #E67331 #E56D30 #E4672E #E3602D #E25A2C #E1542B #E04E2A #DF4728 #DF4127 #DE3B26 #DD3525 #DC2E24 #DB2823 +#5E1D9D #581EA2 #521EA7 #4E20AC #4C25B0 #4929B4 #472DB8 #4531BC #4235C0 #4039C4 #403EC6 #3F44C8 #3F49C9 #3F4ECB #3F53CD #3E59CF #3F5ED0 #3F62CF #4067CF #416CCE #4271CE #4376CD #447BCD #457FCB #4682C9 #4886C6 #498AC4 #4B8EC1 #4D92BF #4E95BD #5098B9 #529BB5 #549DB2 #56A0AE #59A3AA #5BA6A7 #5DA8A3 #60AA9F #62AB9B #65AD97 #68AF93 #6AB18F #6DB38B #70B487 #73B583 #76B67F #7AB77B #7DB878 #80B974 #83BA70 #87BB6D #8ABB6A #8EBC67 #92BC63 #95BD60 #99BD5D #9DBE5A #A0BE58 #A4BE56 #A8BD54 #ACBD51 #AFBD4F #B3BD4D #B7BD4B #BABC4A #BDBB48 #C1BA47 #C4B945 #C8B944 #CBB842 #CEB641 #D0B440 #D3B240 #D6B03F #D8AE3E #DBAC3D #DDA93C #DEA63B #E0A33A #E19F3A #E39C39 #E49838 #E69537 #E69036 #E68B35 #E68635 #E68134 #E67D33 #E67832 #E67231 #E56C2F #E4662E #E3602D #E25A2C #E1542B #E04D29 #DF4728 #DF4127 #DE3B26 #DD3425 #DC2E24 #DB2823 +#5E1D9D #581EA2 #521EA7 #4E20AC #4C24B0 #4929B4 #472DB8 #4531BC #4335C0 #4039C4 #403EC6 #3F43C7 #3F48C9 #3F4DCB #3F53CD #3E58CF #3E5DD0 #3F62D0 #4066CF #416BCE #4270CE #4375CD #4379CD #457ECC #4682C9 #4885C7 #4989C4 #4B8DC2 #4C91C0 #4E94BD #5097BA #529AB6 #549DB3 #569FAF #58A2AC #5AA5A8 #5CA7A5 #5FA9A1 #61AB9D #64AD99 #67AE95 #69B091 #6CB28D #6FB389 #72B485 #75B581 #78B77D #7BB879 #7FB976 #82BA72 #85BA6E #89BB6B #8CBB68 #90BC65 #93BD62 #97BD5F #9BBE5C #9EBE59 #A2BE57 #A6BE55 #A9BD53 #ADBD50 #B1BD4E #B4BD4C #B8BC4B #BBBC49 #BFBB48 #C2BA46 #C5B945 #C9B843 #CCB742 #CEB541 #D1B340 #D4B13F #D6AF3E #D9AD3D #DCAB3D #DDA83C #DFA53B #E0A23A #E29E39 #E39B39 #E49838 #E69437 #E68F36 #E68B35 #E68634 #E68133 #E67C33 #E67732 #E67231 #E56C2F #E4652E #E35F2D #E2592C #E1532B #E04D29 #DF4728 #DF4127 #DE3B26 #DD3425 #DC2E24 #DB2823 +#5E1D9D #581EA2 #521EA7 #4E20AC #4C24B0 #4A28B4 #472CB7 #4530BB #4335BF #4039C3 #403DC6 #3F43C7 #3F48C9 #3F4DCB #3F52CD #3E57CE #3E5CD0 #3F61D0 #4066CF #416ACF #426FCE #4274CE #4378CD #447DCC #4681CA #4784C7 #4988C5 #4A8CC3 #4C90C0 #4D93BE #4F97BB #5199B7 #539CB4 #559EB0 #57A1AD #59A4A9 #5BA6A6 #5EA8A2 #60AA9E #63AC9A #66AE96 #68AF92 #6BB18E #6DB38A #70B486 #74B583 #77B67F #7AB77B #7DB877 #80B974 #83BA70 #87BB6D #8ABB6A #8EBC67 #92BC64 #95BD61 #99BD5D #9CBE5B #A0BE58 #A4BE56 #A7BE54 #ABBD52 #AFBD4F #B2BD4D #B6BD4B #B9BC4A #BCBB49 #C0BA47 #C3BA46 #C7B944 #CAB843 #CDB642 #CFB441 #D2B340 #D4B13F #D7AF3E #DAAD3D #DCAB3C #DEA83C #DFA43B #E0A13A #E29E39 #E39A39 #E59738 #E69337 #E68F36 #E68A35 #E68534 #E68033 #E67B32 #E67631 #E67130 #E56B2F #E4652E #E35F2D #E2592C #E1532A #E04D29 #DF4728 #DF4027 #DE3A26 #DD3425 #DC2E24 #DB2823 +#5E1D9D #581EA2 #521EA7 #4E20AC #4C24AF #4A28B3 #472CB7 #4530BB #4334BF #4138C3 #403DC5 #4042C7 #3F47C9 #3F4CCB #3F51CC #3F56CE #3E5BD0 #3F60D0 #4065CF #4169CF #416ECE #4273CE #4377CD #447CCD #4580CA #4784C8 #4887C6 #4A8BC3 #4B8FC1 #4D92BF #4E96BC #5098B9 #529BB5 #549EB2 #56A0AE #59A3AB #5BA5A7 #5DA8A3 #5FA99F #62AB9C #65AD98 #67AF94 #6AB090 #6CB28C #6FB388 #72B584 #75B681 #78B77D #7CB879 #7FB975 #82BA72 #85BA6E #89BB6B #8CBB68 #90BC65 #93BD62 #97BD5F #9ABE5C #9EBE5A #A1BE57 #A5BE55 #A9BD53 #ACBD51 #B0BD4F #B4BD4C #B7BD4B #BABC49 #BEBB48 #C1BA47 #C4B945 #C8B944 #CBB842 #CDB642 #D0B441 #D3B240 #D5B03F #D8AE3E #DAAC3D #DDAA3C #DEA73B #DFA43B #E1A03A #E29D39 #E49A38 #E59638 #E69337 #E68E36 #E68935 #E68434 #E67F33 #E67B32 #E67631 #E67030 #E56A2F #E4642E #E35E2D #E2582C #E1522A #E04C29 #DF4628 #DF4027 #DE3A26 #DD3425 #DC2E24 #DB2823 +#5E1D9D #581DA2 #521EA7 #4E20AB #4C24AF #4A28B3 #472CB7 #4530BB #4334BF #4138C3 #403DC5 #4042C7 #3F47C9 #3F4CCA #3F51CC #3F56CE #3E5BD0 #3F5FD0 #4064CF #4069CF #416DCE #4272CE #4376CD #447BCD #457FCB #4683C8 #4886C6 #498AC4 #4B8EC2 #4C91BF #4E95BD #5098BA #529AB6 #549DB3 #569FAF #58A2AC #5AA5A8 #5CA7A5 #5EA9A1 #61AB9D #64AC99 #66AE95 #69B091 #6BB18D #6EB38A #71B486 #74B582 #77B67F #7AB77B #7DB877 #80B973 #83BA70 #87BB6D #8ABB6A #8EBC67 #91BC64 #95BD61 #98BD5E #9CBE5B #9FBE59 #A3BE57 #A7BE54 #AABD52 #AEBD50 #B1BD4E #B5BD4C #B8BC4A #BCBC49 #BFBB48 #C2BA46 #C5B945 #C9B843 #CCB742 #CEB541 #D1B340 #D3B23F #D6B03F #D8AE3E #DBAC3D #DDA93C #DEA63B #E0A33A #E1A03A #E29C39 #E49938 #E59638 #E69237 #E68D36 #E68835 #E68334 #E67F33 #E67A32 #E67531 #E67030 #E56A2F #E4642E #E35E2D #E2582B #E1522A #E04C29 #DF4628 #DF4027 #DE3A26 #DD3425 #DC2E24 #DB2823 +#5E1D9D #581DA2 #521EA7 #4E20AB #4C24AF #4A28B3 #482CB7 #4530BB #4334BE #4138C2 #403CC5 #4041C7 #3F46C8 #3F4BCA #3F50CC #3F55CE #3E5ACF #3F5FD0 #3F63CF #4068CF #416CCE #4271CE #4376CD #447ACD #457ECB #4682C9 #4885C7 #4989C4 #4B8DC2 #4C90C0 #4D94BE #4F97BB #5199B7 #539CB4 #559FB0 #57A1AD #59A4A9 #5BA6A6 #5DA8A2 #60AA9E #63AC9B #65AD97 #68AF93 #6AB18F #6DB28B #70B487 #73B584 #76B680 #79B77C #7CB879 #7FB975 #82BA72 #85BA6E #89BB6B #8CBB68 #90BC65 #93BC62 #96BD5F #9ABD5C #9DBE5A #A1BE58 #A5BE56 #A8BD53 #ACBD51 #AFBD4F #B3BD4D #B6BD4B #B9BC4A #BDBB48 #C0BA47 #C3BA46 #C7B944 #CAB843 #CDB742 #CFB541 #D2B340 #D4B13F #D7AF3E #D9AD3D #DCAB3D #DDA93C #DFA53B #E0A23A #E19F3A #E39C39 #E49838 #E59537 #E69136 #E68C36 #E68735 #E68334 #E67E33 #E67932 #E67531 #E56F30 #E5692F #E4632E #E35D2D #E2572B #E1512A #E04C29 #DF4628 #DF4027 #DE3A26 #DD3425 #DC2E24 #DB2823 +#5E1D9D #581DA2 #521EA7 #4E20AB #4C24AF #4A28B3 #482CB7 #462FBA #4333BE #4137C2 #403CC5 #4040C7 #3F45C8 #3F4ACA #3F4FCC #3F54CD #3E59CF #3F5ED0 #3F62CF #4067CF #416CCE #4270CE #4375CD #4379CD #447DCC #4681CA #4785C7 #4988C5 #4A8CC3 #4C8FC0 #4D93BE #4F96BC #5199B8 #539BB5 #559EB1 #57A0AE #59A3AB #5AA5A7 #5DA8A4 #5FA9A0 #62AB9C #64AD98 #67AE94 #69B091 #6CB28D #6EB389 #71B485 #74B582 #77B67E #7AB77B #7DB877 #80B973 #84BA70 #87BB6D #8ABB6A #8EBC67 #91BC64 #95BD61 #98BD5E #9BBE5B #9FBE59 #A3BE57 #A6BE55 #AABD53 #ADBD50 #B1BD4E #B4BD4C #B7BC4B #BBBC49 #BEBB48 #C1BA47 #C4B945 #C8B944 #CBB842 #CDB642 #D0B441 #D2B240 #D5B03F #D7AF3E #DAAD3D #DCAB3C #DEA83C #DFA53B #E0A13A #E29E39 #E39B39 #E49838 #E69537 #E69036 #E68B35 #E68735 #E68234 #E67D33 #E67932 #E67431 #E56E30 #E4682F #E4632E #E35D2C #E2572B #E1512A #E04B29 #DF4528 #DE4027 #DE3A26 #DD3425 #DC2E24 #DB2823 +#5E1D9D #581DA2 #531EA7 #4E20AB #4C24AF #4A27B3 #482BB6 #462FBA #4433BE #4137C2 #403BC5 #4040C6 #3F45C8 #3F4ACA #3F4FCB #3F53CD #3E58CF #3E5DD0 #3F62D0 #4066CF #416BCF #426FCE #4274CE #4378CD #447DCC #4580CA #4784C8 #4887C6 #4A8BC3 #4B8EC1 #4D92BF #4E95BD #5098B9 #529AB6 #549DB2 #569FAF #58A2AC #5AA4A8 #5CA7A5 #5EA9A1 #61AA9D #63AC9A #66AE96 #68AF92 #6BB18E #6DB38A #70B487 #73B583 #76B680 #79B77C #7CB879 #7FB975 #82BA71 #85BA6E #89BB6B #8CBB68 #8FBC65 #93BC63 #96BD60 #9ABD5D #9DBE5A #A1BE58 #A4BE56 #A8BE54 #ABBD52 #AFBD4F #B2BD4D #B5BD4C #B9BC4A #BCBB49 #BFBB47 #C2BA46 #C5B945 #C9B843 #CCB742 #CEB541 #D1B440 #D3B240 #D5B03F #D8AE3E #DAAC3D #DDAA3C #DEA73B #DFA43B #E1A13A #E29E39 #E39A39 #E59738 #E69437 #E68F36 #E68B35 #E68634 #E68134 #E67D33 #E67832 #E67331 #E56E30 #E4682F #E3622D #E35C2C #E2562B #E1512A #E04B29 #DF4528 #DE3F27 #DE3926 #DD3425 #DC2E24 #DB2823 +#5E1D9D #581DA2 #531EA7 #4E20AB #4C23AF #4A27B2 #482BB6 #462FBA #4433BE #4237C1 #403BC5 #403FC6 #3F44C8 #3F49CA #3F4ECB #3F53CD #3E58CF #3E5CD0 #3F61D0 #4065CF #416ACF #416ECE #4273CE #4377CD #447CCD #457FCB #4783C8 #4886C6 #498AC4 #4B8DC2 #4C91BF #4E94BD #4F97BA #519AB7 #539CB3 #559FB0 #57A1AD #59A4A9 #5BA6A6 #5DA8A3 #60AA9F #62AB9B #65AD97 #67AF94 #6AB090 #6CB28C #6FB388 #72B485 #75B581 #78B67E #7BB77A #7EB877 #81B973 #84BA70 #87BB6D #8ABB6A #8EBC67 #91BC64 #94BD61 #98BD5E #9BBE5B #9FBE59 #A2BE57 #A6BE55 #A9BD53 #ACBD51 #B0BD4F #B3BD4D #B7BD4B #BABC4A #BDBB48 #C0BA47 #C3BA46 #C6B944 #CAB843 #CCB742 #CFB541 #D1B340 #D4B13F #D6AF3E #D9AE3E #DBAC3D #DDA93C #DEA63B #E0A33B #E1A03A #E29D39 #E49A38 #E59738 #E69337 #E68E36 #E68A35 #E68534 #E68133 #E67C33 #E67732 #E67331 #E56D30 #E4672F #E3612D #E35C2C #E2562B #E1502A #E04B29 #DF4528 #DE3F27 #DE3926 #DD3425 #DC2E24 #DB2823 +#5E1D9D #581DA2 #531EA7 #4E1FAB #4C23AF #4A27B2 #482BB6 #462FBA #4432BD #4236C1 #403AC4 #403FC6 #3F44C8 #3F49C9 #3F4DCB #3F52CD #3E57CE #3E5CD0 #3F60D0 #4065CF #4169CF #416DCE #4272CE #4376CD #447BCD #457ECB #4682C9 #4885C7 #4989C4 #4A8CC2 #4C90C0 #4D93BE #4F96BB #5199B8 #539BB5 #559EB1 #57A0AE #58A3AB #5AA5A7 #5CA8A4 #5FA9A0 #61AB9C #64AC99 #66AE95 #69B091 #6BB18E #6EB38A #70B486 #73B583 #76B67F #79B77C #7CB878 #7FB975 #82BA71 #85BA6E #89BB6B #8CBB68 #8FBC66 #93BC63 #96BD60 #99BD5D #9DBE5A #A0BE58 #A4BE56 #A7BE54 #AABD52 #AEBD50 #B1BD4E #B5BD4C #B8BC4B #BBBC49 #BEBB48 #C1BA47 #C4B945 #C8B944 #CBB842 #CDB642 #D0B441 #D2B340 #D4B13F #D7AF3E #D9AD3D #DCAB3D #DDA93C #DFA63B #E0A23A #E19F3A #E39C39 #E49938 #E59638 #E69237 #E68E36 #E68935 #E68434 #E68033 #E67B32 #E67732 #E67231 #E56C30 #E4672E #E3612D #E25B2C #E2562B #E1502A #E04A29 #DF4528 #DE3F27 #DE3926 #DD3325 #DC2E24 #DB2823 +#5E1D9D #581DA2 #531EA6 #4F1FAB #4C23AE #4A27B2 #482BB6 #462EB9 #4432BD #4236C1 #403AC4 #403FC6 #3F43C8 #3F48C9 #3F4DCB #3F52CC #3F56CE #3E5BD0 #3F5FD0 #4064CF #4068CF #416DCE #4271CE #4375CD #437ACD #457ECC #4681C9 #4785C7 #4988C5 #4A8CC3 #4B8FC1 #4D92BE #4E96BC #5098B9 #529BB6 #549DB2 #56A0AF #58A2AC #5AA4A8 #5CA7A5 #5EA9A1 #60AA9E #63AC9A #65AD96 #68AF93 #6AB18F #6DB28B #6FB488 #72B484 #75B581 #78B67D #7BB77A #7EB876 #81B973 #84BA70 #87BB6D #8ABB6A #8EBC67 #91BC64 #94BD61 #97BD5E #9BBE5C #9EBE59 #A2BE57 #A5BE55 #A8BD53 #ACBD51 #AFBD4F #B3BD4D #B6BD4B #B9BC4A #BCBB49 #BFBB47 #C2BA46 #C5B945 #C9B843 #CBB742 #CEB641 #D0B441 #D3B240 #D5B03F #D7AE3E #DAAD3D #DCAB3C #DEA83C #DFA53B #E0A23A #E19F39 #E39C39 #E49838 #E59537 #E69137 #E68D36 #E68835 #E68434 #E67F33 #E67B32 #E67631 #E67130 #E56C2F #E4662E #E3602D #E25B2C #E2552B #E1502A #E04A29 #DF4428 #DE3F27 #DE3926 #DD3325 #DC2E24 #DB2823 +#5E1D9D #581DA2 #531EA6 #4F1FAB #4D23AE #4A27B2 #482AB6 #462EB9 #4432BD #4236C0 #4039C4 #403EC6 #3F43C7 #3F47C9 #3F4CCB #3F51CC #3F56CE #3E5ACF #3F5FD0 #3F63CF #4067CF #416CCE #4270CE #4374CD #4379CD #447DCC #4680CA #4784C8 #4887C6 #4A8BC3 #4B8EC1 #4C91BF #4E95BD #5097BA #529AB7 #539CB3 #559FB0 #57A1AD #59A4AA #5BA6A6 #5DA8A3 #60AA9F #62AB9C #64AD98 #67AE94 #69B091 #6CB28D #6EB389 #71B486 #74B582 #77B67F #7AB77C #7CB878 #7FB975 #82BA71 #85BA6E #89BB6B #8CBB69 #8FBC66 #92BC63 #96BD60 #99BD5D #9CBE5B #A0BE59 #A3BE57 #A6BE54 #AABD52 #ADBD50 #B1BD4E #B4BD4C #B7BD4B #BABC4A #BDBB48 #C0BA47 #C3BA46 #C6B944 #CAB843 #CCB742 #CFB541 #D1B340 #D3B23F #D6B03F #D8AE3E #DBAC3D #DDAA3C #DEA73B #DFA43B #E0A13A #E29E39 #E39B39 #E49838 #E69537 #E69036 #E68C36 #E68835 #E68334 #E67F33 #E67A32 #E67631 #E67130 #E56B2F #E4662E #E3602D #E25A2C #E1552B #E14F2A #E04A29 #DF4428 #DE3E27 #DE3926 #DD3325 #DC2E24 #DB2823 +#5E1D9D #591DA2 #531EA6 #4F1FAB #4D23AE #4B27B2 #482AB5 #462EB9 #4432BD #4235C0 #4039C4 #403EC6 #4042C7 #3F47C9 #3F4CCA #3F50CC #3F55CE #3E5ACF #3F5ED0 #3F62CF #4067CF #416BCE #426FCE #4274CE #4378CD #447CCD #4580CA #4783C8 #4886C6 #498AC4 #4B8DC2 #4C91C0 #4D94BE #4F97BB #5199B7 #539CB4 #559EB1 #57A0AE #58A3AB #5AA5A7 #5CA7A4 #5FA9A0 #61AB9D #63AC99 #66AE96 #68AF92 #6BB18E #6DB38B #70B487 #73B584 #75B680 #78B77D #7BB87A #7EB876 #81B973 #84BA70 #87BB6D #8ABB6A #8EBC67 #91BC64 #94BD61 #97BD5F #9ABE5C #9EBE5A #A1BE58 #A4BE56 #A8BD54 #ABBD52 #AEBD50 #B2BD4D #B5BD4C #B8BC4A #BBBC49 #BEBB48 #C1BA46 #C4B945 #C7B944 #CBB843 #CDB642 #CFB441 #D2B340 #D4B13F #D6AF3E #D9AE3E #DBAC3D #DDA93C #DEA63B #DFA33B #E1A03A #E29D39 #E39A39 #E59738 #E69437 #E69036 #E68B35 #E68735 #E68234 #E67E33 #E67A32 #E67531 #E67030 #E56B2F #E4652E #E35F2D #E25A2C #E1542B #E14F2A #E04929 #DF4428 #DE3E27 #DE3926 #DD3325 #DC2E24 #DB2823 +#5E1D9D #591DA1 #531EA6 #4F1FAB #4D23AE #4B26B2 #492AB5 #462EB9 #4431BC #4235C0 #4039C3 #403DC5 #4042C7 #3F46C9 #3F4BCA #3F50CC #3F54CD #3E59CF #3E5DD0 #3F62D0 #4066CF #416ACF #416ECE #4273CE #4377CD #447BCD #457FCB #4682C9 #4886C7 #4989C5 #4A8CC2 #4C90C0 #4D93BE #4F96BC #5098B8 #529BB5 #549DB2 #56A0AF #58A2AC #5AA4A8 #5CA7A5 #5EA8A2 #60AA9E #63AC9B #65AD97 #67AF93 #6AB090 #6CB28C #6EB389 #71B485 #74B582 #77B67F #7AB77B #7DB878 #80B974 #82BA71 #85BB6E #89BB6B #8CBB69 #8FBC66 #92BC63 #96BD60 #99BD5D #9CBE5B #9FBE59 #A3BE57 #A6BE55 #A9BD53 #ADBD51 #B0BD4F #B3BD4D #B6BD4B #B9BC4A #BCBB49 #BFBB47 #C2BA46 #C5B945 #C8B843 #CBB742 #CEB641 #D0B441 #D2B240 #D5B13F #D7AF3E #D9AD3D #DCAB3C #DDA93C #DEA63B #E0A33A #E1A03A #E29D39 #E49A38 #E59738 #E69337 #E68F36 #E68B35 #E68634 #E68234 #E67D33 #E67932 #E67531 #E66F30 #E56A2F #E4642E #E35F2D #E25A2C #E1542B #E14F2A #E04929 #DF4428 #DE3E27 #DE3926 #DD3325 #DC2E24 #DB2823 +#5E1D9D #591DA1 #531EA6 #4F1FAA #4D23AE #4B26B1 #492AB5 #472EB9 #4531BC #4335C0 #4138C3 #403DC5 #4041C7 #3F46C8 #3F4ACA #3F4FCC #3F54CD #3E58CF #3E5DD0 #3F61D0 #4065CF #4169CF #416ECE #4272CE #4376CD #447ACD #457ECB #4681C9 #4785C7 #4988C5 #4A8BC3 #4B8FC1 #4D92BF #4E95BD #5098B9 #529AB6 #549CB3 #559FB0 #57A1AD #59A4AA #5BA6A6 #5DA8A3 #5FA9A0 #62AB9C #64AD98 #66AE95 #69B091 #6BB18E #6DB38A #70B487 #73B583 #76B680 #79B77D #7BB879 #7EB976 #81B973 #84BA70 #87BB6D #8ABB6A #8DBC67 #91BC64 #94BD62 #97BD5F #9ABE5C #9DBE5A #A1BE58 #A4BE56 #A7BE54 #ABBD52 #AEBD50 #B1BD4E #B4BD4C #B7BD4B #BABC49 #BDBB48 #C0BA47 #C3BA46 #C6B944 #C9B843 #CCB742 #CEB541 #D1B340 #D3B240 #D5B03F #D8AE3E #DAAD3D #DCAB3C #DEA83C #DFA53B #E0A23A #E19F3A #E39C39 #E49938 #E59638 #E69337 #E68E36 #E68A35 #E68534 #E68134 #E67D33 #E67832 #E67431 #E56F30 #E5692F #E4642E #E35F2D #E2592C #E1542B #E04E2A #E04929 #DF4328 #DE3E27 #DE3826 #DD3325 #DC2E24 #DB2823 +#5E1D9D #591DA1 #531EA6 #4F1FAA #4D22AE #4B26B1 #492AB5 #472DB8 #4531BC #4335BF #4138C3 #403CC5 #4041C7 #3F45C8 #3F4ACA #3F4ECB #3F53CD #3E58CF #3E5CD0 #3F60D0 #4064CF #4069CF #416DCE #4271CE #4375CD #4379CD #447DCC #4681CA #4784C8 #4887C6 #4A8BC3 #4B8EC1 #4C91BF #4E94BD #4F97BA #5199B7 #539CB4 #559EB1 #57A0AE #58A3AB #5AA5A7 #5CA7A4 #5EA9A1 #61AA9D #63AC9A #65AE96 #68AF93 #6AB18F #6CB28C #6FB388 #72B485 #74B582 #77B67E #7AB77B #7DB878 #80B974 #82BA71 #86BB6E #89BB6B #8CBB69 #8FBC66 #92BC63 #95BD60 #98BD5E #9CBE5B #9FBE59 #A2BE57 #A5BE55 #A9BD53 #ACBD51 #AFBD4F #B2BD4D #B5BD4C #B8BC4A #BBBC49 #BEBB48 #C1BA46 #C4B945 #C7B944 #CAB843 #CDB642 #CFB541 #D1B340 #D4B13F #D6B03F #D8AE3E #DBAC3D #DDAA3C #DEA73B #DFA43B #E0A13A #E29E39 #E39B39 #E49938 #E59637 #E69237 #E68D36 #E68935 #E68534 #E68033 #E67C33 #E67832 #E67431 #E56E30 #E5692F #E4632E #E35E2D #E2592C #E1532B #E04E2A #E04929 #DF4328 #DE3E27 #DE3826 #DD3325 #DC2D24 #DB2823 +#5E1D9D #591DA1 #531EA6 #4F1FAA #4D22AE #4B26B1 #492AB5 #472DB8 #4531BC #4334BF #4138C3 #403CC5 #4040C7 #3F45C8 #3F49CA #3F4ECB #3F52CD #3E57CE #3E5BD0 #3F60D0 #4064CF #4068CF #416CCE #4270CE #4374CD #4379CD #447DCC #4580CA #4783C8 #4886C6 #498AC4 #4B8DC2 #4C90C0 #4D93BE #4F96BB #5199B8 #529BB5 #549DB2 #56A0AF #58A2AC #5AA4A9 #5BA7A5 #5EA8A2 #60AA9F #62AB9B #65AD98 #67AE94 #69B091 #6BB28D #6EB38A #71B486 #73B583 #76B680 #79B77C #7CB879 #7EB976 #81BA73 #84BA6F #87BB6D #8ABB6A #8DBC67 #90BC65 #94BD62 #97BD5F #9ABD5C #9DBE5A #A0BE58 #A4BE56 #A7BE54 #AABD52 #ADBD50 #B0BD4E #B4BD4C #B7BD4B #BABC4A #BDBB49 #C0BB47 #C2BA46 #C5B945 #C8B843 #CBB742 #CDB642 #D0B441 #D2B240 #D4B13F #D7AF3E #D9AD3D #DBAC3D #DDA93C #DEA73B #DFA43B #E1A13A #E29E39 #E39B39 #E49838 #E69537 #E69137 #E68D36 #E68835 #E68434 #E68033 #E67C32 #E67732 #E67331 #E56E30 #E4682F #E4632E #E35E2D #E2582C #E1532B #E04E29 #E04828 #DF4328 #DE3E27 #DE3826 #DD3325 #DC2D24 #DB2823 +#5E1D9D #591DA1 #541EA6 #4F1FAA #4D22AE #4B26B1 #4929B4 #472DB8 #4530BB #4334BF #4137C2 #403BC5 #4040C6 #3F44C8 #3F49C9 #3F4DCB #3F52CD #3F56CE #3E5BD0 #3F5FD0 #3F63CF #4067CF #416BCE #426FCE #4274CE #4378CD #447CCD #457FCB #4682C9 #4886C7 #4989C5 #4A8CC2 #4C8FC0 #4D93BE #4E96BC #5098B9 #529AB6 #549DB3 #559FB0 #57A1AD #59A4AA #5BA6A7 #5DA8A3 #5FA9A0 #61AB9C #64AC99 #66AE95 #68AF92 #6AB18F #6DB28B #6FB488 #72B484 #75B581 #78B67E #7AB77B #7DB877 #80B974 #83BA71 #86BB6E #89BB6B #8CBB69 #8FBC66 #92BC63 #95BD61 #98BD5E #9BBE5B #9EBE59 #A2BE57 #A5BE55 #A8BD53 #ABBD51 #AEBD50 #B2BD4E #B5BD4C #B8BC4B #BBBC49 #BEBB48 #C1BA47 #C3BA46 #C6B944 #C9B843 #CCB742 #CEB541 #D0B440 #D3B240 #D5B03F #D7AF3E #DAAD3D #DCAB3C #DDA93C #DEA63B #E0A33A #E1A03A #E29D39 #E39A39 #E59738 #E69437 #E69036 #E68C36 #E68835 #E68334 #E67F33 #E67B32 #E67732 #E67231 #E56D30 #E4682F #E4622E #E35D2D #E2582B #E1532A #E04D29 #E04828 #DF4328 #DE3D27 #DE3826 #DD3325 #DC2D24 #DB2823 +#5E1D9D #591DA1 #541EA6 #4F1FAA #4D22AD #4B26B1 #4929B4 #472DB8 #4530BB #4334BF #4137C2 #403BC5 #403FC6 #3F44C8 #3F48C9 #3F4DCB #3F51CC #3F56CE #3E5ACF #3F5ED0 #3F62CF #4066CF #416BCF #416FCE #4273CE #4377CD #447BCD #457ECB #4682C9 #4785C7 #4988C5 #4A8BC3 #4B8EC1 #4D92BF #4E95BD #5097BA #519AB7 #539CB4 #559EB1 #57A0AE #58A3AB #5AA5A8 #5CA7A5 #5EA9A1 #61AA9E #63AC9A #65AD97 #67AF93 #6AB090 #6CB28D #6EB389 #71B486 #74B583 #76B67F #79B77C #7CB879 #7FB976 #81BA72 #84BA6F #87BB6D #8ABB6A #8DBC67 #90BC65 #93BD62 #97BD5F #9ABD5D #9DBE5A #A0BE58 #A3BE57 #A6BE55 #A9BD53 #ADBD51 #B0BD4F #B3BD4D #B6BD4B #B9BC4A #BCBB49 #BFBB48 #C2BA46 #C4B945 #C7B944 #CAB843 #CDB642 #CFB541 #D1B340 #D3B23F #D6B03F #D8AE3E #DAAD3D #DCAB3C #DDA83C #DFA53B #E0A23A #E19F3A #E29D39 #E49A38 #E59738 #E69437 #E68F36 #E68B35 #E68735 #E68334 #E67F33 #E67A32 #E67631 #E67231 #E56C30 #E4672E #E3622D #E35D2C #E2572B #E1522A #E04D29 #E04828 #DF4227 #DE3D27 #DE3826 #DD3325 #DC2D24 #DB2823 +#5E1D9D #591DA1 #541EA6 #4F1FAA #4D22AD #4B25B1 #4929B4 #472CB7 #4530BB #4333BE #4137C2 #403BC5 #403FC6 #3F43C8 #3F48C9 #3F4CCB #3F51CC #3F55CE #3E59CF #3F5ED0 #3F62D0 #4066CF #416ACF #416ECE #4272CE #4376CD #437ACD #447ECC #4681CA #4784C8 #4887C6 #4A8AC4 #4B8EC2 #4C91C0 #4D94BD #4F97BB #5199B8 #539BB5 #549DB2 #56A0AF #58A2AC #5AA4A9 #5BA7A6 #5DA8A2 #60AA9F #62AB9C #64AD98 #66AE95 #69B091 #6BB18E #6DB38A #70B487 #72B584 #75B681 #78B67E #7BB77A #7DB877 #80B974 #83BA71 #86BB6E #89BB6B #8CBB69 #8FBC66 #92BC63 #95BD61 #98BD5E #9BBE5B #9EBE5A #A1BE58 #A4BE56 #A8BE54 #ABBD52 #AEBD50 #B1BD4E #B4BD4C #B7BD4B #BABC4A #BDBB48 #C0BB47 #C3BA46 #C5B945 #C8B843 #CBB842 #CDB642 #D0B441 #D2B340 #D4B13F #D6AF3E #D8AE3E #DBAC3D #DDAA3C #DEA73B #DFA43B #E0A23A #E19F3A #E39C39 #E49938 #E59638 #E69337 #E68F36 #E68B35 #E68635 #E68234 #E67E33 #E67A32 #E67631 #E67130 #E56C2F #E4672E #E3612D #E35C2C #E2572B #E1522A #E04D29 #DF4728 #DF4227 #DE3D27 #DD3826 #DD3325 #DC2D24 #DB2823 +#5E1D9D #591DA1 #541EA6 #4F1EAA #4D22AD #4B25B1 #4929B4 #472CB7 #4530BB #4333BE #4237C1 #403AC4 #403FC6 #3F43C7 #3F47C9 #3F4CCA #3F50CC #3F54CD #3E59CF #3E5DD0 #3F61D0 #4065CF #4169CF #416DCE #4271CE #4375CD #4379CD #447DCC #4580CA #4783C8 #4886C6 #498AC4 #4B8DC2 #4C90C0 #4D93BE #4F96BC #5098B9 #529AB6 #549DB3 #569FB0 #57A1AD #59A3AA #5BA6A7 #5DA8A4 #5FA9A0 #61AB9D #63AC99 #66AE96 #68AF93 #6AB18F #6CB28C #6FB389 #71B485 #74B582 #77B67F #79B77C #7CB879 #7FB975 #81BA72 #84BA6F #87BB6D #8ABB6A #8DBC67 #90BC65 #93BD62 #96BD60 #99BD5D #9CBE5B #9FBE59 #A3BE57 #A6BE55 #A9BD53 #ACBD51 #AFBD4F #B2BD4D #B5BD4C #B8BC4A #BBBC49 #BEBB48 #C1BA47 #C4BA46 #C6B944 #C9B843 #CCB742 #CEB541 #D0B441 #D2B240 #D5B13F #D7AF3E #D9AD3D #DBAC3D #DDA93C #DEA73B #DFA43B #E0A13A #E29E39 #E39B39 #E49938 #E59637 #E69237 #E68E36 #E68A35 #E68634 #E68234 #E67D33 #E67932 #E67531 #E67030 #E56B2F #E4662E #E3612D #E35C2C #E2572B #E1522A #E04C29 #DF4728 #DF4227 #DE3D26 #DD3826 #DD3225 #DC2D24 #DB2823 +#5E1D9D #591DA1 #541EA6 #4F1EAA #4D22AD #4B25B0 #4929B4 #472CB7 #462FBA #4433BE #4236C1 #403AC4 #403EC6 #3F42C7 #3F47C9 #3F4BCA #3F4FCC #3F54CD #3E58CF #3E5CD0 #3F60D0 #4064CF #4068CF #416CCE #4270CE #4274CD #4378CD #447CCD #457FCB #4682C9 #4886C7 #4989C5 #4A8CC3 #4B8FC1 #4D92BF #4E95BD #5098BA #519AB7 #539CB4 #559EB1 #57A0AE #58A3AB #5AA5A8 #5CA7A5 #5EA9A1 #60AA9E #62AC9B #65AD97 #67AF94 #69B091 #6BB18D #6EB38A #70B487 #73B584 #75B680 #78B67D #7BB77A #7DB877 #80B974 #83BA71 #86BB6E #89BB6B #8CBB69 #8FBC66 #92BC64 #95BD61 #98BD5E #9BBE5C #9EBE5A #A1BE58 #A4BE56 #A7BE54 #AABD52 #ADBD50 #B0BD4E #B3BD4D #B6BD4B #B9BC4A #BCBB49 #BFBB48 #C2BA46 #C4B945 #C7B944 #CAB843 #CCB742 #CFB541 #D1B340 #D3B240 #D5B03F #D7AF3E #DAAD3D #DCAB3C #DDA93C #DEA63B #E0A33B #E1A03A #E29E39 #E39B39 #E49838 #E69537 #E69137 #E68D36 #E68935 #E68534 #E68133 #E67D33 #E67932 #E67531 #E67030 #E56B2F #E4662E #E3612D #E25B2C #E2562B #E1512A #E04C29 #DF4728 #DF4227 #DE3D26 #DD3726 #DD3225 #DC2D24 #DB2823 +#5E1D9D #591DA1 #541EA5 #4F1EAA #4D22AD #4B25B0 #4928B4 #482CB7 #462FBA #4433BE #4236C1 #4039C4 #403EC6 #4042C7 #3F46C9 #3F4BCA #3F4FCC #3F53CD #3E57CE #3E5CD0 #3F60D0 #4064CF #4068CF #416CCE #426FCE #4273CE #4377CD #447BCD #457FCB #4682C9 #4785C7 #4988C5 #4A8BC3 #4B8EC1 #4C91BF #4E94BD #4F97BA #5199B8 #539BB5 #549EB2 #56A0AF #58A2AC #5AA4A9 #5BA6A6 #5DA8A3 #5FAA9F #62AB9C #64AC99 #66AE95 #68AF92 #6AB18F #6DB28B #6FB388 #72B485 #74B582 #77B67F #7AB77C #7CB878 #7FB975 #81BA72 #84BA6F #87BB6D #8ABB6A #8DBC67 #90BC65 #93BC62 #96BD60 #99BD5D #9CBE5B #9FBE59 #A2BE57 #A5BE55 #A8BD53 #ABBD51 #AEBD50 #B2BD4E #B5BD4C #B7BD4B #BABC4A #BDBB48 #C0BA47 #C3BA46 #C5B945 #C8B844 #CBB842 #CDB642 #CFB441 #D1B340 #D4B13F #D6B03F #D8AE3E #DAAD3D #DCAB3C #DDA83C #DFA53B #E0A33A #E1A03A #E29D39 #E39A38 #E59738 #E69537 #E69136 #E68D36 #E68935 #E68434 #E68033 #E67C33 #E67832 #E67431 #E66F30 #E56A2F #E4652E #E3602D #E25B2C #E2562B #E1512A #E04C29 #DF4728 #DF4227 #DE3C26 #DD3726 #DD3225 #DC2D24 #DB2823 +#5E1D9D #591DA1 #541EA5 #4F1EAA #4D22AD #4B25B0 #4A28B3 #482CB7 #462FBA #4432BD #4236C1 #4039C4 #403DC5 #4042C7 #3F46C8 #3F4ACA #3F4ECB #3F53CD #3F57CE #3E5BD0 #3F5FD0 #3F63CF #4067CF #416BCF #426FCE #4273CE #4377CD #447ACD #457ECB #4681CA #4784C8 #4887C6 #4A8AC4 #4B8DC2 #4C90C0 #4D94BE #4F96BB #5098B8 #529BB5 #549DB3 #569FB0 #57A1AD #59A3AA #5BA6A7 #5DA8A4 #5FA9A0 #61AA9D #63AC9A #65AD97 #67AF93 #6AB090 #6CB28D #6EB389 #71B486 #73B583 #76B680 #78B77D #7BB77A #7EB877 #80B974 #83BA71 #86BB6E #89BB6B #8CBB69 #8FBC66 #92BC64 #94BD61 #97BD5F #9ABE5C #9DBE5A #A0BE58 #A3BE56 #A7BE54 #AABD53 #ADBD51 #B0BD4F #B3BD4D #B6BD4C #B8BC4A #BBBC49 #BEBB48 #C1BA47 #C4BA46 #C6B944 #C9B843 #CCB742 #CEB641 #D0B441 #D2B240 #D4B13F #D6AF3E #D9AE3E #DBAC3D #DDAA3C #DEA73B #DFA53B #E0A23A #E19F3A #E29C39 #E49A38 #E59738 #E69437 #E69036 #E68C36 #E68835 #E68434 #E68033 #E67C32 #E67832 #E67431 #E56F30 #E56A2F #E4652E #E3602D #E25B2C #E2562B #E1512A #E04C29 #DF4628 #DF4127 #DE3C26 #DD3726 #DD3225 #DC2D24 #DB2823 +#5E1D9D #591DA1 #541EA5 #4F1EAA #4D21AD #4C25B0 #4A28B3 #482BB7 #462FBA #4432BD #4236C0 #4039C4 #403DC5 #4041C7 #3F45C8 #3F4ACA #3F4ECB #3F52CD #3F56CE #3E5AD0 #3F5ED0 #3F62CF #4066CF #416ACF #416ECE #4272CE #4376CD #437ACD #447DCC #4680CA #4783C8 #4886C6 #4989C4 #4A8DC2 #4C90C0 #4D93BE #4E96BC #5098B9 #529AB6 #539CB3 #559EB1 #57A1AE #58A3AB #5AA5A8 #5CA7A5 #5EA9A2 #60AA9E #62AB9B #64AD98 #67AE95 #69B091 #6BB18E #6DB38B #6FB488 #72B485 #75B581 #77B67E #7AB77B #7CB878 #7FB975 #82BA72 #84BA6F #87BB6D #8ABB6A #8DBC68 #90BC65 #93BC62 #96BD60 #99BD5D #9CBE5B #9FBE59 #A2BE57 #A5BE55 #A8BD54 #ABBD52 #AEBD50 #B1BD4E #B4BD4C #B7BD4B #B9BC4A #BCBB49 #BFBB48 #C2BA46 #C5B945 #C7B944 #CAB843 #CCB742 #CEB541 #D1B440 #D3B240 #D5B03F #D7AF3E #D9AD3D #DBAC3D #DDA93C #DEA73B #DFA43B #E0A13A #E29F39 #E39C39 #E49938 #E59638 #E69337 #E68F36 #E68B35 #E68735 #E68334 #E67F33 #E67B32 #E67732 #E67331 #E56E30 #E5692F #E4642E #E35F2D #E25A2C #E2552B #E1502A #E04B29 #DF4628 #DF4127 #DE3C26 #DD3725 #DD3225 #DC2D24 #DB2823 +#5E1D9D #591DA1 #541EA5 #4F1EA9 #4D21AD #4C25B0 #4A28B3 #482BB6 #462FBA #4432BD #4235C0 #4039C3 #403DC5 #4041C7 #3F45C8 #3F49CA #3F4DCB #3F51CC #3F56CE #3E5ACF #3F5ED0 #3F62D0 #4066CF #4169CF #416DCE #4271CE #4375CD #4379CD #447DCC #4580CA #4683C8 #4886C7 #4989C5 #4A8CC3 #4B8FC1 #4D92BF #4E95BD #4F97BA #5199B7 #539BB4 #549EB1 #56A0AF #58A2AC #5AA4A9 #5BA6A6 #5DA8A3 #5FA9A0 #61AB9C #64AC99 #66AE96 #68AF93 #6AB18F #6CB28C #6EB389 #71B486 #73B583 #76B680 #79B77D #7BB87A #7EB877 #80B973 #83BA70 #86BB6E #89BB6B #8CBB69 #8EBC66 #91BC64 #94BD61 #97BD5F #9ABE5C #9DBE5A #A0BE58 #A3BE57 #A6BE55 #A9BD53 #ACBD51 #AFBD4F #B2BD4D #B5BD4C #B8BC4B #BABC49 #BDBB48 #C0BA47 #C3BA46 #C5B945 #C8B844 #CBB842 #CDB642 #CFB541 #D1B340 #D3B23F #D5B03F #D8AE3E #DAAD3D #DCAB3C #DDA93C #DEA63B #DFA33B #E1A13A #E29E39 #E39B39 #E49938 #E59638 #E69237 #E68F36 #E68B35 #E68735 #E68334 #E67F33 #E67B32 #E67732 #E67331 #E56E30 #E5692F #E4642E #E35F2D #E25A2C #E1552B #E1502A #E04B29 #DF4628 #DF4127 #DE3C26 #DD3725 #DD3225 #DC2D24 #DB2823 +#5E1D9D #591DA1 #541EA5 #4F1EA9 #4D21AD #4C25B0 #4A28B3 #482BB6 #462EB9 #4432BD #4235C0 #4138C3 #403CC5 #4040C6 #3F44C8 #3F49C9 #3F4DCB #3F51CC #3F55CE #3E59CF #3E5DD0 #3F61D0 #4065CF #4069CF #416DCE #4270CE #4274CE #4378CD #447CCD #457FCB #4682C9 #4785C7 #4988C5 #4A8BC3 #4B8EC1 #4C91BF #4D94BD #4F97BB #5199B8 #529BB5 #549DB2 #569FB0 #57A1AD #59A3AA #5BA6A7 #5CA8A4 #5EA9A1 #61AA9E #63AC9A #65AD97 #67AF94 #69B091 #6BB18D #6DB38A #70B487 #72B584 #75B581 #77B67E #7AB77B #7DB878 #7FB975 #82BA72 #84BA6F #87BB6D #8ABB6A #8DBC68 #90BC65 #93BC63 #96BD60 #99BD5E #9BBE5B #9EBE59 #A1BE58 #A4BE56 #A7BE54 #AABD52 #ADBD50 #B0BD4E #B3BD4D #B6BD4B #B9BC4A #BBBC49 #BEBB48 #C1BA47 #C4BA46 #C6B944 #C9B843 #CCB742 #CEB641 #D0B441 #D2B340 #D4B13F #D6B03E #D8AE3E #DAAC3D #DCAB3C #DDA83C #DFA53B #E0A33A #E1A03A #E29D39 #E39B39 #E49838 #E59537 #E69237 #E68E36 #E68A35 #E68634 #E68234 #E67E33 #E67A32 #E67631 #E67231 #E56D30 #E4682F #E4632E #E35E2D #E2592C #E1542B #E1502A #E04B29 #DF4628 #DF4127 #DE3C26 #DD3725 #DD3225 #DC2D24 #DB2823 +#5E1D9D #591DA1 #541EA5 #4F1EA9 #4E21AD #4C24B0 #4A28B3 #482BB6 #462EB9 #4431BC #4335C0 #4138C3 #403CC5 #4040C6 #3F44C8 #3F48C9 #3F4CCB #3F50CC #3F54CD #3E59CF #3E5DD0 #3F60D0 #4064CF #4068CF #416CCE #4270CE #4273CE #4377CD #447BCD #457ECB #4681C9 #4784C7 #4887C6 #4A8AC4 #4B8DC2 #4C90C0 #4D93BE #4E96BC #5098B9 #529AB6 #539CB3 #559EB0 #57A1AE #58A3AB #5AA5A8 #5CA7A5 #5EA8A2 #60AA9F #62AB9C #64AD98 #66AE95 #68AF92 #6AB18F #6CB28C #6FB388 #71B485 #74B582 #76B67F #79B77C #7BB879 #7EB876 #80B973 #83BA70 #86BB6E #89BB6B #8CBB69 #8EBC66 #91BC64 #94BD61 #97BD5F #9ABD5C #9DBE5A #A0BE59 #A3BE57 #A6BE55 #A9BD53 #ABBD51 #AEBD50 #B1BD4E #B4BD4C #B7BD4B #BABC4A #BCBB49 #BFBB47 #C2BA46 #C5B945 #C7B944 #CAB843 #CCB742 #CEB541 #D0B440 #D2B240 #D5B13F #D7AF3E #D9AE3E #DBAC3D #DDAA3C #DEA73C #DFA53B #E0A23A #E19F3A #E29D39 #E39A38 #E59838 #E69537 #E69137 #E68D36 #E68935 #E68534 #E68134 #E67E33 #E67A32 #E67631 #E67130 #E56C30 #E4682F #E4632E #E35E2D #E2592C #E1542B #E14F2A #E04A29 #DF4528 #DF4127 #DE3C26 #DD3725 #DD3225 #DC2D24 #DB2823 +#5E1D9D #591DA1 #541EA5 #501EA9 #4E21AC #4C24B0 #4A28B3 #482BB6 #462EB9 #4531BC #4334BF #4138C2 #403BC5 #403FC6 #3F44C8 #3F48C9 #3F4CCA #3F50CC #3F54CD #3E58CF #3E5CD0 #3F60D0 #4064CF #4067CF #416BCE #426FCE #4273CE #4376CD #447ACD #447ECC #4681CA #4783C8 #4886C6 #4989C4 #4A8CC2 #4C8FC0 #4D92BF #4E95BD #5097BA #519AB7 #539CB4 #559EB1 #56A0AF #58A2AC #59A4A9 #5BA6A6 #5DA8A3 #5FA9A0 #61AB9D #63AC9A #65AD96 #67AF93 #69B090 #6CB28D #6EB38A #70B487 #73B584 #75B681 #78B67E #7AB77B #7DB878 #7FB975 #82BA72 #84BA6F #87BB6D #8ABB6A #8DBC68 #90BC65 #93BC63 #95BD60 #98BD5E #9BBE5B #9EBE5A #A1BE58 #A4BE56 #A7BE54 #AABD52 #ADBD51 #B0BD4F #B3BD4D #B5BD4C #B8BC4A #BBBC49 #BDBB48 #C0BA47 #C3BA46 #C5B945 #C8B844 #CBB842 #CDB642 #CFB541 #D1B340 #D3B240 #D5B03F #D7AF3E #D9AD3D #DBAC3D #DDA93C #DEA73B #DFA43B #E0A23A #E19F3A #E29C39 #E49A38 #E59738 #E69437 #E69036 #E68C36 #E68935 #E68534 #E68133 #E67D33 #E67932 #E67531 #E67130 #E56C2F #E4672E #E4622E #E35D2D #E2592C #E1542B #E14F2A #E04A29 #DF4528 #DF4027 #DE3C26 #DD3725 #DD3225 #DC2D24 #DB2823 +#5E1D9D #591DA1 #541EA5 #501EA9 #4E21AC #4C24AF #4A27B3 #482BB6 #462EB9 #4531BC #4334BF #4137C2 #403BC5 #403FC6 #3F43C7 #3F47C9 #3F4BCA #3F4FCC #3F53CD #3E57CE #3E5BD0 #3F5FD0 #3F63CF #4067CF #416ACF #416ECE #4272CE #4376CD #4379CD #447DCC #4580CA #4783C8 #4886C7 #4989C5 #4A8CC3 #4B8FC1 #4C92BF #4E94BD #4F97BB #5199B8 #529BB5 #549DB2 #569FAF #57A1AD #59A3AA #5BA5A7 #5CA7A4 #5EA9A1 #60AA9E #62AC9B #65AD98 #67AE94 #69B091 #6BB18E #6DB28B #6FB388 #72B485 #74B582 #77B67F #79B77C #7CB879 #7EB876 #81B973 #83BA70 #86BB6E #89BB6B #8BBB69 #8EBC66 #91BC64 #94BD62 #97BD5F #9ABD5D #9CBE5B #9FBE59 #A2BE57 #A5BE55 #A8BD53 #ABBD52 #AEBD50 #B1BD4E #B4BD4C #B6BD4B #B9BC4A #BCBB49 #BEBB48 #C1BA47 #C4BA45 #C6B944 #C9B843 #CBB742 #CDB642 #D0B441 #D2B340 #D4B13F #D6B03F #D8AE3E #DAAD3D #DCAB3C #DDA93C #DEA63B #DFA43B #E0A13A #E29E39 #E39C39 #E49938 #E59638 #E69437 #E69036 #E68C36 #E68835 #E68434 #E68033 #E67C33 #E67932 #E67531 #E67030 #E56B2F #E4672E #E3622D #E35D2D #E2582C #E1532B #E14F2A #E04A29 #DF4528 #DF4027 #DE3B26 #DD3725 #DD3225 #DC2D24 #DB2823 +#5E1D9D #591DA1 #551EA5 #501EA9 #4E21AC #4C24AF #4A27B2 #482AB6 #472EB9 #4531BC #4334BF #4137C2 #403BC5 #403FC6 #3F43C7 #3F47C9 #3F4BCA #3F4FCB #3F53CD #3F57CE #3E5BD0 #3F5FD0 #3F62CF #4066CF #416ACF #416DCE #4271CE #4375CD #4379CD #447CCD #457FCB #4682C9 #4785C7 #4988C5 #4A8BC3 #4B8EC1 #4C91C0 #4D94BE #4F96BB #5098B9 #529AB6 #549CB3 #559FB0 #57A1AE #58A3AB #5AA5A8 #5CA7A5 #5EA8A2 #60AA9F #62AB9C #64AC99 #66AE96 #68AF93 #6AB08F #6CB28C #6EB389 #71B486 #73B583 #75B680 #78B67D #7AB77A #7DB878 #7FB975 #82BA72 #85BA6F #87BB6D #8ABB6A #8DBC68 #90BC65 #92BC63 #95BD60 #98BD5E #9BBE5C #9EBE5A #A1BE58 #A3BE56 #A6BE54 #A9BD53 #ACBD51 #AFBD4F #B2BD4D #B5BD4C #B7BD4B #BABC4A #BDBB49 #BFBB47 #C2BA46 #C5B945 #C7B944 #CAB843 #CCB742 #CEB541 #D0B441 #D2B240 #D4B13F #D6AF3E #D8AE3E #DAAC3D #DCAB3C #DDA83C #DFA63B #E0A33A #E1A03A #E29E39 #E39B39 #E49938 #E59638 #E69337 #E68F36 #E68B35 #E68735 #E68434 #E68033 #E67C33 #E67832 #E67431 #E67030 #E56B2F #E4662E #E3612D #E35D2C #E2582B #E1532B #E04E2A #E04A29 #DF4528 #DF4027 #DE3B26 #DD3625 #DD3225 #DC2D24 #DB2823 +#5E1D9D #591DA1 #551EA5 #501EA9 #4E21AC #4C24AF #4A27B2 #482AB5 #472DB8 #4531BB #4334BF #4137C2 #403AC4 #403EC6 #4042C7 #3F46C9 #3F4ACA #3F4ECB #3F52CD #3F56CE #3E5ACF #3F5ED0 #3F62D0 #4065CF #4169CF #416DCE #4270CE #4274CE #4378CD #447BCD #457ECB #4681C9 #4784C7 #4887C6 #498AC4 #4B8DC2 #4C90C0 #4D93BE #4E96BC #5098B9 #519AB7 #539CB4 #559EB1 #56A0AE #58A2AC #59A4A9 #5BA6A6 #5DA8A3 #5FA9A0 #61AB9D #63AC9A #65AD97 #67AF94 #69B091 #6BB18E #6DB38A #6FB488 #72B485 #74B582 #77B67F #79B77C #7CB879 #7EB976 #81B973 #83BA70 #86BB6E #89BB6B #8BBB69 #8EBC67 #91BC64 #94BD62 #97BD5F #99BD5D #9CBE5B #9FBE59 #A2BE57 #A5BE56 #A8BE54 #AABD52 #ADBD50 #B0BD4F #B3BD4D #B6BD4B #B8BC4A #BBBC49 #BEBB48 #C0BA47 #C3BA46 #C5B945 #C8B944 #CBB842 #CDB642 #CFB541 #D1B340 #D3B240 #D5B03F #D7AF3E #D9AD3E #DBAC3D #DDAA3C #DEA83C #DFA53B #E0A23A #E1A03A #E29D39 #E39B39 #E49838 #E59537 #E69237 #E68E36 #E68B35 #E68735 #E68334 #E67F33 #E67B32 #E67832 #E67431 #E66F30 #E56A2F #E4662E #E3612D #E35C2C #E2582B #E1532B #E04E2A #E04929 #DF4528 #DF4027 #DE3B26 #DD3625 #DD3225 #DC2D24 #DB2823 +#5E1D9D #591DA1 #551EA5 #501EA9 #4E21AC #4C24AF #4A27B2 #492AB5 #472DB8 #4530BB #4334BE #4237C1 #403AC4 #403EC6 #4042C7 #3F46C8 #3F4ACA #3F4ECB #3F52CC #3F56CE #3E5ACF #3E5DD0 #3F61D0 #4065CF #4068CF #416CCE #4270CE #4273CE #4377CD #447BCD #457ECC #4681CA #4784C8 #4886C6 #4989C4 #4A8CC2 #4C8FC1 #4D92BF #4E95BD #4F97BA #5199B8 #539BB5 #549DB2 #569FAF #57A1AD #59A3AA #5AA5A7 #5CA7A4 #5EA9A1 #60AA9E #62AB9B #64AD98 #66AE95 #68AF92 #6AB18F #6CB28C #6EB389 #71B486 #73B583 #76B680 #78B77D #7BB77A #7DB877 #80B974 #82BA72 #85BA6F #87BB6D #8ABB6A #8DBC68 #90BC65 #92BC63 #95BD61 #98BD5E #9BBE5C #9DBE5A #A0BE58 #A3BE57 #A6BE55 #A9BD53 #ACBD51 #AEBD50 #B1BD4E #B4BD4C #B7BD4B #B9BC4A #BCBB49 #BEBB48 #C1BA47 #C4BA45 #C6B944 #C9B843 #CBB742 #CDB642 #CFB441 #D1B340 #D3B23F #D5B03F #D7AF3E #D9AD3D #DBAC3D #DDAA3C #DEA73B #DFA43B #E0A23A #E19F3A #E29D39 #E39A38 #E59838 #E69537 #E69137 #E68E36 #E68A35 #E68634 #E68234 #E67F33 #E67B32 #E67732 #E67331 #E56F30 #E56A2F #E4652E #E3612D #E35C2C #E2572B #E1522A #E04E2A #E04929 #DF4428 #DE4027 #DE3B26 #DD3625 #DD3125 #DC2D24 #DB2823 +#5E1D9D #591DA1 #551EA5 #501EA9 #4E21AC #4C24AF #4A27B2 #492AB5 #472DB8 #4530BB #4333BE #4236C1 #403AC4 #403DC6 #4041C7 #3F45C8 #3F49CA #3F4DCB #3F51CC #3F55CE #3E59CF #3E5DD0 #3F60D0 #4064CF #4068CF #416BCE #426FCE #4273CE #4376CD #437ACD #447DCC #4580CA #4783C8 #4886C7 #4989C5 #4A8BC3 #4B8EC1 #4C91BF #4E94BD #4F96BB #5098B8 #529BB6 #549DB3 #559FB0 #57A1AD #58A3AB #5AA5A8 #5CA7A5 #5DA8A2 #5FAA9F #61AB9C #63AC99 #65AE96 #67AF93 #69B090 #6BB28D #6DB38A #70B487 #72B584 #75B581 #77B67E #7AB77C #7CB879 #7EB976 #81B973 #83BA70 #86BB6E #89BB6B #8BBB69 #8EBC67 #91BC64 #94BD62 #96BD5F #99BD5D #9CBE5B #9FBE59 #A1BE57 #A4BE56 #A7BE54 #AABD52 #ADBD51 #B0BD4F #B2BD4D #B5BD4C #B8BC4B #BABC4A #BDBB48 #BFBB47 #C2BA46 #C5B945 #C7B944 #CAB843 #CCB742 #CEB541 #D0B441 #D2B340 #D4B13F #D6B03F #D8AE3E #DAAD3D #DCAB3C #DDA93C #DEA63B #DFA43B #E0A13A #E19F3A #E39C39 #E49A38 #E59738 #E69437 #E69136 #E68D36 #E68935 #E68634 #E68234 #E67E33 #E67A32 #E67732 #E67331 #E56E30 #E5692F #E4652E #E3602D #E25B2C #E2572B #E1522A #E04E29 #E04929 #DF4428 #DE3F27 #DE3B26 #DD3625 #DD3124 #DC2D24 #DB2823 +#5E1D9D #591DA1 #551EA5 #501EA9 #4E20AC #4C24AF #4A27B2 #492AB5 #472DB8 #4530BB #4433BE #4236C1 #4039C4 #403DC5 #4041C7 #3F45C8 #3F49C9 #3F4DCB #3F51CC #3F54CD #3E58CF #3E5CD0 #3F60D0 #4063CF #4067CF #416BCF #416ECE #4272CE #4375CD #4379CD #447DCC #457FCB #4682C9 #4785C7 #4988C5 #4A8BC3 #4B8EC2 #4C90C0 #4D93BE #4E96BC #5098B9 #529AB6 #539CB4 #559EB1 #56A0AE #58A2AC #59A4A9 #5BA6A6 #5DA8A3 #5FA9A0 #61AA9D #63AC9A #65AD97 #67AE94 #69B091 #6BB18E #6DB28B #6FB388 #71B485 #74B583 #76B680 #78B77D #7BB77A #7DB877 #80B974 #82BA71 #85BA6F #87BB6D #8ABB6A #8DBC68 #8FBC65 #92BC63 #95BD61 #98BD5E #9ABE5C #9DBE5A #A0BE58 #A3BE57 #A5BE55 #A8BD53 #ABBD52 #AEBD50 #B1BD4E #B3BD4D #B6BD4B #B9BC4A #BBBC49 #BEBB48 #C0BA47 #C3BA46 #C5B945 #C8B944 #CBB843 #CDB642 #CFB541 #D1B440 #D3B240 #D4B13F #D6AF3E #D8AE3E #DAAC3D #DCAB3C #DDA83C #DEA63B #E0A33B #E1A13A #E29E39 #E39C39 #E49938 #E59738 #E69437 #E69036 #E68C36 #E68935 #E68534 #E68134 #E67E33 #E67A32 #E67631 #E67231 #E56E30 #E5692F #E4642E #E3602D #E25B2C #E2562B #E1522A #E04D29 #E04929 #DF4428 #DE3F27 #DE3B26 #DD3625 #DD3124 #DC2D24 #DB2823 +#5E1D9D #591DA1 #551EA5 #501EA9 #4E20AC #4C23AF #4B27B2 #492AB5 #472DB8 #4530BB #4433BE #4236C1 #4039C4 #403DC5 #4041C7 #3F44C8 #3F48C9 #3F4CCB #3F50CC #3F54CD #3E58CF #3E5CD0 #3F5FD0 #3F63CF #4066CF #416ACF #416ECE #4271CE #4375CD #4378CD #447CCD #457FCB #4682C9 #4784C7 #4887C6 #498AC4 #4B8DC2 #4C90C0 #4D92BE #4E95BD #5097BA #5199B7 #539BB5 #549DB2 #569FAF #57A1AD #59A3AA #5AA5A7 #5CA7A5 #5EA9A2 #60AA9F #62AB9C #64AD99 #66AE96 #68AF93 #6AB090 #6CB28D #6EB38A #70B487 #73B584 #75B581 #77B67E #7AB77B #7CB878 #7FB976 #81B973 #83BA70 #86BB6E #89BB6B #8BBB69 #8EBC67 #91BC64 #93BD62 #96BD60 #99BD5D #9CBE5B #9EBE59 #A1BE58 #A4BE56 #A7BE54 #A9BD53 #ACBD51 #AFBD4F #B2BD4E #B4BD4C #B7BD4B #BABC4A #BCBB49 #BFBB48 #C1BA47 #C4BA45 #C6B944 #C9B843 #CBB742 #CDB642 #CFB541 #D1B340 #D3B240 #D5B03F #D7AF3E #D9AD3D #DBAC3D #DDAA3C #DEA83C #DFA53B #E0A33A #E1A03A #E29E39 #E39B39 #E49938 #E59638 #E69337 #E68F36 #E68C36 #E68835 #E68434 #E68133 #E67D33 #E67932 #E67631 #E67231 #E56D30 #E4682F #E4642E #E35F2D #E25B2C #E2562B #E1522A #E04D29 #E04829 #DF4428 #DE3F27 #DE3B26 #DD3625 #DD3124 #DC2D24 #DB2823 +#5E1D9D #5A1DA1 #551EA5 #501EA8 #4E20AC #4C23AF #4B26B2 #4929B5 #472CB8 #4530BA #4433BD #4236C0 #4039C3 #403CC5 #4040C6 #3F44C8 #3F48C9 #3F4CCA #3F50CC #3F53CD #3E57CE #3E5BD0 #3F5FD0 #3F62CF #4066CF #4169CF #416DCE #4270CE #4274CE #4378CD #447BCD #457ECB #4681CA #4784C8 #4886C6 #4989C4 #4A8CC2 #4B8FC1 #4D92BF #4E94BD #4F97BB #5199B8 #529BB5 #549DB3 #559FB0 #57A1AD #58A3AB #5AA5A8 #5BA7A5 #5DA8A3 #5FA9A0 #61AB9D #63AC9A #65AD97 #67AF94 #69B091 #6BB18E #6DB38B #6FB488 #72B485 #74B582 #76B67F #79B77D #7BB77A #7DB877 #80B974 #82BA71 #85BA6F #87BB6D #8ABB6A #8DBC68 #8FBC66 #92BC63 #95BD61 #97BD5F #9ABE5C #9DBE5A #9FBE59 #A2BE57 #A5BE55 #A8BD54 #ABBD52 #ADBD50 #B0BD4F #B3BD4D #B5BD4C #B8BC4B #BABC49 #BDBB48 #C0BB47 #C2BA46 #C5B945 #C7B944 #CAB843 #CCB742 #CEB641 #D0B441 #D2B340 #D4B13F #D6B03F #D8AE3E #D9AD3D #DBAC3D #DDAA3C #DEA73B #DFA53B #E0A23A #E1A03A #E29D39 #E39B39 #E49838 #E59637 #E69237 #E68F36 #E68B35 #E68835 #E68434 #E68033 #E67D33 #E67932 #E67531 #E67130 #E56D30 #E4682F #E4632E #E35F2D #E25A2C #E2562B #E1512A #E04D29 #E04828 #DF4428 #DE3F27 #DE3A26 #DD3625 #DD3124 #DC2D24 #DB2823 +#5E1D9D #5A1DA1 #551EA5 #511EA8 #4E20AC #4C23AF #4B26B1 #4929B4 #472CB7 #462FBA #4432BD #4235C0 #4138C3 #403CC5 #4040C6 #3F44C8 #3F47C9 #3F4BCA #3F4FCC #3F53CD #3F57CE #3E5AD0 #3F5ED0 #3F62D0 #4065CF #4069CF #416CCE #4270CE #4273CE #4377CD #447ACD #447DCC #4680CA #4783C8 #4886C6 #4989C5 #4A8BC3 #4B8EC1 #4C91BF #4D94BE #4F96BC #5098B9 #529AB6 #539CB4 #559EB1 #56A0AE #58A2AC #59A4A9 #5BA6A6 #5DA8A4 #5FA9A1 #60AA9E #62AC9B #64AD98 #66AE95 #68AF92 #6AB18F #6CB28C #6EB389 #71B486 #73B583 #75B681 #78B67E #7AB77B #7CB878 #7FB975 #81B973 #83BA70 #86BB6E #89BB6B #8BBB69 #8EBC67 #91BC64 #93BD62 #96BD60 #99BD5E #9BBE5B #9EBE5A #A1BE58 #A3BE56 #A6BE55 #A9BD53 #ACBD51 #AEBD50 #B1BD4E #B4BD4C #B6BD4B #B9BC4A #BBBC49 #BEBB48 #C0BA47 #C3BA46 #C5B945 #C8B944 #CAB843 #CCB742 #CEB541 #D0B441 #D2B240 #D4B13F #D6AF3E #D8AE3E #DAAD3D #DCAB3C #DDA93C #DEA63B #DFA43B #E0A23A #E19F3A #E29D39 #E39A38 #E49838 #E69537 #E69237 #E68E36 #E68B35 #E68735 #E68334 #E68033 #E67C33 #E67832 #E67531 #E67130 #E56C2F #E4682F #E4632E #E35F2D #E25A2C #E2552B #E1512A #E04C29 #E04828 #DF4328 #DE3F27 #DE3A26 #DD3625 #DD3124 #DC2D24 #DB2823 +#5E1D9D #5A1DA1 #551EA4 #511EA8 #4E20AC #4C23AE #4B26B1 #4929B4 #472CB7 #462FBA #4432BD #4235C0 #4138C3 #403CC5 #403FC6 #3F43C7 #3F47C9 #3F4BCA #3F4FCB #3F52CD #3F56CE #3E5ACF #3E5ED0 #3F61D0 #4065CF #4068CF #416CCE #426FCE #4273CE #4376CD #437ACD #447DCC #4580CA #4682C9 #4785C7 #4988C5 #4A8BC3 #4B8DC2 #4C90C0 #4D93BE #4E96BC #5098BA #5199B7 #539BB4 #549DB2 #569FAF #57A1AD #59A3AA #5AA5A7 #5CA7A5 #5EA8A2 #60AA9F #62AB9C #64AC99 #66AE96 #67AF93 #69B090 #6BB18D #6DB38A #70B487 #72B485 #74B582 #77B67F #79B77C #7BB87A #7EB877 #80B974 #82BA71 #85BA6F #87BB6C #8ABB6A #8DBC68 #8FBC66 #92BC63 #95BD61 #97BD5F #9ABD5C #9CBE5B #9FBE59 #A2BE57 #A5BE56 #A7BE54 #AABD52 #ADBD51 #AFBD4F #B2BD4D #B5BD4C #B7BD4B #BABC4A #BCBB49 #BFBB48 #C1BA47 #C4BA45 #C6B944 #C9B843 #CBB842 #CDB642 #CFB541 #D1B340 #D3B240 #D5B13F #D7AF3E #D9AE3E #DAAC3D #DCAB3C #DDA83C #DEA63B #DFA33B #E0A13A #E29F39 #E39C39 #E49A38 #E59738 #E69537 #E69137 #E68E36 #E68A35 #E68635 #E68334 #E67F33 #E67C32 #E67832 #E67431 #E67030 #E56C2F #E4672E #E4632E #E35E2D #E25A2C #E2552B #E1512A #E04C29 #E04828 #DF4328 #DE3F27 #DE3A26 #DD3625 #DD3124 #DC2D24 #DB2823 +#5E1D9D #5A1DA1 #551EA4 #511EA8 #4E20AB #4D23AE #4B26B1 #4929B4 #472CB7 #462FBA #4432BD #4235C0 #4138C3 #403BC5 #403FC6 #3F43C7 #3F47C9 #3F4ACA #3F4ECB #3F52CD #3F56CE #3E59CF #3E5DD0 #3F61D0 #4064CF #4067CF #416BCF #416ECE #4272CE #4375CD #4379CD #447CCD #457FCB #4682C9 #4784C7 #4887C6 #498AC4 #4B8DC2 #4C8FC0 #4D92BF #4E95BD #4F97BA #5199B8 #529BB5 #549DB3 #559FB0 #57A1AD #58A3AB #5AA5A8 #5BA7A6 #5DA8A3 #5FA9A0 #61AB9D #63AC9A #65AD97 #67AE94 #69B091 #6BB18E #6CB28B #6FB389 #71B486 #73B583 #76B680 #78B67E #7AB77B #7CB878 #7FB975 #81BA73 #83BA70 #86BB6E #89BB6B #8BBB69 #8EBC67 #91BC65 #93BD62 #96BD60 #98BD5E #9BBE5B #9EBE5A #A0BE58 #A3BE57 #A6BE55 #A8BD53 #ABBD52 #AEBD50 #B1BD4E #B3BD4D #B6BD4B #B8BC4A #BBBC49 #BDBB48 #C0BB47 #C2BA46 #C5B945 #C7B944 #CAB843 #CCB742 #CEB641 #D0B441 #D1B340 #D3B23F #D5B03F #D7AF3E #D9AD3D #DBAC3D #DDAA3C #DEA83C #DFA53B #E0A33A #E1A03A #E29E39 #E39C39 #E49938 #E59738 #E69437 #E69036 #E68D36 #E68935 #E68634 #E68234 #E67F33 #E67B32 #E67832 #E67431 #E67030 #E56B2F #E4672E #E4622E #E35E2D #E2592C #E1552B #E1502A #E04C29 #DF4728 #DF4328 #DE3E27 #DE3A26 #DD3625 #DD3124 #DC2D24 #DB2823 +#5E1D9D #5A1DA1 #551EA4 #511EA8 #4E20AB #4D23AE #4B26B1 #4929B4 #482CB7 #462FBA #4432BD #4335BF #4138C2 #403BC5 #403FC6 #3F42C7 #3F46C8 #3F4ACA #3F4ECB #3F51CC #3F55CE #3E59CF #3E5CD0 #3F60D0 #4063CF #4067CF #416ACF #416ECE #4271CE #4375CD #4378CD #447CCD #457ECB #4681C9 #4784C8 #4887C6 #4989C4 #4A8CC3 #4B8FC1 #4C91BF #4E94BD #4F96BB #5098B9 #529AB6 #539CB3 #559EB1 #56A0AE #58A2AC #59A4A9 #5BA6A7 #5CA8A4 #5EA9A1 #60AA9E #62AB9B #64AD98 #66AE95 #68AF92 #6AB090 #6CB28D #6EB38A #70B487 #72B584 #75B582 #77B67F #79B77C #7BB879 #7EB877 #80B974 #82BA71 #85BA6F #87BB6C #8ABB6A #8DBC68 #8FBC66 #92BC63 #94BD61 #97BD5F #9ABD5D #9CBE5B #9FBE59 #A2BE57 #A4BE56 #A7BE54 #AABD53 #ACBD51 #AFBD4F #B2BD4E #B4BD4C #B7BD4B #B9BC4A #BCBB49 #BEBB48 #C1BA47 #C3BA46 #C5B945 #C8B944 #CAB843 #CCB742 #CEB541 #D0B441 #D2B240 #D4B13F #D6B03F #D8AE3E #DAAD3D #DBAC3D #DDAA3C #DEA73B #DFA53B #E0A23A #E1A03A #E29D39 #E39B39 #E49938 #E59638 #E69337 #E69036 #E68C36 #E68935 #E68534 #E68234 #E67E33 #E67B32 #E67732 #E67331 #E66F30 #E56B2F #E4662E #E3622D #E35D2D #E2592C #E1552B #E1502A #E04C29 #DF4728 #DF4328 #DE3E27 #DE3A26 #DD3525 #DD3124 #DC2D24 #DB2823 +#5E1D9D #5A1DA1 #551EA4 #511EA8 #4E20AB #4D23AE #4B26B1 #4929B4 #482CB7 #462FBA #4432BC #4334BF #4137C2 #403BC5 #403EC6 #4042C7 #3F46C8 #3F49CA #3F4DCB #3F51CC #3F55CD #3E58CF #3E5CD0 #3F5FD0 #3F63CF #4066CF #416ACF #416DCE #4270CE #4274CE #4377CD #447BCD #457ECC #4680CA #4783C8 #4886C6 #4989C5 #4A8BC3 #4B8EC1 #4C91C0 #4D93BE #4E96BC #5098B9 #519AB7 #539CB4 #549DB2 #569FAF #57A1AD #59A3AA #5AA5A7 #5CA7A5 #5EA8A2 #60AA9F #61AB9C #63AC99 #65AD96 #67AF94 #69B091 #6BB18E #6DB28B #6FB388 #71B485 #74B583 #76B680 #78B67D #7AB77B #7DB878 #7FB975 #81BA72 #84BA70 #86BB6E #89BB6B #8BBB69 #8EBC67 #90BC65 #93BC62 #96BD60 #98BD5E #9BBE5C #9DBE5A #A0BE58 #A3BE57 #A5BE55 #A8BD53 #ABBD52 #ADBD50 #B0BD4F #B3BD4D #B5BD4C #B8BC4B #BABC4A #BCBB49 #BFBB48 #C1BA46 #C4BA45 #C6B944 #C9B843 #CBB842 #CDB642 #CFB541 #D1B340 #D3B240 #D4B13F #D6AF3E #D8AE3E #DAAD3D #DCAB3C #DDA93C #DEA73B #DFA43B #E0A23A #E19F3A #E29D39 #E39B39 #E49838 #E59637 #E69337 #E68F36 #E68C36 #E68835 #E68534 #E68134 #E67E33 #E67A32 #E67732 #E67331 #E56F30 #E56A2F #E4662E #E3612D #E35D2C #E2592C #E1542B #E1502A #E04B29 #DF4728 #DF4327 #DE3E27 #DE3A26 #DD3525 #DD3124 #DC2C24 #DB2823 +#5E1D9D #5A1DA1 #551EA4 #511EA8 #4E20AB #4D23AE #4B26B1 #4929B4 #482BB7 #462EB9 #4531BC #4334BF #4137C2 #403AC4 #403EC6 #4042C7 #3F45C8 #3F49C9 #3F4DCB #3F50CC #3F54CD #3E58CF #3E5BD0 #3F5FD0 #3F62CF #4066CF #4169CF #416CCE #4270CE #4273CE #4377CD #437ACD #447DCC #4580CA #4683C9 #4885C7 #4988C5 #4A8BC3 #4B8DC2 #4C90C0 #4D93BE #4E95BD #4F97BA #5199B8 #529BB5 #549DB2 #559FB0 #57A1AD #58A3AB #5AA5A8 #5BA6A6 #5DA8A3 #5FA9A0 #61AA9D #63AC9A #65AD98 #66AE95 #68AF92 #6AB18F #6CB28C #6EB389 #70B487 #73B584 #75B581 #77B67F #79B77C #7CB879 #7EB876 #80B974 #82BA71 #85BA6F #87BB6C #8ABB6A #8DBC68 #8FBC66 #92BC64 #94BD61 #97BD5F #99BD5D #9CBE5B #9FBE59 #A1BE58 #A4BE56 #A6BE54 #A9BD53 #ACBD51 #AEBD50 #B1BD4E #B4BD4C #B6BD4B #B8BC4A #BBBC49 #BDBB48 #C0BA47 #C2BA46 #C5B945 #C7B944 #C9B843 #CCB742 #CDB642 #CFB441 #D1B340 #D3B240 #D5B03F #D7AF3E #D9AE3E #DBAC3D #DCAB3C #DDA83C #DEA63B #DFA43B #E0A13A #E19F3A #E29C39 #E39A38 #E49838 #E59537 #E69237 #E68F36 #E68B35 #E68835 #E68434 #E68133 #E67D33 #E67A32 #E67631 #E67231 #E56E30 #E56A2F #E4652E #E3612D #E35D2C #E2582C #E1542B #E1502A #E04B29 #DF4728 #DF4227 #DE3E27 #DE3A26 #DD3525 #DD3124 #DC2C24 #DB2823 +#5E1D9D #5A1DA1 #551EA4 #511EA8 #4E20AB #4D23AE #4B25B1 #4928B4 #482BB6 #462EB9 #4531BC #4334BF #4137C2 #403AC4 #403EC6 #4041C7 #3F45C8 #3F49C9 #3F4CCB #3F50CC #3F53CD #3E57CE #3E5BD0 #3F5ED0 #3F62D0 #4065CF #4068CF #416CCE #426FCE #4273CE #4376CD #4379CD #447DCC #457FCB #4682C9 #4785C7 #4887C6 #498AC4 #4A8DC2 #4C8FC1 #4D92BF #4E95BD #4F97BB #5099B8 #529AB6 #539CB3 #559EB1 #56A0AE #58A2AC #59A4A9 #5BA6A7 #5CA7A4 #5EA9A1 #60AA9E #62AB9C #64AC99 #66AE96 #68AF93 #69B090 #6BB18D #6DB38A #6FB488 #72B485 #74B582 #76B680 #78B77D #7BB77A #7DB878 #7FB975 #81BA72 #84BA70 #86BB6E #89BB6B #8BBB69 #8EBC67 #90BC65 #93BC63 #95BD60 #98BD5E #9ABE5C #9DBE5A #A0BE59 #A2BE57 #A5BE55 #A8BE54 #AABD52 #ADBD51 #AFBD4F #B2BD4D #B5BD4C #B7BD4B #B9BC4A #BCBB49 #BEBB48 #C1BA47 #C3BA46 #C5B945 #C8B944 #CAB843 #CCB742 #CEB541 #D0B441 #D2B340 #D4B13F #D5B03F #D7AF3E #D9AD3D #DBAC3D #DDAA3C #DEA83C #DFA53B #E0A33B #E1A13A #E29E39 #E39C39 #E49A38 #E59738 #E69537 #E69137 #E68E36 #E68B35 #E68735 #E68434 #E68033 #E67D33 #E67932 #E67631 #E67231 #E56E30 #E5692F #E4652E #E3612D #E35C2C #E2582C #E1542B #E14F2A #E04B29 #DF4728 #DF4227 #DE3E27 #DE3926 #DD3525 #DD3124 #DC2C24 #DB2823 +#5E1D9D #5A1DA0 #551EA4 #511EA8 #4E20AB #4D22AE #4B25B1 #4A28B3 #482BB6 #462EB9 #4531BC #4334BF #4237C1 #403AC4 #403DC5 #4041C7 #3F44C8 #3F48C9 #3F4CCA #3F4FCC #3F53CD #3F57CE #3E5ACF #3F5ED0 #3F61D0 #4064CF #4068CF #416BCE #416FCE #4272CE #4375CD #4379CD #447CCD #457FCB #4681C9 #4784C8 #4887C6 #4989C4 #4A8CC3 #4B8EC1 #4C91BF #4D94BE #4F96BC #5098B9 #529AB7 #539CB4 #549EB2 #569FAF #57A1AD #59A3AA #5AA5A7 #5CA7A5 #5EA8A2 #5FAA9F #61AB9D #63AC9A #65AD97 #67AE94 #69B091 #6BB18E #6CB28C #6EB389 #71B486 #73B584 #75B581 #77B67E #7AB77C #7CB879 #7EB876 #80B974 #82BA71 #85BA6F #87BB6C #8ABB6A #8CBC68 #8FBC66 #92BC64 #94BD61 #97BD5F #99BD5D #9CBE5B #9EBE59 #A1BE58 #A3BE56 #A6BE55 #A9BD53 #ABBD52 #AEBD50 #B0BD4E #B3BD4D #B5BD4C #B8BC4B #BABC4A #BDBB48 #BFBB47 #C1BA46 #C4BA45 #C6B944 #C9B843 #CBB842 #CDB642 #CFB541 #D0B440 #D2B240 #D4B13F #D6B03F #D8AE3E #DAAD3D #DCAC3D #DDAA3C #DEA73B #DFA53B #E0A33A #E1A03A #E29E39 #E39B39 #E49938 #E59738 #E69437 #E69137 #E68D36 #E68A35 #E68735 #E68334 #E68033 #E67C33 #E67932 #E67531 #E67130 #E56D30 #E5692F #E4642E #E3602D #E35C2C #E2582B #E1532B #E14F2A #E04B29 #DF4628 #DF4227 #DE3E27 #DE3926 #DD3525 #DD3124 #DC2C24 #DB2823 +#5E1D9D #5A1DA0 #561EA4 #511EA8 #4E20AB #4D22AE #4B25B1 #4A28B3 #482BB6 #462EB9 #4531BC #4334BE #4236C1 #4039C4 #403DC5 #4040C7 #3F44C8 #3F48C9 #3F4BCA #3F4FCC #3F52CD #3F56CE #3E5ACF #3E5DD0 #3F61D0 #4064CF #4067CF #416BCF #416ECE #4271CE #4375CD #4378CD #447BCD #457ECB #4681CA #4783C8 #4886C6 #4989C5 #4A8BC3 #4B8EC1 #4C90C0 #4D93BE #4E96BC #5097BA #5199B7 #539BB5 #549DB2 #559FB0 #57A1AD #58A3AB #5AA4A8 #5BA6A6 #5DA8A3 #5FA9A0 #61AA9E #62AC9B #64AD98 #66AE95 #68AF92 #6AB090 #6CB28D #6DB38A #70B487 #72B485 #74B582 #76B67F #79B77D #7BB77A #7DB878 #7FB975 #81BA72 #84BA70 #86BB6E #89BB6B #8BBB69 #8EBC67 #90BC65 #93BC63 #95BD60 #98BD5E #9ABE5C #9DBE5A #9FBE59 #A2BE57 #A5BE56 #A7BE54 #AABD52 #ACBD51 #AFBD4F #B1BD4E #B4BD4C #B6BD4B #B9BC4A #BBBC49 #BEBB48 #C0BA47 #C2BA46 #C5B945 #C7B944 #C9B843 #CCB742 #CDB642 #CFB541 #D1B340 #D3B240 #D5B13F #D6AF3E #D8AE3E #DAAD3D #DCAB3C #DDA93C #DEA73B #DFA43B #E0A23A #E1A03A #E29D39 #E39B39 #E49938 #E59638 #E69437 #E69036 #E68D36 #E68935 #E68634 #E68334 #E67F33 #E67C32 #E67832 #E67531 #E67130 #E56D30 #E4682F #E4642E #E3602D #E35C2C #E2572B #E1532B #E14F2A #E04A29 #DF4628 #DF4227 #DE3E27 #DE3926 #DD3525 #DD3124 #DC2C24 #DB2823 +#5E1D9D #5A1DA0 #561EA4 #511EA8 #4E1FAB #4D22AE #4B25B0 #4A28B3 #482BB6 #472EB9 #4531BB #4333BE #4236C1 #4039C4 #403DC5 #4040C6 #3F44C8 #3F47C9 #3F4BCA #3F4ECB #3F52CD #3F56CE #3E59CF #3E5DD0 #3F60D0 #4063CF #4067CF #416ACF #416DCE #4271CE #4274CE #4377CD #447ACD #447DCC #4580CA #4683C8 #4885C7 #4988C5 #4A8AC4 #4B8DC2 #4C90C0 #4D92BF #4E95BD #4F97BB #5199B8 #529BB6 #549CB3 #559EB1 #56A0AE #58A2AC #59A4A9 #5BA6A7 #5CA7A4 #5EA9A1 #60AA9F #62AB9C #64AC99 #65AD96 #67AF94 #69B091 #6BB18E #6DB28B #6FB388 #71B486 #73B583 #75B681 #78B67E #7AB77B #7CB879 #7EB976 #80B973 #83BA71 #85BA6F #87BB6C #8ABB6A #8CBC68 #8FBC66 #91BC64 #94BD62 #96BD5F #99BD5D #9BBE5B #9EBE5A #A0BE58 #A3BE57 #A6BE55 #A8BD53 #ABBD52 #ADBD50 #B0BD4F #B2BD4D #B5BD4C #B7BD4B #BABC4A #BCBB49 #BEBB48 #C1BA47 #C3BA46 #C5B945 #C8B944 #CAB843 #CCB742 #CEB541 #D0B441 #D2B340 #D3B23F #D5B03F #D7AF3E #D9AE3E #DBAC3D #DCAB3C #DDA83C #DEA63B #DFA43B #E0A13A #E19F3A #E29D39 #E39A39 #E49838 #E59638 #E69337 #E69036 #E68C36 #E68935 #E68534 #E68234 #E67F33 #E67B32 #E67832 #E67431 #E67030 #E56C2F #E4682F #E4642E #E35F2D #E25B2C #E2572B #E1532A #E04E2A #E04A29 #DF4628 #DF4227 #DE3D27 #DE3926 #DD3525 #DD3124 #DC2C24 #DB2823 +#5E1D9D #5A1DA0 #561EA4 #511EA8 #4F1FAB #4D22AE #4B25B0 #4A28B3 #482BB6 #472DB9 #4530BB #4333BE #4236C1 #4039C3 #403CC5 #4040C6 #3F43C8 #3F47C9 #3F4ACA #3F4ECB #3F52CC #3F55CE #3E59CF #3E5CD0 #3F5FD0 #3F63CF #4066CF #4169CF #416DCE #4270CE #4273CE #4376CD #437ACD #447DCC #457FCB #4682C9 #4785C7 #4887C6 #498AC4 #4A8CC2 #4B8FC1 #4C92BF #4E94BD #4F96BB #5098B9 #529AB6 #539CB4 #559EB1 #56A0AF #57A1AD #59A3AA #5AA5A8 #5CA7A5 #5DA8A2 #5FA9A0 #61AB9D #63AC9A #65AD97 #66AE95 #68AF92 #6AB18F #6CB28C #6EB38A #70B487 #72B484 #74B582 #77B67F #79B77D #7BB77A #7DB877 #7FB975 #81BA72 #84BA70 #86BB6D #89BB6B #8BBB69 #8EBC67 #90BC65 #93BC63 #95BD61 #97BD5E #9ABE5C #9CBE5B #9FBE59 #A2BE57 #A4BE56 #A7BE54 #A9BD53 #ACBD51 #AEBD50 #B1BD4E #B3BD4D #B6BD4B #B8BC4A #BABC49 #BDBB48 #BFBB47 #C2BA46 #C4BA45 #C6B944 #C9B843 #CBB842 #CDB642 #CEB541 #D0B441 #D2B240 #D4B13F #D6B03F #D7AE3E #D9AD3D #DBAC3D #DDAA3C #DEA83C #DFA63B #E0A33B #E1A13A #E19F39 #E29C39 #E39A38 #E49838 #E59537 #E69237 #E68F36 #E68C36 #E68835 #E68534 #E68234 #E67E33 #E67B32 #E67732 #E67431 #E67030 #E56C2F #E4672F #E4632E #E35F2D #E25B2C #E2572B #E1522A #E04E2A #E04A29 #DF4628 #DF4227 #DE3D27 #DE3926 #DD3525 #DD3124 #DC2C24 #DB2823 +#5E1D9D #5A1DA0 #561EA4 #521EA8 #4F1FAB #4D22AD #4B25B0 #4A28B3 #482BB6 #472DB8 #4530BB #4433BE #4236C1 #4039C3 #403CC5 #403FC6 #3F43C7 #3F46C9 #3F4ACA #3F4ECB #3F51CC #3F55CD #3E58CF #3E5CD0 #3F5FD0 #3F62CF #4065CF #4069CF #416CCE #426FCE #4273CE #4376CD #4379CD #447CCD #457FCB #4681C9 #4784C8 #4887C6 #4989C4 #4A8CC3 #4B8EC1 #4C91BF #4D93BE #4E96BC #5098BA #5199B7 #539BB5 #549DB2 #559FB0 #57A1AD #58A3AB #5AA4A8 #5BA6A6 #5DA8A3 #5FA9A1 #60AA9E #62AB9B #64AD98 #66AE96 #68AF93 #69B090 #6BB18D #6DB38B #6FB388 #71B485 #73B583 #76B680 #78B67E #7AB77B #7CB879 #7EB976 #80B973 #83BA71 #85BA6F #87BB6C #8ABB6A #8CBC68 #8FBC66 #91BC64 #94BD62 #96BD60 #99BD5D #9BBE5B #9EBE5A #A0BE58 #A3BE57 #A5BE55 #A8BE54 #AABD52 #ADBD51 #AFBD4F #B2BD4D #B4BD4C #B7BD4B #B9BC4A #BBBC49 #BEBB48 #C0BA47 #C2BA46 #C5B945 #C7B944 #C9B843 #CBB742 #CDB642 #CFB541 #D1B340 #D3B240 #D4B13F #D6AF3E #D8AE3E #DAAD3D #DCAC3D #DDAA3C #DEA73B #DFA53B #E0A33A #E1A03A #E29E39 #E39C39 #E49A38 #E59738 #E69537 #E69237 #E68E36 #E68B35 #E68835 #E68434 #E68133 #E67E33 #E67A32 #E67732 #E67431 #E66F30 #E56B2F #E4672E #E4632E #E35F2D #E25B2C #E2562B #E1522A #E04E2A #E04A29 #DF4628 #DF4127 #DE3D27 #DE3926 #DD3525 #DD3024 #DC2C24 #DB2823 diff --git a/phylogenetic/defaults/config.yaml b/phylogenetic/defaults/config.yaml index aca0062..4e040bd 100644 --- a/phylogenetic/defaults/config.yaml +++ b/phylogenetic/defaults/config.yaml @@ -32,5 +32,4 @@ traits: export: auspice_config: "defaults/auspice_config.json" - colors: "defaults/colors.tsv" description: "defaults/description.md" diff --git a/phylogenetic/rules/export.smk b/phylogenetic/rules/export.smk index a537e34..53de574 100644 --- a/phylogenetic/rules/export.smk +++ b/phylogenetic/rules/export.smk @@ -25,6 +25,22 @@ This part of the workflow usually includes the following steps: See Augur's usage docs for these commands for more details. """ +rule colors: + input: + color_schemes = "defaults/color_schemes.tsv", + color_orderings = "defaults/color_orderings.tsv", + metadata = "data/metadata_{segment}.tsv", + output: + colors = "results/colors_{segment}.tsv" + shell: + """ + python3 scripts/assign-colors.py \ + --color-schemes {input.color_schemes} \ + --ordering {input.color_orderings} \ + --metadata {input.metadata} \ + --output {output.colors} + """ + rule export: """Exporting data files for for auspice""" input: @@ -34,7 +50,7 @@ rule export: traits = "results/traits_{segment}.json", nt_muts = "results/nt_muts_{segment}.json", aa_muts = "results/aa_muts_{segment}.json", - colors = config['export']['colors'], + colors = "results/colors_{segment}.tsv", description = config['export']['description'], auspice_config = config['export']['auspice_config'], output: diff --git a/phylogenetic/scripts/assign-colors.py b/phylogenetic/scripts/assign-colors.py new file mode 100755 index 0000000..e63bf5a --- /dev/null +++ b/phylogenetic/scripts/assign-colors.py @@ -0,0 +1,78 @@ +import argparse +import pandas as pd + +# Forced colours MUST NOT appear in the ordering TSV +forced_colors = { +} + +if __name__ == '__main__': + parser = argparse.ArgumentParser( + description="Assign colors based on ordering", + formatter_class=argparse.ArgumentDefaultsHelpFormatter + ) + + parser.add_argument('--ordering', type=str, required=True, help="input ordering file") + parser.add_argument('--color-schemes', type=str, required=True, help="input color schemes file") + parser.add_argument('--metadata', type=str, help="if provided, restrict colors to only those found in metadata") + parser.add_argument('--output', type=str, required=True, help="output colors tsv") + args = parser.parse_args() + + assignment = {} + with open(args.ordering) as f: + for line in f.readlines(): + array = line.lstrip().rstrip().split("\t") + if len(array) == 2: + name = array[0] + trait = array[1] + if name not in assignment: + assignment[name] = [trait] + else: + assignment[name].append(trait) + + # if metadata supplied, go through and + # 1. remove assignments that don't exist in metadata + # 2. remove assignments that have 'focal' set to 'False' in metadata + if args.metadata: + metadata = pd.read_csv(args.metadata, delimiter='\t') + for name, trait in assignment.items(): + if name in metadata: + subset_present = [x for x in assignment[name] if x in metadata[name].unique()] + assignment[name] = subset_present + if name in metadata and 'focal' in metadata: + focal_list = metadata.loc[metadata['focal'] == True, name].unique() + subset_focal = [x for x in assignment[name] if x in focal_list] + assignment[name] = subset_focal + + schemes = {} + counter = 0 + with open(args.color_schemes) as f: + for line in f.readlines(): + counter += 1 + array = line.lstrip().rstrip().split("\t") + schemes[counter] = array + + with open(args.output, 'w') as f: + for trait_name, trait_array in assignment.items(): + if len(trait_array)==0: + print(f"No traits found for {trait_name}") + continue + if len(schemes)0): + if (remain>len(schemes)): + color_array = [*color_array, *schemes[len(schemes)]] + remain -= len(schemes) + else: + color_array = [*color_array, *schemes[remain]] + remain = 0 + else: + color_array = schemes[len(trait_array)] + extra_trait_values = list(forced_colors.get(trait_name, {}).keys()) + extra_color_values = list(forced_colors.get(trait_name, {}).values()) + + zipped = list(zip(trait_array+extra_trait_values, color_array+extra_color_values)) + for trait_value, color in zipped: + f.write(trait_name + "\t" + trait_value + "\t" + color + "\n") + f.write("\n") From 8ba2317f4b706fef3a41d27fb66bf6ec46804d2b Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Wed, 10 Jul 2024 13:15:40 -0400 Subject: [PATCH 21/31] Display strain name on tree --- phylogenetic/defaults/config.yaml | 1 + phylogenetic/rules/export.smk | 21 ++++++++- phylogenetic/scripts/set_final_strain_name.py | 47 +++++++++++++++++++ 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100755 phylogenetic/scripts/set_final_strain_name.py diff --git a/phylogenetic/defaults/config.yaml b/phylogenetic/defaults/config.yaml index 4e040bd..852023e 100644 --- a/phylogenetic/defaults/config.yaml +++ b/phylogenetic/defaults/config.yaml @@ -10,6 +10,7 @@ sequences_url: "https://data.nextstrain.org/files/workflows/lassa/{segment}/sequ metadata_url: "https://data.nextstrain.org/files/workflows/lassa/{segment}/metadata.tsv.zst" strain_id_field: "accession" +display_strain_field: "strain" filter: exclude: "defaults/dropped_strains.txt" diff --git a/phylogenetic/rules/export.smk b/phylogenetic/rules/export.smk index 53de574..a831358 100644 --- a/phylogenetic/rules/export.smk +++ b/phylogenetic/rules/export.smk @@ -54,7 +54,7 @@ rule export: description = config['export']['description'], auspice_config = config['export']['auspice_config'], output: - auspice = "auspice/lassa_{segment}.json", + auspice = "results/lassa_{segment}.json", params: strain_id_field = config["strain_id_field"], shell: @@ -70,3 +70,22 @@ rule export: --output {output.auspice} \ --include-root-sequence-inline """ + +rule final_strain_name: + input: + auspice_json="results/lassa_{segment}.json", + metadata="data/metadata_{segment}.tsv", + output: + auspice_json="auspice/lassa_{segment}.json", + params: + strain_id_field=config["strain_id_field"], + display_strain_field=config["display_strain_field"], + shell: + """ + python3 scripts/set_final_strain_name.py \ + --metadata {input.metadata} \ + --metadata-id-columns {params.strain_id_field} \ + --input-auspice-json {input.auspice_json} \ + --display-strain-name {params.display_strain_field} \ + --output {output.auspice_json} + """ \ No newline at end of file diff --git a/phylogenetic/scripts/set_final_strain_name.py b/phylogenetic/scripts/set_final_strain_name.py new file mode 100755 index 0000000..fcdb661 --- /dev/null +++ b/phylogenetic/scripts/set_final_strain_name.py @@ -0,0 +1,47 @@ +import pandas as pd +import json, argparse +from augur.io import read_metadata + +def replace_name_recursive(node, lookup, saveoldcolumn): + if node["name"] in lookup: + if saveoldcolumn == "accession": + node["node_attrs"][saveoldcolumn] = node["name"] + elif saveoldcolumn == "genbank_accession": + node["node_attrs"][saveoldcolumn] = {} + node["node_attrs"][saveoldcolumn]["value"] = node["name"] + else: + node["node_attrs"][saveoldcolumn] = node["name"] + + if node["name"] in lookup: + node["name"] = lookup[node["name"]] + + if "children" in node: + for child in node["children"]: + replace_name_recursive(child, lookup, saveoldcolumn) + +if __name__=="__main__": + parser = argparse.ArgumentParser( + description="Swaps out the strain names in the Auspice JSON with the final strain name", + formatter_class=argparse.ArgumentDefaultsHelpFormatter + ) + + parser.add_argument('--input-auspice-json', type=str, required=True, help="input auspice_json") + parser.add_argument('--metadata', type=str, required=True, help="input data") + parser.add_argument('--metadata-id-columns', nargs="+", help="names of possible metadata columns containing identifier information, ordered by priority. Only one ID column will be inferred.") + parser.add_argument('--display-strain-name', type=str, required=True, help="field to use as strain name in auspice") + parser.add_argument('--output', type=str, metavar="JSON", required=True, help="output Auspice JSON") + args = parser.parse_args() + + metadata = read_metadata(args.metadata, id_columns=args.metadata_id_columns) + name_lookup = {} + for ri, row in metadata.iterrows(): + strain_id = row.name + name_lookup[strain_id] = args.display_strain_name if pd.isna(row[args.display_strain_name]) else row[args.display_strain_name] + + with open(args.input_auspice_json, 'r') as fh: + data = json.load(fh) + + replace_name_recursive(data['tree'], name_lookup, "genbank_accession") + + with open(args.output, 'w') as fh: + json.dump(data, fh) From 2553ebc8163269f206077a7d257fcbc3e5bc108b Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Wed, 10 Jul 2024 14:05:39 -0400 Subject: [PATCH 22/31] Attribution --- phylogenetic/defaults/auspice_config.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/phylogenetic/defaults/auspice_config.json b/phylogenetic/defaults/auspice_config.json index 45dbbf7..01e4e59 100644 --- a/phylogenetic/defaults/auspice_config.json +++ b/phylogenetic/defaults/auspice_config.json @@ -31,9 +31,8 @@ "geo_resolutions": [ "country" ], - "maintainer": [ - "ACEGID Redeemer's University", - "http://acegid.org/" + "maintainers": [ + {"name": "the Nextstrain team", "url": "https://nextstrain.org/team"} ], "filters": [ "country", From 689800e3b304b79062082eb2a196aac2304eb919 Mon Sep 17 00:00:00 2001 From: j23414 Date: Wed, 10 Jul 2024 14:36:18 -0400 Subject: [PATCH 23/31] Add phylogenetic automation and deploy --- .github/workflows/ingest-to-phylogenetic.yaml | 102 +++++++++++++++++ .github/workflows/phylogenetic.yaml | 107 ++++++++++++++++++ .../nextstrain-automation/config.yaml | 4 + .../nextstrain-automation/deploy.smk | 15 +++ 4 files changed, 228 insertions(+) create mode 100644 .github/workflows/ingest-to-phylogenetic.yaml create mode 100644 .github/workflows/phylogenetic.yaml create mode 100644 phylogenetic/build-configs/nextstrain-automation/config.yaml create mode 100644 phylogenetic/build-configs/nextstrain-automation/deploy.smk diff --git a/.github/workflows/ingest-to-phylogenetic.yaml b/.github/workflows/ingest-to-phylogenetic.yaml new file mode 100644 index 0000000..6f78a83 --- /dev/null +++ b/.github/workflows/ingest-to-phylogenetic.yaml @@ -0,0 +1,102 @@ +name: Ingest to phylogenetic + +defaults: + run: + # This is the same as GitHub Action's `bash` keyword as of 20 June 2023: + # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsshell + # + # Completely spelling it out here so that GitHub can't change it out from under us + # and we don't have to refer to the docs to know the expected behavior. + shell: bash --noprofile --norc -eo pipefail {0} + +on: + schedule: + # Note times are in UTC, which is 1 or 2 hours behind CET depending on daylight savings. + # + # Note the actual runs might be late. + # Numerous people were confused, about that, including me: + # - https://github.community/t/scheduled-action-running-consistently-late/138025/11 + # - https://github.com/github/docs/issues/3059 + # + # Note, '*' is a special character in YAML, so you have to quote this string. + # + # Docs: + # - https://docs.github.com/en/actions/learn-github-actions/events-that-trigger-workflows#schedule + # + # Tool that deciphers this particular format of crontab string: + # - https://crontab.guru/ + # + # Runs at 5pm UTC (1pm EDT/10am PDT) since curation by NCBI happens on the East Coast. + # We were running into invalid zip archive errors at 9am PDT, so hoping an hour + # delay will lower the error frequency + - cron: '0 17 * * *' + + workflow_dispatch: + inputs: + ingest_image: + description: 'Specific container image to use for ingest workflow (will override the default of "nextstrain build")' + required: false + phylogenetic_image: + description: 'Specific container image to use for phylogenetic workflow (will override the default of "nextstrain build")' + required: false + +jobs: + ingest: + permissions: + id-token: write + uses: ./.github/workflows/ingest.yaml + secrets: inherit + with: + image: ${{ inputs.ingest_image }} + + # Check if ingest results include new data by checking for the cache + # of the file with the results' Metadata.sh256sum (which should have been added within upload-to-s3) + # GitHub will remove any cache entries that have not been accessed in over 7 days, + # so if the workflow has not been run over 7 days then it will trigger phylogenetic. + check-new-data: + needs: [ingest] + runs-on: ubuntu-latest + outputs: + cache-hit: ${{ steps.check-cache.outputs.cache-hit }} + steps: + - name: Get sha256sum + id: get-sha256sum + env: + AWS_DEFAULT_REGION: ${{ vars.AWS_DEFAULT_REGION }} + run: | + s3_urls=( + "s3://nextstrain-data/files/workflows/lassa/metadata_all.tsv.zst" + "s3://nextstrain-data/files/workflows/lassa/sequences_all.fasta.zst" + ) + + # Code below is modified from ingest/upload-to-s3 + # https://github.com/nextstrain/ingest/blob/c0b4c6bb5e6ccbba86374d2c09b42077768aac23/upload-to-s3#L23-L29 + + no_hash=0000000000000000000000000000000000000000000000000000000000000000 + + for s3_url in "${s3_urls[@]}"; do + s3path="${s3_url#s3://}" + bucket="${s3path%%/*}" + key="${s3path#*/}" + + s3_hash="$(aws s3api head-object --no-sign-request --bucket "$bucket" --key "$key" --query Metadata.sha256sum --output text 2>/dev/null || echo "$no_hash")" + echo "${s3_hash}" | tee -a ingest-output-sha256sum + done + + - name: Check cache + id: check-cache + uses: actions/cache@v4 + with: + path: ingest-output-sha256sum + key: ingest-output-sha256sum-${{ hashFiles('ingest-output-sha256sum') }} + lookup-only: true + + phylogenetic: + needs: [check-new-data] + if: ${{ needs.check-new-data.outputs.cache-hit != 'true' }} + permissions: + id-token: write + uses: ./.github/workflows/phylogenetic.yaml + secrets: inherit + with: + image: ${{ inputs.phylogenetic_image }} diff --git a/.github/workflows/phylogenetic.yaml b/.github/workflows/phylogenetic.yaml new file mode 100644 index 0000000..afde3e3 --- /dev/null +++ b/.github/workflows/phylogenetic.yaml @@ -0,0 +1,107 @@ +name: Phylogenetic + +defaults: + run: + # This is the same as GitHub Action's `bash` keyword as of 20 June 2023: + # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsshell + # + # Completely spelling it out here so that GitHub can't change it out from under us + # and we don't have to refer to the docs to know the expected behavior. + shell: bash --noprofile --norc -eo pipefail {0} + +on: + workflow_call: + inputs: + image: + description: 'Specific container image to use for phylogenetic workflow (will override the default of "nextstrain build")' + required: false + type: string + + workflow_dispatch: + inputs: + image: + description: 'Specific container image to use for ingest workflow (will override the default of "nextstrain build")' + required: false + type: string + trial_name: + description: | + Trial name for deploying builds. + If not set, builds will overwrite existing builds at s3://nextstrain-data/lassa* + If set, builds will be deployed to s3://nextstrain-staging/lassa_trials__* + required: false + type: string + sequences_url: + description: | + URL for the sequences.fasta.zst file + If not provided, will use default sequences_url from phylogenetic/defaults/config.yaml + required: false + type: string + metadata_url: + description: | + URL for the metadata.tsv.zst file + If not provided, will use default metadata_url from phylogenetic/defaults/config.yaml + required: false + type: string + +jobs: + set_config_overrides: + runs-on: ubuntu-latest + steps: + - id: config + name: Set config overrides + env: + TRIAL_NAME: ${{ inputs.trial_name }} + SEQUENCES_URL: ${{ inputs.sequences_url }} + METADATA_URL: ${{ inputs.metadata_url }} + run: | + config="" + + if [[ "$TRIAL_NAME" ]]; then + config+=" deploy_url='s3://nextstrain-staging/lassa_trials_"$TRIAL_NAME"_'" + fi + + if [[ "$SEQUENCES_URL" ]]; then + config+=" sequences_url='"$SEQUENCES_URL"'" + fi + + if [[ "$METADATA_URL" ]]; then + config+=" metadata_url='"$METADATA_URL"'" + fi + + if [[ $config ]]; then + config="--config $config" + fi + + echo "config=$config" >> "$GITHUB_OUTPUT" + outputs: + config_overrides: ${{ steps.config.outputs.config }} + + phylogenetic: + needs: [set_config_overrides] + permissions: + id-token: write + uses: nextstrain/.github/.github/workflows/pathogen-repo-build.yaml@master + secrets: inherit + with: + # Starting with the default docker runtime + # We can migrate to AWS Batch when/if we need to for more resources or if + # the job runs longer than the GH Action limit of 6 hours. + runtime: docker + env: | + NEXTSTRAIN_DOCKER_IMAGE: ${{ inputs.image }} + CONFIG_OVERRIDES: ${{ needs.set_config_overrides.outputs.config_overrides }} + run: | + nextstrain build \ + phylogenetic \ + deploy_all \ + --configfile build-configs/nextstrain-automation/config.yaml \ + $CONFIG_OVERRIDES + # Specifying artifact name to differentiate ingest build outputs from + # the phylogenetic build outputs + artifact-name: phylogenetic-build-output + artifact-paths: | + phylogenetic/auspice/ + phylogenetic/results/ + phylogenetic/benchmarks/ + phylogenetic/logs/ + phylogenetic/.snakemake/log/ diff --git a/phylogenetic/build-configs/nextstrain-automation/config.yaml b/phylogenetic/build-configs/nextstrain-automation/config.yaml new file mode 100644 index 0000000..e549405 --- /dev/null +++ b/phylogenetic/build-configs/nextstrain-automation/config.yaml @@ -0,0 +1,4 @@ +custom_rules: + - build-configs/nextstrain-automation/deploy.smk + +deploy_url: "s3://nextstrain-data" diff --git a/phylogenetic/build-configs/nextstrain-automation/deploy.smk b/phylogenetic/build-configs/nextstrain-automation/deploy.smk new file mode 100644 index 0000000..f37b788 --- /dev/null +++ b/phylogenetic/build-configs/nextstrain-automation/deploy.smk @@ -0,0 +1,15 @@ +""" +This part of the workflow handles automatic deployments of the lassa build. +Uploads the build defined as the default output of the workflow through +the `all` rule from Snakefille +""" + +rule deploy_all: + input: *rules.all.input + output: touch("results/deploy_all.done") + params: + deploy_url = config["deploy_url"] + shell: + """ + nextstrain remote upload {params.deploy_url} {input} + """ From f818c4b40cdf9d7b50d2e29e5ed11a2a93587326 Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Mon, 29 Jul 2024 14:11:40 -0400 Subject: [PATCH 24/31] Separate files into segment directories * Capitalize L and S to match ingest * Refactor and place intermediate files in segment directories * Match segment capitalization in reference files and example files --- phylogenetic/Snakefile | 7 ++++-- .../build-configs/ci/copy_example_data.smk | 4 ++-- .../defaults/{lassa_l.gb => lassa_L.gb} | 0 .../defaults/{lassa_s.gb => lassa_S.gb} | 0 .../{metadata_l.tsv => metadata_L.tsv} | 0 .../{metadata_s.tsv => metadata_S.tsv} | 0 .../{sequences_l.fasta => sequences_L.fasta} | 0 .../{sequences_s.fasta => sequences_S.fasta} | 0 phylogenetic/rules/annotate_phylogeny.smk | 18 +++++++------- phylogenetic/rules/construct_phylogeny.smk | 14 +++++------ phylogenetic/rules/export.smk | 24 +++++++++---------- phylogenetic/rules/prepare_sequences.smk | 22 ++++++++--------- 12 files changed, 46 insertions(+), 43 deletions(-) rename phylogenetic/defaults/{lassa_l.gb => lassa_L.gb} (100%) rename phylogenetic/defaults/{lassa_s.gb => lassa_S.gb} (100%) rename phylogenetic/example_data/{metadata_l.tsv => metadata_L.tsv} (100%) rename phylogenetic/example_data/{metadata_s.tsv => metadata_S.tsv} (100%) rename phylogenetic/example_data/{sequences_l.fasta => sequences_L.fasta} (100%) rename phylogenetic/example_data/{sequences_s.fasta => sequences_S.fasta} (100%) diff --git a/phylogenetic/Snakefile b/phylogenetic/Snakefile index c9feac8..70fda3d 100644 --- a/phylogenetic/Snakefile +++ b/phylogenetic/Snakefile @@ -8,11 +8,14 @@ workdir: workflow.current_basedir # Use default configuration values. Override with Snakemake's --configfile/--config options. configfile: "defaults/config.yaml" -SEGMENTS = ["l", "s"] +segments = ["L", "S"] + +wildcard_constraints: + segment = "|".join(segments) rule all: input: - auspice_tree = expand("auspice/lassa_{segment}.json", segment=SEGMENTS) + auspice_tree = expand("auspice/lassa_{segment}.json", segment=segments) include: "rules/prepare_sequences.smk" include: "rules/construct_phylogeny.smk" diff --git a/phylogenetic/build-configs/ci/copy_example_data.smk b/phylogenetic/build-configs/ci/copy_example_data.smk index 88f517f..0fae62b 100644 --- a/phylogenetic/build-configs/ci/copy_example_data.smk +++ b/phylogenetic/build-configs/ci/copy_example_data.smk @@ -3,8 +3,8 @@ rule copy_example_data: sequences="example_data/sequences_{segment}.fasta", metadata="example_data/metadata_{segment}.tsv", output: - sequences="data/sequences_{segment}.fasta", - metadata="data/metadata_{segment}.tsv", + sequences="data/{segment}/sequences.fasta", + metadata="data/{segment}/metadata.tsv", shell: """ cp -f {input.sequences} {output.sequences} diff --git a/phylogenetic/defaults/lassa_l.gb b/phylogenetic/defaults/lassa_L.gb similarity index 100% rename from phylogenetic/defaults/lassa_l.gb rename to phylogenetic/defaults/lassa_L.gb diff --git a/phylogenetic/defaults/lassa_s.gb b/phylogenetic/defaults/lassa_S.gb similarity index 100% rename from phylogenetic/defaults/lassa_s.gb rename to phylogenetic/defaults/lassa_S.gb diff --git a/phylogenetic/example_data/metadata_l.tsv b/phylogenetic/example_data/metadata_L.tsv similarity index 100% rename from phylogenetic/example_data/metadata_l.tsv rename to phylogenetic/example_data/metadata_L.tsv diff --git a/phylogenetic/example_data/metadata_s.tsv b/phylogenetic/example_data/metadata_S.tsv similarity index 100% rename from phylogenetic/example_data/metadata_s.tsv rename to phylogenetic/example_data/metadata_S.tsv diff --git a/phylogenetic/example_data/sequences_l.fasta b/phylogenetic/example_data/sequences_L.fasta similarity index 100% rename from phylogenetic/example_data/sequences_l.fasta rename to phylogenetic/example_data/sequences_L.fasta diff --git a/phylogenetic/example_data/sequences_s.fasta b/phylogenetic/example_data/sequences_S.fasta similarity index 100% rename from phylogenetic/example_data/sequences_s.fasta rename to phylogenetic/example_data/sequences_S.fasta diff --git a/phylogenetic/rules/annotate_phylogeny.smk b/phylogenetic/rules/annotate_phylogeny.smk index 9951de6..f7e3929 100644 --- a/phylogenetic/rules/annotate_phylogeny.smk +++ b/phylogenetic/rules/annotate_phylogeny.smk @@ -34,10 +34,10 @@ to the ones produced by Augur commands. rule ancestral: """Reconstructing ancestral sequences and mutations""" input: - tree = "results/tree_{segment}.nwk", - alignment = "results/aligned_{segment}.fasta", + tree = "results/{segment}/tree.nwk", + alignment = "results/{segment}/aligned.fasta", output: - node_data = "results/nt_muts_{segment}.json" + node_data = "results/{segment}/nt_muts.json" params: inference = "joint" shell: @@ -52,11 +52,11 @@ rule ancestral: rule translate: """Translating amino acid sequences""" input: - tree = "results/tree_{segment}.nwk", - node_data = "results/nt_muts_{segment}.json", + tree = "results/{segment}/tree.nwk", + node_data = "results/{segment}/nt_muts.json", reference = "defaults/lassa_{segment}.gb" output: - node_data = "results/aa_muts_{segment}.json" + node_data = "results/{segment}/aa_muts.json" shell: """ augur translate \ @@ -69,10 +69,10 @@ rule translate: rule traits: """Inferring ancestral traits for {params.columns!s}""" input: - tree = "results/tree_{segment}.nwk", - metadata = "data/metadata_{segment}.tsv", + tree = "results/{segment}/tree.nwk", + metadata = "data/{segment}/metadata.tsv", output: - node_data = "results/traits_{segment}.json", + node_data = "results/{segment}/traits.json", params: strain_id_field = config["strain_id_field"], columns = config['traits']['columns'] diff --git a/phylogenetic/rules/construct_phylogeny.smk b/phylogenetic/rules/construct_phylogeny.smk index 89fa9e0..010a50c 100644 --- a/phylogenetic/rules/construct_phylogeny.smk +++ b/phylogenetic/rules/construct_phylogeny.smk @@ -22,9 +22,9 @@ See Augur's usage docs for these commands for more details. rule tree: """Building tree""" input: - alignment = "results/aligned_{segment}.fasta" + alignment = "results/{segment}/aligned.fasta" output: - tree = "results/tree_raw_{segment}.nwk" + tree = "results/{segment}/tree_raw.nwk" params: method = "iqtree" shell: @@ -44,12 +44,12 @@ rule refine: - fix clock rate at {params.clock_rate} """ input: - tree = "results/tree_raw_{segment}.nwk", - alignment = "results/aligned_{segment}.fasta", - metadata = "data/metadata_{segment}.tsv", + tree = "results/{segment}/tree_raw.nwk", + alignment = "results/{segment}/aligned.fasta", + metadata = "data/{segment}/metadata.tsv", output: - tree = "results/tree_{segment}.nwk", - node_data = "results/branch_lengths_{segment}.json" + tree = "results/{segment}/tree.nwk", + node_data = "results/{segment}/branch_lengths.json" params: strain_id_field = config["strain_id_field"], coalescent = config['refine']['coalescent'], diff --git a/phylogenetic/rules/export.smk b/phylogenetic/rules/export.smk index a831358..ba5ac9b 100644 --- a/phylogenetic/rules/export.smk +++ b/phylogenetic/rules/export.smk @@ -29,9 +29,9 @@ rule colors: input: color_schemes = "defaults/color_schemes.tsv", color_orderings = "defaults/color_orderings.tsv", - metadata = "data/metadata_{segment}.tsv", + metadata = "data/{segment}/metadata.tsv", output: - colors = "results/colors_{segment}.tsv" + colors = "results/{segment}/colors.tsv" shell: """ python3 scripts/assign-colors.py \ @@ -44,17 +44,17 @@ rule colors: rule export: """Exporting data files for for auspice""" input: - tree = "results/tree_{segment}.nwk", - metadata = "data/metadata_{segment}.tsv", - branch_lengths = "results/branch_lengths_{segment}.json", - traits = "results/traits_{segment}.json", - nt_muts = "results/nt_muts_{segment}.json", - aa_muts = "results/aa_muts_{segment}.json", - colors = "results/colors_{segment}.tsv", + tree = "results/{segment}/tree.nwk", + metadata = "data/{segment}/metadata.tsv", + branch_lengths = "results/{segment}/branch_lengths.json", + traits = "results/{segment}/traits.json", + nt_muts = "results/{segment}/nt_muts.json", + aa_muts = "results/{segment}/aa_muts.json", + colors = "results/{segment}/colors.tsv", description = config['export']['description'], auspice_config = config['export']['auspice_config'], output: - auspice = "results/lassa_{segment}.json", + auspice = "results/{segment}/lassa.json", params: strain_id_field = config["strain_id_field"], shell: @@ -73,8 +73,8 @@ rule export: rule final_strain_name: input: - auspice_json="results/lassa_{segment}.json", - metadata="data/metadata_{segment}.tsv", + auspice_json="results/{segment}/lassa.json", + metadata="data/{segment}/metadata.tsv", output: auspice_json="auspice/lassa_{segment}.json", params: diff --git a/phylogenetic/rules/prepare_sequences.smk b/phylogenetic/rules/prepare_sequences.smk index f5253d9..da85928 100644 --- a/phylogenetic/rules/prepare_sequences.smk +++ b/phylogenetic/rules/prepare_sequences.smk @@ -24,8 +24,8 @@ See Augur's usage docs for these commands for more details. rule download: """Downloading sequences and metadata from data.nextstrain.org""" output: - sequences = "data/sequences_{segment}.fasta.zst", - metadata = "data/metadata_{segment}.tsv.zst" + sequences = "data/{segment}/sequences.fasta.zst", + metadata = "data/{segment}/metadata.tsv.zst" params: sequences_url = config["sequences_url"], metadata_url = config["metadata_url"], @@ -38,11 +38,11 @@ rule download: rule decompress: """Decompressing sequences and metadata""" input: - sequences = "data/sequences_{segment}.fasta.zst", - metadata = "data/metadata_{segment}.tsv.zst" + sequences = "data/{segment}/sequences.fasta.zst", + metadata = "data/{segment}/metadata.tsv.zst" output: - sequences = "data/sequences_{segment}.fasta", - metadata = "data/metadata_{segment}.tsv" + sequences = "data/{segment}/sequences.fasta", + metadata = "data/{segment}/metadata.tsv" shell: """ zstd -d -c {input.sequences} > {output.sequences} @@ -56,11 +56,11 @@ rule filter: - excluding strains in {input.exclude} """ input: - sequences = "data/sequences_{segment}.fasta", - metadata = "data/metadata_{segment}.tsv", + sequences = "data/{segment}/sequences.fasta", + metadata = "data/{segment}/metadata.tsv", exclude = config['filter']['exclude'] output: - sequences = "results/filtered_{segment}.fasta" + sequences = "results/{segment}/filtered.fasta" params: strain_id_field = config["strain_id_field"], group_by = config['filter']['group_by'], @@ -83,10 +83,10 @@ rule align: - filling gaps with N """ input: - sequences = "results/filtered_{segment}.fasta", + sequences = "results/{segment}/filtered.fasta", reference = "defaults/lassa_{segment}.gb" output: - alignment = "results/aligned_{segment}.fasta" + alignment = "results/{segment}/aligned.fasta" shell: """ augur align \ From e4d25fbaa5b701955bf421d51640d2772ceeb6b7 Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Tue, 30 Jul 2024 06:54:16 -0400 Subject: [PATCH 25/31] Update description to match https://nextstrain.org/lassa/s --- phylogenetic/defaults/description.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/phylogenetic/defaults/description.md b/phylogenetic/defaults/description.md index bf4716c..1fcdf52 100644 --- a/phylogenetic/defaults/description.md +++ b/phylogenetic/defaults/description.md @@ -1,5 +1,9 @@ We gratefully acknowledge the authors, originating and submitting laboratories of the genetic sequences and metadata for sharing their work. Please note that although data generators have generously shared data in an open fashion, that does not mean there should be free license to publish on this data. Data generators should be cited where possible and collaborations should be sought in some circumstances. Please try to avoid scooping someone else's work. Reach out if uncertain. +This work is made possible by the open sharing of genetic data by research groups, including these groups currently collecting Lassa sequences: [Christian Happi](http://acegid.org/), [Pardis Sabeti](https://www.sabetilab.org/), [Katherine Siddle](https://www.sabetilab.org/katherine-siddle/) and colleagues, whose data was shared via [this virological.org post](http://virological.org/t/new-lassa-virus-genomes-from-nigeria-2015-2016/191). If you intend to use these sequences prior to publication, please contact them directly to coordinate. + +The Irrua specialist Teaching Hospital (ISTH) and Institute for Lassa Fever Research and Control (ILFRC), Irrua, Edo State, Nigeria; The Bernhard-Nocht Institute for Tropical Medicine (BNITM), Hamburg, Germany; Public Health England (PHE); African Center of Excellence for Genomics of Infectious Disease (ACEGID ), Redeemer’s University, Ede, Nigeria; Broad Institute of MIT and Harvard University (Cambridge, MA, USA). For further details, including conditions of reuse, please contact [Ephraim Epogbaini](mailto:epogbaini@yahoo.com), [Stephan Günther](http://www.who.int/blueprint/about/stephan-gunther/en/), and [Philippe Lemey](https://rega.kuleuven.be/cev/ecv/lab-members/PhilippeLemey.html). Their data was first shared via [this virological.org post](http://virological.org/t/2018-lasv-sequencing-continued/192/8), which is continually updated. + We curate sequence data and metadata from NCBI as the starting point for our analyses. Curated sequences and metadata are available as flat files at: * [data.nextstrain.org/files/workflows/lassa/L/sequences.fasta.zst](https://data.nextstrain.org/files/workflows/lassa/L/sequences.fasta.zst) From ecd6ac9ec2268c7f17c3a38c21c20f8584afa21c Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Tue, 30 Jul 2024 12:49:11 -0400 Subject: [PATCH 26/31] Fixup: Update description to match https://nextstrain.org/lassa/s Co-authored-by: John SJ Anderson --- phylogenetic/defaults/description.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phylogenetic/defaults/description.md b/phylogenetic/defaults/description.md index 1fcdf52..0238630 100644 --- a/phylogenetic/defaults/description.md +++ b/phylogenetic/defaults/description.md @@ -2,7 +2,7 @@ We gratefully acknowledge the authors, originating and submitting laboratories o This work is made possible by the open sharing of genetic data by research groups, including these groups currently collecting Lassa sequences: [Christian Happi](http://acegid.org/), [Pardis Sabeti](https://www.sabetilab.org/), [Katherine Siddle](https://www.sabetilab.org/katherine-siddle/) and colleagues, whose data was shared via [this virological.org post](http://virological.org/t/new-lassa-virus-genomes-from-nigeria-2015-2016/191). If you intend to use these sequences prior to publication, please contact them directly to coordinate. -The Irrua specialist Teaching Hospital (ISTH) and Institute for Lassa Fever Research and Control (ILFRC), Irrua, Edo State, Nigeria; The Bernhard-Nocht Institute for Tropical Medicine (BNITM), Hamburg, Germany; Public Health England (PHE); African Center of Excellence for Genomics of Infectious Disease (ACEGID ), Redeemer’s University, Ede, Nigeria; Broad Institute of MIT and Harvard University (Cambridge, MA, USA). For further details, including conditions of reuse, please contact [Ephraim Epogbaini](mailto:epogbaini@yahoo.com), [Stephan Günther](http://www.who.int/blueprint/about/stephan-gunther/en/), and [Philippe Lemey](https://rega.kuleuven.be/cev/ecv/lab-members/PhilippeLemey.html). Their data was first shared via [this virological.org post](http://virological.org/t/2018-lasv-sequencing-continued/192/8), which is continually updated. +The Irrua Specialist Teaching Hospital (ISTH) and Institute for Lassa Fever Research and Control (ILFRC), Irrua, Edo State, Nigeria; The Bernhard-Nocht Institute for Tropical Medicine (BNITM), Hamburg, Germany; Public Health England (PHE); African Center of Excellence for Genomics of Infectious Disease (ACEGID), Redeemer’s University, Ede, Nigeria; Broad Institute of MIT and Harvard University, Cambridge, MA, USA. For further details, including conditions of reuse, please contact [Ephraim Epogbaini](mailto:epogbaini@yahoo.com), [Stephan Günther](http://www.who.int/blueprint/about/stephan-gunther/en/), and [Philippe Lemey](https://rega.kuleuven.be/cev/ecv/lab-members/PhilippeLemey.html). Their data was first shared via [this virological.org post](http://virological.org/t/2018-lasv-sequencing-continued/192/8), which is continually updated. We curate sequence data and metadata from NCBI as the starting point for our analyses. Curated sequences and metadata are available as flat files at: From 3eb4a8da068db5cbec9d7d8170cea1fb13f44126 Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Wed, 31 Jul 2024 16:06:06 -0400 Subject: [PATCH 27/31] Update .github/workflows/ingest-to-phylogenetic.yaml Co-authored-by: Jover Lee --- .github/workflows/ingest-to-phylogenetic.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ingest-to-phylogenetic.yaml b/.github/workflows/ingest-to-phylogenetic.yaml index 6f78a83..a5fc050 100644 --- a/.github/workflows/ingest-to-phylogenetic.yaml +++ b/.github/workflows/ingest-to-phylogenetic.yaml @@ -65,8 +65,8 @@ jobs: AWS_DEFAULT_REGION: ${{ vars.AWS_DEFAULT_REGION }} run: | s3_urls=( - "s3://nextstrain-data/files/workflows/lassa/metadata_all.tsv.zst" - "s3://nextstrain-data/files/workflows/lassa/sequences_all.fasta.zst" + "s3://nextstrain-data/files/workflows/lassa/all/metadata.tsv.zst" + "s3://nextstrain-data/files/workflows/lassa/all/sequences.fasta.zst" ) # Code below is modified from ingest/upload-to-s3 From 7e177ea5a491dedbd84e3ed578311f6ddddf1627 Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Wed, 31 Jul 2024 16:59:45 -0400 Subject: [PATCH 28/31] ingest: Switch to lowercase segment names --- ingest/Snakefile | 2 +- ingest/build-configs/nextstrain-automation/config.yaml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ingest/Snakefile b/ingest/Snakefile index f1d2404..6e42a00 100644 --- a/ingest/Snakefile +++ b/ingest/Snakefile @@ -8,7 +8,7 @@ workdir: workflow.current_basedir # Use default configuration values. Override with Snakemake's --configfile/--config options. configfile: "defaults/config.yaml" -segments = ['L', 'S'] +segments = ['l', 's'] wildcard_constraints: segment = "|".join(segments) diff --git a/ingest/build-configs/nextstrain-automation/config.yaml b/ingest/build-configs/nextstrain-automation/config.yaml index 0ebdc26..21b1600 100644 --- a/ingest/build-configs/nextstrain-automation/config.yaml +++ b/ingest/build-configs/nextstrain-automation/config.yaml @@ -19,7 +19,7 @@ files_to_upload: ncbi.ndjson.zst: data/ncbi.ndjson all/metadata.tsv.zst: results/all/metadata.tsv all/sequences.fasta.zst: results/all/sequences.fasta - L/metadata.tsv.zst: results/L/metadata.tsv - L/sequences.fasta.zst: results/L/sequences.fasta - S/metadata.tsv.zst: results/S/metadata.tsv - S/sequences.fasta.zst: results/S/sequences.fasta + l/metadata.tsv.zst: results/l/metadata.tsv + l/sequences.fasta.zst: results/l/sequences.fasta + s/metadata.tsv.zst: results/s/metadata.tsv + s/sequences.fasta.zst: results/s/sequences.fasta From 072da67a9486f52b5a2362ba11136d551785fecf Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Wed, 31 Jul 2024 17:29:47 -0400 Subject: [PATCH 29/31] phylogenetic: Switch to lowercase segment names --- phylogenetic/Snakefile | 2 +- phylogenetic/defaults/description.md | 8 ++++---- phylogenetic/defaults/{lassa_L.gb => lassa_l.gb} | 0 phylogenetic/defaults/{lassa_S.gb => lassa_s.gb} | 0 .../example_data/{metadata_L.tsv => metadata_l.tsv} | 0 .../example_data/{metadata_S.tsv => metadata_s.tsv} | 0 .../example_data/{sequences_L.fasta => sequences_l.fasta} | 0 .../example_data/{sequences_S.fasta => sequences_s.fasta} | 0 8 files changed, 5 insertions(+), 5 deletions(-) rename phylogenetic/defaults/{lassa_L.gb => lassa_l.gb} (100%) rename phylogenetic/defaults/{lassa_S.gb => lassa_s.gb} (100%) rename phylogenetic/example_data/{metadata_L.tsv => metadata_l.tsv} (100%) rename phylogenetic/example_data/{metadata_S.tsv => metadata_s.tsv} (100%) rename phylogenetic/example_data/{sequences_L.fasta => sequences_l.fasta} (100%) rename phylogenetic/example_data/{sequences_S.fasta => sequences_s.fasta} (100%) diff --git a/phylogenetic/Snakefile b/phylogenetic/Snakefile index 70fda3d..d79684e 100644 --- a/phylogenetic/Snakefile +++ b/phylogenetic/Snakefile @@ -8,7 +8,7 @@ workdir: workflow.current_basedir # Use default configuration values. Override with Snakemake's --configfile/--config options. configfile: "defaults/config.yaml" -segments = ["L", "S"] +segments = ["l", "s"] wildcard_constraints: segment = "|".join(segments) diff --git a/phylogenetic/defaults/description.md b/phylogenetic/defaults/description.md index 0238630..564511d 100644 --- a/phylogenetic/defaults/description.md +++ b/phylogenetic/defaults/description.md @@ -6,9 +6,9 @@ The Irrua Specialist Teaching Hospital (ISTH) and Institute for Lassa Fever Rese We curate sequence data and metadata from NCBI as the starting point for our analyses. Curated sequences and metadata are available as flat files at: -* [data.nextstrain.org/files/workflows/lassa/L/sequences.fasta.zst](https://data.nextstrain.org/files/workflows/lassa/L/sequences.fasta.zst) -* [data.nextstrain.org/files/workflows/lassa/L/metadata.tsv.zst](https://data.nextstrain.org/files/workflows/lassa/L/metadata.tsv.zst) -* [data.nextstrain.org/files/workflows/lassa/S/sequences.fasta.zst](https://data.nextstrain.org/files/workflows/lassa/S/sequences.fasta.zst) -* [data.nextstrain.org/files/workflows/lassa/S/metadata.tsv.zst](https://data.nextstrain.org/files/workflows/lassa/S/metadata.tsv.zst) +* [data.nextstrain.org/files/workflows/lassa/l/sequences.fasta.zst](https://data.nextstrain.org/files/workflows/lassa/l/sequences.fasta.zst) +* [data.nextstrain.org/files/workflows/lassa/l/metadata.tsv.zst](https://data.nextstrain.org/files/workflows/lassa/l/metadata.tsv.zst) +* [data.nextstrain.org/files/workflows/lassa/s/sequences.fasta.zst](https://data.nextstrain.org/files/workflows/lassa/s/sequences.fasta.zst) +* [data.nextstrain.org/files/workflows/lassa/s/metadata.tsv.zst](https://data.nextstrain.org/files/workflows/lassa/s/metadata.tsv.zst) * [data.nextstrain.org/files/workflows/lassa/all/sequences.fasta.zst](https://data.nextstrain.org/files/workflows/lassa/all/sequences.fasta.zst) * [data.nextstrain.org/files/workflows/lassa/all/metadata.tsv.zst](https://data.nextstrain.org/files/workflows/lassa/all/metadata.tsv.zst) diff --git a/phylogenetic/defaults/lassa_L.gb b/phylogenetic/defaults/lassa_l.gb similarity index 100% rename from phylogenetic/defaults/lassa_L.gb rename to phylogenetic/defaults/lassa_l.gb diff --git a/phylogenetic/defaults/lassa_S.gb b/phylogenetic/defaults/lassa_s.gb similarity index 100% rename from phylogenetic/defaults/lassa_S.gb rename to phylogenetic/defaults/lassa_s.gb diff --git a/phylogenetic/example_data/metadata_L.tsv b/phylogenetic/example_data/metadata_l.tsv similarity index 100% rename from phylogenetic/example_data/metadata_L.tsv rename to phylogenetic/example_data/metadata_l.tsv diff --git a/phylogenetic/example_data/metadata_S.tsv b/phylogenetic/example_data/metadata_s.tsv similarity index 100% rename from phylogenetic/example_data/metadata_S.tsv rename to phylogenetic/example_data/metadata_s.tsv diff --git a/phylogenetic/example_data/sequences_L.fasta b/phylogenetic/example_data/sequences_l.fasta similarity index 100% rename from phylogenetic/example_data/sequences_L.fasta rename to phylogenetic/example_data/sequences_l.fasta diff --git a/phylogenetic/example_data/sequences_S.fasta b/phylogenetic/example_data/sequences_s.fasta similarity index 100% rename from phylogenetic/example_data/sequences_S.fasta rename to phylogenetic/example_data/sequences_s.fasta From 81d1cd1f4e86de422c549b2c54a11bada0c775a5 Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Wed, 31 Jul 2024 18:23:56 -0400 Subject: [PATCH 30/31] Stage the phylogenetic build to get feedback from SME before making it live Pushing the phylogenetic build to staging instead of production, to allow for time for SME's to review the build before making it live. Make sure to update this to the live url once the build is approved. --- phylogenetic/build-configs/nextstrain-automation/config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phylogenetic/build-configs/nextstrain-automation/config.yaml b/phylogenetic/build-configs/nextstrain-automation/config.yaml index e549405..1332be4 100644 --- a/phylogenetic/build-configs/nextstrain-automation/config.yaml +++ b/phylogenetic/build-configs/nextstrain-automation/config.yaml @@ -1,4 +1,4 @@ custom_rules: - build-configs/nextstrain-automation/deploy.smk -deploy_url: "s3://nextstrain-data" +deploy_url: "s3://nextstrain-staging" From 7cde2593eb58fe66e8995dd6a7173dfc1f810721 Mon Sep 17 00:00:00 2001 From: Jennifer Chang Date: Fri, 2 Aug 2024 09:34:11 -0400 Subject: [PATCH 31/31] Since number of S and L segment sequences are both below 5k, include all that meet a min length requirement --- phylogenetic/defaults/config.yaml | 3 +-- phylogenetic/rules/prepare_sequences.smk | 9 ++++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/phylogenetic/defaults/config.yaml b/phylogenetic/defaults/config.yaml index 852023e..440a585 100644 --- a/phylogenetic/defaults/config.yaml +++ b/phylogenetic/defaults/config.yaml @@ -13,9 +13,8 @@ strain_id_field: "accession" display_strain_field: "strain" filter: + min_length: 500 exclude: "defaults/dropped_strains.txt" - group_by: "country year" - sequences_per_group: 2 tree: method: "iqtree" diff --git a/phylogenetic/rules/prepare_sequences.smk b/phylogenetic/rules/prepare_sequences.smk index da85928..33d95e7 100644 --- a/phylogenetic/rules/prepare_sequences.smk +++ b/phylogenetic/rules/prepare_sequences.smk @@ -63,18 +63,17 @@ rule filter: sequences = "results/{segment}/filtered.fasta" params: strain_id_field = config["strain_id_field"], - group_by = config['filter']['group_by'], - sequences_per_group = config['filter']['sequences_per_group'], + min_length = config['filter']['min_length'], + exclude = config['filter']['exclude'] shell: """ augur filter \ --sequences {input.sequences} \ --metadata {input.metadata} \ --metadata-id-columns {params.strain_id_field} \ - --exclude {input.exclude} \ --output {output.sequences} \ - --group-by {params.group_by} \ - --sequences-per-group {params.sequences_per_group} + --min-length {params.min_length} \ + --exclude {input.exclude} """ rule align: