Prepare the R enviroment. Clean workspace, import required libraries, import and inspect required data.
# clean up workspace environment
rm(list = ls())
# all packages used for the assignment
library(tidyr)
library(plyr)
library(readr)
library(dplyr)
library(ggmap)
library(party)
library(rpart)
library(rpart.plot)
library(reticulate)
library(DataComputing)
# Read the NMC data in.
NMC<-readr::read_csv("NMC_5_0.csv")
# Read the World Bank Data
WBD <- readr::read_csv("wbd.csv")
# Inspect the data
head(NMC)
head(WBD)
nrow(NMC)
[1] 15171
nrow(WBD)
[1] 264
Research Question
Using Power Transition Theory, which method of measuring state actor (country) power best predicts the outcome of the proposed conflict between China and The United States?
Begining of Project
Let’s start by select only the important variables from World Bank that we care about. Note that GDP is in USD and year is only available until 2012 in NMC. We will select until that date.
Python created a selection list Array
# Pass the selection list from our Python enviroment. Note it automatically translates it as a vecorized list "c()" in our R enviroment.
WBD <-
WBD %>%
select(py$selectionList)
# Inspect Resulting Dataset
head(WBD)
# Gather function to get WBD to the same narrow format as the NMC data
# Gather all the years, GDP, by all the years less the county code
WBD <-
WBD %>%
gather(year, GDP, -'Country Code')
head(WBD)
# Now we are going to join WBD GDP data with NMC data by Country Code and Year -- note: there are going to be records only from 1960 and beyond.
# Rename country code to stateabb for ease of natural join (plyr package)
WBD <-
WBD %>%
plyr::rename(c("Country Code"="stateabb"))
# Make WBD year column data type numeric so it is consistent with NMC
WBD$year <- as.numeric(WBD$year)
# Left join by year and state abbreviation equivalency
combinedDataFrame <-
NMC %>%
left_join(WBD, by = c("year"="year","stateabb"="stateabb"))
# Next I think it would be interesting to determine how well the six elements that comprise the CINC score and the score itself predict GDP via a simple linear model.
#Select only dates from 1960 and beyond to eliminate N/A results
datesBeyond1960 <-
combinedDataFrame %>%
filter(year >= 1960)
# I'm going to propose a Null Hypothesis that posits there is no signifigant correlation between any of the six CINC score vectors and GDP.
sixVectorPredictionOfGDPModel <-
datesBeyond1960 %>%
lm(GDP ~ milex + milper + irst + pec + tpop + upop, data=.)
summary(sixVectorPredictionOfGDPModel)
Call:
lm(formula = GDP ~ milex + milper + irst + pec + tpop + upop,
data = .)
Residuals:
Min 1Q Median 3Q Max
-6.920e+12 -6.381e+10 -5.278e+10 -1.286e+08 3.719e+12
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 6.478e+10 6.661e+09 9.725 < 2e-16 ***
milex 2.592e+04 3.375e+02 76.791 < 2e-16 ***
milper -4.907e+08 2.439e+07 -20.119 < 2e-16 ***
irst 1.049e+07 4.544e+05 23.086 < 2e-16 ***
pec -3.980e+05 5.595e+04 -7.114 1.37e-12 ***
tpop 6.949e+05 1.020e+05 6.815 1.11e-11 ***
upop 1.039e+06 4.284e+05 2.425 0.0154 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 3.57e+11 on 3368 degrees of freedom
(5254 observations deleted due to missingness)
Multiple R-squared: 0.8927, Adjusted R-squared: 0.8925
F-statistic: 4672 on 6 and 3368 DF, p-value: < 2.2e-16
The summary model shows that all six vectors are statistically signifigant therefore providing grounds to reject the Null based upon the determined signifigace.
Since there exists a significance between all of the predictors and GDP, does this mean that GDP is just as good of a measure of states power as CINC score is? Let’s proceed by graphing various representation of the two scores and their ability to determine power by metrics as explicated in the CINC codebook.
Predicting interstate conflict among Hegemon and Rising Power
First we are going to use find two states that may be at odds with each other, as contention is defined by power transition theory in the conditional anarchical international system, by looking at diffrent periods in history to see where the highest CINC scores are similar by two disimilar state actor’s governance systems. Initially I am thinking communist vs. democratic systems of governance, US, Russia, USSR, China?
# I am going to create a world map graphing function so we can pass year as an argument and a map is produced.
worldMapGraphCINCByYear <- function(passedYear){
combinedDataFrame %>%
filter(year==passedYear) %>%
WorldMap(key = stateabb, fill = cinc) +
ggtitle(paste("CINC Distribution in", passedYear))
}
#Choose WWII
worldMapGraphCINCByYear(1940)

#Choose Cuban Missle Crisis
worldMapGraphCINCByYear(1962)

#Choose Height of Cold War (1962-1979)
worldMapGraphCINCByYear(1970)

#Choose Berlin Wall Destruction
worldMapGraphCINCByYear(1991)

#Choose Collapse of USSR
worldMapGraphCINCByYear(1993)

#Choose 9/11
worldMapGraphCINCByYear(2001)

These graphs tell a story of alternating power between US, USSR and China. But since we are curious about the future, and given that Russia’s CINC fell dramatically, past the point of contention, lets now focus on the apparent fued between the US and China. Between 1991 and 2001 the changing of the hands is quite apparent. We know that how to two state operate is diffrent (governance wise) so lets move on to see when this period of power transition occured.
determineWhichCincHigher <- function(state1, state2, passedYear){
selection<-
NMC %>%
select(year, stateabb, cinc) %>%
filter(stateabb == country1 || stateabb == country2) %>%
filter(year == passedYear)
countryOneScore <-
selection %>%
filter(statebb == country1)
countryTwoScore <-
selection %>%
filter(statebb == country2)
if(countryOneScore > countryTwoScore){
return (state1)
}else{
return (state2)
}
}
Graphing Measures of US and China State Power
By GDP and CINC (our comparision models)
The next graph we are going to make is the power trasititon period between the United States and China. This has direct implications in Power transition theory. As the US is the hegemon of the international system, and China is an approching disatiosfied state (according to the theory of conditional anarchical international fourm). When these two states meet in power, the thoery posits that there will be a war between the two states. According to the current accepted prediction model, the CINC score the graphical illustration follows:
datesBeyond1960 %>%
filter(stateabb %in% c("USA", "CHN")) %>%
select(stateabb, year, cinc) %>%
ggplot(aes(x=year, y=cinc, color = stateabb)) +
geom_point() +
stat_smooth() +
xlab("Year of Measure") +
ylab("Composite Index of National Capabilities")

# Next is a model representation by GDP
datesBeyond1960 %>%
filter(stateabb %in% c("USA","CHN")) %>%
ggplot(aes(x=year, y=GDP, color = stateabb)) +
geom_point() +
stat_smooth() +
xlab("Year of Measure") +
ylab("Gross Domestic Product")

# Create a layered graphic that represents the cinc score modified with GDP as size.
datesBeyond1960 %>%
filter(stateabb %in% c("USA", "CHN")) %>%
select(stateabb, year, cinc, GDP) %>%
ggplot(aes(x=year, y=cinc, color = stateabb, size = GDP)) +
geom_point() +
stat_smooth() +
xlab("Year of Measure") +
ylab("Composite Index of National Capabilities")

Because these graphs tell two diffrent stories: we should have been at war with China in 1993, or war with China is approaching in the near future, we need to examine war potential by taking the diffrence of the cinc scores and GDP to determine a valid determination of how likley war is. From that we will make two dendrogram models with each of the 6 metrics to determine US war liklihood by virtue of value of each of those scores. If we take a look at the derivatives of each state’s measure of power with GDP, we see that the US’ has a smaller dt, therefore, China will intersect with the US’s GDP in the future.
# Calculate us cinc by year.
usaCincYear <-
datesBeyond1960 %>%
filter(stateabb %in% c("USA")) %>%
select(year, cinc) %>%
plyr::rename(c("cinc" = "ucinc"))
# Calculate chn cinc by year.
chnCincYear <-
datesBeyond1960 %>%
filter(stateabb %in% c("CHN")) %>%
select(year, cinc) %>%
plyr::rename(c("cinc" = "ccinc"))
# Calculate cinc difference by year.
cincDifference <-
left_join(usaCincYear, chnCincYear, by = "year") %>%
mutate(usWarPotentialCINC = ucinc - ccinc) %>%
select(year, usWarPotentialCINC)
# Merge this dataframe with our datesBeyond1960 dataframe
datesBeyond1960 <-
left_join(datesBeyond1960,cincDifference, by = "year")
# Determine dendogram of six vectors on us War Potential.
usWarPotentialByCincVectorsModel <-
datesBeyond1960 %>%
rpart(usWarPotentialCINC ~ milex + milper + irst + pec + tpop + upop, data = .)
# Note that a retruned number of zero indicates what the theory positis should be a period of war. A negative number means that that war period has been entered. Larger numbers are in the US' favor to stay out of war.
prp(usWarPotentialByCincVectorsModel)

# Neat Model which suggests that we may need to ensure that our military personell stay in high numbers and our total country population stays up.
# Next lets run the same operation but for GDP of a nation
# Calculate us cinc by year.
usaGDPYear <-
datesBeyond1960 %>%
filter(stateabb %in% c("USA")) %>%
select(year, GDP) %>%
plyr::rename(c("GDP" = "uGDP"))
# Calculate chn cinc by year.
chnGDPYear <-
datesBeyond1960 %>%
filter(stateabb %in% c("CHN")) %>%
select(year, GDP) %>%
plyr::rename(c("GDP" = "cGDP"))
# Calculate cinc difference by year.
gdpDifference <-
left_join(usaGDPYear, chnGDPYear, by = "year") %>%
mutate(usWarPotentialGDP = uGDP - cGDP) %>%
select(year, usWarPotentialGDP)
#Merge this datafram with our datesBeyond1960 dataframe
datesBeyond1960 <-
left_join(datesBeyond1960,gdpDifference, by = "year")
# Determine dendogram of six vectors on us War Potential.
usWarPotentialByCincVectorsModel <-
datesBeyond1960 %>%
rpart(usWarPotentialGDP ~ milex + milper + irst + pec + tpop + upop, data = .)
# Note that a retruned number of zero indicates what the theory positis should be a period of war. A negative number means that that war period has been entered. Larger numbers are in the US' favor to stay out of war; take a look at the left most leaf for factors that are most liley to lead to war by a factor of 10^3 by GDP metrics.
prp(usWarPotentialByCincVectorsModel)

Explore changes in world military expenditure
Next Find the average military expenditure of countries since from the beginning of the dataset. Notice that there are spikes in military expenditure during WWI (1917), US joins WWII (1941) (growth in milex grows rapidly each year after), Begining of Vietnam War (1955), Peak of cold war and local minima after fall of USSR (1993), attacks on Sept. 11 2001 (2002 budgetary information). This demonstrates that everytime the United States’ entered a war, it has had a direct impact on the average military expenditure of the world.
NMC %>%
select(stateabb, year, milex) %>%
group_by(year) %>%
summarise(avg_Expenditure = mean(milex)) %>%
ggplot(aes(x=year, y=avg_Expenditure)) +
geom_point() +
xlab("Year of Observation") +
ylab("Military Expenditure In Billion of USD") +
geom_vline(xintercept = 1917) +
geom_vline(xintercept = 1941) +
geom_vline(xintercept = 1955) +
geom_vline(xintercept = 1993) +
geom_vline(xintercept = 2002)

Interestingly Enough if we run the same operation, except this time removing the United States, we can begin to notice that these verticle bars which have deeply rooted signifigance in the United States, still hold great meaning, i.e. the world’s overall are MILEX matches with US; thus demonstrating the signifigance of impact the US has on the world military expenditures – or the world setting the tone for US milex. NOTE: the y limit droped by a factor of 10^2 thousand dollars when we removed the United States!
NMC %>%
select(stateabb, year, milex) %>%
filter(stateabb != "USA") %>%
group_by(year) %>%
summarise(avg_Expenditure = mean(milex)) %>%
ggplot(aes(x=year, y=avg_Expenditure)) +
geom_point() +
xlab("Year of Observation") +
ylab("Military Expenditure In Billion of USD") +
geom_vline(xintercept = 1917) +
geom_vline(xintercept = 1941) +
geom_vline(xintercept = 1955) +
geom_vline(xintercept = 1993) +
geom_vline(xintercept = 2002)

determineUSMilitaryExpenditure <- function(passedYear)
{
result<-
NMC %>%
select(stateabb, milex, year) %>%
filter(stateabb=="USA") %>%
filter(year==passedYear) %>%
select(milex)
return (result)
}
Since 1993, there has been a spike in military expenditure in the United States. The difference between the expenditure of these two years in thosand U.S Dollars:
year1993MilEx <- determineUSMilitaryExpenditure(1993)
year2012MilEx <- determineUSMilitaryExpenditure(2012)
(year2012MilEx - year1993MilEx)
Even though the military expenditure has went up over the course of that time, there is a strong negative association between the funds and military personelle. If a larger military expenditure does not mean more military personelle, than that leads us to question what we are spending our money on.
milper<-
NMC%>%
select(year, milper) %>%
group_by(year) %>%
summarise(milper=mean(milper)) %>%
filter(year>=1993) %>%
select(milper)
milex<-
NMC%>%
select(year, milex) %>%
group_by(year) %>%
summarise(milex=mean(milex)) %>%
filter(year>=1993) %>%
select(milex)
cor(milex, milper, method = c("pearson"))
milper
milex -0.7067304
#I'm curious to run a regression model to see the signifigance of all the six parts that have the most impact on CINC Score.
head(NMC)
forModel <-
NMC %>%
select(milex, milper, irst, pec, tpop, upop, cinc)
modLM <-
lm(cinc ~ ., data = forModel)
modTree <-
rpart::rpart(cinc ~ ., data = forModel)
summary(modLM)
Call:
lm(formula = cinc ~ ., data = forModel)
Residuals:
Min 1Q Median 3Q Max
-0.23858 -0.00652 -0.00592 -0.00409 0.32094
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 5.955e-03 2.484e-04 23.976 < 2e-16 ***
milex -3.154e-10 2.231e-11 -14.137 < 2e-16 ***
milper 2.718e-05 5.778e-07 47.041 < 2e-16 ***
irst -8.520e-08 3.043e-08 -2.799 0.00513 **
pec 8.495e-08 3.391e-09 25.050 < 2e-16 ***
tpop 1.018e-07 5.024e-09 20.266 < 2e-16 ***
upop -5.502e-07 2.749e-08 -20.013 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.02897 on 15164 degrees of freedom
Multiple R-squared: 0.3933, Adjusted R-squared: 0.3931
F-statistic: 1639 on 6 and 15164 DF, p-value: < 2.2e-16
rpart.plot::prp(modTree)

From these graphics, it can be resonably determiend that CINC and GDP measure the same quantity. Perhaps the problem is not how we operationalize power, but rather that there is something wrong with the theory – perhaps an alternate explination is that China is content with the status quo, and that is why they have not challenged the United States. Until we can operationalize state discontentment, we will have to settle with this conclusion.
CINC Is The Superior Measure of State Power
To answer the research question directly, which of the two is better for predicting state power, I would argue that the Corrolates of War’s Composite Index of National Capabilities is. For in making decision trees, and graphics, these additional six variables are all statistically signifigant. Becasue there are additional vecotrs of measurement represented as a world share percentage, it gives a clear ranking of states place in the itnernational system over time. This assesment is based on a complete Exploratory Data Analysis, with graphics used to help guide this research and drive home this conclusion.
Additional Honors Option Section
Linear Regression of CINC as a Prediction of War Potential
~~~ Python Code ~~~
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as seabornInstance from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn import metrics
dataset = r.datesBeyond1960 dataset.plot(x=‘cinc’,y=‘GDP’, style=‘o’)
#seabornInstance.distplot(dataset[‘usWarPotentialCINC’]) #CINC on GDP X = dataset[‘cinc’].values.reshape(-1,1) y = dataset[‘usWarPotentialCINC’].values.reshape(-1,1)
#Spilt 80% into training and 20% into test X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
regressor = LinearRegression()
regressor.fit(X_train, y_train) #training the algorithm
#To retrieve the intercept: print(regressor.intercept_) #For retrieving the slope: print(regressor.coef_)
y_pred = regressor.predict(X_test) df = pd.DataFrame({‘Actual’: y_test.flatten(), ‘Predicted’: y_pred.flatten()})
#Print out graphic of predicted vs. actual value for war potential graphic. plt.scatter(X_test, y_test, color=‘gray’) plt.plot(X_test, y_pred, color=‘red’, linewidth=2) plt.show()
~~~ End Python Code~~~
[[0.12428646]]

While though the variable (US War Potential by CINC score) make sense logically, when it is plotted against CINC itself, the varibale starts to lose meaning. It therefore is not a good indicator, alone, for predicting US war potential. Therefore, other options for war prediciton variables should first be explored before using this crafted variable alone to measure war liklihood between the Untied States and China.
LS0tDQp0aXRsZTogIkNvcnJvbGF0ZXMgb2YgV2FyIEZpbmFsIFByb2plY3QiDQphdXRob3I6ICJBbmFseXNpcyBCeTogTmljaG9sYXMgQy4gQmlyb3NpayINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoqKioNCiMjIyBQcmVwYXJlIHRoZSBSIGVudmlyb21lbnQuIENsZWFuIHdvcmtzcGFjZSwgaW1wb3J0IHJlcXVpcmVkIGxpYnJhcmllcywgaW1wb3J0IGFuZCBpbnNwZWN0IHJlcXVpcmVkIGRhdGEuDQpgYGB7ciBtZXNzYWdlPUZBTFNFfQ0KIyBjbGVhbiB1cCB3b3Jrc3BhY2UgZW52aXJvbm1lbnQNCnJtKGxpc3QgPSBscygpKQ0KDQojIGFsbCBwYWNrYWdlcyB1c2VkIGZvciB0aGUgYXNzaWdubWVudA0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkocGx5cikNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ21hcCkNCmxpYnJhcnkocGFydHkpDQpsaWJyYXJ5KHJwYXJ0KQ0KbGlicmFyeShycGFydC5wbG90KQ0KbGlicmFyeShyZXRpY3VsYXRlKQ0KbGlicmFyeShEYXRhQ29tcHV0aW5nKQ0KDQojIFJlYWQgdGhlIE5NQyBkYXRhIGluLg0KTk1DPC1yZWFkcjo6cmVhZF9jc3YoIk5NQ181XzAuY3N2IikNCg0KIyBSZWFkIHRoZSBXb3JsZCBCYW5rIERhdGENCldCRCA8LSByZWFkcjo6cmVhZF9jc3YoIndiZC5jc3YiKQ0KDQojIEluc3BlY3QgdGhlIGRhdGENCmhlYWQoTk1DKQ0KaGVhZChXQkQpDQoNCm5yb3coTk1DKQ0KbnJvdyhXQkQpDQpgYGANCg0KDQoNCg0KIyBSZXNlYXJjaCBRdWVzdGlvbg0KDQpVc2luZyBQb3dlciBUcmFuc2l0aW9uIFRoZW9yeSwgd2hpY2ggbWV0aG9kIG9mIG1lYXN1cmluZyBzdGF0ZSBhY3RvciAoY291bnRyeSkgcG93ZXIgYmVzdCBwcmVkaWN0cyB0aGUgb3V0Y29tZSBvZiB0aGUgcHJvcG9zZWQgY29uZmxpY3QgYmV0d2VlbiBDaGluYSBhbmQgVGhlIFVuaXRlZCBTdGF0ZXM/ICANCg0KIyBCZWdpbmluZyBvZiBQcm9qZWN0DQpMZXQncyBzdGFydCBieSBzZWxlY3Qgb25seSB0aGUgaW1wb3J0YW50IHZhcmlhYmxlcyBmcm9tIFdvcmxkIEJhbmsgdGhhdCB3ZSBjYXJlIGFib3V0LiBOb3RlIHRoYXQgR0RQIGlzIGluIFVTRCBhbmQgeWVhciBpcyBvbmx5IGF2YWlsYWJsZSB1bnRpbCAyMDEyIGluIE5NQy4gV2Ugd2lsbCBzZWxlY3QgdW50aWwgdGhhdCBkYXRlLg0KDQpgYGB7cHl0aG9ufQ0KIyBVc2UgUHl0aG9uIHRvIHJldHVybiB1cyBhIGxpc3Qgb2YgY29sdW1uIG5hbWVzIGZyb20gMTk2MCB0byAyMDEyIGluIHN0cmluZyBmb3JtYXQgc28gdGhhdCB3ZSBjYW4gd3JhbmdsZSBvdXIgZGF0YSBlYXNpZXIgZG93biBiZWxvdy4gTm90ZSB0aGF0IHRoZSBmb3IgbG9vcCBlbmRzIG9uZSB5ZWFyIGhpZ2hlciwgYmVjYXN1ZSBweXRob24gdXNlcyB0aGUgc3RvcCBhdCBmb3IgbWV0aG9kLg0Kc2VsZWN0aW9uTGlzdCA9IFsiQ291bnRyeSBDb2RlIl0NCmZvciBjdXJyZW50RGF0ZSBpbiByYW5nZSAoMTk2MCwgMjAxMyk6DQogIHNlbGVjdGlvbkxpc3QuYXBwZW5kKHN0cihjdXJyZW50RGF0ZSkpDQpwcmludCgiUHl0aG9uIGNyZWF0ZWQgb3VyIHNlbGVjdGlvbiBsaXN0IEFycmF5IikNCmBgYA0KDQpgYGB7cn0NCiMgUGFzcyB0aGUgc2VsZWN0aW9uIGxpc3QgZnJvbSBvdXIgUHl0aG9uIGVudmlyb21lbnQuIE5vdGUgaXQgYXV0b21hdGljYWxseSB0cmFuc2xhdGVzIGl0IGFzIGEgdmVjb3JpemVkIGxpc3QgImMoKSIgaW4gb3VyIFIgZW52aXJvbWVudC4NCldCRCA8LQ0KICBXQkQgJT4lDQogIHNlbGVjdChweSRzZWxlY3Rpb25MaXN0KQ0KDQojIEluc3BlY3QgUmVzdWx0aW5nIERhdGFzZXQNCmhlYWQoV0JEKQ0KYGBgDQoNCmBgYHtyfQ0KIyBHYXRoZXIgZnVuY3Rpb24gdG8gZ2V0IFdCRCB0byB0aGUgc2FtZSBuYXJyb3cgZm9ybWF0IGFzIHRoZSBOTUMgZGF0YQ0KIyBHYXRoZXIgYWxsIHRoZSB5ZWFycywgR0RQLCBieSBhbGwgdGhlIHllYXJzIGxlc3MgdGhlIGNvdW50eSBjb2RlDQpXQkQgPC0NCiAgV0JEICU+JQ0KICBnYXRoZXIoeWVhciwgR0RQLCAtJ0NvdW50cnkgQ29kZScpDQoNCmhlYWQoV0JEKQ0KYGBgDQpgYGB7cn0NCiMgTm93IHdlIGFyZSBnb2luZyB0byBqb2luIFdCRCBHRFAgZGF0YSB3aXRoIE5NQyBkYXRhIGJ5IENvdW50cnkgQ29kZSBhbmQgWWVhciAtLSBub3RlOiB0aGVyZSBhcmUgZ29pbmcgdG8gYmUgcmVjb3JkcyBvbmx5IGZyb20gMTk2MCBhbmQgYmV5b25kLg0KDQojIFJlbmFtZSBjb3VudHJ5IGNvZGUgdG8gc3RhdGVhYmIgZm9yIGVhc2Ugb2YgbmF0dXJhbCBqb2luIChwbHlyIHBhY2thZ2UpDQpXQkQgPC0NCiAgV0JEICU+JQ0KICBwbHlyOjpyZW5hbWUoYygiQ291bnRyeSBDb2RlIj0ic3RhdGVhYmIiKSkNCg0KIyBNYWtlIFdCRCB5ZWFyIGNvbHVtbiBkYXRhIHR5cGUgbnVtZXJpYyBzbyBpdCBpcyBjb25zaXN0ZW50IHdpdGggTk1DDQpXQkQkeWVhciA8LSBhcy5udW1lcmljKFdCRCR5ZWFyKQ0KDQojIExlZnQgam9pbiBieSB5ZWFyIGFuZCBzdGF0ZSBhYmJyZXZpYXRpb24gZXF1aXZhbGVuY3kNCmNvbWJpbmVkRGF0YUZyYW1lIDwtDQogIE5NQyAlPiUNCiAgbGVmdF9qb2luKFdCRCwgYnkgPSBjKCJ5ZWFyIj0ieWVhciIsInN0YXRlYWJiIj0ic3RhdGVhYmIiKSkNCmBgYA0KDQpgYGB7cn0NCiMgTmV4dCBJIHRoaW5rIGl0IHdvdWxkIGJlIGludGVyZXN0aW5nIHRvIGRldGVybWluZSBob3cgd2VsbCB0aGUgc2l4IGVsZW1lbnRzIHRoYXQgY29tcHJpc2UgdGhlIENJTkMgc2NvcmUgYW5kIHRoZSBzY29yZSBpdHNlbGYgcHJlZGljdCBHRFAgdmlhIGEgc2ltcGxlIGxpbmVhciBtb2RlbC4NCg0KI1NlbGVjdCBvbmx5IGRhdGVzIGZyb20gMTk2MCBhbmQgYmV5b25kIHRvIGVsaW1pbmF0ZSBOL0EgcmVzdWx0cw0KZGF0ZXNCZXlvbmQxOTYwIDwtDQogIGNvbWJpbmVkRGF0YUZyYW1lICU+JQ0KICBmaWx0ZXIoeWVhciA+PSAxOTYwKQ0KDQojIEknbSBnb2luZyB0byBwcm9wb3NlIGEgTnVsbCBIeXBvdGhlc2lzIHRoYXQgcG9zaXRzIHRoZXJlIGlzIG5vIHNpZ25pZmlnYW50IGNvcnJlbGF0aW9uIGJldHdlZW4gYW55IG9mIHRoZSBzaXggQ0lOQyBzY29yZSB2ZWN0b3JzIGFuZCBHRFAuIA0Kc2l4VmVjdG9yUHJlZGljdGlvbk9mR0RQTW9kZWwgPC0NCiAgZGF0ZXNCZXlvbmQxOTYwICU+JQ0KICBsbShHRFAgfiBtaWxleCArIG1pbHBlciArIGlyc3QgKyBwZWMgKyB0cG9wICsgdXBvcCwgZGF0YT0uKQ0KDQpzdW1tYXJ5KHNpeFZlY3RvclByZWRpY3Rpb25PZkdEUE1vZGVsKQ0KYGBgDQpUaGUgc3VtbWFyeSBtb2RlbCBzaG93cyB0aGF0IGFsbCBzaXggdmVjdG9ycyBhcmUgc3RhdGlzdGljYWxseSBzaWduaWZpZ2FudCB0aGVyZWZvcmUgcHJvdmlkaW5nIGdyb3VuZHMgdG8gcmVqZWN0IHRoZSBOdWxsIGJhc2VkIHVwb24gdGhlIGRldGVybWluZWQgc2lnbmlmaWdhY2UuDQoNClNpbmNlIHRoZXJlIGV4aXN0cyBhIHNpZ25pZmljYW5jZSBiZXR3ZWVuIGFsbCBvZiB0aGUgcHJlZGljdG9ycyBhbmQgR0RQLCBkb2VzIHRoaXMgbWVhbiB0aGF0IEdEUCBpcyBqdXN0IGFzIGdvb2Qgb2YgYSBtZWFzdXJlIG9mIHN0YXRlcyBwb3dlciBhcyBDSU5DIHNjb3JlIGlzPyBMZXQncyBwcm9jZWVkIGJ5IGdyYXBoaW5nIHZhcmlvdXMgcmVwcmVzZW50YXRpb24gb2YgdGhlIHR3byBzY29yZXMgYW5kIHRoZWlyIGFiaWxpdHkgdG8gZGV0ZXJtaW5lIHBvd2VyIGJ5IG1ldHJpY3MgYXMgZXhwbGljYXRlZCBpbiB0aGUgQ0lOQyBjb2RlYm9vay4NCg0KIyBQcmVkaWN0aW5nIGludGVyc3RhdGUgY29uZmxpY3QgYW1vbmcgSGVnZW1vbiBhbmQgUmlzaW5nIFBvd2VyDQpGaXJzdCB3ZSBhcmUgZ29pbmcgdG8gdXNlIGZpbmQgdHdvIHN0YXRlcyB0aGF0IG1heSBiZSBhdCBvZGRzIHdpdGggZWFjaCBvdGhlciwgYXMgY29udGVudGlvbiBpcyBkZWZpbmVkIGJ5IHBvd2VyIHRyYW5zaXRpb24gdGhlb3J5IGluIHRoZSBjb25kaXRpb25hbCBhbmFyY2hpY2FsIGludGVybmF0aW9uYWwgc3lzdGVtLCBieSBsb29raW5nIGF0IGRpZmZyZW50IHBlcmlvZHMgaW4gaGlzdG9yeSB0byBzZWUgd2hlcmUgdGhlIGhpZ2hlc3QgQ0lOQyBzY29yZXMgYXJlIHNpbWlsYXIgYnkgdHdvIGRpc2ltaWxhciBzdGF0ZSBhY3RvcidzIGdvdmVybmFuY2Ugc3lzdGVtcy4gSW5pdGlhbGx5IEkgYW0gdGhpbmtpbmcgY29tbXVuaXN0IHZzLiBkZW1vY3JhdGljIHN5c3RlbXMgb2YgZ292ZXJuYW5jZSwgVVMsIFJ1c3NpYSwgVVNTUiwgQ2hpbmE/DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBJIGFtIGdvaW5nIHRvIGNyZWF0ZSBhIHdvcmxkIG1hcCBncmFwaGluZyBmdW5jdGlvbiBzbyB3ZSBjYW4gcGFzcyB5ZWFyIGFzIGFuIGFyZ3VtZW50IGFuZCBhIG1hcCBpcyBwcm9kdWNlZC4NCg0Kd29ybGRNYXBHcmFwaENJTkNCeVllYXIgPC0gZnVuY3Rpb24ocGFzc2VkWWVhcil7DQogIGNvbWJpbmVkRGF0YUZyYW1lICU+JQ0KICAgIGZpbHRlcih5ZWFyPT1wYXNzZWRZZWFyKSAlPiUNCiAgICBXb3JsZE1hcChrZXkgPSBzdGF0ZWFiYiwgZmlsbCA9IGNpbmMpICsNCiAgICBnZ3RpdGxlKHBhc3RlKCJDSU5DIERpc3RyaWJ1dGlvbiBpbiIsIHBhc3NlZFllYXIpKQ0KfQ0KDQoNCiNDaG9vc2UgV1dJSQ0Kd29ybGRNYXBHcmFwaENJTkNCeVllYXIoMTk0MCkNCiNDaG9vc2UgQ3ViYW4gTWlzc2xlIENyaXNpcw0Kd29ybGRNYXBHcmFwaENJTkNCeVllYXIoMTk2MikNCiNDaG9vc2UgSGVpZ2h0IG9mIENvbGQgV2FyICgxOTYyLTE5NzkpDQp3b3JsZE1hcEdyYXBoQ0lOQ0J5WWVhcigxOTcwKQ0KI0Nob29zZSBCZXJsaW4gV2FsbCBEZXN0cnVjdGlvbg0Kd29ybGRNYXBHcmFwaENJTkNCeVllYXIoMTk5MSkNCiNDaG9vc2UgQ29sbGFwc2Ugb2YgVVNTUg0Kd29ybGRNYXBHcmFwaENJTkNCeVllYXIoMTk5MykNCiNDaG9vc2UgOS8xMQ0Kd29ybGRNYXBHcmFwaENJTkNCeVllYXIoMjAwMSkNCmBgYA0KDQpUaGVzZSBncmFwaHMgdGVsbCBhIHN0b3J5IG9mIGFsdGVybmF0aW5nIHBvd2VyIGJldHdlZW4gVVMsIFVTU1IgYW5kIENoaW5hLiBCdXQgc2luY2Ugd2UgYXJlIGN1cmlvdXMgYWJvdXQgdGhlIGZ1dHVyZSwgYW5kIGdpdmVuIHRoYXQgUnVzc2lhJ3MgQ0lOQyBmZWxsIGRyYW1hdGljYWxseSwgcGFzdCB0aGUgcG9pbnQgb2YgY29udGVudGlvbiwgbGV0cyBub3cgZm9jdXMgb24gdGhlIGFwcGFyZW50IGZ1ZWQgYmV0d2VlbiB0aGUgVVMgYW5kIENoaW5hLiBCZXR3ZWVuIDE5OTEgYW5kIDIwMDEgdGhlIGNoYW5naW5nIG9mIHRoZSBoYW5kcyBpcyBxdWl0ZSBhcHBhcmVudC4gV2Uga25vdyB0aGF0IGhvdyB0byB0d28gc3RhdGUgb3BlcmF0ZSBpcyBkaWZmcmVudCAoZ292ZXJuYW5jZSB3aXNlKSBzbyBsZXRzIG1vdmUgb24gdG8gc2VlIHdoZW4gdGhpcyBwZXJpb2Qgb2YgcG93ZXIgdHJhbnNpdGlvbiBvY2N1cmVkLiANCg0KDQpgYGB7cn0NCmRldGVybWluZVdoaWNoQ2luY0hpZ2hlciA8LSBmdW5jdGlvbihzdGF0ZTEsIHN0YXRlMiwgcGFzc2VkWWVhcil7DQogICAgc2VsZWN0aW9uPC0NCiAgICAgIE5NQyAlPiUNCiAgICAgIHNlbGVjdCh5ZWFyLCBzdGF0ZWFiYiwgY2luYykgJT4lDQogICAgICBmaWx0ZXIoc3RhdGVhYmIgPT0gY291bnRyeTEgfHwgc3RhdGVhYmIgPT0gY291bnRyeTIpICU+JQ0KICAgICAgZmlsdGVyKHllYXIgPT0gcGFzc2VkWWVhcikNCiAgICANCiAgICBjb3VudHJ5T25lU2NvcmUgPC0NCiAgICAgIHNlbGVjdGlvbiAlPiUNCiAgICAgIGZpbHRlcihzdGF0ZWJiID09IGNvdW50cnkxKQ0KICAgIA0KICAgIGNvdW50cnlUd29TY29yZSA8LQ0KICAgICAgc2VsZWN0aW9uICU+JQ0KICAgICAgZmlsdGVyKHN0YXRlYmIgPT0gY291bnRyeTIpDQogICAgDQogICAgaWYoY291bnRyeU9uZVNjb3JlID4gY291bnRyeVR3b1Njb3JlKXsNCiAgICAgIHJldHVybiAoc3RhdGUxKQ0KICAgIH1lbHNlew0KICAgICAgcmV0dXJuIChzdGF0ZTIpDQogICAgfQ0KfQ0KYGBgDQoNCiMgR3JhcGhpbmcgTWVhc3VyZXMgb2YgVVMgYW5kIENoaW5hIFN0YXRlIFBvd2VyIA0KIyMjIEJ5IEdEUCBhbmQgQ0lOQyAob3VyIGNvbXBhcmlzaW9uIG1vZGVscykNClRoZSBuZXh0IGdyYXBoIHdlIGFyZSBnb2luZyB0byBtYWtlIGlzIHRoZSBwb3dlciB0cmFzaXRpdG9uIHBlcmlvZCBiZXR3ZWVuIHRoZSBVbml0ZWQgU3RhdGVzIGFuZCBDaGluYS4gVGhpcyBoYXMgZGlyZWN0IGltcGxpY2F0aW9ucyBpbiBQb3dlciB0cmFuc2l0aW9uIHRoZW9yeS4gQXMgdGhlIFVTIGlzIHRoZSBoZWdlbW9uIG9mIHRoZSBpbnRlcm5hdGlvbmFsIHN5c3RlbSwgYW5kIENoaW5hIGlzIGFuIGFwcHJvY2hpbmcgZGlzYXRpb3NmaWVkIHN0YXRlIChhY2NvcmRpbmcgdG8gdGhlIHRoZW9yeSBvZiBjb25kaXRpb25hbCBhbmFyY2hpY2FsIGludGVybmF0aW9uYWwgZm91cm0pLiBXaGVuIHRoZXNlIHR3byBzdGF0ZXMgbWVldCBpbiBwb3dlciwgdGhlIHRob2VyeSBwb3NpdHMgdGhhdCB0aGVyZSB3aWxsIGJlIGEgd2FyIGJldHdlZW4gdGhlIHR3byBzdGF0ZXMuIEFjY29yZGluZyB0byB0aGUgY3VycmVudCBhY2NlcHRlZCBwcmVkaWN0aW9uIG1vZGVsLCB0aGUgQ0lOQyBzY29yZSB0aGUgZ3JhcGhpY2FsIGlsbHVzdHJhdGlvbiBmb2xsb3dzOg0KDQpgYGB7cn0NCmRhdGVzQmV5b25kMTk2MCAlPiUNCiAgZmlsdGVyKHN0YXRlYWJiICVpbiUgYygiVVNBIiwgIkNITiIpKSAlPiUNCiAgc2VsZWN0KHN0YXRlYWJiLCB5ZWFyLCBjaW5jKSAlPiUNCiAgZ2dwbG90KGFlcyh4PXllYXIsIHk9Y2luYywgY29sb3IgPSBzdGF0ZWFiYikpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgc3RhdF9zbW9vdGgoKSArDQogIHhsYWIoIlllYXIgb2YgTWVhc3VyZSIpICsNCiAgeWxhYigiQ29tcG9zaXRlIEluZGV4IG9mIE5hdGlvbmFsIENhcGFiaWxpdGllcyIpDQoNCiMgTmV4dCBpcyBhIG1vZGVsIHJlcHJlc2VudGF0aW9uIGJ5IEdEUA0KZGF0ZXNCZXlvbmQxOTYwICU+JQ0KICBmaWx0ZXIoc3RhdGVhYmIgJWluJSBjKCJVU0EiLCJDSE4iKSkgJT4lDQogIGdncGxvdChhZXMoeD15ZWFyLCB5PUdEUCwgY29sb3IgPSBzdGF0ZWFiYikpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgc3RhdF9zbW9vdGgoKSArIA0KICB4bGFiKCJZZWFyIG9mIE1lYXN1cmUiKSArDQogIHlsYWIoIkdyb3NzIERvbWVzdGljIFByb2R1Y3QiKQ0KDQojIENyZWF0ZSBhIGxheWVyZWQgZ3JhcGhpYyB0aGF0IHJlcHJlc2VudHMgdGhlIGNpbmMgc2NvcmUgbW9kaWZpZWQgd2l0aCBHRFAgYXMgc2l6ZS4NCmRhdGVzQmV5b25kMTk2MCAlPiUNCiAgZmlsdGVyKHN0YXRlYWJiICVpbiUgYygiVVNBIiwgIkNITiIpKSAlPiUNCiAgc2VsZWN0KHN0YXRlYWJiLCB5ZWFyLCBjaW5jLCBHRFApICU+JQ0KICBnZ3Bsb3QoYWVzKHg9eWVhciwgeT1jaW5jLCBjb2xvciA9IHN0YXRlYWJiLCBzaXplID0gR0RQKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBzdGF0X3Ntb290aCgpICsNCiAgeGxhYigiWWVhciBvZiBNZWFzdXJlIikgKw0KICB5bGFiKCJDb21wb3NpdGUgSW5kZXggb2YgTmF0aW9uYWwgQ2FwYWJpbGl0aWVzIikNCmBgYA0KDQpCZWNhdXNlIHRoZXNlIGdyYXBocyB0ZWxsIHR3byBkaWZmcmVudCBzdG9yaWVzOiB3ZSBzaG91bGQgaGF2ZSBiZWVuIGF0IHdhciB3aXRoIENoaW5hIGluIDE5OTMsIG9yIHdhciB3aXRoIENoaW5hIGlzIGFwcHJvYWNoaW5nIGluIHRoZSBuZWFyIGZ1dHVyZSwgd2UgbmVlZCB0byBleGFtaW5lIHdhciBwb3RlbnRpYWwgYnkgdGFraW5nIHRoZSBkaWZmcmVuY2Ugb2YgdGhlIGNpbmMgc2NvcmVzIGFuZCBHRFAgdG8gZGV0ZXJtaW5lIGEgdmFsaWQgZGV0ZXJtaW5hdGlvbiBvZiBob3cgbGlrbGV5IHdhciBpcy4gRnJvbSB0aGF0IHdlIHdpbGwgbWFrZSB0d28gZGVuZHJvZ3JhbSBtb2RlbHMgd2l0aCBlYWNoIG9mIHRoZSA2IG1ldHJpY3MgdG8gZGV0ZXJtaW5lIFVTIHdhciBsaWtsaWhvb2QgYnkgdmlydHVlIG9mIHZhbHVlIG9mIGVhY2ggb2YgdGhvc2Ugc2NvcmVzLiBJZiB3ZSB0YWtlIGEgbG9vayBhdCB0aGUgZGVyaXZhdGl2ZXMgb2YgZWFjaCBzdGF0ZSdzIG1lYXN1cmUgb2YgcG93ZXIgd2l0aCBHRFAsIHdlIHNlZSB0aGF0IHRoZSBVUycgaGFzIGEgc21hbGxlciBkdCwgdGhlcmVmb3JlLCBDaGluYSB3aWxsIGludGVyc2VjdCB3aXRoIHRoZSBVUydzIEdEUCBpbiB0aGUgZnV0dXJlLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0NCiMgQ2FsY3VsYXRlIHVzIGNpbmMgYnkgeWVhci4NCnVzYUNpbmNZZWFyIDwtDQpkYXRlc0JleW9uZDE5NjAgJT4lDQogIGZpbHRlcihzdGF0ZWFiYiAlaW4lIGMoIlVTQSIpKSAlPiUNCiAgc2VsZWN0KHllYXIsIGNpbmMpICU+JQ0KICBwbHlyOjpyZW5hbWUoYygiY2luYyIgPSAidWNpbmMiKSkNCg0KIyBDYWxjdWxhdGUgY2huIGNpbmMgYnkgeWVhci4NCmNobkNpbmNZZWFyIDwtDQpkYXRlc0JleW9uZDE5NjAgJT4lDQogIGZpbHRlcihzdGF0ZWFiYiAlaW4lIGMoIkNITiIpKSAlPiUNCiAgc2VsZWN0KHllYXIsIGNpbmMpICU+JQ0KICBwbHlyOjpyZW5hbWUoYygiY2luYyIgPSAiY2NpbmMiKSkNCg0KIyBDYWxjdWxhdGUgY2luYyBkaWZmZXJlbmNlIGJ5IHllYXIuICANCmNpbmNEaWZmZXJlbmNlIDwtDQogIGxlZnRfam9pbih1c2FDaW5jWWVhciwgY2huQ2luY1llYXIsIGJ5ID0gInllYXIiKSAlPiUNCiAgbXV0YXRlKHVzV2FyUG90ZW50aWFsQ0lOQyA9IHVjaW5jIC0gY2NpbmMpICU+JQ0KICBzZWxlY3QoeWVhciwgdXNXYXJQb3RlbnRpYWxDSU5DKQ0KDQojIE1lcmdlIHRoaXMgZGF0YWZyYW1lIHdpdGggb3VyIGRhdGVzQmV5b25kMTk2MCBkYXRhZnJhbWUNCmRhdGVzQmV5b25kMTk2MCA8LQ0KICBsZWZ0X2pvaW4oZGF0ZXNCZXlvbmQxOTYwLGNpbmNEaWZmZXJlbmNlLCBieSA9ICJ5ZWFyIikNCg0KIyBEZXRlcm1pbmUgZGVuZG9ncmFtIG9mIHNpeCB2ZWN0b3JzIG9uIHVzIFdhciBQb3RlbnRpYWwuIA0KdXNXYXJQb3RlbnRpYWxCeUNpbmNWZWN0b3JzTW9kZWwgPC0NCiAgZGF0ZXNCZXlvbmQxOTYwICU+JQ0KICBycGFydCh1c1dhclBvdGVudGlhbENJTkMgfiBtaWxleCArIG1pbHBlciArIGlyc3QgKyBwZWMgKyB0cG9wICsgdXBvcCwgZGF0YSA9IC4pDQoNCiMgTm90ZSB0aGF0IGEgcmV0cnVuZWQgbnVtYmVyIG9mIHplcm8gaW5kaWNhdGVzIHdoYXQgdGhlIHRoZW9yeSBwb3NpdGlzIHNob3VsZCBiZSBhIHBlcmlvZCBvZiB3YXIuIEEgbmVnYXRpdmUgbnVtYmVyIG1lYW5zIHRoYXQgdGhhdCB3YXIgcGVyaW9kIGhhcyBiZWVuIGVudGVyZWQuIExhcmdlciBudW1iZXJzIGFyZSBpbiB0aGUgVVMnIGZhdm9yIHRvIHN0YXkgb3V0IG9mIHdhci4NCnBycCh1c1dhclBvdGVudGlhbEJ5Q2luY1ZlY3RvcnNNb2RlbCkNCg0KIyBOZWF0IE1vZGVsIHdoaWNoIHN1Z2dlc3RzIHRoYXQgd2UgbWF5IG5lZWQgdG8gZW5zdXJlIHRoYXQgb3VyIG1pbGl0YXJ5IHBlcnNvbmVsbCBzdGF5IGluIGhpZ2ggbnVtYmVycyBhbmQgb3VyIHRvdGFsIGNvdW50cnkgcG9wdWxhdGlvbiBzdGF5cyB1cC4NCg0KIyBOZXh0IGxldHMgcnVuIHRoZSBzYW1lIG9wZXJhdGlvbiBidXQgZm9yIEdEUCBvZiBhIG5hdGlvbg0KIyBDYWxjdWxhdGUgdXMgY2luYyBieSB5ZWFyLg0KdXNhR0RQWWVhciA8LQ0KZGF0ZXNCZXlvbmQxOTYwICU+JQ0KICBmaWx0ZXIoc3RhdGVhYmIgJWluJSBjKCJVU0EiKSkgJT4lDQogIHNlbGVjdCh5ZWFyLCBHRFApICU+JQ0KICBwbHlyOjpyZW5hbWUoYygiR0RQIiA9ICJ1R0RQIikpDQoNCiMgQ2FsY3VsYXRlIGNobiBjaW5jIGJ5IHllYXIuDQpjaG5HRFBZZWFyIDwtDQpkYXRlc0JleW9uZDE5NjAgJT4lDQogIGZpbHRlcihzdGF0ZWFiYiAlaW4lIGMoIkNITiIpKSAlPiUNCiAgc2VsZWN0KHllYXIsIEdEUCkgJT4lDQogIHBseXI6OnJlbmFtZShjKCJHRFAiID0gImNHRFAiKSkNCg0KIyBDYWxjdWxhdGUgY2luYyBkaWZmZXJlbmNlIGJ5IHllYXIuICANCmdkcERpZmZlcmVuY2UgPC0NCiAgbGVmdF9qb2luKHVzYUdEUFllYXIsIGNobkdEUFllYXIsIGJ5ID0gInllYXIiKSAlPiUNCiAgbXV0YXRlKHVzV2FyUG90ZW50aWFsR0RQID0gdUdEUCAtIGNHRFApICU+JQ0KICBzZWxlY3QoeWVhciwgdXNXYXJQb3RlbnRpYWxHRFApDQoNCiNNZXJnZSB0aGlzIGRhdGFmcmFtIHdpdGggb3VyIGRhdGVzQmV5b25kMTk2MCBkYXRhZnJhbWUNCmRhdGVzQmV5b25kMTk2MCA8LQ0KICBsZWZ0X2pvaW4oZGF0ZXNCZXlvbmQxOTYwLGdkcERpZmZlcmVuY2UsIGJ5ID0gInllYXIiKQ0KDQojIERldGVybWluZSBkZW5kb2dyYW0gb2Ygc2l4IHZlY3RvcnMgb24gdXMgV2FyIFBvdGVudGlhbC4gDQp1c1dhclBvdGVudGlhbEJ5Q2luY1ZlY3RvcnNNb2RlbCA8LQ0KICBkYXRlc0JleW9uZDE5NjAgJT4lDQogIHJwYXJ0KHVzV2FyUG90ZW50aWFsR0RQIH4gbWlsZXggKyBtaWxwZXIgKyBpcnN0ICsgcGVjICsgdHBvcCArIHVwb3AsIGRhdGEgPSAuKQ0KDQojIE5vdGUgdGhhdCBhIHJldHJ1bmVkIG51bWJlciBvZiB6ZXJvIGluZGljYXRlcyB3aGF0IHRoZSB0aGVvcnkgcG9zaXRpcyBzaG91bGQgYmUgYSBwZXJpb2Qgb2Ygd2FyLiBBIG5lZ2F0aXZlIG51bWJlciBtZWFucyB0aGF0IHRoYXQgd2FyIHBlcmlvZCBoYXMgYmVlbiBlbnRlcmVkLiBMYXJnZXIgbnVtYmVycyBhcmUgaW4gdGhlIFVTJyBmYXZvciB0byBzdGF5IG91dCBvZiB3YXI7IHRha2UgYSBsb29rIGF0IHRoZSBsZWZ0IG1vc3QgbGVhZiBmb3IgZmFjdG9ycyB0aGF0IGFyZSBtb3N0IGxpbGV5IHRvIGxlYWQgdG8gd2FyIGJ5IGEgZmFjdG9yIG9mIDEwXjMgYnkgR0RQIG1ldHJpY3MuDQpwcnAodXNXYXJQb3RlbnRpYWxCeUNpbmNWZWN0b3JzTW9kZWwpDQpgYGANCg0KIyBFeHBsb3JlIGNoYW5nZXMgaW4gd29ybGQgbWlsaXRhcnkgZXhwZW5kaXR1cmUNCk5leHQgRmluZCB0aGUgYXZlcmFnZSBtaWxpdGFyeSBleHBlbmRpdHVyZSBvZiBjb3VudHJpZXMgc2luY2UgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhc2V0LiBOb3RpY2UgdGhhdCB0aGVyZSBhcmUgc3Bpa2VzIGluIG1pbGl0YXJ5IGV4cGVuZGl0dXJlIGR1cmluZyBXV0kgKDE5MTcpLCBVUyBqb2lucyBXV0lJICgxOTQxKSAoZ3Jvd3RoIGluIG1pbGV4IGdyb3dzIHJhcGlkbHkgZWFjaCB5ZWFyIGFmdGVyKSwgQmVnaW5pbmcgb2YgVmlldG5hbSBXYXIgKDE5NTUpLCBQZWFrIG9mIGNvbGQgd2FyIGFuZCBsb2NhbCBtaW5pbWEgYWZ0ZXIgZmFsbCBvZiBVU1NSICgxOTkzKSwgYXR0YWNrcyBvbiBTZXB0LiAxMSAyMDAxICgyMDAyIGJ1ZGdldGFyeSBpbmZvcm1hdGlvbikuIFRoaXMgZGVtb25zdHJhdGVzIHRoYXQgZXZlcnl0aW1lIHRoZSBVbml0ZWQgU3RhdGVzJyBlbnRlcmVkIGEgd2FyLCBpdCBoYXMgaGFkIGEgZGlyZWN0IGltcGFjdCBvbiB0aGUgYXZlcmFnZSBtaWxpdGFyeSBleHBlbmRpdHVyZSBvZiB0aGUgd29ybGQuIA0KYGBge3J9DQpOTUMgJT4lDQogIHNlbGVjdChzdGF0ZWFiYiwgeWVhciwgbWlsZXgpICU+JQ0KICBncm91cF9ieSh5ZWFyKSAlPiUNCiAgc3VtbWFyaXNlKGF2Z19FeHBlbmRpdHVyZSA9IG1lYW4obWlsZXgpKSAlPiUNCiAgZ2dwbG90KGFlcyh4PXllYXIsIHk9YXZnX0V4cGVuZGl0dXJlKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICB4bGFiKCJZZWFyIG9mIE9ic2VydmF0aW9uIikgKw0KICB5bGFiKCJNaWxpdGFyeSBFeHBlbmRpdHVyZSBJbiBCaWxsaW9uIG9mIFVTRCIpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTkxNykgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxOTQxKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDE5NTUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTk5MykgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyMDAyKSANCmBgYA0KSW50ZXJlc3RpbmdseSBFbm91Z2ggaWYgd2UgcnVuIHRoZSBzYW1lIG9wZXJhdGlvbiwgZXhjZXB0IHRoaXMgdGltZSByZW1vdmluZyB0aGUgVW5pdGVkIFN0YXRlcywgd2UgY2FuIGJlZ2luIHRvIG5vdGljZSB0aGF0IHRoZXNlIHZlcnRpY2xlIGJhcnMgd2hpY2ggaGF2ZSBkZWVwbHkgcm9vdGVkIHNpZ25pZmlnYW5jZSBpbiB0aGUgVW5pdGVkIFN0YXRlcywgc3RpbGwgaG9sZCBncmVhdCBtZWFuaW5nLCBpLmUuIHRoZSB3b3JsZCdzIG92ZXJhbGwgYXJlIE1JTEVYIG1hdGNoZXMgd2l0aCBVUzsgdGh1cyBkZW1vbnN0cmF0aW5nIHRoZSBzaWduaWZpZ2FuY2Ugb2YgaW1wYWN0IHRoZSBVUyBoYXMgb24gdGhlIHdvcmxkIG1pbGl0YXJ5IGV4cGVuZGl0dXJlcyAtLSBvciB0aGUgd29ybGQgc2V0dGluZyB0aGUgdG9uZSBmb3IgVVMgbWlsZXguIE5PVEU6IHRoZSB5IGxpbWl0IGRyb3BlZCBieSBhIGZhY3RvciBvZiAxMF4yIHRob3VzYW5kIGRvbGxhcnMgd2hlbiB3ZSByZW1vdmVkIHRoZSBVbml0ZWQgU3RhdGVzIQ0KYGBge3J9DQpOTUMgJT4lDQogIHNlbGVjdChzdGF0ZWFiYiwgeWVhciwgbWlsZXgpICU+JQ0KICBmaWx0ZXIoc3RhdGVhYmIgIT0gIlVTQSIpICU+JQ0KICBncm91cF9ieSh5ZWFyKSAlPiUNCiAgc3VtbWFyaXNlKGF2Z19FeHBlbmRpdHVyZSA9IG1lYW4obWlsZXgpKSAlPiUNCiAgZ2dwbG90KGFlcyh4PXllYXIsIHk9YXZnX0V4cGVuZGl0dXJlKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICB4bGFiKCJZZWFyIG9mIE9ic2VydmF0aW9uIikgKw0KICB5bGFiKCJNaWxpdGFyeSBFeHBlbmRpdHVyZSBJbiBCaWxsaW9uIG9mIFVTRCIpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTkxNykgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxOTQxKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDE5NTUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTk5MykgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyMDAyKQ0KYGBgDQoNCg0KYGBge3J9DQpkZXRlcm1pbmVVU01pbGl0YXJ5RXhwZW5kaXR1cmUgPC0gZnVuY3Rpb24ocGFzc2VkWWVhcikNCnsNCiAgDQpyZXN1bHQ8LQ0KTk1DICU+JQ0KICBzZWxlY3Qoc3RhdGVhYmIsIG1pbGV4LCB5ZWFyKSAlPiUNCiAgZmlsdGVyKHN0YXRlYWJiPT0iVVNBIikgJT4lDQogIGZpbHRlcih5ZWFyPT1wYXNzZWRZZWFyKSAlPiUNCiAgc2VsZWN0KG1pbGV4KQ0KICANCnJldHVybiAocmVzdWx0KSAgDQoNCn0NCmBgYA0KDQpTaW5jZSAxOTkzLCB0aGVyZSBoYXMgYmVlbiBhIHNwaWtlIGluIG1pbGl0YXJ5IGV4cGVuZGl0dXJlIGluIHRoZSBVbml0ZWQgU3RhdGVzLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBleHBlbmRpdHVyZSBvZiB0aGVzZSB0d28geWVhcnMgaW4gdGhvc2FuZCBVLlMgRG9sbGFyczoNCmBgYHtyfQ0KeWVhcjE5OTNNaWxFeCA8LSBkZXRlcm1pbmVVU01pbGl0YXJ5RXhwZW5kaXR1cmUoMTk5MykNCnllYXIyMDEyTWlsRXggPC0gZGV0ZXJtaW5lVVNNaWxpdGFyeUV4cGVuZGl0dXJlKDIwMTIpDQooeWVhcjIwMTJNaWxFeCAtIHllYXIxOTkzTWlsRXgpDQpgYGANCg0KRXZlbiB0aG91Z2ggdGhlIG1pbGl0YXJ5IGV4cGVuZGl0dXJlIGhhcyB3ZW50IHVwIG92ZXIgdGhlIGNvdXJzZSBvZiB0aGF0IHRpbWUsIHRoZXJlIGlzIGEgc3Ryb25nIG5lZ2F0aXZlIGFzc29jaWF0aW9uIGJldHdlZW4gdGhlIGZ1bmRzIGFuZCBtaWxpdGFyeSBwZXJzb25lbGxlLiBJZiBhIGxhcmdlciBtaWxpdGFyeSBleHBlbmRpdHVyZSBkb2VzIG5vdCBtZWFuIG1vcmUgbWlsaXRhcnkgcGVyc29uZWxsZSwgdGhhbiB0aGF0IGxlYWRzIHVzIHRvIHF1ZXN0aW9uIHdoYXQgd2UgYXJlIHNwZW5kaW5nIG91ciBtb25leSBvbi4NCmBgYHtyfQ0KbWlscGVyPC0NCk5NQyU+JQ0KICBzZWxlY3QoeWVhciwgbWlscGVyKSAlPiUNCiAgZ3JvdXBfYnkoeWVhcikgJT4lDQogIHN1bW1hcmlzZShtaWxwZXI9bWVhbihtaWxwZXIpKSAlPiUNCiAgZmlsdGVyKHllYXI+PTE5OTMpICU+JQ0KICBzZWxlY3QobWlscGVyKQ0KDQptaWxleDwtDQpOTUMlPiUNCiAgc2VsZWN0KHllYXIsIG1pbGV4KSAlPiUNCiAgZ3JvdXBfYnkoeWVhcikgJT4lDQogIHN1bW1hcmlzZShtaWxleD1tZWFuKG1pbGV4KSkgJT4lDQogIGZpbHRlcih5ZWFyPj0xOTkzKSAlPiUNCiAgc2VsZWN0KG1pbGV4KQ0KDQoNCmNvcihtaWxleCwgbWlscGVyLCBtZXRob2QgPSBjKCJwZWFyc29uIikpDQpgYGANCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI0knbSBjdXJpb3VzIHRvIHJ1biBhIHJlZ3Jlc3Npb24gbW9kZWwgdG8gc2VlIHRoZSBzaWduaWZpZ2FuY2Ugb2YgYWxsIHRoZSBzaXggcGFydHMgdGhhdCBoYXZlIHRoZSBtb3N0IGltcGFjdCBvbiBDSU5DIFNjb3JlLg0KaGVhZChOTUMpDQpmb3JNb2RlbCA8LQ0KTk1DICU+JQ0KICBzZWxlY3QobWlsZXgsIG1pbHBlciwgaXJzdCwgcGVjLCB0cG9wLCB1cG9wLCBjaW5jKQ0KDQptb2RMTSA8LQ0KICBsbShjaW5jIH4gLiwgZGF0YSA9IGZvck1vZGVsKQ0KDQptb2RUcmVlIDwtDQogIHJwYXJ0OjpycGFydChjaW5jIH4gLiwgZGF0YSA9IGZvck1vZGVsKQ0KDQpzdW1tYXJ5KG1vZExNKQ0KcnBhcnQucGxvdDo6cHJwKG1vZFRyZWUpDQpgYGANCkZyb20gdGhlc2UgZ3JhcGhpY3MsIGl0IGNhbiBiZSByZXNvbmFibHkgZGV0ZXJtaWVuZCB0aGF0IENJTkMgYW5kIEdEUCBtZWFzdXJlIHRoZSBzYW1lIHF1YW50aXR5LiBQZXJoYXBzIHRoZSBwcm9ibGVtIGlzIG5vdCBob3cgd2Ugb3BlcmF0aW9uYWxpemUgcG93ZXIsIGJ1dCByYXRoZXIgdGhhdCB0aGVyZSBpcyBzb21ldGhpbmcgd3Jvbmcgd2l0aCB0aGUgdGhlb3J5IC0tIHBlcmhhcHMgYW4gYWx0ZXJuYXRlIGV4cGxpbmF0aW9uIGlzIHRoYXQgQ2hpbmEgaXMgY29udGVudCB3aXRoIHRoZSBzdGF0dXMgcXVvLCBhbmQgdGhhdCBpcyB3aHkgdGhleSBoYXZlIG5vdCBjaGFsbGVuZ2VkIHRoZSBVbml0ZWQgU3RhdGVzLiBVbnRpbCB3ZSBjYW4gb3BlcmF0aW9uYWxpemUgc3RhdGUgZGlzY29udGVudG1lbnQsIHdlIHdpbGwgaGF2ZSB0byBzZXR0bGUgd2l0aCB0aGlzIGNvbmNsdXNpb24uDQoNCiMgQ0lOQyBJcyBUaGUgU3VwZXJpb3IgTWVhc3VyZSBvZiBTdGF0ZSBQb3dlcg0KVG8gYW5zd2VyIHRoZSByZXNlYXJjaCBxdWVzdGlvbiBkaXJlY3RseSwgd2hpY2ggb2YgdGhlIHR3byBpcyBiZXR0ZXIgZm9yIHByZWRpY3Rpbmcgc3RhdGUgcG93ZXIsIEkgd291bGQgYXJndWUgdGhhdCB0aGUgQ29ycm9sYXRlcyBvZiBXYXIncyBDb21wb3NpdGUgSW5kZXggb2YgTmF0aW9uYWwgQ2FwYWJpbGl0aWVzIGlzLiBGb3IgaW4gbWFraW5nIGRlY2lzaW9uIHRyZWVzLCBhbmQgZ3JhcGhpY3MsIHRoZXNlIGFkZGl0aW9uYWwgc2l4IHZhcmlhYmxlcyBhcmUgYWxsIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWdhbnQuIEJlY2FzdWUgdGhlcmUgYXJlIGFkZGl0aW9uYWwgdmVjb3RycyBvZiBtZWFzdXJlbWVudCByZXByZXNlbnRlZCBhcyBhIHdvcmxkIHNoYXJlIHBlcmNlbnRhZ2UsIGl0IGdpdmVzIGEgY2xlYXIgcmFua2luZyBvZiBzdGF0ZXMgcGxhY2UgaW4gdGhlIGl0bmVybmF0aW9uYWwgc3lzdGVtIG92ZXIgdGltZS4gVGhpcyBhc3Nlc21lbnQgaXMgYmFzZWQgb24gYSBjb21wbGV0ZSBFeHBsb3JhdG9yeSBEYXRhIEFuYWx5c2lzLCB3aXRoIGdyYXBoaWNzIHVzZWQgdG8gaGVscCBndWlkZSB0aGlzIHJlc2VhcmNoIGFuZCBkcml2ZSBob21lIHRoaXMgY29uY2x1c2lvbi4NCg0KKioqDQoNCiMgQWRkaXRpb25hbCBIb25vcnMgT3B0aW9uIFNlY3Rpb24NCiMjIyBMaW5lYXIgUmVncmVzc2lvbiBvZiBDSU5DIGFzIGEgUHJlZGljdGlvbiBvZiBXYXIgUG90ZW50aWFsDQoNCn5+fiBQeXRob24gQ29kZSB+fn4NCg0KaW1wb3J0IHBhbmRhcyBhcyBwZCAgDQppbXBvcnQgbnVtcHkgYXMgbnAgIA0KaW1wb3J0IG1hdHBsb3RsaWIucHlwbG90IGFzIHBsdCAgDQppbXBvcnQgc2VhYm9ybiBhcyBzZWFib3JuSW5zdGFuY2UgDQpmcm9tIHNrbGVhcm4ubW9kZWxfc2VsZWN0aW9uIGltcG9ydCB0cmFpbl90ZXN0X3NwbGl0IA0KZnJvbSBza2xlYXJuLmxpbmVhcl9tb2RlbCBpbXBvcnQgTGluZWFyUmVncmVzc2lvbg0KZnJvbSBza2xlYXJuIGltcG9ydCBtZXRyaWNzDQoNCmRhdGFzZXQgPSByLmRhdGVzQmV5b25kMTk2MA0KZGF0YXNldC5wbG90KHg9J2NpbmMnLHk9J0dEUCcsIHN0eWxlPSdvJykNCg0KI3NlYWJvcm5JbnN0YW5jZS5kaXN0cGxvdChkYXRhc2V0Wyd1c1dhclBvdGVudGlhbENJTkMnXSkNCiNDSU5DIG9uIEdEUA0KWCA9IGRhdGFzZXRbJ2NpbmMnXS52YWx1ZXMucmVzaGFwZSgtMSwxKQ0KeSA9IGRhdGFzZXRbJ3VzV2FyUG90ZW50aWFsQ0lOQyddLnZhbHVlcy5yZXNoYXBlKC0xLDEpDQoNCiNTcGlsdCA4MCUgaW50byB0cmFpbmluZyBhbmQgMjAlIGludG8gdGVzdA0KWF90cmFpbiwgWF90ZXN0LCB5X3RyYWluLCB5X3Rlc3QgPSB0cmFpbl90ZXN0X3NwbGl0KFgsIHksIHRlc3Rfc2l6ZT0wLjIsIHJhbmRvbV9zdGF0ZT0wKQ0KDQpyZWdyZXNzb3IgPSBMaW5lYXJSZWdyZXNzaW9uKCkgIA0KcmVncmVzc29yLmZpdChYX3RyYWluLCB5X3RyYWluKSAjdHJhaW5pbmcgdGhlIGFsZ29yaXRobQ0KDQojVG8gcmV0cmlldmUgdGhlIGludGVyY2VwdDoNCnByaW50KHJlZ3Jlc3Nvci5pbnRlcmNlcHRfKQ0KI0ZvciByZXRyaWV2aW5nIHRoZSBzbG9wZToNCnByaW50KHJlZ3Jlc3Nvci5jb2VmXykNCg0KeV9wcmVkID0gcmVncmVzc29yLnByZWRpY3QoWF90ZXN0KQ0KZGYgPSBwZC5EYXRhRnJhbWUoeydBY3R1YWwnOiB5X3Rlc3QuZmxhdHRlbigpLCAnUHJlZGljdGVkJzogeV9wcmVkLmZsYXR0ZW4oKX0pDQoNCiNQcmludCBvdXQgZ3JhcGhpYyBvZiBwcmVkaWN0ZWQgdnMuIGFjdHVhbCB2YWx1ZSBmb3Igd2FyIHBvdGVudGlhbCBncmFwaGljLiANCnBsdC5zY2F0dGVyKFhfdGVzdCwgeV90ZXN0LCAgY29sb3I9J2dyYXknKQ0KcGx0LnBsb3QoWF90ZXN0LCB5X3ByZWQsIGNvbG9yPSdyZWQnLCBsaW5ld2lkdGg9MikNCnBsdC5zaG93KCkNCg0Kfn5+IEVuZCBQeXRob24gQ29kZX5+fg0KDQpgYGB7cHl0aG9ufQ0KaW1wb3J0IHBhbmRhcyBhcyBwZCAgDQppbXBvcnQgbnVtcHkgYXMgbnAgIA0KaW1wb3J0IG1hdHBsb3RsaWIucHlwbG90IGFzIHBsdCAgDQppbXBvcnQgc2VhYm9ybiBhcyBzZWFib3JuSW5zdGFuY2UgDQpmcm9tIHNrbGVhcm4ubW9kZWxfc2VsZWN0aW9uIGltcG9ydCB0cmFpbl90ZXN0X3NwbGl0IA0KZnJvbSBza2xlYXJuLmxpbmVhcl9tb2RlbCBpbXBvcnQgTGluZWFyUmVncmVzc2lvbg0KZnJvbSBza2xlYXJuIGltcG9ydCBtZXRyaWNzDQoNCmRhdGFzZXQgPSByLmRhdGVzQmV5b25kMTk2MA0KI2RhdGFzZXQucGxvdCh4PSdjaW5jJyx5PSdHRFAnLCBzdHlsZT0nbycpDQoNCiNzZWFib3JuSW5zdGFuY2UuZGlzdHBsb3QoZGF0YXNldFsndXNXYXJQb3RlbnRpYWxDSU5DJ10pDQojQ0lOQyBvbiBHRFANClggPSBkYXRhc2V0WydjaW5jJ10udmFsdWVzLnJlc2hhcGUoLTEsMSkNCnkgPSBkYXRhc2V0Wyd1c1dhclBvdGVudGlhbENJTkMnXS52YWx1ZXMucmVzaGFwZSgtMSwxKQ0KDQojU3BpbHQgODAlIGludG8gdHJhaW5pbmcgYW5kIDIwJSBpbnRvIHRlc3QNClhfdHJhaW4sIFhfdGVzdCwgeV90cmFpbiwgeV90ZXN0ID0gdHJhaW5fdGVzdF9zcGxpdChYLCB5LCB0ZXN0X3NpemU9MC4yLCByYW5kb21fc3RhdGU9MCkNCg0KcmVncmVzc29yID0gTGluZWFyUmVncmVzc2lvbigpICANCnJlZ3Jlc3Nvci5maXQoWF90cmFpbiwgeV90cmFpbikgI3RyYWluaW5nIHRoZSBhbGdvcml0aG0NCg0KI1RvIHJldHJpZXZlIHRoZSBpbnRlcmNlcHQ6DQpwcmludChyZWdyZXNzb3IuaW50ZXJjZXB0XykNCiNGb3IgcmV0cmlldmluZyB0aGUgc2xvcGU6DQpwcmludChyZWdyZXNzb3IuY29lZl8pDQoNCnlfcHJlZCA9IHJlZ3Jlc3Nvci5wcmVkaWN0KFhfdGVzdCkNCmRmID0gcGQuRGF0YUZyYW1lKHsnQWN0dWFsJzogeV90ZXN0LmZsYXR0ZW4oKSwgJ1ByZWRpY3RlZCc6IHlfcHJlZC5mbGF0dGVuKCl9KQ0KDQojUHJpbnQgb3V0IGdyYXBoaWMgb2YgcHJlZGljdGVkIHZzLiBhY3R1YWwgdmFsdWUgZm9yIHdhciBwb3RlbnRpYWwgZ3JhcGhpYy4gDQpwbHQuc2NhdHRlcihYX3Rlc3QsIHlfdGVzdCwgIGNvbG9yPSdncmF5JykNCnBsdC5wbG90KFhfdGVzdCwgeV9wcmVkLCBjb2xvcj0ncmVkJywgbGluZXdpZHRoPTIpDQpwbHQuc2hvdygpDQoNCmBgYA0KDQpXaGlsZSB0aG91Z2ggdGhlIHZhcmlhYmxlIChVUyBXYXIgUG90ZW50aWFsIGJ5IENJTkMgc2NvcmUpIG1ha2Ugc2Vuc2UgbG9naWNhbGx5LCB3aGVuIGl0IGlzIHBsb3R0ZWQgYWdhaW5zdCBDSU5DIGl0c2VsZiwgdGhlIHZhcmliYWxlIHN0YXJ0cyB0byBsb3NlIG1lYW5pbmcuIEl0IHRoZXJlZm9yZSBpcyBub3QgYSBnb29kIGluZGljYXRvciwgYWxvbmUsIGZvciBwcmVkaWN0aW5nIFVTIHdhciBwb3RlbnRpYWwuIFRoZXJlZm9yZSwgb3RoZXIgb3B0aW9ucyBmb3Igd2FyIHByZWRpY2l0b24gdmFyaWFibGVzIHNob3VsZCBmaXJzdCBiZSBleHBsb3JlZCBiZWZvcmUgdXNpbmcgdGhpcyBjcmFmdGVkIHZhcmlhYmxlIGFsb25lIHRvIG1lYXN1cmUgd2FyIGxpa2xpaG9vZCBiZXR3ZWVuIHRoZSBVbnRpZWQgU3RhdGVzIGFuZCBDaGluYS4NCg==