Introductie
Proefopzet (1)
- Scope: De onderzoeker bepaalt de populatie naar waar ze de resultaten van de studie wensen te veralgemenen.
- Financiƫle and logistieke beperkingen \(\rightarrow\) representatieve steekproef van de populatie: Randomisatie!
Data analysis (2 & 3)
Data-Exploratie en Beschrijvende Statistiek (2):
- exploreren,
- visualiseren,
- samenvatten,
- inzicht verwerven in de data,
- aannames nagaan
Statistische Besluitvorming (3) (statistical inference):
Veralgemeen wat we observeren in de steekproef naar de populatie zodat we algemene conclusies kunnen trekken over het proces die we bestuderen.
Gebruik van statistische modellen voor data analyse en om onzekerheid te kwantificeren en te rapporteren.
Voorbeeld
- National Health and Nutrition Examination Survey (NHANES)
- Americaanse demografische studie
- Groot aantal van fysieke, demografische, nutritionele, gezondheids karakteristieken
51624 |
male |
164.7 |
30.0_plus |
1.29 |
8 |
51625 |
male |
105.4 |
12.0_18.5 |
NA |
NA |
51630 |
female |
168.4 |
30.0_plus |
1.16 |
10 |
51638 |
male |
133.1 |
12.0_18.5 |
1.34 |
NA |
51646 |
male |
130.6 |
18.5_to_24.9 |
1.55 |
NA |
51647 |
female |
166.7 |
25.0_to_29.9 |
2.12 |
20 |
Variabelen
- We meten variabelen op subjecten in een steekproef
- Een Variabele is een karateristiek b.v. Lengte, Direct cholesterol, Age, Gender, ā¦
- Het varieert van subject tot subject in de populatie en is dus ook in de steekproef en tussen steekproeven.
Types van variabelen
- Kwalitatieve variabelen: een beperkt aantal categorieƫn, niet numeriek.
- nominale variabelen: geen natuurlijke ordening, v.b. Gender, blood group, ā¦
- ordinale variabelen: ordening, v.b. BMI class, smoking status (1: never smoked, 2: stopped smoking, 3: smoker)
- Numerieke variabelen:
discrete variabelen: tellingen v.b. number of partners in life span, ā¦
continue variabelen: kunnen (in theorie) elke mogelijke waarde aannemen binnen bepaalde grenzen v.b. Age, Height, Weight, BMI, Direct Cholestorolā¦
Soms dichotomiseren naar een nominale kwalitatieve variabele \(\rightarrow\) informatieverlies: BMI \(\rightarrow\) BMI class
Populatie
Doel van wetenschappelijke studie: uitspraken doen over de algemene populatie.
V.b. nagaan of de lengte tussen mannen en vrouwen gemiddeld verschillend is.
Populatie is een theoretisch concept
- Is meestal continu in verandering
- Vaak ook interesse in toekomstige subjecten \(\rightarrow\) dus op bepaald ogenblik niet volledig observeerbaar
- kan als oneindig groot worden beschouwd
Populatie duidelijk omschrijven!
Populatie duidelijk omschrijven
Inclusiecriteria zijn karakteristieken die een subject/experimentele eenheid moet hebben om tot de populatie te behoren, b.v.
- leeftijdscategorie 45-65
- normaal BMI
- ā¦
Exclusiecriteria zijn karakteristieken die een subject/experimentele eenheid niet mag hebben om tot de populatie te behoren, b.v.
- diabetes
- historiek van hard drugs
- lage gezondheidsstatus
- slaapproblemen
- ā¦
Toevalsveranderlijken (toevallige veranderlijken)
- Variabelen (vb Systolische bloeddruk) variƫren in de populatie van subject tot subject!
- Variabelen zijn dus random of veranderlijk aangezien hun waarde veranderlijk is in de populatie
- Cruciale vraag: Hoe nauwkeurig zijn uitspraken over de populatie o.b.v. een groep gemeten subjecten in een steekproef!
- We zullen dus steeds verschillen zien van steekproef tot steekproef
- Spreiding op gegevens speelt cruciale rol
Conventie
- Gebruik hoofdletters om aan te geven dat bestudeerde karakteristiek (vb. systolische bloeddruk) variabel is in de populatie zonder daarbij concreet over de gerealiseerde waarde voor een bepaald subject na te denken.
- Variabele \(X\) wordt algemeen een toevalsveranderlijke genoemd: is formeel resultaat van een toevallige trekking van een bepaalde karakteristiek uit de studiepopulatie.
- Een toevalsveranderlijke \(X\) kan men dus opvatten als onbekende veranderlijke die een meting voorstelt die we plannen te verzamelen bij een random subject, maar nog niet hebben verzameld.
- Noodzakelijk om te kunnen redeneren hoe resultaten van steekproef tot steekproef kunnen wijzigen
- Toevallig veranderlijken kunnen kwalitatief, kwantitatief, discreet, continu, ā¦. zijn
Beschrijven van de populatie
Voor we een random variabele meten is het onmogelijk exact te voorspellen hoe hoog ze zal zijn.
Gerealiseerde waarde van \(X\) is onderhevig aan random variabiliteit
Als we weten hoe de variabele verdeeld is dan kunnen we probabiliteitstheorie gebruiken om de kans te berekenen dat een bepaald voorval (event) zich voordoet: vb wat is de kans dat het IQ van een random subject uit de populatie kleiner of gelijk is aan 80.
Notatie:
- Event: \(X \leq 80\)
- Probabiliteit op event: \(Pr(X \leq 80)\)
##Intermezzo probabiliteitstheorie
Discrete toevallig veranderlijken
Stel dat we een discrete random variabele meten \(X\)
Alle mogelijke waarden voor \(X\) worden de steekproefruimte \(\Omega\) genoemd.
- Voor Gender is de steekproefruimte \(\Omega=(0,1)\) met 0 (vrouw) or 1 (man).
- Voor het werpen van een dobbelsteen is de steekproefruimte \(\Omega=(1,2,3,4,5,6)\).
Een event \(A\) is een subset van de steekproefruimte
- Een even getal werpen met een dobbelsteen: $A=(2,4,6)$.
- Kan ook een specifieke waarde zijn $A=(1)$.
Event ruimte \(\mathcal{A}\) is de klasse van alle mogelijke events die kunnen optreden bij een bepaald experiment.
Twee events (\(A_1\) en \(A_2\)) zijn multueel exclusief als ze niet samen op kunnen treden.
- v.b. event van de oneven getallen \(A_1=(1,3,5)\) en het event om \(A_2=(6)\) te gooien.
- Dus \(A_1 \bigcap A_2=\emptyset\).
Probabiliteit \(Pr(A)\) is een function \(Pr: A \rightarrow [0,1]\) die voldoet aan
- \(Pr(A) \geq 0\) en \(Pr(A) \leq 1\) voor elke \(A \in \mathcal{A}\)
- \(Pr(\Omega)=1\)
- Voor multueel exclusieve events \(A_1, A_2, \ldots A_k\) geldt dat \(Pr(A_1 \cup A_2 \ldots \cup A_k)= Pr(A_1) + \ldots + Pr(A_k)\)
Dobbelsteen voorbeeld
- oneven number \(A=(1,3,5)\): is de unie van 3 multueel exclusieve events \(A_1=1\), \(A_2=3\) en \(A_3=5\) zodat \(Pr(A)=Pr(1)+Pr(3)+Pr(5)=1/6+1/6+1/6=0.5\)
- \(\Omega=(1,2,3,4,5,6)\): \(Pr(\Omega)=1\)
Als we twee subjecten (j en k) onafhankelijk trekken van de populatie dan is de gezamelijke probabiliteit \(P(X_j,X_k)= P(X_j)P(X_j)\)
Distributie of verdeling
De distributie of de verdeling van een discrete toevallig veranderlijke \(X\) beschrijft de kans op elke mogelijke waarde van de steekproefruimte.
Voorbeeld: Gender is een binaire variabele (0: vrouw, 1: man) en binaire variabelen volgen een Bernoulli verdeling. 50.8% van de subjecten in de Amerikaanse populatie zijn vrouw en 49.2% is man.
Laat \(\pi\) de probabiliteit zijn op een man \(\pi=0.492\). \[ X\sim \left \{
\begin{array}{lcl}
P(X=0) &=& 1-\pi\\
P(X=1) &=& \pi
\end{array} \right . \]
tibble(X=c(0,1),prob=c(0.508,0.492)) %>%
ggplot(aes(x=X,xend=X,y=0,yend=prob)) +
geom_segment() +
ylab("Probability")
Toevallig veranderlijke \(X\) volgt een Bernoulli verdeling \(B(\pi)\) met parameter \(\pi=0.492\), \[B(\pi)= \pi^x(1-\pi)^{(1-x)}\]
Cumulative distributie functie
De cumulative distributie functie F(x) geeft de probabiliteit weer om een random variable X te observeren waarvoor geldt dat \(X\leq x\): \[ F(x) = \sum\limits_{\forall X\leq x} P(x)\]
Gender voorbeeld \(F(0)=1-\pi\) and F(1)= P(X=0) + P(X=1)=1
tibble(X=c(0,1),cumprob=c(0.508,1)) %>%
ggplot(aes(x=X,xend=X,y=0,yend=cumprob)) +
geom_segment() +
ylab("F(x)")
Dobbelsteen:
tibble(X=1:6,cumprob=cumsum(rep(1/6,6))) %>%
ggplot(aes(x=X,xend=X,y=rep(0,6),yend=cumprob)) +
geom_segment() +
ylab("F(x)")
Gemiddelde
Het gemiddelde of de verwachte waarde \(E[X]\) van een discrete toevallig veranderlijke \(X\) is gegeven door:
\[E[X]=\sum\limits_{x\in\Omega} x P(X=x)\]
Gender voorbeeld
- \(E[X]= 0 \times (1-\pi) + 1 \times (\pi) = \pi\)
- The mean equals \(E[X]=0.492\).
Dobbelsteen:
\(E[X]= 1 \times \frac{1}{6} + 2 \times \frac{1}{6} + \ldots + 6 \times \frac{1}{6} =\) 3.5
Variantie
De variantie is een maat voor de variabiliteit van een toevallig veranderlijke en wordt gegeven door:
\[E[(X-E[X])^2]=\sum\limits_{x\in\Omega} (x-E[X])^2 P(X=x)\]
- Gender voorbeeld \[\begin{eqnarray}
E[(X-E[X])^2]&=&(0-\pi)^2\times (1-\pi)+(1-\pi)^2 \times \pi\\
&=& \pi^2 (1-\pi) + (1-\pi)^2 \pi\\
&=&\pi (1-\pi)(\pi+1-\pi)\\
&=&\pi(1-\pi)
\end{eqnarray}\]
Continue toevallig veranderlijke
Een continue toevallig veranderlijke kan binnen bepaalde grenzen alle mogelijke waarden aannemen.
De kans om exact Ć©Ć©n bepaalde waarde aan te nemen is daarom gelijk aan 0.
De distributie (verdeling) wordt daarom weergegeven a.d.h.v. de densiteitsfunctie of de dichtheidsfunctie \(f(x)\)
Veel biologische karakteristieken zijn approximatief normaal verdeeld (lengte, bloeddruk, IQ, concentratie metingen na logaritmische transformatie) \[f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} e^{-\frac{(x-\mu)^2}{2\sigma^2}}\]
Dat wordt kort genoteerd als \(f(x) = N(\mu,\sigma^2)\)
Van het IQ is geweten dat het normale verdeling volgt met gemiddelde \(\mu=100\) en standaardafwijking \(\sigma=15\).
\[IQ \sim N(100,15^2)\]
In R kunnen we de dnorm functie gebruiken om de densiteit te berekenen voor een bepaalde waarde X=x.
De argumenten van dnorm
zijn mean
(\(\mu\)) en sd
(standaardafwijking \(\sigma\)).
iq <- tibble(
IQ = seq(40,150,.1),
Densiteit = dnorm(seq(40,150,.1),mean=100,sd=15)
)
iq %>%
ggplot(aes(x=IQ,y=Densiteit)) +
geom_line()
- Binnen bepaalde grenzen kunnen continue toevallig veranderlijken alle mogelijke waarden aannemen dus is \(\Omega\) oneindig groot.
####Cumulatieve distributie
Opnieuw is de cumulatieve distributie \(F(X)=Pr(X\leq x)\).
Omdat X continu is berekenen we deze probabiliteit a.d.h.v. een integraal \[F(x)=\int \limits_{-\infty}^x f(x) dx\]
Merk op dat \(f(x)=0\) als x niet tot de steekproefruimte behoord.
We kunnen \(F(x)\) berekenen voor een normaal verdeelde toevallig veranderlijke met de functie pnorm
die opnieuw argumenten mean
en sd
heeft.
iq %>%
mutate(Probability=pnorm(IQ,mean=100,sd=15)) %>%
ggplot(aes(x=IQ,y=Probability)) +
geom_line()
De probabiliteit dat het IQ van een random subject lager is dan 80 wordt in R berekend door
[1] 0.09121122
Voor de grootst mogelijke waarde voor \(X\) integreren we over de volledige steekproefruimte \(\Omega\) dus \[\int \limits_{x \in \Omega} f(x) dx=1\]
De oppervlakte onder de dichtheidsfunctie is dus 1!
Gemiddelde en variantie
- Het gemiddelde of de verwachte waarde is
\[\int \limits_{x \in \Omega} x f(x) dx\]
\[\int \limits_{x \in \Omega} (x-E[X])^2 f(x) dx\]
- Voor de normale distributie bekomen we
\[\int \limits_{-\infty}^{+\infty} (x-\mu)^2 f(x) dx = \sigma^2\]
- Het is vaak moeilijk om de variantie te interpreteren gezien ze niet in de zelfde eenheden staat als het gemiddelde. Daarom werken we vaak met de standaardafwijking:
\[SD=\sqrt{E[(X-E[X])^2]}\]
DE SD voor de normale distributie, \(\sigma\) heeft de mooie interpretatie dat ongeveer 68% van de populatie een waarde heeft voor de karakteristiek X binnen het interval van 1 standaardafwijking(\(\sigma\)) rond het gemiddelde:
\[P(\mu-\sigma < X < \mu + \sigma) \approx 0.68\]
- Voor normaal verdeelde toevallig veranderlijken heeft ongeveer 95% van de subjecten in de populatie een waarde die binnen twee standaardafwijkingen (\(2 \sigma\)) ligt van het gemiddelde.
\[P[\mu - 2 \sigma < X < \mu + 2 \sigma]\approx 0.95\]
Standardisatie
- Normale data worden vaak gestandardiseerd.
\[z=\frac{x-\mu}{\sigma}\]
- Na standardisatie volgen de data een standaard normaal verdeling met gemiddelde \(\mu=0\) en variantie \(\sigma^2=1\): \[z \sim N(0,1)\]
We kunnen de qnorm
functie gebruiken om kwantielen \(z_{2.5\%}\) en \(z_{97.5\%}\) die respectievelijk corresponderen met \(F(z_{2.5\%})=0.025\) en \(F(z_{97.5\%})=0.975\).
[1] -1.959964
[1] 1.959964
Voor een standaard normaal verdeelde toevallig veranderlijke valt inderdaad ongeveer \(0.975 - 0.025=0.95\) van de waarden binnen het interval [-2,2], of binnen 2 standaardafwijkingen (\(\sigma=1\)) van het gemiddelde (\(\mu=0\)).
Steekproef
In echte studies kennen we de distributie van een random veranderlijke in de populatie niet!
Omwille van financiƫle en logsitieke beperkingen kunen we bijna nooit de volledige populatie bestuderen.
De populatie parameters (v.b. gemiddeld IQ, variantie van IQ) kunnen daardoor niet zonder onzekerheid worden bepaald.
We kunnen enkel een kleine subset van de populatie bestuderen: de steekproef (engels: sample)
Trek observaties volgens een gestructureerd design: trek de subjecten volledig at random uit de populatie zodat elk subject een gelijke kans heeft om in de steekproef te worden opgenomen \(\rightarrow\) Representatieve steekproef.
Steekproef \(x_1, x_2, . . . , x_{n}\) kan als \(n\) realisatie van dezelfde toevallig veranderlijke \(X\) worden beschouwd voor subjecten \(i = 1,2,...,n\).
De distributie in de populatie is ongekend en moet worden geschat op basis van de steekproef.
Als we aannemen dat de gegevens een bepaalde distributie volgen (b.v. de normale verdeling \(N(\mu,\sigma^2)\)) dan moeten we enkel de populatie parameters (\(\mu\) en \(\sigma^2\)) schatten op basis van de steekproef.
We noemen dit schattingen (engels: estimates) en noteren ze als volgt: \(\hat \mu\) en \(\hat \sigma^2\).
NHANES voorbeeld
Gender in the population
Selecteer \(n=10000\) subjecten at random van de Amerikaanse populatie.
Eens de steekproef is getrokken hebben we \(n\) realisaties geobserveerd voor de toevallig veranderlijke \(X\).
Conventie: Geobserveerde waarden worden met een kleine letter aangeduid \(x\).
\(x\) is een welbepaalde waarde die werd gemeten/geobserveerd in een uitgevoerd experiment en is niet langer een ongekende variabele.
Samenvatting
- Voor we het experiment uitvoeren is de populatie karakteristiek voor de proefpersonen \(1,\ldots,n\) die we uit de populatie zullen trekken ongekend en zijn dat toevallig veranderlijken: \(X_1, \ldots, X_n\)
- Dit is noodzakelijk om te kunnen redeneren over hoe de resultaten van steekproef tot steekproef kunnen wijzigen
- In een steekproef observeren we gerealiseerde uitkomsten \(x_1, x_2, \dots, x_n\): v.b. gender of lengte van subjecten in de steekproef.
Gender Example
library(NHANES)
NHANES %>% ggplot(aes(x=Gender)) + geom_bar()
- Gender is een binaire variabele.
- Het volgt een Bernoulli distibutie.
- De Bernoulli distributie heeft een parameter: het gemiddelde \(\pi\).
- We kunnen \(\pi\) schatten op basis van de steekproef door het steekproefgemiddelde te berekenen \(\bar x = \sum\limits_{i=1}^n x_i\)
- Merk op dat het steekproefgemiddelde zelf een toevallig veranderlijke is! Het wijzigt ook van steekproef tot steekproef!
NHANES %>%
count(Gender) %>%
mutate(probability = n/sum(n))
# A tibble: 2 x 3
Gender n probability
<fct> <int> <dbl>
1 female 5020 0.502
2 male 4980 0.498
Lengte
Empirische distributie
- We kunnen de distributie van de lengte voor volwassen vrouwen schatten aan de hand van het histogram.
NHANES %>%
filter(Gender=="female"&!is.na(Height)&Age>18) %>%
ggplot(aes(x=Height)) +
geom_histogram()
- We kunnen de cumulative distributie functie schatten door gebruik te maken van de empirische cumulatieve distributie functie.
- Elke observatie werd Ć©Ć©n keer geobserveerd in het staal.
- Dus empirische cumulatieve distributie functie van het staal is een discrete distributie met probabiliteit 1/n op elke observatie.
- De empirische cumulatieve distributie functie (ECDF) is gegeven door \[ECDF(x) = \sum\limits_{x_i \leq x} \frac{1}{n} = \frac{\# (x_i \leq x)}{n}\]
NHANES %>%
filter(Gender=="female"&!is.na(Height)&Age>18) %>%
ggplot(aes(x=Height)) +
stat_ecdf()
We kunnen de empische cumulatieve distributie functie gebruiken om kansen te berekenen. Wat is de kans dat een vrouw kleiner is dan 150 cm.
ecdfFem <- NHANES %>%
filter(Gender=="female"&!is.na(Height)&Age>18) %>%
pull("Height") %>%
ecdf
ecdfFem(150)
[1] 0.05222073
- We illustreren dit ook voor een steekproef van grootte 10
set.seed(502)
fem10<- NHANES %>%
filter(Gender=="female"&!is.na(Height)&Age>18) %>%
sample_n(size=10)
fem10 %>%
ggplot(aes(x=Height)) +
stat_ecdf()
ecdfFem10 <- fem10 %>%
pull(Height) %>%
ecdf
ecdfFem10(150)
[1] 0
NHANES %>%
filter(Gender=="female"&!is.na(Height)&Age>18) %>% count(Height <=150) %>%
mutate(prob=n/sum(n))
# A tibble: 2 x 3
`Height <= 150` n prob
<lgl> <int> <dbl>
1 FALSE 3521 0.948
2 TRUE 194 0.0522
[1] 0.05222073
fem10 %>%
count(Height <=150) %>%
mutate(prob=n/sum(n))
# A tibble: 1 x 3
`Height <= 150` n prob
<lgl> <int> <dbl>
1 FALSE 10 1
[1] 0
Normale benadering
In de introductie zagen we dat de lengte metingen een mooie klokvorm hadden.
We kunnen dus aannemen dat de metingen approximatief normaal verdeeld zijn.
We kunnen de verdeling van de lengte metingen ook benaderen d.m.v. een normale distribution.
We moeten hiervoor enkel twee parameters schatten:
- gemiddelde via steekproefgemiddelde (\(\hat\mu=\bar x\))
- variantie via steekproefvariantie (\(\hat{\sigma}^2= s^2\)) of de standaardafwijking d.m.v. steekproef standaarddeviatie (\(\hat\sigma=s\)).
HeightSum <- NHANES %>%
filter(Gender=="female"&!is.na(Height)&Age>18) %>%
summarize(mean=mean(Height),sd=sd(Height))
HeightSum
# A tibble: 1 x 2
mean sd
<dbl> <dbl>
1 162. 7.27
We zien dat de benadering goed werkt:
NHANES %>%
filter(Gender=="female"&!is.na(Height)&Age>18) %>%
ggplot(aes(x=Height)) +
geom_histogram(aes(y=..density.., fill=..count..)) +
xlab("Lengte (cm)") +
stat_function(
fun=dnorm,
color="red",
args=list(
mean=HeightSum$mean[1],
sd=HeightSum$sd[1]
)
)
- We doen nu hetzelfde op basis van de steekproef met de 10 vrouwen.
HeightSum10 <- fem10 %>%
summarize(mean=mean(Height),sd=sd(Height))
HeightSum10
# A tibble: 1 x 2
mean sd
<dbl> <dbl>
1 163. 8.19
fem10 %>%
ggplot(aes(x=Height)) +
geom_histogram(aes(y=..density.., fill=..count..),bins=10) +
xlab("Lengte (cm)") +
stat_function(
fun=dnorm,
color="red",
args=list(
mean=HeightSum10$mean[1],
sd=HeightSum10$sd[1]
)
) +
xlim(130,190)
We kunnen de normale benadering nu ook gebruiken om de kans te berekenen dat een vrouw kleiner is dan 150 cm: Pr(X <= 150).
We doen dit op basis van de volledige steekproef en vergelijken dit uit wat we bekomen met de ECDF.
pnorm(150,HeightSum$mean[1],HeightSum$sd[1])
[1] 0.0484516
[1] 0.05222073
- Op basis van de kleine steekproef:
pnorm(150,HeightSum10$mean[1],HeightSum10$sd[1])
[1] 0.05346615
[1] 0
Voor kleine steekproef is geschatte kans o.b.v. empirische distributie veel minder nauwkeurig.
Kwantielen geschat o.b.v. kleine steekproef zijn immers vrij onzeker. Ze gebruiken immers maar een fractie van de data.
De schatting o.b.v. de normale verdeling laat toe om alle data te gebruiken voor het schatten van de model parameters.
Referentie intervallen
Normale waarden voor de lengte kunnen worden bekomen door gebruik te maken van een referentie interval.
Typisch wordt een 95% referentie interval gebruikt zodat we voor 95% van de subjecten in de populatie verwachten dat ze een karakteristiek hebben die in het referentie interval ligt.
We kunnen dat opnieuw op basis van de empirische distributie.
We moeten hiervoor \(\hat{F}(x_{2.5\%})=0.025\) en \(\hat{F}(x_{97.5\%})=0.975\) berekenen zodat 95% van de observaties in de steekproef vallen in het interval [x_{2.5%},x_{97.5%}].
Dat kan met de quantile
functie.
Grote steekproef
NHANES %>%
filter(Gender=="female"&!is.na(Height)&Age>18) %>%
pull(Height) %>%
quantile(prob=c(0.025,0.975))
2.5% 97.5%
147.6 176.7
fem10 %>%
pull(Height) %>%
quantile(prob=c(0.025,0.975))
2.5% 97.5%
154.7250 178.3275
- Dit interval o.b.v. de kleine steekproef is een ruwe benadering.
- We hebben immers niet voldoende observaties om een goede benadering te hebben voor extreme quantielen.
Normale benadering
qnorm(0.025,mean=HeightSum$mean,sd=HeightSum$sd)
[1] 147.8192
HeightSum$mean - 2 * HeightSum$sd
[1] 147.528
qnorm(0.975,mean=HeightSum$mean,sd=HeightSum$sd)
[1] 176.3237
HeightSum$mean + 2 * HeightSum$sd
[1] 176.6149
qnorm(0.025,mean=HeightSum10$mean,sd=HeightSum10$sd)
[1] 147.1499
qnorm(0.975,mean=HeightSum10$mean,sd=HeightSum10$sd)
[1] 179.2701
Statistieken
Formule die we gebruiken om parameters van de distributie in de populatie te schatten op basis van een steekproef. We refereren hiernaar als statistieken of schatters.
Het numerieke resultaat die wordt bekomen door deze formules te evalueren worden ook statistieken of schattingen genoemd.
Onderzoekers wensen ongekende parameters van de distributie in de populatie te kennen en schatten deze o.b.v. de steekproef.
Omdat we statistieken berekenen o.b.v. de observaties in een steekproef, variƫren statistieken ook van steekproef tot steekproef. Het zijn dus ook random variabelen en we noteren ze dus ook met hoofdletters (b.v. \(\bar X\) voor het steekproefgemiddelde en \(S^2\) voor de steekproefvariantie).
Als we data analyseren moeten we dus nadenken over hoe de statistieken variƫren van steekproef tot steekproef.
Als een statistiek verwijst naar een numerieke waarde die werd gerealiseerd in een bepaalde steekproef dan noteren we deze met een kleine letter: \(\bar x\) en \(s^2\).
Conventie
Populatieparameters nemen vaste waarden aan maar zijn meestal ongekend \(\rightarrow\) Griekse symbolen.
Statistieken waarmee we deze ongekende parameters schatten o.b.v. een steekproef \(\rightarrow\) letters.
Vb Normale verdeling
\(\mu\) |
\(\bar X\) |
\(\sigma^2\) |
\(S^2\) |
LS0tCnRpdGxlOiAiMi4gQ29uY2VwdGVuIgphdXRob3I6ICJMaWV2ZW4gQ2xlbWVudCIKZGF0ZTogInN0YXRPbWljcywgR2hlbnQgVW5pdmVyc2l0eSAoaHR0cHM6Ly9zdGF0b21pY3MuZ2l0aHViLmlvKSIKb3V0cHV0OgogICAgaHRtbF9kb2N1bWVudDoKICAgICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgICB0aGVtZTogY29zbW8KICAgICAgdG9jOiB0cnVlCiAgICAgIHRvY19mbG9hdDogdHJ1ZQogICAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQotLS0KCiMgSW50cm9kdWN0aWUKYGBge3IgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGluY2x1ZGUgPSBUUlVFLCBjb21tZW50ID0gTkEsIGVjaG8gPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KE5IQU5FUykKYGBgCgpgYGB7ciBwb3AyU2FtcDJQb3AsIG91dC53aWR0aD0nODAlJyxmaWcuYXNwPS44LCBmaWcuYWxpZ249J2NlbnRlcicsZWNobz1GQUxTRX0KaWYgKCJwaSIlaW4lbHMoKSkgcm0oInBpIikKa29wdm9ldGVyPC1mdW5jdGlvbih4LHksYW5nbGU9MCxsPS4yLGNleC5kb3Q9LjUscGNoPTE5LGNvbD0iYmxhY2siKQp7CmFuZ2xlPWFuZ2xlLzE4MCpwaQpwb2ludHMoeCx5LGNleD1jZXguZG90LHBjaD1wY2gsY29sPWNvbCkKbGluZXMoYyh4LHgrbCpjb3MoLXBpLzIrYW5nbGUpKSxjKHkseStsKnNpbigtcGkvMithbmdsZSkpLGNvbD1jb2wpCmxpbmVzKGMoeCtsLzIqY29zKC1waS8yK2FuZ2xlKSx4K2wvMipjb3MoLXBpLzIrYW5nbGUpK2wvNCpjb3MoYW5nbGUpKSxjKHkrbC8yKnNpbigtcGkvMithbmdsZSkseStsLzIqc2luKC1waS8yK2FuZ2xlKStsLzQqc2luKGFuZ2xlKSksY29sPWNvbCkKbGluZXMoYyh4K2wvMipjb3MoLXBpLzIrYW5nbGUpLHgrbC8yKmNvcygtcGkvMithbmdsZSkrbC80KmNvcyhwaSthbmdsZSkpLGMoeStsLzIqc2luKC1waS8yK2FuZ2xlKSx5K2wvMipzaW4oLXBpLzIrYW5nbGUpK2wvNCpzaW4ocGkrYW5nbGUpKSxjb2w9Y29sKQpsaW5lcyhjKHgrbCpjb3MoLXBpLzIrYW5nbGUpLHgrbCpjb3MoLXBpLzIrYW5nbGUpK2wvMipjb3MoLXBpLzIrcGkvNCthbmdsZSkpLGMoeStsKnNpbigtcGkvMithbmdsZSkseStsKnNpbigtcGkvMithbmdsZSkrbC8yKnNpbigtcGkvMitwaS80K2FuZ2xlKSksY29sPWNvbCkKbGluZXMoYyh4K2wqY29zKC1waS8yK2FuZ2xlKSx4K2wqY29zKC1waS8yK2FuZ2xlKStsLzIqY29zKC1waS8yLXBpLzQrYW5nbGUpKSxjKHkrbCpzaW4oLXBpLzIrYW5nbGUpLHkrbCpzaW4oLXBpLzIrYW5nbGUpK2wvMipzaW4oLXBpLzItcGkvNCthbmdsZSkpLGNvbD1jb2wpCn0KCnBhcihtYXI9YygwLDAsMCwwKSxtYWk9YygwLDAsMCwwKSkKcGxvdCgwLDAseGxhYj0iIix5bGFiPSIiLHhsaW09YygwLDEwKSx5bGltPWMoMCwxMCksY29sPTAseGF4dD0ibm9uZSIseWF4dD0ibm9uZSIsYXhlcz1GQUxTRSkKcmVjdCgwLDYsMTAsMTAsYm9yZGVyPSJyZWQiLGx3ZD0yKQp0ZXh0KC41LDgsInBvcHVsYXRpb24iLHNydD05MCxjb2w9InJlZCIsY2V4PTIpCnN5bWJvbHMgKDMsIDgsIGNpcmNsZXM9MS41LCBjb2w9InJlZCIsYWRkPVRSVUUsZmc9InJlZCIsaW5jaGVzPUZBTFNFLGx3ZD0yKQpzZXQuc2VlZCgzMzApCmdyaWQ9c2VxKDAsMS4zLC4wMSkKCmZvciAoaSBpbiAxOjUwKQp7CglhbmdsZTE9cnVuaWYobj0xLG1pbj0wLG1heD0zNjApCglhbmdsZTI9cnVuaWYobj0xLG1pbj0wLG1heD0zNjApCglyYWRpdXM9c2FtcGxlKGdyaWQscHJvYj1ncmlkXjIqcGkvc3VtKGdyaWReMipwaSksc2l6ZT0xKQoJa29wdm9ldGVyKDMrcmFkaXVzKmNvcyhhbmdsZTEvMTgwKnBpKSw4K3JhZGl1cypzaW4oYW5nbGUxLzE4MCpwaSksYW5nbGU9YW5nbGUyKQp9CnRleHQoNy41LDgsIkxlbmd0ZSBpbiBwb3B1bGF0aWUiLGNvbD0icmVkIixjZXg9MS4yKQoKcmVjdCgwLDAsMTAsNCxib3JkZXI9ImJsdWUiLGx3ZD0yKQp0ZXh0KC41LDIsInNhbXBsZSIsc3J0PTkwLGNvbD0iYmx1ZSIsY2V4PTIpCnN5bWJvbHMgKDMsIDIsIGNpcmNsZXM9MS41LCBjb2w9InJlZCIsYWRkPVRSVUUsZmc9ImJsdWUiLGluY2hlcz1GQUxTRSxsd2Q9MikKZm9yIChpIGluIDA6MikKCWZvciAoaiBpbiAwOjQpCnsKCglrb3B2b2V0ZXIoMi4xK2oqKDMuOS0yLjEpLzQsMS4xK2kpCn0KdGV4dCg3LjUsMiwiTGVuZ3RlIGluIHN0ZWVrcHJvZWYiLGNvbD0iYmx1ZSIsY2V4PTEuMikKCmFycm93cygzLDUuOSwzLDQuMSxjb2w9ImJsYWNrIixsd2Q9MykKYXJyb3dzKDcsNC4xLDcsNS45LGNvbD0iYmxhY2siLGx3ZD0zKQp0ZXh0KDEuNSw1LCJFWFAuIERFU0lHTiAoMSkiLGNvbD0iYmxhY2siLGNleD0xLjIpCnRleHQoOC41LDUsIlNDSEFUVElORyAmXG5JTkZFUkVOVElFICgzKSIsY29sPSJibGFjayIsY2V4PTEuMikKdGV4dCg3LjUsLjUsIkRBVEEgRVhQTE9SQVRJRSAmXG5CRVNDSFJJSlZFTkRFIFNUQVRJU1RJRUsgKDIpIixjb2w9ImJsYWNrIixjZXg9MS4yKQpgYGAKCgojIyBQcm9lZm9wemV0ICgxKQogICAtIFNjb3BlOiBEZSBvbmRlcnpvZWtlciBiZXBhYWx0IGRlICoqcG9wdWxhdGllKiogbmFhciB3YWFyIHplIGRlIHJlc3VsdGF0ZW4gdmFuIGRlIHN0dWRpZSB3ZW5zZW4gdGUgdmVyYWxnZW1lbmVuLgogICAtIEZpbmFuY2nDq2xlIGFuZCBsb2dpc3RpZWtlIGJlcGVya2luZ2VuICRccmlnaHRhcnJvdyQgKipyZXByZXNlbnRhdGlldmUgc3RlZWtwcm9lZioqIHZhbiBkZSBwb3B1bGF0aWU6IFJhbmRvbWlzYXRpZSEKCiMjIERhdGEgYW5hbHlzaXMgKDIgJiAzKQogICAtICoqRGF0YS1FeHBsb3JhdGllIGVuIEJlc2NocmlqdmVuZGUgU3RhdGlzdGllayAoMikqKjoKCiAgICAgIC0gZXhwbG9yZXJlbiwKICAgICAgLSB2aXN1YWxpc2VyZW4sCiAgICAgIC0gc2FtZW52YXR0ZW4sCiAgICAgIC0gaW56aWNodCB2ZXJ3ZXJ2ZW4gaW4gZGUgZGF0YSwKICAgICAgLSBhYW5uYW1lcyBuYWdhYW4KCiAgIC0gKipTdGF0aXN0aXNjaGUgQmVzbHVpdHZvcm1pbmcgKDMpKiogKHN0YXRpc3RpY2FsIGluZmVyZW5jZSk6CiAgIC0gVmVyYWxnZW1lZW4gd2F0IHdlIG9ic2VydmVyZW4gaW4gZGUgc3RlZWtwcm9lZiBuYWFyIGRlIHBvcHVsYXRpZSB6b2RhdCB3ZSBhbGdlbWVuZSBjb25jbHVzaWVzIGt1bm5lbiB0cmVra2VuIG92ZXIgaGV0IHByb2NlcyBkaWUgd2UgYmVzdHVkZXJlbi4gIAogICAtIEdlYnJ1aWsgdmFuIHN0YXRpc3Rpc2NoZSBtb2RlbGxlbiB2b29yIGRhdGEgYW5hbHlzZSBlbiBvbSBvbnpla2VyaGVpZCB0ZSBrd2FudGlmaWNlcmVuIGVuIHRlIHJhcHBvcnRlcmVuLgoKCi0tLQoKIyMgVm9vcmJlZWxkCgotIE5hdGlvbmFsIEhlYWx0aCBhbmQgTnV0cml0aW9uIEV4YW1pbmF0aW9uIFN1cnZleSAoTkhBTkVTKQotIEFtZXJpY2FhbnNlIGRlbW9ncmFmaXNjaGUgc3R1ZGllCi0gR3Jvb3QgYWFudGFsIHZhbiBmeXNpZWtlLCBkZW1vZ3JhZmlzY2hlLCBudXRyaXRpb25lbGUsIGdlem9uZGhlaWRzIGthcmFrdGVyaXN0aWVrZW4gIAoKYGBge3IgbmhhbmVzLCB0aWR5PUZBTFNFLGVjaG89RkFMU0V9CmxpYnJhcnkoTkhBTkVTKQprbml0cjo6a2FibGUoTkhBTkVTW2MoMSw0LDUsNiw3LDgpLGMoMSwzLDIwLDIzLDM0LDcyKV0sICAgICAKICAgIGZvcm1hdCA9ICJtYXJrZG93biIpCmBgYAoKLS0tCgojIFZhcmlhYmVsZW4KCi0gV2UgbWV0ZW4gKnZhcmlhYmVsZW4qIG9wIHN1YmplY3RlbiBpbiBlZW4gc3RlZWtwcm9lZgotIEVlbiBWYXJpYWJlbGUgaXMgZWVuIGthcmF0ZXJpc3RpZWsgYi52LiBMZW5ndGUsIERpcmVjdCBjaG9sZXN0ZXJvbCwgQWdlLCBHZW5kZXIsIC4uLgotIEhldCB2YXJpZWVydCB2YW4gc3ViamVjdCB0b3Qgc3ViamVjdCBpbiBkZSBwb3B1bGF0aWUgZW4gaXMgZHVzIG9vayBpbiBkZSBzdGVla3Byb2VmIGVuIHR1c3NlbiBzdGVla3Byb2V2ZW4uCgoKIyMgKlR5cGVzKiB2YW4gdmFyaWFiZWxlbgoKMS4gKkt3YWxpdGF0aWV2ZSB2YXJpYWJlbGVuKjogZWVuIGJlcGVya3QgYWFudGFsIGNhdGVnb3JpZcOrbiwgbmlldCBudW1lcmllay4KCS0gICpub21pbmFsZSB2YXJpYWJlbGVuKjogZ2VlbiBuYXR1dXJsaWprZSBvcmRlbmluZywgdi5iLiAgR2VuZGVyLCBibG9vZCBncm91cCwgLi4uCgktICAqb3JkaW5hbGUgdmFyaWFiZWxlbio6IG9yZGVuaW5nLCB2LmIuIEJNSSBjbGFzcywgc21va2luZyBzdGF0dXMgKDE6IG5ldmVyIHNtb2tlZCwgMjogc3RvcHBlZCBzbW9raW5nLCAzOiBzbW9rZXIpCgoyLiAqTnVtZXJpZWtlIHZhcmlhYmVsZW4qOgogICAJLSAqZGlzY3JldGUgdmFyaWFiZWxlbio6IHRlbGxpbmdlbiB2LmIuIG51bWJlciBvZiBwYXJ0bmVycyBpbiBsaWZlIHNwYW4sIC4uLgoJLSAqY29udGludWUgdmFyaWFiZWxlbio6IGt1bm5lbiAoaW4gdGhlb3JpZSkgZWxrZSBtb2dlbGlqa2Ugd2FhcmRlIGFhbm5lbWVuIGJpbm5lbiBiZXBhYWxkZSBncmVuemVuIHYuYi4gQWdlLCBIZWlnaHQsIFdlaWdodCwgQk1JLCBEaXJlY3QgQ2hvbGVzdG9yb2wuLi4KCgktIFNvbXMgZGljaG90b21pc2VyZW4gbmFhciBlZW4gbm9taW5hbGUga3dhbGl0YXRpZXZlIHZhcmlhYmVsZSAkXHJpZ2h0YXJyb3ckIGluZm9ybWF0aWV2ZXJsaWVzOiBCTUkgJFxyaWdodGFycm93JCBCTUkgY2xhc3MKCi0tLQoKIyBQb3B1bGF0aWUKCi0gRG9lbCB2YW4gd2V0ZW5zY2hhcHBlbGlqa2Ugc3R1ZGllOiB1aXRzcHJha2VuIGRvZW4gb3ZlciBkZSBhbGdlbWVuZSBwb3B1bGF0aWUuCgotIFYuYi4gbmFnYWFuIG9mIGRlIGxlbmd0ZSB0dXNzZW4gbWFubmVuIGVuIHZyb3V3ZW4gZ2VtaWRkZWxkIHZlcnNjaGlsbGVuZCBpcy4KCgotIFBvcHVsYXRpZSBpcyBlZW4gdGhlb3JldGlzY2ggY29uY2VwdAoJLSBJcyBtZWVzdGFsIGNvbnRpbnUgaW4gdmVyYW5kZXJpbmcKCS0gVmFhayBvb2sgaW50ZXJlc3NlIGluIHRvZWtvbXN0aWdlIHN1YmplY3RlbiAkXHJpZ2h0YXJyb3ckIGR1cyBvcCBiZXBhYWxkIG9nZW5ibGlrIG5pZXQgdm9sbGVkaWcgb2JzZXJ2ZWVyYmFhcgogIAktIGthbiBhbHMgb25laW5kaWcgZ3Jvb3Qgd29yZGVuIGJlc2Nob3V3ZAoKLSBQb3B1bGF0aWUgZHVpZGVsaWprIG9tc2NocmlqdmVuISAgCgojIyBQb3B1bGF0aWUgZHVpZGVsaWprIG9tc2NocmlqdmVuCgoqSW5jbHVzaWVjcml0ZXJpYSogemlqbiBrYXJha3RlcmlzdGlla2VuIGRpZSBlZW4gc3ViamVjdC9leHBlcmltZW50ZWxlIGVlbmhlaWQgbW9ldCBoZWJiZW4gb20gdG90IGRlIHBvcHVsYXRpZSB0ZSBiZWhvcmVuLCBiLnYuCgotIGxlZWZ0aWpkc2NhdGVnb3JpZSA0NS02NQotIG5vcm1hYWwgQk1JCi0gLi4uCgoqRXhjbHVzaWVjcml0ZXJpYSogemlqbiBrYXJha3RlcmlzdGlla2VuIGRpZSBlZW4gc3ViamVjdC9leHBlcmltZW50ZWxlIGVlbmhlaWQgbmlldCBtYWcgaGViYmVuIG9tIHRvdCBkZSBwb3B1bGF0aWUgdGUgYmVob3JlbiwgYi52LgoKLSBkaWFiZXRlcwotIGhpc3RvcmllayB2YW4gaGFyZCBkcnVncwotIGxhZ2UgZ2V6b25kaGVpZHNzdGF0dXMKLSBzbGFhcHByb2JsZW1lbgotIC4uLgoKLS0tCgojIFRvZXZhbHN2ZXJhbmRlcmxpamtlbiAodG9ldmFsbGlnZSB2ZXJhbmRlcmxpamtlbikKCi0gVmFyaWFiZWxlbiAodmIgU3lzdG9saXNjaGUgYmxvZWRkcnVrKSB2YXJpw6tyZW4gaW4gZGUgcG9wdWxhdGllIHZhbiBzdWJqZWN0IHRvdCBzdWJqZWN0IQpcdnNwYWNlezE1cHR9Ci0gVmFyaWFiZWxlbiB6aWpuIGR1cyAqcmFuZG9tIG9mIHZlcmFuZGVybGlqayogYWFuZ2V6aWVuIGh1biB3YWFyZGUgdmVyYW5kZXJsaWprIGlzIGluIGRlIHBvcHVsYXRpZQpcdnNwYWNlezE1cHR9Ci0gKipDcnVjaWFsZSB2cmFhZyoqOiBIb2UgbmF1d2tldXJpZyB6aWpuIHVpdHNwcmFrZW4gb3ZlciBkZSBwb3B1bGF0aWUgby5iLnYuIGVlbiBncm9lcCBnZW1ldGVuIHN1YmplY3RlbiBpbiBlZW4gc3RlZWtwcm9lZiEKXHZzcGFjZXsxNXB0fQotIFdlIHp1bGxlbiBkdXMgc3RlZWRzIHZlcnNjaGlsbGVuIHppZW4gdmFuIHN0ZWVrcHJvZWYgdG90IHN0ZWVrcHJvZWYKXHZzcGFjZXsxNXB0fQotIFNwcmVpZGluZyBvcCBnZWdldmVucyBzcGVlbHQgY3J1Y2lhbGUgcm9sCgotLS0KCiMjIENvbnZlbnRpZQoKLSBHZWJydWlrIGhvb2ZkbGV0dGVycyBvbSBhYW4gdGUgZ2V2ZW4gZGF0IGJlc3R1ZGVlcmRlIGthcmFrdGVyaXN0aWVrICh2Yi4gc3lzdG9saXNjaGUgYmxvZWRkcnVrKSB2YXJpYWJlbCBpcyBpbiBkZSBwb3B1bGF0aWUgem9uZGVyIGRhYXJiaWogY29uY3JlZXQgb3ZlciBkZSBnZXJlYWxpc2VlcmRlIHdhYXJkZSB2b29yIGVlbiBiZXBhYWxkIHN1YmplY3QgbmEgdGUgZGVua2VuLgpcdnNwYWNlezE1cHR9Ci0gVmFyaWFiZWxlICRYJCB3b3JkdCBhbGdlbWVlbiBlZW4gKnRvZXZhbHN2ZXJhbmRlcmxpamtlKiBnZW5vZW1kOiBpcyBmb3JtZWVsCnJlc3VsdGFhdCB2YW4gZWVuICp0b2V2YWxsaWdlIHRyZWtraW5nKiB2YW4gZWVuIGJlcGFhbGRlCmthcmFrdGVyaXN0aWVrIHVpdCBkZSBzdHVkaWVwb3B1bGF0aWUuClx2c3BhY2V7MTVwdH0KLSAgRWVuIHRvZXZhbHN2ZXJhbmRlcmxpamtlICRYJCBrYW4gbWVuIGR1cyBvcHZhdHRlbiBhbHMgb25iZWtlbmRlIHZlcmFuZGVybGlqa2UgZGllIGVlbiBtZXRpbmcgdm9vcnN0ZWx0IGRpZSB3ZSBwbGFubmVuIHRlIHZlcnphbWVsZW4gYmlqIGVlbiByYW5kb20gc3ViamVjdCwgbWFhciBub2cgbmlldCBoZWJiZW4gdmVyemFtZWxkLgpcdnNwYWNlezE1cHR9Ci0gTm9vZHpha2VsaWprIG9tIHRlIGt1bm5lbiByZWRlbmVyZW4gaG9lIHJlc3VsdGF0ZW4gdmFuIHN0ZWVrcHJvZWYgdG90IHN0ZWVrcHJvZWYga3VubmVuIHdpanppZ2VuClx2c3BhY2V7MTVwdH0KLSBUb2V2YWxsaWcgdmVyYW5kZXJsaWprZW4ga3VubmVuIGt3YWxpdGF0aWVmLCBrd2FudGl0YXRpZWYsIGRpc2NyZWV0LCBjb250aW51LCAuLi4uIHppam4KCi0tLQoKCiMgQmVzY2hyaWp2ZW4gdmFuIGRlIHBvcHVsYXRpZQoKLSBWb29yIHdlIGVlbiByYW5kb20gdmFyaWFiZWxlIG1ldGVuIGlzIGhldCBvbm1vZ2VsaWprIGV4YWN0IHRlIHZvb3JzcGVsbGVuIGhvZSBob29nIHplIHphbCB6aWpuLgoKLSBHZXJlYWxpc2VlcmRlIHdhYXJkZSB2YW4gJFgkIGlzIG9uZGVyaGV2aWcgYWFuIHJhbmRvbSB2YXJpYWJpbGl0ZWl0CgotIEFscyB3ZSB3ZXRlbiBob2UgZGUgdmFyaWFiZWxlIHZlcmRlZWxkIGlzIGRhbiBrdW5uZW4gd2UgcHJvYmFiaWxpdGVpdHN0aGVvcmllIGdlYnJ1aWtlbiBvbSBkZSBrYW5zIHRlIGJlcmVrZW5lbiBkYXQgZWVuIGJlcGFhbGQgdm9vcnZhbCAoZXZlbnQpIHppY2ggdm9vcmRvZXQ6IHZiIHdhdCBpcyBkZSBrYW5zIGRhdCBoZXQgSVEgdmFuIGVlbiByYW5kb20gc3ViamVjdCB1aXQgZGUgcG9wdWxhdGllIGtsZWluZXIgb2YgZ2VsaWprIGlzIGFhbiA4MC4KCi0gTm90YXRpZToKCiAgICAtIEV2ZW50OiAkWCBcbGVxIDgwJAogICAgLSBQcm9iYWJpbGl0ZWl0IG9wIGV2ZW50OiAkUHIoWCBcbGVxIDgwKSQKCi0tLQoKIyNJbnRlcm1lenpvIHByb2JhYmlsaXRlaXRzdGhlb3JpZQoKIyMjIERpc2NyZXRlIHRvZXZhbGxpZyB2ZXJhbmRlcmxpamtlbgoKLSBTdGVsIGRhdCB3ZSBlZW4gZGlzY3JldGUgcmFuZG9tIHZhcmlhYmVsZSBtZXRlbiAkWCQKCi0gQWxsZSBtb2dlbGlqa2Ugd2FhcmRlbiB2b29yICRYJCB3b3JkZW4gZGUgc3RlZWtwcm9lZnJ1aW10ZSAgJFxPbWVnYSQgZ2Vub2VtZC4KCiAgICAtIFZvb3IgR2VuZGVyIGlzIGRlIHN0ZWVrcHJvZWZydWltdGUgJFxPbWVnYT0oMCwxKSQgIG1ldCAwICh2cm91dykgb3IgMSAobWFuKS4KICAgIC0gVm9vciBoZXQgd2VycGVuIHZhbiBlZW4gZG9iYmVsc3RlZW4gaXMgZGUgc3RlZWtwcm9lZnJ1aW10ZSAkXE9tZWdhPSgxLDIsMyw0LDUsNikkLgoKCi0gRWVuIGV2ZW50ICRBJCAgaXMgZWVuIHN1YnNldCB2YW4gZGUgc3RlZWtwcm9lZnJ1aW10ZQoKICAgICAgLSBFZW4gZXZlbiBnZXRhbCB3ZXJwZW4gbWV0IGVlbiBkb2JiZWxzdGVlbjogJEE9KDIsNCw2KSQuCiAgICAgIC0gS2FuIG9vayBlZW4gc3BlY2lmaWVrZSB3YWFyZGUgemlqbiAkQT0oMSkkLgoKCi0gRXZlbnQgcnVpbXRlICRcbWF0aGNhbHtBfSQgaXMgZGUga2xhc3NlIHZhbiBhbGxlIG1vZ2VsaWprZSBldmVudHMgZGllIGt1bm5lbiBvcHRyZWRlbiBiaWogZWVuIGJlcGFhbGQgZXhwZXJpbWVudC4KCi0gVHdlZSBldmVudHMgKCRBXzEkIGVuICRBXzIkKSB6aWpuIG11bHR1ZWVsIGV4Y2x1c2llZiBhbHMgemUgbmlldCBzYW1lbiBvcCBrdW5uZW4gdHJlZGVuLgoKICAgIC0gdi5iLiBldmVudCB2YW4gZGUgb25ldmVuIGdldGFsbGVuICRBXzE9KDEsMyw1KSQgZW4gaGV0IGV2ZW50IG9tICRBXzI9KDYpJCB0ZSBnb29pZW4uCiAgICAtIER1cyAkQV8xIFxiaWdjYXAgQV8yPVxlbXB0eXNldCQuCgoKLSBQcm9iYWJpbGl0ZWl0ICRQcihBKSQgIGlzIGVlbiBmdW5jdGlvbiAkUHI6IEEgXHJpZ2h0YXJyb3cgWzAsMV0kIGRpZSB2b2xkb2V0IGFhbgoKICAgIDEuICRQcihBKSBcZ2VxIDAkIGVuICRQcihBKSBcbGVxIDEkIHZvb3IgZWxrZSAkQSBcaW4gXG1hdGhjYWx7QX0kCiAgICAyLiAkUHIoXE9tZWdhKT0xJAogICAgMy4gVm9vciBtdWx0dWVlbCBleGNsdXNpZXZlIGV2ZW50cyAkQV8xLCBBXzIsIFxsZG90cyBBX2skIGdlbGR0IGRhdCAkUHIoQV8xIFxjdXAgQV8yIFxsZG90cyBcY3VwIEFfayk9IFByKEFfMSkgKyBcbGRvdHMgKyBQcihBX2spJAoKCi0gRG9iYmVsc3RlZW4gdm9vcmJlZWxkCgogICAgLSBvbmV2ZW4gbnVtYmVyICRBPSgxLDMsNSkkOiBpcyBkZSB1bmllIHZhbiAzIG11bHR1ZWVsIGV4Y2x1c2lldmUgZXZlbnRzICRBXzE9MSQsICRBXzI9MyQgZW4gJEFfMz01JCB6b2RhdAogICAgJFByKEEpPVByKDEpK1ByKDMpK1ByKDUpPTEvNisxLzYrMS82PTAuNSQKICAgIC0gJFxPbWVnYT0oMSwyLDMsNCw1LDYpJDogJFByKFxPbWVnYSk9MSQKCgotIEFscyB3ZSB0d2VlIHN1YmplY3RlbiAoaiBlbiBrKSBvbmFmaGFua2VsaWprIHRyZWtrZW4gdmFuIGRlIHBvcHVsYXRpZSBkYW4gaXMgZGUgZ2V6YW1lbGlqa2UgcHJvYmFiaWxpdGVpdAokUChYX2osWF9rKT0gUChYX2opUChYX2opJAoKLS0tCgojIyMjIERpc3RyaWJ1dGllIG9mIHZlcmRlbGluZwoKLSBEZSBkaXN0cmlidXRpZSBvZiBkZSB2ZXJkZWxpbmcgdmFuIGVlbiBkaXNjcmV0ZSB0b2V2YWxsaWcgdmVyYW5kZXJsaWprZSAkWCQgYmVzY2hyaWpmdCBkZSBrYW5zIG9wIGVsa2UgbW9nZWxpamtlIHdhYXJkZSB2YW4gZGUgc3RlZWtwcm9lZnJ1aW10ZS4gIAoKLSBWb29yYmVlbGQ6IEdlbmRlciBpcyBlZW4gYmluYWlyZSB2YXJpYWJlbGUgKDA6IHZyb3V3LCAxOiBtYW4pIGVuIGJpbmFpcmUgdmFyaWFiZWxlbiB2b2xnZW4gZWVuIEJlcm5vdWxsaSB2ZXJkZWxpbmcuIDUwLjglIHZhbiBkZSBzdWJqZWN0ZW4gaW4gZGUgQW1lcmlrYWFuc2UgcG9wdWxhdGllIHppam4gdnJvdXcgZW4gNDkuMiUgaXMgbWFuLgoKLSBMYWF0ICRccGkkIGRlIHByb2JhYmlsaXRlaXQgemlqbiBvcCBlZW4gbWFuICRccGk9MC40OTIkLgogICAgJCQgWFxzaW0gXGxlZnQgXHsKICAgIFxiZWdpbnthcnJheX17bGNsfQogICAgUChYPTApICY9JiAxLVxwaVxcCiAgICBQKFg9MSkgJj0mIFxwaQogICAgXGVuZHthcnJheX0gXHJpZ2h0IC4gJCQKCiAgICBgYGB7cn0KICAgIHRpYmJsZShYPWMoMCwxKSxwcm9iPWMoMC41MDgsMC40OTIpKSAlPiUKICAgICAgZ2dwbG90KGFlcyh4PVgseGVuZD1YLHk9MCx5ZW5kPXByb2IpKSArCiAgICAgIGdlb21fc2VnbWVudCgpICsKICAgICAgeWxhYigiUHJvYmFiaWxpdHkiKQogICAgYGBgCgpUb2V2YWxsaWcgdmVyYW5kZXJsaWprZSAkWCQgdm9sZ3QgZWVuIEJlcm5vdWxsaSB2ZXJkZWxpbmcgJEIoXHBpKSQgbWV0IHBhcmFtZXRlciAkXHBpPTAuNDkyJCwKICAgICQkQihccGkpPSBccGleeCgxLVxwaSleeygxLXgpfSQkCgotLS0KCiMjIyMgQ3VtdWxhdGl2ZSBkaXN0cmlidXRpZSBmdW5jdGllCgotIERlIGN1bXVsYXRpdmUgZGlzdHJpYnV0aWUgZnVuY3RpZSBGKHgpIGdlZWZ0IGRlIHByb2JhYmlsaXRlaXQgd2VlciBvbSBlZW4gcmFuZG9tIHZhcmlhYmxlIFggdGUgb2JzZXJ2ZXJlbiB3YWFydm9vciBnZWxkdCBkYXQgJFhcbGVxIHgkOgokJCBGKHgpID0gXHN1bVxsaW1pdHNfe1xmb3JhbGwgWFxsZXEgeH0gUCh4KSQkCgotIEdlbmRlciB2b29yYmVlbGQgJEYoMCk9MS1ccGkkIGFuZCBGKDEpPSBQKFg9MCkgKyBQKFg9MSk9MQoKICAgIGBgYHtyfQogICAgdGliYmxlKFg9YygwLDEpLGN1bXByb2I9YygwLjUwOCwxKSkgJT4lCiAgICAgIGdncGxvdChhZXMoeD1YLHhlbmQ9WCx5PTAseWVuZD1jdW1wcm9iKSkgKwogICAgICBnZW9tX3NlZ21lbnQoKSArCiAgICAgIHlsYWIoIkYoeCkiKQogICAgYGBgCgotIERvYmJlbHN0ZWVuOgoKICAgIGBgYHtyfQogICAgdGliYmxlKFg9MTo2LGN1bXByb2I9Y3Vtc3VtKHJlcCgxLzYsNikpKSAlPiUKICAgICAgZ2dwbG90KGFlcyh4PVgseGVuZD1YLHk9cmVwKDAsNikseWVuZD1jdW1wcm9iKSkgKwogICAgICBnZW9tX3NlZ21lbnQoKSArCiAgICAgIHlsYWIoIkYoeCkiKQogICAgYGBgCgotLS0KCiMjIyMgR2VtaWRkZWxkZQoKSGV0IGdlbWlkZGVsZGUgb2YgZGUgdmVyd2FjaHRlIHdhYXJkZSAkRVtYXSQgdmFuIGVlbiBkaXNjcmV0ZSB0b2V2YWxsaWcgdmVyYW5kZXJsaWprZSAkWCQgaXMgZ2VnZXZlbiBkb29yOgoKJCRFW1hdPVxzdW1cbGltaXRzX3t4XGluXE9tZWdhfSB4IFAoWD14KSQkCgotIEdlbmRlciB2b29yYmVlbGQKCiAgICAtICRFW1hdPSAwIFx0aW1lcyAoMS1ccGkpICsgMSBcdGltZXMgKFxwaSkgPSBccGkkCiAgICAtIFRoZSBtZWFuIGVxdWFscyAkRVtYXT0wLjQ5MiQuCgotIERvYmJlbHN0ZWVuOgoKJEVbWF09IDEgXHRpbWVzIFxmcmFjezF9ezZ9ICsgMiBcdGltZXMgXGZyYWN7MX17Nn0gKyBcbGRvdHMgKyA2IFx0aW1lcyBcZnJhY3sxfXs2fSA9JCBgciBzdW0oMTo2KS82YAoKLS0tCgojIyMjIFZhcmlhbnRpZQoKRGUgdmFyaWFudGllIGlzIGVlbiBtYWF0IHZvb3IgZGUgdmFyaWFiaWxpdGVpdCB2YW4gZWVuIHRvZXZhbGxpZyB2ZXJhbmRlcmxpamtlIGVuIHdvcmR0IGdlZ2V2ZW4gZG9vcjoKCiQkRVsoWC1FW1hdKV4yXT1cc3VtXGxpbWl0c197eFxpblxPbWVnYX0gKHgtRVtYXSleMiBQKFg9eCkkJAoKLSBHZW5kZXIgdm9vcmJlZWxkCiAgICBcYmVnaW57ZXFuYXJyYXl9CiAgICBFWyhYLUVbWF0pXjJdJj0mKDAtXHBpKV4yXHRpbWVzICgxLVxwaSkrKDEtXHBpKV4yIFx0aW1lcyBccGlcXAogICAgJj0mIFxwaV4yICgxLVxwaSkgKyAoMS1ccGkpXjIgXHBpXFwKICAgICY9JlxwaSAoMS1ccGkpKFxwaSsxLVxwaSlcXAogICAgJj0mXHBpKDEtXHBpKQogICAgXGVuZHtlcW5hcnJheX0KCi0tLQoKIyMjIENvbnRpbnVlIHRvZXZhbGxpZyB2ZXJhbmRlcmxpamtlCgoKLSBFZW4gY29udGludWUgdG9ldmFsbGlnIHZlcmFuZGVybGlqa2Uga2FuIGJpbm5lbiBiZXBhYWxkZSBncmVuemVuIGFsbGUgbW9nZWxpamtlIHdhYXJkZW4gYWFubmVtZW4uCgotIERlIGthbnMgb20gZXhhY3Qgw6nDqW4gYmVwYWFsZGUgd2FhcmRlIGFhbiB0ZSBuZW1lbiBpcyBkYWFyb20gZ2VsaWprIGFhbiAwLgoKLSBEZSBkaXN0cmlidXRpZSAodmVyZGVsaW5nKSB3b3JkdCBkYWFyb20gd2VlcmdlZ2V2ZW4gYS5kLmgudi4gZGUgZGVuc2l0ZWl0c2Z1bmN0aWUgb2YgZGUgZGljaHRoZWlkc2Z1bmN0aWUgJGYoeCkkCgotIFZlZWwgYmlvbG9naXNjaGUga2FyYWt0ZXJpc3RpZWtlbiB6aWpuIGFwcHJveGltYXRpZWYgbm9ybWFhbCB2ZXJkZWVsZCAobGVuZ3RlLCBibG9lZGRydWssIElRLCBjb25jZW50cmF0aWUgbWV0aW5nZW4gbmEgbG9nYXJpdG1pc2NoZSB0cmFuc2Zvcm1hdGllKQogICAgJCRmKHgpID0gXGZyYWN7MX17XHNxcnR7MlxwaVxzaWdtYV4yfX0gZV57LVxmcmFjeyh4LVxtdSleMn17MlxzaWdtYV4yfX0kJAoKLSBEYXQgd29yZHQga29ydCBnZW5vdGVlcmQgYWxzICRmKHgpID0gTihcbXUsXHNpZ21hXjIpJAoKLSBWYW4gaGV0IElRIGlzIGdld2V0ZW4gZGF0IGhldCBub3JtYWxlIHZlcmRlbGluZyB2b2xndCBtZXQgZ2VtaWRkZWxkZSAkXG11PTEwMCQgZW4gc3RhbmRhYXJkYWZ3aWpraW5nICRcc2lnbWE9MTUkLiAgCiQkSVEgXHNpbSBOKDEwMCwxNV4yKSQkCgoKLSBJbiBSIGt1bm5lbiB3ZSBkZSBkbm9ybSBmdW5jdGllIGdlYnJ1aWtlbiBvbSBkZSBkZW5zaXRlaXQgdGUgYmVyZWtlbmVuIHZvb3IgZWVuIGJlcGFhbGRlIHdhYXJkZSBYPXguCgotIERlIGFyZ3VtZW50ZW4gdmFuIGBkbm9ybWAgemlqbiBgbWVhbmAgKCRcbXUkKSBlbiBgc2RgIChzdGFuZGFhcmRhZndpamtpbmcgJFxzaWdtYSQpLgoKYGBge3IgSVEsIGZpZy5hbGlnbj0nY2VudGVyJ30KaXEgPC0gdGliYmxlKAogIElRID0gc2VxKDQwLDE1MCwuMSksCiAgRGVuc2l0ZWl0ID0gZG5vcm0oc2VxKDQwLDE1MCwuMSksbWVhbj0xMDAsc2Q9MTUpCiAgKQppcSAlPiUKICBnZ3Bsb3QoYWVzKHg9SVEseT1EZW5zaXRlaXQpKSArCiAgZ2VvbV9saW5lKCkKYGBgCgotIEJpbm5lbiBiZXBhYWxkZSBncmVuemVuIGt1bm5lbiBjb250aW51ZSB0b2V2YWxsaWcgdmVyYW5kZXJsaWprZW4gYWxsZSBtb2dlbGlqa2Ugd2FhcmRlbiBhYW5uZW1lbiBkdXMgaXMgJFxPbWVnYSQgb25laW5kaWcgZ3Jvb3QuCgotLS0KCiMjIyNDdW11bGF0aWV2ZSBkaXN0cmlidXRpZQoKLSBPcG5pZXV3IGlzIGRlIGN1bXVsYXRpZXZlIGRpc3RyaWJ1dGllICRGKFgpPVByKFhcbGVxIHgpJC4KCi0gT21kYXQgWCBjb250aW51IGlzIGJlcmVrZW5lbiB3ZSBkZXplIHByb2JhYmlsaXRlaXQgYS5kLmgudi4gZWVuIGludGVncmFhbAokJEYoeCk9XGludCBcbGltaXRzX3stXGluZnR5fV54IGYoeCkgZHgkJAoKLSBNZXJrIG9wIGRhdCAkZih4KT0wJCBhbHMgeCBuaWV0IHRvdCBkZSBzdGVla3Byb2VmcnVpbXRlIGJlaG9vcmQuCgotIFdlIGt1bm5lbiAkRih4KSQgYmVyZWtlbmVuIHZvb3IgZWVuIG5vcm1hYWwgdmVyZGVlbGRlIHRvZXZhbGxpZyB2ZXJhbmRlcmxpamtlIG1ldCBkZSBmdW5jdGllIGBwbm9ybWAgZGllIG9wbmlldXcgYXJndW1lbnRlbiBgbWVhbmAgZW4gYHNkYCBoZWVmdC4KCmBgYHtyfQppcSAlPiUKICBtdXRhdGUoUHJvYmFiaWxpdHk9cG5vcm0oSVEsbWVhbj0xMDAsc2Q9MTUpKSAlPiUKICBnZ3Bsb3QoYWVzKHg9SVEseT1Qcm9iYWJpbGl0eSkpICsKICBnZW9tX2xpbmUoKQpgYGAKCkRlIHByb2JhYmlsaXRlaXQgZGF0IGhldCBJUSB2YW4gZWVuIHJhbmRvbSBzdWJqZWN0IGxhZ2VyIGlzIGRhbiA4MCB3b3JkdCBpbiBSIGJlcmVrZW5kIGRvb3IKCmBgYHtyfQpwbm9ybSg4MCxtZWFuPTEwMCxzZD0xNSkKYGBgCgpgYGB7ciBmaWcuYWxpZ249J2NlbnRlcicsZWNobz1GQUxTRX0KZ3JpZCA8LSBzZXEoNDAsMTUwLC4xKQpncmlkMiA8LSBzZXEoNDAsODAsLjAxKQpwbG90KGdyaWQsZG5vcm0oZ3JpZCxtZWFuPTEwMCxzZD0xNSksCiAgICAgeGxhYj0iSVEiLAogICAgIGNvbD0yLHlsYWI9IkRlbnNpdGVpdCIsdHlwZT0ibCIsbHdkPTIsY2V4LmxhYj0xLjUsY2V4LmF4aXM9MS41KQpwb2x5Z29uKHg9YyhncmlkMiw4MCw0MCkseT1jKGRub3JtKGdyaWQyLDEwMCwxNSksMCwwKSxjb2w9Mixib3JkZXI9MikKdGV4dCg4MCxkbm9ybSg4MCxtZWFuPTEwMCxzZD0xNSkscGFzdGUwKCJQKFggPCA4MCkgPSAiLHJvdW5kKHBub3JtKDgwLDEwMCwxNSkqMTAwLDEpLCIlIiksY29sPTIsY2V4PTEuNSxwb3M9NCkKYGBgCgpgYGB7ciBmaWcuYWxpZ249J2NlbnRlcicsZWNobz1GQUxTRX0KcGxvdChncmlkLHBub3JtKGdyaWQsbWVhbj0xMDAsc2Q9MTUpLHR5cGU9ImwiLHhsYWI9IklRIix5bGFiPSJQcm9iYWJpbGl0eSIsbHdkPTIsY29sPTIpCmxpbmVzKGMoODAsODAsODAsMCksYygwLHJlcChwbm9ybSg4MCwxMDAsMTUpLDMpKSxsdHk9MikKYGBgCgotIFZvb3IgZGUgZ3Jvb3RzdCBtb2dlbGlqa2Ugd2FhcmRlIHZvb3IgJFgkIGludGVncmVyZW4gd2Ugb3ZlciBkZSB2b2xsZWRpZ2Ugc3RlZWtwcm9lZnJ1aW10ZSAkXE9tZWdhJCBkdXMKJCRcaW50IFxsaW1pdHNfe3ggXGluIFxPbWVnYX0gZih4KSBkeD0xJCQKCi0gRGUgb3BwZXJ2bGFrdGUgb25kZXIgZGUgZGljaHRoZWlkc2Z1bmN0aWUgaXMgZHVzIDEhCgotLS0KCiMjIyMgR2VtaWRkZWxkZSBlbiB2YXJpYW50aWUKCi0gSGV0IGdlbWlkZGVsZGUgb2YgZGUgdmVyd2FjaHRlIHdhYXJkZSBpcwoKJCRcaW50IFxsaW1pdHNfe3ggXGluIFxPbWVnYX0geCBmKHgpIGR4JCQKCi0gVm9vciBkZSBub3JtYWxlIGRpc3RyaWJ1dGllCiQkXGludCBcbGltaXRzX3stXGluZnR5fV57K1xpbmZ0eX0geCBmKHgpIGR4ID0gXG11JCQKCi0gRGUgdmFyaWFuY2UgJEVbKFgtRVtYXSleMl0kICAgCgokJFxpbnQgXGxpbWl0c197eCBcaW4gXE9tZWdhfSAoeC1FW1hdKV4yIGYoeCkgZHgkJAoKLSBWb29yIGRlIG5vcm1hbGUgZGlzdHJpYnV0aWUgYmVrb21lbiB3ZQoKJCRcaW50IFxsaW1pdHNfey1caW5mdHl9XnsrXGluZnR5fSAoeC1cbXUpXjIgZih4KSBkeCA9IFxzaWdtYV4yJCQKCi0gSGV0IGlzIHZhYWsgbW9laWxpamsgb20gZGUgdmFyaWFudGllIHRlIGludGVycHJldGVyZW4gZ2V6aWVuIHplIG5pZXQgaW4gZGUgemVsZmRlIGVlbmhlZGVuIHN0YWF0IGFscyBoZXQgZ2VtaWRkZWxkZS4gRGFhcm9tIHdlcmtlbiB3ZSB2YWFrIG1ldCBkZSBzdGFuZGFhcmRhZndpamtpbmc6CgokJFNEPVxzcXJ0e0VbKFgtRVtYXSleMl19JCQKCgpERSBTRCB2b29yIGRlIG5vcm1hbGUgZGlzdHJpYnV0aWUsICRcc2lnbWEkIGhlZWZ0IGRlIG1vb2llIGludGVycHJldGF0aWUgZGF0IG9uZ2V2ZWVyIDY4JSB2YW4gZGUgcG9wdWxhdGllIGVlbiB3YWFyZGUgaGVlZnQgdm9vciBkZSBrYXJha3RlcmlzdGllayBYIGJpbm5lbiBoZXQgaW50ZXJ2YWwgdmFuIDEgc3RhbmRhYXJkYWZ3aWpraW5nKCRcc2lnbWEkKSByb25kIGhldCBnZW1pZGRlbGRlOgoKJCRQKFxtdS1cc2lnbWEgPCBYIDwgXG11ICsgXHNpZ21hKSBcYXBwcm94IDAuNjgkJAoKCmBgYHtyIGZpZy5hbGlnbj0nY2VudGVyJyxlY2hvPUZBTFNFfQpncmlkMjwtc2VxKDg1LDExNSwuMDEpCnBsb3QoZ3JpZCxkbm9ybShncmlkLG1lYW49MTAwLHNkPTE1KSwKICAgICB4bGFiPSJJUSIsCiAgICAgY29sPTIseWxhYj0iRGVuc2l0ZWl0Iix0eXBlPSJsIixsd2Q9MixjZXgubGFiPTEuNSxjZXguYXhpcz0xLjUpCnBvbHlnb24oeD1jKGdyaWQyLDExNSw4NSkseT1jKGRub3JtKGdyaWQyLDEwMCwxNSksMCwwKSxjb2w9ImdyZXkiLGJvcmRlcj0iZ3JleSIpCnRleHQoMTE1LGRub3JtKDExNSxtZWFuPTEwMCxzZD0xNSkscGFzdGUwKCJQKDg1PFg8MTE1KSA9ICIscm91bmQoKHBub3JtKDExNSwxMDAsMTUpLXBub3JtKDg1LDEwMCwxNSkpKjEwMCwxKSwiJSIpLGNvbD0yLGNleD0xLjMscG9zPTQpCmFibGluZSh2PTEwMCkKdGV4dCg0LDAsZXhwcmVzc2lvbihtdSkpCmxpbmVzKGMoODUsMTE1KSxyZXAoZG5vcm0oMTE1LDEwMCwxNSksMikpCnRleHQoMTA3LjUsZG5vcm0oMTE0LjUsMTAwLDE1KSxleHByZXNzaW9uKHNpZ21hKSkKdGV4dCgxMDAtMTUvMixkbm9ybSgxMTQuNSwxMDAsMTUpLGV4cHJlc3Npb24oc2lnbWEpKQpgYGAKCi0gVm9vciBub3JtYWFsIHZlcmRlZWxkZSB0b2V2YWxsaWcgdmVyYW5kZXJsaWprZW4gaGVlZnQgb25nZXZlZXIgOTUlIHZhbiBkZSBzdWJqZWN0ZW4gaW4gZGUgcG9wdWxhdGllIGVlbiB3YWFyZGUgZGllIGJpbm5lbiB0d2VlIHN0YW5kYWFyZGFmd2lqa2luZ2VuICgkMiBcc2lnbWEkKSBsaWd0IHZhbiBoZXQgZ2VtaWRkZWxkZS4KCiQkUFtcbXUgLSAyIFxzaWdtYSA8IFggPCBcbXUgKyAyIFxzaWdtYV1cYXBwcm94IDAuOTUkJApgYGB7ciBmaWcuYWxpZ249J2NlbnRlcicsZWNobz1GQUxTRX0KZ3JpZDI8LXNlcSg3MCwxMzAsLjAxKQpwbG90KGdyaWQsZG5vcm0oZ3JpZCxtZWFuPTEwMCxzZD0xNSksCiAgICAgeGxhYj0iSVEiLAogICAgIGNvbD0yLHlsYWI9IkRlbnNpdGVpdCIsdHlwZT0ibCIsbHdkPTIsY2V4LmxhYj0xLjUsY2V4LmF4aXM9MS41KQpwb2x5Z29uKHg9YyhncmlkMiwxMzAsNzApLHk9Yyhkbm9ybShncmlkMiwxMDAsMTUpLDAsMCksY29sPSJncmV5Iixib3JkZXI9ImdyZXkiKQp0ZXh0KDExNSxkbm9ybSgxMTUsbWVhbj0xMDAsc2Q9MTUpLHBhc3RlMCgiUCg3MDxYPDEzMCkgPSAiLHJvdW5kKChwbm9ybSgxMzAsMTAwLDE1KS1wbm9ybSg3MCwxMDAsMTUpKSoxMDAsMSksIiUiKSxjb2w9MixjZXg9MS4zLHBvcz00KQphYmxpbmUodj0xMDApCnRleHQoNCwwLGV4cHJlc3Npb24obXUpKQpsaW5lcyhjKDcwLDEzMCkscmVwKGRub3JtKDEzMCwxMDAsMTUpLDIpKQp0ZXh0KDExNSxkbm9ybSgxMjgsMTAwLDE1KSxleHByZXNzaW9uKDIgKiBzaWdtYSkpCnRleHQoODUsZG5vcm0oMTI4LDEwMCwxNSksZXhwcmVzc2lvbigyICogc2lnbWEpKQpgYGAKCi0tLQoKIyMgU3RhbmRhcmRpc2F0aWUKCi0gTm9ybWFsZSBkYXRhIHdvcmRlbiB2YWFrIGdlc3RhbmRhcmRpc2VlcmQuCgokJHo9XGZyYWN7eC1cbXV9e1xzaWdtYX0kJAoKLSBOYSBzdGFuZGFyZGlzYXRpZSB2b2xnZW4gZGUgZGF0YSBlZW4gc3RhbmRhYXJkIG5vcm1hYWwgdmVyZGVsaW5nICBtZXQgZ2VtaWRkZWxkZSAkXG11PTAkIGVuIHZhcmlhbnRpZSAkXHNpZ21hXjI9MSQ6CiQkeiBcc2ltIE4oMCwxKSQkCgpXZSBrdW5uZW4gZGUgYHFub3JtYCBmdW5jdGllIGdlYnJ1aWtlbiBvbSBrd2FudGllbGVuICR6X3syLjVcJX0kIGVuICR6X3s5Ny41XCV9JCBkaWUgcmVzcGVjdGlldmVsaWprIGNvcnJlc3BvbmRlcmVuIG1ldCAkRih6X3syLjVcJX0pPTAuMDI1JCBlbiAkRih6X3s5Ny41XCV9KT0wLjk3NSQuCgpgYGB7cn0KcW5vcm0oMC4wMjUpCnFub3JtKDAuOTc1KQoKYGBgCgpWb29yIGVlbiBzdGFuZGFhcmQgbm9ybWFhbCB2ZXJkZWVsZGUgdG9ldmFsbGlnIHZlcmFuZGVybGlqa2UgdmFsdCBpbmRlcmRhYWQgb25nZXZlZXIgJDAuOTc1IC0gMC4wMjU9MC45NSQgdmFuIGRlIHdhYXJkZW4gYmlubmVuIGhldCBpbnRlcnZhbCBbLTIsMl0sIG9mIGJpbm5lbiAyIHN0YW5kYWFyZGFmd2lqa2luZ2VuICgkXHNpZ21hPTEkKSB2YW4gaGV0IGdlbWlkZGVsZGUgICgkXG11PTAkKS4KCi0tLQoKIyBTdGVla3Byb2VmCgotIEluIGVjaHRlIHN0dWRpZXMga2VubmVuIHdlIGRlIGRpc3RyaWJ1dGllIHZhbiBlZW4gcmFuZG9tIHZlcmFuZGVybGlqa2UgaW4gZGUgcG9wdWxhdGllIG5pZXQhCgotIE9td2lsbGUgdmFuIGZpbmFuY2nDq2xlIGVuIGxvZ3NpdGlla2UgYmVwZXJraW5nZW4ga3VuZW4gd2UgYmlqbmEgbm9vaXQgZGUgdm9sbGVkaWdlIHBvcHVsYXRpZSBiZXN0dWRlcmVuLgoKLSBEZSBwb3B1bGF0aWUgcGFyYW1ldGVycyAodi5iLiBnZW1pZGRlbGQgSVEsIHZhcmlhbnRpZSB2YW4gSVEpIGt1bm5lbiBkYWFyZG9vciBuaWV0IHpvbmRlciBvbnpla2VyaGVpZCB3b3JkZW4gYmVwYWFsZC4gIAoKLSBXZSBrdW5uZW4gZW5rZWwgZWVuIGtsZWluZSBzdWJzZXQgdmFuIGRlIHBvcHVsYXRpZSBiZXN0dWRlcmVuOiBkZSAqc3RlZWtwcm9lZiogIChlbmdlbHM6IHNhbXBsZSkKLSBUcmVrIG9ic2VydmF0aWVzIHZvbGdlbnMgZWVuIGdlc3RydWN0dXJlZXJkIGRlc2lnbjogdHJlayBkZSAgKipzdWJqZWN0ZW4gdm9sbGVkaWcgYXQgcmFuZG9tIHVpdCBkZSBwb3B1bGF0aWUqKiB6b2RhdCBlbGsgc3ViamVjdCBlZW4gZ2VsaWprZSBrYW5zIGhlZWZ0IG9tIGluIGRlIHN0ZWVrcHJvZWYgdGUgd29yZGVuIG9wZ2Vub21lbiAkXHJpZ2h0YXJyb3ckICoqUmVwcmVzZW50YXRpZXZlIHN0ZWVrcHJvZWYqKi4KCi0gU3RlZWtwcm9lZiAkeF8xLCB4XzIsIC4gLiAuICwgeF97bn0kIGthbiBhbHMgJG4kIHJlYWxpc2F0aWUgdmFuIGRlemVsZmRlIHRvZXZhbGxpZyB2ZXJhbmRlcmxpamtlICRYJCB3b3JkZW4gYmVzY2hvdXdkIHZvb3Igc3ViamVjdGVuICRpID0gMSwyLC4uLixuJC4KCi0gRGUgZGlzdHJpYnV0aWUgaW4gZGUgcG9wdWxhdGllIGlzIG9uZ2VrZW5kIGVuIG1vZXQgd29yZGVuIGdlc2NoYXQgb3AgYmFzaXMgdmFuIGRlIHN0ZWVrcHJvZWYuICAKCi0gQWxzIHdlIGFhbm5lbWVuIGRhdCBkZSBnZWdldmVucyBlZW4gYmVwYWFsZGUgZGlzdHJpYnV0aWUgdm9sZ2VuIChiLnYuIGRlIG5vcm1hbGUgdmVyZGVsaW5nICROKFxtdSxcc2lnbWFeMikkKSBkYW4gbW9ldGVuIHdlIGVua2VsIGRlIHBvcHVsYXRpZSBwYXJhbWV0ZXJzICgkXG11JCBlbiAkXHNpZ21hXjIkKSBzY2hhdHRlbiBvcCBiYXNpcyB2YW4gZGUgc3RlZWtwcm9lZi4KCi0gV2Ugbm9lbWVuIGRpdCBzY2hhdHRpbmdlbiAoZW5nZWxzOiBlc3RpbWF0ZXMpIGVuIG5vdGVyZW4gemUgYWxzIHZvbGd0OiAgJFxoYXQgXG11JCBlbiAkXGhhdCBcc2lnbWFeMiQuCgotLS0KCiMjIE5IQU5FUyB2b29yYmVlbGQKCi0gR2VuZGVyIGluIHRoZSBwb3B1bGF0aW9uCgotIFNlbGVjdGVlciAkbj0xMDAwMCQgc3ViamVjdGVuIGF0IHJhbmRvbSB2YW4gZGUgQW1lcmlrYWFuc2UgcG9wdWxhdGllLgoKLSBFZW5zIGRlIHN0ZWVrcHJvZWYgaXMgZ2V0cm9ra2VuIGhlYmJlbiB3ZSAkbiQgcmVhbGlzYXRpZXMgZ2VvYnNlcnZlZXJkIHZvb3IgZGUgdG9ldmFsbGlnIHZlcmFuZGVybGlqa2UgJFgkLgoKLSAqQ29udmVudGllKjogR2VvYnNlcnZlZXJkZSB3YWFyZGVuICB3b3JkZW4gbWV0IGVlbiBrbGVpbmUgbGV0dGVyIGFhbmdlZHVpZCAkeCQuCgotICR4JCBpcyBlZW4gd2VsYmVwYWFsZGUgd2FhcmRlIGRpZSB3ZXJkIGdlbWV0ZW4vZ2VvYnNlcnZlZXJkIGluIGVlbiB1aXRnZXZvZXJkIGV4cGVyaW1lbnQgZW4gaXMgbmlldCBsYW5nZXIgZWVuIG9uZ2VrZW5kZSB2YXJpYWJlbGUuCgojIyBTYW1lbnZhdHRpbmcgIAoKICAtIFZvb3Igd2UgaGV0IGV4cGVyaW1lbnQgdWl0dm9lcmVuIGlzIGRlIHBvcHVsYXRpZSBrYXJha3RlcmlzdGllayB2b29yIGRlIHByb2VmcGVyc29uZW4gJDEsXGxkb3RzLG4kIGRpZSB3ZSB1aXQgZGUgcG9wdWxhdGllIHp1bGxlbiB0cmVra2VuIG9uZ2VrZW5kIGVuIHppam4gZGF0IHRvZXZhbGxpZyB2ZXJhbmRlcmxpamtlbjogJFhfMSwgXGxkb3RzLCBYX24kCiAgLSBEaXQgaXMgbm9vZHpha2VsaWprIG9tIHRlIGt1bm5lbiByZWRlbmVyZW4gb3ZlciBob2UgZGUgcmVzdWx0YXRlbiB2YW4gc3RlZWtwcm9lZiB0b3Qgc3RlZWtwcm9lZiBrdW5uZW4gd2lqemlnZW4KICAtIEluIGVlbiBzdGVla3Byb2VmIG9ic2VydmVyZW4gd2UgZ2VyZWFsaXNlZXJkZSB1aXRrb21zdGVuICR4XzEsIHhfMiwgXGRvdHMsIHhfbiQ6IHYuYi4gZ2VuZGVyIG9mIGxlbmd0ZSB2YW4gc3ViamVjdGVuIGluIGRlIHN0ZWVrcHJvZWYuCgotLS0KCiMgR2VuZGVyIEV4YW1wbGUKCmBgYHtyfQpsaWJyYXJ5KE5IQU5FUykKTkhBTkVTICU+JSBnZ3Bsb3QoYWVzKHg9R2VuZGVyKSkgKyBnZW9tX2JhcigpCmBgYAoKLSBHZW5kZXIgaXMgZWVuIGJpbmFpcmUgdmFyaWFiZWxlLgotIEhldCB2b2xndCBlZW4gQmVybm91bGxpIGRpc3RpYnV0aWUuCi0gRGUgQmVybm91bGxpIGRpc3RyaWJ1dGllIGhlZWZ0IGVlbiBwYXJhbWV0ZXI6IGhldCBnZW1pZGRlbGRlICRccGkkLgotIFdlIGt1bm5lbiAkXHBpJCBzY2hhdHRlbiBvcCBiYXNpcyB2YW4gZGUgc3RlZWtwcm9lZiBkb29yIGhldCBzdGVla3Byb2VmZ2VtaWRkZWxkZSB0ZSBiZXJla2VuZW4gJFxiYXIgeCA9IFxzdW1cbGltaXRzX3tpPTF9Xm4geF9pJAotIE1lcmsgb3AgZGF0IGhldCBzdGVla3Byb2VmZ2VtaWRkZWxkZSB6ZWxmIGVlbiB0b2V2YWxsaWcgdmVyYW5kZXJsaWprZSBpcyEgSGV0IHdpanppZ3Qgb29rIHZhbiBzdGVla3Byb2VmIHRvdCBzdGVla3Byb2VmIQoKCmBgYHtyfQpOSEFORVMgJT4lCiAgY291bnQoR2VuZGVyKSAlPiUKICBtdXRhdGUocHJvYmFiaWxpdHkgPSBuL3N1bShuKSkKYGBgCgotLS0KCiMgTGVuZ3RlCgojIyBFbXBpcmlzY2hlIGRpc3RyaWJ1dGllCgotIFdlIGt1bm5lbiBkZSBkaXN0cmlidXRpZSB2YW4gZGUgbGVuZ3RlIHZvb3Igdm9sd2Fzc2VuIHZyb3V3ZW4gc2NoYXR0ZW4gYWFuIGRlIGhhbmQgdmFuIGhldCBoaXN0b2dyYW0uCgpgYGB7cn0KTkhBTkVTICU+JQogIGZpbHRlcihHZW5kZXI9PSJmZW1hbGUiJiFpcy5uYShIZWlnaHQpJkFnZT4xOCkgJT4lCiAgZ2dwbG90KGFlcyh4PUhlaWdodCkpICsKICBnZW9tX2hpc3RvZ3JhbSgpCmBgYAoKCi0gV2Uga3VubmVuIGRlIGN1bXVsYXRpdmUgZGlzdHJpYnV0aWUgZnVuY3RpZSBzY2hhdHRlbiBkb29yIGdlYnJ1aWsgdGUgbWFrZW4gdmFuIGRlIGVtcGlyaXNjaGUgY3VtdWxhdGlldmUgZGlzdHJpYnV0aWUgZnVuY3RpZS4KICAgIC0gRWxrZSBvYnNlcnZhdGllIHdlcmQgw6nDqW4ga2VlciBnZW9ic2VydmVlcmQgaW4gaGV0IHN0YWFsLgogICAgLSBEdXMgZW1waXJpc2NoZSBjdW11bGF0aWV2ZSBkaXN0cmlidXRpZSBmdW5jdGllIHZhbiBoZXQgc3RhYWwgaXMgZWVuIGRpc2NyZXRlIGRpc3RyaWJ1dGllIG1ldCBwcm9iYWJpbGl0ZWl0IDEvbiBvcCBlbGtlIG9ic2VydmF0aWUuCiAgICAtIERlIGVtcGlyaXNjaGUgY3VtdWxhdGlldmUgZGlzdHJpYnV0aWUgZnVuY3RpZSAoRUNERikgaXMgZ2VnZXZlbiBkb29yCiAgICAkJEVDREYoeCkgPSBcc3VtXGxpbWl0c197eF9pIFxsZXEgeH0gXGZyYWN7MX17bn0gPSBcZnJhY3tcIyAoeF9pIFxsZXEgeCl9e259JCQKCmBgYHtyfQpOSEFORVMgJT4lCiAgZmlsdGVyKEdlbmRlcj09ImZlbWFsZSImIWlzLm5hKEhlaWdodCkmQWdlPjE4KSAlPiUKICBnZ3Bsb3QoYWVzKHg9SGVpZ2h0KSkgKwogIHN0YXRfZWNkZigpCmBgYAoKV2Uga3VubmVuIGRlIGVtcGlzY2hlIGN1bXVsYXRpZXZlIGRpc3RyaWJ1dGllIGZ1bmN0aWUgZ2VicnVpa2VuIG9tIGthbnNlbiB0ZSBiZXJla2VuZW4uCldhdCBpcyBkZSBrYW5zIGRhdCBlZW4gdnJvdXcga2xlaW5lciBpcyBkYW4gMTUwIGNtLgoKYGBge3J9CmVjZGZGZW0gPC0gTkhBTkVTICU+JQogIGZpbHRlcihHZW5kZXI9PSJmZW1hbGUiJiFpcy5uYShIZWlnaHQpJkFnZT4xOCkgJT4lCiAgcHVsbCgiSGVpZ2h0IikgJT4lCiAgZWNkZgplY2RmRmVtKDE1MCkKYGBgCgogICAgLSBXZSBpbGx1c3RyZXJlbiBkaXQgb29rIHZvb3IgZWVuIHN0ZWVrcHJvZWYgdmFuIGdyb290dGUgMTAKCmBgYHtyfQpzZXQuc2VlZCg1MDIpCmZlbTEwPC0gTkhBTkVTICU+JQogIGZpbHRlcihHZW5kZXI9PSJmZW1hbGUiJiFpcy5uYShIZWlnaHQpJkFnZT4xOCkgJT4lCiAgc2FtcGxlX24oc2l6ZT0xMCkKCmZlbTEwICU+JQogIGdncGxvdChhZXMoeD1IZWlnaHQpKSArCiAgc3RhdF9lY2RmKCkKYGBgCgpgYGB7cn0KZWNkZkZlbTEwIDwtIGZlbTEwICU+JQogIHB1bGwoSGVpZ2h0KSAlPiUKICBlY2RmCmVjZGZGZW0xMCgxNTApCmBgYAoKLSBNZXJrIG9wIGRhdCBkaWUga2FucyBuaWV0IGdvZWQgd29yZHQgZ2VzY2hhdCBvLmIudi4gZGUgc3RlZWtwcm9lZi4KCi0gTWVyayBvb2sgb3AgZGF0IHdlIGRpZSBrYW5zIG9vayBoYWRkZW4ga3VubmVuIHNjaGF0dGVuIGRvb3IgdGUgYmVyZWtlbmVuIGhvZXZlZWwgbGVuZ3RlbWV0aW5nZW4gZXIgbGFnZXIgemlqbiBkYW4gMTUwLgoKYGBge3J9Ck5IQU5FUyAlPiUKICBmaWx0ZXIoR2VuZGVyPT0iZmVtYWxlIiYhaXMubmEoSGVpZ2h0KSZBZ2U+MTgpICU+JSBjb3VudChIZWlnaHQgPD0xNTApICU+JQogIG11dGF0ZShwcm9iPW4vc3VtKG4pKQoKZWNkZkZlbSgxNTApCmBgYAoKYGBge3J9CmZlbTEwICU+JQogIGNvdW50KEhlaWdodCA8PTE1MCkgJT4lCiAgbXV0YXRlKHByb2I9bi9zdW0obikpCgplY2RmRmVtMTAoMTUwKQpgYGAKCi0tLQoKIyMgTm9ybWFsZSBiZW5hZGVyaW5nCgotIEluIGRlIGludHJvZHVjdGllIHphZ2VuIHdlIGRhdCBkZSBsZW5ndGUgbWV0aW5nZW4gZWVuIG1vb2llIGtsb2t2b3JtIGhhZGRlbi4KCi0gV2Uga3VubmVuIGR1cyBhYW5uZW1lbiBkYXQgZGUgbWV0aW5nZW4gYXBwcm94aW1hdGllZiBub3JtYWFsIHZlcmRlZWxkIHppam4uCgoKLSBXZSBrdW5uZW4gZGUgdmVyZGVsaW5nIHZhbiBkZSBsZW5ndGUgbWV0aW5nZW4gb29rIGJlbmFkZXJlbiBkLm0udi4gZWVuIG5vcm1hbGUgZGlzdHJpYnV0aW9uLgoKLSBXZSBtb2V0ZW4gaGllcnZvb3IgZW5rZWwgdHdlZSBwYXJhbWV0ZXJzIHNjaGF0dGVuOgogICAgLSBnZW1pZGRlbGRlIHZpYSBzdGVla3Byb2VmZ2VtaWRkZWxkZSAoJFxoYXRcbXU9XGJhciB4JCkKICAgIC0gdmFyaWFudGllIHZpYSBzdGVla3Byb2VmdmFyaWFudGllICgkXGhhdHtcc2lnbWF9XjI9IHNeMiQpIG9mIGRlIHN0YW5kYWFyZGFmd2lqa2luZyBkLm0udi4gc3RlZWtwcm9lZiBzdGFuZGFhcmRkZXZpYXRpZSAoJFxoYXRcc2lnbWE9cyQpLgoKCmBgYHtyfQpIZWlnaHRTdW0gPC0gTkhBTkVTICU+JQogIGZpbHRlcihHZW5kZXI9PSJmZW1hbGUiJiFpcy5uYShIZWlnaHQpJkFnZT4xOCkgJT4lCiAgc3VtbWFyaXplKG1lYW49bWVhbihIZWlnaHQpLHNkPXNkKEhlaWdodCkpCkhlaWdodFN1bQpgYGAKCldlIHppZW4gZGF0IGRlIGJlbmFkZXJpbmcgZ29lZCB3ZXJrdDoKCmBgYHtyfQpOSEFORVMgJT4lCiAgZmlsdGVyKEdlbmRlcj09ImZlbWFsZSImIWlzLm5hKEhlaWdodCkmQWdlPjE4KSAlPiUKICBnZ3Bsb3QoYWVzKHg9SGVpZ2h0KSkgKwogIGdlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uLCBmaWxsPS4uY291bnQuLikpICsKICB4bGFiKCJMZW5ndGUgKGNtKSIpICsKICBzdGF0X2Z1bmN0aW9uKAogICAgZnVuPWRub3JtLAogICAgY29sb3I9InJlZCIsCiAgICBhcmdzPWxpc3QoCiAgICAgIG1lYW49SGVpZ2h0U3VtJG1lYW5bMV0sCiAgICAgIHNkPUhlaWdodFN1bSRzZFsxXQogICAgICApCiAgICApCmBgYAoKCi0gV2UgZG9lbiBudSBoZXR6ZWxmZGUgb3AgYmFzaXMgdmFuIGRlIHN0ZWVrcHJvZWYgbWV0IGRlIDEwIHZyb3V3ZW4uCgpgYGB7cn0KSGVpZ2h0U3VtMTAgPC0gZmVtMTAgJT4lCiAgc3VtbWFyaXplKG1lYW49bWVhbihIZWlnaHQpLHNkPXNkKEhlaWdodCkpCgpIZWlnaHRTdW0xMApgYGAKCmBgYHtyfQpmZW0xMCAlPiUKICBnZ3Bsb3QoYWVzKHg9SGVpZ2h0KSkgKwogIGdlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uLCBmaWxsPS4uY291bnQuLiksYmlucz0xMCkgKwogIHhsYWIoIkxlbmd0ZSAoY20pIikgKwogIHN0YXRfZnVuY3Rpb24oCiAgICBmdW49ZG5vcm0sCiAgICBjb2xvcj0icmVkIiwKICAgIGFyZ3M9bGlzdCgKICAgICAgbWVhbj1IZWlnaHRTdW0xMCRtZWFuWzFdLAogICAgICBzZD1IZWlnaHRTdW0xMCRzZFsxXQogICAgICApCiAgICApICsKICB4bGltKDEzMCwxOTApCmBgYAoKLSBXZSBrdW5uZW4gZGUgbm9ybWFsZSBiZW5hZGVyaW5nIG51IG9vayBnZWJydWlrZW4gb20gZGUga2FucyB0ZSBiZXJla2VuZW4gZGF0IGVlbiB2cm91dyBrbGVpbmVyIGlzIGRhbiAxNTAgY206IFByKFggPD0gMTUwKS4KCi0gV2UgZG9lbiBkaXQgb3AgYmFzaXMgdmFuIGRlIHZvbGxlZGlnZSBzdGVla3Byb2VmIGVuIHZlcmdlbGlqa2VuIGRpdCB1aXQgd2F0IHdlIGJla29tZW4gbWV0IGRlIEVDREYuICAKCmBgYHtyfQpwbm9ybSgxNTAsSGVpZ2h0U3VtJG1lYW5bMV0sSGVpZ2h0U3VtJHNkWzFdKQplY2RmRmVtKDE1MCkKYGBgCgotIE9wIGJhc2lzIHZhbiBkZSBrbGVpbmUgc3RlZWtwcm9lZjoKCgpgYGB7cn0KcG5vcm0oMTUwLEhlaWdodFN1bTEwJG1lYW5bMV0sSGVpZ2h0U3VtMTAkc2RbMV0pCmVjZGZGZW0xMCgxNTApCmBgYAoKLSBWb29yIGtsZWluZSBzdGVla3Byb2VmIGlzIGdlc2NoYXR0ZSBrYW5zIG8uYi52LiBlbXBpcmlzY2hlIGRpc3RyaWJ1dGllIHZlZWwgbWluZGVyIG5hdXdrZXVyaWcuCgotIEt3YW50aWVsZW4gZ2VzY2hhdCBvLmIudi4ga2xlaW5lIHN0ZWVrcHJvZWYgemlqbiBpbW1lcnMgdnJpaiBvbnpla2VyLiBaZSBnZWJydWlrZW4gaW1tZXJzIG1hYXIgZWVuIGZyYWN0aWUgdmFuIGRlIGRhdGEuICAgCgotIERlIHNjaGF0dGluZyBvLmIudi4gZGUgbm9ybWFsZSB2ZXJkZWxpbmcgbGFhdCB0b2Ugb20gYWxsZSBkYXRhIHRlIGdlYnJ1aWtlbiB2b29yIGhldCBzY2hhdHRlbiB2YW4gZGUgbW9kZWwgcGFyYW1ldGVycy4KCi0tLQoKIyMgUmVmZXJlbnRpZSBpbnRlcnZhbGxlbgoKLSBOb3JtYWxlIHdhYXJkZW4gdm9vciBkZSBsZW5ndGUga3VubmVuIHdvcmRlbiBiZWtvbWVuIGRvb3IgZ2VicnVpayB0ZSBtYWtlbiB2YW4gZWVuIHJlZmVyZW50aWUgaW50ZXJ2YWwuCgotIFR5cGlzY2ggd29yZHQgZWVuIDk1JSByZWZlcmVudGllIGludGVydmFsIGdlYnJ1aWt0IHpvZGF0IHdlIHZvb3IgOTUlIHZhbiBkZSBzdWJqZWN0ZW4gaW4gZGUgcG9wdWxhdGllIHZlcndhY2h0ZW4gZGF0IHplIGVlbiBrYXJha3RlcmlzdGllayBoZWJiZW4gZGllIGluIGhldCByZWZlcmVudGllIGludGVydmFsIGxpZ3QuCgotIFdlIGt1bm5lbiBkYXQgb3BuaWV1dyBvcCBiYXNpcyB2YW4gZGUgZW1waXJpc2NoZSBkaXN0cmlidXRpZS4KCi0gV2UgbW9ldGVuIGhpZXJ2b29yICRcaGF0e0Z9KHhfezIuNVwlfSk9MC4wMjUkIGVuICRcaGF0e0Z9KHhfezk3LjVcJX0pPTAuOTc1JCBiZXJla2VuZW4gem9kYXQgOTUlIHZhbiBkZSBvYnNlcnZhdGllcyBpbiBkZSBzdGVla3Byb2VmIHZhbGxlbiBpbiBoZXQgaW50ZXJ2YWwgW3hfezIuNSV9LHhfezk3LjUlfV0uCgotIERhdCBrYW4gbWV0IGRlIGBxdWFudGlsZWAgZnVuY3RpZS4KCi0gR3JvdGUgc3RlZWtwcm9lZgoKYGBge3J9Ck5IQU5FUyAlPiUKICBmaWx0ZXIoR2VuZGVyPT0iZmVtYWxlIiYhaXMubmEoSGVpZ2h0KSZBZ2U+MTgpICU+JQogIHB1bGwoSGVpZ2h0KSAlPiUKICBxdWFudGlsZShwcm9iPWMoMC4wMjUsMC45NzUpKQpgYGAKCi0gT3AgYmFzaXMgdmFuIGRlIGdyb3RlIHN0ZWVrcHJvZWYgc2NoYXR0ZW4gd2UgZGF0IDk1JSB2YW4gZGUgdnJvdXdlbiBpbiBkZSBwb3B1bGF0aWUgZWVuIGxlbmd0ZSBoZWVmdCBkaWUgbGlndCBpbiBoZXQgaW50ZXJ2YWwgW2ByIE5IQU5FUyAlPiUKICBmaWx0ZXIoR2VuZGVyPT0iZmVtYWxlIiYhaXMubmEoSGVpZ2h0KSZBZ2U+MTgpICU+JQogIHB1bGwoSGVpZ2h0KSAlPiUKICBxdWFudGlsZShwcm9iPWMoMC4wMjUsMC45NzUpKWBdLgoKLSBLbGVpbmUgc3RlZWtwcm9lZgoKYGBge3J9CmZlbTEwICU+JQogIHB1bGwoSGVpZ2h0KSAlPiUKICBxdWFudGlsZShwcm9iPWMoMC4wMjUsMC45NzUpKQpgYGAKCi0gRGl0IGludGVydmFsIG8uYi52LiBkZSBrbGVpbmUgc3RlZWtwcm9lZiBpcyBlZW4gcnV3ZSBiZW5hZGVyaW5nLgotIFdlIGhlYmJlbiBpbW1lcnMgbmlldCB2b2xkb2VuZGUgb2JzZXJ2YXRpZXMgb20gZWVuIGdvZWRlIGJlbmFkZXJpbmcgdGUgaGViYmVuIHZvb3IgZXh0cmVtZSBxdWFudGllbGVuLgoKIyMjIE5vcm1hbGUgYmVuYWRlcmluZwoKLSBXZSBrdW5uZW4gZGUgZnVuY3RpZSBxbm9ybSBnZWJydWlrZW4gb20gcXVhbnRpZWxlbiB0ZSBiZXJla2VuZW4gdmFuIGRlIG5vcm1hbGUgZGlzdHJpYnV0aWUuCgotIFdlIHdldGVuIGRhdCBlZW4gOTUlIHJlZmVyZW50aWUgaW50ZXJ2YWwgb25nZXZlZXIgYmlubmVuIHR3ZWUgc3RhbmRhYXJkIGRldmlhdGllcyByb25kIGhldCBnZW1pZGRlbGRlIGxpZ3QuCgoKLSBHcm90ZSBzdGVla3Byb2VmCmBgYHtyfQpxbm9ybSgwLjAyNSxtZWFuPUhlaWdodFN1bSRtZWFuLHNkPUhlaWdodFN1bSRzZCkKSGVpZ2h0U3VtJG1lYW4gLSAyICogSGVpZ2h0U3VtJHNkCnFub3JtKDAuOTc1LG1lYW49SGVpZ2h0U3VtJG1lYW4sc2Q9SGVpZ2h0U3VtJHNkKQpIZWlnaHRTdW0kbWVhbiArIDIgKiBIZWlnaHRTdW0kc2QKYGBgCgotIEtsZWluZSBzdGVla3Byb2VmCgpgYGB7cn0KcW5vcm0oMC4wMjUsbWVhbj1IZWlnaHRTdW0xMCRtZWFuLHNkPUhlaWdodFN1bTEwJHNkKQpxbm9ybSgwLjk3NSxtZWFuPUhlaWdodFN1bTEwJG1lYW4sc2Q9SGVpZ2h0U3VtMTAkc2QpCmBgYAoKLS0tCgojIyBDb25jbHVzaW9ucwoKLSBWb29yIGRlIGdyb3RlIHN0ZWVrcHJvZWYgZ2V2ZW4gZGUgZW1waXJpc2NoZSBkaXN0cmlidXRpZSBlbiBkZSBub3JtYWxlIGJlbmFkZXJpbmcgdmVyZ2VsaWprYmFyZSByZXN1bHRhdGVuLgoKLSBWb29yIGRlIGtsZWluZSBzdGVla3Byb2VmIHdlcmt0IGRlIG5vcm1hbGUgYmVuYWRlcmluZyBiZXRlciBkYW4gZGUgZW1waXJpc2NoZSBkaXN0cmlidXRpZS4KCiAgICAtIFdlIGtpamtlbiBpbW1lcnMgbmFhciBleHRyZW1lIHF1YW50aWVsZW4gMi41JSBlbiA5Ny41JS4KICAgIC0gRXIgemlqbiBpbmRlcmRhYWQgd2VpbmlnIGdlZ2V2ZW5zIGluIGRlIHN0ZWVrcHJvZWYgZGllIHRvZWxhdGVuIG9tIGRlemUgcXVhbnRpZWxlbiBkaXJlY3QgdGUgc2NoYXR0ZW4uCiAgICAtIE1ldCBkZSBub3JtYWxlIGJlbmFkZXJpbmcga3VubmVuIHdlIGFsbGUgZGF0YSBnZWJydWlrZW4gb20gaGV0IGdlbWlkZGVsZGUgZW4gZGUgc3RhbmRhYXJkZGV2aWF0aWUgdGUgc2NoYXR0ZW4uCiAgICAtIEFscyBkZSBhYW5uYW1lIHZhbiBub3JtYWxpdGVpdCBnZWxkdCBkYW4ga3JpamdlbiB3ZSBiZXRlcmUgc2NoYXR0aW5nZW4gdm9vciBkZXplIGt3YW50aWVsZW4uICAKCi0tLQoKIyBTdGF0aXN0aWVrZW4KCi0gRm9ybXVsZSBkaWUgd2UgZ2VicnVpa2VuIG9tIHBhcmFtZXRlcnMgdmFuIGRlIGRpc3RyaWJ1dGllIGluIGRlIHBvcHVsYXRpZSB0ZSBzY2hhdHRlbiBvcCBiYXNpcyB2YW4gZWVuIHN0ZWVrcHJvZWYuIFdlIHJlZmVyZXJlbiBoaWVybmFhciBhbHMgc3RhdGlzdGlla2VuIG9mIHNjaGF0dGVycy4KCi0gSGV0IG51bWVyaWVrZSByZXN1bHRhYXQgZGllIHdvcmR0IGJla29tZW4gZG9vciBkZXplIGZvcm11bGVzIHRlIGV2YWx1ZXJlbiB3b3JkZW4gb29rIHN0YXRpc3RpZWtlbiBvZiBzY2hhdHRpbmdlbiBnZW5vZW1kLgoKLSBPbmRlcnpvZWtlcnMgd2Vuc2VuIG9uZ2VrZW5kZSBwYXJhbWV0ZXJzIHZhbiBkZSBkaXN0cmlidXRpZSBpbiBkZSBwb3B1bGF0aWUgdGUga2VubmVuIGVuIHNjaGF0dGVuIGRlemUgby5iLnYuIGRlIHN0ZWVrcHJvZWYuCgotIE9tZGF0IHdlIHN0YXRpc3RpZWtlbiBiZXJla2VuZW4gby5iLnYuIGRlIG9ic2VydmF0aWVzIGluIGVlbiBzdGVla3Byb2VmLCB2YXJpw6tyZW4gc3RhdGlzdGlla2VuIG9vayB2YW4gc3RlZWtwcm9lZiB0b3Qgc3RlZWtwcm9lZi4gSGV0IHppam4gZHVzIG9vayByYW5kb20gdmFyaWFiZWxlbiBlbiB3ZSBub3RlcmVuIHplIGR1cyBvb2sgbWV0IGhvb2ZkbGV0dGVycyAoYi52LiAkXGJhciBYJCB2b29yIGhldCBzdGVla3Byb2VmZ2VtaWRkZWxkZSBlbiAkU14yJCB2b29yIGRlIHN0ZWVrcHJvZWZ2YXJpYW50aWUpLgoKLSBBbHMgd2UgZGF0YSBhbmFseXNlcmVuIG1vZXRlbiB3ZSBkdXMgbmFkZW5rZW4gb3ZlciBob2UgZGUgc3RhdGlzdGlla2VuIHZhcmnDq3JlbiB2YW4gc3RlZWtwcm9lZiB0b3Qgc3RlZWtwcm9lZi4KCi0gQWxzIGVlbiBzdGF0aXN0aWVrIHZlcndpanN0IG5hYXIgZWVuIG51bWVyaWVrZSB3YWFyZGUgZGllIHdlcmQgZ2VyZWFsaXNlZXJkIGluIGVlbiBiZXBhYWxkZSBzdGVla3Byb2VmIGRhbiBub3RlcmVuIHdlIGRlemUgbWV0IGVlbiBrbGVpbmUgbGV0dGVyOiAkXGJhciB4JCBlbiAkc14yJC4KCi0tLQoKIyBDb252ZW50aWUKCi0gKipQb3B1bGF0aWVwYXJhbWV0ZXJzKiogbmVtZW4gdmFzdGUgd2FhcmRlbiBhYW4gbWFhciB6aWpuIG1lZXN0YWwgb25nZWtlbmQgJFxyaWdodGFycm93JCAqKkdyaWVrc2Ugc3ltYm9sZW4qKi4KXHZzcGFjZXsxNXB0fQoKLSAqKlN0YXRpc3RpZWtlbioqIHdhYXJtZWUgd2UgZGV6ZSBvbmdla2VuZGUgcGFyYW1ldGVycyBzY2hhdHRlbiBvLmIudi4gZWVuIHN0ZWVrcHJvZWYgICRccmlnaHRhcnJvdyQgICoqbGV0dGVycyoqLgpcdnNwYWNlezE1cHR9CgotIFZiIE5vcm1hbGUgdmVyZGVsaW5nCgp8IFBvcHVsYXRpZSB8IFN0ZWVrcHJvZWZ8CnwgOi0tLTogfCA6LS0tOiB8CnwgJFxtdSQgfCAkXGJhciBYJCB8CnwgJFxzaWdtYV4yJCB8ICRTXjIkIHwKCgoKLS0tCgojIFtIb21lXShodHRwczovL3N0YXRvbWljcy5naXRodWIuaW8vc2JjMjApIHstfQo=