Created by Riley Kearney. Updated 12/8/2024

Thesis

Counties that have higher bachelor degree rates tend to have higher science proficiency scores.

Data

The data used this project includes unemployment demographics, county revenues and spending, and proficiency scores for various counties. These data sets were provided by Professor Garrett. Additionally, I incorporated median family income, region data for each county, bachelor degree rate, poverty rate, population rate for under 18 year olds, and foreign population of each county.

Key Variables Included:

Methods

Correlations

Above is a correlation graph for me to see the different correlations between the variables in my data set.

Linear Regression


Call:
lm(formula = proficiency ~ med_income + bachelors_pop + poverty_rate + 
    under_18_rate, data = numeric_data)

Residuals:
    Min      1Q  Median      3Q     Max 
-7.9331 -2.8643 -0.1598  2.8148  8.8230 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)  
(Intercept)    1.889e+01  8.074e+00   2.340   0.0233 *
med_income     1.238e-04  9.788e-05   1.265   0.2119  
bachelors_pop  3.041e-01  1.308e-01   2.326   0.0241 *
poverty_rate  -1.279e-01  2.136e-01  -0.599   0.5522  
under_18_rate -2.983e-01  3.410e-01  -0.875   0.3858  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.24 on 50 degrees of freedom
Multiple R-squared:  0.5082,    Adjusted R-squared:  0.4688 
F-statistic: 12.92 on 4 and 50 DF,  p-value: 2.704e-07

The regression model above shows that there is a positive correlation between median family income and population of people with their bachelors degree with proficiency scores. There is a negative correlation with poverty rate and population of people under the age of 18 with proficiency scores. The overall model has a 0.47 adjusted R-squared which I’m happy with considering a good R-squared is 0.5 and greater. The p-value is also a good number because it is under 0.05. Bachelors population is a significant predictor when predicting proficiency for all grades.

K-means

The visualization above shows counties grouped based on demographics as median family income, bachelor degree rate, poverty rate, proficiency, and population of children (18 and younger). The clusters reveal patterns where counties with higher bachelor degree rates tend to have higher proficiency scores. The red cluster shows counties that may be economically disadvantaged with lower educational attainment, the green cluster represents counties that have higher educational attainment and outcomes, and the blue cluster represents the counties that fall in a middle of the two extremes.

Decision Tree

The decision tree above predicts proficiency based on the key demographic variables I’ve been working with throughout this project. This visualization shows once again that the bachelors degree rate in each county has a significant impact on proficiency scores, because in this decision tree it is the first and most important split. As well as the population of children in each county has an impact on proficiency scores as well. Overall the tree shows how education levels and socioeconomic factors play a role in children’s proficiency scores.

Neural Network

The visualization above represents the structure of the neural network, which predicts proficiency scores based on inputs like median income, bachelor degree rates, poverty rates, and population rate of 18 and younger. The error value is 0.010113 which indicates that the network has learned the relationships effectively capturing complex patterns.

When looking at the actual and predicted proficiency generated by the neural network, the plot shows that the model captures general trends, as many points are close to the red line. However there is still noticeable variability, indicating that the predictions are not perfectly accurate. This suggests the model performs reasonably well but may require further refinement to improve accuracy.

Prediction

Based on all my visualizations, I’ve come to the prediction that percentage of people with bachelor degrees and poverty rates in a county. Counties with higher bachelor’s degree attainment tend to have higher proficiency scores, while those with higher poverty rates generally see lower proficiency. The decision tree and k-means clustering show distinct groups based on these patterns, highlighting the importance of these socioeconomic variables. The neural network predictions align with these trends as well, with little variability. Overall, if I was presenting this to a school board I would recommend to encourage furthing education after k-12 to their students, so that in the future those proficiency scores will increase.

Limitations

One limitation of this project is that it does not provide immediate solutions for improving proficiency scores, as factors identified, such as bachelor’s degree attainment and poverty, require long term efforts to address. Additionally, only including socioeconimic variables and leaving out funding or school resources data could have potentially skewed the predictions. In the future, I would expand the data to included funding variables as well to try to improve the model’s accuracy and provide more insight.

Resources

Sources Included:

LS0tCnRpdGxlOiAiUHJvamVjdCAzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCkNyZWF0ZWQgYnkgUmlsZXkgS2Vhcm5leS4gVXBkYXRlZCAxMi84LzIwMjQKCiMjIyBUaGVzaXMgCkNvdW50aWVzIHRoYXQgaGF2ZSBoaWdoZXIgYmFjaGVsb3IgZGVncmVlIHJhdGVzIHRlbmQgdG8gaGF2ZSBoaWdoZXIgc2NpZW5jZSBwcm9maWNpZW5jeSBzY29yZXMuIAoKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShjYXJldCkKbGlicmFyeShycGFydCkKbGlicmFyeShyZWFkeGwpCmFzc2Vzc21lbnRfcGF0aCA8LSAnLi93diBlZCBzdHVkZW50IGFjaGlldmVtZW50L0hpc3RvcmljYWxfQXNzZXNzbWVudFJlc3VsdHNfU1kxNS10by1TWTIxLnhsc3gnCgoKdF9hc3Nlc3NfcmF3X3NjaG9vbCA8LSByZWFkX2V4Y2VsKHBhdGggPSBhc3Nlc3NtZW50X3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gJ1NZMjEgU2Nob29sICYgRGlzdHJpY3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9ICdiMjpmNzMxMicpCgoKdF9hc3Nlc3NfcmF3X3NjaWVuY2UgPC0gcmVhZF9leGNlbChwYXRoID0gYXNzZXNzbWVudF9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVldCA9ICdTWTIxIFNjaG9vbCAmIERpc3RyaWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSAnZGIzOmRiNzMxMicsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfbmFtZXMgPSBjKCdzY2llbmNlX3Byb2ZpY2llbmN5JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hID0gJyoqJykKCnRfYXNzZXNzX3JhdyA8LSB0X2Fzc2Vzc19yYXdfc2Nob29sICU+JQogIGJpbmRfY29scyh0X2Fzc2Vzc19yYXdfc2NpZW5jZSkgJT4lIAogIGphbml0b3I6OmNsZWFuX25hbWVzKCkgIAoKCiMgUmVtb3ZlIHN1Ymdyb3Vwcwp0X2Fzc2VzcyA8LSB0X2Fzc2Vzc19yYXcgJT4lIAogIGZpbHRlcihzY2hvb2wgPT0gOTk5KSAlPiUgCiAgZmlsdGVyKHBvcHVsYXRpb25fZ3JvdXAgPT0gJ1RvdGFsIFBvcHVsYXRpb24nKSAlPiUgCiAgZmlsdGVyKGNvdW50eSAhPSAnU3RhdGV3aWRlJykgJT4lIAogIG11dGF0ZShwcm9maWNpZW5jeSA9IHNjaWVuY2VfcHJvZmljaWVuY3kpICAKCiMgQWRkIHJlZ2lvbnMKcmVnaW9ucyA8LSByZWFkX2Nzdignd3ZfcmVnaW9ucy5jc3YnKQp0X2Fzc2VzcyA8LSBsZWZ0X2pvaW4odF9hc3Nlc3MsIHJlZ2lvbnMsIGJ5ID0gJ2NvdW50eScpCgojIEFzc2lnbiBudW1iZXIgdG8gZWFjaCByZWdpb24KdF9hc3Nlc3MgPC0gdF9hc3Nlc3MgJT4lIAogIG11dGF0ZShyZWdpb25fbnVtYmVyID0gYXMubnVtZXJpYyhmYWN0b3IocmVnaW9uKSkpCgpwcmludCh0X2Fzc2VzcykKYGBgCgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CnNwZW5kaW5nX3BhdGggPC0gJy4vdXMgY2Vuc3VzIGVkIHNwZW5kaW5nL2Vsc2VjMjJ0LnhscycKCnRfc3BlbmRpbmdfcmF3IDwtIHJlYWRfZXhjZWwocGF0aCA9IHNwZW5kaW5nX3BhdGgsLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVldCA9ICdlbHNlYzIydCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gJ2ExOmdiMTQxMDYnKSAlPiUgCiAgamFuaXRvcjo6Y2xlYW5fbmFtZXMoKQoKCmNvb3BlcmF0ZXMgPC0gYygnTU9VTlRBSU4gU1RBVEUgRURVQ0FUSU9OQUwgU0VSVklDRVMgQ09PUEVSQVRJVkUnLAogICAgICAgICAgICAgICAgJ0VBU1RFUk4gUEFOSEFORExFIElOU1RSVUNUSU9OQUwgQ09PUEVSQVRJVkUnLAogICAgICAgICAgICAgICAgJ1NPVVRIRVJOIEVEVUNBVElPTkFMIFNFUlZJQ0VTIENPT1BFUkFUSVZFJykKCnRfc3BlbmRpbmcgPC0gdF9zcGVuZGluZ19yYXcgJT4lIAogIGZpbHRlcihzdGF0ZSA9PSA0OSkgJT4lIAogIGZpbHRlcighbmFtZSAlaW4lIGNvb3BlcmF0ZXMpICU+JSAKICBzZWxlY3QobmFtZSwgZW5yb2xsLCB0ZmVkcmV2LCB0c3RyZXYsIHRsb2NyZXYsIHRvdGFsZXhwLCBwcGNzdG90KSAlPiUgCiAgbXV0YXRlKGNvdW50eSA9IHN0cl90b190aXRsZShzdHJfc3BsaXRfaShuYW1lLCAnICcsMSkpLAogICAgICAgICBjb3VudHkgPSBpZmVsc2UoY291bnR5ID09ICdNYycsICdNY0Rvd2VsbCcsIGNvdW50eSkpCgoKcHJpbnQodF9zcGVuZGluZykKYGBgCgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CgogIAoKdF91bmVtcGxveWVkX3JhdyA8LSByZWFkX2NzdignLi9kZW1vZ3JhcGhpY3MvdW5lbXBsb3llZC5jc3YnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEgPSAnTi9BJykgCgp0X3VuZW1wbG95ZWQgPC0gdF91bmVtcGxveWVkX3JhdyAlPiUgCiAgbXV0YXRlKGNvdW50eSA9IENvdW50eSwgCiAgICAgICAgIHVuZW1wbG95ZWRfcG9wID0gYFZhbHVlIChQZXJjZW50KWApICU+JSAKICBzZWxlY3QoY291bnR5LCB1bmVtcGxveWVkX3BvcCkKCnRfdW5lbXBsb3llZCA8LSB0X3VuZW1wbG95ZWQgJT4lIAogIGZpbHRlcighaXMubmEodW5lbXBsb3llZF9wb3ApLCAKICAgICAgICAgY291bnR5ICE9ICdXZXN0IFZpcmdpbmlhJywKICAgICAgICAgY291bnR5ICE9ICdVbml0ZWQgU3RhdGVzJykKCnRfdW5lbXBsb3llZCRjb3VudHkgPC0gc3RyX3JlcGxhY2UodF91bmVtcGxveWVkJGNvdW50eSwgIiBDb3VudHkiLCAiIikKCgp0X3VuZW1wbG95ZWQkY291bnR5IDwtIHN0cl9yZXBsYWNlKHRfdW5lbXBsb3llZCRjb3VudHksICIgQ291bnR5IiwgIiIpCgpwcmludCh0X3VuZW1wbG95ZWQpCgoKYmFjaGVsb3JfZGVncmVlX3JhdyA8LSByZWFkX2NzdigiYmFjaGVsb3JfZGVncmVlLmNzdiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IDUpCgpiYWNoZWxvcl9kZWdyZWUgPC0gYmFjaGVsb3JfZGVncmVlX3JhdyAlPiUgCiAgbXV0YXRlKGNvdW50eSA9IENvdW50eSwgCiAgICAgICAgIGJhY2hlbG9yc19wb3AgPSBgVmFsdWUgKFBlcmNlbnQpYCkgJT4lIAogIHNlbGVjdChjb3VudHksIGJhY2hlbG9yc19wb3ApCgpiYWNoZWxvcl9kZWdyZWUgPC0gYmFjaGVsb3JfZGVncmVlICU+JSAKICBmaWx0ZXIoIWlzLm5hKGJhY2hlbG9yc19wb3ApLCAKICAgICAgICAgY291bnR5ICE9ICdXZXN0IFZpcmdpbmlhJywKICAgICAgICAgY291bnR5ICE9ICdVbml0ZWQgU3RhdGVzJykKCmJhY2hlbG9yX2RlZ3JlZSRjb3VudHkgPC0gc3RyX3JlcGxhY2UoYmFjaGVsb3JfZGVncmVlJGNvdW50eSwgIiBDb3VudHkiLCAiIikKCmZvcmVpZ25fYm9ybl9yYXcgPC0gcmVhZF9jc3YoImZvcmVpZ25fYm9ybi5jc3YiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSA0KQpmb3JlaWduX2Jvcm4gPC0gZm9yZWlnbl9ib3JuX3JhdyAlPiUgCiAgbXV0YXRlKGNvdW50eSA9IENvdW50eSwgCiAgICAgICAgIGZvcmVpZ25fcG9wID0gYFZhbHVlIChQZXJjZW50KWApICU+JSAKICBmaWx0ZXIoIWlzLm5hKGZvcmVpZ25fcG9wKSwgCiAgICAgICAgIGNvdW50eSAhPSAnV2VzdCBWaXJnaW5pYScsIAogICAgICAgICBjb3VudHkgIT0gJ1VuaXRlZCBTdGF0ZXMnKSAlPiUgCiAgc2VsZWN0KGNvdW50eSwgZm9yZWlnbl9wb3ApCgpmb3JlaWduX2Jvcm4kY291bnR5IDwtIHN0cl9yZXBsYWNlKGZvcmVpZ25fYm9ybiRjb3VudHksICIgQ291bnR5IiwgIiIpCgogcG92ZXJ0eV9yYXRlIDwtIHJlYWRfY3N2KCJwb3ZlcnR5X3JhdGUuY3N2Iiwgc2tpcCA9IDMpICU+JSAKICAgICBtdXRhdGUoY291bnR5ID0gQ291bnR5LCAKICAgICAgICAgcG92ZXJ0eV9yYXRlID0gYFZhbHVlIChQZXJjZW50KWApICU+JSAKICBmaWx0ZXIoIWlzLm5hKHBvdmVydHlfcmF0ZSksIAogICAgICAgICBjb3VudHkgIT0gJ1dlc3QgVmlyZ2luaWEnLCAKICAgICAgICAgY291bnR5ICE9ICdVbml0ZWQgU3RhdGVzJykgJT4lIAogIHNlbGVjdChjb3VudHksIHBvdmVydHlfcmF0ZSkKCiBwb3ZlcnR5X3JhdGUkY291bnR5IDwtIHN0cl9yZXBsYWNlKHBvdmVydHlfcmF0ZSRjb3VudHksICIgQ291bnR5IiwgIiIpCiAKdW5kZXJfMThfcG9wIDwtIHJlYWRfY3N2KCJ1bmRlcl8xOF9wb3AuY3N2IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gMykgJT4lIAogIG11dGF0ZShjb3VudHkgPSBDb3VudHksIAogICAgICAgICB1bmRlcl8xOF9yYXRlID0gYFZhbHVlIChQZXJjZW50KWApICU+JSAKICBmaWx0ZXIoIWlzLm5hKHVuZGVyXzE4X3JhdGUpLCAKICAgICAgICAgY291bnR5ICE9ICdXZXN0IFZpcmdpbmlhJywgCiAgICAgICAgIGNvdW50eSAhPSAnVW5pdGVkIFN0YXRlcycpICU+JSAKICBzZWxlY3QoY291bnR5LCB1bmRlcl8xOF9yYXRlKQogCiB1bmRlcl8xOF9wb3AkY291bnR5IDwtIHN0cl9yZXBsYWNlKHVuZGVyXzE4X3BvcCRjb3VudHksICIgQ291bnR5IiwgIiIpCiAKIApgYGAKCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KbGlicmFyeShzdHJpbmdyKQppbmNvbWVfcmF3IDwtIHJlYWRfY3N2KCdIRFB1bHNlX2RhdGFfZXhwb3J0LmNzdicsIAogICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSA2KQpob3VzZWhvbGRfaW5jb21lIDwtIGluY29tZV9yYXcgJT4lIAogIHJlbmFtZShjb3VudHkgPSAnVW5pdGVkIFN0YXRlcycsIAogICAgICAgICBtZWRfaW5jb21lID0gJzkyLDY0NicpICU+JSAKICBmaWx0ZXIoIWlzLm5hKG1lZF9pbmNvbWUpKSAlPiUgCiAgc2VsZWN0KGNvdW50eSwgbWVkX2luY29tZSkKCmhvdXNlaG9sZF9pbmNvbWUkY291bnR5IDwtIHN0cl9yZXBsYWNlKGhvdXNlaG9sZF9pbmNvbWUkY291bnR5LCAiIENvdW50eSIsICIiKQoKcHJpbnQoaG91c2Vob2xkX2luY29tZSkKCmRlbW9ncmFwaGljcyA8LSBmb3JlaWduX2Jvcm4gJT4lIAogIGxlZnRfam9pbihiYWNoZWxvcl9kZWdyZWUsIGJ5ID0gImNvdW50eSIpICU+JSAKICBsZWZ0X2pvaW4odF91bmVtcGxveWVkLCBieSA9ICJjb3VudHkiKSAlPiUgCiAgbGVmdF9qb2luKGhvdXNlaG9sZF9pbmNvbWUsIGJ5ID0gImNvdW50eSIpICU+JSAKICBsZWZ0X2pvaW4odW5kZXJfMThfcG9wLCBieSA9ICJjb3VudHkiKSAlPiUgCiAgbGVmdF9qb2luKHBvdmVydHlfcmF0ZSwgYnkgPSAiY291bnR5IikKCgoKYGBgCgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CgojIE1lcmdlIGRhdGEKdCA8LSB0X2Fzc2VzcyAlPiUgCiAgbGVmdF9qb2luKGRlbW9ncmFwaGljcywgYnkgPSAiY291bnR5IikgJT4lIAogIGxlZnRfam9pbih0X3NwZW5kaW5nLCBieSA9ICJjb3VudHkiKQogIAoKcHJpbnQodCkKYGBgCgojIyMgRGF0YQoKVGhlIGRhdGEgdXNlZCB0aGlzIHByb2plY3QgaW5jbHVkZXMgdW5lbXBsb3ltZW50IGRlbW9ncmFwaGljcywgY291bnR5IHJldmVudWVzIGFuZCBzcGVuZGluZywgYW5kIHByb2ZpY2llbmN5IHNjb3JlcyBmb3IgdmFyaW91cyBjb3VudGllcy4gVGhlc2UgZGF0YSBzZXRzIHdlcmUgcHJvdmlkZWQgYnkgUHJvZmVzc29yIEdhcnJldHQuIEFkZGl0aW9uYWxseSwgSSBpbmNvcnBvcmF0ZWQgbWVkaWFuIGZhbWlseSBpbmNvbWUsIHJlZ2lvbiBkYXRhIGZvciBlYWNoIGNvdW50eSwgYmFjaGVsb3IgZGVncmVlIHJhdGUsIHBvdmVydHkgcmF0ZSwgcG9wdWxhdGlvbiByYXRlIGZvciB1bmRlciAxOCB5ZWFyIG9sZHMsIGFuZCBmb3JlaWduIHBvcHVsYXRpb24gb2YgZWFjaCBjb3VudHkuIAoKS2V5IFZhcmlhYmxlcyBJbmNsdWRlZDoKCi0gcG92ZXJ0eV9yYXRlOiBwb3ZlcnR5IHJhdGUgb2YgZWFjaCBjb3VudHkKCi0gdW5kZXJfMThfcmF0ZTogcG9wdWxhdGlvbiBvZiAxOCBhbmQgeW91bmdlciBmb3IgZWFjaCBjb3VudHkKCi0gbWVkX2luY29tZTogbWVkaWFuIGZhbWlseSBpbmNvbWUgaW4gZWFjaCBjb3VudHkKCi0gYmFjaGVsb3JzX3BvcDogYmFjaGVsb3IgZGVncmVlIHJhdGUgYXR0YWlubWVudCBvZiBlYWNoIGNvdW50eQoKLSBwcm9maWNpZW5jeTogc2NpZW5jZSBwcm9maWNpZW5jeSBzY29yZSBpbiBlYWNoIGNvdW50eQoKCiMjIyBNZXRob2RzCgojIyMjIENvcnJlbGF0aW9ucwoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CmxpYnJhcnkoZ2djb3JycGxvdCkKCm51bWVyaWNfZGF0YSA8LSB0ICU+JSAKICBzZWxlY3Qod2hlcmUoaXMubnVtZXJpYykpCmNvcnJfZGF0YSA8LSBudW1lcmljX2RhdGEgJT4lIAogIHNlbGVjdChwcm9maWNpZW5jeSwgbWVkX2luY29tZSwgZm9yZWlnbl9wb3AsIGJhY2hlbG9yc19wb3AsIHVuZW1wbG95ZWRfcG9wLCBlbnJvbGwsIHVuZGVyXzE4X3JhdGUsIHBvdmVydHlfcmF0ZSkKY29yX21hdHJpeCA8LSBjb3IoY29ycl9kYXRhLCB1c2UgPSAiY29tcGxldGUub2JzIikKCmdnY29ycnBsb3QoY29yKGNvcnJfZGF0YSkpCgpgYGAKQWJvdmUgaXMgYSBjb3JyZWxhdGlvbiBncmFwaCBmb3IgbWUgdG8gc2VlIHRoZSBkaWZmZXJlbnQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIHZhcmlhYmxlcyBpbiBteSBkYXRhIHNldC4gCgoKIyMjIyBMaW5lYXIgUmVncmVzc2lvbgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCm1vZGVsIDwtIGxtKHByb2ZpY2llbmN5IH4gbWVkX2luY29tZSArIGJhY2hlbG9yc19wb3AgKyBwb3ZlcnR5X3JhdGUgKyB1bmRlcl8xOF9yYXRlLCBkYXRhID0gbnVtZXJpY19kYXRhKQoKc3VtbWFyeShtb2RlbCkKCgpgYGAKClRoZSByZWdyZXNzaW9uIG1vZGVsIGFib3ZlIHNob3dzIHRoYXQgdGhlcmUgaXMgYSBwb3NpdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIG1lZGlhbiBmYW1pbHkgaW5jb21lIGFuZCBwb3B1bGF0aW9uIG9mIHBlb3BsZSB3aXRoIHRoZWlyIGJhY2hlbG9ycyBkZWdyZWUgd2l0aCBwcm9maWNpZW5jeSBzY29yZXMuIFRoZXJlIGlzIGEgbmVnYXRpdmUgY29ycmVsYXRpb24gd2l0aCBwb3ZlcnR5IHJhdGUgYW5kIHBvcHVsYXRpb24gb2YgcGVvcGxlIHVuZGVyIHRoZSBhZ2Ugb2YgMTggd2l0aCBwcm9maWNpZW5jeSBzY29yZXMuIFRoZSBvdmVyYWxsIG1vZGVsIGhhcyBhIDAuNDcgYWRqdXN0ZWQgUi1zcXVhcmVkIHdoaWNoIEknbSBoYXBweSB3aXRoIGNvbnNpZGVyaW5nIGEgZ29vZCBSLXNxdWFyZWQgaXMgMC41IGFuZCBncmVhdGVyLiBUaGUgcC12YWx1ZSBpcyBhbHNvIGEgZ29vZCBudW1iZXIgYmVjYXVzZSBpdCBpcyB1bmRlciAwLjA1LiBCYWNoZWxvcnMgcG9wdWxhdGlvbiBpcyBhIHNpZ25pZmljYW50IHByZWRpY3RvciB3aGVuIHByZWRpY3RpbmcgcHJvZmljaWVuY3kgZm9yIGFsbCBncmFkZXMuIAoKIyMjIyBLLW1lYW5zCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQprX2RhdGEgPC0gbnVtZXJpY19kYXRhICU+JSAKICBzZWxlY3QocHJvZmljaWVuY3ksIG1lZF9pbmNvbWUsIGJhY2hlbG9yc19wb3AsIHBvdmVydHlfcmF0ZSwgdW5kZXJfMThfcmF0ZSkKCnNjYWxlZF9kYXRhIDwtIGtfZGF0YSAlPiUgCiAgbXV0YXRlKGFjcm9zcyhldmVyeXRoaW5nKCksIHNjYWxlKSkKCmtfcmVzdWx0IDwtIGttZWFucygKICB4ID0gc2NhbGVkX2RhdGEsIAogIGNlbnRlcnMgPSAzLCAKICBuc3RhcnQgPSAyNQopCgpudW1lcmljX2RhdGEgPC0gbnVtZXJpY19kYXRhICU+JSAKICBtdXRhdGUoa21lYW5zX2NsdXN0ZXIgPSBrX3Jlc3VsdCRjbHVzdGVyKQoKZ2dwbG90KGRhdGEgPSBudW1lcmljX2RhdGEpICsgCiAgZ2VvbV9wb2ludChtYXBwaW5nID0gYWVzKHggPSBiYWNoZWxvcnNfcG9wLCB5ID0gcHJvZmljaWVuY3ksIGNvbG9yID0gZmFjdG9yKGttZWFuc19jbHVzdGVyKSkpICsKICBsYWJzKGNvbG9yID0gIkNsdXN0ZXIiLCB0aXRsZSA9ICJLLW1lYW5zIENsdXN0ZXJpbmciLCB4ID0gIkJhY2hlbG9yIERlZ3JlZSBSYXRlIiwgeSA9ICJQcm9maWNpZW5jeSIpICsKICB0aGVtZV9taW5pbWFsKCkKCgpgYGAKVGhlIHZpc3VhbGl6YXRpb24gYWJvdmUgc2hvd3MgY291bnRpZXMgZ3JvdXBlZCBiYXNlZCBvbiBkZW1vZ3JhcGhpY3MgYXMgbWVkaWFuIGZhbWlseSBpbmNvbWUsIGJhY2hlbG9yIGRlZ3JlZSByYXRlLCBwb3ZlcnR5IHJhdGUsIHByb2ZpY2llbmN5LCBhbmQgcG9wdWxhdGlvbiBvZiBjaGlsZHJlbiAoMTggYW5kIHlvdW5nZXIpLiBUaGUgY2x1c3RlcnMgcmV2ZWFsIHBhdHRlcm5zIHdoZXJlIGNvdW50aWVzIHdpdGggaGlnaGVyIGJhY2hlbG9yIGRlZ3JlZSByYXRlcyB0ZW5kIHRvIGhhdmUgaGlnaGVyIHByb2ZpY2llbmN5IHNjb3Jlcy4gVGhlIHJlZCBjbHVzdGVyIHNob3dzIGNvdW50aWVzIHRoYXQgbWF5IGJlIGVjb25vbWljYWxseSBkaXNhZHZhbnRhZ2VkIHdpdGggbG93ZXIgZWR1Y2F0aW9uYWwgYXR0YWlubWVudCwgdGhlIGdyZWVuIGNsdXN0ZXIgcmVwcmVzZW50cyBjb3VudGllcyB0aGF0IGhhdmUgaGlnaGVyIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgYW5kIG91dGNvbWVzLCBhbmQgdGhlIGJsdWUgY2x1c3RlciByZXByZXNlbnRzIHRoZSBjb3VudGllcyB0aGF0IGZhbGwgaW4gYSBtaWRkbGUgb2YgdGhlIHR3byBleHRyZW1lcy4gCgoKIyMjIyBEZWNpc2lvbiBUcmVlCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KbGlicmFyeShycGFydC5wbG90KQpsaWJyYXJ5KHJwYXJ0KQoKdHJlZV9tb2RlbCA8LSBycGFydChwcm9maWNpZW5jeSB+IG1lZF9pbmNvbWUgKyBiYWNoZWxvcnNfcG9wICsgcG92ZXJ0eV9yYXRlICsgdW5kZXJfMThfcmF0ZSwgCiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG51bWVyaWNfZGF0YSwgCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gImFub3ZhIiwgCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IHJwYXJ0LmNvbnRyb2wobWluc3BsaXQgPSAxMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluYnVja2V0ID0gNSkpCgpycGFydC5wbG90KHRyZWVfbW9kZWwpCgpgYGAKVGhlIGRlY2lzaW9uIHRyZWUgYWJvdmUgcHJlZGljdHMgcHJvZmljaWVuY3kgYmFzZWQgb24gdGhlIGtleSBkZW1vZ3JhcGhpYyB2YXJpYWJsZXMgSSd2ZSBiZWVuIHdvcmtpbmcgd2l0aCB0aHJvdWdob3V0IHRoaXMgcHJvamVjdC4gVGhpcyB2aXN1YWxpemF0aW9uIHNob3dzIG9uY2UgYWdhaW4gdGhhdCB0aGUgYmFjaGVsb3JzIGRlZ3JlZSByYXRlIGluIGVhY2ggY291bnR5IGhhcyBhIHNpZ25pZmljYW50IGltcGFjdCBvbiBwcm9maWNpZW5jeSBzY29yZXMsIGJlY2F1c2UgaW4gdGhpcyBkZWNpc2lvbiB0cmVlIGl0IGlzIHRoZSBmaXJzdCBhbmQgbW9zdCBpbXBvcnRhbnQgc3BsaXQuIEFzIHdlbGwgYXMgdGhlIHBvcHVsYXRpb24gb2YgY2hpbGRyZW4gaW4gZWFjaCBjb3VudHkgaGFzIGFuIGltcGFjdCBvbiBwcm9maWNpZW5jeSBzY29yZXMgYXMgd2VsbC4gT3ZlcmFsbCB0aGUgdHJlZSBzaG93cyBob3cgZWR1Y2F0aW9uIGxldmVscyBhbmQgc29jaW9lY29ub21pYyBmYWN0b3JzIHBsYXkgYSByb2xlIGluIGNoaWxkcmVuJ3MgcHJvZmljaWVuY3kgc2NvcmVzLiAKCgoKIyMjIE5ldXJhbCBOZXR3b3JrIAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CmxpYnJhcnkobmV1cmFsbmV0KQoKCnNldC5zZWVkKDEpCgpzY2FsZWRfZGF0YSA8LSBhcy5kYXRhLmZyYW1lKHNjYWxlZF9kYXRhKQp0cmFpbl9pbmRleCA8LSBzYW1wbGUoc2VxX2xlbihucm93KHNjYWxlZF9kYXRhKSksIHNpemUgPSAwLjggKiBucm93KHNjYWxlZF9kYXRhKSkKdHJhaW5fZGF0YSA8LSBzY2FsZWRfZGF0YVt0cmFpbl9pbmRleCwgXQp0ZXN0X2RhdGEgPC0gIHNjYWxlZF9kYXRhWy10cmFpbl9pbmRleCwgXQoKbm5fbW9kZWwgPC0gbmV1cmFsbmV0KHByb2ZpY2llbmN5IH4gbWVkX2luY29tZSArIGJhY2hlbG9yc19wb3AgKyBwb3ZlcnR5X3JhdGUgKyB1bmRlcl8xOF9yYXRlLCAKICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSB0cmFpbl9kYXRhLCAKICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbiA9IGMoMTAsIDUpLCAKICAgICAgICAgICAgICAgICAgICAgIGxpbmVhci5vdXRwdXQgPSBUUlVFKQoKcGxvdChubl9tb2RlbCkKCnRlc3RfcHJlZGljdGlvbnMgPC0gY29tcHV0ZShubl9tb2RlbCwgdGVzdF9kYXRhWywgYygibWVkX2luY29tZSIsICJiYWNoZWxvcnNfcG9wIiwgInBvdmVydHlfcmF0ZSIsICJ1bmRlcl8xOF9yYXRlIildKQp0ZXN0X3ByZWRpY3Rpb25zIDwtIHRlc3RfcHJlZGljdGlvbnMkbmV0LnJlc3VsdAoKYWN0dWFsX3ZhbHVlcyA8LSB0ZXN0X2RhdGEkcHJvZmljaWVuY3kKcm1zZSA8LSBtZWFuKChhY3R1YWxfdmFsdWVzLXRlc3RfcHJlZGljdGlvbnMpXjIpCgoKCmBgYApUaGUgdmlzdWFsaXphdGlvbiBhYm92ZSByZXByZXNlbnRzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG5ldXJhbCBuZXR3b3JrLCB3aGljaCBwcmVkaWN0cyBwcm9maWNpZW5jeSBzY29yZXMgYmFzZWQgb24gaW5wdXRzIGxpa2UgbWVkaWFuIGluY29tZSwgYmFjaGVsb3IgZGVncmVlIHJhdGVzLCBwb3ZlcnR5IHJhdGVzLCBhbmQgcG9wdWxhdGlvbiByYXRlIG9mIDE4IGFuZCB5b3VuZ2VyLiBUaGUgZXJyb3IgdmFsdWUgaXMgMC4wMTAxMTMgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIG5ldHdvcmsgaGFzIGxlYXJuZWQgdGhlIHJlbGF0aW9uc2hpcHMgZWZmZWN0aXZlbHkgY2FwdHVyaW5nIGNvbXBsZXggcGF0dGVybnMuIAoKCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KCnBsb3QoYWN0dWFsX3ZhbHVlcywgdGVzdF9wcmVkaWN0aW9ucywgbWFpbiA9ICJBY3R1YWwgdnMgUHJlZGljdGVkIFByb2ZpY2llbmN5IiwKICAgICB4bGFiID0gIkFjdHVhbCBQcm9maWNpZW5jeSIsIAogICAgIHlsYWIgPSAiUHJlZGljdGQgUHJvZmljaWVuY3kiKQphYmxpbmUoMCwxLGNvbCA9ICJyZWQiKQoKCgpgYGAKV2hlbiBsb29raW5nIGF0IHRoZSBhY3R1YWwgYW5kIHByZWRpY3RlZCBwcm9maWNpZW5jeSBnZW5lcmF0ZWQgYnkgdGhlIG5ldXJhbCBuZXR3b3JrLCB0aGUgcGxvdCBzaG93cyB0aGF0IHRoZSBtb2RlbCBjYXB0dXJlcyBnZW5lcmFsIHRyZW5kcywgYXMgbWFueSBwb2ludHMgYXJlIGNsb3NlIHRvIHRoZSByZWQgbGluZS4gSG93ZXZlciB0aGVyZSBpcyBzdGlsbCBub3RpY2VhYmxlIHZhcmlhYmlsaXR5LCBpbmRpY2F0aW5nIHRoYXQgdGhlIHByZWRpY3Rpb25zIGFyZSBub3QgcGVyZmVjdGx5IGFjY3VyYXRlLiBUaGlzIHN1Z2dlc3RzIHRoZSBtb2RlbCBwZXJmb3JtcyByZWFzb25hYmx5IHdlbGwgYnV0IG1heSByZXF1aXJlIGZ1cnRoZXIgcmVmaW5lbWVudCB0byBpbXByb3ZlIGFjY3VyYWN5LiAKCgoKCgoKCgoKCgojIyMgUHJlZGljdGlvbgoKQmFzZWQgb24gYWxsIG15IHZpc3VhbGl6YXRpb25zLCBJJ3ZlIGNvbWUgdG8gdGhlIHByZWRpY3Rpb24gdGhhdCBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoIGJhY2hlbG9yIGRlZ3JlZXMgYW5kIHBvdmVydHkgcmF0ZXMgaW4gYSBjb3VudHkuIENvdW50aWVzIHdpdGggaGlnaGVyIGJhY2hlbG9yJ3MgZGVncmVlIGF0dGFpbm1lbnQgdGVuZCB0byBoYXZlIGhpZ2hlciBwcm9maWNpZW5jeSBzY29yZXMsIHdoaWxlIHRob3NlIHdpdGggaGlnaGVyIHBvdmVydHkgcmF0ZXMgZ2VuZXJhbGx5IHNlZSBsb3dlciBwcm9maWNpZW5jeS4gVGhlIGRlY2lzaW9uIHRyZWUgYW5kIGstbWVhbnMgY2x1c3RlcmluZyBzaG93IGRpc3RpbmN0IGdyb3VwcyBiYXNlZCBvbiB0aGVzZSBwYXR0ZXJucywgaGlnaGxpZ2h0aW5nIHRoZSBpbXBvcnRhbmNlIG9mIHRoZXNlIHNvY2lvZWNvbm9taWMgdmFyaWFibGVzLiBUaGUgbmV1cmFsIG5ldHdvcmsgcHJlZGljdGlvbnMgYWxpZ24gd2l0aCB0aGVzZSB0cmVuZHMgYXMgd2VsbCwgd2l0aCBsaXR0bGUgdmFyaWFiaWxpdHkuIE92ZXJhbGwsIGlmIEkgd2FzIHByZXNlbnRpbmcgdGhpcyB0byBhIHNjaG9vbCBib2FyZCBJIHdvdWxkIHJlY29tbWVuZCB0byBlbmNvdXJhZ2UgZnVydGhpbmcgZWR1Y2F0aW9uIGFmdGVyIGstMTIgdG8gdGhlaXIgc3R1ZGVudHMsIHNvIHRoYXQgaW4gdGhlIGZ1dHVyZSB0aG9zZSBwcm9maWNpZW5jeSBzY29yZXMgd2lsbCBpbmNyZWFzZS4gCgojIyMgTGltaXRhdGlvbnMKCk9uZSBsaW1pdGF0aW9uIG9mIHRoaXMgcHJvamVjdCBpcyB0aGF0IGl0IGRvZXMgbm90IHByb3ZpZGUgaW1tZWRpYXRlIHNvbHV0aW9ucyBmb3IgaW1wcm92aW5nIHByb2ZpY2llbmN5IHNjb3JlcywgYXMgZmFjdG9ycyBpZGVudGlmaWVkLCBzdWNoIGFzIGJhY2hlbG9yJ3MgZGVncmVlIGF0dGFpbm1lbnQgYW5kIHBvdmVydHksIHJlcXVpcmUgbG9uZyB0ZXJtIGVmZm9ydHMgdG8gYWRkcmVzcy4gQWRkaXRpb25hbGx5LCBvbmx5IGluY2x1ZGluZyBzb2Npb2Vjb25pbWljIHZhcmlhYmxlcyBhbmQgbGVhdmluZyBvdXQgZnVuZGluZyBvciBzY2hvb2wgcmVzb3VyY2VzIGRhdGEgY291bGQgaGF2ZSBwb3RlbnRpYWxseSBza2V3ZWQgdGhlIHByZWRpY3Rpb25zLiBJbiB0aGUgZnV0dXJlLCBJIHdvdWxkIGV4cGFuZCB0aGUgZGF0YSB0byBpbmNsdWRlZCBmdW5kaW5nIHZhcmlhYmxlcyBhcyB3ZWxsIHRvIHRyeSB0byBpbXByb3ZlIHRoZSBtb2RlbCdzIGFjY3VyYWN5IGFuZCBwcm92aWRlIG1vcmUgaW5zaWdodC4gCgoKIyMjIFJlc291cmNlcwoKU291cmNlcyBJbmNsdWRlZDogCgotIENoYXRHUFQgZm9yIGNvZGUgZXJyb3JzCgotIGh0dHBzOi8vaGRwdWxzZS5uaW1oZC5uaWguZ292L2RhdGEtcG9ydGFsL3NvY2lhbC9tYXA/c29jaWFsdG9waWM9MDMwJnNvY2lhbHRvcGljX29wdGlvbnM9c29jaWFsXzYmZGVtbz0wMDAxMCZkZW1vX29wdGlvbnM9aW5jb21lXzMmcmFjZT0wMCZyYWNlX29wdGlvbnM9cmFjZV83JnNleD0wJnNleF9vcHRpb25zPXNleGJvdGhfMSZhZ2U9MDAxJmFnZV9vcHRpb25zPWFnZWFsbF8xJnN0YXRlZmlwcz01NCZzdGF0ZWZpcHNfb3B0aW9ucz1hcmVhX3N0YXRlcwoKLSBodHRwczovL3d3dy5kcm9wYm94LmNvbS9zY2wvZm8vczI5eHd3ZzIxaXJja3o5Z3pqeDM5L0FDM1c4bTAyS0xBZ0l0RGZlam1tdnJVP3Jsa2V5PTRoMjI2aWRtZDBuNjk2enlqY3JrMmtlZ2ImZT0xJmRsPTAKCgoKCgoKCgoKCgoKCgoKCgo=