1 Preprocessing some S. cerevisiae samples.

2 Preprocessing by sample

The preprocessing of this data happened in two parts and was performed via the cyoa script, which attempts to simplify the creation of jobs on our computer cluster.

I split the preprocessing tasks into two parts, the first part consists of the initial sequencing quality assurance and adapter trimming.

2.1 Part 1

The following is contained in a shell script in preprocessing/ called process_part1.sh

#!/usr/bin/env bash
start=$(pwd)
for i in $(/bin/ls -d hpgl*); do
  cd ${i}
  echo "Starting ${i}"
  cyoa --task rnaseq --method trimom --input ${i}_forward.fastq.gz
  cyoa --task rnaseq --method fastq --input ${i}_forward.fastq.gz
  echo "Finishing ${i}"
  cd ${start}
done

2.2 Part 2

Once the sequence adapters were removed, I perform the set of tasks which depend on the trimmed data. It is worth noting that I tried a few (pseudo)aligners: bowtie2, tophat, and kallisto.

#!/usr/bin/env bash
start=$(pwd)
for i in $(/bin/ls -d hpgl084[0-2]); do
  cd "${i}" || exit
  echo "Starting ${i}"
  cyoa --task rnaseq --method biopiece --input "${i}_forward-trimmed.fastq.gz"
  cyoa --task rnaseq --method kallisto --input "${i}_forward-trimmed.fastq.gz" --species scerevisiae
  cyoa --task rnaseq --method tophat --input "${i}_forward-trimmed.fastq.gz" --species scerevisiae
  cyoa --task rnaseq --method bt2 --input "${i}_forward-trimmed.fastq.gz" --species scerevisiae
  echo "Finishing ${i}"
  cd "${start}" || exit
done

3 What happened in each step?

The cyoa script in turn creates and executes jobs on our torque cluster, I am copy/pasting them below:

Two caveats:

  1. There is a common header and footer for all of these scripts. I will include it for this script, but skip it for the following:
  2. I am going to print here a copy of my script for each step for the first sample and leave as an exercise for the reader the rest.

3.1 Fastqc

The first step in most(all) of our data sets is to make sure that the sequencer provided high-quality data at the expected length(s).

There is only one interesting point in this script, the –extract argument was provided so that a dependent job may be run in order to extract some statistics from the fastqc results.

The following is preprocessing/hpgl0564/scripts/00fqc-hpgl0564.sh

#!/usr/bin/env bash
#PBS -V -S /usr/bin/bash -q workstation
#PBS -d /cbcb/nelsayed-scratch/atb/rnaseq/scerevisiae_cbf5v1/preprocessing/hpgl0564
#PBS -N fqc-hpgl0564 -l mem=6gb -l walltime=10:00:00 -l ncpus=8
#PBS -o /cbcb/nelsayed-scratch/atb/rnaseq/scerevisiae_cbf5v1/preprocessing/hpgl0564/outputs/qsub/fqc-hpgl0564.qsubout -j oe -V -m n
echo "####Started /cbcb/nelsayed-scratch/atb/rnaseq/scerevisiae_cbf5v1/preprocessing/hpgl0564/scripts/00fqc-hpgl0564.sh at $(date)" >> outputs/log.txt
cd /cbcb/nelsayed-scratch/atb/rnaseq/scerevisiae_cbf5v1/preprocessing/hpgl0564 || exit

## This FastQC run is against rnaseq data and is used for
## an initial estimation of the overall sequencing quality.
mkdir -p outputs/fastqc && \
  fastqc --extract -o outputs/fastqc hpgl0564_forward.fastq.gz \
  2>outputs/fastqc.out 1>&2

## The following lines give status codes and some logging
echo $? > outputs/status/fqc-hpgl0564.status
echo "###Finished ${PBS_JOBID} 00fqc-hpgl0564.sh at $(date), it took $(( SECONDS / 60 )) minutes." >> outputs/log.txt

walltime=$(qstat -f -t "${PBS_JOBID}" | grep 'resources_used.walltime' | awk -F ' = ' '{print $2}')
echo "####PBS walltime used by ${PBS_JOBID} was: ${walltime:-null}" >> outputs/log.txt
mem=$(qstat -f -t | grep "${PBS_JOBID}" | grep 'resources_used.mem' | awk -F ' = ' '{print $2}')
echo "####PBS memory used by ${PBS_JOBID} was: ${mem:-null}" >> outputs/log.txt
vmmemory=$(qstat -f -t "${PBS_JOBID}" | grep 'resources_used.vmem' | awk -F ' = ' '{print $2}')
echo "####PBS vmemory used by ${PBS_JOBID} was: ${vmmemory:-null}" >> outputs/log.txt
cputime=$(qstat -f -t "${PBS_JOBID}" | grep 'resources_used.cput' | awk -F ' = ' '{print $2}')
echo "####PBS cputime used by ${PBS_JOBID} was: ${cputime:-null}" >> outputs/log.txt
##qstat -f -t ${PBS_JOBID} >> outputs/log.txt

3.1.1 Fastqc statistics

The fastqc statistics are generated separately for the forward/reverse reads.

The following is preprocessing/hpgl0480/scripts/01fqcst_forward-hpgl0564.sh

## This is a stupidly simple job to collect alignment statistics.

if [ ! -r outputs/fastqc_forward_stats.csv ]; then
  echo "name,total_reads,poor_quality,per_quality,per_base_content,per_sequence_gc,per_base_n,per_seq_length,over_rep,adapter_content,kmer_content" > outputs/fastqc_forward_stats.csv
fi
total_reads_tmp=$(grep "^Total Sequences" outputs/fastqc/hpgl0564_forward.gz_fastqc/fastqc_data.txt | awk -F '\\t' '{print $2}')
total_reads=${total_reads_tmp:-0}
poor_quality_tmp=$(grep "^Sequences flagged as poor quality" outputs/fastqc/hpgl0564_forward.gz_fastqc/fastqc_data.txt | awk -F '\\t' '{print $2}')
poor_quality=${poor_quality_tmp:-0}
per_quality_tmp=$(grep "Per base sequence quality" outputs/fastqc/hpgl0564_forward.gz_fastqc/fastqc_data.txt | awk -F '\\t' '{print $2}')
per_quality=${per_quality_tmp:-0}
per_base_content_tmp=$(grep "Per base sequence content" outputs/fastqc/hpgl0564_forward.gz_fastqc/fastqc_data.txt | awk -F '\\t' '{print $2}')
per_base_content=${per_base_content_tmp:-0}
per_sequence_gc_tmp=$(grep "Per sequence GC content" outputs/fastqc/hpgl0564_forward.gz_fastqc/fastqc_data.txt | awk -F '\\t' '{print $2}')
per_sequence_gc=${per_sequence_gc_tmp:-0}
per_base_n_tmp=$(grep "Per base N content" outputs/fastqc/hpgl0564_forward.gz_fastqc/fastqc_data.txt | awk -F '\\t' '{print $2}')
per_base_n=${per_base_n_tmp:-0}
per_seq_length_tmp=$(grep "Sequence Length Distribution" outputs/fastqc/hpgl0564_forward.gz_fastqc/fastqc_data.txt | awk -F '\\t' '{print $2}')
per_seq_length=${per_seq_length_tmp:-0}
over_rep_tmp=$(grep "Overrepresented sequences" outputs/fastqc/hpgl0564_forward.gz_fastqc/fastqc_data.txt | awk -F '\\t' '{print $2}')
over_rep=${over_rep_tmp:-0}
adapter_content_tmp=$(grep "Adapter Content" outputs/fastqc/hpgl0564_forward.gz_fastqc/fastqc_data.txt | awk -F '\\t' '{print $2}')
adapter_content=${adapter_content_tmp:-0}
kmer_content_tmp=$(grep "Kmer Content" outputs/fastqc/hpgl0564_forward.gz_fastqc/fastqc_data.txt | awk -F '\\t' '{print $2}')
kmer_content=${kmer_content_tmp:-0}

stat_string=$(printf "hpgl0564,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s" "${total_reads}" "${poor_quality}" "${per_quality}" "${per_base_content}" "${per_sequence_gc}" "${per_base_n}" "${per_seq_length}" "${over_rep}" "${adapter_content}" "${kmer_content}")
echo "$stat_string" >> outputs/fastqc_forward_stats.csv

3.2 Trimomatic

Trimomatic is perhaps the most important step in the process, as it removes the sometimes very abundant sequencing adapters, which if forgotten, would destroy all the following steps.

The following is preprocessing/hpgl0564/scripts/05trim-hpgl0564.sh

This job has a little bit of logic in it in case trimomatic fails.

## This call to trimomatic removes illumina and epicentre adapters from hpgl0564_forward.fastq.gz.
## It also performs a sliding window removal of anything with quality <25;
## cutadapt provides an alternative to this tool.
## The original sequence data is recompressed and saved in the sequences/ directory.

## Trimomatic_Pairwise: In case a trimming needs to be redone...
if [[ ! -r "hpgl0564_forward.fastq.gz" ]]; then
  if [[ -r "sequences/hpgl0564_forward.fastq.xz" ]]; then
    mv sequences/hpgl0564_forward.fastq.xz . && pxz -d hpgl0564_forward.fastq.xz && pigz hpgl0564_forward.fastq
  else
    echo "Missing files. Did not find hpgl0564_forward.fastq.gz nor sequences/hpgl0564_forward.fastq.xz"
    exit 1
  fi
fi
## Note that trimomatic prints all output and errors to STDERR, so send both to output
trimomatic PE -threads 1 -phred33 hpgl0564_forward.fastq.gz hpgl0564_forward-trimmed_paired.fastq.gz hpgl0564_forward-trimmed_unpaired.fastq.gz \
    ILLUMINACLIP:/cbcbhomes/abelew/libraries/adapters.fa:2:20:4 SLIDINGWINDOW:4:25 \
    1>outputs/hpgl0564-trimomatic.out 2>&1
excepted=$(grep "Exception" outputs/hpgl0564-trimomatic.out)
## The following is in case the illumina clipping fails, which it does if this has already been run I think.
if [[ "${excepted}" != "" ]]; then
  trimomatic PE -threads 1 -phred33 hpgl0564_forward.fastq.gz hpgl0564_forward-trimmed_paired.fastq.gz hpgl0564_forward-trimmed_unpaired.fastq.gz SLIDINGWINDOW:4:25 \
    1>outputs/hpgl0564-trimomatic.out 2>&1
fi
sleep 10
mv hpgl0564_forward-trimmed_paired.fastq.gz hpgl0564_forward-trimmed.fastq.gz

3.2.1 Trimomatic statistics

In the same way, the text output of trimomatic is parsed to generate some statistics.

The following is preprocessing/hpgl0564/scripts/06trimst-hpgl0564.sh

## This is a stupidly simple job to collect trimomatic statistics

if [ ! -r outputs/trimomatic_stats.csv ]; then
  echo "total_reads,surviving_both,surviving_forward,surviving_reverse,dropped_reads" > outputs/trimomatic_stats.csv
fi
total_reads_tmp=$(grep "^Input Read Pairs" outputs/hpgl0564-trimomatic.out | awk '{print $4}')
total_reads=${total_reads_tmp:-0}
surviving_both_tmp=$(grep "^Input Read Pairs" outputs/hpgl0564-trimomatic.out | awk '{print $7}')
surviving_both=${surviving_both_tmp:-0}
surviving_forward_tmp=$(grep "^Input Read Pairs" outputs/hpgl0564-trimomatic.out | awk '{print $12}')
surviving_forward=${surviving_forward_tmp:-0}
surviving_reverse_tmp=$(grep "^Input Read Pairs" outputs/hpgl0564-trimomatic.out | awk '{print $17}')
surviving_reverse=${surviving_reverse_tmp:-0}
dropped_reads_tmp=$(grep "^Input Read Pairs" outputs/hpgl0564-trimomatic.out | awk '{print $20}')
dropped_reads=${dropped_reads_tmp:-0}

stat_string=$(printf "hpgl0564,%s,%s,%s,%s,%s" "${total_reads}" "${surviving_both}" "${surviving_forward}" "${surviving_reverse}" "${dropped_reads}")
echo "$stat_string" >> outputs/trimomatic_stats.csv

3.3 Biopieces

Biopieces is an interesting project to provide a suite of simple tools which may be connected to perform interesting tasks. I use it to plot some graphs of the sequencing quality/attributes.

The following is preprocessing/hpgl0564/scripts/02biop-hpgl0564trimmed.sh

## This script uses biopieces to draw some simple graphs of the sequence.

## Do not forget that _only_ the last command in a biopieces string is allowed to have the -x.
mkdir -p outputs/biopieces
less hpgl0564_forward-trimmed.fastq | read_fastq -i - -e base_33 |\
 plot_scores -T 'Quality Scores' -t svg -o outputs/biopieces/hpgl0564_forward-trimmed_quality_scores.svg |\
 plot_nucleotide_distribution -T 'NT. Distribution' -t svg -o outputs/biopieces/hpgl0564_forward-trimmed_ntdist.svg |\
 plot_lendist -T 'Length Distribution' -k SEQ_LEN -t svg -o outputs/biopieces/hpgl0564_forward-trimmed_lendist.svg |\
 analyze_gc |\
     bin_vals -b 20 -k 'GC%' |\
     plot_distribution -k 'GC%_BIN' -t svg -o outputs/biopieces/hpgl0564_forward-trimmed_gcdist.svg |\
 analyze_gc |\
     mean_vals -k 'GC%' -o outputs/biopieces/hpgl0564_forward-trimmed_gc.txt |\
 count_records -o outputs/biopieces/hpgl0564_forward-trimmed_count.txt -x

3.4 Kallisto Yeast

Kallisto is a super-fast aligner for estimating relative transcript abundance. I increasingly think it is better than tophat.

I added a little logic to simplify its output to provide a count table-like file.

The following is preprocessing/hpgl0564/scripts/30kall_scerevisiae-hpgl0564trimmed.sh

## This is a kallisto pseudoalignment of hpgl0564_forward-trimmed.fastq.gz against
## /cbcbhomes/abelew/libraries/genome/indexes/scerevisiae.idx.
## This jobs depended on:
## Other candidates for making a pretty count table include:
##  perl -F'\t' -a -n -e 'print "$F[0] $F[3]\n"' outputs/kallisto_scerevisiae/abundance.tsv > outputs/kallisto_scerevisiae/abundance.count
##   awk '{printf("%s %s\n", $1, $4)}' outputs/kallisto_scerevisiae/abundance.tsv > outputs/kallisto_scerevisiae/abundance.count
## because kallisto is so fast

mkdir -p outputs/kallisto_scerevisiae && sleep 10 && \
  kallisto quant  --plaintext -b 100 -o outputs/kallisto_scerevisiae -i /cbcbhomes/abelew/libraries/genome/indexes/scerevisiae.idx \
    hpgl0564_forward-trimmed.fastq.gz 2>outputs/kallisto_scerevisiae/kallisto_scerevisiae.stderr 1>outputs/kallisto_scerevisiae/kallisto_scerevisiae.txt && \
  cut -d "  " -f 1,4 outputs/kallisto_scerevisiae/abundance.tsv > outputs/kallisto_scerevisiae/abundance.count && \
  gzip outputs/kallisto_scerevisiae/abundance.count && xz -9e *.tsv

I currently do not have a job to create kallisto statistics, which is dumb, fix that.

3.5 Tophat Yeast

There is a little bit of interesting logic in this:

  1. I make sure to sort the accepted_hits.bam because it is annoying to not be able to look at these in IGV.
  2. I take an extra step to extract the perfectly paired aligned reads (The samtools view -b -f 2 line). In the best case scenario, this removes nothing.

The following is preprocessing/hpgl0564/scripts/31th_scerevisiae-hpgl0564trimmed.sh

## I still have no clue what I am doing when I use tophat...
## However, I know that -g 1 will allow only 1 hit in the case of multihits, but randomly place it
## From the manual:  "If there are more alignments with the same score than this
## number, TopHat will randomly report only this many alignments"
## -N 1 will discard anything with >1 mismatch (default is 2)
## -r adjusts the allowable mean distance between the paired reads
## --mate-std-dev sets the deviation of -r
## --microexon-search will tell it to search short exons for reads >=50

mkdir -p outputs/tophat_scerevisiae && tophat  -g 1 --b2-very-sensitive  \
  -G /cbcbhomes/abelew/libraries/genome/scerevisiae.gtf \
  -p 4 -o outputs/tophat_scerevisiae \
  /cbcbhomes/abelew/libraries/genome/indexes/scerevisiae \
  hpgl0564_forward-trimmed.fastq.gz 2>outputs/tophat.out 1>&2 && \
 samtools sort -l 9 -n outputs/tophat_scerevisiae/accepted_hits.bam outputs/tophat_scerevisiae/accepted_sorted && \
 mv outputs/tophat_scerevisiae/accepted_sorted.bam outputs/tophat_scerevisiae/accepted_hits.bam && \
 samtools index outputs/tophat_scerevisiae/accepted_hits.bam && \
 samtools sort -l 9 -n outputs/tophat_scerevisiae/unmapped.bam outputs/tophat_scerevisiae/unmapped_sorted && \
 mv outputs/tophat_scerevisiae/unmapped_sorted.bam outputs/tophat_scerevisiae/unmapped.bam && \
 samtools index outputs/tophat_scerevisiae/unmapped.bam

if [ -r "outputs/tophat_scerevisiae/accepted_hits.bam" ]; then
  samtools view -b -f 2 outputs/tophat_scerevisiae/accepted_hits.bam > outputs/tophat_scerevisiae/accepted_paired.bam && \
    samtools index outputs/tophat_scerevisiae/accepted_paired.bam
fi

3.5.1 Tophat statistics

I generate a similar csv file for the tophat alignments:

The following is preprocessing/hpgl0564/scripts/33tpstats_scerevisiae-hpgl0564trimmed.sh

## This is a stupidly simple job to collect tophat alignment statistics.

if [ ! -r outputs/tophat_stats.csv ]; then
  echo "basename,species,original_reads,aligned_reads,failed_reads,rpm,count_table" > outputs/tophat_stats.csv
fi
bamtools stats < outputs/tophat_scerevisiae/accepted_hits.bam 2>outputs/tophat_scerevisiae/accepted_hits.bam.stats 1>&2 && bamtools stats < outputs/tophat_scerevisiae/unmapped.bam 2>outputs/tophat_scerevisiae/unmapped.bam.stats 1>&2
original_reads_tmp=$(grep "^Input Reads" outputs/hpgl0564-trimmed-trimomatic.out | awk '{print $3}' | sed 's/ //g')
original_reads=${original_reads_tmp:-0}
reads_tmp=$(grep "^reads_in " outputs/tophat_scerevisiae/prep_reads.info | awk -F= '{print $2}' | sed 's/ //g')
reads=${reads_tmp:-0}
aligned_tmp=$(grep "^Total reads" outputs/tophat_scerevisiae/accepted_hits.bam.stats | awk '{print $3}' | sed 's/ .*//g')
aligned=${aligned_tmp:-0}
failed_tmp=$(grep "^Total reads" outputs/tophat_scerevisiae/unmapped.bam.stats | awk '{print $3}' | sed 's/ .*//g')
failed=${failed_tmp:-0}
rpm_tmp=$(perl -e "printf(1000000 / ${aligned})" 2>/dev/null)
rpm=${rpm_tmp:-0}
stat_string=$(printf "hpgl0564-trimmed,scerevisiae,%s,%s,%s,%s,%s,accepted_hits.count.xz" "${original_reads}" "${reads}" "${aligned}" "${failed}" "$rpm")
echo "$stat_string" >> outputs/tophat_stats.csv

3.5.2 HTSeq for tophat in S.cerevisiae

I usually use htseq’s default parameters against the perfectly paired reads when making count tables from tophat mappings. Sometimes this is a bad idea, but in yeast I think it is ok.

It is worth noting that when possible (as it is for the mouse genome), I do separate countings for the following feature types: 3’ UTRs, 5’ UTRs, exons, rRNA, snRNA, snoRNA, pseudogenes, lincRNA, miRNA, NMD targets, introns, antisense transcripts, retained introns, exons, genes, and all.

But for yeast I just do the set of all annotations, as in most cases that is all we care about.

The following is preprocessing/hpgl0564/scripts/32htall_scerevisiae-hpgl0564trimmed.sh

## Counting the number of hits in outputs/tophat_scerevisiae/accepted_paired.bam for each feature found in /cbcbhomes/abelew/libraries/genome/scerevisiae_all.gtf
## Is this stranded? yes.  The defaults of htseq are:
##  --order=name --idattr=gene_id --minaqual=10 --type=exon --stranded=yes --mode=union

htseq-count -q -f bam -s yes -i ID  -t exon \
  outputs/tophat_scerevisiae/accepted_paired.bam /cbcbhomes/abelew/libraries/genome/scerevisiae_all.gtf \
  1>outputs/htseq/accepted_paired_all.count 2>outputs/tophat_scerevisiae/accepted_paired_htseq.err && \
    xz -f -9e outputs/htseq/accepted_paired_all.count

3.6 Bowtie2

I did a little reading and found the following about how bowtie2 scores multi-hit reads:

Taken from: http://biofinysics.blogspot.com/2014/05/how-does-bowtie2-assign-mapq-scores.html#bt2expt

“In bowtie2, the best a true multiread (AS=XS) can get is MAPQ=1 regardless of how low or high its multiplicity. This occurs when there are 0 or 1 mismatches over perfect base calls in the read, or when AS=XS goes down to -6. When there are 2-5 mismatches over perfect base calls (or the AS=XS <= -12 —- i.e. -12 to -30.6), the MAPQ becomes 0.

If someone wanted to exclude “true multireads” from their data set, using MAPQ >= 2 would work. This would also exclude any uniquely mapping reads with >=4 mismatches over high quality bases. In terms of high quality bases and unireads, MAPQ >= 3 allows up to 3 mismatches, MAPQ >= 23 allows up to 2 mismatches, MAPQ >= 40 allows up to 1 mismatch, and MAPQ >= 42 allows 0 mismatches. There will also be other “maxireads” in most or all of these sets."

This is relevant because of the following gem in the newest version of the htseq-count documentation:

http://www-huber.embl.de/HTSeq/doc/count.html

“skip all reads with alignment quality lower than the given minimum value (default: 10 — Note: the default used to be 0 until version 0.5.4.)”

With that in mind, take a look at the bowtie2 script, The following is preprocessing/scripts/hpgl0564/15bt2_scerevisiae-hpgl0564trimmed.sh

## This is a bowtie2 alignment of hpgl0564_forward-trimmed.fastq against
## /cbcbhomes/abelew/libraries/genome/indexes/scerevisiae using arguments:  --very-sensitive .
## This jobs depended on: 1319885.cbcbsrv.umiacs.umd.edu

mkdir -p outputs/bowtie2_scerevisiae && sleep 10 && bowtie2 -x /cbcbhomes/abelew/libraries/genome/indexes/scerevisiae  --very-sensitive  \
  -p 1 \
  -q   hpgl0564_forward-trimmed.fastq  \
  --un outputs/bowtie2_scerevisiae/hpgl0564-trimmed_unaligned_scerevisiae.fastq \
  --al outputs/bowtie2_scerevisiae/hpgl0564-trimmed_aligned_scerevisiae.fastq \
  -S outputs/bowtie2_scerevisiae/hpgl0564-trimmed.sam \
  2>outputs/bowtie2_scerevisiae/hpgl0564-trimmed.err \
  1>outputs/bowtie2_scerevisiae/hpgl0564-trimmed.out

3.6.1 Converting to an indexed sorted bam alignment

I hate sam files, so I immediately convert them before counting:

Just like with tophat, I have an extra step to extract the properly paired aligned reads.

The following is preprocessing/scripts/hpgl0564/19s2b_bt2_scerevisiae-hpgl0564trimmed.shell

## Converting the text sam to a compressed, sorted, indexed bamfile.
## Also printing alignment statistics to outputs/bowtie2_scerevisiae/hpgl0564-trimmed.bam.stats
## This job depended on: 1323883.cbcbsrv.umiacs.umd.edu
samtools view -u -t /cbcbhomes/abelew/libraries/genome/scerevisiae.fasta \
  -S outputs/bowtie2_scerevisiae/hpgl0564-trimmed.sam -o outputs/bowtie2_scerevisiae/hpgl0564-trimmed.bam 1>outputs/bowtie2_scerevisiae/hpgl0564-trimmed.bam.out 2>&1
samtools sort -l 9 outputs/bowtie2_scerevisiae/hpgl0564-trimmed.bam -o outputs/bowtie2_scerevisiae/hpgl0564-trimmed-sorted.bam 2>outputs/bowtie2_scerevisiae/hpgl0564-trimmed-sorted.bam.out 1>&2 && \
  rm outputs/bowtie2_scerevisiae/hpgl0564-trimmed.bam && \
  rm outputs/bowtie2_scerevisiae/hpgl0564-trimmed.sam && \
  mv outputs/bowtie2_scerevisiae/hpgl0564-trimmed-sorted.bam outputs/bowtie2_scerevisiae/hpgl0564-trimmed.bam && \
  samtools index outputs/bowtie2_scerevisiae/hpgl0564-trimmed.bam && \
  samtools view -b -f 2 -o outputs/bowtie2_scerevisiae/hpgl0564-trimmed.bam_paired.bam outputs/bowtie2_scerevisiae/hpgl0564-trimmed.bam && \
  samtools index outputs/bowtie2_scerevisiae/hpgl0564-trimmed.bam_paired.bam
bamtools stats -in outputs/bowtie2_scerevisiae/hpgl0564-trimmed.bam 2>outputs/bowtie2_scerevisiae/hpgl0564-trimmed.bam.stats 1>&2 && \
  bamtools stats -in outputs/bowtie2_scerevisiae/hpgl0564-trimmed.bam_paired.bam 2>outputs/bowtie2_scerevisiae/hpgl0564-trimmed.bam_paired.bam.stats 1>&2

3.6.2 Counting the bowtie2 results

## Counting the number of hits in outputs/bowtie2_scerevisiae/hpgl0564-trimmed.bam for each feature found in /cbcbhomes/abelew/libraries/genome/scerevisiae.gff
## Is this stranded? yes.  The defaults of htseq are:
##  --order=name --idattr=gene_id --minaqual=10 --type=exon --stranded=yes --mode=union

htseq-count -q -f bam -s yes  -i ID  -t exon \
  outputs/bowtie2_scerevisiae/hpgl0564-trimmed.bam /cbcbhomes/abelew/libraries/genome/scerevisiae.gff \
  1>outputs/bowtie2_scerevisiae/hpgl0564-trimmed.count 2>outputs/bowtie2_scerevisiae/hpgl0564-trimmed_htseq.err && \
    xz -f -9e outputs/bowtie2_scerevisiae/hpgl0564-trimmed.count
LS0tCnRpdGxlOiAiUy5jZXJldmlzaWFlIDIwMTY6IFByZXByb2Nlc3NpbmcgUk5Bc2VxIHNhbXBsZXMuIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiBodG1sX2RvY3VtZW50OgogIGNvZGVfZG93bmxvYWQ6IHRydWUKICBjb2RlX2ZvbGRpbmc6IHNob3cKICBmaWdfY2FwdGlvbjogdHJ1ZQogIGZpZ19oZWlnaHQ6IDcKICBmaWdfd2lkdGg6IDcKICBoaWdobGlnaHQ6IGRlZmF1bHQKICBrZWVwX21kOiBmYWxzZQogIG1vZGU6IHNlbGZjb250YWluZWQKICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQogIHRoZW1lOiByZWFkYWJsZQogIHRvYzogdHJ1ZQogIHRvY19mbG9hdDoKICAgIGNvbGxhcHNlZDogZmFsc2UKICAgIHNtb290aF9zY3JvbGw6IGZhbHNlCi0tLQoKPHN0eWxlPgogIGJvZHkgLm1haW4tY29udGFpbmVyIHsKICAgIG1heC13aWR0aDogMTYwMHB4Owp9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KCJocGdsdG9vbHMiKQp0dCA8LSBkZXZ0b29sczo6bG9hZF9hbGwoIn4vaHBnbHRvb2xzIikKa25pdHI6Om9wdHNfa25pdCRzZXQoCiAgICBwcm9ncmVzcyA9IFRSVUUsCiAgICB2ZXJib3NlID0gVFJVRSwKICAgIHdpZHRoID0gOTAsCiAgICBlY2hvID0gVFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KAogICAgZXJyb3IgPSBUUlVFLAogICAgZmlnLndpZHRoID0gOCwKICAgIGZpZy5oZWlnaHQgPSA4LAogICAgZHBpID0gOTYpCm9wdGlvbnMoCiAgICBkaWdpdHMgPSA0LAogICAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFLAogICAga25pdHIuZHVwbGljYXRlLmxhYmVsID0gImFsbG93IikKZ2dwbG90Mjo6dGhlbWVfc2V0KGdncGxvdDI6OnRoZW1lX2J3KGJhc2Vfc2l6ZT0xMCkpCnNldC5zZWVkKDEpCnZlciA8LSAiMjAxNzA1MTUiCnByZXZpb3VzX2ZpbGUgPC0gImluZGV4LlJtZCIKCnRtcCA8LSBzbSh0cnkobG9hZG1lKGZpbGVuYW1lPXBhc3RlMChnc3ViKHBhdHRlcm49IlxcLlJtZCIsIHJlcGxhY2U9IiIsIHg9cHJldmlvdXNfZmlsZSksICItdiIsIHZlciwgIi5yZGEueHoiKSkpKQpybWRfZmlsZSA8LSAicHJlcHJvY2Vzc2luZy5SbWQiCmBgYAoKUHJlcHJvY2Vzc2luZyBzb21lIFMuIGNlcmV2aXNpYWUgc2FtcGxlcy4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiMgUHJlcHJvY2Vzc2luZyBieSBzYW1wbGUKClRoZSBwcmVwcm9jZXNzaW5nIG9mIHRoaXMgZGF0YSBoYXBwZW5lZCBpbiB0d28gcGFydHMgYW5kIHdhcyBwZXJmb3JtZWQgdmlhIHRoZQpjeW9hIHNjcmlwdCwgd2hpY2ggYXR0ZW1wdHMgdG8gc2ltcGxpZnkgdGhlIGNyZWF0aW9uIG9mIGpvYnMgb24gb3VyIGNvbXB1dGVyCmNsdXN0ZXIuCgpJIHNwbGl0IHRoZSBwcmVwcm9jZXNzaW5nIHRhc2tzIGludG8gdHdvIHBhcnRzLCB0aGUgZmlyc3QgcGFydCBjb25zaXN0cyBvZiB0aGUKaW5pdGlhbCBzZXF1ZW5jaW5nIHF1YWxpdHkgYXNzdXJhbmNlIGFuZCBhZGFwdGVyIHRyaW1taW5nLgoKIyMgUGFydCAxCgpUaGUgZm9sbG93aW5nIGlzIGNvbnRhaW5lZCBpbiBhIHNoZWxsIHNjcmlwdCBpbiBwcmVwcm9jZXNzaW5nLyBjYWxsZWQgcHJvY2Vzc19wYXJ0MS5zaAoKYGBge3IgcGFydDEsIGVuZ2luZT0nYmFzaCcsIGV2YWw9RkFMU0V9CiMhL3Vzci9iaW4vZW52IGJhc2gKc3RhcnQ9JChwd2QpCmZvciBpIGluICQoL2Jpbi9scyAtZCBocGdsKik7IGRvCiAgY2QgJHtpfQogIGVjaG8gIlN0YXJ0aW5nICR7aX0iCiAgY3lvYSAtLXRhc2sgcm5hc2VxIC0tbWV0aG9kIHRyaW1vbSAtLWlucHV0ICR7aX1fZm9yd2FyZC5mYXN0cS5negogIGN5b2EgLS10YXNrIHJuYXNlcSAtLW1ldGhvZCBmYXN0cSAtLWlucHV0ICR7aX1fZm9yd2FyZC5mYXN0cS5negogIGVjaG8gIkZpbmlzaGluZyAke2l9IgogIGNkICR7c3RhcnR9CmRvbmUKYGBgCgojIyBQYXJ0IDIKCk9uY2UgdGhlIHNlcXVlbmNlIGFkYXB0ZXJzIHdlcmUgcmVtb3ZlZCwgSSBwZXJmb3JtIHRoZSBzZXQgb2YgdGFza3Mgd2hpY2ggZGVwZW5kCm9uIHRoZSB0cmltbWVkIGRhdGEuICBJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCBJIHRyaWVkIGEgZmV3IChwc2V1ZG8pYWxpZ25lcnM6CmJvd3RpZTIsIHRvcGhhdCwgYW5kIGthbGxpc3RvLgoKYGBge3IgcGFydDIsIGVuZ2luZT0nYmFzaCcsIGV2YWw9RkFMU0V9CiMhL3Vzci9iaW4vZW52IGJhc2gKc3RhcnQ9JChwd2QpCmZvciBpIGluICQoL2Jpbi9scyAtZCBocGdsMDg0WzAtMl0pOyBkbwogIGNkICIke2l9IiB8fCBleGl0CiAgZWNobyAiU3RhcnRpbmcgJHtpfSIKICBjeW9hIC0tdGFzayBybmFzZXEgLS1tZXRob2QgYmlvcGllY2UgLS1pbnB1dCAiJHtpfV9mb3J3YXJkLXRyaW1tZWQuZmFzdHEuZ3oiCiAgY3lvYSAtLXRhc2sgcm5hc2VxIC0tbWV0aG9kIGthbGxpc3RvIC0taW5wdXQgIiR7aX1fZm9yd2FyZC10cmltbWVkLmZhc3RxLmd6IiAtLXNwZWNpZXMgc2NlcmV2aXNpYWUKICBjeW9hIC0tdGFzayBybmFzZXEgLS1tZXRob2QgdG9waGF0IC0taW5wdXQgIiR7aX1fZm9yd2FyZC10cmltbWVkLmZhc3RxLmd6IiAtLXNwZWNpZXMgc2NlcmV2aXNpYWUKICBjeW9hIC0tdGFzayBybmFzZXEgLS1tZXRob2QgYnQyIC0taW5wdXQgIiR7aX1fZm9yd2FyZC10cmltbWVkLmZhc3RxLmd6IiAtLXNwZWNpZXMgc2NlcmV2aXNpYWUKICBlY2hvICJGaW5pc2hpbmcgJHtpfSIKICBjZCAiJHtzdGFydH0iIHx8IGV4aXQKZG9uZQpgYGAKCiMgV2hhdCBoYXBwZW5lZCBpbiBlYWNoIHN0ZXA/CgpUaGUgY3lvYSBzY3JpcHQgaW4gdHVybiBjcmVhdGVzIGFuZCBleGVjdXRlcyBqb2JzIG9uIG91ciB0b3JxdWUgY2x1c3RlciwgSSBhbQpjb3B5L3Bhc3RpbmcgdGhlbSBiZWxvdzoKClR3byBjYXZlYXRzOgoKMS4gIFRoZXJlIGlzIGEgY29tbW9uIGhlYWRlciBhbmQgZm9vdGVyIGZvciBhbGwgb2YgdGhlc2Ugc2NyaXB0cy4gIEkgd2lsbAogICAgaW5jbHVkZSBpdCBmb3IgdGhpcyBzY3JpcHQsIGJ1dCBza2lwIGl0IGZvciB0aGUgZm9sbG93aW5nOgoyLiAgSSBhbSBnb2luZyB0byBwcmludCBoZXJlIGEgY29weSBvZiBteSBzY3JpcHQgZm9yIGVhY2ggc3RlcCBmb3IgdGhlIGZpcnN0CiAgICBzYW1wbGUgYW5kIGxlYXZlIGFzIGFuIGV4ZXJjaXNlIGZvciB0aGUgcmVhZGVyIHRoZSByZXN0LgoKIyMgRmFzdHFjCgpUaGUgZmlyc3Qgc3RlcCBpbiBtb3N0KGFsbCkgb2Ygb3VyIGRhdGEgc2V0cyBpcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc2VxdWVuY2VyCnByb3ZpZGVkIGhpZ2gtcXVhbGl0eSBkYXRhIGF0IHRoZSBleHBlY3RlZCBsZW5ndGgocykuCgpUaGVyZSBpcyBvbmx5IG9uZSBpbnRlcmVzdGluZyBwb2ludCBpbiB0aGlzIHNjcmlwdCwgdGhlIC0tZXh0cmFjdCBhcmd1bWVudCB3YXMKcHJvdmlkZWQgc28gdGhhdCBhIGRlcGVuZGVudCBqb2IgbWF5IGJlIHJ1biBpbiBvcmRlciB0byBleHRyYWN0IHNvbWUgc3RhdGlzdGljcwpmcm9tIHRoZSBmYXN0cWMgcmVzdWx0cy4KClRoZSBmb2xsb3dpbmcgaXMgcHJlcHJvY2Vzc2luZy9ocGdsMDU2NC9zY3JpcHRzLzAwZnFjLWhwZ2wwNTY0LnNoCgpgYGB7ciBmYXN0cWMsIGVuZ2luZT0nYmFzaCcsIGV2YWw9RkFMU0V9CiMhL3Vzci9iaW4vZW52IGJhc2gKI1BCUyAtViAtUyAvdXNyL2Jpbi9iYXNoIC1xIHdvcmtzdGF0aW9uCiNQQlMgLWQgL2NiY2IvbmVsc2F5ZWQtc2NyYXRjaC9hdGIvcm5hc2VxL3NjZXJldmlzaWFlX2NiZjV2MS9wcmVwcm9jZXNzaW5nL2hwZ2wwNTY0CiNQQlMgLU4gZnFjLWhwZ2wwNTY0IC1sIG1lbT02Z2IgLWwgd2FsbHRpbWU9MTA6MDA6MDAgLWwgbmNwdXM9OAojUEJTIC1vIC9jYmNiL25lbHNheWVkLXNjcmF0Y2gvYXRiL3JuYXNlcS9zY2VyZXZpc2lhZV9jYmY1djEvcHJlcHJvY2Vzc2luZy9ocGdsMDU2NC9vdXRwdXRzL3FzdWIvZnFjLWhwZ2wwNTY0LnFzdWJvdXQgLWogb2UgLVYgLW0gbgplY2hvICIjIyMjU3RhcnRlZCAvY2JjYi9uZWxzYXllZC1zY3JhdGNoL2F0Yi9ybmFzZXEvc2NlcmV2aXNpYWVfY2JmNXYxL3ByZXByb2Nlc3NpbmcvaHBnbDA1NjQvc2NyaXB0cy8wMGZxYy1ocGdsMDU2NC5zaCBhdCAkKGRhdGUpIiA+PiBvdXRwdXRzL2xvZy50eHQKY2QgL2NiY2IvbmVsc2F5ZWQtc2NyYXRjaC9hdGIvcm5hc2VxL3NjZXJldmlzaWFlX2NiZjV2MS9wcmVwcm9jZXNzaW5nL2hwZ2wwNTY0IHx8IGV4aXQKCiMjIFRoaXMgRmFzdFFDIHJ1biBpcyBhZ2FpbnN0IHJuYXNlcSBkYXRhIGFuZCBpcyB1c2VkIGZvcgojIyBhbiBpbml0aWFsIGVzdGltYXRpb24gb2YgdGhlIG92ZXJhbGwgc2VxdWVuY2luZyBxdWFsaXR5Lgpta2RpciAtcCBvdXRwdXRzL2Zhc3RxYyAmJiBcCiAgZmFzdHFjIC0tZXh0cmFjdCAtbyBvdXRwdXRzL2Zhc3RxYyBocGdsMDU2NF9mb3J3YXJkLmZhc3RxLmd6IFwKICAyPm91dHB1dHMvZmFzdHFjLm91dCAxPiYyCgojIyBUaGUgZm9sbG93aW5nIGxpbmVzIGdpdmUgc3RhdHVzIGNvZGVzIGFuZCBzb21lIGxvZ2dpbmcKZWNobyAkPyA+IG91dHB1dHMvc3RhdHVzL2ZxYy1ocGdsMDU2NC5zdGF0dXMKZWNobyAiIyMjRmluaXNoZWQgJHtQQlNfSk9CSUR9IDAwZnFjLWhwZ2wwNTY0LnNoIGF0ICQoZGF0ZSksIGl0IHRvb2sgJCgoIFNFQ09ORFMgLyA2MCApKSBtaW51dGVzLiIgPj4gb3V0cHV0cy9sb2cudHh0Cgp3YWxsdGltZT0kKHFzdGF0IC1mIC10ICIke1BCU19KT0JJRH0iIHwgZ3JlcCAncmVzb3VyY2VzX3VzZWQud2FsbHRpbWUnIHwgYXdrIC1GICcgPSAnICd7cHJpbnQgJDJ9JykKZWNobyAiIyMjI1BCUyB3YWxsdGltZSB1c2VkIGJ5ICR7UEJTX0pPQklEfSB3YXM6ICR7d2FsbHRpbWU6LW51bGx9IiA+PiBvdXRwdXRzL2xvZy50eHQKbWVtPSQocXN0YXQgLWYgLXQgfCBncmVwICIke1BCU19KT0JJRH0iIHwgZ3JlcCAncmVzb3VyY2VzX3VzZWQubWVtJyB8IGF3ayAtRiAnID0gJyAne3ByaW50ICQyfScpCmVjaG8gIiMjIyNQQlMgbWVtb3J5IHVzZWQgYnkgJHtQQlNfSk9CSUR9IHdhczogJHttZW06LW51bGx9IiA+PiBvdXRwdXRzL2xvZy50eHQKdm1tZW1vcnk9JChxc3RhdCAtZiAtdCAiJHtQQlNfSk9CSUR9IiB8IGdyZXAgJ3Jlc291cmNlc191c2VkLnZtZW0nIHwgYXdrIC1GICcgPSAnICd7cHJpbnQgJDJ9JykKZWNobyAiIyMjI1BCUyB2bWVtb3J5IHVzZWQgYnkgJHtQQlNfSk9CSUR9IHdhczogJHt2bW1lbW9yeTotbnVsbH0iID4+IG91dHB1dHMvbG9nLnR4dApjcHV0aW1lPSQocXN0YXQgLWYgLXQgIiR7UEJTX0pPQklEfSIgfCBncmVwICdyZXNvdXJjZXNfdXNlZC5jcHV0JyB8IGF3ayAtRiAnID0gJyAne3ByaW50ICQyfScpCmVjaG8gIiMjIyNQQlMgY3B1dGltZSB1c2VkIGJ5ICR7UEJTX0pPQklEfSB3YXM6ICR7Y3B1dGltZTotbnVsbH0iID4+IG91dHB1dHMvbG9nLnR4dAojI3FzdGF0IC1mIC10ICR7UEJTX0pPQklEfSA+PiBvdXRwdXRzL2xvZy50eHQKYGBgCgojIyMgRmFzdHFjIHN0YXRpc3RpY3MKClRoZSBmYXN0cWMgc3RhdGlzdGljcyBhcmUgZ2VuZXJhdGVkIHNlcGFyYXRlbHkgZm9yIHRoZSBmb3J3YXJkL3JldmVyc2UgcmVhZHMuCgpUaGUgZm9sbG93aW5nIGlzIHByZXByb2Nlc3NpbmcvaHBnbDA0ODAvc2NyaXB0cy8wMWZxY3N0X2ZvcndhcmQtaHBnbDA1NjQuc2gKCmBgYHtyIGZhc3RxY19zdGF0cywgZW5naW5lPSdiYXNoJywgZXZhbD1GQUxTRX0KIyMgVGhpcyBpcyBhIHN0dXBpZGx5IHNpbXBsZSBqb2IgdG8gY29sbGVjdCBhbGlnbm1lbnQgc3RhdGlzdGljcy4KCmlmIFsgISAtciBvdXRwdXRzL2Zhc3RxY19mb3J3YXJkX3N0YXRzLmNzdiBdOyB0aGVuCiAgZWNobyAibmFtZSx0b3RhbF9yZWFkcyxwb29yX3F1YWxpdHkscGVyX3F1YWxpdHkscGVyX2Jhc2VfY29udGVudCxwZXJfc2VxdWVuY2VfZ2MscGVyX2Jhc2VfbixwZXJfc2VxX2xlbmd0aCxvdmVyX3JlcCxhZGFwdGVyX2NvbnRlbnQsa21lcl9jb250ZW50IiA+IG91dHB1dHMvZmFzdHFjX2ZvcndhcmRfc3RhdHMuY3N2CmZpCnRvdGFsX3JlYWRzX3RtcD0kKGdyZXAgIl5Ub3RhbCBTZXF1ZW5jZXMiIG91dHB1dHMvZmFzdHFjL2hwZ2wwNTY0X2ZvcndhcmQuZ3pfZmFzdHFjL2Zhc3RxY19kYXRhLnR4dCB8IGF3ayAtRiAnXFx0JyAne3ByaW50ICQyfScpCnRvdGFsX3JlYWRzPSR7dG90YWxfcmVhZHNfdG1wOi0wfQpwb29yX3F1YWxpdHlfdG1wPSQoZ3JlcCAiXlNlcXVlbmNlcyBmbGFnZ2VkIGFzIHBvb3IgcXVhbGl0eSIgb3V0cHV0cy9mYXN0cWMvaHBnbDA1NjRfZm9yd2FyZC5nel9mYXN0cWMvZmFzdHFjX2RhdGEudHh0IHwgYXdrIC1GICdcXHQnICd7cHJpbnQgJDJ9JykKcG9vcl9xdWFsaXR5PSR7cG9vcl9xdWFsaXR5X3RtcDotMH0KcGVyX3F1YWxpdHlfdG1wPSQoZ3JlcCAiUGVyIGJhc2Ugc2VxdWVuY2UgcXVhbGl0eSIgb3V0cHV0cy9mYXN0cWMvaHBnbDA1NjRfZm9yd2FyZC5nel9mYXN0cWMvZmFzdHFjX2RhdGEudHh0IHwgYXdrIC1GICdcXHQnICd7cHJpbnQgJDJ9JykKcGVyX3F1YWxpdHk9JHtwZXJfcXVhbGl0eV90bXA6LTB9CnBlcl9iYXNlX2NvbnRlbnRfdG1wPSQoZ3JlcCAiUGVyIGJhc2Ugc2VxdWVuY2UgY29udGVudCIgb3V0cHV0cy9mYXN0cWMvaHBnbDA1NjRfZm9yd2FyZC5nel9mYXN0cWMvZmFzdHFjX2RhdGEudHh0IHwgYXdrIC1GICdcXHQnICd7cHJpbnQgJDJ9JykKcGVyX2Jhc2VfY29udGVudD0ke3Blcl9iYXNlX2NvbnRlbnRfdG1wOi0wfQpwZXJfc2VxdWVuY2VfZ2NfdG1wPSQoZ3JlcCAiUGVyIHNlcXVlbmNlIEdDIGNvbnRlbnQiIG91dHB1dHMvZmFzdHFjL2hwZ2wwNTY0X2ZvcndhcmQuZ3pfZmFzdHFjL2Zhc3RxY19kYXRhLnR4dCB8IGF3ayAtRiAnXFx0JyAne3ByaW50ICQyfScpCnBlcl9zZXF1ZW5jZV9nYz0ke3Blcl9zZXF1ZW5jZV9nY190bXA6LTB9CnBlcl9iYXNlX25fdG1wPSQoZ3JlcCAiUGVyIGJhc2UgTiBjb250ZW50IiBvdXRwdXRzL2Zhc3RxYy9ocGdsMDU2NF9mb3J3YXJkLmd6X2Zhc3RxYy9mYXN0cWNfZGF0YS50eHQgfCBhd2sgLUYgJ1xcdCcgJ3twcmludCAkMn0nKQpwZXJfYmFzZV9uPSR7cGVyX2Jhc2Vfbl90bXA6LTB9CnBlcl9zZXFfbGVuZ3RoX3RtcD0kKGdyZXAgIlNlcXVlbmNlIExlbmd0aCBEaXN0cmlidXRpb24iIG91dHB1dHMvZmFzdHFjL2hwZ2wwNTY0X2ZvcndhcmQuZ3pfZmFzdHFjL2Zhc3RxY19kYXRhLnR4dCB8IGF3ayAtRiAnXFx0JyAne3ByaW50ICQyfScpCnBlcl9zZXFfbGVuZ3RoPSR7cGVyX3NlcV9sZW5ndGhfdG1wOi0wfQpvdmVyX3JlcF90bXA9JChncmVwICJPdmVycmVwcmVzZW50ZWQgc2VxdWVuY2VzIiBvdXRwdXRzL2Zhc3RxYy9ocGdsMDU2NF9mb3J3YXJkLmd6X2Zhc3RxYy9mYXN0cWNfZGF0YS50eHQgfCBhd2sgLUYgJ1xcdCcgJ3twcmludCAkMn0nKQpvdmVyX3JlcD0ke292ZXJfcmVwX3RtcDotMH0KYWRhcHRlcl9jb250ZW50X3RtcD0kKGdyZXAgIkFkYXB0ZXIgQ29udGVudCIgb3V0cHV0cy9mYXN0cWMvaHBnbDA1NjRfZm9yd2FyZC5nel9mYXN0cWMvZmFzdHFjX2RhdGEudHh0IHwgYXdrIC1GICdcXHQnICd7cHJpbnQgJDJ9JykKYWRhcHRlcl9jb250ZW50PSR7YWRhcHRlcl9jb250ZW50X3RtcDotMH0Ka21lcl9jb250ZW50X3RtcD0kKGdyZXAgIkttZXIgQ29udGVudCIgb3V0cHV0cy9mYXN0cWMvaHBnbDA1NjRfZm9yd2FyZC5nel9mYXN0cWMvZmFzdHFjX2RhdGEudHh0IHwgYXdrIC1GICdcXHQnICd7cHJpbnQgJDJ9JykKa21lcl9jb250ZW50PSR7a21lcl9jb250ZW50X3RtcDotMH0KCnN0YXRfc3RyaW5nPSQocHJpbnRmICJocGdsMDU2NCwlcywlcywlcywlcywlcywlcywlcywlcywlcywlcyIgIiR7dG90YWxfcmVhZHN9IiAiJHtwb29yX3F1YWxpdHl9IiAiJHtwZXJfcXVhbGl0eX0iICIke3Blcl9iYXNlX2NvbnRlbnR9IiAiJHtwZXJfc2VxdWVuY2VfZ2N9IiAiJHtwZXJfYmFzZV9ufSIgIiR7cGVyX3NlcV9sZW5ndGh9IiAiJHtvdmVyX3JlcH0iICIke2FkYXB0ZXJfY29udGVudH0iICIke2ttZXJfY29udGVudH0iKQplY2hvICIkc3RhdF9zdHJpbmciID4+IG91dHB1dHMvZmFzdHFjX2ZvcndhcmRfc3RhdHMuY3N2CmBgYAoKIyMgVHJpbW9tYXRpYwoKVHJpbW9tYXRpYyBpcyBwZXJoYXBzIHRoZSBtb3N0IGltcG9ydGFudCBzdGVwIGluIHRoZSBwcm9jZXNzLCBhcyBpdCByZW1vdmVzIHRoZQpzb21ldGltZXMgdmVyeSBhYnVuZGFudCBzZXF1ZW5jaW5nIGFkYXB0ZXJzLCB3aGljaCBpZiBmb3Jnb3R0ZW4sIHdvdWxkIGRlc3Ryb3kKYWxsIHRoZSBmb2xsb3dpbmcgc3RlcHMuCgpUaGUgZm9sbG93aW5nIGlzIHByZXByb2Nlc3NpbmcvaHBnbDA1NjQvc2NyaXB0cy8wNXRyaW0taHBnbDA1NjQuc2gKClRoaXMgam9iIGhhcyBhIGxpdHRsZSBiaXQgb2YgbG9naWMgaW4gaXQgaW4gY2FzZSB0cmltb21hdGljIGZhaWxzLgoKYGBge3IgdHJpbW9tYXRpYywgZW5naW5lPSdiYXNoJywgZXZhbD1GQUxTRX0KIyMgVGhpcyBjYWxsIHRvIHRyaW1vbWF0aWMgcmVtb3ZlcyBpbGx1bWluYSBhbmQgZXBpY2VudHJlIGFkYXB0ZXJzIGZyb20gaHBnbDA1NjRfZm9yd2FyZC5mYXN0cS5nei4KIyMgSXQgYWxzbyBwZXJmb3JtcyBhIHNsaWRpbmcgd2luZG93IHJlbW92YWwgb2YgYW55dGhpbmcgd2l0aCBxdWFsaXR5IDwyNTsKIyMgY3V0YWRhcHQgcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhpcyB0b29sLgojIyBUaGUgb3JpZ2luYWwgc2VxdWVuY2UgZGF0YSBpcyByZWNvbXByZXNzZWQgYW5kIHNhdmVkIGluIHRoZSBzZXF1ZW5jZXMvIGRpcmVjdG9yeS4KCiMjIFRyaW1vbWF0aWNfUGFpcndpc2U6IEluIGNhc2UgYSB0cmltbWluZyBuZWVkcyB0byBiZSByZWRvbmUuLi4KaWYgW1sgISAtciAiaHBnbDA1NjRfZm9yd2FyZC5mYXN0cS5neiIgXV07IHRoZW4KICBpZiBbWyAtciAic2VxdWVuY2VzL2hwZ2wwNTY0X2ZvcndhcmQuZmFzdHEueHoiIF1dOyB0aGVuCiAgICBtdiBzZXF1ZW5jZXMvaHBnbDA1NjRfZm9yd2FyZC5mYXN0cS54eiAuICYmIHB4eiAtZCBocGdsMDU2NF9mb3J3YXJkLmZhc3RxLnh6ICYmIHBpZ3ogaHBnbDA1NjRfZm9yd2FyZC5mYXN0cQogIGVsc2UKICAgIGVjaG8gIk1pc3NpbmcgZmlsZXMuIERpZCBub3QgZmluZCBocGdsMDU2NF9mb3J3YXJkLmZhc3RxLmd6IG5vciBzZXF1ZW5jZXMvaHBnbDA1NjRfZm9yd2FyZC5mYXN0cS54eiIKICAgIGV4aXQgMQogIGZpCmZpCiMjIE5vdGUgdGhhdCB0cmltb21hdGljIHByaW50cyBhbGwgb3V0cHV0IGFuZCBlcnJvcnMgdG8gU1RERVJSLCBzbyBzZW5kIGJvdGggdG8gb3V0cHV0CnRyaW1vbWF0aWMgUEUgLXRocmVhZHMgMSAtcGhyZWQzMyBocGdsMDU2NF9mb3J3YXJkLmZhc3RxLmd6IGhwZ2wwNTY0X2ZvcndhcmQtdHJpbW1lZF9wYWlyZWQuZmFzdHEuZ3ogaHBnbDA1NjRfZm9yd2FyZC10cmltbWVkX3VucGFpcmVkLmZhc3RxLmd6IFwKICAgIElMTFVNSU5BQ0xJUDovY2JjYmhvbWVzL2FiZWxldy9saWJyYXJpZXMvYWRhcHRlcnMuZmE6MjoyMDo0IFNMSURJTkdXSU5ET1c6NDoyNSBcCiAgICAxPm91dHB1dHMvaHBnbDA1NjQtdHJpbW9tYXRpYy5vdXQgMj4mMQpleGNlcHRlZD0kKGdyZXAgIkV4Y2VwdGlvbiIgb3V0cHV0cy9ocGdsMDU2NC10cmltb21hdGljLm91dCkKIyMgVGhlIGZvbGxvd2luZyBpcyBpbiBjYXNlIHRoZSBpbGx1bWluYSBjbGlwcGluZyBmYWlscywgd2hpY2ggaXQgZG9lcyBpZiB0aGlzIGhhcyBhbHJlYWR5IGJlZW4gcnVuIEkgdGhpbmsuCmlmIFtbICIke2V4Y2VwdGVkfSIgIT0gIiIgXV07IHRoZW4KICB0cmltb21hdGljIFBFIC10aHJlYWRzIDEgLXBocmVkMzMgaHBnbDA1NjRfZm9yd2FyZC5mYXN0cS5neiBocGdsMDU2NF9mb3J3YXJkLXRyaW1tZWRfcGFpcmVkLmZhc3RxLmd6IGhwZ2wwNTY0X2ZvcndhcmQtdHJpbW1lZF91bnBhaXJlZC5mYXN0cS5neiBTTElESU5HV0lORE9XOjQ6MjUgXAogICAgMT5vdXRwdXRzL2hwZ2wwNTY0LXRyaW1vbWF0aWMub3V0IDI+JjEKZmkKc2xlZXAgMTAKbXYgaHBnbDA1NjRfZm9yd2FyZC10cmltbWVkX3BhaXJlZC5mYXN0cS5neiBocGdsMDU2NF9mb3J3YXJkLXRyaW1tZWQuZmFzdHEuZ3oKYGBgCgojIyMgVHJpbW9tYXRpYyBzdGF0aXN0aWNzCgpJbiB0aGUgc2FtZSB3YXksIHRoZSB0ZXh0IG91dHB1dCBvZiB0cmltb21hdGljIGlzIHBhcnNlZCB0byBnZW5lcmF0ZSBzb21lCnN0YXRpc3RpY3MuCgpUaGUgZm9sbG93aW5nIGlzIHByZXByb2Nlc3NpbmcvaHBnbDA1NjQvc2NyaXB0cy8wNnRyaW1zdC1ocGdsMDU2NC5zaAoKYGBge3IgdHJpbW9tYXRpY19zdGF0cywgZW5naW5lPSdiYXNoJywgZXZhbD1GQUxTRX0KIyMgVGhpcyBpcyBhIHN0dXBpZGx5IHNpbXBsZSBqb2IgdG8gY29sbGVjdCB0cmltb21hdGljIHN0YXRpc3RpY3MKCmlmIFsgISAtciBvdXRwdXRzL3RyaW1vbWF0aWNfc3RhdHMuY3N2IF07IHRoZW4KICBlY2hvICJ0b3RhbF9yZWFkcyxzdXJ2aXZpbmdfYm90aCxzdXJ2aXZpbmdfZm9yd2FyZCxzdXJ2aXZpbmdfcmV2ZXJzZSxkcm9wcGVkX3JlYWRzIiA+IG91dHB1dHMvdHJpbW9tYXRpY19zdGF0cy5jc3YKZmkKdG90YWxfcmVhZHNfdG1wPSQoZ3JlcCAiXklucHV0IFJlYWQgUGFpcnMiIG91dHB1dHMvaHBnbDA1NjQtdHJpbW9tYXRpYy5vdXQgfCBhd2sgJ3twcmludCAkNH0nKQp0b3RhbF9yZWFkcz0ke3RvdGFsX3JlYWRzX3RtcDotMH0Kc3Vydml2aW5nX2JvdGhfdG1wPSQoZ3JlcCAiXklucHV0IFJlYWQgUGFpcnMiIG91dHB1dHMvaHBnbDA1NjQtdHJpbW9tYXRpYy5vdXQgfCBhd2sgJ3twcmludCAkN30nKQpzdXJ2aXZpbmdfYm90aD0ke3N1cnZpdmluZ19ib3RoX3RtcDotMH0Kc3Vydml2aW5nX2ZvcndhcmRfdG1wPSQoZ3JlcCAiXklucHV0IFJlYWQgUGFpcnMiIG91dHB1dHMvaHBnbDA1NjQtdHJpbW9tYXRpYy5vdXQgfCBhd2sgJ3twcmludCAkMTJ9JykKc3Vydml2aW5nX2ZvcndhcmQ9JHtzdXJ2aXZpbmdfZm9yd2FyZF90bXA6LTB9CnN1cnZpdmluZ19yZXZlcnNlX3RtcD0kKGdyZXAgIl5JbnB1dCBSZWFkIFBhaXJzIiBvdXRwdXRzL2hwZ2wwNTY0LXRyaW1vbWF0aWMub3V0IHwgYXdrICd7cHJpbnQgJDE3fScpCnN1cnZpdmluZ19yZXZlcnNlPSR7c3Vydml2aW5nX3JldmVyc2VfdG1wOi0wfQpkcm9wcGVkX3JlYWRzX3RtcD0kKGdyZXAgIl5JbnB1dCBSZWFkIFBhaXJzIiBvdXRwdXRzL2hwZ2wwNTY0LXRyaW1vbWF0aWMub3V0IHwgYXdrICd7cHJpbnQgJDIwfScpCmRyb3BwZWRfcmVhZHM9JHtkcm9wcGVkX3JlYWRzX3RtcDotMH0KCnN0YXRfc3RyaW5nPSQocHJpbnRmICJocGdsMDU2NCwlcywlcywlcywlcywlcyIgIiR7dG90YWxfcmVhZHN9IiAiJHtzdXJ2aXZpbmdfYm90aH0iICIke3N1cnZpdmluZ19mb3J3YXJkfSIgIiR7c3Vydml2aW5nX3JldmVyc2V9IiAiJHtkcm9wcGVkX3JlYWRzfSIpCmVjaG8gIiRzdGF0X3N0cmluZyIgPj4gb3V0cHV0cy90cmltb21hdGljX3N0YXRzLmNzdgpgYGAKCiMjIEJpb3BpZWNlcwoKQmlvcGllY2VzIGlzIGFuIGludGVyZXN0aW5nIHByb2plY3QgdG8gcHJvdmlkZSBhIHN1aXRlIG9mIHNpbXBsZSB0b29scyB3aGljaCBtYXkKYmUgY29ubmVjdGVkIHRvIHBlcmZvcm0gaW50ZXJlc3RpbmcgdGFza3MuICBJIHVzZSBpdCB0byBwbG90IHNvbWUgZ3JhcGhzIG9mIHRoZQpzZXF1ZW5jaW5nIHF1YWxpdHkvYXR0cmlidXRlcy4KClRoZSBmb2xsb3dpbmcgaXMgcHJlcHJvY2Vzc2luZy9ocGdsMDU2NC9zY3JpcHRzLzAyYmlvcC1ocGdsMDU2NHRyaW1tZWQuc2gKCmBgYHtyIGJpb3BpZWNlcywgZW5naW5lPSdiYXNoJywgZXZhbD1GQUxTRX0KIyMgVGhpcyBzY3JpcHQgdXNlcyBiaW9waWVjZXMgdG8gZHJhdyBzb21lIHNpbXBsZSBncmFwaHMgb2YgdGhlIHNlcXVlbmNlLgoKIyMgRG8gbm90IGZvcmdldCB0aGF0IF9vbmx5XyB0aGUgbGFzdCBjb21tYW5kIGluIGEgYmlvcGllY2VzIHN0cmluZyBpcyBhbGxvd2VkIHRvIGhhdmUgdGhlIC14Lgpta2RpciAtcCBvdXRwdXRzL2Jpb3BpZWNlcwpsZXNzIGhwZ2wwNTY0X2ZvcndhcmQtdHJpbW1lZC5mYXN0cSB8IHJlYWRfZmFzdHEgLWkgLSAtZSBiYXNlXzMzIHxcCiBwbG90X3Njb3JlcyAtVCAnUXVhbGl0eSBTY29yZXMnIC10IHN2ZyAtbyBvdXRwdXRzL2Jpb3BpZWNlcy9ocGdsMDU2NF9mb3J3YXJkLXRyaW1tZWRfcXVhbGl0eV9zY29yZXMuc3ZnIHxcCiBwbG90X251Y2xlb3RpZGVfZGlzdHJpYnV0aW9uIC1UICdOVC4gRGlzdHJpYnV0aW9uJyAtdCBzdmcgLW8gb3V0cHV0cy9iaW9waWVjZXMvaHBnbDA1NjRfZm9yd2FyZC10cmltbWVkX250ZGlzdC5zdmcgfFwKIHBsb3RfbGVuZGlzdCAtVCAnTGVuZ3RoIERpc3RyaWJ1dGlvbicgLWsgU0VRX0xFTiAtdCBzdmcgLW8gb3V0cHV0cy9iaW9waWVjZXMvaHBnbDA1NjRfZm9yd2FyZC10cmltbWVkX2xlbmRpc3Quc3ZnIHxcCiBhbmFseXplX2djIHxcCiAgICAgYmluX3ZhbHMgLWIgMjAgLWsgJ0dDJScgfFwKICAgICBwbG90X2Rpc3RyaWJ1dGlvbiAtayAnR0MlX0JJTicgLXQgc3ZnIC1vIG91dHB1dHMvYmlvcGllY2VzL2hwZ2wwNTY0X2ZvcndhcmQtdHJpbW1lZF9nY2Rpc3Quc3ZnIHxcCiBhbmFseXplX2djIHxcCiAgICAgbWVhbl92YWxzIC1rICdHQyUnIC1vIG91dHB1dHMvYmlvcGllY2VzL2hwZ2wwNTY0X2ZvcndhcmQtdHJpbW1lZF9nYy50eHQgfFwKIGNvdW50X3JlY29yZHMgLW8gb3V0cHV0cy9iaW9waWVjZXMvaHBnbDA1NjRfZm9yd2FyZC10cmltbWVkX2NvdW50LnR4dCAteApgYGAKCiMjIEthbGxpc3RvIFllYXN0CgpLYWxsaXN0byBpcyBhIHN1cGVyLWZhc3QgYWxpZ25lciBmb3IgZXN0aW1hdGluZyByZWxhdGl2ZSB0cmFuc2NyaXB0IGFidW5kYW5jZS4KSSBpbmNyZWFzaW5nbHkgdGhpbmsgaXQgaXMgYmV0dGVyIHRoYW4gdG9waGF0LgoKSSBhZGRlZCBhIGxpdHRsZSBsb2dpYyB0byBzaW1wbGlmeSBpdHMgb3V0cHV0IHRvIHByb3ZpZGUgYSBjb3VudCB0YWJsZS1saWtlIGZpbGUuCgpUaGUgZm9sbG93aW5nIGlzIHByZXByb2Nlc3NpbmcvaHBnbDA1NjQvc2NyaXB0cy8zMGthbGxfc2NlcmV2aXNpYWUtaHBnbDA1NjR0cmltbWVkLnNoCgpgYGB7ciBrYWxsaXN0bywgZW5naW5lPSdiYXNoJywgZXZhbD1GQUxTRX0KIyMgVGhpcyBpcyBhIGthbGxpc3RvIHBzZXVkb2FsaWdubWVudCBvZiBocGdsMDU2NF9mb3J3YXJkLXRyaW1tZWQuZmFzdHEuZ3ogYWdhaW5zdAojIyAvY2JjYmhvbWVzL2FiZWxldy9saWJyYXJpZXMvZ2Vub21lL2luZGV4ZXMvc2NlcmV2aXNpYWUuaWR4LgojIyBUaGlzIGpvYnMgZGVwZW5kZWQgb246CiMjIE90aGVyIGNhbmRpZGF0ZXMgZm9yIG1ha2luZyBhIHByZXR0eSBjb3VudCB0YWJsZSBpbmNsdWRlOgojIyAgcGVybCAtRidcdCcgLWEgLW4gLWUgJ3ByaW50ICIkRlswXSAkRlszXVxuIicgb3V0cHV0cy9rYWxsaXN0b19zY2VyZXZpc2lhZS9hYnVuZGFuY2UudHN2ID4gb3V0cHV0cy9rYWxsaXN0b19zY2VyZXZpc2lhZS9hYnVuZGFuY2UuY291bnQKIyMgICBhd2sgJ3twcmludGYoIiVzICVzXG4iLCAkMSwgJDQpfScgb3V0cHV0cy9rYWxsaXN0b19zY2VyZXZpc2lhZS9hYnVuZGFuY2UudHN2ID4gb3V0cHV0cy9rYWxsaXN0b19zY2VyZXZpc2lhZS9hYnVuZGFuY2UuY291bnQKIyMgYmVjYXVzZSBrYWxsaXN0byBpcyBzbyBmYXN0Cgpta2RpciAtcCBvdXRwdXRzL2thbGxpc3RvX3NjZXJldmlzaWFlICYmIHNsZWVwIDEwICYmIFwKICBrYWxsaXN0byBxdWFudCAgLS1wbGFpbnRleHQgLWIgMTAwIC1vIG91dHB1dHMva2FsbGlzdG9fc2NlcmV2aXNpYWUgLWkgL2NiY2Job21lcy9hYmVsZXcvbGlicmFyaWVzL2dlbm9tZS9pbmRleGVzL3NjZXJldmlzaWFlLmlkeCBcCiAgICBocGdsMDU2NF9mb3J3YXJkLXRyaW1tZWQuZmFzdHEuZ3ogMj5vdXRwdXRzL2thbGxpc3RvX3NjZXJldmlzaWFlL2thbGxpc3RvX3NjZXJldmlzaWFlLnN0ZGVyciAxPm91dHB1dHMva2FsbGlzdG9fc2NlcmV2aXNpYWUva2FsbGlzdG9fc2NlcmV2aXNpYWUudHh0ICYmIFwKICBjdXQgLWQgIgkiIC1mIDEsNCBvdXRwdXRzL2thbGxpc3RvX3NjZXJldmlzaWFlL2FidW5kYW5jZS50c3YgPiBvdXRwdXRzL2thbGxpc3RvX3NjZXJldmlzaWFlL2FidW5kYW5jZS5jb3VudCAmJiBcCiAgZ3ppcCBvdXRwdXRzL2thbGxpc3RvX3NjZXJldmlzaWFlL2FidW5kYW5jZS5jb3VudCAmJiB4eiAtOWUgKi50c3YKYGBgCgpJIGN1cnJlbnRseSBkbyBub3QgaGF2ZSBhIGpvYiB0byBjcmVhdGUga2FsbGlzdG8gc3RhdGlzdGljcywgd2hpY2ggaXMgZHVtYiwgZml4IHRoYXQuCgojIyBUb3BoYXQgWWVhc3QKClRoZXJlIGlzIGEgbGl0dGxlIGJpdCBvZiBpbnRlcmVzdGluZyBsb2dpYyBpbiB0aGlzOgoKMS4gIEkgbWFrZSBzdXJlIHRvIHNvcnQgdGhlIGFjY2VwdGVkX2hpdHMuYmFtIGJlY2F1c2UgaXQgaXMgYW5ub3lpbmcgdG8gbm90IGJlCiAgICBhYmxlIHRvIGxvb2sgYXQgdGhlc2UgaW4gSUdWLgoyLiAgSSB0YWtlIGFuIGV4dHJhIHN0ZXAgdG8gZXh0cmFjdCB0aGUgcGVyZmVjdGx5IHBhaXJlZCBhbGlnbmVkIHJlYWRzIChUaGUKICAgIHNhbXRvb2xzIHZpZXcgLWIgLWYgMiBsaW5lKS4gIEluIHRoZSBiZXN0IGNhc2Ugc2NlbmFyaW8sIHRoaXMgcmVtb3ZlcyBub3RoaW5nLgoKVGhlIGZvbGxvd2luZyBpcyBwcmVwcm9jZXNzaW5nL2hwZ2wwNTY0L3NjcmlwdHMvMzF0aF9zY2VyZXZpc2lhZS1ocGdsMDU2NHRyaW1tZWQuc2gKCmBgYHtyIHRvcGhhdF95ZWFzdCwgZW5naW5lPSdiYXNoJywgZXZhbD1GQUxTRX0KIyMgSSBzdGlsbCBoYXZlIG5vIGNsdWUgd2hhdCBJIGFtIGRvaW5nIHdoZW4gSSB1c2UgdG9waGF0Li4uCiMjIEhvd2V2ZXIsIEkga25vdyB0aGF0IC1nIDEgd2lsbCBhbGxvdyBvbmx5IDEgaGl0IGluIHRoZSBjYXNlIG9mIG11bHRpaGl0cywgYnV0IHJhbmRvbWx5IHBsYWNlIGl0CiMjIEZyb20gdGhlIG1hbnVhbDogICJJZiB0aGVyZSBhcmUgbW9yZSBhbGlnbm1lbnRzIHdpdGggdGhlIHNhbWUgc2NvcmUgdGhhbiB0aGlzCiMjIG51bWJlciwgVG9wSGF0IHdpbGwgcmFuZG9tbHkgcmVwb3J0IG9ubHkgdGhpcyBtYW55IGFsaWdubWVudHMiCiMjIC1OIDEgd2lsbCBkaXNjYXJkIGFueXRoaW5nIHdpdGggPjEgbWlzbWF0Y2ggKGRlZmF1bHQgaXMgMikKIyMgLXIgYWRqdXN0cyB0aGUgYWxsb3dhYmxlIG1lYW4gZGlzdGFuY2UgYmV0d2VlbiB0aGUgcGFpcmVkIHJlYWRzCiMjIC0tbWF0ZS1zdGQtZGV2IHNldHMgdGhlIGRldmlhdGlvbiBvZiAtcgojIyAtLW1pY3JvZXhvbi1zZWFyY2ggd2lsbCB0ZWxsIGl0IHRvIHNlYXJjaCBzaG9ydCBleG9ucyBmb3IgcmVhZHMgPj01MAoKbWtkaXIgLXAgb3V0cHV0cy90b3BoYXRfc2NlcmV2aXNpYWUgJiYgdG9waGF0ICAtZyAxIC0tYjItdmVyeS1zZW5zaXRpdmUgIFwKICAtRyAvY2JjYmhvbWVzL2FiZWxldy9saWJyYXJpZXMvZ2Vub21lL3NjZXJldmlzaWFlLmd0ZiBcCiAgLXAgNCAtbyBvdXRwdXRzL3RvcGhhdF9zY2VyZXZpc2lhZSBcCiAgL2NiY2Job21lcy9hYmVsZXcvbGlicmFyaWVzL2dlbm9tZS9pbmRleGVzL3NjZXJldmlzaWFlIFwKICBocGdsMDU2NF9mb3J3YXJkLXRyaW1tZWQuZmFzdHEuZ3ogMj5vdXRwdXRzL3RvcGhhdC5vdXQgMT4mMiAmJiBcCiBzYW10b29scyBzb3J0IC1sIDkgLW4gb3V0cHV0cy90b3BoYXRfc2NlcmV2aXNpYWUvYWNjZXB0ZWRfaGl0cy5iYW0gb3V0cHV0cy90b3BoYXRfc2NlcmV2aXNpYWUvYWNjZXB0ZWRfc29ydGVkICYmIFwKIG12IG91dHB1dHMvdG9waGF0X3NjZXJldmlzaWFlL2FjY2VwdGVkX3NvcnRlZC5iYW0gb3V0cHV0cy90b3BoYXRfc2NlcmV2aXNpYWUvYWNjZXB0ZWRfaGl0cy5iYW0gJiYgXAogc2FtdG9vbHMgaW5kZXggb3V0cHV0cy90b3BoYXRfc2NlcmV2aXNpYWUvYWNjZXB0ZWRfaGl0cy5iYW0gJiYgXAogc2FtdG9vbHMgc29ydCAtbCA5IC1uIG91dHB1dHMvdG9waGF0X3NjZXJldmlzaWFlL3VubWFwcGVkLmJhbSBvdXRwdXRzL3RvcGhhdF9zY2VyZXZpc2lhZS91bm1hcHBlZF9zb3J0ZWQgJiYgXAogbXYgb3V0cHV0cy90b3BoYXRfc2NlcmV2aXNpYWUvdW5tYXBwZWRfc29ydGVkLmJhbSBvdXRwdXRzL3RvcGhhdF9zY2VyZXZpc2lhZS91bm1hcHBlZC5iYW0gJiYgXAogc2FtdG9vbHMgaW5kZXggb3V0cHV0cy90b3BoYXRfc2NlcmV2aXNpYWUvdW5tYXBwZWQuYmFtCgppZiBbIC1yICJvdXRwdXRzL3RvcGhhdF9zY2VyZXZpc2lhZS9hY2NlcHRlZF9oaXRzLmJhbSIgXTsgdGhlbgogIHNhbXRvb2xzIHZpZXcgLWIgLWYgMiBvdXRwdXRzL3RvcGhhdF9zY2VyZXZpc2lhZS9hY2NlcHRlZF9oaXRzLmJhbSA+IG91dHB1dHMvdG9waGF0X3NjZXJldmlzaWFlL2FjY2VwdGVkX3BhaXJlZC5iYW0gJiYgXAogICAgc2FtdG9vbHMgaW5kZXggb3V0cHV0cy90b3BoYXRfc2NlcmV2aXNpYWUvYWNjZXB0ZWRfcGFpcmVkLmJhbQpmaQpgYGAKCiMjIyBUb3BoYXQgc3RhdGlzdGljcwoKSSBnZW5lcmF0ZSBhIHNpbWlsYXIgY3N2IGZpbGUgZm9yIHRoZSB0b3BoYXQgYWxpZ25tZW50czoKClRoZSBmb2xsb3dpbmcgaXMgcHJlcHJvY2Vzc2luZy9ocGdsMDU2NC9zY3JpcHRzLzMzdHBzdGF0c19zY2VyZXZpc2lhZS1ocGdsMDU2NHRyaW1tZWQuc2gKCmBgYHtyIHN0YXRzX3RvcGhhdF9zY2VyZXZpc2lhZSwgZW5naW5lPSdiYXNoJywgZXZhbD1GQUxTRX0KIyMgVGhpcyBpcyBhIHN0dXBpZGx5IHNpbXBsZSBqb2IgdG8gY29sbGVjdCB0b3BoYXQgYWxpZ25tZW50IHN0YXRpc3RpY3MuCgppZiBbICEgLXIgb3V0cHV0cy90b3BoYXRfc3RhdHMuY3N2IF07IHRoZW4KICBlY2hvICJiYXNlbmFtZSxzcGVjaWVzLG9yaWdpbmFsX3JlYWRzLGFsaWduZWRfcmVhZHMsZmFpbGVkX3JlYWRzLHJwbSxjb3VudF90YWJsZSIgPiBvdXRwdXRzL3RvcGhhdF9zdGF0cy5jc3YKZmkKYmFtdG9vbHMgc3RhdHMgPCBvdXRwdXRzL3RvcGhhdF9zY2VyZXZpc2lhZS9hY2NlcHRlZF9oaXRzLmJhbSAyPm91dHB1dHMvdG9waGF0X3NjZXJldmlzaWFlL2FjY2VwdGVkX2hpdHMuYmFtLnN0YXRzIDE+JjIgJiYgYmFtdG9vbHMgc3RhdHMgPCBvdXRwdXRzL3RvcGhhdF9zY2VyZXZpc2lhZS91bm1hcHBlZC5iYW0gMj5vdXRwdXRzL3RvcGhhdF9zY2VyZXZpc2lhZS91bm1hcHBlZC5iYW0uc3RhdHMgMT4mMgpvcmlnaW5hbF9yZWFkc190bXA9JChncmVwICJeSW5wdXQgUmVhZHMiIG91dHB1dHMvaHBnbDA1NjQtdHJpbW1lZC10cmltb21hdGljLm91dCB8IGF3ayAne3ByaW50ICQzfScgfCBzZWQgJ3MvIC8vZycpCm9yaWdpbmFsX3JlYWRzPSR7b3JpZ2luYWxfcmVhZHNfdG1wOi0wfQpyZWFkc190bXA9JChncmVwICJecmVhZHNfaW4gIiBvdXRwdXRzL3RvcGhhdF9zY2VyZXZpc2lhZS9wcmVwX3JlYWRzLmluZm8gfCBhd2sgLUY9ICd7cHJpbnQgJDJ9JyB8IHNlZCAncy8gLy9nJykKcmVhZHM9JHtyZWFkc190bXA6LTB9CmFsaWduZWRfdG1wPSQoZ3JlcCAiXlRvdGFsIHJlYWRzIiBvdXRwdXRzL3RvcGhhdF9zY2VyZXZpc2lhZS9hY2NlcHRlZF9oaXRzLmJhbS5zdGF0cyB8IGF3ayAne3ByaW50ICQzfScgfCBzZWQgJ3MvIC4qLy9nJykKYWxpZ25lZD0ke2FsaWduZWRfdG1wOi0wfQpmYWlsZWRfdG1wPSQoZ3JlcCAiXlRvdGFsIHJlYWRzIiBvdXRwdXRzL3RvcGhhdF9zY2VyZXZpc2lhZS91bm1hcHBlZC5iYW0uc3RhdHMgfCBhd2sgJ3twcmludCAkM30nIHwgc2VkICdzLyAuKi8vZycpCmZhaWxlZD0ke2ZhaWxlZF90bXA6LTB9CnJwbV90bXA9JChwZXJsIC1lICJwcmludGYoMTAwMDAwMCAvICR7YWxpZ25lZH0pIiAyPi9kZXYvbnVsbCkKcnBtPSR7cnBtX3RtcDotMH0Kc3RhdF9zdHJpbmc9JChwcmludGYgImhwZ2wwNTY0LXRyaW1tZWQsc2NlcmV2aXNpYWUsJXMsJXMsJXMsJXMsJXMsYWNjZXB0ZWRfaGl0cy5jb3VudC54eiIgIiR7b3JpZ2luYWxfcmVhZHN9IiAiJHtyZWFkc30iICIke2FsaWduZWR9IiAiJHtmYWlsZWR9IiAiJHJwbSIpCmVjaG8gIiRzdGF0X3N0cmluZyIgPj4gb3V0cHV0cy90b3BoYXRfc3RhdHMuY3N2CmBgYAoKIyMjIEhUU2VxIGZvciB0b3BoYXQgaW4gUy5jZXJldmlzaWFlCgpJIHVzdWFsbHkgdXNlIGh0c2VxJ3MgZGVmYXVsdCBwYXJhbWV0ZXJzIGFnYWluc3QgdGhlIHBlcmZlY3RseSBwYWlyZWQgcmVhZHMgd2hlbgptYWtpbmcgY291bnQgdGFibGVzIGZyb20gdG9waGF0IG1hcHBpbmdzLiAgU29tZXRpbWVzIHRoaXMgaXMgYSBiYWQgaWRlYSwgYnV0IGluCnllYXN0IEkgdGhpbmsgaXQgaXMgb2suCgpJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCB3aGVuIHBvc3NpYmxlIChhcyBpdCBpcyBmb3IgdGhlIG1vdXNlIGdlbm9tZSksIEkgZG8Kc2VwYXJhdGUgY291bnRpbmdzIGZvciB0aGUgZm9sbG93aW5nIGZlYXR1cmUgdHlwZXM6CjMnIFVUUnMsIDUnIFVUUnMsIGV4b25zLCByUk5BLCBzblJOQSwgc25vUk5BLCBwc2V1ZG9nZW5lcywgbGluY1JOQSwgbWlSTkEsIE5NRAp0YXJnZXRzLCBpbnRyb25zLCBhbnRpc2Vuc2UgdHJhbnNjcmlwdHMsIHJldGFpbmVkIGludHJvbnMsIGV4b25zLCBnZW5lcywgYW5kCmFsbC4KCkJ1dCBmb3IgeWVhc3QgSSBqdXN0IGRvIHRoZSBzZXQgb2YgYWxsIGFubm90YXRpb25zLCBhcyBpbiBtb3N0IGNhc2VzIHRoYXQgaXMgYWxsIHdlIGNhcmUgYWJvdXQuCgpUaGUgZm9sbG93aW5nIGlzIHByZXByb2Nlc3NpbmcvaHBnbDA1NjQvc2NyaXB0cy8zMmh0YWxsX3NjZXJldmlzaWFlLWhwZ2wwNTY0dHJpbW1lZC5zaAoKYGBge3IgaHRzZXFfdG9waGF0X3NjZXJldmlzaWFlLCBlbmdpbmU9J2Jhc2gnLCBldmFsPUZBTFNFfQojIyBDb3VudGluZyB0aGUgbnVtYmVyIG9mIGhpdHMgaW4gb3V0cHV0cy90b3BoYXRfc2NlcmV2aXNpYWUvYWNjZXB0ZWRfcGFpcmVkLmJhbSBmb3IgZWFjaCBmZWF0dXJlIGZvdW5kIGluIC9jYmNiaG9tZXMvYWJlbGV3L2xpYnJhcmllcy9nZW5vbWUvc2NlcmV2aXNpYWVfYWxsLmd0ZgojIyBJcyB0aGlzIHN0cmFuZGVkPyB5ZXMuICBUaGUgZGVmYXVsdHMgb2YgaHRzZXEgYXJlOgojIyAgLS1vcmRlcj1uYW1lIC0taWRhdHRyPWdlbmVfaWQgLS1taW5hcXVhbD0xMCAtLXR5cGU9ZXhvbiAtLXN0cmFuZGVkPXllcyAtLW1vZGU9dW5pb24KCmh0c2VxLWNvdW50IC1xIC1mIGJhbSAtcyB5ZXMgLWkgSUQgIC10IGV4b24gXAogIG91dHB1dHMvdG9waGF0X3NjZXJldmlzaWFlL2FjY2VwdGVkX3BhaXJlZC5iYW0gL2NiY2Job21lcy9hYmVsZXcvbGlicmFyaWVzL2dlbm9tZS9zY2VyZXZpc2lhZV9hbGwuZ3RmIFwKICAxPm91dHB1dHMvaHRzZXEvYWNjZXB0ZWRfcGFpcmVkX2FsbC5jb3VudCAyPm91dHB1dHMvdG9waGF0X3NjZXJldmlzaWFlL2FjY2VwdGVkX3BhaXJlZF9odHNlcS5lcnIgJiYgXAogICAgeHogLWYgLTllIG91dHB1dHMvaHRzZXEvYWNjZXB0ZWRfcGFpcmVkX2FsbC5jb3VudApgYGAKCiMjIEJvd3RpZTIKCkkgZGlkIGEgbGl0dGxlIHJlYWRpbmcgYW5kIGZvdW5kIHRoZSBmb2xsb3dpbmcgYWJvdXQgaG93IGJvd3RpZTIgc2NvcmVzCm11bHRpLWhpdCByZWFkczoKClRha2VuIGZyb206CltodHRwOi8vYmlvZmlueXNpY3MuYmxvZ3Nwb3QuY29tLzIwMTQvMDUvaG93LWRvZXMtYm93dGllMi1hc3NpZ24tbWFwcS1zY29yZXMuaHRtbCNidDJleHB0XShodHRwOi8vYmlvZmlueXNpY3MuYmxvZ3Nwb3QuY29tLzIwMTQvMDUvaG93LWRvZXMtYm93dGllMi1hc3NpZ24tbWFwcS1zY29yZXMuaHRtbCNidDJleHB0KQoKIkluIGJvd3RpZTIsIHRoZSBiZXN0IGEgdHJ1ZSBtdWx0aXJlYWQgKEFTPVhTKSBjYW4gZ2V0IGlzIE1BUFE9MSByZWdhcmRsZXNzIG9mCmhvdyBsb3cgb3IgaGlnaCBpdHMgbXVsdGlwbGljaXR5LiBUaGlzIG9jY3VycyB3aGVuIHRoZXJlIGFyZSAwIG9yIDEgbWlzbWF0Y2hlcwpvdmVyIHBlcmZlY3QgYmFzZSBjYWxscyBpbiB0aGUgcmVhZCwgb3Igd2hlbiBBUz1YUyBnb2VzIGRvd24gdG8gLTYuIFdoZW4gdGhlcmUKYXJlIDItNSBtaXNtYXRjaGVzIG92ZXIgcGVyZmVjdCBiYXNlIGNhbGxzIChvciB0aGUgQVM9WFMgPD0gLTEyIC0tLS0gaS5lLiAtMTIgdG8KLTMwLjYpLCB0aGUgTUFQUSBiZWNvbWVzIDAuCgpJZiBzb21lb25lIHdhbnRlZCB0byBleGNsdWRlICJ0cnVlIG11bHRpcmVhZHMiIGZyb20gdGhlaXIgZGF0YSBzZXQsIHVzaW5nIE1BUFEKPj0gMiB3b3VsZCB3b3JrLiBUaGlzIHdvdWxkIGFsc28gZXhjbHVkZSBhbnkgdW5pcXVlbHkgbWFwcGluZyByZWFkcyB3aXRoID49NAptaXNtYXRjaGVzIG92ZXIgaGlnaCBxdWFsaXR5IGJhc2VzLiBJbiB0ZXJtcyBvZiBoaWdoIHF1YWxpdHkgYmFzZXMgYW5kIHVuaXJlYWRzLApNQVBRID49IDMgYWxsb3dzIHVwIHRvIDMgbWlzbWF0Y2hlcywgTUFQUSA+PSAyMyBhbGxvd3MgdXAgdG8gMiBtaXNtYXRjaGVzLCBNQVBRCj49IDQwIGFsbG93cyB1cCB0byAxIG1pc21hdGNoLCBhbmQgTUFQUSA+PSA0MiBhbGxvd3MgMCBtaXNtYXRjaGVzLiBUaGVyZSB3aWxsCmFsc28gYmUgb3RoZXIgIm1heGlyZWFkcyIgaW4gbW9zdCBvciBhbGwgb2YgdGhlc2Ugc2V0cy4iCgpUaGlzIGlzIHJlbGV2YW50IGJlY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyBnZW0gaW4gdGhlIG5ld2VzdCB2ZXJzaW9uIG9mIHRoZQpodHNlcS1jb3VudCBkb2N1bWVudGF0aW9uOgoKW2h0dHA6Ly93d3ctaHViZXIuZW1ibC5kZS9IVFNlcS9kb2MvY291bnQuaHRtbF0oaHR0cDovL3d3dy1odWJlci5lbWJsLmRlL0hUU2VxL2RvYy9jb3VudC5odG1sKQoKInNraXAgYWxsIHJlYWRzIHdpdGggYWxpZ25tZW50IHF1YWxpdHkgbG93ZXIgdGhhbiB0aGUgZ2l2ZW4gbWluaW11bSB2YWx1ZQooZGVmYXVsdDogMTAg4oCUIE5vdGU6IHRoZSBkZWZhdWx0IHVzZWQgdG8gYmUgMCB1bnRpbCB2ZXJzaW9uIDAuNS40LikiCgpXaXRoIHRoYXQgaW4gbWluZCwgdGFrZSBhIGxvb2sgYXQgdGhlIGJvd3RpZTIgc2NyaXB0LApUaGUgZm9sbG93aW5nIGlzIHByZXByb2Nlc3Npbmcvc2NyaXB0cy9ocGdsMDU2NC8xNWJ0Ml9zY2VyZXZpc2lhZS1ocGdsMDU2NHRyaW1tZWQuc2gKCmBgYHtyIGJ0Ml9zY2VyZXZpc2lhZSwgZW5naW5lPSdiYXNoJywgZXZhbD1GQUxTRX0KIyMgVGhpcyBpcyBhIGJvd3RpZTIgYWxpZ25tZW50IG9mIGhwZ2wwNTY0X2ZvcndhcmQtdHJpbW1lZC5mYXN0cSBhZ2FpbnN0CiMjIC9jYmNiaG9tZXMvYWJlbGV3L2xpYnJhcmllcy9nZW5vbWUvaW5kZXhlcy9zY2VyZXZpc2lhZSB1c2luZyBhcmd1bWVudHM6ICAtLXZlcnktc2Vuc2l0aXZlIC4KIyMgVGhpcyBqb2JzIGRlcGVuZGVkIG9uOiAxMzE5ODg1LmNiY2JzcnYudW1pYWNzLnVtZC5lZHUKCm1rZGlyIC1wIG91dHB1dHMvYm93dGllMl9zY2VyZXZpc2lhZSAmJiBzbGVlcCAxMCAmJiBib3d0aWUyIC14IC9jYmNiaG9tZXMvYWJlbGV3L2xpYnJhcmllcy9nZW5vbWUvaW5kZXhlcy9zY2VyZXZpc2lhZSAgLS12ZXJ5LXNlbnNpdGl2ZSAgXAogIC1wIDEgXAogIC1xICAgaHBnbDA1NjRfZm9yd2FyZC10cmltbWVkLmZhc3RxICBcCiAgLS11biBvdXRwdXRzL2Jvd3RpZTJfc2NlcmV2aXNpYWUvaHBnbDA1NjQtdHJpbW1lZF91bmFsaWduZWRfc2NlcmV2aXNpYWUuZmFzdHEgXAogIC0tYWwgb3V0cHV0cy9ib3d0aWUyX3NjZXJldmlzaWFlL2hwZ2wwNTY0LXRyaW1tZWRfYWxpZ25lZF9zY2VyZXZpc2lhZS5mYXN0cSBcCiAgLVMgb3V0cHV0cy9ib3d0aWUyX3NjZXJldmlzaWFlL2hwZ2wwNTY0LXRyaW1tZWQuc2FtIFwKICAyPm91dHB1dHMvYm93dGllMl9zY2VyZXZpc2lhZS9ocGdsMDU2NC10cmltbWVkLmVyciBcCiAgMT5vdXRwdXRzL2Jvd3RpZTJfc2NlcmV2aXNpYWUvaHBnbDA1NjQtdHJpbW1lZC5vdXQKYGBgCgojIyMgQ29udmVydGluZyB0byBhbiBpbmRleGVkIHNvcnRlZCBiYW0gYWxpZ25tZW50CgpJIGhhdGUgc2FtIGZpbGVzLCBzbyBJIGltbWVkaWF0ZWx5IGNvbnZlcnQgdGhlbSBiZWZvcmUgY291bnRpbmc6CgpKdXN0IGxpa2Ugd2l0aCB0b3BoYXQsIEkgaGF2ZSBhbiBleHRyYSBzdGVwIHRvIGV4dHJhY3QgdGhlIHByb3Blcmx5IHBhaXJlZAphbGlnbmVkIHJlYWRzLgoKVGhlIGZvbGxvd2luZyBpcwpwcmVwcm9jZXNzaW5nL3NjcmlwdHMvaHBnbDA1NjQvMTlzMmJfYnQyX3NjZXJldmlzaWFlLWhwZ2wwNTY0dHJpbW1lZC5zaGVsbAoKYGBge3IgYnQyX3MyYl9zY2VyZXZpc2lhZSwgZW5naW5lPSdiYXNoJywgZXZhbD1GQUxTRX0KIyMgQ29udmVydGluZyB0aGUgdGV4dCBzYW0gdG8gYSBjb21wcmVzc2VkLCBzb3J0ZWQsIGluZGV4ZWQgYmFtZmlsZS4KIyMgQWxzbyBwcmludGluZyBhbGlnbm1lbnQgc3RhdGlzdGljcyB0byBvdXRwdXRzL2Jvd3RpZTJfc2NlcmV2aXNpYWUvaHBnbDA1NjQtdHJpbW1lZC5iYW0uc3RhdHMKIyMgVGhpcyBqb2IgZGVwZW5kZWQgb246IDEzMjM4ODMuY2JjYnNydi51bWlhY3MudW1kLmVkdQpzYW10b29scyB2aWV3IC11IC10IC9jYmNiaG9tZXMvYWJlbGV3L2xpYnJhcmllcy9nZW5vbWUvc2NlcmV2aXNpYWUuZmFzdGEgXAogIC1TIG91dHB1dHMvYm93dGllMl9zY2VyZXZpc2lhZS9ocGdsMDU2NC10cmltbWVkLnNhbSAtbyBvdXRwdXRzL2Jvd3RpZTJfc2NlcmV2aXNpYWUvaHBnbDA1NjQtdHJpbW1lZC5iYW0gMT5vdXRwdXRzL2Jvd3RpZTJfc2NlcmV2aXNpYWUvaHBnbDA1NjQtdHJpbW1lZC5iYW0ub3V0IDI+JjEKc2FtdG9vbHMgc29ydCAtbCA5IG91dHB1dHMvYm93dGllMl9zY2VyZXZpc2lhZS9ocGdsMDU2NC10cmltbWVkLmJhbSAtbyBvdXRwdXRzL2Jvd3RpZTJfc2NlcmV2aXNpYWUvaHBnbDA1NjQtdHJpbW1lZC1zb3J0ZWQuYmFtIDI+b3V0cHV0cy9ib3d0aWUyX3NjZXJldmlzaWFlL2hwZ2wwNTY0LXRyaW1tZWQtc29ydGVkLmJhbS5vdXQgMT4mMiAmJiBcCiAgcm0gb3V0cHV0cy9ib3d0aWUyX3NjZXJldmlzaWFlL2hwZ2wwNTY0LXRyaW1tZWQuYmFtICYmIFwKICBybSBvdXRwdXRzL2Jvd3RpZTJfc2NlcmV2aXNpYWUvaHBnbDA1NjQtdHJpbW1lZC5zYW0gJiYgXAogIG12IG91dHB1dHMvYm93dGllMl9zY2VyZXZpc2lhZS9ocGdsMDU2NC10cmltbWVkLXNvcnRlZC5iYW0gb3V0cHV0cy9ib3d0aWUyX3NjZXJldmlzaWFlL2hwZ2wwNTY0LXRyaW1tZWQuYmFtICYmIFwKICBzYW10b29scyBpbmRleCBvdXRwdXRzL2Jvd3RpZTJfc2NlcmV2aXNpYWUvaHBnbDA1NjQtdHJpbW1lZC5iYW0gJiYgXAogIHNhbXRvb2xzIHZpZXcgLWIgLWYgMiAtbyBvdXRwdXRzL2Jvd3RpZTJfc2NlcmV2aXNpYWUvaHBnbDA1NjQtdHJpbW1lZC5iYW1fcGFpcmVkLmJhbSBvdXRwdXRzL2Jvd3RpZTJfc2NlcmV2aXNpYWUvaHBnbDA1NjQtdHJpbW1lZC5iYW0gJiYgXAogIHNhbXRvb2xzIGluZGV4IG91dHB1dHMvYm93dGllMl9zY2VyZXZpc2lhZS9ocGdsMDU2NC10cmltbWVkLmJhbV9wYWlyZWQuYmFtCmJhbXRvb2xzIHN0YXRzIC1pbiBvdXRwdXRzL2Jvd3RpZTJfc2NlcmV2aXNpYWUvaHBnbDA1NjQtdHJpbW1lZC5iYW0gMj5vdXRwdXRzL2Jvd3RpZTJfc2NlcmV2aXNpYWUvaHBnbDA1NjQtdHJpbW1lZC5iYW0uc3RhdHMgMT4mMiAmJiBcCiAgYmFtdG9vbHMgc3RhdHMgLWluIG91dHB1dHMvYm93dGllMl9zY2VyZXZpc2lhZS9ocGdsMDU2NC10cmltbWVkLmJhbV9wYWlyZWQuYmFtIDI+b3V0cHV0cy9ib3d0aWUyX3NjZXJldmlzaWFlL2hwZ2wwNTY0LXRyaW1tZWQuYmFtX3BhaXJlZC5iYW0uc3RhdHMgMT4mMgpgYGAKCiMjIyBDb3VudGluZyB0aGUgYm93dGllMiByZXN1bHRzCgpgYGB7ciBidDJfaHRzZXFfc2NlcmV2aXNpYWUsIGVuZ2luZT0nYmFzaCcsIGV2YWw9RkFMU0V9CiMjIENvdW50aW5nIHRoZSBudW1iZXIgb2YgaGl0cyBpbiBvdXRwdXRzL2Jvd3RpZTJfc2NlcmV2aXNpYWUvaHBnbDA1NjQtdHJpbW1lZC5iYW0gZm9yIGVhY2ggZmVhdHVyZSBmb3VuZCBpbiAvY2JjYmhvbWVzL2FiZWxldy9saWJyYXJpZXMvZ2Vub21lL3NjZXJldmlzaWFlLmdmZgojIyBJcyB0aGlzIHN0cmFuZGVkPyB5ZXMuICBUaGUgZGVmYXVsdHMgb2YgaHRzZXEgYXJlOgojIyAgLS1vcmRlcj1uYW1lIC0taWRhdHRyPWdlbmVfaWQgLS1taW5hcXVhbD0xMCAtLXR5cGU9ZXhvbiAtLXN0cmFuZGVkPXllcyAtLW1vZGU9dW5pb24KCmh0c2VxLWNvdW50IC1xIC1mIGJhbSAtcyB5ZXMgIC1pIElEICAtdCBleG9uIFwKICBvdXRwdXRzL2Jvd3RpZTJfc2NlcmV2aXNpYWUvaHBnbDA1NjQtdHJpbW1lZC5iYW0gL2NiY2Job21lcy9hYmVsZXcvbGlicmFyaWVzL2dlbm9tZS9zY2VyZXZpc2lhZS5nZmYgXAogIDE+b3V0cHV0cy9ib3d0aWUyX3NjZXJldmlzaWFlL2hwZ2wwNTY0LXRyaW1tZWQuY291bnQgMj5vdXRwdXRzL2Jvd3RpZTJfc2NlcmV2aXNpYWUvaHBnbDA1NjQtdHJpbW1lZF9odHNlcS5lcnIgJiYgXAogICAgeHogLWYgLTllIG91dHB1dHMvYm93dGllMl9zY2VyZXZpc2lhZS9ocGdsMDU2NC10cmltbWVkLmNvdW50CmBgYAo=