DE analysis between time points¶
Time comparison AP-axis
Notebook for performing the DESeq2 analysis
Here we perform DEseq2 analysis for each time comparison, i.e. to identify the genes that change between the time points (in anterior and posterior tissues).
This is performed on each condition separately.
Run each of the supplimentary DEseq 2 experiments
runDeseq2BetweenTime(paste('merged_df_anterior_wt_11-18_FEATURE_COUNTS_', date, '.csv', sep=''), paste('DEseq2_CNS_anterior_wt_11-18_', date, '.csv', sep=''))
[1] "========================== RUNNING merged_df_anterior_wt_11-18_FEATURE_COUNTS_20210124.csv ============================"
[1] "Dataset dimensions: 15117 8"
estimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "Deseq2 design: ~" "Deseq2 design: tissue + time"
out of 15117 with nonzero total read count
adjusted p-value < 0.1
LFC > 0 (up) : 6245, 41%
LFC < 0 (down) : 6115, 40%
outliers [1] : 0, 0%
low counts [2] : 0, 0%
(mean count < 7)
[1] see 'cooksCutoff' argument of ?results
[2] see 'independentFiltering' argument of ?results
log2 fold change (MLE): time 18 vs 11
Wald test p-value: time 18 vs 11
DataFrame with 15117 rows and 6 columns
baseMean log2FoldChange lfcSE stat pvalue padj
<numeric> <numeric> <numeric> <numeric> <numeric> <numeric>
70375-Ica1l 1318.03 5.64223 0.149042 37.8566 0.00000e+00 0.00000e+00
320840-Negr1 6555.41 4.71498 0.122025 38.6395 0.00000e+00 0.00000e+00
320429-Trank1 3790.13 7.58517 0.190022 39.9174 0.00000e+00 0.00000e+00
214230-Pak6 2996.26 6.53159 0.177697 36.7568 9.04325e-296 3.41767e-292
103967-Dnm3 4801.13 5.47815 0.149405 36.6663 2.51277e-294 7.59710e-291
... ... ... ... ... ... ...
108705-Pttg1ip 2247.3365 -0.000219204 0.0925904 -0.002367455 0.998111 0.998356
69297-Lrrc46 75.2733 0.000691936 0.3014340 0.002295482 0.998168 0.998356
21391-Tbxas1 45.1978 -0.000789042 0.3545447 -0.002225507 0.998224 0.998356
239170-Fam160b2 1476.2587 -0.000218608 0.1090903 -0.002003919 0.998401 0.998467
213980-Fbxw10 23.3805 -0.000273951 0.4918497 -0.000556982 0.999556 0.999556
runDeseq2BetweenTime(paste('merged_df_anterior_ko_11-18_FEATURE_COUNTS_', date, '.csv', sep=''), paste('DEseq2_CNS_anterior_ko_11-18_', date, '.csv', sep=''))
[1] "========================== RUNNING merged_df_anterior_ko_11-18_FEATURE_COUNTS_20210124.csv ============================"
[1] "Dataset dimensions: 15425 8"
estimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "Deseq2 design: ~" "Deseq2 design: tissue + time"
out of 15425 with nonzero total read count
adjusted p-value < 0.1
LFC > 0 (up) : 6302, 41%
LFC < 0 (down) : 6170, 40%
outliers [1] : 0, 0%
low counts [2] : 0, 0%
(mean count < 6)
[1] see 'cooksCutoff' argument of ?results
[2] see 'independentFiltering' argument of ?results
log2 fold change (MLE): time 18 vs 11
Wald test p-value: time 18 vs 11
DataFrame with 15425 rows and 6 columns
baseMean log2FoldChange lfcSE stat pvalue padj
<numeric> <numeric> <numeric> <numeric> <numeric> <numeric>
214230-Pak6 3184.69 6.06427 0.1292838 46.9066 0 0
213582-Map9 5829.16 3.22176 0.0802596 40.1417 0 0
269610-Chd5 6861.76 6.13684 0.1492642 41.1139 0 0
434128-Pnmal2 13655.54 3.98644 0.0589009 67.6805 0 0
93843-Pnck 2348.64 3.88132 0.0984787 39.4127 0 0
... ... ... ... ... ... ...
11777-Ap3s1 849.187 -0.000279388 0.0909826 -0.00307078 0.997550 0.997809
16009-Igfbp3 1099.478 0.000568137 0.2286891 0.00248432 0.998018 0.998212
72133-Trub1 1195.778 0.000145404 0.1054636 0.00137871 0.998900 0.999029
74479-Snx11 1548.126 0.000104932 0.0851620 0.00123214 0.999017 0.999082
69727-Usp46 2474.183 0.000118817 0.1047340 0.00113447 0.999095 0.999095
runDeseq2BetweenTime(paste('merged_df_anterior_wt_11-13_FEATURE_COUNTS_', date, '.csv', sep=''), paste('DEseq2_CNS_anterior_wt_11-13_', date, '.csv', sep=''))
[1] "========================== RUNNING merged_df_anterior_wt_11-13_FEATURE_COUNTS_20210124.csv ============================"
[1] "Dataset dimensions: 14789 8"
estimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
[1] "Deseq2 design: ~" "Deseq2 design: tissue + time"
out of 14789 with nonzero total read count
adjusted p-value < 0.1
LFC > 0 (up) : 5753, 39%
LFC < 0 (down) : 5754, 39%
outliers [1] : 0, 0%
low counts [2] : 0, 0%
(mean count < 6)
[1] see 'cooksCutoff' argument of ?results
[2] see 'independentFiltering' argument of ?results
log2 fold change (MLE): time 13 vs 11
Wald test p-value: time 13 vs 11
DataFrame with 14789 rows and 6 columns
baseMean log2FoldChange lfcSE stat pvalue padj
<numeric> <numeric> <numeric> <numeric> <numeric> <numeric>
78294-Rps27a 12325.95 -2.78582 0.0691907 -40.2630 0 0
268449-Rpl23a 10798.27 -3.84460 0.0918637 -41.8511 0 0
20918-Eif1 8917.69 -1.71713 0.0411784 -41.6998 0 0
170930-Sumo2 6345.09 -3.51959 0.0634919 -55.4336 0 0
13877-Erh 5990.03 -2.42839 0.0613256 -39.5983 0 0
... ... ... ... ... ... ...
56495-Asna1 3595.338 -1.47192e-04 0.0541694 -0.00271724 0.997832 0.998102
12857-Cox4i1 12540.921 1.75901e-04 0.0692759 0.00253914 0.997974 0.998128
17929-Myom1 102.304 5.43922e-04 0.2162432 0.00251533 0.997993 0.998128
94246-Arid4b 4591.562 1.53003e-04 0.0776083 0.00197147 0.998427 0.998481
67812-Ubxn4 5079.677 -9.23433e-05 0.0485119 -0.00190352 0.998481 0.998481
runDeseq2BetweenTime(paste('merged_df_anterior_ko_11-13_FEATURE_COUNTS_', date, '.csv', sep=''), paste('DEseq2_CNS_anterior_ko_11-13_', date, '.csv', sep=''))
[1] "========================== RUNNING merged_df_anterior_ko_11-13_FEATURE_COUNTS_20210124.csv ============================"
[1] "Dataset dimensions: 15071 8"
estimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
Print session info
sessionInfo()
R version 4.0.3 (2020-10-10)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Catalina 10.15.5
Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib
locale:
[1] en_AU.UTF-8/en_AU.UTF-8/en_AU.UTF-8/C/en_AU.UTF-8/en_AU.UTF-8
attached base packages:
[1] parallel stats4 stats graphics grDevices utils datasets methods base
other attached packages:
[1] DESeq2_1.28.1 SummarizedExperiment_1.18.2 DelayedArray_0.14.1 matrixStats_0.58.0 Biobase_2.48.0
[6] GenomicRanges_1.40.0 GenomeInfoDb_1.24.2 IRanges_2.22.2 S4Vectors_0.26.1 BiocGenerics_0.34.0
loaded via a namespace (and not attached):
[1] sass_0.4.0 bit64_4.0.5 jsonlite_1.7.2 splines_4.0.3 StanHeaders_2.21.0-7 RcppParallel_5.1.4 bslib_0.2.5
[8] assertthat_0.2.1 blob_1.2.1 GenomeInfoDbData_1.2.3 yaml_2.2.1 pillar_1.6.1 RSQLite_2.2.7 lattice_0.20-44
[15] glue_1.4.2 digest_0.6.27 RColorBrewer_1.1-2 XVector_0.28.0 colorspace_2.0-1 htmltools_0.5.1.1 Matrix_1.3-3
[22] XML_3.99-0.6 pkgconfig_2.0.3 sircle_0.0.0.9000 rstan_2.21.2 genefilter_1.70.0 zlibbioc_1.34.0 purrr_0.3.4
[29] xtable_1.8-4 scales_1.1.1 processx_3.5.2 BiocParallel_1.22.0 tibble_3.1.0 annotate_1.66.0 generics_0.1.0
[36] ggplot2_3.3.3 ellipsis_0.3.2 withr_2.4.2 cachem_1.0.5 cli_2.5.0 survival_3.2-11 magrittr_2.0.1
[43] crayon_1.4.1 ps_1.6.0 memoise_2.0.0 evaluate_0.14 fansi_0.4.2 pkgbuild_1.2.0 rsconnect_0.8.17
[50] loo_2.4.1 prettyunits_1.1.1 tools_4.0.3 lifecycle_1.0.0 stringr_1.4.0 V8_3.4.2 munsell_0.5.0
[57] locfit_1.5-9.4 callr_3.7.0 AnnotationDbi_1.50.3 compiler_4.0.3 jquerylib_0.1.4 rlang_0.4.11 grid_4.0.3
[64] RCurl_1.98-1.3 bitops_1.0-7 rmarkdown_2.8 codetools_0.2-18 gtable_0.3.0 curl_4.3.1 inline_0.3.18
[71] DBI_1.1.1 R6_2.5.0 gridExtra_2.3 knitr_1.33 dplyr_1.0.6 fastmap_1.1.0 bit_4.0.4
[78] utf8_1.2.1 stringi_1.5.3 Rcpp_1.0.6 vctrs_0.3.8 geneplotter_1.66.0 tidyselect_1.1.1 xfun_0.23
References:
Love MI, Huber W, Anders S (2014). “Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2.” Genome Biology, 15, 550. doi: 10.1186/s13059-014-0550-8.
LS0tCnRpdGxlOiAiVGltZSBjb21wYXJpc29uIEFQLWF4aXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKIyMgTm90ZWJvb2sgZm9yIHBlcmZvcm1pbmcgdGhlIERFU2VxMiBhbmFseXNpcwoKSGVyZSB3ZSBwZXJmb3JtIERFc2VxMiBhbmFseXNpcyBmb3IgZWFjaCB0aW1lIGNvbXBhcmlzb24sIGkuZS4gdG8gaWRlbnRpZnkgdGhlIGdlbmVzIHRoYXQgY2hhbmdlIGJldHdlZW4gdGhlIHRpbWUgcG9pbnRzIChpbiBhbnRlcmlvciBhbmQgcG9zdGVyaW9yIHRpc3N1ZXMpLgoKVGhpcyBpcyBwZXJmb3JtZWQgb24gZWFjaCBjb25kaXRpb24gc2VwYXJhdGVseS4KCmBgYHtyfQpsaWJyYXJ5KERFU2VxMikKCnByb2plY3RfZGlyIDwtICcuLi9kYXRhL3Jlc3VsdHMvZGVzZXEyLycKCmRhdGUgPC0gJzIwMjEwMTI0JwoKcnVuRGVzZXEyQmV0d2VlblRpbWUgPC0gZnVuY3Rpb24gKGZpbGVuYW1lLCBvdXRwdXRfZmlsZW5hbWUpIHsKCiAgICBmaWxlX3BhdGggPC0gcGFzdGUocHJvamVjdF9kaXIsIGZpbGVuYW1lLCBzZXA9JycpCiAgCiAgICBwcmludChwYXN0ZSgiPT09PT09PT09PT09PT09PT09PT09PT09PT0gUlVOTklORyAiLCBmaWxlbmFtZSwgIiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09Iiwgc2VwPSIiKSkKICAgICAgIyBodHRwczovL2Jpb2NvbmR1Y3Rvci5vcmcvcGFja2FnZXMvcmVsZWFzZS93b3JrZmxvd3MvdmlnbmV0dGVzL3JuYXNlcUdlbmUvaW5zdC9kb2Mvcm5hc2VxR2VuZS5odG1sCiAgICBjb3VudHMgPC0gcmVhZC5jc3YoZmlsZV9wYXRoLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiLCIpCiAgICByb3duYW1lcyhjb3VudHMpIDwtIGNvdW50cyR1X2lkCgogICAgIyBMZXQncyBtYWtlIHN1cmUgb3VyIGNvdW50IGRhdGEgaXMgaW4gbWF0cml4IGZvcm1hdCBhbmQgaXMgb25seSB0aGUgbnVtZXJpYyBjb2x1bW5zIGkuZS4gZXZlcnl0aGluZyBidXQgdGhlIGdlbmVzCiAgICBjb3VudHMgPC0gY291bnRzWywyOm5jb2woY291bnRzKV0KCiAgICBzYW1wbGVfbmFtZXMgPC0gY29sbmFtZXMoY291bnRzKSAjIFNhbXBsZSBuYW1lcwogICAgCiAgICAjIE1ha2Ugc3VyZSB3ZSBkb24ndCBpbmNsdWRlIHRoZSBJRCBpbiBvdXIgY29sdW1ucwogICAgY291bnRfbWF0cml4IDwtIGFzLm1hdHJpeChjb3VudHMpCiAgICAKICAgICMgV2Ugbm93IHNldCB0aGUgcm93IG5hbWVzIHRvIGJlIHRoZSBnZW5lIElEcwogICAgcm93bmFtZXMoY291bnRfbWF0cml4KSA8LSByb3duYW1lcyhjb3VudHMpIAogICAgCiAgICAjIFNlcGFyYXRlIG91dCBlYWNoIG9mIHRoZSBzYW1wbGUgbmFtZXMgdG8gYmUgdGhlIGRpZmZlcmVudCBleHBlcmltZW50IGNvbmRpdGlvbnMKICAgIGNvbmRpdGlvbiA8LSBmYWN0b3Ioc2FwcGx5KHNhbXBsZV9uYW1lcywgZnVuY3Rpb24oeCl7c3Vic3RyKHgsIHN0YXJ0ID0gMSwgc3RvcCA9IDIpfSkpCiAgICB0aW1lIDwtIGZhY3RvcihzYXBwbHkoc2FtcGxlX25hbWVzLCBmdW5jdGlvbih4KXtzdWJzdHIoeCwgc3RhcnQgPSAzLCBzdG9wID0gNCl9KSkKICAgIHRpc3N1ZSA8LSBmYWN0b3Ioc2FwcGx5KHNhbXBsZV9uYW1lcywgZnVuY3Rpb24oeCl7c3Vic3RyKHgsIHN0YXJ0ID0gNSwgc3RvcCA9IDYpfSkpCiAgICBjb25kaXRpb25faWQgPC0gZmFjdG9yKHNhcHBseShzYW1wbGVfbmFtZXMsIGZ1bmN0aW9uKHgpe2lmIChncmVwbCgia28iLCB4LCBmaXhlZCA9IFRSVUUpKSB7MX0gZWxzZSB7MH19KSkKCiAgICAjIEZvciBERXNlcTIgd2UgbmVlZCB0byB0dXJuIHRoaXMgaW50byBhIGRhdGFmcmFtZSAKICAgIHNhbXBsZV9kZiA9IGRhdGEuZnJhbWUoc2FtcGxlX25hbWVzID0gc2FtcGxlX25hbWVzLCBjb25kaXRpb24gPSBjb25kaXRpb24sIHRpbWUgPSB0aW1lLCB0aXNzdWUgPSB0aXNzdWUsIGNvbmRpdGlvbl9pZD1jb25kaXRpb25faWQpCiAgICBkZHNfbWF0IDwtIERFU2VxRGF0YVNldEZyb21NYXRyaXgoY291bnREYXRhID0gY291bnRfbWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sRGF0YSA9IHNhbXBsZV9kZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbiA9IH50aXNzdWUrdGltZSkgIyBIYXZlIHRpc3N1ZSBhcyBhIGZhY3RvcgogICAgCiAgICBkZHMgPC0gZXN0aW1hdGVTaXplRmFjdG9ycyhkZHNfbWF0KQogICAgCiAgICBkZHNfbWF0JGRlc2lnbiAjIFByaW50IHRoZSBkZXNpZ24gb2YgdGhlIGV4cGVyaW1lbnQKICAgIGRkcyA8LSBlc3RpbWF0ZVNpemVGYWN0b3JzKGRkc19tYXQpCiAgICAKICAgIG51bV9zYW1wbGVzX21lZXRpbmdfY3JpdGVyaWEgPC0gNCAgIyBiZSBzdHJpY3QgYW5kIGVuZm9yY2UgdGhhdCBhdCBsZWFzdCBoYWxmIHRoZSBzYW1wbGVzIG5lZWQgdG8gbWVldCB0aGUgY3JpdGVyaWEgKGkuZS4gb25lIGZ1bGwgY29uZGl0aW9uKQogICAgbnVtX2NvdW50c19pbl9nZW5lIDwtIDEwICAjIFRoZXkgbmVlZCBhdCBsZWFzdCAxMCBjb3VudHMKICAgIGtlZXAgPC0gcm93U3Vtcyhjb3VudHMoZGRzX21hdCkgPj0gbnVtX2NvdW50c19pbl9nZW5lKSA+PSBudW1fc2FtcGxlc19tZWV0aW5nX2NyaXRlcmlhCiAgICBkZHMgPC0gZGRzX21hdFtrZWVwLF0gIyBPbmx5IGtlZXAgdGhlIHJvd3Mgd2l0aCB0aGlzIGNyaXRlcmlhCiAgICAKICAgICAjIExldCdzIHByaW50IHRoZSBudW1iZXIgb2Ygcm93cwogICAgcHJpbnQocGFzdGUoIkRhdGFzZXQgZGltZW5zaW9uczogIiwgbnJvdyhkZHMpLCBuY29sKGRkcykpKQogICAgaWYgKG5jb2woZGRzKSAhPSA4KSB7CiAgICAgIHByaW50KHBhc3RlKCI9PT09PT09PT09PT09PT09PT0gV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgWU9VUiBDT0xVTU5TIE1BWSBIQVZFIFRIRSBXUk9ORyBESU1TICA9PT09PT09PT09PT09PT09PT09PT09PT09PT0iLCBzZXA9IiIpKQogICAgfQogICAgCiAgICAjIFJ1biBERXNlcTIKICAgIGRkcyA8LSBERVNlcShkZHMpCiAgICAKICAgICMgQnVpbGQgcmVzdWx0cyB0YWJsZQogICAgcmVzIDwtIHJlc3VsdHMoZGRzKQogICAgcHJpbnQocGFzdGUoIkRlc2VxMiBkZXNpZ246ICIsIGRlc2lnbihkZHMpKSkKCiAgICAjIFN1bWFyaXNlIHRoZSByZXN1bHRzCiAgICBzdW1tYXJ5KHJlcykKICAgIAogICAgIyBMYXN0bHksIHdlIG1heSB3YW50IHRvIHNlZSB0aGUgcmVzdWx0cyBvZiB0aGUgaGlnaCBsb2dmb2xkY2hhbmdlIGUuZy4gPiAxIHdpdGggYSBwYWRqIHZhbHVlIDwgMC4wNQogICAgcmVzX3BhZGowNV9sZmMxIDwtIHJlc3VsdHMoZGRzLCBsZmNUaHJlc2hvbGQ9MikKICAgIHRhYmxlKHJlc19wYWRqMDVfbGZjMSRwYWRqIDwgMC4wNSkKICAgIAogICAgIyBTYXZlIHRoZSByZXN1bHRzCiAgICByZXNfb3JkZXJlZCA8LSByZXNbb3JkZXIocmVzJHB2YWx1ZSksXQogICAgb3V0cHV0X2ZpbGVuYW1lIDwtIHBhc3RlKHByb2plY3RfZGlyLCBvdXRwdXRfZmlsZW5hbWUsIHNlcD0nJykKICAgIHdyaXRlLmNzdihyZXNfb3JkZXJlZCwgZmlsZSA9IG91dHB1dF9maWxlbmFtZSkKICAgIHJldHVybihyZXNfb3JkZXJlZCkKfQoKYGBgCgoKIyMgUnVuIGVhY2ggb2YgdGhlIHN1cHBsaW1lbnRhcnkgREVzZXEgMiBleHBlcmltZW50cwoKYGBge3J9CnJ1bkRlc2VxMkJldHdlZW5UaW1lKHBhc3RlKCdtZXJnZWRfZGZfYW50ZXJpb3Jfd3RfMTEtMThfRkVBVFVSRV9DT1VOVFNfJywgZGF0ZSwgJy5jc3YnLCBzZXA9JycpLCBwYXN0ZSgnREVzZXEyX0NOU19hbnRlcmlvcl93dF8xMS0xOF8nLCBkYXRlLCAnLmNzdicsIHNlcD0nJykpCnJ1bkRlc2VxMkJldHdlZW5UaW1lKHBhc3RlKCdtZXJnZWRfZGZfYW50ZXJpb3Jfa29fMTEtMThfRkVBVFVSRV9DT1VOVFNfJywgZGF0ZSwgJy5jc3YnLCBzZXA9JycpLCBwYXN0ZSgnREVzZXEyX0NOU19hbnRlcmlvcl9rb18xMS0xOF8nLCBkYXRlLCAnLmNzdicsIHNlcD0nJykpCgpydW5EZXNlcTJCZXR3ZWVuVGltZShwYXN0ZSgnbWVyZ2VkX2RmX2FudGVyaW9yX3d0XzExLTEzX0ZFQVRVUkVfQ09VTlRTXycsIGRhdGUsICcuY3N2Jywgc2VwPScnKSwgcGFzdGUoJ0RFc2VxMl9DTlNfYW50ZXJpb3Jfd3RfMTEtMTNfJywgZGF0ZSwgJy5jc3YnLCBzZXA9JycpKQpydW5EZXNlcTJCZXR3ZWVuVGltZShwYXN0ZSgnbWVyZ2VkX2RmX2FudGVyaW9yX2tvXzExLTEzX0ZFQVRVUkVfQ09VTlRTXycsIGRhdGUsICcuY3N2Jywgc2VwPScnKSwgcGFzdGUoJ0RFc2VxMl9DTlNfYW50ZXJpb3Jfa29fMTEtMTNfJywgZGF0ZSwgJy5jc3YnLCBzZXA9JycpKQoKcnVuRGVzZXEyQmV0d2VlblRpbWUocGFzdGUoJ21lcmdlZF9kZl9hbnRlcmlvcl93dF8xMy0xOF9GRUFUVVJFX0NPVU5UU18nLCBkYXRlLCAnLmNzdicsIHNlcD0nJyksIHBhc3RlKCdERXNlcTJfQ05TX2FudGVyaW9yX3d0XzEzLTE4XycsIGRhdGUsICcuY3N2Jywgc2VwPScnKSkKcnVuRGVzZXEyQmV0d2VlblRpbWUocGFzdGUoJ21lcmdlZF9kZl9hbnRlcmlvcl9rb18xMy0xOF9GRUFUVVJFX0NPVU5UU18nLCBkYXRlLCAnLmNzdicsIHNlcD0nJyksIHBhc3RlKCdERXNlcTJfQ05TX2FudGVyaW9yX2tvXzEzLTE4XycsIGRhdGUsICcuY3N2Jywgc2VwPScnKSkKCnJ1bkRlc2VxMkJldHdlZW5UaW1lKHBhc3RlKCdtZXJnZWRfZGZfYW50ZXJpb3Jfd3RfMTEtMTVfRkVBVFVSRV9DT1VOVFNfJywgZGF0ZSwgJy5jc3YnLCBzZXA9JycpLCBwYXN0ZSgnREVzZXEyX0NOU19hbnRlcmlvcl93dF8xMS0xNV8nLCBkYXRlLCAnLmNzdicsIHNlcD0nJykpCnJ1bkRlc2VxMkJldHdlZW5UaW1lKHBhc3RlKCdtZXJnZWRfZGZfYW50ZXJpb3Jfa29fMTEtMTVfRkVBVFVSRV9DT1VOVFNfJywgZGF0ZSwgJy5jc3YnLCBzZXA9JycpLCBwYXN0ZSgnREVzZXEyX0NOU19hbnRlcmlvcl9rb18xMS0xNV8nLCBkYXRlLCAnLmNzdicsIHNlcD0nJykpCgpydW5EZXNlcTJCZXR3ZWVuVGltZShwYXN0ZSgnbWVyZ2VkX2RmX2FudGVyaW9yX3d0XzEzLTE1X0ZFQVRVUkVfQ09VTlRTXycsIGRhdGUsICcuY3N2Jywgc2VwPScnKSwgcGFzdGUoJ0RFc2VxMl9DTlNfYW50ZXJpb3Jfd3RfMTMtMTVfJywgZGF0ZSwgJy5jc3YnLCBzZXA9JycpKQpydW5EZXNlcTJCZXR3ZWVuVGltZShwYXN0ZSgnbWVyZ2VkX2RmX2FudGVyaW9yX2tvXzEzLTE1X0ZFQVRVUkVfQ09VTlRTXycsIGRhdGUsICcuY3N2Jywgc2VwPScnKSwgcGFzdGUoJ0RFc2VxMl9DTlNfYW50ZXJpb3Jfa29fMTMtMTVfJywgZGF0ZSwgJy5jc3YnLCBzZXA9JycpKQoKcnVuRGVzZXEyQmV0d2VlblRpbWUocGFzdGUoJ21lcmdlZF9kZl9hbnRlcmlvcl93dF8xNS0xOF9GRUFUVVJFX0NPVU5UU18nLCBkYXRlLCAnLmNzdicsIHNlcD0nJyksIHBhc3RlKCdERXNlcTJfQ05TX2FudGVyaW9yX3d0XzE1LTE4XycsIGRhdGUsICcuY3N2Jywgc2VwPScnKSkKcnVuRGVzZXEyQmV0d2VlblRpbWUocGFzdGUoJ21lcmdlZF9kZl9hbnRlcmlvcl9rb18xNS0xOF9GRUFUVVJFX0NPVU5UU18nLCBkYXRlLCAnLmNzdicsIHNlcD0nJyksIHBhc3RlKCdERXNlcTJfQ05TX2FudGVyaW9yX2tvXzE1LTE4XycsIGRhdGUsICcuY3N2Jywgc2VwPScnKSkKCnJ1bkRlc2VxMkJldHdlZW5UaW1lKHBhc3RlKCdtZXJnZWRfZGZfcG9zdGVyaW9yX3d0XzExLTE4X0ZFQVRVUkVfQ09VTlRTXycsIGRhdGUsICcuY3N2Jywgc2VwPScnKSwgcGFzdGUoJ0RFc2VxMl9DTlNfcG9zdGVyaW9yX3d0XzExLTE4XycsIGRhdGUsICcuY3N2Jywgc2VwPScnKSkKcnVuRGVzZXEyQmV0d2VlblRpbWUocGFzdGUoJ21lcmdlZF9kZl9wb3N0ZXJpb3Jfa29fMTEtMThfRkVBVFVSRV9DT1VOVFNfJywgZGF0ZSwgJy5jc3YnLCBzZXA9JycpLCBwYXN0ZSgnREVzZXEyX0NOU19wb3N0ZXJpb3Jfa29fMTEtMThfJywgZGF0ZSwgJy5jc3YnLCBzZXA9JycpKQoKcnVuRGVzZXEyQmV0d2VlblRpbWUocGFzdGUoJ21lcmdlZF9kZl9wb3N0ZXJpb3Jfd3RfMTEtMTNfRkVBVFVSRV9DT1VOVFNfJywgZGF0ZSwgJy5jc3YnLCBzZXA9JycpLCBwYXN0ZSgnREVzZXEyX0NOU19wb3N0ZXJpb3Jfd3RfMTEtMTNfJywgZGF0ZSwgJy5jc3YnLCBzZXA9JycpKQpydW5EZXNlcTJCZXR3ZWVuVGltZShwYXN0ZSgnbWVyZ2VkX2RmX3Bvc3Rlcmlvcl9rb18xMS0xM19GRUFUVVJFX0NPVU5UU18nLCBkYXRlLCAnLmNzdicsIHNlcD0nJyksIHBhc3RlKCdERXNlcTJfQ05TX3Bvc3Rlcmlvcl9rb18xMS0xM18nLCBkYXRlLCAnLmNzdicsIHNlcD0nJykpCgpydW5EZXNlcTJCZXR3ZWVuVGltZShwYXN0ZSgnbWVyZ2VkX2RmX3Bvc3Rlcmlvcl93dF8xMy0xOF9GRUFUVVJFX0NPVU5UU18nLCBkYXRlLCAnLmNzdicsIHNlcD0nJyksIHBhc3RlKCdERXNlcTJfQ05TX3Bvc3Rlcmlvcl93dF8xMy0xOF8nLCBkYXRlLCAnLmNzdicsIHNlcD0nJykpCnJ1bkRlc2VxMkJldHdlZW5UaW1lKHBhc3RlKCdtZXJnZWRfZGZfcG9zdGVyaW9yX2tvXzEzLTE4X0ZFQVRVUkVfQ09VTlRTXycsIGRhdGUsICcuY3N2Jywgc2VwPScnKSwgcGFzdGUoJ0RFc2VxMl9DTlNfcG9zdGVyaW9yX2tvXzEzLTE4XycsIGRhdGUsICcuY3N2Jywgc2VwPScnKSkKCnJ1bkRlc2VxMkJldHdlZW5UaW1lKHBhc3RlKCdtZXJnZWRfZGZfcG9zdGVyaW9yX3d0XzE1LTE4X0ZFQVRVUkVfQ09VTlRTXycsIGRhdGUsICcuY3N2Jywgc2VwPScnKSwgcGFzdGUoJ0RFc2VxMl9DTlNfcG9zdGVyaW9yX3d0XzE1LTE4XycsIGRhdGUsICcuY3N2Jywgc2VwPScnKSkKcnVuRGVzZXEyQmV0d2VlblRpbWUocGFzdGUoJ21lcmdlZF9kZl9wb3N0ZXJpb3Jfa29fMTUtMThfRkVBVFVSRV9DT1VOVFNfJywgZGF0ZSwgJy5jc3YnLCBzZXA9JycpLCBwYXN0ZSgnREVzZXEyX0NOU19wb3N0ZXJpb3Jfa29fMTUtMThfJywgZGF0ZSwgJy5jc3YnLCBzZXA9JycpKQoKcnVuRGVzZXEyQmV0d2VlblRpbWUocGFzdGUoJ21lcmdlZF9kZl9wb3N0ZXJpb3Jfd3RfMTEtMTVfRkVBVFVSRV9DT1VOVFNfJywgZGF0ZSwgJy5jc3YnLCBzZXA9JycpLCBwYXN0ZSgnREVzZXEyX0NOU19wb3N0ZXJpb3Jfd3RfMTEtMTVfJywgZGF0ZSwgJy5jc3YnLCBzZXA9JycpKQpydW5EZXNlcTJCZXR3ZWVuVGltZShwYXN0ZSgnbWVyZ2VkX2RmX3Bvc3Rlcmlvcl9rb18xMS0xNV9GRUFUVVJFX0NPVU5UU18nLCBkYXRlLCAnLmNzdicsIHNlcD0nJyksIHBhc3RlKCdERXNlcTJfQ05TX3Bvc3Rlcmlvcl9rb18xMS0xNV8nLCBkYXRlLCAnLmNzdicsIHNlcD0nJykpCgpydW5EZXNlcTJCZXR3ZWVuVGltZShwYXN0ZSgnbWVyZ2VkX2RmX3Bvc3Rlcmlvcl93dF8xMy0xNV9GRUFUVVJFX0NPVU5UU18nLCBkYXRlLCAnLmNzdicsIHNlcD0nJyksIHBhc3RlKCdERXNlcTJfQ05TX3Bvc3Rlcmlvcl93dF8xMy0xNV8nLCBkYXRlLCAnLmNzdicsIHNlcD0nJykpCnJ1bkRlc2VxMkJldHdlZW5UaW1lKHBhc3RlKCdtZXJnZWRfZGZfcG9zdGVyaW9yX2tvXzEzLTE1X0ZFQVRVUkVfQ09VTlRTXycsIGRhdGUsICcuY3N2Jywgc2VwPScnKSwgcGFzdGUoJ0RFc2VxMl9DTlNfcG9zdGVyaW9yX2tvXzEzLTE1XycsIGRhdGUsICcuY3N2Jywgc2VwPScnKSkKYGBgCgojIyMgUHJpbnQgc2Vzc2lvbiBpbmZvCmBgYHtyfQpzZXNzaW9uSW5mbygpCmBgYAoKIyMjIFJlZmVyZW5jZXM6CgpMb3ZlIE1JLCBIdWJlciBXLCBBbmRlcnMgUyAoMjAxNCkuIOKAnE1vZGVyYXRlZCBlc3RpbWF0aW9uIG9mIGZvbGQgY2hhbmdlIGFuZCBkaXNwZXJzaW9uIGZvciBSTkEtc2VxIGRhdGEgd2l0aCBERVNlcTIu4oCdIEdlbm9tZSBCaW9sb2d5LCAxNSwgNTUwLiBkb2k6IDEwLjExODYvczEzMDU5LTAxNC0wNTUwLTguCgo=