Project Overview
Directory Structure on Lilly Lift and Shift Environment
├── raw data
└── $lrld/BN24-9851_APOC3_Top8ODN/raw/
├── samplesheet/
└── $lrld/BN24-9851_APOC3_Top8ODN/BN24-9851_nf.csv
├── odnseq pipeline
└── [workflow pull https://github.com/EliLillyCo/nf-lly-odnseq]
├── [results in $lrld/BN24-9851_APOC3_Top8ODN/nf_results]
└── aligned_bams
└── $lrld/BN24-9851_APOC3_Top8ODN/nf_results/aligned_bams/sorted_bam_bai
└── bowtie2
└── multiqc
└──/$lrld/BN24-9851_APOC3_Top8ODN/nf_results/multiqc/broad_peak/multiqc_report.html
└── preprocessing
└── project_data
└── results_offtarget
└── peaks and double stranded breaks results from Macs2 and in-house per sample
└── stats
└── summarization
├── combined in-house and Macs2 peaks and double stranded breaks per sample
└── [workflow pull https://github.com/EliLillyCo/ODNseq_2ndary_analysis]
└── [results in $lrld/BN24-9851_APOC3_Top8ODN/2ndary_analysis/cameron_macs_combOTsumm]
├── final results/
└── [workflow pull https://github.com/sgupta-lilly/SiteSeqSecondaryAnalysis.git branch ODNSecondaryAnalysis ]
└── [ results in $lrld/BN24-9851_APOC3_Top8ODN/nf_results/stats/result_secondary_pipeline]
└── published reports
└── $lrld/BN24-9851_APOC3_Top8ODN/nf_results/stats/SiteSeqSecondaryAnalysis
$lrld = "/lrlhps/genomics/prod/lgm/dna_editing/"
Samplesheet
datatable(
head(metadata),
caption = htmltools::tags$caption(
style = 'caption-side: bottom; text-align: center;',
'Samplesheet: ', htmltools::em('BN24-9851_nf.csv')
)
)
Odn-seq workflow
Step1 : nf-lly-odnseq for primary workflow
cd /lrlhps/genomics/prod/lgm/dna_editing/BN24-9851_APOC3_Top8ODN/
!git clone https://github.com/EliLillyCo/nf-lly-odnseq
!nextflow run nf-lly-odnseq -profile omicsprd
Step2: Jupyter notebook to combine results of the two peak
callers
cd /lrlhps/genomics/prod/lgm/dna_editing/BN24-9851_APOC3_Top8ODN/2ndary_analysis/
!git clone https://github.com/EliLillyCo/ODNseq_2ndary_analysis
jupyter nbconvert --to notebook --execute --inplace ODNseq_OT_combo_sum.ipynb
All unfiltered off-target sites from the two peak callers
datatable(
head(all_result),
caption = htmltools::tags$caption(
style = 'caption-side: bottom; text-align: center;',
'Unfiltered OT sites: ', htmltools::em('Unfiltered OT sites')
)
)
Step3: Final off-target sites with ranks and annotations
Setup
Guides in the study 1. 17rev 2. 29rev 3. 41rev 4.
52rev 5. 53rev 6. 67forw 7. 68forw 8. 6rev
$lrld = "/lrlhps/genomics/prod/lgm/dna_editing/"
mkdir $lrld/BN24-9851_APOC3_Top8ODN/BN24-9851_APOC3_Top8ODN/nf_results/stats/result_secondary_pipeline
cd $lrld/BN24-9851_APOC3_Top8ODN/BN24-9851_APOC3_Top8ODN/nf_results/stats/result_secondary_pipeline
!git clone https://github.com/sgupta-lilly/SiteSeqSecondaryAnalysis/tree/ODNSecondaryAnalysis
!wget https://ftp.ebi.ac.uk/pub/databases/gencode/Gencode_human/release_46/gencode.v46.annotation.gtf.gz
gunzip gencode.v46.annotation.gtf.gz
Step3a: Run secondary_analysis.py
secondary_workflow {
samplesheet = "$lrld/BN24-9851_APOC3_Top8ODN/BN24-9851_nf.csv"
aligned_bams = "$lrld/BN24-9851_APOC3_Top8ODN/nf_results/aligned_bams/sorted_bam_bai/"
combined_results = "$lrld/BN24-9851_APOC3_Top8ODN/2ndary_analysis/cameron_macs_combOTsum/"
!python3 $lrld/BN24-9851_APOC3_Top8ODN/nf_results/stats/SiteSeqSecondaryAnalysis/secondary_analysis.py samplesheet aligned_bams combined_results
Step3b: Run SiteSeqGuideReport.rmd for each guide
input = $guide
output = $guide+'.html'
!Rscript -e "rmarkdown::render('/lrlhps/genomics/prod/lgm/dna_editing/BN24-9851_APOC3_Top8ODN/nf_results/stats/SiteSeqSecondaryAnalysis/SiteSeqGuideReport.rmd', params = list(guidename =input, results_folder='/lrlhps/genomics/prod/lgm/dna_editing/BN24-9851_APOC3_Top8ODN/nf_results/', samplesheet='/lrlhps/genomics/prod/lgm/dna_editing/BN24-9851_APOC3_Top8ODN/BN24-9851_nf.csv', result_secondary_pipeline='/lrlhps/genomics/prod/lgm/dna_editing/BN24-9851_APOC3_Top8ODN/nf_results/stats/result_secondary_pipeline/'), output_file = output))"
Step3c: Run annotation.py for each guide
input = $guide +'.OT_rank_out'
!python3 annotation.py 17rev.OT_rank_out cancer_gene_census.csv
}
Review the results
datatable(
head(dat),
caption = htmltools::tags$caption(
style = 'caption-side: bottom; text-align: center;',
'Summary of Sites: ', htmltools::em('https://lilly-jira.atlassian.net/browse/GTEN-249')
)
)
LS0tCnRpdGxlOiAiQVBPQzMgT0ROLVNlcSBQcm9qZWN0IEJOMjQtOTg1MSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IAogICAgdG9jOiB5ZXMKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCmVkaXRvcl9vcHRpb25zOiAKICBtYXJrZG93bjogCiAgICB3cmFwOiA3MgotLS0KCiMgUHJvamVjdCBPdmVydmlldwoKIyMgRGVzY3JpcHRpb24KCi0gICAqKk9iamVjdGl2ZSoqOiBBc3NheSBPRE4tU2VxIGZvciA4IEFQT0MzIGd1aWRlcwotICAgKipKaXJhIFRpY2tldCoqOiBodHRwczovL2xpbGx5LWppcmEuYXRsYXNzaWFuLm5ldC9icm93c2UvR1RFTi0yNDkKLSAgICoqUHVycG9zZSoqOiBOb21pbmF0aW9uIG9mIDggZ3VpZGVzIGZyb20gT0ROLVNlcQotICAgKipCZW5jaGxpbmcqKjogaHR0cHM6Ly9saWxseS5iZW5jaGxpbmcuY29tL2xpbGx5L2YvbGliX2RMQ05tU2VpLWFwb2MzLW9mZi10YXJnZXQvZXRyXzNhQ2hjejNGLWFwb2MzLW9kbi1zZXEtdG9wLTgtc2dybmEtc2NyZWVuLWhlcGcyL2VkaXQKCiMjIERpcmVjdG9yeSBTdHJ1Y3R1cmUgb24gTGlsbHkgTGlmdCBhbmQgU2hpZnQgRW52aXJvbm1lbnQKCmBgYCBiYXNoCiAgIArilJzilIDilIAgcmF3IGRhdGEgCiAgICDilJTilIDilIAgJGxybGQvQk4yNC05ODUxX0FQT0MzX1RvcDhPRE4vcmF3LwrilJzilIDilIAgc2FtcGxlc2hlZXQvCiAgICDilJTilIDilIAgJGxybGQvQk4yNC05ODUxX0FQT0MzX1RvcDhPRE4vQk4yNC05ODUxX25mLmNzdiAgIArilJzilIDilIAgb2Ruc2VxIHBpcGVsaW5lCiAgICDilJTilIDilIAgW3dvcmtmbG93IHB1bGwgaHR0cHM6Ly9naXRodWIuY29tL0VsaUxpbGx5Q28vbmYtbGx5LW9kbnNlcV0KICDilJzilIDilIAgW3Jlc3VsdHMgaW4gJGxybGQvQk4yNC05ODUxX0FQT0MzX1RvcDhPRE4vbmZfcmVzdWx0c10KICAgIOKUlOKUgOKUgCBhbGlnbmVkX2JhbXMKICAgICAgICDilJTilIDilIAgJGxybGQvQk4yNC05ODUxX0FQT0MzX1RvcDhPRE4vbmZfcmVzdWx0cy9hbGlnbmVkX2JhbXMvc29ydGVkX2JhbV9iYWkKICAgIOKUlOKUgOKUgCBib3d0aWUyCiAgICDilJTilIDilIAgbXVsdGlxYyAKICAgICAgICDilJTilIDilIAvJGxybGQvQk4yNC05ODUxX0FQT0MzX1RvcDhPRE4vbmZfcmVzdWx0cy9tdWx0aXFjL2Jyb2FkX3BlYWsvbXVsdGlxY19yZXBvcnQuaHRtbAogICAg4pSU4pSA4pSAIHByZXByb2Nlc3NpbmcKICAgIOKUlOKUgOKUgCBwcm9qZWN0X2RhdGEgCiAgICDilJTilIDilIAgcmVzdWx0c19vZmZ0YXJnZXQKICAgICAgIOKUlOKUgOKUgCBwZWFrcyBhbmQgZG91YmxlIHN0cmFuZGVkIGJyZWFrcyByZXN1bHRzIGZyb20gTWFjczIgYW5kIGluLWhvdXNlIHBlciBzYW1wbGUKICAgIOKUlOKUgOKUgCBzdGF0cyAKICAgIOKUlOKUgOKUgCBzdW1tYXJpemF0aW9uCuKUnOKUgOKUgCBjb21iaW5lZCBpbi1ob3VzZSBhbmQgTWFjczIgcGVha3MgYW5kIGRvdWJsZSBzdHJhbmRlZCBicmVha3MgcGVyIHNhbXBsZQogICAg4pSU4pSA4pSAIFt3b3JrZmxvdyBwdWxsIGh0dHBzOi8vZ2l0aHViLmNvbS9FbGlMaWxseUNvL09ETnNlcV8ybmRhcnlfYW5hbHlzaXNdCiAgICDilJTilIDilIAgW3Jlc3VsdHMgaW4gJGxybGQvQk4yNC05ODUxX0FQT0MzX1RvcDhPRE4vMm5kYXJ5X2FuYWx5c2lzL2NhbWVyb25fbWFjc19jb21iT1RzdW1tXQrilJzilIDilIAgZmluYWwgcmVzdWx0cy8KICAgIOKUlOKUgOKUgCBbd29ya2Zsb3cgcHVsbCBodHRwczovL2dpdGh1Yi5jb20vc2d1cHRhLWxpbGx5L1NpdGVTZXFTZWNvbmRhcnlBbmFseXNpcy5naXQgYnJhbmNoIE9ETlNlY29uZGFyeUFuYWx5c2lzIF0KICAgIOKUlOKUgOKUgCBbIHJlc3VsdHMgaW4gJGxybGQvQk4yNC05ODUxX0FQT0MzX1RvcDhPRE4vbmZfcmVzdWx0cy9zdGF0cy9yZXN1bHRfc2Vjb25kYXJ5X3BpcGVsaW5lXQogICAg4pSU4pSA4pSAIHB1Ymxpc2hlZCByZXBvcnRzIAogICAgICAgIOKUlOKUgOKUgCAkbHJsZC9CTjI0LTk4NTFfQVBPQzNfVG9wOE9ETi9uZl9yZXN1bHRzL3N0YXRzL1NpdGVTZXFTZWNvbmRhcnlBbmFseXNpcwokbHJsZCA9ICIvbHJsaHBzL2dlbm9taWNzL3Byb2QvbGdtL2RuYV9lZGl0aW5nLyIKYGBgCiMgU2FtcGxlc2hlZXQgCmBgYHtyLCBlY2hvID0gRkFMU0UsIGluY2x1ZGUgPSBGQUxTRX0KbGlicmFyeShEVCkKIyBMb2FkIG1ldGFkYXRhCm1ldGFkYXRhIDwtIHJlYWQuY3N2KCIvbHJsaHBzL2dlbm9taWNzL3Byb2QvbGdtL2RuYV9lZGl0aW5nL0JOMjQtOTg1MV9BUE9DM19Ub3A4T0ROL0JOMjQtOTg1MV9uZi5jc3YiKQoKYGBgCmBgYHtyfQpkYXRhdGFibGUoCiAgaGVhZChtZXRhZGF0YSksCiAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKAogICAgc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiBib3R0b207IHRleHQtYWxpZ246IGNlbnRlcjsnLAogICAgJ1NhbXBsZXNoZWV0OiAnLCBodG1sdG9vbHM6OmVtKCdCTjI0LTk4NTFfbmYuY3N2JykKICApCikKCmBgYAoKCiMgT2RuLXNlcSB3b3JrZmxvdwojIFN0ZXAxIDogbmYtbGx5LW9kbnNlcSBmb3IgcHJpbWFyeSB3b3JrZmxvdwpgYGAgYmFzaAoKY2QgL2xybGhwcy9nZW5vbWljcy9wcm9kL2xnbS9kbmFfZWRpdGluZy9CTjI0LTk4NTFfQVBPQzNfVG9wOE9ETi8KIWdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vRWxpTGlsbHlDby9uZi1sbHktb2Ruc2VxCiFuZXh0ZmxvdyBydW4gbmYtbGx5LW9kbnNlcSAtcHJvZmlsZSBvbWljc3ByZAoKYGBgCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9CnNvdXJjZV9maWxlIDwtIGZpbGUucGF0aCgiL2xybGhwcy9nZW5vbWljcy9wcm9kL2xnbS9kbmFfZWRpdGluZy9CTjI0LTk4NTFfQVBPQzNfVG9wOE9ETi9uZl9yZXN1bHRzL211bHRpcWMvYnJvYWRfcGVhay9tdWx0aXFjX3JlcG9ydC5odG1sIikKZGVzdGluYXRpb25fZmlsZSA8LSBmaWxlLnBhdGgoZ2V0d2QoKSwgIm11bHRpcWNfcmVwb3J0Lmh0bWwiKSAgIyBDb3B5IHRvIGN1cnJlbnQgZm9sZGVyCmZpbGVfY29waWVkIDwtIGZpbGUuY29weShzb3VyY2VfZmlsZSwgZGVzdGluYXRpb25fZmlsZSwgb3ZlcndyaXRlID0gVFJVRSkKCmBgYAojIFJldmlldyBxYyB3aXRoIFtNdWx0aXFjXSguL211bHRpcWNfcmVwb3J0Lmh0bWwpCgojIFN0ZXAyOiBKdXB5dGVyIG5vdGVib29rIHRvIGNvbWJpbmUgcmVzdWx0cyBvZiB0aGUgdHdvIHBlYWsgY2FsbGVycwpgYGAgYmFzaApjZCAvbHJsaHBzL2dlbm9taWNzL3Byb2QvbGdtL2RuYV9lZGl0aW5nL0JOMjQtOTg1MV9BUE9DM19Ub3A4T0ROLzJuZGFyeV9hbmFseXNpcy8KIWdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vRWxpTGlsbHlDby9PRE5zZXFfMm5kYXJ5X2FuYWx5c2lzCmp1cHl0ZXIgbmJjb252ZXJ0IC0tdG8gbm90ZWJvb2sgLS1leGVjdXRlIC0taW5wbGFjZSBPRE5zZXFfT1RfY29tYm9fc3VtLmlweW5iCgpgYGAKCiMgQWxsIHVuZmlsdGVyZWQgb2ZmLXRhcmdldCBzaXRlcyBmcm9tIHRoZSB0d28gcGVhayBjYWxsZXJzIApgYGB7ciwgZWNobyA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9CnJlcXVpcmUoZHBseXIpCnJlcXVpcmUoZGF0YS50YWJsZSkKCiMgcmVhZCBmaWxlIHBhdGgKYWxsX3BhdGhzIDwtCiAgbGlzdC5maWxlcyhwYXRoID0gIi9scmxocHMvZ2Vub21pY3MvcHJvZC9sZ20vZG5hX2VkaXRpbmcvQk4yNC05ODUxX0FQT0MzX1RvcDhPRE4vMm5kYXJ5X2FuYWx5c2lzL2NhbWVyb25fbWFjc19jb21iT1RzdW0vIiwKICAgICAgICAgICAgIHBhdHRlcm4gPSAiKl9jYW1lcm9uX21hY3MyX2NvbWJfT1Rfc3VtLnRzdiIsCiAgICAgICAgICAgICBmdWxsLm5hbWVzID0gVFJVRSkKCiMgcmVhZCBmaWxlIGNvbnRlbnQKYWxsX2NvbnRlbnQgPC0KICBhbGxfcGF0aHMgJT4lCiAgbGFwcGx5KHJlYWQudGFibGUsCiAgICAgICAgIGhlYWRlciA9IFRSVUUsCiAgICAgICAgIHNlcCA9ICJcdCIsCiAgICAgICAgIGVuY29kaW5nID0gIlVURi04IikKCiMgcmVhZCBmaWxlIG5hbWUKYWxsX2ZpbGVuYW1lcyA8LSBhbGxfcGF0aHMgJT4lCiAgYmFzZW5hbWUoKSAlPiUKICBhcy5saXN0KCkKCiMgY29tYmluZSBmaWxlIGNvbnRlbnQgbGlzdCBhbmQgZmlsZSBuYW1lIGxpc3QKYWxsX2xpc3RzIDwtIG1hcHBseShjLCBhbGxfY29udGVudCwgYWxsX2ZpbGVuYW1lcywgU0lNUExJRlkgPSBGQUxTRSkKCiMgdW5saXN0IGFsbCBsaXN0cyBhbmQgY2hhbmdlIGNvbHVtbiBuYW1lCmFsbF9yZXN1bHQgPC0gcmJpbmRsaXN0KGFsbF9saXN0cywgZmlsbCA9IFQpCiMgY2hhbmdlIGNvbHVtbiBuYW1lCm5hbWVzKGFsbF9yZXN1bHQpW2RpbShhbGxfcmVzdWx0KVsyXV0gPC0gIkZpbGUuUGF0aCIKCmBgYApgYGBye30KZGF0YXRhYmxlKAogIGhlYWQoYWxsX3Jlc3VsdCksCiAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKAogICAgc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiBib3R0b207IHRleHQtYWxpZ246IGNlbnRlcjsnLAogICAgJ1VuZmlsdGVyZWQgT1Qgc2l0ZXM6ICcsIGh0bWx0b29sczo6ZW0oJ1VuZmlsdGVyZWQgT1Qgc2l0ZXMnKQogICkKKQpgYGAKCiMgU3RlcDM6IEZpbmFsIG9mZi10YXJnZXQgc2l0ZXMgd2l0aCByYW5rcyBhbmQgYW5ub3RhdGlvbnMKIyMgU2V0dXAKKipHdWlkZXMgaW4gdGhlIHN0dWR5KioKMS4gMTdyZXYKMi4gMjlyZXYKMy4gNDFyZXYKNC4gNTJyZXYKNS4gNTNyZXYKNi4gNjdmb3J3CjcuIDY4Zm9ydwo4LiA2cmV2CgpgYGAgYmFzaAoKJGxybGQgPSAiL2xybGhwcy9nZW5vbWljcy9wcm9kL2xnbS9kbmFfZWRpdGluZy8iCm1rZGlyICRscmxkL0JOMjQtOTg1MV9BUE9DM19Ub3A4T0ROL0JOMjQtOTg1MV9BUE9DM19Ub3A4T0ROL25mX3Jlc3VsdHMvc3RhdHMvcmVzdWx0X3NlY29uZGFyeV9waXBlbGluZQpjZCAkbHJsZC9CTjI0LTk4NTFfQVBPQzNfVG9wOE9ETi9CTjI0LTk4NTFfQVBPQzNfVG9wOE9ETi9uZl9yZXN1bHRzL3N0YXRzL3Jlc3VsdF9zZWNvbmRhcnlfcGlwZWxpbmUKIWdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vc2d1cHRhLWxpbGx5L1NpdGVTZXFTZWNvbmRhcnlBbmFseXNpcy90cmVlL09ETlNlY29uZGFyeUFuYWx5c2lzCiF3Z2V0IGh0dHBzOi8vZnRwLmViaS5hYy51ay9wdWIvZGF0YWJhc2VzL2dlbmNvZGUvR2VuY29kZV9odW1hbi9yZWxlYXNlXzQ2L2dlbmNvZGUudjQ2LmFubm90YXRpb24uZ3RmLmd6Cmd1bnppcCBnZW5jb2RlLnY0Ni5hbm5vdGF0aW9uLmd0Zi5negpgYGAKCiMgU3RlcDNhOiBSdW4gc2Vjb25kYXJ5X2FuYWx5c2lzLnB5CmBgYGJhc2gKc2Vjb25kYXJ5X3dvcmtmbG93IHsKc2FtcGxlc2hlZXQgPSAiJGxybGQvQk4yNC05ODUxX0FQT0MzX1RvcDhPRE4vQk4yNC05ODUxX25mLmNzdiIgCmFsaWduZWRfYmFtcyA9ICIkbHJsZC9CTjI0LTk4NTFfQVBPQzNfVG9wOE9ETi9uZl9yZXN1bHRzL2FsaWduZWRfYmFtcy9zb3J0ZWRfYmFtX2JhaS8iIApjb21iaW5lZF9yZXN1bHRzID0gIiRscmxkL0JOMjQtOTg1MV9BUE9DM19Ub3A4T0ROLzJuZGFyeV9hbmFseXNpcy9jYW1lcm9uX21hY3NfY29tYk9Uc3VtLyIKCiFweXRob24zICRscmxkL0JOMjQtOTg1MV9BUE9DM19Ub3A4T0ROL25mX3Jlc3VsdHMvc3RhdHMvU2l0ZVNlcVNlY29uZGFyeUFuYWx5c2lzL3NlY29uZGFyeV9hbmFseXNpcy5weSBzYW1wbGVzaGVldCBhbGlnbmVkX2JhbXMgY29tYmluZWRfcmVzdWx0cwpgYGAKIyBTdGVwM2I6IFJ1biBTaXRlU2VxR3VpZGVSZXBvcnQucm1kIGZvciBlYWNoIGd1aWRlCmBgYGJhc2gKCmlucHV0ID0gJGd1aWRlCm91dHB1dCA9ICRndWlkZSsnLmh0bWwnCiFSc2NyaXB0IC1lICJybWFya2Rvd246OnJlbmRlcignL2xybGhwcy9nZW5vbWljcy9wcm9kL2xnbS9kbmFfZWRpdGluZy9CTjI0LTk4NTFfQVBPQzNfVG9wOE9ETi9uZl9yZXN1bHRzL3N0YXRzL1NpdGVTZXFTZWNvbmRhcnlBbmFseXNpcy9TaXRlU2VxR3VpZGVSZXBvcnQucm1kJywgIHBhcmFtcyA9IGxpc3QoZ3VpZGVuYW1lID1pbnB1dCwgcmVzdWx0c19mb2xkZXI9Jy9scmxocHMvZ2Vub21pY3MvcHJvZC9sZ20vZG5hX2VkaXRpbmcvQk4yNC05ODUxX0FQT0MzX1RvcDhPRE4vbmZfcmVzdWx0cy8nLCBzYW1wbGVzaGVldD0nL2xybGhwcy9nZW5vbWljcy9wcm9kL2xnbS9kbmFfZWRpdGluZy9CTjI0LTk4NTFfQVBPQzNfVG9wOE9ETi9CTjI0LTk4NTFfbmYuY3N2JywgcmVzdWx0X3NlY29uZGFyeV9waXBlbGluZT0nL2xybGhwcy9nZW5vbWljcy9wcm9kL2xnbS9kbmFfZWRpdGluZy9CTjI0LTk4NTFfQVBPQzNfVG9wOE9ETi9uZl9yZXN1bHRzL3N0YXRzL3Jlc3VsdF9zZWNvbmRhcnlfcGlwZWxpbmUvJyksIG91dHB1dF9maWxlID0gb3V0cHV0KSkiCgoKYGBgCiMgU3RlcDNjOiBSdW4gYW5ub3RhdGlvbi5weSBmb3IgZWFjaCBndWlkZQoKYGBgYmFzaAppbnB1dCA9ICRndWlkZSArJy5PVF9yYW5rX291dCcgCiFweXRob24zIGFubm90YXRpb24ucHkgMTdyZXYuT1RfcmFua19vdXQgY2FuY2VyX2dlbmVfY2Vuc3VzLmNzdgoKfQoKYGBgCiMgUmV2aWV3IHRoZSByZXN1bHRzCmBgYHtyLCBlY2hvID0gRkFMU0UsIGluY2x1ZGUgPSBGQUxTRX0KCnNvdXJjZV9maWxlIDwtIGZpbGUucGF0aCgiL2xybGhwcy9nZW5vbWljcy9wcm9kL2xnbS9kbmFfZWRpdGluZy9CTjI0LTk4NTFfQVBPQzNfVG9wOE9ETi9uZl9yZXN1bHRzL3N0YXRzL1NpdGVTZXFTZWNvbmRhcnlBbmFseXNpcy8xN3Jldi5odG1sIikKZGVzdGluYXRpb25fZmlsZSA8LSBmaWxlLnBhdGgoZ2V0d2QoKSwgIjE3cmV2Lmh0bWwiKSAgIyBDb3B5IHRvIGN1cnJlbnQgZm9sZGVyCmZpbGVfY29waWVkIDwtIGZpbGUuY29weShzb3VyY2VfZmlsZSwgZGVzdGluYXRpb25fZmlsZSwgb3ZlcndyaXRlID0gVFJVRSkKCmBgYAojIyMgW2d1aWRlIDE3cmV2XSguLzE3cmV2Lmh0bWwpCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9Cgpzb3VyY2VfZmlsZSA8LSBmaWxlLnBhdGgoIi9scmxocHMvZ2Vub21pY3MvcHJvZC9sZ20vZG5hX2VkaXRpbmcvQk4yNC05ODUxX0FQT0MzX1RvcDhPRE4vbmZfcmVzdWx0cy9zdGF0cy9TaXRlU2VxU2Vjb25kYXJ5QW5hbHlzaXMvMjlyZXYuaHRtbCIpCmRlc3RpbmF0aW9uX2ZpbGUgPC0gZmlsZS5wYXRoKGdldHdkKCksICIyOXJldi5odG1sIikgICMgQ29weSB0byBjdXJyZW50IGZvbGRlcgpmaWxlX2NvcGllZCA8LSBmaWxlLmNvcHkoc291cmNlX2ZpbGUsIGRlc3RpbmF0aW9uX2ZpbGUsIG92ZXJ3cml0ZSA9IFRSVUUpCgpgYGAKCiMjIyBbZ3VpZGUgMjlyZXZdKC4vMjlyZXYuaHRtbCkKCmBgYHtyLCBlY2hvID0gRkFMU0UsIGluY2x1ZGUgPSBGQUxTRX0KCnNvdXJjZV9maWxlIDwtIGZpbGUucGF0aCgiL2xybGhwcy9nZW5vbWljcy9wcm9kL2xnbS9kbmFfZWRpdGluZy9CTjI0LTk4NTFfQVBPQzNfVG9wOE9ETi9uZl9yZXN1bHRzL3N0YXRzL1NpdGVTZXFTZWNvbmRhcnlBbmFseXNpcy80MXJldi5odG1sIikKZGVzdGluYXRpb25fZmlsZSA8LSBmaWxlLnBhdGgoZ2V0d2QoKSwgIjQxcmV2Lmh0bWwiKSAgIyBDb3B5IHRvIGN1cnJlbnQgZm9sZGVyCmZpbGVfY29waWVkIDwtIGZpbGUuY29weShzb3VyY2VfZmlsZSwgZGVzdGluYXRpb25fZmlsZSwgb3ZlcndyaXRlID0gVFJVRSkKCmBgYAoKIyMjIFtndWlkZSA0MXJldl0oLi80MXJldi5odG1sKQoKYGBge3IsIGVjaG8gPSBGQUxTRSwgaW5jbHVkZSA9IEZBTFNFfQoKc291cmNlX2ZpbGUgPC0gZmlsZS5wYXRoKCIvbHJsaHBzL2dlbm9taWNzL3Byb2QvbGdtL2RuYV9lZGl0aW5nL0JOMjQtOTg1MV9BUE9DM19Ub3A4T0ROL25mX3Jlc3VsdHMvc3RhdHMvU2l0ZVNlcVNlY29uZGFyeUFuYWx5c2lzLzUycmV2Lmh0bWwiKQpkZXN0aW5hdGlvbl9maWxlIDwtIGZpbGUucGF0aChnZXR3ZCgpLCAiNTJyZXYuaHRtbCIpICAjIENvcHkgdG8gY3VycmVudCBmb2xkZXIKZmlsZV9jb3BpZWQgPC0gZmlsZS5jb3B5KHNvdXJjZV9maWxlLCBkZXN0aW5hdGlvbl9maWxlLCBvdmVyd3JpdGUgPSBUUlVFKQoKYGBgCgojIyMgW2d1aWRlIDUycmV2XSguLzUycmV2Lmh0bWwpCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9Cgpzb3VyY2VfZmlsZSA8LSBmaWxlLnBhdGgoIi9scmxocHMvZ2Vub21pY3MvcHJvZC9sZ20vZG5hX2VkaXRpbmcvQk4yNC05ODUxX0FQT0MzX1RvcDhPRE4vbmZfcmVzdWx0cy9zdGF0cy9TaXRlU2VxU2Vjb25kYXJ5QW5hbHlzaXMvNTNyZXYuaHRtbCIpCmRlc3RpbmF0aW9uX2ZpbGUgPC0gZmlsZS5wYXRoKGdldHdkKCksICI1M3Jldi5odG1sIikgICMgQ29weSB0byBjdXJyZW50IGZvbGRlcgpmaWxlX2NvcGllZCA8LSBmaWxlLmNvcHkoc291cmNlX2ZpbGUsIGRlc3RpbmF0aW9uX2ZpbGUsIG92ZXJ3cml0ZSA9IFRSVUUpCgpgYGAKCiMjIyBbZ3VpZGUgNTNyZXZdKC4vNTNyZXYuaHRtbCkKCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9Cgpzb3VyY2VfZmlsZSA8LSBmaWxlLnBhdGgoIi9scmxocHMvZ2Vub21pY3MvcHJvZC9sZ20vZG5hX2VkaXRpbmcvQk4yNC05ODUxX0FQT0MzX1RvcDhPRE4vbmZfcmVzdWx0cy9zdGF0cy9TaXRlU2VxU2Vjb25kYXJ5QW5hbHlzaXMvNjdmb3J3Lmh0bWwiKQpkZXN0aW5hdGlvbl9maWxlIDwtIGZpbGUucGF0aChnZXR3ZCgpLCAiNjdmb3J3Lmh0bWwiKSAgIyBDb3B5IHRvIGN1cnJlbnQgZm9sZGVyCmZpbGVfY29waWVkIDwtIGZpbGUuY29weShzb3VyY2VfZmlsZSwgZGVzdGluYXRpb25fZmlsZSwgb3ZlcndyaXRlID0gVFJVRSkKCmBgYAoKIyMjIFtndWlkZSA2N2ZvcnddKC4vNjdmb3J3Lmh0bWwpCgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgaW5jbHVkZSA9IEZBTFNFfQoKc291cmNlX2ZpbGUgPC0gZmlsZS5wYXRoKCIvbHJsaHBzL2dlbm9taWNzL3Byb2QvbGdtL2RuYV9lZGl0aW5nL0JOMjQtOTg1MV9BUE9DM19Ub3A4T0ROL25mX3Jlc3VsdHMvc3RhdHMvU2l0ZVNlcVNlY29uZGFyeUFuYWx5c2lzLzY4Zm9ydy5odG1sIikKZGVzdGluYXRpb25fZmlsZSA8LSBmaWxlLnBhdGgoZ2V0d2QoKSwgIjY4Zm9ydy5odG1sIikgICMgQ29weSB0byBjdXJyZW50IGZvbGRlcgpmaWxlX2NvcGllZCA8LSBmaWxlLmNvcHkoc291cmNlX2ZpbGUsIGRlc3RpbmF0aW9uX2ZpbGUsIG92ZXJ3cml0ZSA9IFRSVUUpCgpgYGAKCiMjIyBbZ3VpZGUgNjhmb3J3XSguLzY4Zm9ydy5odG1sKQoKCmBgYHtyLCBlY2hvID0gRkFMU0UsIGluY2x1ZGUgPSBGQUxTRX0KCnNvdXJjZV9maWxlIDwtIGZpbGUucGF0aCgiL2xybGhwcy9nZW5vbWljcy9wcm9kL2xnbS9kbmFfZWRpdGluZy9CTjI0LTk4NTFfQVBPQzNfVG9wOE9ETi9uZl9yZXN1bHRzL3N0YXRzL1NpdGVTZXFTZWNvbmRhcnlBbmFseXNpcy82cmV2Lmh0bWwiKQpkZXN0aW5hdGlvbl9maWxlIDwtIGZpbGUucGF0aChnZXR3ZCgpLCAiNnJldi5odG1sIikgICMgQ29weSB0byBjdXJyZW50IGZvbGRlcgpmaWxlX2NvcGllZCA8LSBmaWxlLmNvcHkoc291cmNlX2ZpbGUsIGRlc3RpbmF0aW9uX2ZpbGUsIG92ZXJ3cml0ZSA9IFRSVUUpCgpgYGAKCiMjIyBbZ3VpZGUgNnJldl0oLi82cmV2Lmh0bWwpCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9CmRhdCA8LSBjKCkKZ3VpZGVzICA9IGMoIjE3cmV2IiwgIjI5cmV2IiwgIjQxcmV2IiwgIjUycmV2IiwgIjUzcmV2IiwgIjY3Zm9ydyIsICI2OGZvcnciLCAiNnJldiIpCmZvcihndWlkZSBpbiBndWlkZXMpewpnZmlsZSA9IHBhc3RlMCgiL2xybGhwcy9nZW5vbWljcy9wcm9kL2xnbS9kbmFfZWRpdGluZy9CTjI0LTk4NTFfQVBPQzNfVG9wOE9ETi9uZl9yZXN1bHRzL3N0YXRzL1NpdGVTZXFTZWNvbmRhcnlBbmFseXNpcy8iLGd1aWRlLCAiLk9UX3Jhbmtfb3V0X2Fubm90YXRlZC50eHQiICkKeCA8LSByZWFkLnRhYmxlKGdmaWxlLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiXHQiKQp4IDwtIHN1YnNldCh4LCBDaHIgIT0gImNocjExIiAmIE9UX1N0YXJ0ICE9ICIxMTY4MzA2MDIiICYgT1RfRW5kICE9ICIxMTY4MzA2MjIiICkKc2l0ZXNfbm9taW5hdGVkX29kbnNlcSA8LSAgZGltKHgpWzFdCnNpdGVzX2luX2Nvc21pYyA8LSBsZW5ndGgod2hpY2goeCRUaWVyICE9ICJOQSIpKQpub19vZl9leG9uID0gbGVuZ3RoKHdoaWNoKHgkQW5ub3RhdGlvbiA9PSAiZXhvbiIpKQpub19vZl9pbnRyb24gPSBsZW5ndGgod2hpY2goeCRBbm5vdGF0aW9uID09ICJpbnRyb24iKSkKbm9fb2ZfaW50ZXJnZW5pYz0gbGVuZ3RoKHdoaWNoKHgkQW5ub3RhdGlvbiA9PSAiaW50ZXJnZW5pYyIpKQoKZGF0X2cgPC0gZGF0YS5mcmFtZShndWlkZSwgc2l0ZXNfbm9taW5hdGVkX29kbnNlcSwgc2l0ZXNfaW5fY29zbWljLCBub19vZl9leG9uLG5vX29mX2ludHJvbiAsbm9fb2ZfaW50ZXJnZW5pYykKZGF0IDwtIHJiaW5kKGRhdCwgZGF0X2cpCgp9CgoKYGBgCmBgYHtyfQpkYXRhdGFibGUoCiAgaGVhZChkYXQpLAogIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbigKICAgIHN0eWxlID0gJ2NhcHRpb24tc2lkZTogYm90dG9tOyB0ZXh0LWFsaWduOiBjZW50ZXI7JywKICAgICdTdW1tYXJ5IG9mIFNpdGVzOiAnLCBodG1sdG9vbHM6OmVtKCdodHRwczovL2xpbGx5LWppcmEuYXRsYXNzaWFuLm5ldC9icm93c2UvR1RFTi0yNDknKQogICkKKQoKYGBgCgoK