> As I said before, PCA will find the
“best” line according to two different criteria of what is the “best”.
First, the variation of values along this line should be maximal. Pay
attention to how the “spread” (we call it “variance”) of the red dots
changes while the line rotates; can you see when it reaches maximum?
Second, if we reconstruct the original two characteristics (position of
a blue dot) from the new one (position of a red dot), the reconstruction
error will be given by the length of the connecting red line. Observe
how the length of these red lines changes while the line rotates; can
you see when the total length reaches minimum?
If you stare at this animation for some time, you will notice that
“the maximum variance” and “the minimum error” are reached at the same
time, namely when the line points to the magenta ticks I marked on both
sides of the wine cloud. This line corresponds to the new wine property
that will be constructed by PCA.
from a tutorial
vid Josh found
Linear models: best-fit line
Linear models, geometric intuition
Generalized linear models
Hierarchical (mixed effects) linear models
Additive vs. linear models
What about the interactions? What happened to those?
Why does adding random effects help with “anti-conservativity”?
We saw this especially in the Gubian tutorials. A reminder, from Soskuthy GAMMs tutorial, Section
2.4, p. 14:
Random effects and the independence assumption
For a quick and very accessible intro to mixed models, besides Gelman
and Hill, you can also try Winter (2019), Chs. 14 and 15.
Winter (2019, p. 232)
What is independence? Rolling a die repeatedly is a nice example of a
truly inde- pendent process. Granted that you shake the die thoroughly
before rolling it, the out- come of each roll is independent from
another one. A dependence, then, is any form of connection between data
points. For example, two data points could be connected by virtue of
coming from the same participant. In that case, these data points are
not independent anymore. Most of the time, multiple data points from the
same participant are more similar to each other than data points from
different participants. You can think of this as a statement about the
residuals: if participant A performs overall differently from
participant B, then all of participant A’s residuals will act as a
group, and so will all of participant B’s residuals.
Violations of the independence assumption have massive
effects on the Type I error (false positive) rates of a
study.
Strategies for dealing with violations of independence:
p. 233:
How can one deal with violations of the independence assumption?
Whether or not the independence assumption has been violated is
something that has to do with the design of a study, as well as with how
a study is analyzed. One can deal with the independence assumption by
designing studies that minimize dependence between data points. For
example, in some circumstances it may be possible to perform single-
trial between-participant experiments where each participant only
contributes one data point.
p. 234 > Another way of dealing with non-independences is via
aggregation. If you had multiple data points from the same participant,
why not average everything so that each participant only contributes one
data point? This is a possible way of dealing with non-independent
cases, but it’s not the optimal way, because whenever you compute
averages you lose information (see Chapter 4). In particular, the
variation across the non-independent cases is not retained in the final
analysis. If your statistical model only ‘sees’ the averaged data
points, it is going to underestimate the amount of varia- tion present
in the data. This also means that the model has less information
available for making adequate inferences.
Mixed models! Section 14.4, p. 234
These models allow incorporating non-independent clusters of data
into one’s analysis. In other words: you can tell your mixed model about
the dependency structures within a dataset so that it makes appropriate
estimates and draws appropriate inferences.
The primary workhorse for dealing with clusters of non-independent
data points are what many researchers call ‘random effects’;
specifically, ‘random intercepts’ and ‘random slopes’.
On random effects as “factors” (categorical)
While fixed effects can be continuous (Chapters 4–6) or cat- egorical
(Chapter 7), random effects are necessarily categorical. Why? Think
about it this way: the whole point of fitting a mixed model is to
account for dependent clusters of data points that somehow group
together. The concept of a ‘group’ is a categorical one….it may also
help to think from a sampling perspective: sampling from a population,
such as the population of all speakers, involves sampling discrete units
of that population.
Note also that with random effects, “mixed models do not actually
estimate one parameter per participant in this dataset. Instead, mixed
models estimate the variation around the specified random effect. So, if
you allow intercepts to vary by participants in your model, then this
only adds one term to your model.”
Another perspective from Soskuthy tutorial, Section 2.4,
p. 12-14
Without “telling” the model about structure in the data, we
artificially interflate “n”.
When we fit a regression model to our data set without random effects
or an approriate error model, we essentially ignore the
grouping/temporal/spatial structure in the data: we pretend that the
data set consists of independent measurements, each of them taken from a
separate vowel. As a result, we will also erroneously assume that all
the information in the individual data points can be used towards
estimating the underlying parameters, even though some of the
information is actually about other things like the separate
trajectories. Since we think that we have more information that we
actually do, we become overconfident about our estimates, which leads to
anti-conservative results: p-values that are biased downwards and overly
narrow confidence intervals. When the random effects / error model are
correctly specified, the model uses the right amount of information
towards estimating the underlying parameters, and the overconfidence
issue disappears.
GAMMs not a panacea!
Using
GAMMs to model trial-by-trial fluctuations in experimental data: More
risks but hardly any benefit: Thul, Conklin and Barr (JML, 2021), OSF repo.
From an old (now only existing in cached archives) Twitter
thread by Dale Barr
Psychology data often include trial-by-trial fluctuations due to
human factors such as practice or fatigue. Should you model these
patterns, or just ignore them? Here are highlights from a study I did
with Rüdiger Thul and Kathy Conklin:
We investigated the use of Generalized Additive Mixed Models (GAMMs),
a technique which can account for wiggly patterns in data. Advocates of
using GAMMs claim that if you ignore by-trial fluctuations, you end up
with autocorrelated residuals. They claim autocorrelated residuals
inflate false positives. Wrong: we show temporal autocorrelation is
irrelevant for randomized experiments, except in special cases. BUT, you
could reduce noise by modeling the wiggly patterns using GAMMs. The
question is: SHOULD you? This depends on the costs and benefits of using
GAMMs. We used Monte Carlo simulation, evaulating the performance of
GAMMs versus Linear Mixed-Effects Models (LMEMs) across a wide variety
of by-trial patterns. The simulated experiments had one within-subject
and one between-subject factor. What we found surprised us: GAMMs
slightly increased power for within-subject effects but they seemed only
to do this by sacrificing power for between-subject effects, often
severely! LMEMs had good power and showed no signs of excess false
positives. We conclude: (1) it’s not really necessary to use GAMMs if
time is not of interest; (2) take care to randomize trial order to avoid
problems; and (3) don’t use GAMMs if between-subject effects are
important!
And update
thread in April 2021:
The current thread describes new results, available in the updated
preprint as well as in the final published version in JML.
A main criticism of the original manuscript was that we used default
(unpenalized) random smooths, which behave like fixed, not random
effects. We re-ran the simulations to estimate power for penalized
smooths. GAMMs still showed poor power vs LMEMs for
between-subject effects.
However, these simulations used artificial autocorrelated errors,
raising concerns about external validity. So we ran a second set of
simulations where we randomly sampled residuals from the Stroop task in
the Many Labs 3 mega-study by @CharlieEbersole et al #hoorayforopendata
The Stroop residuals from ML3 show strong practice effects as well as
other patterns across three blocks of trials. Here are residual-by-trial
plots from a subset of subjects as well as mean residual-by-trial plots
for the 3K+ participants in the dataset.
Despite the practice effects, mixed effects models were totally fine.
GAMMs showed the same basic pattern as in the first simulations: small
benefit to within-subject power, loss of power for between subject
effects (but only for the recommended ‘penalized’ version).
Bottom line: most experiments already negate temporal
autocorrelation by randomizing. GAMMs may have hidden costs, so handle
with care.
P.S.: The repo has all the simulation data, supplementary simulation
results, as well as an R package (autocorr) bundled into a Singularity
software container for reproducibility. It includes instructions for
creating simulations with your own time-varying error patterns.
From the paper:
Keeping in mind that we are focused on experiments with univariate
data and random presentation order, observing temporal autocorrelation
in residuals from models where time does not appear as a variable should
not be cause for concern about violating independence assumptions. If
temporal autocorrelation appears in the residuals and the analyst
chooses to ignore it, it is wrong to view the analyst’s model as
statistically unsound on that basis alone. They are non-independent only
with respect to a variable that is invisible to the model. It is more
accurate to view the analyst as having foregone the opportunity to
obtain more precise estimates by incorporating the temporal structure in
the model. Opting out from doing so can be a rational choice: GAMMs are
technically challenging, they yield complex output that can be difficult
to interpret, and their potential pitfalls are not well known.
Consequently, using them does not guarantee better insight into
data.
Lest it still seem ‘wrong’ or ‘inappropriate’ for an analyst to
ignore residual autocorrelation when analyzing data from a randomized
experiment, let us attempt to further dislodge this notion by
considering yet another way in which experimental data form a time
series. Just as the individual measurements taken from a given subject
are influenced by the characteristics of the particular moment at which
the measurement is taken, so is the overall performance of a subject
influenced by the time of day at which testing occurs, with subjects
often showing more efficient performance on tasks during afternoons
compared to mornings (Kleitman, 1963, Blake, 1967). Time of day
fluctuations are very likely to induce residual autocorrelation, at
least for tasks that are minimally cognitively demanding. In a study
where you attempt to predict participants’ mean performance by
experimental group, this autocorrelation could be seen by plotting the
residual for each subject against the time of day at which the session
took place. Yet despite this variable being a likely source of
non-independence, and despite it being a variable that is recorded in
every experiment (if only by computer timestamps) it is almost always
ignored during analysis. Why does no one question this?.
We do not worry about time-of-day effects for the same reason we need
not worry about time-of-trial effects: because we randomized.
Randomization prospectively guards against the contamination of variance
we care about by variance that we don’t. Even beyond time of trial or
time of day effects, in any study there is a potentially infinite number
of possible variables for which residuals, when plotted against the
variable values, would show non-independence—day of the week, season of
the year, temperature of the room, degree of ambient visual or acoustic
noise, subject conscienciousness, visual angle subtended by stimuli
relative to each subject’s visual acuity, and so on. So long as we have
randomized, we don’t need to worry about non-independence relative to
these variables. Trial-by-trial fluctuations in performance are no
different.
Distinction between time as a “nuisance factor” and as an inescapable
part of the data structure itself:
We have also only considered univariate data where there is a single
observation per trial. This excludes from consideration many types of
research such as visual world eyetracking, EEG/MEG, pupillometry, and
longitudinal studies. Our intention is not to dampen enthusiasm for the
use of GAMMs in analyses where time is a critical variable. Indeed,
GAMMs strike us as a promising approach in these contexts (van Rij et
al., 2019).
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCiFbQWJzdHJhY3QgdmVjdG9yIHNwYWNlc10oaW1nL3ZlY3RvcnNfc3BhY2VzLnBuZykKCgohW0xpbmVhcml0eSBkZWZpbml0aW9uXShpbWcvbGluZWFyaXR5LnBuZykKCgohW1BDQSB2aXN1YWxpemF0aW9uXShodHRwczovL2kuc3RhY2suaW1ndXIuY29tL1E3SElQLmdpZikKPiBBcyBJIHNhaWQgYmVmb3JlLCBQQ0Egd2lsbCBmaW5kIHRoZSAiYmVzdCIgbGluZSBhY2NvcmRpbmcgdG8gdHdvIGRpZmZlcmVudCBjcml0ZXJpYSBvZiB3aGF0IGlzIHRoZSAiYmVzdCIuIEZpcnN0LCB0aGUgdmFyaWF0aW9uIG9mIHZhbHVlcyBhbG9uZyB0aGlzIGxpbmUgc2hvdWxkIGJlIG1heGltYWwuIFBheSBhdHRlbnRpb24gdG8gaG93IHRoZSAic3ByZWFkIiAod2UgY2FsbCBpdCAidmFyaWFuY2UiKSBvZiB0aGUgcmVkIGRvdHMgY2hhbmdlcyB3aGlsZSB0aGUgbGluZSByb3RhdGVzOyBjYW4geW91IHNlZSB3aGVuIGl0IHJlYWNoZXMgbWF4aW11bT8gU2Vjb25kLCBpZiB3ZSByZWNvbnN0cnVjdCB0aGUgb3JpZ2luYWwgdHdvIGNoYXJhY3RlcmlzdGljcyAocG9zaXRpb24gb2YgYSBibHVlIGRvdCkgZnJvbSB0aGUgbmV3IG9uZSAocG9zaXRpb24gb2YgYSByZWQgZG90KSwgdGhlIHJlY29uc3RydWN0aW9uIGVycm9yIHdpbGwgYmUgZ2l2ZW4gYnkgdGhlIGxlbmd0aCBvZiB0aGUgY29ubmVjdGluZyByZWQgbGluZS4gT2JzZXJ2ZSBob3cgdGhlIGxlbmd0aCBvZiB0aGVzZSByZWQgbGluZXMgY2hhbmdlcyB3aGlsZSB0aGUgbGluZSByb3RhdGVzOyBjYW4geW91IHNlZSB3aGVuIHRoZSB0b3RhbCBsZW5ndGggcmVhY2hlcyBtaW5pbXVtPwoKPiBJZiB5b3Ugc3RhcmUgYXQgdGhpcyBhbmltYXRpb24gZm9yIHNvbWUgdGltZSwgeW91IHdpbGwgbm90aWNlIHRoYXQgInRoZSBtYXhpbXVtIHZhcmlhbmNlIiBhbmQgInRoZSBtaW5pbXVtIGVycm9yIiBhcmUgcmVhY2hlZCBhdCB0aGUgc2FtZSB0aW1lLCBuYW1lbHkgd2hlbiB0aGUgbGluZSBwb2ludHMgdG8gdGhlIG1hZ2VudGEgdGlja3MgSSBtYXJrZWQgb24gYm90aCBzaWRlcyBvZiB0aGUgd2luZSBjbG91ZC4gVGhpcyBsaW5lIGNvcnJlc3BvbmRzIHRvIHRoZSBuZXcgd2luZSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgY29uc3RydWN0ZWQgYnkgUENBLgoKCgpmcm9tIGEgW3R1dG9yaWFsIHZpZCBKb3NoIGZvdW5kXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PTkyanN1TERtaVcwKQoKIVtMaW5lYXIgcmVncmVzc2lvbiBhbmQgdGhlIGhhdCBtYXRyaXhdKGltZy9oYXRfbWF0cml4LnBuZykKCgpMaW5lYXIgbW9kZWxzOiBiZXN0LWZpdCBsaW5lCgoKTGluZWFyIG1vZGVscywgZ2VvbWV0cmljIGludHVpdGlvbgoKCgoKCgoKR2VuZXJhbGl6ZWQgbGluZWFyIG1vZGVscwoKSGllcmFyY2hpY2FsIChtaXhlZCBlZmZlY3RzKSBsaW5lYXIgbW9kZWxzIAoKQWRkaXRpdmUgdnMuIGxpbmVhciBtb2RlbHMKCldoYXQgYWJvdXQgdGhlIGludGVyYWN0aW9ucz8gV2hhdCBoYXBwZW5lZCB0byB0aG9zZT8KCgojIFdoeSBkb2VzIGFkZGluZyByYW5kb20gZWZmZWN0cyBoZWxwIHdpdGggImFudGktY29uc2VydmF0aXZpdHkiPyAKCldlIHNhdyB0aGlzIGVzcGVjaWFsbHkgaW4gdGhlIEd1YmlhbiB0dXRvcmlhbHMuIEEgcmVtaW5kZXIsIGZyb20gW1Nvc2t1dGh5IEdBTU1zIHR1dG9yaWFsLCBTZWN0aW9uIDIuNCwgcC4gMTRdKGh0dHBzOi8vYXJ4aXYub3JnL2Ficy8xNzAzLjA1MzM5KToKCiFbRmlndXJlOiBpbmNyZWFzaW5nIENJcyBhcyByYW5kb20gZWZmZWN0cyBhZGRlZF0oaW1nL3Nvc2t1dGh5X3JhbmVmX2Npcy5wbmcpCgoKIyMgUmFuZG9tIGVmZmVjdHMgYW5kIHRoZSBpbmRlcGVuZGVuY2UgYXNzdW1wdGlvbgoKRm9yIGEgcXVpY2sgYW5kIHZlcnkgYWNjZXNzaWJsZSBpbnRybyB0byBtaXhlZCBtb2RlbHMsIGJlc2lkZXMgR2VsbWFuIGFuZCBIaWxsLCB5b3UgY2FuIGFsc28gdHJ5IFdpbnRlciAoMjAxOSksIENocy4gMTQgYW5kIDE1LgoKV2ludGVyICgyMDE5LCBwLiAyMzIpCgo+IFdoYXQgaXMgaW5kZXBlbmRlbmNlPyBSb2xsaW5nIGEgZGllIHJlcGVhdGVkbHkgaXMgYSBuaWNlIGV4YW1wbGUgb2YgYSB0cnVseSBpbmRlLSBwZW5kZW50IHByb2Nlc3MuIEdyYW50ZWQgdGhhdCB5b3Ugc2hha2UgdGhlIGRpZSB0aG9yb3VnaGx5IGJlZm9yZSByb2xsaW5nIGl0LCB0aGUgb3V0LSBjb21lIG9mIGVhY2ggcm9sbCBpcyBpbmRlcGVuZGVudCBmcm9tIGFub3RoZXIgb25lLiBBIGRlcGVuZGVuY2UsIHRoZW4sIGlzIGFueSBmb3JtIG9mIGNvbm5lY3Rpb24gYmV0d2VlbiBkYXRhIHBvaW50cy4gRm9yIGV4YW1wbGUsIHR3byBkYXRhIHBvaW50cyBjb3VsZCBiZSBjb25uZWN0ZWQgYnkgdmlydHVlIG9mIGNvbWluZyBmcm9tIHRoZSBzYW1lIHBhcnRpY2lwYW50LiBJbiB0aGF0IGNhc2UsIHRoZXNlIGRhdGEgcG9pbnRzIGFyZSBub3QgaW5kZXBlbmRlbnQgYW55bW9yZS4gTW9zdCBvZiB0aGUgdGltZSwgbXVsdGlwbGUgZGF0YSBwb2ludHMgZnJvbSB0aGUgc2FtZSBwYXJ0aWNpcGFudCBhcmUgbW9yZSBzaW1pbGFyIHRvIGVhY2ggb3RoZXIgdGhhbiBkYXRhIHBvaW50cyBmcm9tIGRpZmZlcmVudCBwYXJ0aWNpcGFudHMuIFlvdSBjYW4gdGhpbmsgb2YgdGhpcyBhcyBhIHN0YXRlbWVudCBhYm91dCB0aGUgcmVzaWR1YWxzOiBpZiBwYXJ0aWNpcGFudCBBIHBlcmZvcm1zIG92ZXJhbGwgZGlmZmVyZW50bHkgZnJvbSBwYXJ0aWNpcGFudCBCLCB0aGVuIGFsbCBvZiBwYXJ0aWNpcGFudCBB4oCZcyByZXNpZHVhbHMgd2lsbCBhY3QgYXMgYSBncm91cCwgYW5kIHNvIHdpbGwgYWxsIG9mIHBhcnRpY2lwYW50IELigJlzIHJlc2lkdWFscy4KCj4gKipWaW9sYXRpb25zIG9mIHRoZSBpbmRlcGVuZGVuY2UgYXNzdW1wdGlvbiBoYXZlIG1hc3NpdmUgZWZmZWN0cyBvbiB0aGUgVHlwZSBJIGVycm9yIChmYWxzZSBwb3NpdGl2ZSkgcmF0ZXMgb2YgYSBzdHVkeS4qKgoKKlN0cmF0ZWdpZXMgZm9yIGRlYWxpbmcgd2l0aCB2aW9sYXRpb25zIG9mIGluZGVwZW5kZW5jZToqCgpwLiAyMzM6Cgo+IEhvdyBjYW4gb25lIGRlYWwgd2l0aCB2aW9sYXRpb25zIG9mIHRoZSBpbmRlcGVuZGVuY2UgYXNzdW1wdGlvbj8gV2hldGhlciBvciBub3QgdGhlIGluZGVwZW5kZW5jZSBhc3N1bXB0aW9uIGhhcyBiZWVuIHZpb2xhdGVkIGlzIHNvbWV0aGluZyB0aGF0IGhhcyB0byBkbyB3aXRoIHRoZSBkZXNpZ24gb2YgYSBzdHVkeSwgYXMgd2VsbCBhcyB3aXRoIGhvdyBhIHN0dWR5IGlzIGFuYWx5emVkLiBPbmUgY2FuIGRlYWwgd2l0aCB0aGUgaW5kZXBlbmRlbmNlIGFzc3VtcHRpb24gYnkgZGVzaWduaW5nIHN0dWRpZXMgdGhhdCBtaW5pbWl6ZSBkZXBlbmRlbmNlIGJldHdlZW4gZGF0YSBwb2ludHMuIEZvciBleGFtcGxlLCBpbiBzb21lIGNpcmN1bXN0YW5jZXMgaXQgbWF5IGJlIHBvc3NpYmxlIHRvIHBlcmZvcm0gc2luZ2xlLSB0cmlhbCBiZXR3ZWVuLXBhcnRpY2lwYW50IGV4cGVyaW1lbnRzIHdoZXJlIGVhY2ggcGFydGljaXBhbnQgb25seSBjb250cmlidXRlcyBvbmUgZGF0YSBwb2ludC4KCnAuIDIzNAo+IEFub3RoZXIgd2F5IG9mIGRlYWxpbmcgd2l0aCBub24taW5kZXBlbmRlbmNlcyBpcyB2aWEgYWdncmVnYXRpb24uIElmIHlvdSBoYWQgbXVsdGlwbGUgZGF0YSBwb2ludHMgZnJvbSB0aGUgc2FtZSBwYXJ0aWNpcGFudCwgd2h5IG5vdCBhdmVyYWdlIGV2ZXJ5dGhpbmcgc28gdGhhdCBlYWNoIHBhcnRpY2lwYW50IG9ubHkgY29udHJpYnV0ZXMgb25lIGRhdGEgcG9pbnQ/IFRoaXMgaXMgYSBwb3NzaWJsZSB3YXkgb2YgZGVhbGluZyB3aXRoIG5vbi1pbmRlcGVuZGVudCBjYXNlcywgYnV0IGl04oCZcyBub3QgdGhlIG9wdGltYWwgd2F5LCBiZWNhdXNlIHdoZW5ldmVyIHlvdSBjb21wdXRlIGF2ZXJhZ2VzIHlvdSBsb3NlIGluZm9ybWF0aW9uIChzZWUgQ2hhcHRlciA0KS4gSW4gcGFydGljdWxhciwgdGhlIHZhcmlhdGlvbiBhY3Jvc3MgdGhlIG5vbi1pbmRlcGVuZGVudCBjYXNlcyBpcyBub3QgcmV0YWluZWQgaW4gdGhlIGZpbmFsIGFuYWx5c2lzLiBJZiB5b3VyIHN0YXRpc3RpY2FsIG1vZGVsIG9ubHkg4oCYc2Vlc+KAmSB0aGUgYXZlcmFnZWQgZGF0YSBwb2ludHMsIGl0IGlzIGdvaW5nIHRvIHVuZGVyZXN0aW1hdGUgdGhlIGFtb3VudCBvZiB2YXJpYS0gdGlvbiBwcmVzZW50IGluIHRoZSBkYXRhLiBUaGlzIGFsc28gbWVhbnMgdGhhdCB0aGUgbW9kZWwgaGFzIGxlc3MgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGZvciBtYWtpbmcgYWRlcXVhdGUgaW5mZXJlbmNlcy4KCk1peGVkIG1vZGVscyEgU2VjdGlvbiAxNC40LCBwLiAyMzQKCj4gVGhlc2UgbW9kZWxzIGFsbG93IGluY29ycG9yYXRpbmcgbm9uLWluZGVwZW5kZW50IGNsdXN0ZXJzIG9mIGRhdGEgaW50byBvbmXigJlzIGFuYWx5c2lzLiBJbiBvdGhlciB3b3JkczogeW91IGNhbiB0ZWxsIHlvdXIgbWl4ZWQgbW9kZWwgYWJvdXQgdGhlIGRlcGVuZGVuY3kgc3RydWN0dXJlcyB3aXRoaW4gYSBkYXRhc2V0IHNvIHRoYXQgaXQgbWFrZXMgYXBwcm9wcmlhdGUgZXN0aW1hdGVzIGFuZCBkcmF3cyBhcHByb3ByaWF0ZSBpbmZlcmVuY2VzLgoKPlRoZSBwcmltYXJ5IHdvcmtob3JzZSBmb3IgZGVhbGluZyB3aXRoIGNsdXN0ZXJzIG9mIG5vbi1pbmRlcGVuZGVudCBkYXRhIHBvaW50cyBhcmUgd2hhdCBtYW55IHJlc2VhcmNoZXJzIGNhbGwg4oCYcmFuZG9tIGVmZmVjdHPigJk7IHNwZWNpZmljYWxseSwg4oCYcmFuZG9tIGludGVyY2VwdHPigJkgYW5kIOKAmHJhbmRvbSBzbG9wZXPigJkuCgpPbiByYW5kb20gZWZmZWN0cyBhcyAiZmFjdG9ycyIgKGNhdGVnb3JpY2FsKQoKPiBXaGlsZSBmaXhlZCBlZmZlY3RzIGNhbiBiZSBjb250aW51b3VzIChDaGFwdGVycyA04oCTNikgb3IgY2F0LSBlZ29yaWNhbCAoQ2hhcHRlciA3KSwgcmFuZG9tIGVmZmVjdHMgYXJlIG5lY2Vzc2FyaWx5IGNhdGVnb3JpY2FsLiBXaHk/IFRoaW5rIGFib3V0IGl0IHRoaXMgd2F5OiB0aGUgd2hvbGUgcG9pbnQgb2YgZml0dGluZyBhIG1peGVkIG1vZGVsIGlzIHRvIGFjY291bnQgZm9yIGRlcGVuZGVudCBjbHVzdGVycyBvZiBkYXRhIHBvaW50cyB0aGF0IHNvbWVob3cgZ3JvdXAgdG9nZXRoZXIuIFRoZSBjb25jZXB0IG9mIGEg4oCYZ3JvdXDigJkgaXMgYSBjYXRlZ29yaWNhbCBvbmUuLi4uaXQgbWF5IGFsc28gaGVscCB0byB0aGluayBmcm9tIGEgc2FtcGxpbmcgcGVyc3BlY3RpdmU6IHNhbXBsaW5nIGZyb20gYSBwb3B1bGF0aW9uLCBzdWNoIGFzIHRoZSBwb3B1bGF0aW9uIG9mIGFsbCBzcGVha2VycywgaW52b2x2ZXMgc2FtcGxpbmcgZGlzY3JldGUgdW5pdHMgb2YgdGhhdCBwb3B1bGF0aW9uLgoKTm90ZSBhbHNvIHRoYXQgd2l0aCByYW5kb20gZWZmZWN0cywgIm1peGVkIG1vZGVscyBkbyBub3QgYWN0dWFsbHkgZXN0aW1hdGUgb25lIHBhcmFtZXRlciBwZXIgcGFydGljaXBhbnQgaW4gdGhpcyBkYXRhc2V0LiBJbnN0ZWFkLCBtaXhlZCBtb2RlbHMgZXN0aW1hdGUgdGhlIHZhcmlhdGlvbiBhcm91bmQgdGhlIHNwZWNpZmllZCByYW5kb20gZWZmZWN0LiBTbywgaWYgeW91IGFsbG93IGludGVyY2VwdHMgdG8gdmFyeSBieSBwYXJ0aWNpcGFudHMgaW4geW91ciBtb2RlbCwgdGhlbiB0aGlzIG9ubHkgYWRkcyBvbmUgdGVybSB0byB5b3VyIG1vZGVsLiIgCgohW0ZpZ3VyZTogQWRkaW5nIGluIHJhbmRvbSBlZmZlY3RzXShpbWcvd2ludGVyMTlfcmFuZWYucG5nKQoKCkFub3RoZXIgcGVyc3BlY3RpdmUgZnJvbSBbU29za3V0aHkgdHV0b3JpYWwsIFNlY3Rpb24gMi40LCBwLiAxMi0xNF0oaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzE3MDMuMDUzMzkpCgpXaXRob3V0ICJ0ZWxsaW5nIiB0aGUgbW9kZWwgYWJvdXQgc3RydWN0dXJlIGluIHRoZSBkYXRhLCB3ZSBhcnRpZmljaWFsbHkgaW50ZXJmbGF0ZSAibiIuIAoKPiBXaGVuIHdlIGZpdCBhIHJlZ3Jlc3Npb24gbW9kZWwgdG8gb3VyIGRhdGEgc2V0IHdpdGhvdXQgcmFuZG9tIGVmZmVjdHMgb3IgYW4gYXBwcm9yaWF0ZSBlcnJvciBtb2RlbCwgd2UgZXNzZW50aWFsbHkgaWdub3JlIHRoZSBncm91cGluZy90ZW1wb3JhbC9zcGF0aWFsIHN0cnVjdHVyZSBpbiB0aGUgZGF0YTogd2UgcHJldGVuZCB0aGF0IHRoZSBkYXRhIHNldCBjb25zaXN0cyBvZiBpbmRlcGVuZGVudCBtZWFzdXJlbWVudHMsIGVhY2ggb2YgdGhlbSB0YWtlbiBmcm9tIGEgc2VwYXJhdGUgdm93ZWwuIEFzIGEgcmVzdWx0LCB3ZSB3aWxsIGFsc28gZXJyb25lb3VzbHkgYXNzdW1lIHRoYXQgYWxsIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgaW5kaXZpZHVhbCBkYXRhIHBvaW50cyBjYW4gYmUgdXNlZCB0b3dhcmRzIGVzdGltYXRpbmcgdGhlIHVuZGVybHlpbmcgcGFyYW1ldGVycywgZXZlbiB0aG91Z2ggc29tZSBvZiB0aGUgaW5mb3JtYXRpb24gaXMgYWN0dWFsbHkgYWJvdXQgb3RoZXIgdGhpbmdzIGxpa2UgdGhlIHNlcGFyYXRlIHRyYWplY3Rvcmllcy4gU2luY2Ugd2UgdGhpbmsgdGhhdCB3ZSBoYXZlIG1vcmUgaW5mb3JtYXRpb24gdGhhdCB3ZSBhY3R1YWxseSBkbywgd2UgYmVjb21lIG92ZXJjb25maWRlbnQgYWJvdXQgb3VyIGVzdGltYXRlcywgd2hpY2ggbGVhZHMgdG8gYW50aS1jb25zZXJ2YXRpdmUgcmVzdWx0czogcC12YWx1ZXMgdGhhdCBhcmUgYmlhc2VkIGRvd253YXJkcyBhbmQgb3Zlcmx5IG5hcnJvdyBjb25maWRlbmNlIGludGVydmFscy4gV2hlbiB0aGUgcmFuZG9tIGVmZmVjdHMgLyBlcnJvciBtb2RlbCBhcmUgY29ycmVjdGx5IHNwZWNpZmllZCwgdGhlIG1vZGVsIHVzZXMgdGhlIHJpZ2h0IGFtb3VudCBvZiBpbmZvcm1hdGlvbiB0b3dhcmRzIGVzdGltYXRpbmcgdGhlIHVuZGVybHlpbmcgcGFyYW1ldGVycywgYW5kIHRoZSBvdmVyY29uZmlkZW5jZSBpc3N1ZSBkaXNhcHBlYXJzLgoKCgojIEdBTU1zIG5vdCBhIHBhbmFjZWEhCgpbVXNpbmcgR0FNTXMgdG8gbW9kZWwgdHJpYWwtYnktdHJpYWwgZmx1Y3R1YXRpb25zIGluIGV4cGVyaW1lbnRhbCBkYXRhOiBNb3JlIHJpc2tzIGJ1dCBoYXJkbHkgYW55IGJlbmVmaXRdKGh0dHBzOi8vd3d3LnNjaWVuY2VkaXJlY3QuY29tL3NjaWVuY2UvYXJ0aWNsZS9waWkvUzA3NDk1OTZYMjEwMDAzMDkpOiBUaHVsLCBDb25rbGluIGFuZCBCYXJyIChKTUwsIDIwMjEpLCBbT1NGIHJlcG9dKGh0dHBzOi8vb3NmLmlvL2NwOXo4LykuCgoKCkZyb20gYW4gb2xkIChub3cgb25seSBleGlzdGluZyBpbiBjYWNoZWQgYXJjaGl2ZXMpIFtUd2l0dGVyIHRocmVhZF0oaHR0cHM6Ly93ZWJjYWNoZS5nb29nbGV1c2VyY29udGVudC5jb20vc2VhcmNoP3E9Y2FjaGU6cTBZYzcxOUVIb0lKOmh0dHBzOi8vdHdpdHRlci5jb20vZGFsZWpiYXJyL3N0YXR1cy8xMjk2ODMwOTExNDc3MTYxOTg0JmNkPTEmaGw9ZW4mY3Q9Y2xuayZnbD11cykgYnkgRGFsZSBCYXJyCgo+IFBzeWNob2xvZ3kgZGF0YSBvZnRlbiBpbmNsdWRlIHRyaWFsLWJ5LXRyaWFsIGZsdWN0dWF0aW9ucyBkdWUgdG8gaHVtYW4gZmFjdG9ycyBzdWNoIGFzIHByYWN0aWNlIG9yIGZhdGlndWUuIFNob3VsZCB5b3UgbW9kZWwgdGhlc2UgcGF0dGVybnMsIG9yIGp1c3QgaWdub3JlIHRoZW0/IEhlcmUgYXJlIGhpZ2hsaWdodHMgZnJvbSBhIHN0dWR5IEkgZGlkIHdpdGggUsO8ZGlnZXIgVGh1bCBhbmQgS2F0aHkgQ29ua2xpbjoKCj4gV2UgaW52ZXN0aWdhdGVkIHRoZSB1c2Ugb2YgR2VuZXJhbGl6ZWQgQWRkaXRpdmUgTWl4ZWQgTW9kZWxzIChHQU1NcyksIGEgdGVjaG5pcXVlIHdoaWNoIGNhbiBhY2NvdW50IGZvciB3aWdnbHkgcGF0dGVybnMgaW4gZGF0YS4gQWR2b2NhdGVzIG9mIHVzaW5nIEdBTU1zIGNsYWltIHRoYXQgaWYgeW91IGlnbm9yZSBieS10cmlhbCBmbHVjdHVhdGlvbnMsIHlvdSBlbmQgdXAgd2l0aCBhdXRvY29ycmVsYXRlZCByZXNpZHVhbHMuCj4gVGhleSBjbGFpbSBhdXRvY29ycmVsYXRlZCByZXNpZHVhbHMgaW5mbGF0ZSBmYWxzZSBwb3NpdGl2ZXMuIFdyb25nOiB3ZSBzaG93IHRlbXBvcmFsIGF1dG9jb3JyZWxhdGlvbiBpcyBpcnJlbGV2YW50IGZvciByYW5kb21pemVkIGV4cGVyaW1lbnRzLCBleGNlcHQgaW4gc3BlY2lhbCBjYXNlcy4gQlVULCB5b3UgY291bGQgcmVkdWNlIG5vaXNlIGJ5IG1vZGVsaW5nIHRoZSB3aWdnbHkgcGF0dGVybnMgdXNpbmcgR0FNTXMuIFRoZSBxdWVzdGlvbiBpczogU0hPVUxEIHlvdT8KPiBUaGlzIGRlcGVuZHMgb24gdGhlIGNvc3RzIGFuZCBiZW5lZml0cyBvZiB1c2luZyBHQU1Ncy4gV2UgdXNlZCBNb250ZSBDYXJsbyBzaW11bGF0aW9uLCBldmF1bGF0aW5nIHRoZSBwZXJmb3JtYW5jZSBvZiBHQU1NcyB2ZXJzdXMgTGluZWFyIE1peGVkLUVmZmVjdHMgTW9kZWxzIChMTUVNcykgYWNyb3NzIGEgd2lkZSB2YXJpZXR5IG9mIGJ5LXRyaWFsIHBhdHRlcm5zLgo+IFRoZSBzaW11bGF0ZWQgZXhwZXJpbWVudHMgaGFkIG9uZSB3aXRoaW4tc3ViamVjdCBhbmQgb25lIGJldHdlZW4tc3ViamVjdCBmYWN0b3IuIFdoYXQgd2UgZm91bmQgc3VycHJpc2VkIHVzOiBHQU1NcyBzbGlnaHRseSBpbmNyZWFzZWQgcG93ZXIgZm9yIHdpdGhpbi1zdWJqZWN0IGVmZmVjdHMgYnV0IHRoZXkgc2VlbWVkIG9ubHkgdG8gZG8gdGhpcyBieSBzYWNyaWZpY2luZyBwb3dlciBmb3IgYmV0d2Vlbi1zdWJqZWN0IGVmZmVjdHMsIG9mdGVuIHNldmVyZWx5IQo+IExNRU1zIGhhZCBnb29kIHBvd2VyIGFuZCBzaG93ZWQgbm8gc2lnbnMgb2YgZXhjZXNzIGZhbHNlIHBvc2l0aXZlcy4gV2UgY29uY2x1ZGU6ICgxKSBpdCdzIG5vdCByZWFsbHkgbmVjZXNzYXJ5IHRvIHVzZSBHQU1NcyBpZiB0aW1lIGlzIG5vdCBvZiBpbnRlcmVzdDsgKDIpIHRha2UgY2FyZSB0byByYW5kb21pemUgdHJpYWwgb3JkZXIgdG8gYXZvaWQgcHJvYmxlbXM7IGFuZCAoMykgZG9uJ3QgdXNlIEdBTU1zIGlmIGJldHdlZW4tc3ViamVjdCBlZmZlY3RzIGFyZSBpbXBvcnRhbnQhCgpBbmQgW3VwZGF0ZSB0aHJlYWQgaW4gQXByaWwgMjAyMV0oaHR0cHM6Ly93ZWJjYWNoZS5nb29nbGV1c2VyY29udGVudC5jb20vc2VhcmNoP3E9Y2FjaGU6c3lUTnhXbXpZQTBKOmh0dHBzOi8vdHdpdHRlci5jb20vZGFsZWpiYXJyL3N0YXR1cy8xMzg0NDU2NzM5NTI1ODQ5MDk1JmNkPTImaGw9ZW4mY3Q9Y2xuayZnbD11cyk6Cgo+IFRoZSBjdXJyZW50IHRocmVhZCBkZXNjcmliZXMgbmV3IHJlc3VsdHMsIGF2YWlsYWJsZSBpbiB0aGUgdXBkYXRlZCBwcmVwcmludCBhcyB3ZWxsIGFzIGluIHRoZSBmaW5hbCBwdWJsaXNoZWQgdmVyc2lvbiBpbiBKTUwuCgo+IEEgbWFpbiBjcml0aWNpc20gb2YgdGhlIG9yaWdpbmFsIG1hbnVzY3JpcHQgd2FzIHRoYXQgd2UgdXNlZCBkZWZhdWx0ICh1bnBlbmFsaXplZCkgcmFuZG9tIHNtb290aHMsIHdoaWNoIGJlaGF2ZSBsaWtlIGZpeGVkLCBub3QgcmFuZG9tIGVmZmVjdHMuIFdlIHJlLXJhbiB0aGUgc2ltdWxhdGlvbnMgdG8gZXN0aW1hdGUgcG93ZXIgZm9yIHBlbmFsaXplZCBzbW9vdGhzLiBHQU1NcyAqc3RpbGwqIHNob3dlZCBwb29yIHBvd2VyIHZzIExNRU1zIGZvciBiZXR3ZWVuLXN1YmplY3QgZWZmZWN0cy4KCj4gSG93ZXZlciwgdGhlc2Ugc2ltdWxhdGlvbnMgdXNlZCBhcnRpZmljaWFsIGF1dG9jb3JyZWxhdGVkIGVycm9ycywgcmFpc2luZyBjb25jZXJucyBhYm91dCBleHRlcm5hbCB2YWxpZGl0eS4gU28gd2UgcmFuIGEgc2Vjb25kIHNldCBvZiBzaW11bGF0aW9ucyB3aGVyZSB3ZSByYW5kb21seSBzYW1wbGVkIHJlc2lkdWFscyBmcm9tIHRoZSBTdHJvb3AgdGFzayBpbiB0aGUgTWFueSBMYWJzIDMgbWVnYS1zdHVkeSBieSBAQ2hhcmxpZUViZXJzb2xlCiBldCBhbCAjaG9vcmF5Zm9yb3BlbmRhdGEKIAogPiBUaGUgU3Ryb29wIHJlc2lkdWFscyBmcm9tIE1MMyBzaG93IHN0cm9uZyBwcmFjdGljZSBlZmZlY3RzIGFzIHdlbGwgYXMgb3RoZXIgcGF0dGVybnMgYWNyb3NzIHRocmVlIGJsb2NrcyBvZiB0cmlhbHMuIEhlcmUgYXJlIHJlc2lkdWFsLWJ5LXRyaWFsIHBsb3RzIGZyb20gYSBzdWJzZXQgb2Ygc3ViamVjdHMgYXMgd2VsbCBhcyBtZWFuIHJlc2lkdWFsLWJ5LXRyaWFsIHBsb3RzIGZvciB0aGUgM0srIHBhcnRpY2lwYW50cyBpbiB0aGUgZGF0YXNldC4KIAogPiBEZXNwaXRlIHRoZSBwcmFjdGljZSBlZmZlY3RzLCBtaXhlZCBlZmZlY3RzIG1vZGVscyB3ZXJlIHRvdGFsbHkgZmluZS4gR0FNTXMgc2hvd2VkIHRoZSBzYW1lIGJhc2ljIHBhdHRlcm4gYXMgaW4gdGhlIGZpcnN0IHNpbXVsYXRpb25zOiBzbWFsbCBiZW5lZml0IHRvIHdpdGhpbi1zdWJqZWN0IHBvd2VyLCBsb3NzIG9mIHBvd2VyIGZvciBiZXR3ZWVuIHN1YmplY3QgZWZmZWN0cyAoYnV0IG9ubHkgZm9yIHRoZSByZWNvbW1lbmRlZCAncGVuYWxpemVkJyB2ZXJzaW9uKS4KIAogPiBCb3R0b20gbGluZTogbW9zdCBleHBlcmltZW50cyAqYWxyZWFkeSogbmVnYXRlIHRlbXBvcmFsIGF1dG9jb3JyZWxhdGlvbiBieSByYW5kb21pemluZy4gR0FNTXMgbWF5IGhhdmUgaGlkZGVuIGNvc3RzLCBzbyBoYW5kbGUgd2l0aCBjYXJlLgogCj4gUC5TLjogVGhlIHJlcG8gaGFzIGFsbCB0aGUgc2ltdWxhdGlvbiBkYXRhLCBzdXBwbGVtZW50YXJ5IHNpbXVsYXRpb24gcmVzdWx0cywgYXMgd2VsbCBhcyBhbiBSIHBhY2thZ2UgKGF1dG9jb3JyKSBidW5kbGVkIGludG8gYSBTaW5ndWxhcml0eSBzb2Z0d2FyZSBjb250YWluZXIgZm9yIHJlcHJvZHVjaWJpbGl0eS4gSXQgaW5jbHVkZXMgaW5zdHJ1Y3Rpb25zIGZvciBjcmVhdGluZyBzaW11bGF0aW9ucyB3aXRoIHlvdXIgb3duIHRpbWUtdmFyeWluZyBlcnJvciBwYXR0ZXJucy4KCkZyb20gdGhlIHBhcGVyOgoKPiBLZWVwaW5nIGluIG1pbmQgdGhhdCB3ZSBhcmUgZm9jdXNlZCBvbiBleHBlcmltZW50cyB3aXRoIHVuaXZhcmlhdGUgZGF0YSBhbmQgcmFuZG9tIHByZXNlbnRhdGlvbiBvcmRlciwgb2JzZXJ2aW5nIHRlbXBvcmFsIGF1dG9jb3JyZWxhdGlvbiBpbiByZXNpZHVhbHMgZnJvbSBtb2RlbHMgd2hlcmUgdGltZSBkb2VzIG5vdCBhcHBlYXIgYXMgYSB2YXJpYWJsZSBzaG91bGQgbm90IGJlIGNhdXNlIGZvciBjb25jZXJuIGFib3V0IHZpb2xhdGluZyBpbmRlcGVuZGVuY2UgYXNzdW1wdGlvbnMuIElmIHRlbXBvcmFsIGF1dG9jb3JyZWxhdGlvbiBhcHBlYXJzIGluIHRoZSByZXNpZHVhbHMgYW5kIHRoZSBhbmFseXN0IGNob29zZXMgdG8gaWdub3JlIGl0LCBpdCBpcyB3cm9uZyB0byB2aWV3IHRoZSBhbmFseXN04oCZcyBtb2RlbCBhcyBzdGF0aXN0aWNhbGx5IHVuc291bmQgb24gdGhhdCBiYXNpcyBhbG9uZS4gVGhleSBhcmUgbm9uLWluZGVwZW5kZW50IG9ubHkgd2l0aCByZXNwZWN0IHRvIGEgdmFyaWFibGUgdGhhdCBpcyBpbnZpc2libGUgdG8gdGhlIG1vZGVsLiBJdCBpcyBtb3JlIGFjY3VyYXRlIHRvIHZpZXcgdGhlIGFuYWx5c3QgYXMgaGF2aW5nIGZvcmVnb25lIHRoZSBvcHBvcnR1bml0eSB0byBvYnRhaW4gbW9yZSBwcmVjaXNlIGVzdGltYXRlcyBieSBpbmNvcnBvcmF0aW5nIHRoZSB0ZW1wb3JhbCBzdHJ1Y3R1cmUgaW4gdGhlIG1vZGVsLiBPcHRpbmcgb3V0IGZyb20gZG9pbmcgc28gY2FuIGJlIGEgcmF0aW9uYWwgY2hvaWNlOiBHQU1NcyBhcmUgdGVjaG5pY2FsbHkgY2hhbGxlbmdpbmcsIHRoZXkgeWllbGQgY29tcGxleCBvdXRwdXQgdGhhdCBjYW4gYmUgZGlmZmljdWx0IHRvIGludGVycHJldCwgYW5kIHRoZWlyIHBvdGVudGlhbCBwaXRmYWxscyBhcmUgbm90IHdlbGwga25vd24uIENvbnNlcXVlbnRseSwgdXNpbmcgdGhlbSBkb2VzIG5vdCBndWFyYW50ZWUgYmV0dGVyIGluc2lnaHQgaW50byBkYXRhLgoKPiBMZXN0IGl0IHN0aWxsIHNlZW0g4oCYd3JvbmfigJkgb3Ig4oCYaW5hcHByb3ByaWF0ZeKAmSBmb3IgYW4gYW5hbHlzdCB0byBpZ25vcmUgcmVzaWR1YWwgYXV0b2NvcnJlbGF0aW9uIHdoZW4gYW5hbHl6aW5nIGRhdGEgZnJvbSBhIHJhbmRvbWl6ZWQgZXhwZXJpbWVudCwgbGV0IHVzIGF0dGVtcHQgdG8gZnVydGhlciBkaXNsb2RnZSB0aGlzIG5vdGlvbiBieSBjb25zaWRlcmluZyB5ZXQgYW5vdGhlciB3YXkgaW4gd2hpY2ggZXhwZXJpbWVudGFsIGRhdGEgZm9ybSBhIHRpbWUgc2VyaWVzLiBKdXN0IGFzIHRoZSBpbmRpdmlkdWFsIG1lYXN1cmVtZW50cyB0YWtlbiBmcm9tIGEgZ2l2ZW4gc3ViamVjdCBhcmUgaW5mbHVlbmNlZCBieSB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBwYXJ0aWN1bGFyIG1vbWVudCBhdCB3aGljaCB0aGUgbWVhc3VyZW1lbnQgaXMgdGFrZW4sIHNvIGlzIHRoZSBvdmVyYWxsIHBlcmZvcm1hbmNlIG9mIGEgc3ViamVjdCBpbmZsdWVuY2VkIGJ5IHRoZSB0aW1lIG9mIGRheSBhdCB3aGljaCB0ZXN0aW5nIG9jY3Vycywgd2l0aCBzdWJqZWN0cyBvZnRlbiBzaG93aW5nIG1vcmUgZWZmaWNpZW50IHBlcmZvcm1hbmNlIG9uIHRhc2tzIGR1cmluZyBhZnRlcm5vb25zIGNvbXBhcmVkIHRvIG1vcm5pbmdzIChLbGVpdG1hbiwgMTk2MywgQmxha2UsIDE5NjcpLiBUaW1lIG9mIGRheSBmbHVjdHVhdGlvbnMgYXJlIHZlcnkgbGlrZWx5IHRvIGluZHVjZSByZXNpZHVhbCBhdXRvY29ycmVsYXRpb24sIGF0IGxlYXN0IGZvciB0YXNrcyB0aGF0IGFyZSBtaW5pbWFsbHkgY29nbml0aXZlbHkgZGVtYW5kaW5nLiBJbiBhIHN0dWR5IHdoZXJlIHlvdSBhdHRlbXB0IHRvIHByZWRpY3QgcGFydGljaXBhbnRz4oCZIG1lYW4gcGVyZm9ybWFuY2UgYnkgZXhwZXJpbWVudGFsIGdyb3VwLCB0aGlzIGF1dG9jb3JyZWxhdGlvbiBjb3VsZCBiZSBzZWVuIGJ5IHBsb3R0aW5nIHRoZSByZXNpZHVhbCBmb3IgZWFjaCBzdWJqZWN0IGFnYWluc3QgdGhlIHRpbWUgb2YgZGF5IGF0IHdoaWNoIHRoZSBzZXNzaW9uIHRvb2sgcGxhY2UuIFlldCBkZXNwaXRlIHRoaXMgdmFyaWFibGUgYmVpbmcgYSBsaWtlbHkgc291cmNlIG9mIG5vbi1pbmRlcGVuZGVuY2UsIGFuZCBkZXNwaXRlIGl0IGJlaW5nIGEgdmFyaWFibGUgdGhhdCBpcyByZWNvcmRlZCBpbiBldmVyeSBleHBlcmltZW50IChpZiBvbmx5IGJ5IGNvbXB1dGVyIHRpbWVzdGFtcHMpIGl0IGlzIGFsbW9zdCBhbHdheXMgaWdub3JlZCBkdXJpbmcgYW5hbHlzaXMuIFdoeSBkb2VzIG5vIG9uZSBxdWVzdGlvbiB0aGlzPy4KCj4gV2UgZG8gbm90IHdvcnJ5IGFib3V0IHRpbWUtb2YtZGF5IGVmZmVjdHMgZm9yIHRoZSBzYW1lIHJlYXNvbiB3ZSBuZWVkIG5vdCB3b3JyeSBhYm91dCB0aW1lLW9mLXRyaWFsIGVmZmVjdHM6IGJlY2F1c2Ugd2UgcmFuZG9taXplZC4gUmFuZG9taXphdGlvbiBwcm9zcGVjdGl2ZWx5IGd1YXJkcyBhZ2FpbnN0IHRoZSBjb250YW1pbmF0aW9uIG9mIHZhcmlhbmNlIHdlIGNhcmUgYWJvdXQgYnkgdmFyaWFuY2UgdGhhdCB3ZSBkb27igJl0LiBFdmVuIGJleW9uZCB0aW1lIG9mIHRyaWFsIG9yIHRpbWUgb2YgZGF5IGVmZmVjdHMsIGluIGFueSBzdHVkeSB0aGVyZSBpcyBhIHBvdGVudGlhbGx5IGluZmluaXRlIG51bWJlciBvZiBwb3NzaWJsZSB2YXJpYWJsZXMgZm9yIHdoaWNoIHJlc2lkdWFscywgd2hlbiBwbG90dGVkIGFnYWluc3QgdGhlIHZhcmlhYmxlIHZhbHVlcywgd291bGQgc2hvdyBub24taW5kZXBlbmRlbmNl4oCUZGF5IG9mIHRoZSB3ZWVrLCBzZWFzb24gb2YgdGhlIHllYXIsIHRlbXBlcmF0dXJlIG9mIHRoZSByb29tLCBkZWdyZWUgb2YgYW1iaWVudCB2aXN1YWwgb3IgYWNvdXN0aWMgbm9pc2UsIHN1YmplY3QgY29uc2NpZW5jaW91c25lc3MsIHZpc3VhbCBhbmdsZSBzdWJ0ZW5kZWQgYnkgc3RpbXVsaSByZWxhdGl2ZSB0byBlYWNoIHN1YmplY3TigJlzIHZpc3VhbCBhY3VpdHksIGFuZCBzbyBvbi4gU28gbG9uZyBhcyB3ZSBoYXZlIHJhbmRvbWl6ZWQsIHdlIGRvbuKAmXQgbmVlZCB0byB3b3JyeSBhYm91dCBub24taW5kZXBlbmRlbmNlIHJlbGF0aXZlIHRvIHRoZXNlIHZhcmlhYmxlcy4gVHJpYWwtYnktdHJpYWwgZmx1Y3R1YXRpb25zIGluIHBlcmZvcm1hbmNlIGFyZSBubyBkaWZmZXJlbnQuCgpEaXN0aW5jdGlvbiBiZXR3ZWVuIHRpbWUgYXMgYSAibnVpc2FuY2UgZmFjdG9yIiBhbmQgYXMgYW4gaW5lc2NhcGFibGUgcGFydCBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmUgaXRzZWxmOiAKCj4gV2UgaGF2ZSBhbHNvIG9ubHkgY29uc2lkZXJlZCB1bml2YXJpYXRlIGRhdGEgd2hlcmUgdGhlcmUgaXMgYSBzaW5nbGUgb2JzZXJ2YXRpb24gcGVyIHRyaWFsLiBUaGlzIGV4Y2x1ZGVzIGZyb20gY29uc2lkZXJhdGlvbiBtYW55IHR5cGVzIG9mIHJlc2VhcmNoIHN1Y2ggYXMgdmlzdWFsIHdvcmxkIGV5ZXRyYWNraW5nLCBFRUcvTUVHLCBwdXBpbGxvbWV0cnksIGFuZCBsb25naXR1ZGluYWwgc3R1ZGllcy4gT3VyIGludGVudGlvbiBpcyBub3QgdG8gZGFtcGVuIGVudGh1c2lhc20gZm9yIHRoZSB1c2Ugb2YgR0FNTXMgaW4gYW5hbHlzZXMgd2hlcmUgdGltZSBpcyBhIGNyaXRpY2FsIHZhcmlhYmxlLiBJbmRlZWQsIEdBTU1zIHN0cmlrZSB1cyBhcyBhIHByb21pc2luZyBhcHByb2FjaCBpbiB0aGVzZSBjb250ZXh0cyAodmFuIFJpaiBldCBhbC4sIDIwMTkpLgoKCg==