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