1 M. musculus

This will be a very minimal analysis until we get some replicates.

1.2 Metadata

I am going to write a quick sample sheet in the current working directory called ‘all_samples.xlsx’ and put the names of the count tables in it.

1.3 Create expressionsets

Here I combine the metadata, count data, and annotations.

It is worth noting that the gene IDs from htseq-count probably do not match the annotations retrieved because they are likely exon-based rather than gene based. This is not really a problem, but don’t forget it!

1.4 Query expressionsets

In this block I will calculate all the diagnostic plots, but not show them. I will show them next with a little annotation.

I will leave the output for the first of each invocation and silence it for the second.

## This function will replace the expt$expressionset slot with:
## log2(cpm(quant(cbcb(data))))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 2794 low-count genes (3970 remaining).
## Step 2: normalizing the data with quant.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## transform_counts: Found 1105 values equal to 0, adding 1 to the matrix.
## Step 5: not doing batch correction.

1.6 Do a simple DE

The only interesting DE I see in this is to compare the retinas to the dlgns. I can treat them as replicates and compare.

## This function will replace the expt$expressionset slot with:
## log2(cpm(quant(cbcb(data))))
## It will save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep libsizes in mind
##  when invoking limma.  The appropriate libsize is non-log(cpm(normalized)).
##  This is most likely kept at:
##  'new_expt$normalized$intermediate_counts$normalization$libsizes'
##  A copy of this may also be found at:
##  new_expt$best_libsize
## Not correcting the count-data for batch effects.  If batch is
##  included in EdgerR/limma's model, then this is probably wise; but in extreme
##  batch effects this is a good parameter to play with.
## Step 1: performing count filter with option: cbcb
## Removing 2794 low-count genes (3970 remaining).
## Step 2: normalizing the data with quant.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## transform_counts: Found 1105 values equal to 0, adding 1 to the matrix.
## Step 5: not doing batch correction.
## Plotting a PCA before surrogates/batch inclusion.
## Not putting labels on the plot.
## Assuming no batch in model for testing pca.
## Not putting labels on the plot.
## Finished running DE analyses, collecting outputs.
## Comparing analyses.

2 Some pictures

As I understand it, there is some interest in an ontology search using the ratio of ratios.

## [1] 599
## [1] 550
## Performing gProfiler GO search of 599 genes against mmusculus.
## GO search found 95 hits.
## Performing gProfiler KEGG search of 599 genes against mmusculus.
## KEGG search found 2 hits.
## Performing gProfiler REAC search of 599 genes against mmusculus.
## REAC search found 0 hits.
## Performing gProfiler MI search of 599 genes against mmusculus.
## MI search found 0 hits.
## Performing gProfiler TF search of 599 genes against mmusculus.
## TF search found 38 hits.
## Performing gProfiler CORUM search of 599 genes against mmusculus.
## CORUM search found 0 hits.
## Performing gProfiler HP search of 599 genes against mmusculus.
## HP search found 4 hits.
## Writing data to: excel/20200110mm_ror_gpfoiler_up-v20200110.xlsx.
## Finished writing data.

## Performing gProfiler GO search of 550 genes against mmusculus.
## GO search found 243 hits.
## Performing gProfiler KEGG search of 550 genes against mmusculus.
## KEGG search found 12 hits.
## Performing gProfiler REAC search of 550 genes against mmusculus.
## REAC search found 5 hits.
## Performing gProfiler MI search of 550 genes against mmusculus.
## MI search found 0 hits.
## Performing gProfiler TF search of 550 genes against mmusculus.
## TF search found 37 hits.
## Performing gProfiler CORUM search of 550 genes against mmusculus.
## CORUM search found 0 hits.
## Performing gProfiler HP search of 550 genes against mmusculus.
## HP search found 0 hits.
## Writing data to: excel/20200110mm_ror_gpfoiler_down-v20200110.xlsx.
## Finished writing data.

LS0tCnRpdGxlOiAiTS4gbXVzY3VsdXMgMyBjZWxsIHR5cGVzLCAxIHRpbWVwb2ludCwgMyBnZW5vdHlwZXMsIGFuZCAxIHJlcGxpY2F0ZS4iCmF1dGhvcjogImF0YiBhYmVsZXdAZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgdGhlbWU6IHJlYWRhYmxlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBkZl9wcmludDogcGFnZWQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIHdpZHRoOiAzMDAKICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBCaW9jU3R5bGU6Omh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5LCB0ZCB7CiAgZm9udC1zaXplOiAxNnB4Owp9CmNvZGUucnsKICBmb250LXNpemU6IDE2cHg7Cn0KcHJlIHsKIGZvbnQtc2l6ZTogMTZweAp9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KCJocGdsdG9vbHMiKQp0dCA8LSBkZXZ0b29sczo6bG9hZF9hbGwoIi9kYXRhL2hwZ2x0b29scyIpCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHdpZHRoPTEyMCwKICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3M9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1UUlVFLAogICAgICAgICAgICAgICAgICAgICBlY2hvPVRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgZHBpPTk2KQpvbGRfb3B0aW9ucyA8LSBvcHRpb25zKGRpZ2l0cz00LAogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsPSJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemU9MTApKQpydW5kYXRlIDwtIGZvcm1hdChTeXMuRGF0ZSgpLCBmb3JtYXQ9IiVZJW0lZCIpCnByZXZpb3VzX2ZpbGUgPC0gInVuZGVmaW5lZC5SbWQiCnZlciA8LSAiMjAyMDAxMTAiCgojI3RtcCA8LSBzbShsb2FkbWUoZmlsZW5hbWU9cGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1wcmV2aW91c19maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpKSkKcm1kX2ZpbGUgPC0gImluZGV4LlJtZCIKYGBgCgojIE0uIG11c2N1bHVzCgpUaGlzIHdpbGwgYmUgYSB2ZXJ5IG1pbmltYWwgYW5hbHlzaXMgdW50aWwgd2UgZ2V0IHNvbWUgcmVwbGljYXRlcy4KCiMjIEFubm90YXRpb25zCgpJIGFtIHVzaW5nIG1tMzhfOTUuCgpgYGB7ciBhbm5vdGF0aW9uc30KIyMgTXkgbG9hZF9iaW9tYXJ0X2Fubm90YXRpb25zKCkgZnVuY3Rpb24gZGVmYXVsdHMgdG8gaHVtYW4sIHNvIHRoYXQgd2lsbCBiZSBxdWljay4KbW1fYW5ub3QgPC0gbG9hZF9iaW9tYXJ0X2Fubm90YXRpb25zKHNwZWNpZXM9Im1tdXNjdWx1cyIpCm1tX2Fubm90IDwtIG1tX2Fubm90W1siYW5ub3RhdGlvbiJdXQptbV9hbm5vdFtbInR4aWQiXV0gPC0gcGFzdGUwKG1tX2Fubm90W1siZW5zZW1ibF90cmFuc2NyaXB0X2lkIl1dLCAiLiIsIG1tX2Fubm90W1sidmVyc2lvbiJdXSkKcm93bmFtZXMobW1fYW5ub3QpIDwtIG1ha2UubmFtZXMobW1fYW5ub3RbWyJlbnNlbWJsX2dlbmVfaWQiXV0sIHVuaXF1ZT1UUlVFKQoKdHhfZ2VuZV9tYXAgPC0gbW1fYW5ub3RbLCBjKCJ0eGlkIiwgImVuc2VtYmxfZ2VuZV9pZCIpXQpgYGAKClNvLCBJIG5vdyBoYXZlIDIgZGF0YSBmcmFtZXMgb2YgcGFyYXNpdGUgYW5ub3RhdGlvbnMgYW5kIDEgaHVtYW4uCgojIyBNZXRhZGF0YQoKSSBhbSBnb2luZyB0byB3cml0ZSBhIHF1aWNrIHNhbXBsZSBzaGVldCBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBjYWxsZWQKJ2FsbF9zYW1wbGVzLnhsc3gnIGFuZCBwdXQgdGhlIG5hbWVzIG9mIHRoZSBjb3VudCB0YWJsZXMgaW4gaXQuCgojIyBDcmVhdGUgZXhwcmVzc2lvbnNldHMKCkhlcmUgSSBjb21iaW5lIHRoZSBtZXRhZGF0YSwgY291bnQgZGF0YSwgYW5kIGFubm90YXRpb25zLgoKSXQgaXMgd29ydGggbm90aW5nIHRoYXQgdGhlIGdlbmUgSURzIGZyb20gaHRzZXEtY291bnQgcHJvYmFibHkgZG8gbm90IG1hdGNoIHRoZQphbm5vdGF0aW9ucyByZXRyaWV2ZWQgYmVjYXVzZSB0aGV5IGFyZSBsaWtlbHkgZXhvbi1iYXNlZCByYXRoZXIgdGhhbiBnZW5lCmJhc2VkLiAgVGhpcyBpcyBub3QgcmVhbGx5IGEgcHJvYmxlbSwgYnV0IGRvbid0IGZvcmdldCBpdCEKCmBgYHtyIGV4cHR9Cm1tMzhfc2FsbW9uIDwtIHNtKGNyZWF0ZV9leHB0KCJzYW1wbGVfc2hlZXRzL2FsbF9zYW1wbGVzLnhsc3giLCB0eF9nZW5lX21hcD10eF9nZW5lX21hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZV9pbmZvPW1tX2Fubm90LCBmaWxlX2NvbHVtbj0ic2FsbW9uZmlsZSIpKQoKbW10eF9hbm5vdCA8LSBtbV9hbm5vdApyb3duYW1lcyhtbXR4X2Fubm90KSA8LSBtbV9hbm5vdFtbInR4aWQiXV0KbW0zOF9zYWx0eCA8LSBzbShjcmVhdGVfZXhwdCgic2FtcGxlX3NoZWV0cy9hbGxfc2FtcGxlcy54bHN4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lX2luZm89bW10eF9hbm5vdCwgZmlsZV9jb2x1bW49InNhbG1vbmZpbGUiKSkKCmhpc2F0X2Fubm90IDwtIG1tX2Fubm90CiMjbW0zOF9oaXNhdCA8LSBjcmVhdGVfZXhwdCgic2FtcGxlX3NoZWV0cy9hbGxfc2FtcGxlcy54bHN4IiwKIyMgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVfaW5mbz1oaXNhdF9hbm5vdCkKYGBgCgojIyBRdWVyeSBleHByZXNzaW9uc2V0cwoKSW4gdGhpcyBibG9jayBJIHdpbGwgY2FsY3VsYXRlIGFsbCB0aGUgZGlhZ25vc3RpYyBwbG90cywgYnV0IG5vdCBzaG93IHRoZW0uICBJCndpbGwgc2hvdyB0aGVtIG5leHQgd2l0aCBhIGxpdHRsZSBhbm5vdGF0aW9uLgoKSSB3aWxsIGxlYXZlIHRoZSBvdXRwdXQgZm9yIHRoZSBmaXJzdCBvZiBlYWNoIGludm9jYXRpb24gYW5kIHNpbGVuY2UgaXQgZm9yIHRoZSBzZWNvbmQuCgpgYGB7ciBxdWVyeSwgZmlnLnNob3c9ImhpZGUifQptbTM4X3Bsb3RzIDwtIHNtKGdyYXBoX21ldHJpY3MobW0zOF9zYWxtb24pKQoKbW0zOF9ub3JtIDwtIG5vcm1hbGl6ZV9leHB0KG1tMzhfc2FsbW9uLCBub3JtPSJxdWFudCIsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09ImxvZzIiLCBmaWx0ZXI9VFJVRSkKCm1tMzhuX3Bsb3RzIDwtIHNtKGdyYXBoX21ldHJpY3MobW0zOF9ub3JtKSkKYGBgCgojIyBTaG93IHNvbWUgcGxvdHMKCmBgYHtyIHNob3dfcGxvdHN9Cm1tMzhfcGxvdHMkbGVnZW5kCm1tMzhfcGxvdHMkbGlic2l6ZQptbTM4X3Bsb3RzJG5vbnplcm8KbW0zOG5fcGxvdHMkZGVuc2l0eQptbTM4bl9wbG90cyRwY19wbG90CmBgYAoKIyMgRG8gYSBzaW1wbGUgREUKClRoZSBvbmx5IGludGVyZXN0aW5nIERFIEkgc2VlIGluIHRoaXMgaXMgdG8gY29tcGFyZSB0aGUgcmV0aW5hcyB0byB0aGUgZGxnbnMuCkkgY2FuIHRyZWF0IHRoZW0gYXMgcmVwbGljYXRlcyBhbmQgY29tcGFyZS4KCmBgYHtyIGRlLCBmaWcuc2hvdz0iaGlkZSJ9Cm1tIDwtIHNldF9leHB0X2NvbmRpdGlvbnMobW0zOF9zYWxtb24sIGZhY3Q9ImNlbGx0eXBlIikKbW1fbm9ybSA8LSBzbShub3JtYWxpemVfZXhwdChtbSwgbm9ybT0icXVhbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQ9ImNwbSIsIHRyYW5zZm9ybT0ibG9nMiIsIGZpbHRlcj1UUlVFKSkKcGxvdF9wY2EobW1fbm9ybSkkcGxvdAoKbW1fZGUgPC0gYWxsX3BhaXJ3aXNlKG1tLCBtb2RlbF9iYXRjaD1GQUxTRSkKYGBgCgojIyBTZXQgdXAgZm9yIGluaXRpYWwgYW5hbHlzaXMKClNpbmNlIHdlIGRvbid0IGhhdmUgcmVwbGljYXRlcywgSSBhbSBnb2luZyB0byBkbyBzaW1wbGUgc3VidHJhY3Rpb25zLiAgVGhlIG1vc3QgaW1wb3J0YW50IGNhdmVhdAppcyB0aGF0IEkgbXVzdCBzdWJ0cmFjdCBlYWNoIGJhc2VsaW5lIGZyb20gaXRzIGh0L2tvIHNhbXBsZXMgYmVmb3JlIGNvbnNpZGVyaW5nIHRoZSBjb250cmFzdHMKb2YgaW50ZXJlc3QuCgpgYGB7ciBkZV9zZXR1cH0KZGxnbmJhc2VsaW5lIDwtICJpcHJnY18wMSIKcmV0YmFzZWxpbmUgPC0gImlwcmdjXzAyIgpzY25iYXNlbGluZSA8LSAiaXByZ2NfMDMiCgpkbGdubm9ybSA8LSAiaXByZ2NfMDQiCnJldG5vcm0gPC0gImlwcmdjXzA1IgpzY25ub3JtIDwtIE5VTEwgICMjIERvZXMgbm90IHlldCBleGlzdC4KCmRsZ25rbyA8LSAiaXByZ2NfMDYiCnJldGtvIDwtICJpcHJnY18wNyIKc2Nua28gPC0gImlwcmdjXzA4IgoKbm9ybXJldCA8LSBleHBycyhtbTM4X25vcm0pWywgcmV0bm9ybV0gLSBleHBycyhtbTM4X25vcm0pWywgcmV0YmFzZWxpbmVdCmtvcmV0IDwtIGV4cHJzKG1tMzhfbm9ybSlbLCByZXRrb10gLSBleHBycyhtbTM4X25vcm0pWywgcmV0YmFzZWxpbmVdCmtvc2NuIDwtIGV4cHJzKG1tMzhfbm9ybSlbLCBzY25rb10gLSBleHBycyhtbTM4X25vcm0pWywgc2NuYmFzZWxpbmVdCm5vcm1kbGduIDwtIGV4cHJzKG1tMzhfbm9ybSlbLCBkbGdubm9ybV0gLSBleHBycyhtbTM4X25vcm0pWywgZGxnbmJhc2VsaW5lXQprb2RsZ24gPC0gZXhwcnMobW0zOF9ub3JtKVssIGRsZ25rb10gLSBleHBycyhtbTM4X25vcm0pWywgZGxnbmJhc2VsaW5lXQpgYGAKCiMjIENvbnRyYXN0cyBvZiBpbnRlcmVzdAoKTm93IHRoYXQgd2UgaGF2ZSB0aGUgNSBhdmFpbGFibGUgJ2NvbmRpdGlvbnMnLCBwZXJmb3JtIHRoZSBzdWJ0cmFjdGlvbnMgdG8gcXVlcnkgdGhlIGRhdGEuCgpgYGB7ciBzdWJ0cmFjdF9pbnRlcmVzdGluZywgZmlnLnNob3c9ImhpZGUifQojIyBoZXQgdnMgaGV0Cm5vcm1yZXRfdnNfbm9ybWRsZ24gPC0gbm9ybXJldCAtIG5vcm1kbGduCgojIyBrbyB2cyBrbwprb3JldF92c19rb2RsZ24gPC0ga29yZXQgLSBrb2RsZ24Ka29yZXRfdnNfa29zY24gPC0ga29yZXQgLSBrb3Njbgprb2RsZ25fdnNfa29zY24gPC0ga29kbGduIC0ga29zY24KCiMjIGtvIHZzIGhldAprb3JldF92c19ub3JtcmV0IDwtIGtvcmV0IC0gbm9ybXJldAprb2RsZ25fdnNfbm9ybWRsZ24gPC0ga29kbGduIC0gbm9ybWRsZ24Ka29zY25fdnNfbm9ybWRsZ24gPC0ga29zY24gLSBub3JtZGxnbgoKIyMgcmF0aW8gb2YgcmF0aW9zCm5vcm1rb19yZXRkbGduIDwtIG5vcm1yZXRfdnNfbm9ybWRsZ24gLSBrb3JldF92c19rb2RsZ24KCnBhaXJfbXRyeCA8LSBjYmluZCgKICAjIyBCYXNlbGluZSBzdWJ0cmFjdGlvbnMKICBub3JtZGxnbiwgbm9ybXJldCwga29kbGduLCBrb3JldCwga29zY24sCiAgIyMgaGV0X3ZzX2hldCwgb2Ygd2hpY2ggdGhlcmUgaXMgb25seSAxIGJlY2F1c2Ugd2UgZG8gbm90IGhhdmUgaGV0c2NuCiAgbm9ybXJldF92c19ub3JtZGxnbiwKICAjIyBrb192c19rbywgb2Ygd2hpY2ggd2UgaGF2ZSAzCiAga29yZXRfdnNfa29kbGduLCBrb3JldF92c19rb3Njbiwga29kbGduX3ZzX2tvc2NuLAogICMjIGtvX3ZzX2hldCwgMyBpbmNsdWRpbmcgb25lIGdldHRpbmcgYXJvdW5kIG1pc3NpbmcgaGV0c2NuCiAga29yZXRfdnNfbm9ybXJldCwga29kbGduX3ZzX25vcm1kbGduLCBrb3Njbl92c19ub3JtZGxnbiwKICAjIyByYXRpbyBvZiByYXRpb3MKICBub3Jta29fcmV0ZGxnbikKCm1tX3RhYmxlcyA8LSBzbShjb21iaW5lX2RlX3RhYmxlcygKICBtbV9kZSwgZXh0cmFfYW5ub3Q9cGFpcl9tdHJ4LAogIGV4Y2VsPWdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfW1tX3RhYmxlcy12e3Zlcn0ueGxzeCIpKSkKYGBgCgojIFNvbWUgcGljdHVyZXMKCkFzIEkgdW5kZXJzdGFuZCBpdCwgdGhlcmUgaXMgc29tZSBpbnRlcmVzdCBpbiBhbiBvbnRvbG9neSBzZWFyY2ggdXNpbmcgdGhlIHJhdGlvIG9mIHJhdGlvcy4KCmBgYHtyIG90aGVyX2NvbnRyYXN0c30Kcm9yIDwtIG5vcm1rb19yZXRkbGduCnVwX2lkeCA8LSByb3IgPj0gMQpkb3duX2lkeCA8LSByb3IgPD0gLTEKcm9yX3VwIDwtIHJvclt1cF9pZHhdCmxlbmd0aChyb3JfdXApCnJvcl9kb3duIDwtIHJvcltkb3duX2lkeF0KbGVuZ3RoKHJvcl9kb3duKQoKcm9yX2dwcm9maWxlcl91cCA8LSBzaW1wbGVfZ3Byb2ZpbGVyKHNpZ19nZW5lcz1yb3JfdXAsIHNwZWNpZXM9Im1tdXNjdWx1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1tbV9yb3JfZ3Bmb2lsZXJfdXAtdnt2ZXJ9Lnhsc3giKSkKcm9yX2dwcm9maWxlcl91cCRwdmFsdWVfcGxvdHMkbWZwX3Bsb3Rfb3Zlcgpyb3JfZ3Byb2ZpbGVyX3VwJHB2YWx1ZV9wbG90cyRicHBfcGxvdF9vdmVyCnJvcl9ncHJvZmlsZXJfdXAkcHZhbHVlX3Bsb3RzJGNjcF9wbG90X292ZXIKcm9yX2dwcm9maWxlcl91cCRwdmFsdWVfcGxvdHMkdGZfcGxvdF9vdmVyCnJvcl9ncHJvZmlsZXJfdXAkcHZhbHVlX3Bsb3RzJGhwX3Bsb3Rfb3ZlcgoKcm9yX2dwcm9maWxlcl9kb3duIDwtIHNpbXBsZV9ncHJvZmlsZXIoc2lnX2dlbmVzPXJvcl9kb3duLCBzcGVjaWVzPSJtbXVzY3VsdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlbD1nbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1tbV9yb3JfZ3Bmb2lsZXJfZG93bi12e3Zlcn0ueGxzeCIpKQpyb3JfZ3Byb2ZpbGVyX2Rvd24kcHZhbHVlX3Bsb3RzJG1mcF9wbG90X292ZXIKcm9yX2dwcm9maWxlcl9kb3duJHB2YWx1ZV9wbG90cyRicHBfcGxvdF9vdmVyCnJvcl9ncHJvZmlsZXJfZG93biRwdmFsdWVfcGxvdHMkcmVhY3RvbWVfcGxvdF9vdmVyCnJvcl9ncHJvZmlsZXJfZG93biRwdmFsdWVfcGxvdHMkY2NwX3Bsb3Rfb3Zlcgpyb3JfZ3Byb2ZpbGVyX2Rvd24kcHZhbHVlX3Bsb3RzJHRmX3Bsb3Rfb3ZlcgpgYGAKCmBgYHtyIHNhdmVtZSwgZXZhbD1GQUxTRX0KcGFuZGVyOjpwYW5kZXIoc2Vzc2lvbkluZm8oKSkKbWVzc2FnZShwYXN0ZTAoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkpCnRoaXNfc2F2ZSA8LSBwYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXJtZF9maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpCm1lc3NhZ2UocGFzdGUwKCJTYXZpbmcgdG8gIiwgdGhpc19zYXZlKSkKdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT10aGlzX3NhdmUpKQpgYGAKCmBgYHtyIGxvYWRtZSwgZXZhbD1GQUxTRX0KbG9hZG1lKGZpbGVuYW1lPXRoaXNfc2F2ZSkKYGBgCg==