Ú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.
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.

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.

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.

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.

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.

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
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
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.
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==