Required packages

Provide the packages required to reproduce the report. Make sure you fulfilled the minimum requirement #10.

# This is the R chunk for the required packages
library(readr)
library(xlsx)
library(readxl)
library(forcats)
library(foreign)
library(gdata)
library(rvest)
library(dplyr)
library(tidyr)
library(deductive)
library(validate)
library(Hmisc)
library(stringr)
library(lubridate)
library(ggplot2)
library(knitr)

Executive Summary

Data

A clear description of data sets, their sources, and variable descriptions should be provided. In this section, you must also provide the R codes with outputs (head of data sets) that you used to import/read/scrape the data set. You need to fulfil the minimum requirement #1 and merge at least two data sets to create the one you are going to work on. In addition to the R codes and outputs, you need to explain the steps that you have taken.

The two data sets relate to voting results in the 2019 Australian federal election, and 2019 Australian Bureau of Statistics data on household income, household ownership, and rent and mortgage costs. Both data sets are grouped by federal electorate geographical areas. The election results are on a two party preferred basis, minor parties are not included.

There are a total of 17 variables and 151 observations.

The variables are as follows: electorate - electorate name DivisionID - unique ID number for each electorate (allocated by the Aust. Electorate Commission) StateAB - Australian State abbreviation PartyAB - Political party abbreviation. ALP = Aust. Labor Party; LP = Liberal Party; NP = National Party; LNP = Liberal National Party (Amalgamation of Liberal Party and National Party in QLD) Liberal/National Coalition Votes Liberal/National Coalition Percentage Australian Labor Party Votes Australian Labor Party Percentage TotalVotes - Total number of votes cast in the electorate Swing - Percentage swing for winning party from previous election yes_votes - tally of yes votes yes_percentage - of total legible votes no_votes - tally of no votes no_percentage - of total legible votes total_votes - tally of legible votes difference - percentage difference between yes and no. Positive value is yes, negative value is no.

The election result data set was retrieved from the Australian Electoral Commission website: https://results.aec.gov.au/24310/Website/HouseDownloadsMenu-24310-Csv.htm

The marriage equality plebiscite data set was retrieved from the Australian Bureau of Statistics website: https://www.abs.gov.au/AUSSTATS/abs@.nsf/DetailsPage/1800.02017?OpenDocument

# This is the R chunk for the Data Section

tpp1 <- read_csv("HouseTppByDivisionDownload-24310.csv", skip=1)
Parsed with column specification:
cols(
  DivisionNm = col_character(),
  DivisionID = col_double(),
  StateAb = col_character(),
  PartyAb = col_character(),
  `Liberal/National Coalition Votes` = col_double(),
  `Liberal/National Coalition Percentage` = col_double(),
  `Australian Labor Party Votes` = col_double(),
  `Australian Labor Party Percentage` = col_double(),
  TotalVotes = col_double(),
  Swing = col_double()
)
head(tpp1)
marriage1 <- read_excel("australian_marriage_law_postal_survey_2017_-_response_final.xls", sheet=3, skip= 5)
New names:
* `` -> ...1
* `` -> ...3
* `` -> ...5
* Total -> Total...6
* `` -> ...7
* ...
head(marriage1)
marriage2 <- rename(marriage1, electorate =...1, yes_votes = Yes, yes_percentage=...3, no_votes= No, no_percentage = ...5, total_votes = Total...6, total_percentage = ...7)
head(marriage2)
tpp2 <- rename(tpp1,electorate=DivisionNm)
head(tpp2)
marriage3 <- marriage2 %>% select(electorate,yes_votes,yes_percentage,no_votes,no_percentage,total_votes)
voting1 <- tpp2 %>% left_join(marriage3)
Joining, by = "electorate"
head(voting1)

Understand

Summarise the types of variables and data structures, check the attributes in the data and apply proper data type conversions. In addition to the R codes and outputs, explain briefly the steps that you have taken. In this section, show that you have fulfilled minimum requirements 2-4.

There is a mix of variables, including characters, factors and numerical.

Both StateAb and PartyAb were imported as character variables. These were assigned as factors. The marriage equality plebiscite data was imported as characters, so these were re-assigned as numerical variables.

Tidy & Manipulate Data I

The data base had branched variables, with the ‘no’ header including both vote tally and proportion. To ensure tidy data, the data was imported with the branch headers dropped. The variables then were renamed to ensure accuracy and consistency.

# This is the R chunk for the Tidy & Manipulate Data I 

Tidy & Manipulate Data II

So as to more easily assess the difference in levels of support for marriage equality, a new variable was created - difference. This took the yes_proportion and subtracted the no_proportion. A positive value indicated majority support for marriage equality, while a negative value indicated minority, with the proportional difference between the two being the numerical value. This variable will later aid analysis when looking into the relationship between political party support and marriage equality support, and the level of such support.

Scan I

The data was scanned for missing data. There are 11 observations with all data missing relating to the marriage equality plebiscite. It constitutes 7.28% of the total 151 observations. Furthermore, nine of the eleven were seats help by the ALP, with one each held by the NP and LP. All three electorates in the ACT have plebiscite data missing, one of the NT’s two seats, five of Victoria’s thirty-eight seats, and one of SA’s ten seats.

This is data set is to be used in an analysis to see if there is a relationship between support for marriage equality in the 2017 plebiscite, and voting support for particular political parties in the 2019 federal election. Therefore, more analysis is needed before action is taken. If the missing values were re-coded with median values or other values this could impact analysis results. The decision was made to leave the missing data as NA until more analysis was undertaken. Such analysis might include analysing the support for marriage equality in electorates with comparable political party support, or other metrics.

# This is the R chunk for the Scan I

colSums(is.na(voting2))
                           electorate                            DivisionID 
                                    0                                     0 
                              StateAb                               PartyAb 
                                    0                                     0 
     Liberal/National Coalition Votes Liberal/National Coalition Percentage 
                                    0                                     0 
         Australian Labor Party Votes     Australian Labor Party Percentage 
                                    0                                     0 
                           TotalVotes                                 Swing 
                                    0                                     0 
                            yes_votes                        yes_percentage 
                                   11                                    11 
                             no_votes                         no_percentage 
                                   11                                    11 
                          total_votes                            difference 
                                   11                                    11 

Scan II

Several univariate scans were undertaken to check for outliers. There were no obvious outliers except for one observation of the variable ‘swing’. The Whitlam electorate observation had a swing value of 39%. Considering the other outliers were in the 11-12% range this was a significant outlier that required investigation. Upon researching the previous election result, for which swing is derived from in relation to the most recent election, it was found that in the previous election a Liberal party candidate had run but not in this election, hence the swing figure was not an accurate reflection, as the was no Liberal candidate for voters to swing against. The decision was made to change this observation to NA, and remove it for calculations. It was changed to NA so as to not alter other calculations and analysis.

# This is the R chunk for the Scan II

voting2$difference %>% boxplot(main="Box Plot of support difference for marriage equality", ylab="support difference", col="grey")


voting2$Swing %>% boxplot(main="Box Plot of winning party swing", ylab="swing", col="grey")


voting2$yes_percentage %>% boxplot(main="Box plot of Marriage equality plebiscite yes vote by electorate", ylab= "proportion", col="grey")


voting2$`Liberal/National Coalition Percentage` %>% boxplot(main="Box plot of LNP vote percentage by electorate", ylab= "vote percentage", col="grey")


voting2$`Australian Labor Party Percentage` %>% boxplot(main="Box plot of Labor vote percentage by electorate", ylab= "vote percentage", col="grey")


voting2$Swing[148] <- NA

Transform

Several variables were checked for distribution skew. The yes percentage variable had a mild left skew. The mathematical operation of a square root transformation was used at it was a left skew. The resulting object, trans_yes1, has a much reduced skew.

# This is the R chunk for the Transform Section

voting2$`Australian Labor Party Percentage` %>% hist(xlab="labor percentage", main = "labor support", col = "grey" )


voting2$yes_percentage %>% hist(xlab="yes percentage", main = "yes support by electorate", col="grey")


trans_yes1 <- voting2$yes_percentage^2
hist(trans_yes1)

NA
NA

NOTE: Note that sometimes the order of the tasks may be different than the order given here. For example, you may need to tidy the data sets first to be able to create the common key to merge. Therefore, for such cases you may have a different ordering of the sections. 

Any further or optional pre-processing tasks can be added to the template using an additional section in the R Markdown file. Make sure your code is visible (within the margin of the page). Do not use View() to show your data, instead give headers (using head() )



LS0tCnRpdGxlOiAiTUFUSDIzNDkgRGF0YSBXcmFuZ2xpbmciCmF1dGhvcjogR2F2aW4gSGVpZ2h0IDM4NzM5NTkKc3VidGl0bGU6IEFzc2lnbm1lbnQgMgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAotLS0KCgoKIyMgUmVxdWlyZWQgcGFja2FnZXMgCgoKUHJvdmlkZSB0aGUgcGFja2FnZXMgcmVxdWlyZWQgdG8gcmVwcm9kdWNlIHRoZSByZXBvcnQuIE1ha2Ugc3VyZSB5b3UgZnVsZmlsbGVkIHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50ICMxMC4KCmBgYHtyfQojIFRoaXMgaXMgdGhlIFIgY2h1bmsgZm9yIHRoZSByZXF1aXJlZCBwYWNrYWdlcwpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHhsc3gpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGZvcmNhdHMpCmxpYnJhcnkoZm9yZWlnbikKbGlicmFyeShnZGF0YSkKbGlicmFyeShydmVzdCkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShkZWR1Y3RpdmUpCmxpYnJhcnkodmFsaWRhdGUpCmxpYnJhcnkoSG1pc2MpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShrbml0cikKYGBgCgoKIyMgRXhlY3V0aXZlIFN1bW1hcnkgCgotIFRoaXMgZGF0YSBzZXQgd2FzIHByZXByb2Nlc3NlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgdW5kZXJ0YWtpbmcgYW5hbHlzaXMgdG8gc2VlIGlmIHRoZXJlIGlzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gZWxlY3Rpb24gcmVzdWx0cyBvZiBBdXN0cmFsaWFuIHBvbGl0aWNhbCBwYXJ0aWVzIGluIHRoZSAyMDE5IGZlZGVyYWwgZWxlY3Rpb24gYW5kIHZvdGluZyByZXN1bHRzIGZvciB0aGUgMjAxNyBtYXJyaWFnZSBlcXVhbGl0eSBwbGViaXNjaXRlLgoKLSBUd28gZGF0YSBzZXRzIHdlcmUgbWVyZ2VkLCBvbmUgc2hvd2luZyB2b3RpbmcgcmVzdWx0cyBmb3IgdGhlIDIwMTkgQXVzdHJhbGlhbiBGZWRlcmFsIEVsZWN0aW9uIG9mIHRoZSBIb3VzZSBvZiBSZXByZXNlbnRhdGl2ZXMsIHRoZSBvdGhlciBzaG93aW5nIHRoZSB2b3RpbmcgcmVzdWx0cyBvZiB0aGUgMjAxNyBBdXN0cmFsaWFuIHBsZWJpc2NpdGUgb24gbWFycmlhZ2UgZXF1YWxpdHkgYnkgSG91c2Ugb2YgUmVwcmVzZW50YXRpdmUgZWxlY3RvcmF0ZXMuIFRoZSB0d28gZGF0YSBzZXRzIHdlcmUgbWVyZ2VkLCB2YXJpYWJsZXMgYXNzaWduZWQgY29ycmVjdGx5IGFuZCBkYXRhIHdhcyB0aWRpZWQuIEEgbmV3IHZhcmlhYmxlIHdhcyBhZGRlZCB0byBtb3JlIGVhc2lseSBzZWUgaG93IGFuIGVsZWN0b3JhdGUgdm90ZWQgaW4gdGhlIHBsZWJpc2NpdGUuCgotICAxMSBvYnNlcnZhdGlvbnMgd2VyZSBmb3VuZCB0byBiZSBtaXNzaW5nIHZhbHVlcyBmb3IgcGxlYmlzY2l0ZSBkYXRhIHZhcmlhYmxlcy4gVGhlc2Ugd2VyZSBsZWZ0IGFzIE5BIGFzIDkgb3V0IG9mIDExIG9mIHRoZW0gd2VyZSBpbiBlbGVjdG9yYXRlcyB3b24gYnkgdGhlIExhYm9yIHBhcnR5IGFuZCByZS1jb2Rpbmcgd2l0aCBtZWRpYW4gdmFsdWVzIG9yIG90aGVyd2lzZSBtYXkgYmlhcyBhbmFseXNpcyByZXN1bHRzLiBNb3JlIGludmVzdGlnYXRpb24gaXMgbmVlZGVkIGJlZm9yZSBwb3RlbnRpYWwgZnVydGhlciBhY3Rpb24gaXMgdGFrZW4uCgotICBPbmUgc2lnbmlmaWNhbnQgb3V0bGllciB3YXMgZm91bmQgaW4gdGhlIHN3aW5nIHZhcmlhYmxlLiBUaGlzIHdhcyBpbnZlc3RpZ2F0ZWQgYW5kIGZvdW5kIHRvIGJlIGR1ZSB0byBubyBMaWJlcmFsIHBhcnR5IGNhbmRpZGF0ZSBydW5uaW5nIGluIHRoZSAyMDE5IGVsZWN0aW9uLiBUaGlzIHZhbHVlIHdhcyByZS1jb2RlZCB0byBOQSB0byBwcmV2ZW50IGl0IGltcGFjdGluZyBhbmFseXNpcyByZXN1bHRzLgoKLSAgVGhlIHZhbHVlcyBvZiB0aGUgdmFyaWFibGUsICdwZXJjZW50YWdlIG9mIHllcyBzdXBwb3J0JywgaGFkIGEgbWlsZCBsZWZ0IHNrZXcuIEEgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbiBvZiBhIHNxdWFyZSByb290IHdhcyB1c2VkIHRvIGNvcnJlY3QgdGhlIHNrZXcuCgoKIyMgRGF0YSAKCkEgY2xlYXIgZGVzY3JpcHRpb24gb2YgZGF0YSBzZXRzLCB0aGVpciBzb3VyY2VzLCBhbmQgdmFyaWFibGUgZGVzY3JpcHRpb25zIHNob3VsZCBiZSBwcm92aWRlZC4gSW4gdGhpcyBzZWN0aW9uLCB5b3UgbXVzdCBhbHNvIHByb3ZpZGUgdGhlIFIgY29kZXMgd2l0aCBvdXRwdXRzIChoZWFkIG9mIGRhdGEgc2V0cykgdGhhdCB5b3UgdXNlZCB0byBpbXBvcnQvcmVhZC9zY3JhcGUgdGhlIGRhdGEgc2V0LiBZb3UgbmVlZCB0byBmdWxmaWwgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnQgIzEgYW5kIG1lcmdlIGF0IGxlYXN0IHR3byBkYXRhIHNldHMgdG8gY3JlYXRlIHRoZSBvbmUgeW91IGFyZSBnb2luZyB0byB3b3JrIG9uLiBJbiBhZGRpdGlvbiB0byB0aGUgUiBjb2RlcyBhbmQgb3V0cHV0cywgeW91IG5lZWQgdG8gZXhwbGFpbiB0aGUgc3RlcHMgdGhhdCB5b3UgaGF2ZSB0YWtlbi4KClRoZSB0d28gZGF0YSBzZXRzIHJlbGF0ZSB0byB2b3RpbmcgcmVzdWx0cyBpbiB0aGUgMjAxOSBBdXN0cmFsaWFuIGZlZGVyYWwgZWxlY3Rpb24sIGFuZCAyMDE5IEF1c3RyYWxpYW4gQnVyZWF1IG9mIFN0YXRpc3RpY3MgZGF0YSBvbiBob3VzZWhvbGQgaW5jb21lLCBob3VzZWhvbGQgb3duZXJzaGlwLCBhbmQgcmVudCBhbmQgbW9ydGdhZ2UgY29zdHMuIEJvdGggZGF0YSBzZXRzIGFyZSBncm91cGVkIGJ5IGZlZGVyYWwgZWxlY3RvcmF0ZSBnZW9ncmFwaGljYWwgYXJlYXMuClRoZSBlbGVjdGlvbiByZXN1bHRzIGFyZSBvbiBhIHR3byBwYXJ0eSBwcmVmZXJyZWQgYmFzaXMsIG1pbm9yIHBhcnRpZXMgYXJlIG5vdCBpbmNsdWRlZC4KClRoZXJlIGFyZSBhIHRvdGFsIG9mIDE3IHZhcmlhYmxlcyBhbmQgMTUxIG9ic2VydmF0aW9ucy4KClRoZSB2YXJpYWJsZXMgYXJlIGFzIGZvbGxvd3M6CmVsZWN0b3JhdGUgLSBlbGVjdG9yYXRlIG5hbWUKRGl2aXNpb25JRCAtIHVuaXF1ZSBJRCBudW1iZXIgZm9yIGVhY2ggZWxlY3RvcmF0ZSAoYWxsb2NhdGVkIGJ5IHRoZSBBdXN0LiBFbGVjdG9yYXRlIENvbW1pc3Npb24pClN0YXRlQUIgLSBBdXN0cmFsaWFuIFN0YXRlIGFiYnJldmlhdGlvbgpQYXJ0eUFCIC0gUG9saXRpY2FsIHBhcnR5IGFiYnJldmlhdGlvbi4gQUxQID0gQXVzdC4gTGFib3IgUGFydHk7IExQID0gTGliZXJhbCBQYXJ0eTsgTlAgPSBOYXRpb25hbCBQYXJ0eTsgTE5QID0gTGliZXJhbCBOYXRpb25hbCBQYXJ0eSAoQW1hbGdhbWF0aW9uIG9mIExpYmVyYWwgUGFydHkgYW5kIE5hdGlvbmFsIFBhcnR5IGluIFFMRCkKTGliZXJhbC9OYXRpb25hbCBDb2FsaXRpb24gVm90ZXMKTGliZXJhbC9OYXRpb25hbCBDb2FsaXRpb24gUGVyY2VudGFnZQpBdXN0cmFsaWFuIExhYm9yIFBhcnR5IFZvdGVzCkF1c3RyYWxpYW4gTGFib3IgUGFydHkgUGVyY2VudGFnZQpUb3RhbFZvdGVzIC0gVG90YWwgbnVtYmVyIG9mIHZvdGVzIGNhc3QgaW4gdGhlIGVsZWN0b3JhdGUKU3dpbmcgLSBQZXJjZW50YWdlIHN3aW5nIGZvciB3aW5uaW5nIHBhcnR5IGZyb20gcHJldmlvdXMgZWxlY3Rpb24KeWVzX3ZvdGVzIC0gdGFsbHkgb2YgeWVzIHZvdGVzCnllc19wZXJjZW50YWdlIC0gb2YgdG90YWwgbGVnaWJsZSB2b3Rlcwpub192b3RlcyAtIHRhbGx5IG9mIG5vIHZvdGVzCm5vX3BlcmNlbnRhZ2UgLSBvZiB0b3RhbCBsZWdpYmxlIHZvdGVzCnRvdGFsX3ZvdGVzIC0gdGFsbHkgb2YgbGVnaWJsZSB2b3RlcwpkaWZmZXJlbmNlIC0gcGVyY2VudGFnZSBkaWZmZXJlbmNlIGJldHdlZW4geWVzIGFuZCBuby4gUG9zaXRpdmUgdmFsdWUgaXMgeWVzLCBuZWdhdGl2ZSB2YWx1ZSBpcyBuby4KCgoKClRoZSBlbGVjdGlvbiByZXN1bHQgZGF0YSBzZXQgd2FzIHJldHJpZXZlZCBmcm9tIHRoZSBBdXN0cmFsaWFuIEVsZWN0b3JhbCBDb21taXNzaW9uIHdlYnNpdGU6Cmh0dHBzOi8vcmVzdWx0cy5hZWMuZ292LmF1LzI0MzEwL1dlYnNpdGUvSG91c2VEb3dubG9hZHNNZW51LTI0MzEwLUNzdi5odG0KClRoZSBtYXJyaWFnZSBlcXVhbGl0eSBwbGViaXNjaXRlIGRhdGEgc2V0IHdhcyByZXRyaWV2ZWQgZnJvbSB0aGUgQXVzdHJhbGlhbiBCdXJlYXUgb2YgU3RhdGlzdGljcyB3ZWJzaXRlOgpodHRwczovL3d3dy5hYnMuZ292LmF1L0FVU1NUQVRTL2Fic0AubnNmL0RldGFpbHNQYWdlLzE4MDAuMDIwMTc/T3BlbkRvY3VtZW50CgoKYGBge3J9CiMgVGhpcyBpcyB0aGUgUiBjaHVuayBmb3IgdGhlIERhdGEgU2VjdGlvbgoKdHBwMSA8LSByZWFkX2NzdigiSG91c2VUcHBCeURpdmlzaW9uRG93bmxvYWQtMjQzMTAuY3N2Iiwgc2tpcD0xKQpoZWFkKHRwcDEpCm1hcnJpYWdlMSA8LSByZWFkX2V4Y2VsKCJhdXN0cmFsaWFuX21hcnJpYWdlX2xhd19wb3N0YWxfc3VydmV5XzIwMTdfLV9yZXNwb25zZV9maW5hbC54bHMiLCBzaGVldD0zLCBza2lwPSA1KQpoZWFkKG1hcnJpYWdlMSkKbWFycmlhZ2UyIDwtIHJlbmFtZShtYXJyaWFnZTEsIGVsZWN0b3JhdGUgPS4uLjEsIHllc192b3RlcyA9IFllcywgeWVzX3BlcmNlbnRhZ2U9Li4uMywgbm9fdm90ZXM9IE5vLCBub19wZXJjZW50YWdlID0gLi4uNSwgdG90YWxfdm90ZXMgPSBUb3RhbC4uLjYsIHRvdGFsX3BlcmNlbnRhZ2UgPSAuLi43KQpoZWFkKG1hcnJpYWdlMikKdHBwMiA8LSByZW5hbWUodHBwMSxlbGVjdG9yYXRlPURpdmlzaW9uTm0pCmhlYWQodHBwMikKbWFycmlhZ2UzIDwtIG1hcnJpYWdlMiAlPiUgc2VsZWN0KGVsZWN0b3JhdGUseWVzX3ZvdGVzLHllc19wZXJjZW50YWdlLG5vX3ZvdGVzLG5vX3BlcmNlbnRhZ2UsdG90YWxfdm90ZXMpCnZvdGluZzEgPC0gdHBwMiAlPiUgbGVmdF9qb2luKG1hcnJpYWdlMykKaGVhZCh2b3RpbmcxKQpgYGAKCiMjIFVuZGVyc3RhbmQgCgpTdW1tYXJpc2UgdGhlIHR5cGVzIG9mIHZhcmlhYmxlcyBhbmQgZGF0YSBzdHJ1Y3R1cmVzLCBjaGVjayB0aGUgYXR0cmlidXRlcyBpbiB0aGUgZGF0YSBhbmQgYXBwbHkgcHJvcGVyIGRhdGEgdHlwZSBjb252ZXJzaW9ucy4gSW4gYWRkaXRpb24gdG8gdGhlIFIgY29kZXMgYW5kIG91dHB1dHMsIGV4cGxhaW4gYnJpZWZseSB0aGUgc3RlcHMgdGhhdCB5b3UgaGF2ZSB0YWtlbi4gSW4gdGhpcyBzZWN0aW9uLCBzaG93IHRoYXQgeW91IGhhdmUgZnVsZmlsbGVkIG1pbmltdW0gcmVxdWlyZW1lbnRzIDItNC4KClRoZXJlIGlzIGEgbWl4IG9mIHZhcmlhYmxlcywgaW5jbHVkaW5nIGNoYXJhY3RlcnMsIGZhY3RvcnMgYW5kIG51bWVyaWNhbC4KCkJvdGggU3RhdGVBYiBhbmQgUGFydHlBYiB3ZXJlIGltcG9ydGVkIGFzIGNoYXJhY3RlciB2YXJpYWJsZXMuIFRoZXNlIHdlcmUgYXNzaWduZWQgYXMgZmFjdG9ycy4KVGhlIG1hcnJpYWdlIGVxdWFsaXR5IHBsZWJpc2NpdGUgZGF0YSB3YXMgaW1wb3J0ZWQgYXMgY2hhcmFjdGVycywgc28gdGhlc2Ugd2VyZSByZS1hc3NpZ25lZCBhcyBudW1lcmljYWwgdmFyaWFibGVzLgoKYGBge3J9CiMgVGhpcyBpcyB0aGUgUiBjaHVuayBmb3IgdGhlIFVuZGVyc3RhbmQgU2VjdGlvbgoKdm90aW5nMSRTdGF0ZUFiIDwtIHZvdGluZzEkU3RhdGVBYiU+JSBhcy5mYWN0b3IoKQp2b3RpbmcxJFBhcnR5QWIgPC0gIHZvdGluZzEkUGFydHlBYiAlPiUgYXMuZmFjdG9yKCkKdm90aW5nMSR5ZXNfdm90ZXMgPC0gdm90aW5nMSR5ZXNfdm90ZXMgJT4lIGFzLmRvdWJsZSgpCnZvdGluZzEkeWVzX3BlcmNlbnRhZ2UgPC0gdm90aW5nMSR5ZXNfcGVyY2VudGFnZSAlPiUgYXMuZG91YmxlKCkKdm90aW5nMSRub192b3RlcyA8LSB2b3RpbmcxJG5vX3ZvdGVzICU+JSBhcy5kb3VibGUoKQp2b3RpbmcxJG5vX3BlcmNlbnRhZ2UgPC0gdm90aW5nMSRub19wZXJjZW50YWdlICU+JSBhcy5kb3VibGUoKQp2b3RpbmcxJHRvdGFsX3ZvdGVzIDwtIHZvdGluZzEkdG90YWxfdm90ZXMgJT4lIGFzLmRvdWJsZSgpCmhlYWQodm90aW5nMSkKCmBgYAoKCiMjCVRpZHkgJiBNYW5pcHVsYXRlIERhdGEgSSAKCgpUaGUgZGF0YSBiYXNlIGhhZCBicmFuY2hlZCB2YXJpYWJsZXMsIHdpdGggdGhlICdubycgaGVhZGVyIGluY2x1ZGluZyBib3RoIHZvdGUgdGFsbHkgYW5kIHByb3BvcnRpb24uIFRvIGVuc3VyZSB0aWR5IGRhdGEsIHRoZSBkYXRhIHdhcyBpbXBvcnRlZCB3aXRoIHRoZSBicmFuY2ggaGVhZGVycyBkcm9wcGVkLiBUaGUgdmFyaWFibGVzIHRoZW4gd2VyZSByZW5hbWVkIHRvIGVuc3VyZSBhY2N1cmFjeSBhbmQgY29uc2lzdGVuY3kuCgoKYGBge3J9CiMgVGhpcyBpcyB0aGUgUiBjaHVuayBmb3IgdGhlIFRpZHkgJiBNYW5pcHVsYXRlIERhdGEgSSAKCmBgYAoKIyMJVGlkeSAmIE1hbmlwdWxhdGUgRGF0YSBJSSAKCgpTbyBhcyB0byBtb3JlIGVhc2lseSBhc3Nlc3MgdGhlIGRpZmZlcmVuY2UgaW4gbGV2ZWxzIG9mIHN1cHBvcnQgZm9yIG1hcnJpYWdlIGVxdWFsaXR5LCBhIG5ldyB2YXJpYWJsZSB3YXMgY3JlYXRlZCAtIGRpZmZlcmVuY2UuIFRoaXMgdG9vayB0aGUgeWVzX3Byb3BvcnRpb24gYW5kIHN1YnRyYWN0ZWQgdGhlIG5vX3Byb3BvcnRpb24uIEEgcG9zaXRpdmUgdmFsdWUgaW5kaWNhdGVkIG1ham9yaXR5IHN1cHBvcnQgZm9yIG1hcnJpYWdlIGVxdWFsaXR5LCB3aGlsZSBhIG5lZ2F0aXZlIHZhbHVlIGluZGljYXRlZCBtaW5vcml0eSwgd2l0aCB0aGUgcHJvcG9ydGlvbmFsIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIGJlaW5nIHRoZSBudW1lcmljYWwgdmFsdWUuIFRoaXMgdmFyaWFibGUgd2lsbCBsYXRlciBhaWQgYW5hbHlzaXMgd2hlbiBsb29raW5nIGludG8gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBvbGl0aWNhbCBwYXJ0eSBzdXBwb3J0IGFuZCBtYXJyaWFnZSBlcXVhbGl0eSBzdXBwb3J0LCBhbmQgdGhlIGxldmVsIG9mIHN1Y2ggc3VwcG9ydC4KCmBgYHtyfQojIFRoaXMgaXMgdGhlIFIgY2h1bmsgZm9yIHRoZSBUaWR5ICYgTWFuaXB1bGF0ZSBEYXRhIElJIAp2b3RpbmcyIDwtIG11dGF0ZSh2b3RpbmcxLCBkaWZmZXJlbmNlID0geWVzX3BlcmNlbnRhZ2UgLSBub19wZXJjZW50YWdlKQpoZWFkKHZvdGluZzIpCgpgYGAKCgojIwlTY2FuIEkgCgoKVGhlIGRhdGEgd2FzIHNjYW5uZWQgZm9yIG1pc3NpbmcgZGF0YS4gVGhlcmUgYXJlIDExIG9ic2VydmF0aW9ucyB3aXRoIGFsbCBkYXRhIG1pc3NpbmcgcmVsYXRpbmcgdG8gdGhlIG1hcnJpYWdlIGVxdWFsaXR5IHBsZWJpc2NpdGUuIEl0IGNvbnN0aXR1dGVzIDcuMjglIG9mIHRoZSB0b3RhbCAxNTEgb2JzZXJ2YXRpb25zLiBGdXJ0aGVybW9yZSwgbmluZSBvZiB0aGUgZWxldmVuIHdlcmUgc2VhdHMgaGVscCBieSB0aGUgQUxQLCB3aXRoIG9uZSBlYWNoIGhlbGQgYnkgdGhlIE5QIGFuZCBMUC4gQWxsIHRocmVlIGVsZWN0b3JhdGVzIGluIHRoZSBBQ1QgaGF2ZSBwbGViaXNjaXRlIGRhdGEgbWlzc2luZywgb25lIG9mIHRoZSBOVCdzIHR3byBzZWF0cywgZml2ZSBvZiBWaWN0b3JpYSdzIHRoaXJ0eS1laWdodCBzZWF0cywgYW5kIG9uZSBvZiBTQSdzIHRlbiBzZWF0cy4KClRoaXMgaXMgZGF0YSBzZXQgaXMgdG8gYmUgdXNlZCBpbiBhbiBhbmFseXNpcyB0byBzZWUgaWYgdGhlcmUgaXMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzdXBwb3J0IGZvciBtYXJyaWFnZSBlcXVhbGl0eSBpbiB0aGUgMjAxNyBwbGViaXNjaXRlLCBhbmQgdm90aW5nIHN1cHBvcnQgZm9yIHBhcnRpY3VsYXIgcG9saXRpY2FsIHBhcnRpZXMgaW4gdGhlIDIwMTkgZmVkZXJhbCBlbGVjdGlvbi4gVGhlcmVmb3JlLCBtb3JlIGFuYWx5c2lzIGlzIG5lZWRlZCBiZWZvcmUgYWN0aW9uIGlzIHRha2VuLiBJZiB0aGUgbWlzc2luZyB2YWx1ZXMgd2VyZSByZS1jb2RlZCB3aXRoIG1lZGlhbiB2YWx1ZXMgb3Igb3RoZXIgdmFsdWVzIHRoaXMgY291bGQgaW1wYWN0IGFuYWx5c2lzIHJlc3VsdHMuIFRoZSBkZWNpc2lvbiB3YXMgbWFkZSB0byBsZWF2ZSB0aGUgbWlzc2luZyBkYXRhIGFzIE5BIHVudGlsIG1vcmUgYW5hbHlzaXMgd2FzIHVuZGVydGFrZW4uIFN1Y2ggYW5hbHlzaXMgbWlnaHQgaW5jbHVkZSBhbmFseXNpbmcgdGhlIHN1cHBvcnQgZm9yIG1hcnJpYWdlIGVxdWFsaXR5IGluIGVsZWN0b3JhdGVzIHdpdGggY29tcGFyYWJsZSBwb2xpdGljYWwgcGFydHkgc3VwcG9ydCwgb3Igb3RoZXIgbWV0cmljcy4gCgoKYGBge3J9CiMgVGhpcyBpcyB0aGUgUiBjaHVuayBmb3IgdGhlIFNjYW4gSQoKY29sU3Vtcyhpcy5uYSh2b3RpbmcyKSkKCmBgYAoKCiMjCVNjYW4gSUkKCgpTZXZlcmFsIHVuaXZhcmlhdGUgc2NhbnMgd2VyZSB1bmRlcnRha2VuIHRvIGNoZWNrIGZvciBvdXRsaWVycy4gVGhlcmUgd2VyZSBubyBvYnZpb3VzIG91dGxpZXJzIGV4Y2VwdCBmb3Igb25lIG9ic2VydmF0aW9uIG9mIHRoZSB2YXJpYWJsZSAnc3dpbmcnLiBUaGUgV2hpdGxhbSBlbGVjdG9yYXRlIG9ic2VydmF0aW9uIGhhZCBhIHN3aW5nIHZhbHVlIG9mIDM5JS4gQ29uc2lkZXJpbmcgdGhlIG90aGVyIG91dGxpZXJzIHdlcmUgaW4gdGhlIDExLTEyJSByYW5nZSB0aGlzIHdhcyBhIHNpZ25pZmljYW50IG91dGxpZXIgdGhhdCByZXF1aXJlZCBpbnZlc3RpZ2F0aW9uLiBVcG9uIHJlc2VhcmNoaW5nIHRoZSBwcmV2aW91cyBlbGVjdGlvbiByZXN1bHQsIGZvciB3aGljaCBzd2luZyBpcyBkZXJpdmVkIGZyb20gaW4gcmVsYXRpb24gdG8gdGhlIG1vc3QgcmVjZW50IGVsZWN0aW9uLCBpdCB3YXMgZm91bmQgdGhhdCBpbiB0aGUgcHJldmlvdXMgZWxlY3Rpb24gYSBMaWJlcmFsIHBhcnR5IGNhbmRpZGF0ZSBoYWQgcnVuIGJ1dCBub3QgaW4gdGhpcyBlbGVjdGlvbiwgaGVuY2UgdGhlIHN3aW5nIGZpZ3VyZSB3YXMgbm90IGFuIGFjY3VyYXRlIHJlZmxlY3Rpb24sIGFzIHRoZSB3YXMgbm8gTGliZXJhbCBjYW5kaWRhdGUgZm9yIHZvdGVycyB0byBzd2luZyBhZ2FpbnN0LiBUaGUgZGVjaXNpb24gd2FzIG1hZGUgdG8gY2hhbmdlIHRoaXMgb2JzZXJ2YXRpb24gdG8gTkEsIGFuZCByZW1vdmUgaXQgZm9yIGNhbGN1bGF0aW9ucy4gSXQgd2FzIGNoYW5nZWQgdG8gTkEgc28gYXMgdG8gbm90IGFsdGVyIG90aGVyIGNhbGN1bGF0aW9ucyBhbmQgYW5hbHlzaXMuCgpgYGB7cn0KIyBUaGlzIGlzIHRoZSBSIGNodW5rIGZvciB0aGUgU2NhbiBJSQoKdm90aW5nMiRkaWZmZXJlbmNlICU+JSBib3hwbG90KG1haW49IkJveCBQbG90IG9mIHN1cHBvcnQgZGlmZmVyZW5jZSBmb3IgbWFycmlhZ2UgZXF1YWxpdHkiLCB5bGFiPSJzdXBwb3J0IGRpZmZlcmVuY2UiLCBjb2w9ImdyZXkiKQoKdm90aW5nMiRTd2luZyAlPiUgYm94cGxvdChtYWluPSJCb3ggUGxvdCBvZiB3aW5uaW5nIHBhcnR5IHN3aW5nIiwgeWxhYj0ic3dpbmciLCBjb2w9ImdyZXkiKQoKdm90aW5nMiR5ZXNfcGVyY2VudGFnZSAlPiUgYm94cGxvdChtYWluPSJCb3ggcGxvdCBvZiBNYXJyaWFnZSBlcXVhbGl0eSBwbGViaXNjaXRlIHllcyB2b3RlIGJ5IGVsZWN0b3JhdGUiLCB5bGFiPSAicHJvcG9ydGlvbiIsIGNvbD0iZ3JleSIpCgp2b3RpbmcyJGBMaWJlcmFsL05hdGlvbmFsIENvYWxpdGlvbiBQZXJjZW50YWdlYCAlPiUgYm94cGxvdChtYWluPSJCb3ggcGxvdCBvZiBMTlAgdm90ZSBwZXJjZW50YWdlIGJ5IGVsZWN0b3JhdGUiLCB5bGFiPSAidm90ZSBwZXJjZW50YWdlIiwgY29sPSJncmV5IikKCnZvdGluZzIkYEF1c3RyYWxpYW4gTGFib3IgUGFydHkgUGVyY2VudGFnZWAgJT4lIGJveHBsb3QobWFpbj0iQm94IHBsb3Qgb2YgTGFib3Igdm90ZSBwZXJjZW50YWdlIGJ5IGVsZWN0b3JhdGUiLCB5bGFiPSAidm90ZSBwZXJjZW50YWdlIiwgY29sPSJncmV5IikKCnZvdGluZzIkU3dpbmdbMTQ4XSA8LSBOQQoKYGBgCgoKIyMJVHJhbnNmb3JtIAoKClNldmVyYWwgdmFyaWFibGVzIHdlcmUgY2hlY2tlZCBmb3IgZGlzdHJpYnV0aW9uIHNrZXcuIFRoZSB5ZXMgcGVyY2VudGFnZSB2YXJpYWJsZSBoYWQgYSBtaWxkIGxlZnQgc2tldy4gVGhlIG1hdGhlbWF0aWNhbCBvcGVyYXRpb24gb2YgYSBzcXVhcmUgcm9vdCB0cmFuc2Zvcm1hdGlvbiB3YXMgdXNlZCBhdCBpdCB3YXMgYSBsZWZ0IHNrZXcuIFRoZSByZXN1bHRpbmcgb2JqZWN0LCB0cmFuc195ZXMxLCBoYXMgYSBtdWNoIHJlZHVjZWQgc2tldy4KCgpgYGB7cn0KIyBUaGlzIGlzIHRoZSBSIGNodW5rIGZvciB0aGUgVHJhbnNmb3JtIFNlY3Rpb24KCnZvdGluZzIkYEF1c3RyYWxpYW4gTGFib3IgUGFydHkgUGVyY2VudGFnZWAgJT4lIGhpc3QoeGxhYj0ibGFib3IgcGVyY2VudGFnZSIsIG1haW4gPSAibGFib3Igc3VwcG9ydCIsIGNvbCA9ICJncmV5IiApCgp2b3RpbmcyJHllc19wZXJjZW50YWdlICU+JSBoaXN0KHhsYWI9InllcyBwZXJjZW50YWdlIiwgbWFpbiA9ICJ5ZXMgc3VwcG9ydCBieSBlbGVjdG9yYXRlIiwgY29sPSJncmV5IikKCnRyYW5zX3llczEgPC0gdm90aW5nMiR5ZXNfcGVyY2VudGFnZV4yCmhpc3QodHJhbnNfeWVzMSkKCgpgYGAKCgpOT1RFOiBOb3RlIHRoYXQgc29tZXRpbWVzIHRoZSBvcmRlciBvZiB0aGUgdGFza3MgbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBvcmRlciBnaXZlbiBoZXJlLiBGb3IgZXhhbXBsZSwgeW91IG1heSBuZWVkIHRvIHRpZHkgdGhlIGRhdGEgc2V0cyBmaXJzdCB0byBiZSBhYmxlIHRvIGNyZWF0ZSB0aGUgY29tbW9uIGtleSB0byBtZXJnZS4gVGhlcmVmb3JlLCBmb3Igc3VjaCBjYXNlcyB5b3UgbWF5IGhhdmUgYSBkaWZmZXJlbnQgb3JkZXJpbmcgb2YgdGhlIHNlY3Rpb25zLlwgIAoKQW55IGZ1cnRoZXIgb3Igb3B0aW9uYWwgcHJlLXByb2Nlc3NpbmcgdGFza3MgY2FuIGJlIGFkZGVkIHRvIHRoZSB0ZW1wbGF0ZSB1c2luZyBhbiBhZGRpdGlvbmFsIHNlY3Rpb24gaW4gdGhlIFIgTWFya2Rvd24gZmlsZS4gTWFrZSBzdXJlIHlvdXIgY29kZSBpcyB2aXNpYmxlICh3aXRoaW4gdGhlIG1hcmdpbiBvZiB0aGUgcGFnZSkuIERvIG5vdCB1c2UgVmlldygpIHRvIHNob3cgeW91ciBkYXRhLCBpbnN0ZWFkIGdpdmUgaGVhZGVycyAodXNpbmcgaGVhZCgpICkKCjxicj4KPGJyPgo=