Are U343 RNA-Seq samples different from U251?

Are U343 Ribo-Seq samples different from U251?

Are U251 RNA-Seq T0 samples different from T1 and T24?

The L3_T0 RNA-Seq sample clusters with T24 samples.

Are U251 Ribo-Seq T0 samples different from T1 and T24?

The L3_T0 Ribo-Seq sample clusters with T24 samples similar to what happened at the RNA-Seq level.

How do we ensure that T0 is actually T24 and nothing else?

We first perform DE analysis by excluding ‘L3_T0’ from both RNA and Ribo-Seq. Let’s first concentrate at the RNA-Seq level. We pull out the list of the significantly downregulated genes between T0 and T24 in U251 RNA-seq. The expression values of these genes should be significantly different between the T24 vs T0 samples.

Are L1_T0 and L1_T24 different?

t.test(x = u251.rna.T24vsT0.normalized_counts$U251_L1_T0, u251.rna.T24vsT0.normalized_counts$U251_L1_T24)

    Welch Two Sample t-test

data:  u251.rna.T24vsT0.normalized_counts$U251_L1_T0 and u251.rna.T24vsT0.normalized_counts$U251_L1_T24
t = 3.3445, df = 2510.6, p-value = 0.0008365
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
  596.0444 2285.5745
sample estimates:
mean of x mean of y 
 6450.545  5009.735 

L1_T0 and L1_T24 are significantly different.

Are L1_T0 and L2_T0 different?

t.test(x = u251.rna.T24vsT0.normalized_counts$U251_L1_T0, u251.rna.T24vsT0.normalized_counts$U251_L2_T0)

    Welch Two Sample t-test

data:  u251.rna.T24vsT0.normalized_counts$U251_L1_T0 and u251.rna.T24vsT0.normalized_counts$U251_L2_T0
t = 0.038187, df = 2707.9, p-value = 0.9695
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -939.7513  977.0808
sample estimates:
mean of x mean of y 
 6450.545  6431.880 

No. As expected, they should be similar.

Are L1_T0 and L3_T0 different?

t.test(x = u251.rna.T24vsT0.normalized_counts$U251_L1_T0, u251.rna.T24vsT0.normalized_counts$U251_L3_T0)

    Welch Two Sample t-test

data:  u251.rna.T24vsT0.normalized_counts$U251_L1_T0 and u251.rna.T24vsT0.normalized_counts$U251_L3_T0
t = 3.8798, df = 2419, p-value = 0.0001073
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
  806.3778 2454.4907
sample estimates:
mean of x mean of y 
 6450.545  4820.111 

Yes! But they ought to be similar.

Are L3_T0 and L3_T24 different?

t.test(x = u251.rna.T24vsT0.normalized_counts$U251_L3_T0, u251.rna.T24vsT0.normalized_counts$U251_L3_T24)

    Welch Two Sample t-test

data:  u251.rna.T24vsT0.normalized_counts$U251_L3_T0 and u251.rna.T24vsT0.normalized_counts$U251_L3_T24
t = 0.091271, df = 2707.2, p-value = 0.9273
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -641.2228  703.8306
sample estimates:
mean of x mean of y 
 4820.111  4788.807 

No! But they should be!

Ribo-Seq levels

Let’s do a similar analysis for the Ribo-Seq levels. This time we use up-regulated genes at the transaltion level only (T24vsT0.)

LS0tCnRpdGxlOiAiV2hhdCBoYXBwZW5lZCB0byB0aGUgVTI1MV9MM19UMF9TMTkgYW5kIFUyNTFfTDNfMEdZX1QwX1M3X0wwMDE/IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAotLS0KCmBgYHtyLCBlY2hvPUZBTFNFfQpzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkocmVhZHIpKQpzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkoREVTZXEyKSkKc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KFJDb2xvckJyZXdlcikpCnN1cHByZXNzTWVzc2FnZXMobGlicmFyeShnZ3Bsb3QyKSkKc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KEJpb2NQYXJhbGxlbCkpCnN1cHByZXNzTWVzc2FnZXMobGlicmFyeShwaGVhdG1hcCkpCnN1cHByZXNzTWVzc2FnZXMobGlicmFyeShzdmEpKQpzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkoY293cGxvdCkpCnN1cHByZXNzTWVzc2FnZXMobGlicmFyeShnZ3JlcGVsKSkKc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KHJlc2hhcGUyKSkKCgoKcmVnaXN0ZXIoTXVsdGljb3JlUGFyYW0oOCkpCmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KcGxvdEhlYXRNYXAgPC0gZnVuY3Rpb24ocmxvZ2Rpc3QpewogIHNhbXBsZURpc3RzIDwtIGRpc3QodChhc3NheShybG9nZGlzdCkpKQogIHNhbXBsZURpc3RNYXRyaXggPC0gYXMubWF0cml4KHNhbXBsZURpc3RzKQogIHJvd25hbWVzKHNhbXBsZURpc3RNYXRyaXgpIDwtIHBhc3RlKHJsb2dkaXN0JGNvbmRpdGlvbiwgY29sbmFtZXMocmxvZ2Rpc3QpLCBzZXA9Ii0iKQogIGNvbG5hbWVzKHNhbXBsZURpc3RNYXRyaXgpIDwtIE5VTEwKICBjb2xvcnMgPC0gY29sb3JSYW1wUGFsZXR0ZSggcmV2KGJyZXdlci5wYWwoOSwgIkJsdWVzIikpICkoMjU1KQogIHBoZWF0bWFwKHNhbXBsZURpc3RNYXRyaXgsCiAgICAgICAgICAgY2x1c3RlcmluZ19kaXN0YW5jZV9yb3dzPXNhbXBsZURpc3RzLAogICAgICAgICAgY2x1c3RlcmluZ19kaXN0YW5jZV9jb2xzPXNhbXBsZURpc3RzLAogICAgICAgICAgIGNvbD1jb2xvcnMsIG1haW49c3BlY2llcykKfQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdoaWRlJywgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0V9CnBsb3RNQVBsb3QgPC0gZnVuY3Rpb24oREVTZXEyVGFibGUsIG5vcm1hbGl6ZT1UUlVFKXsKICBNQS5pZHggPSB0KGNvbWJuKDE6NiwgMikpCiAgZm9yKCBpIGluICBzZXFfYWxvbmcoIE1BLmlkeFssMV0pKXsgCiAgIE1EUGxvdChjb3VudHMoREVTZXEyVGFibGUsIG5vcm1hbGl6ZWQgPSBub3JtYWxpemUpLCAKICAgICAgICBjKE1BLmlkeFtpLDFdLE1BLmlkeFtpLDJdKSwgCiAgICBtYWluID0gcGFzdGUoIGNvbG5hbWVzKERFU2VxMlRhYmxlKVtNQS5pZHhbaSwyXV0sICIgdnMgIiwKICAgICBjb2xuYW1lcyhkZHMpW01BLmlkeFtpLDFdXSApLCB5bGltID0gYygtMywzKSkKICB9Cn0KYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgcmVzdWx0cz0naGlkZScsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFfQpwbG90RGVuc2l0eVBsb3QgPC0gIGZ1bmN0aW9uKGRmKXsKICBnZ3Bsb3QoZGYsIGFlcyh4ID0gbG9nMkNvdW50cywgY29sb3VyID0gU2FtcGxlLCBmaWxsID0gU2FtcGxlKSkgKyB5bGltKGMoMCwgMC4yNSkpICsKICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjIsIHNpemUgPSAxLjI1KSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICsgeGxhYihleHByZXNzaW9uKGxvZ1syXShjb3VudCArIDEpKSkKfQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdoaWRlJywgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0V9CmdnTUFwbG90IDwtIGZ1bmN0aW9uKHZhbHVlXzEsIHZhbHVlXzIsIHFfdmFsdWU9MSwgbWluX2RpZmY9MC4zNCwgbWluX3EgPSAwLjAxNywgdGl0bGU9Ik1BIFBsb3QiICkgewoJI008LWxvZzIodmFsdWVfMSktbG9nMih2YWx1ZV8yKQoJI0EgPC0wLjUgKiAobG9nMih2YWx1ZV8xKStsb2cyKHZhbHVlXzIpKQogCU0gPSB2YWx1ZV8xLXZhbHVlXzIKICAjIyBBLXZhbHVlcwogIEEgPSAodmFsdWVfMSArIHZhbHVlXzIpLzIKCU1BU2VsZWN0PC0gZmFjdG9yKChNID4gbWluX2RpZmYgfCBNIDwgLTEgKiBtaW5fZGlmZikgJiBxX3ZhbHVlIDwgIG1pbl9xICkKCWRpZmZfZGF0YSA8LSBkYXRhLmZyYW1lKE09TSwgQT1BLCBNQVNlbGVjdD1NQVNlbGVjdCkKCXBsb3QgPC0gZ2dwbG90KGRhdGE9ZGlmZl9kYXRhLCBhZXMoQSwgTSwgY29sb3I9TUFTZWxlY3QpKQoJcGxvdCA8LSBwbG90ICsgZ2VvbV9wb2ludChzaXplPTAuOCwgYWxwaGE9MC41LG5hLnJtPVQpIAoJcGxvdCA8LSBwbG90ICsgc2NhbGVfY29sb3VyX2NvbG9yYmxpbmQobmFtZSA9ICJTZWxlY3RlZCIsIGxhYmVscyA9IGMoIm5vIiwgInllcyIpKQoJcGxvdCA8LSBwbG90ICsgdGhlbWVfY2FsYygpCglwbG90IDwtIHBsb3QgKyBsYWJzKHRpdGxlPXRpdGxlKQoJcmV0dXJuIChwbG90KQp9CmBgYAoKCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdoaWRlJywgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0V9CnBsb3RCYXJzIDwtIGZ1bmN0aW9uKGxvZ0RhdGEpewogIGRmID0gbWVsdChsb2dEYXRhLCB2YXJpYWJsZS5uYW1lID0gIlNhbXBsZSIsIHZhbHVlLm5hbWUgPSJsb2cyQ291bnRzIikKICBkZiA9IGRhdGEuZnJhbWUoZGYsIENvbmRpdGlvbiA9IHN1YnN0cihkZiRTYW1wbGUsIDEsIDQpKQogIGdncGxvdChkZiwgYWVzKHggPSBTYW1wbGUsIHkgPSBsb2cyQ291bnRzLCBmaWxsID0gQ29uZGl0aW9uKSkgKyBnZW9tX2JveHBsb3QoKSArIHhsYWIoIiIpICsKICB5bGFiKGV4cHJlc3Npb24obG9nWzJdKGNvdW50ICsgMSkpKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiM2MTlDRkYiLCAiI0Y1NjRFMyIpKQp9CmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRX0KcGxvdFZpb2xpbiA8LSBmdW5jdGlvbihsb2dEYXRhKXsKICBkZiA9IG1lbHQobG9nRGF0YSwgdmFyaWFibGUubmFtZSA9ICJTYW1wbGUiLCB2YWx1ZS5uYW1lID0ibG9nMkNvdW50cyIpCiAgZGYgPSBkYXRhLmZyYW1lKGRmLCBDb25kaXRpb24gPSBzdWJzdHIoZGYkU2FtcGxlLCAxLCA0KSkKICBnZ3Bsb3QoZGYsIGFlcyh4ID0gU2FtcGxlLCB5ID0gbG9nMkNvdW50cywgZmlsbCA9IENvbmRpdGlvbikpICsgZ2VvbV92aW9saW4oKSArIHhsYWIoIiIpICsKICB5bGFiKGV4cHJlc3Npb24obG9nWzJdKGNvdW50ICsgMSkpKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiM2MTlDRkYiLCAiI0Y1NjRFMyIpKQp9CmBgYAoKCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdoaWRlJywgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CmdlbmVfYW5ub3RhdGlvbl9maWxlIDwtICcvbWVkaWEvZG5hL2dlbm9tZXMvaGczOC9hbm5vdGF0aW9uL2hnMzhfZ2VuZV9uYW1lc19zdHJpcHBlZC50c3YnCnJuYS5kZXNpZ25fZmlsZSA8LSAnLi4vLi4vcmVhZF9Db3VudC9STkFTZXFfZGVzaWduX2ZpbGVfd2l0aF9vdXRsaWVyLmNzdicKcmliby5kZXNpZ25fZmlsZSA8LSAnLi4vLi4vcmVhZF9Db3VudC9SaWJvU2VxX2Rlc2lnbl9maWxlX3dpdGhfb3V0bGllci5jc3YnCgpybmEuYmFzZV9kaXIgPC0gJy4uLy4uL3JlYWRfQ291bnQvUk5BLVNlcS8nCnJpYm8uYmFzZV9kaXIgPC0gJy4uLy4uL3JlYWRfQ291bnQvUmliby1TZXEvJwoKZ2VuZV9hbm5vdGF0aW9ucyA8LSByZWFkLnRhYmxlKGdlbmVfYW5ub3RhdGlvbl9maWxlLCByb3cubmFtZXMgPSAxLCBjb2wubmFtZXMgPSBjKCdpZCcsICduYW1lJywgJ3R5cGUnKSkKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgcmVzdWx0cz0naGlkZScsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpnZXRfcmxkICA8LSBmdW5jdGlvbihkZXNpZ25fZmlsZSwgYmFzZV9kaXIpewogIGRlc2lnbi5pbmZvIDwtIHJlYWQuY3N2KGRlc2lnbl9maWxlLCBoZWFkZXIgPSBUUlVFLCBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFKQogIHNhbXBsZV9pZCA8LSBkZXNpZ24uaW5mbyRTYW1wbGVOYW1lCiAgZmlsZXMgPC0gZGVzaWduLmluZm8kU2FtcGxlRmlsZQogIG5hbWVzKGZpbGVzKSA8LSBzYW1wbGVfaWQKICBjZWxsLmxpbmUgPC0gYXMuZmFjdG9yKGRlc2lnbi5pbmZvJENlbGxfbGluZSkKICB0aW1lLnBvaW50IDwtIGFzLmZhY3RvcihkZXNpZ24uaW5mbyRUaW1lKQogIAogIHNhbXBsZVRhYmxlIDwtIGRhdGEuZnJhbWUoc2FtcGxlTmFtZT1zYW1wbGVfaWQsIGZpbGVOYW1lPWZpbGVzLCB0aW1lLnBvaW50PXRpbWUucG9pbnQsIGNlbGwubGluZSA9IGNlbGwubGluZSkKICBkZHNIVFNlcSA8LSBERVNlcURhdGFTZXRGcm9tSFRTZXFDb3VudChzYW1wbGVUYWJsZT1zYW1wbGVUYWJsZSwgZGlyZWN0b3J5PWJhc2VfZGlyLCBkZXNpZ249fnRpbWUucG9pbnQrY2VsbC5saW5lKQogIAogICMjIFdlIGRvbnQgbmVlZCB2ZXJzaW9uIG51bWJlcnMKICBkZHNIVFNlcSA8LSBkZHNIVFNlcVsgcm93U3Vtcyhjb3VudHMoZGRzSFRTZXEpKSA+IDEsICBdCiAgcm93bmFtZXMoZGRzSFRTZXEpIDwtIGdzdWIoJ1xcLlswLTldKycsICcnLCByb3duYW1lcyhkZHNIVFNlcSkpCiAgCiAgCiAgZGRzIDwtIERFU2VxKGRkc0hUU2VxKQogIAogIHJhd0NvdW50VGFibGUgPC0gYXMuZGF0YS5mcmFtZShhc3NheXMoZGRzSFRTZXEpJGNvdW50cykKICBjb2x1bW4ubmFtZXMgPC0gc2FtcGxlX2lkCiAgY29sbmFtZXMocmF3Q291bnRUYWJsZSkgPC0gY29sdW1uLm5hbWVzCiAgcmxkIDwtIHJsb2dUcmFuc2Zvcm1hdGlvbihkZHMsIGJsaW5kPVRSVUUpCiAgcmV0dXJuKHJsZCkKfQoKZ2V0X25vcm1hbGl6ZWRfY291bnRzIDwtIGZ1bmN0aW9uKGRlc2lnbl9maWxlLCBiYXNlX2Rpcil7CiAgZGVzaWduLmluZm8gPC0gcmVhZC5jc3YoZGVzaWduX2ZpbGUsIGhlYWRlciA9IFRSVUUsIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UpCiAgc2FtcGxlX2lkIDwtIGRlc2lnbi5pbmZvJFNhbXBsZU5hbWUKICBmaWxlcyA8LSBkZXNpZ24uaW5mbyRTYW1wbGVGaWxlCiAgbmFtZXMoZmlsZXMpIDwtIHNhbXBsZV9pZAogIGNlbGwubGluZSA8LSBhcy5mYWN0b3IoZGVzaWduLmluZm8kQ2VsbF9saW5lKQogIHRpbWUucG9pbnQgPC0gYXMuZmFjdG9yKGRlc2lnbi5pbmZvJFRpbWUpCiAgCiAgc2FtcGxlVGFibGUgPC0gZGF0YS5mcmFtZShzYW1wbGVOYW1lPXNhbXBsZV9pZCwgZmlsZU5hbWU9ZmlsZXMsIHRpbWUucG9pbnQ9dGltZS5wb2ludCwgY2VsbC5saW5lID0gY2VsbC5saW5lKQogIGRkc0hUU2VxIDwtIERFU2VxRGF0YVNldEZyb21IVFNlcUNvdW50KHNhbXBsZVRhYmxlPXNhbXBsZVRhYmxlLCBkaXJlY3Rvcnk9YmFzZV9kaXIsIGRlc2lnbj1+dGltZS5wb2ludCtjZWxsLmxpbmUpCiAgCiAgIyMgV2UgZG9udCBuZWVkIHZlcnNpb24gbnVtYmVycwogIGRkc0hUU2VxIDwtIGRkc0hUU2VxWyByb3dTdW1zKGNvdW50cyhkZHNIVFNlcSkpID4gMSwgIF0KICByb3duYW1lcyhkZHNIVFNlcSkgPC0gZ3N1YignXFwuWzAtOV0rJywgJycsIHJvd25hbWVzKGRkc0hUU2VxKSkKICAKICAKICBkZHMgPC0gREVTZXEoZGRzSFRTZXEpCiAgCiAgcmV0dXJuKGNvdW50cyhkZHMsIG5vcm1hbGl6ZT1UKSkKfQoKcGxvdF9tZHMgPC0gZnVuY3Rpb24oY291bnRzLCB0aXRsZSl7CiAgc2FtcGxlRGlzdHMgPC0gZGlzdCggdCggY291bnRzICkgKQogIHNhbXBsZURpc3RNYXRyaXggPC0gYXMubWF0cml4KCBzYW1wbGVEaXN0cyApCiAgbWRzRGF0YSA8LSBkYXRhLmZyYW1lKGNtZHNjYWxlKHNhbXBsZURpc3RNYXRyaXgpKQogIG1kcyA8LSBjYmluZChtZHNEYXRhLCBhcy5kYXRhLmZyYW1lKGNvbERhdGEocmxkKSkpCiAgZ2dwbG90KG1kcywgYWVzKFgxLFgyLGNvbG9yPWNvbmRpdGlvbiwgc2hhcGU9YmF0Y2gpKSArIGdlb21fcG9pbnQoc2l6ZT0zKSArIGNvb3JkX2ZpeGVkKCkrIGdndGl0bGUodGl0bGUpCn0KCmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0Kcm5hLnJsZCA8LSBnZXRfcmxkKHJuYS5kZXNpZ25fZmlsZSwgcm5hLmJhc2VfZGlyKQpyaWJvLnJsZCA8LSBnZXRfcmxkKHJpYm8uZGVzaWduX2ZpbGUsIHJpYm8uYmFzZV9kaXIpCmBgYAoKIyBBcmUgVTM0MyBSTkEtU2VxIHNhbXBsZXMgZGlmZmVyZW50IGZyb20gVTI1MT8KCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdoaWRlJywgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnBsb3RQQ0Eocm5hLnJsZCwgaW50Z3JvdXAgPSBjKCdjZWxsLmxpbmUnKSkrIGdndGl0bGUoJ1JOQS1TZXEgJykKYGBgCgojIEFyZSBVMzQzIFJpYm8tU2VxIHNhbXBsZXMgZGlmZmVyZW50IGZyb20gVTI1MT8KCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdoaWRlJywgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnBsb3RQQ0Eocmliby5ybGQsIGludGdyb3VwID0gYygnY2VsbC5saW5lJykpKyBnZ3RpdGxlKCdSaWJvLVNlcScpCgpgYGAKCiMgQXJlIFUyNTEgUk5BLVNlcSBUMCBzYW1wbGVzIGRpZmZlcmVudCBmcm9tIFQxIGFuZCBUMjQ/CgoKYGBge3IsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0Kcm5hLnJsZC51MjUxIDwtIHJuYS5ybGRbICwgcm5hLnJsZCRjZWxsLmxpbmUgJWluJSBjKCdVMjUxJykgXQpwbG90UENBKHJuYS5ybGQudTI1MSwgJ3RpbWUucG9pbnQnKSArIGdndGl0bGUoJ1UyNTEgUk5BLVNlcScpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbD1jb2xuYW1lcyhybmEucmxkLnUyNTEpICkpCmBgYApUaGUgTDNfVDAgUk5BLVNlcSBzYW1wbGUgY2x1c3RlcnMgd2l0aCBUMjQgc2FtcGxlcy4KCiMgQXJlIFUyNTEgUmliby1TZXEgVDAgc2FtcGxlcyBkaWZmZXJlbnQgZnJvbSBUMSBhbmQgVDI0PwoKCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdoaWRlJywgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnJpYm8ucmxkLnUyNTEgPC0gcmliby5ybGRbICwgcmliby5ybGQkY2VsbC5saW5lICVpbiUgYygnVTI1MScpIF0KcGxvdFBDQShyaWJvLnJsZC51MjUxLCAndGltZS5wb2ludCcpICsgZ2d0aXRsZSgnVTI1MSBSaWJvLVNlcScpICsKICBnZW9tX3BvaW50KCkgKyBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsPWNvbG5hbWVzKHJpYm8ucmxkLnUyNTEpICkpCmBgYApUaGUgTDNfVDAgUmliby1TZXEgc2FtcGxlIGNsdXN0ZXJzIHdpdGggVDI0IHNhbXBsZXMgc2ltaWxhciB0byB3aGF0IGhhcHBlbmVkIGF0IHRoZSBSTkEtU2VxIGxldmVsLgoKCiMgSG93IGRvIHdlIGVuc3VyZSB0aGF0IFQwIGlzIGFjdHVhbGx5IFQyNCBhbmQgbm90aGluZyBlbHNlPwoKV2UgZmlyc3QgcGVyZm9ybSBERSBhbmFseXNpcyBieSBleGNsdWRpbmcgJ0wzX1QwJyBmcm9tIGJvdGggUk5BIGFuZCBSaWJvLVNlcS4gTGV0J3MgZmlyc3QgY29uY2VudHJhdGUgYXQgdGhlIFJOQS1TZXEgbGV2ZWwuCldlIHB1bGwgb3V0IHRoZSBsaXN0IG9mIHRoZSBzaWduaWZpY2FudGx5IGRvd25yZWd1bGF0ZWQgZ2VuZXMgYmV0d2VlbiBUMCBhbmQgVDI0IGluIFUyNTEgUk5BLXNlcS4gVGhlIGV4cHJlc3Npb24gdmFsdWVzIG9mIHRoZXNlIGdlbmVzIHNob3VsZCBiZSBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBiZXR3ZWVuIHRoZSBUMjQgdnMgVDAgc2FtcGxlcy4KCmBgYHtyLGVjaG89RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KdTI1MS5ybmEuVDI0dnNUMCA8LSByZWFkLmNzdignLi4vLi4vREVTZXEyX091dC9VMjUxLlJOQVNlcS5yZXMuVDI0dnNUMF9kb3duLmNzdicsIHJvdy5uYW1lcyA9IDEpCmBgYAoKCmBgYHtyLGVjaG89RkFMU0UsICB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0Kcm5hLm5vcm1hbGl6ZWRfY291bnRzIDwtIGdldF9ub3JtYWxpemVkX2NvdW50cyhybmEuZGVzaWduX2ZpbGUsIHJuYS5iYXNlX2RpcikKdTI1MS5ybmEuVDI0dnNUMC5ub3JtYWxpemVkX2NvdW50cyA8LSBhcy5kYXRhLmZyYW1lKHJuYS5ub3JtYWxpemVkX2NvdW50c1tyb3duYW1lcyh1MjUxLnJuYS5UMjR2c1QwKSxdKQp1MjUxLnJuYS5UMjR2c1QwLm5vcm1hbGl6ZWRfY291bnRzIDwtIHUyNTEucm5hLlQyNHZzVDAubm9ybWFsaXplZF9jb3VudHNbLCBncmVwbCgiVTI1MSIsIGNvbG5hbWVzKHUyNTEucm5hLlQyNHZzVDAubm9ybWFsaXplZF9jb3VudHMpKSBdCnUyNTEucm5hLlQyNHZzVDAubm9ybWFsaXplZF9jb3VudHMgPC0gdTI1MS5ybmEuVDI0dnNUMC5ub3JtYWxpemVkX2NvdW50c1ssICFncmVwbCgiVDEiLCBjb2xuYW1lcyh1MjUxLnJuYS5UMjR2c1QwLm5vcm1hbGl6ZWRfY291bnRzKSkgXQoKY29scyA8LSBjb2xuYW1lcyh1MjUxLnJuYS5UMjR2c1QwLm5vcm1hbGl6ZWRfY291bnRzKQp1MjUxLnJuYS5UMjR2c1QwLm5vcm1hbGl6ZWRfY291bnRzJGdlbmVfaWQgPC0gcm93bmFtZXModTI1MS5ybmEuVDI0dnNUMC5ub3JtYWxpemVkX2NvdW50cykKdTI1MS5ybmEuVDI0dnNUMC5ub3JtYWxpemVkX2NvdW50cy5tZWx0IDwtIG1lbHQodTI1MS5ybmEuVDI0dnNUMC5ub3JtYWxpemVkX2NvdW50cywgbWVhc3VyZS52YXJzID0gY29scywgaWQudmFycyA9ICdnZW5lX2lkJykKCnUyNTEucm5hLlQyNHZzVDAubm9ybWFsaXplZF9jb3VudHMubWVsdCR0aW1lcG9pbnQgPC0gZmFjdG9yKGFzLnZlY3RvcihzYXBwbHkodTI1MS5ybmEuVDI0dnNUMC5ub3JtYWxpemVkX2NvdW50cy5tZWx0JHZhcmlhYmxlLCBmdW5jdGlvbih4KSBzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIilbWzFdXVszXSkpLCBsZXZlbHMgPSBjKCdUMCcsICdUMjQnKSkKdTI1MS5ybmEuVDI0dnNUMC5ub3JtYWxpemVkX2NvdW50cy5tZWx0JHZhbHVlIDwtIGxvZzIodTI1MS5ybmEuVDI0dnNUMC5ub3JtYWxpemVkX2NvdW50cy5tZWx0JHZhbHVlKQoKcCA8LSBnZ3Bsb3QodTI1MS5ybmEuVDI0dnNUMC5ub3JtYWxpemVkX2NvdW50cy5tZWx0LCBhZXModmFyaWFibGUsIHZhbHVlKSkKcCArIGdlb21fYm94cGxvdChhZXMoY29sb3VyID0gdGltZXBvaW50KSkgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKSArIHlsYWIoJ2xvZzIgbm9ybWFsaXplZCBjb3VudCcpCmBgYAoKIyMjIEFyZSBMMV9UMCBhbmQgTDFfVDI0IGRpZmZlcmVudD8KYGBge3J9CnQudGVzdCh4ID0gdTI1MS5ybmEuVDI0dnNUMC5ub3JtYWxpemVkX2NvdW50cyRVMjUxX0wxX1QwLCB1MjUxLnJuYS5UMjR2c1QwLm5vcm1hbGl6ZWRfY291bnRzJFUyNTFfTDFfVDI0KQpgYGAKCkwxX1QwIGFuZCBMMV9UMjQgYXJlIHNpZ25pZmljYW50bHkgZGlmZmVyZW50LgoKIyMjIEFyZSBMMV9UMCBhbmQgTDJfVDAgZGlmZmVyZW50PwoKYGBge3J9CnQudGVzdCh4ID0gdTI1MS5ybmEuVDI0dnNUMC5ub3JtYWxpemVkX2NvdW50cyRVMjUxX0wxX1QwLCB1MjUxLnJuYS5UMjR2c1QwLm5vcm1hbGl6ZWRfY291bnRzJFUyNTFfTDJfVDApCmBgYAoKTm8uIEFzIGV4cGVjdGVkLCB0aGV5IHNob3VsZCBiZSBzaW1pbGFyLgoKIyMjIEFyZSBMMV9UMCBhbmQgTDNfVDAgZGlmZmVyZW50PwoKYGBge3J9CnQudGVzdCh4ID0gdTI1MS5ybmEuVDI0dnNUMC5ub3JtYWxpemVkX2NvdW50cyRVMjUxX0wxX1QwLCB1MjUxLnJuYS5UMjR2c1QwLm5vcm1hbGl6ZWRfY291bnRzJFUyNTFfTDNfVDApCmBgYAoKWWVzISBCdXQgdGhleSBvdWdodCB0byBiZSBzaW1pbGFyLgoKIyMjIEFyZSBMM19UMCBhbmQgTDNfVDI0IGRpZmZlcmVudD8KCmBgYHtyfQp0LnRlc3QoeCA9IHUyNTEucm5hLlQyNHZzVDAubm9ybWFsaXplZF9jb3VudHMkVTI1MV9MM19UMCwgdTI1MS5ybmEuVDI0dnNUMC5ub3JtYWxpemVkX2NvdW50cyRVMjUxX0wzX1QyNCkKYGBgCgpObyEgQnV0IHRoZXkgc2hvdWxkIGJlIQoKIyMgUmliby1TZXEgbGV2ZWxzCgpMZXQncyBkbyBhIHNpbWlsYXIgYW5hbHlzaXMgZm9yIHRoZSBSaWJvLVNlcSBsZXZlbHMuIFRoaXMgdGltZSB3ZSB1c2UgdXAtcmVndWxhdGVkIGdlbmVzIGF0IHRoZSB0cmFuc2FsdGlvbiBsZXZlbCBvbmx5IChUMjR2c1QwLikKCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KdTI1MS5yaWJvLlQyNHZzVDAgPC0gcmVhZC5jc3YoJy4uLy4uL0RFU2VxMl9PdXQvVTI1MS5SaWJvU2VxLnJlcy5UMjR2c1QwX2Rvd24uY3N2Jywgcm93Lm5hbWVzID0gMSkKCnJpYm8ubm9ybWFsaXplZF9jb3VudHMgPC0gZ2V0X25vcm1hbGl6ZWRfY291bnRzKHJpYm8uZGVzaWduX2ZpbGUsIHJpYm8uYmFzZV9kaXIpCgp1MjUxLnJpYm8uVDI0dnNUMC5ub3JtYWxpemVkX2NvdW50cyA8LSBhcy5kYXRhLmZyYW1lKHJpYm8ubm9ybWFsaXplZF9jb3VudHNbcm93bmFtZXModTI1MS5yaWJvLlQyNHZzVDApLF0pCnUyNTEucmliby5UMjR2c1QwLm5vcm1hbGl6ZWRfY291bnRzIDwtIHUyNTEucmliby5UMjR2c1QwLm5vcm1hbGl6ZWRfY291bnRzWywgZ3JlcGwoIlUyNTEiLCBjb2xuYW1lcyh1MjUxLnJpYm8uVDI0dnNUMC5ub3JtYWxpemVkX2NvdW50cykpIF0KdTI1MS5yaWJvLlQyNHZzVDAubm9ybWFsaXplZF9jb3VudHMgPC0gdTI1MS5yaWJvLlQyNHZzVDAubm9ybWFsaXplZF9jb3VudHNbLCAhZ3JlcGwoIlQxIiwgY29sbmFtZXModTI1MS5yaWJvLlQyNHZzVDAubm9ybWFsaXplZF9jb3VudHMpKSBdCmNvbHMgPC0gY29sbmFtZXModTI1MS5yaWJvLlQyNHZzVDAubm9ybWFsaXplZF9jb3VudHMpCnUyNTEucmliby5UMjR2c1QwLm5vcm1hbGl6ZWRfY291bnRzJGdlbmVfaWQgPC0gcm93bmFtZXModTI1MS5yaWJvLlQyNHZzVDAubm9ybWFsaXplZF9jb3VudHMpCnUyNTEucmliby5UMjR2c1QwLm5vcm1hbGl6ZWRfY291bnRzLm1lbHQgPC0gbWVsdCh1MjUxLnJpYm8uVDI0dnNUMC5ub3JtYWxpemVkX2NvdW50cywgbWVhc3VyZS52YXJzID0gY29scywgaWQudmFycyA9ICdnZW5lX2lkJykKdTI1MS5yaWJvLlQyNHZzVDAubm9ybWFsaXplZF9jb3VudHMubWVsdCR0aW1lcG9pbnQgPC0gZmFjdG9yKGFzLnZlY3RvcihzYXBwbHkodTI1MS5yaWJvLlQyNHZzVDAubm9ybWFsaXplZF9jb3VudHMubWVsdCR2YXJpYWJsZSwgZnVuY3Rpb24oeCkgc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpW1sxXV1bNF0pKSwgbGV2ZWxzID0gYygnVDAnLCAnVDI0JykpCnUyNTEucmliby5UMjR2c1QwLm5vcm1hbGl6ZWRfY291bnRzLm1lbHQkdmFsdWUgPC0gbG9nMih1MjUxLnJpYm8uVDI0dnNUMC5ub3JtYWxpemVkX2NvdW50cy5tZWx0JHZhbHVlKQoKcCA8LSBnZ3Bsb3QodTI1MS5yaWJvLlQyNHZzVDAubm9ybWFsaXplZF9jb3VudHMubWVsdCwgYWVzKHZhcmlhYmxlLCB2YWx1ZSkpCnAgKyBnZW9tX2JveHBsb3QoYWVzKGNvbG91ciA9IHRpbWVwb2ludCkpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkgKyB5bGFiKCdsb2cyIG5vcm1hbGl6ZWQgY291bnQnKQpgYGAK