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. Exemplo Séries Temporais: consumo Morettin e Toloi: exponential smoothing - formatos ts. Campo Grande-MS, Brasil: RStudio/Rpubs, 2023. Disponível em https://rpubs.com/amrofi/morettin_toloi_expsmooth.

1 Introdução

Os dados vem do livro de Morettin e Toloi, Análise de Séries Temporais (https://www.ime.usp.br/~pam/ST.html), consumo no varejo de São Paulo, mensais de Jan/1984 a Out/1996, em https://www.ime.usp.br/~pam/CONSUMO.XLS.

Inicialmente, trabalharemos com o formato ts, conforme o livro de Hyndman (2018), segunda edição. Depois faremos a parte da decomposição e lags com formato tsibble, conforme o livro de Hyndman (2021), terceira edição.

2 Dados em formato ts

#vou puxar os libraries que tenho costume de usar: destaque para o readxl e tseries
library(readxl) # puxar Excel
library(fpp2) # livro Hyndman formato ts - já carrega ggplot2 e forecast
library(fpp3) # livro Hyndman formato tsibble - já carrega fable, feasts e tidyr e dplyr
# codigo para puxar do Excel
# dados <- read_excel("CONSUMO morettin R.xlsx", 
#                    sheet = "dados")
dados <-structure(list(obs = structure(c(441763200, 444441600, 446947200, 
449625600, 452217600, 454896000, 457488000, 460166400, 462844800, 
465436800, 468115200, 470707200, 473385600, 476064000, 478483200, 
481161600, 483753600, 486432000, 489024000, 491702400, 494380800, 
496972800, 499651200, 502243200, 504921600, 507600000, 510019200, 
512697600, 515289600, 517968000, 520560000, 523238400, 525916800, 
528508800, 531187200, 533779200, 536457600, 539136000, 541555200, 
544233600, 546825600, 549504000, 552096000, 554774400, 557452800, 
560044800, 562723200, 565315200, 567993600, 570672000, 573177600, 
575856000, 578448000, 581126400, 583718400, 586396800, 589075200, 
591667200, 594345600, 596937600, 599616000, 602294400, 604713600, 
607392000, 609984000, 612662400, 615254400, 617932800, 620611200, 
623203200, 625881600, 628473600, 631152000, 633830400, 636249600, 
638928000, 641520000, 644198400, 646790400, 649468800, 652147200, 
654739200, 657417600, 660009600, 662688000, 665366400, 667785600, 
670464000, 673056000, 675734400, 678326400, 681004800, 683683200, 
686275200, 688953600, 691545600, 694224000, 696902400, 699408000, 
702086400, 704678400, 707356800, 709948800, 712627200, 715305600, 
717897600, 720576000, 723168000, 725846400, 728524800, 730944000, 
733622400, 736214400, 738892800, 741484800, 744163200, 746841600, 
749433600, 752112000, 754704000, 757382400, 760060800, 762480000, 
765158400, 767750400, 770428800, 773020800, 775699200, 778377600, 
780969600, 783648000, 786240000, 788918400, 791596800, 794016000, 
796694400, 799286400, 801964800, 804556800, 807235200, 809913600, 
812505600, 815184000, 817776000, 820454400, 823132800, 825638400, 
828316800, 830908800, 833587200, 836179200, 838857600, 841536000, 
844128000), class = c("POSIXct", "POSIXt"), tzone = "UTC"), t = c(1, 
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 
20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 
68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 
84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 
100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 
113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 
126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 
139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 
152, 153, 154), consumo = c(114.13, 110.79, 116.46, 111.57, 120.66, 
121.15, 121.27, 127.02, 129.04, 133.3, 130.6, 179.39, 120.64, 
114.05, 130.6, 118.26, 145.54, 135.13, 153.35, 159.95, 150.01, 
164.93, 170.37, 220.96, 134.26, 133.11, 147.84, 164.46, 181.86, 
170.44, 186.64, 174.21, 181.62, 194.16, 181.9, 232.01, 140.16, 
130.78, 119.04, 120.73, 129.81, 111.04, 122.75, 133.95, 125.41, 
132.05, 129.54, 176.37, 110.09, 113.25, 124.03, 110.63, 116.72, 
124.63, 124.38, 130.27, 119.87, 115.75, 122.44, 162.43, 105.89, 
115.59, 147, 131.7, 131.32, 136.66, 126.43, 134.88, 128.26, 125.32, 
124.61, 166.11, 116.25, 96.93, 89.27, 101.87, 125.57, 113.31, 
109.39, 127.33, 120.56, 117.73, 113.81, 147.25, 100.15, 95.11, 
112.26, 109.39, 114.2, 113.8, 126.47, 128.36, 115.71, 116.09, 
99.53, 127.27, 87.08, 85.67, 82.02, 98.2, 96.44, 90.23, 97.15, 
95.08, 94, 93, 96.09, 129.21, 75.39, 77.7, 97.34, 84.97, 87.55, 
86.64, 90.52, 95.4, 95.2, 95.8, 101.23, 128.49, 85.63, 82.77, 
96.55, 81.33, 96.91, 83.76, 90.19, 114.84, 108.4, 106.05, 109.71, 
143.86, 99.12, 99.28, 114.75, 106.13, 110.02, 108.07, 112.52, 
113.87, 107.84, 112.12, 112.03, 139.37, 92.24, 93.56, 107.37, 
102.89, 114.78, 102.88, 118.41, 119.23, 117.36, 122.06)), row.names = c(NA, 
-154L), class = c("tbl_df", "tbl", "data.frame"))
# atribuir objeto ts
dados.ts<- ts(dados$consumo,start=c(1984,1), frequency = 12)
# plot inicial
plot(dados.ts,main="Consumo do varejo de Sao Paulo, Morettin e Toloi (2006)",
              xlab="Ano",ylab="Indice")

#
# plot no ggplot
library(ggplot2)
datas <- seq(as.Date(paste(c(start(dados.ts),1), collapse="/")), 
             by = "month", length.out = length(dados$consumo))
dados.df <- data.frame(date = datas, value = dados$consumo)
ggplot(dados.df) +
  aes(x = date, y = value) +
  geom_line(colour = "#112446") +
  labs(
    x = "Mês/Ano",
    y = "Índice (base 100)",
    title = "Série de consumo:",
    subtitle = "varejo de São Paulo",
    caption = "Fonte: Morettin e Toloi (2006). Disponível em: <https://www.ime.usp.br/~pam/CONSUMO.XLS>"
  ) +
  ggthemes::theme_economist_white()

2.0.1 Estatísticas descritivas

Olhando as estatísticas descritivas, o pesquisador percebe a amplitude de variação, e o gráfico do dygraphs permite “caminhar” com o mouse sobre a série. Perceberás que a sazonalidade está bem marcada com picos em dezembro de cada ano.

# estatisticas basicas
summary(dados.ts)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   75.39  102.12  116.36  120.94  130.52  232.01
#   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#  75.39  102.12  116.36  120.94  130.52  232.01 
# pelo pacote dygraph dá mais opções
library(dygraphs)
dygraph(dados.ts)

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

3 Suavização (ou alisamento) Exponencial Simples (SES) ou ainda, ‘Holt 1 parâmetro’

Este método é apropriado para séries que se movem aleatoriamente em torno de uma média ou nível constante, sem tendência e sem sazonalidade: \(Z_t=μ_t+a_t\) em que \(a_t\) é um ruído branco de média zero e variância constante e \(μ_t\) é um parâmetro localmente constante (nível); \(Z_t\) é a série em análise.

\[ {\bar Z_t} = \alpha {Z_t} + \left( {1 - \alpha } \right){\bar Z_{t - 1}} \]

Em que α é a constante de suavização, 0<α<1. Portanto, similarmente,

\[ {\bar Z_{t - 1}} = \alpha {Z_{t - 1}} + \left( {1 - \alpha } \right){\bar Z_{t - 2}} \]

O que substituindo (2) em (1) e desenvolvendo os termos tem-se:

\[ {\bar Z_t} = \alpha {Z_t} + \alpha \left( {1 - \alpha } \right){Z_{t - 1}} + \alpha {\left( {1 - \alpha } \right)^2}{Z_{t - 2}} + \ldots \]

Ou seja, a SES faz uma previsão que é a média ponderada por \(α(1-α)^k\) que, quanto mais recente, maior é o peso.

Se \(0<α<1\), então \(α>α(1-α)>α(1-α)^2>\ldots>α(1-α)^k\)

Na MMS tem-se o mesmo peso entre observações recentes e antigas. Na SES, a vantagem sobre MMS é que aplica pesos maiores às observações recentes. A questão será achar α que minimiza a soma de quadrados de ajustamento:

\[ S = \mathop \sum \limits_{t = l + 1}^N {\left( {{Z_t} - {{\hat Z}_{t - 1}}} \right)^2} \]

O forecast será constante para todas as observações futuras!!!

3.1 Código SES

x<-dados.ts  # coringa para automatizar
# simple exponential smoothing (SES)

x.ses<-ses(x,h=12,level = c(95))
x.ses          # exibe o forecast por holt 1 parametro
##          Point Forecast    Lo 95    Hi 95
## Nov 1996       117.0958 80.15345 154.0382
## Dec 1996       117.0958 78.19363 155.9980
## Jan 1997       117.0958 76.32792 157.8637
## Feb 1997       117.0958 74.54393 159.6477
## Mar 1997       117.0958 72.83179 161.3598
## Apr 1997       117.0958 71.18345 163.0082
## May 1997       117.0958 69.59227 164.5994
## Jun 1997       117.0958 68.05269 166.1389
## Jul 1997       117.0958 66.55999 167.6316
## Aug 1997       117.0958 65.11014 169.0815
## Sep 1997       117.0958 63.69964 170.4920
## Oct 1997       117.0958 62.32545 171.8662
summary(x.ses)  # fornece o relatorio da estimacao
## 
## Forecast method: Simple exponential smoothing
## 
## Model Information:
## Simple exponential smoothing 
## 
## Call:
##  ses(y = x, h = 12, level = c(95)) 
## 
##   Smoothing parameters:
##     alpha = 0.33 
## 
##   Initial states:
##     l = 115.5709 
## 
##   sigma:  18.8485
## 
##      AIC     AICc      BIC 
## 1684.099 1684.259 1693.210 
## 
## Error measures:
##                      ME    RMSE      MAE       MPE     MAPE     MASE       ACF1
## Training set 0.03000474 18.7257 13.03585 -1.699482 10.66839 0.813645 0.05177914
## 
## Forecasts:
##          Point Forecast    Lo 95    Hi 95
## Nov 1996       117.0958 80.15345 154.0382
## Dec 1996       117.0958 78.19363 155.9980
## Jan 1997       117.0958 76.32792 157.8637
## Feb 1997       117.0958 74.54393 159.6477
## Mar 1997       117.0958 72.83179 161.3598
## Apr 1997       117.0958 71.18345 163.0082
## May 1997       117.0958 69.59227 164.5994
## Jun 1997       117.0958 68.05269 166.1389
## Jul 1997       117.0958 66.55999 167.6316
## Aug 1997       117.0958 65.11014 169.0815
## Sep 1997       117.0958 63.69964 170.4920
## Oct 1997       117.0958 62.32545 171.8662
plot(x.ses,col=1, 
     main = "Índice de volume de vendas no varejo Total 
     de São Paulo", sub="modelo SES")

Atentar que é linear porque não tem tendência, observada no summary.

3.2 Código Holt

# Holt dois parametros

x.holt<-holt(x,h=12,level = c(95))
x.holt          # exibe o forecast por holt 1 parametro
##          Point Forecast    Lo 95    Hi 95
## Nov 1996       117.2237 80.01095 154.4364
## Dec 1996       117.2512 78.02936 156.4731
## Jan 1997       117.2788 76.14468 158.4129
## Feb 1997       117.3064 74.34396 160.2688
## Mar 1997       117.3339 72.61689 162.0509
## Apr 1997       117.3615 70.95512 163.7678
## May 1997       117.3890 69.35177 165.4263
## Jun 1997       117.4166 67.80106 167.0321
## Jul 1997       117.4442 66.29814 168.5902
## Aug 1997       117.4717 64.83882 170.1046
## Sep 1997       117.4993 63.41951 171.5790
## Oct 1997       117.5268 62.03708 173.0166
summary(x.holt)  # fornece o relatorio da estimacao
## 
## Forecast method: Holt's method
## 
## Model Information:
## Holt's method 
## 
## Call:
##  holt(y = x, h = 12, level = c(95)) 
## 
##   Smoothing parameters:
##     alpha = 0.3329 
##     beta  = 1e-04 
## 
##   Initial states:
##     l = 109.859 
##     b = 0.0267 
## 
##   sigma:  18.9864
## 
##      AIC     AICc      BIC 
## 1688.305 1688.711 1703.490 
## 
## Error measures:
##                      ME     RMSE      MAE       MPE     MAPE      MASE
## Training set 0.05516869 18.73824 13.04413 -1.672203 10.68162 0.8141618
##                    ACF1
## Training set 0.05016778
## 
## Forecasts:
##          Point Forecast    Lo 95    Hi 95
## Nov 1996       117.2237 80.01095 154.4364
## Dec 1996       117.2512 78.02936 156.4731
## Jan 1997       117.2788 76.14468 158.4129
## Feb 1997       117.3064 74.34396 160.2688
## Mar 1997       117.3339 72.61689 162.0509
## Apr 1997       117.3615 70.95512 163.7678
## May 1997       117.3890 69.35177 165.4263
## Jun 1997       117.4166 67.80106 167.0321
## Jul 1997       117.4442 66.29814 168.5902
## Aug 1997       117.4717 64.83882 170.1046
## Sep 1997       117.4993 63.41951 171.5790
## Oct 1997       117.5268 62.03708 173.0166
plot(x.holt,col=1, 
     main = "Índice de volume de vendas no varejo Total 
     de São Paulo", sub="modelo Holt")

Atentar que parece linear mas tem uma pequena tendência que pode ser observada no summary.

3.3 Código Holt-Winters - 3 parâmetros

# Holt-Winters 
x.hwm <- hw(x, seasonal="multiplicative")  # multiplicativo
plot(x,ylab="Indice base 100", main=
       "Índice de volume de vendas no varejo Total de São Paulo",
     type="o",  xlab="Mês/Ano")
lines(fitted(x.ses), col="red", lty=2)
lines(x.ses$mean, type="o", col="red")
lines(x.hwm$mean, type="o", col="green")
legend("topright",lty=1, pch=1, col=1:3, 
       c("original","Holt","HW Multiplicativo"))

summary(x.hwm)
## 
## Forecast method: Holt-Winters' multiplicative method
## 
## Model Information:
## Holt-Winters' multiplicative method 
## 
## Call:
##  hw(y = x, seasonal = "multiplicative") 
## 
##   Smoothing parameters:
##     alpha = 0.5328 
##     beta  = 0.0102 
##     gamma = 1e-04 
## 
##   Initial states:
##     l = 125.3108 
##     b = 1.595 
##     s = 1.3325 1.0103 1.0256 1.0065 1.0415 1.0014
##            0.9618 1.0115 0.9279 0.9403 0.8566 0.884
## 
##   sigma:  0.0707
## 
##      AIC     AICc      BIC 
## 1448.858 1453.358 1500.486 
## 
## Error measures:
##                      ME     RMSE      MAE        MPE     MAPE      MASE
## Training set -0.8609658 8.202305 5.964579 -0.9323561 5.014909 0.3722848
##                   ACF1
## Training set 0.2406417
## 
## Forecasts:
##          Point Forecast     Lo 80    Hi 80     Lo 95    Hi 95
## Nov 1996       118.9314 108.15746 129.7054 102.45407 135.4088
## Dec 1996       157.1159 140.91698 173.3148 132.34179 181.8900
## Jan 1997       104.4061  92.43792 116.3744  86.10232 122.7100
## Feb 1997       101.3382  88.62472 114.0516  81.89463 120.7817
## Mar 1997       111.4200  96.29497 126.5451  88.28824 134.5518
## Apr 1997       110.1296  94.09179 126.1674  85.60189 134.6573
## May 1997       120.2463 101.58710 138.9054  91.70953 148.7830
## Jun 1997       114.5304  95.69544 133.3654  85.72481 143.3360
## Jul 1997       119.4445  98.71949 140.1694  87.74835 151.1406
## Aug 1997       124.4382 101.74268 147.1338  89.72838 159.1481
## Sep 1997       120.4505  97.43228 143.4688  85.24716 155.6539
## Oct 1997       122.9276  98.38061 147.4746  85.38621 160.4690
## Nov 1997       121.3019  96.05134 146.5524  82.68452 159.9192
## Dec 1997       160.2422 125.54335 194.9411 107.17488 213.3095
## Jan 1998       106.4802  82.53968 130.4207  69.86633 143.0941
## Feb 1998       103.3479  79.26163 127.4342  66.51111 140.1848
## Mar 1998       113.6261  86.21665 141.0356  71.70696 155.5453
## Apr 1998       112.3065  84.30425 140.3088  69.48074 155.1323
## May 1998       122.6193  91.05624 154.1823  74.34778 170.8908
## Jun 1998       116.7869  85.78721 147.7866  69.37697 164.1968
## Jul 1998       121.7939  88.49089 155.0970  70.86133 172.7265
## Aug 1998       126.8819  91.17601 162.5878  72.27444 181.4894
## Sep 1998       122.8120  87.27497 158.3491  68.46279 177.1613
## Oct 1998       125.3338  88.07275 162.5948  68.34796 182.3195

É possível perceber que o Holt-Winters (HW - 3 parâmetros) capta melhor a sazonalidade, que é justamente a diferença deste comparado ao Holt (2 parâmetros).

4 Avaliação da simulação

Para uma só equação, podem-se olhar os indicadores tradicionais como o R², estatísticas F e t, critérios de informação de Akaike, Schwarz entre outros. Para modelos de previsão, devo ter um erro de previsão mínimo, definido pelo pesquisador de modo a julgá-lo adequado.

As vezes pode-se ter equações bem estimadas junto de outras com poucos parâmetros significativos, num mesmo sistema. Dependendo do objetivo a ser alcançado, se simular ou explicar, busca-se ajustamento com alta significância (para explicar) ou busca-se melhor poder de explicação. Por melhor poder de explicação entende-se: valores previstos mais próximos dos observados.

Alguns critérios para avaliação da previsão podem ser citados: Raiz do Erro de Simulação Quadrático Médio; Raiz do Erro Quadrático Médio Percentual; Erro de Simulação Médio; Erro Percentual Médio; Erro Absoluto Médio; Erro Absoluto Percentual Médio; Raiz do Erro de Simulação Ex-post Quadrático Médio; Coeficiente de desigualdade de Theil (U).

4.1 Raiz do Erro de Simulação Quadrático Médio (RMSE)

Este critério é dado pela expressão:

\[ RMSE = \;\sqrt {\frac{1}{T}\mathop \sum \limits_{t = 1}^T {{\left( {Y_t^s - Y_t^a} \right)}^2}} \]

Em que: \(Y_t^s\) é o valor simulado (previsto) de \(Y_t\); \(Y_t^a\) é o valor efetivo (observado); e T é o número de períodos na simulação.

O resultado é um escalar com o valor da raiz quadrada da média da diferença quadrática entre x e y, ou seja, a raiz do erro quadrático médio. Normalmente deve ser calculado pela fórmula, mas é reportado pelo programa quando se faz um “forecast”.

Para o cálculo da Raiz do Erro de Simulação Ex-post Quadrático Médio, utilizam-se os resultados do modelo de previsão aplicado a um conjunto restrito (histórico) para checar os erros no período de simulação. Exemplo: usando os dados de 1950:01 a 1985:04, históricos, simulam-se os resultados para 1986:01 a 1988:01 e calcula-se o erro ex-post.

4.2 Raiz do Erro Quadrático Médio Percentual (PRMSE)

\[ PRMSE = \;\sqrt {\frac{1}{T}\mathop \sum \limits_{t = 1}^T {{\left( {\frac{{Y_t^s - Y_t^a}}{{Y_t^a}}} \right)}^2}} \]

Em que: \(Y_t^s\) é o valor simulado (previsto) de \(Y_t\); \(Y_t^a\) é o valor efetivo (observado); e T é o número de períodos na simulação. Neste caso, a diferença entre o previsto e o observado (o erro) é dividida pelo valor observado, obtendo-se assim em base percentual relativo ao valor observado.

4.3 Erro de Simulação Médio (ME) e o Erro Percentual Médio (MPE)

O erro de simulação é basicamente o termo \((Y_t^s - Y_t^a)\), como definido anteriormente. O erro médio (ME) é, portanto, a média dos erros para T observações, enquanto o erro percentual médio (MPE) é obtido relativizando-se pelos valores observados, como nas expressões a seguir:

\[ ME= \frac{1}{T}\sum\limits_{t = 1}^T {\left( {Y_t^s - Y_t^a} \right)} \]

\[ MPE = 100.\frac{1}{T}\sum\limits_{t = 1}^T {\frac{{\left( {Y_t^s - Y_t^a} \right)}}{{Y_t^a}}} \]

Uma ressalva necessária é que: “[…] O problema com os erros médios é que eles podem ser quase zero, quando elevados erros positivos cancelam elevados erros negativos” (PINDYCK e RUBINFELD, 2004, p.447).

Alguns autores utilizam estas duas últimas medidas com o termo entre parênteses $ {( {Y_t^s - Y_t^a} )} $ na forma de ‘valor absoluto’ \(\left| {\left( {Y_t^s - Y_t^a} \right)} \right|\) . Tal procedimento auxilia a investigar o erro de previsão do modelo evitando os problemas de ‘erros positivos’ cancelarem ‘erros negativos’. Desta forma, surgem as outras duas opções: MAE e MAPE.

4.4 Erro Absoluto Médio (MAE) e Erro Absoluto Percentual Médio (MAPE)

O erro absoluto médio (MAE) considera a expressão análoga do erro de simulação médio com os valores absolutos como na expressão:

\[ MAE = \frac{1}{T}\sum\limits_{t = 1}^T {\left| {Y_t^s - Y_t^a} \right|} \]

Similarmente ao erro percentual médio, o erro absoluto percentual médio (MAPE) será:

\[ MAPE = 100.\frac{1}{T}\sum\limits_{t = 1}^T {\left| {\frac{{\left( {Y_t^s - Y_t^a} \right)}}{{Y_t^a}}} \right|} \]

Desejam-se valores baixos das medidas. Entretanto, é importante observar se o modelo está bem ajustado para os ‘pontos de inflexão’ nos dados (oscilações, vales e picos que se observam nos gráficos previstos e realizados).

4.5 Erro Absoluto Percentual Médio Simétrico (sMAPE)

As medidas de acurácia tipo MAPE têm a desvantagem de penalizar mais os erros negativos que os positivos. Assim, surge a medida sMAPE ou MAPE “simétrico” proposto por Armstrong (1978 , p. 348), citado por Hyndman e Athanasopoulos (2018). Esta medida foi utilizada para escolha do melhor modelo na competição de previsão do M3 de Makridakis (\(M^3\) competition). A expressão para cálculo é do tipo:

\[ \text{sMAPE} = \text{mean}\left(200|{Y_t^s - Y_t^a}|/(Y_t^s+Y_t^a)\right) \]

Esta medida não está disponibilizada diretamente nas saídas do pacote forecast nem no fpp2, em virtude da crítica de Hyndman e Athanasopoulos (2018) em que citam Hyndman e Koehler (2006). A medida sMAPE pode ser obtida pelos pacotes Metrics ou TSPred.

4.6 Erro absoluto médio escalonado (MASE)

Para séries temporais sazonais, um erro escalonado para a sazonalidade pode ser definido usando previsões ingênuas sazonais (Hyndman e Athanasopoulos, 2021):

\[ q_{j} = \frac{\displaystyle e_{j}} {\displaystyle\frac{1}{T-m}\sum_{t=m+1}^T |y_{t}-y_{t-m}|}. \]

A métrica MASE será então dada pela expressão:

$$ = (|q_{j}|).

$$

4.7 critérios de informação, Akaike (AIC), Schwarz (SIC ou BIC) e Hannan-Quin (HQ)

A ideia é que nos critérios de informação, acrescentando lags se reduz a soma dos resíduos (pois mais variação é explicada no modelo), ou seja, foi acrescentada mais informação. Mas ainda deve-se penalizar a adição do regressor, uma ideia de redução dos graus de liberdade do modelo.

Em geral, os critérios têm a seguinte expressão: \(C=lnσ ̂^2 (T)+c_T φ(T)\).

O primeiro termo associa a variância, e seu valor deve reduzir com o aumento de variáveis. No segundo termo tem-se: \(c_T\) é o número de parâmetros estimados; e \(φ(T)\) é a ordem do processo que penaliza o acréscimo de variáveis. Assim, quanto menor C melhor é o modelo, ou seja, tem menos resíduos, menos parte não explicada. O Critério de Informação de Akaike (ou AIC de Akaike’s Information Criterion) ou o Critério de Informação de Schwarz ou Bayesiano (ou SIC de Schwarz’s Information Criterion ou em alguns livros BIC de Bayesian Information Criterion) são expressos no Eviews da forma já logaritmizada como:

\[AIC = - \frac{{2l}}{n} + \frac{{2k}}{n}\]

\[SIC = - \frac{{2l}}{n} + \frac{{k.\log n}}{n}\]

\[ l = - {\frac{n}{2}} {\left( {1 + \log(2\pi)+\log \left( {\frac{{\hat \varepsilon ^\prime \hat \varepsilon }}{n}} \right)} \right)} \]

Em que: k é o número de regressores incluindo-se o intercepto; n é o número de observações; l é o log Verossimilhança da regressão; e \(\hat \varepsilon\) são os resíduos estimados do modelo. No formato mais simplificado exposto por Greene (2002), tem-se igual ao de Bueno (2008, p.47):

\[ \begin{array}{l} SIC = BIC\left( {p,q} \right) = \ln {{\hat \sigma }^2} + k\frac{{\ln T}}{T}\\ {{\hat \sigma }^2} = \frac{{\sum\nolimits_{t = 1}^T {\hat \varepsilon _t^2} }}{T} \end{array} \]

Em que k=p+q+1 se houver intercepto.

\[ AIC\left( {p,q} \right) = \ln {{\hat \sigma }^2} + k\frac{{2}}{T} \]

\[ HQ\left( {p,q} \right) = \ln {{\hat \sigma }^2} + k\frac{2}{T} \ln T \]

Quanto mais parâmetros são estimados, menor será o erro estimado, mas isto é penalizado no segundo termo dos critérios. Desejo menores valores dos critérios. O BIC é consistente assintoticamente, e o AIC funciona melhor em pequenas amostras, mas é pior com mais parâmetros. Já o HQ é menos forte que o BIC, ou seja, o preferido é o BIC.

Podemos resumir os resultados de acurácia para visualizar que o HW realmente foi o melhor modelo em termos de AICc, o menor, e nas métricas de acurácia, também o menor principalmente olhando o RMSE e MASE (Figura 1).

Figura 1. Resumo dos resultados dos critérios de informação e das métricas de acurácia, modelos SES, Holt e Holt-Winters.

Fonte: Elaboração própria.

5 Referências

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 27 Mar 2023.

HYNDMAN, R.J., & ATHANASOPOULOS, G. (2021) Forecasting: principles and practice, 3rd edition, OTexts: Melbourne, Australia. Disponível em: https://otexts.com/fpp3/.

MORETTIN, Pedro A.; TOLOI, Clélia M.C. Análise de Séries Temporais. São paulo: Editora Edgard Blücher, 2004. https://www.ime.usp.br/~pam/st/

LS0tDQp0aXRsZTogIkV4ZW1wbG8gU8OpcmllcyBUZW1wb3JhaXM6IGNvbnN1bW8gTW9yZXR0aW4gZSBUb2xvaTogZXhwb25lbnRpYWwgc21vb3RoaW5nICAtIGZvcm1hdG8gdHMiDQphdXRob3I6ICJBZHJpYW5vIE1hcmNvcyBSb2RyaWd1ZXMgRmlndWVpcmVkbywgKmUtbWFpbDogYWRyaWFuby5maWd1ZWlyZWRvQHVmbXMuYnIqIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJWQgJUIgJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdGhlbWU6IGRlZmF1bHQNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiBubw0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojIExpY2Vuw6dhIHsjTGljZW7Dp2EgLnVubnVtYmVyZWR9DQoNClRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIFRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgbGljZW5zZSwgdmlzaXQgPGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8+IG9yIHNlbmQgYSBsZXR0ZXIgdG8gQ3JlYXRpdmUgQ29tbW9ucywgUE8gQm94IDE4NjYsIE1vdW50YWluIFZpZXcsIENBIDk0MDQyLCBVU0EuDQoNCiFbTGljZW5zZTogQ0MgQlktU0EgNC4wXShodHRwczovL21pcnJvcnMuY3JlYXRpdmVjb21tb25zLm9yZy9wcmVzc2tpdC9idXR0b25zLzg4eDMxL3BuZy9ieS1zYS5wbmcpe3dpZHRoPSIyNSUifQ0KDQojIENpdGHDp8OjbyB7I0NpdGHDp8OjbyAudW5udW1iZXJlZH0NCg0KU3VnZXN0w6NvIGRlIGNpdGHDp8OjbzogRklHVUVJUkVETywgQWRyaWFubyBNYXJjb3MgUm9kcmlndWVzLiBFeGVtcGxvIFPDqXJpZXMgVGVtcG9yYWlzOiBjb25zdW1vIE1vcmV0dGluIGUgVG9sb2k6IGV4cG9uZW50aWFsIHNtb290aGluZyAtIGZvcm1hdG9zIHRzLiBDYW1wbyBHcmFuZGUtTVMsIEJyYXNpbDogUlN0dWRpby9ScHVicywgMjAyMy4gRGlzcG9uw612ZWwgZW0gPGh0dHBzOi8vcnB1YnMuY29tL2Ftcm9maS9tb3JldHRpbl90b2xvaV9leHBzbW9vdGg+Lg0KDQojIEludHJvZHXDp8Ojbw0KDQpPcyBkYWRvcyB2ZW0gZG8gbGl2cm8gZGUgTW9yZXR0aW4gZSBUb2xvaSwgQW7DoWxpc2UgZGUgU8OpcmllcyBUZW1wb3JhaXMgKDxodHRwczovL3d3dy5pbWUudXNwLmJyL35wYW0vU1QuaHRtbD4pLCBjb25zdW1vIG5vIHZhcmVqbyBkZSBTw6NvIFBhdWxvLCBtZW5zYWlzIGRlIEphbi8xOTg0IGEgT3V0LzE5OTYsIGVtIDxodHRwczovL3d3dy5pbWUudXNwLmJyL35wYW0vQ09OU1VNTy5YTFM+Lg0KDQpJbmljaWFsbWVudGUsIHRyYWJhbGhhcmVtb3MgY29tIG8gZm9ybWF0byBgdHNgLCBjb25mb3JtZSBvIGxpdnJvIGRlIEh5bmRtYW4gKDIwMTgpLCBzZWd1bmRhIGVkacOnw6NvLiBEZXBvaXMgZmFyZW1vcyBhIHBhcnRlIGRhIGRlY29tcG9zacOnw6NvIGUgbGFncyBjb20gZm9ybWF0byBgdHNpYmJsZWAsIGNvbmZvcm1lIG8gbGl2cm8gZGUgSHluZG1hbiAoMjAyMSksIHRlcmNlaXJhIGVkacOnw6NvLg0KDQojIERhZG9zIGVtIGZvcm1hdG8gdHMNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCg0KI3ZvdSBwdXhhciBvcyBsaWJyYXJpZXMgcXVlIHRlbmhvIGNvc3R1bWUgZGUgdXNhcjogZGVzdGFxdWUgcGFyYSBvIHJlYWR4bCBlIHRzZXJpZXMNCmxpYnJhcnkocmVhZHhsKSAjIHB1eGFyIEV4Y2VsDQpsaWJyYXJ5KGZwcDIpICMgbGl2cm8gSHluZG1hbiBmb3JtYXRvIHRzIC0gasOhIGNhcnJlZ2EgZ2dwbG90MiBlIGZvcmVjYXN0DQpsaWJyYXJ5KGZwcDMpICMgbGl2cm8gSHluZG1hbiBmb3JtYXRvIHRzaWJibGUgLSBqw6EgY2FycmVnYSBmYWJsZSwgZmVhc3RzIGUgdGlkeXIgZSBkcGx5cg0KIyBjb2RpZ28gcGFyYSBwdXhhciBkbyBFeGNlbA0KIyBkYWRvcyA8LSByZWFkX2V4Y2VsKCJDT05TVU1PIG1vcmV0dGluIFIueGxzeCIsIA0KIyAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSAiZGFkb3MiKQ0KZGFkb3MgPC1zdHJ1Y3R1cmUobGlzdChvYnMgPSBzdHJ1Y3R1cmUoYyg0NDE3NjMyMDAsIDQ0NDQ0MTYwMCwgNDQ2OTQ3MjAwLCANCjQ0OTYyNTYwMCwgNDUyMjE3NjAwLCA0NTQ4OTYwMDAsIDQ1NzQ4ODAwMCwgNDYwMTY2NDAwLCA0NjI4NDQ4MDAsIA0KNDY1NDM2ODAwLCA0NjgxMTUyMDAsIDQ3MDcwNzIwMCwgNDczMzg1NjAwLCA0NzYwNjQwMDAsIDQ3ODQ4MzIwMCwgDQo0ODExNjE2MDAsIDQ4Mzc1MzYwMCwgNDg2NDMyMDAwLCA0ODkwMjQwMDAsIDQ5MTcwMjQwMCwgNDk0MzgwODAwLCANCjQ5Njk3MjgwMCwgNDk5NjUxMjAwLCA1MDIyNDMyMDAsIDUwNDkyMTYwMCwgNTA3NjAwMDAwLCA1MTAwMTkyMDAsIA0KNTEyNjk3NjAwLCA1MTUyODk2MDAsIDUxNzk2ODAwMCwgNTIwNTYwMDAwLCA1MjMyMzg0MDAsIDUyNTkxNjgwMCwgDQo1Mjg1MDg4MDAsIDUzMTE4NzIwMCwgNTMzNzc5MjAwLCA1MzY0NTc2MDAsIDUzOTEzNjAwMCwgNTQxNTU1MjAwLCANCjU0NDIzMzYwMCwgNTQ2ODI1NjAwLCA1NDk1MDQwMDAsIDU1MjA5NjAwMCwgNTU0Nzc0NDAwLCA1NTc0NTI4MDAsIA0KNTYwMDQ0ODAwLCA1NjI3MjMyMDAsIDU2NTMxNTIwMCwgNTY3OTkzNjAwLCA1NzA2NzIwMDAsIDU3MzE3NzYwMCwgDQo1NzU4NTYwMDAsIDU3ODQ0ODAwMCwgNTgxMTI2NDAwLCA1ODM3MTg0MDAsIDU4NjM5NjgwMCwgNTg5MDc1MjAwLCANCjU5MTY2NzIwMCwgNTk0MzQ1NjAwLCA1OTY5Mzc2MDAsIDU5OTYxNjAwMCwgNjAyMjk0NDAwLCA2MDQ3MTM2MDAsIA0KNjA3MzkyMDAwLCA2MDk5ODQwMDAsIDYxMjY2MjQwMCwgNjE1MjU0NDAwLCA2MTc5MzI4MDAsIDYyMDYxMTIwMCwgDQo2MjMyMDMyMDAsIDYyNTg4MTYwMCwgNjI4NDczNjAwLCA2MzExNTIwMDAsIDYzMzgzMDQwMCwgNjM2MjQ5NjAwLCANCjYzODkyODAwMCwgNjQxNTIwMDAwLCA2NDQxOTg0MDAsIDY0Njc5MDQwMCwgNjQ5NDY4ODAwLCA2NTIxNDcyMDAsIA0KNjU0NzM5MjAwLCA2NTc0MTc2MDAsIDY2MDAwOTYwMCwgNjYyNjg4MDAwLCA2NjUzNjY0MDAsIDY2Nzc4NTYwMCwgDQo2NzA0NjQwMDAsIDY3MzA1NjAwMCwgNjc1NzM0NDAwLCA2NzgzMjY0MDAsIDY4MTAwNDgwMCwgNjgzNjgzMjAwLCANCjY4NjI3NTIwMCwgNjg4OTUzNjAwLCA2OTE1NDU2MDAsIDY5NDIyNDAwMCwgNjk2OTAyNDAwLCA2OTk0MDgwMDAsIA0KNzAyMDg2NDAwLCA3MDQ2Nzg0MDAsIDcwNzM1NjgwMCwgNzA5OTQ4ODAwLCA3MTI2MjcyMDAsIDcxNTMwNTYwMCwgDQo3MTc4OTc2MDAsIDcyMDU3NjAwMCwgNzIzMTY4MDAwLCA3MjU4NDY0MDAsIDcyODUyNDgwMCwgNzMwOTQ0MDAwLCANCjczMzYyMjQwMCwgNzM2MjE0NDAwLCA3Mzg4OTI4MDAsIDc0MTQ4NDgwMCwgNzQ0MTYzMjAwLCA3NDY4NDE2MDAsIA0KNzQ5NDMzNjAwLCA3NTIxMTIwMDAsIDc1NDcwNDAwMCwgNzU3MzgyNDAwLCA3NjAwNjA4MDAsIDc2MjQ4MDAwMCwgDQo3NjUxNTg0MDAsIDc2Nzc1MDQwMCwgNzcwNDI4ODAwLCA3NzMwMjA4MDAsIDc3NTY5OTIwMCwgNzc4Mzc3NjAwLCANCjc4MDk2OTYwMCwgNzgzNjQ4MDAwLCA3ODYyNDAwMDAsIDc4ODkxODQwMCwgNzkxNTk2ODAwLCA3OTQwMTYwMDAsIA0KNzk2Njk0NDAwLCA3OTkyODY0MDAsIDgwMTk2NDgwMCwgODA0NTU2ODAwLCA4MDcyMzUyMDAsIDgwOTkxMzYwMCwgDQo4MTI1MDU2MDAsIDgxNTE4NDAwMCwgODE3Nzc2MDAwLCA4MjA0NTQ0MDAsIDgyMzEzMjgwMCwgODI1NjM4NDAwLCANCjgyODMxNjgwMCwgODMwOTA4ODAwLCA4MzM1ODcyMDAsIDgzNjE3OTIwMCwgODM4ODU3NjAwLCA4NDE1MzYwMDAsIA0KODQ0MTI4MDAwKSwgY2xhc3MgPSBjKCJQT1NJWGN0IiwgIlBPU0lYdCIpLCB0em9uZSA9ICJVVEMiKSwgdCA9IGMoMSwgDQoyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgDQoyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgDQozNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgDQo1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCA2NCwgNjUsIDY2LCA2NywgDQo2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LCA4MCwgODEsIDgyLCA4MywgDQo4NCwgODUsIDg2LCA4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgDQoxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLCAxMTIsIA0KMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCANCjEyNiwgMTI3LCAxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgDQoxMzksIDE0MCwgMTQxLCAxNDIsIDE0MywgMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIA0KMTUyLCAxNTMsIDE1NCksIGNvbnN1bW8gPSBjKDExNC4xMywgMTEwLjc5LCAxMTYuNDYsIDExMS41NywgMTIwLjY2LCANCjEyMS4xNSwgMTIxLjI3LCAxMjcuMDIsIDEyOS4wNCwgMTMzLjMsIDEzMC42LCAxNzkuMzksIDEyMC42NCwgDQoxMTQuMDUsIDEzMC42LCAxMTguMjYsIDE0NS41NCwgMTM1LjEzLCAxNTMuMzUsIDE1OS45NSwgMTUwLjAxLCANCjE2NC45MywgMTcwLjM3LCAyMjAuOTYsIDEzNC4yNiwgMTMzLjExLCAxNDcuODQsIDE2NC40NiwgMTgxLjg2LCANCjE3MC40NCwgMTg2LjY0LCAxNzQuMjEsIDE4MS42MiwgMTk0LjE2LCAxODEuOSwgMjMyLjAxLCAxNDAuMTYsIA0KMTMwLjc4LCAxMTkuMDQsIDEyMC43MywgMTI5LjgxLCAxMTEuMDQsIDEyMi43NSwgMTMzLjk1LCAxMjUuNDEsIA0KMTMyLjA1LCAxMjkuNTQsIDE3Ni4zNywgMTEwLjA5LCAxMTMuMjUsIDEyNC4wMywgMTEwLjYzLCAxMTYuNzIsIA0KMTI0LjYzLCAxMjQuMzgsIDEzMC4yNywgMTE5Ljg3LCAxMTUuNzUsIDEyMi40NCwgMTYyLjQzLCAxMDUuODksIA0KMTE1LjU5LCAxNDcsIDEzMS43LCAxMzEuMzIsIDEzNi42NiwgMTI2LjQzLCAxMzQuODgsIDEyOC4yNiwgMTI1LjMyLCANCjEyNC42MSwgMTY2LjExLCAxMTYuMjUsIDk2LjkzLCA4OS4yNywgMTAxLjg3LCAxMjUuNTcsIDExMy4zMSwgDQoxMDkuMzksIDEyNy4zMywgMTIwLjU2LCAxMTcuNzMsIDExMy44MSwgMTQ3LjI1LCAxMDAuMTUsIDk1LjExLCANCjExMi4yNiwgMTA5LjM5LCAxMTQuMiwgMTEzLjgsIDEyNi40NywgMTI4LjM2LCAxMTUuNzEsIDExNi4wOSwgDQo5OS41MywgMTI3LjI3LCA4Ny4wOCwgODUuNjcsIDgyLjAyLCA5OC4yLCA5Ni40NCwgOTAuMjMsIDk3LjE1LCANCjk1LjA4LCA5NCwgOTMsIDk2LjA5LCAxMjkuMjEsIDc1LjM5LCA3Ny43LCA5Ny4zNCwgODQuOTcsIDg3LjU1LCANCjg2LjY0LCA5MC41MiwgOTUuNCwgOTUuMiwgOTUuOCwgMTAxLjIzLCAxMjguNDksIDg1LjYzLCA4Mi43NywgDQo5Ni41NSwgODEuMzMsIDk2LjkxLCA4My43NiwgOTAuMTksIDExNC44NCwgMTA4LjQsIDEwNi4wNSwgMTA5LjcxLCANCjE0My44NiwgOTkuMTIsIDk5LjI4LCAxMTQuNzUsIDEwNi4xMywgMTEwLjAyLCAxMDguMDcsIDExMi41MiwgDQoxMTMuODcsIDEwNy44NCwgMTEyLjEyLCAxMTIuMDMsIDEzOS4zNywgOTIuMjQsIDkzLjU2LCAxMDcuMzcsIA0KMTAyLjg5LCAxMTQuNzgsIDEwMi44OCwgMTE4LjQxLCAxMTkuMjMsIDExNy4zNiwgMTIyLjA2KSksIHJvdy5uYW1lcyA9IGMoTkEsIA0KLTE1NEwpLCBjbGFzcyA9IGMoInRibF9kZiIsICJ0YmwiLCAiZGF0YS5mcmFtZSIpKQ0KIyBhdHJpYnVpciBvYmpldG8gdHMNCmRhZG9zLnRzPC0gdHMoZGFkb3MkY29uc3VtbyxzdGFydD1jKDE5ODQsMSksIGZyZXF1ZW5jeSA9IDEyKQ0KIyBwbG90IGluaWNpYWwNCnBsb3QoZGFkb3MudHMsbWFpbj0iQ29uc3VtbyBkbyB2YXJlam8gZGUgU2FvIFBhdWxvLCBNb3JldHRpbiBlIFRvbG9pICgyMDA2KSIsDQogICAgICAgICAgICAgIHhsYWI9IkFubyIseWxhYj0iSW5kaWNlIikNCiMNCiMgcGxvdCBubyBnZ3Bsb3QNCmxpYnJhcnkoZ2dwbG90MikNCmRhdGFzIDwtIHNlcShhcy5EYXRlKHBhc3RlKGMoc3RhcnQoZGFkb3MudHMpLDEpLCBjb2xsYXBzZT0iLyIpKSwgDQogICAgICAgICAgICAgYnkgPSAibW9udGgiLCBsZW5ndGgub3V0ID0gbGVuZ3RoKGRhZG9zJGNvbnN1bW8pKQ0KZGFkb3MuZGYgPC0gZGF0YS5mcmFtZShkYXRlID0gZGF0YXMsIHZhbHVlID0gZGFkb3MkY29uc3VtbykNCmdncGxvdChkYWRvcy5kZikgKw0KICBhZXMoeCA9IGRhdGUsIHkgPSB2YWx1ZSkgKw0KICBnZW9tX2xpbmUoY29sb3VyID0gIiMxMTI0NDYiKSArDQogIGxhYnMoDQogICAgeCA9ICJNw6pzL0FubyIsDQogICAgeSA9ICLDjW5kaWNlIChiYXNlIDEwMCkiLA0KICAgIHRpdGxlID0gIlPDqXJpZSBkZSBjb25zdW1vOiIsDQogICAgc3VidGl0bGUgPSAidmFyZWpvIGRlIFPDo28gUGF1bG8iLA0KICAgIGNhcHRpb24gPSAiRm9udGU6IE1vcmV0dGluIGUgVG9sb2kgKDIwMDYpLiBEaXNwb27DrXZlbCBlbTogPGh0dHBzOi8vd3d3LmltZS51c3AuYnIvfnBhbS9DT05TVU1PLlhMUz4iDQogICkgKw0KICBnZ3RoZW1lczo6dGhlbWVfZWNvbm9taXN0X3doaXRlKCkNCg0KYGBgDQoNCiMjIyBFc3RhdMOtc3RpY2FzIGRlc2NyaXRpdmFzDQoNCk9saGFuZG8gYXMgZXN0YXTDrXN0aWNhcyBkZXNjcml0aXZhcywgbyBwZXNxdWlzYWRvciBwZXJjZWJlIGEgYW1wbGl0dWRlIGRlIHZhcmlhw6fDo28sIGUgbyBncsOhZmljbyBkbyBkeWdyYXBocyBwZXJtaXRlICJjYW1pbmhhciIgY29tIG8gbW91c2Ugc29icmUgYSBzw6lyaWUuIFBlcmNlYmVyw6FzIHF1ZSBhIHNhem9uYWxpZGFkZSBlc3TDoSBiZW0gbWFyY2FkYSBjb20gcGljb3MgZW0gZGV6ZW1icm8gZGUgY2FkYSBhbm8uDQoNCmBgYHtyIGVzdGF0ZGVzYywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgZXN0YXRpc3RpY2FzIGJhc2ljYXMNCnN1bW1hcnkoZGFkb3MudHMpDQojICAgTWluLiAxc3QgUXUuICBNZWRpYW4gICAgTWVhbiAzcmQgUXUuICAgIE1heC4gDQojICA3NS4zOSAgMTAyLjEyICAxMTYuMzYgIDEyMC45NCAgMTMwLjUyICAyMzIuMDEgDQojIHBlbG8gcGFjb3RlIGR5Z3JhcGggZMOhIG1haXMgb3DDp8O1ZXMNCmxpYnJhcnkoZHlncmFwaHMpDQpkeWdyYXBoKGRhZG9zLnRzKQ0KYGBgDQoNCsOJIHBvc3PDrXZlbCB2aXN1YWxpemFyIG5vcyBwbG90cyBhY2ltYTogc2F6b25hbGlkYWRlIChwb3IgZXhlbXBsbywgcGljb3MgZW0gZGV6ZW1icm8gZGUgY2FkYSBhbm8pOyBhIHRlbmTDqm5jaWEgYXBhcmVudGVtZW50ZSBjcmVzY2VudGUgZSBkZXBvaXMgZGVjcmVzY2UgY29tIGEgImNyaXNlIiBicmFzaWxlaXJhOyBlIHVtYSBhcGFyZW50ZSBuw6NvLWVzdGFjaW9uYXJpZWRhZGUgKG3DqWRpYSBlIHZhcmnDom5jaWEgbXVkYW0gbm8gdGVtcG8pLiBFbSBvdXRyYSBwb3N0YWdlbSBhcGxpY2FyZWkgbyB0ZXN0ZSBkZSByYWl6IHVuaXTDoXJpYSBuYSBzw6lyaWUgcGFyYSBhdmFsaWFyIGEgZXN0YWNpb25hcmllZGFkZSBkZSBtb2RvIG1haXMgZXhwbMOtY2l0by4NCg0KIyBTdWF2aXphw6fDo28gKG91IGFsaXNhbWVudG8pIEV4cG9uZW5jaWFsIFNpbXBsZXMgKFNFUykgb3UgYWluZGEsICdIb2x0IDEgcGFyw6JtZXRybycNCg0KRXN0ZSBtw6l0b2RvIMOpIGFwcm9wcmlhZG8gcGFyYSBzw6lyaWVzIHF1ZSBzZSBtb3ZlbSBhbGVhdG9yaWFtZW50ZSBlbSB0b3JubyBkZSB1bWEgbcOpZGlhIG91IG7DrXZlbCBjb25zdGFudGUsIHNlbSB0ZW5kw6puY2lhIGUgc2VtIHNhem9uYWxpZGFkZTogJFpfdD3OvF90K2FfdCQgZW0gcXVlICRhX3QkIMOpIHVtIHJ1w61kbyBicmFuY28gZGUgbcOpZGlhIHplcm8gZSB2YXJpw6JuY2lhIGNvbnN0YW50ZSBlICTOvF90JCDDqSB1bSBwYXLDom1ldHJvIGxvY2FsbWVudGUgY29uc3RhbnRlIChuw612ZWwpOyAkWl90JCDDqSBhIHPDqXJpZSBlbSBhbsOhbGlzZS4NCg0KJCQNCntcYmFyIFpfdH0gPSBcYWxwaGEge1pfdH0gKyBcbGVmdCggezEgLSBcYWxwaGEgfSBccmlnaHQpe1xiYXIgWl97dCAtIDF9fQ0KJCQNCg0KRW0gcXVlIM6xIMOpIGEgY29uc3RhbnRlIGRlIHN1YXZpemHDp8OjbywgMFw8zrFcPDEuIFBvcnRhbnRvLCBzaW1pbGFybWVudGUsDQoNCiQkDQp7XGJhciBaX3t0IC0gMX19ID0gXGFscGhhIHtaX3t0IC0gMX19ICsgXGxlZnQoIHsxIC0gXGFscGhhIH0gXHJpZ2h0KXtcYmFyIFpfe3QgLSAyfX0NCiQkDQoNCk8gcXVlIHN1YnN0aXR1aW5kbyAoMikgZW0gKDEpIGUgZGVzZW52b2x2ZW5kbyBvcyB0ZXJtb3MgdGVtLXNlOg0KDQokJA0Ke1xiYXIgWl90fSA9IFxhbHBoYSB7Wl90fSArIFxhbHBoYSBcbGVmdCggezEgLSBcYWxwaGEgfSBccmlnaHQpe1pfe3QgLSAxfX0gKyBcYWxwaGEge1xsZWZ0KCB7MSAtIFxhbHBoYSB9IFxyaWdodCleMn17Wl97dCAtIDJ9fSArICBcbGRvdHMgDQokJA0KDQpPdSBzZWphLCBhIFNFUyBmYXogdW1hIHByZXZpc8OjbyBxdWUgw6kgYSBtw6lkaWEgcG9uZGVyYWRhIHBvciAkzrEoMS3OsSleayQgcXVlLCBxdWFudG8gbWFpcyByZWNlbnRlLCBtYWlvciDDqSBvIHBlc28uDQoNClNlICQwPM6xPDEkLCBlbnTDo28gJM6xPs6xKDEtzrEpPs6xKDEtzrEpXjI+XGxkb3RzPs6xKDEtzrEpXmskDQoNCk5hIE1NUyB0ZW0tc2UgbyBtZXNtbyBwZXNvIGVudHJlIG9ic2VydmHDp8O1ZXMgcmVjZW50ZXMgZSBhbnRpZ2FzLiBOYSBTRVMsIGEgdmFudGFnZW0gc29icmUgTU1TIMOpIHF1ZSBhcGxpY2EgcGVzb3MgbWFpb3JlcyDDoHMgb2JzZXJ2YcOnw7VlcyByZWNlbnRlcy4gQSBxdWVzdMOjbyBzZXLDoSBhY2hhciDOsSBxdWUgbWluaW1pemEgYSBzb21hIGRlIHF1YWRyYWRvcyBkZSBhanVzdGFtZW50bzoNCg0KJCQNClMgPSBcbWF0aG9wIFxzdW0gXGxpbWl0c197dCA9IGwgKyAxfV5OIHtcbGVmdCgge3taX3R9IC0ge3tcaGF0IFp9X3t0IC0gMX19fSBccmlnaHQpXjJ9DQokJA0KDQpPIGZvcmVjYXN0IHNlcsOhIGNvbnN0YW50ZSBwYXJhIHRvZGFzIGFzIG9ic2VydmHDp8O1ZXMgZnV0dXJhcyEhIQ0KDQojIyBDw7NkaWdvIFNFUw0KDQpgYGB7ciBzZXN9DQp4PC1kYWRvcy50cyAgIyBjb3JpbmdhIHBhcmEgYXV0b21hdGl6YXINCiMgc2ltcGxlIGV4cG9uZW50aWFsIHNtb290aGluZyAoU0VTKQ0KDQp4LnNlczwtc2VzKHgsaD0xMixsZXZlbCA9IGMoOTUpKQ0KeC5zZXMgICAgICAgICAgIyBleGliZSBvIGZvcmVjYXN0IHBvciBob2x0IDEgcGFyYW1ldHJvDQpzdW1tYXJ5KHguc2VzKSAgIyBmb3JuZWNlIG8gcmVsYXRvcmlvIGRhIGVzdGltYWNhbw0KcGxvdCh4LnNlcyxjb2w9MSwgDQogICAgIG1haW4gPSAiw41uZGljZSBkZSB2b2x1bWUgZGUgdmVuZGFzIG5vIHZhcmVqbyBUb3RhbCANCiAgICAgZGUgU8OjbyBQYXVsbyIsIHN1Yj0ibW9kZWxvIFNFUyIpDQpgYGANCg0KQXRlbnRhciBxdWUgw6kgbGluZWFyIHBvcnF1ZSBuw6NvIHRlbSB0ZW5kw6puY2lhLCBvYnNlcnZhZGEgbm8gc3VtbWFyeS4NCg0KIyMgQ8OzZGlnbyBIb2x0DQoNCmBgYHtyIGhvbHQsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIEhvbHQgZG9pcyBwYXJhbWV0cm9zDQoNCnguaG9sdDwtaG9sdCh4LGg9MTIsbGV2ZWwgPSBjKDk1KSkNCnguaG9sdCAgICAgICAgICAjIGV4aWJlIG8gZm9yZWNhc3QgcG9yIGhvbHQgMSBwYXJhbWV0cm8NCnN1bW1hcnkoeC5ob2x0KSAgIyBmb3JuZWNlIG8gcmVsYXRvcmlvIGRhIGVzdGltYWNhbw0KcGxvdCh4LmhvbHQsY29sPTEsIA0KICAgICBtYWluID0gIsONbmRpY2UgZGUgdm9sdW1lIGRlIHZlbmRhcyBubyB2YXJlam8gVG90YWwgDQogICAgIGRlIFPDo28gUGF1bG8iLCBzdWI9Im1vZGVsbyBIb2x0IikNCmBgYA0KDQpBdGVudGFyIHF1ZSBwYXJlY2UgbGluZWFyIG1hcyB0ZW0gdW1hIHBlcXVlbmEgdGVuZMOqbmNpYSBxdWUgcG9kZSBzZXIgb2JzZXJ2YWRhIG5vIHN1bW1hcnkuDQoNCiMjIEPDs2RpZ28gSG9sdC1XaW50ZXJzIC0gMyBwYXLDom1ldHJvcw0KDQpgYGB7ciBodywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgSG9sdC1XaW50ZXJzIA0KeC5od20gPC0gaHcoeCwgc2Vhc29uYWw9Im11bHRpcGxpY2F0aXZlIikgICMgbXVsdGlwbGljYXRpdm8NCnBsb3QoeCx5bGFiPSJJbmRpY2UgYmFzZSAxMDAiLCBtYWluPQ0KICAgICAgICLDjW5kaWNlIGRlIHZvbHVtZSBkZSB2ZW5kYXMgbm8gdmFyZWpvIFRvdGFsIGRlIFPDo28gUGF1bG8iLA0KICAgICB0eXBlPSJvIiwgIHhsYWI9Ik3DqnMvQW5vIikNCmxpbmVzKGZpdHRlZCh4LnNlcyksIGNvbD0icmVkIiwgbHR5PTIpDQpsaW5lcyh4LnNlcyRtZWFuLCB0eXBlPSJvIiwgY29sPSJyZWQiKQ0KbGluZXMoeC5od20kbWVhbiwgdHlwZT0ibyIsIGNvbD0iZ3JlZW4iKQ0KbGVnZW5kKCJ0b3ByaWdodCIsbHR5PTEsIHBjaD0xLCBjb2w9MTozLCANCiAgICAgICBjKCJvcmlnaW5hbCIsIkhvbHQiLCJIVyBNdWx0aXBsaWNhdGl2byIpKQ0Kc3VtbWFyeSh4Lmh3bSkNCmBgYA0KDQrDiSBwb3Nzw612ZWwgcGVyY2ViZXIgcXVlIG8gSG9sdC1XaW50ZXJzIChIVyAtIDMgcGFyw6JtZXRyb3MpIGNhcHRhIG1lbGhvciBhIHNhem9uYWxpZGFkZSwgcXVlIMOpIGp1c3RhbWVudGUgYSBkaWZlcmVuw6dhIGRlc3RlIGNvbXBhcmFkbyBhbyBIb2x0ICgyIHBhcsOibWV0cm9zKS4NCg0KIyBBdmFsaWHDp8OjbyBkYSBzaW11bGHDp8Ojbw0KDQpQYXJhIHVtYSBzw7MgZXF1YcOnw6NvLCBwb2RlbS1zZSBvbGhhciBvcyBpbmRpY2Fkb3JlcyB0cmFkaWNpb25haXMgY29tbyBvIFLCsiwgZXN0YXTDrXN0aWNhcyBGIGUgdCwgY3JpdMOpcmlvcyBkZSBpbmZvcm1hw6fDo28gZGUgQWthaWtlLCBTY2h3YXJ6IGVudHJlIG91dHJvcy4gUGFyYSBtb2RlbG9zIGRlIHByZXZpc8OjbywgZGV2byB0ZXIgdW0gZXJybyBkZSBwcmV2aXPDo28gbcOtbmltbywgZGVmaW5pZG8gcGVsbyBwZXNxdWlzYWRvciBkZSBtb2RvIGEganVsZ8OhLWxvIGFkZXF1YWRvLg0KDQpBcyB2ZXplcyBwb2RlLXNlIHRlciBlcXVhw6fDtWVzIGJlbSBlc3RpbWFkYXMganVudG8gZGUgb3V0cmFzIGNvbSBwb3Vjb3MgcGFyw6JtZXRyb3Mgc2lnbmlmaWNhdGl2b3MsIG51bSBtZXNtbyBzaXN0ZW1hLiBEZXBlbmRlbmRvIGRvIG9iamV0aXZvIGEgc2VyIGFsY2Fuw6dhZG8sIHNlIHNpbXVsYXIgb3UgZXhwbGljYXIsIGJ1c2NhLXNlIGFqdXN0YW1lbnRvIGNvbSBhbHRhIHNpZ25pZmljw6JuY2lhIChwYXJhIGV4cGxpY2FyKSBvdSBidXNjYS1zZSBtZWxob3IgcG9kZXIgZGUgZXhwbGljYcOnw6NvLiBQb3IgbWVsaG9yIHBvZGVyIGRlIGV4cGxpY2HDp8OjbyBlbnRlbmRlLXNlOiB2YWxvcmVzIHByZXZpc3RvcyBtYWlzIHByw7N4aW1vcyBkb3Mgb2JzZXJ2YWRvcy4NCg0KQWxndW5zIGNyaXTDqXJpb3MgcGFyYSBhdmFsaWHDp8OjbyBkYSBwcmV2aXPDo28gcG9kZW0gc2VyIGNpdGFkb3M6IFJhaXogZG8gRXJybyBkZSBTaW11bGHDp8OjbyBRdWFkcsOhdGljbyBNw6lkaW87IFJhaXogZG8gRXJybyBRdWFkcsOhdGljbyBNw6lkaW8gUGVyY2VudHVhbDsgRXJybyBkZSBTaW11bGHDp8OjbyBNw6lkaW87IEVycm8gUGVyY2VudHVhbCBNw6lkaW87IEVycm8gQWJzb2x1dG8gTcOpZGlvOyBFcnJvIEFic29sdXRvIFBlcmNlbnR1YWwgTcOpZGlvOyBSYWl6IGRvIEVycm8gZGUgU2ltdWxhw6fDo28gRXgtcG9zdCBRdWFkcsOhdGljbyBNw6lkaW87IENvZWZpY2llbnRlIGRlIGRlc2lndWFsZGFkZSBkZSBUaGVpbCAoVSkuDQoNCiMjIFJhaXogZG8gRXJybyBkZSBTaW11bGHDp8OjbyBRdWFkcsOhdGljbyBNw6lkaW8gKFJNU0UpDQoNCkVzdGUgY3JpdMOpcmlvIMOpIGRhZG8gcGVsYSBleHByZXNzw6NvOg0KDQokJA0KUk1TRSA9IFw7XHNxcnQge1xmcmFjezF9e1R9XG1hdGhvcCBcc3VtIFxsaW1pdHNfe3QgPSAxfV5UIHt7XGxlZnQoIHtZX3RecyAtIFlfdF5hfSBccmlnaHQpfV4yfX0gDQokJA0KDQpFbSBxdWU6ICRZX3RecyQgw6kgbyB2YWxvciBzaW11bGFkbyAocHJldmlzdG8pIGRlICRZX3QkOyAkWV90XmEkIMOpIG8gdmFsb3IgZWZldGl2byAob2JzZXJ2YWRvKTsgZSBUIMOpIG8gbsO6bWVybyBkZSBwZXLDrW9kb3MgbmEgc2ltdWxhw6fDo28uDQoNCk8gcmVzdWx0YWRvIMOpIHVtIGVzY2FsYXIgY29tIG8gdmFsb3IgZGEgcmFpeiBxdWFkcmFkYSBkYSBtw6lkaWEgZGEgZGlmZXJlbsOnYSBxdWFkcsOhdGljYSBlbnRyZSB4IGUgeSwgb3Ugc2VqYSwgYSByYWl6IGRvIGVycm8gcXVhZHLDoXRpY28gbcOpZGlvLiBOb3JtYWxtZW50ZSBkZXZlIHNlciBjYWxjdWxhZG8gcGVsYSBmw7NybXVsYSwgbWFzIMOpIHJlcG9ydGFkbyBwZWxvIHByb2dyYW1hIHF1YW5kbyBzZSBmYXogdW0gImZvcmVjYXN0Ii4NCg0KUGFyYSBvIGPDoWxjdWxvIGRhIFJhaXogZG8gRXJybyBkZSBTaW11bGHDp8OjbyBFeC1wb3N0IFF1YWRyw6F0aWNvIE3DqWRpbywgdXRpbGl6YW0tc2Ugb3MgcmVzdWx0YWRvcyBkbyBtb2RlbG8gZGUgcHJldmlzw6NvIGFwbGljYWRvIGEgdW0gY29uanVudG8gcmVzdHJpdG8gKGhpc3TDs3JpY28pIHBhcmEgY2hlY2FyIG9zIGVycm9zIG5vIHBlcsOtb2RvIGRlIHNpbXVsYcOnw6NvLiBFeGVtcGxvOiB1c2FuZG8gb3MgZGFkb3MgZGUgMTk1MDowMSBhIDE5ODU6MDQsIGhpc3TDs3JpY29zLCBzaW11bGFtLXNlIG9zIHJlc3VsdGFkb3MgcGFyYSAxOTg2OjAxIGEgMTk4ODowMSBlIGNhbGN1bGEtc2UgbyBlcnJvIGV4LXBvc3QuDQoNCiMjIFJhaXogZG8gRXJybyBRdWFkcsOhdGljbyBNw6lkaW8gUGVyY2VudHVhbCAoUFJNU0UpDQoNCiQkDQpQUk1TRSA9IFw7XHNxcnQge1xmcmFjezF9e1R9XG1hdGhvcCBcc3VtIFxsaW1pdHNfe3QgPSAxfV5UIHt7XGxlZnQoIHtcZnJhY3t7WV90XnMgLSBZX3ReYX19e3tZX3ReYX19fSBccmlnaHQpfV4yfX0gDQokJA0KDQpFbSBxdWU6ICRZX3RecyQgw6kgbyB2YWxvciBzaW11bGFkbyAocHJldmlzdG8pIGRlICRZX3QkOyAkWV90XmEkIMOpIG8gdmFsb3IgZWZldGl2byAob2JzZXJ2YWRvKTsgZSBUIMOpIG8gbsO6bWVybyBkZSBwZXLDrW9kb3MgbmEgc2ltdWxhw6fDo28uIE5lc3RlIGNhc28sIGEgZGlmZXJlbsOnYSBlbnRyZSBvIHByZXZpc3RvIGUgbyBvYnNlcnZhZG8gKG8gZXJybykgw6kgZGl2aWRpZGEgcGVsbyB2YWxvciBvYnNlcnZhZG8sIG9idGVuZG8tc2UgYXNzaW0gZW0gYmFzZSBwZXJjZW50dWFsIHJlbGF0aXZvIGFvIHZhbG9yIG9ic2VydmFkby4NCg0KIyMgRXJybyBkZSBTaW11bGHDp8OjbyBNw6lkaW8gKE1FKSBlIG8gRXJybyBQZXJjZW50dWFsIE3DqWRpbyAoTVBFKQ0KDQpPIGVycm8gZGUgc2ltdWxhw6fDo28gw6kgYmFzaWNhbWVudGUgbyB0ZXJtbyAkKFlfdF5zIC0gWV90XmEpJCwgY29tbyBkZWZpbmlkbyBhbnRlcmlvcm1lbnRlLiBPIGVycm8gbcOpZGlvIChNRSkgw6ksIHBvcnRhbnRvLCBhIG3DqWRpYSBkb3MgZXJyb3MgcGFyYSBUIG9ic2VydmHDp8O1ZXMsIGVucXVhbnRvIG8gZXJybyBwZXJjZW50dWFsIG3DqWRpbyAoTVBFKSDDqSBvYnRpZG8gcmVsYXRpdml6YW5kby1zZSBwZWxvcyB2YWxvcmVzIG9ic2VydmFkb3MsIGNvbW8gbmFzIGV4cHJlc3PDtWVzIGEgc2VndWlyOg0KDQokJA0KTUU9IFxmcmFjezF9e1R9XHN1bVxsaW1pdHNfe3QgPSAxfV5UIHtcbGVmdCgge1lfdF5zIC0gWV90XmF9IFxyaWdodCl9IA0KJCQNCg0KJCQNCk1QRSA9IDEwMC5cZnJhY3sxfXtUfVxzdW1cbGltaXRzX3t0ID0gMX1eVCB7XGZyYWN7e1xsZWZ0KCB7WV90XnMgLSBZX3ReYX0gXHJpZ2h0KX19e3tZX3ReYX19fSANCiQkDQoNClVtYSByZXNzYWx2YSBuZWNlc3PDoXJpYSDDqSBxdWU6ICJbLi4uXSBPIHByb2JsZW1hIGNvbSBvcyBlcnJvcyBtw6lkaW9zIMOpIHF1ZSBlbGVzIHBvZGVtIHNlciBxdWFzZSB6ZXJvLCBxdWFuZG8gZWxldmFkb3MgZXJyb3MgcG9zaXRpdm9zIGNhbmNlbGFtIGVsZXZhZG9zIGVycm9zIG5lZ2F0aXZvcyIgKFBJTkRZQ0sgZSBSVUJJTkZFTEQsIDIwMDQsIHAuNDQ3KS4NCg0KQWxndW5zIGF1dG9yZXMgdXRpbGl6YW0gZXN0YXMgZHVhcyDDumx0aW1hcyBtZWRpZGFzIGNvbSBvIHRlcm1vIGVudHJlIHBhcsOqbnRlc2VzIFwkIHtcbGVmdCgge1lfdFxecyAtIFlfdFxeYX0gXHJpZ2h0KX0gXCQgbmEgZm9ybWEgZGUgJ3ZhbG9yIGFic29sdXRvJyAkXGxlZnR8IHtcbGVmdCgge1lfdF5zIC0gWV90XmF9IFxyaWdodCl9IFxyaWdodHwkIC4gVGFsIHByb2NlZGltZW50byBhdXhpbGlhIGEgaW52ZXN0aWdhciBvIGVycm8gZGUgcHJldmlzw6NvIGRvIG1vZGVsbyBldml0YW5kbyBvcyBwcm9ibGVtYXMgZGUgJ2Vycm9zIHBvc2l0aXZvcycgY2FuY2VsYXJlbSAnZXJyb3MgbmVnYXRpdm9zJy4gRGVzdGEgZm9ybWEsIHN1cmdlbSBhcyBvdXRyYXMgZHVhcyBvcMOnw7VlczogTUFFIGUgTUFQRS4NCg0KIyMgRXJybyBBYnNvbHV0byBNw6lkaW8gKE1BRSkgZSBFcnJvIEFic29sdXRvIFBlcmNlbnR1YWwgTcOpZGlvIChNQVBFKQ0KDQpPIGVycm8gYWJzb2x1dG8gbcOpZGlvIChNQUUpIGNvbnNpZGVyYSBhIGV4cHJlc3PDo28gYW7DoWxvZ2EgZG8gZXJybyBkZSBzaW11bGHDp8OjbyBtw6lkaW8gY29tIG9zIHZhbG9yZXMgYWJzb2x1dG9zIGNvbW8gbmEgZXhwcmVzc8OjbzoNCg0KJCQNCk1BRSA9IFxmcmFjezF9e1R9XHN1bVxsaW1pdHNfe3QgPSAxfV5UIHtcbGVmdHwge1lfdF5zIC0gWV90XmF9IFxyaWdodHx9IA0KJCQNCg0KU2ltaWxhcm1lbnRlIGFvIGVycm8gcGVyY2VudHVhbCBtw6lkaW8sIG8gZXJybyBhYnNvbHV0byBwZXJjZW50dWFsIG3DqWRpbyAoTUFQRSkgc2Vyw6E6DQoNCiQkDQpNQVBFID0gMTAwLlxmcmFjezF9e1R9XHN1bVxsaW1pdHNfe3QgPSAxfV5UIHtcbGVmdHwge1xmcmFje3tcbGVmdCgge1lfdF5zIC0gWV90XmF9IFxyaWdodCl9fXt7WV90XmF9fX0gXHJpZ2h0fH0gDQokJA0KDQpEZXNlamFtLXNlIHZhbG9yZXMgYmFpeG9zIGRhcyBtZWRpZGFzLiBFbnRyZXRhbnRvLCDDqSBpbXBvcnRhbnRlIG9ic2VydmFyIHNlIG8gbW9kZWxvIGVzdMOhIGJlbSBhanVzdGFkbyBwYXJhIG9zICdwb250b3MgZGUgaW5mbGV4w6NvJyBub3MgZGFkb3MgKG9zY2lsYcOnw7VlcywgdmFsZXMgZSBwaWNvcyBxdWUgc2Ugb2JzZXJ2YW0gbm9zIGdyw6FmaWNvcyBwcmV2aXN0b3MgZSByZWFsaXphZG9zKS4NCg0KIyMgRXJybyBBYnNvbHV0byBQZXJjZW50dWFsIE3DqWRpbyBTaW3DqXRyaWNvIChzTUFQRSkNCg0KQXMgbWVkaWRhcyBkZSBhY3Vyw6FjaWEgdGlwbyBNQVBFIHTDqm0gYSBkZXN2YW50YWdlbSBkZSBwZW5hbGl6YXIgbWFpcyBvcyBlcnJvcyBuZWdhdGl2b3MgcXVlIG9zIHBvc2l0aXZvcy4gQXNzaW0sIHN1cmdlIGEgbWVkaWRhIHNNQVBFIG91IE1BUEUgInNpbcOpdHJpY28iIHByb3Bvc3RvIHBvciBBcm1zdHJvbmcgKDE5NzggLCBwLiAzNDgpLCBjaXRhZG8gcG9yIEh5bmRtYW4gZSBBdGhhbmFzb3BvdWxvcyAoMjAxOCkuIEVzdGEgbWVkaWRhIGZvaSB1dGlsaXphZGEgcGFyYSBlc2NvbGhhIGRvIG1lbGhvciBtb2RlbG8gbmEgY29tcGV0acOnw6NvIGRlIHByZXZpc8OjbyBkbyBNMyBkZSBNYWtyaWRha2lzICgkTV4zJCBjb21wZXRpdGlvbikuIEEgZXhwcmVzc8OjbyBwYXJhIGPDoWxjdWxvIMOpIGRvIHRpcG86DQoNCiQkDQpcdGV4dHtzTUFQRX0gPSBcdGV4dHttZWFufVxsZWZ0KDIwMHx7WV90XnMgLSBZX3ReYX18LyhZX3RecytZX3ReYSlccmlnaHQpDQokJA0KDQpFc3RhIG1lZGlkYSBuw6NvIGVzdMOhIGRpc3BvbmliaWxpemFkYSBkaXJldGFtZW50ZSBuYXMgc2HDrWRhcyBkbyBwYWNvdGUgYGZvcmVjYXN0YCBuZW0gbm8gYGZwcDJgLCBlbSB2aXJ0dWRlIGRhIGNyw610aWNhIGRlIEh5bmRtYW4gZSBBdGhhbmFzb3BvdWxvcyAoMjAxOCkgZW0gcXVlIGNpdGFtIEh5bmRtYW4gZSBLb2VobGVyICgyMDA2KS4gQSBtZWRpZGEgc01BUEUgcG9kZSBzZXIgb2J0aWRhIHBlbG9zIHBhY290ZXMgYE1ldHJpY3NgIG91IGBUU1ByZWRgLg0KDQojIyBFcnJvIGFic29sdXRvIG3DqWRpbyBlc2NhbG9uYWRvIChNQVNFKQ0KDQpQYXJhIHPDqXJpZXMgdGVtcG9yYWlzIHNhem9uYWlzLCB1bSBlcnJvIGVzY2Fsb25hZG8gcGFyYSBhIHNhem9uYWxpZGFkZSBwb2RlIHNlciBkZWZpbmlkbyB1c2FuZG8gcHJldmlzw7VlcyBpbmfDqm51YXMgc2F6b25haXMgKEh5bmRtYW4gZSBBdGhhbmFzb3BvdWxvcywgMjAyMSk6DQoNCiQkDQpxX3tqfSA9IFxmcmFje1xkaXNwbGF5c3R5bGUgZV97an19DQogICAge1xkaXNwbGF5c3R5bGVcZnJhY3sxfXtULW19XHN1bV97dD1tKzF9XlQgfHlfe3R9LXlfe3QtbX18fS4NCiQkDQoNCkEgbcOpdHJpY2EgTUFTRSBzZXLDoSBlbnTDo28gZGFkYSBwZWxhIGV4cHJlc3PDo286DQoNClwkXCQgXHRleHR7TUFTRX0gPSBcdGV4dHttZWFufShcfHFcX3tqfVx8KS4NCg0KXCRcJA0KDQojIyBjcml0w6lyaW9zIGRlIGluZm9ybWHDp8OjbywgQWthaWtlIChBSUMpLCBTY2h3YXJ6IChTSUMgb3UgQklDKSBlIEhhbm5hbi1RdWluIChIUSkNCg0KQSBpZGVpYSDDqSBxdWUgbm9zIGNyaXTDqXJpb3MgZGUgaW5mb3JtYcOnw6NvLCBhY3Jlc2NlbnRhbmRvIGxhZ3Mgc2UgcmVkdXogYSBzb21hIGRvcyByZXPDrWR1b3MgKHBvaXMgbWFpcyB2YXJpYcOnw6NvIMOpIGV4cGxpY2FkYSBubyBtb2RlbG8pLCBvdSBzZWphLCBmb2kgYWNyZXNjZW50YWRhIG1haXMgaW5mb3JtYcOnw6NvLiBNYXMgYWluZGEgZGV2ZS1zZSBwZW5hbGl6YXIgYSBhZGnDp8OjbyBkbyByZWdyZXNzb3IsIHVtYSBpZGVpYSBkZSByZWR1w6fDo28gZG9zIGdyYXVzIGRlIGxpYmVyZGFkZSBkbyBtb2RlbG8uDQoNCkVtIGdlcmFsLCBvcyBjcml0w6lyaW9zIHTDqm0gYSBzZWd1aW50ZSBleHByZXNzw6NvOiAkQz1sbs+DIMyCXjIgKFQpK2NfVCDPhihUKSQuDQoNCk8gcHJpbWVpcm8gdGVybW8gYXNzb2NpYSBhIHZhcmnDom5jaWEsIGUgc2V1IHZhbG9yIGRldmUgcmVkdXppciBjb20gbyBhdW1lbnRvIGRlIHZhcmnDoXZlaXMuIE5vIHNlZ3VuZG8gdGVybW8gdGVtLXNlOiAkY19UJCDDqSBvIG7Dum1lcm8gZGUgcGFyw6JtZXRyb3MgZXN0aW1hZG9zOyBlICTPhihUKSQgw6kgYSBvcmRlbSBkbyBwcm9jZXNzbyBxdWUgcGVuYWxpemEgbyBhY3LDqXNjaW1vIGRlIHZhcmnDoXZlaXMuIEFzc2ltLCBxdWFudG8gbWVub3IgQyBtZWxob3Igw6kgbyBtb2RlbG8sIG91IHNlamEsIHRlbSBtZW5vcyByZXPDrWR1b3MsIG1lbm9zIHBhcnRlIG7Do28gZXhwbGljYWRhLiBPIENyaXTDqXJpbyBkZSBJbmZvcm1hw6fDo28gZGUgQWthaWtlIChvdSBBSUMgZGUgQWthaWtlJ3MgSW5mb3JtYXRpb24gQ3JpdGVyaW9uKSBvdSBvIENyaXTDqXJpbyBkZSBJbmZvcm1hw6fDo28gZGUgU2Nod2FyeiBvdSBCYXllc2lhbm8gKG91IFNJQyBkZSBTY2h3YXJ6J3MgSW5mb3JtYXRpb24gQ3JpdGVyaW9uIG91IGVtIGFsZ3VucyBsaXZyb3MgQklDIGRlIEJheWVzaWFuIEluZm9ybWF0aW9uIENyaXRlcmlvbikgc8OjbyBleHByZXNzb3Mgbm8gRXZpZXdzIGRhIGZvcm1hIGrDoSBsb2dhcml0bWl6YWRhIGNvbW86DQoNCiQkQUlDID0gIC0gXGZyYWN7ezJsfX17bn0gKyBcZnJhY3t7Mmt9fXtufSQkDQoNCiQkU0lDID0gIC0gXGZyYWN7ezJsfX17bn0gKyBcZnJhY3t7ay5cbG9nIG59fXtufSQkDQoNCiQkDQpsID0gLSB7XGZyYWN7bn17Mn19DQp7XGxlZnQoIHsxICsgXGxvZygyXHBpKStcbG9nIFxsZWZ0KCB7XGZyYWN7e1xoYXQgXHZhcmVwc2lsb24gXlxwcmltZSBcaGF0IFx2YXJlcHNpbG9uIH19e259fSBccmlnaHQpfSBccmlnaHQpfQ0KJCQNCg0KRW0gcXVlOiBrIMOpIG8gbsO6bWVybyBkZSByZWdyZXNzb3JlcyBpbmNsdWluZG8tc2UgbyBpbnRlcmNlcHRvOyBuIMOpIG8gbsO6bWVybyBkZSBvYnNlcnZhw6fDtWVzOyBsIMOpIG8gbG9nIFZlcm9zc2ltaWxoYW7Dp2EgZGEgcmVncmVzc8OjbzsgZSAkXGhhdCBcdmFyZXBzaWxvbiQgc8OjbyBvcyByZXPDrWR1b3MgZXN0aW1hZG9zIGRvIG1vZGVsby4gTm8gZm9ybWF0byBtYWlzIHNpbXBsaWZpY2FkbyBleHBvc3RvIHBvciBHcmVlbmUgKDIwMDIpLCB0ZW0tc2UgaWd1YWwgYW8gZGUgQnVlbm8gKDIwMDgsIHAuNDcpOg0KDQokJA0KXGJlZ2lue2FycmF5fXtsfQ0KU0lDID0gQklDXGxlZnQoIHtwLHF9IFxyaWdodCkgPSBcbG4ge3tcaGF0IFxzaWdtYSB9XjJ9ICsga1xmcmFje3tcbG4gVH19e1R9XFwNCnt7XGhhdCBcc2lnbWEgfV4yfSA9IFxmcmFje3tcc3VtXG5vbGltaXRzX3t0ID0gMX1eVCB7XGhhdCBcdmFyZXBzaWxvbiBfdF4yfSB9fXtUfQ0KXGVuZHthcnJheX0NCiQkDQoNCkVtIHF1ZSBrPXArcSsxIHNlIGhvdXZlciBpbnRlcmNlcHRvLg0KDQokJA0KQUlDXGxlZnQoIHtwLHF9IFxyaWdodCkgPSBcbG4ge3tcaGF0IFxzaWdtYSB9XjJ9ICsga1xmcmFje3syfX17VH0NCiQkDQoNCiQkDQpIUVxsZWZ0KCB7cCxxfSBccmlnaHQpID0gXGxuIHt7XGhhdCBcc2lnbWEgfV4yfSArIGtcZnJhY3syfXtUfSBcbG4gVA0KJCQNCg0KUXVhbnRvIG1haXMgcGFyw6JtZXRyb3Mgc8OjbyBlc3RpbWFkb3MsIG1lbm9yIHNlcsOhIG8gZXJybyBlc3RpbWFkbywgbWFzIGlzdG8gw6kgcGVuYWxpemFkbyBubyBzZWd1bmRvIHRlcm1vIGRvcyBjcml0w6lyaW9zLiBEZXNlam8gbWVub3JlcyB2YWxvcmVzIGRvcyBjcml0w6lyaW9zLiBPIEJJQyDDqSBjb25zaXN0ZW50ZSBhc3NpbnRvdGljYW1lbnRlLCBlIG8gQUlDIGZ1bmNpb25hIG1lbGhvciBlbSBwZXF1ZW5hcyBhbW9zdHJhcywgbWFzIMOpIHBpb3IgY29tIG1haXMgcGFyw6JtZXRyb3MuIErDoSBvIEhRIMOpIG1lbm9zIGZvcnRlIHF1ZSBvIEJJQywgb3Ugc2VqYSwgbyBwcmVmZXJpZG8gw6kgbyBCSUMuDQoNClBvZGVtb3MgcmVzdW1pciBvcyByZXN1bHRhZG9zIGRlIGFjdXLDoWNpYSBwYXJhIHZpc3VhbGl6YXIgcXVlIG8gSFcgcmVhbG1lbnRlIGZvaSBvIG1lbGhvciBtb2RlbG8gZW0gdGVybW9zIGRlIEFJQ2MsIG8gbWVub3IsIGUgbmFzIG3DqXRyaWNhcyBkZSBhY3Vyw6FjaWEsIHRhbWLDqW0gbyBtZW5vciBwcmluY2lwYWxtZW50ZSBvbGhhbmRvIG8gUk1TRSBlIE1BU0UgKEZpZ3VyYSAxKS4NCg0KRmlndXJhIDEuIFJlc3VtbyBkb3MgcmVzdWx0YWRvcyBkb3MgY3JpdMOpcmlvcyBkZSBpbmZvcm1hw6fDo28gZSBkYXMgbcOpdHJpY2FzIGRlIGFjdXLDoWNpYSwgbW9kZWxvcyBTRVMsIEhvbHQgZSBIb2x0LVdpbnRlcnMuDQoNCiFbRm9udGU6IEVsYWJvcmHDp8OjbyBwcsOzcHJpYS5dKGFjdXJhY2lhLnBuZykNCg0KIyBSZWZlcsOqbmNpYXMNCg0KSFlORE1BTiwgUm9iLiAoMjAxOCkuIGZwcDI6IERhdGEgZm9yICJGb3JlY2FzdGluZzogUHJpbmNpcGxlcyBhbmQgUHJhY3RpY2UiICgybmQgRWRpdGlvbikuIFIgcGFja2FnZSB2ZXJzaW9uIDIuMy4gRGlzcG9uw612ZWwgZW06IDxodHRwczovL0NSQU4uUi1wcm9qZWN0Lm9yZy9wYWNrYWdlPWZwcDI+Lg0KDQpIWU5ETUFOLCBSLkouLCAmIEFUSEFOQVNPUE9VTE9TLCBHLiAoMjAxOCkgRm9yZWNhc3Rpbmc6IHByaW5jaXBsZXMgYW5kIHByYWN0aWNlLCAybmQgZWRpdGlvbiwgT1RleHRzOiBNZWxib3VybmUsIEF1c3RyYWxpYS4gRGlzcG9uw612ZWwgZW06IDxodHRwczovL290ZXh0cy5jb20vZnBwMi8+LiBBY2Nlc3NlZCBvbiAyNyBNYXIgMjAyMy4NCg0KSFlORE1BTiwgUi5KLiwgJiBBVEhBTkFTT1BPVUxPUywgRy4gKDIwMjEpIEZvcmVjYXN0aW5nOiBwcmluY2lwbGVzIGFuZCBwcmFjdGljZSwgM3JkIGVkaXRpb24sIE9UZXh0czogTWVsYm91cm5lLCBBdXN0cmFsaWEuIERpc3BvbsOtdmVsIGVtOiA8aHR0cHM6Ly9vdGV4dHMuY29tL2ZwcDMvPi4NCg0KTU9SRVRUSU4sIFBlZHJvIEEuOyBUT0xPSSwgQ2zDqWxpYSBNLkMuIEFuw6FsaXNlIGRlIFPDqXJpZXMgVGVtcG9yYWlzLiBTw6NvIHBhdWxvOiBFZGl0b3JhIEVkZ2FyZCBCbMO8Y2hlciwgMjAwNC4gPGh0dHBzOi8vd3d3LmltZS51c3AuYnIvfnBhbS9zdC8+DQo=