Introduction

This data analysis was completed for a story on deaths of people experiencing homelessness called “Hundreds of people experiencing homelessness died in Maricopa County last year. Will 2023 be worse?”

It ran on The Arizona Republic’s website on July 26, 2023 and on the front page of the Sunday print edition on August 6, 2023.

The data was obtained by email from Lisa Glow, CEO of Central Arizona Shelter Services, on Feb. 8, 2023. It is data from the Maricopa County Office of the Medical Examiner that contains all “transient deaths” in 2022, meaning deaths of people experiencing homelessness. The original data was provided in two spreadsheets: deaths ruled an accident or natural, and deaths ruled a homicide or unknown. I confirmed with Jessie Caraveo, Maricopa County PIO, that this data is correct and was obtained from the Maricopa County Office of the Medical Examiner. Here, I will combine the two data sets and analyze them for a story on deaths of people experiencing homelessness in Maricopa County, Arizona in 2022.

Key findings

Note: I didn’t use all of this analysis in the story. Instead, I explored a number of angles to see which were the most compelling and crucial to include.

  • 570 out of 794 deaths were ruled an accident, or about 72%. Only 11% were deemed natural. 36 were homicides and 22 were suicides. 60 have no manner of death listed. Those cases were also not on the ME’s website, but were in the data provided to us by CASS/the ME’s office. 13 cases are undetermined and 3 are listed as “fetal.”

  • Men are overrepresented in the data. Over 80% of decedents were male. According to PIT data, 65% of people experiencing homelessness in the county in early 2022 identified as male.

  • White people are also overrepresented in the data. Almost 3/4 of the deaths were white people. But Hispanic and Latino people were not overrepresented: 19% of the deaths were Hispanic or Latino people. According to Point-in-Time count data, 63% of people experiencing homelessness in the county in early 2022 were white, and about 24% were Hispanic/Latino. (The Point-in-Time count is an annual census of people experiencing homelessness in a given region.)

  • Black people were underrepresented in the data. About 12% of the deaths were Black people. According to Point-in-Time count data, 26% of people experiencing homelessness in the county in early 2022 were Black.

  • However, while only 12% of the overall deaths were Black people, they made up 25% of the homicide victims. That’s closer to their percent of overall people experiencing homelessness (26%).

  • Native American and Alaskan Native people were overrepresented. About 11% of the deaths were Native American or Alaska Native people. They made up about 7% of the people in the 2022 Point-in-Time count.

  • The top five zip codes with the most deaths were 85006, 85007, 85013, 85008 and 85009.

  • About 44% of the deaths occurred outside.

  • In just over half of the cases (439/794, or 55%), the primary cause of death involved substance use. Those numbers were 265, or 51%, in 2021; 375, or 63%, in 2020; not listed in 2019 report.

  • In 85 cases, the primary cause of death was heat exposure.

  • In 6 cases, the primary cause of death was COVID-19.

  • In 66 cases, the primary cause of death was blunt force injuries/trauma.

  • People were fatally being struck by a vehicle in at least 62 cases.

  • This year there were 794 deaths of people experiencing homelessness. According to Medical Examiner annual reports, there were 517 deaths in 2021, 596 deaths in 2020, 259 in 2019 and 224 in 2018. There is no data in the annual reports before 2018, though those reports did include the number of unclaimed bodies. This data is a bit more robust than the annual reports, as it includes some cases that the annual reports don’t capture, so these numbers shouldn’t be directly compared to each other. But they indicate broadly that the deaths are increasing.

  • The zip codes with the most vehicle deaths (not including car crashes) are 85006 and 85013. That could be because those zip codes have hospitals in them.

  • 36 deaths were a homicide, or 5%. In 2021, 25/517 medical examiner cases of people experiencing homelessness were homicides, or 5%. In 2020, 21/596 were homicides, or 4%.

  • According to Miguel, there were 428 total homicides in Maricopa County last year. That means 35/425, or 8%, of homicide victims were homeless.

  • July was the deadliest month by far, with more than twice as many deaths as any other month, followed by August and June. July had 44 heat deaths– almost 3x as many as the next highest month, June (15 deaths).

  • July 13 and July 17 were the deadliest days of 2022 for people experiencing homelessness, with 15 deaths each.

  • The deadliest week of the year was July 16-July 22, with 69 deaths. The week before it had 47 deaths.

Analysis

# Reading in both datasets.

transient_deaths_accident_og <-
  read_excel("transient_deaths_desc_22.xlsx")
## New names:
## * `` -> ...2
## * `` -> ...3
## * `` -> ...4
## * `` -> ...5
## * `` -> ...6
## * ...
transient_deaths_homicide_og <-
  read_excel("transient_deaths_no_desc_22.xlsx")
## New names:
## * `` -> ...2
## * `` -> ...3
## * `` -> ...4
## * `` -> ...5
## * `` -> ...6
## * ...
# Deleting the first few rows from the datasets, which don't contain info we need.

transient_deaths_accident_1 = transient_deaths_accident_og[-c(1),] %>% 
  row_to_names(row_number=1)

transient_deaths_homicide_1 = transient_deaths_homicide_og[-c(1),] %>% 
    row_to_names(row_number=1)
# Renaming column heads for each dataset.

transient_deaths_accident_1 <- clean_names(transient_deaths_accident_1)

transient_deaths_homicide_1 <- clean_names(transient_deaths_homicide_1)
# Adding an "event_description" column and 'sub_manner' column to the transient_deaths_homicide dataframe so both dataframes have all of the same exact columns.

transient_deaths_homicide_1 <- transient_deaths_homicide_1 %>% add_column(event_description="NA", sub_manner="NA")
# Binding the datasets. 

transient_deaths_total <- rbind(transient_deaths_accident_1, transient_deaths_homicide_1)
# Checking that the join worked.

glimpse(transient_deaths_total)
## Rows: 1,291
## Columns: 14
## $ case_number       <chr> "2022-00014", "2022-00022", "2022-00034", "2022-0005…
## $ decedent_name     <chr> "Ortiz , Deion Dean", "Lara Martinez , Marco Antonio…
## $ age               <chr> "21", "20", "47", "45", "27", "40", "76", "31", "60"…
## $ sex               <chr> "Male", "Male", "Male", "Male", "Male", "Male", "Mal…
## $ ethnicity         <chr> "Not Hispanic or Latino", NA, "Not Hispanic or Latin…
## $ race              <chr> "American Indian or Alaska Native", NA, "American In…
## $ transient         <chr> "Unknown", "Unknown", "Yes", "Unknown", "Unknown", "…
## $ death_date        <chr> "44562", "44562", "44562", "44562", "44562", "44563"…
## $ sub_manner        <chr> "Pedestrian struck - Vehicle stopped", "Drugs - Mixe…
## $ manner            <chr> "Accident", "Accident", "Accident", "Accident", "Acc…
## $ death_zip_code    <chr> "85224", "85008", "85284", "85008", "85307", "85013"…
## $ death_place_city  <chr> "CHANDLER", "PHOENIX", "TEMPE", "PHOENIX", "GLENDALE…
## $ death_place_type  <chr> "Hospital", "Residence", "Sidewalk", "Hospital", "St…
## $ event_description <chr> "This unidentified Caucasian male of possible Hispan…
# Exporting to Excel.

install.packages("writexl")
## Installing package into '/Users/julietterihl/Library/R/x86_64/4.1/library'
## (as 'lib' is unspecified)
## Error in contrib.url(repos, "source"): trying to use CRAN without setting a mirror
library(writexl)
## Warning: package 'writexl' was built under R version 4.1.2
write_xlsx(transient_deaths_total,"/Users/julietterihl/Documents/Data/Data_Arizona_Republic/transient_deaths_total_2022.xlsx")

Adding scraped data

The medical examiner’s office wanted us to separately submit a records request for the primary cause of death. But that information is listed on the medical examiner’s website, so former Arizona Republic data reporter Justin Price helped build a scraper that scraped the website instead. Justin already joined the scraped data and the original datasets together into one dataset, so let’s load that in:

cod_data_og <- read.csv("/Users/julietterihl/Documents/Data/Data_Arizona_Republic/kunle_scrapeddata_5-12-23.csv")
# Checking to make sure that worked.

glimpse(cod_data_og)
## Rows: 1,289
## Columns: 25
## $ CaseNum                  <chr> "2022-00022", "2022-00034", "2022-00050", "20…
## $ NameLast                 <chr> "Lara Martinez", "Begay", "Lee", "Alvarez", "…
## $ NameFirst                <chr> "Marco", "Collin", "Hyung", "Jose", "Charles"…
## $ NameMiddle               <chr> "Antonio", "", "Bae", "Luis", "Tyson", "", ""…
## $ Sex                      <chr> "Male", "Male", "Male", "Male", "Male", "", "…
## $ DeathDate                <chr> "1/1/22", "1/1/22", "1/1/22", "1/1/22", "1/2/…
## $ MannerOfDeath            <chr> "Accident", "Accident", "Accident", "Accident…
## $ MedExReportReady         <chr> "Yes", "Yes", "Yes", "Yes", "Yes", "", "Yes",…
## $ ReadyForRelease          <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ PrimaryCauseOfDeath      <chr> "Combined toxic effects of fentanyl, para-flu…
## $ ContributoryCauseOfDeath <chr> "", "Hypertensive and atherosclerotic cardiov…
## $ case_number              <chr> "2022-00022", "2022-00034", "2022-00050", "20…
## $ decedent_name            <chr> "Lara Martinez , Marco Antonio", "Begay , Col…
## $ age                      <int> 20, 47, 45, 27, 40, 76, 31, 60, 58, 56, 51, 2…
## $ sex                      <chr> "Male", "Male", "Male", "Male", "Male", "Male…
## $ ethnicity                <chr> "", "Not Hispanic or Latino", "Not Hispanic o…
## $ race                     <chr> "", "American Indian or Alaska Native", "ASIA…
## $ transient                <chr> "Unknown", "Yes", "Unknown", "Unknown", "Yes"…
## $ death_date               <int> 44562, 44562, 44562, 44562, 44563, 44564, 445…
## $ submanner                <chr> "Drugs - Mixed", "Drugs - Alcohol", "Drugs - …
## $ manner                   <chr> "Accident", "Accident", "Accident", "Accident…
## $ death_zip_code           <int> 85008, 85284, 85008, 85307, 85013, 85006, 852…
## $ death_place_city         <chr> "PHOENIX", "TEMPE", "PHOENIX", "GLENDALE", "P…
## $ death_place_type         <chr> "Residence", "Sidewalk", "Hospital", "Street"…
## $ event_description        <chr> "This 20 year old male with history significa…
# Checking to see if there are any rows where the manner of death from the scraped data doesn't match the manner of death in the dataset provided by the ME. 

cod_data_og %>% filter(manner != MannerOfDeath) %>% 
  select(decedent_name, manner, MannerOfDeath)

It looks like the data I got from the medical examiner’s office had many cases with the manner listed as “pending” that were since resolved and updated on the website. It also looks like there are two cases that had the manner listed as homicide in the medical examiner’s original data but nothing listed on the website.

# Checking to see if there are any cases where the person's sex in the original data doesn't match their sex in the scraped website data.

cod_data_og %>% filter(sex != Sex) %>% 
  select(decedent_name, sex, Sex)

The “Sex” column is empty in a lot of the scraped data. That’s probably because there were 90-some rows in the original data that weren’t on the website and thus couldn’t be scraped.

Cleaning data

Now that I have everything I need in one dataset, I’ll clean it up.

# Making all the blank columns NA.

cod_data_1 <- cod_data_og %>% mutate_all(na_if,"")

# Creating a new manner of death column.

cod_data_1 <- cod_data_1 %>% mutate(manner_of_death = ifelse(is.na(MannerOfDeath), manner, MannerOfDeath))

# Getting rid of duplicative columns and other columns we don't need.

clean_data_1 <- subset(cod_data_1, select = -c(decedent_name, death_date, CaseNum, manner, MannerOfDeath, Sex, ReadyForRelease, MedExReportReady))

# Cleaning column names

clean_data_1 <- clean_names(clean_data_1)

# Getting rid of cases where the person's transient status was marked "unknown," as they weren't confirmed to be homeless.

clean_data_1 <- clean_data_1 %>% filter(transient == "Yes") 

clean_data_1$death_date <- mdy(clean_data_1$death_date)

write_xlsx(clean_data_1,"/Users/julietterihl/Documents/Data/Data_Arizona_Republic/transient_deaths_joined_cleaned.xlsx")

write_xlsx(transient_deaths_total,"/Users/julietterihl/Documents/Data/Data_Arizona_Republic/transient_deaths_total_cass.xlsx")

Glimpse

glimpse(clean_data_1)
## Rows: 794
## Columns: 18
## $ name_last                   <chr> "Begay", "Hanna", NA, "Prather", "Adams", …
## $ name_first                  <chr> "Collin", "Charles", NA, "Paul", "Gregory"…
## $ name_middle                 <chr> NA, "Tyson", NA, "Alan", "Allen", "Lee", "…
## $ death_date                  <date> 2022-01-01, 2022-01-02, NA, 2022-01-03, 2…
## $ primary_cause_of_death      <chr> "Acute on chronic ethanolism\n\n\n\n\n\n",…
## $ contributory_cause_of_death <chr> "Hypertensive and atherosclerotic cardiova…
## $ case_number                 <chr> "2022-00034", "2022-00077", "2022-00099", …
## $ age                         <int> 47, 40, 76, 60, 58, 51, 27, 58, 70, 71, 30…
## $ sex                         <chr> "Male", "Male", "Male", "Male", "Male", "M…
## $ ethnicity                   <chr> "Not Hispanic or Latino", "Not Hispanic or…
## $ race                        <chr> "American Indian or Alaska Native", "Ameri…
## $ transient                   <chr> "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", …
## $ submanner                   <chr> "Drugs - Alcohol", "Drugs - Illicit", NA, …
## $ death_zip_code              <int> 85284, 85013, 85006, 85008, 85004, 85210, …
## $ death_place_city            <chr> "TEMPE", "PHOENIX", "PHOENIX", "PHOENIX", …
## $ death_place_type            <chr> "Sidewalk", "Hospital", "Hospital", "Resid…
## $ event_description           <chr> "This 47-year-old male with hypertension, …
## $ manner_of_death             <chr> "Accident", "Accident", NA, "Natural", "Na…

There were 794 rows, or deaths.

Manner of death

clean_data_1 %>% count(manner_of_death) %>% 
  arrange(desc(n))

The majority of deaths of people experiencing homelessness in 2022 were ruled an accident. 570/794= 72%

False positives

# Here I'm filtering the event description for indicators that the person might not have been experiencing homelessness at their time of death, even though they were marked as "transient."

clean_data_1 %>% filter(
  str_detect(event_description,
    "her bed| his bed| their bed| her residence| his residence| their residence"
    )
) %>% 
  select (case_number, event_description)

Inquiring to medical examiner’s office about case numbers 04665, 11599, 07430, 11087 and 12321 as the descriptions indicate they might not have been homeless.

Places

clean_data_1 %>% count(death_place_type) %>% 
  arrange(desc(n))

Hospital was the setting with the highest number of deaths, at 255.

ZIP codes

clean_data_1 %>% count(death_zip_code) %>% 
  arrange(desc(n))

The five ZIP codes with the most deaths in 2022 were 85006, 85007, 85013, 85008 and 85009.

clean_data_1 %>% filter(death_zip_code == "85006") %>% 
  count(death_place_type) %>% 
   arrange(desc(n))

The majority of deaths in ZIP code 85006 were at a hospital.

clean_data_1 %>% filter(death_zip_code == "85007") %>% 
  count(death_place_type) %>% 
   arrange(desc(n))

The sidewalk was where most deaths in 85007 occurred.

clean_data_1 %>% filter(death_zip_code == "85013") %>% 
  count(death_place_type) %>% 
 arrange(desc(n))

Hospital was also the most common place of death for 85013.

clean_data_1 %>% filter(death_zip_code == "85008") %>% 
  count(death_place_type) %>% 
  arrange(desc(n))

Hospital was also the most common place of death for 85008.

clean_data_1 %>% filter(death_zip_code == "85009") %>% 
  count(death_place_type) %>% 
  arrange(desc(n))

And finally, 85009 saw deaths in businesses, parking lots and the street most often.

Putting the ZIP codes in numerical order, to see which Phoenix ZIP codes don’t have any deaths:

clean_data_1 %>% filter(death_place_city == "PHOENIX") %>% count(death_zip_code)

According to Phoenix.org, ZIP codes 85028, 85045, 85048, 85050, 85083 are also in Phoenix but were not included in the data.

ZIP codes 85036, 85086 were included in the data and are not listed on Phoenix.org’s site.

This website might not be the most reliable for ZIP code data, and I would use more official data if I were doing a deeper analysis. But since all I want to say is that “almost every ZIP code in Phoenix is represented,” this is sufficient.

Inside or outside

# Making a column for whether the death occurred inside or outside.

clean_data_1 <- clean_data_1 %>% mutate(
  inside_or_outside = case_when
  (
    death_place_type %in% c(
      "Hospital",
      "Care Facility/Medical Provider",
      "Business",
      "Hotel/Motel",
      "Residence",
      "Temporary/Part-Time Residence",
      "Storage Shed",
      "Garage",
      "Prison/Jail",
      "Church",
      "School"
    ) ~ "inside",
    death_place_type %in% c(
      "Sidewalk",
      "Parking Lot",
      "Street",
      "Alley",
      "Desert Area",
      "Park",
      "Field",
      "Canal",
      "Highway",
      "Railroad",
      "Lake",
      "River",
      "Mountain Area",
      "Dumpster",
      "Yard",
      "Driveway",
      "Porch/Patio",
      "Trail",
      "Pool",
      "Municipal/Government Property"
    ) ~ "outside",
    TRUE ~ "other")
) 
# Checking to see if there are any "other" rows in the inside or outside column.

clean_data_1 %>% filter(inside_or_outside == "other") %>% 
  select(case_number, death_place_type, inside_or_outside)

There are 10 rows that don’t have enough information to say whether the death occured inside or outside, so I labeled them “other.”

clean_data_1 %>% count(inside_or_outside)

About 44% of the deaths occurred outside. It might be slightly more or less because of the 10 we aren’t sure about.

clean_data_1 %>% filter(death_place_type == "Dumpster") %>% 
  select(case_number, death_place_type, event_description)

Municipalities

clean_data_1 %>% count(death_place_city) %>% 
  arrange(desc(n))
clean_data_1 %>% filter(death_place_city == "MARICOPA") %>% 
  select(name_last, name_first, death_zip_code)

There are 21 rows that are marked “Maricopa” but are likely in another municipality in Maricopa County, as the city of Maricopa isn’t in the county (it’s in Pinal County).

Race, ethnicity

clean_data_1 %>% count(race) %>% 
  arrange(desc(n))

White people made up 75% of deaths, followed by Black people with 12%, Native Americans with 11%, and Asians with less than 1%.

clean_data_1 %>% count(ethnicity) %>% 
  arrange(desc(n))

Hispanic/Latino people made up 19% of deaths.

clean_data_1 %>% group_by(race) %>% 
  count(ethnicity) %>% 
  arrange(desc(n))
clean_data_1 %>% count(sex_final) %>%
arrange(desc(n))
## Error in `group_by()`:
## ! Must group by variables found in `.data`.
## ✖ Column `sex_final` is not found.

Men made up 81% of deaths, women 19%.

Demographics of homicide victims

clean_data_1 %>% filter(manner_of_death == "Homicide") %>% 
  count(race) %>% 
  arrange(desc(n))

Whites made up 83% of homicide victims, followed by Blacks at 11%, Native Americans at 3% and Pacific Islanders at 1%.

Time of year

Deadliest day of the year:

clean_data_1 %>% count(death_date) %>% 
  arrange(desc(n))

Deadliest month of the year:

clean_data_1 %>% count(month = lubridate::floor_date(death_date, 'month')) %>% 
  arrange(desc(n))

July was the deadliest month by far, with more than twice as many deaths as any other month. The second deadliest months were August and June.

death_date<-as.Date(clean_data_1$death_date)

class(clean_data_1$death_date)
## [1] "Date"
clean_data_1[,"month"] <- format(clean_data_1[,"death_date"],"%m")
clean_data_1 %>% filter(month=="07")
clean_data_1[is.na(clean_data_1$death_date),]

There are 61 cases where the date of death was left blank. Some have dates included in the event description, but not all.

Deadliest week of the year:

clean_data_1 <- clean_data_1 %>% mutate(
  death_week = (lubridate::week(ymd(death_date)))
  )

clean_data_1 %>% count(death_week) %>% 
  arrange(desc(n))

The 29th week of the year was the deadliest week.

clean_data_1 %>% filter(death_week == 29) %>% 
  select(death_date, primary_cause_of_death, event_description)

Primary cause of death

Substance use:

clean_data_1 %>% filter(
  str_detect(
    primary_cause_of_death,
    "(?i)cocaine|(?i)methamphetamine|(?i)fentanyl|(?i)heroin|(?i)drug|(?i)drugs|(?i)substance|(?i)ethanol|(?i)ethanolism|(?i)alcohol|(?i)toxicity|(?i)intoxication|(?i)doxylamine|(?i)toxic"
  )
) %>%
  select(case_number, manner_of_death, primary_cause_of_death, event_description)

TRY TO CHECK FOR MISSPELLINGS OF DRUG NAMES

Fentanyl, specifically:

clean_data_1 %>% filter(
  str_detect(
    primary_cause_of_death,
    "(?i)fentanyl"
  )
) %>%
  select(case_number, primary_cause_of_death, event_description)

279 deaths had fentanyl included in the primary cause.

Heat:

clean_data_1 %>% filter(str_detect(primary_cause_of_death, "(?i)heat|(?i)hyperthermia")) %>% 
  select(case_number, manner_of_death, death_date, primary_cause_of_death, event_description)

Heat as primary OR secondary cause of death:

clean_data_1 %>% filter(str_detect(primary_cause_of_death, "(?i)heat|(?i)hyperthermia")|str_detect(contributory_cause_of_death,"(?i)heat|(?i)hyperthermia")) %>% 
  select(case_number, manner_of_death, death_date, primary_cause_of_death, contributory_cause_of_death, event_description)

Heat AND drug use:

drug_words <- c("cocaine","Cocaine","methamphetamine","Methamphetamine","fentanyl","Fentanyl","heroin","Heroin","drug","Drug","drugs","Drugs","substance","Substance","ethanol","Ethanol","ethanolism","Ethanolism","alcohol","Alcohol","toxicity","Toxicity","intoxication","Intoxication","doxylamine","Doxylamine","toxic","Toxic")

heat_words <- c("heat","hyperthermia","Heat","Hyperthermia")

heat_and_drug <-clean_data_1 %>% 
  mutate(heat_drug_combined=ifelse(str_detect(primary_cause_of_death,str_c(drug_words,collapse="|"))&str_detect(contributory_cause_of_death, str_c(heat_words,collapse="|")), "YES",ifelse(str_detect(primary_cause_of_death,str_c(heat_words,collapse="|"))&str_detect(contributory_cause_of_death, str_c(drug_words,collapse="|")),"YES","NO")),.after=contributory_cause_of_death)
    
heat_and_drug %>% filter(heat_drug_combined == "YES") %>% 
  select(case_number,primary_cause_of_death,contributory_cause_of_death,heat_drug_combined) %>% nrow()
## [1] 92

At least 92 deaths of people experiencing homelessness were due to drugs and heat combined. That’s almost certainly an undercount, as the Medical Examiner’s annual report for 2022 included 132 deaths of unhoused people from drugs and heat. I can also see there are some drug/heat deaths that include both of the keywords in just the primary cause of death column, so they weren’t captured in this query. So this number shouldn’t be considered comprehensive.

By month:

clean_data_1 %>% filter(str_detect(primary_cause_of_death, "(?i)heat|(?i)hyperthermia")) %>% 
  count(month = lubridate::floor_date(death_date, 'month')) %>% 
  arrange(desc(n))

July had the most heat deaths by far, followed by June and then August.

COVID-19:

clean_data_1 %>% filter(str_detect(primary_cause_of_death, "(?i)covid|(?i)COVID-19")) %>% 
  select(case_number, manner_of_death, primary_cause_of_death)

Blunt force trauma:

clean_data_1 %>% filter(str_detect(primary_cause_of_death,"(?i)blunt force|(?i)blunt")) %>% 
  select(case_number, manner_of_death, primary_cause_of_death, event_description, death_zip_code)

Struck by vehicle, train or light rail:

clean_data_1 %>% filter(str_detect(event_description, "(?i)struck")) %>% 
  select(case_number, manner_of_death, primary_cause_of_death, event_description)

I checked all 54 of these cases manually to make sure the event description said they were struck by a vehicle, which they all were.

I will also include eight more cases from the section above that did not include the word “struck” but are blunt force trauma cases from getting hit by a vehicle: 2022-02106, 2022-03423, 2022-03439, 2022-04059, 2022-06500, 2022-08073, 2022-09696 and 2022-0998.

Totaling those together, there are at least 62 cases of people experiencing homelessness fatally being struck by a vehicle.

# Look at zip codes with the most vehicle deaths.

clean_data_1 %>% filter((str_detect(event_description, "(?i)struck")) |
                          case_number == "2022-02106" |
                          case_number == "2022-03423" |
                          case_number == "2022-03439" |
                          case_number == "2022-04059" |
                          case_number ==  "2022-05318" |
                          case_number ==  "2022-06312" |
                          case_number ==  "2022-06500" |
                          case_number ==  "2022-08073" |
                          case_number == "2022-09696" |
                          case_number ==  "2022-09922" |
                          case_number ==  "2022-09982"
) %>% 
  filter(case_number != "2022-08787" &
         case_number != "2022-10791") %>% 
  count(death_zip_code) %>% 
  arrange(desc(n))

ZIP code 85007, the ZIP code of “The Zone,” Phoenix’s largest homeless encampment, has no vehicle deaths. It could be because the people hit by cars there were taken to a hospital in another ZIP code where they were pronounced dead, such as 85006.

# Double-checking causes of death in 85007 and 85006

clean_data_1 %>% filter(death_zip_code == "85007" | death_zip_code=="85006") %>% 
                select(death_zip_code, primary_cause_of_death, event_description)

Age at death

mean(clean_data_1$age)
## [1] 47.05793
median(clean_data_1$age)
## [1] 47

The typical age at time of death was 47 years old.

LS0tCnRpdGxlOiAiRGVhdGhzIG9mIFBlb3BsZSBFeHBlcmllbmNpbmcgSG9tZWxlc3NuZXNzIGluIE1hcmljb3BhIENvdW50eSwgQVosIDIwMjIiCmF1dGhvcjogIkp1bGlldHRlIFJpaGwiCmRhdGU6ICI3LzI2LzIzIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogY2VydWxlYW4KICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBkZl9wcmludDogcGFnZWQKICAgICAgCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9Cgprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IFRSVUUpCgoKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoamFuaXRvcikKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHJlYWN0YWJsZSkKbGlicmFyeShzdHJpbmdyKQoKYGBgCgojIyBJbnRyb2R1Y3Rpb24KClRoaXMgZGF0YSBhbmFseXNpcyB3YXMgY29tcGxldGVkIGZvciBhIFtzdG9yeV0oaHR0cHM6Ly93d3cuYXpjZW50cmFsLmNvbS9zdG9yeS9uZXdzL2xvY2FsL3Bob2VuaXgvMjAyMy8wNy8yNi9odW5kcmVkcy1vZi1tYXJpY29wYS1jb3VudHktaG9tZWxlc3MtcG9wdWxhdGlvbi1kaWVkLWluLTIwMjIvNjk5MDM1MzYwMDcvKSBvbiBkZWF0aHMgb2YgcGVvcGxlIGV4cGVyaWVuY2luZyBob21lbGVzc25lc3MgY2FsbGVkICJIdW5kcmVkcyBvZiBwZW9wbGUgZXhwZXJpZW5jaW5nIGhvbWVsZXNzbmVzcyBkaWVkIGluIE1hcmljb3BhIENvdW50eSBsYXN0IHllYXIuIFdpbGwgMjAyMyBiZSB3b3JzZT8iCgpJdCByYW4gb24gVGhlIEFyaXpvbmEgUmVwdWJsaWMncyB3ZWJzaXRlIG9uIEp1bHkgMjYsIDIwMjMgYW5kIG9uIHRoZSBmcm9udCBwYWdlIG9mIHRoZSBTdW5kYXkgcHJpbnQgZWRpdGlvbiBvbiBBdWd1c3QgNiwgMjAyMy4KClRoZSBkYXRhIHdhcyBvYnRhaW5lZCBieSBlbWFpbCBmcm9tIExpc2EgR2xvdywgQ0VPIG9mIENlbnRyYWwgQXJpem9uYSBTaGVsdGVyIFNlcnZpY2VzLCBvbiBGZWIuIDgsIDIwMjMuIEl0IGlzIGRhdGEgZnJvbSB0aGUgTWFyaWNvcGEgQ291bnR5IE9mZmljZSBvZiB0aGUgTWVkaWNhbCBFeGFtaW5lciB0aGF0IGNvbnRhaW5zIGFsbCAidHJhbnNpZW50IGRlYXRocyIgaW4gMjAyMiwgbWVhbmluZyBkZWF0aHMgb2YgcGVvcGxlIGV4cGVyaWVuY2luZyBob21lbGVzc25lc3MuIFRoZSBvcmlnaW5hbCBkYXRhIHdhcyBwcm92aWRlZCBpbiB0d28gc3ByZWFkc2hlZXRzOiBkZWF0aHMgcnVsZWQgYW4gYWNjaWRlbnQgb3IgbmF0dXJhbCwgYW5kIGRlYXRocyBydWxlZCBhIGhvbWljaWRlIG9yIHVua25vd24uIEkgY29uZmlybWVkIHdpdGggSmVzc2llIENhcmF2ZW8sIE1hcmljb3BhIENvdW50eSBQSU8sIHRoYXQgdGhpcyBkYXRhIGlzIGNvcnJlY3QgYW5kIHdhcyBvYnRhaW5lZCBmcm9tIHRoZSBNYXJpY29wYSBDb3VudHkgT2ZmaWNlIG9mIHRoZSBNZWRpY2FsIEV4YW1pbmVyLiBIZXJlLCBJIHdpbGwgY29tYmluZSB0aGUgdHdvIGRhdGEgc2V0cyBhbmQgYW5hbHl6ZSB0aGVtIGZvciBhIHN0b3J5IG9uIGRlYXRocyBvZiBwZW9wbGUgZXhwZXJpZW5jaW5nIGhvbWVsZXNzbmVzcyBpbiBNYXJpY29wYSBDb3VudHksIEFyaXpvbmEgaW4gMjAyMi4KCiMjIEtleSBmaW5kaW5ncwoKTm90ZTogSSBkaWRuJ3QgdXNlIGFsbCBvZiB0aGlzIGFuYWx5c2lzIGluIHRoZSBzdG9yeS4gSW5zdGVhZCwgSSBleHBsb3JlZCBhIG51bWJlciBvZiBhbmdsZXMgdG8gc2VlIHdoaWNoIHdlcmUgdGhlIG1vc3QgY29tcGVsbGluZyBhbmQgY3J1Y2lhbCB0byBpbmNsdWRlLgoKLSAgIDU3MCBvdXQgb2YgNzk0IGRlYXRocyB3ZXJlIHJ1bGVkIGFuIGFjY2lkZW50LCBvciBhYm91dCA3MiUuIE9ubHkgMTElIHdlcmUgZGVlbWVkIG5hdHVyYWwuIDM2IHdlcmUgaG9taWNpZGVzIGFuZCAyMiB3ZXJlIHN1aWNpZGVzLiA2MCBoYXZlIG5vIG1hbm5lciBvZiBkZWF0aCBsaXN0ZWQuIFRob3NlIGNhc2VzIHdlcmUgYWxzbyBub3Qgb24gdGhlIE1FJ3Mgd2Vic2l0ZSwgYnV0IHdlcmUgaW4gdGhlIGRhdGEgcHJvdmlkZWQgdG8gdXMgYnkgQ0FTUy90aGUgTUUncyBvZmZpY2UuIDEzIGNhc2VzIGFyZSB1bmRldGVybWluZWQgYW5kIDMgYXJlIGxpc3RlZCBhcyAiZmV0YWwuIgoKLSAgIE1lbiBhcmUgb3ZlcnJlcHJlc2VudGVkIGluIHRoZSBkYXRhLiBPdmVyIDgwJSBvZiBkZWNlZGVudHMgd2VyZSBtYWxlLiBBY2NvcmRpbmcgdG8gUElUIGRhdGEsIDY1JSBvZiBwZW9wbGUgZXhwZXJpZW5jaW5nIGhvbWVsZXNzbmVzcyBpbiB0aGUgY291bnR5IGluIGVhcmx5IDIwMjIgaWRlbnRpZmllZCBhcyBtYWxlLgoKLSAgIFdoaXRlIHBlb3BsZSBhcmUgYWxzbyBvdmVycmVwcmVzZW50ZWQgaW4gdGhlIGRhdGEuIEFsbW9zdCAzLzQgb2YgdGhlIGRlYXRocyB3ZXJlIHdoaXRlIHBlb3BsZS4gQnV0IEhpc3BhbmljIGFuZCBMYXRpbm8gcGVvcGxlIHdlcmUgbm90IG92ZXJyZXByZXNlbnRlZDogMTklIG9mIHRoZSBkZWF0aHMgd2VyZSBIaXNwYW5pYyBvciBMYXRpbm8gcGVvcGxlLiBBY2NvcmRpbmcgdG8gUG9pbnQtaW4tVGltZSBjb3VudCBkYXRhLCA2MyUgb2YgcGVvcGxlIGV4cGVyaWVuY2luZyBob21lbGVzc25lc3MgaW4gdGhlIGNvdW50eSBpbiBlYXJseSAyMDIyIHdlcmUgd2hpdGUsIGFuZCBhYm91dCAyNCUgd2VyZSBIaXNwYW5pYy9MYXRpbm8uIChUaGUgUG9pbnQtaW4tVGltZSBjb3VudCBpcyBhbiBhbm51YWwgY2Vuc3VzIG9mIHBlb3BsZSBleHBlcmllbmNpbmcgaG9tZWxlc3NuZXNzIGluIGEgZ2l2ZW4gcmVnaW9uLikKCi0gICBCbGFjayBwZW9wbGUgd2VyZSB1bmRlcnJlcHJlc2VudGVkIGluIHRoZSBkYXRhLiBBYm91dCAxMiUgb2YgdGhlIGRlYXRocyB3ZXJlIEJsYWNrIHBlb3BsZS4gQWNjb3JkaW5nIHRvIFBvaW50LWluLVRpbWUgY291bnQgZGF0YSwgMjYlIG9mIHBlb3BsZSBleHBlcmllbmNpbmcgaG9tZWxlc3NuZXNzIGluIHRoZSBjb3VudHkgaW4gZWFybHkgMjAyMiB3ZXJlIEJsYWNrLgoKLSAgIEhvd2V2ZXIsIHdoaWxlIG9ubHkgMTIlIG9mIHRoZSBvdmVyYWxsIGRlYXRocyB3ZXJlIEJsYWNrIHBlb3BsZSwgdGhleSBtYWRlIHVwIDI1JSBvZiB0aGUgaG9taWNpZGUgdmljdGltcy4gVGhhdCdzIGNsb3NlciB0byB0aGVpciBwZXJjZW50IG9mIG92ZXJhbGwgcGVvcGxlIGV4cGVyaWVuY2luZyBob21lbGVzc25lc3MgKDI2JSkuCgotICAgTmF0aXZlIEFtZXJpY2FuIGFuZCBBbGFza2FuIE5hdGl2ZSBwZW9wbGUgd2VyZSBvdmVycmVwcmVzZW50ZWQuIEFib3V0IDExJSBvZiB0aGUgZGVhdGhzIHdlcmUgTmF0aXZlIEFtZXJpY2FuIG9yIEFsYXNrYSBOYXRpdmUgcGVvcGxlLiBUaGV5IG1hZGUgdXAgYWJvdXQgNyUgb2YgdGhlIHBlb3BsZSBpbiB0aGUgMjAyMiBQb2ludC1pbi1UaW1lIGNvdW50LgoKLSAgIFRoZSB0b3AgZml2ZSB6aXAgY29kZXMgd2l0aCB0aGUgbW9zdCBkZWF0aHMgd2VyZSA4NTAwNiwgODUwMDcsIDg1MDEzLCA4NTAwOCBhbmQgODUwMDkuCgotICAgQWJvdXQgNDQlIG9mIHRoZSBkZWF0aHMgb2NjdXJyZWQgb3V0c2lkZS4KCi0gICBJbiBqdXN0IG92ZXIgaGFsZiBvZiB0aGUgY2FzZXMgKDQzOS83OTQsIG9yIDU1JSksIHRoZSBwcmltYXJ5IGNhdXNlIG9mIGRlYXRoIGludm9sdmVkIHN1YnN0YW5jZSB1c2UuIFRob3NlIG51bWJlcnMgd2VyZSAyNjUsIG9yIDUxJSwgaW4gMjAyMTsgMzc1LCBvciA2MyUsIGluIDIwMjA7IG5vdCBsaXN0ZWQgaW4gMjAxOSByZXBvcnQuCgotICAgSW4gODUgY2FzZXMsIHRoZSBwcmltYXJ5IGNhdXNlIG9mIGRlYXRoIHdhcyBoZWF0IGV4cG9zdXJlLgoKLSAgIEluIDYgY2FzZXMsIHRoZSBwcmltYXJ5IGNhdXNlIG9mIGRlYXRoIHdhcyBDT1ZJRC0xOS4KCi0gICBJbiA2NiBjYXNlcywgdGhlIHByaW1hcnkgY2F1c2Ugb2YgZGVhdGggd2FzIGJsdW50IGZvcmNlIGluanVyaWVzL3RyYXVtYS4KCi0gICBQZW9wbGUgd2VyZSBmYXRhbGx5IGJlaW5nIHN0cnVjayBieSBhIHZlaGljbGUgaW4gYXQgbGVhc3QgNjIgY2FzZXMuCgotICAgVGhpcyB5ZWFyIHRoZXJlIHdlcmUgNzk0IGRlYXRocyBvZiBwZW9wbGUgZXhwZXJpZW5jaW5nIGhvbWVsZXNzbmVzcy4gQWNjb3JkaW5nIHRvIE1lZGljYWwgRXhhbWluZXIgYW5udWFsIHJlcG9ydHMsIHRoZXJlIHdlcmUgNTE3IGRlYXRocyBpbiAyMDIxLCA1OTYgZGVhdGhzIGluIDIwMjAsIDI1OSBpbiAyMDE5IGFuZCAyMjQgaW4gMjAxOC4gVGhlcmUgaXMgbm8gZGF0YSBpbiB0aGUgYW5udWFsIHJlcG9ydHMgYmVmb3JlIDIwMTgsIHRob3VnaCB0aG9zZSByZXBvcnRzIGRpZCBpbmNsdWRlIHRoZSBudW1iZXIgb2YgdW5jbGFpbWVkIGJvZGllcy4gVGhpcyBkYXRhIGlzIGEgYml0IG1vcmUgcm9idXN0IHRoYW4gdGhlIGFubnVhbCByZXBvcnRzLCBhcyBpdCBpbmNsdWRlcyBzb21lIGNhc2VzIHRoYXQgdGhlIGFubnVhbCByZXBvcnRzIGRvbid0IGNhcHR1cmUsIHNvIHRoZXNlIG51bWJlcnMgc2hvdWxkbid0IGJlIGRpcmVjdGx5IGNvbXBhcmVkIHRvIGVhY2ggb3RoZXIuIEJ1dCB0aGV5IGluZGljYXRlIGJyb2FkbHkgdGhhdCB0aGUgZGVhdGhzIGFyZSBpbmNyZWFzaW5nLgoKLSAgIFRoZSB6aXAgY29kZXMgd2l0aCB0aGUgbW9zdCB2ZWhpY2xlIGRlYXRocyAobm90IGluY2x1ZGluZyBjYXIgY3Jhc2hlcykgYXJlIDg1MDA2IGFuZCA4NTAxMy4gVGhhdCBjb3VsZCBiZSBiZWNhdXNlIHRob3NlIHppcCBjb2RlcyBoYXZlIGhvc3BpdGFscyBpbiB0aGVtLgoKLSAgIDM2IGRlYXRocyB3ZXJlIGEgaG9taWNpZGUsIG9yIDUlLiBJbiAyMDIxLCAyNS81MTcgbWVkaWNhbCBleGFtaW5lciBjYXNlcyBvZiBwZW9wbGUgZXhwZXJpZW5jaW5nIGhvbWVsZXNzbmVzcyB3ZXJlIGhvbWljaWRlcywgb3IgNSUuIEluIDIwMjAsIDIxLzU5NiB3ZXJlIGhvbWljaWRlcywgb3IgNCUuCgotICAgQWNjb3JkaW5nIHRvIE1pZ3VlbCwgdGhlcmUgd2VyZSA0MjggdG90YWwgaG9taWNpZGVzIGluIE1hcmljb3BhIENvdW50eSBsYXN0IHllYXIuIFRoYXQgbWVhbnMgMzUvNDI1LCBvciA4JSwgb2YgaG9taWNpZGUgdmljdGltcyB3ZXJlIGhvbWVsZXNzLgoKLSAgIEp1bHkgd2FzIHRoZSBkZWFkbGllc3QgbW9udGggYnkgZmFyLCB3aXRoIG1vcmUgdGhhbiB0d2ljZSBhcyBtYW55IGRlYXRocyBhcyBhbnkgb3RoZXIgbW9udGgsIGZvbGxvd2VkIGJ5IEF1Z3VzdCBhbmQgSnVuZS4gSnVseSBoYWQgNDQgaGVhdCBkZWF0aHMtLSBhbG1vc3QgM3ggYXMgbWFueSBhcyB0aGUgbmV4dCBoaWdoZXN0IG1vbnRoLCBKdW5lICgxNSBkZWF0aHMpLgoKLSAgIEp1bHkgMTMgYW5kIEp1bHkgMTcgd2VyZSB0aGUgZGVhZGxpZXN0IGRheXMgb2YgMjAyMiBmb3IgcGVvcGxlIGV4cGVyaWVuY2luZyBob21lbGVzc25lc3MsIHdpdGggMTUgZGVhdGhzIGVhY2guCgotICAgVGhlIGRlYWRsaWVzdCB3ZWVrIG9mIHRoZSB5ZWFyIHdhcyBKdWx5IDE2LUp1bHkgMjIsIHdpdGggNjkgZGVhdGhzLiBUaGUgd2VlayBiZWZvcmUgaXQgaGFkIDQ3IGRlYXRocy4KCiMjIEFuYWx5c2lzCgpgYGB7cn0KIyBSZWFkaW5nIGluIGJvdGggZGF0YXNldHMuCgp0cmFuc2llbnRfZGVhdGhzX2FjY2lkZW50X29nIDwtCiAgcmVhZF9leGNlbCgidHJhbnNpZW50X2RlYXRoc19kZXNjXzIyLnhsc3giKQoKdHJhbnNpZW50X2RlYXRoc19ob21pY2lkZV9vZyA8LQogIHJlYWRfZXhjZWwoInRyYW5zaWVudF9kZWF0aHNfbm9fZGVzY18yMi54bHN4IikKCmBgYAoKYGBge3J9CiMgRGVsZXRpbmcgdGhlIGZpcnN0IGZldyByb3dzIGZyb20gdGhlIGRhdGFzZXRzLCB3aGljaCBkb24ndCBjb250YWluIGluZm8gd2UgbmVlZC4KCnRyYW5zaWVudF9kZWF0aHNfYWNjaWRlbnRfMSA9IHRyYW5zaWVudF9kZWF0aHNfYWNjaWRlbnRfb2dbLWMoMSksXSAlPiUgCiAgcm93X3RvX25hbWVzKHJvd19udW1iZXI9MSkKCnRyYW5zaWVudF9kZWF0aHNfaG9taWNpZGVfMSA9IHRyYW5zaWVudF9kZWF0aHNfaG9taWNpZGVfb2dbLWMoMSksXSAlPiUgCiAgICByb3dfdG9fbmFtZXMocm93X251bWJlcj0xKQpgYGAKCmBgYHtyfQojIFJlbmFtaW5nIGNvbHVtbiBoZWFkcyBmb3IgZWFjaCBkYXRhc2V0LgoKdHJhbnNpZW50X2RlYXRoc19hY2NpZGVudF8xIDwtIGNsZWFuX25hbWVzKHRyYW5zaWVudF9kZWF0aHNfYWNjaWRlbnRfMSkKCnRyYW5zaWVudF9kZWF0aHNfaG9taWNpZGVfMSA8LSBjbGVhbl9uYW1lcyh0cmFuc2llbnRfZGVhdGhzX2hvbWljaWRlXzEpCgpgYGAKCmBgYHtyfQojIEFkZGluZyBhbiAiZXZlbnRfZGVzY3JpcHRpb24iIGNvbHVtbiBhbmQgJ3N1Yl9tYW5uZXInIGNvbHVtbiB0byB0aGUgdHJhbnNpZW50X2RlYXRoc19ob21pY2lkZSBkYXRhZnJhbWUgc28gYm90aCBkYXRhZnJhbWVzIGhhdmUgYWxsIG9mIHRoZSBzYW1lIGV4YWN0IGNvbHVtbnMuCgp0cmFuc2llbnRfZGVhdGhzX2hvbWljaWRlXzEgPC0gdHJhbnNpZW50X2RlYXRoc19ob21pY2lkZV8xICU+JSBhZGRfY29sdW1uKGV2ZW50X2Rlc2NyaXB0aW9uPSJOQSIsIHN1Yl9tYW5uZXI9Ik5BIikKCmBgYAoKYGBge3J9CiMgQmluZGluZyB0aGUgZGF0YXNldHMuIAoKdHJhbnNpZW50X2RlYXRoc190b3RhbCA8LSByYmluZCh0cmFuc2llbnRfZGVhdGhzX2FjY2lkZW50XzEsIHRyYW5zaWVudF9kZWF0aHNfaG9taWNpZGVfMSkKYGBgCgpgYGB7cn0KIyBDaGVja2luZyB0aGF0IHRoZSBqb2luIHdvcmtlZC4KCmdsaW1wc2UodHJhbnNpZW50X2RlYXRoc190b3RhbCkKYGBgCgpgYGB7cn0KIyBFeHBvcnRpbmcgdG8gRXhjZWwuCgppbnN0YWxsLnBhY2thZ2VzKCJ3cml0ZXhsIikKCmxpYnJhcnkod3JpdGV4bCkKCndyaXRlX3hsc3godHJhbnNpZW50X2RlYXRoc190b3RhbCwiL1VzZXJzL2p1bGlldHRlcmlobC9Eb2N1bWVudHMvRGF0YS9EYXRhX0FyaXpvbmFfUmVwdWJsaWMvdHJhbnNpZW50X2RlYXRoc190b3RhbF8yMDIyLnhsc3giKQpgYGAKCiMjIEFkZGluZyBzY3JhcGVkIGRhdGEKClRoZSBtZWRpY2FsIGV4YW1pbmVyJ3Mgb2ZmaWNlIHdhbnRlZCB1cyB0byBzZXBhcmF0ZWx5IHN1Ym1pdCBhIHJlY29yZHMgcmVxdWVzdCBmb3IgdGhlIHByaW1hcnkgY2F1c2Ugb2YgZGVhdGguIEJ1dCB0aGF0IGluZm9ybWF0aW9uIGlzIGxpc3RlZCBvbiB0aGUgbWVkaWNhbCBleGFtaW5lcidzIHdlYnNpdGUsIHNvIGZvcm1lciBBcml6b25hIFJlcHVibGljIGRhdGEgcmVwb3J0ZXIgSnVzdGluIFByaWNlIGhlbHBlZCBidWlsZCBhIHNjcmFwZXIgdGhhdCBzY3JhcGVkIHRoZSB3ZWJzaXRlIGluc3RlYWQuIEp1c3RpbiBhbHJlYWR5IGpvaW5lZCB0aGUgc2NyYXBlZCBkYXRhIGFuZCB0aGUgb3JpZ2luYWwgZGF0YXNldHMgdG9nZXRoZXIgaW50byBvbmUgZGF0YXNldCwgc28gbGV0J3MgbG9hZCB0aGF0IGluOgoKYGBge3J9CmNvZF9kYXRhX29nIDwtIHJlYWQuY3N2KCIvVXNlcnMvanVsaWV0dGVyaWhsL0RvY3VtZW50cy9EYXRhL0RhdGFfQXJpem9uYV9SZXB1YmxpYy9rdW5sZV9zY3JhcGVkZGF0YV81LTEyLTIzLmNzdiIpCmBgYAoKYGBge3J9CiMgQ2hlY2tpbmcgdG8gbWFrZSBzdXJlIHRoYXQgd29ya2VkLgoKZ2xpbXBzZShjb2RfZGF0YV9vZykKCmBgYAoKYGBge3J9CiMgQ2hlY2tpbmcgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgcm93cyB3aGVyZSB0aGUgbWFubmVyIG9mIGRlYXRoIGZyb20gdGhlIHNjcmFwZWQgZGF0YSBkb2Vzbid0IG1hdGNoIHRoZSBtYW5uZXIgb2YgZGVhdGggaW4gdGhlIGRhdGFzZXQgcHJvdmlkZWQgYnkgdGhlIE1FLiAKCmNvZF9kYXRhX29nICU+JSBmaWx0ZXIobWFubmVyICE9IE1hbm5lck9mRGVhdGgpICU+JSAKICBzZWxlY3QoZGVjZWRlbnRfbmFtZSwgbWFubmVyLCBNYW5uZXJPZkRlYXRoKQpgYGAKCkl0IGxvb2tzIGxpa2UgdGhlIGRhdGEgSSBnb3QgZnJvbSB0aGUgbWVkaWNhbCBleGFtaW5lcidzIG9mZmljZSBoYWQgbWFueSBjYXNlcyB3aXRoIHRoZSBtYW5uZXIgbGlzdGVkIGFzICJwZW5kaW5nIiB0aGF0IHdlcmUgc2luY2UgcmVzb2x2ZWQgYW5kIHVwZGF0ZWQgb24gdGhlIHdlYnNpdGUuIEl0IGFsc28gbG9va3MgbGlrZSB0aGVyZSBhcmUgdHdvIGNhc2VzIHRoYXQgaGFkIHRoZSBtYW5uZXIgbGlzdGVkIGFzIGhvbWljaWRlIGluIHRoZSBtZWRpY2FsIGV4YW1pbmVyJ3Mgb3JpZ2luYWwgZGF0YSBidXQgbm90aGluZyBsaXN0ZWQgb24gdGhlIHdlYnNpdGUuCgpgYGB7cn0KIyBDaGVja2luZyB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBjYXNlcyB3aGVyZSB0aGUgcGVyc29uJ3Mgc2V4IGluIHRoZSBvcmlnaW5hbCBkYXRhIGRvZXNuJ3QgbWF0Y2ggdGhlaXIgc2V4IGluIHRoZSBzY3JhcGVkIHdlYnNpdGUgZGF0YS4KCmNvZF9kYXRhX29nICU+JSBmaWx0ZXIoc2V4ICE9IFNleCkgJT4lIAogIHNlbGVjdChkZWNlZGVudF9uYW1lLCBzZXgsIFNleCkKYGBgCgpUaGUgIlNleCIgY29sdW1uIGlzIGVtcHR5IGluIGEgbG90IG9mIHRoZSBzY3JhcGVkIGRhdGEuIFRoYXQncyBwcm9iYWJseSBiZWNhdXNlIHRoZXJlIHdlcmUgOTAtc29tZSByb3dzIGluIHRoZSBvcmlnaW5hbCBkYXRhIHRoYXQgd2VyZW4ndCBvbiB0aGUgd2Vic2l0ZSBhbmQgdGh1cyBjb3VsZG4ndCBiZSBzY3JhcGVkLgoKIyMgQ2xlYW5pbmcgZGF0YQoKTm93IHRoYXQgSSBoYXZlIGV2ZXJ5dGhpbmcgSSBuZWVkIGluIG9uZSBkYXRhc2V0LCBJJ2xsIGNsZWFuIGl0IHVwLgoKYGBge3J9CiMgTWFraW5nIGFsbCB0aGUgYmxhbmsgY29sdW1ucyBOQS4KCmNvZF9kYXRhXzEgPC0gY29kX2RhdGFfb2cgJT4lIG11dGF0ZV9hbGwobmFfaWYsIiIpCgojIENyZWF0aW5nIGEgbmV3IG1hbm5lciBvZiBkZWF0aCBjb2x1bW4uCgpjb2RfZGF0YV8xIDwtIGNvZF9kYXRhXzEgJT4lIG11dGF0ZShtYW5uZXJfb2ZfZGVhdGggPSBpZmVsc2UoaXMubmEoTWFubmVyT2ZEZWF0aCksIG1hbm5lciwgTWFubmVyT2ZEZWF0aCkpCgojIEdldHRpbmcgcmlkIG9mIGR1cGxpY2F0aXZlIGNvbHVtbnMgYW5kIG90aGVyIGNvbHVtbnMgd2UgZG9uJ3QgbmVlZC4KCmNsZWFuX2RhdGFfMSA8LSBzdWJzZXQoY29kX2RhdGFfMSwgc2VsZWN0ID0gLWMoZGVjZWRlbnRfbmFtZSwgZGVhdGhfZGF0ZSwgQ2FzZU51bSwgbWFubmVyLCBNYW5uZXJPZkRlYXRoLCBTZXgsIFJlYWR5Rm9yUmVsZWFzZSwgTWVkRXhSZXBvcnRSZWFkeSkpCgojIENsZWFuaW5nIGNvbHVtbiBuYW1lcwoKY2xlYW5fZGF0YV8xIDwtIGNsZWFuX25hbWVzKGNsZWFuX2RhdGFfMSkKCiMgR2V0dGluZyByaWQgb2YgY2FzZXMgd2hlcmUgdGhlIHBlcnNvbidzIHRyYW5zaWVudCBzdGF0dXMgd2FzIG1hcmtlZCAidW5rbm93biwiIGFzIHRoZXkgd2VyZW4ndCBjb25maXJtZWQgdG8gYmUgaG9tZWxlc3MuCgpjbGVhbl9kYXRhXzEgPC0gY2xlYW5fZGF0YV8xICU+JSBmaWx0ZXIodHJhbnNpZW50ID09ICJZZXMiKSAKCmNsZWFuX2RhdGFfMSRkZWF0aF9kYXRlIDwtIG1keShjbGVhbl9kYXRhXzEkZGVhdGhfZGF0ZSkKCndyaXRlX3hsc3goY2xlYW5fZGF0YV8xLCIvVXNlcnMvanVsaWV0dGVyaWhsL0RvY3VtZW50cy9EYXRhL0RhdGFfQXJpem9uYV9SZXB1YmxpYy90cmFuc2llbnRfZGVhdGhzX2pvaW5lZF9jbGVhbmVkLnhsc3giKQoKd3JpdGVfeGxzeCh0cmFuc2llbnRfZGVhdGhzX3RvdGFsLCIvVXNlcnMvanVsaWV0dGVyaWhsL0RvY3VtZW50cy9EYXRhL0RhdGFfQXJpem9uYV9SZXB1YmxpYy90cmFuc2llbnRfZGVhdGhzX3RvdGFsX2Nhc3MueGxzeCIpCmBgYAoKIyMgR2xpbXBzZQoKYGBge3J9CmdsaW1wc2UoY2xlYW5fZGF0YV8xKQpgYGAKClRoZXJlIHdlcmUgNzk0IHJvd3MsIG9yIGRlYXRocy4KCiMjIE1hbm5lciBvZiBkZWF0aAoKYGBge3J9CmNsZWFuX2RhdGFfMSAlPiUgY291bnQobWFubmVyX29mX2RlYXRoKSAlPiUgCiAgYXJyYW5nZShkZXNjKG4pKQpgYGAKClRoZSBtYWpvcml0eSBvZiBkZWF0aHMgb2YgcGVvcGxlIGV4cGVyaWVuY2luZyBob21lbGVzc25lc3MgaW4gMjAyMiB3ZXJlIHJ1bGVkIGFuIGFjY2lkZW50LiA1NzAvNzk0PSA3MiUKCiMjIEZhbHNlIHBvc2l0aXZlcwoKYGBge3J9CiMgSGVyZSBJJ20gZmlsdGVyaW5nIHRoZSBldmVudCBkZXNjcmlwdGlvbiBmb3IgaW5kaWNhdG9ycyB0aGF0IHRoZSBwZXJzb24gbWlnaHQgbm90IGhhdmUgYmVlbiBleHBlcmllbmNpbmcgaG9tZWxlc3NuZXNzIGF0IHRoZWlyIHRpbWUgb2YgZGVhdGgsIGV2ZW4gdGhvdWdoIHRoZXkgd2VyZSBtYXJrZWQgYXMgInRyYW5zaWVudC4iCgpjbGVhbl9kYXRhXzEgJT4lIGZpbHRlcigKICBzdHJfZGV0ZWN0KGV2ZW50X2Rlc2NyaXB0aW9uLAogICAgImhlciBiZWR8IGhpcyBiZWR8IHRoZWlyIGJlZHwgaGVyIHJlc2lkZW5jZXwgaGlzIHJlc2lkZW5jZXwgdGhlaXIgcmVzaWRlbmNlIgogICAgKQopICU+JSAKICBzZWxlY3QgKGNhc2VfbnVtYmVyLCBldmVudF9kZXNjcmlwdGlvbikKYGBgCgpJbnF1aXJpbmcgdG8gbWVkaWNhbCBleGFtaW5lcidzIG9mZmljZSBhYm91dCBjYXNlIG51bWJlcnMgMDQ2NjUsIDExNTk5LCAwNzQzMCwgMTEwODcgYW5kIDEyMzIxIGFzIHRoZSBkZXNjcmlwdGlvbnMgaW5kaWNhdGUgdGhleSBtaWdodCBub3QgaGF2ZSBiZWVuIGhvbWVsZXNzLgoKIyMgUGxhY2VzCgpgYGB7cn0KY2xlYW5fZGF0YV8xICU+JSBjb3VudChkZWF0aF9wbGFjZV90eXBlKSAlPiUgCiAgYXJyYW5nZShkZXNjKG4pKQpgYGAKCkhvc3BpdGFsIHdhcyB0aGUgc2V0dGluZyB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBvZiBkZWF0aHMsIGF0IDI1NS4KCiMjIFpJUCBjb2RlcwoKYGBge3J9CmNsZWFuX2RhdGFfMSAlPiUgY291bnQoZGVhdGhfemlwX2NvZGUpICU+JSAKICBhcnJhbmdlKGRlc2MobikpCgpgYGAKClRoZSBmaXZlIFpJUCBjb2RlcyB3aXRoIHRoZSBtb3N0IGRlYXRocyBpbiAyMDIyIHdlcmUgODUwMDYsIDg1MDA3LCA4NTAxMywgODUwMDggYW5kIDg1MDA5LgoKYGBge3J9CmNsZWFuX2RhdGFfMSAlPiUgZmlsdGVyKGRlYXRoX3ppcF9jb2RlID09ICI4NTAwNiIpICU+JSAKICBjb3VudChkZWF0aF9wbGFjZV90eXBlKSAlPiUgCiAgIGFycmFuZ2UoZGVzYyhuKSkKYGBgCgpUaGUgbWFqb3JpdHkgb2YgZGVhdGhzIGluIFpJUCBjb2RlIDg1MDA2IHdlcmUgYXQgYSBob3NwaXRhbC4KCmBgYHtyfQpjbGVhbl9kYXRhXzEgJT4lIGZpbHRlcihkZWF0aF96aXBfY29kZSA9PSAiODUwMDciKSAlPiUgCiAgY291bnQoZGVhdGhfcGxhY2VfdHlwZSkgJT4lIAogICBhcnJhbmdlKGRlc2MobikpCmBgYAoKVGhlIHNpZGV3YWxrIHdhcyB3aGVyZSBtb3N0IGRlYXRocyBpbiA4NTAwNyBvY2N1cnJlZC4KCmBgYHtyfQpjbGVhbl9kYXRhXzEgJT4lIGZpbHRlcihkZWF0aF96aXBfY29kZSA9PSAiODUwMTMiKSAlPiUgCiAgY291bnQoZGVhdGhfcGxhY2VfdHlwZSkgJT4lIAogYXJyYW5nZShkZXNjKG4pKQpgYGAKCkhvc3BpdGFsIHdhcyBhbHNvIHRoZSBtb3N0IGNvbW1vbiBwbGFjZSBvZiBkZWF0aCBmb3IgODUwMTMuCgpgYGB7cn0KY2xlYW5fZGF0YV8xICU+JSBmaWx0ZXIoZGVhdGhfemlwX2NvZGUgPT0gIjg1MDA4IikgJT4lIAogIGNvdW50KGRlYXRoX3BsYWNlX3R5cGUpICU+JSAKICBhcnJhbmdlKGRlc2MobikpCmBgYAoKSG9zcGl0YWwgd2FzIGFsc28gdGhlIG1vc3QgY29tbW9uIHBsYWNlIG9mIGRlYXRoIGZvciA4NTAwOC4KCmBgYHtyfQpjbGVhbl9kYXRhXzEgJT4lIGZpbHRlcihkZWF0aF96aXBfY29kZSA9PSAiODUwMDkiKSAlPiUgCiAgY291bnQoZGVhdGhfcGxhY2VfdHlwZSkgJT4lIAogIGFycmFuZ2UoZGVzYyhuKSkKYGBgCgpBbmQgZmluYWxseSwgODUwMDkgc2F3IGRlYXRocyBpbiBidXNpbmVzc2VzLCBwYXJraW5nIGxvdHMgYW5kIHRoZSBzdHJlZXQgbW9zdCBvZnRlbi4KClB1dHRpbmcgdGhlIFpJUCBjb2RlcyBpbiBudW1lcmljYWwgb3JkZXIsIHRvIHNlZSB3aGljaCBQaG9lbml4IFpJUCBjb2RlcyBkb24ndCBoYXZlIGFueSBkZWF0aHM6CgpgYGB7cn0KY2xlYW5fZGF0YV8xICU+JSBmaWx0ZXIoZGVhdGhfcGxhY2VfY2l0eSA9PSAiUEhPRU5JWCIpICU+JSBjb3VudChkZWF0aF96aXBfY29kZSkKYGBgCgpBY2NvcmRpbmcgdG8gUGhvZW5peC5vcmcsIFpJUCBjb2RlcyA4NTAyOCwgODUwNDUsIDg1MDQ4LCA4NTA1MCwgODUwODMgYXJlIGFsc28gaW4gUGhvZW5peCBidXQgd2VyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGRhdGEuCgpaSVAgY29kZXMgODUwMzYsIDg1MDg2IHdlcmUgaW5jbHVkZWQgaW4gdGhlIGRhdGEgYW5kIGFyZSBub3QgbGlzdGVkIG9uIFBob2VuaXgub3JnJ3Mgc2l0ZS4KClRoaXMgd2Vic2l0ZSBtaWdodCBub3QgYmUgdGhlIG1vc3QgcmVsaWFibGUgZm9yIFpJUCBjb2RlIGRhdGEsIGFuZCBJIHdvdWxkIHVzZSBtb3JlIG9mZmljaWFsIGRhdGEgaWYgSSB3ZXJlIGRvaW5nIGEgZGVlcGVyIGFuYWx5c2lzLiBCdXQgc2luY2UgYWxsIEkgd2FudCB0byBzYXkgaXMgdGhhdCAiYWxtb3N0IGV2ZXJ5IFpJUCBjb2RlIGluIFBob2VuaXggaXMgcmVwcmVzZW50ZWQsIiB0aGlzIGlzIHN1ZmZpY2llbnQuCgojIyBJbnNpZGUgb3Igb3V0c2lkZQoKYGBge3J9CiMgTWFraW5nIGEgY29sdW1uIGZvciB3aGV0aGVyIHRoZSBkZWF0aCBvY2N1cnJlZCBpbnNpZGUgb3Igb3V0c2lkZS4KCmNsZWFuX2RhdGFfMSA8LSBjbGVhbl9kYXRhXzEgJT4lIG11dGF0ZSgKICBpbnNpZGVfb3Jfb3V0c2lkZSA9IGNhc2Vfd2hlbgogICgKICAgIGRlYXRoX3BsYWNlX3R5cGUgJWluJSBjKAogICAgICAiSG9zcGl0YWwiLAogICAgICAiQ2FyZSBGYWNpbGl0eS9NZWRpY2FsIFByb3ZpZGVyIiwKICAgICAgIkJ1c2luZXNzIiwKICAgICAgIkhvdGVsL01vdGVsIiwKICAgICAgIlJlc2lkZW5jZSIsCiAgICAgICJUZW1wb3JhcnkvUGFydC1UaW1lIFJlc2lkZW5jZSIsCiAgICAgICJTdG9yYWdlIFNoZWQiLAogICAgICAiR2FyYWdlIiwKICAgICAgIlByaXNvbi9KYWlsIiwKICAgICAgIkNodXJjaCIsCiAgICAgICJTY2hvb2wiCiAgICApIH4gImluc2lkZSIsCiAgICBkZWF0aF9wbGFjZV90eXBlICVpbiUgYygKICAgICAgIlNpZGV3YWxrIiwKICAgICAgIlBhcmtpbmcgTG90IiwKICAgICAgIlN0cmVldCIsCiAgICAgICJBbGxleSIsCiAgICAgICJEZXNlcnQgQXJlYSIsCiAgICAgICJQYXJrIiwKICAgICAgIkZpZWxkIiwKICAgICAgIkNhbmFsIiwKICAgICAgIkhpZ2h3YXkiLAogICAgICAiUmFpbHJvYWQiLAogICAgICAiTGFrZSIsCiAgICAgICJSaXZlciIsCiAgICAgICJNb3VudGFpbiBBcmVhIiwKICAgICAgIkR1bXBzdGVyIiwKICAgICAgIllhcmQiLAogICAgICAiRHJpdmV3YXkiLAogICAgICAiUG9yY2gvUGF0aW8iLAogICAgICAiVHJhaWwiLAogICAgICAiUG9vbCIsCiAgICAgICJNdW5pY2lwYWwvR292ZXJubWVudCBQcm9wZXJ0eSIKICAgICkgfiAib3V0c2lkZSIsCiAgICBUUlVFIH4gIm90aGVyIikKKSAKICAgIApgYGAKCmBgYHtyfQojIENoZWNraW5nIHRvIHNlZSBpZiB0aGVyZSBhcmUgYW55ICJvdGhlciIgcm93cyBpbiB0aGUgaW5zaWRlIG9yIG91dHNpZGUgY29sdW1uLgoKY2xlYW5fZGF0YV8xICU+JSBmaWx0ZXIoaW5zaWRlX29yX291dHNpZGUgPT0gIm90aGVyIikgJT4lIAogIHNlbGVjdChjYXNlX251bWJlciwgZGVhdGhfcGxhY2VfdHlwZSwgaW5zaWRlX29yX291dHNpZGUpCgpgYGAKClRoZXJlIGFyZSAxMCByb3dzIHRoYXQgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gc2F5IHdoZXRoZXIgdGhlIGRlYXRoIG9jY3VyZWQgaW5zaWRlIG9yIG91dHNpZGUsIHNvIEkgbGFiZWxlZCB0aGVtICJvdGhlci4iCgpgYGB7cn0KY2xlYW5fZGF0YV8xICU+JSBjb3VudChpbnNpZGVfb3Jfb3V0c2lkZSkKCmBgYAoKQWJvdXQgNDQlIG9mIHRoZSBkZWF0aHMgb2NjdXJyZWQgb3V0c2lkZS4gSXQgbWlnaHQgYmUgc2xpZ2h0bHkgbW9yZSBvciBsZXNzIGJlY2F1c2Ugb2YgdGhlIDEwIHdlIGFyZW4ndCBzdXJlIGFib3V0LgoKYGBge3J9CmNsZWFuX2RhdGFfMSAlPiUgZmlsdGVyKGRlYXRoX3BsYWNlX3R5cGUgPT0gIkR1bXBzdGVyIikgJT4lIAogIHNlbGVjdChjYXNlX251bWJlciwgZGVhdGhfcGxhY2VfdHlwZSwgZXZlbnRfZGVzY3JpcHRpb24pCmBgYAoKCiMjIE11bmljaXBhbGl0aWVzCgpgYGB7cn0KY2xlYW5fZGF0YV8xICU+JSBjb3VudChkZWF0aF9wbGFjZV9jaXR5KSAlPiUgCiAgYXJyYW5nZShkZXNjKG4pKQpgYGAKCmBgYHtyfQpjbGVhbl9kYXRhXzEgJT4lIGZpbHRlcihkZWF0aF9wbGFjZV9jaXR5ID09ICJNQVJJQ09QQSIpICU+JSAKICBzZWxlY3QobmFtZV9sYXN0LCBuYW1lX2ZpcnN0LCBkZWF0aF96aXBfY29kZSkKYGBgCgpUaGVyZSBhcmUgMjEgcm93cyB0aGF0IGFyZSBtYXJrZWQgIk1hcmljb3BhIiBidXQgYXJlIGxpa2VseSBpbiBhbm90aGVyIG11bmljaXBhbGl0eSBpbiBNYXJpY29wYSBDb3VudHksIGFzIHRoZSBjaXR5IG9mIE1hcmljb3BhIGlzbid0IGluIHRoZSBjb3VudHkgKGl0J3MgaW4gUGluYWwgQ291bnR5KS4KCiMjIFJhY2UsIGV0aG5pY2l0eQoKYGBge3J9CmNsZWFuX2RhdGFfMSAlPiUgY291bnQocmFjZSkgJT4lIAogIGFycmFuZ2UoZGVzYyhuKSkKYGBgCgpXaGl0ZSBwZW9wbGUgbWFkZSB1cCA3NSUgb2YgZGVhdGhzLCBmb2xsb3dlZCBieSBCbGFjayBwZW9wbGUgd2l0aCAxMiUsIE5hdGl2ZSBBbWVyaWNhbnMgd2l0aCAxMSUsIGFuZCBBc2lhbnMgd2l0aCBsZXNzIHRoYW4gMSUuCgpgYGB7cn0KY2xlYW5fZGF0YV8xICU+JSBjb3VudChldGhuaWNpdHkpICU+JSAKICBhcnJhbmdlKGRlc2MobikpCmBgYAoKSGlzcGFuaWMvTGF0aW5vIHBlb3BsZSBtYWRlIHVwIDE5JSBvZiBkZWF0aHMuCgpgYGB7cn0KY2xlYW5fZGF0YV8xICU+JSBncm91cF9ieShyYWNlKSAlPiUgCiAgY291bnQoZXRobmljaXR5KSAlPiUgCiAgYXJyYW5nZShkZXNjKG4pKQpgYGAKCmBgYHtyfQpjbGVhbl9kYXRhXzEgJT4lIGNvdW50KHNleF9maW5hbCkgJT4lCmFycmFuZ2UoZGVzYyhuKSkKYGBgCgpNZW4gbWFkZSB1cCA4MSUgb2YgZGVhdGhzLCB3b21lbiAxOSUuCgojIyBEZW1vZ3JhcGhpY3Mgb2YgaG9taWNpZGUgdmljdGltcwoKYGBge3J9CmNsZWFuX2RhdGFfMSAlPiUgZmlsdGVyKG1hbm5lcl9vZl9kZWF0aCA9PSAiSG9taWNpZGUiKSAlPiUgCiAgY291bnQocmFjZSkgJT4lIAogIGFycmFuZ2UoZGVzYyhuKSkKYGBgCgpXaGl0ZXMgbWFkZSB1cCA4MyUgb2YgaG9taWNpZGUgdmljdGltcywgZm9sbG93ZWQgYnkgQmxhY2tzIGF0IDExJSwgTmF0aXZlIEFtZXJpY2FucyBhdCAzJSBhbmQgUGFjaWZpYyBJc2xhbmRlcnMgYXQgMSUuCgojIyBUaW1lIG9mIHllYXIKCkRlYWRsaWVzdCBkYXkgb2YgdGhlIHllYXI6CgpgYGB7cn0KY2xlYW5fZGF0YV8xICU+JSBjb3VudChkZWF0aF9kYXRlKSAlPiUgCiAgYXJyYW5nZShkZXNjKG4pKQpgYGAKCkRlYWRsaWVzdCBtb250aCBvZiB0aGUgeWVhcjoKCmBgYHtyfQpjbGVhbl9kYXRhXzEgJT4lIGNvdW50KG1vbnRoID0gbHVicmlkYXRlOjpmbG9vcl9kYXRlKGRlYXRoX2RhdGUsICdtb250aCcpKSAlPiUgCiAgYXJyYW5nZShkZXNjKG4pKQpgYGAKCkp1bHkgd2FzIHRoZSBkZWFkbGllc3QgbW9udGggYnkgZmFyLCB3aXRoIG1vcmUgdGhhbiB0d2ljZSBhcyBtYW55IGRlYXRocyBhcyBhbnkgb3RoZXIgbW9udGguIFRoZSBzZWNvbmQgZGVhZGxpZXN0IG1vbnRocyB3ZXJlIEF1Z3VzdCBhbmQgSnVuZS4KCmBgYHtyfQpkZWF0aF9kYXRlPC1hcy5EYXRlKGNsZWFuX2RhdGFfMSRkZWF0aF9kYXRlKQoKY2xhc3MoY2xlYW5fZGF0YV8xJGRlYXRoX2RhdGUpCmBgYAoKYGBge3J9CmNsZWFuX2RhdGFfMVssIm1vbnRoIl0gPC0gZm9ybWF0KGNsZWFuX2RhdGFfMVssImRlYXRoX2RhdGUiXSwiJW0iKQpgYGAKCgpgYGB7cn0KY2xlYW5fZGF0YV8xICU+JSBmaWx0ZXIobW9udGg9PSIwNyIpCmBgYAoKYGBge3J9CmNsZWFuX2RhdGFfMVtpcy5uYShjbGVhbl9kYXRhXzEkZGVhdGhfZGF0ZSksXQpgYGAKClRoZXJlIGFyZSA2MSBjYXNlcyB3aGVyZSB0aGUgZGF0ZSBvZiBkZWF0aCB3YXMgbGVmdCBibGFuay4gU29tZSBoYXZlIGRhdGVzIGluY2x1ZGVkIGluIHRoZSBldmVudCBkZXNjcmlwdGlvbiwgYnV0IG5vdCBhbGwuCgpEZWFkbGllc3Qgd2VlayBvZiB0aGUgeWVhcjoKCmBgYHtyfQoKY2xlYW5fZGF0YV8xIDwtIGNsZWFuX2RhdGFfMSAlPiUgbXV0YXRlKAogIGRlYXRoX3dlZWsgPSAobHVicmlkYXRlOjp3ZWVrKHltZChkZWF0aF9kYXRlKSkpCiAgKQoKY2xlYW5fZGF0YV8xICU+JSBjb3VudChkZWF0aF93ZWVrKSAlPiUgCiAgYXJyYW5nZShkZXNjKG4pKQpgYGAKClRoZSAyOXRoIHdlZWsgb2YgdGhlIHllYXIgd2FzIHRoZSBkZWFkbGllc3Qgd2Vlay4KCmBgYHtyfQpjbGVhbl9kYXRhXzEgJT4lIGZpbHRlcihkZWF0aF93ZWVrID09IDI5KSAlPiUgCiAgc2VsZWN0KGRlYXRoX2RhdGUsIHByaW1hcnlfY2F1c2Vfb2ZfZGVhdGgsIGV2ZW50X2Rlc2NyaXB0aW9uKQpgYGAKCiMjIFByaW1hcnkgY2F1c2Ugb2YgZGVhdGgKClN1YnN0YW5jZSB1c2U6CgpgYGB7cn0KCmNsZWFuX2RhdGFfMSAlPiUgZmlsdGVyKAogIHN0cl9kZXRlY3QoCiAgICBwcmltYXJ5X2NhdXNlX29mX2RlYXRoLAogICAgIig/aSljb2NhaW5lfCg/aSltZXRoYW1waGV0YW1pbmV8KD9pKWZlbnRhbnlsfCg/aSloZXJvaW58KD9pKWRydWd8KD9pKWRydWdzfCg/aSlzdWJzdGFuY2V8KD9pKWV0aGFub2x8KD9pKWV0aGFub2xpc218KD9pKWFsY29ob2x8KD9pKXRveGljaXR5fCg/aSlpbnRveGljYXRpb258KD9pKWRveHlsYW1pbmV8KD9pKXRveGljIgogICkKKSAlPiUKICBzZWxlY3QoY2FzZV9udW1iZXIsIG1hbm5lcl9vZl9kZWF0aCwgcHJpbWFyeV9jYXVzZV9vZl9kZWF0aCwgZXZlbnRfZGVzY3JpcHRpb24pCmBgYAoKW1RSWSBUTyBDSEVDSyBGT1IgTUlTU1BFTExJTkdTIE9GIERSVUcgTkFNRVNdey5oaWdobGlnaHR9CgpGZW50YW55bCwgc3BlY2lmaWNhbGx5OgoKYGBge3J9CmNsZWFuX2RhdGFfMSAlPiUgZmlsdGVyKAogIHN0cl9kZXRlY3QoCiAgICBwcmltYXJ5X2NhdXNlX29mX2RlYXRoLAogICAgIig/aSlmZW50YW55bCIKICApCikgJT4lCiAgc2VsZWN0KGNhc2VfbnVtYmVyLCBwcmltYXJ5X2NhdXNlX29mX2RlYXRoLCBldmVudF9kZXNjcmlwdGlvbikKYGBgCgoyNzkgZGVhdGhzIGhhZCBmZW50YW55bCBpbmNsdWRlZCBpbiB0aGUgcHJpbWFyeSBjYXVzZS4KCkhlYXQ6CgpgYGB7cn0KY2xlYW5fZGF0YV8xICU+JSBmaWx0ZXIoc3RyX2RldGVjdChwcmltYXJ5X2NhdXNlX29mX2RlYXRoLCAiKD9pKWhlYXR8KD9pKWh5cGVydGhlcm1pYSIpKSAlPiUgCiAgc2VsZWN0KGNhc2VfbnVtYmVyLCBtYW5uZXJfb2ZfZGVhdGgsIGRlYXRoX2RhdGUsIHByaW1hcnlfY2F1c2Vfb2ZfZGVhdGgsIGV2ZW50X2Rlc2NyaXB0aW9uKQpgYGAKCkhlYXQgYXMgcHJpbWFyeSBPUiBzZWNvbmRhcnkgY2F1c2Ugb2YgZGVhdGg6CgpgYGB7cn0KY2xlYW5fZGF0YV8xICU+JSBmaWx0ZXIoc3RyX2RldGVjdChwcmltYXJ5X2NhdXNlX29mX2RlYXRoLCAiKD9pKWhlYXR8KD9pKWh5cGVydGhlcm1pYSIpfHN0cl9kZXRlY3QoY29udHJpYnV0b3J5X2NhdXNlX29mX2RlYXRoLCIoP2kpaGVhdHwoP2kpaHlwZXJ0aGVybWlhIikpICU+JSAKICBzZWxlY3QoY2FzZV9udW1iZXIsIG1hbm5lcl9vZl9kZWF0aCwgZGVhdGhfZGF0ZSwgcHJpbWFyeV9jYXVzZV9vZl9kZWF0aCwgY29udHJpYnV0b3J5X2NhdXNlX29mX2RlYXRoLCBldmVudF9kZXNjcmlwdGlvbikKYGBgCgoKSGVhdCBBTkQgZHJ1ZyB1c2U6CgpgYGB7cn0KZHJ1Z193b3JkcyA8LSBjKCJjb2NhaW5lIiwiQ29jYWluZSIsIm1ldGhhbXBoZXRhbWluZSIsIk1ldGhhbXBoZXRhbWluZSIsImZlbnRhbnlsIiwiRmVudGFueWwiLCJoZXJvaW4iLCJIZXJvaW4iLCJkcnVnIiwiRHJ1ZyIsImRydWdzIiwiRHJ1Z3MiLCJzdWJzdGFuY2UiLCJTdWJzdGFuY2UiLCJldGhhbm9sIiwiRXRoYW5vbCIsImV0aGFub2xpc20iLCJFdGhhbm9saXNtIiwiYWxjb2hvbCIsIkFsY29ob2wiLCJ0b3hpY2l0eSIsIlRveGljaXR5IiwiaW50b3hpY2F0aW9uIiwiSW50b3hpY2F0aW9uIiwiZG94eWxhbWluZSIsIkRveHlsYW1pbmUiLCJ0b3hpYyIsIlRveGljIikKCmhlYXRfd29yZHMgPC0gYygiaGVhdCIsImh5cGVydGhlcm1pYSIsIkhlYXQiLCJIeXBlcnRoZXJtaWEiKQoKaGVhdF9hbmRfZHJ1ZyA8LWNsZWFuX2RhdGFfMSAlPiUgCiAgbXV0YXRlKGhlYXRfZHJ1Z19jb21iaW5lZD1pZmVsc2Uoc3RyX2RldGVjdChwcmltYXJ5X2NhdXNlX29mX2RlYXRoLHN0cl9jKGRydWdfd29yZHMsY29sbGFwc2U9InwiKSkmc3RyX2RldGVjdChjb250cmlidXRvcnlfY2F1c2Vfb2ZfZGVhdGgsIHN0cl9jKGhlYXRfd29yZHMsY29sbGFwc2U9InwiKSksICJZRVMiLGlmZWxzZShzdHJfZGV0ZWN0KHByaW1hcnlfY2F1c2Vfb2ZfZGVhdGgsc3RyX2MoaGVhdF93b3Jkcyxjb2xsYXBzZT0ifCIpKSZzdHJfZGV0ZWN0KGNvbnRyaWJ1dG9yeV9jYXVzZV9vZl9kZWF0aCwgc3RyX2MoZHJ1Z193b3Jkcyxjb2xsYXBzZT0ifCIpKSwiWUVTIiwiTk8iKSksLmFmdGVyPWNvbnRyaWJ1dG9yeV9jYXVzZV9vZl9kZWF0aCkKICAgIApoZWF0X2FuZF9kcnVnICU+JSBmaWx0ZXIoaGVhdF9kcnVnX2NvbWJpbmVkID09ICJZRVMiKSAlPiUgCiAgc2VsZWN0KGNhc2VfbnVtYmVyLHByaW1hcnlfY2F1c2Vfb2ZfZGVhdGgsY29udHJpYnV0b3J5X2NhdXNlX29mX2RlYXRoLGhlYXRfZHJ1Z19jb21iaW5lZCkgJT4lIG5yb3coKQoKYGBgCkF0IGxlYXN0IDkyIGRlYXRocyBvZiBwZW9wbGUgZXhwZXJpZW5jaW5nIGhvbWVsZXNzbmVzcyB3ZXJlIGR1ZSB0byBkcnVncyBhbmQgaGVhdCBjb21iaW5lZC4gVGhhdCdzIGFsbW9zdCBjZXJ0YWlubHkgYW4gdW5kZXJjb3VudCwgYXMgdGhlIE1lZGljYWwgRXhhbWluZXIncyBhbm51YWwgcmVwb3J0IGZvciAyMDIyIGluY2x1ZGVkIDEzMiBkZWF0aHMgb2YgdW5ob3VzZWQgcGVvcGxlIGZyb20gZHJ1Z3MgYW5kIGhlYXQuIEkgY2FuIGFsc28gc2VlIHRoZXJlIGFyZSBzb21lIGRydWcvaGVhdCBkZWF0aHMgdGhhdCBpbmNsdWRlIGJvdGggb2YgdGhlIGtleXdvcmRzIGluIGp1c3QgdGhlIHByaW1hcnkgY2F1c2Ugb2YgZGVhdGggY29sdW1uLCBzbyB0aGV5IHdlcmVuJ3QgY2FwdHVyZWQgaW4gdGhpcyBxdWVyeS4gU28gdGhpcyBudW1iZXIgc2hvdWxkbid0IGJlIGNvbnNpZGVyZWQgY29tcHJlaGVuc2l2ZS4KCgpCeSBtb250aDoKCmBgYHtyfQpjbGVhbl9kYXRhXzEgJT4lIGZpbHRlcihzdHJfZGV0ZWN0KHByaW1hcnlfY2F1c2Vfb2ZfZGVhdGgsICIoP2kpaGVhdHwoP2kpaHlwZXJ0aGVybWlhIikpICU+JSAKICBjb3VudChtb250aCA9IGx1YnJpZGF0ZTo6Zmxvb3JfZGF0ZShkZWF0aF9kYXRlLCAnbW9udGgnKSkgJT4lIAogIGFycmFuZ2UoZGVzYyhuKSkKYGBgCgpKdWx5IGhhZCB0aGUgbW9zdCBoZWF0IGRlYXRocyBieSBmYXIsIGZvbGxvd2VkIGJ5IEp1bmUgYW5kIHRoZW4gQXVndXN0LgoKQ09WSUQtMTk6CgpgYGB7cn0KY2xlYW5fZGF0YV8xICU+JSBmaWx0ZXIoc3RyX2RldGVjdChwcmltYXJ5X2NhdXNlX29mX2RlYXRoLCAiKD9pKWNvdmlkfCg/aSlDT1ZJRC0xOSIpKSAlPiUgCiAgc2VsZWN0KGNhc2VfbnVtYmVyLCBtYW5uZXJfb2ZfZGVhdGgsIHByaW1hcnlfY2F1c2Vfb2ZfZGVhdGgpCmBgYAoKQmx1bnQgZm9yY2UgdHJhdW1hOgoKYGBge3J9CmNsZWFuX2RhdGFfMSAlPiUgZmlsdGVyKHN0cl9kZXRlY3QocHJpbWFyeV9jYXVzZV9vZl9kZWF0aCwiKD9pKWJsdW50IGZvcmNlfCg/aSlibHVudCIpKSAlPiUgCiAgc2VsZWN0KGNhc2VfbnVtYmVyLCBtYW5uZXJfb2ZfZGVhdGgsIHByaW1hcnlfY2F1c2Vfb2ZfZGVhdGgsIGV2ZW50X2Rlc2NyaXB0aW9uLCBkZWF0aF96aXBfY29kZSkKYGBgCgpTdHJ1Y2sgYnkgdmVoaWNsZSwgdHJhaW4gb3IgbGlnaHQgcmFpbDoKCmBgYHtyfQpjbGVhbl9kYXRhXzEgJT4lIGZpbHRlcihzdHJfZGV0ZWN0KGV2ZW50X2Rlc2NyaXB0aW9uLCAiKD9pKXN0cnVjayIpKSAlPiUgCiAgc2VsZWN0KGNhc2VfbnVtYmVyLCBtYW5uZXJfb2ZfZGVhdGgsIHByaW1hcnlfY2F1c2Vfb2ZfZGVhdGgsIGV2ZW50X2Rlc2NyaXB0aW9uKQpgYGAKCkkgY2hlY2tlZCBhbGwgNTQgb2YgdGhlc2UgY2FzZXMgbWFudWFsbHkgdG8gbWFrZSBzdXJlIHRoZSBldmVudCBkZXNjcmlwdGlvbiBzYWlkIHRoZXkgd2VyZSBzdHJ1Y2sgYnkgYSB2ZWhpY2xlLCB3aGljaCB0aGV5IGFsbCB3ZXJlLgoKSSB3aWxsIGFsc28gaW5jbHVkZSBlaWdodCBtb3JlIGNhc2VzIGZyb20gdGhlIHNlY3Rpb24gYWJvdmUgdGhhdCBkaWQgbm90IGluY2x1ZGUgdGhlIHdvcmQgInN0cnVjayIgYnV0IGFyZSBibHVudCBmb3JjZSB0cmF1bWEgY2FzZXMgZnJvbSBnZXR0aW5nIGhpdCBieSBhIHZlaGljbGU6IDIwMjItMDIxMDYsIDIwMjItMDM0MjMsIDIwMjItMDM0MzksIDIwMjItMDQwNTksIDIwMjItMDY1MDAsIDIwMjItMDgwNzMsIDIwMjItMDk2OTYgYW5kIDIwMjItMDk5OC4KClRvdGFsaW5nIHRob3NlIHRvZ2V0aGVyLCB0aGVyZSBhcmUgYXQgbGVhc3QgNjIgY2FzZXMgb2YgcGVvcGxlIGV4cGVyaWVuY2luZyBob21lbGVzc25lc3MgZmF0YWxseSBiZWluZyBzdHJ1Y2sgYnkgYSB2ZWhpY2xlLgoKYGBge3J9CiMgTG9vayBhdCB6aXAgY29kZXMgd2l0aCB0aGUgbW9zdCB2ZWhpY2xlIGRlYXRocy4KCmNsZWFuX2RhdGFfMSAlPiUgZmlsdGVyKChzdHJfZGV0ZWN0KGV2ZW50X2Rlc2NyaXB0aW9uLCAiKD9pKXN0cnVjayIpKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZV9udW1iZXIgPT0gIjIwMjItMDIxMDYiIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlX251bWJlciA9PSAiMjAyMi0wMzQyMyIgfAogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VfbnVtYmVyID09ICIyMDIyLTAzNDM5IiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZV9udW1iZXIgPT0gIjIwMjItMDQwNTkiIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlX251bWJlciA9PSAgIjIwMjItMDUzMTgiIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlX251bWJlciA9PSAgIjIwMjItMDYzMTIiIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlX251bWJlciA9PSAgIjIwMjItMDY1MDAiIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlX251bWJlciA9PSAgIjIwMjItMDgwNzMiIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlX251bWJlciA9PSAiMjAyMi0wOTY5NiIgfAogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VfbnVtYmVyID09ICAiMjAyMi0wOTkyMiIgfAogICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VfbnVtYmVyID09ICAiMjAyMi0wOTk4MiIKKSAlPiUgCiAgZmlsdGVyKGNhc2VfbnVtYmVyICE9ICIyMDIyLTA4Nzg3IiAmCiAgICAgICAgIGNhc2VfbnVtYmVyICE9ICIyMDIyLTEwNzkxIikgJT4lIAogIGNvdW50KGRlYXRoX3ppcF9jb2RlKSAlPiUgCiAgYXJyYW5nZShkZXNjKG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgIApgYGAKClpJUCBjb2RlIDg1MDA3LCB0aGUgWklQIGNvZGUgb2YgIlRoZSBab25lLCIgUGhvZW5peCdzIGxhcmdlc3QgaG9tZWxlc3MgZW5jYW1wbWVudCwgaGFzIG5vIHZlaGljbGUgZGVhdGhzLiBJdCBjb3VsZCBiZSBiZWNhdXNlIHRoZSBwZW9wbGUgaGl0IGJ5IGNhcnMgdGhlcmUgd2VyZSB0YWtlbiB0byBhIGhvc3BpdGFsIGluIGFub3RoZXIgWklQIGNvZGUgd2hlcmUgdGhleSB3ZXJlIHByb25vdW5jZWQgZGVhZCwgc3VjaCBhcyA4NTAwNi4KCmBgYHtyfQojIERvdWJsZS1jaGVja2luZyBjYXVzZXMgb2YgZGVhdGggaW4gODUwMDcgYW5kIDg1MDA2CgpjbGVhbl9kYXRhXzEgJT4lIGZpbHRlcihkZWF0aF96aXBfY29kZSA9PSAiODUwMDciIHwgZGVhdGhfemlwX2NvZGU9PSI4NTAwNiIpICU+JSAKICAgICAgICAgICAgICAgIHNlbGVjdChkZWF0aF96aXBfY29kZSwgcHJpbWFyeV9jYXVzZV9vZl9kZWF0aCwgZXZlbnRfZGVzY3JpcHRpb24pCgpgYGAKCiMjIEFnZSBhdCBkZWF0aAoKYGBge3J9Cm1lYW4oY2xlYW5fZGF0YV8xJGFnZSkKYGBgCgpgYGB7cn0KbWVkaWFuKGNsZWFuX2RhdGFfMSRhZ2UpCmBgYAoKVGhlIHR5cGljYWwgYWdlIGF0IHRpbWUgb2YgZGVhdGggd2FzIDQ3IHllYXJzIG9sZC4K