1. Úvod

V tejto analýze budeme skúmať multikolinearitu v modeli ekonomických ukazovateľov.

Budeme pracovať s regresným modelom, kde ako závislú premennú použijeme hodnotu akciového indexu a ako nezávislé premenné ostatné ekonomické ukazovatele.

2. Východiskový model a údaje

library(zoo)
library(tseries)
library(lmtest)
library(sandwich)
library(car)
library(dplyr)
library(ggplot2)
rm(list = ls())

udaje <- read.csv("economic_indicators_dataset_2010_2023.csv", 
                  dec = ".", 
                  sep = ",", 
                  header = TRUE)

str(udaje)
'data.frame':   500 obs. of  7 variables:
 $ Date                 : chr  "2010-01-31" "2010-01-31" "2010-01-31" "2010-02-28" ...
 $ Country              : chr  "Brazil" "France" "USA" "Brazil" ...
 $ Inflation.Rate....   : num  1.23 6.76 7.46 5.43 0.69 6.1 8.61 3.13 0.05 7.2 ...
 $ GDP.Growth.Rate....  : num  0.69 2.59 4.84 0.31 -0.52 9.9 4.43 4.82 -4.78 -1.48 ...
 $ Unemployment.Rate....: num  10.48 4.27 2.64 8.26 11.92 ...
 $ Interest.Rate....    : num  7.71 7.39 6.39 6.09 -0.51 8.38 6.11 -0.66 3.85 8.22 ...
 $ Stock.Index.Value    : num  21749 10040 13129 23305 16413 ...
udaje$Date <- as.Date(udaje$Date, format = "%Y-%m-%d")

udaje_2020 <- udaje[format(udaje$Date, "%Y") == "2020", ]

sapply(udaje_2020, function(x) sum(is.na(x)))
                 Date               Country    Inflation.Rate....   GDP.Growth.Rate.... Unemployment.Rate....     Interest.Rate....     Stock.Index.Value 
                    0                     0                     0                     0                     0                     0                     0 
if(any(is.na(udaje_2020))) {
  column_medians <- sapply(udaje_2020[, c("Inflation.Rate....", "GDP.Growth.Rate....", 
                                          "Unemployment.Rate....", "Interest.Rate....", 
                                          "Stock.Index.Value")], 
                          median, na.rm = TRUE)
  
  for(col in names(column_medians)) {
    na_index <- is.na(udaje_2020[[col]])
    if(any(na_index)) {
      udaje_2020[[col]][na_index] <- column_medians[col]
    }
  }
}

colnames(udaje_2020) <- c("Date", "Country", "Inflation_Rate", "GDP_Growth_Rate", 
                         "Unemployment_Rate", "Interest_Rate", "Stock_Index_Value")

udaje <- udaje_2020
rm(udaje_2020)

summary(udaje[, 3:7])
 Inflation_Rate  GDP_Growth_Rate  Unemployment_Rate Interest_Rate    Stock_Index_Value
 Min.   :0.180   Min.   :-4.220   Min.   : 2.070    Min.   :-0.970   Min.   : 1626    
 1st Qu.:1.885   1st Qu.:-0.220   1st Qu.: 4.075    1st Qu.: 3.217   1st Qu.:11628    
 Median :5.310   Median : 3.040   Median : 6.660    Median : 5.205   Median :22372    
 Mean   :5.051   Mean   : 2.640   Mean   : 6.608    Mean   : 5.088   Mean   :21297    
 3rd Qu.:7.838   3rd Qu.: 5.987   3rd Qu.: 8.473    3rd Qu.: 7.968   3rd Qu.:30324    
 Max.   :9.900   Max.   : 8.890   Max.   :11.910    Max.   : 9.900   Max.   :39613    

Všetky premenné majú plnú informačnosť (žiadne chýbajúce hodnoty) a vykazujú primeranú variabilitu

3. Odhad základného regresného modelu

model <- lm(Stock_Index_Value ~ Inflation_Rate + GDP_Growth_Rate + 
             Unemployment_Rate + Interest_Rate,
           data = udaje)

summary(model)

Call:
lm(formula = Stock_Index_Value ~ Inflation_Rate + GDP_Growth_Rate + 
    Unemployment_Rate + Interest_Rate, data = udaje)

Residuals:
     Min       1Q   Median       3Q      Max 
-21735.1  -9038.9    605.6   9265.7  19096.1 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)        33518.7     7152.5   4.686 3.06e-05 ***
Inflation_Rate      -429.8      584.8  -0.735    0.467    
GDP_Growth_Rate     -176.1      444.8  -0.396    0.694    
Unemployment_Rate   -868.6      632.7  -1.373    0.177    
Interest_Rate       -756.0      583.9  -1.295    0.203    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 11600 on 41 degrees of freedom
Multiple R-squared:  0.07305,   Adjusted R-squared:  -0.01738 
F-statistic: 0.8078 on 4 and 41 DF,  p-value: 0.5274

Základný regresný model vykazuje nízku explanačnú silu (R² = 0,073) a nie je štatisticky významný ako celok (p-hodnota F-testu = 0,527). Žiadny z regresných koeficientov nie je štatisticky významný na bežných hladinách významnosti, čo naznačuje problém so špecifikáciou modelu alebo prítomnosťou multikolinearity.

4. Korelačná matica

Korelačná matica nám pomôže identifikovať párové lineárne vzťahy medzi premennými.

Intuitívne pravidlo hovorí, že ak absolútna hodnota korelácie medzi dvoma premennými presahuje 0.8 (prísnejšie 0.9), môže to signalizovať problém multikolinearity.

xvars <- udaje[, c("Inflation_Rate", "GDP_Growth_Rate", 
                   "Unemployment_Rate", "Interest_Rate")]

korelacna_matica <- round(cor(xvars), 3)
korelacna_matica
                  Inflation_Rate GDP_Growth_Rate Unemployment_Rate Interest_Rate
Inflation_Rate             1.000          -0.037            -0.122        -0.042
GDP_Growth_Rate           -0.037           1.000             0.011         0.080
Unemployment_Rate         -0.122           0.011             1.000        -0.299
Interest_Rate             -0.042           0.080            -0.299         1.000

Korelačná matica neindikuje silné lineárne vzťahy medzi vysvetľujúcimi premennými, keďže všetky korelačné koeficienty sú blízke nule.

Jedinou mierne výraznejšou koreláciou je negatívny vzťah medzi mierou nezamestnanosti a úrokovou sadzbou (-0,299), čo ešte nepredstavuje kritickú hodnotu pre multikolinearitu.

5. Grafická analýza vzťahov medzi premennými

pairs(xvars,
      main = "Scatterplotová matica – ekonomické premenné",
      pch = 19,
      col = "blue",
      cex = 0.6)

Z diagramu vidíme, že medzi väčšinou párov premenných neexistuje silný, jasný lineárny vzťah, pretože body sú roztrúsené náhodne v každom grafe.

6. VIF (Variance Inflation Factor)

VIF je priamym indikátorom multikolinearity pre každú vysvetľujúcu premennú:

  • VIF < 5: nízka multikolinearita

  • 5 ≤ VIF < 10: mierna multikolinearita

  • VIF ≥ 10: vysoká multikolinearita

vif_hodnoty <- vif(model)
vif_hodnoty
   Inflation_Rate   GDP_Growth_Rate Unemployment_Rate     Interest_Rate 
         1.022993          1.008591          1.121780          1.113964 

Všetky hodnoty VIF sú výrazne pod kritickou hranicou 5, čo potvrdzuje, že medzi vysvetľujúcimi premennými neexistuje problém multikolinearity.

Najvyššiu hodnotu VIF (1,12) má premenná Unemployment_Rate, čo však stále predstavuje minimálne zvýšenie rozptylu odhadov v dôsledku korelácie s inými premennými.

7. Condition Number (číslo podmienenosti)

Condition number posudzuje celkovú mieru multikolinearity v modeli:

  • < 10: nízka multikolinearita

  • 10–30: mierna multikolinearita

  • 30–100: vysoká multikolinearita

X <- model.matrix(model)[, -1]
XtX <- t(X) %*% X
vlastne_hodnoty <- eigen(XtX)$values

condition_number <- sqrt(max(vlastne_hodnoty) / min(vlastne_hodnoty))
condition_number
[1] 3.520011

Condition number 3,52 výrazne pod hranicou 10 potvrdzuje absenciu multikolinearity v modeli.

Takáto nízka hodnota indikuje, že matica dizajnu je dobre podmienená a odhady regresných koeficientov sú numericky stabilné.

8. Riešenia multikolinearity

8.1 Vynechanie premennej

Skúsme postupne vynechať premenné s najvyšším VIF.

model_no_inflation <- lm(Stock_Index_Value ~ GDP_Growth_Rate + 
                          Unemployment_Rate + Interest_Rate,
                        data = udaje)
summary(model_no_inflation)

Call:
lm(formula = Stock_Index_Value ~ GDP_Growth_Rate + Unemployment_Rate + 
    Interest_Rate, data = udaje)

Residuals:
   Min     1Q Median     3Q    Max 
-19631  -9196   -198   9168  20412 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)        30717.0     6018.6   5.104  7.6e-06 ***
GDP_Growth_Rate     -166.7      442.2  -0.377    0.708    
Unemployment_Rate   -803.5      623.0  -1.290    0.204    
Interest_Rate       -721.4      578.8  -1.246    0.220    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 11530 on 42 degrees of freedom
Multiple R-squared:  0.06084,   Adjusted R-squared:  -0.006241 
F-statistic: 0.907 on 3 and 42 DF,  p-value: 0.4458
model_no_interest <- lm(Stock_Index_Value ~ Inflation_Rate + 
                         GDP_Growth_Rate + Unemployment_Rate,
                       data = udaje)
summary(model_no_interest)

Call:
lm(formula = Stock_Index_Value ~ Inflation_Rate + GDP_Growth_Rate + 
    Unemployment_Rate, data = udaje)

Residuals:
     Min       1Q   Median       3Q      Max 
-19751.7  -8326.5    -65.8   8458.3  18855.9 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)        27823.4     5685.2   4.894  1.5e-05 ***
Inflation_Rate      -368.7      587.6  -0.628    0.534    
GDP_Growth_Rate     -224.8      446.8  -0.503    0.618    
Unemployment_Rate   -616.0      606.7  -1.015    0.316    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 11690 on 42 degrees of freedom
Multiple R-squared:  0.03515,   Adjusted R-squared:  -0.03377 
F-statistic:  0.51 on 3 and 42 DF,  p-value: 0.6775
cat("Upravený R² pôvodného modelu:", round(summary(model)$adj.r.squared, 4), "\n")
Upravený R² pôvodného modelu: -0.0174 
cat("Upravený R² modelu bez inflácie:", round(summary(model_no_inflation)$adj.r.squared, 4), "\n")
Upravený R² modelu bez inflácie: -0.0062 
cat("Upravený R² modelu bez úrokovej sadzby:", round(summary(model_no_interest)$adj.r.squared, 4), "\n")
Upravený R² modelu bez úrokovej sadzby: -0.0338 

Vynechaním premennej Inflation_Rate alebo Interest_Rate sa upravený koeficient determinácie ešte znížil, čo potvrdzuje neefektívnosť tohto prístupu.

Všetky alternatívne modely ostávajú štatisticky nevýznamné (p-hodnoty F-testu > 0,445) s negatívnymi upravenými R², čo naznačuje nevhodnosť špecifikácie modelu.

8.2 Škálovanie premenných

Centrovanie a škálovanie premenných môže pomôcť redukovať multikolinearitu.

udaje$Inflation_scaled <- scale(udaje$Inflation_Rate, center = TRUE, scale = TRUE)
udaje$GDP_scaled <- scale(udaje$GDP_Growth_Rate, center = TRUE, scale = TRUE)
udaje$Unemployment_scaled <- scale(udaje$Unemployment_Rate, center = TRUE, scale = TRUE)
udaje$Interest_scaled <- scale(udaje$Interest_Rate, center = TRUE, scale = TRUE)

model_scaled <- lm(Stock_Index_Value ~ Inflation_scaled + GDP_scaled + 
                    Unemployment_scaled + Interest_scaled,
                  data = udaje)

summary(model_scaled)

Call:
lm(formula = Stock_Index_Value ~ Inflation_scaled + GDP_scaled + 
    Unemployment_scaled + Interest_scaled, data = udaje)

Residuals:
     Min       1Q   Median       3Q      Max 
-21735.1  -9038.9    605.6   9265.7  19096.1 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)          21297.3     1709.9  12.455 1.61e-15 ***
Inflation_scaled     -1285.0     1748.6  -0.735    0.467    
GDP_scaled            -687.1     1736.2  -0.396    0.694    
Unemployment_scaled  -2513.8     1831.0  -1.373    0.177    
Interest_scaled      -2362.5     1824.6  -1.295    0.203    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 11600 on 41 degrees of freedom
Multiple R-squared:  0.07305,   Adjusted R-squared:  -0.01738 
F-statistic: 0.8078 on 4 and 41 DF,  p-value: 0.5274
vif_scaled <- vif(model_scaled)
vif_scaled
   Inflation_scaled          GDP_scaled Unemployment_scaled     Interest_scaled 
           1.022993            1.008591            1.121780            1.113964 

Škálovaný model poskytuje úplne rovnaké štatistické výsledky ako pôvodný model (identické R², p-hodnoty a reziduálna smerodajná odchýlka).

Odhady koeficientov pre škálované premenné vyjadrujú vplyv zmeny o jednu smerodajnú odchýlku, pričom žiadna premenná nie je štatisticky významná. VIF hodnoty zostávajú nízke, čo opäť vylučuje multikolinearitu.

8.3 Condition Number po škálovaní

X_scaled <- model.matrix(model_scaled)[, -1]
XtX_scaled <- t(X_scaled) %*% X_scaled
vlastne_hodnoty_scaled <- eigen(XtX_scaled)$values

condition_number_scaled <- sqrt(max(vlastne_hodnoty_scaled) / min(vlastne_hodnoty_scaled))
condition_number_scaled
[1] 1.418303

Škálovanie premenných znížilo condition number z 3,52 na 1,42, čo predstavuje optimálnu numerickú kondicionovanosť matice dizajnu.

Hodnota blízka 1 potvrdzuje, že škálované premenné sú takmer ortogonálne, čo eliminuje akékoľvek problémy s numerickou presnosťou výpočtov.

8.4 Transformácia premenných

Namiesto škálovania môžeme premenné transformovať tak, aby sme zachovali ich interpretovateľnosť.

apply(udaje[, 3:6], 2, var)
   Inflation_Rate   GDP_Growth_Rate Unemployment_Rate     Interest_Rate 
         8.940401         15.233400          8.375555          9.766056 
model_interaction <- lm(Stock_Index_Value ~ Inflation_Rate * GDP_Growth_Rate + Unemployment_Rate + Interest_Rate,
                        data = udaje)
summary(model_interaction)

Call:
lm(formula = Stock_Index_Value ~ Inflation_Rate * GDP_Growth_Rate + 
    Unemployment_Rate + Interest_Rate, data = udaje)

Residuals:
   Min     1Q Median     3Q    Max 
-21432  -9047   1040   9365  19234 

Coefficients:
                               Estimate Std. Error t value Pr(>|t|)    
(Intercept)                    34557.37    7784.06   4.440 6.92e-05 ***
Inflation_Rate                  -541.48     667.60  -0.811    0.422    
GDP_Growth_Rate                 -472.46     938.10  -0.504    0.617    
Unemployment_Rate               -894.89     643.67  -1.390    0.172    
Interest_Rate                   -800.99     603.27  -1.328    0.192    
Inflation_Rate:GDP_Growth_Rate    55.04     152.87   0.360    0.721    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 11720 on 40 degrees of freedom
Multiple R-squared:  0.07605,   Adjusted R-squared:  -0.03945 
F-statistic: 0.6584 on 5 and 40 DF,  p-value: 0.6569

Model s interakčným členom medzi infláciou a rastom HDP má ešte nižší upravený R² (-0,039) a zostáva štatisticky nevýznamný (p = 0,657).

Interakčný člen nie je štatisticky významný (p = 0,721), čo naznačuje, že tento typ transformácie nezlepšuje explanačnú silu modelu.

9. Porovnanie modelov

models <- list("Pôvodný model" = model,
               "Bez inflácie" = model_no_inflation,
               "Bez úrokovej sadzby" = model_no_interest,
               "Škálovaný model" = model_scaled)

comparison <- data.frame(
  Model = names(models),
  R2 = sapply(models, function(m) round(summary(m)$r.squared, 4)),
  Adj_R2 = sapply(models, function(m) round(summary(m)$adj.r.squared, 4)),
  AIC = round(sapply(models, AIC), 2),
  BIC = round(sapply(models, BIC), 2)
)

print(comparison)

Všetky štyri modely majú negatívne upravené R², čo znamená, že sú horšie ako model s iba konštantou.

Model bez premennej Inflation_Rate má najvyšší upravený R² (-0,0062) a najnižšie informačné kritériá AIC a BIC, čo ho činí relatívne najlepšou, avšak stále nevhodnou špecifikáciou.

10. Zhrnutie a závery

Hlavné zistenia z analýzy:

  • Multikolinearita nebola identifikovaná - všetky diagnostické nástroje (korelačná matica, VIF < 1,13, condition number = 3,52) konzistentne potvrdzujú absenciu multikolinearity medzi vysvetľujúcimi premennými.

  • Základný problém modelu nie je v multikolinearite - nízka explanačná sila modelov (negatívne upravené R²) a štatistická nevýznamnosť jednotlivých premenných naznačujú, že problém spočíva v nevhodnej špecifikácii modelu alebo vo výbere premenných.

  • Škálovanie premenných zlepšilo numerickú stabilitu (condition number klesol na 1,42), ale nezmenilo štatistické vlastnosti modelu.

Nízka explanačná sila a štatistická nevýznamnosť modelu s negatívnym upraveným R² naznačujú, že zvolené ekonomické premenné (inflácia, rast HDP, nezamestnanosť, úroková sadzba) nedokážu adekvátne vysvetliť variabilitu akciových indexov.

LS0tDQp0aXRsZTogIsOabG9oYV8xMCINCmF1dGhvcjogIll1bGlpYSBMeXN5dHNpYSINCmRhdGU6ICJOb3ZlbWJlciAyMDI1Ig0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIHRoZW1lOiB1bml0ZWQNCiAgICBoaWdobGlnaHQ6IHRhbmdvDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICBkZl9wcmludDogcGFnZWQNCmVkaXRvcl9vcHRpb25zOg0KICBtYXJrZG93bjoNCiAgICB3cmFwOiA3Mg0KLS0tDQoNCiMjIDEuIMOadm9kDQoNClYgdGVqdG8gYW5hbMO9emUgYnVkZW1lIHNrw7ptYcWlIG11bHRpa29saW5lYXJpdHUgdiBtb2RlbGkgZWtvbm9taWNrw71jaCB1a2F6b3ZhdGXEvm92Lg0KDQpCdWRlbWUgcHJhY292YcWlIHMgcmVncmVzbsO9bSBtb2RlbG9tLCBrZGUgYWtvIHrDoXZpc2zDuiBwcmVtZW5uw7ogcG91xb5pamVtZSAqKmhvZG5vdHUgYWtjaW92w6lobyBpbmRleHUqKiBhIGFrbyBuZXrDoXZpc2zDqSBwcmVtZW5uw6kgb3N0YXRuw6kgZWtvbm9taWNrw6kgdWthem92YXRlbGUuDQoNCiMjIDIuIFbDvWNob2Rpc2tvdsO9IG1vZGVsIGEgw7pkYWplDQoNCmBgYHtyfQ0KbGlicmFyeSh6b28pDQpsaWJyYXJ5KHRzZXJpZXMpDQpsaWJyYXJ5KGxtdGVzdCkNCmxpYnJhcnkoc2FuZHdpY2gpDQpsaWJyYXJ5KGNhcikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpybShsaXN0ID0gbHMoKSkNCg0KdWRhamUgPC0gcmVhZC5jc3YoImVjb25vbWljX2luZGljYXRvcnNfZGF0YXNldF8yMDEwXzIwMjMuY3N2IiwgDQogICAgICAgICAgICAgICAgICBkZWMgPSAiLiIsIA0KICAgICAgICAgICAgICAgICAgc2VwID0gIiwiLCANCiAgICAgICAgICAgICAgICAgIGhlYWRlciA9IFRSVUUpDQoNCnN0cih1ZGFqZSkNCg0KdWRhamUkRGF0ZSA8LSBhcy5EYXRlKHVkYWplJERhdGUsIGZvcm1hdCA9ICIlWS0lbS0lZCIpDQoNCnVkYWplXzIwMjAgPC0gdWRhamVbZm9ybWF0KHVkYWplJERhdGUsICIlWSIpID09ICIyMDIwIiwgXQ0KDQpzYXBwbHkodWRhamVfMjAyMCwgZnVuY3Rpb24oeCkgc3VtKGlzLm5hKHgpKSkNCg0KaWYoYW55KGlzLm5hKHVkYWplXzIwMjApKSkgew0KICBjb2x1bW5fbWVkaWFucyA8LSBzYXBwbHkodWRhamVfMjAyMFssIGMoIkluZmxhdGlvbi5SYXRlLi4uLiIsICJHRFAuR3Jvd3RoLlJhdGUuLi4uIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5lbXBsb3ltZW50LlJhdGUuLi4uIiwgIkludGVyZXN0LlJhdGUuLi4uIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RvY2suSW5kZXguVmFsdWUiKV0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW4sIG5hLnJtID0gVFJVRSkNCiAgDQogIGZvcihjb2wgaW4gbmFtZXMoY29sdW1uX21lZGlhbnMpKSB7DQogICAgbmFfaW5kZXggPC0gaXMubmEodWRhamVfMjAyMFtbY29sXV0pDQogICAgaWYoYW55KG5hX2luZGV4KSkgew0KICAgICAgdWRhamVfMjAyMFtbY29sXV1bbmFfaW5kZXhdIDwtIGNvbHVtbl9tZWRpYW5zW2NvbF0NCiAgICB9DQogIH0NCn0NCg0KY29sbmFtZXModWRhamVfMjAyMCkgPC0gYygiRGF0ZSIsICJDb3VudHJ5IiwgIkluZmxhdGlvbl9SYXRlIiwgIkdEUF9Hcm93dGhfUmF0ZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICJVbmVtcGxveW1lbnRfUmF0ZSIsICJJbnRlcmVzdF9SYXRlIiwgIlN0b2NrX0luZGV4X1ZhbHVlIikNCg0KdWRhamUgPC0gdWRhamVfMjAyMA0Kcm0odWRhamVfMjAyMCkNCg0Kc3VtbWFyeSh1ZGFqZVssIDM6N10pDQpgYGANClbFoWV0a3kgcHJlbWVubsOpIG1hasO6IHBsbsO6IGluZm9ybWHEjW5vc8WlICoqKMW+aWFkbmUgY2jDvWJhasO6Y2UgaG9kbm90eSkqKiBhIHZ5a2F6dWrDuiBwcmltZXJhbsO6IHZhcmlhYmlsaXR1DQoNCiMjIDMuIE9kaGFkIHrDoWtsYWRuw6lobyByZWdyZXNuw6lobyBtb2RlbHUNCg0KYGBge3J9DQptb2RlbCA8LSBsbShTdG9ja19JbmRleF9WYWx1ZSB+IEluZmxhdGlvbl9SYXRlICsgR0RQX0dyb3d0aF9SYXRlICsgDQogICAgICAgICAgICAgVW5lbXBsb3ltZW50X1JhdGUgKyBJbnRlcmVzdF9SYXRlLA0KICAgICAgICAgICBkYXRhID0gdWRhamUpDQoNCnN1bW1hcnkobW9kZWwpDQpgYGANClrDoWtsYWRuw70gcmVncmVzbsO9IG1vZGVsIHZ5a2F6dWplIG7DrXprdSBleHBsYW5hxI1uw7ogc2lsdSAqKihSwrIgPSAwLDA3MykqKiBhIG5pZSBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSBha28gY2Vsb2sgKioocC1ob2Rub3RhIEYtdGVzdHUgPSAwLDUyNykqKi4gDQrFvWlhZG55IHogcmVncmVzbsO9Y2gga29lZmljaWVudG92IG5pZSBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSBuYSBiZcW+bsO9Y2ggaGxhZGluw6FjaCB2w716bmFtbm9zdGksIMSNbyBuYXpuYcSNdWplIHByb2Jsw6ltIHNvIMWhcGVjaWZpa8OhY2lvdSBtb2RlbHUgYWxlYm8gcHLDrXRvbW5vc8Wlb3UgbXVsdGlrb2xpbmVhcml0eS4NCg0KIyMgNC4gS29yZWxhxI1uw6EgbWF0aWNhDQoNCktvcmVsYcSNbsOhIG1hdGljYSBuw6FtIHBvbcO0xb5lIGlkZW50aWZpa292YcWlIHDDoXJvdsOpIGxpbmXDoXJuZSB2esWlYWh5IG1lZHppIHByZW1lbm7DvW1pLiANCg0KSW50dWl0w612bmUgcHJhdmlkbG8gaG92b3LDrSwgxb5lIGFrIGFic29sw7p0bmEgaG9kbm90YSBrb3JlbMOhY2llIG1lZHppIGR2b21hIHByZW1lbm7DvW1pIHByZXNhaHVqZSAwLjggKHByw61zbmVqxaFpZSAwLjkpLCBtw7TFvmUgdG8gc2lnbmFsaXpvdmHFpSBwcm9ibMOpbSBtdWx0aWtvbGluZWFyaXR5Lg0KDQpgYGB7cn0NCnh2YXJzIDwtIHVkYWplWywgYygiSW5mbGF0aW9uX1JhdGUiLCAiR0RQX0dyb3d0aF9SYXRlIiwgDQogICAgICAgICAgICAgICAgICAgIlVuZW1wbG95bWVudF9SYXRlIiwgIkludGVyZXN0X1JhdGUiKV0NCg0Ka29yZWxhY25hX21hdGljYSA8LSByb3VuZChjb3IoeHZhcnMpLCAzKQ0Ka29yZWxhY25hX21hdGljYQ0KYGBgDQpLb3JlbGHEjW7DoSBtYXRpY2EgbmVpbmRpa3VqZSBzaWxuw6kgbGluZcOhcm5lIHZ6xaVhaHkgbWVkemkgdnlzdmV0xL51asO6Y2ltaSBwcmVtZW5uw71taSwga2XEj8W+ZSB2xaFldGt5IGtvcmVsYcSNbsOpIGtvZWZpY2llbnR5IHPDuiBibMOtemtlIG51bGUuIA0KDQpKZWRpbm91IG1pZXJuZSB2w71yYXpuZWrFoW91IGtvcmVsw6FjaW91IGplIG5lZ2F0w612bnkgdnrFpWFoIG1lZHppIG1pZXJvdSBuZXphbWVzdG5hbm9zdGkgYSDDunJva292b3Ugc2FkemJvdSAqKigtMCwyOTkpKiosIMSNbyBlxaF0ZSBuZXByZWRzdGF2dWplIGtyaXRpY2vDuiBob2Rub3R1IHByZSBtdWx0aWtvbGluZWFyaXR1Lg0KDQojIyA1LiBHcmFmaWNrw6EgYW5hbMO9emEgdnrFpWFob3YgbWVkemkgcHJlbWVubsO9bWkNCg0KYGBge3J9DQpwYWlycyh4dmFycywNCiAgICAgIG1haW4gPSAiU2NhdHRlcnBsb3RvdsOhIG1hdGljYSDigJMgZWtvbm9taWNrw6kgcHJlbWVubsOpIiwNCiAgICAgIHBjaCA9IDE5LA0KICAgICAgY29sID0gImJsdWUiLA0KICAgICAgY2V4ID0gMC42KQ0KYGBgDQpaIGRpYWdyYW11IHZpZMOtbWUsIMW+ZSBtZWR6aSB2w6TEjcWhaW5vdSBww6Fyb3YgcHJlbWVubsO9Y2ggKipuZWV4aXN0dWplKiogc2lsbsO9LCBqYXNuw70gbGluZcOhcm55IHZ6xaVhaCwgcHJldG/FvmUgYm9keSBzw7ogcm96dHLDunNlbsOpIG7DoWhvZG5lIHYga2HFvmRvbSBncmFmZS4NCg0KIyMgNi4gVklGIChWYXJpYW5jZSBJbmZsYXRpb24gRmFjdG9yKQ0KDQpWSUYgamUgcHJpYW15bSBpbmRpa8OhdG9yb20gbXVsdGlrb2xpbmVhcml0eSBwcmUga2HFvmTDuiB2eXN2ZXTEvnVqw7pjdSBwcmVtZW5uw7o6DQoNCi0gVklGIDwgNTogbsOtemthIG11bHRpa29saW5lYXJpdGENCg0KLSA1IOKJpCBWSUYgPCAxMDogbWllcm5hIG11bHRpa29saW5lYXJpdGENCg0KLSBWSUYg4omlIDEwOiB2eXNva8OhIG11bHRpa29saW5lYXJpdGENCg0KYGBge3J9DQp2aWZfaG9kbm90eSA8LSB2aWYobW9kZWwpDQp2aWZfaG9kbm90eQ0KYGBgDQpWxaFldGt5IGhvZG5vdHkgVklGIHPDuiB2w71yYXpuZSBwb2Qga3JpdGlja291IGhyYW5pY291IDUsIMSNbyBwb3R2cmR6dWplLCDFvmUgbWVkemkgdnlzdmV0xL51asO6Y2ltaSBwcmVtZW5uw71taSBuZWV4aXN0dWplIHByb2Jsw6ltIG11bHRpa29saW5lYXJpdHkuIA0KDQpOYWp2ecWhxaFpdSBob2Rub3R1IFZJRiAqKigxLDEyKSoqIG3DoSBwcmVtZW5uw6EgVW5lbXBsb3ltZW50X1JhdGUsIMSNbyB2xaFhayBzdMOhbGUgcHJlZHN0YXZ1amUgbWluaW3DoWxuZSB6dsO9xaFlbmllIHJvenB0eWx1IG9kaGFkb3YgdiBkw7RzbGVka3Uga29yZWzDoWNpZSBzIGluw71taSBwcmVtZW5uw71taS4NCg0KIyMgNy4gQ29uZGl0aW9uIE51bWJlciAoxI3DrXNsbyBwb2RtaWVuZW5vc3RpKQ0KDQpDb25kaXRpb24gbnVtYmVyIHBvc3VkenVqZSBjZWxrb3bDuiBtaWVydSBtdWx0aWtvbGluZWFyaXR5IHYgbW9kZWxpOg0KDQotIDwgMTA6IG7DrXprYSBtdWx0aWtvbGluZWFyaXRhDQoNCi0gMTDigJMzMDogbWllcm5hIG11bHRpa29saW5lYXJpdGENCg0KLSAzMOKAkzEwMDogdnlzb2vDoSBtdWx0aWtvbGluZWFyaXRhDQoNCmBgYHtyfQ0KWCA8LSBtb2RlbC5tYXRyaXgobW9kZWwpWywgLTFdDQpYdFggPC0gdChYKSAlKiUgWA0Kdmxhc3RuZV9ob2Rub3R5IDwtIGVpZ2VuKFh0WCkkdmFsdWVzDQoNCmNvbmRpdGlvbl9udW1iZXIgPC0gc3FydChtYXgodmxhc3RuZV9ob2Rub3R5KSAvIG1pbih2bGFzdG5lX2hvZG5vdHkpKQ0KY29uZGl0aW9uX251bWJlcg0KYGBgDQpDb25kaXRpb24gbnVtYmVyICoqMyw1MioqIHbDvXJhem5lIHBvZCBocmFuaWNvdSAxMCBwb3R2cmR6dWplIGFic2VuY2l1IG11bHRpa29saW5lYXJpdHkgdiBtb2RlbGkuIA0KDQpUYWvDoXRvIG7DrXprYSBob2Rub3RhIGluZGlrdWplLCDFvmUgbWF0aWNhIGRpemFqbnUgamUgZG9icmUgcG9kbWllbmVuw6EgYSBvZGhhZHkgcmVncmVzbsO9Y2gga29lZmljaWVudG92IHPDuiBudW1lcmlja3kgc3RhYmlsbsOpLg0KDQojIyA4LiBSaWXFoWVuaWEgbXVsdGlrb2xpbmVhcml0eQ0KDQojIyMgOC4xIFZ5bmVjaGFuaWUgcHJlbWVubmVqDQoNClNrw7pzbWUgcG9zdHVwbmUgdnluZWNoYcWlIHByZW1lbm7DqSBzIG5hanZ5xaHFocOtbSBWSUYuDQoNCmBgYHtyfQ0KbW9kZWxfbm9faW5mbGF0aW9uIDwtIGxtKFN0b2NrX0luZGV4X1ZhbHVlIH4gR0RQX0dyb3d0aF9SYXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgIFVuZW1wbG95bWVudF9SYXRlICsgSW50ZXJlc3RfUmF0ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSB1ZGFqZSkNCnN1bW1hcnkobW9kZWxfbm9faW5mbGF0aW9uKQ0KDQptb2RlbF9ub19pbnRlcmVzdCA8LSBsbShTdG9ja19JbmRleF9WYWx1ZSB+IEluZmxhdGlvbl9SYXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgR0RQX0dyb3d0aF9SYXRlICsgVW5lbXBsb3ltZW50X1JhdGUsDQogICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSB1ZGFqZSkNCnN1bW1hcnkobW9kZWxfbm9faW50ZXJlc3QpDQoNCmNhdCgiVXByYXZlbsO9IFLCsiBww7R2b2Ruw6lobyBtb2RlbHU6Iiwgcm91bmQoc3VtbWFyeShtb2RlbCkkYWRqLnIuc3F1YXJlZCwgNCksICJcbiIpDQpjYXQoIlVwcmF2ZW7DvSBSwrIgbW9kZWx1IGJleiBpbmZsw6FjaWU6Iiwgcm91bmQoc3VtbWFyeShtb2RlbF9ub19pbmZsYXRpb24pJGFkai5yLnNxdWFyZWQsIDQpLCAiXG4iKQ0KY2F0KCJVcHJhdmVuw70gUsKyIG1vZGVsdSBiZXogw7pyb2tvdmVqIHNhZHpieToiLCByb3VuZChzdW1tYXJ5KG1vZGVsX25vX2ludGVyZXN0KSRhZGouci5zcXVhcmVkLCA0KSwgIlxuIikNCmBgYA0KVnluZWNoYW7DrW0gcHJlbWVubmVqIEluZmxhdGlvbl9SYXRlIGFsZWJvIEludGVyZXN0X1JhdGUgc2EgdXByYXZlbsO9IGtvZWZpY2llbnQgZGV0ZXJtaW7DoWNpZSBlxaF0ZSB6bsOtxb5pbCwgxI1vIHBvdHZyZHp1amUgbmVlZmVrdMOtdm5vc8WlIHRvaHRvIHByw61zdHVwdS4gDQoNClbFoWV0a3kgYWx0ZXJuYXTDrXZuZSBtb2RlbHkgb3N0w6F2YWrDuiDFoXRhdGlzdGlja3kgbmV2w716bmFtbsOpICoqKHAtaG9kbm90eSBGLXRlc3R1ID4gMCw0NDUpKiogcyBuZWdhdMOtdm55bWkgdXByYXZlbsO9bWkgUsKyLCDEjW8gbmF6bmHEjXVqZSBuZXZob2Rub3PFpSDFoXBlY2lmaWvDoWNpZSBtb2RlbHUuDQoNCiMjIyA4LjIgxaBrw6Fsb3ZhbmllIHByZW1lbm7DvWNoDQoNCkNlbnRyb3ZhbmllIGEgxaFrw6Fsb3ZhbmllIHByZW1lbm7DvWNoIG3DtMW+ZSBwb23DtGPFpSByZWR1a292YcWlIG11bHRpa29saW5lYXJpdHUuDQoNCmBgYHtyfQ0KdWRhamUkSW5mbGF0aW9uX3NjYWxlZCA8LSBzY2FsZSh1ZGFqZSRJbmZsYXRpb25fUmF0ZSwgY2VudGVyID0gVFJVRSwgc2NhbGUgPSBUUlVFKQ0KdWRhamUkR0RQX3NjYWxlZCA8LSBzY2FsZSh1ZGFqZSRHRFBfR3Jvd3RoX1JhdGUsIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkNCnVkYWplJFVuZW1wbG95bWVudF9zY2FsZWQgPC0gc2NhbGUodWRhamUkVW5lbXBsb3ltZW50X1JhdGUsIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkNCnVkYWplJEludGVyZXN0X3NjYWxlZCA8LSBzY2FsZSh1ZGFqZSRJbnRlcmVzdF9SYXRlLCBjZW50ZXIgPSBUUlVFLCBzY2FsZSA9IFRSVUUpDQoNCm1vZGVsX3NjYWxlZCA8LSBsbShTdG9ja19JbmRleF9WYWx1ZSB+IEluZmxhdGlvbl9zY2FsZWQgKyBHRFBfc2NhbGVkICsgDQogICAgICAgICAgICAgICAgICAgIFVuZW1wbG95bWVudF9zY2FsZWQgKyBJbnRlcmVzdF9zY2FsZWQsDQogICAgICAgICAgICAgICAgICBkYXRhID0gdWRhamUpDQoNCnN1bW1hcnkobW9kZWxfc2NhbGVkKQ0KDQp2aWZfc2NhbGVkIDwtIHZpZihtb2RlbF9zY2FsZWQpDQp2aWZfc2NhbGVkDQpgYGANCsWga8OhbG92YW7DvSBtb2RlbCBwb3NreXR1amUgw7pwbG5lIHJvdm5ha8OpIMWhdGF0aXN0aWNrw6kgdsO9c2xlZGt5IGFrbyBww7R2b2Ruw70gbW9kZWwgKGlkZW50aWNrw6kgUsKyLCBwLWhvZG5vdHkgYSByZXppZHXDoWxuYSBzbWVyb2Rham7DoSBvZGNow71sa2EpLiANCg0KT2RoYWR5IGtvZWZpY2llbnRvdiBwcmUgxaFrw6Fsb3ZhbsOpIHByZW1lbm7DqSB2eWphZHJ1asO6IHZwbHl2IHptZW55IG8gamVkbnUgc21lcm9kYWpuw7ogb2RjaMO9bGt1LCBwcmnEjW9tIMW+aWFkbmEgcHJlbWVubsOhIG5pZSBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DoS4gVklGIGhvZG5vdHkgem9zdMOhdmFqw7ogbsOtemtlLCDEjW8gb3DDpMWlIHZ5bHXEjXVqZSBtdWx0aWtvbGluZWFyaXR1Lg0KDQojIyMgOC4zIENvbmRpdGlvbiBOdW1iZXIgcG8gxaFrw6Fsb3ZhbsOtDQoNCmBgYHtyfQ0KWF9zY2FsZWQgPC0gbW9kZWwubWF0cml4KG1vZGVsX3NjYWxlZClbLCAtMV0NClh0WF9zY2FsZWQgPC0gdChYX3NjYWxlZCkgJSolIFhfc2NhbGVkDQp2bGFzdG5lX2hvZG5vdHlfc2NhbGVkIDwtIGVpZ2VuKFh0WF9zY2FsZWQpJHZhbHVlcw0KDQpjb25kaXRpb25fbnVtYmVyX3NjYWxlZCA8LSBzcXJ0KG1heCh2bGFzdG5lX2hvZG5vdHlfc2NhbGVkKSAvIG1pbih2bGFzdG5lX2hvZG5vdHlfc2NhbGVkKSkNCmNvbmRpdGlvbl9udW1iZXJfc2NhbGVkDQpgYGANCsWga8OhbG92YW5pZSBwcmVtZW5uw71jaCB6bsOtxb5pbG8gY29uZGl0aW9uIG51bWJlciB6ICoqMyw1MioqIG5hICoqMSw0MioqLCDEjW8gcHJlZHN0YXZ1amUgb3B0aW3DoWxudSBudW1lcmlja8O6IGtvbmRpY2lvbm92YW5vc8WlIG1hdGljZSBkaXpham51LiANCg0KSG9kbm90YSBibMOtemthICoqMSoqIHBvdHZyZHp1amUsIMW+ZSDFoWvDoWxvdmFuw6kgcHJlbWVubsOpIHPDuiB0YWttZXIgb3J0b2dvbsOhbG5lLCDEjW8gZWxpbWludWplIGFrw6lrb8S+dmVrIHByb2Jsw6lteSBzIG51bWVyaWNrb3UgcHJlc25vc8Wlb3UgdsO9cG/EjXRvdi4NCg0KIyMjIDguNCBUcmFuc2Zvcm3DoWNpYSBwcmVtZW5uw71jaA0KDQpOYW1pZXN0byDFoWvDoWxvdmFuaWEgbcO0xb5lbWUgcHJlbWVubsOpIHRyYW5zZm9ybW92YcWlIHRhaywgYWJ5IHNtZSB6YWNob3ZhbGkgaWNoIGludGVycHJldG92YXRlxL5ub3PFpS4NCg0KYGBge3J9DQphcHBseSh1ZGFqZVssIDM6Nl0sIDIsIHZhcikNCg0KbW9kZWxfaW50ZXJhY3Rpb24gPC0gbG0oU3RvY2tfSW5kZXhfVmFsdWUgfiBJbmZsYXRpb25fUmF0ZSAqIEdEUF9Hcm93dGhfUmF0ZSArIFVuZW1wbG95bWVudF9SYXRlICsgSW50ZXJlc3RfUmF0ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSB1ZGFqZSkNCnN1bW1hcnkobW9kZWxfaW50ZXJhY3Rpb24pDQpgYGANCk1vZGVsIHMgaW50ZXJha8SNbsO9bSDEjWxlbm9tIG1lZHppIGluZmzDoWNpb3UgYSByYXN0b20gSERQIG3DoSBlxaF0ZSBuacW+xaHDrSB1cHJhdmVuw70gUsKyICoqKC0wLDAzOSkqKiBhIHpvc3TDoXZhIMWhdGF0aXN0aWNreSBuZXbDvXpuYW1uw70gKioocCA9IDAsNjU3KSoqLiAgDQoNCkludGVyYWvEjW7DvSDEjWxlbiBuaWUgamUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70gKioocCA9IDAsNzIxKSoqLCDEjW8gbmF6bmHEjXVqZSwgxb5lIHRlbnRvIHR5cCB0cmFuc2Zvcm3DoWNpZSBuZXpsZXDFoXVqZSBleHBsYW5hxI1uw7ogc2lsdSBtb2RlbHUuDQoNCiMjIDkuIFBvcm92bmFuaWUgbW9kZWxvdg0KDQpgYGB7cn0NCm1vZGVscyA8LSBsaXN0KCJQw7R2b2Ruw70gbW9kZWwiID0gbW9kZWwsDQogICAgICAgICAgICAgICAiQmV6IGluZmzDoWNpZSIgPSBtb2RlbF9ub19pbmZsYXRpb24sDQogICAgICAgICAgICAgICAiQmV6IMO6cm9rb3ZlaiBzYWR6YnkiID0gbW9kZWxfbm9faW50ZXJlc3QsDQogICAgICAgICAgICAgICAixaBrw6Fsb3ZhbsO9IG1vZGVsIiA9IG1vZGVsX3NjYWxlZCkNCg0KY29tcGFyaXNvbiA8LSBkYXRhLmZyYW1lKA0KICBNb2RlbCA9IG5hbWVzKG1vZGVscyksDQogIFIyID0gc2FwcGx5KG1vZGVscywgZnVuY3Rpb24obSkgcm91bmQoc3VtbWFyeShtKSRyLnNxdWFyZWQsIDQpKSwNCiAgQWRqX1IyID0gc2FwcGx5KG1vZGVscywgZnVuY3Rpb24obSkgcm91bmQoc3VtbWFyeShtKSRhZGouci5zcXVhcmVkLCA0KSksDQogIEFJQyA9IHJvdW5kKHNhcHBseShtb2RlbHMsIEFJQyksIDIpLA0KICBCSUMgPSByb3VuZChzYXBwbHkobW9kZWxzLCBCSUMpLCAyKQ0KKQ0KDQpwcmludChjb21wYXJpc29uKQ0KYGBgDQpWxaFldGt5IMWhdHlyaSBtb2RlbHkgbWFqw7ogbmVnYXTDrXZuZSB1cHJhdmVuw6kgUsKyLCDEjW8gem5hbWVuw6EsIMW+ZSBzw7ogaG9yxaFpZSBha28gbW9kZWwgcyBpYmEga29uxaF0YW50b3UuIA0KDQpNb2RlbCBiZXogcHJlbWVubmVqIEluZmxhdGlvbl9SYXRlIG3DoSBuYWp2ecWhxaHDrSB1cHJhdmVuw70gUsKyICoqKC0wLDAwNjIpKiogYSBuYWpuacW+xaFpZSBpbmZvcm1hxI1uw6kga3JpdMOpcmnDoSBBSUMgYSBCSUMsIMSNbyBobyDEjWluw60gcmVsYXTDrXZuZSBuYWpsZXDFoW91LCBhdsWhYWsgc3TDoWxlIG5ldmhvZG5vdSDFoXBlY2lmaWvDoWNpb3UuDQoNCiMjIDEwLiBaaHJudXRpZSBhIHrDoXZlcnkNCg0KSGxhdm7DqSB6aXN0ZW5pYSB6IGFuYWzDvXp5Og0KDQotIE11bHRpa29saW5lYXJpdGEgbmVib2xhIGlkZW50aWZpa292YW7DoSAtIHbFoWV0a3kgZGlhZ25vc3RpY2vDqSBuw6FzdHJvamUgKGtvcmVsYcSNbsOhIG1hdGljYSwgKipWSUYgPCAxLDEzKiosICoqY29uZGl0aW9uIG51bWJlciA9IDMsNTIqKikga29uemlzdGVudG5lIHBvdHZyZHp1asO6IGFic2VuY2l1IG11bHRpa29saW5lYXJpdHkgbWVkemkgdnlzdmV0xL51asO6Y2ltaSBwcmVtZW5uw71taS4NCg0KLSBaw6FrbGFkbsO9IHByb2Jsw6ltIG1vZGVsdSBuaWUgamUgdiBtdWx0aWtvbGluZWFyaXRlIC0gbsOtemthIGV4cGxhbmHEjW7DoSBzaWxhIG1vZGVsb3YgKG5lZ2F0w612bmUgdXByYXZlbsOpIFLCsikgYSDFoXRhdGlzdGlja8OhIG5ldsO9em5hbW5vc8WlIGplZG5vdGxpdsO9Y2ggcHJlbWVubsO9Y2ggbmF6bmHEjXVqw7osIMW+ZSBwcm9ibMOpbSBzcG/EjcOtdmEgdiBuZXZob2RuZWogxaFwZWNpZmlrw6FjaWkgbW9kZWx1IGFsZWJvIHZvIHbDvWJlcmUgcHJlbWVubsO9Y2guDQoNCi0gxaBrw6Fsb3ZhbmllIHByZW1lbm7DvWNoIHpsZXDFoWlsbyBudW1lcmlja8O6IHN0YWJpbGl0dSAoY29uZGl0aW9uIG51bWJlciBrbGVzb2wgbmEgKioxLDQyKiopLCBhbGUgbmV6bWVuaWxvIMWhdGF0aXN0aWNrw6kgdmxhc3Rub3N0aSBtb2RlbHUuDQoNCk7DrXprYSBleHBsYW5hxI1uw6Egc2lsYSBhIMWhdGF0aXN0aWNrw6EgbmV2w716bmFtbm9zxaUgbW9kZWx1IHMgbmVnYXTDrXZueW0gdXByYXZlbsO9bSBSwrIgbmF6bmHEjXVqw7osIMW+ZSB6dm9sZW7DqSBla29ub21pY2vDqSBwcmVtZW5uw6kgKGluZmzDoWNpYSwgcmFzdCBIRFAsIG5lemFtZXN0bmFub3PFpSwgw7pyb2tvdsOhIHNhZHpiYSkgbmVkb2vDocW+dSBhZGVrdsOhdG5lIHZ5c3ZldGxpxaUgdmFyaWFiaWxpdHUgYWtjaW92w71jaCBpbmRleG92Lg0K