Úvod

V tejto úlohe skúmame, ako meteorologické faktory ovplyvňujú priemernú teplotu v meste Oslo počas júla – najteplejšieho mesiaca v roku. Analyzujeme premenné ako oblačnosť, rýchlosť vetra, vlhkosť, tlak, globálne žiarenie, zrážky a slnečný svit.

Cieľom je odhadnúť lineárne a nelineárne modely, overiť ich správnosť pomocou diagnostických testov a grafov, preskúmať vplyv špecifických udalostí cez dummy premenné a posúdiť vhodnosť transformácie závislej premennej. Výsledky umožnia lepšie pochopiť, ktoré faktory najviac ovplyvňujú júlove teploty.

Načítanie knižníc

library(zoo)
library(tseries)
library(lmtest)
library(sandwich)
library(car)
library(carData)
library(cowplot)
library(ggplot2)
rm(list=ls())

Načítanie dát

data <- read.csv("weather_prediction_dataset.csv")

Výber premennych

weather <- data[, c('MONTH',
                    "OSLO_cloud_cover", 
                    "OSLO_wind_speed", 
                    "OSLO_humidity",
                    "OSLO_pressure", 
                    "OSLO_global_radiation", 
                    "OSLO_precipitation", 
                    "OSLO_sunshine", 
                    "OSLO_temp_mean")]

weather_july <- weather %>% filter(MONTH == 7)

summary(weather_july)
     MONTH   OSLO_cloud_cover OSLO_wind_speed OSLO_humidity    OSLO_pressure    OSLO_global_radiation OSLO_precipitation
 Min.   :7   Min.   :1.000    Min.   :0.500   Min.   :0.4100   Min.   :0.9926   Min.   :0.260         Min.   :0.0000    
 1st Qu.:7   1st Qu.:4.000    1st Qu.:2.000   1st Qu.:0.6000   1st Qu.:1.0041   1st Qu.:1.320         1st Qu.:0.0000    
 Median :7   Median :6.000    Median :2.400   Median :0.6800   Median :1.0100   Median :2.225         Median :0.0100    
 Mean   :7   Mean   :5.561    Mean   :2.576   Mean   :0.6744   Mean   :1.0102   Mean   :2.078         Mean   :0.3483    
 3rd Qu.:7   3rd Qu.:7.000    3rd Qu.:3.100   3rd Qu.:0.7600   3rd Qu.:1.0161   3rd Qu.:2.880         3rd Qu.:0.3475    
 Max.   :7   Max.   :8.000    Max.   :5.700   Max.   :0.8800   Max.   :1.0312   Max.   :3.380         Max.   :5.6000    
 OSLO_sunshine    OSLO_temp_mean 
 Min.   : 0.000   Min.   :10.60  
 1st Qu.: 2.225   1st Qu.:15.60  
 Median : 7.350   Median :17.20  
 Mean   : 7.195   Mean   :17.67  
 3rd Qu.:11.600   3rd Qu.:19.30  
 Max.   :16.600   Max.   :24.90  

Základný lineárny regresný model

Základný lineárny regresný model sa používa na odhadnutie vzťahu medzi priemernou júlovou teplotou v Osle a meteorologickými premennými, aby sme identifikovali, ktoré faktory majú na teplotu najväčší vplyv.

model1 <- lm(OSLO_temp_mean ~ OSLO_cloud_cover + OSLO_wind_speed +
               OSLO_humidity + OSLO_pressure + OSLO_global_radiation +
               OSLO_precipitation + OSLO_sunshine,
             data = weather_july)
summary(model1)

Call:
lm(formula = OSLO_temp_mean ~ OSLO_cloud_cover + OSLO_wind_speed + 
    OSLO_humidity + OSLO_pressure + OSLO_global_radiation + OSLO_precipitation + 
    OSLO_sunshine, data = weather_july)

Residuals:
    Min      1Q  Median      3Q     Max 
-5.3988 -1.2870 -0.1237  1.3101  4.7764 

Coefficients:
                        Estimate Std. Error t value Pr(>|t|)    
(Intercept)           -105.89136   18.05572  -5.865 1.18e-08 ***
OSLO_cloud_cover         0.06244    0.13349   0.468  0.64031    
OSLO_wind_speed         -0.22277    0.13584  -1.640  0.10205    
OSLO_humidity           -6.65813    1.68418  -3.953 9.61e-05 ***
OSLO_pressure          126.40600   17.61289   7.177 5.55e-12 ***
OSLO_global_radiation   -0.40157    0.25817  -1.555  0.12089    
OSLO_precipitation       0.19725    0.18137   1.088  0.27765    
OSLO_sunshine            0.18730    0.06116   3.063  0.00239 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.024 on 302 degrees of freedom
Multiple R-squared:  0.4775,    Adjusted R-squared:  0.4654 
F-statistic: 39.43 on 7 and 302 DF,  p-value: < 2.2e-16

Výsledky:

  • Vlhkosť vzduchu (OSLO_humidity, p < 0,001): vyššia vlhkosť výrazne znižuje priemernú teplotu; v júli teda mokrejšie dni bývajú chladnejšie.

  • Atmosférický tlak (OSLO_pressure, p < 0,001): vyšší tlak je spojený s vyššou teplotou; stabilné tlakové podmienky v júli podporujú teplejšie dni.

  • Slnečný svit (OSLO_sunshine, p = 0,002): viac slnečných hodín zvyšuje priemernú teplotu; jasnejšie dni sú teplejšie.

  • Oblačnosť, rýchlosť vetra, globálne žiarenie a zrážky: tieto premenné nie sú štatisticky významné, čo znamená, že v júli nemajú zásadný samostatný vplyv na priemernú teplotu v Osle.

  • Celková vysvetlená variabilita (R² = 0,4775): model vysvetľuje približne 47% rozdielov v teplote medzi jednotlivými dňami júla, takže hlavné faktory sú zachytené, ale niektoré vplyvy zostávajú nevysvetlené.

  • Reziduá (-5,4 až 4,8 °C): model dobre odhaduje priemernú teplotu, no extrémne teploty môžu byť podhodnotené alebo nadhodnotené.

RESET test na kontrolu špecifikácie modelu

RESET test sa používa na overenie, či lineárny model správne zachytáva vzťah medzi premennými a teplotou, teda či nechýbajú nelineárne efekty alebo interakcie.

resettest(model1)

    RESET test

data:  model1
RESET = 0.52977, df1 = 2, df2 = 300, p-value = 0.5893

Výsledky:

  • RESET = 0,52977, p = 0,5893: vysoká p-hodnota (> 0,05) naznačuje, že nemáme dôkaz proti správnej špecifikácii modelu.

  • Význam pre teplotu: lineárny model vhodne vystihuje vzťahy medzi meteorologickými premennými a priemernou teplotou; neprítomnosť nelineárnych efektov znamená, že teplota reaguje na faktory približne lineárne.

Reziduálne grafy

Residuals vs Fitted

Graf „Residuals vs Fitted“ používame na kontrolu, či lineárny model správne predikuje priemernú teplotu v júli a či reziduá nemajú systematický vzor alebo heteroskedasticitu.

plot(model1, which = 1) 

Výsledky:

  • Reziduá sú väčšinou rovnomerne rozptýlené okolo horizontálnej čiary, čo naznačuje, že model dobre vystihuje vzťah medzi všetkými meteorologickými premennými a priemernou teplotou.

  • Väčšina bodov sa sústreďuje pri nižších až stredných predikovaných hodnotách (Fitted ≈ 14–18), kde model veľmi presne predikuje skutočnú teplotu.

  • Vyskytujú sa niektoré extrémne body, ktoré predstavujú výraznejšie odchýlky medzi predikovanou a skutočnou teplotou, typicky pri extrémne vysokých alebo nízkych dňoch.

  • Pri vyšších predikovaných hodnotách (Fitted ≈ 20–22) sa body mierne rozptyľujú, čo ukazuje, že model je trochu menej presný pre najteplejšie dni, ale stále zachytáva hlavnú tendenciu.

Celkovo graf podporuje vhodnosť lineárneho modelu a neodhalil žiadne výrazné systematické odchýlky či heteroskedasticitu rezíduí.

QQ plot

QQ plot používame na overenie normality rezíduí lineárneho modelu, čo je dôležité pre správnosť inferenčných testov a p-hodnôt koeficientov.

plot(model1, which = 2)

Výsledky:

  • Väčšina bodov sleduje diagonálnu čiaru veľmi presne, čo naznačuje, že reziduá približne nasledujú normálne rozdelenie.

  • V dolnej a hornej časti sa vyskytujú extrémy, kde je menej bodov a sú odchýlené, čo znamená prítomnosť niekoľkých veľmi nízkych alebo vysokých rezíduí.

Celkovo graf podporuje predpoklad normality rezíduí, pričom extrémne odchýlky predstavujú zriedkavé dni s neobvyklými podmienkami, ktoré mierne vybočujú z normálneho rozdelenia.

Scale-Location

Graf Scale-Location používame na overenie predpokladu homoskedasticity, teda či rozptyl rezíduí je približne konštantný pre všetky predikované hodnoty teploty.

plot(model1, which = 3) 

Výsledky:

  • Červená čiara stúpa mierne nahor, čo naznačuje, že rozptyl rezíduí sa s rastom predikovaných hodnôt mierne zvyšuje.

  • Väčšina bodov je rovnomerne rozptýlená okolo čiary, s väčším zhustením pri Fitted ≈ 15–18, čo znamená, že model je presnejší pre stredné predikované teploty.

  • Prítomné sú extrémne hodnoty, ktoré reprezentujú dni s výraznejšími odchýlkami, typicky veľmi horúce alebo chladné dni.

Celkovo graf naznačuje mierne stúpajúcu variabilitu rezíduí pri vyšších predikovaných hodnotách, ale predpoklad približne konštantného rozptylu je stále akceptovateľný.

Leverage vs. Standardized residuals

Graf Leverage vs. Standardized residuals používame na identifikáciu pozorovaní, ktoré majú neobvyklé hodnoty vysvetľujúcich premenných a môžu výrazne ovplyvniť odhad regresných koeficientov.

plot(model1, which = 5) 

Výsledky:

  • Červená čiara začína horizontálne pri nízkej leverage (X ≈ 0–0,05), potom jemne stúpa až do X ≈ 0,10 a nakoniec prudko klesá smerom k Y ≈ -2. To ukazuje, že väčšina dní júla sa správa predvídateľne, ale pre niektoré kombinácie premenných sa očakávané reziduá mierne zvyšujú alebo náhle klesajú.

  • Väčšina dní je sústredená pri nízkej leverage, reziduá sa držia blízko nuly, čo znamená, že model dobre zachytáva typické júlove počasie a teplotu.

  • Extrémne hodnoty - tieto dni predstavujú neobvyklé podmienky, ktoré môžu výraznejšie ovplyvniť model.

Celkovo model spoľahlivo popisuje väčšinu júlovej teploty, no treba mať na pamäti, že niektoré extrémne dni s neštandardnými meteorologickými podmienkami môžu spôsobovať odchýlky od predikcie.

C+R ploty pre vizuálne posúdenie linearity

C+R ploty používame na to, aby sme vizuálne overili, či je vzťah medzi jednotlivými meteorologickými premennými a priemernou teplotou v júli dostatočne lineárny, teda či lineárny model dáva zmysel pre tieto dáta.

crPlots(model1)

OSLO_cloud_cover

Na grafe je vidieť, že body sú rozložené v pásmach podľa kategórií oblačnosti a vyhladená krivka je takmer vodorovná. To znamená, že oblačnosť takmer neovplyvňuje teplotu v lineárnej forme.

OSLO_wind_speed

Body naznačujú slabý klesajúci trend a vyhladená krivka mierne klesá. To naznačuje, že silnejší vietor môže súvisieť s o niečo nižšou teplotou.

OSLO_humidity

Vyhladená krivka mierne klesá, čo poukazuje na slabý negatívny vzťah. To znamená, že pri vyššej vlhkosti má teplota tendenciu mierne klesať.

OSLO_pressure

Krivka má mierne rastúci charakter, viditeľný je slabý pozitívny vzťah. Vyšší atmosférický tlak súvisí s mierne vyššou teplotou.

OSLO_global_radiation

Body sú rozptýlené náhodne a vyhladená krivka je takmer vodorovná. To naznačuje, že globálne žiarenie takmer nevysvetľuje zmeny teploty v lineárnej časti modelu.

OSLO_precipitation

Väčšina bodov sa nachádza pri hodnote nula a krivka nevykazuje trend. Zrážky takmer neovplyvňujú teplotu v rámci lineárneho modelu.

OSLO_sunshine

Krivka pomaly rastie, čo poukazuje na slabý pozitívny vzťah. Vyšší počet hodín slnečného svitu súvisí s mierne vyššou teplotou.

Kvadratické členy pre nelineárne vzťahy

Kvadratické členy v regresii používame na zachytenie nelineárnych vzťahov medzi nezávislými premennými a závislou premennou, keď účinok prediktora na výsledok nie je konštantný, ale mení sa s jeho hodnotou.

model_quad <- lm(OSLO_temp_mean ~ OSLO_cloud_cover + I(OSLO_cloud_cover^2) +
                   OSLO_wind_speed + I(OSLO_wind_speed^2) +
                   OSLO_humidity + I(OSLO_humidity^2) +
                   OSLO_pressure + I(OSLO_pressure^2) +
                   OSLO_global_radiation + I(OSLO_global_radiation^2) +
                   OSLO_precipitation + I(OSLO_precipitation^2) +
                   OSLO_sunshine + I(OSLO_sunshine^2),
                 data = weather_july)
summary(model_quad)

Call:
lm(formula = OSLO_temp_mean ~ OSLO_cloud_cover + I(OSLO_cloud_cover^2) + 
    OSLO_wind_speed + I(OSLO_wind_speed^2) + OSLO_humidity + 
    I(OSLO_humidity^2) + OSLO_pressure + I(OSLO_pressure^2) + 
    OSLO_global_radiation + I(OSLO_global_radiation^2) + OSLO_precipitation + 
    I(OSLO_precipitation^2) + OSLO_sunshine + I(OSLO_sunshine^2), 
    data = weather_july)

Residuals:
    Min      1Q  Median      3Q     Max 
-4.9972 -1.2702 -0.0555  1.2042  4.8049 

Coefficients:
                             Estimate Std. Error t value Pr(>|t|)    
(Intercept)                -1.517e+03  1.665e+03  -0.911  0.36298    
OSLO_cloud_cover           -4.227e-01  4.490e-01  -0.941  0.34732    
I(OSLO_cloud_cover^2)       5.094e-02  4.687e-02   1.087  0.27803    
OSLO_wind_speed            -9.847e-01  6.030e-01  -1.633  0.10354    
I(OSLO_wind_speed^2)        1.447e-01  1.044e-01   1.386  0.16685    
OSLO_humidity              -2.531e+00  1.197e+01  -0.211  0.83268    
I(OSLO_humidity^2)         -2.951e+00  9.279e+00  -0.318  0.75071    
OSLO_pressure               2.909e+03  3.297e+03   0.882  0.37837    
I(OSLO_pressure^2)         -1.374e+03  1.632e+03  -0.842  0.40041    
OSLO_global_radiation       4.665e+00  1.278e+00   3.650  0.00031 ***
I(OSLO_global_radiation^2) -1.212e+00  2.966e-01  -4.087 5.64e-05 ***
OSLO_precipitation          8.470e-01  4.054e-01   2.089  0.03756 *  
I(OSLO_precipitation^2)    -1.731e-01  1.049e-01  -1.650  0.09999 .  
OSLO_sunshine              -1.520e-01  1.715e-01  -0.887  0.37607    
I(OSLO_sunshine^2)          2.133e-02  1.015e-02   2.101  0.03649 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.967 on 295 degrees of freedom
Multiple R-squared:  0.518, Adjusted R-squared:  0.4951 
F-statistic: 22.64 on 14 and 295 DF,  p-value: < 2.2e-16
anova(model1, model_quad)
Analysis of Variance Table

Model 1: OSLO_temp_mean ~ OSLO_cloud_cover + OSLO_wind_speed + OSLO_humidity + 
    OSLO_pressure + OSLO_global_radiation + OSLO_precipitation + 
    OSLO_sunshine
Model 2: OSLO_temp_mean ~ OSLO_cloud_cover + I(OSLO_cloud_cover^2) + OSLO_wind_speed + 
    I(OSLO_wind_speed^2) + OSLO_humidity + I(OSLO_humidity^2) + 
    OSLO_pressure + I(OSLO_pressure^2) + OSLO_global_radiation + 
    I(OSLO_global_radiation^2) + OSLO_precipitation + I(OSLO_precipitation^2) + 
    OSLO_sunshine + I(OSLO_sunshine^2)
  Res.Df    RSS Df Sum of Sq      F   Pr(>F)   
1    302 1237.1                                
2    295 1141.2  7    95.828 3.5387 0.001146 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
resettest(model_quad)

    RESET test

data:  model_quad
RESET = 1.0481, df1 = 2, df2 = 293, p-value = 0.3519

Výsledky:

Z 14 odhadovaných parametrov sú štatisticky významné najmä:

  • OSLO_global_radiation a jeho kvadratický člen (p < 0,001),

  • OSLO_precipitation (p ≈ 0,038) a jeho kvadratický člen je na hranici významnosti (p ≈ 0,10),

  • OSLO_sunshine^2 (p ≈ 0,036).

Ostatné premenné nemajú štatisticky významný vplyv na teplotu pri hladine významnosti 5 %.

Intercept a zvyšné kvadratické členy sú štatisticky nevýznamné, čo naznačuje, že ich prínos k predikcii je nízky.

  • Upravený koeficient determinácie 0.4951 znamená, že model vysvetľuje približne 49,5 % variability strednej teploty.

  • F-test celého modelu je vysoko významný (p < 0,001), čo potvrdzuje, že aspoň niektoré premenné významne prispievajú k vysvetleniu teploty.

  • ANOVA medzi modelom lineárnym a kvadratickým ukázala významný prínos pridania kvadratických členov (F = 3,54, p ≈ 0,0011).

To naznačuje, že zahrnutie nelineárnych efektov zlepšuje schopnosť modelu vysvetliť variabilitu teploty.

  • Hodnota RESET = 1,048 s p-value ≈ 0,352 naznačuje, že model nie je štatisticky nesprávne špecifikovaný.

Inými slovami, pravdepodobnosť, že sme opomenuli významné nelineárne transformácie alebo interakcie, je nízka.

Celkovo pridanie kvadratických členov do modelu poskytlo významné zlepšenie predikcie teploty, hlavne v prípade globálneho žiarenia, zrážok a slnečného svitu. Väčšina ostatných premenných však nelineárny efekt nepreukázala. Model je štatisticky korektne špecifikovaný a vhodný na interpretáciu hlavných vplyvov meteorologických faktorov na teplotu v Osle.

Dummy premenná

V tomto kroku sme do modelu pridali dummy premennú Shock, ktorá označuje, či sa pozorovanie týka júla (Shock = 1) alebo nie (Shock = 0). Takéto premenné používame na zachytenie špecifických účinkov kategórií alebo udalostí na závislú premennú, ktoré nie sú vysvetlené kvantitatívnymi prediktormi.

weather_july <- weather_july %>%
  mutate(Shock = ifelse(MONTH == 7, 1, 0)) 

model_dummy <- lm(OSLO_temp_mean ~ OSLO_cloud_cover + OSLO_wind_speed +
                    OSLO_humidity + OSLO_pressure + OSLO_global_radiation +
                    OSLO_precipitation + OSLO_sunshine + Shock,
                  data = weather_july)
summary(model_dummy)

Call:
lm(formula = OSLO_temp_mean ~ OSLO_cloud_cover + OSLO_wind_speed + 
    OSLO_humidity + OSLO_pressure + OSLO_global_radiation + OSLO_precipitation + 
    OSLO_sunshine + Shock, data = weather_july)

Residuals:
    Min      1Q  Median      3Q     Max 
-5.3988 -1.2870 -0.1237  1.3101  4.7764 

Coefficients: (1 not defined because of singularities)
                        Estimate Std. Error t value Pr(>|t|)    
(Intercept)           -105.89136   18.05572  -5.865 1.18e-08 ***
OSLO_cloud_cover         0.06244    0.13349   0.468  0.64031    
OSLO_wind_speed         -0.22277    0.13584  -1.640  0.10205    
OSLO_humidity           -6.65813    1.68418  -3.953 9.61e-05 ***
OSLO_pressure          126.40600   17.61289   7.177 5.55e-12 ***
OSLO_global_radiation   -0.40157    0.25817  -1.555  0.12089    
OSLO_precipitation       0.19725    0.18137   1.088  0.27765    
OSLO_sunshine            0.18730    0.06116   3.063  0.00239 ** 
Shock                         NA         NA      NA       NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.024 on 302 degrees of freedom
Multiple R-squared:  0.4775,    Adjusted R-squared:  0.4654 
F-statistic: 39.43 on 7 and 302 DF,  p-value: < 2.2e-16
anova(model_quad, model_dummy)
Analysis of Variance Table

Model 1: OSLO_temp_mean ~ OSLO_cloud_cover + I(OSLO_cloud_cover^2) + OSLO_wind_speed + 
    I(OSLO_wind_speed^2) + OSLO_humidity + I(OSLO_humidity^2) + 
    OSLO_pressure + I(OSLO_pressure^2) + OSLO_global_radiation + 
    I(OSLO_global_radiation^2) + OSLO_precipitation + I(OSLO_precipitation^2) + 
    OSLO_sunshine + I(OSLO_sunshine^2)
Model 2: OSLO_temp_mean ~ OSLO_cloud_cover + OSLO_wind_speed + OSLO_humidity + 
    OSLO_pressure + OSLO_global_radiation + OSLO_precipitation + 
    OSLO_sunshine + Shock
  Res.Df    RSS Df Sum of Sq      F   Pr(>F)   
1    295 1141.2                                
2    302 1237.1 -7   -95.828 3.5387 0.001146 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
resettest(model_dummy)

    RESET test

data:  model_dummy
RESET = 0.52801, df1 = 2, df2 = 299, p-value = 0.5903

Výsledky:

  • Štatisticky významné sú OSLO_humidity (p < 0,001), OSLO_pressure (p < 0,001) a OSLO_sunshine (p ≈ 0,002).

  • Premenná Shock nie je odhadnutá (NA), čo je spôsobené singularitou – pravdepodobne preto, že všetky pozorovania sa týkajú júla, alebo je kolineárna s inými premennými.

  • F-test celého modelu je vysoko významný (p < 0,001), čo potvrdzuje, že aspoň niektoré premenné významne prispievajú k vysvetleniu teploty.

  • ANOVA medzi kvadratickým a dummy modelom ukázala, že kvadratický model je štatisticky významne lepší (p ≈ 0,0011), čo naznačuje, že pridanie nelineárnych členov poskytuje lepšie vysvetlenie variability teploty než jednoduché zahrnutie dummy pre júl.

  • RESET = 0,528, p ≈ 0,59, čo znamená, že model nie je štatisticky nesprávne špecifikovaný, teda neexistuje silný dôkaz o opomenutí nelineárnych transformácií alebo interakcií.

Zahrnutie dummy premenných umožňuje modelu zachytiť špecifický účinok kategórií alebo udalostí, avšak v tomto prípade premenná Shock nebola odhadnutá, čo poukazuje na kolinearitu alebo singularitu. Kvadratické členy sa ukázali ako efektívnejší spôsob zachytenia nelineárnych vzťahov medzi meteorologickými premennými a teplotou.

Box-Cox transformácia

Box-Cox transformáciu používame na to, aby sme našli takú mocninovú transformáciu závislej premennej, ktorá čo najlepšie zlepší normalitu reziduí, homoskedasticitu a celkovú špecifikáciu regresného modelu, čím sa zvyšuje spoľahlivosť odhadov.

boxcox(model1, lambda = seq(-2, 2, 0.1))

Výsledky:

  • Najvyšší bod krivky je približne pri λ ≈ –0,05.

To znamená, že práve táto transformácia najviac zlepšuje vlastnosti modelu.

  • 95% intervalová páska ukazuje rozsah λ, ktoré sú štatisticky prijateľné -> graf ju pretína v bodoch λ ≈ –0,6 a λ ≈ 0,45.

To znamená, že všetky hodnoty λ v rozmedzí –0,6 až 0,45 sú akceptovateľné, ale najlepší (optimálny) je λ ≈ –0,05.

Pretože optimálny λ je blízko nule, znamená to, že teplota takmer nepotrebuje transformáciu. Správanie teploty v dátach je takmer lineárne a stabilné, takže Box-Cox nepotvrdil potrebu zásadnej transformácie.

Záver

Cieľom analýzy bolo preskúmať, ako významné meteorologické premenné ovplyvňujú priemernú júlovú teplotu v Osle a aká špecifikácia modelu ju najlepšie vystihuje.

Lineárna regresia potvrdila najvýznamnejší vplyv vlhkosti vzduchu, atmosférického tlaku a slnečného svitu, pričom diagnostické testy potvrdili primeranú špecifikáciu modelu a normalitu rezíduí.

Rozšírenie modelu o kvadratické členy významne zlepšilo jeho kvalitu, najmä vďaka zachyteniu nelineárnych efektov globálneho žiarenia, zrážok a slnečného svitu.

Box-Cox transformácia ukázala, že optimálna hodnota λ je blízka nule, čo znamená, že teplota nevyžaduje transformáciu a dáta sú vhodné pre lineárne modelovanie.

Výsledky tak potvrdzujú, že teplotu najviac ovplyvňuje kombinácia vlhkosti, tlaku a slnečných hodín a že jej správanie možno spoľahlivo vysvetliť lineárnym modelom doplneným o kľúčové nelineárne efekty.

LS0tDQp0aXRsZTogIsOabG9oYV83Ig0KYXV0aG9yOiAiQmMuIEtyeXN0eW5hIFZhc3lseW5hIg0KZGF0ZTogIk5vdmVtYmVyIDIwMjUiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdGhlbWU6IHVuaXRlZA0KICAgIGhpZ2hsaWdodDogdGFuZ28NCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KZWRpdG9yX29wdGlvbnM6DQogIG1hcmtkb3duOg0KICAgIHdyYXA6IDcyDQotLS0NCg0KIyMgw5p2b2QNCg0KViB0ZWp0byDDumxvaGUgc2vDum1hbWUsICoqYWtvIG1ldGVvcm9sb2dpY2vDqSBmYWt0b3J5IG92cGx5dsWIdWrDuiBwcmllbWVybsO6IHRlcGxvdHUgdiBtZXN0ZSBPc2xvIHBvxI1hcyBqw7psYSoqIOKAkyBuYWp0ZXBsZWrFoWllaG8gbWVzaWFjYSB2IHJva3UuIEFuYWx5enVqZW1lIHByZW1lbm7DqSBha28gKipvYmxhxI1ub3PFpSwgcsO9Y2hsb3PFpSB2ZXRyYSwgdmxoa29zxaUsIHRsYWssIGdsb2LDoWxuZSDFvmlhcmVuaWUsIHpyw6HFvmt5IGEgc2xuZcSNbsO9IHN2aXQqKi4NCg0KQ2llxL5vbSBqZSBvZGhhZG7DusWlIGxpbmXDoXJuZSBhIG5lbGluZcOhcm5lIG1vZGVseSwgb3ZlcmnFpSBpY2ggc3Byw6F2bm9zxaUgcG9tb2NvdSBkaWFnbm9zdGlja8O9Y2ggdGVzdG92IGEgZ3JhZm92LCBwcmVza8O6bWHFpSB2cGx5diDFoXBlY2lmaWNrw71jaCB1ZGFsb3N0w60gY2V6IGR1bW15IHByZW1lbm7DqSBhIHBvc8O6ZGnFpSB2aG9kbm9zxaUgdHJhbnNmb3Jtw6FjaWUgesOhdmlzbGVqIHByZW1lbm5lai4gVsO9c2xlZGt5IHVtb8W+bmlhIGxlcMWhaWUgcG9jaG9wacWlLCBrdG9yw6kgZmFrdG9yeSBuYWp2aWFjIG92cGx5dsWIdWrDuiBqw7psb3ZlIHRlcGxvdHkuDQoNCiMjIE5hxI3DrXRhbmllIGtuacW+bsOtYw0KDQpgYGB7cn0NCmxpYnJhcnkoem9vKQ0KbGlicmFyeSh0c2VyaWVzKQ0KbGlicmFyeShsbXRlc3QpDQpsaWJyYXJ5KHNhbmR3aWNoKQ0KbGlicmFyeShjYXIpDQpsaWJyYXJ5KGNhckRhdGEpDQpsaWJyYXJ5KGNvd3Bsb3QpDQpsaWJyYXJ5KGdncGxvdDIpDQpybShsaXN0PWxzKCkpDQpgYGANCg0KIyMgTmHEjcOtdGFuaWUgZMOhdA0KDQpgYGB7cn0NCmRhdGEgPC0gcmVhZC5jc3YoIndlYXRoZXJfcHJlZGljdGlvbl9kYXRhc2V0LmNzdiIpDQpgYGANCg0KIyMgVsO9YmVyIHByZW1lbm55Y2gNCg0KYGBge3J9DQp3ZWF0aGVyIDwtIGRhdGFbLCBjKCdNT05USCcsDQogICAgICAgICAgICAgICAgICAgICJPU0xPX2Nsb3VkX2NvdmVyIiwgDQogICAgICAgICAgICAgICAgICAgICJPU0xPX3dpbmRfc3BlZWQiLCANCiAgICAgICAgICAgICAgICAgICAgIk9TTE9faHVtaWRpdHkiLA0KICAgICAgICAgICAgICAgICAgICAiT1NMT19wcmVzc3VyZSIsIA0KICAgICAgICAgICAgICAgICAgICAiT1NMT19nbG9iYWxfcmFkaWF0aW9uIiwgDQogICAgICAgICAgICAgICAgICAgICJPU0xPX3ByZWNpcGl0YXRpb24iLCANCiAgICAgICAgICAgICAgICAgICAgIk9TTE9fc3Vuc2hpbmUiLCANCiAgICAgICAgICAgICAgICAgICAgIk9TTE9fdGVtcF9tZWFuIildDQoNCndlYXRoZXJfanVseSA8LSB3ZWF0aGVyICU+JSBmaWx0ZXIoTU9OVEggPT0gNykNCg0Kc3VtbWFyeSh3ZWF0aGVyX2p1bHkpDQpgYGANCiMjIFrDoWtsYWRuw70gbGluZcOhcm55IHJlZ3Jlc27DvSBtb2RlbA0KDQpaw6FrbGFkbsO9IGxpbmXDoXJueSByZWdyZXNuw70gbW9kZWwgc2EgcG91xb7DrXZhIG5hIG9kaGFkbnV0aWUgdnrFpWFodSBtZWR6aSBwcmllbWVybm91IGrDumxvdm91IHRlcGxvdG91IHYgT3NsZSBhIG1ldGVvcm9sb2dpY2vDvW1pIHByZW1lbm7DvW1pLCBhYnkgc21lIGlkZW50aWZpa292YWxpLCBrdG9yw6kgZmFrdG9yeSBtYWrDuiBuYSB0ZXBsb3R1IG5hanbDpMSNxaHDrSB2cGx5di4NCg0KYGBge3J9DQptb2RlbDEgPC0gbG0oT1NMT190ZW1wX21lYW4gfiBPU0xPX2Nsb3VkX2NvdmVyICsgT1NMT193aW5kX3NwZWVkICsNCiAgICAgICAgICAgICAgIE9TTE9faHVtaWRpdHkgKyBPU0xPX3ByZXNzdXJlICsgT1NMT19nbG9iYWxfcmFkaWF0aW9uICsNCiAgICAgICAgICAgICAgIE9TTE9fcHJlY2lwaXRhdGlvbiArIE9TTE9fc3Vuc2hpbmUsDQogICAgICAgICAgICAgZGF0YSA9IHdlYXRoZXJfanVseSkNCnN1bW1hcnkobW9kZWwxKQ0KYGBgDQoqKlbDvXNsZWRreToqKg0KDQotIFZsaGtvc8WlIHZ6ZHVjaHUgKE9TTE9faHVtaWRpdHksIHAgPCAwLDAwMSk6ICoqdnnFocWhaWEgdmxoa29zxaUgdsO9cmF6bmUgem5pxb51amUgcHJpZW1lcm7DuiB0ZXBsb3R1Kio7IHYgasO6bGkgdGVkYSBtb2tyZWrFoWllIGRuaSBiw712YWrDuiBjaGxhZG5lasWhaWUuDQoNCi0gQXRtb3Nmw6lyaWNrw70gdGxhayAoT1NMT19wcmVzc3VyZSwgcCA8IDAsMDAxKTogKip2ecWhxaHDrSB0bGFrIGplIHNwb2plbsO9IHMgdnnFocWhb3UgdGVwbG90b3UqKjsgc3RhYmlsbsOpIHRsYWtvdsOpIHBvZG1pZW5reSB2IGrDumxpIHBvZHBvcnVqw7ogdGVwbGVqxaFpZSBkbmkuDQoNCi0gU2xuZcSNbsO9IHN2aXQgKE9TTE9fc3Vuc2hpbmUsIHAgPSAwLDAwMik6ICoqdmlhYyBzbG5lxI1uw71jaCBob2TDrW4genZ5xaF1amUgcHJpZW1lcm7DuiB0ZXBsb3R1Kio7IGphc25lasWhaWUgZG5pIHPDuiB0ZXBsZWrFoWllLg0KDQotIE9ibGHEjW5vc8WlLCByw71jaGxvc8WlIHZldHJhLCBnbG9iw6FsbmUgxb5pYXJlbmllIGEgenLDocW+a3k6IHRpZXRvIHByZW1lbm7DqSAqKm5pZSBzw7ogxaF0YXRpc3RpY2t5IHbDvXpuYW1uw6kqKiwgxI1vIHpuYW1lbsOhLCDFvmUgdiBqw7psaSBuZW1hasO6IHrDoXNhZG7DvSBzYW1vc3RhdG7DvSB2cGx5diBuYSBwcmllbWVybsO6IHRlcGxvdHUgdiBPc2xlLg0KDQotIENlbGtvdsOhIHZ5c3ZldGxlbsOhIHZhcmlhYmlsaXRhIChSwrIgPSAwLDQ3NzUpOiBtb2RlbCB2eXN2ZXTEvnVqZSBwcmlibGnFvm5lICoqNDclKiogcm96ZGllbG92IHYgdGVwbG90ZSBtZWR6aSBqZWRub3RsaXbDvW1pIGTFiGFtaSBqw7psYSwgdGFrxb5lIGhsYXZuw6kgZmFrdG9yeSBzw7ogemFjaHl0ZW7DqSwgYWxlIG5pZWt0b3LDqSB2cGx5dnkgem9zdMOhdmFqw7ogbmV2eXN2ZXRsZW7DqS4NCg0KLSBSZXppZHXDoSAoLTUsNCBhxb4gNCw4IMKwQyk6IG1vZGVsIGRvYnJlIG9kaGFkdWplIHByaWVtZXJuw7ogdGVwbG90dSwgbm8gKipleHRyw6ltbmUgdGVwbG90eSBtw7TFvnUgYnnFpSBwb2Rob2Rub3RlbsOpIGFsZWJvIG5hZGhvZG5vdGVuw6kqKi4NCg0KIyMgUkVTRVQgdGVzdCBuYSBrb250cm9sdSDFoXBlY2lmaWvDoWNpZSBtb2RlbHUNCg0KUkVTRVQgdGVzdCBzYSBwb3XFvsOtdmEgbmEgb3ZlcmVuaWUsIMSNaSBsaW5lw6FybnkgbW9kZWwgc3Byw6F2bmUgemFjaHl0w6F2YSB2esWlYWggbWVkemkgcHJlbWVubsO9bWkgYSB0ZXBsb3RvdSwgdGVkYSDEjWkgbmVjaMO9YmFqw7ogbmVsaW5lw6FybmUgZWZla3R5IGFsZWJvIGludGVyYWtjaWUuDQoNCmBgYHtyfQ0KcmVzZXR0ZXN0KG1vZGVsMSkNCmBgYA0KKipWw71zbGVka3k6KioNCg0KLSBSRVNFVCA9IDAsNTI5NzcsIHAgPSAwLDU4OTM6IHZ5c29rw6EgcC1ob2Rub3RhICg+IDAsMDUpIG5hem5hxI11amUsIMW+ZSAqKm5lbcOhbWUgZMO0a2F6IHByb3RpIHNwcsOhdm5laiDFoXBlY2lmaWvDoWNpaSBtb2RlbHUqKi4NCg0KLSBWw716bmFtIHByZSB0ZXBsb3R1OiBsaW5lw6FybnkgbW9kZWwgdmhvZG5lIHZ5c3RpaHVqZSB2esWlYWh5IG1lZHppIG1ldGVvcm9sb2dpY2vDvW1pIHByZW1lbm7DvW1pIGEgcHJpZW1lcm5vdSB0ZXBsb3RvdTsgbmVwcsOtdG9tbm9zxaUgbmVsaW5lw6FybnljaCBlZmVrdG92IHpuYW1lbsOhLCDFvmUgKip0ZXBsb3RhIHJlYWd1amUgbmEgZmFrdG9yeSBwcmlibGnFvm5lIGxpbmXDoXJuZSoqLg0KDQojIyBSZXppZHXDoWxuZSBncmFmeQ0KDQojIyMgUmVzaWR1YWxzIHZzIEZpdHRlZA0KDQpHcmFmIOKAnlJlc2lkdWFscyB2cyBGaXR0ZWTigJwgcG91xb7DrXZhbWUgbmEga29udHJvbHUsIMSNaSBsaW5lw6FybnkgbW9kZWwgc3Byw6F2bmUgcHJlZGlrdWplIHByaWVtZXJuw7ogdGVwbG90dSB2IGrDumxpIGEgxI1pIHJlemlkdcOhIG5lbWFqw7ogc3lzdGVtYXRpY2vDvSB2em9yIGFsZWJvIGhldGVyb3NrZWRhc3RpY2l0dS4NCg0KYGBge3J9DQpwbG90KG1vZGVsMSwgd2hpY2ggPSAxKSANCmBgYA0KKipWw71zbGVka3k6KioNCg0KLSBSZXppZHXDoSBzw7ogdsOkxI3FoWlub3Ugcm92bm9tZXJuZSByb3pwdMO9bGVuw6kgb2tvbG8gaG9yaXpvbnTDoWxuZWogxI1pYXJ5LCDEjW8gbmF6bmHEjXVqZSwgxb5lICoqbW9kZWwgZG9icmUgdnlzdGlodWplIHZ6xaVhaCBtZWR6aSB2xaFldGvDvW1pIG1ldGVvcm9sb2dpY2vDvW1pIHByZW1lbm7DvW1pIGEgcHJpZW1lcm5vdSB0ZXBsb3RvdS4qKg0KDQotIFbDpMSNxaFpbmEgYm9kb3Ygc2Egc8O6c3RyZcSPdWplIHByaSBuacW+xaHDrWNoIGHFviBzdHJlZG7DvWNoIHByZWRpa292YW7DvWNoIGhvZG5vdMOhY2ggKiooRml0dGVkIOKJiCAxNOKAkzE4KSoqLCBrZGUgbW9kZWwgdmXEvm1pIHByZXNuZSBwcmVkaWt1amUgc2t1dG/EjW7DuiB0ZXBsb3R1Lg0KDQotIFZ5c2t5dHVqw7ogc2Egbmlla3RvcsOpICoqZXh0csOpbW5lIGJvZHksIGt0b3LDqSBwcmVkc3RhdnVqw7ogdsO9cmF6bmVqxaFpZSBvZGNow71sa3kgbWVkemkgcHJlZGlrb3Zhbm91IGEgc2t1dG/EjW5vdSB0ZXBsb3RvdSoqLCB0eXBpY2t5IHByaSBleHRyw6ltbmUgdnlzb2vDvWNoIGFsZWJvIG7DrXpreWNoIGTFiG9jaC4NCg0KLSBQcmkgdnnFocWhw61jaCBwcmVkaWtvdmFuw71jaCBob2Rub3TDoWNoICoqKEZpdHRlZCDiiYggMjDigJMyMikqKiBzYSBib2R5IG1pZXJuZSByb3pwdHnEvnVqw7osIMSNbyB1a2F6dWplLCDFvmUgKiptb2RlbCBqZSB0cm9jaHUgbWVuZWogcHJlc27DvSBwcmUgbmFqdGVwbGVqxaFpZSBkbmkqKiwgYWxlIHN0w6FsZSB6YWNoeXTDoXZhIGhsYXZuw7ogdGVuZGVuY2l1Lg0KDQpDZWxrb3ZvICoqZ3JhZiBwb2Rwb3J1amUgdmhvZG5vc8WlIGxpbmXDoXJuZWhvIG1vZGVsdSoqIGEgbmVvZGhhbGlsIMW+aWFkbmUgdsO9cmF6bsOpIHN5c3RlbWF0aWNrw6kgb2RjaMO9bGt5IMSNaSBoZXRlcm9za2VkYXN0aWNpdHUgcmV6w61kdcOtLg0KDQojIyMgUVEgcGxvdA0KDQpRUSBwbG90IHBvdcW+w612YW1lIG5hIG92ZXJlbmllIG5vcm1hbGl0eSByZXrDrWR1w60gbGluZcOhcm5laG8gbW9kZWx1LCDEjW8gamUgZMO0bGXFvml0w6kgcHJlIHNwcsOhdm5vc8WlIGluZmVyZW7EjW7DvWNoIHRlc3RvdiBhIHAtaG9kbsO0dCBrb2VmaWNpZW50b3YuDQoNCmBgYHtyfQ0KcGxvdChtb2RlbDEsIHdoaWNoID0gMikNCmBgYA0KKipWw71zbGVka3k6KioNCg0KLSBWw6TEjcWhaW5hIGJvZG92IHNsZWR1amUgZGlhZ29uw6FsbnUgxI1pYXJ1IHZlxL5taSBwcmVzbmUsIMSNbyBuYXpuYcSNdWplLCDFvmUgKipyZXppZHXDoSBwcmlibGnFvm5lIG5hc2xlZHVqw7ogbm9ybcOhbG5lIHJvemRlbGVuaWUuKioNCg0KLSBWIGRvbG5laiBhIGhvcm5laiDEjWFzdGkgc2Egdnlza3l0dWrDuiBleHRyw6lteSwga2RlIGplIG1lbmVqIGJvZG92IGEgc8O6IG9kY2jDvWxlbsOpLCDEjW8gem5hbWVuw6EgKipwcsOtdG9tbm9zxaUgbmlla2/EvmvDvWNoIHZlxL5taSBuw616a3ljaCBhbGVibyB2eXNva8O9Y2ggcmV6w61kdcOtLioqDQoNCkNlbGtvdm8gKipncmFmIHBvZHBvcnVqZSBwcmVkcG9rbGFkIG5vcm1hbGl0eSByZXrDrWR1w60qKiwgcHJpxI1vbSBleHRyw6ltbmUgb2RjaMO9bGt5IHByZWRzdGF2dWrDuiB6cmllZGthdsOpIGRuaSBzIG5lb2J2eWtsw71taSBwb2RtaWVua2FtaSwga3RvcsOpIG1pZXJuZSB2eWJvxI11asO6IHogbm9ybcOhbG5laG8gcm96ZGVsZW5pYS4NCg0KIyMjIFNjYWxlLUxvY2F0aW9uDQoNCkdyYWYgU2NhbGUtTG9jYXRpb24gcG91xb7DrXZhbWUgbmEgb3ZlcmVuaWUgcHJlZHBva2xhZHUgaG9tb3NrZWRhc3RpY2l0eSwgdGVkYSDEjWkgcm96cHR5bCByZXrDrWR1w60gamUgcHJpYmxpxb5uZSBrb27FoXRhbnRuw70gcHJlIHbFoWV0a3kgcHJlZGlrb3ZhbsOpIGhvZG5vdHkgdGVwbG90eS4NCg0KYGBge3J9DQpwbG90KG1vZGVsMSwgd2hpY2ggPSAzKSANCmBgYA0KKipWw71zbGVka3k6KioNCg0KLSDEjGVydmVuw6EgxI1pYXJhIHN0w7pwYSBtaWVybmUgbmFob3IsIMSNbyBuYXpuYcSNdWplLCDFvmUgKipyb3pwdHlsIHJlesOtZHXDrSBzYSBzIHJhc3RvbSBwcmVkaWtvdmFuw71jaCBob2Ruw7R0IG1pZXJuZSB6dnnFoXVqZS4qKg0KDQotIFbDpMSNxaFpbmEgYm9kb3YgamUgcm92bm9tZXJuZSByb3pwdMO9bGVuw6Egb2tvbG8gxI1pYXJ5LCBzIHbDpMSNxaHDrW0gemh1c3RlbsOtbSBwcmkgRml0dGVkIOKJiCAxNeKAkzE4LCDEjW8gem5hbWVuw6EsIMW+ZSAqKm1vZGVsIGplIHByZXNuZWrFocOtIHByZSBzdHJlZG7DqSBwcmVkaWtvdmFuw6kgdGVwbG90eS4qKg0KDQotIFByw610b21uw6kgc8O6IGV4dHLDqW1uZSBob2Rub3R5LCBrdG9yw6kgKipyZXByZXplbnR1asO6IGRuaSBzIHbDvXJhem5lasWhw61taSBvZGNow71sa2FtaSoqLCB0eXBpY2t5IHZlxL5taSBob3LDumNlIGFsZWJvIGNobGFkbsOpIGRuaS4NCg0KQ2Vsa292byAqKmdyYWYgbmF6bmHEjXVqZSBtaWVybmUgc3TDunBhasO6Y3UgdmFyaWFiaWxpdHUgcmV6w61kdcOtKiogcHJpIHZ5xaHFocOtY2ggcHJlZGlrb3ZhbsO9Y2ggaG9kbm90w6FjaCwgYWxlICoqcHJlZHBva2xhZCBwcmlibGnFvm5lIGtvbsWhdGFudG7DqWhvIHJvenB0eWx1IGplIHN0w6FsZSBha2NlcHRvdmF0ZcS+bsO9LioqDQoNCiMjIyBMZXZlcmFnZSB2cy4gU3RhbmRhcmRpemVkIHJlc2lkdWFscw0KDQpHcmFmIExldmVyYWdlIHZzLiBTdGFuZGFyZGl6ZWQgcmVzaWR1YWxzIHBvdcW+w612YW1lIG5hIGlkZW50aWZpa8OhY2l1IHBvem9yb3ZhbsOtLCBrdG9yw6kgbWFqw7ogbmVvYnZ5a2zDqSBob2Rub3R5IHZ5c3ZldMS+dWrDumNpY2ggcHJlbWVubsO9Y2ggYSBtw7TFvnUgdsO9cmF6bmUgb3ZwbHl2bmnFpSBvZGhhZCByZWdyZXNuw71jaCBrb2VmaWNpZW50b3YuDQoNCmBgYHtyfQ0KcGxvdChtb2RlbDEsIHdoaWNoID0gNSkgDQpgYGANCioqVsO9c2xlZGt5OioqDQoNCi0gxIxlcnZlbsOhIMSNaWFyYSB6YcSNw61uYSBob3Jpem9udMOhbG5lIHByaSBuw616a2VqIGxldmVyYWdlIChYIOKJiCAw4oCTMCwwNSksIHBvdG9tIGplbW5lIHN0w7pwYSBhxb4gZG8gWCDiiYggMCwxMCBhIG5ha29uaWVjIHBydWRrbyBrbGVzw6Egc21lcm9tIGsgWSDiiYggLTIuIFRvIHVrYXp1amUsIMW+ZSAqKnbDpMSNxaFpbmEgZG7DrSBqw7psYSBzYSBzcHLDoXZhIHByZWR2w61kYXRlxL5uZSoqLCBhbGUgcHJlIG5pZWt0b3LDqSBrb21iaW7DoWNpZSBwcmVtZW5uw71jaCBzYSBvxI1ha8OhdmFuw6kgcmV6aWR1w6EgbWllcm5lIHp2ecWhdWrDuiBhbGVibyBuw6FobGUga2xlc2Fqw7ouDQoNCi0gVsOkxI3FoWluYSBkbsOtIGplIHPDunN0cmVkZW7DoSBwcmkgbsOtemtlaiBsZXZlcmFnZSwgcmV6aWR1w6Egc2EgZHLFvmlhIGJsw616a28gbnVseSwgxI1vIHpuYW1lbsOhLCDFvmUgKiptb2RlbCBkb2JyZSB6YWNoeXTDoXZhIHR5cGlja8OpIGrDumxvdmUgcG/EjWFzaWUgYSB0ZXBsb3R1LioqDQoNCi0gRXh0csOpbW5lIGhvZG5vdHkgLSAqKnRpZXRvIGRuaSoqIHByZWRzdGF2dWrDuiBuZW9idnlrbMOpIHBvZG1pZW5reSwga3RvcsOpICoqbcO0xb51IHbDvXJhem5lasWhaWUgb3ZwbHl2bmnFpSBtb2RlbC4qKg0KDQpDZWxrb3ZvICoqbW9kZWwgc3BvxL5haGxpdm8gcG9waXN1amUgdsOkxI3FoWludSBqw7psb3ZlaiB0ZXBsb3R5KiosIG5vIHRyZWJhIG1hxaUgbmEgcGFtw6R0aSwgxb5lICoqbmlla3RvcsOpIGV4dHLDqW1uZSBkbmkgcyBuZcWhdGFuZGFyZG7DvW1pIG1ldGVvcm9sb2dpY2vDvW1pIHBvZG1pZW5rYW1pIG3DtMW+dSBzcMO0c29ib3ZhxaUgb2RjaMO9bGt5IG9kIHByZWRpa2NpZS4qKg0KDQojIyBDK1IgcGxvdHkgcHJlIHZpenXDoWxuZSBwb3PDumRlbmllIGxpbmVhcml0eQ0KDQpDK1IgcGxvdHkgcG91xb7DrXZhbWUgbmEgdG8sIGFieSBzbWUgdml6dcOhbG5lIG92ZXJpbGksIMSNaSBqZSB2esWlYWggbWVkemkgamVkbm90bGl2w71taSBtZXRlb3JvbG9naWNrw71taSBwcmVtZW5uw71taSBhIHByaWVtZXJub3UgdGVwbG90b3UgdiBqw7psaSBkb3N0YXRvxI1uZSBsaW5lw6FybnksIHRlZGEgxI1pIGxpbmXDoXJueSBtb2RlbCBkw6F2YSB6bXlzZWwgcHJlIHRpZXRvIGTDoXRhLg0KDQpgYGB7cn0NCmNyUGxvdHMobW9kZWwxKQ0KYGBgDQojIyMjIE9TTE9fY2xvdWRfY292ZXINCg0KTmEgZ3JhZmUgamUgdmlkaWXFpSwgxb5lIGJvZHkgc8O6IHJvemxvxb5lbsOpIHYgcMOhc21hY2ggcG9kxL5hIGthdGVnw7NyacOtIG9ibGHEjW5vc3RpIGEgdnlobGFkZW7DoSBrcml2a2EgamUgdGFrbWVyIHZvZG9yb3Zuw6EuDQpUbyB6bmFtZW7DoSwgxb5lICoqb2JsYcSNbm9zxaUgdGFrbWVyIG5lb3ZwbHl2xYh1amUgdGVwbG90dSoqIHYgbGluZcOhcm5laiBmb3JtZS4NCg0KIyMjIyBPU0xPX3dpbmRfc3BlZWQNCg0KQm9keSBuYXpuYcSNdWrDuiBzbGFiw70ga2xlc2Fqw7pjaSB0cmVuZCBhIHZ5aGxhZGVuw6Ega3JpdmthIG1pZXJuZSBrbGVzw6EuDQpUbyBuYXpuYcSNdWplLCDFvmUgKipzaWxuZWrFocOtIHZpZXRvciBtw7TFvmUgc8O6dmlzaWXFpSBzIG8gbmllxI1vIG5pxb7FoW91IHRlcGxvdG91LioqDQoNCiMjIyMgT1NMT19odW1pZGl0eQ0KDQpWeWhsYWRlbsOhIGtyaXZrYSBtaWVybmUga2xlc8OhLCDEjW8gcG91a2F6dWplIG5hIHNsYWLDvSBuZWdhdMOtdm55IHZ6xaVhaC4NClRvIHpuYW1lbsOhLCDFvmUgKipwcmkgdnnFocWhZWogdmxoa29zdGkgbcOhIHRlcGxvdGEgdGVuZGVuY2l1IG1pZXJuZSBrbGVzYcWlLioqDQoNCiMjIyMgT1NMT19wcmVzc3VyZQ0KDQpLcml2a2EgbcOhIG1pZXJuZSByYXN0w7pjaSBjaGFyYWt0ZXIsIHZpZGl0ZcS+bsO9IGplIHNsYWLDvSBwb3ppdMOtdm55IHZ6xaVhaC4NCioqVnnFocWhw60gYXRtb3Nmw6lyaWNrw70gdGxhayBzw7p2aXPDrSBzIG1pZXJuZSB2ecWhxaFvdSB0ZXBsb3RvdS4qKg0KDQojIyMjIE9TTE9fZ2xvYmFsX3JhZGlhdGlvbg0KDQpCb2R5IHPDuiByb3pwdMO9bGVuw6kgbsOhaG9kbmUgYSB2eWhsYWRlbsOhIGtyaXZrYSBqZSB0YWttZXIgdm9kb3Jvdm7DoS4NClRvIG5hem5hxI11amUsIMW+ZSAqKmdsb2LDoWxuZSDFvmlhcmVuaWUgdGFrbWVyIG5ldnlzdmV0xL51amUgem1lbnkgdGVwbG90eSoqIHYgbGluZcOhcm5laiDEjWFzdGkgbW9kZWx1Lg0KDQojIyMjIE9TTE9fcHJlY2lwaXRhdGlvbg0KDQpWw6TEjcWhaW5hIGJvZG92IHNhIG5hY2jDoWR6YSBwcmkgaG9kbm90ZSBudWxhIGEga3JpdmthIG5ldnlrYXp1amUgdHJlbmQuDQoqKlpyw6HFvmt5IHRha21lciBuZW92cGx5dsWIdWrDuiB0ZXBsb3R1KiogdiByw6FtY2kgbGluZcOhcm5laG8gbW9kZWx1Lg0KDQojIyMjIE9TTE9fc3Vuc2hpbmUNCg0KS3JpdmthIHBvbWFseSByYXN0aWUsIMSNbyBwb3VrYXp1amUgbmEgc2xhYsO9IHBveml0w612bnkgdnrFpWFoLg0KKipWecWhxaHDrSBwb8SNZXQgaG9kw61uIHNsbmXEjW7DqWhvIHN2aXR1IHPDunZpc8OtIHMgbWllcm5lIHZ5xaHFoW91IHRlcGxvdG91LioqDQoNCiMjIEt2YWRyYXRpY2vDqSDEjWxlbnkgcHJlIG5lbGluZcOhcm5lIHZ6xaVhaHkNCg0KS3ZhZHJhdGlja8OpIMSNbGVueSB2IHJlZ3Jlc2lpIHBvdcW+w612YW1lIG5hIHphY2h5dGVuaWUgbmVsaW5lw6FybnljaCB2esWlYWhvdiBtZWR6aSBuZXrDoXZpc2zDvW1pIHByZW1lbm7DvW1pIGEgesOhdmlzbG91IHByZW1lbm5vdSwga2XEjyDDusSNaW5vayBwcmVkaWt0b3JhIG5hIHbDvXNsZWRvayBuaWUgamUga29uxaF0YW50bsO9LCBhbGUgbWVuw60gc2EgcyBqZWhvIGhvZG5vdG91Lg0KDQpgYGB7cn0NCm1vZGVsX3F1YWQgPC0gbG0oT1NMT190ZW1wX21lYW4gfiBPU0xPX2Nsb3VkX2NvdmVyICsgSShPU0xPX2Nsb3VkX2NvdmVyXjIpICsNCiAgICAgICAgICAgICAgICAgICBPU0xPX3dpbmRfc3BlZWQgKyBJKE9TTE9fd2luZF9zcGVlZF4yKSArDQogICAgICAgICAgICAgICAgICAgT1NMT19odW1pZGl0eSArIEkoT1NMT19odW1pZGl0eV4yKSArDQogICAgICAgICAgICAgICAgICAgT1NMT19wcmVzc3VyZSArIEkoT1NMT19wcmVzc3VyZV4yKSArDQogICAgICAgICAgICAgICAgICAgT1NMT19nbG9iYWxfcmFkaWF0aW9uICsgSShPU0xPX2dsb2JhbF9yYWRpYXRpb25eMikgKw0KICAgICAgICAgICAgICAgICAgIE9TTE9fcHJlY2lwaXRhdGlvbiArIEkoT1NMT19wcmVjaXBpdGF0aW9uXjIpICsNCiAgICAgICAgICAgICAgICAgICBPU0xPX3N1bnNoaW5lICsgSShPU0xPX3N1bnNoaW5lXjIpLA0KICAgICAgICAgICAgICAgICBkYXRhID0gd2VhdGhlcl9qdWx5KQ0Kc3VtbWFyeShtb2RlbF9xdWFkKQ0KYW5vdmEobW9kZWwxLCBtb2RlbF9xdWFkKQ0KcmVzZXR0ZXN0KG1vZGVsX3F1YWQpDQpgYGANCioqVsO9c2xlZGt5OioqDQoNClogMTQgb2RoYWRvdmFuw71jaCBwYXJhbWV0cm92ICoqc8O6IMWhdGF0aXN0aWNreSB2w716bmFtbsOpKiogbmFqbcOkOg0KDQotICoqT1NMT19nbG9iYWxfcmFkaWF0aW9uKiogYSBqZWhvIGt2YWRyYXRpY2vDvSDEjWxlbiAocCA8IDAsMDAxKSwNCg0KLSAqKk9TTE9fcHJlY2lwaXRhdGlvbioqIChwIOKJiCAwLDAzOCkgYSBqZWhvIGt2YWRyYXRpY2vDvSDEjWxlbiBqZSBuYSBocmFuaWNpIHbDvXpuYW1ub3N0aSAocCDiiYggMCwxMCksDQoNCi0gKipPU0xPX3N1bnNoaW5lXjIqKiAocCDiiYggMCwwMzYpLg0KDQpPc3RhdG7DqSBwcmVtZW5uw6kgKipuZW1hasO6IMWhdGF0aXN0aWNreSB2w716bmFtbsO9IHZwbHl2IG5hIHRlcGxvdHUqKiBwcmkgaGxhZGluZSB2w716bmFtbm9zdGkgNSAlLg0KDQpJbnRlcmNlcHQgYSB6dnnFoW7DqSBrdmFkcmF0aWNrw6kgxI1sZW55ICoqc8O6IMWhdGF0aXN0aWNreSBuZXbDvXpuYW1uw6kqKiwgxI1vIG5hem5hxI11amUsIMW+ZSBpY2ggcHLDrW5vcyBrIHByZWRpa2NpaSBqZSBuw616a3kuDQoNCi0gVXByYXZlbsO9IGtvZWZpY2llbnQgZGV0ZXJtaW7DoWNpZSAwLjQ5NTEgem5hbWVuw6EsIMW+ZSBtb2RlbCB2eXN2ZXTEvnVqZSBwcmlibGnFvm5lIDQ5LDUgJSB2YXJpYWJpbGl0eSBzdHJlZG5laiB0ZXBsb3R5Lg0KDQotICoqRi10ZXN0IGNlbMOpaG8gbW9kZWx1IGplIHZ5c29rbyB2w716bmFtbsO9KiogKHAgPCAwLDAwMSksIMSNbyBwb3R2cmR6dWplLCDFvmUgYXNwb8WIIG5pZWt0b3LDqSBwcmVtZW5uw6kgdsO9em5hbW5lIHByaXNwaWV2YWrDuiBrIHZ5c3ZldGxlbml1IHRlcGxvdHkuDQoNCi0gKipBTk9WQSoqIG1lZHppIG1vZGVsb20gbGluZcOhcm55bSBhIGt2YWRyYXRpY2vDvW0gKip1a8OhemFsYSB2w716bmFtbsO9IHByw61ub3MqKiBwcmlkYW5pYSBrdmFkcmF0aWNrw71jaCDEjWxlbm92IChGID0gMyw1NCwgcCDiiYggMCwwMDExKS4NCg0KVG8gbmF6bmHEjXVqZSwgxb5lICoqemFocm51dGllIG5lbGluZcOhcm55Y2ggZWZla3RvdiB6bGVwxaF1amUgc2Nob3Bub3PFpSBtb2RlbHUgdnlzdmV0bGnFpSB2YXJpYWJpbGl0dSB0ZXBsb3R5LioqDQoNCi0gSG9kbm90YSAqKlJFU0VUKiogPSAxLDA0OCBzIHAtdmFsdWUg4omIIDAsMzUyICoqbmF6bmHEjXVqZSwgxb5lIG1vZGVsIG5pZSBqZSDFoXRhdGlzdGlja3kgbmVzcHLDoXZuZSDFoXBlY2lmaWtvdmFuw70uKiogDQoNCkluw71taSBzbG92YW1pLCBwcmF2ZGVwb2RvYm5vc8WlLCDFvmUgc21lIG9wb21lbnVsaSB2w716bmFtbsOpIG5lbGluZcOhcm5lIHRyYW5zZm9ybcOhY2llIGFsZWJvIGludGVyYWtjaWUsIGplIG7DrXprYS4NCg0KQ2Vsa292byAqKnByaWRhbmllIGt2YWRyYXRpY2vDvWNoIMSNbGVub3YgZG8gbW9kZWx1IHBvc2t5dGxvIHbDvXpuYW1uw6kgemxlcMWhZW5pZSBwcmVkaWtjaWUgdGVwbG90eSwgaGxhdm5lIHYgcHLDrXBhZGUgZ2xvYsOhbG5laG8gxb5pYXJlbmlhLCB6csOhxb5vayBhIHNsbmXEjW7DqWhvIHN2aXR1LioqIFbDpMSNxaFpbmEgb3N0YXRuw71jaCBwcmVtZW5uw71jaCB2xaFhayBuZWxpbmXDoXJueSBlZmVrdCBuZXByZXVrw6F6YWxhLiBNb2RlbCBqZSDFoXRhdGlzdGlja3kga29yZWt0bmUgxaFwZWNpZmlrb3ZhbsO9IGEgdmhvZG7DvSBuYSBpbnRlcnByZXTDoWNpdSBobGF2bsO9Y2ggdnBseXZvdiBtZXRlb3JvbG9naWNrw71jaCBmYWt0b3JvdiBuYSB0ZXBsb3R1IHYgT3NsZS4NCg0KIyMgRHVtbXkgcHJlbWVubsOhIA0KDQpWIHRvbXRvIGtyb2t1IHNtZSBkbyBtb2RlbHUgcHJpZGFsaSBkdW1teSBwcmVtZW5uw7ogU2hvY2ssIGt0b3LDoSBvem5hxI11amUsIMSNaSBzYSBwb3pvcm92YW5pZSB0w71rYSBqw7psYSAoU2hvY2sgPSAxKSBhbGVibyBuaWUgKFNob2NrID0gMCkuIFRha8OpdG8gcHJlbWVubsOpIHBvdcW+w612YW1lIG5hIHphY2h5dGVuaWUgxaFwZWNpZmlja8O9Y2ggw7rEjWlua292IGthdGVnw7NyacOtIGFsZWJvIHVkYWxvc3TDrSBuYSB6w6F2aXNsw7ogcHJlbWVubsO6LCBrdG9yw6kgbmllIHPDuiB2eXN2ZXRsZW7DqSBrdmFudGl0YXTDrXZueW1pIHByZWRpa3Rvcm1pLg0KDQpgYGB7cn0NCndlYXRoZXJfanVseSA8LSB3ZWF0aGVyX2p1bHkgJT4lDQogIG11dGF0ZShTaG9jayA9IGlmZWxzZShNT05USCA9PSA3LCAxLCAwKSkgDQoNCm1vZGVsX2R1bW15IDwtIGxtKE9TTE9fdGVtcF9tZWFuIH4gT1NMT19jbG91ZF9jb3ZlciArIE9TTE9fd2luZF9zcGVlZCArDQogICAgICAgICAgICAgICAgICAgIE9TTE9faHVtaWRpdHkgKyBPU0xPX3ByZXNzdXJlICsgT1NMT19nbG9iYWxfcmFkaWF0aW9uICsNCiAgICAgICAgICAgICAgICAgICAgT1NMT19wcmVjaXBpdGF0aW9uICsgT1NMT19zdW5zaGluZSArIFNob2NrLA0KICAgICAgICAgICAgICAgICAgZGF0YSA9IHdlYXRoZXJfanVseSkNCnN1bW1hcnkobW9kZWxfZHVtbXkpDQphbm92YShtb2RlbF9xdWFkLCBtb2RlbF9kdW1teSkNCnJlc2V0dGVzdChtb2RlbF9kdW1teSkNCmBgYA0KKipWw71zbGVka3k6KioNCg0KLSAqKsWgdGF0aXN0aWNreSB2w716bmFtbsOpIHPDuioqIE9TTE9faHVtaWRpdHkgKHAgPCAwLDAwMSksIE9TTE9fcHJlc3N1cmUgKHAgPCAwLDAwMSkgYSBPU0xPX3N1bnNoaW5lIChwIOKJiCAwLDAwMikuDQoNCi0gUHJlbWVubsOhICoqU2hvY2sgbmllIGplIG9kaGFkbnV0w6EgKE5BKSoqLCDEjW8gamUgc3DDtHNvYmVuw6kgc2luZ3VsYXJpdG91IOKAkyBwcmF2ZGVwb2RvYm5lIHByZXRvLCDFvmUgdsWhZXRreSBwb3pvcm92YW5pYSBzYSB0w71rYWrDuiBqw7psYSwgYWxlYm8gamUga29saW5lw6FybmEgcyBpbsO9bWkgcHJlbWVubsO9bWkuDQoNCi0gKipGLXRlc3QqKiBjZWzDqWhvIG1vZGVsdSAqKmplIHZ5c29rbyB2w716bmFtbsO9IChwIDwgMCwwMDEpKiosIMSNbyBwb3R2cmR6dWplLCDFvmUgYXNwb8WIIG5pZWt0b3LDqSBwcmVtZW5uw6kgdsO9em5hbW5lIHByaXNwaWV2YWrDuiBrIHZ5c3ZldGxlbml1IHRlcGxvdHkuDQoNCi0gKipBTk9WQSoqIG1lZHppIGt2YWRyYXRpY2vDvW0gYSBkdW1teSBtb2RlbG9tICoqdWvDoXphbGEsIMW+ZSBrdmFkcmF0aWNrw70gbW9kZWwgamUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uZSBsZXDFocOtIChwIOKJiCAwLDAwMTEpKiosIMSNbyBuYXpuYcSNdWplLCDFvmUgcHJpZGFuaWUgbmVsaW5lw6FybnljaCDEjWxlbm92IHBvc2t5dHVqZSBsZXDFoWllIHZ5c3ZldGxlbmllIHZhcmlhYmlsaXR5IHRlcGxvdHkgbmXFviBqZWRub2R1Y2jDqSB6YWhybnV0aWUgZHVtbXkgcHJlIGrDumwuDQoNCi0gKipSRVNFVCA9IDAsNTI4LCBwIOKJiCAwLDU5LCDEjW8gem5hbWVuw6EsIMW+ZSBtb2RlbCBuaWUgamUgxaF0YXRpc3RpY2t5IG5lc3Byw6F2bmUgxaFwZWNpZmlrb3ZhbsO9KiosIHRlZGEgbmVleGlzdHVqZSBzaWxuw70gZMO0a2F6IG8gb3BvbWVudXTDrSBuZWxpbmXDoXJueWNoIHRyYW5zZm9ybcOhY2nDrSBhbGVibyBpbnRlcmFrY2nDrS4NCg0KWmFocm51dGllIGR1bW15IHByZW1lbm7DvWNoIHVtb8W+xYh1amUgbW9kZWx1IHphY2h5dGnFpSDFoXBlY2lmaWNrw70gw7rEjWlub2sga2F0ZWfDs3Jpw60gYWxlYm8gdWRhbG9zdMOtLCBhdsWhYWsgdiB0b210byBwcsOtcGFkZSBwcmVtZW5uw6EgU2hvY2sgbmVib2xhIG9kaGFkbnV0w6EsIMSNbyBwb3VrYXp1amUgbmEgKiprb2xpbmVhcml0dSBhbGVibyBzaW5ndWxhcml0dSoqLiBLdmFkcmF0aWNrw6kgxI1sZW55IHNhIHVrw6F6YWxpIGFrbyBlZmVrdMOtdm5lasWhw60gc3DDtHNvYiB6YWNoeXRlbmlhIG5lbGluZcOhcm55Y2ggdnrFpWFob3YgbWVkemkgbWV0ZW9yb2xvZ2lja8O9bWkgcHJlbWVubsO9bWkgYSB0ZXBsb3RvdS4NCg0KIyMgQm94LUNveCB0cmFuc2Zvcm3DoWNpYQ0KDQpCb3gtQ294IHRyYW5zZm9ybcOhY2l1IHBvdcW+w612YW1lIG5hIHRvLCBhYnkgc21lIG5hxaFsaSB0YWvDuiBtb2NuaW5vdsO6IHRyYW5zZm9ybcOhY2l1IHrDoXZpc2xlaiBwcmVtZW5uZWosIGt0b3LDoSDEjW8gbmFqbGVwxaFpZSB6bGVwxaHDrSBub3JtYWxpdHUgcmV6aWR1w60sIGhvbW9za2VkYXN0aWNpdHUgYSBjZWxrb3bDuiDFoXBlY2lmaWvDoWNpdSByZWdyZXNuw6lobyBtb2RlbHUsIMSNw61tIHNhIHp2ecWhdWplIHNwb8S+YWhsaXZvc8WlIG9kaGFkb3YuDQoNCmBgYHtyfQ0KYm94Y294KG1vZGVsMSwgbGFtYmRhID0gc2VxKC0yLCAyLCAwLjEpKQ0KYGBgDQoqKlbDvXNsZWRreToqKg0KDQotICoqTmFqdnnFocWhw60gYm9kKioga3Jpdmt5IGplIHByaWJsacW+bmUgcHJpICoqzrsg4omIIOKAkzAsMDUuKioNCg0KVG8gem5hbWVuw6EsIMW+ZSBwcsOhdmUgdMOhdG8gdHJhbnNmb3Jtw6FjaWEgKipuYWp2aWFjIHpsZXDFoXVqZSoqIHZsYXN0bm9zdGkgbW9kZWx1Lg0KDQotIDk1JSBpbnRlcnZhbG92w6EgcMOhc2thIHVrYXp1amUgcm96c2FoIM67LCBrdG9yw6kgc8O6ICoqxaF0YXRpc3RpY2t5IHByaWphdGXEvm7DqSAtPiBncmFmIGp1IHByZXTDrW5hIHYgYm9kb2NoIM67IOKJiCDigJMwLDYgYSDOuyDiiYggMCw0NS4qKg0KDQpUbyB6bmFtZW7DoSwgxb5lIHbFoWV0a3kgaG9kbm90eSAqKs67IHYgcm96bWVkesOtIOKAkzAsNiBhxb4gMCw0NSBzw7ogYWtjZXB0b3ZhdGXEvm7DqSoqLCBhbGUgKipuYWpsZXDFocOtIChvcHRpbcOhbG55KSBqZSDOuyDiiYgg4oCTMCwwNS4qKg0KDQpQcmV0b8W+ZSBvcHRpbcOhbG55ICoqzrsgamUgYmzDrXprbyBudWxlKiosIHpuYW1lbsOhIHRvLCDFvmUgKip0ZXBsb3RhIHRha21lciBuZXBvdHJlYnVqZSB0cmFuc2Zvcm3DoWNpdSoqLiBTcHLDoXZhbmllIHRlcGxvdHkgdiBkw6F0YWNoIGplIHRha21lciBsaW5lw6FybmUgYSBzdGFiaWxuw6ksIHRha8W+ZSBCb3gtQ294IG5lcG90dnJkaWwgcG90cmVidSB6w6FzYWRuZWogdHJhbnNmb3Jtw6FjaWUuDQoNCiMjIFrDoXZlcg0KDQpDaWXEvm9tIGFuYWzDvXp5IGJvbG8gcHJlc2vDum1hxaUsICoqYWtvIHbDvXpuYW1uw6kgbWV0ZW9yb2xvZ2lja8OpIHByZW1lbm7DqSBvdnBseXbFiHVqw7ogcHJpZW1lcm7DuiBqw7psb3bDuiB0ZXBsb3R1IHYgT3NsZSoqIGEgKipha8OhIMWhcGVjaWZpa8OhY2lhIG1vZGVsdSBqdSBuYWpsZXDFoWllIHZ5c3RpaHVqZSoqLiANCg0KKipMaW5lw6FybmEgcmVncmVzaWEqKiBwb3R2cmRpbGEgbmFqdsO9em5hbW5lasWhw60gdnBseXYgKip2bGhrb3N0aSB2emR1Y2h1LCBhdG1vc2bDqXJpY2vDqWhvIHRsYWt1IGEgc2xuZcSNbsOpaG8gc3ZpdHUqKiwgcHJpxI1vbSBkaWFnbm9zdGlja8OpIHRlc3R5IHBvdHZyZGlsaSBwcmltZXJhbsO6IMWhcGVjaWZpa8OhY2l1IG1vZGVsdSBhIG5vcm1hbGl0dSByZXrDrWR1w60uIA0KDQoqKlJvesWhw61yZW5pZSBtb2RlbHUgbyBrdmFkcmF0aWNrw6kgxI1sZW55KiogdsO9em5hbW5lIHpsZXDFoWlsbyBqZWhvIGt2YWxpdHUsIG5ham3DpCB2xI9ha2EgemFjaHl0ZW5pdSBuZWxpbmXDoXJueWNoIGVmZWt0b3YgKipnbG9iw6FsbmVobyDFvmlhcmVuaWEsIHpyw6HFvm9rIGEgc2xuZcSNbsOpaG8gc3ZpdHUqKi4gDQoNCioqQm94LUNveCB0cmFuc2Zvcm3DoWNpYSoqIHVrw6F6YWxhLCDFvmUgb3B0aW3DoWxuYSBob2Rub3RhICoqzrsgamUgYmzDrXprYSBudWxlKiosIMSNbyB6bmFtZW7DoSwgxb5lICoqdGVwbG90YSBuZXZ5xb5hZHVqZSB0cmFuc2Zvcm3DoWNpdSoqIGEgZMOhdGEgc8O6IHZob2Ruw6kgcHJlIGxpbmXDoXJuZSBtb2RlbG92YW5pZS4gDQoNClbDvXNsZWRreSB0YWsgcG90dnJkenVqw7osIMW+ZSAqKnRlcGxvdHUgbmFqdmlhYyBvdnBseXbFiHVqZSBrb21iaW7DoWNpYSB2bGhrb3N0aSwgdGxha3UgYSBzbG5lxI1uw71jaCBob2TDrW4qKiBhIMW+ZSBqZWogc3Byw6F2YW5pZSBtb8W+bm8gc3BvxL5haGxpdm8gdnlzdmV0bGnFpSBsaW5lw6FybnltIG1vZGVsb20gZG9wbG5lbsO9bSBvIGvEvsO6xI1vdsOpIG5lbGluZcOhcm5lIGVmZWt0eS4NCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==