## Warning: pakiet 'CVXR' został zbudowany w wersji R 4.4.2
## Warning: pakiet 'AER' został zbudowany w wersji R 4.4.2
## Warning: pakiet 'WRTDStidal' został zbudowany w wersji R 4.4.2
## Warning: pakiet 'tidyverse' został zbudowany w wersji R 4.4.2
## Warning: pakiet 'lubridate' został zbudowany w wersji R 4.4.2
## Warning: pakiet 'kableExtra' został zbudowany w wersji R 4.4.2
## Warning: pakiet 'PogromcyDanych' został zbudowany w wersji R 4.4.2
## Warning: pakiet 'SmarterPoland' został zbudowany w wersji R 4.4.2
## Warning: pakiet 'httr' został zbudowany w wersji R 4.4.2

Dlaczego kwantylowa?

Dlaczego potrzebujemy regresji kwantylowej (QR)?

W szczególności, QR:

  • jest odporna na punkty odstające i wpływowe

  • nie zakłada stałej wariancji (znanej jako homoskedastyczność) dla zmiennej odpowiedzi lub reszt

  • nie zakłada normalności ale główną zaletą QR w porównaniu z regresją liniową (LR) jest to, że QR bada różne wartości zmiennej odpowiedzi, a nie tylko średnią, i dostarcza w związku z tym pełniejszego obrazu związków między zmiennymi!

Wprowadzenie

Regresja kwantylowa (ang. quantile regression) została zaproponowana przez Koenkera i Bassetta (1978). Szczególny przypadek regresji kwantylowej dla kwantyla rzędu 0,5 (czyli mediany) jest równoważny estymatorowi LAD (ang. Least Absolute Deviation) – minimalizuje sumę bezwzględnych błędów.
Wprowadzenie różnych kwantyli regresji daje pełniejszy opis rozkładów warunkowych zwłaszcza w przypadku rozkładów asymetrycznych lub uciętych.

Regresja kwantylowa jest kolejną wariacją na temat najmniejszych kwadratów . Stratą jest współczynnik \(l_1\) funkcji:

\[ \phi(u) = \tau\max(u,0) - (1-\tau)\max(-u,0) = \frac{1}{2}|u| + \left(\tau - \frac{1}{2}\right)u, \]

gdzie \(\tau \in (0,1)\) oznacza konkretny kwantyl. Problemem jak poprzednio jest minimalizacja całkowitej straty resztowej. Model ten jest powszechnie stosowany w ekologii, ochronie zdrowia i innych dziedzinach, gdzie sama średnia nie wystarcza do uchwycenia złożonych zależności między zmiennymi.

Wymagania

Wymagana jest jedna liczbowa zmienna zależna. Zmienna przewidywana musi być zmienną ilościową. Predyktory mogą być zmiennymi ilościowymi lub sztucznymi zmiennymi w przypadku predyktorów jakościowych. Aby można było uruchomić analizę, wymagany jest wyraz wolny lub co najmniej jeden predyktor.

Regresja kwantylowa nie czyni założeń dotyczących rozkładu zmiennej przewidywanej i jest odporna na wpływ obserwacji odstających.

Analiza kwantylowa jest pokrewna regresji metodą najmniejszych kwadratów.

Przykład 1.

Wykorzystamy przykład z pakietu quantreg.

Jaki jest związek między całkowitym dochodem gospodarstwa domowego a odsetkiem dochodów wydatkowanych na żywność? Prawo Engela w ekonomii głosi, że w miarę wzrostu dochodów, część dochodów wydatkowanych na żywność spada, nawet jeśli wydatki na żywność bezwzględnie rosną. Stosując regresję kwantylową do tych danych, można określić, jakie wydatki na żywność ponosi 90% rodzin (dla 100 rodzin z danym dochodem), gdy nie interesują nas średnie wydatki na żywność.

Dane, które wykorzystamy - to zbiór “engel” - dane dotyczące wydatków na żywność. Jest to zbiór danych regresyjnych składający się z 235 obserwacji dotyczących dochodów i wydatków na żywność dla belgijskich gospodarstw domowych klasy robotniczej.

Powyższy wykres przedstawia dopasowanie regresji kwantylowej dla \(\tau = (0.1, 0.25, 0.5, 0.75, 0.90, 0.95)\). Dopasowanie KMNK to gruba czarna linia.

Poniżej znajduje się tabela z oszacowanymi współczynnikami.

knitr::kable(fits, format = "html", caption = "Oszacowania z KMNK oraz `quantreg`") %>%
    kable_styling("striped") %>%
    column_spec(1:8, background = "#ececec")
Oszacowania z KMNK oraz quantreg
OLS \(\tau_{0.10}\) \(\tau_{0.25}\) \(\tau_{0.50}\) \(\tau_{0.75}\) \(\tau_{0.90}\) \(\tau_{0.95}\)
(Intercept) 147.4753885 110.1415742 95.4835396 81.4822474 62.3965855 67.3508721 64.1039632
income 0.4851784 0.4017658 0.4741032 0.5601806 0.6440141 0.6862995 0.7090685

Ok, możemy to zrobić bardziej przejrzyście i sformatować w ładnej tabeli wyników:

## 
## Wyniki regresji kwantylowych
## ==========================================
##                   Dependent variable:     
##              -----------------------------
##                         foodexp           
##                 (1)       (2)       (3)   
## ------------------------------------------
## income       0.474***  0.560***  0.644*** 
##               (0.029)   (0.028)   (0.023) 
##                                           
## Constant     95.484*** 81.482*** 62.397***
##              (21.392)  (19.251)  (16.305) 
##                                           
## ------------------------------------------
## Observations    235       235       235   
## ==========================================
## Note:          *p<0.1; **p<0.05; ***p<0.01

Finalnie, zaprezentujmy wyłącznie te 3 modele na wykresie:

Przykład 2.

Tutaj przeprowadzimy testy użycia pakietu quantreg, wykorzystując wbudowany zbiór danych “mtcars”. Zmienna “mpg” oznacza spalanie samochodów (mile/galon).

Zamodulejmy zależność regresyjną dla tej zmiennej od kilku predyktorów.

Najpierw oszacujmy regresję KMNK:

kmnk <- lm(mpg ~ disp + hp + factor(am) + factor(vs), data = mtcars)
summary(kmnk)
## 
## Call:
## lm(formula = mpg ~ disp + hp + factor(am) + factor(vs), data = mtcars)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.7981 -1.9532  0.0111  1.5665  5.6321 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 24.832119   2.890418   8.591 3.32e-09 ***
## disp        -0.008304   0.010087  -0.823  0.41757    
## hp          -0.037623   0.013846  -2.717  0.01135 *  
## factor(am)1  4.419257   1.493243   2.960  0.00634 ** 
## factor(vs)1  2.052472   1.627096   1.261  0.21794    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.812 on 27 degrees of freedom
## Multiple R-squared:  0.8104, Adjusted R-squared:  0.7823 
## F-statistic: 28.85 on 4 and 27 DF,  p-value: 2.13e-09

Teraz oszacujmy warunkowe regresje kwantylowe na różnych kwantylach, błąd standardowy uzyskany przez bootstrap.

Zauważ, że istnieje gradient we współczynnikach kwantylowych hp, jak również disp. Znak disp odwraca się, również współczynnik na czynniku am jest różny w zależności od kwantyli:

kwantyle <- c(0.25, 0.50, 0.75)
reg_kwantylowa <- rq(mpg ~ disp + hp + factor(am),tau = kwantyle,data = mtcars)
summary(reg_kwantylowa, se = "boot")
## 
## Call: rq(formula = mpg ~ disp + hp + factor(am), tau = kwantyle, data = mtcars)
## 
## tau: [1] 0.25
## 
## Coefficients:
##             Value    Std. Error t value  Pr(>|t|)
## (Intercept) 25.34665  1.56854   16.15940  0.00000
## disp        -0.02441  0.00726   -3.36018  0.00226
## hp          -0.01672  0.01525   -1.09584  0.28248
## factor(am)1  1.39719  1.31397    1.06334  0.29671
## 
## Call: rq(formula = mpg ~ disp + hp + factor(am), tau = kwantyle, data = mtcars)
## 
## tau: [1] 0.5
## 
## Coefficients:
##             Value    Std. Error t value  Pr(>|t|)
## (Intercept) 27.49722  1.90569   14.42904  0.00000
## disp        -0.02253  0.01620   -1.39050  0.17533
## hp          -0.02713  0.02537   -1.06954  0.29396
## factor(am)1  3.37328  2.09446    1.61058  0.11849
## 
## Call: rq(formula = mpg ~ disp + hp + factor(am), tau = kwantyle, data = mtcars)
## 
## tau: [1] 0.75
## 
## Coefficients:
##             Value    Std. Error t value  Pr(>|t|)
## (Intercept) 28.06384  1.71600   16.35419  0.00000
## disp         0.00445  0.01353    0.32899  0.74461
## hp          -0.06662  0.01672   -3.98496  0.00044
## factor(am)1  7.91402  2.49779    3.16840  0.00369

Testy współczynników

Użyjemy funkcji rq.anova z pakietu regresji kwantylowej, aby przeprowadzić test WALDA. Pamiętaj, że test WALDA mówi, że biorąc pod uwagę nieograniczone oszacowania modelu, przetestujemy hipotezę zerową mówiącą, że współczynniki spełniają pewne liniowe ograniczenia.

Aby ją przetestować, użyjemy obiektu zwróconego z uruchomienia rq z różnymi liczbami kwantyli i ustawimy opcję joint na true lub false. Gdy joint jest true: “równość współczynników kierunkowych powinna być wykonana jako wspólne testy na wszystkich parametrach nachylenia”, gdy joint jest false: “należy zgłaszać oddzielne testy na każdym z parametrów nachylenia”.

Zauważ, że testy kwantylowe są testami “linii równoległej”. Oznacza to, że powinniśmy wyjąć różne x-wyrazy_wolne dla każdego kwantyla, ponieważ reprezentują one poziomy rozkładów warunkowych. Jeśli jednak współczynniki kwantyli dla współczynnikow są takie same, to nie ma efektów specyficznych dla kwantyli, wystarczą efekty średnie.

Badanie statystycznej różnicy między 25. i 50. kwantylem warunkowym:

Biorąc pod uwagę powyższe oszacowania kwantyli, różnica między kwantylami 0,25 i 0,50 istnieje, ale czy są one wystarczająco duże, aby być statystycznie różne? Jaka jest wartość p? Przeglądając poniższe wyniki, nie są one statystycznie różne!

Po pierwsze, joint = TRUE. To nie jest testowanie, czy współczynnik na disp jest taki sam jak współczynnik na hp. To jest wspólne testowanie, czy współczynniki dla różnych kwantyli disp i różnych kwantyli hp są takie same dla każdej zmiennej.

kwantyle <- c(0.25, 0.50)
reg_kwantylowa <- rq(mpg ~ disp + hp + factor(am),tau = kwantyle, data = mtcars)
anova(reg_kwantylowa, test = "Wald", joint=TRUE)
## Quantile Regression Analysis of Deviance Table
## 
## Model: mpg ~ disp + hp + factor(am)
## Joint Test of Equality of Slopes: tau in {  0.25 0.5  }
## 
##   Df Resid Df F value Pr(>F)
## 1  3       61  0.8421 0.4761

Po drugie, joint = False:

anova(reg_kwantylowa, test = "Wald", joint=FALSE)
## Quantile Regression Analysis of Deviance Table
## 
## Model: mpg ~ disp + hp + factor(am)
## Tests of Equality of Distinct Slopes: tau in {  0.25 0.5  }
## 
##             Df Resid Df F value Pr(>F)
## disp         1       63  0.0305 0.8619
## hp           1       63  0.5461 0.4627
## factor(am)1  1       63  1.3500 0.2497

Badanie statystycznej różnicy między 25, 50 i 75 kwantylem warunkowym:

Pierwszy kwartyl i mediana nie wydają się być statystycznie różne, teraz dołączymy trzeci kwartyl. Jak widać wcześniej, kwartyle wspólnie wykazują gradient. Teraz możemy zobaczyć, że disp, hp i am są oddzielnie statystycznie różne.

Po pierwsze, joint = TRUE:

kwantyle <- c(0.25, 0.50, 0.75)

reg_kwantylowa <- rq(mpg ~ disp + hp + factor(am),tau = kwantyle, data = mtcars)

anova(reg_kwantylowa, test = "Wald", joint=TRUE)
## Quantile Regression Analysis of Deviance Table
## 
## Model: mpg ~ disp + hp + factor(am)
## Joint Test of Equality of Slopes: tau in {  0.25 0.5 0.75  }
## 
##   Df Resid Df F value   Pr(>F)   
## 1  6       90  3.3173 0.005367 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Po drugie, joint = False:

anova(reg_kwantylowa, test = "Wald", joint=FALSE)
## Quantile Regression Analysis of Deviance Table
## 
## Model: mpg ~ disp + hp + factor(am)
## Tests of Equality of Distinct Slopes: tau in {  0.25 0.5 0.75  }
## 
##             Df Resid Df F value   Pr(>F)   
## disp         2       94  5.4903 0.005558 **
## hp           2       94  6.7221 0.001868 **
## factor(am)1  2       94  7.2758 0.001154 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Dobroć dopasowania

Możemy obliczyć współczynniki dobroci dopasowania regresji kwantylowej z wykorzystaniem reszt i reszt bezwarunkowych:

goodfit(resid, resid_nl, tau)

Miara dobroci dopasowania dla regresji kwantylowej jest szacowana jako 1 minus stosunek sumy odchyleń bezwzględnych w modelach w pełni sparametryzowanych do sumy odchyleń bezwzględnych w zerowym (bezwarunkowym) modelu kwantylowym.

Wartości te są przydatne do porównań między modelami kwantylowymi, ale nie są porównywalne ze standardowymi współczynnikami determinacji. Te ostatnie oparte są na wariancji odchyleń kwadratowych, natomiast wartości dobroci dopasowania dla regresji kwantylowej oparte są na odchyleniach bezwzględnych. Wartości dobroci dopasowania zawsze będą mniejsze niż wartości R2.

## model kwantylowy
model1 <- rq(mpg ~ disp + hp + factor(am),tau = 0.5, data = mtcars)
reszty1 <- resid(model1)

## bezwarunkowy (pusty) model kwantylowy
model2 <- rq(mpg ~ 1, tau = 0.5,data=mtcars)
reszty2 <- resid(model2)

goodfit(reszty1, reszty2, 0.5)
## [1] 0.5403311
## r2 modelu KMNK dla porównania
model_lm <- lm(mpg ~ disp + hp + factor(am), data = mtcars)

summary(model_lm)$r.squared
## [1] 0.7992061

Zadanie

Teraz Wasza kolej ;-)

Waszym zadaniem dzisiaj jest zamodelowanie - porównanie KMNK oraz regresji kwantylowej (różno-poziomowej) dla zmiennej “earnings” - wynagrodzenia.

Dobierz i przetestuj predyktory, kwantyle dla modeli. Wykonaj testy różnic współczynnikow dla finalnych modeli.

W przypadku problemów - obejrzyj video tutorial (włącz polskie napisy) oraz wejdź na jego stronę ze źródłami. Możesz również wykorzystać w/w przykłady. # 1. Dane

data("CPSSW9298")
# ?CPSSW9298 

head(CPSSW9298)
##   year  earnings     degree gender age
## 1 1992 11.188811   bachelor   male  29
## 2 1992 10.000000   bachelor   male  33
## 3 1992  5.769231 highschool   male  30
## 4 1992 14.957265   bachelor   male  31
## 5 1992  8.660096   bachelor female  26
## 6 1992  7.788462 highschool female  31
Dane<-CPSSW9298
head(Dane)
##   year  earnings     degree gender age
## 1 1992 11.188811   bachelor   male  29
## 2 1992 10.000000   bachelor   male  33
## 3 1992  5.769231 highschool   male  30
## 4 1992 14.957265   bachelor   male  31
## 5 1992  8.660096   bachelor female  26
## 6 1992  7.788462 highschool female  31

2. Zbudowanie modelu KMNK

ols_model <- lm(earnings ~ degree + gender + age,data = Dane)
summary(Dane)
##    year         earnings             degree        gender          age       
##  1992:7590   Min.   : 1.840   highschool:7936   male  :7815   Min.   :25.00  
##  1998:5911   1st Qu.: 8.173   bachelor  :5565   female:5686   1st Qu.:27.00  
##              Median :11.538                                   Median :30.00  
##              Mean   :12.663                                   Mean   :29.71  
##              3rd Qu.:15.865                                   3rd Qu.:32.00  
##              Max.   :49.451                                   Max.   :34.00

3. Regresja kwantylowa

Dopasowanie modeli dla kwantyli: 0.25, 0.5 (mediana), 0.75

rq_25 <- rq(earnings ~ degree + age + gender, data = Dane, tau = 0.25)
rq_50 <- rq(earnings ~ degree + age + gender, data = Dane, tau = 0.5)
rq_75 <- rq(earnings ~ degree + age + gender, data = Dane, tau = 0.75)


summary(rq_25)
## 
## Call: rq(formula = earnings ~ degree + age + gender, tau = 0.25, data = Dane)
## 
## tau: [1] 0.25
## 
## Coefficients:
##                Value     Std. Error t value   Pr(>|t|) 
## (Intercept)      2.67308   0.42070    6.35386   0.00000
## degreebachelor   3.59188   0.08767   40.96855   0.00000
## age              0.17308   0.01449   11.94257   0.00000
## genderfemale    -1.32265   0.08101  -16.32612   0.00000
summary(rq_50)
## 
## Call: rq(formula = earnings ~ degree + age + gender, tau = 0.5, data = Dane)
## 
## tau: [1] 0.5
## 
## Coefficients:
##                Value     Std. Error t value   Pr(>|t|) 
## (Intercept)      1.45427   0.53081    2.73974   0.00616
## degreebachelor   4.70043   0.11477   40.95483   0.00000
## age              0.31389   0.01820   17.24663   0.00000
## genderfemale    -2.12970   0.10171  -20.93992   0.00000
summary(rq_75)
## 
## Call: rq(formula = earnings ~ degree + age + gender, tau = 0.75, data = Dane)
## 
## tau: [1] 0.75
## 
## Coefficients:
##                Value     Std. Error t value   Pr(>|t|) 
## (Intercept)      1.53846   0.66948    2.29801   0.02158
## degreebachelor   5.75962   0.15130   38.06842   0.00000
## age              0.43269   0.02271   19.05455   0.00000
## genderfemale    -2.97009   0.12769  -23.26078   0.00000

##Ogólne zależności: Efekt wykształcenia (degreebachelor):

Poszczególne wartości dla degreebachelor wskazują, że osoby z wykształceniem na poziomie licencjata (w porównaniu do grupy referencyjnej, np. osób bez wyższego wykształcenia) zarabiają istotnie więcej w każdym kwantylu (0.25, 0.5, 0.75). Wartość współczynnika wzrasta wraz z kwantylem:

τ=0.25: +3.59 τ=0.5: +4.70 τ=0.75: +5.76

Im wyższy kwantyl (czyli wyższy poziom zarobków), tym większy wpływ wykształcenia na zarobki. Efekt wieku (age):

Wiek ma pozytywny i statystycznie istotny wpływ na zarobki w każdym kwantylu. Współczynniki rosną wraz z kwantylem: τ=0.25: +0.17 τ=0.5: +0.31 τ=0.75: +0.43 Wyższe zarobki są bardziej zależne od wieku w górnych kwantylach, co może sugerować większą korzyść z doświadczenia zawodowego w lepiej płatnych grupach. Efekt płci (genderfemale):

Wartości współczynnika dla zmiennej genderfemale (w porównaniu do mężczyzn) są ujemne we wszystkich kwantylach, co wskazuje na negatywny wpływ bycia kobietą na zarobki. Efekt ten staje się bardziej wyraźny w wyższych kwantylach: 𝜏=0.25τ=0.25: -1.32𝜏=0.5τ=0.5: -2.13𝜏=0.75τ=0.75: -2.97 Różnica w zarobkach między płciami jest większa w górnych kwantylach, co może sugerować tzw. “szklany sufit” lub różnice w dostępie do lepiej płatnych stanowisk.

#Statystyczna istotność:

Wszystkie współczynniki są statystycznie istotne na poziomie 𝑝<0.05 p<0.05, co wskazuje na silne dowody dla ich wpływu na zarobki w analizowanych kwantylach. Zmiany współczynników w kwantylach:

Współczynniki różnią się między kwantylami, co podkreśla, że wpływ poszczególnych zmiennych nie jest równomierny w różnych częściach rozkładu zarobków. To jest główny cel stosowania regresji kwantylowej — analiza wpływu zmiennych w różnych punktach rozkładu.

#Wnioski końcowe: Wykształcenie jest kluczowym czynnikiem zwiększającym zarobki, szczególnie w wyższych kwantylach. Wiek ma większe znaczenie w lepiej opłacanych grupach, co sugeruje, że doświadczenie bardziej premiuje osoby o wyższych zarobkach. Płeć pozostaje istotnym czynnikiem wpływającym na zarobki, przy czym różnice na niekorzyść kobiet są większe w wyższych kwantylach.

4. Test różnic współczynników

anova(rq_25, rq_50, rq_75)
## Quantile Regression Analysis of Deviance Table
## 
## Model: earnings ~ degree + age + gender
## Joint Test of Equality of Slopes: tau in {  0.25 0.5 0.75  }
## 
##   Df Resid Df F value    Pr(>F)    
## 1  6    40497   90.65 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

#Interpretacja wyniku: Hipoteza zerowa:

Test sprawdza hipotezę zerową, że nachylenia (współczynniki regresji) dla różnych kwantyli są takie same, czyli: 𝐻0:𝛽𝜏= 0.25=𝛽𝜏=0.5=𝛽𝜏=0.75 H 0 :β τ=0.25=β τ=0.5=β τ=0.75 #Wartość p:

Wartość p wynosi <2.2x10^16, co oznacza, że różnice nachyleń są wysoce statystycznie istotne. Hipotezę zerową należy odrzucić na każdym typowym poziomie istotności (𝛼=0.05,α=0.01, etc.).

5. Wizualizacja porównania

Ekstrakcja współczynników dla różnych kwantyli

coeffs <- data.frame(
  Variable = names(coef(rq_25)),
  OLS = coef(ols_model),
  Q25 = coef(rq_25),
  Q50 = coef(rq_50),
  Q75 = coef(rq_75)
)

print(coeffs)
##                      Variable        OLS        Q25        Q50        Q75
## (Intercept)       (Intercept)  1.7047656  2.6730783  1.4542745  1.5384642
## degreebachelor degreebachelor  4.9112307  3.5918801  4.7004274  5.7596162
## genderfemale              age -2.2421722  0.1730769  0.3138889  0.4326922
## age              genderfemale  0.3324535 -1.3226488 -2.1297013 -2.9700855

#Wnioski

OLS dostarcza uśrednionego obrazu wpływu zmiennych niezależnych na zarobki, co może prowadzić do utraty ważnych informacji o różnicach między grupami (kwantylami). Regresja kwantylowa ujawnia różnice:

Wykształcenie i wiek mają większy wpływ na osoby w wyższych kwantylach (z wyższymi zarobkami). Różnice płacowe między płciami są mniejsze w dolnych kwantylach i rosną wraz z kwantylem.

Wykres współczynników

coeffs_long <- tidyr::pivot_longer(coeffs, cols = -Variable, names_to = "Model", values_to = "Coefficient")

ggplot(coeffs_long, aes(x = Variable, y = Coefficient, fill = Model)) +
  geom_bar(stat = "identity", position = "dodge") +
  theme_minimal() +
  labs(title = "Porównanie współczynników regresji KMNK i kwantylowej",
       x = "Zmienne", y = "Wartość współczynnika")

#interpretacja wykresu

  1. Wyższa wartość w Q25 oznacza, że osoby o niskich zarobkach mają względnie większe podstawowe wynagrodzenie (niezależnie od zmiennych), a w Q75 różnice są mniej znaczące.

  2. Efekt wykształcenia jest bardziej widoczny w wyższych kwantylach, co wskazuje na rosnącą wartość wykształcenia w lepiej płatnych stanowiskach.

  3. Różnice płacowe między płciami są bardziej wyraźne w grupach o wyższych zarobkach -> dla zmiennej genderfemale współczynnik jest niższy w Q25 i najbardziej negatywny w Q75

  4. Starsze osoby z grupy wysokich zarobków bardziej korzystają na swoim doświadczeniu niż te z grupy o niższych zarobkach.

cat("KMNK: Średnia wartość zmiennej earnings w zależności od predyktorów.")
## KMNK: Średnia wartość zmiennej earnings w zależności od predyktorów.
cat("Regresja kwantylowa: Zmienne mają różny wpływ w zależności od pozycji w rozkładzie earnings.")
## Regresja kwantylowa: Zmienne mają różny wpływ w zależności od pozycji w rozkładzie earnings.
LS0tDQp0aXRsZTogJ05pZWtsYXN5Y3puZSBtZXRvZHkgc3RhdHlzdHlraScNCnN1YnRpdGxlOiAnUmVncmVzamEga3dhbnR5bG93YScNCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCmF1dGhvcjogIlR3b2plIGltacSZIGkgbmF6d2lza28iDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIGhpZ2hsaWdodDogdGV4dG1hdGUNCiAgICBmb250c2l6ZTogMTBwdA0KICAgIHRvYzogeWVzDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiBubw0KICAgIGRmX3ByaW50OiBkZWZhdWx0DQogICAgdG9jX2RlcHRoOiA1DQplZGl0b3Jfb3B0aW9uczogDQogIG1hcmtkb3duOiANCiAgICB3cmFwOiA3Mg0KLS0tDQoNCmBgYHtyIHByZXJlcXMsIG1lc3NhZ2UgPSBGQUxTRSwgZWNobyA9IEZBTFNFfQ0KDQpsaWJyYXJ5KENWWFIpDQpsaWJyYXJ5KEFFUikNCmxpYnJhcnkoc3RhcmdhemVyKQ0KbGlicmFyeShXUlREU3RpZGFsKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KHF1YW50cmVnKQ0KbGlicmFyeShQb2dyb21jeURhbnljaCkNCg0KZGF0YSgiQ1BTU1c5Mjk4IikNCiMgP0NQU1NXOTI5OCANCmBgYA0KDQojIyBEbGFjemVnbyBrd2FudHlsb3dhPw0KDQpEbGFjemVnbyBwb3RyemVidWplbXkgcmVncmVzamkga3dhbnR5bG93ZWogKFFSKT8NCg0KVyBzemN6ZWfDs2xub8WbY2ksIFFSOg0KDQotICAgamVzdCBvZHBvcm5hIG5hIHB1bmt0eSBvZHN0YWrEhWNlIGkgd3DFgnl3b3dlDQoNCi0gICBuaWUgemFrxYJhZGEgc3RhxYJlaiB3YXJpYW5jamkgKHpuYW5laiBqYWtvIGhvbW9za2VkYXN0eWN6bm/Fm8SHKSBkbGENCiAgICB6bWllbm5laiBvZHBvd2llZHppIGx1YiByZXN6dA0KDQotICAgbmllIHpha8WCYWRhIG5vcm1hbG5vxZtjaSBhbGUgZ8WCw7N3bsSFIHphbGV0xIUgUVIgdyBwb3LDs3duYW5pdSB6IHJlZ3Jlc2rEhQ0KICAgIGxpbmlvd8SFIChMUikgamVzdCB0bywgxbxlIFFSIGJhZGEgcsOzxbxuZSB3YXJ0b8WbY2kgem1pZW5uZWogb2Rwb3dpZWR6aSwNCiAgICBhIG5pZSB0eWxrbyDFm3JlZG5pxIUsIGkgZG9zdGFyY3phIHcgendpxIV6a3UgeiB0eW0gcGXFgm5pZWpzemVnbyBvYnJhenUNCiAgICB6d2nEhXprw7N3IG1pxJlkenkgem1pZW5ueW1pIQ0KDQojIyBXcHJvd2FkemVuaWUNCg0KUmVncmVzamEga3dhbnR5bG93YSAoYW5nLiBxdWFudGlsZSByZWdyZXNzaW9uKSB6b3N0YcWCYSB6YXByb3Bvbm93YW5hDQpwcnpleiBLb2Vua2VyYSBpIEJhc3NldHRhICgxOTc4KS4gU3pjemVnw7NsbnkgcHJ6eXBhZGVrIHJlZ3Jlc2ppDQprd2FudHlsb3dlaiBkbGEga3dhbnR5bGEgcnrEmWR1IDAsNSAoY3p5bGkgbWVkaWFueSkgamVzdCByw7N3bm93YcW8bnkNCmVzdHltYXRvcm93aSBMQUQgKGFuZy4gTGVhc3QgQWJzb2x1dGUgRGV2aWF0aW9uKSAtLSBtaW5pbWFsaXp1amUgc3VtxJkNCmJlend6Z2zEmWRueWNoIGLFgsSZZMOzdy5cDQpXcHJvd2FkemVuaWUgcsOzxbxueWNoIGt3YW50eWxpIHJlZ3Jlc2ppIGRhamUgcGXFgm5pZWpzenkgb3BpcyByb3prxYJhZMOzdw0Kd2FydW5rb3d5Y2ggenfFgmFzemN6YSB3IHByenlwYWRrdSByb3prxYJhZMOzdyBhc3ltZXRyeWN6bnljaCBsdWIgdWNpxJl0eWNoLg0KDQpSZWdyZXNqYSBrd2FudHlsb3dhIGplc3Qga29sZWpuxIUgd2FyaWFjasSFIG5hIHRlbWF0IG5ham1uaWVqc3p5Y2gNCmt3YWRyYXTDs3cgXGNpdGVwe3F1YW50aWxlfS4gU3RyYXTEhSBqZXN0IHdzcMOzxYJjenlubmlrICRsXzEkIGZ1bmtjamk6DQoNCiQkDQogICAgXHBoaSh1KSA9IFx0YXVcbWF4KHUsMCkgLSAoMS1cdGF1KVxtYXgoLXUsMCkgPSBcZnJhY3sxfXsyfXx1fCArIFxsZWZ0KFx0YXUgLSBcZnJhY3sxfXsyfVxyaWdodCl1LA0KJCQNCg0KZ2R6aWUgJFx0YXUgXGluICgwLDEpJCBvem5hY3phIGtvbmtyZXRueSBrd2FudHlsLiBQcm9ibGVtZW0gamFrDQpwb3ByemVkbmlvIGplc3QgbWluaW1hbGl6YWNqYSBjYcWCa293aXRlaiBzdHJhdHkgcmVzenRvd2VqLiBNb2RlbCB0ZW4NCmplc3QgcG93c3plY2huaWUgc3Rvc293YW55IHcgZWtvbG9naWksIG9jaHJvbmllIHpkcm93aWEgaSBpbm55Y2gNCmR6aWVkemluYWNoLCBnZHppZSBzYW1hIMWbcmVkbmlhIG5pZSB3eXN0YXJjemEgZG8gdWNod3ljZW5pYSB6xYJvxbxvbnljaA0KemFsZcW8bm/Fm2NpIG1pxJlkenkgem1pZW5ueW1pLg0KDQojIyBXeW1hZ2FuaWENCg0KV3ltYWdhbmEgamVzdCBqZWRuYSBsaWN6Ym93YSB6bWllbm5hIHphbGXFvG5hLiBabWllbm5hIHByemV3aWR5d2FuYSBtdXNpDQpiecSHIHptaWVubsSFIGlsb8WbY2lvd8SFLiBQcmVkeWt0b3J5IG1vZ8SFIGJ5xIcgem1pZW5ueW1pIGlsb8WbY2lvd3ltaSBsdWINCnN6dHVjem55bWkgem1pZW5ueW1pIHcgcHJ6eXBhZGt1IHByZWR5a3RvcsOzdyBqYWtvxZtjaW93eWNoLiBBYnkgbW/FvG5hDQpiecWCbyB1cnVjaG9tacSHIGFuYWxpesSZLCB3eW1hZ2FueSBqZXN0IHd5cmF6IHdvbG55IGx1YiBjbyBuYWptbmllaiBqZWRlbg0KcHJlZHlrdG9yLg0KDQpSZWdyZXNqYSBrd2FudHlsb3dhIG5pZSBjenluaSB6YcWCb8W8ZcWEIGRvdHljesSFY3ljaCByb3prxYJhZHUgem1pZW5uZWoNCnByemV3aWR5d2FuZWogaSBqZXN0IG9kcG9ybmEgbmEgd3DFgnl3IG9ic2Vyd2Fjamkgb2RzdGFqxIVjeWNoLg0KDQpBbmFsaXphIGt3YW50eWxvd2EgamVzdCBwb2tyZXduYSByZWdyZXNqaSBtZXRvZMSFIG5ham1uaWVqc3p5Y2gNCmt3YWRyYXTDs3cuDQoNCiMjIFByenlrxYJhZCAxLg0KDQpXeWtvcnp5c3RhbXkgcHJ6eWvFgmFkIHogcGFraWV0dSBxdWFudHJlZy4NCg0KSmFraSBqZXN0IHp3acSFemVrIG1pxJlkenkgY2HFgmtvd2l0eW0gZG9jaG9kZW0gZ29zcG9kYXJzdHdhIGRvbW93ZWdvIGENCm9kc2V0a2llbSBkb2Nob2TDs3cgd3lkYXRrb3dhbnljaCBuYSDFvHl3bm/Fm8SHPyBQcmF3byBFbmdlbGEgdyBla29ub21paQ0KZ8WCb3NpLCDFvGUgdyBtaWFyxJkgd3pyb3N0dSBkb2Nob2TDs3csIGN6xJnFm8SHIGRvY2hvZMOzdyB3eWRhdGtvd2FueWNoIG5hDQrFvHl3bm/Fm8SHIHNwYWRhLCBuYXdldCBqZcWbbGkgd3lkYXRraSBuYSDFvHl3bm/Fm8SHIGJlend6Z2zEmWRuaWUgcm9zbsSFLg0KU3Rvc3VqxIVjIHJlZ3Jlc2rEmSBrd2FudHlsb3fEhSBkbyB0eWNoIGRhbnljaCwgbW/FvG5hIG9rcmXFm2xpxIcsIGpha2llDQp3eWRhdGtpIG5hIMW8eXdub8WbxIcgcG9ub3NpIDkwJSByb2R6aW4gKGRsYSAxMDAgcm9kemluIHogZGFueW0gZG9jaG9kZW0pLA0KZ2R5IG5pZSBpbnRlcmVzdWrEhSBuYXMgxZtyZWRuaWUgd3lkYXRraSBuYSDFvHl3bm/Fm8SHLg0KDQpEYW5lLCBrdMOzcmUgd3lrb3J6eXN0YW15IC0gdG8gemJpw7NyICJlbmdlbCIgLSBkYW5lIGRvdHljesSFY2Ugd3lkYXRrw7N3IG5hDQrFvHl3bm/Fm8SHLiBKZXN0IHRvIHpiacOzciBkYW55Y2ggcmVncmVzeWpueWNoIHNrxYJhZGFqxIVjeSBzacSZIHogMjM1DQpvYnNlcndhY2ppIGRvdHljesSFY3ljaCBkb2Nob2TDs3cgaSB3eWRhdGvDs3cgbmEgxbx5d25vxZvEhyBkbGEgYmVsZ2lqc2tpY2gNCmdvc3BvZGFyc3R3IGRvbW93eWNoIGtsYXN5IHJvYm90bmljemVqLg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZGF0YShlbmdlbCkgI2RhbmUgDQpwIDwtIGdncGxvdChkYXRhID0gZW5nZWwpICsNCiAgICBnZW9tX3BvaW50KG1hcHBpbmcgPSBhZXMoeCA9IGluY29tZSwgeSA9IGZvb2RleHApLCBjb2xvciA9ICJibHVlIikNCnRhdXMgPC0gYygwLjEsIDAuMjUsIDAuNSwgMC43NSwgMC45MCwgMC45NSkNCmZpdHMgPC0gZGF0YS5mcmFtZSgNCiAgICBjb2VmKGxtKGZvb2RleHAgfiBpbmNvbWUsIGRhdGEgPSBlbmdlbCkpLA0KICAgIHNhcHBseSh0YXVzLCBmdW5jdGlvbih4KSBjb2VmKHJxKGZvcm11bGEgPSBmb29kZXhwIH4gaW5jb21lLCBkYXRhID0gZW5nZWwsIHRhdSA9IHgpKSkpDQpuYW1lcyhmaXRzKSA8LSBjKCJPTFMiLCBzcHJpbnRmKCIkXFx0YXVfeyUwLjJmfSQiLCB0YXVzKSkNCm5mIDwtIG5jb2woZml0cykNCmNvbG9ycyA8LSBjb2xvclJhbXBQYWxldHRlKGNvbG9ycyA9IGMoImJsYWNrIiwgInJlZCIpKShuZikNCnAgPC0gcCArIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IGZpdHNbMSwgMV0sIHNsb3BlID0gZml0c1syLCAxXSwgY29sb3IgPSBjb2xvcnNbMV0sIGxpbmV3aWR0aCA9IDEuNSkNCmZvciAoaSBpbiBzZXFfbGVuKG5mKVstMV0pIHsNCiAgICBwIDwtIHAgKyBnZW9tX2FibGluZShpbnRlcmNlcHQgPSBmaXRzWzEsIGldLCBzbG9wZSA9IGZpdHNbMiwgaV0sIGNvbG9yID0gY29sb3JzW2ldKQ0KfQ0KcA0KYGBgDQoNClBvd3nFvHN6eSB3eWtyZXMgcHJ6ZWRzdGF3aWEgZG9wYXNvd2FuaWUgcmVncmVzamkga3dhbnR5bG93ZWogZGxhDQokXHRhdSA9ICgwLjEsIDAuMjUsIDAuNSwgMC43NSwgMC45MCwgMC45NSkkLiBEb3Bhc293YW5pZSBLTU5LIHRvIGdydWJhDQpjemFybmEgbGluaWEuDQoNClBvbmnFvGVqIHpuYWpkdWplIHNpxJkgdGFiZWxhIHogb3N6YWNvd2FueW1pIHdzcMOzxYJjenlubmlrYW1pLg0KDQpgYGB7cn0NCmtuaXRyOjprYWJsZShmaXRzLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSAiT3N6YWNvd2FuaWEgeiBLTU5LIG9yYXogYHF1YW50cmVnYCIpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxOjgsIGJhY2tncm91bmQgPSAiI2VjZWNlYyIpDQpgYGANCg0KT2ssIG1vxbxlbXkgdG8genJvYmnEhyBiYXJkemllaiBwcnplanJ6ecWbY2llIGkgc2Zvcm1hdG93YcSHIHcgxYJhZG5laiB0YWJlbGkNCnd5bmlrw7N3Og0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFfQ0KcTI1IDwtIHJxKGZvb2RleHAgfiBpbmNvbWUsIGRhdGEgPSBlbmdlbCwgdGF1ID0gMC4yNSkNCnE1MCA8LSBycShmb29kZXhwIH4gaW5jb21lLCBkYXRhID0gZW5nZWwsIHRhdSA9IDAuNTApDQpxNzUgPC0gcnEoZm9vZGV4cCB+IGluY29tZSwgZGF0YSA9IGVuZ2VsLCB0YXUgPSAwLjc1KQ0KDQojIFRhYmVsYSB6IHBvcsOzd25hbmllbSB3eW5pa8OzdyB0cnplY2ggbW9kZWxpOiANCg0Kc3RhcmdhemVyKHEyNSwgcTUwLCBxNzUsIHRpdGxlID0gIld5bmlraSByZWdyZXNqaSBrd2FudHlsb3d5Y2giLCB0eXBlID0gInRleHQiKQ0KYGBgDQoNCkZpbmFsbmllLCB6YXByZXplbnR1am15IHd5xYLEhWN6bmllIHRlIDMgbW9kZWxlIG5hIHd5a3Jlc2llOg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KbXlfcXIgPC0gcnEoZm9vZGV4cCB+IGluY29tZSwgZGF0YSA9IGVuZ2VsLCB0YXUgPSBzZXEoMC4yNSwgMC43NSwgMC4yNSkpDQoNCmludGVyY2VwdF9zbG9wZSA8LSBteV9xciAlPiUgDQogIGNvZWYoKSAlPiUgDQogIHQoKSAlPiUgDQogIGRhdGEuZnJhbWUoKSAlPiUgDQogIHJlbmFtZShpbnRlcmNlcHQgPSBYLkludGVyY2VwdC4sIHNsb3BlID0gaW5jb21lKSAlPiUgDQogIG11dGF0ZShxdWFudGlsZSA9IHJvdy5uYW1lcyguKSkNCg0KZ2dwbG90KCkgKyANCiAgZ2VvbV9wb2ludChkYXRhID0gZW5nZWwsIGFlcyhpbmNvbWUsIGZvb2RleHApLCBhbHBoYSA9IDAuNSkgKyANCiAgZ2VvbV9hYmxpbmUoZGF0YSA9IGludGVyY2VwdF9zbG9wZSwgYWVzKGludGVyY2VwdCA9IGludGVyY2VwdCwgc2xvcGUgPSBzbG9wZSwgY29sb3IgPSBxdWFudGlsZSkpICsgDQogIHRoZW1lX21pbmltYWwoKSArIA0KICBsYWJzKHggPSAiRG9jaMOzZCIsIHkgPSAiV3lkYXRraSBuYSDFvHl3bm/Fm8SHIiwgdGl0bGUgPSAiUmVncmVzamUga3dhbnR5bG93ZSB6IHRhdSA9IDAuMjUsIDAuNTAgb3JheiAwLjc1IiwgDQogICAgICAgY2FwdGlvbiA9ICLFuXLDs2TFgm8gZGFueWNoOiBLb2Vua2VyIGFuZCBCYXNzZXR0ICgxOTgyKSIpDQpgYGANCg0KIyMgUHJ6eWvFgmFkIDIuDQoNClR1dGFqIHByemVwcm93YWR6aW15IHRlc3R5IHXFvHljaWEgcGFraWV0dSBxdWFudHJlZywgd3lrb3J6eXN0dWrEhWMNCndidWRvd2FueSB6YmnDs3IgZGFueWNoICIqKm10Y2FycyoqIi4gWm1pZW5uYSAiKiptcGcqKiIgb3puYWN6YSBzcGFsYW5pZQ0Kc2Ftb2Nob2TDs3cgKCptaWxlL2dhbG9uKikuDQoNClphbW9kdWxlam15IHphbGXFvG5vxZvEhyByZWdyZXN5am7EhSBkbGEgdGVqIHptaWVubmVqIG9kIGtpbGt1IHByZWR5a3RvcsOzdy4NCg0KTmFqcGllcncgb3N6YWN1am15IHJlZ3Jlc2rEmSBLTU5LOg0KDQpgYGB7cn0NCmttbmsgPC0gbG0obXBnIH4gZGlzcCArIGhwICsgZmFjdG9yKGFtKSArIGZhY3Rvcih2cyksIGRhdGEgPSBtdGNhcnMpDQpzdW1tYXJ5KGttbmspDQpgYGANCg0KVGVyYXogb3N6YWN1am15IHdhcnVua293ZSByZWdyZXNqZSBrd2FudHlsb3dlIG5hIHLDs8W8bnljaCBrd2FudHlsYWNoLA0KYsWCxIVkIHN0YW5kYXJkb3d5IHV6eXNrYW55IHByemV6ICoqKmJvb3RzdHJhcCoqKi4NCg0KWmF1d2HFvCwgxbxlIGlzdG5pZWplIGdyYWRpZW50IHdlIHdzcMOzxYJjenlubmlrYWNoIGt3YW50eWxvd3ljaCAqKmhwKiosIGphaw0KcsOzd25pZcW8ICoqZGlzcCoqLiBabmFrICoqZGlzcCoqIG9kd3JhY2Egc2nEmSwgcsOzd25pZcW8IHdzcMOzxYJjenlubmlrIG5hDQpjenlubmlrdSAqKmFtKiogamVzdCByw7PFvG55IHcgemFsZcW8bm/Fm2NpIG9kIGt3YW50eWxpOg0KDQpgYGB7cn0NCmt3YW50eWxlIDwtIGMoMC4yNSwgMC41MCwgMC43NSkNCnJlZ19rd2FudHlsb3dhIDwtIHJxKG1wZyB+IGRpc3AgKyBocCArIGZhY3RvcihhbSksdGF1ID0ga3dhbnR5bGUsZGF0YSA9IG10Y2FycykNCnN1bW1hcnkocmVnX2t3YW50eWxvd2EsIHNlID0gImJvb3QiKQ0KYGBgDQoNCiMjIyBUZXN0eSB3c3DDs8WCY3p5bm5pa8Ozdw0KDQpVxbx5amVteSBmdW5rY2ppIHJxLmFub3ZhIHogcGFraWV0dSByZWdyZXNqaSBrd2FudHlsb3dlaiwgYWJ5DQpwcnplcHJvd2FkemnEhyB0ZXN0IFdBTERBLiBQYW1pxJl0YWosIMW8ZSB0ZXN0IFdBTERBIG3Ds3dpLCDFvGUgYmlvcsSFYyBwb2QNCnV3YWfEmSBuaWVvZ3Jhbmljem9uZSBvc3phY293YW5pYSBtb2RlbHUsIHByemV0ZXN0dWplbXkgaGlwb3RlesSZIHplcm93xIUNCm3Ds3dpxIVjxIUsIMW8ZSB3c3DDs8WCY3p5bm5pa2kgc3BlxYJuaWFqxIUgcGV3bmUgbGluaW93ZSBvZ3JhbmljemVuaWEuDQoNCkFieSBqxIUgcHJ6ZXRlc3Rvd2HEhywgdcW8eWplbXkgb2JpZWt0dSB6d3LDs2NvbmVnbyB6IHVydWNob21pZW5pYSAqKipycSoqKg0KeiByw7PFvG55bWkgbGljemJhbWkga3dhbnR5bGkgaSB1c3Rhd2lteSBvcGNqxJkgKioqam9pbnQqKiogbmEgdHJ1ZSBsdWINCmZhbHNlLiBHZHkgKioqam9pbnQqKiogamVzdCB0cnVlOiAicsOzd25vxZvEhyB3c3DDs8WCY3p5bm5pa8OzdyBraWVydW5rb3d5Y2gNCnBvd2lubmEgYnnEhyB3eWtvbmFuYSBqYWtvIHdzcMOzbG5lIHRlc3R5IG5hIHdzenlzdGtpY2ggcGFyYW1ldHJhY2gNCm5hY2h5bGVuaWEiLCBnZHkgKioqam9pbnQqKiogamVzdCBmYWxzZTogIm5hbGXFvHkgemfFgmFzemHEhyBvZGR6aWVsbmUNCnRlc3R5IG5hIGthxbxkeW0geiBwYXJhbWV0csOzdyBuYWNoeWxlbmlhIi4NCg0KWmF1d2HFvCwgxbxlIHRlc3R5IGt3YW50eWxvd2Ugc8SFIHRlc3RhbWkgImxpbmlpIHLDs3dub2xlZ8WCZWoiLiBPem5hY3phIHRvLA0KxbxlIHBvd2lubmnFm215IHd5asSFxIcgcsOzxbxuZSB4LXd5cmF6eV93b2xuZSBkbGEga2HFvGRlZ28ga3dhbnR5bGEsIHBvbmlld2HFvA0KcmVwcmV6ZW50dWrEhSBvbmUgcG96aW9teSByb3prxYJhZMOzdyB3YXJ1bmtvd3ljaC4gSmXFm2xpIGplZG5haw0Kd3Nww7PFgmN6eW5uaWtpIGt3YW50eWxpIGRsYSB3c3DDs8WCY3p5bm5pa293IHPEhSB0YWtpZSBzYW1lLCB0byBuaWUgbWENCmVmZWt0w7N3IHNwZWN5Zmljem55Y2ggZGxhIGt3YW50eWxpLCB3eXN0YXJjesSFIGVmZWt0eSDFm3JlZG5pZS4NCg0KKipCYWRhbmllIHN0YXR5c3R5Y3puZWogcsOzxbxuaWN5IG1pxJlkenkgMjUuIGkgNTAuIGt3YW50eWxlbSB3YXJ1bmtvd3ltOioqDQoNCkJpb3LEhWMgcG9kIHV3YWfEmSBwb3d5xbxzemUgb3N6YWNvd2FuaWEga3dhbnR5bGksIHLDs8W8bmljYSBtacSZZHp5DQprd2FudHlsYW1pIDAsMjUgaSAwLDUwIGlzdG5pZWplLCBhbGUgY3p5IHPEhSBvbmUgd3lzdGFyY3phasSFY28gZHXFvGUsIGFieQ0KYnnEhyBzdGF0eXN0eWN6bmllIHLDs8W8bmU/IEpha2EgamVzdCB3YXJ0b8WbxIcgcD8gUHJ6ZWdsxIVkYWrEhWMgcG9uacW8c3plDQp3eW5pa2ksIG5pZSBzxIUgb25lIHN0YXR5c3R5Y3puaWUgcsOzxbxuZSENCg0KUG8gcGllcndzemUsIGpvaW50ID0gVFJVRS4gVG8gbmllIGplc3QgdGVzdG93YW5pZSwgY3p5IHdzcMOzxYJjenlubmlrIG5hDQpkaXNwIGplc3QgdGFraSBzYW0gamFrIHdzcMOzxYJjenlubmlrIG5hIGhwLiBUbyBqZXN0IHdzcMOzbG5lIHRlc3Rvd2FuaWUsDQpjenkgd3Nww7PFgmN6eW5uaWtpIGRsYSByw7PFvG55Y2gga3dhbnR5bGkgZGlzcCBpIHLDs8W8bnljaCBrd2FudHlsaSBocCBzxIUNCnRha2llIHNhbWUgZGxhIGthxbxkZWogem1pZW5uZWouDQoNCmBgYHtyfQ0Ka3dhbnR5bGUgPC0gYygwLjI1LCAwLjUwKQ0KcmVnX2t3YW50eWxvd2EgPC0gcnEobXBnIH4gZGlzcCArIGhwICsgZmFjdG9yKGFtKSx0YXUgPSBrd2FudHlsZSwgZGF0YSA9IG10Y2FycykNCmFub3ZhKHJlZ19rd2FudHlsb3dhLCB0ZXN0ID0gIldhbGQiLCBqb2ludD1UUlVFKQ0KYGBgDQoNClBvIGRydWdpZSwgam9pbnQgPSBGYWxzZToNCg0KYGBge3J9DQphbm92YShyZWdfa3dhbnR5bG93YSwgdGVzdCA9ICJXYWxkIiwgam9pbnQ9RkFMU0UpDQpgYGANCg0KKipCYWRhbmllIHN0YXR5c3R5Y3puZWogcsOzxbxuaWN5IG1pxJlkenkgMjUsIDUwIGkgNzUga3dhbnR5bGVtDQp3YXJ1bmtvd3ltOioqDQoNClBpZXJ3c3p5IGt3YXJ0eWwgaSBtZWRpYW5hIG5pZSB3eWRhasSFIHNpxJkgYnnEhyBzdGF0eXN0eWN6bmllIHLDs8W8bmUsIHRlcmF6DQpkb8WCxIVjenlteSB0cnplY2kga3dhcnR5bC4gSmFrIHdpZGHEhyB3Y3plxZtuaWVqLCBrd2FydHlsZSB3c3DDs2xuaWUNCnd5a2F6dWrEhSBncmFkaWVudC4gVGVyYXogbW/FvGVteSB6b2JhY3p5xIcsIMW8ZSAqKmRpc3AqKiwgKipocCoqIGkgKiphbSoqDQpzxIUgb2RkemllbG5pZSBzdGF0eXN0eWN6bmllIHLDs8W8bmUuDQoNClBvIHBpZXJ3c3plLCBqb2ludCA9IFRSVUU6DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQprd2FudHlsZSA8LSBjKDAuMjUsIDAuNTAsIDAuNzUpDQoNCnJlZ19rd2FudHlsb3dhIDwtIHJxKG1wZyB+IGRpc3AgKyBocCArIGZhY3RvcihhbSksdGF1ID0ga3dhbnR5bGUsIGRhdGEgPSBtdGNhcnMpDQoNCmFub3ZhKHJlZ19rd2FudHlsb3dhLCB0ZXN0ID0gIldhbGQiLCBqb2ludD1UUlVFKQ0KYGBgDQoNClBvIGRydWdpZSwgam9pbnQgPSBGYWxzZToNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmFub3ZhKHJlZ19rd2FudHlsb3dhLCB0ZXN0ID0gIldhbGQiLCBqb2ludD1GQUxTRSkNCmBgYA0KDQojIyMgRG9icm/EhyBkb3Bhc293YW5pYQ0KDQpNb8W8ZW15IG9ibGljennEhyB3c3DDs8WCY3p5bm5pa2kgZG9icm9jaSBkb3Bhc293YW5pYSByZWdyZXNqaSBrd2FudHlsb3dlaiB6DQp3eWtvcnp5c3RhbmllbSByZXN6dCBpIHJlc3p0IGJlendhcnVua293eWNoOg0KDQpgYGAgcg0KZ29vZGZpdChyZXNpZCwgcmVzaWRfbmwsIHRhdSkNCmBgYA0KDQpNaWFyYSBkb2Jyb2NpIGRvcGFzb3dhbmlhIGRsYSByZWdyZXNqaSBrd2FudHlsb3dlaiBqZXN0IHN6YWNvd2FuYSBqYWtvIDENCm1pbnVzIHN0b3N1bmVrIHN1bXkgb2RjaHlsZcWEIGJlend6Z2zEmWRueWNoIHcgbW9kZWxhY2ggdyBwZcWCbmkNCnNwYXJhbWV0cnl6b3dhbnljaCBkbyBzdW15IG9kY2h5bGXFhCBiZXp3emdsxJlkbnljaCB3IHplcm93eW0NCihiZXp3YXJ1bmtvd3ltKSBtb2RlbHUga3dhbnR5bG93eW0uDQoNCldhcnRvxZtjaSB0ZSBzxIUgcHJ6eWRhdG5lIGRvIHBvcsOzd25hxYQgbWnEmWR6eSBtb2RlbGFtaSBrd2FudHlsb3d5bWksIGFsZQ0KbmllIHPEhSBwb3LDs3dueXdhbG5lIHplIHN0YW5kYXJkb3d5bWkgd3Nww7PFgmN6eW5uaWthbWkgZGV0ZXJtaW5hY2ppLiBUZQ0Kb3N0YXRuaWUgb3BhcnRlIHPEhSBuYSB3YXJpYW5jamkgb2RjaHlsZcWEIGt3YWRyYXRvd3ljaCwgbmF0b21pYXN0DQp3YXJ0b8WbY2kgZG9icm9jaSBkb3Bhc293YW5pYSBkbGEgcmVncmVzamkga3dhbnR5bG93ZWogb3BhcnRlIHPEhSBuYQ0Kb2RjaHlsZW5pYWNoIGJlend6Z2zEmWRueWNoLiBXYXJ0b8WbY2kgZG9icm9jaSBkb3Bhc293YW5pYSB6YXdzemUgYsSZZMSFDQptbmllanN6ZSBuacW8IHdhcnRvxZtjaSBSXjJeLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyMgbW9kZWwga3dhbnR5bG93eQ0KbW9kZWwxIDwtIHJxKG1wZyB+IGRpc3AgKyBocCArIGZhY3RvcihhbSksdGF1ID0gMC41LCBkYXRhID0gbXRjYXJzKQ0KcmVzenR5MSA8LSByZXNpZChtb2RlbDEpDQoNCiMjIGJlendhcnVua293eSAocHVzdHkpIG1vZGVsIGt3YW50eWxvd3kNCm1vZGVsMiA8LSBycShtcGcgfiAxLCB0YXUgPSAwLjUsZGF0YT1tdGNhcnMpDQpyZXN6dHkyIDwtIHJlc2lkKG1vZGVsMikNCg0KZ29vZGZpdChyZXN6dHkxLCByZXN6dHkyLCAwLjUpDQoNCiMjIHIyIG1vZGVsdSBLTU5LIGRsYSBwb3LDs3duYW5pYQ0KbW9kZWxfbG0gPC0gbG0obXBnIH4gZGlzcCArIGhwICsgZmFjdG9yKGFtKSwgZGF0YSA9IG10Y2FycykNCg0Kc3VtbWFyeShtb2RlbF9sbSkkci5zcXVhcmVkDQpgYGANCg0KIyMgWmFkYW5pZQ0KDQpUZXJheiBXYXN6YSBrb2xlaiA7LSkNCg0KV2FzenltIHphZGFuaWVtIGR6aXNpYWogamVzdCB6YW1vZGVsb3dhbmllIC0gcG9yw7N3bmFuaWUgS01OSyBvcmF6DQpyZWdyZXNqaSBrd2FudHlsb3dlaiAocsOzxbxuby1wb3ppb21vd2VqKSBkbGEgem1pZW5uZWogImVhcm5pbmdzIiAtDQp3eW5hZ3JvZHplbmlhLg0KDQpEb2JpZXJ6IGkgcHJ6ZXRlc3R1aiBwcmVkeWt0b3J5LCBrd2FudHlsZSBkbGEgbW9kZWxpLiBXeWtvbmFqIHRlc3R5DQpyw7PFvG5pYyB3c3DDs8WCY3p5bm5pa293IGRsYSBmaW5hbG55Y2ggbW9kZWxpLg0KDQpXIHByenlwYWRrdSBwcm9ibGVtw7N3IC0gb2JlanJ6eWogdmlkZW8gdHV0b3JpYWwgKHfFgsSFY3ogcG9sc2tpZSBuYXBpc3kpDQpvcmF6IHdlamTFuiBuYSBqZWdvIHN0cm9uxJkgemUgxbpyw7NkxYJhbWkuIE1vxbxlc3ogcsOzd25pZcW8IHd5a29yenlzdGHEhyB3L3cNCnByenlrxYJhZHkuDQojIDEuIERhbmUNCmBgYHtyfQ0KZGF0YSgiQ1BTU1c5Mjk4IikNCiMgP0NQU1NXOTI5OCANCg0KaGVhZChDUFNTVzkyOTgpDQoNCkRhbmU8LUNQU1NXOTI5OA0KaGVhZChEYW5lKQ0KDQpgYGANCg0KIyAyLiBaYnVkb3dhbmllIG1vZGVsdSBLTU5LDQoNCmBgYHtyfQ0Kb2xzX21vZGVsIDwtIGxtKGVhcm5pbmdzIH4gZGVncmVlICsgZ2VuZGVyICsgYWdlLGRhdGEgPSBEYW5lKQ0Kc3VtbWFyeShEYW5lKQ0KYGBgDQoNCg0KDQojIDMuIFJlZ3Jlc2phIGt3YW50eWxvd2ENCiMgRG9wYXNvd2FuaWUgbW9kZWxpIGRsYSBrd2FudHlsaTogMC4yNSwgMC41IChtZWRpYW5hKSwgMC43NQ0KDQpgYGB7cn0NCg0KcnFfMjUgPC0gcnEoZWFybmluZ3MgfiBkZWdyZWUgKyBhZ2UgKyBnZW5kZXIsIGRhdGEgPSBEYW5lLCB0YXUgPSAwLjI1KQ0KcnFfNTAgPC0gcnEoZWFybmluZ3MgfiBkZWdyZWUgKyBhZ2UgKyBnZW5kZXIsIGRhdGEgPSBEYW5lLCB0YXUgPSAwLjUpDQpycV83NSA8LSBycShlYXJuaW5ncyB+IGRlZ3JlZSArIGFnZSArIGdlbmRlciwgZGF0YSA9IERhbmUsIHRhdSA9IDAuNzUpDQoNCg0Kc3VtbWFyeShycV8yNSkNCnN1bW1hcnkocnFfNTApDQpzdW1tYXJ5KHJxXzc1KQ0KDQpgYGANCg0KIyNPZ8OzbG5lIHphbGXFvG5vxZtjaToNCkVmZWt0IHd5a3N6dGHFgmNlbmlhIChkZWdyZWViYWNoZWxvcik6DQoNClBvc3pjemVnw7NsbmUgd2FydG/Fm2NpIGRsYSBkZWdyZWViYWNoZWxvciB3c2thenVqxIUsIMW8ZSBvc29ieSB6IHd5a3N6dGHFgmNlbmllbSBuYSBwb3ppb21pZSBsaWNlbmNqYXRhICh3IHBvcsOzd25hbml1IGRvIGdydXB5IHJlZmVyZW5jeWpuZWosIG5wLiBvc8OzYiBiZXogd3nFvHN6ZWdvIHd5a3N6dGHFgmNlbmlhKSB6YXJhYmlhasSFIGlzdG90bmllIHdpxJljZWogdyBrYcW8ZHltIGt3YW50eWx1ICgwLjI1LCAwLjUsIDAuNzUpLg0KV2FydG/Fm8SHIHdzcMOzxYJjenlubmlrYSB3enJhc3RhIHdyYXogeiBrd2FudHlsZW06DQoNCs+EPTAuMjU6ICszLjU5DQrPhD0wLjU6ICs0LjcwDQrPhD0wLjc1OiArNS43Ng0KDQpJbSB3ecW8c3p5IGt3YW50eWwgKGN6eWxpIHd5xbxzenkgcG96aW9tIHphcm9ia8OzdyksIHR5bSB3acSZa3N6eSB3cMWCeXcgd3lrc3p0YcWCY2VuaWEgbmEgemFyb2JraS4NCkVmZWt0IHdpZWt1IChhZ2UpOg0KDQpXaWVrIG1hIHBvenl0eXdueSBpIHN0YXR5c3R5Y3puaWUgaXN0b3RueSB3cMWCeXcgbmEgemFyb2JraSB3IGthxbxkeW0ga3dhbnR5bHUuDQpXc3DDs8WCY3p5bm5pa2kgcm9zbsSFIHdyYXogeiBrd2FudHlsZW06DQrPhD0wLjI1OiArMC4xNyDPhD0wLjU6ICswLjMxIM+EPTAuNzU6ICswLjQzDQpXecW8c3plIHphcm9ia2kgc8SFIGJhcmR6aWVqIHphbGXFvG5lIG9kIHdpZWt1IHcgZ8Ozcm55Y2gga3dhbnR5bGFjaCwgY28gbW/FvGUgc3VnZXJvd2HEhyB3acSZa3N6xIUga29yennFm8SHIHogZG/Fm3dpYWRjemVuaWEgemF3b2Rvd2VnbyB3IGxlcGllaiBwxYJhdG55Y2ggZ3J1cGFjaC4NCkVmZWt0IHDFgmNpIChnZW5kZXJmZW1hbGUpOg0KDQpXYXJ0b8WbY2kgd3Nww7PFgmN6eW5uaWthIGRsYSB6bWllbm5laiBnZW5kZXJmZW1hbGUgKHcgcG9yw7N3bmFuaXUgZG8gbcSZxbxjenl6bikgc8SFIHVqZW1uZSB3ZSB3c3p5c3RraWNoIGt3YW50eWxhY2gsIGNvIHdza2F6dWplIG5hIG5lZ2F0eXdueSB3cMWCeXcgYnljaWEga29iaWV0xIUgbmEgemFyb2JraS4NCkVmZWt0IHRlbiBzdGFqZSBzacSZIGJhcmR6aWVqIHd5cmHFum55IHcgd3nFvHN6eWNoIGt3YW50eWxhY2g6DQrwnZyPPTAuMjXPhD0wLjI1OiAtMS4zMvCdnI89MC41z4Q9MC41OiAtMi4xM/CdnI89MC43Nc+EPTAuNzU6IC0yLjk3DQpSw7PFvG5pY2EgdyB6YXJvYmthY2ggbWnEmWR6eSBwxYJjaWFtaSBqZXN0IHdpxJlrc3phIHcgZ8Ozcm55Y2gga3dhbnR5bGFjaCwgY28gbW/FvGUgc3VnZXJvd2HEhyB0encuICJzemtsYW55IHN1Zml0IiBsdWIgcsOzxbxuaWNlIHcgZG9zdMSZcGllIGRvIGxlcGllaiBwxYJhdG55Y2ggc3Rhbm93aXNrLg0KDQojU3RhdHlzdHljem5hIGlzdG90bm/Fm8SHOg0KDQpXc3p5c3RraWUgd3Nww7PFgmN6eW5uaWtpIHPEhSBzdGF0eXN0eWN6bmllIGlzdG90bmUgbmEgcG96aW9taWUgDQrwnZGdPDAuMDUNCnA8MC4wNSwgY28gd3NrYXp1amUgbmEgc2lsbmUgZG93b2R5IGRsYSBpY2ggd3DFgnl3dSBuYSB6YXJvYmtpIHcgYW5hbGl6b3dhbnljaCBrd2FudHlsYWNoLg0KWm1pYW55IHdzcMOzxYJjenlubmlrw7N3IHcga3dhbnR5bGFjaDoNCg0KV3Nww7PFgmN6eW5uaWtpIHLDs8W8bmnEhSBzacSZIG1pxJlkenkga3dhbnR5bGFtaSwgY28gcG9ka3JlxZtsYSwgxbxlIHdwxYJ5dyBwb3N6Y3plZ8OzbG55Y2ggem1pZW5ueWNoIG5pZSBqZXN0IHLDs3dub21pZXJueSB3IHLDs8W8bnljaCBjesSZxZtjaWFjaCByb3prxYJhZHUgemFyb2Jrw7N3LiBUbyBqZXN0IGfFgsOzd255IGNlbCBzdG9zb3dhbmlhIHJlZ3Jlc2ppIGt3YW50eWxvd2VqIOKAlCBhbmFsaXphIHdwxYJ5d3Ugem1pZW5ueWNoIHcgcsOzxbxueWNoIHB1bmt0YWNoIHJvemvFgmFkdS4NCg0KI1duaW9za2kga2/FhGNvd2U6DQpXeWtzenRhxYJjZW5pZSBqZXN0IGtsdWN6b3d5bSBjenlubmlraWVtIHp3acSZa3N6YWrEhWN5bSB6YXJvYmtpLCBzemN6ZWfDs2xuaWUgdyB3ecW8c3p5Y2gga3dhbnR5bGFjaC4NCldpZWsgbWEgd2nEmWtzemUgem5hY3plbmllIHcgbGVwaWVqIG9wxYJhY2FueWNoIGdydXBhY2gsIGNvIHN1Z2VydWplLCDFvGUgZG/Fm3dpYWRjemVuaWUgYmFyZHppZWogcHJlbWl1amUgb3NvYnkgbyB3ecW8c3p5Y2ggemFyb2JrYWNoLg0KUMWCZcSHIHBvem9zdGFqZSBpc3RvdG55bSBjenlubmlraWVtIHdwxYJ5d2FqxIVjeW0gbmEgemFyb2JraSwgcHJ6eSBjenltIHLDs8W8bmljZSBuYSBuaWVrb3J6ecWbxIcga29iaWV0IHPEhSB3acSZa3N6ZSB3IHd5xbxzenljaCBrd2FudHlsYWNoLg0KDQoNCiMgNC4gVGVzdCByw7PFvG5pYyB3c3DDs8WCY3p5bm5pa8Ozdw0KYGBge3J9DQoNCmFub3ZhKHJxXzI1LCBycV81MCwgcnFfNzUpDQoNCmBgYA0KDQojSW50ZXJwcmV0YWNqYSB3eW5pa3U6DQpIaXBvdGV6YSB6ZXJvd2E6DQoNClRlc3Qgc3ByYXdkemEgaGlwb3RlesSZIHplcm93xIUsIMW8ZSBuYWNoeWxlbmlhICh3c3DDs8WCY3p5bm5pa2kgcmVncmVzamkpIGRsYSByw7PFvG55Y2gga3dhbnR5bGkgc8SFIHRha2llIHNhbWUsIGN6eWxpOg0K8J2QuzA68J2bvfCdnI89IDAuMjU98J2bvfCdnI89MC41PfCdm73wnZyPPTAuNzUNCkggMCA6zrIgz4Q9MC4yNT3OsiDPhD0wLjU9zrIgz4Q9MC43NQ0KI1dhcnRvxZvEhyBwOg0KDQpXYXJ0b8WbxIcgcCB3eW5vc2kgPDIuMngxMF4xNiwgY28gb3puYWN6YSwgxbxlIHLDs8W8bmljZSBuYWNoeWxlxYQgc8SFIHd5c29jZSBzdGF0eXN0eWN6bmllIGlzdG90bmUuDQpIaXBvdGV6xJkgemVyb3fEhSBuYWxlxbx5IG9kcnp1Y2nEhyBuYSBrYcW8ZHltIHR5cG93eW0gcG96aW9taWUgaXN0b3Rub8WbY2kgKPCdm7w9MC4wNSzOsT0wLjAxLCBldGMuKS4NCg0KDQoNCg0KIyA1LiBXaXp1YWxpemFjamEgcG9yw7N3bmFuaWENCiMgRWtzdHJha2NqYSB3c3DDs8WCY3p5bm5pa8OzdyBkbGEgcsOzxbxueWNoIGt3YW50eWxpDQoNCmBgYHtyfQ0KDQpjb2VmZnMgPC0gZGF0YS5mcmFtZSgNCiAgVmFyaWFibGUgPSBuYW1lcyhjb2VmKHJxXzI1KSksDQogIE9MUyA9IGNvZWYob2xzX21vZGVsKSwNCiAgUTI1ID0gY29lZihycV8yNSksDQogIFE1MCA9IGNvZWYocnFfNTApLA0KICBRNzUgPSBjb2VmKHJxXzc1KQ0KKQ0KDQpwcmludChjb2VmZnMpDQoNCmBgYA0KDQojV25pb3NraQ0KDQpPTFMgZG9zdGFyY3phIHXFm3JlZG5pb25lZ28gb2JyYXp1IHdwxYJ5d3Ugem1pZW5ueWNoIG5pZXphbGXFvG55Y2ggbmEgemFyb2JraSwgY28gbW/FvGUgcHJvd2FkemnEhyBkbyB1dHJhdHkgd2HFvG55Y2ggaW5mb3JtYWNqaSBvIHLDs8W8bmljYWNoIG1pxJlkenkgZ3J1cGFtaSAoa3dhbnR5bGFtaSkuDQpSZWdyZXNqYSBrd2FudHlsb3dhIHVqYXduaWEgcsOzxbxuaWNlOg0KDQpXeWtzenRhxYJjZW5pZSBpIHdpZWsgbWFqxIUgd2nEmWtzenkgd3DFgnl3IG5hIG9zb2J5IHcgd3nFvHN6eWNoIGt3YW50eWxhY2ggKHogd3nFvHN6eW1pIHphcm9ia2FtaSkuDQpSw7PFvG5pY2UgcMWCYWNvd2UgbWnEmWR6eSBwxYJjaWFtaSBzxIUgbW5pZWpzemUgdyBkb2xueWNoIGt3YW50eWxhY2ggaSByb3NuxIUgd3JheiB6IGt3YW50eWxlbS4NCg0KDQoNCiMgV3lrcmVzIHdzcMOzxYJjenlubmlrw7N3DQpgYGB7cn0NCmNvZWZmc19sb25nIDwtIHRpZHlyOjpwaXZvdF9sb25nZXIoY29lZmZzLCBjb2xzID0gLVZhcmlhYmxlLCBuYW1lc190byA9ICJNb2RlbCIsIHZhbHVlc190byA9ICJDb2VmZmljaWVudCIpDQoNCmdncGxvdChjb2VmZnNfbG9uZywgYWVzKHggPSBWYXJpYWJsZSwgeSA9IENvZWZmaWNpZW50LCBmaWxsID0gTW9kZWwpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh0aXRsZSA9ICJQb3LDs3duYW5pZSB3c3DDs8WCY3p5bm5pa8OzdyByZWdyZXNqaSBLTU5LIGkga3dhbnR5bG93ZWoiLA0KICAgICAgIHggPSAiWm1pZW5uZSIsIHkgPSAiV2FydG/Fm8SHIHdzcMOzxYJjenlubmlrYSIpDQoNCmBgYA0KDQojaW50ZXJwcmV0YWNqYSB3eWtyZXN1DQoNCjEpIFd5xbxzemEgd2FydG/Fm8SHIHcgUTI1IG96bmFjemEsIMW8ZSBvc29ieSBvIG5pc2tpY2ggemFyb2JrYWNoIG1hasSFIHd6Z2zEmWRuaWUgd2nEmWtzemUgcG9kc3Rhd293ZSB3eW5hZ3JvZHplbmllIChuaWV6YWxlxbxuaWUgb2Qgem1pZW5ueWNoKSwgYSB3IFE3NSByw7PFvG5pY2Ugc8SFIG1uaWVqIHpuYWN6xIVjZS4NCg0KMikgRWZla3Qgd3lrc3p0YcWCY2VuaWEgamVzdCBiYXJkemllaiB3aWRvY3pueSB3IHd5xbxzenljaCBrd2FudHlsYWNoLCBjbyB3c2thenVqZSBuYSByb3NuxIVjxIUgd2FydG/Fm8SHIHd5a3N6dGHFgmNlbmlhIHcgbGVwaWVqIHDFgmF0bnljaCBzdGFub3dpc2thY2guDQoNCg0KMykgUsOzxbxuaWNlIHDFgmFjb3dlIG1pxJlkenkgcMWCY2lhbWkgc8SFIGJhcmR6aWVqIHd5cmHFum5lIHcgZ3J1cGFjaCBvIHd5xbxzenljaCB6YXJvYmthY2ggLT4gZGxhIHptaWVubmVqIGdlbmRlcmZlbWFsZSB3c3DDs8WCY3p5bm5payBqZXN0IG5pxbxzenkgdyBRMjUgaSBuYWpiYXJkemllaiBuZWdhdHl3bnkgdyBRNzUNCg0KNCkgU3RhcnN6ZSBvc29ieSB6IGdydXB5IHd5c29raWNoIHphcm9ia8OzdyBiYXJkemllaiBrb3J6eXN0YWrEhSBuYSBzd29pbSBkb8Wbd2lhZGN6ZW5pdSBuacW8IHRlIHogZ3J1cHkgbyBuacW8c3p5Y2ggemFyb2JrYWNoLg0KDQpgYGB7cn0NCg0KY2F0KCJLTU5LOiDFmnJlZG5pYSB3YXJ0b8WbxIcgem1pZW5uZWogZWFybmluZ3MgdyB6YWxlxbxub8WbY2kgb2QgcHJlZHlrdG9yw7N3LiIpDQpjYXQoIlJlZ3Jlc2phIGt3YW50eWxvd2E6IFptaWVubmUgbWFqxIUgcsOzxbxueSB3cMWCeXcgdyB6YWxlxbxub8WbY2kgb2QgcG96eWNqaSB3IHJvemvFgmFkemllIGVhcm5pbmdzLiIpDQoNCmBgYA0KDQo=