1 PBMC Infection Differential Expression, Infection: 20190205 Rundate: 20190208

This document turns to the infection of PBMC cells with L.panamensis. This data is particularly strangely affected by the different strains used to infect the cells, and as a result is both useful and troubling.

Given the observations above, we have some ideas of ways to pass the data for differential expression analyses which may or may not be ‘better’. Lets try some and see what happens.

1.1 Create data sets to compare differential expression analyses

Given the above ways to massage the data, lets use a few of them for limma/deseq/edger. The main caveat in this is that those tools really do expect specific distributions of data which we horribly violate if we use log2() data, which is why in the previous blocks I named them l2blahblah, thus we can do the same sets of normalization but without that and forcibly push the resulting data into limma/edger/deseq.

2 The negative control

Everything I did in 02_estimation_infection.html suggests that there are no significant differences visible if one looks just at chronic/self-healing in this data. Further testing has seemingly proven this statement, as a result most of the following analyses will look at chronic/uninfected and self-healing/uninfected followed by attempts to reconcile those results.

2.1 Filter the data

To save some time and annoyance with sva, lets filter the data now. In addition, write down a small function used to extract the sets of significant genes across different contrasts (notably self/uninfected vs. chronic/uninfected).

3 Initial analysis with no removals

3.2 sva

##        change_counts_up change_counts_down
## sh_nil              866                296
## ch_nil              953                401
## ch_sh                 4                 14

At this point, we should see that there are no significant differences between the chronic and self-healing samples when we look at all samples. The following will attempt to query why this is the case and decide on what to do about it.

4 P-value distributions on a per-donor basis

While sitting with Hector in 201812, we ended up focusing on the distribution of p-values observed when performing a chronic vs. self-healing comparison. This was eventually expanded to include that distribution for each of the three individual donors.

4.2 Donor 108

## There were 12, now there are 4 samples.
##           Length Class      Mode
## sh_vs_chr 112    data.frame list
##                 hgncsymbol ensembltranscriptid   ensemblgeneid
## ENSG00000064300       NGFR     ENST00000172229 ENSG00000064300
## ENSG00000177675    CD163L1     ENST00000313599 ENSG00000177675
## ENSG00000115414        FN1     ENST00000323926 ENSG00000115414
## ENSG00000182853       VMO1     ENST00000328739 ENSG00000182853
## ENSG00000110077     MS4A6A     ENST00000412309 ENSG00000110077
## ENSG00000129538     RNASE1     ENST00000340900 ENSG00000129538
##                                                                                    description
## ENSG00000064300                nerve growth factor receptor [Source:HGNC Symbol;Acc:HGNC:7809]
## ENSG00000177675                      CD163 molecule like 1 [Source:HGNC Symbol;Acc:HGNC:30375]
## ENSG00000115414                               fibronectin 1 [Source:HGNC Symbol;Acc:HGNC:3778]
## ENSG00000182853   vitelline membrane outer layer 1 homolog [Source:HGNC Symbol;Acc:HGNC:30387]
## ENSG00000110077            membrane spanning 4-domains A6A [Source:HGNC Symbol;Acc:HGNC:13375]
## ENSG00000129538 ribonuclease A family member 1, pancreatic [Source:HGNC Symbol;Acc:HGNC:10044]
##                    genebiotype found   adc adipocytes astrocytes bcells
## ENSG00000064300 protein_coding     0 FALSE      FALSE      FALSE  FALSE
## ENSG00000177675 protein_coding FALSE FALSE      FALSE      FALSE  FALSE
## ENSG00000115414 protein_coding     0 FALSE      FALSE       TRUE  FALSE
## ENSG00000182853 protein_coding FALSE FALSE      FALSE      FALSE  FALSE
## ENSG00000110077 protein_coding     0 FALSE      FALSE      FALSE  FALSE
## ENSG00000129538 protein_coding FALSE FALSE      FALSE      FALSE  FALSE
##                 basophils cd4.memory.tcells cd4.naive.tcells cd4.tcells
## ENSG00000064300     FALSE             FALSE            FALSE      FALSE
## ENSG00000177675     FALSE             FALSE            FALSE      FALSE
## ENSG00000115414     FALSE             FALSE            FALSE      FALSE
## ENSG00000182853     FALSE             FALSE            FALSE      FALSE
## ENSG00000110077     FALSE             FALSE            FALSE      FALSE
## ENSG00000129538     FALSE             FALSE            FALSE      FALSE
##                 cd4.tcm cd4.tem cd8.naive.tcells cd8.tcells cd8.tcm
## ENSG00000064300   FALSE   FALSE            FALSE      FALSE   FALSE
## ENSG00000177675   FALSE   FALSE            FALSE      FALSE   FALSE
## ENSG00000115414   FALSE   FALSE            FALSE      FALSE   FALSE
## ENSG00000182853   FALSE   FALSE            FALSE      FALSE   FALSE
## ENSG00000110077   FALSE   FALSE            FALSE      FALSE   FALSE
## ENSG00000129538   FALSE   FALSE            FALSE      FALSE   FALSE
##                 cd8.tem   cdc chondrocytes classswitched.memory.bcells
## ENSG00000064300   FALSE FALSE        FALSE                       FALSE
## ENSG00000177675   FALSE FALSE        FALSE                       FALSE
## ENSG00000115414   FALSE FALSE        FALSE                       FALSE
## ENSG00000182853   FALSE FALSE        FALSE                       FALSE
## ENSG00000110077   FALSE FALSE        FALSE                       FALSE
## ENSG00000129538   FALSE FALSE        FALSE                       FALSE
##                   clp   cmp    dc endothelial.cells eosinophils
## ENSG00000064300 FALSE FALSE FALSE             FALSE       FALSE
## ENSG00000177675 FALSE FALSE FALSE             FALSE       FALSE
## ENSG00000115414 FALSE FALSE FALSE             FALSE       FALSE
## ENSG00000182853 FALSE FALSE FALSE             FALSE       FALSE
## ENSG00000110077 FALSE FALSE  TRUE             FALSE       FALSE
## ENSG00000129538 FALSE FALSE FALSE             FALSE       FALSE
##                 epithelial.cells erythrocytes fibroblasts   gmp
## ENSG00000064300            FALSE        FALSE       FALSE FALSE
## ENSG00000177675            FALSE        FALSE       FALSE FALSE
## ENSG00000115414            FALSE        FALSE       FALSE FALSE
## ENSG00000182853            FALSE        FALSE       FALSE FALSE
## ENSG00000110077            FALSE        FALSE       FALSE FALSE
## ENSG00000129538            FALSE        FALSE       FALSE FALSE
##                 hepatocytes   hsc   idc keratinocytes ly.endothelial.cells
## ENSG00000064300       FALSE FALSE FALSE          TRUE                FALSE
## ENSG00000177675       FALSE FALSE FALSE         FALSE                FALSE
## ENSG00000115414       FALSE FALSE FALSE         FALSE                FALSE
## ENSG00000182853       FALSE FALSE FALSE         FALSE                FALSE
## ENSG00000110077       FALSE FALSE FALSE         FALSE                FALSE
## ENSG00000129538       FALSE FALSE FALSE         FALSE                FALSE
##                 macrophages macrophages.m1 macrophages.m2 mast.cells
## ENSG00000064300       FALSE          FALSE          FALSE      FALSE
## ENSG00000177675       FALSE          FALSE          FALSE      FALSE
## ENSG00000115414       FALSE          FALSE          FALSE      FALSE
## ENSG00000182853       FALSE          FALSE          FALSE      FALSE
## ENSG00000110077        TRUE          FALSE          FALSE      FALSE
## ENSG00000129538       FALSE          FALSE          FALSE      FALSE
##                 megakaryocytes melanocytes memory.bcells   mep
## ENSG00000064300          FALSE       FALSE         FALSE FALSE
## ENSG00000177675          FALSE       FALSE         FALSE FALSE
## ENSG00000115414          FALSE       FALSE         FALSE FALSE
## ENSG00000182853          FALSE       FALSE         FALSE FALSE
## ENSG00000110077          FALSE       FALSE         FALSE FALSE
## ENSG00000129538          FALSE       FALSE         FALSE FALSE
##                 mesangial.cells monocytes   mpp   msc mv.endothelial.cells
## ENSG00000064300           FALSE     FALSE FALSE FALSE                FALSE
## ENSG00000177675           FALSE     FALSE FALSE FALSE                FALSE
## ENSG00000115414            TRUE     FALSE FALSE FALSE                FALSE
## ENSG00000182853           FALSE     FALSE FALSE FALSE                FALSE
## ENSG00000110077           FALSE      TRUE FALSE FALSE                FALSE
## ENSG00000129538           FALSE     FALSE FALSE FALSE                FALSE
##                 myocytes naive.bcells neurons neutrophils nk.cells   nkt
## ENSG00000064300    FALSE        FALSE   FALSE       FALSE    FALSE FALSE
## ENSG00000177675    FALSE        FALSE   FALSE       FALSE    FALSE FALSE
## ENSG00000115414    FALSE        FALSE   FALSE       FALSE    FALSE FALSE
## ENSG00000182853    FALSE        FALSE   FALSE       FALSE    FALSE FALSE
## ENSG00000110077    FALSE        FALSE   FALSE       FALSE    FALSE FALSE
## ENSG00000129538    FALSE        FALSE   FALSE       FALSE    FALSE FALSE
##                 osteoblast   pdc pericytes plasma.cells platelets
## ENSG00000064300      FALSE FALSE     FALSE        FALSE     FALSE
## ENSG00000177675      FALSE FALSE     FALSE        FALSE     FALSE
## ENSG00000115414      FALSE FALSE     FALSE        FALSE     FALSE
## ENSG00000182853      FALSE FALSE     FALSE        FALSE     FALSE
## ENSG00000110077      FALSE FALSE     FALSE        FALSE     FALSE
## ENSG00000129538      FALSE FALSE     FALSE        FALSE     FALSE
##                 preadipocytes pro.bcells sebocytes skeletal.muscle
## ENSG00000064300         FALSE      FALSE     FALSE           FALSE
## ENSG00000177675         FALSE      FALSE     FALSE           FALSE
## ENSG00000115414         FALSE      FALSE     FALSE           FALSE
## ENSG00000182853         FALSE      FALSE     FALSE           FALSE
## ENSG00000110077         FALSE      FALSE     FALSE           FALSE
## ENSG00000129538         FALSE      FALSE     FALSE           FALSE
##                 smooth.muscle tgd.cells th1.cells th2.cells tregs
## ENSG00000064300         FALSE     FALSE     FALSE     FALSE FALSE
## ENSG00000177675         FALSE     FALSE     FALSE     FALSE FALSE
## ENSG00000115414         FALSE     FALSE     FALSE     FALSE FALSE
## ENSG00000182853         FALSE     FALSE     FALSE     FALSE FALSE
## ENSG00000110077         FALSE     FALSE     FALSE     FALSE FALSE
## ENSG00000129538         FALSE     FALSE     FALSE     FALSE FALSE
##                 xcelltypes deseq_logfc deseq_adjp edger_logfc edger_adjp
## ENSG00000064300      FALSE       8.039  1.0000000       8.578  1.240e-03
## ENSG00000177675      FALSE       2.888  0.4430000       2.836  7.689e-02
## ENSG00000115414      FALSE       2.767  0.0007941       2.763  1.530e-17
## ENSG00000182853      FALSE       2.481  0.4104000       2.437  2.151e-03
## ENSG00000110077      FALSE       2.435  0.2503000       2.406  1.224e-02
## ENSG00000129538      FALSE       2.175  0.2069000       2.157  1.677e-03
##                 limma_logfc limma_adjp basic_nummed basic_denmed
## ENSG00000064300       3.803     0.8713      -0.5145      -4.2780
## ENSG00000177675       2.037     0.8326       0.6936      -1.3700
## ENSG00000115414       2.732     0.1784       7.6410       4.8970
## ENSG00000182853       2.200     0.3871       1.1890      -0.9205
## ENSG00000110077       2.041     0.7394       1.4840      -0.5330
## ENSG00000129538       2.004     0.4144       1.7290      -0.2478
##                 basic_numvar basic_denvar basic_logfc basic_t   basic_p
## ENSG00000064300    2.832e+01    4.880e-12       3.763   1.000 5.000e-01
## ENSG00000177675    4.072e+00    1.256e+00       2.063   1.264 3.624e-01
## ENSG00000115414    4.896e-01    2.920e-01       2.744   4.389 5.383e-02
## ENSG00000182853    8.482e-02    7.009e-02       2.109   7.579 1.740e-02
## ENSG00000110077    1.208e+00    1.626e-01       2.017   2.437 2.038e-01
## ENSG00000129538    2.227e-01    4.880e-12       1.976   5.922 1.065e-01
##                 basic_adjp deseq_basemean deseq_lfcse deseq_stat   deseq_p
## ENSG00000064300  9.837e-01          23.77      4.7870      1.679 9.311e-02
## ENSG00000177675  9.837e-01          14.09      1.0450      2.765 5.691e-03
## ENSG00000115414  9.837e-01        1192.00      0.5868      4.715 2.416e-06
## ENSG00000182853  9.837e-01          12.84      0.8724      2.844 4.460e-03
## ENSG00000110077  9.837e-01          18.65      0.7974      3.053 2.263e-03
## ENSG00000129538  9.837e-01          20.27      0.6950      3.130 1.749e-03
##                 ebseq_fc ebseq_logfc ebseq_postfc ebseq_mean ebseq_ppee
## ENSG00000064300 4761.911      12.217       78.015      23.80   0.000000
## ENSG00000177675    7.655       2.936        6.609      14.10   0.902426
## ENSG00000115414    6.919       2.791        6.907    1197.58   0.016757
## ENSG00000182853    5.709       2.513        5.069      12.94   1.000000
## ENSG00000110077    5.511       2.462        5.079      18.71   0.739878
## ENSG00000129538    4.563       2.190        4.290      20.38   0.006923
##                 ebseq_ppde ebseq_adjp edger_logcpm edger_lr   edger_p
## ENSG00000064300  0.000e+00   0.000000       1.3850    20.38 6.333e-06
## ENSG00000177675  9.757e-02   0.902426       0.7071    10.55 1.162e-03
## ENSG00000115414  9.832e-01   0.016757       6.9110    91.21 1.292e-21
## ENSG00000182853  1.532e-08   1.000000       0.5701    19.11 1.235e-05
## ENSG00000110077  2.601e-01   0.739878       1.0610    14.98 1.086e-04
## ENSG00000129538  9.931e-01   0.006923       1.1630    19.76 8.779e-06
##                 limma_ave limma_t limma_b   limma_p limma_adjp_fdr
## ENSG00000064300 -2.497000   1.119  -4.593 0.3030000      8.713e-01
## ENSG00000177675 -0.445500   1.652  -4.324 0.1462000      8.329e-01
## ENSG00000115414  6.193000   7.205   1.060 0.0002613      1.784e-01
## ENSG00000182853 -0.002466   5.044  -2.515 0.0019070      3.870e-01
## ENSG00000110077  0.378200   2.838  -3.417 0.0274500      7.393e-01
## ENSG00000129538  0.650500   4.729  -2.278 0.0026710      4.144e-01
##                 deseq_adjp_fdr edger_adjp_fdr basic_adjp_fdr lfc_meta
## ENSG00000064300      1.000e+00      1.240e-03      9.837e-01    8.308
## ENSG00000177675      4.434e-01      7.689e-02      9.837e-01    2.613
## ENSG00000115414      7.949e-04      1.530e-17      9.837e-01    3.215
## ENSG00000182853      4.108e-01      2.151e-03      9.837e-01    2.459
## ENSG00000110077      2.505e-01      1.225e-02      9.837e-01    2.332
## ENSG00000129538      2.072e-01      1.677e-03      9.837e-01    2.158
##                   lfc_var lfc_varbymed    p_meta     p_var
## ENSG00000064300 0.000e+00    0.000e+00 1.320e-01 2.409e-02
## ENSG00000177675 1.855e-01    7.098e-02 5.102e-02 6.800e-03
## ENSG00000115414 6.066e-01    1.887e-01 8.791e-05 2.255e-08
## ENSG00000182853 0.000e+00    0.000e+00 2.126e-03 4.982e-06
## ENSG00000110077 2.359e-02    1.011e-02 9.941e-03 2.311e-04
## ENSG00000129538 9.321e-03    4.319e-03 1.476e-03 1.828e-06

4.3 Donor 110

## There were 12, now there are 4 samples.
##           Length Class      Mode
## sh_vs_chr 112    data.frame list
##                 hgncsymbol ensembltranscriptid   ensemblgeneid
## ENSG00000064300       NGFR     ENST00000172229 ENSG00000064300
## ENSG00000077063    CTTNBP2     ENST00000160373 ENSG00000077063
## ENSG00000124491      F13A1     ENST00000264870 ENSG00000124491
## ENSG00000130558      OLFM1     ENST00000252854 ENSG00000130558
## ENSG00000157168       NRG1     ENST00000287842 ENSG00000157168
## ENSG00000121807       CCR2     ENST00000292301 ENSG00000121807
##                                                                        description
## ENSG00000064300    nerve growth factor receptor [Source:HGNC Symbol;Acc:HGNC:7809]
## ENSG00000077063    cortactin binding protein 2 [Source:HGNC Symbol;Acc:HGNC:15679]
## ENSG00000124491 coagulation factor XIII A chain [Source:HGNC Symbol;Acc:HGNC:3531]
## ENSG00000130558                 olfactomedin 1 [Source:HGNC Symbol;Acc:HGNC:17187]
## ENSG00000157168                    neuregulin 1 [Source:HGNC Symbol;Acc:HGNC:7997]
## ENSG00000121807  C-C motif chemokine receptor 2 [Source:HGNC Symbol;Acc:HGNC:1603]
##                    genebiotype found   adc adipocytes astrocytes bcells
## ENSG00000064300 protein_coding     0 FALSE      FALSE      FALSE  FALSE
## ENSG00000077063 protein_coding FALSE FALSE      FALSE      FALSE  FALSE
## ENSG00000124491 protein_coding     0 FALSE      FALSE      FALSE  FALSE
## ENSG00000130558 protein_coding FALSE FALSE      FALSE      FALSE  FALSE
## ENSG00000157168 protein_coding FALSE FALSE      FALSE      FALSE  FALSE
## ENSG00000121807 protein_coding     0 FALSE      FALSE      FALSE  FALSE
##                 basophils cd4.memory.tcells cd4.naive.tcells cd4.tcells
## ENSG00000064300     FALSE             FALSE            FALSE      FALSE
## ENSG00000077063     FALSE             FALSE            FALSE      FALSE
## ENSG00000124491     FALSE             FALSE            FALSE      FALSE
## ENSG00000130558     FALSE             FALSE            FALSE      FALSE
## ENSG00000157168     FALSE             FALSE            FALSE      FALSE
## ENSG00000121807     FALSE             FALSE            FALSE       TRUE
##                 cd4.tcm cd4.tem cd8.naive.tcells cd8.tcells cd8.tcm
## ENSG00000064300   FALSE   FALSE            FALSE      FALSE   FALSE
## ENSG00000077063   FALSE   FALSE            FALSE      FALSE   FALSE
## ENSG00000124491   FALSE   FALSE            FALSE      FALSE   FALSE
## ENSG00000130558   FALSE   FALSE            FALSE      FALSE   FALSE
## ENSG00000157168   FALSE   FALSE            FALSE      FALSE   FALSE
## ENSG00000121807   FALSE    TRUE            FALSE      FALSE   FALSE
##                 cd8.tem   cdc chondrocytes classswitched.memory.bcells
## ENSG00000064300   FALSE FALSE        FALSE                       FALSE
## ENSG00000077063   FALSE FALSE        FALSE                       FALSE
## ENSG00000124491   FALSE FALSE        FALSE                       FALSE
## ENSG00000130558   FALSE FALSE        FALSE                       FALSE
## ENSG00000157168   FALSE FALSE        FALSE                       FALSE
## ENSG00000121807   FALSE FALSE        FALSE                       FALSE
##                   clp   cmp    dc endothelial.cells eosinophils
## ENSG00000064300 FALSE FALSE FALSE             FALSE       FALSE
## ENSG00000077063 FALSE FALSE FALSE             FALSE       FALSE
## ENSG00000124491 FALSE FALSE  TRUE             FALSE       FALSE
## ENSG00000130558 FALSE FALSE FALSE             FALSE       FALSE
## ENSG00000157168 FALSE FALSE FALSE             FALSE       FALSE
## ENSG00000121807 FALSE FALSE FALSE             FALSE       FALSE
##                 epithelial.cells erythrocytes fibroblasts   gmp
## ENSG00000064300            FALSE        FALSE       FALSE FALSE
## ENSG00000077063            FALSE        FALSE       FALSE FALSE
## ENSG00000124491            FALSE        FALSE       FALSE FALSE
## ENSG00000130558            FALSE        FALSE       FALSE FALSE
## ENSG00000157168            FALSE        FALSE       FALSE FALSE
## ENSG00000121807            FALSE        FALSE       FALSE FALSE
##                 hepatocytes   hsc   idc keratinocytes ly.endothelial.cells
## ENSG00000064300       FALSE FALSE FALSE          TRUE                FALSE
## ENSG00000077063       FALSE FALSE FALSE         FALSE                FALSE
## ENSG00000124491       FALSE FALSE  TRUE         FALSE                FALSE
## ENSG00000130558       FALSE FALSE FALSE         FALSE                FALSE
## ENSG00000157168       FALSE FALSE FALSE         FALSE                FALSE
## ENSG00000121807       FALSE FALSE FALSE         FALSE                FALSE
##                 macrophages macrophages.m1 macrophages.m2 mast.cells
## ENSG00000064300       FALSE          FALSE          FALSE      FALSE
## ENSG00000077063       FALSE          FALSE          FALSE      FALSE
## ENSG00000124491       FALSE          FALSE          FALSE      FALSE
## ENSG00000130558       FALSE          FALSE          FALSE      FALSE
## ENSG00000157168       FALSE          FALSE          FALSE      FALSE
## ENSG00000121807       FALSE          FALSE          FALSE      FALSE
##                 megakaryocytes melanocytes memory.bcells   mep
## ENSG00000064300          FALSE       FALSE         FALSE FALSE
## ENSG00000077063          FALSE       FALSE         FALSE FALSE
## ENSG00000124491          FALSE       FALSE         FALSE FALSE
## ENSG00000130558          FALSE       FALSE         FALSE FALSE
## ENSG00000157168          FALSE       FALSE         FALSE FALSE
## ENSG00000121807          FALSE       FALSE         FALSE FALSE
##                 mesangial.cells monocytes   mpp   msc mv.endothelial.cells
## ENSG00000064300           FALSE     FALSE FALSE FALSE                FALSE
## ENSG00000077063           FALSE     FALSE FALSE FALSE                FALSE
## ENSG00000124491           FALSE      TRUE FALSE FALSE                FALSE
## ENSG00000130558           FALSE     FALSE FALSE FALSE                FALSE
## ENSG00000157168           FALSE     FALSE FALSE FALSE                FALSE
## ENSG00000121807           FALSE      TRUE FALSE FALSE                FALSE
##                 myocytes naive.bcells neurons neutrophils nk.cells   nkt
## ENSG00000064300    FALSE        FALSE   FALSE       FALSE    FALSE FALSE
## ENSG00000077063    FALSE        FALSE   FALSE       FALSE    FALSE FALSE
## ENSG00000124491    FALSE        FALSE   FALSE       FALSE    FALSE FALSE
## ENSG00000130558    FALSE        FALSE   FALSE       FALSE    FALSE FALSE
## ENSG00000157168    FALSE        FALSE   FALSE       FALSE    FALSE FALSE
## ENSG00000121807    FALSE        FALSE   FALSE       FALSE    FALSE FALSE
##                 osteoblast   pdc pericytes plasma.cells platelets
## ENSG00000064300      FALSE FALSE     FALSE        FALSE     FALSE
## ENSG00000077063      FALSE FALSE     FALSE        FALSE     FALSE
## ENSG00000124491      FALSE FALSE     FALSE        FALSE      TRUE
## ENSG00000130558      FALSE FALSE     FALSE        FALSE     FALSE
## ENSG00000157168      FALSE FALSE     FALSE        FALSE     FALSE
## ENSG00000121807      FALSE  TRUE     FALSE        FALSE     FALSE
##                 preadipocytes pro.bcells sebocytes skeletal.muscle
## ENSG00000064300         FALSE      FALSE     FALSE           FALSE
## ENSG00000077063         FALSE      FALSE     FALSE           FALSE
## ENSG00000124491         FALSE      FALSE     FALSE           FALSE
## ENSG00000130558         FALSE      FALSE     FALSE           FALSE
## ENSG00000157168         FALSE      FALSE     FALSE           FALSE
## ENSG00000121807         FALSE      FALSE     FALSE           FALSE
##                 smooth.muscle tgd.cells th1.cells th2.cells tregs
## ENSG00000064300         FALSE     FALSE     FALSE     FALSE FALSE
## ENSG00000077063         FALSE     FALSE     FALSE     FALSE FALSE
## ENSG00000124491         FALSE     FALSE     FALSE     FALSE FALSE
## ENSG00000130558         FALSE     FALSE     FALSE     FALSE FALSE
## ENSG00000157168         FALSE     FALSE     FALSE     FALSE FALSE
## ENSG00000121807         FALSE      TRUE     FALSE     FALSE FALSE
##                 xcelltypes deseq_logfc deseq_adjp edger_logfc edger_adjp
## ENSG00000064300      FALSE       5.325  1.000e+00       5.238  2.057e-03
## ENSG00000077063      FALSE       2.757  1.000e+00       2.706  1.547e-07
## ENSG00000124491      FALSE       2.293  1.000e+00       2.270  2.290e-03
## ENSG00000130558      FALSE       2.253  1.000e+00       2.238  2.464e-14
## ENSG00000157168      FALSE       2.076  1.000e+00       2.060  3.860e-05
## ENSG00000121807      FALSE       1.760  5.746e-16       1.745  3.410e-27
##                 limma_logfc limma_adjp basic_nummed basic_denmed
## ENSG00000064300       2.646   0.525200       0.4877      -2.3320
## ENSG00000077063       2.744   0.029070       1.5470      -1.1610
## ENSG00000124491       1.743   0.222700       2.4700       0.6189
## ENSG00000130558       2.293   0.015510       3.0130       0.7146
## ENSG00000157168       2.126   0.037900       1.2910      -0.7716
## ENSG00000121807       1.796   0.003128       5.0380       3.2410
##                 basic_numvar basic_denvar basic_logfc basic_t   basic_p
## ENSG00000064300    2.476e+01    9.780e-01       2.819  0.7859 5.680e-01
## ENSG00000077063    1.672e-01    1.626e-01       2.708  6.6680 2.177e-02
## ENSG00000124491    3.142e+00    5.565e-02       1.852  1.4640 3.755e-01
## ENSG00000130558    2.851e-03    1.379e-01       2.298  8.6650 6.745e-02
## ENSG00000157168    8.629e-05    4.436e-01       2.062  4.3790 1.429e-01
## ENSG00000121807    8.491e-03    1.296e-03       1.798 25.7000 1.023e-02
##                 basic_adjp deseq_basemean deseq_lfcse deseq_stat   deseq_p
## ENSG00000064300  7.385e-01          55.86      2.5290      2.106 3.521e-02
## ENSG00000077063  5.622e-01          23.64      0.6570      4.197 2.706e-05
## ENSG00000124491  6.216e-01          63.37      1.1120      2.062 3.919e-02
## ENSG00000130558  5.622e-01          66.83      0.3795      5.937 2.894e-09
## ENSG00000157168  5.622e-01          21.13      0.6503      3.193 1.407e-03
## ENSG00000121807  5.622e-01         295.30      0.1972      8.923 4.544e-19
##                 ebseq_fc ebseq_logfc ebseq_postfc ebseq_mean ebseq_ppee
## ENSG00000064300   43.692       5.449       35.040      59.07  7.570e-03
## ENSG00000077063    7.146       2.837        6.522      24.20  4.028e-07
## ENSG00000124491    5.230       2.387        5.100      65.75  7.709e-01
## ENSG00000130558    4.905       2.294        4.795      67.98  7.438e-15
## ENSG00000157168    4.290       2.101        4.039      21.48  1.000e+00
## ENSG00000121807    3.523       1.817        3.510     299.77  0.000e+00
##                 ebseq_ppde ebseq_adjp edger_logcpm edger_lr   edger_p
## ENSG00000064300  9.924e-01  7.570e-03       1.8820    15.57 7.936e-05
## ENSG00000077063  1.000e+00  4.028e-07       0.7988    38.20 6.400e-10
## ENSG00000124491  2.291e-01  7.709e-01       2.1230    15.29 9.223e-05
## ENSG00000130558  1.000e+00  7.438e-15       2.2510    71.88 2.289e-17
## ENSG00000157168  6.371e-07  1.000e+00       0.6714    25.24 5.052e-07
## ENSG00000121807  1.000e+00  0.000e+00       4.3840   133.10 8.637e-31
##                 limma_ave limma_t limma_b   limma_p limma_adjp_fdr
## ENSG00000064300   -1.0500   1.012 -4.8300 3.425e-01      5.252e-01
## ENSG00000077063    0.1028   6.676 -0.5113 1.973e-04      2.907e-02
## ENSG00000124491    1.4850   2.032 -4.0750 7.850e-02      2.227e-01
## ENSG00000130558    1.8050   9.349  1.7790 1.965e-05      1.552e-02
## ENSG00000157168    0.1839   5.688 -0.8544 5.546e-04      3.790e-02
## ENSG00000121807    4.0770  14.020  5.1590 1.056e-06      3.127e-03
##                 deseq_adjp_fdr edger_adjp_fdr basic_adjp_fdr lfc_meta
## ENSG00000064300      2.286e-01      2.057e-03      7.384e-01    4.432
## ENSG00000077063      1.667e-03      1.547e-07      5.620e-01    3.582
## ENSG00000124491      2.418e-01      2.290e-03      6.216e-01    2.105
## ENSG00000130558      1.008e-06      2.465e-14      5.620e-01    2.258
## ENSG00000157168      3.168e-02      3.860e-05      5.620e-01    2.127
## ENSG00000121807      7.688e-16      3.410e-27      5.620e-01    1.858
##                   lfc_var lfc_varbymed    p_meta     p_var
## ENSG00000064300 2.168e+00    4.891e-01 1.259e-01 3.549e-02
## ENSG00000077063 2.168e+00    6.052e-01 7.479e-05 1.144e-08
## ENSG00000124491 9.328e-02    4.431e-02 3.926e-02 1.537e-03
## ENSG00000130558 4.320e-04    1.914e-04 6.551e-06 1.287e-10
## ENSG00000157168 1.050e-02    4.937e-03 6.540e-04 5.020e-07
## ENSG00000121807 3.318e-02    1.786e-02 3.520e-07 3.717e-13

The above plots suggest, along with the PCA plots of all samples, that one or more strains are either switched or at least very problematic. Specifically, samples from the strains annotated 2504 and 2272. Therefore, we next embarked on a series of comparisons of what happens when we remove each of them individually, and then both.

5 Remove samples from strain 2504 and/or 2272

This block will first remove strain 2504, then 2272. The resulting subsets will be used for another round of these differential expression analyses.

5.1 Create datasets

In this block we will perform the various removals, creating ‘remove_2504’, ‘remove_2272’, and ‘remove_both’. In addition, there are versions of this with and without the uninfected samples. We eventually decided to use the data with the uninfected samples for our final analyses; but we will have some pca etc. plots without them first because the uninfected make it harder to see the distributions because they are so very different than the infected.

## There were 12, now there are 12 samples.
## There were 12, now there are 12 samples.
## There were 12, now there are 12 samples.
## There were 15, now there are 15 samples.
## There were 15, now there are 15 samples.
## There were 15, now there are 15 samples.
## There were 12, now there are 4 samples.
## There were 12, now there are 4 samples.
## There were 12, now there are 4 samples.
## There were 12, now there are 4 samples.
## There were 12, now there are 4 samples.
## There were 12, now there are 4 samples.
## There were 12, now there are 4 samples.
## There were 12, now there are 4 samples.
## There were 12, now there are 4 samples.

6 Remove 2504 analyses

Strain 2504 was the first thing Hector focused upon, so let us perform a few metrics without it.

6.1 Remove 2504 initial plots

6.1.2 All donors, remove 2504 pairwise

Given the clustering of the samples after removing the 2504 strain samples, let us now perform the pairwise analysis and see how it looks.

Note that these are performed with the uninfected samples while the previous metrics were without them. This will include one round with batch in the model and one round using svaseq. In addition, we are relaxing the log fold-change and p-value constraints to 0.6 and 0.1 respectively.

6.1.2.1 DESeq MAplot, chronic vs self-healing all donors remove 2504

7 Remove 2272 analyses

This should be an exact repetition of the 2504 removal above, so I removed the commentary.

7.1 Remove 2272 initial plots

8 Remove both analyses

This should be an exact repetition of the 2504/2272 removals above, so I removed the commentary.

8.1 Remove both initial plots

8.1.2 All donors, remove both pairwise

##        change_counts_up change_counts_down
## sh_nil             1511               1012
## ch_nil             1568               1096
## ch_sh                43                 36
##        change_counts_up change_counts_down
## sh_nil              866                296
## ch_nil              953                401
## ch_sh                 4                 14

8.1.2.1 DESeq MAplot, chronic vs self-healing all donors remove both

9 Compare analyses

Now that we have performed a set of analyses looking at the various combinations of strains and donors, let us look at how similar are the distributions of logFC and rank orders.

9.1 Compare the donors to each other

## $sh_vs_chr
## $sh_vs_chr$logfc
## [1] 0.1951
## 
## $sh_vs_chr$p
## [1] 0.08561
## 
## $sh_vs_chr$adjp
## [1] 0.1286
## $sh_vs_chr
## $sh_vs_chr$logfc
## [1] 0.5934
## 
## $sh_vs_chr$p
## [1] 0.3445
## 
## $sh_vs_chr$adjp
## [1] 0.187
## $sh_vs_chr
## $sh_vs_chr$logfc
## [1] 0.06535
## 
## $sh_vs_chr$p
## [1] 0.1053
## 
## $sh_vs_chr$adjp
## [1] 0.09951

Wow I had forgotten how ridiculously different the 3 donors are.

9.2 Compare remove one vs remove both

9.2.1 Batch in model

## Testing method: deseq.
## Adding method: deseq to the set.
## $sh_nil
## $sh_nil$logfc
## [1] 1
## 
## $sh_nil$p
## [1] 1
## 
## $sh_nil$adjp
## [1] 1
## 
## 
## $ch_nil
## $ch_nil$logfc
## [1] 1
## 
## $ch_nil$p
## [1] 1
## 
## $ch_nil$adjp
## [1] 1
## 
## 
## $ch_sh
## $ch_sh$logfc
## [1] 1
## 
## $ch_sh$p
## [1] 1
## 
## $ch_sh$adjp
## [1] 1
## Testing method: deseq.
## Adding method: deseq to the set.
## $sh_nil
## $sh_nil$logfc
## [1] 1
## 
## $sh_nil$p
## [1] 1
## 
## $sh_nil$adjp
## [1] 1
## 
## 
## $ch_nil
## $ch_nil$logfc
## [1] 1
## 
## $ch_nil$p
## [1] 1
## 
## $ch_nil$adjp
## [1] 1
## 
## 
## $ch_sh
## $ch_sh$logfc
## [1] 1
## 
## $ch_sh$p
## [1] 1
## 
## $ch_sh$adjp
## [1] 1

9.2.2 sva

## Testing method: deseq.
## Adding method: deseq to the set.
## $sh_nil
## $sh_nil$logfc
## [1] 1
## 
## $sh_nil$p
## [1] 1
## 
## $sh_nil$adjp
## [1] 1
## 
## 
## $ch_nil
## $ch_nil$logfc
## [1] 1
## 
## $ch_nil$p
## [1] 1
## 
## $ch_nil$adjp
## [1] 1
## 
## 
## $ch_sh
## $ch_sh$logfc
## [1] 1
## 
## $ch_sh$p
## [1] 1
## 
## $ch_sh$adjp
## [1] 1
## Testing method: deseq.
## Adding method: deseq to the set.
## $sh_nil
## $sh_nil$logfc
## [1] 1
## 
## $sh_nil$p
## [1] 1
## 
## $sh_nil$adjp
## [1] 1
## 
## 
## $ch_nil
## $ch_nil$logfc
## [1] 1
## 
## $ch_nil$p
## [1] 1
## 
## $ch_nil$adjp
## [1] 1
## 
## 
## $ch_sh
## $ch_sh$logfc
## [1] 1
## 
## $ch_sh$p
## [1] 1
## 
## $ch_sh$adjp
## [1] 1

9.3 Compare remove both against all samples

9.3.1 Batch in the model

## $sh_nil
## $sh_nil$logfc
## [1] 1
## 
## $sh_nil$p
## [1] 1
## 
## $sh_nil$adjp
## [1] 1
## 
## 
## $ch_nil
## $ch_nil$logfc
## [1] 1
## 
## $ch_nil$p
## [1] 1
## 
## $ch_nil$adjp
## [1] 1
## 
## 
## $ch_sh
## $ch_sh$logfc
## [1] 1
## 
## $ch_sh$p
## [1] 1
## 
## $ch_sh$adjp
## [1] 1

9.3.2 sva

## $sh_nil
## $sh_nil$logfc
## [1] 1
## 
## $sh_nil$p
## [1] 1
## 
## $sh_nil$adjp
## [1] 1
## 
## 
## $ch_nil
## $ch_nil$logfc
## [1] 1
## 
## $ch_nil$p
## [1] 1
## 
## $ch_nil$adjp
## [1] 1
## 
## 
## $ch_sh
## $ch_sh$logfc
## [1] 1
## 
## $ch_sh$p
## [1] 1
## 
## $ch_sh$adjp
## [1] 1

10 Try again on the parasite data

10.1 Remember our data set

## This function will replace the expt$expressionset slot with:
## log2(cpm(quant(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
## Filter is false, this should likely be set to something, good
##  choices include cbcb, kofa, pofa (anything but FALSE).  If you want this to
##  stay FALSE, keep in mind that if other normalizations are performed, then the
##  resulting libsizes are likely to be strange (potentially negative!)
## 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: not doing count filtering.
## Step 2: normalizing the data with quant.
## Using normalize.quantiles.robust due to a thread error in preprocessCore.
## Step 3: converting the data with cpm.
## Step 4: transforming the data with log2.
## transform_counts: Found 40 values equal to 0, adding 1 to the matrix.
## Step 5: not doing batch correction.

Oh yeah, I remember now, the primary difference when looking at the parasite samples is one which matches the variant pattern. Thus, if one looks at the clustering observed in the parasite data, one will find the same pattern observed in 04_variants.Rmd, where the samples on one side of the hclust cladogram are on one side of the PCA and vice versa.

This does not bode well for our ability to use differential expression anayses in order to find parasite strain differences between chronic/self-healing; but it is great if we want to see differences between one family of strains and the other; sadly both families have self-healing and chronic members.

LS0tCnRpdGxlOiAiTC4gcGFuYW1lbnNpcyAyMDE5MDIwNTogRGlmZmVyZW50aWFsIEV4cHJlc3Npb24gb2YgaW5mZWN0ZWQgUEJNQ3MuIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRoZW1lOiByZWFkYWJsZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB3aWR0aDogMzAwCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCiAgQmlvY1N0eWxlOjpodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBzaG93CiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBrZWVwX21kOiBmYWxzZQogICAgbW9kZTogc2VsZmNvbnRhaW5lZAogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KYm9keSwgdGQgewogIGZvbnQtc2l6ZTogMTZweDsKfQpjb2RlLnJ7CiAgZm9udC1zaXplOiAxNnB4Owp9CnByZSB7CiBmb250LXNpemU6IDE2cHgKfQo8L3N0eWxlPgoKYGBge3Igb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSgiaHBnbHRvb2xzIikKdHQgPC0gZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L2hwZ2x0b29scyIpCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHByb2dyZXNzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgd2lkdGg9MTIwLAogICAgICAgICAgICAgICAgICAgICBlY2hvPVRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoPTgsCiAgICAgICAgICAgICAgICAgICAgICBmaWcuaGVpZ2h0PTgsCiAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzPTQsCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICBrbml0ci5kdXBsaWNhdGUubGFiZWw9ImFsbG93IikKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZT0xMCkpCnJ1bmRhdGUgPC0gZm9ybWF0KFN5cy5EYXRlKCksIGZvcm1hdD0iJVklbSVkIikKcHJldmlvdXNfZmlsZSA8LSAiMDJfZXN0aW1hdGlvbl9pbmZlY3Rpb25fMjAxOTAyMDUuUm1kIgp2ZXIgPC0gIjIwMTkwMjA1IgojIyBJIGFtIGxvYWRpbmcgZnJvbSBhIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIG1ldHJpY3MgZmlsZS4KCnRtcCA8LSBsb2FkbWUoZmlsZW5hbWU9cGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1wcmV2aW91c19maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpKQpybWRfZmlsZSA8LSAiMDNfZXhwcmVzc2lvbl9pbmZlY3Rpb25fMjAxOTAyMDUuUm1kIgpgYGAKCiMgUEJNQyBJbmZlY3Rpb24gRGlmZmVyZW50aWFsIEV4cHJlc3Npb24sIEluZmVjdGlvbjogYHIgdmVyYCBSdW5kYXRlOiBgciBydW5kYXRlYAoKVGhpcyBkb2N1bWVudCB0dXJucyB0byB0aGUgaW5mZWN0aW9uIG9mIFBCTUMgY2VsbHMgd2l0aCBMLnBhbmFtZW5zaXMuICBUaGlzIGRhdGEKaXMgcGFydGljdWxhcmx5IHN0cmFuZ2VseSBhZmZlY3RlZCBieSB0aGUgZGlmZmVyZW50IHN0cmFpbnMgdXNlZCB0byBpbmZlY3QgdGhlCmNlbGxzLCBhbmQgYXMgYSByZXN1bHQgaXMgYm90aCB1c2VmdWwgYW5kIHRyb3VibGluZy4KCkdpdmVuIHRoZSBvYnNlcnZhdGlvbnMgYWJvdmUsIHdlIGhhdmUgc29tZSBpZGVhcyBvZiB3YXlzIHRvIHBhc3MgdGhlIGRhdGEgZm9yCmRpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2VzIHdoaWNoIG1heSBvciBtYXkgbm90IGJlICdiZXR0ZXInLiAgTGV0cyB0cnkKc29tZSBhbmQgc2VlIHdoYXQgaGFwcGVucy4KCiMjIENyZWF0ZSBkYXRhIHNldHMgdG8gY29tcGFyZSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbiBhbmFseXNlcwoKR2l2ZW4gdGhlIGFib3ZlIHdheXMgdG8gbWFzc2FnZSB0aGUgZGF0YSwgbGV0cyB1c2UgYSBmZXcgb2YgdGhlbSBmb3IKbGltbWEvZGVzZXEvZWRnZXIuIFRoZSBtYWluIGNhdmVhdCBpbiB0aGlzIGlzIHRoYXQgdGhvc2UgdG9vbHMgcmVhbGx5IGRvIGV4cGVjdApzcGVjaWZpYyBkaXN0cmlidXRpb25zIG9mIGRhdGEgd2hpY2ggd2UgaG9ycmlibHkgdmlvbGF0ZSBpZiB3ZSB1c2UgbG9nMigpIGRhdGEsCndoaWNoIGlzIHdoeSBpbiB0aGUgcHJldmlvdXMgYmxvY2tzIEkgbmFtZWQgdGhlbSBsMmJsYWhibGFoLCB0aHVzIHdlIGNhbiBkbyB0aGUKc2FtZSBzZXRzIG9mIG5vcm1hbGl6YXRpb24gYnV0IHdpdGhvdXQgdGhhdCBhbmQgZm9yY2libHkgcHVzaCB0aGUgcmVzdWx0aW5nIGRhdGEKaW50byBsaW1tYS9lZGdlci9kZXNlcS4KCiMgVGhlIG5lZ2F0aXZlIGNvbnRyb2wKCkV2ZXJ5dGhpbmcgSSBkaWQgaW4gMDJfZXN0aW1hdGlvbl9pbmZlY3Rpb24uaHRtbCBzdWdnZXN0cyB0aGF0IHRoZXJlIGFyZSBubwpzaWduaWZpY2FudCBkaWZmZXJlbmNlcyB2aXNpYmxlIGlmIG9uZSBsb29rcyBqdXN0IGF0IGNocm9uaWMvc2VsZi1oZWFsaW5nIGluCnRoaXMgZGF0YS4gIEZ1cnRoZXIgdGVzdGluZyBoYXMgc2VlbWluZ2x5IHByb3ZlbiB0aGlzIHN0YXRlbWVudCwgYXMgYSByZXN1bHQKbW9zdCBvZiB0aGUgZm9sbG93aW5nIGFuYWx5c2VzIHdpbGwgbG9vayBhdCBjaHJvbmljL3VuaW5mZWN0ZWQgYW5kCnNlbGYtaGVhbGluZy91bmluZmVjdGVkIGZvbGxvd2VkIGJ5IGF0dGVtcHRzIHRvIHJlY29uY2lsZSB0aG9zZSByZXN1bHRzLgoKIyMgRmlsdGVyIHRoZSBkYXRhCgpUbyBzYXZlIHNvbWUgdGltZSBhbmQgYW5ub3lhbmNlIHdpdGggc3ZhLCBsZXRzIGZpbHRlciB0aGUgZGF0YSBub3cuICBJbgphZGRpdGlvbiwgd3JpdGUgZG93biBhIHNtYWxsIGZ1bmN0aW9uIHVzZWQgdG8gZXh0cmFjdCB0aGUgc2V0cyBvZiBzaWduaWZpY2FudApnZW5lcyBhY3Jvc3MgZGlmZmVyZW50IGNvbnRyYXN0cyAobm90YWJseSBzZWxmL3VuaW5mZWN0ZWQgdnMuIGNocm9uaWMvdW5pbmZlY3RlZCkuCgpgYGB7ciBmaWx0ZXJ9CmhzX2luZl9maWx0IDwtIHNtKG5vcm1hbGl6ZV9leHB0KGhzX2Nkc19pbmYsIGZpbHRlcj1UUlVFKSkKaHNfdW5pbmZfZmlsdCA8LSBzbShub3JtYWxpemVfZXhwdChoc19jZHNfdW5pbmYsIGZpbHRlcj1UUlVFKSkKa2VlcGVyc191bmluZiA8LSBsaXN0KCJzaF9uaWwiID0gYygic2giLCAidW5pbmYiKSwKICAgICAgICAgICAgICAgICAgICAgICJjaF9uaWwiID0gYygiY2hyIiwgInVuaW5mIiksCiAgICAgICAgICAgICAgICAgICAgICAiY2hfc2giID0gYygiY2hyIiwgInNoIikpCmtlZXBlcnNfaW5mIDwtIGxpc3QoImNoX3NoIiA9IGMoImNociIsICJzaCIpKQpgYGAKCiMgSW5pdGlhbCBhbmFseXNpcyB3aXRoIG5vIHJlbW92YWxzCgojIyBCYXRjaCBpbiBtb2RlbAoKYGBge3IgcGFpcndpc2VfYmF0Y2gsIGZpZy5zaG93PSJoaWRlIn0KaHNfcGFpcndpc2VfYmF0Y2ggPC0gc20oYWxsX3BhaXJ3aXNlKGhzX3VuaW5mX2ZpbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9iYXRjaD1UUlVFLCBkb19lYnNlcT1GQUxTRSkpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9wYXRiYXRjaF9jb250ci12e3Zlcn0ueGxzeCIpCmhzX2NvbWJpbmVkX2JhdGNoIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKAogIGhzX3BhaXJ3aXNlX2JhdGNoLAogIGV4Y2VsPWV4Y2VsX2ZpbGUsCiAga2VlcGVycz1rZWVwZXJzX3VuaW5mKSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1faHNfaW5mZWN0X3BhdGJhdGNoX3NpZy12e3Zlcn0ueGxzeCIpCmhzX3NpZ19iYXRjaCA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKAogIGhzX2NvbWJpbmVkX2JhdGNoLAogIGV4Y2VsPWV4Y2VsX2ZpbGUpKQpoc19zaWdfYmF0Y2hbWyJkZXNlcSJdXVtbImNvdW50cyJdXQpgYGAKCiMjIyBTaG93IGJhdGNoIGluIG1vZGVsIHBsb3RzCgojIyMjIERFU2VxIE1BcGxvdCwgc2VsZiBoZWFsaW5nIHZzIHVuaW5mZWN0ZWQKCmBgYHtyIHBhaXJ3aXNlX2JhdGNoX3Bsb3RzMDF9CmhzX2NvbWJpbmVkX2JhdGNoJGRlc2VxX21hX3Bsb3RzJHNoX25pbCRwbG8KaHNfY29tYmluZWRfYmF0Y2gkdmVubnMkc2hfbmlsJHVwX25vd2VpZ2h0CmBgYAoKIyMjIyBERVNlcSBNQXBsb3QsIGNocm9uaWMgdnMgdW5pbmZlY3RlZAoKYGBge3IgcGFpcndpc2VfYmF0Y2hfcGxvdHMwMn0KaHNfY29tYmluZWRfYmF0Y2gkZGVzZXFfbWFfcGxvdHMkY2hfbmlsJHBsb3QKaHNfY29tYmluZWRfYmF0Y2gkdmVubnMkY2hfbmlsJHVwX25vd2VpZ2h0CmBgYAoKIyMjIyBERVNlcSBNQXBsb3QsIGNocm9uaWMgdnMgc2VsZi1oZWFsaW5nCgpgYGB7ciBwYWlyd2lzZV9iYXRjaF9wbG90czAzfQpoc19jb21iaW5lZF9iYXRjaCRkZXNlcV9tYV9wbG90cyRjaF9zaCRwbG90CmhzX2NvbWJpbmVkX2JhdGNoJHZlbm5zJGNoX3NoJHVwX25vd2VpZ2h0CmBgYAoKIyMgc3ZhCgpgYGB7ciBwYWlyd2lzZV9zdmEsIGZpZy5zaG93PSJoaWRlIn0KaHNfcGFpcndpc2Vfc3ZhIDwtIHNtKGFsbF9wYWlyd2lzZShoc191bmluZl9maWx0LCBtb2RlbF9iYXRjaD0ic3Zhc2VxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19lYnNlcT1GQUxTRSkpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9zdmFfY29udHItdnt2ZXJ9Lnhsc3giKQpoc19jb21iaW5lZF9zdmEgPC0gc20oY29tYmluZV9kZV90YWJsZXMoCiAgaHNfcGFpcndpc2Vfc3ZhLAogIGV4Y2VsPWV4Y2VsX2ZpbGUsCiAga2VlcGVycz1rZWVwZXJzX3VuaW5mKSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1faHNfaW5mZWN0X3N2YV9zaWctdnt2ZXJ9Lnhsc3giKQpoc19zaWdfc3ZhIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoCiAgaHNfY29tYmluZWRfc3ZhLAogIGV4Y2VsPWV4Y2VsX2ZpbGUpKQpoc19zaWdfc3ZhJGRlc2VxJGNvdW50cwpgYGAKCkF0IHRoaXMgcG9pbnQsIHdlIHNob3VsZCBzZWUgdGhhdCB0aGVyZSBhcmUgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgYmV0d2Vlbgp0aGUgY2hyb25pYyBhbmQgc2VsZi1oZWFsaW5nIHNhbXBsZXMgd2hlbiB3ZSBsb29rIGF0IGFsbCBzYW1wbGVzLiAgVGhlIGZvbGxvd2luZwp3aWxsIGF0dGVtcHQgdG8gcXVlcnkgd2h5IHRoaXMgaXMgdGhlIGNhc2UgYW5kIGRlY2lkZSBvbiB3aGF0IHRvIGRvIGFib3V0IGl0LgoKIyBQLXZhbHVlIGRpc3RyaWJ1dGlvbnMgb24gYSBwZXItZG9ub3IgYmFzaXMKCldoaWxlIHNpdHRpbmcgd2l0aCBIZWN0b3IgaW4gMjAxODEyLCB3ZSBlbmRlZCB1cCBmb2N1c2luZyBvbiB0aGUgZGlzdHJpYnV0aW9uIG9mCnAtdmFsdWVzIG9ic2VydmVkIHdoZW4gcGVyZm9ybWluZyBhIGNocm9uaWMgdnMuIHNlbGYtaGVhbGluZyBjb21wYXJpc29uLiAgVGhpcwp3YXMgZXZlbnR1YWxseSBleHBhbmRlZCB0byBpbmNsdWRlIHRoYXQgZGlzdHJpYnV0aW9uIGZvciBlYWNoIG9mIHRoZSB0aHJlZQppbmRpdmlkdWFsIGRvbm9ycy4KCiMjIERvbm9yIDEwNwoKYGBge3IgZWFjaF9pbmRpdmlkdWFsXzEwN30KZDEwNyA8LSBzdWJzZXRfZXhwdChoc19pbmZfZmlsdCwgc3Vic2V0PSJkb25vcj09J2QxMDcnIikKZDEwN19wYWlyd2lzZSA8LSBzbShhbGxfcGFpcndpc2UoZDEwNywgbW9kZWxfYmF0Y2g9RkFMU0UpKQpkMTA3X3RhYmxlIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKGQxMDdfcGFpcndpc2UpKQpzdW1tYXJ5KGQxMDdfdGFibGUkZGF0YSkKZDEwN19zaWcgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhkMTA3X3RhYmxlLCBhY2NvcmRpbmdfdG89ImRlc2VxIiwgcD0wLjEsIHBfdHlwZT0icmF3IikpCmRpbShkMTA3X3NpZ1tbImRlc2VxIl1dW1sidXBzIl1dW1sxXV0pCmQxMDdfbWEgPC0gZXh0cmFjdF9kZV9wbG90cyhkMTA3X3BhaXJ3aXNlLCBsb2dmYz0wLjYsIHA9MC4xLCBwX3R5cGU9InJhdyIpCmQxMDdfbWEkbWEkcGxvdApwdmFsdWVzIDwtIHNtKHBsb3RfZGVfcHZhbHMoZDEwN190YWJsZVtbImRhdGEiXV1bWyJzaF92c19jaHIiXV0sIHR5cGU9ImRlc2VxIiwgcF90eXBlPSJyYXciKSkKcHZhbHVlcwpwbG90X3BjYShzbShub3JtYWxpemVfZXhwdChkMTA3LCB0cmFuc2Zvcm09ImxvZzIiLCBjb252ZXJ0PSJjcG0iLCBub3JtPSJxdWFudCIsIGZpbHRlcj1UUlVFKSkpJHBsb3QKYGBgCgojIyBEb25vciAxMDgKCmBgYHtyIGVhY2hfaW5kaXZpZHVhbF8xMDh9CmQxMDggPC0gc3Vic2V0X2V4cHQoaHNfaW5mX2ZpbHQsIHN1YnNldD0iZG9ub3I9PSdkMTA4JyIpCmQxMDhfcGFpcndpc2UgPC0gc20oYWxsX3BhaXJ3aXNlKGQxMDgsIG1vZGVsX2JhdGNoPUZBTFNFKSkKZDEwOF90YWJsZSA8LSBzbShjb21iaW5lX2RlX3RhYmxlcyhkMTA4X3BhaXJ3aXNlKSkKc3VtbWFyeShkMTA4X3RhYmxlJGRhdGEpCmQxMDhfc2lnIDwtIHNtKGV4dHJhY3Rfc2lnbmlmaWNhbnRfZ2VuZXMoZDEwOF90YWJsZSwgYWNjb3JkaW5nX3RvPSJkZXNlcSIsIHA9MC4xLCBwX3R5cGU9InJhdyIpKQpoZWFkKGQxMDhfc2lnJGRlc2VxJHVwc1tbMV1dKQpkMTA4X21hIDwtIGV4dHJhY3RfZGVfcGxvdHMoZDEwOF9wYWlyd2lzZSwgcD0wLjEsIHR5cGU9ImRlc2VxIiwgcF90eXBlPSJyYXciKSRtYSRwbG90CmQxMDhfbWEKcHZhbHVlcyA8LSBzbShwbG90X2RlX3B2YWxzKGQxMDhfdGFibGVbWyJkYXRhIl1dW1sic2hfdnNfY2hyIl1dLCB0eXBlPSJkZXNlcSIsIHBfdHlwZT0icmF3IikpCnB2YWx1ZXMKcGxvdF9wY2Eoc20obm9ybWFsaXplX2V4cHQoZDEwOCwgdHJhbnNmb3JtPSJsb2cyIiwgY29udmVydD0iY3BtIiwgbm9ybT0icXVhbnQiLCBmaWx0ZXI9VFJVRSkpKSRwbG90CmBgYAoKIyMgRG9ub3IgMTEwCgpgYGB7ciBlYWNoX2luZGl2aWR1YWxfMTEwfQpkMTEwIDwtIHN1YnNldF9leHB0KGhzX2luZl9maWx0LCBzdWJzZXQ9ImRvbm9yPT0nZDExMCciKQpkMTEwX3BhaXJ3aXNlIDwtIHNtKGFsbF9wYWlyd2lzZShkMTEwLCBtb2RlbF9iYXRjaD1GQUxTRSkpCmQxMTBfdGFibGUgPC0gc20oY29tYmluZV9kZV90YWJsZXMoZDExMF9wYWlyd2lzZSkpCnN1bW1hcnkoZDExMF90YWJsZSRkYXRhKQpkMTEwX3NpZyA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKGQxMTBfdGFibGUsIGFjY29yZGluZ190bz0iZGVzZXEiLCBwPTAuMSwgcF90eXBlPSJyYXciKSkKaGVhZChkMTEwX3NpZyRkZXNlcSR1cHNbWzFdXSkKZDExMF9tYSA8LSBleHRyYWN0X2RlX3Bsb3RzKGQxMTBfcGFpcndpc2UsIHA9MC4xLCBsb2dmYz0wLjYsIHBfdHlwZT0icmF3IikkbWEkcGxvdApkMTEwX21hCnB2YWx1ZXMgPC0gc20ocGxvdF9kZV9wdmFscyhkMTEwX3RhYmxlW1siZGF0YSJdXVtbInNoX3ZzX2NociJdXSwgdHlwZT0iZGVzZXEiLCBwX3R5cGU9InJhdyIpKQpwdmFsdWVzCnBsb3RfcGNhKHNtKG5vcm1hbGl6ZV9leHB0KGQxMTAsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsIG5vcm09InF1YW50IiwgZmlsdGVyPVRSVUUpKSkkcGxvdAoKaHNfdG1wIDwtIHNldF9leHB0X2JhdGNoZXMoaHNfaW5mX2ZpbHQsIGZhY3Q9InBhdGhvZ2Vuc3RyYWluIikKaHNfdG1wMiA8LSBzbShub3JtYWxpemVfZXhwdChoc190bXAsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIsIG5vcm09InF1YW50IiwgZmlsdGVyPVRSVUUpKQpwbG90X3BjYShoc190bXAyKSRwbG90CmBgYAoKVGhlIGFib3ZlIHBsb3RzIHN1Z2dlc3QsIGFsb25nIHdpdGggdGhlIFBDQSBwbG90cyBvZiBhbGwgc2FtcGxlcywgdGhhdCBvbmUgb3IKbW9yZSBzdHJhaW5zIGFyZSBlaXRoZXIgc3dpdGNoZWQgb3IgYXQgbGVhc3QgdmVyeSBwcm9ibGVtYXRpYy4gIFNwZWNpZmljYWxseSwKc2FtcGxlcyBmcm9tIHRoZSBzdHJhaW5zIGFubm90YXRlZCAyNTA0IGFuZCAyMjcyLiAgVGhlcmVmb3JlLCB3ZSBuZXh0IGVtYmFya2VkCm9uIGEgc2VyaWVzIG9mIGNvbXBhcmlzb25zIG9mIHdoYXQgaGFwcGVucyB3aGVuIHdlIHJlbW92ZSBlYWNoIG9mIHRoZW0KaW5kaXZpZHVhbGx5LCBhbmQgdGhlbiBib3RoLgoKIyBSZW1vdmUgc2FtcGxlcyBmcm9tIHN0cmFpbiAyNTA0IGFuZC9vciAyMjcyCgpUaGlzIGJsb2NrIHdpbGwgZmlyc3QgcmVtb3ZlIHN0cmFpbiAyNTA0LCB0aGVuIDIyNzIuICBUaGUgcmVzdWx0aW5nIHN1YnNldHMgd2lsbApiZSB1c2VkIGZvciBhbm90aGVyIHJvdW5kIG9mIHRoZXNlIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIGFuYWx5c2VzLgoKIyMgQ3JlYXRlIGRhdGFzZXRzCgpJbiB0aGlzIGJsb2NrIHdlIHdpbGwgcGVyZm9ybSB0aGUgdmFyaW91cyByZW1vdmFscywgY3JlYXRpbmcgJ3JlbW92ZV8yNTA0JywKJ3JlbW92ZV8yMjcyJywgYW5kICdyZW1vdmVfYm90aCcuICBJbiBhZGRpdGlvbiwgdGhlcmUgYXJlIHZlcnNpb25zIG9mIHRoaXMgd2l0aAphbmQgd2l0aG91dCB0aGUgdW5pbmZlY3RlZCBzYW1wbGVzLiAgV2UgZXZlbnR1YWxseSBkZWNpZGVkIHRvIHVzZSB0aGUgZGF0YQpfd2l0aF8gdGhlIHVuaW5mZWN0ZWQgc2FtcGxlcyBmb3Igb3VyIGZpbmFsIGFuYWx5c2VzOyBidXQgd2Ugd2lsbCBoYXZlIHNvbWUgcGNhCmV0Yy4gcGxvdHMgd2l0aG91dCB0aGVtIGZpcnN0IGJlY2F1c2UgdGhlIHVuaW5mZWN0ZWQgbWFrZSBpdCBoYXJkZXIgdG8gc2VlIHRoZQpkaXN0cmlidXRpb25zIGJlY2F1c2UgdGhleSBhcmUgc28gdmVyeSBkaWZmZXJlbnQgdGhhbiB0aGUgaW5mZWN0ZWQuCgpgYGB7ciByZW1vdmVfc2FtcGxlc30KcmVtb3ZlXzI1MDRfaW5mIDwtIHN1YnNldF9leHB0KGhzX2luZl9maWx0LCBzdWJzZXQ9InBhdGhvZ2Vuc3RyYWluIT0nczI1MDQnIikKcmVtb3ZlXzI1MDRfaW5mX2ZpbHQgPC0gc20obm9ybWFsaXplX2V4cHQocmVtb3ZlXzI1MDRfaW5mLCBmaWx0ZXI9VFJVRSkpCnJlbW92ZV8yMjcyX2luZiA8LSBzdWJzZXRfZXhwdChoc19pbmZfZmlsdCwgc3Vic2V0PSJwYXRob2dlbnN0cmFpbiE9J3MyMjcyJyIpCnJlbW92ZV8yMjcyX2luZl9maWx0IDwtIHNtKG5vcm1hbGl6ZV9leHB0KHJlbW92ZV8yMjcyX2luZiwgZmlsdGVyPVRSVUUpKQpyZW1vdmVfYm90aF9pbmYgPC0gc3Vic2V0X2V4cHQocmVtb3ZlXzI1MDRfaW5mLCBzdWJzZXQ9InBhdGhvZ2Vuc3RyYWluIT0nczIyNzInIikKcmVtb3ZlX2JvdGhfaW5mX2ZpbHQgPC0gc20obm9ybWFsaXplX2V4cHQocmVtb3ZlX2JvdGhfaW5mLCBmaWx0ZXI9VFJVRSkpCgpyZW1vdmVfMjUwNF91bmluZiA8LSBzdWJzZXRfZXhwdChoc191bmluZl9maWx0LCBzdWJzZXQ9InBhdGhvZ2Vuc3RyYWluIT0nczI1MDQnIikKcmVtb3ZlXzI1MDRfdW5pbmZfZmlsdCA8LSBzbShub3JtYWxpemVfZXhwdChyZW1vdmVfMjUwNF91bmluZiwgZmlsdGVyPVRSVUUpKQpyZW1vdmVfMjI3Ml91bmluZiA8LSBzdWJzZXRfZXhwdChoc191bmluZl9maWx0LCBzdWJzZXQ9InBhdGhvZ2Vuc3RyYWluIT0nczIyNzInIikKcmVtb3ZlXzIyNzJfdW5pbmZfZmlsdCA8LSBzbShub3JtYWxpemVfZXhwdChyZW1vdmVfMjI3Ml91bmluZiwgZmlsdGVyPVRSVUUpKQpyZW1vdmVfYm90aF91bmluZiA8LSBzdWJzZXRfZXhwdChyZW1vdmVfMjUwNF91bmluZiwgc3Vic2V0PSJwYXRob2dlbnN0cmFpbiE9J3MyMjcyJyIpCnJlbW92ZV9ib3RoX3VuaW5mX2ZpbHQgPC0gc20obm9ybWFsaXplX2V4cHQocmVtb3ZlX2JvdGhfdW5pbmYsIGZpbHRlcj1UUlVFKSkKCnJlbW92ZV8yNTA0X2QxMDcgPC0gc3Vic2V0X2V4cHQocmVtb3ZlXzI1MDRfaW5mLCBzdWJzZXQ9ImRvbm9yPT0nZDEwNyciKQpyZW1vdmVfMjUwNF9kMTA4IDwtIHN1YnNldF9leHB0KHJlbW92ZV8yNTA0X2luZiwgc3Vic2V0PSJkb25vcj09J2QxMDgnIikKcmVtb3ZlXzI1MDRfZDExMCA8LSBzdWJzZXRfZXhwdChyZW1vdmVfMjUwNF9pbmYsIHN1YnNldD0iZG9ub3I9PSdkMTEwJyIpCgpyZW1vdmVfMjI3Ml9kMTA3IDwtIHN1YnNldF9leHB0KHJlbW92ZV8yMjcyX2luZiwgc3Vic2V0PSJkb25vcj09J2QxMDcnIikKcmVtb3ZlXzIyNzJfZDEwOCA8LSBzdWJzZXRfZXhwdChyZW1vdmVfMjI3Ml9pbmYsIHN1YnNldD0iZG9ub3I9PSdkMTA4JyIpCnJlbW92ZV8yMjcyX2QxMTAgPC0gc3Vic2V0X2V4cHQocmVtb3ZlXzIyNzJfaW5mLCBzdWJzZXQ9ImRvbm9yPT0nZDExMCciKQoKcmVtb3ZlX2JvdGhfZDEwNyA8LSBzdWJzZXRfZXhwdChyZW1vdmVfYm90aF9pbmYsIHN1YnNldD0iZG9ub3I9PSdkMTA3JyIpCnJlbW92ZV9ib3RoX2QxMDggPC0gc3Vic2V0X2V4cHQocmVtb3ZlX2JvdGhfaW5mLCBzdWJzZXQ9ImRvbm9yPT0nZDEwOCciKQpyZW1vdmVfYm90aF9kMTEwIDwtIHN1YnNldF9leHB0KHJlbW92ZV9ib3RoX2luZiwgc3Vic2V0PSJkb25vcj09J2QxMTAnIikKYGBgCgojIFJlbW92ZSAyNTA0IGFuYWx5c2VzCgpTdHJhaW4gMjUwNCB3YXMgdGhlIGZpcnN0IHRoaW5nIEhlY3RvciBmb2N1c2VkIHVwb24sIHNvIGxldCB1cyBwZXJmb3JtIGEgZmV3Cm1ldHJpY3Mgd2l0aG91dCBpdC4KCiMjIFJlbW92ZSAyNTA0IGluaXRpYWwgcGxvdHMKCmBgYHtyIHJlbW92ZTI1MDRfcGxvdHN9CnJlbW92ZV8yNTA0X2luZl9ub3JtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KHJlbW92ZV8yNTA0X2luZl9maWx0LCB0cmFuc2Zvcm09ImxvZzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PSJjcG0iLCBub3JtPSJxdWFudCIpKQpwbG90X3BjYShyZW1vdmVfMjUwNF9pbmZfbm9ybSkkcGxvdApyZW1vdmVfMjUwNF9pbmZfbm9ybSA8LSBzbShub3JtYWxpemVfZXhwdChyZW1vdmVfMjUwNF9pbmZfZmlsdCwgdHJhbnNmb3JtPSJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2g9InN2YXNlcSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm09InF1YW50IikpCnBsb3RfcGNhKHJlbW92ZV8yNTA0X2luZl9ub3JtKSRwbG90CnBsb3RfY29yaGVhdChyZW1vdmVfMjUwNF9pbmZfbm9ybSwgcmVtb3ZlX2VxdWFsPVRSVUUsIGN2X21pbj0wLjAxKSRwbG90CmBgYAoKIyMjIFJlbW92ZSAyNTA0IGluZGl2aWR1YWwgZG9ub3JzCgojIyMjIGQxMDcgd2l0aG91dCBzMjUwNAoKYGBge3IgcmVtb3ZlMjUwNF9pbmRpdmlkdWFsc19kMTA3fQpyZW1vdmVfMjUwNF9kMTA3X2ZpbHQgPC0gc20obm9ybWFsaXplX2V4cHQocmVtb3ZlXzI1MDRfZDEwNywgZmlsdGVyPVRSVUUpKQpyZW1vdmVfMjUwNF9kMTA3X2RlIDwtIHNtKGFsbF9wYWlyd2lzZShyZW1vdmVfMjUwNF9kMTA3X2ZpbHQsIG1vZGVsX2JhdGNoPSJzdmFzZXEiKSkKcmVtb3ZlXzI1MDRfZDEwN190YWJsZSA8LSBzbShjb21iaW5lX2RlX3RhYmxlcyhyZW1vdmVfMjUwNF9kMTA3X2RlKSkKcHZhbHVlcyA8LSBwbG90X2RlX3B2YWxzKHJlbW92ZV8yNTA0X2QxMDdfdGFibGUkZGF0YVtbMV1dLCB0eXBlPSJkZXNlcSIsIHBfdHlwZT0icmF3IikKcHZhbHVlcwpgYGAKCiMjIyMgZDEwOCB3aXRob3V0IHMyNTA0CgpgYGB7ciByZW1vdmUyNTA0X2luZGl2aWR1YWxzX2QxMDh9CnJlbW92ZV8yNTA0X2QxMDhfZmlsdCA8LSBzbShub3JtYWxpemVfZXhwdChyZW1vdmVfMjUwNF9kMTA4LCBmaWx0ZXI9VFJVRSkpCnJlbW92ZV8yNTA0X2QxMDhfZGUgPC0gc20oYWxsX3BhaXJ3aXNlKHJlbW92ZV8yNTA0X2QxMDhfZmlsdCwgbW9kZWxfYmF0Y2g9InN2YXNlcSIpKQpyZW1vdmVfMjUwNF9kMTA4X3RhYmxlIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKHJlbW92ZV8yNTA0X2QxMDhfZGUpKQpwdmFsdWVzIDwtIHBsb3RfZGVfcHZhbHMocmVtb3ZlXzI1MDRfZDEwOF90YWJsZSRkYXRhW1sxXV0sIHR5cGU9ImRlc2VxIiwgcF90eXBlPSJyYXciKQpwdmFsdWVzCmBgYAoKIyMjIyBkMTEwIHdpdGhvdXQgczI1MDQKCmBgYHtyIHJlbW92ZTI1MDRfaW5kaXZpZHVhbHNfZDExMH0KcmVtb3ZlXzI1MDRfZDExMF9maWx0IDwtIHNtKG5vcm1hbGl6ZV9leHB0KHJlbW92ZV8yNTA0X2QxMTAsIGZpbHRlcj1UUlVFKSkKcmVtb3ZlXzI1MDRfZDExMF9kZSA8LSBzbShhbGxfcGFpcndpc2UocmVtb3ZlXzI1MDRfZDExMF9maWx0LCBtb2RlbF9iYXRjaD0ic3Zhc2VxIikpCnJlbW92ZV8yNTA0X2QxMTBfdGFibGUgPC0gc20oY29tYmluZV9kZV90YWJsZXMocmVtb3ZlXzI1MDRfZDExMF9kZSkpCnB2YWx1ZXMgPC0gcGxvdF9kZV9wdmFscyhyZW1vdmVfMjUwNF9kMTEwX3RhYmxlJGRhdGFbWzFdXSwgdHlwZT0iZGVzZXEiLCBwX3R5cGU9InJhdyIpCnB2YWx1ZXMKYGBgCgpUaGUgYWJvdmUgc2hvdWxkIGdpdmUgdXMgYSBjbHVlIGFzIHRvIHdoZXRoZXIgcmVtb3Zpbmcgc2FtcGxlIDI1MDQgZGlkIGFueXRoaW5nCmhlbHBmdWwgdG8gdGhlIHJlc3VsdGluZyBkaXN0cmlidXRpb24gb2YgcC12YWx1ZXMuICBMZXQgdXMgbm93IGJyaW5nIHRoZSBkb25vcnMKYmFjayB0b2dldGhlciBhbmQgc2VlIGhvdyB0aGF0IGxvb2tzLgoKIyMjIEFsbCBkb25vcnMsIHJlbW92ZSAyNTA0IHBhaXJ3aXNlCgpHaXZlbiB0aGUgY2x1c3RlcmluZyBvZiB0aGUgc2FtcGxlcyBhZnRlciByZW1vdmluZyB0aGUgMjUwNCBzdHJhaW4gc2FtcGxlcywgbGV0CnVzIG5vdyBwZXJmb3JtIHRoZSBwYWlyd2lzZSBhbmFseXNpcyBhbmQgc2VlIGhvdyBpdCBsb29rcy4KCk5vdGUgdGhhdCB0aGVzZSBhcmUgcGVyZm9ybWVkIF93aXRoXyB0aGUgdW5pbmZlY3RlZCBzYW1wbGVzIHdoaWxlIHRoZSBwcmV2aW91cwptZXRyaWNzIHdlcmUgd2l0aG91dCB0aGVtLiAgVGhpcyB3aWxsIGluY2x1ZGUgb25lIHJvdW5kIHdpdGggYmF0Y2ggaW4gdGhlIG1vZGVsCmFuZCBvbmUgcm91bmQgdXNpbmcgc3Zhc2VxLiAgSW4gYWRkaXRpb24sIHdlIGFyZSByZWxheGluZyB0aGUgbG9nIGZvbGQtY2hhbmdlIGFuZApwLXZhbHVlIGNvbnN0cmFpbnRzIHRvIDAuNiBhbmQgMC4xIHJlc3BlY3RpdmVseS4KCmBgYHtyIHJlbW92ZTI1MDRfcGFpcndpc2UsIGZpZy5zaG93PSJoaWRlIn0KcmVtb3ZlXzI1MDRfdW5pbmZfZGUgPC0gc20oYWxsX3BhaXJ3aXNlKHJlbW92ZV8yNTA0X3VuaW5mX2ZpbHQsIG1vZGVsX2JhdGNoPVRSVUUpKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19pbmZlY3RfcmVtb3ZlMjUwNHVuaW5mX2JhdGNobW9kZWxfY29udHItdnt2ZXJ9Lnhsc3giKQpyZW1vdmVfMjUwNF91bmluZl90YWJsZSA8LSBzbShjb21iaW5lX2RlX3RhYmxlcyhyZW1vdmVfMjUwNF91bmluZl9kZSwgZXhjZWw9ZXhjZWxfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcGVycz1rZWVwZXJzX3VuaW5mKSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1faHNfaW5mZWN0X3JlbW92ZTI1MDR1bmluZl9iYXRjaG1vZGVsX3NpZy12e3Zlcn0ueGxzeCIpCnJlbW92ZV8yNTA0X3VuaW5mX3NpZyA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKHJlbW92ZV8yNTA0X3VuaW5mX3RhYmxlLCBleGNlbD1leGNlbF9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvcmRpbmdfdG89ImRlc2VxIiwgcD0wLjEsIGxmYz0wLjYpKQoKcmVtb3ZlXzI1MDRfdW5pbmZfZGVfc3ZhIDwtIHNtKGFsbF9wYWlyd2lzZShyZW1vdmVfMjUwNF91bmluZl9maWx0LCBtb2RlbF9iYXRjaD0ic3Zhc2VxIikpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9yZW1vdmUyNTA0dW5pbmZfc3Zhc2VxX2NvbnRyLXZ7dmVyfS54bHN4IikKcmVtb3ZlXzI1MDRfdW5pbmZfdGFibGVfc3ZhIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKHJlbW92ZV8yNTA0X3VuaW5mX2RlX3N2YSwgZXhjZWw9ZXhjZWxfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBlcnM9a2VlcGVyc191bmluZikpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9yZW1vdmUyNTA0dW5pbmZfc3Zhc2VxX3NpZy12e3Zlcn0ueGxzeCIpCnJlbW92ZV8yNTA0X3VuaW5mX3NpZ19zdmEgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhyZW1vdmVfMjUwNF91bmluZl90YWJsZV9zdmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlbD1leGNlbF9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nX3RvPSJkZXNlcSIsIHA9MC4xLCBsZmM9MC42KSkKYGBgCgojIyMjIERFU2VxIE1BcGxvdCwgY2hyb25pYyB2cyBzZWxmLWhlYWxpbmcgYWxsIGRvbm9ycyByZW1vdmUgMjUwNAoKYGBge3IgcGFpcndpc2UyNTA0X2JhdGNoX3Bsb3RzfQpyZW1vdmVfMjUwNF91bmluZl90YWJsZV9zdmEkZGVzZXFfbWFfcGxvdHMkY2hfc2gkcGxvdApyZW1vdmVfMjUwNF91bmluZl90YWJsZV9zdmEkdmVubnMkY2hfc2gkdXBfbm93ZWlnaHQKYGBgCgojIFJlbW92ZSAyMjcyIGFuYWx5c2VzCgpUaGlzIHNob3VsZCBiZSBhbiBleGFjdCByZXBldGl0aW9uIG9mIHRoZSAyNTA0IHJlbW92YWwgYWJvdmUsIHNvIEkgcmVtb3ZlZCB0aGUgY29tbWVudGFyeS4KCiMjIFJlbW92ZSAyMjcyIGluaXRpYWwgcGxvdHMKCmBgYHtyIHJlbW92ZTIyNzJfcGxvdHN9CnJlbW92ZV8yMjcyX2luZl9ub3JtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KHJlbW92ZV8yMjcyX2luZl9maWx0LCB0cmFuc2Zvcm09ImxvZzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PSJjcG0iLCBub3JtPSJxdWFudCIpKQpwbG90X3BjYShyZW1vdmVfMjI3Ml9pbmZfbm9ybSkkcGxvdApyZW1vdmVfMjI3Ml9pbmZfbm9ybSA8LSBzbShub3JtYWxpemVfZXhwdChyZW1vdmVfMjI3Ml9pbmZfZmlsdCwgdHJhbnNmb3JtPSJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2g9InN2YXNlcSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm09InF1YW50IikpCnBsb3RfcGNhKHJlbW92ZV8yMjcyX2luZl9ub3JtKSRwbG90CnBsb3RfY29yaGVhdChyZW1vdmVfMjI3Ml9pbmZfbm9ybSwgcmVtb3ZlX2VxdWFsPVRSVUUsIGN2X21pbj0wLjAxKSRwbG90CmBgYAoKIyMjIFJlbW92ZSAyMjcyIGluZGl2aWR1YWwgZG9ub3JzCgojIyMjIGQxMDcgd2l0aG91dCBzMjI3MgoKYGBge3IgcmVtb3ZlMjI3Ml9pbmRpdmlkdWFsc19kMTA3fQpyZW1vdmVfMjI3Ml9kMTA3X2ZpbHQgPC0gc20obm9ybWFsaXplX2V4cHQocmVtb3ZlXzIyNzJfZDEwNywgZmlsdGVyPVRSVUUpKQpyZW1vdmVfMjI3Ml9kMTA3X2RlIDwtIHNtKGFsbF9wYWlyd2lzZShyZW1vdmVfMjI3Ml9kMTA3X2ZpbHQsIG1vZGVsX2JhdGNoPSJzdmFzZXEiKSkKcmVtb3ZlXzIyNzJfZDEwN190YWJsZSA8LSBzbShjb21iaW5lX2RlX3RhYmxlcyhyZW1vdmVfMjI3Ml9kMTA3X2RlKSkKcHZhbHVlcyA8LSBwbG90X2RlX3B2YWxzKHJlbW92ZV8yMjcyX2QxMDdfdGFibGUkZGF0YVtbMV1dLCB0eXBlPSJkZXNlcSIsIHBfdHlwZT0icmF3IikKcHZhbHVlcwpgYGAKCiMjIyMgZDEwOCB3aXRob3V0IHMyMjcyCgpgYGB7ciByZW1vdmUyMjcyX2luZGl2aWR1YWxzX2QxMDh9CnJlbW92ZV8yMjcyX2QxMDhfZmlsdCA8LSBzbShub3JtYWxpemVfZXhwdChyZW1vdmVfMjI3Ml9kMTA4LCBmaWx0ZXI9VFJVRSkpCnJlbW92ZV8yMjcyX2QxMDhfZGUgPC0gc20oYWxsX3BhaXJ3aXNlKHJlbW92ZV8yMjcyX2QxMDhfZmlsdCwgbW9kZWxfYmF0Y2g9InN2YXNlcSIpKQpyZW1vdmVfMjI3Ml9kMTA4X3RhYmxlIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKHJlbW92ZV8yMjcyX2QxMDhfZGUpKQpwdmFsdWVzIDwtIHBsb3RfZGVfcHZhbHMocmVtb3ZlXzIyNzJfZDEwOF90YWJsZSRkYXRhW1sxXV0sIHR5cGU9ImRlc2VxIiwgcF90eXBlPSJyYXciKQpwdmFsdWVzCmBgYAoKIyMjIyBkMTEwIHdpdGhvdXQgczIyNzIKCmBgYHtyIHJlbW92ZTIyNzJfaW5kaXZpZHVhbHNfZDExMH0KcmVtb3ZlXzIyNzJfZDExMF9maWx0IDwtIHNtKG5vcm1hbGl6ZV9leHB0KHJlbW92ZV8yMjcyX2QxMTAsIGZpbHRlcj1UUlVFKSkKcmVtb3ZlXzIyNzJfZDExMF9kZSA8LSBzbShhbGxfcGFpcndpc2UocmVtb3ZlXzIyNzJfZDExMF9maWx0LCBtb2RlbF9iYXRjaD0ic3Zhc2VxIikpCnJlbW92ZV8yMjcyX2QxMTBfdGFibGUgPC0gc20oY29tYmluZV9kZV90YWJsZXMocmVtb3ZlXzIyNzJfZDExMF9kZSkpCnB2YWx1ZXMgPC0gcGxvdF9kZV9wdmFscyhyZW1vdmVfMjI3Ml9kMTEwX3RhYmxlJGRhdGFbWzFdXSwgdHlwZT0iZGVzZXEiLCBwX3R5cGU9InJhdyIpCnB2YWx1ZXMKYGBgCgojIyMgQWxsIGRvbm9ycywgcmVtb3ZlIDIyNzIgcGFpcndpc2UKCmBgYHtyIHJlbW92ZTIyNzJfcGFpcndpc2UsIGZpZy5zaG93PSJoaWRlIn0KcmVtb3ZlXzIyNzJfdW5pbmZfZGUgPC0gc20oYWxsX3BhaXJ3aXNlKHJlbW92ZV8yMjcyX3VuaW5mX2ZpbHQsIG1vZGVsX2JhdGNoPVRSVUUpKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19pbmZlY3RfcmVtb3ZlMjI3MnVuaW5mX2JhdGNobW9kZWxfY29udHItdnt2ZXJ9Lnhsc3giKQpyZW1vdmVfMjI3Ml91bmluZl90YWJsZSA8LSBzbShjb21iaW5lX2RlX3RhYmxlcyhyZW1vdmVfMjI3Ml91bmluZl9kZSwgZXhjZWw9ZXhjZWxfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcGVycz1rZWVwZXJzX3VuaW5mKSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1faHNfaW5mZWN0X3JlbW92ZTIyNzJ1bmluZl9iYXRjaG1vZGVsX3NpZy12e3Zlcn0ueGxzeCIpCnJlbW92ZV8yMjcyX3VuaW5mX3NpZyA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKHJlbW92ZV8yMjcyX3VuaW5mX3RhYmxlLCBleGNlbD1leGNlbF9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvcmRpbmdfdG89ImRlc2VxIiwgcD0wLjEsIGxmYz0wLjYpKQoKcmVtb3ZlXzIyNzJfdW5pbmZfZGVfc3ZhIDwtIHNtKGFsbF9wYWlyd2lzZShyZW1vdmVfMjI3Ml91bmluZl9maWx0LCBtb2RlbF9iYXRjaD0ic3Zhc2VxIikpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9yZW1vdmUyMjcydW5pbmZfc3Zhc2VxX2NvbnRyLXZ7dmVyfS54bHN4IikKcmVtb3ZlXzIyNzJfdW5pbmZfdGFibGVfc3ZhIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKHJlbW92ZV8yMjcyX3VuaW5mX2RlX3N2YSwgZXhjZWw9ZXhjZWxfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBlcnM9a2VlcGVyc191bmluZikpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9yZW1vdmUyMjcydW5pbmZfc3Zhc2VxX3NpZy12e3Zlcn0ueGxzeCIpCnJlbW92ZV8yMjcyX3VuaW5mX3NpZ19zdmEgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhyZW1vdmVfMjI3Ml91bmluZl90YWJsZV9zdmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlbD1leGNlbF9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nX3RvPSJkZXNlcSIsIHA9MC4xLCBsZmM9MC42KSkKYGBgCgojIyMjIERFU2VxIE1BcGxvdCwgY2hyb25pYyB2cyBzZWxmLWhlYWxpbmcgYWxsIGRvbm9ycyByZW1vdmUgMjI3MgoKYGBge3IgcGFpcndpc2UyMjcyX2JhdGNoX3Bsb3RzfQpyZW1vdmVfMjI3Ml91bmluZl90YWJsZV9zdmEkZGVzZXFfbWFfcGxvdHMkY2hfc2gkcGxvdApyZW1vdmVfMjI3Ml91bmluZl90YWJsZV9zdmEkdmVubnMkY2hfc2gkdXBfbm93ZWlnaHQKYGBgCgojIFJlbW92ZSBib3RoIGFuYWx5c2VzCgpUaGlzIHNob3VsZCBiZSBhbiBleGFjdCByZXBldGl0aW9uIG9mIHRoZSAyNTA0LzIyNzIgcmVtb3ZhbHMgYWJvdmUsIHNvIEkgcmVtb3ZlZCB0aGUgY29tbWVudGFyeS4KCiMjIFJlbW92ZSBib3RoIGluaXRpYWwgcGxvdHMKCmBgYHtyIHJlbW92ZWJvdGhfcGxvdHN9CnJlbW92ZV9ib3RoX2luZl9ub3JtIDwtIHNtKG5vcm1hbGl6ZV9leHB0KHJlbW92ZV9ib3RoX2luZl9maWx0LCB0cmFuc2Zvcm09ImxvZzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PSJjcG0iLCBub3JtPSJxdWFudCIpKQpwbG90X3BjYShyZW1vdmVfYm90aF9pbmZfbm9ybSkkcGxvdApyZW1vdmVfYm90aF9pbmZfbm9ybSA8LSBzbShub3JtYWxpemVfZXhwdChyZW1vdmVfYm90aF9pbmZfZmlsdCwgdHJhbnNmb3JtPSJsb2cyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2g9InN2YXNlcSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm09InF1YW50IikpCnBsb3RfcGNhKHJlbW92ZV9ib3RoX2luZl9ub3JtKSRwbG90CnBsb3RfY29yaGVhdChyZW1vdmVfYm90aF9pbmZfbm9ybSwgcmVtb3ZlX2VxdWFsPVRSVUUsIGN2X21pbj0wLjAxKSRwbG90CmBgYAoKIyMjIFJlbW92ZSBib3RoIGluZGl2aWR1YWwgZG9ub3JzCgojIyMjIGQxMDcgd2l0aG91dCBib3RoCgpgYGB7ciByZW1vdmVib3RoX2luZGl2aWR1YWxzX2QxMDd9CnJlbW92ZV9ib3RoX2QxMDdfZmlsdCA8LSBzbShub3JtYWxpemVfZXhwdChyZW1vdmVfYm90aF9kMTA3LCBmaWx0ZXI9VFJVRSkpCnJlbW92ZV9ib3RoX2QxMDdfZGUgPC0gc20oYWxsX3BhaXJ3aXNlKHJlbW92ZV9ib3RoX2QxMDdfZmlsdCwgbW9kZWxfYmF0Y2g9InN2YXNlcSIpKQpyZW1vdmVfYm90aF9kMTA3X3RhYmxlIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKHJlbW92ZV9ib3RoX2QxMDdfZGUpKQpwdmFsdWVzIDwtIHBsb3RfZGVfcHZhbHMocmVtb3ZlX2JvdGhfZDEwN190YWJsZSRkYXRhW1sxXV0sIHR5cGU9ImRlc2VxIiwgcF90eXBlPSJyYXciKQpwdmFsdWVzCmBgYAoKIyMjIyBkMTA4IHdpdGhvdXQgYm90aAoKYGBge3IgcmVtb3ZlYm90aF9pbmRpdmlkdWFsc19kMTA4fQpyZW1vdmVfYm90aF9kMTA4X2ZpbHQgPC0gc20obm9ybWFsaXplX2V4cHQocmVtb3ZlX2JvdGhfZDEwOCwgZmlsdGVyPVRSVUUpKQpyZW1vdmVfYm90aF9kMTA4X2RlIDwtIHNtKGFsbF9wYWlyd2lzZShyZW1vdmVfYm90aF9kMTA4X2ZpbHQsIG1vZGVsX2JhdGNoPSJzdmFzZXEiKSkKcmVtb3ZlX2JvdGhfZDEwOF90YWJsZSA8LSBzbShjb21iaW5lX2RlX3RhYmxlcyhyZW1vdmVfYm90aF9kMTA4X2RlKSkKcHZhbHVlcyA8LSBwbG90X2RlX3B2YWxzKHJlbW92ZV9ib3RoX2QxMDhfdGFibGUkZGF0YVtbMV1dLCB0eXBlPSJkZXNlcSIsIHBfdHlwZT0icmF3IikKcHZhbHVlcwpgYGAKCiMjIyMgZDExMCB3aXRob3V0IGJvdGgKCmBgYHtyIHJlbW92ZWJvdGhfaW5kaXZpZHVhbHNfZDExMH0KcmVtb3ZlX2JvdGhfZDExMF9maWx0IDwtIHNtKG5vcm1hbGl6ZV9leHB0KHJlbW92ZV9ib3RoX2QxMTAsIGZpbHRlcj1UUlVFKSkKcmVtb3ZlX2JvdGhfZDExMF9kZSA8LSBzbShhbGxfcGFpcndpc2UocmVtb3ZlX2JvdGhfZDExMF9maWx0LCBtb2RlbF9iYXRjaD0ic3Zhc2VxIikpCnJlbW92ZV9ib3RoX2QxMTBfdGFibGUgPC0gc20oY29tYmluZV9kZV90YWJsZXMocmVtb3ZlX2JvdGhfZDExMF9kZSkpCnB2YWx1ZXMgPC0gcGxvdF9kZV9wdmFscyhyZW1vdmVfYm90aF9kMTEwX3RhYmxlJGRhdGFbWzFdXSwgdHlwZT0iZGVzZXEiLCBwX3R5cGU9InJhdyIpCnB2YWx1ZXMKYGBgCgojIyMgQWxsIGRvbm9ycywgcmVtb3ZlIGJvdGggcGFpcndpc2UKCmBgYHtyIHJlbW92ZWJvdGhfcGFpcndpc2UsIGZpZy5zaG93PSJoaWRlIn0KcmVtb3ZlX2JvdGhfdW5pbmZfZGUgPC0gc20oYWxsX3BhaXJ3aXNlKHJlbW92ZV9ib3RoX3VuaW5mX2ZpbHQsIG1vZGVsX2JhdGNoPVRSVUUpKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9oc19pbmZlY3RfcmVtb3ZlYm90aHVuaW5mX2JhdGNobW9kZWxfY29udHItdnt2ZXJ9Lnhsc3giKQpyZW1vdmVfYm90aF91bmluZl90YWJsZSA8LSBzbShjb21iaW5lX2RlX3RhYmxlcyhyZW1vdmVfYm90aF91bmluZl9kZSwgZXhjZWw9ZXhjZWxfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcGVycz1rZWVwZXJzX3VuaW5mKSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1faHNfaW5mZWN0X3JlbW92ZWJvdGh1bmluZl9iYXRjaG1vZGVsX3NpZy12e3Zlcn0ueGxzeCIpCnJlbW92ZV9ib3RoX3VuaW5mX3NpZyA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKHJlbW92ZV9ib3RoX3VuaW5mX3RhYmxlLCBleGNlbD1leGNlbF9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvcmRpbmdfdG89ImRlc2VxIiwgcD0wLjEsIGxmYz0wLjYpKQoKcmVtb3ZlX2JvdGhfdW5pbmZfZGVfc3ZhIDwtIHNtKGFsbF9wYWlyd2lzZShyZW1vdmVfYm90aF91bmluZl9maWx0LCBtb2RlbF9iYXRjaD0ic3Zhc2VxIikpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9yZW1vdmVib3RodW5pbmZfc3Zhc2VxX2NvbnRyLXZ7dmVyfS54bHN4IikKcmVtb3ZlX2JvdGhfdW5pbmZfdGFibGVfc3ZhIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKHJlbW92ZV9ib3RoX3VuaW5mX2RlX3N2YSwgZXhjZWw9ZXhjZWxfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBlcnM9a2VlcGVyc191bmluZikpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9yZW1vdmVib3RodW5pbmZfc3Zhc2VxX3NpZy12e3Zlcn0ueGxzeCIpCnJlbW92ZV9ib3RoX3VuaW5mX3NpZ19zdmEgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhyZW1vdmVfYm90aF91bmluZl90YWJsZV9zdmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlbD1leGNlbF9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nX3RvPSJkZXNlcSIsIHA9MC4xLCBsZmM9MC42KSkKcmVtb3ZlX2JvdGhfdW5pbmZfc2lnX3N2YSRkZXNlcSRjb3VudHMKCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2hzX2luZmVjdF9yZW1vdmVib3RodW5pbmZfc3Zhc2VxX3NpZy12e3Zlcn1fbm9ybWFsLnhsc3giKQpyZW1vdmVfYm90aF91bmluZl9zaWdfc3ZhX25vcm1hbCA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKHJlbW92ZV9ib3RoX3VuaW5mX3RhYmxlX3N2YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VsPWV4Y2VsX2ZpbGUpKQpyZW1vdmVfYm90aF91bmluZl9zaWdfc3ZhX25vcm1hbCRkZXNlcSRjb3VudHMKYGBgCgojIyMjIERFU2VxIE1BcGxvdCwgY2hyb25pYyB2cyBzZWxmLWhlYWxpbmcgYWxsIGRvbm9ycyByZW1vdmUgYm90aAoKYGBge3IgcGFpcndpc2Vib3RoX2JhdGNoX3Bsb3RzfQpyZW1vdmVfYm90aF91bmluZl90YWJsZV9zdmEkZGVzZXFfbWFfcGxvdHMkY2hfc2gkcGxvdApyZW1vdmVfYm90aF91bmluZl90YWJsZV9zdmEkdmVubnMkY2hfc2gkdXBfbm93ZWlnaHQKYGBgCgojIENvbXBhcmUgYW5hbHlzZXMKCk5vdyB0aGF0IHdlIGhhdmUgcGVyZm9ybWVkIGEgc2V0IG9mIGFuYWx5c2VzIGxvb2tpbmcgYXQgdGhlIHZhcmlvdXMgY29tYmluYXRpb25zCm9mIHN0cmFpbnMgYW5kIGRvbm9ycywgbGV0IHVzIGxvb2sgYXQgaG93IHNpbWlsYXIgYXJlIHRoZSBkaXN0cmlidXRpb25zIG9mIGxvZ0ZDIGFuZApyYW5rIG9yZGVycy4KCiMjIENvbXBhcmUgdGhlIGRvbm9ycyB0byBlYWNoIG90aGVyCgpgYGB7ciBjb21wYXJlX2Rvbm9yc30KY29tcGFyZSA8LSBzbShjb21wYXJlX2RlX3Jlc3VsdHMoZDEwN190YWJsZSwgZDEwOF90YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yX21ldGhvZD0ic3BlYXJtYW4iLCB0cnlfbWV0aG9kcz0iZGVzZXEiKSkKY29tcGFyZSRyZXN1bHQkZGVzZXEKIyMgSG9seSBjcmFwb2xhIQoKY29tcGFyZSA8LSBzbShjb21wYXJlX2RlX3Jlc3VsdHMoZDEwN190YWJsZSwgZDExMF90YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yX21ldGhvZD0ic3BlYXJtYW4iLCB0cnlfbWV0aG9kcz0iZGVzZXEiKSkKY29tcGFyZSRyZXN1bHQkZGVzZXEKCmNvbXBhcmUgPC0gc20oY29tcGFyZV9kZV9yZXN1bHRzKGQxMDhfdGFibGUsIGQxMTBfdGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcl9tZXRob2Q9InNwZWFybWFuIiwgdHJ5X21ldGhvZHM9ImRlc2VxIikpCmNvbXBhcmUkcmVzdWx0JGRlc2VxCmBgYAoKV293IEkgaGFkIGZvcmdvdHRlbiBob3cgcmlkaWN1bG91c2x5IGRpZmZlcmVudCB0aGUgMyBkb25vcnMgYXJlLgoKIyMgQ29tcGFyZSByZW1vdmUgb25lIHZzIHJlbW92ZSBib3RoCgojIyMgQmF0Y2ggaW4gbW9kZWwKCmBgYHtyIGNvbXBhcmVfMjI3Ml8yNTA0X2JhdGNofQpjb21wYXJlIDwtIGNvbXBhcmVfZGVfcmVzdWx0cyhyZW1vdmVfMjI3Ml91bmluZl90YWJsZSwgcmVtb3ZlX2JvdGhfdW5pbmZfdGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcl9tZXRob2Q9InNwZWFybWFuIiwgdHJ5X21ldGhvZHM9ImRlc2VxIikKY29tcGFyZSRyZXN1bHQkZGVzZXEKCmNvbXBhcmUgPC0gY29tcGFyZV9kZV9yZXN1bHRzKHJlbW92ZV8yNTA0X3VuaW5mX3RhYmxlLCByZW1vdmVfYm90aF91bmluZl90YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yX21ldGhvZD0ic3BlYXJtYW4iLCB0cnlfbWV0aG9kcz0iZGVzZXEiKQpjb21wYXJlJHJlc3VsdCRkZXNlcQpgYGAKCiMjIyBzdmEKCmBgYHtyIGNvbXBhcmVfMjI3Ml8yNTA0X3N2YX0KY29tcGFyZSA8LSBjb21wYXJlX2RlX3Jlc3VsdHMocmVtb3ZlXzIyNzJfdW5pbmZfdGFibGVfc3ZhLCByZW1vdmVfYm90aF91bmluZl90YWJsZV9zdmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcl9tZXRob2Q9InNwZWFybWFuIiwgdHJ5X21ldGhvZHM9ImRlc2VxIikKY29tcGFyZSRyZXN1bHQkZGVzZXEKCmNvbXBhcmUgPC0gY29tcGFyZV9kZV9yZXN1bHRzKHJlbW92ZV8yNTA0X3VuaW5mX3RhYmxlX3N2YSwgcmVtb3ZlX2JvdGhfdW5pbmZfdGFibGVfc3ZhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JfbWV0aG9kPSJzcGVhcm1hbiIsIHRyeV9tZXRob2RzPSJkZXNlcSIpCmNvbXBhcmUkcmVzdWx0JGRlc2VxCmBgYAoKIyMgQ29tcGFyZSByZW1vdmUgYm90aCBhZ2FpbnN0IGFsbCBzYW1wbGVzCgojIyMgQmF0Y2ggaW4gdGhlIG1vZGVsCgpgYGB7ciBjb21wYXJlX2JvdGhfYWxsX2JhdGNofQpjb21wYXJlIDwtIHNtKGNvbXBhcmVfZGVfcmVzdWx0cyhyZW1vdmVfYm90aF91bmluZl90YWJsZSwgaHNfY29tYmluZWRfYmF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcl9tZXRob2Q9InNwZWFybWFuIiwgdHJ5X21ldGhvZHM9ImRlc2VxIikpCmNvbXBhcmUkcmVzdWx0JGRlc2VxCmBgYAoKIyMjIHN2YQoKYGBge3IgY29tcGFyZV9ib3RoX2FsbF9zdmF9CmNvbXBhcmUgPC0gc20oY29tcGFyZV9kZV9yZXN1bHRzKHJlbW92ZV9ib3RoX3VuaW5mX3RhYmxlX3N2YSwgaHNfY29tYmluZWRfc3ZhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JfbWV0aG9kPSJzcGVhcm1hbiIsIHRyeV9tZXRob2RzPSJkZXNlcSIpKQpjb21wYXJlJHJlc3VsdCRkZXNlcQpgYGAKCiMgVHJ5IGFnYWluIG9uIHRoZSBwYXJhc2l0ZSBkYXRhCgojIyBSZW1lbWJlciBvdXIgZGF0YSBzZXQKCmBgYHtyIGxwX2V4cHJlc3Npb24wMX0KbHBfaW5mX2ZpbHQgPC0gc20obm9ybWFsaXplX2V4cHQobHBfaW5mLCBmaWx0ZXI9VFJVRSkpCnJlbWluZGVyX2RhdGEgPC0gc2V0X2V4cHRfYmF0Y2hlcyhscF9pbmZfZmlsdCwgZmFjdD0icGF0aG9nZW5zdHJhaW4iKQojI3JlbWluZGVyX2RhdGEgPC0gc3Vic2V0X2V4cHQocmVtaW5kZXJfZGF0YSwgc3Vic2V0PSJwYXRob2dlbnN0cmFpbiE9J3MyMjcyJyIpCiMjcmVtaW5kZXJfZGF0YSA8LSBzdWJzZXRfZXhwdChyZW1pbmRlcl9kYXRhLCBzdWJzZXQ9InBhdGhvZ2Vuc3RyYWluIT0nczI1MDQnIikKcmVtaW5kZXJfbm9ybSA8LSBub3JtYWxpemVfZXhwdChyZW1pbmRlcl9kYXRhLCBub3JtPSJxdWFudCIsIHRyYW5zZm9ybT0ibG9nMiIsIGNvbnZlcnQ9ImNwbSIpCnJlbWluZGVyIDwtIHBsb3RfcGNhKHJlbWluZGVyX25vcm0pCnJlbWluZGVyJHBsb3QKYGBgCgpPaCB5ZWFoLCBJIHJlbWVtYmVyIG5vdywgdGhlIHByaW1hcnkgZGlmZmVyZW5jZSB3aGVuIGxvb2tpbmcgYXQgdGhlIHBhcmFzaXRlCnNhbXBsZXMgaXMgb25lIHdoaWNoIG1hdGNoZXMgdGhlIHZhcmlhbnQgcGF0dGVybi4gVGh1cywgaWYgb25lIGxvb2tzIGF0IHRoZQpjbHVzdGVyaW5nIG9ic2VydmVkIGluIHRoZSBwYXJhc2l0ZSBkYXRhLCBvbmUgd2lsbCBmaW5kIHRoZSBzYW1lIHBhdHRlcm4Kb2JzZXJ2ZWQgaW4gMDRfdmFyaWFudHMuUm1kLCB3aGVyZSB0aGUgc2FtcGxlcyBvbiBvbmUgc2lkZSBvZiB0aGUgaGNsdXN0CmNsYWRvZ3JhbSBhcmUgb24gb25lIHNpZGUgb2YgdGhlIFBDQSBhbmQgdmljZSB2ZXJzYS4KClRoaXMgZG9lcyBub3QgYm9kZSB3ZWxsIGZvciBvdXIgYWJpbGl0eSB0byB1c2UgZGlmZmVyZW50aWFsIGV4cHJlc3Npb24gYW5heXNlcwppbiBvcmRlciB0byBmaW5kIHBhcmFzaXRlIHN0cmFpbiBkaWZmZXJlbmNlcyBiZXR3ZWVuIGNocm9uaWMvc2VsZi1oZWFsaW5nOyBidXQKaXQgaXMgZ3JlYXQgaWYgd2Ugd2FudCB0byBzZWUgZGlmZmVyZW5jZXMgYmV0d2VlbiBvbmUgZmFtaWx5IG9mIHN0cmFpbnMgYW5kIHRoZQpvdGhlcjsgc2FkbHkgYm90aCBmYW1pbGllcyBoYXZlIHNlbGYtaGVhbGluZyBhbmQgY2hyb25pYyBtZW1iZXJzLgoKYGBge3IgbHBfbm9iYXRjaCwgc2hvdy5maWc9ImhpZGUifQoKbHBfcGFpcndpc2Vfbm9iYXRjaCA8LSBzbShhbGxfcGFpcndpc2UobHBfaW5mX2ZpbHQsIG1vZGVsX2JhdGNoPUZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19lYnNlcT1GQUxTRSkpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2xwX2luZmVjdF9ub2JhdGNoX2NvbnRyLXZ7dmVyfS54bHN4IikKbHBfY29tYmluZWRfbm9iYXRjaCA8LSBzbShjb21iaW5lX2RlX3RhYmxlcyhscF9wYWlyd2lzZV9ub2JhdGNoLCBleGNlbD1leGNlbF9maWxlKSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1fbHBfaW5mZWN0X25vYmF0Y2hfc2lnLXZ7dmVyfS54bHN4IikKbHBfc2lnX25vYmF0Y2ggPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhscF9jb21iaW5lZF9ub2JhdGNoLCBleGNlbD1leGNlbF9maWxlKSkKYGBgCgpgYGB7ciBscF9iYXRjaCwgc2hvdy5maWc9ImhpZGUifQpscF9wYWlyd2lzZV9iYXRjaCA8LSBzbShhbGxfcGFpcndpc2UobHBfaW5mX2ZpbHQsIG1vZGVsX2JhdGNoPVRSVUUpKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9scF9pbmZlY3RfYmF0Y2hfY29udHItdnt2ZXJ9Lnhsc3giKQpscF9jb21iaW5lZF9iYXRjaCA8LSBzbShjb21iaW5lX2RlX3RhYmxlcyhscF9wYWlyd2lzZV9iYXRjaCwgZXhjZWw9ZXhjZWxfZmlsZSkpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2xwX2luZmVjdF9iYXRjaF9zaWctdnt2ZXJ9Lnhsc3giKQpscF9zaWdfYmF0Y2ggPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhscF9jb21iaW5lZF9iYXRjaCwgZXhjZWw9ZXhjZWxfZmlsZSkpCmBgYAoKYGBge3IgbHBfc3N2YSwgc2hvdy5maWc9ImhpZGUifQpscF9wYWlyd2lzZV9zc3ZhIDwtIHNtKGFsbF9wYWlyd2lzZShscF9pbmZfZmlsdCwgbW9kZWxfYmF0Y2g9InNzdmEiKSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1fbHBfaW5mZWN0X3NzdmFfY29udHItdnt2ZXJ9Lnhsc3giKQpscF9jb21iaW5lZF9zc3ZhIDwtIHNtKGNvbWJpbmVfZGVfdGFibGVzKGxwX3BhaXJ3aXNlX3NzdmEsIGV4Y2VsPWV4Y2VsX2ZpbGUpKQpleGNlbF9maWxlIDwtIGdsdWU6OmdsdWUoImV4Y2VsL3tydW5kYXRlfV9scF9pbmZlY3Rfc3N2YV9zaWctdnt2ZXJ9Lnhsc3giKQpscF9zaWdfc3N2YSA8LSBzbShleHRyYWN0X3NpZ25pZmljYW50X2dlbmVzKGxwX2NvbWJpbmVkX3NzdmEsIGV4Y2VsPWV4Y2VsX2ZpbGUpKQpgYGAKCmBgYHtyIGxwX2ZzdmEsIHNob3cuZmlnPSJoaWRlIn0KbHBfcGFpcndpc2VfZnN2YSA8LSBzbShhbGxfcGFpcndpc2UobHBfaW5mX2ZpbHQsIG1vZGVsX2JhdGNoPSJmc3ZhIikpCmV4Y2VsX2ZpbGUgPC0gZ2x1ZTo6Z2x1ZSgiZXhjZWwve3J1bmRhdGV9X2xwX2luZmVjdF9mc3ZhX2NvbnRyLXZ7dmVyfS54bHN4IikKbHBfY29tYmluZWRfZnN2YSA8LSBzbShjb21iaW5lX2RlX3RhYmxlcyhscF9wYWlyd2lzZV9mc3ZhLCBleGNlbD1leGNlbF9maWxlKSkKZXhjZWxfZmlsZSA8LSBnbHVlOjpnbHVlKCJleGNlbC97cnVuZGF0ZX1fbHBfaW5mZWN0X2ZzdmFfc2lnLXZ7dmVyfS54bHN4IikKbHBfc2lnX2ZzdmEgPC0gc20oZXh0cmFjdF9zaWduaWZpY2FudF9nZW5lcyhscF9jb21iaW5lZF9mc3ZhLCBleGNlbD1leGNlbF9maWxlKSkKYGBgCgpgYGB7ciBzYXZlbWUsIGV2YWw9RkFMU0V9CnBhbmRlcjo6cGFuZGVyKHNlc3Npb25JbmZvKCkpCm1lc3NhZ2UocGFzdGUwKCJUaGlzIGlzIGhwZ2x0b29scyBjb21taXQ6ICIsIGdldF9naXRfY29tbWl0KCkpKQp0aGlzX3NhdmUgPC0gcGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1ybWRfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKQptZXNzYWdlKHBhc3RlMCgiU2F2aW5nIHRvICIsIHRoaXNfc2F2ZSkpCnRtcCA8LSBzbShzYXZlbWUoZmlsZW5hbWU9dGhpc19zYXZlKSkKYGBgCgpgYGB7ciByZWxvYWQsIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmxvYWRtZShmaWxlbmFtZT10aGlzX3NhdmUpCmBgYAo=