library(tidyverse)
library(openintro)
library(ggthemes)
theme_set(theme_clean())

Import data

race_data <- read_delim("../raw/race_raw.txt", delim = "|", escape_double = FALSE, trim_ws = TRUE)
hh <- read_csv("../data/hh.csv")
names(race_data)
##  [1] "GeoId"            "Geography"        "LEAID"            "Year"            
##  [5] "Iteration"        "CDP05.3_51est"    "CDP05.3_51moe"    "CDP05.3_52est"   
##  [9] "CDP05.3_52moe"    "CDP05.3_52pct"    "CDP05.3_52pctmoe" "CDP05.3_53est"   
## [13] "CDP05.3_53moe"    "CDP05.3_53pct"    "CDP05.3_53pctmoe" "CDP05.3_54est"   
## [17] "CDP05.3_54moe"    "CDP05.3_54pct"    "CDP05.3_54pctmoe" "CDP05.3_55est"   
## [21] "CDP05.3_55moe"    "CDP05.3_55pct"    "CDP05.3_55pctmoe" "CDP05.3_56est"   
## [25] "CDP05.3_56moe"    "CDP05.3_56pct"    "CDP05.3_56pctmoe" "CDP05.3_57est"   
## [29] "CDP05.3_57moe"    "CDP05.3_57pct"    "CDP05.3_57pctmoe" "CDP05.3_58est"   
## [33] "CDP05.3_58moe"    "CDP05.3_58pct"    "CDP05.3_58pctmoe" "CDP05.3_59est"   
## [37] "CDP05.3_59moe"    "CDP05.3_59pct"    "CDP05.3_59pctmoe" "CDP05.3_60est"   
## [41] "CDP05.3_60moe"    "CDP05.3_60pct"    "CDP05.3_60pctmoe" "CDP05.3_61est"   
## [45] "CDP05.3_61moe"    "CDP05.3_61pct"    "CDP05.3_61pctmoe" "CDP05.3_62est"   
## [49] "CDP05.3_62moe"    "CDP05.3_62pct"    "CDP05.3_62pctmoe" "CDP05.3_63est"   
## [53] "CDP05.3_63moe"    "CDP05.3_63pct"    "CDP05.3_63pctmoe" "CDP05.3_64est"   
## [57] "CDP05.3_64moe"    "CDP05.3_64pct"    "CDP05.3_64pctmoe" "CDP05.3_65est"   
## [61] "CDP05.3_65moe"    "CDP05.3_65pct"    "CDP05.3_65pctmoe" "CDP05.3_66est"   
## [65] "CDP05.3_66moe"    "CDP05.3_66pct"    "CDP05.3_66pctmoe"

Renaming Variables

I used the data dictionary provided to rename the variable names. *note: It looks like they only looked combined all of the Asian population which is a pretty big umbrella. It may be worth looking into what exactly this variable includes.

race_names<- c("geo_id",
              "dist", 
              "leaid", 
              "year", 
              "Iteration",
               "total_pop_est", #Total population
               "total_pop_moe", # total population MOE
               "total_hisp_latino", #Total population; Hispanic or Latino (of any race)
               "total_hisp_latino_moe", #Total population; Hispanic or Latino (of any race) MOE
               "pct_hisp_latino", # % total population: Hispanic or Latino (of any race)
               "pct_hisp_latino_moe", # % total population: Hispanic or Latino (of any race) MOE
               "total_mexican", # total mexican population
               "total_mexican_moe", # total mexican population MOE
               "pct_mexican", # % mexican population
               "pct_mexican_moe", # % mexican population MOE
               "total_puertrican", # total puertorican population
               "total_puertrican_moe", # total puertorican population MOE
               "pct_puertrican",  # % puertorican population
               "pct_puertrican_moe", # % puertorican population MOE
               "total_cuban", # total cuban population
               "total_cuban_moe", # total cuban population MOE
               "pct_cuban", # % cuban population
               "pct_cuban_moe", # % cuban population MOE
               "total_other_hl", # total population of other hispanic and latino
               "total_other_hl_moe", # total population of other hispanic and latino MOE
               "pct_other_hl", # % population of other hispanic and latino
               "pct_other_hl_moe", # % population of other hispanic and latino MOE
               "total_NOT_hl", # total population that are not hispanic nor latino
               "total_NOT_hlmoe", # total population that are not hispanic nor latino MOE
               "pct_NOT_hl", # % population that are not hispanic nor latino
               "pct_NOT_hl_moe", # % population that are not hispanic nor latino MOE
               "total_white", #total population white
               "total_white_moe", #total population white MOE
               "pct_white", # % population white
               "pct_white_moe", # % population white MOE
               "total_black", #total population black or african american
               "total_black_moe", #total population black or african american MOE
               "pct_black", # % population black or african american
               "pct_black_moe", # % population black or african american MOE
               "total_native", #total native population 
               "total_native_moe", #total native population MOE
               "pct_native", # % native population
               "pct_native_moe", # % native population MOE
               "total_asian", #total asian population 
               "total_asian_moe", #total asian population MOE
               "pct_asian", # % asian population
               "pct_asian_moe", # % asian population MOE
               "total_PI", # total PI = Native Hawiian/PAcific Islander 
               "total_PI_moe", # total PI = Native Hawiian/PAcific Islander MOE
               "pct_PI", # % PI 
               "pct_PI_moe", # % PI MOE
               "total_other", #total people of other race (nonhisp/latino)
               "total_other_moe", #total people of other race (nonhisp/latino) MOE
               "pct_other", # % people of other race (nonhisp/latino)
               "pct_other_moe", #% people of other race (nonhisp/latino) MOE
               "total_nonhl_2race", #non hispanic or latio with 2 races or more
               "total_nonhl_2race_moe", #non hispanic or latio with 2 races or more MOE
               "pct_nonhl_2race", # % non hispanic or latio with 2 races or more
               "pct_nonhl_2race_moe", # % non hispanic or latio with 2 races or more MOE
               "total_nonhl_2_other", #Total population; Not Hispanic or Latino; Two or more                                          races; Two races including Some other race
               "total_nonhl_2_other_moe", #MOE
               "pct_nonhl_2_other", # % population; Not Hispanic or Latino; Two or more                                          races; Two races including Some other race
               "pct_nonhl_2_other_moe", 
               "total_nonhl_2_3other", # Total population; Not Hispanic or Latino; Two or more                                          races; Two races excluding Some other race, and Three                                           or more races
               "total_nonhl_2_3other_moe", 
               "pct_nonhl_2_3other", # % population; Not Hispanic or Latino; Two or more                                               races; Two races excluding Some other race, and Three                                           or more races
               "pct_nonhl_2_3other_moe"
)
names(race_data) <- race_names
race_data <- race_data %>%
  select(-"Iteration") %>% # This variable is not relevant, as it is the same through each entry. We can keep in mind that it is 105.
  mutate(leaid = as.integer(leaid))
  
race_data %>% head(10)
## # A tibble: 10 × 66
##    geo_id        dist   leaid year  total_pop_est total_pop_moe total_hisp_lati…
##    <chr>         <chr>  <int> <chr>         <dbl>         <dbl>            <dbl>
##  1 97000US27001… A.C.… 2.70e6 2014…           885           105               50
##  2 97000US45006… Abbe… 4.50e6 2014…          3420           223               25
##  3 97000US55000… Abbo… 5.50e6 2014…           685           124              285
##  4 97000US48073… Abbo… 4.81e6 2014…           190            58                4
##  5 97000US28003… Aber… 2.80e6 2014…          1405           233               10
##  6 97000US53000… Aber… 5.30e6 2014…          3480           347              980
##  7 97000US16000… Aber… 1.60e6 2014…           745           196              365
##  8 97000US48074… Aber… 4.81e6 2014…           805           166              515
##  9 97000US48074… Abil… 4.81e6 2014…         15410           602             6515
## 10 97000US20031… Abil… 2.00e6 2014…          1270           177               60
## # … with 59 more variables: total_hisp_latino_moe <dbl>, pct_hisp_latino <dbl>,
## #   pct_hisp_latino_moe <dbl>, total_mexican <dbl>, total_mexican_moe <dbl>,
## #   pct_mexican <dbl>, pct_mexican_moe <dbl>, total_puertrican <dbl>,
## #   total_puertrican_moe <dbl>, pct_puertrican <dbl>, pct_puertrican_moe <dbl>,
## #   total_cuban <dbl>, total_cuban_moe <dbl>, pct_cuban <dbl>,
## #   pct_cuban_moe <dbl>, total_other_hl <dbl>, total_other_hl_moe <dbl>,
## #   pct_other_hl <dbl>, pct_other_hl_moe <dbl>, total_NOT_hl <dbl>, …

What is a Geo ID?

It appears that the geoid** is a combination of some sort of US code (97000US), followed by a two digit state fips code, and lastly the district ID used in the original NHGIS district data. The same names of school districts, without specification about which state they are from (see Lincoln County School District). This may be problematic in the joining process.

race_data %>%
filter(str_detect(dist, 'Lincoln County School District'))
## # A tibble: 9 × 66
##   geo_id         dist   leaid year  total_pop_est total_pop_moe total_hisp_lati…
##   <chr>          <chr>  <int> <chr>         <dbl>         <dbl>            <dbl>
## 1 97000US1303330 Linc… 1.30e6 2014…          1070           120               55
## 2 97000US2103480 Linc… 2.10e6 2014…          3675           279              140
## 3 97000US3200270 Linc… 3.20e6 2014…           645           192              115
## 4 97000US4107500 Linc… 4.11e6 2014…          5060           233             1010
## 5 97000US5400660 Linc… 5.40e6 2014…          3395           152               40
## 6 97000US4702490 Linc… 4.70e6 2014…          4540           296              345
## 7 97000US2802640 Linc… 2.80e6 2014…          3160           374              150
## 8 97000US5604030 Linc… 5.60e6 2014…           610           126               50
## 9 97000US5604060 Linc… 5.60e6 2014…          2900           270              185
## # … with 59 more variables: total_hisp_latino_moe <dbl>, pct_hisp_latino <dbl>,
## #   pct_hisp_latino_moe <dbl>, total_mexican <dbl>, total_mexican_moe <dbl>,
## #   pct_mexican <dbl>, pct_mexican_moe <dbl>, total_puertrican <dbl>,
## #   total_puertrican_moe <dbl>, pct_puertrican <dbl>, pct_puertrican_moe <dbl>,
## #   total_cuban <dbl>, total_cuban_moe <dbl>, pct_cuban <dbl>,
## #   pct_cuban_moe <dbl>, total_other_hl <dbl>, total_other_hl_moe <dbl>,
## #   pct_other_hl <dbl>, pct_other_hl_moe <dbl>, total_NOT_hl <dbl>, …

Update: After some exploration, we now know that that the two digit state code (fips) and the district ID make up the leaid which is already included in the race data. Instead of separating the geoid as we did previously, we will use the leaid to join with the household data.

Joining using leaid

There are 1,404 missing values which is the difference between the two data sets - household data (13314), race_data (11910). This is because the household data is missing 1404 leaids. We successfully joined all of the available race data with the district data.

dist_race_join <- hh %>%
  left_join(race_data, by=c("leaid"))%>%
  select(-dist.y)%>%
  rename(dist = dist.x) %>%
  relocate(where(is.numeric), .after = where(is.character))


colSums(is.na(dist_race_join))
##                    state                     dist                   region 
##                        0                        0                        2 
##                   geo_id                     year                    leaid 
##                     1404                     1404                        0 
##                 children                  pct_pov                   pct_SP 
##                        0                        0                        0 
##                   SP_MOE                 pct_HHVJ                 HHVJ_MOE 
##                        0                        0                        0 
##                   pct_CC                   CC_MOE                  pct_NCI 
##                        0                        0                        0 
##                  nci_MOE                   pct_CD                   CD_MOE 
##                        0                        0                        0 
##                  pct_CLI                  CLI_MOE            total_pop_est 
##                        0                        0                     1404 
##            total_pop_moe        total_hisp_latino    total_hisp_latino_moe 
##                     1404                     1404                     1404 
##          pct_hisp_latino      pct_hisp_latino_moe            total_mexican 
##                     1404                     1404                     1404 
##        total_mexican_moe              pct_mexican          pct_mexican_moe 
##                     1404                     1404                     1404 
##         total_puertrican     total_puertrican_moe           pct_puertrican 
##                     1404                     1404                     1404 
##       pct_puertrican_moe              total_cuban          total_cuban_moe 
##                     1404                     1404                     1404 
##                pct_cuban            pct_cuban_moe           total_other_hl 
##                     1404                     1404                     1404 
##       total_other_hl_moe             pct_other_hl         pct_other_hl_moe 
##                     1404                     1404                     1404 
##             total_NOT_hl          total_NOT_hlmoe               pct_NOT_hl 
##                     1404                     1404                     1404 
##           pct_NOT_hl_moe              total_white          total_white_moe 
##                     1404                     1404                     1404 
##                pct_white            pct_white_moe              total_black 
##                     1404                     1404                     1404 
##          total_black_moe                pct_black            pct_black_moe 
##                     1404                     1404                     1404 
##             total_native         total_native_moe               pct_native 
##                     1404                     1404                     1404 
##           pct_native_moe              total_asian          total_asian_moe 
##                     1404                     1404                     1404 
##                pct_asian            pct_asian_moe                 total_PI 
##                     1404                     1404                     1404 
##             total_PI_moe                   pct_PI               pct_PI_moe 
##                     1404                     1404                     1404 
##              total_other          total_other_moe                pct_other 
##                     1404                     1404                     1404 
##            pct_other_moe        total_nonhl_2race    total_nonhl_2race_moe 
##                     1404                     1404                     1404 
##          pct_nonhl_2race      pct_nonhl_2race_moe      total_nonhl_2_other 
##                     1404                     1404                     1404 
##  total_nonhl_2_other_moe        pct_nonhl_2_other    pct_nonhl_2_other_moe 
##                     1404                     1404                     1404 
##     total_nonhl_2_3other total_nonhl_2_3other_moe       pct_nonhl_2_3other 
##                     1404                     1404                     1404 
##   pct_nonhl_2_3other_moe 
##                     1404

Missing school districts

Lets see which districts did not join and therefore are the missing school districts in the race data set.

missing_race_dist <- dist_race_join %>% 
  filter_all(any_vars(is.na(.))) %>%
  select(leaid, state, dist, children)

missing_race_dist %>% head(10)
## # A tibble: 10 × 4
##     leaid state   dist                                    children
##     <dbl> <chr>   <chr>                                      <dbl>
##  1 102130 Alabama Linden City School District                  566
##  2 200010 Alaska  Aleutian Region School District               64
##  3 200060 Alaska  Cordova City School District                 448
##  4 200540 Alaska  Nenana City School District                   83
##  5 200630 Alaska  Pelican City School District                   3
##  6 200715 Alaska  Tanana City School District                   39
##  7 200780 Alaska  Valdez City School District                  634
##  8 200800 Alaska  Chugach School District                       81
##  9 400005 Arizona Salome Consolidated Elementary District      158
## 10 400022 Arizona Vernon Elementary District                   139

This may not be too big of an issue if most of those schools are small districts that we were going to drop anyway, but we can see that there are about 463 missing school districts that have more than 150 students which may be important for our analysis.

missing_race_dist %>%
  filter(children >= 150)%>%
  dim()
## [1] 465   4

Next steps

  • Figure out why there are 1,404 missing school districts in the race data and see if the missing data is accessible elsewhere
LS0tCnRpdGxlOiAiSm9pbmluZyBSYWNlIERhdGEgd2l0aCBEaXN0cmljdCBEYXRhIgphdXRob3I6ICJOb2VsIEdvb2R3aW4sIEFiaWdhaWwgSm9wcGEsIEpvbiBHZWlnZXIiCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQKLS0tCgpgYGB7ciBsb2FkLXBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShvcGVuaW50cm8pCmxpYnJhcnkoZ2d0aGVtZXMpCnRoZW1lX3NldCh0aGVtZV9jbGVhbigpKQpgYGAKCiMjIyBJbXBvcnQgZGF0YQoKYGBge3IsIG1lc3NhZ2U9RkFMU0V9CnJhY2VfZGF0YSA8LSByZWFkX2RlbGltKCIuLi9yYXcvcmFjZV9yYXcudHh0IiwgZGVsaW0gPSAifCIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpCmhoIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2hoLmNzdiIpCmBgYAoKCgpgYGB7cn0KbmFtZXMocmFjZV9kYXRhKQpgYGAKCiMjIyBSZW5hbWluZyBWYXJpYWJsZXMKCkkgdXNlZCB0aGUgZGF0YSBkaWN0aW9uYXJ5IHByb3ZpZGVkIHRvIHJlbmFtZSB0aGUgdmFyaWFibGUgbmFtZXMuIAoqbm90ZTogSXQgbG9va3MgbGlrZSB0aGV5IG9ubHkgbG9va2VkIGNvbWJpbmVkIGFsbCBvZiB0aGUgQXNpYW4gcG9wdWxhdGlvbiB3aGljaCBpcyBhIHByZXR0eSBiaWcgdW1icmVsbGEuIEl0IG1heSBiZSB3b3J0aCBsb29raW5nIGludG8gd2hhdCBleGFjdGx5IHRoaXMgdmFyaWFibGUgaW5jbHVkZXMuIApgYGB7cn0KcmFjZV9uYW1lczwtIGMoImdlb19pZCIsCiAgICAgICAgICAgICAgImRpc3QiLCAKICAgICAgICAgICAgICAibGVhaWQiLCAKICAgICAgICAgICAgICAieWVhciIsIAogICAgICAgICAgICAgICJJdGVyYXRpb24iLAogICAgICAgICAgICAgICAidG90YWxfcG9wX2VzdCIsICNUb3RhbCBwb3B1bGF0aW9uCiAgICAgICAgICAgICAgICJ0b3RhbF9wb3BfbW9lIiwgIyB0b3RhbCBwb3B1bGF0aW9uIE1PRQogICAgICAgICAgICAgICAidG90YWxfaGlzcF9sYXRpbm8iLCAjVG90YWwgcG9wdWxhdGlvbjsgSGlzcGFuaWMgb3IgTGF0aW5vIChvZiBhbnkgcmFjZSkKICAgICAgICAgICAgICAgInRvdGFsX2hpc3BfbGF0aW5vX21vZSIsICNUb3RhbCBwb3B1bGF0aW9uOyBIaXNwYW5pYyBvciBMYXRpbm8gKG9mIGFueSByYWNlKSBNT0UKICAgICAgICAgICAgICAgInBjdF9oaXNwX2xhdGlubyIsICMgJSB0b3RhbCBwb3B1bGF0aW9uOiBIaXNwYW5pYyBvciBMYXRpbm8gKG9mIGFueSByYWNlKQogICAgICAgICAgICAgICAicGN0X2hpc3BfbGF0aW5vX21vZSIsICMgJSB0b3RhbCBwb3B1bGF0aW9uOiBIaXNwYW5pYyBvciBMYXRpbm8gKG9mIGFueSByYWNlKSBNT0UKICAgICAgICAgICAgICAgInRvdGFsX21leGljYW4iLCAjIHRvdGFsIG1leGljYW4gcG9wdWxhdGlvbgogICAgICAgICAgICAgICAidG90YWxfbWV4aWNhbl9tb2UiLCAjIHRvdGFsIG1leGljYW4gcG9wdWxhdGlvbiBNT0UKICAgICAgICAgICAgICAgInBjdF9tZXhpY2FuIiwgIyAlIG1leGljYW4gcG9wdWxhdGlvbgogICAgICAgICAgICAgICAicGN0X21leGljYW5fbW9lIiwgIyAlIG1leGljYW4gcG9wdWxhdGlvbiBNT0UKICAgICAgICAgICAgICAgInRvdGFsX3B1ZXJ0cmljYW4iLCAjIHRvdGFsIHB1ZXJ0b3JpY2FuIHBvcHVsYXRpb24KICAgICAgICAgICAgICAgInRvdGFsX3B1ZXJ0cmljYW5fbW9lIiwgIyB0b3RhbCBwdWVydG9yaWNhbiBwb3B1bGF0aW9uIE1PRQogICAgICAgICAgICAgICAicGN0X3B1ZXJ0cmljYW4iLCAgIyAlIHB1ZXJ0b3JpY2FuIHBvcHVsYXRpb24KICAgICAgICAgICAgICAgInBjdF9wdWVydHJpY2FuX21vZSIsICMgJSBwdWVydG9yaWNhbiBwb3B1bGF0aW9uIE1PRQogICAgICAgICAgICAgICAidG90YWxfY3ViYW4iLCAjIHRvdGFsIGN1YmFuIHBvcHVsYXRpb24KICAgICAgICAgICAgICAgInRvdGFsX2N1YmFuX21vZSIsICMgdG90YWwgY3ViYW4gcG9wdWxhdGlvbiBNT0UKICAgICAgICAgICAgICAgInBjdF9jdWJhbiIsICMgJSBjdWJhbiBwb3B1bGF0aW9uCiAgICAgICAgICAgICAgICJwY3RfY3ViYW5fbW9lIiwgIyAlIGN1YmFuIHBvcHVsYXRpb24gTU9FCiAgICAgICAgICAgICAgICJ0b3RhbF9vdGhlcl9obCIsICMgdG90YWwgcG9wdWxhdGlvbiBvZiBvdGhlciBoaXNwYW5pYyBhbmQgbGF0aW5vCiAgICAgICAgICAgICAgICJ0b3RhbF9vdGhlcl9obF9tb2UiLCAjIHRvdGFsIHBvcHVsYXRpb24gb2Ygb3RoZXIgaGlzcGFuaWMgYW5kIGxhdGlubyBNT0UKICAgICAgICAgICAgICAgInBjdF9vdGhlcl9obCIsICMgJSBwb3B1bGF0aW9uIG9mIG90aGVyIGhpc3BhbmljIGFuZCBsYXRpbm8KICAgICAgICAgICAgICAgInBjdF9vdGhlcl9obF9tb2UiLCAjICUgcG9wdWxhdGlvbiBvZiBvdGhlciBoaXNwYW5pYyBhbmQgbGF0aW5vIE1PRQogICAgICAgICAgICAgICAidG90YWxfTk9UX2hsIiwgIyB0b3RhbCBwb3B1bGF0aW9uIHRoYXQgYXJlIG5vdCBoaXNwYW5pYyBub3IgbGF0aW5vCiAgICAgICAgICAgICAgICJ0b3RhbF9OT1RfaGxtb2UiLCAjIHRvdGFsIHBvcHVsYXRpb24gdGhhdCBhcmUgbm90IGhpc3BhbmljIG5vciBsYXRpbm8gTU9FCiAgICAgICAgICAgICAgICJwY3RfTk9UX2hsIiwgIyAlIHBvcHVsYXRpb24gdGhhdCBhcmUgbm90IGhpc3BhbmljIG5vciBsYXRpbm8KICAgICAgICAgICAgICAgInBjdF9OT1RfaGxfbW9lIiwgIyAlIHBvcHVsYXRpb24gdGhhdCBhcmUgbm90IGhpc3BhbmljIG5vciBsYXRpbm8gTU9FCiAgICAgICAgICAgICAgICJ0b3RhbF93aGl0ZSIsICN0b3RhbCBwb3B1bGF0aW9uIHdoaXRlCiAgICAgICAgICAgICAgICJ0b3RhbF93aGl0ZV9tb2UiLCAjdG90YWwgcG9wdWxhdGlvbiB3aGl0ZSBNT0UKICAgICAgICAgICAgICAgInBjdF93aGl0ZSIsICMgJSBwb3B1bGF0aW9uIHdoaXRlCiAgICAgICAgICAgICAgICJwY3Rfd2hpdGVfbW9lIiwgIyAlIHBvcHVsYXRpb24gd2hpdGUgTU9FCiAgICAgICAgICAgICAgICJ0b3RhbF9ibGFjayIsICN0b3RhbCBwb3B1bGF0aW9uIGJsYWNrIG9yIGFmcmljYW4gYW1lcmljYW4KICAgICAgICAgICAgICAgInRvdGFsX2JsYWNrX21vZSIsICN0b3RhbCBwb3B1bGF0aW9uIGJsYWNrIG9yIGFmcmljYW4gYW1lcmljYW4gTU9FCiAgICAgICAgICAgICAgICJwY3RfYmxhY2siLCAjICUgcG9wdWxhdGlvbiBibGFjayBvciBhZnJpY2FuIGFtZXJpY2FuCiAgICAgICAgICAgICAgICJwY3RfYmxhY2tfbW9lIiwgIyAlIHBvcHVsYXRpb24gYmxhY2sgb3IgYWZyaWNhbiBhbWVyaWNhbiBNT0UKICAgICAgICAgICAgICAgInRvdGFsX25hdGl2ZSIsICN0b3RhbCBuYXRpdmUgcG9wdWxhdGlvbiAKICAgICAgICAgICAgICAgInRvdGFsX25hdGl2ZV9tb2UiLCAjdG90YWwgbmF0aXZlIHBvcHVsYXRpb24gTU9FCiAgICAgICAgICAgICAgICJwY3RfbmF0aXZlIiwgIyAlIG5hdGl2ZSBwb3B1bGF0aW9uCiAgICAgICAgICAgICAgICJwY3RfbmF0aXZlX21vZSIsICMgJSBuYXRpdmUgcG9wdWxhdGlvbiBNT0UKICAgICAgICAgICAgICAgInRvdGFsX2FzaWFuIiwgI3RvdGFsIGFzaWFuIHBvcHVsYXRpb24gCiAgICAgICAgICAgICAgICJ0b3RhbF9hc2lhbl9tb2UiLCAjdG90YWwgYXNpYW4gcG9wdWxhdGlvbiBNT0UKICAgICAgICAgICAgICAgInBjdF9hc2lhbiIsICMgJSBhc2lhbiBwb3B1bGF0aW9uCiAgICAgICAgICAgICAgICJwY3RfYXNpYW5fbW9lIiwgIyAlIGFzaWFuIHBvcHVsYXRpb24gTU9FCiAgICAgICAgICAgICAgICJ0b3RhbF9QSSIsICMgdG90YWwgUEkgPSBOYXRpdmUgSGF3aWlhbi9QQWNpZmljIElzbGFuZGVyIAogICAgICAgICAgICAgICAidG90YWxfUElfbW9lIiwgIyB0b3RhbCBQSSA9IE5hdGl2ZSBIYXdpaWFuL1BBY2lmaWMgSXNsYW5kZXIgTU9FCiAgICAgICAgICAgICAgICJwY3RfUEkiLCAjICUgUEkgCiAgICAgICAgICAgICAgICJwY3RfUElfbW9lIiwgIyAlIFBJIE1PRQogICAgICAgICAgICAgICAidG90YWxfb3RoZXIiLCAjdG90YWwgcGVvcGxlIG9mIG90aGVyIHJhY2UgKG5vbmhpc3AvbGF0aW5vKQogICAgICAgICAgICAgICAidG90YWxfb3RoZXJfbW9lIiwgI3RvdGFsIHBlb3BsZSBvZiBvdGhlciByYWNlIChub25oaXNwL2xhdGlubykgTU9FCiAgICAgICAgICAgICAgICJwY3Rfb3RoZXIiLCAjICUgcGVvcGxlIG9mIG90aGVyIHJhY2UgKG5vbmhpc3AvbGF0aW5vKQogICAgICAgICAgICAgICAicGN0X290aGVyX21vZSIsICMlIHBlb3BsZSBvZiBvdGhlciByYWNlIChub25oaXNwL2xhdGlubykgTU9FCiAgICAgICAgICAgICAgICJ0b3RhbF9ub25obF8ycmFjZSIsICNub24gaGlzcGFuaWMgb3IgbGF0aW8gd2l0aCAyIHJhY2VzIG9yIG1vcmUKICAgICAgICAgICAgICAgInRvdGFsX25vbmhsXzJyYWNlX21vZSIsICNub24gaGlzcGFuaWMgb3IgbGF0aW8gd2l0aCAyIHJhY2VzIG9yIG1vcmUgTU9FCiAgICAgICAgICAgICAgICJwY3Rfbm9uaGxfMnJhY2UiLCAjICUgbm9uIGhpc3BhbmljIG9yIGxhdGlvIHdpdGggMiByYWNlcyBvciBtb3JlCiAgICAgICAgICAgICAgICJwY3Rfbm9uaGxfMnJhY2VfbW9lIiwgIyAlIG5vbiBoaXNwYW5pYyBvciBsYXRpbyB3aXRoIDIgcmFjZXMgb3IgbW9yZSBNT0UKICAgICAgICAgICAgICAgInRvdGFsX25vbmhsXzJfb3RoZXIiLCAjVG90YWwgcG9wdWxhdGlvbjsgTm90IEhpc3BhbmljIG9yIExhdGlubzsgVHdvIG9yIG1vcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWNlczsgVHdvIHJhY2VzIGluY2x1ZGluZyBTb21lIG90aGVyIHJhY2UKICAgICAgICAgICAgICAgInRvdGFsX25vbmhsXzJfb3RoZXJfbW9lIiwgI01PRQogICAgICAgICAgICAgICAicGN0X25vbmhsXzJfb3RoZXIiLCAjICUgcG9wdWxhdGlvbjsgTm90IEhpc3BhbmljIG9yIExhdGlubzsgVHdvIG9yIG1vcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWNlczsgVHdvIHJhY2VzIGluY2x1ZGluZyBTb21lIG90aGVyIHJhY2UKICAgICAgICAgICAgICAgInBjdF9ub25obF8yX290aGVyX21vZSIsIAogICAgICAgICAgICAgICAidG90YWxfbm9uaGxfMl8zb3RoZXIiLCAjIFRvdGFsIHBvcHVsYXRpb247IE5vdCBIaXNwYW5pYyBvciBMYXRpbm87IFR3byBvciBtb3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFjZXM7IFR3byByYWNlcyBleGNsdWRpbmcgU29tZSBvdGhlciByYWNlLCBhbmQgVGhyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgbW9yZSByYWNlcwogICAgICAgICAgICAgICAidG90YWxfbm9uaGxfMl8zb3RoZXJfbW9lIiwgCiAgICAgICAgICAgICAgICJwY3Rfbm9uaGxfMl8zb3RoZXIiLCAjICUgcG9wdWxhdGlvbjsgTm90IEhpc3BhbmljIG9yIExhdGlubzsgVHdvIG9yIG1vcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhY2VzOyBUd28gcmFjZXMgZXhjbHVkaW5nIFNvbWUgb3RoZXIgcmFjZSwgYW5kIFRocmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG1vcmUgcmFjZXMKICAgICAgICAgICAgICAgInBjdF9ub25obF8yXzNvdGhlcl9tb2UiCikKbmFtZXMocmFjZV9kYXRhKSA8LSByYWNlX25hbWVzCnJhY2VfZGF0YSA8LSByYWNlX2RhdGEgJT4lCiAgc2VsZWN0KC0iSXRlcmF0aW9uIikgJT4lICMgVGhpcyB2YXJpYWJsZSBpcyBub3QgcmVsZXZhbnQsIGFzIGl0IGlzIHRoZSBzYW1lIHRocm91Z2ggZWFjaCBlbnRyeS4gV2UgY2FuIGtlZXAgaW4gbWluZCB0aGF0IGl0IGlzIDEwNS4KICBtdXRhdGUobGVhaWQgPSBhcy5pbnRlZ2VyKGxlYWlkKSkKICAKcmFjZV9kYXRhICU+JSBoZWFkKDEwKQpgYGAKCiMjIyBXaGF0IGlzIGEgR2VvIElEPyAKSXQgYXBwZWFycyB0aGF0IHRoZSBnZW9pZCoqIGlzIGEgY29tYmluYXRpb24gb2Ygc29tZSBzb3J0IG9mIFVTIGNvZGUgKDk3MDAwVVMpLCBmb2xsb3dlZCBieSBhIHR3byBkaWdpdCBzdGF0ZSBmaXBzIGNvZGUsIGFuZCBsYXN0bHkgdGhlIGRpc3RyaWN0IElEIHVzZWQgaW4gdGhlIG9yaWdpbmFsIE5IR0lTIGRpc3RyaWN0IGRhdGEuIFRoZSBzYW1lIG5hbWVzIG9mIHNjaG9vbCBkaXN0cmljdHMsIHdpdGhvdXQgc3BlY2lmaWNhdGlvbiBhYm91dCB3aGljaCBzdGF0ZSB0aGV5IGFyZSBmcm9tIChzZWUgTGluY29sbiBDb3VudHkgU2Nob29sIERpc3RyaWN0KS4gVGhpcyBtYXkgYmUgcHJvYmxlbWF0aWMgaW4gdGhlIGpvaW5pbmcgcHJvY2Vzcy4gCgpgYGB7cn0KcmFjZV9kYXRhICU+JQpmaWx0ZXIoc3RyX2RldGVjdChkaXN0LCAnTGluY29sbiBDb3VudHkgU2Nob29sIERpc3RyaWN0JykpCmBgYAoKVXBkYXRlOiBBZnRlciBzb21lIGV4cGxvcmF0aW9uLCB3ZSBub3cga25vdyB0aGF0IHRoYXQgdGhlIHR3byBkaWdpdCBzdGF0ZSBjb2RlIChmaXBzKSBhbmQgdGhlIGRpc3RyaWN0IElEIG1ha2UgdXAgdGhlIGxlYWlkIHdoaWNoIGlzIGFscmVhZHkgaW5jbHVkZWQgaW4gdGhlIHJhY2UgZGF0YS4gSW5zdGVhZCBvZiBzZXBhcmF0aW5nIHRoZSBnZW9pZCBhcyB3ZSBkaWQgcHJldmlvdXNseSwgd2Ugd2lsbCB1c2UgdGhlIGxlYWlkIHRvIGpvaW4gd2l0aCB0aGUgaG91c2Vob2xkIGRhdGEuIAoKIyMjIEpvaW5pbmcgdXNpbmcgbGVhaWQKClRoZXJlIGFyZSAxLDQwNCBtaXNzaW5nIHZhbHVlcyB3aGljaCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gZGF0YSBzZXRzIC0gaG91c2Vob2xkIGRhdGEgKDEzMzE0KSwgcmFjZV9kYXRhICgxMTkxMCkuIFRoaXMgaXMgYmVjYXVzZSB0aGUgaG91c2Vob2xkIGRhdGEgaXMgbWlzc2luZyAxNDA0IGxlYWlkcy4gV2Ugc3VjY2Vzc2Z1bGx5IGpvaW5lZCBhbGwgb2YgdGhlIGF2YWlsYWJsZSByYWNlIGRhdGEgd2l0aCB0aGUgZGlzdHJpY3QgZGF0YS4gCmBgYHtyfQoKZGlzdF9yYWNlX2pvaW4gPC0gaGggJT4lCiAgbGVmdF9qb2luKHJhY2VfZGF0YSwgYnk9YygibGVhaWQiKSklPiUKICBzZWxlY3QoLWRpc3QueSklPiUKICByZW5hbWUoZGlzdCA9IGRpc3QueCkgJT4lCiAgcmVsb2NhdGUod2hlcmUoaXMubnVtZXJpYyksIC5hZnRlciA9IHdoZXJlKGlzLmNoYXJhY3RlcikpCgoKY29sU3Vtcyhpcy5uYShkaXN0X3JhY2Vfam9pbikpCgoKYGBgCgojIyMgTWlzc2luZyBzY2hvb2wgZGlzdHJpY3RzCgpMZXRzIHNlZSB3aGljaCBkaXN0cmljdHMgZGlkIG5vdCBqb2luIGFuZCB0aGVyZWZvcmUgYXJlIHRoZSBtaXNzaW5nIHNjaG9vbCBkaXN0cmljdHMgaW4gdGhlIHJhY2UgZGF0YSBzZXQuIAoKYGBge3J9CgptaXNzaW5nX3JhY2VfZGlzdCA8LSBkaXN0X3JhY2Vfam9pbiAlPiUgCiAgZmlsdGVyX2FsbChhbnlfdmFycyhpcy5uYSguKSkpICU+JQogIHNlbGVjdChsZWFpZCwgc3RhdGUsIGRpc3QsIGNoaWxkcmVuKQoKbWlzc2luZ19yYWNlX2Rpc3QgJT4lIGhlYWQoMTApCgpgYGAKClRoaXMgbWF5IG5vdCBiZSB0b28gYmlnIG9mIGFuIGlzc3VlIGlmIG1vc3Qgb2YgdGhvc2Ugc2Nob29scyBhcmUgc21hbGwgZGlzdHJpY3RzIHRoYXQgd2Ugd2VyZSBnb2luZyB0byBkcm9wIGFueXdheSwgYnV0IHdlIGNhbiBzZWUgdGhhdCB0aGVyZSBhcmUgYWJvdXQgNDYzIG1pc3Npbmcgc2Nob29sIGRpc3RyaWN0cyB0aGF0IGhhdmUgbW9yZSB0aGFuIDE1MCBzdHVkZW50cyB3aGljaCBtYXkgYmUgaW1wb3J0YW50IGZvciBvdXIgYW5hbHlzaXMuIApgYGB7cn0KbWlzc2luZ19yYWNlX2Rpc3QgJT4lCiAgZmlsdGVyKGNoaWxkcmVuID49IDE1MCklPiUKICBkaW0oKQpgYGAKCiMjIyBOZXh0IHN0ZXBzCgotIEZpZ3VyZSBvdXQgd2h5IHRoZXJlIGFyZSAxLDQwNCBtaXNzaW5nIHNjaG9vbCBkaXN0cmljdHMgaW4gdGhlIHJhY2UgZGF0YSBhbmQgc2VlIGlmIHRoZSBtaXNzaW5nIGRhdGEgaXMgYWNjZXNzaWJsZSBlbHNld2hlcmUKCg==