library(conflicted)
library(tidyverse)
library(downloadthis)
library(fs)

source("setup/conflicted.R")
source("setup/knit_engines_simple.R")

knitr::opts_chunk$set(message = FALSE,
                      warning = FALSE,
                      echo    = TRUE,
                      include = TRUE,
                      eval    = TRUE,
                      comment = "")

Background

Read more about this workflow here: PRONAME: a user-friendly pipeline to process long-read nanopore metabarcoding data by generating high-quality consensus sequences.

Integrating Dorado for trimming & demux

We can continue to use the Dorado basecalling → demux steps, then hand off the demultiplexed FASTQ files to PRONAME Here’s how it works:

  1. Dorado does the heavy lifting
    • GPU-accelerated SUP base-calling
    • Barcode demultiplex (with your ONT 16S kit’s barcodes)
      • Outputs clean, per-sample FASTQs.
  2. PRONAME’s 4-step Pipeline:
  1. proname_import
  • We will skip the optional trimming, which we already let dorado handle automatically.
  • We use the --duplex 'yes' argument to optimize for V14 kit chemistry.
  • PRONAME provides length-vs-quality scatterplots that we can use to inform our QC parameters.
  1. proname_filter
  • Set the optimal filtering thresholds based on results in the previous step and visualize the filtering impact on results.

C. proname_refine

  • Now PRONAME polishes reads via medaka, performs read clustering, removes chimeric sequences, and and generates error-corrected consensus sequences.
  • Files may be exported directly to QIIME2 to adapt standard Illumina-type workflows.
  1. proname_taxonomy
  • The files generated while gathering the consensus sequences and the standard reference databases are used to perform a taxnonomic analysis.
  • This step produces a taxonomy file and a taxa barplot.
  1. Post-PRONAME
  • After this, we can use standard QIIME2 pipelines that easily integrate into R packages like phyloseq.
    • For example, we can use qiime phylogeny to produce a phylogenetic diversity analysis (No more need to fetch refernces directly from GenBank ourselves!).

Setting up your Swan Workspace

Dorado Usage

You can skip these steps if you already have dorado up and running on swan, including the most up-to-date sup basecalling model.

SUP Model Download

You should have some basic understanding of which models Dorado provides for basecalling ONT reads by looking over this page. I use the config package or parameters in the yaml header to track and source the models that I am using. You will need to report details like this in the methods section of any paper produced by your results.

We will almost always choose the newest SUP model available on the HCC with the 10.4.1. kit chemistry.

For some reason dorado’s automatic sourcing and use of models does not seem to work from the GPU nodes on the HCC, so we will download a stable version of our current model options. - This file needs to be the path below within your working directory for it to automatically be located by the code I have written in other scripts.
You should at least download the newest sup model available, but you may also download the newest hac and fast models if you would like. The code in other scripts will search this directory for whichever of these three models you specify at that time.

Run the chunk below after replacing with the model of choice (and your directory paths) and then transfer the file batch_scripts/dorado_models.sh to your repo mirror on Swan work.

# batch_scripts/dorado_setup.sh

#!/bin/bash
#SBATCH --job-name=dorado_model
#SBATCH --output=/work/richlab/aliciarich/read_processing/logs/dorado_model.%j.out
#SBATCH --error=/work/richlab/aliciarich/read_processing/logs/dorado_model.%j.err
#SBATCH --time=01:00:00
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=8
#SBATCH --constraint='gpu_v100|gpu_t4'
#SBATCH --partition=gpu,guest_gpu
#SBATCH --gres=gpu:2
#SBATCH --mem=20GB
module load apptainer

cd /work/richlab/aliciarich/read_processing

apptainer exec docker://nanoporetech/dorado:latest dorado download --model dna_r10.4.1_e8.2_400bps_sup@v5.2.0 --directory dorado_models

Once you ensure this script has transferred to the read_processing/batch_scripts path on your HCC directory, run the code below to submit the job.

cd read_processing
sbatch batch_scripts/dorado_setup.sh

Compression Tools

module load anaconda

conda create -n pigzip pigz=2.8

PRONAME Usage

Local Docker Image

# batch_scripts/proname_setup.sh

#!/bin/bash
#SBATCH --job-name=proname_setup
#SBATCH --output=/work/richlab/aliciarich/read_processing/logs/proname_setup.%j.out
#SBATCH --error=/work/richlab/aliciarich/read_processing/logs/proname_setup.%j.err
#SBATCH --time=01:00:00
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=8
#SBATCH --partition=guest
#SBATCH --mem=100GB

cd /work/richlab/aliciarich/read_processing

mkdir -p containers
cd containers

module load apptainer

apptainer pull docker://benn888/proname:v2.0.1-amd64

apptainer inspect proname_v2.0.1-amd64.sif
LS0tCnRpdGxlOiAiRmlyc3QtVXNlIFNldHVwOiBNaWNyb2Jpb21lIFJlYWQgUHJvY2Vzc2luZyB2aWEgUFJPTkFNRSIKYXV0aG9yOiAiQWxpY2lhIE0uIFJpY2gsIFBoLkQuIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdGhlbWU6CiAgICAgIGJzbGliOiB0cnVlCiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMwogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBkZl9wcmludDogcGFnZWQKICAgIGNzczogam91cm5hbC5jc3MKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAKLS0tCgpgYGB7ciBzZXR1cCwgbWVzc2FnZT1GQUxTRSwgY29tbWVudD0iIn0KbGlicmFyeShjb25mbGljdGVkKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShkb3dubG9hZHRoaXMpCmxpYnJhcnkoZnMpCgpzb3VyY2UoInNldHVwL2NvbmZsaWN0ZWQuUiIpCnNvdXJjZSgic2V0dXAva25pdF9lbmdpbmVzX3NpbXBsZS5SIikKCmtuaXRyOjpvcHRzX2NodW5rJHNldChtZXNzYWdlID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBlY2hvICAgID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgZXZhbCAgICA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gIiIpCgoKYGBgCgoKIyBCYWNrZ3JvdW5kCgpSZWFkIG1vcmUgYWJvdXQgdGhpcyB3b3JrZmxvdyBoZXJlOiBbKlBST05BTUU6IGEgdXNlci1mcmllbmRseSBwaXBlbGluZSB0byBwcm9jZXNzIGxvbmctcmVhZCBuYW5vcG9yZSBtZXRhYmFyY29kaW5nIGRhdGEgYnkgZ2VuZXJhdGluZyBoaWdoLXF1YWxpdHkgY29uc2Vuc3VzIHNlcXVlbmNlcypdKGh0dHBzOi8vd3d3LmZyb250aWVyc2luLm9yZy9qb3VybmFscy9iaW9pbmZvcm1hdGljcy9hcnRpY2xlcy8xMC4zMzg5L2ZiaW5mLjIwMjQuMTQ4MzI1NS9mdWxsKS4KCgojIyBJbnRlZ3JhdGluZyBEb3JhZG8gZm9yIHRyaW1taW5nICYgZGVtdXgKCldlIGNhbiBjb250aW51ZSB0byB1c2UgdGhlIERvcmFkbyBiYXNlY2FsbGluZyDihpIgZGVtdXggc3RlcHMsIHRoZW4gaGFuZCBvZmYgdGhlIGRlbXVsdGlwbGV4ZWQgRkFTVFEgZmlsZXMgdG8gUFJPTkFNRSBIZXJl4oCZcyBob3cgaXQgd29ya3M6CgoxLglEb3JhZG8gZG9lcyB0aGUgaGVhdnkgbGlmdGluZwoJLSBHUFUtYWNjZWxlcmF0ZWQgU1VQIGJhc2UtY2FsbGluZwoJLSBCYXJjb2RlIGRlbXVsdGlwbGV4ICh3aXRoIHlvdXIgT05UIDE2UyBraXTigJlzIGJhcmNvZGVzKQoJICAtIE91dHB1dHMgY2xlYW4sIHBlci1zYW1wbGUgRkFTVFFzLgoJICAKMi4JUFJPTkFNRSdzIDQtc3RlcCBQaXBlbGluZToKCkEuICBgcHJvbmFtZV9pbXBvcnRgCiAgCiAgLSBXZSB3aWxsIHNraXAgdGhlIG9wdGlvbmFsIHRyaW1taW5nLCB3aGljaCB3ZSBhbHJlYWR5IGxldCBkb3JhZG8gaGFuZGxlIGF1dG9tYXRpY2FsbHkuCiAgLSBXZSB1c2UgdGhlIGAtLWR1cGxleCAneWVzJ2AgYXJndW1lbnQgdG8gb3B0aW1pemUgZm9yIFYxNCBraXQgY2hlbWlzdHJ5LgogIC0gUFJPTkFNRSBwcm92aWRlcyBsZW5ndGgtdnMtcXVhbGl0eSBzY2F0dGVycGxvdHMgdGhhdCB3ZSBjYW4gdXNlIHRvIGluZm9ybSBvdXIgUUMgcGFyYW1ldGVycy4KICAKQi4gIGBwcm9uYW1lX2ZpbHRlcmAKICAKICAtIFNldCB0aGUgb3B0aW1hbCBmaWx0ZXJpbmcgdGhyZXNob2xkcyBiYXNlZCBvbiByZXN1bHRzIGluIHRoZSBwcmV2aW91cyBzdGVwIGFuZCB2aXN1YWxpemUgdGhlIGZpbHRlcmluZyBpbXBhY3Qgb24gcmVzdWx0cy4KICAgIApDLiBgcHJvbmFtZV9yZWZpbmVgCiAgCiAgLSBOb3cgUFJPTkFNRSBwb2xpc2hlcyByZWFkcyB2aWEgYG1lZGFrYWAsIHBlcmZvcm1zIHJlYWQgY2x1c3RlcmluZywgcmVtb3ZlcyBjaGltZXJpYyBzZXF1ZW5jZXMsIGFuZCBhbmQgZ2VuZXJhdGVzIGVycm9yLWNvcnJlY3RlZCBjb25zZW5zdXMgc2VxdWVuY2VzLgogIC0gRmlsZXMgbWF5IGJlIGV4cG9ydGVkIGRpcmVjdGx5IHRvIGBRSUlNRTJgIHRvIGFkYXB0IHN0YW5kYXJkIElsbHVtaW5hLXR5cGUgd29ya2Zsb3dzLgogIApELiAgYHByb25hbWVfdGF4b25vbXlgCiAgCiAgLSBUaGUgZmlsZXMgZ2VuZXJhdGVkIHdoaWxlIGdhdGhlcmluZyB0aGUgY29uc2Vuc3VzIHNlcXVlbmNlcyBhbmQgdGhlIHN0YW5kYXJkIHJlZmVyZW5jZSBkYXRhYmFzZXMgYXJlIHVzZWQgdG8gcGVyZm9ybSBhIHRheG5vbm9taWMgYW5hbHlzaXMuCiAgLSBUaGlzIHN0ZXAgcHJvZHVjZXMgYSB0YXhvbm9teSBmaWxlIGFuZCBhIHRheGEgYmFycGxvdC4KICAgIAozLiAgUG9zdC1QUk9OQU1FCgogIC0gQWZ0ZXIgdGhpcywgd2UgY2FuIHVzZSBzdGFuZGFyZCBgUUlJTUUyYCBwaXBlbGluZXMgdGhhdCBlYXNpbHkgaW50ZWdyYXRlIGludG8gUiBwYWNrYWdlcyBsaWtlIHBoeWxvc2VxLgogICAgLSBGb3IgZXhhbXBsZSwgd2UgY2FuIHVzZSBgcWlpbWUgcGh5bG9nZW55YCB0byBwcm9kdWNlIGEgcGh5bG9nZW5ldGljIGRpdmVyc2l0eSBhbmFseXNpcyAoKk5vIG1vcmUgbmVlZCB0byBmZXRjaCByZWZlcm5jZXMgZGlyZWN0bHkgZnJvbSBHZW5CYW5rIG91cnNlbHZlcyEqKS4KICAgIAoKIyBTZXR0aW5nIHVwIHlvdXIgU3dhbiBXb3Jrc3BhY2UKCiMjIERvcmFkbyBVc2FnZQoKWW91IGNhbiBza2lwIHRoZXNlIHN0ZXBzIGlmIHlvdSBhbHJlYWR5IGhhdmUgYGRvcmFkb2AgdXAgYW5kIHJ1bm5pbmcgb24gc3dhbiwgaW5jbHVkaW5nIHRoZSBtb3N0IHVwLXRvLWRhdGUgc3VwIGJhc2VjYWxsaW5nIG1vZGVsLgoKIyMjIFNVUCBNb2RlbCBEb3dubG9hZAoKWW91IHNob3VsZCBoYXZlIHNvbWUgYmFzaWMgdW5kZXJzdGFuZGluZyBvZiB3aGljaCBtb2RlbHMgRG9yYWRvIHByb3ZpZGVzIGZvciBiYXNlY2FsbGluZyBPTlQgcmVhZHMgYnkgbG9va2luZyBvdmVyIFt0aGlzIHBhZ2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9uYW5vcG9yZXRlY2gvZG9yYWRvI2RuYS1tb2RlbHMpLiBJIHVzZSB0aGUgY29uZmlnIHBhY2thZ2Ugb3IgcGFyYW1ldGVycyBpbiB0aGUgeWFtbCBoZWFkZXIgdG8gdHJhY2sgYW5kIHNvdXJjZSB0aGUgbW9kZWxzIHRoYXQgSSBhbSB1c2luZy4gWW91IHdpbGwgbmVlZCB0byByZXBvcnQgZGV0YWlscyBsaWtlIHRoaXMgaW4gdGhlIG1ldGhvZHMgc2VjdGlvbiBvZiBhbnkgcGFwZXIgcHJvZHVjZWQgYnkgeW91ciByZXN1bHRzLiAgCiAgCj4qKldlIHdpbGwgYWxtb3N0IGFsd2F5cyBjaG9vc2UgdGhlIG5ld2VzdCBTVVAgbW9kZWwgYXZhaWxhYmxlIG9uIHRoZSBIQ0Mgd2l0aCB0aGUgMTAuNC4xLiBraXQgY2hlbWlzdHJ5LioqICAKICAKRm9yIHNvbWUgcmVhc29uIGRvcmFkbydzIGF1dG9tYXRpYyBzb3VyY2luZyBhbmQgdXNlIG9mIG1vZGVscyBkb2VzIG5vdCBzZWVtIHRvIHdvcmsgZnJvbSB0aGUgR1BVIG5vZGVzIG9uIHRoZSBIQ0MsIHNvIHdlIHdpbGwgZG93bmxvYWQgYSBzdGFibGUgdmVyc2lvbiBvZiBvdXIgY3VycmVudCBtb2RlbCBvcHRpb25zLiAtICpUaGlzIGZpbGUgbmVlZHMgdG8gYmUgdGhlIHBhdGggYmVsb3cgd2l0aGluIHlvdXIgd29ya2luZyBkaXJlY3RvcnkgZm9yIGl0IHRvIGF1dG9tYXRpY2FsbHkgYmUgbG9jYXRlZCBieSB0aGUgY29kZSBJIGhhdmUgd3JpdHRlbiBpbiBvdGhlciBzY3JpcHRzLiogIApZb3Ugc2hvdWxkIGF0IGxlYXN0IGRvd25sb2FkIHRoZSBuZXdlc3QgYHN1cGAgbW9kZWwgYXZhaWxhYmxlLCBidXQgeW91IG1heSBhbHNvIGRvd25sb2FkIHRoZSBuZXdlc3QgYGhhY2AgYW5kIGBmYXN0YCBtb2RlbHMgaWYgeW91IHdvdWxkIGxpa2UuIFRoZSBjb2RlIGluIG90aGVyIHNjcmlwdHMgd2lsbCBzZWFyY2ggdGhpcyBkaXJlY3RvcnkgZm9yIHdoaWNoZXZlciBvZiB0aGVzZSB0aHJlZSBtb2RlbHMgeW91IHNwZWNpZnkgYXQgdGhhdCB0aW1lLgoKUnVuIHRoZSBjaHVuayBiZWxvdyBhZnRlciByZXBsYWNpbmcgd2l0aCB0aGUgbW9kZWwgb2YgY2hvaWNlIChhbmQgeW91ciBkaXJlY3RvcnkgcGF0aHMpIGFuZCB0aGVuIHRyYW5zZmVyIHRoZSBmaWxlIGBiYXRjaF9zY3JpcHRzL2RvcmFkb19tb2RlbHMuc2hgIHRvIHlvdXIgcmVwbyBtaXJyb3Igb24gU3dhbiB3b3JrLgoKYGBge2NhdCwgZW5naW5lLm9wdHM9bGlzdChmaWxlPSdiYXRjaF9zY3JpcHRzL2RvcmFkb19zZXR1cC5zaCcpfQojIS9iaW4vYmFzaAojU0JBVENIIC0tam9iLW5hbWU9ZG9yYWRvX21vZGVsCiNTQkFUQ0ggLS1vdXRwdXQ9L3dvcmsvcmljaGxhYi9hbGljaWFyaWNoL3JlYWRfcHJvY2Vzc2luZy9sb2dzL2RvcmFkb19tb2RlbC4lai5vdXQKI1NCQVRDSCAtLWVycm9yPS93b3JrL3JpY2hsYWIvYWxpY2lhcmljaC9yZWFkX3Byb2Nlc3NpbmcvbG9ncy9kb3JhZG9fbW9kZWwuJWouZXJyCiNTQkFUQ0ggLS10aW1lPTAxOjAwOjAwCiNTQkFUQ0ggLS1ub2Rlcz0xCiNTQkFUQ0ggLS1udGFza3MtcGVyLW5vZGU9OAojU0JBVENIIC0tY29uc3RyYWludD0nZ3B1X3YxMDB8Z3B1X3Q0JwojU0JBVENIIC0tcGFydGl0aW9uPWdwdSxndWVzdF9ncHUKI1NCQVRDSCAtLWdyZXM9Z3B1OjIKI1NCQVRDSCAtLW1lbT0yMEdCCmBgYAoKCmBgYHtjYXQsIGVuZ2luZS5vcHRzPWxpc3QoZmlsZT0nYmF0Y2hfc2NyaXB0cy9kb3JhZG9fc2V0dXAuc2gnLCBhcHBlbmQ9VFJVRSl9Cm1vZHVsZSBsb2FkIGFwcHRhaW5lcgoKY2QgL3dvcmsvcmljaGxhYi9hbGljaWFyaWNoL3JlYWRfcHJvY2Vzc2luZwoKYXBwdGFpbmVyIGV4ZWMgZG9ja2VyOi8vbmFub3BvcmV0ZWNoL2RvcmFkbzpsYXRlc3QgZG9yYWRvIGRvd25sb2FkIC0tbW9kZWwgZG5hX3IxMC40LjFfZTguMl80MDBicHNfc3VwQHY1LjIuMCAtLWRpcmVjdG9yeSBkb3JhZG9fbW9kZWxzCgpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFfQpkb3dubG9hZF9maWxlKAogIHBhdGggPSAiYmF0Y2hfc2NyaXB0cy9kb3JhZG9fc2V0dXAuc2giLAogIG91dHB1dF9uYW1lICAgID0gImRvcmFkb19zZXR1cCIsCiAgYnV0dG9uX2xhYmVsICAgPSAiRG93bmxvYWQgU2NyaXB0IiwKICBidXR0b25fdHlwZSAgICA9ICJkYW5nZXIiLAogIGhhc19pY29uICAgICAgID0gVFJVRSwKICBpY29uICAgICAgICAgICA9ICJmYSBmYS1zYXZlIiwKICBzZWxmX2NvbnRhaW5lZCA9IFRSVUUKICAKKQpjYXQoCiAgIiMgYmF0Y2hfc2NyaXB0cy9kb3JhZG9fc2V0dXAuc2hcbiIsCiAgcmVhZF9saW5lcygiYmF0Y2hfc2NyaXB0cy9kb3JhZG9fc2V0dXAuc2giKSwgc2VwID0gIlxuIikKYGBgCgoKT25jZSB5b3UgZW5zdXJlIHRoaXMgc2NyaXB0IGhhcyB0cmFuc2ZlcnJlZCB0byB0aGUgYHJlYWRfcHJvY2Vzc2luZy9iYXRjaF9zY3JpcHRzYCBwYXRoIG9uIHlvdXIgSENDIGRpcmVjdG9yeSwgcnVuIHRoZSBjb2RlIGJlbG93IHRvIHN1Ym1pdCB0aGUgam9iLgoKYGBge3Rlcm1pbmFsLCBlY2hvPUZBTFNFfQpjZCByZWFkX3Byb2Nlc3NpbmcKc2JhdGNoIGJhdGNoX3NjcmlwdHMvZG9yYWRvX3NldHVwLnNoCmBgYAoKIyBDb21wcmVzc2lvbiBUb29scwoKYGBge3Rlcm1pbmFsLCBlY2hvPUZBTFNFfQptb2R1bGUgbG9hZCBhbmFjb25kYQoKY29uZGEgY3JlYXRlIC1uIHBpZ3ppcCBwaWd6PTIuOApgYGAKCiMjIFBST05BTUUgVXNhZ2UKCiMjIyBMb2NhbCBEb2NrZXIgSW1hZ2UKCmBgYHtjYXQsIGVuZ2luZS5vcHRzPWxpc3QoZmlsZT0nYmF0Y2hfc2NyaXB0cy9wcm9uYW1lX3NldHVwLnNoJyl9CiMhL2Jpbi9iYXNoCiNTQkFUQ0ggLS1qb2ItbmFtZT1wcm9uYW1lX3NldHVwCiNTQkFUQ0ggLS1vdXRwdXQ9L3dvcmsvcmljaGxhYi9hbGljaWFyaWNoL3JlYWRfcHJvY2Vzc2luZy9sb2dzL3Byb25hbWVfc2V0dXAuJWoub3V0CiNTQkFUQ0ggLS1lcnJvcj0vd29yay9yaWNobGFiL2FsaWNpYXJpY2gvcmVhZF9wcm9jZXNzaW5nL2xvZ3MvcHJvbmFtZV9zZXR1cC4lai5lcnIKI1NCQVRDSCAtLXRpbWU9MDE6MDA6MDAKI1NCQVRDSCAtLW5vZGVzPTEKI1NCQVRDSCAtLW50YXNrcz0xCiNTQkFUQ0ggLS1jcHVzLXBlci10YXNrPTgKI1NCQVRDSCAtLXBhcnRpdGlvbj1ndWVzdAojU0JBVENIIC0tbWVtPTEwMEdCCgpjZCAvd29yay9yaWNobGFiL2FsaWNpYXJpY2gvcmVhZF9wcm9jZXNzaW5nCgpta2RpciAtcCBjb250YWluZXJzCmNkIGNvbnRhaW5lcnMKCm1vZHVsZSBsb2FkIGFwcHRhaW5lcgoKYXBwdGFpbmVyIHB1bGwgZG9ja2VyOi8vYmVubjg4OC9wcm9uYW1lOnYyLjAuMS1hbWQ2NAoKYXBwdGFpbmVyIGluc3BlY3QgcHJvbmFtZV92Mi4wLjEtYW1kNjQuc2lmCgpgYGAKYGBge3IsIGVjaG89RkFMU0V9CmRvd25sb2FkX2ZpbGUoCiAgcGF0aCA9ICJiYXRjaF9zY3JpcHRzL3Byb25hbWVfc2V0dXAuc2giLAogIG91dHB1dF9uYW1lICAgID0gInByb25hbWVfc2V0dXAiLAogIGJ1dHRvbl9sYWJlbCAgID0gIkRvd25sb2FkIFNjcmlwdCIsCiAgYnV0dG9uX3R5cGUgICAgPSAiZGFuZ2VyIiwKICBoYXNfaWNvbiAgICAgICA9IFRSVUUsCiAgaWNvbiAgICAgICAgICAgPSAiZmEgZmEtc2F2ZSIsCiAgc2VsZl9jb250YWluZWQgPSBUUlVFCiAgCikKY2F0KAogICIjIGJhdGNoX3NjcmlwdHMvcHJvbmFtZV9zZXR1cC5zaFxuIiwKICByZWFkX2xpbmVzKCJiYXRjaF9zY3JpcHRzL3Byb25hbWVfc2V0dXAuc2giKSwgc2VwID0gIlxuIikKYGBgCgoKCg==