Actividad en clase (Explicación en Clase)

Victor Manuel Muñoz Tirado - A01423434

Concepto

Una serie de tiempo es una colección de observaciones sobre un determinado fenómeno, efectuando en momento sucesivos, generalmente espaciados.

Algunos ejemplos de series de tiempo son:
1. Precios de acciones.
2. Niveles de inventario.
3. Rotación de personal.
4. Ventas.
5. PIB(GDP).

Más información:
[link] (https://www5.uva.es/estadmed/datos/series/series1.htm)

Instalar paquetes y llamar librerías

#install.packages("forecast")
library(forecast)

Crear la serie de tiempo

Ejemplo

Los datos de producción trimestral inician en el primer trimestre de 2020

Se busca pronosticar la producción de los siguientes 3 trimestres.

produccion <- c(50,53,55,57,55,60)
ts <- ts(data=produccion, start = c(2020,1), frequency=4)
ts
##      Qtr1 Qtr2 Qtr3 Qtr4
## 2020   50   53   55   57
## 2021   55   60

Crear modelo ARIMA

ARIMA significa modelo autorregresivo integrado de promedio móvil

arima <- auto.arima(ts, D=1)
summary(arima)
## Series: ts 
## 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
arima
## Series: ts 
## 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

Generar el pronóstico

pronostico <- forecast(arima, level=c(95), h=5)
pronostico
##         Point Forecast    Lo 95    Hi 95
## 2021 Q3             61 58.22127 63.77873
## 2021 Q4             63 60.22127 65.77873
## 2022 Q1             61 58.22127 63.77873
## 2022 Q2             66 63.22127 68.77873
## 2022 Q3             67 63.07028 70.92972
plot(pronostico)

Actividad 2 de Hershey´s

Concepto

Una serie de tiempo es una colección de observaciones sobre un determinado fenómeno, efectuando en momento sucesivos usualmente espaciados.

Algunos ejemplos de series de tiempo son:
1. Precios de acciones.
2. Niveles de inventario.
3. Rotación de personal.
4. Ventas.
5. PIB(GDP).

Más información:
link (https://www.cepal.org/sites/default/files/courses/files/01_1_conociendo_una_serie_de_tiempo.pdf)

Instalar paquetes y llamar librerías

#install.packages("forecast")
library(forecast)

Crear la serie de tiempo

Ejemplo

Los siguientes datos de producción trimestral inician en el primer trimestre de 2020

Se busca pronosticar la producción de los siguientes 3 trimestres

lechita <- read.csv("Ventas_Históricas_Lechitas.csv")
lechita$Ventas <- as.numeric(lechita$Ventas)
ts <- ts(lechita$Ventas, start = c(2017,1), frequency=12)
ts
##           Jan      Feb      Mar      Apr      May      Jun      Jul      Aug
## 2017 25520.51 23740.11 26253.58 25868.43 27072.87 27150.50 27067.10 28145.25
## 2018 28463.69 26996.11 29768.20 29292.51 29950.68 30099.17 30851.26 32271.76
## 2019 32496.44 31287.28 33376.02 32949.77 34004.11 33757.89 32927.30 34324.12
##           Sep      Oct      Nov      Dec
## 2017 27546.29 28400.37 27441.98 27852.47
## 2018 31940.74 32995.93 32197.12 31984.82
## 2019 35151.28 36133.07 34799.91 34846.17

Crear modelo ARIMA

ARIMA significa modelo autorregresivo integrado de promedio móvil

arima <- auto.arima(ts)
summary(arima)
## Series: ts 
## ARIMA(1,0,0)(1,1,0)[12] with drift 
## 
## Coefficients:
##          ar1     sar1     drift
##       0.6383  -0.5517  288.8980
## s.e.  0.1551   0.2047   14.5026
## 
## sigma^2 = 202700:  log likelihood = -181.5
## AIC=371   AICc=373.11   BIC=375.72
## 
## Training set error measures:
##                    ME    RMSE      MAE        MPE      MAPE       MASE
## Training set 25.22163 343.863 227.1699 0.08059942 0.7069541 0.06491041
##                   ACF1
## Training set 0.2081043
arima
## Series: ts 
## ARIMA(1,0,0)(1,1,0)[12] with drift 
## 
## Coefficients:
##          ar1     sar1     drift
##       0.6383  -0.5517  288.8980
## s.e.  0.1551   0.2047   14.5026
## 
## sigma^2 = 202700:  log likelihood = -181.5
## AIC=371   AICc=373.11   BIC=375.72

Generar el pronóstico

pronostico <- forecast(arima, level=c(95), h=12)
pronostico
##          Point Forecast    Lo 95    Hi 95
## Jan 2020       35498.90 34616.48 36381.32
## Feb 2020       34202.17 33155.29 35249.05
## Mar 2020       36703.01 35596.10 37809.92
## Apr 2020       36271.90 35141.44 37402.36
## May 2020       37121.98 35982.07 38261.90
## Jun 2020       37102.65 35958.91 38246.40
## Jul 2020       37151.04 36005.74 38296.35
## Aug 2020       38564.65 37418.71 39710.59
## Sep 2020       38755.23 37609.03 39901.42
## Oct 2020       39779.03 38632.73 40925.33
## Nov 2020       38741.63 37595.29 39887.97
## Dec 2020       38645.86 37499.50 39792.22
plot(pronostico)

Finanzas corporativas

Instalar librería y llamarla

#install.packages("finreportr")
library(finreportr)

Información disponible

Con la función finreportr podemos conseguir la siguiente información:

  • Companyinfo() = brinda información general como ubicación, ZIP, nombre, etc.

    options(HTTPUserAgent = "a a@gmail.com")
    CompanyInfo("JPM")
    ##               company        CIK  SIC state state.inc FY.end     street.address
    ## 1 JPMORGAN CHASE & CO 0000019617 6021    NY        DE   1231 383 MADISON AVENUE
    ##          city.state
    ## 1 NEW YORK NY 10017
  • AnnualReports() = brinda el nombre, fecha y número de acceso.

    AnnualReports("BABA", foreign = TRUE)
    ##    filing.name filing.date         accession.no
    ## 1       20-F/A  2024-02-23 0001193125-24-044480
    ## 2         20-F  2023-07-21 0000950170-23-033752
    ## 3         20-F  2022-07-26 0001104659-22-082622
    ## 4         20-F  2021-07-27 0001104659-21-096092
    ## 5         20-F  2020-07-09 0001104659-20-082409
    ## 6         20-F  2019-06-05 0001047469-19-003492
    ## 7         20-F  2018-07-27 0001047469-18-005257
    ## 8         20-F  2017-06-15 0001047469-17-004019
    ## 9         20-F  2016-05-24 0001047469-16-013400
    ## 10        20-F  2015-06-25 0001047469-15-005768
  • GetIncome() = brinda el estado de resultados.

    google_income <- GetIncome("GOOG", 2017)
  • GetBalanceSheet() = brinda el balance general.

    amazon_balance <- GetBalanceSheet("AMZN", 2015)
  • GetCashFlow() = brinda el flujo de efectivo.

    apple_flujo <- GetCashFlow("AAPL", 2014)

Análisis Financiero de Empresa

Integrantes del equipo:

Victor Manuel Muñoz Tirado - A01423434

Vivian Pérez Mosqueda - A01731984

Sebastian Romano Mena - A00831709

library(finreportr)
library(forecast)
CompanyInfo("MSFT")
##          company        CIK  SIC state state.inc FY.end    street.address
## 1 MICROSOFT CORP 0000789019 7372    WA        WA   0630 ONE MICROSOFT WAY
##              city.state
## 1 REDMOND WA 98052-6399
AnnualReports("MSFT")
##    filing.name filing.date         accession.no
## 1         10-K  2023-07-27 0000950170-23-035122
## 2         10-K  2022-07-28 0001564590-22-026876
## 3         10-K  2021-07-29 0001564590-21-039151
## 4         10-K  2020-07-30 0001564590-20-034944
## 5         10-K  2019-08-01 0001564590-19-027952
## 6         10-K  2018-08-03 0001564590-18-019062
## 7         10-K  2017-08-02 0001564590-17-014900
## 8         10-K  2016-07-28 0001193125-16-662209
## 9         10-K  2015-07-31 0001193125-15-272806
## 10        10-K  2014-07-31 0001193125-14-289961
## 11        10-K  2013-07-30 0001193125-13-310206
## 12        10-K  2012-07-26 0001193125-12-316848
## 13        10-K  2011-07-28 0001193125-11-200680
## 14        10-K  2010-07-30 0001193125-10-171791
## 15        10-K  2009-07-30 0001193125-09-158735
## 16        10-K  2008-07-31 0001193125-08-162768
## 17        10-K  2007-08-03 0001193125-07-170817
## 18        10-K  2006-08-25 0001193125-06-180008
## 19        10-K  2005-08-26 0001193125-05-174825
## 20        10-K  2004-09-01 0001193125-04-150689
## 21        10-K  2003-09-05 0001193125-03-045632
## 22        10-K  2002-09-06 0001032210-02-001351
## 23        10-K  2001-09-18 0001032210-01-501099
## 24        10-K  2000-09-28 0001032210-00-001961
## 25        10-K  1999-09-28 0001032210-99-001375
## 26        10-K  1998-09-25 0001032210-98-001067
## 27        10-K  1997-09-29 0001017062-97-001764
## 28        10-K  1996-09-27 0000891020-96-001130
## 29        10-K  1995-09-25 0000891020-95-000433
## 30        10-K  1994-09-27 0000891020-94-000175
msft_income <- GetIncome("MSFT", 2016)
msft_income2 <- GetIncome("MSFT", 2013)
msft_income3 <- GetIncome("MSFT", 2017)
resultado <- rbind(msft_income,msft_income2,msft_income3)
resultado$startDate <- as.Date(resultado$startDate)
resultado$endDate <- as.Date(resultado$endDate)
resultado$Amount <- as.numeric(resultado$Amount)
resultado_income <- resultado[resultado$Metric=="Revenue, Net",]
ts <- ts(data=resultado_income$Amount, start = c(2013,1), frequency=1)
ts
## Time Series:
## Start = 2013 
## End = 2023 
## Frequency = 1 
##  [1] 8.6833e+10 9.3580e+10 8.5320e+10 2.1729e+10 2.2180e+10 2.0531e+10
##  [7] 2.0614e+10 2.3201e+10 2.6470e+10 2.0379e+10 2.3796e+10
arima <- auto.arima(ts)
pronostico <- forecast(arima, level=c(95), h=5)
plot(pronostico)

LS0tDQp0aXRsZTogIkhlcnNoZXkiDQphdXRob3I6ICJWaWN0b3IgTWFudWVsIE11w7FveiBUaXJhZG8gQTAxNDIzNDM0Ig0KZGF0ZTogIjIwMjQtMDItMTYiDQpvdXRwdXQ6IA0KIGh0bWxfZG9jdW1lbnQ6DQogIHRvYzogVFJVRQ0KICB0b2NfZmxvYXQ6IFRSVUUNCiAgY29kZV9kb3dubG9hZDogVFJVRQ0KIGVkaXRvcl9vcHRpb25zOg0KICBtYXJrZG93bjoNCiAgd3JhcDogNzINCi0tLQ0KDQohW10oaHR0cHM6Ly9kaW9jZXNhbm9zLmVzL2Jsb2dzL2VxdWlwb3RpYy93cC1jb250ZW50L3VwbG9hZHMvc2l0ZXMvMi8yMDIxLzA4LzEuZ2lmKQ0KDQojIEFjdGl2aWRhZCBlbiBjbGFzZSAoRXhwbGljYWNpw7NuIGVuIENsYXNlKQ0KDQpWaWN0b3IgTWFudWVsIE11w7FveiBUaXJhZG8gLSBBMDE0MjM0MzQNCg0KIyMgQ29uY2VwdG8NCg0KVW5hICoqc2VyaWUgZGUgdGllbXBvKiogZXMgdW5hIGNvbGVjY2nDs24gZGUgb2JzZXJ2YWNpb25lcyBzb2JyZSB1biBkZXRlcm1pbmFkbyBmZW7Ds21lbm8sIGVmZWN0dWFuZG8gZW4gbW9tZW50byBzdWNlc2l2b3MsIGdlbmVyYWxtZW50ZSBlc3BhY2lhZG9zLg0KDQpBbGd1bm9zIGVqZW1wbG9zIGRlIHNlcmllcyBkZSB0aWVtcG8gc29uOlwNCjEuIFByZWNpb3MgZGUgYWNjaW9uZXMuXA0KMi4gTml2ZWxlcyBkZSBpbnZlbnRhcmlvLlwNCjMuIFJvdGFjacOzbiBkZSBwZXJzb25hbC5cDQo0LiBWZW50YXMuXA0KNS4gUElCKCoqR0RQKiopLg0KDQpNw6FzIGluZm9ybWFjacOzbjpcDQpbbGlua10gKDxodHRwczovL3d3dzUudXZhLmVzL2VzdGFkbWVkL2RhdG9zL3Nlcmllcy9zZXJpZXMxLmh0bT4pDQoNCiMjIEluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcsOtYXMNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0V9DQojaW5zdGFsbC5wYWNrYWdlcygiZm9yZWNhc3QiKQ0KbGlicmFyeShmb3JlY2FzdCkNCg0KYGBgDQoNCiMjIENyZWFyIGxhIHNlcmllIGRlIHRpZW1wbw0KDQoqKkVqZW1wbG8qKg0KDQpMb3MgZGF0b3MgZGUgcHJvZHVjY2nDs24gdHJpbWVzdHJhbCBpbmljaWFuIGVuIGVsIHByaW1lciB0cmltZXN0cmUgZGUgMjAyMA0KDQpTZSBidXNjYSBwcm9ub3N0aWNhciBsYSBwcm9kdWNjacOzbiBkZSBsb3Mgc2lndWllbnRlcyAzIHRyaW1lc3RyZXMuDQoNCmBgYHtyfQ0KcHJvZHVjY2lvbiA8LSBjKDUwLDUzLDU1LDU3LDU1LDYwKQ0KdHMgPC0gdHMoZGF0YT1wcm9kdWNjaW9uLCBzdGFydCA9IGMoMjAyMCwxKSwgZnJlcXVlbmN5PTQpDQp0cw0KYGBgDQoNCiMjIENyZWFyIG1vZGVsbyBBUklNQQ0KDQoqKkFSSU1BKiogc2lnbmlmaWNhIG1vZGVsbyBhdXRvcnJlZ3Jlc2l2byBpbnRlZ3JhZG8gZGUgcHJvbWVkaW8gbcOzdmlsDQoNCmBgYHtyfQ0KYXJpbWEgPC0gYXV0by5hcmltYSh0cywgRD0xKQ0Kc3VtbWFyeShhcmltYSkNCmFyaW1hDQpgYGANCg0KIyMgR2VuZXJhciBlbCBwcm9uw7NzdGljbw0KDQpgYGB7cn0NCnByb25vc3RpY28gPC0gZm9yZWNhc3QoYXJpbWEsIGxldmVsPWMoOTUpLCBoPTUpDQpwcm9ub3N0aWNvDQpgYGANCg0KYGBge3J9DQpwbG90KHByb25vc3RpY28pDQpgYGANCg0KIVtdKGh0dHBzOi8vbWVkaWEuZ2lwaHkuY29tL2F2YXRhcnMvSENXU29jaWFsL2Z0SU1kb3pQSUxkbC5naWYpDQoNCiMgQWN0aXZpZGFkIDIgZGUgSGVyc2hlecK0cw0KDQojIyBDb25jZXB0bw0KDQpVbmEgKipzZXJpZSBkZSB0aWVtcG8qKiBlcyB1bmEgY29sZWNjacOzbiBkZSBvYnNlcnZhY2lvbmVzIHNvYnJlIHVuIGRldGVybWluYWRvIGZlbsOzbWVubywgZWZlY3R1YW5kbyBlbiBtb21lbnRvIHN1Y2VzaXZvcyB1c3VhbG1lbnRlIGVzcGFjaWFkb3MuDQoNCkFsZ3Vub3MgZWplbXBsb3MgZGUgc2VyaWVzIGRlIHRpZW1wbyBzb246XA0KMS4gUHJlY2lvcyBkZSBhY2Npb25lcy5cDQoyLiBOaXZlbGVzIGRlIGludmVudGFyaW8uXA0KMy4gUm90YWNpw7NuIGRlIHBlcnNvbmFsLlwNCjQuIFZlbnRhcy5cDQo1LiBQSUIoKipHRFAqKikuDQoNCk3DoXMgaW5mb3JtYWNpw7NuOlwNCltsaW5rXShFOi9DYXJyZXJhL09jdGF2byUyMHNlbWVzdHJlJTIwTElUL2Rlc2NhcmdhKSAoPGh0dHBzOi8vd3d3LmNlcGFsLm9yZy9zaXRlcy9kZWZhdWx0L2ZpbGVzL2NvdXJzZXMvZmlsZXMvMDFfMV9jb25vY2llbmRvX3VuYV9zZXJpZV9kZV90aWVtcG8ucGRmPikNCg0KIyMgSW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyw61hcw0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRX0NCiNpbnN0YWxsLnBhY2thZ2VzKCJmb3JlY2FzdCIpDQpsaWJyYXJ5KGZvcmVjYXN0KQ0KDQpgYGANCg0KIyMgQ3JlYXIgbGEgc2VyaWUgZGUgdGllbXBvDQoNCioqRWplbXBsbyoqDQoNCkxvcyBzaWd1aWVudGVzIGRhdG9zIGRlIHByb2R1Y2Npw7NuIHRyaW1lc3RyYWwgaW5pY2lhbiBlbiBlbCBwcmltZXIgdHJpbWVzdHJlIGRlIDIwMjANCg0KU2UgYnVzY2EgcHJvbm9zdGljYXIgbGEgcHJvZHVjY2nDs24gZGUgbG9zIHNpZ3VpZW50ZXMgMyB0cmltZXN0cmVzDQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0KDQpzZXR3ZCgiRTovQ2FycmVyYS9PY3Rhdm8gc2VtZXN0cmUgTElUIikNCg0KYGBgDQoNCmBgYHtyfQ0KbGVjaGl0YSA8LSByZWFkLmNzdigiVmVudGFzX0hpc3TDs3JpY2FzX0xlY2hpdGFzLmNzdiIpDQpsZWNoaXRhJFZlbnRhcyA8LSBhcy5udW1lcmljKGxlY2hpdGEkVmVudGFzKQ0KdHMgPC0gdHMobGVjaGl0YSRWZW50YXMsIHN0YXJ0ID0gYygyMDE3LDEpLCBmcmVxdWVuY3k9MTIpDQp0cw0KYGBgDQoNCiMjIENyZWFyIG1vZGVsbyBBUklNQQ0KDQoqKkFSSU1BKiogc2lnbmlmaWNhIG1vZGVsbyBhdXRvcnJlZ3Jlc2l2byBpbnRlZ3JhZG8gZGUgcHJvbWVkaW8gbcOzdmlsDQoNCmBgYHtyfQ0KYXJpbWEgPC0gYXV0by5hcmltYSh0cykNCnN1bW1hcnkoYXJpbWEpDQphcmltYQ0KYGBgDQoNCiMjIEdlbmVyYXIgZWwgcHJvbsOzc3RpY28NCg0KYGBge3J9DQpwcm9ub3N0aWNvIDwtIGZvcmVjYXN0KGFyaW1hLCBsZXZlbD1jKDk1KSwgaD0xMikNCnByb25vc3RpY28NCmBgYA0KDQpgYGB7cn0NCnBsb3QocHJvbm9zdGljbykNCmBgYA0KDQohW10oaHR0cHM6Ly80LmJwLmJsb2dzcG90LmNvbS8tbUZwTUZZNFhPdTgvVWdVTDJySndIZkkvQUFBQUFBQUFBQXcvNjA3ZUdIaXdpWjQvczE2MDAvTG9nbytGaW5hbnphcy5naWYpDQoNCiMgRmluYW56YXMgY29ycG9yYXRpdmFzDQoNCiMjIEluc3RhbGFyIGxpYnJlcsOtYSB5IGxsYW1hcmxhDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQ0KI2luc3RhbGwucGFja2FnZXMoImZpbnJlcG9ydHIiKQ0KbGlicmFyeShmaW5yZXBvcnRyKQ0KYGBgDQoNCiMjIEluZm9ybWFjacOzbiBkaXNwb25pYmxlDQoNCkNvbiBsYSBmdW5jacOzbiBmaW5yZXBvcnRyIHBvZGVtb3MgY29uc2VndWlyIGxhIHNpZ3VpZW50ZSBpbmZvcm1hY2nDs246DQoNCi0gICBDb21wYW55aW5mbygpID0gYnJpbmRhIGluZm9ybWFjacOzbiBnZW5lcmFsIGNvbW8gdWJpY2FjacOzbiwgWklQLCBub21icmUsIGV0Yy4NCg0KICAgIGBgYHtyfQ0KICAgIG9wdGlvbnMoSFRUUFVzZXJBZ2VudCA9ICJhIGFAZ21haWwuY29tIikNCiAgICBDb21wYW55SW5mbygiSlBNIikNCiAgICBgYGANCg0KLSAgIEFubnVhbFJlcG9ydHMoKSA9IGJyaW5kYSBlbCBub21icmUsIGZlY2hhIHkgbsO6bWVybyBkZSBhY2Nlc28uDQoNCiAgICBgYGB7cn0NCiAgICBBbm51YWxSZXBvcnRzKCJCQUJBIiwgZm9yZWlnbiA9IFRSVUUpDQogICAgYGBgDQoNCi0gICBHZXRJbmNvbWUoKSA9IGJyaW5kYSBlbCBlc3RhZG8gZGUgcmVzdWx0YWRvcy4NCg0KICAgIGBgYHtyfQ0KICAgIGdvb2dsZV9pbmNvbWUgPC0gR2V0SW5jb21lKCJHT09HIiwgMjAxNykNCiAgICBgYGANCg0KLSAgIEdldEJhbGFuY2VTaGVldCgpID0gYnJpbmRhIGVsIGJhbGFuY2UgZ2VuZXJhbC4NCg0KICAgIGBgYHtyfQ0KICAgIGFtYXpvbl9iYWxhbmNlIDwtIEdldEJhbGFuY2VTaGVldCgiQU1aTiIsIDIwMTUpDQogICAgYGBgDQoNCi0gICBHZXRDYXNoRmxvdygpID0gYnJpbmRhIGVsIGZsdWpvIGRlIGVmZWN0aXZvLg0KDQogICAgYGBge3J9DQogICAgYXBwbGVfZmx1am8gPC0gR2V0Q2FzaEZsb3coIkFBUEwiLCAyMDE0KQ0KICAgIGBgYA0KDQohW10oaHR0cHM6Ly93d3cuZ2VyZW5jaWUuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy9xdWUtZXMtZWwtYW5hbGlzaXMtZmluYW5jaWVyby5wbmcpDQoNCiMgQW7DoWxpc2lzIEZpbmFuY2llcm8gZGUgRW1wcmVzYQ0KDQpJbnRlZ3JhbnRlcyBkZWwgZXF1aXBvOg0KDQpWaWN0b3IgTWFudWVsIE11w7FveiBUaXJhZG8gLSBBMDE0MjM0MzQNCg0KVml2aWFuIFDDqXJleiBNb3NxdWVkYSAtIEEwMTczMTk4NA0KDQpTZWJhc3RpYW4gUm9tYW5vIE1lbmEgLSBBMDA4MzE3MDkNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KGZpbnJlcG9ydHIpDQpsaWJyYXJ5KGZvcmVjYXN0KQ0KYGBgDQoNCmBgYHtyfQ0KQ29tcGFueUluZm8oIk1TRlQiKQ0KYGBgDQoNCmBgYHtyfQ0KQW5udWFsUmVwb3J0cygiTVNGVCIpDQpgYGANCg0KYGBge3J9DQptc2Z0X2luY29tZSA8LSBHZXRJbmNvbWUoIk1TRlQiLCAyMDE2KQ0KbXNmdF9pbmNvbWUyIDwtIEdldEluY29tZSgiTVNGVCIsIDIwMTMpDQptc2Z0X2luY29tZTMgPC0gR2V0SW5jb21lKCJNU0ZUIiwgMjAxNykNCmBgYA0KDQpgYGB7cn0NCnJlc3VsdGFkbyA8LSByYmluZChtc2Z0X2luY29tZSxtc2Z0X2luY29tZTIsbXNmdF9pbmNvbWUzKQ0KYGBgDQoNCmBgYHtyfQ0KcmVzdWx0YWRvJHN0YXJ0RGF0ZSA8LSBhcy5EYXRlKHJlc3VsdGFkbyRzdGFydERhdGUpDQpyZXN1bHRhZG8kZW5kRGF0ZSA8LSBhcy5EYXRlKHJlc3VsdGFkbyRlbmREYXRlKQ0KcmVzdWx0YWRvJEFtb3VudCA8LSBhcy5udW1lcmljKHJlc3VsdGFkbyRBbW91bnQpDQpgYGANCg0KYGBge3J9DQpyZXN1bHRhZG9faW5jb21lIDwtIHJlc3VsdGFkb1tyZXN1bHRhZG8kTWV0cmljPT0iUmV2ZW51ZSwgTmV0IixdDQpgYGANCg0KYGBge3J9DQp0cyA8LSB0cyhkYXRhPXJlc3VsdGFkb19pbmNvbWUkQW1vdW50LCBzdGFydCA9IGMoMjAxMywxKSwgZnJlcXVlbmN5PTEpDQp0cw0KYGBgDQoNCmBgYHtyfQ0KYXJpbWEgPC0gYXV0by5hcmltYSh0cykNCmBgYA0KDQpgYGB7cn0NCnByb25vc3RpY28gPC0gZm9yZWNhc3QoYXJpbWEsIGxldmVsPWMoOTUpLCBoPTUpDQpgYGANCg0KYGBge3J9DQpwbG90KHByb25vc3RpY28pDQpgYGANCg==