cat(’

’)

Import údajov z mojej bakalárskej práce

Načítam si csv súbor s dátami o elektromobilite vo V4. Sú to dáta, ktoré som používala na bakalársku prácu, je tam počet batériových elektrických vozidiel, hybridných vozidiel, EPI index, ktorý rozpráva o ekologickej vyspelosti krajín, emisie CO2 atď.

data<-read.csv("data_r_comma_utf8.csv")

Úvod do problému, stanovenie hypotéz

Rozhodla som sa skúmať, či rozšírenie elektromobility súvisí s kvalitou životného prostredia meranou indexom environmentálnej výkonnosti (EPI). Budem pracovať s panelom krajín a rokov v mojom datasete (elektromobilita a súvisiace ukazovatele). Zaujíma ma, či vyšší počet registrovaných batériových elektromobilov (BEV) a BEV_PHEV (súčet BEV a plug-in hybridov) prispieva k lepšiemu skóre EPI, po zohľadnení hospodárskej úrovne a ďalších faktorov.Sledujeme krajiny V4. Teoreticky očakávame, že prechod na vozidlá s nižšími emisiami výfukových plynov, spolu s investíciami do infraštruktúry a zdrojov, zlepší kvalitu ovzdušia a environmentálne výsledky – čo by sa malo prejaviť vyšším EPI. Uvedomujeme si však, že EPI je zložený index (klíma, ovzdušie, voda, biodiverzita, odpadová politika…), preto do modelu zaradíme aj kontrolné premenné.

Závislá premenná:

EPI – index environmentálnej výkonnosti.

Kľúčové vysvetľujúce premenné:

BEV – počet batériových elektromobilov.

BEV_PHEV – počet BEV + plug-in hybridov.

Kontrolné premenné (podľa dostupnosti v dátach):

HDP (HDP na obyvateľa),

co2 (emise CO₂),

investičné/rozvojové ukazovatele: res_develop, r_sources, unvest_man, invest_sources, invest_transport

Hypotézy

Nulová hypotéza (H0): Počet BEV ani BEV_PHEV nemá štatisticky významný vplyv na EPI. Hlavná hypotéza (H1): Vyšší počet BEV aj BEV_PHEV je spojený s vyšším EPI (pozitívny vplyv).

if (!exists("udaje")) {
udaje <- read.csv("data_r_comma_utf8.csv", header = TRUE, check.names = FALSE)
}
par(mfrow = c(2, 2))

boxplot(udaje$EPI,                main = "EPI (bez log)",     col = "darkgreen", horizontal = TRUE)
boxplot(log1p(udaje$BEV),         main = "log1p(BEV)",        col = "lightblue", horizontal = TRUE)
boxplot(log1p(udaje$BEV_PHEV),    main = "log1p(BEV_PHEV)",   col = "darkgreen", horizontal = TRUE)
boxplot(log1p(udaje$HDP),         main = "log1p(HDP)",        col = "lightblue", horizontal = TRUE)

par(mfrow = c(1, 1))

Boxploty ukazujú, že hodnota indexu EPI je v mojom súbore sústredená okolo 70 bodov a celkový rozptyl je skôr menší; objavuje sa však jeden nižší odľahlý prípad (≈50), na ktorý ďalej upozorňujem v diagnostike modelu. Po log-transformácii počtových premenných BEV a BEV_PHEV (log1p) sa rozdelenia výrazne stabilizovali – boxy sú symetrickejšie, bez extrémnych chvostov a s menšou vzdialenosťou od kvartilov, čo je priaznivé pre lineárne modelovanie. Premenná HDP má po logu veľmi úzky rozsah, takže v modeli bude pôsobiť najmä ako kontrola úrovne rozvoja, bez výraznych odľahlostí.

Lineárna regresia

# (1) Načítam data
udaje <- read.csv("data_r_comma_utf8.csv", header = TRUE, check.names = FALSE)

# (2) Lineárna regresia: EPI ~ BEV + BEV_PHEV + HDP
model <- lm(EPI ~ 1 + BEV + BEV_PHEV + HDP, data = udaje)

# (3) Súhrn výsledkov
summary(model)

Call:
lm(formula = EPI ~ 1 + BEV + BEV_PHEV + HDP, data = udaje)

Residuals:
    Min      1Q  Median      3Q     Max 
-20.337  -4.515  -1.171   5.483  17.717 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  6.378e+01  4.389e+00  14.531   <2e-16 ***
BEV          4.213e-05  4.561e-04   0.092    0.927    
BEV_PHEV    -9.857e-05  2.553e-04  -0.386    0.701    
HDP          3.166e-04  2.304e-04   1.374    0.176    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 8.771 on 46 degrees of freedom
Multiple R-squared:  0.1432,    Adjusted R-squared:  0.0873 
F-statistic: 2.562 on 3 and 46 DF,  p-value: 0.06626
# (4) Diagnostické grafy 
par(mfrow = c(2, 2))
plot(model)
par(mfrow = c(1, 1))

Residuals vs Fitted (reziduá vs. predikované): body sú okolo nuly, ale krivka je jemne zakrivená. → Model nie je úplne priamka; môže mu chýbať nejaká premena alebo jej log/štvorec. Rozptyl sa mierne mení pri vyšších hodnotách, čiže môže ísť o slabú neustálu varianciu (heteroskedasticitu).

Q–Q plot: väčšina bodov sedí na priamke, konce sa však odchyľujú. → Reziduá nie sú dokonale normálne — v „chvostoch“ je viac extrémov, než by ideálne bolo. To väčšinou nevadí dramaticky, ale je dobré o tom vedieť.

Scale–Location: čiara nie je úplne vodorovná. → Potvrdzuje to, že rozptyl chýb nie je úplne rovnaký pre všetky predikované hodnoty (slabá heteroskedasticita).

Residuals vs Leverage: je tam jeden bod s veľkým vplyvom (označený napr. 41). → Tento záznam môže ťahať výsledky modelu. Oplatí sa skontrolovať, či je to chyba v dátach alebo legitímne extrémny prípad.

Q-Q plot

Q–Q plot porovnáva kvantily štandardizovaných rezíduí s teoretickými normálnymi kvantilmi. Väčšina bodov leží pri priamke, no na koncoch sú mierne odchýlky, čo naznačuje ľahkú odchýlku od normality v chvostoch. Predpoklad normality je približne splnený; pre istotu uvádzam aj robustné smerodajné chyby.

# Q–Q plot rezíduí (samostatne)

qqnorm(rstandard(model)); qqline(rstandard(model))

NA
NA
plot(model, which = 2)  # which=2 = Q–Q plot

Na Q–Q grafe vidno, že väčšina boodov leží blízko priamky, takže moje reziduá sa správajú približne normálne .Menšie odchýlky sú na oboch koncoch grafu – vľavo dole a vpravo hore – čo znamená, že v chvostoch mám pár extrémnejších hodnôt.

Scare-Location plot

Body sú rozmiestnené pomerne rovnomerne naprieč osou X, bez výrazneho lievika.Červená LOESS krivka je len jemne naklonená – variancia rezíduí sa trochu mení, ale nie dramaticky.

Beriem to tak, že predpoklad konštantnej variability je približne splnený; pre istotu však uvádzam aj výsledky s robustnými smerodajnými chybami. Niekoľko bodov je mierne nad hodnotou 1,5 na osi Y, ale nejde o extrémne anomálie.


if (!exists("model")) {
if (!exists("udaje")) {
udaje <- read.csv("data_r_comma_utf8.csv", header = TRUE, check.names = FALSE)
}
model <- lm(EPI ~ log1p(BEV) + log1p(BEV_PHEV) + HDP, data = udaje)
}

# Scale–Location plot (which = 3)

plot(model, which = 3)

Graf Residuals vs Leverage ukazuje, aký veľký vplyv môžu mať jednotlivé pozorovania na priamku. Väčšina bodov je pri nízkom leverage a má malé reziduá, takže väčšina záznamov model neťahá.Vidieť však 1–2 body bližšie k bodkovaným krivkám Cookovej vzdialenosti – to sú potenciálne vplyvné pozorovania. Tie si kontrolujem testami a porovnám výsledky modelu s/bez nich.Záver: dáta sú vo všeobecnosti v poriadku; kvôli týmto bodom uvádzam aj robustné smerodajné chyby a robím doplnkovú kontrolu vplyvných bodov

# Residuals vs Leverage (s Cookovou vzdialenosťou)

plot(model, which = 5)

library(car)
library(lmtest); library(sandwich)

# Kombinácia leverage × rezíduum × Cook’s D (označí najpodozrivejšie body)

influencePlot(model, main = "Influence plot")


# Najsilnejší outlier (Bonferroni p-value)

outlierTest(model)
No Studentized residuals with Bonferroni p < 0.05
Largest |rstudent|:
# Robustné smerodajné chyby pre istotu

coeftest(model, vcov = vcovHC(model, type = "HC1"))

t test of coefficients:

               Estimate  Std. Error t value Pr(>|t|)    
(Intercept)  6.3776e+01  4.5684e+00 13.9603   <2e-16 ***
BEV          4.2129e-05  4.3809e-04  0.0962   0.9238    
BEV_PHEV    -9.8571e-05  2.4122e-04 -0.4086   0.6847    
HDP          3.1662e-04  2.1474e-04  1.4744   0.1472    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Pri log-špecifikácii vychádza HDP pozitívne a štatisticky významne, čo je v súlade s očakávaním (vyššia ekonomická úroveň súvisí s lepším EPI). Premenná log1p(BEV) nevyšla štatisticky významne, takže hlavnú hypotézu pre BEV nezamietam ani nepotvrdzujem (efekt sa nepreukázal).

# Model A: EPI ~ log(BEV) + HDP
m_bev  <- lm(EPI ~ log1p(BEV) + HDP, data = udaje)
summary(m_bev); coeftest(m_bev, vcov = vcovHC(m_bev, type = "HC1"))

Call:
lm(formula = EPI ~ log1p(BEV) + HDP, data = udaje)

Residuals:
     Min       1Q   Median       3Q      Max 
-15.0909  -4.1711  -0.7445   5.2535  14.7114 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) 86.8956784  4.7398188  18.333  < 2e-16 ***
log1p(BEV)  -3.5939951  0.6665698  -5.392 2.21e-06 ***
HDP          0.0005466  0.0001900   2.877  0.00603 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 7.367 on 47 degrees of freedom
Multiple R-squared:  0.3823,    Adjusted R-squared:  0.356 
F-statistic: 14.54 on 2 and 47 DF,  p-value: 1.211e-05


t test of coefficients:

               Estimate  Std. Error t value  Pr(>|t|)    
(Intercept) 86.89567837  5.43343513 15.9928 < 2.2e-16 ***
log1p(BEV)  -3.59399513  0.75667089 -4.7497  1.95e-05 ***
HDP          0.00054656  0.00019420  2.8144  0.007115 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# Model B: EPI ~ log(BEV_PHEV) + HDP
m_phev <- lm(EPI ~ log1p(BEV_PHEV) + HDP, data = udaje)
summary(m_phev); coeftest(m_phev, vcov = vcovHC(m_phev, type = "HC1"))

Call:
lm(formula = EPI ~ log1p(BEV_PHEV) + HDP, data = udaje)

Residuals:
     Min       1Q   Median       3Q      Max 
-14.8667  -4.2839  -0.6805   4.3720  13.7936 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)     89.2739287  4.7887883  18.642  < 2e-16 ***
log1p(BEV_PHEV) -3.8005552  0.6530506  -5.820 5.04e-07 ***
HDP              0.0006089  0.0001877   3.243  0.00218 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 7.145 on 47 degrees of freedom
Multiple R-squared:  0.419, Adjusted R-squared:  0.3942 
F-statistic: 16.94 on 2 and 47 DF,  p-value: 2.877e-06


t test of coefficients:

                   Estimate  Std. Error t value  Pr(>|t|)    
(Intercept)     89.27392868  5.80102043 15.3893 < 2.2e-16 ***
log1p(BEV_PHEV) -3.80055516  0.78549751 -4.8384  1.45e-05 ***
HDP              0.00060888  0.00019776  3.0789  0.003464 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# porovnanie kvality
AIC(m_bev, m_phev)
NA

Vysvetlenie kontroly: Aby som sa vyhla kolinearite, odhadla som samostatne model s BEV a model s BEV_PHEV. Porovnanie AIC ukázalo, že lepšie sedí model s BEV_PHEV. V ňom je HDP pozitívne a významné, kým BEV_PHEV vychádza negatívne a vysoko významne. To je v rozpore s pôvodným očakávaním pozitívneho efektu elektromobility na EPI, a v diskusii uvádzam možné dôvody (napr. načasovanie – rýchly nárast PHEV bez okamžitého zlepšenia EPI, reálne emisie PHEV, iné environmentálne domény v EPI)

Načasovanie: oneskorený vplyv elektromobility (lag o 1 rok)

library(dplyr)

udaje_lag <- udaje %>%
arrange(Krajina, Rok) %>%
group_by(Krajina) %>%
mutate(lag_BEV_PHEV = dplyr::lag(BEV_PHEV, 1)) %>%
ungroup()

m_lag <- lm(EPI ~ log1p(lag_BEV_PHEV) + HDP + factor(Krajina) + factor(Rok), data = udaje_lag)
coeftest(m_lag, vcov = vcovCL(m_lag, cluster = ~ Krajina, type = "HC1"))

t test of coefficients:

                          Estimate  Std. Error t value  Pr(>|t|)    
(Intercept)             50.8959137  65.0340670  0.7826 0.4399939    
log1p(lag_BEV_PHEV)     -2.0425584   1.5285689 -1.3363 0.1915136    
HDP                      0.0020646   0.0038335  0.5386 0.5941504    
factor(Krajina)EU-avrg -20.6979705  37.5633150 -0.5510 0.5857037    
factor(Krajina)MR        9.5261676  25.1708980  0.3785 0.7077543    
factor(Krajina)PL        7.3166762  26.7654445  0.2734 0.7864475    
factor(Krajina)SK        4.1908401  12.0927337  0.3466 0.7313421    
factor(Rok)2016          9.5399727   2.4016859  3.9722 0.0004121 ***
factor(Rok)2017         -1.4413973   3.0279243 -0.4760 0.6374981    
factor(Rok)2018         -8.1105733   5.3325433 -1.5210 0.1387416    
factor(Rok)2019        -10.1512429   6.6783228 -1.5200 0.1389742    
factor(Rok)2020         -7.7457174   3.0950422 -2.5026 0.0180056 *  
factor(Rok)2021        -15.1063011   6.3794152 -2.3680 0.0245284 *  
factor(Rok)2022        -18.9950331   7.2001178 -2.6382 0.0130861 *  
factor(Rok)2023         -6.9375471   8.2719932 -0.8387 0.4082826    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Štandardizované koeficienty = porovnateľná sila efektov

Uvidíme, ktorý prediktor má najväčší „zásah“ do EPI.

m_std <- lm(scale(EPI) ~ scale(log1p(BEV_PHEV)) + scale(HDP), data = udaje)
summary(m_std)

Call:
lm(formula = scale(EPI) ~ scale(log1p(BEV_PHEV)) + scale(HDP), 
    data = udaje)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.61936 -0.46663 -0.07412  0.47622  1.50247 

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)    
(Intercept)             4.914e-16  1.101e-01   0.000  1.00000    
scale(log1p(BEV_PHEV)) -7.921e-01  1.361e-01  -5.820 5.04e-07 ***
scale(HDP)              4.414e-01  1.361e-01   3.243  0.00218 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.7783 on 47 degrees of freedom
Multiple R-squared:  0.419, Adjusted R-squared:  0.3942 
F-statistic: 16.94 on 2 and 47 DF,  p-value: 2.877e-06

Najväčší „zásah“ má v tomto štandardizovanom modeli log1p(BEV_PHEV).

Po štandardizácii vychádza, že 1 SD nárast log(BEV_PHEV) súvisí s poklesom EPI o ~0.79 SD (p < 0.001), zatiaľ čo 1 SD nárast HDP súvisí s nárastom EPI o ~0.44 SD (p = 0.002); model vysvetľuje ~42 % variability EPI

library(dplyr)
library(kableExtra)

## 1) Slovné zhrnutie diagnostiky a výsledkov

t1 <- tibble(
`Q–Q plot` = "Väčšina bodov pri priamke; mierne odchýlky v chvostoch → normalita približne OK (reportujem robustné SE).",
`Scale-Location` = "LOESS jemne naklonený → slabá heteroskedasticita (riešená robustnými SE).",
`Residuals vs Leverage` = "Vplyvné body (20, 31, 35, 48); Bonferroni neoznačil extrémny outlier.",
`Výsledky regresie` = "Lepší je model s log1p(BEV_PHEV)+HDP (AIC ≈ 343 < 346). HDP: pozitívny a významný; log1p(BEV_PHEV): negatívny a vysoko významný; BEV nevýznamné."
)

emerald_light <- "#ECFDF5"  # pozadie buniek
emerald_head  <- "#D1FAE5"  # hlavička
emerald_text  <- "#065F46"  # tmavozelený text

kbl(t1, caption = "Diagnostika a výsledky – stručné zhrnutie", booktabs = TRUE) %>%
kable_classic(full_width = TRUE, html_font = "Helvetica") %>%
row_spec(0, background = emerald_head, color = emerald_text, bold = TRUE) %>%
column_spec(1:4, background = emerald_light, color = emerald_text, border_left = TRUE, border_right = TRUE)
Diagnostika a výsledky – stručné zhrnutie
Q–Q plot Scale-Location Residuals vs Leverage Výsledky regresie
Väčšina bodov pri priamke; mierne odchýlky v chvostoch → normalita približne OK (reportujem robustné SE). LOESS jemne naklonený → slabá heteroskedasticita (riešená robustnými SE). Vplyvné body (20, 31, 35, 48); Bonferroni neoznačil extrémny outlier. Lepší je model s log1p(BEV_PHEV)+HDP (AIC ≈ 343 < 346). HDP: pozitívny a významný; log1p(BEV_PHEV): negatívny a vysoko významný; BEV nevýznamné.

## 2) Rozhodnutia o hypotézach

t2 <- tibble::tribble(
~Premenná,   ~"H1 (očakávanie)",             ~"Rozhodnutie o H0",             ~"Rozhodnutie o H1",              ~Poznámka,
"BEV",       "β_BE V > 0 (pozitívny)",       "NEZAMIETAM (nevýznamné)",      "NEPODPORUJEM",                   "V modeli EPI ~ log1p(BEV)+HDP je BEV nevýznamné.",
"BEV_PHEV",  "β_PHEV > 0 (pozitívny)",       "ZAMIETAM (významné)",          "ZAMIETAM (efekt je záporný)",    "log1p(BEV_PHEV) významne negatívne; model s PHEV má nižší AIC."
)

kbl(t2, caption = "Hypotézy a rozhodnutia (robustné SE, log-špecifikácie)", booktabs = TRUE) %>%
kable_classic(full_width = FALSE, html_font = "Helvetica") %>%
row_spec(0, background = emerald_head, color = emerald_text, bold = TRUE) %>%
column_spec(1:ncol(t2), background = emerald_light, color = emerald_text)
Hypotézy a rozhodnutia (robustné SE, log-špecifikácie)
Premenná H1 (očakávanie) Rozhodnutie o H0 Rozhodnutie o H1 Poznámka
BEV β_BE V > 0 (pozitívny) NEZAMIETAM (nevýznamné) NEPODPORUJEM V modeli EPI ~ log1p(BEV)+HDP je BEV nevýznamné.
BEV_PHEV β_PHEV > 0 (pozitívny) ZAMIETAM (významné) ZAMIETAM (efekt je záporný) log1p(BEV_PHEV) významne negatívne; model s PHEV má nižší AIC.
NA

Záver

Výsledky naznačujú, že HDP má na EPI pozitívny a štatisticky významný vplyv. V modeli s BEV (po log-transformácii) jeho efekt nie je štatisticky významný – nulovú hypotézu o nulovom efekte nevieme zamietnuť. V alternatívnom modeli s BEV_PHEV vychádza koeficient významne negatívny. Porovnanie AIC ukazuje, že model s BEV_PHEV a HDP lepšie sedí dátam ako verzia s BEV.

Štandardizované koeficienty naznačujú, že 1 SD nárast log(BEV_PHEV) súvisí s ≈ 0,79 SD poklesom EPI, zatiaľ čo 1 SD nárast HDP súvisí s ≈ 0,44 SD nárastom EPI. Model vysvetľuje približne 40–42 % variability EPI.

Diagnostika rezíduí poukazuje na mierne odchýlky v chvostoch a slabú heteroskedasticitu; preto uvádzam robustné štandardné chyby. Zistené vplyvné pozorovania nemenia kvalitatívne závery.

Celkovo výsledky podporujú význam ekonomickej úrovne krajiny pre environmentálnu výkonnosť. Priamy pozitívny vplyv elektromobility na EPI sa v tomto súbore dát nepreukázal – pri BEV efekt nevieme preukázať a pri BEV_PHEV vychádza negatívna asociácia. Tento nesúlad s pôvodným očakávaním môže súvisieť s načasovaním (efekty sa prejavia neskôr), s reálnymi emisiami PHEV alebo s tým, že EPI zachytáva aj oblasti mimo dopravy.

LS0tCnRpdGxlOiAiRWNvbm9tZXRyaWNzIGluIFIgLSBjdmnEjWVuaWUgNSIKYXV0aG9yOiAiU2ltb25hIFZhbsSNb3bDoSAgPGJyPiAocyB2eXXFvml0w61tIHZlcmVqbmUgZG9zdHVwbsO9Y2gga8OzZG92KSIKZGF0ZTogIk9rdMOzYmVyIDIwMjUiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRoZW1lOiB1bml0ZWQKICAgIGhpZ2hsaWdodDogdGFuZ28KICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICBkZl9wcmludDogcGFnZWQKZWRpdG9yX29wdGlvbnM6CiAgbWFya2Rvd246CiAgICB3cmFwOiA3MgotLS0KCmNhdCgnCgpgYGB7PWh0bWx9CjxzdHlsZT4KLyogc21hcmFnZG92byB6ZWxlbsOhICovCmgxLCBoMS50aXRsZSwgLnRpdGxlIHsgY29sb3I6ICMxMGI5ODEgIWltcG9ydGFudDsgfQplbSwgaSB7IGNvbG9yOiAjMTBiOTgxICFpbXBvcnRhbnQ7IH0KPC9zdHlsZT4KYGBgCgonKQoKIyBbKipJbXBvcnQgw7pkYWpvdiB6IG1vamVqIGJha2Fsw6Fyc2tlaiBwcsOhY2UqKl17c3R5bGU9ImNvbG9yOiMxMEI5ODE7IGZvbnQtd2VpZ2h0OjcwMDsifQoKTmHEjcOtdGFtIHNpIGNzdiBzw7pib3IgcyAqZMOhdGFtaSBvIGVsZWt0cm9tb2JpbGl0ZSB2byBWNCouIFPDuiB0byBkw6F0YSwKa3RvcsOpIHNvbSBwb3XFvsOtdmFsYSBuYSBiYWthbMOhcnNrdSBwcsOhY3UsIGplIHRhbSBwb8SNZXQgYmF0w6lyaW92w71jaAplbGVrdHJpY2vDvWNoIHZvemlkaWVsLCBoeWJyaWRuw71jaCB2b3ppZGllbCwgRVBJIGluZGV4LCBrdG9yw70gcm96cHLDoXZhIG8KZWtvbG9naWNrZWogdnlzcGVsb3N0aSBrcmFqw61uLCBlbWlzaWUgQ08yIGF0xI8uCgpgYGB7cn0KZGF0YTwtcmVhZC5jc3YoImRhdGFfcl9jb21tYV91dGY4LmNzdiIpCmBgYAoKIyDDmnZvZCBkbyBwcm9ibMOpbXUsIHN0YW5vdmVuaWUgaHlwb3TDqXoKClJvemhvZGxhIHNvbSBzYSAqKnNrw7ptYcWlLCDEjWkgcm96xaHDrXJlbmllIGVsZWt0cm9tb2JpbGl0eSBzw7p2aXPDrSBzIGt2YWxpdG91CsW+aXZvdG7DqWhvIHByb3N0cmVkaWEgbWVyYW5vdSBpbmRleG9tIGVudmlyb25tZW50w6FsbmVqIHbDvWtvbm5vc3RpIChFUEkpLioqCkJ1ZGVtIHByYWNvdmHFpSBzIHBhbmVsb20ga3JhasOtbiBhIHJva292IHYgbW9qb20gZGF0YXNldGUKKGVsZWt0cm9tb2JpbGl0YSBhIHPDunZpc2lhY2UgdWthem92YXRlbGUpLiBaYXVqw61tYSBtYSwgxI1pIHZ5xaHFocOtIHBvxI1ldApyZWdpc3Ryb3ZhbsO9Y2ggYmF0w6lyaW92w71jaCBlbGVrdHJvbW9iaWxvdiAoQkVWKSBhIEJFVl9QSEVWIChzw7rEjWV0IEJFViBhCnBsdWctaW4gaHlicmlkb3YpIHByaXNwaWV2YSBrIGxlcMWhaWVtdSBza8OzcmUgRVBJLCBwbyB6b2jEvmFkbmVuw60KaG9zcG9kw6Fyc2tlaiDDunJvdm5lIGEgxI9hbMWhw61jaCBmYWt0b3Jvdi5TbGVkdWplbWUga3JhamlueSBWNC4gVGVvcmV0aWNreQpvxI1ha8OhdmFtZSwgxb5lIHByZWNob2QgbmEgdm96aWRsw6EgcyBuacW+xaHDrW1pIGVtaXNpYW1pIHbDvWZ1a292w71jaCBwbHlub3YsCnNwb2x1IHMgaW52ZXN0w61jaWFtaSBkbyBpbmZyYcWhdHJ1a3TDunJ5IGEgemRyb2pvdiwgemxlcMWhw60ga3ZhbGl0dQpvdnpkdcWhaWEgYSBlbnZpcm9ubWVudMOhbG5lIHbDvXNsZWRreSDigJMgxI1vIGJ5IHNhIG1hbG8gcHJlamF2acWlIHZ5xaHFocOtbSBFUEkuClV2ZWRvbXVqZW1lIHNpIHbFoWFrLCDFvmUgRVBJIGplIHpsb8W+ZW7DvSBpbmRleCAoa2zDrW1hLCBvdnpkdcWhaWUsIHZvZGEsCmJpb2RpdmVyeml0YSwgb2RwYWRvdsOhIHBvbGl0aWth4oCmKSwgcHJldG8gZG8gbW9kZWx1IHphcmFkw61tZSBhaiBrb250cm9sbsOpCnByZW1lbm7DqS4KCiMjIFrDoXZpc2zDoSBwcmVtZW5uw6E6CgpFUEkg4oCTIGluZGV4IGVudmlyb25tZW50w6FsbmVqIHbDvWtvbm5vc3RpLgoKIyMgS8S+w7rEjW92w6kgdnlzdmV0xL51asO6Y2UgcHJlbWVubsOpOgoKQkVWIOKAkyBwb8SNZXQgYmF0w6lyaW92w71jaCBlbGVrdHJvbW9iaWxvdi4KCkJFVl9QSEVWIOKAkyBwb8SNZXQgQkVWICsgcGx1Zy1pbiBoeWJyaWRvdi4KCiMjIEtvbnRyb2xuw6kgcHJlbWVubsOpIChwb2TEvmEgZG9zdHVwbm9zdGkgdiBkw6F0YWNoKToKCkhEUCAoSERQIG5hIG9ieXZhdGXEvmEpLAoKY28yIChlbWlzZSBDT+KCgiksCgppbnZlc3RpxI1uw6kvcm96dm9qb3bDqSB1a2F6b3ZhdGVsZTogcmVzX2RldmVsb3AsIHJfc291cmNlcywgdW52ZXN0X21hbiwKaW52ZXN0X3NvdXJjZXMsIGludmVzdF90cmFuc3BvcnQKCiMgSHlwb3TDqXp5CgoqTnVsb3bDoSBoeXBvdMOpemEgKEgwKToqIFBvxI1ldCBCRVYgYW5pIEJFVl9QSEVWIG5lbcOhIMWhdGF0aXN0aWNreSB2w716bmFtbsO9CnZwbHl2IG5hIEVQSS4gCipIbGF2bsOhIGh5cG90w6l6YSAoSDEpOiogVnnFocWhw60gcG/EjWV0IEJFViBhaiBCRVZfUEhFViBqZQpzcG9qZW7DvSBzIHZ5xaHFocOtbSBFUEkgKHBveml0w612bnkgdnBseXYpLgoKCgoKYGBge3J9CmlmICghZXhpc3RzKCJ1ZGFqZSIpKSB7CnVkYWplIDwtIHJlYWQuY3N2KCJkYXRhX3JfY29tbWFfdXRmOC5jc3YiLCBoZWFkZXIgPSBUUlVFLCBjaGVjay5uYW1lcyA9IEZBTFNFKQp9CnBhcihtZnJvdyA9IGMoMiwgMikpCgpib3hwbG90KHVkYWplJEVQSSwgICAgICAgICAgICAgICAgbWFpbiA9ICJFUEkgKGJleiBsb2cpIiwgICAgIGNvbCA9ICJkYXJrZ3JlZW4iLCBob3Jpem9udGFsID0gVFJVRSkKYm94cGxvdChsb2cxcCh1ZGFqZSRCRVYpLCAgICAgICAgIG1haW4gPSAibG9nMXAoQkVWKSIsICAgICAgICBjb2wgPSAibGlnaHRibHVlIiwgaG9yaXpvbnRhbCA9IFRSVUUpCmJveHBsb3QobG9nMXAodWRhamUkQkVWX1BIRVYpLCAgICBtYWluID0gImxvZzFwKEJFVl9QSEVWKSIsICAgY29sID0gImRhcmtncmVlbiIsIGhvcml6b250YWwgPSBUUlVFKQpib3hwbG90KGxvZzFwKHVkYWplJEhEUCksICAgICAgICAgbWFpbiA9ICJsb2cxcChIRFApIiwgICAgICAgIGNvbCA9ICJsaWdodGJsdWUiLCBob3Jpem9udGFsID0gVFJVRSkKCnBhcihtZnJvdyA9IGMoMSwgMSkpCgpgYGAKCkJveHBsb3R5IHVrYXp1asO6LCDFvmUgaG9kbm90YSBpbmRleHUgRVBJIGplIHYgbW9qb20gc8O6Ym9yZSBzw7pzdHJlZGVuw6EKb2tvbG8gNzAgYm9kb3YgYSBjZWxrb3bDvSByb3pwdHlsIGplIHNrw7RyIG1lbsWhw607IG9iamF2dWplIHNhIHbFoWFrIGplZGVuCm5pxb7FocOtIG9kxL5haGzDvSBwcsOtcGFkICjiiYg1MCksIG5hIGt0b3LDvSDEj2FsZWogdXBvem9yxYh1amVtIHYgZGlhZ25vc3Rpa2UKbW9kZWx1LiBQbyBsb2ctdHJhbnNmb3Jtw6FjaWkgcG/EjXRvdsO9Y2ggcHJlbWVubsO9Y2ggQkVWIGEgQkVWX1BIRVYgKGxvZzFwKQpzYSByb3pkZWxlbmlhIHbDvXJhem5lIHN0YWJpbGl6b3ZhbGkg4oCTIGJveHkgc8O6IHN5bWV0cmlja2VqxaFpZSwgYmV6CmV4dHLDqW1ueWNoIGNodm9zdG92IGEgcyBtZW7FoW91IHZ6ZGlhbGVub3PFpW91IG9kIGt2YXJ0aWxvdiwgxI1vIGplCnByaWF6bml2w6kgcHJlIGxpbmXDoXJuZSBtb2RlbG92YW5pZS4gUHJlbWVubsOhIEhEUCBtw6EgcG8gbG9ndSB2ZcS+bWkgw7p6a3kKcm96c2FoLCB0YWvFvmUgdiBtb2RlbGkgYnVkZSBww7Rzb2JpxaUgbmFqbcOkIGFrbyBrb250cm9sYSDDunJvdm5lIHJvenZvamEsCmJleiB2w71yYXpueWNoIG9kxL5haGxvc3TDrS4KCiMgTGluZcOhcm5hIHJlZ3Jlc2lhCgpgYGB7cn0KIyAoMSkgTmHEjcOtdGFtIGRhdGEKdWRhamUgPC0gcmVhZC5jc3YoImRhdGFfcl9jb21tYV91dGY4LmNzdiIsIGhlYWRlciA9IFRSVUUsIGNoZWNrLm5hbWVzID0gRkFMU0UpCgojICgyKSBMaW5lw6FybmEgcmVncmVzaWE6IEVQSSB+IEJFViArIEJFVl9QSEVWICsgSERQCm1vZGVsIDwtIGxtKEVQSSB+IDEgKyBCRVYgKyBCRVZfUEhFViArIEhEUCwgZGF0YSA9IHVkYWplKQoKIyAoMykgU8O6aHJuIHbDvXNsZWRrb3YKc3VtbWFyeShtb2RlbCkKCiMgKDQpIERpYWdub3N0aWNrw6kgZ3JhZnkgCnBhcihtZnJvdyA9IGMoMiwgMikpCnBsb3QobW9kZWwpCnBhcihtZnJvdyA9IGMoMSwgMSkpCgpgYGAKCipSZXNpZHVhbHMgdnMgRml0dGVkIChyZXppZHXDoSB2cy4gcHJlZGlrb3ZhbsOpKToqIGJvZHkgc8O6IG9rb2xvIG51bHksIGFsZQprcml2a2EgamUgamVtbmUgemFrcml2ZW7DoS4g4oaSIE1vZGVsIG5pZSBqZSDDunBsbmUgcHJpYW1rYTsgbcO0xb5lIG11IGNow71iYcWlCm5lamFrw6EgcHJlbWVuYSBhbGVibyBqZWogbG9nL8WhdHZvcmVjLiBSb3pwdHlsIHNhIG1pZXJuZSBtZW7DrSBwcmkgdnnFocWhw61jaApob2Rub3TDoWNoLCDEjWnFvmUgbcO0xb5lIMOtc8WlIG8gc2xhYsO6IG5ldXN0w6FsdSB2YXJpYW5jaXUKKGhldGVyb3NrZWRhc3RpY2l0dSkuCgoqUeKAk1EgcGxvdCo6IHbDpMSNxaFpbmEgYm9kb3Ygc2Vkw60gbmEgcHJpYW1rZSwga29uY2Ugc2EgdsWhYWsgb2RjaHnEvnVqw7ouIOKGkgpSZXppZHXDoSBuaWUgc8O6IGRva29uYWxlIG5vcm3DoWxuZSDigJQgdiDigJ5jaHZvc3RvY2jigJwgamUgdmlhYyBleHRyw6ltb3YsIG5lxb4KYnkgaWRlw6FsbmUgYm9sby4gVG8gdsOkxI3FoWlub3UgbmV2YWTDrSBkcmFtYXRpY2t5LCBhbGUgamUgZG9icsOpIG8gdG9tCnZlZGllxaUuCgoqU2NhbGXigJNMb2NhdGlvbjoqIMSNaWFyYSBuaWUgamUgw7pwbG5lIHZvZG9yb3Zuw6EuIOKGkiBQb3R2cmR6dWplIHRvLCDFvmUKcm96cHR5bCBjaMO9YiBuaWUgamUgw7pwbG5lIHJvdm5ha8O9IHByZSB2xaFldGt5IHByZWRpa292YW7DqSBob2Rub3R5IChzbGFiw6EKaGV0ZXJvc2tlZGFzdGljaXRhKS4KCipSZXNpZHVhbHMgdnMgTGV2ZXJhZ2U6KiBqZSB0YW0gamVkZW4gYm9kIHMgdmXEvmvDvW0gdnBseXZvbSAob3puYcSNZW7DvSBuYXByLgo0MSkuIOKGkiBUZW50byB6w6F6bmFtIG3DtMW+ZSDFpWFoYcWlIHbDvXNsZWRreSBtb2RlbHUuIE9wbGF0w60gc2Egc2tvbnRyb2xvdmHFpSwKxI1pIGplIHRvIGNoeWJhIHYgZMOhdGFjaCBhbGVibyBsZWdpdMOtbW5lIGV4dHLDqW1ueSBwcsOtcGFkLgoKIyBRLVEgcGxvdAoKUeKAk1EgcGxvdCBwb3Jvdm7DoXZhIGt2YW50aWx5IMWhdGFuZGFyZGl6b3ZhbsO9Y2ggcmV6w61kdcOtIHMgdGVvcmV0aWNrw71taQpub3Jtw6FsbnltaSBrdmFudGlsbWkuIFbDpMSNxaFpbmEgYm9kb3YgbGXFvsOtIHByaSBwcmlhbWtlLCBubyBuYSBrb25jb2NoIHPDugptaWVybmUgb2RjaMO9bGt5LCDEjW8gbmF6bmHEjXVqZSDEvmFoa8O6IG9kY2jDvWxrdSBvZCBub3JtYWxpdHkgdiBjaHZvc3RvY2guClByZWRwb2tsYWQgbm9ybWFsaXR5IGplIHByaWJsacW+bmUgc3BsbmVuw707IHByZSBpc3RvdHUgdXbDoWR6YW0gYWoKcm9idXN0bsOpIHNtZXJvZGFqbsOpIGNoeWJ5LgoKYGBge3J9CiMgUeKAk1EgcGxvdCByZXrDrWR1w60gKHNhbW9zdGF0bmUpCgpxcW5vcm0ocnN0YW5kYXJkKG1vZGVsKSk7IHFxbGluZShyc3RhbmRhcmQobW9kZWwpKQoKCmBgYAoKYGBge3J9CnBsb3QobW9kZWwsIHdoaWNoID0gMikgICMgd2hpY2g9MiA9IFHigJNRIHBsb3QKCmBgYAoKKk5hIFHigJNRIGdyYWZlIHZpZG5vLCDFvmUgdsOkxI3FoWluYSBib29kb3YgbGXFvsOtIGJsw616a28gcHJpYW1reSosIHRha8W+ZSBtb2plCnJlemlkdcOhIHNhIHNwcsOhdmFqw7ogcHJpYmxpxb5uZSBub3Jtw6FsbmUgLk1lbsWhaWUgb2RjaMO9bGt5IHPDuiBuYSBvYm9jaAprb25jb2NoIGdyYWZ1IOKAkyB2xL5hdm8gZG9sZSBhIHZwcmF2byBob3JlIOKAkyDEjW8gem5hbWVuw6EsIMW+ZSB2IGNodm9zdG9jaAptw6FtIHDDoXIgZXh0csOpbW5lasWhw61jaCBob2Ruw7R0LgoKIyBTY2FyZS1Mb2NhdGlvbiBwbG90CgpCb2R5IHPDuiByb3ptaWVzdG5lbsOpIHBvbWVybmUgcm92bm9tZXJuZSBuYXByaWXEjSBvc291IFgsIGJleiB2w71yYXpuZWhvCmxpZXZpa2EuxIxlcnZlbsOhIExPRVNTIGtyaXZrYSBqZSBsZW4gamVtbmUgbmFrbG9uZW7DoSDigJMgdmFyaWFuY2lhIHJlesOtZHXDrQpzYSB0cm9jaHUgbWVuw60sIGFsZSBuaWUgZHJhbWF0aWNreS4KCkJlcmllbSB0byB0YWssIMW+ZSBwcmVkcG9rbGFkIGtvbsWhdGFudG5laiB2YXJpYWJpbGl0eSBqZSBwcmlibGnFvm5lCnNwbG5lbsO9OyBwcmUgaXN0b3R1IHbFoWFrIHV2w6FkemFtIGFqIHbDvXNsZWRreSBzIHJvYnVzdG7DvW1pIHNtZXJvZGFqbsO9bWkKY2h5YmFtaS4gTmlla2/EvmtvIGJvZG92IGplIG1pZXJuZSBuYWQgaG9kbm90b3UgMSw1IG5hIG9zaSBZLCBhbGUgbmVqZGUgbwpleHRyw6ltbmUgYW5vbcOhbGllLgoKYGBge3J9CgppZiAoIWV4aXN0cygibW9kZWwiKSkgewppZiAoIWV4aXN0cygidWRhamUiKSkgewp1ZGFqZSA8LSByZWFkLmNzdigiZGF0YV9yX2NvbW1hX3V0ZjguY3N2IiwgaGVhZGVyID0gVFJVRSwgY2hlY2submFtZXMgPSBGQUxTRSkKfQptb2RlbCA8LSBsbShFUEkgfiBsb2cxcChCRVYpICsgbG9nMXAoQkVWX1BIRVYpICsgSERQLCBkYXRhID0gdWRhamUpCn0KCiMgU2NhbGXigJNMb2NhdGlvbiBwbG90ICh3aGljaCA9IDMpCgpwbG90KG1vZGVsLCB3aGljaCA9IDMpCgpgYGAKCkdyYWYgUmVzaWR1YWxzIHZzIExldmVyYWdlIHVrYXp1amUsIGFrw70gdmXEvmvDvSB2cGx5diBtw7TFvnUgbWHFpSBqZWRub3RsaXbDqQpwb3pvcm92YW5pYSBuYSBwcmlhbWt1LiBWw6TEjcWhaW5hIGJvZG92IGplIHByaSBuw616a29tIGxldmVyYWdlIGEgbcOhIG1hbMOpCnJlemlkdcOhLCB0YWvFvmUgdsOkxI3FoWluYSB6w6F6bmFtb3YgbW9kZWwgbmXFpWFow6EuVmlkaWXFpSB2xaFhayAx4oCTMiBib2R5CmJsacW+xaFpZSBrIGJvZGtvdmFuw71tIGtyaXZrw6FtIENvb2tvdmVqIHZ6ZGlhbGVub3N0aSDigJMgdG8gc8O6IHBvdGVuY2nDoWxuZQp2cGx5dm7DqSBwb3pvcm92YW5pYS4gVGllIHNpIGtvbnRyb2x1amVtIHRlc3RhbWkgYSBwb3Jvdm7DoW0gdsO9c2xlZGt5Cm1vZGVsdSBzL2JleiBuaWNoLlrDoXZlcjogZMOhdGEgc8O6IHZvIHbFoWVvYmVjbm9zdGkgdiBwb3JpYWRrdTsga3bDtGxpIHTDvW10bwpib2RvbSB1dsOhZHphbSBhaiByb2J1c3Ruw6kgc21lcm9kYWpuw6kgY2h5YnkgYSByb2LDrW0gZG9wbG5rb3bDuiBrb250cm9sdQp2cGx5dm7DvWNoIGJvZG92CgpgYGB7cn0KIyBSZXNpZHVhbHMgdnMgTGV2ZXJhZ2UgKHMgQ29va292b3UgdnpkaWFsZW5vc8Wlb3UpCgpwbG90KG1vZGVsLCB3aGljaCA9IDUpCgpgYGAKCmBgYHtyfQpsaWJyYXJ5KGNhcikKbGlicmFyeShsbXRlc3QpOyBsaWJyYXJ5KHNhbmR3aWNoKQoKIyBLb21iaW7DoWNpYSBsZXZlcmFnZSDDlyByZXrDrWR1dW0gw5cgQ29va+KAmXMgRCAob3puYcSNw60gbmFqcG9kb3pyaXZlasWhaWUgYm9keSkKCmluZmx1ZW5jZVBsb3QobW9kZWwsIG1haW4gPSAiSW5mbHVlbmNlIHBsb3QiKQoKIyBOYWpzaWxuZWrFocOtIG91dGxpZXIgKEJvbmZlcnJvbmkgcC12YWx1ZSkKCm91dGxpZXJUZXN0KG1vZGVsKQoKIyBSb2J1c3Ruw6kgc21lcm9kYWpuw6kgY2h5YnkgcHJlIGlzdG90dQoKY29lZnRlc3QobW9kZWwsIHZjb3YgPSB2Y292SEMobW9kZWwsIHR5cGUgPSAiSEMxIikpCgpgYGAKClByaSBsb2ctxaFwZWNpZmlrw6FjaWkgdnljaMOhZHphIEhEUCBwb3ppdMOtdm5lIGEgxaF0YXRpc3RpY2t5IHbDvXpuYW1uZSwgxI1vCmplIHYgc8O6bGFkZSBzIG/EjWFrw6F2YW7DrW0gKHZ5xaHFoWlhIGVrb25vbWlja8OhIMO6cm92ZcWIIHPDunZpc8OtIHMgbGVwxaHDrW0gRVBJKS4KUHJlbWVubsOhIGxvZzFwKEJFVikgbmV2ecWhbGEgxaF0YXRpc3RpY2t5IHbDvXpuYW1uZSwgdGFrxb5lIGhsYXZuw7ogaHlwb3TDqXp1CnByZSBCRVYgbmV6YW1pZXRhbSBhbmkgbmVwb3R2cmR6dWplbSAoZWZla3Qgc2EgbmVwcmV1a8OhemFsKS4KCmBgYHtyfQojIE1vZGVsIEE6IEVQSSB+IGxvZyhCRVYpICsgSERQCm1fYmV2ICA8LSBsbShFUEkgfiBsb2cxcChCRVYpICsgSERQLCBkYXRhID0gdWRhamUpCnN1bW1hcnkobV9iZXYpOyBjb2VmdGVzdChtX2JldiwgdmNvdiA9IHZjb3ZIQyhtX2JldiwgdHlwZSA9ICJIQzEiKSkKCiMgTW9kZWwgQjogRVBJIH4gbG9nKEJFVl9QSEVWKSArIEhEUAptX3BoZXYgPC0gbG0oRVBJIH4gbG9nMXAoQkVWX1BIRVYpICsgSERQLCBkYXRhID0gdWRhamUpCnN1bW1hcnkobV9waGV2KTsgY29lZnRlc3QobV9waGV2LCB2Y292ID0gdmNvdkhDKG1fcGhldiwgdHlwZSA9ICJIQzEiKSkKCiMgcG9yb3ZuYW5pZSBrdmFsaXR5CkFJQyhtX2JldiwgbV9waGV2KQoKYGBgCgoqVnlzdmV0bGVuaWUga29udHJvbHk6KiBBYnkgc29tIHNhIHZ5aGxhIGtvbGluZWFyaXRlLCBvZGhhZGxhIHNvbQpzYW1vc3RhdG5lIG1vZGVsIHMgQkVWIGEgbW9kZWwgcyBCRVZfUEhFVi4gUG9yb3ZuYW5pZSBBSUMgdWvDoXphbG8sIMW+ZQpsZXDFoWllIHNlZMOtIG1vZGVsIHMgQkVWX1BIRVYuIFYgxYhvbSBqZSBIRFAgcG96aXTDrXZuZSBhIHbDvXpuYW1uw6ksIGvDvW0KQkVWX1BIRVYgdnljaMOhZHphIG5lZ2F0w612bmUgYSB2eXNva28gdsO9em5hbW5lLiBUbyBqZSB2IHJvenBvcmUgcwpww7R2b2Ruw71tIG/EjWFrw6F2YW7DrW0gcG96aXTDrXZuZWhvIGVmZWt0dSBlbGVrdHJvbW9iaWxpdHkgbmEgRVBJLCBhIHYKZGlza3VzaWkgdXbDoWR6YW0gbW/Fvm7DqSBkw7R2b2R5IChuYXByLiBuYcSNYXNvdmFuaWUg4oCTIHLDvWNobHkgbsOhcmFzdCBQSEVWCmJleiBva2Ftxb5pdMOpaG8gemxlcMWhZW5pYSBFUEksIHJlw6FsbmUgZW1pc2llIFBIRVYsIGluw6kgZW52aXJvbm1lbnTDoWxuZQpkb23DqW55IHYgRVBJKQoKIyBOYcSNYXNvdmFuaWU6IG9uZXNrb3JlbsO9IHZwbHl2IGVsZWt0cm9tb2JpbGl0eSAobGFnIG8gMSByb2spCgpgYGB7cn0KbGlicmFyeShkcGx5cikKCnVkYWplX2xhZyA8LSB1ZGFqZSAlPiUKYXJyYW5nZShLcmFqaW5hLCBSb2spICU+JQpncm91cF9ieShLcmFqaW5hKSAlPiUKbXV0YXRlKGxhZ19CRVZfUEhFViA9IGRwbHlyOjpsYWcoQkVWX1BIRVYsIDEpKSAlPiUKdW5ncm91cCgpCgptX2xhZyA8LSBsbShFUEkgfiBsb2cxcChsYWdfQkVWX1BIRVYpICsgSERQICsgZmFjdG9yKEtyYWppbmEpICsgZmFjdG9yKFJvayksIGRhdGEgPSB1ZGFqZV9sYWcpCmNvZWZ0ZXN0KG1fbGFnLCB2Y292ID0gdmNvdkNMKG1fbGFnLCBjbHVzdGVyID0gfiBLcmFqaW5hLCB0eXBlID0gIkhDMSIpKQoKYGBgCgojIMWgdGFuZGFyZGl6b3ZhbsOpIGtvZWZpY2llbnR5ID0gcG9yb3ZuYXRlxL5uw6Egc2lsYSBlZmVrdG92CgpVdmlkw61tZSwga3RvcsO9IHByZWRpa3RvciBtw6EgbmFqdsOkxI3FocOtIOKAnnrDoXNhaOKAnCBkbyBFUEkuCgpgYGB7cn0KbV9zdGQgPC0gbG0oc2NhbGUoRVBJKSB+IHNjYWxlKGxvZzFwKEJFVl9QSEVWKSkgKyBzY2FsZShIRFApLCBkYXRhID0gdWRhamUpCnN1bW1hcnkobV9zdGQpCmBgYAoqTmFqdsOkxI3FocOtIOKAnnrDoXNhaOKAnCBtw6EgdiB0b210byDFoXRhbmRhcmRpem92YW5vbSBtb2RlbGkgbG9nMXAoQkVWX1BIRVYpLiAqCgpQbyDFoXRhbmRhcmRpesOhY2lpIHZ5Y2jDoWR6YSwgxb5lIDEgU0QgbsOhcmFzdCBsb2coQkVWX1BIRVYpIHPDunZpc8OtIHMKcG9rbGVzb20gRVBJIG8gXH4wLjc5IFNEIChwIFw8IDAuMDAxKSwgemF0aWHEviDEjW8gMSBTRCBuw6FyYXN0IEhEUCBzw7p2aXPDrQpzIG7DoXJhc3RvbSBFUEkgbyBcfjAuNDQgU0QgKHAgPSAwLjAwMik7IG1vZGVsIHZ5c3ZldMS+dWplIFx+NDIgJQp2YXJpYWJpbGl0eSBFUEkKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgojIyAxKSBTbG92bsOpIHpocm51dGllIGRpYWdub3N0aWt5IGEgdsO9c2xlZGtvdgoKdDEgPC0gdGliYmxlKApgUeKAk1EgcGxvdGAgPSAiVsOkxI3FoWluYSBib2RvdiBwcmkgcHJpYW1rZTsgbWllcm5lIG9kY2jDvWxreSB2IGNodm9zdG9jaCDihpIgbm9ybWFsaXRhIHByaWJsacW+bmUgT0sgKHJlcG9ydHVqZW0gcm9idXN0bsOpIFNFKS4iLApgU2NhbGUtTG9jYXRpb25gID0gIkxPRVNTIGplbW5lIG5ha2xvbmVuw70g4oaSIHNsYWLDoSBoZXRlcm9za2VkYXN0aWNpdGEgKHJpZcWhZW7DoSByb2J1c3Ruw71taSBTRSkuIiwKYFJlc2lkdWFscyB2cyBMZXZlcmFnZWAgPSAiVnBseXZuw6kgYm9keSAoMjAsIDMxLCAzNSwgNDgpOyBCb25mZXJyb25pIG5lb3puYcSNaWwgZXh0csOpbW55IG91dGxpZXIuIiwKYFbDvXNsZWRreSByZWdyZXNpZWAgPSAiTGVwxaHDrSBqZSBtb2RlbCBzIGxvZzFwKEJFVl9QSEVWKStIRFAgKEFJQyDiiYggMzQzIDwgMzQ2KS4gSERQOiBwb3ppdMOtdm55IGEgdsO9em5hbW7DvTsgbG9nMXAoQkVWX1BIRVYpOiBuZWdhdMOtdm55IGEgdnlzb2tvIHbDvXpuYW1uw707IEJFViBuZXbDvXpuYW1uw6kuIgopCgplbWVyYWxkX2xpZ2h0IDwtICIjRUNGREY1IiAgIyBwb3phZGllIGJ1bmllawplbWVyYWxkX2hlYWQgIDwtICIjRDFGQUU1IiAgIyBobGF2acSNa2EKZW1lcmFsZF90ZXh0ICA8LSAiIzA2NUY0NiIgICMgdG1hdm96ZWxlbsO9IHRleHQKCmtibCh0MSwgY2FwdGlvbiA9ICJEaWFnbm9zdGlrYSBhIHbDvXNsZWRreSDigJMgc3RydcSNbsOpIHpocm51dGllIiwgYm9va3RhYnMgPSBUUlVFKSAlPiUKa2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gVFJVRSwgaHRtbF9mb250ID0gIkhlbHZldGljYSIpICU+JQpyb3dfc3BlYygwLCBiYWNrZ3JvdW5kID0gZW1lcmFsZF9oZWFkLCBjb2xvciA9IGVtZXJhbGRfdGV4dCwgYm9sZCA9IFRSVUUpICU+JQpjb2x1bW5fc3BlYygxOjQsIGJhY2tncm91bmQgPSBlbWVyYWxkX2xpZ2h0LCBjb2xvciA9IGVtZXJhbGRfdGV4dCwgYm9yZGVyX2xlZnQgPSBUUlVFLCBib3JkZXJfcmlnaHQgPSBUUlVFKQoKIyMgMikgUm96aG9kbnV0aWEgbyBoeXBvdMOpemFjaAoKdDIgPC0gdGliYmxlOjp0cmliYmxlKAp+UHJlbWVubsOhLCAgIH4iSDEgKG/EjWFrw6F2YW5pZSkiLCAgICAgICAgICAgICB+IlJvemhvZG51dGllIG8gSDAiLCAgICAgICAgICAgICB+IlJvemhvZG51dGllIG8gSDEiLCAgICAgICAgICAgICAgflBvem7DoW1rYSwKIkJFViIsICAgICAgICLOsl9CRSBWID4gMCAocG96aXTDrXZueSkiLCAgICAgICAiTkVaQU1JRVRBTSAobmV2w716bmFtbsOpKSIsICAgICAgIk5FUE9EUE9SVUpFTSIsICAgICAgICAgICAgICAgICAgICJWIG1vZGVsaSBFUEkgfiBsb2cxcChCRVYpK0hEUCBqZSBCRVYgbmV2w716bmFtbsOpLiIsCiJCRVZfUEhFViIsICAizrJfUEhFViA+IDAgKHBveml0w612bnkpIiwgICAgICAgIlpBTUlFVEFNICh2w716bmFtbsOpKSIsICAgICAgICAgICJaQU1JRVRBTSAoZWZla3QgamUgesOhcG9ybsO9KSIsICAgICJsb2cxcChCRVZfUEhFVikgdsO9em5hbW5lIG5lZ2F0w612bmU7IG1vZGVsIHMgUEhFViBtw6EgbmnFvsWhw60gQUlDLiIKKQoKa2JsKHQyLCBjYXB0aW9uID0gIkh5cG90w6l6eSBhIHJvemhvZG51dGlhIChyb2J1c3Ruw6kgU0UsIGxvZy3FoXBlY2lmaWvDoWNpZSkiLCBib29rdGFicyA9IFRSVUUpICU+JQprYWJsZV9jbGFzc2ljKGZ1bGxfd2lkdGggPSBGQUxTRSwgaHRtbF9mb250ID0gIkhlbHZldGljYSIpICU+JQpyb3dfc3BlYygwLCBiYWNrZ3JvdW5kID0gZW1lcmFsZF9oZWFkLCBjb2xvciA9IGVtZXJhbGRfdGV4dCwgYm9sZCA9IFRSVUUpICU+JQpjb2x1bW5fc3BlYygxOm5jb2wodDIpLCBiYWNrZ3JvdW5kID0gZW1lcmFsZF9saWdodCwgY29sb3IgPSBlbWVyYWxkX3RleHQpCgpgYGAKCiMgWsOhdmVyClbDvXNsZWRreSBuYXpuYcSNdWrDuiwgxb5lIEhEUCBtw6EgbmEgRVBJIHBveml0w612bnkgYSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSB2cGx5di4gViBtb2RlbGkgcyBCRVYgKHBvIGxvZy10cmFuc2Zvcm3DoWNpaSkgamVobyBlZmVrdCBuaWUgamUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70g4oCTIG51bG92w7ogaHlwb3TDqXp1IG8gbnVsb3ZvbSBlZmVrdGUgbmV2aWVtZSB6YW1pZXRudcWlLiBWIGFsdGVybmF0w612bm9tIG1vZGVsaSBzIEJFVl9QSEVWIHZ5Y2jDoWR6YSBrb2VmaWNpZW50IHbDvXpuYW1uZSBuZWdhdMOtdm55LiBQb3Jvdm5hbmllIEFJQyB1a2F6dWplLCDFvmUgbW9kZWwgcyBCRVZfUEhFViBhIEhEUCBsZXDFoWllIHNlZMOtIGTDoXRhbSBha28gdmVyemlhIHMgQkVWLgoKxaB0YW5kYXJkaXpvdmFuw6kga29lZmljaWVudHkgbmF6bmHEjXVqw7osIMW+ZSAxIFNEIG7DoXJhc3QgbG9nKEJFVl9QSEVWKSBzw7p2aXPDrSBzIOKJiCAwLDc5IFNEIHBva2xlc29tIEVQSSwgemF0aWHEviDEjW8gMSBTRCBuw6FyYXN0IEhEUCBzw7p2aXPDrSBzIOKJiCAwLDQ0IFNEIG7DoXJhc3RvbSBFUEkuIE1vZGVsIHZ5c3ZldMS+dWplIHByaWJsacW+bmUgNDDigJM0MiAlIHZhcmlhYmlsaXR5IEVQSS4KCkRpYWdub3N0aWthIHJlesOtZHXDrSBwb3VrYXp1amUgbmEgbWllcm5lIG9kY2jDvWxreSB2IGNodm9zdG9jaCBhIHNsYWLDuiBoZXRlcm9za2VkYXN0aWNpdHU7IHByZXRvIHV2w6FkemFtIHJvYnVzdG7DqSDFoXRhbmRhcmRuw6kgY2h5YnkuIFppc3RlbsOpIHZwbHl2bsOpIHBvem9yb3ZhbmlhIG5lbWVuaWEga3ZhbGl0YXTDrXZuZSB6w6F2ZXJ5LgoKQ2Vsa292byB2w71zbGVka3kgcG9kcG9ydWrDuiB2w716bmFtIGVrb25vbWlja2VqIMO6cm92bmUga3JhamlueSBwcmUgZW52aXJvbm1lbnTDoWxudSB2w71rb25ub3PFpS4gUHJpYW15IHBveml0w612bnkgdnBseXYgZWxla3Ryb21vYmlsaXR5IG5hIEVQSSBzYSB2IHRvbXRvIHPDumJvcmUgZMOhdCBuZXByZXVrw6F6YWwg4oCTIHByaSBCRVYgZWZla3QgbmV2aWVtZSBwcmV1a8OhemHFpSBhIHByaSBCRVZfUEhFViB2eWNow6FkemEgbmVnYXTDrXZuYSBhc29jacOhY2lhLiBUZW50byBuZXPDumxhZCBzIHDDtHZvZG7DvW0gb8SNYWvDoXZhbsOtbSBtw7TFvmUgc8O6dmlzaWXFpSBzIG5hxI1hc292YW7DrW0gKGVmZWt0eSBzYSBwcmVqYXZpYSBuZXNrw7RyKSwgcyByZcOhbG55bWkgZW1pc2lhbWkgUEhFViBhbGVibyBzIHTDvW0sIMW+ZSBFUEkgemFjaHl0w6F2YSBhaiBvYmxhc3RpIG1pbW8gZG9wcmF2eS4KCg==