Daniel Farías | A01236327

Kathia Ruiz | A01571094

Naila Salinas | A00832702

Sofia Badillo | A02384253

### uploading libraries 
library(xts)
library(zoo)
library(tseries)
library(stats)
library(forecast)
library(astsa)
library(corrplot)
library(AER)
library(dynlm)
library(vars)
library(dygraphs)
#library(mFilter)
library(TSstudio)
library(tidyverse)
library(sarima)
library(stargazer)
library(ggplot2)
library(dplyr)
VARts <- read.csv("C:\\Users\\danyb\\OneDrive - Instituto Tecnologico y de Estudios Superiores de Monterrey\\Docs\\Documentos\\Business Intelligence\\Quinto Semestre\\Introduction to Econometrics\\2015_energy_stock_prices.csv") 

a. Visualization

  • Selected stock price: IBDRY_Adj_Close Iberdrola SA is one of the biggest renewable energy companies in the world, with a Spain origin and 170 years of history. It is the world’s largest wind power producer and one of the world’s largest electric utilities by market capitalization. It is foccus in energy transition to to reduce the negative effects of climate change and the need for a clean, reliable and smart business model. (Iberdrola SA, 2023)
sum(is.na(VARts))
## [1] 0
  • Plot the selected stocks price over the time period
VARts$Date <- as.Date(VARts$Date,"%m/%d/%Y")
IBxts<-xts(VARts$IBDRY_Adj_Close,order.by=VARts$Date)
dygraph(IBxts, main = "Iberdrola SA Stock Price") %>% 
  dyOptions(colors = RColorBrewer::brewer.pal(4, "Dark2"))

In this graph, we can observe a positive trend over time, with a notable increase between October 2018 and December 2020. There are also some remarkable decreases around March 2020, September 2021 and and September 2022. After the decrease of September 2022 the trend line continues to show a positive trend

This positive trend could be related to the significant increase in greenhouse gas emissions and consequent global warming in recent years. Which have generated a greater demand for the services offered by Iberdrola.

  • Decompose the stock price and describe the trend and seasonal components of the time series data.
IBDRYts<-ts(VARts$IBDRY_Adj_Close,start=c(2015,1),end=c(2022,12),frequency=12)
IBdec<-decompose(IBDRYts)
plot(IBdec)

In the decomposition of the time series it is possible to get a better understanding of its behavior. The observed variable part shows a similar performance to the ones previously described on the time series plots. The trend part shows a more clear positive trend that started to increase in 2018; with this, it can be inferred that stock price generally maintains a favorable positive trend, even tho it has periodic decreases. The seasonal part shows a pattern of dates where the stock price is favorable because it stands out more on the positive side or high points. Also, it is possible to see similar behaviors divided in different periods of the random part for the variable every two years.

  • Do the selected stock price display non-stationary series or stationary series?
adf.test(VARts$IBDRY_Adj_Close)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  VARts$IBDRY_Adj_Close
## Dickey-Fuller = -1.6998, Lag order = 4, p-value = 0.7005
## alternative hypothesis: stationary

Since the p-value is greater than 0.05, it is determined that the series is non-stationary.

b. Describing Dynamic Interactions

Selecting explanatory variables:

The selected explanatory variables that will be used to try to explain Iberdrola’s stock price are the following below:

  • Non-Store Retailing: it measures the performance of online and non-traditional retail businesses.

  • Unemployment: unemployment rate

  • Consumer Confidence: it measures how optimistic / pessimistic consumers are regarding the state of the economy.

  • Hour_Wage Sentiment: evaluates the sentiment related to hourly wages.

par(mfrow=c(2,3))
plot(VARts$Date,VARts$NonStore_Retailing,type="l",col="blue",lwd=2,xlab="Date",ylab="NonStore_Retailing (USD)",main="NonStore_Retailing")
plot(VARts$Date,VARts$US_Unemployment,type="l",col="blue",lwd=2,xlab="Date",ylab="US_Unemployment",main="US_Unemployment")
plot(VARts$Date,VARts$US_Consumer_Confidence,type="l",col="blue",lwd=2,xlab="Date",ylab="US_Consumer_Confidence",main="US_Consumer_Confidence")
plot(VARts$Date,VARts$US_Min_Hour_Wage,type="l",col="blue",lwd=2,xlab="Date",ylab="US_Min_Hour_Wage Sentiment (USD)",main="US_Min_Hour_Wage")
plot(VARts$Date,VARts$IBDRY_Adj_Close,type="l",col="blue",lwd=2,xlab="Date",ylab="IBDRY_Adj_Close",main="IBDRY's Stock Price (USD")

The graphs show the following:

Non Store Retailing: it has a trend of growth over the years, which is probably because e-commerce is becoming more popular for its accessibility or convenience. Also, this trend intensified after the pandemic, because people found a more practical way to get products without being in contact with people. In a similar way, the stock price presents a trend of growing, so it can exist a positive relation between these two variables.

Unemployment: it started with a downward trend, but then, in 2020 it grew to the highest point to decrease again in the next few years. So we can say the variables have a negative relationship, probably because of the economic growth in the country.

Consumer Confidence: at first it seems to have a positive trend with a pattern of ups and downs, having values over 85. But, since the pandemic, in the first months of 2020, it started to decrease because of the uncertainty. In a similar way and with not much time difference, the stock price of the company also began to decrease, so they seem to have a positive relationship.

Min_Hour Wage: has the same value in all the periods, so it doesn’t have a relationship with the other variables.

IBDRY’s Stock Price: it has in general a growing trend, but decreased in 2020 because of the pandemic, but it started to increase again with ups and downs.

c. Estimation & Model Selection

In order to take the best decision to estimate a model, we are going to test variables with the intention of estimating a model, using stationary time series data.

#Doing this with ts type of this variables gives the same result. 
adf.test(VARts$IBDRY_Adj_Close) 
## 
##  Augmented Dickey-Fuller Test
## 
## data:  VARts$IBDRY_Adj_Close
## Dickey-Fuller = -1.6998, Lag order = 4, p-value = 0.7005
## alternative hypothesis: stationary
adf.test(VARts$NonStore_Retailing) 
## 
##  Augmented Dickey-Fuller Test
## 
## data:  VARts$NonStore_Retailing
## Dickey-Fuller = -1.8269, Lag order = 4, p-value = 0.648
## alternative hypothesis: stationary
adf.test(VARts$US_Unemployment)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  VARts$US_Unemployment
## Dickey-Fuller = -2.5755, Lag order = 4, p-value = 0.3386
## alternative hypothesis: stationary
adf.test(VARts$US_Consumer_Confidence) 
## 
##  Augmented Dickey-Fuller Test
## 
## data:  VARts$US_Consumer_Confidence
## Dickey-Fuller = -1.7896, Lag order = 4, p-value = 0.6634
## alternative hypothesis: stationary
tsplot(VARts$IBDRY_Adj_Close)

Once we obtained the results for Augmented Dickey-Fuller Test for the variables we are pretending to use in our model, it is possible to see that all of them are non-stationary, having a p-value greater than 0.05.

#Transforming to log in order to get stationary series.
adf.test(log(VARts$IBDRY_Adj_Close))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  log(VARts$IBDRY_Adj_Close)
## Dickey-Fuller = -1.6406, Lag order = 4, p-value = 0.7249
## alternative hypothesis: stationary
tsplot(log(VARts$IBDRY_Adj_Close))

Despite the fact of having a different p-value, it is also greater than 0.05, that’s why it is also necessary to transform variables into differences.

#Doing this with ts type of this variables gives the same result. 
adf.test(diff(log(VARts$IBDRY_Adj_Close)))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff(log(VARts$IBDRY_Adj_Close))
## Dickey-Fuller = -4.0157, Lag order = 4, p-value = 0.01179
## alternative hypothesis: stationary
adf.test(diff(log(VARts$NonStore_Retailing)))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff(log(VARts$NonStore_Retailing))
## Dickey-Fuller = -3.965, Lag order = 4, p-value = 0.0142
## alternative hypothesis: stationary
adf.test(diff(log(VARts$US_Unemployment)))
## Warning in adf.test(diff(log(VARts$US_Unemployment))): p-value smaller than
## printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff(log(VARts$US_Unemployment))
## Dickey-Fuller = -4.6314, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
adf.test(diff(log(VARts$US_Consumer_Confidence)))
## Warning in adf.test(diff(log(VARts$US_Consumer_Confidence))): p-value smaller
## than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff(log(VARts$US_Consumer_Confidence))
## Dickey-Fuller = -5.6905, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
tsplot(diff(log(VARts$IBDRY_Adj_Close)))

Using differences and log, it is possible to get stationary time series data (p-value < 0.05), this option is the one that we are going to use to estimate a model, in order to have an accurate prediction.

i. Estimating a VAR Model

#Converting to time series format
nsr<-ts(VARts$NonStore_Retailing,start=c(2015,1),end=c(2022,12),frequency=12)
unemployment<-ts(VARts$US_Unemployment,start=c(2015,1),end=c(2022,12),frequency=12)
cc<-ts(VARts$US_Consumer_Confidence,start=c(2015,1),end=c(2022,12),frequency=12)
stock<-ts(VARts$IBDRY_Adj_Close,start=c(2015,1),end=c(2022,12),frequency=12)

#Transforming into diff and log values.
dstock<-diff(log(stock))
dnsr<-diff(log(nsr))
dunemployment<-diff(log(unemployment))
dcc<-diff(log(cc))
VAR_ts<-cbind(dstock, dnsr, dunemployment,dcc)
colnames(VAR_ts)<-cbind("IBDRY_Stock", "NonStore_Retailing", "US_Unemployment","US_Consumer_Confidence")
lag_selection<-VARselect(VAR_ts,lag.max=5,type="const", season=12)
lag_selection$selection
## AIC(n)  HQ(n)  SC(n) FPE(n) 
##      1      1      1      1
lag_selection$criteria
##                    1             2             3             4             5
## AIC(n) -2.261967e+01 -2.256884e+01 -2.248295e+01 -2.231861e+01 -2.223682e+01
## HQ(n)  -2.190282e+01 -2.167278e+01 -2.140767e+01 -2.106412e+01 -2.080312e+01
## SC(n)  -2.084202e+01 -2.034678e+01 -1.981648e+01 -1.920773e+01 -1.868153e+01
## FPE(n)  1.524182e-10  1.627713e-10  1.814383e-10  2.209031e-10  2.506538e-10

In the above results we can observe:

  • The AIC is lowest for a lag order of 1 (AIC = -22.619), suggesting that a VAR model with a lag order of 4 might be the best choice based on AIC.

  • The HQ criterion is lowest for a lag order of 4 (HQ = -21.902), aligning with the AIC results.

  • The SC is lowest for a lag order of 4 (SC = -20.84), again suggesting that a lag order of 4 might be the optimal choice based on SC.

  • The FPE criterion decreases as lag order increases. However, the difference in FPE values between different lag orders is not as pronounced as with the other criteria.

In summary, based on the criteria used for evaluation (AIC, HQ, SC, and FPE), Lag Order 1 appears to be the preferred choice as it consistently minimizes these criterion values. This suggests that a model with a lag order of 1 might provide a better fit to the data compared to other lag orders.

# We estimate the VAR model. The p option refers to the number of lags used.
VAR_model1<-VAR(VAR_ts,p=1,type="const",season=4) 
summary(VAR_model1)
## 
## VAR Estimation Results:
## ========================= 
## Endogenous variables: IBDRY_Stock, NonStore_Retailing, US_Unemployment, US_Consumer_Confidence 
## Deterministic variables: const 
## Sample size: 94 
## Log Likelihood: 583.72 
## Roots of the characteristic polynomial:
## 0.3648 0.3648 0.04547 0.03011
## Call:
## VAR(y = VAR_ts, p = 1, type = "const", season = 4L)
## 
## 
## Estimation results for equation IBDRY_Stock: 
## ============================================ 
## IBDRY_Stock = IBDRY_Stock.l1 + NonStore_Retailing.l1 + US_Unemployment.l1 + US_Consumer_Confidence.l1 + const + sd1 + sd2 + sd3 
## 
##                            Estimate Std. Error t value Pr(>|t|)  
## IBDRY_Stock.l1            -0.264127   0.100834  -2.619   0.0104 *
## NonStore_Retailing.l1     -0.120433   0.274262  -0.439   0.6617  
## US_Unemployment.l1         0.100186   0.057924   1.730   0.0873 .
## US_Consumer_Confidence.l1  0.276492   0.132985   2.079   0.0406 *
## const                      0.014895   0.007115   2.093   0.0393 *
## sd1                        0.011868   0.019467   0.610   0.5437  
## sd2                        0.014232   0.018498   0.769   0.4438  
## sd3                        0.045424   0.018707   2.428   0.0173 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 
## Residual standard error: 0.06156 on 86 degrees of freedom
## Multiple R-Squared: 0.182,   Adjusted R-squared: 0.1154 
## F-statistic: 2.733 on 7 and 86 DF,  p-value: 0.01308 
## 
## 
## Estimation results for equation NonStore_Retailing: 
## =================================================== 
## NonStore_Retailing = IBDRY_Stock.l1 + NonStore_Retailing.l1 + US_Unemployment.l1 + US_Consumer_Confidence.l1 + const + sd1 + sd2 + sd3 
## 
##                            Estimate Std. Error t value Pr(>|t|)    
## IBDRY_Stock.l1            -0.022922   0.038503  -0.595 0.553184    
## NonStore_Retailing.l1     -0.410938   0.104727  -3.924 0.000175 ***
## US_Unemployment.l1         0.080025   0.022118   3.618 0.000500 ***
## US_Consumer_Confidence.l1 -0.046327   0.050780  -0.912 0.364156    
## const                      0.015285   0.002717   5.626 2.26e-07 ***
## sd1                       -0.003438   0.007433  -0.463 0.644870    
## sd2                       -0.001921   0.007063  -0.272 0.786286    
## sd3                       -0.002405   0.007143  -0.337 0.737179    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 
## Residual standard error: 0.02351 on 86 degrees of freedom
## Multiple R-Squared: 0.2457,  Adjusted R-squared: 0.1843 
## F-statistic: 4.002 on 7 and 86 DF,  p-value: 0.00078 
## 
## 
## Estimation results for equation US_Unemployment: 
## ================================================ 
## US_Unemployment = IBDRY_Stock.l1 + NonStore_Retailing.l1 + US_Unemployment.l1 + US_Consumer_Confidence.l1 + const + sd1 + sd2 + sd3 
## 
##                            Estimate Std. Error t value Pr(>|t|)   
## IBDRY_Stock.l1            -0.577862   0.215458  -2.682  0.00877 **
## NonStore_Retailing.l1      0.270087   0.586036   0.461  0.64605   
## US_Unemployment.l1         0.059154   0.123770   0.478  0.63391   
## US_Consumer_Confidence.l1 -0.230387   0.284159  -0.811  0.41974   
## const                     -0.003666   0.015203  -0.241  0.81004   
## sd1                       -0.016030   0.041596  -0.385  0.70091   
## sd2                        0.002128   0.039526   0.054  0.95719   
## sd3                        0.047920   0.039973   1.199  0.23389   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 
## Residual standard error: 0.1315 on 86 degrees of freedom
## Multiple R-Squared: 0.134,   Adjusted R-squared: 0.06354 
## F-statistic: 1.901 on 7 and 86 DF,  p-value: 0.07903 
## 
## 
## Estimation results for equation US_Consumer_Confidence: 
## ======================================================= 
## US_Consumer_Confidence = IBDRY_Stock.l1 + NonStore_Retailing.l1 + US_Unemployment.l1 + US_Consumer_Confidence.l1 + const + sd1 + sd2 + sd3 
## 
##                            Estimate Std. Error t value Pr(>|t|)
## IBDRY_Stock.l1             0.047726   0.090697   0.526    0.600
## NonStore_Retailing.l1      0.233262   0.246690   0.946    0.347
## US_Unemployment.l1        -0.060748   0.052101  -1.166    0.247
## US_Consumer_Confidence.l1 -0.057425   0.119616  -0.480    0.632
## const                     -0.008496   0.006400  -1.328    0.188
## sd1                        0.002086   0.017510   0.119    0.905
## sd2                       -0.009595   0.016638  -0.577    0.566
## sd3                        0.003451   0.016827   0.205    0.838
## 
## 
## Residual standard error: 0.05537 on 86 degrees of freedom
## Multiple R-Squared: 0.0353,  Adjusted R-squared: -0.04323 
## F-statistic: 0.4495 on 7 and 86 DF,  p-value: 0.868 
## 
## 
## 
## Covariance matrix of residuals:
##                        IBDRY_Stock NonStore_Retailing US_Unemployment
## IBDRY_Stock              3.790e-03         -5.975e-05       -0.001276
## NonStore_Retailing      -5.975e-05          5.526e-04        0.001398
## US_Unemployment         -1.276e-03          1.398e-03        0.017305
## US_Consumer_Confidence   2.290e-04         -2.325e-04       -0.003357
##                        US_Consumer_Confidence
## IBDRY_Stock                         0.0002290
## NonStore_Retailing                 -0.0002325
## US_Unemployment                    -0.0033574
## US_Consumer_Confidence              0.0030663
## 
## Correlation matrix of residuals:
##                        IBDRY_Stock NonStore_Retailing US_Unemployment
## IBDRY_Stock                1.00000           -0.04128         -0.1575
## NonStore_Retailing        -0.04128            1.00000          0.4520
## US_Unemployment           -0.15750            0.45196          1.0000
## US_Consumer_Confidence     0.06718           -0.17858         -0.4609
##                        US_Consumer_Confidence
## IBDRY_Stock                           0.06718
## NonStore_Retailing                   -0.17858
## US_Unemployment                      -0.46091
## US_Consumer_Confidence                1.00000
VAR_model1_residuals<-data.frame(residuals(VAR_model1))
adf.test(VAR_model1_residuals$IBDRY_Stock)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  VAR_model1_residuals$IBDRY_Stock
## Dickey-Fuller = -3.508, Lag order = 4, p-value = 0.04549
## alternative hypothesis: stationary
# The p-value is lower than 0.05, so we fail to reject H0, and it can be concluded that residuals are stationary.
Box.test(VAR_model1_residuals$IBDRY_Stock,lag=1,type="Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  VAR_model1_residuals$IBDRY_Stock
## X-squared = 0.064892, df = 1, p-value = 0.7989
# The p-value is greater than 0.05, so there is not enough evidence to conclude that there is autocorrelation in the residuals.

ii. Model Selection

Briefly interpret the regression results. That is, is there a statistically significant relationship between the explanatory variables and the main dependent variable?

The provided VAR estimation results describe the relationships between several economic variables: “IBDRY_Stock,” “NonStore_Retailing,” “US_Unemployment,” and “US_Consumer_Confidence.” Let’s interpret these results and provide some insights:

  1. Model Summary:
    • The model includes four endogenous variables: “IBDRY_Stock,” “NonStore_Retailing,” “US_Unemployment,” and “US_Consumer_Confidence.”
    • A constant term is included in the model.
    • The sample size used for estimation consists of 94 observations.
    • The log likelihood of the model is 583.72.
  2. Characteristic Polynomial Roots:
    • The characteristic polynomial roots are given as 0.3648, 0.3648, 0.04547, and 0.03011. These roots are essential for determining the stability of the VAR model. Having roots with magnitudes less than one indicates stability.
  3. Equation-Specific Results:
    • The output provides results for each endogenous variable equation in the VAR model. We are going to interpret the statistically significant variables for each equation.
    IBDRY_Stock Equation: (Main dependent Variable)
    • “IBDRY_Stock” has a negative coefficient for its own lagged value (“IBDRY_Stock.l1”). This suggests that past values of the stock price negatively affect the current stock price.
    • “US_Consumer_Confidence.l1” has a positive coefficient, indicating that an increase in consumer confidence in the previous period is associated with a higher stock price in the current period.
    NonStore_Retailing Equation:
    • “NonStore_Retailing” is negatively influenced by its own lagged value.
    • “US_Unemployment.l1” has a positive effect on “NonStore_Retailing,” suggesting that an increase in unemployment in the previous period is associated with higher non-store retailing in the current period.
    • The constant term has a significant positive impact on “NonStore_Retailing.”
    US_Unemployment Equation:
    • “IBDRY_Stock.l1” has a negative coefficient, indicating that an increase in the previous period’s IBDRY stock price is associated with a decrease in unemployment in the current period.
    • The other variables, including “NonStore_Retailing.l1” and “US_Consumer_Confidence.l1,” do not have significant effects on “US_Unemployment.”
    US_Consumer_Confidence Equation:
    • “IBDRY_Stock.l1” has a small positive effect on “US_Consumer_Confidence,” though it is not statistically significant.
    • None of the other variables, including lagged values and the constant term, have significant effects on “US_Consumer_Confidence.”
  4. Residuals and Model Fit:
    • Each equation’s residuals have residual standard errors, multiple R-squared, adjusted R-squared, and F-statistics.
    • These statistics provide information about the goodness of fit for each equation.
  5. Covariance Matrix and Correlation Matrix of Residuals:
    • These matrices show the relationships between the residuals of different equations.
    • For example, the correlation matrix indicates how correlated the residuals of the different variables are. Negative values suggest inverse correlations, while positive values suggest direct correlations.

Do the selected explanatory variables have an influence on the stock price? Yes they do. Mostly Unemploymnet and lagged Consumer Confidence.

Is there an instantaneous causality between the stocks price and the selected explanatory variables? Estimate a Granger Causality Test to either reject or fail to reject the hypothesis of instantaneous causality.

granger_IBDRY<-causality(VAR_model1,cause="IBDRY_Stock")
granger_IBDRY
## $Granger
## 
##  Granger causality H0: IBDRY_Stock do not Granger-cause
##  NonStore_Retailing US_Unemployment US_Consumer_Confidence
## 
## data:  VAR object VAR_model1
## F-Test = 2.7848, df1 = 3, df2 = 344, p-value = 0.04081
## 
## 
## $Instant
## 
##  H0: No instantaneous causality between: IBDRY_Stock and
##  NonStore_Retailing US_Unemployment US_Consumer_Confidence
## 
## data:  VAR object VAR_model1
## Chi-squared = 2.3807, df = 3, p-value = 0.4972

Having a p-value of 0.04, we can say that IBDRY_Stock do cause a significant effect on one or more of the selected variables. Rejecting H0.

d. Forecasting

Based on the selected VAR_Model, forecast the stock price for the next 5 months. Display the forecast in a time series plot.

forecast <- predict(VAR_model1, n.ahead = 5, ci = 0.95)
# Revertir las transformaciones log y diff
forecast$fcst$IBDRY_Stock <- exp(forecast$fcst$IBDRY_Stock)  # Reverting log

#Reverting differences for forecasts
forecast$fcst$IBDRY_Stock[1]<-forecast$fcst$IBDRY_Stock[1] + tail(VARts$IBDRY_Adj_Close, 1)
forecast$fcst$IBDRY_Stock[2]<-forecast$fcst$IBDRY_Stock[2] + forecast$fcst$IBDRY_Stock[1]
forecast$fcst$IBDRY_Stock[3]<-forecast$fcst$IBDRY_Stock[3] + forecast$fcst$IBDRY_Stock[2]
forecast$fcst$IBDRY_Stock[4]<-forecast$fcst$IBDRY_Stock[4] + forecast$fcst$IBDRY_Stock[3]
forecast$fcst$IBDRY_Stock[5]<-forecast$fcst$IBDRY_Stock[5] + forecast$fcst$IBDRY_Stock[4]
fanchart(forecast,names="IBDRY_Stock",main="IBDRY Stock Price",xlab="Time Period",ylab="Stock Price")

tsplot(forecast)

We transform the predicted variable for “IBDRY STOCK” into its original format value, but this just applied to the direct accurate forecast. It was not possible to transform its lower and upper values.

#Forecast
forecast$fcst$IBDRY_Stock
##          fcst     lower    upper       CI
## [1,] 45.72577 0.8825874 1.123476 1.128244
## [2,] 46.73091 0.8839539 1.142930 1.137090
## [3,] 47.73630 0.8835755 1.144010 1.137871
## [4,] 48.77215 0.9102341 1.178781 1.137994
## [5,] 49.76233 0.8700857 1.126850 1.138026

When generating a forecast with this model, we can obtain an estimate of what the stock price for the next 5 periods could be. Taking into account a 95% confidence level, these values might be close as follows:

  • Period 1: Price close to $45.73

  • Period 2: Price close to $46.73

  • Period 3: Price close to $47.74

  • Period 4: Price close to $48.77

  • Period 5: Price close to $49.76

References:

Iberdrola SA (2023). Iberdrola. https://www.iberdrola.com/conocenos/nuestra-empresa

LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgNCINCmF1dGhvcjogIlRlYW0gNCBFY29ub21ldHJpY3MiDQpkYXRlOiAiMjAyMy0wOS0wNyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KLS0tDQpEYW5pZWwgRmFyw61hcyB8IEEwMTIzNjMyNw0KDQpLYXRoaWEgUnVpeiB8IEEwMTU3MTA5NA0KDQpOYWlsYSBTYWxpbmFzIHwgQTAwODMyNzAyIA0KDQpTb2ZpYSBCYWRpbGxvIHwgQTAyMzg0MjUzDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQ0KIyMjIHVwbG9hZGluZyBsaWJyYXJpZXMgDQpsaWJyYXJ5KHh0cykNCmxpYnJhcnkoem9vKQ0KbGlicmFyeSh0c2VyaWVzKQ0KbGlicmFyeShzdGF0cykNCmxpYnJhcnkoZm9yZWNhc3QpDQpsaWJyYXJ5KGFzdHNhKQ0KbGlicmFyeShjb3JycGxvdCkNCmxpYnJhcnkoQUVSKQ0KbGlicmFyeShkeW5sbSkNCmxpYnJhcnkodmFycykNCmxpYnJhcnkoZHlncmFwaHMpDQojbGlicmFyeShtRmlsdGVyKQ0KbGlicmFyeShUU3N0dWRpbykNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShzYXJpbWEpDQpsaWJyYXJ5KHN0YXJnYXplcikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpgYGANCg0KYGBge3J9DQpWQVJ0cyA8LSByZWFkLmNzdigiQzpcXFVzZXJzXFxkYW55YlxcT25lRHJpdmUgLSBJbnN0aXR1dG8gVGVjbm9sb2dpY28geSBkZSBFc3R1ZGlvcyBTdXBlcmlvcmVzIGRlIE1vbnRlcnJleVxcRG9jc1xcRG9jdW1lbnRvc1xcQnVzaW5lc3MgSW50ZWxsaWdlbmNlXFxRdWludG8gU2VtZXN0cmVcXEludHJvZHVjdGlvbiB0byBFY29ub21ldHJpY3NcXDIwMTVfZW5lcmd5X3N0b2NrX3ByaWNlcy5jc3YiKSANCmBgYA0KDQojIGEuIFZpc3VhbGl6YXRpb24NCg0KKiBTZWxlY3RlZCBzdG9jayBwcmljZTogSUJEUllfQWRqX0Nsb3NlDQpJYmVyZHJvbGEgU0EgaXMgb25lIG9mIHRoZSBiaWdnZXN0IHJlbmV3YWJsZSBlbmVyZ3kgY29tcGFuaWVzIGluIHRoZSB3b3JsZCwgd2l0aCBhIFNwYWluIG9yaWdpbiBhbmQgMTcwIHllYXJzIG9mIGhpc3RvcnkuIEl0IGlzIHRoZSB3b3JsZCdzIGxhcmdlc3Qgd2luZCBwb3dlciBwcm9kdWNlciBhbmQgb25lIG9mIHRoZSB3b3JsZCdzIGxhcmdlc3QgZWxlY3RyaWMgdXRpbGl0aWVzIGJ5IG1hcmtldCBjYXBpdGFsaXphdGlvbi4gSXQgaXMgZm9jY3VzIGluIGVuZXJneSB0cmFuc2l0aW9uIHRvIHRvIHJlZHVjZSB0aGUgbmVnYXRpdmUgZWZmZWN0cyBvZiBjbGltYXRlIGNoYW5nZSBhbmQgdGhlIG5lZWQgZm9yIGEgY2xlYW4sIHJlbGlhYmxlIGFuZCBzbWFydCBidXNpbmVzcyBtb2RlbC4gKEliZXJkcm9sYSBTQSwgMjAyMykNCg0KYGBge3J9DQpzdW0oaXMubmEoVkFSdHMpKQ0KDQpgYGANCiogUGxvdCB0aGUgc2VsZWN0ZWQgc3RvY2tzIHByaWNlIG92ZXIgdGhlIHRpbWUgcGVyaW9kIA0KDQpgYGB7cn0NClZBUnRzJERhdGUgPC0gYXMuRGF0ZShWQVJ0cyREYXRlLCIlbS8lZC8lWSIpDQpJQnh0czwteHRzKFZBUnRzJElCRFJZX0Fkal9DbG9zZSxvcmRlci5ieT1WQVJ0cyREYXRlKQ0KZHlncmFwaChJQnh0cywgbWFpbiA9ICJJYmVyZHJvbGEgU0EgU3RvY2sgUHJpY2UiKSAlPiUgDQogIGR5T3B0aW9ucyhjb2xvcnMgPSBSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwoNCwgIkRhcmsyIikpDQpgYGANCkluIHRoaXMgZ3JhcGgsIHdlIGNhbiBvYnNlcnZlIGEgcG9zaXRpdmUgdHJlbmQgb3ZlciB0aW1lLCB3aXRoIGEgbm90YWJsZSBpbmNyZWFzZSBiZXR3ZWVuICBPY3RvYmVyIDIwMTggYW5kIERlY2VtYmVyIDIwMjAuIFRoZXJlIGFyZSBhbHNvIHNvbWUgcmVtYXJrYWJsZSBkZWNyZWFzZXMgYXJvdW5kIE1hcmNoIDIwMjAsIFNlcHRlbWJlciAyMDIxIGFuZCAgYW5kIFNlcHRlbWJlciAyMDIyLiBBZnRlciB0aGUgZGVjcmVhc2Ugb2YgU2VwdGVtYmVyIDIwMjIgdGhlIHRyZW5kIGxpbmUgY29udGludWVzIHRvIHNob3cgYSBwb3NpdGl2ZSB0cmVuZA0KDQpUaGlzIHBvc2l0aXZlIHRyZW5kIGNvdWxkIGJlIHJlbGF0ZWQgdG8gdGhlIHNpZ25pZmljYW50IGluY3JlYXNlIGluIGdyZWVuaG91c2UgZ2FzIGVtaXNzaW9ucyBhbmQgY29uc2VxdWVudCBnbG9iYWwgd2FybWluZyBpbiByZWNlbnQgeWVhcnMuIFdoaWNoIGhhdmUgZ2VuZXJhdGVkIGEgZ3JlYXRlciBkZW1hbmQgZm9yIHRoZSBzZXJ2aWNlcyBvZmZlcmVkwqBiecKgSWJlcmRyb2xhLg0KDQoNCiogRGVjb21wb3NlIHRoZSBzdG9jayBwcmljZSBhbmQgZGVzY3JpYmUgdGhlIHRyZW5kIGFuZCBzZWFzb25hbCBjb21wb25lbnRzIG9mIHRoZSB0aW1lIHNlcmllcyBkYXRhLg0KDQoNCmBgYHtyfQ0KSUJEUll0czwtdHMoVkFSdHMkSUJEUllfQWRqX0Nsb3NlLHN0YXJ0PWMoMjAxNSwxKSxlbmQ9YygyMDIyLDEyKSxmcmVxdWVuY3k9MTIpDQpJQmRlYzwtZGVjb21wb3NlKElCRFJZdHMpDQpwbG90KElCZGVjKQ0KYGBgDQoNCkluIHRoZSBkZWNvbXBvc2l0aW9uIG9mIHRoZSB0aW1lIHNlcmllcyBpdCBpcyBwb3NzaWJsZSB0byBnZXQgYSBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvZiBpdHMgYmVoYXZpb3IuIFRoZSBvYnNlcnZlZCB2YXJpYWJsZSBwYXJ0IHNob3dzIGEgc2ltaWxhciBwZXJmb3JtYW5jZSB0byB0aGUgb25lcyBwcmV2aW91c2x5IGRlc2NyaWJlZCBvbiB0aGUgdGltZSBzZXJpZXMgcGxvdHMuIFRoZSB0cmVuZCBwYXJ0IHNob3dzIGEgbW9yZSBjbGVhciBwb3NpdGl2ZSB0cmVuZCB0aGF0IHN0YXJ0ZWQgdG8gaW5jcmVhc2UgaW4gMjAxODsgd2l0aCB0aGlzLCBpdCBjYW4gYmUgaW5mZXJyZWQgdGhhdCBzdG9jayBwcmljZSBnZW5lcmFsbHkgbWFpbnRhaW5zIGEgZmF2b3JhYmxlIHBvc2l0aXZlIHRyZW5kLCBldmVuIHRobyBpdCBoYXMgcGVyaW9kaWMgZGVjcmVhc2VzLiBUaGUgc2Vhc29uYWwgcGFydCBzaG93cyBhIHBhdHRlcm4gb2YgZGF0ZXMgd2hlcmUgdGhlIHN0b2NrIHByaWNlIGlzIGZhdm9yYWJsZSBiZWNhdXNlIGl0IHN0YW5kcyBvdXQgbW9yZSBvbiB0aGUgcG9zaXRpdmUgc2lkZSBvciBoaWdoIHBvaW50cy4gQWxzbywgaXQgaXMgcG9zc2libGUgdG8gc2VlIHNpbWlsYXIgYmVoYXZpb3JzIGRpdmlkZWQgaW4gZGlmZmVyZW50IHBlcmlvZHMgb2YgdGhlIHJhbmRvbSBwYXJ0IGZvciB0aGUgdmFyaWFibGUgZXZlcnkgdHdvIHllYXJzLg0KDQoNCiogRG8gdGhlIHNlbGVjdGVkIHN0b2NrIHByaWNlIGRpc3BsYXkgbm9uLXN0YXRpb25hcnkgc2VyaWVzIG9yIHN0YXRpb25hcnkgc2VyaWVzPw0KYGBge3J9DQphZGYudGVzdChWQVJ0cyRJQkRSWV9BZGpfQ2xvc2UpDQpgYGANCg0KU2luY2UgdGhlIHAtdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDAuMDUsIGl0IGlzIGRldGVybWluZWQgdGhhdCB0aGUgc2VyaWVzIGlzIG5vbi1zdGF0aW9uYXJ5Lg0KDQoNCiMgYi4gRGVzY3JpYmluZyBEeW5hbWljIEludGVyYWN0aW9ucw0KIyMgU2VsZWN0aW5nIGV4cGxhbmF0b3J5IHZhcmlhYmxlczoNClRoZSBzZWxlY3RlZCBleHBsYW5hdG9yeSB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gdHJ5IHRvIGV4cGxhaW4gSWJlcmRyb2xh4oCZcyBzdG9jayBwcmljZSBhcmUgdGhlIGZvbGxvd2luZyBiZWxvdzogDQoNCg0KKiBOb24tU3RvcmUgUmV0YWlsaW5nOiBpdCBtZWFzdXJlcyB0aGUgcGVyZm9ybWFuY2Ugb2Ygb25saW5lIGFuZCBub24tdHJhZGl0aW9uYWwgcmV0YWlsIGJ1c2luZXNzZXMuDQoNCg0KKiBVbmVtcGxveW1lbnQ6IHVuZW1wbG95bWVudCByYXRlDQoNCg0KKiBDb25zdW1lciBDb25maWRlbmNlOiBpdCBtZWFzdXJlcyBob3cgb3B0aW1pc3RpYyAvIHBlc3NpbWlzdGljIGNvbnN1bWVycyBhcmUgcmVnYXJkaW5nIHRoZSBzdGF0ZSBvZiB0aGUgZWNvbm9teS4NCg0KDQoqIEhvdXJfV2FnZSBTZW50aW1lbnQ6IGV2YWx1YXRlcyB0aGUgc2VudGltZW50IHJlbGF0ZWQgdG8gaG91cmx5IHdhZ2VzLg0KDQpgYGB7cn0NCnBhcihtZnJvdz1jKDIsMykpDQpwbG90KFZBUnRzJERhdGUsVkFSdHMkTm9uU3RvcmVfUmV0YWlsaW5nLHR5cGU9ImwiLGNvbD0iYmx1ZSIsbHdkPTIseGxhYj0iRGF0ZSIseWxhYj0iTm9uU3RvcmVfUmV0YWlsaW5nIChVU0QpIixtYWluPSJOb25TdG9yZV9SZXRhaWxpbmciKQ0KcGxvdChWQVJ0cyREYXRlLFZBUnRzJFVTX1VuZW1wbG95bWVudCx0eXBlPSJsIixjb2w9ImJsdWUiLGx3ZD0yLHhsYWI9IkRhdGUiLHlsYWI9IlVTX1VuZW1wbG95bWVudCIsbWFpbj0iVVNfVW5lbXBsb3ltZW50IikNCnBsb3QoVkFSdHMkRGF0ZSxWQVJ0cyRVU19Db25zdW1lcl9Db25maWRlbmNlLHR5cGU9ImwiLGNvbD0iYmx1ZSIsbHdkPTIseGxhYj0iRGF0ZSIseWxhYj0iVVNfQ29uc3VtZXJfQ29uZmlkZW5jZSIsbWFpbj0iVVNfQ29uc3VtZXJfQ29uZmlkZW5jZSIpDQpwbG90KFZBUnRzJERhdGUsVkFSdHMkVVNfTWluX0hvdXJfV2FnZSx0eXBlPSJsIixjb2w9ImJsdWUiLGx3ZD0yLHhsYWI9IkRhdGUiLHlsYWI9IlVTX01pbl9Ib3VyX1dhZ2UgU2VudGltZW50IChVU0QpIixtYWluPSJVU19NaW5fSG91cl9XYWdlIikNCnBsb3QoVkFSdHMkRGF0ZSxWQVJ0cyRJQkRSWV9BZGpfQ2xvc2UsdHlwZT0ibCIsY29sPSJibHVlIixsd2Q9Mix4bGFiPSJEYXRlIix5bGFiPSJJQkRSWV9BZGpfQ2xvc2UiLG1haW49IklCRFJZJ3MgU3RvY2sgUHJpY2UgKFVTRCIpDQpgYGANCg0KVGhlIGdyYXBocyBzaG93IHRoZSBmb2xsb3dpbmc6DQoNCioqTm9uIFN0b3JlIFJldGFpbGluZzoqKiBpdCBoYXMgYSB0cmVuZCBvZiBncm93dGggb3ZlciB0aGUgeWVhcnMsIHdoaWNoIGlzIHByb2JhYmx5IGJlY2F1c2UgZS1jb21tZXJjZSBpcyBiZWNvbWluZyBtb3JlIHBvcHVsYXIgZm9yIGl0cyBhY2Nlc3NpYmlsaXR5IG9yIGNvbnZlbmllbmNlLiBBbHNvLCB0aGlzIHRyZW5kIGludGVuc2lmaWVkIGFmdGVyIHRoZSBwYW5kZW1pYywgYmVjYXVzZSBwZW9wbGUgZm91bmQgYSBtb3JlIHByYWN0aWNhbCB3YXkgdG8gZ2V0IHByb2R1Y3RzIHdpdGhvdXQgYmVpbmcgaW4gY29udGFjdCB3aXRoIHBlb3BsZS4gSW4gYSBzaW1pbGFyIHdheSwgdGhlIHN0b2NrIHByaWNlIHByZXNlbnRzIGEgdHJlbmQgb2YgZ3Jvd2luZywgc28gaXQgY2FuIGV4aXN0IGEgcG9zaXRpdmUgcmVsYXRpb24gYmV0d2VlbiB0aGVzZSB0d28gdmFyaWFibGVzLg0KDQoNCioqVW5lbXBsb3ltZW50OioqIGl0IHN0YXJ0ZWQgd2l0aCBhIGRvd253YXJkIHRyZW5kLCBidXQgdGhlbiwgaW4gMjAyMCBpdCBncmV3IHRvIHRoZSBoaWdoZXN0IHBvaW50IHRvIGRlY3JlYXNlIGFnYWluIGluIHRoZSBuZXh0IGZldyB5ZWFycy4gU28gd2UgY2FuIHNheSB0aGUgdmFyaWFibGVzIGhhdmUgYSBuZWdhdGl2ZSByZWxhdGlvbnNoaXAsIHByb2JhYmx5IGJlY2F1c2Ugb2YgdGhlIGVjb25vbWljIGdyb3d0aCBpbiB0aGUgY291bnRyeS4gDQoNCg0KKipDb25zdW1lciBDb25maWRlbmNlOioqIGF0IGZpcnN0IGl0IHNlZW1zIHRvIGhhdmUgYSBwb3NpdGl2ZSB0cmVuZCB3aXRoIGEgcGF0dGVybiBvZiB1cHMgYW5kIGRvd25zLCBoYXZpbmcgdmFsdWVzIG92ZXIgODUuIEJ1dCwgc2luY2UgdGhlIHBhbmRlbWljLCBpbiB0aGUgZmlyc3QgbW9udGhzIG9mIDIwMjAsIGl0IHN0YXJ0ZWQgdG8gZGVjcmVhc2UgYmVjYXVzZSBvZiB0aGUgdW5jZXJ0YWludHkuIEluIGEgc2ltaWxhciB3YXkgYW5kIHdpdGggbm90IG11Y2ggdGltZSBkaWZmZXJlbmNlLCB0aGUgc3RvY2sgcHJpY2Ugb2YgdGhlIGNvbXBhbnkgYWxzbyBiZWdhbiB0byBkZWNyZWFzZSwgc28gdGhleSBzZWVtIHRvIGhhdmUgYSBwb3NpdGl2ZSByZWxhdGlvbnNoaXAuDQoNCg0KKipNaW5fSG91ciBXYWdlOioqIGhhcyB0aGUgc2FtZSB2YWx1ZSBpbiBhbGwgdGhlIHBlcmlvZHMsIHNvIGl0IGRvZXNu4oCZdCBoYXZlIGEgcmVsYXRpb25zaGlwIHdpdGggdGhlIG90aGVyIHZhcmlhYmxlcy4NCg0KDQoqKklCRFJZ4oCZcyBTdG9jayBQcmljZToqKiBpdCBoYXMgaW4gZ2VuZXJhbCBhIGdyb3dpbmcgdHJlbmQsIGJ1dCBkZWNyZWFzZWQgaW4gMjAyMCBiZWNhdXNlIG9mIHRoZSBwYW5kZW1pYywgYnV0IGl0IHN0YXJ0ZWQgdG8gaW5jcmVhc2UgYWdhaW4gd2l0aCB1cHMgYW5kIGRvd25zLg0KDQoNCiMgYy4gRXN0aW1hdGlvbiAmIE1vZGVsIFNlbGVjdGlvbg0KDQpJbiBvcmRlciB0byB0YWtlIHRoZSBiZXN0IGRlY2lzaW9uIHRvIGVzdGltYXRlIGEgbW9kZWwsIHdlIGFyZSBnb2luZyB0byB0ZXN0IHZhcmlhYmxlcyB3aXRoIHRoZSBpbnRlbnRpb24gb2YgZXN0aW1hdGluZyBhIG1vZGVsLCB1c2luZyBzdGF0aW9uYXJ5IHRpbWUgc2VyaWVzIGRhdGEuDQoNCmBgYHtyfQ0KI0RvaW5nIHRoaXMgd2l0aCB0cyB0eXBlIG9mIHRoaXMgdmFyaWFibGVzIGdpdmVzIHRoZSBzYW1lIHJlc3VsdC4gDQphZGYudGVzdChWQVJ0cyRJQkRSWV9BZGpfQ2xvc2UpIA0KYWRmLnRlc3QoVkFSdHMkTm9uU3RvcmVfUmV0YWlsaW5nKSANCmFkZi50ZXN0KFZBUnRzJFVTX1VuZW1wbG95bWVudCkNCmFkZi50ZXN0KFZBUnRzJFVTX0NvbnN1bWVyX0NvbmZpZGVuY2UpIA0KdHNwbG90KFZBUnRzJElCRFJZX0Fkal9DbG9zZSkNCmBgYA0KDQoNCk9uY2Ugd2Ugb2J0YWluZWQgdGhlIHJlc3VsdHMgZm9yIEF1Z21lbnRlZCBEaWNrZXktRnVsbGVyIFRlc3QgZm9yIHRoZSB2YXJpYWJsZXMgd2UgYXJlIHByZXRlbmRpbmcgdG8gdXNlIGluIG91ciBtb2RlbCwgaXQgaXMgcG9zc2libGUgdG8gc2VlIHRoYXQgYWxsIG9mIHRoZW0gYXJlIG5vbi1zdGF0aW9uYXJ5LCBoYXZpbmcgYSBwLXZhbHVlIGdyZWF0ZXIgdGhhbiAwLjA1Lg0KDQoNCmBgYHtyfQ0KI1RyYW5zZm9ybWluZyB0byBsb2cgaW4gb3JkZXIgdG8gZ2V0IHN0YXRpb25hcnkgc2VyaWVzLg0KYWRmLnRlc3QobG9nKFZBUnRzJElCRFJZX0Fkal9DbG9zZSkpDQp0c3Bsb3QobG9nKFZBUnRzJElCRFJZX0Fkal9DbG9zZSkpDQpgYGANCg0KDQpEZXNwaXRlIHRoZSBmYWN0IG9mIGhhdmluZyBhIGRpZmZlcmVudCBwLXZhbHVlLCBpdCBpcyBhbHNvIGdyZWF0ZXIgdGhhbiAwLjA1LCB0aGF0J3Mgd2h5IGl0IGlzIGFsc28gbmVjZXNzYXJ5IHRvIHRyYW5zZm9ybSB2YXJpYWJsZXMgaW50byBkaWZmZXJlbmNlcy4NCg0KDQpgYGB7cn0NCiNEb2luZyB0aGlzIHdpdGggdHMgdHlwZSBvZiB0aGlzIHZhcmlhYmxlcyBnaXZlcyB0aGUgc2FtZSByZXN1bHQuIA0KYWRmLnRlc3QoZGlmZihsb2coVkFSdHMkSUJEUllfQWRqX0Nsb3NlKSkpDQphZGYudGVzdChkaWZmKGxvZyhWQVJ0cyROb25TdG9yZV9SZXRhaWxpbmcpKSkNCmFkZi50ZXN0KGRpZmYobG9nKFZBUnRzJFVTX1VuZW1wbG95bWVudCkpKQ0KYWRmLnRlc3QoZGlmZihsb2coVkFSdHMkVVNfQ29uc3VtZXJfQ29uZmlkZW5jZSkpKQ0KdHNwbG90KGRpZmYobG9nKFZBUnRzJElCRFJZX0Fkal9DbG9zZSkpKQ0KYGBgDQoNCg0KVXNpbmcgZGlmZmVyZW5jZXMgYW5kIGxvZywgaXQgaXMgcG9zc2libGUgdG8gZ2V0IHN0YXRpb25hcnkgdGltZSBzZXJpZXMgZGF0YSAocC12YWx1ZSA8IDAuMDUpLCB0aGlzIG9wdGlvbiBpcyB0aGUgb25lIHRoYXQgd2UgYXJlIGdvaW5nIHRvIHVzZSB0byBlc3RpbWF0ZSBhIG1vZGVsLCBpbiBvcmRlciB0byBoYXZlIGFuIGFjY3VyYXRlIHByZWRpY3Rpb24uDQoNCiMjIGkuIEVzdGltYXRpbmcgYSBWQVIgTW9kZWwNCg0KYGBge3J9DQojQ29udmVydGluZyB0byB0aW1lIHNlcmllcyBmb3JtYXQNCm5zcjwtdHMoVkFSdHMkTm9uU3RvcmVfUmV0YWlsaW5nLHN0YXJ0PWMoMjAxNSwxKSxlbmQ9YygyMDIyLDEyKSxmcmVxdWVuY3k9MTIpDQp1bmVtcGxveW1lbnQ8LXRzKFZBUnRzJFVTX1VuZW1wbG95bWVudCxzdGFydD1jKDIwMTUsMSksZW5kPWMoMjAyMiwxMiksZnJlcXVlbmN5PTEyKQ0KY2M8LXRzKFZBUnRzJFVTX0NvbnN1bWVyX0NvbmZpZGVuY2Usc3RhcnQ9YygyMDE1LDEpLGVuZD1jKDIwMjIsMTIpLGZyZXF1ZW5jeT0xMikNCnN0b2NrPC10cyhWQVJ0cyRJQkRSWV9BZGpfQ2xvc2Usc3RhcnQ9YygyMDE1LDEpLGVuZD1jKDIwMjIsMTIpLGZyZXF1ZW5jeT0xMikNCg0KI1RyYW5zZm9ybWluZyBpbnRvIGRpZmYgYW5kIGxvZyB2YWx1ZXMuDQpkc3RvY2s8LWRpZmYobG9nKHN0b2NrKSkNCmRuc3I8LWRpZmYobG9nKG5zcikpDQpkdW5lbXBsb3ltZW50PC1kaWZmKGxvZyh1bmVtcGxveW1lbnQpKQ0KZGNjPC1kaWZmKGxvZyhjYykpDQpWQVJfdHM8LWNiaW5kKGRzdG9jaywgZG5zciwgZHVuZW1wbG95bWVudCxkY2MpDQpjb2xuYW1lcyhWQVJfdHMpPC1jYmluZCgiSUJEUllfU3RvY2siLCAiTm9uU3RvcmVfUmV0YWlsaW5nIiwgIlVTX1VuZW1wbG95bWVudCIsIlVTX0NvbnN1bWVyX0NvbmZpZGVuY2UiKQ0KYGBgDQoNCmBgYHtyfQ0KbGFnX3NlbGVjdGlvbjwtVkFSc2VsZWN0KFZBUl90cyxsYWcubWF4PTUsdHlwZT0iY29uc3QiLCBzZWFzb249MTIpDQpsYWdfc2VsZWN0aW9uJHNlbGVjdGlvbg0KbGFnX3NlbGVjdGlvbiRjcml0ZXJpYQ0KYGBgDQoNCkluIHRoZSBhYm92ZSByZXN1bHRzIHdlIGNhbiBvYnNlcnZlOg0KDQotIFRoZSBBSUMgaXMgbG93ZXN0IGZvciBhIGxhZyBvcmRlciBvZiAxIChBSUMgPSAtMjIuNjE5KSwgc3VnZ2VzdGluZyB0aGF0IGEgVkFSIG1vZGVsIHdpdGggYSBsYWcgb3JkZXIgb2YgNCBtaWdodCBiZSB0aGUgYmVzdCBjaG9pY2UgYmFzZWQgb24gQUlDLg0KDQotIFRoZSBIUSBjcml0ZXJpb24gaXMgbG93ZXN0IGZvciBhIGxhZyBvcmRlciBvZiA0IChIUSA9IC0yMS45MDIpLCBhbGlnbmluZyB3aXRoIHRoZSBBSUMgcmVzdWx0cy4NCg0KLSBUaGUgU0MgaXMgbG93ZXN0IGZvciBhIGxhZyBvcmRlciBvZiA0IChTQyA9IC0yMC44NCksIGFnYWluIHN1Z2dlc3RpbmcgdGhhdCBhIGxhZyBvcmRlciBvZiA0IG1pZ2h0IGJlIHRoZSBvcHRpbWFsIGNob2ljZSBiYXNlZCBvbiBTQy4NCg0KLSBUaGUgRlBFIGNyaXRlcmlvbiBkZWNyZWFzZXMgYXMgbGFnIG9yZGVyIGluY3JlYXNlcy4gSG93ZXZlciwgdGhlIGRpZmZlcmVuY2UgaW4gRlBFIHZhbHVlcyBiZXR3ZWVuIGRpZmZlcmVudCBsYWcgb3JkZXJzIGlzIG5vdCBhcyBwcm9ub3VuY2VkIGFzIHdpdGggdGhlIG90aGVyIGNyaXRlcmlhLg0KDQpJbiBzdW1tYXJ5LCBiYXNlZCBvbiB0aGUgY3JpdGVyaWEgdXNlZCBmb3IgZXZhbHVhdGlvbiAoQUlDLCBIUSwgU0MsIGFuZCBGUEUpLCBMYWcgT3JkZXIgMSBhcHBlYXJzIHRvIGJlIHRoZSBwcmVmZXJyZWQgY2hvaWNlIGFzIGl0IGNvbnNpc3RlbnRseSBtaW5pbWl6ZXMgdGhlc2UgY3JpdGVyaW9uIHZhbHVlcy4gVGhpcyBzdWdnZXN0cyB0aGF0IGEgbW9kZWwgd2l0aCBhIGxhZyBvcmRlciBvZiAxIG1pZ2h0IHByb3ZpZGUgYSBiZXR0ZXIgZml0IHRvIHRoZSBkYXRhIGNvbXBhcmVkIHRvIG90aGVyIGxhZyBvcmRlcnMuDQoNCg0KYGBge3J9DQojIFdlIGVzdGltYXRlIHRoZSBWQVIgbW9kZWwuIFRoZSBwIG9wdGlvbiByZWZlcnMgdG8gdGhlIG51bWJlciBvZiBsYWdzIHVzZWQuDQpWQVJfbW9kZWwxPC1WQVIoVkFSX3RzLHA9MSx0eXBlPSJjb25zdCIsc2Vhc29uPTQpIA0Kc3VtbWFyeShWQVJfbW9kZWwxKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCg0KVkFSX21vZGVsMV9yZXNpZHVhbHM8LWRhdGEuZnJhbWUocmVzaWR1YWxzKFZBUl9tb2RlbDEpKQ0KYWRmLnRlc3QoVkFSX21vZGVsMV9yZXNpZHVhbHMkSUJEUllfU3RvY2spDQojIFRoZSBwLXZhbHVlIGlzIGxvd2VyIHRoYW4gMC4wNSwgc28gd2UgZmFpbCB0byByZWplY3QgSDAsIGFuZCBpdCBjYW4gYmUgY29uY2x1ZGVkIHRoYXQgcmVzaWR1YWxzIGFyZSBzdGF0aW9uYXJ5Lg0KYGBgDQpgYGB7cn0NCkJveC50ZXN0KFZBUl9tb2RlbDFfcmVzaWR1YWxzJElCRFJZX1N0b2NrLGxhZz0xLHR5cGU9IkxqdW5nLUJveCIpDQojIFRoZSBwLXZhbHVlIGlzIGdyZWF0ZXIgdGhhbiAwLjA1LCBzbyB0aGVyZSBpcyBub3QgZW5vdWdoIGV2aWRlbmNlIHRvIGNvbmNsdWRlIHRoYXQgdGhlcmUgaXMgYXV0b2NvcnJlbGF0aW9uIGluIHRoZSByZXNpZHVhbHMuDQpgYGANCg0KDQojIyBpaS4gTW9kZWwgU2VsZWN0aW9uDQoNCioqQnJpZWZseSBpbnRlcnByZXQgdGhlIHJlZ3Jlc3Npb24gcmVzdWx0cy4gVGhhdCBpcywgaXMgdGhlcmUgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBleHBsYW5hdG9yeSB2YXJpYWJsZXMgYW5kIHRoZSBtYWluIGRlcGVuZGVudCB2YXJpYWJsZT8qKg0KDQpUaGUgcHJvdmlkZWQgVkFSIGVzdGltYXRpb24gcmVzdWx0cyBkZXNjcmliZSB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHNldmVyYWwgZWNvbm9taWMgdmFyaWFibGVzOiAiSUJEUllfU3RvY2ssIiAiTm9uU3RvcmVfUmV0YWlsaW5nLCIgIlVTX1VuZW1wbG95bWVudCwiIGFuZCAiVVNfQ29uc3VtZXJfQ29uZmlkZW5jZS4iIExldCdzIGludGVycHJldCB0aGVzZSByZXN1bHRzIGFuZCBwcm92aWRlIHNvbWUgaW5zaWdodHM6DQoNCjEuICoqTW9kZWwgU3VtbWFyeSoqOg0KICAgLSBUaGUgbW9kZWwgaW5jbHVkZXMgZm91ciBlbmRvZ2Vub3VzIHZhcmlhYmxlczogIklCRFJZX1N0b2NrLCIgIk5vblN0b3JlX1JldGFpbGluZywiICJVU19VbmVtcGxveW1lbnQsIiBhbmQgIlVTX0NvbnN1bWVyX0NvbmZpZGVuY2UuIg0KICAgLSBBIGNvbnN0YW50IHRlcm0gaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsLg0KICAgLSBUaGUgc2FtcGxlIHNpemUgdXNlZCBmb3IgZXN0aW1hdGlvbiBjb25zaXN0cyBvZiA5NCBvYnNlcnZhdGlvbnMuDQogICAtIFRoZSBsb2cgbGlrZWxpaG9vZCBvZiB0aGUgbW9kZWwgaXMgNTgzLjcyLg0KDQoNCjIuICoqQ2hhcmFjdGVyaXN0aWMgUG9seW5vbWlhbCBSb290cyoqOg0KICAgLSBUaGUgY2hhcmFjdGVyaXN0aWMgcG9seW5vbWlhbCByb290cyBhcmUgZ2l2ZW4gYXMgMC4zNjQ4LCAwLjM2NDgsIDAuMDQ1NDcsIGFuZCAwLjAzMDExLiBUaGVzZSByb290cyBhcmUgZXNzZW50aWFsIGZvciBkZXRlcm1pbmluZyB0aGUgc3RhYmlsaXR5IG9mIHRoZSBWQVIgbW9kZWwuIEhhdmluZyByb290cyB3aXRoIG1hZ25pdHVkZXMgbGVzcyB0aGFuIG9uZSBpbmRpY2F0ZXMgc3RhYmlsaXR5Lg0KDQoNCjMuICoqRXF1YXRpb24tU3BlY2lmaWMgUmVzdWx0cyoqOg0KICAgLSBUaGUgb3V0cHV0IHByb3ZpZGVzIHJlc3VsdHMgZm9yIGVhY2ggZW5kb2dlbm91cyB2YXJpYWJsZSBlcXVhdGlvbiBpbiB0aGUgVkFSIG1vZGVsLiBXZSBhcmUgZ29pbmcgdG8gaW50ZXJwcmV0IHRoZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHZhcmlhYmxlcyBmb3IgZWFjaCBlcXVhdGlvbi4NCg0KDQogICAqKklCRFJZX1N0b2NrIEVxdWF0aW9uKio6IChNYWluIGRlcGVuZGVudCBWYXJpYWJsZSkNCiAgIC0gIklCRFJZX1N0b2NrIiBoYXMgYSBuZWdhdGl2ZSBjb2VmZmljaWVudCBmb3IgaXRzIG93biBsYWdnZWQgdmFsdWUgKCJJQkRSWV9TdG9jay5sMSIpLiBUaGlzIHN1Z2dlc3RzIHRoYXQgcGFzdCB2YWx1ZXMgb2YgdGhlIHN0b2NrIHByaWNlIG5lZ2F0aXZlbHkgYWZmZWN0IHRoZSBjdXJyZW50IHN0b2NrIHByaWNlLg0KICAgLSAiVVNfQ29uc3VtZXJfQ29uZmlkZW5jZS5sMSIgaGFzIGEgcG9zaXRpdmUgY29lZmZpY2llbnQsIGluZGljYXRpbmcgdGhhdCBhbiBpbmNyZWFzZSBpbiBjb25zdW1lciBjb25maWRlbmNlIGluIHRoZSBwcmV2aW91cyBwZXJpb2QgaXMgYXNzb2NpYXRlZCB3aXRoIGEgaGlnaGVyIHN0b2NrIHByaWNlIGluIHRoZSBjdXJyZW50IHBlcmlvZC4NCg0KDQogICAqKk5vblN0b3JlX1JldGFpbGluZyBFcXVhdGlvbioqOg0KICAgLSAiTm9uU3RvcmVfUmV0YWlsaW5nIiBpcyBuZWdhdGl2ZWx5IGluZmx1ZW5jZWQgYnkgaXRzIG93biBsYWdnZWQgdmFsdWUuDQogICAtICJVU19VbmVtcGxveW1lbnQubDEiIGhhcyBhIHBvc2l0aXZlIGVmZmVjdCBvbiAiTm9uU3RvcmVfUmV0YWlsaW5nLCIgc3VnZ2VzdGluZyB0aGF0IGFuIGluY3JlYXNlIGluIHVuZW1wbG95bWVudCBpbiB0aGUgcHJldmlvdXMgcGVyaW9kIGlzIGFzc29jaWF0ZWQgd2l0aCBoaWdoZXIgbm9uLXN0b3JlIHJldGFpbGluZyBpbiB0aGUgY3VycmVudCBwZXJpb2QuDQogICAtIFRoZSBjb25zdGFudCB0ZXJtIGhhcyBhIHNpZ25pZmljYW50IHBvc2l0aXZlIGltcGFjdCBvbiAiTm9uU3RvcmVfUmV0YWlsaW5nLiINCg0KDQogICAqKlVTX1VuZW1wbG95bWVudCBFcXVhdGlvbioqOg0KICAgLSAiSUJEUllfU3RvY2subDEiIGhhcyBhIG5lZ2F0aXZlIGNvZWZmaWNpZW50LCBpbmRpY2F0aW5nIHRoYXQgYW4gaW5jcmVhc2UgaW4gdGhlIHByZXZpb3VzIHBlcmlvZCdzIElCRFJZIHN0b2NrIHByaWNlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGRlY3JlYXNlIGluIHVuZW1wbG95bWVudCBpbiB0aGUgY3VycmVudCBwZXJpb2QuDQogICAtIFRoZSBvdGhlciB2YXJpYWJsZXMsIGluY2x1ZGluZyAiTm9uU3RvcmVfUmV0YWlsaW5nLmwxIiBhbmQgIlVTX0NvbnN1bWVyX0NvbmZpZGVuY2UubDEsIiBkbyBub3QgaGF2ZSBzaWduaWZpY2FudCBlZmZlY3RzIG9uICJVU19VbmVtcGxveW1lbnQuIg0KDQoNCiAgICoqVVNfQ29uc3VtZXJfQ29uZmlkZW5jZSBFcXVhdGlvbioqOg0KICAgLSAiSUJEUllfU3RvY2subDEiIGhhcyBhIHNtYWxsIHBvc2l0aXZlIGVmZmVjdCBvbiAiVVNfQ29uc3VtZXJfQ29uZmlkZW5jZSwiIHRob3VnaCBpdCBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4NCiAgIC0gTm9uZSBvZiB0aGUgb3RoZXIgdmFyaWFibGVzLCBpbmNsdWRpbmcgbGFnZ2VkIHZhbHVlcyBhbmQgdGhlIGNvbnN0YW50IHRlcm0sIGhhdmUgc2lnbmlmaWNhbnQgZWZmZWN0cyBvbiAiVVNfQ29uc3VtZXJfQ29uZmlkZW5jZS4iDQoNCjQuICoqUmVzaWR1YWxzIGFuZCBNb2RlbCBGaXQqKjoNCiAgIC0gRWFjaCBlcXVhdGlvbidzIHJlc2lkdWFscyBoYXZlIHJlc2lkdWFsIHN0YW5kYXJkIGVycm9ycywgbXVsdGlwbGUgUi1zcXVhcmVkLCBhZGp1c3RlZCBSLXNxdWFyZWQsIGFuZCBGLXN0YXRpc3RpY3MuDQogICAtIFRoZXNlIHN0YXRpc3RpY3MgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZ29vZG5lc3Mgb2YgZml0IGZvciBlYWNoIGVxdWF0aW9uLg0KDQoNCjUuICoqQ292YXJpYW5jZSBNYXRyaXggYW5kIENvcnJlbGF0aW9uIE1hdHJpeCBvZiBSZXNpZHVhbHMqKjoNCiAgIC0gVGhlc2UgbWF0cmljZXMgc2hvdyB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZSByZXNpZHVhbHMgb2YgZGlmZmVyZW50IGVxdWF0aW9ucy4NCiAgIC0gRm9yIGV4YW1wbGUsIHRoZSBjb3JyZWxhdGlvbiBtYXRyaXggaW5kaWNhdGVzIGhvdyBjb3JyZWxhdGVkIHRoZSByZXNpZHVhbHMgb2YgdGhlIGRpZmZlcmVudCB2YXJpYWJsZXMgYXJlLiBOZWdhdGl2ZSB2YWx1ZXMgc3VnZ2VzdCBpbnZlcnNlIGNvcnJlbGF0aW9ucywgd2hpbGUgcG9zaXRpdmUgdmFsdWVzIHN1Z2dlc3QgZGlyZWN0IGNvcnJlbGF0aW9ucy4NCiAgIA0KDQoqKkRvIHRoZSBzZWxlY3RlZCBleHBsYW5hdG9yeSB2YXJpYWJsZXMgaGF2ZSBhbiBpbmZsdWVuY2Ugb24gdGhlIHN0b2NrIHByaWNlPyoqDQpZZXMgdGhleSBkby4gTW9zdGx5IFVuZW1wbG95bW5ldCBhbmQgbGFnZ2VkIENvbnN1bWVyIENvbmZpZGVuY2UuDQoNCioqSXMgdGhlcmUgYW4gaW5zdGFudGFuZW91cyBjYXVzYWxpdHkgYmV0d2VlbiB0aGUgc3RvY2tzIHByaWNlIGFuZCB0aGUgc2VsZWN0ZWQgZXhwbGFuYXRvcnkgdmFyaWFibGVzPyBFc3RpbWF0ZSBhIEdyYW5nZXIgQ2F1c2FsaXR5IFRlc3QgdG8gZWl0aGVyIHJlamVjdCBvciBmYWlsIHRvIHJlamVjdCB0aGUgaHlwb3RoZXNpcyBvZiBpbnN0YW50YW5lb3VzIGNhdXNhbGl0eS4qKg0KDQpgYGB7cn0NCmdyYW5nZXJfSUJEUlk8LWNhdXNhbGl0eShWQVJfbW9kZWwxLGNhdXNlPSJJQkRSWV9TdG9jayIpDQpncmFuZ2VyX0lCRFJZDQpgYGANCg0KDQpIYXZpbmcgYSBwLXZhbHVlIG9mIDAuMDQsIHdlIGNhbiBzYXkgdGhhdCBJQkRSWV9TdG9jayBkbyBjYXVzZSBhIHNpZ25pZmljYW50IGVmZmVjdCBvbiBvbmUgb3IgbW9yZSBvZiB0aGUgc2VsZWN0ZWQgdmFyaWFibGVzLiBSZWplY3RpbmcgSDAuDQoNCg0KIyBkLiBGb3JlY2FzdGluZw0KDQoNCioqQmFzZWQgb24gdGhlIHNlbGVjdGVkIFZBUl9Nb2RlbCwgZm9yZWNhc3QgdGhlIHN0b2NrIHByaWNlIGZvciB0aGUgbmV4dCA1IG1vbnRocy4gRGlzcGxheSB0aGUgZm9yZWNhc3QgaW4gYSB0aW1lIHNlcmllcyBwbG90LioqDQoNCg0KYGBge3J9DQpmb3JlY2FzdCA8LSBwcmVkaWN0KFZBUl9tb2RlbDEsIG4uYWhlYWQgPSA1LCBjaSA9IDAuOTUpDQojIFJldmVydGlyIGxhcyB0cmFuc2Zvcm1hY2lvbmVzIGxvZyB5IGRpZmYNCmZvcmVjYXN0JGZjc3QkSUJEUllfU3RvY2sgPC0gZXhwKGZvcmVjYXN0JGZjc3QkSUJEUllfU3RvY2spICAjIFJldmVydGluZyBsb2cNCg0KI1JldmVydGluZyBkaWZmZXJlbmNlcyBmb3IgZm9yZWNhc3RzDQpmb3JlY2FzdCRmY3N0JElCRFJZX1N0b2NrWzFdPC1mb3JlY2FzdCRmY3N0JElCRFJZX1N0b2NrWzFdICsgdGFpbChWQVJ0cyRJQkRSWV9BZGpfQ2xvc2UsIDEpDQpmb3JlY2FzdCRmY3N0JElCRFJZX1N0b2NrWzJdPC1mb3JlY2FzdCRmY3N0JElCRFJZX1N0b2NrWzJdICsgZm9yZWNhc3QkZmNzdCRJQkRSWV9TdG9ja1sxXQ0KZm9yZWNhc3QkZmNzdCRJQkRSWV9TdG9ja1szXTwtZm9yZWNhc3QkZmNzdCRJQkRSWV9TdG9ja1szXSArIGZvcmVjYXN0JGZjc3QkSUJEUllfU3RvY2tbMl0NCmZvcmVjYXN0JGZjc3QkSUJEUllfU3RvY2tbNF08LWZvcmVjYXN0JGZjc3QkSUJEUllfU3RvY2tbNF0gKyBmb3JlY2FzdCRmY3N0JElCRFJZX1N0b2NrWzNdDQpmb3JlY2FzdCRmY3N0JElCRFJZX1N0b2NrWzVdPC1mb3JlY2FzdCRmY3N0JElCRFJZX1N0b2NrWzVdICsgZm9yZWNhc3QkZmNzdCRJQkRSWV9TdG9ja1s0XQ0KZmFuY2hhcnQoZm9yZWNhc3QsbmFtZXM9IklCRFJZX1N0b2NrIixtYWluPSJJQkRSWSBTdG9jayBQcmljZSIseGxhYj0iVGltZSBQZXJpb2QiLHlsYWI9IlN0b2NrIFByaWNlIikNCnRzcGxvdChmb3JlY2FzdCkNCmBgYA0KDQpXZSB0cmFuc2Zvcm0gdGhlIHByZWRpY3RlZCB2YXJpYWJsZSBmb3IgIklCRFJZIFNUT0NLIiBpbnRvIGl0cyBvcmlnaW5hbCBmb3JtYXQgdmFsdWUsIGJ1dCB0aGlzIGp1c3QgYXBwbGllZCB0byB0aGUgZGlyZWN0IGFjY3VyYXRlIGZvcmVjYXN0LiBJdCB3YXMgbm90IHBvc3NpYmxlIHRvIHRyYW5zZm9ybSBpdHMgbG93ZXIgYW5kIHVwcGVyIHZhbHVlcy4NCg0KYGBge3J9DQojRm9yZWNhc3QNCmZvcmVjYXN0JGZjc3QkSUJEUllfU3RvY2sNCmBgYA0KV2hlbiBnZW5lcmF0aW5nIGEgZm9yZWNhc3Qgd2l0aCB0aGlzIG1vZGVsLCB3ZSBjYW4gb2J0YWluIGFuIGVzdGltYXRlIG9mIHdoYXQgdGhlIHN0b2NrIHByaWNlIGZvciB0aGUgbmV4dCA1IHBlcmlvZHMgY291bGQgYmUuIFRha2luZyBpbnRvIGFjY291bnQgYSA5NSUgY29uZmlkZW5jZSBsZXZlbCwgdGhlc2UgdmFsdWVzIG1pZ2h0IGJlIGNsb3NlIGFzIGZvbGxvd3M6DQoNCg0KKiBQZXJpb2QgMTogUHJpY2UgY2xvc2UgdG8gJDQ1LjczDQoNCg0KKiBQZXJpb2QgMjogUHJpY2UgY2xvc2UgdG8gJDQ2LjczDQoNCg0KKiBQZXJpb2QgMzogUHJpY2UgY2xvc2UgdG8gJDQ3Ljc0DQoNCg0KKiBQZXJpb2QgNDogUHJpY2UgY2xvc2UgdG8gJDQ4Ljc3DQoNCg0KKiBQZXJpb2QgNTogUHJpY2UgY2xvc2UgdG8gJDQ5Ljc2DQoNCioqUmVmZXJlbmNlczoqKg0KDQpJYmVyZHJvbGEgU0EgKDIwMjMpLiBJYmVyZHJvbGEuIGh0dHBzOi8vd3d3LmliZXJkcm9sYS5jb20vY29ub2Nlbm9zL251ZXN0cmEtZW1wcmVzYSANCg==