Este material tem como objetivo ensinar como usar diversos pacotes do R para coletar dados financeiros e econômicos de fontes públicas como Banco Central do Brasil, BM&F Bovespa, IBGE, IPEA, Google Finance, Yahoo Finance, FED, etc.
INTRODUÇÃO
Imagine que você precisa analisar uma ação qualquer e tomar a decisão de comprar ou não tal ação. Possivelmente, você terá que pagar por algum serviço que tenha dados do histórico do preço desta ação, os resultados operacionais da empresa bem como notícias vinculadas à empresa na mídia. Outra opção é você acessar o site de relacionamento com investidores da empresa e tentar pegar os dados do site. Para isso, será necessário fazer o download dos dados, talvez manuseá-los para que fiquem no formato de seu interesse e após isso fazer suas análises.
Note que para chegar no objetivo crucial que é analisar os dados da empresa e tomar uma decisão de comprar ou não a ação, você provavelmente perdeu bastante tempo tentando acessar as informações necessárias.
Felizmente, por meio do R conseguimos acessar fontes públicas que nos ajudam com a disponibilização de dados de uma forma mais simples e eficiente. Dentre as várias fontes, temos:
Para tanto, temos duas alternativas. Uma delas é acessar as APIs destas instituições por meio do R e coletar os dados. Outra alternativa, é fazer uso de pacotes do R que facilitam o acesso às APIs por meio de funções que são bem mais simples de utilizar.
Neste material, vamos usar pacotes, mas caso queira entender como manusear uma API, observe a explicação contida no material Programação em R - Importar Dados. Os pacotes que permitirão acessar os dados das instituições citadas são:
USANDO O PACOTE Quandl
O Quandl é uma plataforma que disponibiliza milhares de fontes de dados públicos e privados para usuários de diversas tecnologias e linguagens de programação. Além disso, a plataforma fornece uma API que pode ser facilmente incorporada em outras tecnologias. Maiores detalhes de todas as opções de uso do Quandl, podem ser encontrados neste link.
Especificamente para o R, o Quandl tem um pacote (Quandl) que permite acessar todos os dados (públicos e privados) diretamente do R. Para tanto, o pacote tem funções que usam a API do Quandl para buscar e processar as requisições.
Lembrando que é necessário se cadastrar no site do Quandl para ter uma Quandl.api_key que permitirá acessar uma maior quantidade de dados (sem ela você tem um limite diário) ou até mesmo dados que você adquiriu do Quandl (dados privados e que são pagos). Na imagem abaixo, você encontrará as instruções necessárias para criar sua conta no Quandl.
Para coletar dados do Banco Central do Brasil (BACEN) no R via Quandl precisamos dos seguintes passos:
- Acessar o sistema de séries temporais do BACEN (http://www.bcb.gov.br/?SERIESTEMP), escolher uma série temporal de interesse e seu código. Por exemplo, o Índice nacional de preços ao consumidor-amplo (IPCA) que tem o código \(433\).
- No R, execute o seguinte código:
# Instalar pacotes (só executar uma vez)
# install.packages(c("Quandl", "dygraphs", "magrittr", "PerformanceAnalytics", "quantmod"))
# Carregar pacotes necessários
suppressMessages(require(Quandl))
suppressMessages(require(dygraphs))
suppressMessages(require(magrittr))
suppressMessages(require(PerformanceAnalytics))
suppressMessages(require(quantmod))
# Definir sua api key
Quandl.api_key('NjGc22-41R7zD_K7Pt7z')
# Coletar o dado do IPCA. Observe que adicionamos BCB/ ao código da série temporal. Sempre usaremos BCB/
# para coletar dados do BACEN por meio do Quandl. Ele tem o significado de determinar de qual banco de
# dados o Quandl deve buscar pela série que o número definido. Como padrão o Quandl coletará os dados na
# periodicidade divulgada pelo BACEN.
ipca <- Quandl('BCB/433')
# Coletar a mesma informação para um período específico
ipca <- Quandl('BCB/433', start_date = "1996-01-01", end_date = "2017-12-31")
# Coletar definindo apenas a data inicial
ipca <- Quandl('BCB/433', start_date = "1996-01-01")
# Coletar definindo a periodicidade de interesse
# Opções: daily, weekly, monthly, quarterly, annual
ipca <- Quandl("BCB/433", collapse = "quarterly", start_date = "1996-01-01")
# Coletar fazendo alterações nos dados. Transformações nos dados permitidas pelo Quandl:
# - diff: z[t] = y[t] – y[t-1] (diferença)
# - rdiff: z[t] = (y[t] – y[t-1]) / y[t-1] (diferença %)
# - rdiff_from: z[t] = (y[latest] – y[t]) / y[t] (incremento % em relação à última observação)
# - cumul: z[t] = y[0] + y[1] + … + y[t] (soma acumulativa)
# - normalize: z[t] = y[t] ÷ y[0] * 100 (série iniciar em 100)
ipca <- Quandl("BCB/433", transform = "diff", start_date = "1996-01-01")
# Coletar definido o tipo de dado que queremos no R
# - ts: série temporal
# - zoo: objeto zoo
# - xts: no formato xts
# Detalhes sobre a diferença entre os tipos no link abaixo
# https://stackoverflow.com/questions/33714660/what-is-the-difference-the-zoo-object-and-ts-object-in-r
ipca <- Quandl("BCB/433", start_date = "1996-01-01", type = "xts")
# Alterar o nome da coluna do objeto para VALE3.SA
colnames(ipca) <- "IPCA"
# Visualizar os dados usando o pacote dygraphs. Mais detalhes em
# https://rstudio.github.io/dygraphs/
dygraphs::dygraph(ipca, main = "Índice Nacional de Preços ao Consumidor-Amplo (IPCA)") %>% dyRangeSelector()
Observe que o Quandl retornará uma série temporal no formato especificado. A partir disso, você pode fazer as transformações de interesse nos dados bem como visualizá-los.
USANDO O PACOTE quantmod
O quantmod (Quantitative Financial Modelling & Trading Framework for R) é um pacote que tem como objetivo facilitar o acesso a dados financeiros e disponibilizar funcionalidades que permitam a análise de tais dados. Em função disto, permite acessar dadod do Yahoo Finance, Google Finance, dentre outros.
Com relação às funcionalidades, você pode acessar a lista delas neste link, mas dentre elas temos: alterar a periodicidade de uma série, calcular o retorno de um ativo financeiro, selecionar períodos específicos de uma série temporal, transformar a periodicidade dos retornos e muito mais.
- Dados do Yahoo Finance e Google Finance:
Vamos mostrar como coletar dados do Yahoo Finance no R via quantmod. Neste momento (27/04/2018) o Google Finance não está disponibilizando dados de algumas bolsas. Por este motivo, vamos usar apenas o Yahoo Finance como fonte de dados para o quantmod. Porém, posteriormente você pode testar coletar dados do Google Finance.
Para coletar os dados do Yahoo Finance, precisamos dos seguintes passos:
Acessar o site do Yahoo Finance (https://finance.yahoo.com/), escolher uma ação de interesse e seu código. Por exemplo, a ação da Vale negociada na BM&F BOVESPA que tem o código \(VALE3.SA\). Atenção para o caso de ações negociadas em várias bolsas. Ao pesquisar pelo nome da empresa aparecerá a bolsa na qual ela está sendo negociada e você deve escolher para a bolsa que quer coletar os dados.
No R, execute o seguinte código:
# Coletar os dados da VALE3.SA do Yahoo Finance. Temos as seguintes opções:
# - google: Google Finance
# - FRED: Federal Reserve Bank of St. Louis
# A opção auto.assign define se os dados devem ser incorporados no R com o nome
# do symbol ou um nome específico (auto.assign = FALSE). No nosso caso, optamos
# pelo nome vale.
vale <- quantmod::getSymbols("VALE3.SA", src = "yahoo", auto.assign = FALSE)
# Coletar os dados para um período específico
vale <- quantmod::getSymbols("VALE3.SA", src = "yahoo", auto.assign = FALSE, from = '2015-01-01', to = '2015-12-31')
# Coletar os dados de uma data específica até a última observação disponível sobre a ação
vale <- quantmod::getSymbols("VALE3.SA", src = "yahoo", auto.assign = FALSE, from = '2017-01-01')
# Coletar definido o tipo de dado que queremos no R
# - ts: série temporal
# - zoo: objeto zoo
# - xts: no formato xts
# Detalhes sobre a diferença entre os tipos no link abaixo
# https://stackoverflow.com/questions/33714660/what-is-the-difference-the-zoo-object-and-ts-object-in-r
vale <- quantmod::getSymbols("VALE3.SA", src = "yahoo", auto.assign = FALSE, from = '2017-01-01', return.class = 'xts')
# Formato da saída
knitr::kable(head(vale), align = "c")
| 25.28 |
25.49 |
25.05 |
25.06 |
1118500 |
23.06044 |
| 25.51 |
26.17 |
25.40 |
26.17 |
5658500 |
24.08187 |
| 26.06 |
26.23 |
25.36 |
25.70 |
2144400 |
23.64937 |
| 25.98 |
26.90 |
25.78 |
26.68 |
4031600 |
24.55118 |
| 26.29 |
26.59 |
25.86 |
25.97 |
4213500 |
23.89783 |
| 26.30 |
26.85 |
26.27 |
26.50 |
3407800 |
24.38554 |
Observe que o pacote quantmod entregará um objeto com várias colunas (Open, High, Low, Close, Volume, Adjusted) com o seguinte significado:
- Open: O preço de abertura nas datas especificadas
- High: O preço da alta nas datas especificadas
- Low: O preço da baixa nas datas especificadas
- Close: O preço de fechamento nas datas especificadas
- Volume: O volume nas datas especificadas
- Adjusted: O preço de fechamento ajustado depois de aplicar distribuições de dividendos ou divisão da ação.
Desta forma, você pode escolher com qual dado vai trabalhar em sua análise. Para retornos diários, geralmente fazemos uso do Close que é o preço de fechamento da ação na data. Para tanto, basta fazer o seguinte:
# Calcular o retorno diário usando o log(p_t) - log(p_t-1).
# Outra opção é o retorno diário por meio da opção method = "discrete"
daily_return <- PerformanceAnalytics::Return.calculate(vale$VALE3.SA.Close, method = "log")
# Alterar o nome da coluna do objeto para VALE3.SA
colnames(daily_return) <- "VALE3.SA"
# Visualizar os dados usando o pacote dygraphs. Mais detalhes em
# https://rstudio.github.io/dygraphs/
dygraphs::dygraph(daily_return, main = "Retorno Diário da VALE3.SA") %>% dyRangeSelector()
MAIS DETALHES DOS PACOTES E ALTERNATIVAS DE USO DO R EM FINANÇAS
Apesar de apresentarmos aqui algumas opções de como usar os pacotes Quandl e quantmod para coletar dados públicos diretamente do R, existem outros pacotes que recomendo. Para tanto, use o link abaixo:
Além disso, existe um novo pacote no R chamado tidyquant que tem funcionalidades importantes para quem trabalha com dados financeiros. Você pode descobrir tais funcionalidades por meio dos link abaixo:
LS0tCnRpdGxlOiA8Y2VudGVyPiA8aDI+IDxiPiBDb2xldGFuZG8gRGFkb3MgRmluYW5jZWlyb3MgZSBFY29uw7RtaWNvcyBubyBSIDwvYj4gPC9oMj4gPC9jZW50ZXI+IAphdXRob3I6IDxjZW50ZXI+IEh1ZHNvbiBDaGF2ZXMgQ29zdGEgPC9jZW50ZXI+CmdyYXBoaWNzOiB5ZXMKbGlua2NvbG9yOiBibHVlCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBjZXJ1bGVhbgogICAgZmlnX2NhcHRpb246IHllcwpyZWZlcmVuY2VzOgotIGlkOiBxdWFuZGwKICB0aXRsZTogUXVhbmRsIEFQSSBXcmFwcGVyIGZvciBRdWFuZGwuY29tCiAgYXV0aG9yOgogIC0gZmFtaWx5OiBSYXltb25kCiAgICBnaXZlbjogTWNUYWdnYXJ0CiAgLSBmYW1pbHk6IEdlcmdlbHkKICAgIGdpdmVuOiBEYXJvY3ppCiAgLSBmYW1pbHk6IENsZW1lbnQKICAgIGdpdmVuOiBMZXVuZwogIG5vdGU6IFIgcGFja2FnZQogIHR5cGU6IGJvb2sKICBVUkw6IGh0dHBzOi8vQ1JBTi5SLXByb2plY3Qub3JnL3BhY2thZ2U9UXVhbmRsCiAgaXNzdWVkOgogICAgeWVhcjogMjAxNgotIGlkOiBxdWFudG1vZAogIHRpdGxlOiBxdWFudG1vZCBRdWFudGl0YXRpdmUgRmluYW5jaWFsIE1vZGVsbGluZyBGcmFtZXdvcmsKICBhdXRob3I6CiAgLSBmYW1pbHk6IFJ5YW4KICAgIGdpdmVuOiBKZWZmcmV5IEEuCiAgLSBmYW1pbHk6IFVscmljaAogICAgZ2l2ZW46IEpvc2h1YSBNLgogIG5vdGU6IFIgcGFja2FnZQogIHR5cGU6IGJvb2sKICBVUkw6IGh0dHBzOi8vQ1JBTi5SLXByb2plY3Qub3JnL3BhY2thZ2U9cXVhbnRtb2QKICBpc3N1ZWQ6CiAgICB5ZWFyOiAyMDE3Ci0gaWQ6IGJldHMKICB0aXRsZTogQkVUUyBCcmF6aWxpYW4gRWNvbm9taWMgVGltZSBTZXJpZXMKICBhdXRob3I6CiAgLSBmYW1pbHk6IENvc3RhIEZlcnJlaXJhCiAgICBnaXZlbjogUGVkcm8KICAtIGZhbWlseTogQ29zdGEKICAgIGdpdmVuOiBKb25hdGhhCiAgLSBmYW1pbHk6IFNwZXJhbnphCiAgICBnaXZlbjogVGFsaXRoYQogIG5vdGU6IFIgcGFja2FnZQogIHR5cGU6IGJvb2sKICBVUkw6IGh0dHBzOi8vQ1JBTi5SLXByb2plY3Qub3JnL3BhY2thZ2U9QkVUUwogIGlzc3VlZDoKICAgIHllYXI6IDIwMTgKbm9jaXRlOiB8IAogIEBxdWFuZGwsIEBxdWFudG1vZCwgQGJldHMKLS0tCgpFc3RlIG1hdGVyaWFsIHRlbSBjb21vIG9iamV0aXZvIGVuc2luYXIgY29tbyB1c2FyIGRpdmVyc29zIHBhY290ZXMgZG8gUiBwYXJhIGNvbGV0YXIgZGFkb3MgZmluYW5jZWlyb3MgZSBlY29uw7RtaWNvcyBkZSBmb250ZXMgcMO6YmxpY2FzIGNvbW8gQmFuY28gQ2VudHJhbCBkbyBCcmFzaWwsIEJNJkYgQm92ZXNwYSwgSUJHRSwgSVBFQSwgR29vZ2xlIEZpbmFuY2UsIFlhaG9vIEZpbmFuY2UsIEZFRCwgZXRjLgoKIyMjIyMgKipJTlRST0RVw4fDg08qKgoKSW1hZ2luZSBxdWUgdm9jw6ogcHJlY2lzYSBhbmFsaXNhciB1bWEgYcOnw6NvIHF1YWxxdWVyIGUgdG9tYXIgYSBkZWNpc8OjbyBkZSBjb21wcmFyIG91IG7Do28gdGFsIGHDp8Ojby4gUG9zc2l2ZWxtZW50ZSwgdm9jw6ogdGVyw6EgcXVlIHBhZ2FyIHBvciBhbGd1bSBzZXJ2acOnbyBxdWUgdGVuaGEgZGFkb3MgZG8gaGlzdMOzcmljbyBkbyBwcmXDp28gZGVzdGEgYcOnw6NvLCBvcyByZXN1bHRhZG9zIG9wZXJhY2lvbmFpcyBkYSBlbXByZXNhIGJlbSBjb21vIG5vdMOtY2lhcyB2aW5jdWxhZGFzIMOgIGVtcHJlc2EgbmEgbcOtZGlhLiBPdXRyYSBvcMOnw6NvIMOpIHZvY8OqIGFjZXNzYXIgbyBzaXRlIGRlIHJlbGFjaW9uYW1lbnRvIGNvbSBpbnZlc3RpZG9yZXMgZGEgZW1wcmVzYSBlIHRlbnRhciBwZWdhciBvcyBkYWRvcyBkbyBzaXRlLiBQYXJhIGlzc28sIHNlcsOhIG5lY2Vzc8OhcmlvIGZhemVyIG8gZG93bmxvYWQgZG9zIGRhZG9zLCB0YWx2ZXogbWFudXNlw6EtbG9zIHBhcmEgcXVlIGZpcXVlbSBubyBmb3JtYXRvIGRlIHNldSBpbnRlcmVzc2UgZSBhcMOzcyBpc3NvIGZhemVyIHN1YXMgYW7DoWxpc2VzLgoKTm90ZSBxdWUgcGFyYSBjaGVnYXIgbm8gb2JqZXRpdm8gY3J1Y2lhbCBxdWUgw6kgYW5hbGlzYXIgb3MgZGFkb3MgZGEgZW1wcmVzYSBlIHRvbWFyIHVtYSBkZWNpc8OjbyBkZSBjb21wcmFyIG91IG7Do28gYSBhw6fDo28sIHZvY8OqIHByb3ZhdmVsbWVudGUgcGVyZGV1IGJhc3RhbnRlIHRlbXBvIHRlbnRhbmRvIGFjZXNzYXIgYXMgaW5mb3JtYcOnw7VlcyBuZWNlc3PDoXJpYXMuIAoKRmVsaXptZW50ZSwgcG9yIG1laW8gZG8gUiBjb25zZWd1aW1vcyBhY2Vzc2FyIGZvbnRlcyBww7pibGljYXMgcXVlIG5vcyBhanVkYW0gY29tIGEgZGlzcG9uaWJpbGl6YcOnw6NvIGRlIGRhZG9zIGRlIHVtYSBmb3JtYSBtYWlzIHNpbXBsZXMgZSBlZmljaWVudGUuIERlbnRyZSBhcyB2w6FyaWFzIGZvbnRlcywgdGVtb3M6CgoqIFtHb29nbGUgRmluYW5jZV0oaHR0cDovL3d3dy5nb29nbGUuY29tL2ZpbmFuY2UpCiogW1lhaG9vIEZpbmFuY2VdKGh0dHBzOi8vZmluYW5jZS55YWhvby5jb20vKQoqIFtJcGVhZGF0YV0oaHR0cDovL3d3dy5pcGVhZGF0YS5nb3YuYnIvKQoqIFtTSURSQS9JQkdFXShodHRwczovL3NpZHJhLmliZ2UuZ292LmJyLykKKiBbQk0mRiBCb3Zlc3BhXShodHRwOi8vd3d3LmJtZmJvdmVzcGEuY29tLmJyL3B0X2JyL3NlcnZpY29zL21hcmtldC1kYXRhL2hpc3Rvcmljby9tZXJjYWRvLWEtdmlzdGEvc2VyaWVzLWhpc3RvcmljYXMvKQoqIFtCYW5jbyBDZW50cmFsIGRvIEJyYXNpbF0oaHR0cDovL3d3dy5iY2IuZ292LmJyLz9TRVJJRVNURU1QKQoqIFtCYW5jbyBDZW50cmFsIGRvcyBFVUFdKGh0dHBzOi8vd3d3LmZlZGVyYWxyZXNlcnZlLmdvdi9kYXRhZG93bmxvYWQvKQoqIFtCYW5jbyBNdW5kaWFsXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy8pCgpQYXJhIHRhbnRvLCB0ZW1vcyBkdWFzIGFsdGVybmF0aXZhcy4gVW1hIGRlbGFzIMOpIGFjZXNzYXIgYXMgW0FQSXNdKGh0dHBzOi8vc2Vuc2VkaWEuY29tL2Jsb2cvYXBpcy9vLXF1ZS1zYW8tYXBpcy1wYXJ0ZS0yLWNvbW8tdW1hLWFwaS1mdW5jaW9uYS8pIGRlc3RhcyBpbnN0aXR1acOnw7VlcyBwb3IgbWVpbyBkbyBSIGUgY29sZXRhciBvcyBkYWRvcy4gT3V0cmEgYWx0ZXJuYXRpdmEsIMOpIGZhemVyIHVzbyBkZSBwYWNvdGVzIGRvIFIgcXVlIGZhY2lsaXRhbSBvIGFjZXNzbyDDoHMgQVBJcyBwb3IgbWVpbyBkZSBmdW7Dp8O1ZXMgcXVlIHPDo28gYmVtIG1haXMgc2ltcGxlcyBkZSB1dGlsaXphci4gCgpOZXN0ZSBtYXRlcmlhbCwgdmFtb3MgdXNhciBwYWNvdGVzLCBtYXMgY2FzbyBxdWVpcmEgZW50ZW5kZXIgY29tbyBtYW51c2VhciB1bWEgQVBJLCBvYnNlcnZlIGEgZXhwbGljYcOnw6NvIGNvbnRpZGEgbm8gbWF0ZXJpYWwgW1Byb2dyYW1hw6fDo28gZW0gUiAtIEltcG9ydGFyIERhZG9zXShodHRwczovL3JwdWJzLmNvbS9odWRzb25jaGF2cy9pbXBvcnRhcmRhZG9zKS4gT3MgcGFjb3RlcyBxdWUgcGVybWl0aXLDo28gYWNlc3NhciBvcyBkYWRvcyBkYXMgaW5zdGl0dWnDp8O1ZXMgY2l0YWRhcyBzw6NvOgoKKiBbUXVhbmRsXShodHRwczovL3d3dy5xdWFuZGwuY29tLykKKiBbcXVhbnRtb2RdKGh0dHBzOi8vd3d3LnF1YW50bW9kLmNvbS8pCiogW0JFVFNdKGh0dHBzOi8vZ2l0aHViLmNvbS9wZWRyb2Nvc3RhZmVycmVpcmEvQkVUUykKKiBbaXBlYWRhdGFyXShodHRwczovL2dpdGh1Yi5jb20vZ29tZXNsZWR1YXJkby9pcGVhZGF0YXIpCgojIyMjIyAqKlVTQU5ETyBPIFBBQ09URSBRdWFuZGwqKgoKTyBRdWFuZGwgw6kgdW1hIHBsYXRhZm9ybWEgcXVlIGRpc3BvbmliaWxpemEgbWlsaGFyZXMgZGUgZm9udGVzIGRlIGRhZG9zIHDDumJsaWNvcyBlIHByaXZhZG9zIHBhcmEgdXN1w6FyaW9zIGRlIGRpdmVyc2FzIHRlY25vbG9naWFzIGUgbGluZ3VhZ2VucyBkZSBwcm9ncmFtYcOnw6NvLiBBbMOpbSBkaXNzbywgYSBwbGF0YWZvcm1hIGZvcm5lY2UgdW1hIEFQSSBxdWUgcG9kZSBzZXIgZmFjaWxtZW50ZSBpbmNvcnBvcmFkYSBlbSBvdXRyYXMgdGVjbm9sb2dpYXMuIE1haW9yZXMgZGV0YWxoZXMgZGUgdG9kYXMgYXMgb3DDp8O1ZXMgZGUgdXNvIGRvIFF1YW5kbCwgcG9kZW0gc2VyIGVuY29udHJhZG9zIG5lc3RlIFtsaW5rXShodHRwczovL3d3dy5xdWFuZGwuY29tL3Rvb2xzL2Z1bGwtbGlzdCkuIAoKRXNwZWNpZmljYW1lbnRlIHBhcmEgbyBSLCBvIFF1YW5kbCB0ZW0gdW0gcGFjb3RlIChbUXVhbmRsXShodHRwczovL3d3dy5xdWFuZGwuY29tL3Rvb2xzL3IpKSBxdWUgcGVybWl0ZSBhY2Vzc2FyIHRvZG9zIG9zIGRhZG9zIChww7pibGljb3MgZSBwcml2YWRvcykgZGlyZXRhbWVudGUgZG8gUi4gUGFyYSB0YW50bywgbyBwYWNvdGUgdGVtIGZ1bsOnw7VlcyBxdWUgdXNhbSBhIFtBUEldKGh0dHBzOi8vd3d3LnF1YW5kbC5jb20vdG9vbHMvYXBpKSBkbyBRdWFuZGwgcGFyYSBidXNjYXIgZSBwcm9jZXNzYXIgYXMgcmVxdWlzacOnw7Vlcy4gCgpMZW1icmFuZG8gcXVlIMOpIG5lY2Vzc8OhcmlvIHNlIGNhZGFzdHJhciBubyBzaXRlIGRvIFF1YW5kbCBwYXJhIHRlciB1bWEgKipRdWFuZGwuYXBpX2tleSoqIHF1ZSBwZXJtaXRpcsOhIGFjZXNzYXIgdW1hIG1haW9yIHF1YW50aWRhZGUgZGUgZGFkb3MgKHNlbSBlbGEgdm9jw6ogdGVtIHVtIGxpbWl0ZSBkacOhcmlvKSBvdSBhdMOpIG1lc21vIGRhZG9zIHF1ZSB2b2PDqiBhZHF1aXJpdSBkbyBRdWFuZGwgKGRhZG9zIHByaXZhZG9zIGUgcXVlIHPDo28gcGFnb3MpLiBOYSBpbWFnZW0gYWJhaXhvLCB2b2PDqiBlbmNvbnRyYXLDoSBhcyBpbnN0cnXDp8O1ZXMgbmVjZXNzw6FyaWFzIHBhcmEgY3JpYXIgc3VhIGNvbnRhIG5vIFF1YW5kbC4KCiFbXShodHRwOi8vZy5yZWNvcmRpdC5jby9QM2xPMWQ3aWN2LmdpZikKCjxicj4gPC9icj4KCiogKipEYWRvcyBkbyBCQUNFTjoqKgoKUGFyYSBjb2xldGFyIGRhZG9zIGRvIEJhbmNvIENlbnRyYWwgZG8gQnJhc2lsIChCQUNFTikgbm8gUiB2aWEgUXVhbmRsIHByZWNpc2Ftb3MgZG9zIHNlZ3VpbnRlcyBwYXNzb3M6CgoxLiBBY2Vzc2FyIG8gc2lzdGVtYSBkZSBzw6lyaWVzIHRlbXBvcmFpcyBkbyBCQUNFTiAoW2h0dHA6Ly93d3cuYmNiLmdvdi5ici8/U0VSSUVTVEVNUF0oaHR0cDovL3d3dy5iY2IuZ292LmJyLz9TRVJJRVNURU1QKSksIGVzY29saGVyIHVtYSBzw6lyaWUgdGVtcG9yYWwgZGUgaW50ZXJlc3NlIGUgc2V1IGPDs2RpZ28uIFBvciBleGVtcGxvLCBvIMONbmRpY2UgbmFjaW9uYWwgZGUgcHJlw6dvcyBhbyBjb25zdW1pZG9yLWFtcGxvIChJUENBKSBxdWUgdGVtIG8gY8OzZGlnbyAkNDMzJC4KCiFbXShodHRwOi8vZy5yZWNvcmRpdC5jby93WDhqaDFVWFQ3LmdpZikKCjxicj4gPC9icj4KCjIuIE5vIFIsIGV4ZWN1dGUgbyBzZWd1aW50ZSBjw7NkaWdvOgoKYGBge3IsIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTkuNSwgZmlnLmhlaWdodD00fQojIEluc3RhbGFyIHBhY290ZXMgKHPDsyBleGVjdXRhciB1bWEgdmV6KQojIGluc3RhbGwucGFja2FnZXMoYygiUXVhbmRsIiwgImR5Z3JhcGhzIiwgIm1hZ3JpdHRyIiwgIlBlcmZvcm1hbmNlQW5hbHl0aWNzIiwgInF1YW50bW9kIikpCgojIENhcnJlZ2FyIHBhY290ZXMgbmVjZXNzw6FyaW9zCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShRdWFuZGwpKQpzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUoZHlncmFwaHMpKQpzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUobWFncml0dHIpKQpzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUoUGVyZm9ybWFuY2VBbmFseXRpY3MpKQpzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUocXVhbnRtb2QpKQoKIyBEZWZpbmlyIHN1YSBhcGkga2V5ClF1YW5kbC5hcGlfa2V5KCdOakdjMjItNDFSN3pEX0s3UHQ3eicpCgojIENvbGV0YXIgbyBkYWRvIGRvIElQQ0EuIE9ic2VydmUgcXVlIGFkaWNpb25hbW9zIEJDQi8gYW8gY8OzZGlnbyBkYSBzw6lyaWUgdGVtcG9yYWwuIFNlbXByZSB1c2FyZW1vcyBCQ0IvIAojIHBhcmEgY29sZXRhciBkYWRvcyBkbyBCQUNFTiBwb3IgbWVpbyBkbyBRdWFuZGwuIEVsZSB0ZW0gbyBzaWduaWZpY2FkbyBkZSBkZXRlcm1pbmFyIGRlIHF1YWwgYmFuY28gZGUgCiMgZGFkb3MgbyBRdWFuZGwgZGV2ZSBidXNjYXIgcGVsYSBzw6lyaWUgcXVlIG8gbsO6bWVybyBkZWZpbmlkby4gQ29tbyBwYWRyw6NvIG8gUXVhbmRsIGNvbGV0YXLDoSBvcyBkYWRvcyBuYQojIHBlcmlvZGljaWRhZGUgZGl2dWxnYWRhIHBlbG8gQkFDRU4uCmlwY2EgPC0gUXVhbmRsKCdCQ0IvNDMzJykKCiMgQ29sZXRhciBhIG1lc21hIGluZm9ybWHDp8OjbyBwYXJhIHVtIHBlcsOtb2RvIGVzcGVjw61maWNvCmlwY2EgPC0gUXVhbmRsKCdCQ0IvNDMzJywgc3RhcnRfZGF0ZSA9ICIxOTk2LTAxLTAxIiwgZW5kX2RhdGUgPSAiMjAxNy0xMi0zMSIpCgojIENvbGV0YXIgZGVmaW5pbmRvIGFwZW5hcyBhIGRhdGEgaW5pY2lhbCAKaXBjYSA8LSBRdWFuZGwoJ0JDQi80MzMnLCBzdGFydF9kYXRlID0gIjE5OTYtMDEtMDEiKQoKIyBDb2xldGFyIGRlZmluaW5kbyBhIHBlcmlvZGljaWRhZGUgZGUgaW50ZXJlc3NlCiMgT3DDp8O1ZXM6IGRhaWx5LCB3ZWVrbHksIG1vbnRobHksIHF1YXJ0ZXJseSwgYW5udWFsCmlwY2EgPC0gUXVhbmRsKCJCQ0IvNDMzIiwgY29sbGFwc2UgPSAicXVhcnRlcmx5Iiwgc3RhcnRfZGF0ZSA9ICIxOTk2LTAxLTAxIikKCiMgQ29sZXRhciBmYXplbmRvIGFsdGVyYcOnw7VlcyBub3MgZGFkb3MuIFRyYW5zZm9ybWHDp8O1ZXMgbm9zIGRhZG9zIHBlcm1pdGlkYXMgcGVsbyBRdWFuZGw6CiMgLSBkaWZmOiB6W3RdID0geVt0XSDigJMgeVt0LTFdIChkaWZlcmVuw6dhKQojIC0gcmRpZmY6IHpbdF0gPSAoeVt0XSDigJMgeVt0LTFdKSAvIHlbdC0xXSAoZGlmZXJlbsOnYSAlKQojIC0gcmRpZmZfZnJvbToJelt0XSA9ICh5W2xhdGVzdF0g4oCTIHlbdF0pIC8geVt0XSAoaW5jcmVtZW50byAlIGVtIHJlbGHDp8OjbyDDoCDDumx0aW1hIG9ic2VydmHDp8OjbykKIyAtIGN1bXVsOgl6W3RdID0geVswXSArIHlbMV0gKyDigKYgKyB5W3RdIChzb21hIGFjdW11bGF0aXZhKQojIC0gbm9ybWFsaXplOiB6W3RdID0geVt0XSDDtyB5WzBdICogMTAwIChzw6lyaWUgaW5pY2lhciBlbSAxMDApCmlwY2EgPC0gUXVhbmRsKCJCQ0IvNDMzIiwgdHJhbnNmb3JtID0gImRpZmYiLCBzdGFydF9kYXRlID0gIjE5OTYtMDEtMDEiKQoKIyBDb2xldGFyIGRlZmluaWRvIG8gdGlwbyBkZSBkYWRvIHF1ZSBxdWVyZW1vcyBubyBSCiMgLSB0czogc8OpcmllIHRlbXBvcmFsCiMgLSB6b286IG9iamV0byB6b28gCiMgLSB4dHM6IG5vIGZvcm1hdG8geHRzCiMgRGV0YWxoZXMgc29icmUgYSBkaWZlcmVuw6dhIGVudHJlIG9zIHRpcG9zIG5vIGxpbmsgYWJhaXhvCiMgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzM3MTQ2NjAvd2hhdC1pcy10aGUtZGlmZmVyZW5jZS10aGUtem9vLW9iamVjdC1hbmQtdHMtb2JqZWN0LWluLXIKaXBjYSA8LSBRdWFuZGwoIkJDQi80MzMiLCBzdGFydF9kYXRlID0gIjE5OTYtMDEtMDEiLCB0eXBlID0gInh0cyIpCgojIEFsdGVyYXIgbyBub21lIGRhIGNvbHVuYSBkbyBvYmpldG8gcGFyYSBWQUxFMy5TQQpjb2xuYW1lcyhpcGNhKSA8LSAiSVBDQSIKCiMgVmlzdWFsaXphciBvcyBkYWRvcyB1c2FuZG8gbyBwYWNvdGUgZHlncmFwaHMuIE1haXMgZGV0YWxoZXMgZW0KIyBodHRwczovL3JzdHVkaW8uZ2l0aHViLmlvL2R5Z3JhcGhzLwpkeWdyYXBoczo6ZHlncmFwaChpcGNhLCBtYWluID0gIsONbmRpY2UgTmFjaW9uYWwgZGUgUHJlw6dvcyBhbyBDb25zdW1pZG9yLUFtcGxvIChJUENBKSIpICU+JSBkeVJhbmdlU2VsZWN0b3IoKQpgYGAKCk9ic2VydmUgcXVlIG8gUXVhbmRsIHJldG9ybmFyw6EgdW1hIHPDqXJpZSB0ZW1wb3JhbCBubyBmb3JtYXRvIGVzcGVjaWZpY2Fkby4gQSBwYXJ0aXIgZGlzc28sIHZvY8OqIHBvZGUgZmF6ZXIgYXMgdHJhbnNmb3JtYcOnw7VlcyBkZSBpbnRlcmVzc2Ugbm9zIGRhZG9zIGJlbSBjb21vIHZpc3VhbGl6w6EtbG9zLgoKIyMjIyMgKipVU0FORE8gTyBQQUNPVEUgcXVhbnRtb2QqKgoKTyBxdWFudG1vZCAoKlF1YW50aXRhdGl2ZSBGaW5hbmNpYWwgTW9kZWxsaW5nICYgVHJhZGluZyBGcmFtZXdvcmsgZm9yIFIqKSDDqSB1bSBwYWNvdGUgcXVlIHRlbSBjb21vIG9iamV0aXZvIGZhY2lsaXRhciBvIGFjZXNzbyBhIGRhZG9zIGZpbmFuY2Vpcm9zIGUgZGlzcG9uaWJpbGl6YXIgZnVuY2lvbmFsaWRhZGVzIHF1ZSBwZXJtaXRhbSBhIGFuw6FsaXNlIGRlIHRhaXMgZGFkb3MuIEVtIGZ1bsOnw6NvIGRpc3RvLCBwZXJtaXRlIGFjZXNzYXIgZGFkb2QgZG8gWWFob28gRmluYW5jZSwgR29vZ2xlIEZpbmFuY2UsIGRlbnRyZSBvdXRyb3MuCgpDb20gcmVsYcOnw6NvIMOgcyBmdW5jaW9uYWxpZGFkZXMsIHZvY8OqIHBvZGUgYWNlc3NhciBhIGxpc3RhIGRlbGFzIG5lc3RlIFtsaW5rXShodHRwczovL3d3dy5xdWFudG1vZC5jb20vZXhhbXBsZXMvZGF0YS8pLCBtYXMgZGVudHJlIGVsYXMgdGVtb3M6IGFsdGVyYXIgYSBwZXJpb2RpY2lkYWRlIGRlIHVtYSBzw6lyaWUsIGNhbGN1bGFyIG8gcmV0b3JubyBkZSB1bSBhdGl2byBmaW5hbmNlaXJvLCBzZWxlY2lvbmFyIHBlcsOtb2RvcyBlc3BlY8OtZmljb3MgZGUgdW1hIHPDqXJpZSB0ZW1wb3JhbCwgdHJhbnNmb3JtYXIgYSBwZXJpb2RpY2lkYWRlIGRvcyByZXRvcm5vcyBlIG11aXRvIG1haXMuIAoKKiAqKkRhZG9zIGRvIFlhaG9vIEZpbmFuY2UgZSBHb29nbGUgRmluYW5jZToqKgoKVmFtb3MgbW9zdHJhciBjb21vIGNvbGV0YXIgZGFkb3MgZG8gWWFob28gRmluYW5jZSBubyBSIHZpYSBxdWFudG1vZC4gTmVzdGUgbW9tZW50byAoMjcvMDQvMjAxOCkgbyBHb29nbGUgRmluYW5jZSBuw6NvIGVzdMOhIGRpc3BvbmliaWxpemFuZG8gZGFkb3MgZGUgYWxndW1hcyBib2xzYXMuIFBvciBlc3RlIG1vdGl2bywgdmFtb3MgdXNhciBhcGVuYXMgbyBZYWhvbyBGaW5hbmNlIGNvbW8gZm9udGUgZGUgZGFkb3MgcGFyYSBvIHF1YW50bW9kLiBQb3LDqW0sIHBvc3Rlcmlvcm1lbnRlIHZvY8OqIHBvZGUgdGVzdGFyIGNvbGV0YXIgZGFkb3MgZG8gR29vZ2xlIEZpbmFuY2UuIAoKUGFyYSBjb2xldGFyIG9zIGRhZG9zIGRvIFlhaG9vIEZpbmFuY2UsIHByZWNpc2Ftb3MgZG9zIHNlZ3VpbnRlcyBwYXNzb3M6CgoxLiBBY2Vzc2FyIG8gc2l0ZSBkbyBZYWhvbyBGaW5hbmNlIChbaHR0cHM6Ly9maW5hbmNlLnlhaG9vLmNvbS9dKGh0dHBzOi8vZmluYW5jZS55YWhvby5jb20vKSksIGVzY29saGVyIHVtYSBhw6fDo28gZGUgaW50ZXJlc3NlIGUgc2V1IGPDs2RpZ28uIFBvciBleGVtcGxvLCBhIGHDp8OjbyBkYSBWYWxlIG5lZ29jaWFkYSBuYSBCTSZGIEJPVkVTUEEgcXVlIHRlbSBvIGPDs2RpZ28gJFZBTEUzLlNBJC4gQXRlbsOnw6NvIHBhcmEgbyBjYXNvIGRlIGHDp8O1ZXMgbmVnb2NpYWRhcyBlbSB2w6FyaWFzIGJvbHNhcy4gQW8gcGVzcXVpc2FyIHBlbG8gbm9tZSBkYSBlbXByZXNhIGFwYXJlY2Vyw6EgYSBib2xzYSBuYSBxdWFsIGVsYSBlc3TDoSBzZW5kbyBuZWdvY2lhZGEgZSB2b2PDqiBkZXZlIGVzY29saGVyIHBhcmEgYSBib2xzYSBxdWUgcXVlciBjb2xldGFyIG9zIGRhZG9zLiAKCjIuIE5vIFIsIGV4ZWN1dGUgbyBzZWd1aW50ZSBjw7NkaWdvOgoKYGBge3IsIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0KIyBDb2xldGFyIG9zIGRhZG9zIGRhIFZBTEUzLlNBIGRvIFlhaG9vIEZpbmFuY2UuIFRlbW9zIGFzIHNlZ3VpbnRlcyBvcMOnw7VlczoKIyAtIGdvb2dsZTogR29vZ2xlIEZpbmFuY2UKIyAtIEZSRUQ6IEZlZGVyYWwgUmVzZXJ2ZSBCYW5rIG9mIFN0LiBMb3VpcwojIEEgb3DDp8OjbyBhdXRvLmFzc2lnbiBkZWZpbmUgc2Ugb3MgZGFkb3MgZGV2ZW0gc2VyIGluY29ycG9yYWRvcyBubyBSIGNvbSBvIG5vbWUKIyBkbyBzeW1ib2wgb3UgdW0gbm9tZSBlc3BlY8OtZmljbyAoYXV0by5hc3NpZ24gPSBGQUxTRSkuIE5vIG5vc3NvIGNhc28sIG9wdGFtb3MKIyBwZWxvIG5vbWUgdmFsZS4KdmFsZSA8LSBxdWFudG1vZDo6Z2V0U3ltYm9scygiVkFMRTMuU0EiLCBzcmMgPSAieWFob28iLCBhdXRvLmFzc2lnbiA9IEZBTFNFKQoKIyBDb2xldGFyIG9zIGRhZG9zIHBhcmEgdW0gcGVyw61vZG8gZXNwZWPDrWZpY28KdmFsZSA8LSBxdWFudG1vZDo6Z2V0U3ltYm9scygiVkFMRTMuU0EiLCBzcmMgPSAieWFob28iLCBhdXRvLmFzc2lnbiA9IEZBTFNFLCBmcm9tID0gJzIwMTUtMDEtMDEnLCB0byA9ICcyMDE1LTEyLTMxJykKCiMgQ29sZXRhciBvcyBkYWRvcyBkZSB1bWEgZGF0YSBlc3BlY8OtZmljYSBhdMOpIGEgw7psdGltYSBvYnNlcnZhw6fDo28gZGlzcG9uw612ZWwgc29icmUgYSBhw6fDo28KdmFsZSA8LSBxdWFudG1vZDo6Z2V0U3ltYm9scygiVkFMRTMuU0EiLCBzcmMgPSAieWFob28iLCBhdXRvLmFzc2lnbiA9IEZBTFNFLCBmcm9tID0gJzIwMTctMDEtMDEnKQoKIyBDb2xldGFyIGRlZmluaWRvIG8gdGlwbyBkZSBkYWRvIHF1ZSBxdWVyZW1vcyBubyBSCiMgLSB0czogc8OpcmllIHRlbXBvcmFsCiMgLSB6b286IG9iamV0byB6b28gCiMgLSB4dHM6IG5vIGZvcm1hdG8geHRzCiMgRGV0YWxoZXMgc29icmUgYSBkaWZlcmVuw6dhIGVudHJlIG9zIHRpcG9zIG5vIGxpbmsgYWJhaXhvCiMgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzM3MTQ2NjAvd2hhdC1pcy10aGUtZGlmZmVyZW5jZS10aGUtem9vLW9iamVjdC1hbmQtdHMtb2JqZWN0LWluLXIKdmFsZSA8LSBxdWFudG1vZDo6Z2V0U3ltYm9scygiVkFMRTMuU0EiLCBzcmMgPSAieWFob28iLCBhdXRvLmFzc2lnbiA9IEZBTFNFLCBmcm9tID0gJzIwMTctMDEtMDEnLCByZXR1cm4uY2xhc3MgPSAneHRzJykKCiMgRm9ybWF0byBkYSBzYcOtZGEKa25pdHI6OmthYmxlKGhlYWQodmFsZSksIGFsaWduID0gImMiKQpgYGAKCk9ic2VydmUgcXVlIG8gcGFjb3RlIHF1YW50bW9kIGVudHJlZ2Fyw6EgdW0gb2JqZXRvIGNvbSB2w6FyaWFzIGNvbHVuYXMgKCoqT3BlbiwgSGlnaCwgTG93LCBDbG9zZSwgVm9sdW1lLCBBZGp1c3RlZCoqKSBjb20gbyBzZWd1aW50ZSBzaWduaWZpY2FkbzoKCiogKipPcGVuKio6IE8gcHJlw6dvIGRlIGFiZXJ0dXJhIG5hcyBkYXRhcyBlc3BlY2lmaWNhZGFzCiogKipIaWdoKio6IE8gcHJlw6dvIGRhIGFsdGEgbmFzIGRhdGFzIGVzcGVjaWZpY2FkYXMKKiAqKkxvdyoqOiBPIHByZcOnbyBkYSBiYWl4YSBuYXMgZGF0YXMgZXNwZWNpZmljYWRhcwoqICoqQ2xvc2UqKjogTyBwcmXDp28gZGUgZmVjaGFtZW50byBuYXMgZGF0YXMgZXNwZWNpZmljYWRhcwoqICoqVm9sdW1lKio6IE8gdm9sdW1lIG5hcyBkYXRhcyBlc3BlY2lmaWNhZGFzCiogKipBZGp1c3RlZCoqOiBPIHByZcOnbyBkZSBmZWNoYW1lbnRvIGFqdXN0YWRvIGRlcG9pcyBkZSBhcGxpY2FyIGRpc3RyaWJ1acOnw7VlcyBkZSBkaXZpZGVuZG9zIG91IGRpdmlzw6NvIGRhIGHDp8Ojby4gCgpEZXN0YSBmb3JtYSwgdm9jw6ogcG9kZSBlc2NvbGhlciBjb20gcXVhbCBkYWRvIHZhaSB0cmFiYWxoYXIgZW0gc3VhIGFuw6FsaXNlLiBQYXJhIHJldG9ybm9zIGRpw6FyaW9zLCBnZXJhbG1lbnRlIGZhemVtb3MgdXNvIGRvICoqQ2xvc2UqKiBxdWUgw6kgbyBwcmXDp28gZGUgZmVjaGFtZW50byBkYSBhw6fDo28gbmEgZGF0YS4gUGFyYSB0YW50bywgYmFzdGEgZmF6ZXIgbyBzZWd1aW50ZToKCmBgYHtyLCBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD05LjUsIGZpZy5oZWlnaHQ9NH0KIyBDYWxjdWxhciBvIHJldG9ybm8gZGnDoXJpbyB1c2FuZG8gbyBsb2cocF90KSAtIGxvZyhwX3QtMSkuIAojIE91dHJhIG9ww6fDo28gw6kgbyByZXRvcm5vIGRpw6FyaW8gcG9yIG1laW8gZGEgb3DDp8OjbyBtZXRob2QgPSAiZGlzY3JldGUiCmRhaWx5X3JldHVybiA8LSBQZXJmb3JtYW5jZUFuYWx5dGljczo6UmV0dXJuLmNhbGN1bGF0ZSh2YWxlJFZBTEUzLlNBLkNsb3NlLCBtZXRob2QgPSAibG9nIikKCiMgQWx0ZXJhciBvIG5vbWUgZGEgY29sdW5hIGRvIG9iamV0byBwYXJhIFZBTEUzLlNBCmNvbG5hbWVzKGRhaWx5X3JldHVybikgPC0gIlZBTEUzLlNBIgoKIyBWaXN1YWxpemFyIG9zIGRhZG9zIHVzYW5kbyBvIHBhY290ZSBkeWdyYXBocy4gTWFpcyBkZXRhbGhlcyBlbQojIGh0dHBzOi8vcnN0dWRpby5naXRodWIuaW8vZHlncmFwaHMvCmR5Z3JhcGhzOjpkeWdyYXBoKGRhaWx5X3JldHVybiwgbWFpbiA9ICJSZXRvcm5vIERpw6FyaW8gZGEgVkFMRTMuU0EiKSAlPiUgZHlSYW5nZVNlbGVjdG9yKCkKYGBgCgojIyMjIyAqKk1BSVMgREVUQUxIRVMgRE9TIFBBQ09URVMgRSBBTFRFUk5BVElWQVMgREUgVVNPIERPIFIgRU0gRklOQU7Dh0FTKioKCkFwZXNhciBkZSBhcHJlc2VudGFybW9zIGFxdWkgYWxndW1hcyBvcMOnw7VlcyBkZSBjb21vIHVzYXIgb3MgcGFjb3RlcyBRdWFuZGwgZSBxdWFudG1vZCBwYXJhIGNvbGV0YXIgZGFkb3MgcMO6YmxpY29zIGRpcmV0YW1lbnRlIGRvIFIsIGV4aXN0ZW0gb3V0cm9zIHBhY290ZXMgcXVlIHJlY29tZW5kby4gUGFyYSB0YW50bywgdXNlIG8gbGluayBhYmFpeG86CgoqIFtCRVRTXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvQkVUUy92aWduZXR0ZXMvQkVUU19iYXNpY191c2FnZS5odG1sKQoqIFtpcGVhZGF0YXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9nb21lc2xlZHVhcmRvL2lwZWFkYXRhcikKKiBbZGVmbGF0ZUJSXShodHRwczovL2dpdGh1Yi5jb20vbWVpcmVsZXNmZi9kZWZsYXRlQlIpCgpBbMOpbSBkaXNzbywgZXhpc3RlIHVtIG5vdm8gcGFjb3RlIG5vIFIgY2hhbWFkbyBbdGlkeXF1YW50XShodHRwczovL2dpdGh1Yi5jb20vYnVzaW5lc3Mtc2NpZW5jZS90aWR5cXVhbnQpIHF1ZSB0ZW0gZnVuY2lvbmFsaWRhZGVzIGltcG9ydGFudGVzIHBhcmEgcXVlbSB0cmFiYWxoYSBjb20gZGFkb3MgZmluYW5jZWlyb3MuIFZvY8OqIHBvZGUgZGVzY29icmlyIHRhaXMgZnVuY2lvbmFsaWRhZGVzIHBvciBtZWlvIGRvcyBsaW5rIGFiYWl4bzoKCiogW0ludHJvZHVjdGlvbiB0byB0aWR5cXVhbnRdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy90aWR5cXVhbnQvdmlnbmV0dGVzL1RRMDAtaW50cm9kdWN0aW9uLXRvLXRpZHlxdWFudC5odG1sKQoqIFtDb3JlIGZ1bmN0aW9ucyBpbiB0aWR5cXVhbnRdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy90aWR5cXVhbnQvdmlnbmV0dGVzL1RRMDEtY29yZS1mdW5jdGlvbnMtaW4tdGlkeXF1YW50Lmh0bWwpCiogW1IgcXVhbnRpdGF0aXZlIGFuYWx5c2lzIHBhY2thZ2UgaW50ZWdyYXRpb25zIGluIHRpZHlxdWFudF0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3RpZHlxdWFudC92aWduZXR0ZXMvVFEwMi1xdWFudC1pbnRlZ3JhdGlvbnMtaW4tdGlkeXF1YW50Lmh0bWwpCiogW1NjYWxpbmcgYW5kIG1vZGVsaW5nIHdpdGggdGlkeXF1YW50XShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvdGlkeXF1YW50L3ZpZ25ldHRlcy9UUTAzLXNjYWxpbmctYW5kLW1vZGVsaW5nLXdpdGgtdGlkeXF1YW50Lmh0bWwpCiogW0NoYXJ0aW5nIHdpdGggdGlkeXF1YW50XShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvdGlkeXF1YW50L3ZpZ25ldHRlcy9UUTA0LWNoYXJ0aW5nLXdpdGgtdGlkeXF1YW50Lmh0bWwpCiogW1BlcmZvcm1hbmNlIGFuYWx5c2lzIHdpdGggdGlkeXF1YW50XShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvdGlkeXF1YW50L3ZpZ25ldHRlcy9UUTA1LXBlcmZvcm1hbmNlLWFuYWx5c2lzLXdpdGgtdGlkeXF1YW50Lmh0bWwpCgoKIyMjIyMgKipSRUZFUsOKTkNJQVMqKg==