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

Import a náhľad údaje

Dataset barc_data.csv z roku 2017 obsahuje informácie o dopravných nehodách v Barcelone.

udaje <- read.csv2("barc_data.csv",header=TRUE,sep=";",dec=".")
head(udaje)                                            
colnames(udaje)                                        
 [1] "Id"                    "District.Name_prek."   "District.Name"        
 [4] "Neighborhood.Name"     "Street"                "Weekday_prek."        
 [7] "Weekday"               "Date"                  "Mesiace"              
[10] "Part.of.the.day_prek." "Part.of.the.day"       "Hour"                 
[13] "Mild.injuries"         "Serious.injuries"      "Victims"              
[16] "Vehicles.involved"     "Longitude"             "Latitude"             
[19] "Hour.1"               

Grafy

library(dplyr)

barc_data <- udaje %>%
  filter(Date == 2017-04-19) %>%
  select(Weekday, Mild.injuries, Vehicles.involved, Longitude, Latitude)

Scatter plot

Graf znázorňuje vzťah medzi počtom vozidiel zapojených do nehôd a ich zemepisnou dĺžkou. Údaje sú rozdelené podľa časti dňa (ráno, popoludnie, noc), takže vidíme, kedy sa nehody s viacerými vozidlami vyskytujú častejšie. Farby bodov označujú dni v týždni, čo umožňuje porovnať, v ktoré dni a kde sa nehody najčastejšie stávajú.

Z grafu môžeme vidieť, že ráno a popoludní dochádza k viac nehodám s viacerými vozidlami, v noci je ich menej. Nehody sa vyskytujú v rôznych častiach mesta, pričom okolie zemepisnej dĺžky cca 2,15–2,18 má viac nehôd. V utorok a štvrtok vidíme v popoludňajších hodinách viac nehôd s viacerými vozidlami, čo môže súvisieť s hustou premávkou počas pracovného týždňa. Naopak, cez víkend je týchto prípadov menej, čo naznačuje pokojnejšiu dopravnú situáciu.

barc_data <- read.csv("barc_data.csv", sep = ";", stringsAsFactors = FALSE)
# Premenila som stĺpce na číselné hodnoty
barc_data$Vehicles.involved <- as.numeric(barc_data$Vehicles.involved)
barc_data$Longitude <- as.numeric(gsub(",", ".", barc_data$Longitude))
barc_data$Part.of.the.day <- factor(barc_data$Part.of.the.day)

library(ggplot2)
ggplot(barc_data, aes(x = Vehicles.involved, y = Longitude, color = Weekday)) +
  geom_point(size = 4, alpha = 0.8) +
  facet_wrap(~ Part.of.the.day) +
  theme_minimal() +
  labs(title = "Vzťah medzi počtom vozidiel a zemepisnou dĺžkou",
       subtitle = "Rozdelené podľa časti dňa",
       x = "Počet zapojených vozidiel",
       y = "Zemepisná dĺžka",
       color = "Deň v týždni")

Stĺpcový graf

Na grafe môžeme vidieť priemerný počet obetí dopravných nehôd za každý deň. Najvyššie hodnoty sú zaznamenané v sobotu, nasleduje streda a nedeľa. V pondelok, utorok, štvrtok a piatok je priemerný počet obetí nižší, pričom piatok vykazuje najnižšiu hodnotu zo všetkých dní.

library(ggplot2)
library(dplyr)

# Výpočet priemerného počtu obetí podľa dňa v týždni
obete_dni <- barc_data %>%
  group_by(Weekday) %>%
  summarise(mean_victims = mean(as.numeric(Victims), na.rm = TRUE))

obete_dni$Weekday <- factor(obete_dni$Weekday,
  levels = c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")
)

# Vykreslenie stĺpcového diagramu s farebným rozlíšením
ggplot(obete_dni, aes(x = Weekday, y = mean_victims, fill = Weekday)) +
  geom_col() +
  labs(
    title = "Priemerný počet obetí podľa dňa v týždni",
    x = "Deň v týždni",
    y = "Priemerný počet obetí"
  ) +
  theme_minimal() +
  theme(legend.position = "none") 

Základné štatistiky.

knitr - tabuľka

Tabuľka naznačuje, že v januári bol počet obetí najnižší, často sa objavila žiadna alebo iba jedna obeť. Vo februári a marci sa počet pohyboval medzi jednou a dvoma obetami. V apríli môžeme vidieť “najväčšiu” rozmanitosť – zaznamenali sa aj prípady s dvoma alebo tromi obeťami.

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

# Súhrnné štatistiky podľa mesiaca
nehody_stats <- barc_data %>%
  filter(Mesiace %in% c("Januar", "Februar", "Marec", "April")) %>%
  group_by(Mesiace) %>%
  summarise(
    n      = n(),
    mean   = mean(Victims, na.rm = TRUE),
    sd     = sd(Victims, na.rm = TRUE),
    min    = min(Victims, na.rm = TRUE),
    q25    = quantile(Victims, 0.25, na.rm = TRUE),
    median = median(Victims, na.rm = TRUE),
    q75    = quantile(Victims, 0.75, na.rm = TRUE),
    max    = max(Victims, na.rm = TRUE),
    .groups = "drop"
  )

# Štýlová tabuľka s oddelenými údajmi
nehody_stats %>%
  kable(digits = 2, caption = "Základné štatistiky počtu obetí (Január–Apríl)") %>%
  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, "Štatistiky obetí" = 7))
Základné štatistiky počtu obetí (Január–Apríl)
Štatistiky obetí
Mesiace n mean sd min q25 median q75 max
April 5 1.6 0.89 1 1 1 2 3
Februar 5 1.4 0.55 1 1 1 2 2
Januar 5 0.8 0.45 0 1 1 1 1
Marec 5 1.2 0.45 1 1 1 1 2

Testovanie hypotéz

t-test: Rozdiel v počte obetí medzi januárom a májom

Výsledok t-testu naznačuje, že v máji bol priemerný počet obetí výrazne vyšší než v januári (1,6 oproti 0,8). Výsledok t-testu naznačuje, že tento rozdiel je štatisticky významný (p-hodnota ≈ 0,036). Interval spoľahlivosti neobsahuje nulu, čo potvrdzuje, že rozdiel medzi mesiacmi je reálny.

t.test.result <- t.test(
  barc_data$Victims[barc_data$Mesiace == "Januar"],
  barc_data$Victims[barc_data$Mesiace == "Maj"]
)

# Výsledok testu
print(t.test.result)

    Welch Two Sample t-test

data:  barc_data$Victims[barc_data$Mesiace == "Januar"] and barc_data$Victims[barc_data$Mesiace == "Maj"]
t = -2.5298, df = 7.6923, p-value = 0.03637
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -1.53433111 -0.06566889
sample estimates:
mean of x mean of y 
      0.8       1.6 

ANOVA: Porovnanie ľahkých zranení podľa mesiacov

Test ANOVA skúmal, či sa počet ľahkých zranení výrazne líši medzi jednotlivými mesiacmi. Výsledok ukazuje, že rozdiely nie sú štatisticky významné (p-hodnota = 0.809). To znamená, že počet ľahko zranených sa počas roka nemení výrazne a kolísanie medzi mesiacmi môže byť náhodné.

anova.result <- aov(Mild.injuries ~ Mesiace, data = barc_data)
summary(anova.result)
            Df Sum Sq Mean Sq F value Pr(>F)
Mesiace     11   5.78  0.5258   0.613  0.809
Residuals   48  41.20  0.8583               

Linear Regression: Vzťah medzi počtom vozidiel a počtom obetí

Analýza skúmala, či počet zúčastnených vozidiel ovplyvňuje počet obetí pri dopravných nehodách. Výsledky ukazujú, že medzi týmito premennými existuje mierne pozitívny vzťah (čím viac vozidiel, tým viac obetí), ale tento vzťah nie je štatisticky významný (p-hodnota ≈ 0.113).

model <- lm(Victims ~ Vehicles.involved, data = barc_data)
summary(model)

Call:
lm(formula = Victims ~ Vehicles.involved, data = barc_data)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.5080 -0.5080 -0.3147  0.4920  4.4920 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)
(Intercept)         0.7348     0.4616   1.592    0.117
Vehicles.involved   0.3866     0.2405   1.607    0.113

Residual standard error: 0.9515 on 58 degrees of freedom
Multiple R-squared:  0.04264,   Adjusted R-squared:  0.02613 
F-statistic: 2.583 on 1 and 58 DF,  p-value: 0.1134
LS0tCnRpdGxlOiAiUHLDoWNhIHMgZGF0YWLDoXpvdSAtIGltcG9ydCDDumRham92LCBncmFmeSwgxaF0YXRpc3Rpa3kiCmF1dGhvcjogIk1vbmlrYSBTesWxY3NvdsOhICA8YnI+CihzIHZ5dcW+aXTDrW0gdmVyZWpuZSBkb3N0dXBuw71jaCBrw7Nkb3YgYSBDaGF0R1BUKSIKZGF0ZTogIk9rdMOzYmVyIDIwMjUiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICB0aGVtZTogbHVtZW4KICAgIGhpZ2hsaWdodDogdGFuZ28KZWRpdG9yX29wdGlvbnM6IAogIG1hcmtkb3duOiAKICAgIHdyYXA6IDcyCi0tLQoKYGBge3J9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICAgIGVjaG8gPSBUUlVFLAogICAgbWVzc2FnZSA9IEZBTFNFLAogICAgd2FybmluZyA9IEZBTFNFCikKYGBgCgojIEltcG9ydCBhIG7DoWjEvmFkIMO6ZGFqZSAKCkRhdGFzZXQgYmFyY19kYXRhLmNzdiB6IHJva3UgMjAxNyBvYnNhaHVqZSBpbmZvcm3DoWNpZSBvIGRvcHJhdm7DvWNoIG5laG9kw6FjaCB2IEJhcmNlbG9uZS4KCmBgYHtyfQp1ZGFqZSA8LSByZWFkLmNzdjIoImJhcmNfZGF0YS5jc3YiLGhlYWRlcj1UUlVFLHNlcD0iOyIsZGVjPSIuIikKaGVhZCh1ZGFqZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApjb2xuYW1lcyh1ZGFqZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmBgYAoKIyBHcmFmeQoKYGBge3J9CmxpYnJhcnkoZHBseXIpCgpiYXJjX2RhdGEgPC0gdWRhamUgJT4lCiAgZmlsdGVyKERhdGUgPT0gMjAxNy0wNC0xOSkgJT4lCiAgc2VsZWN0KFdlZWtkYXksIE1pbGQuaW5qdXJpZXMsIFZlaGljbGVzLmludm9sdmVkLCBMb25naXR1ZGUsIExhdGl0dWRlKQpgYGAKCiMjIFNjYXR0ZXIgcGxvdCAKCkdyYWYgem7DoXpvcsWIdWplIHZ6xaVhaCBtZWR6aSBwb8SNdG9tIHZvemlkaWVsIHphcG9qZW7DvWNoIGRvIG5laMO0ZCBhIGljaCB6ZW1lcGlzbm91IGTEusW+a291LiDDmmRhamUgc8O6IHJvemRlbGVuw6kgcG9kxL5hIMSNYXN0aSBkxYhhIChyw6FubywgcG9wb2x1ZG5pZSwgbm9jKSwgdGFrxb5lIHZpZMOtbWUsIGtlZHkgc2EgbmVob2R5IHMgdmlhY2Vyw71taSB2b3ppZGxhbWkgdnlza3l0dWrDuiDEjWFzdGVqxaFpZS4KRmFyYnkgYm9kb3Ygb3puYcSNdWrDuiBkbmkgdiB0w73FvmRuaSwgxI1vIHVtb8W+xYh1amUgcG9yb3ZuYcWlLCB2IGt0b3LDqSBkbmkgYSBrZGUgc2EgbmVob2R5IG5hasSNYXN0ZWrFoWllIHN0w6F2YWrDui4KClogZ3JhZnUgbcO0xb5lbWUgdmlkaWXFpSwgxb5lIHLDoW5vIGEgcG9wb2x1ZG7DrSBkb2Now6FkemEgayB2aWFjIG5laG9kw6FtIHMgdmlhY2Vyw71taSB2b3ppZGxhbWksIHYgbm9jaSBqZSBpY2ggbWVuZWouIE5laG9keSBzYSB2eXNreXR1asO6IHYgcsO0em55Y2ggxI1hc3RpYWNoIG1lc3RhLCBwcmnEjW9tIG9rb2xpZSB6ZW1lcGlzbmVqIGTEusW+a3kgY2NhIDIsMTXigJMyLDE4IG3DoSB2aWFjIG5laMO0ZC4gViB1dG9yb2sgYSDFoXR2cnRvayB2aWTDrW1lIHYgcG9wb2x1ZMWIYWrFocOtY2ggaG9kaW7DoWNoIHZpYWMgbmVow7RkIHMgdmlhY2Vyw71taSB2b3ppZGxhbWksIMSNbyBtw7TFvmUgc8O6dmlzaWXFpSBzIGh1c3RvdSBwcmVtw6F2a291IHBvxI1hcyBwcmFjb3Zuw6lobyB0w73FvmTFiGEuIE5hb3BhaywgY2V6IHbDrWtlbmQgamUgdMO9Y2h0byBwcsOtcGFkb3YgbWVuZWosIMSNbyBuYXpuYcSNdWplIHBva29qbmVqxaFpdSBkb3ByYXZuw7ogc2l0dcOhY2l1LgoKYGBge3J9CmJhcmNfZGF0YSA8LSByZWFkLmNzdigiYmFyY19kYXRhLmNzdiIsIHNlcCA9ICI7Iiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpgYGAKCmBgYHtyfQojIFByZW1lbmlsYSBzb20gc3TEunBjZSBuYSDEjcOtc2VsbsOpIGhvZG5vdHkKYmFyY19kYXRhJFZlaGljbGVzLmludm9sdmVkIDwtIGFzLm51bWVyaWMoYmFyY19kYXRhJFZlaGljbGVzLmludm9sdmVkKQpiYXJjX2RhdGEkTG9uZ2l0dWRlIDwtIGFzLm51bWVyaWMoZ3N1YigiLCIsICIuIiwgYmFyY19kYXRhJExvbmdpdHVkZSkpCmJhcmNfZGF0YSRQYXJ0Lm9mLnRoZS5kYXkgPC0gZmFjdG9yKGJhcmNfZGF0YSRQYXJ0Lm9mLnRoZS5kYXkpCgpsaWJyYXJ5KGdncGxvdDIpCmdncGxvdChiYXJjX2RhdGEsIGFlcyh4ID0gVmVoaWNsZXMuaW52b2x2ZWQsIHkgPSBMb25naXR1ZGUsIGNvbG9yID0gV2Vla2RheSkpICsKICBnZW9tX3BvaW50KHNpemUgPSA0LCBhbHBoYSA9IDAuOCkgKwogIGZhY2V0X3dyYXAofiBQYXJ0Lm9mLnRoZS5kYXkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnModGl0bGUgPSAiVnrFpWFoIG1lZHppIHBvxI10b20gdm96aWRpZWwgYSB6ZW1lcGlzbm91IGTEusW+a291IiwKICAgICAgIHN1YnRpdGxlID0gIlJvemRlbGVuw6kgcG9kxL5hIMSNYXN0aSBkxYhhIiwKICAgICAgIHggPSAiUG/EjWV0IHphcG9qZW7DvWNoIHZvemlkaWVsIiwKICAgICAgIHkgPSAiWmVtZXBpc27DoSBkxLrFvmthIiwKICAgICAgIGNvbG9yID0gIkRlxYggdiB0w73FvmRuaSIpCmBgYAoKIyMgU3TEunBjb3bDvSBncmFmCgpOYSBncmFmZSBtw7TFvmVtZSB2aWRpZcWlIHByaWVtZXJuw70gcG/EjWV0IG9iZXTDrSBkb3ByYXZuw71jaCBuZWjDtGQgemEga2HFvmTDvSBkZcWILiBOYWp2ecWhxaFpZSBob2Rub3R5IHPDuiB6YXpuYW1lbmFuw6kgdiBzb2JvdHUsIG5hc2xlZHVqZSBzdHJlZGEgYSBuZWRlxL5hLiBWIHBvbmRlbG9rLCB1dG9yb2ssIMWhdHZydG9rIGEgcGlhdG9rIGplIHByaWVtZXJuw70gcG/EjWV0IG9iZXTDrSBuacW+xaHDrSwgcHJpxI1vbSBwaWF0b2sgdnlrYXp1amUgbmFqbmnFvsWhaXUgaG9kbm90dSB6byB2xaFldGvDvWNoIGRuw60uCgpgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQoKIyBWw71wb8SNZXQgcHJpZW1lcm7DqWhvIHBvxI10dSBvYmV0w60gcG9kxL5hIGTFiGEgdiB0w73FvmRuaQpvYmV0ZV9kbmkgPC0gYmFyY19kYXRhICU+JQogIGdyb3VwX2J5KFdlZWtkYXkpICU+JQogIHN1bW1hcmlzZShtZWFuX3ZpY3RpbXMgPSBtZWFuKGFzLm51bWVyaWMoVmljdGltcyksIG5hLnJtID0gVFJVRSkpCgpvYmV0ZV9kbmkkV2Vla2RheSA8LSBmYWN0b3Iob2JldGVfZG5pJFdlZWtkYXksCiAgbGV2ZWxzID0gYygiTW9uZGF5IiwgIlR1ZXNkYXkiLCAiV2VkbmVzZGF5IiwgIlRodXJzZGF5IiwgIkZyaWRheSIsICJTYXR1cmRheSIsICJTdW5kYXkiKQopCgojIFZ5a3Jlc2xlbmllIHN0xLpwY292w6lobyBkaWFncmFtdSBzIGZhcmVibsO9bSByb3psw63FoWVuw61tCmdncGxvdChvYmV0ZV9kbmksIGFlcyh4ID0gV2Vla2RheSwgeSA9IG1lYW5fdmljdGltcywgZmlsbCA9IFdlZWtkYXkpKSArCiAgZ2VvbV9jb2woKSArCiAgbGFicygKICAgIHRpdGxlID0gIlByaWVtZXJuw70gcG/EjWV0IG9iZXTDrSBwb2TEvmEgZMWIYSB2IHTDvcW+ZG5pIiwKICAgIHggPSAiRGXFiCB2IHTDvcW+ZG5pIiwKICAgIHkgPSAiUHJpZW1lcm7DvSBwb8SNZXQgb2JldMOtIgogICkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSAKYGBgCgojIFrDoWtsYWRuw6kgxaF0YXRpc3Rpa3kuIAoKCiMjIGtuaXRyIC0gdGFidcS+a2EKClRhYnXEvmthIG5hem5hxI11amUsIMW+ZSB2IGphbnXDoXJpIGJvbCBwb8SNZXQgb2JldMOtIG5ham5pxb7FocOtLCDEjWFzdG8gc2Egb2JqYXZpbGEgxb5pYWRuYSBhbGVibyBpYmEgamVkbmEgb2JlxaUuIFZvIGZlYnJ1w6FyaSBhIG1hcmNpIHNhIHBvxI1ldCBwb2h5Ym92YWwgbWVkemkgamVkbm91IGEgZHZvbWEgb2JldGFtaS4gViBhcHLDrWxpIG3DtMW+ZW1lIHZpZGllxaUgIm5hanbDpMSNxaFpdSIgcm96bWFuaXRvc8WlIOKAkyB6YXpuYW1lbmFsaSBzYSBhaiBwcsOtcGFkeSBzIGR2b21hIGFsZWJvIHRyb21pIG9iZcWlYW1pLgoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMgU8O6aHJubsOpIMWhdGF0aXN0aWt5IHBvZMS+YSBtZXNpYWNhCm5laG9keV9zdGF0cyA8LSBiYXJjX2RhdGEgJT4lCiAgZmlsdGVyKE1lc2lhY2UgJWluJSBjKCJKYW51YXIiLCAiRmVicnVhciIsICJNYXJlYyIsICJBcHJpbCIpKSAlPiUKICBncm91cF9ieShNZXNpYWNlKSAlPiUKICBzdW1tYXJpc2UoCiAgICBuICAgICAgPSBuKCksCiAgICBtZWFuICAgPSBtZWFuKFZpY3RpbXMsIG5hLnJtID0gVFJVRSksCiAgICBzZCAgICAgPSBzZChWaWN0aW1zLCBuYS5ybSA9IFRSVUUpLAogICAgbWluICAgID0gbWluKFZpY3RpbXMsIG5hLnJtID0gVFJVRSksCiAgICBxMjUgICAgPSBxdWFudGlsZShWaWN0aW1zLCAwLjI1LCBuYS5ybSA9IFRSVUUpLAogICAgbWVkaWFuID0gbWVkaWFuKFZpY3RpbXMsIG5hLnJtID0gVFJVRSksCiAgICBxNzUgICAgPSBxdWFudGlsZShWaWN0aW1zLCAwLjc1LCBuYS5ybSA9IFRSVUUpLAogICAgbWF4ICAgID0gbWF4KFZpY3RpbXMsIG5hLnJtID0gVFJVRSksCiAgICAuZ3JvdXBzID0gImRyb3AiCiAgKQoKIyDFoHTDvWxvdsOhIHRhYnXEvmthIHMgb2RkZWxlbsO9bWkgw7pkYWptaQpuZWhvZHlfc3RhdHMgJT4lCiAga2FibGUoZGlnaXRzID0gMiwgY2FwdGlvbiA9ICJaw6FrbGFkbsOpIMWhdGF0aXN0aWt5IHBvxI10dSBvYmV0w60gKEphbnXDoXLigJNBcHLDrWwpIikgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSkgJT4lCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUpICU+JQogIHJvd19zcGVjKDAsIGJvbGQgPSBUUlVFLCBiYWNrZ3JvdW5kID0gIiNmMmYyZjIiKSAlPiUKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMiwgIsWgdGF0aXN0aWt5IG9iZXTDrSIgPSA3KSkKYGBgCgojIFRlc3RvdmFuaWUgaHlwb3TDqXoKCiMjIyB0LXRlc3Q6IFJvemRpZWwgdiBwb8SNdGUgb2JldMOtIG1lZHppIGphbnXDoXJvbSBhIG3DoWpvbSAKClbDvXNsZWRvayB0LXRlc3R1IG5hem5hxI11amUsIMW+ZSB2IG3DoWppIGJvbCBwcmllbWVybsO9IHBvxI1ldCBvYmV0w60gdsO9cmF6bmUgdnnFocWhw60gbmXFviB2IGphbnXDoXJpICgxLDYgb3Byb3RpIDAsOCkuIFbDvXNsZWRvayB0LXRlc3R1IG5hem5hxI11amUsIMW+ZSB0ZW50byByb3pkaWVsIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IChwLWhvZG5vdGEg4omIIDAsMDM2KS4gSW50ZXJ2YWwgc3BvxL5haGxpdm9zdGkgbmVvYnNhaHVqZSBudWx1LCDEjW8gcG90dnJkenVqZSwgxb5lIHJvemRpZWwgbWVkemkgbWVzaWFjbWkgamUgcmXDoWxueS4KCmBgYHtyfQp0LnRlc3QucmVzdWx0IDwtIHQudGVzdCgKICBiYXJjX2RhdGEkVmljdGltc1tiYXJjX2RhdGEkTWVzaWFjZSA9PSAiSmFudWFyIl0sCiAgYmFyY19kYXRhJFZpY3RpbXNbYmFyY19kYXRhJE1lc2lhY2UgPT0gIk1haiJdCikKCiMgVsO9c2xlZG9rIHRlc3R1CnByaW50KHQudGVzdC5yZXN1bHQpCmBgYAoKCiMjIyMgQU5PVkE6IFBvcm92bmFuaWUgxL5haGvDvWNoIHpyYW5lbsOtIHBvZMS+YSBtZXNpYWNvdgoKVGVzdCBBTk9WQSBza8O6bWFsLCDEjWkgc2EgcG/EjWV0IMS+YWhrw71jaCB6cmFuZW7DrSB2w71yYXpuZSBsw63FoWkgbWVkemkgamVkbm90bGl2w71taSBtZXNpYWNtaS4gVsO9c2xlZG9rIHVrYXp1amUsIMW+ZSByb3pkaWVseSBuaWUgc8O6IMWhdGF0aXN0aWNreSB2w716bmFtbsOpIChwLWhvZG5vdGEgPSAwLjgwOSkuIFRvIHpuYW1lbsOhLCDFvmUgcG/EjWV0IMS+YWhrbyB6cmFuZW7DvWNoIHNhIHBvxI1hcyByb2thIG5lbWVuw60gdsO9cmF6bmUgYSBrb2zDrXNhbmllIG1lZHppIG1lc2lhY21pIG3DtMW+ZSBiecWlIG7DoWhvZG7DqS4KCmBgYHtyfQphbm92YS5yZXN1bHQgPC0gYW92KE1pbGQuaW5qdXJpZXMgfiBNZXNpYWNlLCBkYXRhID0gYmFyY19kYXRhKQpzdW1tYXJ5KGFub3ZhLnJlc3VsdCkKYGBgCgoKIyMjIyBMaW5lYXIgUmVncmVzc2lvbjogVnrFpWFoIG1lZHppIHBvxI10b20gdm96aWRpZWwgYSBwb8SNdG9tIG9iZXTDrQoKQW5hbMO9emEgc2vDum1hbGEsIMSNaSBwb8SNZXQgesO6xI1hc3RuZW7DvWNoIHZvemlkaWVsIG92cGx5dsWIdWplIHBvxI1ldCBvYmV0w60gcHJpIGRvcHJhdm7DvWNoIG5laG9kw6FjaC4gVsO9c2xlZGt5IHVrYXp1asO6LCDFvmUgbWVkemkgdMO9bWl0byBwcmVtZW5uw71taSBleGlzdHVqZSBtaWVybmUgcG96aXTDrXZueSB2esWlYWggKMSNw61tIHZpYWMgdm96aWRpZWwsIHTDvW0gdmlhYyBvYmV0w60pLCBhbGUgdGVudG8gdnrFpWFoIG5pZSBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSAocC1ob2Rub3RhIOKJiCAwLjExMykuCgpgYGB7cn0KbW9kZWwgPC0gbG0oVmljdGltcyB+IFZlaGljbGVzLmludm9sdmVkLCBkYXRhID0gYmFyY19kYXRhKQpzdW1tYXJ5KG1vZGVsKQpgYGAKCgoKCgoKCg==