Licença

This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.

License: CC BY-SA 4.0

Citação

Sugestão de citação: FIGUEIREDO, Adriano Marcos Rodrigues. Séries Temporais com R: Análise do Consumo do Varejo em MS. Campo Grande-MS,Brasil: RStudio/Rpubs, 2019. Disponível em http://rpubs.com/amrofi/arima_varejoms.

1 Introdução

Neste arquivo utilizo a série do Índice de volume de vendas no varejo Total de Mato Grosso do Sul, série mensal a partir de jan/2000 até jul/2019 obtida com o pacote BETS e importada do Banco Central do Brasil. Portanto, são 235 observações mensais.

Conforme Hyndman e Athanasopoulos (2018), se combinarmos a diferenciação com autoregressão e um modelo de média móvel, obteremos um modelo ARIMA não sazonal. ARIMA é um acrônimo para Média Móvel Integrada AutoRegressiva (neste contexto, “integração” é o inverso da diferenciação). O modelo completo pode ser escrito como \[ \begin{equation} y'_{t} = c + \phi_{1}y'_{t-1} + \cdots + \phi_{p}y'_{t-p} + \theta_{1}\varepsilon_{t-1} + \cdots + \theta_{q}\varepsilon_{t-q} + \varepsilon_{t}, \tag{1.1} \end{equation} \]

onde \(y'_{t}\) é a série diferenciada (pode ter sido diferenciada mais de uma vez). Os “preditores” no lado direito incluem valores defasados de \(y'_{t}\) assim como erros defasados. Chamamos isso de modelo ARIMA(p,d,q), em que p é a ordem da parte autoregressiva (AR(p)); d é a ordem de diferenciação envolvida (I(d)); q é a ordem da parte da média móvel (MA(q)).

2 Dados

Farei de duas formas para o leitor. Uma carrega direto do site do Banco Central do Brasil com o pacote BETS (FERREIRA, SPERANZA e COSTA, 2018) e a outra eu gerei a estrutura idêntica pela função dput() para os leitores que não conseguirem por qualquer motivo o acesso ao site do Banco Central (as vezes vejo isso ocorrer dependendo dos bloqueios da sua rede de internet). A forma pelo dput assume o nome varejoms2 enquanto a extraída pelo BETS tem nome varejoms. Esclareço ao leitor que após baixar a série pelo BETS, fiz o dput e a partir de então, desabilitei o bloco (Chunk) que acessa o BETS apenas para agilizar os cálculos.

library(BETS)
# Pegando as séries a partir do site do Banco Central do Brasil
# Índice de volume de vendas no varejo Total de Mato Grosso do Sul
# mensal a partir de jan/2000 até jul/2019 
# 235 observações mensais
varejoms <- BETSget(1479) 
print(varejoms)
class(varejoms)
dput(varejoms)  # opção para ter os dados como na structure abaixo
suppressMessages(library(readxl))
suppressMessages(library(foreign))
suppressMessages(library(dynlm))
suppressMessages(library(car))
suppressMessages(library(lmtest))
suppressMessages(library(sandwich))
suppressMessages(library(fpp2))
suppressMessages(library(tseries))
suppressMessages(library(zoo))
suppressMessages(library(forecast))
suppressMessages(library(ggplot2))
# Pegando as séries a partir do site do Banco Central do Brasil Índice de
# volume de vendas no varejo Total de Mato Grosso do Sul mensal a partir de
# jan/2000 até jul/2019 Loading the dataset library(readxl) dados <-
# read_excel('dados.xlsx',sheet = 'dados') attach(dados)
library(BETS)

# Pegando as séries a partir do site do Banco Central do Brasil Índice de
# volume de vendas no varejo Total de Mato Grosso do Sul mensal a partir de
# jan/2000 até jul/2019 (em 12.09.2019)

# varejoms <- BETSget(1479)

varejoms <- structure(c(35.2, 35.6, 39.2, 40.5, 41.6, 40.4, 40.8, 38.7, 37.3, 37.6,
    35.6, 47.4, 34.2, 32.2, 38, 37.5, 38.8, 35, 38.4, 40.2, 38.2, 39.3, 36, 46.3,
    36.4, 34, 39, 37.8, 38.9, 35.3, 37.2, 38.1, 35.6, 38.3, 35.6, 45.7, 32.2, 31.6,
    35.2, 36.8, 37.5, 34.8, 38.4, 38.1, 37, 39, 37.3, 49, 35.8, 35.3, 40.2, 41.3,
    43.9, 41.6, 45.9, 42.3, 42.2, 44, 41.3, 56.9, 38.5, 38.5, 45.3, 43.6, 46.2, 44.3,
    47.5, 46.5, 46.4, 46, 44.1, 61, 42, 40.2, 44.6, 44.5, 47.8, 45.3, 46.5, 48.5,
    47.7, 50.2, 49.3, 64.5, 47, 46.8, 51, 50.5, 55, 51.3, 52.8, 55.3, 54.8, 55.6,
    55.3, 72.2, 54.5, 52.1, 56.2, 57.2, 60.8, 56.1, 61.8, 61.6, 59.8, 63.3, 57.7,
    77.4, 61.4, 51.9, 57.3, 57.9, 61.9, 57.3, 61.1, 61.1, 60.6, 65.6, 63.5, 83.1,
    64.1, 60.2, 67.8, 67.1, 72.8, 68.5, 71.1, 69.3, 69.9, 71.1, 67.9, 92.7, 67.5,
    64.8, 69.1, 69.4, 79.6, 70.2, 73.8, 72.5, 71.3, 75.6, 74.7, 100.8, 79.5, 75.7,
    82.4, 78, 84.8, 83.2, 84.8, 88.5, 86.3, 91.7, 92.8, 111.4, 92.8, 83.7, 92.5,
    88.3, 93.9, 88.8, 96, 95.9, 93.2, 98.3, 100.5, 128.8, 97.2, 90.2, 94.3, 94.4,
    101.1, 92, 96.4, 98.2, 97.6, 105.8, 103.1, 129.6, 99.6, 87.8, 97, 94.8, 98.6,
    93.4, 98.4, 96.4, 92.5, 100.6, 97.2, 124.5, 91.5, 85.1, 91.6, 88.5, 92.2, 87.4,
    90.5, 88.1, 85.2, 89.4, 93.4, 116.9, 90.8, 84, 89.7, 86.3, 90, 87.3, 90.8, 93.5,
    93.7, 91.4, 93.5, 114.1, 87.8, 81.1, 94.5, 83.2, 89.9, 88.8, 89.3, 93.7, 93.5,
    96.3, 101.3, 118.3, 93.8, 85.2, 90, 86.6, 90, 85.2, 90.9), .Tsp = c(2000, 2019.5,
    12), class = "ts")

A rotina de dados obtidos pelo BETS já retorna a série em formato ts, ou seja, série temporal. Farei então a criação de uma série em diferenças para observar o comportamento da série em nível e em diferenças.

Inicialmente olharei as estatísticas descritivas da série. Em seguida farei um plot básico da série e o plot pelo pacote dygraphs, útil para ver os pontos de picos e momentos específicos.

dvarejo <- diff(varejoms)
# estatisticas basicas
summary(varejoms)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  31.60   44.05   64.50   67.28   90.00  129.60 
# Min. 1st Qu.  Median Mean 3rd Qu.  Max.  31.60 44.05 64.50 67.28 90.00 129.60

# plot basico lembrar que em class(), ele já indicou que era ts = serie
# temporal
plot(varejoms)

# pelo pacote dygraph dá mais opções
library(dygraphs)
library(htmlwidgets)
dygraph(varejoms, main = "Índice de volume de vendas no varejo total de Mato Grosso do Sul <br> (Mensal)  (2011=100) BCB 1479") %>%
    dyAxis("x", drawGrid = TRUE) %>%
    dyEvent("2005-1-01", "2005", labelLoc = "bottom") %>%
    dyEvent("2015-1-01", "2015", labelLoc = "bottom") %>%
    dyEvent("2018-1-01", "2018", labelLoc = "bottom") %>%
    dyEvent("2019-1-01", "2019", labelLoc = "bottom") %>%
    dyOptions(drawPoints = TRUE, pointSize = 2)

É possivel visualizar nos plots acima: sazonalidade (por exemplo, picos em dezembro de cada ano); a tendência aparentemente crescente até 2014 e decresce com a “crise” brasileira; e uma aparente não-estacionariedade (média e variância mudam no tempo). Mais a frente, aplicarei o teste de raiz unitária na série para avaliar a estacionariedade de modo mais explícito.

3 Análise da série

Uma ressalva deve ser feita, que no presente exercício, não farei a divisão entre amostra teste e amostra treino, de modo que usarei a série toda para os ajustes. O leitor deve em geral fazer estas divisões para certificar de que o modelo é um bom preditor.

Geralmente, não é possível dizer olhando o gráfico de tempo, quais valores de lags p e q serão apropriados para os dados. Às vezes, é possível usar o gráfico ACF e o gráfico PACF para determinar valores apropriados para p e q. A primeira análise indica olhar os gráficos (correlogramas) da Função de Autocorrelação (FAC, em português, ou ACF em inglês) e Autocorrelação parcial (FACp, em português, ou PACF em inglês).

um gráfico FAC mostra as autocorrelações que medem a relação entre
\(y_t\) e \(y_{t-k}\) para diferentes valores de k. Agora, se \(y_t\) e \(y_{t-1}\) estão correlacionados, então \(y_{t}\) e \(y_{t-2}\) também deve ser correlacionado. Mas isso pode ser porque ambos estão correlacionados com \(y_{t-1}\). Para evitar essas “interferências” é que se faz a FACp. As autocorrelações parciais na FACp medem a relação entre \(y_t\) e \(y_{t-k}\) depois de remover os efeitos dos lags 1, 2, 3, … , (k-1). Portanto, a primeira autocorrelação parcial é idêntica à primeira autocorrelação, porque não há nada entre elas para remover. Cada autocorrelação parcial pode ser estimada como o último coeficiente em um modelo autoregressivo. Isto pode ser obtido com as funções acf e pacf, ou usando as funções ggAcf e ggPacf do pacote forecast. Faremos o mesmo procedimento para a série em nível e para a série em primeira diferença.

3.1 Função de Autocorrelação (FAC) e Autocorrelação parcial (FACp) com defasagem 36

3.1.1 Série em nível

Usarei a rotina do Hyndman e Athanasopoulos (2018).

require(forecast)
varejo <- varejoms
varejo %>%
    ggtsdisplay(main = "")

Neste caso, o ggtsdisplay do pacote forecast já retorna os gráficos da série, e respectivas ACF e PACF.

3.1.2 Série em primeira diferença

Como a série apresenta variações sazonais importantes, assim como tendência importante, claramente não-estacionárias, vou olhar também em primeira diferença.

varejo %>%
    diff() %>%
    ggtsdisplay(main = "Série varejo de MS em primeira diferença")

3.1.3 Primeira diferença sazonal e ACF e PACF

Farei agora a diferença sazonal.

varejo %>%
    diff(lag = 12) %>%
    ggtsdisplay(main = "Série varejo de MS em primeira diferença sazonal")

3.1.4 Ajuste sazonal e ACF e PACF

Aplicaremos o ajuste sazonal tipo STL (Seasonal Decomposition of Time Series by Loess) aos dados.

library(fpp2)
varejo %>%
    stl(s.window = "periodic") %>%
    seasadj() -> varejoadj
autoplot(varejoadj)

E agora os plots de ACF e PACF na série ajustada sazonalmente.

varejoadj %>%
    diff() %>%
    ggtsdisplay(main = "Série varejo de MS em primeira diferença e ajuste sazonal")

Parece indicar para algum AR de ordem 4 na PACF, alguma sazonalidade marcante na ACF (indicando um termo SMA), e indicacao de um ARIMA (4,1,1)(0,1,1)[12].

Uma estimação inicial desse modelo daria algo como

(fit <- Arima(varejoadj, order = c(4, 1, 1), seasonal = c(0, 1, 1)))
Series: varejoadj 
ARIMA(4,1,1)(0,1,1)[12] 

Coefficients:
          ar1      ar2      ar3      ar4     ma1     sma1
      -0.6053  -0.2438  -0.0731  -0.1830  0.1582  -0.4622
s.e.   0.3095   0.1571   0.0871   0.0689  0.3134   0.0621

sigma^2 = 6.179:  log likelihood = -515.75
AIC=1045.51   AICc=1046.03   BIC=1069.33

É possível observar os AICc = 1046.03, suspeitar da não significância de ar3 e olhar os resíduos. A função autoplot retorna o círculo unitário e as raízes unitárias desta estimação, enquanto a checkresiduals fornece os correlogramas residuais.

O círculo unitário indica estabilidade das raízes unitárias do modelo, enquanto o Ljung-Box retorna a não-rejeição de H0 de que os parâmetros de autocorrelação residual são nulos (retorna um grande valor p, sugerindo também que os resíduos são ruído branco). O gráfico ACF dos resíduos do modelo ARIMA (4,1,1)(0,1,1)[12] mostra que todas as autocorrelações estão dentro dos limites à exceção de um lag 23, indicando que os resíduos estão se comportando como ruído branco.

autoplot(fit)

checkresiduals(fit)


    Ljung-Box test

data:  Residuals from ARIMA(4,1,1)(0,1,1)[12]
Q* = 13.198, df = 18, p-value = 0.7797

Model df: 6.   Total lags used: 24
library(FitAR)  # pratico para plotar graficos de Q
# LBQPlot(res, lag.max = 30) res é a série que temos interesse de realizar os
# testes lag.max é o número de lags que se deseja imprimir o gráfico
LBQPlot(residuals(fit), 36)

# Alternativa pelo LSTS
library(LSTS)
p <- Box.Ljung.Test(residuals(fit), lag = 36, main = "LSTS Ljung-Box test")
p + ggthemes::theme_economist_white() + labs(x = "Lag = k", y = "P-valor do Teste Ljung-Box para até lag = k ",
    title = "Série de consumo:", subtitle = "varejo de MS", caption = "Fonte: Elaboração própria a partir de dados do BCB.")

Checando a normalidade dos resíduos.

# checar normalidade dos resíduos
library(tseries)
jarque.bera.test(residuals(fit))

    Jarque Bera Test

data:  residuals(fit)
X-squared = 8.5422, df = 2, p-value = 0.01397

4 ARIMA

Uma estimação automatizada pela função auto.arima {forecast} padrão indica um modelo diferente.

fit2 <- auto.arima(varejo)
summary(fit2)
Series: varejo 
ARIMA(0,1,1)(0,1,1)[12] 

Coefficients:
          ma1     sma1
      -0.4558  -0.4691
s.e.   0.0592   0.0617

sigma^2 = 6.312:  log likelihood = -520.11
AIC=1046.23   AICc=1046.34   BIC=1056.44

Training set error measures:
                     ME     RMSE     MAE        MPE    MAPE      MASE
Training set 0.01107351 2.430819 1.79931 0.02282225 2.64575 0.3926471
                    ACF1
Training set -0.01460341
# p-values dos coeficientes
pvalues <- (1 - pnorm(abs(fit2$coef)/sqrt(diag(fit2$var.coef)))) * 2
pvalues
         ma1         sma1 
1.332268e-14 2.775558e-14 
library(FitAR)  # pratico para plotar graficos de Q
LBQPlot(residuals(fit2), 36)

# Alternativa pelo LSTS
library(LSTS)
p2 <- Box.Ljung.Test(residuals(fit2), lag = 36, main = "LSTS Ljung-Box test")
p2 + ggthemes::theme_economist_white() + labs(x = "Lag = k", y = "P-valor do Teste Ljung-Box para até lag = k ",
    title = "Série de consumo:", subtitle = "varejo de MS", caption = "Fonte: Elaboração própria a partir de dados do BCB.")

# checar normalidade dos resíduos
library(tseries)
jarque.bera.test(residuals(fit2))

    Jarque Bera Test

data:  residuals(fit2)
X-squared = 8.847, df = 2, p-value = 0.01199

Neste caso, o modelo teve a indicação de ARIMA(0,1,1)(0,1,1)[12], diferente do anterior (ARIMA(4,1,1)(0,1,1)[12] - definido pela intuição dos correlogramas), como reflexo do default da função admitir lags máximos e procedimentos que restringem a otimização da função verossimilhança. O AICc foi de 1046.34, pouco acima do anterior, indicando ajuste inferior que o primeiro.

5 Modelo ARIMA automático mais geral

A recomendação do Hyndman e Athanasopoulos (2018), nestas situações, é fazer um modelo auto.arima mais geral, que investigue mais possibilidades de modelos,fazendo os argumentos da auto.arima da forma stepwise=FALSE e approximation=FALSE. Se estiver usando a série com ajuste sazonal (dessazonalizada), será interessante usar tambem o argumento seasonal=FALSE.

require(fpp2)
fit3 <- auto.arima(varejoms, stepwise = FALSE, approximation = FALSE)
summary(fit3)
Series: varejoms 
ARIMA(4,1,0)(0,1,1)[12] 

Coefficients:
          ar1      ar2      ar3      ar4     sma1
      -0.4529  -0.1741  -0.0504  -0.1874  -0.4610
s.e.   0.0662   0.0726   0.0725   0.0660   0.0618

sigma^2 = 6.158:  log likelihood = -515.88
AIC=1043.75   AICc=1044.14   BIC=1064.17

Training set error measures:
                      ME     RMSE      MAE        MPE     MAPE      MASE
Training set 0.009480306 2.384598 1.779725 0.02458176 2.619097 0.3883732
                    ACF1
Training set 0.004907171
# p-values dos coeficientes
pvalues <- (1 - pnorm(abs(fit3$coef)/sqrt(diag(fit3$var.coef)))) * 2
pvalues
         ar1          ar2          ar3          ar4         sma1 
7.652989e-12 1.642129e-02 4.869277e-01 4.524327e-03 8.726353e-14 

Neste cenário, a rotina auto.arima encontra o ARIMA(4,1,0)(0,1,1)[12], com AICc de 1044.14, portanto, melhor (menor) que as duas primeiras estimações. como intuido anteriormente, ele detecta o AR(4), a Integração (I(1)), a integração sazonal e o SMA(1). O termo ar3 não foi significativo, mas os demais foram.

5.0.1 Checando resíduos

Os modelos podem ser considerados white noise, mas não normais.

checkresiduals(fit3)


    Ljung-Box test

data:  Residuals from ARIMA(4,1,0)(0,1,1)[12]
Q* = 13.381, df = 19, p-value = 0.8185

Model df: 5.   Total lags used: 24
require(FitAR)  # pratico para plotar graficos de Q
LBQPlot(residuals(fit3), 36)

# Alternativa pelo pacote LSTS
library(LSTS)
p3 <- Box.Ljung.Test(residuals(fit3), lag = 36, main = "LSTS Ljung-Box test")
p3 + ggthemes::theme_economist_white() + labs(x = "Lag = k", y = "P-valor do Teste Ljung-Box para até lag = k ",
    title = "Série de consumo:", subtitle = "varejo de MS", caption = "Fonte: Elaboração própria a partir de dados do BCB.")

# checar normalidade dos resíduos
require(tseries)
jarque.bera.test(residuals(fit3))

    Jarque Bera Test

data:  residuals(fit3)
X-squared = 8.0982, df = 2, p-value = 0.01744

Pode-se fazer o gráfico dos forecasts deste modelo:

autoplot(forecast(fit3, h = 24), title = "Forecasts de volume de vendas no varejo total de Mato Grosso do Sul",
    xlab = "Ano", ylab = "Índice (2011=100)")

5.0.2 Teste de raiz unitária

O teste de raiz unitária deveria ser feito antes de rodar o ARIMA, a fim de investigar e/ou confirmar a não-estacionariedade da série, que foi intuida a partir da ACF e PACF. A rotina auto.arima já faz esse teste em seu processo. Existem diferentes testes de raiz unitária possíveis (ADF, PP, KPSS) assim como diferentes testes para a sazonalidade.

5.0.2.1 Teste ADF

O teste de Dickey-Fuller aumentado (ADF) é nossa primeira escolha. O padrão é que H0: série não estacionária ou série tem raiz unitária.

ADF.test <- adf.test(varejoms)
ADF.test

    Augmented Dickey-Fuller Test

data:  varejoms
Dickey-Fuller = -1.7075, Lag order = 6, p-value = 0.6988
alternative hypothesis: stationary

5.0.2.2 Teste ADF invertendo a hipótese nula

Neste caso, o padrão é que H0: a série é estacionária ou a série não tem raiz unitária. Neste caso, a hipótese alternativa é que a série é “explosiva”.

ADF.test12 <- adf.test(varejoms, k = 12, alternative = c("explosive"))
ADF.test12

    Augmented Dickey-Fuller Test

data:  varejoms
Dickey-Fuller = -1.0897, Lag order = 12, p-value = 0.07762
alternative hypothesis: explosive

6 ARIMA - Codigo do Hyndman e Athanasopoulos, secao 8.1

A função ndiffs usa um teste de raiz unitária para determinar o número de diferenças necessárias para que séries temporais xsejam feitas estacionárias.

Se test="kpss", o teste KPSS é usado com a hipótese nula que x possui uma raiz estacionária contra uma alternativa de raiz unitária. Em seguida, o teste retorna o menor número de diferenças necessárias para passar no teste ao nível alpha.

Se test="adf", o teste ADF é utilizado e se test="pp", o teste de Phillips-Perron é usado. Em ambos os casos, a hipótese nula é que x tem uma raiz unitária contra uma alternativa de série estacionária. Em seguida, o teste retorna o menor número de diferenças necessárias para falhar o teste no nível alpha.

A função nsdiffs usa testes de raiz unitária sazonal para determinar o número de diferenças sazonais necessárias para que as séries temporais x sejam feitas estacionárias (possivelmente com algum diferencial de atraso também). Se test="ch", o teste de Canova-Hansen (1995) é usado (com hipótese nula de sazonalidade determinística) e se test="ocsb" o teste de Osborn-Chui-Smith-Birchenhall (1988) é usado (com hipótese nula de existir uma raiz unitária sazonal).

x <- varejoms
ns <- nsdiffs(x)  #numero de diferencas sazonais
ns
[1] 1
if (ns > 0) {
    xstar <- diff(x, lag = frequency(x), differences = ns)
} else {
    xstar <- x
}

Portanto, temos uma diferença sazonal necessária (ns=1) e a série na diferença sazonal está armazenada em xstar.

nd <- ndiffs(xstar)  # numero de diferencas
nd
[1] 1
if (nd > 0) {
    xstar <- diff(xstar, differences = nd)
}
# xstar será a série devidamente em diferenças sazonais e diferenças normais
autoplot(xstar)

auto.arima(xstar)  # ver que o resultado é igual, mas agora nao tem diferencas
Series: xstar 
ARIMA(0,0,1)(0,0,1)[12] with zero mean 

Coefficients:
          ma1     sma1
      -0.4558  -0.4691
s.e.   0.0592   0.0617

sigma^2 = 6.312:  log likelihood = -520.11
AIC=1046.23   AICc=1046.34   BIC=1056.44
modelo <- auto.arima(xstar, stepwise = FALSE, approximation = FALSE)
summary(modelo)
Series: xstar 
ARIMA(4,0,0)(0,0,1)[12] with zero mean 

Coefficients:
          ar1      ar2      ar3      ar4     sma1
      -0.4529  -0.1741  -0.0504  -0.1874  -0.4610
s.e.   0.0662   0.0726   0.0725   0.0660   0.0618

sigma^2 = 6.158:  log likelihood = -515.88
AIC=1043.75   AICc=1044.14   BIC=1064.17

Training set error measures:
                     ME     RMSE      MAE  MPE MAPE      MASE        ACF1
Training set 0.01044227 2.453404 1.882938 -Inf  Inf 0.5055836 0.004680592
autoplot(modelo)

Comentário: uma vez que a série utilizada em auto.arima é a resultante xstar, o mmodelo não identifica a necessidade de diferenciação nem diferenciação sazonal. Com esse procedimento, ele encontra o ARIMA(4,0,0)(0,01)[12] para xstar que já teve as diferenças aplicadas sobre varejoms. Da mesma forma que em fit e fit3, o modelo com argumentos stepwise=FALSE, approximation=FALSE retorna os melhores ajustes.

Referências

FERREIRA, Pedro Costa; SPERANZA, Talitha; COSTA, Jonatha (2018). BETS: Brazilian Economic Time Series. R package version 0.4.9. Disponível em: https://CRAN.R-project.org/package=BETS.

HYNDMAN, Rob. (2018). fpp2: Data for “Forecasting: Principles and Practice” (2nd Edition). R package version 2.3. Disponível em: https://CRAN.R-project.org/package=fpp2.

HYNDMAN, R.J., & ATHANASOPOULOS, G. (2018) Forecasting: principles and practice, 2nd edition, OTexts: Melbourne, Australia. Disponível em: https://otexts.com/fpp2/. Accessed on 12 Set 2019.

LS0tDQp0aXRsZTogIlPDqXJpZXMgVGVtcG9yYWlzIGNvbSBSOiBBbsOhbGlzZSBBUklNQSBkbyBDb25zdW1vIGRvIFZhcmVqbyBlbSBNUyINCmF1dGhvcjogIkFkcmlhbm8gTWFyY29zIFJvZHJpZ3VlcyBGaWd1ZWlyZWRvLCAqZS1tYWlsOiBhZHJpYW5vLmZpZ3VlaXJlZG9AdWZtcy5icioiDQpsaW5rY29sb3I6IGJsdWUNCmFic3RyYWN0OiANCiAgVGhpcyBpcyBhbiBleGVyY2lzZSBmb3IgY2xhc3MgdXNlLiBXZSBhbmFseXNlIGRhdGEgb24gUmV0YWlsIGNvbnN1bXB0aW9uLCBmcm9tIEphbnVhcnkvMjAwMCB0byBub3dhZGF5cy4gDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclZCAlQiAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdGhlbWU6IGRlZmF1bHQNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogbm8NCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQ0KLS0tDQoNCmBgYHtyIGtuaXRyX2luaXQsIGVjaG89RkFMU0UsIGNhY2hlPUZBTFNFfQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkocm1hcmtkb3duKQ0KbGlicmFyeShybWRmb3JtYXRzKQ0KDQojIyBHbG9iYWwgb3B0aW9ucw0Kb3B0aW9ucyhtYXgucHJpbnQ9IjEwMCIpDQpvcHRzX2NodW5rJHNldChlY2hvPVRSVUUsDQoJICAgICAgICAgICAgIGNhY2hlPUYsDQogICAgICAgICAgICAgICBwcm9tcHQ9RkFMU0UsDQogICAgICAgICAgICAgICB0aWR5PVRSVUUsDQogICAgICAgICAgICAgICBjb21tZW50PU5BLA0KICAgICAgICAgICAgICAgbWVzc2FnZT1GQUxTRSwNCiAgICAgICAgICAgICAgIHdhcm5pbmc9RkFMU0UpDQpvcHRzX2tuaXQkc2V0KHdpZHRoPTEwMCkNCmBgYA0KDQojIExpY2Vuw6dhIHsjTGljZW7Dp2EgLnVubnVtYmVyZWR9DQoNClRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIFRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgbGljZW5zZSwgdmlzaXQgPGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8+IG9yIHNlbmQgYSBsZXR0ZXIgdG8gQ3JlYXRpdmUgQ29tbW9ucywgUE8gQm94IDE4NjYsIE1vdW50YWluIFZpZXcsIENBIDk0MDQyLCBVU0EuDQoNCiFbTGljZW5zZTogQ0MgQlktU0EgNC4wXShodHRwczovL21pcnJvcnMuY3JlYXRpdmVjb21tb25zLm9yZy9wcmVzc2tpdC9idXR0b25zLzg4eDMxL3BuZy9ieS1zYS5wbmcpe3dpZHRoPSIyNSUifQ0KDQojIENpdGHDp8OjbyB7I0NpdGHDp8OjbyAudW5udW1iZXJlZH0NCg0KU3VnZXN0w6NvIGRlIGNpdGHDp8OjbzogRklHVUVJUkVETywgQWRyaWFubyBNYXJjb3MgUm9kcmlndWVzLiBTw6lyaWVzIFRlbXBvcmFpcyBjb20gUjogQW7DoWxpc2UgZG8gQ29uc3VtbyBkbyBWYXJlam8gZW0gTVMuIENhbXBvIEdyYW5kZS1NUyxCcmFzaWw6IFJTdHVkaW8vUnB1YnMsIDIwMTkuIERpc3BvbsOtdmVsIGVtIDxodHRwOi8vcnB1YnMuY29tL2Ftcm9maS9hcmltYV92YXJlam9tcz4uDQoNCiMgSW50cm9kdcOnw6NvDQoNCk5lc3RlIGFycXVpdm8gdXRpbGl6byBhIHPDqXJpZSBkbyDDjW5kaWNlIGRlIHZvbHVtZSBkZSB2ZW5kYXMgbm8gdmFyZWpvIFRvdGFsIGRlIE1hdG8gR3Jvc3NvIGRvIFN1bCwgc8OpcmllIG1lbnNhbCBhIHBhcnRpciBkZSBqYW4vMjAwMCBhdMOpIGp1bC8yMDE5IG9idGlkYSBjb20gbyBwYWNvdGUgYEJFVFNgIGUgaW1wb3J0YWRhIGRvIEJhbmNvIENlbnRyYWwgZG8gQnJhc2lsLiBQb3J0YW50bywgc8OjbyAyMzUgb2JzZXJ2YcOnw7VlcyBtZW5zYWlzLg0KDQpDb25mb3JtZSBIeW5kbWFuIGUgQXRoYW5hc29wb3Vsb3MgKDIwMTgpLCBzZSBjb21iaW5hcm1vcyBhIGRpZmVyZW5jaWHDp8OjbyBjb20gYXV0b3JlZ3Jlc3PDo28gZSB1bSBtb2RlbG8gZGUgbcOpZGlhIG3Ds3ZlbCwgb2J0ZXJlbW9zIHVtIG1vZGVsbyBBUklNQSBuw6NvIHNhem9uYWwuIEFSSU1BIMOpIHVtIGFjcsO0bmltbyBwYXJhIE3DqWRpYSBNw7N2ZWwgSW50ZWdyYWRhIEF1dG9SZWdyZXNzaXZhIChuZXN0ZSBjb250ZXh0bywgImludGVncmHDp8OjbyIgw6kgbyBpbnZlcnNvIGRhIGRpZmVyZW5jaWHDp8OjbykuIE8gbW9kZWxvIGNvbXBsZXRvIHBvZGUgc2VyIGVzY3JpdG8gY29tbyANCiQkDQpcYmVnaW57ZXF1YXRpb259DQogIHknX3t0fSA9IGMgKyBccGhpX3sxfXknX3t0LTF9ICsgXGNkb3RzICsgXHBoaV97cH15J197dC1wfQ0KICAgICArIFx0aGV0YV97MX1cdmFyZXBzaWxvbl97dC0xfSArIFxjZG90cyArIFx0aGV0YV97cX1cdmFyZXBzaWxvbl97dC1xfSArIFx2YXJlcHNpbG9uX3t0fSwgIFx0YWd7MS4xfQ0KXGVuZHtlcXVhdGlvbn0NCiQkDQogICAgDQogICAgDQpvbmRlICR5J197dH0kIMOpIGEgc8OpcmllIGRpZmVyZW5jaWFkYSAocG9kZSB0ZXIgc2lkbyBkaWZlcmVuY2lhZGEgbWFpcyBkZSB1bWEgdmV6KS4gT3MgInByZWRpdG9yZXMiIG5vIGxhZG8gZGlyZWl0byBpbmNsdWVtIHZhbG9yZXMgZGVmYXNhZG9zIGRlICR5J197dH0kIGFzc2ltIGNvbW8gZXJyb3MgZGVmYXNhZG9zLiBDaGFtYW1vcyBpc3NvIGRlIG1vZGVsbyBBUklNQShwLGQscSksIGVtIHF1ZSBwIMOpIGEgb3JkZW0gZGEgcGFydGUgYXV0b3JlZ3Jlc3NpdmEgKEFSKHApKTsgZCDDqSBhIG9yZGVtIGRlIGRpZmVyZW5jaWHDp8OjbyBlbnZvbHZpZGEgKEkoZCkpOyBxIMOpIGEgb3JkZW0gZGEgcGFydGUgZGEgbcOpZGlhIG3Ds3ZlbCAoTUEocSkpLg0KDQojIERhZG9zDQoNCkZhcmVpIGRlIGR1YXMgZm9ybWFzIHBhcmEgbyBsZWl0b3IuIFVtYSBjYXJyZWdhIGRpcmV0byBkbyBzaXRlIGRvIEJhbmNvIENlbnRyYWwgZG8gQnJhc2lsIGNvbSBvIHBhY290ZSBgQkVUU2AgKEZFUlJFSVJBLCBTUEVSQU5aQSBlIENPU1RBLCAyMDE4KSBlIGEgb3V0cmEgZXUgZ2VyZWkgYSBlc3RydXR1cmEgaWTDqm50aWNhIHBlbGEgZnVuw6fDo28gYGRwdXQoKWAgcGFyYSBvcyBsZWl0b3JlcyBxdWUgbsOjbyBjb25zZWd1aXJlbSBwb3IgcXVhbHF1ZXIgbW90aXZvIG8gYWNlc3NvIGFvIHNpdGUgZG8gQmFuY28gQ2VudHJhbCAoYXMgdmV6ZXMgdmVqbyBpc3NvIG9jb3JyZXIgZGVwZW5kZW5kbyBkb3MgYmxvcXVlaW9zIGRhIHN1YSByZWRlIGRlIGludGVybmV0KS4gQSBmb3JtYSBwZWxvIGRwdXQgYXNzdW1lIG8gbm9tZSB2YXJlam9tczIgZW5xdWFudG8gYSBleHRyYcOtZGEgcGVsbyBCRVRTIHRlbSBub21lIHZhcmVqb21zLiBFc2NsYXJlw6dvIGFvIGxlaXRvciBxdWUgYXDDs3MgYmFpeGFyIGEgc8OpcmllIHBlbG8gQkVUUywgZml6IG8gZHB1dCBlIGEgcGFydGlyIGRlIGVudMOjbywgZGVzYWJpbGl0ZWkgbyBibG9jbyAoYENodW5rYCkgcXVlIGFjZXNzYSBvIEJFVFMgYXBlbmFzIHBhcmEgYWdpbGl6YXIgb3MgY8OhbGN1bG9zLg0KDQogICAgbGlicmFyeShCRVRTKQ0KICAgICMgUGVnYW5kbyBhcyBzw6lyaWVzIGEgcGFydGlyIGRvIHNpdGUgZG8gQmFuY28gQ2VudHJhbCBkbyBCcmFzaWwNCiAgICAjIMONbmRpY2UgZGUgdm9sdW1lIGRlIHZlbmRhcyBubyB2YXJlam8gVG90YWwgZGUgTWF0byBHcm9zc28gZG8gU3VsDQogICAgIyBtZW5zYWwgYSBwYXJ0aXIgZGUgamFuLzIwMDAgYXTDqSBqdWwvMjAxOSANCiAgICAjIDIzNSBvYnNlcnZhw6fDtWVzIG1lbnNhaXMNCiAgICB2YXJlam9tcyA8LSBCRVRTZ2V0KDE0NzkpIA0KICAgIHByaW50KHZhcmVqb21zKQ0KICAgIGNsYXNzKHZhcmVqb21zKQ0KICAgIGRwdXQodmFyZWpvbXMpICAjIG9ww6fDo28gcGFyYSB0ZXIgb3MgZGFkb3MgY29tbyBuYSBzdHJ1Y3R1cmUgYWJhaXhvDQoNCiAgICANCiAgICANCmBgYHtyIGRhZG9zLCB3YXJuaW5nPUZBTFNFLCBjb21tZW50PUZBTFNFfQ0Kc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KHJlYWR4bCkpO3N1cHByZXNzTWVzc2FnZXMobGlicmFyeShmb3JlaWduKSkNCnN1cHByZXNzTWVzc2FnZXMobGlicmFyeShkeW5sbSkpO3N1cHByZXNzTWVzc2FnZXMobGlicmFyeShjYXIpKQ0Kc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KGxtdGVzdCkpO3N1cHByZXNzTWVzc2FnZXMobGlicmFyeShzYW5kd2ljaCkpDQpzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkoZnBwMikpO3N1cHByZXNzTWVzc2FnZXMobGlicmFyeSh0c2VyaWVzKSkNCnN1cHByZXNzTWVzc2FnZXMobGlicmFyeSh6b28pKTtzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkoZm9yZWNhc3QpKQ0Kc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KGdncGxvdDIpKQ0KIyBQZWdhbmRvIGFzIHPDqXJpZXMgYSBwYXJ0aXIgZG8gc2l0ZSBkbyBCYW5jbyBDZW50cmFsIGRvIEJyYXNpbA0KIyDDjW5kaWNlIGRlIHZvbHVtZSBkZSB2ZW5kYXMgbm8gdmFyZWpvIFRvdGFsIGRlIE1hdG8gR3Jvc3NvIGRvIFN1bA0KIyBtZW5zYWwgYSBwYXJ0aXIgZGUgamFuLzIwMDAgYXTDqSBqdWwvMjAxOSANCiMgTG9hZGluZyB0aGUgZGF0YXNldA0KIyBsaWJyYXJ5KHJlYWR4bCkNCiMgZGFkb3MgPC0gcmVhZF9leGNlbCgiZGFkb3MueGxzeCIsc2hlZXQgPSAiZGFkb3MiKQ0KIyBhdHRhY2goZGFkb3MpDQpsaWJyYXJ5KEJFVFMpDQoNCiMgUGVnYW5kbyBhcyBzw6lyaWVzIGEgcGFydGlyIGRvIHNpdGUgZG8gQmFuY28gQ2VudHJhbCBkbyBCcmFzaWwNCiMgw41uZGljZSBkZSB2b2x1bWUgZGUgdmVuZGFzIG5vIHZhcmVqbyBUb3RhbCBkZSBNYXRvIEdyb3NzbyBkbyBTdWwNCiMgbWVuc2FsIGEgcGFydGlyIGRlIGphbi8yMDAwIGF0w6kganVsLzIwMTkgKGVtIDEyLjA5LjIwMTkpDQoNCiN2YXJlam9tcyA8LSBCRVRTZ2V0KDE0NzkpIA0KDQp2YXJlam9tczwtIHN0cnVjdHVyZShjKDM1LjIsIDM1LjYsIDM5LjIsIDQwLjUsIDQxLjYsIDQwLjQsIDQwLjgsIDM4LjcsIDM3LjMsIA0KMzcuNiwgMzUuNiwgNDcuNCwgMzQuMiwgMzIuMiwgMzgsIDM3LjUsIDM4LjgsIDM1LCAzOC40LCA0MC4yLCANCjM4LjIsIDM5LjMsIDM2LCA0Ni4zLCAzNi40LCAzNCwgMzksIDM3LjgsIDM4LjksIDM1LjMsIDM3LjIsIDM4LjEsIA0KMzUuNiwgMzguMywgMzUuNiwgNDUuNywgMzIuMiwgMzEuNiwgMzUuMiwgMzYuOCwgMzcuNSwgMzQuOCwgMzguNCwgDQozOC4xLCAzNywgMzksIDM3LjMsIDQ5LCAzNS44LCAzNS4zLCA0MC4yLCA0MS4zLCA0My45LCA0MS42LCA0NS45LCANCjQyLjMsIDQyLjIsIDQ0LCA0MS4zLCA1Ni45LCAzOC41LCAzOC41LCA0NS4zLCA0My42LCA0Ni4yLCA0NC4zLCANCjQ3LjUsIDQ2LjUsIDQ2LjQsIDQ2LCA0NC4xLCA2MSwgNDIsIDQwLjIsIDQ0LjYsIDQ0LjUsIDQ3LjgsIDQ1LjMsIA0KNDYuNSwgNDguNSwgNDcuNywgNTAuMiwgNDkuMywgNjQuNSwgNDcsIDQ2LjgsIDUxLCA1MC41LCA1NSwgNTEuMywgDQo1Mi44LCA1NS4zLCA1NC44LCA1NS42LCA1NS4zLCA3Mi4yLCA1NC41LCA1Mi4xLCA1Ni4yLCA1Ny4yLCA2MC44LCANCjU2LjEsIDYxLjgsIDYxLjYsIDU5LjgsIDYzLjMsIDU3LjcsIDc3LjQsIDYxLjQsIDUxLjksIDU3LjMsIDU3LjksIA0KNjEuOSwgNTcuMywgNjEuMSwgNjEuMSwgNjAuNiwgNjUuNiwgNjMuNSwgODMuMSwgNjQuMSwgNjAuMiwgNjcuOCwgDQo2Ny4xLCA3Mi44LCA2OC41LCA3MS4xLCA2OS4zLCA2OS45LCA3MS4xLCA2Ny45LCA5Mi43LCA2Ny41LCA2NC44LCANCjY5LjEsIDY5LjQsIDc5LjYsIDcwLjIsIDczLjgsIDcyLjUsIDcxLjMsIDc1LjYsIDc0LjcsIDEwMC44LCANCjc5LjUsIDc1LjcsIDgyLjQsIDc4LCA4NC44LCA4My4yLCA4NC44LCA4OC41LCA4Ni4zLCA5MS43LCA5Mi44LCANCjExMS40LCA5Mi44LCA4My43LCA5Mi41LCA4OC4zLCA5My45LCA4OC44LCA5NiwgOTUuOSwgOTMuMiwgOTguMywgDQoxMDAuNSwgMTI4LjgsIDk3LjIsIDkwLjIsIDk0LjMsIDk0LjQsIDEwMS4xLCA5MiwgOTYuNCwgOTguMiwgDQo5Ny42LCAxMDUuOCwgMTAzLjEsIDEyOS42LCA5OS42LCA4Ny44LCA5NywgOTQuOCwgOTguNiwgOTMuNCwgDQo5OC40LCA5Ni40LCA5Mi41LCAxMDAuNiwgOTcuMiwgMTI0LjUsIDkxLjUsIDg1LjEsIDkxLjYsIDg4LjUsIA0KOTIuMiwgODcuNCwgOTAuNSwgODguMSwgODUuMiwgODkuNCwgOTMuNCwgMTE2LjksIDkwLjgsIDg0LCA4OS43LCANCjg2LjMsIDkwLCA4Ny4zLCA5MC44LCA5My41LCA5My43LCA5MS40LCA5My41LCAxMTQuMSwgODcuOCwgODEuMSwgDQo5NC41LCA4My4yLCA4OS45LCA4OC44LCA4OS4zLCA5My43LCA5My41LCA5Ni4zLCAxMDEuMywgMTE4LjMsIA0KOTMuOCwgODUuMiwgOTAsIDg2LjYsIDkwLCA4NS4yLCA5MC45KSwgLlRzcCA9IGMoMjAwMCwgMjAxOS41LCANCjEyKSwgY2xhc3MgPSAidHMiKQ0KDQpgYGANCg0KQSByb3RpbmEgZGUgZGFkb3Mgb2J0aWRvcyBwZWxvIEJFVFMgasOhIHJldG9ybmEgYSBzw6lyaWUgZW0gZm9ybWF0byBgdHNgLCBvdSBzZWphLCBzw6lyaWUgdGVtcG9yYWwuIEZhcmVpIGVudMOjbyBhIGNyaWHDp8OjbyBkZSB1bWEgc8OpcmllIGVtIGRpZmVyZW7Dp2FzIHBhcmEgb2JzZXJ2YXIgbyBjb21wb3J0YW1lbnRvIGRhIHPDqXJpZSBlbSBuw612ZWwgZSBlbSBkaWZlcmVuw6dhcy4NCg0KSW5pY2lhbG1lbnRlIG9saGFyZWkgYXMgZXN0YXTDrXN0aWNhcyBkZXNjcml0aXZhcyBkYSBzw6lyaWUuIEVtIHNlZ3VpZGEgZmFyZWkgdW0gcGxvdCBiw6FzaWNvIGRhIHPDqXJpZSBlIG8gcGxvdCBwZWxvIHBhY290ZSBgZHlncmFwaHNgLCDDunRpbCBwYXJhIHZlciBvcyBwb250b3MgZGUgcGljb3MgZSBtb21lbnRvcyBlc3BlY8OtZmljb3MuDQoNCmBgYHtyIGRpZmZ9DQpkdmFyZWpvPC1kaWZmKHZhcmVqb21zKQ0KIyBlc3RhdGlzdGljYXMgYmFzaWNhcw0Kc3VtbWFyeSh2YXJlam9tcykNCiMgTWluLiAxc3QgUXUuICBNZWRpYW4gICAgTWVhbiAzcmQgUXUuICAgIE1heC4gDQojIDMxLjYwICAgNDQuMDUgICA2NC41MCAgIDY3LjI4ICAgOTAuMDAgIDEyOS42MCANCg0KIyBwbG90IGJhc2ljbw0KIyBsZW1icmFyIHF1ZSBlbSBjbGFzcygpLCBlbGUgasOhIGluZGljb3UgcXVlIGVyYSB0cyA9IHNlcmllIHRlbXBvcmFsDQpwbG90KHZhcmVqb21zKSANCiMgcGVsbyBwYWNvdGUgZHlncmFwaCBkw6EgbWFpcyBvcMOnw7Vlcw0KbGlicmFyeShkeWdyYXBocyk7bGlicmFyeShodG1sd2lkZ2V0cykNCmR5Z3JhcGgodmFyZWpvbXMsIG1haW4gPSAiw41uZGljZSBkZSB2b2x1bWUgZGUgdmVuZGFzIG5vIHZhcmVqbyB0b3RhbCBkZSBNYXRvIEdyb3NzbyBkbyBTdWwgPGJyPiAoTWVuc2FsKSAgKDIwMTE9MTAwKSBCQ0IgMTQ3OSIpICU+JQ0KICBkeUF4aXMoIngiLCBkcmF3R3JpZCA9IFRSVUUpICU+JQ0KICBkeUV2ZW50KCIyMDA1LTEtMDEiLCAiMjAwNSIsIGxhYmVsTG9jID0gImJvdHRvbSIpICU+JQ0KICBkeUV2ZW50KCIyMDE1LTEtMDEiLCAiMjAxNSIsIGxhYmVsTG9jID0gImJvdHRvbSIpICU+JQ0KICBkeUV2ZW50KCIyMDE4LTEtMDEiLCAiMjAxOCIsIGxhYmVsTG9jID0gImJvdHRvbSIpICU+JQ0KICBkeUV2ZW50KCIyMDE5LTEtMDEiLCAiMjAxOSIsIGxhYmVsTG9jID0gImJvdHRvbSIpICU+JQ0KICBkeU9wdGlvbnMoZHJhd1BvaW50cyA9IFRSVUUsIHBvaW50U2l6ZSA9IDIpDQpgYGANCg0Kw4kgcG9zc2l2ZWwgdmlzdWFsaXphciBub3MgcGxvdHMgYWNpbWE6IHNhem9uYWxpZGFkZSAocG9yIGV4ZW1wbG8sIHBpY29zIGVtIGRlemVtYnJvIGRlIGNhZGEgYW5vKTsgYSB0ZW5kw6puY2lhIGFwYXJlbnRlbWVudGUgY3Jlc2NlbnRlIGF0w6kgMjAxNCBlIGRlY3Jlc2NlIGNvbSBhICJjcmlzZSIgYnJhc2lsZWlyYTsgZSB1bWEgYXBhcmVudGUgbsOjby1lc3RhY2lvbmFyaWVkYWRlIChtw6lkaWEgZSB2YXJpw6JuY2lhIG11ZGFtIG5vIHRlbXBvKS4gTWFpcyBhIGZyZW50ZSwgYXBsaWNhcmVpIG8gdGVzdGUgZGUgcmFpeiB1bml0w6FyaWEgbmEgc8OpcmllIHBhcmEgYXZhbGlhciBhIGVzdGFjaW9uYXJpZWRhZGUgZGUgbW9kbyBtYWlzIGV4cGzDrWNpdG8uDQoNCiMgQW7DoWxpc2UgZGEgc8OpcmllDQoNClVtYSByZXNzYWx2YSBkZXZlIHNlciBmZWl0YSwgcXVlIG5vIHByZXNlbnRlIGV4ZXJjw61jaW8sIG7Do28gZmFyZWkgYSBkaXZpc8OjbyBlbnRyZSBhbW9zdHJhIHRlc3RlIGUgYW1vc3RyYSB0cmVpbm8sIGRlIG1vZG8gcXVlIHVzYXJlaSBhIHPDqXJpZSB0b2RhIHBhcmEgb3MgYWp1c3Rlcy4gTyBsZWl0b3IgZGV2ZSBlbSBnZXJhbCBmYXplciBlc3RhcyBkaXZpc8O1ZXMgcGFyYSBjZXJ0aWZpY2FyIGRlIHF1ZSBvIG1vZGVsbyDDqSB1bSBib20gcHJlZGl0b3IuDQoNCkdlcmFsbWVudGUsIG7Do28gw6kgcG9zc8OtdmVsIGRpemVyIG9saGFuZG8gbyBncsOhZmljbyBkZSB0ZW1wbywgcXVhaXMgdmFsb3JlcyBkZSBsYWdzIHAgZSBxIHNlcsOjbyBhcHJvcHJpYWRvcyBwYXJhIG9zIGRhZG9zLiDDgHMgdmV6ZXMsIMOpIHBvc3PDrXZlbCB1c2FyIG8gZ3LDoWZpY28gQUNGIGUgbyBncsOhZmljbyBQQUNGIHBhcmEgZGV0ZXJtaW5hciB2YWxvcmVzIGFwcm9wcmlhZG9zIHBhcmEgcCBlIHEuIEEgcHJpbWVpcmEgYW7DoWxpc2UgaW5kaWNhIG9saGFyIG9zIGdyw6FmaWNvcyAoY29ycmVsb2dyYW1hcykgZGEgRnVuw6fDo28gZGUgQXV0b2NvcnJlbGHDp8OjbyAoRkFDLCBlbSBwb3J0dWd1w6pzLCBvdSBBQ0YgZW0gaW5nbMOqcykgZSBBdXRvY29ycmVsYcOnw6NvIHBhcmNpYWwgKEZBQ3AsIGVtIHBvcnR1Z3XDqnMsIG91IFBBQ0YgZW0gaW5nbMOqcykuDQoNCnVtIGdyw6FmaWNvIEZBQyBtb3N0cmEgYXMgYXV0b2NvcnJlbGHDp8O1ZXMgcXVlIG1lZGVtIGEgcmVsYcOnw6NvIGVudHJlXA0KJHlfdCQgZSAkeV97dC1rfSQgcGFyYSBkaWZlcmVudGVzIHZhbG9yZXMgZGUgay4gQWdvcmEsIHNlICR5X3QkIGUgJHlfe3QtMX0kIGVzdMOjbyBjb3JyZWxhY2lvbmFkb3MsIGVudMOjbyAkeV97dH0kIGUgJHlfe3QtMn0kIHRhbWLDqW0gZGV2ZSBzZXIgY29ycmVsYWNpb25hZG8uIE1hcyBpc3NvIHBvZGUgc2VyIHBvcnF1ZSBhbWJvcyBlc3TDo28gY29ycmVsYWNpb25hZG9zIGNvbSAkeV97dC0xfSQuIFBhcmEgZXZpdGFyIGVzc2FzICJpbnRlcmZlcsOqbmNpYXMiIMOpIHF1ZSBzZSBmYXogYSBGQUNwLiBBcyBhdXRvY29ycmVsYcOnw7VlcyBwYXJjaWFpcyBuYSBGQUNwIG1lZGVtIGEgcmVsYcOnw6NvIGVudHJlICR5X3QkIGUgJHlfe3Qta30kIGRlcG9pcyBkZSByZW1vdmVyIG9zIGVmZWl0b3MgZG9zIGxhZ3MgMSwgMiwgMywgLi4uICwgKGstMSkuIFBvcnRhbnRvLCBhIHByaW1laXJhIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbCDDqSBpZMOqbnRpY2Egw6AgcHJpbWVpcmEgYXV0b2NvcnJlbGHDp8OjbywgcG9ycXVlIG7Do28gaMOhIG5hZGEgZW50cmUgZWxhcyBwYXJhIHJlbW92ZXIuIENhZGEgYXV0b2NvcnJlbGHDp8OjbyBwYXJjaWFsIHBvZGUgc2VyIGVzdGltYWRhIGNvbW8gbyDDumx0aW1vIGNvZWZpY2llbnRlIGVtIHVtIG1vZGVsbyBhdXRvcmVncmVzc2l2by4gSXN0byBwb2RlIHNlciBvYnRpZG8gY29tIGFzIGZ1bsOnw7VlcyBgYWNmYCBlIGBwYWNmYCwgb3UgdXNhbmRvIGFzIGZ1bsOnw7VlcyBgZ2dBY2ZgIGUgYGdnUGFjZmAgZG8gcGFjb3RlIGBmb3JlY2FzdGAuIEZhcmVtb3MgbyBtZXNtbyBwcm9jZWRpbWVudG8gcGFyYSBhIHPDqXJpZSBlbSBuw612ZWwgZSBwYXJhIGEgc8OpcmllIGVtIHByaW1laXJhIGRpZmVyZW7Dp2EuDQoNCiMjIEZ1bsOnw6NvIGRlIEF1dG9jb3JyZWxhw6fDo28gKEZBQykgZSBBdXRvY29ycmVsYcOnw6NvIHBhcmNpYWwgKEZBQ3ApIGNvbSBkZWZhc2FnZW0gMzYNCg0KIyMjIFPDqXJpZSBlbSBuw612ZWwNCg0KVXNhcmVpIGEgcm90aW5hIGRvIEh5bmRtYW4gZSBBdGhhbmFzb3BvdWxvcyAoMjAxOCkuDQoNCmBgYHtyIHBsb3R9DQpyZXF1aXJlKGZvcmVjYXN0KQ0KdmFyZWpvPC12YXJlam9tcw0KdmFyZWpvICU+JSBnZ3RzZGlzcGxheShtYWluPSIiKQ0KYGBgDQoNCk5lc3RlIGNhc28sIG8gYGdndHNkaXNwbGF5YCBkbyBwYWNvdGUgYGZvcmVjYXN0YCBqw6EgcmV0b3JuYSBvcyBncsOhZmljb3MgZGEgc8OpcmllLCBlIHJlc3BlY3RpdmFzIEFDRiBlIFBBQ0YuDQoNCiMjIyBTw6lyaWUgZW0gcHJpbWVpcmEgZGlmZXJlbsOnYQ0KDQpDb21vIGEgc8OpcmllIGFwcmVzZW50YSB2YXJpYcOnw7VlcyBzYXpvbmFpcyBpbXBvcnRhbnRlcywgYXNzaW0gY29tbyB0ZW5kw6puY2lhIGltcG9ydGFudGUsIGNsYXJhbWVudGUgbsOjby1lc3RhY2lvbsOhcmlhcywgdm91IG9saGFyIHRhbWLDqW0gZW0gcHJpbWVpcmEgZGlmZXJlbsOnYS4NCg0KYGBge3IgZGlmZl9nZ3RzZGlzcGxheX0NCnZhcmVqbyAlPiUgZGlmZigpICU+JSBnZ3RzZGlzcGxheShtYWluPSJTw6lyaWUgdmFyZWpvIGRlIE1TIGVtIHByaW1laXJhIGRpZmVyZW7Dp2EiKQ0KYGBgDQoNCiMjIyBQcmltZWlyYSBkaWZlcmVuw6dhIHNhem9uYWwgZSBBQ0YgZSBQQUNGDQoNCkZhcmVpIGFnb3JhIGEgZGlmZXJlbsOnYSBzYXpvbmFsLg0KDQpgYGB7ciBkaWZmdmFyZWpvfQ0KdmFyZWpvICU+JSBkaWZmKGxhZz0xMikgJT4lIGdndHNkaXNwbGF5KG1haW49IlPDqXJpZSB2YXJlam8gZGUgTVMgZW0gcHJpbWVpcmEgZGlmZXJlbsOnYSBzYXpvbmFsIikgIA0KYGBgDQoNCiMjIyBBanVzdGUgc2F6b25hbCBlIEFDRiBlIFBBQ0YNCg0KQXBsaWNhcmVtb3MgbyBhanVzdGUgc2F6b25hbCB0aXBvIFNUTCAoU2Vhc29uYWwgRGVjb21wb3NpdGlvbiBvZiBUaW1lIFNlcmllcyBieSBMb2VzcykgYW9zIGRhZG9zLg0KDQpgYGB7ciBzZWFzYWRqfQ0KbGlicmFyeShmcHAyKQ0KdmFyZWpvICU+JSBzdGwocy53aW5kb3c9J3BlcmlvZGljJykgJT4lIHNlYXNhZGooKSAtPiB2YXJlam9hZGoNCmF1dG9wbG90KHZhcmVqb2FkaikNCmBgYA0KDQpFIGFnb3JhIG9zIHBsb3RzIGRlIEFDRiBlIFBBQ0YgbmEgc8OpcmllIGFqdXN0YWRhIHNhem9uYWxtZW50ZS4NCg0KYGBge3IgdmFyZWpvYWRqfQ0KdmFyZWpvYWRqICU+JSBkaWZmKCkgJT4lIGdndHNkaXNwbGF5KG1haW49IlPDqXJpZSB2YXJlam8gZGUgTVMgZW0gcHJpbWVpcmEgZGlmZXJlbsOnYSBlIGFqdXN0ZSBzYXpvbmFsIikNCmBgYA0KDQpQYXJlY2UgaW5kaWNhciBwYXJhIGFsZ3VtIEFSIGRlIG9yZGVtIDQgbmEgUEFDRiwgYWxndW1hIHNhem9uYWxpZGFkZSBtYXJjYW50ZSBuYSBBQ0YgKGluZGljYW5kbyB1bSB0ZXJtbyBTTUEpLCBlIGluZGljYWNhbyBkZSB1bSBBUklNQSAoNCwxLDEpKDAsMSwxKVsxMl0uDQoNClVtYSBlc3RpbWHDp8OjbyBpbmljaWFsIGRlc3NlIG1vZGVsbyBkYXJpYSBhbGdvIGNvbW8NCg0KYGBge3IgZml0fQ0KKGZpdCA8LSBBcmltYSh2YXJlam9hZGosIG9yZGVyPWMoNCwxLDEpLHNlYXNvbmFsID0gYygwLCAxLCAxKSkpDQpgYGANCg0Kw4kgcG9zc8OtdmVsIG9ic2VydmFyIG9zIEFJQ2MgPSAxMDQ2LjAzLCBzdXNwZWl0YXIgZGEgbsOjbyBzaWduaWZpY8OibmNpYSBkZSBhcjMgZSBvbGhhciBvcyByZXPDrWR1b3MuIEEgZnVuw6fDo28gYGF1dG9wbG90YCByZXRvcm5hIG8gY8OtcmN1bG8gdW5pdMOhcmlvIGUgYXMgcmHDrXplcyB1bml0w6FyaWFzIGRlc3RhIGVzdGltYcOnw6NvLCBlbnF1YW50byBhIGBjaGVja3Jlc2lkdWFsc2AgZm9ybmVjZSBvcyBjb3JyZWxvZ3JhbWFzIHJlc2lkdWFpcy4NCg0KTyBjw61yY3VsbyB1bml0w6FyaW8gaW5kaWNhIGVzdGFiaWxpZGFkZSBkYXMgcmHDrXplcyB1bml0w6FyaWFzIGRvIG1vZGVsbywgZW5xdWFudG8gbyBManVuZy1Cb3ggcmV0b3JuYSBhIG7Do28tcmVqZWnDp8OjbyBkZSBIMCBkZSBxdWUgb3MgcGFyw6JtZXRyb3MgZGUgYXV0b2NvcnJlbGHDp8OjbyByZXNpZHVhbCBzw6NvIG51bG9zIChyZXRvcm5hIHVtIGdyYW5kZSB2YWxvciBwLCBzdWdlcmluZG8gdGFtYsOpbSBxdWUgb3MgcmVzw61kdW9zIHPDo28gcnXDrWRvIGJyYW5jbykuIE8gZ3LDoWZpY28gQUNGIGRvcyByZXPDrWR1b3MgZG8gbW9kZWxvIEFSSU1BICg0LDEsMSkoMCwxLDEpWzEyXSBtb3N0cmEgcXVlIHRvZGFzIGFzIGF1dG9jb3JyZWxhw6fDtWVzIGVzdMOjbyBkZW50cm8gZG9zIGxpbWl0ZXMgw6AgZXhjZcOnw6NvIGRlIHVtIGxhZyAyMywgaW5kaWNhbmRvIHF1ZSBvcyByZXPDrWR1b3MgZXN0w6NvIHNlIGNvbXBvcnRhbmRvIGNvbW8gcnXDrWRvIGJyYW5jby4NCg0KYGBge3IgTEJRcGxvdH0NCmF1dG9wbG90KGZpdCkNCmNoZWNrcmVzaWR1YWxzKGZpdCkNCmxpYnJhcnkoRml0QVIpICAjIHByYXRpY28gcGFyYSBwbG90YXIgZ3JhZmljb3MgZGUgUQ0KI0xCUVBsb3QocmVzLCBsYWcubWF4ID0gMzApDQojIyMgcmVzIMOpIGEgc8OpcmllIHF1ZSB0ZW1vcyBpbnRlcmVzc2UgZGUgcmVhbGl6YXIgb3MgdGVzdGVzDQojIyMgbGFnLm1heCDDqSBvIG7Dum1lcm8gZGUgbGFncyBxdWUgc2UgZGVzZWphIGltcHJpbWlyIG8gZ3LDoWZpY28NCkxCUVBsb3QocmVzaWR1YWxzKGZpdCksMzYpDQojIEFsdGVybmF0aXZhIHBlbG8gTFNUUw0KbGlicmFyeShMU1RTKQ0KcDwtQm94LkxqdW5nLlRlc3QocmVzaWR1YWxzKGZpdCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgbGFnID0gMzYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgbWFpbiA9ICJMU1RTIExqdW5nLUJveCB0ZXN0IikNCnArDQogIGdndGhlbWVzOjp0aGVtZV9lY29ub21pc3Rfd2hpdGUoKSsNCiAgbGFicygNCiAgICB4ID0gIkxhZyA9IGsiLA0KICAgIHkgPSAiUC12YWxvciBkbyBUZXN0ZSBManVuZy1Cb3ggcGFyYSBhdMOpIGxhZyA9IGsgIiwNCiAgICB0aXRsZSA9ICJTw6lyaWUgZGUgY29uc3VtbzoiLA0KICAgIHN1YnRpdGxlID0gInZhcmVqbyBkZSBNUyIsDQogICAgY2FwdGlvbiA9ICJGb250ZTogRWxhYm9yYcOnw6NvIHByw7NwcmlhIGEgcGFydGlyIGRlIGRhZG9zIGRvIEJDQi4iDQogICkgDQpgYGANCg0KQ2hlY2FuZG8gYSBub3JtYWxpZGFkZSBkb3MgcmVzw61kdW9zLg0KDQpgYGB7ciBub3JtYWxpZGFkZX0NCiMgY2hlY2FyIG5vcm1hbGlkYWRlIGRvcyByZXPDrWR1b3MNCmxpYnJhcnkodHNlcmllcykNCmphcnF1ZS5iZXJhLnRlc3QocmVzaWR1YWxzKGZpdCkpDQpgYGANCg0KDQojIEFSSU1BDQoNClVtYSBlc3RpbWHDp8OjbyBhdXRvbWF0aXphZGEgcGVsYSBmdW7Dp8OjbyBgYXV0by5hcmltYWAge2ZvcmVjYXN0fSBwYWRyw6NvIGluZGljYSB1bSBtb2RlbG8gZGlmZXJlbnRlLg0KDQpgYGB7ciBmaXQyfQ0KZml0MiA8LSBhdXRvLmFyaW1hKHZhcmVqbykNCnN1bW1hcnkoZml0MikNCiNwLXZhbHVlcyBkb3MgY29lZmljaWVudGVzDQpwdmFsdWVzPC0oMS1wbm9ybShhYnMoZml0MiRjb2VmKS9zcXJ0KGRpYWcoZml0MiR2YXIuY29lZikpKSkqMg0KcHZhbHVlcw0KbGlicmFyeShGaXRBUikgICMgcHJhdGljbyBwYXJhIHBsb3RhciBncmFmaWNvcyBkZSBRDQpMQlFQbG90KHJlc2lkdWFscyhmaXQyKSwzNikNCiMgQWx0ZXJuYXRpdmEgcGVsbyBMU1RTDQpsaWJyYXJ5KExTVFMpDQpwMjwtQm94LkxqdW5nLlRlc3QocmVzaWR1YWxzKGZpdDIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGxhZyA9IDM2LCANCiAgICAgICAgICAgICAgICAgICAgICAgIG1haW4gPSAiTFNUUyBManVuZy1Cb3ggdGVzdCIpDQpwMisNCiAgZ2d0aGVtZXM6OnRoZW1lX2Vjb25vbWlzdF93aGl0ZSgpKw0KICBsYWJzKA0KICAgIHggPSAiTGFnID0gayIsDQogICAgeSA9ICJQLXZhbG9yIGRvIFRlc3RlIExqdW5nLUJveCBwYXJhIGF0w6kgbGFnID0gayAiLA0KICAgIHRpdGxlID0gIlPDqXJpZSBkZSBjb25zdW1vOiIsDQogICAgc3VidGl0bGUgPSAidmFyZWpvIGRlIE1TIiwNCiAgICBjYXB0aW9uID0gIkZvbnRlOiBFbGFib3Jhw6fDo28gcHLDs3ByaWEgYSBwYXJ0aXIgZGUgZGFkb3MgZG8gQkNCLiINCiAgKSANCiMgY2hlY2FyIG5vcm1hbGlkYWRlIGRvcyByZXPDrWR1b3MNCmxpYnJhcnkodHNlcmllcykNCmphcnF1ZS5iZXJhLnRlc3QocmVzaWR1YWxzKGZpdDIpKQ0KYGBgDQoNCk5lc3RlIGNhc28sIG8gbW9kZWxvIHRldmUgYSBpbmRpY2HDp8OjbyBkZSBBUklNQSgwLDEsMSkoMCwxLDEpWzEyXSwgZGlmZXJlbnRlIGRvIGFudGVyaW9yIChBUklNQSg0LDEsMSkoMCwxLDEpWzEyXSAtIGRlZmluaWRvIHBlbGEgaW50dWnDp8OjbyBkb3MgY29ycmVsb2dyYW1hcyksIGNvbW8gcmVmbGV4byBkbyBkZWZhdWx0IGRhIGZ1bsOnw6NvIGFkbWl0aXIgbGFncyBtw6F4aW1vcyBlIHByb2NlZGltZW50b3MgcXVlIHJlc3RyaW5nZW0gYSBvdGltaXphw6fDo28gZGEgZnVuw6fDo28gdmVyb3NzaW1pbGhhbsOnYS4gTyBBSUNjIGZvaSBkZSAxMDQ2LjM0LCBwb3VjbyBhY2ltYSBkbyBhbnRlcmlvciwgaW5kaWNhbmRvIGFqdXN0ZSBpbmZlcmlvciBxdWUgbyBwcmltZWlyby4NCg0KIyBNb2RlbG8gQVJJTUEgYXV0b23DoXRpY28gbWFpcyBnZXJhbA0KDQpBIHJlY29tZW5kYcOnw6NvIGRvIEh5bmRtYW4gZSBBdGhhbmFzb3BvdWxvcyAoMjAxOCksIG5lc3RhcyBzaXR1YcOnw7Vlcywgw6kgZmF6ZXIgdW0gbW9kZWxvIGBhdXRvLmFyaW1hYCBtYWlzIGdlcmFsLCBxdWUgaW52ZXN0aWd1ZSBtYWlzIHBvc3NpYmlsaWRhZGVzIGRlIG1vZGVsb3MsZmF6ZW5kbyBvcyBhcmd1bWVudG9zIGRhIGBhdXRvLmFyaW1hYCBkYSBmb3JtYSBgc3RlcHdpc2U9RkFMU0VgIGUgYGFwcHJveGltYXRpb249RkFMU0VgLiBTZSBlc3RpdmVyIHVzYW5kbyBhIHPDqXJpZSBjb20gYWp1c3RlIHNhem9uYWwgKGRlc3Nhem9uYWxpemFkYSksIHNlcsOhIGludGVyZXNzYW50ZSB1c2FyIHRhbWJlbSBvIGFyZ3VtZW50byBgc2Vhc29uYWw9RkFMU0VgLg0KDQpgYGB7ciBmaXQzfQ0KcmVxdWlyZShmcHAyKQ0KZml0MyA8LSBhdXRvLmFyaW1hKHZhcmVqb21zLHN0ZXB3aXNlPUZBTFNFLCBhcHByb3hpbWF0aW9uPUZBTFNFKQ0Kc3VtbWFyeShmaXQzKQ0KI3AtdmFsdWVzIGRvcyBjb2VmaWNpZW50ZXMNCnB2YWx1ZXM8LSgxLXBub3JtKGFicyhmaXQzJGNvZWYpL3NxcnQoZGlhZyhmaXQzJHZhci5jb2VmKSkpKSoyDQpwdmFsdWVzDQpgYGANCg0KTmVzdGUgY2Vuw6FyaW8sIGEgcm90aW5hIGBhdXRvLmFyaW1hYCBlbmNvbnRyYSBvIEFSSU1BKDQsMSwwKSgwLDEsMSlbMTJdLCBjb20gQUlDYyBkZSAxMDQ0LjE0LCBwb3J0YW50bywgbWVsaG9yIChtZW5vcikgcXVlIGFzIGR1YXMgcHJpbWVpcmFzIGVzdGltYcOnw7Vlcy4gY29tbyBpbnR1aWRvIGFudGVyaW9ybWVudGUsIGVsZSBkZXRlY3RhIG8gQVIoNCksIGEgSW50ZWdyYcOnw6NvIChJKDEpKSwgYSBpbnRlZ3Jhw6fDo28gc2F6b25hbCBlIG8gU01BKDEpLiBPIHRlcm1vIGFyMyBuw6NvIGZvaSBzaWduaWZpY2F0aXZvLCBtYXMgb3MgZGVtYWlzIGZvcmFtLg0KDQojIyMgQ2hlY2FuZG8gcmVzw61kdW9zDQoNCk9zIG1vZGVsb3MgcG9kZW0gc2VyIGNvbnNpZGVyYWRvcyB3aGl0ZSBub2lzZSwgbWFzIG7Do28gbm9ybWFpcy4NCg0KYGBge3IgY2hlY2tmaXQzfQ0KY2hlY2tyZXNpZHVhbHMoZml0MykNCnJlcXVpcmUoRml0QVIpICAjIHByYXRpY28gcGFyYSBwbG90YXIgZ3JhZmljb3MgZGUgUQ0KTEJRUGxvdChyZXNpZHVhbHMoZml0MyksMzYpDQojIEFsdGVybmF0aXZhIHBlbG8gcGFjb3RlIExTVFMNCmxpYnJhcnkoTFNUUykNCnAzPC1Cb3guTGp1bmcuVGVzdChyZXNpZHVhbHMoZml0MyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgbGFnID0gMzYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgbWFpbiA9ICJMU1RTIExqdW5nLUJveCB0ZXN0IikNCnAzKw0KICBnZ3RoZW1lczo6dGhlbWVfZWNvbm9taXN0X3doaXRlKCkrDQogIGxhYnMoDQogICAgeCA9ICJMYWcgPSBrIiwNCiAgICB5ID0gIlAtdmFsb3IgZG8gVGVzdGUgTGp1bmctQm94IHBhcmEgYXTDqSBsYWcgPSBrICIsDQogICAgdGl0bGUgPSAiU8OpcmllIGRlIGNvbnN1bW86IiwNCiAgICBzdWJ0aXRsZSA9ICJ2YXJlam8gZGUgTVMiLA0KICAgIGNhcHRpb24gPSAiRm9udGU6IEVsYWJvcmHDp8OjbyBwcsOzcHJpYSBhIHBhcnRpciBkZSBkYWRvcyBkbyBCQ0IuIg0KICApIA0KIyBjaGVjYXIgbm9ybWFsaWRhZGUgZG9zIHJlc8OtZHVvcw0KcmVxdWlyZSh0c2VyaWVzKQ0KamFycXVlLmJlcmEudGVzdChyZXNpZHVhbHMoZml0MykpDQpgYGANCg0KUG9kZS1zZSBmYXplciBvIGdyw6FmaWNvIGRvcyBmb3JlY2FzdHMgZGVzdGUgbW9kZWxvOg0KDQpgYGB7ciBwbG90Zml0M30NCmF1dG9wbG90KGZvcmVjYXN0KGZpdDMsaD0yNCksDQogICAgICAgICB0aXRsZSA9IkZvcmVjYXN0cyBkZSB2b2x1bWUgZGUgdmVuZGFzIG5vIHZhcmVqbyB0b3RhbCBkZSBNYXRvIEdyb3NzbyBkbyBTdWwiLA0KICAgICAgICAgeGxhYiA9ICJBbm8iLCB5bGFiID0gIsONbmRpY2UgKDIwMTE9MTAwKSINCiAgICAgICAgICkNCmBgYA0KDQojIyMgVGVzdGUgZGUgcmFpeiB1bml0w6FyaWENCg0KTyB0ZXN0ZSBkZSByYWl6IHVuaXTDoXJpYSBkZXZlcmlhIHNlciBmZWl0byBhbnRlcyBkZSByb2RhciBvIEFSSU1BLCBhIGZpbSBkZSBpbnZlc3RpZ2FyIGUvb3UgY29uZmlybWFyIGEgbsOjby1lc3RhY2lvbmFyaWVkYWRlIGRhIHPDqXJpZSwgcXVlIGZvaSBpbnR1aWRhIGEgcGFydGlyIGRhIEFDRiBlIFBBQ0YuIEEgcm90aW5hIGBhdXRvLmFyaW1hYCBqw6EgZmF6IGVzc2UgdGVzdGUgZW0gc2V1IHByb2Nlc3NvLiBFeGlzdGVtIGRpZmVyZW50ZXMgdGVzdGVzIGRlIHJhaXogdW5pdMOhcmlhIHBvc3PDrXZlaXMgKEFERiwgUFAsIEtQU1MpIGFzc2ltIGNvbW8gZGlmZXJlbnRlcyB0ZXN0ZXMgcGFyYSBhIHNhem9uYWxpZGFkZS4NCg0KIyMjIyBUZXN0ZSBBREYNCg0KTyB0ZXN0ZSBkZSBEaWNrZXktRnVsbGVyIGF1bWVudGFkbyAoQURGKSDDqSBub3NzYSBwcmltZWlyYSBlc2NvbGhhLiBPIHBhZHLDo28gw6kgcXVlIEgwOiBzw6lyaWUgbsOjbyBlc3RhY2lvbsOhcmlhIG91IHPDqXJpZSB0ZW0gcmFpeiB1bml0w6FyaWEuDQoNCmBgYHtyIGFkZnRlc3R9DQpBREYudGVzdDwtYWRmLnRlc3QodmFyZWpvbXMpDQpBREYudGVzdA0KYGBgDQoNCiMjIyMgVGVzdGUgQURGIGludmVydGVuZG8gYSBoaXDDs3Rlc2UgbnVsYQ0KDQpOZXN0ZSBjYXNvLCBvIHBhZHLDo28gw6kgcXVlIEgwOiBhIHPDqXJpZSDDqSBlc3RhY2lvbsOhcmlhIG91IGEgc8OpcmllIG7Do28gdGVtIHJhaXogdW5pdMOhcmlhLiBOZXN0ZSBjYXNvLCBhIGhpcMOzdGVzZSBhbHRlcm5hdGl2YSDDqSBxdWUgYSBzw6lyaWUgw6kgImV4cGxvc2l2YSIuDQoNCmBgYHtyIEFERi50ZXN0MTJ9DQpBREYudGVzdDEyPC1hZGYudGVzdCh2YXJlam9tcyxrPTEyLGFsdGVybmF0aXZlID0gYygiZXhwbG9zaXZlIikpDQpBREYudGVzdDEyDQpgYGANCg0KIyBBUklNQSAtIENvZGlnbyBkbyBIeW5kbWFuIGUgQXRoYW5hc29wb3Vsb3MsIHNlY2FvIDguMQ0KDQpBIGZ1bsOnw6NvIGBuZGlmZnNgIHVzYSB1bSB0ZXN0ZSBkZSByYWl6IHVuaXTDoXJpYSBwYXJhIGRldGVybWluYXIgbyBuw7ptZXJvIGRlIGRpZmVyZW7Dp2FzIG5lY2Vzc8OhcmlhcyBwYXJhIHF1ZSBzw6lyaWVzIHRlbXBvcmFpcyB4c2VqYW0gZmVpdGFzIGVzdGFjaW9uw6FyaWFzLg0KDQpTZSBgdGVzdD0ia3BzcyJgLCBvIHRlc3RlIEtQU1Mgw6kgdXNhZG8gY29tIGEgaGlww7N0ZXNlIG51bGEgcXVlIHggcG9zc3VpIHVtYSByYWl6IGVzdGFjaW9uw6FyaWEgY29udHJhIHVtYSBhbHRlcm5hdGl2YSBkZSByYWl6IHVuaXTDoXJpYS4gRW0gc2VndWlkYSwgbyB0ZXN0ZSByZXRvcm5hIG8gbWVub3IgbsO6bWVybyBkZSBkaWZlcmVuw6dhcyBuZWNlc3PDoXJpYXMgcGFyYSBwYXNzYXIgbm8gdGVzdGUgYW8gbsOtdmVsIGFscGhhLg0KDQpTZSBgdGVzdD0iYWRmImAsIG8gdGVzdGUgQURGIMOpIHV0aWxpemFkbyBlIHNlIGB0ZXN0PSJwcCJgLCBvIHRlc3RlIGRlIFBoaWxsaXBzLVBlcnJvbiDDqSB1c2Fkby4gRW0gYW1ib3Mgb3MgY2Fzb3MsIGEgaGlww7N0ZXNlIG51bGEgw6kgcXVlIHggdGVtIHVtYSByYWl6IHVuaXTDoXJpYSBjb250cmEgdW1hIGFsdGVybmF0aXZhIGRlIHPDqXJpZSBlc3RhY2lvbsOhcmlhLiBFbSBzZWd1aWRhLCBvIHRlc3RlIHJldG9ybmEgbyBtZW5vciBuw7ptZXJvIGRlIGRpZmVyZW7Dp2FzIG5lY2Vzc8OhcmlhcyBwYXJhIGZhbGhhciBvIHRlc3RlIG5vIG7DrXZlbCBhbHBoYS4NCg0KQSBmdW7Dp8OjbyBgbnNkaWZmc2AgdXNhIHRlc3RlcyBkZSByYWl6IHVuaXTDoXJpYSBzYXpvbmFsIHBhcmEgZGV0ZXJtaW5hciBvIG7Dum1lcm8gZGUgZGlmZXJlbsOnYXMgc2F6b25haXMgbmVjZXNzw6FyaWFzIHBhcmEgcXVlIGFzIHPDqXJpZXMgdGVtcG9yYWlzIHggc2VqYW0gZmVpdGFzIGVzdGFjaW9uw6FyaWFzIChwb3NzaXZlbG1lbnRlIGNvbSBhbGd1bSBkaWZlcmVuY2lhbCBkZSBhdHJhc28gdGFtYsOpbSkuIFNlIGB0ZXN0PSJjaCJgLCBvIHRlc3RlIGRlIENhbm92YS1IYW5zZW4gKDE5OTUpIMOpIHVzYWRvIChjb20gaGlww7N0ZXNlIG51bGEgZGUgc2F6b25hbGlkYWRlIGRldGVybWluw61zdGljYSkgZSBzZSBgdGVzdD0ib2NzYiJgIG8gdGVzdGUgZGUgT3Nib3JuLUNodWktU21pdGgtQmlyY2hlbmhhbGwgKDE5ODgpIMOpIHVzYWRvIChjb20gaGlww7N0ZXNlIG51bGEgZGUgZXhpc3RpciB1bWEgcmFpeiB1bml0w6FyaWEgc2F6b25hbCkuDQoNCmBgYHtyIHhzdGFyfQ0KeDwtdmFyZWpvbXMNCm5zIDwtIG5zZGlmZnMoeCkgICAjbnVtZXJvIGRlIGRpZmVyZW5jYXMgc2F6b25haXMNCm5zDQppZihucyA+IDApIHsNCiAgeHN0YXIgPC0gZGlmZih4LGxhZz1mcmVxdWVuY3koeCksZGlmZmVyZW5jZXM9bnMpDQp9IGVsc2Ugew0KICB4c3RhciA8LSB4DQp9IA0KYGBgDQoNClBvcnRhbnRvLCB0ZW1vcyB1bWEgZGlmZXJlbsOnYSBzYXpvbmFsIG5lY2Vzc8OhcmlhIChucz0xKSBlIGEgc8OpcmllIG5hIGRpZmVyZW7Dp2Egc2F6b25hbCBlc3TDoSBhcm1hemVuYWRhIGVtIHhzdGFyLg0KDQpgYGB7ciBuZGlmZnN9DQpuZCA8LSBuZGlmZnMoeHN0YXIpICAgIyBudW1lcm8gZGUgZGlmZXJlbmNhcw0KbmQNCmlmKG5kID4gMCkgew0KICB4c3RhciA8LSBkaWZmKHhzdGFyLGRpZmZlcmVuY2VzPW5kKQ0KfQ0KIyB4c3RhciBzZXLDoSBhIHPDqXJpZSBkZXZpZGFtZW50ZSBlbSBkaWZlcmVuw6dhcyBzYXpvbmFpcyBlIGRpZmVyZW7Dp2FzIG5vcm1haXMNCmF1dG9wbG90KHhzdGFyKQ0KYXV0by5hcmltYSh4c3RhcikgICMgdmVyIHF1ZSBvIHJlc3VsdGFkbyDDqSBpZ3VhbCwgbWFzIGFnb3JhIG5hbyB0ZW0gZGlmZXJlbmNhcw0KbW9kZWxvPC1hdXRvLmFyaW1hKHhzdGFyLHN0ZXB3aXNlPUZBTFNFLCBhcHByb3hpbWF0aW9uPUZBTFNFKQ0Kc3VtbWFyeShtb2RlbG8pDQphdXRvcGxvdChtb2RlbG8pIA0KYGBgDQoNCkNvbWVudMOhcmlvOiB1bWEgdmV6IHF1ZSBhIHPDqXJpZSB1dGlsaXphZGEgZW0gYGF1dG8uYXJpbWFgIMOpIGEgcmVzdWx0YW50ZSB4c3RhciwgbyBtbW9kZWxvIG7Do28gaWRlbnRpZmljYSBhIG5lY2Vzc2lkYWRlIGRlIGRpZmVyZW5jaWHDp8OjbyBuZW0gZGlmZXJlbmNpYcOnw6NvIHNhem9uYWwuIENvbSBlc3NlIHByb2NlZGltZW50bywgZWxlIGVuY29udHJhIG8gQVJJTUEoNCwwLDApKDAsMDEpWzEyXSBwYXJhIHhzdGFyIHF1ZSBqw6EgdGV2ZSBhcyBkaWZlcmVuw6dhcyBhcGxpY2FkYXMgc29icmUgdmFyZWpvbXMuIERhIG1lc21hIGZvcm1hIHF1ZSBlbSBmaXQgZSBmaXQzLCBvIG1vZGVsbyBjb20gYXJndW1lbnRvcyBgc3RlcHdpc2U9RkFMU0UsIGFwcHJveGltYXRpb249RkFMU0VgIHJldG9ybmEgb3MgbWVsaG9yZXMgYWp1c3Rlcy4NCg0KIyBSZWZlcsOqbmNpYXMgeyNSZWZlcsOqbmNpYXMgLnVubnVtYmVyZWR9DQoNCkZFUlJFSVJBLCBQZWRybyBDb3N0YTsgU1BFUkFOWkEsIFRhbGl0aGE7IENPU1RBLCBKb25hdGhhICgyMDE4KS4gQkVUUzogQnJhemlsaWFuIEVjb25vbWljIFRpbWUgU2VyaWVzLiBSIHBhY2thZ2UgdmVyc2lvbiAwLjQuOS4gRGlzcG9uw612ZWwgZW06IDxodHRwczovL0NSQU4uUi1wcm9qZWN0Lm9yZy9wYWNrYWdlPUJFVFM+Lg0KDQpIWU5ETUFOLCBSb2IuICgyMDE4KS4gZnBwMjogRGF0YSBmb3IgIkZvcmVjYXN0aW5nOiBQcmluY2lwbGVzIGFuZCBQcmFjdGljZSIgKDJuZCBFZGl0aW9uKS4gUiBwYWNrYWdlIHZlcnNpb24gMi4zLiBEaXNwb27DrXZlbCBlbTogPGh0dHBzOi8vQ1JBTi5SLXByb2plY3Qub3JnL3BhY2thZ2U9ZnBwMj4uDQoNCkhZTkRNQU4sIFIuSi4sICYgQVRIQU5BU09QT1VMT1MsIEcuICgyMDE4KSBGb3JlY2FzdGluZzogcHJpbmNpcGxlcyBhbmQgcHJhY3RpY2UsIDJuZCBlZGl0aW9uLCBPVGV4dHM6IE1lbGJvdXJuZSwgQXVzdHJhbGlhLiBEaXNwb27DrXZlbCBlbTogPGh0dHBzOi8vb3RleHRzLmNvbS9mcHAyLz4uIEFjY2Vzc2VkIG9uIDEyIFNldCAyMDE5Lg0K