Chapter 15 Probability
This is nose bleeding time for those not into Statistics.
15.1 What is Probability
15.1.1 Events and Probability
Events: a set of outcomes of an experiment (a subset of the sample space) to which a probability is assigned Probability: describes the “magnitude of chance” associated with making a particular observation or statement
Two types: frequentlist or classical: it is the assumed relative frequency with which an event occurs over many identical, objective trials. Bayesian: defines a “probability” in exactly the same way that most non-statisticians do - namely an indication of the plausibility of a proposition or a situation–based on personal observations
The Bayesian is subjective and uses a prior beliefs to define a prior probability distribution on the possible values of the unknown parameters. … This is in line with the theory of probability as developed by Kolmogorov and von Mises. A frequentist does parametric inference using just the likelihood function
See also: Likelihood: http://students.brown.edu/seeing-theory/basic-probability/index.html#first Expectation: http://students.brown.edu/seeing-theory/basic-probability/index.html#second and Estimation: http://students.brown.edu/seeing-theory/basic-probability/index.html#third
When two events are said to be
independent of each other, what this means is that the probability that one event occurs in no way affects the probability of the other event occurring. An example of two independent events is as follows; say you rolled a die and flipped a coin.
15.1.2 Conditional Probability
Conditional probability is the probability of one event occuring AFTER taking into account the occurrence of another event. Conditional is the usual kind of probability that we reason with. If I take this action, what are the odds that ZZ? [If] is the key word here
The quantity Pr(A|B) represents the probability that A occurs, given that B has already occured
15.1.3 Intersection
The intersection of 2 events is written as Pr(A ??? B) and means the probability that both A and B occur simultaneously.
Pr(A ??? B) = Pr(A|B) x Pr(b) or pr(B|A) x Pr(A)
If Pr(A ??? B) =0 , then A and B are mutually exclusive.
See:
https://upload.wikimedia.org/wikipedia/commons/thumb/9/99/Venn0001.svg/330px-Venn0001.svg.png
15.1.4 Union
The union of two sets A and B is the set of elements which are in A, in B, or in both A and B. In symbols, {AB={x:xA{}xB}} A B = { x: x A x B}.[2]
The union of two events is the probability that A or B occurs.
15.1.5 Complement
In set theory, the complement of a set A refers to elements not in A. The relative complement of A with respect to a set B, also termed the difference of sets A and B, written B ??? A, is the set of elements in B but not in A
See:
https://en.wikipedia.org/wiki/File:Venn0010.svg
See Also: Set Theory: http://students.brown.edu/seeing-theory/compound-probability/index.html#first Combinatorics: http://students.brown.edu/seeing-theory/compound-probability/index.html#second Conditional Probability: http://students.brown.edu/seeing-theory/compound-probability/index.html#third
15.2 Random Variables and Probability Distributions
Random variables are those whose specific outcomes are assumed to arise by chance or according to some random or stochastic mechanism.
Probabilistic distributions are functions that define these probabilities
A quick example is the sample space of any number of coin flips, the outcomes will always be integer values, and you’ll never have half heads or quarter tails. Such a random variable is referred to as discrete. Discrete random variables give rise to discrete probability distributions.
Following are elementary ways in which random variables are summarized and how their corresponding probability distributions are dealt with statistically.
15.2.1 Realizations
Reaizations are actual observations of random variables.
15.2.2 Discrete Random Variables
Discrete Random Variables The word discrete means separate and individual. Thus discrete random variables are those that take on integer values only. They never include fractions or decimals.
Probability mass functions are probability distributions tied to discrete random varaibles.
Cumulative probability distributions of discrete random variables is the probability of observing less than or equal to x . The probability that X will take a value less than or equal to x.
The cumulative distribution function of a real-valued random variable X is the function given by {F_{X}(x)= (Xx),} F_{X}(x)= (Xx), where the right-hand side represents the probability that the random variable X takes on a value less than or equal to x. The probability that X lies in the semi-closed interval (a, b], where a < b, is therefore { (a
The cumulative distribution function (cdf) is the probability that the variable takes a value less than or equal to x. That is F(x)=Pr[X???x]=??
For a continuous distribution, this can be expressed mathematically as
F(x)=???x??????f(??)d??
For a discrete distribution, the cdf can be expressed as
F(x)=???xi=0f(i)
The following is the plot of the normal cumulative distribution function.
plot of normal cumulative distribution function see: http://www.itl.nist.gov/div898/handbook/eda/section3/gif/norcdf.gif
The horizontal axis is the allowable domain for the given probability function. Since the vertical axis is a probability, it must fall between zero and one. It increases from zero to one as we go from left to right on the horizontal axis.
X.outcomes <-c(-4,0,1,8)
X.prob <-c(.32,.48,.15,.05)
barplot(X.prob,ylim=c(0,.5),names.arg=X.outcomes,space = .05,xlab="x",ylab="Pr(X=x)")

X.cumul <-cumsum(X.prob)
X.cumul
[1] 0.32 0.80 0.95 1.00
barplot(X.cumul,names.arg=X.outcomes,space = .05,xlab="x",ylab="Pr(X=x)")

Mean and Variance of a discrete random variable<.br> Mean and variance are the two most useful properties used to describe or summarize the properties of a random variable.
It is a measure of spread for a distribution of a random variable that determines the degree to which the values of a random variable differ from the expected value.
Mean is the expected value or the average outcome that you can expect over many realizations
The variance of random variable X is often written as Var(X) or ??2 or ??2x.
For a discrete random variable the variance is calculated by summing the product of the square of the difference between the value of the random variable and the expected value (mean), and the associated probability of the value of the random variable, taken over all of the values of the random variable.
In symbols, Var(X) = (x - ??)2 P(X = x)
An equivalent formula is, Var(X) = E(X2) ??? [E(X)]2
The square root of the variance is equal to the standard deviation.
mu.X<-sum(X.outcomes*X.prob)
mu.X
[1] -0.73
# variance of X
var.X<-sum((X.outcomes-mu.X)^2*X.prob)
var.X
[1] 7.9371
# compute for standard deviation
sd.X<-sqrt(var.X)
sd.X
[1] 2.817286
The expected outcome of -.73 suggest that on average you’ll lose 0.73 per turn with a standard deviation of about 2.82. They describe the behavior of the random mechanism over the long run.
15.2.3 Continuous Random Variables
Continuous Random Variable Continuous is the opposite of discrete. Continuous random variables are those that take on any value including fractions and decimals. Continuous random variables give rise to continuous probability distributions.
Since they are not integers, it is not possible to assign probabilities to a specific number. Instead use intervals of values. Probabilities are now computed as areas underneath.
Cummulative Probability distributions of continuous Random Variables The cumulative distribution function for continuous random variables is just a straightforward extension of that of the discrete case. All we need to do is replace the summation with an integral.
Definition. The cumulative distribution function (“c.d.f.”) of a continuous random variable X is defined as:
F(x)=???x??????f(t)dtF(x)=?????????xf(t)dt
for ?????? < x < ???.
w<-seq(35,95,by=5)
lower.w <- w>=40 & w<=65
upper.w<-w>65 & w<=90
Fw<-rep(0,length(w))
Fw[lower.w]<-(w[lower.w]^2-80*w[lower.w]+1600)/1250
Fw[upper.w]<-(180*w[upper.w]-w[upper.w]^2-6850)/1250
Fw[w>90]<-1
plot(w,Fw,type="l",ylab="F(w)")
abline(h=c(0,1),col="gray",lty=2)

plot(w,Fw,type="l",ylab="F(w)")
abline(h=c(0,1),col="gray",lty=2)
# new lines
fw.specific<-(55.2-40)/625
fw.specific.area<-.5*15.2*fw.specific
abline(v=55.2,lty=3)
abline(h=fw.specific.area,lty=3)

Mean and Variance of a Continuous Random Variable
The mean of a discrete random variable X is a weighted average of the possible values that the random variable can take. Unlike the sample mean of a group of observations, which gives each observation equal weight, the mean of a random variable weights each outcome xi according to its probability, pi. The common symbol for the mean (also known as the expected value of X) is , formally defined by:
The mean of a random variable provides the long-run average of the variable, or the expected average outcome over many observations.
Example
Suppose an individual plays a gambling game where it is possible to lose $1.00, break even, win $3.00, or win $10.00 each time she plays. The probability distribution for each outcome is provided by the following table: Outcome -$1.00 $0.00 $3.00 $5.00 Probability 0.30 0.40 0.20 0.10 The mean outcome for this game is calculated as follows: = (-1.3) + (0.4) + (3.2) + (100.1) = -0.3 + 0.6 + 0.5 = 0.8. In the long run, then, the player can expect to win about 80 cents playing this game – the odds are in her favor. For a continuous random variable, the mean is defined by the density curve of the distribution. For a symmetric density curve, such as the normal density, the mean lies at the center of the curve. The law of large numbers states that the observed random mean from an increasingly large number of observations of a random variable will always approach the distribution mean . That is, as the number of observations increases, the mean of these observations will become closer and closer to the true mean of the random variable. This does not imply, however, that short term averages will reflect the mean.
In the above gambling example, suppose a woman plays the game five times, with the outcomes $0.00, -$1.00, $0.00, $0.00, -$1.00. She might assume, since the true mean of the random variable is $0.80, that she will win the next few games in order to “make up” for the fact that she has been losing. Unfortunately for her, this logic has no basis in probability theory. The law of large numbers does not apply for a short string of events, and her chances of winning the next game are no better than if she had won the previous game.
The variance of a discrete random variable X measures the spread, or variability, of the distribution, and is defined by
The standard deviation is the square root of the variance.
Example
In the original gambling game above, the probability distribution was defined to be: Outcome -$1.00 $0.00 $3.00 $5.00 Probability 0.30 0.40 0.20 0.10 The variance for this distribution, with mean = 0.8, may be calculated as follows: (-1 - 0.8)20.3 + (0 - 0.8)20.4 + (3 - 0.8)20.2 + (5 - 0.3)20.1 = (-1.8)20.3 + (-0.8)20.4 + (2.2)20.2 + (4.2)20.1 = 3.240.3 + 0.640.4 + 4.840.2 + 17.640.1 = 0.972 + 0.256 + 0.968 + 1.764 = 3.960, with standard deviation = 1.990. Since there is not a very large range of possible values, the variance is small.
# variable
fw <-rep(0,length(w))
fw[lower.w]<-(w[lower.w]-40)/625
fw[upper.w]<-(90-w[upper.w])/625
# plot
plot(w,w*fw,type="l",ylab="wf(w)")

Integrands for the expected value.
plot(w,(w-65)^2*fw,type="l",ylab="(w-65)^2 f(w)")

Variance of the probability density function for the tmeparture example.
15.2.4 Shape, Skew and Modality
What do we look for in ???Shape???? We must be able to describe the visual impressions. Shape of distribution: Populations with the same mean and standard deviation can still have distributions with very different shapes.
Symmetry
bell shaped or normal uniform Skewness skewed to the right (skewed positively) skewed to the left (skewed ??? ) graphs
Modality - # of prominent peaks unimodal bimodal
see picture here: https://onlinecourses.science.psu.edu/stat504/sites/onlinecourses.science.psu.edu.stat504/files/lesson01/skew_graphs.gif
LS0tDQp0aXRsZTogIkNoYXB0ZXIgMTUgUHJvYmFiaWxpdHkiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQo8aDE+IENoYXB0ZXIgMTUgUHJvYmFiaWxpdHkgPC9oMT4NClRoaXMgaXMgbm9zZSBibGVlZGluZyB0aW1lIGZvciB0aG9zZSBub3QgaW50byBTdGF0aXN0aWNzLg0KDQo8aDI+IDE1LjEgV2hhdCBpcyBQcm9iYWJpbGl0eTwvaDI+DQo8aDM+IDE1LjEuMSBFdmVudHMgYW5kIFByb2JhYmlsaXR5PC9oMz4NCkV2ZW50czogYSBzZXQgb2Ygb3V0Y29tZXMgb2YgYW4gZXhwZXJpbWVudCAoYSBzdWJzZXQgb2YgdGhlIHNhbXBsZSBzcGFjZSkgdG8gd2hpY2ggYSBwcm9iYWJpbGl0eSBpcyBhc3NpZ25lZDwvYnI+DQpQcm9iYWJpbGl0eTogZGVzY3JpYmVzIHRoZSAibWFnbml0dWRlIG9mIGNoYW5jZSIgYXNzb2NpYXRlZCB3aXRoIG1ha2luZyBhIHBhcnRpY3VsYXIgb2JzZXJ2YXRpb24gb3Igc3RhdGVtZW50PC9icj4NCjwvYnI+DQoNClR3byB0eXBlczo8L2JyPg0KZnJlcXVlbnRsaXN0IG9yIGNsYXNzaWNhbDogaXQgaXMgdGhlIGFzc3VtZWQgcmVsYXRpdmUgZnJlcXVlbmN5IHdpdGggd2hpY2ggYW4gZXZlbnQgb2NjdXJzIG92ZXIgbWFueSBpZGVudGljYWwsIG9iamVjdGl2ZSB0cmlhbHMuPC9icj4NCkJheWVzaWFuOiBkZWZpbmVzIGEgInByb2JhYmlsaXR5IiBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSB0aGF0IG1vc3Qgbm9uLXN0YXRpc3RpY2lhbnMgZG8gLSBuYW1lbHkgYW4gaW5kaWNhdGlvbiBvZiB0aGUgcGxhdXNpYmlsaXR5IG9mIGEgcHJvcG9zaXRpb24gb3IgYSBzaXR1YXRpb24tLWJhc2VkIG9uIHBlcnNvbmFsIG9ic2VydmF0aW9ucyA8L3A+DQoNClRoZSBCYXllc2lhbiBpcyBzdWJqZWN0aXZlIGFuZCB1c2VzIGEgcHJpb3IgYmVsaWVmcyB0byBkZWZpbmUgYSBwcmlvciBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24gb24gdGhlIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgdW5rbm93biBwYXJhbWV0ZXJzLiAuLi4gVGhpcyBpcyBpbiBsaW5lIHdpdGggdGhlIHRoZW9yeSBvZiBwcm9iYWJpbGl0eSBhcyBkZXZlbG9wZWQgYnkgS29sbW9nb3JvdiBhbmQgdm9uIE1pc2VzLiBBIGZyZXF1ZW50aXN0IGRvZXMgcGFyYW1ldHJpYyBpbmZlcmVuY2UgdXNpbmcganVzdCB0aGUgbGlrZWxpaG9vZCBmdW5jdGlvbiA8L3A+DQoNClNlZSBhbHNvOg0KTGlrZWxpaG9vZDogaHR0cDovL3N0dWRlbnRzLmJyb3duLmVkdS9zZWVpbmctdGhlb3J5L2Jhc2ljLXByb2JhYmlsaXR5L2luZGV4Lmh0bWwjZmlyc3QgPC9icj4NCkV4cGVjdGF0aW9uOiBodHRwOi8vc3R1ZGVudHMuYnJvd24uZWR1L3NlZWluZy10aGVvcnkvYmFzaWMtcHJvYmFiaWxpdHkvaW5kZXguaHRtbCNzZWNvbmQgPC9icj4NCmFuZCBFc3RpbWF0aW9uOiBodHRwOi8vc3R1ZGVudHMuYnJvd24uZWR1L3NlZWluZy10aGVvcnkvYmFzaWMtcHJvYmFiaWxpdHkvaW5kZXguaHRtbCN0aGlyZCA8L2JyPg0KDQpXaGVuIHR3byBldmVudHMgYXJlIHNhaWQgdG8gYmUgPGI+aW5kZXBlbmRlbnQ8L2I+IG9mIGVhY2ggb3RoZXIsIHdoYXQgdGhpcyBtZWFucyBpcyB0aGF0IHRoZSBwcm9iYWJpbGl0eSB0aGF0IG9uZSBldmVudCBvY2N1cnMgaW4gbm8gd2F5IGFmZmVjdHMgdGhlIHByb2JhYmlsaXR5IG9mIHRoZSBvdGhlciBldmVudCBvY2N1cnJpbmcuIEFuIGV4YW1wbGUgb2YgdHdvIGluZGVwZW5kZW50IGV2ZW50cyBpcyBhcyBmb2xsb3dzOyBzYXkgeW91IHJvbGxlZCBhIGRpZSBhbmQgZmxpcHBlZCBhIGNvaW4uIDwvcD4gDQoNCjxoMz4xNS4xLjIgQ29uZGl0aW9uYWwgUHJvYmFiaWxpdHk8L2gzPg0KQ29uZGl0aW9uYWwgcHJvYmFiaWxpdHkgaXMgdGhlIHByb2JhYmlsaXR5IG9mIG9uZSBldmVudCBvY2N1cmluZyBBRlRFUiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBvY2N1cnJlbmNlIG9mIGFub3RoZXIgZXZlbnQuIENvbmRpdGlvbmFsIGlzIHRoZSB1c3VhbCBraW5kIG9mIHByb2JhYmlsaXR5IHRoYXQgd2UgcmVhc29uIHdpdGguIElmIEkgdGFrZSB0aGlzIGFjdGlvbiwgd2hhdCBhcmUgdGhlIG9kZHMgdGhhdCBaWj8gW0lmXSBpcyB0aGUga2V5IHdvcmQgaGVyZSA8L3A+DQoNClRoZSBxdWFudGl0eSBQcihBfEIpIHJlcHJlc2VudHMgdGhlIHByb2JhYmlsaXR5IHRoYXQgQSBvY2N1cnMsIGdpdmVuIHRoYXQgQiBoYXMgYWxyZWFkeSBvY2N1cmVkPC9QPg0KDQoNCg0KPGgzPjE1LjEuMyBJbnRlcnNlY3Rpb248L2gzPg0KVGhlIGludGVyc2VjdGlvbiBvZiAyIGV2ZW50cyBpcyB3cml0dGVuIGFzIFByKEEgPz8/IEIpIGFuZCBtZWFucyB0aGUgcHJvYmFiaWxpdHkgdGhhdCBib3RoIEEgYW5kIEIgb2NjdXIgc2ltdWx0YW5lb3VzbHkuIDwvcD4NCg0KUHIoQSA/Pz8gQikgPSBQcihBfEIpIHggUHIoYikgb3IgcHIoQnxBKSB4IFByKEEpIDwvcD4NCg0KSWYgUHIoQSA/Pz8gQikgPTAgLCB0aGVuIEEgYW5kIEIgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4NCg0KU2VlOiBodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL3RodW1iLzkvOTkvVmVubjAwMDEuc3ZnLzMzMHB4LVZlbm4wMDAxLnN2Zy5wbmcgPC9wPg0KDQoNCjxoMz4xNS4xLjQgVW5pb24gPC9oMz4NClRoZSB1bmlvbiBvZiB0d28gc2V0cyBBIGFuZCBCIGlzIHRoZSBzZXQgb2YgZWxlbWVudHMgd2hpY2ggYXJlIGluIEEsIGluIEIsIG9yIGluIGJvdGggQSBhbmQgQi4gSW4gc3ltYm9scywNCntcZGlzcGxheXN0eWxlIEFcY3VwIEI9XHt4OnhcaW4gQXtcdGV4dHsgb3IgfX14XGluIEJcfX0gQSAgXGN1cCBCID0gXHsgeDogeCBcaW4gQSBcdGV4dHsgIG9yICB9IHggXGluIEJcfS5bMl0NCg0KPC9wPg0KVGhlIHVuaW9uIG9mIHR3byBldmVudHMgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgQSBvciBCIG9jY3Vycy4NCg0KPGgzPjE1LjEuNSBDb21wbGVtZW50PC9oMz4NCkluIHNldCB0aGVvcnksIHRoZSBjb21wbGVtZW50IG9mIGEgc2V0IEEgcmVmZXJzIHRvIGVsZW1lbnRzIG5vdCBpbiBBLiBUaGUgcmVsYXRpdmUgY29tcGxlbWVudCBvZiBBIHdpdGggcmVzcGVjdCB0byBhIHNldCBCLCBhbHNvIHRlcm1lZCB0aGUgZGlmZmVyZW5jZSBvZiBzZXRzIEEgYW5kIEIsIHdyaXR0ZW4gQiA/Pz8gQSwgaXMgdGhlIHNldCBvZiBlbGVtZW50cyBpbiBCIGJ1dCBub3QgaW4gQSA8L3A+DQoNClNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlsZTpWZW5uMDAxMC5zdmcgPC9wPg0KDQoNClNlZSBBbHNvOiA8L2JyPg0KU2V0IFRoZW9yeTogaHR0cDovL3N0dWRlbnRzLmJyb3duLmVkdS9zZWVpbmctdGhlb3J5L2NvbXBvdW5kLXByb2JhYmlsaXR5L2luZGV4Lmh0bWwjZmlyc3QgPC9icj4NCkNvbWJpbmF0b3JpY3M6IGh0dHA6Ly9zdHVkZW50cy5icm93bi5lZHUvc2VlaW5nLXRoZW9yeS9jb21wb3VuZC1wcm9iYWJpbGl0eS9pbmRleC5odG1sI3NlY29uZCA8L2JyPg0KQ29uZGl0aW9uYWwgUHJvYmFiaWxpdHk6IGh0dHA6Ly9zdHVkZW50cy5icm93bi5lZHUvc2VlaW5nLXRoZW9yeS9jb21wb3VuZC1wcm9iYWJpbGl0eS9pbmRleC5odG1sI3RoaXJkIDwvYnI+DQo8L2JyPg0KDQo8aDI+IDE1LjIgUmFuZG9tIFZhcmlhYmxlcyBhbmQgUHJvYmFiaWxpdHkgRGlzdHJpYnV0aW9ucyA8L2gyPg0KUmFuZG9tIHZhcmlhYmxlcyBhcmUgdGhvc2Ugd2hvc2Ugc3BlY2lmaWMgb3V0Y29tZXMgYXJlIGFzc3VtZWQgdG8gYXJpc2UgYnkgY2hhbmNlIG9yIGFjY29yZGluZyB0byBzb21lIHJhbmRvbSBvciBzdG9jaGFzdGljIG1lY2hhbmlzbS48L2JyPg0KDQpQcm9iYWJpbGlzdGljIGRpc3RyaWJ1dGlvbnMgYXJlIGZ1bmN0aW9ucyB0aGF0IGRlZmluZSB0aGVzZSBwcm9iYWJpbGl0aWVzIDwvYnI+DQoNCg0KQSBxdWljayBleGFtcGxlIGlzIHRoZSBzYW1wbGUgc3BhY2Ugb2YgYW55IG51bWJlciBvZiBjb2luIGZsaXBzLCB0aGUgb3V0Y29tZXMgd2lsbCBhbHdheXMgYmUgaW50ZWdlciB2YWx1ZXMsIGFuZCB5b3UnbGwgbmV2ZXIgaGF2ZSBoYWxmIGhlYWRzIG9yIHF1YXJ0ZXIgdGFpbHMuIFN1Y2ggYSByYW5kb20gdmFyaWFibGUgaXMgcmVmZXJyZWQgdG8gYXMgZGlzY3JldGUuIERpc2NyZXRlIHJhbmRvbSB2YXJpYWJsZXMgZ2l2ZSByaXNlIHRvIGRpc2NyZXRlIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbnMuPC9icj4NCg0KDQoNCkZvbGxvd2luZyBhcmUgZWxlbWVudGFyeSB3YXlzICBpbiB3aGljaCByYW5kb20gdmFyaWFibGVzIGFyZSBzdW1tYXJpemVkIGFuZCBob3cgdGhlaXIgY29ycmVzcG9uZGluZyBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb25zIGFyZSBkZWFsdCB3aXRoIHN0YXRpc3RpY2FsbHkuDQoNCjxoMz4xNS4yLjEgUmVhbGl6YXRpb25zPC9oMz4NClJlYWl6YXRpb25zIGFyZSBhY3R1YWwgb2JzZXJ2YXRpb25zIG9mIHJhbmRvbSB2YXJpYWJsZXMuDQoNCjxoMz4xNS4yLjIgRGlzY3JldGUgUmFuZG9tIFZhcmlhYmxlczwvaDM+DQpEaXNjcmV0ZSBSYW5kb20gVmFyaWFibGVzPC9icj4NClRoZSB3b3JkIGRpc2NyZXRlIG1lYW5zIHNlcGFyYXRlIGFuZCBpbmRpdmlkdWFsLiBUaHVzIGRpc2NyZXRlIHJhbmRvbSB2YXJpYWJsZXMgYXJlIHRob3NlIHRoYXQgdGFrZSBvbiBpbnRlZ2VyIHZhbHVlcyBvbmx5LiBUaGV5IG5ldmVyIGluY2x1ZGUgZnJhY3Rpb25zIG9yIGRlY2ltYWxzLjwvYnI+DQoNClByb2JhYmlsaXR5IG1hc3MgZnVuY3Rpb25zIGFyZSBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb25zIHRpZWQgdG8gZGlzY3JldGUgcmFuZG9tIHZhcmFpYmxlcy4NCjwvYnI+DQoNCkN1bXVsYXRpdmUgcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9ucyBvZiBkaXNjcmV0ZSByYW5kb20gdmFyaWFibGVzIGlzIHRoZSBwcm9iYWJpbGl0eSBvZiBvYnNlcnZpbmcgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHggLiBUaGUgcHJvYmFiaWxpdHkgdGhhdCBYIHdpbGwgdGFrZSBhIHZhbHVlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB4LiA8L3A+DQoNClRoZSBjdW11bGF0aXZlIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbiBvZiBhIHJlYWwtdmFsdWVkIHJhbmRvbSB2YXJpYWJsZSBYIGlzIHRoZSBmdW5jdGlvbiBnaXZlbiBieQ0Ke1xkaXNwbGF5c3R5bGUgRl97WH0oeCk9XG9wZXJhdG9ybmFtZSB7UH0gKFhcbGVxIHgpLH0gRl97WH0oeCk9XG9wZXJhdG9ybmFtZSB7UH0gKFhcbGVxIHgpLA0Kd2hlcmUgdGhlIHJpZ2h0LWhhbmQgc2lkZSByZXByZXNlbnRzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHRoZSByYW5kb20gdmFyaWFibGUgWCB0YWtlcyBvbiBhIHZhbHVlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB4LiBUaGUgcHJvYmFiaWxpdHkgdGhhdCBYIGxpZXMgaW4gdGhlIHNlbWktY2xvc2VkIGludGVydmFsIChhLCBiXSwgd2hlcmUgYSAgPCAgYiwgaXMgdGhlcmVmb3JlDQp7XGRpc3BsYXlzdHlsZSBcb3BlcmF0b3JuYW1lIHtQfSAoYTxYXGxlcSBiKT1GX3tYfShiKS1GX3tYfShhKS59IFxvcGVyYXRvcm5hbWUge1B9IChhPFhcbGVxIGIpPUZfe1h9KGIpLUZfe1h9KGEpLg0KPC9wPg0KDQpUaGUgY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gZnVuY3Rpb24gKGNkZikgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIHZhcmlhYmxlIHRha2VzIGEgdmFsdWUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHguIFRoYXQgaXMNCkYoeCk9UHJbWD8/P3hdPT8/IDwvcD4NCg0KRm9yIGEgY29udGludW91cyBkaXN0cmlidXRpb24sIHRoaXMgY2FuIGJlIGV4cHJlc3NlZCBtYXRoZW1hdGljYWxseSBhczwvYnI+DQoNCkYoeCk9Pz8/eD8/Pz8/P2YoPz8pZD8/IDwvYnI+DQoNCkZvciBhIGRpc2NyZXRlIGRpc3RyaWJ1dGlvbiwgdGhlIGNkZiBjYW4gYmUgZXhwcmVzc2VkIGFzPC9icj4NCg0KRih4KT0/Pz94aT0wZihpKTwvYnI+DQoNClRoZSBmb2xsb3dpbmcgaXMgdGhlIHBsb3Qgb2YgdGhlIG5vcm1hbCBjdW11bGF0aXZlIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbi4gPC9icj4NCg0KcGxvdCBvZiBub3JtYWwgY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gZnVuY3Rpb24NCnNlZTogaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L2hhbmRib29rL2VkYS9zZWN0aW9uMy9naWYvbm9yY2RmLmdpZiANCg0KVGhlIGhvcml6b250YWwgYXhpcyBpcyB0aGUgYWxsb3dhYmxlIGRvbWFpbiBmb3IgdGhlIGdpdmVuIHByb2JhYmlsaXR5IGZ1bmN0aW9uLiBTaW5jZSB0aGUgdmVydGljYWwgYXhpcyBpcyBhIHByb2JhYmlsaXR5LCBpdCBtdXN0IGZhbGwgYmV0d2VlbiB6ZXJvIGFuZCBvbmUuIEl0IGluY3JlYXNlcyBmcm9tIHplcm8gdG8gb25lIGFzIHdlIGdvIGZyb20gbGVmdCB0byByaWdodCBvbiB0aGUgaG9yaXpvbnRhbCBheGlzLjwvcD4NCg0KYGBge3J9DQpYLm91dGNvbWVzIDwtYygtNCwwLDEsOCkNClgucHJvYiA8LWMoLjMyLC40OCwuMTUsLjA1KQ0KYmFycGxvdChYLnByb2IseWxpbT1jKDAsLjUpLG5hbWVzLmFyZz1YLm91dGNvbWVzLHNwYWNlID0gLjA1LHhsYWI9IngiLHlsYWI9IlByKFg9eCkiKQ0KYGBgDQoNCmBgYHtyfQ0KWC5jdW11bCA8LWN1bXN1bShYLnByb2IpDQpYLmN1bXVsDQpgYGANCg0KYGBge3J9DQpiYXJwbG90KFguY3VtdWwsbmFtZXMuYXJnPVgub3V0Y29tZXMsc3BhY2UgPSAuMDUseGxhYj0ieCIseWxhYj0iUHIoWD14KSIpDQpgYGANCg0KPGI+TWVhbiBhbmQgVmFyaWFuY2Ugb2YgYSBkaXNjcmV0ZSByYW5kb20gdmFyaWFibGU8L2I+PC5icj4NCk1lYW4gYW5kIHZhcmlhbmNlIGFyZSB0aGUgdHdvIG1vc3QgdXNlZnVsIHByb3BlcnRpZXMgdXNlZCB0byBkZXNjcmliZSBvciBzdW1tYXJpemUgdGhlIHByb3BlcnRpZXMgb2YgYSByYW5kb20gdmFyaWFibGUuIDwvcD4NCg0KSXQgaXMgYSBtZWFzdXJlIG9mIHNwcmVhZCBmb3IgYSBkaXN0cmlidXRpb24gb2YgYSByYW5kb20gdmFyaWFibGUgdGhhdCBkZXRlcm1pbmVzIHRoZSBkZWdyZWUgdG8gd2hpY2ggdGhlIHZhbHVlcyBvZiBhIHJhbmRvbSB2YXJpYWJsZSBkaWZmZXIgZnJvbSB0aGUgZXhwZWN0ZWQgdmFsdWUuPC9wPg0KDQpNZWFuIGlzIHRoZSBleHBlY3RlZCB2YWx1ZSAgb3IgdGhlIGF2ZXJhZ2Ugb3V0Y29tZSB0aGF0IHlvdSBjYW4gZXhwZWN0IG92ZXIgbWFueSByZWFsaXphdGlvbnMgPC9wPg0KDQoNClRoZSB2YXJpYW5jZSBvZiByYW5kb20gdmFyaWFibGUgWCBpcyBvZnRlbiB3cml0dGVuIGFzIFZhcihYKSBvciA/PzIgb3IgPz8yeC48L3A+DQoNCkZvciBhIGRpc2NyZXRlIHJhbmRvbSB2YXJpYWJsZSB0aGUgdmFyaWFuY2UgaXMgY2FsY3VsYXRlZCBieSBzdW1taW5nIHRoZSBwcm9kdWN0IG9mIHRoZSBzcXVhcmUgb2YgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdmFsdWUgb2YgdGhlIHJhbmRvbSB2YXJpYWJsZSBhbmQgdGhlIGV4cGVjdGVkIHZhbHVlIChtZWFuKSwgYW5kIHRoZSBhc3NvY2lhdGVkIHByb2JhYmlsaXR5IG9mIHRoZSB2YWx1ZSBvZiB0aGUgcmFuZG9tIHZhcmlhYmxlLCB0YWtlbiBvdmVyIGFsbCBvZiB0aGUgdmFsdWVzIG9mIHRoZSByYW5kb20gdmFyaWFibGUuPC9wPg0KDQpJbiBzeW1ib2xzLCBWYXIoWCkgPSAoeCAtID8/KTIgUChYID0geCkgIDwvcD4NCg0KQW4gZXF1aXZhbGVudCBmb3JtdWxhIGlzLCBWYXIoWCkgPSBFKFgyKSA/Pz8gW0UoWCldMiA8L3A+DQoNClRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgdmFyaWFuY2UgaXMgZXF1YWwgdG8gdGhlIHN0YW5kYXJkIGRldmlhdGlvbi48L3A+DQoNCmBgYHtyfQ0KbXUuWDwtc3VtKFgub3V0Y29tZXMqWC5wcm9iKQ0KbXUuWA0KDQpgYGANCg0KYGBge3J9DQojIHZhcmlhbmNlIG9mIFgNCnZhci5YPC1zdW0oKFgub3V0Y29tZXMtbXUuWCleMipYLnByb2IpDQp2YXIuWA0KDQpgYGANCmBgYHtyfQ0KIyBjb21wdXRlIGZvciBzdGFuZGFyZCBkZXZpYXRpb24NCnNkLlg8LXNxcnQodmFyLlgpDQpzZC5YDQpgYGANCg0KVGhlIGV4cGVjdGVkIG91dGNvbWUgb2YgLS43MyBzdWdnZXN0IHRoYXQgb24gYXZlcmFnZSB5b3UnbGwgbG9zZSAwLjczIHBlciB0dXJuIHdpdGggYSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgYWJvdXQgMi44Mi4gVGhleSBkZXNjcmliZSB0aGUgYmVoYXZpb3Igb2YgdGhlIHJhbmRvbSBtZWNoYW5pc20gb3ZlciB0aGUgbG9uZyBydW4uDQoNCjxoMz4xNS4yLjMgQ29udGludW91cyBSYW5kb20gVmFyaWFibGVzPC9oMz4NCkNvbnRpbnVvdXMgUmFuZG9tIFZhcmlhYmxlPC9icj4NCkNvbnRpbnVvdXMgaXMgdGhlIG9wcG9zaXRlIG9mIGRpc2NyZXRlLiBDb250aW51b3VzIHJhbmRvbSB2YXJpYWJsZXMgYXJlIHRob3NlIHRoYXQgdGFrZSBvbiBhbnkgdmFsdWUgaW5jbHVkaW5nIGZyYWN0aW9ucyBhbmQgZGVjaW1hbHMuIENvbnRpbnVvdXMgcmFuZG9tIHZhcmlhYmxlcyBnaXZlIHJpc2UgdG8gY29udGludW91cyBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb25zLjwvYnI+DQoNClNpbmNlIHRoZXkgYXJlIG5vdCBpbnRlZ2VycywgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGFzc2lnbiBwcm9iYWJpbGl0aWVzIHRvIGEgc3BlY2lmaWMgbnVtYmVyLiBJbnN0ZWFkIHVzZSBpbnRlcnZhbHMgb2YgdmFsdWVzLiBQcm9iYWJpbGl0aWVzIGFyZSBub3cgY29tcHV0ZWQgYXMgYXJlYXMgdW5kZXJuZWF0aC48L3A+DQoNCjxiPkN1bW11bGF0aXZlIFByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbnMgb2YgY29udGludW91cyBSYW5kb20gVmFyaWFibGVzPC9iPjwvYnI+DQpUaGUgY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gZnVuY3Rpb24gZm9yIGNvbnRpbnVvdXMgcmFuZG9tIHZhcmlhYmxlcyBpcyBqdXN0IGEgc3RyYWlnaHRmb3J3YXJkIGV4dGVuc2lvbiBvZiB0aGF0IG9mIHRoZSBkaXNjcmV0ZSBjYXNlLiBBbGwgd2UgbmVlZCB0byBkbyBpcyByZXBsYWNlIHRoZSBzdW1tYXRpb24gd2l0aCBhbiBpbnRlZ3JhbC4gPC9wPg0KDQpEZWZpbml0aW9uLiBUaGUgY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gZnVuY3Rpb24gKCJjLmQuZi4iKSBvZiBhIGNvbnRpbnVvdXMgcmFuZG9tIHZhcmlhYmxlIFggaXMgZGVmaW5lZCBhczoNCg0KRih4KT0/Pz94Pz8/Pz8/Zih0KWR0Rih4KT0/Pz8/Pz8/Pz94Zih0KWR0IDwvYnI+DQoNCmZvciA/Pz8/Pz8gPCB4IDwgPz8/LjwvYnI+DQoNCmBgYHtyfQ0Kdzwtc2VxKDM1LDk1LGJ5PTUpDQpsb3dlci53IDwtIHc+PTQwICYgdzw9NjUNCnVwcGVyLnc8LXc+NjUgJiB3PD05MA0KRnc8LXJlcCgwLGxlbmd0aCh3KSkNCkZ3W2xvd2VyLnddPC0od1tsb3dlci53XV4yLTgwKndbbG93ZXIud10rMTYwMCkvMTI1MA0KRndbdXBwZXIud108LSgxODAqd1t1cHBlci53XS13W3VwcGVyLnddXjItNjg1MCkvMTI1MA0KRndbdz45MF08LTENCnBsb3QodyxGdyx0eXBlPSJsIix5bGFiPSJGKHcpIikNCmFibGluZShoPWMoMCwxKSxjb2w9ImdyYXkiLGx0eT0yKQ0KDQpgYGANCmBgYHtyfQ0KcGxvdCh3LEZ3LHR5cGU9ImwiLHlsYWI9IkYodykiKQ0KYWJsaW5lKGg9YygwLDEpLGNvbD0iZ3JheSIsbHR5PTIpDQojIG5ldyBsaW5lcw0KZncuc3BlY2lmaWM8LSg1NS4yLTQwKS82MjUNCmZ3LnNwZWNpZmljLmFyZWE8LS41KjE1LjIqZncuc3BlY2lmaWMNCiMgYWRkZWQgbGluZXMNCmFibGluZSh2PTU1LjIsbHR5PTMpDQphYmxpbmUoaD1mdy5zcGVjaWZpYy5hcmVhLGx0eT0zKQ0KDQpgYGANCg0KDQo8Yj5NZWFuIGFuZCBWYXJpYW5jZSBvZiBhIENvbnRpbnVvdXMgUmFuZG9tIFZhcmlhYmxlPC9iPjwvYnI+DQoNClRoZSBtZWFuIG9mIGEgZGlzY3JldGUgcmFuZG9tIHZhcmlhYmxlIFggaXMgYSB3ZWlnaHRlZCBhdmVyYWdlIG9mIHRoZSBwb3NzaWJsZSB2YWx1ZXMgdGhhdCB0aGUgcmFuZG9tIHZhcmlhYmxlIGNhbiB0YWtlLiBVbmxpa2UgdGhlIHNhbXBsZSBtZWFuIG9mIGEgZ3JvdXAgb2Ygb2JzZXJ2YXRpb25zLCB3aGljaCBnaXZlcyBlYWNoIG9ic2VydmF0aW9uIGVxdWFsIHdlaWdodCwgdGhlIG1lYW4gb2YgYSByYW5kb20gdmFyaWFibGUgd2VpZ2h0cyBlYWNoIG91dGNvbWUgeGkgYWNjb3JkaW5nIHRvIGl0cyBwcm9iYWJpbGl0eSwgcGkuIFRoZSBjb21tb24gc3ltYm9sIGZvciB0aGUgbWVhbiAoYWxzbyBrbm93biBhcyB0aGUgZXhwZWN0ZWQgdmFsdWUgb2YgWCkgaXMgICwgZm9ybWFsbHkgZGVmaW5lZCBieTo8L2JyPg0KDQpUaGUgbWVhbiBvZiBhIHJhbmRvbSB2YXJpYWJsZSBwcm92aWRlcyB0aGUgbG9uZy1ydW4gYXZlcmFnZSBvZiB0aGUgdmFyaWFibGUsIG9yIHRoZSBleHBlY3RlZCBhdmVyYWdlIG91dGNvbWUgb3ZlciBtYW55IG9ic2VydmF0aW9ucy48L2JyPg0KDQpFeGFtcGxlPC9icj4NCg0KU3VwcG9zZSBhbiBpbmRpdmlkdWFsIHBsYXlzIGEgZ2FtYmxpbmcgZ2FtZSB3aGVyZSBpdCBpcyBwb3NzaWJsZSB0byBsb3NlICQxLjAwLCBicmVhayBldmVuLCB3aW4gJDMuMDAsIG9yIHdpbiAkMTAuMDAgZWFjaCB0aW1lIHNoZSBwbGF5cy4gVGhlIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbiBmb3IgZWFjaCBvdXRjb21lIGlzIHByb3ZpZGVkIGJ5IHRoZSBmb2xsb3dpbmcgdGFibGU6DQpPdXRjb21lCQktJDEuMDAJJDAuMDAJJDMuMDAJJDUuMDAJPC9icj4NClByb2JhYmlsaXR5CSAgMC4zMAkgMC40MAkgMC4yMAkgMC4xMAk8L2JyPg0KVGhlIG1lYW4gb3V0Y29tZSBmb3IgdGhpcyBnYW1lIGlzIGNhbGN1bGF0ZWQgYXMgZm9sbG93czogPC9icj4NCiA9ICgtMSouMykgKyAoMCouNCkgKyAoMyouMikgKyAoMTAqMC4xKSA9IC0wLjMgKyAwLjYgKyAwLjUgPSAwLjguIDwvYnI+DQpJbiB0aGUgbG9uZyBydW4sIHRoZW4sIHRoZSBwbGF5ZXIgY2FuIGV4cGVjdCB0byB3aW4gYWJvdXQgODAgY2VudHMgcGxheWluZyB0aGlzIGdhbWUgLS0gdGhlIG9kZHMgYXJlIGluIGhlciBmYXZvci48L2JyPg0KRm9yIGEgY29udGludW91cyByYW5kb20gdmFyaWFibGUsIHRoZSBtZWFuIGlzIGRlZmluZWQgYnkgdGhlIGRlbnNpdHkgY3VydmUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4gRm9yIGEgc3ltbWV0cmljIGRlbnNpdHkgY3VydmUsIHN1Y2ggYXMgdGhlIG5vcm1hbCBkZW5zaXR5LCB0aGUgbWVhbiBsaWVzIGF0IHRoZSBjZW50ZXIgb2YgdGhlIGN1cnZlLg0KVGhlIGxhdyBvZiBsYXJnZSBudW1iZXJzIHN0YXRlcyB0aGF0IHRoZSBvYnNlcnZlZCByYW5kb20gbWVhbiBmcm9tIGFuIGluY3JlYXNpbmdseSBsYXJnZSBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIG9mIGEgcmFuZG9tIHZhcmlhYmxlIHdpbGwgYWx3YXlzIGFwcHJvYWNoIHRoZSBkaXN0cmlidXRpb24gbWVhbiAgLiBUaGF0IGlzLCBhcyB0aGUgbnVtYmVyIG9mIG9ic2VydmF0aW9ucyBpbmNyZWFzZXMsIHRoZSBtZWFuIG9mIHRoZXNlIG9ic2VydmF0aW9ucyB3aWxsIGJlY29tZSBjbG9zZXIgYW5kIGNsb3NlciB0byB0aGUgdHJ1ZSBtZWFuIG9mIHRoZSByYW5kb20gdmFyaWFibGUuIFRoaXMgZG9lcyBub3QgaW1wbHksIGhvd2V2ZXIsIHRoYXQgc2hvcnQgdGVybSBhdmVyYWdlcyB3aWxsIHJlZmxlY3QgdGhlIG1lYW4uPC9icj4NCg0KSW4gdGhlIGFib3ZlIGdhbWJsaW5nIGV4YW1wbGUsIHN1cHBvc2UgYSB3b21hbiBwbGF5cyB0aGUgZ2FtZSBmaXZlIHRpbWVzLCB3aXRoIHRoZSBvdXRjb21lcyAkMC4wMCwgLSQxLjAwLCAkMC4wMCwgJDAuMDAsIC0kMS4wMC4gU2hlIG1pZ2h0IGFzc3VtZSwgc2luY2UgdGhlIHRydWUgbWVhbiBvZiB0aGUgcmFuZG9tIHZhcmlhYmxlIGlzICQwLjgwLCB0aGF0IHNoZSB3aWxsIHdpbiB0aGUgbmV4dCBmZXcgZ2FtZXMgaW4gb3JkZXIgdG8gIm1ha2UgdXAiIGZvciB0aGUgZmFjdCB0aGF0IHNoZSBoYXMgYmVlbiBsb3NpbmcuIFVuZm9ydHVuYXRlbHkgZm9yIGhlciwgdGhpcyBsb2dpYyBoYXMgbm8gYmFzaXMgaW4gcHJvYmFiaWxpdHkgdGhlb3J5LiBUaGUgbGF3IG9mIGxhcmdlIG51bWJlcnMgZG9lcyBub3QgYXBwbHkgZm9yIGEgc2hvcnQgc3RyaW5nIG9mIGV2ZW50cywgYW5kIGhlciBjaGFuY2VzIG9mIHdpbm5pbmcgdGhlIG5leHQgZ2FtZSBhcmUgbm8gYmV0dGVyIHRoYW4gaWYgc2hlIGhhZCB3b24gdGhlIHByZXZpb3VzIGdhbWUuPC9icj4NCg0KDQpUaGUgdmFyaWFuY2Ugb2YgYSBkaXNjcmV0ZSByYW5kb20gdmFyaWFibGUgWCBtZWFzdXJlcyB0aGUgc3ByZWFkLCBvciB2YXJpYWJpbGl0eSwgb2YgdGhlIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGRlZmluZWQgYnk8L2JyPg0KDQpUaGUgc3RhbmRhcmQgZGV2aWF0aW9uICBpcyB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIHZhcmlhbmNlLjwvYnI+DQoNCkV4YW1wbGU8L2JyPg0KDQpJbiB0aGUgb3JpZ2luYWwgZ2FtYmxpbmcgZ2FtZSBhYm92ZSwgdGhlIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbiB3YXMgZGVmaW5lZCB0byBiZTo8L2JyPg0KT3V0Y29tZQkJLSQxLjAwCSQwLjAwCSQzLjAwCSQ1LjAwCTwvYnI+DQpQcm9iYWJpbGl0eQkgIDAuMzAJIDAuNDAJIDAuMjAJIDAuMTAJPC9icj4NClRoZSB2YXJpYW5jZSBmb3IgdGhpcyBkaXN0cmlidXRpb24sIHdpdGggbWVhbiA9IDAuOCwgbWF5IGJlIGNhbGN1bGF0ZWQgYXMgZm9sbG93czo8L2JyPg0KKC0xIC0gMC44KTIqMC4zICsgKDAgLSAwLjgpMiowLjQgKyAoMyAtIDAuOCkyKjAuMiArICg1IC0gMC4zKTIqMC4xIDwvYnI+DQo9ICgtMS44KTIqMC4zICsgKC0wLjgpMiowLjQgKyAoMi4yKTIqMC4yICsgKDQuMikyKjAuMSA8L2JyPg0KPSAzLjI0KjAuMyArIDAuNjQqMC40ICsgNC44NCowLjIgKyAxNy42NCowLjEgPC9icj4NCj0gMC45NzIgKyAwLjI1NiArIDAuOTY4ICsgMS43NjQgPSAzLjk2MCwgd2l0aCBzdGFuZGFyZCBkZXZpYXRpb24gPSAxLjk5MC4gPC9icj4NClNpbmNlIHRoZXJlIGlzIG5vdCBhIHZlcnkgbGFyZ2UgcmFuZ2Ugb2YgcG9zc2libGUgdmFsdWVzLCB0aGUgdmFyaWFuY2UgaXMgc21hbGwuPC9icj4NCg0KYGBge3J9DQojIHZhcmlhYmxlDQpmdyA8LXJlcCgwLGxlbmd0aCh3KSkNCmZ3W2xvd2VyLnddPC0od1tsb3dlci53XS00MCkvNjI1DQpmd1t1cHBlci53XTwtKDkwLXdbdXBwZXIud10pLzYyNQ0KIyBwbG90DQpwbG90KHcsdypmdyx0eXBlPSJsIix5bGFiPSJ3Zih3KSIpDQoNCg0KYGBgDQpJbnRlZ3JhbmRzIGZvciB0aGUgZXhwZWN0ZWQgdmFsdWUuDQoNCmBgYHtyfQ0KcGxvdCh3LCh3LTY1KV4yKmZ3LHR5cGU9ImwiLHlsYWI9Iih3LTY1KV4yIGYodykiKQ0KYGBgDQpWYXJpYW5jZSBvZiB0aGUgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBmb3IgdGhlIHRtZXBhcnR1cmUgZXhhbXBsZS4NCg0KDQo8aDM+MTUuMi40IFNoYXBlLCBTa2V3IGFuZCBNb2RhbGl0eTwvaDM+DQoNCldoYXQgZG8gd2UgbG9vayBmb3IgaW4gPz8/U2hhcGU/Pz8/IFdlIG11c3QgYmUgYWJsZSB0byBkZXNjcmliZSB0aGUgdmlzdWFsIGltcHJlc3Npb25zLiBTaGFwZSBvZiBkaXN0cmlidXRpb246IFBvcHVsYXRpb25zIHdpdGggdGhlIHNhbWUgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIGNhbiBzdGlsbCBoYXZlIGRpc3RyaWJ1dGlvbnMgd2l0aCB2ZXJ5IGRpZmZlcmVudCBzaGFwZXMuPC9wPg0KDQpTeW1tZXRyeTwvYnI+DQoNCmJlbGwgc2hhcGVkIG9yIG5vcm1hbDwvYnI+DQp1bmlmb3JtPC9icj4NClNrZXduZXNzPC9icj4NCjwvYnI+DQpza2V3ZWQgdG8gdGhlIHJpZ2h0IChza2V3ZWQgcG9zaXRpdmVseSk8L2JyPg0Kc2tld2VkIHRvIHRoZSBsZWZ0IChza2V3ZWQgPz8/ICk8L2JyPg0KZ3JhcGhzPC9icj4NCg0KTW9kYWxpdHkgLSAjIG9mIHByb21pbmVudCBwZWFrczwvYnI+DQo8L2JyPg0KdW5pbW9kYWw8L2JyPg0KYmltb2RhbDwvYnI+DQoNCnNlZSBwaWN0dXJlIGhlcmU6DQpodHRwczovL29ubGluZWNvdXJzZXMuc2NpZW5jZS5wc3UuZWR1L3N0YXQ1MDQvc2l0ZXMvb25saW5lY291cnNlcy5zY2llbmNlLnBzdS5lZHUuc3RhdDUwNC9maWxlcy9sZXNzb24wMS9za2V3X2dyYXBocy5naWYgDQoNCg0KDQo=