1.0 Introduction
Much has been written about China’s activities in Africa [1, 2, 3, 4, 5, 6, 7, 8, 9], and it really seems that China is investing in some gargantuan projects in several African countries, so I thought it would be interesting to see what people in Africa itself thought of China. Afrobarometer periodically polls people from many African countries on a wide variety of topics. I took the data from their 2016 survey, focused on the questions pertaining to Africans’ views on China, and created a macro-enabled Excel spreadsheet that plots a pivot chart given a country and survey question.
2.0 User Form
The user form is invoked when the workbook is opened:
Private Sub Workbook_Open()
RunForm
End Sub
or when the button on the spreadsheet is pressed:
The poll questions pertaining to China are Q81A through Q81E.
Q81A: How much influence do you think China’s economic activities in our country have on our economy, or haven’t you heard enough to say?
Q81B: In general, do you think that China’s economic and political influence on our country is mostly positive, or mostly negative, or haven’t you heard enough to say?
Q81C: Which of the following factors contributes most to the positive image of China in our country, or haven’t you heard enough to say?
Q81D: Which of the following factors contributes most to the negative image of China in our country, or haven’t you heard enough to say?
Q81E: In your opinion, China’s economic assistance to our country do a good job or bad job of meeting the country’s needs, or haven’t you heard enough to say?
Once the Go button is clicked, the main macro, CreatePivotTable, which generates the pivot table and the pivot chart, is run, after which the user form is unloaded.
Private Sub Go_Click()
CreatePivotTable
Unload CountryName
End Sub
2.1 Populating the user forms
The user form code populates the form with the countries and questions and displays the form:
Sub RunForm()
PopulateComboBox1
PopulateComboBox2
CountryName.Show
End Sub
The combo boxes are the dropdown menus that allow the users to select the country and the question.
Here is the code used to populate the combo box. The data is in a worksheet named “afrobarometer_2015_Q81”, which is kept hidden from the user.
Sub PopulateComboBox1()
Dim data(), unique As Variant, r As Long
Dim key As Variant
data = Range("afrobarometer_2015_Q81!B2:B52642").Value
Set unique = CreateObject("Scripting.Dictionary")
For r = 1 To UBound(data)
unique(data(r, 1)) = Empty
Next r
For Each key In unique.keys
CountryName.ComboBox1.AddItem key
Next key
End Sub
Let’s unpack that block of code a bit. data()
is an array of all the names of the countries in the poll, which are in the “B” column of the dataset. There were over 50,000 total interviews, so data()
has over 50,000 elements in it. We only want the unique names of the 36 countries in which the poll was carried out. We can do it by putting all the values of data()
in a (scripting) dictionary, and setting all their values to Empty
. Since keys are unique in dictionaries, this will effectively extract the unique names of the countries. The dictionary entries will look like {"Algeria": "", "Burundi": "", "Benin": "", ...}
. Then we simply iterate over the dictionary’s keys to populate the combo box.
To populate the poll questions combo box:
we can use less computationally onerous code since we already know the 5 questions are “Q81A” through “Q81E”. We put the 5 questions in a string array and use it to populate the second combo box:
Sub PopulateComboBox2()
Dim questions() As String, Question As Variant, idx As Integer
questions = Split("Q81A,Q81B,Q81C,Q81D,Q81E", ",")
For idx = 0 To UBound(questions)
CountryName.ComboBox2.AddItem questions(idx)
Next idx
End Sub
3.0 Pivot Table
Our main outcome is a pivot chart, so we need to create a pivot table first. To create the table, we need to first create something called a Pivot Cache, and then use the CreatePivotTable
method of the Pivot Cache to create the pivot table.
Dim sht As Worksheet
Dim pvtCache As PivotCache
Dim pvt As PivotTable
SrcData = "afrobarometer_2015_Q81!R1C2:R52642C7"
Set sht = Sheets.Add
sht.Name = "Pivot"
sht.Select
Set pvtCache = tWB.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=SrcData)
Set pvt = pvtCache.CreatePivotTable(TableDestination:=Cells(3, 1), TableName:="PivotTable1")
So far we have an empty pivot table. We want to put the countries in the Rows of the table, and the questions’ answers in the Columns. So if the user were to select “Q81A” and “Algeria” as the question and country, the table would look like this:
And yes, we also want the table items to be given as a percentage of a row’s total. For example, what percentage of Algerians responded “Some” to question “Q81A”.
Dim ThisQuestion As String
ThisQuestion = CountryName.ComboBox2.Value
pvt.PivotFields("COUNTRY").Orientation = xlRowField
pvt.AddDataField pvt.PivotFields(ThisQuestion), "Percentage", xlCount
pvt.PivotFields(ThisQuestion).Orientation = xlColumnField
So now we have populated the pivot table, but the values in it are still counts (xlCount). To change them to percentages:
With sht.PivotTables("PivotTable1").PivotFields("Percentage")
.Calculation = xlPercentOfRow
.NumberFormat = "0.00%"
End With
So now we have the pivot table populated the way we want it…almost. We have it populated with all the countries, We want to filter it so it only includes the country the user picked on the form. We start by assigning the pivot table’s Rows field, which is the list of all the countries, to an array, using the DataRange
property. Then we iterate over the array and make invisible all Rows on the pivot table except the one corresponding to the country the user picked on the form.
Dim countries As Variant
Dim ThisCountry As String
Dim i As Integer, ArrayLength As Integer
countries = pvt.PivotFields("Country").DataRange
ThisCountry = CountryName.ComboBox1.Value
ArrayLength = UBound(countries)
For i = 1 To ArrayLength
If countries(i, 1) <> ThisCountry Then
pvt.PivotFields("COUNTRY").PivotItems(countries(i, 1)).Visible = False
End If
Next i
Now we are ready to create the pivot chart!
4.0 Pivot Chart
We start by adding the chart to the worksheet and stating its data source, which will be the (filtered) pivot table just created:
ActiveSheet.Shapes.AddChart2(201, xlColumnClustered).Select
ActiveChart.SetSourceData Source:=pvt.DataBodyRange
Then we can customize the pivot chart. Most of these I found by recording mini-macros and taking a look at the macro’s VBA code. We start by removing some of the buttons Excel displays on the chart by default, which we don’t need and make the chart look cluttered.
ActiveChart.ShowValueFieldButtons = False
ActiveChart.ShowLegendFieldButtons = False
Then we remove the gridlines and the x-axis (xlCategory), which don’t really improve the chart.
ActiveChart.Axes(xlValue).MajorGridlines.Select
Selection.Delete
ActiveChart.Axes(xlCategory).Select
Selection.Format.Line.Visible = msoFalse
Then we formatthe tick marks of the x-axis (xlCategory), the y-axis (xlValue), and set the title of the yet untitled chart to bold. Finally, we put the chart on its own worksheet, called “Chart”, and do a virtual press of the Escape key so the chart isn’t selected when the user looks at it.
ActiveChart.Axes(xlCategory).TickLabels.Font.Bold = msoTrue
ActiveChart.Axes(xlCategory).TickLabels.Font.Size = 14
ActiveChart.Axes(xlValue).TickLabels.Font.Size = 14
ActiveChart.Axes(xlValue).TickLabels.NumberFormat = "0%"
ActiveChart.HasTitle = True
ActiveChart.ChartTitle.Font.Bold = True
ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="Chart"
Now let’s title the chart.
Select Case ThisQuestion
Case "Q81A"
PivotChartTitle = "How much influence do you think China's economic activities in your country" & _
" have on our economy, or haven't you heard enough to say?"
Case "Q81B"
PivotChartTitle = "In general, do you think that China's economic and political influence in your country" & _
" is mostly positive, or mostly negative, or haven't you heard enough to say?"
Case "Q81C"
PivotChartTitle = "Which of the following factors contributes most to the positive image of China in your country" & _
", or haven't you heard enough to say?"
Case "Q81D"
PivotChartTitle = "Which of the following factors contributes most to the negative image of China in your country" & _
", or haven't you heard enough to say?"
Case "Q81E"
PivotChartTitle = "In your opinion, does China's economic assistance to your country" & _
" do a good job or a bad job of meeting the country's needs, or haven't you heard enough to say?"
End Select
ActiveChart.ChartTitle.Text = PivotChartTitle
Done! If the user had picked “Algeria” and “Q81A” on the form, the chart would look like this.
We still have the “country” filter button of the pivot chart available, in case the user wants to select a different country, or even more than one country.
So if the user had wanted to compare responses from “Algeria” and “Benin”, the chart would have looked like this:
Here are four countries. I think more than four is pushing it, unless one has a wide monitor.
5.0 Observations
We can take advantage of the pivot table to make some observations about the data, using conditional formatting.
5.1 On the degree of influence China’s economic activities
Q81A was:
How much influence do you think China’s economic activities in our country have on our economy, or haven’t you heard enough to say?
As might be expected, a large majority of those polled see China’s economic activities as having a large influence in their country’s economy.
In half of the countries, over 40% of respondents believe China’s economic activities have “a lot” of influence in their country’s economy.
In 21 countries, over 25% of respondents believe China’s activities have “some” influence.
In 10 countries, over 15% of respondents believe China’s activities have “a little” influence.
In 13 countries, most notably Burundi, São Tomé and Príncipe, Sierra Leone, and Uganda, over 15% of respondents don’t know the degree of influence of China’s activities in their country’s economy.
In only 2 countries did 10% or more of poll respondents said that China has no influence in their country’s economy.
Overall, over two thirds of those polled across Africa believe that China has some or a lot of influence in their country’s economy, while less than 5% believe it has none.
5.2 On whether China’s influence is positive or negative
Q81B was:
In general, do you think that China’s economic and political influence on our country is mostly positive, or mostly negative, or haven’t you heard enough to say?
The poll respondents across the continent seem to have a pretty good opinion about China’s economic and political influence in their country, and in very few countries did more than 25% of the respondents had a somewhat or very negative opinion on the matter.
In only one country, Ghana, did more than 25% of respondents express a “very negative”" opinion on China’s influence.
In only one country, Madgascar, did more than 25% of respondents take a “somewhat negative”" view on China’s influence (although Tunisia and Algeria are borderline).
In exactly half of the countries, 33% or more of people polled viewed China’s influence in a “somewhat positive” light.
In eleven countries, 33% of those polled view China’s influence as “very positive” in their country.
Very few respondents think China’s influence is “neither positive nor negative”.
A significant fraction (15% or more) of respondents in many countries haven’t formed an opinion yet.
Overall, over 60% of respondents across the continent have either a “somewhat positive” or “very positive” opinion of China’s influence, and only about 15% have a “somewhat negative” or “very negative” opinion.
5.3 On whether China’s economic assistance meets the country’s needs
Q81E was:
In your opinion, China’s economic assistance to our country do a good job or bad job of meeting the country’s needs, or haven’t you heard enough to say?
A majority of those polled take a positive view of China’s economic activities.
In almost half of the countries, 33% or more of respondents believe China’s activities do a “somewaht good job” of meeting the country’s needs, whereas in a dozen countries 25% or more of those polled believe it’s a “very good job”.
In every country with the exceptions of Ghana, Lesotho, and Malawi, less than 20% of those polled believe China’s activities do a “very bad job” of meeting their country’s needs.
Overall, about 54% of respondents across Africa believe China’s activities in their country do either a “somewhat good job” or a “very good job” of meeting their country’s needs, while about 20% of those polled take a negative view of those activities.
7.0 Appendix: Data cleaning and preparation using R
The data in the “afrobarometer_2015_Q81” worksheet was generated by taking the Afrobarometer original dataset and cleaning it a bit, using R. This section details that series of operations.
Loading SPSS data into R.
library(foreign)
afrobarometer_2015 <- read.spss("merged_r6_data_2016_36countries2.sav", to.data.frame = T, reencode = "UTF-8")
Question 81A munging
# Convert the column from a factor to a character vector
afrobarometer_2015$Q81A <- as.character(afrobarometer_2015$Q81A)
# Making "Don't know / Haven't heard enough" shorter
afrobarometer_2015$Q81A[afrobarometer_2015$Q81A == "Don't know / Haven't heard enough"] <- "Don't know"
# Deleting "Missing" and "Not Asked"
afrobarometer_2015 <- afrobarometer_2015[afrobarometer_2015$Q81A != "Missing",]
afrobarometer_2015 <- afrobarometer_2015[afrobarometer_2015$Q81A != "Not Asked in this Country",]
# Changing the column back to a factor so we can order the factors meaningfully
# for the purposes of plotting
afrobarometer_2015$Q81A <- as.factor(afrobarometer_2015$Q81A)
afrobarometer_2015$Q81A <- factor(afrobarometer_2015$Q81A, levels(afrobarometer_2015$Q81A)[c(4, 1, 5, 2, 3)])
table(afrobarometer_2015$Q81A)
None A little Some A lot Don't know
2342 6641 14623 21609 7495
library(ggplot2)
afrobarometer_Q81A_plot <- ggplot(data = afrobarometer_2015) + ggtitle("Q81A")
afrobarometer_Q81A_plot <- afrobarometer_Q81A_plot + geom_bar(aes(x = Q81A))
afrobarometer_Q81A_plot

Question 81B munging
# Convert the column from a factor to a character vector
afrobarometer_2015$Q81B <- as.character(afrobarometer_2015$Q81B)
# Making "Don't know / Haven't heard enough" shorter
afrobarometer_2015$Q81B[afrobarometer_2015$Q81B == "Don't know / Haven't heard enough"] <- "Don't know"
# Changing a few into "two-line" factors so they fit better in the plot
afrobarometer_2015$Q81B[afrobarometer_2015$Q81B == "Neither positive nor negative"] <- "Neither positive \n nor negative"
afrobarometer_2015$Q81B[afrobarometer_2015$Q81B == "Somewhat negative"] <- "Somewhat \n negative"
afrobarometer_2015$Q81B[afrobarometer_2015$Q81B == "Somewhat positive"] <- "Somewhat \n positive"
afrobarometer_2015$Q81B[afrobarometer_2015$Q81B == "Very negative"] <- "Very \n negative"
afrobarometer_2015$Q81B[afrobarometer_2015$Q81B == "Very positive"] <- "Very \n positive"
# Deleting "Missing" and "Not Asked"
afrobarometer_2015 <- afrobarometer_2015[afrobarometer_2015$Q81B != "Missing",]
afrobarometer_2015 <- afrobarometer_2015[afrobarometer_2015$Q81B != "Not Asked in this Country",]
# Changing the column back to a factor so we can order the factors meaningfully
# for the purposes of plotting
afrobarometer_2015$Q81B <- as.factor(afrobarometer_2015$Q81B)
afrobarometer_2015$Q81B <- factor(afrobarometer_2015$Q81B, levels(afrobarometer_2015$Q81B)[c(5, 3, 2, 4, 6, 1)])
table(afrobarometer_2015$Q81B)
Very \n negative Somewhat \n negative
3507 4707
Neither positive \n nor negative Somewhat \n positive
3962 18561
Very \n positive Don't know
14117 7841
afrobarometer_Q81B_plot <- ggplot(data = afrobarometer_2015) + ggtitle("Q81B")
afrobarometer_Q81B_plot <- afrobarometer_Q81B_plot + geom_bar(aes(x = Q81B))
afrobarometer_Q81B_plot

Question 81C munging
# Convert the column from a factor to a character vector
afrobarometer_2015$Q81C <- as.character(afrobarometer_2015$Q81C)
# Making "Don't know / Haven't heard enough" shorter
afrobarometer_2015$Q81C[afrobarometer_2015$Q81C == "Don't know / Haven't heard enough"] <- "Other, none of these\nor don't know"
afrobarometer_2015$Q81C[afrobarometer_2015$Q81C == "None of these"] <- "Other, none of these\nor don't know"
# Changing a few into "two-line" factors so they fit better in the plot
afrobarometer_2015$Q81C[afrobarometer_2015$Q81C == "China's support for the country in international affairs"] <- "China's support for the\ncountry in international affairs"
afrobarometer_2015$Q81C[afrobarometer_2015$Q81C == "Non-interference in the internal affairs of African countries"] <- "Non-interference in the internal\naffairs of African countries"
afrobarometer_2015$Q81C[afrobarometer_2015$Q81C == "China's investment in infrastructure in the country"] <- "China's investment in\ninfrastructure in the country"
afrobarometer_2015$Q81C[afrobarometer_2015$Q81C == "China's business investment"] <- "China's business \n investment"
afrobarometer_2015$Q81C[afrobarometer_2015$Q81C == "The quality or cost of Chinese products"] <- "The quality or cost\nof Chinese products"
afrobarometer_2015$Q81C[afrobarometer_2015$Q81C == "An appreciation of the Chinese people, culture and language"] <- "Other, none of these\nor don't know"
afrobarometer_2015$Q81C[afrobarometer_2015$Q81C == "Some other factor"] <- "Other, none of these\nor don't know"
# Deleting "Missing" and "Not Asked"
afrobarometer_2015 <- afrobarometer_2015[afrobarometer_2015$Q81C != "Missing",]
afrobarometer_2015 <- afrobarometer_2015[afrobarometer_2015$Q81C != "Not Asked in this Country",]
# Changing the column back to a factor so we can order the factors meaningfully
# for the purposes of plotting
afrobarometer_2015$Q81C <- as.factor(afrobarometer_2015$Q81C)
#afrobarometer_2015$Q81C <- factor(afrobarometer_2015$Q81C, levels(afrobarometer_2015$Q81C)[c(5, 3, 2, 4, 6, 1)])
table(afrobarometer_2015$Q81C)
China's business \n investment
8904
China's investment in\ninfrastructure in the country
15750
China's support for the\ncountry in international affairs
3238
Non-interference in the internal\naffairs of African countries
2331
Other, none of these\nor don't know
10509
The quality or cost\nof Chinese products
11952
afrobarometer_Q81C_plot <- ggplot(data = afrobarometer_2015) + ggtitle("Q81C")
afrobarometer_Q81C_plot <- afrobarometer_Q81C_plot + geom_bar(aes(x = Q81C)) + coord_flip()
afrobarometer_Q81C_plot

Question 81D munging
# Convert the column from a factor to a character vector
afrobarometer_2015$Q81D <- as.character(afrobarometer_2015$Q81D)
# Making "Don't know / Haven't heard enough" shorter
afrobarometer_2015$Q81D[afrobarometer_2015$Q81D == "Don't know / Haven't heard enough"] <- "Other, none of these\nor don't know"
afrobarometer_2015$Q81D[afrobarometer_2015$Q81D == "None of these"] <- "Other, none of these\nor don't know"
# Changing a few into "two-line" factors so they fit better in the plot
afrobarometer_2015$Q81D[afrobarometer_2015$Q81D == "China's extraction of resources from Africa"] <- "China's extraction of \n resources from Africa"
afrobarometer_2015$Q81D[afrobarometer_2015$Q81D == "Land grabbing by Chinese individuals or businesses"] <- "Land grabbing by Chinese\nindividuals or businesses"
afrobarometer_2015$Q81D[afrobarometer_2015$Q81D == "China's willingness to cooperate with undemocratic rulers"] <- "Other, none of these\nor don't know"
afrobarometer_2015$Q81D[afrobarometer_2015$Q81D == "Taking jobs or business from the locals"] <- "Taking jobs or business\nfrom the locals"
afrobarometer_2015$Q81D[afrobarometer_2015$Q81D == "The quality of Chinese products"] <- "The quality of \n Chinese products"
afrobarometer_2015$Q81D[afrobarometer_2015$Q81D == "The behavior of Chinese citizens in the country"] <- "The behavior of Chinese\ncitizens in the country"
afrobarometer_2015$Q81D[afrobarometer_2015$Q81D == "Some other factor"] <- "Other, none of these\nor don't know"
# Deleting "Missing" and "Not Asked"
afrobarometer_2015 <- afrobarometer_2015[afrobarometer_2015$Q81D != "Missing",]
afrobarometer_2015 <- afrobarometer_2015[afrobarometer_2015$Q81D != "Not Asked in this Country",]
# Changing the column back to a factor so we can order the factors meaningfully
# for the purposes of plotting
afrobarometer_2015$Q81D <- as.factor(afrobarometer_2015$Q81D)
#afrobarometer_2015$Q81D <- factor(afrobarometer_2015$Q81D, levels(afrobarometer_2015$Q81D)[c(1, 4, 7, 8, 9, 2, 6, 5, 3)])
table(afrobarometer_2015$Q81D)
China's extraction of \n resources from Africa
5582
Land grabbing by Chinese\nindividuals or businesses
3790
Other, none of these\nor don't know
14156
Taking jobs or business\nfrom the locals
7280
The behavior of Chinese\ncitizens in the country
3005
The quality of \n Chinese products
18859
afrobarometer_Q81D_plot <- ggplot(data = afrobarometer_2015) + ggtitle("Q81D")
afrobarometer_Q81D_plot <- afrobarometer_Q81D_plot + geom_bar(aes(x = Q81D)) + coord_flip()
afrobarometer_Q81D_plot

Question 81E munging
# Convert the column from a factor to a character vector
afrobarometer_2015$Q81E <- as.character(afrobarometer_2015$Q81E)
# Making "Don't know / Haven't heard enough" shorter
afrobarometer_2015$Q81E[afrobarometer_2015$Q81E == "Don't know / Haven't heard enough"] <- "Other or\ndon't know"
# Changing a few into "two-line" factors so they fit better in the plot
afrobarometer_2015$Q81E[afrobarometer_2015$Q81E == "Very bad job"] <- "Very \n bad job"
afrobarometer_2015$Q81E[afrobarometer_2015$Q81E == "Somewhat bad job"] <- "Somewhat \n bad job"
afrobarometer_2015$Q81E[afrobarometer_2015$Q81E == "Neither good nor bad job"] <- "Neither good \n nor bad job"
afrobarometer_2015$Q81E[afrobarometer_2015$Q81E == "Somewhat good job"] <- "Somewhat \n good job"
afrobarometer_2015$Q81E[afrobarometer_2015$Q81E == "Very good job"] <- "Very \n good job"
afrobarometer_2015$Q81E[afrobarometer_2015$Q81E == "China doesn't give development assistance to the country"] <- "Other or\ndon't know"
# Deleting "Missing" and "Not Asked"
afrobarometer_2015 <- afrobarometer_2015[afrobarometer_2015$Q81E != "Missing",]
afrobarometer_2015 <- afrobarometer_2015[afrobarometer_2015$Q81E != "Not Asked in this Country",]
afrobarometer_2015 <- afrobarometer_2015[afrobarometer_2015$Q81E != "Refused",]
# Changing the column back to a factor so we can order the factors meaningfully
# for the purposes of plotting
afrobarometer_2015$Q81E <- as.factor(afrobarometer_2015$Q81E)
#afrobarometer_2015$Q81C <- factor(afrobarometer_2015$Q81C, levels(afrobarometer_2015$Q81C)[c(5, 3, 2, 4, 6, 1)])
table(afrobarometer_2015$Q81E)
Neither good \n nor bad job Other or\ndon't know Somewhat \n bad job
4507 9161 6417
Somewhat \n good job Very \n bad job Very \n good job
17592 4038 10926
afrobarometer_Q81E_plot <- ggplot(data = afrobarometer_2015) + ggtitle("Q81E")
afrobarometer_Q81E_plot <- afrobarometer_Q81E_plot + geom_bar(aes(x = Q81E)) + coord_flip()
afrobarometer_Q81E_plot

table(afrobarometer_2015$COUNTRY)
Algeria Benin Botswana Burkina Faso
1200 1199 1199 1200
Burundi Cameroon Cape Verde Cote d'Ivoire
1200 1173 1191 1199
Egypt Gabon Ghana Guinea
1195 1198 2378 1200
Kenya Lesotho Liberia Madagascar
2397 1200 1197 1200
Malawi Mali Mauritius Morocco
2399 1200 1200 1200
Mozambique Namibia Niger Nigeria
2400 1200 1197 2399
São Tomé and Príncipe Senegal Sierra Leone South Africa
1176 1199 1189 2389
Sudan Swaziland Tanzania Togo
1188 0 2386 1198
Tunisia Uganda Zambia Zimbabwe
1200 2400 1198 2397
# Renaming "Cote d'Ivoire" to "Côte d'Ivoire"
afrobarometer_2015$COUNTRY <- as.character(afrobarometer_2015$COUNTRY)
afrobarometer_2015$COUNTRY[afrobarometer_2015$COUNTRY == "Cote d'Ivoire"] <- "Côte d'Ivoire"
table(afrobarometer_2015$COUNTRY)
Algeria Benin Botswana Burkina Faso
1200 1199 1199 1200
Burundi Cameroon Cape Verde Côte d'Ivoire
1200 1173 1191 1199
Egypt Gabon Ghana Guinea
1195 1198 2378 1200
Kenya Lesotho Liberia Madagascar
2397 1200 1197 1200
Malawi Mali Mauritius Morocco
2399 1200 1200 1200
Mozambique Namibia Niger Nigeria
2400 1200 1197 2399
São Tomé and Príncipe Senegal Sierra Leone South Africa
1176 1199 1189 2389
Sudan Tanzania Togo Tunisia
1188 2386 1198 1200
Uganda Zambia Zimbabwe
2400 1198 2397
Scoring the answers for later use in a choropleth map
# "Scoring" Q81A answers
Q81A_score_function <- function(answer) {switch(answer, "None" = -2, "A little" = -1, "Some" = 1, "A lot" = 2, "Don't know" = 0)}
afrobarometer_2015$Q81A_score <- sapply(as.character(afrobarometer_2015$Q81A), Q81A_score_function) #Applying Q81_score_function to Q81A vector
# "Scoring" Q81B answers
Q81B_score_function <- function(answer) {switch(answer, "Very \n negative" = -2, "Somewhat \n negative" = -1, "Somewhat \n positive" = 1, "Very \n positive" = 2, "Don't know" = 0, "Neither positive \n nor negative" = 0)}
afrobarometer_2015$Q81B_score <- sapply(as.character(afrobarometer_2015$Q81B), Q81B_score_function) #Applying Q81_score_function to Q81A vector
# "Scoring" Q81E answers
Q81E_score_function <- function(answer) {switch(answer, "Very \n bad job" = -2, "Somewhat \n bad job" = -1, "Somewhat \n good job" = 1, "Very \n good job" = 2, "Other or\ndon't know" = 0, "Neither good \n nor bad job" = 0)}
afrobarometer_2015$Q81E_score <- sapply(as.character(afrobarometer_2015$Q81E), Q81E_score_function) #Applying Q81_score_function to Q81E vector
Writing to csv
write.csv(afrobarometer_2015[, c("COUNTRY", "Q81A", "Q81B", "Q81C", "Q81D", "Q81E", "Q81A_score", "Q81B_score", "Q81E_score")], file = "afrobarometer_2015_Q81.csv", fileEncoding = "UTF-8")
LS0tDQp0aXRsZTogIkV4cGxvcmluZyBBZnJpY2Fucycgdmlld3Mgb24gQ2hpbmEgdXNpbmcgRXhjZWwgVkJBIg0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCi0tLQ0KDQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KDQpib2R5LCB0ZCB7DQogICBmb250LXNpemU6IDE4cHg7DQp9DQpoMSB7DQogIGZvbnQtc2l6ZTogMzJweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQp9DQpoMiB7DQogIGZvbnQtc2l6ZTogMjhweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQp9DQpoMyB7DQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQp9DQpoNCB7DQogIGZvbnQtc2l6ZTogMjBweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQp9DQpjb2RlLnJ7DQogIGZvbnQtc2l6ZTogMTZweDsNCn0NCnByZSB7DQogIGZvbnQtc2l6ZTogMTZweA0KfQ0KPC9zdHlsZT4NCg0KIyMgMS4wIEludHJvZHVjdGlvbg0KDQpNdWNoIGhhcyBiZWVuIHdyaXR0ZW4gYWJvdXQgQ2hpbmEncyBhY3Rpdml0aWVzIGluIEFmcmljYSBbWyoqMSoqXShodHRwczovL3d3dy5hbWF6b24uY29tL0NoaW5hcy1TZWNvbmQtQ29udGluZW50LU1pZ3JhbnRzLUJ1aWxkaW5nLWVib29rL2RwL0IwMEdWWlZCOVcpLCBbKioyKipdKGh0dHBzOi8vd3d3LmFtYXpvbi5jb20vTmV4dC1GYWN0b3J5LVdvcmxkLUludmVzdG1lbnQtUmVzaGFwaW5nLWVib29rL2RwL0IwMU1VR1lDTUUpLCBbKiozKipdKGh0dHBzOi8vd3d3LmFtYXpvbi5jb20vRHJhZ29ucy1HaWZ0LVN0b3J5LUNoaW5hLUFmcmljYS1lYm9vay9kcC9CMDA1UFVXUk00KSwgWyoqNCoqXShodHRwczovL3d3dy5hbWF6b24uY29tL1dpbGwtQWZyaWNhLUNoaW5hLURlYm9yYWgtQnJhdXRpZ2FtLWVib29rL2RwL0IwMTQ2WTlUTkUpLCBbKio1KipdKGh0dHA6Ly93d3cubGF0aW1lcy5jb20vd29ybGQvYXNpYS9sYS1mZy1jaGluYS1hZnJpY2EtZXRoaW9waWEtMjAxNzA4MDQtaHRtbHN0b3J5Lmh0bWwpLCBbKio2KipdKGh0dHBzOi8vd3d3Lm5wci5vcmcvMjAxMS8wNi8yMS8xMzcxODUwNDgvd2lsbC1rZW55YW4tc3VwZXJoaWdod2F5LWFsc28tYmVuZWZpdC1jaGluYSksIFsqKjcqKl0oaHR0cDovL2NoaW5hYWZyaWNhYmxvZy5jb20vKSwgWyoqOCoqXShodHRwOi8vd3d3LmNoaW5hYWZyaWNhLXBvZGNhc3QuY29tLyksIFsqKjkqKl0oaHR0cDovL3d3dy5jaGluYWFmcmljYXJlYWxzdG9yeS5jb20vKV0sIGFuZCBpdCByZWFsbHkgc2VlbXMgdGhhdCBDaGluYSBpcyBpbnZlc3RpbmcgaW4gc29tZSBnYXJnYW50dWFuIHByb2plY3RzIGluIHNldmVyYWwgQWZyaWNhbiBjb3VudHJpZXMsIHNvIEkgdGhvdWdodCBpdCB3b3VsZCBiZSBpbnRlcmVzdGluZyB0byBzZWUgd2hhdCBwZW9wbGUgaW4gQWZyaWNhIGl0c2VsZiB0aG91Z2h0IG9mIENoaW5hLiBbQWZyb2Jhcm9tZXRlcl0oaHR0cDovL3d3dy5hZnJvYmFyb21ldGVyLm9yZy9kYXRhL21lcmdlZC1kYXRhKSBwZXJpb2RpY2FsbHkgcG9sbHMgcGVvcGxlIGZyb20gbWFueSBBZnJpY2FuIGNvdW50cmllcyBvbiBhIHdpZGUgdmFyaWV0eSBvZiB0b3BpY3MuIEkgdG9vayB0aGUgZGF0YSBmcm9tIHRoZWlyIFsyMDE2IHN1cnZleV0oaHR0cDovL2Fmcm9iYXJvbWV0ZXIub3JnL2RhdGEvbWVyZ2VkLXJvdW5kLTYtZGF0YS0zNi1jb3VudHJpZXMtMjAxNiksIGZvY3VzZWQgb24gdGhlIHF1ZXN0aW9ucyBwZXJ0YWluaW5nIHRvIEFmcmljYW5zJyB2aWV3cyBvbiBDaGluYSwgYW5kIGNyZWF0ZWQgYSBtYWNyby1lbmFibGVkIEV4Y2VsIHNwcmVhZHNoZWV0IHRoYXQgcGxvdHMgYSBbcGl2b3QgY2hhcnRdKGh0dHBzOi8vd3d3LmV4Y2VsLWVhc3kuY29tL2V4YW1wbGVzL3Bpdm90LWNoYXJ0Lmh0bWwpIGdpdmVuIGEgY291bnRyeSBhbmQgc3VydmV5IHF1ZXN0aW9uLg0KDQojIyAyLjAgVXNlciBGb3JtDQoNClRoZSB1c2VyIGZvcm0gaXMgaW52b2tlZCB3aGVuIHRoZSB3b3JrYm9vayBpcyBvcGVuZWQ6DQoNCmBgYHtyIGV2YWwgPSBGQUxTRX0NClByaXZhdGUgU3ViIFdvcmtib29rX09wZW4oKQ0KUnVuRm9ybQ0KRW5kIFN1Yg0KYGBgDQo8YnI+DQoNCiFbXSh1c2VyZm9ybS5wbmcgIlVzZXIgRm9ybSIpDQo8YnI+DQoNCm9yIHdoZW4gdGhlIGJ1dHRvbiBvbiB0aGUgc3ByZWFkc2hlZXQgaXMgcHJlc3NlZDoNCg0KIVtdKHVzZXJmb3JtX2J1dHRvbi5wbmcgIlVzZXIgRm9ybSBCdXR0b24iKQ0KPGJyPg0KDQpUaGUgcG9sbCBxdWVzdGlvbnMgcGVydGFpbmluZyB0byBDaGluYSBhcmUgUTgxQSB0aHJvdWdoIFE4MUUuDQoNCi0gKipRODFBKio6IEhvdyBtdWNoIGluZmx1ZW5jZSBkbyB5b3UgdGhpbmsgQ2hpbmEncyBlY29ub21pYyBhY3Rpdml0aWVzIGluIG91ciBjb3VudHJ5IGhhdmUgb24gb3VyIGVjb25vbXksIG9yIGhhdmVuJ3QgeW91IGhlYXJkIGVub3VnaCB0byBzYXk/DQoNCi0gKipRODFCKio6IEluIGdlbmVyYWwsIGRvIHlvdSB0aGluayB0aGF0IENoaW5hJ3MgZWNvbm9taWMgYW5kIHBvbGl0aWNhbCBpbmZsdWVuY2Ugb24gb3VyIGNvdW50cnkgaXMgbW9zdGx5IHBvc2l0aXZlLCBvciBtb3N0bHkgbmVnYXRpdmUsIG9yIGhhdmVuJ3QgeW91IGhlYXJkIGVub3VnaCB0byBzYXk/DQoNCi0gKipRODFDKio6IFdoaWNoIG9mIHRoZSBmb2xsb3dpbmcgZmFjdG9ycyBjb250cmlidXRlcyBtb3N0IHRvIHRoZSBwb3NpdGl2ZSBpbWFnZSBvZiBDaGluYSBpbiBvdXIgY291bnRyeSwgb3IgaGF2ZW4ndCB5b3UgaGVhcmQgZW5vdWdoIHRvIHNheT8NCg0KLSAqKlE4MUQqKjogV2hpY2ggb2YgdGhlIGZvbGxvd2luZyBmYWN0b3JzIGNvbnRyaWJ1dGVzIG1vc3QgdG8gdGhlIG5lZ2F0aXZlIGltYWdlIG9mIENoaW5hIGluIG91ciBjb3VudHJ5LCBvciBoYXZlbid0IHlvdSBoZWFyZCBlbm91Z2ggdG8gc2F5Pw0KDQotICoqUTgxRSoqOiBJbiB5b3VyIG9waW5pb24sIENoaW5hJ3MgZWNvbm9taWMgYXNzaXN0YW5jZSB0byBvdXIgY291bnRyeSBkbyBhIGdvb2Qgam9iIG9yIGJhZCBqb2Igb2YgbWVldGluZyB0aGUgY291bnRyeSdzIG5lZWRzLCBvciBoYXZlbid0IHlvdSBoZWFyZCBlbm91Z2ggdG8gc2F5Pw0KDQpPbmNlIHRoZSAqKkdvKiogYnV0dG9uIGlzIGNsaWNrZWQsIHRoZSBtYWluIG1hY3JvLCAqKkNyZWF0ZVBpdm90VGFibGUqKiwgd2hpY2ggZ2VuZXJhdGVzIHRoZSBwaXZvdCB0YWJsZSBhbmQgdGhlIHBpdm90IGNoYXJ0LCBpcyBydW4sIGFmdGVyIHdoaWNoIHRoZSB1c2VyIGZvcm0gaXMgdW5sb2FkZWQuDQoNCmBgYHtyIGV2YWwgPSBGQUxTRX0NClByaXZhdGUgU3ViIEdvX0NsaWNrKCkNCkNyZWF0ZVBpdm90VGFibGUNClVubG9hZCBDb3VudHJ5TmFtZQ0KRW5kIFN1Yg0KYGBgDQo8YnI+DQoNCg0KIyMjIDIuMSBQb3B1bGF0aW5nIHRoZSB1c2VyIGZvcm1zDQoNClRoZSB1c2VyIGZvcm0gY29kZSBwb3B1bGF0ZXMgdGhlIGZvcm0gd2l0aCB0aGUgY291bnRyaWVzIGFuZCBxdWVzdGlvbnMgYW5kIGRpc3BsYXlzIHRoZSBmb3JtOg0KDQpgYGB7ciBldmFsID0gRkFMU0V9DQpTdWIgUnVuRm9ybSgpDQoNClBvcHVsYXRlQ29tYm9Cb3gxDQpQb3B1bGF0ZUNvbWJvQm94Mg0KQ291bnRyeU5hbWUuU2hvdw0KDQpFbmQgU3ViDQpgYGANCjxicj4NCg0KVGhlIFtjb21ibyBib3hlc10oaHR0cHM6Ly93d3cuZXhjZWwtZWFzeS5jb20vdmJhL2V4YW1wbGVzL2NvbWJvLWJveC5odG1sKSBhcmUgdGhlIGRyb3Bkb3duIG1lbnVzIHRoYXQgYWxsb3cgdGhlIHVzZXJzIHRvIHNlbGVjdCB0aGUgY291bnRyeSBhbmQgdGhlIHF1ZXN0aW9uLg0KDQohW10odXNlcmZvcm1fY29tYm9ib3gucG5nICJjb21ibyBib3giKQ0KPGJyPg0KDQpIZXJlIGlzIHRoZSBjb2RlIHVzZWQgdG8gcG9wdWxhdGUgdGhlIGNvbWJvIGJveC4gVGhlIGRhdGEgaXMgaW4gYSB3b3Jrc2hlZXQgbmFtZWQgImFmcm9iYXJvbWV0ZXJfMjAxNV9RODEiLCB3aGljaCBpcyBrZXB0IGhpZGRlbiBmcm9tIHRoZSB1c2VyLg0KYGBge3IgZXZhbCA9IEZBTFNFfQ0KU3ViIFBvcHVsYXRlQ29tYm9Cb3gxKCkNCg0KRGltIGRhdGEoKSwgdW5pcXVlIEFzIFZhcmlhbnQsIHIgQXMgTG9uZw0KRGltIGtleSBBcyBWYXJpYW50DQpkYXRhID0gUmFuZ2UoImFmcm9iYXJvbWV0ZXJfMjAxNV9RODEhQjI6QjUyNjQyIikuVmFsdWUNCg0KU2V0IHVuaXF1ZSA9IENyZWF0ZU9iamVjdCgiU2NyaXB0aW5nLkRpY3Rpb25hcnkiKQ0KRm9yIHIgPSAxIFRvIFVCb3VuZChkYXRhKQ0KICAgIHVuaXF1ZShkYXRhKHIsIDEpKSA9IEVtcHR5DQpOZXh0IHINCg0KRm9yIEVhY2gga2V5IEluIHVuaXF1ZS5rZXlzDQogICAgQ291bnRyeU5hbWUuQ29tYm9Cb3gxLkFkZEl0ZW0ga2V5DQpOZXh0IGtleQ0KDQpFbmQgU3ViDQpgYGANCjxicj4NCg0KTGV0J3MgdW5wYWNrIHRoYXQgYmxvY2sgb2YgY29kZSBhIGJpdC4gYGRhdGEoKWAgaXMgYW4gYXJyYXkgb2YgYWxsIHRoZSBuYW1lcyBvZiB0aGUgY291bnRyaWVzIGluIHRoZSBwb2xsLCB3aGljaCBhcmUgaW4gdGhlICJCIiBjb2x1bW4gb2YgdGhlIGRhdGFzZXQuIFRoZXJlIHdlcmUgb3ZlciA1MCwwMDAgdG90YWwgaW50ZXJ2aWV3cywgc28gYGRhdGEoKWAgaGFzIG92ZXIgNTAsMDAwIGVsZW1lbnRzIGluIGl0LiBXZSBvbmx5IHdhbnQgdGhlIHVuaXF1ZSBuYW1lcyBvZiB0aGUgMzYgY291bnRyaWVzIGluIHdoaWNoIHRoZSBwb2xsIHdhcyBjYXJyaWVkIG91dC4gV2UgY2FuIGRvIGl0IGJ5IFtwdXR0aW5nIGFsbCB0aGUgdmFsdWVzIG9mIGBkYXRhKClgIGluIGEgKHNjcmlwdGluZykgZGljdGlvbmFyeV0oaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzYwNDQ1NTYvcXVpY2tlci13YXktdG8tZ2V0LWFsbC11bmlxdWUtdmFsdWVzLW9mLWEtY29sdW1uLWluLXZiYSksIGFuZCBzZXR0aW5nIGFsbCB0aGVpciB2YWx1ZXMgdG8gYEVtcHR5YC4gU2luY2Uga2V5cyBhcmUgdW5pcXVlIGluIGRpY3Rpb25hcmllcywgdGhpcyB3aWxsIGVmZmVjdGl2ZWx5IGV4dHJhY3QgdGhlIHVuaXF1ZSBuYW1lcyBvZiB0aGUgY291bnRyaWVzLiBUaGUgZGljdGlvbmFyeSBlbnRyaWVzIHdpbGwgbG9vayBsaWtlIGB7IkFsZ2VyaWEiOiAiIiwgIkJ1cnVuZGkiOiAiIiwgIkJlbmluIjogIiIsIC4uLn1gLiBUaGVuIHdlIHNpbXBseSBpdGVyYXRlIG92ZXIgdGhlIGRpY3Rpb25hcnkncyBrZXlzIHRvIHBvcHVsYXRlIHRoZSBjb21ibyBib3guDQoNClRvIHBvcHVsYXRlIHRoZSBwb2xsIHF1ZXN0aW9ucyBjb21ibyBib3g6DQoNCiFbXSh1c2VyZm9ybV9jb21ib2JveDIucG5nICJjb21ibyBib3giKQ0KPGJyPg0KDQp3ZSBjYW4gdXNlIGxlc3MgY29tcHV0YXRpb25hbGx5IG9uZXJvdXMgY29kZSBzaW5jZSB3ZSBhbHJlYWR5IGtub3cgdGhlIDUgcXVlc3Rpb25zIGFyZSAiUTgxQSIgdGhyb3VnaCAiUTgxRSIuIFdlIHB1dCB0aGUgNSBxdWVzdGlvbnMgaW4gYSBzdHJpbmcgYXJyYXkgYW5kIHVzZSBpdCB0byBwb3B1bGF0ZSB0aGUgc2Vjb25kIGNvbWJvIGJveDoNCg0KYGBge3IgZXZhbCA9IEZBTFNFfQ0KU3ViIFBvcHVsYXRlQ29tYm9Cb3gyKCkNCg0KRGltIHF1ZXN0aW9ucygpIEFzIFN0cmluZywgUXVlc3Rpb24gQXMgVmFyaWFudCwgaWR4IEFzIEludGVnZXINCnF1ZXN0aW9ucyA9IFNwbGl0KCJRODFBLFE4MUIsUTgxQyxRODFELFE4MUUiLCAiLCIpDQpGb3IgaWR4ID0gMCBUbyBVQm91bmQocXVlc3Rpb25zKQ0KICAgIENvdW50cnlOYW1lLkNvbWJvQm94Mi5BZGRJdGVtIHF1ZXN0aW9ucyhpZHgpDQpOZXh0IGlkeA0KDQpFbmQgU3ViDQpgYGANCg0KDQojIyAzLjAgUGl2b3QgVGFibGUNCg0KT3VyIG1haW4gb3V0Y29tZSBpcyBhIHBpdm90IGNoYXJ0LCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHBpdm90IHRhYmxlIGZpcnN0LiBUbyBjcmVhdGUgdGhlIHRhYmxlLCB3ZSBuZWVkIHRvIGZpcnN0IGNyZWF0ZSBzb21ldGhpbmcgY2FsbGVkIGEgW1Bpdm90IENhY2hlXShodHRwczovL3d3dy50aGVzcHJlYWRzaGVldGd1cnUuY29tL2Jsb2cvMjAxNC85LzI3L3ZiYS1ndWlkZS1leGNlbC1waXZvdC10YWJsZXMpLCBhbmQgdGhlbiB1c2UgdGhlIFtgQ3JlYXRlUGl2b3RUYWJsZWBdKGh0dHBzOi8vd3d3LnRoZXNwcmVhZHNoZWV0Z3VydS5jb20vYmxvZy8yMDE0LzkvMjcvdmJhLWd1aWRlLWV4Y2VsLXBpdm90LXRhYmxlcykgbWV0aG9kIG9mIHRoZSBQaXZvdCBDYWNoZSB0byBjcmVhdGUgdGhlIHBpdm90IHRhYmxlLg0KDQpgYGB7ciBldmFsID0gRkFMU0V9DQpEaW0gc2h0IEFzIFdvcmtzaGVldA0KRGltIHB2dENhY2hlIEFzIFBpdm90Q2FjaGUNCkRpbSBwdnQgQXMgUGl2b3RUYWJsZQ0KDQpTcmNEYXRhID0gImFmcm9iYXJvbWV0ZXJfMjAxNV9RODEhUjFDMjpSNTI2NDJDNyINCg0KU2V0IHNodCA9IFNoZWV0cy5BZGQNCnNodC5OYW1lID0gIlBpdm90Ig0Kc2h0LlNlbGVjdA0KDQpTZXQgcHZ0Q2FjaGUgPSB0V0IuUGl2b3RDYWNoZXMuQ3JlYXRlKFNvdXJjZVR5cGU6PXhsRGF0YWJhc2UsIFNvdXJjZURhdGE6PVNyY0RhdGEpDQoNClNldCBwdnQgPSBwdnRDYWNoZS5DcmVhdGVQaXZvdFRhYmxlKFRhYmxlRGVzdGluYXRpb246PUNlbGxzKDMsIDEpLCBUYWJsZU5hbWU6PSJQaXZvdFRhYmxlMSIpDQpgYGANCjxicj4NCg0KU28gZmFyIHdlIGhhdmUgYW4gZW1wdHkgcGl2b3QgdGFibGUuIFdlIHdhbnQgdG8gcHV0IHRoZSBjb3VudHJpZXMgaW4gdGhlIFJvd3Mgb2YgdGhlIHRhYmxlLCBhbmQgdGhlIHF1ZXN0aW9ucycgYW5zd2VycyBpbiB0aGUgQ29sdW1ucy4gU28gaWYgdGhlIHVzZXIgd2VyZSB0byBzZWxlY3QgIlE4MUEiIGFuZCAiQWxnZXJpYSIgYXMgdGhlIHF1ZXN0aW9uIGFuZCBjb3VudHJ5LCB0aGUgdGFibGUgd291bGQgbG9vayBsaWtlIHRoaXM6DQoNCiFbXShwaXZvdF90YWJsZV9BbGdlcmlhX1E4MUEucG5nICJwaXZvdCB0YWJsZSIpDQoNCjxicj4NCg0KQW5kIHllcywgd2UgYWxzbyB3YW50IHRoZSB0YWJsZSBpdGVtcyB0byBiZSBnaXZlbiBhcyBhIHBlcmNlbnRhZ2Ugb2YgYSByb3cncyB0b3RhbC4gRm9yIGV4YW1wbGUsIHdoYXQgcGVyY2VudGFnZSBvZiBBbGdlcmlhbnMgcmVzcG9uZGVkICJTb21lIiB0byBxdWVzdGlvbiAiUTgxQSIuDQoNCmBgYHtyIGV2YWwgPSBGQUxTRX0NCkRpbSBUaGlzUXVlc3Rpb24gQXMgU3RyaW5nDQoNClRoaXNRdWVzdGlvbiA9IENvdW50cnlOYW1lLkNvbWJvQm94Mi5WYWx1ZQ0KDQpwdnQuUGl2b3RGaWVsZHMoIkNPVU5UUlkiKS5PcmllbnRhdGlvbiA9IHhsUm93RmllbGQNCg0KcHZ0LkFkZERhdGFGaWVsZCBwdnQuUGl2b3RGaWVsZHMoVGhpc1F1ZXN0aW9uKSwgIlBlcmNlbnRhZ2UiLCB4bENvdW50DQoNCnB2dC5QaXZvdEZpZWxkcyhUaGlzUXVlc3Rpb24pLk9yaWVudGF0aW9uID0geGxDb2x1bW5GaWVsZA0KYGBgDQoNClNvIG5vdyB3ZSBoYXZlIHBvcHVsYXRlZCB0aGUgcGl2b3QgdGFibGUsIGJ1dCB0aGUgdmFsdWVzIGluIGl0IGFyZSBzdGlsbCBjb3VudHMgKHhsQ291bnQpLiBUbyBjaGFuZ2UgdGhlbSB0byBwZXJjZW50YWdlczoNCg0KYGBge3IgZXZhbCA9IEZBTFNFfQ0KV2l0aCBzaHQuUGl2b3RUYWJsZXMoIlBpdm90VGFibGUxIikuUGl2b3RGaWVsZHMoIlBlcmNlbnRhZ2UiKQ0KICAgIC5DYWxjdWxhdGlvbiA9IHhsUGVyY2VudE9mUm93DQogICAgLk51bWJlckZvcm1hdCA9ICIwLjAwJSINCkVuZCBXaXRoDQpgYGANCjxicj4NCg0KU28gbm93IHdlIGhhdmUgdGhlIHBpdm90IHRhYmxlIHBvcHVsYXRlZCB0aGUgd2F5IHdlIHdhbnQgaXQuLi5hbG1vc3QuIFdlIGhhdmUgaXQgcG9wdWxhdGVkIHdpdGggYWxsIHRoZSBjb3VudHJpZXMsIFdlIHdhbnQgdG8gZmlsdGVyIGl0IHNvIGl0IG9ubHkgaW5jbHVkZXMgdGhlIGNvdW50cnkgdGhlIHVzZXIgcGlja2VkIG9uIHRoZSBmb3JtLiBXZSBzdGFydCBieSBhc3NpZ25pbmcgdGhlIHBpdm90IHRhYmxlJ3MgUm93cyBmaWVsZCwgd2hpY2ggaXMgdGhlIGxpc3Qgb2YgYWxsIHRoZSBjb3VudHJpZXMsIHRvIGFuIGFycmF5LCB1c2luZyB0aGUgW2BEYXRhUmFuZ2VgIHByb3BlcnR5XShodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy92YmEvZXhjZWwtdmJhL2FydGljbGVzL3Bpdm90ZmllbGQtZGF0YXJhbmdlLXByb3BlcnR5LWV4Y2VsKS4gVGhlbiB3ZSBpdGVyYXRlIG92ZXIgdGhlIGFycmF5IGFuZCBtYWtlIGludmlzaWJsZSBhbGwgUm93cyBvbiB0aGUgcGl2b3QgdGFibGUgZXhjZXB0IHRoZSBvbmUgY29ycmVzcG9uZGluZyB0byB0aGUgY291bnRyeSB0aGUgdXNlciBwaWNrZWQgb24gdGhlIGZvcm0uDQoNCmBgYHtyIGV2YWwgPSBGQUxTRX0NCkRpbSBjb3VudHJpZXMgQXMgVmFyaWFudA0KRGltIFRoaXNDb3VudHJ5IEFzIFN0cmluZw0KRGltIGkgQXMgSW50ZWdlciwgQXJyYXlMZW5ndGggQXMgSW50ZWdlcg0KDQpjb3VudHJpZXMgPSBwdnQuUGl2b3RGaWVsZHMoIkNvdW50cnkiKS5EYXRhUmFuZ2UNCg0KVGhpc0NvdW50cnkgPSBDb3VudHJ5TmFtZS5Db21ib0JveDEuVmFsdWUNCg0KQXJyYXlMZW5ndGggPSBVQm91bmQoY291bnRyaWVzKQ0KRm9yIGkgPSAxIFRvIEFycmF5TGVuZ3RoDQogICAgSWYgY291bnRyaWVzKGksIDEpIDw+IFRoaXNDb3VudHJ5IFRoZW4NCiAgICAgICAgcHZ0LlBpdm90RmllbGRzKCJDT1VOVFJZIikuUGl2b3RJdGVtcyhjb3VudHJpZXMoaSwgMSkpLlZpc2libGUgPSBGYWxzZQ0KICAgIEVuZCBJZg0KTmV4dCBpDQpgYGANCjxicj4NCg0KTm93IHdlIGFyZSByZWFkeSB0byBjcmVhdGUgdGhlIHBpdm90IGNoYXJ0IQ0KDQojIyA0LjAgUGl2b3QgQ2hhcnQNCg0KV2Ugc3RhcnQgYnkgYWRkaW5nIHRoZSBjaGFydCB0byB0aGUgd29ya3NoZWV0IGFuZCBzdGF0aW5nIGl0cyBkYXRhIHNvdXJjZSwgd2hpY2ggd2lsbCBiZSB0aGUgKGZpbHRlcmVkKSBwaXZvdCB0YWJsZSBqdXN0IGNyZWF0ZWQ6DQoNCmBgYHtyIGV2YWwgPSBGQUxTRX0NCkFjdGl2ZVNoZWV0LlNoYXBlcy5BZGRDaGFydDIoMjAxLCB4bENvbHVtbkNsdXN0ZXJlZCkuU2VsZWN0DQpBY3RpdmVDaGFydC5TZXRTb3VyY2VEYXRhIFNvdXJjZTo9cHZ0LkRhdGFCb2R5UmFuZ2UNCmBgYA0KPGJyPg0KDQpUaGVuIHdlIGNhbiBjdXN0b21pemUgdGhlIHBpdm90IGNoYXJ0LiBNb3N0IG9mIHRoZXNlIEkgZm91bmQgYnkgcmVjb3JkaW5nIG1pbmktbWFjcm9zIGFuZCB0YWtpbmcgYSBsb29rIGF0IHRoZSBtYWNybydzIFZCQSBjb2RlLiBXZSBzdGFydCBieSByZW1vdmluZyBzb21lIG9mIHRoZSBidXR0b25zIEV4Y2VsIGRpc3BsYXlzIG9uIHRoZSBjaGFydCBieSBkZWZhdWx0LCB3aGljaCB3ZSBkb24ndCBuZWVkIGFuZCBtYWtlIHRoZSBjaGFydCBsb29rIGNsdXR0ZXJlZC4NCg0KYGBge3IgZXZhbCA9IEZBTFNFfQ0KQWN0aXZlQ2hhcnQuU2hvd1ZhbHVlRmllbGRCdXR0b25zID0gRmFsc2UNCkFjdGl2ZUNoYXJ0LlNob3dMZWdlbmRGaWVsZEJ1dHRvbnMgPSBGYWxzZQ0KYGBgDQo8YnI+DQoNClRoZW4gd2UgcmVtb3ZlIHRoZSBncmlkbGluZXMgYW5kIHRoZSB4LWF4aXMgKHhsQ2F0ZWdvcnkpLCB3aGljaCBkb24ndCByZWFsbHkgaW1wcm92ZSB0aGUgY2hhcnQuDQoNCmBgYHtyIGV2YWwgPSBGQUxTRX0NCkFjdGl2ZUNoYXJ0LkF4ZXMoeGxWYWx1ZSkuTWFqb3JHcmlkbGluZXMuU2VsZWN0DQpTZWxlY3Rpb24uRGVsZXRlDQpBY3RpdmVDaGFydC5BeGVzKHhsQ2F0ZWdvcnkpLlNlbGVjdA0KU2VsZWN0aW9uLkZvcm1hdC5MaW5lLlZpc2libGUgPSBtc29GYWxzZQ0KYGBgDQo8YnI+DQoNClRoZW4gd2UgZm9ybWF0dGhlIHRpY2sgbWFya3Mgb2YgdGhlIHgtYXhpcyAoeGxDYXRlZ29yeSksIHRoZSB5LWF4aXMgKHhsVmFsdWUpLCBhbmQgc2V0IHRoZSB0aXRsZSBvZiB0aGUgeWV0IHVudGl0bGVkIGNoYXJ0IHRvIGJvbGQuIEZpbmFsbHksIHdlIHB1dCB0aGUgY2hhcnQgb24gaXRzIG93biB3b3Jrc2hlZXQsIGNhbGxlZCAiQ2hhcnQiLCBhbmQgZG8gYSB2aXJ0dWFsIHByZXNzIG9mIHRoZSBFc2NhcGUga2V5IHNvIHRoZSBjaGFydCBpc24ndCBzZWxlY3RlZCB3aGVuIHRoZSB1c2VyIGxvb2tzIGF0IGl0Lg0KDQpgYGB7ciBldmFsID0gRkFMU0V9DQpBY3RpdmVDaGFydC5BeGVzKHhsQ2F0ZWdvcnkpLlRpY2tMYWJlbHMuRm9udC5Cb2xkID0gbXNvVHJ1ZQ0KQWN0aXZlQ2hhcnQuQXhlcyh4bENhdGVnb3J5KS5UaWNrTGFiZWxzLkZvbnQuU2l6ZSA9IDE0DQoNCkFjdGl2ZUNoYXJ0LkF4ZXMoeGxWYWx1ZSkuVGlja0xhYmVscy5Gb250LlNpemUgPSAxNA0KQWN0aXZlQ2hhcnQuQXhlcyh4bFZhbHVlKS5UaWNrTGFiZWxzLk51bWJlckZvcm1hdCA9ICIwJSINCg0KQWN0aXZlQ2hhcnQuSGFzVGl0bGUgPSBUcnVlDQpBY3RpdmVDaGFydC5DaGFydFRpdGxlLkZvbnQuQm9sZCA9IFRydWUNCg0KQWN0aXZlQ2hhcnQuTG9jYXRpb24gV2hlcmU6PXhsTG9jYXRpb25Bc05ld1NoZWV0LCBOYW1lOj0iQ2hhcnQiDQoNCmBgYA0KPGJyPg0KDQpOb3cgbGV0J3MgdGl0bGUgdGhlIGNoYXJ0Lg0KDQpgYGB7ciBldmFsID0gRkFMU0V9DQoNClNlbGVjdCBDYXNlIFRoaXNRdWVzdGlvbg0KDQogICAgQ2FzZSAiUTgxQSINCiAgICAgICAgUGl2b3RDaGFydFRpdGxlID0gIkhvdyBtdWNoIGluZmx1ZW5jZSBkbyB5b3UgdGhpbmsgQ2hpbmEncyBlY29ub21pYyBhY3Rpdml0aWVzIGluIHlvdXIgY291bnRyeSIgJiBfDQogICAgICAgICIgaGF2ZSBvbiBvdXIgZWNvbm9teSwgb3IgaGF2ZW4ndCB5b3UgaGVhcmQgZW5vdWdoIHRvIHNheT8iDQogICAgQ2FzZSAiUTgxQiINCiAgICAgICAgUGl2b3RDaGFydFRpdGxlID0gIkluIGdlbmVyYWwsIGRvIHlvdSB0aGluayB0aGF0IENoaW5hJ3MgZWNvbm9taWMgYW5kIHBvbGl0aWNhbCBpbmZsdWVuY2UgaW4geW91ciBjb3VudHJ5IiAmIF8NCiAgICAgICAgIiBpcyBtb3N0bHkgcG9zaXRpdmUsIG9yIG1vc3RseSBuZWdhdGl2ZSwgb3IgaGF2ZW4ndCB5b3UgaGVhcmQgZW5vdWdoIHRvIHNheT8iDQogICAgQ2FzZSAiUTgxQyINCiAgICAgICAgUGl2b3RDaGFydFRpdGxlID0gIldoaWNoIG9mIHRoZSBmb2xsb3dpbmcgZmFjdG9ycyBjb250cmlidXRlcyBtb3N0IHRvIHRoZSBwb3NpdGl2ZSBpbWFnZSBvZiBDaGluYSBpbiB5b3VyIGNvdW50cnkiICYgXw0KICAgICAgICAiLCBvciBoYXZlbid0IHlvdSBoZWFyZCBlbm91Z2ggdG8gc2F5PyINCiAgICBDYXNlICJRODFEIg0KICAgICAgICBQaXZvdENoYXJ0VGl0bGUgPSAiV2hpY2ggb2YgdGhlIGZvbGxvd2luZyBmYWN0b3JzIGNvbnRyaWJ1dGVzIG1vc3QgdG8gdGhlIG5lZ2F0aXZlIGltYWdlIG9mIENoaW5hIGluIHlvdXIgY291bnRyeSIgJiBfDQogICAgICAgICIsIG9yIGhhdmVuJ3QgeW91IGhlYXJkIGVub3VnaCB0byBzYXk/Ig0KICAgIENhc2UgIlE4MUUiDQogICAgICAgIFBpdm90Q2hhcnRUaXRsZSA9ICJJbiB5b3VyIG9waW5pb24sIGRvZXMgQ2hpbmEncyBlY29ub21pYyBhc3Npc3RhbmNlIHRvIHlvdXIgY291bnRyeSIgJiBfDQogICAgICAgICIgZG8gYSBnb29kIGpvYiBvciBhIGJhZCBqb2Igb2YgbWVldGluZyB0aGUgY291bnRyeSdzIG5lZWRzLCBvciBoYXZlbid0IHlvdSBoZWFyZCBlbm91Z2ggdG8gc2F5PyINCg0KRW5kIFNlbGVjdA0KDQpBY3RpdmVDaGFydC5DaGFydFRpdGxlLlRleHQgPSBQaXZvdENoYXJ0VGl0bGUNCmBgYA0KPGJyPg0KDQpEb25lISBJZiB0aGUgdXNlciBoYWQgcGlja2VkICJBbGdlcmlhIiBhbmQgIlE4MUEiIG9uIHRoZSBmb3JtLCB0aGUgY2hhcnQgd291bGQgbG9vayBsaWtlIHRoaXMuDQoNCiFbXShjaGFydF9leGFtcGxlXzEucG5nICJjaGFydCBleGFtcGxlIDEiKQ0KPGJyPg0KDQpXZSBzdGlsbCBoYXZlIHRoZSAiY291bnRyeSIgZmlsdGVyIGJ1dHRvbiBvZiB0aGUgcGl2b3QgY2hhcnQgYXZhaWxhYmxlLCBpbiBjYXNlIHRoZSB1c2VyIHdhbnRzIHRvIHNlbGVjdCBhIGRpZmZlcmVudCBjb3VudHJ5LCBvciBldmVuIG1vcmUgdGhhbiBvbmUgY291bnRyeS4NCjxicj4NCg0KIVtdKGNoYXJ0X2V4YW1wbGVfMV9jb3VudHJ5X2ZpbHRlci5wbmcgImNoYXJ0IGNvdW50cnkgZmlsdGVyIikNCg0KU28gaWYgdGhlIHVzZXIgaGFkIHdhbnRlZCB0byBjb21wYXJlIHJlc3BvbnNlcyBmcm9tICJBbGdlcmlhIiBhbmQgIkJlbmluIiwgdGhlIGNoYXJ0IHdvdWxkIGhhdmUgbG9va2VkIGxpa2UgdGhpczoNCg0KIVtdKGNoYXJ0X2V4YW1wbGVfMi5wbmcgImNoYXJ0IGNvdW50cnkgZmlsdGVyIDIgY291bnRyaWVzIikNCjxicj4NCg0KSGVyZSBhcmUgZm91ciBjb3VudHJpZXMuIEkgdGhpbmsgbW9yZSB0aGFuIGZvdXIgaXMgcHVzaGluZyBpdCwgdW5sZXNzIG9uZSBoYXMgYSB3aWRlIG1vbml0b3IuDQoNCiFbXShjaGFydF9leGFtcGxlXzMucG5nICJjaGFydCBjb3VudHJ5IGZpbHRlciA0IGNvdW50cmllcyIpDQo8YnI+DQoNCiMjIDUuMCBPYnNlcnZhdGlvbnMNCg0KV2UgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoZSBwaXZvdCB0YWJsZSB0byBtYWtlIHNvbWUgb2JzZXJ2YXRpb25zIGFib3V0IHRoZSBkYXRhLCB1c2luZyBjb25kaXRpb25hbCBmb3JtYXR0aW5nLg0KDQojIyMgNS4xIE9uIHRoZSBkZWdyZWUgb2YgaW5mbHVlbmNlIENoaW5hJ3MgZWNvbm9taWMgYWN0aXZpdGllcw0KDQpRODFBIHdhczoNCg0KKipIb3cgbXVjaCBpbmZsdWVuY2UgZG8geW91IHRoaW5rIENoaW5hJ3MgZWNvbm9taWMgYWN0aXZpdGllcyBpbiBvdXIgY291bnRyeSBoYXZlIG9uIG91ciBlY29ub215LCBvciBoYXZlbid0IHlvdSBoZWFyZCBlbm91Z2ggdG8gc2F5PyoqDQoNCiFbXShRODFBX3RhYmxlLnBuZyAiUTgxQSB0YWJsZSIpDQo8YnI+DQoNCkFzIG1pZ2h0IGJlIGV4cGVjdGVkLCBhIGxhcmdlIG1ham9yaXR5IG9mIHRob3NlIHBvbGxlZCBzZWUgQ2hpbmEncyBlY29ub21pYyBhY3Rpdml0aWVzIGFzIGhhdmluZyBhIGxhcmdlIGluZmx1ZW5jZSBpbiB0aGVpciBjb3VudHJ5J3MgZWNvbm9teS4NCg0KLSBJbiBoYWxmIG9mIHRoZSBjb3VudHJpZXMsIG92ZXIgKio0MCUqKiBvZiByZXNwb25kZW50cyBiZWxpZXZlIENoaW5hJ3MgZWNvbm9taWMgYWN0aXZpdGllcyBoYXZlICJhIGxvdCIgb2YgaW5mbHVlbmNlIGluIHRoZWlyIGNvdW50cnkncyBlY29ub215Lg0KDQotIEluIDIxIGNvdW50cmllcywgb3ZlciAqKjI1JSoqIG9mIHJlc3BvbmRlbnRzIGJlbGlldmUgQ2hpbmEncyBhY3Rpdml0aWVzIGhhdmUgInNvbWUiIGluZmx1ZW5jZS4NCg0KLSBJbiAxMCBjb3VudHJpZXMsIG92ZXIgKioxNSUqKiBvZiByZXNwb25kZW50cyBiZWxpZXZlIENoaW5hJ3MgYWN0aXZpdGllcyBoYXZlICJhIGxpdHRsZSIgaW5mbHVlbmNlLg0KDQotIEluIDEzIGNvdW50cmllcywgbW9zdCBub3RhYmx5IEJ1cnVuZGksIFPDo28gVG9tw6kgYW5kIFByw61uY2lwZSwgU2llcnJhIExlb25lLCBhbmQgVWdhbmRhLCBvdmVyICoqMTUlKiogb2YgcmVzcG9uZGVudHMgZG9uJ3Qga25vdyB0aGUgZGVncmVlIG9mIGluZmx1ZW5jZSBvZiBDaGluYSdzIGFjdGl2aXRpZXMgaW4gdGhlaXIgY291bnRyeSdzIGVjb25vbXkuDQoNCi0gSW4gb25seSAyIGNvdW50cmllcyBkaWQgKioxMCUqKiBvciBtb3JlIG9mIHBvbGwgcmVzcG9uZGVudHMgc2FpZCB0aGF0IENoaW5hIGhhcyBubyBpbmZsdWVuY2UgaW4gdGhlaXIgY291bnRyeSdzIGVjb25vbXkuDQoNCk92ZXJhbGwsIG92ZXIgdHdvIHRoaXJkcyBvZiB0aG9zZSBwb2xsZWQgYWNyb3NzIEFmcmljYSBiZWxpZXZlIHRoYXQgQ2hpbmEgaGFzIHNvbWUgb3IgYSBsb3Qgb2YgaW5mbHVlbmNlIGluIHRoZWlyIGNvdW50cnkncyBlY29ub215LCB3aGlsZSBsZXNzIHRoYW4gKio1JSoqIGJlbGlldmUgaXQgaGFzIG5vbmUuDQoNCiFbXShRODFBX3RhYmxlX3RvdGFscy5wbmcgIlE4MUEgdGFibGUgdG90YWxzIikNCg0KIyMjIDUuMiBPbiB3aGV0aGVyIENoaW5hJ3MgaW5mbHVlbmNlIGlzIHBvc2l0aXZlIG9yIG5lZ2F0aXZlDQoNClE4MUIgd2FzOg0KDQoqKkluIGdlbmVyYWwsIGRvIHlvdSB0aGluayB0aGF0IENoaW5hJ3MgZWNvbm9taWMgYW5kIHBvbGl0aWNhbCBpbmZsdWVuY2Ugb24gb3VyIGNvdW50cnkgaXMgbW9zdGx5IHBvc2l0aXZlLCBvciBtb3N0bHkgbmVnYXRpdmUsIG9yIGhhdmVuJ3QgeW91IGhlYXJkIGVub3VnaCB0byBzYXk/KioNCg0KIVtdKFE4MUJfdGFibGUucG5nICJRODFCIHRhYmxlIikNCjxicj4NCg0KVGhlIHBvbGwgcmVzcG9uZGVudHMgYWNyb3NzIHRoZSBjb250aW5lbnQgc2VlbSB0byBoYXZlIGEgcHJldHR5IGdvb2Qgb3BpbmlvbiBhYm91dCBDaGluYSdzIGVjb25vbWljIGFuZCBwb2xpdGljYWwgaW5mbHVlbmNlIGluIHRoZWlyIGNvdW50cnksIGFuZCBpbiB2ZXJ5IGZldyBjb3VudHJpZXMgZGlkIG1vcmUgdGhhbiAyNSUgb2YgdGhlIHJlc3BvbmRlbnRzIGhhZCBhIHNvbWV3aGF0IG9yIHZlcnkgbmVnYXRpdmUgb3BpbmlvbiBvbiB0aGUgbWF0dGVyLg0KDQotIEluIG9ubHkgb25lIGNvdW50cnksIEdoYW5hLCBkaWQgbW9yZSB0aGFuICoqMjUlKiogb2YgcmVzcG9uZGVudHMgZXhwcmVzcyBhICJ2ZXJ5IG5lZ2F0aXZlIiIgb3BpbmlvbiBvbiBDaGluYSdzIGluZmx1ZW5jZS4NCg0KLSBJbiBvbmx5IG9uZSBjb3VudHJ5LCBNYWRnYXNjYXIsIGRpZCBtb3JlIHRoYW4gKioyNSUqKiBvZiByZXNwb25kZW50cyB0YWtlIGEgInNvbWV3aGF0IG5lZ2F0aXZlIiIgdmlldyBvbiBDaGluYSdzIGluZmx1ZW5jZSAoYWx0aG91Z2ggVHVuaXNpYSBhbmQgQWxnZXJpYSBhcmUgYm9yZGVybGluZSkuDQoNCi0gSW4gZXhhY3RseSBoYWxmIG9mIHRoZSBjb3VudHJpZXMsICoqMzMlKiogb3IgbW9yZSBvZiBwZW9wbGUgcG9sbGVkIHZpZXdlZCBDaGluYSdzIGluZmx1ZW5jZSBpbiBhICJzb21ld2hhdCBwb3NpdGl2ZSIgbGlnaHQuDQoNCi0gSW4gZWxldmVuIGNvdW50cmllcywgKiozMyUqKiBvZiB0aG9zZSBwb2xsZWQgdmlldyBDaGluYSdzIGluZmx1ZW5jZSBhcyAidmVyeSBwb3NpdGl2ZSIgaW4gdGhlaXIgY291bnRyeS4NCg0KLSBWZXJ5IGZldyByZXNwb25kZW50cyB0aGluayBDaGluYSdzIGluZmx1ZW5jZSBpcyAibmVpdGhlciBwb3NpdGl2ZSBub3IgbmVnYXRpdmUiLg0KDQotIEEgc2lnbmlmaWNhbnQgZnJhY3Rpb24gKCoqMTUlKiogb3IgbW9yZSkgb2YgcmVzcG9uZGVudHMgaW4gbWFueSBjb3VudHJpZXMgaGF2ZW4ndCBmb3JtZWQgYW4gb3BpbmlvbiB5ZXQuDQoNCk92ZXJhbGwsIG92ZXIgKio2MCUqKiBvZiByZXNwb25kZW50cyBhY3Jvc3MgdGhlIGNvbnRpbmVudCBoYXZlIGVpdGhlciBhICJzb21ld2hhdCBwb3NpdGl2ZSIgb3IgInZlcnkgcG9zaXRpdmUiIG9waW5pb24gb2YgQ2hpbmEncyBpbmZsdWVuY2UsIGFuZCBvbmx5IGFib3V0ICoqMTUlKiogaGF2ZSBhICJzb21ld2hhdCBuZWdhdGl2ZSIgb3IgInZlcnkgbmVnYXRpdmUiIG9waW5pb24uDQoNCiFbXShRODFCX3RhYmxlX3RvdGFscy5wbmcgIlE4MUIgdGFibGUgdG90YWxzIikNCjxicj4NCg0KIyMjIDUuMyBPbiB3aGV0aGVyIENoaW5hJ3MgZWNvbm9taWMgYXNzaXN0YW5jZSBtZWV0cyB0aGUgY291bnRyeSdzIG5lZWRzDQoNClE4MUUgd2FzOg0KDQoqKkluIHlvdXIgb3BpbmlvbiwgQ2hpbmEncyBlY29ub21pYyBhc3Npc3RhbmNlIHRvIG91ciBjb3VudHJ5IGRvIGEgZ29vZCBqb2Igb3IgYmFkIGpvYiBvZiBtZWV0aW5nIHRoZSBjb3VudHJ5J3MgbmVlZHMsIG9yIGhhdmVuJ3QgeW91IGhlYXJkIGVub3VnaCB0byBzYXk/KioNCg0KIVtdKFE4MUVfdGFibGUucG5nICJRODFFIHRhYmxlIikNCjxicj4NCg0KQSBtYWpvcml0eSBvZiB0aG9zZSBwb2xsZWQgdGFrZSBhIHBvc2l0aXZlIHZpZXcgb2YgQ2hpbmEncyBlY29ub21pYyBhY3Rpdml0aWVzLg0KDQotIEluIGFsbW9zdCBoYWxmIG9mIHRoZSBjb3VudHJpZXMsICoqMzMlKiogb3IgbW9yZSBvZiByZXNwb25kZW50cyBiZWxpZXZlIENoaW5hJ3MgYWN0aXZpdGllcyBkbyBhICJzb21ld2FodCBnb29kIGpvYiIgb2YgbWVldGluZyB0aGUgY291bnRyeSdzIG5lZWRzLCB3aGVyZWFzIGluIGEgZG96ZW4gY291bnRyaWVzICoqMjUlKiogb3IgbW9yZSBvZiB0aG9zZSBwb2xsZWQgYmVsaWV2ZSBpdCdzIGEgInZlcnkgZ29vZCBqb2IiLg0KDQotIEluIGV2ZXJ5IGNvdW50cnkgd2l0aCB0aGUgZXhjZXB0aW9ucyBvZiBHaGFuYSwgTGVzb3RobywgYW5kIE1hbGF3aSwgbGVzcyB0aGFuICoqMjAlKiogb2YgdGhvc2UgcG9sbGVkIGJlbGlldmUgQ2hpbmEncyBhY3Rpdml0aWVzIGRvIGEgInZlcnkgYmFkIGpvYiIgb2YgbWVldGluZyB0aGVpciBjb3VudHJ5J3MgbmVlZHMuDQoNCk92ZXJhbGwsIGFib3V0ICoqNTQlKiogb2YgcmVzcG9uZGVudHMgYWNyb3NzIEFmcmljYSBiZWxpZXZlIENoaW5hJ3MgYWN0aXZpdGllcyBpbiB0aGVpciBjb3VudHJ5IGRvIGVpdGhlciBhICJzb21ld2hhdCBnb29kIGpvYiIgb3IgYSAidmVyeSBnb29kIGpvYiIgb2YgbWVldGluZyB0aGVpciBjb3VudHJ5J3MgbmVlZHMsIHdoaWxlIGFib3V0ICoqMjAlKiogb2YgdGhvc2UgcG9sbGVkIHRha2UgYSBuZWdhdGl2ZSB2aWV3IG9mIHRob3NlIGFjdGl2aXRpZXMuDQoNCiFbXShRODFFX3RhYmxlX3RvdGFscy5wbmcgIlE4MUIgdGFibGUgdG90YWxzIikNCjxicj4NCg0KDQojIyA2LjAgUmVmZXJlbmNlcw0KDQoxLiBDaGFybGllIE51dHRlbG1hbi4gWyoqKkV4Y2VsL1ZCQSBmb3IgQ3JlYXRpdmUgUHJvYmxlbSBTb2x2aW5nIFNwZWNpYWxpemF0aW9uKioqXShodHRwczovL3d3dy5jb3Vyc2VyYS5vcmcvc3BlY2lhbGl6YXRpb25zL2V4Y2VsLXZiYS1jcmVhdGl2ZS1wcm9ibGVtLXNvbHZpbmcjY3JlYXRvcnMpLCBTdW1tZXIgMjAxOC4gQ291cnNlcmEuDQoNCjIuIE1hY3F1YXJpZSBVbml2ZXJzaXR5LiBbKioqRXhjZWwgU2tpbGxzIGZvciBCdXNpbmVzcyBTcGVjaWFsaXphdGlvbioqKl0oaHR0cHM6Ly93d3cuY291cnNlcmEub3JnL3NwZWNpYWxpemF0aW9ucy9leGNlbCNjb3Vyc2VzKQ0KDQozLiBBcnVrYSBKIGFuZCBGbG9yZW50IEIuIFsqKipRdWlja2VyIHdheSB0byBnZXQgYWxsIHVuaXF1ZSB2YWx1ZXMgb2YgYSBjb2x1bW4gaW4gVkJBKioqXShodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNjA0NDU1Ni9xdWlja2VyLXdheS10by1nZXQtYWxsLXVuaXF1ZS12YWx1ZXMtb2YtYS1jb2x1bW4taW4tdmJhKS4gDQoNCjQuIEthaXJhbiBhbmQgQWlrZW4uIFsqKipEZWNsYXJlIGFuZCBJbml0aWFsaXplIFN0cmluZyBBcnJheSBpbiBWQkEqKipdKGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE5MzY5MTMyL2RlY2xhcmUtYW5kLWluaXRpYWxpemUtc3RyaW5nLWFycmF5LWluLXZiYSkNCg0KNS4gUm9zZSBhbmQgVGFyYSBSeWFuLiBbKioqSG93IHRvIHByZS1zZWxlY3QgaXRlbXMgb24gYSBsaXN0Ym94PyoqKl0oaHR0cDovL3d3dy5kYWlseWZyZWVjb2RlLmNvbS9mb3J1bS9wcmUtc2VsZWN0LWl0ZW1zLWxpc3Rib3gtMjUwMTguYXNweCkNCg0KNi4gQ2hyaXMgTmV3bWFuLiBbKioqVGhlIFZCQSBHdWlkZSBUbyBFeGNlbCBQaXZvdCBUYWJsZXMqKipdKGh0dHBzOi8vd3d3LnRoZXNwcmVhZHNoZWV0Z3VydS5jb20vYmxvZy8yMDE0LzkvMjcvdmJhLWd1aWRlLWV4Y2VsLXBpdm90LXRhYmxlcykNCg0KNy4gQmVuIEEgYW5kIFBFSC4gWyoqKlNlbGVjdCBlbnRpcmUgY29sdW1uIGluIHRhYmxlIHVzaW5nIEV4Y2VsIFZCQSoqKl0oaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDM1NDE0NDUvc2VsZWN0LWVudGlyZS1jb2x1bW4taW4tdGFibGUtdXNpbmctZXhjZWwtdmJhKQ0KDQo4LiBkaW5vdG9tIGFuZCBwZ2MwMS4gWyoqKm51bWJlciBmb3JtYXQgaW4gdmJhKioqXShodHRwczovL3d3dy5tcmV4Y2VsLmNvbS9mb3J1bS9leGNlbC1xdWVzdGlvbnMvNDM0MDU4LW51bWJlci1mb3JtYXQtdmJhLmh0bWwpDQoNCjkuIFNBRkQgYW5kIEV4Y2VsIERldmVsb3BlcnMuIFsqKipIb3cgdG8gcHJvcGVybHkgbG9hZCBhbmQgdW5sb2FkIGEgVXNlcmZvcm0gKFZCQSkqKipdKGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQyNTA3MzY3L2hvdy10by1wcm9wZXJseS1sb2FkLWFuZC11bmxvYWQtYS11c2VyZm9ybS12YmEpDQoNCjEwLiBQaGlsIFdoaXR0aW5ndG9uIGFuZCBTdGFuLiBbKioqRXhjZWwgVkJBIEFwcCBzdG9wcyBzcG9udGFuZW91c2x5IHdpdGggbWVzc2FnZSDigJxDb2RlIGV4ZWN1dGlvbiBoYXMgYmVlbiBoYWx0ZWTigJ0qKipdKGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzIxNTQ2OTkvZXhjZWwtdmJhLWFwcC1zdG9wcy1zcG9udGFuZW91c2x5LXdpdGgtbWVzc2FnZS1jb2RlLWV4ZWN1dGlvbi1oYXMtYmVlbi1oYWx0ZWQpDQogDQoNCiMjIDcuMCBBcHBlbmRpeDogRGF0YSBjbGVhbmluZyBhbmQgcHJlcGFyYXRpb24gdXNpbmcgUg0KDQpUaGUgZGF0YSBpbiB0aGUgImFmcm9iYXJvbWV0ZXJfMjAxNV9RODEiIHdvcmtzaGVldCB3YXMgZ2VuZXJhdGVkIGJ5IHRha2luZyB0aGUgQWZyb2Jhcm9tZXRlciBbb3JpZ2luYWwgZGF0YXNldF0oaHR0cDovL2Fmcm9iYXJvbWV0ZXIub3JnL2RhdGEvbWVyZ2VkLXJvdW5kLTYtZGF0YS0zNi1jb3VudHJpZXMtMjAxNikgYW5kIGNsZWFuaW5nIGl0IGEgYml0LCB1c2luZyBSLiBUaGlzIHNlY3Rpb24gZGV0YWlscyB0aGF0IHNlcmllcyBvZiBvcGVyYXRpb25zLg0KDQpMb2FkaW5nIFNQU1MgZGF0YSBpbnRvIFIuDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShmb3JlaWduKQ0KYWZyb2Jhcm9tZXRlcl8yMDE1IDwtIHJlYWQuc3BzcygibWVyZ2VkX3I2X2RhdGFfMjAxNl8zNmNvdW50cmllczIuc2F2IiwgdG8uZGF0YS5mcmFtZSA9IFQsIHJlZW5jb2RlID0gIlVURi04IikNCmBgYA0KDQpRdWVzdGlvbiA4MUEgbXVuZ2luZw0KDQpgYGB7cn0NCiMgQ29udmVydCB0aGUgY29sdW1uIGZyb20gYSBmYWN0b3IgdG8gYSBjaGFyYWN0ZXIgdmVjdG9yDQphZnJvYmFyb21ldGVyXzIwMTUkUTgxQSA8LSBhcy5jaGFyYWN0ZXIoYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUEpDQojIE1ha2luZyAiRG9uJ3Qga25vdyAvIEhhdmVuJ3QgaGVhcmQgZW5vdWdoIiBzaG9ydGVyDQphZnJvYmFyb21ldGVyXzIwMTUkUTgxQVthZnJvYmFyb21ldGVyXzIwMTUkUTgxQSA9PSAiRG9uJ3Qga25vdyAvIEhhdmVuJ3QgaGVhcmQgZW5vdWdoIl0gPC0gIkRvbid0IGtub3ciDQojIERlbGV0aW5nICJNaXNzaW5nIiBhbmQgIk5vdCBBc2tlZCINCmFmcm9iYXJvbWV0ZXJfMjAxNSA8LSBhZnJvYmFyb21ldGVyXzIwMTVbYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUEgIT0gIk1pc3NpbmciLF0NCmFmcm9iYXJvbWV0ZXJfMjAxNSA8LSBhZnJvYmFyb21ldGVyXzIwMTVbYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUEgIT0gIk5vdCBBc2tlZCBpbiB0aGlzIENvdW50cnkiLF0NCiMgQ2hhbmdpbmcgdGhlIGNvbHVtbiBiYWNrIHRvIGEgZmFjdG9yIHNvIHdlIGNhbiBvcmRlciB0aGUgZmFjdG9ycyBtZWFuaW5nZnVsbHkgDQojIGZvciB0aGUgcHVycG9zZXMgb2YgcGxvdHRpbmcNCmFmcm9iYXJvbWV0ZXJfMjAxNSRRODFBIDwtIGFzLmZhY3RvcihhZnJvYmFyb21ldGVyXzIwMTUkUTgxQSkNCmFmcm9iYXJvbWV0ZXJfMjAxNSRRODFBIDwtIGZhY3RvcihhZnJvYmFyb21ldGVyXzIwMTUkUTgxQSwgbGV2ZWxzKGFmcm9iYXJvbWV0ZXJfMjAxNSRRODFBKVtjKDQsIDEsIDUsIDIsIDMpXSkNCnRhYmxlKGFmcm9iYXJvbWV0ZXJfMjAxNSRRODFBKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KYWZyb2Jhcm9tZXRlcl9RODFBX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBhZnJvYmFyb21ldGVyXzIwMTUpICsgZ2d0aXRsZSgiUTgxQSIpDQphZnJvYmFyb21ldGVyX1E4MUFfcGxvdCA8LSBhZnJvYmFyb21ldGVyX1E4MUFfcGxvdCArIGdlb21fYmFyKGFlcyh4ID0gUTgxQSkpDQphZnJvYmFyb21ldGVyX1E4MUFfcGxvdA0KYGBgDQoNClF1ZXN0aW9uIDgxQiBtdW5naW5nDQoNCmBgYHtyfQ0KIyBDb252ZXJ0IHRoZSBjb2x1bW4gZnJvbSBhIGZhY3RvciB0byBhIGNoYXJhY3RlciB2ZWN0b3INCmFmcm9iYXJvbWV0ZXJfMjAxNSRRODFCIDwtIGFzLmNoYXJhY3RlcihhZnJvYmFyb21ldGVyXzIwMTUkUTgxQikNCiMgTWFraW5nICJEb24ndCBrbm93IC8gSGF2ZW4ndCBoZWFyZCBlbm91Z2giIHNob3J0ZXINCmFmcm9iYXJvbWV0ZXJfMjAxNSRRODFCW2Fmcm9iYXJvbWV0ZXJfMjAxNSRRODFCID09ICJEb24ndCBrbm93IC8gSGF2ZW4ndCBoZWFyZCBlbm91Z2giXSA8LSAiRG9uJ3Qga25vdyINCiMgQ2hhbmdpbmcgYSBmZXcgaW50byAidHdvLWxpbmUiIGZhY3RvcnMgc28gdGhleSBmaXQgYmV0dGVyIGluIHRoZSBwbG90DQphZnJvYmFyb21ldGVyXzIwMTUkUTgxQlthZnJvYmFyb21ldGVyXzIwMTUkUTgxQiA9PSAiTmVpdGhlciBwb3NpdGl2ZSBub3IgbmVnYXRpdmUiXSA8LSAiTmVpdGhlciBwb3NpdGl2ZSBcbiBub3IgbmVnYXRpdmUiDQphZnJvYmFyb21ldGVyXzIwMTUkUTgxQlthZnJvYmFyb21ldGVyXzIwMTUkUTgxQiA9PSAiU29tZXdoYXQgbmVnYXRpdmUiXSA8LSAiU29tZXdoYXQgXG4gbmVnYXRpdmUiDQphZnJvYmFyb21ldGVyXzIwMTUkUTgxQlthZnJvYmFyb21ldGVyXzIwMTUkUTgxQiA9PSAiU29tZXdoYXQgcG9zaXRpdmUiXSA8LSAiU29tZXdoYXQgXG4gcG9zaXRpdmUiDQphZnJvYmFyb21ldGVyXzIwMTUkUTgxQlthZnJvYmFyb21ldGVyXzIwMTUkUTgxQiA9PSAiVmVyeSBuZWdhdGl2ZSJdIDwtICJWZXJ5IFxuIG5lZ2F0aXZlIg0KYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUJbYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUIgPT0gIlZlcnkgcG9zaXRpdmUiXSA8LSAiVmVyeSBcbiBwb3NpdGl2ZSINCiMgRGVsZXRpbmcgIk1pc3NpbmciIGFuZCAiTm90IEFza2VkIiANCmFmcm9iYXJvbWV0ZXJfMjAxNSA8LSBhZnJvYmFyb21ldGVyXzIwMTVbYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUIgIT0gIk1pc3NpbmciLF0NCmFmcm9iYXJvbWV0ZXJfMjAxNSA8LSBhZnJvYmFyb21ldGVyXzIwMTVbYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUIgIT0gIk5vdCBBc2tlZCBpbiB0aGlzIENvdW50cnkiLF0NCiMgQ2hhbmdpbmcgdGhlIGNvbHVtbiBiYWNrIHRvIGEgZmFjdG9yIHNvIHdlIGNhbiBvcmRlciB0aGUgZmFjdG9ycyBtZWFuaW5nZnVsbHkgDQojIGZvciB0aGUgcHVycG9zZXMgb2YgcGxvdHRpbmcNCmFmcm9iYXJvbWV0ZXJfMjAxNSRRODFCIDwtIGFzLmZhY3RvcihhZnJvYmFyb21ldGVyXzIwMTUkUTgxQikNCmFmcm9iYXJvbWV0ZXJfMjAxNSRRODFCIDwtIGZhY3RvcihhZnJvYmFyb21ldGVyXzIwMTUkUTgxQiwgbGV2ZWxzKGFmcm9iYXJvbWV0ZXJfMjAxNSRRODFCKVtjKDUsIDMsIDIsIDQsIDYsIDEpXSkNCnRhYmxlKGFmcm9iYXJvbWV0ZXJfMjAxNSRRODFCKQ0KYGBgDQoNCmBgYHtyfQ0KYWZyb2Jhcm9tZXRlcl9RODFCX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBhZnJvYmFyb21ldGVyXzIwMTUpICsgZ2d0aXRsZSgiUTgxQiIpDQphZnJvYmFyb21ldGVyX1E4MUJfcGxvdCA8LSBhZnJvYmFyb21ldGVyX1E4MUJfcGxvdCArIGdlb21fYmFyKGFlcyh4ID0gUTgxQikpDQphZnJvYmFyb21ldGVyX1E4MUJfcGxvdA0KYGBgDQoNClF1ZXN0aW9uIDgxQyBtdW5naW5nDQoNCmBgYHtyfQ0KIyBDb252ZXJ0IHRoZSBjb2x1bW4gZnJvbSBhIGZhY3RvciB0byBhIGNoYXJhY3RlciB2ZWN0b3INCmFmcm9iYXJvbWV0ZXJfMjAxNSRRODFDIDwtIGFzLmNoYXJhY3RlcihhZnJvYmFyb21ldGVyXzIwMTUkUTgxQykNCiMgTWFraW5nICJEb24ndCBrbm93IC8gSGF2ZW4ndCBoZWFyZCBlbm91Z2giIHNob3J0ZXINCmFmcm9iYXJvbWV0ZXJfMjAxNSRRODFDW2Fmcm9iYXJvbWV0ZXJfMjAxNSRRODFDID09ICJEb24ndCBrbm93IC8gSGF2ZW4ndCBoZWFyZCBlbm91Z2giXSA8LSAiT3RoZXIsIG5vbmUgb2YgdGhlc2Vcbm9yIGRvbid0IGtub3ciDQphZnJvYmFyb21ldGVyXzIwMTUkUTgxQ1thZnJvYmFyb21ldGVyXzIwMTUkUTgxQyA9PSAiTm9uZSBvZiB0aGVzZSJdIDwtICJPdGhlciwgbm9uZSBvZiB0aGVzZVxub3IgZG9uJ3Qga25vdyINCiMgQ2hhbmdpbmcgYSBmZXcgaW50byAidHdvLWxpbmUiIGZhY3RvcnMgc28gdGhleSBmaXQgYmV0dGVyIGluIHRoZSBwbG90DQphZnJvYmFyb21ldGVyXzIwMTUkUTgxQ1thZnJvYmFyb21ldGVyXzIwMTUkUTgxQyA9PSAiQ2hpbmEncyBzdXBwb3J0IGZvciB0aGUgY291bnRyeSBpbiBpbnRlcm5hdGlvbmFsIGFmZmFpcnMiXSA8LSAiQ2hpbmEncyBzdXBwb3J0IGZvciB0aGVcbmNvdW50cnkgaW4gaW50ZXJuYXRpb25hbCBhZmZhaXJzIg0KYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUNbYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUMgPT0gIk5vbi1pbnRlcmZlcmVuY2UgaW4gdGhlIGludGVybmFsIGFmZmFpcnMgb2YgQWZyaWNhbiBjb3VudHJpZXMiXSA8LSAiTm9uLWludGVyZmVyZW5jZSBpbiB0aGUgaW50ZXJuYWxcbmFmZmFpcnMgb2YgQWZyaWNhbiBjb3VudHJpZXMiDQphZnJvYmFyb21ldGVyXzIwMTUkUTgxQ1thZnJvYmFyb21ldGVyXzIwMTUkUTgxQyA9PSAiQ2hpbmEncyBpbnZlc3RtZW50IGluIGluZnJhc3RydWN0dXJlIGluIHRoZSBjb3VudHJ5Il0gPC0gIkNoaW5hJ3MgaW52ZXN0bWVudCBpblxuaW5mcmFzdHJ1Y3R1cmUgaW4gdGhlIGNvdW50cnkiDQphZnJvYmFyb21ldGVyXzIwMTUkUTgxQ1thZnJvYmFyb21ldGVyXzIwMTUkUTgxQyA9PSAiQ2hpbmEncyBidXNpbmVzcyBpbnZlc3RtZW50Il0gPC0gIkNoaW5hJ3MgYnVzaW5lc3MgXG4gaW52ZXN0bWVudCINCmFmcm9iYXJvbWV0ZXJfMjAxNSRRODFDW2Fmcm9iYXJvbWV0ZXJfMjAxNSRRODFDID09ICJUaGUgcXVhbGl0eSBvciBjb3N0IG9mIENoaW5lc2UgcHJvZHVjdHMiXSA8LSAiVGhlIHF1YWxpdHkgb3IgY29zdFxub2YgQ2hpbmVzZSBwcm9kdWN0cyINCmFmcm9iYXJvbWV0ZXJfMjAxNSRRODFDW2Fmcm9iYXJvbWV0ZXJfMjAxNSRRODFDID09ICJBbiBhcHByZWNpYXRpb24gb2YgdGhlIENoaW5lc2UgcGVvcGxlLCBjdWx0dXJlIGFuZCBsYW5ndWFnZSJdIDwtICJPdGhlciwgbm9uZSBvZiB0aGVzZVxub3IgZG9uJ3Qga25vdyINCmFmcm9iYXJvbWV0ZXJfMjAxNSRRODFDW2Fmcm9iYXJvbWV0ZXJfMjAxNSRRODFDID09ICJTb21lIG90aGVyIGZhY3RvciJdIDwtICJPdGhlciwgbm9uZSBvZiB0aGVzZVxub3IgZG9uJ3Qga25vdyINCiMgRGVsZXRpbmcgIk1pc3NpbmciIGFuZCAiTm90IEFza2VkIiANCmFmcm9iYXJvbWV0ZXJfMjAxNSA8LSBhZnJvYmFyb21ldGVyXzIwMTVbYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUMgIT0gIk1pc3NpbmciLF0NCmFmcm9iYXJvbWV0ZXJfMjAxNSA8LSBhZnJvYmFyb21ldGVyXzIwMTVbYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUMgIT0gIk5vdCBBc2tlZCBpbiB0aGlzIENvdW50cnkiLF0NCiMgQ2hhbmdpbmcgdGhlIGNvbHVtbiBiYWNrIHRvIGEgZmFjdG9yIHNvIHdlIGNhbiBvcmRlciB0aGUgZmFjdG9ycyBtZWFuaW5nZnVsbHkgDQojIGZvciB0aGUgcHVycG9zZXMgb2YgcGxvdHRpbmcNCmFmcm9iYXJvbWV0ZXJfMjAxNSRRODFDIDwtIGFzLmZhY3RvcihhZnJvYmFyb21ldGVyXzIwMTUkUTgxQykNCiNhZnJvYmFyb21ldGVyXzIwMTUkUTgxQyA8LSBmYWN0b3IoYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUMsIGxldmVscyhhZnJvYmFyb21ldGVyXzIwMTUkUTgxQylbYyg1LCAzLCAyLCA0LCA2LCAxKV0pDQp0YWJsZShhZnJvYmFyb21ldGVyXzIwMTUkUTgxQykNCmBgYA0KDQpgYGB7cn0NCmFmcm9iYXJvbWV0ZXJfUTgxQ19wbG90IDwtIGdncGxvdChkYXRhID0gYWZyb2Jhcm9tZXRlcl8yMDE1KSArIGdndGl0bGUoIlE4MUMiKQ0KYWZyb2Jhcm9tZXRlcl9RODFDX3Bsb3QgPC0gYWZyb2Jhcm9tZXRlcl9RODFDX3Bsb3QgKyBnZW9tX2JhcihhZXMoeCA9IFE4MUMpKSArIGNvb3JkX2ZsaXAoKQ0KYWZyb2Jhcm9tZXRlcl9RODFDX3Bsb3QNCmBgYA0KDQpRdWVzdGlvbiA4MUQgbXVuZ2luZw0KDQpgYGB7cn0NCiMgQ29udmVydCB0aGUgY29sdW1uIGZyb20gYSBmYWN0b3IgdG8gYSBjaGFyYWN0ZXIgdmVjdG9yDQphZnJvYmFyb21ldGVyXzIwMTUkUTgxRCA8LSBhcy5jaGFyYWN0ZXIoYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUQpDQojIE1ha2luZyAiRG9uJ3Qga25vdyAvIEhhdmVuJ3QgaGVhcmQgZW5vdWdoIiBzaG9ydGVyDQphZnJvYmFyb21ldGVyXzIwMTUkUTgxRFthZnJvYmFyb21ldGVyXzIwMTUkUTgxRCA9PSAiRG9uJ3Qga25vdyAvIEhhdmVuJ3QgaGVhcmQgZW5vdWdoIl0gPC0gIk90aGVyLCBub25lIG9mIHRoZXNlXG5vciBkb24ndCBrbm93Ig0KYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MURbYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUQgPT0gIk5vbmUgb2YgdGhlc2UiXSA8LSAiT3RoZXIsIG5vbmUgb2YgdGhlc2Vcbm9yIGRvbid0IGtub3ciDQojIENoYW5naW5nIGEgZmV3IGludG8gInR3by1saW5lIiBmYWN0b3JzIHNvIHRoZXkgZml0IGJldHRlciBpbiB0aGUgcGxvdA0KYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MURbYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUQgPT0gIkNoaW5hJ3MgZXh0cmFjdGlvbiBvZiByZXNvdXJjZXMgZnJvbSBBZnJpY2EiXSA8LSAiQ2hpbmEncyBleHRyYWN0aW9uIG9mIFxuIHJlc291cmNlcyBmcm9tIEFmcmljYSINCmFmcm9iYXJvbWV0ZXJfMjAxNSRRODFEW2Fmcm9iYXJvbWV0ZXJfMjAxNSRRODFEID09ICJMYW5kIGdyYWJiaW5nIGJ5IENoaW5lc2UgaW5kaXZpZHVhbHMgb3IgYnVzaW5lc3NlcyJdIDwtICJMYW5kIGdyYWJiaW5nIGJ5IENoaW5lc2VcbmluZGl2aWR1YWxzIG9yIGJ1c2luZXNzZXMiDQphZnJvYmFyb21ldGVyXzIwMTUkUTgxRFthZnJvYmFyb21ldGVyXzIwMTUkUTgxRCA9PSAiQ2hpbmEncyB3aWxsaW5nbmVzcyB0byBjb29wZXJhdGUgd2l0aCB1bmRlbW9jcmF0aWMgcnVsZXJzIl0gPC0gIk90aGVyLCBub25lIG9mIHRoZXNlXG5vciBkb24ndCBrbm93Ig0KYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MURbYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUQgPT0gIlRha2luZyBqb2JzIG9yIGJ1c2luZXNzIGZyb20gdGhlIGxvY2FscyJdIDwtICJUYWtpbmcgam9icyBvciBidXNpbmVzc1xuZnJvbSB0aGUgbG9jYWxzIg0KYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MURbYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUQgPT0gIlRoZSBxdWFsaXR5IG9mIENoaW5lc2UgcHJvZHVjdHMiXSA8LSAiVGhlIHF1YWxpdHkgb2YgXG4gQ2hpbmVzZSBwcm9kdWN0cyINCmFmcm9iYXJvbWV0ZXJfMjAxNSRRODFEW2Fmcm9iYXJvbWV0ZXJfMjAxNSRRODFEID09ICJUaGUgYmVoYXZpb3Igb2YgQ2hpbmVzZSBjaXRpemVucyBpbiB0aGUgY291bnRyeSJdIDwtICJUaGUgYmVoYXZpb3Igb2YgQ2hpbmVzZVxuY2l0aXplbnMgaW4gdGhlIGNvdW50cnkiDQphZnJvYmFyb21ldGVyXzIwMTUkUTgxRFthZnJvYmFyb21ldGVyXzIwMTUkUTgxRCA9PSAiU29tZSBvdGhlciBmYWN0b3IiXSA8LSAiT3RoZXIsIG5vbmUgb2YgdGhlc2Vcbm9yIGRvbid0IGtub3ciDQojIERlbGV0aW5nICJNaXNzaW5nIiBhbmQgIk5vdCBBc2tlZCIgDQphZnJvYmFyb21ldGVyXzIwMTUgPC0gYWZyb2Jhcm9tZXRlcl8yMDE1W2Fmcm9iYXJvbWV0ZXJfMjAxNSRRODFEICE9ICJNaXNzaW5nIixdDQphZnJvYmFyb21ldGVyXzIwMTUgPC0gYWZyb2Jhcm9tZXRlcl8yMDE1W2Fmcm9iYXJvbWV0ZXJfMjAxNSRRODFEICE9ICJOb3QgQXNrZWQgaW4gdGhpcyBDb3VudHJ5IixdDQojIENoYW5naW5nIHRoZSBjb2x1bW4gYmFjayB0byBhIGZhY3RvciBzbyB3ZSBjYW4gb3JkZXIgdGhlIGZhY3RvcnMgbWVhbmluZ2Z1bGx5IA0KIyBmb3IgdGhlIHB1cnBvc2VzIG9mIHBsb3R0aW5nDQphZnJvYmFyb21ldGVyXzIwMTUkUTgxRCA8LSBhcy5mYWN0b3IoYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUQpDQojYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUQgPC0gZmFjdG9yKGFmcm9iYXJvbWV0ZXJfMjAxNSRRODFELCBsZXZlbHMoYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUQpW2MoMSwgNCwgNywgOCwgOSwgMiwgNiwgNSwgMyldKQ0KdGFibGUoYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUQpDQpgYGANCg0KYGBge3J9DQphZnJvYmFyb21ldGVyX1E4MURfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGFmcm9iYXJvbWV0ZXJfMjAxNSkgKyBnZ3RpdGxlKCJRODFEIikNCmFmcm9iYXJvbWV0ZXJfUTgxRF9wbG90IDwtIGFmcm9iYXJvbWV0ZXJfUTgxRF9wbG90ICsgZ2VvbV9iYXIoYWVzKHggPSBRODFEKSkgKyBjb29yZF9mbGlwKCkNCmFmcm9iYXJvbWV0ZXJfUTgxRF9wbG90DQpgYGANCg0KUXVlc3Rpb24gODFFIG11bmdpbmcNCg0KYGBge3J9DQojIENvbnZlcnQgdGhlIGNvbHVtbiBmcm9tIGEgZmFjdG9yIHRvIGEgY2hhcmFjdGVyIHZlY3Rvcg0KYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUUgPC0gYXMuY2hhcmFjdGVyKGFmcm9iYXJvbWV0ZXJfMjAxNSRRODFFKQ0KIyBNYWtpbmcgIkRvbid0IGtub3cgLyBIYXZlbid0IGhlYXJkIGVub3VnaCIgc2hvcnRlcg0KYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUVbYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUUgPT0gIkRvbid0IGtub3cgLyBIYXZlbid0IGhlYXJkIGVub3VnaCJdIDwtICJPdGhlciBvclxuZG9uJ3Qga25vdyINCiMgQ2hhbmdpbmcgYSBmZXcgaW50byAidHdvLWxpbmUiIGZhY3RvcnMgc28gdGhleSBmaXQgYmV0dGVyIGluIHRoZSBwbG90DQphZnJvYmFyb21ldGVyXzIwMTUkUTgxRVthZnJvYmFyb21ldGVyXzIwMTUkUTgxRSA9PSAiVmVyeSBiYWQgam9iIl0gPC0gIlZlcnkgXG4gYmFkIGpvYiINCmFmcm9iYXJvbWV0ZXJfMjAxNSRRODFFW2Fmcm9iYXJvbWV0ZXJfMjAxNSRRODFFID09ICJTb21ld2hhdCBiYWQgam9iIl0gPC0gIlNvbWV3aGF0IFxuIGJhZCBqb2IiDQphZnJvYmFyb21ldGVyXzIwMTUkUTgxRVthZnJvYmFyb21ldGVyXzIwMTUkUTgxRSA9PSAiTmVpdGhlciBnb29kIG5vciBiYWQgam9iIl0gPC0gIk5laXRoZXIgZ29vZCBcbiBub3IgYmFkIGpvYiINCmFmcm9iYXJvbWV0ZXJfMjAxNSRRODFFW2Fmcm9iYXJvbWV0ZXJfMjAxNSRRODFFID09ICJTb21ld2hhdCBnb29kIGpvYiJdIDwtICJTb21ld2hhdCBcbiBnb29kIGpvYiINCmFmcm9iYXJvbWV0ZXJfMjAxNSRRODFFW2Fmcm9iYXJvbWV0ZXJfMjAxNSRRODFFID09ICJWZXJ5IGdvb2Qgam9iIl0gPC0gIlZlcnkgXG4gZ29vZCBqb2IiDQphZnJvYmFyb21ldGVyXzIwMTUkUTgxRVthZnJvYmFyb21ldGVyXzIwMTUkUTgxRSA9PSAiQ2hpbmEgZG9lc24ndCBnaXZlIGRldmVsb3BtZW50IGFzc2lzdGFuY2UgdG8gdGhlIGNvdW50cnkiXSA8LSAiT3RoZXIgb3JcbmRvbid0IGtub3ciDQojIERlbGV0aW5nICJNaXNzaW5nIiBhbmQgIk5vdCBBc2tlZCIgDQphZnJvYmFyb21ldGVyXzIwMTUgPC0gYWZyb2Jhcm9tZXRlcl8yMDE1W2Fmcm9iYXJvbWV0ZXJfMjAxNSRRODFFICE9ICJNaXNzaW5nIixdDQphZnJvYmFyb21ldGVyXzIwMTUgPC0gYWZyb2Jhcm9tZXRlcl8yMDE1W2Fmcm9iYXJvbWV0ZXJfMjAxNSRRODFFICE9ICJOb3QgQXNrZWQgaW4gdGhpcyBDb3VudHJ5IixdDQphZnJvYmFyb21ldGVyXzIwMTUgPC0gYWZyb2Jhcm9tZXRlcl8yMDE1W2Fmcm9iYXJvbWV0ZXJfMjAxNSRRODFFICE9ICJSZWZ1c2VkIixdDQojIENoYW5naW5nIHRoZSBjb2x1bW4gYmFjayB0byBhIGZhY3RvciBzbyB3ZSBjYW4gb3JkZXIgdGhlIGZhY3RvcnMgbWVhbmluZ2Z1bGx5IA0KIyBmb3IgdGhlIHB1cnBvc2VzIG9mIHBsb3R0aW5nDQphZnJvYmFyb21ldGVyXzIwMTUkUTgxRSA8LSBhcy5mYWN0b3IoYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUUpDQojYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUMgPC0gZmFjdG9yKGFmcm9iYXJvbWV0ZXJfMjAxNSRRODFDLCBsZXZlbHMoYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUMpW2MoNSwgMywgMiwgNCwgNiwgMSldKQ0KdGFibGUoYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUUpDQpgYGANCg0KYGBge3J9DQphZnJvYmFyb21ldGVyX1E4MUVfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGFmcm9iYXJvbWV0ZXJfMjAxNSkgKyBnZ3RpdGxlKCJRODFFIikNCmFmcm9iYXJvbWV0ZXJfUTgxRV9wbG90IDwtIGFmcm9iYXJvbWV0ZXJfUTgxRV9wbG90ICsgZ2VvbV9iYXIoYWVzKHggPSBRODFFKSkgKyBjb29yZF9mbGlwKCkNCmFmcm9iYXJvbWV0ZXJfUTgxRV9wbG90DQpgYGANCg0KYGBge3J9DQp0YWJsZShhZnJvYmFyb21ldGVyXzIwMTUkQ09VTlRSWSkNCmBgYA0KDQoNCmBgYHtyfQ0KIyBSZW5hbWluZyAiQ290ZSBkJ0l2b2lyZSIgdG8gIkPDtHRlIGQnSXZvaXJlIg0KYWZyb2Jhcm9tZXRlcl8yMDE1JENPVU5UUlkgPC0gYXMuY2hhcmFjdGVyKGFmcm9iYXJvbWV0ZXJfMjAxNSRDT1VOVFJZKQ0KYWZyb2Jhcm9tZXRlcl8yMDE1JENPVU5UUllbYWZyb2Jhcm9tZXRlcl8yMDE1JENPVU5UUlkgPT0gIkNvdGUgZCdJdm9pcmUiXSA8LSAiQ8O0dGUgZCdJdm9pcmUiDQp0YWJsZShhZnJvYmFyb21ldGVyXzIwMTUkQ09VTlRSWSkNCmBgYA0KDQpTY29yaW5nIHRoZSBhbnN3ZXJzIGZvciBsYXRlciB1c2UgaW4gYSBjaG9yb3BsZXRoIG1hcA0KDQpgYGB7cn0NCiMgIlNjb3JpbmciIFE4MUEgYW5zd2Vycw0KUTgxQV9zY29yZV9mdW5jdGlvbiA8LSBmdW5jdGlvbihhbnN3ZXIpIHtzd2l0Y2goYW5zd2VyLCAiTm9uZSIgPSAtMiwgIkEgbGl0dGxlIiA9IC0xLCAiU29tZSIgPSAxLCAiQSBsb3QiID0gMiwgIkRvbid0IGtub3ciID0gMCl9DQphZnJvYmFyb21ldGVyXzIwMTUkUTgxQV9zY29yZSA8LSBzYXBwbHkoYXMuY2hhcmFjdGVyKGFmcm9iYXJvbWV0ZXJfMjAxNSRRODFBKSwgUTgxQV9zY29yZV9mdW5jdGlvbikgI0FwcGx5aW5nIFE4MV9zY29yZV9mdW5jdGlvbiB0byBRODFBIHZlY3Rvcg0KIyAiU2NvcmluZyIgUTgxQiBhbnN3ZXJzDQpRODFCX3Njb3JlX2Z1bmN0aW9uIDwtIGZ1bmN0aW9uKGFuc3dlcikge3N3aXRjaChhbnN3ZXIsICJWZXJ5IFxuIG5lZ2F0aXZlIiA9IC0yLCAiU29tZXdoYXQgXG4gbmVnYXRpdmUiID0gLTEsICJTb21ld2hhdCBcbiBwb3NpdGl2ZSIgPSAxLCAiVmVyeSBcbiBwb3NpdGl2ZSIgPSAyLCAiRG9uJ3Qga25vdyIgPSAwLCAiTmVpdGhlciBwb3NpdGl2ZSBcbiBub3IgbmVnYXRpdmUiID0gMCl9DQphZnJvYmFyb21ldGVyXzIwMTUkUTgxQl9zY29yZSA8LSBzYXBwbHkoYXMuY2hhcmFjdGVyKGFmcm9iYXJvbWV0ZXJfMjAxNSRRODFCKSwgUTgxQl9zY29yZV9mdW5jdGlvbikgI0FwcGx5aW5nIFE4MV9zY29yZV9mdW5jdGlvbiB0byBRODFBIHZlY3Rvcg0KDQojICJTY29yaW5nIiBRODFFIGFuc3dlcnMNClE4MUVfc2NvcmVfZnVuY3Rpb24gPC0gZnVuY3Rpb24oYW5zd2VyKSB7c3dpdGNoKGFuc3dlciwgIlZlcnkgXG4gYmFkIGpvYiIgPSAtMiwgIlNvbWV3aGF0IFxuIGJhZCBqb2IiID0gLTEsICJTb21ld2hhdCBcbiBnb29kIGpvYiIgPSAxLCAiVmVyeSBcbiBnb29kIGpvYiIgPSAyLCAiT3RoZXIgb3JcbmRvbid0IGtub3ciID0gMCwgIk5laXRoZXIgZ29vZCBcbiBub3IgYmFkIGpvYiIgPSAwKX0NCmFmcm9iYXJvbWV0ZXJfMjAxNSRRODFFX3Njb3JlIDwtIHNhcHBseShhcy5jaGFyYWN0ZXIoYWZyb2Jhcm9tZXRlcl8yMDE1JFE4MUUpLCBRODFFX3Njb3JlX2Z1bmN0aW9uKSAjQXBwbHlpbmcgUTgxX3Njb3JlX2Z1bmN0aW9uIHRvIFE4MUUgdmVjdG9yDQpgYGANCg0KV3JpdGluZyB0byBjc3YNCg0KYGBge3J9DQp3cml0ZS5jc3YoYWZyb2Jhcm9tZXRlcl8yMDE1WywgYygiQ09VTlRSWSIsICJRODFBIiwgIlE4MUIiLCAiUTgxQyIsICJRODFEIiwgIlE4MUUiLCAiUTgxQV9zY29yZSIsICJRODFCX3Njb3JlIiwgIlE4MUVfc2NvcmUiKV0sIGZpbGUgPSAiYWZyb2Jhcm9tZXRlcl8yMDE1X1E4MS5jc3YiLCBmaWxlRW5jb2RpbmcgPSAiVVRGLTgiKQ0KYGBg