travel <- data[, c("Destination",
"Duration..days.",
"Accommodation.cost",
"Transportation.cost")]
travel
NA

Lineárna regresia

model <- lm(Accommodation.cost ~ Duration..days. + Transportation.cost,
data = travel)

summary(model)

Call:
lm(formula = Accommodation.cost ~ Duration..days. + Transportation.cost, 
    data = travel)

Residuals:
    Min      1Q  Median      3Q     Max 
-2252.8  -480.5    32.0   464.9  4139.7 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)          908.5591   347.5818   2.614  0.00998 ** 
Duration..days.     -107.5141    43.5656  -2.468  0.01486 *  
Transportation.cost    1.8029     0.1197  15.057  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 813.1 on 133 degrees of freedom
  (1 observation deleted due to missingness)
Multiple R-squared:  0.6365,    Adjusted R-squared:  0.6311 
F-statistic: 116.5 on 2 and 133 DF,  p-value: < 2.2e-16

V modeli sme sa zamerali na vysvetlenie nákladov na ubytovanie (Accommodation cost) na základe: dĺžky pobytu (Duration days) nákladov na dopravu (Transportation cost). Regresný model skúma, ako počet dní pobytu a cena dopravy ovplyvňujú cenu ubytovania v rôznych destináciách. Model má dobrú vysvetľovaciu silu — približne 64 % variability v cenách ubytovania dokáže vysvetliť pomocou týchto dvoch premenných. Cena dopravy má silný pozitívny vplyv na cenu ubytovania. To znamená, že čím je doprava do destinácie drahšia, tým býva drahšie aj samotné ubytovanie. Zároveň ide o štatisticky veľmi významný vzťah. Počet dní pobytu má naopak negatívny vplyv na cenu ubytovania. Pri dlhších pobytoch cena ubytovania klesá, čo môže odrážať zľavy za dlhšie pobyty alebo lacnejšie destinácie pri dlhých cestách. Obe premenné spolu významne predpovedajú cenu ubytovania a zlepšujú presnosť modelu. Individuálne rozdiely medzi destináciami však stále spôsobujú väčšie odchýlky, čo je pri cestovných dátach bežné. Celkovo model ukazuje, že ceny ubytovania sú silno prepojené s cenou dopravy a mierne ovplyvnené dĺžkou pobytu.

Autokorelácia reziduí

res <- residuals(model)

ACF – Autokorelačná funkcia

acf(res, lag.max = 10, main = "ACF rezíduí")

Graf ukazuje, že reziduá nemajú žiadnu výraznú autokoreláciu – sú náhodné, čo znamená, že lineárna regresia je v poriadku.

Durbin–Watsonov test

dwtest(model)

    Durbin-Watson test

data:  model
DW = 1.7867, p-value = 0.09688
alternative hypothesis: true autocorrelation is greater than 0

Hodnota DW = 1.7867 je veľmi blízko k ideálnym 2.0, čo znamená, že v reziduách takmer určite nie je pozitívna autokorelácia. p-hodnota = 0.09688 je vyššia ako bežné hladiny významnosti (0.05), takže nezamietame nulovú hypotézu o neexistencii pozitívnej autokorelácie. Inými slovami, neexistujú dôkazy o tom, že by reziduá boli pozitívne autokorelované. Test aj vizuálna ACF analýza spolu potvrdzujú, že predpoklad nezávislosti rezíduí je splnený. Model teda nie je narušený systematickými chybami a môžeme ho považovať za štatisticky spoľahlivý.

Breusch–Godfrey test autokorelácie

bgtest(model, order = 1)   

    Breusch-Godfrey test for serial correlation of order up to 1

data:  model
LM test = 0.88757, df = 1, p-value = 0.3461

Hodnota LM testu = 0.88757 je veľmi nízka, čo naznačuje, že model nevykazuje žiadny výrazný problém s autokoreláciou. p-hodnota = 0.3461 je vysoko nad hladinou významnosti 0.05, takže nezamietame nulovú hypotézu o neexistencii sériovej autokorelácie. Prakticky to znamená, že reziduá nie sú autokorelované ani pri zohľadnení oneskorenia (lag = 1). Tento test je robustnejší ako Durbin–Watson, a jeho výsledok hovorí, že model nemá problém so sériovou koreláciou chýb.

Koyckova transformácia (dynamická štruktúra)

travel$Lag_accommodation <- dplyr::lag(travel$Accommodation.cost, 1)

koyck_model <- lm(Accommodation.cost ~ Duration..days. +
Transportation.cost +
Lag_accommodation,
data = travel)

summary(koyck_model)

Call:
lm(formula = Accommodation.cost ~ Duration..days. + Transportation.cost + 
    Lag_accommodation, data = travel)

Residuals:
    Min      1Q  Median      3Q     Max 
-2351.6  -448.3     4.0   414.8  3440.0 

Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)          782.9046   333.2982   2.349 0.020321 *  
Duration..days.     -106.4346    41.5506  -2.562 0.011552 *  
Transportation.cost    1.5221     0.1347  11.297  < 2e-16 ***
Lag_accommodation      0.2478     0.0632   3.921 0.000141 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 775.1 on 131 degrees of freedom
  (2 observations deleted due to missingness)
Multiple R-squared:  0.6747,    Adjusted R-squared:  0.6672 
F-statistic: 90.57 on 3 and 131 DF,  p-value: < 2.2e-16

Model má vyššiu vysvetľovaciu silu než pôvodný – R² sa zvýšilo na 0.6747, teda model teraz vysvetľuje takmer 67,5 % variability cien ubytovania. Residual standard error klesol z ~813 na ~775, čo znamená, že predikcie modelu sú presnejšie. Premenná Duration days zostáva negatívna a významná, čo znamená, že dlhšie pobyty sú spojené s nižšími nákladmi na ubytovanie, pravdepodobne kvôli zľavám alebo výberu lacnejších lokalít pri dlhších pobytoch. Transportation cost je stále silne pozitívny a vysoko štatisticky významný — drahšia doprava znamená drahšie destinácie aj z pohľadu ubytovania. Nová premenná Lag_accommodation má kladný a významný koeficient (0.2478, p < 0.001), čo znamená, že predošlé ceny ubytovania súvisia s aktuálnymi cenami (ak sa predchádzajúce ubytovanie zvýši o 100 €, aktuálna cena vzrastie v priemere o 24,8 €.) Toto správanie naznačuje, že v dátach existuje čiastočná časová stabilita alebo trend, takže ceny ubytovania majú určitú zotrvačnosť. Všetky tri premenné sú štatisticky významné, takže každá z nich prispieva k zlepšeniu modelu. Intercept je takisto významný, čo znamená, že aj po vplyve všetkých premenných existuje systematická základná úroveň cien. Celkovo tento model lepšie vystihuje správanie cien ubytovania a eliminuje časovú závislosť, ktorá mohla byť skrytá v reziduách.

Vizualizácia modelu

travel_clean <- na.omit(travel)
model <- lm(Accommodation.cost ~ Duration..days. + Transportation.cost + Lag_accommodation, data = travel_clean)
travel_clean$fitted <- fitted(model)



ggplot(travel, aes(x = Duration..days., y = Accommodation.cost)) +
geom_point(color="steelblue", size=2) +
geom_smooth(method="lm", se=FALSE, color="red") +
theme_minimal() +
labs(title="Regresia: Ubytovanie vs. Dĺžka pobytu",
x="Duration (days)",
y="Accommodation cost")

Vidíme, že s rastúcou dĺžkou pobytu rastú aj náklady na ubytovanie. Čiara rastie smerom nahor, čo potvrdzuje pozitívny vzťah medzi počtom dní a celkovou cenou ubytovania.

This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

plot(cars)
Add a new chunk by clicking the *Insert Chunk* button on the toolbar or by pressing *Ctrl+Alt+I*.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the *Preview* button or press *Ctrl+Shift+K* to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike *Knit*, *Preview* does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.
LS0tCnRpdGxlOiAiRWNvbm9tZXRyaWNzIGluIFIg4oCTIGFwbGlrw6FjaWEgbmEgdmxhc3Ruw6kgZMOhdGEiCm91dHB1dDogaHRtbF9ub3RlYm9vawphdXRob3I6ICJCYXJib3JhIENhcGVrb3bDoSIKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpsaWJyYXJ5KHpvbykKbGlicmFyeSh0c2VyaWVzKQpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShzYW5kd2ljaCkKbGlicmFyeShjYXIpCmxpYnJhcnkoZ2dwbG90MikKcm0obGlzdD1scygpKQoKZGF0YSA8LSByZWFkLmNzdigiVHJhdmVsX2RhdGEuY3N2Iiwgc2VwID0gIjsiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCmBgYAoKYGBge3J9CnRyYXZlbCA8LSBkYXRhWywgYygiRGVzdGluYXRpb24iLAoiRHVyYXRpb24uLmRheXMuIiwKIkFjY29tbW9kYXRpb24uY29zdCIsCiJUcmFuc3BvcnRhdGlvbi5jb3N0IildCnRyYXZlbAoKYGBgCiMgTGluZcOhcm5hIHJlZ3Jlc2lhCmBgYHtyfQptb2RlbCA8LSBsbShBY2NvbW1vZGF0aW9uLmNvc3QgfiBEdXJhdGlvbi4uZGF5cy4gKyBUcmFuc3BvcnRhdGlvbi5jb3N0LApkYXRhID0gdHJhdmVsKQoKc3VtbWFyeShtb2RlbCkKYGBgClYgbW9kZWxpIHNtZSBzYSB6YW1lcmFsaSBuYSB2eXN2ZXRsZW5pZSBuw6FrbGFkb3YgbmEgdWJ5dG92YW5pZSAoQWNjb21tb2RhdGlvbiBjb3N0KSBuYSB6w6FrbGFkZToKZMS6xb5reSBwb2J5dHUgKER1cmF0aW9uIGRheXMpIG7DoWtsYWRvdiBuYSBkb3ByYXZ1IChUcmFuc3BvcnRhdGlvbiBjb3N0KS4gUmVncmVzbsO9IG1vZGVsIHNrw7ptYSwgYWtvIHBvxI1ldCBkbsOtIHBvYnl0dSBhIGNlbmEgZG9wcmF2eSBvdnBseXbFiHVqw7ogY2VudSB1Ynl0b3ZhbmlhIHYgcsO0em55Y2ggZGVzdGluw6FjacOhY2guIE1vZGVsIG3DoSBkb2Jyw7ogdnlzdmV0xL5vdmFjaXUgc2lsdSDigJQgcHJpYmxpxb5uZSA2NCAlIHZhcmlhYmlsaXR5IHYgY2Vuw6FjaCB1Ynl0b3ZhbmlhIGRva8Ohxb5lIHZ5c3ZldGxpxaUgcG9tb2NvdSB0w71jaHRvIGR2b2NoIHByZW1lbm7DvWNoLiBDZW5hIGRvcHJhdnkgbcOhIHNpbG7DvSBwb3ppdMOtdm55IHZwbHl2IG5hIGNlbnUgdWJ5dG92YW5pYS4gVG8gem5hbWVuw6EsIMW+ZSDEjcOtbSBqZSBkb3ByYXZhIGRvIGRlc3RpbsOhY2llIGRyYWjFoWlhLCB0w71tIGLDvXZhIGRyYWjFoWllIGFqIHNhbW90bsOpIHVieXRvdmFuaWUuIFrDoXJvdmXFiCBpZGUgbyDFoXRhdGlzdGlja3kgdmXEvm1pIHbDvXpuYW1uw70gdnrFpWFoLiBQb8SNZXQgZG7DrSBwb2J5dHUgbcOhIG5hb3BhayBuZWdhdMOtdm55IHZwbHl2IG5hIGNlbnUgdWJ5dG92YW5pYS4gUHJpIGRsaMWhw61jaCBwb2J5dG9jaCBjZW5hIHVieXRvdmFuaWEga2xlc8OhLCDEjW8gbcO0xb5lIG9kcsOhxb5hxaUgesS+YXZ5IHphIGRsaMWhaWUgcG9ieXR5IGFsZWJvIGxhY25lasWhaWUgZGVzdGluw6FjaWUgcHJpIGRsaMO9Y2ggY2VzdMOhY2guIE9iZSBwcmVtZW5uw6kgc3BvbHUgdsO9em5hbW5lIHByZWRwb3ZlZGFqw7ogY2VudSB1Ynl0b3ZhbmlhIGEgemxlcMWhdWrDuiBwcmVzbm9zxaUgbW9kZWx1LgpJbmRpdmlkdcOhbG5lIHJvemRpZWx5IG1lZHppIGRlc3RpbsOhY2lhbWkgdsWhYWsgc3TDoWxlIHNww7Rzb2J1asO6IHbDpMSNxaFpZSBvZGNow71sa3ksIMSNbyBqZSBwcmkgY2VzdG92bsO9Y2ggZMOhdGFjaCBiZcW+bsOpLgpDZWxrb3ZvIG1vZGVsIHVrYXp1amUsIMW+ZSBjZW55IHVieXRvdmFuaWEgc8O6IHNpbG5vIHByZXBvamVuw6kgcyBjZW5vdSBkb3ByYXZ5IGEgbWllcm5lIG92cGx5dm5lbsOpIGTEusW+a291IHBvYnl0dS4KCiMgQXV0b2tvcmVsw6FjaWEgcmV6aWR1w60KYGBge3J9CnJlcyA8LSByZXNpZHVhbHMobW9kZWwpCmBgYAojIyBBQ0Yg4oCTIEF1dG9rb3JlbGHEjW7DoSBmdW5rY2lhCmBgYHtyfQphY2YocmVzLCBsYWcubWF4ID0gMTAsIG1haW4gPSAiQUNGIHJlesOtZHXDrSIpCmBgYApHcmFmIHVrYXp1amUsIMW+ZSByZXppZHXDoSBuZW1hasO6IMW+aWFkbnUgdsO9cmF6bsO6IGF1dG9rb3JlbMOhY2l1IOKAkyBzw7ogbsOhaG9kbsOpLCDEjW8gem5hbWVuw6EsIMW+ZSBsaW5lw6FybmEgcmVncmVzaWEgamUgdiBwb3JpYWRrdS4KCiMjIER1cmJpbuKAk1dhdHNvbm92IHRlc3QKYGBge3J9CmR3dGVzdChtb2RlbCkKYGBgCkhvZG5vdGEgRFcgPSAxLjc4NjcgamUgdmXEvm1pIGJsw616a28gayBpZGXDoWxueW0gMi4wLCDEjW8gem5hbWVuw6EsIMW+ZSB2IHJlemlkdcOhY2ggdGFrbWVyIHVyxI1pdGUgbmllIGplIHBveml0w612bmEgYXV0b2tvcmVsw6FjaWEuCnAtaG9kbm90YSA9IDAuMDk2ODggamUgdnnFocWhaWEgYWtvIGJlxb5uw6kgaGxhZGlueSB2w716bmFtbm9zdGkgKDAuMDUpLCB0YWvFvmUgbmV6YW1pZXRhbWUgbnVsb3bDuiBoeXBvdMOpenUgbyBuZWV4aXN0ZW5jaWkgcG96aXTDrXZuZWogYXV0b2tvcmVsw6FjaWUuCkluw71taSBzbG92YW1pLCBuZWV4aXN0dWrDuiBkw7RrYXp5IG8gdG9tLCDFvmUgYnkgcmV6aWR1w6EgYm9saSBwb3ppdMOtdm5lIGF1dG9rb3JlbG92YW7DqS4gVGVzdCBhaiB2aXp1w6FsbmEgQUNGIGFuYWzDvXphIHNwb2x1IHBvdHZyZHp1asO6LCDFvmUgcHJlZHBva2xhZCBuZXrDoXZpc2xvc3RpIHJlesOtZHXDrSBqZSBzcGxuZW7DvS4gTW9kZWwgdGVkYSBuaWUgamUgbmFydcWhZW7DvSBzeXN0ZW1hdGlja8O9bWkgY2h5YmFtaSBhIG3DtMW+ZW1lIGhvIHBvdmHFvm92YcWlIHphIMWhdGF0aXN0aWNreSBzcG/EvmFobGl2w70uCgojIyBCcmV1c2No4oCTR29kZnJleSB0ZXN0IGF1dG9rb3JlbMOhY2llCmBgYHtyfQpiZ3Rlc3QobW9kZWwsIG9yZGVyID0gMSkgICAKYGBgCkhvZG5vdGEgTE0gdGVzdHUgPSAwLjg4NzU3IGplIHZlxL5taSBuw616a2EsIMSNbyBuYXpuYcSNdWplLCDFvmUgbW9kZWwgbmV2eWthenVqZSDFvmlhZG55IHbDvXJhem7DvSBwcm9ibMOpbSBzIGF1dG9rb3JlbMOhY2lvdS4KcC1ob2Rub3RhID0gMC4zNDYxIGplIHZ5c29rbyBuYWQgaGxhZGlub3UgdsO9em5hbW5vc3RpIDAuMDUsIHRha8W+ZSBuZXphbWlldGFtZSBudWxvdsO6IGh5cG90w6l6dSBvIG5lZXhpc3RlbmNpaSBzw6lyaW92ZWogYXV0b2tvcmVsw6FjaWUuClByYWt0aWNreSB0byB6bmFtZW7DoSwgxb5lIHJlemlkdcOhIG5pZSBzw7ogYXV0b2tvcmVsb3ZhbsOpIGFuaSBwcmkgem9oxL5hZG5lbsOtIG9uZXNrb3JlbmlhIChsYWcgPSAxKS4gVGVudG8gdGVzdCBqZSByb2J1c3RuZWrFocOtIGFrbyBEdXJiaW7igJNXYXRzb24sIGEgamVobyB2w71zbGVkb2sgaG92b3LDrSwgxb5lIG1vZGVsIG5lbcOhIHByb2Jsw6ltIHNvIHPDqXJpb3ZvdSBrb3JlbMOhY2lvdSBjaMO9Yi4KCiMgS295Y2tvdmEgdHJhbnNmb3Jtw6FjaWEgKGR5bmFtaWNrw6EgxaF0cnVrdMO6cmEpCmBgYHtyfQp0cmF2ZWwkTGFnX2FjY29tbW9kYXRpb24gPC0gZHBseXI6OmxhZyh0cmF2ZWwkQWNjb21tb2RhdGlvbi5jb3N0LCAxKQoKa295Y2tfbW9kZWwgPC0gbG0oQWNjb21tb2RhdGlvbi5jb3N0IH4gRHVyYXRpb24uLmRheXMuICsKVHJhbnNwb3J0YXRpb24uY29zdCArCkxhZ19hY2NvbW1vZGF0aW9uLApkYXRhID0gdHJhdmVsKQoKc3VtbWFyeShrb3lja19tb2RlbCkKYGBgCk1vZGVsIG3DoSB2ecWhxaFpdSB2eXN2ZXTEvm92YWNpdSBzaWx1IG5lxb4gcMO0dm9kbsO9IOKAkyBSwrIgc2EgenbDvcWhaWxvIG5hIDAuNjc0NywgdGVkYSBtb2RlbCB0ZXJheiB2eXN2ZXTEvnVqZSB0YWttZXIgNjcsNSAlIHZhcmlhYmlsaXR5IGNpZW4gdWJ5dG92YW5pYS4gUmVzaWR1YWwgc3RhbmRhcmQgZXJyb3Iga2xlc29sIHogfjgxMyBuYSB+Nzc1LCDEjW8gem5hbWVuw6EsIMW+ZSBwcmVkaWtjaWUgbW9kZWx1IHPDuiBwcmVzbmVqxaFpZS4gUHJlbWVubsOhIER1cmF0aW9uIGRheXMgem9zdMOhdmEgbmVnYXTDrXZuYSBhIHbDvXpuYW1uw6EsIMSNbyB6bmFtZW7DoSwgxb5lIGRsaMWhaWUgcG9ieXR5IHPDuiBzcG9qZW7DqSBzIG5pxb7FocOtbWkgbsOha2xhZG1pIG5hIHVieXRvdmFuaWUsIHByYXZkZXBvZG9ibmUga3bDtGxpIHrEvmF2w6FtIGFsZWJvIHbDvWJlcnUgbGFjbmVqxaHDrWNoIGxva2Fsw610IHByaSBkbGjFocOtY2ggcG9ieXRvY2guIFRyYW5zcG9ydGF0aW9uIGNvc3QgamUgc3TDoWxlIHNpbG5lIHBveml0w612bnkgYSB2eXNva28gxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70g4oCUIGRyYWjFoWlhIGRvcHJhdmEgem5hbWVuw6EgZHJhaMWhaWUgZGVzdGluw6FjaWUgYWogeiBwb2jEvmFkdSB1Ynl0b3ZhbmlhLiBOb3bDoSBwcmVtZW5uw6EgTGFnX2FjY29tbW9kYXRpb24gbcOhIGtsYWRuw70gYSB2w716bmFtbsO9IGtvZWZpY2llbnQgKDAuMjQ3OCwgcCA8IDAuMDAxKSwgxI1vIHpuYW1lbsOhLCDFvmUgcHJlZG/FoWzDqSBjZW55IHVieXRvdmFuaWEgc8O6dmlzaWEgcyBha3R1w6FsbnltaSBjZW5hbWkgKGFrIHNhIHByZWRjaMOhZHphasO6Y2UgdWJ5dG92YW5pZSB6dsO9xaFpIG8gMTAwIOKCrCwgYWt0dcOhbG5hIGNlbmEgdnpyYXN0aWUgdiBwcmllbWVyZSBvIDI0LDgg4oKsLikgVG90byBzcHLDoXZhbmllIG5hem5hxI11amUsIMW+ZSB2IGTDoXRhY2ggZXhpc3R1amUgxI1pYXN0b8SNbsOhIMSNYXNvdsOhIHN0YWJpbGl0YSBhbGVibyB0cmVuZCwgdGFrxb5lIGNlbnkgdWJ5dG92YW5pYSBtYWrDuiB1csSNaXTDuiB6b3RydmHEjW5vc8WlLiBWxaFldGt5IHRyaSBwcmVtZW5uw6kgc8O6IMWhdGF0aXN0aWNreSB2w716bmFtbsOpLCB0YWvFvmUga2HFvmTDoSB6IG5pY2ggcHJpc3BpZXZhIGsgemxlcMWhZW5pdSBtb2RlbHUuIEludGVyY2VwdCBqZSB0YWtpc3RvIHbDvXpuYW1uw70sIMSNbyB6bmFtZW7DoSwgxb5lIGFqIHBvIHZwbHl2ZSB2xaFldGvDvWNoIHByZW1lbm7DvWNoIGV4aXN0dWplIHN5c3RlbWF0aWNrw6EgesOha2xhZG7DoSDDunJvdmXFiCBjaWVuLiBDZWxrb3ZvIHRlbnRvIG1vZGVsIGxlcMWhaWUgdnlzdGlodWplIHNwcsOhdmFuaWUgY2llbiB1Ynl0b3ZhbmlhIGEgZWxpbWludWplIMSNYXNvdsO6IHrDoXZpc2xvc8WlLCBrdG9yw6EgbW9obGEgYnnFpSBza3J5dMOhIHYgcmV6aWR1w6FjaC4KCiMgVml6dWFsaXrDoWNpYSBtb2RlbHUKYGBge3J9CnRyYXZlbF9jbGVhbiA8LSBuYS5vbWl0KHRyYXZlbCkKbW9kZWwgPC0gbG0oQWNjb21tb2RhdGlvbi5jb3N0IH4gRHVyYXRpb24uLmRheXMuICsgVHJhbnNwb3J0YXRpb24uY29zdCArIExhZ19hY2NvbW1vZGF0aW9uLCBkYXRhID0gdHJhdmVsX2NsZWFuKQp0cmF2ZWxfY2xlYW4kZml0dGVkIDwtIGZpdHRlZChtb2RlbCkKCmdncGxvdCh0cmF2ZWwsIGFlcyh4ID0gRHVyYXRpb24uLmRheXMuLCB5ID0gQWNjb21tb2RhdGlvbi5jb3N0KSkgKwpnZW9tX3BvaW50KGNvbG9yPSJzdGVlbGJsdWUiLCBzaXplPTIpICsKZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIHNlPUZBTFNFLCBjb2xvcj0icmVkIikgKwp0aGVtZV9taW5pbWFsKCkgKwpsYWJzKHRpdGxlPSJSZWdyZXNpYTogVWJ5dG92YW5pZSB2cy4gRMS6xb5rYSBwb2J5dHUiLAp4PSJEdXJhdGlvbiAoZGF5cykiLAp5PSJBY2NvbW1vZGF0aW9uIGNvc3QiKQpgYGAKVmlkw61tZSwgxb5lIHMgcmFzdMO6Y291IGTEusW+a291IHBvYnl0dSByYXN0w7ogYWogbsOha2xhZHkgbmEgdWJ5dG92YW5pZS4gxIxpYXJhIHJhc3RpZSBzbWVyb20gbmFob3IsIMSNbyBwb3R2cmR6dWplIHBveml0w612bnkgdnrFpWFoIG1lZHppIHBvxI10b20gZG7DrSBhIGNlbGtvdm91IGNlbm91IHVieXRvdmFuaWEuCgoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ3RybCtTaGlmdCtFbnRlciouIAoKYGBge3J9CnBsb3QoY2FycykKQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkN0cmwrQWx0K0kqLgoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDdHJsK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuCgpUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuCg==