Overview

Differential expression analysis with 2hpa control and all replicates.

Spearman Correlation

Spearman’s rank correlation coefficient is a nonparametric measure of rank correlation, recommended for data that does not necessarily come from a bivariate normal distribution (Wikipedia). Below, we plot the Spearman correlation of the RPM (reads per million) for all genes that have an average RPM ≥ 1.

Pairwise PCA

Principal component analysis (PCA) is a statistical procedure that uses an orthogonal transformation to convert a set of observations of possibly correlated variables into a set of values of linearly uncorrelated variables called principal components (Wikipedia). Below is a PCA of the 8hpf control versus the other developmental timepoints.

MA and Volcano plots

MA plot: The log2 fold change (M) plotted against the log2 average (A) of the normalized read count for each gene. Significantly differentially expressed genes are plotted in red.

Volcano plot: The log2 fold change (M) plotted against the -log10 (eg. 1e^-10 = 10) of the adjusted p-value.

1hpf/2hpf

3hpf/2hpf

4hpf/2hpf

5hpf/2hpf

6hpf/2hpf

7hpf/2hpf

8hpf/2hpf

Heatmaps

The first heatmap was made by hierarchically clustering the euclidean distances of the log2 fold change for genes with p-values less than 1e^-5 at any time point.

The second heatmap uses the same hierarchical method to cluster timepoints as well as genes.

LS0tCnRpdGxlOiAiMiBocGEgQ29udHJvbCAtIEFsbCBSZXBsaWNhdGVzIiAKYXV0aG9yOiAiS2lyc3RlbiBHb3R0aW5nIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgICB0b2M6IHRydWUKICAgICAgdG9jX2RlcHRoOiAyCiAgICAgIHRvY19mbG9hdDoKICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlCi0tLQoKCmBgYHtyIGluaXRpYWxpemVEYXRhMmhwYUNvbnRyb2xBbGxSZXBsaWNhdGVzLCBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAiaGlkZSIsIG1lc3NhZ2UgPSBGQUxTRSwgZXJyb3IgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBjYWNoZSA9IEZBTFNFfQoKIyMgdXNlciBpbnB1dCB0byAnREVTZXEyQWxsLlJkYXRhJwoKbG9hZCgiLi9vdXRwdXQvREVTZXEyQWxsMmhwYUFsbC5SZGF0YSIpCnNldHdkKCIuLyIpCgojIyBGaXJzdCBsaXN0IHRoZSBSIGxpYnJhcmllcyBJIHdhbnQgdG8gdXNlCmxpYnJhcmllcyAgICAgICAgPC0gYygiREVTZXEyIiwgImdwbG90cyIsICJSQ29sb3JCcmV3ZXIiLCAna25pdHInLCAnZ3JpZCcsICdncmlkRXh0cmEnLCAidGlkeXZlcnNlIiwgJ2tpUnN0ZW4nKQoKIyMgTm93IHJlYWQgaW4gdGhlIGxpYnJhcmllcwpsYXBwbHkobGlicmFyaWVzLCBmdW5jdGlvbih4KXsKICAgIGxpYnJhcnkoeCwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFLCBxdWlldGx5ID0gVFJVRSkKICAgIH0pCgojIyBJbml0aWFsaXplIGtuaXRyIG9wdGlvbnMKb3B0c19jaHVuayRzZXQoZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0iaGlkZSIsIGZpZy5rZWVwPSJhbGwiLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgZmlnLnBhdGg9ImZpZ3VyZXMvIiwgY2FjaGUgPSBUUlVFKQpvcHRzX2tuaXQkc2V0KHJvb3QuZGlyID0gIi4vIikKCgpgYGAKCgojIE92ZXJ2aWV3CgpEaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNpcyB3aXRoIDJocGEgY29udHJvbCBhbmQgYWxsIHJlcGxpY2F0ZXMuCgojU3BlYXJtYW4gQ29ycmVsYXRpb24KClNwZWFybWFuJ3MgcmFuayBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBpcyBhIG5vbnBhcmFtZXRyaWMgbWVhc3VyZSBvZiByYW5rIGNvcnJlbGF0aW9uLCByZWNvbW1lbmRlZCBmb3IgZGF0YSB0aGF0IGRvZXMgbm90IG5lY2Vzc2FyaWx5IGNvbWUgZnJvbSBhIGJpdmFyaWF0ZSBub3JtYWwgZGlzdHJpYnV0aW9uIChXaWtpcGVkaWEpLiBCZWxvdywgd2UgcGxvdCB0aGUgU3BlYXJtYW4gY29ycmVsYXRpb24gb2YgdGhlIFJQTSAocmVhZHMgcGVyIG1pbGxpb24pIGZvciBhbGwgZ2VuZXMgdGhhdCBoYXZlIGFuIGF2ZXJhZ2UgUlBNICYjODgwNTsgMS4KCgpgYGB7ciBzcGVhcm1hbl9jb3JyZWxhdGlvbjJocGFDb250cm9sQWxsUmVwbGljYXRlcywgZmlnLmNhcCA9ICIifQoKIyMgTWFrZSBhIHNwZWFybWFuIHBsb3QKCgpmaWx0ZXJlZFJQTXMgPC0gbm9ybUNvdW50cyAlPiUgZ3JvdXBfYnkoSUQpICU+JSBtdXRhdGUocnBtRmxhZyA9IGlmZWxzZSgobWVhbihycG0pID49IDEpLCB5ZXMgPSAneWVzJywgbm8gPSAnbm8nKSkgJT4lIHVuZ3JvdXAoKSAlPiUKICAgIGZpbHRlcihycG1GbGFnID09ICd5ZXMnKSAlPiUgc2VsZWN0KElELCBTYW1wbGUsIHJwbSkgJT4lIHNwcmVhZChTYW1wbGUsIHJwbSkKCgoKcnBtZmlsdCAgICAgICAgPC0gZGF0YS5mcmFtZShzZWxlY3QoZmlsdGVyZWRSUE1zLCAtSUQpLCByb3cubmFtZXMgPSBmaWx0ZXJlZFJQTXMkSUQsIGNoZWNrLm5hbWVzID0gRkFMU0UpCnNwZWFybWFuICAgICAgIDwtIGRhdGEuZnJhbWUoY29yKHJwbWZpbHQsIG1ldGhvZCA9ICdzcGVhcm1hbicpLCBjaGVjay5uYW1lcyA9IEZBTFNFKQpzcGVhcm1hbiRJRCAgICA8LSByb3duYW1lcyhzcGVhcm1hbikKc3BlYXJtYW5UaWR5ICAgPC0gc3BlYXJtYW4gJT4lIGdhdGhlcihTYW1wbGUsIGNvcnJlbGF0aW9uLCAtSUQpCgojIyBhbmQgcGxvdCBpdCEKCmdncGxvdChkYXRhID0gc3BlYXJtYW5UaWR5LCBhZXMoeCA9IElELCB5ID0gU2FtcGxlLCBmaWxsID0gY29ycmVsYXRpb24pKSArIGdlb21fdGlsZSgpICsKICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdyA9ICJ5ZWxsb3ciLCBtaWQgPSAnd2hpdGUnLCBoaWdoID0gInB1cnBsZTQiLCBtaWRwb2ludCA9IDAuOCwgbGltaXQgPSBjKDAsMSkpICsKICAgICAgICBnZ3RpdGxlKCdTcGVhcm1hbiBDb3JyZWxhdGlvbiBvZiBTYW1wbGVzJykgKyB4bGFiKCcnKSArIHlsYWIoJycpICsKICAgICAgICAgICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkKYGBgCgoKIyBQYWlyd2lzZSBQQ0EKCgpQcmluY2lwYWwgY29tcG9uZW50IGFuYWx5c2lzIChQQ0EpIGlzIGEgc3RhdGlzdGljYWwgcHJvY2VkdXJlIHRoYXQgdXNlcyBhbiBvcnRob2dvbmFsIHRyYW5zZm9ybWF0aW9uIHRvIGNvbnZlcnQgYSBzZXQgb2Ygb2JzZXJ2YXRpb25zIG9mIHBvc3NpYmx5IGNvcnJlbGF0ZWQgdmFyaWFibGVzIGludG8gYSBzZXQgb2YgdmFsdWVzIG9mIGxpbmVhcmx5IHVuY29ycmVsYXRlZCB2YXJpYWJsZXMgY2FsbGVkIHByaW5jaXBhbCBjb21wb25lbnRzIChXaWtpcGVkaWEpLiBCZWxvdyBpcyBhIFBDQSBvZiB0aGUgOGhwZiBjb250cm9sIHZlcnN1cyB0aGUgb3RoZXIgZGV2ZWxvcG1lbnRhbCB0aW1lcG9pbnRzLiAKCgpgYGB7ciBQQ0EyaHBhQ29udHJvbEFsbFJlcGxpY2F0ZXMsIGZpZy5mdWxsd2lkdGggPSBUUlVFLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDEwfQoKcGNhc19kYXRhIDwtIGxhcHBseShjb250cmFzdF9uYW1lcywgZnVuY3Rpb24oeCl7CiAgICB5IDwtIHBsb3RQQ0EocmxkX2FsbFtbeF1dLCByZXR1cm5EYXRhID0gVFJVRSwgbnRvcCA9IDEwMDAwKQogICAgeSRJRCA8LSB4CiAgICB5Cn0pCgpwY2FfZGF0YSA8LSBiaW5kX3Jvd3MocGNhc19kYXRhKQoKZ2dwbG90KGRhdGEgPSBwY2FfZGF0YSwgYWVzKHggPSBQQzEsIHkgPSBQQzIsIGxhYmVsID0gbmFtZSwgY29sb3VyID0gZmFjdG9yKGNvbmRpdGlvbikpKSArCiAgICAgICAgICAgIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsgdGhlbWVfYncoKSArIGdlb21fdGV4dChoanVzdCA9IDAsIHZqdXN0ID0gLTAuNCkgKwogICAgICAgICAgICB4bGFiKCJQQyAxIikgKyB5bGFiKCJQQyAyIikgKyAKICAgICAgICAgICAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMC45OCwgMCkpICArCiAgICAgICAgICAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAuMiwgMCkpICsKICAgICAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogICAgICAgICAgICBmYWNldF93cmFwKH4gSUQsIHNjYWxlcyA9ICJmcmVlIikKCmBgYAoKCgojIE1BIGFuZCBWb2xjYW5vIHBsb3RzIHsudGFic2V0fQoKTUEgcGxvdDogVGhlIGxvZzIgZm9sZCBjaGFuZ2UgKE0pIHBsb3R0ZWQgYWdhaW5zdCB0aGUgbG9nMiBhdmVyYWdlIChBKSBvZiB0aGUgbm9ybWFsaXplZCByZWFkIGNvdW50IGZvciBlYWNoIGdlbmUuIFNpZ25pZmljYW50bHkgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIGdlbmVzIGFyZSBwbG90dGVkIGluIHJlZC4KClZvbGNhbm8gcGxvdDogVGhlIGxvZzIgZm9sZCBjaGFuZ2UgKE0pIHBsb3R0ZWQgYWdhaW5zdCB0aGUgLWxvZzEwIChlZy4gMWVeLTEwID0gMTApIG9mIHRoZSBhZGp1c3RlZCBwLXZhbHVlLgoKYGBge3IgbWF2b2wyaHBhQ29udHJvbEFsbFJlcGxpY2F0ZXN9CgoKeCA8LSBjb250cmFzdF9uYW1lc1tbMV1dCgpwbG90cyA8LSBsYXBwbHkoY29udHJhc3RfbmFtZXMsIGZ1bmN0aW9uKHgpewogICAgZGYgICAgICA8LSBhbGxfcmVzdWx0c190aWR5REYgJT4lIGZpbHRlcihjb250cmFzdElEID09IHgpICU+JSBzcHJlYWQoZGVhX0lELCBkZWFfVmFsdWUpICU+JSBtdXRhdGUobG9nYmFzZU1lYW4gPSBsb2coYmFzZU1lYW4pKQogICAgcHZhbCAgICA8LSBhcy5udW1lcmljKHB2YWwpCiAgICBpZihpcy5udWxsKGRmKSl7CiAgICAgICAgbWVzc2FnZShwYXN0ZTAoIlB2YWx1ZSB0b28gc3RyaW5nZW50IGZvciAiLCBjb250cmFzdCwgIi4gTUEvVm9sY2FubyBwbG90IG9tbWl0ZWQuXG4iKSkKICAgIH0gZWxzZSB7CiAgICAgICAgcHZhbCAgICAgICAgICAgICAgICAgIDwtIGFzLm51bWVyaWMocHZhbCkKICAgICAgICBsb3dlcl9sYWJlbCAgICAgICAgICAgPC0gcGFzdGUwKCJHZW5lcyB3aXRoIENvdW50czogIiwgbnJvdyhkZiksICJcblVwOiAiLCNjcmVhdGUgdGhlIGxhYmVsIG9mIHRoZSBsZWdlbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3coc3Vic2V0KGRmLCBsb2cyRm9sZENoYW5nZSA+IDAgJiBwYWRqIDwgcHZhbCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgRG93bjogIiwgbnJvdyhzdWJzZXQoZGYsIGxvZzJGb2xkQ2hhbmdlIDwgMCAmIHBhZGogPCBwdmFsKSksICJcbiIpCiAgCiAgICAgICAgZGYgPC0gZGYgJT4lIG11dGF0ZShzaWduaWZpY2FuY2VfZ3JvdXAgPSBpZmVsc2UocGFkaiA8PSBwdmFsLCB5ZXMgPSAneWVzJywgbm8gPSAnbm8nKSkKICAKICAgICAgICBsZWdlbmRfbGFiZWxzICAgICAgICA8LSBjKHBhc3RlMCgicGFkaiA+ICIsIHB2YWwsIjogIiwgbnJvdyhmaWx0ZXIoZGYsIHNpZ25pZmljYW5jZV9ncm91cCA9PSAnbm8nKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJwYWRqIDwgIiwgcHZhbCwiOiAiLCBucm93KGZpbHRlcihkZiwgc2lnbmlmaWNhbmNlX2dyb3VwID09ICd5ZXMnKSkpKQogICAgICAgIG1hLnBsb3QgPC0gICBnZ3Bsb3QoZGYsIGFlcyh4ID0gbG9nYmFzZU1lYW4sIHkgPSBsb2cyRm9sZENoYW5nZSwgZ3JvdXAgPSBzaWduaWZpY2FuY2VfZ3JvdXAsIGNvbG91ciA9IHNpZ25pZmljYW5jZV9ncm91cCkpICsKICAgICAgICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoKSArIHRoZW1lX2J3KCkgKwogICAgICAgICAgICAgICAgICAgICAgZ2d0aXRsZSgnTUEgcGxvdCcpICsgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpICsKICAgICAgICAgICAgICAgICAgICAgIHhsYWIoIkEgPSBNZWFuIG9mIGxvZzIoQWJ1bmRhbmNlKSIpICsgeWxhYigiTSA9IGxvZzIoRm9sZCBDaGFuZ2UpIikgKwogICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImdyYXkyNCIsICJyZWQiKSwgbmFtZSA9IGxvd2VyX2xhYmVsLCBicmVha3MgPSBjKCJncmF5MjQiLCAicmVkIiksIGxhYmVscyA9IGxlZ2VuZF9sYWJlbHMpICsKICAgICAgICAgICAgICAgICAgICAgIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSAwKSwgY29sb3VyID0gImJsYWNrIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogICAgICAgICAgICAgICAgICAgICAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdCA9IDEpLCBjb2xvdXIgPSAiZ3JheTY2IiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogICAgICAgICAgICAgICAgICAgICAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdCA9IC0xKSwgY29sb3VyID0gImdyYXk2NiIsIGxpbmV0eXBlPSJkYXNoZWQiKSArCiAgICAgICAgICAgICAgICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScsIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0yMCkpCiAgICAgICAgdm9sY2Fuby5wbG90IDwtICAgZ2dwbG90KGRmLCBhZXMoeCA9IGxvZzJGb2xkQ2hhbmdlLCB5ID0gLWxvZyhwYWRqLCBiYXNlID0gYygxMCkpLCBncm91cCA9IHNpZ25pZmljYW5jZV9ncm91cCwgY29sb3VyID0gc2lnbmlmaWNhbmNlX2dyb3VwKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2d0aXRsZSgnVm9sY2FubyBwbG90JykgKwogICAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIoIk0gPSBsb2cyKEZvbGQgQ2hhbmdlKSIpICsgeWxhYigiLWxvZzEwKEFkanVzdGVkIFAtVmFsdWUpIikgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZ3JheTI0IiwgInJlZCIpLCBsYWJlbHMgPSBsZWdlbmRfbGFiZWxzLCBuYW1lPWxvd2VyX2xhYmVsKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWVfYncoKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgZmFjZSA9ICJib2xkIiksIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MjApKQogICAgIGdyb2IgPC0gICBtYXJyYW5nZUdyb2IobGlzdChtYS5wbG90LAogICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGNhbm8ucGxvdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gdGV4dEdyb2IoeCwgZ3AgPSBncGFyKGZvbnNpemUgPSA0MCwgZm9udGZhY2UgPSAnYm9sZCcsIGNleCA9IDIpLCBoanVzdCA9IDEuOCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDEsIG5jb2wgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocz1jKDAuMzgsIDAuNjIpKQogICAgIGludmlzaWJsZShncm9iKQogICAgfQp9KQoKbmFtZXMocGxvdHMpIDwtIGNvbnRyYXN0X25hbWVzCmBgYAoKYGBge3IgcGxvdG1hdm9sMmhwYUNvbnRyb2xBbGxSZXBsaWNhdGVzLCBmaWcua2VlcCA9ICJhbGwiLCBmaWcuaGVpZ2h0ID0gMTAsIGZpZy53aWR0aCA9IDIwLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30KCmZvcihpIGluIGNvbnRyYXN0X25hbWVzKXsKICBjYXQocGFzdGUwKCJcblxuXG4jIyIsIGksICJcbiIpKQogIHByaW50KHBsb3RzW1tpXV0pCn0KCmBgYAoKCiNIZWF0bWFwcwoKCgpUaGUgZmlyc3QgaGVhdG1hcCB3YXMgbWFkZSBieSBoaWVyYXJjaGljYWxseSBjbHVzdGVyaW5nIHRoZSBldWNsaWRlYW4gZGlzdGFuY2VzIG9mIHRoZSBsb2cyIGZvbGQgY2hhbmdlIGZvciBnZW5lcyB3aXRoIHAtdmFsdWVzIGxlc3MgdGhhbiAgMWVeLTUgYXQgYW55IHRpbWUgcG9pbnQuCgpUaGUgc2Vjb25kIGhlYXRtYXAgdXNlcyB0aGUgc2FtZSBoaWVyYXJjaGljYWwgbWV0aG9kIHRvIGNsdXN0ZXIgdGltZXBvaW50cyBhcyB3ZWxsIGFzIGdlbmVzLgoKCmBgYHtyIHBhaXJ3aXNlSGVhdG1hcHMyaHBhQ29udHJvbEFsbFJlcGxpY2F0ZXMsIHJlc3VsdHMgPSAiaGlkZSIsIGZpZy5jYXAgPSAiIiwgZmlnLmtlZXAgPSAiaGlnaCJ9CgoKbGZjX3RhYmxlIDwtIGFsbF9yZXN1bHRzX3RpZHlERiAlPiUKICBtdXRhdGUoc2lnbmlmaWNhbnQgPSBpZmVsc2UoZGVhX0lEID09ICdwYWRqJyAmIGRlYV9WYWx1ZSA8PSBwdmFsLCB5ZXMgPSBUUlVFLCBubyA9IEZBTFNFKSkgJT4lICMgbGFiZWwgYWxsIHNpZ25pZmljYW50IGdlbmVzCiAgZ3JvdXBfYnkoY29udHJhc3RJRCwgR2VuZSkgJT4lICMgbGFiZWwgdGhlICMgb2YgdGltZXMgZ2VuZXMgdGhhdCBhcmUgc2lnbmlmaWNhbnQKICB1bmdyb3VwKCkgICU+JQogIGdyb3VwX2J5KEdlbmUpICU+JQogIGZpbHRlcihhbnkoc2lnbmlmaWNhbnQpLCBkZWFfSUQgPT0gJ2xvZzJGb2xkQ2hhbmdlJykgJT4lCiAgc2VsZWN0KC1zaWduaWZpY2FudCkgJT4lIHVuaXRlKGNvbG5hbWUsIGNvbnRyYXN0SUQsIGRlYV9JRCkgJT4lICMgbWFrZSB0aGUgdGFibGUgd2lkZSBmb3JtYXR0ZWQKICBzcHJlYWQoY29sbmFtZSwgZGVhX1ZhbHVlKQoKCiMjIGNyZWF0ZSBhIHRhYmxlIG9mIHNpZ25pZmljYW50IGdlbmVzIHdpdGggdGhlIGNsdXN0ZXIgY29sb3JzIGFzc2lnbmVkCgpzaWduLnRhYmxlIDwtIGFsbF9yZXN1bHRzX3RpZHlERiAgJT4lIAogIHNwcmVhZChrZXkgPSBkZWFfSUQsIHZhbHVlID0gZGVhX1ZhbHVlKSAgJT4lIAogIGZpbHRlcihHZW5lICVpbiUgbGZjX3RhYmxlJEdlbmUpICU+JQogIGdyb3VwX2J5KGNvbnRyYXN0SUQsIEdlbmUpICU+JSAKICBtdXRhdGUoc29ydGJ5ID0gLWxvZyhwYWRqLCBiYXNlID0gYygxMCkpKnNpZ24obG9nMkZvbGRDaGFuZ2UpKSAlPiUgCiAgdW5ncm91cCgpICU+JSBnYXRoZXIoZGVhX0lELCBkZWFfVmFsdWUsIC1HZW5lLCAtY29udHJhc3RJRCkgJT4lIAogIHVuaXRlKGlkQWxsLCBjb250cmFzdElELCBkZWFfSUQpICU+JSBzcHJlYWQoa2V5ID0gaWRBbGwsIHZhbHVlID0gZGVhX1ZhbHVlKSAlPiUKICBkcGx5cjo6cmVuYW1lKCdUcmFuc2NyaXB0SUQnID0gR2VuZSkKCgpoZWF0bWFwLmlucHV0LnRhYmxlICAgICAgICAgICA8LSBkYXRhLmZyYW1lKGxmY190YWJsZSkKcm93bmFtZXMoaGVhdG1hcC5pbnB1dC50YWJsZSkgPC0gbGZjX3RhYmxlJEdlbmUKaGVhdG1hcC5pbnB1dC50YWJsZSRHZW5lICAgICAgPC0gTlVMTApoZWF0bWFwLmlucHV0LnRhYmxlICAgICAgICAgICA8LSBuYS5vbWl0KGRhdGEubWF0cml4KGhlYXRtYXAuaW5wdXQudGFibGVbd2hpY2gocm93bmFtZXMoaGVhdG1hcC5pbnB1dC50YWJsZSkgJWluJSBzaWduLnRhYmxlJFRyYW5zY3JpcHRJRCksIF0pKQpjb2xuYW1lcyhoZWF0bWFwLmlucHV0LnRhYmxlKSA8LSBjb250cmFzdF9uYW1lcwoKCnByZXR0eWNvbG9ycyAgPC0gY29sb3JSYW1wUGFsZXR0ZShyZXYoYnJld2VyLnBhbCgxMSwgIlNwZWN0cmFsIikpKQpjb2wuYnJlYWtzICAgIDwtIHNlcSgtMywgMywgbGVuZ3RoLm91dCA9IG5jb2woaGVhdG1hcC5pbnB1dC50YWJsZSkpCgoKIyMgTWFrZSB0d28gaGVhdG1hcHMsIGFsbG93IGN1c3RpbWl6YWJsZSBncmFwaGluZwppZihucm93KGhlYXRtYXAuaW5wdXQudGFibGUpID4yKXsKaHIgPC0gaGNsdXN0KGRpc3QoaGVhdG1hcC5pbnB1dC50YWJsZSksIG1ldGhvZD0iY29tcGxldGUiKSAjIENyZWF0ZXMgcm93IGRlbmRyb2dyYW0KaGMgPC0gaGNsdXN0KGRpc3QodChoZWF0bWFwLmlucHV0LnRhYmxlKSksIG1ldGhvZD0iY29tcGxldGUiKSAjIENyZWF0ZXMgY29sdW1uIGRlbmRyb2dyYW0KCm15Y2xyICAgICA8LSBjdXRyZWUoaHIsIGsgPSA3KSAjIHNldCB1cCB3aGVyZSB0aGUgZ3JvdXBzIHdpbGwgYmUsIGNoYW5nZSAnaycgZm9yIG1vcmUgb3IgbGVzcyBncm91cHMKbXljb2xyICAgIDwtIGMoIkdyZWVuIiwgIlJlZCIsICJCbHVlIiwgIk9yYW5nZSIsICJQdXJwbGUiLCAiUGluayIsICJZZWxsb3ciKSAjIG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoIGFzICdrJwpteWNvbHIgICAgPC0gbXljb2xyW2FzLnZlY3RvcihteWNscildICMgcHVsbCBvdXQgdGhlIGNvbG9ycyBhc3NpZ25lZCB0byBlYWNoIGdlbmUKbXljb2xyLmRmIDwtIGRhdGEuZnJhbWUoQ2x1c3Rlcl9Db2xvciA9IG15Y29sciwgVHJhbnNjcmlwdElEID0gbmFtZXMobXljbHIpKSAjIGNyZWF0ZSBhIGRhdGEgZnJhbWUgb2YgdGhlIGNsdXN0ZXIgY29sb3IgZWFjaCBnZW5lIGJlbG9uZ3MgdG8KCgppZihuY29sKGhlYXRtYXAuaW5wdXQudGFibGUpID4gMSl7CiAgICAjIyBNYWtlIGEgaGVhdG1hcCB3aXRob3V0IGEgY29sdW1uIGRlbmRyb2dyYW0KICAgIGNvbC5icmVha3MgICAgPC0gc2VxKC0zLCAzLCBsZW5ndGgub3V0ID0gbmNvbChoZWF0bWFwLmlucHV0LnRhYmxlKSkKICAgIGhlYXRtYXAgICAgICAgPC0gaGVhdG1hcC4yKGhlYXRtYXAuaW5wdXQudGFibGUsIG1hcmdpbiA9IGMoMTUsNSksIGNvbCA9IHByZXR0eWNvbG9ycywgZGVuZHJvZ3JhbSA9ICdyb3cnLCB0cmFjZSA9IGMoIm5vbmUiKSwgUm93dj1hcy5kZW5kcm9ncmFtKGhyKSwgQ29sdiA9IE5BLCBsYWJSb3cgPSBGQUxTRSwga2V5ID0gVFJVRSwgYnJlYWtzID0gY29sLmJyZWFrcywga2V5LnlsYWIgPSAiR2VuZSBDb3VudCIsIGtleS54bGFiID0gImxvZzJGb2xkQ2hhbmdlIiwgY2V4Q29sID0gMS41LCBSb3dTaWRlQ29sb3JzID0gbXljb2xyKQogICAgdGl0bGUobWFpbiA9IHBhc3RlMCgiQ2x1c3RlcmluZyBvZiAiLCBucm93KGhlYXRtYXAuaW5wdXQudGFibGUpLCIgR2VuZXMiKSwgbGluZSA9IDApCiAgICBwYXIoY2V4Lm1haW49MC45KQp9CgoKaWYobmNvbChoZWF0bWFwLmlucHV0LnRhYmxlKSA+IDIpIHsKICAgIGsgPC0gaWZlbHNlKG5jb2woaGVhdG1hcC5pbnB1dC50YWJsZSA8IDUpLCAzLCA1KQogICAgbXljbGMgIDwtIGN1dHJlZShoYywgayA9IGspICMgY3JlYXRlIGdyb3VwaW5ncyBmb3IgdGhlIGNvbHVtbiBkZW5kcm9ncmFtCiAgICBteWNvbGMgPC0gYygiR3JlZW4iLCAiUmVkIiwgIkJsdWUiLCAiT3JhbmdlIiwgIlB1cnBsZSIpCiAgICBteWNvbGMgPC0gbXljb2xjW2FzLnZlY3RvcihteWNsYyldCiAgICAjIyBNYWtlIGEgaGVhdG1hcCBvZiB0aGUgbG9nZm9sZCBjaGFuZ2VzIHdpdGggY29sdW1uIGRlbmRyb2dyYW0uCiAgICBoZWF0bWFwICAgICAgIDwtIGhlYXRtYXAuMihoZWF0bWFwLmlucHV0LnRhYmxlLCBtYXJnaW4gPSBjKDE1LDUpLCBkZW5kcm9ncmFtID0gJ2JvdGgnLCBSb3d2ID0gYXMuZGVuZHJvZ3JhbShociksIENvbHYgPSBhcy5kZW5kcm9ncmFtKGhjKSwgY29sID0gcHJldHR5Y29sb3JzLCB0cmFjZSA9IGMoIm5vbmUiKSwgbGFiUm93ID0gRkFMU0UsIGtleSA9IFRSVUUsIGJyZWFrcyA9IGNvbC5icmVha3MsIG1haW4gPSBwYXN0ZTAoIkNsdXN0ZXJpbmcgb2YgVGltZXBvaW50cyBvbiAiLCBucm93KGhlYXRtYXAuaW5wdXQudGFibGUpLCIgR2VuZXMiKSwga2V5LnlsYWIgPSAiR2VuZSBDb3VudCIsIGtleS54bGFiID0gImxvZzJGb2xkQ2hhbmdlIiwgY2V4Q29sID0gMS41LCBSb3dTaWRlQ29sb3JzID0gbXljb2xyLCBDb2xTaWRlQ29sb3JzID0gbXljb2xjKQp9fQoKYGBgCgoKCmBgYHtyIHNlc3Npb24yaHBhQ29udHJvbEFsbFJlcGxpY2F0ZXMsIGVjaG89RkFMU0V9CndyaXRlTGluZXMoY2FwdHVyZS5vdXRwdXQoc2Vzc2lvbkluZm8oKSksICJzZXNzaW9uSW5mby8yaHBhQWxsU2Vzc2lvbkluZm8udHh0IikKYGBgCgojW1Itc2Vzc2lvbiBpbmZvcm1hdGlvbl0oc2Vzc2lvbkluZm8vMmhwYUFsbFNlc3Npb25JbmZvLnR4dCkKCg==

Privacy Policy

Terms of Use