We select 776 genomes from a big data set containing thousands of them. We enforce that there must be one genome per group of organisms. We use different criteria: GC closest to the mean of the group, genome with the largest size in the group, genome with the lowest amount of contamination, most complete genome, genome closest to the parent node of the group. We also use two compound measures, that weigh each variable the same: one that includes all of them, and one that includes all of them except GC. Finally I compare the sampled genomes with each of those approaches to all genomes in the data set, and to a random sample of genomes.
setwd("~/Data/TransferRelated/datingWithTransfers/TOL_Dating_From_Literature/Bacteria")
d0 <- read.table("Data/bac_metadata_r86.tsv", h=T, sep="\t", fill=T, na.strings = c("none", "na", "NA"), colClasses = "character", quote="")
d = d0
d$gc_percentage <- as.numeric(d$gc_percentage)
d$genome_size <- as.numeric(d$genome_size)
d$checkm_completeness <- as.numeric(d$checkm_completeness)
d$checkm_contamination <- as.numeric(d$checkm_contamination)
# Some contamination values are above 100!
d[d$checkm_contamination > 100,]$checkm_contamination <- 100
d$genome_size <- as.numeric(d$genome_size)
summary(d)
accession scaffold_count gc_count longest_scaffold gc_percentage total_gap_length genome_size
Length:125243 Length:125243 Length:125243 Length:125243 Min. :15.39 Length:125243 Min. : 263431
Class :character Class :character Class :character Class :character 1st Qu.:38.70 Class :character 1st Qu.: 2367357
Mode :character Mode :character Mode :character Mode :character Median :50.10 Mode :character Median : 3972280
Mean :48.33 Mean : 3861036
3rd Qu.:57.23 3rd Qu.: 5015665
Max. :76.64 Max. :153722611
n50_contigs n50_scaffolds l50_scaffolds contig_count ambiguous_bases longest_contig
Length:125243 Length:125243 Length:125243 Length:125243 Length:125243 Length:125243
Class :character Class :character Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character Mode :character Mode :character
l50_contigs mean_scaffold_length mean_contig_length trna_aa_count trna_selenocysteine_count trna_count
Length:125243 Length:125243 Length:125243 Length:125243 Length:125243 Length:125243
Class :character Class :character Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character Mode :character Mode :character
checkm_completeness checkm_contamination protein_count coding_bases coding_density ssu_count
Min. : 0.57 Min. : 0.0000 Length:125243 Length:125243 Length:125243 Length:125243
1st Qu.: 99.06 1st Qu.: 0.0400 Class :character Class :character Class :character Class :character
Median : 99.55 Median : 0.2500 Mode :character Mode :character Mode :character Mode :character
Mean : 96.94 Mean : 0.8041
3rd Qu.: 99.94 3rd Qu.: 0.7200
Max. :100.00 Max. :100.0000
checkm_marker_count checkm_marker_lineage checkm_marker_set_count checkm_strain_heterogeneity lsu_5s_count ncbi_taxonomy
Length:125243 Length:125243 Length:125243 Length:125243 Length:125243 Length:125243
Class :character Class :character Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character Mode :character Mode :character
gtdb_genome_representative gtdb_representative ncbi_taxonomy_unfiltered ncbi_type_material ncbi_biosample ncbi_total_gap_length
Length:125243 Length:125243 Length:125243 Length:125243 Length:125243 Length:125243
Class :character Class :character Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character Mode :character Mode :character
ncbi_molecule_count ncbi_date ncbi_submitter ncbi_ncrna_count ncbi_scaffold_n50 ncbi_assembly_name
Length:125243 Length:125243 Length:125243 Length:125243 Length:125243 Length:125243
Class :character Class :character Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character Mode :character Mode :character
ncbi_scaffold_n75 ncbi_protein_count ncbi_assembly_type ncbi_rrna_count ncbi_genbank_assembly_accession ncbi_total_length
Length:125243 Length:125243 Length:125243 Length:125243 Length:125243 Length:125243
Class :character Class :character Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character Mode :character Mode :character
ncbi_unspanned_gaps ncbi_taxid ncbi_trna_count ncbi_genome_representation ncbi_spanned_gaps ncbi_translation_table
Length:125243 Length:125243 Length:125243 Length:125243 Length:125243 Length:125243
Class :character Class :character Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character Mode :character Mode :character
ncbi_scaffold_n90 ncbi_contig_count ncbi_organism_name ncbi_contig_n50 ncbi_ungapped_length ncbi_scaffold_l50
Length:125243 Length:125243 Length:125243 Length:125243 Length:125243 Length:125243
Class :character Class :character Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character Mode :character Mode :character
ncbi_ssu_count ncbi_scaffold_count ncbi_assembly_level ncbi_refseq_category ncbi_species_taxid ncbi_isolate
Length:125243 Length:125243 Length:125243 Length:125243 Length:125243 Length:125243
Class :character Class :character Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character Mode :character Mode :character
ncbi_wgs_master ncbi_bioproject ncbi_seq_rel_date ncbi_isolation_source ncbi_country ncbi_lat_lon
Length:125243 Length:125243 Length:125243 Length:125243 Length:125243 Length:125243
Class :character Class :character Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character Mode :character Mode :character
ncbi_strain_identifiers ssu_gg_taxonomy ssu_gg_blast_bitscore ssu_gg_blast_subject_id ssu_gg_blast_perc_identity
Length:125243 Length:125243 Length:125243 Length:125243 Length:125243
Class :character Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character Mode :character
ssu_gg_blast_evalue ssu_gg_blast_align_len ssu_gg_query_id ssu_gg_length ssu_silva_blast_bitscore ssu_silva_taxonomy
Length:125243 Length:125243 Length:125243 Length:125243 Length:125243 Length:125243
Class :character Class :character Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character Mode :character Mode :character
ssu_silva_blast_subject_id ssu_silva_blast_align_len ssu_silva_blast_evalue ssu_silva_blast_perc_identity lsu_5s_query_id
Length:125243 Length:125243 Length:125243 Length:125243 Length:125243
Class :character Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character Mode :character
lsu_5s_length lsu_5s_contig_len gtdb_taxonomy mimag_high_quality gtdb_cluster_size gtdb_clustered_genomes
Length:125243 Length:125243 Length:125243 Length:125243 Length:125243 Length:125243
Class :character Class :character Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character Mode :character Mode :character
gtdb_type_material
Length:125243
Class :character
Mode :character
samp <- read.table("Data/representant", h=F, colClasses = "character")$V1
summary(samp)
Length Class Mode
776 character character
subd <- d[which(d$accession%in%samp),]
sampRand <- read.table("Data/representantRandom", h=F, colClasses = "character")$V1
summary(sampRand)
Length Class Mode
7760 character character
subdRand <- d[which(d$accession%in%sampRand),]
sampGC <- read.table("Data/representantBestGC", h=F, colClasses = "character")$V1
summary(sampGC)
Length Class Mode
776 character character
subdGC <- d[which(d$accession%in%sampGC),]
sampContamination <- read.table("Data/representantBestContamination", h=F, colClasses = "character")$V1
summary(sampContamination)
Length Class Mode
776 character character
subdContamination <- d[which(d$accession%in%sampContamination),]
sampCompleteness <- read.table("Data/representantBestCompleteness", h=F, colClasses = "character")$V1
summary(sampCompleteness)
Length Class Mode
776 character character
subdCompleteness <- d[which(d$accession%in%sampCompleteness),]
sampDistance <- read.table("Data/representantBestDistance", h=F, colClasses = "character")$V1
summary(sampDistance)
Length Class Mode
776 character character
subdDistance <- d[which(d$accession%in%sampDistance),]
sampSize <- read.table("Data/representantBestSize", h=F, colClasses = "character")$V1
summary(sampSize)
Length Class Mode
776 character character
subdSize <- d[which(d$accession%in%sampSize),]
sampNoGC <- read.table("Data/representantNoGC", h=F, colClasses = "character")$V1
summary(sampNoGC)
Length Class Mode
776 character character
subdNoGC <- d[which(d$accession%in%sampNoGC),]
names = c("all", "selected", "selected without GC", "best GC", "best size", "best Contamination", "best Completeness", "best Distance", "Random 10")
colors = c("white", "red", "pink", "orange", "darkgreen", "blue", "purple", "grey", "brown")
par(pin=c(7.2,3))
par(mar = c(7, 4, 2, 2) + 0.2) #add room for the rotated labels
end_point = length(names)
boxplot(d$gc_percentage, subd$gc_percentage, subdNoGC$gc_percentage, subdGC$gc_percentage, subdSize$gc_percentage, subdContamination$gc_percentage, subdCompleteness$gc_percentage, subdDistance$gc_percentage, subdRand$gc_percentage, col=colors, main="GC content in all and sampled genomes", names=names, cex.axis=0.7, xaxt="n", space=1)
text(seq(1,end_point,by=1), par("usr")[3]-0.25,
srt = 60, adj= 1, xpd = TRUE,
labels = names, cex=0.65)

#par(mfrow=c(1,2))
#plot(density(as.numeric(as.character(d$genome_size)), na.rm = T), lwd=2, xlim=c(0,10000000), ylim=c(0,0.000001), main="Genome size in all and sampled genomes")
#lines(density(as.numeric(as.character(subd$genome_size)), na.rm = T), lwd=2, col="red")
boxplot(d$genome_size, subd$genome_size, subdNoGC$genome_size, subdGC$genome_size, subdSize$genome_size, subdContamination$genome_size, subdCompleteness$genome_size, subdDistance$genome_size, subdRand$genome_size, log="y", col=colors, main="Genome size in all and sampled genomes", names=names, cex.axis=0.7, xaxt="n", space=1)
text(seq(1,end_point,by=1), par("usr")[3]-0.25,
srt = 60, adj= 1, xpd = TRUE,
labels = names, cex=0.65)

#par(mfrow=c(1,2))
#plot(density(as.numeric(as.character(d$checkm_completeness)), na.rm = T), lwd=2, xlim=c(0,100), ylim=c(0,0.1), main="Completeness in all and sampled genomes")
#lines(density(as.numeric(as.character(subd$checkm_completeness)), na.rm = T), lwd=2, col="red")
boxplot(d$checkm_completeness, subd$checkm_completeness, subdNoGC$checkm_completeness, subdGC$checkm_completeness, subdSize$checkm_completeness, subdContamination$checkm_completeness, subdCompleteness$checkm_completeness, subdDistance$checkm_completeness, subdRand$checkm_completeness, col=colors, main="Completeness in all and sampled genomes", names=names, cex.axis=0.7, xaxt="n", space=1)
text(seq(1,end_point,by=1), par("usr")[3]-0.25,
srt = 60, adj= 1, xpd = TRUE,
labels = names, cex=0.65)

boxplot(d$checkm_contamination, subd$checkm_contamination, subdNoGC$checkm_contamination, subdGC$checkm_contamination, subdSize$checkm_contamination, subdContamination$checkm_contamination, subdCompleteness$checkm_contamination, subdDistance$checkm_contamination, subdRand$checkm_contamination, ylim=c(0,20), col=colors, main="Contamination in all and sampled genomes", names=names, cex.axis=0.7, xaxt="n", space=1)
text(seq(1,end_point,by=1), par("usr")[3]-0.25,
srt = 60, adj= 1, xpd = TRUE,
labels = names, cex=0.65)

Additional material
plot(density(as.numeric(as.character(d$gc_percentage)), na.rm = T), lwd=2, xlim=c(0,100), ylim=c(0,0.1), main="GC content in all and sampled genomes")
lines(density(as.numeric(as.character(subd$gc_percentage)), na.rm = T), lwd=2, col="red")
lines(density(as.numeric(as.character(subdGC$gc_percentage)), na.rm = T), lwd=2, col="orange")
lines(density(as.numeric(as.character(subdContamination$gc_percentage)), na.rm = T), lwd=2, col="darkgreen")
lines(density(as.numeric(as.character(subdCompleteness$gc_percentage)), na.rm = T), lwd=2, col="blue")
lines(density(as.numeric(as.character(subdDistance$gc_percentage)), na.rm = T), lwd=2, col="purple")
lines(density(as.numeric(as.character(subdRand$gc_percentage)), na.rm = T), lwd=2, col="grey")
legend(legend=names, col=c("black", "red", "orange", "darkgreen", "blue", "purple", "grey"), "topright", lwd=1)

hist(d$gc_percentage, nc=50, freq=FALSE, main="GC content in all and sampled genomes")
hist(subd$gc_percentage, nc=20, add=T, col=rgb(1,0,0,0.5), freq=FALSE)

par(mfrow=c(1,2))
plot(density(as.numeric(as.character(d$checkm_contamination)), na.rm = T), lwd=2, xlim=c(0,100), ylim=c(0,1), main="Contamination in all and sampled genomes")
lines(density(as.numeric(as.character(subd$checkm_contamination)), na.rm = T), lwd=2, col="red")
boxplot(d$checkm_contamination, subd$checkm_contamination, col=c("white", "red"), ylim=c(0,100))

LS0tCnRpdGxlOiAiQW5hbHlzaXMgb2Ygc2VsZWN0ZWQgZ2Vub21lcyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyMjIFdlIHNlbGVjdCA3NzYgZ2Vub21lcyBmcm9tIGEgYmlnIGRhdGEgc2V0IGNvbnRhaW5pbmcgdGhvdXNhbmRzIG9mIHRoZW0uIFdlIGVuZm9yY2UgdGhhdCB0aGVyZSBtdXN0IGJlIG9uZSBnZW5vbWUgcGVyIGdyb3VwIG9mIG9yZ2FuaXNtcy4gV2UgdXNlIGRpZmZlcmVudCBjcml0ZXJpYTogR0MgY2xvc2VzdCB0byB0aGUgbWVhbiBvZiB0aGUgZ3JvdXAsIGdlbm9tZSB3aXRoIHRoZSBsYXJnZXN0IHNpemUgaW4gdGhlIGdyb3VwLCBnZW5vbWUgd2l0aCB0aGUgbG93ZXN0IGFtb3VudCBvZiBjb250YW1pbmF0aW9uLCBtb3N0IGNvbXBsZXRlIGdlbm9tZSwgZ2Vub21lIGNsb3Nlc3QgdG8gdGhlIHBhcmVudCBub2RlIG9mIHRoZSBncm91cC4gV2UgYWxzbyB1c2UgdHdvIGNvbXBvdW5kIG1lYXN1cmVzLCB0aGF0IHdlaWdoIGVhY2ggdmFyaWFibGUgdGhlIHNhbWU6IG9uZSB0aGF0IGluY2x1ZGVzIGFsbCBvZiB0aGVtLCBhbmQgb25lIHRoYXQgaW5jbHVkZXMgYWxsIG9mIHRoZW0gZXhjZXB0IEdDLiBGaW5hbGx5IEkgY29tcGFyZSB0aGUgc2FtcGxlZCBnZW5vbWVzIHdpdGggZWFjaCBvZiB0aG9zZSBhcHByb2FjaGVzIHRvIGFsbCBnZW5vbWVzIGluIHRoZSBkYXRhIHNldCwgYW5kIHRvIGEgcmFuZG9tIHNhbXBsZSBvZiBnZW5vbWVzLgoKYGBge3IsIGNhY2hlPVR9CnNldHdkKCJ+L0RhdGEvVHJhbnNmZXJSZWxhdGVkL2RhdGluZ1dpdGhUcmFuc2ZlcnMvVE9MX0RhdGluZ19Gcm9tX0xpdGVyYXR1cmUvQmFjdGVyaWEiKQpkMCA8LSByZWFkLnRhYmxlKCJEYXRhL2JhY19tZXRhZGF0YV9yODYudHN2IiwgaD1ULCBzZXA9Ilx0IiwgZmlsbD1ULCBuYS5zdHJpbmdzID0gYygibm9uZSIsICJuYSIsICJOQSIpLCBjb2xDbGFzc2VzID0gImNoYXJhY3RlciIsIHF1b3RlPSIiKQpgYGAKCgoKYGBge3IsIGNhY2hlPVR9CmQgPSBkMApkJGdjX3BlcmNlbnRhZ2UgPC0gYXMubnVtZXJpYyhkJGdjX3BlcmNlbnRhZ2UpCgpkJGdlbm9tZV9zaXplIDwtIGFzLm51bWVyaWMoZCRnZW5vbWVfc2l6ZSkKCmQkY2hlY2ttX2NvbXBsZXRlbmVzcyA8LSBhcy5udW1lcmljKGQkY2hlY2ttX2NvbXBsZXRlbmVzcykKCmQkY2hlY2ttX2NvbnRhbWluYXRpb24gPC0gYXMubnVtZXJpYyhkJGNoZWNrbV9jb250YW1pbmF0aW9uKQoKIyBTb21lIGNvbnRhbWluYXRpb24gdmFsdWVzIGFyZSBhYm92ZSAxMDAhCmRbZCRjaGVja21fY29udGFtaW5hdGlvbiA+IDEwMCxdJGNoZWNrbV9jb250YW1pbmF0aW9uIDwtIDEwMAoKCmQkZ2Vub21lX3NpemUgPC0gYXMubnVtZXJpYyhkJGdlbm9tZV9zaXplKQoKc3VtbWFyeShkKQpgYGAKCgpgYGB7cn0Kc2FtcCA8LSByZWFkLnRhYmxlKCJEYXRhL3JlcHJlc2VudGFudCIsIGg9RiwgY29sQ2xhc3NlcyA9ICJjaGFyYWN0ZXIiKSRWMQpzdW1tYXJ5KHNhbXApCnN1YmQgPC0gZFt3aGljaChkJGFjY2Vzc2lvbiVpbiVzYW1wKSxdCgpgYGAKCmBgYHtyfQpzYW1wUmFuZCA8LSByZWFkLnRhYmxlKCJEYXRhL3JlcHJlc2VudGFudFJhbmRvbSIsIGg9RiwgY29sQ2xhc3NlcyA9ICJjaGFyYWN0ZXIiKSRWMQpzdW1tYXJ5KHNhbXBSYW5kKQpzdWJkUmFuZCA8LSBkW3doaWNoKGQkYWNjZXNzaW9uJWluJXNhbXBSYW5kKSxdCgpgYGAKCgpgYGB7cn0Kc2FtcEdDIDwtIHJlYWQudGFibGUoIkRhdGEvcmVwcmVzZW50YW50QmVzdEdDIiwgaD1GLCBjb2xDbGFzc2VzID0gImNoYXJhY3RlciIpJFYxCnN1bW1hcnkoc2FtcEdDKQpzdWJkR0MgPC0gZFt3aGljaChkJGFjY2Vzc2lvbiVpbiVzYW1wR0MpLF0KYGBgCgoKYGBge3J9CnNhbXBDb250YW1pbmF0aW9uIDwtIHJlYWQudGFibGUoIkRhdGEvcmVwcmVzZW50YW50QmVzdENvbnRhbWluYXRpb24iLCBoPUYsIGNvbENsYXNzZXMgPSAiY2hhcmFjdGVyIikkVjEKc3VtbWFyeShzYW1wQ29udGFtaW5hdGlvbikKc3ViZENvbnRhbWluYXRpb24gPC0gZFt3aGljaChkJGFjY2Vzc2lvbiVpbiVzYW1wQ29udGFtaW5hdGlvbiksXQoKYGBgCgoKYGBge3J9CnNhbXBDb21wbGV0ZW5lc3MgPC0gcmVhZC50YWJsZSgiRGF0YS9yZXByZXNlbnRhbnRCZXN0Q29tcGxldGVuZXNzIiwgaD1GLCBjb2xDbGFzc2VzID0gImNoYXJhY3RlciIpJFYxCnN1bW1hcnkoc2FtcENvbXBsZXRlbmVzcykKc3ViZENvbXBsZXRlbmVzcyA8LSBkW3doaWNoKGQkYWNjZXNzaW9uJWluJXNhbXBDb21wbGV0ZW5lc3MpLF0KCmBgYAoKCmBgYHtyfQpzYW1wRGlzdGFuY2UgPC0gcmVhZC50YWJsZSgiRGF0YS9yZXByZXNlbnRhbnRCZXN0RGlzdGFuY2UiLCBoPUYsIGNvbENsYXNzZXMgPSAiY2hhcmFjdGVyIikkVjEKc3VtbWFyeShzYW1wRGlzdGFuY2UpCnN1YmREaXN0YW5jZSA8LSBkW3doaWNoKGQkYWNjZXNzaW9uJWluJXNhbXBEaXN0YW5jZSksXQoKYGBgCgpgYGB7cn0Kc2FtcFNpemUgPC0gcmVhZC50YWJsZSgiRGF0YS9yZXByZXNlbnRhbnRCZXN0U2l6ZSIsIGg9RiwgY29sQ2xhc3NlcyA9ICJjaGFyYWN0ZXIiKSRWMQpzdW1tYXJ5KHNhbXBTaXplKQpzdWJkU2l6ZSA8LSBkW3doaWNoKGQkYWNjZXNzaW9uJWluJXNhbXBTaXplKSxdCgpgYGAKCgpgYGB7cn0Kc2FtcE5vR0MgPC0gcmVhZC50YWJsZSgiRGF0YS9yZXByZXNlbnRhbnROb0dDIiwgaD1GLCBjb2xDbGFzc2VzID0gImNoYXJhY3RlciIpJFYxCnN1bW1hcnkoc2FtcE5vR0MpCnN1YmROb0dDIDwtIGRbd2hpY2goZCRhY2Nlc3Npb24laW4lc2FtcE5vR0MpLF0KCmBgYAoKCgpgYGB7cn0KbmFtZXMgPSBjKCJhbGwiLCAic2VsZWN0ZWQiLCAic2VsZWN0ZWQgd2l0aG91dCBHQyIsICJiZXN0IEdDIiwgImJlc3Qgc2l6ZSIsICJiZXN0IENvbnRhbWluYXRpb24iLCAiYmVzdCBDb21wbGV0ZW5lc3MiLCAiYmVzdCBEaXN0YW5jZSIsICJSYW5kb20gMTAiKQpjb2xvcnMgPSBjKCJ3aGl0ZSIsICJyZWQiLCAicGluayIsICJvcmFuZ2UiLCAiZGFya2dyZWVuIiwgImJsdWUiLCAicHVycGxlIiwgImdyZXkiLCAiYnJvd24iKQpwYXIocGluPWMoNy4yLDMpKQpwYXIobWFyID0gYyg3LCA0LCAyLCAyKSArIDAuMikgI2FkZCByb29tIGZvciB0aGUgcm90YXRlZCBsYWJlbHMKZW5kX3BvaW50ID0gbGVuZ3RoKG5hbWVzKQoKYGBgCgoKCgpgYGB7cn0KCmJveHBsb3QoZCRnY19wZXJjZW50YWdlLCBzdWJkJGdjX3BlcmNlbnRhZ2UsIHN1YmROb0dDJGdjX3BlcmNlbnRhZ2UsIHN1YmRHQyRnY19wZXJjZW50YWdlLCBzdWJkU2l6ZSRnY19wZXJjZW50YWdlLCBzdWJkQ29udGFtaW5hdGlvbiRnY19wZXJjZW50YWdlLCBzdWJkQ29tcGxldGVuZXNzJGdjX3BlcmNlbnRhZ2UsIHN1YmREaXN0YW5jZSRnY19wZXJjZW50YWdlLCBzdWJkUmFuZCRnY19wZXJjZW50YWdlLCBjb2w9Y29sb3JzLCBtYWluPSJHQyBjb250ZW50IGluIGFsbCBhbmQgc2FtcGxlZCBnZW5vbWVzIiwgbmFtZXM9bmFtZXMsIGNleC5heGlzPTAuNywgeGF4dD0ibiIsIHNwYWNlPTEpCnRleHQoc2VxKDEsZW5kX3BvaW50LGJ5PTEpLCBwYXIoInVzciIpWzNdLTAuMjUsIAogICAgIHNydCA9IDYwLCBhZGo9IDEsIHhwZCA9IFRSVUUsCiAgICAgbGFiZWxzID0gbmFtZXMsIGNleD0wLjY1KQpgYGAKCgpgYGB7cn0KI3BhcihtZnJvdz1jKDEsMikpCiNwbG90KGRlbnNpdHkoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZCRnZW5vbWVfc2l6ZSkpLCBuYS5ybSA9IFQpLCBsd2Q9MiwgeGxpbT1jKDAsMTAwMDAwMDApLCB5bGltPWMoMCwwLjAwMDAwMSksIG1haW49Ikdlbm9tZSBzaXplIGluIGFsbCBhbmQgc2FtcGxlZCBnZW5vbWVzIikKI2xpbmVzKGRlbnNpdHkoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoc3ViZCRnZW5vbWVfc2l6ZSkpLCBuYS5ybSA9IFQpLCBsd2Q9MiwgY29sPSJyZWQiKQoKYm94cGxvdChkJGdlbm9tZV9zaXplLCBzdWJkJGdlbm9tZV9zaXplLCBzdWJkTm9HQyRnZW5vbWVfc2l6ZSwgc3ViZEdDJGdlbm9tZV9zaXplLCBzdWJkU2l6ZSRnZW5vbWVfc2l6ZSwgc3ViZENvbnRhbWluYXRpb24kZ2Vub21lX3NpemUsIHN1YmRDb21wbGV0ZW5lc3MkZ2Vub21lX3NpemUsIHN1YmREaXN0YW5jZSRnZW5vbWVfc2l6ZSwgc3ViZFJhbmQkZ2Vub21lX3NpemUsIGxvZz0ieSIsIGNvbD1jb2xvcnMsIG1haW49Ikdlbm9tZSBzaXplIGluIGFsbCBhbmQgc2FtcGxlZCBnZW5vbWVzIiwgbmFtZXM9bmFtZXMsIGNleC5heGlzPTAuNywgeGF4dD0ibiIsIHNwYWNlPTEpCnRleHQoc2VxKDEsZW5kX3BvaW50LGJ5PTEpLCBwYXIoInVzciIpWzNdLTAuMjUsIAogICAgIHNydCA9IDYwLCBhZGo9IDEsIHhwZCA9IFRSVUUsCiAgICAgbGFiZWxzID0gbmFtZXMsIGNleD0wLjY1KQoKYGBgCgpgYGB7cn0KI3BhcihtZnJvdz1jKDEsMikpCiNwbG90KGRlbnNpdHkoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZCRjaGVja21fY29tcGxldGVuZXNzKSksIG5hLnJtID0gVCksIGx3ZD0yLCB4bGltPWMoMCwxMDApLCB5bGltPWMoMCwwLjEpLCBtYWluPSJDb21wbGV0ZW5lc3MgaW4gYWxsIGFuZCBzYW1wbGVkIGdlbm9tZXMiKQojbGluZXMoZGVuc2l0eShhcy5udW1lcmljKGFzLmNoYXJhY3RlcihzdWJkJGNoZWNrbV9jb21wbGV0ZW5lc3MpKSwgbmEucm0gPSBUKSwgbHdkPTIsIGNvbD0icmVkIikKYm94cGxvdChkJGNoZWNrbV9jb21wbGV0ZW5lc3MsIHN1YmQkY2hlY2ttX2NvbXBsZXRlbmVzcywgc3ViZE5vR0MkY2hlY2ttX2NvbXBsZXRlbmVzcywgc3ViZEdDJGNoZWNrbV9jb21wbGV0ZW5lc3MsIHN1YmRTaXplJGNoZWNrbV9jb21wbGV0ZW5lc3MsIHN1YmRDb250YW1pbmF0aW9uJGNoZWNrbV9jb21wbGV0ZW5lc3MsIHN1YmRDb21wbGV0ZW5lc3MkY2hlY2ttX2NvbXBsZXRlbmVzcywgc3ViZERpc3RhbmNlJGNoZWNrbV9jb21wbGV0ZW5lc3MsIHN1YmRSYW5kJGNoZWNrbV9jb21wbGV0ZW5lc3MsIGNvbD1jb2xvcnMsIG1haW49IkNvbXBsZXRlbmVzcyBpbiBhbGwgYW5kIHNhbXBsZWQgZ2Vub21lcyIsIG5hbWVzPW5hbWVzLCBjZXguYXhpcz0wLjcsIHhheHQ9Im4iLCBzcGFjZT0xKQp0ZXh0KHNlcSgxLGVuZF9wb2ludCxieT0xKSwgcGFyKCJ1c3IiKVszXS0wLjI1LCAKICAgICBzcnQgPSA2MCwgYWRqPSAxLCB4cGQgPSBUUlVFLAogICAgIGxhYmVscyA9IG5hbWVzLCBjZXg9MC42NSkKCmBgYAoKCmBgYHtyfQpib3hwbG90KGQkY2hlY2ttX2NvbnRhbWluYXRpb24sIHN1YmQkY2hlY2ttX2NvbnRhbWluYXRpb24sIHN1YmROb0dDJGNoZWNrbV9jb250YW1pbmF0aW9uLCBzdWJkR0MkY2hlY2ttX2NvbnRhbWluYXRpb24sIHN1YmRTaXplJGNoZWNrbV9jb250YW1pbmF0aW9uLCBzdWJkQ29udGFtaW5hdGlvbiRjaGVja21fY29udGFtaW5hdGlvbiwgc3ViZENvbXBsZXRlbmVzcyRjaGVja21fY29udGFtaW5hdGlvbiwgc3ViZERpc3RhbmNlJGNoZWNrbV9jb250YW1pbmF0aW9uLCBzdWJkUmFuZCRjaGVja21fY29udGFtaW5hdGlvbiwgeWxpbT1jKDAsMjApLCBjb2w9Y29sb3JzLCBtYWluPSJDb250YW1pbmF0aW9uIGluIGFsbCBhbmQgc2FtcGxlZCBnZW5vbWVzIiwgbmFtZXM9bmFtZXMsIGNleC5heGlzPTAuNywgeGF4dD0ibiIsIHNwYWNlPTEpCnRleHQoc2VxKDEsZW5kX3BvaW50LGJ5PTEpLCBwYXIoInVzciIpWzNdLTAuMjUsIAogICAgIHNydCA9IDYwLCBhZGo9IDEsIHhwZCA9IFRSVUUsCiAgICAgbGFiZWxzID0gbmFtZXMsIGNleD0wLjY1KQpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIEFkZGl0aW9uYWwgbWF0ZXJpYWwgCgoKYGBge3J9CnBsb3QoZGVuc2l0eShhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkJGdjX3BlcmNlbnRhZ2UpKSwgbmEucm0gPSBUKSwgbHdkPTIsIHhsaW09YygwLDEwMCksIHlsaW09YygwLDAuMSksIG1haW49IkdDIGNvbnRlbnQgaW4gYWxsIGFuZCBzYW1wbGVkIGdlbm9tZXMiKQpsaW5lcyhkZW5zaXR5KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHN1YmQkZ2NfcGVyY2VudGFnZSkpLCBuYS5ybSA9IFQpLCBsd2Q9MiwgY29sPSJyZWQiKQpsaW5lcyhkZW5zaXR5KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHN1YmRHQyRnY19wZXJjZW50YWdlKSksIG5hLnJtID0gVCksIGx3ZD0yLCBjb2w9Im9yYW5nZSIpCmxpbmVzKGRlbnNpdHkoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoc3ViZENvbnRhbWluYXRpb24kZ2NfcGVyY2VudGFnZSkpLCBuYS5ybSA9IFQpLCBsd2Q9MiwgY29sPSJkYXJrZ3JlZW4iKQpsaW5lcyhkZW5zaXR5KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHN1YmRDb21wbGV0ZW5lc3MkZ2NfcGVyY2VudGFnZSkpLCBuYS5ybSA9IFQpLCBsd2Q9MiwgY29sPSJibHVlIikKbGluZXMoZGVuc2l0eShhcy5udW1lcmljKGFzLmNoYXJhY3RlcihzdWJkRGlzdGFuY2UkZ2NfcGVyY2VudGFnZSkpLCBuYS5ybSA9IFQpLCBsd2Q9MiwgY29sPSJwdXJwbGUiKQpsaW5lcyhkZW5zaXR5KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHN1YmRSYW5kJGdjX3BlcmNlbnRhZ2UpKSwgbmEucm0gPSBUKSwgbHdkPTIsIGNvbD0iZ3JleSIpCmxlZ2VuZChsZWdlbmQ9bmFtZXMsIGNvbD1jKCJibGFjayIsICJyZWQiLCAib3JhbmdlIiwgImRhcmtncmVlbiIsICJibHVlIiwgInB1cnBsZSIsICJncmV5IiksICJ0b3ByaWdodCIsIGx3ZD0xKQpgYGAKCgoKYGBge3J9Cmhpc3QoZCRnY19wZXJjZW50YWdlLCBuYz01MCwgZnJlcT1GQUxTRSwgbWFpbj0iR0MgY29udGVudCBpbiBhbGwgYW5kIHNhbXBsZWQgZ2Vub21lcyIpCmhpc3Qoc3ViZCRnY19wZXJjZW50YWdlLCBuYz0yMCwgYWRkPVQsIGNvbD1yZ2IoMSwwLDAsMC41KSwgZnJlcT1GQUxTRSkKYGBgCgpgYGB7cn0KcGFyKG1mcm93PWMoMSwyKSkKcGxvdChkZW5zaXR5KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGQkY2hlY2ttX2NvbnRhbWluYXRpb24pKSwgbmEucm0gPSBUKSwgbHdkPTIsIHhsaW09YygwLDEwMCksIHlsaW09YygwLDEpLCBtYWluPSJDb250YW1pbmF0aW9uIGluIGFsbCBhbmQgc2FtcGxlZCBnZW5vbWVzIikKbGluZXMoZGVuc2l0eShhcy5udW1lcmljKGFzLmNoYXJhY3RlcihzdWJkJGNoZWNrbV9jb250YW1pbmF0aW9uKSksIG5hLnJtID0gVCksIGx3ZD0yLCBjb2w9InJlZCIpCmJveHBsb3QoZCRjaGVja21fY29udGFtaW5hdGlvbiwgc3ViZCRjaGVja21fY29udGFtaW5hdGlvbiwgY29sPWMoIndoaXRlIiwgInJlZCIpLCB5bGltPWMoMCwxMDApKQpgYGAKCgoKCgoK