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

#jednoduchá tabulka Meno <- c(“Jana”, “Jozef”, “Mária”) Vek <- c(10, 11, 9) Body <- c(85, 92, 78) udaje <- data.frame(Meno, Vek, Body) udaje udaje\(Vek mean(udaje\)Vek) udaje[Meno == “Jozef”,] udaje[3,] udaje[, 2:3] udaje[1, 1] summary(udaje) MaAuto <- c(TRUE, FALSE, TRUE) udaje <- cbind(udaje, MaAuto) udaje novy.riadok <- data.frame(Meno = “Diana”, Vek = 22.485, Body = 42, MaAuto = FALSE) udaje <- rbind(udaje, novy.riadok) udaje

#Tabuľky – kableExtra library(knitr) library(kableExtra)

kable( udaje, digits = 2, align = c(“l”,“c”,“l”,“r”), caption = “Toto je tabuľka” ) %>% kable_styling( bootstrap_options = c(“striped”,“hover”,“condensed”,“responsive”), full_width = FALSE, position = “center” )

#Tidyverse – moderná práca s údajmi library(tidyverse)

#Výber a triedenie udaje %>% filter(Body > 50) %>% arrange(desc(Body)) %>% kable() %>% kable_styling(full_width = FALSE)

#Zoskupovanie a sumarizácia udaje %>% group_by(MaAuto) %>% summarise( Priemer = mean(Body), Pocet = n(), .groups = “drop” ) %>% kable( caption = “Priemerné Body podľa premennej MaAuto”, col.names = c(“Má auto”,“Priemer Body”,“Počet”) ) %>% kable_styling(full_width = FALSE)

#Vytvorenie novej premennej udaje %>% mutate( grade = case_when( Body >= 90 ~ “A”, Body >= 80 ~ “B”, Body >= 70 ~ “C”, TRUE ~ “D” ), VekPoPlnoletosti = round(Vek - 18) ) %>% kable() %>% kable_styling(full_width = FALSE)

#Databázy v R library(datasets)

ds_datasets <- as.data.frame(utils::data(package = “datasets”)$results)[, c(“Item”,“Title”)] kable(head(ds_datasets, 20), col.names = c(“Dataset”,“Title”))

head(CO2) # install.packages(“wooldridge”) # odkomentovať pri prvej inštalácii

library(wooldridge)

ds_wool <- as.data.frame(utils::data(package = “wooldridge”)$results)[, c(“Item”,“Title”)] kable(head(ds_wool, 20), col.names = c(“Dataset”,“Title”)) %>% kable_styling( bootstrap_options = c(“striped”,“hover”,“condensed”,“responsive”), full_width = FALSE, position = “center” )

#Moja databáza – WDI (krajiny V4) Import WDI dát # install.packages(“WDI”) # ak treba

library(WDI) library(dplyr)

countries <- c(“SVK”,“CZE”,“POL”,“HUN”)

indicators <- c( GDP.PCAP = “NY.GDP.PCAP.KD”, INFLATION = “FP.CPI.TOTL.ZG”, UNEMP = “SL.UEM.TOTL.ZS”, EXPORTS = “NE.EXP.GNFS.ZS” )

mojedata <- WDI( country = countries, indicator = indicators, start = 2000, end = 2023 )

mojedata <- mojedata %>% rename(COUNTRY = country, YEAR = year) %>% arrange(COUNTRY, YEAR)

head(mojedata)

#Export a opätovný import CSV write.csv2(mojedata, “mojedata_WDI_V4.csv”, row.names = FALSE)

mojedata_csv <- read.csv2( “mojedata_WDI_V4.csv”, header = TRUE, sep = “;”, dec = “.” )

head(mojedata_csv) colnames(mojedata_csv)

#Grafy na dátach WDI Podmnožina pre rok 2015 mojedata_2015 <- mojedata %>% filter(YEAR == 2015) %>% select(COUNTRY, GDP.PCAP, INFLATION, UNEMP, EXPORTS)

mojedata_2015

#Scatter plot: HDP vs. exporty library(ggplot2)

ggplot(mojedata_2015, aes(x = EXPORTS, y = GDP.PCAP, color = COUNTRY)) + geom_point(size = 3) + theme_minimal() + labs( title = “HDP na obyvateľa vs. exporty (% HDP), rok 2015”, x = “Exporty (% HDP)”, y = “HDP na obyvateľa (konštantné USD)”, color = “Krajina” )

#Boxplot: HDP podľa krajiny ggplot(mojedata_2015, aes(x = COUNTRY, y = GDP.PCAP)) + geom_boxplot(fill = “lightblue”, color = “darkblue”) + theme_minimal() + labs( title = “Rozdelenie HDP na obyvateľa podľa krajiny (2015)”, x = “Krajina”, y = “HDP na obyvateľa (konštantné USD)” )

#Základné štatistiky – HDP na obyvateľa library(knitr)

wdi.stats <- mojedata %>% filter(YEAR %in% 2010:2020) %>% group_by(YEAR) %>% summarise( n = n(), mean = mean(GDP.PCAP, na.rm = TRUE), sd = sd(GDP.PCAP, na.rm = TRUE), min = min(GDP.PCAP, na.rm = TRUE), q25 = quantile(GDP.PCAP, 0.25, na.rm = TRUE), median = median(GDP.PCAP, na.rm = TRUE), q75 = quantile(GDP.PCAP, 0.75, na.rm = TRUE), max = max(GDP.PCAP, na.rm = TRUE), .groups = “drop” )

kable(wdi.stats, digits = 2, caption = “Základné štatistiky HDP na obyvateľa (2010–2020, krajiny V4)”)

#kableExtra – krajšia tabuľka library(kableExtra)

wdi.stats %>% kable( digits = 2, caption = “Základné štatistiky HDP na obyvateľa (2010–2020, krajiny V4)” ) %>% kable_styling( full_width = FALSE, bootstrap_options = c(“striped”,“hover”,“condensed”) ) %>% column_spec(1, bold = TRUE) %>% row_spec(0, bold = TRUE, background = “#f2f2f2”) %>% add_header_above(c(” ” = 2, “HDP štatistiky” = 7))

#t-test: Porovnanie HDP v rokoch 2005 a 2015 t.test( mojedata\(GDP.PCAP[mojedata\)YEAR == 2005], mojedata\(GDP.PCAP[mojedata\)YEAR == 2015] )

#ANOVA: Porovnanie HDP medzi krajinami (2015) anova.result <- aov(GDP.PCAP ~ COUNTRY, data = mojedata_2015) summary(anova.result)

#Lineárna regresia: HDP ~ inflácia + nezamestnanosť + exporty wdi_reg <- mojedata %>% filter(YEAR == 2015) %>% select(GDP.PCAP, INFLATION, UNEMP, EXPORTS) %>% na.omit()

model <- lm(GDP.PCAP ~ INFLATION + UNEMP + EXPORTS, data = wdi_reg) summary(model)

#Regresné koeficienty – broom + kableExtra # install.packages(c(“broom”,“stringr”)) # ak treba

library(broom) library(stringr)

coef.tbl <- tidy(model, conf.int = TRUE) %>% mutate( term = recode(term, “(Intercept)” = “Intercept”, “INFLATION” = “Inflácia”, “UNEMP” = “Nezamestnanosť”, “EXPORTS” = “Exporty (% HDP)” ), stars = case_when( p.value < 0.001 ~ “”, p.value < 0.01 ~ ””, p.value < 0.05 ~ ””, p.value < 0.1 ~ “·”, TRUE ~ “” ) ) %>% transmute( Term = term, Estimate = estimate, Std. Error= std.error, t value = statistic, p value = p.value, 95% CI = str_c(“[”, round(conf.low,3), ”, ”, round(conf.high,3), ”]”), Sig = stars )

coef.tbl %>% kable( digits = 3, caption = “OLS koeficienty (HDP na obyvateľa ~ inflácia + nezamestnanosť + exporty)” ) %>% kable_styling( full_width = FALSE, bootstrap_options = c(“striped”,“hover”,“condensed”) ) %>% column_spec(1, bold = TRUE) %>% row_spec(0, bold = TRUE, background = “#f2f2f2”) %>% footnote( general = “Signif. codes: *** p<0.001, ** p<0.01, * p<0.05, · p<0.1.”, threeparttable = TRUE )

#Model Fit Statistics fit.tbl <- glance(model) %>% transmute( R-squared = r.squared, Adj. R-squared = adj.r.squared, F-statistic = statistic, F p-value = p.value, AIC = AIC, BIC = BIC, Num. obs. = nobs )

fit.tbl %>% kable(digits = 3, caption = “Model Fit Statistics”) %>% kable_styling( full_width = FALSE, bootstrap_options = c(“condensed”) )

LS0tCnRpdGxlOiAiUHLDoWNhIHMgZGF0YWLDoXpvdSDigJMgV0RJIChWNCBrcmFqaW55KSIKYXV0aG9yOiAiTmF0w6FsaWEgU29saWdvdsOhICA8YnI+CihzIHZ5dcW+aXTDrW0gdmVyZWpuZSBkb3N0dXBuw71jaCBrw7Nkb3YpIgpkYXRlOiAiU2VwdGVtYmVyIDIwMjUiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICB0aGVtZTogdW5pdGVkCiAgICBoaWdobGlnaHQ6IHRhbmdvCmVkaXRvcl9vcHRpb25zOiAKICBtYXJrZG93bjogCiAgICB3cmFwOiA3MgotLS0KCmBgYHtyfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgICBlY2hvID0gVFJVRSwKICAgIG1lc3NhZ2UgPSBGQUxTRSwKICAgIHdhcm5pbmcgPSBGQUxTRQopCmBgYAoKI2plZG5vZHVjaMOhIHRhYnVsa2EKTWVubyA8LSBjKCJKYW5hIiwgIkpvemVmIiwgIk3DoXJpYSIpClZlayAgPC0gYygxMCwgMTEsIDkpCkJvZHkgPC0gYyg4NSwgOTIsIDc4KQp1ZGFqZSA8LSBkYXRhLmZyYW1lKE1lbm8sIFZlaywgQm9keSkKdWRhamUKdWRhamUkVmVrCm1lYW4odWRhamUkVmVrKQp1ZGFqZVtNZW5vID09ICJKb3plZiIsXQp1ZGFqZVszLF0KdWRhamVbLCAyOjNdCnVkYWplWzEsIDFdCnN1bW1hcnkodWRhamUpCk1hQXV0byA8LSBjKFRSVUUsIEZBTFNFLCBUUlVFKQp1ZGFqZSAgPC0gY2JpbmQodWRhamUsIE1hQXV0bykKdWRhamUKbm92eS5yaWFkb2sgPC0gZGF0YS5mcmFtZShNZW5vID0gIkRpYW5hIiwgVmVrID0gMjIuNDg1LCBCb2R5ID0gNDIsIE1hQXV0byA9IEZBTFNFKQp1ZGFqZSA8LSByYmluZCh1ZGFqZSwgbm92eS5yaWFkb2spCnVkYWplCgojVGFidcS+a3kg4oCTIGthYmxlRXh0cmEKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQoKa2FibGUoCnVkYWplLApkaWdpdHMgID0gMiwKYWxpZ24gICA9IGMoImwiLCJjIiwibCIsInIiKSwKY2FwdGlvbiA9ICJUb3RvIGplIHRhYnXEvmthIgopICU+JQprYWJsZV9zdHlsaW5nKApib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCJob3ZlciIsImNvbmRlbnNlZCIsInJlc3BvbnNpdmUiKSwKZnVsbF93aWR0aCAgICAgICAgPSBGQUxTRSwKcG9zaXRpb24gICAgICAgICAgPSAiY2VudGVyIgopCgojVGlkeXZlcnNlIOKAkyBtb2Rlcm7DoSBwcsOhY2EgcyDDumRham1pCmxpYnJhcnkodGlkeXZlcnNlKQoKI1bDvWJlciBhIHRyaWVkZW5pZQp1ZGFqZSAlPiUKZmlsdGVyKEJvZHkgPiA1MCkgJT4lCmFycmFuZ2UoZGVzYyhCb2R5KSkgJT4lCmthYmxlKCkgJT4lCmthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKQoKI1pvc2t1cG92YW5pZSBhIHN1bWFyaXrDoWNpYQp1ZGFqZSAlPiUKZ3JvdXBfYnkoTWFBdXRvKSAlPiUKc3VtbWFyaXNlKApQcmllbWVyID0gbWVhbihCb2R5KSwKUG9jZXQgICA9IG4oKSwKLmdyb3VwcyA9ICJkcm9wIgopICU+JQprYWJsZSgKY2FwdGlvbiAgID0gIlByaWVtZXJuw6kgQm9keSBwb2TEvmEgcHJlbWVubmVqIE1hQXV0byIsCmNvbC5uYW1lcyA9IGMoIk3DoSBhdXRvIiwiUHJpZW1lciBCb2R5IiwiUG/EjWV0IikKKSAlPiUKa2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpCgojVnl0dm9yZW5pZSBub3ZlaiBwcmVtZW5uZWoKdWRhamUgJT4lCm11dGF0ZSgKZ3JhZGUgPSBjYXNlX3doZW4oCkJvZHkgPj0gOTAgfiAiQSIsCkJvZHkgPj0gODAgfiAiQiIsCkJvZHkgPj0gNzAgfiAiQyIsClRSVUUgICAgICAgfiAiRCIKKSwKVmVrUG9QbG5vbGV0b3N0aSA9IHJvdW5kKFZlayAtIDE4KQopICU+JQprYWJsZSgpICU+JQprYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkKCiNEYXRhYsOhenkgdiBSCmxpYnJhcnkoZGF0YXNldHMpCgpkc19kYXRhc2V0cyA8LSBhcy5kYXRhLmZyYW1lKHV0aWxzOjpkYXRhKHBhY2thZ2UgPSAiZGF0YXNldHMiKSRyZXN1bHRzKVssIGMoIkl0ZW0iLCJUaXRsZSIpXQprYWJsZShoZWFkKGRzX2RhdGFzZXRzLCAyMCksIGNvbC5uYW1lcyA9IGMoIkRhdGFzZXQiLCJUaXRsZSIpKQoKaGVhZChDTzIpCiMgaW5zdGFsbC5wYWNrYWdlcygid29vbGRyaWRnZSIpICAjIG9ka29tZW50b3ZhxaUgcHJpIHBydmVqIGluxaF0YWzDoWNpaQoKbGlicmFyeSh3b29sZHJpZGdlKQoKZHNfd29vbCA8LSBhcy5kYXRhLmZyYW1lKHV0aWxzOjpkYXRhKHBhY2thZ2UgPSAid29vbGRyaWRnZSIpJHJlc3VsdHMpWywgYygiSXRlbSIsIlRpdGxlIildCmthYmxlKGhlYWQoZHNfd29vbCwgMjApLCBjb2wubmFtZXMgPSBjKCJEYXRhc2V0IiwiVGl0bGUiKSkgJT4lCmthYmxlX3N0eWxpbmcoCmJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsImhvdmVyIiwiY29uZGVuc2VkIiwicmVzcG9uc2l2ZSIpLApmdWxsX3dpZHRoICAgICAgICA9IEZBTFNFLApwb3NpdGlvbiAgICAgICAgICA9ICJjZW50ZXIiCikKCiNNb2phIGRhdGFiw6F6YSDigJMgV0RJIChrcmFqaW55IFY0KSBJbXBvcnQgV0RJIGTDoXQKIyBpbnN0YWxsLnBhY2thZ2VzKCJXREkiKSAgIyBhayB0cmViYQoKbGlicmFyeShXREkpCmxpYnJhcnkoZHBseXIpCgpjb3VudHJpZXMgPC0gYygiU1ZLIiwiQ1pFIiwiUE9MIiwiSFVOIikKCmluZGljYXRvcnMgPC0gYygKR0RQLlBDQVAgID0gIk5ZLkdEUC5QQ0FQLktEIiwKSU5GTEFUSU9OID0gIkZQLkNQSS5UT1RMLlpHIiwKVU5FTVAgICAgID0gIlNMLlVFTS5UT1RMLlpTIiwKRVhQT1JUUyAgID0gIk5FLkVYUC5HTkZTLlpTIgopCgptb2plZGF0YSA8LSBXREkoCmNvdW50cnkgICA9IGNvdW50cmllcywKaW5kaWNhdG9yID0gaW5kaWNhdG9ycywKc3RhcnQgICAgID0gMjAwMCwKZW5kICAgICAgID0gMjAyMwopCgptb2plZGF0YSA8LSBtb2plZGF0YSAlPiUKcmVuYW1lKENPVU5UUlkgPSBjb3VudHJ5LCBZRUFSID0geWVhcikgJT4lCmFycmFuZ2UoQ09VTlRSWSwgWUVBUikKCmhlYWQobW9qZWRhdGEpCgojRXhwb3J0IGEgb3DDpHRvdm7DvSBpbXBvcnQgQ1NWCndyaXRlLmNzdjIobW9qZWRhdGEsICJtb2plZGF0YV9XRElfVjQuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpCgptb2plZGF0YV9jc3YgPC0gcmVhZC5jc3YyKAoibW9qZWRhdGFfV0RJX1Y0LmNzdiIsCmhlYWRlciA9IFRSVUUsCnNlcCAgICA9ICI7IiwKZGVjICAgID0gIi4iCikKCmhlYWQobW9qZWRhdGFfY3N2KQpjb2xuYW1lcyhtb2plZGF0YV9jc3YpCgojR3JhZnkgbmEgZMOhdGFjaCBXREkgUG9kbW5vxb5pbmEgcHJlIHJvayAyMDE1Cm1vamVkYXRhXzIwMTUgPC0gbW9qZWRhdGEgJT4lCmZpbHRlcihZRUFSID09IDIwMTUpICU+JQpzZWxlY3QoQ09VTlRSWSwgR0RQLlBDQVAsIElORkxBVElPTiwgVU5FTVAsIEVYUE9SVFMpCgptb2plZGF0YV8yMDE1CgojU2NhdHRlciBwbG90OiBIRFAgdnMuIGV4cG9ydHkKbGlicmFyeShnZ3Bsb3QyKQoKZ2dwbG90KG1vamVkYXRhXzIwMTUsIGFlcyh4ID0gRVhQT1JUUywgeSA9IEdEUC5QQ0FQLCBjb2xvciA9IENPVU5UUlkpKSArCmdlb21fcG9pbnQoc2l6ZSA9IDMpICsKdGhlbWVfbWluaW1hbCgpICsKbGFicygKdGl0bGUgPSAiSERQIG5hIG9ieXZhdGXEvmEgdnMuIGV4cG9ydHkgKCUgSERQKSwgcm9rIDIwMTUiLAp4ICAgICA9ICJFeHBvcnR5ICglIEhEUCkiLAp5ICAgICA9ICJIRFAgbmEgb2J5dmF0ZcS+YSAoa29uxaF0YW50bsOpIFVTRCkiLApjb2xvciA9ICJLcmFqaW5hIgopCgojQm94cGxvdDogSERQIHBvZMS+YSBrcmFqaW55CmdncGxvdChtb2plZGF0YV8yMDE1LCBhZXMoeCA9IENPVU5UUlksIHkgPSBHRFAuUENBUCkpICsKZ2VvbV9ib3hwbG90KGZpbGwgPSAibGlnaHRibHVlIiwgY29sb3IgPSAiZGFya2JsdWUiKSArCnRoZW1lX21pbmltYWwoKSArCmxhYnMoCnRpdGxlID0gIlJvemRlbGVuaWUgSERQIG5hIG9ieXZhdGXEvmEgcG9kxL5hIGtyYWppbnkgKDIwMTUpIiwKeCAgICAgPSAiS3JhamluYSIsCnkgICAgID0gIkhEUCBuYSBvYnl2YXRlxL5hIChrb27FoXRhbnRuw6kgVVNEKSIKKQoKI1rDoWtsYWRuw6kgxaF0YXRpc3Rpa3kg4oCTIEhEUCBuYSBvYnl2YXRlxL5hCmxpYnJhcnkoa25pdHIpCgp3ZGkuc3RhdHMgPC0gbW9qZWRhdGEgJT4lCmZpbHRlcihZRUFSICVpbiUgMjAxMDoyMDIwKSAlPiUKZ3JvdXBfYnkoWUVBUikgJT4lCnN1bW1hcmlzZSgKbiAgICAgID0gbigpLAptZWFuICAgPSBtZWFuKEdEUC5QQ0FQLCBuYS5ybSA9IFRSVUUpLApzZCAgICAgPSBzZChHRFAuUENBUCwgbmEucm0gPSBUUlVFKSwKbWluICAgID0gbWluKEdEUC5QQ0FQLCBuYS5ybSA9IFRSVUUpLApxMjUgICAgPSBxdWFudGlsZShHRFAuUENBUCwgMC4yNSwgbmEucm0gPSBUUlVFKSwKbWVkaWFuID0gbWVkaWFuKEdEUC5QQ0FQLCBuYS5ybSA9IFRSVUUpLApxNzUgICAgPSBxdWFudGlsZShHRFAuUENBUCwgMC43NSwgbmEucm0gPSBUUlVFKSwKbWF4ICAgID0gbWF4KEdEUC5QQ0FQLCBuYS5ybSA9IFRSVUUpLAouZ3JvdXBzID0gImRyb3AiCikKCmthYmxlKHdkaS5zdGF0cywgZGlnaXRzID0gMiwKY2FwdGlvbiA9ICJaw6FrbGFkbsOpIMWhdGF0aXN0aWt5IEhEUCBuYSBvYnl2YXRlxL5hICgyMDEw4oCTMjAyMCwga3JhamlueSBWNCkiKQoKI2thYmxlRXh0cmEg4oCTIGtyYWrFoWlhIHRhYnXEvmthCmxpYnJhcnkoa2FibGVFeHRyYSkKCndkaS5zdGF0cyAlPiUKa2FibGUoCmRpZ2l0cyAgPSAyLApjYXB0aW9uID0gIlrDoWtsYWRuw6kgxaF0YXRpc3Rpa3kgSERQIG5hIG9ieXZhdGXEvmEgKDIwMTDigJMyMDIwLCBrcmFqaW55IFY0KSIKKSAlPiUKa2FibGVfc3R5bGluZygKZnVsbF93aWR0aCAgICAgICAgPSBGQUxTRSwKYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwiaG92ZXIiLCJjb25kZW5zZWQiKQopICU+JQpjb2x1bW5fc3BlYygxLCBib2xkID0gVFJVRSkgJT4lCnJvd19zcGVjKDAsIGJvbGQgPSBUUlVFLCBiYWNrZ3JvdW5kID0gIiNmMmYyZjIiKSAlPiUKYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDIsICJIRFAgxaF0YXRpc3Rpa3kiID0gNykpCgojdC10ZXN0OiBQb3Jvdm5hbmllIEhEUCB2IHJva29jaCAyMDA1IGEgMjAxNQp0LnRlc3QoCm1vamVkYXRhJEdEUC5QQ0FQW21vamVkYXRhJFlFQVIgPT0gMjAwNV0sCm1vamVkYXRhJEdEUC5QQ0FQW21vamVkYXRhJFlFQVIgPT0gMjAxNV0KKQoKI0FOT1ZBOiBQb3Jvdm5hbmllIEhEUCBtZWR6aSBrcmFqaW5hbWkgKDIwMTUpCmFub3ZhLnJlc3VsdCA8LSBhb3YoR0RQLlBDQVAgfiBDT1VOVFJZLCBkYXRhID0gbW9qZWRhdGFfMjAxNSkKc3VtbWFyeShhbm92YS5yZXN1bHQpCgojTGluZcOhcm5hIHJlZ3Jlc2lhOiBIRFAgfiBpbmZsw6FjaWEgKyBuZXphbWVzdG5hbm9zxaUgKyBleHBvcnR5CndkaV9yZWcgPC0gbW9qZWRhdGEgJT4lCmZpbHRlcihZRUFSID09IDIwMTUpICU+JQpzZWxlY3QoR0RQLlBDQVAsIElORkxBVElPTiwgVU5FTVAsIEVYUE9SVFMpICU+JQpuYS5vbWl0KCkKCm1vZGVsIDwtIGxtKEdEUC5QQ0FQIH4gSU5GTEFUSU9OICsgVU5FTVAgKyBFWFBPUlRTLCBkYXRhID0gd2RpX3JlZykKc3VtbWFyeShtb2RlbCkKCiNSZWdyZXNuw6kga29lZmljaWVudHkg4oCTIGJyb29tICsga2FibGVFeHRyYQojIGluc3RhbGwucGFja2FnZXMoYygiYnJvb20iLCJzdHJpbmdyIikpICAjIGFrIHRyZWJhCgpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KHN0cmluZ3IpCgpjb2VmLnRibCA8LSB0aWR5KG1vZGVsLCBjb25mLmludCA9IFRSVUUpICU+JQptdXRhdGUoCnRlcm0gPSByZWNvZGUodGVybSwKIihJbnRlcmNlcHQpIiA9ICJJbnRlcmNlcHQiLAoiSU5GTEFUSU9OIiAgID0gIkluZmzDoWNpYSIsCiJVTkVNUCIgICAgICAgPSAiTmV6YW1lc3RuYW5vc8WlIiwKIkVYUE9SVFMiICAgICA9ICJFeHBvcnR5ICglIEhEUCkiCiksCnN0YXJzID0gY2FzZV93aGVuKApwLnZhbHVlIDwgMC4wMDEgfiAiKioqIiwKcC52YWx1ZSA8IDAuMDEgIH4gIioqIiwKcC52YWx1ZSA8IDAuMDUgIH4gIioiLApwLnZhbHVlIDwgMC4xICAgfiAiwrciLApUUlVFICAgICAgICAgICAgfiAiIgopCikgJT4lCnRyYW5zbXV0ZSgKVGVybSAgICAgICAgPSB0ZXJtLApFc3RpbWF0ZSAgICA9IGVzdGltYXRlLApgU3RkLiBFcnJvcmA9IHN0ZC5lcnJvciwKYHQgdmFsdWVgICAgPSBzdGF0aXN0aWMsCmBwIHZhbHVlYCAgID0gcC52YWx1ZSwKYDk1JSBDSWAgICAgPSBzdHJfYygiWyIsIHJvdW5kKGNvbmYubG93LDMpLCAiLCAiLCByb3VuZChjb25mLmhpZ2gsMyksICJdIiksClNpZyAgICAgICAgID0gc3RhcnMKKQoKY29lZi50YmwgJT4lCmthYmxlKApkaWdpdHMgID0gMywKY2FwdGlvbiA9ICJPTFMga29lZmljaWVudHkgKEhEUCBuYSBvYnl2YXRlxL5hIH4gaW5mbMOhY2lhICsgbmV6YW1lc3RuYW5vc8WlICsgZXhwb3J0eSkiCikgJT4lCmthYmxlX3N0eWxpbmcoCmZ1bGxfd2lkdGggICAgICAgID0gRkFMU0UsCmJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsImhvdmVyIiwiY29uZGVuc2VkIikKKSAlPiUKY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUpICU+JQpyb3dfc3BlYygwLCBib2xkID0gVFJVRSwgYmFja2dyb3VuZCA9ICIjZjJmMmYyIikgJT4lCmZvb3Rub3RlKApnZW5lcmFsID0gIlNpZ25pZi4gY29kZXM6ICoqKiBwPDAuMDAxLCAqKiBwPDAuMDEsICogcDwwLjA1LCDCtyBwPDAuMS4iLAp0aHJlZXBhcnR0YWJsZSA9IFRSVUUKKQoKI01vZGVsIEZpdCBTdGF0aXN0aWNzCmZpdC50YmwgPC0gZ2xhbmNlKG1vZGVsKSAlPiUKdHJhbnNtdXRlKApgUi1zcXVhcmVkYCAgICAgID0gci5zcXVhcmVkLApgQWRqLiBSLXNxdWFyZWRgID0gYWRqLnIuc3F1YXJlZCwKYEYtc3RhdGlzdGljYCAgICA9IHN0YXRpc3RpYywKYEYgcC12YWx1ZWAgICAgICA9IHAudmFsdWUsCmBBSUNgICAgICAgICAgICAgPSBBSUMsCmBCSUNgICAgICAgICAgICAgPSBCSUMsCmBOdW0uIG9icy5gICAgICAgPSBub2JzCikKCmZpdC50YmwgJT4lCmthYmxlKGRpZ2l0cyA9IDMsIGNhcHRpb24gPSAiTW9kZWwgRml0IFN0YXRpc3RpY3MiKSAlPiUKa2FibGVfc3R5bGluZygKZnVsbF93aWR0aCAgICAgICAgPSBGQUxTRSwKYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJjb25kZW5zZWQiKQop