Data preparation
Analysis is conducted on sample and comparative data where
contaminants have been removed (see authentication report).
The data frame with species counts is converted to the appropriate
format with one sample per row, and one column per taxon
Metadata for the included samples are prepared,
and for samples from this study only.
Data are converted to a matrix in 04-diversity.R for
further analysis with the mixOmics and vegan
R packages.
Diversity
Alpha
Experiment duration
Shannon index across the course of the experiment.

Not really enough samples to make any relevant interpretations.
Days were grouped for increased sample sizes.
- inoc = days 0,3,5
- treatment = days 7,9,12,15,18,21
- final = day 24

Slight decrease in Shannon diversity over the course of the
experiment.
Sample types
Shannon index compared between sample types.

Higher overall alpha diversity in the comparative samples than the
artificial samples, both medium and final calculus product. Saliva
samples from this study (NA) had a lower mean Shannon index than saliva
samples from other studies (NA).
Shannon vegan::diversity(species_otu_matrix)
and
unbiased Simpson
simpson.unb(species_otu_matrix,inverse = T)
.

Beta
Sparse principal components analysis (sPCA) was conducted on the
experimental samples only using the mixOmics R package,
and a separate analysis was conducted on the experimental and oral
reference samples. Prior to sPCA, the sample counts underwent a centered
log-ratio (CLR) transformation with +1 offset to avoid taking the log of
zero.
Experiment samples only


PC1 discriminates the saliva samples and early medium samples from
the later medium and calculus samples, while PC2 mainly discriminates
calculus from medium. Medium and final product are distinct from the
saliva samples used for inoculation.


PC1 sees mostly negative loadings on aerobes and facultative
anaerobes, while positive loadings are mostly anaerobes. PC2 is slightly
more balanced.
Artificial calculus and comparative oral sources
Scree plot of components.

sPCA plots of PC1 on PC2 and PC1 on PC3.


PC1 separates all artificial samples from the reference samples,
while PC2 separates some modern calculus samples from other oral
reference samples, as well as separating the artificial calculus from
this study from the comparative in vitro biofilms. PC3
separates some modern calculus samples from other comparative oral
samples.
Main drivers of discrimination. Top loading vectors for PC1 and
PC2.



Component 1 loadings are a mix of species of all oxygen tolerance,
and is the only component with high loadings from aerobes. All aerobes
have a negative loading on component 1. Component 2 contains only
anaerobes and facultative anaerobes, while component 3 contains only
anaerobes in the top 15 loadings.



Time-lag plot of Bray-Curtis data (under construction)
Discussion
Main takeaway is the loss of diversity across the experiment and
compared to reference samples. The donated saliva for the experiment had
a lower diversity than the reference saliva samples, and may have
contributed to a lower diversity in experiment samples. Community
profile of artificial calculus differs from the oral reference samples,
while modern calculus mostly resembles oral reference samples. The main
difference between artificial and reference samples seems to be a lack
of aerobes in artificial samples and a dominance by
Enterococcus spp.
LS0tCnRpdGxlOiAiUENBIGFuZCBkaXZlcnNpdHkgYW5hbHlzaXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQojbGlicmFyeSh2ZWdhbikKbGlicmFyeShtaXhPbWljcykKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWJibGUpCmxpYnJhcnkoZm9yY2F0cykKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGhlcmUpCgpsb2FkKGhlcmUoIjA1LXJlc3VsdHMvc3BjYV9ieW9jLnJkYSIpKQpsb2FkKGhlcmUoIjA1LXJlc3VsdHMvc3BjYV9zcGVjaWVzLnJkYSIpKQoKYWxwaGFfZGl2IDwtIHJlYWRfdHN2KGhlcmUoIjA1LXJlc3VsdHMvYWxwaGEtZGl2ZXJzaXR5LnRzdiIpKQptZXRhZGF0YSA8LSByZWFkX3RzdihoZXJlKCIwMS1kb2N1bWVudGF0aW9uL21ldGFkYXRhLnRzdiIpKQphbmFseXNpc19tZXRhZGF0YSA8LSByZWFkX3RzdihoZXJlKCIwMS1kb2N1bWVudGF0aW9uL2FuYWx5c2lzLW1ldGFkYXRhLnRzdiIpKQpleHBlcmltZW50X21ldGFkYXRhIDwtIHJlYWRfdHN2KGhlcmUoIjAxLWRvY3VtZW50YXRpb24vZXhwZXJpbWVudC1tZXRhZGF0YS50c3YiKSkgJT4lCiAgZmlsdGVyKGAjU2FtcGxlSURgICVpbiUgYW5hbHlzaXNfbWV0YWRhdGEkYCNTYW1wbGVJRGApCmJhY19wcm9wZXJ0aWVzIDwtIHJlYWRyOjpyZWFkX3RzdihoZXJlKCIwMS1kb2N1bWVudGF0aW9uL3NwZWNpZXMtcHJvcGVydGllcy50c3YiKSkKCnRyZWF0bWVudF9jb2xvdXJzIDwtIHZpcmlkaXNMaXRlOjppbmZlcm5vKG4gPSBsZW5ndGgodW5pcXVlKGV4cGVyaW1lbnRfbWV0YWRhdGEkdHJlYXRtZW50KSkpICMgZGVmaW5lIHBhbGxldHRlIGFuZCBudW1iZXIgb2YgY29sb3VycwplbnZfY29sb3VycyA8LSB2aXJpZGlzTGl0ZTo6bWFnbWEobiA9IGxlbmd0aCh1bmlxdWUoYW5hbHlzaXNfbWV0YWRhdGEkRW52KSkpICMgZGVmaW5lIHBhbGxldHRlIGFuZCBudW1iZXIgb2YgY29sb3VycwoKYWxwaGFfZGl2X2xvbmcgPC0gYWxwaGFfZGl2ICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gd2hlcmUoaXMubnVtZXJpYyksIG5hbWVzX3RvID0gImluZGV4IikgJT4lCiAgbGVmdF9qb2luKGRuYV9tZXRhZGF0YSwgYnkgPSBjKCJzYW1wbGUiID0gIiNTYW1wbGVJRCIpKSAlPiUKICBsZWZ0X2pvaW4oZG5hX2V4cGVyaW1lbnRfbWV0YWRhdGEsIGJ5ID0gYygic2FtcGxlIiA9ICIjU2FtcGxlSUQiLCAiRW52IikpICU+JQogIG11dGF0ZShkYXlfZ3JvdXBlZCA9IGNhc2Vfd2hlbiggIyBncm91cCBkYXlzIHRvIGluY3JlYXNlIHNhbXBsZSBzaXplCiAgICBkYXkgPCA2IH4gImlub2MiLAogICAgZGF5ID4gNiAmIGRheSA8IDI0IH4gInRyZWF0bSIsCiAgICBkYXkgPT0gMjQgfiAiZmluYWwiKSwKICAgIGRheV9ncm91cGVkID0gZmFjdG9yKGRheV9ncm91cGVkLCBsZXZlbHMgPSBjKCJpbm9jIiwgInRyZWF0bSIsICJmaW5hbCIpKQogICAgKQoKZXhwZXJpbWVudF9jb2xvdXJzIDwtIGV4cGVyaW1lbnRfbWV0YWRhdGEgJT4lCiAgYXJyYW5nZShkZXNjKGRheSkpICU+JSAKICBtdXRhdGUodHJlYXRfY29sID0gY2FzZV93aGVuKAogICAgICAgICAgIHRyZWF0bWVudCA9PSAicG90YXRvIiB+IHRyZWF0bWVudF9jb2xvdXJzWzFdLAogICAgICAgICAgIHRyZWF0bWVudCA9PSAid2hlYXQiIH4gdHJlYXRtZW50X2NvbG91cnNbMl0sCiAgICAgICAgICAgdHJlYXRtZW50ID09ICJtaXgiIH4gdHJlYXRtZW50X2NvbG91cnNbM10sCiAgICAgICAgICAgdHJlYXRtZW50ID09ICJjb250cm9sIiB+IHRyZWF0bWVudF9jb2xvdXJzWzRdLAogICAgICAgICAgIGlzLm5hKHRyZWF0bWVudCkgfiAiZ3JleSIpLAogICAgICAgICBlbnZfY29sID0gY2FzZV93aGVuKAogICAgICAgICAgIEVudiA9PSAic2FsaXZhIiB+IGVudl9jb2xvdXJzWzVdLAogICAgICAgICAgIEVudiA9PSAiYnlvY19jYWxjdWx1cyIgfiBlbnZfY29sb3Vyc1sxXSwKICAgICAgICAgICBFbnYgPT0gIm1lZGl1bSIgfiBlbnZfY29sb3Vyc1s4XQogICAgICAgICApKQphbmFseXNpc19jb2xvdXJzIDwtIGFuYWx5c2lzX21ldGFkYXRhICU+JQogIG11dGF0ZShlbnZfY29sID0gY2FzZV93aGVuKAogICAgRW52ID09ICJzYWxpdmEiIH4gZW52X2NvbG91cnNbNV0sCiAgICBFbnYgPT0gImJ5b2NfY2FsY3VsdXMiIH4gZW52X2NvbG91cnNbMV0sCiAgICBFbnYgPT0gIm1lZGl1bSIgfiBlbnZfY29sb3Vyc1s4XSwKICAgIEVudiA9PSAiYnVjY2FsX211Y29zYSIgfiBlbnZfY29sb3Vyc1s2XSwKICAgIEVudiA9PSAic3ViZ2luZ2l2YWxfcGxhcXVlIiB+IGVudl9jb2xvdXJzWzJdLAogICAgRW52ID09ICJzdXByYWdpbmdpdmFsX3BsYXF1ZSIgfiBlbnZfY29sb3Vyc1szXSwKICAgIEVudiA9PSAibW9kZXJuX2NhbGN1bHVzIiB+IGVudl9jb2xvdXJzWzRdCiAgICAgICAgICkpCgpgYGAKCiMgRGF0YSBwcmVwYXJhdGlvbgoKQW5hbHlzaXMgaXMgY29uZHVjdGVkIG9uIHNhbXBsZSBhbmQgY29tcGFyYXRpdmUgZGF0YSB3aGVyZSBjb250YW1pbmFudHMgaGF2ZQpiZWVuIHJlbW92ZWQgKHNlZSBbYXV0aGVudGljYXRpb24gcmVwb3J0XSguL2F1dGhlbnRpY2F0aW9uLlJtZCkpLgoKVGhlIGRhdGEgZnJhbWUgd2l0aCBzcGVjaWVzIGNvdW50cyBpcyBjb252ZXJ0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlIGZvcm1hdCB3aXRoIG9uZQpzYW1wbGUgcGVyIHJvdywgYW5kIG9uZSBjb2x1bW4gcGVyIHRheG9uCgpgYGB7ciBjb252ZXJ0LXRhYmxlfQojIHNwZWNpZXNfb3R1X3RhYmxlIDwtIG90dV90YWJsZSAlPiUKIyAgIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAiI09UVSBJRCIpICU+JQojICAgdCgpICU+JQojICAgYXNfdGliYmxlKHJvd25hbWVzID0gInNhbXBsZSIpCmBgYAoKTWV0YWRhdGEgZm9yIHRoZSBpbmNsdWRlZCBzYW1wbGVzIGFyZSBwcmVwYXJlZCwKCmBgYHtyIG1ldGFkYXRhfQpjb21wX21ldGFkYXRhIDwtIGFuYWx5c2lzX21ldGFkYXRhICU+JQogIGZpbHRlcigKICAgIEVudiAhPSAibWVkaXVtIiwKICAgIEVudiAhPSAic2VkaW1lbnQiLCAKICAgIEVudiAhPSAic2tpbiIsICAKICAgIEVudiAhPSAic3Rvb2wiLCAKICAgIEVudiAhPSAiaW5kb29yX2FpciIKICApCmBgYAoKYW5kIGZvciBzYW1wbGVzIGZyb20gdGhpcyBzdHVkeSBvbmx5LgoKYGBge3J9CnNhbXBsZV9tZXRhZGF0YSA8LSBleHBlcmltZW50X21ldGFkYXRhICU+JQogIGZpbHRlcihgI1NhbXBsZUlEYCAlaW4lIGFuYWx5c2lzX21ldGFkYXRhJGAjU2FtcGxlSURgKQpgYGAKCgpEYXRhIGFyZSBjb252ZXJ0ZWQgdG8gYSBtYXRyaXggaW4gWyowNC1kaXZlcnNpdHkuUipdKC4uLzAyLXNjcmlwdHMvMDQtZGl2ZXJzaXR5LlIpCmZvciBmdXJ0aGVyIGFuYWx5c2lzIHdpdGggdGhlClsqKm1peE9taWNzKipdKGh0dHA6Ly9taXhvbWljcy5vcmcvKSBhbmQKWyoqdmVnYW4qKl0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3ZlZ2FuL2luZGV4Lmh0bWwpClIgcGFja2FnZXMuCgoKIyBEaXZlcnNpdHkKCiMjIEFscGhhCgojIyMgRXhwZXJpbWVudCBkdXJhdGlvbgoKU2hhbm5vbiBpbmRleCBhY3Jvc3MgdGhlIGNvdXJzZSBvZiB0aGUgZXhwZXJpbWVudC4KCjwhLS0gbmVlZCB0byBjb21iaW5lIGRheXMgaW50byBsYXJnZXIgZ3JvdXBzIC0tPgoKYGBge3J9CiMgcGxvdCBzaGFubm9uIGluZGV4IGFjcm9zcyBzYW1wbGVzCmFscGhhX2RpdiAlPiUgCiAgI2FzX3RpYmJsZShyb3duYW1lcyA9ICJzYW1wbGUiKSAlPiUKICAjcmVuYW1lKCIjU2FtcGxlSUQiID0gc2FtcGxlKSAlPiUgCiAgbGVmdF9qb2luKGV4cGVyaW1lbnRfbWV0YWRhdGEsIGJ5ID0gYygic2FtcGxlIiA9ICIjU2FtcGxlSUQiKSkgJT4lIAogIG11dGF0ZShkYXkgPSBhc19mYWN0b3IoZGF5KSkgJT4lIAogIGZpbHRlcighaXMubmEoZGF5KSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGRheSwgeSA9IHNoYW5ub24sIGNvbCA9IGRheSkpICsKICAgIGdlb21fYm94cGxvdChvdXRsaWVyLmNvbG91ciA9IE5BKSArCiAgICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMikgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpOb3QgcmVhbGx5IGVub3VnaCBzYW1wbGVzIHRvIG1ha2UgYW55IHJlbGV2YW50IGludGVycHJldGF0aW9ucy4KCkRheXMgd2VyZSBncm91cGVkIGZvciBpbmNyZWFzZWQgc2FtcGxlIHNpemVzLgoKLSBpbm9jID0gZGF5cyAwLDMsNQotIHRyZWF0bWVudCA9IGRheXMgNyw5LDEyLDE1LDE4LDIxCi0gZmluYWwgPSBkYXkgMjQKCmBgYHtyfQpleHBlcmltZW50X21ldGFkYXRhX2V4dCA8LSBleHBlcmltZW50X21ldGFkYXRhICU+JQogIG11dGF0ZShkYXlfZ3JvdXAgPSBjYXNlX3doZW4oZGF5IDwgNiB+ICJpbm9jIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheSA+IDYgJiBkYXkgPCAyNCB+ICJ0cmVhdG0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5ID09IDI0IH4gImZpbmFsIikKICAgICAgICAgKQoKIyBhbHBoYV9kaXYgJT4lIAojICAgI2FzX3RpYmJsZShyb3duYW1lcyA9ICJzYW1wbGUiKSAlPiUKIyAgICNyZW5hbWUoIiNTYW1wbGVJRCIgPSBzYW1wbGUpICU+JSAKIyAgIGxlZnRfam9pbihleHBlcmltZW50X21ldGFkYXRhX2V4dCwgYnkgPSBjKCJzYW1wbGUiID0gIiNTYW1wbGVJRCIpKSAlPiUgCiMgICBtdXRhdGUoZGF5ID0gYXNfZmFjdG9yKGRheSkpICU+JSAKIyAgIGZpbHRlcighaXMubmEoZGF5KSkgJT4lIAojICAgZ2dwbG90KGFlcyh4ID0gZGF5X2dyb3VwLCB5ID0gc2hhbm5vbiwgY29sID0gZGF5X2dyb3VwKSkgKwojICAgICBnZW9tX2JveHBsb3Qob3V0bGllci5jb2xvdXIgPSBOQSkgKwojICAgICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMikgKwojICAgICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKG9wdGlvbiA9ICJEIikgKwojICAgICB0aGVtZV9taW5pbWFsKCkgKwojICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiMgICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vci55ID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpICsKIyAgICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJpbm9jIiwgInRyZWF0bSIsICJmaW5hbCIpKQoKYWxwaGFfZGl2X2xvbmcgJT4lIAogICNhc190aWJibGUocm93bmFtZXMgPSAic2FtcGxlIikgJT4lCiAgI3JlbmFtZSgiI1NhbXBsZUlEIiA9IHNhbXBsZSkgJT4lIAogICNsZWZ0X2pvaW4oZXhwZXJpbWVudF9tZXRhZGF0YSwgYnkgPSBjKCJzYW1wbGUiID0gIiNTYW1wbGVJRCIpKSAjJT4lIAogIG11dGF0ZShkYXkgPSBhc19mYWN0b3IoZGF5KSkgJT4lIAogIGZpbHRlcighaXMubmEoZGF5KSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGRheV9ncm91cGVkLCB5ID0gdmFsdWUsIGNvbCA9IGRheV9ncm91cGVkKSkgKwogICAgZ2VvbV9ib3hwbG90KG91dGxpZXIuY29sb3VyID0gTkEpICsKICAgIGdlb21faml0dGVyKHdpZHRoID0gMC4yKSArCiAgICBmYWNldF93cmFwKH4gaW5kZXgsIHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKG9wdGlvbiA9ICJEIikgKwogICAgdGhlbWVfbWluaW1hbCgpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIHBhbmVsLmdyaWQubWlub3IueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkgIysKICAgICNzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoImlub2MiLCAidHJlYXRtIiwgImZpbmFsIikpCgpgYGAKClNsaWdodCBkZWNyZWFzZSBpbiBTaGFubm9uIGRpdmVyc2l0eSBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIGV4cGVyaW1lbnQuCgojIyMgU2FtcGxlIHR5cGVzCgpTaGFubm9uIGluZGV4IGNvbXBhcmVkIGJldHdlZW4gc2FtcGxlIHR5cGVzLgoKYGBge3J9CmFscGhhX2RpdiAlPiUKICAjYXNfdGliYmxlKHJvd25hbWVzID0gInNhbXBsZSIpICU+JQogICNyZW5hbWUoIiNTYW1wbGVJRCIgPSBzYW1wbGUpICU+JSAKICBsZWZ0X2pvaW4oYW5hbHlzaXNfbWV0YWRhdGEsIGJ5ID0gYygic2FtcGxlIiA9ICIjU2FtcGxlSUQiKSkgJT4lIAogIGZpbHRlcihFbnYgIT0gInNlZGltZW50IiwgCiAgICAgICAgIEVudiAhPSAic2tpbiIsICAKICAgICAgICAgRW52ICE9ICJzdG9vbCIsIAogICAgICAgICBFbnYgIT0gImluZG9vcl9haXIiKSAlPiUKICByZW1vdmVfbWlzc2luZygpICU+JQogIGdncGxvdChhZXMoeCA9IEVudiwgeSA9IHNpbXBfdW5iLCBjb2wgPSBFbnYpKSArCiAgICBnZW9tX2JveHBsb3Qob3V0bGllci5jb2xvdXIgPSBOQSkgKwogICAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjIpICsKICAgIHRoZW1lX21pbmltYWwoKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDEsIGFuZ2xlID0gNDUpLAogICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpKSArCiAgICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKG9wdGlvbiA9ICJDIikKYGBgCgpIaWdoZXIgb3ZlcmFsbCBhbHBoYSBkaXZlcnNpdHkgaW4gdGhlIGNvbXBhcmF0aXZlIHNhbXBsZXMgdGhhbiB0aGUgYXJ0aWZpY2lhbApzYW1wbGVzLCBib3RoIG1lZGl1bSBhbmQgZmluYWwgY2FsY3VsdXMgcHJvZHVjdC4gU2FsaXZhIHNhbXBsZXMgZnJvbSB0aGlzIHN0dWR5CihgciBtZWFuKGFscGhhX2RpdiRzaGFubm9uW2MoIlNZTjAwMS5BMDEwMSIsIlNZTjAwMi5BMDEwMSIsICJTWU4wMDMuQTAxMDEiKV0pYCkKaGFkIGEgbG93ZXIgbWVhbiBTaGFubm9uIGluZGV4IHRoYW4gc2FsaXZhIHNhbXBsZXMgZnJvbSBvdGhlciBzdHVkaWVzCihgciBtZWFuKGFscGhhX2RpdiRzaGFubm9uW2MoIlNSUzAxOTEyMCIsICJTUlMwMTQ0NjgiLCAiU1JTMDE1MDU1IiwgIlNSUzAxNDY5MiIsICJTUlMwMTM5NDIiKV0pYCkuCgpTaGFubm9uIGB2ZWdhbjo6ZGl2ZXJzaXR5KHNwZWNpZXNfb3R1X21hdHJpeClgIGFuZCB1bmJpYXNlZCBTaW1wc29uCmBzaW1wc29uLnVuYihzcGVjaWVzX290dV9tYXRyaXgsaW52ZXJzZSA9IFQpYC4KCmBgYHtyfQphbHBoYV9kaXYgJT4lCiAgbGVmdF9qb2luKGFuYWx5c2lzX21ldGFkYXRhLCBieSA9IGMoInNhbXBsZSIgPSAiI1NhbXBsZUlEIikpICU+JSAKICBmaWx0ZXIoRW52ICE9ICJzZWRpbWVudCIsIAogICAgICAgICBFbnYgIT0gInNraW4iLCAgCiAgICAgICAgIEVudiAhPSAic3Rvb2wiLCAKICAgICAgICAgRW52ICE9ICJpbmRvb3JfYWlyIikgJT4lCiAgcmVtb3ZlX21pc3NpbmcoKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBzaGFubm9uLCB5ID0gc2ltcF91bmIsIGNvbCA9IEVudikpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICB0aGVtZV9taW5pbWFsKCkgKwogICAgc2NhbGVfY29sb3VyX3ZpcmlkaXNfZCgpCmBgYAoKIyMgQmV0YQoKU3BhcnNlIHByaW5jaXBhbCBjb21wb25lbnRzIGFuYWx5c2lzIChzUENBKSB3YXMgY29uZHVjdGVkIG9uIHRoZSBleHBlcmltZW50YWwKc2FtcGxlcyBvbmx5IHVzaW5nIHRoZSAqKm1peE9taWNzKiogUiBwYWNrYWdlLCBhbmQgYSBzZXBhcmF0ZSBhbmFseXNpcyB3YXMKY29uZHVjdGVkIG9uIHRoZSBleHBlcmltZW50YWwgYW5kIG9yYWwgcmVmZXJlbmNlIHNhbXBsZXMuIFByaW9yIHRvIHNQQ0EsIHRoZQpzYW1wbGUgY291bnRzIHVuZGVyd2VudCBhIGNlbnRlcmVkIGxvZy1yYXRpbyAoQ0xSKSB0cmFuc2Zvcm1hdGlvbiB3aXRoICsxIG9mZnNldAp0byBhdm9pZCB0YWtpbmcgdGhlIGxvZyBvZiB6ZXJvLgoKIyMjIEV4cGVyaW1lbnQgc2FtcGxlcyBvbmx5CgpgYGB7cn0KI2Nscl9ieW9jIDwtIGxvZ3JhdGlvLnRyYW5zZm8oYnlvY19vdHVfbWF0cml4LCAiQ0xSIiwgMSkKYGBgCgpgYGB7cn0KI3NwY2FfYnlvYyA8LSBzcGNhKGNscl9ieW9jLCBuY29tcCA9IDEwLCBzY2FsZSA9IEYpCmJ5b2NfZXhwbGFpbl92YXIgPC0gc3BjYV9ieW9jJHByb3BfZXhwbF92YXIkWApgYGAKCmBgYHtyfQpwbG90KHNwY2FfYnlvYywgdHlwZSA9ICJsIikKYGBgCgoKYGBge3J9CmJ5b2NfcHJpbmNvbXAgPC0gc3BjYV9ieW9jJHggJT4lCiAgYXNfdGliYmxlKHJvd25hbWVzID0gInNhbXBsZSIpICU+JQogIGxlZnRfam9pbihleHBlcmltZW50X21ldGFkYXRhLCBieSA9IGMoInNhbXBsZSIgPSAiI1NhbXBsZUlEIikpCmJ5b2NfcHJpbmNvbXAgJT4lCiAgZ2dwbG90KAogICAgYWVzKAogICAgICB4ID0gUEMxLCB5ID0gUEMyLCAKICAgICAgY29sID0gYXNfZmFjdG9yKGRheSksCiAgICAgIHNoYXBlID0gRW52CiAgICAgKQogICAgKSArCiAgICBnZW9tX3BvaW50KHNpemUgPSA0KSArCiAgICBsYWJzKAogICAgICB4ID0gcGFzdGUoCiAgICAgICAgIlBDMSIsIAogICAgICAgIHNjYWxlczo6cGVyY2VudChieW9jX2V4cGxhaW5fdmFyW1sxXV0sIGFjY3VyYWN5ID0gMC4xKSksCiAgICAgIHkgPSBwYXN0ZSgKICAgICAgICAiUEMyIiwgCiAgICAgICAgc2NhbGVzOjpwZXJjZW50KGJ5b2NfZXhwbGFpbl92YXJbWzJdXSwgYWNjdXJhY3kgPSAwLjEpKSwKICAgICAgY29sID0gIlNhbXBsaW5nIGRheSIsCiAgICAgIHNoYXBlID0gIlNhbXBsZSB0eXBlIgogICAgICApICsKICAgIHRoZW1lX2J3KCkgKwogICAgc2NhbGVfc2hhcGVfZGlzY3JldGUoc29saWQgPSBGKSArCiAgICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKCkKYGBgCgpQQzEgZGlzY3JpbWluYXRlcyB0aGUgc2FsaXZhIHNhbXBsZXMgYW5kIGVhcmx5IG1lZGl1bSBzYW1wbGVzIGZyb20gdGhlIGxhdGVyIG1lZGl1bQphbmQgY2FsY3VsdXMgc2FtcGxlcywgd2hpbGUgUEMyIG1haW5seSBkaXNjcmltaW5hdGVzIGNhbGN1bHVzIGZyb20gbWVkaXVtLgpNZWRpdW0gYW5kIGZpbmFsIHByb2R1Y3QgYXJlIGRpc3RpbmN0IGZyb20gdGhlIHNhbGl2YSBzYW1wbGVzIHVzZWQgZm9yIGlub2N1bGF0aW9uLgoKYGBge3J9CmV4cF9wY2FfbG9hZGluZ3MgPC0gc3BjYV9ieW9jJGxvYWRpbmdzJFggJT4lCiAgYXNfdGliYmxlKHJvd25hbWVzID0gInNwZWNpZXMiKSAlPiUKICBsZWZ0X2pvaW4oYmFjX3Byb3BlcnRpZXMsIGJ5ID0gInNwZWNpZXMiKSAlPiUgCiAgZHBseXI6OnNlbGVjdChzcGVjaWVzLFBDMSxQQzIsIGBPeHlnZW4gdG9sZXJhbmNlYCkgJT4lCiAgYXJyYW5nZShkZXNjKGFicyhQQzEpKSkKZXhwX3BjYV9sb2FkaW5ncwoKbG9hZGluZ190aGVtZSA8LSAgdGhlbWVfbWluaW1hbCgpICsKICAgIHRoZW1lKAogICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICBheGlzLnRpY2tzLnguYm90dG9tID0gZWxlbWVudF9saW5lKHNpemUgPSAxKSwKICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoKSwKICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQodmp1c3QgPSAtMC4yKSwKICAgICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoKSwKICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIKICAgICAgICAgICkKbWluX1BDMSA8LSBtaW4oZXhwX3BjYV9sb2FkaW5ncyRQQzEpCm1pbl9QQzIgPC0gbWluKGV4cF9wY2FfbG9hZGluZ3MkUEMyKQptYXhfUEMxIDwtIG1heChleHBfcGNhX2xvYWRpbmdzJFBDMSkKbWF4X1BDMiA8LSBtYXgoZXhwX3BjYV9sb2FkaW5ncyRQQzIpCmBgYAoKYGBge3J9CmV4cF9wY2FfbG9hZGluZ3MgJT4lCiAgYXJyYW5nZShkZXNjKFBDMSkpICU+JQogIG11dGF0ZShzcGVjaWVzID0gZmN0X3Jlb3JkZXIoc3BlY2llcywgZGVzYyhQQzEpKSkgJT4lCiAgIyB0b3AgMjAgcG9zaXRpdmUgYW5kIHRvcCAyMCBuZWdhdGl2ZSBsb2FkaW5ncwogIHNsaWNlKGMoCiAgICAxOjIwLCAKICAgIHNlcShmcm9tID0gbnJvdyhleHBfcGNhX2xvYWRpbmdzKS0xOSwgdG8gPSBucm93KGV4cF9wY2FfbG9hZGluZ3MpKQogICAgKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gUEMxLCB5ID0gc3BlY2llcywgZmlsbCA9IGBPeHlnZW4gdG9sZXJhbmNlYCkpICsKICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDAuOCkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMobWluX1BDMSxtYXhfUEMxKSkgKwogICAgc2NhbGVfZmlsbF9tYW51YWwoCiAgICAgIHZhbHVlcyA9IHZpcmlkaXNMaXRlOjp0dXJibyhuID0gbGVuZ3RoKGxldmVscyhhcy5mYWN0b3IoYmFjX3Byb3BlcnRpZXMkYE94eWdlbiB0b2xlcmFuY2VgKSkpKSkgKwogICAgbGFicyh0aXRsZSA9ICJjb21wb25lbnQgMSIsIHggPSAiIikgKwogICAgbG9hZGluZ190aGVtZQoKZXhwX3BjYV9sb2FkaW5ncyAlPiUKICBhcnJhbmdlKGRlc2MoUEMyKSkgJT4lCiAgbXV0YXRlKHNwZWNpZXMgPSBmY3RfcmVvcmRlcihzcGVjaWVzLCBkZXNjKFBDMikpKSAlPiUKICBzbGljZShjKAogICAgMToyMCwKICAgIHNlcShmcm9tID0gbnJvdyhleHBfcGNhX2xvYWRpbmdzKS0xOSwgdG8gPSBucm93KGV4cF9wY2FfbG9hZGluZ3MpKQogICAgKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gUEMyLCB5ID0gc3BlY2llcywgZmlsbCA9IGBPeHlnZW4gdG9sZXJhbmNlYCkpICsKICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDAuOCkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTAuMTgsMC4xKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKAogICAgICB2YWx1ZXMgPSB2aXJpZGlzTGl0ZTo6dHVyYm8oCiAgICAgICAgbiA9IGxlbmd0aChsZXZlbHMoYXMuZmFjdG9yKGJhY19wcm9wZXJ0aWVzJGBPeHlnZW4gdG9sZXJhbmNlYCkpKQogICAgICAgICkKICAgICAgKSArCiAgICBsYWJzKHRpdGxlID0gImNvbXBvbmVudCAyIiwgeCA9ICIiKSArCiAgICBsb2FkaW5nX3RoZW1lCgoKI3Bsb3RMb2FkaW5ncyhzcGNhX2J5b2MsIG5kaXNwbGF5ID0gMTUpCiNwbG90TG9hZGluZ3Moc3BjYV9ieW9jLCAyLCBuZGlzcGxheSA9IDE1KQpgYGAKClBDMSBzZWVzIG1vc3RseSBuZWdhdGl2ZSBsb2FkaW5ncyBvbiBhZXJvYmVzIGFuZCBmYWN1bHRhdGl2ZSBhbmFlcm9iZXMsIHdoaWxlCnBvc2l0aXZlIGxvYWRpbmdzIGFyZSBtb3N0bHkgYW5hZXJvYmVzLiBQQzIgaXMgc2xpZ2h0bHkgbW9yZSBiYWxhbmNlZC4KCiMjIyBBcnRpZmljaWFsIGNhbGN1bHVzIGFuZCBjb21wYXJhdGl2ZSBvcmFsIHNvdXJjZXMKClNjcmVlIHBsb3Qgb2YgY29tcG9uZW50cy4KCmBgYHtyfQpwbG90KHNwY2Ffc3BlY2llcywgdHlwZSA9ICJsIikKYGBgCgpzUENBIHBsb3RzIG9mIFBDMSBvbiBQQzIgYW5kIFBDMSBvbiBQQzMuCgpgYGB7cn0Kc3BjYV9jb21wYXIgPC0gc3BjYV9zcGVjaWVzJHggJT4lCiAgYXNfdGliYmxlKHJvd25hbWVzID0gInNhbXBsZSIpICU+JQogIGxlZnRfam9pbihtZXRhZGF0YSwgYnkgPSBjKCJzYW1wbGUiID0gIiNTYW1wbGVJRCIpKQpjb21wYXJfZXhwbGFpbl92YXIgPC0gc3BjYV9zcGVjaWVzJHByb3BfZXhwbF92YXIkWAoKc3BjYV9jb21wYXIgJT4lCiAgZ2dwbG90KGFlcyh4ID0gUEMxLCB5ID0gUEMyLCBjb2wgPSBFbnYsIHNoYXBlID0gRW52KSkgKwogICAgZ2VvbV9wb2ludChzaXplID0gMykgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgc2l6ZSA9IDAuMikgKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgc2l6ZSA9IDAuMikgKwogICAgdGhlbWVfYncoKSArCiAgICBsYWJzKHggPSBwYXN0ZSgKICAgICAgIlBDMSIsIHNjYWxlczo6cGVyY2VudChjb21wYXJfZXhwbGFpbl92YXJbWzFdXSwgYWNjdXJhY3kgPSAwLjEpCiAgICAgICksCiAgICAgIHkgPSBwYXN0ZSgKICAgICAgICAiUEMyIiwgc2NhbGVzOjpwZXJjZW50KGNvbXBhcl9leHBsYWluX3ZhcltbMl1dLCBhY2N1cmFjeSA9IDAuMSkKICAgICAgKQogICAgKSArCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXNfZChvcHRpb24gPSAiQyIpICsKICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gMTpsZW5ndGgobGV2ZWxzKGFzLmZhY3RvcihzcGNhX2NvbXBhciRFbnYpKSkpCgpzcGNhX2NvbXBhciAlPiUKICBnZ3Bsb3QoYWVzKHggPSBQQzEsIHkgPSBQQzMsIGNvbCA9IEVudiwgc2hhcGUgPSBFbnYpKSArCiAgICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBzaXplID0gMC4yKSArCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBzaXplID0gMC4yKSArCiAgICB0aGVtZV9idygpICsKICAgIGxhYnMoeCA9IHBhc3RlKAogICAgICAiUEMxIiwgc2NhbGVzOjpwZXJjZW50KGNvbXBhcl9leHBsYWluX3ZhcltbMV1dLCBhY2N1cmFjeSA9IDAuMSkKICAgICAgKSwKICAgICAgeSA9IHBhc3RlKAogICAgICAgICJQQzMiLCBzY2FsZXM6OnBlcmNlbnQoY29tcGFyX2V4cGxhaW5fdmFyW1szXV0sIGFjY3VyYWN5ID0gMC4xKQogICAgICApCiAgICApICsKICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKG9wdGlvbiA9ICJDIikgKwogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSAxOmxlbmd0aChsZXZlbHMoYXMuZmFjdG9yKHNwY2FfY29tcGFyJEVudikpKSkgKwogIGxhYnMoY29sID0gIkVudiIsIHNoYXBlID0gIkVudiIpCmBgYAoKUEMxIHNlcGFyYXRlcyBhbGwgYXJ0aWZpY2lhbCBzYW1wbGVzIGZyb20gdGhlIHJlZmVyZW5jZSBzYW1wbGVzLCB3aGlsZQpQQzIgc2VwYXJhdGVzIHNvbWUgbW9kZXJuIGNhbGN1bHVzIHNhbXBsZXMgZnJvbSBvdGhlciBvcmFsIHJlZmVyZW5jZSBzYW1wbGVzLAphcyB3ZWxsIGFzIHNlcGFyYXRpbmcgdGhlIGFydGlmaWNpYWwgY2FsY3VsdXMgZnJvbSB0aGlzIHN0dWR5IGZyb20gdGhlIGNvbXBhcmF0aXZlCippbiB2aXRybyogYmlvZmlsbXMuIFBDMyBzZXBhcmF0ZXMgc29tZSBtb2Rlcm4gY2FsY3VsdXMgc2FtcGxlcyBmcm9tIG90aGVyIGNvbXBhcmF0aXZlCm9yYWwgc2FtcGxlcy4KCk1haW4gZHJpdmVycyBvZiBkaXNjcmltaW5hdGlvbi4gVG9wIGxvYWRpbmcgdmVjdG9ycyBmb3IgUEMxIGFuZCBQQzIuCgpgYGB7cn0KcGNhX2xvYWRpbmdzIDwtIHNwY2Ffc3BlY2llcyRyb3RhdGlvbiAlPiUKICBhc190aWJibGUocm93bmFtZXMgPSAic3BlY2llcyIpICU+JQogIGxlZnRfam9pbihiYWNfcHJvcGVydGllcywgYnkgPSAic3BlY2llcyIpICU+JSAKICBkcGx5cjo6c2VsZWN0KHNwZWNpZXMsUEMxLFBDMixQQzMsYE94eWdlbiB0b2xlcmFuY2VgKSAlPiUKICBhcnJhbmdlKGRlc2MoYWJzKFBDMSkpKQoKcGNhX2xvYWRpbmdzICU+JQogIGFycmFuZ2UoZGVzYyhQQzEpKQoKcGNhX2xvYWRpbmdzICU+JQogIGFycmFuZ2UoZGVzYyhhYnMoUEMyKSkpCmBgYAoKYGBge3J9CnBjYV9sb2FkaW5ncyAlPiUKICBtdXRhdGUoc3BlY2llcyA9IGZjdF9yZW9yZGVyKHNwZWNpZXMsIGRlc2MoYWJzKFBDMSkpKSkgJT4lCiAgc2xpY2VfaGVhZChuID0gMTUpICU+JQogIGdncGxvdChhZXMoeCA9IFBDMSwgeSA9IHNwZWNpZXMsIGZpbGwgPSBgT3h5Z2VuIHRvbGVyYW5jZWApKSArCiAgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAwLjgpICsKICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjE4LDAuMTgpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwoCiAgICAgIHZhbHVlcyA9IHZpcmlkaXNMaXRlOjp0dXJibygKICAgICAgICBuID0gbGVuZ3RoKGxldmVscyhhcy5mYWN0b3IoYmFjX3Byb3BlcnRpZXMkYE94eWdlbiB0b2xlcmFuY2VgKSkpCiAgICAgICAgKQogICAgICApICsKICAgIGxhYnModGl0bGUgPSAiY29tcG9uZW50IDEiLCB4ID0gIiIpICsKICAgIGxvYWRpbmdfdGhlbWUKCnBjYV9sb2FkaW5ncyAlPiUKICBhcnJhbmdlKGRlc2MoYWJzKFBDMikpKSAlPiUKICBtdXRhdGUoc3BlY2llcyA9IGZjdF9yZW9yZGVyKHNwZWNpZXMsIGRlc2MoYWJzKFBDMikpKSkgJT4lCiAgc2xpY2VfaGVhZChuID0gMTUpICU+JQogIGdncGxvdChhZXMoeCA9IFBDMiwgeSA9IHNwZWNpZXMsIGZpbGwgPSBgT3h5Z2VuIHRvbGVyYW5jZWApKSArCiAgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAwLjgpICsKICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjE1LDAuMTUpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwoCiAgICAgIHZhbHVlcyA9IHZpcmlkaXNMaXRlOjp0dXJibygKICAgICAgICBuID0gbGVuZ3RoKGxldmVscyhhcy5mYWN0b3IoYmFjX3Byb3BlcnRpZXMkYE94eWdlbiB0b2xlcmFuY2VgKSkpCiAgICAgICAgKQogICAgICApICsKICAgIGxhYnModGl0bGUgPSAiY29tcG9uZW50IDIiLCB4ID0gIiIpICsKICAgIGxvYWRpbmdfdGhlbWUKCnBjYV9sb2FkaW5ncyAlPiUKICBhcnJhbmdlKGRlc2MoYWJzKFBDMykpKSAlPiUKICBtdXRhdGUoc3BlY2llcyA9IGZjdF9yZW9yZGVyKHNwZWNpZXMsIGRlc2MoYWJzKFBDMykpKSkgJT4lCiAgc2xpY2VfaGVhZChuID0gMTUpICU+JQogIGdncGxvdChhZXMoeCA9IFBDMywgeSA9IHNwZWNpZXMsIGZpbGwgPSBgT3h5Z2VuIHRvbGVyYW5jZWApKSArCiAgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAwLjgpICsKICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjEyLDAuMTIpKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCgKICAgICAgdmFsdWVzID0gdmlyaWRpc0xpdGU6OnR1cmJvKAogICAgICAgIG4gPSBsZW5ndGgobGV2ZWxzKGFzLmZhY3RvcihiYWNfcHJvcGVydGllcyRgT3h5Z2VuIHRvbGVyYW5jZWApKSkKICAgICAgICApCiAgICAgICkgKwogICAgbGFicyh0aXRsZSA9ICJjb21wb25lbnQgMyIsIHggPSAiIikgKwogICAgbG9hZGluZ190aGVtZQoKIyBwbG90TG9hZGluZ3Moc3BjYV9zcGVjaWVzLCBuZGlzcGxheSA9IDE1KQojIHBsb3RMb2FkaW5ncyhzcGNhX3NwZWNpZXMsIDIsIG5kaXNwbGF5ID0gMTUpCiMgcGxvdExvYWRpbmdzKHNwY2Ffc3BlY2llcywgMywgbmRpc3BsYXkgPSAxNSkKYGBgCgpDb21wb25lbnQgMSBsb2FkaW5ncyBhcmUgYSBtaXggb2Ygc3BlY2llcyBvZiBhbGwgb3h5Z2VuIHRvbGVyYW5jZSwgYW5kIGlzIHRoZQpvbmx5IGNvbXBvbmVudCB3aXRoIGhpZ2ggbG9hZGluZ3MgZnJvbSBhZXJvYmVzLiBBbGwgYWVyb2JlcyBoYXZlIGEgbmVnYXRpdmUKbG9hZGluZyBvbiBjb21wb25lbnQgMS4gQ29tcG9uZW50IDIgY29udGFpbnMgb25seQphbmFlcm9iZXMgYW5kIGZhY3VsdGF0aXZlIGFuYWVyb2Jlcywgd2hpbGUgY29tcG9uZW50IDMgY29udGFpbnMgb25seSBhbmFlcm9iZXMKaW4gdGhlIHRvcCAxNSBsb2FkaW5ncy4KCmBgYHtyfQpwbG90VmFyKHNwY2Ffc3BlY2llcywgY3V0b2ZmID0gMC45MCkKYGBgCgpgYGB7cn0KIyBzcGNhX2NvbXBhciAlPiUKIyAgIGdncGxvdChhZXMoeCA9IFBDMSwgeSA9IFBDMiwgY29sID0gYW5hbHlzaXNfbWV0YWRhdGEgJT4lCiMgICAgICAgICAgICAgICAgZmlsdGVyKGAjU2FtcGxlSURgICVpbiUgcm93bmFtZXMoY29tcF9vdHVfbWF0cml4KSkgJT4lCiMgICAgICAgICAgICAgICAgLiRFbnYsIHNoYXBlID0gYW5hbHlzaXNfbWV0YWRhdGEgJT4lCiMgICAgICAgICAgICAgICAgZmlsdGVyKGAjU2FtcGxlSURgICVpbiUgcm93bmFtZXMoY29tcF9vdHVfbWF0cml4KSkgJT4lCiMgICAgICAgICAgICAgICAgLiRFbnYpKSArCiMgICAgIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKIyAgICAgZ2VvbV9zZWdtZW50KGRhdGEgPSBwY2FfbG9hZGluZ3NbMTozLF0sIGFlcyh4ID0gMCwgeSA9IDAsIHhlbmQgPSAoUEMxKjUwMCksCiMgICAgICB5ZW5kID0gKFBDMio1MDApKSwgYXJyb3cgPSBhcnJvdyhsZW5ndGggPSB1bml0KDAuMiwgImNtIikpLAojICAgICAgY29sb3IgPSAiYmxhY2siLCBpbmhlcml0LmFlcyA9IEYpICsKIyAgICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgc2l6ZSA9IDAuMikgKwojICAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBzaXplID0gMC4yKSArCiMgICAgIHRoZW1lX2J3KCkgKwojICAgICBsYWJzKHggPSBwYXN0ZSgKIyAgICAgICAiUEMxIiwgc2NhbGVzOjpwZXJjZW50KGNvbXBhcl9leHBsYWluX3ZhcltbMV1dLCBhY2N1cmFjeSA9IDAuMSkKIyAgICAgICApLAojICAgICAgIHkgPSBwYXN0ZSgKIyAgICAgICAgICJQQzIiLCBzY2FsZXM6OnBlcmNlbnQoY29tcGFyX2V4cGxhaW5fdmFyW1syXV0sIGFjY3VyYWN5ID0gMC4xKQojICAgICAgICkKIyAgICAgKSArCiMgICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKCkgKwojICAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IDE6OCkgKwojICAgbGFicyhjb2wgPSAiRW52Iiwgc2hhcGUgPSAiRW52IikKYGBgCgoKYGBge3J9CiNlbnZfZ3JvdXAgPC0gY29tcF9tZXRhZGF0YSRFbnZbY29tcF9tZXRhZGF0YSRgI1NhbXBsZUlEYCAlaW4lIHJvd25hbWVzKGNvbXBfb3R1X21hdHJpeCldCmJpcGxvdCgKICBzcGNhX3NwZWNpZXMsCiAgY29tcCA9IDE6MiwKICBjdXRvZmYgPSAwLjkwLAogIGluZC5uYW1lcyA9IEYsIHZhci5uYW1lcy5zaXplID0gMykKYGBgCgpgYGB7cn0Kcm93X3NpZGVfY29sb3VycyA8LSBhbmFseXNpc19jb2xvdXJzICU+JQogIGZpbHRlcihgI1NhbXBsZUlEYCAlaW4lIHJvd25hbWVzKHNwY2Ffc3BlY2llcyRYKSkgJT4lCiAgYXJyYW5nZShyb3duYW1lcyhzcGNhX3NwZWNpZXMkeCkpCmNpbShzcGNhX3NwZWNpZXMsIGN1dG9mZiA9IDAuNSwgcm93LnNpZGVDb2xvcnMgPSByb3dfc2lkZV9jb2xvdXJzJGVudl9jb2wpCmBgYAoKVGltZS1sYWcgcGxvdCBvZiBCcmF5LUN1cnRpcyBkYXRhICh1bmRlciBjb25zdHJ1Y3Rpb24pCgpgYGB7cn0KIyBjb21tX21hdHJpeCA8LSBieW9jX290dV9tYXRyaXggJT4lCiMgICBhc190aWJibGUocm93bmFtZXMgPSAic2FtcGxlIikgJT4lCiMgICBsZWZ0X2pvaW4oZHBseXI6OnNlbGVjdChleHBlcmltZW50X21ldGFkYXRhLCBjKGAjU2FtcGxlSURgLCBkYXkpKSwgYnkgPSBjKCJzYW1wbGUiID0gIiNTYW1wbGVJRCIpKQpgYGAKCiMgRGlzY3Vzc2lvbgoKTWFpbiB0YWtlYXdheSBpcyB0aGUgbG9zcyBvZiBkaXZlcnNpdHkgYWNyb3NzIHRoZSBleHBlcmltZW50IGFuZCBjb21wYXJlZCB0bwpyZWZlcmVuY2Ugc2FtcGxlcy4gVGhlIGRvbmF0ZWQgc2FsaXZhIGZvciB0aGUgZXhwZXJpbWVudCBoYWQgYSBsb3dlciBkaXZlcnNpdHkKdGhhbiB0aGUgcmVmZXJlbmNlIHNhbGl2YSBzYW1wbGVzLCBhbmQgbWF5IGhhdmUgY29udHJpYnV0ZWQgdG8gYSBsb3dlciBkaXZlcnNpdHkKaW4gZXhwZXJpbWVudCBzYW1wbGVzLiBDb21tdW5pdHkgcHJvZmlsZSBvZiBhcnRpZmljaWFsIGNhbGN1bHVzIGRpZmZlcnMgZnJvbQp0aGUgb3JhbCByZWZlcmVuY2Ugc2FtcGxlcywgd2hpbGUgbW9kZXJuIGNhbGN1bHVzIG1vc3RseSByZXNlbWJsZXMgb3JhbCByZWZlcmVuY2UKc2FtcGxlcy4gVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIGFydGlmaWNpYWwgYW5kIHJlZmVyZW5jZSBzYW1wbGVzIHNlZW1zIHRvIGJlCmEgbGFjayBvZiBhZXJvYmVzIGluIGFydGlmaWNpYWwgc2FtcGxlcyBhbmQgYSBkb21pbmFuY2UgYnkgKkVudGVyb2NvY2N1cyogc3BwLgo=