Introduction

To get to this notebook please navigate your browser to 10x-tutorial/Jax_Workshop.nb.html on the web UI

The purpose of this tutorial will be to walk new users through some of the steps necessary to explore Whole Genome (WGS) and Whole Exome (WES) sequencing data generated form the 10x Genomics Chromium platform and the Longranger pipeline. We will investigate the Linked-Read data using a variety of tools, all of which are freely available either from 10x Genomics or their home repos (GitHub, SourceForge, etc.)

Things to know about this workshop

  1. All files that will be used can be found at: /opt/data/10x-data/
  2. The 10x Loupe browser can be found at your “Homepage”
  3. Reference genome for all samples is GRCh37/hg19
  4. .bam files are only for chr21
  5. .vcf and Loupe files contain information for the entire genome
  6. Full data sets are available on the Longranger Datasets Site
  7. All 10x software including Longranger, Supernova, and Loupe can be downloaded from the 10x Support Site

10x Chromium Workflow Overview

Figure 1. Chromium Genome Workflow

User Instances

Username IP Terminal Loupe RStudio Download Files
Aamir Zuberi 35.171.228.183 terminal loupe rstudio download files
Adam Phillippy 35.170.196.79 terminal loupe rstudio download files
Alex Dainis 54.236.59.78 terminal loupe rstudio download files
Amit Gujar 35.173.49.255 terminal loupe rstudio download files
Andrew Xiao 35.170.72.157 terminal loupe rstudio download files
Anil Kesarwani 34.205.15.78 terminal loupe rstudio download files
Ankit Malhotra 34.201.15.118 terminal loupe rstudio download files
Anne Deslattes Mays 18.204.35.185 terminal loupe rstudio download files
Anuj Srivastava 34.205.75.209 terminal loupe rstudio download files
AYSE OZEL 34.234.215.157 terminal loupe rstudio download files
Ben Clifford 34.237.137.212 terminal loupe rstudio download files
Bo Zhang 18.205.2.171 terminal loupe rstudio download files
Bony De Kumar 54.173.122.13 terminal loupe rstudio download files
Brent Graveley 34.205.93.225 terminal loupe rstudio download files
Byoungkoo Lee 34.200.225.183 terminal loupe rstudio download files
Candice Byers 34.201.205.236 terminal loupe rstudio download files
Chen Shen 34.231.240.33 terminal loupe rstudio download files
Chong Chu 34.237.136.250 terminal loupe rstudio download files
Chris Boles 34.205.26.80 terminal loupe rstudio download files
Chris Seidel 54.236.62.252 terminal loupe rstudio download files
Christian Meekins 34.239.240.114 terminal loupe rstudio download files
Christine Beck 52.3.235.171 terminal loupe rstudio download files
Daniel Campo 34.201.55.187 terminal loupe rstudio download files
Denisse Tafur 35.153.126.118 terminal loupe rstudio download files
Diogo Troggian-Veiga 35.171.133.51 terminal loupe rstudio download files
Elaheh Ahmadzadeh 18.204.214.246 terminal loupe rstudio download files
Eric Wong 35.172.240.182 terminal loupe rstudio download files
Ernst Reichenberger 34.205.85.245 terminal loupe rstudio download files
Eunhee Yi 52.73.165.237 terminal loupe rstudio download files
Eva Gega 34.200.234.64 terminal loupe rstudio download files
Feng Chen 34.201.2.247 terminal loupe rstudio download files
Feng Yue 18.205.7.219 terminal loupe rstudio download files
Feng Yue 34.237.222.235 terminal loupe rstudio download files
Guru Ananda 34.201.35.15 terminal loupe rstudio download files
Hagen Tilgen 34.231.171.191 terminal loupe rstudio download files
Harshpreet Chandok 54.175.218.134 terminal loupe rstudio download files
Hayk Barseghyan 18.204.247.173 terminal loupe rstudio download files
Hongbo Yang 18.204.35.6 terminal loupe rstudio download files
Hoon Kim 35.170.62.171 terminal loupe rstudio download files
Jan Chao 18.232.168.186 terminal loupe rstudio download files
Jeremiah Miller 34.205.135.251 terminal loupe rstudio download files
Jihe Liu 34.205.172.217 terminal loupe rstudio download files
Jonas Korlach 18.232.137.67 terminal loupe rstudio download files
Julia Oh 34.239.228.205 terminal loupe rstudio download files
Jun Zhou 34.200.227.113 terminal loupe rstudio download files
Justin O'Grady 52.3.233.16 terminal loupe rstudio download files
Justin Zook 18.205.7.81 terminal loupe rstudio download files
Kai Wang 34.200.221.18 terminal loupe rstudio download files
Kevin Johnson 35.172.209.237 terminal loupe rstudio download files
KUN ZHU 35.172.240.22 terminal loupe rstudio download files
Lili Sun 35.170.79.62 terminal loupe rstudio download files
Lucas Lochovsky 35.170.61.170 terminal loupe rstudio download files
Marina Yurieva 18.233.93.9 terminal loupe rstudio download files
Matt McNeill 52.3.234.137 terminal loupe rstudio download files
Maximiliano Presa 54.236.39.16 terminal loupe rstudio download files
Mei-Ju Chen 35.172.110.241 terminal loupe rstudio download files
Meizhen Zheng 34.234.207.188 terminal loupe rstudio download files
Melanie Herscovitch 34.205.134.116 terminal loupe rstudio download files
Michael Micorescu 52.73.208.205 terminal loupe rstudio download files
Michael Schatz 18.204.247.49 terminal loupe rstudio download files
Michael Weiand 54.236.60.125 terminal loupe rstudio download files
Miten Jain 54.209.50.228 terminal loupe rstudio download files
Nancy Groot 34.236.237.253 terminal loupe rstudio download files
Nathan Roach 34.238.28.255 terminal loupe rstudio download files
Neil Kindlon 34.231.225.10 terminal loupe rstudio download files
Olajide Abiola 34.205.203.151 terminal loupe rstudio download files
Parithi Balachandran 34.205.15.124 terminal loupe rstudio download files
Peng Liu 35.170.58.0 terminal loupe rstudio download files
Peter Castaldi 34.236.249.62 terminal loupe rstudio download files
Qianchang Wang 18.232.146.227 terminal loupe rstudio download files
QIhui Zhu 35.172.236.156 terminal loupe rstudio download files
Raman Nelakanti 18.205.7.111 terminal loupe rstudio download files
RAVI PANDEY 54.236.243.190 terminal loupe rstudio download files
Robert Sebra 18.232.133.158 terminal loupe rstudio download files
Roberto Lleras 54.236.35.111 terminal loupe rstudio download files
Roel Verhaak 54.236.35.201 terminal loupe rstudio download files
Rupesh Kesharwani 52.203.19.74 terminal loupe rstudio download files
Ryan Lynch 34.238.248.126 terminal loupe rstudio download files
Samir Amin 18.232.178.160 terminal loupe rstudio download files
Sandeep Namburi 34.201.24.230 terminal loupe rstudio download files
Seda Arat 34.234.215.246 terminal loupe rstudio download files
Shaopeng Liu 35.170.67.126 terminal loupe rstudio download files
Shengdong Ke 34.200.237.246 terminal loupe rstudio download files
Silvia Liu 34.232.210.183 terminal loupe rstudio download files
Stephen Williams 34.236.243.113 terminal loupe rstudio download files
Su Wang 34.200.255.170 terminal loupe rstudio download files
SungHee Park 52.205.234.107 terminal loupe rstudio download files
Sven Bocklandt 34.236.254.26 terminal loupe rstudio download files
Tanisha Jackson 34.200.251.96 terminal loupe rstudio download files
Tanmoy Bhattacharyya 35.153.49.200 terminal loupe rstudio download files
Towfique Raj 34.205.29.77 terminal loupe rstudio download files
Uma Arora 34.236.249.145 terminal loupe rstudio download files
Winston Timp 35.170.198.82 terminal loupe rstudio download files
Xiaoqing Han 54.236.37.122 terminal loupe rstudio download files
Y. Ada Zhan 34.237.220.204 terminal loupe rstudio download files
Ya-Ting Chang 35.170.33.56 terminal loupe rstudio download files
Yanfen Zhu 34.201.35.58 terminal loupe rstudio download files
Yang Chen 18.204.214.203 terminal loupe rstudio download files
Yang Wang 34.201.8.99 terminal loupe rstudio download files
Yijun Ruan 54.89.46.87 terminal loupe rstudio download files
Yun-Suhk Suh 34.201.14.198 terminal loupe rstudio download files
Zhihui Li 34.201.35.254 terminal loupe rstudio download files
Zhonghui Tang 34.234.236.202 terminal loupe rstudio download files
Zhongyuan Tian 34.200.219.236 terminal loupe rstudio download files
Zi-Ming Zhao 35.170.59.130 terminal loupe rstudio download files
user 1 34.200.226.34 terminal loupe rstudio download files
user 2 34.205.177.25 terminal loupe rstudio download files
user 3 34.239.233.137 terminal loupe rstudio download files
user 4 18.204.42.127 terminal loupe rstudio download files
user 5 34.239.228.80 terminal loupe rstudio download files
user 6 34.201.20.20 terminal loupe rstudio download files
user 7 34.237.0.203 terminal loupe rstudio download files
user 8 34.237.223.43 terminal loupe rstudio download files
user 9 35.170.72.240 terminal loupe rstudio download files
user 10 34.200.249.222 terminal loupe rstudio download files

Other ways to SSH into the instances
Open the terminal and type the following command substituting 'ip_address' for the IP address that was assigned to you above.
ssh ubuntu@ip_address
 username: ubuntu
 password: jgm2018

Logging in: Jax Workshow AWS instance

Instructors will take care of this

Once you’ve logged in your home directory should look like this

cd /home/ubuntu
sequser@ip-172-31-63-156:/home/ubuntu$ ls -l
total 36
drwxrwxr-x  2 ubuntu ubuntu 4096 Apr  2 17:44 10x-bam-files
drwxrwxr-x  2 ubuntu ubuntu 4096 Apr 10 21:34 10x-loupe-files
drwxrwxr-x  2 ubuntu ubuntu 4096 Apr 11 06:21 10x-tutorial
drwxrwxr-x  2 ubuntu ubuntu 4096 Apr 11 16:35 10x-vcf-files
drwxrwxr-x  2 ubuntu ubuntu 4096 Apr 11 16:20 figures
drwxrwxr-x  3 ubuntu ubuntu 4096 Mar 30 21:02 igv
drwxrwxr-x 15 ubuntu ubuntu 4096 Apr  2 18:33 miniconda2
drwxrwxr-x  2 ubuntu ubuntu 4096 Mar 30 17:38 misc
drwxr-xr-x  3 ubuntu ubuntu 4096 Apr 11 14:23 R

On Windows you’ll probably need an application like PuTTy

Getting Started 10x

Okay, you’ve done your Chromium prep, sent it through your favorite Illumina (or BGI) sequencer and now you’ve got a BCL file. What’s next?

BCL to FASTQ

The instructions to convert BCL to FASTQ can be found here

An example bcl to do some testing on can be found in /opt/data/10x-data/tiny-bcl-2.0.0

Let’s do the conversion

nohup longranger mkfastq --id=tiny-bcl \
                   --run=/opt/data/10x-data/tiny-bcl-2.0.0 \
                   --csv=/opt/data/10x-data/tiny-bcl-simple-2.1.0.csv \
                   --localmem=4 >& mkftq.out &

You should see something like this as the output. Note: All 10x pipelines run under the Martian Framework. In the 10x universe a pipeline is the software you run (e.g.. Longranger) and a pipestance is the functional directory that is created that the pipeline uses while it’s running.

longranger mkfastq (2.2.2)
Copyright (c) 2018 10x Genomics, Inc.  All rights reserved.
-------------------------------------------------------------------------------

Martian Runtime - '2.2.2-2.3.2'
Serving UI at http://bespin1.fuzzplex.com:35831

Running preflight checks (please wait)...
Checking run folder...
Checking RunInfo.xml...
Checking system environment...
Checking barcode whitelist...
Checking read specification...
Checking samplesheet specs...
Checking for dual index flowcell...
2018-04-11 13:09:16 [runtime] (ready)           ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.PREPARE_SAMPLESHEET
2018-04-11 13:09:19 [runtime] (split_complete)  ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.PREPARE_SAMPLESHEET
2018-04-11 13:09:19 [runtime] (run:local)       ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.PREPARE_SAMPLESHEET.fork0.chnk0.main
2018-04-11 13:09:25 [runtime] (chunks_complete) ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.PREPARE_SAMPLESHEET
2018-04-11 13:09:28 [runtime] (join_complete)   ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.PREPARE_SAMPLESHEET
2018-04-11 13:09:31 [runtime] (ready)           ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.BCL2FASTQ_WITH_SAMPLESHEET
2018-04-11 13:09:31 [runtime] (run:local)       ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.BCL2FASTQ_WITH_SAMPLESHEET.fork0.split
2018-04-11 13:09:34 [runtime] (split_complete)  ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.BCL2FASTQ_WITH_SAMPLESHEET
2018-04-11 13:09:34 [runtime] (run:local)       ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.BCL2FASTQ_WITH_SAMPLESHEET.fork0.chnk0.main
2018-04-11 13:10:07 [runtime] (chunks_complete) ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.BCL2FASTQ_WITH_SAMPLESHEET
2018-04-11 13:10:07 [runtime] (run:local)       ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.BCL2FASTQ_WITH_SAMPLESHEET.fork0.join
2018-04-11 13:10:10 [runtime] (join_complete)   ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.BCL2FASTQ_WITH_SAMPLESHEET
2018-04-11 13:10:13 [runtime] (ready)           ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.MAKE_QC_SUMMARY
2018-04-11 13:10:13 [runtime] (run:local)       ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.MAKE_QC_SUMMARY.fork0.split
2018-04-11 13:10:19 [runtime] (split_complete)  ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.MAKE_QC_SUMMARY
2018-04-11 13:10:19 [runtime] (run:local)       ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.MAKE_QC_SUMMARY.fork0.chnk0.main
2018-04-11 13:10:19 [runtime] (run:local)       ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.MAKE_QC_SUMMARY.fork0.chnk1.main
2018-04-11 13:10:19 [runtime] (run:local)       ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.MAKE_QC_SUMMARY.fork0.chnk2.main
2018-04-11 13:10:19 [runtime] (run:local)       ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.MAKE_QC_SUMMARY.fork0.chnk3.main
2018-04-11 13:11:49 [runtime] (chunks_complete) ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.MAKE_QC_SUMMARY
2018-04-11 13:11:49 [runtime] (run:local)       ID.tiny-bcl.MAKE_FASTQS_CS.MAKE_FASTQS.MAKE_QC_SUMMARY.fork0.join

Outputs:
- Run QC metrics:        /mnt/home/stephen/yard/Jax_workshop/Longranger/tiny-bcl/outs/qc_summary.json
- FASTQ output folder:   /mnt/home/stephen/yard/Jax_workshop/Longranger/tiny-bcl/outs/fastq_path
- Interop output folder: /mnt/home/stephen/yard/Jax_workshop/Longranger/tiny-bcl/outs/interop_path
- Input samplesheet:     /mnt/home/stephen/yard/Jax_workshop/Longranger/tiny-bcl/outs/input_samplesheet.csv

Waiting 6 seconds for UI to do final refresh.
Pipestance completed successfully!

Saving pipestance info to tiny-bcl/tiny-bcl.mri.tgz

Your fastqs will be in the flowcell directory H77WWBBXX. All undetermined reads are stored in the ‘Undetermined’ fastqs. These can be automatically deleted by running longranger mkfastq with the --delete-undetermined flag.

Alignment

You’ve got your fastqs made. Let’s do a small alignment. Even though 10x currently recommends using GATK for Longranger alignments freebayes is already baked in so we’ll use that for our example.

Note: The reasons for using GATK over freebayes are many but it boils down to better variant calling and Indel sensitivity/specificity which, among other things, leads to better phasing. This can have downstream effects on SV calling as well. A detailed report of the latest version of Longranger and the advantages that GATK provides over freebayes can be found on bioRxiv.

nohup longranger wgs --id=Sample_example \
                 --fastqs=/mnt/home/stephen/yard/Jax_workshop/Longranger/tiny-bcl/outs/fastq_path/H77WWBBXX/Sample \
                 --reference=/mnt/opt/refdata_new/hg19-2.2.0/ \
                 --localmem=4
                 --vcmode=freebayes >& wgs.out &

Your output should look something like this as it runs. Make sure to check out the UI where your pipestance is running. This is an interactive workflow that has lots of information contained within it.

longranger wgs (2.2.2)
Copyright (c) 2018 10x Genomics, Inc.  All rights reserved.
-------------------------------------------------------------------------------

Martian Runtime - '2.2.2-2.3.2'
Serving UI at http://bespin1.fuzzplex.com:41335?auth=tRqwdXhvQ8vlyWHd6os8ccZ2GXgzYuDKfdYQaxnkZn0

Running preflight checks (please wait)...
2018-04-11 13:31:41 [runtime] (ready)           ID.Sample_example.PHASER_SVCALLER_CS.PHASER_SVCALLER._COMBINED_SV_CALLER._TERMINAL_CNV_CALLER.PREPARE_TERMINAL_CNV_GT_AND_BINSIZE
2018-04-11 13:31:41 [runtime] (ready)           ID.Sample_example.PHASER_SVCALLER_CS.PHASER_SVCALLER._SNPINDEL_PHASER.SORT_GROUND_TRUTH
2018-04-11 13:31:44 [runtime] (ready)           ID.Sample_example.PHASER_SVCALLER_CS.PHASER_SVCALLER._LINKED_READS_ALIGNER._FASTQ_PREP_NEW.SETUP_CHUNKS
2018-04-11 13:31:44 [runtime] (split_complete)  ID.Sample_example.PHASER_SVCALLER_CS.PHASER_SVCALLER._SNPINDEL_PHASER.SORT_GROUND_TRUTH
2018-04-11 13:31:44 [runtime] (run:local)       ID.Sample_example.PHASER_SVCALLER_CS.PHASER_SVCALLER._SNPINDEL_PHASER.SORT_GROUND_TRUTH.fork0.chnk0.main
2018-04-11 13:31:44 [runtime] (split_complete)  ID.Sample_example.PHASER_SVCALLER_CS.PHASER_SVCALLER._COMBINED_SV_CALLER._TERMINAL_CNV_CALLER.PREPARE_TERMINAL_CNV_GT_AND_BINSIZE
2018-04-11 13:31:44 [runtime] (run:local)       ID.Sample_example.PHASER_SVCALLER_CS.PHASER_SVCALLER._COMBINED_SV_CALLER._TERMINAL_CNV_CALLER.PREPARE_TERMINAL_CNV_GT_AND_BINSIZE.fork0.chnk0.main

Example Pipestance

Figure 2. Example WGS pipestance. Each bubble is an analysis stage and all lines represent passage of data from one state to another. Whenever possible stages are broken into chunks to allow for parallel processing of data.


Longranger Outputs

The 10x .bam

General 10x .bam information

The 10x/Linked-Read .bam file contains much of the same information that a typical short read .bam would, but like the VCF has some extra information. Documents covering the the 10x .bam spec can be found here

If we take a look we can see some interesting features:

cd /home/ubuntu/10x-bam-files
samtools view -h NA12878_chr21_phased_possorted_exome_bam.bam | less
@PG     ID:lariat       PN:longranger.lariat    CL:lariat -reads=/mnt/analysis/marsoc/pipestances/HGKNJBBXX/PHASER_SVCALLER_EXOME_PD/49255/1016.1.1-0/PHASER_SVCALLER_EXOME_PD/PHASER_SVCALLER_EXOME/_LINKED_READS_ALIGNER/_FASTQ_PREP_NEW/SORT_FASTQS/fork0/join-u29c07c9de1/fi
les/chunk-0.fasth.gz -read_groups=49255:MissingLibrary:1:unknown_fc:0 -genome=/mnt/opt/refdata_new/hg19-2.0.0/fasta/genome.fa -sample_id=49255 -threads=4 -centromeres=/mnt/opt/refdata_new/hg19-2.0.0/regions/centromeres.tsv -trim_length=7 -first_chunk=True -output=/mnt/ana
lysis/marsoc/pipestances/HGKNJBBXX/PHASER_SVCALLER_EXOME_PD/49255/1016.1.1-0/PHASER_SVCALLER_EXOME_PD/PHASER_SVCALLER_EXOME/_LINKED_READS_ALIGNER/BARCODE_AWARE_ALIGNER/fork0/chnk000-u29c07c9e62/files VN:'576387f'
@PG     ID:attach_phasing       PN:longranger.attach_phasing    PP:lariat       VN:1016.1.1
@PG     ID:longranger   PN:longranger   PP:attach_phasing       VN:1016.1.1
@CO     10x_bam_to_fastq:R1(RX:QX,TR:TQ,SEQ:QUAL)
@CO     10x_bam_to_fastq:R2(SEQ:QUAL)
@CO     10x_bam_to_fastq:I1(BC:QT)
ST-K00126:334:HGKNJBBXX:4:2118:26920:14519      163     chr21   9412940 39      92M8S   =       9412953 90      GGAGTTGTATTGGTGCAGGAAGGGGAGTTTGATTTAATGAAACAATGCATTAAAAATTTGTATTCACTTTGTGATTCAATGATAGTCAATGTTAACATAA    AAA<FAJFFJJJJJJJJJJFJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
JJJJJJJJFAFF<FJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ    RX:Z:GACACATCAGCTGTTA   QX:Z:AAFFFJJJJJJJJJJJ   BC:Z:TCTCGGGC   QT:Z:AAFFFJJJ   XS:i:-13        AS:i:-9 XM:A:0  AM:A:0  XT:i:0  BX:Z:GACACATCAGCTGTTA-1 RG:Z:49255:MissingLibrary:1:unknown_fc:0        OM:i:39
ST-K00126:334:HGKNJBBXX:4:2118:26920:14519      83      chr21   9412953 39      77M     =       9412940 -90     TGCAGGAAGGGGAGTTTGATTTAATGAAACAATGCATTAAAAATTTGTATTCACTTTGTGATTCAATGATAGTCAAT   FJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJFJJJJJJ
RX:Z:GACACATCAGCTGTTA   QX:Z:AAFFFJJJJJJJJJJJ   TR:Z:TGTTAAC    TQ:Z:JJJJJJJ    BC:Z:TCTCGGGC   QT:Z:AAFFFJJJ   XS:i:-13        AS:i:-9 XM:A:0  AM:A:0  XT:i:0  BX:Z:GACACATCAGCTGTTA-1 RG:Z:49255:MissingLibrary:1:unknown_fc:0        OM:i:39
ST-K00126:334:HGKNJBBXX:4:1114:32644:45010      99      chr21   9413248 39      77M     =       9413263 115     TGAATATTTTCTCAGCAACTGTGGTGTTATGATATATATTGGTTTTCATCCCCAGTTCCTGGCTTATAACTCCCCTA   FF<J<FJJJ-J<JFAJFJJAJ-A-<7<A--FJ-AJJJFFFFJF-<FFF-F--7A<FF-<AF<JA-A-JJ-<<7FFF<
RX:Z:NAGGGTGAGGCATGGT   QX:Z:#<<AAFFJJFJJA<J<   TR:Z:TTCCGCA    TQ:Z:<FJJJFA    BC:Z:TCTCGGGC   QT:Z:AAAFFJJJ   XS:i:-12        AS:i:-8 XM:A:0  AM:A:0  XT:i:0  BX:Z:AAGGGTGAGGCATGGT-1 RG:Z:49255:MissingLibrary:1:unknown_fc:0        OM:i:39

Things to look for:

  • BX tag such as BX:Z:GACACATCAGCTGTTA-1
    • Barcode associated with a tag

Note: Definitions of all the .bam tags can be found here

Informatics Tip: if you’d like to search for all the reads associated with a list of barcodes, this is the fastest way to do it (will need ripgrep which is installed on your AWS instance)

samtools view -@ 5 possorted_exome_bam.bam | rg -j 5 --no-line-number -F -f BX_list.txt > BC_reads.sam





Some 10x users have also asked about local de novo assembly of a locus of interest. An example workflow for that (completely unsupported) workflow can be found here.

This browser does not support PDFs. Please download the PDF to view it: Download PDF.


The 10x VCF

Special aspects

There are a few things that that make the 10x VCF unique. Overall 10x abides by the VCF 4.x standard. However, there is some additional information that takes advantage of the 10x specific technology. Documents covering the the 10x VCF spec can be found here. A comprehensive list of the available outputs of Longranger can be found here.

If we navigate to a 10x VCF and have a look

cd /home/ubuntu/10x-vcf-files
ubuntu@ip-172-31-63-156:~/10x-vcf-files$ ls
total 1014M
-rw-rw-r-- 1 ubuntu ubuntu  43M Apr 11 16:34 NA12878_wes_varcalls.vcf.gz
-rw-rw-r-- 1 ubuntu ubuntu 882K Apr 11 16:34 NA12878_wes_varcalls.vcf.gz.tbi
-rw-rw-r-- 1 ubuntu ubuntu 968M Apr  2 18:46 NA12878_wgs_varcalls.vcf.gz
-rw-rw-r-- 1 ubuntu ubuntu 1.9M Apr  2 18:42 NA12878_wgs_varcalls.vcf.gz.tbi
zcat NA12878_wes_varcalls.vcf.gz | less

#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  49255
chr1    12198   .       G       C       1355.77 PASS    AC=2;AF=1.0;AN=2;BaseQRankSum=0.132;ClippingRankSum=0.0;DP=42;ExcessHet=3.0103;FS=0.0;MLEAC=2;MLEAF=1.0;MQ=53.23;MQRankSum=1.593;QD=32.28;ReadPosRankSum=1.653;SOR=0.286;MUMAP_REF=3.73913;MUMAP_ALT=24.775;AO=34;RO=0
;MMD=0.885642;RESCUED=1;NOT_RESCUED=102;HAPLOCALLED=0     GT:AD:DP:GQ:PL:BX:PS    1|1:1,41:42:92:1384,92,0:,AACTCCCTCTTGGTAG-1_74;TTGCGTCAGACGCCCT-1_74;GTACATGAGGTGCGTA-1_65;TAAGGCTCAAGGGTGT-1_74;CACAGTACACATTGGT-1_74_74;GCAAACTGTAAACGGC-1_70;CGGATTATCTGAACTG-1_70;ATGCA
ACTCTCCCAAC-1_60;CATCGGGTCATAACCG-1_74;ACACAACAGAGAGGCG-1_74;GTAGTCAAGGCCGAAT-1_74;TGCATCCTCGTCTGAA-1_74;ATCATGGTCATCGAGT-1_70;CAGCTAACAAGAGTCG-1_60_70;GGGCCATTCTACAAGC-1_55;GTGACCGTCACAGCCG-1_70;GTTTCATGTACGAGAC-1_74;TTAGTCTAGCTAAGTA-1_74_55_74;GTCGACGCACTAAGGG-1_74;GC
GCTGAAGCGATTAA-1_45;TGCAACAGTTCTGTTT-1_70;GGCAACCAGAGACTAT-1_70;CGCACTTTCCATCGTC-1_74_74;GGCGACTAGCGTGTGA-1_74;TAGGCGCCAGGTCAAG-1_74;TGCTAAGAGGTTTCGT-1_74_74;GTCCTCATCTTCCTTC-1_74;ACTGAGTGTCCATTGA-1_74:12198
chr1    12305   .       C       T       18.82   PASS    AC=1;AF=0.5;AN=2;BaseQRankSum=1.097;ClippingRankSum=0.0;DP=12;ExcessHet=3.0103;FS=0.0;MLEAC=1;MLEAF=0.5;MQ=51.41;MQRankSum=-0.23;QD=1.71;ReadPosRankSum=-0.253;SOR=0.086;MUMAP_REF=13.6977;MUMAP_ALT=15.6667;AO=2;RO=9;MMD=0.901709;RESCUED=0;NOT_RESCUED=49;HAPLOCALLED=0      GT:AD:DP:GQ:PL:BX:PS:PQ:JQ      0/1:9,2:11:47:47,0,315:TTAGTCTAGCTAAGTA-1_70;GTCGACGCACTAAGGG-1_74;ACCACGGCATACAGAA-1_55;ACACAACAGAGAGGCG-1_70;TGCATCCTCGTCTGAA-1_65;CGCACTTTCCATCGTC-1_74;ACTGGGCGTCCATCCT-1_74;GTGCTCTCAAGTACAA-1_70;GGCGACTAGCGTGTGA-1_70,GTAGTCAAGGCCGAAT-1_74;ATCATGGTCATCGAGT-1_74:1:10:255
chr1    12383   .       G       A       172.74  PASS    AC=1;AF=0.5;AN=2;BaseQRankSum=-0.674;ClippingRankSum=0.0;DP=9;ExcessHet=3.0103;FS=6.021;MLEAC=1;MLEAF=0.5;MQ=49.26;MQRankSum=0.887;QD=21.59;ReadPosRankSum=-0.489;SOR=2.526;MUMAP_REF=7.0;MUMAP_ALT=26.4706;AO=8;RO=0;MMD=0.898793;RESCUED=0;NOT_RESCUED=21;HAPLOCALLED=0       GT:AD:DP:GQ:PL:BX:PS:PQ:JQ      1|0:1,7:8:6:200,0,6:,GAAATGAAGTTTCTTC-1_60;ACCACGGCATACAGAA-1_74;TTGCGTCAGACGCCCT-1_74;AGGAGACCATGTATGC-1_55;TGCATCCTCGTCTGAA-1_74;GCAAACTGTAAACGGC-1_70;GACGCGTGTCCTCGGA-1_45;TCCATCGAGGGCGAAG-1_70:1:44:36

Not only do you see some of the typical things

  • chr, pos
  • REF, ALT
  • QUAL
  • FILTER
    • PASS
    • Reason for filtering

You can also see some of the extra 10x “stuff”. Mostly in the FORMAT field

  • BX
    • Barcodes of reads associated with an given variant
    • First set of ; separated barcodes cover the first allele followed by a , which separates barcodes associated with reads covering the second allele
  • PS
    • phase set
      • Information about the phase block for with the variant is assigned

This extra information can be very useful for looking at variants that may or may not be in cis or trans. This can be especially useful if you have compound heterozygote variants. All the alleles on one side of the separator (|) with the same PS are from the same haplotype (thus same parent).

Note: For GT, | represents a phased variant \ represents an unphased variant. Definitions of all the VCF tags are available here

Informatics Tip: If have a variant of interest and you’d like to look at all the SNPs within the same phaseblock (for example chr16 2042353 in NA12878_wes_varcalls.vcf.gz) you you can simply run

  • zcat NA12878_wes_varcalls.vcf.gz | rg '1308074'

This will output all called SNPs, both filtered and unfiltered, that land in the paseblock of interest. SNPs with the same PS number are in cis with each other. This is very informative when you have a potential compound variant.

The 10x VCF is fully compatible with downstream analysis tools such as Variant Effect Predictor, snpEFF, and Gemini to name a few.


Exploring 10x Data

Exploring the 10x data via Integrated Geonome Browser (IGV) from the Broad Institute

IGV is one of the most common tools used in the field of genomics to view a variety of different data types. If you do not have IGV (on your laptop not your terminal), or don’t have the latest version (2.4), please download and install it from either home-brew brew install igv or conda conda install igv. If you don’t use conda or home-brew IGV can be manually install here: https://software.broadinstitute.org/software/igv/download.

Note: Type which igv will show you where IGV has been installed. You can navigate to that directory and click on igv.jar.

First open IGV and load the 10x data. There are two .bam files that can be explored. Here’s a snapshot of the 10x-bam-files directory

ubuntu@ip-172-31-63-156:~/10x-bam-files$ ls /home/ubuntu/10x-bam-files
total 1.3G
-rw-rw-r-- 1 ubuntu ubuntu  64M Apr  2 17:37 NA12878_chr21_phased_possorted_exome_bam.bam
-rw-rw-r-- 1 ubuntu ubuntu  83K Apr  2 17:37 NA12878_chr21_phased_possorted_exome_bam.bam.bai
-rw-rw-r-- 1 ubuntu ubuntu 1.2G Apr  2 17:41 NA12878_chr21_phased_possorted_WGS_bam.bam
-rw-rw-r-- 1 ubuntu ubuntu 116K Apr  2 17:37 NA12878_chr21_phased_possorted_WGS_bam.bam.bai
-rw-rw-r-- 1 ubuntu ubuntu  891 Apr  2 17:44 README.md

In order to load one of the .bam files follow the following steps.

  1. Navigate your browser to /10x-bam-files/ directory on the ftp
  2. Copy the link address for one of the .bam files
  3. Open IGV
  4. Click File -> Load from URL
    • Do the same thing for the corresponding .vcf.gz if you’d like
  5. Paste the copied link address into the first box (you will not need to paste anything into the second box)
  6. Navigate to your favorite gene on chr21
    • Maybe CBS

Depending on what view you are in you might see reads paired in a variety of different ways. To show some of the special features of the 10x data:

  1. Right click on the cell to the left ending in “bam.bam”
  2. Select “View linked reads (BX)”

To view the benefit of phasing navigate to chr21:44,485,330-44,485,370

This will order the reads by barcode and, if possible, show phasing of the region that you are investigating. Groups of reads will be “linked” to each other by the individual barcodes associated with the single molecule that the reads originated from. The reads and barcodes will also be separated into phased haplotypes 1 (red) and 2 (blue). Those reads that could not be phased are represented by grey lines. These unphased reads are still useful and are utilized in most steps of Longranger.

Some things to keep in mind when thinking about 10x data

  1. Input material MATTERS
    • The old adage “Put junk in get junk out” applies here
    • Linked-Read data can be generated from shorter fragments and much of the enhance utility is retained but the longer DNA input length the better
  2. Not only will you have “read coverage” at any given locus you will also have physical, or barcode, coverage
    • This enables enhanced Structural Variant detection from what is otherwise short-read data
  3. Phasing is completely dependent on
    • SNV variation in the given region
    • Accessibility to that region

Exploring the 10x data via the Loupe Browser by 10x Genomics

The Loupe Browser is a 10x specific genome browser that more fully captures some of the enhanced information that Linked-Reads will get you in your WGS or WES experiments. Loupe is fully integrated into the Longranger pipeline and .loupe files are automatically generated by default.

If you look at the 10x-loupe-files directory you can see three loupe files to explore.

ubuntu@ip-172-31-63-156:~/10x-loupe-files$ ls /home/ubuntu/10x-loupe-files
total 422M
-rw-rw-r-- 1 ubuntu ubuntu  40M Dec  8 09:02 LungTumorT.loupe
-rw-rw-r-- 1 ubuntu ubuntu 383M Apr 10 20:05 NA12878_exome.loupe

The Loupe main page

First let’s go to the Loupe browser and click on NA12878_exome.loupe. This will bring us to the main page of Loupe which looks like this.

Figure 3. The Loupe main page. Loupe is a 10x Genomics genome browser specifically designed to visualize 10x Linked-Read data.

As you can see we have some nice statistics about the performance of our sequencing experiment including:

  • The number of genes phased
    • Fraction of genes (<100kb long) that are contained within a single phase block.
  • Phase-block information
    • SNPs Phased
      • Percentage of heterozygous SNPs that were phased.
    • Longest Phase Block
      • Length of the longest phase block.
    • N50 Phase Block
      • Half of the genome was phased into phase blocks of at least this length.
  • Molecule length distribution (we’ll work on recreating this)
  • GEM statistics

Haplotype View

Let’s navigate to chr17:41,074,530-41,399,282

Figure 4. Haplotypes view in the Loupe genome browser.

There are a lot of “clickable” features to see here:

  • An annotation track
  • Coverage track in green
  • Exome bait targets (blue bars)
  • Variants

Figure 5. Variant types represented in Loupe genome browser.

  • Phase-blocks (black)
    • Breaks in phasing do not have black box around them

Linked-Read View

Here you can see a similar output to that of IGV but it is a bit more digestible for viewing linked reads.

Figure 6. Linked-Read view in the Loupe genome browser. Haplotype 1 is shown in yellow, haplotype 2 is shown in purple. Grey reads/barcodes could not be assigned to a haplotype

Once again, we can see reads clearly phased by haplotype and reads that do not get phased in grey.

  • In Lariat mode, Loupe colors reads based on their alignment properties:
    • Reads with a MAPQ less than 30 are colored grey
    • Reads with a high mapq that uniquely aligned are colored black
    • Reads with a high mapq that lariat was able to align because of their linkage to other reads are colored green.

Linked-Read View

If we open up the NA12878_wgs.loupe file, navigate to chr2:34,595,838-34,795,838, and click on Linked-Reads we can very clearly see a hemizygous deletion in both the

Linked-Read View

Figure 7. Hemizygous deletion example. View of a deletion on chr2 showing phased reads absent in haplotype 1 and present in haplotype 2.


More Info

Structural Variants View

There is a whole other world of investigating SVs in 10x data. If we look at the Structural Variant View in Loupe We can see some nice examples SVs.

    2 34,695,830  AC073218...DEL
93  
    2 34,736,552  AC073218...40.7 kb    





Application Note of SV view

This browser does not support PDFs. Please download the PDF to view it: Download PDF.





10x Genomics Software

All 10x specific software and information about 10x specific file formats can be found here

LS0tCnRpdGxlOiAiMTB4IEdlbm9taWNzIEJpb2luZm9ybWF0aWMgV29ya3Nob3AgXG4gXG4gSmFja3NvbiBMYWJzIDIwMTgiCmF1dGhvcjogJ1tTdGVwaGVuIFdpbGxpYW1zLCBQaEQuXShtYWlsdG86c3RlcGhlbi53aWxsaWFtc0AxMHhnZW5vbWljcy5jb20pIDEweCBHZW5vbWljcwogIEFwcGxpY2F0aW9ucyBTY2llbnRpc3QnCmRhdGU6ICdDb21waWxlZDogYHIgZm9ybWF0KFN5cy5EYXRlKCksICIlQiAlZCwgJVkiKWAnCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgaW5jbHVkZXM6CiAgICAgIGFmdGVyX2JvZHk6IGZvb3Rlci5odG1sCiAgICB0aGVtZTogcGFwZXIKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDMKICAgIHRvY19mbG9hdDogeWVzCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBjYWNoZSA9IEZBTFNFLAogIGNhY2hlLmxhenkgPSBGQUxTRSwKICB0aWR5ID0gVFJVRQopCmBgYAoKIyAqKkludHJvZHVjdGlvbioqCgoqKlRvIGdldCB0byB0aGlzIG5vdGVib29rIHBsZWFzZSBuYXZpZ2F0ZSB5b3VyIGJyb3dzZXIgdG8gMTB4LXR1dG9yaWFsL0pheF9Xb3Jrc2hvcC5uYi5odG1sIG9uIHRoZSB3ZWIgVUkqKgoKVGhlIHB1cnBvc2Ugb2YgdGhpcyB0dXRvcmlhbCB3aWxsIGJlIHRvIHdhbGsgbmV3IHVzZXJzIHRocm91Z2ggc29tZSBvZiB0aGUgc3RlcHMgbmVjZXNzYXJ5IHRvIGV4cGxvcmUgV2hvbGUgR2Vub21lIChXR1MpIGFuZCBXaG9sZSBFeG9tZSAoV0VTKSBzZXF1ZW5jaW5nIGRhdGEgZ2VuZXJhdGVkIGZvcm0gdGhlIDEweCBHZW5vbWljcyBDaHJvbWl1bSBwbGF0Zm9ybSBhbmQgdGhlIFtMb25ncmFuZ2VyIHBpcGVsaW5lXShodHRwczovL3N1cHBvcnQuMTB4Z2Vub21pY3MuY29tL2dlbm9tZS1leG9tZS9zb2Z0d2FyZS9waXBlbGluZXMvbGF0ZXN0L3doYXQtaXMtbG9uZy1yYW5nZXIpLiBXZSB3aWxsIGludmVzdGlnYXRlIHRoZSBMaW5rZWQtUmVhZCBkYXRhIHVzaW5nIGEgdmFyaWV0eSBvZiB0b29scywgYWxsIG9mIHdoaWNoIGFyZSBmcmVlbHkgYXZhaWxhYmxlIGVpdGhlciBmcm9tIFsxMHggR2Vub21pY3NdKGh0dHBzOi8vc3VwcG9ydC4xMHhnZW5vbWljcy5jb20vZ2Vub21lLWV4b21lL3NvZnR3YXJlL292ZXJ2aWV3L3dlbGNvbWUpIG9yIHRoZWlyIGhvbWUgcmVwb3MgKEdpdEh1YiwgU291cmNlRm9yZ2UsIGV0Yy4pICAKCioqVGhpbmdzIHRvIGtub3cgYWJvdXQgdGhpcyB3b3Jrc2hvcCoqCgoxLiBBbGwgZmlsZXMgdGhhdCB3aWxsIGJlIHVzZWQgY2FuIGJlIGZvdW5kIGF0OiBgL29wdC9kYXRhLzEweC1kYXRhL2AKMi4gVGhlIDEweCBMb3VwZSBicm93c2VyIGNhbiBiZSBmb3VuZCBhdCB5b3VyICJIb21lcGFnZSIKMy4gUmVmZXJlbmNlIGdlbm9tZSBmb3IgYWxsIHNhbXBsZXMgaXMgR1JDaDM3L2hnMTkKNC4gLmJhbSBmaWxlcyBhcmUgb25seSBmb3IgY2hyMjEKNS4gLnZjZiBhbmQgTG91cGUgZmlsZXMgY29udGFpbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGVudGlyZSBnZW5vbWUKNi4gRnVsbCBkYXRhIHNldHMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgW0xvbmdyYW5nZXIgRGF0YXNldHMgU2l0ZV0oaHR0cHM6Ly9zdXBwb3J0LjEweGdlbm9taWNzLmNvbS9nZW5vbWUtZXhvbWUvZGF0YXNldHMpCjcuIEFsbCAxMHggc29mdHdhcmUgaW5jbHVkaW5nIFtMb25ncmFuZ2VyXShodHRwczovL3N1cHBvcnQuMTB4Z2Vub21pY3MuY29tL2dlbm9tZS1leG9tZS9zb2Z0d2FyZS9kb3dubG9hZHMvbGF0ZXN0KSwgW1N1cGVybm92YV0oaHR0cHM6Ly9zdXBwb3J0LjEweGdlbm9taWNzLmNvbS9kZS1ub3ZvLWFzc2VtYmx5L3NvZnR3YXJlL2Rvd25sb2Fkcy9sYXRlc3QpLCBhbmQgW0xvdXBlXShodHRwczovL3N1cHBvcnQuMTB4Z2Vub21pY3MuY29tL2dlbm9tZS1leG9tZS9zb2Z0d2FyZS9kb3dubG9hZHMvbGF0ZXN0KSBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIHRoZSBbMTB4IFN1cHBvcnQgU2l0ZV0oaHR0cHM6Ly9zdXBwb3J0LjEweGdlbm9taWNzLmNvbS8pIAoKKioqCgojICoqMTB4IENocm9taXVtIFdvcmtmbG93IE92ZXJ2aWV3KioKIVtdKGh0dHA6Ly8zNC4yMDUuNjguOTQvZmlndXJlcy8xMHhfdGVjaC5wbmcpCkZpZ3VyZSAxLiBDaHJvbWl1bSBHZW5vbWUgV29ya2Zsb3cKCiMgKipMb2dnaW5nIGluOiBKYXggV29ya3Nob3cgQVdTIGluc3RhbmNlKioKCioqSW5zdHJ1Y3RvcnMgd2lsbCB0YWtlIGNhcmUgb2YgdGhpcyoqCgpPbmNlIHlvdSd2ZSBsb2dnZWQgaW4geW91ciBob21lIGRpcmVjdG9yeSBzaG91bGQgbG9vayBsaWtlIHRoaXMKYGBgCmNkIC9ob21lL3VidW50dQpzZXF1c2VyQGlwLTE3Mi0zMS02My0xNTY6L2hvbWUvdWJ1bnR1JCBscyAtbAp0b3RhbCAzNgpkcnd4cnd4ci14ICAyIHVidW50dSB1YnVudHUgNDA5NiBBcHIgIDIgMTc6NDQgMTB4LWJhbS1maWxlcwpkcnd4cnd4ci14ICAyIHVidW50dSB1YnVudHUgNDA5NiBBcHIgMTAgMjE6MzQgMTB4LWxvdXBlLWZpbGVzCmRyd3hyd3hyLXggIDIgdWJ1bnR1IHVidW50dSA0MDk2IEFwciAxMSAwNjoyMSAxMHgtdHV0b3JpYWwKZHJ3eHJ3eHIteCAgMiB1YnVudHUgdWJ1bnR1IDQwOTYgQXByIDExIDE2OjM1IDEweC12Y2YtZmlsZXMKZHJ3eHJ3eHIteCAgMiB1YnVudHUgdWJ1bnR1IDQwOTYgQXByIDExIDE2OjIwIGZpZ3VyZXMKZHJ3eHJ3eHIteCAgMyB1YnVudHUgdWJ1bnR1IDQwOTYgTWFyIDMwIDIxOjAyIGlndgpkcnd4cnd4ci14IDE1IHVidW50dSB1YnVudHUgNDA5NiBBcHIgIDIgMTg6MzMgbWluaWNvbmRhMgpkcnd4cnd4ci14ICAyIHVidW50dSB1YnVudHUgNDA5NiBNYXIgMzAgMTc6MzggbWlzYwpkcnd4ci14ci14ICAzIHVidW50dSB1YnVudHUgNDA5NiBBcHIgMTEgMTQ6MjMgUgpgYGAKCk9uIFdpbmRvd3MgeW91J2xsIHByb2JhYmx5IG5lZWQgYW4gYXBwbGljYXRpb24gbGlrZSBbUHVUVHldKGh0dHBzOi8vd3d3LnB1dHR5Lm9yZy8pCgojICoqR2V0dGluZyBTdGFydGVkIDEweCoqCgpPa2F5LCB5b3UndmUgZG9uZSB5b3VyIENocm9taXVtIHByZXAsIHNlbnQgaXQgdGhyb3VnaCB5b3VyIGZhdm9yaXRlIElsbHVtaW5hIChvciBCR0kpIHNlcXVlbmNlciBhbmQgbm93IHlvdSd2ZSBnb3QgYSBCQ0wgZmlsZS4gV2hhdCdzIG5leHQ/CgojIyBCQ0wgdG8gRkFTVFEKClRoZSBpbnN0cnVjdGlvbnMgdG8gY29udmVydCBCQ0wgdG8gRkFTVFEgY2FuIGJlIGZvdW5kIFtoZXJlXShodHRwczovL3N1cHBvcnQuMTB4Z2Vub21pY3MuY29tL2dlbm9tZS1leG9tZS9zb2Z0d2FyZS9waXBlbGluZXMvbGF0ZXN0L3VzaW5nL21rZmFzdHEpCgpBbiBleGFtcGxlIGJjbCB0byBkbyBzb21lIHRlc3Rpbmcgb24gY2FuIGJlIGZvdW5kIGluIGAvb3B0L2RhdGEvMTB4LWRhdGEvdGlueS1iY2wtMi4wLjBgCgpMZXQncyBkbyB0aGUgY29udmVyc2lvbgoKYGBgCm5vaHVwIGxvbmdyYW5nZXIgbWtmYXN0cSAtLWlkPXRpbnktYmNsIFwKICAgICAgICAgICAgICAgICAgIC0tcnVuPS9vcHQvZGF0YS8xMHgtZGF0YS90aW55LWJjbC0yLjAuMCBcCiAgICAgICAgICAgICAgICAgICAtLWNzdj0vb3B0L2RhdGEvMTB4LWRhdGEvdGlueS1iY2wtc2ltcGxlLTIuMS4wLmNzdiBcCiAgICAgICAgICAgICAgICAgICAtLWxvY2FsbWVtPTQgPiYgbWtmdHEub3V0ICYKYGBgCgpZb3Ugc2hvdWxkIHNlZSBzb21ldGhpbmcgbGlrZSB0aGlzIGFzIHRoZSBvdXRwdXQuIApfTm90ZTpfIEFsbCAxMHggcGlwZWxpbmVzIHJ1biB1bmRlciB0aGUgW01hcnRpYW4gRnJhbWV3b3JrXShodHRwOi8vbWFydGlhbi1sYW5nLm9yZy8pLiBJbiB0aGUgMTB4IHVuaXZlcnNlIGEgcGlwZWxpbmUgaXMgdGhlIHNvZnR3YXJlIHlvdSBydW4gKGUuZy4uIExvbmdyYW5nZXIpIGFuZCBhIHBpcGVzdGFuY2UgaXMgdGhlIGZ1bmN0aW9uYWwgZGlyZWN0b3J5IHRoYXQgaXMgY3JlYXRlZCB0aGF0IHRoZSBwaXBlbGluZSB1c2VzIHdoaWxlIGl0J3MgcnVubmluZy4KCmBgYApsb25ncmFuZ2VyIG1rZmFzdHEgKDIuMi4yKQpDb3B5cmlnaHQgKGMpIDIwMTggMTB4IEdlbm9taWNzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpNYXJ0aWFuIFJ1bnRpbWUgLSAnMi4yLjItMi4zLjInClNlcnZpbmcgVUkgYXQgaHR0cDovL2Jlc3BpbjEuZnV6enBsZXguY29tOjM1ODMxCgpSdW5uaW5nIHByZWZsaWdodCBjaGVja3MgKHBsZWFzZSB3YWl0KS4uLgpDaGVja2luZyBydW4gZm9sZGVyLi4uCkNoZWNraW5nIFJ1bkluZm8ueG1sLi4uCkNoZWNraW5nIHN5c3RlbSBlbnZpcm9ubWVudC4uLgpDaGVja2luZyBiYXJjb2RlIHdoaXRlbGlzdC4uLgpDaGVja2luZyByZWFkIHNwZWNpZmljYXRpb24uLi4KQ2hlY2tpbmcgc2FtcGxlc2hlZXQgc3BlY3MuLi4KQ2hlY2tpbmcgZm9yIGR1YWwgaW5kZXggZmxvd2NlbGwuLi4KMjAxOC0wNC0xMSAxMzowOToxNiBbcnVudGltZV0gKHJlYWR5KSAgICAgICAgICAgSUQudGlueS1iY2wuTUFLRV9GQVNUUVNfQ1MuTUFLRV9GQVNUUVMuUFJFUEFSRV9TQU1QTEVTSEVFVAoyMDE4LTA0LTExIDEzOjA5OjE5IFtydW50aW1lXSAoc3BsaXRfY29tcGxldGUpICBJRC50aW55LWJjbC5NQUtFX0ZBU1RRU19DUy5NQUtFX0ZBU1RRUy5QUkVQQVJFX1NBTVBMRVNIRUVUCjIwMTgtMDQtMTEgMTM6MDk6MTkgW3J1bnRpbWVdIChydW46bG9jYWwpICAgICAgIElELnRpbnktYmNsLk1BS0VfRkFTVFFTX0NTLk1BS0VfRkFTVFFTLlBSRVBBUkVfU0FNUExFU0hFRVQuZm9yazAuY2huazAubWFpbgoyMDE4LTA0LTExIDEzOjA5OjI1IFtydW50aW1lXSAoY2h1bmtzX2NvbXBsZXRlKSBJRC50aW55LWJjbC5NQUtFX0ZBU1RRU19DUy5NQUtFX0ZBU1RRUy5QUkVQQVJFX1NBTVBMRVNIRUVUCjIwMTgtMDQtMTEgMTM6MDk6MjggW3J1bnRpbWVdIChqb2luX2NvbXBsZXRlKSAgIElELnRpbnktYmNsLk1BS0VfRkFTVFFTX0NTLk1BS0VfRkFTVFFTLlBSRVBBUkVfU0FNUExFU0hFRVQKMjAxOC0wNC0xMSAxMzowOTozMSBbcnVudGltZV0gKHJlYWR5KSAgICAgICAgICAgSUQudGlueS1iY2wuTUFLRV9GQVNUUVNfQ1MuTUFLRV9GQVNUUVMuQkNMMkZBU1RRX1dJVEhfU0FNUExFU0hFRVQKMjAxOC0wNC0xMSAxMzowOTozMSBbcnVudGltZV0gKHJ1bjpsb2NhbCkgICAgICAgSUQudGlueS1iY2wuTUFLRV9GQVNUUVNfQ1MuTUFLRV9GQVNUUVMuQkNMMkZBU1RRX1dJVEhfU0FNUExFU0hFRVQuZm9yazAuc3BsaXQKMjAxOC0wNC0xMSAxMzowOTozNCBbcnVudGltZV0gKHNwbGl0X2NvbXBsZXRlKSAgSUQudGlueS1iY2wuTUFLRV9GQVNUUVNfQ1MuTUFLRV9GQVNUUVMuQkNMMkZBU1RRX1dJVEhfU0FNUExFU0hFRVQKMjAxOC0wNC0xMSAxMzowOTozNCBbcnVudGltZV0gKHJ1bjpsb2NhbCkgICAgICAgSUQudGlueS1iY2wuTUFLRV9GQVNUUVNfQ1MuTUFLRV9GQVNUUVMuQkNMMkZBU1RRX1dJVEhfU0FNUExFU0hFRVQuZm9yazAuY2huazAubWFpbgoyMDE4LTA0LTExIDEzOjEwOjA3IFtydW50aW1lXSAoY2h1bmtzX2NvbXBsZXRlKSBJRC50aW55LWJjbC5NQUtFX0ZBU1RRU19DUy5NQUtFX0ZBU1RRUy5CQ0wyRkFTVFFfV0lUSF9TQU1QTEVTSEVFVAoyMDE4LTA0LTExIDEzOjEwOjA3IFtydW50aW1lXSAocnVuOmxvY2FsKSAgICAgICBJRC50aW55LWJjbC5NQUtFX0ZBU1RRU19DUy5NQUtFX0ZBU1RRUy5CQ0wyRkFTVFFfV0lUSF9TQU1QTEVTSEVFVC5mb3JrMC5qb2luCjIwMTgtMDQtMTEgMTM6MTA6MTAgW3J1bnRpbWVdIChqb2luX2NvbXBsZXRlKSAgIElELnRpbnktYmNsLk1BS0VfRkFTVFFTX0NTLk1BS0VfRkFTVFFTLkJDTDJGQVNUUV9XSVRIX1NBTVBMRVNIRUVUCjIwMTgtMDQtMTEgMTM6MTA6MTMgW3J1bnRpbWVdIChyZWFkeSkgICAgICAgICAgIElELnRpbnktYmNsLk1BS0VfRkFTVFFTX0NTLk1BS0VfRkFTVFFTLk1BS0VfUUNfU1VNTUFSWQoyMDE4LTA0LTExIDEzOjEwOjEzIFtydW50aW1lXSAocnVuOmxvY2FsKSAgICAgICBJRC50aW55LWJjbC5NQUtFX0ZBU1RRU19DUy5NQUtFX0ZBU1RRUy5NQUtFX1FDX1NVTU1BUlkuZm9yazAuc3BsaXQKMjAxOC0wNC0xMSAxMzoxMDoxOSBbcnVudGltZV0gKHNwbGl0X2NvbXBsZXRlKSAgSUQudGlueS1iY2wuTUFLRV9GQVNUUVNfQ1MuTUFLRV9GQVNUUVMuTUFLRV9RQ19TVU1NQVJZCjIwMTgtMDQtMTEgMTM6MTA6MTkgW3J1bnRpbWVdIChydW46bG9jYWwpICAgICAgIElELnRpbnktYmNsLk1BS0VfRkFTVFFTX0NTLk1BS0VfRkFTVFFTLk1BS0VfUUNfU1VNTUFSWS5mb3JrMC5jaG5rMC5tYWluCjIwMTgtMDQtMTEgMTM6MTA6MTkgW3J1bnRpbWVdIChydW46bG9jYWwpICAgICAgIElELnRpbnktYmNsLk1BS0VfRkFTVFFTX0NTLk1BS0VfRkFTVFFTLk1BS0VfUUNfU1VNTUFSWS5mb3JrMC5jaG5rMS5tYWluCjIwMTgtMDQtMTEgMTM6MTA6MTkgW3J1bnRpbWVdIChydW46bG9jYWwpICAgICAgIElELnRpbnktYmNsLk1BS0VfRkFTVFFTX0NTLk1BS0VfRkFTVFFTLk1BS0VfUUNfU1VNTUFSWS5mb3JrMC5jaG5rMi5tYWluCjIwMTgtMDQtMTEgMTM6MTA6MTkgW3J1bnRpbWVdIChydW46bG9jYWwpICAgICAgIElELnRpbnktYmNsLk1BS0VfRkFTVFFTX0NTLk1BS0VfRkFTVFFTLk1BS0VfUUNfU1VNTUFSWS5mb3JrMC5jaG5rMy5tYWluCjIwMTgtMDQtMTEgMTM6MTE6NDkgW3J1bnRpbWVdIChjaHVua3NfY29tcGxldGUpIElELnRpbnktYmNsLk1BS0VfRkFTVFFTX0NTLk1BS0VfRkFTVFFTLk1BS0VfUUNfU1VNTUFSWQoyMDE4LTA0LTExIDEzOjExOjQ5IFtydW50aW1lXSAocnVuOmxvY2FsKSAgICAgICBJRC50aW55LWJjbC5NQUtFX0ZBU1RRU19DUy5NQUtFX0ZBU1RRUy5NQUtFX1FDX1NVTU1BUlkuZm9yazAuam9pbgoKT3V0cHV0czoKLSBSdW4gUUMgbWV0cmljczogICAgICAgIC9tbnQvaG9tZS9zdGVwaGVuL3lhcmQvSmF4X3dvcmtzaG9wL0xvbmdyYW5nZXIvdGlueS1iY2wvb3V0cy9xY19zdW1tYXJ5Lmpzb24KLSBGQVNUUSBvdXRwdXQgZm9sZGVyOiAgIC9tbnQvaG9tZS9zdGVwaGVuL3lhcmQvSmF4X3dvcmtzaG9wL0xvbmdyYW5nZXIvdGlueS1iY2wvb3V0cy9mYXN0cV9wYXRoCi0gSW50ZXJvcCBvdXRwdXQgZm9sZGVyOiAvbW50L2hvbWUvc3RlcGhlbi95YXJkL0pheF93b3Jrc2hvcC9Mb25ncmFuZ2VyL3RpbnktYmNsL291dHMvaW50ZXJvcF9wYXRoCi0gSW5wdXQgc2FtcGxlc2hlZXQ6ICAgICAvbW50L2hvbWUvc3RlcGhlbi95YXJkL0pheF93b3Jrc2hvcC9Mb25ncmFuZ2VyL3RpbnktYmNsL291dHMvaW5wdXRfc2FtcGxlc2hlZXQuY3N2CgpXYWl0aW5nIDYgc2Vjb25kcyBmb3IgVUkgdG8gZG8gZmluYWwgcmVmcmVzaC4KUGlwZXN0YW5jZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IQoKU2F2aW5nIHBpcGVzdGFuY2UgaW5mbyB0byB0aW55LWJjbC90aW55LWJjbC5tcmkudGd6CmBgYAoKWW91ciBmYXN0cXMgd2lsbCBiZSBpbiB0aGUgZmxvd2NlbGwgZGlyZWN0b3J5IGBINzdXV0JCWFhgLiBBbGwgdW5kZXRlcm1pbmVkIHJlYWRzIGFyZSBzdG9yZWQgaW4gdGhlICdVbmRldGVybWluZWQnIGZhc3Rxcy4gVGhlc2UgY2FuIGJlIGF1dG9tYXRpY2FsbHkgZGVsZXRlZCBieSBydW5uaW5nIGBsb25ncmFuZ2VyIG1rZmFzdHFgIHdpdGggdGhlIGAtLWRlbGV0ZS11bmRldGVybWluZWRgIGZsYWcuCgojIyAqKkFsaWdubWVudCoqCgpZb3UndmUgZ290IHlvdXIgZmFzdHFzIG1hZGUuIExldCdzIGRvIGEgc21hbGwgYWxpZ25tZW50LiBFdmVuIHRob3VnaCAxMHggY3VycmVudGx5IHJlY29tbWVuZHMgdXNpbmcgR0FUSyBmb3IgTG9uZ3JhbmdlciBhbGlnbm1lbnRzIGZyZWViYXllcyBpcyBhbHJlYWR5IGJha2VkIGluIHNvIHdlJ2xsIHVzZSB0aGF0IGZvciBvdXIgZXhhbXBsZS4KCl9Ob3RlXzogVGhlIHJlYXNvbnMgZm9yIHVzaW5nIEdBVEsgb3ZlciBmcmVlYmF5ZXMgYXJlIG1hbnkgYnV0IGl0IGJvaWxzIGRvd24gdG8gYmV0dGVyIHZhcmlhbnQgY2FsbGluZyBhbmQgSW5kZWwgc2Vuc2l0aXZpdHkvc3BlY2lmaWNpdHkgd2hpY2gsIGFtb25nIG90aGVyIHRoaW5ncywgbGVhZHMgdG8gYmV0dGVyIHBoYXNpbmcuIFRoaXMgY2FuIGhhdmUgZG93bnN0cmVhbSBlZmZlY3RzIG9uIFNWIGNhbGxpbmcgYXMgd2VsbC4gQSBkZXRhaWxlZCByZXBvcnQgb2YgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIExvbmdyYW5nZXIgYW5kIHRoZSBhZHZhbnRhZ2VzIHRoYXQgR0FUSyBwcm92aWRlcyBvdmVyIGZyZWViYXllcyBjYW4gYmUgZm91bmQgb24gW2Jpb1J4aXZdKGh0dHBzOi8vd3d3LmJpb3J4aXYub3JnL2NvbnRlbnQvZWFybHkvMjAxOC8wMS8wOS8yMzA5NDYuZnVsbC5wZGYraHRtbCkuCgpgYGAKbm9odXAgbG9uZ3JhbmdlciB3Z3MgLS1pZD1TYW1wbGVfZXhhbXBsZSBcCiAgICAgICAgICAgICAgICAgLS1mYXN0cXM9L21udC9ob21lL3N0ZXBoZW4veWFyZC9KYXhfd29ya3Nob3AvTG9uZ3Jhbmdlci90aW55LWJjbC9vdXRzL2Zhc3RxX3BhdGgvSDc3V1dCQlhYL1NhbXBsZSBcCiAgICAgICAgICAgICAgICAgLS1yZWZlcmVuY2U9L21udC9vcHQvcmVmZGF0YV9uZXcvaGcxOS0yLjIuMC8gXAogICAgICAgICAgICAgICAgIC0tbG9jYWxtZW09NAogICAgICAgICAgICAgICAgIC0tdmNtb2RlPWZyZWViYXllcyA+JiB3Z3Mub3V0ICYKYGBgCgpZb3VyIG91dHB1dCBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzIGFzIGl0IHJ1bnMuIE1ha2Ugc3VyZSB0byBjaGVjayBvdXQgdGhlIFVJIHdoZXJlIHlvdXIgcGlwZXN0YW5jZSBpcyBydW5uaW5nLiBUaGlzIGlzIGFuIGludGVyYWN0aXZlIHdvcmtmbG93IHRoYXQgaGFzIGxvdHMgb2YgaW5mb3JtYXRpb24gY29udGFpbmVkIHdpdGhpbiBpdC4KCmBgYApsb25ncmFuZ2VyIHdncyAoMi4yLjIpCkNvcHlyaWdodCAoYykgMjAxOCAxMHggR2Vub21pY3MsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCk1hcnRpYW4gUnVudGltZSAtICcyLjIuMi0yLjMuMicKU2VydmluZyBVSSBhdCBodHRwOi8vYmVzcGluMS5mdXp6cGxleC5jb206NDEzMzU/YXV0aD10UnF3ZFhodlE4dmx5V0hkNm9zOGNjWjJHWGd6WXVES2ZkWVFheG5rWm4wCgpSdW5uaW5nIHByZWZsaWdodCBjaGVja3MgKHBsZWFzZSB3YWl0KS4uLgoyMDE4LTA0LTExIDEzOjMxOjQxIFtydW50aW1lXSAocmVhZHkpICAgICAgICAgICBJRC5TYW1wbGVfZXhhbXBsZS5QSEFTRVJfU1ZDQUxMRVJfQ1MuUEhBU0VSX1NWQ0FMTEVSLl9DT01CSU5FRF9TVl9DQUxMRVIuX1RFUk1JTkFMX0NOVl9DQUxMRVIuUFJFUEFSRV9URVJNSU5BTF9DTlZfR1RfQU5EX0JJTlNJWkUKMjAxOC0wNC0xMSAxMzozMTo0MSBbcnVudGltZV0gKHJlYWR5KSAgICAgICAgICAgSUQuU2FtcGxlX2V4YW1wbGUuUEhBU0VSX1NWQ0FMTEVSX0NTLlBIQVNFUl9TVkNBTExFUi5fU05QSU5ERUxfUEhBU0VSLlNPUlRfR1JPVU5EX1RSVVRICjIwMTgtMDQtMTEgMTM6MzE6NDQgW3J1bnRpbWVdIChyZWFkeSkgICAgICAgICAgIElELlNhbXBsZV9leGFtcGxlLlBIQVNFUl9TVkNBTExFUl9DUy5QSEFTRVJfU1ZDQUxMRVIuX0xJTktFRF9SRUFEU19BTElHTkVSLl9GQVNUUV9QUkVQX05FVy5TRVRVUF9DSFVOS1MKMjAxOC0wNC0xMSAxMzozMTo0NCBbcnVudGltZV0gKHNwbGl0X2NvbXBsZXRlKSAgSUQuU2FtcGxlX2V4YW1wbGUuUEhBU0VSX1NWQ0FMTEVSX0NTLlBIQVNFUl9TVkNBTExFUi5fU05QSU5ERUxfUEhBU0VSLlNPUlRfR1JPVU5EX1RSVVRICjIwMTgtMDQtMTEgMTM6MzE6NDQgW3J1bnRpbWVdIChydW46bG9jYWwpICAgICAgIElELlNhbXBsZV9leGFtcGxlLlBIQVNFUl9TVkNBTExFUl9DUy5QSEFTRVJfU1ZDQUxMRVIuX1NOUElOREVMX1BIQVNFUi5TT1JUX0dST1VORF9UUlVUSC5mb3JrMC5jaG5rMC5tYWluCjIwMTgtMDQtMTEgMTM6MzE6NDQgW3J1bnRpbWVdIChzcGxpdF9jb21wbGV0ZSkgIElELlNhbXBsZV9leGFtcGxlLlBIQVNFUl9TVkNBTExFUl9DUy5QSEFTRVJfU1ZDQUxMRVIuX0NPTUJJTkVEX1NWX0NBTExFUi5fVEVSTUlOQUxfQ05WX0NBTExFUi5QUkVQQVJFX1RFUk1JTkFMX0NOVl9HVF9BTkRfQklOU0laRQoyMDE4LTA0LTExIDEzOjMxOjQ0IFtydW50aW1lXSAocnVuOmxvY2FsKSAgICAgICBJRC5TYW1wbGVfZXhhbXBsZS5QSEFTRVJfU1ZDQUxMRVJfQ1MuUEhBU0VSX1NWQ0FMTEVSLl9DT01CSU5FRF9TVl9DQUxMRVIuX1RFUk1JTkFMX0NOVl9DQUxMRVIuUFJFUEFSRV9URVJNSU5BTF9DTlZfR1RfQU5EX0JJTlNJWkUuZm9yazAuY2huazAubWFpbgpgYGAKCiMjIyAqKkV4YW1wbGUgUGlwZXN0YW5jZSoqCgohW10oaHR0cDovLzM0LjIwNS42OC45NC9maWd1cmVzL0xvbmdyYW5nZXJfcGlwZXN0YW5jZS5wbmcpCkZpZ3VyZSAyLiBFeGFtcGxlIFdHUyBwaXBlc3RhbmNlLiBFYWNoIGJ1YmJsZSBpcyBhbiBhbmFseXNpcyBzdGFnZSBhbmQgYWxsIGxpbmVzIHJlcHJlc2VudCBwYXNzYWdlIG9mIGRhdGEgZnJvbSBvbmUgc3RhdGUgdG8gYW5vdGhlci4gV2hlbmV2ZXIgcG9zc2libGUgc3RhZ2VzIGFyZSBicm9rZW4gaW50byBjaHVua3MgdG8gYWxsb3cgZm9yIHBhcmFsbGVsIHByb2Nlc3Npbmcgb2YgZGF0YS4KCioqKgoKIyAqKkxvbmdyYW5nZXIgT3V0cHV0cyoqCgojICoqVGhlIDEweCAuYmFtKioKCiMjIEdlbmVyYWwgMTB4IC5iYW0gaW5mb3JtYXRpb24KClRoZSAxMHgvTGlua2VkLVJlYWQgLmJhbSBmaWxlIGNvbnRhaW5zIG11Y2ggb2YgdGhlIHNhbWUgaW5mb3JtYXRpb24gdGhhdCBhIHR5cGljYWwgc2hvcnQgcmVhZCAuYmFtIHdvdWxkLCBidXQgbGlrZSB0aGUgVkNGIGhhcyBzb21lIGV4dHJhIGluZm9ybWF0aW9uLiBEb2N1bWVudHMgY292ZXJpbmcgdGhlIHRoZSAxMHggLmJhbSBzcGVjIGNhbiBiZSBmb3VuZCBbaGVyZV0oaHR0cHM6Ly9zdXBwb3J0LjEweGdlbm9taWNzLmNvbS9nZW5vbWUtZXhvbWUvc29mdHdhcmUvcGlwZWxpbmVzL2xhdGVzdC9vdXRwdXQvYmFtKSAgCgpJZiB3ZSB0YWtlIGEgbG9vayB3ZSBjYW4gc2VlIHNvbWUgaW50ZXJlc3RpbmcgZmVhdHVyZXM6IAoKYGBgCmNkIC9ob21lL3VidW50dS8xMHgtYmFtLWZpbGVzCnNhbXRvb2xzIHZpZXcgLWggTkExMjg3OF9jaHIyMV9waGFzZWRfcG9zc29ydGVkX2V4b21lX2JhbS5iYW0gfCBsZXNzCmBgYApgYGAKQFBHICAgICBJRDpsYXJpYXQgICAgICAgUE46bG9uZ3Jhbmdlci5sYXJpYXQgICAgQ0w6bGFyaWF0IC1yZWFkcz0vbW50L2FuYWx5c2lzL21hcnNvYy9waXBlc3RhbmNlcy9IR0tOSkJCWFgvUEhBU0VSX1NWQ0FMTEVSX0VYT01FX1BELzQ5MjU1LzEwMTYuMS4xLTAvUEhBU0VSX1NWQ0FMTEVSX0VYT01FX1BEL1BIQVNFUl9TVkNBTExFUl9FWE9NRS9fTElOS0VEX1JFQURTX0FMSUdORVIvX0ZBU1RRX1BSRVBfTkVXL1NPUlRfRkFTVFFTL2ZvcmswL2pvaW4tdTI5YzA3YzlkZTEvZmkKbGVzL2NodW5rLTAuZmFzdGguZ3ogLXJlYWRfZ3JvdXBzPTQ5MjU1Ok1pc3NpbmdMaWJyYXJ5OjE6dW5rbm93bl9mYzowIC1nZW5vbWU9L21udC9vcHQvcmVmZGF0YV9uZXcvaGcxOS0yLjAuMC9mYXN0YS9nZW5vbWUuZmEgLXNhbXBsZV9pZD00OTI1NSAtdGhyZWFkcz00IC1jZW50cm9tZXJlcz0vbW50L29wdC9yZWZkYXRhX25ldy9oZzE5LTIuMC4wL3JlZ2lvbnMvY2VudHJvbWVyZXMudHN2IC10cmltX2xlbmd0aD03IC1maXJzdF9jaHVuaz1UcnVlIC1vdXRwdXQ9L21udC9hbmEKbHlzaXMvbWFyc29jL3BpcGVzdGFuY2VzL0hHS05KQkJYWC9QSEFTRVJfU1ZDQUxMRVJfRVhPTUVfUEQvNDkyNTUvMTAxNi4xLjEtMC9QSEFTRVJfU1ZDQUxMRVJfRVhPTUVfUEQvUEhBU0VSX1NWQ0FMTEVSX0VYT01FL19MSU5LRURfUkVBRFNfQUxJR05FUi9CQVJDT0RFX0FXQVJFX0FMSUdORVIvZm9yazAvY2huazAwMC11MjljMDdjOWU2Mi9maWxlcyBWTjonNTc2Mzg3ZicKQFBHICAgICBJRDphdHRhY2hfcGhhc2luZyAgICAgICBQTjpsb25ncmFuZ2VyLmF0dGFjaF9waGFzaW5nICAgIFBQOmxhcmlhdCAgICAgICBWTjoxMDE2LjEuMQpAUEcgICAgIElEOmxvbmdyYW5nZXIgICBQTjpsb25ncmFuZ2VyICAgUFA6YXR0YWNoX3BoYXNpbmcgICAgICAgVk46MTAxNi4xLjEKQENPICAgICAxMHhfYmFtX3RvX2Zhc3RxOlIxKFJYOlFYLFRSOlRRLFNFUTpRVUFMKQpAQ08gICAgIDEweF9iYW1fdG9fZmFzdHE6UjIoU0VROlFVQUwpCkBDTyAgICAgMTB4X2JhbV90b19mYXN0cTpJMShCQzpRVCkKU1QtSzAwMTI2OjMzNDpIR0tOSkJCWFg6NDoyMTE4OjI2OTIwOjE0NTE5ICAgICAgMTYzICAgICBjaHIyMSAgIDk0MTI5NDAgMzkgICAgICA5Mk04UyAgID0gICAgICAgOTQxMjk1MyA5MCAgICAgIEdHQUdUVEdUQVRUR0dUR0NBR0dBQUdHR0dBR1RUVEdBVFRUQUFUR0FBQUNBQVRHQ0FUVEFBQUFBVFRUR1RBVFRDQUNUVFRHVEdBVFRDQUFUR0FUQUdUQ0FBVEdUVEFBQ0FUQUEgICAgQUFBPEZBSkZGSkpKSkpKSkpKSkZKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkoKSkpKSkpKSkpGQUZGPEZKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkogICAgUlg6WjpHQUNBQ0FUQ0FHQ1RHVFRBICAgUVg6WjpBQUZGRkpKSkpKSkpKSkpKICAgQkM6WjpUQ1RDR0dHQyAgIFFUOlo6QUFGRkZKSkogICBYUzppOi0xMyAgICAgICAgQVM6aTotOSBYTTpBOjAgIEFNOkE6MCAgWFQ6aTowICBCWDpaOkdBQ0FDQVRDQUdDVEdUVEEtMSBSRzpaOjQ5MjU1Ok1pc3NpbmdMaWJyYXJ5OjE6dW5rbm93bl9mYzowICAgICAgICBPTTppOjM5ClNULUswMDEyNjozMzQ6SEdLTkpCQlhYOjQ6MjExODoyNjkyMDoxNDUxOSAgICAgIDgzICAgICAgY2hyMjEgICA5NDEyOTUzIDM5ICAgICAgNzdNICAgICA9ICAgICAgIDk0MTI5NDAgLTkwICAgICBUR0NBR0dBQUdHR0dBR1RUVEdBVFRUQUFUR0FBQUNBQVRHQ0FUVEFBQUFBVFRUR1RBVFRDQUNUVFRHVEdBVFRDQUFUR0FUQUdUQ0FBVCAgIEZKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpGSkpKSkpKClJYOlo6R0FDQUNBVENBR0NUR1RUQSAgIFFYOlo6QUFGRkZKSkpKSkpKSkpKSiAgIFRSOlo6VEdUVEFBQyAgICBUUTpaOkpKSkpKSkogICAgQkM6WjpUQ1RDR0dHQyAgIFFUOlo6QUFGRkZKSkogICBYUzppOi0xMyAgICAgICAgQVM6aTotOSBYTTpBOjAgIEFNOkE6MCAgWFQ6aTowICBCWDpaOkdBQ0FDQVRDQUdDVEdUVEEtMSBSRzpaOjQ5MjU1Ok1pc3NpbmdMaWJyYXJ5OjE6dW5rbm93bl9mYzowICAgICAgICBPTTppOjM5ClNULUswMDEyNjozMzQ6SEdLTkpCQlhYOjQ6MTExNDozMjY0NDo0NTAxMCAgICAgIDk5ICAgICAgY2hyMjEgICA5NDEzMjQ4IDM5ICAgICAgNzdNICAgICA9ICAgICAgIDk0MTMyNjMgMTE1ICAgICBUR0FBVEFUVFRUQ1RDQUdDQUFDVEdUR0dUR1RUQVRHQVRBVEFUQVRUR0dUVFRUQ0FUQ0NDQ0FHVFRDQ1RHR0NUVEFUQUFDVENDQ0NUQSAgIEZGPEo8RkpKSi1KPEpGQUpGSkpBSi1BLTw3PEEtLUZKLUFKSkpGRkZGSkYtPEZGRi1GLS03QTxGRi08QUY8SkEtQS1KSi08PDdGRkY8ClJYOlo6TkFHR0dUR0FHR0NBVEdHVCAgIFFYOlo6Izw8QUFGRkpKRkpKQTxKPCAgIFRSOlo6VFRDQ0dDQSAgICBUUTpaOjxGSkpKRkEgICAgQkM6WjpUQ1RDR0dHQyAgIFFUOlo6QUFBRkZKSkogICBYUzppOi0xMiAgICAgICAgQVM6aTotOCBYTTpBOjAgIEFNOkE6MCAgWFQ6aTowICBCWDpaOkFBR0dHVEdBR0dDQVRHR1QtMSBSRzpaOjQ5MjU1Ok1pc3NpbmdMaWJyYXJ5OjE6dW5rbm93bl9mYzowICAgICAgICBPTTppOjM5CmBgYAoKVGhpbmdzIHRvIGxvb2sgZm9yOgoKKiBCWCB0YWcgc3VjaCBhcyBgQlg6WjpHQUNBQ0FUQ0FHQ1RHVFRBLTFgCiAgICArIEJhcmNvZGUgYXNzb2NpYXRlZCB3aXRoIGEgdGFnCiAgICAKX05vdGVfOiBEZWZpbml0aW9ucyBvZiBhbGwgdGhlIC5iYW0gdGFncyBjYW4gYmUgZm91bmQgW2hlcmVdKGh0dHBzOi8vc3VwcG9ydC4xMHhnZW5vbWljcy5jb20vZ2Vub21lLWV4b21lL3NvZnR3YXJlL3BpcGVsaW5lcy9sYXRlc3Qvb3V0cHV0L2JhbSkKCl9JbmZvcm1hdGljcyBUaXBfOiBpZiB5b3UnZCBsaWtlIHRvIHNlYXJjaCBmb3IgYWxsIHRoZSByZWFkcyBhc3NvY2lhdGVkIHdpdGggYSBsaXN0IG9mIGJhcmNvZGVzLCB0aGlzIGlzIHRoZSBmYXN0ZXN0IHdheSB0byBkbyBpdCAod2lsbCBuZWVkIFtyaXBncmVwXShodHRwczovL2dpdGh1Yi5jb20vQnVybnRTdXNoaS9yaXBncmVwKSB3aGljaCBpcyBpbnN0YWxsZWQgb24geW91ciBBV1MgaW5zdGFuY2UpCgpgYGAKc2FtdG9vbHMgdmlldyAtQCA1IHBvc3NvcnRlZF9leG9tZV9iYW0uYmFtIHwgcmcgLWogNSAtLW5vLWxpbmUtbnVtYmVyIC1GIC1mIEJYX2xpc3QudHh0ID4gQkNfcmVhZHMuc2FtCmBgYAo8YnI+PGJyPjxicj48YnI+CgpTb21lIDEweCB1c2VycyBoYXZlIGFsc28gYXNrZWQgYWJvdXQgbG9jYWwgX2RlIG5vdm9fIGFzc2VtYmx5IG9mIGEgbG9jdXMgb2YgaW50ZXJlc3QuIEFuIGV4YW1wbGUgd29ya2Zsb3cgZm9yIHRoYXQgKGNvbXBsZXRlbHkgdW5zdXBwb3J0ZWQpIHdvcmtmbG93IGNhbiBiZSBmb3VuZCBoZXJlLiAKCjxvYmplY3QgZGF0YT0iaHR0cDovLzM0LjIwNS42OC45NC9maWd1cmVzL1dHUy1Mb2NhbFJlYXNzZW1ibHlXb3JrZmxvdy0wOTAyMTgtMTkyOS5wZGYiIHR5cGU9ImFwcGxpY2F0aW9uL3BkZiIgd2lkdGg9IjcwMHB4IiBoZWlnaHQ9IjcwMHB4Ij4KICAgIDxlbWJlZCBzcmM9Imh0dHA6Ly8zNC4yMDUuNjguOTQvZmlndXJlcy9XR1MtTG9jYWxSZWFzc2VtYmx5V29ya2Zsb3ctMDkwMjE4LTE5MjkucGRmIj4KICAgICAgICBUaGlzIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBQREZzLiBQbGVhc2UgZG93bmxvYWQgdGhlIFBERiB0byB2aWV3IGl0OiA8YSBocmVmPSJodHRwOi8vMzQuMjA1LjY4Ljk0L2ZpZ3VyZXMvV0dTLUxvY2FsUmVhc3NlbWJseVdvcmtmbG93LTA5MDIxOC0xOTI5LnBkZiI+RG93bmxvYWQgUERGPC9hPi48L3A+CiAgICA8L2VtYmVkPgo8L29iamVjdD4KCioqKgoKIyAqKlRoZSAxMHggVkNGKioKCiMjIFNwZWNpYWwgYXNwZWN0cwoKVGhlcmUgYXJlIGEgZmV3IHRoaW5ncyB0aGF0IHRoYXQgbWFrZSB0aGUgMTB4IFZDRiB1bmlxdWUuIE92ZXJhbGwgMTB4IGFiaWRlcyBieSB0aGUgW1ZDRiA0Lnggc3RhbmRhcmRdKGh0dHBzOi8vc2FtdG9vbHMuZ2l0aHViLmlvL2h0cy1zcGVjcy9WQ0Z2NC4yLnBkZikuIEhvd2V2ZXIsIHRoZXJlIGlzIHNvbWUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGF0IHRha2VzIGFkdmFudGFnZSBvZiB0aGUgMTB4IHNwZWNpZmljIHRlY2hub2xvZ3kuIERvY3VtZW50cyBjb3ZlcmluZyB0aGUgdGhlIDEweCBWQ0Ygc3BlYyBjYW4gYmUgZm91bmQgW2hlcmVdKGh0dHBzOi8vc3VwcG9ydC4xMHhnZW5vbWljcy5jb20vZ2Vub21lLWV4b21lL3NvZnR3YXJlL3BpcGVsaW5lcy9sYXRlc3Qvb3V0cHV0L3ZjZikuIEEgY29tcHJlaGVuc2l2ZSBsaXN0IG9mIHRoZSBhdmFpbGFibGUgb3V0cHV0cyBvZiBMb25ncmFuZ2VyIGNhbiBiZSBmb3VuZCBbaGVyZV0oaHR0cHM6Ly9zdXBwb3J0LjEweGdlbm9taWNzLmNvbS9nZW5vbWUtZXhvbWUvc29mdHdhcmUvcGlwZWxpbmVzL2xhdGVzdC93aGF0LWlzLWxvbmctcmFuZ2VyKS4gIAoKCklmIHdlIG5hdmlnYXRlIHRvIGEgMTB4IFZDRiBhbmQgaGF2ZSBhIGxvb2sgCgpgYGAKY2QgL2hvbWUvdWJ1bnR1LzEweC12Y2YtZmlsZXMKdWJ1bnR1QGlwLTE3Mi0zMS02My0xNTY6fi8xMHgtdmNmLWZpbGVzJCBscwp0b3RhbCAxMDE0TQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgNDNNIEFwciAxMSAxNjozNCBOQTEyODc4X3dlc192YXJjYWxscy52Y2YuZ3oKLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgODgySyBBcHIgMTEgMTY6MzQgTkExMjg3OF93ZXNfdmFyY2FsbHMudmNmLmd6LnRiaQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSA5NjhNIEFwciAgMiAxODo0NiBOQTEyODc4X3dnc192YXJjYWxscy52Y2YuZ3oKLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMS45TSBBcHIgIDIgMTg6NDIgTkExMjg3OF93Z3NfdmFyY2FsbHMudmNmLmd6LnRiaQpgYGAKCmBgYAp6Y2F0IE5BMTI4Nzhfd2VzX3ZhcmNhbGxzLnZjZi5neiB8IGxlc3MKCiNDSFJPTSAgUE9TICAgICBJRCAgICAgIFJFRiAgICAgQUxUICAgICBRVUFMICAgIEZJTFRFUiAgSU5GTyAgICBGT1JNQVQgIDQ5MjU1CmNocjEgICAgMTIxOTggICAuICAgICAgIEcgICAgICAgQyAgICAgICAxMzU1Ljc3IFBBU1MgICAgQUM9MjtBRj0xLjA7QU49MjtCYXNlUVJhbmtTdW09MC4xMzI7Q2xpcHBpbmdSYW5rU3VtPTAuMDtEUD00MjtFeGNlc3NIZXQ9My4wMTAzO0ZTPTAuMDtNTEVBQz0yO01MRUFGPTEuMDtNUT01My4yMztNUVJhbmtTdW09MS41OTM7UUQ9MzIuMjg7UmVhZFBvc1JhbmtTdW09MS42NTM7U09SPTAuMjg2O01VTUFQX1JFRj0zLjczOTEzO01VTUFQX0FMVD0yNC43NzU7QU89MzQ7Uk89MAo7TU1EPTAuODg1NjQyO1JFU0NVRUQ9MTtOT1RfUkVTQ1VFRD0xMDI7SEFQTE9DQUxMRUQ9MCAgICAgR1Q6QUQ6RFA6R1E6UEw6Qlg6UFMgICAgMXwxOjEsNDE6NDI6OTI6MTM4NCw5MiwwOixBQUNUQ0NDVENUVEdHVEFHLTFfNzQ7VFRHQ0dUQ0FHQUNHQ0NDVC0xXzc0O0dUQUNBVEdBR0dUR0NHVEEtMV82NTtUQUFHR0NUQ0FBR0dHVEdULTFfNzQ7Q0FDQUdUQUNBQ0FUVEdHVC0xXzc0Xzc0O0dDQUFBQ1RHVEFBQUNHR0MtMV83MDtDR0dBVFRBVENUR0FBQ1RHLTFfNzA7QVRHQ0EKQUNUQ1RDQ0NBQUMtMV82MDtDQVRDR0dHVENBVEFBQ0NHLTFfNzQ7QUNBQ0FBQ0FHQUdBR0dDRy0xXzc0O0dUQUdUQ0FBR0dDQ0dBQVQtMV83NDtUR0NBVENDVENHVENUR0FBLTFfNzQ7QVRDQVRHR1RDQVRDR0FHVC0xXzcwO0NBR0NUQUFDQUFHQUdUQ0ctMV82MF83MDtHR0dDQ0FUVENUQUNBQUdDLTFfNTU7R1RHQUNDR1RDQUNBR0NDRy0xXzcwO0dUVFRDQVRHVEFDR0FHQUMtMV83NDtUVEFHVENUQUdDVEFBR1RBLTFfNzRfNTVfNzQ7R1RDR0FDR0NBQ1RBQUdHRy0xXzc0O0dDCkdDVEdBQUdDR0FUVEFBLTFfNDU7VEdDQUFDQUdUVENUR1RUVC0xXzcwO0dHQ0FBQ0NBR0FHQUNUQVQtMV83MDtDR0NBQ1RUVENDQVRDR1RDLTFfNzRfNzQ7R0dDR0FDVEFHQ0dUR1RHQS0xXzc0O1RBR0dDR0NDQUdHVENBQUctMV83NDtUR0NUQUFHQUdHVFRUQ0dULTFfNzRfNzQ7R1RDQ1RDQVRDVFRDQ1RUQy0xXzc0O0FDVEdBR1RHVENDQVRUR0EtMV83NDoxMjE5OApjaHIxICAgIDEyMzA1ICAgLiAgICAgICBDICAgICAgIFQgICAgICAgMTguODIgICBQQVNTICAgIEFDPTE7QUY9MC41O0FOPTI7QmFzZVFSYW5rU3VtPTEuMDk3O0NsaXBwaW5nUmFua1N1bT0wLjA7RFA9MTI7RXhjZXNzSGV0PTMuMDEwMztGUz0wLjA7TUxFQUM9MTtNTEVBRj0wLjU7TVE9NTEuNDE7TVFSYW5rU3VtPS0wLjIzO1FEPTEuNzE7UmVhZFBvc1JhbmtTdW09LTAuMjUzO1NPUj0wLjA4NjtNVU1BUF9SRUY9MTMuNjk3NztNVU1BUF9BTFQ9MTUuNjY2NztBTz0yO1JPPTk7TU1EPTAuOTAxNzA5O1JFU0NVRUQ9MDtOT1RfUkVTQ1VFRD00OTtIQVBMT0NBTExFRD0wICAgICAgR1Q6QUQ6RFA6R1E6UEw6Qlg6UFM6UFE6SlEgICAgICAwLzE6OSwyOjExOjQ3OjQ3LDAsMzE1OlRUQUdUQ1RBR0NUQUFHVEEtMV83MDtHVENHQUNHQ0FDVEFBR0dHLTFfNzQ7QUNDQUNHR0NBVEFDQUdBQS0xXzU1O0FDQUNBQUNBR0FHQUdHQ0ctMV83MDtUR0NBVENDVENHVENUR0FBLTFfNjU7Q0dDQUNUVFRDQ0FUQ0dUQy0xXzc0O0FDVEdHR0NHVENDQVRDQ1QtMV83NDtHVEdDVENUQ0FBR1RBQ0FBLTFfNzA7R0dDR0FDVEFHQ0dUR1RHQS0xXzcwLEdUQUdUQ0FBR0dDQ0dBQVQtMV83NDtBVENBVEdHVENBVENHQUdULTFfNzQ6MToxMDoyNTUKY2hyMSAgICAxMjM4MyAgIC4gICAgICAgRyAgICAgICBBICAgICAgIDE3Mi43NCAgUEFTUyAgICBBQz0xO0FGPTAuNTtBTj0yO0Jhc2VRUmFua1N1bT0tMC42NzQ7Q2xpcHBpbmdSYW5rU3VtPTAuMDtEUD05O0V4Y2Vzc0hldD0zLjAxMDM7RlM9Ni4wMjE7TUxFQUM9MTtNTEVBRj0wLjU7TVE9NDkuMjY7TVFSYW5rU3VtPTAuODg3O1FEPTIxLjU5O1JlYWRQb3NSYW5rU3VtPS0wLjQ4OTtTT1I9Mi41MjY7TVVNQVBfUkVGPTcuMDtNVU1BUF9BTFQ9MjYuNDcwNjtBTz04O1JPPTA7TU1EPTAuODk4NzkzO1JFU0NVRUQ9MDtOT1RfUkVTQ1VFRD0yMTtIQVBMT0NBTExFRD0wICAgICAgIEdUOkFEOkRQOkdROlBMOkJYOlBTOlBROkpRICAgICAgMXwwOjEsNzo4OjY6MjAwLDAsNjosR0FBQVRHQUFHVFRUQ1RUQy0xXzYwO0FDQ0FDR0dDQVRBQ0FHQUEtMV83NDtUVEdDR1RDQUdBQ0dDQ0NULTFfNzQ7QUdHQUdBQ0NBVEdUQVRHQy0xXzU1O1RHQ0FUQ0NUQ0dUQ1RHQUEtMV83NDtHQ0FBQUNUR1RBQUFDR0dDLTFfNzA7R0FDR0NHVEdUQ0NUQ0dHQS0xXzQ1O1RDQ0FUQ0dBR0dHQ0dBQUctMV83MDoxOjQ0OjM2CmBgYAoKKipOb3Qgb25seSBkbyB5b3Ugc2VlIHNvbWUgb2YgdGhlIHR5cGljYWwgdGhpbmdzKioKCiogY2hyLCBwb3MKKiBSRUYsIEFMVAoqIFFVQUwKKiBGSUxURVIKICAgICsgUEFTUwogICAgKyBSZWFzb24gZm9yIGZpbHRlcmluZwogICAgCioqWW91IGNhbiBhbHNvIHNlZSBzb21lIG9mIHRoZSBleHRyYSAxMHggInN0dWZmIi4gTW9zdGx5IGluIHRoZSBGT1JNQVQgZmllbGQqKgoKKiBCWAogICAgKyBCYXJjb2RlcyBvZiByZWFkcyBhc3NvY2lhdGVkIHdpdGggYW4gZ2l2ZW4gdmFyaWFudAogICAgKyBGaXJzdCBzZXQgb2YgYDtgIHNlcGFyYXRlZCBiYXJjb2RlcyBjb3ZlciB0aGUgZmlyc3QgYWxsZWxlIGZvbGxvd2VkIGJ5IGEgYCxgIHdoaWNoIHNlcGFyYXRlcyBiYXJjb2RlcyBhc3NvY2lhdGVkIHdpdGggcmVhZHMgY292ZXJpbmcgdGhlIHNlY29uZCBhbGxlbGUKKiBQUwogICAgKyBwaGFzZSBzZXQKICAgICAgICArIEluZm9ybWF0aW9uIGFib3V0IHRoZSBwaGFzZSBibG9jayBmb3Igd2l0aCB0aGUgdmFyaWFudCBpcyBhc3NpZ25lZCAKClRoaXMgZXh0cmEgaW5mb3JtYXRpb24gY2FuIGJlIHZlcnkgdXNlZnVsIGZvciBsb29raW5nIGF0IHZhcmlhbnRzIHRoYXQgbWF5IG9yIG1heSBub3QgYmUgaW4gX2Npc18gb3IgX3RyYW5zXy4gVGhpcyBjYW4gYmUgZXNwZWNpYWxseSB1c2VmdWwgaWYgeW91IGhhdmUgY29tcG91bmQgaGV0ZXJvenlnb3RlIHZhcmlhbnRzLiBBbGwgdGhlIGFsbGVsZXMgb24gb25lIHNpZGUgb2YgdGhlIHNlcGFyYXRvciAoYHxgKSB3aXRoIHRoZSBzYW1lIGBQU2AgYXJlIGZyb20gdGhlIHNhbWUgaGFwbG90eXBlICh0aHVzIHNhbWUgcGFyZW50KS4gCgpfTm90ZV86IEZvciBHVCwgYHxgIHJlcHJlc2VudHMgYSBwaGFzZWQgdmFyaWFudCBgXGAgcmVwcmVzZW50cyBhbiB1bnBoYXNlZCB2YXJpYW50LiBEZWZpbml0aW9ucyBvZiBhbGwgdGhlIFZDRiB0YWdzIGFyZSBhdmFpbGFibGUgW2hlcmVdKGh0dHBzOi8vc3VwcG9ydC4xMHhnZW5vbWljcy5jb20vZ2Vub21lLWV4b21lL3NvZnR3YXJlL3BpcGVsaW5lcy9sYXRlc3Qvb3V0cHV0L3ZjZikKCl9JbmZvcm1hdGljcyBUaXBfOiBJZiBoYXZlIGEgdmFyaWFudCBvZiBpbnRlcmVzdCBhbmQgeW91J2QgbGlrZSB0byBsb29rIGF0IGFsbCB0aGUgU05QcyB3aXRoaW4gdGhlIHNhbWUgcGhhc2VibG9jayAoZm9yIGV4YW1wbGUgYGNocjE2CTIwNDIzNTNgIGluIGBOQTEyODc4X3dlc192YXJjYWxscy52Y2YuZ3pgKSB5b3UgeW91IGNhbiBzaW1wbHkgcnVuIAoKKiBgemNhdCBOQTEyODc4X3dlc192YXJjYWxscy52Y2YuZ3ogfCByZyAnMTMwODA3NCdgIAoKVGhpcyB3aWxsIG91dHB1dCBhbGwgY2FsbGVkIFNOUHMsIGJvdGggZmlsdGVyZWQgYW5kIHVuZmlsdGVyZWQsIHRoYXQgbGFuZCBpbiB0aGUgcGFzZWJsb2NrIG9mIGludGVyZXN0LiBTTlBzIHdpdGggdGhlIHNhbWUgYFBTYCBudW1iZXIgYXJlIGluIF9jaXNfIHdpdGggZWFjaCBvdGhlci4gVGhpcyBpcyB2ZXJ5IGluZm9ybWF0aXZlIHdoZW4geW91IGhhdmUgYSBwb3RlbnRpYWwgY29tcG91bmQgdmFyaWFudC4gCgpUaGUgMTB4IFZDRiBpcyBmdWxseSBjb21wYXRpYmxlIHdpdGggZG93bnN0cmVhbSBhbmFseXNpcyB0b29scyBzdWNoIGFzIFtWYXJpYW50IEVmZmVjdCBQcmVkaWN0b3JdKGh0dHBzOi8vdXN3ZXN0LmVuc2VtYmwub3JnL2luZm8vZG9jcy90b29scy92ZXAvaW5kZXguaHRtbCksIFtzbnBFRkZdKGh0dHA6Ly9zbnBlZmYuc291cmNlZm9yZ2UubmV0LyksIGFuZCBbR2VtaW5pXShodHRwOi8vZ2VtaW5pLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9pbmRleC5odG1sKSB0byBuYW1lIGEgZmV3LiAKCioqKgoKIyAqKkV4cGxvcmluZyAxMHggRGF0YSoqCgojIyAqKkV4cGxvcmluZyB0aGUgMTB4IGRhdGEgdmlhIEludGVncmF0ZWQgR2Vvbm9tZSBCcm93c2VyIChJR1YpIGZyb20gdGhlIEJyb2FkIEluc3RpdHV0ZSoqCklHViBpcyBvbmUgb2YgdGhlIG1vc3QgY29tbW9uIHRvb2xzIHVzZWQgaW4gdGhlIGZpZWxkIG9mIGdlbm9taWNzIHRvIHZpZXcgYSB2YXJpZXR5IG9mIGRpZmZlcmVudCBkYXRhIHR5cGVzLiBJZiB5b3UgZG8gbm90IGhhdmUgSUdWIChvbiB5b3VyIGxhcHRvcCBub3QgeW91ciB0ZXJtaW5hbCksIG9yIGRvbid0IGhhdmUgdGhlIGxhdGVzdCB2ZXJzaW9uICgyLjQpLCBwbGVhc2UgZG93bmxvYWQgYW5kIGluc3RhbGwgaXQgZnJvbSBlaXRoZXIgaG9tZS1icmV3IGBicmV3IGluc3RhbGwgaWd2YCBvciBjb25kYSBgY29uZGEgaW5zdGFsbCBpZ3ZgLiBJZiB5b3UgZG9uJ3QgdXNlIGNvbmRhIG9yIGhvbWUtYnJldyBJR1YgY2FuIGJlIG1hbnVhbGx5IGluc3RhbGwgaGVyZTogaHR0cHM6Ly9zb2Z0d2FyZS5icm9hZGluc3RpdHV0ZS5vcmcvc29mdHdhcmUvaWd2L2Rvd25sb2FkLgoKX05vdGVfOiBUeXBlIGB3aGljaCBpZ3ZgIHdpbGwgc2hvdyB5b3Ugd2hlcmUgSUdWIGhhcyBiZWVuIGluc3RhbGxlZC4gWW91IGNhbiBuYXZpZ2F0ZSB0byB0aGF0IGRpcmVjdG9yeSBhbmQgY2xpY2sgb24gaWd2Lmphci4KCgpGaXJzdCBvcGVuIElHViBhbmQgbG9hZCB0aGUgMTB4IGRhdGEuIFRoZXJlIGFyZSB0d28gLmJhbSBmaWxlcyB0aGF0IGNhbiBiZSBleHBsb3JlZC4gSGVyZSdzIGEgc25hcHNob3Qgb2YgdGhlIGAxMHgtYmFtLWZpbGVzYCBkaXJlY3RvcnkKCmBgYAp1YnVudHVAaXAtMTcyLTMxLTYzLTE1Njp+LzEweC1iYW0tZmlsZXMkIGxzIC9ob21lL3VidW50dS8xMHgtYmFtLWZpbGVzCnRvdGFsIDEuM0cKLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDY0TSBBcHIgIDIgMTc6MzcgTkExMjg3OF9jaHIyMV9waGFzZWRfcG9zc29ydGVkX2V4b21lX2JhbS5iYW0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDgzSyBBcHIgIDIgMTc6MzcgTkExMjg3OF9jaHIyMV9waGFzZWRfcG9zc29ydGVkX2V4b21lX2JhbS5iYW0uYmFpCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDEuMkcgQXByICAyIDE3OjQxIE5BMTI4NzhfY2hyMjFfcGhhc2VkX3Bvc3NvcnRlZF9XR1NfYmFtLmJhbQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAxMTZLIEFwciAgMiAxNzozNyBOQTEyODc4X2NocjIxX3BoYXNlZF9wb3Nzb3J0ZWRfV0dTX2JhbS5iYW0uYmFpCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICA4OTEgQXByICAyIDE3OjQ0IFJFQURNRS5tZApgYGAKCkluIG9yZGVyIHRvIGxvYWQgb25lIG9mIHRoZSAuYmFtIGZpbGVzIGZvbGxvdyB0aGUgZm9sbG93aW5nIHN0ZXBzLgoKMS4gTmF2aWdhdGUgeW91ciBicm93c2VyIHRvIGAvMTB4LWJhbS1maWxlcy9gIGRpcmVjdG9yeSBvbiB0aGUgZnRwCjIuIENvcHkgdGhlIGxpbmsgYWRkcmVzcyBmb3Igb25lIG9mIHRoZSAuYmFtIGZpbGVzCjMuIE9wZW4gSUdWCjQuIENsaWNrIEZpbGUgLT4gTG9hZCBmcm9tIFVSTAogICAgKyBEbyB0aGUgc2FtZSB0aGluZyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgLnZjZi5neiBpZiB5b3UnZCBsaWtlCjUuIFBhc3RlIHRoZSBjb3BpZWQgbGluayBhZGRyZXNzIGludG8gdGhlIGZpcnN0IGJveCAoeW91IHdpbGwgbm90IG5lZWQgdG8gcGFzdGUgYW55dGhpbmcgaW50byB0aGUgc2Vjb25kIGJveCkKNi4gTmF2aWdhdGUgdG8geW91ciBmYXZvcml0ZSBnZW5lIG9uIGNocjIxCiAgICArIE1heWJlIF9DQlNfCgpEZXBlbmRpbmcgb24gd2hhdCB2aWV3IHlvdSBhcmUgaW4geW91IG1pZ2h0IHNlZSByZWFkcyBwYWlyZWQgaW4gYSB2YXJpZXR5IG9mIGRpZmZlcmVudCB3YXlzLiBUbyBzaG93IHNvbWUgb2YgdGhlIHNwZWNpYWwgZmVhdHVyZXMgb2YgdGhlIDEweCBkYXRhOiAKCjEuIFJpZ2h0IGNsaWNrIG9uIHRoZSBjZWxsIHRvIHRoZSBsZWZ0IGVuZGluZyBpbiAiYmFtLmJhbSIKMi4gU2VsZWN0ICJWaWV3IGxpbmtlZCByZWFkcyAoQlgpIgoKVG8gdmlldyB0aGUgYmVuZWZpdCBvZiBwaGFzaW5nIG5hdmlnYXRlIHRvIGBjaHIyMTo0NCw0ODUsMzMwLTQ0LDQ4NSwzNzBgCgpUaGlzIHdpbGwgb3JkZXIgdGhlIHJlYWRzIGJ5IGJhcmNvZGUgYW5kLCBpZiBwb3NzaWJsZSwgc2hvdyBwaGFzaW5nIG9mIHRoZSByZWdpb24gdGhhdCB5b3UgYXJlIGludmVzdGlnYXRpbmcuIEdyb3VwcyBvZiByZWFkcyB3aWxsIGJlICJsaW5rZWQiIHRvIGVhY2ggb3RoZXIgYnkgdGhlIGluZGl2aWR1YWwgYmFyY29kZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzaW5nbGUgbW9sZWN1bGUgdGhhdCB0aGUgcmVhZHMgb3JpZ2luYXRlZCBmcm9tLiBUaGUgcmVhZHMgYW5kIGJhcmNvZGVzIHdpbGwgYWxzbyBiZSBzZXBhcmF0ZWQgaW50byBwaGFzZWQgaGFwbG90eXBlcyAxIChyZWQpIGFuZCAyIChibHVlKS4gVGhvc2UgcmVhZHMgdGhhdCBjb3VsZCBub3QgYmUgcGhhc2VkIGFyZSByZXByZXNlbnRlZCBieSBncmV5IGxpbmVzLiBUaGVzZSB1bnBoYXNlZCByZWFkcyBhcmUgc3RpbGwgdXNlZnVsIGFuZCBhcmUgdXRpbGl6ZWQgaW4gbW9zdCBzdGVwcyBvZiBMb25ncmFuZ2VyLgoKU29tZSB0aGluZ3MgdG8ga2VlcCBpbiBtaW5kIHdoZW4gdGhpbmtpbmcgYWJvdXQgMTB4IGRhdGEKCjEuIElucHV0IG1hdGVyaWFsICoqTUFUVEVSUyoqCiAgICArIFRoZSBvbGQgYWRhZ2UgIlB1dCBqdW5rIGluIGdldCBqdW5rIG91dCIgYXBwbGllcyBoZXJlCiAgICArIExpbmtlZC1SZWFkIGRhdGEgY2FuIGJlIGdlbmVyYXRlZCBmcm9tIHNob3J0ZXIgZnJhZ21lbnRzIGFuZCBtdWNoIG9mIHRoZSBlbmhhbmNlIHV0aWxpdHkgaXMgcmV0YWluZWQgYnV0IHRoZSBsb25nZXIgRE5BIGlucHV0IGxlbmd0aCB0aGUgYmV0dGVyCjIuIE5vdCBvbmx5IHdpbGwgeW91IGhhdmUgInJlYWQgY292ZXJhZ2UiIGF0IGFueSBnaXZlbiBsb2N1cyB5b3Ugd2lsbCBhbHNvIGhhdmUgcGh5c2ljYWwsIG9yIGJhcmNvZGUsIGNvdmVyYWdlCiAgICArIFRoaXMgZW5hYmxlcyBlbmhhbmNlZCBTdHJ1Y3R1cmFsIFZhcmlhbnQgZGV0ZWN0aW9uIGZyb20gd2hhdCBpcyBvdGhlcndpc2Ugc2hvcnQtcmVhZCBkYXRhCjMuIFBoYXNpbmcgaXMgY29tcGxldGVseSBkZXBlbmRlbnQgb24KICAgICsgU05WIHZhcmlhdGlvbiBpbiB0aGUgZ2l2ZW4gcmVnaW9uCiAgICArIEFjY2Vzc2liaWxpdHkgdG8gdGhhdCByZWdpb24KICAgIAoqKioKCiMjICoqRXhwbG9yaW5nIHRoZSAxMHggZGF0YSB2aWEgdGhlIExvdXBlIEJyb3dzZXIgYnkgMTB4IEdlbm9taWNzKioKClRoZSBMb3VwZSBCcm93c2VyIGlzIGEgMTB4IHNwZWNpZmljIGdlbm9tZSBicm93c2VyIHRoYXQgbW9yZSBmdWxseSBjYXB0dXJlcyBzb21lIG9mIHRoZSBlbmhhbmNlZCBpbmZvcm1hdGlvbiB0aGF0IExpbmtlZC1SZWFkcyB3aWxsIGdldCB5b3UgaW4geW91ciBXR1Mgb3IgV0VTIGV4cGVyaW1lbnRzLiBbTG91cGVdKGh0dHBzOi8vc3VwcG9ydC4xMHhnZW5vbWljcy5jb20vZ2Vub21lLWV4b21lL3NvZnR3YXJlL3Zpc3VhbGl6YXRpb24vbGF0ZXN0L3doYXQtaXMtbG91cGUpIGlzIGZ1bGx5IGludGVncmF0ZWQgaW50byB0aGUgTG9uZ3JhbmdlciBwaXBlbGluZSBhbmQgLmxvdXBlIGZpbGVzIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBkZWZhdWx0LiAKCklmIHlvdSBsb29rIGF0IHRoZSBgMTB4LWxvdXBlLWZpbGVzYCBkaXJlY3RvcnkgeW91IGNhbiBzZWUgdGhyZWUgbG91cGUgZmlsZXMgdG8gZXhwbG9yZS4gCgpgYGAKdWJ1bnR1QGlwLTE3Mi0zMS02My0xNTY6fi8xMHgtbG91cGUtZmlsZXMkIGxzIC9ob21lL3VidW50dS8xMHgtbG91cGUtZmlsZXMKdG90YWwgNDIyTQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgNDBNIERlYyAgOCAwOTowMiBMdW5nVHVtb3JULmxvdXBlCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDM4M00gQXByIDEwIDIwOjA1IE5BMTI4NzhfZXhvbWUubG91cGUKYGBgCgojIyMgVGhlIExvdXBlIG1haW4gcGFnZQoKRmlyc3QgbGV0J3MgZ28gdG8gdGhlIExvdXBlIGJyb3dzZXIgYW5kIGNsaWNrIG9uIGBOQTEyODc4X2V4b21lLmxvdXBlYC4gVGhpcyB3aWxsIGJyaW5nIHVzIHRvIHRoZSBtYWluIHBhZ2Ugb2YgTG91cGUgd2hpY2ggbG9va3MgbGlrZSB0aGlzLiAKCiFbXShodHRwOi8vMzQuMjA1LjY4Ljk0L2ZpZ3VyZXMvTG91cGVfZnJvbnRwYWdlLnBuZykKRmlndXJlIDMuIFRoZSBMb3VwZSBtYWluIHBhZ2UuIExvdXBlIGlzIGEgMTB4IEdlbm9taWNzIGdlbm9tZSBicm93c2VyIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byB2aXN1YWxpemUgMTB4IExpbmtlZC1SZWFkIGRhdGEuIAoKCkFzIHlvdSBjYW4gc2VlIHdlIGhhdmUgc29tZSBuaWNlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIHBlcmZvcm1hbmNlIG9mIG91ciBzZXF1ZW5jaW5nIGV4cGVyaW1lbnQgaW5jbHVkaW5nOgoKKiBUaGUgbnVtYmVyIG9mIGdlbmVzIHBoYXNlZAogICAgKyBGcmFjdGlvbiBvZiBnZW5lcyAoPDEwMGtiIGxvbmcpIHRoYXQgYXJlIGNvbnRhaW5lZCB3aXRoaW4gYSBzaW5nbGUgcGhhc2UgYmxvY2suCiogUGhhc2UtYmxvY2sgaW5mb3JtYXRpb24KICAgICsgU05QcyBQaGFzZWQKICAgICAgICArIFBlcmNlbnRhZ2Ugb2YgaGV0ZXJvenlnb3VzIFNOUHMgdGhhdCB3ZXJlIHBoYXNlZC4KICAgICsgTG9uZ2VzdCBQaGFzZSBCbG9jawogICAgICAgICsgTGVuZ3RoIG9mIHRoZSBsb25nZXN0IHBoYXNlIGJsb2NrLgogICAgKyBONTAgUGhhc2UgQmxvY2sKICAgICAgICArIEhhbGYgb2YgdGhlIGdlbm9tZSB3YXMgcGhhc2VkIGludG8gcGhhc2UgYmxvY2tzIG9mIGF0IGxlYXN0IHRoaXMgbGVuZ3RoLgoqIE1vbGVjdWxlIGxlbmd0aCBkaXN0cmlidXRpb24gKHdlJ2xsIHdvcmsgb24gcmVjcmVhdGluZyB0aGlzKQoqIEdFTSBzdGF0aXN0aWNzCgoKIyMjIEhhcGxvdHlwZSBWaWV3CgpMZXQncyBuYXZpZ2F0ZSB0byBgY2hyMTc6NDEsMDc0LDUzMC00MSwzOTksMjgyYAoKIVtdKGh0dHA6Ly8zNC4yMDUuNjguOTQvZmlndXJlcy9OQTEyODc4X2hhcGxvdHlwZXMucG5nKQpGaWd1cmUgNC4gSGFwbG90eXBlcyB2aWV3IGluIHRoZSBMb3VwZSBnZW5vbWUgYnJvd3Nlci4KClRoZXJlIGFyZSBhIGxvdCBvZiAiY2xpY2thYmxlIiBmZWF0dXJlcyB0byBzZWUgaGVyZToKCiogQW4gYW5ub3RhdGlvbiB0cmFjawoqIENvdmVyYWdlIHRyYWNrIGluIGdyZWVuCiogRXhvbWUgYmFpdCB0YXJnZXRzIChibHVlIGJhcnMpCiogVmFyaWFudHMKCiFbXShodHRwOi8vMzQuMjA1LjY4Ljk0L2ZpZ3VyZXMvbGVnZW5kLnN2ZykKRmlndXJlIDUuIFZhcmlhbnQgdHlwZXMgcmVwcmVzZW50ZWQgaW4gTG91cGUgZ2Vub21lIGJyb3dzZXIuCgoqIFBoYXNlLWJsb2NrcyAoYmxhY2spCiAgICArIEJyZWFrcyBpbiBwaGFzaW5nIGRvIG5vdCBoYXZlIGJsYWNrIGJveCBhcm91bmQgdGhlbQoKIyMjIExpbmtlZC1SZWFkIFZpZXcKCkhlcmUgeW91IGNhbiBzZWUgYSBzaW1pbGFyIG91dHB1dCB0byB0aGF0IG9mIElHViBidXQgaXQgaXMgYSBiaXQgbW9yZSBkaWdlc3RpYmxlIGZvciB2aWV3aW5nIGxpbmtlZCByZWFkcy4gCgohW10oaHR0cDovLzM0LjIwNS42OC45NC9maWd1cmVzL2xvdXBlLWxpbmtlZC1yZWFkcy5wbmcpCkZpZ3VyZSA2LiBMaW5rZWQtUmVhZCB2aWV3IGluIHRoZSBMb3VwZSBnZW5vbWUgYnJvd3Nlci4gSGFwbG90eXBlIDEgaXMgc2hvd24gaW4geWVsbG93LCBoYXBsb3R5cGUgMiBpcyBzaG93biBpbiBwdXJwbGUuIEdyZXkgcmVhZHMvYmFyY29kZXMgY291bGQgbm90IGJlIGFzc2lnbmVkIHRvIGEgaGFwbG90eXBlCgpPbmNlIGFnYWluLCB3ZSBjYW4gc2VlIHJlYWRzIGNsZWFybHkgcGhhc2VkIGJ5IGhhcGxvdHlwZSBhbmQgcmVhZHMgdGhhdCBkbyBub3QgZ2V0IHBoYXNlZCBpbiBncmV5LgoKKiBJbiBMYXJpYXQgbW9kZSwgTG91cGUgY29sb3JzIHJlYWRzIGJhc2VkIG9uIHRoZWlyIGFsaWdubWVudCBwcm9wZXJ0aWVzOgogICAgKyBSZWFkcyB3aXRoIGEgTUFQUSBsZXNzIHRoYW4gMzAgYXJlIGNvbG9yZWQgZ3JleQogICAgKyBSZWFkcyB3aXRoIGEgaGlnaCBtYXBxIHRoYXQgdW5pcXVlbHkgYWxpZ25lZCBhcmUgY29sb3JlZCBibGFjawogICAgKyBSZWFkcyB3aXRoIGEgaGlnaCBtYXBxIHRoYXQgbGFyaWF0IHdhcyBhYmxlIHRvIGFsaWduIGJlY2F1c2Ugb2YgdGhlaXIgbGlua2FnZSB0byBvdGhlciByZWFkcyBhcmUgY29sb3JlZCBncmVlbi4KCgojIyMgKipMaW5rZWQtUmVhZCBWaWV3KioKSWYgd2Ugb3BlbiB1cCB0aGUgTkExMjg3OF93Z3MubG91cGUgZmlsZSwgbmF2aWdhdGUgdG8gYGNocjI6MzQsNTk1LDgzOC0zNCw3OTUsODM4YCwgYW5kIGNsaWNrIG9uIExpbmtlZC1SZWFkcyB3ZSBjYW4gdmVyeSBjbGVhcmx5IHNlZSBhIGhlbWl6eWdvdXMgZGVsZXRpb24gaW4gYm90aCB0aGUgCgoqKkxpbmtlZC1SZWFkIFZpZXcqKgoKIVtdKGh0dHA6Ly8zNC4yMDUuNjguOTQvZmlndXJlcy9sb3VwZS1saW5rZWQtcmVhZHMtZGVsLnBuZykKRmlndXJlIDcuIEhlbWl6eWdvdXMgZGVsZXRpb24gZXhhbXBsZS4gVmlldyBvZiBhIGRlbGV0aW9uIG9uIGNocjIgc2hvd2luZyBwaGFzZWQgcmVhZHMgYWJzZW50IGluIGhhcGxvdHlwZSAxIGFuZCBwcmVzZW50IGluIGhhcGxvdHlwZSAyLgoKCgoqKioKCiMgKipNb3JlIEluZm8qKgoKIyMgKipTdHJ1Y3R1cmFsIFZhcmlhbnRzIFZpZXcqKgoKVGhlcmUgaXMgYSB3aG9sZSBvdGhlciB3b3JsZCBvZiBpbnZlc3RpZ2F0aW5nIFNWcyBpbiAxMHggZGF0YS4gSWYgd2UgbG9vayBhdCB0aGUgU3RydWN0dXJhbCBWYXJpYW50IFZpZXcgaW4gTG91cGUgV2UgY2FuIHNlZSBzb21lIG5pY2UgZXhhbXBsZXMgU1ZzLgoKYGBgCiAgICAyIDM0LDY5NSw4MzAgIEFDMDczMjE4Li4uREVMCjkzCQogICAgMiAzNCw3MzYsNTUyICBBQzA3MzIxOC4uLjQwLjcga2IJCmBgYAoKIVtdKGh0dHA6Ly8zNC4yMDUuNjguOTQvZmlndXJlcy9sb3VwZS1zdi1kZWwucG5nKQoKCiFbXShodHRwOi8vMzQuMjA1LjY4Ljk0L2ZpZ3VyZXMvbG91cGUtc3YtYmFyY29kZS1tYXRyaXgucG5nKQoKPGJyPjxicj48YnI+PGJyPgoKIyMgKipBcHBsaWNhdGlvbiBOb3RlIG9mIFNWIHZpZXcqKgoKPG9iamVjdCBkYXRhPSJodHRwOi8vMzQuMjA1LjY4Ljk0L2ZpZ3VyZXMvTElUMDAwMTRfUmV2QV9TdHJ1Y3R1cmFsX1ZhcmlhbnRfQW5hbHlzaXNfQXBwbGljYXRpb25fTm90ZV9EaWdpdGFsLnBkZiIgdHlwZT0iYXBwbGljYXRpb24vcGRmIiB3aWR0aD0iNzAwcHgiIGhlaWdodD0iNzAwcHgiPgogICAgPGVtYmVkIHNyYz0iaHR0cDovLzM0LjIwNS42OC45NC9maWd1cmVzL0xJVDAwMDE0X1JldkFfU3RydWN0dXJhbF9WYXJpYW50X0FuYWx5c2lzX0FwcGxpY2F0aW9uX05vdGVfRGlnaXRhbC5wZGYiPgogICAgICAgIFRoaXMgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IFBERnMuIFBsZWFzZSBkb3dubG9hZCB0aGUgUERGIHRvIHZpZXcgaXQ6IDxhIGhyZWY9Imh0dHA6Ly8zNC4yMDUuNjguOTQvZmlndXJlcy9MSVQwMDAxNF9SZXZBX1N0cnVjdHVyYWxfVmFyaWFudF9BbmFseXNpc19BcHBsaWNhdGlvbl9Ob3RlX0RpZ2l0YWwucGRmIj5Eb3dubG9hZCBQREY8L2E+LjwvcD4KICAgIDwvZW1iZWQ+Cjwvb2JqZWN0PgoKPGJyPjxicj48YnI+PGJyPgoKIyMgKioxMHggR2Vub21pY3MgU29mdHdhcmUqKgoKQWxsIDEweCBzcGVjaWZpYyBzb2Z0d2FyZSBhbmQgaW5mb3JtYXRpb24gYWJvdXQgMTB4IHNwZWNpZmljIGZpbGUgZm9ybWF0cyBjYW4gYmUgZm91bmQgW2hlcmVdKGh0dHBzOi8vc3VwcG9ydC4xMHhnZW5vbWljcy5jb20vZ2Vub21lLWV4b21lL3NvZnR3YXJlL3BpcGVsaW5lcy9sYXRlc3Qvd2hhdC1pcy1sb25nLXJhbmdlcikKCgoqIElmIGZvciBzb21lIHJlYXNvbiB5b3UgY2FuJ3QgZ2V0IHRoaXMgdHV0b3JpYWwgbGF0ZXIgaXQgaXMgaG9zdGVkIGhlcmUuIGh0dHBzOi8vc3RlcGhlbndpbGxpYW1zMjIuZ2l0aHViLmlvL0pheF9NYXJrZG93bi8KCgoKCgo=
 

A work by Stephen R. Williams, PhD