Úvod a popis databázy

V tejto časti sa testujú štatistické hypotézy pomocou údajov z databázy, ktorá obsahuje ekonomické ukazovatele krajín v rokoch 1991 – 2022. Použité premenné zahŕňajú hrubý domáci produkt (HDP) v USD, mieru nezamestnanosti (%) a štruktúru zamestnanosti v troch sektoroch – poľnohospodárstve, priemysle a službách.

install.packages("zoo")
install.packages("tseries")
install.packages("lmtest")
install.packages("sandwich")
install.packages("car")
library(zoo)
library(tseries) 
library(lmtest)
library(sandwich)
library(car)
rm(list=ls())
install.packages("knitr")
install.packages("dplyr")
install.packages("ggplot2")
# Import vlastného CSV súboru

udaje <- read.csv("Employment_Unemployment_GDP_data.csv",
header = TRUE,
sep = ",",
dec = " ",
stringsAsFactors = FALSE)

# Zobrazenie prvých riadkov a názvov stĺpcov

head(udaje)
colnames(udaje)
[1] "Country.Name"                   "Year"                          
[3] "Employment.Sector..Agriculture" "Employment.Sector..Industry"   
[5] "Employment.Sector..Services"    "Unemployment.Rate"             
[7] "GDP..in.USD."                  

Úvod do problému, stanovenie hypotéz

Rozhodla som sa modelovať mieru nezamestnanosti (Unemployment.Rate) v závislosti od troch vysvetľujúcich premenných, a to podielu zamestnanosti v poľnohospodárstve (Employment.Sector..Agriculture), podielu zamestnanosti v priemysle (Employment.Sector..Industry) a hrubého domáceho produktu na obyvateľa (GDP..in.USD.).

Naša pracovná hypotéza hovorí o štatisticky významnom vplyve všetkých troch vysvetľujúcich premenných, pričom:

  • u premennej Industry predpokladáme negatívny vplyv, to znamená čím väčší podiel pracujúcich v priemysle, tým nižšia nezamestnanosť,
  • u premennej GDP očakávame negatívny vplyv, vyšší HDP na obyvateľa je spojený s lepšou ekonomickou výkonnosťou a teda nižšou nezamestnanosťou,
  • u premennej Agriculture predpokladáme pozitívny alebo nejednoznačný vplyv, vo vyspelých ekonomikách nižší podiel poľnohospodárstva súvisí s nižšou nezamestnanosťou, zatiaľ čo vo vyvíjajúcich sa krajinách môže byť efekt opačný.

Príprava databázy, čistenie a úprava údajov

Budeme pracovať s vlastným súborom Employment_Unemployment_GDP_data.csv. Keďže niektoré hodnoty môžu chýbať alebo byť v inom formáte, najprv ich očistíme (pretypujeme číselné stĺpce) a chýbajúce hodnoty doplníme mediánom danej premennej. Preferenčne použijeme rok 2015; ak v dátach 2015 nie je, automaticky zoberieme posledný dostupný rok. Na ďalšie kroky si ponecháme kľúčové premenné: Unemployment.Rate, Employment.Sector..Agriculture, Employment.Sector..Industry, Employment.Sector..Services a GDP..in.USD..

# Robustná príprava: automatické namapovanie názvov stĺpcov + imputácia mediánom

# 0) Načítanie (ponechaj check.names = FALSE, aby sa nemenili mená)
udaje <- read.csv(
  "Employment_Unemployment_GDP_data.csv",
  header = TRUE, sep = ",", dec = ".",
  stringsAsFactors = FALSE, check.names = FALSE
)

# 1) Pomocné funkcie
find_col <- function(candidates, cols) {
  # skúsi presnú zhodu (case-insensitive), potom 'obsahuje'
  lc <- tolower(cols)
  # presná zhoda
  for (p in candidates) {
    idx <- which(lc == tolower(p))
    if (length(idx) == 1) return(cols[idx])
  }
  # obsahuje (regex/substring, case-insensitive)
  for (p in candidates) {
    idx <- grep(tolower(p), lc, fixed = TRUE)
    if (length(idx) >= 1) return(cols[idx][1])
  }
  return(NA_character_)
}

num_clean <- function(x) {
  if (is.numeric(x)) return(x)
  x <- gsub("\\s", "", x)   # odstráni medzery
  x <- gsub(",", "", x)     # odstráni tisícové oddeľ.
  suppressWarnings(as.numeric(x))
}

# 2) Nájdeme požadované stĺpce (tolerantne na názvy)
cols <- colnames(udaje)

col_year <- find_col(c("Year","Rok"), cols)
col_unemp <- find_col(c("Unemployment.Rate","Unemployment", "Unemployment Rate"), cols)
col_agri <- find_col(c("Employment.Sector..Agriculture","Agriculture","Employment Agriculture"), cols)
col_ind  <- find_col(c("Employment.Sector..Industry","Industry","Employment Industry"), cols)
col_serv <- find_col(c("Employment.Sector..Services","Services","Employment Services"), cols)
col_gdp  <- find_col(c("GDP..in.USD.","GDP..in.USD","GDP per capita","GDP","gdp"), cols)

mapping <- c(
  Year = col_year,
  Unemployment.Rate = col_unemp,
  Agriculture = col_agri,
  Industry = col_ind,
  Services = col_serv,
  GDP_in_USD = col_gdp
)
cat("Mapovanie stĺpcov:\n")
Mapovanie stĺpcov:
print(mapping)
                            Year                Unemployment.Rate 
                          "Year"              "Unemployment Rate" 
                     Agriculture                         Industry 
"Employment Sector: Agriculture"    "Employment Sector: Industry" 
                        Services                       GDP_in_USD 
   "Employment Sector: Services"                   "GDP (in USD)" 
# 3) Ošetri, ak sa niečo nenašlo
if (any(is.na(mapping))) {
  stop("Niektoré stĺpce sa nenašli. Skontroluj mapovanie vyššie a prípadne uprav kandidátov.")
}

# 4) Pretypuj na numerické (kde treba)
for (cn in unique(c(col_year,col_unemp,col_agri,col_ind,col_serv,col_gdp))) {
  if (cn %in% c(col_year,col_unemp,col_agri,col_ind,col_serv,col_gdp)) {
    udaje[[cn]] <- num_clean(udaje[[cn]])
  }
}

# 5) Vyber rok: 2015, inak posledný dostupný
target_year <- if (any(udaje[[col_year]] == 2015, na.rm = TRUE)) 2015 else max(udaje[[col_year]], na.rm = TRUE)
cat("Použitý rok:", target_year, "\n")
Použitý rok: 2015 
# 6) Vyber kľúčové premenné pre daný rok
udaje.y <- udaje[udaje[[col_year]] == target_year, c(col_unemp,col_agri,col_ind,col_serv,col_gdp)]
names(udaje.y) <- c("Unemployment.Rate","Agriculture","Industry","Services","GDP_USD")

# 7) Imputácia mediánom
column_medians <- sapply(udaje.y, median, na.rm = TRUE)
for (col in names(udaje.y)) {
  idx <- is.na(udaje.y[[col]])
  if (any(idx)) udaje.y[[col]][idx] <- column_medians[col]
}

# 8) Hotovo – dataset pripravený na modelovanie
str(udaje.y)
'data.frame':   181 obs. of  5 variables:
 $ Unemployment.Rate: num  9.05 17.19 11.21 16.49 7.58 ...
 $ Agriculture      : num  44.59 41.28 8.83 56.85 7.84 ...
 $ Industry         : num  20.7 18.7 31.2 7.8 22.3 ...
 $ Services         : num  34.7 40 59.9 35.4 69.8 ...
 $ GDP_USD          : num  1.91e+10 1.15e+10 1.87e+11 9.05e+10 5.95e+11 ...
summary(udaje.y)
 Unemployment.Rate  Agriculture         Industry         Services    
 Min.   : 0.170    Min.   : 0.2338   Min.   : 3.465   Min.   :10.22  
 1st Qu.: 3.678    1st Qu.: 5.3210   1st Qu.:14.514   1st Qu.:42.40  
 Median : 6.313    Median :18.1105   Median :19.555   Median :58.51  
 Mean   : 8.127    Mean   :25.0850   Mean   :19.612   Mean   :55.30  
 3rd Qu.:10.842    3rd Qu.:40.3543   3rd Qu.:24.458   3rd Qu.:69.15  
 Max.   :27.695    Max.   :86.3175   Max.   :54.141   Max.   :93.17  
    GDP_USD         
 Min.   :2.600e+08  
 1st Qu.:1.139e+10  
 Median :4.130e+10  
 Mean   :4.128e+11  
 3rd Qu.:1.951e+11  
 Max.   :1.830e+13  

Vizualizácia dát – kontrola nezrovnalostí

V tejto časti sa pozrieme na rozloženie jednotlivých premenných pomocou boxplotov.
Cieľom je zistiť, či sa v dátach nenachádzajú nezrovnalosti, extrémne hodnoty alebo nulové pozorovania.
Použijeme štyri hlavné premenné: mieru nezamestnanosti, podiel poľnohospodárstva, podiel priemyslu a HDP na obyvateľa.

# Boxploty premenných – kontrola rozloženia a odľahlých hodnôt

# Zvolíme len relevantné premenné
vars_to_plot <- c("Unemployment.Rate","Agriculture","Industry","GDP_USD")

# Nastavenie grafického layoutu: 2 × 2
par(mfrow = c(2, 2))
par(mar = c(4, 4, 2, 1))

# Pre každý vybraný stĺpec nakreslíme boxplot
for (col in vars_to_plot) {
  boxplot(
    udaje.y[[col]],
    main = col,
    xlab = "Hodnota",
    col = "lightblue",
    border = "darkblue"
  )
}

# Nadpis pre celú sadu grafov
mtext("Boxploty jednotlivých premenných (rok vybraný pre analýzu)",
      outer = TRUE, cex = 1.2, font = 2)

# Reset layoutu na 1 graf
par(mfrow = c(1, 1))

Na základe boxplotov môžeme pozorovať nasledovné skutočnosti:

  • Unemployment.Rate – väčšina pozorovaní sa sústreďuje v stredných hodnotách, avšak v niektorých krajinách sa vyskytujú aj extrémne vyššie miery nezamestnanosti. To naznačuje, že medzi krajinami existujú výrazné rozdiely v trhu práce.
  • Agriculture – hodnoty sa pohybujú v širokom intervale. Krajiny s vyšším podielom poľnohospodárstva môžu mať nižšiu úroveň industrializácie, čo sa často spája s vyššou nezamestnanosťou.
  • Industry – väčšina krajín má stredné až vyššie hodnoty, pričom extrémne hodnoty sú menej časté. Vyšší podiel priemyslu naznačuje rozvinutejšiu ekonomiku.
  • GDP_USD – rozloženie ukazuje výrazné rozdiely v ekonomickej úrovni medzi krajinami. Niektoré hodnoty GDP sú veľmi vysoké – ide o bohatšie krajiny s vyspelou ekonomikou, zatiaľ čo iné majú nižší HDP, čo poukazuje na ekonomickú nerovnováhu.

Celkovo boxploty naznačujú, že údaje obsahujú niekoľko odľahlých hodnôt (najmä v premenných Unemployment.Rate a GDP_USD), čo je však pri medzinárodných dátach prirodzené. Väčšina hodnôt sa nachádza v realistickom rozsahu a nepozorujeme žiadne zjavné nezrovnalosti ako systematické nulové hodnoty.
Tieto výsledky potvrdzujú, že údaje sú vhodné na ďalšie modelovanie.

Lineárna regresia

Model odhadujeme príkazom lm().

V našom prípade modelujeme mieru nezamestnanosti (Unemployment.Rate) v závislosti od troch vysvetľujúcich premenných: - podielu zamestnanosti v poľnohospodárstve (Agriculture),
- podielu zamestnanosti v priemysle (Industry),
- a logaritmu hrubého domáceho produktu na obyvateľa (log(GDP_USD)).

Cieľom je zistiť, ktoré z týchto faktorov štatisticky významne ovplyvňujú mieru nezamestnanosti.

# Pridáme logaritmickú transformáciu HDP
udaje.y$logGDP <- ifelse(udaje.y$GDP_USD > 0, log(udaje.y$GDP_USD), NA_real_)

# Základný lineárny model
model <- lm(Unemployment.Rate ~ Agriculture + Industry + logGDP, data = udaje.y)

# Súhrn výsledkov
summary(model)

Diagnostické grafy regresného modelu

Súhrn odhadovaného modelu nám poskytuje súbor odhadnutých regresných koeficientov, ktorých znamienka budú rozoberané neskôr.
Ak hovoríme o vlastnostiach modelu ako celku, pozrime sa najskôr na nasledujúce diagnostické grafy.
Pomocou nich vieme overiť, či sú splnené základné predpoklady lineárnej regresie – predovšetkým normalita rezíduí, homoskedasticita a absencia odľahlých hodnôt.

# Diagnostické grafy regresného modelu
par(mfrow = c(2, 2))   # rozloženie 2 x 2
plot(model)            # štyri základné grafy: residuals vs fitted, Q-Q, scale-location, residuals vs leverage
par(mfrow = c(1, 1))   # reset na 1 graf

Interpretácia diagnostických grafov

1. Residuals vs Fitted (Rezíduá oproti vyrovnaným hodnotám)
Rezíduá sa rozkladajú približne symetricky okolo nulovej osi, čo je priaznivé.
Červená LOESS čiara je relatívne rovná, iba mierne zakrivená smerom hore na konci, čo naznačuje slabý náznak nelinearity, ale nie závažný problém.
Rozptyl bodov zostáva približne rovnaký pre všetky hodnoty fitted – teda nepozorujeme výraznú heteroskedasticitu.

2. Q–Q (rozptyl) plot rezíduí
Body sa vo väčšine rozsahu držia blízko 45° priamky, no na koncoch sa od nej mierne odchyľujú.
To znamená, že rozloženie rezíduí sa len mierne odlišuje od normálneho rozdelenia, pričom odchýlky sú spôsobené pravdepodobne niekoľkými extrémnymi pozorovaniami.
Celkovo však predpoklad normality nie je vážne porušený.

3. Scale–Location plot
Červená hladká čiara je takmer vodorovná a rozptyl bodov po osi X je približne konštantný.
To potvrdzuje, že rezíduá majú približne rovnakú varianciu naprieč celým rozsahom hodnôt (predpoklad homoskedasticity je splnený).

4. Residuals vs Leverage (vplyvné pozorovania)
Väčšina pozorovaní má nízky pákový efekt (leverage < 0.05), čo znamená, že jednotlivé krajiny nemajú nadmerný vplyv na odhadnuté koeficienty.
Niekoľko bodov (napr. s označením 4438, 4363, 4449) sa nachádza bližšie k okraju Cookovej vzdialenosti, čo naznačuje, že ide o mierne vplyvné pozorovania, ale žiadne z nich nepresahuje hranicu 0.5 či 1.0, teda žiadne extrémne odľahlé hodnoty sa neobjavili.

# Testy normality a odľahlých hodnôt
residuals <- residuals(model)
jb_test <- jarque.bera.test(residuals)
jb_test  # Jarque–Bera test normality

    Jarque Bera Test

data:  residuals
X-squared = 42.52, df = 2, p-value = 5.847e-10
# Outlier test (Bonferroni correction)
outlier_test <- car::outlierTest(model)
outlier_test
No Studentized residuals with Bonferroni p < 0.05
Largest |rstudent|:

Výsledky testu odľahlých hodnôt

Výstup funkcie outlierTest(model) identifikoval pozorovanie s indexom 4337,
ktoré má najvyššiu študentizovanú hodnotu rezídua rstudent = 3.27.
Jeho neopravená p-hodnota je 0.00127, avšak po aplikácii Bonferroniho korekcie
je výsledná hodnota 0.23064, teda nie štatisticky významná na 5 % hladine.

To znamená, že hoci toto pozorovanie má pomerne vysoké rezíduum,
nie je natoľko extrémne, aby sme ho považovali za štatisticky významný odľahlý bod.
V kontexte ekonomických dát ide pravdepodobne o krajinu s netypickou kombináciou
vysokého HDP a špecifickej štruktúry zamestnanosti, no jej vplyv na celkový model
nie je dostatočne silný, aby skreslil odhady koeficientov.

Záverom možno konštatovať, že model neobsahuje žiadne významné odľahlé pozorovania,
ktoré by ovplyvňovali výsledky regresie.

Alternatívny model

Ak sa vyskytujú mierne odľahlé hodnoty alebo nenormalita v GDP, môžeme upraviť model tak,
že použijeme logaritmus HDP a zmeníme štruktúru sektorov.
Nový model bude mať tvar:

\[ Unemployment.Rate_i = \beta_0 + \beta_1 \, Industry_i + \beta_2 \, Services_i + \beta_3 \, \log(GDP_i) + \varepsilon_i \]

# Alternatívny model s log(GDP) a Services namiesto Agriculture
model2 <- lm(Unemployment.Rate ~ Industry + Services + log(GDP_USD), data = udaje.y)
summary(model2)
# Diagnostické grafy alternatívneho modelu
par(mfrow = c(2, 2))
plot(model2)
par(mfrow = c(1, 1))
# Normality a outlier test pre nový model
residuals2 <- residuals(model2)
jarque.bera.test(residuals2)
car::outlierTest(model2)

Záver

Nový model po logaritmickej transformácii HDP potvrdzuje, že:

  • premenné priemysel (Industry) a HDP (GDP) majú negatívny vplyv na mieru nezamestnanosti – teda čím je podiel priemyslu a úroveň HDP vyššia, tým je nezamestnanosť nižšia,
  • premenná služby (Services)slabší alebo štatisticky nevýznamný vplyv,
  • rezíduá majú po transformácii lepšie rozdelenie a model nevykazuje závažné porušenia predpokladov lineárnej regresie.

Na základe týchto výsledkov môžeme konštatovať, že upravený model je štatisticky spoľahlivý, stabilný a dobre interpretovateľný.
Potvrdzuje predpoklad, že vyššia ekonomická úroveň a rozvinutejší priemyselný sektor prispievajú k nižšej miere nezamestnanosti.

Heteroskedasticita

Prítomnosť heteroskedasticity (nekonštantného rozptylu náhodnej zložky) spôsobuje nepresné odhady smerodajných chýb a tým aj nespoľahlivé t-testy významnosti jednotlivých regresných koeficientov.
Preto je dôležité, aby sme heteroskedasticitu najprv detegovali (pomocou grafov alebo testov) a v prípade jej výskytu sa ju pokúsili odstrániť.

V našom prípade sa pokúsime vizuálne vyhodnotiť, či variabilita rezíduí (štvorcov rezíduí) závisí od niektorej z vysvetľujúcich premenných – konkrétne od HDP na obyvateľa (GDP_USD) a od podielu zamestnanosti v poľnohospodárstve (Agriculture).
Budeme porovnávať dva modely:

  • model – pôvodný lineárny model s premennou GDP_USD
  • model2 – model so zlogaritmovaným HDP (log(GDP_USD)), ktorý môže odstrániť vplyv odľahlých hodnôt a stabilizovať varianciu

library(ggplot2)
library(patchwork)

# Štvorce rezíduí z pôvodného modelu
p1 <- ggplot(udaje.y, aes(x = GDP_USD, y = resid(model)^2)) +
  geom_point(alpha = 0.8, color = "darkred") +
  geom_smooth(method = "loess", se = FALSE, color = "pink", linewidth = 1.5) +
  labs(x = "HDP na obyvateľa (GDP_USD)", 
       y = "Štvorce rezíduí",
       title = "Squared Residuals vs GDP_USD (model)") +
  theme_minimal()

# Druhý graf: poľnohospodárstvo
p2 <- ggplot(udaje.y, aes(x = Agriculture, y = resid(model)^2)) +
  geom_point(alpha = 0.8, color = "darkblue") +
  geom_smooth(method = "loess", se = FALSE, color = "skyblue", linewidth = 1.5) +
  labs(x = "Podiel zamestnanosti v poľnohospodárstve (%)", 
       y = "Štvorce rezíduí",
       title = "Squared Residuals vs Agriculture (model)") +
  theme_minimal()

# Zobrazenie vedľa seba
p1 + p2

Interpretácia výsledkov

V grafe „Štvorce rezíduí vs GDP_USD“ možno vidieť, že pri nižších hodnotách HDP je rozptyl rezíduí väčší a s rastúcim HDP sa znižuje.
To naznačuje, že v ekonomicky slabších krajinách je nezamestnanosť menej stabilná, zatiaľ čo vo vyspelých ekonomikách sú odchýlky od modelu menšie.
Rozptyl teda nie je úplne konštantný, čo poukazuje na miernu heteroskedasticitu vo vzťahu k HDP.

V druhom grafe „Štvorce rezíduí vs Agriculture“ sa body rozkladajú pomerne rovnomerne bez viditeľného trendu.
To znamená, že podiel zamestnanosti v poľnohospodárstve pravdepodobne nespôsobuje heteroskedasticitu a jeho vplyv na rozptyl chýb je minimálny.

Celkovo možno povedať, že rozptyl rezíduí sa mení predovšetkým s HDP, nie s ostatnými premennými.
V ďalšom kroku preto použijeme logaritmickú transformáciu HDP, ktorá by mala túto nerovnomernosť zmierniť a model spresniť.

model2 <- lm(Unemployment.Rate ~ Agriculture + Industry + Services + log(GDP_USD), data = udaje.y)
# Model s logaritmom HDP
model2 <- lm(Unemployment.Rate ~ Agriculture + Industry + Services + log(GDP_USD), data = udaje.y)

# Skúmanie heteroskedasticity – vizuálne pre model2
library(ggplot2)
library(patchwork)

# Štvorce rezíduí vs log(GDP)
p1 <- ggplot(udaje.y, aes(x = log(GDP_USD), y = resid(model2)^2)) +
  geom_point(alpha = 0.6, color = "darkgreen") +
  geom_smooth(method = "loess", se = FALSE, color = "green", linewidth = 1) +
  labs(x = "log(HDP na obyvateľa)", 
       y = "Štvorce rezíduí",
       title = "Squared Residuals vs log(GDP_USD) (model2)") +
  theme_minimal()

# Štvorce rezíduí vs poľnohospodárstvo
p2 <- ggplot(udaje.y, aes(x = Agriculture, y = resid(model2)^2)) +
  geom_point(alpha = 0.6, color = "purple4") +
  geom_smooth(method = "loess", se = FALSE, color = "orchid", linewidth = 1) +
  labs(x = "Agriculture", 
       y = "Štvorce rezíduí",
       title = "Squared Residuals vs Agriculture (model2)") +
  theme_minimal()

# Zobrazenie grafov vedľa seba
p1 + p2

Interpretácia výsledkov po logaritmickej transformácii HDP

Po aplikovaní logaritmickej transformácie HDP vidíme, že rozptyl rezíduí sa výrazne stabilizoval.
V grafe „Štvorce rezíduí vs log(GDP_USD)” je LOESS krivka (zelená línia) takmer vodorovná a body sú rozložené rovnomerne naprieč hodnotami HDP.
To znamená, že logaritmická transformácia odstránila väčšinu heteroskedasticity, ktorá bola prítomná v pôvodnom modeli.

V grafe „Štvorce rezíduí vs Agriculture” ostáva rozptyl bodov pomerne rovnomerný a bez jasného trendu.
To potvrdzuje, že podiel zamestnanosti v poľnohospodárstve nemá zásadný vplyv na variabilitu chýb.

Celkovo môžeme uzavrieť, že po logaritmickej úprave HDP sa model správa stabilnejšie a lepšie spĺňa predpoklad konštantného rozptylu (homoskedasticity).
Takto upravený model je preto spoľahlivejší a vhodnejší na ekonomickú interpretáciu.

Testovanie prítomnosti heteroskedasticity

# Install (if not yet installed)
# install.packages("lmtest")

# Load the package
library(lmtest)

# Run the Breusch–Pagan test
bptest(model)

    studentized Breusch-Pagan test

data:  model
BP = 7.167, df = 3, p-value = 0.06676
# Install (if not yet installed)
# install.packages("lmtest")

# Load the package
library(lmtest)

# Run the Breusch–Pagan test
bptest(model2)

    studentized Breusch-Pagan test

data:  model2
BP = 8.1376, df = 4, p-value = 0.08667

Interpretácia výsledkov testu heteroskedasticity

Podľa výsledkov Breusch–Pagan testu:

  • pre pôvodný model (model) platí:
    BP = 7.167, df = 3, p-value = 0.06676

  • pre model so zlogaritmovaným HDP (model2) platí:
    BP = 8.1376, df = 4, p-value = 0.08667

V oboch prípadoch je hodnota p-value väčšia ako 0.05, takže nezamietame nulovú hypotézu.
To znamená, že v modeloch nie je prítomná významná heteroskedasticita – teda rozptyl chýb je približne rovnaký.

Hodnota p-value v pôvodnom modeli (model) je však trochu nižšia (asi 0.07), čo môže naznačovať mierny náznak nerovnakého rozptylu.
V modeli s logaritmom HDP (model2) sa tento problém ešte viac zmiernil, takže môžeme povedať,
že logaritmická úprava HDP pomohla zlepšiť vlastnosti modelu.

Celkovo teda model2 spĺňa predpoklady lineárnej regresie lepšie a je spoľahlivejší na interpretáciu.

#install.packages("sandwich")
#install.packages("lmtest")
library(sandwich)
library(lmtest)
coeftest(model, vcov = vcovHC(model))

t test of coefficients:

             Estimate Std. Error t value  Pr(>|t|)    
(Intercept) 30.084154   5.730333  5.2500 4.323e-07 ***
Agriculture -0.095462   0.026310 -3.6284 0.0003730 ***
Industry    -0.011641   0.095880 -0.1214 0.9034993    
logGDP      -0.789032   0.227598 -3.4668 0.0006611 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Interpretácia výsledkov po White korekcii

Po aplikovaní tzv. White korekcie (robustné smerodajné chyby) sa smerodajné odhady upravili tak, aby boli výsledky spoľahlivé aj v prípade, že by rozptyl chýb nebol rovnaký.

Z výsledkov vyplýva, že: - Agriculturenegatívny a štatisticky významný vplyv – teda čím väčší podiel ľudí pracuje v poľnohospodárstve, tým je spravidla nižšia nezamestnanosť.
- log(GDP) je tiež negatívny a významný, čo znamená, že bohatšie krajiny majú nižšiu mieru nezamestnanosti.
- Industry nie je štatisticky významný, takže jeho vplyv na nezamestnanosť nie je jednoznačný.
- Konštanta (Intercept) je významná, čo potvrdzuje, že model ako celok je stabilný a vhodný na interpretáciu.

Výsledky po tejto korekcii sú teda presnejšie a menej ovplyvnené tým, či majú krajiny rôzny rozptyl v údajoch.

Záver časti o heteroskedasticite

Na základe testov a grafov môžeme povedať, že v našich dátach sa nepotvrdila prítomnosť výraznej heteroskedasticity.
Rozptyl rezíduí je v modeloch pomerne stabilný, najmä po logaritmickej transformácii HDP.
White korekcia ukázala, že aj keby sa v dátach mierna nerovnomernosť vyskytla, výsledky modelu ostávajú spoľahlivé a interpretovateľné.

Celkovo možno zhrnúť, že model2 (so zlogaritmovaným HDP) lepšie spĺňa predpoklady lineárnej regresie a poskytuje stabilnejšie odhady,
čo znamená, že ho môžeme považovať za vhodný nástroj na vysvetlenie miery nezamestnanosti medzi krajinami.

LS0tCnRpdGxlOiAiUHLDoWNhIHMgZGF0YWLDoXpvdSAtIGltcG9ydCDDumRham92LCBncmFmeSwgxaF0YXRpc3Rpa3kiCmF1dGhvcjogIkzDrXZpYSBNZWxpY2hvdsOhIgpkYXRlOiAiT2N0b2JlciAyMDI1IgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdGhlbWU6IHVuaXRlZAogICAgaGlnaGxpZ2h0OiB0YW5nbwplZGl0b3Jfb3B0aW9uczogCiAgbWFya2Rvd246IAogICAgd3JhcDogNzIKLS0tCgojIyDDmnZvZCBhIHBvcGlzIGRhdGFiw6F6eQoKViB0ZWp0byDEjWFzdGkgc2EgdGVzdHVqw7ogxaF0YXRpc3RpY2vDqSBoeXBvdMOpenkgcG9tb2NvdSDDumRham92IHogZGF0YWLDoXp5LAprdG9yw6Egb2JzYWh1amUgZWtvbm9taWNrw6kgdWthem92YXRlbGUga3JhasOtbiB2IHJva29jaCAxOTkxIOKAkyAyMDIyLgpQb3XFvml0w6kgcHJlbWVubsOpIHphaMWVxYhhasO6IGhydWLDvSBkb23DoWNpIHByb2R1a3QgKEhEUCkgdiBVU0QsIG1pZXJ1Cm5lemFtZXN0bmFub3N0aSAoJSkgYSDFoXRydWt0w7pydSB6YW1lc3RuYW5vc3RpIHYgdHJvY2ggc2VrdG9yb2NoIOKAkwpwb8S+bm9ob3Nwb2TDoXJzdHZlLCBwcmllbXlzbGUgYSBzbHXFvmLDoWNoLgoKYGBge3J9Cmluc3RhbGwucGFja2FnZXMoInpvbyIpCmluc3RhbGwucGFja2FnZXMoInRzZXJpZXMiKQppbnN0YWxsLnBhY2thZ2VzKCJsbXRlc3QiKQppbnN0YWxsLnBhY2thZ2VzKCJzYW5kd2ljaCIpCmluc3RhbGwucGFja2FnZXMoImNhciIpCmxpYnJhcnkoem9vKQpsaWJyYXJ5KHRzZXJpZXMpIApsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShzYW5kd2ljaCkKbGlicmFyeShjYXIpCnJtKGxpc3Q9bHMoKSkKYGBgCgpgYGB7cn0KaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQppbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpCmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQpgYGAKCmBgYHtyfQojIEltcG9ydCB2bGFzdG7DqWhvIENTViBzw7pib3J1Cgp1ZGFqZSA8LSByZWFkLmNzdigiRW1wbG95bWVudF9VbmVtcGxveW1lbnRfR0RQX2RhdGEuY3N2IiwKaGVhZGVyID0gVFJVRSwKc2VwID0gIiwiLApkZWMgPSAiICIsCnN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKCiMgWm9icmF6ZW5pZSBwcnbDvWNoIHJpYWRrb3YgYSBuw6F6dm92IHN0xLpwY292CgpoZWFkKHVkYWplKQpjb2xuYW1lcyh1ZGFqZSkKCmBgYAoKIyDDmnZvZCBkbyBwcm9ibMOpbXUsIHN0YW5vdmVuaWUgaHlwb3TDqXoKClJvemhvZGxhIHNvbSBzYSBtb2RlbG92YcWlICoqbWllcnUgbmV6YW1lc3RuYW5vc3RpKioKKCpVbmVtcGxveW1lbnQuUmF0ZSopIHYgesOhdmlzbG9zdGkgb2QgdHJvY2ggdnlzdmV0xL51asO6Y2ljaCBwcmVtZW5uw71jaCwgYQp0byAqKnBvZGllbHUgemFtZXN0bmFub3N0aSB2IHBvxL5ub2hvc3BvZMOhcnN0dmUqKgooKkVtcGxveW1lbnQuU2VjdG9yLi5BZ3JpY3VsdHVyZSopLCAqKnBvZGllbHUgemFtZXN0bmFub3N0aSB2CnByaWVteXNsZSoqICgqRW1wbG95bWVudC5TZWN0b3IuLkluZHVzdHJ5KikgYSAqKmhydWLDqWhvIGRvbcOhY2Vobwpwcm9kdWt0dSBuYSBvYnl2YXRlxL5hKiogKCpHRFAuLmluLlVTRC4qKS4KCk5hxaFhIHByYWNvdm7DoSBoeXBvdMOpemEgaG92b3LDrSBvICoqxaF0YXRpc3RpY2t5IHbDvXpuYW1ub20gdnBseXZlKioKdsWhZXRrw71jaCB0cm9jaCB2eXN2ZXTEvnVqw7pjaWNoIHByZW1lbm7DvWNoLCBwcmnEjW9tOgoKLSAgIHUgcHJlbWVubmVqICoqSW5kdXN0cnkqKiBwcmVkcG9rbGFkw6FtZSAqKm5lZ2F0w612bnkgdnBseXYqKiwgdG8KICAgIHpuYW1lbsOhIMSNw61tIHbDpMSNxaHDrSBwb2RpZWwgcHJhY3Vqw7pjaWNoIHYgcHJpZW15c2xlLCB0w71tIG5pxb7FoWlhCiAgICBuZXphbWVzdG5hbm9zxaUsXAotICAgdSBwcmVtZW5uZWogKipHRFAqKiBvxI1ha8OhdmFtZSAqKm5lZ2F0w612bnkgdnBseXYqKiwgdnnFocWhw60gSERQIG5hCiAgICBvYnl2YXRlxL5hIGplIHNwb2plbsO9IHMgbGVwxaFvdSBla29ub21pY2tvdSB2w71rb25ub3PFpW91IGEgdGVkYSBuacW+xaFvdQogICAgbmV6YW1lc3RuYW5vc8Wlb3UsXAotICAgdSBwcmVtZW5uZWogKipBZ3JpY3VsdHVyZSoqIHByZWRwb2tsYWTDoW1lICoqcG96aXTDrXZueSBhbGVibwogICAgbmVqZWRub3puYcSNbsO9IHZwbHl2KiosIHZvIHZ5c3BlbMO9Y2ggZWtvbm9taWvDoWNoIG5pxb7FocOtIHBvZGllbAogICAgcG/Evm5vaG9zcG9kw6Fyc3R2YSBzw7p2aXPDrSBzIG5pxb7FoW91IG5lemFtZXN0bmFub3PFpW91LCB6YXRpYcS+IMSNbyB2bwogICAgdnl2w61qYWrDumNpY2ggc2Ega3Jhamluw6FjaCBtw7TFvmUgYnnFpSBlZmVrdCBvcGHEjW7DvS4KCiMgUHLDrXByYXZhIGRhdGFiw6F6eSwgxI1pc3RlbmllIGEgw7pwcmF2YSDDumRham92CgpCdWRlbWUgcHJhY292YcWlIHMgdmxhc3Ruw71tIHPDumJvcm9tCmBFbXBsb3ltZW50X1VuZW1wbG95bWVudF9HRFBfZGF0YS5jc3ZgLiBLZcSPxb5lIG5pZWt0b3LDqSBob2Rub3R5IG3DtMW+dQpjaMO9YmHFpSBhbGVibyBiecWlIHYgaW5vbSBmb3Jtw6F0ZSwgbmFqcHJ2IGljaCBvxI1pc3TDrW1lIChwcmV0eXB1amVtZQrEjcOtc2VsbsOpIHN0xLpwY2UpIGEgKipjaMO9YmFqw7pjZSBob2Rub3R5IGRvcGxuw61tZSBtZWRpw6Fub20qKiBkYW5lagpwcmVtZW5uZWouIFByZWZlcmVuxI1uZSBwb3XFvmlqZW1lIHJvayAqKjIwMTUqKjsgYWsgdiBkw6F0YWNoIDIwMTUgbmllIGplLAphdXRvbWF0aWNreSB6b2JlcmllbWUgKipwb3NsZWRuw70gZG9zdHVwbsO9IHJvayoqLiBOYSDEj2FsxaFpZSBrcm9reSBzaQpwb25lY2jDoW1lIGvEvsO6xI1vdsOpIHByZW1lbm7DqTogKlVuZW1wbG95bWVudC5SYXRlKiwKKkVtcGxveW1lbnQuU2VjdG9yLi5BZ3JpY3VsdHVyZSosICpFbXBsb3ltZW50LlNlY3Rvci4uSW5kdXN0cnkqLAoqRW1wbG95bWVudC5TZWN0b3IuLlNlcnZpY2VzKiBhICpHRFAuLmluLlVTRC4qLgoKYGBge3J9CiMgUm9idXN0bsOhIHByw61wcmF2YTogYXV0b21hdGlja8OpIG5hbWFwb3ZhbmllIG7DoXp2b3Ygc3TEunBjb3YgKyBpbXB1dMOhY2lhIG1lZGnDoW5vbQoKIyAwKSBOYcSNw610YW5pZSAocG9uZWNoYWogY2hlY2submFtZXMgPSBGQUxTRSwgYWJ5IHNhIG5lbWVuaWxpIG1lbsOhKQp1ZGFqZSA8LSByZWFkLmNzdigKICAiRW1wbG95bWVudF9VbmVtcGxveW1lbnRfR0RQX2RhdGEuY3N2IiwKICBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiLCIsIGRlYyA9ICIuIiwKICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UsIGNoZWNrLm5hbWVzID0gRkFMU0UKKQoKIyAxKSBQb21vY27DqSBmdW5rY2llCmZpbmRfY29sIDwtIGZ1bmN0aW9uKGNhbmRpZGF0ZXMsIGNvbHMpIHsKICAjIHNrw7pzaSBwcmVzbsO6IHpob2R1IChjYXNlLWluc2Vuc2l0aXZlKSwgcG90b20gJ29ic2FodWplJwogIGxjIDwtIHRvbG93ZXIoY29scykKICAjIHByZXNuw6EgemhvZGEKICBmb3IgKHAgaW4gY2FuZGlkYXRlcykgewogICAgaWR4IDwtIHdoaWNoKGxjID09IHRvbG93ZXIocCkpCiAgICBpZiAobGVuZ3RoKGlkeCkgPT0gMSkgcmV0dXJuKGNvbHNbaWR4XSkKICB9CiAgIyBvYnNhaHVqZSAocmVnZXgvc3Vic3RyaW5nLCBjYXNlLWluc2Vuc2l0aXZlKQogIGZvciAocCBpbiBjYW5kaWRhdGVzKSB7CiAgICBpZHggPC0gZ3JlcCh0b2xvd2VyKHApLCBsYywgZml4ZWQgPSBUUlVFKQogICAgaWYgKGxlbmd0aChpZHgpID49IDEpIHJldHVybihjb2xzW2lkeF1bMV0pCiAgfQogIHJldHVybihOQV9jaGFyYWN0ZXJfKQp9CgpudW1fY2xlYW4gPC0gZnVuY3Rpb24oeCkgewogIGlmIChpcy5udW1lcmljKHgpKSByZXR1cm4oeCkKICB4IDwtIGdzdWIoIlxccyIsICIiLCB4KSAgICMgb2RzdHLDoW5pIG1lZHplcnkKICB4IDwtIGdzdWIoIiwiLCAiIiwgeCkgICAgICMgb2RzdHLDoW5pIHRpc8OtY292w6kgb2RkZcS+LgogIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyh4KSkKfQoKIyAyKSBOw6FqZGVtZSBwb8W+YWRvdmFuw6kgc3TEunBjZSAodG9sZXJhbnRuZSBuYSBuw6F6dnkpCmNvbHMgPC0gY29sbmFtZXModWRhamUpCgpjb2xfeWVhciA8LSBmaW5kX2NvbChjKCJZZWFyIiwiUm9rIiksIGNvbHMpCmNvbF91bmVtcCA8LSBmaW5kX2NvbChjKCJVbmVtcGxveW1lbnQuUmF0ZSIsIlVuZW1wbG95bWVudCIsICJVbmVtcGxveW1lbnQgUmF0ZSIpLCBjb2xzKQpjb2xfYWdyaSA8LSBmaW5kX2NvbChjKCJFbXBsb3ltZW50LlNlY3Rvci4uQWdyaWN1bHR1cmUiLCJBZ3JpY3VsdHVyZSIsIkVtcGxveW1lbnQgQWdyaWN1bHR1cmUiKSwgY29scykKY29sX2luZCAgPC0gZmluZF9jb2woYygiRW1wbG95bWVudC5TZWN0b3IuLkluZHVzdHJ5IiwiSW5kdXN0cnkiLCJFbXBsb3ltZW50IEluZHVzdHJ5IiksIGNvbHMpCmNvbF9zZXJ2IDwtIGZpbmRfY29sKGMoIkVtcGxveW1lbnQuU2VjdG9yLi5TZXJ2aWNlcyIsIlNlcnZpY2VzIiwiRW1wbG95bWVudCBTZXJ2aWNlcyIpLCBjb2xzKQpjb2xfZ2RwICA8LSBmaW5kX2NvbChjKCJHRFAuLmluLlVTRC4iLCJHRFAuLmluLlVTRCIsIkdEUCBwZXIgY2FwaXRhIiwiR0RQIiwiZ2RwIiksIGNvbHMpCgptYXBwaW5nIDwtIGMoCiAgWWVhciA9IGNvbF95ZWFyLAogIFVuZW1wbG95bWVudC5SYXRlID0gY29sX3VuZW1wLAogIEFncmljdWx0dXJlID0gY29sX2FncmksCiAgSW5kdXN0cnkgPSBjb2xfaW5kLAogIFNlcnZpY2VzID0gY29sX3NlcnYsCiAgR0RQX2luX1VTRCA9IGNvbF9nZHAKKQpjYXQoIk1hcG92YW5pZSBzdMS6cGNvdjpcbiIpCnByaW50KG1hcHBpbmcpCgojIDMpIE/FoWV0cmksIGFrIHNhIG5pZcSNbyBuZW5hxaFsbwppZiAoYW55KGlzLm5hKG1hcHBpbmcpKSkgewogIHN0b3AoIk5pZWt0b3LDqSBzdMS6cGNlIHNhIG5lbmHFoWxpLiBTa29udHJvbHVqIG1hcG92YW5pZSB2ecWhxaFpZSBhIHByw61wYWRuZSB1cHJhdiBrYW5kaWTDoXRvdi4iKQp9CgojIDQpIFByZXR5cHVqIG5hIG51bWVyaWNrw6kgKGtkZSB0cmViYSkKZm9yIChjbiBpbiB1bmlxdWUoYyhjb2xfeWVhcixjb2xfdW5lbXAsY29sX2FncmksY29sX2luZCxjb2xfc2Vydixjb2xfZ2RwKSkpIHsKICBpZiAoY24gJWluJSBjKGNvbF95ZWFyLGNvbF91bmVtcCxjb2xfYWdyaSxjb2xfaW5kLGNvbF9zZXJ2LGNvbF9nZHApKSB7CiAgICB1ZGFqZVtbY25dXSA8LSBudW1fY2xlYW4odWRhamVbW2NuXV0pCiAgfQp9CgojIDUpIFZ5YmVyIHJvazogMjAxNSwgaW5hayBwb3NsZWRuw70gZG9zdHVwbsO9CnRhcmdldF95ZWFyIDwtIGlmIChhbnkodWRhamVbW2NvbF95ZWFyXV0gPT0gMjAxNSwgbmEucm0gPSBUUlVFKSkgMjAxNSBlbHNlIG1heCh1ZGFqZVtbY29sX3llYXJdXSwgbmEucm0gPSBUUlVFKQpjYXQoIlBvdcW+aXTDvSByb2s6IiwgdGFyZ2V0X3llYXIsICJcbiIpCgojIDYpIFZ5YmVyIGvEvsO6xI1vdsOpIHByZW1lbm7DqSBwcmUgZGFuw70gcm9rCnVkYWplLnkgPC0gdWRhamVbdWRhamVbW2NvbF95ZWFyXV0gPT0gdGFyZ2V0X3llYXIsIGMoY29sX3VuZW1wLGNvbF9hZ3JpLGNvbF9pbmQsY29sX3NlcnYsY29sX2dkcCldCm5hbWVzKHVkYWplLnkpIDwtIGMoIlVuZW1wbG95bWVudC5SYXRlIiwiQWdyaWN1bHR1cmUiLCJJbmR1c3RyeSIsIlNlcnZpY2VzIiwiR0RQX1VTRCIpCgojIDcpIEltcHV0w6FjaWEgbWVkacOhbm9tCmNvbHVtbl9tZWRpYW5zIDwtIHNhcHBseSh1ZGFqZS55LCBtZWRpYW4sIG5hLnJtID0gVFJVRSkKZm9yIChjb2wgaW4gbmFtZXModWRhamUueSkpIHsKICBpZHggPC0gaXMubmEodWRhamUueVtbY29sXV0pCiAgaWYgKGFueShpZHgpKSB1ZGFqZS55W1tjb2xdXVtpZHhdIDwtIGNvbHVtbl9tZWRpYW5zW2NvbF0KfQoKIyA4KSBIb3Rvdm8g4oCTIGRhdGFzZXQgcHJpcHJhdmVuw70gbmEgbW9kZWxvdmFuaWUKc3RyKHVkYWplLnkpCnN1bW1hcnkodWRhamUueSkKCmBgYAoKIyBWaXp1YWxpesOhY2lhIGTDoXQg4oCTIGtvbnRyb2xhIG5lenJvdm5hbG9zdMOtCgpWIHRlanRvIMSNYXN0aSBzYSBwb3pyaWVtZSBuYSByb3psb8W+ZW5pZSBqZWRub3RsaXbDvWNoIHByZW1lbm7DvWNoIHBvbW9jb3UKKipib3hwbG90b3YqKi5cCkNpZcS+b20gamUgemlzdGnFpSwgxI1pIHNhIHYgZMOhdGFjaCBuZW5hY2jDoWR6YWrDuiBuZXpyb3ZuYWxvc3RpLCBleHRyw6ltbmUKaG9kbm90eSBhbGVibyBudWxvdsOpIHBvem9yb3ZhbmlhLlwKUG91xb5pamVtZSDFoXR5cmkgaGxhdm7DqSBwcmVtZW5uw6k6IG1pZXJ1IG5lemFtZXN0bmFub3N0aSwgcG9kaWVsCnBvxL5ub2hvc3BvZMOhcnN0dmEsIHBvZGllbCBwcmllbXlzbHUgYSBIRFAgbmEgb2J5dmF0ZcS+YS4KCmBgYHtyfQojIEJveHBsb3R5IHByZW1lbm7DvWNoIOKAkyBrb250cm9sYSByb3psb8W+ZW5pYSBhIG9kxL5haGzDvWNoIGhvZG7DtHQKCiMgWnZvbMOtbWUgbGVuIHJlbGV2YW50bsOpIHByZW1lbm7DqQp2YXJzX3RvX3Bsb3QgPC0gYygiVW5lbXBsb3ltZW50LlJhdGUiLCJBZ3JpY3VsdHVyZSIsIkluZHVzdHJ5IiwiR0RQX1VTRCIpCgojIE5hc3RhdmVuaWUgZ3JhZmlja8OpaG8gbGF5b3V0dTogMiDDlyAyCnBhcihtZnJvdyA9IGMoMiwgMikpCnBhcihtYXIgPSBjKDQsIDQsIDIsIDEpKQoKIyBQcmUga2HFvmTDvSB2eWJyYW7DvSBzdMS6cGVjIG5ha3Jlc2zDrW1lIGJveHBsb3QKZm9yIChjb2wgaW4gdmFyc190b19wbG90KSB7CiAgYm94cGxvdCgKICAgIHVkYWplLnlbW2NvbF1dLAogICAgbWFpbiA9IGNvbCwKICAgIHhsYWIgPSAiSG9kbm90YSIsCiAgICBjb2wgPSAibGlnaHRibHVlIiwKICAgIGJvcmRlciA9ICJkYXJrYmx1ZSIKICApCn0KCiMgTmFkcGlzIHByZSBjZWzDuiBzYWR1IGdyYWZvdgptdGV4dCgiQm94cGxvdHkgamVkbm90bGl2w71jaCBwcmVtZW5uw71jaCAocm9rIHZ5YnJhbsO9IHByZSBhbmFsw716dSkiLAogICAgICBvdXRlciA9IFRSVUUsIGNleCA9IDEuMiwgZm9udCA9IDIpCgojIFJlc2V0IGxheW91dHUgbmEgMSBncmFmCnBhcihtZnJvdyA9IGMoMSwgMSkpCgpgYGAKCk5hIHrDoWtsYWRlIGJveHBsb3RvdiBtw7TFvmVtZSBwb3pvcm92YcWlIG5hc2xlZG92bsOpIHNrdXRvxI1ub3N0aToKCi0gICAqKlVuZW1wbG95bWVudC5SYXRlKiog4oCTIHbDpMSNxaFpbmEgcG96b3JvdmFuw60gc2Egc8O6c3RyZcSPdWplIHYgc3RyZWRuw71jaAogICAgaG9kbm90w6FjaCwgYXbFoWFrIHYgbmlla3RvcsO9Y2gga3Jhamluw6FjaCBzYSB2eXNreXR1asO6IGFqIGV4dHLDqW1uZQogICAgdnnFocWhaWUgbWllcnkgbmV6YW1lc3RuYW5vc3RpLiBUbyBuYXpuYcSNdWplLCDFvmUgbWVkemkga3JhamluYW1pCiAgICBleGlzdHVqw7ogdsO9cmF6bsOpIHJvemRpZWx5IHYgdHJodSBwcsOhY2UuXAotICAgKipBZ3JpY3VsdHVyZSoqIOKAkyBob2Rub3R5IHNhIHBvaHlidWrDuiB2IMWhaXJva29tIGludGVydmFsZS4gS3JhamlueSBzCiAgICB2ecWhxaHDrW0gcG9kaWVsb20gcG/Evm5vaG9zcG9kw6Fyc3R2YSBtw7TFvnUgbWHFpSBuacW+xaFpdSDDunJvdmXFiAogICAgaW5kdXN0cmlhbGl6w6FjaWUsIMSNbyBzYSDEjWFzdG8gc3DDoWphIHMgdnnFocWhb3UgbmV6YW1lc3RuYW5vc8Wlb3UuXAotICAgKipJbmR1c3RyeSoqIOKAkyB2w6TEjcWhaW5hIGtyYWrDrW4gbcOhIHN0cmVkbsOpIGHFviB2ecWhxaFpZSBob2Rub3R5LCBwcmnEjW9tCiAgICBleHRyw6ltbmUgaG9kbm90eSBzw7ogbWVuZWogxI1hc3TDqS4gVnnFocWhw60gcG9kaWVsIHByaWVteXNsdSBuYXpuYcSNdWplCiAgICByb3p2aW51dGVqxaFpdSBla29ub21pa3UuXAotICAgKipHRFBfVVNEKiog4oCTIHJvemxvxb5lbmllIHVrYXp1amUgdsO9cmF6bsOpIHJvemRpZWx5IHYgZWtvbm9taWNrZWoKICAgIMO6cm92bmkgbWVkemkga3JhamluYW1pLiBOaWVrdG9yw6kgaG9kbm90eSBHRFAgc8O6IHZlxL5taSB2eXNva8OpIOKAkyBpZGUgbwogICAgYm9oYXTFoWllIGtyYWppbnkgcyB2eXNwZWxvdSBla29ub21pa291LCB6YXRpYcS+IMSNbyBpbsOpIG1hasO6IG5pxb7FocOtCiAgICBIRFAsIMSNbyBwb3VrYXp1amUgbmEgZWtvbm9taWNrw7ogbmVyb3Zub3bDoWh1LgoKQ2Vsa292byBib3hwbG90eSBuYXpuYcSNdWrDuiwgxb5lIMO6ZGFqZSBvYnNhaHVqw7ogKipuaWVrb8S+a28gb2TEvmFobMO9Y2gKaG9kbsO0dCoqIChuYWptw6QgdiBwcmVtZW5uw71jaCAqVW5lbXBsb3ltZW50LlJhdGUqIGEgKkdEUF9VU0QqKSwgxI1vIGplCnbFoWFrIHByaSBtZWR6aW7DoXJvZG7DvWNoIGTDoXRhY2ggcHJpcm9kemVuw6kuIFbDpMSNxaFpbmEgaG9kbsO0dCBzYSBuYWNow6FkemEgdgpyZWFsaXN0aWNrb20gcm96c2FodSBhIG5lcG96b3J1amVtZSDFvmlhZG5lIHpqYXZuw6kgbmV6cm92bmFsb3N0aSBha28Kc3lzdGVtYXRpY2vDqSBudWxvdsOpIGhvZG5vdHkuXApUaWV0byB2w71zbGVka3kgcG90dnJkenVqw7osIMW+ZSDDumRhamUgc8O6IHZob2Ruw6kgbmEgxI9hbMWhaWUgbW9kZWxvdmFuaWUuCgojIyBMaW5lw6FybmEgcmVncmVzaWEKCk1vZGVsIG9kaGFkdWplbWUgcHLDrWthem9tIGBsbSgpYC4KClYgbmHFoW9tIHByw61wYWRlIG1vZGVsdWplbWUgKiptaWVydSBuZXphbWVzdG5hbm9zdGkqKgooYFVuZW1wbG95bWVudC5SYXRlYCkgdiB6w6F2aXNsb3N0aSBvZCB0cm9jaCB2eXN2ZXTEvnVqw7pjaWNoIHByZW1lbm7DvWNoOiAtCnBvZGllbHUgemFtZXN0bmFub3N0aSB2IHBvxL5ub2hvc3BvZMOhcnN0dmUgKGBBZ3JpY3VsdHVyZWApLFwKLSBwb2RpZWx1IHphbWVzdG5hbm9zdGkgdiBwcmllbXlzbGUgKGBJbmR1c3RyeWApLFwKLSBhIGxvZ2FyaXRtdSBocnViw6lobyBkb23DoWNlaG8gcHJvZHVrdHUgbmEgb2J5dmF0ZcS+YSAoYGxvZyhHRFBfVVNEKWApLgoKQ2llxL5vbSBqZSB6aXN0acWlLCBrdG9yw6kgeiB0w71jaHRvIGZha3Rvcm92IMWhdGF0aXN0aWNreSB2w716bmFtbmUKb3ZwbHl2xYh1asO6IG1pZXJ1IG5lemFtZXN0bmFub3N0aS4KCmBgYHtyfQojIFByaWTDoW1lIGxvZ2FyaXRtaWNrw7ogdHJhbnNmb3Jtw6FjaXUgSERQCnVkYWplLnkkbG9nR0RQIDwtIGlmZWxzZSh1ZGFqZS55JEdEUF9VU0QgPiAwLCBsb2codWRhamUueSRHRFBfVVNEKSwgTkFfcmVhbF8pCgojIFrDoWtsYWRuw70gbGluZcOhcm55IG1vZGVsCm1vZGVsIDwtIGxtKFVuZW1wbG95bWVudC5SYXRlIH4gQWdyaWN1bHR1cmUgKyBJbmR1c3RyeSArIGxvZ0dEUCwgZGF0YSA9IHVkYWplLnkpCgojIFPDumhybiB2w71zbGVka292CnN1bW1hcnkobW9kZWwpCgpgYGAKCiMjIERpYWdub3N0aWNrw6kgZ3JhZnkgcmVncmVzbsOpaG8gbW9kZWx1CgpTw7pocm4gb2RoYWRvdmFuw6lobyBtb2RlbHUgbsOhbSBwb3NreXR1amUgc8O6Ym9yIG9kaGFkbnV0w71jaCByZWdyZXNuw71jaAprb2VmaWNpZW50b3YsIGt0b3LDvWNoIHpuYW1pZW5rYSBidWTDuiByb3pvYmVyYW7DqSBuZXNrw7RyLlwKQWsgaG92b3LDrW1lIG8gdmxhc3Rub3N0aWFjaCBtb2RlbHUgYWtvIGNlbGt1LCBwb3pyaW1lIHNhIG5hanNrw7RyIG5hCm5hc2xlZHVqw7pjZSBkaWFnbm9zdGlja8OpIGdyYWZ5LlwKUG9tb2NvdSBuaWNoIHZpZW1lIG92ZXJpxaUsIMSNaSBzw7ogc3BsbmVuw6kgesOha2xhZG7DqSBwcmVkcG9rbGFkeSBsaW5lw6FybmVqCnJlZ3Jlc2llIOKAkyBwcmVkb3bFoWV0a8O9bSAqKm5vcm1hbGl0YSByZXrDrWR1w60qKiwgKipob21vc2tlZGFzdGljaXRhKiogYQoqKmFic2VuY2lhIG9kxL5haGzDvWNoIGhvZG7DtHQqKi4KCmBgYHtyfQojIERpYWdub3N0aWNrw6kgZ3JhZnkgcmVncmVzbsOpaG8gbW9kZWx1CnBhcihtZnJvdyA9IGMoMiwgMikpICAgIyByb3psb8W+ZW5pZSAyIHggMgpwbG90KG1vZGVsKSAgICAgICAgICAgICMgxaF0eXJpIHrDoWtsYWRuw6kgZ3JhZnk6IHJlc2lkdWFscyB2cyBmaXR0ZWQsIFEtUSwgc2NhbGUtbG9jYXRpb24sIHJlc2lkdWFscyB2cyBsZXZlcmFnZQpwYXIobWZyb3cgPSBjKDEsIDEpKSAgICMgcmVzZXQgbmEgMSBncmFmCgpgYGAKCiMjIyBJbnRlcnByZXTDoWNpYSBkaWFnbm9zdGlja8O9Y2ggZ3JhZm92CgoqKjEuIFJlc2lkdWFscyB2cyBGaXR0ZWQgKFJlesOtZHXDoSBvcHJvdGkgdnlyb3ZuYW7DvW0gaG9kbm90w6FtKSoqXApSZXrDrWR1w6Egc2Egcm96a2xhZGFqw7ogcHJpYmxpxb5uZSBzeW1ldHJpY2t5IG9rb2xvIG51bG92ZWogb3NpLCDEjW8gamUKcHJpYXpuaXbDqS5cCsSMZXJ2ZW7DoSBMT0VTUyDEjWlhcmEgamUgcmVsYXTDrXZuZSByb3Zuw6EsIGliYSBtaWVybmUgemFrcml2ZW7DoSBzbWVyb20gaG9yZQpuYSBrb25jaSwgxI1vIG5hem5hxI11amUgKipzbGFiw70gbsOhem5hayBuZWxpbmVhcml0eSoqLCBhbGUgbmllIHrDoXZhxb5uw70KcHJvYmzDqW0uXApSb3pwdHlsIGJvZG92IHpvc3TDoXZhIHByaWJsacW+bmUgcm92bmFrw70gcHJlIHbFoWV0a3kgaG9kbm90eSBmaXR0ZWQg4oCTIHRlZGEKKipuZXBvem9ydWplbWUgdsO9cmF6bsO6IGhldGVyb3NrZWRhc3RpY2l0dSoqLgoKKioyLiBR4oCTUSAocm96cHR5bCkgcGxvdCByZXrDrWR1w60qKlwKQm9keSBzYSB2byB2w6TEjcWhaW5lIHJvenNhaHUgZHLFvmlhIGJsw616a28gNDXCsCBwcmlhbWt5LCBubyBuYSBrb25jb2NoIHNhIG9kCm5laiBtaWVybmUgb2RjaHnEvnVqw7ouXApUbyB6bmFtZW7DoSwgxb5lICoqcm96bG/FvmVuaWUgcmV6w61kdcOtIHNhIGxlbiBtaWVybmUgb2RsacWhdWplIG9kIG5vcm3DoWxuZWhvCnJvemRlbGVuaWEqKiwgcHJpxI1vbSBvZGNow71sa3kgc8O6IHNww7Rzb2JlbsOpIHByYXZkZXBvZG9ibmUgbmlla2/EvmvDvW1pCmV4dHLDqW1ueW1pIHBvem9yb3ZhbmlhbWkuXApDZWxrb3ZvIHbFoWFrIHByZWRwb2tsYWQgbm9ybWFsaXR5IG5pZSBqZSB2w6HFvm5lIHBvcnXFoWVuw70uCgoqKjMuIFNjYWxl4oCTTG9jYXRpb24gcGxvdCoqXArEjGVydmVuw6EgaGxhZGvDoSDEjWlhcmEgamUgdGFrbWVyIHZvZG9yb3Zuw6EgYSByb3pwdHlsIGJvZG92IHBvIG9zaSBYIGplCnByaWJsacW+bmUga29uxaF0YW50bsO9LlwKVG8gcG90dnJkenVqZSwgxb5lICoqcmV6w61kdcOhIG1hasO6IHByaWJsacW+bmUgcm92bmFrw7ogdmFyaWFuY2l1KiogbmFwcmllxI0KY2Vsw71tIHJvenNhaG9tIGhvZG7DtHQgKHByZWRwb2tsYWQgaG9tb3NrZWRhc3RpY2l0eSBqZSBzcGxuZW7DvSkuCgoqKjQuIFJlc2lkdWFscyB2cyBMZXZlcmFnZSAodnBseXZuw6kgcG96b3JvdmFuaWEpKipcClbDpMSNxaFpbmEgcG96b3JvdmFuw60gbcOhIG7DrXpreSBww6Frb3bDvSBlZmVrdCAobGV2ZXJhZ2UgXDwgMC4wNSksIMSNbyB6bmFtZW7DoSwKxb5lIGplZG5vdGxpdsOpIGtyYWppbnkgbmVtYWrDuiBuYWRtZXJuw70gdnBseXYgbmEgb2RoYWRudXTDqSBrb2VmaWNpZW50eS5cCk5pZWtvxL5rbyBib2RvdiAobmFwci4gcyBvem5hxI1lbsOtbSA0NDM4LCA0MzYzLCA0NDQ5KSBzYSBuYWNow6FkemEgYmxpxb7FoWllCmsgb2tyYWp1IENvb2tvdmVqIHZ6ZGlhbGVub3N0aSwgxI1vIG5hem5hxI11amUsIMW+ZSBpZGUgbyAqKm1pZXJuZSB2cGx5dm7DqQpwb3pvcm92YW5pYSoqLCBhbGUgxb5pYWRuZSB6IG5pY2ggbmVwcmVzYWh1amUgaHJhbmljdSAwLjUgxI1pIDEuMCwgdGVkYQoqKsW+aWFkbmUgZXh0csOpbW5lIG9kxL5haGzDqSBob2Rub3R5IHNhIG5lb2JqYXZpbGkqKi4KCmBgYHtyfQojIFRlc3R5IG5vcm1hbGl0eSBhIG9kxL5haGzDvWNoIGhvZG7DtHQKcmVzaWR1YWxzIDwtIHJlc2lkdWFscyhtb2RlbCkKamJfdGVzdCA8LSBqYXJxdWUuYmVyYS50ZXN0KHJlc2lkdWFscykKamJfdGVzdCAgIyBKYXJxdWXigJNCZXJhIHRlc3Qgbm9ybWFsaXR5CgojIE91dGxpZXIgdGVzdCAoQm9uZmVycm9uaSBjb3JyZWN0aW9uKQpvdXRsaWVyX3Rlc3QgPC0gY2FyOjpvdXRsaWVyVGVzdChtb2RlbCkKb3V0bGllcl90ZXN0CgpgYGAKCiMjIyBWw71zbGVka3kgdGVzdHUgb2TEvmFobMO9Y2ggaG9kbsO0dAoKVsO9c3R1cCBmdW5rY2llIGBvdXRsaWVyVGVzdChtb2RlbClgIGlkZW50aWZpa292YWwgcG96b3JvdmFuaWUgcyBpbmRleG9tCioqNDMzNyoqLFwKa3RvcsOpIG3DoSBuYWp2ecWhxaFpdSDFoXR1ZGVudGl6b3ZhbsO6IGhvZG5vdHUgcmV6w61kdWEgYHJzdHVkZW50ID0gMy4yN2AuXApKZWhvIG5lb3ByYXZlbsOhIHAtaG9kbm90YSBqZSAqKjAuMDAxMjcqKiwgYXbFoWFrIHBvIGFwbGlrw6FjaWkKQm9uZmVycm9uaWhvIGtvcmVrY2llXApqZSB2w71zbGVkbsOhIGhvZG5vdGEgKiowLjIzMDY0KiosIHRlZGEgKipuaWUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw6EgbmEgNSAlCmhsYWRpbmUqKi4KClRvIHpuYW1lbsOhLCDFvmUgaG9jaSB0b3RvIHBvem9yb3ZhbmllIG3DoSBwb21lcm5lIHZ5c29rw6kgcmV6w61kdXVtLFwKKipuaWUgamUgbmF0b8S+a28gZXh0csOpbW5lLCBhYnkgc21lIGhvIHBvdmHFvm92YWxpIHphIMWhdGF0aXN0aWNreSB2w716bmFtbsO9Cm9kxL5haGzDvSBib2QuKipcClYga29udGV4dGUgZWtvbm9taWNrw71jaCBkw6F0IGlkZSBwcmF2ZGVwb2RvYm5lIG8ga3JhamludSBzIG5ldHlwaWNrb3UKa29tYmluw6FjaW91XAp2eXNva8OpaG8gSERQIGEgxaFwZWNpZmlja2VqIMWhdHJ1a3TDunJ5IHphbWVzdG5hbm9zdGksIG5vIGplaiB2cGx5diBuYQpjZWxrb3bDvSBtb2RlbFwKbmllIGplIGRvc3RhdG/EjW5lIHNpbG7DvSwgYWJ5IHNrcmVzbGlsIG9kaGFkeSBrb2VmaWNpZW50b3YuCgpaw6F2ZXJvbSBtb8W+bm8ga29uxaF0YXRvdmHFpSwgxb5lICoqbW9kZWwgbmVvYnNhaHVqZSDFvmlhZG5lIHbDvXpuYW1uw6kgb2TEvmFobMOpCnBvem9yb3ZhbmlhKiosXAprdG9yw6kgYnkgb3ZwbHl2xYhvdmFsaSB2w71zbGVka3kgcmVncmVzaWUuCgojIyBBbHRlcm5hdMOtdm55IG1vZGVsCgpBayBzYSB2eXNreXR1asO6IG1pZXJuZSBvZMS+YWhsw6kgaG9kbm90eSBhbGVibyBuZW5vcm1hbGl0YSB2IEdEUCwgbcO0xb5lbWUKdXByYXZpxaUgbW9kZWwgdGFrLFwKxb5lIHBvdcW+aWplbWUgbG9nYXJpdG11cyBIRFAgYSB6bWVuw61tZSDFoXRydWt0w7pydSBzZWt0b3Jvdi5cCk5vdsO9IG1vZGVsIGJ1ZGUgbWHFpSB0dmFyOgoKJCQKVW5lbXBsb3ltZW50LlJhdGVfaSA9IFxiZXRhXzAgKyBcYmV0YV8xIFwsIEluZHVzdHJ5X2kgKyBcYmV0YV8yIFwsIFNlcnZpY2VzX2kgKyBcYmV0YV8zIFwsIFxsb2coR0RQX2kpICsgXHZhcmVwc2lsb25faQokJAoKYGBge3J9CiMgQWx0ZXJuYXTDrXZueSBtb2RlbCBzIGxvZyhHRFApIGEgU2VydmljZXMgbmFtaWVzdG8gQWdyaWN1bHR1cmUKbW9kZWwyIDwtIGxtKFVuZW1wbG95bWVudC5SYXRlIH4gSW5kdXN0cnkgKyBTZXJ2aWNlcyArIGxvZyhHRFBfVVNEKSwgZGF0YSA9IHVkYWplLnkpCnN1bW1hcnkobW9kZWwyKQoKYGBgCgpgYGB7cn0KIyBEaWFnbm9zdGlja8OpIGdyYWZ5IGFsdGVybmF0w612bmVobyBtb2RlbHUKcGFyKG1mcm93ID0gYygyLCAyKSkKcGxvdChtb2RlbDIpCnBhcihtZnJvdyA9IGMoMSwgMSkpCgpgYGAKCmBgYHtyfQojIE5vcm1hbGl0eSBhIG91dGxpZXIgdGVzdCBwcmUgbm92w70gbW9kZWwKcmVzaWR1YWxzMiA8LSByZXNpZHVhbHMobW9kZWwyKQpqYXJxdWUuYmVyYS50ZXN0KHJlc2lkdWFsczIpCmNhcjo6b3V0bGllclRlc3QobW9kZWwyKQoKYGBgCgojIyMgWsOhdmVyCgpOb3bDvSBtb2RlbCBwbyBsb2dhcml0bWlja2VqIHRyYW5zZm9ybcOhY2lpIEhEUCBwb3R2cmR6dWplLCDFvmU6CgotICAgcHJlbWVubsOpICoqcHJpZW15c2VsIChJbmR1c3RyeSkqKiBhICoqSERQIChHRFApKiogbWFqw7ogKipuZWdhdMOtdm55CiAgICB2cGx5diBuYSBtaWVydSBuZXphbWVzdG5hbm9zdGkqKiDigJMgdGVkYSDEjcOtbSBqZSBwb2RpZWwgcHJpZW15c2x1IGEKICAgIMO6cm92ZcWIIEhEUCB2ecWhxaFpYSwgdMO9bSBqZSBuZXphbWVzdG5hbm9zxaUgbmnFvsWhaWEsXAotICAgcHJlbWVubsOhICoqc2x1xb5ieSAoU2VydmljZXMpKiogbcOhICoqc2xhYsWhw60gYWxlYm8gxaF0YXRpc3RpY2t5CiAgICBuZXbDvXpuYW1uw70gdnBseXYqKixcCi0gICByZXrDrWR1w6EgbWFqw7ogcG8gdHJhbnNmb3Jtw6FjaWkgbGVwxaFpZSByb3pkZWxlbmllIGEgbW9kZWwgbmV2eWthenVqZQogICAgesOhdmHFvm7DqSBwb3J1xaFlbmlhIHByZWRwb2tsYWRvdiBsaW5lw6FybmVqIHJlZ3Jlc2llLgoKTmEgesOha2xhZGUgdMO9Y2h0byB2w71zbGVka292IG3DtMW+ZW1lIGtvbsWhdGF0b3ZhxaUsIMW+ZSAqKnVwcmF2ZW7DvSBtb2RlbCBqZQrFoXRhdGlzdGlja3kgc3BvxL5haGxpdsO9LCBzdGFiaWxuw70gYSBkb2JyZSBpbnRlcnByZXRvdmF0ZcS+bsO9KiouXApQb3R2cmR6dWplIHByZWRwb2tsYWQsIMW+ZSAqKnZ5xaHFoWlhIGVrb25vbWlja8OhIMO6cm92ZcWIIGEgcm96dmludXRlasWhw60KcHJpZW15c2VsbsO9IHNla3RvciBwcmlzcGlldmFqw7ogayBuacW+xaFlaiBtaWVyZSBuZXphbWVzdG5hbm9zdGkqKi4KCiMgSGV0ZXJvc2tlZGFzdGljaXRhCgpQcsOtdG9tbm9zxaUgaGV0ZXJvc2tlZGFzdGljaXR5IChuZWtvbsWhdGFudG7DqWhvIHJvenB0eWx1IG7DoWhvZG5laiB6bG/Fvmt5KSBzcMO0c29idWplIG5lcHJlc27DqSBvZGhhZHkgc21lcm9kYWpuw71jaCBjaMO9YiBhIHTDvW0gYWogbmVzcG/EvmFobGl2w6kgdC10ZXN0eSB2w716bmFtbm9zdGkgamVkbm90bGl2w71jaCByZWdyZXNuw71jaCBrb2VmaWNpZW50b3YuICAKUHJldG8gamUgZMO0bGXFvml0w6ksIGFieSBzbWUgaGV0ZXJvc2tlZGFzdGljaXR1IG5hanBydiAqKmRldGVnb3ZhbGkqKiAocG9tb2NvdSBncmFmb3YgYWxlYm8gdGVzdG92KSBhIHYgcHLDrXBhZGUgamVqIHbDvXNreXR1IHNhIGp1IHBva8O6c2lsaSAqKm9kc3Ryw6FuacWlKiouCgpWIG5hxaFvbSBwcsOtcGFkZSBzYSBwb2vDunNpbWUgdml6dcOhbG5lIHZ5aG9kbm90acWlLCDEjWkgdmFyaWFiaWxpdGEgcmV6w61kdcOtICjFoXR2b3Jjb3YgcmV6w61kdcOtKSB6w6F2aXPDrSBvZCBuaWVrdG9yZWogeiB2eXN2ZXTEvnVqw7pjaWNoIHByZW1lbm7DvWNoIOKAkyBrb25rcsOpdG5lIG9kICoqSERQIG5hIG9ieXZhdGXEvmEgKEdEUF9VU0QpKiogYSBvZCAqKnBvZGllbHUgemFtZXN0bmFub3N0aSB2IHBvxL5ub2hvc3BvZMOhcnN0dmUgKEFncmljdWx0dXJlKSoqLiAgCkJ1ZGVtZSBwb3Jvdm7DoXZhxaUgZHZhIG1vZGVseToKCi0gKiptb2RlbCoqIOKAkyBww7R2b2Ruw70gbGluZcOhcm55IG1vZGVsIHMgcHJlbWVubm91IGBHRFBfVVNEYCAgCi0gKiptb2RlbDIqKiDigJMgbW9kZWwgc28gemxvZ2FyaXRtb3ZhbsO9bSBIRFAgKGBsb2coR0RQX1VTRClgKSwga3RvcsO9IG3DtMW+ZSBvZHN0csOhbmnFpSB2cGx5diBvZMS+YWhsw71jaCBob2Ruw7R0IGEgc3RhYmlsaXpvdmHFpSB2YXJpYW5jaXUKCgoKYGBge3J9CgpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGF0Y2h3b3JrKQoKIyDFoHR2b3JjZSByZXrDrWR1w60geiBww7R2b2Ruw6lobyBtb2RlbHUKcDEgPC0gZ2dwbG90KHVkYWplLnksIGFlcyh4ID0gR0RQX1VTRCwgeSA9IHJlc2lkKG1vZGVsKV4yKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjgsIGNvbG9yID0gImRhcmtyZWQiKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSwgY29sb3IgPSAicGluayIsIGxpbmV3aWR0aCA9IDEuNSkgKwogIGxhYnMoeCA9ICJIRFAgbmEgb2J5dmF0ZcS+YSAoR0RQX1VTRCkiLCAKICAgICAgIHkgPSAixaB0dm9yY2UgcmV6w61kdcOtIiwKICAgICAgIHRpdGxlID0gIlNxdWFyZWQgUmVzaWR1YWxzIHZzIEdEUF9VU0QgKG1vZGVsKSIpICsKICB0aGVtZV9taW5pbWFsKCkKCiMgRHJ1aMO9IGdyYWY6IHBvxL5ub2hvc3BvZMOhcnN0dm8KcDIgPC0gZ2dwbG90KHVkYWplLnksIGFlcyh4ID0gQWdyaWN1bHR1cmUsIHkgPSByZXNpZChtb2RlbCleMikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC44LCBjb2xvciA9ICJkYXJrYmx1ZSIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFLCBjb2xvciA9ICJza3libHVlIiwgbGluZXdpZHRoID0gMS41KSArCiAgbGFicyh4ID0gIlBvZGllbCB6YW1lc3RuYW5vc3RpIHYgcG/Evm5vaG9zcG9kw6Fyc3R2ZSAoJSkiLCAKICAgICAgIHkgPSAixaB0dm9yY2UgcmV6w61kdcOtIiwKICAgICAgIHRpdGxlID0gIlNxdWFyZWQgUmVzaWR1YWxzIHZzIEFncmljdWx0dXJlIChtb2RlbCkiKSArCiAgdGhlbWVfbWluaW1hbCgpCgojIFpvYnJhemVuaWUgdmVkxL5hIHNlYmEKcDEgKyBwMgoKYGBgCgojIyMgSW50ZXJwcmV0w6FjaWEgdsO9c2xlZGtvdgoKViBncmFmZSAqKuKAnsWgdHZvcmNlIHJlesOtZHXDrSB2cyBHRFBfVVNE4oCcKiogbW/Fvm5vIHZpZGllxaUsIMW+ZSBwcmkgbmnFvsWhw61jaCBob2Rub3TDoWNoIEhEUCBqZSByb3pwdHlsIHJlesOtZHXDrSB2w6TEjcWhw60gYSBzIHJhc3TDumNpbSBIRFAgc2Egem5pxb51amUuICAKVG8gbmF6bmHEjXVqZSwgxb5lICoqdiBla29ub21pY2t5IHNsYWLFocOtY2gga3Jhamluw6FjaCBqZSBuZXphbWVzdG5hbm9zxaUgbWVuZWogc3RhYmlsbsOhKiosIHphdGlhxL4gxI1vIHZvIHZ5c3BlbMO9Y2ggZWtvbm9taWvDoWNoIHPDuiBvZGNow71sa3kgb2QgbW9kZWx1IG1lbsWhaWUuICAKUm96cHR5bCB0ZWRhICoqbmllIGplIMO6cGxuZSBrb27FoXRhbnRuw70qKiwgxI1vIHBvdWthenVqZSBuYSBtaWVybnUgaGV0ZXJvc2tlZGFzdGljaXR1IHZvIHZ6xaVhaHUgayBIRFAuCgpWIGRydWhvbSBncmFmZSAqKuKAnsWgdHZvcmNlIHJlesOtZHXDrSB2cyBBZ3JpY3VsdHVyZeKAnCoqIHNhIGJvZHkgcm96a2xhZGFqw7ogcG9tZXJuZSByb3Zub21lcm5lIGJleiB2aWRpdGXEvm7DqWhvIHRyZW5kdS4gIApUbyB6bmFtZW7DoSwgxb5lICoqcG9kaWVsIHphbWVzdG5hbm9zdGkgdiBwb8S+bm9ob3Nwb2TDoXJzdHZlIHByYXZkZXBvZG9ibmUgbmVzcMO0c29idWplIGhldGVyb3NrZWRhc3RpY2l0dSoqIGEgamVobyB2cGx5diBuYSByb3pwdHlsIGNow71iIGplIG1pbmltw6FsbnkuCgpDZWxrb3ZvIG1vxb5ubyBwb3ZlZGHFpSwgxb5lICoqcm96cHR5bCByZXrDrWR1w60gc2EgbWVuw60gcHJlZG92xaFldGvDvW0gcyBIRFAqKiwgbmllIHMgb3N0YXRuw71taSBwcmVtZW5uw71taS4gIApWIMSPYWzFoW9tIGtyb2t1IHByZXRvIHBvdcW+aWplbWUgKipsb2dhcml0bWlja8O6IHRyYW5zZm9ybcOhY2l1IEhEUCoqLCBrdG9yw6EgYnkgbWFsYSB0w7p0byBuZXJvdm5vbWVybm9zxaUgem1pZXJuacWlIGEgbW9kZWwgc3ByZXNuacWlLgoKCmBgYHtyfQptb2RlbDIgPC0gbG0oVW5lbXBsb3ltZW50LlJhdGUgfiBBZ3JpY3VsdHVyZSArIEluZHVzdHJ5ICsgU2VydmljZXMgKyBsb2coR0RQX1VTRCksIGRhdGEgPSB1ZGFqZS55KQpgYGAKCgpgYGB7cn0KIyBNb2RlbCBzIGxvZ2FyaXRtb20gSERQCm1vZGVsMiA8LSBsbShVbmVtcGxveW1lbnQuUmF0ZSB+IEFncmljdWx0dXJlICsgSW5kdXN0cnkgKyBTZXJ2aWNlcyArIGxvZyhHRFBfVVNEKSwgZGF0YSA9IHVkYWplLnkpCgojIFNrw7ptYW5pZSBoZXRlcm9za2VkYXN0aWNpdHkg4oCTIHZpenXDoWxuZSBwcmUgbW9kZWwyCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwYXRjaHdvcmspCgojIMWgdHZvcmNlIHJlesOtZHXDrSB2cyBsb2coR0RQKQpwMSA8LSBnZ3Bsb3QodWRhamUueSwgYWVzKHggPSBsb2coR0RQX1VTRCksIHkgPSByZXNpZChtb2RlbDIpXjIpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNiwgY29sb3IgPSAiZGFya2dyZWVuIikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UsIGNvbG9yID0gImdyZWVuIiwgbGluZXdpZHRoID0gMSkgKwogIGxhYnMoeCA9ICJsb2coSERQIG5hIG9ieXZhdGXEvmEpIiwgCiAgICAgICB5ID0gIsWgdHZvcmNlIHJlesOtZHXDrSIsCiAgICAgICB0aXRsZSA9ICJTcXVhcmVkIFJlc2lkdWFscyB2cyBsb2coR0RQX1VTRCkgKG1vZGVsMikiKSArCiAgdGhlbWVfbWluaW1hbCgpCgojIMWgdHZvcmNlIHJlesOtZHXDrSB2cyBwb8S+bm9ob3Nwb2TDoXJzdHZvCnAyIDwtIGdncGxvdCh1ZGFqZS55LCBhZXMoeCA9IEFncmljdWx0dXJlLCB5ID0gcmVzaWQobW9kZWwyKV4yKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjYsIGNvbG9yID0gInB1cnBsZTQiKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSwgY29sb3IgPSAib3JjaGlkIiwgbGluZXdpZHRoID0gMSkgKwogIGxhYnMoeCA9ICJBZ3JpY3VsdHVyZSIsIAogICAgICAgeSA9ICLFoHR2b3JjZSByZXrDrWR1w60iLAogICAgICAgdGl0bGUgPSAiU3F1YXJlZCBSZXNpZHVhbHMgdnMgQWdyaWN1bHR1cmUgKG1vZGVsMikiKSArCiAgdGhlbWVfbWluaW1hbCgpCgojIFpvYnJhemVuaWUgZ3JhZm92IHZlZMS+YSBzZWJhCnAxICsgcDIKCmBgYAoKCgojIyMgSW50ZXJwcmV0w6FjaWEgdsO9c2xlZGtvdiBwbyBsb2dhcml0bWlja2VqIHRyYW5zZm9ybcOhY2lpIEhEUAoKUG8gYXBsaWtvdmFuw60gbG9nYXJpdG1pY2tlaiB0cmFuc2Zvcm3DoWNpZSBIRFAgdmlkw61tZSwgxb5lIHJvenB0eWwgcmV6w61kdcOtIHNhICoqdsO9cmF6bmUgc3RhYmlsaXpvdmFsKiouICAKViBncmFmZSAqKuKAnsWgdHZvcmNlIHJlesOtZHXDrSB2cyBsb2coR0RQX1VTRCnigJ0qKiBqZSBMT0VTUyBrcml2a2EgKHplbGVuw6EgbMOtbmlhKSB0YWttZXIgdm9kb3Jvdm7DoSBhIGJvZHkgc8O6IHJvemxvxb5lbsOpIHJvdm5vbWVybmUgbmFwcmllxI0gaG9kbm90YW1pIEhEUC4gIApUbyB6bmFtZW7DoSwgxb5lICoqbG9nYXJpdG1pY2vDoSB0cmFuc2Zvcm3DoWNpYSBvZHN0csOhbmlsYSB2w6TEjcWhaW51IGhldGVyb3NrZWRhc3RpY2l0eSoqLCBrdG9yw6EgYm9sYSBwcsOtdG9tbsOhIHYgcMO0dm9kbm9tIG1vZGVsaS4KClYgZ3JhZmUgKirigJ7FoHR2b3JjZSByZXrDrWR1w60gdnMgQWdyaWN1bHR1cmXigJ0qKiBvc3TDoXZhIHJvenB0eWwgYm9kb3YgcG9tZXJuZSByb3Zub21lcm7DvSBhIGJleiBqYXNuw6lobyB0cmVuZHUuICAKVG8gcG90dnJkenVqZSwgxb5lICoqcG9kaWVsIHphbWVzdG5hbm9zdGkgdiBwb8S+bm9ob3Nwb2TDoXJzdHZlIG5lbcOhIHrDoXNhZG7DvSB2cGx5diBuYSB2YXJpYWJpbGl0dSBjaMO9YioqLgoKQ2Vsa292byBtw7TFvmVtZSB1emF2cmllxaUsIMW+ZSBwbyBsb2dhcml0bWlja2VqIMO6cHJhdmUgSERQIHNhIG1vZGVsIHNwcsOhdmEgKipzdGFiaWxuZWrFoWllIGEgbGVwxaFpZSBzcMS6xYhhIHByZWRwb2tsYWQga29uxaF0YW50bsOpaG8gcm96cHR5bHUgKGhvbW9za2VkYXN0aWNpdHkpKiouICAKVGFrdG8gdXByYXZlbsO9IG1vZGVsIGplIHByZXRvICoqc3BvxL5haGxpdmVqxaHDrSBhIHZob2RuZWrFocOtIG5hIGVrb25vbWlja8O6IGludGVycHJldMOhY2l1KiouCgojIyBUZXN0b3ZhbmllIHByw610b21ub3N0aSBoZXRlcm9za2VkYXN0aWNpdHkKCmBgYHtyfQojIEluc3RhbGwgKGlmIG5vdCB5ZXQgaW5zdGFsbGVkKQojIGluc3RhbGwucGFja2FnZXMoImxtdGVzdCIpCgojIExvYWQgdGhlIHBhY2thZ2UKbGlicmFyeShsbXRlc3QpCgojIFJ1biB0aGUgQnJldXNjaOKAk1BhZ2FuIHRlc3QKYnB0ZXN0KG1vZGVsKQoKYGBgCmBgYHtyfQojIEluc3RhbGwgKGlmIG5vdCB5ZXQgaW5zdGFsbGVkKQojIGluc3RhbGwucGFja2FnZXMoImxtdGVzdCIpCgojIExvYWQgdGhlIHBhY2thZ2UKbGlicmFyeShsbXRlc3QpCgojIFJ1biB0aGUgQnJldXNjaOKAk1BhZ2FuIHRlc3QKYnB0ZXN0KG1vZGVsMikKCmBgYAoKIyMjIEludGVycHJldMOhY2lhIHbDvXNsZWRrb3YgdGVzdHUgaGV0ZXJvc2tlZGFzdGljaXR5CgpQb2TEvmEgdsO9c2xlZGtvdiAqKkJyZXVzY2jigJNQYWdhbiB0ZXN0dSoqOgoKLSBwcmUgcMO0dm9kbsO9IG1vZGVsICgqbW9kZWwqKSBwbGF0w606ICAKICAqKkJQID0gNy4xNjcqKiwgZGYgPSAzLCAqKnAtdmFsdWUgPSAwLjA2Njc2KioKCi0gcHJlIG1vZGVsIHNvIHpsb2dhcml0bW92YW7DvW0gSERQICgqbW9kZWwyKikgcGxhdMOtOiAgCiAgKipCUCA9IDguMTM3NioqLCBkZiA9IDQsICoqcC12YWx1ZSA9IDAuMDg2NjcqKgoKViBvYm9jaCBwcsOtcGFkb2NoIGplIGhvZG5vdGEgKnAtdmFsdWUqIHbDpMSNxaFpYSBha28gMC4wNSwgdGFrxb5lICoqbmV6YW1pZXRhbWUgbnVsb3bDuiBoeXBvdMOpenUqKi4gIApUbyB6bmFtZW7DoSwgxb5lICoqdiBtb2RlbG9jaCBuaWUgamUgcHLDrXRvbW7DoSB2w716bmFtbsOhIGhldGVyb3NrZWRhc3RpY2l0YSoqIOKAkyB0ZWRhIHJvenB0eWwgY2jDvWIgamUgcHJpYmxpxb5uZSByb3ZuYWvDvS4KCkhvZG5vdGEgKnAtdmFsdWUqIHYgcMO0dm9kbm9tIG1vZGVsaSAoKm1vZGVsKikgamUgdsWhYWsgdHJvY2h1IG5pxb7FoWlhIChhc2kgMC4wNyksIMSNbyBtw7TFvmUgbmF6bmHEjW92YcWlICoqbWllcm55IG7DoXpuYWsgbmVyb3ZuYWvDqWhvIHJvenB0eWx1KiouICAKViBtb2RlbGkgcyBsb2dhcml0bW9tIEhEUCAoKm1vZGVsMiopIHNhIHRlbnRvIHByb2Jsw6ltIGXFoXRlIHZpYWMgem1pZXJuaWwsIHRha8W+ZSBtw7TFvmVtZSBwb3ZlZGHFpSwgIArFvmUgKipsb2dhcml0bWlja8OhIMO6cHJhdmEgSERQIHBvbW9obGEgemxlcMWhacWlIHZsYXN0bm9zdGkgbW9kZWx1KiouCgpDZWxrb3ZvIHRlZGEgKiptb2RlbDIqKiBzcMS6xYhhIHByZWRwb2tsYWR5IGxpbmXDoXJuZWogcmVncmVzaWUgbGVwxaFpZSBhIGplICoqc3BvxL5haGxpdmVqxaHDrSBuYSBpbnRlcnByZXTDoWNpdSoqLgoKCgpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoInNhbmR3aWNoIikKI2luc3RhbGwucGFja2FnZXMoImxtdGVzdCIpCmxpYnJhcnkoc2FuZHdpY2gpCmxpYnJhcnkobG10ZXN0KQpjb2VmdGVzdChtb2RlbCwgdmNvdiA9IHZjb3ZIQyhtb2RlbCkpCgoKYGBgCgoKIyMjIEludGVycHJldMOhY2lhIHbDvXNsZWRrb3YgcG8gV2hpdGUga29yZWtjaWkKClBvIGFwbGlrb3ZhbsOtIHR6di4gKipXaGl0ZSBrb3Jla2NpZSoqIChyb2J1c3Ruw6kgc21lcm9kYWpuw6kgY2h5YnkpIHNhIHNtZXJvZGFqbsOpIG9kaGFkeSB1cHJhdmlsaSB0YWssIGFieSBib2xpIHbDvXNsZWRreSBzcG/EvmFobGl2w6kgYWogdiBwcsOtcGFkZSwgxb5lIGJ5IHJvenB0eWwgY2jDvWIgbmVib2wgcm92bmFrw70uCgpaIHbDvXNsZWRrb3YgdnlwbMO9dmEsIMW+ZToKLSAqKkFncmljdWx0dXJlKiogbcOhICoqbmVnYXTDrXZueSBhIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IHZwbHl2Kiog4oCTIHRlZGEgxI3DrW0gdsOkxI3FocOtIHBvZGllbCDEvnVkw60gcHJhY3VqZSB2IHBvxL5ub2hvc3BvZMOhcnN0dmUsIHTDvW0gamUgc3ByYXZpZGxhICoqbmnFvsWhaWEgbmV6YW1lc3RuYW5vc8WlKiouICAKLSAqKmxvZyhHRFApKiogamUgdGllxb4gKipuZWdhdMOtdm55IGEgdsO9em5hbW7DvSoqLCDEjW8gem5hbWVuw6EsIMW+ZSAqKmJvaGF0xaFpZSBrcmFqaW55IG1hasO6IG5pxb7FoWl1IG1pZXJ1IG5lemFtZXN0bmFub3N0aSoqLiAgCi0gKipJbmR1c3RyeSoqIG5pZSBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSwgdGFrxb5lIGplaG8gdnBseXYgbmEgbmV6YW1lc3RuYW5vc8WlICoqbmllIGplIGplZG5vem5hxI1uw70qKi4gIAotIEtvbsWhdGFudGEgKEludGVyY2VwdCkgamUgdsO9em5hbW7DoSwgxI1vIHBvdHZyZHp1amUsIMW+ZSBtb2RlbCBha28gY2Vsb2sgamUgKipzdGFiaWxuw70gYSB2aG9kbsO9IG5hIGludGVycHJldMOhY2l1KiouCgpWw71zbGVka3kgcG8gdGVqdG8ga29yZWtjaWkgc8O6IHRlZGEgKipwcmVzbmVqxaFpZSoqIGEgbWVuZWogb3ZwbHl2bmVuw6kgdMO9bSwgxI1pIG1hasO6IGtyYWppbnkgcsO0em55IHJvenB0eWwgdiDDumRham9jaC4KCgojIyMgWsOhdmVyIMSNYXN0aSBvIGhldGVyb3NrZWRhc3RpY2l0ZQoKTmEgesOha2xhZGUgdGVzdG92IGEgZ3JhZm92IG3DtMW+ZW1lIHBvdmVkYcWlLCDFvmUgdiBuYcWhaWNoIGTDoXRhY2ggc2EgKipuZXBvdHZyZGlsYSBwcsOtdG9tbm9zxaUgdsO9cmF6bmVqIGhldGVyb3NrZWRhc3RpY2l0eSoqLiAgClJvenB0eWwgcmV6w61kdcOtIGplIHYgbW9kZWxvY2ggcG9tZXJuZSBzdGFiaWxuw70sIG5ham3DpCBwbyBsb2dhcml0bWlja2VqIHRyYW5zZm9ybcOhY2lpIEhEUC4gIApXaGl0ZSBrb3Jla2NpYSB1a8OhemFsYSwgxb5lIGFqIGtlYnkgc2EgdiBkw6F0YWNoIG1pZXJuYSBuZXJvdm5vbWVybm9zxaUgdnlza3l0bGEsIHbDvXNsZWRreSBtb2RlbHUgb3N0w6F2YWrDuiAqKnNwb8S+YWhsaXbDqSBhIGludGVycHJldG92YXRlxL5uw6kqKi4KCkNlbGtvdm8gbW/Fvm5vIHpocm7DusWlLCDFvmUgKiptb2RlbDIgKHNvIHpsb2dhcml0bW92YW7DvW0gSERQKSoqIGxlcMWhaWUgc3DEusWIYSBwcmVkcG9rbGFkeSBsaW5lw6FybmVqIHJlZ3Jlc2llIGEgcG9za3l0dWplICoqc3RhYmlsbmVqxaFpZSBvZGhhZHkqKiwgIArEjW8gem5hbWVuw6EsIMW+ZSBobyBtw7TFvmVtZSBwb3Zhxb5vdmHFpSB6YSAqKnZob2Ruw70gbsOhc3Ryb2ogbmEgdnlzdmV0bGVuaWUgbWllcnkgbmV6YW1lc3RuYW5vc3RpIG1lZHppIGtyYWppbmFtaS4qKgo=