#Import údajov Cieľom tejto analýzy je preskúmať pit stopy vo Formule 1 z hľadiska ich dĺžky, načasovania a frekvencie. Pit stopy predstavujú kľúčový prvok pretekovej stratégie, keďže ovplyvňujú celkový čas jazdca aj jeho pozíciu na trati. Analýza sa zameriava na identifikáciu typických hodnôt a odchýlok, ktoré môžu naznačovať rôzne strategické prístupy alebo neštandardné situácie počas pretekov.

library(dplyr)
library(tidyr)
library(ggplot2)
library(knitr)
library(kableExtra)
library(stats)

# Načítanie dát
pit_stops <- read.csv(
  "C:/Users/vlady/Documents/pit_stops.csv",
  header = TRUE,
  sep = ",",
  dec = ".",
  stringsAsFactors = FALSE
)

# Premenovanie stĺpcov
pit_stops <- pit_stops %>%
  rename(
    race_id = raceId,
    driver_id = driverId,
    stop_number = stop,
    duration_text = duration,
    duration_ms = milliseconds
  )
# Kontrola chýbajúcich hodnôt
print("Počet chýbajúcich údajov v jednotlivých premenných:")
[1] "Počet chýbajúcich údajov v jednotlivých premenných:"
colSums(is.na(pit_stops))
      race_id     driver_id   stop_number           lap          time duration_text   duration_ms 
            0             0             0             0             0             0             0 

Tabuľky, grafy, jednoduché štatistiky

Boxplot

# ------------------------
# Boxplot pit stopov
# ------------------------
limit_95 <- quantile(pit_stops$duration_ms, 0.95, na.rm = TRUE)

ggplot(dplyr::filter(pit_stops, duration_ms <= limit_95), aes(x = duration_ms)) +
  geom_histogram(binwidth = 200, fill = "lightblue", color = "darkblue") +
  labs(
    title = "Rozdelenie trvania pitstopov F1",
    x = "Dĺžka pit stopu (ms)",
    y = "Počet pit stopov"
  ) +
  theme_minimal()


ggplot(pit_stops, aes(x = lap)) +
  geom_histogram(binwidth = 2, boundary = 0, fill = "lightblue", color = "darkblue") +
  labs(
    title = "Rozdelenie pit stopov podľa kola",
    x = "Kolo",
    y = "Počet pit stopov"
  ) +
  theme_minimal()


limit_95 <- quantile(pit_stops$duration_ms, 0.95, na.rm = TRUE)

ggplot(
  dplyr::filter(pit_stops, stop_number %in% 1:4, duration_ms <= limit_95),
  aes(x = factor(stop_number), y = duration_ms)
) +
  geom_boxplot(fill = "lightblue", color = "darkblue") +
  labs(
    title = "Dĺžka pit stopov podľa poradia (bez extrémov)",
    x = "Poradie pit stopu",
    y = "Trvanie (ms)"
  ) +
  theme_minimal()

# ------------------------
# Základné štatistiky do tabuľky
# ------------------------
pit_stats <- pit_stops %>%
  group_by(stop_number) %>%
  summarise(
    n = n(),
    mean = mean(duration_ms, na.rm = TRUE),
    sd = sd(duration_ms, na.rm = TRUE),
    min = min(duration_ms, na.rm = TRUE),
    q25 = quantile(duration_ms, 0.25, na.rm = TRUE),
    median = median(duration_ms, na.rm = TRUE),
    q75 = quantile(duration_ms, 0.75, na.rm = TRUE),
    max = max(duration_ms, na.rm = TRUE),
    .groups = "drop"
  )

pit_stats %>%
  kable(
    digits = 2,
    caption = "Základné štatistiky dĺžky pit stopov podľa poradia zastávky"
  ) %>%
  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(" " = 1, "Štatistiky dĺžky pit stopu" = 8))
Základné štatistiky dĺžky pit stopov podľa poradia zastávky
Štatistiky dĺžky pit stopu
stop_number n mean sd min q25 median q75 max
1 5573 74778.35 300436.67 14160 22087.00 23744.0 26879.00 3069017
2 3716 81413.58 270539.34 12897 21892.75 23467.5 25788.50 2048175
3 1496 96718.27 325293.53 12959 21472.00 23350.0 26238.25 2485913
4 427 106832.92 374243.56 13925 21041.00 23132.0 27150.50 2434653
5 120 391127.17 757595.35 14493 22481.25 25681.5 42762.25 2461612
6 29 426872.79 822788.18 13173 22979.00 31494.0 74200.00 2483382
7 3 29079.33 5910.42 22379 26842.50 31306.0 32429.50 33553
15 1 24239.00 NA 24239 24239.00 24239.0 24239.00 24239
42 1 24132.00 NA 24132 24132.00 24132.0 24132.00 24132
48 1 28211.00 NA 28211 28211.00 28211.0 28211.00 28211
51 1 24232.00 NA 24232 24232.00 24232.0 24232.00 24232
52 1 23813.00 NA 23813 23813.00 23813.0 23813.00 23813
57 1 24384.00 NA 24384 24384.00 24384.0 24384.00 24384
70 1 24367.00 NA 24367 24367.00 24367.0 24367.00 24367

lap_stats <- pit_stops %>%
  group_by(stop_number) %>%
  summarise(
    n = n(),
    mean_lap = mean(lap, na.rm = TRUE),
    median_lap = median(lap, na.rm = TRUE),
    min_lap = min(lap, na.rm = TRUE),
    max_lap = max(lap, na.rm = TRUE),
    .groups = "drop"
  )

lap_stats %>%
  kable(
    digits = 2,
    caption = "Základné štatistiky kola pit stopu podľa poradia zastávky"
  ) %>%
  kable_styling(
    full_width = FALSE,
    bootstrap_options = c("striped", "hover", "condensed")
  ) %>%
  column_spec(1, bold = TRUE) %>%
  row_spec(0, bold = TRUE, background = "#f2f2f2")
Základné štatistiky kola pit stopu podľa poradia zastávky
stop_number n mean_lap median_lap min_lap max_lap
1 5573 16.39 15 1 64
2 3716 30.95 31 2 74
3 1496 37.99 39 3 73
4 427 42.34 44 6 78
5 120 47.41 46 20 70
6 29 52.21 54 31 64
7 3 65.00 64 64 67
15 1 2.00 2 2 2
42 1 2.00 2 2 2
48 1 3.00 3 3 3
51 1 2.00 2 2 2
52 1 2.00 2 2 2
57 1 2.00 2 2 2
70 1 2.00 2 2 2

stops_per_race <- pit_stops %>%
  group_by(race_id) %>%
  summarise(total_stops = n(),
            drivers = n_distinct(driver_id),
            avg_stops = total_stops / drivers)

ggplot(stops_per_race, aes(x = avg_stops)) +
  geom_histogram(binwidth = 0.2, fill = "lightblue", color = "darkblue") +
  labs(
    title = "Priemerný počet pit stopov na jazdca v pretekoch",
    x = "Pit stopy na jazdca",
    y = "Počet pretekov"
  ) +
  theme_minimal()


# ------------------------
# t-test: Porovnanie priemerov medzi prvým a druhým pit stopom
# ------------------------
t_test_result <- t.test(
  pit_stops$duration_ms[pit_stops$stop_number == 1],
  pit_stops$duration_ms[pit_stops$stop_number == 2]
)
t_test_result

    Welch Two Sample t-test

data:  pit_stops$duration_ms[pit_stops$stop_number == 1] and pit_stops$duration_ms[pit_stops$stop_number == 2]
t = -1.1075, df = 8503.2, p-value = 0.2681
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -18379.140   5108.681
sample estimates:
mean of x mean of y 
 74778.35  81413.58 
# ------------------------
# ANOVA: Porovnanie medzi všetkými pit stopmi
# ------------------------
anova_result <- aov(duration_ms ~ factor(stop_number), data = pit_stops)
summary(anova_result)
                       Df    Sum Sq   Mean Sq F value Pr(>F)    
factor(stop_number)    13 1.571e+13 1.208e+12   12.71 <2e-16 ***
Residuals           11357 1.080e+15 9.509e+10                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# ------------------------
# Lineárna regresia: Predpoveď času pit stopu podľa lap a čísla stopu
# ------------------------
model <- lm(duration_ms ~ lap + stop_number, data = pit_stops)
summary(model)

Call:
lm(formula = duration_ms ~ lap + stop_number, data = pit_stops)

Residuals:
     Min       1Q   Median       3Q      Max 
-1125645   -74757   -59495   -42449  2948258 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 107753.5     6026.5  17.880  < 2e-16 ***
lap          -1939.7      207.9  -9.331  < 2e-16 ***
stop_number  14944.8     2026.5   7.375 1.76e-13 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 309000 on 11368 degrees of freedom
Multiple R-squared:  0.009317,  Adjusted R-squared:  0.009143 
F-statistic: 53.46 on 2 and 11368 DF,  p-value: < 2.2e-16
LS0tDQp0aXRsZTogIlZsYWR5a2EgQ3ZpxI1lbmllNCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0Ka25pdDogDQogIGZ1bmN0aW9uKGlucHV0RmlsZSwgZW5jb2RpbmcpIHsNCiAgICBybWFya2Rvd246OnJlbmRlcihpbnB1dEZpbGUsIGVuY29kaW5nID0gZW5jb2RpbmcsIG91dHB1dF9kaXIgPSBkaXJuYW1lKGlucHV0RmlsZSkpDQogIH0NCi0tLQ0KI0ltcG9ydCDDumRham92DQpDaWXEvm9tIHRlanRvIGFuYWzDvXp5IGplIHByZXNrw7ptYcWlIHBpdCBzdG9weSB2byBGb3JtdWxlIDEgeiBoxL5hZGlza2EgaWNoIGTEusW+a3ksIG5hxI1hc292YW5pYSBhIGZyZWt2ZW5jaWUuIFBpdCBzdG9weSBwcmVkc3RhdnVqw7oga8S+w7rEjW92w70gcHJ2b2sgcHJldGVrb3ZlaiBzdHJhdMOpZ2llLCBrZcSPxb5lIG92cGx5dsWIdWrDuiBjZWxrb3bDvSDEjWFzIGphemRjYSBhaiBqZWhvIHBvesOtY2l1IG5hIHRyYXRpLiBBbmFsw716YSBzYSB6YW1lcmlhdmEgbmEgaWRlbnRpZmlrw6FjaXUgdHlwaWNrw71jaCBob2Ruw7R0IGEgb2RjaMO9bG9rLCBrdG9yw6kgbcO0xb51IG5hem5hxI1vdmHFpSByw7R6bmUgc3RyYXRlZ2lja8OpIHByw61zdHVweSBhbGVibyBuZcWhdGFuZGFyZG7DqSBzaXR1w6FjaWUgcG/EjWFzIHByZXRla292Lg0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KHN0YXRzKQ0KDQojIE5hxI3DrXRhbmllIGTDoXQNCnBpdF9zdG9wcyA8LSByZWFkLmNzdigNCiAgIkM6L1VzZXJzL3ZsYWR5L0RvY3VtZW50cy9waXRfc3RvcHMuY3N2IiwNCiAgaGVhZGVyID0gVFJVRSwNCiAgc2VwID0gIiwiLA0KICBkZWMgPSAiLiIsDQogIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRQ0KKQ0KDQojIFByZW1lbm92YW5pZSBzdMS6cGNvdg0KcGl0X3N0b3BzIDwtIHBpdF9zdG9wcyAlPiUNCiAgcmVuYW1lKA0KICAgIHJhY2VfaWQgPSByYWNlSWQsDQogICAgZHJpdmVyX2lkID0gZHJpdmVySWQsDQogICAgc3RvcF9udW1iZXIgPSBzdG9wLA0KICAgIGR1cmF0aW9uX3RleHQgPSBkdXJhdGlvbiwNCiAgICBkdXJhdGlvbl9tcyA9IG1pbGxpc2Vjb25kcw0KICApDQojIEtvbnRyb2xhIGNow71iYWrDumNpY2ggaG9kbsO0dA0KcHJpbnQoIlBvxI1ldCBjaMO9YmFqw7pjaWNoIMO6ZGFqb3YgdiBqZWRub3RsaXbDvWNoIHByZW1lbm7DvWNoOiIpDQpjb2xTdW1zKGlzLm5hKHBpdF9zdG9wcykpDQpgYGANCiMgICBUYWJ1xL5reSwgZ3JhZnksIGplZG5vZHVjaMOpIMWhdGF0aXN0aWt5DQojIyMjIEJveHBsb3QNCmBgYHtyfQ0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQm94cGxvdCBwaXQgc3RvcG92DQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KbGltaXRfOTUgPC0gcXVhbnRpbGUocGl0X3N0b3BzJGR1cmF0aW9uX21zLCAwLjk1LCBuYS5ybSA9IFRSVUUpDQoNCmdncGxvdChkcGx5cjo6ZmlsdGVyKHBpdF9zdG9wcywgZHVyYXRpb25fbXMgPD0gbGltaXRfOTUpLCBhZXMoeCA9IGR1cmF0aW9uX21zKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDIwMCwgZmlsbCA9ICJsaWdodGJsdWUiLCBjb2xvciA9ICJkYXJrYmx1ZSIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJSb3pkZWxlbmllIHRydmFuaWEgcGl0c3RvcG92IEYxIiwNCiAgICB4ID0gIkTEusW+a2EgcGl0IHN0b3B1IChtcykiLA0KICAgIHkgPSAiUG/EjWV0IHBpdCBzdG9wb3YiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KZ2dwbG90KHBpdF9zdG9wcywgYWVzKHggPSBsYXApKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMiwgYm91bmRhcnkgPSAwLCBmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImRhcmtibHVlIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlJvemRlbGVuaWUgcGl0IHN0b3BvdiBwb2TEvmEga29sYSIsDQogICAgeCA9ICJLb2xvIiwNCiAgICB5ID0gIlBvxI1ldCBwaXQgc3RvcG92Ig0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmxpbWl0Xzk1IDwtIHF1YW50aWxlKHBpdF9zdG9wcyRkdXJhdGlvbl9tcywgMC45NSwgbmEucm0gPSBUUlVFKQ0KDQpnZ3Bsb3QoDQogIGRwbHlyOjpmaWx0ZXIocGl0X3N0b3BzLCBzdG9wX251bWJlciAlaW4lIDE6NCwgZHVyYXRpb25fbXMgPD0gbGltaXRfOTUpLA0KICBhZXMoeCA9IGZhY3RvcihzdG9wX251bWJlciksIHkgPSBkdXJhdGlvbl9tcykNCikgKw0KICBnZW9tX2JveHBsb3QoZmlsbCA9ICJsaWdodGJsdWUiLCBjb2xvciA9ICJkYXJrYmx1ZSIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJExLrFvmthIHBpdCBzdG9wb3YgcG9kxL5hIHBvcmFkaWEgKGJleiBleHRyw6ltb3YpIiwNCiAgICB4ID0gIlBvcmFkaWUgcGl0IHN0b3B1IiwNCiAgICB5ID0gIlRydmFuaWUgKG1zKSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCg0KYGBge3J9DQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBaw6FrbGFkbsOpIMWhdGF0aXN0aWt5IGRvIHRhYnXEvmt5DQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KcGl0X3N0YXRzIDwtIHBpdF9zdG9wcyAlPiUNCiAgZ3JvdXBfYnkoc3RvcF9udW1iZXIpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbiA9IG4oKSwNCiAgICBtZWFuID0gbWVhbihkdXJhdGlvbl9tcywgbmEucm0gPSBUUlVFKSwNCiAgICBzZCA9IHNkKGR1cmF0aW9uX21zLCBuYS5ybSA9IFRSVUUpLA0KICAgIG1pbiA9IG1pbihkdXJhdGlvbl9tcywgbmEucm0gPSBUUlVFKSwNCiAgICBxMjUgPSBxdWFudGlsZShkdXJhdGlvbl9tcywgMC4yNSwgbmEucm0gPSBUUlVFKSwNCiAgICBtZWRpYW4gPSBtZWRpYW4oZHVyYXRpb25fbXMsIG5hLnJtID0gVFJVRSksDQogICAgcTc1ID0gcXVhbnRpbGUoZHVyYXRpb25fbXMsIDAuNzUsIG5hLnJtID0gVFJVRSksDQogICAgbWF4ID0gbWF4KGR1cmF0aW9uX21zLCBuYS5ybSA9IFRSVUUpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKQ0KDQpwaXRfc3RhdHMgJT4lDQogIGthYmxlKA0KICAgIGRpZ2l0cyA9IDIsDQogICAgY2FwdGlvbiA9ICJaw6FrbGFkbsOpIMWhdGF0aXN0aWt5IGTEusW+a3kgcGl0IHN0b3BvdiBwb2TEvmEgcG9yYWRpYSB6YXN0w6F2a3kiDQogICkgJT4lDQogIGthYmxlX3N0eWxpbmcoDQogICAgZnVsbF93aWR0aCA9IEZBTFNFLA0KICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKQ0KICApICU+JQ0KICBjb2x1bW5fc3BlYygxLCBib2xkID0gVFJVRSkgJT4lDQogIHJvd19zcGVjKDAsIGJvbGQgPSBUUlVFLCBiYWNrZ3JvdW5kID0gIiNmMmYyZjIiKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsICLFoHRhdGlzdGlreSBkxLrFvmt5IHBpdCBzdG9wdSIgPSA4KSkNCg0KbGFwX3N0YXRzIDwtIHBpdF9zdG9wcyAlPiUNCiAgZ3JvdXBfYnkoc3RvcF9udW1iZXIpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbiA9IG4oKSwNCiAgICBtZWFuX2xhcCA9IG1lYW4obGFwLCBuYS5ybSA9IFRSVUUpLA0KICAgIG1lZGlhbl9sYXAgPSBtZWRpYW4obGFwLCBuYS5ybSA9IFRSVUUpLA0KICAgIG1pbl9sYXAgPSBtaW4obGFwLCBuYS5ybSA9IFRSVUUpLA0KICAgIG1heF9sYXAgPSBtYXgobGFwLCBuYS5ybSA9IFRSVUUpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKQ0KDQpsYXBfc3RhdHMgJT4lDQogIGthYmxlKA0KICAgIGRpZ2l0cyA9IDIsDQogICAgY2FwdGlvbiA9ICJaw6FrbGFkbsOpIMWhdGF0aXN0aWt5IGtvbGEgcGl0IHN0b3B1IHBvZMS+YSBwb3JhZGlhIHphc3TDoXZreSINCiAgKSAlPiUNCiAga2FibGVfc3R5bGluZygNCiAgICBmdWxsX3dpZHRoID0gRkFMU0UsDQogICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpDQogICkgJT4lDQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFKSAlPiUNCiAgcm93X3NwZWMoMCwgYm9sZCA9IFRSVUUsIGJhY2tncm91bmQgPSAiI2YyZjJmMiIpDQoNCnN0b3BzX3Blcl9yYWNlIDwtIHBpdF9zdG9wcyAlPiUNCiAgZ3JvdXBfYnkocmFjZV9pZCkgJT4lDQogIHN1bW1hcmlzZSh0b3RhbF9zdG9wcyA9IG4oKSwNCiAgICAgICAgICAgIGRyaXZlcnMgPSBuX2Rpc3RpbmN0KGRyaXZlcl9pZCksDQogICAgICAgICAgICBhdmdfc3RvcHMgPSB0b3RhbF9zdG9wcyAvIGRyaXZlcnMpDQoNCmdncGxvdChzdG9wc19wZXJfcmFjZSwgYWVzKHggPSBhdmdfc3RvcHMpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC4yLCBmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImRhcmtibHVlIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlByaWVtZXJuw70gcG/EjWV0IHBpdCBzdG9wb3YgbmEgamF6ZGNhIHYgcHJldGVrb2NoIiwNCiAgICB4ID0gIlBpdCBzdG9weSBuYSBqYXpkY2EiLA0KICAgIHkgPSAiUG/EjWV0IHByZXRla292Ig0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIHQtdGVzdDogUG9yb3ZuYW5pZSBwcmllbWVyb3YgbWVkemkgcHJ2w71tIGEgZHJ1aMO9bSBwaXQgc3RvcG9tDQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KdF90ZXN0X3Jlc3VsdCA8LSB0LnRlc3QoDQogIHBpdF9zdG9wcyRkdXJhdGlvbl9tc1twaXRfc3RvcHMkc3RvcF9udW1iZXIgPT0gMV0sDQogIHBpdF9zdG9wcyRkdXJhdGlvbl9tc1twaXRfc3RvcHMkc3RvcF9udW1iZXIgPT0gMl0NCikNCnRfdGVzdF9yZXN1bHQNCg0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQU5PVkE6IFBvcm92bmFuaWUgbWVkemkgdsWhZXRrw71taSBwaXQgc3RvcG1pDQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KYW5vdmFfcmVzdWx0IDwtIGFvdihkdXJhdGlvbl9tcyB+IGZhY3RvcihzdG9wX251bWJlciksIGRhdGEgPSBwaXRfc3RvcHMpDQpzdW1tYXJ5KGFub3ZhX3Jlc3VsdCkNCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIExpbmXDoXJuYSByZWdyZXNpYTogUHJlZHBvdmXEjyDEjWFzdSBwaXQgc3RvcHUgcG9kxL5hIGxhcCBhIMSNw61zbGEgc3RvcHUNCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQptb2RlbCA8LSBsbShkdXJhdGlvbl9tcyB+IGxhcCArIHN0b3BfbnVtYmVyLCBkYXRhID0gcGl0X3N0b3BzKQ0Kc3VtbWFyeShtb2RlbCkNCmBgYA0KDQo=