Forecast Pronóstico
Definición: Declaración sobre el valor futuro de una
variable de interés.
Ejemplo: Walt Disney World tiene un departamento de 20
personas, dedicadas a realizar pronósticos de visitas para realizar
pedidos de bebidas y alimentos.
Lema: Los pronósticos NO son perfectos.
Elementos para un mejor pronóstico:
- Horizonte de tiempo
- Preciso
- Confiable
- Unidades significativas
- Simple de entender y usar
- Costo-beneficio
6 Pasos para realizar un pronóstico:
- Determinar el propósito
- Establecer horizonte de tiempo
- Obtener, limpiar y analizar datos apropiados
- Seleccionar técnica para pronosticar
- Realizar el pronóstico
- Monitorear el error del pronóstico
Error: es la diferencia entre el valor real y el
valor pronóstico.
Formula de Error
\[
\text{Error} = \text{Valor Real} - \text{Valor Pronosticado}
\]
Mean Absolute Deviation (MAD)
\[
MAD = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i|
\]
Mean Squared Error (MAD)
\[
MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2
\]
Mean Absolute Percent Error (MAPE)
\[
MAPE = \frac{1}{n} \sum_{i=1}^{n} \left| \frac{y_i - \hat{y}_i}{y_i}
\right| \times 100\%
\]
Series de Tiempo: Los pronósticos se observan en
Series de Tiempo.
Los 5 Patrones en las Series de Tiempo son:

- Tendencia
- Ciclos
- Temporalidad
- Irregular
- Aleatorio
Series de
Tiempo
0. Concepto
Una serie de tiempo es una colecci’on de
observaciones sobre un determindado fenómeno efectuadas en momentos de
tuempo sucesivos, usualmente equiespaciados.
Ejemplos de series de tiempos son: 1. Precio de
acciones 2. Niveles de inventario 3. Rotación de personas 4. Ventas 5.
Informes trimestrales
1. Instalar paquetes y llamar
librerias
#install.packages("forecast")
library(forecast)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
2. Crea la serie de tiempo
# Paso 1. Obtener los valores dependientes
produccion <- c(50,53,55,57,55,60)
# Paso 2. Agregar a los valores anteriores su tiempo correspondiente (crear una serie de tiempo)
serie_de_tiempo <- ts(data = produccion, start = c(2020,1), frequency = 4)
#serie_de_tiempo <- ts(data = produccion, start = c(2020,4), frequency = 12) # para que arranque en abril con una frecuencia mensual
serie_de_tiempo
## Qtr1 Qtr2 Qtr3 Qtr4
## 2020 50 53 55 57
## 2021 55 60
3. Crear modelo ARIMA
ARIMA: AutoRegressive Integrated Moving Average o
Modelo Autorregresivo
Integrado de Media Movil
ARIMA (p,d,q)
+ “p” = orden de auto-regresion
+ “d” = orden de integracion (diferenciacion)
+ “q” = orden del promedio movil
¿Cuándo se usa?
Cuando las estimaciones futuras se explican por los datos del pasado y
no por variables independientes.
Ejemplo: Tipo de Cambio
modelo <- auto.arima(serie_de_tiempo, D=1) # Se le agrega D cuando la grafica tiene temporalidad
modelo
## Series: serie_de_tiempo
## ARIMA(0,0,0)(0,1,0)[4] with drift
##
## Coefficients:
## drift
## 1.5000
## s.e. 0.1768
##
## sigma^2 = 2.01: log likelihood = -2.84
## AIC=9.68 AICc=-2.32 BIC=7.06
## Series: serie_de_tiempo
## ARIMA(0,0,0)(0,1,0)[4] with drift
##
## Coefficients:
## drift
## 1.5000
## s.e. 0.1768
##
## sigma^2 = 2.01: log likelihood = -2.84
## AIC=9.68 AICc=-2.32 BIC=7.06
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.03333332 0.5787923 0.3666667 0.03685269 0.6429133 0.06111111
## ACF1
## Training set -0.5073047
4. Realizar el Pronostico
pronostico <- forecast(modelo, level= c(99), h=5)
pronostico
## Point Forecast Lo 99 Hi 99
## 2021 Q3 61 57.34813 64.65187
## 2021 Q4 63 59.34813 66.65187
## 2022 Q1 61 57.34813 64.65187
## 2022 Q2 66 62.34813 69.65187
## 2022 Q3 67 61.83547 72.16453

Banco
Mundial
0. Concepto
El Banco Mundial (WB) es un organismo multinacional
especializado en finanzas.
En R se puede acceder a sus indicadores a través de la librería
WBI.
1. Instalar paquetes y llamar
librerias
#install.packages("WDI")
#install.packages("wbstats")
#install.packages("tidyverse")
library(WDI)
library(wbstats)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.2 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ ggplot2 3.4.3 ✔ tibble 3.2.1
## ✔ lubridate 1.9.2 ✔ tidyr 1.3.0
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
2. Crea la serie de
tiempo
# Paso 1. Obtener los valores dependientes
gdp_data <- wb_data(country = "MX", indicator = "NY.GDP.MKTP.CD", start_date = 1973, end_date = 2022)
gdp_data
## # A tibble: 50 × 9
## iso2c iso3c country date NY.GDP.MKTP.CD unit obs_status footnote
## <chr> <chr> <chr> <dbl> <dbl> <chr> <chr> <chr>
## 1 MX MEX Mexico 1973 55280212668. <NA> <NA> <NA>
## 2 MX MEX Mexico 1974 72000179026. <NA> <NA> <NA>
## 3 MX MEX Mexico 1975 88000000000 <NA> <NA> <NA>
## 4 MX MEX Mexico 1976 88876787991. <NA> <NA> <NA>
## 5 MX MEX Mexico 1977 81912502624. <NA> <NA> <NA>
## 6 MX MEX Mexico 1978 102647292867. <NA> <NA> <NA>
## 7 MX MEX Mexico 1979 134529639572. <NA> <NA> <NA>
## 8 MX MEX Mexico 1980 205576980832. <NA> <NA> <NA>
## 9 MX MEX Mexico 1981 263802132209. <NA> <NA> <NA>
## 10 MX MEX Mexico 1982 184603593511. <NA> <NA> <NA>
## # ℹ 40 more rows
## # ℹ 1 more variable: last_updated <date>
# Paso 2. Agregar a los valores anteriores su tiempo correspondiente (crear una serie de tiempo)
serie_de_tiempo <- ts(data = gdp_data$NY.GDP.MKTP.CD, start = c(1973), frequency = 1)
#serie_de_tiempo <- ts(data = produccion, start = c(2020,4), frequency = 12) # para que arranque en abril con una frecuencia mensual
serie_de_tiempo
## Time Series:
## Start = 1973
## End = 2022
## Frequency = 1
## [1] 5.528021e+10 7.200018e+10 8.800000e+10 8.887679e+10 8.191250e+10
## [6] 1.026473e+11 1.345296e+11 2.055770e+11 2.638021e+11 1.846036e+11
## [11] 1.561675e+11 1.842312e+11 1.952414e+11 1.345561e+11 1.475426e+11
## [16] 1.816112e+11 2.214031e+11 2.612537e+11 3.131397e+11 3.631578e+11
## [21] 5.007334e+11 5.278106e+11 3.600725e+11 4.109730e+11 5.004160e+11
## [26] 5.264997e+11 6.002330e+11 7.079099e+11 7.567029e+11 7.721097e+11
## [31] 7.293350e+11 7.822429e+11 8.774769e+11 9.753834e+11 1.052697e+12
## [36] 1.109987e+12 9.000470e+11 1.057801e+12 1.180487e+12 1.201094e+12
## [41] 1.274444e+12 1.315356e+12 1.171870e+12 1.078493e+12 1.158912e+12
## [46] 1.222406e+12 1.269010e+12 1.090515e+12 1.272839e+12 1.414187e+12
## attr(,"label")
## [1] GDP (current US$)
3. Crear modelo ARIMA
modelo <- auto.arima(serie_de_tiempo) # Se le agrega D cuando la grafica tiene temporalidad
modelo
## Series: serie_de_tiempo
## ARIMA(0,1,0)
##
## sigma^2 = 7.381e+21: log likelihood = -1303.18
## AIC=2608.36 AICc=2608.44 BIC=2610.25
## Series: serie_de_tiempo
## ARIMA(0,1,0)
##
## sigma^2 = 7.381e+21: log likelihood = -1303.18
## AIC=2608.36 AICc=2608.44 BIC=2610.25
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 27179245230 85046847387 67623045592 4.943879 14.05421 0.980016
## ACF1
## Training set -0.01519178
4. Realizar el Pronostico
pronostico <- forecast(modelo, level= c(95), h=5)
pronostico
## Point Forecast Lo 95 Hi 95
## 2023 1.414187e+12 1.245806e+12 1.582568e+12
## 2024 1.414187e+12 1.176060e+12 1.652314e+12
## 2025 1.414187e+12 1.122543e+12 1.705832e+12
## 2026 1.414187e+12 1.077425e+12 1.750949e+12
## 2027 1.414187e+12 1.037676e+12 1.790699e+12

LS0tCnRpdGxlOiAiTUFBY3Q0OCIKYXV0aG9yOiAiRXN0ZWZhbnkgVmlsbGFsb2JvcyIKZGF0ZTogIjIwMjMtMDktMjkiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCiAgICB0aGVtZTogInNhbmRzdG9uZSIKICAgIGhpZ2hsaWdodDogImVzcHJlc3NvIgotLS0KCiMgKipGb3JlY2FzdCBQcm9uw7NzdGljbyoqICAgCioqRGVmaW5pY2nDs246KiogRGVjbGFyYWNpw7NuIHNvYnJlIGVsIHZhbG9yIGZ1dHVybyBkZSB1bmEgdmFyaWFibGUgZGUgaW50ZXLDqXMuICAgCioqRWplbXBsbzoqKiBXYWx0IERpc25leSBXb3JsZCB0aWVuZSB1biBkZXBhcnRhbWVudG8gZGUgMjAgcGVyc29uYXMsIGRlZGljYWRhcyBhIHJlYWxpemFyIHByb27Ds3N0aWNvcyBkZSB2aXNpdGFzIHBhcmEgcmVhbGl6YXIgcGVkaWRvcyBkZSBiZWJpZGFzIHkgYWxpbWVudG9zLiAgIAoqKkxlbWE6KiogTG9zIHByb27Ds3N0aWNvcyBOTyBzb24gcGVyZmVjdG9zLiAgCgojIyMgKipFbGVtZW50b3MgcGFyYSB1biBtZWpvciBwcm9uw7NzdGljbzoqKiAgCisgSG9yaXpvbnRlIGRlIHRpZW1wbyAgCisgUHJlY2lzbyAgIAorIENvbmZpYWJsZSAgCisgVW5pZGFkZXMgc2lnbmlmaWNhdGl2YXMgIAorIFNpbXBsZSBkZSBlbnRlbmRlciB5IHVzYXIgICAKKyBDb3N0by1iZW5lZmljaW8gICAKCiMjIyAqKjYgUGFzb3MgcGFyYSByZWFsaXphciB1biBwcm9uw7NzdGljbzoqKiAgIAoxLiBEZXRlcm1pbmFyIGVsIHByb3DDs3NpdG8gICAKMi4gRXN0YWJsZWNlciBob3Jpem9udGUgZGUgdGllbXBvICAgCjMuIE9idGVuZXIsIGxpbXBpYXIgeSBhbmFsaXphciBkYXRvcyBhcHJvcGlhZG9zICAgCjQuIFNlbGVjY2lvbmFyIHTDqWNuaWNhIHBhcmEgcHJvbm9zdGljYXIgICAKNS4gUmVhbGl6YXIgZWwgcHJvbsOzc3RpY28gIAo2LiBNb25pdG9yZWFyIGVsIGVycm9yIGRlbCBwcm9uw7NzdGljbyAgIAoKKipFcnJvcjoqKiBlcyBsYSBkaWZlcmVuY2lhIGVudHJlIGVsIHZhbG9yIHJlYWwgeSBlbCB2YWxvciBwcm9uw7NzdGljby4gICAKCkZvcm11bGEgZGUgRXJyb3IgICAKXFsKXHRleHR7RXJyb3J9ID0gXHRleHR7VmFsb3IgUmVhbH0gLSBcdGV4dHtWYWxvciBQcm9ub3N0aWNhZG99ClxdCgpNZWFuIEFic29sdXRlIERldmlhdGlvbiAoTUFEKSAgIApcWwpNQUQgPSBcZnJhY3sxfXtufSBcc3VtX3tpPTF9XntufSB8eV9pIC0gXGhhdHt5fV9pfApcXQoKTWVhbiBTcXVhcmVkIEVycm9yIChNQUQpICAgClxbCk1TRSA9IFxmcmFjezF9e259IFxzdW1fe2k9MX1ee259ICh5X2kgLSBcaGF0e3l9X2kpXjIKXF0KCk1lYW4gQWJzb2x1dGUgUGVyY2VudCBFcnJvciAoTUFQRSkgICAKXFsKTUFQRSA9IFxmcmFjezF9e259IFxzdW1fe2k9MX1ee259IFxsZWZ0fCBcZnJhY3t5X2kgLSBcaGF0e3l9X2l9e3lfaX0gXHJpZ2h0fCBcdGltZXMgMTAwXCUKXF0KCioqU2VyaWVzIGRlIFRpZW1wbzoqKiBMb3MgcHJvbsOzc3RpY29zIHNlIG9ic2VydmFuIGVuIFNlcmllcyBkZSBUaWVtcG8uICAgIAoKIyMjICoqTG9zIDUgUGF0cm9uZXMgZW4gbGFzIFNlcmllcyBkZSBUaWVtcG8gc29uOioqICAgCgohW10oL1VzZXJzL2VzdGVmYW55dmlsbGFsb2Jvcy9EZXNrdG9wL1NjcmVlbiBTaG90IDIwMjMtMDktMzAgYXQgMjAuMjkuNDUucG5nKQoKYS4gVGVuZGVuY2lhICAKYi4gQ2ljbG9zICAKYy4gVGVtcG9yYWxpZGFkICAKZC4gSXJyZWd1bGFyICAgCmUuIEFsZWF0b3JpbyAgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjogb3JhbmdlOyI+KipTZXJpZXMgZGUgVGllbXBvKio8L3NwYW4+ICAgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IG9yYW5nZTsiPjAuIENvbmNlcHRvPC9zcGFuPiAgClVuYSAqKnNlcmllIGRlIHRpZW1wbyoqIGVzIHVuYSBjb2xlY2NpJ29uIGRlIG9ic2VydmFjaW9uZXMgc29icmUgdW4gZGV0ZXJtaW5kYWRvIGZlbsOzbWVubyBlZmVjdHVhZGFzIGVuIG1vbWVudG9zIGRlIHR1ZW1wbyBzdWNlc2l2b3MsIHVzdWFsbWVudGUgZXF1aWVzcGFjaWFkb3MuICAgCgoqKkVqZW1wbG9zIGRlIHNlcmllcyBkZSB0aWVtcG9zIHNvbjoqKgoxLiBQcmVjaW8gZGUgYWNjaW9uZXMKMi4gTml2ZWxlcyBkZSBpbnZlbnRhcmlvCjMuIFJvdGFjacOzbiBkZSBwZXJzb25hcwo0LiBWZW50YXMKNS4gSW5mb3JtZXMgdHJpbWVzdHJhbGVzCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IG9yYW5nZTsiPjEuIEluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcmlhczwvc3Bhbj4KYGBge3J9CiNpbnN0YWxsLnBhY2thZ2VzKCJmb3JlY2FzdCIpCmxpYnJhcnkoZm9yZWNhc3QpCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ij4yLiBDcmVhIGxhIHNlcmllIGRlIHRpZW1wbzwvc3Bhbj4KYGBge3J9CiMgUGFzbyAxLiBPYnRlbmVyIGxvcyB2YWxvcmVzIGRlcGVuZGllbnRlcwpwcm9kdWNjaW9uIDwtIGMoNTAsNTMsNTUsNTcsNTUsNjApCgojIFBhc28gMi4gQWdyZWdhciBhIGxvcyB2YWxvcmVzIGFudGVyaW9yZXMgc3UgdGllbXBvIGNvcnJlc3BvbmRpZW50ZSAoY3JlYXIgdW5hIHNlcmllIGRlIHRpZW1wbykKc2VyaWVfZGVfdGllbXBvIDwtIHRzKGRhdGEgPSBwcm9kdWNjaW9uLCBzdGFydCA9IGMoMjAyMCwxKSwgZnJlcXVlbmN5ID0gNCkKI3NlcmllX2RlX3RpZW1wbyA8LSB0cyhkYXRhID0gcHJvZHVjY2lvbiwgc3RhcnQgPSBjKDIwMjAsNCksIGZyZXF1ZW5jeSA9IDEyKSAjIHBhcmEgcXVlIGFycmFucXVlIGVuIGFicmlsIGNvbiB1bmEgZnJlY3VlbmNpYSBtZW5zdWFsCnNlcmllX2RlX3RpZW1wbwpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogb3JhbmdlOyI+My4gQ3JlYXIgbW9kZWxvIEFSSU1BPC9zcGFuPgoKKipBUklNQToqKiBBdXRvUmVncmVzc2l2ZSBJbnRlZ3JhdGVkIE1vdmluZyBBdmVyYWdlIG8gTW9kZWxvIEF1dG9ycmVncmVzaXZvCgpJbnRlZ3JhZG8gZGUgTWVkaWEgTW92aWwgIAoKKipBUklNQSAocCxkLHEpKiogIAorICJwIiA9IG9yZGVuIGRlIGF1dG8tcmVncmVzaW9uICAKKyAiZCIgPSBvcmRlbiBkZSBpbnRlZ3JhY2lvbiAoZGlmZXJlbmNpYWNpb24pICAKKyAicSIgPSBvcmRlbiBkZWwgcHJvbWVkaW8gbW92aWwgIAoKKirCv0N1w6FuZG8gc2UgdXNhPyoqICAgCkN1YW5kbyBsYXMgZXN0aW1hY2lvbmVzIGZ1dHVyYXMgc2UgZXhwbGljYW4gcG9yIGxvcyBkYXRvcyBkZWwgcGFzYWRvIHkgbm8gcG9yIHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcy4gICAKCioqRWplbXBsbzoqKiBUaXBvIGRlIENhbWJpbyAgCgpgYGB7cn0KbW9kZWxvIDwtIGF1dG8uYXJpbWEoc2VyaWVfZGVfdGllbXBvLCBEPTEpICMgU2UgbGUgYWdyZWdhIEQgY3VhbmRvIGxhIGdyYWZpY2EgdGllbmUgdGVtcG9yYWxpZGFkCm1vZGVsbwpzdW1tYXJ5KG1vZGVsbykKYGBgCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogb3JhbmdlOyI+NC4gUmVhbGl6YXIgZWwgUHJvbm9zdGljbzwvc3Bhbj4KCmBgYHtyfQpwcm9ub3N0aWNvIDwtIGZvcmVjYXN0KG1vZGVsbywgbGV2ZWw9IGMoOTkpLCBoPTUpCnByb25vc3RpY28KcGxvdChwcm9ub3N0aWNvKQpgYGAKCiAgCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBkYXJrYmx1ZTsiPioqQmFuY28gTXVuZGlhbCoqPC9zcGFuPiAgIAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBkYXJrYmx1ZTsiPjAuIENvbmNlcHRvPC9zcGFuPiAgCkVsICoqQmFuY28gTXVuZGlhbCAoV0IpKiogZXMgdW4gb3JnYW5pc21vIG11bHRpbmFjaW9uYWwgZXNwZWNpYWxpemFkbyBlbiBmaW5hbnphcy4gIAoKRW4gUiBzZSBwdWVkZSBhY2NlZGVyIGEgc3VzIGluZGljYWRvcmVzIGEgdHJhdsOpcyBkZSBsYSBsaWJyZXLDrWEgV0JJLiAgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGRhcmtibHVlOyI+MS4gSW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyaWFzPC9zcGFuPgpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoIldESSIpCiNpbnN0YWxsLnBhY2thZ2VzKCJ3YnN0YXRzIikKI2luc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpCgpsaWJyYXJ5KFdESSkKbGlicmFyeSh3YnN0YXRzKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGRhcmtibHVlOyI+Mi4gQ3JlYSBsYSBzZXJpZSBkZSB0aWVtcG88L3NwYW4+CmBgYHtyfQojIFBhc28gMS4gT2J0ZW5lciBsb3MgdmFsb3JlcyBkZXBlbmRpZW50ZXMKZ2RwX2RhdGEgPC0gd2JfZGF0YShjb3VudHJ5ID0gIk1YIiwgaW5kaWNhdG9yID0gIk5ZLkdEUC5NS1RQLkNEIiwgc3RhcnRfZGF0ZSA9IDE5NzMsIGVuZF9kYXRlID0gMjAyMikKZ2RwX2RhdGEKCiMgUGFzbyAyLiBBZ3JlZ2FyIGEgbG9zIHZhbG9yZXMgYW50ZXJpb3JlcyBzdSB0aWVtcG8gY29ycmVzcG9uZGllbnRlIChjcmVhciB1bmEgc2VyaWUgZGUgdGllbXBvKQpzZXJpZV9kZV90aWVtcG8gPC0gdHMoZGF0YSA9IGdkcF9kYXRhJE5ZLkdEUC5NS1RQLkNELCBzdGFydCA9IGMoMTk3MyksIGZyZXF1ZW5jeSA9IDEpCiNzZXJpZV9kZV90aWVtcG8gPC0gdHMoZGF0YSA9IHByb2R1Y2Npb24sIHN0YXJ0ID0gYygyMDIwLDQpLCBmcmVxdWVuY3kgPSAxMikgIyBwYXJhIHF1ZSBhcnJhbnF1ZSBlbiBhYnJpbCBjb24gdW5hIGZyZWN1ZW5jaWEgbWVuc3VhbApzZXJpZV9kZV90aWVtcG8KYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGRhcmtibHVlOyI+My4gQ3JlYXIgbW9kZWxvIEFSSU1BPC9zcGFuPgoKYGBge3J9Cm1vZGVsbyA8LSBhdXRvLmFyaW1hKHNlcmllX2RlX3RpZW1wbykgIyBTZSBsZSBhZ3JlZ2EgRCBjdWFuZG8gbGEgZ3JhZmljYSB0aWVuZSB0ZW1wb3JhbGlkYWQKbW9kZWxvCnN1bW1hcnkobW9kZWxvKQpgYGAKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBkYXJrYmx1ZTsiPjQuIFJlYWxpemFyIGVsIFByb25vc3RpY288L3NwYW4+CgpgYGB7cn0KcHJvbm9zdGljbyA8LSBmb3JlY2FzdChtb2RlbG8sIGxldmVsPSBjKDk1KSwgaD01KQpwcm9ub3N0aWNvCnBsb3QocHJvbm9zdGljbykKYGBgCgoKCg==