knitr::opts_chunk$set(
    echo = TRUE,
    message = FALSE,
    warning = FALSE
)

Import údajov z .csv

udaje <- read.csv2("data.csv",header=TRUE,sep=";",dec=".", fileEncoding = "Windows-1250") 
head(udaje)                                    #       niekolko prvych riadkov
colnames(udaje)                                         # nazvy premennych
 [1] "country_name"              
 [2] "country_id"                
 [3] "year"                      
 [4] "Inflation_CPI"             
 [5] "GDP_Current_USD"           
 [6] "GDP_per_Capita_Current_USD"
 [7] "Unemployment_Rate"         
 [8] "Inflation_GDP_Deflator"    
 [9] "GDP_Growth_Annual"         
[10] "Current_Account_Balance"   
[11] "Government_Expense"        
[12] "Government_Revenue"        
[13] "Tax_Revenue"               
[14] "Gross_National_Income"     
[15] "Public_Debt"               

Grafy

Výber a následné triedenie

library(dplyr)
 
data.csv <- udaje %>%
  select(country_name, year, Unemployment_Rate, GDP_Growth_Annual, GDP_per_Capita_Current_USD)

Rast HDP podľa rokov

ggplot(udaje, aes(x = year, y = GDP_Growth_Annual)) +
  geom_line(color = "darkblue", size = 1) +
  geom_point(color = "blue", size = 2) +
  theme_minimal() +
  labs(
    title = "Rast HDP podľa rokov",
    x = "Rok",
    y = "Ročný rast HDP (%)"
  )

Graf znázorňuje ročný rast hrubého domáceho produktu (HDP) v období rokov 2010 – 2022. Z údajov vidno, že vývoj rastu HDP bol kolísavý, s viacerými obdobiami spomalenia aj oživenia hospodárskej aktivity. V rokoch 2010 až 2013 tempo rastu postupne klesalo, čo odráža doznievanie finančnej krízy. Nasledovalo obdobie mierneho oživenia (2014–2018), kedy HDP opäť rástol rýchlejšie. Výrazný pokles v roku 2020 súvisí s dôsledkami pandémie COVID-19, ktorá viedla k dočasnému prepadu ekonomiky. V roku 2021 nastalo prudké zotavenie, no v roku 2022 bol rast opäť miernejší – pravdepodobne vplyvom rastúcich cien energií a geopolitickej neistoty.

Scatter plot

Phillipsova krivka - vzťah medzi infláciou a nezamestnanosťou

ggplot(udaje, aes(x = Unemployment_Rate, y = Inflation_CPI, color = as.factor(year))) +
  geom_point(size = 3) +
  geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") +  # trendová čiara
  theme_minimal() +
  labs(
    title = "Phillipsova krivka: Inflácia a nezamestnanosť",
    subtitle = "Vzťah medzi infláciou (CPI) a mierou nezamestnanosti podľa rokov",
    x = "Miera nezamestnanosti (%)",
    y = "Inflácia (CPI, %)",
    color = "Rok"
  )

Graf zobrazuje Phillipsovu krivku, ktorá vyjadruje vzťah medzi mierou nezamestnanosti a infláciou (CPI) v jednotlivých rokoch sledovaného obdobia. Z trendovej priamky (zobrazenej prerušovanou čiarou) je vidieť mierne negatívny vzťah – teda v rokoch, keď bola nezamestnanosť vyššia, inflácia mala tendenciu byť nižšia, a naopak. Tento výsledok je v súlade s klasickou Phillipsovou hypotézou, podľa ktorej existuje inverzný vzťah medzi infláciou a nezamestnanosťou: rast dopytu v hospodárstve znižuje nezamestnanosť, ale zároveň zvyšuje cenovú hladinu.

Okunov zákon - vzťah medzi nezamestnanosťou a rastom HDP

ggplot(udaje, aes(x = GDP_Growth_Annual, y = Unemployment_Rate, color = as.factor(year))) +
  geom_point(size = 3) +
  geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") +
  theme_minimal() +
  labs(
    title = "Okunov zákon: Rast HDP a nezamestnanosť",
    x = "Ročný rast HDP (%)",
    y = "Miera nezamestnanosti (%)",
    color = "Rok"
  )

Graf zobrazuje Okunov zákon, teda vzťah medzi ročným rastom HDP a mierou nezamestnanosti v jednotlivých rokoch. V ideálnom prípade by mal mať tento vzťah negatívny smer – vyšší rast HDP by mal viesť k poklesu nezamestnanosti. V zobrazených údajoch však trendová čiara naznačuje mierne pozitívny sklon, čo znamená, že v analyzovanom období nebol vzťah medzi hospodárskym rastom a nezamestnanosťou výrazný alebo jednoznačný. Tento výsledok môže byť spôsobený štrukturálnymi zmenami na trhu práce, oneskoreným efektom hospodárskeho cyklu, alebo mimoriadnymi udalosťami (napr. pandémia COVID-19 v roku 2020).

Základné štatistiky

knitr - tabuľka

library(dplyr)
library(knitr)
library(kableExtra)

# Zhrnutie základných štatistík za celé obdobie
stats_all <- udaje %>%
  summarise(
    n_years = n(),
    mean_gdp   = mean(GDP_Growth_Annual, na.rm = TRUE),
    sd_gdp     = sd(GDP_Growth_Annual, na.rm = TRUE),
    min_gdp    = min(GDP_Growth_Annual, na.rm = TRUE),
    max_gdp    = max(GDP_Growth_Annual, na.rm = TRUE),
    mean_infl  = mean(Inflation_CPI, na.rm = TRUE),
    min_infl   = min(Inflation_CPI, na.rm = TRUE),
    max_infl   = max(Inflation_CPI, na.rm = TRUE),
    mean_unemp = mean(Unemployment_Rate, na.rm = TRUE),
    min_unemp  = min(Unemployment_Rate, na.rm = TRUE),
    max_unemp  = max(Unemployment_Rate, na.rm = TRUE)
  )

stats_all %>%
  kable(digits = 2, caption = "Základné štatistiky (2010–2022)") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped","hover","condensed"))
Základné štatistiky (2010–2022)
n_years mean_gdp sd_gdp min_gdp max_gdp mean_infl min_infl max_infl mean_unemp min_unemp max_unemp
13 2.64 2.46 -2.59 6.79 2.56 -0.52 12.77 9.93 5.76 14.39

V rokoch 2010–2022 dosiahol priemerný rast HDP 2,64 %, pričom kolísal od –2,59 % do 6,79 %. Priemerná inflácia bola 2,56 % s výrazným nárastom v posledných rokoch (max. 12,77 %). Miera nezamestnanosti dosiahla v priemere 9,93 %, s poklesom po roku 2013 a opätovným rastom počas pandémie. Údaje naznačujú mierny, no nestabilný ekonomický rast, zrýchlenie inflácie a postupné zlepšovanie trhu práce v sledovanom období.

library(dplyr)
library(knitr)
library(kableExtra)

# Ročné hodnoty a medziročná zmena
trend_table <- udaje %>%
  arrange(year) %>%
  transmute(
    Rok = year,
    Rast_HDP = GDP_Growth_Annual,
    Inflácia = Inflation_CPI,
    Nezamestnanosť = Unemployment_Rate,
    Δ_HDP = GDP_Growth_Annual - dplyr::lag(GDP_Growth_Annual),
    Δ_Inflácia = Inflation_CPI - dplyr::lag(Inflation_CPI),
    Δ_Nezamestnanosť = Unemployment_Rate - dplyr::lag(Unemployment_Rate)
  )

trend_table %>%
  kable(digits = 2, caption = "Vývoj makroekonomických ukazovateľov podľa rokov") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped","hover","condensed")) %>%
  row_spec(0, bold = TRUE, background = "#f2f2f2")
Vývoj makroekonomických ukazovateľov podľa rokov
Rok Rast_HDP Inflácia Nezamestnanosť Δ_HDP Δ_Inflácia Δ_Nezamestnanosť
2010 6.79 0.96 14.39 NA NA NA
2011 2.56 3.92 13.63 -4.23 2.96 -0.75
2012 1.57 3.61 13.97 -0.99 -0.31 0.33
2013 0.70 1.40 14.23 -0.87 -2.21 0.26
2014 2.71 -0.08 11.54 2.00 -1.48 -2.69
2015 5.18 -0.33 11.49 2.47 -0.25 -0.04
2016 1.95 -0.52 9.68 -3.23 -0.19 -1.81
2017 2.87 1.31 8.14 0.93 1.83 -1.54
2018 4.06 2.51 6.54 1.19 1.20 -1.60
2019 2.28 2.66 5.76 -1.79 0.15 -0.78
2020 -2.59 1.94 6.72 -4.86 -0.73 0.96
2021 5.73 3.15 6.89 8.31 1.21 0.17
2022 0.45 12.77 6.14 -5.28 9.62 -0.75

Tabuľka zachytáva vývoj základných makroekonomických ukazovateľov – rast HDP, infláciu (CPI) a mieru nezamestnanosti – v období rokov 2010 až 2022, vrátane medziročných zmien týchto ukazovateľov. V rokoch 2010–2022 prešla ekonomika výraznými cyklickými zmenami. Po silnom raste HDP v roku 2010 (6,79 %) nasledovalo spomalenie, no od roku 2014 sa hospodárstvo opäť oživilo. Najväčší prepad nastal v roku 2020 (–2,59 %) v dôsledku pandémie COVID-19, po ktorom nasledovalo rýchle zotavenie (2021: 5,73 %). Inflácia bola väčšinu obdobia nízka až mierna, v rokoch 2014–2016 dokonca záporná, no v roku 2022 prudko vzrástla na 12,77 % vplyvom rastu cien energií a globálnych kríz. Nezamestnanosť postupne klesala z 14,39 % (2010) na približne 6 % po roku 2018, čo naznačuje zlepšenie trhu práce. Celkovo údaje ukazujú mierny dlhodobý rast HDP, zrýchlenie inflácie na konci obdobia a stabilizáciu nezamestnanosti na nízkej úrovni.

Testovanie hypotéz

T-test

#### t-test: Inflácia pred a po roku 2015
infl_before <- udaje$Inflation_CPI[udaje$year %in% 2010:2015]
infl_after  <- udaje$Inflation_CPI[udaje$year %in% 2016:2022]

t.test.result <- t.test(infl_before, infl_after)
print(t.test.result)

    Welch Two Sample t-test

data:  infl_before and infl_after
t = -1.0211, df = 8.3061, p-value = 0.336
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -5.917647  2.269223
sample estimates:
mean of x mean of y 
 1.580249  3.404461 

T-test porovnáva priemernú infláciu pred a po roku 2015 (teda dve obdobia: 2010–2015 vs. 2016–2022.

Hypotézy:

H₀: Priemerná inflácia v rokoch 2010–2015 = priemerná inflácia v rokoch 2016–2022

H₁: Priemerná inflácia v týchto obdobiach sa líši

Výsledky testu: t = –1.02, p = 0.336, priemer_2010–2015 = 1.58 %, priemer_2016–2022 = 3.40 %.

Interpretácia: Keďže p > 0.05, nulová hypotéza sa nezamieta. Rozdiel medzi priemernou infláciou v dvoch obdobiach nie je štatisticky významný, hoci po roku 2015 možno pozorovať mierny rast inflácie.

Linear Regression: predikcia inflácie

model <- lm(Inflation_CPI ~ GDP_Growth_Annual + Unemployment_Rate, data = udaje)
summary(model)

Call:
lm(formula = Inflation_CPI ~ GDP_Growth_Annual + Unemployment_Rate, 
    data = udaje)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.3672 -1.7001 -0.6009  0.9678  8.4357 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)  
(Intercept)         6.2698     3.0451   2.059   0.0665 .
GDP_Growth_Annual  -0.3063     0.4080  -0.751   0.4701  
Unemployment_Rate  -0.2920     0.2951  -0.989   0.3458  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.401 on 10 degrees of freedom
Multiple R-squared:  0.1636,    Adjusted R-squared:  -0.003705 
F-statistic: 0.9779 on 2 and 10 DF,  p-value: 0.4094

Hypotézy:

H₀: Rast HDP a nezamestnanosť nemajú vplyv na infláciu.

H₁: Aspoň jeden z týchto faktorov ovplyvňuje infláciu.

Výsledky: β₁ (HDP) = –0.31, p = 0.47 β₂ (Nezamestnanosť) = –0.29, p = 0.35 R² = 0.16, F-test p = 0.41

Interpretácia: Vplyv rastu HDP ani nezamestnanosti na infláciu nie je štatisticky významný (p > 0.05). Model vysvetľuje len malú časť variability inflácie, čo naznačuje, že infláciu ovplyvňujú aj iné faktory mimo trhu práce a hospodárskeho rastu.

LS0tCnRpdGxlOiAiUHLDoWNhIHMgZGF0YWLDoXpvdSAtIGltcG9ydCDDumRham92LCBncmFmeSwgxaF0YXRpc3Rpa3kiCmF1dGhvcjogIkJlYXRyaXggVMOzdGhvdsOhICA8YnI+CihzIHZ5dcW+aXTDrW0gdmVyZWpuZSBkb3N0dXBuw71jaCBrw7Nkb3YgYSBDaGF0R1BUKSIKZGF0ZTogIk9rdMOzYmVyIDIwMjUiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICB0aGVtZTogdW5pdGVkCiAgICBoaWdobGlnaHQ6IHRhbmdvCmVkaXRvcl9vcHRpb25zOiAKICBtYXJrZG93bjogCiAgICB3cmFwOiA3MgotLS0KCmBgYHtyfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgICBlY2hvID0gVFJVRSwKICAgIG1lc3NhZ2UgPSBGQUxTRSwKICAgIHdhcm5pbmcgPSBGQUxTRQopCmBgYAoKIyMgSW1wb3J0IMO6ZGFqb3YgeiAuY3N2IAoKYGBge3J9CnVkYWplIDwtIHJlYWQuY3N2MigiZGF0YS5jc3YiLGhlYWRlcj1UUlVFLHNlcD0iOyIsZGVjPSIuIiwgZmlsZUVuY29kaW5nID0gIldpbmRvd3MtMTI1MCIpIApoZWFkKHVkYWplKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgbmlla29sa28gcHJ2eWNoIHJpYWRrb3YKY29sbmFtZXModWRhamUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5henZ5IHByZW1lbm55Y2gKYGBgCgojIEdyYWZ5CgpWw71iZXIgYSBuw6FzbGVkbsOpIHRyaWVkZW5pZQpgYGB7cn0KbGlicmFyeShkcGx5cikKIApkYXRhLmNzdiA8LSB1ZGFqZSAlPiUKICBzZWxlY3QoY291bnRyeV9uYW1lLCB5ZWFyLCBVbmVtcGxveW1lbnRfUmF0ZSwgR0RQX0dyb3d0aF9Bbm51YWwsIEdEUF9wZXJfQ2FwaXRhX0N1cnJlbnRfVVNEKQpgYGAKCiMjIyBSYXN0IEhEUCBwb2TEvmEgcm9rb3YgCgpgYGB7cn0KZ2dwbG90KHVkYWplLCBhZXMoeCA9IHllYXIsIHkgPSBHRFBfR3Jvd3RoX0FubnVhbCkpICsKICBnZW9tX2xpbmUoY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gMSkgKwogIGdlb21fcG9pbnQoY29sb3IgPSAiYmx1ZSIsIHNpemUgPSAyKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKAogICAgdGl0bGUgPSAiUmFzdCBIRFAgcG9kxL5hIHJva292IiwKICAgIHggPSAiUm9rIiwKICAgIHkgPSAiUm/EjW7DvSByYXN0IEhEUCAoJSkiCiAgKQoKYGBgCkdyYWYgem7DoXpvcsWIdWplIHJvxI1uw70gcmFzdCBocnViw6lobyBkb23DoWNlaG8gcHJvZHVrdHUgKEhEUCkgdiBvYmRvYsOtIHJva292IDIwMTAg4oCTIDIwMjIuIFogw7pkYWpvdiB2aWRubywgxb5lIHbDvXZvaiByYXN0dSBIRFAgYm9sIGtvbMOtc2F2w70sIHMgdmlhY2Vyw71taSBvYmRvYmlhbWkgc3BvbWFsZW5pYSBhaiBvxb5pdmVuaWEgaG9zcG9kw6Fyc2tlaiBha3Rpdml0eS4KViByb2tvY2ggMjAxMCBhxb4gMjAxMyB0ZW1wbyByYXN0dSBwb3N0dXBuZSBrbGVzYWxvLCDEjW8gb2Ryw6HFvmEgZG96bmlldmFuaWUgZmluYW7EjW5laiBrcsOtenkuIE5hc2xlZG92YWxvIG9iZG9iaWUgbWllcm5laG8gb8W+aXZlbmlhICgyMDE04oCTMjAxOCksIGtlZHkgSERQIG9ww6TFpSByw6FzdG9sIHLDvWNobGVqxaFpZS4gVsO9cmF6bsO9IHBva2xlcyB2IHJva3UgMjAyMCBzw7p2aXPDrSBzIGTDtHNsZWRrYW1pIHBhbmTDqW1pZSBDT1ZJRC0xOSwga3RvcsOhIHZpZWRsYSBrIGRvxI1hc27DqW11IHByZXBhZHUgZWtvbm9taWt5LiBWIHJva3UgMjAyMSBuYXN0YWxvIHBydWRrw6kgem90YXZlbmllLCBubyB2IHJva3UgMjAyMiBib2wgcmFzdCBvcMOkxaUgbWllcm5lasWhw60g4oCTIHByYXZkZXBvZG9ibmUgdnBseXZvbSByYXN0w7pjaWNoIGNpZW4gZW5lcmdpw60gYSBnZW9wb2xpdGlja2VqIG5laXN0b3R5LgoKCiMjIyMgU2NhdHRlciBwbG90CgojIyMgUGhpbGxpcHNvdmEga3JpdmthIC0gdnrFpWFoIG1lZHppIGluZmzDoWNpb3UgYSBuZXphbWVzdG5hbm9zxaVvdQpgYGB7cn0KZ2dwbG90KHVkYWplLCBhZXMoeCA9IFVuZW1wbG95bWVudF9SYXRlLCB5ID0gSW5mbGF0aW9uX0NQSSwgY29sb3IgPSBhcy5mYWN0b3IoeWVhcikpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKyAgIyB0cmVuZG92w6EgxI1pYXJhCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKAogICAgdGl0bGUgPSAiUGhpbGxpcHNvdmEga3JpdmthOiBJbmZsw6FjaWEgYSBuZXphbWVzdG5hbm9zxaUiLAogICAgc3VidGl0bGUgPSAiVnrFpWFoIG1lZHppIGluZmzDoWNpb3UgKENQSSkgYSBtaWVyb3UgbmV6YW1lc3RuYW5vc3RpIHBvZMS+YSByb2tvdiIsCiAgICB4ID0gIk1pZXJhIG5lemFtZXN0bmFub3N0aSAoJSkiLAogICAgeSA9ICJJbmZsw6FjaWEgKENQSSwgJSkiLAogICAgY29sb3IgPSAiUm9rIgogICkKYGBgCkdyYWYgem9icmF6dWplIFBoaWxsaXBzb3Z1IGtyaXZrdSwga3RvcsOhIHZ5amFkcnVqZSB2esWlYWggbWVkemkgbWllcm91IG5lemFtZXN0bmFub3N0aSBhIGluZmzDoWNpb3UgKENQSSkgdiBqZWRub3RsaXbDvWNoIHJva29jaCBzbGVkb3ZhbsOpaG8gb2Jkb2JpYS4gWiB0cmVuZG92ZWogcHJpYW1reSAoem9icmF6ZW5laiBwcmVydcWhb3Zhbm91IMSNaWFyb3UpIGplIHZpZGllxaUgbWllcm5lIG5lZ2F0w612bnkgdnrFpWFoIOKAkyB0ZWRhIHYgcm9rb2NoLCBrZcSPIGJvbGEgbmV6YW1lc3RuYW5vc8WlIHZ5xaHFoWlhLCBpbmZsw6FjaWEgbWFsYSB0ZW5kZW5jaXUgYnnFpSBuacW+xaFpYSwgYSBuYW9wYWsuClRlbnRvIHbDvXNsZWRvayBqZSB2IHPDumxhZGUgcyBrbGFzaWNrb3UgUGhpbGxpcHNvdm91IGh5cG90w6l6b3UsIHBvZMS+YSBrdG9yZWogZXhpc3R1amUgaW52ZXJ6bsO9IHZ6xaVhaCBtZWR6aSBpbmZsw6FjaW91IGEgbmV6YW1lc3RuYW5vc8Wlb3U6CnJhc3QgZG9weXR1IHYgaG9zcG9kw6Fyc3R2ZSB6bmnFvnVqZSBuZXphbWVzdG5hbm9zxaUsIGFsZSB6w6Fyb3ZlxYggenZ5xaF1amUgY2Vub3bDuiBobGFkaW51LgoKIyMjIE9rdW5vdiB6w6Frb24gLSB2esWlYWggbWVkemkgbmV6YW1lc3RuYW5vc8Wlb3UgYSByYXN0b20gSERQCmBgYHtyfQpnZ3Bsb3QodWRhamUsIGFlcyh4ID0gR0RQX0dyb3d0aF9Bbm51YWwsIHkgPSBVbmVtcGxveW1lbnRfUmF0ZSwgY29sb3IgPSBhcy5mYWN0b3IoeWVhcikpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicygKICAgIHRpdGxlID0gIk9rdW5vdiB6w6Frb246IFJhc3QgSERQIGEgbmV6YW1lc3RuYW5vc8WlIiwKICAgIHggPSAiUm/EjW7DvSByYXN0IEhEUCAoJSkiLAogICAgeSA9ICJNaWVyYSBuZXphbWVzdG5hbm9zdGkgKCUpIiwKICAgIGNvbG9yID0gIlJvayIKICApCmBgYApHcmFmIHpvYnJhenVqZSBPa3Vub3YgesOha29uLCB0ZWRhIHZ6xaVhaCBtZWR6aSByb8SNbsO9bSByYXN0b20gSERQIGEgbWllcm91IG5lemFtZXN0bmFub3N0aSB2IGplZG5vdGxpdsO9Y2ggcm9rb2NoLiBWIGlkZcOhbG5vbSBwcsOtcGFkZSBieSBtYWwgbWHFpSB0ZW50byB2esWlYWggbmVnYXTDrXZueSBzbWVyIOKAkyB2ecWhxaHDrSByYXN0IEhEUCBieSBtYWwgdmllc8WlIGsgcG9rbGVzdSBuZXphbWVzdG5hbm9zdGkuIFYgem9icmF6ZW7DvWNoIMO6ZGFqb2NoIHbFoWFrIHRyZW5kb3bDoSDEjWlhcmEgbmF6bmHEjXVqZSBtaWVybmUgcG96aXTDrXZueSBza2xvbiwgxI1vIHpuYW1lbsOhLCDFvmUgdiBhbmFseXpvdmFub20gb2Jkb2LDrSBuZWJvbCB2esWlYWggbWVkemkgaG9zcG9kw6Fyc2t5bSByYXN0b20gYSBuZXphbWVzdG5hbm9zxaVvdSB2w71yYXpuw70gYWxlYm8gamVkbm96bmHEjW7DvS4gVGVudG8gdsO9c2xlZG9rIG3DtMW+ZSBiecWlIHNww7Rzb2JlbsO9IMWhdHJ1a3R1csOhbG55bWkgem1lbmFtaSBuYSB0cmh1IHByw6FjZSwgb25lc2tvcmVuw71tIGVmZWt0b20gaG9zcG9kw6Fyc2tlaG8gY3lrbHUsIGFsZWJvIG1pbW9yaWFkbnltaSB1ZGFsb3PFpWFtaSAobmFwci4gcGFuZMOpbWlhIENPVklELTE5IHYgcm9rdSAyMDIwKS4KCiMgWsOha2xhZG7DqSDFoXRhdGlzdGlreQoKIyMga25pdHIgLSB0YWJ1xL5rYQoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMgWmhybnV0aWUgesOha2xhZG7DvWNoIMWhdGF0aXN0w61rIHphIGNlbMOpIG9iZG9iaWUKc3RhdHNfYWxsIDwtIHVkYWplICU+JQogIHN1bW1hcmlzZSgKICAgIG5feWVhcnMgPSBuKCksCiAgICBtZWFuX2dkcCAgID0gbWVhbihHRFBfR3Jvd3RoX0FubnVhbCwgbmEucm0gPSBUUlVFKSwKICAgIHNkX2dkcCAgICAgPSBzZChHRFBfR3Jvd3RoX0FubnVhbCwgbmEucm0gPSBUUlVFKSwKICAgIG1pbl9nZHAgICAgPSBtaW4oR0RQX0dyb3d0aF9Bbm51YWwsIG5hLnJtID0gVFJVRSksCiAgICBtYXhfZ2RwICAgID0gbWF4KEdEUF9Hcm93dGhfQW5udWFsLCBuYS5ybSA9IFRSVUUpLAogICAgbWVhbl9pbmZsICA9IG1lYW4oSW5mbGF0aW9uX0NQSSwgbmEucm0gPSBUUlVFKSwKICAgIG1pbl9pbmZsICAgPSBtaW4oSW5mbGF0aW9uX0NQSSwgbmEucm0gPSBUUlVFKSwKICAgIG1heF9pbmZsICAgPSBtYXgoSW5mbGF0aW9uX0NQSSwgbmEucm0gPSBUUlVFKSwKICAgIG1lYW5fdW5lbXAgPSBtZWFuKFVuZW1wbG95bWVudF9SYXRlLCBuYS5ybSA9IFRSVUUpLAogICAgbWluX3VuZW1wICA9IG1pbihVbmVtcGxveW1lbnRfUmF0ZSwgbmEucm0gPSBUUlVFKSwKICAgIG1heF91bmVtcCAgPSBtYXgoVW5lbXBsb3ltZW50X1JhdGUsIG5hLnJtID0gVFJVRSkKICApCgpzdGF0c19hbGwgJT4lCiAga2FibGUoZGlnaXRzID0gMiwgY2FwdGlvbiA9ICJaw6FrbGFkbsOpIMWhdGF0aXN0aWt5ICgyMDEw4oCTMjAyMikiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwiaG92ZXIiLCJjb25kZW5zZWQiKSkKYGBgClYgcm9rb2NoIDIwMTDigJMyMDIyIGRvc2lhaG9sIHByaWVtZXJuw70gcmFzdCBIRFAgMiw2NCAlLCBwcmnEjW9tIGtvbMOtc2FsIG9kIOKAkzIsNTkgJSBkbyA2LDc5ICUuIFByaWVtZXJuw6EgaW5mbMOhY2lhIGJvbGEgMiw1NiAlIHMgdsO9cmF6bsO9bSBuw6FyYXN0b20gdiBwb3NsZWRuw71jaCByb2tvY2ggKG1heC4gMTIsNzcgJSkuCk1pZXJhIG5lemFtZXN0bmFub3N0aSBkb3NpYWhsYSB2IHByaWVtZXJlIDksOTMgJSwgcyBwb2tsZXNvbSBwbyByb2t1IDIwMTMgYSBvcMOkdG92bsO9bSByYXN0b20gcG/EjWFzIHBhbmTDqW1pZS4gw5pkYWplIG5hem5hxI11asO6IG1pZXJueSwgbm8gbmVzdGFiaWxuw70gZWtvbm9taWNrw70gcmFzdCwKenLDvWNobGVuaWUgaW5mbMOhY2llIGEgcG9zdHVwbsOpIHpsZXDFoW92YW5pZSB0cmh1IHByw6FjZSB2IHNsZWRvdmFub20gb2Jkb2LDrS4KCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgojIFJvxI1uw6kgaG9kbm90eSBhIG1lZHppcm/EjW7DoSB6bWVuYQp0cmVuZF90YWJsZSA8LSB1ZGFqZSAlPiUKICBhcnJhbmdlKHllYXIpICU+JQogIHRyYW5zbXV0ZSgKICAgIFJvayA9IHllYXIsCiAgICBSYXN0X0hEUCA9IEdEUF9Hcm93dGhfQW5udWFsLAogICAgSW5mbMOhY2lhID0gSW5mbGF0aW9uX0NQSSwKICAgIE5lemFtZXN0bmFub3PFpSA9IFVuZW1wbG95bWVudF9SYXRlLAogICAgzpRfSERQID0gR0RQX0dyb3d0aF9Bbm51YWwgLSBkcGx5cjo6bGFnKEdEUF9Hcm93dGhfQW5udWFsKSwKICAgIM6UX0luZmzDoWNpYSA9IEluZmxhdGlvbl9DUEkgLSBkcGx5cjo6bGFnKEluZmxhdGlvbl9DUEkpLAogICAgzpRfTmV6YW1lc3RuYW5vc8WlID0gVW5lbXBsb3ltZW50X1JhdGUgLSBkcGx5cjo6bGFnKFVuZW1wbG95bWVudF9SYXRlKQogICkKCnRyZW5kX3RhYmxlICU+JQogIGthYmxlKGRpZ2l0cyA9IDIsIGNhcHRpb24gPSAiVsO9dm9qIG1ha3JvZWtvbm9taWNrw71jaCB1a2F6b3ZhdGXEvm92IHBvZMS+YSByb2tvdiIpICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFLCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCJob3ZlciIsImNvbmRlbnNlZCIpKSAlPiUKICByb3dfc3BlYygwLCBib2xkID0gVFJVRSwgYmFja2dyb3VuZCA9ICIjZjJmMmYyIikKYGBgClRhYnXEvmthIHphY2h5dMOhdmEgdsO9dm9qIHrDoWtsYWRuw71jaCBtYWtyb2Vrb25vbWlja8O9Y2ggdWthem92YXRlxL5vdiDigJMgcmFzdCBIRFAsIGluZmzDoWNpdSAoQ1BJKSBhIG1pZXJ1IG5lemFtZXN0bmFub3N0aSDigJMgdiBvYmRvYsOtIHJva292IDIwMTAgYcW+IDIwMjIsIHZyw6F0YW5lIG1lZHppcm/EjW7DvWNoIHptaWVuIHTDvWNodG8gdWthem92YXRlxL5vdi4gViByb2tvY2ggMjAxMOKAkzIwMjIgcHJlxaFsYSBla29ub21pa2EgdsO9cmF6bsO9bWkgY3lrbGlja8O9bWkgem1lbmFtaS4KUG8gc2lsbm9tIHJhc3RlIEhEUCB2IHJva3UgMjAxMCAoNiw3OSAlKSBuYXNsZWRvdmFsbyBzcG9tYWxlbmllLCBubyBvZCByb2t1IDIwMTQgc2EgaG9zcG9kw6Fyc3R2byBvcMOkxaUgb8W+aXZpbG8uIE5hanbDpMSNxaHDrSBwcmVwYWQgbmFzdGFsIHYgcm9rdSAyMDIwICjigJMyLDU5ICUpIHYgZMO0c2xlZGt1IHBhbmTDqW1pZSBDT1ZJRC0xOSwgcG8ga3Rvcm9tIG5hc2xlZG92YWxvIHLDvWNobGUgem90YXZlbmllICgyMDIxOiA1LDczICUpLiBJbmZsw6FjaWEgYm9sYSB2w6TEjcWhaW51IG9iZG9iaWEgbsOtemthIGHFviBtaWVybmEsIHYgcm9rb2NoIDIwMTTigJMyMDE2IGRva29uY2EgesOhcG9ybsOhLCBubyB2IHJva3UgMjAyMiBwcnVka28gdnpyw6FzdGxhIG5hIDEyLDc3ICUgdnBseXZvbSByYXN0dSBjaWVuIGVuZXJnacOtIGEgZ2xvYsOhbG55Y2gga3LDrXouIE5lemFtZXN0bmFub3PFpSBwb3N0dXBuZSBrbGVzYWxhIHogMTQsMzkgJSAoMjAxMCkgbmEgcHJpYmxpxb5uZSA2ICUgcG8gcm9rdSAyMDE4LArEjW8gbmF6bmHEjXVqZSB6bGVwxaFlbmllIHRyaHUgcHLDoWNlLgpDZWxrb3ZvIMO6ZGFqZSB1a2F6dWrDuiBtaWVybnkgZGxob2RvYsO9IHJhc3QgSERQLCB6csO9Y2hsZW5pZSBpbmZsw6FjaWUgbmEga29uY2kgb2Jkb2JpYQphIHN0YWJpbGl6w6FjaXUgbmV6YW1lc3RuYW5vc3RpIG5hIG7DrXprZWogw7pyb3ZuaS4KCiMgVGVzdG92YW5pZSBoeXBvdMOpegoKIyMjIFQtdGVzdAoKYGBge3J9CiMjIyMgdC10ZXN0OiBJbmZsw6FjaWEgcHJlZCBhIHBvIHJva3UgMjAxNQppbmZsX2JlZm9yZSA8LSB1ZGFqZSRJbmZsYXRpb25fQ1BJW3VkYWplJHllYXIgJWluJSAyMDEwOjIwMTVdCmluZmxfYWZ0ZXIgIDwtIHVkYWplJEluZmxhdGlvbl9DUElbdWRhamUkeWVhciAlaW4lIDIwMTY6MjAyMl0KCnQudGVzdC5yZXN1bHQgPC0gdC50ZXN0KGluZmxfYmVmb3JlLCBpbmZsX2FmdGVyKQpwcmludCh0LnRlc3QucmVzdWx0KQpgYGAKVC10ZXN0IHBvcm92bsOhdmEgcHJpZW1lcm7DuiBpbmZsw6FjaXUgcHJlZCBhIHBvIHJva3UgMjAxNSAodGVkYSBkdmUgb2Jkb2JpYTogMjAxMOKAkzIwMTUgdnMuIDIwMTbigJMyMDIyLiAKCkh5cG90w6l6eToKCkjigoA6IFByaWVtZXJuw6EgaW5mbMOhY2lhIHYgcm9rb2NoIDIwMTDigJMyMDE1ID0gcHJpZW1lcm7DoSBpbmZsw6FjaWEgdiByb2tvY2ggMjAxNuKAkzIwMjIKCkjigoE6IFByaWVtZXJuw6EgaW5mbMOhY2lhIHYgdMO9Y2h0byBvYmRvYmlhY2ggc2EgbMOtxaFpCgpWw71zbGVka3kgdGVzdHU6CnQgPSDigJMxLjAyLCBwID0gMC4zMzYsCnByaWVtZXJfMjAxMOKAkzIwMTUgPSAxLjU4ICUsCnByaWVtZXJfMjAxNuKAkzIwMjIgPSAzLjQwICUuCgpJbnRlcnByZXTDoWNpYToKS2XEj8W+ZSBwID4gMC4wNSwgbnVsb3bDoSBoeXBvdMOpemEgc2EgbmV6YW1pZXRhLgpSb3pkaWVsIG1lZHppIHByaWVtZXJub3UgaW5mbMOhY2lvdSB2IGR2b2NoIG9iZG9iaWFjaCBuaWUgamUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70sCmhvY2kgcG8gcm9rdSAyMDE1IG1vxb5ubyBwb3pvcm92YcWlIG1pZXJueSByYXN0IGluZmzDoWNpZS4KCgojIyMgTGluZWFyIFJlZ3Jlc3Npb246IHByZWRpa2NpYSBpbmZsw6FjaWUKCmBgYHtyfQptb2RlbCA8LSBsbShJbmZsYXRpb25fQ1BJIH4gR0RQX0dyb3d0aF9Bbm51YWwgKyBVbmVtcGxveW1lbnRfUmF0ZSwgZGF0YSA9IHVkYWplKQpzdW1tYXJ5KG1vZGVsKQpgYGAKSHlwb3TDqXp5OgoKSOKCgDogUmFzdCBIRFAgYSBuZXphbWVzdG5hbm9zxaUgbmVtYWrDuiB2cGx5diBuYSBpbmZsw6FjaXUuCgpI4oKBOiBBc3BvxYggamVkZW4geiB0w71jaHRvIGZha3Rvcm92IG92cGx5dsWIdWplIGluZmzDoWNpdS4KClbDvXNsZWRreToKzrLigoEgKEhEUCkgPSDigJMwLjMxLCBwID0gMC40NwrOsuKCgiAoTmV6YW1lc3RuYW5vc8WlKSA9IOKAkzAuMjksIHAgPSAwLjM1ClLCsiA9IDAuMTYsIEYtdGVzdCBwID0gMC40MQoKSW50ZXJwcmV0w6FjaWE6ClZwbHl2IHJhc3R1IEhEUCBhbmkgbmV6YW1lc3RuYW5vc3RpIG5hIGluZmzDoWNpdSBuaWUgamUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70gKHAgPiAwLjA1KS4KTW9kZWwgdnlzdmV0xL51amUgbGVuIG1hbMO6IMSNYXPFpSB2YXJpYWJpbGl0eSBpbmZsw6FjaWUsCsSNbyBuYXpuYcSNdWplLCDFvmUgaW5mbMOhY2l1IG92cGx5dsWIdWrDuiBhaiBpbsOpIGZha3RvcnkgbWltbyB0cmh1IHByw6FjZSBhIGhvc3BvZMOhcnNrZWhvIHJhc3R1LgoK