Data Manipulations
# Get US county socio-economic variables from Area resource file 2019-2020
arf2020<-import("ahrf2020.sas7bdat")
arf2020<-arf2020%>%
mutate(cofips=as.factor(f00004),
coname=f00010,
state = f00011,
medhouvl=f1461314,
pctcrpop= round(100*(f1492010/f0453010),2),
medhinc= f1434514,
pctctyunemp=round(100*(f1451214/f1451014),2),
ctypopdes= (f0453010/f1387410),
rucc= as.numeric(f0002013),
pctperpov= f1332118,
obgyn10_pc= 1000*(f1168410/ f0453010) )%>%
dplyr::select(medhouvl, pctcrpop,medhinc, pctctyunemp,state, cofips, coname, ctypopdes, rucc, obgyn10_pc,pctperpov)%>%
mutate(rurality= car::Recode(rucc, recodes ="1:7 ='Urban';8:9='Rural'"))
# Get other US county socioeconomic variables from the 5 year (2015-2019) ASC data source.
US_county <- get_acs(geography = 'county',variables = c(totPop19 = "B03003_001",
hispanic ="B03003_003",
afrAm = "B03002_004",
white="B03002_003",
gini="B19083_001"),
year = 2019, geometry = TRUE, shift_geo = TRUE) %>%
dplyr::select(GEOID, NAME, variable, estimate) %>%
spread(variable, estimate) %>%
mutate(pcthispPr19 = round((hispanic/totPop19)*100),1,
pctnhblackpr19 = round((afrAm/totPop19)*100),1 , pctnhpwhite19=round((white/totPop19)*100),1, cofips=as.factor(GEOID)) %>%
dplyr::select(cofips,totPop19,pcthispPr19, pctnhblackpr19, pctnhpwhite19,gini)
#Merge the socioeconomic variables from the Area resource file 2019-2020 with the other socioeconomic variables from the 5 year (2015-2019) ACS estimates.
sevar <- geo_join( US_county, arf2020, by_sp="cofips", by_df="cofips",how="left")
#load and calculate maternal mortality rates for counties in US for a 5year period (2015-2019)
alldat<-readRDS("~/OneDrive - University of Texas at San Antonio/maternalmortality/aggregate/alldat.rds")
countyMMR <- alldat %>%
group_by(cofips)%>%
summarise(nbir=sum(nbirths, na.rm = T), ndea = sum(ndeaths, na.rm = T)) %>%
mutate(mmrate =round(100000*(ndea/nbir),2))
#Merge the socioeconomic variables with US counties maternal mortality rates for a 5- years period(2015-2019)
MMRdata<- geo_join( sevar, countyMMR, by_sp="cofips", by_df="cofips",how="left") %>%
mutate(rmmrate=ifelse(mmrate>=1,mmrate,NA)) %>%
filter(!is.na(ndea), mmrate!=Inf)
Descriptive Maps

Defining Outcome and Predictor Variables
The dependent variable in this analysis is maternal mortality rates in US counties. Predictors for this analysis include; percentage of county population that is rural; the median household income in the county; the county’s median house value; the population density per square mile in the county. The per capital number of OB-GYN in the county; gini coefficient as a relative measure of income inequality; percentage of non Hispanic black population in the counties. All variables were Z scored
Estimating Linear Regression
| Characteristic |
Beta |
95% CI |
p-value |
| Rurality |
|
|
0.002 |
| Rural |
— |
— |
|
| Urban |
0.12 |
0.05, 0.20 |
|
| Median Household Income |
-0.12 |
-0.16, -0.08 |
<0.001 |
| Median House Value |
0.03 |
0.00, 0.07 |
0.081 |
| Percent of Rural Population |
0.08 |
0.04, 0.12 |
<0.001 |
| Population Density |
0.82 |
0.79, 0.84 |
<0.001 |
| Per Capita OB-GYN |
-0.08 |
-0.11, -0.05 |
<0.001 |
| Percent of Non-Hispanic Black |
-0.03 |
-0.06, -0.01 |
0.008 |
| Gini Coefficient |
-0.05 |
-0.07, -0.02 |
0.002 |
| R² = 0.598; AIC = 5,996; Adjusted R² = 0.597; Degrees of Freedom = 8 |
Urban areas have higher maternal mortality rates than rural areas, based on the first coefficient in the model . County characteristics associated with higher maternal mortality rates include: Percentage of county rural population, and The county population density.
County characteristics associated with lower maternal mortality rates are: the median household income, per capital number of OB-GYN in the county ,proportion of the county population that are non-Hispanic black, and the county Gini coefficient .
Median house value was not significantly related to maternal mortality.
Testing for Non-Stationarity
Non-Stationarity Test
|
Res.DF
|
RSS
|
DF
|
SumSq
|
Statistic
|
P.Value
|
|
3059
|
1259.68
|
NA
|
NA
|
NA
|
NA
|
|
3058
|
1257.91
|
1
|
1.77
|
4.3
|
0.04
|
The test from above shows that the regression effects are not constant between the regimes(Rural and Urban). This is because the F test is significant(p-value 0.03855). This indicate non-stationarity in the models
Urban Model
| Characteristic |
Beta |
95% CI |
p-value |
| Median Household Income |
-0.16 |
-0.21, -0.11 |
<0.001 |
| Median House Value |
0.06 |
0.01, 0.10 |
0.020 |
| Percent of Rural Population |
0.07 |
0.03, 0.11 |
<0.001 |
| Population Density |
0.82 |
0.79, 0.84 |
<0.001 |
| Per Capita OB-GYN |
-0.08 |
-0.12, -0.05 |
<0.001 |
| Percent of Non-Hispanic Black |
-0.04 |
-0.07, 0.00 |
0.028 |
| Gini Coefficient |
-0.07 |
-0.11, -0.03 |
0.001 |
| R² = 0.600; AIC = 5,319; Adjusted R² = 0.599; Degrees of Freedom = 7 |
For the Urban counties, the overall interpretation is similar to what it was for the pooled data. However, compared to the pooled data model, the urban data shows that the Median house value is significantly related to Maternal mortality.
County characteristics associated with higher maternal mortality rates include:County median house value, Percentage of county rural population, and the county population density.
County characteristics associated with lower maternal mortality rates are: the median household income, per capital number of OB-GYN in the county ,proportion of the county population that are non-Hispanic black, and the county Gini coefficient .
Rural Model
| Characteristic |
Beta |
95% CI |
p-value |
| Median Household Income |
0.00 |
0.00, 0.00 |
0.058 |
| Median House Value |
0.00 |
0.00, 0.00 |
0.9 |
| Percent of Rural Population |
0.00 |
-0.01, 0.00 |
0.4 |
| Population Density |
-0.01 |
-0.09, 0.06 |
0.7 |
| Per Capita OB-GYN |
0.00 |
0.00, 0.00 |
0.4 |
| Percent of Non-Hispanic Black |
0.00 |
0.00, 0.00 |
0.8 |
| Gini Coefficient |
0.00 |
0.00, 0.00 |
0.2 |
| R² = 0.010; AIC = -3,647; Adjusted R² = -0.001; Degrees of Freedom = 7 |
For the Rural counties, the overall interpretation is different from what it was for the pooled data. In fact, non of the predictors were significantly associated with maternal mortality rates.
LS0tCnRpdGxlOiAiU3BhdGlhbCBEZW1vZ3JhcGh5IC0gSG9tZXdrIDMgLVNwYXRpYWwgUmVnaW1lcyIKYXV0aG9yOiAiU2Ftc29uIEEuIE9sb3dvbGFqdSwgTVBIIgpkYXRlOiAiMTEgT2N0b2JlciwgMjAyMSIKb3V0cHV0OgogICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBmaWdfaGVpZ2h0OiA3CiAgICBmaWdfd2lkdGg6IDcKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCgpgYGB7ciBsb2FkbGlicywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSxlY2hvPUZBTFNFfQpsaWJyYXJ5KG5vcnRlc3QpCmxpYnJhcnkoY2FyKQpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShjbGFzc0ludCkKbGlicmFyeShzYW5kd2ljaCkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoc3BkZXApCmxpYnJhcnkocmlvKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoYnJvb20pCmxpYnJhcnkodGlkeWNlbnN1cykKbGlicmFyeShzZikKbGlicmFyeSh0aWdyaXMpCmxpYnJhcnkoc3BhdGlhbHJlZykKbGlicmFyeShtYXB2aWV3KQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeShndHN1bW1hcnkpCmBgYAoKIyMjIERhdGEgTWFuaXB1bGF0aW9ucwpgYGB7cix3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQojIEdldCBVUyBjb3VudHkgc29jaW8tZWNvbm9taWMgdmFyaWFibGVzIGZyb20gQXJlYSByZXNvdXJjZSBmaWxlIDIwMTktMjAyMAoKYXJmMjAyMDwtaW1wb3J0KCJhaHJmMjAyMC5zYXM3YmRhdCIpIAogYXJmMjAyMDwtYXJmMjAyMCU+JQogIG11dGF0ZShjb2ZpcHM9YXMuZmFjdG9yKGYwMDAwNCksIAogICAgICAgICBjb25hbWU9ZjAwMDEwLAogICAgICAgICBzdGF0ZSA9IGYwMDAxMSwKICAgICAgICAgbWVkaG91dmw9ZjE0NjEzMTQsCiAgICAgICAgIHBjdGNycG9wPSByb3VuZCgxMDAqKGYxNDkyMDEwL2YwNDUzMDEwKSwyKSwKICAgICAgICAgbWVkaGluYz0gZjE0MzQ1MTQsCiAgICAgICAgIHBjdGN0eXVuZW1wPXJvdW5kKDEwMCooZjE0NTEyMTQvZjE0NTEwMTQpLDIpLAogICAgICAgICBjdHlwb3BkZXM9IChmMDQ1MzAxMC9mMTM4NzQxMCksICAKICAgICAgICAgcnVjYz0gYXMubnVtZXJpYyhmMDAwMjAxMyksCiAgICAgICAgIHBjdHBlcnBvdj0gZjEzMzIxMTgsCiAgICAgICAgIG9iZ3luMTBfcGM9IDEwMDAqKGYxMTY4NDEwLyBmMDQ1MzAxMCkgKSU+JQogIGRwbHlyOjpzZWxlY3QobWVkaG91dmwsIHBjdGNycG9wLG1lZGhpbmMsIHBjdGN0eXVuZW1wLHN0YXRlLCBjb2ZpcHMsIGNvbmFtZSwgY3R5cG9wZGVzLCBydWNjLCBvYmd5bjEwX3BjLHBjdHBlcnBvdiklPiUKICAgIG11dGF0ZShydXJhbGl0eT0gY2FyOjpSZWNvZGUocnVjYywgcmVjb2RlcyA9IjE6NyA9J1VyYmFuJzs4Ojk9J1J1cmFsJyIpKQoKCiMgR2V0IG90aGVyICBVUyBjb3VudHkgc29jaW9lY29ub21pYyB2YXJpYWJsZXMgZnJvbSB0aGUgNSB5ZWFyICgyMDE1LTIwMTkpIEFTQyBkYXRhIHNvdXJjZS4KCiBVU19jb3VudHkgPC0gZ2V0X2FjcyhnZW9ncmFwaHkgPSAnY291bnR5Jyx2YXJpYWJsZXMgPSBjKHRvdFBvcDE5ID0gIkIwMzAwM18wMDEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzcGFuaWMgPSJCMDMwMDNfMDAzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmckFtID0gIkIwMzAwMl8wMDQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZT0iQjAzMDAyXzAwMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbmk9IkIxOTA4M18wMDEiKSwgCiAgICAgICAgICAgICAgICAgICAgeWVhciA9IDIwMTksIGdlb21ldHJ5ID0gVFJVRSwgc2hpZnRfZ2VvID0gVFJVRSkgJT4lIAogICAgICAgICAgICBkcGx5cjo6c2VsZWN0KEdFT0lELCBOQU1FLCB2YXJpYWJsZSwgZXN0aW1hdGUpICU+JSAKICAgICAgICAgICAgc3ByZWFkKHZhcmlhYmxlLCBlc3RpbWF0ZSkgJT4lIAogICAgICAgICAgICBtdXRhdGUocGN0aGlzcFByMTkgID0gcm91bmQoKGhpc3BhbmljL3RvdFBvcDE5KSoxMDApLDEsIAogICAgICAgICAgICAgICAgICAgcGN0bmhibGFja3ByMTkgPSByb3VuZCgoYWZyQW0vdG90UG9wMTkpKjEwMCksMSAsIHBjdG5ocHdoaXRlMTk9cm91bmQoKHdoaXRlL3RvdFBvcDE5KSoxMDApLDEsIGNvZmlwcz1hcy5mYWN0b3IoR0VPSUQpKSAlPiUKICAgICAgICAgICAgZHBseXI6OnNlbGVjdChjb2ZpcHMsdG90UG9wMTkscGN0aGlzcFByMTksIHBjdG5oYmxhY2twcjE5LCBwY3RuaHB3aGl0ZTE5LGdpbmkpCgoKI01lcmdlIHRoZSBzb2Npb2Vjb25vbWljIHZhcmlhYmxlcyBmcm9tIHRoZSBBcmVhIHJlc291cmNlIGZpbGUgMjAxOS0yMDIwIHdpdGggdGhlIG90aGVyIHNvY2lvZWNvbm9taWMgdmFyaWFibGVzIGZyb20gdGhlIDUgeWVhciAoMjAxNS0yMDE5KSBBQ1MgZXN0aW1hdGVzLgoKIHNldmFyIDwtIGdlb19qb2luKCBVU19jb3VudHksIGFyZjIwMjAsIGJ5X3NwPSJjb2ZpcHMiLCBieV9kZj0iY29maXBzIixob3c9ImxlZnQiKSAKCiAjbG9hZCBhbmQgY2FsY3VsYXRlIG1hdGVybmFsIG1vcnRhbGl0eSByYXRlcyBmb3IgY291bnRpZXMgaW4gVVMgZm9yICBhIDV5ZWFyIHBlcmlvZCAoMjAxNS0yMDE5KQphbGxkYXQ8LXJlYWRSRFMoIn4vT25lRHJpdmUgLSBVbml2ZXJzaXR5IG9mIFRleGFzIGF0IFNhbiBBbnRvbmlvL21hdGVybmFsbW9ydGFsaXR5L2FnZ3JlZ2F0ZS9hbGxkYXQucmRzIikgCiBjb3VudHlNTVIgPC0gIGFsbGRhdCAlPiUgCiAgZ3JvdXBfYnkoY29maXBzKSU+JQogIHN1bW1hcmlzZShuYmlyPXN1bShuYmlydGhzLCBuYS5ybSA9IFQpLCBuZGVhID0gc3VtKG5kZWF0aHMsIG5hLnJtID0gVCkpICAlPiUgCiAgbXV0YXRlKG1tcmF0ZSA9cm91bmQoMTAwMDAwKihuZGVhL25iaXIpLDIpKQogCiAgI01lcmdlIHRoZSBzb2Npb2Vjb25vbWljIHZhcmlhYmxlcyB3aXRoIFVTIGNvdW50aWVzIG1hdGVybmFsIG1vcnRhbGl0eSByYXRlcyBmb3IgYSA1LSB5ZWFycyBwZXJpb2QoMjAxNS0yMDE5KQpNTVJkYXRhPC0gZ2VvX2pvaW4oIHNldmFyLCBjb3VudHlNTVIsIGJ5X3NwPSJjb2ZpcHMiLCBieV9kZj0iY29maXBzIixob3c9ImxlZnQiKSAlPiUgCiAgbXV0YXRlKHJtbXJhdGU9aWZlbHNlKG1tcmF0ZT49MSxtbXJhdGUsTkEpKSAlPiUgCiAgZmlsdGVyKCFpcy5uYShuZGVhKSwgbW1yYXRlIT1JbmYpIApgYGAKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFfQoKIyBBc3NpZ24gQ1JTICB0byB0aGUgZGF0YXNldCBmb3IgcHJvcGVyIG1hcCBwcm9qZWN0aW9uLAp1c2N0eW1tcjwtIHN0X3RyYW5zZm9ybShNTVJkYXRhLCAzMDgzKQoKIyBNYWtlIFVTIGNvdW50eSBNYXRlcm5hbCBNb3J0YWxpdHkgUmF0ZSBNYXAKVVNtbXIgPC0gdXNjdHltbXIlPiUKICBtdXRhdGUoTU1SX2dyb3VwID0gY3V0KHJtbXJhdGUsIGJyZWFrcz1xdWFudGlsZShybW1yYXRlLCBuYS5ybT1UUlVFKSwgaW5jbHVkZS5sb3dlc3Q9VCApKSU+JQogIGdncGxvdCgpKwogIGdlb21fc2YoYWVzKGZpbGw9TU1SX2dyb3VwKSkrCiAgc2NhbGVfZmlsbF9icmV3ZXIobmFtZT0iTWF0ZXJuYWwgTW9ydGFsaXR5IFJhdGUiLCBwYWxldHRlID0gIllsR24iCiAgICAgICAgICAgICAgICAgICAgKSsKICBnZ3RpdGxlKCJVUyBDb3VudGllcyBNYXRlcm5hbCBNb3J0YWxpdHkgUmF0ZSBQZXIgMTAwLDAwMCwgMjAxNS0yMDE5IikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTEwLCBoanVzdCA9IDAuMikpICsKICB0aGVtZSgKICAgICAgICBsZWdlbmQua2V5LndpZHRoID0gdW5pdCgwLjI1LCAiaW4iKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodCA9IHVuaXQoMC4yLCAiaW4iKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3IgPSBOQSkpCgojTWFrZSBtYXAgZm9yIHRoZSBTcGF0aWFsIFJlZ2ltZSAKc3BhcmVnIDwtdXNjdHltbXIgJT4lIApnZ3Bsb3QoKSsKICBnZW9tX3NmKGFlcyhmaWxsPXJ1cmFsaXR5KSkrCiAgc2NhbGVfZmlsbF9icmV3ZXIobmFtZT0iQ291bnR5IFR5cGUiLCBwYWxldHRlID0gIllsR24iCiAgICAgICAgICAgICAgICAgICAgKSsKICBnZ3RpdGxlKCJVUyBDb3VudHkgUmVnaW1lIC0gVXJiYW4gJiBSdXJhbCIpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCwgaGp1c3QgPSAwLjIpKSArCiAgdGhlbWUoCiAgICAgICAgbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoMC4yNSwgImluIiksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQgPSB1bml0KDAuMiwgImluIiksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT04KSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gTkEpKQpgYGAKCiMjIyBEZXNjcmlwdGl2ZSBNYXBzCmBgYHtyLCBlY2hvPUZBTFNFfQpncmlkLmFycmFuZ2UoVVNtbXIsc3BhcmVnLCBucm93ID0gMikKYGBgCgoKIyMjIERlZmluaW5nIE91dGNvbWUgYW5kIFByZWRpY3RvciBWYXJpYWJsZXMKVGhlIGRlcGVuZGVudCB2YXJpYWJsZSBpbiB0aGlzIGFuYWx5c2lzIGlzIG1hdGVybmFsIG1vcnRhbGl0eSByYXRlcyBpbiBVUyBjb3VudGllcy4gUHJlZGljdG9ycyBmb3IgdGhpcyBhbmFseXNpcyBpbmNsdWRlOyAKcGVyY2VudGFnZSBvZiBjb3VudHkgcG9wdWxhdGlvbiB0aGF0IGlzIHJ1cmFsOyB0aGUgbWVkaWFuIGhvdXNlaG9sZCBpbmNvbWUgaW4gdGhlIGNvdW50eTsgdGhlIGNvdW50eeKAmXMgbWVkaWFuIGhvdXNlIHZhbHVlOyB0aGUgcG9wdWxhdGlvbiBkZW5zaXR5IHBlciBzcXVhcmUgbWlsZSBpbiB0aGUgY291bnR5LiBUaGUgcGVyIGNhcGl0YWwgbnVtYmVyIG9mIE9CLUdZTiBpbiB0aGUgY291bnR5OyBnaW5pIGNvZWZmaWNpZW50IGFzIGEgcmVsYXRpdmUgbWVhc3VyZSBvZiBpbmNvbWUgaW5lcXVhbGl0eTsgcGVyY2VudGFnZSBvZiBub24gSGlzcGFuaWMgYmxhY2sgcG9wdWxhdGlvbiBpbiB0aGUgY291bnRpZXMuIEFsbCB2YXJpYWJsZXMgd2VyZSBaIHNjb3JlZCAKCmBgYHtyLHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0V9CiMgWiBzY29yZSBhbGwgdmFyaWFibGVzIAp1c2N0eW1tciRtbXJhdGV6PC1hcy5udW1lcmljKHNjYWxlKHVzY3R5bW1yJG1tcmF0ZSwgY2VudGVyPVQsIHNjYWxlPVQpKQp1c2N0eW1tciRtZWRoaW5jejwtYXMubnVtZXJpYyhzY2FsZSh1c2N0eW1tciRtZWRoaW5jLCBjZW50ZXI9VCwgc2NhbGU9VCkpCnVzY3R5bW1yJG1lZGhvdXZsejwtYXMubnVtZXJpYyhzY2FsZSh1c2N0eW1tciRtZWRob3V2bCwgY2VudGVyPVQsIHNjYWxlPVQpKQp1c2N0eW1tciRwY3RjcnBvcHo8LWFzLm51bWVyaWMoc2NhbGUodXNjdHltbXIkcGN0Y3Jwb3AsIGNlbnRlcj1ULCBzY2FsZT1UKSkKdXNjdHltbXIkcGN0cGVycG92ejwtYXMubnVtZXJpYyhzY2FsZSh1c2N0eW1tciRwY3RwZXJwb3YsIGNlbnRlcj1ULCBzY2FsZT1UKSkKdXNjdHltbXIkY3R5cG9wZGVzejwtYXMubnVtZXJpYyhzY2FsZSh1c2N0eW1tciRjdHlwb3BkZXMsIGNlbnRlcj1ULCBzY2FsZT1UKSkKdXNjdHltbXIkb2JneW4xMF9wY3o8LWFzLm51bWVyaWMoc2NhbGUodXNjdHltbXIkb2JneW4xMF9wYywgY2VudGVyPVQsIHNjYWxlPVQpKQp1c2N0eW1tciRwY3RjdHl1bmVtcHo8LWFzLm51bWVyaWMoc2NhbGUodXNjdHltbXIkcGN0Y3R5dW5lbXAsIGNlbnRlcj1ULCBzY2FsZT1UKSkKdXNjdHltbXIkcnVjY3o8LWFzLm51bWVyaWMoc2NhbGUodXNjdHltbXIkcnVjYywgY2VudGVyPVQsIHNjYWxlPVQpKQp1c2N0eW1tciRwY3RoaXNwUHIxOXo8LWFzLm51bWVyaWMoc2NhbGUodXNjdHltbXIkcGN0aGlzcFByMTksIGNlbnRlcj1ULCBzY2FsZT1UKSkKdXNjdHltbXIkcGN0bmhibGFja3ByMTl6PC1hcy5udW1lcmljKHNjYWxlKHVzY3R5bW1yJHBjdG5oYmxhY2twcjE5LCBjZW50ZXI9VCwgc2NhbGU9VCkpCnVzY3R5bW1yJHBjdG5ocHdoaXRlMTl6PC1hcy5udW1lcmljKHNjYWxlKHVzY3R5bW1yJHBjdG5ocHdoaXRlMTksIGNlbnRlcj1ULCBzY2FsZT1UKSkKdXNjdHltbXIkZ2luaXo8LWFzLm51bWVyaWMoc2NhbGUodXNjdHltbXIkZ2luaSwgY2VudGVyPVQsIHNjYWxlPVQpKQpgYGAKCiMjIyBFc3RpbWF0aW5nIExpbmVhciBSZWdyZXNzaW9uCmBgYHtyLHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0V9CiNmaXQgdGhlIE9MUyBtb2RlbCAKZml0Lm9scyA8LSBsbSggbW1yYXRleiB+cnVyYWxpdHkgKyBtZWRoaW5jeiArIG1lZGhvdXZseisgcGN0Y3Jwb3B6ICsgY3R5cG9wZGVzeiArIG9iZ3luMTBfcGN6ICsgcGN0bmhibGFja3ByMTl6K2dpbml6LAogICAgICAgICAgIGRhdGE9dXNjdHltbXIpJT4lIAogICB0YmxfcmVncmVzc2lvbiggZXhwPUZBTFNFLGxhYmVsPWxpc3QocnVyYWxpdHl+ICJSdXJhbGl0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRoaW5jen4gIk1lZGlhbiBIb3VzZWhvbGQgSW5jb21lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGhvdXZsen4iTWVkaWFuIEhvdXNlIFZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjdGNycG9weiB+ICJQZXJjZW50IG9mIFJ1cmFsIFBvcHVsYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cG9wZGVzen4gIlBvcHVsYXRpb24gRGVuc2l0eSIgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JneW4xMF9wY3ogfiJQZXIgQ2FwaXRhIE9CLUdZTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY3RuaGJsYWNrcHIxOXp+IlBlcmNlbnQgb2YgTm9uLUhpc3BhbmljIEJsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbml6fiJHaW5pIENvZWZmaWNpZW50IikpICU+JQogIAogIGFkZF9nbG9iYWxfcCgpICU+JSAKYWRkX2dsYW5jZV9zb3VyY2Vfbm90ZSgKICAgIGxhYmVsID0gbGlzdChkZiB+IkRlZ3JlZXMgb2YgRnJlZWRvbSIpLAogICAgZm10X2Z1biA9IGRmIH4gc3R5bGVfbnVtYmVyLAogICAgaW5jbHVkZSA9IGMoci5zcXVhcmVkLCBBSUMsIGFkai5yLnNxdWFyZWQsIGRmKQogICklPiUgCmJvbGRfbGFiZWxzKCklPiUgCiAgaXRhbGljaXplX2xldmVscygpJT4lIAogIGFzX2d0KCkgJT4lCiAgIyBtb2RpZnkgd2l0aCBndCBmdW5jdGlvbnMKICBndDo6dGFiX2hlYWRlcigiVGFibGUgMTogUmVncmVzc2lvbiBBbmFseXNpcyBNb2RlbGluZyBVUyBDb3VudHkgTWF0ZXJuYWwgTW9ydGFsaXR5IFJhdGVzLCAyMDE1LTIwMTkiKSAlPiUgCiAgZ3Q6OnRhYl9vcHRpb25zKAogICAgdGFibGUuZm9udC5zaXplID0gInNtYWxsIiwKICAgIGRhdGFfcm93LnBhZGRpbmcgPSBndDo6cHgoMSkpCmZpdC5vbHMKYGBgCgpVcmJhbiBhcmVhcyBoYXZlIGhpZ2hlciBtYXRlcm5hbCBtb3J0YWxpdHkgcmF0ZXMgdGhhbiBydXJhbCBhcmVhcywgYmFzZWQgb24gdGhlIGZpcnN0IGNvZWZmaWNpZW50IGluIHRoZSBtb2RlbCAgICBgciBjb2VmKGZpdC5vbHMpWzJdYC4gQ291bnR5IGNoYXJhY3RlcmlzdGljcyBhc3NvY2lhdGVkIHdpdGggaGlnaGVyIG1hdGVybmFsIG1vcnRhbGl0eSByYXRlcyBpbmNsdWRlOiBQZXJjZW50YWdlIG9mIGNvdW50eSBydXJhbCBwb3B1bGF0aW9uLCBhbmQgVGhlIGNvdW50eSBwb3B1bGF0aW9uIGRlbnNpdHkuIAoKQ291bnR5IGNoYXJhY3RlcmlzdGljcyBhc3NvY2lhdGVkIHdpdGggbG93ZXIgbWF0ZXJuYWwgbW9ydGFsaXR5IHJhdGVzIGFyZTogdGhlIG1lZGlhbiBob3VzZWhvbGQgaW5jb21lLCBwZXIgY2FwaXRhbCBudW1iZXIgb2YgT0ItR1lOIGluIHRoZSBjb3VudHkgLHByb3BvcnRpb24gb2YgdGhlIGNvdW50eSBwb3B1bGF0aW9uIHRoYXQgYXJlIG5vbi1IaXNwYW5pYyBibGFjaywgYW5kICB0aGUgY291bnR5IEdpbmkgY29lZmZpY2llbnQgLiAKCk1lZGlhbiBob3VzZSB2YWx1ZSB3YXMgbm90IHNpZ25pZmljYW50bHkgcmVsYXRlZCB0byBtYXRlcm5hbCBtb3J0YWxpdHkuIAoKIyMjIFRlc3RpbmcgZm9yIE5vbi1TdGF0aW9uYXJpdHkgCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0V9CmZpdC5hPC0gbG0oIG1tcmF0ZXogfnJ1cmFsaXR5ICsgbWVkaGluY3ogKyBtZWRob3V2bHorIHBjdGNycG9weiArIGN0eXBvcGRlc3ogKyBvYmd5bjEwX3BjeiArIHBjdG5oYmxhY2twcjE5eitnaW5peiwKICAgICAgICAgICBkYXRhPXVzY3R5bW1yKQpmaXQuYiA8LSBsbSggbW1yYXRleiB+cnVyYWxpdHkvIG1lZGhpbmN6ICsgbWVkaG91dmx6KyBwY3RjcnBvcHogKyBjdHlwb3BkZXN6ICsgb2JneW4xMF9wY3ogKyBwY3RuaGJsYWNrcHIxOXorZ2luaXosCiAgICAgICAgICAgZGF0YT11c2N0eW1tcikKIGFub3ZhKGZpdC5hLCBmaXQuYiwgdGVzdD0iRiIpICU+JSAKICB0aWR5ICgpICU+JSAKICAgcmVuYW1lKFJlcy5ERj1yZXMuZGYsCiAgICAgICAgICBSU1M9cnNzLAogICAgICAgICAgREY9ZGYsCiAgICAgICAgIFN1bVNxPXN1bXNxLAogICAgICAgICBTdGF0aXN0aWM9c3RhdGlzdGljLAogICAgICAgICBQLlZhbHVlPXAudmFsdWUpICU+JSAKICBrYmwgKGRpZ2l0ID0gMiwgY2FwdGlvbiA9ICJOb24tU3RhdGlvbmFyaXR5IFRlc3QiKSAlPiUgCiAga2FibGVfc3R5bGluZyggcG9zaXRpb24gPSAiYyIsIGZvbnRfc2l6ZSA9IDE0KSU+JSAKICBrYWJsZV9jbGFzc2ljKGZ1bGxfd2lkdGggPSBULCBodG1sX2ZvbnQgPSAiQ2FtYnJpYSIpIAoKYGBgCgoKVGhlIHRlc3QgZnJvbSBhYm92ZSBzaG93cyB0aGF0IHRoZSByZWdyZXNzaW9uIGVmZmVjdHMgYXJlIG5vdCBjb25zdGFudCBiZXR3ZWVuIHRoZSByZWdpbWVzKFJ1cmFsIGFuZCBVcmJhbikuIFRoaXMgaXMgYmVjYXVzZSB0aGUgRiB0ZXN0IGlzIHNpZ25pZmljYW50KHAtdmFsdWUgMC4wMzg1NSkuIFRoaXMgaW5kaWNhdGUgbm9uLXN0YXRpb25hcml0eSBpbiB0aGUgbW9kZWxzIAoKIyMjIFVyYmFuIE1vZGVsCmBgYHtyLHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0V9CmZpdC51PC0gbG0oIG1tcmF0ZXogfm1lZGhpbmN6ICsgbWVkaG91dmx6KyBwY3RjcnBvcHogKyBjdHlwb3BkZXN6ICsgb2JneW4xMF9wY3ogKyBwY3RuaGJsYWNrcHIxOXorZ2luaXosCiAgICAgICAgICAgZGF0YT11c2N0eW1tciwgc3Vic2V0PXJ1cmFsaXR5PT0iVXJiYW4iICklPiUgCiAgIHRibF9yZWdyZXNzaW9uKCBleHA9RkFMU0UsbGFiZWw9bGlzdChtZWRoaW5jen4gIk1lZGlhbiBIb3VzZWhvbGQgSW5jb21lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGhvdXZsen4iTWVkaWFuIEhvdXNlIFZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjdGNycG9weiB+ICJQZXJjZW50IG9mIFJ1cmFsIFBvcHVsYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cG9wZGVzen4gIlBvcHVsYXRpb24gRGVuc2l0eSIgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JneW4xMF9wY3ogfiJQZXIgQ2FwaXRhIE9CLUdZTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY3RuaGJsYWNrcHIxOXp+IlBlcmNlbnQgb2YgTm9uLUhpc3BhbmljIEJsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbml6fiJHaW5pIENvZWZmaWNpZW50IikpICU+JQogIAogIGFkZF9nbG9iYWxfcCgpICU+JSAKYWRkX2dsYW5jZV9zb3VyY2Vfbm90ZSgKICAgIGxhYmVsID0gbGlzdChkZiB+IkRlZ3JlZXMgb2YgRnJlZWRvbSIpLAogICAgZm10X2Z1biA9IGRmIH4gc3R5bGVfbnVtYmVyLAogICAgaW5jbHVkZSA9IGMoci5zcXVhcmVkLCBBSUMsIGFkai5yLnNxdWFyZWQsIGRmKQogICklPiUgCmJvbGRfbGFiZWxzKCklPiUgCiAgaXRhbGljaXplX2xldmVscygpJT4lIAogIGFzX2d0KCkgJT4lCiAgIyBtb2RpZnkgd2l0aCBndCBmdW5jdGlvbnMKICBndDo6dGFiX2hlYWRlcigiVGFibGUgMjogUmVncmVzc2lvbiBBbmFseXNpcyBNb2RlbGluZyBVcmJhbiBDb3VudHkgTWF0ZXJuYWwgTW9ydGFsaXR5IFJhdGVzLCAyMDE1LTIwMTkiKSAlPiUgCiAgZ3Q6OnRhYl9vcHRpb25zKAogICAgdGFibGUuZm9udC5zaXplID0gInNtYWxsIiwKICAgIGRhdGFfcm93LnBhZGRpbmcgPSBndDo6cHgoMSkpCmZpdC51CmBgYAoKRm9yIHRoZSBVcmJhbiBjb3VudGllcywgdGhlIG92ZXJhbGwgaW50ZXJwcmV0YXRpb24gaXMgc2ltaWxhciB0byB3aGF0IGl0IHdhcyBmb3IgdGhlIHBvb2xlZCBkYXRhLiBIb3dldmVyLCBjb21wYXJlZCB0byB0aGUgcG9vbGVkIGRhdGEgbW9kZWwsIHRoZSB1cmJhbiBkYXRhIHNob3dzIHRoYXQgdGhlIE1lZGlhbiBob3VzZSB2YWx1ZSBpcyBzaWduaWZpY2FudGx5IHJlbGF0ZWQgdG8gTWF0ZXJuYWwgbW9ydGFsaXR5LgoKQ291bnR5IGNoYXJhY3RlcmlzdGljcyBhc3NvY2lhdGVkIHdpdGggaGlnaGVyIG1hdGVybmFsICBtb3J0YWxpdHkgcmF0ZXMgaW5jbHVkZTpDb3VudHkgbWVkaWFuIGhvdXNlIHZhbHVlLCBQZXJjZW50YWdlIG9mIGNvdW50eSBydXJhbCBwb3B1bGF0aW9uLCBhbmQgdGhlIGNvdW50eSBwb3B1bGF0aW9uIGRlbnNpdHkuIAoKQ291bnR5IGNoYXJhY3RlcmlzdGljcyBhc3NvY2lhdGVkIHdpdGggbG93ZXIgbWF0ZXJuYWwgIG1vcnRhbGl0eSByYXRlcyBhcmU6IHRoZSBtZWRpYW4gaG91c2Vob2xkIGluY29tZSwgcGVyIGNhcGl0YWwgbnVtYmVyIG9mIE9CLUdZTiBpbiB0aGUgY291bnR5ICxwcm9wb3J0aW9uIG9mIHRoZSBjb3VudHkgcG9wdWxhdGlvbiB0aGF0IGFyZSBub24tSGlzcGFuaWMgYmxhY2ssIGFuZCAgdGhlIGNvdW50eSBHaW5pIGNvZWZmaWNpZW50IC4gCgojIyMgUnVyYWwgTW9kZWwKYGBge3Isd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRX0KZml0LnI8LSBsbSggbW1yYXRleiB+bWVkaGluY3ogKyBtZWRob3V2bHorIHBjdGNycG9weiArIGN0eXBvcGRlc3ogKyBvYmd5bjEwX3BjeiArIHBjdG5oYmxhY2twcjE5eitnaW5peiwKICAgICAgICAgICBkYXRhPXVzY3R5bW1yLCBzdWJzZXQ9cnVyYWxpdHk9PSJSdXJhbCIpJT4lIAogICB0YmxfcmVncmVzc2lvbiggZXhwPUZBTFNFLGxhYmVsPWxpc3QobWVkaGluY3p+ICJNZWRpYW4gSG91c2Vob2xkIEluY29tZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRob3V2bHp+Ik1lZGlhbiBIb3VzZSBWYWx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY3RjcnBvcHogfiAiUGVyY2VudCBvZiBSdXJhbCBQb3B1bGF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBvcGRlc3p+ICJQb3B1bGF0aW9uIERlbnNpdHkiICwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iZ3luMTBfcGN6IH4iUGVyIENhcGl0YSBPQi1HWU4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGN0bmhibGFja3ByMTl6fiJQZXJjZW50IG9mIE5vbi1IaXNwYW5pYyBCbGFjayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW5pen4iR2luaSBDb2VmZmljaWVudCIpKSAlPiUKICAKICBhZGRfZ2xvYmFsX3AoKSAlPiUgCmFkZF9nbGFuY2Vfc291cmNlX25vdGUoCiAgICBsYWJlbCA9IGxpc3QoZGYgfiJEZWdyZWVzIG9mIEZyZWVkb20iKSwKICAgIGZtdF9mdW4gPSBkZiB+IHN0eWxlX251bWJlciwKICAgIGluY2x1ZGUgPSBjKHIuc3F1YXJlZCwgQUlDLCBhZGouci5zcXVhcmVkLCBkZikKICApJT4lIApib2xkX2xhYmVscygpJT4lIAogIGl0YWxpY2l6ZV9sZXZlbHMoKSU+JSAKICBhc19ndCgpICU+JQogICMgbW9kaWZ5IHdpdGggZ3QgZnVuY3Rpb25zCiAgZ3Q6OnRhYl9oZWFkZXIoIlRhYmxlIDM6IFJlZ3Jlc3Npb24gQW5hbHlzaXMgTW9kZWxpbmcgUnVyYWwgQ291bnR5IE1hdGVybmFsIE1vcnRhbGl0eSBSYXRlcywgMjAxNS0yMDE5IikgJT4lIAogIGd0Ojp0YWJfb3B0aW9ucygKICAgIHRhYmxlLmZvbnQuc2l6ZSA9ICJzbWFsbCIsCiAgICBkYXRhX3Jvdy5wYWRkaW5nID0gZ3Q6OnB4KDEpKQoKZml0LnIKCmBgYApGb3IgdGhlIFJ1cmFsIGNvdW50aWVzLCB0aGUgb3ZlcmFsbCBpbnRlcnByZXRhdGlvbiBpcyBkaWZmZXJlbnQgZnJvbSB3aGF0IGl0IHdhcyBmb3IgdGhlIHBvb2xlZCBkYXRhLiBJbiBmYWN0LCBub24gb2YgdGhlIHByZWRpY3RvcnMgd2VyZSBzaWduaWZpY2FudGx5IGFzc29jaWF0ZWQgd2l0aCBtYXRlcm5hbCBtb3J0YWxpdHkgcmF0ZXMu