1 Calculating error rates.

I wrote the function ‘create_matrices()’ to collect mutation counts. At least in theory the results from it should be able to address most/any question regarding the counts of mutations observed in the data.

1.1 Categorize the data with at least 3 indexes per mutant

## Loading Rerrrt
## Loading required package: dplyr
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:hpgltools':
## 
##     combine
## The following object is masked from 'package:Biobase':
## 
##     combine
## The following objects are masked from 'package:BiocGenerics':
## 
##     combine, intersect, setdiff, union
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## Loading required package: tidyr
## Starting sample: 1.
## Reading the file containing mutations: preprocessing/s1/step4.txt.xz
## Reading the file containing the identical reads: preprocessing/s1/step2_identical_reads.txt.xz
## Counting indexes before filtering.
## Mutation data: removing any differences before position: 24.
## Mutation data: before pruning, there are: 1156535 reads.
## Mutation data: after min-position pruning, there are: 1037310 reads: 119225 lost or 10.31%.
## Mutation data: removing any differences after position: 176.
## Mutation data: before pruning, there are: 1037310 reads.
## Mutation data: after max-position pruning, there are: 968161 reads: 69149 lost or 6.67%.
## Mutation data: removing any reads with 'N' as the hit.
## Mutation data: after N pruning, there are: 953181 reads: 14980 lost or 1.55%.
## Mutation data: all filters removed 203354 reads, or 17.58%.
## Gathering information about the number of reads per index.
## Before reads/index pruning, there are: 1742165 indexes in all the data.
## After reads/index pruning, there are: 837608 indexes: 904557 lost or 51.92%.
## All data: removing indexes with fewer than 3 reads/index.
## All data: before reads/index pruning, there are: 953181 changed reads.
## All data: before reads/index pruning, there are: 4681501 identical reads.
## All data: after index pruning, there are: 491995 changed reads: 51.62%.
## All data: after index pruning, there are: 3663004 identical reads: 78.24%.
## Gathering identical, mutant, and sequencer reads/indexes.
## Before classification, there are 3663004 identical reads.
## Before classification, there are 491995 reads with mutations.
## After classification, there are 2738199 reads/indexes which are only identical.
## After classification, there are 11023 reads/indexes which are strictly sequencer.
## After classification, there are 26963 reads/indexes which are deemed from reverse transcriptase.
## Counted by direction: 7018785 forward reads and 7148314 reverse_reads.
## Subsetting based on mutations with at least 3 indexes.
## Classified mutation strings according to various queries.
## Starting sample: 2.
## Reading the file containing mutations: preprocessing/s2/step4.txt.xz
## Reading the file containing the identical reads: preprocessing/s2/step2_identical_reads.txt.xz
## Counting indexes before filtering.
## Mutation data: removing any differences before position: 24.
## Mutation data: before pruning, there are: 3421203 reads.
## Mutation data: after min-position pruning, there are: 1758479 reads: 1662724 lost or 48.60%.
## Mutation data: removing any differences after position: 176.
## Mutation data: before pruning, there are: 1758479 reads.
## Mutation data: after max-position pruning, there are: 1667302 reads: 91177 lost or 5.18%.
## Mutation data: removing any reads with 'N' as the hit.
## Mutation data: after N pruning, there are: 1642969 reads: 24333 lost or 1.46%.
## Mutation data: all filters removed 1778234 reads, or 51.98%.
## Gathering information about the number of reads per index.
## Before reads/index pruning, there are: 1261478 indexes in all the data.
## After reads/index pruning, there are: 693725 indexes: 567753 lost or 45.01%.
## All data: removing indexes with fewer than 3 reads/index.
## All data: before reads/index pruning, there are: 1642969 changed reads.
## All data: before reads/index pruning, there are: 5230976 identical reads.
## All data: after index pruning, there are: 814407 changed reads: 49.57%.
## All data: after index pruning, there are: 4834092 identical reads: 92.41%.
## Gathering identical, mutant, and sequencer reads/indexes.
## Before classification, there are 4834092 identical reads.
## Before classification, there are 814407 reads with mutations.
## After classification, there are 2802107 reads/indexes which are only identical.
## After classification, there are 111708 reads/indexes which are strictly sequencer.
## After classification, there are 126921 reads/indexes which are deemed from reverse transcriptase.
## Counted by direction: 11803361 forward reads and 12275547 reverse_reads.
## Subsetting based on mutations with at least 3 indexes.
## Classified mutation strings according to various queries.
## Starting sample: 3.
## Reading the file containing mutations: preprocessing/s3/step4.txt.xz
## Reading the file containing the identical reads: preprocessing/s3/step2_identical_reads.txt.xz
## Counting indexes before filtering.
## Mutation data: removing any differences before position: 24.
## Mutation data: before pruning, there are: 4309681 reads.
## Mutation data: after min-position pruning, there are: 1564155 reads: 2745526 lost or 63.71%.
## Mutation data: removing any differences after position: 176.
## Mutation data: before pruning, there are: 1564155 reads.
## Mutation data: after max-position pruning, there are: 1482559 reads: 81596 lost or 5.22%.
## Mutation data: removing any reads with 'N' as the hit.
## Mutation data: after N pruning, there are: 1452047 reads: 30512 lost or 2.06%.
## Mutation data: all filters removed 2857634 reads, or 66.31%.
## Gathering information about the number of reads per index.
## Before reads/index pruning, there are: 884042 indexes in all the data.
## After reads/index pruning, there are: 463445 indexes: 420597 lost or 47.58%.
## All data: removing indexes with fewer than 3 reads/index.
## All data: before reads/index pruning, there are: 1452047 changed reads.
## All data: before reads/index pruning, there are: 3583390 identical reads.
## All data: after index pruning, there are: 730397 changed reads: 50.30%.
## All data: after index pruning, there are: 3332136 identical reads: 92.99%.
## Gathering identical, mutant, and sequencer reads/indexes.
## Before classification, there are 3332136 identical reads.
## Before classification, there are 730397 reads with mutations.
## After classification, there are 1851177 reads/indexes which are only identical.
## After classification, there are 90341 reads/indexes which are strictly sequencer.
## After classification, there are 244494 reads/indexes which are deemed from reverse transcriptase.
## Counted by direction: 9104237 forward reads and 9257103 reverse_reads.
## Subsetting based on mutations with at least 3 indexes.
## Classified mutation strings according to various queries.
## Plotting index densities.
## Skipping table: delete_reads_by_position
## Skipping table: delete_indexes_by_position
## Skipping table: delete_sequencer_by_position
## Skipping table: delete_reads_by_nt
## Skipping table: delete_indexes_by_nt
## Skipping table: delete_sequencer_by_nt
## Deleting the file excel/triples.xlsx before writing the tables.
## Warning: Removed 76384 rows containing non-finite values (stat_density).

## Warning: Removed 76384 rows containing non-finite values (stat_density).
## Warning: Removed 3693 rows containing non-finite values (stat_density).

## Warning: Removed 3693 rows containing non-finite values (stat_density).
##                         Length Class      Mode   
## metadata                 5     data.frame list   
## samples                  3     -none-     list   
## filtered                18     -none-     numeric
## reads_remaining         24     -none-     numeric
## indexes_remaining       15     -none-     numeric
## reads_per_sample         3     -none-     numeric
## indexes_per_sample       3     -none-     numeric
## matrices                33     -none-     list   
## matrices_cpm            33     -none-     list   
## matrices_cpmlength      33     -none-     list   
## matrices_counts         33     -none-     list   
## matrices_countslength   33     -none-     list   
## pre_index_density_plot   9     gg         list   
## post_index_density_plot  9     gg         list   
## plots                    5     -none-     list   
## excel                    1     -none-     numeric
## Starting sample: 1.
## Reading the file containing mutations: preprocessing/s1/step4.txt.xz
## Reading the file containing the identical reads: preprocessing/s1/step2_identical_reads.txt.xz
## Counting indexes before filtering.
## Mutation data: removing any differences before position: 24.
## Mutation data: before pruning, there are: 1156535 reads.
## Mutation data: after min-position pruning, there are: 1037310 reads: 119225 lost or 10.31%.
## Mutation data: removing any differences after position: 176.
## Mutation data: before pruning, there are: 1037310 reads.
## Mutation data: after max-position pruning, there are: 968161 reads: 69149 lost or 6.67%.
## Mutation data: removing any reads with 'N' as the hit.
## Mutation data: after N pruning, there are: 953181 reads: 14980 lost or 1.55%.
## Mutation data: all filters removed 203354 reads, or 17.58%.
## Gathering information about the number of reads per index.
## Before reads/index pruning, there are: 1742165 indexes in all the data.
## After reads/index pruning, there are: 837608 indexes: 904557 lost or 51.92%.
## All data: removing indexes with fewer than 3 reads/index.
## All data: before reads/index pruning, there are: 953181 changed reads.
## All data: before reads/index pruning, there are: 4681501 identical reads.
## All data: after index pruning, there are: 491995 changed reads: 51.62%.
## All data: after index pruning, there are: 3663004 identical reads: 78.24%.
## Gathering identical, mutant, and sequencer reads/indexes.
## Before classification, there are 3663004 identical reads.
## Before classification, there are 491995 reads with mutations.
## After classification, there are 2738199 reads/indexes which are only identical.
## After classification, there are 11023 reads/indexes which are strictly sequencer.
## After classification, there are 26963 reads/indexes which are deemed from reverse transcriptase.
## Counted by direction: 7018785 forward reads and 7148314 reverse_reads.
## Subsetting based on mutations with at least 3 indexes.
## Classified mutation strings according to various queries.
## Starting sample: 2.
## Reading the file containing mutations: preprocessing/s2/step4.txt.xz
## Reading the file containing the identical reads: preprocessing/s2/step2_identical_reads.txt.xz
## Counting indexes before filtering.
## Mutation data: removing any differences before position: 24.
## Mutation data: before pruning, there are: 3421203 reads.
## Mutation data: after min-position pruning, there are: 1758479 reads: 1662724 lost or 48.60%.
## Mutation data: removing any differences after position: 176.
## Mutation data: before pruning, there are: 1758479 reads.
## Mutation data: after max-position pruning, there are: 1667302 reads: 91177 lost or 5.18%.
## Mutation data: removing any reads with 'N' as the hit.
## Mutation data: after N pruning, there are: 1642969 reads: 24333 lost or 1.46%.
## Mutation data: all filters removed 1778234 reads, or 51.98%.
## Gathering information about the number of reads per index.
## Before reads/index pruning, there are: 1261478 indexes in all the data.
## After reads/index pruning, there are: 693725 indexes: 567753 lost or 45.01%.
## All data: removing indexes with fewer than 3 reads/index.
## All data: before reads/index pruning, there are: 1642969 changed reads.
## All data: before reads/index pruning, there are: 5230976 identical reads.
## All data: after index pruning, there are: 814407 changed reads: 49.57%.
## All data: after index pruning, there are: 4834092 identical reads: 92.41%.
## Gathering identical, mutant, and sequencer reads/indexes.
## Before classification, there are 4834092 identical reads.
## Before classification, there are 814407 reads with mutations.
## After classification, there are 2802107 reads/indexes which are only identical.
## After classification, there are 111708 reads/indexes which are strictly sequencer.
## After classification, there are 126921 reads/indexes which are deemed from reverse transcriptase.
## Counted by direction: 11803361 forward reads and 12275547 reverse_reads.
## Subsetting based on mutations with at least 3 indexes.
## Classified mutation strings according to various queries.
## Starting sample: 3.
## Reading the file containing mutations: preprocessing/s3/step4.txt.xz
## Reading the file containing the identical reads: preprocessing/s3/step2_identical_reads.txt.xz
## Counting indexes before filtering.
## Mutation data: removing any differences before position: 24.
## Mutation data: before pruning, there are: 4309681 reads.
## Mutation data: after min-position pruning, there are: 1564155 reads: 2745526 lost or 63.71%.
## Mutation data: removing any differences after position: 176.
## Mutation data: before pruning, there are: 1564155 reads.
## Mutation data: after max-position pruning, there are: 1482559 reads: 81596 lost or 5.22%.
## Mutation data: removing any reads with 'N' as the hit.
## Mutation data: after N pruning, there are: 1452047 reads: 30512 lost or 2.06%.
## Mutation data: all filters removed 2857634 reads, or 66.31%.
## Gathering information about the number of reads per index.
## Before reads/index pruning, there are: 884042 indexes in all the data.
## After reads/index pruning, there are: 463445 indexes: 420597 lost or 47.58%.
## All data: removing indexes with fewer than 3 reads/index.
## All data: before reads/index pruning, there are: 1452047 changed reads.
## All data: before reads/index pruning, there are: 3583390 identical reads.
## All data: after index pruning, there are: 730397 changed reads: 50.30%.
## All data: after index pruning, there are: 3332136 identical reads: 92.99%.
## Gathering identical, mutant, and sequencer reads/indexes.
## Before classification, there are 3332136 identical reads.
## Before classification, there are 730397 reads with mutations.
## After classification, there are 1851177 reads/indexes which are only identical.
## After classification, there are 90341 reads/indexes which are strictly sequencer.
## After classification, there are 244494 reads/indexes which are deemed from reverse transcriptase.
## Counted by direction: 9104237 forward reads and 9257103 reverse_reads.
## Subsetting based on mutations with at least 3 indexes.
## Classified mutation strings according to various queries.
## Plotting index densities.
## Skipping table: delete_reads_by_position
## Skipping table: delete_indexes_by_position
## Skipping table: delete_sequencer_by_position
## Skipping table: delete_reads_by_nt
## Skipping table: delete_indexes_by_nt
## Skipping table: delete_sequencer_by_nt
##                         Length Class      Mode   
## metadata                 5     data.frame list   
## samples                  3     -none-     list   
## filtered                18     -none-     numeric
## reads_remaining         24     -none-     numeric
## indexes_remaining       15     -none-     numeric
## reads_per_sample         3     -none-     numeric
## indexes_per_sample       3     -none-     numeric
## matrices                33     -none-     list   
## matrices_cpm            33     -none-     list   
## matrices_cpmlength      33     -none-     list   
## matrices_counts         33     -none-     list   
## matrices_countslength   33     -none-     list   
## pre_index_density_plot   9     gg         list   
## post_index_density_plot  9     gg         list   
## plots                    5     -none-     list
## Starting sample: 1.
## Reading the file containing mutations: preprocessing/s1/step4.txt.xz
## Reading the file containing the identical reads: preprocessing/s1/step2_identical_reads.txt.xz
## Counting indexes before filtering.
## Mutation data: removing any differences before position: 24.
## Mutation data: before pruning, there are: 1156535 reads.
## Mutation data: after min-position pruning, there are: 1037310 reads: 119225 lost or 10.31%.
## Mutation data: removing any differences after position: 176.
## Mutation data: before pruning, there are: 1037310 reads.
## Mutation data: after max-position pruning, there are: 968161 reads: 69149 lost or 6.67%.
## Mutation data: removing any reads with 'N' as the hit.
## Mutation data: after N pruning, there are: 953181 reads: 14980 lost or 1.55%.
## Mutation data: all filters removed 203354 reads, or 17.58%.
## Gathering information about the number of reads per index.
## Before reads/index pruning, there are: 1742165 indexes in all the data.
## After reads/index pruning, there are: 837608 indexes: 904557 lost or 51.92%.
## All data: removing indexes with fewer than 3 reads/index.
## All data: before reads/index pruning, there are: 953181 changed reads.
## All data: before reads/index pruning, there are: 4681501 identical reads.
## All data: after index pruning, there are: 491995 changed reads: 51.62%.
## All data: after index pruning, there are: 3663004 identical reads: 78.24%.
## Gathering identical, mutant, and sequencer reads/indexes.
## Before classification, there are 3663004 identical reads.
## Before classification, there are 491995 reads with mutations.
## After classification, there are 2738199 reads/indexes which are only identical.
## After classification, there are 11023 reads/indexes which are strictly sequencer.
## After classification, there are 26963 reads/indexes which are deemed from reverse transcriptase.
## Counted by direction: 7018785 forward reads and 7148314 reverse_reads.
## Subsetting based on mutations with at least 3 indexes.
## Classified mutation strings according to various queries.
## Starting sample: 2.
## Reading the file containing mutations: preprocessing/s2/step4.txt.xz
## Reading the file containing the identical reads: preprocessing/s2/step2_identical_reads.txt.xz
## Counting indexes before filtering.
## Mutation data: removing any differences before position: 24.
## Mutation data: before pruning, there are: 3421203 reads.
## Mutation data: after min-position pruning, there are: 1758479 reads: 1662724 lost or 48.60%.
## Mutation data: removing any differences after position: 176.
## Mutation data: before pruning, there are: 1758479 reads.
## Mutation data: after max-position pruning, there are: 1667302 reads: 91177 lost or 5.18%.
## Mutation data: removing any reads with 'N' as the hit.
## Mutation data: after N pruning, there are: 1642969 reads: 24333 lost or 1.46%.
## Mutation data: all filters removed 1778234 reads, or 51.98%.
## Gathering information about the number of reads per index.
## Before reads/index pruning, there are: 1261478 indexes in all the data.
## After reads/index pruning, there are: 693725 indexes: 567753 lost or 45.01%.
## All data: removing indexes with fewer than 3 reads/index.
## All data: before reads/index pruning, there are: 1642969 changed reads.
## All data: before reads/index pruning, there are: 5230976 identical reads.
## All data: after index pruning, there are: 814407 changed reads: 49.57%.
## All data: after index pruning, there are: 4834092 identical reads: 92.41%.
## Gathering identical, mutant, and sequencer reads/indexes.
## Before classification, there are 4834092 identical reads.
## Before classification, there are 814407 reads with mutations.
## After classification, there are 2802107 reads/indexes which are only identical.
## After classification, there are 111708 reads/indexes which are strictly sequencer.
## After classification, there are 126921 reads/indexes which are deemed from reverse transcriptase.
## Counted by direction: 11803361 forward reads and 12275547 reverse_reads.
## Subsetting based on mutations with at least 3 indexes.
## Classified mutation strings according to various queries.
## Starting sample: 3.
## Reading the file containing mutations: preprocessing/s3/step4.txt.xz
## Reading the file containing the identical reads: preprocessing/s3/step2_identical_reads.txt.xz
## Counting indexes before filtering.
## Mutation data: removing any differences before position: 24.
## Mutation data: before pruning, there are: 4309681 reads.
## Mutation data: after min-position pruning, there are: 1564155 reads: 2745526 lost or 63.71%.
## Mutation data: removing any differences after position: 176.
## Mutation data: before pruning, there are: 1564155 reads.
## Mutation data: after max-position pruning, there are: 1482559 reads: 81596 lost or 5.22%.
## Mutation data: removing any reads with 'N' as the hit.
## Mutation data: after N pruning, there are: 1452047 reads: 30512 lost or 2.06%.
## Mutation data: all filters removed 2857634 reads, or 66.31%.
## Gathering information about the number of reads per index.
## Before reads/index pruning, there are: 884042 indexes in all the data.
## After reads/index pruning, there are: 463445 indexes: 420597 lost or 47.58%.
## All data: removing indexes with fewer than 3 reads/index.
## All data: before reads/index pruning, there are: 1452047 changed reads.
## All data: before reads/index pruning, there are: 3583390 identical reads.
## All data: after index pruning, there are: 730397 changed reads: 50.30%.
## All data: after index pruning, there are: 3332136 identical reads: 92.99%.
## Gathering identical, mutant, and sequencer reads/indexes.
## Before classification, there are 3332136 identical reads.
## Before classification, there are 730397 reads with mutations.
## After classification, there are 1851177 reads/indexes which are only identical.
## After classification, there are 90341 reads/indexes which are strictly sequencer.
## After classification, there are 244494 reads/indexes which are deemed from reverse transcriptase.
## Counted by direction: 9104237 forward reads and 9257103 reverse_reads.
## Subsetting based on mutations with at least 3 indexes.
## Classified mutation strings according to various queries.
## Plotting index densities.
## Skipping table: delete_reads_by_position
## Skipping table: delete_indexes_by_position
## Skipping table: delete_sequencer_by_position
## Skipping table: delete_reads_by_nt
## Skipping table: delete_indexes_by_nt
## Skipping table: delete_sequencer_by_nt
##                         Length Class      Mode   
## metadata                 5     data.frame list   
## samples                  3     -none-     list   
## filtered                18     -none-     numeric
## reads_remaining         24     -none-     numeric
## indexes_remaining       15     -none-     numeric
## reads_per_sample         3     -none-     numeric
## indexes_per_sample       3     -none-     numeric
## matrices                33     -none-     list   
## matrices_cpm            33     -none-     list   
## matrices_cpmlength      33     -none-     list   
## matrices_counts         33     -none-     list   
## matrices_countslength   33     -none-     list   
## pre_index_density_plot   9     gg         list   
## post_index_density_plot  9     gg         list   
## plots                    5     -none-     list

1.2 Categorize the data with at least 5 indexes per mutant

## Starting sample: 1.
## Reading the file containing mutations: preprocessing/s1/step4.txt.xz
## Reading the file containing the identical reads: preprocessing/s1/step2_identical_reads.txt.xz
## Counting indexes before filtering.
## Mutation data: removing any differences before position: 24.
## Mutation data: before pruning, there are: 1156535 reads.
## Mutation data: after min-position pruning, there are: 1037310 reads: 119225 lost or 10.31%.
## Mutation data: removing any differences after position: 176.
## Mutation data: before pruning, there are: 1037310 reads.
## Mutation data: after max-position pruning, there are: 968161 reads: 69149 lost or 6.67%.
## Mutation data: removing any reads with 'N' as the hit.
## Mutation data: after N pruning, there are: 953181 reads: 14980 lost or 1.55%.
## Mutation data: all filters removed 203354 reads, or 17.58%.
## Gathering information about the number of reads per index.
## Before reads/index pruning, there are: 1742165 indexes in all the data.
## After reads/index pruning, there are: 837608 indexes: 904557 lost or 51.92%.
## All data: removing indexes with fewer than 3 reads/index.
## All data: before reads/index pruning, there are: 953181 changed reads.
## All data: before reads/index pruning, there are: 4681501 identical reads.
## All data: after index pruning, there are: 491995 changed reads: 51.62%.
## All data: after index pruning, there are: 3663004 identical reads: 78.24%.
## Gathering identical, mutant, and sequencer reads/indexes.
## Before classification, there are 3663004 identical reads.
## Before classification, there are 491995 reads with mutations.
## After classification, there are 2738199 reads/indexes which are only identical.
## After classification, there are 11023 reads/indexes which are strictly sequencer.
## After classification, there are 26963 reads/indexes which are deemed from reverse transcriptase.
## Counted by direction: 7018785 forward reads and 7148314 reverse_reads.
## Subsetting based on mutations with at least 5 indexes.
## Classified mutation strings according to various queries.
## Starting sample: 2.
## Reading the file containing mutations: preprocessing/s2/step4.txt.xz
## Reading the file containing the identical reads: preprocessing/s2/step2_identical_reads.txt.xz
## Counting indexes before filtering.
## Mutation data: removing any differences before position: 24.
## Mutation data: before pruning, there are: 3421203 reads.
## Mutation data: after min-position pruning, there are: 1758479 reads: 1662724 lost or 48.60%.
## Mutation data: removing any differences after position: 176.
## Mutation data: before pruning, there are: 1758479 reads.
## Mutation data: after max-position pruning, there are: 1667302 reads: 91177 lost or 5.18%.
## Mutation data: removing any reads with 'N' as the hit.
## Mutation data: after N pruning, there are: 1642969 reads: 24333 lost or 1.46%.
## Mutation data: all filters removed 1778234 reads, or 51.98%.
## Gathering information about the number of reads per index.
## Before reads/index pruning, there are: 1261478 indexes in all the data.
## After reads/index pruning, there are: 693725 indexes: 567753 lost or 45.01%.
## All data: removing indexes with fewer than 3 reads/index.
## All data: before reads/index pruning, there are: 1642969 changed reads.
## All data: before reads/index pruning, there are: 5230976 identical reads.
## All data: after index pruning, there are: 814407 changed reads: 49.57%.
## All data: after index pruning, there are: 4834092 identical reads: 92.41%.
## Gathering identical, mutant, and sequencer reads/indexes.
## Before classification, there are 4834092 identical reads.
## Before classification, there are 814407 reads with mutations.
## After classification, there are 2802107 reads/indexes which are only identical.
## After classification, there are 111708 reads/indexes which are strictly sequencer.
## After classification, there are 126921 reads/indexes which are deemed from reverse transcriptase.
## Counted by direction: 11803361 forward reads and 12275547 reverse_reads.
## Subsetting based on mutations with at least 5 indexes.
## Classified mutation strings according to various queries.
## Starting sample: 3.
## Reading the file containing mutations: preprocessing/s3/step4.txt.xz
## Reading the file containing the identical reads: preprocessing/s3/step2_identical_reads.txt.xz
## Counting indexes before filtering.
## Mutation data: removing any differences before position: 24.
## Mutation data: before pruning, there are: 4309681 reads.
## Mutation data: after min-position pruning, there are: 1564155 reads: 2745526 lost or 63.71%.
## Mutation data: removing any differences after position: 176.
## Mutation data: before pruning, there are: 1564155 reads.
## Mutation data: after max-position pruning, there are: 1482559 reads: 81596 lost or 5.22%.
## Mutation data: removing any reads with 'N' as the hit.
## Mutation data: after N pruning, there are: 1452047 reads: 30512 lost or 2.06%.
## Mutation data: all filters removed 2857634 reads, or 66.31%.
## Gathering information about the number of reads per index.
## Before reads/index pruning, there are: 884042 indexes in all the data.
## After reads/index pruning, there are: 463445 indexes: 420597 lost or 47.58%.
## All data: removing indexes with fewer than 3 reads/index.
## All data: before reads/index pruning, there are: 1452047 changed reads.
## All data: before reads/index pruning, there are: 3583390 identical reads.
## All data: after index pruning, there are: 730397 changed reads: 50.30%.
## All data: after index pruning, there are: 3332136 identical reads: 92.99%.
## Gathering identical, mutant, and sequencer reads/indexes.
## Before classification, there are 3332136 identical reads.
## Before classification, there are 730397 reads with mutations.
## After classification, there are 1851177 reads/indexes which are only identical.
## After classification, there are 90341 reads/indexes which are strictly sequencer.
## After classification, there are 244494 reads/indexes which are deemed from reverse transcriptase.
## Counted by direction: 9104237 forward reads and 9257103 reverse_reads.
## Subsetting based on mutations with at least 5 indexes.
## Classified mutation strings according to various queries.
## Plotting index densities.
## Skipping table: delete_reads_by_position
## Skipping table: delete_indexes_by_position
## Skipping table: delete_sequencer_by_position
## Skipping table: delete_reads_by_nt
## Skipping table: delete_indexes_by_nt
## Skipping table: delete_sequencer_by_nt
##                         Length Class      Mode   
## metadata                 5     data.frame list   
## samples                  3     -none-     list   
## filtered                18     -none-     numeric
## reads_remaining         24     -none-     numeric
## indexes_remaining       15     -none-     numeric
## reads_per_sample         3     -none-     numeric
## indexes_per_sample       3     -none-     numeric
## matrices                33     -none-     list   
## matrices_cpm            33     -none-     list   
## matrices_cpmlength      33     -none-     list   
## matrices_counts         33     -none-     list   
## matrices_countslength   33     -none-     list   
## pre_index_density_plot   9     gg         list   
## post_index_density_plot  9     gg         list   
## plots                    5     -none-     list
## Starting sample: 1.
## Reading the file containing mutations: preprocessing/s1/step4.txt.xz
## Reading the file containing the identical reads: preprocessing/s1/step2_identical_reads.txt.xz
## Counting indexes before filtering.
## Mutation data: removing any differences before position: 24.
## Mutation data: before pruning, there are: 1156535 reads.
## Mutation data: after min-position pruning, there are: 1037310 reads: 119225 lost or 10.31%.
## Mutation data: removing any differences after position: 176.
## Mutation data: before pruning, there are: 1037310 reads.
## Mutation data: after max-position pruning, there are: 968161 reads: 69149 lost or 6.67%.
## Mutation data: removing any reads with 'N' as the hit.
## Mutation data: after N pruning, there are: 953181 reads: 14980 lost or 1.55%.
## Mutation data: all filters removed 203354 reads, or 17.58%.
## Gathering information about the number of reads per index.
## Before reads/index pruning, there are: 1742165 indexes in all the data.
## After reads/index pruning, there are: 837608 indexes: 904557 lost or 51.92%.
## All data: removing indexes with fewer than 3 reads/index.
## All data: before reads/index pruning, there are: 953181 changed reads.
## All data: before reads/index pruning, there are: 4681501 identical reads.
## All data: after index pruning, there are: 491995 changed reads: 51.62%.
## All data: after index pruning, there are: 3663004 identical reads: 78.24%.
## Gathering identical, mutant, and sequencer reads/indexes.
## Before classification, there are 3663004 identical reads.
## Before classification, there are 491995 reads with mutations.
## After classification, there are 2738199 reads/indexes which are only identical.
## After classification, there are 11023 reads/indexes which are strictly sequencer.
## After classification, there are 26963 reads/indexes which are deemed from reverse transcriptase.
## Counted by direction: 7018785 forward reads and 7148314 reverse_reads.
## Subsetting based on mutations with at least 5 indexes.
## Classified mutation strings according to various queries.
## Starting sample: 2.
## Reading the file containing mutations: preprocessing/s2/step4.txt.xz
## Reading the file containing the identical reads: preprocessing/s2/step2_identical_reads.txt.xz
## Counting indexes before filtering.
## Mutation data: removing any differences before position: 24.
## Mutation data: before pruning, there are: 3421203 reads.
## Mutation data: after min-position pruning, there are: 1758479 reads: 1662724 lost or 48.60%.
## Mutation data: removing any differences after position: 176.
## Mutation data: before pruning, there are: 1758479 reads.
## Mutation data: after max-position pruning, there are: 1667302 reads: 91177 lost or 5.18%.
## Mutation data: removing any reads with 'N' as the hit.
## Mutation data: after N pruning, there are: 1642969 reads: 24333 lost or 1.46%.
## Mutation data: all filters removed 1778234 reads, or 51.98%.
## Gathering information about the number of reads per index.
## Before reads/index pruning, there are: 1261478 indexes in all the data.
## After reads/index pruning, there are: 693725 indexes: 567753 lost or 45.01%.
## All data: removing indexes with fewer than 3 reads/index.
## All data: before reads/index pruning, there are: 1642969 changed reads.
## All data: before reads/index pruning, there are: 5230976 identical reads.
## All data: after index pruning, there are: 814407 changed reads: 49.57%.
## All data: after index pruning, there are: 4834092 identical reads: 92.41%.
## Gathering identical, mutant, and sequencer reads/indexes.
## Before classification, there are 4834092 identical reads.
## Before classification, there are 814407 reads with mutations.
## After classification, there are 2802107 reads/indexes which are only identical.
## After classification, there are 111708 reads/indexes which are strictly sequencer.
## After classification, there are 126921 reads/indexes which are deemed from reverse transcriptase.
## Counted by direction: 11803361 forward reads and 12275547 reverse_reads.
## Subsetting based on mutations with at least 5 indexes.
## Classified mutation strings according to various queries.
## Starting sample: 3.
## Reading the file containing mutations: preprocessing/s3/step4.txt.xz
## Reading the file containing the identical reads: preprocessing/s3/step2_identical_reads.txt.xz
## Counting indexes before filtering.
## Mutation data: removing any differences before position: 24.
## Mutation data: before pruning, there are: 4309681 reads.
## Mutation data: after min-position pruning, there are: 1564155 reads: 2745526 lost or 63.71%.
## Mutation data: removing any differences after position: 176.
## Mutation data: before pruning, there are: 1564155 reads.
## Mutation data: after max-position pruning, there are: 1482559 reads: 81596 lost or 5.22%.
## Mutation data: removing any reads with 'N' as the hit.
## Mutation data: after N pruning, there are: 1452047 reads: 30512 lost or 2.06%.
## Mutation data: all filters removed 2857634 reads, or 66.31%.
## Gathering information about the number of reads per index.
## Before reads/index pruning, there are: 884042 indexes in all the data.
## After reads/index pruning, there are: 463445 indexes: 420597 lost or 47.58%.
## All data: removing indexes with fewer than 3 reads/index.
## All data: before reads/index pruning, there are: 1452047 changed reads.
## All data: before reads/index pruning, there are: 3583390 identical reads.
## All data: after index pruning, there are: 730397 changed reads: 50.30%.
## All data: after index pruning, there are: 3332136 identical reads: 92.99%.
## Gathering identical, mutant, and sequencer reads/indexes.
## Before classification, there are 3332136 identical reads.
## Before classification, there are 730397 reads with mutations.
## After classification, there are 1851177 reads/indexes which are only identical.
## After classification, there are 90341 reads/indexes which are strictly sequencer.
## After classification, there are 244494 reads/indexes which are deemed from reverse transcriptase.
## Counted by direction: 9104237 forward reads and 9257103 reverse_reads.
## Subsetting based on mutations with at least 5 indexes.
## Classified mutation strings according to various queries.
## Plotting index densities.
## Skipping table: delete_reads_by_position
## Skipping table: delete_indexes_by_position
## Skipping table: delete_sequencer_by_position
## Skipping table: delete_reads_by_nt
## Skipping table: delete_indexes_by_nt
## Skipping table: delete_sequencer_by_nt
##                         Length Class      Mode   
## metadata                 5     data.frame list   
## samples                  3     -none-     list   
## filtered                18     -none-     numeric
## reads_remaining         24     -none-     numeric
## indexes_remaining       15     -none-     numeric
## reads_per_sample         3     -none-     numeric
## indexes_per_sample       3     -none-     numeric
## matrices                33     -none-     list   
## matrices_cpm            33     -none-     list   
## matrices_cpmlength      33     -none-     list   
## matrices_counts         33     -none-     list   
## matrices_countslength   33     -none-     list   
## pre_index_density_plot   9     gg         list   
## post_index_density_plot  9     gg         list   
## plots                    5     -none-     list
## Starting sample: 1.
## Reading the file containing mutations: preprocessing/s1/step4.txt.xz
## Reading the file containing the identical reads: preprocessing/s1/step2_identical_reads.txt.xz
## Counting indexes before filtering.
## Mutation data: removing any differences before position: 24.
## Mutation data: before pruning, there are: 1156535 reads.
## Mutation data: after min-position pruning, there are: 1037310 reads: 119225 lost or 10.31%.
## Mutation data: removing any differences after position: 176.
## Mutation data: before pruning, there are: 1037310 reads.
## Mutation data: after max-position pruning, there are: 968161 reads: 69149 lost or 6.67%.
## Mutation data: removing any reads with 'N' as the hit.
## Mutation data: after N pruning, there are: 953181 reads: 14980 lost or 1.55%.
## Mutation data: all filters removed 203354 reads, or 17.58%.
## Gathering information about the number of reads per index.
## Before reads/index pruning, there are: 1742165 indexes in all the data.
## After reads/index pruning, there are: 837608 indexes: 904557 lost or 51.92%.
## All data: removing indexes with fewer than 3 reads/index.
## All data: before reads/index pruning, there are: 953181 changed reads.
## All data: before reads/index pruning, there are: 4681501 identical reads.
## All data: after index pruning, there are: 491995 changed reads: 51.62%.
## All data: after index pruning, there are: 3663004 identical reads: 78.24%.
## Gathering identical, mutant, and sequencer reads/indexes.
## Before classification, there are 3663004 identical reads.
## Before classification, there are 491995 reads with mutations.
## After classification, there are 2738199 reads/indexes which are only identical.
## After classification, there are 11023 reads/indexes which are strictly sequencer.
## After classification, there are 26963 reads/indexes which are deemed from reverse transcriptase.
## Counted by direction: 7018785 forward reads and 7148314 reverse_reads.
## Subsetting based on mutations with at least 5 indexes.
## Classified mutation strings according to various queries.
## Starting sample: 2.
## Reading the file containing mutations: preprocessing/s2/step4.txt.xz
## Reading the file containing the identical reads: preprocessing/s2/step2_identical_reads.txt.xz
## Counting indexes before filtering.
## Mutation data: removing any differences before position: 24.
## Mutation data: before pruning, there are: 3421203 reads.
## Mutation data: after min-position pruning, there are: 1758479 reads: 1662724 lost or 48.60%.
## Mutation data: removing any differences after position: 176.
## Mutation data: before pruning, there are: 1758479 reads.
## Mutation data: after max-position pruning, there are: 1667302 reads: 91177 lost or 5.18%.
## Mutation data: removing any reads with 'N' as the hit.
## Mutation data: after N pruning, there are: 1642969 reads: 24333 lost or 1.46%.
## Mutation data: all filters removed 1778234 reads, or 51.98%.
## Gathering information about the number of reads per index.
## Before reads/index pruning, there are: 1261478 indexes in all the data.
## After reads/index pruning, there are: 693725 indexes: 567753 lost or 45.01%.
## All data: removing indexes with fewer than 3 reads/index.
## All data: before reads/index pruning, there are: 1642969 changed reads.
## All data: before reads/index pruning, there are: 5230976 identical reads.
## All data: after index pruning, there are: 814407 changed reads: 49.57%.
## All data: after index pruning, there are: 4834092 identical reads: 92.41%.
## Gathering identical, mutant, and sequencer reads/indexes.
## Before classification, there are 4834092 identical reads.
## Before classification, there are 814407 reads with mutations.
## After classification, there are 2802107 reads/indexes which are only identical.
## After classification, there are 111708 reads/indexes which are strictly sequencer.
## After classification, there are 126921 reads/indexes which are deemed from reverse transcriptase.
## Counted by direction: 11803361 forward reads and 12275547 reverse_reads.
## Subsetting based on mutations with at least 5 indexes.
## Classified mutation strings according to various queries.
## Starting sample: 3.
## Reading the file containing mutations: preprocessing/s3/step4.txt.xz
## Reading the file containing the identical reads: preprocessing/s3/step2_identical_reads.txt.xz
## Counting indexes before filtering.
## Mutation data: removing any differences before position: 24.
## Mutation data: before pruning, there are: 4309681 reads.
## Mutation data: after min-position pruning, there are: 1564155 reads: 2745526 lost or 63.71%.
## Mutation data: removing any differences after position: 176.
## Mutation data: before pruning, there are: 1564155 reads.
## Mutation data: after max-position pruning, there are: 1482559 reads: 81596 lost or 5.22%.
## Mutation data: removing any reads with 'N' as the hit.
## Mutation data: after N pruning, there are: 1452047 reads: 30512 lost or 2.06%.
## Mutation data: all filters removed 2857634 reads, or 66.31%.
## Gathering information about the number of reads per index.
## Before reads/index pruning, there are: 884042 indexes in all the data.
## After reads/index pruning, there are: 463445 indexes: 420597 lost or 47.58%.
## All data: removing indexes with fewer than 3 reads/index.
## All data: before reads/index pruning, there are: 1452047 changed reads.
## All data: before reads/index pruning, there are: 3583390 identical reads.
## All data: after index pruning, there are: 730397 changed reads: 50.30%.
## All data: after index pruning, there are: 3332136 identical reads: 92.99%.
## Gathering identical, mutant, and sequencer reads/indexes.
## Before classification, there are 3332136 identical reads.
## Before classification, there are 730397 reads with mutations.
## After classification, there are 1851177 reads/indexes which are only identical.
## After classification, there are 90341 reads/indexes which are strictly sequencer.
## After classification, there are 244494 reads/indexes which are deemed from reverse transcriptase.
## Counted by direction: 9104237 forward reads and 9257103 reverse_reads.
## Subsetting based on mutations with at least 5 indexes.
## Classified mutation strings according to various queries.
## Plotting index densities.
## Skipping table: delete_reads_by_position
## Skipping table: delete_indexes_by_position
## Skipping table: delete_sequencer_by_position
## Skipping table: delete_reads_by_nt
## Skipping table: delete_indexes_by_nt
## Skipping table: delete_sequencer_by_nt
##                         Length Class      Mode   
## metadata                 5     data.frame list   
## samples                  3     -none-     list   
## filtered                18     -none-     numeric
## reads_remaining         24     -none-     numeric
## indexes_remaining       15     -none-     numeric
## reads_per_sample         3     -none-     numeric
## indexes_per_sample       3     -none-     numeric
## matrices                33     -none-     list   
## matrices_cpm            33     -none-     list   
## matrices_cpmlength      33     -none-     list   
## matrices_counts         33     -none-     list   
## matrices_countslength   33     -none-     list   
## pre_index_density_plot   9     gg         list   
## post_index_density_plot  9     gg         list   
## plots                    5     -none-     list

2 Questions from Dr. DeStefano

I think what is best is to get the number of recovered mutations of each type from each data set. That would be A to T, A to G, A to C; T to A, T to G, T to C; G to A, G to C, G to T; and C to A, C to G, C to T; as well as deletions and insertions. I would then need the sum number of the reads that met all our criteria (i.e. at least 3 good recovered reads for that 14 nt index). Each set of 3 or more would ct as “1” read of that particular index so I would need the total with this in mind. I also need to know the total number of nucleotides that were in the region we decided to consider in the analysis. We may want to try this for 3 or more and 5 or more recovered indexes if it is not hard. This information does not include specific positions on the template where errors occurred but we can look at that latter. Right now I just want to get a general error rate and type of error. It would basically be calculated by dividing the number of recovered mutations of a particular type by sum number of the reads times the number of nucleotides screened in the template. As it ends up, this number does not really have a lot of meaning but it can be used to calculate the overall mutation rate as well as the rate for transversions, transitions, and deletions and insertions.

3 Answers

In order to address those queries, I invoked create_matrices() with a minimum index count of 3 and 5. It should be noted that this is not the same as requiring 3 or 5 reads per index. In both cases I require 3 reads per index.

3.1 Recovered mutations of each type

I am interpreting this question as the number of indexes recovered for each mutation type. I collect this information in 2 ways of interest: the indexes by type which are deemed to be from the RT and from the sequencer. In addition, I calculate a normalized (cpm) version of this information which may be used to look for changes across samples.

3.1.1 Mutations by RT index

This following block should print out tables of the numbers of mutant indexes observed for each type for the RT and the sequencer. One would hope that the sequencer will be consistent for all samples, but I think the results will instead suggest that my metric is not yet stringent enough.

s1 s2 s3
A_C 1226 4078 8324
A_G 687 14428 50666
A_T 212 2050 4514
C_A 9115 28661 33332
C_G 329 3690 9533
C_T 2108 17340 59479
G_A 1617 29449 35634
G_C 268 1549 2843
G_T 9304 11694 14377
T_A 178 4752 7492
T_C 805 3995 8312
T_G 1044 5090 9203
s1 s2 s3
A_C 1226 4078 8324
A_G 687 14428 50666
A_T 212 2050 4514
C_A 9115 28661 33332
C_G 329 3690 9533
C_T 2108 17340 59479
G_A 1617 29449 35634
G_C 268 1549 2843
G_T 9304 11694 14377
T_A 178 4752 7492
T_C 805 3995 8312
T_G 1044 5090 9203
s1 s2 s3
A_C 1226 4078 8324
A_G 687 14428 50666
A_T 212 2050 4514
C_A 9115 28661 33332
C_G 329 3690 9533
C_T 2108 17340 59479
G_A 1617 29449 35634
G_C 268 1549 2843
G_T 9304 11694 14377
T_A 178 4752 7492
T_C 805 3995 8312
T_G 1044 5090 9203
s1 s2 s3
A_C 1216 4078 8324
A_G 675 14428 50666
A_T 202 2050 4514
C_A 9115 28661 33332
C_G 305 3686 9533
C_T 2104 17340 59479
G_A 1613 29449 35634
G_C 243 1545 2839
G_T 9304 11694 14377
T_A 161 4752 7492
T_C 797 3995 8312
T_G 1044 5084 9203
s1 s2 s3
A_C 1216 4078 8324
A_G 675 14428 50666
A_T 202 2050 4514
C_A 9115 28661 33332
C_G 305 3686 9533
C_T 2104 17340 59479
G_A 1613 29449 35634
G_C 243 1545 2839
G_T 9304 11694 14377
T_A 161 4752 7492
T_C 797 3995 8312
T_G 1044 5084 9203
s1 s2 s3
A_C 1216 4078 8324
A_G 675 14428 50666
A_T 202 2050 4514
C_A 9115 28661 33332
C_G 305 3686 9533
C_T 2104 17340 59479
G_A 1613 29449 35634
G_C 243 1545 2839
G_T 9304 11694 14377
T_A 161 4752 7492
T_C 797 3995 8312
T_G 1044 5084 9203
s1 s2 s3
A_C 2265 17215 14189
A_G 623 7106 5588
A_T 170 2701 2256
C_A 1163 14161 11148
C_G 561 5632 4067
C_T 695 7037 5431
G_A 519 4839 3979
G_C 452 6119 5518
G_T 966 8307 6799
T_A 372 3370 2702
T_C 916 9795 8136
T_G 2227 25324 20436
s1 s2 s3
A_C 2265 17215 14189
A_G 623 7106 5588
A_T 170 2701 2256
C_A 1163 14161 11148
C_G 561 5632 4067
C_T 695 7037 5431
G_A 519 4839 3979
G_C 452 6119 5518
G_T 966 8307 6799
T_A 372 3370 2702
T_C 916 9795 8136
T_G 2227 25324 20436
s1 s2 s3
A_C 2265 17215 14189
A_G 623 7106 5588
A_T 170 2701 2256
C_A 1163 14161 11148
C_G 561 5632 4067
C_T 695 7037 5431
G_A 519 4839 3979
G_C 452 6119 5518
G_T 966 8307 6799
T_A 372 3370 2702
T_C 916 9795 8136
T_G 2227 25324 20436
s1 s2 s3
A_C 2258 17215 14189
A_G 623 7106 5588
A_T 148 2701 2256
C_A 1139 14161 11148
C_G 551 5632 4067
C_T 676 7037 5431
G_A 508 4839 3979
G_C 427 6119 5518
G_T 954 8307 6799
T_A 351 3370 2702
T_C 912 9795 8136
T_G 2214 25324 20436
s1 s2 s3
A_C 2258 17215 14189
A_G 623 7106 5588
A_T 148 2701 2256
C_A 1139 14161 11148
C_G 551 5632 4067
C_T 676 7037 5431
G_A 508 4839 3979
G_C 427 6119 5518
G_T 954 8307 6799
T_A 351 3370 2702
T_C 912 9795 8136
T_G 2214 25324 20436
s1 s2 s3
A_C 2258 17215 14189
A_G 623 7106 5588
A_T 148 2701 2256
C_A 1139 14161 11148
C_G 551 5632 4067
C_T 676 7037 5431
G_A 508 4839 3979
G_C 427 6119 5518
G_T 954 8307 6799
T_A 351 3370 2702
T_C 912 9795 8136
T_G 2214 25324 20436

Plots of this information

This suggests to me that this information needs to be normalized in some more sensible fashion. Thus the following:

3.1.2 Mutations by RT index, post normalization

The same numbers may be expressed in the context of the number of indexes observed / sample and/or as a cpm across samples. Thus in the first instance one can look at the apparent error rate for each sample, and in the second instance one may look for relative changes in apparent error rate across samples.

3.1.2.1 Rewriting the matrices as cpm to account for library sizes.

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

3.1.2.2 Rewriting the matrices by dividing by all indexes

This I think starts to address the later text in your query.

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

3.1.2.3 Rewriting the matrices by dividing by all indexes and cpm

I think this might prove to be where we get the most meaningful results.

The nicest thing in it is that after accounting for library sizes and total indexes observed, we finally see that the sequencer error is mostly consistent across all samples and mutation types – with a couple of notable exceptions.

By the same token, for the mutations which are identical for the sequencer, we have some which are decidedly different for the non-sequencer data. The most notable examples I think are A to G but _not G to A; and C to T.

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

3.1.3 Indels by RT index

The following blocks will repeat the above, but looking for insertions. This data does not observe sufficient deletions to make a proper count for them.

s1 s2 s3
A 0 25 382
C 0 23 69
G 0 31 89
T 0 48 221
s1 s2 s3
A 0 25 382
C 0 23 69
G 0 31 89
T 0 48 221
s1 s2 s3
A 0 25 382
C 0 23 69
G 0 31 89
T 0 48 221
s1 s2 s3
A 0 25 382
C 0 20 65
G 0 27 89
T 0 48 217
s1 s2 s3
A 0 25 382
C 0 20 65
G 0 27 89
T 0 48 217
s1 s2 s3
A 0 25 382
C 0 20 65
G 0 27 89
T 0 48 217
s1 s2 s3
A 0 3 8
C 0 24 25
G 0 14 16
T 0 0 3
s1 s2 s3
A 0 3 8
C 0 24 25
G 0 14 16
T 0 0 3
s1 s2 s3
A 0 3 8
C 0 24 25
G 0 14 16
T 0 0 3
s1 s2 s3
A 0 0 5
C 0 17 15
G 0 10 5
s1 s2 s3
A 0 0 5
C 0 17 15
G 0 10 5
s1 s2 s3
A 0 0 5
C 0 17 15
G 0 10 5

Plots of this information

3.1.4 Insertions by RT index, post normalization

3.1.4.1 Rewriting the matrices as cpm to account for library sizes.

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

3.1.4.2 Rewriting the matrices by dividing by all indexes

I think that there are few enough insertion events that this gets a bit messed up. I will double check the logic of this, but that is my initial guess given how few insertions I was seeing when reading the outputs manually. Unfortunately, this means that for these I also cannot provide a cpm measurement.

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

## Warning in kable_markdown(x, padding = padding, ...): The table should have a
## header (column names)

|| || || ||

The following is my previous writing of this worksheet which just dumped the various tables.

LS0tCnRpdGxlOiAiQ291bnRpbmcgUlQgbXV0YXRpb25zIGZyb20gaWxsdW1pbmEgc2VxdWVuY2luZyBkYXRhLiIKYXV0aG9yOiAiYXRiIGFiZWxld0BnbWFpbC5jb20iCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGtlZXBfbWQ6IGZhbHNlCiAgICBtb2RlOiBzZWxmY29udGFpbmVkCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICB0aGVtZTogcmVhZGFibGUKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIGRmX3ByaW50OiBwYWdlZAogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgd2lkdGg6IDMwMAogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIHRvY19mbG9hdDogdHJ1ZQogIEJpb2NTdHlsZTo6aHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CmJvZHksIHRkIHsKICBmb250LXNpemU6IDE2cHg7Cn0KY29kZS5yewogIGZvbnQtc2l6ZTogMTZweDsKfQpwcmUgewogZm9udC1zaXplOiAxNnB4Cn0KPC9zdHlsZT4KCmBgYHtyIG9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoImhwZ2x0b29scyIpCnR0IDwtIGRldnRvb2xzOjpsb2FkX2FsbCgiL2RhdGEvaHBnbHRvb2xzIikKa25pdHI6Om9wdHNfa25pdCRzZXQod2lkdGg9MTIwLAogICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcz1UUlVFLAogICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgIGVjaG89VFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVycm9yPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBkcGk9OTYpCm9sZF9vcHRpb25zIDwtIG9wdGlvbnMoZGlnaXRzPTQsCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycz1GQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICBrbml0ci5kdXBsaWNhdGUubGFiZWw9ImFsbG93IikKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZT0xMCkpCnJ1bmRhdGUgPC0gZm9ybWF0KFN5cy5EYXRlKCksIGZvcm1hdD0iJVklbSVkIikKcHJldmlvdXNfZmlsZSA8LSAiaW5kZXguUm1kIgp2ZXIgPC0gIjIwMTkxMjAxIgoKIyN0bXAgPC0gc20obG9hZG1lKGZpbGVuYW1lPXBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cHJldmlvdXNfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKSkpCnJtZF9maWxlIDwtICJlcnJvcl9xdWFudC5SbWQiCmBgYAoKIyBDYWxjdWxhdGluZyBlcnJvciByYXRlcy4KCkkgd3JvdGUgdGhlIGZ1bmN0aW9uICdjcmVhdGVfbWF0cmljZXMoKScgdG8gY29sbGVjdCBtdXRhdGlvbiBjb3VudHMuICBBdCBsZWFzdAppbiB0aGVvcnkgdGhlIHJlc3VsdHMgZnJvbSBpdCBzaG91bGQgYmUgYWJsZSB0byBhZGRyZXNzIG1vc3QvYW55IHF1ZXN0aW9uCnJlZ2FyZGluZyB0aGUgY291bnRzIG9mIG11dGF0aW9ucyBvYnNlcnZlZCBpbiB0aGUgZGF0YS4KCiMjIENhdGVnb3JpemUgdGhlIGRhdGEgd2l0aCBhdCBsZWFzdCAzIGluZGV4ZXMgcGVyIG11dGFudAoKYGBge3IgdHJpcGxlc30KZGV2dG9vbHM6OmxvYWRfYWxsKCJSZXJycnQiKQpzYW1wbGVfc2hlZXQgPC0gInNhbXBsZV9zaGVldHMvYWxsX3NhbXBsZXMueGxzeCIKaWRlbnRfY29sdW1uIDwtICJpZGVudHRhYmxlIgptdXRfY29sdW1uIDwtICJtdXRhdGlvbnRhYmxlIgptaW5fcmVhZHMgPC0gMwptaW5faW5kZXhlcyA8LSAzCm1pbl9zZXF1ZW5jZXIgPC0gMTAKbWluX3Bvc2l0aW9uIDwtIDI0Cm1heF9wb3NpdGlvbiA8LSAxNzYKbWF4X211dGF0aW9uc19wZXJfcmVhZCA8LSBOVUxMCnBydW5lX24gPC0gVFJVRQp2ZXJib3NlIDwtIFRSVUUKZXhjZWwgPC0gImV4Y2VsL3RyaXBsZXMueGxzeCIKdHJpcGxlcyA8LSBjcmVhdGVfbWF0cmljZXMoc2FtcGxlX3NoZWV0PXNhbXBsZV9zaGVldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRfY29sdW1uPWlkZW50X2NvbHVtbiwgbXV0X2NvbHVtbj1tdXRfY29sdW1uLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fcmVhZHM9bWluX3JlYWRzLCBtaW5faW5kZXhlcz1taW5faW5kZXhlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3NlcXVlbmNlcj1taW5fc2VxdWVuY2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fcG9zaXRpb249bWluX3Bvc2l0aW9uLCBtYXhfcG9zaXRpb249bWF4X3Bvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwcnVuZV9uPXBydW5lX24sIHZlcmJvc2U9dmVyYm9zZSwgZXhjZWw9ZXhjZWwpCnN1bW1hcnkodHJpcGxlcykKCm1heF9tdXRhdGlvbnNfcGVyX3JlYWQgPC0gMTAKZXhjZWwgPC0gImV4Y2VsL3RyaXBsZXNfdGVubXByLnhsc3giCnRyaXBsZXNfdGVubXByIDwtIGNyZWF0ZV9tYXRyaWNlcyhzYW1wbGVfc2hlZXQ9c2FtcGxlX3NoZWV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50X2NvbHVtbj1pZGVudF9jb2x1bW4sIG11dF9jb2x1bW49bXV0X2NvbHVtbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fcmVhZHM9bWluX3JlYWRzLCBtaW5faW5kZXhlcz1taW5faW5kZXhlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fc2VxdWVuY2VyPW1pbl9zZXF1ZW5jZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3Bvc2l0aW9uPW1pbl9wb3NpdGlvbiwgbWF4X3Bvc2l0aW9uPW1heF9wb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcnVuZV9uPXBydW5lX24sIHZlcmJvc2U9dmVyYm9zZSkKc3VtbWFyeSh0cmlwbGVzX3Rlbm1wcikKCm1heF9tdXRhdGlvbnNfcGVyX3JlYWQgPC0gNQpleGNlbCA8LSAiZXhjZWwvdHJpcGxlc19maXZlbXByLnhsc3giCnRyaXBsZXNfZml2ZW1wciA8LSBjcmVhdGVfbWF0cmljZXMoc2FtcGxlX3NoZWV0PXNhbXBsZV9zaGVldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRfY29sdW1uPWlkZW50X2NvbHVtbiwgbXV0X2NvbHVtbj1tdXRfY29sdW1uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fcmVhZHM9bWluX3JlYWRzLCBtaW5faW5kZXhlcz1taW5faW5kZXhlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3NlcXVlbmNlcj1taW5fc2VxdWVuY2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fcG9zaXRpb249bWluX3Bvc2l0aW9uLCBtYXhfcG9zaXRpb249bWF4X3Bvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcnVuZV9uPXBydW5lX24sIHZlcmJvc2U9dmVyYm9zZSkKc3VtbWFyeSh0cmlwbGVzX2ZpdmVtcHIpCmBgYAoKIyMgQ2F0ZWdvcml6ZSB0aGUgZGF0YSB3aXRoIGF0IGxlYXN0IDUgaW5kZXhlcyBwZXIgbXV0YW50CgpgYGB7ciBxdWludHN9Cm1pbl9pbmRleGVzIDwtIDUKbWF4X211dGF0aW9uc19wZXJfcmVhZCA8LSBOVUxMCmV4Y2VsIDwtICJleGNlbC9xdWludHMueGxzeCIKcXVpbnRzIDwtIGNyZWF0ZV9tYXRyaWNlcyhzYW1wbGVfc2hlZXQ9c2FtcGxlX3NoZWV0LAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50X2NvbHVtbj1pZGVudF9jb2x1bW4sIG11dF9jb2x1bW49bXV0X2NvbHVtbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fcmVhZHM9bWluX3JlYWRzLCBtaW5faW5kZXhlcz1taW5faW5kZXhlcywKICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fc2VxdWVuY2VyPW1pbl9zZXF1ZW5jZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3Bvc2l0aW9uPW1pbl9wb3NpdGlvbiwgbWF4X3Bvc2l0aW9uPW1heF9wb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBwcnVuZV9uPXBydW5lX24sIHZlcmJvc2U9dmVyYm9zZSkKc3VtbWFyeShxdWludHMpCgptYXhfbXV0YXRpb25zX3Blcl9yZWFkIDwtIDEwCmV4Y2VsIDwtICJleGNlbC9xdWludHNfdGVubXByLnhsc3giCnF1aW50c190ZW5tcHIgPC0gY3JlYXRlX21hdHJpY2VzKHNhbXBsZV9zaGVldD1zYW1wbGVfc2hlZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50X2NvbHVtbj1pZGVudF9jb2x1bW4sIG11dF9jb2x1bW49bXV0X2NvbHVtbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3JlYWRzPW1pbl9yZWFkcywgbWluX2luZGV4ZXM9bWluX2luZGV4ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9zZXF1ZW5jZXI9bWluX3NlcXVlbmNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3Bvc2l0aW9uPW1pbl9wb3NpdGlvbiwgbWF4X3Bvc2l0aW9uPW1heF9wb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJ1bmVfbj1wcnVuZV9uLCB2ZXJib3NlPXZlcmJvc2UpCnN1bW1hcnkocXVpbnRzX3Rlbm1wcikKCm1heF9tdXRhdGlvbnNfcGVyX3JlYWQgPC0gNQpleGNlbCA8LSAiZXhjZWwvcXVpbnRzX2ZpdmVtcHIueGxzeCIKcXVpbnRzX2ZpdmVtcHIgPC0gY3JlYXRlX21hdHJpY2VzKHNhbXBsZV9zaGVldD1zYW1wbGVfc2hlZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudF9jb2x1bW49aWRlbnRfY29sdW1uLCBtdXRfY29sdW1uPW11dF9jb2x1bW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fcmVhZHM9bWluX3JlYWRzLCBtaW5faW5kZXhlcz1taW5faW5kZXhlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9zZXF1ZW5jZXI9bWluX3NlcXVlbmNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9wb3NpdGlvbj1taW5fcG9zaXRpb24sIG1heF9wb3NpdGlvbj1tYXhfcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcnVuZV9uPXBydW5lX24sIHZlcmJvc2U9dmVyYm9zZSkKc3VtbWFyeShxdWludHNfZml2ZW1wcikKYGBgCgojIFF1ZXN0aW9ucyBmcm9tIERyLiBEZVN0ZWZhbm8KCkkgdGhpbmsgd2hhdCBpcyBiZXN0IGlzIHRvIGdldCB0aGUgbnVtYmVyIG9mIHJlY292ZXJlZCBtdXRhdGlvbnMgb2YgZWFjaCB0eXBlCmZyb20gZWFjaCBkYXRhIHNldC4gIFRoYXQgd291bGQgYmUgQSB0byBULCBBIHRvIEcsIEEgdG8gQzsgVCB0byBBLCBUIHRvIEcsIFQgdG8KQzsgRyB0byBBLCBHIHRvIEMsIEcgdG8gVDsgYW5kIEMgdG8gQSwgQyB0byBHLCBDIHRvIFQ7IGFzIHdlbGwgYXMgZGVsZXRpb25zIGFuZAppbnNlcnRpb25zLiAgSSB3b3VsZCB0aGVuIG5lZWQgdGhlIHN1bSBudW1iZXIgb2YgdGhlIHJlYWRzIHRoYXQgbWV0IGFsbCBvdXIKY3JpdGVyaWEgKGkuZS4gYXQgbGVhc3QgMyBnb29kIHJlY292ZXJlZCByZWFkcyBmb3IgdGhhdCAxNCBudCBpbmRleCkuICBFYWNoIHNldApvZiAzIG9yIG1vcmUgd291bGQgY3QgYXMgIjEiIHJlYWQgb2YgdGhhdCBwYXJ0aWN1bGFyIGluZGV4IHNvIEkgd291bGQgbmVlZCB0aGUKdG90YWwgd2l0aCB0aGlzIGluIG1pbmQuICBJIGFsc28gbmVlZCB0byBrbm93IHRoZSB0b3RhbCBudW1iZXIgb2YgbnVjbGVvdGlkZXMKdGhhdCB3ZXJlIGluIHRoZSByZWdpb24gd2UgZGVjaWRlZCB0byBjb25zaWRlciBpbiB0aGUgYW5hbHlzaXMuICBXZSBtYXkgd2FudCB0bwp0cnkgdGhpcyBmb3IgMyBvciBtb3JlIGFuZCA1IG9yIG1vcmUgcmVjb3ZlcmVkIGluZGV4ZXMgaWYgaXQgaXMgbm90IGhhcmQuICBUaGlzCmluZm9ybWF0aW9uIGRvZXMgbm90IGluY2x1ZGUgc3BlY2lmaWMgcG9zaXRpb25zIG9uIHRoZSB0ZW1wbGF0ZSB3aGVyZSBlcnJvcnMKb2NjdXJyZWQgYnV0IHdlIGNhbiBsb29rIGF0IHRoYXQgbGF0dGVyLiAgUmlnaHQgbm93IEkganVzdCB3YW50IHRvIGdldCBhIGdlbmVyYWwKZXJyb3IgcmF0ZSBhbmQgdHlwZSBvZiBlcnJvci4gIEl0IHdvdWxkIGJhc2ljYWxseSBiZSBjYWxjdWxhdGVkIGJ5IGRpdmlkaW5nIHRoZQpudW1iZXIgb2YgcmVjb3ZlcmVkIG11dGF0aW9ucyBvZiBhIHBhcnRpY3VsYXIgdHlwZSBieSBzdW0gbnVtYmVyIG9mIHRoZSByZWFkcwp0aW1lcyB0aGUgbnVtYmVyIG9mIG51Y2xlb3RpZGVzIHNjcmVlbmVkIGluIHRoZSB0ZW1wbGF0ZS4gIEFzIGl0IGVuZHMgdXAsIHRoaXMKbnVtYmVyIGRvZXMgbm90IHJlYWxseSBoYXZlIGEgbG90IG9mIG1lYW5pbmcgYnV0IGl0IGNhbiBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUKb3ZlcmFsbCBtdXRhdGlvbiByYXRlIGFzIHdlbGwgYXMgdGhlIHJhdGUgZm9yIHRyYW5zdmVyc2lvbnMsIHRyYW5zaXRpb25zLCBhbmQKZGVsZXRpb25zIGFuZCBpbnNlcnRpb25zLgoKIyBBbnN3ZXJzCgpJbiBvcmRlciB0byBhZGRyZXNzIHRob3NlIHF1ZXJpZXMsIEkgaW52b2tlZCBjcmVhdGVfbWF0cmljZXMoKSB3aXRoIGEgbWluaW11bQppbmRleCBjb3VudCBvZiAzIGFuZCA1LiAgSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhpcyBpcyBub3QgdGhlIHNhbWUgYXMKcmVxdWlyaW5nIDMgb3IgNSByZWFkcyBwZXIgaW5kZXguICBJbiBib3RoIGNhc2VzIEkgcmVxdWlyZSAzIHJlYWRzIHBlciBpbmRleC4KCiMjIFJlY292ZXJlZCBtdXRhdGlvbnMgb2YgZWFjaCB0eXBlCgpJIGFtIGludGVycHJldGluZyB0aGlzIHF1ZXN0aW9uIGFzIHRoZSBudW1iZXIgb2YgaW5kZXhlcyByZWNvdmVyZWQgZm9yIGVhY2gKbXV0YXRpb24gdHlwZS4gIEkgY29sbGVjdCB0aGlzIGluZm9ybWF0aW9uIGluIDIgd2F5cyBvZiBpbnRlcmVzdDogdGhlIGluZGV4ZXMgYnkKdHlwZSB3aGljaCBhcmUgZGVlbWVkIHRvIGJlIGZyb20gdGhlIFJUIGFuZCBmcm9tIHRoZSBzZXF1ZW5jZXIuICBJbiBhZGRpdGlvbiwgSQpjYWxjdWxhdGUgYSBub3JtYWxpemVkIChjcG0pIHZlcnNpb24gb2YgdGhpcyBpbmZvcm1hdGlvbiB3aGljaCBtYXkgYmUgdXNlZCB0byBsb29rIGZvcgpjaGFuZ2VzIGFjcm9zcyBzYW1wbGVzLgoKIyMjIE11dGF0aW9ucyBieSBSVCBpbmRleAoKVGhpcyBmb2xsb3dpbmcgYmxvY2sgc2hvdWxkIHByaW50IG91dCB0YWJsZXMgb2YgdGhlIG51bWJlcnMgb2YgbXV0YW50IGluZGV4ZXMKb2JzZXJ2ZWQgZm9yIGVhY2ggdHlwZSBmb3IgdGhlIFJUIGFuZCB0aGUgc2VxdWVuY2VyLiAgT25lIHdvdWxkIGhvcGUgdGhhdCB0aGUKc2VxdWVuY2VyIHdpbGwgYmUgY29uc2lzdGVudCBmb3IgYWxsIHNhbXBsZXMsIGJ1dCBJIHRoaW5rIHRoZSByZXN1bHRzIHdpbGwKaW5zdGVhZCBzdWdnZXN0IHRoYXQgbXkgbWV0cmljIGlzIG5vdCB5ZXQgc3RyaW5nZW50IGVub3VnaC4KCmBgYHtyIG11dGF0aW9uX2luZGV4X2NvdW50LCByZXN1bHRzPSdhc2lzJ30Ka25pdHI6OmthYmxlKHRyaXBsZXNbWyJtYXRyaWNlcyJdXVtbIm1pc3NfaW5kZXhlc19ieV90eXBlIl1dKQprbml0cjo6a2FibGUodHJpcGxlc190ZW5tcHJbWyJtYXRyaWNlcyJdXVtbIm1pc3NfaW5kZXhlc19ieV90eXBlIl1dKQprbml0cjo6a2FibGUodHJpcGxlc19maXZlbXByW1sibWF0cmljZXMiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXSkKa25pdHI6OmthYmxlKHF1aW50c1tbIm1hdHJpY2VzIl1dW1sibWlzc19pbmRleGVzX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZShxdWludHNfdGVubXByW1sibWF0cmljZXMiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXSkKa25pdHI6OmthYmxlKHF1aW50c19maXZlbXByW1sibWF0cmljZXMiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXSkKCmtuaXRyOjprYWJsZSh0cmlwbGVzW1sibWF0cmljZXMiXV1bWyJtaXNzX3NlcXVlbmNlcl9ieV90eXBlIl1dKQprbml0cjo6a2FibGUodHJpcGxlc190ZW5tcHJbWyJtYXRyaWNlcyJdXVtbIm1pc3Nfc2VxdWVuY2VyX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZSh0cmlwbGVzX2ZpdmVtcHJbWyJtYXRyaWNlcyJdXVtbIm1pc3Nfc2VxdWVuY2VyX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZShxdWludHNbWyJtYXRyaWNlcyJdXVtbIm1pc3Nfc2VxdWVuY2VyX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZShxdWludHNfdGVubXByW1sibWF0cmljZXMiXV1bWyJtaXNzX3NlcXVlbmNlcl9ieV90eXBlIl1dKQprbml0cjo6a2FibGUocXVpbnRzX2ZpdmVtcHJbWyJtYXRyaWNlcyJdXVtbIm1pc3Nfc2VxdWVuY2VyX2J5X3R5cGUiXV0pCmBgYAoKUGxvdHMgb2YgdGhpcyBpbmZvcm1hdGlvbgoKYGBge3IgbXV0YXRpb25faW5kZXhfY291bnRfcGxvdHN9CnRyaXBsZXNbWyJwbG90cyJdXVtbImNvdW50cyJdXVtbIm1pc3NfaW5kZXhlc19ieV90eXBlIl1dCnRyaXBsZXNfdGVubXByW1sicGxvdHMiXV1bWyJjb3VudHMiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXQp0cmlwbGVzX2ZpdmVtcHJbWyJwbG90cyJdXVtbImNvdW50cyJdXVtbIm1pc3NfaW5kZXhlc19ieV90eXBlIl1dCgpxdWludHNbWyJwbG90cyJdXVtbImNvdW50cyJdXVtbIm1pc3NfaW5kZXhlc19ieV90eXBlIl1dCnF1aW50c190ZW5tcHJbWyJwbG90cyJdXVtbImNvdW50cyJdXVtbIm1pc3NfaW5kZXhlc19ieV90eXBlIl1dCnF1aW50c19maXZlbXByW1sicGxvdHMiXV1bWyJjb3VudHMiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXQpgYGAKClRoaXMgc3VnZ2VzdHMgdG8gbWUgdGhhdCB0aGlzIGluZm9ybWF0aW9uIG5lZWRzIHRvIGJlIG5vcm1hbGl6ZWQgaW4gc29tZSBtb3JlCnNlbnNpYmxlIGZhc2hpb24uICBUaHVzIHRoZSBmb2xsb3dpbmc6CgojIyMgTXV0YXRpb25zIGJ5IFJUIGluZGV4LCBwb3N0IG5vcm1hbGl6YXRpb24KClRoZSBzYW1lIG51bWJlcnMgbWF5IGJlIGV4cHJlc3NlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgbnVtYmVyIG9mIGluZGV4ZXMKb2JzZXJ2ZWQgLyBzYW1wbGUgYW5kL29yIGFzIGEgY3BtIGFjcm9zcyBzYW1wbGVzLiAgVGh1cyBpbiB0aGUgZmlyc3QgaW5zdGFuY2UKb25lIGNhbiBsb29rIGF0IHRoZSBhcHBhcmVudCBlcnJvciByYXRlIGZvciBlYWNoIHNhbXBsZSwgYW5kIGluIHRoZSBzZWNvbmQKaW5zdGFuY2Ugb25lIG1heSBsb29rIGZvciByZWxhdGl2ZSBjaGFuZ2VzIGluIGFwcGFyZW50IGVycm9yIHJhdGUgYWNyb3NzCnNhbXBsZXMuCgojIyMjIFJld3JpdGluZyB0aGUgbWF0cmljZXMgYXMgY3BtIHRvIGFjY291bnQgZm9yIGxpYnJhcnkgc2l6ZXMuCgpgYGB7ciBtdXRhdGlvbl9pbmRleF9ub3JtYWxpemVkLCByZXN1bHRzPSdhc2lzJ30Ka25pdHI6OmthYmxlKHRyaXBsZXNbWyJub3JtYWxpemVkIl1dW1sibWlzc19pbmRleGVzX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZSh0cmlwbGVzX3Rlbm1wcltbIm5vcm1hbGl6ZWQiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXSkKa25pdHI6OmthYmxlKHRyaXBsZXNfZml2ZW1wcltbIm5vcm1hbGl6ZWQiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXSkKa25pdHI6OmthYmxlKHF1aW50c1tbIm5vcm1hbGl6ZWQiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXSkKa25pdHI6OmthYmxlKHF1aW50c190ZW5tcHJbWyJub3JtYWxpemVkIl1dW1sibWlzc19pbmRleGVzX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZShxdWludHNfZml2ZW1wcltbIm5vcm1hbGl6ZWQiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXSkKCmtuaXRyOjprYWJsZSh0cmlwbGVzW1sibm9ybWFsaXplZCJdXVtbIm1pc3Nfc2VxdWVuY2VyX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZSh0cmlwbGVzX3Rlbm1wcltbIm5vcm1hbGl6ZWQiXV1bWyJtaXNzX3NlcXVlbmNlcl9ieV90eXBlIl1dKQprbml0cjo6a2FibGUodHJpcGxlc19maXZlbXByW1sibm9ybWFsaXplZCJdXVtbIm1pc3Nfc2VxdWVuY2VyX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZShxdWludHNbWyJub3JtYWxpemVkIl1dW1sibWlzc19zZXF1ZW5jZXJfYnlfdHlwZSJdXSkKa25pdHI6OmthYmxlKHF1aW50c190ZW5tcHJbWyJub3JtYWxpemVkIl1dW1sibWlzc19zZXF1ZW5jZXJfYnlfdHlwZSJdXSkKa25pdHI6OmthYmxlKHF1aW50c19maXZlbXByW1sibm9ybWFsaXplZCJdXVtbIm1pc3Nfc2VxdWVuY2VyX2J5X3R5cGUiXV0pCmBgYAoKIyMjIyBSZXdyaXRpbmcgdGhlIG1hdHJpY2VzIGJ5IGRpdmlkaW5nIGJ5IGFsbCBpbmRleGVzCgpUaGlzIEkgdGhpbmsgc3RhcnRzIHRvIGFkZHJlc3MgdGhlIGxhdGVyIHRleHQgaW4geW91ciBxdWVyeS4KCmBgYHtyIG11dGF0aW9uX2luZGV4X25vcm1hbGl6ZWRfYnlfY291bnRzLCByZXN1bHRzPSdhc2lzJ30Ka25pdHI6OmthYmxlKHRyaXBsZXNbWyJtYXRyaWNlc19ieV9jb3VudHMiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXSkKa25pdHI6OmthYmxlKHF1aW50c1tbIm1hdHJpY2VzX2J5X2NvdW50cyJdXVtbIm1pc3NfaW5kZXhlc19ieV90eXBlIl1dKQoKa25pdHI6OmthYmxlKHRyaXBsZXNbWyJtYXRyaWNlc19ieV9jb3VudHMiXV1bWyJtaXNzX3NlcXVlbmNlcl9ieV90eXBlIl1dKQprbml0cjo6a2FibGUocXVpbnRzW1sibWF0cmljZXNfYnlfY291bnRzIl1dW1sibWlzc19zZXF1ZW5jZXJfYnlfdHlwZSJdXSkKYGBgCgojIyMjIFJld3JpdGluZyB0aGUgbWF0cmljZXMgYnkgZGl2aWRpbmcgYnkgYWxsIGluZGV4ZXMgYW5kIGNwbQoKSSB0aGluayB0aGlzIG1pZ2h0IHByb3ZlIHRvIGJlIHdoZXJlIHdlIGdldCB0aGUgbW9zdCBtZWFuaW5nZnVsIHJlc3VsdHMuCgpUaGUgbmljZXN0IHRoaW5nIGluIGl0IGlzIHRoYXQgYWZ0ZXIgYWNjb3VudGluZyBmb3IgbGlicmFyeSBzaXplcyBhbmQgdG90YWwKaW5kZXhlcyBvYnNlcnZlZCwgd2UgZmluYWxseSBzZWUgdGhhdCB0aGUgc2VxdWVuY2VyIGVycm9yIGlzIG1vc3RseSBjb25zaXN0ZW50CmFjcm9zcyBhbGwgc2FtcGxlcyBhbmQgbXV0YXRpb24gdHlwZXMgLS0gd2l0aCBhIGNvdXBsZSBvZiBub3RhYmxlIGV4Y2VwdGlvbnMuCgpCeSB0aGUgc2FtZSB0b2tlbiwgZm9yIHRoZSBtdXRhdGlvbnMgd2hpY2ggX2FyZV8gaWRlbnRpY2FsIGZvciB0aGUgc2VxdWVuY2VyLCB3ZQpoYXZlIHNvbWUgd2hpY2ggYXJlIGRlY2lkZWRseSBkaWZmZXJlbnQgZm9yIHRoZSBub24tc2VxdWVuY2VyIGRhdGEuICBUaGUgbW9zdApub3RhYmxlIGV4YW1wbGVzIEkgdGhpbmsgYXJlIEEgdG8gRyBidXQgX25vdCBHIHRvIEE7IGFuZCBDIHRvIFQuCgpgYGB7ciBtdXRhdGlvbl9pbmRleF9jcG1fYnlfY291bnRzLCByZXN1bHRzPSdhc2lzJ30Ka25pdHI6OmthYmxlKHRyaXBsZXNbWyJub3JtYWxpemVkX2J5X2NvdW50cyJdXVtbIm1pc3NfaW5kZXhlc19ieV90eXBlIl1dKQprbml0cjo6a2FibGUodHJpcGxlc190ZW5tcHJbWyJub3JtYWxpemVkX2J5X2NvdW50cyJdXVtbIm1pc3NfaW5kZXhlc19ieV90eXBlIl1dKQprbml0cjo6a2FibGUodHJpcGxlc19maXZlbXByW1sibm9ybWFsaXplZF9ieV9jb3VudHMiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXSkKa25pdHI6OmthYmxlKHF1aW50c1tbIm5vcm1hbGl6ZWRfYnlfY291bnRzIl1dW1sibWlzc19pbmRleGVzX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZShxdWludHNfdGVubXByW1sibm9ybWFsaXplZF9ieV9jb3VudHMiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXSkKa25pdHI6OmthYmxlKHF1aW50c19maXZlbXByW1sibm9ybWFsaXplZF9ieV9jb3VudHMiXV1bWyJtaXNzX2luZGV4ZXNfYnlfdHlwZSJdXSkKCmtuaXRyOjprYWJsZSh0cmlwbGVzW1sibm9ybWFsaXplZF9ieV9jb3VudHMiXV1bWyJtaXNzX3NlcXVlbmNlcl9ieV90eXBlIl1dKQprbml0cjo6a2FibGUodHJpcGxlc190ZW5tcHJbWyJub3JtYWxpemVkX2J5X2NvdW50cyJdXVtbIm1pc3Nfc2VxdWVuY2VyX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZSh0cmlwbGVzX2ZpdmVtcHJbWyJub3JtYWxpemVkX2J5X2NvdW50cyJdXVtbIm1pc3Nfc2VxdWVuY2VyX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZShxdWludHNbWyJub3JtYWxpemVkX2J5X2NvdW50cyJdXVtbIm1pc3Nfc2VxdWVuY2VyX2J5X3R5cGUiXV0pCmtuaXRyOjprYWJsZShxdWludHNfdGVubXByW1sibm9ybWFsaXplZF9ieV9jb3VudHMiXV1bWyJtaXNzX3NlcXVlbmNlcl9ieV90eXBlIl1dKQprbml0cjo6a2FibGUocXVpbnRzX2ZpdmVtcHJbWyJub3JtYWxpemVkX2J5X2NvdW50cyJdXVtbIm1pc3Nfc2VxdWVuY2VyX2J5X3R5cGUiXV0pCmBgYAoKIyMjIEluZGVscyBieSBSVCBpbmRleAoKVGhlIGZvbGxvd2luZyBibG9ja3Mgd2lsbCByZXBlYXQgdGhlIGFib3ZlLCBidXQgbG9va2luZyBmb3IgaW5zZXJ0aW9ucy4KVGhpcyBkYXRhIGRvZXMgbm90IG9ic2VydmUgc3VmZmljaWVudCBkZWxldGlvbnMgdG8gbWFrZSBhIHByb3BlciBjb3VudCBmb3IgdGhlbS4KCmBgYHtyIGluc2VydF9pbmRleF9jb3VudCwgcmVzdWx0cz0nYXNpcyd9CmtuaXRyOjprYWJsZSh0cmlwbGVzW1sibWF0cmljZXMiXV1bWyJpbnNlcnRfaW5kZXhlc19ieV9udCJdXSkKa25pdHI6OmthYmxlKHRyaXBsZXNfdGVubXByW1sibWF0cmljZXMiXV1bWyJpbnNlcnRfaW5kZXhlc19ieV9udCJdXSkKa25pdHI6OmthYmxlKHRyaXBsZXNfZml2ZW1wcltbIm1hdHJpY2VzIl1dW1siaW5zZXJ0X2luZGV4ZXNfYnlfbnQiXV0pCmtuaXRyOjprYWJsZShxdWludHNbWyJtYXRyaWNlcyJdXVtbImluc2VydF9pbmRleGVzX2J5X250Il1dKQprbml0cjo6a2FibGUocXVpbnRzX3Rlbm1wcltbIm1hdHJpY2VzIl1dW1siaW5zZXJ0X2luZGV4ZXNfYnlfbnQiXV0pCmtuaXRyOjprYWJsZShxdWludHNfZml2ZW1wcltbIm1hdHJpY2VzIl1dW1siaW5zZXJ0X2luZGV4ZXNfYnlfbnQiXV0pCgprbml0cjo6a2FibGUodHJpcGxlc1tbIm1hdHJpY2VzIl1dW1siaW5zZXJ0X3NlcXVlbmNlcl9ieV9udCJdXSkKa25pdHI6OmthYmxlKHRyaXBsZXNfdGVubXByW1sibWF0cmljZXMiXV1bWyJpbnNlcnRfc2VxdWVuY2VyX2J5X250Il1dKQprbml0cjo6a2FibGUodHJpcGxlc19maXZlbXByW1sibWF0cmljZXMiXV1bWyJpbnNlcnRfc2VxdWVuY2VyX2J5X250Il1dKQprbml0cjo6a2FibGUocXVpbnRzW1sibWF0cmljZXMiXV1bWyJpbnNlcnRfc2VxdWVuY2VyX2J5X250Il1dKQprbml0cjo6a2FibGUocXVpbnRzX3Rlbm1wcltbIm1hdHJpY2VzIl1dW1siaW5zZXJ0X3NlcXVlbmNlcl9ieV9udCJdXSkKa25pdHI6OmthYmxlKHF1aW50c19maXZlbXByW1sibWF0cmljZXMiXV1bWyJpbnNlcnRfc2VxdWVuY2VyX2J5X250Il1dKQpgYGAKClBsb3RzIG9mIHRoaXMgaW5mb3JtYXRpb24KCmBgYHtyIGluc2VydF9pbmRleF9jb3VudF9wbG90c30KdHJpcGxlc1tbInBsb3RzIl1dW1siY291bnRzIl1dW1siaW5zZXJ0X2luZGV4ZXNfYnlfbnQiXV0KdHJpcGxlc190ZW5tcHJbWyJwbG90cyJdXVtbImNvdW50cyJdXVtbImluc2VydF9pbmRleGVzX2J5X250Il1dCnRyaXBsZXNfZml2ZW1wcltbInBsb3RzIl1dW1siY291bnRzIl1dW1siaW5zZXJ0X2luZGV4ZXNfYnlfbnQiXV0KCnF1aW50c1tbInBsb3RzIl1dW1siY291bnRzIl1dW1siaW5zZXJ0X2luZGV4ZXNfYnlfbnQiXV0KcXVpbnRzX3Rlbm1wcltbInBsb3RzIl1dW1siY291bnRzIl1dW1siaW5zZXJ0X2luZGV4ZXNfYnlfbnQiXV0KcXVpbnRzX2ZpdmVtcHJbWyJwbG90cyJdXVtbImNvdW50cyJdXVtbImluc2VydF9pbmRleGVzX2J5X250Il1dCmBgYAoKIyMjIEluc2VydGlvbnMgYnkgUlQgaW5kZXgsIHBvc3Qgbm9ybWFsaXphdGlvbgoKIyMjIyBSZXdyaXRpbmcgdGhlIG1hdHJpY2VzIGFzIGNwbSB0byBhY2NvdW50IGZvciBsaWJyYXJ5IHNpemVzLgoKYGBge3IgaW5zZXJ0X2luZGV4X25vcm1hbGl6ZWQsIHJlc3VsdHM9J2FzaXMnfQprbml0cjo6a2FibGUodHJpcGxlc1tbIm5vcm1hbGl6ZWQiXV1bWyJpbnNlcnRfaW5kZXhlc19ieV9udCJdXSkKa25pdHI6OmthYmxlKHRyaXBsZXNfdGVubXByW1sibm9ybWFsaXplZCJdXVtbImluc2VydF9pbmRleGVzX2J5X250Il1dKQprbml0cjo6a2FibGUodHJpcGxlc19maXZlbXByW1sibm9ybWFsaXplZCJdXVtbImluc2VydF9pbmRleGVzX2J5X250Il1dKQprbml0cjo6a2FibGUocXVpbnRzW1sibm9ybWFsaXplZCJdXVtbImluc2VydF9pbmRleGVzX2J5X250Il1dKQprbml0cjo6a2FibGUocXVpbnRzX3Rlbm1wcltbIm5vcm1hbGl6ZWQiXV1bWyJpbnNlcnRfaW5kZXhlc19ieV9udCJdXSkKa25pdHI6OmthYmxlKHF1aW50c19maXZlbXByW1sibm9ybWFsaXplZCJdXVtbImluc2VydF9pbmRleGVzX2J5X250Il1dKQoKa25pdHI6OmthYmxlKHRyaXBsZXNbWyJub3JtYWxpemVkIl1dW1siaW5zZXJ0X3NlcXVlbmNlcl9ieV9udCJdXSkKa25pdHI6OmthYmxlKHRyaXBsZXNfdGVubXByW1sibm9ybWFsaXplZCJdXVtbImluc2VydF9zZXF1ZW5jZXJfYnlfbnQiXV0pCmtuaXRyOjprYWJsZSh0cmlwbGVzX2ZpdmVtcHJbWyJub3JtYWxpemVkIl1dW1siaW5zZXJ0X3NlcXVlbmNlcl9ieV9udCJdXSkKa25pdHI6OmthYmxlKHF1aW50c1tbIm5vcm1hbGl6ZWQiXV1bWyJpbnNlcnRfc2VxdWVuY2VyX2J5X250Il1dKQprbml0cjo6a2FibGUocXVpbnRzX3Rlbm1wcltbIm5vcm1hbGl6ZWQiXV1bWyJpbnNlcnRfc2VxdWVuY2VyX2J5X250Il1dKQprbml0cjo6a2FibGUocXVpbnRzX2ZpdmVtcHJbWyJub3JtYWxpemVkIl1dW1siaW5zZXJ0X3NlcXVlbmNlcl9ieV9udCJdXSkKYGBgCgojIyMjIFJld3JpdGluZyB0aGUgbWF0cmljZXMgYnkgZGl2aWRpbmcgYnkgYWxsIGluZGV4ZXMKCkkgdGhpbmsgdGhhdCB0aGVyZSBhcmUgZmV3IGVub3VnaCBpbnNlcnRpb24gZXZlbnRzIHRoYXQgdGhpcyBnZXRzIGEgYml0IG1lc3NlZAp1cC4gIEkgd2lsbCBkb3VibGUgY2hlY2sgdGhlIGxvZ2ljIG9mIHRoaXMsIGJ1dCB0aGF0IGlzIG15IGluaXRpYWwgZ3Vlc3MgZ2l2ZW4KaG93IGZldyBpbnNlcnRpb25zIEkgd2FzIHNlZWluZyB3aGVuIHJlYWRpbmcgdGhlIG91dHB1dHMgbWFudWFsbHkuClVuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMgdGhhdCBmb3IgdGhlc2UgSSBhbHNvIGNhbm5vdCBwcm92aWRlIGEgY3BtIG1lYXN1cmVtZW50LgoKYGBge3IgaW5zZXJ0X2luZGV4X25vcm1hbGl6ZWRfYnlfY291bnRzLCByZXN1bHRzPSdhc2lzJ30Ka25pdHI6OmthYmxlKHRyaXBsZXNbWyJtYXRyaWNlc19ieV9jb3VudHMiXV1bWyJpbnNlcnRfaW5kZXhlc19ieV9udCJdXSkKa25pdHI6OmthYmxlKHRyaXBsZXNfdGVubXByW1sibWF0cmljZXNfYnlfY291bnRzIl1dW1siaW5zZXJ0X2luZGV4ZXNfYnlfbnQiXV0pCmtuaXRyOjprYWJsZSh0cmlwbGVzX2ZpdmVtcHJbWyJtYXRyaWNlc19ieV9jb3VudHMiXV1bWyJpbnNlcnRfaW5kZXhlc19ieV9udCJdXSkKa25pdHI6OmthYmxlKHF1aW50c1tbIm1hdHJpY2VzX2J5X2NvdW50cyJdXVtbImluc2VydF9pbmRleGVzX2J5X250Il1dKQprbml0cjo6a2FibGUocXVpbnRzX3Rlbm1wcltbIm1hdHJpY2VzX2J5X2NvdW50cyJdXVtbImluc2VydF9pbmRleGVzX2J5X250Il1dKQprbml0cjo6a2FibGUocXVpbnRzX2ZpdmVtcHJbWyJtYXRyaWNlc19ieV9jb3VudHMiXV1bWyJpbnNlcnRfaW5kZXhlc19ieV9udCJdXSkKCmtuaXRyOjprYWJsZSh0cmlwbGVzW1sibWF0cmljZXNfYnlfY291bnRzIl1dW1siaW5zZXJ0X3NlcXVlbmNlcl9ieV9udCJdXSkKa25pdHI6OmthYmxlKHRyaXBsZXNfdGVubXByW1sibWF0cmljZXNfYnlfY291bnRzIl1dW1siaW5zZXJ0X3NlcXVlbmNlcl9ieV9udCJdXSkKa25pdHI6OmthYmxlKHRyaXBsZXNfZml2ZW1wcltbIm1hdHJpY2VzX2J5X2NvdW50cyJdXVtbImluc2VydF9zZXF1ZW5jZXJfYnlfbnQiXV0pCmtuaXRyOjprYWJsZShxdWludHNbWyJtYXRyaWNlc19ieV9jb3VudHMiXV1bWyJpbnNlcnRfc2VxdWVuY2VyX2J5X250Il1dKQprbml0cjo6a2FibGUocXVpbnRzX3Rlbm1wcltbIm1hdHJpY2VzX2J5X2NvdW50cyJdXVtbImluc2VydF9zZXF1ZW5jZXJfYnlfbnQiXV0pCmtuaXRyOjprYWJsZShxdWludHNfZml2ZW1wcltbIm1hdHJpY2VzX2J5X2NvdW50cyJdXVtbImluc2VydF9zZXF1ZW5jZXJfYnlfbnQiXV0pCmBgYAoKVGhlIGZvbGxvd2luZyBpcyBteSBwcmV2aW91cyB3cml0aW5nIG9mIHRoaXMgd29ya3NoZWV0IHdoaWNoIGp1c3QgZHVtcGVkIHRoZQp2YXJpb3VzIHRhYmxlcy4KCiMgUHJpbnQgcmF3IHRhYmxlcwoKYGBge3IgcmF3LCByZXN1bHRzPSdhc2lzJ30KZm9yICh0IGluIDE6bGVuZ3RoKHRyaXBsZXNbWyJtYXRyaWNlcyJdXSkpIHsKICB0YWJsZV9uYW1lIDwtIG5hbWVzKHRyaXBsZXNbWyJtYXRyaWNlcyJdXSlbdF0KICBtZXNzYWdlKCJSYXcgdGFibGU6ICIsIHRhYmxlX25hbWUsICIuIikKICBwcmludChrbml0cjo6a2FibGUodHJpcGxlc1tbIm1hdHJpY2VzIl1dW3RdKSkKfQpgYGAKCiMgUHJpbnQgcmF3IHBsb3RzCgpgYGB7ciByYXdfcGxvdHN9CmZvciAodCBpbiAxOmxlbmd0aCh0cmlwbGVzW1sicGxvdHMiXV1bWyJtYXRyaWNlcyJdXSkpIHsKICBtZXNzYWdlKCJSYXcgdGFibGU6ICIsIHRhYmxlX25hbWUsICIuIikKICBwcmludCh0cmlwbGVzW1sicGxvdHMiXV1bWyJtYXRyaWNlcyJdXVt0XSkKfQpgYGAKCiMgUHJpbnQgbm9ybWFsaXplZCB0YWJsZXMKCmBgYHtyIG5vcm0sIHJlc3VsdHM9J2FzaXMnfQpmb3IgKHQgaW4gMTpsZW5ndGgodHJpcGxlc1tbIm1hdHJpY2VzX2NvdW50cyJdXSkpIHsKICB0YWJsZV9uYW1lIDwtIG5hbWVzKHRyaXBsZXNbWyJtYXRyaWNlc19jb3VudHMiXV0pW3RdCiAgbWVzc2FnZSgiTm9ybWFsaXplZCB0YWJsZTogIiwgdGFibGVfbmFtZSwgIi4iKQogIHByaW50KGtuaXRyOjprYWJsZSh0cmlwbGVzW1sibWF0cmljZXNfY291bnRzIl1dW3RdKSkKfQpgYGAKCiMgUHJpbnQgbm9ybWFsaXplZCBwbG90cwoKYGBge3Igbm9ybV9wbG90c30KZm9yICh0IGluIDE6bGVuZ3RoKHRyaXBsZXNbWyJwbG90cyJdXVtbImNvdW50cyJdXSkpIHsKICBtZXNzYWdlKCJOb3JtYWxpemVkIHRhYmxlOiAiLCB0YWJsZV9uYW1lLCAiLiIpCiAgcHJpbnQodHJpcGxlc1tbInBsb3RzIl1dW1siY291bnRzIl1dW3RdKQp9CmBgYAoKYGBge3Igc2F2ZW1lfQpwYW5kZXI6OnBhbmRlcihzZXNzaW9uSW5mbygpKQptZXNzYWdlKHBhc3RlMCgiVGhpcyBpcyBocGdsdG9vbHMgY29tbWl0OiAiLCBnZXRfZ2l0X2NvbW1pdCgpKSkKdGhpc19zYXZlIDwtIHBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cm1kX2ZpbGUpLCAiLXYiLCB2ZXIsICIucmRhLnh6IikKbWVzc2FnZShwYXN0ZTAoIlNhdmluZyB0byAiLCB0aGlzX3NhdmUpKQp0bXAgPC0gc20oc2F2ZW1lKGZpbGVuYW1lPXRoaXNfc2F2ZSkpCmBgYAoKCmBgYHtyIGxvYWRtZSwgZXZhbD1GQUxTRX0KbG9hZG1lKGZpbGVuYW1lPXRoaXNfc2F2ZSkKYGBgCg==