PCRプライマー

Operational taxonomic unit (OTU)

Amplicon sequence variant (ASV)

W1:解析データ

サンプルID DNA抽出キット 保存バッファ リード数
SRR6325813 QMINI Native 282517
SRR6325815 QMINI LysisBuffer 266259
SRR6325816 QMINI RNA-later 359984
SRR6325817 QMINI PBS 325660
SRR6325828 MOBIO RNA-later 206939
SRR6325829 MOBIO PBS 261767
SRR6325830 MOBIO Native 238627
SRR6325831 MOBIO LysisBuffer 225548
SRR6325859 GENIAL LysisBuffer 290383
SRR6325860 GENIAL Native 253908
SRR6325861 GENIAL PBS 120789
SRR6325862 GENIAL RNA-later 258792
  • W1.4:For20200428LectureDADA2.tar.gz
    表2で示されている12サンプル分のリードファイルをまとめたものです。PCR増幅は515F-806Rプライマーで行い、増幅された300 bp弱のアンプリコンをIllumina MiSeqのペア―ドエンド(250 bp×2)で得たリードです。1サンプルにつき、Forward側のファイル(*_1.fastq)とReverse側のファイル(*_2.fastq)の2つのファイルが得られますので、合計24ファイルで構成されます。

DADA2のインストール

W2:インストール実行

if (!requireNamespace("BiocManager", quietly=T))
    install.packages("BiocManager")
BiocManager::install("dada2", update=F)

W3:パッケージのロード

library(dada2)

W4:list.files関数

W4.1:基本形とpathオプション

list.files関数は、指定したディレクトリ内にあるファイル情報を得るためのものです。1つ目のコマンドは、オプションを全てデフォルトで実行する場合です。2つ目は、表示させたい場所を指定するためのpathオプションのデフォルト”.”を明示しただけです。両者は同じ結果になります。

list.files()
##  [1] "JSLAB23.html"       "JSLAB23.Rmd"        "SRR6325813_1.fastq"
##  [4] "SRR6325813_2.fastq" "SRR6325815_1.fastq" "SRR6325815_2.fastq"
##  [7] "SRR6325816_1.fastq" "SRR6325816_2.fastq" "SRR6325817_1.fastq"
## [10] "SRR6325817_2.fastq" "SRR6325828_1.fastq" "SRR6325828_2.fastq"
## [13] "SRR6325829_1.fastq" "SRR6325829_2.fastq" "SRR6325830_1.fastq"
## [16] "SRR6325830_2.fastq" "SRR6325831_1.fastq" "SRR6325831_2.fastq"
## [19] "SRR6325859_1.fastq" "SRR6325859_2.fastq" "SRR6325860_1.fastq"
## [22] "SRR6325860_2.fastq" "SRR6325861_1.fastq" "SRR6325861_2.fastq"
## [25] "SRR6325862_1.fastq" "SRR6325862_2.fastq"
list.files(path = ".")
##  [1] "JSLAB23.html"       "JSLAB23.Rmd"        "SRR6325813_1.fastq"
##  [4] "SRR6325813_2.fastq" "SRR6325815_1.fastq" "SRR6325815_2.fastq"
##  [7] "SRR6325816_1.fastq" "SRR6325816_2.fastq" "SRR6325817_1.fastq"
## [10] "SRR6325817_2.fastq" "SRR6325828_1.fastq" "SRR6325828_2.fastq"
## [13] "SRR6325829_1.fastq" "SRR6325829_2.fastq" "SRR6325830_1.fastq"
## [16] "SRR6325830_2.fastq" "SRR6325831_1.fastq" "SRR6325831_2.fastq"
## [19] "SRR6325859_1.fastq" "SRR6325859_2.fastq" "SRR6325860_1.fastq"
## [22] "SRR6325860_2.fastq" "SRR6325861_1.fastq" "SRR6325861_2.fastq"
## [25] "SRR6325862_1.fastq" "SRR6325862_2.fastq"

W4.2:patternオプション(相対パス)

patternオプションをつけることで、任意の文字列を含むファイルのみに限定することができます。以下は"_1.fastq"という文字を指定して、Forward側に限定するやり方です。1つ目のコマンドは、pathオプションを明示せずデフォルトで実行した結果です。2つ目のコマンドは、pathオプションのデフォルト”.”を明示しただけです。両者は同じ結果になります。

list.files(pattern = "_1.fastq")
##  [1] "SRR6325813_1.fastq" "SRR6325815_1.fastq" "SRR6325816_1.fastq"
##  [4] "SRR6325817_1.fastq" "SRR6325828_1.fastq" "SRR6325829_1.fastq"
##  [7] "SRR6325830_1.fastq" "SRR6325831_1.fastq" "SRR6325859_1.fastq"
## [10] "SRR6325860_1.fastq" "SRR6325861_1.fastq" "SRR6325862_1.fastq"
list.files(pattern = "_1.fastq", path = ".")
##  [1] "SRR6325813_1.fastq" "SRR6325815_1.fastq" "SRR6325816_1.fastq"
##  [4] "SRR6325817_1.fastq" "SRR6325828_1.fastq" "SRR6325829_1.fastq"
##  [7] "SRR6325830_1.fastq" "SRR6325831_1.fastq" "SRR6325859_1.fastq"
## [10] "SRR6325860_1.fastq" "SRR6325861_1.fastq" "SRR6325862_1.fastq"

W4.3:patternオプション(絶対パス)

現在のディレクトリの場所を表示するgetwd関数実行結果(つまり絶対パス情報)をbashoというオブジェクトに格納し、それをlist.files関数のpathオプションに与えています。

basho <- getwd()
basho
## [1] "C:/Users/kadota/Desktop/dataset"
list.files(pattern = "_1.fastq", path = basho)
##  [1] "SRR6325813_1.fastq" "SRR6325815_1.fastq" "SRR6325816_1.fastq"
##  [4] "SRR6325817_1.fastq" "SRR6325828_1.fastq" "SRR6325829_1.fastq"
##  [7] "SRR6325830_1.fastq" "SRR6325831_1.fastq" "SRR6325859_1.fastq"
## [10] "SRR6325860_1.fastq" "SRR6325861_1.fastq" "SRR6325862_1.fastq"

W4.4:full.namesオプション

full.namesオプションをTRUEにすると、pathオプションで指定したパス情報を含めたファイル名になります。1つ目のコマンドが相対パス、2つ目のコマンドが絶対パスになります。

list.files(pattern = "_1.fastq", path = ".", full.names = TRUE)
##  [1] "./SRR6325813_1.fastq" "./SRR6325815_1.fastq" "./SRR6325816_1.fastq"
##  [4] "./SRR6325817_1.fastq" "./SRR6325828_1.fastq" "./SRR6325829_1.fastq"
##  [7] "./SRR6325830_1.fastq" "./SRR6325831_1.fastq" "./SRR6325859_1.fastq"
## [10] "./SRR6325860_1.fastq" "./SRR6325861_1.fastq" "./SRR6325862_1.fastq"
list.files(pattern = "_1.fastq", path = basho, full.names = TRUE)
##  [1] "C:/Users/kadota/Desktop/dataset/SRR6325813_1.fastq"
##  [2] "C:/Users/kadota/Desktop/dataset/SRR6325815_1.fastq"
##  [3] "C:/Users/kadota/Desktop/dataset/SRR6325816_1.fastq"
##  [4] "C:/Users/kadota/Desktop/dataset/SRR6325817_1.fastq"
##  [5] "C:/Users/kadota/Desktop/dataset/SRR6325828_1.fastq"
##  [6] "C:/Users/kadota/Desktop/dataset/SRR6325829_1.fastq"
##  [7] "C:/Users/kadota/Desktop/dataset/SRR6325830_1.fastq"
##  [8] "C:/Users/kadota/Desktop/dataset/SRR6325831_1.fastq"
##  [9] "C:/Users/kadota/Desktop/dataset/SRR6325859_1.fastq"
## [10] "C:/Users/kadota/Desktop/dataset/SRR6325860_1.fastq"
## [11] "C:/Users/kadota/Desktop/dataset/SRR6325861_1.fastq"
## [12] "C:/Users/kadota/Desktop/dataset/SRR6325862_1.fastq"

W5:文字列操作

W5.1 basename関数(相対パスの場合)

basename関数は、パス情報を含むファイル名の文字列ベクトルを入力として、パス情報を含まないファイル名の文字列ベクトルを得る際に用いられます。

fnFs <- list.files(pattern = "_1.fastq", path = ".", full.names = TRUE)
fnFs
##  [1] "./SRR6325813_1.fastq" "./SRR6325815_1.fastq" "./SRR6325816_1.fastq"
##  [4] "./SRR6325817_1.fastq" "./SRR6325828_1.fastq" "./SRR6325829_1.fastq"
##  [7] "./SRR6325830_1.fastq" "./SRR6325831_1.fastq" "./SRR6325859_1.fastq"
## [10] "./SRR6325860_1.fastq" "./SRR6325861_1.fastq" "./SRR6325862_1.fastq"
basename(fnFs)
##  [1] "SRR6325813_1.fastq" "SRR6325815_1.fastq" "SRR6325816_1.fastq"
##  [4] "SRR6325817_1.fastq" "SRR6325828_1.fastq" "SRR6325829_1.fastq"
##  [7] "SRR6325830_1.fastq" "SRR6325831_1.fastq" "SRR6325859_1.fastq"
## [10] "SRR6325860_1.fastq" "SRR6325861_1.fastq" "SRR6325862_1.fastq"

W5.2 basename関数(絶対パスの場合)

basename関数は、パス情報を含むファイル名の文字列ベクトルを入力として、パス情報を含まないファイル名の文字列ベクトルを得る際に用いられます。

basho <- getwd()
fnFs <- list.files(pattern = "_1.fastq", path = basho, full.names = TRUE)
fnFs
##  [1] "C:/Users/kadota/Desktop/dataset/SRR6325813_1.fastq"
##  [2] "C:/Users/kadota/Desktop/dataset/SRR6325815_1.fastq"
##  [3] "C:/Users/kadota/Desktop/dataset/SRR6325816_1.fastq"
##  [4] "C:/Users/kadota/Desktop/dataset/SRR6325817_1.fastq"
##  [5] "C:/Users/kadota/Desktop/dataset/SRR6325828_1.fastq"
##  [6] "C:/Users/kadota/Desktop/dataset/SRR6325829_1.fastq"
##  [7] "C:/Users/kadota/Desktop/dataset/SRR6325830_1.fastq"
##  [8] "C:/Users/kadota/Desktop/dataset/SRR6325831_1.fastq"
##  [9] "C:/Users/kadota/Desktop/dataset/SRR6325859_1.fastq"
## [10] "C:/Users/kadota/Desktop/dataset/SRR6325860_1.fastq"
## [11] "C:/Users/kadota/Desktop/dataset/SRR6325861_1.fastq"
## [12] "C:/Users/kadota/Desktop/dataset/SRR6325862_1.fastq"
basename(fnFs)
##  [1] "SRR6325813_1.fastq" "SRR6325815_1.fastq" "SRR6325816_1.fastq"
##  [4] "SRR6325817_1.fastq" "SRR6325828_1.fastq" "SRR6325829_1.fastq"
##  [7] "SRR6325830_1.fastq" "SRR6325831_1.fastq" "SRR6325859_1.fastq"
## [10] "SRR6325860_1.fastq" "SRR6325861_1.fastq" "SRR6325862_1.fastq"

W5.3 strsplit関数

strsplit関数は、文字列ベクトルを入力として、任意の区切り文字で文字列を分割した結果をリスト形式で返します。

basename(fnFs)
##  [1] "SRR6325813_1.fastq" "SRR6325815_1.fastq" "SRR6325816_1.fastq"
##  [4] "SRR6325817_1.fastq" "SRR6325828_1.fastq" "SRR6325829_1.fastq"
##  [7] "SRR6325830_1.fastq" "SRR6325831_1.fastq" "SRR6325859_1.fastq"
## [10] "SRR6325860_1.fastq" "SRR6325861_1.fastq" "SRR6325862_1.fastq"
strsplit(x = basename(fnFs), split = "_")
## [[1]]
## [1] "SRR6325813" "1.fastq"   
## 
## [[2]]
## [1] "SRR6325815" "1.fastq"   
## 
## [[3]]
## [1] "SRR6325816" "1.fastq"   
## 
## [[4]]
## [1] "SRR6325817" "1.fastq"   
## 
## [[5]]
## [1] "SRR6325828" "1.fastq"   
## 
## [[6]]
## [1] "SRR6325829" "1.fastq"   
## 
## [[7]]
## [1] "SRR6325830" "1.fastq"   
## 
## [[8]]
## [1] "SRR6325831" "1.fastq"   
## 
## [[9]]
## [1] "SRR6325859" "1.fastq"   
## 
## [[10]]
## [1] "SRR6325860" "1.fastq"   
## 
## [[11]]
## [1] "SRR6325861" "1.fastq"   
## 
## [[12]]
## [1] "SRR6325862" "1.fastq"

W5.4 sapply関数

sapply関数は、リスト形式のオブジェクトに対して逐次的な処理を行いたい場合に用いられます。ここでは、さきほどのstrsplit実行結果をhogeというオブジェクトに一旦格納したのち、それをsapply関数の入力として用いています。出力結果は、表2のサンプルIDに相当します。

hoge <- strsplit(x = basename(fnFs), split = "_")
sapply(X = hoge, FUN = `[`, 1)
##  [1] "SRR6325813" "SRR6325815" "SRR6325816" "SRR6325817" "SRR6325828"
##  [6] "SRR6325829" "SRR6325830" "SRR6325831" "SRR6325859" "SRR6325860"
## [11] "SRR6325861" "SRR6325862"

W5.5 paste0関数

paste0関数は、文字列同士の連結を行いたいときに用います。ここでは、さきほどのsapply実行結果をsampleIDというオブジェクトに一旦格納したのち、それをpaste0関数の入力として用いています。文字列ベクトルであるsampleIDの各要素の右側に”_F_filt.fastq”という文字列を連結させています。ここまでが、なんらかの処理実行結果を出力させるための任意のファイル名を生成する基本形です。

sampleID <- sapply(X = hoge, FUN = `[`, 1)
paste0(sampleID, "_F_filt.fastq")
##  [1] "SRR6325813_F_filt.fastq" "SRR6325815_F_filt.fastq"
##  [3] "SRR6325816_F_filt.fastq" "SRR6325817_F_filt.fastq"
##  [5] "SRR6325828_F_filt.fastq" "SRR6325829_F_filt.fastq"
##  [7] "SRR6325830_F_filt.fastq" "SRR6325831_F_filt.fastq"
##  [9] "SRR6325859_F_filt.fastq" "SRR6325860_F_filt.fastq"
## [11] "SRR6325861_F_filt.fastq" "SRR6325862_F_filt.fastq"

W5.6 paste関数

paste関数は、文字列同士の連結を行いたいときに用います。paste0関数と基本的に同じですが、paste関数のほうが間に挟む文字(区切り文字)を指定できる点が異なります。paste関数のデフォルトは、区切り文字を指定するsepオプションの値がスペース(" ")です。従って、paste0関数は、paste関数をsep = ""オプションをつけて実行することと同義です。

sampleID <- sapply(X = hoge, FUN = `[`, 1)
paste(sampleID, "_F_filt.fastq")
##  [1] "SRR6325813 _F_filt.fastq" "SRR6325815 _F_filt.fastq"
##  [3] "SRR6325816 _F_filt.fastq" "SRR6325817 _F_filt.fastq"
##  [5] "SRR6325828 _F_filt.fastq" "SRR6325829 _F_filt.fastq"
##  [7] "SRR6325830 _F_filt.fastq" "SRR6325831 _F_filt.fastq"
##  [9] "SRR6325859 _F_filt.fastq" "SRR6325860 _F_filt.fastq"
## [11] "SRR6325861 _F_filt.fastq" "SRR6325862 _F_filt.fastq"
paste(sampleID, "_F_filt.fastq", sep = "")
##  [1] "SRR6325813_F_filt.fastq" "SRR6325815_F_filt.fastq"
##  [3] "SRR6325816_F_filt.fastq" "SRR6325817_F_filt.fastq"
##  [5] "SRR6325828_F_filt.fastq" "SRR6325829_F_filt.fastq"
##  [7] "SRR6325830_F_filt.fastq" "SRR6325831_F_filt.fastq"
##  [9] "SRR6325859_F_filt.fastq" "SRR6325860_F_filt.fastq"
## [11] "SRR6325861_F_filt.fastq" "SRR6325862_F_filt.fastq"

W5.7 file.path関数

file.path関数は、ファイルのパス情報をうまく生成したいときに用います。ここでは、現在のディレクトリ直下に”processed”というディレクトリを作成し、その中に先ほどのpaste0実行結果に相当する処理後のファイル名を連結させたものを作成します。

basho <- getwd()
fnFs <- list.files(pattern = "_1.fastq", path = basho, full.names = TRUE)
hoge <- strsplit(x = basename(fnFs), split = "_")
sampleID <- sapply(X = hoge, FUN = `[`, 1)
filtFs <- file.path(basho, "processed", paste0(sampleID, "_F_filt.fastq"))
filtFs
##  [1] "C:/Users/kadota/Desktop/dataset/processed/SRR6325813_F_filt.fastq"
##  [2] "C:/Users/kadota/Desktop/dataset/processed/SRR6325815_F_filt.fastq"
##  [3] "C:/Users/kadota/Desktop/dataset/processed/SRR6325816_F_filt.fastq"
##  [4] "C:/Users/kadota/Desktop/dataset/processed/SRR6325817_F_filt.fastq"
##  [5] "C:/Users/kadota/Desktop/dataset/processed/SRR6325828_F_filt.fastq"
##  [6] "C:/Users/kadota/Desktop/dataset/processed/SRR6325829_F_filt.fastq"
##  [7] "C:/Users/kadota/Desktop/dataset/processed/SRR6325830_F_filt.fastq"
##  [8] "C:/Users/kadota/Desktop/dataset/processed/SRR6325831_F_filt.fastq"
##  [9] "C:/Users/kadota/Desktop/dataset/processed/SRR6325859_F_filt.fastq"
## [10] "C:/Users/kadota/Desktop/dataset/processed/SRR6325860_F_filt.fastq"
## [11] "C:/Users/kadota/Desktop/dataset/processed/SRR6325861_F_filt.fastq"
## [12] "C:/Users/kadota/Desktop/dataset/processed/SRR6325862_F_filt.fastq"

一見するとfile.path関数の有用性がわかりにくいヒトは、以下で示すようなfile.pathの部分をpaste0に置き換えた結果と比較すると納得できると思います。つまり、file.pathのほうがスラッシュ(/)をうまく挿入してくれます。

paste0(basho, "processed", paste0(sampleID, "_F_filt.fastq"))
##  [1] "C:/Users/kadota/Desktop/datasetprocessedSRR6325813_F_filt.fastq"
##  [2] "C:/Users/kadota/Desktop/datasetprocessedSRR6325815_F_filt.fastq"
##  [3] "C:/Users/kadota/Desktop/datasetprocessedSRR6325816_F_filt.fastq"
##  [4] "C:/Users/kadota/Desktop/datasetprocessedSRR6325817_F_filt.fastq"
##  [5] "C:/Users/kadota/Desktop/datasetprocessedSRR6325828_F_filt.fastq"
##  [6] "C:/Users/kadota/Desktop/datasetprocessedSRR6325829_F_filt.fastq"
##  [7] "C:/Users/kadota/Desktop/datasetprocessedSRR6325830_F_filt.fastq"
##  [8] "C:/Users/kadota/Desktop/datasetprocessedSRR6325831_F_filt.fastq"
##  [9] "C:/Users/kadota/Desktop/datasetprocessedSRR6325859_F_filt.fastq"
## [10] "C:/Users/kadota/Desktop/datasetprocessedSRR6325860_F_filt.fastq"
## [11] "C:/Users/kadota/Desktop/datasetprocessedSRR6325861_F_filt.fastq"
## [12] "C:/Users/kadota/Desktop/datasetprocessedSRR6325862_F_filt.fastq"

file.path関数の代わりに、sep = "/"オプションをつけてpaste関数を実行しても構いません。

paste(basho, "processed", paste0(sampleID, "_F_filt.fastq"), sep = "/")
##  [1] "C:/Users/kadota/Desktop/dataset/processed/SRR6325813_F_filt.fastq"
##  [2] "C:/Users/kadota/Desktop/dataset/processed/SRR6325815_F_filt.fastq"
##  [3] "C:/Users/kadota/Desktop/dataset/processed/SRR6325816_F_filt.fastq"
##  [4] "C:/Users/kadota/Desktop/dataset/processed/SRR6325817_F_filt.fastq"
##  [5] "C:/Users/kadota/Desktop/dataset/processed/SRR6325828_F_filt.fastq"
##  [6] "C:/Users/kadota/Desktop/dataset/processed/SRR6325829_F_filt.fastq"
##  [7] "C:/Users/kadota/Desktop/dataset/processed/SRR6325830_F_filt.fastq"
##  [8] "C:/Users/kadota/Desktop/dataset/processed/SRR6325831_F_filt.fastq"
##  [9] "C:/Users/kadota/Desktop/dataset/processed/SRR6325859_F_filt.fastq"
## [10] "C:/Users/kadota/Desktop/dataset/processed/SRR6325860_F_filt.fastq"
## [11] "C:/Users/kadota/Desktop/dataset/processed/SRR6325861_F_filt.fastq"
## [12] "C:/Users/kadota/Desktop/dataset/processed/SRR6325862_F_filt.fastq"

W5.8 names関数

これは少しわかりにくい概念ですが、names関数はベクトルの各要素に名前をつけたいときに用います。実際取り扱うのはForward側とReverse側の両方ですが、通常これらはペアとして取り扱います。それゆえ、対応する要素の中身の文字列(つまりファイル名)で異なっていたとしても、要素につけられた名前を一致させておくことでペアとして認識させることができるメリットがあります。ここでは、要素につける名前としてサンプルID(オブジェクト名としてはsampleID)を割り当てています。

filtFs
##  [1] "C:/Users/kadota/Desktop/dataset/processed/SRR6325813_F_filt.fastq"
##  [2] "C:/Users/kadota/Desktop/dataset/processed/SRR6325815_F_filt.fastq"
##  [3] "C:/Users/kadota/Desktop/dataset/processed/SRR6325816_F_filt.fastq"
##  [4] "C:/Users/kadota/Desktop/dataset/processed/SRR6325817_F_filt.fastq"
##  [5] "C:/Users/kadota/Desktop/dataset/processed/SRR6325828_F_filt.fastq"
##  [6] "C:/Users/kadota/Desktop/dataset/processed/SRR6325829_F_filt.fastq"
##  [7] "C:/Users/kadota/Desktop/dataset/processed/SRR6325830_F_filt.fastq"
##  [8] "C:/Users/kadota/Desktop/dataset/processed/SRR6325831_F_filt.fastq"
##  [9] "C:/Users/kadota/Desktop/dataset/processed/SRR6325859_F_filt.fastq"
## [10] "C:/Users/kadota/Desktop/dataset/processed/SRR6325860_F_filt.fastq"
## [11] "C:/Users/kadota/Desktop/dataset/processed/SRR6325861_F_filt.fastq"
## [12] "C:/Users/kadota/Desktop/dataset/processed/SRR6325862_F_filt.fastq"
names(filtFs) <- sampleID
filtFs
##                                                          SRR6325813 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325813_F_filt.fastq" 
##                                                          SRR6325815 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325815_F_filt.fastq" 
##                                                          SRR6325816 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325816_F_filt.fastq" 
##                                                          SRR6325817 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325817_F_filt.fastq" 
##                                                          SRR6325828 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325828_F_filt.fastq" 
##                                                          SRR6325829 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325829_F_filt.fastq" 
##                                                          SRR6325830 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325830_F_filt.fastq" 
##                                                          SRR6325831 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325831_F_filt.fastq" 
##                                                          SRR6325859 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325859_F_filt.fastq" 
##                                                          SRR6325860 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325860_F_filt.fastq" 
##                                                          SRR6325861 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325861_F_filt.fastq" 
##                                                          SRR6325862 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325862_F_filt.fastq"

W6 入出力ファイルの作成

W6.1 絶対パスの場合

ここまではForward側のファイルのみでしたので、Reverse側も含めて全体をまとめて実行するスクリプトを示します。スクリプトに本当は不要な部分も含まれますが、Forward側とReverse側ともに同じように記載することを優先させています。filtFsfiltRsが前処理後のファイルの絶対パス情報になります。

basho <- getwd()
# Forward側
fnFs <- list.files(pattern = "_1.fastq", path = basho, full.names = TRUE)
hoge <- strsplit(x = basename(fnFs), split = "_")
sampleID <- sapply(X = hoge, FUN = `[`, 1)
filtFs <- file.path(basho, "processed", paste0(sampleID, "_F_filt.fastq"))
names(filtFs) <- sampleID
filtFs
##                                                          SRR6325813 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325813_F_filt.fastq" 
##                                                          SRR6325815 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325815_F_filt.fastq" 
##                                                          SRR6325816 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325816_F_filt.fastq" 
##                                                          SRR6325817 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325817_F_filt.fastq" 
##                                                          SRR6325828 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325828_F_filt.fastq" 
##                                                          SRR6325829 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325829_F_filt.fastq" 
##                                                          SRR6325830 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325830_F_filt.fastq" 
##                                                          SRR6325831 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325831_F_filt.fastq" 
##                                                          SRR6325859 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325859_F_filt.fastq" 
##                                                          SRR6325860 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325860_F_filt.fastq" 
##                                                          SRR6325861 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325861_F_filt.fastq" 
##                                                          SRR6325862 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325862_F_filt.fastq"
# Reverse側
fnRs <- list.files(pattern = "_2.fastq", path = basho, full.names = TRUE)
hoge <- strsplit(x = basename(fnRs), split = "_")
sampleID <- sapply(X = hoge, FUN = `[`, 1)
filtRs <- file.path(basho, "processed", paste0(sampleID, "_R_filt.fastq"))
names(filtRs) <- sampleID
filtRs
##                                                          SRR6325813 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325813_R_filt.fastq" 
##                                                          SRR6325815 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325815_R_filt.fastq" 
##                                                          SRR6325816 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325816_R_filt.fastq" 
##                                                          SRR6325817 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325817_R_filt.fastq" 
##                                                          SRR6325828 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325828_R_filt.fastq" 
##                                                          SRR6325829 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325829_R_filt.fastq" 
##                                                          SRR6325830 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325830_R_filt.fastq" 
##                                                          SRR6325831 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325831_R_filt.fastq" 
##                                                          SRR6325859 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325859_R_filt.fastq" 
##                                                          SRR6325860 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325860_R_filt.fastq" 
##                                                          SRR6325861 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325861_R_filt.fastq" 
##                                                          SRR6325862 
## "C:/Users/kadota/Desktop/dataset/processed/SRR6325862_R_filt.fastq"

W6.2 相対パスの場合

basho <- "."
# Forward側
fnFs <- list.files(pattern = "_1.fastq", path = basho, full.names = TRUE)
hoge <- strsplit(x = basename(fnFs), split = "_")
sampleID <- sapply(X = hoge, FUN = `[`, 1)
filtFs <- file.path(basho, "processed", paste0(sampleID, "_F_filt.fastq"))
names(filtFs) <- sampleID
filtFs
##                            SRR6325813                            SRR6325815 
## "./processed/SRR6325813_F_filt.fastq" "./processed/SRR6325815_F_filt.fastq" 
##                            SRR6325816                            SRR6325817 
## "./processed/SRR6325816_F_filt.fastq" "./processed/SRR6325817_F_filt.fastq" 
##                            SRR6325828                            SRR6325829 
## "./processed/SRR6325828_F_filt.fastq" "./processed/SRR6325829_F_filt.fastq" 
##                            SRR6325830                            SRR6325831 
## "./processed/SRR6325830_F_filt.fastq" "./processed/SRR6325831_F_filt.fastq" 
##                            SRR6325859                            SRR6325860 
## "./processed/SRR6325859_F_filt.fastq" "./processed/SRR6325860_F_filt.fastq" 
##                            SRR6325861                            SRR6325862 
## "./processed/SRR6325861_F_filt.fastq" "./processed/SRR6325862_F_filt.fastq"
# Reverse側
fnRs <- list.files(pattern = "_2.fastq", path = basho, full.names = TRUE)
hoge <- strsplit(x = basename(fnRs), split = "_")
sampleID <- sapply(X = hoge, FUN = `[`, 1)
filtRs <- file.path(basho, "processed", paste0(sampleID, "_R_filt.fastq"))
names(filtRs) <- sampleID
filtRs
##                            SRR6325813                            SRR6325815 
## "./processed/SRR6325813_R_filt.fastq" "./processed/SRR6325815_R_filt.fastq" 
##                            SRR6325816                            SRR6325817 
## "./processed/SRR6325816_R_filt.fastq" "./processed/SRR6325817_R_filt.fastq" 
##                            SRR6325828                            SRR6325829 
## "./processed/SRR6325828_R_filt.fastq" "./processed/SRR6325829_R_filt.fastq" 
##                            SRR6325830                            SRR6325831 
## "./processed/SRR6325830_R_filt.fastq" "./processed/SRR6325831_R_filt.fastq" 
##                            SRR6325859                            SRR6325860 
## "./processed/SRR6325859_R_filt.fastq" "./processed/SRR6325860_R_filt.fastq" 
##                            SRR6325861                            SRR6325862 
## "./processed/SRR6325861_R_filt.fastq" "./processed/SRR6325862_R_filt.fastq"
LS0tDQp0aXRsZTogIlvnrKwyM+Wbnl0oaHR0cHM6Ly93d3cuaXUuYS51LXRva3lvLmFjLmpwL2thZG90YS9yX3NlcTIuaHRtbCNib29rX0pTTEFCXzIzKeOBruOCpuOCp+ODluizh+aWmSINCmRhdGU6ICfmnIDntYLmm7TmlrA6IGByIGZvcm1hdChTeXMuRGF0ZSgpLCAiJVkvJW0vJWQiKWAnDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCi0tLQ0KYGBge3Iga2xpcHB5LCBlY2hvPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQprbGlwcHk6OmtsaXBweSgpDQpgYGANCg0KIyDjga/jgZjjgoHjgasNCiAgLSBb5Lmz6YW46I+MTkdT6YCj6LyJ56ysMjLlm57jga5QREZdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvSlNMQUJfMjJfa2Fkb3RhLnBkZikNCiAgLSBbSlNMQUIyMy5SbWRdKGh0dHBzOi8vd3d3Lml1LmEudS10b2t5by5hYy5qcC9rYWRvdGEvYm9vay9KU0xBQjIzLlJtZCkgIA0KDQojIFBDUuODl+ODqeOCpOODnuODvA0KDQojIE9wZXJhdGlvbmFsIHRheG9ub21pYyB1bml0IChPVFUpDQogIC0gW1lhcnphIGV0IGFsLiwgTmF0IFJldiBNaWNyb2Jpb2wNCi4sIDIwMTRdKGh0dHBzOi8vcHVibWVkLm5jYmkubmxtLm5paC5nb3YvMjUxMTg4ODUvKSAgDQogIC0gW01BUHNlcV0oaHR0cHM6Ly9naXRodWIuY29tL2pmbXJvZC9tYXBzZXEp77yaW01hdGlhcyBSb2RyaWd1ZXMgZXQgYWwuLCBCaW9pbmZvcm1hdGljcywgMjAxN10oaHR0cHM6Ly9wdWJtZWQubmNiaS5ubG0ubmloLmdvdi8yODk2MTkyNi8pICANCuOCr+ODqeOCueOCv+ODquODs+OCsOOCkuihjOOCj+OBmuOBq+ebtOaOpee1seWJsuOCiuW9k+OBpuOCkuihjOOBhuOCouODl+ODreODvOODgeOBp+OBmeOAgiAgDQogIC0gW1ZJVENPTUlDMl0oaHR0cDovL3ZpdGNvbWljLm9yZy8p77yaW01vcmkgZXQgYWwuLCBCTUMgU3lzdCBCaW9sLiwgMjAxOF0oaHR0cHM6Ly9wdWJtZWQubmNiaS5ubG0ubmloLmdvdi8yOTU2MDgyMS8pICANCuOCr+ODqeOCueOCv+ODquODs+OCsOOCkuihjOOCj+OBmuOBq+ebtOaOpee1seWJsuOCiuW9k+OBpuOCkuihjOOBhuOCouODl+ODreODvOODgeOBp+OBmeOAgiANCiAgLSBbU0lMVkFdKGh0dHA6Ly93d3cuYXJiLXNpbHZhLmRlKe+8mltRdWFzdCBldCBhbC4sIE51Y2xlaWMgQWNpZHMgUmVzLiwgMjAxM10oaHR0cHM6Ly9wdWJtZWQubmNiaS5ubG0ubmloLmdvdi8yMzE5MzI4My8pICANCjE2UyByUk5B44Gu44Oq44OV44Kh44Os44Oz44K544OH44O844K/44OZ44O844K544Gn44GZ44CCICANCg0KIyBBbXBsaWNvbiBzZXF1ZW5jZSB2YXJpYW50IChBU1YpDQogIC0gW0RBREEyXShodHRwczovL2Jpb2NvbmR1Y3Rvci5vcmcvcGFja2FnZXMvcmVsZWFzZS9iaW9jL2h0bWwvZGFkYTIuaHRtbCnvvJpbQ2FsbGFoYW4gZXQgYWwuLCBOYXQgTWV0aG9kcywgMjAxNl0oaHR0cHM6Ly9wdWJtZWQubmNiaS5ubG0ubmloLmdvdi8yNzIxNDA0Ny8pICANCuODjuOCpOOCuumZpOWOu+OBqOmHjeikh+mZpOWOu++8iGRlbm9pc2luZyAmIGRlcmVwbGljYXRpb27vvInjgpLooYzjgaPjgZ/lvozjgIHns7vntbHlibLjgorlvZPjgabjgpLooYzjgYbjgqLjg5fjg63jg7zjg4HjgafjgZnjgIIgIA0KICAtIFtEZWJsdXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9iaW9jb3JlL2RlYmx1cinvvJpbQW1pciBldCBhbC4sIG1TeXN0ZW1zLCAyMDE3XShodHRwczovL3B1Ym1lZC5uY2JpLm5sbS5uaWguZ292LzI4Mjg5NzMxLykgIA0KICDjg47jgqTjgrrpmaTljrvjgajph43opIfpmaTljrvvvIhkZW5vaXNpbmcgJiBkZXJlcGxpY2F0aW9u77yJ44KS6KGM44Gj44Gf5b6M44CB57O757Wx5Ymy44KK5b2T44Gm44KS6KGM44GG44Ki44OX44Ot44O844OB44Gn44GZ44CCIA0KDQojIFcx77ya6Kej5p6Q44OH44O844K/DQotIFvjg5Ljg4jjg57jgqTjgq/jg63jg5DjgqTjgqrjg7zjg6DoqIjnlLsoSHVtYW4gTWljcm9iaW9tZSBQcm9qZWN0OyBITVApXShodHRwczovL3d3dy5obXBkYWNjLm9yZy8pICANCltOSUhdKGh0dHBzOi8vd3d3Lm5paC5nb3YvKeS4u+WwjuOBruODl+ODreOCuOOCp+OCr+ODiOOBp+OBmeOAgiAgDQotIFcxLjHvvJpbSE0tMjgwXShodHRwczovL3d3dy5iZWlyZXNvdXJjZXMub3JnL0NhdGFsb2cvb3RoZXJQcm9kdWN0cy9ITS0yODAuYXNweCkgKFtHZXZlcnMgZXQgYWwuLCBQTG9TIENvbXB1dCBCaW9sLiwgMjAxMl0oaHR0cHM6Ly9wdWJtZWQubmNiaS5ubG0ubmloLmdvdi8yMzIwOTM4OS8pKSAgDQrooagx44Gu5YaF5a6544Gv44CBW0hhbGxtYWllci1XYWNrZXIgZXQgYWwuLCBTY2kgUmVwLiwgMjAxOF0oaHR0cHM6Ly9wdWJtZWQubmNiaS5ubG0ubmloLmdvdi8yOTY3NDY0MS8p44GuW1RhYmxlIFMxXShodHRwczovL3N0YXRpYy1jb250ZW50LnNwcmluZ2VyLmNvbS9lc20vYXJ0JTNBMTAuMTAzOCUyRnM0MTU5OC0wMTgtMjQ1NzMteS9NZWRpYU9iamVjdHMvNDE1OThfMjAxOF8yNDU3M19NT0VTTTFfRVNNLnBkZinjgIHjgYrjgojjgbNbSE0tMjgwXShodHRwczovL3d3dy5iZWlyZXNvdXJjZXMub3JnL0NhdGFsb2cvb3RoZXJQcm9kdWN0cy9ITS0yODAuYXNweCnjga7jg5rjg7zjgrjlhoXjgavjgYLjgotbUHJvZHVjdCBJbmZvcm1hdGlvbiBTaGVldF0oaHR0cHM6Ly93d3cuYmVpcmVzb3VyY2VzLm9yZy9Qcm9kdWN0SW5mb3JtYXRpb25TaGVldC90YWJpZC83ODQvRGVmYXVsdC5hc3B4P2RvYz0zODkyOS5wZGYp44GL44KJ5qeL5oiQ44GV44KM44Gm44GE44G+44GZ44CCICANCi0gVzEuMu+8mltQcm9kdWN0IEluZm9ybWF0aW9uIFNoZWV0XShodHRwczovL3d3dy5iZWlyZXNvdXJjZXMub3JnL1Byb2R1Y3RJbmZvcm1hdGlvblNoZWV0L3RhYmlkLzc4NC9EZWZhdWx0LmFzcHg/ZG9jPTM4OTI5LnBkZikgIA0KW0JFSSBSZXNvdXJjZXNdKGh0dHBzOi8vd3d3LmJlaXJlc291cmNlcy5vcmcvKeOBi+OCiei+v+OCjOOCi+OAgTM4OTI5LnBkZuOBqOOBhOOBhuODleOCoeOCpOODq+OBp+OBmeOAgiAgDQotIFcxLjPvvJpbU1JQMTI1NzIzXShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3NyYS8/dGVybT1TUlAxMjU3MjMpIChbSGFsbG1haWVyLVdhY2tlciBldCBhbC4sIFNjaSBSZXAuLCAyMDE4XShodHRwczovL3B1Ym1lZC5uY2JpLm5sbS5uaWguZ292LzI5Njc0NjQxLykpICANCuS7iuWbnueUqOOBhOOCi+ODquODvOODieODh+ODvOOCv+OBp+OBmeOAguOCquODquOCuOODiuODq+OBr+ioiDY044K144Oz44OX44Or5YiG44Gu44OH44O844K/44KS5Y+W5b6X44GX44Gm44GE44G+44GZ44GM44CB5Lul5LiL44Gu6KGoMuOBqOOBl+OBpuOCguekuuOBleOCjOOBpuOBhOOCizEy44K144Oz44OX44Or5YiG44Gu44OH44O844K/44Gu44G/44KS6Kej5p6Q44GX44G+44GZ44CCICANCg0KfCDjgrXjg7Pjg5fjg6tJRCB8IEROQeaKveWHuuOCreODg+ODiCB8IOS/neWtmOODkOODg+ODleOCoSB8IOODquODvOODieaVsCB8DQp8Oi0tLTp8Oi0tLTp8Oi0tLTp8Oi0tLTp8DQp8IFtTUlI2MzI1ODEzXShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3NyYS8/dGVybT1TUlI2MzI1ODEzKSB8IFFNSU5JIHwgTmF0aXZlIHwgMjgyNTE3IHwNCnwgW1NSUjYzMjU4MTVdKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3Yvc3JhLz90ZXJtPVNSUjYzMjU4MTUpIHwgUU1JTkkgfCBMeXNpc0J1ZmZlciB8IDI2NjI1OSB8DQp8IFtTUlI2MzI1ODE2XShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3NyYS8/dGVybT1TUlI2MzI1ODE2KSB8IFFNSU5JIHwgUk5BLWxhdGVyIHwgMzU5OTg0IHwNCnwgW1NSUjYzMjU4MTddKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3Yvc3JhLz90ZXJtPVNSUjYzMjU4MTcpIHwgUU1JTkkgfCBQQlMgfCAzMjU2NjAgfA0KfCBbU1JSNjMyNTgyOF0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JSNjMyNTgyOCkgfCBNT0JJTyB8IFJOQS1sYXRlciB8IDIwNjkzOSB8DQp8IFtTUlI2MzI1ODI5XShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3NyYS8/dGVybT1TUlI2MzI1ODI5KSB8IE1PQklPIHwgUEJTIHwgMjYxNzY3IHwNCnwgW1NSUjYzMjU4MzBdKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3Yvc3JhLz90ZXJtPVNSUjYzMjU4MzApIHwgTU9CSU8gfCBOYXRpdmUgfCAyMzg2MjcgfA0KfCBbU1JSNjMyNTgzMV0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JSNjMyNTgzMSkgfCBNT0JJTyB8IEx5c2lzQnVmZmVyIHwgMjI1NTQ4IHwNCnwgW1NSUjYzMjU4NTldKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3Yvc3JhLz90ZXJtPVNSUjYzMjU4NTkpIHwgR0VOSUFMIHwgTHlzaXNCdWZmZXIgfCAyOTAzODMgfA0KfCBbU1JSNjMyNTg2MF0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JSNjMyNTg2MCkgfCBHRU5JQUwgfCBOYXRpdmUgfCAyNTM5MDggfA0KfCBbU1JSNjMyNTg2MV0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JSNjMyNTg2MSkgfCBHRU5JQUwgfCBQQlMgfCAxMjA3ODkgfA0KfCBbU1JSNjMyNTg2Ml0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9zcmEvP3Rlcm09U1JSNjMyNTg2MikgfCBHRU5JQUwgfCBSTkEtbGF0ZXIgfCAyNTg3OTIgfA0KDQotIFcxLjTvvJpbRm9yMjAyMDA0MjhMZWN0dXJlREFEQTIudGFyLmd6XShodHRwOi8vcGFsYWVvLm5pZy5hYy5qcC9SZXNvdXJjZXMvVG9kYWlBZ3JpMjAvRm9yMjAyMDA0MjhMZWN0dXJlREFEQTIudGFyLmd6KSAgDQrooagy44Gn56S644GV44KM44Gm44GE44KLMTLjgrXjg7Pjg5fjg6vliIbjga7jg6rjg7zjg4njg5XjgqHjgqTjg6vjgpLjgb7jgajjgoHjgZ/jgoLjga7jgafjgZnjgIJQQ1LlopfluYXjga81MTVGLTgwNlLjg5fjg6njgqTjg57jg7zjgafooYzjgYTjgIHlopfluYXjgZXjgozjgZ8zMDAgYnDlvLHjga7jgqLjg7Pjg5fjg6rjgrPjg7PjgpJJbGx1bWluYSBNaVNlceOBruODmuOCouKAleODieOCqOODs+ODiSgyNTAgYnDDlzIp44Gn5b6X44Gf44Oq44O844OJ44Gn44GZ44CCMeOCteODs+ODl+ODq+OBq+OBpOOBjeOAgUZvcndhcmTlgbTjga7jg5XjgqHjgqTjg6soXCpfMS5mYXN0cSnjgahSZXZlcnNl5YG044Gu44OV44Kh44Kk44OrKFwqXzIuZmFzdHEp44GuMuOBpOOBruODleOCoeOCpOODq+OBjOW+l+OCieOCjOOBvuOBmeOBruOBp+OAgeWQiOioiDI044OV44Kh44Kk44Or44Gn5qeL5oiQ44GV44KM44G+44GZ44CCDQoNCiMgREFEQTLjga7jgqTjg7Pjgrnjg4jjg7zjg6sNCi0gW0RBREEyXShodHRwczovL2Jpb2NvbmR1Y3Rvci5vcmcvcGFja2FnZXMvcmVsZWFzZS9iaW9jL2h0bWwvZGFkYTIuaHRtbCnvvJpbQ2FsbGFoYW4gZXQgYWwuLCBOYXQgTWV0aG9kcywgMjAxNl0oaHR0cHM6Ly9wdWJtZWQubmNiaS5ubG0ubmloLmdvdi8yNzIxNDA0Ny8pICANCg0KIyMgVzLvvJrjgqTjg7Pjgrnjg4jjg7zjg6vlrp/ooYwNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFLCBldmFsPUZBTFNFfQ0KaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJCaW9jTWFuYWdlciIsIHF1aWV0bHk9VCkpDQogICAgaW5zdGFsbC5wYWNrYWdlcygiQmlvY01hbmFnZXIiKQ0KQmlvY01hbmFnZXI6Omluc3RhbGwoImRhZGEyIiwgdXBkYXRlPUYpDQpgYGANCg0KIyMgVzPvvJrjg5Hjg4PjgrHjg7zjgrjjga7jg63jg7zjg4kNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFLCBldmFsPUZBTFNFfQ0KbGlicmFyeShkYWRhMikNCmBgYA0KDQojIyBXNO+8mmBsaXN0LmZpbGVzYOmWouaVsA0KIyMjIFc0LjHvvJrln7rmnKzlvaLjgahgcGF0aGDjgqrjg5fjgrfjg6fjg7MNCmBsaXN0LmZpbGVzYOmWouaVsOOBr+OAgeaMh+WumuOBl+OBn+ODh+OCo+ODrOOCr+ODiOODquWGheOBq+OBguOCi+ODleOCoeOCpOODq+aDheWgseOCkuW+l+OCi+OBn+OCgeOBruOCguOBruOBp+OBmeOAgjHjgaTnm67jga7jgrPjg57jg7Pjg4njga/jgIHjgqrjg5fjgrfjg6fjg7PjgpLlhajjgabjg4fjg5Xjgqnjg6vjg4jjgaflrp/ooYzjgZnjgovloLTlkIjjgafjgZnjgIIy44Gk55uu44Gv44CB6KGo56S644GV44Gb44Gf44GE5aC05omA44KS5oyH5a6a44GZ44KL44Gf44KB44GuYHBhdGhg44Kq44OX44K344On44Oz44Gu44OH44OV44Kp44Or44OIIi4i44KS5piO56S644GX44Gf44Gg44GR44Gn44GZ44CC5Lih6ICF44Gv5ZCM44GY57WQ5p6c44Gr44Gq44KK44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmxpc3QuZmlsZXMoKQ0KbGlzdC5maWxlcyhwYXRoID0gIi4iKQ0KYGBgDQoNCiMjIyBXNC4y77yaYHBhdHRlcm5g44Kq44OX44K344On44OzKOebuOWvvuODkeOCuSkNCmBwYXR0ZXJuYOOCquODl+OCt+ODp+ODs+OCkuOBpOOBkeOCi+OBk+OBqOOBp+OAgeS7u+aEj+OBruaWh+Wtl+WIl+OCkuWQq+OCgOODleOCoeOCpOODq+OBruOBv+OBq+mZkOWumuOBmeOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAguS7peS4i+OBr2AiXzEuZmFzdHEiYOOBqOOBhOOBhuaWh+Wtl+OCkuaMh+WumuOBl+OBpuOAgUZvcndhcmTlgbTjgavpmZDlrprjgZnjgovjgoTjgormlrnjgafjgZnjgIIx44Gk55uu44Gu44Kz44Oe44Oz44OJ44Gv44CBYHBhdGhg44Kq44OX44K344On44Oz44KS5piO56S644Gb44Ga44OH44OV44Kp44Or44OI44Gn5a6f6KGM44GX44Gf57WQ5p6c44Gn44GZ44CCMuOBpOebruOBruOCs+ODnuODs+ODieOBr+OAgWBwYXRoYOOCquODl+OCt+ODp+ODs+OBruODh+ODleOCqeODq+ODiCIuIuOCkuaYjuekuuOBl+OBn+OBoOOBkeOBp+OBmeOAguS4oeiAheOBr+WQjOOBmOe1kOaenOOBq+OBquOCiuOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpsaXN0LmZpbGVzKHBhdHRlcm4gPSAiXzEuZmFzdHEiKQ0KbGlzdC5maWxlcyhwYXR0ZXJuID0gIl8xLmZhc3RxIiwgcGF0aCA9ICIuIikNCmBgYA0KDQojIyMgVzQuM++8mmBwYXR0ZXJuYOOCquODl+OCt+ODp+ODsyjntbblr77jg5HjgrkpDQrnj77lnKjjga7jg4fjgqPjg6zjgq/jg4jjg6rjga7loLTmiYDjgpLooajnpLrjgZnjgotgZ2V0d2Rg6Zai5pWw5a6f6KGM57WQ5p6cKOOBpOOBvuOCiue1tuWvvuODkeOCueaDheWgsSnjgpJgYmFzaG9g44Go44GE44GG44Kq44OW44K444Kn44Kv44OI44Gr5qC857SN44GX44CB44Gd44KM44KSYGxpc3QuZmlsZXNg6Zai5pWw44GuYHBhdGhg44Kq44OX44K344On44Oz44Gr5LiO44GI44Gm44GE44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmJhc2hvIDwtIGdldHdkKCkNCmJhc2hvDQpsaXN0LmZpbGVzKHBhdHRlcm4gPSAiXzEuZmFzdHEiLCBwYXRoID0gYmFzaG8pDQpgYGANCg0KIyMjIFc0LjTvvJpgZnVsbC5uYW1lc2Djgqrjg5fjgrfjg6fjg7MNCmBmdWxsLm5hbWVzYOOCquODl+OCt+ODp+ODs+OCklRSVUXjgavjgZnjgovjgajjgIFgcGF0aGDjgqrjg5fjgrfjg6fjg7PjgafmjIflrprjgZfjgZ/jg5Hjgrnmg4XloLHjgpLlkKvjgoHjgZ/jg5XjgqHjgqTjg6vlkI3jgavjgarjgorjgb7jgZnjgIIx44Gk55uu44Gu44Kz44Oe44Oz44OJ44GM55u45a++44OR44K544CBMuOBpOebruOBruOCs+ODnuODs+ODieOBjOe1tuWvvuODkeOCueOBq+OBquOCiuOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpsaXN0LmZpbGVzKHBhdHRlcm4gPSAiXzEuZmFzdHEiLCBwYXRoID0gIi4iLCBmdWxsLm5hbWVzID0gVFJVRSkNCmxpc3QuZmlsZXMocGF0dGVybiA9ICJfMS5mYXN0cSIsIHBhdGggPSBiYXNobywgZnVsbC5uYW1lcyA9IFRSVUUpDQpgYGANCg0KIyMgVzXvvJrmloflrZfliJfmk43kvZwNCiMjIyBXNS4xIGBiYXNlbmFtZWDplqLmlbAo55u45a++44OR44K544Gu5aC05ZCIKQ0KYGJhc2VuYW1lYOmWouaVsOOBr+OAgeODkeOCueaDheWgseOCkuWQq+OCgOODleOCoeOCpOODq+WQjeOBruaWh+Wtl+WIl+ODmeOCr+ODiOODq+OCkuWFpeWKm+OBqOOBl+OBpuOAgeODkeOCueaDheWgseOCkuWQq+OBvuOBquOBhOODleOCoeOCpOODq+WQjeOBruaWh+Wtl+WIl+ODmeOCr+ODiOODq+OCkuW+l+OCi+mam+OBq+eUqOOBhOOCieOCjOOBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpmbkZzIDwtIGxpc3QuZmlsZXMocGF0dGVybiA9ICJfMS5mYXN0cSIsIHBhdGggPSAiLiIsIGZ1bGwubmFtZXMgPSBUUlVFKQ0KZm5Gcw0KYmFzZW5hbWUoZm5GcykNCmBgYA0KDQojIyMgVzUuMiBgYmFzZW5hbWVg6Zai5pWwKOe1tuWvvuODkeOCueOBruWgtOWQiCkNCmBiYXNlbmFtZWDplqLmlbDjga/jgIHjg5Hjgrnmg4XloLHjgpLlkKvjgoDjg5XjgqHjgqTjg6vlkI3jga7mloflrZfliJfjg5njgq/jg4jjg6vjgpLlhaXlipvjgajjgZfjgabjgIHjg5Hjgrnmg4XloLHjgpLlkKvjgb7jgarjgYTjg5XjgqHjgqTjg6vlkI3jga7mloflrZfliJfjg5njgq/jg4jjg6vjgpLlvpfjgovpmpvjgavnlKjjgYTjgonjgozjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KYmFzaG8gPC0gZ2V0d2QoKQ0KZm5GcyA8LSBsaXN0LmZpbGVzKHBhdHRlcm4gPSAiXzEuZmFzdHEiLCBwYXRoID0gYmFzaG8sIGZ1bGwubmFtZXMgPSBUUlVFKQ0KZm5Gcw0KYmFzZW5hbWUoZm5GcykNCmBgYA0KDQojIyMgVzUuMyBgc3Ryc3BsaXRg6Zai5pWwDQpgc3Ryc3BsaXRg6Zai5pWw44Gv44CB5paH5a2X5YiX44OZ44Kv44OI44Or44KS5YWl5Yqb44Go44GX44Gm44CB5Lu75oSP44Gu5Yy65YiH44KK5paH5a2X44Gn5paH5a2X5YiX44KS5YiG5Ymy44GX44Gf57WQ5p6c44KS44Oq44K544OI5b2i5byP44Gn6L+U44GX44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmJhc2VuYW1lKGZuRnMpDQpzdHJzcGxpdCh4ID0gYmFzZW5hbWUoZm5GcyksIHNwbGl0ID0gIl8iKQ0KYGBgDQoNCiMjIyBXNS40IGBzYXBwbHlg6Zai5pWwDQpgc2FwcGx5YOmWouaVsOOBr+OAgeODquOCueODiOW9ouW8j+OBruOCquODluOCuOOCp+OCr+ODiOOBq+WvvuOBl+OBpumAkOasoeeahOOBquWHpueQhuOCkuihjOOBhOOBn+OBhOWgtOWQiOOBq+eUqOOBhOOCieOCjOOBvuOBmeOAguOBk+OBk+OBp+OBr+OAgeOBleOBjeOBu+OBqeOBrmBzdHJzcGxpdGDlrp/ooYzntZDmnpzjgpJgaG9nZWDjgajjgYTjgYbjgqrjg5bjgrjjgqfjgq/jg4jjgavkuIDml6bmoLzntI3jgZfjgZ/jga7jgaHjgIHjgZ3jgozjgpJgc2FwcGx5YOmWouaVsOOBruWFpeWKm+OBqOOBl+OBpueUqOOBhOOBpuOBhOOBvuOBmeOAguWHuuWKm+e1kOaenOOBr+OAgeihqDLjga7jgrXjg7Pjg5fjg6tJROOBq+ebuOW9k+OBl+OBvuOBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpob2dlIDwtIHN0cnNwbGl0KHggPSBiYXNlbmFtZShmbkZzKSwgc3BsaXQgPSAiXyIpDQpzYXBwbHkoWCA9IGhvZ2UsIEZVTiA9IGBbYCwgMSkNCmBgYA0KDQojIyMgVzUuNSBgcGFzdGUwYOmWouaVsA0KYHBhc3RlMGDplqLmlbDjga/jgIHmloflrZfliJflkIzlo6vjga7pgKPntZDjgpLooYzjgYTjgZ/jgYTjgajjgY3jgavnlKjjgYTjgb7jgZnjgILjgZPjgZPjgafjga/jgIHjgZXjgY3jgbvjganjga5gc2FwcGx5YOWun+ihjOe1kOaenOOCkmBzYW1wbGVJRGDjgajjgYTjgYbjgqrjg5bjgrjjgqfjgq/jg4jjgavkuIDml6bmoLzntI3jgZfjgZ/jga7jgaHjgIHjgZ3jgozjgpJgcGFzdGUwYOmWouaVsOOBruWFpeWKm+OBqOOBl+OBpueUqOOBhOOBpuOBhOOBvuOBmeOAguaWh+Wtl+WIl+ODmeOCr+ODiOODq+OBp+OBguOCi2BzYW1wbGVJRGDjga7lkITopoHntKDjga7lj7PlgbTjgasiX0ZfZmlsdC5mYXN0cSLjgajjgYTjgYbmloflrZfliJfjgpLpgKPntZDjgZXjgZvjgabjgYTjgb7jgZnjgILjgZPjgZPjgb7jgafjgYzjgIHjgarjgpPjgonjgYvjga7lh6bnkIblrp/ooYzntZDmnpzjgpLlh7rlipvjgZXjgZvjgovjgZ/jgoHjga7ku7vmhI/jga7jg5XjgqHjgqTjg6vlkI3jgpLnlJ/miJDjgZnjgovln7rmnKzlvaLjgafjgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0Kc2FtcGxlSUQgPC0gc2FwcGx5KFggPSBob2dlLCBGVU4gPSBgW2AsIDEpDQpwYXN0ZTAoc2FtcGxlSUQsICJfRl9maWx0LmZhc3RxIikNCmBgYA0KDQojIyMgVzUuNiBgcGFzdGVg6Zai5pWwDQpgcGFzdGVg6Zai5pWw44Gv44CB5paH5a2X5YiX5ZCM5aOr44Gu6YCj57WQ44KS6KGM44GE44Gf44GE44Go44GN44Gr55So44GE44G+44GZ44CCYHBhc3RlMGDplqLmlbDjgajln7rmnKznmoTjgavlkIzjgZjjgafjgZnjgYzjgIFgcGFzdGVg6Zai5pWw44Gu44G744GG44GM6ZaT44Gr5oyf44KA5paH5a2XKOWMuuWIh+OCiuaWh+WtlynjgpLmjIflrprjgafjgY3jgovngrnjgYznlbDjgarjgorjgb7jgZnjgIJgcGFzdGVg6Zai5pWw44Gu44OH44OV44Kp44Or44OI44Gv44CB5Yy65YiH44KK5paH5a2X44KS5oyH5a6a44GZ44KLYHNlcGDjgqrjg5fjgrfjg6fjg7Pjga7lgKTjgYzjgrnjg5rjg7zjgrkoYCIgImAp44Gn44GZ44CC5b6T44Gj44Gm44CBYHBhc3RlMGDplqLmlbDjga/jgIFgcGFzdGVg6Zai5pWw44KSYHNlcCA9ICIiYOOCquODl+OCt+ODp+ODs+OCkuOBpOOBkeOBpuWun+ihjOOBmeOCi+OBk+OBqOOBqOWQjOe+qeOBp+OBmeOAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpzYW1wbGVJRCA8LSBzYXBwbHkoWCA9IGhvZ2UsIEZVTiA9IGBbYCwgMSkNCnBhc3RlKHNhbXBsZUlELCAiX0ZfZmlsdC5mYXN0cSIpDQpwYXN0ZShzYW1wbGVJRCwgIl9GX2ZpbHQuZmFzdHEiLCBzZXAgPSAiIikNCmBgYA0KDQojIyMgVzUuNyBgZmlsZS5wYXRoYOmWouaVsA0KYGZpbGUucGF0aGDplqLmlbDjga/jgIHjg5XjgqHjgqTjg6vjga7jg5Hjgrnmg4XloLHjgpLjgYbjgb7jgY/nlJ/miJDjgZfjgZ/jgYTjgajjgY3jgavnlKjjgYTjgb7jgZnjgILjgZPjgZPjgafjga/jgIHnj77lnKjjga7jg4fjgqPjg6zjgq/jg4jjg6rnm7TkuIvjgasicHJvY2Vzc2VkIuOBqOOBhOOBhuODh+OCo+ODrOOCr+ODiOODquOCkuS9nOaIkOOBl+OAgeOBneOBruS4reOBq+WFiOOBu+OBqeOBrmBwYXN0ZTBg5a6f6KGM57WQ5p6c44Gr55u45b2T44GZ44KL5Yem55CG5b6M44Gu44OV44Kh44Kk44Or5ZCN44KS6YCj57WQ44GV44Gb44Gf44KC44Gu44KS5L2c5oiQ44GX44G+44GZ44CCDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmJhc2hvIDwtIGdldHdkKCkNCmZuRnMgPC0gbGlzdC5maWxlcyhwYXR0ZXJuID0gIl8xLmZhc3RxIiwgcGF0aCA9IGJhc2hvLCBmdWxsLm5hbWVzID0gVFJVRSkNCmhvZ2UgPC0gc3Ryc3BsaXQoeCA9IGJhc2VuYW1lKGZuRnMpLCBzcGxpdCA9ICJfIikNCnNhbXBsZUlEIDwtIHNhcHBseShYID0gaG9nZSwgRlVOID0gYFtgLCAxKQ0KZmlsdEZzIDwtIGZpbGUucGF0aChiYXNobywgInByb2Nlc3NlZCIsIHBhc3RlMChzYW1wbGVJRCwgIl9GX2ZpbHQuZmFzdHEiKSkNCmZpbHRGcw0KYGBgDQrkuIDopovjgZnjgovjgahgZmlsZS5wYXRoYOmWouaVsOOBruacieeUqOaAp+OBjOOCj+OBi+OCiuOBq+OBj+OBhOODkuODiOOBr+OAgeS7peS4i+OBp+ekuuOBmeOCiOOBhuOBqmBmaWxlLnBhdGhg44Gu6YOo5YiG44KSYHBhc3RlMGDjgavnva7jgY3mj5vjgYjjgZ/ntZDmnpzjgajmr5TovIPjgZnjgovjgajntI3lvpfjgafjgY3jgovjgajmgJ3jgYTjgb7jgZnjgILjgaTjgb7jgorjgIFgZmlsZS5wYXRoYOOBruOBu+OBhuOBjOOCueODqeODg+OCt+ODpShcLynjgpLjgYbjgb7jgY/mjL/lhaXjgZfjgabjgY/jgozjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KcGFzdGUwKGJhc2hvLCAicHJvY2Vzc2VkIiwgcGFzdGUwKHNhbXBsZUlELCAiX0ZfZmlsdC5mYXN0cSIpKQ0KYGBgDQpgZmlsZS5wYXRoYOmWouaVsOOBruS7o+OCj+OCiuOBq+OAgWBzZXAgPSAiLyJg44Kq44OX44K344On44Oz44KS44Gk44GR44GmYHBhc3RlYOmWouaVsOOCkuWun+ihjOOBl+OBpuOCguani+OBhOOBvuOBm+OCk+OAgg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpwYXN0ZShiYXNobywgInByb2Nlc3NlZCIsIHBhc3RlMChzYW1wbGVJRCwgIl9GX2ZpbHQuZmFzdHEiKSwgc2VwID0gIi8iKQ0KYGBgDQoNCiMjIyBXNS44IGBuYW1lc2DplqLmlbANCuOBk+OCjOOBr+WwkeOBl+OCj+OBi+OCiuOBq+OBj+OBhOamguW/teOBp+OBmeOBjOOAgWBuYW1lc2DplqLmlbDjga/jg5njgq/jg4jjg6vjga7lkITopoHntKDjgavlkI3liY3jgpLjgaTjgZHjgZ/jgYTjgajjgY3jgavnlKjjgYTjgb7jgZnjgILlrp/pmpvlj5bjgormibHjgYbjga7jga9Gb3J3YXJk5YG044GoUmV2ZXJzZeWBtOOBruS4oeaWueOBp+OBmeOBjOOAgemAmuW4uOOBk+OCjOOCieOBr+ODmuOCouOBqOOBl+OBpuWPluOCiuaJseOBhOOBvuOBmeOAguOBneOCjOOChuOBiOOAgeWvvuW/nOOBmeOCi+imgee0oOOBruS4rei6q+OBruaWh+Wtl+WIl++8iOOBpOOBvuOCiuODleOCoeOCpOODq+WQje+8ieOBp+eVsOOBquOBo+OBpuOBhOOBn+OBqOOBl+OBpuOCguOAgeimgee0oOOBq+OBpOOBkeOCieOCjOOBn+WQjeWJjeOCkuS4gOiHtOOBleOBm+OBpuOBiuOBj+OBk+OBqOOBp+ODmuOCouOBqOOBl+OBpuiqjeitmOOBleOBm+OCi+OBk+OBqOOBjOOBp+OBjeOCi+ODoeODquODg+ODiOOBjOOBguOCiuOBvuOBmeOAguOBk+OBk+OBp+OBr+OAgeimgee0oOOBq+OBpOOBkeOCi+WQjeWJjeOBqOOBl+OBpuOCteODs+ODl+ODq0lE77yI44Kq44OW44K444Kn44Kv44OI5ZCN44Go44GX44Gm44Gvc2FtcGxlSUTvvInjgpLlibLjgorlvZPjgabjgabjgYTjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KZmlsdEZzDQpuYW1lcyhmaWx0RnMpIDwtIHNhbXBsZUlEDQpmaWx0RnMNCmBgYA0KDQojIyBXNiDlhaXlh7rlipvjg5XjgqHjgqTjg6vjga7kvZzmiJANCiMjIyBXNi4xIOe1tuWvvuODkeOCueOBruWgtOWQiA0K44GT44GT44G+44Gn44GvRm9yd2FyZOWBtOOBruODleOCoeOCpOODq+OBruOBv+OBp+OBl+OBn+OBruOBp+OAgVJldmVyc2XlgbTjgoLlkKvjgoHjgablhajkvZPjgpLjgb7jgajjgoHjgablrp/ooYzjgZnjgovjgrnjgq/jg6rjg5fjg4jjgpLnpLrjgZfjgb7jgZnjgILjgrnjgq/jg6rjg5fjg4jjgavmnKzlvZPjga/kuI3opoHjgarpg6jliIbjgoLlkKvjgb7jgozjgb7jgZnjgYzjgIFGb3J3YXJk5YG044GoUmV2ZXJzZeWBtOOBqOOCguOBq+WQjOOBmOOCiOOBhuOBq+iomOi8ieOBmeOCi+OBk+OBqOOCkuWEquWFiOOBleOBm+OBpuOBhOOBvuOBmeOAgmBmaWx0RnNg44GoYGZpbHRSc2DjgYzliY3lh6bnkIblvozjga7jg5XjgqHjgqTjg6vjga7ntbblr77jg5Hjgrnmg4XloLHjgavjgarjgorjgb7jgZnjgIINCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KYmFzaG8gPC0gZ2V0d2QoKQ0KIyBGb3J3YXJk5YG0DQpmbkZzIDwtIGxpc3QuZmlsZXMocGF0dGVybiA9ICJfMS5mYXN0cSIsIHBhdGggPSBiYXNobywgZnVsbC5uYW1lcyA9IFRSVUUpDQpob2dlIDwtIHN0cnNwbGl0KHggPSBiYXNlbmFtZShmbkZzKSwgc3BsaXQgPSAiXyIpDQpzYW1wbGVJRCA8LSBzYXBwbHkoWCA9IGhvZ2UsIEZVTiA9IGBbYCwgMSkNCmZpbHRGcyA8LSBmaWxlLnBhdGgoYmFzaG8sICJwcm9jZXNzZWQiLCBwYXN0ZTAoc2FtcGxlSUQsICJfRl9maWx0LmZhc3RxIikpDQpuYW1lcyhmaWx0RnMpIDwtIHNhbXBsZUlEDQpmaWx0RnMNCiMgUmV2ZXJzZeWBtA0KZm5ScyA8LSBsaXN0LmZpbGVzKHBhdHRlcm4gPSAiXzIuZmFzdHEiLCBwYXRoID0gYmFzaG8sIGZ1bGwubmFtZXMgPSBUUlVFKQ0KaG9nZSA8LSBzdHJzcGxpdCh4ID0gYmFzZW5hbWUoZm5ScyksIHNwbGl0ID0gIl8iKQ0Kc2FtcGxlSUQgPC0gc2FwcGx5KFggPSBob2dlLCBGVU4gPSBgW2AsIDEpDQpmaWx0UnMgPC0gZmlsZS5wYXRoKGJhc2hvLCAicHJvY2Vzc2VkIiwgcGFzdGUwKHNhbXBsZUlELCAiX1JfZmlsdC5mYXN0cSIpKQ0KbmFtZXMoZmlsdFJzKSA8LSBzYW1wbGVJRA0KZmlsdFJzDQpgYGANCg0KIyMjIFc2LjIg55u45a++44OR44K544Gu5aC05ZCIDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRSwgd2FybmluZz1GQUxTRX0NCmJhc2hvIDwtICIuIg0KIyBGb3J3YXJk5YG0DQpmbkZzIDwtIGxpc3QuZmlsZXMocGF0dGVybiA9ICJfMS5mYXN0cSIsIHBhdGggPSBiYXNobywgZnVsbC5uYW1lcyA9IFRSVUUpDQpob2dlIDwtIHN0cnNwbGl0KHggPSBiYXNlbmFtZShmbkZzKSwgc3BsaXQgPSAiXyIpDQpzYW1wbGVJRCA8LSBzYXBwbHkoWCA9IGhvZ2UsIEZVTiA9IGBbYCwgMSkNCmZpbHRGcyA8LSBmaWxlLnBhdGgoYmFzaG8sICJwcm9jZXNzZWQiLCBwYXN0ZTAoc2FtcGxlSUQsICJfRl9maWx0LmZhc3RxIikpDQpuYW1lcyhmaWx0RnMpIDwtIHNhbXBsZUlEDQpmaWx0RnMNCiMgUmV2ZXJzZeWBtA0KZm5ScyA8LSBsaXN0LmZpbGVzKHBhdHRlcm4gPSAiXzIuZmFzdHEiLCBwYXRoID0gYmFzaG8sIGZ1bGwubmFtZXMgPSBUUlVFKQ0KaG9nZSA8LSBzdHJzcGxpdCh4ID0gYmFzZW5hbWUoZm5ScyksIHNwbGl0ID0gIl8iKQ0Kc2FtcGxlSUQgPC0gc2FwcGx5KFggPSBob2dlLCBGVU4gPSBgW2AsIDEpDQpmaWx0UnMgPC0gZmlsZS5wYXRoKGJhc2hvLCAicHJvY2Vzc2VkIiwgcGFzdGUwKHNhbXBsZUlELCAiX1JfZmlsdC5mYXN0cSIpKQ0KbmFtZXMoZmlsdFJzKSA8LSBzYW1wbGVJRA0KZmlsdFJzDQpgYGANCg0K