Combined Data
loan01 = read.csv("https://raw.githubusercontent.com/TylerBattaglini/STA-321/refs/heads/main/w06-SBAnational01.csv", header = TRUE)[, -1]
loan02 = read.csv("https://raw.githubusercontent.com/TylerBattaglini/STA-321/refs/heads/main/w06-SBAnational02.csv", header = TRUE)[, -1]
loan03 = read.csv("https://raw.githubusercontent.com/TylerBattaglini/STA-321/refs/heads/main/w06-SBAnational03.csv", header = TRUE)[, -1]
loan04 = read.csv("https://raw.githubusercontent.com/TylerBattaglini/STA-321/refs/heads/main/w06-SBAnational04.csv", header = TRUE)[, -1]
loan05 = read.csv("https://raw.githubusercontent.com/TylerBattaglini/STA-321/refs/heads/main/w06-SBAnational05.csv", header = TRUE)[, -1]
loan06 = read.csv("https://raw.githubusercontent.com/TylerBattaglini/STA-321/refs/heads/main/w06-SBAnational06.csv", header = TRUE)[, -1]
loan07 = read.csv("https://raw.githubusercontent.com/TylerBattaglini/STA-321/refs/heads/main/w06-SBAnational07.csv", header = TRUE)[, -1]
loan08 = read.csv("https://raw.githubusercontent.com/TylerBattaglini/STA-321/refs/heads/main/w06-SBAnational08.csv", header = TRUE)[, -1]
loan09 = read.csv("https://raw.githubusercontent.com/TylerBattaglini/STA-321/refs/heads/main/w06-SBAnational09.csv", header = TRUE)[, -1]
loan = rbind(loan01, loan02, loan03, loan04, loan05, loan06, loan07, loan08, loan09)
# dim(bankLoan)
#names(bankLoan)
Mis_Status Missing
loan <- loan[!is.na(loan$MIS_Status), ]
Mis_Status is the status of the persons loan. This is one of the most
important variables in our dataset. It ensures us that when we do our
analysis we have a complete observation telling us if the loan was
approved, paid, or defaulted. So we remove any observations with loan
status missing for clarity.
Convert Variables
currency_vars <- c("DisbursementGross", "BalanceGross", "ChgOffPrinGr", "GrAppv", "SBA_Appv")
loan[currency_vars] <- lapply(loan[currency_vars], function(x) as.numeric(gsub("[$,]", "", x)))
Since DisbursementGross, BalanceGross, ChgOffPrinGr, GrAppv, and
SBA_Appv are important measures for our analysis we want to be able to
use them more methodically. So we convert these categorical variables to
numeric variables and remove any character values. Working with numbers
as opposed to charterers is better for statistical analysis,
visualization, and overall modeling. ## Categorical Variable rework
loan <- loan %>%
mutate(BankRegion = case_when(
BankState %in% c("CT", "ME", "MA", "NH", "NJ", "NY", "PA", "RI", "VT") ~ "Northeast",
BankState %in% c("IL", "IN", "IA", "KS", "MI", "MN", "MO", "NE", "ND", "OH", "SD", "WI") ~ "Midwest",
BankState %in% c("AL", "AR", "DE", "DC", "FL", "GA", "KY", "LA", "MD", "MS", "NC", "OK", "SC", "TN", "TX", "VA", "WV") ~ "South",
BankState %in% c("AK", "AZ", "CA", "CO", "HI", "ID", "MT", "NV", "NM", "OR", "UT", "WA", "WY") ~ "West",
TRUE ~ "Unknown"
))
table(loan$BankRegion)
Midwest Northeast South Unknown West
269885 150560 275751 1730 201238
I decided to make 4 regional categories of the states. These
categories being Northeast, Midwest, South, West and also an unknown. By
doing this we can see if there are any patterns for any specific region.
We can use this to compare approval rates, default rates, or average
loan amounts by region. This also makes it easier for data visualization
to again see if there is any disparities by region.
Default Rates based on
Region
default_rates <- loan %>%
group_by(BankRegion) %>%
summarise(
Total_Loans = n(),
Defaults = sum(MIS_Status == "CHGOFF", na.rm = TRUE),
Default_Rate = Defaults / Total_Loans * 100
)
print(default_rates)
# A tibble: 5 × 4
BankRegion Total_Loans Defaults Default_Rate
<chr> <int> <int> <dbl>
1 Midwest 269885 42537 15.8
2 Northeast 150560 21021 14.0
3 South 275751 58751 21.3
4 Unknown 1730 106 6.13
5 West 201238 35143 17.5
This code calculates the default rate of SBA-backed loans for each
region. With this code it helps us to compare which regions have higher
or lower default rates. It also gives insight into regional economic
trends and lending practices. We see that in the South the default rate
is the highest at 21% meaning that more loans go unpaid here than in any
other region.
Discretize GrApprv
loan <- loan %>%
mutate(GrAppv_Cat = cut(GrAppv,
breaks = quantile(GrAppv, probs = seq(0, 1, by = 0.2), na.rm = TRUE),
include.lowest = TRUE,
labels = c("Very Low", "Low", "Medium", "High", "Very High")))
table(loan$GrAppv_Cat)
Very Low Low Medium High Very High
180997 179102 179575 179677 179813
In the code above we categorize the SBA guaranteed approval amount
into five groups. By categorizing and making this variable into small
intervals we convert it from a continuous variable we now have a
discretized variable. Discretized variables are easier to interpret. We
see from the output above that they are evenly distributed meaning our
approval spans a wide range of amounts.
SBA_Appr Curves
ggplot(loan, aes(x = SBA_Appv, fill = GrAppv_Cat, color = GrAppv_Cat)) +
geom_density(alpha = 0.3) +
labs(title = "Density Curves of SBA Approval Amount by Loan Size",
x = "SBA Approval Amount (SBA_Appv)",
y = "Density") +
theme_minimal() +
theme(legend.title = element_blank()) +
coord_cartesian(xlim = c(0, 500000))

The code above shows a density plot of the distribution of SBA
approval amounts, categorized by loan size. From the visualization above
we can see which loan sizes are most common and helps us see if certain
loan categories are higher. The density peaks tell us where most SBA
approval amounts fall.
LS0tDQp0aXRsZTogIkVEQSBCYW5rIExvYW4iDQphdXRob3I6ICdUeWxlciBCYXR0YWdsaW5pJw0KZGF0ZTogIjIwMjUtMy0yIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgZmlnX3dpZHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgdGhlbWU6IGx1bWVuDQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZmlnX3dpZHRoOiAzDQogICAgZmlnX2hlaWdodDogMw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQphbHdheXNfYWxsb3dfaHRtbDogdHJ1ZQ0KLS0tDQoNCmBgYHs9aHRtbH0NCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KLyogQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cyAoQ1NTKSBpcyBhIHN0eWxlc2hlZXQgbGFuZ3VhZ2UgdXNlZCB0byBkZXNjcmliZSB0aGUgcHJlc2VudGF0aW9uIG9mIGEgZG9jdW1lbnQgd3JpdHRlbiBpbiBIVE1MIG9yIFhNTC4gaXQgaXMgYSBzaW1wbGUgbWVjaGFuaXNtIGZvciBhZGRpbmcgc3R5bGUgKGUuZy4sIGZvbnRzLCBjb2xvcnMsIHNwYWNpbmcpIHRvIFdlYiBkb2N1bWVudHMuICovDQoNCmgxLnRpdGxlIHsgIC8qIFRpdGxlIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiB0aGUgcmVwb3J0IHRpdGxlICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgYXV0aG9ycyAgKi8NCiAgZm9udC1zaXplOiAyMHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmg0LmRhdGUgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSBkYXRlICAqLw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgxIHsgLyogSGVhZGVyIDEgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBsZXZlbCAxIHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAyMnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCmgyIHsgLyogSGVhZGVyIDIgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBsZXZlbCAyIHNlY3Rpb24gdGl0bGUgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgbGV2ZWwgMyBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiBsZXZlbCA0IHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCjwvc3R5bGU+DQpgYGANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQojIERldGVjdCwgaW5zdGFsbCBhbmQgbG9hZCBwYWNrYWdlcyBpZiBuZWVkZWQuDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikNCiAgIGxpYnJhcnkoa25pdHIpDQp9DQppZiAoIXJlcXVpcmUoIk1BU1MiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiTUFTUyIpDQogICBsaWJyYXJ5KE1BU1MpDQp9DQppZiAoIXJlcXVpcmUoIm5sZXFzbHYiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygibmxlcXNsdiIpDQogICBsaWJyYXJ5KG5sZXFzbHYpDQp9DQojDQppZiAoIXJlcXVpcmUoInBhbmRlciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwYW5kZXIiKQ0KICAgbGlicmFyeShwYW5kZXIpDQp9DQoNCmlmICghcmVxdWlyZSgicHN5Y2giKSkgeyAgIA0KICBpbnN0YWxsLnBhY2thZ2VzKCJwc3ljaCIpDQogICBsaWJyYXJ5KHBzeWNoKQ0KfQ0KaWYgKCFyZXF1aXJlKCJNQVNTIikpIHsgICANCiAgaW5zdGFsbC5wYWNrYWdlcygiTUFTUyIpDQogICBsaWJyYXJ5KE1BU1MpDQp9DQppZiAoIXJlcXVpcmUoImdncGxvdDIiKSkgeyAgIA0KICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCiAgIGxpYnJhcnkoZ2dwbG90MikNCn0NCmlmICghcmVxdWlyZSgiR0dhbGx5IikpIHsgICANCiAgaW5zdGFsbC5wYWNrYWdlcygiR0dhbGx5IikNCiAgIGxpYnJhcnkoR0dhbGx5KQ0KfQ0KaWYgKCFyZXF1aXJlKCJjYXIiKSkgeyAgIA0KICBpbnN0YWxsLnBhY2thZ2VzKCJjYXIiKQ0KICAgbGlicmFyeShjYXIpDQp9DQppZiAoIXJlcXVpcmUoImRwbHlyIikpIHsgICANCiAgaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQ0KICAgbGlicmFyeShkcGx5cikNCn0NCmlmICghcmVxdWlyZSgiY2FyZXQiKSkgeyAgIA0KICBpbnN0YWxsLnBhY2thZ2VzKCJjYXJldCIpDQogICBsaWJyYXJ5KGNhcmV0KQ0KfQ0KaWYgKCFyZXF1aXJlKCJyZWFkeGwiKSkgeyAgIA0KICBpbnN0YWxsLnBhY2thZ2VzKCJyZWFkeGwiKQ0KICAgbGlicmFyeShyZWFkeGwpDQp9DQppZiAoIXJlcXVpcmUoIm9wZW54bHN4IikpIHsgICANCiAgaW5zdGFsbC5wYWNrYWdlcygib3Blbnhsc3giKQ0KICAgbGlicmFyeShvcGVueGxzeCkNCn0NCmlmICghcmVxdWlyZSgiZm9yZWNhc3QiKSkgeyAgIA0KICBpbnN0YWxsLnBhY2thZ2VzKCJmb3JlY2FzdCIpDQogICBsaWJyYXJ5KGZvcmVjYXN0KQ0KfQ0KIyBzcGVjaWZpY2F0aW9ucyBvZiBvdXRwdXRzIG9mIGNvZGUgaW4gY29kZSBjaHVua3MNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncyA9IEZBTFNFLCAgIyBzb21ldGltZXMsIHlvdSBjb2RlIG1heSBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUgd2FybmluZyBtZXNzYWdlcyBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMgPSBGQUxTRSwgICMNCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkEgICAgICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW4gdGhlIG91dHB1dCBmaWxlLg0KICAgICAgICAgICAgICAgICAgICAgICkgICANCmBgYA0KDQoNCiMjIENvbWJpbmVkIERhdGENCg0KYGBge3J9DQpsb2FuMDEgPSByZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1R5bGVyQmF0dGFnbGluaS9TVEEtMzIxL3JlZnMvaGVhZHMvbWFpbi93MDYtU0JBbmF0aW9uYWwwMS5jc3YiLCBoZWFkZXIgPSBUUlVFKVssIC0xXQ0KbG9hbjAyID0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9UeWxlckJhdHRhZ2xpbmkvU1RBLTMyMS9yZWZzL2hlYWRzL21haW4vdzA2LVNCQW5hdGlvbmFsMDIuY3N2IiwgaGVhZGVyID0gVFJVRSlbLCAtMV0NCmxvYW4wMyA9IHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vVHlsZXJCYXR0YWdsaW5pL1NUQS0zMjEvcmVmcy9oZWFkcy9tYWluL3cwNi1TQkFuYXRpb25hbDAzLmNzdiIsIGhlYWRlciA9IFRSVUUpWywgLTFdDQpsb2FuMDQgPSByZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1R5bGVyQmF0dGFnbGluaS9TVEEtMzIxL3JlZnMvaGVhZHMvbWFpbi93MDYtU0JBbmF0aW9uYWwwNC5jc3YiLCBoZWFkZXIgPSBUUlVFKVssIC0xXQ0KbG9hbjA1ID0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9UeWxlckJhdHRhZ2xpbmkvU1RBLTMyMS9yZWZzL2hlYWRzL21haW4vdzA2LVNCQW5hdGlvbmFsMDUuY3N2IiwgaGVhZGVyID0gVFJVRSlbLCAtMV0NCmxvYW4wNiA9IHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vVHlsZXJCYXR0YWdsaW5pL1NUQS0zMjEvcmVmcy9oZWFkcy9tYWluL3cwNi1TQkFuYXRpb25hbDA2LmNzdiIsIGhlYWRlciA9IFRSVUUpWywgLTFdDQpsb2FuMDcgPSByZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1R5bGVyQmF0dGFnbGluaS9TVEEtMzIxL3JlZnMvaGVhZHMvbWFpbi93MDYtU0JBbmF0aW9uYWwwNy5jc3YiLCBoZWFkZXIgPSBUUlVFKVssIC0xXQ0KbG9hbjA4ID0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9UeWxlckJhdHRhZ2xpbmkvU1RBLTMyMS9yZWZzL2hlYWRzL21haW4vdzA2LVNCQW5hdGlvbmFsMDguY3N2IiwgaGVhZGVyID0gVFJVRSlbLCAtMV0NCmxvYW4wOSA9IHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vVHlsZXJCYXR0YWdsaW5pL1NUQS0zMjEvcmVmcy9oZWFkcy9tYWluL3cwNi1TQkFuYXRpb25hbDA5LmNzdiIsIGhlYWRlciA9IFRSVUUpWywgLTFdDQpsb2FuID0gcmJpbmQobG9hbjAxLCBsb2FuMDIsIGxvYW4wMywgbG9hbjA0LCBsb2FuMDUsIGxvYW4wNiwgbG9hbjA3LCBsb2FuMDgsIGxvYW4wOSkNCiMgZGltKGJhbmtMb2FuKQ0KI25hbWVzKGJhbmtMb2FuKQ0KDQoNCg0KYGBgDQoNCiMjIE1pc19TdGF0dXMgTWlzc2luZw0KDQpgYGB7cn0NCmxvYW4gPC0gbG9hblshaXMubmEobG9hbiRNSVNfU3RhdHVzKSwgXQ0KDQpgYGANCg0KTWlzX1N0YXR1cyBpcyB0aGUgc3RhdHVzIG9mIHRoZSBwZXJzb25zIGxvYW4uIFRoaXMgaXMgb25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCB2YXJpYWJsZXMgaW4gb3VyIGRhdGFzZXQuIEl0IGVuc3VyZXMgdXMgdGhhdCB3aGVuIHdlIGRvIG91ciBhbmFseXNpcyB3ZSBoYXZlIGEgY29tcGxldGUgb2JzZXJ2YXRpb24gdGVsbGluZyB1cyBpZiB0aGUgbG9hbiB3YXMgYXBwcm92ZWQsIHBhaWQsIG9yIGRlZmF1bHRlZC4gU28gd2UgcmVtb3ZlIGFueSBvYnNlcnZhdGlvbnMgd2l0aCBsb2FuIHN0YXR1cyBtaXNzaW5nIGZvciBjbGFyaXR5Lg0KDQojIyBDb252ZXJ0IFZhcmlhYmxlcw0KDQpgYGB7cn0NCmN1cnJlbmN5X3ZhcnMgPC0gYygiRGlzYnVyc2VtZW50R3Jvc3MiLCAiQmFsYW5jZUdyb3NzIiwgIkNoZ09mZlByaW5HciIsICJHckFwcHYiLCAiU0JBX0FwcHYiKQ0KDQpsb2FuW2N1cnJlbmN5X3ZhcnNdIDwtIGxhcHBseShsb2FuW2N1cnJlbmN5X3ZhcnNdLCBmdW5jdGlvbih4KSBhcy5udW1lcmljKGdzdWIoIlskLF0iLCAiIiwgeCkpKQ0KDQpgYGANCg0KU2luY2UgRGlzYnVyc2VtZW50R3Jvc3MsIEJhbGFuY2VHcm9zcywgQ2hnT2ZmUHJpbkdyLCBHckFwcHYsIGFuZCBTQkFfQXBwdiBhcmUgaW1wb3J0YW50IG1lYXN1cmVzIGZvciBvdXIgYW5hbHlzaXMgd2Ugd2FudCB0byBiZSBhYmxlIHRvIHVzZSB0aGVtIG1vcmUgbWV0aG9kaWNhbGx5LiBTbyB3ZSBjb252ZXJ0IHRoZXNlIGNhdGVnb3JpY2FsIHZhcmlhYmxlcyB0byBudW1lcmljIHZhcmlhYmxlcyBhbmQgcmVtb3ZlIGFueSBjaGFyYWN0ZXIgdmFsdWVzLiBXb3JraW5nIHdpdGggbnVtYmVycyBhcyBvcHBvc2VkIHRvIGNoYXJ0ZXJlcnMgaXMgYmV0dGVyIGZvciBzdGF0aXN0aWNhbCBhbmFseXNpcywgdmlzdWFsaXphdGlvbiwgYW5kIG92ZXJhbGwgbW9kZWxpbmcuDQojIyBDYXRlZ29yaWNhbCBWYXJpYWJsZSByZXdvcmsNCg0KYGBge3J9DQpsb2FuIDwtIGxvYW4gJT4lDQogIG11dGF0ZShCYW5rUmVnaW9uID0gY2FzZV93aGVuKA0KICAgIEJhbmtTdGF0ZSAlaW4lIGMoIkNUIiwgIk1FIiwgIk1BIiwgIk5IIiwgIk5KIiwgIk5ZIiwgIlBBIiwgIlJJIiwgIlZUIikgfiAiTm9ydGhlYXN0IiwNCiAgICBCYW5rU3RhdGUgJWluJSBjKCJJTCIsICJJTiIsICJJQSIsICJLUyIsICJNSSIsICJNTiIsICJNTyIsICJORSIsICJORCIsICJPSCIsICJTRCIsICJXSSIpIH4gIk1pZHdlc3QiLA0KICAgIEJhbmtTdGF0ZSAlaW4lIGMoIkFMIiwgIkFSIiwgIkRFIiwgIkRDIiwgIkZMIiwgIkdBIiwgIktZIiwgIkxBIiwgIk1EIiwgIk1TIiwgIk5DIiwgIk9LIiwgIlNDIiwgIlROIiwgIlRYIiwgIlZBIiwgIldWIikgfiAiU291dGgiLA0KICAgIEJhbmtTdGF0ZSAlaW4lIGMoIkFLIiwgIkFaIiwgIkNBIiwgIkNPIiwgIkhJIiwgIklEIiwgIk1UIiwgIk5WIiwgIk5NIiwgIk9SIiwgIlVUIiwgIldBIiwgIldZIikgfiAiV2VzdCIsDQogICAgVFJVRSB+ICJVbmtub3duIg0KICApKQ0KDQp0YWJsZShsb2FuJEJhbmtSZWdpb24pDQpgYGANCg0KSSBkZWNpZGVkIHRvIG1ha2UgNCByZWdpb25hbCBjYXRlZ29yaWVzIG9mIHRoZSBzdGF0ZXMuIFRoZXNlIGNhdGVnb3JpZXMgYmVpbmcgTm9ydGhlYXN0LCBNaWR3ZXN0LCBTb3V0aCwgV2VzdCBhbmQgYWxzbyBhbiB1bmtub3duLiBCeSBkb2luZyB0aGlzIHdlIGNhbiBzZWUgaWYgdGhlcmUgYXJlIGFueSBwYXR0ZXJucyBmb3IgYW55IHNwZWNpZmljIHJlZ2lvbi4gV2UgY2FuIHVzZSB0aGlzIHRvIGNvbXBhcmUgYXBwcm92YWwgcmF0ZXMsIGRlZmF1bHQgcmF0ZXMsIG9yIGF2ZXJhZ2UgbG9hbiBhbW91bnRzIGJ5IHJlZ2lvbi4gVGhpcyBhbHNvIG1ha2VzIGl0IGVhc2llciBmb3IgZGF0YSB2aXN1YWxpemF0aW9uIHRvIGFnYWluIHNlZSBpZiB0aGVyZSBpcyBhbnkgZGlzcGFyaXRpZXMgYnkgcmVnaW9uLiANCg0KIyMgRGVmYXVsdCBSYXRlcyBiYXNlZCBvbiBSZWdpb24NCg0KYGBge3J9DQpkZWZhdWx0X3JhdGVzIDwtIGxvYW4gJT4lDQogIGdyb3VwX2J5KEJhbmtSZWdpb24pICU+JQ0KICBzdW1tYXJpc2UoDQogICAgVG90YWxfTG9hbnMgPSBuKCksDQogICAgRGVmYXVsdHMgPSBzdW0oTUlTX1N0YXR1cyA9PSAiQ0hHT0ZGIiwgbmEucm0gPSBUUlVFKSwNCiAgICBEZWZhdWx0X1JhdGUgPSBEZWZhdWx0cyAvIFRvdGFsX0xvYW5zICogMTAwDQogICkNCg0KcHJpbnQoZGVmYXVsdF9yYXRlcykNCmBgYA0KDQpUaGlzIGNvZGUgY2FsY3VsYXRlcyB0aGUgZGVmYXVsdCByYXRlIG9mIFNCQS1iYWNrZWQgbG9hbnMgZm9yIGVhY2ggcmVnaW9uLiBXaXRoIHRoaXMgY29kZSBpdCBoZWxwcyB1cyB0byBjb21wYXJlIHdoaWNoIHJlZ2lvbnMgaGF2ZSBoaWdoZXIgb3IgbG93ZXIgZGVmYXVsdCByYXRlcy4gSXQgYWxzbyBnaXZlcyBpbnNpZ2h0IGludG8gcmVnaW9uYWwgZWNvbm9taWMgdHJlbmRzIGFuZCBsZW5kaW5nIHByYWN0aWNlcy4gV2Ugc2VlIHRoYXQgaW4gdGhlIFNvdXRoIHRoZSBkZWZhdWx0IHJhdGUgaXMgdGhlIGhpZ2hlc3QgYXQgMjElIG1lYW5pbmcgdGhhdCBtb3JlIGxvYW5zIGdvIHVucGFpZCBoZXJlIHRoYW4gaW4gYW55IG90aGVyIHJlZ2lvbi4gDQoNCiMjIERpc2NyZXRpemUgR3JBcHBydg0KDQpgYGB7cn0NCmxvYW4gPC0gbG9hbiAlPiUNCiAgbXV0YXRlKEdyQXBwdl9DYXQgPSBjdXQoR3JBcHB2LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gcXVhbnRpbGUoR3JBcHB2LCBwcm9icyA9IHNlcSgwLCAxLCBieSA9IDAuMiksIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUubG93ZXN0ID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiVmVyeSBMb3ciLCAiTG93IiwgIk1lZGl1bSIsICJIaWdoIiwgIlZlcnkgSGlnaCIpKSkNCg0KdGFibGUobG9hbiRHckFwcHZfQ2F0KQ0KYGBgDQoNCkluIHRoZSBjb2RlIGFib3ZlIHdlIGNhdGVnb3JpemUgdGhlIFNCQSBndWFyYW50ZWVkIGFwcHJvdmFsIGFtb3VudCBpbnRvIGZpdmUgZ3JvdXBzLiBCeSBjYXRlZ29yaXppbmcgYW5kIG1ha2luZyB0aGlzIHZhcmlhYmxlIGludG8gc21hbGwgaW50ZXJ2YWxzIHdlIGNvbnZlcnQgaXQgZnJvbSBhIGNvbnRpbnVvdXMgdmFyaWFibGUgd2Ugbm93IGhhdmUgYSBkaXNjcmV0aXplZCB2YXJpYWJsZS4gRGlzY3JldGl6ZWQgdmFyaWFibGVzIGFyZSBlYXNpZXIgdG8gaW50ZXJwcmV0LiBXZSBzZWUgZnJvbSB0aGUgb3V0cHV0IGFib3ZlIHRoYXQgdGhleSBhcmUgZXZlbmx5IGRpc3RyaWJ1dGVkIG1lYW5pbmcgb3VyIGFwcHJvdmFsIHNwYW5zIGEgd2lkZSByYW5nZSBvZiBhbW91bnRzLiANCg0KIyMgU0JBX0FwcHIgQ3VydmVzDQoNCmBgYHtyfQ0KZ2dwbG90KGxvYW4sIGFlcyh4ID0gU0JBX0FwcHYsIGZpbGwgPSBHckFwcHZfQ2F0LCBjb2xvciA9IEdyQXBwdl9DYXQpKSArDQogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuMykgKyANCiAgbGFicyh0aXRsZSA9ICJEZW5zaXR5IEN1cnZlcyBvZiBTQkEgQXBwcm92YWwgQW1vdW50IGJ5IExvYW4gU2l6ZSIsDQogICAgICAgeCA9ICJTQkEgQXBwcm92YWwgQW1vdW50IChTQkFfQXBwdikiLCANCiAgICAgICB5ID0gIkRlbnNpdHkiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKyAgDQogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCA1MDAwMDApKQ0KYGBgDQoNClRoZSBjb2RlIGFib3ZlIHNob3dzIGEgZGVuc2l0eSBwbG90IG9mIHRoZSBkaXN0cmlidXRpb24gb2YgU0JBIGFwcHJvdmFsIGFtb3VudHMsIGNhdGVnb3JpemVkIGJ5IGxvYW4gc2l6ZS4gRnJvbSB0aGUgdmlzdWFsaXphdGlvbiBhYm92ZSB3ZSBjYW4gc2VlIHdoaWNoIGxvYW4gc2l6ZXMgYXJlIG1vc3QgY29tbW9uIGFuZCBoZWxwcyB1cyBzZWUgaWYgY2VydGFpbiBsb2FuIGNhdGVnb3JpZXMgYXJlIGhpZ2hlci4gVGhlIGRlbnNpdHkgcGVha3MgdGVsbCB1cyB3aGVyZSBtb3N0IFNCQSBhcHByb3ZhbCBhbW91bnRzIGZhbGwuIA0KDQoNCg0KDQoNCg0K