Libraries used

library(rio) #to import data
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
The following rio suggested packages are not installed: ‘csvy’, ‘feather’, ‘fst’, ‘hexView’, ‘readODS’, ‘rmatio’
Use 'install_formats()' to install them
library(tidyverse) #to tidy data
Registered S3 method overwritten by 'dplyr':
  method           from
  print.rowwise_df     
── Attaching packages ───────────────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──
✔ ggplot2 3.2.0     ✔ purrr   0.3.2
✔ tibble  2.1.3     ✔ dplyr   0.8.1
✔ tidyr   0.8.3     ✔ stringr 1.4.0
✔ readr   1.3.1     ✔ forcats 0.4.0
── Conflicts ──────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
library(sf) # to read spatial datains
Linking to GEOS 3.6.1, GDAL 2.1.3, PROJ 4.9.3
library(tmap) # to create maps
Registered S3 methods overwritten by 'htmltools':
  method               from         
  print.html           tools:rstudio
  print.shiny.tag      tools:rstudio
  print.shiny.tag.list tools:rstudio
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
library(RColorBrewer) #to create choropleth color schemes

Raw data and raw map

#We read the original non-spatial csv data and the original election districts boundary shapefile for 2003-2012. The former is straight from Dropbox. The latter is obtained from the June 18 task (Dropbox shapefile manipulated into geojson for easier processing.)
#Read and display raw data from "japan_election_money.dta"
raw_data <- import("japan_election_money.dta")
raw_data
names(raw_data)
 [1] "chamber"           "year"              "prefecture"        "district_number"   "party"            
 [6] "party_english"     "name"              "age"               "male"              "occupation"       
[11] "inc"               "win"               "votes"             "SpendingLimit"     "Staff"            
[16] "Facilities"        "Telecommunication" "Transportation"    "Printing"          "Advertising"      
[21] "Stationery"        "Foods"             "Lodging"           "Miscelleneous"     "Spending"         
[26] "donation"          "otherincome"       "birthyear"         "cpi"               "samename"         
[31] "CandId"           
#Read and display 2003-2012 election boundaries
raw_map <- st_read("2003-2012 Japan Election Boundaries.geojson") %>% st_transform (2447) #EPSG is 2447 for Japan.
Reading layer `OGRGeoJSON' from data source `/Users/calvinzhang/Desktop/SISRM Research Files/June 26 2003 2005 2009 2012 Election Spending/2003-2012 Japan Election Boundaries.geojson' using driver `GeoJSON'
Simple feature collection with 300 features and 15 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: 122.9382 ymin: 24.04738 xmax: 145.818 ymax: 45.52539
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs
raw_map 
Simple feature collection with 300 features and 15 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -1160363 ymin: -1284150 xmax: 930957.1 ymax: 1085939
epsg (SRID):    2447
proj4string:    +proj=tmerc +lat_0=36 +lon_0=134.3333333333333 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs
First 10 features:
   UserID   X...C.g.. X.o.... X.L.......h X...e X.摜.t...C X.....N.t.. X...l X.X.V.. X.....F X.h.. X...E...F X...E..
1     112  �k�C��12��    <NA>        <NA>  <NA>       <NA>        <NA>  <NA>    <NA>     128     7   4210816       1
2     202 �\u0090X2��    <NA>        <NA>  <NA>       <NA>        <NA>  <NA>    <NA>     128     7   4210816       1
3    2809     ����9��    <NA>        <NA>  <NA>       <NA>        <NA>  <NA>    <NA>     128     7   4210816       1
4    1303     ����3��    <NA>        <NA>  <NA>       <NA>        <NA>  <NA>    <NA>     128     7   4210816       1
5    3602     ����2��    <NA>        <NA>  <NA>       <NA>        <NA>  <NA>    <NA>     128     7   4210816       1
6    4010    ����10��    <NA>        <NA>  <NA>       <NA>        <NA>  <NA>    <NA>     128     7   4210816       1
7    4203     ����3��    <NA>        <NA>  <NA>       <NA>        <NA>  <NA>    <NA>     128     7   4210816       1
8    4602   ������2��    <NA>        <NA>  <NA>       <NA>        <NA>  <NA>    <NA>     128     7   4210816       1
9    4703     ����3��    <NA>        <NA>  <NA>       <NA>        <NA>  <NA>    <NA>     128     7   4210816       1
10   4701     ����1��    <NA>        <NA>  <NA>       <NA>        <NA>  <NA>    <NA>     128     7   4210816       1
      X.ʐ..m2. X.....m.                       geometry
1  14765470014  1213314 MULTIPOLYGON (((594442.4 10...
2   3533277611   438444 MULTIPOLYGON (((549273.6 63...
3    634745974   184994 MULTIPOLYGON (((61370.71 -1...
4    367897905   299564 MULTIPOLYGON (((465119.2 -1...
5   1446287890   311224 MULTIPOLYGON (((28669.2 -19...
6    282430080   106624 MULTIPOLYGON (((-305903.4 -...
7   1739268359   922765 MULTIPOLYGON (((-422568.9 -...
8   1642579328   753293 MULTIPOLYGON (((-422902.2 -...
9    940931618   402618 MULTIPOLYGON (((-626721.7 -...
10   176409935   163910 MULTIPOLYGON (((-700411.1 -...
tmap_mode("view")
tmap mode set to interactive viewing
tm_shape (raw_map) +
  tm_borders()

#map should read

Wrangling non-spatial election data

Manipulate 2003 non-spatial data to create sum of election spending for each prefecture-district, save processed data.

#use pipe to filter by year, then apply group_by to prefecture and district_id. Mutate to create PrefectureDistrictSpending, the total sum of spending in each prefecture-district. FInally, select the relevant variables and arrange by prefecture, district. The end result is called processed data, which is saved as a csv.
#2003
processed_data_2003 <- raw_data %>% filter (year == 2003) %>% group_by(prefecture, district_number) %>% summarize(PrefectureDistrictSpending2003 = sum(Spending)) %>% mutate("year" = 2003) %>% arrange(prefecture, district_number)
sum(is.na(processed_data_2003)) 
[1] 0
#check for "NAs". There are two types of NAs I encountered in the 4 years. First, NAs can appear explicitly in PrefectureDistrictSpending. We have to turn this type of NAs in election spending into missing implicits, or else choropleth intervals will NOT show these NAs correctly with a "missing" bracket. In 2003 data, no such NAs, so we go ahead. 
#The second type of NA is implicit. All districts in the csv could have election spending data. Some districts, though, are not present in the csv at all but are represented on the shapefile. These are also automatically categorized as "missing" when mapped onto the shapefile in choropleth mapping. So we don't need to worry about these NAs displaying incorrectly. 
#in this case for 2003 data, no explicit NAs, so we go ahead with the dataset. We check for NAs using sum(is.na(dataset)) 
processed_data_2003
#Save the processed data, identifying the year
write.csv (processed_data_2003, file = "processed_data_2003.csv")
raw_data %>% filter (year == 2003, prefecture == "北海道") %>% group_by(prefecture, district_number) %>% summarize(PrefectureDistrictSpending2003 = sum(Spending)) %>% mutate("year" = 2003) %>% arrange(prefecture, district_number)

2005

#Same process as 2003 
processed_data_2005 <- raw_data %>% filter (year == 2005) %>% group_by(prefecture, district_number) %>% summarize(PrefectureDistrictSpending2005 = sum(Spending))  %>% mutate("year" = 2005) %>% arrange(prefecture, district_number)
 
sum(is.na(processed_data_2005)) #No explicit NAs, so we can go ahead. 
[1] 0
processed_data_2005
write.csv (processed_data_2005, file = "processed_data_2005.csv")

2009

#2009
processed_data_2009 <- raw_data %>% filter (year == 2009) %>% group_by(prefecture, district_number) %>% summarize(PrefectureDistrictSpending2009 = sum(Spending))  %>% mutate("year" = 2009) %>% arrange(prefecture, district_number)
processed_data_2009
sum(is.na(processed_data_2009)) #5 explicit NAs
[1] 5
sum(is.na(processed_data_2009$PrefectureDistrictSpending2009)) #Turns out, all 5 explicit NAs occur in PrefectureDistrictSpending2009, since this code and above both yield 5. 
[1] 5
processed_data_2009[is.na(processed_data_2009)] <- "" #turn explicit NAs implicit with empty "" to correctly generate "missing" bracket in choropleth
sum(is.na(processed_data_2009)) # no more explict NAs, we go ahead
[1] 0
processed_data_2009
write.csv (processed_data_2009, file = "processed_data_2009.csv")

2012

processed_data_2012 <- raw_data %>% filter (year == 2012) %>% group_by(prefecture, district_number) %>% summarize(PrefectureDistrictSpending2012 = sum(Spending))  %>% mutate("year" = 2012) %>% arrange(prefecture, district_number)
sum(is.na(processed_data_2012)) #no explicit NAs, go ahead
[1] 0
processed_data_2012
write.csv (processed_data_2012, file = "processed_data_2012.csv")

UserID and merging

#See June 21 task for how I merged the non-spatial and spatial data. First, type in UserID for prefecture-districts in non-spatial dataset. Then, merge by UserID on Geoda with the spatial data.
#read merged Geojsons. 
final_map_2003<- st_read("2003 Election and Spending Map.geojson") %>% st_transform(2447)
Reading layer `OGRGeoJSON' from data source `/Users/calvinzhang/Desktop/SISRM Research Files/June 26 2003 2005 2009 2012 Election Spending/2003 Election and Spending Map.geojson' using driver `GeoJSON'
Simple feature collection with 300 features and 7 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: 122.9382 ymin: 24.04738 xmax: 145.818 ymax: 45.52539
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs
names(final_map_2003)
[1] "UserID"                                                        
[2] "c.NA_character_..NA_character_..NA_character_..NA_character_.."
[3] "UserID_1"                                                      
[4] "prefecture"                                                    
[5] "district_number"                                               
[6] "PrefectureDistrictSpending2003"                                
[7] "year"                                                          
[8] "geometry"                                                      
final_map_2005<- st_read("2005 Election and Spending Map.geojson") %>% st_transform(2447)
Reading layer `OGRGeoJSON' from data source `/Users/calvinzhang/Desktop/SISRM Research Files/June 26 2003 2005 2009 2012 Election Spending/2005 Election and Spending Map.geojson' using driver `GeoJSON'
Simple feature collection with 300 features and 7 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: 122.9382 ymin: 24.04738 xmax: 145.818 ymax: 45.52539
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs
final_map_2009<- st_read("2009 Election and Spending Map.geojson") %>% st_transform(2447)
Reading layer `OGRGeoJSON' from data source `/Users/calvinzhang/Desktop/SISRM Research Files/June 26 2003 2005 2009 2012 Election Spending/2009 Election and Spending Map.geojson' using driver `GeoJSON'
Simple feature collection with 300 features and 7 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: 122.9382 ymin: 24.04738 xmax: 145.818 ymax: 45.52539
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs
final_map_2012<- st_read("2012 Election and Spending Map.geojson") %>% st_transform(2447)
Reading layer `OGRGeoJSON' from data source `/Users/calvinzhang/Desktop/SISRM Research Files/June 26 2003 2005 2009 2012 Election Spending/2012 Election and Spending Map.geojson' using driver `GeoJSON'
Simple feature collection with 300 features and 7 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: 122.9382 ymin: 24.04738 xmax: 145.818 ymax: 45.52539
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs
final_map_2014<- st_read("2014 Election and Spending Map.geojson") %>% rename ("PrefectureDistrictSpending2014" = PrefectureDistrictSpending) %>% st_transform(2447) 
Reading layer `OGRGeoJSON' from data source `/Users/calvinzhang/Desktop/SISRM Research Files/June 26 2003 2005 2009 2012 Election Spending/2014 Election and Spending Map.geojson' using driver `GeoJSON'
Simple feature collection with 295 features and 7 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: 122.9382 ymin: 24.04738 xmax: 145.818 ymax: 45.52539
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs
#In June 21 task for 2014 data, "PrefectureDistrictSpending" was named without year, so we add year here to the name with rename.
#Map
tm_basemap ("OpenStreetMap.Mapnik") +
tm_shape (final_map_2003) +
  tm_fill ("PrefectureDistrictSpending2003", style = "jenks", palette = "BuGn", alpha = 0.7) +
tm_shape (final_map_2005) +
  tm_fill ("PrefectureDistrictSpending2005", style = "jenks", palette = "RdPu", alpha = 0.7) +
tm_shape (final_map_2009) +
  tm_fill ("PrefectureDistrictSpending2009", style = "jenks", palette = "BuPu", alpha = 0.7) +
tm_shape (final_map_2012) +
  tm_fill ("PrefectureDistrictSpending2012", style = "jenks", palette = "GnBu", alpha = 0.7) +
tm_shape (final_map_2014) +
  tm_fill ("PrefectureDistrictSpending2014", style = "jenks", palette = "YlOrBr", alpha = 0.7)

NA
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKI0xpYnJhcmllcyB1c2VkCmBgYHtyfQpsaWJyYXJ5KHJpbykgI3RvIGltcG9ydCBkYXRhCmxpYnJhcnkodGlkeXZlcnNlKSAjdG8gdGlkeSBkYXRhCmxpYnJhcnkoc2YpICMgdG8gcmVhZCBzcGF0aWFsIGRhdGFpbnMKbGlicmFyeSh0bWFwKSAjIHRvIGNyZWF0ZSBtYXBzCmxpYnJhcnkoUkNvbG9yQnJld2VyKSAjdG8gY3JlYXRlIGNob3JvcGxldGggY29sb3Igc2NoZW1lcwpgYGAKCiNSYXcgZGF0YSBhbmQgcmF3IG1hcApgYGB7cn0KI1dlIHJlYWQgdGhlIG9yaWdpbmFsIG5vbi1zcGF0aWFsIGNzdiBkYXRhIGFuZCB0aGUgb3JpZ2luYWwgZWxlY3Rpb24gZGlzdHJpY3RzIGJvdW5kYXJ5IHNoYXBlZmlsZSBmb3IgMjAwMy0yMDEyLiBUaGUgZm9ybWVyIGlzIHN0cmFpZ2h0IGZyb20gRHJvcGJveC4gVGhlIGxhdHRlciBpcyBvYnRhaW5lZCBmcm9tIHRoZSBKdW5lIDE4IHRhc2sgKERyb3Bib3ggc2hhcGVmaWxlIG1hbmlwdWxhdGVkIGludG8gZ2VvanNvbiBmb3IgZWFzaWVyIHByb2Nlc3NpbmcuKQoKI1JlYWQgYW5kIGRpc3BsYXkgcmF3IGRhdGEgZnJvbSAiamFwYW5fZWxlY3Rpb25fbW9uZXkuZHRhIgoKcmF3X2RhdGEgPC0gaW1wb3J0KCJqYXBhbl9lbGVjdGlvbl9tb25leS5kdGEiKQpyYXdfZGF0YQpuYW1lcyhyYXdfZGF0YSkKCiNSZWFkIGFuZCBkaXNwbGF5IDIwMDMtMjAxMiBlbGVjdGlvbiBib3VuZGFyaWVzCnJhd19tYXAgPC0gc3RfcmVhZCgiMjAwMy0yMDEyIEphcGFuIEVsZWN0aW9uIEJvdW5kYXJpZXMuZ2VvanNvbiIpICU+JSBzdF90cmFuc2Zvcm0gKDI0NDcpICNFUFNHIGlzIDI0NDcgZm9yIEphcGFuLgpyYXdfbWFwIAoKdG1hcF9tb2RlKCJ2aWV3IikKCnRtX3NoYXBlIChyYXdfbWFwKSArCiAgdG1fYm9yZGVycygpCgojbWFwIHNob3VsZCByZWFkCmBgYAoKIyNXcmFuZ2xpbmcgbm9uLXNwYXRpYWwgZWxlY3Rpb24gZGF0YQoKI01hbmlwdWxhdGUgMjAwMyBub24tc3BhdGlhbCBkYXRhIHRvIGNyZWF0ZSBzdW0gb2YgZWxlY3Rpb24gc3BlbmRpbmcgZm9yIGVhY2ggcHJlZmVjdHVyZS1kaXN0cmljdCwgc2F2ZSBwcm9jZXNzZWQgZGF0YS4KYGBge3J9CiN1c2UgcGlwZSB0byBmaWx0ZXIgYnkgeWVhciwgdGhlbiBhcHBseSBncm91cF9ieSB0byBwcmVmZWN0dXJlIGFuZCBkaXN0cmljdF9pZC4gTXV0YXRlIHRvIGNyZWF0ZSBQcmVmZWN0dXJlRGlzdHJpY3RTcGVuZGluZywgdGhlIHRvdGFsIHN1bSBvZiBzcGVuZGluZyBpbiBlYWNoIHByZWZlY3R1cmUtZGlzdHJpY3QuIEZJbmFsbHksIHNlbGVjdCB0aGUgcmVsZXZhbnQgdmFyaWFibGVzIGFuZCBhcnJhbmdlIGJ5IHByZWZlY3R1cmUsIGRpc3RyaWN0LiBUaGUgZW5kIHJlc3VsdCBpcyBjYWxsZWQgcHJvY2Vzc2VkIGRhdGEsIHdoaWNoIGlzIHNhdmVkIGFzIGEgY3N2LgoKIzIwMDMKcHJvY2Vzc2VkX2RhdGFfMjAwMyA8LSByYXdfZGF0YSAlPiUgZmlsdGVyICh5ZWFyID09IDIwMDMpICU+JSBncm91cF9ieShwcmVmZWN0dXJlLCBkaXN0cmljdF9udW1iZXIpICU+JSBzdW1tYXJpemUoUHJlZmVjdHVyZURpc3RyaWN0U3BlbmRpbmcyMDAzID0gc3VtKFNwZW5kaW5nKSkgJT4lIG11dGF0ZSgieWVhciIgPSAyMDAzKSAlPiUgYXJyYW5nZShwcmVmZWN0dXJlLCBkaXN0cmljdF9udW1iZXIpCgpzdW0oaXMubmEocHJvY2Vzc2VkX2RhdGFfMjAwMykpIAoKCiNjaGVjayBmb3IgIk5BcyIuIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgTkFzIEkgZW5jb3VudGVyZWQgaW4gdGhlIDQgeWVhcnMuIEZpcnN0LCBOQXMgY2FuIGFwcGVhciBleHBsaWNpdGx5IGluIFByZWZlY3R1cmVEaXN0cmljdFNwZW5kaW5nLiBXZSBoYXZlIHRvIHR1cm4gdGhpcyB0eXBlIG9mIE5BcyBpbiBlbGVjdGlvbiBzcGVuZGluZyBpbnRvIG1pc3NpbmcgaW1wbGljaXRzLCBvciBlbHNlIGNob3JvcGxldGggaW50ZXJ2YWxzIHdpbGwgTk9UIHNob3cgdGhlc2UgTkFzIGNvcnJlY3RseSB3aXRoIGEgIm1pc3NpbmciIGJyYWNrZXQuIEluIDIwMDMgZGF0YSwgbm8gc3VjaCBOQXMsIHNvIHdlIGdvIGFoZWFkLiAKCiNUaGUgc2Vjb25kIHR5cGUgb2YgTkEgaXMgaW1wbGljaXQuIEFsbCBkaXN0cmljdHMgaW4gdGhlIGNzdiBjb3VsZCBoYXZlIGVsZWN0aW9uIHNwZW5kaW5nIGRhdGEuIFNvbWUgZGlzdHJpY3RzLCB0aG91Z2gsIGFyZSBub3QgcHJlc2VudCBpbiB0aGUgY3N2IGF0IGFsbCBidXQgYXJlIHJlcHJlc2VudGVkIG9uIHRoZSBzaGFwZWZpbGUuIFRoZXNlIGFyZSBhbHNvIGF1dG9tYXRpY2FsbHkgY2F0ZWdvcml6ZWQgYXMgIm1pc3NpbmciIHdoZW4gbWFwcGVkIG9udG8gdGhlIHNoYXBlZmlsZSBpbiBjaG9yb3BsZXRoIG1hcHBpbmcuIFNvIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhlc2UgTkFzIGRpc3BsYXlpbmcgaW5jb3JyZWN0bHkuIAoKI2luIHRoaXMgY2FzZSBmb3IgMjAwMyBkYXRhLCBubyBleHBsaWNpdCBOQXMsIHNvIHdlIGdvIGFoZWFkIHdpdGggdGhlIGRhdGFzZXQuIFdlIGNoZWNrIGZvciBOQXMgdXNpbmcgc3VtKGlzLm5hKGRhdGFzZXQpKSAKCnByb2Nlc3NlZF9kYXRhXzIwMDMKCiNTYXZlIHRoZSBwcm9jZXNzZWQgZGF0YSwgaWRlbnRpZnlpbmcgdGhlIHllYXIKd3JpdGUuY3N2IChwcm9jZXNzZWRfZGF0YV8yMDAzLCBmaWxlID0gInByb2Nlc3NlZF9kYXRhXzIwMDMuY3N2IikKCnJhd19kYXRhICU+JSBmaWx0ZXIgKHllYXIgPT0gMjAwMywgcHJlZmVjdHVyZSA9PSAi5YyX5rW36YGTIikgJT4lIGdyb3VwX2J5KHByZWZlY3R1cmUsIGRpc3RyaWN0X251bWJlcikgJT4lIHN1bW1hcml6ZShQcmVmZWN0dXJlRGlzdHJpY3RTcGVuZGluZzIwMDMgPSBzdW0oU3BlbmRpbmcpKSAlPiUgbXV0YXRlKCJ5ZWFyIiA9IDIwMDMpICU+JSBhcnJhbmdlKHByZWZlY3R1cmUsIGRpc3RyaWN0X251bWJlcikKYGBgCgojMjAwNQpgYGB7cn0KI1NhbWUgcHJvY2VzcyBhcyAyMDAzIAoKcHJvY2Vzc2VkX2RhdGFfMjAwNSA8LSByYXdfZGF0YSAlPiUgZmlsdGVyICh5ZWFyID09IDIwMDUpICU+JSBncm91cF9ieShwcmVmZWN0dXJlLCBkaXN0cmljdF9udW1iZXIpICU+JSBzdW1tYXJpemUoUHJlZmVjdHVyZURpc3RyaWN0U3BlbmRpbmcyMDA1ID0gc3VtKFNwZW5kaW5nKSkgICU+JSBtdXRhdGUoInllYXIiID0gMjAwNSkgJT4lIGFycmFuZ2UocHJlZmVjdHVyZSwgZGlzdHJpY3RfbnVtYmVyKQogCnN1bShpcy5uYShwcm9jZXNzZWRfZGF0YV8yMDA1KSkgI05vIGV4cGxpY2l0IE5Bcywgc28gd2UgY2FuIGdvIGFoZWFkLiAKCnByb2Nlc3NlZF9kYXRhXzIwMDUKCndyaXRlLmNzdiAocHJvY2Vzc2VkX2RhdGFfMjAwNSwgZmlsZSA9ICJwcm9jZXNzZWRfZGF0YV8yMDA1LmNzdiIpCmBgYAoKIzIwMDkKYGBge3J9CiMyMDA5CnByb2Nlc3NlZF9kYXRhXzIwMDkgPC0gcmF3X2RhdGEgJT4lIGZpbHRlciAoeWVhciA9PSAyMDA5KSAlPiUgZ3JvdXBfYnkocHJlZmVjdHVyZSwgZGlzdHJpY3RfbnVtYmVyKSAlPiUgc3VtbWFyaXplKFByZWZlY3R1cmVEaXN0cmljdFNwZW5kaW5nMjAwOSA9IHN1bShTcGVuZGluZykpICAlPiUgbXV0YXRlKCJ5ZWFyIiA9IDIwMDkpICU+JSBhcnJhbmdlKHByZWZlY3R1cmUsIGRpc3RyaWN0X251bWJlcikKCnByb2Nlc3NlZF9kYXRhXzIwMDkKCnN1bShpcy5uYShwcm9jZXNzZWRfZGF0YV8yMDA5KSkgIzUgZXhwbGljaXQgTkFzCgpzdW0oaXMubmEocHJvY2Vzc2VkX2RhdGFfMjAwOSRQcmVmZWN0dXJlRGlzdHJpY3RTcGVuZGluZzIwMDkpKSAjVHVybnMgb3V0LCBhbGwgNSBleHBsaWNpdCBOQXMgb2NjdXIgaW4gUHJlZmVjdHVyZURpc3RyaWN0U3BlbmRpbmcyMDA5LCBzaW5jZSB0aGlzIGNvZGUgYW5kIGFib3ZlIGJvdGggeWllbGQgNS4gCgpwcm9jZXNzZWRfZGF0YV8yMDA5W2lzLm5hKHByb2Nlc3NlZF9kYXRhXzIwMDkpXSA8LSAiIiAjdHVybiBleHBsaWNpdCBOQXMgaW1wbGljaXQgd2l0aCBlbXB0eSAiIiB0byBjb3JyZWN0bHkgZ2VuZXJhdGUgIm1pc3NpbmciIGJyYWNrZXQgaW4gY2hvcm9wbGV0aAoKc3VtKGlzLm5hKHByb2Nlc3NlZF9kYXRhXzIwMDkpKSAjIG5vIG1vcmUgZXhwbGljdCBOQXMsIHdlIGdvIGFoZWFkCgpwcm9jZXNzZWRfZGF0YV8yMDA5Cgp3cml0ZS5jc3YgKHByb2Nlc3NlZF9kYXRhXzIwMDksIGZpbGUgPSAicHJvY2Vzc2VkX2RhdGFfMjAwOS5jc3YiKQpgYGAKCiMyMDEyCmBgYHtyfQpwcm9jZXNzZWRfZGF0YV8yMDEyIDwtIHJhd19kYXRhICU+JSBmaWx0ZXIgKHllYXIgPT0gMjAxMikgJT4lIGdyb3VwX2J5KHByZWZlY3R1cmUsIGRpc3RyaWN0X251bWJlcikgJT4lIHN1bW1hcml6ZShQcmVmZWN0dXJlRGlzdHJpY3RTcGVuZGluZzIwMTIgPSBzdW0oU3BlbmRpbmcpKSAgJT4lIG11dGF0ZSgieWVhciIgPSAyMDEyKSAlPiUgYXJyYW5nZShwcmVmZWN0dXJlLCBkaXN0cmljdF9udW1iZXIpCgpzdW0oaXMubmEocHJvY2Vzc2VkX2RhdGFfMjAxMikpICNubyBleHBsaWNpdCBOQXMsIGdvIGFoZWFkCgpwcm9jZXNzZWRfZGF0YV8yMDEyCgp3cml0ZS5jc3YgKHByb2Nlc3NlZF9kYXRhXzIwMTIsIGZpbGUgPSAicHJvY2Vzc2VkX2RhdGFfMjAxMi5jc3YiKQpgYGAKCgojVXNlcklEIGFuZCBtZXJnaW5nCmBgYHtyfQojU2VlIEp1bmUgMjEgdGFzayBmb3IgaG93IEkgbWVyZ2VkIHRoZSBub24tc3BhdGlhbCBhbmQgc3BhdGlhbCBkYXRhLiBGaXJzdCwgdHlwZSBpbiBVc2VySUQgZm9yIHByZWZlY3R1cmUtZGlzdHJpY3RzIGluIG5vbi1zcGF0aWFsIGRhdGFzZXQuIFRoZW4sIG1lcmdlIGJ5IFVzZXJJRCBvbiBHZW9kYSB3aXRoIHRoZSBzcGF0aWFsIGRhdGEuCgoKI3JlYWQgbWVyZ2VkIEdlb2pzb25zLiAKZmluYWxfbWFwXzIwMDM8LSBzdF9yZWFkKCIyMDAzIEVsZWN0aW9uIGFuZCBTcGVuZGluZyBNYXAuZ2VvanNvbiIpICU+JSBzdF90cmFuc2Zvcm0oMjQ0NykKCm5hbWVzKGZpbmFsX21hcF8yMDAzKQoKZmluYWxfbWFwXzIwMDU8LSBzdF9yZWFkKCIyMDA1IEVsZWN0aW9uIGFuZCBTcGVuZGluZyBNYXAuZ2VvanNvbiIpICU+JSBzdF90cmFuc2Zvcm0oMjQ0NykKCmZpbmFsX21hcF8yMDA5PC0gc3RfcmVhZCgiMjAwOSBFbGVjdGlvbiBhbmQgU3BlbmRpbmcgTWFwLmdlb2pzb24iKSAlPiUgc3RfdHJhbnNmb3JtKDI0NDcpCgpmaW5hbF9tYXBfMjAxMjwtIHN0X3JlYWQoIjIwMTIgRWxlY3Rpb24gYW5kIFNwZW5kaW5nIE1hcC5nZW9qc29uIikgJT4lIHN0X3RyYW5zZm9ybSgyNDQ3KQoKZmluYWxfbWFwXzIwMTQ8LSBzdF9yZWFkKCIyMDE0IEVsZWN0aW9uIGFuZCBTcGVuZGluZyBNYXAuZ2VvanNvbiIpICU+JSByZW5hbWUgKCJQcmVmZWN0dXJlRGlzdHJpY3RTcGVuZGluZzIwMTQiID0gUHJlZmVjdHVyZURpc3RyaWN0U3BlbmRpbmcpICU+JSBzdF90cmFuc2Zvcm0oMjQ0NykgCgojSW4gSnVuZSAyMSB0YXNrIGZvciAyMDE0IGRhdGEsICJQcmVmZWN0dXJlRGlzdHJpY3RTcGVuZGluZyIgd2FzIG5hbWVkIHdpdGhvdXQgeWVhciwgc28gd2UgYWRkIHllYXIgaGVyZSB0byB0aGUgbmFtZSB3aXRoIHJlbmFtZS4KCiNNYXAKdG1fYmFzZW1hcCAoIk9wZW5TdHJlZXRNYXAuTWFwbmlrIikgKwp0bV9zaGFwZSAoZmluYWxfbWFwXzIwMDMpICsKICB0bV9maWxsICgiUHJlZmVjdHVyZURpc3RyaWN0U3BlbmRpbmcyMDAzIiwgc3R5bGUgPSAiamVua3MiLCBwYWxldHRlID0gIkJ1R24iLCBhbHBoYSA9IDAuNykgKwp0bV9zaGFwZSAoZmluYWxfbWFwXzIwMDUpICsKICB0bV9maWxsICgiUHJlZmVjdHVyZURpc3RyaWN0U3BlbmRpbmcyMDA1Iiwgc3R5bGUgPSAiamVua3MiLCBwYWxldHRlID0gIlJkUHUiLCBhbHBoYSA9IDAuNykgKwp0bV9zaGFwZSAoZmluYWxfbWFwXzIwMDkpICsKICB0bV9maWxsICgiUHJlZmVjdHVyZURpc3RyaWN0U3BlbmRpbmcyMDA5Iiwgc3R5bGUgPSAiamVua3MiLCBwYWxldHRlID0gIkJ1UHUiLCBhbHBoYSA9IDAuNykgKwp0bV9zaGFwZSAoZmluYWxfbWFwXzIwMTIpICsKICB0bV9maWxsICgiUHJlZmVjdHVyZURpc3RyaWN0U3BlbmRpbmcyMDEyIiwgc3R5bGUgPSAiamVua3MiLCBwYWxldHRlID0gIkduQnUiLCBhbHBoYSA9IDAuNykgKwp0bV9zaGFwZSAoZmluYWxfbWFwXzIwMTQpICsKICB0bV9maWxsICgiUHJlZmVjdHVyZURpc3RyaWN0U3BlbmRpbmcyMDE0Iiwgc3R5bGUgPSAiamVua3MiLCBwYWxldHRlID0gIllsT3JCciIsIGFscGhhID0gMC43KQogIAoKYGBgCgo=