Getting started

This document assumes you’ve already ran a sample an ONT Nanopore device and have generated fast5 files recording the squiggles of that run.

This document is intended to be used as a copy paste template for two sbatch scripts. The first script will use a GPU to take advantage of parallelization. While the second will run on a CPU as these tools lack GPU integration. Being sbatch scripts these need to be executed from the command line using:

sbatch filename.sh

#Step 1. We will perform base-calling on these fast5 files to convert them to FASTQ files. We will be using ONT’s Guppy for this, although other base callers exist.

#Step 2. Once we have FASTQ files we can align to a reference genome, with an optional structural variant call.

If your reference genome is small (< 4Gb): Step 2a. Aligning DNA to a small (< 4Gb) genome. Step 2b. Aligning cDNA to a small (< 4Gb) genome.

If your reference genome is large (> 4Gb):
Step 2c. Aligning DNA to a large (> 4Gb) genome. Step 2d. Aligning cDNA to a large (> 4Gb) genome.

#Step 3 Alternatively we can create de novo assemblies using miniasm.

Step 1 - Base-calling

#!/bin/bash
#
#SBATCH --verbose
#SBATCH --job-name=guppy
#SBATCH --output=guppy_%j.out
#SBATCH --error=guppy_%j.err
#SBATCH --time=24:00:00
#SBATCH --nodes=1
#SBATCH --mem=20GB
#SBATCH --mail-type=BEGIN,END,FAIL,TIME_LIMIT
#SBATCH --gres=gpu:1

nanopore_experiment_path=<path>
flowcell=<flowcell_type>
kit=<kit_id>

module purge
module load guppy/4.5.2_gpu

guppy_basecaller \
        --input_path ${nanopore_experiment_path}/fast5 \
        --save_path ${nanopore_experiment_path}/FASTQ \
        --flowcell ${flowcell} \
        --kit ${kit} \
        --device "auto"

Note that you will need to provied the path for ‘nanopore_experiment_path’ this should point to the where you uploaded the nanopore run on the server. Make sure the fast5 directory in contained in this directory.

The flowcell_type will likely be ‘FLO-MIN106’. You can find this specified in the experiment report generated during the run. Refer to the guppy documentation if you are not using a FLO-MIN106 device.

The kit_id will probably be either ‘SQK-LSK110’ (for DNA) or ‘SQK-DCS109’ (for cDNA) sequencing. Again you can find this specified in the experiment report generated during the run. Refer to the guppy documentation if you are not using one of these options.

Step 2a. Aligning DNA to a small (< 4Gb) genome

#!/bin/bash
#
#SBATCH --verbose
#SBATCH --job-name=minimap_DNA_small
#SBATCH --output=minimap_%j.out
#SBATCH --error=minimap_%j.err
#SBATCH --time=24:00:00
#SBATCH --nodes=1
#SBATCH --mem=20GB
#SBATCH --mail-type=BEGIN,END,FAIL,TIME_LIMIT

#module load
module load samtools/intel/1.12
module load minimap2/2.22

#(for optional structural variant calling)
module load sniffles/1.0.12

ref_fa=<refernce_fasta>

#sample:
sample_name=<sample_name>
    in_dir=<location_of '/FASTQ/pass/' generated by guppy>
    out_dir=<preferred output path>
    #
    mkdir -p ${out_dir}

  #Align nanopore long reads to a reference genome
    #Combine reads
        echo 'combining fastq'
        cat ${in_dir}*.fastq > ${out_dir}${sample_name}.fastq
            
        #Align reads
        echo 'running minimap'
            minimap2 -ax map-ont ${ref_fa} ${out_dir}${sample_name}.fastq > ${out_dir}${sample_name}.sam
        
        #Generate bams:
        echo 'samtools post alignment'
            samtools view -Sb ${out_dir}${sample_name}.sam -o ${out_dir}${sample_name}.bam
            samtools sort ${out_dir}${sample_name}.bam -o ${out_dir}${sample_name}.sorted.bam
            samtools index ${out_dir}${sample_name}.sorted.bam
        
        #(for optional structural variant calling)
        #Call structural variants
        echo 'Call SVs'
            samtools calmd -Eb ${out_dir}${sample_name}.sorted.bam --reference ${ref_fa} > ${out_dir}${sample_name}.md.bam
            sniffles -m ${out_dir}${sample_name}.md.bam -v ${out_dir}${sample_name}_sniffles.vcf

Step 2b. Aligning cDNA* to a small (< 4Gb) genome

*any spliced long reads

#!/bin/bash
#
#SBATCH --verbose
#SBATCH --job-name=minimap_cDNA_small
#SBATCH --output=minimap_%j.out
#SBATCH --error=minimap_%j.err
#SBATCH --time=24:00:00
#SBATCH --nodes=1
#SBATCH --mem=20GB
#SBATCH --mail-type=BEGIN,END,FAIL,TIME_LIMIT

#module load
module load samtools/intel/1.12
module load minimap2/2.22

#(for optional structural variant calling)
module load sniffles/1.0.12

ref_fa=<refernce_fasta>

#annotated yeast splice sites bed
#generated using: paftools.js gff2bed anno.gff > anno.bed
anno_splice=/scratch/cgsb/gresham/pieter/genome/Saccharomyces_cerevisiae_ensembl/Saccharomyces_cerevisiae.R64-1-1.104.bed
#maximum intron length
max_intron=1000

#sample:
sample_name=<sample_name>
  in_dir=<location_of '/FASTQ/pass/' generated by guppy>
  out_dir=<preferred output path>
    #
    mkdir -p ${out_dir}

  #Align nanopore long reads to a reference genome
    #Combine reads
        echo 'combining fastq'
        cat ${in_dir}*.fastq > ${out_dir}${sample_name}.fastq
            
        #Align reads
        echo 'running minimap'
          minimap2 -ax splice --junc-bed ${anno_splice} -G ${max_intron} ${ref_fa} ${out_dir}${sample_name}.fastq > ${out_dir}${sample_name}.sam
            
        #Generate bams:
        echo 'samtools post alignment'
            samtools view -Sb ${out_dir}${sample_name}.sam -o ${out_dir}${sample_name}.bam
            samtools sort ${out_dir}${sample_name}.bam -o ${out_dir}${sample_name}.sorted.bam
            samtools index ${out_dir}${sample_name}.sorted.bam
        
        #(for optional structural variant calling)
        #Call structural variants
        echo 'Call SVs'
            samtools calmd -Eb ${out_dir}${sample_name}.sorted.bam --reference ${ref_fa} > ${out_dir}${sample_name}.md.bam
            sniffles -m ${out_dir}${sample_name}.md.bam -v ${out_dir}${sample_name}_sniffles.vcf

Step 2c. Aligning DNA to a large (> 4Gb) genome

##NB If you are using the human genome, double check that you are using the appropriate genome http://lh3.github.io/2017/11/13/which-human-reference-genome-to-use #TL;DR Dont use ‘dna.toplevel.fa’

#!/bin/bash
#
#SBATCH --verbose
#SBATCH --job-name=minimap_DNA_large
#SBATCH --output=minimap_%j.out
#SBATCH --error=minimap_%j.err
#SBATCH --time=24:00:00
#SBATCH --nodes=1
#SBATCH --mem=40GB
#SBATCH --mail-type=BEGIN,END,FAIL,TIME_LIMIT

#module load
module load samtools/intel/1.12
module load minimap2/2.22

#(for optional structural variant calling)
module load sniffles/1.0.12

#############################################
### Example of downloading a large genome ###
#mkdir -p genome
#cd genome
#wget ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCA/000/001/405/GCA_000001405.15_GRCh38/seqs_for_alignment_pipelines.ucsc_ids/GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.gz
#gunzip *.gz
#ref_fa=GCA_000001405.15_GRCh38_no_alt_analysis_set.fna
#cd ..
###
#############################################

#create a minimizer index of the reference fasta
ref_fa=<refernce_fasta>
ref_mmi=${ref_fa}.mmi
minimap2 -d ${ref_mmi} ${ref_fa}

#because large genomes will loose their sam headers, we need to repair them 
# before converting to bam files.
ref_fai=${ref_fa}.fai
samtools faidx ${ref_fa}

#sample:
sample_name=<sample_name>
  input_path=<location_of '/FASTQ/pass/' generated by guppy>
  output_path=<preferred output path>
  #
    in_dir=${input_path}
    out_dir=${output_path}/ont_${sample_name}/
    #
    mkdir -p ${out_dir}

  #Align nanopore long reads to a reference genome
    #Combine reads
        echo 'combining fastq'
        cat ${in_dir}*.fastq > ${out_dir}${sample_name}.fastq
            
        #Align reads
        echo 'running minimap'
            minimap2 -ax map-ont ${ref_mmi} ${out_dir}${sample_name}.fastq > ${out_dir}${sample_name}.sam
        
        #Generate bams:
        echo 'samtools post alignment'
            samtools view -t ${ref_fai} -Sb ${out_dir}${sample_name}.sam -o ${out_dir}${sample_name}.bam
            samtools sort ${out_dir}${sample_name}.bam -o ${out_dir}${sample_name}.sorted.bam
            samtools index ${out_dir}${sample_name}.sorted.bam
        
        #(for optional structural variant calling)
        #Call structural variants
        echo 'Call SVs'
            samtools calmd -Eb ${out_dir}${sample_name}.sorted.bam --reference ${ref_fa} > ${out_dir}${sample_name}.md.bam
            sniffles -m ${out_dir}${sample_name}.md.bam -v ${out_dir}${sample_name}_sniffles.vcf

Step 2d. Aligning cDNA to a large (> 4Gb) genome

##NB If you are using the human genome, double check that you are using the appropriate genome http://lh3.github.io/2017/11/13/which-human-reference-genome-to-use #TL;DR Dont use ‘dna.toplevel.fa’

#!/bin/bash
#
#SBATCH --verbose
#SBATCH --job-name=minimap_cDNA_large
#SBATCH --output=minimap_%j.out
#SBATCH --error=minimap_%j.err
#SBATCH --time=24:00:00
#SBATCH --nodes=1
#SBATCH --mem=40GB
#SBATCH --mail-type=BEGIN,END,FAIL,TIME_LIMIT

#module load
module load samtools/intel/1.12
module load minimap2/2.22

#(for optional structural variant calling)
module load sniffles/1.0.12

#############################################
### Example of downloading a large genome ###
#mkdir -p genome
#cd genome
#wget ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCA/000/001/405/GCA_000001405.15_GRCh38/seqs_for_alignment_pipelines.ucsc_ids/GCA_000001405.15_GRCh38_no_alt_analysis_set.fna.gz
#gunzip *.gz
#ref_fa=GCA_000001405.15_GRCh38_no_alt_analysis_set.fna
#cd ..
###
#############################################

#create a minimizer index of the reference fasta
ref_fa=<refernce_fasta>
ref_mmi=${reference_fasta}.mmi
minimap2 -d ${ref_mmi} ${ref_fa}

#because large genomes will loose their sam headers, we need to repair them 
# before converting to bam files.
ref_fai=${reference_fasta}.fai
samtools faidx ${ref_fa}

#annotated human splice sites bed
#generated using: paftools.js gff2bed anno.gff > anno.bed
anno_splice=/scratch/cgsb/gresham/pieter/genome/hsapiens/Homo_sapiens.GRCh38.104.bed

#sample:
sample_name=<sample_name>
  #
    in_dir=<location_of '/FASTQ/pass/' generated by guppy>
    out_dir=<preferred output path>
    #
    mkdir -p ${out_dir}

  #Align nanopore long reads to a reference genome
    #Combine reads
        echo 'combining fastq'
        cat ${in_dir}*.fastq > ${out_dir}${sample_name}.fastq
            
        #Align reads
        echo 'running minimap'
            minimap2 -ax splice ${ref_mmi} --junc-bed ${anno_splice} -G ${max_intron} ${out_dir}${sample_name}.fastq > ${out_dir}${sample_name}.sam
        
        #Generate bams:
        echo 'samtools post alignment'
            samtools view -t ${ref_fai} -Sb ${out_dir}${sample_name}.sam -o ${out_dir}${sample_name}.bam
            samtools sort ${out_dir}${sample_name}.bam -o ${out_dir}${sample_name}.sorted.bam
            samtools index ${out_dir}${sample_name}.sorted.bam
        
        #(for optional structural variant calling)
        #Call structural variants
        echo 'Call SVs'
            samtools calmd -Eb ${out_dir}${sample_name}.sorted.bam --reference ${ref_fa} > ${out_dir}${sample_name}.md.bam
            sniffles -m ${out_dir}${sample_name}.md.bam -v ${out_dir}${sample_name}_sniffles.vcf

Step 3. De novo assembly

#!/bin/bash
#
#SBATCH --verbose
#SBATCH --job-name=miniasm
#SBATCH --output=miniasm_%j.out
#SBATCH --error=miniasm_%j.err
#SBATCH --time=24:00:00
#SBATCH --nodes=1
#SBATCH --mem=20GB
#SBATCH --mail-type=BEGIN,END,FAIL,TIME_LIMIT

#module load
module load minimap2/2.22
module load miniasm/0.3

#sample:
sample_name=<sample_name>
  input_path=<location_of '/FASTQ/pass/' generated by guppy>
  output_path=<preferred output path>
  #
    in_dir=${input_path}
    out_dir=${output_path}/asm_${sample_name}/
    #
    mkdir -p ${out_dir}

  #Align nanopore long reads to a reference genome
    #Combine reads
        echo 'combining fastq'
        cat ${in_dir}*.fastq > ${out_dir}${sample_name}.fastq
            
        #Self-align reads
        echo 'running minimap'
        minimap2 -x ava-ont -t8 ${out_dir}${sample_name}.fastq | gzip -1 > ${out_dir}${sample_name}_reads.paf.gz
        
        #Generate gfa:
        echo 'running miniasm'
        miniasm -f ${out_dir}${sample_name}.fastq ${out_dir}${sample_name}_reads.paf.gz > ${out_dir}${sample_name}_assembly.gfa
            
LS0tDQp0aXRsZTogIk5hbm9wb3JlIFNjcmlwdHMiDQphdXRob3I6ICJQaWV0ZXIgU3BlYWxtYW4iDQpkYXRlOiAiMTAvNy8yMDIxIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyMgR2V0dGluZyBzdGFydGVkDQoNClRoaXMgZG9jdW1lbnQgYXNzdW1lcyB5b3UndmUgYWxyZWFkeSByYW4gYSBzYW1wbGUgYW4gT05UIE5hbm9wb3JlIGRldmljZSBhbmQgaGF2ZSBnZW5lcmF0ZWQgZmFzdDUgZmlsZXMgcmVjb3JkaW5nIHRoZSBzcXVpZ2dsZXMgb2YgdGhhdCBydW4uIA0KDQpUaGlzIGRvY3VtZW50IGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgYSBjb3B5IHBhc3RlIHRlbXBsYXRlIGZvciB0d28gc2JhdGNoIHNjcmlwdHMuIFRoZSBmaXJzdCBzY3JpcHQgd2lsbCB1c2UgYSBHUFUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgcGFyYWxsZWxpemF0aW9uLiBXaGlsZSB0aGUgc2Vjb25kIHdpbGwgcnVuIG9uIGEgQ1BVIGFzIHRoZXNlIHRvb2xzIGxhY2sgR1BVIGludGVncmF0aW9uLiBCZWluZyBzYmF0Y2ggc2NyaXB0cyB0aGVzZSBuZWVkIHRvIGJlIGV4ZWN1dGVkIGZyb20gdGhlIGNvbW1hbmQgbGluZSB1c2luZzoNCg0KYGBgDQpzYmF0Y2ggZmlsZW5hbWUuc2gNCmBgYA0KDQojU3RlcCAxLiANCldlIHdpbGwgcGVyZm9ybSBiYXNlLWNhbGxpbmcgb24gdGhlc2UgZmFzdDUgZmlsZXMgdG8gY29udmVydCB0aGVtIHRvIEZBU1RRIGZpbGVzLiBXZSB3aWxsIGJlIHVzaW5nIE9OVCdzIEd1cHB5IGZvciB0aGlzLCBhbHRob3VnaCBvdGhlciBiYXNlIGNhbGxlcnMgZXhpc3QuDQoNCiNTdGVwIDIuDQpPbmNlIHdlIGhhdmUgRkFTVFEgZmlsZXMgd2UgY2FuIGFsaWduIHRvIGEgcmVmZXJlbmNlIGdlbm9tZSwgd2l0aCBhbiBvcHRpb25hbCBzdHJ1Y3R1cmFsIHZhcmlhbnQgY2FsbC4NCg0KSWYgeW91ciByZWZlcmVuY2UgZ2Vub21lIGlzIHNtYWxsICg8IDRHYik6DQogIFN0ZXAgMmEuIEFsaWduaW5nIEROQSB0byBhIHNtYWxsICg8IDRHYikgZ2Vub21lLiANCiAgU3RlcCAyYi4gQWxpZ25pbmcgY0ROQSB0byBhIHNtYWxsICg8IDRHYikgZ2Vub21lLg0KDQpJZiB5b3VyIHJlZmVyZW5jZSBnZW5vbWUgaXMgbGFyZ2UgKD4gNEdiKTogIA0KICBTdGVwIDJjLiBBbGlnbmluZyBETkEgdG8gYSBsYXJnZSAoPiA0R2IpIGdlbm9tZS4NCiAgU3RlcCAyZC4gQWxpZ25pbmcgY0ROQSB0byBhIGxhcmdlICg+IDRHYikgZ2Vub21lLg0KDQojU3RlcCAzDQpBbHRlcm5hdGl2ZWx5IHdlIGNhbiBjcmVhdGUgZGUgbm92byBhc3NlbWJsaWVzIHVzaW5nIG1pbmlhc20uDQoNCg0KIyMgU3RlcCAxIC0gQmFzZS1jYWxsaW5nIA0KDQpgYGB7fQ0KIyEvYmluL2Jhc2gNCiMNCiNTQkFUQ0ggLS12ZXJib3NlDQojU0JBVENIIC0tam9iLW5hbWU9Z3VwcHkNCiNTQkFUQ0ggLS1vdXRwdXQ9Z3VwcHlfJWoub3V0DQojU0JBVENIIC0tZXJyb3I9Z3VwcHlfJWouZXJyDQojU0JBVENIIC0tdGltZT0yNDowMDowMA0KI1NCQVRDSCAtLW5vZGVzPTENCiNTQkFUQ0ggLS1tZW09MjBHQg0KI1NCQVRDSCAtLW1haWwtdHlwZT1CRUdJTixFTkQsRkFJTCxUSU1FX0xJTUlUDQojU0JBVENIIC0tZ3Jlcz1ncHU6MQ0KDQpuYW5vcG9yZV9leHBlcmltZW50X3BhdGg9PHBhdGg+DQpmbG93Y2VsbD08Zmxvd2NlbGxfdHlwZT4NCmtpdD08a2l0X2lkPg0KDQptb2R1bGUgcHVyZ2UNCm1vZHVsZSBsb2FkIGd1cHB5LzQuNS4yX2dwdQ0KDQpndXBweV9iYXNlY2FsbGVyIFwNCiAgICAgICAgLS1pbnB1dF9wYXRoICR7bmFub3BvcmVfZXhwZXJpbWVudF9wYXRofS9mYXN0NSBcDQogICAgICAgIC0tc2F2ZV9wYXRoICR7bmFub3BvcmVfZXhwZXJpbWVudF9wYXRofS9GQVNUUSBcDQogICAgICAgIC0tZmxvd2NlbGwgJHtmbG93Y2VsbH0gXA0KICAgICAgICAtLWtpdCAke2tpdH0gXA0KICAgICAgICAtLWRldmljZSAiYXV0byINCmBgYA0KDQpOb3RlIHRoYXQgeW91IHdpbGwgbmVlZCB0byBwcm92aWVkIHRoZSBwYXRoIGZvciAnbmFub3BvcmVfZXhwZXJpbWVudF9wYXRoJyB0aGlzIHNob3VsZCBwb2ludCB0byB0aGUgd2hlcmUgeW91IHVwbG9hZGVkIHRoZSBuYW5vcG9yZSBydW4gb24gdGhlIHNlcnZlci4gTWFrZSBzdXJlIHRoZSBmYXN0NSBkaXJlY3RvcnkgaW4gY29udGFpbmVkIGluIHRoaXMgZGlyZWN0b3J5Lg0KDQpUaGUgZmxvd2NlbGxfdHlwZSB3aWxsIGxpa2VseSBiZSAnRkxPLU1JTjEwNicuIFlvdSBjYW4gZmluZCB0aGlzIHNwZWNpZmllZCBpbiB0aGUgZXhwZXJpbWVudCByZXBvcnQgZ2VuZXJhdGVkIGR1cmluZyB0aGUgcnVuLiBSZWZlciB0byB0aGUgZ3VwcHkgZG9jdW1lbnRhdGlvbiBpZiB5b3UgYXJlIG5vdCB1c2luZyBhIEZMTy1NSU4xMDYgZGV2aWNlLg0KDQpUaGUga2l0X2lkIHdpbGwgcHJvYmFibHkgYmUgZWl0aGVyICdTUUstTFNLMTEwJyAoZm9yIEROQSkgb3IgJ1NRSy1EQ1MxMDknIChmb3IgY0ROQSkgc2VxdWVuY2luZy4gQWdhaW4geW91IGNhbiBmaW5kIHRoaXMgc3BlY2lmaWVkIGluIHRoZSBleHBlcmltZW50IHJlcG9ydCBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBydW4uIFJlZmVyIHRvIHRoZSBndXBweSBkb2N1bWVudGF0aW9uIGlmIHlvdSBhcmUgbm90IHVzaW5nIG9uZSBvZiB0aGVzZSBvcHRpb25zLg0KDQojIyMgU3RlcCAyYS4gQWxpZ25pbmcgRE5BIHRvIGEgc21hbGwgKDwgNEdiKSBnZW5vbWUgDQpgYGB7fQ0KIyEvYmluL2Jhc2gNCiMNCiNTQkFUQ0ggLS12ZXJib3NlDQojU0JBVENIIC0tam9iLW5hbWU9bWluaW1hcF9ETkFfc21hbGwNCiNTQkFUQ0ggLS1vdXRwdXQ9bWluaW1hcF8lai5vdXQNCiNTQkFUQ0ggLS1lcnJvcj1taW5pbWFwXyVqLmVycg0KI1NCQVRDSCAtLXRpbWU9MjQ6MDA6MDANCiNTQkFUQ0ggLS1ub2Rlcz0xDQojU0JBVENIIC0tbWVtPTIwR0INCiNTQkFUQ0ggLS1tYWlsLXR5cGU9QkVHSU4sRU5ELEZBSUwsVElNRV9MSU1JVA0KDQojbW9kdWxlIGxvYWQNCm1vZHVsZSBsb2FkIHNhbXRvb2xzL2ludGVsLzEuMTINCm1vZHVsZSBsb2FkIG1pbmltYXAyLzIuMjINCg0KIyhmb3Igb3B0aW9uYWwgc3RydWN0dXJhbCB2YXJpYW50IGNhbGxpbmcpDQptb2R1bGUgbG9hZCBzbmlmZmxlcy8xLjAuMTINCg0KcmVmX2ZhPTxyZWZlcm5jZV9mYXN0YT4NCg0KI3NhbXBsZToNCnNhbXBsZV9uYW1lPTxzYW1wbGVfbmFtZT4NCglpbl9kaXI9PGxvY2F0aW9uX29mICcvRkFTVFEvcGFzcy8nIGdlbmVyYXRlZCBieSBndXBweT4NCglvdXRfZGlyPTxwcmVmZXJyZWQgb3V0cHV0IHBhdGg+DQoJIw0KCW1rZGlyIC1wICR7b3V0X2Rpcn0NCg0KICAjQWxpZ24gbmFub3BvcmUgbG9uZyByZWFkcyB0byBhIHJlZmVyZW5jZSBnZW5vbWUNCgkjQ29tYmluZSByZWFkcw0KCQllY2hvICdjb21iaW5pbmcgZmFzdHEnDQoJCWNhdCAke2luX2Rpcn0qLmZhc3RxID4gJHtvdXRfZGlyfSR7c2FtcGxlX25hbWV9LmZhc3RxDQoJCQkNCgkJI0FsaWduIHJlYWRzDQoJCWVjaG8gJ3J1bm5pbmcgbWluaW1hcCcNCgkJCW1pbmltYXAyIC1heCBtYXAtb250ICR7cmVmX2ZhfSAke291dF9kaXJ9JHtzYW1wbGVfbmFtZX0uZmFzdHEgPiAke291dF9kaXJ9JHtzYW1wbGVfbmFtZX0uc2FtDQoJCQ0KCQkjR2VuZXJhdGUgYmFtczoNCgkJZWNobyAnc2FtdG9vbHMgcG9zdCBhbGlnbm1lbnQnDQoJCQlzYW10b29scyB2aWV3IC1TYiAke291dF9kaXJ9JHtzYW1wbGVfbmFtZX0uc2FtIC1vICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfS5iYW0NCgkJCXNhbXRvb2xzIHNvcnQgJHtvdXRfZGlyfSR7c2FtcGxlX25hbWV9LmJhbSAtbyAke291dF9kaXJ9JHtzYW1wbGVfbmFtZX0uc29ydGVkLmJhbQ0KCQkJc2FtdG9vbHMgaW5kZXggJHtvdXRfZGlyfSR7c2FtcGxlX25hbWV9LnNvcnRlZC5iYW0NCgkJDQoJCSMoZm9yIG9wdGlvbmFsIHN0cnVjdHVyYWwgdmFyaWFudCBjYWxsaW5nKQ0KCQkjQ2FsbCBzdHJ1Y3R1cmFsIHZhcmlhbnRzDQoJCWVjaG8gJ0NhbGwgU1ZzJw0KCQkJc2FtdG9vbHMgY2FsbWQgLUViICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfS5zb3J0ZWQuYmFtIC0tcmVmZXJlbmNlICR7cmVmX2ZhfSA+ICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfS5tZC5iYW0NCgkJCXNuaWZmbGVzIC1tICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfS5tZC5iYW0gLXYgJHtvdXRfZGlyfSR7c2FtcGxlX25hbWV9X3NuaWZmbGVzLnZjZg0KYGBgDQoNCiMjIyBTdGVwIDJiLiBBbGlnbmluZyBjRE5BKiB0byBhIHNtYWxsICg8IDRHYikgZ2Vub21lDQoqYW55IHNwbGljZWQgbG9uZyByZWFkcyANCmBgYHt9DQojIS9iaW4vYmFzaA0KIw0KI1NCQVRDSCAtLXZlcmJvc2UNCiNTQkFUQ0ggLS1qb2ItbmFtZT1taW5pbWFwX2NETkFfc21hbGwNCiNTQkFUQ0ggLS1vdXRwdXQ9bWluaW1hcF8lai5vdXQNCiNTQkFUQ0ggLS1lcnJvcj1taW5pbWFwXyVqLmVycg0KI1NCQVRDSCAtLXRpbWU9MjQ6MDA6MDANCiNTQkFUQ0ggLS1ub2Rlcz0xDQojU0JBVENIIC0tbWVtPTIwR0INCiNTQkFUQ0ggLS1tYWlsLXR5cGU9QkVHSU4sRU5ELEZBSUwsVElNRV9MSU1JVA0KDQojbW9kdWxlIGxvYWQNCm1vZHVsZSBsb2FkIHNhbXRvb2xzL2ludGVsLzEuMTINCm1vZHVsZSBsb2FkIG1pbmltYXAyLzIuMjINCg0KIyhmb3Igb3B0aW9uYWwgc3RydWN0dXJhbCB2YXJpYW50IGNhbGxpbmcpDQptb2R1bGUgbG9hZCBzbmlmZmxlcy8xLjAuMTINCg0KcmVmX2ZhPTxyZWZlcm5jZV9mYXN0YT4NCg0KI2Fubm90YXRlZCB5ZWFzdCBzcGxpY2Ugc2l0ZXMgYmVkDQojZ2VuZXJhdGVkIHVzaW5nOiBwYWZ0b29scy5qcyBnZmYyYmVkIGFubm8uZ2ZmID4gYW5uby5iZWQNCmFubm9fc3BsaWNlPS9zY3JhdGNoL2Nnc2IvZ3Jlc2hhbS9waWV0ZXIvZ2Vub21lL1NhY2NoYXJvbXljZXNfY2VyZXZpc2lhZV9lbnNlbWJsL1NhY2NoYXJvbXljZXNfY2VyZXZpc2lhZS5SNjQtMS0xLjEwNC5iZWQNCiNtYXhpbXVtIGludHJvbiBsZW5ndGgNCm1heF9pbnRyb249MTAwMA0KDQojc2FtcGxlOg0Kc2FtcGxlX25hbWU9PHNhbXBsZV9uYW1lPg0KICBpbl9kaXI9PGxvY2F0aW9uX29mICcvRkFTVFEvcGFzcy8nIGdlbmVyYXRlZCBieSBndXBweT4NCiAgb3V0X2Rpcj08cHJlZmVycmVkIG91dHB1dCBwYXRoPg0KCSMNCglta2RpciAtcCAke291dF9kaXJ9DQoNCiAgI0FsaWduIG5hbm9wb3JlIGxvbmcgcmVhZHMgdG8gYSByZWZlcmVuY2UgZ2Vub21lDQoJI0NvbWJpbmUgcmVhZHMNCgkJZWNobyAnY29tYmluaW5nIGZhc3RxJw0KCQljYXQgJHtpbl9kaXJ9Ki5mYXN0cSA+ICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfS5mYXN0cQ0KCQkJDQoJCSNBbGlnbiByZWFkcw0KCQllY2hvICdydW5uaW5nIG1pbmltYXAnDQoJCSAgbWluaW1hcDIgLWF4IHNwbGljZSAtLWp1bmMtYmVkICR7YW5ub19zcGxpY2V9IC1HICR7bWF4X2ludHJvbn0gJHtyZWZfZmF9ICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfS5mYXN0cSA+ICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfS5zYW0NCgkJCQ0KCQkjR2VuZXJhdGUgYmFtczoNCgkJZWNobyAnc2FtdG9vbHMgcG9zdCBhbGlnbm1lbnQnDQoJCQlzYW10b29scyB2aWV3IC1TYiAke291dF9kaXJ9JHtzYW1wbGVfbmFtZX0uc2FtIC1vICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfS5iYW0NCgkJCXNhbXRvb2xzIHNvcnQgJHtvdXRfZGlyfSR7c2FtcGxlX25hbWV9LmJhbSAtbyAke291dF9kaXJ9JHtzYW1wbGVfbmFtZX0uc29ydGVkLmJhbQ0KCQkJc2FtdG9vbHMgaW5kZXggJHtvdXRfZGlyfSR7c2FtcGxlX25hbWV9LnNvcnRlZC5iYW0NCgkJDQoJCSMoZm9yIG9wdGlvbmFsIHN0cnVjdHVyYWwgdmFyaWFudCBjYWxsaW5nKQ0KCQkjQ2FsbCBzdHJ1Y3R1cmFsIHZhcmlhbnRzDQoJCWVjaG8gJ0NhbGwgU1ZzJw0KCQkJc2FtdG9vbHMgY2FsbWQgLUViICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfS5zb3J0ZWQuYmFtIC0tcmVmZXJlbmNlICR7cmVmX2ZhfSA+ICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfS5tZC5iYW0NCgkJCXNuaWZmbGVzIC1tICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfS5tZC5iYW0gLXYgJHtvdXRfZGlyfSR7c2FtcGxlX25hbWV9X3NuaWZmbGVzLnZjZg0KYGBgDQoNCiMjIyBTdGVwIDJjLiBBbGlnbmluZyBETkEgdG8gYSBsYXJnZSAoPiA0R2IpIGdlbm9tZQ0KIyNOQiBJZiB5b3UgYXJlIHVzaW5nIHRoZSBodW1hbiBnZW5vbWUsIGRvdWJsZSBjaGVjayB0aGF0IHlvdSBhcmUgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGdlbm9tZQ0KaHR0cDovL2xoMy5naXRodWIuaW8vMjAxNy8xMS8xMy93aGljaC1odW1hbi1yZWZlcmVuY2UtZ2Vub21lLXRvLXVzZQ0KI1RMO0RSIERvbnQgdXNlICdkbmEudG9wbGV2ZWwuZmEnDQpgYGB7fQ0KIyEvYmluL2Jhc2gNCiMNCiNTQkFUQ0ggLS12ZXJib3NlDQojU0JBVENIIC0tam9iLW5hbWU9bWluaW1hcF9ETkFfbGFyZ2UNCiNTQkFUQ0ggLS1vdXRwdXQ9bWluaW1hcF8lai5vdXQNCiNTQkFUQ0ggLS1lcnJvcj1taW5pbWFwXyVqLmVycg0KI1NCQVRDSCAtLXRpbWU9MjQ6MDA6MDANCiNTQkFUQ0ggLS1ub2Rlcz0xDQojU0JBVENIIC0tbWVtPTQwR0INCiNTQkFUQ0ggLS1tYWlsLXR5cGU9QkVHSU4sRU5ELEZBSUwsVElNRV9MSU1JVA0KDQojbW9kdWxlIGxvYWQNCm1vZHVsZSBsb2FkIHNhbXRvb2xzL2ludGVsLzEuMTINCm1vZHVsZSBsb2FkIG1pbmltYXAyLzIuMjINCg0KIyhmb3Igb3B0aW9uYWwgc3RydWN0dXJhbCB2YXJpYW50IGNhbGxpbmcpDQptb2R1bGUgbG9hZCBzbmlmZmxlcy8xLjAuMTINCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMgRXhhbXBsZSBvZiBkb3dubG9hZGluZyBhIGxhcmdlIGdlbm9tZSAjIyMNCiNta2RpciAtcCBnZW5vbWUNCiNjZCBnZW5vbWUNCiN3Z2V0IGZ0cDovL2Z0cC5uY2JpLm5sbS5uaWguZ292L2dlbm9tZXMvYWxsL0dDQS8wMDAvMDAxLzQwNS9HQ0FfMDAwMDAxNDA1LjE1X0dSQ2gzOC9zZXFzX2Zvcl9hbGlnbm1lbnRfcGlwZWxpbmVzLnVjc2NfaWRzL0dDQV8wMDAwMDE0MDUuMTVfR1JDaDM4X25vX2FsdF9hbmFseXNpc19zZXQuZm5hLmd6DQojZ3VuemlwICouZ3oNCiNyZWZfZmE9R0NBXzAwMDAwMTQwNS4xNV9HUkNoMzhfbm9fYWx0X2FuYWx5c2lzX3NldC5mbmENCiNjZCAuLg0KIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KI2NyZWF0ZSBhIG1pbmltaXplciBpbmRleCBvZiB0aGUgcmVmZXJlbmNlIGZhc3RhDQpyZWZfZmE9PHJlZmVybmNlX2Zhc3RhPg0KcmVmX21taT0ke3JlZl9mYX0ubW1pDQptaW5pbWFwMiAtZCAke3JlZl9tbWl9ICR7cmVmX2ZhfQ0KDQojYmVjYXVzZSBsYXJnZSBnZW5vbWVzIHdpbGwgbG9vc2UgdGhlaXIgc2FtIGhlYWRlcnMsIHdlIG5lZWQgdG8gcmVwYWlyIHRoZW0gDQojIGJlZm9yZSBjb252ZXJ0aW5nIHRvIGJhbSBmaWxlcy4NCnJlZl9mYWk9JHtyZWZfZmF9LmZhaQ0Kc2FtdG9vbHMgZmFpZHggJHtyZWZfZmF9DQoNCiNzYW1wbGU6DQpzYW1wbGVfbmFtZT08c2FtcGxlX25hbWU+DQogIGlucHV0X3BhdGg9PGxvY2F0aW9uX29mICcvRkFTVFEvcGFzcy8nIGdlbmVyYXRlZCBieSBndXBweT4NCiAgb3V0cHV0X3BhdGg9PHByZWZlcnJlZCBvdXRwdXQgcGF0aD4NCiAgIw0KCWluX2Rpcj0ke2lucHV0X3BhdGh9DQoJb3V0X2Rpcj0ke291dHB1dF9wYXRofS9vbnRfJHtzYW1wbGVfbmFtZX0vDQoJIw0KCW1rZGlyIC1wICR7b3V0X2Rpcn0NCg0KICAjQWxpZ24gbmFub3BvcmUgbG9uZyByZWFkcyB0byBhIHJlZmVyZW5jZSBnZW5vbWUNCgkjQ29tYmluZSByZWFkcw0KCQllY2hvICdjb21iaW5pbmcgZmFzdHEnDQoJCWNhdCAke2luX2Rpcn0qLmZhc3RxID4gJHtvdXRfZGlyfSR7c2FtcGxlX25hbWV9LmZhc3RxDQoJCQkNCgkJI0FsaWduIHJlYWRzDQoJCWVjaG8gJ3J1bm5pbmcgbWluaW1hcCcNCgkJCW1pbmltYXAyIC1heCBtYXAtb250ICR7cmVmX21taX0gJHtvdXRfZGlyfSR7c2FtcGxlX25hbWV9LmZhc3RxID4gJHtvdXRfZGlyfSR7c2FtcGxlX25hbWV9LnNhbQ0KCQkNCgkJI0dlbmVyYXRlIGJhbXM6DQoJCWVjaG8gJ3NhbXRvb2xzIHBvc3QgYWxpZ25tZW50Jw0KCQkJc2FtdG9vbHMgdmlldyAtdCAke3JlZl9mYWl9IC1TYiAke291dF9kaXJ9JHtzYW1wbGVfbmFtZX0uc2FtIC1vICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfS5iYW0NCgkJCXNhbXRvb2xzIHNvcnQgJHtvdXRfZGlyfSR7c2FtcGxlX25hbWV9LmJhbSAtbyAke291dF9kaXJ9JHtzYW1wbGVfbmFtZX0uc29ydGVkLmJhbQ0KCQkJc2FtdG9vbHMgaW5kZXggJHtvdXRfZGlyfSR7c2FtcGxlX25hbWV9LnNvcnRlZC5iYW0NCgkJDQoJCSMoZm9yIG9wdGlvbmFsIHN0cnVjdHVyYWwgdmFyaWFudCBjYWxsaW5nKQ0KCQkjQ2FsbCBzdHJ1Y3R1cmFsIHZhcmlhbnRzDQoJCWVjaG8gJ0NhbGwgU1ZzJw0KCQkJc2FtdG9vbHMgY2FsbWQgLUViICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfS5zb3J0ZWQuYmFtIC0tcmVmZXJlbmNlICR7cmVmX2ZhfSA+ICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfS5tZC5iYW0NCgkJCXNuaWZmbGVzIC1tICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfS5tZC5iYW0gLXYgJHtvdXRfZGlyfSR7c2FtcGxlX25hbWV9X3NuaWZmbGVzLnZjZg0KYGBgDQoNCiMjIyBTdGVwIDJkLiBBbGlnbmluZyBjRE5BIHRvIGEgbGFyZ2UgKD4gNEdiKSBnZW5vbWUNCiMjTkIgSWYgeW91IGFyZSB1c2luZyB0aGUgaHVtYW4gZ2Vub21lLCBkb3VibGUgY2hlY2sgdGhhdCB5b3UgYXJlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBnZW5vbWUNCmh0dHA6Ly9saDMuZ2l0aHViLmlvLzIwMTcvMTEvMTMvd2hpY2gtaHVtYW4tcmVmZXJlbmNlLWdlbm9tZS10by11c2UNCiNUTDtEUiBEb250IHVzZSAnZG5hLnRvcGxldmVsLmZhJw0KYGBge30NCiMhL2Jpbi9iYXNoDQojDQojU0JBVENIIC0tdmVyYm9zZQ0KI1NCQVRDSCAtLWpvYi1uYW1lPW1pbmltYXBfY0ROQV9sYXJnZQ0KI1NCQVRDSCAtLW91dHB1dD1taW5pbWFwXyVqLm91dA0KI1NCQVRDSCAtLWVycm9yPW1pbmltYXBfJWouZXJyDQojU0JBVENIIC0tdGltZT0yNDowMDowMA0KI1NCQVRDSCAtLW5vZGVzPTENCiNTQkFUQ0ggLS1tZW09NDBHQg0KI1NCQVRDSCAtLW1haWwtdHlwZT1CRUdJTixFTkQsRkFJTCxUSU1FX0xJTUlUDQoNCiNtb2R1bGUgbG9hZA0KbW9kdWxlIGxvYWQgc2FtdG9vbHMvaW50ZWwvMS4xMg0KbW9kdWxlIGxvYWQgbWluaW1hcDIvMi4yMg0KDQojKGZvciBvcHRpb25hbCBzdHJ1Y3R1cmFsIHZhcmlhbnQgY2FsbGluZykNCm1vZHVsZSBsb2FkIHNuaWZmbGVzLzEuMC4xMg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyBFeGFtcGxlIG9mIGRvd25sb2FkaW5nIGEgbGFyZ2UgZ2Vub21lICMjIw0KI21rZGlyIC1wIGdlbm9tZQ0KI2NkIGdlbm9tZQ0KI3dnZXQgZnRwOi8vZnRwLm5jYmkubmxtLm5paC5nb3YvZ2Vub21lcy9hbGwvR0NBLzAwMC8wMDEvNDA1L0dDQV8wMDAwMDE0MDUuMTVfR1JDaDM4L3NlcXNfZm9yX2FsaWdubWVudF9waXBlbGluZXMudWNzY19pZHMvR0NBXzAwMDAwMTQwNS4xNV9HUkNoMzhfbm9fYWx0X2FuYWx5c2lzX3NldC5mbmEuZ3oNCiNndW56aXAgKi5neg0KI3JlZl9mYT1HQ0FfMDAwMDAxNDA1LjE1X0dSQ2gzOF9ub19hbHRfYW5hbHlzaXNfc2V0LmZuYQ0KI2NkIC4uDQojIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojY3JlYXRlIGEgbWluaW1pemVyIGluZGV4IG9mIHRoZSByZWZlcmVuY2UgZmFzdGENCnJlZl9mYT08cmVmZXJuY2VfZmFzdGE+DQpyZWZfbW1pPSR7cmVmZXJlbmNlX2Zhc3RhfS5tbWkNCm1pbmltYXAyIC1kICR7cmVmX21taX0gJHtyZWZfZmF9DQoNCiNiZWNhdXNlIGxhcmdlIGdlbm9tZXMgd2lsbCBsb29zZSB0aGVpciBzYW0gaGVhZGVycywgd2UgbmVlZCB0byByZXBhaXIgdGhlbSANCiMgYmVmb3JlIGNvbnZlcnRpbmcgdG8gYmFtIGZpbGVzLg0KcmVmX2ZhaT0ke3JlZmVyZW5jZV9mYXN0YX0uZmFpDQpzYW10b29scyBmYWlkeCAke3JlZl9mYX0NCg0KI2Fubm90YXRlZCBodW1hbiBzcGxpY2Ugc2l0ZXMgYmVkDQojZ2VuZXJhdGVkIHVzaW5nOiBwYWZ0b29scy5qcyBnZmYyYmVkIGFubm8uZ2ZmID4gYW5uby5iZWQNCmFubm9fc3BsaWNlPS9zY3JhdGNoL2Nnc2IvZ3Jlc2hhbS9waWV0ZXIvZ2Vub21lL2hzYXBpZW5zL0hvbW9fc2FwaWVucy5HUkNoMzguMTA0LmJlZA0KDQojc2FtcGxlOg0Kc2FtcGxlX25hbWU9PHNhbXBsZV9uYW1lPg0KICAjDQoJaW5fZGlyPTxsb2NhdGlvbl9vZiAnL0ZBU1RRL3Bhc3MvJyBnZW5lcmF0ZWQgYnkgZ3VwcHk+DQoJb3V0X2Rpcj08cHJlZmVycmVkIG91dHB1dCBwYXRoPg0KCSMNCglta2RpciAtcCAke291dF9kaXJ9DQoNCiAgI0FsaWduIG5hbm9wb3JlIGxvbmcgcmVhZHMgdG8gYSByZWZlcmVuY2UgZ2Vub21lDQoJI0NvbWJpbmUgcmVhZHMNCgkJZWNobyAnY29tYmluaW5nIGZhc3RxJw0KCQljYXQgJHtpbl9kaXJ9Ki5mYXN0cSA+ICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfS5mYXN0cQ0KCQkJDQoJCSNBbGlnbiByZWFkcw0KCQllY2hvICdydW5uaW5nIG1pbmltYXAnDQoJCQltaW5pbWFwMiAtYXggc3BsaWNlICR7cmVmX21taX0gLS1qdW5jLWJlZCAke2Fubm9fc3BsaWNlfSAtRyAke21heF9pbnRyb259ICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfS5mYXN0cSA+ICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfS5zYW0NCgkJDQoJCSNHZW5lcmF0ZSBiYW1zOg0KCQllY2hvICdzYW10b29scyBwb3N0IGFsaWdubWVudCcNCgkJCXNhbXRvb2xzIHZpZXcgLXQgJHtyZWZfZmFpfSAtU2IgJHtvdXRfZGlyfSR7c2FtcGxlX25hbWV9LnNhbSAtbyAke291dF9kaXJ9JHtzYW1wbGVfbmFtZX0uYmFtDQoJCQlzYW10b29scyBzb3J0ICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfS5iYW0gLW8gJHtvdXRfZGlyfSR7c2FtcGxlX25hbWV9LnNvcnRlZC5iYW0NCgkJCXNhbXRvb2xzIGluZGV4ICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfS5zb3J0ZWQuYmFtDQoJCQ0KCQkjKGZvciBvcHRpb25hbCBzdHJ1Y3R1cmFsIHZhcmlhbnQgY2FsbGluZykNCgkJI0NhbGwgc3RydWN0dXJhbCB2YXJpYW50cw0KCQllY2hvICdDYWxsIFNWcycNCgkJCXNhbXRvb2xzIGNhbG1kIC1FYiAke291dF9kaXJ9JHtzYW1wbGVfbmFtZX0uc29ydGVkLmJhbSAtLXJlZmVyZW5jZSAke3JlZl9mYX0gPiAke291dF9kaXJ9JHtzYW1wbGVfbmFtZX0ubWQuYmFtDQoJCQlzbmlmZmxlcyAtbSAke291dF9kaXJ9JHtzYW1wbGVfbmFtZX0ubWQuYmFtIC12ICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfV9zbmlmZmxlcy52Y2YNCmBgYA0KDQojIyMgU3RlcCAzLiBEZSBub3ZvIGFzc2VtYmx5DQpgYGB7fQ0KIyEvYmluL2Jhc2gNCiMNCiNTQkFUQ0ggLS12ZXJib3NlDQojU0JBVENIIC0tam9iLW5hbWU9bWluaWFzbQ0KI1NCQVRDSCAtLW91dHB1dD1taW5pYXNtXyVqLm91dA0KI1NCQVRDSCAtLWVycm9yPW1pbmlhc21fJWouZXJyDQojU0JBVENIIC0tdGltZT0yNDowMDowMA0KI1NCQVRDSCAtLW5vZGVzPTENCiNTQkFUQ0ggLS1tZW09MjBHQg0KI1NCQVRDSCAtLW1haWwtdHlwZT1CRUdJTixFTkQsRkFJTCxUSU1FX0xJTUlUDQoNCiNtb2R1bGUgbG9hZA0KbW9kdWxlIGxvYWQgbWluaW1hcDIvMi4yMg0KbW9kdWxlIGxvYWQgbWluaWFzbS8wLjMNCg0KI3NhbXBsZToNCnNhbXBsZV9uYW1lPTxzYW1wbGVfbmFtZT4NCiAgaW5wdXRfcGF0aD08bG9jYXRpb25fb2YgJy9GQVNUUS9wYXNzLycgZ2VuZXJhdGVkIGJ5IGd1cHB5Pg0KICBvdXRwdXRfcGF0aD08cHJlZmVycmVkIG91dHB1dCBwYXRoPg0KICAjDQoJaW5fZGlyPSR7aW5wdXRfcGF0aH0NCglvdXRfZGlyPSR7b3V0cHV0X3BhdGh9L2FzbV8ke3NhbXBsZV9uYW1lfS8NCgkjDQoJbWtkaXIgLXAgJHtvdXRfZGlyfQ0KDQogICNBbGlnbiBuYW5vcG9yZSBsb25nIHJlYWRzIHRvIGEgcmVmZXJlbmNlIGdlbm9tZQ0KCSNDb21iaW5lIHJlYWRzDQoJCWVjaG8gJ2NvbWJpbmluZyBmYXN0cScNCgkJY2F0ICR7aW5fZGlyfSouZmFzdHEgPiAke291dF9kaXJ9JHtzYW1wbGVfbmFtZX0uZmFzdHENCgkJCQ0KCQkjU2VsZi1hbGlnbiByZWFkcw0KCQllY2hvICdydW5uaW5nIG1pbmltYXAnDQoJCW1pbmltYXAyIC14IGF2YS1vbnQgLXQ4ICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfS5mYXN0cSB8IGd6aXAgLTEgPiAke291dF9kaXJ9JHtzYW1wbGVfbmFtZX1fcmVhZHMucGFmLmd6DQoJCQ0KCQkjR2VuZXJhdGUgZ2ZhOg0KCQllY2hvICdydW5uaW5nIG1pbmlhc20nDQoJCW1pbmlhc20gLWYgJHtvdXRfZGlyfSR7c2FtcGxlX25hbWV9LmZhc3RxICR7b3V0X2Rpcn0ke3NhbXBsZV9uYW1lfV9yZWFkcy5wYWYuZ3ogPiAke291dF9kaXJ9JHtzYW1wbGVfbmFtZX1fYXNzZW1ibHkuZ2ZhDQoJCQkNCmBgYA0KDQo=