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.
Citação
Sugestão de citação: FIGUEIREDO, Adriano Marcos Rodrigues. Séries Temporais com R: Modelo híbrido de Hyndman e Athanasopoulos (2018). Campo Grande-MS,Brasil: RStudio/Rpubs, 2019. Disponível em http://rpubs.com/amrofi/combination_forecast.
Introdução
Este artigo procura ilustrar os procedimentos para trabalhar com métodos de séries temporais para combinações de forecasts, baseado em Hyndman e Athanasopoulos(2018), capítulo 12.
A combinação de forecasts, ou também chamado de modelo híbrido de previsão, tem por ideia básica a combinação de forecasts de diferentes métodos. Por exemplo, na postagem de Peter Ellis (ELLIS, 2015), mostra-se que os modelos com combinação de forecasts podem ter melhores resultados que os melhores modelos da competição M3 de forecasts (competição de Spyros Makridakis e Michele Hibon, em que testaram vários métodos de previsão para 3.003 séries temporais) (Figura 1).
Conforme citados por Hyndman e Athanasopoulos (2018), os estudos de Bates & Granger (1969) e Clemen (1989) evidenciam que as combinações de forecasts de diferentes métodos levam a aumentos na acurácia e precisão das estimativas combinadas. De outro lado, mesmo simples médias das estimativas já melhoram as previsões combinadas comparativamente às previsões dos métodos por si sós.
Dados
Seja o exemplo de Hyndman e Athanasopoulos (2018), de gasto mensal com alimentação fora da Austrália, de abril de 1982 a setembro de 2017 (dados mensais).
Usando previsões dos modelos ETS (Error Trend Seasonal), ARIMA, STL-ETS (Seasonal and Trend decomposition using Loess), NNAR (Neural Network AutoRegression) e TBATS (Exponential Smoothing Method + Box-Cox Transformation + ARMA model for residuals + Trigonometric Seasonal); comparam-se os resultados usando os últimos 5 anos (60 meses) de observações.
Separando amostras
Treino até Set/2012
Separando treino e tamanho do forecast de h para o comprimento do fim da série.
library(fpp2)
train <- window(auscafe, end = c(2012, 9))
h <- length(auscafe) - length(train)
Estimativas
ETS
Error Trend Seasonal
ETS <- forecast(ets(train), h = h)
ARIMA
Autoregressive Integrated Moving Average
ARIMA <- forecast(auto.arima(train, lambda = 0, biasadj = TRUE, stepwise = FALSE,
approximation = FALSE), h = h)
STL-ETS
Seasonal and Trend decomposition using Loess
STL <- stlf(train, lambda = 0, h = h, biasadj = TRUE)
NNAR
Neural Network AutoRegression
NNAR <- forecast(nnetar(train), h = h)
TBATS
Exponential Smoothing Method + Box-Cox Transformation + ARMA model for residuals + Trigonometric Seasonal
TBATS <- forecast(tbats(train, biasadj = TRUE), h = h)
Gráfico
autoplot(auscafe) + autolayer(ETS, series = "ETS", PI = FALSE) + autolayer(ARIMA,
series = "ARIMA", PI = FALSE) + autolayer(STL, series = "STL", PI = FALSE) +
autolayer(NNAR, series = "NNAR", PI = FALSE) + autolayer(TBATS, series = "TBATS",
PI = FALSE) + autolayer(Combination, series = "Combination") + xlab("Year") +
ylab("$ billion") + ggtitle("Gastos mensais Australianos com alimentação fora do domicílio")

Previsões pontuais de vários métodos aplicados ao gasto mensal australiano em comer fora.
Acurácia
Neste exemplo, apresentamos apenas a estatística RMSE, mas outras poderiam ser utilizadas.
c(ETS = accuracy(ETS, auscafe)["Test set", "RMSE"], ARIMA = accuracy(ARIMA,
auscafe)["Test set", "RMSE"], `STL-ETS` = accuracy(STL, auscafe)["Test set",
"RMSE"], NNAR = accuracy(NNAR, auscafe)["Test set", "RMSE"], TBATS = accuracy(TBATS,
auscafe)["Test set", "RMSE"], Combination = accuracy(Combination, auscafe)["Test set",
"RMSE"])
ETS ARIMA STL-ETS NNAR TBATS Combination
0.13699696 0.12146220 0.21446157 0.30645862 0.09406039 0.07128923
O TBATS se sai particularmente bem com essa série, mas a abordagem combinada é ainda melhor. Para outros dados, o TBATS pode ser bastante ruim, enquanto a abordagem combinada é quase sempre próxima ou melhor do que o melhor método de componente.
Referências
BATES, J. M., & GRANGER, C. W. J. (1969). The combination of forecasts. Operational Research Quarterly, 20(4), 451–468. Disponível em: https://doi.org/10.1057/jors.1969.103
CLEMEN, R. (1989). Combining forecasts: A review and annotated bibliography with discussion. International Journal of Forecasting, 5, 559–608. Disponível em: https://doi.org/10.1016/0169-2070(89)90012-5
ELLIS, Peter. X13-SEATS-ARIMA as an automated forecasting tool. 2015. Disponível em: https://www.r-bloggers.com/x13-seats-arima-as-an-automated-forecasting-tool/ e http://freerangestats.info/blog/2015/12/21/m3-and-x13.
GAILLARD, Pierre; GOUDE, Yannig. opera: Online Prediction by Expert Aggregation. R package version 1.0. 2016. Disponível em: https://CRAN.R-project.org/package=opera.
HYNDMAN, Rob J. R packages for forecast combinations. 2016. Disponível em:https://robjhyndman.com/hyndsight/forecast-combinations/
HYNDMAN, Rob J.; ATHANASOPOULOS, George . Forecasting: principles and practice. 2nd ed. Otexts, 2018. Disponível em: https://otexts.org/fpp2/.
SHAUB, David; ELLIS, Peter. forecastHybrid: Convenient Functions for Ensemble Time Series Forecasts. R package version 3.0.14. 2018. Disponível em: https://CRAN.R-project.org/package=forecastHybrid.
SHAUB, David; ELLIS, Peter.forecastHybrid: vignette. 2016. Disponível em: https://cran.r-project.org/web/packages/forecastHybrid/vignettes/forecastHybrid.html.
LS0tDQp0aXRsZTogIlPDqXJpZXMgVGVtcG9yYWlzIGNvbSBSOiBNb2RlbG8gaMOtYnJpZG8gZGUgSHluZG1hbiBlIEF0aGFuYXNvcG91bG9zICgyMDE4KSINCmF1dGhvcjogIkFkcmlhbm8gTWFyY29zIFJvZHJpZ3VlcyBGaWd1ZWlyZWRvLCAqZS1tYWlsOiBhZHJpYW5vLmZpZ3VlaXJlZG9AdWZtcy5icioiDQpsaW5rY29sb3I6IGJsdWUNCmFic3RyYWN0OiANCiAgVGhpcyBpcyBhbiB1bmRlcmdyYWQgc3R1ZGVudCBsZXZlbCBpbnN0cnVjdGlvbiBmb3IgY2xhc3MgdXNlLiAgV2UgdHJ5IHRvIGlsdXN0cmF0ZSB0aW1lIHNlcmllcyBtZXRob2RzIHdpdGggaHlicmlkIG1vZGVscywgZm9sbG93aW5nIEh5bmRtYW4gZSBBdGhhbmFzb3BvdWxvcyAoMjAxOCkgY2hhcHRlciAxMi4NCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVkICVCICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0aGVtZTogZGVmYXVsdA0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQ0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCi0tLQ0KDQoNCmBgYHtyIGtuaXRyX2luaXQsIGVjaG89RkFMU0UsIGNhY2hlPUZBTFNFfQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkocm1hcmtkb3duKQ0KbGlicmFyeShybWRmb3JtYXRzKQ0KDQojIyBHbG9iYWwgb3B0aW9ucw0Kb3B0aW9ucyhtYXgucHJpbnQ9IjEwMCIpDQpvcHRzX2NodW5rJHNldChlY2hvPVRSVUUsDQoJICAgICAgICAgICAgIGNhY2hlPVRSVUUsDQogICAgICAgICAgICAgICBwcm9tcHQ9RkFMU0UsDQogICAgICAgICAgICAgICB0aWR5PVRSVUUsDQogICAgICAgICAgICAgICBjb21tZW50PU5BLA0KICAgICAgICAgICAgICAgbWVzc2FnZT1GQUxTRSwNCiAgICAgICAgICAgICAgIHdhcm5pbmc9RkFMU0UpDQpvcHRzX2tuaXQkc2V0KHdpZHRoPTEwMCkNCmBgYA0KDQoNCkxpY2Vuw6dhIHstI0xpY2Vuw6dhfQ0KPT09PT09PT09PT09PT09PT09PQ0KDQpUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiBUbyB2aWV3IGEgY29weSBvZiB0aGlzIGxpY2Vuc2UsIHZpc2l0IDxodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvPiBvciBzZW5kIGEgbGV0dGVyIHRvIENyZWF0aXZlIENvbW1vbnMsIFBPIEJveCAxODY2LCBNb3VudGFpbiBWaWV3LCBDQSA5NDA0MiwgVVNBLg0KDQohW0xpY2Vuc2U6IENDIEJZLVNBIDQuMF0oaHR0cHM6Ly9taXJyb3JzLmNyZWF0aXZlY29tbW9ucy5vcmcvcHJlc3NraXQvYnV0dG9ucy84OHgzMS9wbmcvYnktc2EucG5nKXsgd2lkdGg9MjUlIH0NCg0KQ2l0YcOnw6NvIHstI0NpdGHDp8Ojb30NCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNClN1Z2VzdMOjbyBkZSBjaXRhw6fDo286DQpGSUdVRUlSRURPLCBBZHJpYW5vIE1hcmNvcyBSb2RyaWd1ZXMuIFPDqXJpZXMgVGVtcG9yYWlzIGNvbSBSOiBNb2RlbG8gaMOtYnJpZG8gZGUgSHluZG1hbiBlIEF0aGFuYXNvcG91bG9zICgyMDE4KS4gQ2FtcG8gR3JhbmRlLU1TLEJyYXNpbDogUlN0dWRpby9ScHVicywgMjAxOS4gRGlzcG9uw612ZWwgZW0gPGh0dHA6Ly9ycHVicy5jb20vYW1yb2ZpL2NvbWJpbmF0aW9uX2ZvcmVjYXN0Pi4gDQoNCkludHJvZHXDp8Ojbw0KPT09PT09PT09PT09PT09PT09PQ0KDQoNCkVzdGUgYXJ0aWdvIHByb2N1cmEgaWx1c3RyYXIgb3MgcHJvY2VkaW1lbnRvcyBwYXJhIHRyYWJhbGhhciBjb20gbcOpdG9kb3MgZGUgc8OpcmllcyB0ZW1wb3JhaXMgcGFyYSBjb21iaW5hw6fDtWVzIGRlIGZvcmVjYXN0cywgYmFzZWFkbyBlbSBIeW5kbWFuIGUgQXRoYW5hc29wb3Vsb3MoMjAxOCksIGNhcMOtdHVsbyAxMi4NCg0KQSBjb21iaW5hw6fDo28gZGUgZm9yZWNhc3RzLCBvdSB0YW1iw6ltIGNoYW1hZG8gZGUgbW9kZWxvIGjDrWJyaWRvIGRlIHByZXZpc8OjbywgdGVtIHBvciBpZGVpYSBiw6FzaWNhIGEgY29tYmluYcOnw6NvIGRlIGZvcmVjYXN0cyBkZSBkaWZlcmVudGVzIG3DqXRvZG9zLiBQb3IgZXhlbXBsbywgbmEgcG9zdGFnZW0gZGUgUGV0ZXIgRWxsaXMgKEVMTElTLCAyMDE1KSwgbW9zdHJhLXNlIHF1ZSBvcyBtb2RlbG9zIGNvbSBjb21iaW5hw6fDo28gZGUgZm9yZWNhc3RzIHBvZGVtIHRlciBtZWxob3JlcyByZXN1bHRhZG9zIHF1ZSBvcyBtZWxob3JlcyBtb2RlbG9zIGRhIGNvbXBldGnDp8OjbyBNMyBkZSBmb3JlY2FzdHMgKGNvbXBldGnDp8OjbyBkZSBTcHlyb3MgTWFrcmlkYWtpcyBlIE1pY2hlbGUgSGlib24sIGVtIHF1ZSB0ZXN0YXJhbSB2w6FyaW9zIG3DqXRvZG9zIGRlIHByZXZpc8OjbyBwYXJhIDMuMDAzIHPDqXJpZXMgdGVtcG9yYWlzKSAoRmlndXJhIDEpLiANCg0KYGBge3IgcHJlc3N1cmUsIGVjaG89RkFMU0UsIGZpZy5jYXA9IkNvbXBhcmHDp8OjbyBkZSBtw6l0b2RvcyBkZSBwcmV2aXPDo28gZGEgY29tcGV0acOnw6NvIE0zLiBGb250ZTogRUxMSVMsIDIwMTUiLCBvdXQud2lkdGggPSAnMTAwJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiY29tYmluYXRpb25zLlBORyIpDQpgYGANCg0KQ29uZm9ybWUgY2l0YWRvcyBwb3IgSHluZG1hbiBlIEF0aGFuYXNvcG91bG9zICgyMDE4KSwgb3MgZXN0dWRvcyBkZSBCYXRlcyAmIEdyYW5nZXIgKDE5NjkpIGUgQ2xlbWVuICgxOTg5KSBldmlkZW5jaWFtIHF1ZSBhcyBjb21iaW5hw6fDtWVzIGRlIGZvcmVjYXN0cyBkZSBkaWZlcmVudGVzIG3DqXRvZG9zIGxldmFtIGEgYXVtZW50b3MgbmEgYWN1csOhY2lhIGUgcHJlY2lzw6NvIGRhcyBlc3RpbWF0aXZhcyBjb21iaW5hZGFzLiBEZSBvdXRybyBsYWRvLCBtZXNtbyBzaW1wbGVzIG3DqWRpYXMgZGFzIGVzdGltYXRpdmFzIGrDoSBtZWxob3JhbSBhcyBwcmV2aXPDtWVzIGNvbWJpbmFkYXMgY29tcGFyYXRpdmFtZW50ZSDDoHMgcHJldmlzw7VlcyBkb3MgbcOpdG9kb3MgcG9yIHNpIHPDs3MuICAgICANCg0KDQpEYWRvcw0KPT09PT09PT09PT09PT09PT09PT09PT0NClNlamEgbyBleGVtcGxvIGRlIEh5bmRtYW4gZSBBdGhhbmFzb3BvdWxvcyAoMjAxOCksIGRlIGdhc3RvIG1lbnNhbCBjb20gYWxpbWVudGHDp8OjbyBmb3JhIGRhIEF1c3Ryw6FsaWEsIGRlIGFicmlsIGRlIDE5ODIgYSBzZXRlbWJybyBkZSAyMDE3IChkYWRvcyBtZW5zYWlzKS4gICAgIA0KDQpVc2FuZG8gcHJldmlzw7VlcyBkb3MgbW9kZWxvcyBFVFMgKF9FcnJvciBUcmVuZCBTZWFzb25hbF8pLCBBUklNQSwgU1RMLUVUUyAoX1NlYXNvbmFsIGFuZCBUcmVuZCBkZWNvbXBvc2l0aW9uIHVzaW5nIExvZXNzXyksIE5OQVIgKF9OZXVyYWwgTmV0d29yayBBdXRvUmVncmVzc2lvbl8pIGUgVEJBVFMgKF9FeHBvbmVudGlhbCBTbW9vdGhpbmcgTWV0aG9kICsgQm94LUNveCBUcmFuc2Zvcm1hdGlvbiArIEFSTUEgbW9kZWwgZm9yIHJlc2lkdWFscyArIFRyaWdvbm9tZXRyaWMgU2Vhc29uYWxfKTsgY29tcGFyYW0tc2Ugb3MgcmVzdWx0YWRvcyB1c2FuZG8gb3Mgw7psdGltb3MgNSBhbm9zICg2MCBtZXNlcykgZGUgb2JzZXJ2YcOnw7Vlcy4NCg0KIyMgU2VwYXJhbmRvIGFtb3N0cmFzDQoNCiMjIyBUcmVpbm8gYXTDqSBTZXQvMjAxMg0KDQpTZXBhcmFuZG8gdHJlaW5vIGUgdGFtYW5obyBkbyBmb3JlY2FzdCBkZSBfaF8gcGFyYSBvIGNvbXByaW1lbnRvIGRvIGZpbSBkYSBzw6lyaWUuDQoNCmBgYHtyfQ0KbGlicmFyeShmcHAyKQ0KdHJhaW4gPC0gd2luZG93KGF1c2NhZmUsIGVuZD1jKDIwMTIsOSkpDQpoIDwtIGxlbmd0aChhdXNjYWZlKSAtIGxlbmd0aCh0cmFpbikNCmBgYA0KDQojIyBFc3RpbWF0aXZhcyANCg0KIyMjIEVUUyANCg0KX0Vycm9yIFRyZW5kIFNlYXNvbmFsXw0KDQpgYGB7cn0NCkVUUyA8LSBmb3JlY2FzdChldHModHJhaW4pLCBoPWgpDQpgYGANCg0KIyMjIEFSSU1BDQoNCl9BdXRvcmVncmVzc2l2ZSBJbnRlZ3JhdGVkIE1vdmluZyBBdmVyYWdlXw0KDQpgYGB7cn0NCkFSSU1BIDwtIGZvcmVjYXN0KGF1dG8uYXJpbWEodHJhaW4sIGxhbWJkYT0wLCBiaWFzYWRqPVRSVUUsc3RlcHdpc2U9RkFMU0UsIGFwcHJveGltYXRpb249RkFMU0UpLA0KICBoPWgpDQpgYGANCg0KIyMjIFNUTC1FVFMgDQoNCl9TZWFzb25hbCBhbmQgVHJlbmQgZGVjb21wb3NpdGlvbiB1c2luZyBMb2Vzc18NCg0KYGBge3J9DQpTVEwgPC0gc3RsZih0cmFpbiwgbGFtYmRhPTAsIGg9aCwgYmlhc2Fkaj1UUlVFKQ0KYGBgDQoNCiMjIyBOTkFSIA0KDQpfTmV1cmFsIE5ldHdvcmsgQXV0b1JlZ3Jlc3Npb25fICANCg0KYGBge3J9DQpOTkFSIDwtIGZvcmVjYXN0KG5uZXRhcih0cmFpbiksIGg9aCkNCmBgYA0KDQojIyMgVEJBVFMgDQoNCl9FeHBvbmVudGlhbCBTbW9vdGhpbmcgTWV0aG9kICsgQm94LUNveCBUcmFuc2Zvcm1hdGlvbiArIEFSTUEgbW9kZWwgZm9yIHJlc2lkdWFscyArIFRyaWdvbm9tZXRyaWMgU2Vhc29uYWxfDQoNCmBgYHtyfQ0KVEJBVFMgPC0gZm9yZWNhc3QodGJhdHModHJhaW4sIGJpYXNhZGo9VFJVRSksIGg9aCkNCmBgYA0KDQojIyMgQ29tYmluYcOnw6NvIHBvciBtw6lkaWEgc2ltcGxlcw0KDQpgYGB7cn0NCkNvbWJpbmF0aW9uIDwtIChFVFNbWyJtZWFuIl1dICsgQVJJTUFbWyJtZWFuIl1dICsNCiAgU1RMW1sibWVhbiJdXSArIE5OQVJbWyJtZWFuIl1dICsgVEJBVFNbWyJtZWFuIl1dKS81DQpgYGANCg0KIyMgR3LDoWZpY28NCg0KYGBge3J9DQphdXRvcGxvdChhdXNjYWZlKSArDQogIGF1dG9sYXllcihFVFMsIHNlcmllcz0iRVRTIiwgUEk9RkFMU0UpICsNCiAgYXV0b2xheWVyKEFSSU1BLCBzZXJpZXM9IkFSSU1BIiwgUEk9RkFMU0UpICsNCiAgYXV0b2xheWVyKFNUTCwgc2VyaWVzPSJTVEwiLCBQST1GQUxTRSkgKw0KICBhdXRvbGF5ZXIoTk5BUiwgc2VyaWVzPSJOTkFSIiwgUEk9RkFMU0UpICsNCiAgYXV0b2xheWVyKFRCQVRTLCBzZXJpZXM9IlRCQVRTIiwgUEk9RkFMU0UpICsNCiAgYXV0b2xheWVyKENvbWJpbmF0aW9uLCBzZXJpZXM9IkNvbWJpbmF0aW9uIikgKw0KICB4bGFiKCJZZWFyIikgKyB5bGFiKCIkIGJpbGxpb24iKSArDQogIGdndGl0bGUoIkdhc3RvcyBtZW5zYWlzIEF1c3RyYWxpYW5vcyBjb20gYWxpbWVudGHDp8OjbyBmb3JhIGRvIGRvbWljw61saW8iKQ0KYGBgICAgICANCg0KUHJldmlzw7VlcyBwb250dWFpcyBkZSB2w6FyaW9zIG3DqXRvZG9zIGFwbGljYWRvcyBhbyBnYXN0byBtZW5zYWwgYXVzdHJhbGlhbm8gZW0gY29tZXIgZm9yYS4NCg0KIyMgQWN1csOhY2lhDQogICAgDQpOZXN0ZSBleGVtcGxvLCBhcHJlc2VudGFtb3MgYXBlbmFzIGEgZXN0YXTDrXN0aWNhIFJNU0UsIG1hcyBvdXRyYXMgcG9kZXJpYW0gc2VyIHV0aWxpemFkYXMuICAgIA0KDQpgYGB7cn0NCmMoRVRTID0gYWNjdXJhY3koRVRTLCBhdXNjYWZlKVsiVGVzdCBzZXQiLCJSTVNFIl0sDQogIEFSSU1BID0gYWNjdXJhY3koQVJJTUEsIGF1c2NhZmUpWyJUZXN0IHNldCIsIlJNU0UiXSwNCiAgYFNUTC1FVFNgID0gYWNjdXJhY3koU1RMLCBhdXNjYWZlKVsiVGVzdCBzZXQiLCJSTVNFIl0sDQogIE5OQVIgPSBhY2N1cmFjeShOTkFSLCBhdXNjYWZlKVsiVGVzdCBzZXQiLCJSTVNFIl0sDQogIFRCQVRTID0gYWNjdXJhY3koVEJBVFMsIGF1c2NhZmUpWyJUZXN0IHNldCIsIlJNU0UiXSwNCiAgQ29tYmluYXRpb24gPQ0KICAgIGFjY3VyYWN5KENvbWJpbmF0aW9uLCBhdXNjYWZlKVsiVGVzdCBzZXQiLCJSTVNFIl0pDQpgYGANCg0KTyBUQkFUUyBzZSBzYWkgcGFydGljdWxhcm1lbnRlIGJlbSBjb20gZXNzYSBzw6lyaWUsIG1hcyBhIGFib3JkYWdlbSBjb21iaW5hZGEgw6kgYWluZGEgbWVsaG9yLiBQYXJhIG91dHJvcyBkYWRvcywgbyBUQkFUUyBwb2RlIHNlciBiYXN0YW50ZSBydWltLCBlbnF1YW50byBhIGFib3JkYWdlbSBjb21iaW5hZGEgw6kgcXVhc2Ugc2VtcHJlIHByw7N4aW1hIG91IG1lbGhvciBkbyBxdWUgbyBtZWxob3IgbcOpdG9kbyBkZSBjb21wb25lbnRlLg0KDQpSZWZlcsOqbmNpYXMgey0jUmVmZXLDqm5jaWFzfQ0KPT09PT09PT09PT09PT09PT0NCg0KQkFURVMsIEouIE0uLCAmIEdSQU5HRVIsIEMuIFcuIEouICgxOTY5KS4gVGhlIGNvbWJpbmF0aW9uIG9mIGZvcmVjYXN0cy4gT3BlcmF0aW9uYWwgUmVzZWFyY2ggUXVhcnRlcmx5LCAyMCg0KSwgNDUx4oCTNDY4LiBEaXNwb27DrXZlbCBlbTogPGh0dHBzOi8vZG9pLm9yZy8xMC4xMDU3L2pvcnMuMTk2OS4xMDM+DQoNCkNMRU1FTiwgUi4gKDE5ODkpLiBDb21iaW5pbmcgZm9yZWNhc3RzOiBBIHJldmlldyBhbmQgYW5ub3RhdGVkIGJpYmxpb2dyYXBoeSB3aXRoIGRpc2N1c3Npb24uIEludGVybmF0aW9uYWwgSm91cm5hbCBvZiBGb3JlY2FzdGluZywgNSwgNTU54oCTNjA4LiBEaXNwb27DrXZlbCBlbTogPGh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2LzAxNjktMjA3MCg4OSk5MDAxMi01Pg0KDQpFTExJUywgUGV0ZXIuIFgxMy1TRUFUUy1BUklNQSBhcyBhbiBhdXRvbWF0ZWQgZm9yZWNhc3RpbmcgdG9vbC4gMjAxNS4gRGlzcG9uw612ZWwgZW06IDxodHRwczovL3d3dy5yLWJsb2dnZXJzLmNvbS94MTMtc2VhdHMtYXJpbWEtYXMtYW4tYXV0b21hdGVkLWZvcmVjYXN0aW5nLXRvb2wvPiBlIDxodHRwOi8vZnJlZXJhbmdlc3RhdHMuaW5mby9ibG9nLzIwMTUvMTIvMjEvbTMtYW5kLXgxMz4uDQoNCkdBSUxMQVJELCBQaWVycmU7IEdPVURFLCBZYW5uaWcuIG9wZXJhOiBPbmxpbmUgUHJlZGljdGlvbiBieSBFeHBlcnQgQWdncmVnYXRpb24uIFIgcGFja2FnZSB2ZXJzaW9uIDEuMC4gMjAxNi4gRGlzcG9uw612ZWwgZW06IDxodHRwczovL0NSQU4uUi1wcm9qZWN0Lm9yZy9wYWNrYWdlPW9wZXJhPi4NCg0KSFlORE1BTiwgUm9iIEouIFIgcGFja2FnZXMgZm9yIGZvcmVjYXN0IGNvbWJpbmF0aW9ucy4gMjAxNi4gRGlzcG9uw612ZWwgZW06PGh0dHBzOi8vcm9iamh5bmRtYW4uY29tL2h5bmRzaWdodC9mb3JlY2FzdC1jb21iaW5hdGlvbnMvPg0KDQpIWU5ETUFOLCBSb2IgSi47IEFUSEFOQVNPUE9VTE9TLCBHZW9yZ2UgLiBGb3JlY2FzdGluZzogcHJpbmNpcGxlcyBhbmQgcHJhY3RpY2UuIDJuZCBlZC4gT3RleHRzLCAyMDE4LiBEaXNwb27DrXZlbCBlbTogPGh0dHBzOi8vb3RleHRzLm9yZy9mcHAyLz4uDQoNClNIQVVCLCAgRGF2aWQ7IEVMTElTLCBQZXRlci4gZm9yZWNhc3RIeWJyaWQ6IENvbnZlbmllbnQgRnVuY3Rpb25zIGZvciBFbnNlbWJsZSBUaW1lIFNlcmllcyBGb3JlY2FzdHMuIFIgcGFja2FnZSB2ZXJzaW9uIDMuMC4xNC4gMjAxOC4gRGlzcG9uw612ZWwgZW06IDxodHRwczovL0NSQU4uUi1wcm9qZWN0Lm9yZy9wYWNrYWdlPWZvcmVjYXN0SHlicmlkPi4NCg0KU0hBVUIsICBEYXZpZDsgRUxMSVMsIFBldGVyLmZvcmVjYXN0SHlicmlkOiB2aWduZXR0ZS4gMjAxNi4gRGlzcG9uw612ZWwgZW06IDxodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvZm9yZWNhc3RIeWJyaWQvdmlnbmV0dGVzL2ZvcmVjYXN0SHlicmlkLmh0bWw+Lg==