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

1. Výber premennej a príprava dát

Cieľ: vysvetliť, od čoho závisí čistý zisk firmy netIncome na základe cash-flow a súvisiacich položiek.

Ako vysvetľujúce premenné použijem:
• capitalExpenditures – kapitálové výdavky (investície),
• operatingCashflow – peňažné toky z operatívnej činnosti,
• cashflowFromFinancing – peňažné toky z financovania,
• depreciationDepletionAndAmortization – odpisy,
• changeInInventory – zmena zásob.

Tieto premenné majú jasný ekonomický vzťah k zisku a sú číselné.

# načítanie dát
firma <- read.csv("firmadata.csv", stringsAsFactors = TRUE)

# dátum ako Date a dummy premenná pre obdobie po roku 2020
firma$fiscalDateEnding <- as.Date(firma$fiscalDateEnding)
firma$DUM <- ifelse(firma$fiscalDateEnding >= as.Date("2020-01-01"), 1, 0)

Interpretácia

• Pracujeme s kvartálnymi údajmi jednej firmy (ticker A) v rokoch cca 2017–2025.
• Závislá premenná: čistý zisk netIncome.Zaujíma nás, či ho dokážeme vysvetliť pomocou cash-flow a súvisiacich položiek.
• Dummy premenná DUM = 1 pre obdobie od roku 2020 (post-covid / novšie obdobie), 0 predtým. Tú použijeme neskôr, keď budeme skúmať, či sa po 2020 mení úroveň zisku.

2. Základný lineárny model

Špecifikujem základný model:

mod0 <- lm(
  netIncome ~ capitalExpenditures +
    operatingCashflow +
    cashflowFromFinancing +
    depreciationDepletionAndAmortization +
    changeInInventory,
  data = firma
)

summary(mod0)

Call:
lm(formula = netIncome ~ capitalExpenditures + operatingCashflow + 
    cashflowFromFinancing + depreciationDepletionAndAmortization + 
    changeInInventory, data = firma)

Residuals:
       Min         1Q     Median         3Q        Max 
-457714609  -32869436    9128641   40255393  346995528 

Coefficients:
                                       Estimate Std. Error t value Pr(>|t|)
(Intercept)                          -1.153e+08  1.842e+08  -0.626    0.537
capitalExpenditures                   1.052e+00  1.319e+00   0.798    0.433
operatingCashflow                     1.575e-01  2.730e-01   0.577    0.569
cashflowFromFinancing                -1.271e-01  1.248e-01  -1.018    0.319
depreciationDepletionAndAmortization  3.486e+00  2.726e+00   1.279    0.213
changeInInventory                     5.009e-01  1.032e+00   0.486    0.632

Residual standard error: 1.43e+08 on 24 degrees of freedom
Multiple R-squared:  0.1993,    Adjusted R-squared:  0.03244 
F-statistic: 1.194 on 5 and 24 DF,  p-value: 0.3415

Interpretácia výsledkov

Pri odhade :
• R² ≈ 0,20, upravené R² ≈ 0,03 → model vysvetľuje len asi 20 % variability čistého zisku, čo je pomerne málo.
• Žiadny z koeficientov pri vysvetľujúcich premenných nie je štatisticky významný na hladine 5 % (p-hodnoty sú > 0,2).
• Celkový F-test (test, či sú všetky β₁…β₅ = 0) má p-hodnotu okolo 0,34 → nedokážeme štatisticky potvrdiť, že tieto premenné ako celok významne vysvetľujú zisk. Ekonomicky: lineárny vzťah „zisk = lineárna kombinácia cash-flow položiek“ nie je veľmi silný – zisk je pravdepodobne ovplyvnený aj inými faktormi (tržby, marže, jednorazové položky, makroprostredie…), ktoré v modeli chýbajú.

3. RESET test – test funkčnej špecifikácie

Teraz otestujeme, či je špecifikácia funkčnej formy rozumne zvolená, alebo či model trpí nesprávnou špecifikáciou (napr. chýbajúce mocniny, interakcie a pod.).

library(lmtest)

resettest(mod0, power = 2:3, type = "fitted")

    RESET test

data:  mod0
RESET = 1.2951, df1 = 2, df2 = 22, p-value = 0.2939

Interpretácia

• Ramsey RESET test porovnáva základný model s modelom, ktorý obsahuje aj vyššie mocniny predikovaného netIncome (resp. fitted values).
• Na tvojich dátach vychádza F-štatistika s p-hodnotou výrazne nad 0,05 (cca 0,7).
To znamená:
• Nenachádzame štatistický dôkaz, že by bola funkčná forma modelu zásadne nesprávna.
• Z pohľadu RESET testu nemusíme nutne pridávať kvadratické či vyššie mocniny vysvetľujúcich premenných – jednoduchá lineárna forma je akceptovateľná.

Pri tom ale treba mať na pamäti, že aj keď RESET neodmieta model, R² je stále nízke → špecifikácia síce nie je „hrubo zle“, ale model jednoducho nie je veľmi informatívny.

4. Rozšírený model s kvadratickými členmi

Aj tak vyskúšame rozšíriť model o kvadratické členy vysvetľujúcich premenných a porovnáme ho so základným modelom.

mod_quad <- lm(
  netIncome ~ capitalExpenditures + I(capitalExpenditures^2) +
    operatingCashflow + I(operatingCashflow^2) +
    cashflowFromFinancing + I(cashflowFromFinancing^2) +
    depreciationDepletionAndAmortization +
      I(depreciationDepletionAndAmortization^2) +
    changeInInventory + I(changeInInventory^2),
  data = firma
)

summary(mod_quad)

Call:
lm(formula = netIncome ~ capitalExpenditures + I(capitalExpenditures^2) + 
    operatingCashflow + I(operatingCashflow^2) + cashflowFromFinancing + 
    I(cashflowFromFinancing^2) + depreciationDepletionAndAmortization + 
    I(depreciationDepletionAndAmortization^2) + changeInInventory + 
    I(changeInInventory^2), data = firma)

Residuals:
       Min         1Q     Median         3Q        Max 
-430459553  -30917346   14806324   38925199  343825127 

Coefficients:
                                            Estimate Std. Error t value Pr(>|t|)
(Intercept)                               -1.417e+09  2.163e+09  -0.655    0.520
capitalExpenditures                        1.924e+00  1.072e+01   0.180    0.859
I(capitalExpenditures^2)                  -9.459e-09  8.630e-08  -0.110    0.914
operatingCashflow                          2.592e-01  7.229e-01   0.359    0.724
I(operatingCashflow^2)                    -3.282e-10  1.320e-09  -0.249    0.806
cashflowFromFinancing                     -1.508e-01  1.655e-01  -0.911    0.374
I(cashflowFromFinancing^2)                -6.187e-11  3.627e-10  -0.171    0.866
depreciationDepletionAndAmortization       4.306e+01  6.153e+01   0.700    0.492
I(depreciationDepletionAndAmortization^2) -2.943e-07  4.547e-07  -0.647    0.525
changeInInventory                          7.338e-01  1.631e+00   0.450    0.658
I(changeInInventory^2)                     4.992e-09  2.727e-08   0.183    0.857

Residual standard error: 158500000 on 19 degrees of freedom
Multiple R-squared:  0.2214,    Adjusted R-squared:  -0.1884 
F-statistic: 0.5402 on 10 and 19 DF,  p-value: 0.8406
anova(mod0, mod_quad)
Analysis of Variance Table

Model 1: netIncome ~ capitalExpenditures + operatingCashflow + cashflowFromFinancing + 
    depreciationDepletionAndAmortization + changeInInventory
Model 2: netIncome ~ capitalExpenditures + I(capitalExpenditures^2) + 
    operatingCashflow + I(operatingCashflow^2) + cashflowFromFinancing + 
    I(cashflowFromFinancing^2) + depreciationDepletionAndAmortization + 
    I(depreciationDepletionAndAmortization^2) + changeInInventory + 
    I(changeInInventory^2)
  Res.Df        RSS Df  Sum of Sq      F Pr(>F)
1     24 4.9061e+17                            
2     19 4.7706e+17  5 1.3552e+16 0.1079 0.9892

Interpretácia

• R² sa zvýši len minimálne (okolo 0,20), upravené R² je dokonca negatívne, pretože pridávame veľa parametrov pri malom počte pozorovaní (30).
• Žiadny z nových kvadratických členov nie je významný.
• Porovnanie modelov pomocou anova(mod0, mod_quad) ukazuje, že pridanie kvadratických členov štatisticky významne nezlepšuje fit (p-hodnota >> 0,05).

Záver:

Hoci sme rozšírili model o kvadratické členy, model sa nevylepšil – na tvojich dátach neexistuje jasný dôkaz o nelineárnych vzťahoch tohto typu. Vzhľadom na malú vzorku je skôr vhodné zostať pri jednoduchšej špecifikácii.

5. Dummy premenná (DUM) – zmena po roku 2020

Teraz skúsime model doplniť o dummy premennú DUM, ktorá odlišuje staršie obdobia (pred 2020) a novšie obdobia (od 2020). Cieľ: zistiť, či sa po 2020 úroveň zisku systematicky zmenila, keď kontrolujeme ostatné premenné.

mod_dum <- lm(
  netIncome ~ capitalExpenditures +
    operatingCashflow +
    cashflowFromFinancing +
    depreciationDepletionAndAmortization +
    changeInInventory +
    DUM,
  data = firma
)

summary(mod_dum)

Call:
lm(formula = netIncome ~ capitalExpenditures + operatingCashflow + 
    cashflowFromFinancing + depreciationDepletionAndAmortization + 
    changeInInventory + DUM, data = firma)

Residuals:
       Min         1Q     Median         3Q        Max 
-457018250  -31567758    9649300   44175305  348425156 

Coefficients:
                                       Estimate Std. Error t value Pr(>|t|)
(Intercept)                          -5.452e+07  3.164e+08  -0.172    0.865
capitalExpenditures                   8.577e-01  1.572e+00   0.546    0.591
operatingCashflow                     1.460e-01  2.827e-01   0.517    0.610
cashflowFromFinancing                -1.189e-01  1.319e-01  -0.902    0.377
depreciationDepletionAndAmortization  2.531e+00  4.871e+00   0.520    0.608
changeInInventory                     4.707e-01  1.060e+00   0.444    0.661
DUM                                   2.951e+07  1.236e+08   0.239    0.813

Residual standard error: 145900000 on 23 degrees of freedom
Multiple R-squared:  0.2012,    Adjusted R-squared:  -0.007138 
F-statistic: 0.9657 on 6 and 23 DF,  p-value: 0.4698
anova(mod0, mod_dum)
Analysis of Variance Table

Model 1: netIncome ~ capitalExpenditures + operatingCashflow + cashflowFromFinancing + 
    depreciationDepletionAndAmortization + changeInInventory
Model 2: netIncome ~ capitalExpenditures + operatingCashflow + cashflowFromFinancing + 
    depreciationDepletionAndAmortization + changeInInventory + 
    DUM
  Res.Df        RSS Df  Sum of Sq     F Pr(>F)
1     24 4.9061e+17                           
2     23 4.8940e+17  1 1.2124e+15 0.057 0.8135

Interpretácia

• Koeficient pri DUM (rozdiel medzi obdobiami po 2020 a pred 2020) nie je štatisticky významný (p-hodnota vysoko nad 0,05).
• R² sa takmer nezmení (≈ 0,20), AIC/BIC sú dokonca o niečo horšie ako pri mod0.
• anova(mod0, mod_dum) nepotvrdzuje štatisticky významné zlepšenie modelu.

Záver:

Nevieme preukázať, že by po roku 2020 došlo k systematickej zmene úrovne čistého zisku, po zohľadnení ostatných premenných v modeli. Dummy premenná je skôr zbytočná a základný model bez DUM je podľa informačných kritérií o niečo lepší.

6. Box–Cox transformácia závislej premennej

netIncome obsahuje aj záporné hodnoty. Na použitie Box–Cox transformácie musíme spraviť posun tak, aby všetky hodnoty boli kladné:

library(MASS)

y_pos <- firma$netIncome - min(firma$netIncome) + 1

mod_pos <- lm(
  y_pos ~ capitalExpenditures +
    operatingCashflow +
    cashflowFromFinancing +
    depreciationDepletionAndAmortization +
    changeInInventory,
  data = firma
)

bc <- boxcox(mod_pos)

# vizuálne odčítame lambda, alebo:
lambda_opt <- bc$x[which.max(bc$y)]
lambda_opt
[1] 0.8686869

Vychádza približne:
• λ ≈ 0,88, teda veľmi blízko k 1.

To znamená:
• Box–Cox navrhuje transformáciu veľmi podobnú identite → nie je silná potreba transformovať y.
• Keby vyšlo λ blízko 0, použili by sme logaritmus, atď.

Pre úplnosť ešte odhadneme model s transformovanou premennou:

if (abs(lambda_opt) < 1e-6) {
  firma$Y_lambda <- log(y_pos)
} else {
  firma$Y_lambda <- (y_pos^lambda_opt - 1) / lambda_opt
}

mod_lambda <- lm(
  Y_lambda ~ capitalExpenditures +
    operatingCashflow +
    cashflowFromFinancing +
    depreciationDepletionAndAmortization +
    changeInInventory,
  data = firma
)

summary(mod_lambda)

Call:
lm(formula = Y_lambda ~ capitalExpenditures + operatingCashflow + 
    cashflowFromFinancing + depreciationDepletionAndAmortization + 
    changeInInventory, data = firma)

Residuals:
      Min        1Q    Median        3Q       Max 
-37009204  -2445431   1070144   3214991  24984509 

Coefficients:
                                       Estimate Std. Error t value Pr(>|t|)
(Intercept)                           1.766e+07  1.405e+07   1.256    0.221
capitalExpenditures                   6.720e-02  1.006e-01   0.668    0.511
operatingCashflow                     1.222e-02  2.083e-02   0.587    0.563
cashflowFromFinancing                -1.027e-02  9.524e-03  -1.078    0.292
depreciationDepletionAndAmortization  2.857e-01  2.080e-01   1.373    0.182
changeInInventory                     4.402e-02  7.871e-02   0.559    0.581

Residual standard error: 10910000 on 24 degrees of freedom
Multiple R-squared:  0.2008,    Adjusted R-squared:  0.03426 
F-statistic: 1.206 on 5 and 24 DF,  p-value: 0.3365
# RESET test pre transformovaný model
resettest(mod_lambda, power = 2:3, type = "fitted")

    RESET test

data:  mod_lambda
RESET = 2.9495, df1 = 2, df2 = 22, p-value = 0.07331

Interpretácia

• R² transformovaného modelu je veľmi podobné (~0,20), žiadna premenná nie je výrazne významná.
• RESET test pre transformovaný model má p-hodnotu mierne pod 0,10, ale nad 0,05 → ak použijeme 5 % hladinu významnosti, špecifikáciu stále neodmietame; na 10 % je to už hraničné.
• Zmena závislej premennej pomocou Box–Cox zásadne nezlepšila model – potvrdzuje to aj fakt, že λ bolo blízko 1.

Záver:

Z pohľadu Box–Cox analýzy nie je transformácia závislej premennej kľúčová. Model s transformovaným netIncome sa správa veľmi podobne ako pôvodný.

7. Celkové zhrnutie (čo si „zistila“ v úlohe)

1.  Vybrali sme si čistý zisk netIncome ako závislú premennú a špecifikovali sme lineárny model s cash-flow premennými.  
2.  Základný model má nízke R² (~0,20) a žiadna vysvetľujúca premenná nie je štatisticky významná → zisk je len slabo vysvetlený týmito položkami.  
3.  RESET test neodmietol model → nemáme dôkaz, že by lineárna funkčná forma bola vyslovene nesprávna.  
4.  Rozšírenie modelu o kvadratické členy nevedie k zlepšeniu (žiadne nové významné koeficienty, horšie informačné kritériá).  
5.  Pridanie dummy premennej DUM pre obdobie po roku 2020 takisto nezlepšuje model a dummy nie je významná → nepreukázali sme štrukturálnu zmenu v zisku po 2020.  
6.  Box–Cox transformácia navrhla λ ≈ 0,88 (blízko 1), model s transformovanou závislou premennou nebol lepší → transformácia zmysel nemá.
LS0tCnRpdGxlOiAiRWtvbm9tZXRyaWEgLSB6YWRhbmllIMSNLiA3IgphdXRob3I6ICdBbmFzdGFzaXlhIFp5bGV2aWNoICA8YnI+ICcKZGF0ZTogIk5vdmVtYmVyIDIwMjUiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRoZW1lOiB1bml0ZWQKICAgIGhpZ2hsaWdodDogdGFuZ28KICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKZWRpdG9yX29wdGlvbnM6CiAgbWFya2Rvd246CiAgICB3cmFwOiA3MgotLS0KCmBgYHtyfQprbml0cjo6IG9wdHNfY2h1bmskc2V0KAogIGVjaG8gPSBUUlVFLAogIG1lc3NhbmdlID0gRkFMU0UsCiAgd2FybmluZyA9IEZBTFNFCikKYGBgCiMgMS4gVsO9YmVyIHByZW1lbm5laiBhIHByw61wcmF2YSBkw6F0CgpDaWXEvjogdnlzdmV0bGnFpSwgb2QgxI1vaG8gesOhdmlzw60gxI1pc3TDvSB6aXNrIGZpcm15IG5ldEluY29tZSBuYSB6w6FrbGFkZSBjYXNoLWZsb3cgYSBzw7p2aXNpYWNpY2ggcG9sb8W+aWVrLgoKQWtvIHZ5c3ZldMS+dWrDumNlIHByZW1lbm7DqSBwb3XFvmlqZW06ICAKCeKAogljYXBpdGFsRXhwZW5kaXR1cmVzIOKAkyBrYXBpdMOhbG92w6kgdsO9ZGF2a3kgKGludmVzdMOtY2llKSwgIAoJ4oCiCW9wZXJhdGluZ0Nhc2hmbG93IOKAkyBwZcWIYcW+bsOpIHRva3kgeiBvcGVyYXTDrXZuZWogxI1pbm5vc3RpLCAgCgnigKIJY2FzaGZsb3dGcm9tRmluYW5jaW5nIOKAkyBwZcWIYcW+bsOpIHRva3kgeiBmaW5hbmNvdmFuaWEsICAKCeKAoglkZXByZWNpYXRpb25EZXBsZXRpb25BbmRBbW9ydGl6YXRpb24g4oCTIG9kcGlzeSwgIAoJ4oCiCWNoYW5nZUluSW52ZW50b3J5IOKAkyB6bWVuYSB6w6Fzb2IuIAoKVGlldG8gcHJlbWVubsOpIG1hasO6IGphc27DvSBla29ub21pY2vDvSB2esWlYWggayB6aXNrdSBhIHPDuiDEjcOtc2VsbsOpLgoKYGBge3J9CiMgbmHEjcOtdGFuaWUgZMOhdApmaXJtYSA8LSByZWFkLmNzdigiZmlybWFkYXRhLmNzdiIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBUUlVFKQoKIyBkw6F0dW0gYWtvIERhdGUgYSBkdW1teSBwcmVtZW5uw6EgcHJlIG9iZG9iaWUgcG8gcm9rdSAyMDIwCmZpcm1hJGZpc2NhbERhdGVFbmRpbmcgPC0gYXMuRGF0ZShmaXJtYSRmaXNjYWxEYXRlRW5kaW5nKQpmaXJtYSREVU0gPC0gaWZlbHNlKGZpcm1hJGZpc2NhbERhdGVFbmRpbmcgPj0gYXMuRGF0ZSgiMjAyMC0wMS0wMSIpLCAxLCAwKQpgYGAKIyMgSW50ZXJwcmV0w6FjaWEK4oCiCVByYWN1amVtZSBzIGt2YXJ0w6FsbnltaSDDumRham1pIGplZG5laiBmaXJteSAodGlja2VyIEEpIHYgcm9rb2NoIGNjYSAyMDE34oCTMjAyNS4gIAoJ4oCiCVrDoXZpc2zDoSBwcmVtZW5uw6E6IMSNaXN0w70gemlzayBuZXRJbmNvbWUuWmF1asOtbWEgbsOhcywgxI1pIGhvIGRva8Ohxb5lbWUgdnlzdmV0bGnFpSBwb21vY291IGNhc2gtZmxvdyBhIHPDunZpc2lhY2ljaCBwb2xvxb5pZWsuICAKCeKAoglEdW1teSBwcmVtZW5uw6EgRFVNID0gMSBwcmUgb2Jkb2JpZSBvZCByb2t1IDIwMjAgKHBvc3QtY292aWQgLyBub3bFoWllIG9iZG9iaWUpLCAwIHByZWR0w71tLiBUw7ogcG91xb5pamVtZSBuZXNrw7RyLCBrZcSPIGJ1ZGVtZSBza8O6bWHFpSwgxI1pIHNhIHBvIDIwMjAgbWVuw60gw7pyb3ZlxYggemlza3UuCgkKIyAyLiBaw6FrbGFkbsO9IGxpbmXDoXJueSBtb2RlbAoKxaBwZWNpZmlrdWplbSB6w6FrbGFkbsO9IG1vZGVsOgoKYGBge3J9Cm1vZDAgPC0gbG0oCiAgbmV0SW5jb21lIH4gY2FwaXRhbEV4cGVuZGl0dXJlcyArCiAgICBvcGVyYXRpbmdDYXNoZmxvdyArCiAgICBjYXNoZmxvd0Zyb21GaW5hbmNpbmcgKwogICAgZGVwcmVjaWF0aW9uRGVwbGV0aW9uQW5kQW1vcnRpemF0aW9uICsKICAgIGNoYW5nZUluSW52ZW50b3J5LAogIGRhdGEgPSBmaXJtYQopCgpzdW1tYXJ5KG1vZDApCmBgYAojIyBJbnRlcnByZXTDoWNpYSB2w71zbGVka292ClByaSBvZGhhZGUgOiAgCgnigKIJUsKyIOKJiCAwLDIwLCB1cHJhdmVuw6kgUsKyIOKJiCAwLDAzCuKGkiBtb2RlbCB2eXN2ZXTEvnVqZSBsZW4gYXNpIDIwICUgdmFyaWFiaWxpdHkgxI1pc3TDqWhvIHppc2t1LCDEjW8gamUgcG9tZXJuZSBtw6Fsby4gIAoJ4oCiCcW9aWFkbnkgeiBrb2VmaWNpZW50b3YgcHJpIHZ5c3ZldMS+dWrDumNpY2ggcHJlbWVubsO9Y2ggbmllIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IG5hIGhsYWRpbmUgNSAlIChwLWhvZG5vdHkgc8O6ID4gMCwyKS4gIAoJ4oCiCUNlbGtvdsO9IEYtdGVzdCAodGVzdCwgxI1pIHPDuiB2xaFldGt5IM6y4oKB4oCmzrLigoUgPSAwKSBtw6EgcC1ob2Rub3R1IG9rb2xvIDAsMzQK4oaSIG5lZG9rw6HFvmVtZSDFoXRhdGlzdGlja3kgcG90dnJkacWlLCDFvmUgdGlldG8gcHJlbWVubsOpIGFrbyBjZWxvayB2w716bmFtbmUgdnlzdmV0xL51asO6IHppc2suCkVrb25vbWlja3k6CmxpbmXDoXJueSB2esWlYWgg4oCeemlzayA9IGxpbmXDoXJuYSBrb21iaW7DoWNpYSBjYXNoLWZsb3cgcG9sb8W+aWVr4oCcIG5pZSBqZSB2ZcS+bWkgc2lsbsO9IOKAkyB6aXNrIGplIHByYXZkZXBvZG9ibmUgb3ZwbHl2bmVuw70gYWogaW7DvW1pIGZha3Rvcm1pICh0csW+YnksIG1hcsW+ZSwgamVkbm9yYXpvdsOpIHBvbG/Fvmt5LCBtYWtyb3Byb3N0cmVkaWXigKYpLCBrdG9yw6kgdiBtb2RlbGkgY2jDvWJhasO6LgoKCiMgMy4gUkVTRVQgdGVzdCDigJMgdGVzdCBmdW5rxI1uZWogxaFwZWNpZmlrw6FjaWUgIApUZXJheiBvdGVzdHVqZW1lLCDEjWkgamUgxaFwZWNpZmlrw6FjaWEgZnVua8SNbmVqIGZvcm15IHJvenVtbmUgenZvbGVuw6EsIGFsZWJvIMSNaSBtb2RlbCB0cnDDrSBuZXNwcsOhdm5vdSDFoXBlY2lmaWvDoWNpb3UgKG5hcHIuIGNow71iYWrDumNlIG1vY25pbnksIGludGVyYWtjaWUgYSBwb2QuKS4KYGBge3J9CmxpYnJhcnkobG10ZXN0KQoKcmVzZXR0ZXN0KG1vZDAsIHBvd2VyID0gMjozLCB0eXBlID0gImZpdHRlZCIpCmBgYAoKIyMgSW50ZXJwcmV0w6FjaWEgCuKAoglSYW1zZXkgUkVTRVQgdGVzdCBwb3Jvdm7DoXZhIHrDoWtsYWRuw70gbW9kZWwgcyBtb2RlbG9tLCBrdG9yw70gb2JzYWh1amUgYWogdnnFocWhaWUgbW9jbmlueSBwcmVkaWtvdmFuw6lobyBuZXRJbmNvbWUgKHJlc3AuIGZpdHRlZCB2YWx1ZXMpLiAgCgnigKIJTmEgdHZvamljaCBkw6F0YWNoIHZ5Y2jDoWR6YSBGLcWhdGF0aXN0aWthIHMgcC1ob2Rub3RvdSB2w71yYXpuZSBuYWQgMCwwNSAoY2NhIDAsNykuICAKVG8gem5hbWVuw6E6ICAKCeKAoglOZW5hY2jDoWR6YW1lIMWhdGF0aXN0aWNrw70gZMO0a2F6LCDFvmUgYnkgYm9sYSBmdW5rxI1uw6EgZm9ybWEgbW9kZWx1IHrDoXNhZG5lIG5lc3Byw6F2bmEuICAKCeKAoglaIHBvaMS+YWR1IFJFU0VUIHRlc3R1IG5lbXVzw61tZSBudXRuZSBwcmlkw6F2YcWlIGt2YWRyYXRpY2vDqSDEjWkgdnnFocWhaWUgbW9jbmlueSB2eXN2ZXTEvnVqw7pjaWNoIHByZW1lbm7DvWNoIOKAkyBqZWRub2R1Y2jDoSBsaW5lw6FybmEgZm9ybWEgamUgYWtjZXB0b3ZhdGXEvm7DoS4KClByaSB0b20gYWxlIHRyZWJhIG1hxaUgbmEgcGFtw6R0aSwgxb5lIGFqIGtlxI8gUkVTRVQgbmVvZG1pZXRhIG1vZGVsLCBSwrIgamUgc3TDoWxlIG7DrXprZSDihpIgxaFwZWNpZmlrw6FjaWEgc8OtY2UgbmllIGplIOKAnmhydWJvIHpsZeKAnCwgYWxlIG1vZGVsIGplZG5vZHVjaG8gbmllIGplIHZlxL5taSBpbmZvcm1hdMOtdm55LgoKIyA0LiBSb3rFocOtcmVuw70gbW9kZWwgcyBrdmFkcmF0aWNrw71taSDEjWxlbm1pCgpBaiB0YWsgdnlza8O6xaFhbWUgcm96xaHDrXJpxaUgbW9kZWwgbyBrdmFkcmF0aWNrw6kgxI1sZW55IHZ5c3ZldMS+dWrDumNpY2ggcHJlbWVubsO9Y2ggYSBwb3Jvdm7DoW1lIGhvIHNvIHrDoWtsYWRuw71tIG1vZGVsb20uCgpgYGB7cn0KbW9kX3F1YWQgPC0gbG0oCiAgbmV0SW5jb21lIH4gY2FwaXRhbEV4cGVuZGl0dXJlcyArIEkoY2FwaXRhbEV4cGVuZGl0dXJlc14yKSArCiAgICBvcGVyYXRpbmdDYXNoZmxvdyArIEkob3BlcmF0aW5nQ2FzaGZsb3deMikgKwogICAgY2FzaGZsb3dGcm9tRmluYW5jaW5nICsgSShjYXNoZmxvd0Zyb21GaW5hbmNpbmdeMikgKwogICAgZGVwcmVjaWF0aW9uRGVwbGV0aW9uQW5kQW1vcnRpemF0aW9uICsKICAgICAgSShkZXByZWNpYXRpb25EZXBsZXRpb25BbmRBbW9ydGl6YXRpb25eMikgKwogICAgY2hhbmdlSW5JbnZlbnRvcnkgKyBJKGNoYW5nZUluSW52ZW50b3J5XjIpLAogIGRhdGEgPSBmaXJtYQopCgpzdW1tYXJ5KG1vZF9xdWFkKQphbm92YShtb2QwLCBtb2RfcXVhZCkKYGBgCiMjIEludGVycHJldMOhY2lhCuKAoglSwrIgc2EgenbDvcWhaSBsZW4gbWluaW3DoWxuZSAob2tvbG8gMCwyMCksIHVwcmF2ZW7DqSBSwrIgamUgZG9rb25jYSBuZWdhdMOtdm5lLCBwcmV0b8W+ZSBwcmlkw6F2YW1lIHZlxL5hIHBhcmFtZXRyb3YgcHJpIG1hbG9tIHBvxI10ZSBwb3pvcm92YW7DrSAoMzApLiAgCgnigKIJxb1pYWRueSB6IG5vdsO9Y2gga3ZhZHJhdGlja8O9Y2ggxI1sZW5vdiBuaWUgamUgdsO9em5hbW7DvS4gIAoJ4oCiCVBvcm92bmFuaWUgbW9kZWxvdiBwb21vY291IGFub3ZhKG1vZDAsIG1vZF9xdWFkKSB1a2F6dWplLCDFvmUgcHJpZGFuaWUga3ZhZHJhdGlja8O9Y2ggxI1sZW5vdiDFoXRhdGlzdGlja3kgdsO9em5hbW5lIG5lemxlcMWhdWplIGZpdCAocC1ob2Rub3RhID4+IDAsMDUpLgoKIFrDoXZlcjoKCiBIb2NpIHNtZSByb3rFocOtcmlsaSBtb2RlbCBvIGt2YWRyYXRpY2vDqSDEjWxlbnksIG1vZGVsIHNhIG5ldnlsZXDFoWlsIOKAkyBuYSB0dm9qaWNoIGTDoXRhY2ggbmVleGlzdHVqZSBqYXNuw70gZMO0a2F6IG8gbmVsaW5lw6FybnljaCB2esWlYWhvY2ggdG9odG8gdHlwdS4gVnpoxL5hZG9tIG5hIG1hbMO6IHZ6b3JrdSBqZSBza8O0ciB2aG9kbsOpIHpvc3RhxaUgcHJpIGplZG5vZHVjaMWhZWogxaFwZWNpZmlrw6FjaWkuCiAKIyA1LiBEdW1teSBwcmVtZW5uw6EgKERVTSkg4oCTIHptZW5hIHBvIHJva3UgMjAyMAoKVGVyYXogc2vDunNpbWUgbW9kZWwgZG9wbG5pxaUgbyBkdW1teSBwcmVtZW5uw7ogRFVNLCBrdG9yw6Egb2RsacWhdWplIHN0YXLFoWllIG9iZG9iaWEgKHByZWQgMjAyMCkgYSBub3bFoWllIG9iZG9iaWEgKG9kIDIwMjApLgpDaWXEvjogemlzdGnFpSwgxI1pIHNhIHBvIDIwMjAgw7pyb3ZlxYggemlza3Ugc3lzdGVtYXRpY2t5IHptZW5pbGEsIGtlxI8ga29udHJvbHVqZW1lIG9zdGF0bsOpIHByZW1lbm7DqS4KCmBgYHtyfQptb2RfZHVtIDwtIGxtKAogIG5ldEluY29tZSB+IGNhcGl0YWxFeHBlbmRpdHVyZXMgKwogICAgb3BlcmF0aW5nQ2FzaGZsb3cgKwogICAgY2FzaGZsb3dGcm9tRmluYW5jaW5nICsKICAgIGRlcHJlY2lhdGlvbkRlcGxldGlvbkFuZEFtb3J0aXphdGlvbiArCiAgICBjaGFuZ2VJbkludmVudG9yeSArCiAgICBEVU0sCiAgZGF0YSA9IGZpcm1hCikKCnN1bW1hcnkobW9kX2R1bSkKYW5vdmEobW9kMCwgbW9kX2R1bSkKYGBgCiMjIEludGVycHJldMOhY2lhCuKAoglLb2VmaWNpZW50IHByaSBEVU0gKHJvemRpZWwgbWVkemkgb2Jkb2JpYW1pIHBvIDIwMjAgYSBwcmVkIDIwMjApIG5pZSBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSAocC1ob2Rub3RhIHZ5c29rbyBuYWQgMCwwNSkuICAKCeKAoglSwrIgc2EgdGFrbWVyIG5lem1lbsOtICjiiYggMCwyMCksIEFJQy9CSUMgc8O6IGRva29uY2EgbyBuaWXEjW8gaG9yxaFpZSBha28gcHJpIG1vZDAuICAKCeKAoglhbm92YShtb2QwLCBtb2RfZHVtKSBuZXBvdHZyZHp1amUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw6kgemxlcMWhZW5pZSBtb2RlbHUuICAKClrDoXZlcjoKCk5ldmllbWUgcHJldWvDoXphxaUsIMW+ZSBieSBwbyByb2t1IDIwMjAgZG/FoWxvIGsgc3lzdGVtYXRpY2tlaiB6bWVuZSDDunJvdm5lIMSNaXN0w6lobyB6aXNrdSwgcG8gem9oxL5hZG5lbsOtIG9zdGF0bsO9Y2ggcHJlbWVubsO9Y2ggdiBtb2RlbGkuIER1bW15IHByZW1lbm7DoSBqZSBza8O0ciB6Ynl0b8SNbsOhIGEgesOha2xhZG7DvSBtb2RlbCBiZXogRFVNIGplIHBvZMS+YSBpbmZvcm1hxI1uw71jaCBrcml0w6lyacOtIG8gbmllxI1vIGxlcMWhw60uCgojIDYuIEJveOKAk0NveCB0cmFuc2Zvcm3DoWNpYSB6w6F2aXNsZWogcHJlbWVubmVqCgpuZXRJbmNvbWUgb2JzYWh1amUgYWogesOhcG9ybsOpIGhvZG5vdHkuIE5hIHBvdcW+aXRpZSBCb3jigJNDb3ggdHJhbnNmb3Jtw6FjaWUgbXVzw61tZSBzcHJhdmnFpSBwb3N1biB0YWssIGFieSB2xaFldGt5IGhvZG5vdHkgYm9saSBrbGFkbsOpOgoKYGBge3J9CmxpYnJhcnkoTUFTUykKCnlfcG9zIDwtIGZpcm1hJG5ldEluY29tZSAtIG1pbihmaXJtYSRuZXRJbmNvbWUpICsgMQoKbW9kX3BvcyA8LSBsbSgKICB5X3BvcyB+IGNhcGl0YWxFeHBlbmRpdHVyZXMgKwogICAgb3BlcmF0aW5nQ2FzaGZsb3cgKwogICAgY2FzaGZsb3dGcm9tRmluYW5jaW5nICsKICAgIGRlcHJlY2lhdGlvbkRlcGxldGlvbkFuZEFtb3J0aXphdGlvbiArCiAgICBjaGFuZ2VJbkludmVudG9yeSwKICBkYXRhID0gZmlybWEKKQoKYmMgPC0gYm94Y294KG1vZF9wb3MpCiMgdml6dcOhbG5lIG9kxI3DrXRhbWUgbGFtYmRhLCBhbGVibzoKbGFtYmRhX29wdCA8LSBiYyR4W3doaWNoLm1heChiYyR5KV0KbGFtYmRhX29wdApgYGAKVnljaMOhZHphIHByaWJsacW+bmU6ICAKCeKAognOuyDiiYggMCw4OCwgdGVkYSB2ZcS+bWkgYmzDrXprbyBrIDEuCgpUbyB6bmFtZW7DoTogIAoJ4oCiCUJveOKAk0NveCBuYXZyaHVqZSB0cmFuc2Zvcm3DoWNpdSB2ZcS+bWkgcG9kb2Juw7ogaWRlbnRpdGUg4oaSIG5pZSBqZSBzaWxuw6EgcG90cmViYSB0cmFuc2Zvcm1vdmHFpSB5LiAgIAoJ4oCiCUtlYnkgdnnFoWxvIM67IGJsw616a28gMCwgcG91xb5pbGkgYnkgc21lIGxvZ2FyaXRtdXMsIGF0xI8uCgkKUHJlIMO6cGxub3PFpSBlxaF0ZSBvZGhhZG5lbWUgbW9kZWwgcyB0cmFuc2Zvcm1vdmFub3UgcHJlbWVubm91OgpgYGB7cn0KaWYgKGFicyhsYW1iZGFfb3B0KSA8IDFlLTYpIHsKICBmaXJtYSRZX2xhbWJkYSA8LSBsb2coeV9wb3MpCn0gZWxzZSB7CiAgZmlybWEkWV9sYW1iZGEgPC0gKHlfcG9zXmxhbWJkYV9vcHQgLSAxKSAvIGxhbWJkYV9vcHQKfQoKbW9kX2xhbWJkYSA8LSBsbSgKICBZX2xhbWJkYSB+IGNhcGl0YWxFeHBlbmRpdHVyZXMgKwogICAgb3BlcmF0aW5nQ2FzaGZsb3cgKwogICAgY2FzaGZsb3dGcm9tRmluYW5jaW5nICsKICAgIGRlcHJlY2lhdGlvbkRlcGxldGlvbkFuZEFtb3J0aXphdGlvbiArCiAgICBjaGFuZ2VJbkludmVudG9yeSwKICBkYXRhID0gZmlybWEKKQoKc3VtbWFyeShtb2RfbGFtYmRhKQoKIyBSRVNFVCB0ZXN0IHByZSB0cmFuc2Zvcm1vdmFuw70gbW9kZWwKcmVzZXR0ZXN0KG1vZF9sYW1iZGEsIHBvd2VyID0gMjozLCB0eXBlID0gImZpdHRlZCIpCmBgYAoKIyMgSW50ZXJwcmV0w6FjaWEK4oCiCVLCsiB0cmFuc2Zvcm1vdmFuw6lobyBtb2RlbHUgamUgdmXEvm1pIHBvZG9ibsOpICh+MCwyMCksIMW+aWFkbmEgcHJlbWVubsOhIG5pZSBqZSB2w71yYXpuZSB2w716bmFtbsOhLiAgCgnigKIJUkVTRVQgdGVzdCBwcmUgdHJhbnNmb3Jtb3ZhbsO9IG1vZGVsIG3DoSBwLWhvZG5vdHUgbWllcm5lIHBvZCAwLDEwLCBhbGUgbmFkIDAsMDUK4oaSIGFrIHBvdcW+aWplbWUgNSAlIGhsYWRpbnUgdsO9em5hbW5vc3RpLCDFoXBlY2lmaWvDoWNpdSBzdMOhbGUgbmVvZG1pZXRhbWU7IG5hIDEwICUgamUgdG8gdcW+IGhyYW5pxI1uw6kuICAKCeKAoglabWVuYSB6w6F2aXNsZWogcHJlbWVubmVqIHBvbW9jb3UgQm944oCTQ294IHrDoXNhZG5lIG5lemxlcMWhaWxhIG1vZGVsIOKAkyBwb3R2cmR6dWplIHRvIGFqIGZha3QsIMW+ZSDOuyBib2xvIGJsw616a28gMS4KClrDoXZlcjoKClogcG9oxL5hZHUgQm944oCTQ294IGFuYWzDvXp5IG5pZSBqZSB0cmFuc2Zvcm3DoWNpYSB6w6F2aXNsZWogcHJlbWVubmVqIGvEvsO6xI1vdsOhLiBNb2RlbCBzIHRyYW5zZm9ybW92YW7DvW0gbmV0SW5jb21lIHNhIHNwcsOhdmEgdmXEvm1pIHBvZG9ibmUgYWtvIHDDtHZvZG7DvS4KCiMgNy4gQ2Vsa292w6kgemhybnV0aWUgKMSNbyBzaSDigJ56aXN0aWxh4oCcIHYgw7psb2hlKQoJMS4JVnlicmFsaSBzbWUgc2kgxI1pc3TDvSB6aXNrIG5ldEluY29tZSBha28gesOhdmlzbMO6IHByZW1lbm7DuiBhIMWhcGVjaWZpa292YWxpIHNtZSBsaW5lw6FybnkgbW9kZWwgcyBjYXNoLWZsb3cgcHJlbWVubsO9bWkuICAKCTIuCVrDoWtsYWRuw70gbW9kZWwgbcOhIG7DrXprZSBSwrIgKH4wLDIwKSBhIMW+aWFkbmEgdnlzdmV0xL51asO6Y2EgcHJlbWVubsOhIG5pZSBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DoSDihpIgemlzayBqZSBsZW4gc2xhYm8gdnlzdmV0bGVuw70gdMO9bWl0byBwb2xvxb5rYW1pLiAgCgkzLglSRVNFVCB0ZXN0IG5lb2RtaWV0b2wgbW9kZWwg4oaSIG5lbcOhbWUgZMO0a2F6LCDFvmUgYnkgbGluZcOhcm5hIGZ1bmvEjW7DoSBmb3JtYSBib2xhIHZ5c2xvdmVuZSBuZXNwcsOhdm5hLiAgCgk0LglSb3rFocOtcmVuaWUgbW9kZWx1IG8ga3ZhZHJhdGlja8OpIMSNbGVueSBuZXZlZGllIGsgemxlcMWhZW5pdSAoxb5pYWRuZSBub3bDqSB2w716bmFtbsOpIGtvZWZpY2llbnR5LCBob3LFoWllIGluZm9ybWHEjW7DqSBrcml0w6lyacOhKS4gIAoJNS4JUHJpZGFuaWUgZHVtbXkgcHJlbWVubmVqIERVTSBwcmUgb2Jkb2JpZSBwbyByb2t1IDIwMjAgdGFraXN0byBuZXpsZXDFoXVqZSBtb2RlbCBhIGR1bW15IG5pZSBqZSB2w716bmFtbsOhIOKGkiBuZXByZXVrw6F6YWxpIHNtZSDFoXRydWt0dXLDoWxudSB6bWVudSB2IHppc2t1IHBvIDIwMjAuICAKCTYuCUJveOKAk0NveCB0cmFuc2Zvcm3DoWNpYSBuYXZyaGxhIM67IOKJiCAwLDg4IChibMOtemtvIDEpLCBtb2RlbCBzIHRyYW5zZm9ybW92YW5vdSB6w6F2aXNsb3UgcHJlbWVubm91IG5lYm9sIGxlcMWhw60g4oaSIHRyYW5zZm9ybcOhY2lhIHpteXNlbCBuZW3DoS4KCg==