Author: Olivia Sochan
1. Initiate the Project
1.1. Dependencies
ggplot2 is already installed
#This command loads required packages
library(ggplot2)
2. The Cave Molly and its Ancestors
To wrap our head around some of the basic observations that led
Darwin to infer natural selection, we will spend a little bit of time
with the cave molly. The cave molly (Poecilia mexicana) is a
small species of livebearing fish that occurs in a couple of small caves
in Southern Mexico. One of the caves, the Cueva Luna Azufre, has a
wetted area of only 39 square-meters. Even though the available habitat
is really small, there has been an isolated population of cave mollies
in this cave for several thousand years. Interestingly, mollies also
occur in adjacent surface habitats. In the picture below, you can see
the a male and a female of the surface (top two pictures) and the cave
form (bottom two pictures) side by side.

3. The Struggle for Existence
The first set of observations that led Darwin to infer the process of
natural selection related to the imbalance of organisms’ reproductive
power and limitations of resource availability. Quantifying the
effective reproductive output and resource availability in nature can be
difficult. However, what we can do is to measure proxies for these
traits and then use simple mathematical models to test whether our
predictions and inferences are valid. Here, we use exponential and
logistic population growth models to explore whether there is really a
struggle for existence in cave mollies.
3.1. Observation 1: Populations Have a Huge Reproductive
Potential
Even large animals with long generation times have an incredible
reproductive potential. Cave mollies—as many other cave organisms—have a
comparatively low fecundity, and females only give birth to one or two
fully developed young at a time. Life history analyses based on female
longevity and fecundity have revealed that the average female gives
birth to about 3 offspring over her life; not exactly what you would
call huge reproductive potential, right? But in reality, it is not the
reproductive potential of individuals that counts, but the reproductive
potential of populations. To illustrate this point, we want you to model
population growth for a hypothetical population of cave mollies.
Specifically, use the code below to simulate and graph the population
growth of an initial cave molly population of 2 individuals (the initial
colonizers of the cave).
How many generations would it take for the population to grow to a
million? Under what circumstances might you see population growth like
this? Do you think Darwin’s observation that “species have great
potential fertility” holds true for cave mollies?
#Choose an initial population size
N0 = 2
#Choose the average number of offspring
b = 3
#Choose a range of generations you want to estimate population size for; default is generation 0 to 15
t = 0:15
#Calculate the population size for each generation
N = N0*b^t
#Merge the results of the simulation into a single table
final.results <- as.data.frame(cbind(t,N))
#You can view the results by just calling the data frame
print(final.results)
#Plot the results, make sure you properly label the axes
ggplot(final.results, aes(x=t, y=N)) +
geom_point() +
xlab("Generation") +
ylab("Population size") +
theme_classic()

It will take about 14 generations to get to a population of 1
million. We see a population grow like this when theres unlimited
resources. There is great potential for fertility.
3.2. Observation 2: Natural Resources are Limited
Exponential growth only occurs in very specific circumstances. In a
cave that is only the fraction of the size of a football field, you
would obviously never find a cave molly population of a million. The
logistic model more accurately describes population growth in nature.
Based on our past analyses, we estimate the population growth
coefficient (lambda) to be around 1.3 and the carrying capacity
(K) of the cave around 360 individuals.
How long would it take for the population to reach the carrying
capacity if there were two initial colonizers? What do you think
determines K for the population of cave mollies in the Cueva
Luna Azufre?
#Choose an initial population size
N0 = 2
#Choose population growth rate
lamda = 1.3
#Choose a range of generations you want to estimate population size for
t = 0:15
#Choose a carrying capacity
K = 360
#Calculate the population size for each generation
N = (N0*K)/(N0+(K-N0)*exp(-lamda*t))
#Merge the results of the simulation into a single table
final.results <- as.data.frame(cbind(t,N))
#Use the ggplot function to plot the results, make sure you properly label the axes
ggplot(final.results, aes(x=t, y=N)) +
geom_point() +
xlab("Generation") +
ylab("Population size") +
theme_classic()

It will take about 7 generations to reach carrying capacity.The
resources available will determine K.
3.3. Where Do All the Missing Offspring Go?
Compare the two models (exponential and logistic) that were ran with
the same initial parameters. What do the different outcomes mean for
individual offspring that are born in any given generation? How might
this discrepancy important in the context of evolution?
The two graphs represent the difference in available resources,
the different outcomes for the offspring means that population sizes
will be limited based on available resources. This is important to the
context of evolution because the more offspring in populations casues
more chances for evolution.
4. Individuals Vary in Their Traits
Another of Darwin’s key observations was just how variable
individuals of the same species are. Let’s explore some of that
variation in cave mollies. To do that, we first need to load some data
into R. These data were collected as part of my dissertation and include
the following variables: habitat (cave or surface), sex (male or
female), standard length (in mm, from the snout to the caudal fin base),
eye diameter (in mm), head length (in mm), head width (in mm), predorsal
length (in mm, from the snout to the insertion of the dorsal fin), and
gape width (in mm, from one corner of the mouth to the other).
#Use the read.csv function to import a dataset; take a look at the data structure once you imported the file!
morph.data <- read.csv("morphological_variation.csv", fileEncoding = 'UTF-8-BOM')
4.1. Comparing Body Size Variation Within and Between
Populations
A simple way to compare variation within and between populations is
to plot a frequency histogram (which represents the raw counts) along
with a density plot (which represents the approximated statistical
distribution). You can generate a histogram with the
geom_histogram()
function and designate any trait you may
want as the x axis. You can calculate the density with
aes(y=..density..)
within geom_histogram()
and
then plot it with geom_density()
. Note that when you have
more than two groups (in our case we have samples from a cave and a
surface population), you can visualize them separately by designating a
different color for each group in the aesthetics
(fill=Habitat
).
When you visualize body size variation in this manner what do you
observe? Is there more variation within or between populations?
#Use the ggplot function to graph the histogram (see: http://www.sthda.com/english/wiki/ggplot2-histogram-plot-quick-start-guide-r-software-and-data-visualization)
ggplot(morph.data, aes(x=Standard.length, fill=Habitat)) +
geom_histogram(aes(y=..density..)) +
geom_density(alpha=0.5)+
xlab("Standard length (mm)") +
ylab("frequency") +
theme_classic()

There is a slight difference in standard length, there is more
variation within the populations because the averages and peaks are very
similar.
4.2. Comparing Predorsal Length Variation Within and Between
Populations
Let’s also compare a second trait, predorsal length. With the
previous graph you hopefully saw how variable overall body size is
within populations. If we want to compare other traits, we have to
account for that. We want to know whether variation in predorsal length
is due to variation in size (small fish have small predorsal lengths) or
whether other patterns might be at play. To do so, we can calculate the
residual predorsal length as from a regression between predorsal and
standard length using the lm(y ~ x, data)
and
residuals()
functions:
#Calculating regression line
fit1 <- lm(Predorsal.length ~ Standard.length, data = morph.data)
#Extract residuals and create a new variable res.predorsal in the morph.data data frame
morph.data$res.predorsal <- residuals(fit1)
You can then use the new variable to plot the residual predorsal
length, which is corrected for body size:
##Use the ggplot function to graph the histogram and color data based on habitat
ggplot(morph.data, aes(x=res.predorsal, fill=Habitat)) +
geom_histogram(aes(y=..density..)) +
geom_density(alpha=0.5)+
xlab("realative predorsal length") +
ylab("frequency") +
theme_classic()

When you plot relative predorsal length, what do you observe? How
does variation in predorsal length vary within and between populations,
and how does it compare to variation in standard length?
We dont see a lot of variation within the population, length
doesnt really matter.
4.3. Comparing Eye Size Variation Within and Between
Populations
Using the same approach as for predorsal variation, compare variation
in relative eye diameter:
#Your code goes here
fit2 <- lm(Eye.diameter ~ Standard.length, data = morph.data)
#Extract residuals and create a new variable Eye.diameter in the morph.data data frame
morph.data$res.eye.size <- residuals(fit2)
##Use the ggplot function to graph the histogram and color data based on habitat
ggplot(morph.data, aes(x=res.eye.size, fill=Habitat)) +
geom_histogram(aes(y=..density..)) +
geom_density(alpha=0.5)+
xlab("realative eye size") +
ylab("frequency") +
theme_classic()

What do you observe? How does variation in eye diameter vary within
and between populations, and how does it compare to variation in the
other traits?
I see that relative eye size is larger for the surface
population. Eye diameter vary s with there being larger eye sizes for
the surface population rather than the cave population because they
don’t necessarily need to see since it is so dark. it compares to
variation of other traits since the change in the environment leads to
different needs of different evolutionary traits.
5. Variation in Traits is Heritable
An avid breeder of fancy pigeons, Darwin observed that specific
traits are passed from parents to offspring, even though he had no clue
how this might actually work (genetics was not really a thing yet). Even
without an ability to conduct molecular genetic analyses, we can
estimate heritability of traits by comparing the traits of offspring to
the traits of the parents.
Let’s load some data that compares parent and offspring traits in
cave mollies. To do this, we brought cave mollies into the lab and bred
them under standardized conditions. Data represent the average trait
values of the mother and father and of all offspring from a specific
brood. The easiest way to compare parent and offspring traits is through
a scatter plot, which we already used in Exercise 1. If a trait is
heritable, we would expect to see a correlation between parent and
offspring traits (e.g., parents with small eyes should have offspring
with small eyes).
The following dataset includes measurements of parental and offspring
standard length as well as eye size.
#Use the read.csv function to import a dataset; take a look at the data structure once you imported the file!
heritability <- read.csv("heritability.csv", fileEncoding = 'UTF-8-BOM')
5.1. Heritability of Standard Length
First, let us explore whether there is evidence for heritability in
standard length.
What do you observe? Is standard length a heritable trait?
ggplot(heritability, aes(x=parent.standard.length, y=offspring.standard.length)) +
geom_point() +
geom_smooth(method = "lm") +
xlab("realative heritability") +
ylab("frequency") +
theme_classic()

The graph is very scattered, so no herritability is not a
heritable trait..
5.2. Heritability of Eye Size
Now let us explore whether there is any heritability in eye size.
Remember, there is substantial variation in body size, and in such
cases, we want to control for body size by calculating residual eye size
first.
##Calculate residual eye sizes for the parents and the offspring
#Your code goes here:
fit3 <- lm(parent.eye.size ~ parent.standard.length, data = heritability)
fit4 <- lm(offspring.eye.size ~ offspring.standard.length, data = heritability)
heritability$res.offspring.eye <- residuals(fit4)
#Plot the results
ggplot(morph.data, aes(x=Standard.length, y=Eye.diameter)) +
geom_point() +
geom_smooth(method = "lm") +
xlab("Eye diameter") +
ylab("Standard length") +
theme_classic()

What do you observe? Is eye size a heritable trait?
The graph shows a more linear look, this means eye size is
heritable.
6. What Would Happen If…?
Imagine for a moment that smaller fish have a higher likelihood of
survival in the cave. Would you expect evolution of body size upon cave
colonization?
Imagine for a moment that fish with smaller eyes have a higher
likelihood of survival in the cave. Would you expect evolution of eye
size upon cave colonization? Justify your response.
Yes evolution of body size will be expected. secondly, yes you
would expect the evolution of smaller eyes upon cave colonization, the
scenario described where smaller eyed fish have a higher likelihood of
survival is the driving force of natural selection
7. Resources
7.1. Data References
The eye size data was published in the following paper. Other
measurements are unpublished data by M. Tobler.
7.2 Resources You Consulted
Consulting additional resources to solve this assignment is
absolutely allowed, but failure to disclose those resources is
plagiarism. Please list any collaborators you worked with and resources
you used below or state that you have not used any.
Dr. Bonner.
LS0tCnRpdGxlOiAiSW50cm9kdWN0aW9uIHRvIFIgTm90ZWJvb2sgYW5kIERhcndpbidzIExvZ2ljIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDMKICAgIHRvY19mbG9hdDogeWVzCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogJzMnCiAgaHRtbF9kb2N1bWVudDoKICAgIGtlZXBfbWQ6IFRSVUUKLS0tCgojIyBBdXRob3I6IE9saXZpYSBTb2NoYW4gCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgMS4gSW5pdGlhdGUgdGhlIFByb2plY3QKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgMS4xLiBEZXBlbmRlbmNpZXMKCmdncGxvdDIgaXMgYWxyZWFkeSBpbnN0YWxsZWQKCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CiNUaGlzIGNvbW1hbmQgbG9hZHMgcmVxdWlyZWQgcGFja2FnZXMKbGlicmFyeShnZ3Bsb3QyKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyAyLiBUaGUgQ2F2ZSBNb2xseSBhbmQgaXRzIEFuY2VzdG9ycwoKVG8gd3JhcCBvdXIgaGVhZCBhcm91bmQgc29tZSBvZiB0aGUgYmFzaWMgb2JzZXJ2YXRpb25zIHRoYXQgbGVkIERhcndpbiB0byBpbmZlciBuYXR1cmFsIHNlbGVjdGlvbiwgd2Ugd2lsbCBzcGVuZCBhIGxpdHRsZSBiaXQgb2YgdGltZSB3aXRoIHRoZSBjYXZlIG1vbGx5LiBUaGUgY2F2ZSBtb2xseSAoKlBvZWNpbGlhIG1leGljYW5hKikgaXMgYSBzbWFsbCBzcGVjaWVzIG9mIGxpdmViZWFyaW5nIGZpc2ggdGhhdCBvY2N1cnMgaW4gYSBjb3VwbGUgb2Ygc21hbGwgY2F2ZXMgaW4gU291dGhlcm4gTWV4aWNvLiBPbmUgb2YgdGhlIGNhdmVzLCB0aGUgQ3VldmEgTHVuYSBBenVmcmUsIGhhcyBhIHdldHRlZCBhcmVhIG9mIG9ubHkgMzkgc3F1YXJlLW1ldGVycy4gRXZlbiB0aG91Z2ggdGhlIGF2YWlsYWJsZSBoYWJpdGF0IGlzIHJlYWxseSBzbWFsbCwgdGhlcmUgaGFzIGJlZW4gYW4gaXNvbGF0ZWQgcG9wdWxhdGlvbiBvZiBjYXZlIG1vbGxpZXMgaW4gdGhpcyBjYXZlIGZvciBzZXZlcmFsIHRob3VzYW5kIHllYXJzLiBJbnRlcmVzdGluZ2x5LCBtb2xsaWVzIGFsc28gb2NjdXIgaW4gYWRqYWNlbnQgc3VyZmFjZSBoYWJpdGF0cy4gSW4gdGhlIHBpY3R1cmUgYmVsb3csIHlvdSBjYW4gc2VlIHRoZSBhIG1hbGUgYW5kIGEgZmVtYWxlIG9mIHRoZSBzdXJmYWNlICh0b3AgdHdvIHBpY3R1cmVzKSBhbmQgdGhlIGNhdmUgZm9ybSAoYm90dG9tIHR3byBwaWN0dXJlcykgc2lkZSBieSBzaWRlLgoKIVtdKG1vbGxpZXMucG5nKQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIDMuIFRoZSBTdHJ1Z2dsZSBmb3IgRXhpc3RlbmNlCgpUaGUgZmlyc3Qgc2V0IG9mIG9ic2VydmF0aW9ucyB0aGF0IGxlZCBEYXJ3aW4gdG8gaW5mZXIgdGhlIHByb2Nlc3Mgb2YgbmF0dXJhbCBzZWxlY3Rpb24gcmVsYXRlZCB0byB0aGUgaW1iYWxhbmNlIG9mIG9yZ2FuaXNtcycgcmVwcm9kdWN0aXZlIHBvd2VyIGFuZCBsaW1pdGF0aW9ucyBvZiByZXNvdXJjZSBhdmFpbGFiaWxpdHkuIFF1YW50aWZ5aW5nIHRoZSBlZmZlY3RpdmUgcmVwcm9kdWN0aXZlIG91dHB1dCBhbmQgcmVzb3VyY2UgYXZhaWxhYmlsaXR5IGluIG5hdHVyZSBjYW4gYmUgZGlmZmljdWx0LiBIb3dldmVyLCB3aGF0IHdlIGNhbiBkbyBpcyB0byBtZWFzdXJlIHByb3hpZXMgZm9yIHRoZXNlIHRyYWl0cyBhbmQgdGhlbiB1c2Ugc2ltcGxlIG1hdGhlbWF0aWNhbCBtb2RlbHMgdG8gdGVzdCB3aGV0aGVyIG91ciBwcmVkaWN0aW9ucyBhbmQgaW5mZXJlbmNlcyBhcmUgdmFsaWQuIEhlcmUsIHdlIHVzZSBleHBvbmVudGlhbCBhbmQgbG9naXN0aWMgcG9wdWxhdGlvbiBncm93dGggbW9kZWxzIHRvIGV4cGxvcmUgd2hldGhlciB0aGVyZSBpcyByZWFsbHkgYSBzdHJ1Z2dsZSBmb3IgZXhpc3RlbmNlIGluIGNhdmUgbW9sbGllcy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgMy4xLiBPYnNlcnZhdGlvbiAxOiBQb3B1bGF0aW9ucyBIYXZlIGEgSHVnZSBSZXByb2R1Y3RpdmUgUG90ZW50aWFsCgpFdmVuIGxhcmdlIGFuaW1hbHMgd2l0aCBsb25nIGdlbmVyYXRpb24gdGltZXMgaGF2ZSBhbiBpbmNyZWRpYmxlIHJlcHJvZHVjdGl2ZSBwb3RlbnRpYWwuIENhdmUgbW9sbGllcy0tLWFzIG1hbnkgb3RoZXIgY2F2ZSBvcmdhbmlzbXMtLS1oYXZlIGEgY29tcGFyYXRpdmVseSBsb3cgZmVjdW5kaXR5LCBhbmQgZmVtYWxlcyBvbmx5IGdpdmUgYmlydGggdG8gb25lIG9yIHR3byBmdWxseSBkZXZlbG9wZWQgeW91bmcgYXQgYSB0aW1lLiBMaWZlIGhpc3RvcnkgYW5hbHlzZXMgYmFzZWQgb24gZmVtYWxlIGxvbmdldml0eSBhbmQgZmVjdW5kaXR5IGhhdmUgcmV2ZWFsZWQgdGhhdCB0aGUgYXZlcmFnZSBmZW1hbGUgZ2l2ZXMgYmlydGggdG8gYWJvdXQgMyBvZmZzcHJpbmcgb3ZlciBoZXIgbGlmZTsgbm90IGV4YWN0bHkgd2hhdCB5b3Ugd291bGQgY2FsbCBodWdlIHJlcHJvZHVjdGl2ZSBwb3RlbnRpYWwsIHJpZ2h0PyBCdXQgaW4gcmVhbGl0eSwgaXQgaXMgbm90IHRoZSByZXByb2R1Y3RpdmUgcG90ZW50aWFsIG9mIGluZGl2aWR1YWxzIHRoYXQgY291bnRzLCBidXQgdGhlIHJlcHJvZHVjdGl2ZSBwb3RlbnRpYWwgb2YgcG9wdWxhdGlvbnMuIFRvIGlsbHVzdHJhdGUgdGhpcyBwb2ludCwgd2Ugd2FudCB5b3UgdG8gbW9kZWwgcG9wdWxhdGlvbiBncm93dGggZm9yIGEgaHlwb3RoZXRpY2FsIHBvcHVsYXRpb24gb2YgY2F2ZSBtb2xsaWVzLiBTcGVjaWZpY2FsbHksIHVzZSB0aGUgY29kZSBiZWxvdyB0byBzaW11bGF0ZSBhbmQgZ3JhcGggdGhlIHBvcHVsYXRpb24gZ3Jvd3RoIG9mIGFuIGluaXRpYWwgY2F2ZSBtb2xseSBwb3B1bGF0aW9uIG9mIDIgaW5kaXZpZHVhbHMgKHRoZSBpbml0aWFsIGNvbG9uaXplcnMgb2YgdGhlIGNhdmUpLgoKSG93IG1hbnkgZ2VuZXJhdGlvbnMgd291bGQgaXQgdGFrZSBmb3IgdGhlIHBvcHVsYXRpb24gdG8gZ3JvdyB0byBhIG1pbGxpb24/IFVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyBtaWdodCB5b3Ugc2VlIHBvcHVsYXRpb24gZ3Jvd3RoIGxpa2UgdGhpcz8gRG8geW91IHRoaW5rIERhcndpbidzIG9ic2VydmF0aW9uIHRoYXQgInNwZWNpZXMgaGF2ZSBncmVhdCBwb3RlbnRpYWwgZmVydGlsaXR5IiBob2xkcyB0cnVlIGZvciBjYXZlIG1vbGxpZXM/CgpgYGB7cn0KI0Nob29zZSBhbiBpbml0aWFsIHBvcHVsYXRpb24gc2l6ZQpOMCA9IDIKCiNDaG9vc2UgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIG9mZnNwcmluZwpiID0gMwoKI0Nob29zZSBhIHJhbmdlIG9mIGdlbmVyYXRpb25zIHlvdSB3YW50IHRvIGVzdGltYXRlIHBvcHVsYXRpb24gc2l6ZSBmb3I7IGRlZmF1bHQgaXMgZ2VuZXJhdGlvbiAwIHRvIDE1CnQgPSAwOjE1CgojQ2FsY3VsYXRlIHRoZSBwb3B1bGF0aW9uIHNpemUgZm9yIGVhY2ggZ2VuZXJhdGlvbgpOID0gTjAqYl50CgojTWVyZ2UgdGhlIHJlc3VsdHMgb2YgdGhlIHNpbXVsYXRpb24gaW50byBhIHNpbmdsZSB0YWJsZQpmaW5hbC5yZXN1bHRzIDwtIGFzLmRhdGEuZnJhbWUoY2JpbmQodCxOKSkKCiNZb3UgY2FuIHZpZXcgdGhlIHJlc3VsdHMgYnkganVzdCBjYWxsaW5nIHRoZSBkYXRhIGZyYW1lCnByaW50KGZpbmFsLnJlc3VsdHMpCgojUGxvdCB0aGUgcmVzdWx0cywgbWFrZSBzdXJlIHlvdSBwcm9wZXJseSBsYWJlbCB0aGUgYXhlcwpnZ3Bsb3QoZmluYWwucmVzdWx0cywgYWVzKHg9dCwgeT1OKSkgKyAKICBnZW9tX3BvaW50KCkgKyAKICB4bGFiKCJHZW5lcmF0aW9uIikgKyAKICB5bGFiKCJQb3B1bGF0aW9uIHNpemUiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCipJdCB3aWxsIHRha2UgYWJvdXQgMTQgZ2VuZXJhdGlvbnMgdG8gZ2V0IHRvIGEgcG9wdWxhdGlvbiBvZiAxIG1pbGxpb24uIFdlIHNlZSBhIHBvcHVsYXRpb24gZ3JvdyBsaWtlIHRoaXMgd2hlbiB0aGVyZXMgdW5saW1pdGVkIHJlc291cmNlcy4gVGhlcmUgaXMgZ3JlYXQgcG90ZW50aWFsIGZvciBmZXJ0aWxpdHkuKgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyAzLjIuIE9ic2VydmF0aW9uIDI6IE5hdHVyYWwgUmVzb3VyY2VzIGFyZSBMaW1pdGVkCgpFeHBvbmVudGlhbCBncm93dGggb25seSBvY2N1cnMgaW4gdmVyeSBzcGVjaWZpYyBjaXJjdW1zdGFuY2VzLiBJbiBhIGNhdmUgdGhhdCBpcyBvbmx5IHRoZSBmcmFjdGlvbiBvZiB0aGUgc2l6ZSBvZiBhIGZvb3RiYWxsIGZpZWxkLCB5b3Ugd291bGQgb2J2aW91c2x5IG5ldmVyIGZpbmQgYSBjYXZlIG1vbGx5IHBvcHVsYXRpb24gb2YgYSBtaWxsaW9uLiBUaGUgbG9naXN0aWMgbW9kZWwgbW9yZSBhY2N1cmF0ZWx5IGRlc2NyaWJlcyBwb3B1bGF0aW9uIGdyb3d0aCBpbiBuYXR1cmUuIEJhc2VkIG9uIG91ciBwYXN0IGFuYWx5c2VzLCB3ZSBlc3RpbWF0ZSB0aGUgcG9wdWxhdGlvbiBncm93dGggY29lZmZpY2llbnQgKGxhbWJkYSkgdG8gYmUgYXJvdW5kIDEuMyBhbmQgdGhlIGNhcnJ5aW5nIGNhcGFjaXR5ICgqSyopIG9mIHRoZSBjYXZlIGFyb3VuZCAzNjAgaW5kaXZpZHVhbHMuCgpIb3cgbG9uZyB3b3VsZCBpdCB0YWtlIGZvciB0aGUgcG9wdWxhdGlvbiB0byByZWFjaCB0aGUgY2FycnlpbmcgY2FwYWNpdHkgaWYgdGhlcmUgd2VyZSB0d28gaW5pdGlhbCBjb2xvbml6ZXJzPyBXaGF0IGRvIHlvdSB0aGluayBkZXRlcm1pbmVzICpLKiBmb3IgdGhlIHBvcHVsYXRpb24gb2YgY2F2ZSBtb2xsaWVzIGluIHRoZSBDdWV2YSBMdW5hIEF6dWZyZT8KCmBgYHtyfQojQ2hvb3NlIGFuIGluaXRpYWwgcG9wdWxhdGlvbiBzaXplCk4wID0gMgojQ2hvb3NlIHBvcHVsYXRpb24gZ3Jvd3RoIHJhdGUKbGFtZGEgPSAxLjMKI0Nob29zZSBhIHJhbmdlIG9mIGdlbmVyYXRpb25zIHlvdSB3YW50IHRvIGVzdGltYXRlIHBvcHVsYXRpb24gc2l6ZSBmb3IKdCA9IDA6MTUKI0Nob29zZSBhIGNhcnJ5aW5nIGNhcGFjaXR5CksgPSAzNjAKI0NhbGN1bGF0ZSB0aGUgcG9wdWxhdGlvbiBzaXplIGZvciBlYWNoIGdlbmVyYXRpb24KTiA9IChOMCpLKS8oTjArKEstTjApKmV4cCgtbGFtZGEqdCkpCiNNZXJnZSB0aGUgcmVzdWx0cyBvZiB0aGUgc2ltdWxhdGlvbiBpbnRvIGEgc2luZ2xlIHRhYmxlCmZpbmFsLnJlc3VsdHMgPC0gYXMuZGF0YS5mcmFtZShjYmluZCh0LE4pKQojVXNlIHRoZSBnZ3Bsb3QgZnVuY3Rpb24gdG8gcGxvdCB0aGUgcmVzdWx0cywgbWFrZSBzdXJlIHlvdSBwcm9wZXJseSBsYWJlbCB0aGUgYXhlcwpnZ3Bsb3QoZmluYWwucmVzdWx0cywgYWVzKHg9dCwgeT1OKSkgKyAKICBnZW9tX3BvaW50KCkgKyAKICB4bGFiKCJHZW5lcmF0aW9uIikgKyAKICB5bGFiKCJQb3B1bGF0aW9uIHNpemUiKSArCiAgdGhlbWVfY2xhc3NpYygpCmBgYAoKKkl0IHdpbGwgdGFrZSBhYm91dCA3IGdlbmVyYXRpb25zIHRvIHJlYWNoIGNhcnJ5aW5nIGNhcGFjaXR5LlRoZSByZXNvdXJjZXMgYXZhaWxhYmxlIHdpbGwgZGV0ZXJtaW5lIEsuKgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyAzLjMuIFdoZXJlIERvIEFsbCB0aGUgTWlzc2luZyBPZmZzcHJpbmcgR28/CgpDb21wYXJlIHRoZSB0d28gbW9kZWxzIChleHBvbmVudGlhbCBhbmQgbG9naXN0aWMpIHRoYXQgd2VyZSByYW4gd2l0aCB0aGUgc2FtZSBpbml0aWFsIHBhcmFtZXRlcnMuIFdoYXQgZG8gdGhlIGRpZmZlcmVudCBvdXRjb21lcyBtZWFuIGZvciBpbmRpdmlkdWFsIG9mZnNwcmluZyB0aGF0IGFyZSBib3JuIGluIGFueSBnaXZlbiBnZW5lcmF0aW9uPyBIb3cgbWlnaHQgdGhpcyBkaXNjcmVwYW5jeSBpbXBvcnRhbnQgaW4gdGhlIGNvbnRleHQgb2YgZXZvbHV0aW9uPwoKKlRoZSB0d28gZ3JhcGhzIHJlcHJlc2VudCB0aGUgZGlmZmVyZW5jZSBpbiBhdmFpbGFibGUgcmVzb3VyY2VzLCB0aGUgZGlmZmVyZW50IG91dGNvbWVzIGZvciB0aGUgb2Zmc3ByaW5nIG1lYW5zIHRoYXQgcG9wdWxhdGlvbiBzaXplcyB3aWxsIGJlIGxpbWl0ZWQgYmFzZWQgb24gYXZhaWxhYmxlIHJlc291cmNlcy4gVGhpcyBpcyBpbXBvcnRhbnQgdG8gdGhlIGNvbnRleHQgb2YgZXZvbHV0aW9uIGJlY2F1c2UgdGhlIG1vcmUgb2Zmc3ByaW5nIGluIHBvcHVsYXRpb25zIGNhc3VlcyBtb3JlIGNoYW5jZXMgZm9yIGV2b2x1dGlvbi4qCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgNC4gSW5kaXZpZHVhbHMgVmFyeSBpbiBUaGVpciBUcmFpdHMKCkFub3RoZXIgb2YgRGFyd2luJ3Mga2V5IG9ic2VydmF0aW9ucyB3YXMganVzdCBob3cgdmFyaWFibGUgaW5kaXZpZHVhbHMgb2YgdGhlIHNhbWUgc3BlY2llcyBhcmUuIExldCdzIGV4cGxvcmUgc29tZSBvZiB0aGF0IHZhcmlhdGlvbiBpbiBjYXZlIG1vbGxpZXMuIFRvIGRvIHRoYXQsIHdlIGZpcnN0IG5lZWQgdG8gbG9hZCBzb21lIGRhdGEgaW50byBSLiBUaGVzZSBkYXRhIHdlcmUgY29sbGVjdGVkIGFzIHBhcnQgb2YgbXkgZGlzc2VydGF0aW9uIGFuZCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOiBoYWJpdGF0IChjYXZlIG9yIHN1cmZhY2UpLCBzZXggKG1hbGUgb3IgZmVtYWxlKSwgc3RhbmRhcmQgbGVuZ3RoIChpbiBtbSwgZnJvbSB0aGUgc25vdXQgdG8gdGhlIGNhdWRhbCBmaW4gYmFzZSksIGV5ZSBkaWFtZXRlciAoaW4gbW0pLCBoZWFkIGxlbmd0aCAoaW4gbW0pLCBoZWFkIHdpZHRoIChpbiBtbSksIHByZWRvcnNhbCBsZW5ndGggKGluIG1tLCBmcm9tIHRoZSBzbm91dCB0byB0aGUgaW5zZXJ0aW9uIG9mIHRoZSBkb3JzYWwgZmluKSwgYW5kIGdhcGUgd2lkdGggKGluIG1tLCBmcm9tIG9uZSBjb3JuZXIgb2YgdGhlIG1vdXRoIHRvIHRoZSBvdGhlcikuCgpgYGB7cn0KI1VzZSB0aGUgcmVhZC5jc3YgZnVuY3Rpb24gdG8gaW1wb3J0IGEgZGF0YXNldDsgdGFrZSBhIGxvb2sgYXQgdGhlIGRhdGEgc3RydWN0dXJlIG9uY2UgeW91IGltcG9ydGVkIHRoZSBmaWxlIQptb3JwaC5kYXRhIDwtIHJlYWQuY3N2KCJtb3JwaG9sb2dpY2FsX3ZhcmlhdGlvbi5jc3YiLCBmaWxlRW5jb2RpbmcgPSAnVVRGLTgtQk9NJykKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIDQuMS4gQ29tcGFyaW5nIEJvZHkgU2l6ZSBWYXJpYXRpb24gV2l0aGluIGFuZCBCZXR3ZWVuIFBvcHVsYXRpb25zCgpBIHNpbXBsZSB3YXkgdG8gY29tcGFyZSB2YXJpYXRpb24gd2l0aGluIGFuZCBiZXR3ZWVuIHBvcHVsYXRpb25zIGlzIHRvIHBsb3QgYSBmcmVxdWVuY3kgaGlzdG9ncmFtICh3aGljaCByZXByZXNlbnRzIHRoZSByYXcgY291bnRzKSBhbG9uZyB3aXRoIGEgZGVuc2l0eSBwbG90ICh3aGljaCByZXByZXNlbnRzIHRoZSBhcHByb3hpbWF0ZWQgc3RhdGlzdGljYWwgZGlzdHJpYnV0aW9uKS4gWW91IGNhbiBnZW5lcmF0ZSBhIGhpc3RvZ3JhbSB3aXRoIHRoZSBgZ2VvbV9oaXN0b2dyYW0oKWAgZnVuY3Rpb24gYW5kIGRlc2lnbmF0ZSBhbnkgdHJhaXQgeW91IG1heSB3YW50IGFzIHRoZSB4IGF4aXMuIFlvdSBjYW4gY2FsY3VsYXRlIHRoZSBkZW5zaXR5IHdpdGggYGFlcyh5PS4uZGVuc2l0eS4uKWAgd2l0aGluIGBnZW9tX2hpc3RvZ3JhbSgpYCBhbmQgdGhlbiBwbG90IGl0IHdpdGggYGdlb21fZGVuc2l0eSgpYC4gTm90ZSB0aGF0IHdoZW4geW91IGhhdmUgbW9yZSB0aGFuIHR3byBncm91cHMgKGluIG91ciBjYXNlIHdlIGhhdmUgc2FtcGxlcyBmcm9tIGEgY2F2ZSBhbmQgYSBzdXJmYWNlIHBvcHVsYXRpb24pLCB5b3UgY2FuIHZpc3VhbGl6ZSB0aGVtIHNlcGFyYXRlbHkgYnkgZGVzaWduYXRpbmcgYSBkaWZmZXJlbnQgY29sb3IgZm9yIGVhY2ggZ3JvdXAgaW4gdGhlIGFlc3RoZXRpY3MgKGBmaWxsPUhhYml0YXRgKS4KCldoZW4geW91IHZpc3VhbGl6ZSBib2R5IHNpemUgdmFyaWF0aW9uIGluIHRoaXMgbWFubmVyIHdoYXQgZG8geW91IG9ic2VydmU/IElzIHRoZXJlIG1vcmUgdmFyaWF0aW9uIHdpdGhpbiBvciBiZXR3ZWVuIHBvcHVsYXRpb25zPwoKYGBge3IgbWVzc2FnZT1GQUxTRX0KI1VzZSB0aGUgZ2dwbG90IGZ1bmN0aW9uIHRvIGdyYXBoIHRoZSBoaXN0b2dyYW0gKHNlZTogaHR0cDovL3d3dy5zdGhkYS5jb20vZW5nbGlzaC93aWtpL2dncGxvdDItaGlzdG9ncmFtLXBsb3QtcXVpY2stc3RhcnQtZ3VpZGUtci1zb2Z0d2FyZS1hbmQtZGF0YS12aXN1YWxpemF0aW9uKQpnZ3Bsb3QobW9ycGguZGF0YSwgYWVzKHg9U3RhbmRhcmQubGVuZ3RoLCBmaWxsPUhhYml0YXQpKSArIAogIGdlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uKSkgKwogIGdlb21fZGVuc2l0eShhbHBoYT0wLjUpKwogIHhsYWIoIlN0YW5kYXJkIGxlbmd0aCAobW0pIikgKyAKICB5bGFiKCJmcmVxdWVuY3kiKSArCiAgdGhlbWVfY2xhc3NpYygpCmBgYAoKKlRoZXJlIGlzIGEgc2xpZ2h0IGRpZmZlcmVuY2UgaW4gc3RhbmRhcmQgbGVuZ3RoLCB0aGVyZSBpcyBtb3JlIHZhcmlhdGlvbiB3aXRoaW4gdGhlIHBvcHVsYXRpb25zIGJlY2F1c2UgdGhlIGF2ZXJhZ2VzIGFuZCBwZWFrcyBhcmUgdmVyeSBzaW1pbGFyLioKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgNC4yLiBDb21wYXJpbmcgUHJlZG9yc2FsIExlbmd0aCBWYXJpYXRpb24gV2l0aGluIGFuZCBCZXR3ZWVuIFBvcHVsYXRpb25zCgpMZXQncyBhbHNvIGNvbXBhcmUgYSBzZWNvbmQgdHJhaXQsIHByZWRvcnNhbCBsZW5ndGguIFdpdGggdGhlIHByZXZpb3VzIGdyYXBoIHlvdSBob3BlZnVsbHkgc2F3IGhvdyB2YXJpYWJsZSBvdmVyYWxsIGJvZHkgc2l6ZSBpcyB3aXRoaW4gcG9wdWxhdGlvbnMuIElmIHdlIHdhbnQgdG8gY29tcGFyZSBvdGhlciB0cmFpdHMsIHdlIGhhdmUgdG8gYWNjb3VudCBmb3IgdGhhdC4gV2Ugd2FudCB0byBrbm93IHdoZXRoZXIgdmFyaWF0aW9uIGluIHByZWRvcnNhbCBsZW5ndGggaXMgZHVlIHRvIHZhcmlhdGlvbiBpbiBzaXplIChzbWFsbCBmaXNoIGhhdmUgc21hbGwgcHJlZG9yc2FsIGxlbmd0aHMpIG9yIHdoZXRoZXIgb3RoZXIgcGF0dGVybnMgbWlnaHQgYmUgYXQgcGxheS4gVG8gZG8gc28sIHdlIGNhbiBjYWxjdWxhdGUgdGhlIHJlc2lkdWFsIHByZWRvcnNhbCBsZW5ndGggYXMgZnJvbSBhIHJlZ3Jlc3Npb24gYmV0d2VlbiBwcmVkb3JzYWwgYW5kIHN0YW5kYXJkIGxlbmd0aCB1c2luZyB0aGUgYGxtKHkgfiB4LCBkYXRhKWAgYW5kIGByZXNpZHVhbHMoKWAgZnVuY3Rpb25zOgoKYGBge3J9CiNDYWxjdWxhdGluZyByZWdyZXNzaW9uIGxpbmUKZml0MSA8LSBsbShQcmVkb3JzYWwubGVuZ3RoIH4gU3RhbmRhcmQubGVuZ3RoLCBkYXRhID0gbW9ycGguZGF0YSkKCiNFeHRyYWN0IHJlc2lkdWFscyBhbmQgY3JlYXRlIGEgbmV3IHZhcmlhYmxlIHJlcy5wcmVkb3JzYWwgaW4gdGhlIG1vcnBoLmRhdGEgZGF0YSBmcmFtZQptb3JwaC5kYXRhJHJlcy5wcmVkb3JzYWwgPC0gcmVzaWR1YWxzKGZpdDEpCmBgYAoKWW91IGNhbiB0aGVuIHVzZSB0aGUgbmV3IHZhcmlhYmxlIHRvIHBsb3QgdGhlIHJlc2lkdWFsIHByZWRvcnNhbCBsZW5ndGgsIHdoaWNoIGlzIGNvcnJlY3RlZCBmb3IgYm9keSBzaXplOgoKYGBge3IgbWVzc2FnZT1GQUxTRX0KIyNVc2UgdGhlIGdncGxvdCBmdW5jdGlvbiB0byBncmFwaCB0aGUgaGlzdG9ncmFtIGFuZCBjb2xvciBkYXRhIGJhc2VkIG9uIGhhYml0YXQKZ2dwbG90KG1vcnBoLmRhdGEsIGFlcyh4PXJlcy5wcmVkb3JzYWwsIGZpbGw9SGFiaXRhdCkpICsKICBnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLikpICsKICBnZW9tX2RlbnNpdHkoYWxwaGE9MC41KSsKICB4bGFiKCJyZWFsYXRpdmUgcHJlZG9yc2FsIGxlbmd0aCIpICsgCiAgeWxhYigiZnJlcXVlbmN5IikgKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKCldoZW4geW91IHBsb3QgcmVsYXRpdmUgcHJlZG9yc2FsIGxlbmd0aCwgd2hhdCBkbyB5b3Ugb2JzZXJ2ZT8gSG93IGRvZXMgdmFyaWF0aW9uIGluIHByZWRvcnNhbCBsZW5ndGggdmFyeSB3aXRoaW4gYW5kIGJldHdlZW4gcG9wdWxhdGlvbnMsIGFuZCBob3cgZG9lcyBpdCBjb21wYXJlIHRvIHZhcmlhdGlvbiBpbiBzdGFuZGFyZCBsZW5ndGg/CgoqV2UgZG9udCBzZWUgYSBsb3Qgb2YgdmFyaWF0aW9uIHdpdGhpbiB0aGUgcG9wdWxhdGlvbiwgbGVuZ3RoIGRvZXNudCByZWFsbHkgbWF0dGVyLioKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgNC4zLiBDb21wYXJpbmcgRXllIFNpemUgVmFyaWF0aW9uIFdpdGhpbiBhbmQgQmV0d2VlbiBQb3B1bGF0aW9ucwoKVXNpbmcgdGhlIHNhbWUgYXBwcm9hY2ggYXMgZm9yIHByZWRvcnNhbCB2YXJpYXRpb24sIGNvbXBhcmUgdmFyaWF0aW9uIGluIHJlbGF0aXZlIGV5ZSBkaWFtZXRlcjoKCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CiNZb3VyIGNvZGUgZ29lcyBoZXJlCmZpdDIgPC0gbG0oRXllLmRpYW1ldGVyIH4gU3RhbmRhcmQubGVuZ3RoLCBkYXRhID0gbW9ycGguZGF0YSkKCiNFeHRyYWN0IHJlc2lkdWFscyBhbmQgY3JlYXRlIGEgbmV3IHZhcmlhYmxlIEV5ZS5kaWFtZXRlciBpbiB0aGUgbW9ycGguZGF0YSBkYXRhIGZyYW1lCm1vcnBoLmRhdGEkcmVzLmV5ZS5zaXplIDwtIHJlc2lkdWFscyhmaXQyKQoKIyNVc2UgdGhlIGdncGxvdCBmdW5jdGlvbiB0byBncmFwaCB0aGUgaGlzdG9ncmFtIGFuZCBjb2xvciBkYXRhIGJhc2VkIG9uIGhhYml0YXQKZ2dwbG90KG1vcnBoLmRhdGEsIGFlcyh4PXJlcy5leWUuc2l6ZSwgZmlsbD1IYWJpdGF0KSkgKwogIGdlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uKSkgKwogIGdlb21fZGVuc2l0eShhbHBoYT0wLjUpKwogIHhsYWIoInJlYWxhdGl2ZSBleWUgc2l6ZSIpICsgCiAgeWxhYigiZnJlcXVlbmN5IikgKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKCldoYXQgZG8geW91IG9ic2VydmU/IEhvdyBkb2VzIHZhcmlhdGlvbiBpbiBleWUgZGlhbWV0ZXIgdmFyeSB3aXRoaW4gYW5kIGJldHdlZW4gcG9wdWxhdGlvbnMsIGFuZCBob3cgZG9lcyBpdCBjb21wYXJlIHRvIHZhcmlhdGlvbiBpbiB0aGUgb3RoZXIgdHJhaXRzPwoKKkkgc2VlIHRoYXQgcmVsYXRpdmUgZXllIHNpemUgaXMgbGFyZ2VyIGZvciB0aGUgc3VyZmFjZSBwb3B1bGF0aW9uLiBFeWUgZGlhbWV0ZXIgdmFyeSBzIHdpdGggdGhlcmUgYmVpbmcgbGFyZ2VyIGV5ZSBzaXplcyBmb3IgdGhlIHN1cmZhY2UgcG9wdWxhdGlvbiByYXRoZXIgdGhhbiB0aGUgY2F2ZSBwb3B1bGF0aW9uIGJlY2F1c2UgdGhleSBkb24ndCBuZWNlc3NhcmlseSBuZWVkIHRvIHNlZSBzaW5jZSBpdCBpcyBzbyBkYXJrLiBpdCBjb21wYXJlcyB0byB2YXJpYXRpb24gb2Ygb3RoZXIgdHJhaXRzIHNpbmNlIHRoZSBjaGFuZ2UgaW4gdGhlIGVudmlyb25tZW50IGxlYWRzIHRvIGRpZmZlcmVudCBuZWVkcyBvZiBkaWZmZXJlbnQgZXZvbHV0aW9uYXJ5IHRyYWl0cy4qCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgNS4gVmFyaWF0aW9uIGluIFRyYWl0cyBpcyBIZXJpdGFibGUKCkFuIGF2aWQgYnJlZWRlciBvZiBmYW5jeSBwaWdlb25zLCBEYXJ3aW4gb2JzZXJ2ZWQgdGhhdCBzcGVjaWZpYyB0cmFpdHMgYXJlIHBhc3NlZCBmcm9tIHBhcmVudHMgdG8gb2Zmc3ByaW5nLCBldmVuIHRob3VnaCBoZSBoYWQgbm8gY2x1ZSBob3cgdGhpcyBtaWdodCBhY3R1YWxseSB3b3JrIChnZW5ldGljcyB3YXMgbm90IHJlYWxseSBhIHRoaW5nIHlldCkuIEV2ZW4gd2l0aG91dCBhbiBhYmlsaXR5IHRvIGNvbmR1Y3QgbW9sZWN1bGFyIGdlbmV0aWMgYW5hbHlzZXMsIHdlIGNhbiBlc3RpbWF0ZSBoZXJpdGFiaWxpdHkgb2YgdHJhaXRzIGJ5IGNvbXBhcmluZyB0aGUgdHJhaXRzIG9mIG9mZnNwcmluZyB0byB0aGUgdHJhaXRzIG9mIHRoZSBwYXJlbnRzLgoKTGV0J3MgbG9hZCBzb21lIGRhdGEgdGhhdCBjb21wYXJlcyBwYXJlbnQgYW5kIG9mZnNwcmluZyB0cmFpdHMgaW4gY2F2ZSBtb2xsaWVzLiBUbyBkbyB0aGlzLCB3ZSBicm91Z2h0IGNhdmUgbW9sbGllcyBpbnRvIHRoZSBsYWIgYW5kIGJyZWQgdGhlbSB1bmRlciBzdGFuZGFyZGl6ZWQgY29uZGl0aW9ucy4gRGF0YSByZXByZXNlbnQgdGhlIGF2ZXJhZ2UgdHJhaXQgdmFsdWVzIG9mIHRoZSBtb3RoZXIgYW5kIGZhdGhlciBhbmQgb2YgYWxsIG9mZnNwcmluZyBmcm9tIGEgc3BlY2lmaWMgYnJvb2QuIFRoZSBlYXNpZXN0IHdheSB0byBjb21wYXJlIHBhcmVudCBhbmQgb2Zmc3ByaW5nIHRyYWl0cyBpcyB0aHJvdWdoIGEgc2NhdHRlciBwbG90LCB3aGljaCB3ZSBhbHJlYWR5IHVzZWQgaW4gRXhlcmNpc2UgMS4gSWYgYSB0cmFpdCBpcyBoZXJpdGFibGUsIHdlIHdvdWxkIGV4cGVjdCB0byBzZWUgYSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHBhcmVudCBhbmQgb2Zmc3ByaW5nIHRyYWl0cyAoZS5nLiwgcGFyZW50cyB3aXRoIHNtYWxsIGV5ZXMgc2hvdWxkIGhhdmUgb2Zmc3ByaW5nIHdpdGggc21hbGwgZXllcykuCgpUaGUgZm9sbG93aW5nIGRhdGFzZXQgaW5jbHVkZXMgbWVhc3VyZW1lbnRzIG9mIHBhcmVudGFsIGFuZCBvZmZzcHJpbmcgc3RhbmRhcmQgbGVuZ3RoIGFzIHdlbGwgYXMgZXllIHNpemUuCgpgYGB7cn0KI1VzZSB0aGUgcmVhZC5jc3YgZnVuY3Rpb24gdG8gaW1wb3J0IGEgZGF0YXNldDsgdGFrZSBhIGxvb2sgYXQgdGhlIGRhdGEgc3RydWN0dXJlIG9uY2UgeW91IGltcG9ydGVkIHRoZSBmaWxlIQpoZXJpdGFiaWxpdHkgPC0gcmVhZC5jc3YoImhlcml0YWJpbGl0eS5jc3YiLCBmaWxlRW5jb2RpbmcgPSAnVVRGLTgtQk9NJykKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIDUuMS4gSGVyaXRhYmlsaXR5IG9mIFN0YW5kYXJkIExlbmd0aAoKRmlyc3QsIGxldCB1cyBleHBsb3JlIHdoZXRoZXIgdGhlcmUgaXMgZXZpZGVuY2UgZm9yIGhlcml0YWJpbGl0eSBpbiBzdGFuZGFyZCBsZW5ndGguCgpXaGF0IGRvIHlvdSBvYnNlcnZlPyBJcyBzdGFuZGFyZCBsZW5ndGggYSBoZXJpdGFibGUgdHJhaXQ/CgpgYGB7ciBtZXNzYWdlPUZBTFNFfQpnZ3Bsb3QoaGVyaXRhYmlsaXR5LCBhZXMoeD1wYXJlbnQuc3RhbmRhcmQubGVuZ3RoLCB5PW9mZnNwcmluZy5zdGFuZGFyZC5sZW5ndGgpKSArIAogIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICB4bGFiKCJyZWFsYXRpdmUgaGVyaXRhYmlsaXR5IikgKyAKICB5bGFiKCJmcmVxdWVuY3kiKSArCiAgdGhlbWVfY2xhc3NpYygpCmBgYAoKKlRoZSBncmFwaCBpcyB2ZXJ5IHNjYXR0ZXJlZCwgc28gbm8gaGVycml0YWJpbGl0eSBpcyBub3QgYSBoZXJpdGFibGUgdHJhaXQuLioKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgNS4yLiBIZXJpdGFiaWxpdHkgb2YgRXllIFNpemUKCk5vdyBsZXQgdXMgZXhwbG9yZSB3aGV0aGVyIHRoZXJlIGlzIGFueSBoZXJpdGFiaWxpdHkgaW4gZXllIHNpemUuIFJlbWVtYmVyLCB0aGVyZSBpcyBzdWJzdGFudGlhbCB2YXJpYXRpb24gaW4gYm9keSBzaXplLCBhbmQgaW4gc3VjaCBjYXNlcywgd2Ugd2FudCB0byBjb250cm9sIGZvciBib2R5IHNpemUgYnkgY2FsY3VsYXRpbmcgcmVzaWR1YWwgZXllIHNpemUgZmlyc3QuCgpgYGB7ciBtZXNzYWdlPUZBTFNFfQojI0NhbGN1bGF0ZSByZXNpZHVhbCBleWUgc2l6ZXMgZm9yIHRoZSBwYXJlbnRzIGFuZCB0aGUgb2Zmc3ByaW5nCiNZb3VyIGNvZGUgZ29lcyBoZXJlOgpmaXQzIDwtIGxtKHBhcmVudC5leWUuc2l6ZSB+IHBhcmVudC5zdGFuZGFyZC5sZW5ndGgsIGRhdGEgPSBoZXJpdGFiaWxpdHkpCgpmaXQ0IDwtIGxtKG9mZnNwcmluZy5leWUuc2l6ZSB+IG9mZnNwcmluZy5zdGFuZGFyZC5sZW5ndGgsIGRhdGEgPSBoZXJpdGFiaWxpdHkpCgpoZXJpdGFiaWxpdHkkcmVzLm9mZnNwcmluZy5leWUgPC0gcmVzaWR1YWxzKGZpdDQpCiNQbG90IHRoZSByZXN1bHRzCmdncGxvdChtb3JwaC5kYXRhLCBhZXMoeD1TdGFuZGFyZC5sZW5ndGgsIHk9RXllLmRpYW1ldGVyKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIHhsYWIoIkV5ZSBkaWFtZXRlciIpICsgCiAgeWxhYigiU3RhbmRhcmQgbGVuZ3RoIikgKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKCldoYXQgZG8geW91IG9ic2VydmU/IElzIGV5ZSBzaXplIGEgaGVyaXRhYmxlIHRyYWl0PwoKKlRoZSBncmFwaCBzaG93cyBhIG1vcmUgbGluZWFyIGxvb2ssIHRoaXMgbWVhbnMgZXllIHNpemUgaXMgaGVyaXRhYmxlLioKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyA2LiBXaGF0IFdvdWxkIEhhcHBlbiBJZi4uLj8KCkltYWdpbmUgZm9yIGEgbW9tZW50IHRoYXQgc21hbGxlciBmaXNoIGhhdmUgYSBoaWdoZXIgbGlrZWxpaG9vZCBvZiBzdXJ2aXZhbCBpbiB0aGUgY2F2ZS4gV291bGQgeW91IGV4cGVjdCBldm9sdXRpb24gb2YgYm9keSBzaXplIHVwb24gY2F2ZSBjb2xvbml6YXRpb24/CgpJbWFnaW5lIGZvciBhIG1vbWVudCB0aGF0IGZpc2ggd2l0aCBzbWFsbGVyIGV5ZXMgaGF2ZSBhIGhpZ2hlciBsaWtlbGlob29kIG9mIHN1cnZpdmFsIGluIHRoZSBjYXZlLiBXb3VsZCB5b3UgZXhwZWN0IGV2b2x1dGlvbiBvZiBleWUgc2l6ZSB1cG9uIGNhdmUgY29sb25pemF0aW9uPyBKdXN0aWZ5IHlvdXIgcmVzcG9uc2UuCgoqWWVzIGV2b2x1dGlvbiBvZiBib2R5IHNpemUgd2lsbCBiZSBleHBlY3RlZC4gc2Vjb25kbHksIHllcyB5b3Ugd291bGQgZXhwZWN0IHRoZSBldm9sdXRpb24gb2Ygc21hbGxlciBleWVzIHVwb24gY2F2ZSBjb2xvbml6YXRpb24sIHRoZSBzY2VuYXJpbyBkZXNjcmliZWQgd2hlcmUgc21hbGxlciBleWVkIGZpc2ggaGF2ZSBhIGhpZ2hlciBsaWtlbGlob29kIG9mIHN1cnZpdmFsIGlzIHRoZSBkcml2aW5nIGZvcmNlIG9mIG5hdHVyYWwgc2VsZWN0aW9uICAqCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgNy4gUmVzb3VyY2VzCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIDcuMS4gRGF0YSBSZWZlcmVuY2VzCgpUaGUgZXllIHNpemUgZGF0YSB3YXMgcHVibGlzaGVkIGluIHRoZSBmb2xsb3dpbmcgcGFwZXIuIE90aGVyIG1lYXN1cmVtZW50cyBhcmUgdW5wdWJsaXNoZWQgZGF0YSBieSBNLiBUb2JsZXIuCgotICAgTWNHb3dhbiwgSy4gTC4sIEMuIE4uIFBhc3NvdywgTC4gQXJpYXMgUm9kcmlndWV6LCBNLiBUb2JsZXIgJiBKLiBMLiBLZWxsZXkgKDIwMTkpOiBbRXhwcmVzc2lvbiBhbmFseXNlcyBvZiBjYXZlIG1vbGxpZXMgKCpQb2VjaWxpYSBtZXhpY2FuYSopIHJldmVhbCBrZXkgZ2VuZXMgaW52b2x2ZWQgaW4gdGhlIGVhcmx5IGV2b2x1dGlvbiBvZiBleWUgcmVncmVzc2lvbl0oaHR0cHM6Ly9yb3lhbHNvY2lldHlwdWJsaXNoaW5nLm9yZy9kb2kvMTAuMTA5OC9yc2JsLjIwMTkuMDU1NCkuICpCaW9sb2d5IExldHRlcnMqIDE1ICgxMCk6IDIwMTkwNTU0LgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyA3LjIgUmVzb3VyY2VzIFlvdSBDb25zdWx0ZWQKCkNvbnN1bHRpbmcgYWRkaXRpb25hbCByZXNvdXJjZXMgdG8gc29sdmUgdGhpcyBhc3NpZ25tZW50IGlzIGFic29sdXRlbHkgYWxsb3dlZCwgYnV0IGZhaWx1cmUgdG8gZGlzY2xvc2UgdGhvc2UgcmVzb3VyY2VzIGlzIHBsYWdpYXJpc20uIFBsZWFzZSBsaXN0IGFueSBjb2xsYWJvcmF0b3JzIHlvdSB3b3JrZWQgd2l0aCBhbmQgcmVzb3VyY2VzIHlvdSB1c2VkIGJlbG93IG9yIHN0YXRlIHRoYXQgeW91IGhhdmUgbm90IHVzZWQgYW55LgoKKkRyLiBCb25uZXIuKgo=