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

firmadata <- read.csv(“firmadata.csv”, header = TRUE, sep = “,”, dec = “.”, stringsAsFactors = FALSE)

V databáze firmadata sú zaznamenané finančné údaje jednej spoločnosti za rôzne obdobia. Každý riadok predstavuje jedno účtovné obdobie (štvrťrok alebo rok).

Prevod dátumu

firmadata$fiscalDateEnding <- as.Date(firmadata$fiscalDateEnding)
head(firmadata)

Zobrazenie prvých riadkov

head(firmadata)
colnames(firmadata)
 [1] "Symbol"                               "fiscalDateEnding"                    
 [3] "reportedCurrency"                     "capitalExpenditures"                 
 [5] "netIncome"                            "operatingCashflow"                   
 [7] "cashflowFromFinancing"                "depreciationDepletionAndAmortization"
 [9] "dividendPayout"                       "dividendPayoutCommonStock"           
[11] "proceedsFromRepurchaseOfEquity"       "changeInInventory"                   
[13] "cashflowFromInvestment"              

Popis databázy

Databáza firmadata obsahuje finančné údaje jednej spoločnosti za viac účtovných období. Každý riadok predstavuje jedno účtovné obdobie (štvrťrok alebo rok).

Premenné: - fiscalDateEnding – dátum konca účtovného obdobia, - netIncome – čistý zisk spoločnosti (v USD), - operatingCashflow – peňažný tok z operatívnych činností, - capitalExpenditures – kapitálové výdavky (investície do majetku), - dividendPayout – vyplatené dividendy, - cashflowFromInvestment – peňažný tok z investičných činností, - cashflowFromFinancing – peňažný tok z finančných činností, - depreciationDepletionAndAmortization – odpisy a amortizácia, - changeInInventory – zmena stavu zásob, - Symbol – označenie spoločnosti.

Graf – Vývoj čistého zisku v čase

library(ggplot2)

ggplot(firmadata, aes(x = fiscalDateEnding, y = as.numeric(netIncome))) +
  geom_line(color = "steelblue", linewidth = 1.2) +
  geom_point(color = "darkblue", size = 3) +
  theme_minimal() +
  labs(
    title = "Vývoj čistého zisku spoločnosti v čase",
    x = "Dátum účtovného obdobia",
    y = "Čistý zisk (USD)"
  )

Interpretácia: Graf zobrazuje vývoj čistého zisku jednej spoločnosti v priebehu rokov. Vidieť mierne kolísanie ziskovosti – v niektorých obdobiach firma zisk rýchlo rastie, v iných dochádza k poklesu, čo môže súvisieť s investičnými aktivitami alebo trhovými zmenami.

Vzťah medzi cashflow a čistým ziskom

ggplot(firmadata, aes(x = as.numeric(operatingCashflow), y = as.numeric(netIncome))) +
  geom_point(color = "darkgreen", size = 3) +
  geom_smooth(method = "lm", color = "black", se = FALSE) +
  theme_minimal() +
  labs(
    title = "Vzťah medzi peňažným tokom z operácií a čistým ziskom",
    x = "Operating Cashflow (USD)",
    y = "Net Income (USD)"
  )

Interpretácia: Medzi čistým ziskom a operatívnym cashflow existuje pozitívny vzťah – keď firma generuje viac hotovosti, zisk rastie. V grafe sa však objavuje jedna odľahlá hodnota (outlier) s extrémne vysokým cashflow, ktorá môže skresľovať koreláciu. Pri ďalšej analýze by bolo vhodné tento bod preskúmať osobitne.

Základné štatistiky finančných ukazovateľov

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

firm_stats <- firmadata %>%
  summarise(
    Priemerný_zisk = mean(as.numeric(netIncome), na.rm = TRUE),
    Priemerný_operacny_tok = mean(as.numeric(operatingCashflow), na.rm = TRUE),
    Priemerné_CapEx = mean(as.numeric(capitalExpenditures), na.rm = TRUE),
    SD_zisku = sd(as.numeric(netIncome), na.rm = TRUE),
    Minimum_zisku = min(as.numeric(netIncome), na.rm = TRUE),
    Maximum_zisku = max(as.numeric(netIncome), na.rm = TRUE)
  )

firm_stats %>%
  kable(digits = 2, caption = "Základné štatistiky spoločnosti v sledovanom období") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"))
Základné štatistiky spoločnosti v sledovanom období
Priemerný_zisk Priemerný_operacny_tok Priemerné_CapEx SD_zisku Minimum_zisku Maximum_zisku
253133333 335600000 58766667 145352540 -3.2e+08 5.04e+08

Interpretácia: Tabuľka sumarizuje vývoj zisku a cashflow spoločnosti za celé obdobie. Priemerný čistý zisk je kladný, čo znamená, že firma dlhodobo hospodári ziskovo. Rozptyl hodnôt ukazuje, že medzi obdobiami existujú výrazné rozdiely – najmä počas investičných cyklov.

Regresná analýza – čo ovplyvňuje zisk

model <- lm(as.numeric(netIncome) ~ as.numeric(operatingCashflow) + as.numeric(capitalExpenditures), data = firmadata)
summary(model)

Call:
lm(formula = as.numeric(netIncome) ~ as.numeric(operatingCashflow) + 
    as.numeric(capitalExpenditures), data = firmadata)

Residuals:
       Min         1Q     Median         3Q        Max 
-548556304  -29003378    8757990   48331362  301369524 

Coefficients:
                                 Estimate Std. Error t value Pr(>|t|)
(Intercept)                     1.092e+08  8.308e+07   1.315    0.200
as.numeric(operatingCashflow)   2.162e-01  2.451e-01   0.882    0.386
as.numeric(capitalExpenditures) 1.214e+00  1.270e+00   0.956    0.348

Residual standard error: 142100000 on 27 degrees of freedom
Multiple R-squared:  0.1107,    Adjusted R-squared:  0.04487 
F-statistic: 1.681 on 2 and 27 DF,  p-value: 0.2051

Interpretácia: Model naznačuje, že hoci medzi ziskom a cashflow existuje pozitívny vzťah, regresná analýza nepreukázala štatisticky významné koeficienty (p-hodnoty > 0.05). To znamená, že vzťah medzi sledovanými premennými nemusí byť lineárny, alebo má databáza príliš málo pozorovaní na preukázanie významnosti.

Testovanie hypotéz – t-test

Porovnáme, či sa čistý zisk výrazne líšil medzi dvoma časovými obdobiami (napr. rok 2023 vs 2024).

# Vytvorenie stĺpca s rokom
firmadata$rok <- format(firmadata$fiscalDateEnding, "%Y")

# Výber dvoch rokov na porovnanie
t.test.result <- t.test(
  as.numeric(firmadata$netIncome[firmadata$rok == "2023"]),
  as.numeric(firmadata$netIncome[firmadata$rok == "2024"]),
  alternative = "two.sided"
)
t.test.result

    Welch Two Sample t-test

data:  as.numeric(firmadata$netIncome[firmadata$rok == "2023"]) and as.numeric(firmadata$netIncome[firmadata$rok == "2024"])
t = -0.15818, df = 3.2888, p-value = 0.8835
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -246900477  222400477
sample estimates:
mean of x mean of y 
310000000 322250000 

Interpretácia: t-test porovnáva, či je priemerný čistý zisk v roku 2023 štatisticky odlišný od roku 2024. Ak je p-hodnota menšia ako 0.05, môžeme povedať, že medzi obdobiami existuje významný rozdiel. Výsledok zároveň ukazuje, v ktorom roku bola firma výnosnejšia.

ANOVA – rozdiely medzi rokmi

anova.result <- aov(as.numeric(netIncome) ~ rok, data = firmadata)
summary(anova.result)
            Df    Sum Sq   Mean Sq F value Pr(>F)
rok          8 2.101e+17 2.626e+16   1.369  0.266
Residuals   21 4.026e+17 1.917e+16               

Interpretácia: ANOVA test zisťuje, či sa priemerný zisk významne mení medzi jednotlivými rokmi. Ak je p-hodnota < 0.05, znamená to, že minimálne jeden rok sa líši od ostatných, teda zisk nebol konštantný.

Korelačná analýza – vzťahy medzi hlavnými premennými

# Vyber len numerické premenné
num_data <- firmadata %>%
  select(netIncome, operatingCashflow, capitalExpenditures, dividendPayout)

cor_matrix <- cor(sapply(num_data, as.numeric), use = "pairwise.complete.obs")

cor_matrix
                    netIncome operatingCashflow capitalExpenditures dividendPayout
netIncome           1.0000000         0.2840086           0.2917602      0.4694911
operatingCashflow   0.2840086         1.0000000           0.4975602      0.5240246
capitalExpenditures 0.2917602         0.4975602           1.0000000      0.7566708
dividendPayout      0.4694911         0.5240246           0.7566708      1.0000000

Interpretácia: Korelačná matica ukazuje silu vzťahu medzi jednotlivými finančnými ukazovateľmi. Vysoká kladná korelácia (blízko +1) znamená, že dve veličiny rastú spolu – napríklad netIncome a operatingCashflow. Naopak, záporná hodnota (blízko -1) indikuje opačný vzťah – napríklad capitalExpenditures často klesá, keď rastie zisk.

Korelačná analýza + HEATMAPA

library(reshape2)
library(ggplot2)

# Výber numerických stĺpcov
num_cols <- firmadata %>%
  select(netIncome, operatingCashflow, capitalExpenditures, dividendPayout,
         cashflowFromInvestment, cashflowFromFinancing)

# Výpočet korelačnej matice
cor_matrix <- cor(sapply(num_cols, as.numeric), use = "pairwise.complete.obs")

# Prevod do long formátu pre heatmap
cor_melt <- melt(cor_matrix)

# Vykreslenie heatmapy
ggplot(data = cor_melt, aes(Var1, Var2, fill = value)) +
  geom_tile(color = "white") +
  scale_fill_gradient2(low = "red", high = "blue", mid = "white", midpoint = 0,
                       limit = c(-1, 1), name = "Korelácia") +
  theme_minimal() +
  labs(title = "Korelačná matica finančných ukazovateľov",
       x = "", y = "") +
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))

Interpretácia: Heatmapa vizuálne zobrazuje vzťahy medzi finančnými ukazovateľmi. Tmavomodré polia znamenajú silnú kladnú koreláciu (napr. medzi čistým ziskom a cashflow), zatiaľ čo červené odtiene indikujú záporné väzby (napr. medzi ziskom a kapitálovými výdavkami). Tento graf dopĺňa numerickú korelačnú tabuľku a uľahčuje rýchle vizuálne porovnanie.

Boxplot – rozdelenie čistého zisku podľa rokov

ggplot(firmadata, aes(x = factor(rok), y = as.numeric(netIncome), fill = rok)) +
  geom_boxplot() +
  theme_minimal() +
  labs(
    title = "Rozdelenie čistého zisku podľa rokov",
    x = "Rok",
    y = "Čistý zisk (USD)"
  )

Interpretácia: Boxplot znázorňuje, ako sa rozdelenie ziskov menilo počas rokov. Širšie boxy naznačujú väčšiu variabilitu výsledkov, zatiaľ čo užšie boxy znamenajú stabilnejší výkon firmy. Ak sú niektoré body mimo boxu, ide o odľahlé hodnoty (extrémne výsledky).

Graf – vývoj kapitálových výdavkov (CapEx)

ggplot(firmadata, aes(x = fiscalDateEnding, y = as.numeric(capitalExpenditures))) +
  geom_line(color = "firebrick", linewidth = 1.2) +
  geom_point(color = "darkred", size = 3) +
  theme_minimal() +
  labs(
    title = "Vývoj kapitálových výdavkov spoločnosti",
    x = "Dátum účtovného obdobia",
    y = "Kapitalové výdavky (USD)"
  )

Interpretácia: Graf ukazuje, ako sa menili kapitálové investície spoločnosti v čase. Vidieť, že investičné obdobia sa striedajú s úspornejšími – čo je typické pre firmy s pravidelnými inováciami alebo rozšírením výroby.

Prehľad modelu (broom + kableExtra)

library(broom)
library(stringr)

coef.tbl <- tidy(model, conf.int = TRUE) %>%
  mutate(
    term = recode(term,
      "(Intercept)" = "Konštanta",
      "as.numeric(operatingCashflow)" = "Operating Cashflow",
      "as.numeric(capitalExpenditures)" = "Capital Expenditures"
    ),
    Sig = case_when(
      p.value < 0.001 ~ "***",
      p.value < 0.01  ~ "**",
      p.value < 0.05  ~ "*",
      p.value < 0.1   ~ "·",
      TRUE            ~ ""
    )
  )

coef.tbl %>%
  kable(
    digits = 3,
    caption = "Koeficienty lineárneho modelu"
  ) %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed")) %>%
  column_spec(1, bold = TRUE) %>%
  footnote(
    general = "Signif. codes: *** p<0.001, ** p<0.01, * p<0.05, · p<0.1.",
    threeparttable = TRUE
  )
Koeficienty lineárneho modelu
term estimate std.error statistic p.value conf.low conf.high Sig
Konštanta 1.09234e+08 83077694.512 1.315 0.200 -61227350.251 2.796953e+08
Operating Cashflow 2.16000e-01 0.245 0.882 0.386 -0.287 7.190000e-01
Capital Expenditures 1.21400e+00 1.270 0.956 0.348 -1.392 3.820000e+00
Note:
Signif. codes: *** p<0.001, ** p<0.01, * p<0.05, · p<0.1.

Interpretácia: Tabuľka prehľadne zobrazuje výsledky regresie – teda, ako silno jednotlivé faktory ovplyvňujú zisk. Hodnoty označené hviezdičkami sú štatisticky významné, čo znamená, že ich vplyv na zisk je preukázateľný.

Zhrnutie

Databáza firmadata obsahuje finančné údaje jednej spoločnosti za viac účtovných období. Analýza ukázala, že zisk spoločnosti úzko súvisí s peňažným tokom z operácií, zatiaľ čo kapitálové výdavky majú opačný efekt. Celkovo firma dosahuje dlhodobú ziskovosť, hoci jej výkonnosť kolíše podľa investičných cyklov.

LS0tCnRpdGxlOiAiUHLDoWNhIHMgZGF0YWLDoXpvdSAtIGltcG9ydCDDumRham92LCBncmFmeSwgxaF0YXRpc3Rpa3kiCmF1dGhvcjogIkFuYXN0YXNpeWEgWnlsZXZpY2ggIDxicj4KKHMgdnl1xb5pdMOtbSB2ZXJlam5lIGRvc3R1cG7DvWNoIGvDs2RvdiBhIENoYXRHUFQpIgpkYXRlOiAiT2t0b2JlciAyMDI1IgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdGhlbWU6IHVuaXRlZAogICAgaGlnaGxpZ2h0OiB0YW5nbwplZGl0b3Jfb3B0aW9uczogCiAgbWFya2Rvd246IAogICAgd3JhcDogNzIKLS0tCgpgYGB7cn0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KAogICAgZWNobyA9IFRSVUUsCiAgICBtZXNzYWdlID0gRkFMU0UsCiAgICB3YXJuaW5nID0gRkFMU0UKKQpgYGAKCmZpcm1hZGF0YSA8LSByZWFkLmNzdigiZmlybWFkYXRhLmNzdiIsIGhlYWRlciA9IFRSVUUsIHNlcCA9ICIsIiwgZGVjID0gIi4iLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCgpWIGRhdGFiw6F6ZSBmaXJtYWRhdGEgc8O6IHphem5hbWVuYW7DqSBmaW5hbsSNbsOpIMO6ZGFqZSBqZWRuZWogc3BvbG/EjW5vc3RpIHphIHLDtHpuZSBvYmRvYmlhLgpLYcW+ZMO9IHJpYWRvayBwcmVkc3RhdnVqZSBqZWRubyDDusSNdG92bsOpIG9iZG9iaWUgKMWhdHZyxaVyb2sgYWxlYm8gcm9rKS4KCiMgUHJldm9kIGTDoXR1bXUKYGBge3J9CmZpcm1hZGF0YSRmaXNjYWxEYXRlRW5kaW5nIDwtIGFzLkRhdGUoZmlybWFkYXRhJGZpc2NhbERhdGVFbmRpbmcpCmhlYWQoZmlybWFkYXRhKQpgYGAKCiMgWm9icmF6ZW5pZSBwcnbDvWNoIHJpYWRrb3YKYGBge3J9CmhlYWQoZmlybWFkYXRhKQpjb2xuYW1lcyhmaXJtYWRhdGEpCgpgYGAKIyMgUG9waXMgZGF0YWLDoXp5CgpEYXRhYsOhemEgKipmaXJtYWRhdGEqKiBvYnNhaHVqZSBmaW5hbsSNbsOpIMO6ZGFqZSBqZWRuZWogc3BvbG/EjW5vc3RpIHphIHZpYWMgw7rEjXRvdm7DvWNoIG9iZG9iw60uCkthxb5kw70gcmlhZG9rIHByZWRzdGF2dWplIGplZG5vIMO6xI10b3Zuw6kgb2Jkb2JpZSAoxaF0dnLFpXJvayBhbGVibyByb2spLgoKKipQcmVtZW5uw6k6KioKLSBgZmlzY2FsRGF0ZUVuZGluZ2Ag4oCTIGTDoXR1bSBrb25jYSDDusSNdG92bsOpaG8gb2Jkb2JpYSwKLSBgbmV0SW5jb21lYCDigJMgxI1pc3TDvSB6aXNrIHNwb2xvxI1ub3N0aSAodiBVU0QpLAotIGBvcGVyYXRpbmdDYXNoZmxvd2Ag4oCTIHBlxYhhxb5uw70gdG9rIHogb3BlcmF0w612bnljaCDEjWlubm9zdMOtLAotIGBjYXBpdGFsRXhwZW5kaXR1cmVzYCDigJMga2FwaXTDoWxvdsOpIHbDvWRhdmt5IChpbnZlc3TDrWNpZSBkbyBtYWpldGt1KSwKLSBgZGl2aWRlbmRQYXlvdXRgIOKAkyB2eXBsYXRlbsOpIGRpdmlkZW5keSwKLSBgY2FzaGZsb3dGcm9tSW52ZXN0bWVudGAg4oCTIHBlxYhhxb5uw70gdG9rIHogaW52ZXN0acSNbsO9Y2ggxI1pbm5vc3TDrSwKLSBgY2FzaGZsb3dGcm9tRmluYW5jaW5nYCDigJMgcGXFiGHFvm7DvSB0b2sgeiBmaW5hbsSNbsO9Y2ggxI1pbm5vc3TDrSwKLSBgZGVwcmVjaWF0aW9uRGVwbGV0aW9uQW5kQW1vcnRpemF0aW9uYCDigJMgb2RwaXN5IGEgYW1vcnRpesOhY2lhLAotIGBjaGFuZ2VJbkludmVudG9yeWAg4oCTIHptZW5hIHN0YXZ1IHrDoXNvYiwKLSBgU3ltYm9sYCDigJMgb3puYcSNZW5pZSBzcG9sb8SNbm9zdGkuCgojIEdyYWYg4oCTIFbDvXZvaiDEjWlzdMOpaG8gemlza3UgdiDEjWFzZQogIApgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQoKZ2dwbG90KGZpcm1hZGF0YSwgYWVzKHggPSBmaXNjYWxEYXRlRW5kaW5nLCB5ID0gYXMubnVtZXJpYyhuZXRJbmNvbWUpKSkgKwogIGdlb21fbGluZShjb2xvciA9ICJzdGVlbGJsdWUiLCBsaW5ld2lkdGggPSAxLjIpICsKICBnZW9tX3BvaW50KGNvbG9yID0gImRhcmtibHVlIiwgc2l6ZSA9IDMpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJWw712b2ogxI1pc3TDqWhvIHppc2t1IHNwb2xvxI1ub3N0aSB2IMSNYXNlIiwKICAgIHggPSAiRMOhdHVtIMO6xI10b3Zuw6lobyBvYmRvYmlhIiwKICAgIHkgPSAixIxpc3TDvSB6aXNrIChVU0QpIgogICkKYGBgCkludGVycHJldMOhY2lhOgpHcmFmIHpvYnJhenVqZSB2w712b2ogxI1pc3TDqWhvIHppc2t1IGplZG5laiBzcG9sb8SNbm9zdGkgdiBwcmllYmVodSByb2tvdi4KVmlkaWXFpSBtaWVybmUga29sw61zYW5pZSB6aXNrb3Zvc3RpIOKAkyB2IG5pZWt0b3LDvWNoIG9iZG9iaWFjaCBmaXJtYSB6aXNrIHLDvWNobG8gcmFzdGllLCB2IGluw71jaCBkb2Now6FkemEgayBwb2tsZXN1LCDEjW8gbcO0xb5lIHPDunZpc2llxaUgcyBpbnZlc3RpxI1uw71taSBha3Rpdml0YW1pIGFsZWJvIHRyaG92w71taSB6bWVuYW1pLgoKIyBWesWlYWggbWVkemkgY2FzaGZsb3cgYSDEjWlzdMO9bSB6aXNrb20KYGBge3J9CmdncGxvdChmaXJtYWRhdGEsIGFlcyh4ID0gYXMubnVtZXJpYyhvcGVyYXRpbmdDYXNoZmxvdyksIHkgPSBhcy5udW1lcmljKG5ldEluY29tZSkpKSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICJkYXJrZ3JlZW4iLCBzaXplID0gMykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gImJsYWNrIiwgc2UgPSBGQUxTRSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicygKICAgIHRpdGxlID0gIlZ6xaVhaCBtZWR6aSBwZcWIYcW+bsO9bSB0b2tvbSB6IG9wZXLDoWNpw60gYSDEjWlzdMO9bSB6aXNrb20iLAogICAgeCA9ICJPcGVyYXRpbmcgQ2FzaGZsb3cgKFVTRCkiLAogICAgeSA9ICJOZXQgSW5jb21lIChVU0QpIgogICkKYGBgCkludGVycHJldMOhY2lhOgpNZWR6aSDEjWlzdMO9bSB6aXNrb20gYSBvcGVyYXTDrXZueW0gY2FzaGZsb3cgZXhpc3R1amUgcG96aXTDrXZueSB2esWlYWgg4oCTIGtlxI8gZmlybWEgZ2VuZXJ1amUgdmlhYyBob3Rvdm9zdGksIHppc2sgcmFzdGllLgpWIGdyYWZlIHNhIHbFoWFrIG9iamF2dWplIGplZG5hIG9kxL5haGzDoSBob2Rub3RhIChvdXRsaWVyKSBzIGV4dHLDqW1uZSB2eXNva8O9bSBjYXNoZmxvdywga3RvcsOhIG3DtMW+ZSBza3Jlc8S+b3ZhxaUga29yZWzDoWNpdS4KUHJpIMSPYWzFoWVqIGFuYWzDvXplIGJ5IGJvbG8gdmhvZG7DqSB0ZW50byBib2QgcHJlc2vDum1hxaUgb3NvYml0bmUuCgojIFrDoWtsYWRuw6kgxaF0YXRpc3Rpa3kgZmluYW7EjW7DvWNoIHVrYXpvdmF0ZcS+b3YKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCmZpcm1fc3RhdHMgPC0gZmlybWFkYXRhICU+JQogIHN1bW1hcmlzZSgKICAgIFByaWVtZXJuw71femlzayA9IG1lYW4oYXMubnVtZXJpYyhuZXRJbmNvbWUpLCBuYS5ybSA9IFRSVUUpLAogICAgUHJpZW1lcm7DvV9vcGVyYWNueV90b2sgPSBtZWFuKGFzLm51bWVyaWMob3BlcmF0aW5nQ2FzaGZsb3cpLCBuYS5ybSA9IFRSVUUpLAogICAgUHJpZW1lcm7DqV9DYXBFeCA9IG1lYW4oYXMubnVtZXJpYyhjYXBpdGFsRXhwZW5kaXR1cmVzKSwgbmEucm0gPSBUUlVFKSwKICAgIFNEX3ppc2t1ID0gc2QoYXMubnVtZXJpYyhuZXRJbmNvbWUpLCBuYS5ybSA9IFRSVUUpLAogICAgTWluaW11bV96aXNrdSA9IG1pbihhcy5udW1lcmljKG5ldEluY29tZSksIG5hLnJtID0gVFJVRSksCiAgICBNYXhpbXVtX3ppc2t1ID0gbWF4KGFzLm51bWVyaWMobmV0SW5jb21lKSwgbmEucm0gPSBUUlVFKQogICkKCmZpcm1fc3RhdHMgJT4lCiAga2FibGUoZGlnaXRzID0gMiwgY2FwdGlvbiA9ICJaw6FrbGFkbsOpIMWhdGF0aXN0aWt5IHNwb2xvxI1ub3N0aSB2IHNsZWRvdmFub20gb2Jkb2LDrSIpICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFLCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpCmBgYApJbnRlcnByZXTDoWNpYToKVGFidcS+a2Egc3VtYXJpenVqZSB2w712b2ogemlza3UgYSBjYXNoZmxvdyBzcG9sb8SNbm9zdGkgemEgY2Vsw6kgb2Jkb2JpZS4KUHJpZW1lcm7DvSDEjWlzdMO9IHppc2sgamUga2xhZG7DvSwgxI1vIHpuYW1lbsOhLCDFvmUgZmlybWEgZGxob2RvYm8gaG9zcG9kw6FyaSB6aXNrb3ZvLgpSb3pwdHlsIGhvZG7DtHQgdWthenVqZSwgxb5lIG1lZHppIG9iZG9iaWFtaSBleGlzdHVqw7ogdsO9cmF6bsOpIHJvemRpZWx5IOKAkyBuYWptw6QgcG/EjWFzIGludmVzdGnEjW7DvWNoIGN5a2xvdi4KCiMgUmVncmVzbsOhIGFuYWzDvXphIOKAkyDEjW8gb3ZwbHl2xYh1amUgemlzawpgYGB7cn0KbW9kZWwgPC0gbG0oYXMubnVtZXJpYyhuZXRJbmNvbWUpIH4gYXMubnVtZXJpYyhvcGVyYXRpbmdDYXNoZmxvdykgKyBhcy5udW1lcmljKGNhcGl0YWxFeHBlbmRpdHVyZXMpLCBkYXRhID0gZmlybWFkYXRhKQpzdW1tYXJ5KG1vZGVsKQpgYGAKSW50ZXJwcmV0w6FjaWE6Ck1vZGVsIG5hem5hxI11amUsIMW+ZSBob2NpIG1lZHppIHppc2tvbSBhIGNhc2hmbG93IGV4aXN0dWplIHBveml0w612bnkgdnrFpWFoLApyZWdyZXNuw6EgYW5hbMO9emEgbmVwcmV1a8OhemFsYSDFoXRhdGlzdGlja3kgdsO9em5hbW7DqSBrb2VmaWNpZW50eSAocC1ob2Rub3R5ID4gMC4wNSkuClRvIHpuYW1lbsOhLCDFvmUgdnrFpWFoIG1lZHppIHNsZWRvdmFuw71taSBwcmVtZW5uw71taSBuZW11c8OtIGJ5xaUgbGluZcOhcm55LAphbGVibyBtw6EgZGF0YWLDoXphIHByw61sacWhIG3DoWxvIHBvem9yb3ZhbsOtIG5hIHByZXVrw6F6YW5pZSB2w716bmFtbm9zdGkuCgojIFRlc3RvdmFuaWUgaHlwb3TDqXog4oCTIHQtdGVzdApQb3Jvdm7DoW1lLCDEjWkgc2EgxI1pc3TDvSB6aXNrIHbDvXJhem5lIGzDrcWhaWwgbWVkemkgZHZvbWEgxI1hc292w71taSBvYmRvYmlhbWkgKG5hcHIuIHJvayAyMDIzIHZzIDIwMjQpLgpgYGB7cn0KIyBWeXR2b3JlbmllIHN0xLpwY2EgcyByb2tvbQpmaXJtYWRhdGEkcm9rIDwtIGZvcm1hdChmaXJtYWRhdGEkZmlzY2FsRGF0ZUVuZGluZywgIiVZIikKCiMgVsO9YmVyIGR2b2NoIHJva292IG5hIHBvcm92bmFuaWUKdC50ZXN0LnJlc3VsdCA8LSB0LnRlc3QoCiAgYXMubnVtZXJpYyhmaXJtYWRhdGEkbmV0SW5jb21lW2Zpcm1hZGF0YSRyb2sgPT0gIjIwMjMiXSksCiAgYXMubnVtZXJpYyhmaXJtYWRhdGEkbmV0SW5jb21lW2Zpcm1hZGF0YSRyb2sgPT0gIjIwMjQiXSksCiAgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIgopCnQudGVzdC5yZXN1bHQKYGBgCkludGVycHJldMOhY2lhOgp0LXRlc3QgcG9yb3Zuw6F2YSwgxI1pIGplIHByaWVtZXJuw70gxI1pc3TDvSB6aXNrIHYgcm9rdSAyMDIzIMWhdGF0aXN0aWNreSBvZGxpxaFuw70gb2Qgcm9rdSAyMDI0LgpBayBqZSBwLWhvZG5vdGEgbWVuxaFpYSBha28gMC4wNSwgbcO0xb5lbWUgcG92ZWRhxaUsIMW+ZSBtZWR6aSBvYmRvYmlhbWkgZXhpc3R1amUgdsO9em5hbW7DvSByb3pkaWVsLgpWw71zbGVkb2sgesOhcm92ZcWIIHVrYXp1amUsIHYga3Rvcm9tIHJva3UgYm9sYSBmaXJtYSB2w71ub3NuZWrFoWlhLgoKIyBBTk9WQSDigJMgcm96ZGllbHkgbWVkemkgcm9rbWkKCmBgYHtyfQphbm92YS5yZXN1bHQgPC0gYW92KGFzLm51bWVyaWMobmV0SW5jb21lKSB+IHJvaywgZGF0YSA9IGZpcm1hZGF0YSkKc3VtbWFyeShhbm92YS5yZXN1bHQpCmBgYApJbnRlcnByZXTDoWNpYToKQU5PVkEgdGVzdCB6aXPFpXVqZSwgxI1pIHNhIHByaWVtZXJuw70gemlzayB2w716bmFtbmUgbWVuw60gbWVkemkgamVkbm90bGl2w71taSByb2ttaS4KQWsgamUgcC1ob2Rub3RhIDwgMC4wNSwgem5hbWVuw6EgdG8sIMW+ZSBtaW5pbcOhbG5lIGplZGVuIHJvayBzYSBsw63FoWkgb2Qgb3N0YXRuw71jaCwgdGVkYSB6aXNrIG5lYm9sIGtvbsWhdGFudG7DvS4KCiMgS29yZWxhxI1uw6EgYW5hbMO9emEg4oCTIHZ6xaVhaHkgbWVkemkgaGxhdm7DvW1pIHByZW1lbm7DvW1pCmBgYHtyfQojIFZ5YmVyIGxlbiBudW1lcmlja8OpIHByZW1lbm7DqQpudW1fZGF0YSA8LSBmaXJtYWRhdGEgJT4lCiAgc2VsZWN0KG5ldEluY29tZSwgb3BlcmF0aW5nQ2FzaGZsb3csIGNhcGl0YWxFeHBlbmRpdHVyZXMsIGRpdmlkZW5kUGF5b3V0KQoKY29yX21hdHJpeCA8LSBjb3Ioc2FwcGx5KG51bV9kYXRhLCBhcy5udW1lcmljKSwgdXNlID0gInBhaXJ3aXNlLmNvbXBsZXRlLm9icyIpCgpjb3JfbWF0cml4CmBgYApJbnRlcnByZXTDoWNpYToKS29yZWxhxI1uw6EgbWF0aWNhIHVrYXp1amUgc2lsdSB2esWlYWh1IG1lZHppIGplZG5vdGxpdsO9bWkgZmluYW7EjW7DvW1pIHVrYXpvdmF0ZcS+bWkuClZ5c29rw6Ega2xhZG7DoSBrb3JlbMOhY2lhIChibMOtemtvICsxKSB6bmFtZW7DoSwgxb5lIGR2ZSB2ZWxpxI1pbnkgcmFzdMO6IHNwb2x1IOKAkyBuYXByw61rbGFkIG5ldEluY29tZSBhIG9wZXJhdGluZ0Nhc2hmbG93LgpOYW9wYWssIHrDoXBvcm7DoSBob2Rub3RhIChibMOtemtvIC0xKSBpbmRpa3VqZSBvcGHEjW7DvSB2esWlYWgg4oCTIG5hcHLDrWtsYWQgY2FwaXRhbEV4cGVuZGl0dXJlcyDEjWFzdG8ga2xlc8OhLCBrZcSPIHJhc3RpZSB6aXNrLgoKIyBLb3JlbGHEjW7DoSBhbmFsw716YSArIEhFQVRNQVBBCmBgYHtyfQpsaWJyYXJ5KHJlc2hhcGUyKQpsaWJyYXJ5KGdncGxvdDIpCgojIFbDvWJlciBudW1lcmlja8O9Y2ggc3TEunBjb3YKbnVtX2NvbHMgPC0gZmlybWFkYXRhICU+JQogIHNlbGVjdChuZXRJbmNvbWUsIG9wZXJhdGluZ0Nhc2hmbG93LCBjYXBpdGFsRXhwZW5kaXR1cmVzLCBkaXZpZGVuZFBheW91dCwKICAgICAgICAgY2FzaGZsb3dGcm9tSW52ZXN0bWVudCwgY2FzaGZsb3dGcm9tRmluYW5jaW5nKQoKIyBWw71wb8SNZXQga29yZWxhxI1uZWogbWF0aWNlCmNvcl9tYXRyaXggPC0gY29yKHNhcHBseShudW1fY29scywgYXMubnVtZXJpYyksIHVzZSA9ICJwYWlyd2lzZS5jb21wbGV0ZS5vYnMiKQoKIyBQcmV2b2QgZG8gbG9uZyBmb3Jtw6F0dSBwcmUgaGVhdG1hcApjb3JfbWVsdCA8LSBtZWx0KGNvcl9tYXRyaXgpCgojIFZ5a3Jlc2xlbmllIGhlYXRtYXB5CmdncGxvdChkYXRhID0gY29yX21lbHQsIGFlcyhWYXIxLCBWYXIyLCBmaWxsID0gdmFsdWUpKSArCiAgZ2VvbV90aWxlKGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdyA9ICJyZWQiLCBoaWdoID0gImJsdWUiLCBtaWQgPSAid2hpdGUiLCBtaWRwb2ludCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBjKC0xLCAxKSwgbmFtZSA9ICJLb3JlbMOhY2lhIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicyh0aXRsZSA9ICJLb3JlbGHEjW7DoSBtYXRpY2EgZmluYW7EjW7DvWNoIHVrYXpvdmF0ZcS+b3YiLAogICAgICAgeCA9ICIiLCB5ID0gIiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCB2anVzdCA9IDEsIGhqdXN0ID0gMSkpCmBgYApJbnRlcnByZXTDoWNpYToKSGVhdG1hcGEgdml6dcOhbG5lIHpvYnJhenVqZSB2esWlYWh5IG1lZHppIGZpbmFuxI1uw71taSB1a2F6b3ZhdGXEvm1pLgpUbWF2b21vZHLDqSBwb2xpYSB6bmFtZW5hasO6IHNpbG7DuiBrbGFkbsO6IGtvcmVsw6FjaXUgKG5hcHIuIG1lZHppIMSNaXN0w71tIHppc2tvbSBhIGNhc2hmbG93KSwKemF0aWHEviDEjW8gxI1lcnZlbsOpIG9kdGllbmUgaW5kaWt1asO6IHrDoXBvcm7DqSB2w6R6YnkgKG5hcHIuIG1lZHppIHppc2tvbSBhIGthcGl0w6Fsb3bDvW1pIHbDvWRhdmthbWkpLgpUZW50byBncmFmIGRvcMS6xYhhIG51bWVyaWNrw7oga29yZWxhxI1uw7ogdGFidcS+a3UgYSB1xL5haMSNdWplIHLDvWNobGUgdml6dcOhbG5lIHBvcm92bmFuaWUuCgojIEJveHBsb3Qg4oCTIHJvemRlbGVuaWUgxI1pc3TDqWhvIHppc2t1IHBvZMS+YSByb2tvdgpgYGB7cn0KZ2dwbG90KGZpcm1hZGF0YSwgYWVzKHggPSBmYWN0b3Iocm9rKSwgeSA9IGFzLm51bWVyaWMobmV0SW5jb21lKSwgZmlsbCA9IHJvaykpICsKICBnZW9tX2JveHBsb3QoKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKAogICAgdGl0bGUgPSAiUm96ZGVsZW5pZSDEjWlzdMOpaG8gemlza3UgcG9kxL5hIHJva292IiwKICAgIHggPSAiUm9rIiwKICAgIHkgPSAixIxpc3TDvSB6aXNrIChVU0QpIgogICkKYGBgCkludGVycHJldMOhY2lhOgpCb3hwbG90IHpuw6F6b3LFiHVqZSwgYWtvIHNhIHJvemRlbGVuaWUgemlza292IG1lbmlsbyBwb8SNYXMgcm9rb3YuCsWgaXLFoWllIGJveHkgbmF6bmHEjXVqw7ogdsOkxI3FoWl1IHZhcmlhYmlsaXR1IHbDvXNsZWRrb3YsIHphdGlhxL4gxI1vIHXFvsWhaWUgYm94eSB6bmFtZW5hasO6IHN0YWJpbG5lasWhw60gdsO9a29uIGZpcm15LgpBayBzw7ogbmlla3RvcsOpIGJvZHkgbWltbyBib3h1LCBpZGUgbyBvZMS+YWhsw6kgaG9kbm90eSAoZXh0csOpbW5lIHbDvXNsZWRreSkuCgojIEdyYWYg4oCTIHbDvXZvaiBrYXBpdMOhbG92w71jaCB2w71kYXZrb3YgKENhcEV4KQoKYGBge3J9CmdncGxvdChmaXJtYWRhdGEsIGFlcyh4ID0gZmlzY2FsRGF0ZUVuZGluZywgeSA9IGFzLm51bWVyaWMoY2FwaXRhbEV4cGVuZGl0dXJlcykpKSArCiAgZ2VvbV9saW5lKGNvbG9yID0gImZpcmVicmljayIsIGxpbmV3aWR0aCA9IDEuMikgKwogIGdlb21fcG9pbnQoY29sb3IgPSAiZGFya3JlZCIsIHNpemUgPSAzKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKAogICAgdGl0bGUgPSAiVsO9dm9qIGthcGl0w6Fsb3bDvWNoIHbDvWRhdmtvdiBzcG9sb8SNbm9zdGkiLAogICAgeCA9ICJEw6F0dW0gw7rEjXRvdm7DqWhvIG9iZG9iaWEiLAogICAgeSA9ICJLYXBpdGFsb3bDqSB2w71kYXZreSAoVVNEKSIKICApCmBgYApJbnRlcnByZXTDoWNpYToKR3JhZiB1a2F6dWplLCBha28gc2EgbWVuaWxpIGthcGl0w6Fsb3bDqSBpbnZlc3TDrWNpZSBzcG9sb8SNbm9zdGkgdiDEjWFzZS4KVmlkaWXFpSwgxb5lIGludmVzdGnEjW7DqSBvYmRvYmlhIHNhIHN0cmllZGFqw7ogcyDDunNwb3JuZWrFocOtbWkg4oCTIMSNbyBqZSB0eXBpY2vDqSBwcmUgZmlybXkgcyBwcmF2aWRlbG7DvW1pIGlub3bDoWNpYW1pIGFsZWJvIHJvesWhw61yZW7DrW0gdsO9cm9ieS4KCiMgUHJlaMS+YWQgbW9kZWx1IChicm9vbSArIGthYmxlRXh0cmEpCmBgYHtyfQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KHN0cmluZ3IpCgpjb2VmLnRibCA8LSB0aWR5KG1vZGVsLCBjb25mLmludCA9IFRSVUUpICU+JQogIG11dGF0ZSgKICAgIHRlcm0gPSByZWNvZGUodGVybSwKICAgICAgIihJbnRlcmNlcHQpIiA9ICJLb27FoXRhbnRhIiwKICAgICAgImFzLm51bWVyaWMob3BlcmF0aW5nQ2FzaGZsb3cpIiA9ICJPcGVyYXRpbmcgQ2FzaGZsb3ciLAogICAgICAiYXMubnVtZXJpYyhjYXBpdGFsRXhwZW5kaXR1cmVzKSIgPSAiQ2FwaXRhbCBFeHBlbmRpdHVyZXMiCiAgICApLAogICAgU2lnID0gY2FzZV93aGVuKAogICAgICBwLnZhbHVlIDwgMC4wMDEgfiAiKioqIiwKICAgICAgcC52YWx1ZSA8IDAuMDEgIH4gIioqIiwKICAgICAgcC52YWx1ZSA8IDAuMDUgIH4gIioiLAogICAgICBwLnZhbHVlIDwgMC4xICAgfiAiwrciLAogICAgICBUUlVFICAgICAgICAgICAgfiAiIgogICAgKQogICkKCmNvZWYudGJsICU+JQogIGthYmxlKAogICAgZGlnaXRzID0gMywKICAgIGNhcHRpb24gPSAiS29lZmljaWVudHkgbGluZcOhcm5laG8gbW9kZWx1IgogICkgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSkgJT4lCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUpICU+JQogIGZvb3Rub3RlKAogICAgZ2VuZXJhbCA9ICJTaWduaWYuIGNvZGVzOiAqKiogcDwwLjAwMSwgKiogcDwwLjAxLCAqIHA8MC4wNSwgwrcgcDwwLjEuIiwKICAgIHRocmVlcGFydHRhYmxlID0gVFJVRQogICkKYGBgCkludGVycHJldMOhY2lhOgpUYWJ1xL5rYSBwcmVoxL5hZG5lIHpvYnJhenVqZSB2w71zbGVka3kgcmVncmVzaWUg4oCTIHRlZGEsIGFrbyBzaWxubyBqZWRub3RsaXbDqSBmYWt0b3J5IG92cGx5dsWIdWrDuiB6aXNrLgpIb2Rub3R5IG96bmHEjWVuw6kgaHZpZXpkacSNa2FtaSBzw7ogxaF0YXRpc3RpY2t5IHbDvXpuYW1uw6ksIMSNbyB6bmFtZW7DoSwgxb5lIGljaCB2cGx5diBuYSB6aXNrIGplIHByZXVrw6F6YXRlxL5uw70uCgojIyBaaHJudXRpZQpEYXRhYsOhemEgZmlybWFkYXRhIG9ic2FodWplIGZpbmFuxI1uw6kgw7pkYWplIGplZG5laiBzcG9sb8SNbm9zdGkgemEgdmlhYyDDusSNdG92bsO9Y2ggb2Jkb2LDrS4KQW5hbMO9emEgdWvDoXphbGEsIMW+ZSB6aXNrIHNwb2xvxI1ub3N0aSDDunprbyBzw7p2aXPDrSBzIHBlxYhhxb5uw71tIHRva29tIHogb3BlcsOhY2nDrSwgemF0aWHEviDEjW8ga2FwaXTDoWxvdsOpIHbDvWRhdmt5IG1hasO6IG9wYcSNbsO9IGVmZWt0LgpDZWxrb3ZvIGZpcm1hIGRvc2FodWplIGRsaG9kb2LDuiB6aXNrb3Zvc8WlLCBob2NpIGplaiB2w71rb25ub3PFpSBrb2zDrcWhZSBwb2TEvmEgaW52ZXN0acSNbsO9Y2ggY3lrbG92Lgo=