Práticas em Bioinfo V

Prof. Heron OH

2023/01

     Olá, esta é mais uma de um conjunto de práticas em bioinformática desenvolvidas para o curso de Biomedicina da PUC MG. Você pode encontrar as demais práticas aqui.

     Na prática passada você aprendeu as características dos arquivos .fasta e .fastq, e as suas aplicações. Na prática de hoje daremos sentido biológico as sequências guardadas nesses arquivos, e aprenderemos sobre alinhamento e idetificação de sequências.

Bancos de dados de sequências biológicas

     Após a identificação do DNA como a molécula responsável pelo armazenamento da informação genética dos organismos, e a compreensão de que entidades biológicas chamadas genes tem sequências definida, os esforços dos geneticistas se direcionaram para a caracterização da diversidade dessas entidades, e de como suas variações refletem na biologia de cada organismo.

     Todas tecnologias de sequenciamento de DNA - sejam de Sanger, short reads ou long reads - tem sido utilizadas para alcançar este objetivo. E se as primeiras gerações de sequenciadores demoravam dias para caracterizar um gene ou um pedaço dele, as gerações mais recentes possibilitam conhecer genomas e transcriptomas inteiros em algums horas. À medida que tantas informações começaram a ser acumuladas, compreendeu-se que tão importante quando sequenciar, é armazenar essas sequências e os diversos metadados a elas relacionados. Quaisquer informações extrínsecas à sequência são importantes pois agregam conhecimento, e permitem comparações, a busca por padrões, e outras análises que possibilitam evidenciar padrões biológicos.

     Existem diversos bancos de dados biológicos, providos tanto de informações quanto de propósitos diferentes e complementares. Estes bancos são geralmente públicos, o que significa que qualquer um pode tanto submeter quanto baixar depósitos (sequências e suas informações associadas). o National Center for Biotechnology Information (NCBI) é um conjunto é um centro nacional de informações em biotecnologia dos Estados Unidos. Ele é parte do National Institute of Health (NIH) e é um importante recurso para pesquisadores, cientistas e profissionais da área de biologia e biomedicina. Seu principal objetivo do NCBI é fornecer acesso a uma ampla gama de informações biológicas, incluindo sequências de DNA, sequências de proteínas, literatura científica, dados genômicos, ferramentas de análise e recursos para pesquisa biomédica. O NCBI mantém diversos bancos de dados, como o PubMed (que indexa artigos científicos), o Protein Data Bank (que armazena informações sobre estruturas tridimensionais de proteínas), e o GenBank (que contém sequências), além muitos outros.

     Além disso, o NCBI desenvolve e disponibiliza várias ferramentas online para análise de sequências, busca de informações e pesquisa. Essas ferramentas são amplamente utilizadas por cientistas e pesquisadores em todo o mundo para realizar análises de bioinformática, estudar genes, proteínas e doenças, e realizar descobertas científicas importantes.

     O GenBank é considerado o repositório universal das sequências biológicas conhecias. Ele é integrado com e recebe atualizações diárias dos bancos de dados de sequências da Europa - o European Nucleotide Archive (ENA) - e do Japão - o DNA Data Bank of Japan (DDBJ). Desta maneira, praticamente todas as sequências conhecidas, sejam de DNA, RNA, proteína, ou outros tipos podem ser encontradas lá, e atualmente este banco possui mais de 2.9 bilhões de sequências únicas, correspondentes a mais de 504.000 espécies diferentes (REF).

Identificando sequências biológicas

Conectando no servidor

     Nesta aula trabalharemos novamente na edna, nosso servidor computacional para análises bioinformáticas.

Utilizando as credenciais fornecidas durante a aula, conecte no servidor de trabalho via SSH. Quando solicitado, forneça a senha:

#ex:
#ssh usuario@111.222.333.444

ssh $USER@$IP

DICA: Lembre-se que as palavras iniciadas com um $ são variáveis, ou seja, são palavras cujo significado depende da informação que armazenam. Assim, no comando acima você deve substituir $USER e IP pelas credenciais correspondentes.

Entrando na sua pasta de análises

     Uma vez na edna, navegue até o diretório que criamos na prática passada e que tem o seu nome ($ALUNO) e sua turma ($TURMA). Iremos trabalhar com as sequências que estão na pasta ~/$TURMA/$ALUNO/arquivos/fasta/seqs.

Navegue até a sua pasta de análises

cd ~/$TURMA/$ALUNO/arquivos/fasta/seqs

ls

Selecionando sequências

     Você recebeu estas 3 sequências diferentes. Qual gene elas representam? Vieram de qual organismo? Estas informações não estão intrínsecas à sequência, e precisamos recorrer a recursos externos para saber estas respostas.

Utilize algum comando de visualização para conhecer o conteúdo destes arquivos.

# ver uma seq
cat seq1.fasta

# ver todas
cat seq*

Combine todos os arquivos em um só para análise conjunta.

# combinar todas seqs
cat seq* > seqs.fasta

Dentro da sua pasta (~/$TURMA/$ALUNO) crie uma pasta para realisarmos a análise de hoje. Entre na pasta criada.

cd ~/$TURMA/$ALUNO/

mkdir analises

cd analises

Identificando sequências com o BLAST

     O BLAST (Basic Local Alignment Search Tool) é uma ferramenta de busca de similaridade baseada em alinhamento de sequências. É possivelmente o programa de bioinformática mais utilizado no mundo, e tem diversas aplicações, dependendo de como é utilizado. Este algorítmo tem diferentes variações, que vão depender basicamente do formato da sequência buscada e das sequências de referência. Ambas podem ser ser tanto sequências de nucleotídeo quanto de aminoácidos. Os tipos de BLAST são:

  • BLASTn: É usado para alinhar sequências de DNA com o objetivo de encontrar similaridades nucleotídicas. É útil para identificar homologias entre genes ou regiões genômicas.

  • BLASTp: É usado para comparar sequências de aminoácidos (proteínas) em bancos de dados de proteínas. O BLASTp é útil para identificar proteínas similares e determinar a função de proteínas desconhecidas com base em proteínas homólogas.

  • BLASTx: É usado para comparar sequências de DNA com bancos de dados de proteínas traduzidas. Ele traduz a sequência de DNA em todas as seis possíveis molduras de leitura e, em seguida, compara as sequências traduzidas com as proteínas no banco de dados. O BLASTx é útil para encontrar sequências codificadoras de proteínas em regiões de DNA desconhecidas.

  • tBLASTx: É usado para comparar sequências de DNA traduzidas em AA, com bancos de dados de DNA traduzidas em AA. Ou seja, os inputs são em nucleotídeos, mas a comparação é feita na de aminoácidos. Ele é muito utilizado na anotação de novos genes, que é o processo pelo qual se identifica uma possível função de um gene codificador de proteína através de sua semelhança com outros genes conhecidos.

  • tBLASTn: É usado para comparar sequências de proteínas com bancos de dados de DNA traduzidos. Ele traduz as sequências de DNA no banco de dados e, em seguida, compara-as com as sequências de proteínas de consulta. O tBLASTn é útil para encontrar sequências de DNA que possam estar codificando proteínas semelhantes.

  • BLASTz: É uma versão do BLAST projetada especificamente para alinhar regiões genômicas maiores. Ele é frequentemente usado para comparar genomas inteiros de espécies diferentes.

     Como a nossa sequência é de nucleotídeos, podemos utilizar o BLASTn. Vamos conhecê-lo melhor.

Conheça os possíveis argumentos e parâmetros do blastn.

blastn -help | less

     Como você pode ver, existem diversas configurações e formatos de saída possíveis. Vamos aprender a fazer uma busca simples. Para isto você precisa de:

  • Uma ou alguamas sequências a serem buscadas, no formato fasta, que chamamos de query;

  • Um banco de dados contendo outras sequências conhecidas, que chamamos de subject. No caso do BLAST na linha de comando, este banco de dados precisa ser local, ou seja, deve estar no computador onde se está fazendo a análise;

  • Um formato de saída da sua escolha, para a exibição dos resultados.

Rode o blastn para identificar a que pertencem as sequências que você tem.

#      #seq a ser buscada                              #banco de dados           #formato de saida 
blastn -query ~/$TURMA/$ALUNO/arquivos/fasta/seqs/seqs.fasta -db /data/databases/nt/nt -outfmt 6 -num_alignments 3

Observe a tabela gerada. Ela contém 12 colunas. Estas são:

  • Query ID: O identificador da sequência de buscada.

  • Subject ID: O identificador da sequência do banco de dados que corresponde ao subject.

  • % de identidade: A porcentagem de identidade entre a sequência buscada query e a sequência subject do banco de dados.

  • Tamanho do alinhamento: O comprimento do alinhamento a sequência buscada query e a sequência subject do banco de dados.

  • Mismatches: O número de bases que não correspondem a sequência buscada query e a sequência subject do banco de dados.

  • Gap Opens: O número de lacunas (gaps) no alinhamento entra a query e o subject.

  • Query Start: A posição inicial da sequência buscada query que corresponde ao alinhamento.

  • Query End: A posição final da sequência buscada query que corresponde ao alinhamento.

  • Subject Start: A posição inicial da sequência subject do banco de dados que corresponde ao alinhamento.

  • Subject End: A posição final da sequência subject do banco de dados que corresponde ao alinhamento.

  • E-value: O valor de significância (E-value) do alinhamento, que indica a probabilidade de encontrar um alinhamento semelhante por acaso.

  • Bit Score: O escore do alinhamento, que é uma medida da qualidade e também da significância do alinhamento, mas depende do banco de dados usado.

Analise o resultado. O que você consegue entender a partir dessas colunas?

     Apesar de já termos uma identificaçã positiva, esse formato de resultados não tem a informação completa sobre a qual organismo/gene se refere o subject. Para sabermos isso, precisamos usar outro comando.

No comando a seguir, substitua $HIT pela palavra na segunda coluna, que corresponde ao subject.

#      #seq a ser buscada                              #banco de dados           #formato de saida 
blastdbcmd -db /data/databases/nt/nt -entry $HIT -outfmt %t

Interprete o resultado. De que são as sequências?

Utilizando a versão online do BLAST

     Entre no site do BLAST e realize a mesma busca.

Use algum comando para visalizar uma das suas 3 sequências. Copie a sequência e cole na caixa de buscas do site do BLAST. Rode uma análise com os parâmetros default, ou seja, sem fazer alterações.

Compare estes resultados com os que você obteve na análise local.

Alinhado sequências

     Assim como o BLAST busca por sequências semelhantes utilizando alinhamentos locais entre query e subject, existem diversas outras análises que podem utilizar essa estratégia. Por exemplo, apesar de serem semelhantes, qual a diferença entre estas 3 sequências com as quais estamos trabalhando? Podemos responder esta pergunta com um alinhamento. Há dois tipos principais de alinhamentos, o Alinhamento local e o Alinhamento global:

  • Alinhamento Global: Este alinhamento compara duas sequências biológicas em sua totalidade, desde o início até o final. Ele identifica as regiões conservadas e as diferenças entre as sequências, alinhando todos os caracteres em ambos os conjuntos de dados. Esse tipo de alinhamento é útil quando as sequências têm comprimentos semelhantes e quando se deseja comparar as sequências como um todo. O alinhamento global é frequentemente usado para identificar similaridades entre proteínas ou genes de diferentes espécies, o que ajuda a inferir relações evolutivas e descobrir funções conservadas.

  • Alinhamento Local: Este alinhamento compara apenas as regiões mais semelhantes entre as sequências biológicas. Em vez de alinhar as sequências inteiras, ele identifica subsequências semelhantes, chamadas de alinhamentos locais, dentro das sequências maiores. Esse tipo de alinhamento é útil quando as sequências são de comprimentos diferentes ou quando se deseja identificar regiões específicas de similaridade, como motivos funcionais ou domínios conservados em proteínas. O alinhamento local é frequentemente usado para identificar regiões de homologia em sequências de DNA, RNA ou proteínas, permitindo inferências sobre estrutura e função. Este é o alinhamento utilizado pelo BLAST.

Alinhamentos local e global

     Agora vamos alinhar nossas sequências. Faremos isso com o programa MUSCLE, um alinhador clássico. Seu nome significa MUltiple Sequence Comparison by Log- Expectation. Ele pode ser encontrado em versão online aqui.

Entenda o funcionamento do programa. Em seguida, alinhe as sequências do arquivo combinado que você construiu.

muscle --help

# com output na tela
muscle -in ~/$TURMA/$ALUNO/arquivos/seqs/seqs.fasta -clw

# com output salvo em arquivo
muscle -in ~/$TURMA/$ALUNO/arquivos/seqs/seqs.fasta -clw -out seqs.algn

ls

less -S seqs.algn

Observe o alinhamento. Onde estão as diferenças?

     Esta sequência é de nucleotídeos. Você consegue perceber alguma diferença? Essas sequências geram proteínas iguais? Como seria o alinhamento com a de aminoácidos? Vamos traduzir:

Traduza as sequencias do seu arquivo combinado.

transeq  -sequence ~/$TURMA/$ALUNO/arquivos/seqs/seqs.fasta -outseq ~/$TURMA/$ALUNO/arquivos/seqs/seqs.pep

Alinhe as sequências do arquivo combinado que você traduziu em aminoácidos.


muscle -in ~/$TURMA/$ALUNO/arquivos/seqs/seqs.pep -clw

# com output salvo em arquivo
muscle -in ~/$TURMA/$ALUNO/arquivos/seqs/seqs.pep -clw -out seqs_pep.algn

ls

less -S seqs_pep.algn

Observe o alinhamento. O que as diferenças podem significar, conhecendo a origem e a função da proteínas que estamos analisando?


Voltar para a página inicial

LS0tCnRpdGxlOiAiUHLDoXRpY2FzIGVtIEJpb2luZm8gViIKYXV0aG9yOiAiUHJvZi4gSGVyb24gT0giCnBsYWNlOiAiQmlvbWVkaWNpbmEgLSBQVUMgTWluYXMiCmRhdGU6IDIwMjMvMDEKb3V0cHV0OiAKICBybWRmb3JtYXRzOjpkb3duY3V0ZToKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRvY19kZXB0aDogNQogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIGhpZ2hsaWdodDogemVuYnVybgogICAgY29kZV9kb3dubG9hZDogeWVzCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKYGBge3IgY29sb3IsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQojY29uZmlndXJhciBwcm9zIHJlc3VsdGFkb3MgZG8gYmFzaCBzYWlyZW0gY29sb3JpZG9zIGUgbsOjbyBBTlNJCgpvbGRfaG9va3MgPC0gZmFuc2k6OnNldF9rbml0X2hvb2tzKAogIGtuaXRyOjprbml0X2hvb2tzLCAKICB3aGljaCA9IGMoIm91dHB1dCIsICJtZXNzYWdlIiwgImVycm9yIikKKQpgYGAKCjxzdHlsZT4KYm9keSB7CnRleHQtYWxpZ246IGp1c3RpZnl9Cjwvc3R5bGU+Cgo8c3R5bGU+CiN0b2MgdWwubmF2IGxpIHVsIGxpIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBtYXgtaGVpZ2h0OiBub25lOwp9CgojdG9jIHVsLm5hdiBsaS5hY3RpdmUgdWwgbGkgIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgbWF4LWhlaWdodDogbm9uZTsKfQoKI3RvYyB1bC5uYXYgbGkgdWwgbGkgdWwgbGkgewogICAgbWF4LWhlaWdodDogbm9uZTsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoKI3RvYyB1bC5uYXYgbGkgdWwgbGkuYWN0aXZlIHVsIGxpIHsKICAgIG1heC1oZWlnaHQ6IG5vbmU7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50Owp9Cjwvc3R5bGU+CgoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ck9sw6EsIGVzdGEgw6kgbWFpcyB1bWEgZGUgdW0gY29uanVudG8gZGUgcHLDoXRpY2FzIGVtIGJpb2luZm9ybcOhdGljYSBkZXNlbnZvbHZpZGFzIHBhcmEgbyBjdXJzbyBkZSBCaW9tZWRpY2luYSBkYSBQVUMgTUcuClZvY8OqIHBvZGUgZW5jb250cmFyIGFzIGRlbWFpcyBwcsOhdGljYXMgWyphcXVpKl0oaHR0cHM6Ly9oZXJvbm9oLmdpdGh1Yi5pby9iaW9pbmZvKS4KCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwpOYSBwcsOhdGljYSBwYXNzYWRhIHZvY8OqIGFwcmVuZGV1IGFzIGNhcmFjdGVyw61zdGljYXMgZG9zIGFycXVpdm9zIF8uZmFzdGFfIGUgXy5mYXN0cV8sIGUgYXMgc3VhcyBhcGxpY2HDp8O1ZXMuIE5hIHByw6F0aWNhIGRlIGhvamUgZGFyZW1vcyBzZW50aWRvIGJpb2zDs2dpY28gYXMgc2VxdcOqbmNpYXMgZ3VhcmRhZGFzIG5lc3NlcyBhcnF1aXZvcywgZSBhcHJlbmRlcmVtb3Mgc29icmUgYWxpbmhhbWVudG8gZSBpZGV0aWZpY2HDp8OjbyBkZSBzZXF1w6puY2lhcy4KCiMjIEJhbmNvcyBkZSBkYWRvcyBkZSBzZXF1w6puY2lhcyBiaW9sw7NnaWNhcwombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKQXDDs3MgYSBpZGVudGlmaWNhw6fDo28gZG8gRE5BIGNvbW8gYSBtb2zDqWN1bGEgcmVzcG9uc8OhdmVsIHBlbG8gYXJtYXplbmFtZW50byBkYSBpbmZvcm1hw6fDo28gZ2Vuw6l0aWNhIGRvcyBvcmdhbmlzbW9zLCBlIGEgY29tcHJlZW5zw6NvIGRlIHF1ZSBlbnRpZGFkZXMgYmlvbMOzZ2ljYXMgY2hhbWFkYXMgKipnZW5lcyoqIHRlbSBzZXF1w6puY2lhcyBkZWZpbmlkYSwgb3MgZXNmb3LDp29zIGRvcyBnZW5ldGljaXN0YXMgc2UgZGlyZWNpb25hcmFtIHBhcmEgYSBjYXJhY3Rlcml6YcOnw6NvIGRhIGRpdmVyc2lkYWRlIGRlc3NhcyBlbnRpZGFkZXMsIGUgZGUgY29tbyBzdWFzIHZhcmlhw6fDtWVzIHJlZmxldGVtIG5hIGJpb2xvZ2lhIGRlIGNhZGEgb3JnYW5pc21vLiAKCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwpUb2RhcyB0ZWNub2xvZ2lhcyBkZSBzZXF1ZW5jaWFtZW50byBkZSBETkEgLSBzZWphbSBkZSBTYW5nZXIsIF9zaG9ydCByZWFkc18gb3UgX2xvbmcgcmVhZHNfIC0gdGVtIHNpZG8gdXRpbGl6YWRhcyBwYXJhIGFsY2Fuw6dhciBlc3RlIG9iamV0aXZvLiBFIHNlIGFzIHByaW1laXJhcyBnZXJhw6fDtWVzIGRlIHNlcXVlbmNpYWRvcmVzIGRlbW9yYXZhbSBkaWFzIHBhcmEgY2FyYWN0ZXJpemFyIHVtIGdlbmUgb3UgdW0gcGVkYcOnbyBkZWxlLCBhcyBnZXJhw6fDtWVzIG1haXMgcmVjZW50ZXMgcG9zc2liaWxpdGFtIGNvbmhlY2VyIGdlbm9tYXMgZSB0cmFuc2NyaXB0b21hcyBpbnRlaXJvcyBlbSBhbGd1bXMgaG9yYXMuIMOAIG1lZGlkYSBxdWUgdGFudGFzIGluZm9ybWHDp8O1ZXMgY29tZcOnYXJhbSBhIHNlciBhY3VtdWxhZGFzLCBjb21wcmVlbmRldS1zZSBxdWUgdMOjbyBpbXBvcnRhbnRlIHF1YW5kbyBzZXF1ZW5jaWFyLCDDqSBhcm1hemVuYXIgZXNzYXMgc2VxdcOqbmNpYXMgZSBvcyBkaXZlcnNvcyBtZXRhZGFkb3MgYSBlbGFzIHJlbGFjaW9uYWRvcy4gUXVhaXNxdWVyIGluZm9ybWHDp8O1ZXMgZXh0csOtbnNlY2FzIMOgIHNlcXXDqm5jaWEgc8OjbyBpbXBvcnRhbnRlcyBwb2lzIGFncmVnYW0gY29uaGVjaW1lbnRvLCBlIHBlcm1pdGVtIGNvbXBhcmHDp8O1ZXMsIGEgYnVzY2EgcG9yIHBhZHLDtWVzLCBlIG91dHJhcyBhbsOhbGlzZXMgcXVlIHBvc3NpYmlsaXRhbSBldmlkZW5jaWFyIHBhZHLDtWVzIGJpb2zDs2dpY29zLiAKCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwpFeGlzdGVtIGRpdmVyc29zIGJhbmNvcyBkZSBkYWRvcyBiaW9sw7NnaWNvcywgcHJvdmlkb3MgdGFudG8gZGUgaW5mb3JtYcOnw7VlcyBxdWFudG8gZGUgcHJvcMOzc2l0b3MgZGlmZXJlbnRlcyBlIGNvbXBsZW1lbnRhcmVzLiBFc3RlcyBiYW5jb3Mgc8OjbyBnZXJhbG1lbnRlICoqcMO6YmxpY29zKiosIG8gcXVlIHNpZ25pZmljYSBxdWUgcXVhbHF1ZXIgdW0gcG9kZSB0YW50byBfc3VibWV0ZXJfIHF1YW50byBfYmFpeGFyIGRlcMOzc2l0b3NfIChzZXF1w6puY2lhcyBlIHN1YXMgaW5mb3JtYcOnw7VlcyBhc3NvY2lhZGFzKS4gbyAqKipOYXRpb25hbCBDZW50ZXIgZm9yIEJpb3RlY2hub2xvZ3kgSW5mb3JtYXRpb24qKiogKCoqKk5DQkkqKiopIMOpIHVtIGNvbmp1bnRvIMOpIHVtIGNlbnRybyBuYWNpb25hbCBkZSBpbmZvcm1hw6fDtWVzIGVtIGJpb3RlY25vbG9naWEgZG9zIEVzdGFkb3MgVW5pZG9zLiBFbGUgw6kgcGFydGUgZG8gKioqTmF0aW9uYWwgSW5zdGl0dXRlIG9mIEhlYWx0aCoqKiAoKioqTklIKioqKSBlIMOpIHVtIGltcG9ydGFudGUgcmVjdXJzbyBwYXJhIHBlc3F1aXNhZG9yZXMsIGNpZW50aXN0YXMgZSBwcm9maXNzaW9uYWlzIGRhIMOhcmVhIGRlIGJpb2xvZ2lhIGUgYmlvbWVkaWNpbmEuIFNldSBwcmluY2lwYWwgb2JqZXRpdm8gZG8gTkNCSSDDqSBmb3JuZWNlciBhY2Vzc28gYSB1bWEgYW1wbGEgZ2FtYSBkZSBpbmZvcm1hw6fDtWVzIGJpb2zDs2dpY2FzLCBpbmNsdWluZG8gc2VxdcOqbmNpYXMgZGUgRE5BLCBzZXF1w6puY2lhcyBkZSBwcm90ZcOtbmFzLCBsaXRlcmF0dXJhIGNpZW50w61maWNhLCBkYWRvcyBnZW7DtG1pY29zLCBmZXJyYW1lbnRhcyBkZSBhbsOhbGlzZSBlIHJlY3Vyc29zIHBhcmEgcGVzcXVpc2EgYmlvbcOpZGljYS4gTyBOQ0JJIG1hbnTDqW0gZGl2ZXJzb3MgYmFuY29zIGRlIGRhZG9zLCBjb21vICBvIFsqKlB1Yk1lZCoqXShodHRwczovL3B1Ym1lZC5uY2JpLm5sbS5uaWguZ292LykgKHF1ZSBpbmRleGEgYXJ0aWdvcyBjaWVudMOtZmljb3MpLCBvIFsqKlByb3RlaW4gRGF0YSBCYW5rKipdKGh0dHBzOi8vd3d3LnJjc2Iub3JnLykgKHF1ZSBhcm1hemVuYSBpbmZvcm1hw6fDtWVzIHNvYnJlIGVzdHJ1dHVyYXMgdHJpZGltZW5zaW9uYWlzIGRlIHByb3Rlw61uYXMpLCBlIG8gWyoqR2VuQmFuayoqXShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L2dlbmJhbmsvKSAocXVlIGNvbnTDqW0gc2VxdcOqbmNpYXMpLCBhbMOpbSBtdWl0b3Mgb3V0cm9zLgoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CkFsw6ltIGRpc3NvLCBvIE5DQkkgZGVzZW52b2x2ZSBlIGRpc3BvbmliaWxpemEgdsOhcmlhcyBmZXJyYW1lbnRhcyBvbmxpbmUgcGFyYSBhbsOhbGlzZSBkZSBzZXF1w6puY2lhcywgYnVzY2EgZGUgaW5mb3JtYcOnw7VlcyBlIHBlc3F1aXNhLiBFc3NhcyBmZXJyYW1lbnRhcyBzw6NvIGFtcGxhbWVudGUgdXRpbGl6YWRhcyBwb3IgY2llbnRpc3RhcyBlIHBlc3F1aXNhZG9yZXMgZW0gdG9kbyBvIG11bmRvIHBhcmEgcmVhbGl6YXIgYW7DoWxpc2VzIGRlIGJpb2luZm9ybcOhdGljYSwgZXN0dWRhciBnZW5lcywgcHJvdGXDrW5hcyBlIGRvZW7Dp2FzLCBlIHJlYWxpemFyIGRlc2NvYmVydGFzIGNpZW50w61maWNhcyBpbXBvcnRhbnRlcy4gIAoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ck8gKipHZW5CYW5rKiogw6kgY29uc2lkZXJhZG8gbyByZXBvc2l0w7NyaW8gdW5pdmVyc2FsIGRhcyBzZXF1w6puY2lhcyBiaW9sw7NnaWNhcyBjb25oZWNpYXMuIEVsZSDDqSBpbnRlZ3JhZG8gY29tIGUgcmVjZWJlIGF0dWFsaXphw6fDtWVzIGRpw6FyaWFzIGRvcyBiYW5jb3MgZGUgZGFkb3MgZGUgc2VxdcOqbmNpYXMgZGEgRXVyb3BhIC0gbyBbICoqRXVyb3BlYW4gTnVjbGVvdGlkZSBBcmNoaXZlKiogXShodHRwczovL3d3dy5lYmkuYWMudWsvZW5hL2Jyb3dzZXIvaG9tZSkgKCoqRU5BKiopIC0gIGUgZG8gSmFww6NvIC0gbyBbKipETkEgRGF0YSBCYW5rIG9mIEphcGFuKipdKGh0dHBzOi8vd3d3LmRkYmoubmlnLmFjLmpwL2luZGV4LWUuaHRtbCkgKCoqRERCSioqKS4gRGVzdGEgbWFuZWlyYSwgcHJhdGljYW1lbnRlIHRvZGFzIGFzIHNlcXXDqm5jaWFzIGNvbmhlY2lkYXMsIHNlamFtIGRlIEROQSwgUk5BLCBwcm90ZcOtbmEsIG91IG91dHJvcyB0aXBvcyBwb2RlbSBzZXIgZW5jb250cmFkYXMgbMOhLCBlIGF0dWFsbWVudGUgZXN0ZSBiYW5jbyBwb3NzdWkgbWFpcyBkZSAyLjkgYmlsaMO1ZXMgZGUgc2VxdcOqbmNpYXMgw7puaWNhcywgY29ycmVzcG9uZGVudGVzIGEgbWFpcyBkZSA1MDQuMDAwIGVzcMOpY2llcyBkaWZlcmVudGVzIChbIF5SRUZeIF0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9wbWMvYXJ0aWNsZXMvUE1DOTgyNTUxOS8pKS4KCiMjIElkZW50aWZpY2FuZG8gc2VxdcOqbmNpYXMgYmlvbMOzZ2ljYXMKCiMjIyBDb25lY3RhbmRvIG5vIHNlcnZpZG9yCgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKTmVzdGEgYXVsYSB0cmFiYWxoYXJlbW9zIG5vdmFtZW50ZSBuYSAqKmVkbmEqKiwgbm9zc28gc2Vydmlkb3IgY29tcHV0YWNpb25hbCBwYXJhIGFuw6FsaXNlcyBiaW9pbmZvcm3DoXRpY2FzLiAKCj4gVXRpbGl6YW5kbyBhcyBjcmVkZW5jaWFpcyAqKipmb3JuZWNpZGFzIGR1cmFudGUgYSBhdWxhKioqLCBjb25lY3RlIG5vIHNlcnZpZG9yIGRlIHRyYWJhbGhvIHZpYSBTU0guIFF1YW5kbyBzb2xpY2l0YWRvLCBmb3JuZcOnYSBhIHNlbmhhOgoKYGBge2Jhc2gsIGVjaG89VFJVRSxldmFsPUZBTFNFfQojZXg6CiNzc2ggdXN1YXJpb0AxMTEuMjIyLjMzMy40NDQKCnNzaCAkVVNFUkAkSVAKYGBgCgo+PiAqKkRJQ0E6KiogTGVtYnJlLXNlIHF1ZSBhcyBwYWxhdnJhcyBpbmljaWFkYXMgY29tIHVtICoqJCoqIHPDo28gKip2YXJpw6F2ZWlzKiosIG91IHNlamEsIHPDo28gcGFsYXZyYXMgY3VqbyBzaWduaWZpY2FkbyBkZXBlbmRlIGRhIGluZm9ybWHDp8OjbyBxdWUgYXJtYXplbmFtLiBBc3NpbSwgbm8gY29tYW5kbyBhY2ltYSB2b2PDqiBkZXZlIHN1YnN0aXR1aXIgKipcJFVTRVIqKiBlICoqSVAqKiBwZWxhcyBjcmVkZW5jaWFpcyBjb3JyZXNwb25kZW50ZXMuCgojIyMgRW50cmFuZG8gbmEgc3VhIHBhc3RhIGRlIGFuw6FsaXNlcwoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ClVtYSB2ZXogbmEgKiplZG5hKiosIG5hdmVndWUgYXTDqSBvIGRpcmV0w7NyaW8gcXVlIGNyaWFtb3MgbmEgcHLDoXRpY2EgcGFzc2FkYSBlIHF1ZSB0ZW0gbyBzZXUgbm9tZSAoKipcJEFMVU5PKiopIGUgc3VhIHR1cm1hICgqKlwkVFVSTUEqKikuIElyZW1vcyB0cmFiYWxoYXIgY29tIGFzIHNlcXXDqm5jaWFzIHF1ZSBlc3TDo28gbmEgcGFzdGEgKip+L1wkVFVSTUEvXCRBTFVOTy9hcnF1aXZvcy9mYXN0YS9zZXFzKiouCgo+IE5hdmVndWUgYXTDqSBhIHN1YSBwYXN0YSBkZSBhbsOhbGlzZXMKCmBgYHtiYXNoLCBlY2hvPVRSVUUsZXZhbD1GQUxTRX0KY2Qgfi8kVFVSTUEvJEFMVU5PL2FycXVpdm9zL2Zhc3RhL3NlcXMKCmxzCmBgYAoKIyMjIFNlbGVjaW9uYW5kbyBzZXF1w6puY2lhcwoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ClZvY8OqIHJlY2ViZXUgZXN0YXMgMyBzZXF1w6puY2lhcyBkaWZlcmVudGVzLiBRdWFsIGdlbmUgZWxhcyByZXByZXNlbnRhbT8gVmllcmFtIGRlIHF1YWwgb3JnYW5pc21vPyBFc3RhcyBpbmZvcm1hw6fDtWVzIG7Do28gZXN0w6NvIGludHLDrW5zZWNhcyDDoCBzZXF1w6puY2lhLCBlIHByZWNpc2Ftb3MgcmVjb3JyZXIgYSByZWN1cnNvcyBleHRlcm5vcyBwYXJhIHNhYmVyIGVzdGFzIHJlc3Bvc3Rhcy4KCj4gVXRpbGl6ZSBhbGd1bSBjb21hbmRvIGRlIHZpc3VhbGl6YcOnw6NvIHBhcmEgY29uaGVjZXIgbyBjb250ZcO6ZG8gZGVzdGVzIGFycXVpdm9zLgoKYGBge2Jhc2gsIGVjaG89VFJVRSxldmFsPUZBTFNFfQojIHZlciB1bWEgc2VxCmNhdCBzZXExLmZhc3RhCgojIHZlciB0b2RhcwpjYXQgc2VxKgpgYGAKCj4gQ29tYmluZSB0b2RvcyBvcyBhcnF1aXZvcyBlbSB1bSBzw7MgcGFyYSBhbsOhbGlzZSBjb25qdW50YS4KCmBgYHtiYXNoLCBlY2hvPVRSVUUsZXZhbD1GQUxTRX0KIyBjb21iaW5hciB0b2RhcyBzZXFzCmNhdCBzZXEqID4gc2Vxcy5mYXN0YQpgYGAKCj4gRGVudHJvIGRhIHN1YSBwYXN0YSAoKip+L1wkVFVSTUEvXCRBTFVOTyoqKSBjcmllIHVtYSBwYXN0YSBwYXJhIHJlYWxpc2FybW9zIGEgYW7DoWxpc2UgZGUgaG9qZS4gRW50cmUgbmEgcGFzdGEgY3JpYWRhLgoKYGBge2Jhc2gsIGVjaG89VFJVRSxldmFsPUZBTFNFfQpjZCB+LyRUVVJNQS8kQUxVTk8vCgpta2RpciBhbmFsaXNlcwoKY2QgYW5hbGlzZXMKYGBgCgoKIyMjIElkZW50aWZpY2FuZG8gc2VxdcOqbmNpYXMgY29tIG8gQkxBU1QKCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwpPIFsqKkJMQVNUKipdKGh0dHBzOi8vYmxhc3QubmNiaS5ubG0ubmloLmdvdi9CbGFzdC5jZ2kpICgqKipCYXNpYyBMb2NhbCBBbGlnbm1lbnQgU2VhcmNoIFRvb2wqKiopIMOpIHVtYSBmZXJyYW1lbnRhIGRlIGJ1c2NhIGRlIHNpbWlsYXJpZGFkZSBiYXNlYWRhIGVtIGFsaW5oYW1lbnRvIGRlIHNlcXXDqm5jaWFzLiDDiSBwb3NzaXZlbG1lbnRlIG8gcHJvZ3JhbWEgZGUgYmlvaW5mb3Jtw6F0aWNhIG1haXMgdXRpbGl6YWRvIG5vIG11bmRvLCBlIHRlbSBkaXZlcnNhcyBhcGxpY2HDp8O1ZXMsIGRlcGVuZGVuZG8gZGUgY29tbyDDqSB1dGlsaXphZG8uIApFc3RlIGFsZ29yw610bW8gdGVtIGRpZmVyZW50ZXMgdmFyaWHDp8O1ZXMsIHF1ZSB2w6NvIGRlcGVuZGVyIGJhc2ljYW1lbnRlIGRvIGZvcm1hdG8gZGEgc2VxdcOqbmNpYSBidXNjYWRhIGUgZGFzIHNlcXXDqm5jaWFzIGRlIHJlZmVyw6puY2lhLiBBbWJhcyBwb2RlbSBzZXIgc2VyIHRhbnRvIHNlcXXDqm5jaWFzIGRlIG51Y2xlb3TDrWRlbyBxdWFudG8gZGUgYW1pbm/DoWNpZG9zLiBPcyB0aXBvcyBkZSAqKkJMQVNUKiogc8OjbzoKCiAtICoqQkxBU1RuOioqIMOJIHVzYWRvIHBhcmEgYWxpbmhhciBzZXF1w6puY2lhcyBkZSBETkEgY29tIG8gb2JqZXRpdm8gZGUgZW5jb250cmFyIHNpbWlsYXJpZGFkZXMgbnVjbGVvdMOtZGljYXMuIMOJIMO6dGlsIHBhcmEgaWRlbnRpZmljYXIgaG9tb2xvZ2lhcyBlbnRyZSBnZW5lcyBvdSByZWdpw7VlcyBnZW7DtG1pY2FzLgoKIC0gKipCTEFTVHA6Kiogw4kgdXNhZG8gcGFyYSBjb21wYXJhciBzZXF1w6puY2lhcyBkZSBhbWlub8OhY2lkb3MgKHByb3Rlw61uYXMpIGVtIGJhbmNvcyBkZSBkYWRvcyBkZSBwcm90ZcOtbmFzLiBPICoqQkxBU1RwKiogw6kgw7p0aWwgcGFyYSBpZGVudGlmaWNhciBwcm90ZcOtbmFzIHNpbWlsYXJlcyBlIGRldGVybWluYXIgYSBmdW7Dp8OjbyBkZSBwcm90ZcOtbmFzIGRlc2NvbmhlY2lkYXMgY29tIGJhc2UgZW0gcHJvdGXDrW5hcyBob23Ds2xvZ2FzLgoKIC0gKipCTEFTVHg6Kiogw4kgdXNhZG8gcGFyYSBjb21wYXJhciBzZXF1w6puY2lhcyBkZSBETkEgY29tIGJhbmNvcyBkZSBkYWRvcyBkZSBwcm90ZcOtbmFzIHRyYWR1emlkYXMuIEVsZSB0cmFkdXogYSBzZXF1w6puY2lhIGRlIEROQSBlbSB0b2RhcyBhcyBzZWlzIHBvc3PDrXZlaXMgbW9sZHVyYXMgZGUgbGVpdHVyYSBlLCBlbSBzZWd1aWRhLCBjb21wYXJhIGFzIHNlcXXDqm5jaWFzIHRyYWR1emlkYXMgY29tIGFzIHByb3Rlw61uYXMgbm8gYmFuY28gZGUgZGFkb3MuIE8gKipCTEFTVHgqKiDDqSDDunRpbCBwYXJhIGVuY29udHJhciBzZXF1w6puY2lhcyBjb2RpZmljYWRvcmFzIGRlIHByb3Rlw61uYXMgZW0gcmVnacO1ZXMgZGUgRE5BIGRlc2NvbmhlY2lkYXMuCgotICoqdEJMQVNUeDoqKiDDiSB1c2FkbyBwYXJhIGNvbXBhcmFyIHNlcXXDqm5jaWFzIGRlIEROQSB0cmFkdXppZGFzIGVtIEFBLCBjb20gYmFuY29zIGRlIGRhZG9zIGRlIEROQSB0cmFkdXppZGFzIGVtIEFBLiBPdSBzZWphLCBvcyAqaW5wdXRzKiBzw6NvIGVtIG51Y2xlb3TDrWRlb3MsIG1hcyBhIGNvbXBhcmHDp8OjbyDDqSBmZWl0YSBuYSBkZSBhbWlub8OhY2lkb3MuIEVsZSDDqSBtdWl0byB1dGlsaXphZG8gbmEgYW5vdGHDp8OjbyBkZSBub3ZvcyBnZW5lcywgcXVlIMOpIG8gcHJvY2Vzc28gcGVsbyBxdWFsIHNlIGlkZW50aWZpY2EgdW1hIHBvc3PDrXZlbCBmdW7Dp8OjbyBkZSB1bSBnZW5lIGNvZGlmaWNhZG9yIGRlIHByb3Rlw61uYSBhdHJhdsOpcyBkZSBzdWEgc2VtZWxoYW7Dp2EgY29tIG91dHJvcyBnZW5lcyBjb25oZWNpZG9zLgoKIC0gKip0QkxBU1RuOioqIMOJIHVzYWRvIHBhcmEgY29tcGFyYXIgc2VxdcOqbmNpYXMgZGUgcHJvdGXDrW5hcyBjb20gYmFuY29zIGRlIGRhZG9zIGRlIEROQSB0cmFkdXppZG9zLiBFbGUgdHJhZHV6IGFzIHNlcXXDqm5jaWFzIGRlIEROQSBubyBiYW5jbyBkZSBkYWRvcyBlLCBlbSBzZWd1aWRhLCBjb21wYXJhLWFzIGNvbSBhcyBzZXF1w6puY2lhcyBkZSBwcm90ZcOtbmFzIGRlIGNvbnN1bHRhLiBPICoqdEJMQVNUbioqIMOpIMO6dGlsIHBhcmEgZW5jb250cmFyIHNlcXXDqm5jaWFzIGRlIEROQSBxdWUgcG9zc2FtIGVzdGFyIGNvZGlmaWNhbmRvIHByb3Rlw61uYXMgc2VtZWxoYW50ZXMuCgogLSAqKkJMQVNUejoqKiDDiSB1bWEgdmVyc8OjbyBkbyAqKkJMQVNUKiogcHJvamV0YWRhIGVzcGVjaWZpY2FtZW50ZSBwYXJhIGFsaW5oYXIgcmVnacO1ZXMgZ2Vuw7RtaWNhcyBtYWlvcmVzLiBFbGUgw6kgZnJlcXVlbnRlbWVudGUgdXNhZG8gcGFyYSBjb21wYXJhciBnZW5vbWFzIGludGVpcm9zIGRlIGVzcMOpY2llcyBkaWZlcmVudGVzLgoKCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwpDb21vIGEgbm9zc2Egc2VxdcOqbmNpYSDDqSBkZSBudWNsZW90w61kZW9zLCBwb2RlbW9zIHV0aWxpemFyIG8gKipCTEFTVG4qKi4gVmFtb3MgY29uaGVjw6otbG8gbWVsaG9yLiAKCj4gQ29uaGXDp2Egb3MgcG9zc8OtdmVpcyBhcmd1bWVudG9zIGUgcGFyw6JtZXRyb3MgZG8gYmxhc3RuLgoKYGBge2Jhc2gsIGVjaG89VFJVRSxldmFsPUZBTFNFfQpibGFzdG4gLWhlbHAgfCBsZXNzCmBgYAoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CkNvbW8gdm9jw6ogcG9kZSB2ZXIsIGV4aXN0ZW0gZGl2ZXJzYXMgY29uZmlndXJhw6fDtWVzIGUgZm9ybWF0b3MgZGUgc2HDrWRhIHBvc3PDrXZlaXMuIFZhbW9zIGFwcmVuZGVyIGEgZmF6ZXIgdW1hIGJ1c2NhIHNpbXBsZXMuIFBhcmEgaXN0byB2b2PDqiBwcmVjaXNhIGRlOgoKIC0gVW1hIG91IGFsZ3VhbWFzIHNlcXXDqm5jaWFzIGEgc2VyZW0gYnVzY2FkYXMsIG5vIGZvcm1hdG8gZmFzdGEsIHF1ZSBjaGFtYW1vcyBkZSAqKipxdWVyeSoqKjsKIAogLSBVbSBiYW5jbyBkZSBkYWRvcyBjb250ZW5kbyBvdXRyYXMgc2VxdcOqbmNpYXMgY29uaGVjaWRhcywgcXVlIGNoYW1hbW9zIGRlICoqKnN1YmplY3QqKiouIE5vIGNhc28gZG8gQkxBU1QgbmEgbGluaGEgZGUgY29tYW5kbywgZXN0ZSBiYW5jbyBkZSBkYWRvcyBwcmVjaXNhIHNlciAqKmxvY2FsKiosIG91IHNlamEsIGRldmUgZXN0YXIgbm8gY29tcHV0YWRvciBvbmRlIHNlIGVzdMOhIGZhemVuZG8gYSBhbsOhbGlzZTsKIAogLSBVbSBmb3JtYXRvIGRlIHNhw61kYSBkYSBzdWEgZXNjb2xoYSwgcGFyYSBhIGV4aWJpw6fDo28gZG9zIHJlc3VsdGFkb3MuCgo+IFJvZGUgbyBibGFzdG4gcGFyYSBpZGVudGlmaWNhciBhIHF1ZSBwZXJ0ZW5jZW0gYXMgc2VxdcOqbmNpYXMgcXVlIHZvY8OqIHRlbS4KCmBgYHtiYXNoLCBlY2hvPVRSVUUsZXZhbD1GQUxTRX0KIyAgICAgICNzZXEgYSBzZXIgYnVzY2FkYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNiYW5jbyBkZSBkYWRvcyAgICAgICAgICAgI2Zvcm1hdG8gZGUgc2FpZGEgCmJsYXN0biAtcXVlcnkgfi8kVFVSTUEvJEFMVU5PL2FycXVpdm9zL2Zhc3RhL3NlcXMvc2Vxcy5mYXN0YSAtZGIgL2RhdGEvZGF0YWJhc2VzL250L250IC1vdXRmbXQgNiAtbnVtX2FsaWdubWVudHMgMwpgYGAKCk9ic2VydmUgYSB0YWJlbGEgZ2VyYWRhLiBFbGEgY29udMOpbSAxMiBjb2x1bmFzLiBFc3RhcyBzw6NvOgoKIC0gKipRdWVyeSBJRDoqKiBPIGlkZW50aWZpY2Fkb3IgZGEgc2VxdcOqbmNpYSBkZSBidXNjYWRhLgogCiAtICoqU3ViamVjdCBJRDoqKiBPIGlkZW50aWZpY2Fkb3IgZGEgc2VxdcOqbmNpYSBkbyBiYW5jbyBkZSBkYWRvcyBxdWUgY29ycmVzcG9uZGUgYW8gKipzdWJqZWN0KiouCiAKIC0gKiolIGRlIGlkZW50aWRhZGU6KiogQSBwb3JjZW50YWdlbSBkZSBpZGVudGlkYWRlIGVudHJlIGEgc2VxdcOqbmNpYSBidXNjYWRhICoqcXVlcnkqKiBlIGEgc2VxdcOqbmNpYSAqKnN1YmplY3QqKiBkbyBiYW5jbyBkZSBkYWRvcy4KIAogLSAqKlRhbWFuaG8gZG8gYWxpbmhhbWVudG86KiogTyBjb21wcmltZW50byBkbyBhbGluaGFtZW50byBhIHNlcXXDqm5jaWEgYnVzY2FkYSAqKnF1ZXJ5KiogZSBhIHNlcXXDqm5jaWEgKipzdWJqZWN0KiogZG8gYmFuY28gZGUgZGFkb3MuCiAKIC0gKipNaXNtYXRjaGVzOioqIE8gbsO6bWVybyBkZSBiYXNlcyBxdWUgbsOjbyBjb3JyZXNwb25kZW0gYSBzZXF1w6puY2lhIGJ1c2NhZGEgKipxdWVyeSoqIGUgYSBzZXF1w6puY2lhICoqc3ViamVjdCoqIGRvIGJhbmNvIGRlIGRhZG9zLgogCiAtICoqR2FwIE9wZW5zOioqIE8gbsO6bWVybyBkZSBsYWN1bmFzICgqZ2FwcyopIG5vIGFsaW5oYW1lbnRvIGVudHJhIGEgKipxdWVyeSoqIGUgbyAqKnN1YmplY3QqKi4KIAogLSAqKlF1ZXJ5IFN0YXJ0OioqIEEgcG9zacOnw6NvIGluaWNpYWwgZGEgc2VxdcOqbmNpYSBidXNjYWRhICoqcXVlcnkqKiBxdWUgY29ycmVzcG9uZGUgYW8gYWxpbmhhbWVudG8uCiAKIC0gKipRdWVyeSBFbmQ6KiogQSBwb3Npw6fDo28gZmluYWwgZGEgc2VxdcOqbmNpYSBidXNjYWRhICoqcXVlcnkqKiBxdWUgY29ycmVzcG9uZGUgYW8gYWxpbmhhbWVudG8uCiAKIC0gKipTdWJqZWN0IFN0YXJ0OioqIEEgcG9zacOnw6NvIGluaWNpYWwgZGEgc2VxdcOqbmNpYSAqKnN1YmplY3QqKiBkbyBiYW5jbyBkZSBkYWRvcyBxdWUgY29ycmVzcG9uZGUgYW8gYWxpbmhhbWVudG8uCiAKIC0gKipTdWJqZWN0IEVuZDoqKiBBIHBvc2nDp8OjbyBmaW5hbCBkYSBzZXF1w6puY2lhICoqc3ViamVjdCoqIGRvIGJhbmNvIGRlIGRhZG9zIHF1ZSBjb3JyZXNwb25kZSBhbyBhbGluaGFtZW50by4KIAogLSAqKkUtdmFsdWU6KiogTyB2YWxvciBkZSBzaWduaWZpY8OibmNpYSAoKkUtdmFsdWUqKSBkbyBhbGluaGFtZW50bywgcXVlIGluZGljYSBhIHByb2JhYmlsaWRhZGUgZGUgZW5jb250cmFyIHVtIGFsaW5oYW1lbnRvIHNlbWVsaGFudGUgcG9yIGFjYXNvLgogCiAtICoqQml0IFNjb3JlOioqIE8gZXNjb3JlIGRvIGFsaW5oYW1lbnRvLCBxdWUgw6kgdW1hIG1lZGlkYSBkYSBxdWFsaWRhZGUgZSB0YW1iw6ltIGRhIHNpZ25pZmljw6JuY2lhIGRvIGFsaW5oYW1lbnRvLCBtYXMgZGVwZW5kZSBkbyBiYW5jbyBkZSBkYWRvcyB1c2Fkby4KIAo+IEFuYWxpc2UgbyByZXN1bHRhZG8uIE8gcXVlIHZvY8OqIGNvbnNlZ3VlIGVudGVuZGVyIGEgcGFydGlyIGRlc3NhcyBjb2x1bmFzPwoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CkFwZXNhciBkZSBqw6EgdGVybW9zIHVtYSBpZGVudGlmaWNhw6fDoyBwb3NpdGl2YSwgZXNzZSBmb3JtYXRvIGRlIHJlc3VsdGFkb3MgbsOjbyB0ZW0gYSBpbmZvcm1hw6fDo28gY29tcGxldGEgc29icmUgYSBxdWFsIG9yZ2FuaXNtby9nZW5lIHNlIHJlZmVyZSBvICoqc3ViamVjdCoqLiBQYXJhIHNhYmVybW9zIGlzc28sIHByZWNpc2Ftb3MgdXNhciBvdXRybyBjb21hbmRvLgoKPiBObyBjb21hbmRvIGEgc2VndWlyLCBzdWJzdGl0dWEgXCRISVQgcGVsYSBwYWxhdnJhIG5hIHNlZ3VuZGEgY29sdW5hLCBxdWUgY29ycmVzcG9uZGUgYW8gKipzdWJqZWN0KiouCgpgYGB7YmFzaCwgZWNobz1UUlVFLGV2YWw9RkFMU0V9CiMgICAgICAjc2VxIGEgc2VyIGJ1c2NhZGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYmFuY28gZGUgZGFkb3MgICAgICAgICAgICNmb3JtYXRvIGRlIHNhaWRhIApibGFzdGRiY21kIC1kYiAvZGF0YS9kYXRhYmFzZXMvbnQvbnQgLWVudHJ5ICRISVQgLW91dGZtdCAldAoKYGBgCgo+IEludGVycHJldGUgbyByZXN1bHRhZG8uIERlIHF1ZSBzw6NvIGFzIHNlcXXDqm5jaWFzPwoKIyMjIFV0aWxpemFuZG8gYSB2ZXJzw6NvIG9ubGluZSBkbyBCTEFTVAoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CkVudHJlIG5vIHNpdGUgZG8gWyoqQkxBU1QqKl0oaHR0cHM6Ly9ibGFzdC5uY2JpLm5sbS5uaWguZ292L0JsYXN0LmNnaSkgZSByZWFsaXplIGEgbWVzbWEgYnVzY2EuIAoKPiBVc2UgYWxndW0gY29tYW5kbyBwYXJhIHZpc2FsaXphciB1bWEgZGFzIHN1YXMgMyBzZXF1w6puY2lhcy4gQ29waWUgYSBzZXF1w6puY2lhIGUgY29sZSBuYSBjYWl4YSBkZSBidXNjYXMgZG8gc2l0ZSBkbyBCTEFTVC4gUm9kZSB1bWEgYW7DoWxpc2UgY29tIG9zIHBhcsOibWV0cm9zIF9kZWZhdWx0Xywgb3Ugc2VqYSwgc2VtIGZhemVyIGFsdGVyYcOnw7Vlcy4KCj4gQ29tcGFyZSBlc3RlcyByZXN1bHRhZG9zIGNvbSBvcyBxdWUgdm9jw6ogb2J0ZXZlIG5hIGFuw6FsaXNlIGxvY2FsLgoKCgojIyBBbGluaGFkbyBzZXF1w6puY2lhcwoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CkFzc2ltIGNvbW8gbyBCTEFTVCBidXNjYSBwb3Igc2VxdcOqbmNpYXMgc2VtZWxoYW50ZXMgdXRpbGl6YW5kbyBhbGluaGFtZW50b3MgbG9jYWlzIGVudHJlICoqcXVlcnkqKiBlICoqc3ViamVjdCoqLCBleGlzdGVtIGRpdmVyc2FzIG91dHJhcyBhbsOhbGlzZXMgcXVlIHBvZGVtIHV0aWxpemFyIGVzc2EgZXN0cmF0w6lnaWEuIFBvciBleGVtcGxvLCBhcGVzYXIgZGUgc2VyZW0gc2VtZWxoYW50ZXMsIHF1YWwgYSBkaWZlcmVuw6dhIGVudHJlIGVzdGFzIDMgc2VxdcOqbmNpYXMgY29tIGFzIHF1YWlzIGVzdGFtb3MgdHJhYmFsaGFuZG8/IFBvZGVtb3MgcmVzcG9uZGVyIGVzdGEgcGVyZ3VudGEgY29tIHVtIGFsaW5oYW1lbnRvLiBIw6EgZG9pcyB0aXBvcyBwcmluY2lwYWlzIGRlIGFsaW5oYW1lbnRvcywgbyAqKkFsaW5oYW1lbnRvIGxvY2FsKiogZSBvICoqQWxpbmhhbWVudG8gZ2xvYmFsKio6CiAKIC0gKipBbGluaGFtZW50byBHbG9iYWw6KiogRXN0ZSBhbGluaGFtZW50byBjb21wYXJhIGR1YXMgc2VxdcOqbmNpYXMgYmlvbMOzZ2ljYXMgZW0gc3VhIHRvdGFsaWRhZGUsIGRlc2RlIG8gaW7DrWNpbyBhdMOpIG8gZmluYWwuIEVsZSBpZGVudGlmaWNhIGFzIHJlZ2nDtWVzIGNvbnNlcnZhZGFzIGUgYXMgZGlmZXJlbsOnYXMgZW50cmUgYXMgc2VxdcOqbmNpYXMsIGFsaW5oYW5kbyB0b2RvcyBvcyBjYXJhY3RlcmVzIGVtIGFtYm9zIG9zIGNvbmp1bnRvcyBkZSBkYWRvcy4gRXNzZSB0aXBvIGRlIGFsaW5oYW1lbnRvIMOpIMO6dGlsIHF1YW5kbyBhcyBzZXF1w6puY2lhcyB0w6ptIGNvbXByaW1lbnRvcyBzZW1lbGhhbnRlcyBlIHF1YW5kbyBzZSBkZXNlamEgY29tcGFyYXIgYXMgc2VxdcOqbmNpYXMgY29tbyB1bSB0b2RvLiBPIGFsaW5oYW1lbnRvIGdsb2JhbCDDqSBmcmVxdWVudGVtZW50ZSB1c2FkbyBwYXJhIGlkZW50aWZpY2FyIHNpbWlsYXJpZGFkZXMgZW50cmUgcHJvdGXDrW5hcyBvdSBnZW5lcyBkZSBkaWZlcmVudGVzIGVzcMOpY2llcywgbyBxdWUgYWp1ZGEgYSBpbmZlcmlyIHJlbGHDp8O1ZXMgZXZvbHV0aXZhcyBlIGRlc2NvYnJpciBmdW7Dp8O1ZXMgY29uc2VydmFkYXMuCgogCiAtICoqQWxpbmhhbWVudG8gTG9jYWw6KiogRXN0ZSBhbGluaGFtZW50byBjb21wYXJhIGFwZW5hcyBhcyByZWdpw7VlcyBtYWlzIHNlbWVsaGFudGVzIGVudHJlIGFzIHNlcXXDqm5jaWFzIGJpb2zDs2dpY2FzLiBFbSB2ZXogZGUgYWxpbmhhciBhcyBzZXF1w6puY2lhcyBpbnRlaXJhcywgZWxlIGlkZW50aWZpY2Egc3Vic2VxdcOqbmNpYXMgc2VtZWxoYW50ZXMsIGNoYW1hZGFzIGRlIGFsaW5oYW1lbnRvcyBsb2NhaXMsIGRlbnRybyBkYXMgc2VxdcOqbmNpYXMgbWFpb3Jlcy4gRXNzZSB0aXBvIGRlIGFsaW5oYW1lbnRvIMOpIMO6dGlsIHF1YW5kbyBhcyBzZXF1w6puY2lhcyBzw6NvIGRlIGNvbXByaW1lbnRvcyBkaWZlcmVudGVzIG91IHF1YW5kbyBzZSBkZXNlamEgaWRlbnRpZmljYXIgcmVnacO1ZXMgZXNwZWPDrWZpY2FzIGRlIHNpbWlsYXJpZGFkZSwgY29tbyBtb3Rpdm9zIGZ1bmNpb25haXMgb3UgZG9tw61uaW9zIGNvbnNlcnZhZG9zIGVtIHByb3Rlw61uYXMuIE8gYWxpbmhhbWVudG8gbG9jYWwgw6kgZnJlcXVlbnRlbWVudGUgdXNhZG8gcGFyYSBpZGVudGlmaWNhciByZWdpw7VlcyBkZSBob21vbG9naWEgZW0gc2VxdcOqbmNpYXMgZGUgRE5BLCBSTkEgb3UgcHJvdGXDrW5hcywgcGVybWl0aW5kbyBpbmZlcsOqbmNpYXMgc29icmUgZXN0cnV0dXJhIGUgZnVuw6fDo28uIEVzdGUgw6kgbyBhbGluaGFtZW50byB1dGlsaXphZG8gcGVsbyAqKkJMQVNUKiouCiAKIAohW19BbGluaGFtZW50b3MgbG9jYWwgZSBnbG9iYWxfXSgvaG9tZS9oZXJvbi9wcmpjdHMvYmlvaW5mby9taXNjL2FsaW5oYW1lbnRvcy5qcGcpCgoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CkFnb3JhIHZhbW9zIGFsaW5oYXIgbm9zc2FzIHNlcXXDqm5jaWFzLiBGYXJlbW9zIGlzc28gY29tIG8gcHJvZ3JhbWEgKipNVVNDTEUqKiwgdW0gYWxpbmhhZG9yIGNsw6Fzc2ljby4gU2V1IG5vbWUgc2lnbmlmaWNhICpNVWx0aXBsZSBTZXF1ZW5jZSBDb21wYXJpc29uIGJ5IExvZy0gRXhwZWN0YXRpb24qLiBFbGUgcG9kZSBzZXIgZW5jb250cmFkbyBlbSB2ZXJzw6NvIF9vbmxpbmVfIFthcXVpXShodHRwczovL3d3dy5lYmkuYWMudWsvVG9vbHMvbXNhL211c2NsZS8pLgoKCj4gRW50ZW5kYSBvIGZ1bmNpb25hbWVudG8gZG8gcHJvZ3JhbWEuIEVtIHNlZ3VpZGEsIGFsaW5oZSBhcyBzZXF1w6puY2lhcyBkbyBhcnF1aXZvIGNvbWJpbmFkbyBxdWUgdm9jw6ogY29uc3RydWl1LgoKYGBge2Jhc2gsIGVjaG89VFJVRSxldmFsPUZBTFNFfQptdXNjbGUgLS1oZWxwCgojIGNvbSBvdXRwdXQgbmEgdGVsYQptdXNjbGUgLWluIH4vJFRVUk1BLyRBTFVOTy9hcnF1aXZvcy9zZXFzL3NlcXMuZmFzdGEgLWNsdwoKIyBjb20gb3V0cHV0IHNhbHZvIGVtIGFycXVpdm8KbXVzY2xlIC1pbiB+LyRUVVJNQS8kQUxVTk8vYXJxdWl2b3Mvc2Vxcy9zZXFzLmZhc3RhIC1jbHcgLW91dCBzZXFzLmFsZ24KCmxzCgpsZXNzIC1TIHNlcXMuYWxnbgoKYGBgCgo+IE9ic2VydmUgbyBhbGluaGFtZW50by4gT25kZSBlc3TDo28gYXMgZGlmZXJlbsOnYXM/CgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKRXN0YSBzZXF1w6puY2lhIMOpIGRlIG51Y2xlb3TDrWRlb3MuIFZvY8OqIGNvbnNlZ3VlIHBlcmNlYmVyIGFsZ3VtYSBkaWZlcmVuw6dhPyBFc3NhcyBzZXF1w6puY2lhcyBnZXJhbSBwcm90ZcOtbmFzIGlndWFpcz8gQ29tbyBzZXJpYSBvIGFsaW5oYW1lbnRvIGNvbSBhIGRlIGFtaW5vw6FjaWRvcz8gVmFtb3MgdHJhZHV6aXI6Cgo+IFRyYWR1emEgYXMgc2VxdWVuY2lhcyBkbyBzZXUgYXJxdWl2byBjb21iaW5hZG8uCgpgYGB7YmFzaCwgZWNobz1UUlVFLGV2YWw9RkFMU0V9CnRyYW5zZXEgIC1zZXF1ZW5jZSB+LyRUVVJNQS8kQUxVTk8vYXJxdWl2b3Mvc2Vxcy9zZXFzLmZhc3RhIC1vdXRzZXEgfi8kVFVSTUEvJEFMVU5PL2FycXVpdm9zL3NlcXMvc2Vxcy5wZXAKCmBgYAoKCj4gQWxpbmhlIGFzIHNlcXXDqm5jaWFzIGRvIGFycXVpdm8gY29tYmluYWRvIHF1ZSB2b2PDqiB0cmFkdXppdSBlbSBhbWlub8OhY2lkb3MuCgpgYGB7YmFzaCwgZWNobz1UUlVFLGV2YWw9RkFMU0V9CgptdXNjbGUgLWluIH4vJFRVUk1BLyRBTFVOTy9hcnF1aXZvcy9zZXFzL3NlcXMucGVwIC1jbHcKCiMgY29tIG91dHB1dCBzYWx2byBlbSBhcnF1aXZvCm11c2NsZSAtaW4gfi8kVFVSTUEvJEFMVU5PL2FycXVpdm9zL3NlcXMvc2Vxcy5wZXAgLWNsdyAtb3V0IHNlcXNfcGVwLmFsZ24KCmxzCgpsZXNzIC1TIHNlcXNfcGVwLmFsZ24KCmBgYAoKPiBPYnNlcnZlIG8gYWxpbmhhbWVudG8uIE8gcXVlIGFzIGRpZmVyZW7Dp2FzIHBvZGVtIHNpZ25pZmljYXIsIGNvbmhlY2VuZG8gYSBvcmlnZW0gZSBhIGZ1bsOnw6NvIGRhIHByb3Rlw61uYXMgcXVlIGVzdGFtb3MgYW5hbGlzYW5kbz8KCioqKgoKPj4+PiBWb2x0YXIgcGFyYSBhIFsqcMOhZ2luYSBpbmljaWFsKl0oaHR0cHM6Ly9oZXJvbm9oLmdpdGh1Yi5pby9iaW9pbmZvKQoKCgoKCgo=