udaje <- read.csv2("dataEKONOMETRIA.csv",header=TRUE,sep=",",dec=".")
head(udaje)                                            
colnames(udaje)
[1] "Nazov"       "Kategoria"   "Forma"       "ROE"         "ROA"         "EBIT"        "EBITDAmarza" "M"           "Z"          
library(ggplot2)

# Scatter plot: vzťah medzi ROA a ROE
ggplot(udaje, aes(x = ROA, y = ROE)) +
  geom_point(color = "steelblue", size = 2) +     # typ grafu – bodový
  theme_minimal() +
  labs(
    title = "Vzťah medzi ROA a ROE",
    x = "Návratnosť aktív (ROA)",
    y = "Návratnosť vlastného kapitálu (ROE)"
  )

library(ggplot2)

ggplot(udaje, aes(x = factor(Kategoria), y = ROE)) +        # Kategoria namiesto YEARS
  geom_boxplot(fill = "lightblue", color = "darkblue") +    # typ grafu - boxplot
  labs(
    title = "ROE podľa kategórie firmy",
    x = "Kategória",
    y = "ROE (návratnosť vlastného kapitálu)"
  ) +
  theme_minimal()

library(dplyr)
library(knitr)

# Základné štatistiky ROE podľa kategórie
roe.stats <- udaje %>%
  group_by(Kategoria) %>%
  summarise(
    n      = n(),
    mean   = mean(ROE, na.rm = TRUE),
    sd     = sd(ROE, na.rm = TRUE),
    min    = min(ROE, na.rm = TRUE),
    q25    = quantile(ROE, 0.25, na.rm = TRUE),
    median = median(ROE, na.rm = TRUE),
    q75    = quantile(ROE, 0.75, na.rm = TRUE),
    max    = max(ROE, na.rm = TRUE),
    .groups = "drop"
  )

# Vygenerovanie tabuľky
kable(roe.stats, digits = 2, caption = "Základné štatistiky ukazovateľa ROE podľa kategórie firmy")
Základné štatistiky ukazovateľa ROE podľa kategórie firmy
Kategoria n mean sd min q25 median q75 max
1 4 0.10 0.79 -0.95 -0.16 0.20 0.46 0.94
2 12 0.12 0.78 -1.84 0.03 0.08 0.78 1.00
3 16 0.28 0.26 0.08 0.12 0.18 0.30 0.99
4 19 0.22 0.27 -0.11 0.08 0.13 0.26 1.00
5 2 0.11 0.03 0.10 0.10 0.11 0.12 0.13
NA
# ================== Balíčky ==================
library(dplyr)
library(knitr)
library(kableExtra)

# (ak ešte nemáš načítané dáta, odkomentuj)
# udaje <- read.csv("dataEKONOMETRIA.csv", header = TRUE, sep = ";", dec = ",",
#                   check.names = TRUE, stringsAsFactors = FALSE)

# Pomocná funkcia na výpočet štatistík
calc_stats <- function(df, group_var, value_var) {
  df %>%
    group_by({{ group_var }}) %>%
    summarise(
      n      = n(),
      mean   = mean({{ value_var }}, na.rm = TRUE),
      sd     = sd({{ value_var }}, na.rm = TRUE),
      min    = min({{ value_var }}, na.rm = TRUE),
      q25    = quantile({{ value_var }}, 0.25, na.rm = TRUE),
      median = median({{ value_var }}, na.rm = TRUE),
      q75    = quantile({{ value_var }}, 0.75, na.rm = TRUE),
      max    = max({{ value_var }}, na.rm = TRUE),
      .groups = "drop"
    )
}

# ================== 1) ROE podľa Kategoria ==================
roe_stats <- calc_stats(udaje, Kategoria, ROE)

roe_stats %>%
  kable(digits = 2, caption = "Základné štatistiky ROE podľa kategórie") %>%
  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, "ROE – Štatistiky" = 7))
Základné štatistiky ROE podľa kategórie
ROE – Štatistiky
Kategoria n mean sd min q25 median q75 max
1 4 0.10 0.79 -0.95 -0.16 0.20 0.46 0.94
2 12 0.12 0.78 -1.84 0.03 0.08 0.78 1.00
3 16 0.28 0.26 0.08 0.12 0.18 0.30 0.99
4 19 0.22 0.27 -0.11 0.08 0.13 0.26 1.00
5 2 0.11 0.03 0.10 0.10 0.11 0.12 0.13

# ================== 2) ROA podľa Forma ==================
roa_stats <- calc_stats(udaje, Forma, ROA)

roa_stats %>%
  kable(digits = 2, caption = "Základné štatistiky ROA podľa formy firmy") %>%
  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, "ROA – Štatistiky" = 7))
Základné štatistiky ROA podľa formy firmy
ROA – Štatistiky
Forma n mean sd min q25 median q75 max
as 17 0.07 0.08 0.00 0.01 0.04 0.09 0.26
sro 36 0.10 0.15 -0.17 0.04 0.06 0.13 0.70
# t-test: porovnanie priemerov ROE medzi dvoma formami firiem
t.test.result <- t.test(
  ROE ~ Forma,       # porovnávame ROE podľa dvoch skupín v stĺpci Forma
  data = udaje,
  var.equal = FALSE 
)

t.test.result

    Welch Two Sample t-test

data:  ROE by Forma
t = -0.0073638, df = 50.356, p-value = 0.9942
alternative hypothesis: true difference in means between group as and group sro is not equal to 0
95 percent confidence interval:
 -0.2115588  0.2100130
sample estimates:
 mean in group as mean in group sro 
        0.2027450         0.2035179 
anova.result <- aov(ROA ~ Forma, data = udaje)
summary(anova.result)
            Df Sum Sq Mean Sq F value Pr(>F)
Forma        1 0.0105 0.01047   0.594  0.444
Residuals   51 0.8985 0.01762               
# Lineárna regresia: predikcia ROE na základe ďalších ukazovateľov
model <- lm(ROE ~ ROA + EBITDAmarza + M + Z, data = udaje)
summary(model)

Call:
lm(formula = ROE ~ ROA + EBITDAmarza + M + Z, data = udaje)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.26230 -0.07712 -0.01667  0.13934  0.79777 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.001288   0.104697  -0.012 0.990238    
ROA          1.820819   0.486836   3.740 0.000491 ***
EBITDAmarza -0.485064   0.416720  -1.164 0.250176    
M            0.020364   0.014911   1.366 0.178417    
Z           -0.016741   0.039112  -0.428 0.670545    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4191 on 48 degrees of freedom
Multiple R-squared:  0.2362,    Adjusted R-squared:  0.1725 
F-statistic:  3.71 on 4 and 48 DF,  p-value: 0.01037
# --- HEATMAP (base R) ---

# vyber numerické stĺpce

num_cols <- c("ROE","ROA","EBIT","EBITDAmarza","M","Z")
stopifnot(all(num_cols %in% names(udaje)))

# ak je EBIT ako text s čiarkou/%, očisti a skonvertuj

if (!is.numeric(udaje$EBIT)) {
ebit_clean <- gsub("[^0-9,.-]", "", udaje$EBIT)
ebit_clean <- chartr(",", ".", ebit_clean)
udaje$EBIT <- suppressWarnings(as.numeric(ebit_clean))
}

# korelačná matica

cm <- cor(udaje[, num_cols], use = "pairwise.complete.obs")

# heatmap bez dodatočných balíkov

pal <- colorRampPalette(c("red","white","blue"))(100)
op <- par(mar = c(8,8,2,2))  # väčšie okraje na popisky
heatmap(cm, Rowv = NA, Colv = NA, scale = "none",
col = pal, margins = c(8,8))
par(op)


# --- stručná interpretácia priamo v R ---

upper <- which(upper.tri(cm), arr.ind = TRUE)
vals  <- cm[upper]
ord   <- order(abs(vals), decreasing = TRUE)
top_n <- min(3, length(vals))

cat("Interpretácia heatmapy korelačnej matice:\n")
Interpretácia heatmapy korelačnej matice:
for (i in seq_len(top_n)) {
r <- upper[ord[i], ]
cat(sprintf("• %s vs %s: korelácia = %.2f (%s)\n",
rownames(cm)[r[1]], colnames(cm)[r[2]],
vals[ord[i]], ifelse(vals[ord[i]]>0,"pozitívny vzťah","negatívny vzťah")))
}
• M vs Z: korelácia = 0.58 (pozitívny vzťah)
• ROE vs ROA: korelácia = 0.44 (pozitívny vzťah)
• ROA vs EBITDAmarza: korelácia = 0.37 (pozitívny vzťah)
cat("Hodnoty blízke +1 = silná pozitívna závislosť, blízke -1 = silná negatívna,\n",
"blízko 0 = slabý/žiadny lineárny vzťah. Silné korelácie sleduj pre možnú multikolinearitu v regresii.\n")
Hodnoty blízke +1 = silná pozitívna závislosť, blízke -1 = silná negatívna,
 blízko 0 = slabý/žiadny lineárny vzťah. Silné korelácie sleduj pre možnú multikolinearitu v regresii.
library(ggplot2)
library(dplyr)

# (jemné čistenie EBIT, ak by bol text s čiarkou)
if (!is.numeric(udaje$EBIT)) {
  ebit_clean <- gsub("[^0-9,.-]", "", udaje$EBIT)
  ebit_clean <- chartr(",", ".", ebit_clean)
  udaje$EBIT <- suppressWarnings(as.numeric(ebit_clean))
}

# TOP 5 firiem podľa ROE na popisky
top5 <- udaje %>% arrange(desc(ROE)) %>% slice_head(n = 5)

ggplot(udaje, aes(x = ROA, y = ROE)) +
  # hustotné kontúry (kde je najviac bodov)
  stat_density_2d(aes(z = ..level..), geom = "polygon", alpha = 0.15) +
  # bubliny – veľkosť podľa EBITDA marže, farba podľa formy
  geom_point(aes(size = EBITDAmarza, color = Forma), alpha = 0.7) +
  # regresná čiara
  geom_smooth(method = "lm", se = FALSE, linewidth = 0.9) +
  # popisky pre top 5 podľa ROE
  geom_text(data = top5, aes(label = Nazov), vjust = -0.7, size = 3) +
  scale_size_continuous(name = "EBITDA marža") +
  theme_minimal() +
  labs(
    title = "ROA vs ROE – bubliny (EBITDA marža), farba podľa formy, hustotné kontúry",
    x = "ROA",
    y = "ROE",
    color = "Forma"
  )

cor_roa_roe <- cor(udaje$ROA, udaje$ROE, use = "pairwise.complete.obs")
cat(sprintf("Korelácia ROA–ROE = %.2f. Väčšie bubliny = vyššia EBITDA marža. 
Kontúry ukazujú oblasti s najväčšou koncentráciou firiem.\n", cor_roa_roe))
Korelácia ROA–ROE = 0.44. Väčšie bubliny = vyššia EBITDA marža. 
Kontúry ukazujú oblasti s najväčšou koncentráciou firiem.
library(ggplot2)
library(dplyr)
library(tidyr)

# Prepočítame priemerný počet mužov a žien vo vedení podľa formy
gender_stats <- udaje %>%
  group_by(Forma) %>%
  summarise(
    Priemerny_pocet_muzov = mean(M, na.rm = TRUE),
    Priemerny_pocet_zien = mean(Z, na.rm = TRUE)
  ) %>%
  pivot_longer(cols = c(Priemerny_pocet_muzov, Priemerny_pocet_zien),
               names_to = "Pohlavie",
               values_to = "Priemerny_pocet")

# Prehľadný grouped barplot
ggplot(gender_stats, aes(x = Forma, y = Priemerny_pocet, fill = Pohlavie)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(aes(label = round(Priemerny_pocet, 1)),
            position = position_dodge(0.9), vjust = -0.3, size = 3) +
  scale_fill_manual(values = c("#4575b4", "#d73027"),
                    labels = c("Muži", "Ženy")) +
  theme_minimal() +
  labs(
    title = "Priemerný počet mužov a žien vo vedení podľa formy firmy",
    x = "Forma firmy",
    y = "Priemerný počet osôb",
    fill = "Pohlavie"
  )

ggplot(udaje, aes(x = M, y = Z, color = Forma)) +
  geom_point(size = 3, alpha = 0.7) +
  geom_smooth(method = "lm", se = FALSE, linewidth = 0.8) +
  theme_minimal() +
  labs(
    title = "Vzťah medzi počtom mužov a žien vo vedení",
    x = "Počet mužov vo vedení (M)",
    y = "Počet žien vo vedení (Z)",
    color = "Forma firmy"
  )

gender_summary <- udaje %>%
  group_by(Forma) %>%
  summarise(
    muzi = mean(M, na.rm = TRUE),
    zeny = mean(Z, na.rm = TRUE)
  )

cat("Interpretácia:\n")
Interpretácia:
apply(gender_summary, 1, function(r) {
  cat(sprintf("• Forma %s: priemerný počet mužov vo vedení = %.1f, žien = %.1f\n",
              r["Forma"], as.numeric(r["muzi"]), as.numeric(r["zeny"])))
})
• Forma as: priemerný počet mužov vo vedení = 11.2, žien = 2.9
• Forma sro: priemerný počet mužov vo vedení = 3.5, žien = 1.1
NULL
cat("Z grafov vidno, že formy s.r.o. majú spravidla viac mužov ako žien vo vedení,
kým pri a.s. je podiel žien o niečo vyšší, ale stále v menšine.
Scatter graf ukazuje, že s rastúcim počtom mužov sa obvykle zvyšuje aj počet žien vo vedení,
čo naznačuje, že väčšie firmy majú celkovo väčšie manažérske tímy a väčšiu diverzitu.\n")
Z grafov vidno, že formy s.r.o. majú spravidla viac mužov ako žien vo vedení,
kým pri a.s. je podiel žien o niečo vyšší, ale stále v menšine.
Scatter graf ukazuje, že s rastúcim počtom mužov sa obvykle zvyšuje aj počet žien vo vedení,
čo naznačuje, že väčšie firmy majú celkovo väčšie manažérske tímy a väčšiu diverzitu.
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpgYGB7cn0KdWRhamUgPC0gcmVhZC5jc3YyKCJkYXRhRUtPTk9NRVRSSUEuY3N2IixoZWFkZXI9VFJVRSxzZXA9IiwiLGRlYz0iLiIpCmhlYWQodWRhamUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKY29sbmFtZXModWRhamUpCmBgYApgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQoKIyBTY2F0dGVyIHBsb3Q6IHZ6xaVhaCBtZWR6aSBST0EgYSBST0UKZ2dwbG90KHVkYWplLCBhZXMoeCA9IFJPQSwgeSA9IFJPRSkpICsKICBnZW9tX3BvaW50KGNvbG9yID0gInN0ZWVsYmx1ZSIsIHNpemUgPSAyKSArICAgICAjIHR5cCBncmFmdSDigJMgYm9kb3bDvQogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicygKICAgIHRpdGxlID0gIlZ6xaVhaCBtZWR6aSBST0EgYSBST0UiLAogICAgeCA9ICJOw6F2cmF0bm9zxaUgYWt0w612IChST0EpIiwKICAgIHkgPSAiTsOhdnJhdG5vc8WlIHZsYXN0bsOpaG8ga2FwaXTDoWx1IChST0UpIgogICkKYGBgCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCgpnZ3Bsb3QodWRhamUsIGFlcyh4ID0gZmFjdG9yKEthdGVnb3JpYSksIHkgPSBST0UpKSArICAgICAgICAjIEthdGVnb3JpYSBuYW1pZXN0byBZRUFSUwogIGdlb21fYm94cGxvdChmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImRhcmtibHVlIikgKyAgICAjIHR5cCBncmFmdSAtIGJveHBsb3QKICBsYWJzKAogICAgdGl0bGUgPSAiUk9FIHBvZMS+YSBrYXRlZ8OzcmllIGZpcm15IiwKICAgIHggPSAiS2F0ZWfDs3JpYSIsCiAgICB5ID0gIlJPRSAobsOhdnJhdG5vc8WlIHZsYXN0bsOpaG8ga2FwaXTDoWx1KSIKICApICsKICB0aGVtZV9taW5pbWFsKCkKCmBgYApgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShrbml0cikKCiMgWsOha2xhZG7DqSDFoXRhdGlzdGlreSBST0UgcG9kxL5hIGthdGVnw7NyaWUKcm9lLnN0YXRzIDwtIHVkYWplICU+JQogIGdyb3VwX2J5KEthdGVnb3JpYSkgJT4lCiAgc3VtbWFyaXNlKAogICAgbiAgICAgID0gbigpLAogICAgbWVhbiAgID0gbWVhbihST0UsIG5hLnJtID0gVFJVRSksCiAgICBzZCAgICAgPSBzZChST0UsIG5hLnJtID0gVFJVRSksCiAgICBtaW4gICAgPSBtaW4oUk9FLCBuYS5ybSA9IFRSVUUpLAogICAgcTI1ICAgID0gcXVhbnRpbGUoUk9FLCAwLjI1LCBuYS5ybSA9IFRSVUUpLAogICAgbWVkaWFuID0gbWVkaWFuKFJPRSwgbmEucm0gPSBUUlVFKSwKICAgIHE3NSAgICA9IHF1YW50aWxlKFJPRSwgMC43NSwgbmEucm0gPSBUUlVFKSwKICAgIG1heCAgICA9IG1heChST0UsIG5hLnJtID0gVFJVRSksCiAgICAuZ3JvdXBzID0gImRyb3AiCiAgKQoKIyBWeWdlbmVyb3ZhbmllIHRhYnXEvmt5CmthYmxlKHJvZS5zdGF0cywgZGlnaXRzID0gMiwgY2FwdGlvbiA9ICJaw6FrbGFkbsOpIMWhdGF0aXN0aWt5IHVrYXpvdmF0ZcS+YSBST0UgcG9kxL5hIGthdGVnw7NyaWUgZmlybXkiKQoKYGBgCmBgYHtyfQojID09PT09PT09PT09PT09PT09PSBCYWzDrcSNa3kgPT09PT09PT09PT09PT09PT09CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMgKGFrIGXFoXRlIG5lbcOhxaEgbmHEjcOtdGFuw6kgZMOhdGEsIG9ka29tZW50dWopCiMgdWRhamUgPC0gcmVhZC5jc3YoImRhdGFFS09OT01FVFJJQS5jc3YiLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiOyIsIGRlYyA9ICIsIiwKIyAgICAgICAgICAgICAgICAgICBjaGVjay5uYW1lcyA9IFRSVUUsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKCiMgUG9tb2Nuw6EgZnVua2NpYSBuYSB2w71wb8SNZXQgxaF0YXRpc3TDrWsKY2FsY19zdGF0cyA8LSBmdW5jdGlvbihkZiwgZ3JvdXBfdmFyLCB2YWx1ZV92YXIpIHsKICBkZiAlPiUKICAgIGdyb3VwX2J5KHt7IGdyb3VwX3ZhciB9fSkgJT4lCiAgICBzdW1tYXJpc2UoCiAgICAgIG4gICAgICA9IG4oKSwKICAgICAgbWVhbiAgID0gbWVhbih7eyB2YWx1ZV92YXIgfX0sIG5hLnJtID0gVFJVRSksCiAgICAgIHNkICAgICA9IHNkKHt7IHZhbHVlX3ZhciB9fSwgbmEucm0gPSBUUlVFKSwKICAgICAgbWluICAgID0gbWluKHt7IHZhbHVlX3ZhciB9fSwgbmEucm0gPSBUUlVFKSwKICAgICAgcTI1ICAgID0gcXVhbnRpbGUoe3sgdmFsdWVfdmFyIH19LCAwLjI1LCBuYS5ybSA9IFRSVUUpLAogICAgICBtZWRpYW4gPSBtZWRpYW4oe3sgdmFsdWVfdmFyIH19LCBuYS5ybSA9IFRSVUUpLAogICAgICBxNzUgICAgPSBxdWFudGlsZSh7eyB2YWx1ZV92YXIgfX0sIDAuNzUsIG5hLnJtID0gVFJVRSksCiAgICAgIG1heCAgICA9IG1heCh7eyB2YWx1ZV92YXIgfX0sIG5hLnJtID0gVFJVRSksCiAgICAgIC5ncm91cHMgPSAiZHJvcCIKICAgICkKfQoKIyA9PT09PT09PT09PT09PT09PT0gMSkgUk9FIHBvZMS+YSBLYXRlZ29yaWEgPT09PT09PT09PT09PT09PT09CnJvZV9zdGF0cyA8LSBjYWxjX3N0YXRzKHVkYWplLCBLYXRlZ29yaWEsIFJPRSkKCnJvZV9zdGF0cyAlPiUKICBrYWJsZShkaWdpdHMgPSAyLCBjYXB0aW9uID0gIlrDoWtsYWRuw6kgxaF0YXRpc3Rpa3kgUk9FIHBvZMS+YSBrYXRlZ8OzcmllIikgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsCiAgICAgICAgICAgICAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpICU+JQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFKSAlPiUKICByb3dfc3BlYygwLCBib2xkID0gVFJVRSwgYmFja2dyb3VuZCA9ICIjZjJmMmYyIikgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDIsICJST0Ug4oCTIMWgdGF0aXN0aWt5IiA9IDcpKQoKIyA9PT09PT09PT09PT09PT09PT0gMikgUk9BIHBvZMS+YSBGb3JtYSA9PT09PT09PT09PT09PT09PT0Kcm9hX3N0YXRzIDwtIGNhbGNfc3RhdHModWRhamUsIEZvcm1hLCBST0EpCgpyb2Ffc3RhdHMgJT4lCiAga2FibGUoZGlnaXRzID0gMiwgY2FwdGlvbiA9ICJaw6FrbGFkbsOpIMWhdGF0aXN0aWt5IFJPQSBwb2TEvmEgZm9ybXkgZmlybXkiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSwKICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSkgJT4lCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUpICU+JQogIHJvd19zcGVjKDAsIGJvbGQgPSBUUlVFLCBiYWNrZ3JvdW5kID0gIiNmMmYyZjIiKSAlPiUKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMiwgIlJPQSDigJMgxaB0YXRpc3Rpa3kiID0gNykpCmBgYApgYGB7cn0KIyB0LXRlc3Q6IHBvcm92bmFuaWUgcHJpZW1lcm92IFJPRSBtZWR6aSBkdm9tYSBmb3JtYW1pIGZpcmllbQp0LnRlc3QucmVzdWx0IDwtIHQudGVzdCgKICBST0UgfiBGb3JtYSwgICAgICAgIyBwb3Jvdm7DoXZhbWUgUk9FIHBvZMS+YSBkdm9jaCBza3Vww61uIHYgc3TEunBjaSBGb3JtYQogIGRhdGEgPSB1ZGFqZSwKICB2YXIuZXF1YWwgPSBGQUxTRSAKKQoKdC50ZXN0LnJlc3VsdApgYGAKYGBge3J9CmFub3ZhLnJlc3VsdCA8LSBhb3YoUk9BIH4gRm9ybWEsIGRhdGEgPSB1ZGFqZSkKc3VtbWFyeShhbm92YS5yZXN1bHQpCgpgYGAKYGBge3J9CiMgTGluZcOhcm5hIHJlZ3Jlc2lhOiBwcmVkaWtjaWEgUk9FIG5hIHrDoWtsYWRlIMSPYWzFocOtY2ggdWthem92YXRlxL5vdgptb2RlbCA8LSBsbShST0UgfiBST0EgKyBFQklUREFtYXJ6YSArIE0gKyBaLCBkYXRhID0gdWRhamUpCnN1bW1hcnkobW9kZWwpCmBgYApgYGB7cn0KIyAtLS0gSEVBVE1BUCAoYmFzZSBSKSAtLS0KCiMgdnliZXIgbnVtZXJpY2vDqSBzdMS6cGNlCgpudW1fY29scyA8LSBjKCJST0UiLCJST0EiLCJFQklUIiwiRUJJVERBbWFyemEiLCJNIiwiWiIpCnN0b3BpZm5vdChhbGwobnVtX2NvbHMgJWluJSBuYW1lcyh1ZGFqZSkpKQoKIyBhayBqZSBFQklUIGFrbyB0ZXh0IHMgxI1pYXJrb3UvJSwgb8SNaXN0aSBhIHNrb252ZXJ0dWoKCmlmICghaXMubnVtZXJpYyh1ZGFqZSRFQklUKSkgewplYml0X2NsZWFuIDwtIGdzdWIoIlteMC05LC4tXSIsICIiLCB1ZGFqZSRFQklUKQplYml0X2NsZWFuIDwtIGNoYXJ0cigiLCIsICIuIiwgZWJpdF9jbGVhbikKdWRhamUkRUJJVCA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWMoZWJpdF9jbGVhbikpCn0KCiMga29yZWxhxI1uw6EgbWF0aWNhCgpjbSA8LSBjb3IodWRhamVbLCBudW1fY29sc10sIHVzZSA9ICJwYWlyd2lzZS5jb21wbGV0ZS5vYnMiKQoKIyBoZWF0bWFwIGJleiBkb2RhdG/EjW7DvWNoIGJhbMOta292CgpwYWwgPC0gY29sb3JSYW1wUGFsZXR0ZShjKCJyZWQiLCJ3aGl0ZSIsImJsdWUiKSkoMTAwKQpvcCA8LSBwYXIobWFyID0gYyg4LDgsMiwyKSkgICMgdsOkxI3FoWllIG9rcmFqZSBuYSBwb3Bpc2t5CmhlYXRtYXAoY20sIFJvd3YgPSBOQSwgQ29sdiA9IE5BLCBzY2FsZSA9ICJub25lIiwKY29sID0gcGFsLCBtYXJnaW5zID0gYyg4LDgpKQpwYXIob3ApCgojIC0tLSBzdHJ1xI1uw6EgaW50ZXJwcmV0w6FjaWEgcHJpYW1vIHYgUiAtLS0KCnVwcGVyIDwtIHdoaWNoKHVwcGVyLnRyaShjbSksIGFyci5pbmQgPSBUUlVFKQp2YWxzICA8LSBjbVt1cHBlcl0Kb3JkICAgPC0gb3JkZXIoYWJzKHZhbHMpLCBkZWNyZWFzaW5nID0gVFJVRSkKdG9wX24gPC0gbWluKDMsIGxlbmd0aCh2YWxzKSkKCmNhdCgiSW50ZXJwcmV0w6FjaWEgaGVhdG1hcHkga29yZWxhxI1uZWogbWF0aWNlOlxuIikKZm9yIChpIGluIHNlcV9sZW4odG9wX24pKSB7CnIgPC0gdXBwZXJbb3JkW2ldLCBdCmNhdChzcHJpbnRmKCLigKIgJXMgdnMgJXM6IGtvcmVsw6FjaWEgPSAlLjJmICglcylcbiIsCnJvd25hbWVzKGNtKVtyWzFdXSwgY29sbmFtZXMoY20pW3JbMl1dLAp2YWxzW29yZFtpXV0sIGlmZWxzZSh2YWxzW29yZFtpXV0+MCwicG96aXTDrXZueSB2esWlYWgiLCJuZWdhdMOtdm55IHZ6xaVhaCIpKSkKfQpjYXQoIkhvZG5vdHkgYmzDrXprZSArMSA9IHNpbG7DoSBwb3ppdMOtdm5hIHrDoXZpc2xvc8WlLCBibMOtemtlIC0xID0gc2lsbsOhIG5lZ2F0w612bmEsXG4iLAoiYmzDrXprbyAwID0gc2xhYsO9L8W+aWFkbnkgbGluZcOhcm55IHZ6xaVhaC4gU2lsbsOpIGtvcmVsw6FjaWUgc2xlZHVqIHByZSBtb8W+bsO6IG11bHRpa29saW5lYXJpdHUgdiByZWdyZXNpaS5cbiIpCgpgYGAKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKCiMgKGplbW7DqSDEjWlzdGVuaWUgRUJJVCwgYWsgYnkgYm9sIHRleHQgcyDEjWlhcmtvdSkKaWYgKCFpcy5udW1lcmljKHVkYWplJEVCSVQpKSB7CiAgZWJpdF9jbGVhbiA8LSBnc3ViKCJbXjAtOSwuLV0iLCAiIiwgdWRhamUkRUJJVCkKICBlYml0X2NsZWFuIDwtIGNoYXJ0cigiLCIsICIuIiwgZWJpdF9jbGVhbikKICB1ZGFqZSRFQklUIDwtIHN1cHByZXNzV2FybmluZ3MoYXMubnVtZXJpYyhlYml0X2NsZWFuKSkKfQoKIyBUT1AgNSBmaXJpZW0gcG9kxL5hIFJPRSBuYSBwb3Bpc2t5CnRvcDUgPC0gdWRhamUgJT4lIGFycmFuZ2UoZGVzYyhST0UpKSAlPiUgc2xpY2VfaGVhZChuID0gNSkKCmdncGxvdCh1ZGFqZSwgYWVzKHggPSBST0EsIHkgPSBST0UpKSArCiAgIyBodXN0b3Ruw6kga29udMO6cnkgKGtkZSBqZSBuYWp2aWFjIGJvZG92KQogIHN0YXRfZGVuc2l0eV8yZChhZXMoeiA9IC4ubGV2ZWwuLiksIGdlb20gPSAicG9seWdvbiIsIGFscGhhID0gMC4xNSkgKwogICMgYnVibGlueSDigJMgdmXEvmtvc8WlIHBvZMS+YSBFQklUREEgbWFyxb5lLCBmYXJiYSBwb2TEvmEgZm9ybXkKICBnZW9tX3BvaW50KGFlcyhzaXplID0gRUJJVERBbWFyemEsIGNvbG9yID0gRm9ybWEpLCBhbHBoYSA9IDAuNykgKwogICMgcmVncmVzbsOhIMSNaWFyYQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGxpbmV3aWR0aCA9IDAuOSkgKwogICMgcG9waXNreSBwcmUgdG9wIDUgcG9kxL5hIFJPRQogIGdlb21fdGV4dChkYXRhID0gdG9wNSwgYWVzKGxhYmVsID0gTmF6b3YpLCB2anVzdCA9IC0wLjcsIHNpemUgPSAzKSArCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKG5hbWUgPSAiRUJJVERBIG1hcsW+YSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJST0EgdnMgUk9FIOKAkyBidWJsaW55IChFQklUREEgbWFyxb5hKSwgZmFyYmEgcG9kxL5hIGZvcm15LCBodXN0b3Ruw6kga29udMO6cnkiLAogICAgeCA9ICJST0EiLAogICAgeSA9ICJST0UiLAogICAgY29sb3IgPSAiRm9ybWEiCiAgKQpgYGAKYGBge3J9CmNvcl9yb2Ffcm9lIDwtIGNvcih1ZGFqZSRST0EsIHVkYWplJFJPRSwgdXNlID0gInBhaXJ3aXNlLmNvbXBsZXRlLm9icyIpCmNhdChzcHJpbnRmKCJLb3JlbMOhY2lhIFJPQeKAk1JPRSA9ICUuMmYuIFbDpMSNxaFpZSBidWJsaW55ID0gdnnFocWhaWEgRUJJVERBIG1hcsW+YS4gCktvbnTDunJ5IHVrYXp1asO6IG9ibGFzdGkgcyBuYWp2w6TEjcWhb3Uga29uY2VudHLDoWNpb3UgZmlyaWVtLlxuIiwgY29yX3JvYV9yb2UpKQoKYGBgCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCgojIFByZXBvxI3DrXRhbWUgcHJpZW1lcm7DvSBwb8SNZXQgbXXFvm92IGEgxb5pZW4gdm8gdmVkZW7DrSBwb2TEvmEgZm9ybXkKZ2VuZGVyX3N0YXRzIDwtIHVkYWplICU+JQogIGdyb3VwX2J5KEZvcm1hKSAlPiUKICBzdW1tYXJpc2UoCiAgICBQcmllbWVybnlfcG9jZXRfbXV6b3YgPSBtZWFuKE0sIG5hLnJtID0gVFJVRSksCiAgICBQcmllbWVybnlfcG9jZXRfemllbiA9IG1lYW4oWiwgbmEucm0gPSBUUlVFKQogICkgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKFByaWVtZXJueV9wb2NldF9tdXpvdiwgUHJpZW1lcm55X3BvY2V0X3ppZW4pLAogICAgICAgICAgICAgICBuYW1lc190byA9ICJQb2hsYXZpZSIsCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJQcmllbWVybnlfcG9jZXQiKQoKIyBQcmVoxL5hZG7DvSBncm91cGVkIGJhcnBsb3QKZ2dwbG90KGdlbmRlcl9zdGF0cywgYWVzKHggPSBGb3JtYSwgeSA9IFByaWVtZXJueV9wb2NldCwgZmlsbCA9IFBvaGxhdmllKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoUHJpZW1lcm55X3BvY2V0LCAxKSksCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC45KSwgdmp1c3QgPSAtMC4zLCBzaXplID0gMykgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiM0NTc1YjQiLCAiI2Q3MzAyNyIpLAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk11xb5pIiwgIsW9ZW55IikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJQcmllbWVybsO9IHBvxI1ldCBtdcW+b3YgYSDFvmllbiB2byB2ZWRlbsOtIHBvZMS+YSBmb3JteSBmaXJteSIsCiAgICB4ID0gIkZvcm1hIGZpcm15IiwKICAgIHkgPSAiUHJpZW1lcm7DvSBwb8SNZXQgb3PDtGIiLAogICAgZmlsbCA9ICJQb2hsYXZpZSIKICApCgpgYGAKYGBge3J9CmdncGxvdCh1ZGFqZSwgYWVzKHggPSBNLCB5ID0gWiwgY29sb3IgPSBGb3JtYSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzLCBhbHBoYSA9IDAuNykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGxpbmV3aWR0aCA9IDAuOCkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicygKICAgIHRpdGxlID0gIlZ6xaVhaCBtZWR6aSBwb8SNdG9tIG11xb5vdiBhIMW+aWVuIHZvIHZlZGVuw60iLAogICAgeCA9ICJQb8SNZXQgbXXFvm92IHZvIHZlZGVuw60gKE0pIiwKICAgIHkgPSAiUG/EjWV0IMW+aWVuIHZvIHZlZGVuw60gKFopIiwKICAgIGNvbG9yID0gIkZvcm1hIGZpcm15IgogICkKCmBgYApgYGB7cn0KZ2VuZGVyX3N1bW1hcnkgPC0gdWRhamUgJT4lCiAgZ3JvdXBfYnkoRm9ybWEpICU+JQogIHN1bW1hcmlzZSgKICAgIG11emkgPSBtZWFuKE0sIG5hLnJtID0gVFJVRSksCiAgICB6ZW55ID0gbWVhbihaLCBuYS5ybSA9IFRSVUUpCiAgKQoKY2F0KCJJbnRlcnByZXTDoWNpYTpcbiIpCmFwcGx5KGdlbmRlcl9zdW1tYXJ5LCAxLCBmdW5jdGlvbihyKSB7CiAgY2F0KHNwcmludGYoIuKAoiBGb3JtYSAlczogcHJpZW1lcm7DvSBwb8SNZXQgbXXFvm92IHZvIHZlZGVuw60gPSAlLjFmLCDFvmllbiA9ICUuMWZcbiIsCiAgICAgICAgICAgICAgclsiRm9ybWEiXSwgYXMubnVtZXJpYyhyWyJtdXppIl0pLCBhcy5udW1lcmljKHJbInplbnkiXSkpKQp9KQpjYXQoIlogZ3JhZm92IHZpZG5vLCDFvmUgZm9ybXkgcy5yLm8uIG1hasO6IHNwcmF2aWRsYSB2aWFjIG11xb5vdiBha28gxb5pZW4gdm8gdmVkZW7DrSwKa8O9bSBwcmkgYS5zLiBqZSBwb2RpZWwgxb5pZW4gbyBuaWXEjW8gdnnFocWhw60sIGFsZSBzdMOhbGUgdiBtZW7FoWluZS4KU2NhdHRlciBncmFmIHVrYXp1amUsIMW+ZSBzIHJhc3TDumNpbSBwb8SNdG9tIG11xb5vdiBzYSBvYnZ5a2xlIHp2ecWhdWplIGFqIHBvxI1ldCDFvmllbiB2byB2ZWRlbsOtLArEjW8gbmF6bmHEjXVqZSwgxb5lIHbDpMSNxaFpZSBmaXJteSBtYWrDuiBjZWxrb3ZvIHbDpMSNxaFpZSBtYW5hxb7DqXJza2UgdMOtbXkgYSB2w6TEjcWhaXUgZGl2ZXJ6aXR1LlxuIikKCmBgYAoK