1 Sample Estimation, PBMC Infections: 20180822

Start out by extracting the relevant data and querying it to see the general quality.

This first block sets the names of the samples and colors. It also makes separate data sets for:

  • All features with infected and uninfected samples.
  • All features with only the infected samples.
  • Only CDS features with infected and uninfected samples.
  • Only CDS features with only the infected samples.
## There were 50, now there are 21 samples.
## The new colors are a character, changing according to condition.
## There were 21, now there are 18 samples.
## There were 50, now there are 21 samples.
## The new colors are a character, changing according to condition.
## There were 21, now there are 18 samples.

1.1 Generate plots describing the data

The following creates metric plots of the raw data.

Now let us visualize some of these metrics for the data set of all features including the uninfected samples.

Start with the relative library sizes. Note that this includes all feature types.

The picture is slightly different if we only look at coding sequences.

Look at the density of counts / feature for all samples. Use density plots and boxplots to view this information.

Now let us look at how the samples relate to each other via pairwise correlation heatmaps. Once again, show this first for all features, then only cds features.

3 Figure 4

Construct figure 4, this should include the following panels:

  1. Library sizes of pbmc data
  2. PCA of log2(quant(data)), with uninfected
  3. PCA of log2(quant(data)), without uninfected
  4. TSNE of b
  5. TSNE of c
## Going to write the image to: images/figure_4a.pdf when dev.off() is called.
## png 
##   2
## Going to write the image to: images/figure_4b.pdf when dev.off() is called.
## png 
##   2
## Going to write the image to: images/figure_4c.pdf when dev.off() is called.
## png 
##   2
## Going to write the image to: images/figure_4d.pdf when dev.off() is called.
## png 
##   2
## Going to write the image to: images/figure_4e.pdf when dev.off() is called.
## png 
##   2
## Going to write the image to: images/figure_4a_cds.pdf when dev.off() is called.
## png 
##   2
## Going to write the image to: images/figure_4b_cds.pdf when dev.off() is called.
## png 
##   2
## Going to write the image to: images/figure_4c_cds.pdf when dev.off() is called.
## png 
##   2
## Going to write the image to: images/figure_4d_cds.pdf when dev.off() is called.
## png 
##   2
## Going to write the image to: images/figure_4e_cds.pdf when dev.off() is called.
## png 
##   2

3.1 Start without the uninfected: no, patient, strain

Now let us try a few different ways of dealing with the batch effects/surrogate variables. In each case, I will use a PCA plot to see how the method changes the sample clustering.

3.1.1 PCA: No Batch correction

In this first iteration, we will log2(cpm(quant(filter()))) the data and leave the experimental parameters as the default: condition == the 6 strains, 3 chronic 3 self-healing batch == the three patients p107

sampleid condition batch batch_int colors labels PC1 PC2 pc_1 pc_2 pc_3 pc_4 pc_5 pc_6 pc_7 pc_8 pc_9 pc_10 pc_11 pc_12 pc_13 pc_14 pc_15 pc_16 pc_17
chr_5430_d108 HPGL0631 chr d108 1 #990000 HPGL0631 -0.1611 -0.3489 -0.1611 -0.3489 0.0176 0.0491 0.2741 -0.1740 0.0107 0.3748 0.3130 -0.3524 0.0330 -0.4609 0.0055 -0.2897 -0.0971 -0.1334 0.0347
chr_5397_d108 HPGL0632 chr d108 1 #990000 HPGL0632 -0.1370 -0.3164 -0.1370 -0.3164 0.1623 0.0850 -0.0072 -0.2891 -0.1573 -0.5608 -0.1371 0.3530 -0.0431 -0.2223 0.2812 -0.1925 -0.0844 0.2058 -0.0943
chr_2504_d108 HPGL0633 chr d108 1 #990000 HPGL0633 -0.0604 -0.2326 -0.0604 -0.2326 -0.3447 -0.1570 -0.0781 0.2398 -0.3286 -0.1816 0.2576 -0.2491 -0.3255 0.2435 0.2494 0.2937 -0.2302 -0.1674 -0.1250
sh_2272_d108 HPGL0634 sh d108 1 #000099 HPGL0634 -0.2063 -0.3506 -0.2063 -0.3506 -0.0516 -0.0136 -0.0695 -0.3335 0.3902 0.2903 -0.2003 0.2067 -0.3153 0.2186 -0.0594 0.3491 0.2447 -0.0607 0.0670
sh_1022_d108 HPGL0635 sh d108 1 #000099 HPGL0635 -0.0563 -0.2715 -0.0563 -0.2715 -0.1747 -0.3092 0.0057 0.2660 -0.3174 -0.0246 -0.0421 0.2032 0.1577 0.0225 -0.6139 -0.1549 0.2211 0.1485 0.1704
sh_2189_d108 HPGL0636 sh d108 1 #000099 HPGL0636 -0.0981 -0.2975 -0.0981 -0.2975 0.0560 0.3313 -0.2415 0.4407 0.2953 0.0201 -0.1384 -0.0989 0.5375 0.1900 0.1769 -0.0337 -0.0786 -0.0052 -0.0266
chr_5430_d110 HPGL0651 chr d110 2 #990000 HPGL0651 0.2928 -0.0198 0.2928 -0.0198 0.3690 0.0999 0.2950 0.1017 -0.1363 -0.0524 -0.0190 -0.2033 0.0748 -0.2097 -0.0147 0.6116 0.1975 0.2928 0.0568
chr_5397_d110 HPGL0652 chr d110 2 #990000 HPGL0652 0.3038 0.0114 0.3038 0.0114 0.4206 -0.2109 -0.0033 0.1733 -0.0710 0.3688 -0.0045 0.3964 -0.1465 0.1085 0.1079 -0.0986 -0.4764 -0.0759 0.1228
chr_2504_d110 HPGL0653 chr d110 2 #990000 HPGL0653 0.3359 0.0550 0.3359 0.0550 -0.1363 -0.5225 -0.1411 -0.0890 0.5188 -0.2758 -0.0919 -0.2163 0.0784 -0.2218 -0.1070 0.0008 -0.1807 -0.0083 -0.0959
sh_2272_d110 HPGL0654 sh d110 2 #000099 HPGL0654 0.3020 0.0295 0.3020 0.0295 0.1245 0.1800 -0.2146 -0.0802 -0.2451 0.1096 -0.2769 -0.1500 -0.1231 0.0253 -0.1470 -0.1955 0.2529 -0.2840 -0.6005
sh_1022_d110 HPGL0655 sh d110 2 #000099 HPGL0655 0.3685 0.1066 0.3685 0.1066 -0.3788 0.2012 0.2061 -0.1888 0.0556 0.0022 0.4459 0.4198 0.3094 0.0896 0.0688 0.0605 0.1267 -0.1432 -0.0914
sh_2189_d110 HPGL0656 sh d110 2 #000099 HPGL0656 0.3447 0.0639 0.3447 0.0639 -0.1353 0.2725 -0.1250 -0.1288 -0.0223 -0.0520 -0.0621 -0.2876 -0.2458 0.2278 0.0736 -0.3297 0.0945 0.2407 0.5600
chr_5430_d107 HPGL0658 chr d107 3 #990000 HPGL0658 -0.2482 0.1907 -0.2482 0.1907 0.2127 -0.1496 0.5263 -0.1952 0.0344 -0.1399 -0.0482 -0.2069 0.1567 0.5696 -0.0771 -0.1510 -0.0767 -0.0097 -0.1192
chr_5397_d107 HPGL0659 chr d107 3 #990000 HPGL0659 -0.2296 0.2646 -0.2296 0.2646 0.1711 -0.0985 -0.2543 0.1816 0.1790 0.0835 0.4759 0.0445 -0.1966 0.0073 0.0866 -0.1468 0.2842 0.4528 -0.2530
chr_2504_d107 HPGL0660 chr d107 3 #990000 HPGL0660 -0.1644 0.2975 -0.1644 0.2975 -0.1981 -0.3380 0.0054 0.0073 -0.2201 0.2295 -0.3446 0.0206 0.2195 -0.1612 0.5178 -0.0054 0.2915 -0.0773 0.1472
sh_2272_d107 HPGL0661 sh d107 3 #000099 HPGL0661 -0.2235 0.2505 -0.2235 0.2505 0.3190 0.0682 -0.3097 -0.0733 -0.0369 -0.2647 0.2245 -0.0028 0.0510 -0.0944 -0.1779 0.1249 0.0793 -0.5607 0.3504
sh_1022_d107 HPGL0662 sh d107 3 #000099 HPGL0662 -0.1456 0.2711 -0.1456 0.2711 -0.2143 0.2975 0.3806 0.4306 0.2331 -0.1138 -0.2384 0.1508 -0.3706 -0.2509 -0.1152 -0.0609 -0.0738 -0.1228 -0.0194
sh_2189_d107 HPGL0663 sh d107 3 #000099 HPGL0663 -0.2169 0.2965 -0.2169 0.2965 -0.2189 0.2147 -0.2490 -0.2891 -0.1821 0.1869 -0.1133 -0.0276 0.1487 -0.0814 -0.2557 0.2182 -0.4946 0.3079 -0.0841
## NULL

3.1.2 PCA: Repeat with combat adjustment

For the second iteration, use the same normalization, but add a combat correction in an attempt to minimize patient’s effect in the variance.

sampleid condition batch batch_int colors labels PC1 PC2 pc_1 pc_2 pc_3 pc_4 pc_5 pc_6 pc_7 pc_8 pc_9 pc_10 pc_11 pc_12 pc_13 pc_14 pc_15 pc_16 pc_17
chr_5430_d108 HPGL0631 chr d108 1 #990000 HPGL0631 -0.1777 0.0481 -0.1777 0.0481 -0.3107 0.2040 -0.0925 0.2985 -0.0151 0.4744 0.1769 0.3908 0.0638 -0.3822 0.0043 -0.1141 0.0409 -0.3115 -0.0600
chr_5397_d108 HPGL0632 chr d108 1 #990000 HPGL0632 -0.2128 0.0873 -0.2128 0.0873 -0.0055 0.1617 0.3947 -0.3333 -0.1712 -0.4051 -0.1207 0.2265 0.3480 -0.0614 0.0146 0.1990 -0.2221 -0.3493 -0.0565
chr_2504_d108 HPGL0633 chr d108 1 #990000 HPGL0633 0.3086 -0.1935 0.3086 -0.1935 0.0324 -0.1209 0.2386 -0.0038 -0.1092 0.3881 -0.3959 -0.1445 0.0210 0.3636 0.1433 -0.3248 -0.1226 -0.3469 -0.0701
sh_2272_d108 HPGL0634 sh d108 1 #000099 HPGL0634 -0.1571 0.0483 -0.1571 0.0483 0.0525 0.4526 -0.5112 0.0729 0.1301 -0.2525 -0.2898 -0.0824 -0.1556 0.3014 -0.1541 -0.0312 0.2330 -0.2605 -0.0992
sh_1022_d108 HPGL0635 sh d108 1 #000099 HPGL0635 0.1694 -0.2950 0.1694 -0.2950 -0.0120 -0.2196 0.2093 0.0786 0.1574 -0.1927 0.1169 -0.1064 -0.5677 -0.2560 -0.0898 0.3237 0.1448 -0.3474 -0.0339
sh_2189_d108 HPGL0636 sh d108 1 #000099 HPGL0636 -0.0142 0.3201 -0.0142 0.3201 0.2197 -0.4093 -0.3408 -0.1185 0.0539 0.0199 0.4750 -0.2797 0.2264 0.0648 0.0482 -0.0340 -0.1040 -0.3414 -0.0487
chr_5430_d110 HPGL0651 chr d110 2 #990000 HPGL0651 -0.3159 0.0953 -0.3159 0.0953 -0.2839 -0.2256 0.1382 -0.1333 0.0603 0.1867 0.1355 0.2272 -0.1739 0.5556 0.0015 0.2647 0.1509 0.2397 -0.2636
chr_5397_d110 HPGL0652 chr d110 2 #990000 HPGL0652 -0.3219 -0.2135 -0.3219 -0.2135 0.0767 -0.2850 -0.0088 0.4701 0.0843 -0.3051 -0.1738 -0.0446 0.1657 -0.1263 0.4223 -0.1724 -0.0014 0.2017 -0.2500
chr_2504_d110 HPGL0653 chr d110 2 #990000 HPGL0653 0.1262 -0.5327 0.1262 -0.5327 0.1563 0.1202 -0.3400 -0.4744 -0.1719 0.0524 0.1738 0.1925 -0.0463 -0.1244 0.1343 -0.0623 -0.1201 0.2217 -0.2501
sh_2272_d110 HPGL0654 sh d110 2 #000099 HPGL0654 -0.0520 0.2060 -0.0520 0.2060 0.2272 0.0427 0.1718 -0.0240 0.3935 0.0665 -0.0824 -0.0107 -0.1515 -0.1600 -0.4834 -0.2613 -0.4128 0.2406 -0.2658
sh_1022_d110 HPGL0655 sh d110 2 #000099 HPGL0655 0.4338 0.1549 0.4338 0.1549 -0.2702 0.1579 0.0793 0.3042 -0.4730 -0.2751 0.2701 -0.1187 0.0311 0.0879 -0.1763 -0.1042 -0.0082 0.1857 -0.2525
sh_2189_d110 HPGL0656 sh d110 2 #000099 HPGL0656 0.2165 0.2696 0.2165 0.2696 0.0946 0.0868 0.0638 -0.1705 0.0851 0.2368 -0.2647 -0.2500 0.2345 -0.3162 0.1330 0.3144 0.4640 0.1973 -0.2318
chr_5430_d107 HPGL0658 chr d107 3 #990000 HPGL0658 -0.3017 -0.1341 -0.3017 -0.1341 -0.4751 0.1657 0.0357 -0.1895 0.0157 0.0627 0.0468 -0.6129 -0.0274 -0.1008 0.0507 -0.0680 -0.1720 0.1332 0.3124
chr_5397_d107 HPGL0659 chr d107 3 #990000 HPGL0659 -0.1394 -0.0908 -0.1394 -0.0908 0.2813 -0.1325 -0.1677 0.2681 -0.4215 0.2082 -0.2122 -0.0136 0.0474 0.0048 -0.3037 0.4569 -0.2252 0.1304 0.2878
chr_2504_d107 HPGL0660 chr d107 3 #990000 HPGL0660 0.1983 -0.3629 0.1983 -0.3629 0.0165 0.0462 0.1090 0.1157 0.4211 -0.0547 0.2076 0.1114 0.4868 0.1875 -0.2671 0.0050 0.2259 0.0859 0.3288
sh_2272_d107 HPGL0661 sh d107 3 #000099 HPGL0661 -0.2310 0.1243 -0.2310 0.1243 0.3429 -0.0205 0.2283 -0.1295 -0.3019 -0.0314 0.1098 0.0793 -0.2147 -0.0511 -0.0382 -0.4447 0.4613 0.0885 0.3312
sh_1022_d107 HPGL0662 sh d107 3 #000099 HPGL0662 0.2756 0.2341 0.2756 0.2341 -0.3662 -0.3784 -0.2880 -0.1734 0.0723 -0.2009 -0.3397 0.3224 -0.0712 -0.1277 0.0140 -0.1160 -0.0528 0.1105 0.3293
sh_2189_d107 HPGL0663 sh d107 3 #000099 HPGL0663 0.1951 0.2347 0.1951 0.2347 0.2234 0.3543 0.0801 0.1420 0.1901 0.0216 0.1667 0.1134 -0.2162 0.1403 0.5463 0.1694 -0.2794 0.1215 0.2926
## NULL

3.1.3 Look at correlations between experimental factors and variance

## More shallow curves in these plots suggest more genes in this principle component.

Look for significant correlations between the PCs and some factors in the experimental design.

3.1.4 PCA: Change batch to strain and condition to patient+state

Here we will set the batch to the humansite strains and condition to a combination of the patient and state state; then perform the pca again.

sampleid condition batch batch_int colors labels PC1 PC2 pc_1 pc_2 pc_3 pc_4 pc_5 pc_6 pc_7 pc_8 pc_9 pc_10 pc_11 pc_12 pc_13 pc_14 pc_15 pc_16 pc_17
chr_5430_d108 HPGL0631 chronic_d108 s5430 6 #1B9E77 HPGL0631 -0.2389 -0.3389 -0.2389 -0.3389 0.1482 0.0927 0.3398 0.1842 0.0619 -0.2785 0.0140 -0.0176 0.5214 0.0112 -0.1123 0.3146 -0.2389 0.2605 -0.0463
chr_5397_d108 HPGL0632 chronic_d108 s5397 5 #1B9E77 HPGL0632 -0.2331 -0.3252 -0.2331 -0.3252 0.3003 0.1855 -0.4607 -0.3583 -0.2254 -0.1297 0.0939 0.0754 0.0371 -0.0002 -0.1483 0.0051 0.0352 -0.3846 0.2540
chr_2504_d108 HPGL0633 chronic_d108 s2504 4 #1B9E77 HPGL0633 -0.2282 -0.3041 -0.2282 -0.3041 -0.1138 0.3914 0.1470 0.0007 -0.0414 0.5149 -0.0793 -0.2889 -0.0754 -0.0884 0.1928 -0.0345 0.4145 0.0928 -0.1528
sh_2272_d108 HPGL0634 self_heal_d108 s2272 3 #D95F02 HPGL0634 0.1600 -0.3724 0.1600 -0.3724 0.2215 -0.2087 -0.0035 0.1477 0.3763 -0.1109 -0.0552 -0.1501 -0.4315 0.2556 -0.2635 -0.1265 -0.0229 -0.1124 -0.3690
sh_1022_d108 HPGL0635 self_heal_d108 s1022 1 #D95F02 HPGL0635 0.1783 -0.3036 0.1783 -0.3036 -0.1491 -0.4087 0.0425 0.1789 -0.4254 0.2010 0.3096 0.0924 -0.0427 0.1193 0.4221 0.0804 -0.2299 -0.1319 0.0270
sh_2189_d108 HPGL0636 self_heal_d108 s2189 2 #D95F02 HPGL0636 0.1795 -0.3411 0.1795 -0.3411 -0.4658 -0.0728 -0.0481 -0.1240 0.1499 -0.1437 -0.2832 0.3517 -0.0528 -0.2793 -0.0680 -0.2433 0.0461 0.2751 0.2939
chr_5430_d110 HPGL0651 chronic_d110 s5430 6 #7570B3 HPGL0651 -0.0390 0.1866 -0.0390 0.1866 -0.3525 0.2069 -0.1047 -0.1140 -0.2274 -0.2225 0.0638 -0.1621 -0.4480 0.1936 -0.1527 0.4923 -0.1118 0.2629 -0.0115
chr_5397_d110 HPGL0652 chronic_d110 s5397 5 #7570B3 HPGL0652 -0.0410 0.1663 -0.0410 0.1663 -0.2587 -0.2416 -0.1629 0.4286 0.0875 0.0562 -0.2581 -0.3493 0.2099 -0.0393 -0.2094 0.1756 0.1620 -0.3825 0.2956
chr_2504_d110 HPGL0653 chronic_d110 s2504 4 #7570B3 HPGL0653 -0.0520 0.1531 -0.0520 0.1531 0.0737 -0.4871 0.1219 -0.4337 0.1260 -0.2258 0.1989 -0.1120 0.0913 -0.1293 0.1668 0.1548 0.5101 0.0862 -0.0958
sh_2272_d110 HPGL0654 self_heal_d110 s2272 3 #E7298A HPGL0654 0.3676 0.1360 0.3676 0.1360 -0.0289 0.2201 -0.0509 0.1671 -0.0480 0.0776 0.3929 0.2549 0.1092 -0.4562 -0.3229 0.0940 0.1057 -0.1389 -0.3460
sh_1022_d110 HPGL0655 self_heal_d110 s1022 1 #E7298A HPGL0655 0.3540 0.1337 0.3540 0.1337 0.3827 0.1580 0.1698 -0.0377 -0.0157 -0.0255 -0.5366 0.1569 -0.1290 -0.1244 0.3454 0.3214 -0.0336 -0.1631 0.0609
sh_2189_d110 HPGL0656 self_heal_d110 s2189 2 #E7298A HPGL0656 0.3670 0.1323 0.3670 0.1323 0.1607 0.1058 -0.0074 -0.0460 0.1261 0.2864 0.1791 0.1017 0.2069 0.5663 -0.1523 -0.0506 0.1718 0.2598 0.3555
chr_5430_d107 HPGL0658 chronic_d107 s5430 6 #66A61E HPGL0658 -0.3328 0.1979 -0.3328 0.1979 0.1798 -0.2834 -0.2911 -0.0777 0.1908 0.5018 -0.0934 0.1576 -0.0488 -0.1959 -0.0837 0.1093 -0.3572 0.2756 -0.0780
chr_5397_d107 HPGL0659 chronic_d107 s5397 5 #66A61E HPGL0659 -0.3338 0.2137 -0.3338 0.2137 -0.0968 0.0486 0.6083 -0.0873 0.1045 0.0544 0.1511 0.2540 -0.2307 0.0525 -0.1376 -0.1616 -0.1206 -0.3711 0.2083
chr_2504_d107 HPGL0660 chronic_d107 s2504 4 #66A61E HPGL0660 -0.3277 0.2162 -0.3277 0.2162 0.0448 0.0708 -0.2360 0.4404 -0.0879 -0.2747 -0.0588 0.3988 -0.0235 0.2174 0.2586 -0.2165 0.2826 0.1071 -0.1871
sh_2272_d107 HPGL0661 self_heal_d107 s2272 3 #E6AB02 HPGL0661 0.0812 0.1698 0.0812 0.1698 -0.1731 -0.0492 0.0561 -0.3232 -0.3590 0.0157 -0.3574 -0.0999 0.3206 0.2149 -0.1620 -0.3275 -0.1656 -0.0853 -0.4301
sh_1022_d107 HPGL0662 self_heal_d107 s1022 1 #E6AB02 HPGL0662 0.0747 0.1251 0.0747 0.1251 -0.1966 0.2734 -0.2049 -0.1119 0.4905 -0.1367 0.2206 -0.2411 0.1459 -0.0017 0.4626 -0.1492 -0.3333 -0.1372 -0.0410
sh_2189_d107 HPGL0663 self_heal_d107 s2189 2 #E6AB02 HPGL0663 0.0642 0.1545 0.0642 0.1545 0.3234 -0.0019 0.0848 0.1660 -0.2834 -0.1600 0.0980 -0.4225 -0.1599 -0.3161 -0.0356 -0.4380 -0.1142 0.2871 0.2628
## NULL

3.1.5 PCA: Repeat but with just chronic/self-state

Now change only the condition to self/chronic and make super-explicit the split in the samples.

## The new colors are a character, changing according to condition.

sampleid condition batch batch_int colors labels PC1 PC2 pc_1 pc_2 pc_3 pc_4 pc_5 pc_6 pc_7 pc_8 pc_9 pc_10 pc_11 pc_12 pc_13 pc_14 pc_15 pc_16 pc_17
chr_5430_d108 HPGL0631 chronic s5430 6 #880000 HPGL0631 -0.2389 -0.3389 -0.2389 -0.3389 0.1482 0.0927 0.3398 0.1842 0.0619 -0.2785 0.0140 -0.0176 0.5214 0.0112 -0.1123 0.3146 -0.2389 0.2605 -0.0463
chr_5397_d108 HPGL0632 chronic s5397 5 #880000 HPGL0632 -0.2331 -0.3252 -0.2331 -0.3252 0.3003 0.1855 -0.4607 -0.3583 -0.2254 -0.1297 0.0939 0.0754 0.0371 -0.0002 -0.1483 0.0051 0.0352 -0.3846 0.2540
chr_2504_d108 HPGL0633 chronic s2504 4 #880000 HPGL0633 -0.2282 -0.3041 -0.2282 -0.3041 -0.1138 0.3914 0.1470 0.0007 -0.0414 0.5149 -0.0793 -0.2889 -0.0754 -0.0884 0.1928 -0.0345 0.4145 0.0928 -0.1528
sh_2272_d108 HPGL0634 self_heal s2272 3 #000088 HPGL0634 0.1600 -0.3724 0.1600 -0.3724 0.2215 -0.2087 -0.0035 0.1477 0.3763 -0.1109 -0.0552 -0.1501 -0.4315 0.2556 -0.2635 -0.1265 -0.0229 -0.1124 -0.3690
sh_1022_d108 HPGL0635 self_heal s1022 1 #000088 HPGL0635 0.1783 -0.3036 0.1783 -0.3036 -0.1491 -0.4087 0.0425 0.1789 -0.4254 0.2010 0.3096 0.0924 -0.0427 0.1193 0.4221 0.0804 -0.2299 -0.1319 0.0270
sh_2189_d108 HPGL0636 self_heal s2189 2 #000088 HPGL0636 0.1795 -0.3411 0.1795 -0.3411 -0.4658 -0.0728 -0.0481 -0.1240 0.1499 -0.1437 -0.2832 0.3517 -0.0528 -0.2793 -0.0680 -0.2433 0.0461 0.2751 0.2939
chr_5430_d110 HPGL0651 chronic s5430 6 #880000 HPGL0651 -0.0390 0.1866 -0.0390 0.1866 -0.3525 0.2069 -0.1047 -0.1140 -0.2274 -0.2225 0.0638 -0.1621 -0.4480 0.1936 -0.1527 0.4923 -0.1118 0.2629 -0.0115
chr_5397_d110 HPGL0652 chronic s5397 5 #880000 HPGL0652 -0.0410 0.1663 -0.0410 0.1663 -0.2587 -0.2416 -0.1629 0.4286 0.0875 0.0562 -0.2581 -0.3493 0.2099 -0.0393 -0.2094 0.1756 0.1620 -0.3825 0.2956
chr_2504_d110 HPGL0653 chronic s2504 4 #880000 HPGL0653 -0.0520 0.1531 -0.0520 0.1531 0.0737 -0.4871 0.1219 -0.4337 0.1260 -0.2258 0.1989 -0.1120 0.0913 -0.1293 0.1668 0.1548 0.5101 0.0862 -0.0958
sh_2272_d110 HPGL0654 self_heal s2272 3 #000088 HPGL0654 0.3676 0.1360 0.3676 0.1360 -0.0289 0.2201 -0.0509 0.1671 -0.0480 0.0776 0.3929 0.2549 0.1092 -0.4562 -0.3229 0.0940 0.1057 -0.1389 -0.3460
sh_1022_d110 HPGL0655 self_heal s1022 1 #000088 HPGL0655 0.3540 0.1337 0.3540 0.1337 0.3827 0.1580 0.1698 -0.0377 -0.0157 -0.0255 -0.5366 0.1569 -0.1290 -0.1244 0.3454 0.3214 -0.0336 -0.1631 0.0609
sh_2189_d110 HPGL0656 self_heal s2189 2 #000088 HPGL0656 0.3670 0.1323 0.3670 0.1323 0.1607 0.1058 -0.0074 -0.0460 0.1261 0.2864 0.1791 0.1017 0.2069 0.5663 -0.1523 -0.0506 0.1718 0.2598 0.3555
chr_5430_d107 HPGL0658 chronic s5430 6 #880000 HPGL0658 -0.3328 0.1979 -0.3328 0.1979 0.1798 -0.2834 -0.2911 -0.0777 0.1908 0.5018 -0.0934 0.1576 -0.0488 -0.1959 -0.0837 0.1093 -0.3572 0.2756 -0.0780
chr_5397_d107 HPGL0659 chronic s5397 5 #880000 HPGL0659 -0.3338 0.2137 -0.3338 0.2137 -0.0968 0.0486 0.6083 -0.0873 0.1045 0.0544 0.1511 0.2540 -0.2307 0.0525 -0.1376 -0.1616 -0.1206 -0.3711 0.2083
chr_2504_d107 HPGL0660 chronic s2504 4 #880000 HPGL0660 -0.3277 0.2162 -0.3277 0.2162 0.0448 0.0708 -0.2360 0.4404 -0.0879 -0.2747 -0.0588 0.3988 -0.0235 0.2174 0.2586 -0.2165 0.2826 0.1071 -0.1871
sh_2272_d107 HPGL0661 self_heal s2272 3 #000088 HPGL0661 0.0812 0.1698 0.0812 0.1698 -0.1731 -0.0492 0.0561 -0.3232 -0.3590 0.0157 -0.3574 -0.0999 0.3206 0.2149 -0.1620 -0.3275 -0.1656 -0.0853 -0.4301
sh_1022_d107 HPGL0662 self_heal s1022 1 #000088 HPGL0662 0.0747 0.1251 0.0747 0.1251 -0.1966 0.2734 -0.2049 -0.1119 0.4905 -0.1367 0.2206 -0.2411 0.1459 -0.0017 0.4626 -0.1492 -0.3333 -0.1372 -0.0410
sh_2189_d107 HPGL0663 self_heal s2189 2 #000088 HPGL0663 0.0642 0.1545 0.0642 0.1545 0.3234 -0.0019 0.0848 0.1660 -0.2834 -0.1600 0.0980 -0.4225 -0.1599 -0.3161 -0.0356 -0.4380 -0.1142 0.2871 0.2628

3.2 Restart but include the uninfected samples

For the next few blocks we will just repeat what we did but include the uninfected samples. Ideally doing so will have ~0 effect on the positions of the sample types.

3.2.1 PCA: +uninfected: No Batch correction

In this first example, we see why the uninfected samples were initially removed from the analyses I think.

sampleid condition batch batch_int colors labels PC1 PC2 pc_1 pc_2 pc_3 pc_4 pc_5 pc_6 pc_7 pc_8 pc_9 pc_10 pc_11 pc_12 pc_13 pc_14 pc_15 pc_16 pc_17 pc_18 pc_19 pc_20
uninf_2_d108 HPGL0630 uninf d108 1 #009900 HPGL0630 -0.1192 -0.4892 -0.1192 -0.4892 0.2040 -0.0016 0.1792 0.0247 -0.4680 -0.2019 0.3166 -0.0671 -0.0643 0.4197 -0.2441 0.0376 -0.0498 0.1085 -0.0176 -0.0045 0.0562 -0.0309
chr_5430_d108 HPGL0631 chr d108 1 #990000 HPGL0631 0.1684 0.0236 0.1684 0.0236 0.3258 0.0981 -0.2269 -0.2014 0.3080 0.0833 -0.0779 0.2725 -0.3636 0.1990 -0.0824 0.0393 -0.4876 0.1085 0.2622 0.0953 0.1571 0.0358
chr_5397_d108 HPGL0632 chr d108 1 #990000 HPGL0632 0.1455 0.0326 0.1455 0.0326 0.3047 -0.0176 -0.2516 0.0637 -0.0217 -0.3690 0.2968 -0.1579 0.3788 -0.3362 0.1246 0.1607 -0.1690 -0.2596 0.2499 0.1238 -0.1932 -0.1049
chr_2504_d108 HPGL0633 chr d108 1 #990000 HPGL0633 0.0704 0.0260 0.0704 0.0260 0.2162 0.1980 0.4266 -0.0572 0.1152 -0.0824 0.1262 0.0994 -0.3141 -0.0667 0.4111 0.0294 0.2724 -0.3538 -0.2320 0.2241 0.2192 -0.0721
sh_2272_d108 HPGL0634 sh d108 1 #000099 HPGL0634 0.1907 -0.0507 0.1907 -0.0507 0.3313 -0.0250 -0.1524 0.1217 0.2526 0.1056 -0.2046 0.0061 0.2974 0.2731 -0.0059 0.3910 0.2644 0.0851 -0.4010 -0.2992 -0.0542 0.0421
sh_1022_d108 HPGL0635 sh d108 1 #000099 HPGL0635 0.0678 0.0404 0.0678 0.0404 0.2576 0.0554 0.3839 -0.2137 0.0826 -0.0717 -0.1003 -0.2275 0.1087 -0.1720 0.1542 -0.4181 -0.0098 0.4978 0.0851 -0.2181 -0.2124 0.1490
sh_2189_d108 HPGL0636 sh d108 1 #000099 HPGL0636 0.1270 0.0982 0.1270 0.0982 0.2842 0.1941 0.0030 0.2874 -0.3451 0.3637 -0.2714 0.0965 0.0256 -0.2675 -0.4274 -0.2469 0.1522 -0.1842 0.0719 0.1054 0.0433 -0.0093
uninf_d110 HPGL0650 uninf d110 2 #009900 HPGL0650 -0.2896 -0.4798 -0.2896 -0.4798 0.0567 -0.4748 -0.1550 0.1048 0.2178 0.4050 0.0353 -0.1765 -0.1130 -0.1994 0.1884 -0.1417 0.0313 -0.1147 0.0625 0.0110 0.0268 0.0625
chr_5430_d110 HPGL0651 chr d110 2 #990000 HPGL0651 -0.2280 0.2430 -0.2280 0.2430 0.0150 -0.0326 -0.2978 -0.2557 -0.2513 -0.0559 -0.0061 -0.0545 -0.2492 -0.0530 0.0135 -0.1739 -0.2418 -0.1868 -0.5583 -0.1785 -0.2906 0.0005
chr_5397_d110 HPGL0652 chr d110 2 #990000 HPGL0652 -0.2350 0.2643 -0.2350 0.2643 -0.0012 -0.2464 -0.0063 -0.1760 -0.1135 -0.0506 -0.3489 -0.1002 0.3401 0.3924 0.1353 -0.0973 0.0316 -0.0596 0.0801 0.4969 0.1465 0.1075
chr_2504_d110 HPGL0653 chr d110 2 #990000 HPGL0653 -0.3191 0.0913 -0.3191 0.0913 -0.0560 -0.2407 0.3502 -0.0832 0.0240 0.0196 -0.0015 0.3867 0.0749 -0.3580 -0.2374 0.4381 -0.1241 0.2361 -0.0942 0.1298 -0.0877 -0.1203
sh_2272_d110 HPGL0654 sh d110 2 #000099 HPGL0654 -0.2469 0.2080 -0.2469 0.2080 -0.0357 0.0199 -0.1093 0.2552 -0.0405 -0.1957 -0.2044 -0.2518 -0.2113 -0.0214 0.0914 0.0763 0.0696 0.1773 0.1847 -0.2885 0.3322 -0.5486
sh_1022_d110 HPGL0655 sh d110 2 #000099 HPGL0655 -0.3272 0.1504 -0.3272 0.1504 -0.1322 0.3146 -0.0193 -0.0266 0.3585 0.1589 0.4676 0.0927 0.3443 0.1295 -0.2111 -0.2863 0.0236 -0.0814 -0.0293 -0.1232 0.1865 -0.0655
sh_2189_d110 HPGL0656 sh d110 2 #000099 HPGL0656 -0.2999 0.1656 -0.2999 0.1656 -0.0823 0.1966 -0.0807 0.2612 -0.0086 -0.0853 0.0432 0.0589 -0.2632 0.0929 0.0784 0.2054 0.2552 0.0069 0.3239 -0.0665 -0.3316 0.5399
uninf_d107 HPGL0657 uninf d107 3 #009900 HPGL0657 -0.0682 -0.5184 -0.0682 -0.5184 -0.3203 0.4184 -0.1398 -0.1011 0.0203 -0.2358 -0.4215 0.2535 0.1676 -0.1350 0.1258 -0.0717 -0.0334 -0.0393 -0.0284 0.0159 -0.0307 -0.0408
chr_5430_d107 HPGL0658 chr d107 3 #990000 HPGL0658 0.2617 0.0056 0.2617 0.0056 -0.1624 -0.1853 -0.2893 -0.4825 -0.0127 -0.0905 0.1554 0.0670 -0.1510 -0.0831 -0.2215 -0.0390 0.5857 0.1333 0.1240 0.0647 0.0158 -0.0935
chr_5397_d107 HPGL0659 chr d107 3 #990000 HPGL0659 0.2621 0.0748 0.2621 0.0748 -0.2128 -0.2403 0.1650 0.1460 -0.1005 0.1517 0.0412 0.3886 0.0577 0.2951 0.2411 -0.1666 -0.0542 -0.1594 0.2018 -0.2149 -0.3780 -0.3260
chr_2504_d107 HPGL0660 chr d107 3 #990000 HPGL0660 0.1763 -0.0055 0.1763 -0.0055 -0.2662 -0.1168 0.3292 -0.1500 0.1725 -0.1107 -0.1828 -0.3592 -0.0466 0.0198 -0.3631 0.1344 -0.1584 -0.4518 0.1115 -0.2687 0.0707 0.1737
sh_2272_d107 HPGL0661 sh d107 3 #000099 HPGL0661 0.2601 0.0889 0.2601 0.0889 -0.2009 -0.2491 -0.0832 0.2896 -0.1476 -0.1996 0.1264 0.2292 0.0622 -0.1468 0.1208 -0.1366 -0.1285 0.1511 -0.1768 -0.1264 0.4913 0.4085
sh_1022_d107 HPGL0662 sh d107 3 #000099 HPGL0662 0.1732 0.0381 0.1732 0.0381 -0.2561 0.2846 -0.0209 -0.1956 -0.3084 0.5260 0.1483 -0.2789 0.0786 -0.0466 0.2753 0.3492 -0.1498 0.1530 0.0415 0.0331 0.0940 0.0212
sh_2189_d107 HPGL0663 sh d107 3 #000099 HPGL0663 0.2298 -0.0072 0.2298 -0.0072 -0.2696 0.0504 -0.0046 0.3887 0.2666 -0.0648 0.0622 -0.2777 -0.1596 0.0641 -0.1672 -0.0832 -0.0797 0.2332 -0.2614 0.4885 -0.2611 -0.1287
## NULL

3.2.2 PCA: +uninfected Repeat with combat adjustment

For the second iteration, use the same normalization, but add a combat correction in an attempt to minimize patient’s effect in the variance.

sampleid condition batch batch_int colors labels PC1 PC2 pc_1 pc_2 pc_3 pc_4 pc_5 pc_6 pc_7 pc_8 pc_9 pc_10 pc_11 pc_12 pc_13 pc_14 pc_15 pc_16 pc_17 pc_18 pc_19 pc_20
uninf_2_d108 HPGL0630 uninf d108 1 #009900 HPGL0630 -0.5109 0.0691 -0.5109 0.0691 -0.2443 0.0190 -0.4320 0.0401 -0.3003 0.0152 0.0909 0.4392 0.0524 -0.0400 0.0191 -0.0718 0.0205 -0.0240 -0.0203 0.0612 0.3627 -0.0122
chr_5430_d108 HPGL0631 chr d108 1 #990000 HPGL0631 0.0948 -0.1729 0.0948 -0.1729 0.2700 -0.2965 0.2666 -0.0353 0.1296 -0.4297 0.1961 0.2550 -0.2040 -0.3252 -0.2836 -0.1253 -0.0982 -0.0683 -0.1711 -0.0014 0.2971 0.0090
chr_5397_d108 HPGL0632 chr d108 1 #990000 HPGL0632 0.0967 -0.1735 0.0967 -0.1735 0.1653 -0.0292 -0.1102 0.4015 -0.2543 0.2609 -0.2294 -0.3373 -0.0745 0.0406 -0.4080 0.2210 -0.2450 -0.0097 0.1681 0.0462 0.3150 0.0097
chr_2504_d108 HPGL0633 chr d108 1 #990000 HPGL0633 0.0583 0.2280 0.0583 0.2280 -0.2030 0.0399 0.2834 -0.0548 -0.1376 -0.2356 0.2952 -0.3209 0.4732 0.1399 0.0437 0.3123 0.1461 -0.1786 -0.1367 0.0428 0.2958 0.0467
sh_2272_d108 HPGL0634 sh d108 1 #000099 HPGL0634 0.0315 -0.3142 0.0315 -0.3142 0.2081 0.1003 0.1985 -0.0602 0.2199 0.1328 -0.3367 0.2315 0.3892 0.3445 0.0673 -0.2474 0.2704 0.1782 0.0766 -0.0327 0.2689 0.0572
sh_1022_d108 HPGL0635 sh d108 1 #000099 HPGL0635 0.0758 0.1310 0.0758 0.1310 -0.3157 -0.1345 0.1632 0.0042 0.1481 0.3389 0.0280 -0.2804 -0.1396 -0.3898 0.3493 -0.3592 -0.0392 0.1576 0.1300 -0.1015 0.3039 -0.0219
sh_2189_d108 HPGL0636 sh d108 1 #000099 HPGL0636 0.1524 0.0825 0.1524 0.0825 0.1960 0.2741 -0.3451 -0.4005 0.2711 -0.0805 0.0264 -0.1076 -0.4271 0.2313 0.2167 0.2545 -0.0300 -0.0135 -0.0012 0.0003 0.2973 0.0012
uninf_d110 HPGL0650 uninf d110 2 #009900 HPGL0650 -0.5201 -0.5099 -0.5201 -0.5099 -0.0037 0.0939 0.1668 -0.2920 -0.0380 0.1098 0.1013 -0.2704 -0.0862 -0.1150 0.0049 0.1280 -0.0242 -0.0112 -0.0797 -0.0914 -0.2304 0.3122
chr_5430_d110 HPGL0651 chr d110 2 #990000 HPGL0651 0.1648 0.0014 0.1648 0.0014 0.1182 -0.3350 -0.2989 0.0670 -0.0088 -0.0099 0.2429 -0.0091 0.0186 -0.1141 -0.0343 0.1252 0.5722 0.1216 0.4012 -0.0637 -0.1932 0.2668
chr_5397_d110 HPGL0652 chr d110 2 #990000 HPGL0652 0.1838 -0.0382 0.1838 -0.0382 -0.2150 -0.1542 -0.1686 0.0703 0.3508 0.1493 -0.2867 0.2321 0.2034 -0.1895 0.0870 0.2800 -0.1832 -0.4615 -0.1867 -0.1315 -0.1356 0.2282
chr_2504_d110 HPGL0653 chr d110 2 #990000 HPGL0653 0.0033 0.0840 0.0033 0.0840 -0.4413 0.0021 0.0318 0.0127 0.0541 -0.3148 -0.1887 -0.1242 -0.2633 0.3743 -0.2828 -0.3918 0.0264 -0.2146 0.1695 0.0629 -0.1401 0.2330
sh_2272_d110 HPGL0654 sh d110 2 #000099 HPGL0654 0.1039 0.0669 0.1039 0.0669 0.1076 0.2067 -0.1044 0.1950 0.1683 0.1604 0.2959 0.0009 0.0966 -0.0109 -0.0168 -0.1910 -0.1359 0.1720 -0.2681 0.6517 -0.1736 0.2671
sh_1022_d110 HPGL0655 sh d110 2 #000099 HPGL0655 0.0191 0.3463 0.0191 0.3463 0.1616 -0.0402 0.3170 -0.0286 -0.4373 0.0027 -0.4324 0.1669 -0.2550 -0.0660 0.2229 0.1603 0.1281 0.1169 -0.1709 0.1232 -0.1062 0.2578
sh_2189_d110 HPGL0656 sh d110 2 #000099 HPGL0656 0.0438 0.2337 0.0438 0.2337 0.1768 0.2006 -0.0477 0.1097 -0.0748 -0.1188 0.1792 0.0704 0.1726 0.0812 0.0152 -0.1374 -0.4228 0.2570 0.0648 -0.6046 -0.1507 0.2460
uninf_d107 HPGL0657 uninf d107 3 #009900 HPGL0657 -0.5332 0.3405 -0.5332 0.3405 0.2612 -0.1415 0.0253 0.2482 0.4239 -0.1506 -0.1733 -0.1889 0.0502 -0.0042 0.0268 0.0729 0.0233 0.0107 0.0734 0.0512 -0.1418 -0.3102
chr_5430_d107 HPGL0658 chr d107 3 #990000 HPGL0658 0.0888 -0.2790 0.0888 -0.2790 0.0219 -0.4932 -0.0447 0.0682 -0.2152 -0.0646 0.1328 -0.0142 -0.0278 0.3939 0.4613 -0.0411 -0.2724 -0.0278 -0.0329 0.0887 -0.1617 -0.2596
chr_5397_d107 HPGL0659 chr d107 3 #990000 HPGL0659 0.1458 -0.1660 0.1458 -0.1660 -0.2160 0.2218 -0.0536 -0.1852 -0.0640 -0.3638 -0.2307 0.0416 0.2074 -0.3316 0.0185 0.1540 -0.1932 0.3014 0.3553 0.2404 -0.1603 -0.2533
chr_2504_d107 HPGL0660 chr d107 3 #990000 HPGL0660 0.0452 0.0279 0.0452 0.0279 -0.3520 -0.0157 0.2438 0.0394 0.1655 0.2774 0.1904 0.2770 -0.2165 0.2101 -0.2928 0.3315 0.0688 0.3642 -0.1306 -0.1197 -0.1217 -0.2772
sh_2272_d107 HPGL0661 sh d107 3 #000099 HPGL0661 0.1430 -0.1872 0.1430 -0.1872 -0.0237 0.2705 -0.2263 0.2575 -0.1274 -0.1547 -0.0948 -0.1911 -0.0572 -0.1445 0.0417 -0.1767 0.3680 -0.0132 -0.5098 -0.2426 -0.1304 -0.3024
sh_1022_d107 HPGL0662 sh d107 3 #000099 HPGL0662 0.0693 0.2363 0.0693 0.2363 0.1657 -0.1846 -0.1315 -0.5824 -0.1662 0.2929 -0.0448 -0.0885 0.2018 -0.0323 -0.3564 -0.2396 -0.0384 -0.1258 -0.1090 0.0013 -0.1637 -0.2615
sh_2189_d107 HPGL0663 sh d107 3 #000099 HPGL0663 0.0438 -0.0066 0.0438 -0.0066 0.1623 0.3958 0.2666 0.1251 -0.1075 0.1826 0.2384 0.2180 -0.1141 -0.0528 0.1003 -0.0582 0.0588 -0.5313 0.3779 0.0194 -0.1312 -0.2366
## NULL

3.2.3 PCA: +uninfected, change the condition to chr/sh

Including the uninfected samples and changing the condition should not much matter

3.2.4 PCA: +uninfected, Change batch to strain and condition to patient+state

sampleid condition batch batch_int colors labels PC1 PC2 pc_1 pc_2 pc_3 pc_4 pc_5 pc_6 pc_7 pc_8 pc_9 pc_10 pc_11 pc_12 pc_13 pc_14 pc_15 pc_16 pc_17 pc_18 pc_19 pc_20
uninf_2_d108 HPGL0630 uninfected_d108 none 1 #1B9E77 HPGL0630 -0.3841 -0.2182 -0.3841 -0.2182 0.0007 0.2726 -0.0219 0.2456 -0.1681 -0.3077 0.0649 0.4805 -0.2586 0.2334 -0.0757 -0.0955 -0.0166 -0.3222 -0.0282 0.1464 0.0324 0.0210
chr_5430_d108 HPGL0631 chronic_d108 s5430 7 #C16610 HPGL0631 0.2235 -0.3225 0.2235 -0.3225 -0.0762 -0.2151 -0.2255 -0.3156 0.0162 0.0864 -0.2572 0.1125 0.0194 0.0816 -0.5002 -0.0079 -0.0280 -0.1393 0.0386 -0.0945 0.4032 -0.2427
chr_5397_d108 HPGL0632 chronic_d108 s5397 6 #C16610 HPGL0632 0.2205 -0.3165 0.2205 -0.3165 -0.1174 -0.2961 0.1794 0.5626 -0.1663 0.2068 -0.1191 -0.0173 0.0970 -0.1288 -0.0079 0.0153 -0.0206 -0.0702 0.0158 -0.0740 0.0150 0.4806
chr_2504_d108 HPGL0633 chronic_d108 s2504 5 #C16610 HPGL0633 0.2179 -0.3007 0.2179 -0.3007 -0.3001 0.0579 -0.2139 -0.0488 -0.0881 -0.0750 0.4891 -0.3073 0.1584 0.1667 0.0635 -0.0376 -0.0237 -0.2160 -0.0420 -0.0681 -0.4174 -0.1995
sh_2272_d108 HPGL0634 self_heal_d108 s2272 4 #8D6B86 HPGL0634 -0.0450 -0.3487 -0.0450 -0.3487 0.0979 -0.2415 0.1311 -0.1613 0.2996 0.0153 0.0398 0.1578 -0.1477 0.2029 0.3831 0.2423 0.3623 0.2486 0.3603 0.0659 -0.0588 -0.0458
sh_1022_d108 HPGL0635 self_heal_d108 s1022 2 #8D6B86 HPGL0635 -0.0614 -0.2824 -0.0614 -0.2824 0.1557 0.1655 0.1407 -0.1847 -0.2394 -0.4093 -0.1553 -0.0730 0.3094 -0.2335 0.1100 0.1521 -0.4615 0.3244 0.0628 0.0335 0.0149 0.0012
sh_2189_d108 HPGL0636 self_heal_d108 s2189 3 #8D6B86 HPGL0636 -0.0613 -0.3120 -0.0613 -0.3120 -0.0465 0.4069 0.0253 -0.0398 0.2516 0.2082 -0.1647 -0.2115 -0.2982 -0.2979 0.0617 -0.2892 0.1728 0.1846 -0.4165 -0.0067 0.0081 -0.0137
uninf_d110 HPGL0650 uninfected_d110 none 1 #BC4399 HPGL0650 -0.4535 -0.0394 -0.4535 -0.0394 0.5695 -0.1304 -0.0218 -0.1041 0.0062 0.3795 0.2247 -0.1752 0.1486 -0.1071 -0.0263 0.0575 -0.0892 -0.3162 -0.0274 -0.1420 0.0102 0.0277
chr_5430_d110 HPGL0651 chronic_d110 s5430 7 #A66753 HPGL0651 0.0834 0.1983 0.0834 0.1983 -0.1821 0.3211 -0.0097 0.1052 -0.1794 0.2381 -0.1225 0.0256 0.0872 0.0912 0.4951 0.2275 -0.0161 -0.1651 0.0517 -0.3138 0.3900 -0.2462
chr_5397_d110 HPGL0652 chronic_d110 s5397 6 #A66753 HPGL0652 0.0847 0.1813 0.0847 0.1813 -0.0191 0.2024 0.4130 -0.3362 0.0905 -0.1528 -0.0234 -0.1905 -0.0387 0.3971 -0.1718 -0.0375 0.0576 -0.1124 0.0147 -0.2890 0.0114 0.4786
chr_2504_d110 HPGL0653 chronic_d110 s2504 5 #A66753 HPGL0653 0.0894 0.1639 0.0894 0.1639 0.2311 -0.0341 -0.1514 0.2722 0.4013 -0.2087 -0.4490 0.0857 0.1883 0.0771 0.0047 -0.0983 -0.0367 -0.1013 -0.0217 -0.2876 -0.4082 -0.1997
sh_2272_d110 HPGL0654 self_heal_d110 s2272 4 #96A713 HPGL0654 -0.1892 0.1684 -0.1892 0.1684 -0.2074 0.0495 0.0507 -0.0700 -0.1665 0.0345 0.0893 0.1768 0.2741 -0.3354 -0.1313 -0.4590 0.3291 0.1415 0.4340 -0.1721 -0.0617 -0.0394
sh_1022_d110 HPGL0655 self_heal_d110 s1022 2 #96A713 HPGL0655 -0.1827 0.1791 -0.1827 0.1791 -0.1501 -0.3352 -0.2049 0.0160 -0.0907 -0.0249 0.0182 -0.1682 -0.5641 0.0572 0.0875 -0.1864 -0.4154 0.2344 0.1339 -0.2508 -0.0110 0.0054
sh_2189_d110 HPGL0656 self_heal_d110 s2189 3 #96A713 HPGL0656 -0.1912 0.1702 -0.1912 0.1702 -0.1765 -0.1090 -0.0531 0.0969 0.0347 -0.1483 0.2263 0.1312 0.0450 -0.1377 -0.2689 0.5281 0.2249 0.2874 -0.4088 -0.2596 0.0071 -0.0089
uninf_d107 HPGL0657 uninfected_d107 none 1 #D59D08 HPGL0657 -0.3103 0.1750 -0.3103 0.1750 -0.4341 -0.2412 0.0680 -0.1218 0.2037 -0.1141 -0.2498 -0.2324 0.1288 -0.1418 0.1228 0.0829 -0.0050 -0.3384 -0.0495 0.4591 0.0357 0.0274
chr_5430_d107 HPGL0658 chronic_d107 s5430 7 #9D7426 HPGL0658 0.2977 0.1540 0.2977 0.1540 0.2422 -0.1182 0.2785 0.2371 0.2034 -0.3435 0.3728 -0.1365 -0.0874 -0.1652 0.0032 -0.1918 0.0290 -0.0680 -0.0099 0.1252 0.4040 -0.2459
chr_5397_d107 HPGL0659 chronic_d107 s5397 6 #9D7426 HPGL0659 0.2994 0.1704 0.2994 0.1704 0.1373 0.1038 -0.5705 -0.2054 0.0895 -0.0816 0.1163 0.2150 -0.0427 -0.2552 0.1800 0.0482 0.0176 -0.0889 0.0289 0.1421 0.0487 0.4783
chr_2504_d107 HPGL0660 chronic_d107 s2504 5 #9D7426 HPGL0660 0.2953 0.1784 0.2953 0.1784 0.0702 -0.0504 0.3703 -0.2173 -0.2801 0.2030 -0.0695 0.2703 -0.3081 -0.2455 -0.0493 0.1541 -0.0647 -0.1622 -0.0743 0.1406 -0.4057 -0.2057
sh_2272_d107 HPGL0661 self_heal_d107 s2272 4 #666666 HPGL0661 0.0174 0.1420 0.0174 0.1420 0.1821 0.2523 -0.1917 0.2403 -0.2352 0.0422 -0.1626 -0.4316 -0.1352 0.1302 -0.2973 0.2389 0.2393 0.1486 0.3140 0.3264 -0.0503 -0.0557
sh_1022_d107 HPGL0662 self_heal_d107 s1022 2 #666666 HPGL0662 0.0204 0.1237 0.0204 0.1237 -0.1337 0.1903 0.0749 0.1074 0.3707 0.4049 0.2096 0.2313 0.1969 0.2165 -0.1736 -0.0177 -0.4311 0.2762 0.0694 0.2892 -0.0040 -0.0015
sh_2189_d107 HPGL0663 self_heal_d107 s2189 3 #666666 HPGL0663 0.0289 0.1357 0.0289 0.1357 0.1564 -0.2510 -0.0675 -0.0784 -0.3536 0.0470 -0.0778 0.0568 0.2277 0.3941 0.1907 -0.3258 0.1763 0.2545 -0.4458 0.2295 0.0363 -0.0155
## NULL

3.2.5 PCA: +uninfected, Repeat but with just chronic/self-state

## The new colors are a character, changing according to condition.

sampleid condition batch batch_int colors labels PC1 PC2 pc_1 pc_2 pc_3 pc_4 pc_5 pc_6 pc_7 pc_8 pc_9 pc_10 pc_11 pc_12 pc_13 pc_14 pc_15 pc_16 pc_17 pc_18 pc_19 pc_20
uninf_2_d108 HPGL0630 uninfected none 1 #008800 HPGL0630 -0.3841 -0.2182 -0.3841 -0.2182 0.0007 0.2726 -0.0219 0.2456 -0.1681 -0.3077 0.0649 0.4805 -0.2586 0.2334 -0.0757 -0.0955 -0.0166 -0.3222 -0.0282 0.1464 0.0324 0.0210
chr_5430_d108 HPGL0631 chronic s5430 7 #880000 HPGL0631 0.2235 -0.3225 0.2235 -0.3225 -0.0762 -0.2151 -0.2255 -0.3156 0.0162 0.0864 -0.2572 0.1125 0.0194 0.0816 -0.5002 -0.0079 -0.0280 -0.1393 0.0386 -0.0945 0.4032 -0.2427
chr_5397_d108 HPGL0632 chronic s5397 6 #880000 HPGL0632 0.2205 -0.3165 0.2205 -0.3165 -0.1174 -0.2961 0.1794 0.5626 -0.1663 0.2068 -0.1191 -0.0173 0.0970 -0.1288 -0.0079 0.0153 -0.0206 -0.0702 0.0158 -0.0740 0.0150 0.4806
chr_2504_d108 HPGL0633 chronic s2504 5 #880000 HPGL0633 0.2179 -0.3007 0.2179 -0.3007 -0.3001 0.0579 -0.2139 -0.0488 -0.0881 -0.0750 0.4891 -0.3073 0.1584 0.1667 0.0635 -0.0376 -0.0237 -0.2160 -0.0420 -0.0681 -0.4174 -0.1995
sh_2272_d108 HPGL0634 self_heal s2272 4 #000088 HPGL0634 -0.0450 -0.3487 -0.0450 -0.3487 0.0979 -0.2415 0.1311 -0.1613 0.2996 0.0153 0.0398 0.1578 -0.1477 0.2029 0.3831 0.2423 0.3623 0.2486 0.3603 0.0659 -0.0588 -0.0458
sh_1022_d108 HPGL0635 self_heal s1022 2 #000088 HPGL0635 -0.0614 -0.2824 -0.0614 -0.2824 0.1557 0.1655 0.1407 -0.1847 -0.2394 -0.4093 -0.1553 -0.0730 0.3094 -0.2335 0.1100 0.1521 -0.4615 0.3244 0.0628 0.0335 0.0149 0.0012
sh_2189_d108 HPGL0636 self_heal s2189 3 #000088 HPGL0636 -0.0613 -0.3120 -0.0613 -0.3120 -0.0465 0.4069 0.0253 -0.0398 0.2516 0.2082 -0.1647 -0.2115 -0.2982 -0.2979 0.0617 -0.2892 0.1728 0.1846 -0.4165 -0.0067 0.0081 -0.0137
uninf_d110 HPGL0650 uninfected none 1 #008800 HPGL0650 -0.4535 -0.0394 -0.4535 -0.0394 0.5695 -0.1304 -0.0218 -0.1041 0.0062 0.3795 0.2247 -0.1752 0.1486 -0.1071 -0.0263 0.0575 -0.0892 -0.3162 -0.0274 -0.1420 0.0102 0.0277
chr_5430_d110 HPGL0651 chronic s5430 7 #880000 HPGL0651 0.0834 0.1983 0.0834 0.1983 -0.1821 0.3211 -0.0097 0.1052 -0.1794 0.2381 -0.1225 0.0256 0.0872 0.0912 0.4951 0.2275 -0.0161 -0.1651 0.0517 -0.3138 0.3900 -0.2462
chr_5397_d110 HPGL0652 chronic s5397 6 #880000 HPGL0652 0.0847 0.1813 0.0847 0.1813 -0.0191 0.2024 0.4130 -0.3362 0.0905 -0.1528 -0.0234 -0.1905 -0.0387 0.3971 -0.1718 -0.0375 0.0576 -0.1124 0.0147 -0.2890 0.0114 0.4786
chr_2504_d110 HPGL0653 chronic s2504 5 #880000 HPGL0653 0.0894 0.1639 0.0894 0.1639 0.2311 -0.0341 -0.1514 0.2722 0.4013 -0.2087 -0.4490 0.0857 0.1883 0.0771 0.0047 -0.0983 -0.0367 -0.1013 -0.0217 -0.2876 -0.4082 -0.1997
sh_2272_d110 HPGL0654 self_heal s2272 4 #000088 HPGL0654 -0.1892 0.1684 -0.1892 0.1684 -0.2074 0.0495 0.0507 -0.0700 -0.1665 0.0345 0.0893 0.1768 0.2741 -0.3354 -0.1313 -0.4590 0.3291 0.1415 0.4340 -0.1721 -0.0617 -0.0394
sh_1022_d110 HPGL0655 self_heal s1022 2 #000088 HPGL0655 -0.1827 0.1791 -0.1827 0.1791 -0.1501 -0.3352 -0.2049 0.0160 -0.0907 -0.0249 0.0182 -0.1682 -0.5641 0.0572 0.0875 -0.1864 -0.4154 0.2344 0.1339 -0.2508 -0.0110 0.0054
sh_2189_d110 HPGL0656 self_heal s2189 3 #000088 HPGL0656 -0.1912 0.1702 -0.1912 0.1702 -0.1765 -0.1090 -0.0531 0.0969 0.0347 -0.1483 0.2263 0.1312 0.0450 -0.1377 -0.2689 0.5281 0.2249 0.2874 -0.4088 -0.2596 0.0071 -0.0089
uninf_d107 HPGL0657 uninfected none 1 #008800 HPGL0657 -0.3103 0.1750 -0.3103 0.1750 -0.4341 -0.2412 0.0680 -0.1218 0.2037 -0.1141 -0.2498 -0.2324 0.1288 -0.1418 0.1228 0.0829 -0.0050 -0.3384 -0.0495 0.4591 0.0357 0.0274
chr_5430_d107 HPGL0658 chronic s5430 7 #880000 HPGL0658 0.2977 0.1540 0.2977 0.1540 0.2422 -0.1182 0.2785 0.2371 0.2034 -0.3435 0.3728 -0.1365 -0.0874 -0.1652 0.0032 -0.1918 0.0290 -0.0680 -0.0099 0.1252 0.4040 -0.2459
chr_5397_d107 HPGL0659 chronic s5397 6 #880000 HPGL0659 0.2994 0.1704 0.2994 0.1704 0.1373 0.1038 -0.5705 -0.2054 0.0895 -0.0816 0.1163 0.2150 -0.0427 -0.2552 0.1800 0.0482 0.0176 -0.0889 0.0289 0.1421 0.0487 0.4783
chr_2504_d107 HPGL0660 chronic s2504 5 #880000 HPGL0660 0.2953 0.1784 0.2953 0.1784 0.0702 -0.0504 0.3703 -0.2173 -0.2801 0.2030 -0.0695 0.2703 -0.3081 -0.2455 -0.0493 0.1541 -0.0647 -0.1622 -0.0743 0.1406 -0.4057 -0.2057
sh_2272_d107 HPGL0661 self_heal s2272 4 #000088 HPGL0661 0.0174 0.1420 0.0174 0.1420 0.1821 0.2523 -0.1917 0.2403 -0.2352 0.0422 -0.1626 -0.4316 -0.1352 0.1302 -0.2973 0.2389 0.2393 0.1486 0.3140 0.3264 -0.0503 -0.0557
sh_1022_d107 HPGL0662 self_heal s1022 2 #000088 HPGL0662 0.0204 0.1237 0.0204 0.1237 -0.1337 0.1903 0.0749 0.1074 0.3707 0.4049 0.2096 0.2313 0.1969 0.2165 -0.1736 -0.0177 -0.4311 0.2762 0.0694 0.2892 -0.0040 -0.0015
sh_2189_d107 HPGL0663 self_heal s2189 3 #000088 HPGL0663 0.0289 0.1357 0.0289 0.1357 0.1564 -0.2510 -0.0675 -0.0784 -0.3536 0.0470 -0.0778 0.0568 0.2277 0.3941 0.1907 -0.3258 0.1763 0.2545 -0.4458 0.2295 0.0363 -0.0155

3.2.6 PCA: Try only using samples for 1 patient

As per a conversation with Maria Adelaida on skype, lets remove all samples except those for one patient, then see if some aspect of the data jumps out (strain:strain variation, for example)

## There were 18, now there are 6 samples.

## There were 18, now there are 6 samples.

## There were 18, now there are 6 samples.

sampleid condition batch batch_int colors labels PC1 PC2 pc_1 pc_2 pc_3 pc_4 pc_5
chr_5430_d110 HPGL0651 chr chronic 1 #990000 HPGL0651 -0.4369 0.2326 -0.4369 0.2326 -0.3199 -0.6968 -0.0216
chr_5397_d110 HPGL0652 chr chronic 1 #990000 HPGL0652 -0.5379 -0.1610 -0.5379 -0.1610 -0.2447 0.6271 0.2550
chr_2504_d110 HPGL0653 chr chronic 1 #990000 HPGL0653 0.2072 -0.8469 0.2072 -0.8469 0.1277 -0.2301 -0.0630
sh_2272_d110 HPGL0654 sh self_heal 2 #000099 HPGL0654 -0.1253 0.2510 -0.1253 0.2510 0.5478 0.1702 -0.6524
sh_1022_d110 HPGL0655 sh self_heal 2 #000099 HPGL0655 0.6234 0.2280 0.6234 0.2280 -0.5630 0.1891 -0.1999
sh_2189_d110 HPGL0656 sh self_heal 2 #000099 HPGL0656 0.2694 0.2963 0.2694 0.2963 0.4521 -0.0595 0.6819

3.2.7 PCA: Re-label one sample

In our previous discussion, Hector suggested that sample ‘HPGL0635’ is sufficiently dis-similar to its cohort samples that it might actually be a member of strain ‘2504’ rather than ‘1022’. Let us look and see what happens if that is changed.

I am going to leave out the uninfected samples to avoid the confusion they generate.

## The new colors are a list, changing according to sampleID.

I may be biased, but I think this suggests that the samples were not switched.

4 Testing out some ideas

One query was to see if there is a reversal of two samples.

## This function will replace the expt$expressionset slot with:
## cpm(hpgl(data))
## It backs up the current data into a slot named:
##  expt$backup_expressionset. It will also save copies of each step along the way
##  in expt$normalized with the corresponding libsizes. Keep the libsizes in mind
##  when invoking limma.  The appropriate libsize is the 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
## Leaving the data in its current base format, keep in mind that
##  some metrics are easier to see when the data is log2 transformed, but
##  EdgeR/DESeq do not accept transformed data.
## Leaving the data unnormalized.  This is necessary for DESeq, but
##  EdgeR/limma might benefit from normalization.  Good choices include quantile,
##  size-factor, tmm, etc.
## 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: hpgl
## Removing 37484 low-count genes (13557 remaining).
## Step 2: not normalizing the data.
## Step 3: converting the data with cpm.
## Step 4: not transforming the data.
## Step 5: not doing batch correction.
##                 chr_5430_d108 chr_5397_d108 chr_2504_d108 sh_2272_d108
## ENSG00000000419        19.929        19.091        16.926       19.812
## ENSG00000000457        25.969        30.204        22.447       29.718
## ENSG00000000460        13.890        11.024         7.846       10.340
## ENSG00000000938       531.151       522.436       385.306      403.883
## ENSG00000000971         4.429         4.929         4.359        4.605
## ENSG00000001036        38.852        37.195        38.792       35.627
##                 sh_1022_d108 sh_2189_d108 chr_5430_d110 chr_5397_d110
## ENSG00000000419       17.835       17.854        16.113        17.212
## ENSG00000000457       23.492       28.000        18.311        20.261
## ENSG00000000460        9.205        8.195         7.263         7.115
## ENSG00000000938      401.960      435.812       618.598       552.883
## ENSG00000000971        4.698        3.415         2.564         1.762
## ENSG00000001036       40.369       44.001        46.021        39.303
##                 chr_2504_d110 sh_2272_d110 sh_1022_d110 sh_2189_d110
## ENSG00000000419        15.027       13.011       12.678       15.247
## ENSG00000000457        20.135       20.096       17.554       18.090
## ENSG00000000460         6.534        4.638        4.632        4.458
## ENSG00000000938       329.412      460.340      477.464      452.119
## ENSG00000000971         3.029        2.834        1.544        2.972
## ENSG00000001036        35.935       37.358       35.596       35.921
##                 chr_5430_d107 chr_5397_d107 chr_2504_d107 sh_2272_d107
## ENSG00000000419        16.314        14.825        13.676       16.461
## ENSG00000000457        27.494        26.042        24.837       28.395
## ENSG00000000460         9.925         8.472         5.738        6.349
## ENSG00000000938       461.239       332.276       280.359      348.559
## ENSG00000000971         4.221         7.844         5.816        6.584
## ENSG00000001036        31.715        23.611        24.758       27.043
##                 sh_1022_d107 sh_2189_d107
## ENSG00000000419       14.623       15.871
## ENSG00000000457       24.614       27.970
## ENSG00000000460        7.448        6.903
## ENSG00000000938      391.470      298.665
## ENSG00000000971        3.724        3.808
## ENSG00000001036       30.518       20.995
## The new colors are a character, changing according to condition.

## The new colors are a character, changing according to condition.

## Going to write the image to: images/varpart_donor_strain.png when dev.off() is called.
## png 
##   2
## Going to write the image to: images/varpart_donor_strain_pct.png when dev.off() is called.
## png 
##   2

5 Try out some limma invocations with interaction models

The experimental design does not fully supprt interaction models, but I want to see how it looks.

6 Switch to the parasite transcriptome data

7 Look during infection

“Changes during infection hpgl0630-0636 and hpgl0650-hpgl0663”

Start out by creating the expt and poking at it to see how well/badly behaved the data is.

## There were 33, now there are 18 samples.
## The new colors are a character, changing according to condition.

7.2 PCA: Parasite edition

In this section, try out some normalizations/batch corrections and see the effect in PCA plots. Start out by taking the parasite data and doing the default normalization and see what there is to see.

sampleid condition batch batch_int colors labels PC1 PC2 pc_1 pc_2 pc_3 pc_4 pc_5 pc_6 pc_7 pc_8 pc_9 pc_10 pc_11 pc_12 pc_13 pc_14 pc_15 pc_16 pc_17
hpgl0631 HPGL0631 chr d108 1 #990000 HPGL0631 -0.4988 -0.1901 -0.4988 -0.1901 -0.0064 0.0376 -0.0270 0.0066 -0.0249 0.0187 -0.0255 0.0540 -0.0409 0.1412 -0.2270 0.0140 0.3058 -0.0560 -0.6948
hpgl0632 HPGL0632 chr d108 1 #990000 HPGL0632 0.1617 -0.1427 0.1617 -0.1427 -0.1279 0.1854 -0.1165 0.3667 -0.0562 0.3161 -0.0581 0.2208 -0.0656 0.3658 0.4669 0.3793 0.1681 -0.1057 0.0678
hpgl0633 HPGL0633 chr d108 1 #990000 HPGL0633 -0.0137 0.2963 -0.0137 0.2963 -0.0825 0.1674 -0.4782 -0.0717 -0.4762 -0.0252 -0.3218 0.1906 0.1184 -0.4267 0.0191 -0.0797 0.0602 -0.1179 0.0139
hpgl0634 HPGL0634 sh d108 1 #000099 HPGL0634 0.1339 -0.2135 0.1339 -0.2135 -0.2966 -0.4126 -0.4828 -0.2225 0.4796 -0.0944 -0.2210 -0.0845 -0.2026 -0.0167 -0.0152 0.0499 -0.0122 0.0013 0.0301
hpgl0635 HPGL0635 sh d108 1 #000099 HPGL0635 -0.0474 0.3478 -0.0474 0.3478 -0.2882 -0.1236 0.2656 0.0570 0.0417 0.0280 -0.1451 0.4057 -0.2101 0.3281 -0.0375 -0.5368 -0.1091 0.0539 0.0692
hpgl0636 HPGL0636 sh d108 1 #000099 HPGL0636 0.1801 -0.1622 0.1801 -0.1622 -0.1440 0.3838 0.2711 -0.7085 0.0264 0.3660 -0.0259 -0.0391 0.0588 -0.0281 0.0124 -0.0133 0.0171 0.0233 -0.0011
hpgl0651 HPGL0651 chr d110 2 #990000 HPGL0651 -0.4560 -0.1643 -0.4560 -0.1643 0.2105 -0.0473 0.0717 -0.0294 0.0431 -0.0160 -0.0130 -0.1494 -0.0762 -0.2137 0.6438 -0.2097 -0.3489 0.0142 0.0234
hpgl0652 HPGL0652 chr d110 2 #990000 HPGL0652 0.2050 -0.0989 0.2050 -0.0989 0.3363 0.1113 0.0531 0.3182 0.2612 0.2745 -0.0344 -0.1501 -0.1421 -0.2589 -0.2094 -0.3550 0.2000 -0.4362 0.0915
hpgl0653 HPGL0653 chr d110 2 #990000 HPGL0653 0.0627 0.3543 0.0627 0.3543 0.5521 0.0533 -0.2612 -0.2053 0.2516 0.0000 0.3272 0.3207 0.0110 0.1618 -0.0545 0.1744 -0.2319 0.0058 -0.1010
hpgl0654 HPGL0654 sh d110 2 #000099 HPGL0654 0.1987 -0.1988 0.1987 -0.1988 0.3134 -0.5740 0.2227 -0.1083 -0.5182 0.0931 -0.1194 0.0257 -0.1863 0.0500 -0.1224 0.1624 -0.0734 -0.0162 0.0089
hpgl0655 HPGL0655 sh d110 2 #000099 HPGL0655 -0.0084 0.3517 -0.0084 0.3517 0.0808 -0.1326 0.3028 0.0820 0.2380 0.0047 -0.1423 -0.0436 0.0308 -0.3256 0.1109 0.2432 0.4524 0.4854 0.0250
hpgl0656 HPGL0656 sh d110 2 #000099 HPGL0656 0.2129 -0.1374 0.2129 -0.1374 0.1926 0.2309 0.1742 0.0179 0.0692 -0.6431 -0.4258 -0.0548 0.2991 0.2420 0.0236 -0.0028 -0.0311 -0.0797 -0.0231
hpgl0658 HPGL0658 chr d107 3 #990000 HPGL0658 -0.5060 -0.1996 -0.5060 -0.1996 0.0107 0.0916 -0.0235 0.0075 -0.0016 -0.0273 0.0410 0.1067 0.0754 0.0763 -0.3712 0.1716 0.0522 0.0430 0.6651
hpgl0659 HPGL0659 chr d107 3 #990000 HPGL0659 0.1391 -0.1387 0.1391 -0.1387 -0.1031 0.1872 -0.0502 0.3643 -0.0050 0.1937 -0.0617 -0.1137 0.0635 -0.1114 -0.2946 0.0328 -0.5453 0.4882 -0.1754
hpgl0660 HPGL0660 chr d107 3 #990000 HPGL0660 -0.0029 0.3053 -0.0029 0.3053 0.0085 0.0369 -0.2121 -0.0316 -0.2139 0.0167 0.1570 -0.7092 -0.0530 0.4061 0.0135 -0.1518 0.1387 0.1127 0.0857
hpgl0661 HPGL0661 sh d107 3 #000099 HPGL0661 0.1403 -0.1908 0.1403 -0.1908 -0.1303 -0.2842 -0.0466 0.0590 -0.0366 0.0017 0.4470 0.1217 0.6781 -0.0431 0.0928 -0.2704 0.1514 0.0509 -0.0078
hpgl0662 HPGL0662 sh d107 3 #000099 HPGL0662 -0.0800 0.3288 -0.0800 0.3288 -0.3487 -0.1228 0.2806 0.0660 0.0692 -0.0410 0.1180 -0.1891 0.1399 -0.1274 -0.0736 0.3821 -0.2903 -0.5260 -0.0766
hpgl0663 HPGL0663 sh d107 3 #000099 HPGL0663 0.1788 -0.1472 0.1788 -0.1472 -0.1774 0.2117 0.0565 0.0322 -0.1474 -0.4662 0.5037 0.0876 -0.4982 -0.2197 0.0224 0.0098 0.0963 0.0589 -0.0007

Now repeat the same thing, but let sva minimize surrogate variables.

Now plot the result and see if things make more sense.

Adding SVA to the normalization does not help much.

Adding SVA to the normalization does not help much.

sampleid condition batch batch_int colors labels PC1 PC2 pc_1 pc_2 pc_3 pc_4 pc_5 pc_6 pc_7 pc_8 pc_9 pc_10 pc_11 pc_12 pc_13 pc_14 pc_15
hpgl0631 HPGL0631 chr d108 1 #990000 HPGL0631 -0.3179 -0.0846 -0.3179 -0.0846 -0.0836 0.0328 0.0257 -0.1570 0.2860 -0.1399 0.1204 -0.0552 0.3017 -0.1674 0.3463 -0.1367 -0.4411
hpgl0632 HPGL0632 chr d108 1 #990000 HPGL0632 0.5265 0.0599 0.5265 0.0599 -0.2399 0.3590 -0.1075 -0.1840 -0.1411 -0.2002 -0.2695 -0.0429 0.0113 -0.1214 0.2697 -0.3226 -0.0794
hpgl0633 HPGL0633 chr d108 1 #990000 HPGL0633 -0.1376 0.0246 -0.1376 0.0246 -0.2251 -0.2237 -0.0894 -0.5093 0.0843 -0.0378 -0.3304 0.0055 -0.1193 0.0358 -0.4772 0.0556 -0.3095
hpgl0634 HPGL0634 sh d108 1 #000099 HPGL0634 -0.1523 0.3362 -0.1523 0.3362 -0.0999 -0.2340 0.1955 -0.0041 -0.5490 -0.0873 0.2669 -0.3866 -0.2066 -0.2890 -0.0407 0.0534 -0.0374
hpgl0635 HPGL0635 sh d108 1 #000099 HPGL0635 -0.1448 -0.0992 -0.1448 -0.0992 0.1080 0.0977 0.3980 -0.0273 0.0458 -0.1457 -0.4301 -0.3388 0.0011 -0.0209 0.2209 0.0758 0.4524
hpgl0636 HPGL0636 sh d108 1 #000099 HPGL0636 -0.1758 -0.1116 -0.1758 -0.1116 -0.4052 -0.0412 0.2564 0.3455 -0.1275 0.0132 -0.0558 0.0306 0.1755 0.6188 -0.1303 -0.2511 -0.0204
hpgl0651 HPGL0651 chr d110 2 #990000 HPGL0651 0.0806 0.0665 0.0806 0.0665 -0.0487 0.0395 -0.4998 0.1414 -0.0459 0.5037 -0.2569 -0.2626 -0.1975 0.1615 0.0659 0.1643 0.0184
hpgl0652 HPGL0652 chr d110 2 #990000 HPGL0652 -0.2465 0.0111 -0.2465 0.0111 0.3079 0.3384 -0.0619 0.0149 0.3719 0.1712 0.2004 -0.3382 -0.1131 -0.0504 -0.2765 -0.3423 0.0738
hpgl0653 HPGL0653 chr d110 2 #990000 HPGL0653 -0.1124 0.0524 -0.1124 0.0524 -0.0345 -0.0894 -0.3728 0.2250 0.1257 -0.4168 0.2450 0.0035 -0.3330 0.2346 0.3488 0.1382 -0.0684
hpgl0654 HPGL0654 sh d110 2 #000099 HPGL0654 -0.2810 0.0921 -0.2810 0.0921 0.5653 -0.0901 -0.0892 0.1039 -0.2779 -0.0693 -0.4000 0.4401 0.0094 -0.0217 0.0733 -0.0985 -0.0979
hpgl0655 HPGL0655 sh d110 2 #000099 HPGL0655 0.2511 0.0681 0.2511 0.0681 0.1537 0.1824 -0.0772 0.4218 -0.1247 -0.1195 0.0515 -0.1021 0.4756 -0.1580 -0.3570 0.1455 -0.2362
hpgl0656 HPGL0656 sh d110 2 #000099 HPGL0656 0.0701 -0.4988 0.0701 -0.4988 -0.2219 -0.3380 -0.0043 0.3521 0.2001 0.0471 -0.0971 0.1195 -0.1373 -0.5148 -0.0655 0.0266 0.0976
hpgl0658 HPGL0658 chr d107 3 #990000 HPGL0658 0.0630 0.0351 0.0630 0.0351 -0.0505 0.1932 -0.1128 -0.1141 0.0254 -0.3902 0.1871 0.3192 -0.1703 0.0159 -0.3628 -0.0446 0.4248
hpgl0659 HPGL0659 chr d107 3 #990000 HPGL0659 -0.1255 0.2471 -0.1255 0.2471 -0.2033 0.3662 0.2109 -0.0245 0.1621 0.1854 0.0258 0.2810 0.0593 -0.0614 0.0763 0.6397 0.0144
hpgl0660 HPGL0660 chr d107 3 #990000 HPGL0660 -0.1392 0.0171 -0.1392 0.0171 -0.1361 -0.1325 -0.2563 -0.2339 -0.1959 0.3400 0.2602 0.2042 0.4075 -0.1063 0.1623 -0.2070 0.3940
hpgl0661 HPGL0661 sh d107 3 #000099 HPGL0661 0.4089 0.3793 0.4089 0.3793 0.2082 -0.5295 0.1342 -0.0593 0.4057 -0.0113 0.0340 -0.0522 0.1953 0.1763 0.0409 0.0254 0.1191
hpgl0662 HPGL0662 sh d107 3 #000099 HPGL0662 0.2387 0.0189 0.2387 0.0189 0.1025 0.0702 0.4104 0.0338 -0.0164 0.3599 0.2022 0.2968 -0.4165 0.0067 0.0818 -0.2347 -0.2393
hpgl0663 HPGL0663 sh d107 3 #000099 HPGL0663 0.1941 -0.6142 0.1941 -0.6142 0.3032 -0.0011 0.0398 -0.3247 -0.2287 -0.0024 0.2465 -0.1215 0.0568 0.2616 0.0239 0.3129 -0.0646

No, not really, so lets change things by putting the ‘snp status’ as the “batch” factor and minimize it with sva/combat.

SNP status does not clarify things.

SNP status does not clarify things.

sampleid condition batch batch_int colors labels PC1 PC2 pc_1 pc_2 pc_3 pc_4 pc_5 pc_6 pc_7 pc_8 pc_9 pc_10 pc_11 pc_12 pc_13 pc_14 pc_15
hpgl0631 HPGL0631 chronic red 4 #1B9E77 HPGL0631 -0.1395 -0.1220 -0.1395 -0.1220 0.1357 -0.0522 0.0344 -0.0634 0.0253 -0.0392 0.0482 -0.1507 0.2266 -0.0236 -0.2938 0.0815 -0.6928
hpgl0632 HPGL0632 chronic yellow 6 #1B9E77 HPGL0632 0.1142 -0.1984 0.1142 -0.1984 0.1495 -0.3338 0.0087 -0.2358 0.0599 -0.2381 0.0539 -0.3559 -0.4841 -0.3610 -0.1776 0.1132 0.0709
hpgl0633 HPGL0633 chronic blue_chronic 1 #1B9E77 HPGL0633 0.0248 -0.2112 0.0248 -0.2112 0.4365 0.1317 0.4655 0.0808 0.3261 -0.2111 -0.1123 0.4273 -0.0137 0.0868 -0.0549 0.1180 0.0156
hpgl0634 HPGL0634 self_heal white 5 #7570B3 HPGL0634 0.3676 0.3423 0.3676 0.3423 0.4475 0.3618 -0.4610 0.0859 0.2162 0.0869 0.1976 0.0149 0.0102 -0.0491 0.0102 -0.0008 0.0297
hpgl0635 HPGL0635 self_heal blue_self 2 #7570B3 HPGL0635 0.2924 0.0601 0.2924 0.0601 -0.1895 -0.1343 -0.0415 -0.0704 0.1394 -0.3857 0.2252 -0.3435 0.0660 0.5294 0.1124 -0.0590 0.0702
hpgl0636 HPGL0636 self_heal pink 3 #7570B3 HPGL0636 0.1557 -0.3354 0.1557 -0.3354 -0.4255 0.6296 0.0664 -0.4271 0.0214 0.0355 -0.0632 0.0278 -0.0152 0.0111 -0.0211 -0.0238 -0.0008
hpgl0651 HPGL0651 chronic red 4 #1B9E77 HPGL0651 -0.3139 0.0176 -0.3139 0.0176 0.0187 -0.0211 -0.0280 -0.0395 0.0082 0.1641 0.0810 0.1973 -0.6366 0.2469 0.3594 -0.0336 0.0175
hpgl0652 HPGL0652 chronic yellow 6 #1B9E77 HPGL0652 -0.2900 -0.0118 -0.2900 -0.0118 -0.0816 -0.2657 -0.2973 -0.2123 0.0398 0.1315 0.1350 0.2702 0.2234 0.3476 -0.1908 0.4366 0.0969
hpgl0653 HPGL0653 chronic blue_chronic 1 #1B9E77 HPGL0653 -0.5195 0.0640 -0.5195 0.0640 0.1163 0.3100 -0.2383 0.0264 -0.3294 -0.3284 -0.0046 -0.1568 0.0508 -0.1813 0.2221 -0.0147 -0.1010
hpgl0654 HPGL0654 self_heal white 5 #7570B3 HPGL0654 -0.1430 0.6666 -0.1430 0.6666 -0.2041 0.0020 0.5317 -0.0966 0.1213 -0.0223 0.1829 -0.0492 0.1094 -0.1679 0.0694 0.0102 0.0087
hpgl0655 HPGL0655 self_heal blue_self 2 #7570B3 HPGL0655 -0.0419 0.1557 -0.0419 0.1557 -0.2727 -0.1230 -0.2414 -0.0328 0.1458 0.0487 -0.0304 0.3272 -0.1210 -0.2394 -0.4676 -0.4566 0.0244
hpgl0656 HPGL0656 self_heal pink 3 #7570B3 HPGL0656 -0.1341 -0.1172 -0.1341 -0.1172 -0.3094 0.0388 -0.0832 0.6581 0.4207 0.0493 -0.3034 -0.2386 -0.0239 0.0066 0.0343 0.0785 -0.0208
hpgl0658 HPGL0658 chronic red 4 #1B9E77 HPGL0658 -0.1648 -0.1692 -0.1648 -0.1692 0.1224 -0.0469 0.0109 -0.0189 -0.0410 -0.0883 -0.0650 -0.0824 0.3618 -0.1897 -0.0314 -0.0389 0.6639
hpgl0659 HPGL0659 chronic yellow 6 #1B9E77 HPGL0659 0.0892 -0.1941 0.0892 -0.1941 0.0815 -0.3313 -0.0412 -0.1308 0.0672 0.0932 -0.0688 0.1174 0.2907 -0.0499 0.5086 -0.5180 -0.1842
hpgl0660 HPGL0660 chronic blue_chronic 1 #1B9E77 HPGL0660 -0.0338 -0.0564 -0.0338 -0.0564 0.2104 0.0482 0.2098 -0.0033 -0.1504 0.7054 0.0278 -0.3999 -0.0022 0.1498 -0.1534 -0.1108 0.0849
hpgl0661 HPGL0661 self_heal white 5 #7570B3 HPGL0661 0.2033 0.2665 0.2033 0.2665 0.0700 -0.0564 0.0292 0.0140 -0.4537 -0.1409 -0.6741 0.0518 -0.0736 0.2742 -0.1535 -0.0442 -0.0067
hpgl0662 HPGL0662 self_heal blue_self 2 #7570B3 HPGL0662 0.3358 0.0401 0.3358 0.0401 -0.1818 -0.1479 -0.0625 -0.0142 -0.1149 0.2085 -0.1347 0.1259 0.0553 -0.3772 0.3302 0.5183 -0.0775
hpgl0663 HPGL0663 self_heal pink 3 #7570B3 HPGL0663 0.1974 -0.1972 0.1974 -0.1972 -0.1239 -0.0093 0.1377 0.4800 -0.5018 -0.0691 0.5050 0.2171 -0.0240 -0.0132 -0.1024 -0.0557 0.0012

Ok, so let us remove the healing state with combat and see if that allows us to see a split on some other factor.

hmm ok, I think I quit for today.

hmm ok, I think I quit for today.

hmm ok, I think I quit for today.

hmm ok, I think I quit for today.

sampleid condition batch batch_int colors labels PC1 PC2 pc_1 pc_2 pc_3 pc_4 pc_5 pc_6 pc_7 pc_8 pc_9 pc_10 pc_11 pc_12 pc_13 pc_14 pc_15 pc_16 pc_17
hpgl0631 HPGL0631 s5430 chronic 1 #1B9E77 HPGL0631 -0.4266 0.2780 -0.4266 0.2780 0.0562 -0.0485 -0.0088 0.0203 0.0087 0.0285 -0.0489 -0.0541 0.1275 0.2245 -0.0364 0.3025 -0.0500 0.7004 -0.1430
hpgl0632 HPGL0632 s5397 chronic 1 #D95F02 HPGL0632 -0.1580 -0.3384 -0.1580 -0.3384 0.2618 0.1140 0.2533 -0.0399 -0.0929 0.0609 -0.2887 -0.0698 0.3312 -0.5019 -0.3381 0.2178 -0.0972 -0.0661 0.1409
hpgl0633 HPGL0633 s2504 chronic 1 #7570B3 HPGL0633 -0.0378 -0.0036 -0.0378 -0.0036 0.1358 0.2085 -0.2992 0.4270 0.2949 0.3293 -0.2469 0.1535 -0.4229 -0.0172 0.0835 0.0716 -0.1089 -0.0153 0.3550
hpgl0634 HPGL0634 s2272 self_heal 2 #E7298A HPGL0634 0.1090 -0.0865 0.1090 -0.0865 0.1256 0.4916 -0.4771 -0.4268 -0.0493 0.2309 0.1420 -0.2169 -0.0210 0.0103 -0.0617 -0.0276 -0.0052 -0.0283 -0.3591
hpgl0635 HPGL0635 s1022 self_heal 2 #66A61E HPGL0635 0.2916 0.3432 0.2916 0.3432 0.1157 0.0891 0.2035 -0.0311 -0.0975 0.1520 -0.3508 -0.2644 0.3438 0.0974 0.5351 -0.1198 0.0530 -0.0722 0.1264
hpgl0636 HPGL0636 s2189 self_heal 2 #E6AB02 HPGL0636 0.1751 -0.1096 0.1751 -0.1096 0.2796 -0.4740 -0.3429 0.2876 -0.6142 0.0232 0.0510 0.0547 -0.0162 -0.0103 0.0164 -0.0062 0.0171 0.0042 -0.1190
hpgl0651 HPGL0651 s5430 chronic 1 #1B9E77 HPGL0651 -0.4043 0.2412 -0.4043 0.2412 -0.1834 -0.1037 0.0201 -0.0180 -0.0288 0.0208 0.1621 -0.0625 -0.2026 -0.6170 0.2621 -0.3683 0.0126 -0.0271 -0.1390
hpgl0652 HPGL0652 s5397 chronic 1 #D95F02 HPGL0652 -0.1295 -0.3764 -0.1295 -0.3764 -0.2054 -0.0997 0.2424 -0.3014 -0.2002 0.0415 0.0867 -0.0866 -0.3081 0.2342 0.3296 0.2267 -0.4363 -0.0898 0.1388
hpgl0653 HPGL0653 s2504 chronic 1 #7570B3 HPGL0653 0.0055 -0.0715 0.0055 -0.0715 -0.5078 -0.0757 -0.4237 -0.1721 -0.0304 -0.3412 -0.3190 -0.0264 0.1744 0.0421 -0.1612 -0.2199 0.0099 0.0935 0.3625
hpgl0654 HPGL0654 s2272 self_heal 2 #E7298A HPGL0654 0.1340 -0.1603 0.1340 -0.1603 -0.5045 0.1993 0.2415 0.5395 -0.0583 0.1384 0.0177 -0.2088 0.0558 0.1144 -0.1900 -0.0849 -0.0150 -0.0072 -0.3617
hpgl0655 HPGL0655 s1022 self_heal 2 #66A61E HPGL0655 0.3060 0.2918 0.3060 0.2918 -0.2283 -0.0927 0.1699 -0.2325 -0.1063 0.1308 0.0227 0.0571 -0.3313 -0.1444 -0.2256 0.4217 0.4668 -0.0174 0.1105
hpgl0656 HPGL0656 s2189 self_heal 2 #E6AB02 HPGL0656 0.1928 -0.1450 0.1928 -0.1450 -0.0807 -0.4700 -0.0267 -0.1597 0.5037 0.4076 0.1325 0.2671 0.3062 -0.0170 0.0091 -0.0697 -0.0849 0.0286 -0.1298
hpgl0658 HPGL0658 s5430 chronic 1 #1B9E77 HPGL0658 -0.4317 0.2803 -0.4317 0.2803 0.0640 -0.1127 -0.0312 -0.0073 0.0530 -0.0430 -0.1055 0.0557 0.0791 0.3505 -0.2089 0.0711 0.0376 -0.6645 -0.1482
hpgl0659 HPGL0659 s5397 chronic 1 #D95F02 HPGL0659 -0.1645 -0.3141 -0.1645 -0.3141 0.2334 0.0640 0.2723 -0.0967 -0.0372 0.0587 0.0536 0.1040 -0.1283 0.2931 -0.0670 -0.4955 0.5094 0.1539 0.1504
hpgl0660 HPGL0660 s2504 chronic 1 #7570B3 HPGL0660 -0.0336 -0.0085 -0.0336 -0.0085 -0.0107 0.2061 -0.0851 0.2025 0.0383 -0.1785 0.6794 0.0301 0.3469 -0.0133 0.1663 0.2185 0.1326 -0.0920 0.3669
hpgl0661 HPGL0661 s2272 self_heal 2 #E7298A HPGL0661 0.1228 -0.0884 0.1228 -0.0884 0.0178 0.2297 0.0632 0.0022 0.0404 -0.4436 -0.1933 0.6357 -0.0139 -0.0664 0.2718 0.1159 0.0359 0.0153 -0.3622
hpgl0662 HPGL0662 s1022 self_heal 2 #66A61E HPGL0662 0.2723 0.3717 0.2723 0.3717 0.1716 0.0977 0.2157 -0.0595 -0.0638 -0.1278 0.2015 0.1561 -0.0951 0.0462 -0.3833 -0.3160 -0.5246 0.0779 0.1362
hpgl0663 HPGL0663 s2189 self_heal 2 #E6AB02 HPGL0663 0.1770 -0.1041 0.1770 -0.1041 0.2593 -0.2229 0.0127 0.0660 0.4399 -0.4887 0.0040 -0.5245 -0.2257 -0.0253 -0.0017 0.0620 0.0470 0.0060 -0.1257
LS0tCnRpdGxlOiAiTC4gcGFuYW1lbnNpcyAyMDE4MDgyMjogU2FtcGxlIEVzdGlhdGlvbiBvZiBJbmZlY3RlZCBQQk1Dcy4iCmF1dGhvcjogImF0YiBhYmVsZXdAZ21haWwuY29tIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogICAgdGhlbWU6IHJlYWRhYmxlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBkZl9wcmludDogcGFnZWQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIHdpZHRoOiAzMDAKICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKICBCaW9jU3R5bGU6Omh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5LCB0ZCB7CiAgZm9udC1zaXplOiAxNnB4Owp9CmNvZGUucnsKICBmb250LXNpemU6IDE2cHg7Cn0KcHJlIHsKIGZvbnQtc2l6ZTogMTZweAp9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KCJocGdsdG9vbHMiKQp0dCA8LSBkZXZ0b29sczo6bG9hZF9hbGwoIn4vaHBnbHRvb2xzIikKa25pdHI6Om9wdHNfa25pdCRzZXQod2lkdGg9MTIwLAogICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcz1UUlVFLAogICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIGVjaG89VFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVycm9yPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzPTQsCiAgICAgICAgICAgICAgICAgICAgICAgbWF4LnByaW50PTEyMCwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgIGtuaXRyLmR1cGxpY2F0ZS5sYWJlbD0iYWxsb3ciKQpnZ3Bsb3QyOjp0aGVtZV9zZXQoZ2dwbG90Mjo6dGhlbWVfYncoYmFzZV9zaXplPTEwKSkKcHJldmlvdXNfZmlsZSA8LSAiMDFfYW5ub3RhdGlvbl8yMDE4MDgyMi5SbWQiCnZlciA8LSAiMjAxODA4MjIiCgp0bXAgPC0gbG9hZG1lKGZpbGVuYW1lPXBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cHJldmlvdXNfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKSkKcm1kX2ZpbGUgPC0gIjAyX2VzdGltYXRpb25faW5mZWN0aW9uXzIwMTgwODIyLlJtZCIKYGBgCgojIFNhbXBsZSBFc3RpbWF0aW9uLCBQQk1DIEluZmVjdGlvbnM6IGByIHZlcmAKClN0YXJ0IG91dCBieSBleHRyYWN0aW5nIHRoZSByZWxldmFudCBkYXRhIGFuZCBxdWVyeWluZyBpdCB0byBzZWUgdGhlIGdlbmVyYWwgcXVhbGl0eS4KClRoaXMgZmlyc3QgYmxvY2sgc2V0cyB0aGUgbmFtZXMgb2YgdGhlIHNhbXBsZXMgYW5kIGNvbG9ycy4KSXQgYWxzbyBtYWtlcyBzZXBhcmF0ZSBkYXRhIHNldHMgZm9yOgoKKiBBbGwgZmVhdHVyZXMgd2l0aCBpbmZlY3RlZCBhbmQgdW5pbmZlY3RlZCBzYW1wbGVzLgoqIEFsbCBmZWF0dXJlcyB3aXRoIG9ubHkgdGhlIGluZmVjdGVkIHNhbXBsZXMuCiogT25seSBDRFMgZmVhdHVyZXMgd2l0aCBpbmZlY3RlZCBhbmQgdW5pbmZlY3RlZCBzYW1wbGVzLgoqIE9ubHkgQ0RTIGZlYXR1cmVzIHdpdGggb25seSB0aGUgaW5mZWN0ZWQgc2FtcGxlcy4KCmBgYHtyIGluZmVjdGlvbl9leHB0fQojIyBSZXJlYWQgdGhlIHNhbXBsZSBzaGVldCBiZWNhdXNlIEkgYW0gZmlkZGxpbmcgd2l0aCBvdGhlciBwb3NzaWJsZSBzdXJyb2dhdGVzIChsaWtlIHN0cmFpbikKIyMgSW4gZmFjdCwgY29weSBpdCB0byBhIHNlcGFyYXRlIHNoZWV0IGJlY2F1c2UgdGhlc2Ugc2FtcGxlcyBhcmUgYSBtZXNzCmhzX2luZmVjdGlvbiA8LSBzdWJzZXRfZXhwdChoc19leHB0LCBzdWJzZXQ9ImV4cGVyaW1lbnRuYW1lPT0naW5mZWN0aW9uJyIpCmNob3Nlbl9jb2xvcnMgPC0gYygiIzAwOTkwMCIsIiM5OTAwMDAiLCAiIzAwMDA5OSIpCm5hbWVzKGNob3Nlbl9jb2xvcnMpIDwtIGMoInVuaW5mIiwiY2hyIiwic2giKQpoc191bmluZiA8LSBzZXRfZXhwdF9jb2xvcnMoaHNfaW5mZWN0aW9uLCBjb2xvcnM9Y2hvc2VuX2NvbG9ycykKaHNfaW5mIDwtIHN1YnNldF9leHB0KGhzX3VuaW5mLCBzdWJzZXQ9ImNvbmRpdGlvbiE9J3VuaW5mJyIpCnVuaW5mX25ld25hbWVzIDwtIHBhc3RlMChwRGF0YShoc191bmluZikkbGFiZWwsICJfIiwgcERhdGEoaHNfdW5pbmYpJGRvbm9yKQpoc191bmluZiA8LSBzZXRfZXhwdF9zYW1wbGVuYW1lcyhoc191bmluZiwgbmV3bmFtZXM9dW5pbmZfbmV3bmFtZXMpCmluZl9uZXduYW1lcyA8LSBwYXN0ZTAocERhdGEoaHNfaW5mKSRsYWJlbCwgIl8iLCBwRGF0YShoc19pbmYpJGRvbm9yKQpoc19pbmYgPC0gc2V0X2V4cHRfc2FtcGxlbmFtZXMoaHNfaW5mLCBuZXduYW1lcz1pbmZfbmV3bmFtZXMpCgpoc19jZHNfaW5mZWN0aW9uIDwtIHN1YnNldF9leHB0KGhzX2Nkc19leHB0LCBzdWJzZXQ9ImV4cGVyaW1lbnRuYW1lPT0naW5mZWN0aW9uJyIpCmhzX2Nkc191bmluZiA8LSBzZXRfZXhwdF9jb2xvcnMoaHNfY2RzX2luZmVjdGlvbiwgY29sb3JzPWNob3Nlbl9jb2xvcnMpCmhzX2Nkc19pbmYgPC0gc3Vic2V0X2V4cHQoaHNfY2RzX3VuaW5mLCBzdWJzZXQ9ImNvbmRpdGlvbiE9J3VuaW5mJyIpCmhzX2Nkc191bmluZiA8LSBzZXRfZXhwdF9zYW1wbGVuYW1lcyhoc19jZHNfdW5pbmYsIG5ld25hbWVzPXVuaW5mX25ld25hbWVzKQpoc19jZHNfaW5mIDwtIHNldF9leHB0X3NhbXBsZW5hbWVzKGhzX2Nkc19pbmYsIG5ld25hbWVzPWluZl9uZXduYW1lcykKIyNpbmZlY3Rpb25fbW9kZWxfdGVzdCA8LSBtb2RlbF90ZXN0KGluZmVjdGlvbl9odW1hbiRkZXNpZ24pCmBgYAoKIyMgR2VuZXJhdGUgcGxvdHMgZGVzY3JpYmluZyB0aGUgZGF0YQoKVGhlIGZvbGxvd2luZyBjcmVhdGVzIG1ldHJpYyBwbG90cyBvZiB0aGUgcmF3IGRhdGEuCgpgYGB7ciBwYm1jX3Bsb3RzLCBmaWcuc2hvdz0iaGlkZSJ9CmhzX3VuaW5mX21ldCA8LSBzbShncmFwaF9tZXRyaWNzKGhzX3VuaW5mKSkKaHNfaW5mX21ldCA8LSBzbShncmFwaF9tZXRyaWNzKGhzX2luZikpCmhzX2Nkc191bmluZl9tZXQgPC0gc20oZ3JhcGhfbWV0cmljcyhoc19jZHNfdW5pbmYpKQpoc19jZHNfaW5mX21ldCA8LSBzbShncmFwaF9tZXRyaWNzKGhzX2Nkc19pbmYpKQpgYGAKCk5vdyBsZXQgdXMgdmlzdWFsaXplIHNvbWUgb2YgdGhlc2UgbWV0cmljcyBmb3IgdGhlIGRhdGEgc2V0IG9mIGFsbCBmZWF0dXJlcwppbmNsdWRpbmcgdGhlIHVuaW5mZWN0ZWQgc2FtcGxlcy4KClN0YXJ0IHdpdGggdGhlIHJlbGF0aXZlIGxpYnJhcnkgc2l6ZXMuICBOb3RlIHRoYXQgdGhpcyBpbmNsdWRlcyBhbGwgZmVhdHVyZSB0eXBlcy4KCmBgYHtyIHBibWNfbGlic2l6ZV9hbGx9CmhzX3VuaW5mX21ldCRsaWJzaXplCmBgYAoKVGhlIHBpY3R1cmUgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IGlmIHdlIG9ubHkgbG9vayBhdCBjb2Rpbmcgc2VxdWVuY2VzLgoKYGBge3IgcGJtY19saWJzaXplX2Nkc30KaHNfY2RzX3VuaW5mX21ldCRsaWJzaXplCmBgYAoKTG9vayBhdCB0aGUgZGVuc2l0eSBvZiBjb3VudHMgLyBmZWF0dXJlIGZvciBhbGwgc2FtcGxlcy4KVXNlIGRlbnNpdHkgcGxvdHMgYW5kIGJveHBsb3RzIHRvIHZpZXcgdGhpcyBpbmZvcm1hdGlvbi4KCmBgYHtyIHBibWNfZGVuc2l0eV9hbGx9CmhzX3VuaW5mX21ldCRkZW5zaXR5CmhzX3VuaW5mX21ldCRib3hwbG90CiMjIFdvdyB0aGVyZSBpcyBhIHByZXR0eSBiaWcgcmFuZ2UgaW4gY291bnRzIG9ic2VydmVkIGluIHRoaXMgZGF0YSEhCmBgYAoKYGBge3IgcGJtY19kZW5zaXR5X2Nkc30KaHNfY2RzX3VuaW5mX21ldCRkZW5zaXR5CmhzX2Nkc191bmluZl9tZXQkYm94cGxvdApgYGAKCk5vdyBsZXQgdXMgbG9vayBhdCBob3cgdGhlIHNhbXBsZXMgcmVsYXRlIHRvIGVhY2ggb3RoZXIgdmlhIHBhaXJ3aXNlIGNvcnJlbGF0aW9uIGhlYXRtYXBzLgpPbmNlIGFnYWluLCBzaG93IHRoaXMgZmlyc3QgZm9yIGFsbCBmZWF0dXJlcywgdGhlbiBvbmx5IGNkcyBmZWF0dXJlcy4KCmBgYHtyIHBibWNfY29yaGVhdF9hbGx9CmhzX3VuaW5mX21ldCRjb3JoZWF0CmhzX2Nkc191bmluZl9tZXQkY29yaGVhdApgYGAKCiMgV3JpdGUgdGhlIGV4cGVyaW1lbnRzCgpIYXZpbmcgbG9va2VkIGF0IHRoZXNlIG1ldHJpY3MsIG5vdyBsZXQgdXMgd3JpdGUgb3V0IHRoZSByZXN1bHRzIGluIDQgZXhjZWwgd29ya2Jvb2tzLApyZXByZXNlbnRpbmcgdGhlIHNhbWUgNCBkYXRhIHNldHMuCgpgYGB7ciB3cml0ZV9wYm1jX2V4Y2VsLCBmaWcuc2hvdz0iaGlkZSJ9CmhzX3VuaW5mX2RhdGEgPC0gc20od3JpdGVfZXhwdCgKICBoc191bmluZiwgbm9ybT0icXVhbnQiLCB2aW9saW49RkFMU0UsIGNvbnZlcnQ9ImNwbSIsCiAgdHJhbnNmb3JtPSJsb2cyIiwgYmF0Y2g9InBjYSIsIGZpbHRlcj1UUlVFLAogIGV4Y2VsPXBhc3RlMCgiZXhjZWwvaHNfZGF0YS1pbmZlY3Rpb25fd2l0aF91bmluZmVjdGVkLXYiLCB2ZXIsICIueGxzeCIpKSkKaHNfaW5mX2RhdGEgPC0gc20od3JpdGVfZXhwdCgKICBoc19pbmYsIG5vcm09InF1YW50IiwgdmlvbGluPUZBTFNFLCBjb252ZXJ0PSJjcG0iLAogIHRyYW5zZm9ybT0ibG9nMiIsIGJhdGNoPSJwY2EiLCBmaWx0ZXI9VFJVRSwKICBleGNlbD1wYXN0ZTAoImV4Y2VsL2hzX2RhdGEtaW5mZWN0aW9uX25vX3VuaW5mZWN0ZWQtdiIsIHZlciwgIi54bHN4IikpKQoKaHNfY2RzX3VuaW5mX2RhdGEgPC0gc20oCiAgd3JpdGVfZXhwdChoc19jZHNfdW5pbmYsIG5vcm09InF1YW50IiwgdmlvbGluPUZBTFNFLCBjb252ZXJ0PSJjcG0iLAogICAgICAgICAgICAgdHJhbnNmb3JtPSJsb2cyIiwgYmF0Y2g9InBjYSIsIGZpbHRlcj1UUlVFLAogICAgICAgICAgICAgZXhjZWw9cGFzdGUwKCJleGNlbC9oc19jZHNfZGF0YS1pbmZlY3Rpb25fd2l0aF91bmluZmVjdGVkLXYiLCB2ZXIsICIueGxzeCIpKSkKaHNfY2RzX2luZl9kYXRhIDwtIHNtKAogIHdyaXRlX2V4cHQoaHNfY2RzX2luZiwgbm9ybT0icXVhbnQiLCB2aW9saW49RkFMU0UsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICB0cmFuc2Zvcm09ImxvZzIiLCBiYXRjaD0icGNhIiwgZmlsdGVyPVRSVUUsCiAgICAgICAgICAgICBleGNlbD1wYXN0ZTAoImV4Y2VsL2hzX2Nkc19kYXRhLWluZmVjdGlvbl9ub191bmluZmVjdGVkLXYiLCB2ZXIsICIueGxzeCIpKSkKYGBgCgojIyMgRGVmYXVsdCBub3JtYWxpemF0aW9uCgpOb3cgcGVyZm9ybSB0aGUgJ2RlZmF1bHQnIG5vcm1hbGl6YXRpb24gd2UgdXNlIGluIHRoZSBsYWIgYW5kIGxvb2sgYWdhaW4uCgpgYGB7ciBub3JtYWxpemVfaW5mZWN0aW9uLCBmaWcuc2hvdz0iaGlkZSJ9CmhzX3VuaW5mX2NxZiA8LSBzbShub3JtYWxpemVfZXhwdChoc191bmluZiwgY29udmVydD0iY3BtIiwgZmlsdGVyPVRSVUUsIG5vcm09InF1YW50IikpCmhzX3VuaW5mX21ldCA8LSBzbShncmFwaF9tZXRyaWNzKGhzX3VuaW5mKSkKaHNfaW5mX2NxZiA8LSBzbShub3JtYWxpemVfZXhwdChoc19pbmYsIGNvbnZlcnQ9ImNwbSIsIGZpbHRlcj1UUlVFLCBub3JtPSJxdWFudCIpKQpoc19pbmZfY3FmX21ldCA8LSBzbShncmFwaF9tZXRyaWNzKGhzX2luZikpCmBgYAoKIyBGaWd1cmUgNAoKQ29uc3RydWN0IGZpZ3VyZSA0LCB0aGlzIHNob3VsZCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgcGFuZWxzOgoKICBhLiAgTGlicmFyeSBzaXplcyBvZiBwYm1jIGRhdGEKICBiLiAgUENBIG9mIGxvZzIocXVhbnQoZGF0YSkpLCB3aXRoIHVuaW5mZWN0ZWQKICBjLiAgUENBIG9mIGxvZzIocXVhbnQoZGF0YSkpLCB3aXRob3V0IHVuaW5mZWN0ZWQKICBkLiAgVFNORSBvZiBiCiAgZS4gIFRTTkUgb2YgYwoKYGBge3IgZmlndXJlXzA0fQpwcChmaWxlPSJpbWFnZXMvZmlndXJlXzRhLnBkZiIpCmhzX3VuaW5mX2RhdGEkcmF3X2xpYnNpemUKZGV2Lm9mZigpCnBwKGZpbGU9ImltYWdlcy9maWd1cmVfNGIucGRmIikKaHNfdW5pbmZfZGF0YSRyYXdfc2NhbGVkX3BjYQpkZXYub2ZmKCkKd3JpdGUuY3N2KGhzX3VuaW5mX2RhdGEkcmF3X3NjYWxlZF9wY2FfdGFibGUsIGZpbGU9ImltYWdlcy9maWd1cmVfNGIuY3N2IikKcHAoZmlsZT0iaW1hZ2VzL2ZpZ3VyZV80Yy5wZGYiKQpoc19pbmZfZGF0YSRyYXdfc2NhbGVkX3BjYQpkZXYub2ZmKCkKd3JpdGUuY3N2KGhzX2luZl9kYXRhJHJhd19zY2FsZWRfcGNhX3RhYmxlLCBmaWxlPSJpbWFnZXMvZmlndXJlXzRjLmNzdiIpCnBwKGZpbGU9ImltYWdlcy9maWd1cmVfNGQucGRmIikKaHNfdW5pbmZfZGF0YSRyYXdfdHNuZQpkZXYub2ZmKCkKcHAoZmlsZT0iaW1hZ2VzL2ZpZ3VyZV80ZS5wZGYiKQpoc19pbmZfZGF0YSRyYXdfdHNuZQpkZXYub2ZmKCkKCnBwKGZpbGU9ImltYWdlcy9maWd1cmVfNGFfY2RzLnBkZiIpCmhzX2Nkc191bmluZl9kYXRhJHJhd19saWJzaXplCmRldi5vZmYoKQpwcChmaWxlPSJpbWFnZXMvZmlndXJlXzRiX2Nkcy5wZGYiKQpoc19jZHNfdW5pbmZfZGF0YSRyYXdfc2NhbGVkX3BjYQpkZXYub2ZmKCkKd3JpdGUuY3N2KGhzX2Nkc191bmluZl9kYXRhJHJhd19zY2FsZWRfcGNhX3RhYmxlLCBmaWxlPSJpbWFnZXMvZmlndXJlXzRiX2Nkcy5jc3YiKQpwcChmaWxlPSJpbWFnZXMvZmlndXJlXzRjX2Nkcy5wZGYiKQpoc19jZHNfaW5mX2RhdGEkcmF3X3NjYWxlZF9wY2EKZGV2Lm9mZigpCndyaXRlLmNzdihoc19jZHNfaW5mX2RhdGEkcmF3X3NjYWxlZF9wY2FfdGFibGUsIGZpbGU9ImltYWdlcy9maWd1cmVfNGNfY2RzLmNzdiIpCnBwKGZpbGU9ImltYWdlcy9maWd1cmVfNGRfY2RzLnBkZiIpCmhzX2Nkc191bmluZl9kYXRhJHJhd190c25lCmRldi5vZmYoKQpwcChmaWxlPSJpbWFnZXMvZmlndXJlXzRlX2Nkcy5wZGYiKQpoc19jZHNfaW5mX2RhdGEkcmF3X3RzbmUKZGV2Lm9mZigpCmBgYAoKIyMgU3RhcnQgd2l0aG91dCB0aGUgdW5pbmZlY3RlZDogbm8sIHBhdGllbnQsIHN0cmFpbgoKTm93IGxldCB1cyB0cnkgYSBmZXcgZGlmZmVyZW50IHdheXMgb2YgZGVhbGluZyB3aXRoIHRoZSBiYXRjaCBlZmZlY3RzL3N1cnJvZ2F0ZSB2YXJpYWJsZXMuCkluIGVhY2ggY2FzZSwgSSB3aWxsIHVzZSBhIFBDQSBwbG90IHRvIHNlZSBob3cgdGhlIG1ldGhvZCBjaGFuZ2VzIHRoZSBzYW1wbGUgY2x1c3RlcmluZy4KCiMjIyBQQ0E6IE5vIEJhdGNoIGNvcnJlY3Rpb24KCkluIHRoaXMgZmlyc3QgaXRlcmF0aW9uLCB3ZSB3aWxsIGxvZzIoY3BtKHF1YW50KGZpbHRlcigpKSkpIHRoZSBkYXRhIGFuZCBsZWF2ZSB0aGUgZXhwZXJpbWVudGFsCnBhcmFtZXRlcnMgYXMgdGhlIGRlZmF1bHQ6CmNvbmRpdGlvbiA9PSB0aGUgNiBzdHJhaW5zLCAzIGNocm9uaWMgMyBzZWxmLWhlYWxpbmcKYmF0Y2ggPT0gdGhlIHRocmVlIHBhdGllbnRzIHAxMDcKCmBgYHtyIG5vX3VuaW5mZWN0ZWRfcGNhfQojIyBTdGFydCB3aXRoIHRoZSBub24tdW5pbmZlY3RlZCwgbm8gYmF0Y2ggY29ycmVjdGlvbgpoc19pbmZfbHFjZiA8LSBzbShub3JtYWxpemVfZXhwdChoc19pbmYsIGZpbHRlcj1UUlVFLCBjb252ZXJ0PSJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09ImxvZzIiLCBub3JtPSJxdWFudCIpKQpoc19wY2FfaW5mX2xxY2YgPC0gcGxvdF9wY2EoaHNfaW5mX2xxY2YpCmhzX3BjYV9pbmZfbHFjZiRwbG90CiMjIDMgdGhyZWUgcGF0aWVudHMgYXJlIHN1cGVyIG9idmlvdXMgSSB0aGluawojIyBUaGUgcGF0aWVudHMgMTA3LzEwOCBhcmUgb24gdGhlIGxlZnQgd2hpbGUgMTEwIGlzIG9uIHRoZSByaWdodC4Ka25pdHI6OmthYmxlKGhzX3BjYV9pbmZfbHFjZiR0YWJsZSkKCmhzX3BjYV9pbmZfbHFjZiR2YXJpYW5jZQp3cml0ZS5jc3YoaHNfcGNhX2luZl9scWNmJHBjYXRhYmxlLCBmaWxlPSJjc3YvaW5mZWN0aW9uX25vdW5pbmZlY3RlZF9ub19iYXRjaC5jc3YiKQojIyBUaGlzIHNob3dzIGNsZWFuIHNlaHVtYW50aW9uIGJ5IHBhdGllbnQKIyMgVGhlcmVmb3JlIHdlIHdpbGwgbm93IGFkZCBwYXRpZW50IGFzIGEgc3Vycm9nYXRlIHZhcmlhYmxlIGFuZCBtaW5pbWl6ZSBpdAoKaHNjZHNfaW5mX2xxY2YgPC0gc20obm9ybWFsaXplX2V4cHQoaHNfY2RzX2luZiwgZmlsdGVyPVRSVUUsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybT0ibG9nMiIsIG5vcm09InF1YW50IikpCmhzY2RzX3BjYV9pbmZfbHFjZiA8LSBwbG90X3BjYShoc2Nkc19pbmZfbHFjZikKaHNjZHNfcGNhX2luZl9scWNmJHBsb3QKYGBgCgojIyMgUENBOiBSZXBlYXQgd2l0aCBjb21iYXQgYWRqdXN0bWVudAoKRm9yIHRoZSBzZWNvbmQgaXRlcmF0aW9uLCB1c2UgdGhlIHNhbWUgbm9ybWFsaXphdGlvbiwgYnV0IGFkZCBhIGNvbWJhdCBjb3JyZWN0aW9uIGluIGFuIGF0dGVtcHQgdG8KbWluaW1pemUgcGF0aWVudCdzIGVmZmVjdCBpbiB0aGUgdmFyaWFuY2UuCgpgYGB7ciBwYXRpZW50X3BjYV9ub191bmluZmVjdGVkdjEsIGZpZy5zaG93PSJoaWRlIn0KaHNfaW5mX2xxY2ZfY2Jkb25vciA8LSBzbShub3JtYWxpemVfZXhwdChoc19pbmZfbHFjZiwgYmF0Y2g9ImNvbWJhdF9zY2FsZSIpKQpgYGAKCmBgYHtyIHBhdGllbnRfcGNhX25vX3VuaW5mZWN0ZWR2MXBpY30KIyMgSGVyZSB0aGUgc3BsaXQgaXMgc2VtaSBjaHJvbmljL3NlbGYtaGVhbGluZywgYnV0IG5vdCBxdWl0ZQpoc19wY2FfaW5mX2xxY2ZfY2Jkb25vciA8LSBwbG90X3BjYShoc19pbmZfbHFjZl9jYmRvbm9yKQpoc19wY2FfaW5mX2xxY2ZfY2Jkb25vciRwbG90CnRlc3RpbmcgPC0gbWFrZV8zZF9wY2EoaHNfcGNhX2luZl9scWNmX2NiZG9ub3IpCnRlc3RpbmckcGxvdAojIyBUaGVyZSBhcmUgMiBzaCBhbmQgMSBjaHIgb24gdGhlIHJpZ2h0IHZzLiAyIGNociBhbmQgMSBzaCBvbiB0aGUgbGVmdAprbml0cjo6a2FibGUoaHNfcGNhX2luZl9scWNmX2NiZG9ub3IkdGFibGUpCgpoc19wY2FfaW5mX2xxY2ZfY2Jkb25vciR2YXJpYW5jZQp3cml0ZS5jc3YoaHNfcGNhX2luZl9scWNmX2NiZG9ub3IkcGNhdGFibGUsIGZpbGU9ImNzdi9pbmZlY3Rpb25fbm91bmluZmVjdGVkX2JhdGNoX3BhdGllbnQuY3N2IikKYGBgCgojIyMgTG9vayBhdCBjb3JyZWxhdGlvbnMgYmV0d2VlbiBleHBlcmltZW50YWwgZmFjdG9ycyBhbmQgdmFyaWFuY2UKCmBgYHtyIHBjYV9pbmZvcm1hdGlvbl92MSwgZmlnLnNob3c9ImhpZGUifQpoc19pbmZfcGNhaW5mbyA8LSBwY2FfaW5mb3JtYXRpb24oaHNfaW5mLCBwbG90X3BjYXM9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHRfZmFjdG9ycz1jKCJjb25kaXRpb24iLCAiYmF0Y2giLCAicGF0aG9nZW5zdHJhaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXRlIiwgImRvbm9yIiwgInJuYW5ndWwiKSkKYGBgCgpMb29rIGZvciBzaWduaWZpY2FudCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgUENzIGFuZCBzb21lIGZhY3RvcnMgaW4KdGhlIGV4cGVyaW1lbnRhbCBkZXNpZ24uCgpgYGB7ciBwY2FfaW5mb19pbWFnZXN9CmhzX2luZl9wY2FpbmZvJGFub3ZhX2ZzdGF0X2hlYXRtYXAKaHNfaW5mX3BjYWluZm8kcGNhX3Bsb3RzJFBDMl9QQzYKYGBgCgojIyMgUENBOiBDaGFuZ2UgYmF0Y2ggdG8gc3RyYWluIGFuZCBjb25kaXRpb24gdG8gcGF0aWVudCtzdGF0ZQoKSGVyZSB3ZSB3aWxsIHNldCB0aGUgYmF0Y2ggdG8gdGhlIGh1bWFuc2l0ZSBzdHJhaW5zIGFuZCBjb25kaXRpb24gdG8gYSBjb21iaW5hdGlvbiBvZiB0aGUgcGF0aWVudCBhbmQKc3RhdGUgc3RhdGU7IHRoZW4gcGVyZm9ybSB0aGUgcGNhIGFnYWluLgoKYGBge3IgY2hhbmdlX2NvbmRpdGlvbl9iYXRjaH0KbmV3X2NvbmRpdGlvbiA8LSBwYXN0ZTAoaHNfaW5mJGRlc2lnbiRzdGF0ZSwgJ18nLCBoc19pbmYkZGVzaWduJGRvbm9yKQpoc19pbmZfc3RyYmF0Y2ggPC0gc2V0X2V4cHRfZmFjdG9ycyhoc19pbmYsIGJhdGNoPSJwYXRob2dlbnN0cmFpbiIsIGNvbmRpdGlvbj1uZXdfY29uZGl0aW9uKQpoc19pbmZfbHFjZl9jYnN0ciA8LSBzbShub3JtYWxpemVfZXhwdChoc19pbmZfc3RyYmF0Y2gsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm09InF1YW50IiwgZmlsdGVyPVRSVUUsIGJhdGNoPSJjb21iYXRfc2NhbGUiKSkKYGBgCgpgYGB7ciBjaGFuZ2VfY29uZGl0aW9uX2JhdGNocGljfQpoc19pbmZfbHFjZl9jYnN0cl9wY2EgPC0gcGxvdF9wY2EoaHNfaW5mX2xxY2ZfY2JzdHIpCmhzX2luZl9scWNmX2Nic3RyX3BjYSRwbG90CiMjIERvaW5nIHRoYXQga2luZCBvZiBzdWNrZWQgdGhlIHZhcmlhbmNlIG91dCBvZiB0aGUgZGF0YSwgYnV0IGl0IGRpZCBjYXVzZSB0aGUKIyMgc2FtcGxlcyB0byBzcGxpdCBieSBzdHJhaW4gcXVpdGUgc3Ryb25nbHkKa25pdHI6OmthYmxlKGhzX2luZl9scWNmX2Nic3RyX3BjYSR0YWJsZSkKCmhzX2luZl9scWNmX2Nic3RyX3BjYSR2YXJpYW5jZQp3cml0ZS5jc3YoaHNfaW5mX2xxY2ZfY2JzdHJfcGNhJHBjYXRhYmxlLCBmaWxlPSJjc3YvaW5mZWN0aW9uX25vdW5pbmZlY3RlZF9iYXRjaF9zdHJhaW4uY3N2IikKYGBgCgojIyMgUENBOiBSZXBlYXQgYnV0IHdpdGgganVzdCBjaHJvbmljL3NlbGYtc3RhdGUKCk5vdyBjaGFuZ2Ugb25seSB0aGUgY29uZGl0aW9uIHRvIHNlbGYvY2hyb25pYyBhbmQgbWFrZSBzdXBlci1leHBsaWNpdCB0aGUgc3BsaXQgaW4gdGhlIHNhbXBsZXMuCgpgYGB7ciBjaGFuZ2VfY29uZGl0aW9uX2JhdGNoX2Noc2h9CmhzX2luZl9scWNmX2Nic3RydjIgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyhoc19pbmZfbHFjZl9jYnN0ciwgZmFjdD0ic3RhdGUiKQpoc19pbmZfbHFjZl9jYnN0cnYyIDwtIHNldF9leHB0X2NvbG9ycyhoc19pbmZfbHFjZl9jYnN0cnYyLCBjb2xvcnM9YygiIzg4MDAwMCIsIiMwMDAwODgiKSkKaHNfaW5mX2xxY2ZfY2JzdHJ2Ml9wY2EgPC0gcGxvdF9wY2EoaHNfaW5mX2xxY2ZfY2JzdHJ2MikKaHNfaW5mX2xxY2ZfY2JzdHJ2Ml9wY2EkcGxvdAojIyBUaHVzIDMgcnVucyBvZiBjaHJvbmljIG9uIHRoZSByaWdodCBhbmQgc2VsZi1zdGF0ZSBvbiB0aGUgbGVmdAprbml0cjo6a2FibGUoaHNfaW5mX2xxY2ZfY2JzdHJ2Ml9wY2EkdGFibGUpCmBgYAoKIyMgUmVzdGFydCBidXQgaW5jbHVkZSB0aGUgdW5pbmZlY3RlZCBzYW1wbGVzCgpGb3IgdGhlIG5leHQgZmV3IGJsb2NrcyB3ZSB3aWxsIGp1c3QgcmVwZWF0IHdoYXQgd2UgZGlkIGJ1dCBpbmNsdWRlIHRoZQp1bmluZmVjdGVkIHNhbXBsZXMuIElkZWFsbHkgZG9pbmcgc28gd2lsbCBoYXZlIH4wIGVmZmVjdCBvbiB0aGUgcG9zaXRpb25zIG9mIHRoZQpzYW1wbGUgdHlwZXMuCgojIyMgUENBOiArdW5pbmZlY3RlZDogTm8gQmF0Y2ggY29ycmVjdGlvbgoKSW4gdGhpcyBmaXJzdCBleGFtcGxlLCB3ZSBzZWUgd2h5IHRoZSB1bmluZmVjdGVkIHNhbXBsZXMgd2VyZSBpbml0aWFsbHkgcmVtb3ZlZApmcm9tIHRoZSBhbmFseXNlcyBJIHRoaW5rLgoKYGBge3Igd2l0aF91bmluZmVjdGVkX3BjYX0KIyMgU3RhcnQgd2l0aCB0aGUgbm9uLXVuaW5mZWN0ZWQsIG5vIGJhdGNoIGNvcnJlY3Rpb24KaHNfdW5pbmZfbHFjZiA8LSBzbShub3JtYWxpemVfZXhwdChoc191bmluZiwgZmlsdGVyPVRSVUUsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPSJsb2cyIiwgbm9ybT0icXVhbnQiKSkKaHNfdW5pbmZfbHFjZl9wY2EgPC0gcGxvdF9wY2EoaHNfdW5pbmZfbHFjZikKaHNfdW5pbmZfbHFjZl9wY2EkcGxvdAojIyBJbiB0aGlzIGNhc2UsIHRoZSB1bmluZmVjdGVkIHNhbXBsZXMgY2F1c2UgdGhlIHAxMDcvcDEwOCBzYW1wbGVzIHRvIHNtb29zaCB0b2dldGhlcgprbml0cjo6a2FibGUoaHNfdW5pbmZfbHFjZl9wY2EkdGFibGUpCgpoc191bmluZl9scWNmX3BjYSR2YXJpYW5jZQp3cml0ZS5jc3YoaHNfdW5pbmZfbHFjZl9wY2EkcGNhdGFibGUsIGZpbGU9ImNzdi9pbmZlY3Rpb25fd2l0aHVuaW5mZWN0ZWRfd2l0aF9iYXRjaC5jc3YiKQpgYGAKCiMjIyBQQ0E6ICt1bmluZmVjdGVkIFJlcGVhdCB3aXRoIGNvbWJhdCBhZGp1c3RtZW50CgpGb3IgdGhlIHNlY29uZCBpdGVyYXRpb24sIHVzZSB0aGUgc2FtZSBub3JtYWxpemF0aW9uLCBidXQgYWRkIGEgY29tYmF0CmNvcnJlY3Rpb24gaW4gYW4gYXR0ZW1wdCB0byBtaW5pbWl6ZSBwYXRpZW50J3MgZWZmZWN0IGluIHRoZSB2YXJpYW5jZS4KCmBgYHtyIHBhdGllbnRfcGNhX3dpdGhfdW5pbmZlY3RlZCwgZmlnLnNob3c9ImhpZGUifQpoc191bmluZl9scWNmX2NiZG9ub3IgPC0gc20obm9ybWFsaXplX2V4cHQoaHNfdW5pbmZfbHFjZiwgYmF0Y2g9ImNvbWJhdF9zY2FsZSIpKQpgYGAKCmBgYHtyIHBhdGllbnRfcGNhX3dpdGhfdW5pbmZlY3RlZHBpY3h9CiMjIEhlcmUgdGhlIHNwbGl0IGlzIHNlbWkgY2hyb25pYy9zZWxmLXN0YXRlLCBidXQgbm90IHF1aXRlCmhzX3VuaW5mX2xxY2ZfY2Jkb25vcl9wY2EgPC0gcGxvdF9wY2EoaHNfdW5pbmZfbHFjZl9jYmRvbm9yKQpoc191bmluZl9scWNmX2NiZG9ub3JfcGNhJHBsb3QKIyMgTm93IHdlIGhhdmUgd2VhayBzZWh1bWFudGlvbiBiZXR3ZWVuIHN0cmFpbnMsIEkgdGhvdWdodCBmb3IgYSBtb21lbnQgaXQgbWlnaHQKIyMgYmUgZmV3IHNucHMgdnMuIG1hbnkgYnV0IHRoYXQgaXMgbm90IHRydWUuCiMjIFRoZXJlIGFyZSAyIHNoIGFuZCAxIGNociBvbiB0aGUgcmlnaHQgdnMuIDIgY2hyIGFuZCAxIHNoIG9uIHRoZSBsZWZ0CmtuaXRyOjprYWJsZShoc191bmluZl9scWNmX2NiZG9ub3JfcGNhJHRhYmxlKQoKaHNfdW5pbmZfbHFjZl9jYmRvbm9yX3BjYSR2YXJpYW5jZQp3cml0ZS5jc3YoaHNfdW5pbmZfbHFjZl9jYmRvbm9yX3BjYSRwY2F0YWJsZSwKICAgICAgICAgIGZpbGU9ImNzdi9pbmZlY3Rpb25fd2l0aHVuaW5mZWN0ZWRfYmF0Y2hfcGF0aWVudC5jc3YiKQpgYGAKCiMjIyBQQ0E6ICt1bmluZmVjdGVkLCBjaGFuZ2UgdGhlIGNvbmRpdGlvbiB0byBjaHIvc2gKCkluY2x1ZGluZyB0aGUgdW5pbmZlY3RlZCBzYW1wbGVzIGFuZCBjaGFuZ2luZyB0aGUgY29uZGl0aW9uIHNob3VsZCBub3QgbXVjaCBtYXR0ZXIKCiMjIyBQQ0E6ICt1bmluZmVjdGVkLCBDaGFuZ2UgYmF0Y2ggdG8gc3RyYWluIGFuZCBjb25kaXRpb24gdG8gcGF0aWVudCtzdGF0ZQoKYGBge3IgdW5pbmZfY2hhbmdlX2NvbmRpdGlvbmJhdGNofQojIyBIZXJlIHdlIHdpbGwgc2V0IHRoZSBiYXRjaCB0byB0aGUgaHVtYW5zaXRlIHN0cmFpbnMgYW5kIGNvbmRpdGlvbiB0byBhCiMjIGNvbWJpbmF0aW9uIG9mIHRoZSBwYXRpZW50IGFuZCBzdGF0ZSBzdGF0ZTsgdGhlbiBwZXJmb3JtIHRoZSBwY2EuCm5ld19jb25kaXRpb24gPC0gcGFzdGUwKGhzX3VuaW5mJGRlc2lnbiRzdGF0ZSwgJ18nLCBoc191bmluZiRkZXNpZ24kZG9ub3IpCmhzX3VuaW5mdjIgPC0gc2V0X2V4cHRfZmFjdG9ycyhoc191bmluZiwgY29uZGl0aW9uPW5ld19jb25kaXRpb24sIGJhdGNoPSJwYXRob2dlbnN0cmFpbiIpCmBgYAoKYGBge3IgdW5pbmZfY2hhbmdlX2NvbmRpdGlvbmJhdGNoMSwgZmlnLnNob3c9ImhpZGUifQpoc191bmluZnYyX2xxY2ZfY2JzdHIgPC0gc20obm9ybWFsaXplX2V4cHQoaHNfdW5pbmZ2MiwgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm09InF1YW50IiwgZmlsdGVyPVRSVUUsIGJhdGNoPSJjb21iYXRfc2NhbGUiKSkKYGBgCgpgYGB7ciB1bmluZl9jaGFuZ2VfY29uZGl0aW9uX2JhdGNoMn0KaHNfdW5pbmZ2Ml9scWNmX2Nic3RyX3BjYSA8LSBwbG90X3BjYShoc191bmluZnYyX2xxY2ZfY2JzdHIpCmhzX3VuaW5mdjJfbHFjZl9jYnN0cl9wY2EkcGxvdAojIyBUaGlzIGlzIGEgc3VycHJpc2UgdG8gbWUsIEkgd291bGQgaGF2ZSBleHBlY3RlZCB0aGUgdW5pbmZlY3RlZCB0byBzdGlsbCBwdXNoCiMjIHRoZSBvdGhlciBzYW1wbGVzIG9mZiB0byBhIHNpZGUgb3Igc29tZXN1Y2guCmtuaXRyOjprYWJsZShoc191bmluZnYyX2xxY2ZfY2JzdHJfcGNhJHRhYmxlKQoKaHNfdW5pbmZ2Ml9scWNmX2Nic3RyX3BjYSR2YXJpYW5jZQp3cml0ZS5jc3YoaHNfdW5pbmZ2Ml9scWNmX2Nic3RyX3BjYSRwY2F0YWJsZSwKICAgICAgICAgIGZpbGU9ImNzdi9pbmZlY3Rpb25fd2l0aHVuaW5mZWN0ZWRfYmF0Y2hfc3RyYWluLmNzdiIpCmBgYAoKIyMjIFBDQTogK3VuaW5mZWN0ZWQsIFJlcGVhdCBidXQgd2l0aCBqdXN0IGNocm9uaWMvc2VsZi1zdGF0ZQoKYGBge3IgdW5pbmZfY2hhbmdlX2NvbmRpdGlvbl9jaHNofQpoc191bmluZnYyX2xxY2ZfY2JzdHIgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyhoc191bmluZnYyX2xxY2ZfY2JzdHIsIGZhY3Q9InN0YXRlIikKaHNfdW5pbmZ2Ml9scWNmX2Nic3RyIDwtIHNldF9leHB0X2NvbG9ycyhoc191bmluZnYyX2xxY2ZfY2JzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPWMoIiM4ODAwMDAiLCIjMDAwMDg4IiwiIzAwODgwMCIpKQpoc191bmluZnYyX2xxY2ZfY2JzdHJfcGNhIDwtIHBsb3RfcGNhKGhzX3VuaW5mdjJfbHFjZl9jYnN0cikKaHNfdW5pbmZ2Ml9scWNmX2Nic3RyX3BjYSRwbG90CmtuaXRyOjprYWJsZShoc191bmluZnYyX2xxY2ZfY2JzdHJfcGNhJHRhYmxlKQpgYGAKCiMjIyBQQ0E6IFRyeSBvbmx5IHVzaW5nIHNhbXBsZXMgZm9yIDEgcGF0aWVudAoKQXMgcGVyIGEgY29udmVyc2F0aW9uIHdpdGggTWFyaWEgQWRlbGFpZGEgb24gc2t5cGUsIGxldHMgcmVtb3ZlIGFsbCBzYW1wbGVzIGV4Y2VwdCB0aG9zZSBmb3Igb25lCnBhdGllbnQsIHRoZW4gc2VlIGlmIHNvbWUgYXNwZWN0IG9mIHRoZSBkYXRhIGp1bXBzIG91dCAoc3RyYWluOnN0cmFpbiB2YXJpYXRpb24sIGZvciBleGFtcGxlKQoKYGBge3Igc2luZ2xlX3BhdGllbnR9CnNpbmdsZV9wYXRpZW50IDwtIHN1YnNldF9leHB0KGhzX2luZiwgc3Vic2V0PSJkb25vcj09J2QxMDcnIikKc2luZ2xlX3BhdGllbnQgPC0gc2V0X2V4cHRfYmF0Y2hlcyhzaW5nbGVfcGF0aWVudCwgZmFjdD0ic3RhdGUiKQpzaW5nbGVfbm9ybSA8LSBzbShub3JtYWxpemVfZXhwdChzaW5nbGVfcGF0aWVudCwgdHJhbnNmb3JtPSJsb2cyIiwgbm9ybT0icXVhbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PSJjcG0iLCBmaWx0ZXI9VFJVRSkpCnNpbmdsZV9ub3JtX3BjYSA8LSBwbG90X3BjYShzaW5nbGVfbm9ybSkKc2luZ2xlX25vcm1fcGNhJHBsb3QKCnNpbmdsZV9wYXRpZW50IDwtIHN1YnNldF9leHB0KGhzX2luZiwgc3Vic2V0PSJkb25vcj09J2QxMDgnIikKc2luZ2xlX3BhdGllbnQgPC0gc2V0X2V4cHRfYmF0Y2hlcyhzaW5nbGVfcGF0aWVudCwgZmFjdD0ic3RhdGUiKQpzaW5nbGVfbm9ybSA8LSBzbShub3JtYWxpemVfZXhwdChzaW5nbGVfcGF0aWVudCwgdHJhbnNmb3JtPSJsb2cyIiwgbm9ybT0icXVhbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PSJjcG0iLCBmaWx0ZXI9VFJVRSkpCnNpbmdsZV9ub3JtX3BjYSA8LSBwbG90X3BjYShzaW5nbGVfbm9ybSkKc2luZ2xlX25vcm1fcGNhJHBsb3QKCnNpbmdsZV9wYXRpZW50IDwtIHN1YnNldF9leHB0KGhzX2luZiwgc3Vic2V0PSJkb25vcj09J2QxMTAnIikKc2luZ2xlX3BhdGllbnQgPC0gc2V0X2V4cHRfYmF0Y2hlcyhzaW5nbGVfcGF0aWVudCwgZmFjdD0ic3RhdGUiKQpzaW5nbGVfbm9ybSA8LSBzbShub3JtYWxpemVfZXhwdChzaW5nbGVfcGF0aWVudCwgdHJhbnNmb3JtPSJsb2cyIiwgbm9ybT0icXVhbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PSJjcG0iLCBmaWx0ZXI9VFJVRSkpCnNpbmdsZV9ub3JtX3BjYSA8LSBwbG90X3BjYShzaW5nbGVfbm9ybSkKc2luZ2xlX25vcm1fcGNhJHBsb3QKCiMjIGhtbW0gc28gdGhlIGFuc3dlciBpcywgbm8gLS0gSSB0aGluay4Ka25pdHI6OmthYmxlKHNpbmdsZV9ub3JtX3BjYSR0YWJsZSkKYGBgCgojIyMgUENBOiBSZS1sYWJlbCBvbmUgc2FtcGxlCgpJbiBvdXIgcHJldmlvdXMgZGlzY3Vzc2lvbiwgSGVjdG9yIHN1Z2dlc3RlZCB0aGF0IHNhbXBsZSAnSFBHTDA2MzUnIGlzCnN1ZmZpY2llbnRseSBkaXMtc2ltaWxhciB0byBpdHMgY29ob3J0IHNhbXBsZXMgdGhhdCBpdCBtaWdodCBhY3R1YWxseSBiZSBhCm1lbWJlciBvZiBzdHJhaW4gJzI1MDQnIHJhdGhlciB0aGFuICcxMDIyJy4gTGV0IHVzIGxvb2sgYW5kIHNlZSB3aGF0IGhhcHBlbnMgaWYKdGhhdCBpcyBjaGFuZ2VkLgoKSSBhbSBnb2luZyB0byBsZWF2ZSBvdXQgdGhlIHVuaW5mZWN0ZWQgc2FtcGxlcyB0byBhdm9pZCB0aGUgY29uZnVzaW9uIHRoZXkKZ2VuZXJhdGUuCgpgYGB7ciBjaGFuZ2Vfc2luZ2xldG9ufQpoc19scWNmX25vc3dpdGNoIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGhzX2luZiwgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtPSJxdWFudCIsIGZpbHRlcj1UUlVFKSkKcGxvdF9wY2EoaHNfbHFjZl9ub3N3aXRjaCkkcGxvdAojIyBUaGlzIGlzIGp1c3QgdG8gbm90ZSB0aGF0IHRoZSBvcmlnaW5hbCBjb2xvciBmb3Igc2FtcGxlIDYzNSB3YXMgb3JhbmdlIHRvCiMjIG1hdGNoIHN0cmFpbiAnMTAyMicKIyNzd2l0Y2hfb25lIDwtIHNldF9leHB0X2NvbmRpdGlvbihub191bmluZmVjdGVkLCBpZHM9Yygic0hQR0wwNjM1IiksIGZhY3Q9ImNoMjUwNCIpCnN3aXRjaF9vbmUgPC0gc2V0X2V4cHRfY29uZGl0aW9ucyhoc19pbmYsIGlkcz1jKCJzaF8xMDIyX2QxMDgiKSwgZmFjdD0iY2hyIikKc3dpdGNoZXIgPC0gbGlzdCgic2hfMTAyMl9kMTA4IiA9ICJwaW5rIikKc3dpdGNoX29uZSA8LSBzZXRfZXhwdF9jb2xvcnMoZXhwdD1zd2l0Y2hfb25lLCBjb2xvcnM9c3dpdGNoZXIsIGNoYW5nZV9ieT0ic2FtcGxlIikKbHFjZl9zd2l0Y2ggPC0gc20obm9ybWFsaXplX2V4cHQoc3dpdGNoX29uZSwgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybT0icXVhbnQiLCBmaWx0ZXI9VFJVRSwgYmF0Y2g9ImNvbWJhdF9zY2FsZSIpKQojI3Bsb3RfcGNhKGxxY2Zfc3dpdGNoKSRwbG90CiMjIE5vdGUgdGhhdCBub3cgaXQgaXMgcGluaywgbWF0Y2hpbmcgJ2NoMjUwNCcKYGBgCgpJIG1heSBiZSBiaWFzZWQsIGJ1dCBJIHRoaW5rIHRoaXMgc3VnZ2VzdHMgdGhhdCB0aGUgc2FtcGxlcyB3ZXJlIG5vdCBzd2l0Y2hlZC4KCiMgVGVzdGluZyBvdXQgc29tZSBpZGVhcwoKT25lIHF1ZXJ5IHdhcyB0byBzZWUgaWYgdGhlcmUgaXMgYSByZXZlcnNhbCBvZiB0d28gc2FtcGxlcy4KCmBgYHtyIHRlc3RpbmdfaWRlYXN9CmNvbWJpbmVkX2NvbmRpdGlvbiA8LSBwYXN0ZTAoaHNfaW5mJGRlc2lnbiRzdGF0ZSwgJ18nLCBoc19pbmYkZGVzaWduJGRvbm9yKQojIyB3aXRoX3VuaW5mZWN0ZWRfY29tYmluZWQgPC0gc2V0X2V4cHRfZmFjdG9ycyh3aXRoX3VuaW5mZWN0ZWQsCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoPSJwYXRob2dlbnN0cmFpbiIsCiMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbj1jb21iaW5lZF9jb25kaXRpb24pCmhzX2luZl9jb21iaW5lZCA8LSBzZXRfZXhwdF9mYWN0b3JzKGhzX2luZiwgYmF0Y2g9ImRvbm9yIiwgY29uZGl0aW9uPSJzdGF0ZSIpCmhlYWQoZXhwcnMobm9ybWFsaXplX2V4cHQoaHNfaW5mLCBjb252ZXJ0PSJjcG0iLCBmaWx0ZXI9VFJVRSkpKQpjb21iaW5lZF9wY2ExIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGhzX2luZl9jb21iaW5lZCwgZmlsdGVyPVRSVUUsIGJhdGNoPSJwY2EiLCBjb252ZXJ0PSJjcG0iKSkKY29tYmluZWRfcGNhMSA8LSBzZXRfZXhwdF9jb2xvcnMoY29tYmluZWRfcGNhMSwgY29sb3JzPWMoIiM4ODAwMDAiLCAiIzAwMDA4OCIpKQpwbG90X3BjYShzbShub3JtYWxpemVfZXhwdChjb21iaW5lZF9wY2ExLCBmaWx0ZXI9VFJVRSwgdHJhbnNmb3JtPSJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydD0iY3BtIiwgbm9ybT0icXVhbnQiKSkpJHBsb3QKY29tYmluZWRfcGNhMiA8LSBzZXRfZXhwdF9mYWN0b3JzKGNvbWJpbmVkX3BjYTEsIGJhdGNoPSJwYXRob2dlbnN0cmFpbiIsIGNvbmRpdGlvbj0ic3RhdGUiKQpjb21iaW5lZF9wY2EyIDwtIHNldF9leHB0X2NvbG9ycyhjb21iaW5lZF9wY2EyLCBjb2xvcnM9YygiIzg4MDAwMCIsICIjMDAwMDg4IikpCmNvbWJpbmVkX3BjYTMgPC0gc20obm9ybWFsaXplX2V4cHQoY29tYmluZWRfcGNhMiwgZmlsdGVyPVRSVUUsIGJhdGNoPSJwY2EiKSkKbDJjcV9jb21iaW5lZF9wY2EzIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGNvbWJpbmVkX3BjYTMsIGZpbHRlcj1UUlVFLCB0cmFuc2Zvcm09ImxvZzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydD0iY3BtIiwgbm9ybT0icXVhbnQiKSkKcGxvdF9wY2EobDJjcV9jb21iaW5lZF9wY2EzKSRwbG90Cgpkb25vcl9zdHJhaW5fdmFycGFydCA8LSBzbSh2YXJwYXJ0KGV4cHQ9aHNfaW5mLCBwcmVkaWN0b3I9TlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JzPWMoImNvbmRpdGlvbiIsInBhdGhvZ2Vuc3RyYWluIiwiZG9ub3IiKSkpCmRvbm9yX3N0cmFpbl92YXJwYXJ0JHBlcmNlbnRfcGxvdApwcChmaWxlPSJpbWFnZXMvdmFycGFydF9kb25vcl9zdHJhaW4ucG5nIikKZG9ub3Jfc3RyYWluX3ZhcnBhcnQkcGFydGl0aW9uX3Bsb3QKZGV2Lm9mZigpCnBwKGZpbGU9ImltYWdlcy92YXJwYXJ0X2Rvbm9yX3N0cmFpbl9wY3QucG5nIikKcmVwbG90X3ZhcnBhcnRfcGVyY2VudChkb25vcl9zdHJhaW5fdmFycGFydCwgbj00MCkKZGV2Lm9mZigpCnNvcnRlZCA8LSBkb25vcl9zdHJhaW5fdmFycGFydCRzb3J0ZWRfZGYKYGBgCgojIFRyeSBvdXQgc29tZSBsaW1tYSBpbnZvY2F0aW9ucyB3aXRoIGludGVyYWN0aW9uIG1vZGVscwoKVGhlIGV4cGVyaW1lbnRhbCBkZXNpZ24gZG9lcyBub3QgZnVsbHkgc3VwcHJ0IGludGVyYWN0aW9uIG1vZGVscywgYnV0IEkgd2FudCB0byBzZWUKaG93IGl0IGxvb2tzLgoKYGBge3IgdGVzdF9jb25kaXRpb25fc3RyYWluX2Rvbm9yLCBldmFsPUZBTFNFfQp0ZXN0X2RhdGEgPC0gc20obm9ybWFsaXplX2V4cHQoaHNfaW5mX2NvbWJpbmVkLCBjb252ZXJ0PSJjcG0iLCBub3JtPSJxdWFudCIsIGZpbHRlcj1UUlVFKSkKcXVlcnlfbW9kZWxfc3RyaW5nIDwtICJ+IGNvbmRpdGlvbjpwYXRob2dlbnN0cmFpbiArIGRvbm9yIgpxdWVyeV9kZXNpZ24gPC0gaHNfaW5mX2NvbWJpbmVkW1siZGVzaWduIl1dCnF1ZXJ5X2NvbmRpdGlvbnMgPC0gYXMuZmFjdG9yKHF1ZXJ5X2Rlc2lnbltbImNvbmRpdGlvbiJdXSkKIyNxdWVyeV9iYXRjaGVzIDwtIGFzLmZhY3RvcihxdWVyeV9kZXNpZ25bWyJhbm90aGVyYmF0Y2giXV0pCnF1ZXJ5X2JhdGNoZXMgPC0gYXMuZmFjdG9yKHg9YygiYSIsImEiLCJhIiwiYSIsImEiLCJhIiwiYiIsImIiLCJiIiwiYiIsImIiLCJiIiwiYyIsImMiLCJjIiwiYyIsImMiLCJjIikpCnF1ZXJ5X3N0cmFpbnMgPC0gYXMuZmFjdG9yKHF1ZXJ5X2Rlc2lnbltbInBhdGhvZ2Vuc3RyYWluIl1dKQpxdWVyeV9kb25vcnMgPC0gYXMuZmFjdG9yKHF1ZXJ5X2Rlc2lnbltbImRvbm9yIl1dKQpkYXRhX210cnggPC0gYXMuZGF0YS5mcmFtZShleHBycyh0ZXN0X2RhdGEpKQpxdWVyeV9tb2RlbCA8LSBtb2RlbC5tYXRyaXgofiAwICsgcXVlcnlfY29uZGl0aW9ucyArIHF1ZXJ5X2Rvbm9ycyArIHF1ZXJ5X3N0cmFpbnMsIGRhdGE9cXVlcnlfZGVzaWduKQpjb21iaW5lZF92b29tIDwtIGxpbW1hOjp2b29tKGNvdW50cz1kYXRhX210cngsIGRlc2lnbj1xdWVyeV9tb2RlbCwgbm9ybWFsaXplLm1ldGhvZD0icXVhbnRpbGUiKQpjb21iaW5lZF9maXQgPC0gbGltbWE6OmxtRml0KGNvbWJpbmVkX3Zvb20sIHF1ZXJ5X21vZGVsLCByb2J1c3Q9VFJVRSkKY29tYmluZWRfY29udHJhc3QgPC0gbGltbWE6Om1ha2VDb250cmFzdHMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hzaD1xdWVyeV9jb25kaXRpb25zY2hyb25pYy1xdWVyeV9jb25kaXRpb25zc2VsZl9oZWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1xdWVyeV9tb2RlbCkKY29tYmluZWRfY2ZpdCA8LSBsaW1tYTo6Y29udHJhc3RzLmZpdChjb21iaW5lZF9maXQsIGNvbWJpbmVkX2NvbnRyYXN0KQpjb21iaW5lZF9iYXllcyA8LSBsaW1tYTo6ZUJheWVzKGNvbWJpbmVkX2NmaXQsIHJvYnVzdD1UUlVFKQpjb21iaW5lZF90YWJsZSA8LSBsaW1tYTo6dG9wVGFibGUoY29tYmluZWRfYmF5ZXMsIG51bWJlcj1ucm93KGNvbWJpbmVkX2JheWVzKSwgcmVzb3J0LmJ5PSJsb2dGQyIpCmhpc3QoY29tYmluZWRfdGFibGUkYWRqLlAuVmFsKQptaW4oY29tYmluZWRfdGFibGUkYWRqLlAuVmFsKQp0ZXN0X21hIDwtIHBsb3RfbWFfZGUodGFibGU9Y29tYmluZWRfdGFibGUsIGV4cHJfY29sPSJBdmVFeHByIiwgZmNfY29sPSJsb2dGQyIsIHBfY29sPSJhZGouUC5WYWwiLCBsb2dmY19jdXRvZmY9MC42KQp0ZXN0X21hJHBsb3QKaGVhZChjb21iaW5lZF90YWJsZSkKYGBgCgpTd2l0Y2ggdG8gdGhlIHBhcmFzaXRlIHRyYW5zY3JpcHRvbWUgZGF0YQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKIyBMb29rIGR1cmluZyBpbmZlY3Rpb24KCiJDaGFuZ2VzIGR1cmluZyBpbmZlY3Rpb24gaHBnbDA2MzAtMDYzNiBhbmQgaHBnbDA2NTAtaHBnbDA2NjMiCgpTdGFydCBvdXQgYnkgY3JlYXRpbmcgdGhlIGV4cHQgYW5kIHBva2luZyBhdCBpdCB0byBzZWUgaG93IHdlbGwvYmFkbHkgYmVoYXZlZCB0aGUgZGF0YSBpcy4KCmBgYHtyIGluZmVjdGlvbl9leHB0Mn0KIyMgUmVyZWFkIHRoZSBzYW1wbGUgc2hlZXQgYmVjYXVzZSBJIGFtIGZpZGRsaW5nIHdpdGggb3RoZXIgcG9zc2libGUgc3Vycm9nYXRlcyAobGlrZSBzdHJhaW4pCiMjIEluIGZhY3QsIGNvcHkgaXQgdG8gYSBzZXBhcmF0ZSBzaGVldCBiZWNhdXNlIHRoZXNlIHNhbXBsZXMgYXJlIGEgbWVzcwpscF9pbmYgPC0gc3Vic2V0X2V4cHQocGFyYXNpdGVfZXhwdCwgc3Vic2V0PSJleHBlcmltZW50bmFtZT09J2luZmVjdGlvbiciKQpjaG9zZW5fY29sb3JzIDwtIGMoIiM5OTAwMDAiLCAiIzAwMDA5OSIpCm5hbWVzKGNob3Nlbl9jb2xvcnMpIDwtIGMoImNociIsInNoIikKbHBfaW5mIDwtIHNldF9leHB0X2NvbG9ycyhscF9pbmYsIGNvbG9ycz1jaG9zZW5fY29sb3JzKQojI2xwX2luZiA8LSBleHB0X2V4Y2x1ZGVfZ2VuZXMobHBfaW5mLCBjb2x1bW49InR5cGUiKQpgYGAKCiMjIEdlbmVyYXRlIHBsb3RzIGRlc2NyaWJpbmcgdGhlIGRhdGEKClRoZSBmb2xsb3dpbmcgY3JlYXRlcyBhbGwgdGhlIG1ldHJpYyBwbG90cyBvZiB0aGUgcmF3IGRhdGEuCgpgYGB7ciBtYWNyb3BoYWdlX3Bsb3RzLCBmaWcuc2hvdz0iaGlkZSJ9CmxwX2luZl9tZXRyaWNzIDwtIHNtKGdyYXBoX21ldHJpY3MobHBfaW5mKSkKYGBgCgpOb3cgdmlzdWFsaXplIHNvbWUgcmVsZXZhbnQgbWV0cmljcy4KCmBgYHtyIG1hY3JvcGhhZ2VfcmF3X21ldHJpY3N9CiMjIFJlcGVhdCBmb3IgdGhlIHBhcmFzaXRlCmxwX2luZl9tZXRyaWNzJGxpYnNpemUKIyMgV293LCB0aGUgcmFuZ2Ugb2YgY292ZXJhZ2UgaXMgc2hvY2tpbmdseSBsYXJnZQpscF9pbmZfbWV0cmljcyRkZW5zaXR5CiMjIEJ1dCB0aGlzIGxvb2tzIG11Y2ggYmV0dGVyIEkgdGhpbmsKbHBfaW5mX21ldHJpY3MkYm94cGxvdApgYGAKCmBgYHtyIG1hY3JvcGhhZ2Vfd3JpdGVfbWV0cmljcywgZmlnLnNob3c9ImhpZGUifQpscF9pbmZfd3JpdHRlbiA8LSBzbSh3cml0ZV9leHB0KAogIGxwX2luZiwKICBleGNlbD1wYXN0ZTAoImV4Y2VsL2luZmVjdGlvbl9wYXJhc2l0ZV9kYXRhLXYiLCB2ZXIsICIueGxzeCIpLAogIHZpb2xpbj1UUlVFKSkKYGBgCgojIyMgRGVmYXVsdCBub3JtYWxpemF0aW9uCgpOb3cgcGVyZm9ybSB0aGUgJ2RlZmF1bHQnIG5vcm1hbGl6YXRpb24gd2UgdXNlIGluIHRoZSBsYWIgYW5kIGxvb2sgYWdhaW4uCgpgYGB7ciBub3JtYWxpemVfaW5mZWN0LCBmaWcuc2hvdz0iaGlkZSJ9CmxwX2luZl9ub3JtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGxwX2luZiwgY29udmVydD0iY3BtIiwgZmlsdGVyPVRSVUUsIG5vcm09InF1YW50IikpCmxwX2luZl9ub3JtX21ldHJpY3MgPC0gc20oZ3JhcGhfbWV0cmljcyhscF9pbmZfbm9ybSkpCmBgYAoKIyMgUENBOiBQYXJhc2l0ZSBlZGl0aW9uCgpJbiB0aGlzIHNlY3Rpb24sIHRyeSBvdXQgc29tZSBub3JtYWxpemF0aW9ucy9iYXRjaCBjb3JyZWN0aW9ucyBhbmQgc2VlIHRoZQplZmZlY3QgaW4gUENBIHBsb3RzLiBTdGFydCBvdXQgYnkgdGFraW5nIHRoZSBwYXJhc2l0ZSBkYXRhIGFuZCBkb2luZyB0aGUgZGVmYXVsdApub3JtYWxpemF0aW9uIGFuZCBzZWUgd2hhdCB0aGVyZSBpcyB0byBzZWUuCgpgYGB7ciBwY2FfcGFyYXNpdGV9CmxwX2wycWNwbSA8LSBzbShub3JtYWxpemVfZXhwdChscF9pbmYsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtPSJxdWFudCIsIGZpbHRlcj1UUlVFKSkKbHBfbDJxY3BtX3BjYSA8LSBzbShwbG90X3BjYShscF9sMnFjcG0pKQpscF9sMnFjcG1fcGNhJHBsb3QKIyMgVGhvdWdoIHRoZSBjb2xvcnMgZG9uJ3Qgc2hvdyBpdCB3ZWxsLCB0aGUgc2FtcGxlcyBhcmUgYWN0dWFsbHkgc3BsaXQKIyMgYmVhdXRpZnVsbHkgYnkgc3RyYWluLCBidXQgY2xlYXJseSBub3QgYnkgY2hyb25pYy9oZWFsaW5nCmtuaXRyOjprYWJsZShscF9sMnFjcG1fcGNhJHRhYmxlKQoKbHBfbDJxY3BtX3RzbmUgPC0gcGxvdF90c25lKGxwX2wycWNwbSkKbHBfbDJxY3BtX3RzbmUkcGxvdAoKIyN0dCA8LSBwbG90X3RzbmUobHBfbDJxY3BtKQojI3R0dCA8LSBwbG90X3RzbmVfZ2VuZXMobHBfbDJxY3BtKQpgYGAKCk5vdyByZXBlYXQgdGhlIHNhbWUgdGhpbmcsIGJ1dCBsZXQgc3ZhIG1pbmltaXplIHN1cnJvZ2F0ZSB2YXJpYWJsZXMuCgpgYGB7ciBwY2Ffc3ZhLCBmaWcuc2hvdz0iaGlkZSJ9CmxwX2wycWNwbV9ub3JtYmF0Y2ggPC0gc20obm9ybWFsaXplX2V4cHQobHBfaW5mLCB0cmFuc2Zvcm09ImxvZzIiLCBjb252ZXJ0PSJjcG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm09InF1YW50IiwgZmlsdGVyPVRSVUUsIGJhdGNoPSJzdmEiKSkKbHBfbDJxY3BtX25vcm1iYXRjaF9wY2EgPC0gcGxvdF9wY2EobHBfbDJxY3BtX25vcm1iYXRjaCkKYGBgCgpOb3cgcGxvdCB0aGUgcmVzdWx0IGFuZCBzZWUgaWYgdGhpbmdzIG1ha2UgbW9yZSBzZW5zZS4KCmBgYHtyIHBjYV9zdmFfcGxvdCwgZmlnLmNhcD0iQWRkaW5nIFNWQSB0byB0aGUgbm9ybWFsaXphdGlvbiBkb2VzIG5vdCBoZWxwIG11Y2guIn0KbHBfbDJxY3BtX25vcm1iYXRjaF9wY2EkcGxvdAojIyBUaGF0IGRvZXMgbm90aGluZyBzaWduaWZpY2FudCB0byBjbGFyaWZ5IHRoaW5ncy4Ka25pdHI6OmthYmxlKGxwX2wycWNwbV9ub3JtYmF0Y2hfcGNhJHRhYmxlKQpgYGAKCk5vLCBub3QgcmVhbGx5LCBzbyBsZXRzIGNoYW5nZSB0aGluZ3MgYnkgcHV0dGluZyB0aGUgJ3NucCBzdGF0dXMnIGFzIHRoZSAiYmF0Y2giCmZhY3RvciBhbmQgbWluaW1pemUgaXQgd2l0aCBzdmEvY29tYmF0LgoKYGBge3IgcGNhX3NucCwgZmlnLnNob3c9ImhpZGUifQpscF9pbmZ2MiA8LSBzZXRfZXhwdF9jb25kaXRpb25zKGxwX2luZiwgZmFjdD0ic3RhdGUiKQpscF9pbmZ2MiA8LSBzZXRfZXhwdF9iYXRjaGVzKGxwX2luZnYyLCBmYWN0PSJzbnBjbGFkZSIpCmxwX2wycWNwbV9zbnBiYXRjaF9zdHJhaW5jb25kX3N2YSA8LSBzbShub3JtYWxpemVfZXhwdChscF9pbmZ2Miwgbm9ybT0icXVhbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPSJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2g9ImZzdmEiKSkKYGBgCgpgYGB7ciBwY2Ffc25wX3Bsb3QsIGZpZy5jYXA9IlNOUCBzdGF0dXMgZG9lcyBub3QgY2xhcmlmeSB0aGluZ3MuIn0KbHBfbDJxY3BtX3NucGJhdGNoX3N0cmFpbmNvbmRfcGNhIDwtIHBsb3RfcGNhKGxwX2wycWNwbV9zbnBiYXRjaF9zdHJhaW5jb25kX3N2YSkKbHBfbDJxY3BtX3NucGJhdGNoX3N0cmFpbmNvbmRfcGNhJHBsb3QKIyMgUHVsbGluZyBzdHJhaW4gNTQzMCBhd2F5IGZyb20gdGhlIG90aGVycyBtYWtlcyBhIHNlbWktc3BsaXQKa25pdHI6OmthYmxlKGxwX2wycWNwbV9zbnBiYXRjaF9zdHJhaW5jb25kX3BjYSR0YWJsZSkKYGBgCgpPaywgc28gbGV0IHVzIHJlbW92ZSB0aGUgaGVhbGluZyBzdGF0ZSB3aXRoIGNvbWJhdCBhbmQgc2VlIGlmIHRoYXQgYWxsb3dzIHVzIHRvIHNlZQphIHNwbGl0IG9uIHNvbWUgb3RoZXIgZmFjdG9yLgoKYGBge3IgcGNhX2hlYWwsIGZpZy5zaG93PSJoaWRlIn0KbHBfaW5mX3N0cmFpbiA8LSBzZXRfZXhwdF9jb25kaXRpb25zKGxwX2luZiwgZmFjdD0icGF0aG9nZW5zdHJhaW4iKQpscF9pbmZfc3RyYWluIDwtIHNldF9leHB0X2JhdGNoZXMobHBfaW5mX3N0cmFpbiwgZmFjdD0ic3RhdGUiKQpscF9sMnFjcG1fc3RyYWluIDwtIHNtKG5vcm1hbGl6ZV9leHB0KGxwX2luZl9zdHJhaW4sIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybT0icXVhbnQiLCBmaWx0ZXI9VFJVRSwgYmF0Y2g9ImNvbWJhdF9zY2FsZSIpKQpgYGAKCmBgYHtyIHBjYV9oZWFsX3Bsb3QsIGZpZy5jYXA9ImhtbSBvaywgSSB0aGluayBJIHF1aXQgZm9yIHRvZGF5LiJ9CmxwX2wycWNwbV9zdHJhaW5fcGNhIDwtIHBsb3RfcGNhKGxwX2wycWNwbV9zdHJhaW4pCmxwX2wycWNwbV9zdHJhaW5fcGNhJHBsb3QKcGxvdF90c25lKGxwX2wycWNwbV9zdHJhaW4pJHBsb3QKIyMgd3RmIT8hPyAgaG93IGRpZCB0aGlzIGhhcHBlbj8Ka25pdHI6OmthYmxlKGxwX2wycWNwbV9zdHJhaW5fcGNhJHRhYmxlKQpgYGAKCmBgYHtyIHNhdmVtZSwgaW5jbHVkZT1GQUxTRX0KbWVzc2FnZShwYXN0ZTAoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkpCnRoaXNfc2F2ZSA8LSBwYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXJtZF9maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpCm1lc3NhZ2UocGFzdGUwKCJTYXZpbmcgdG8gIiwgdGhpc19zYXZlKSkKdG1wIDwtIHNtKHNhdmVtZShmaWxlbmFtZT10aGlzX3NhdmUpKQpwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQpgYGAK