Introduction

Understanding the factors that influence educational outcomes is vital for ensuring equitable learning opportunities across regions. In this analysis, we examine how county-level characteristics in West Virginia—including school spending, income levels, unemployment rates, and graduation rates—affect student proficiency in science. By analyzing data from state assessment results, spending records, demographic sources, and graduation statistics, we aim to identify key predictors of educational success.

Thesis: County-level socio-economic indicators, particularly household income and graduation rates, have a stronger influence on science proficiency than school spending alone.

library(rpart) library(rpart.plot)

Load & Clean Data Sets

Load Assessment Data

Load Spending Data

New names:

Load Unemployment Data

Warning: One or more parsing issues, call `problems()` on your data frame for details, e.g.:
  dat <- vroom(...)
  problems(dat)Rows: 62 Columns: 5── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): County, FIPS, Rank within US (of 3143 counties)
dbl (2): Value (Percent), People (Unemployed)
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Load Income Data

Warning: One or more parsing issues, call `problems()` on your data frame for details, e.g.:
  dat <- vroom(...)
  problems(dat)

Load Graduation Rate Data

Rows: 55 Columns: 18── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (18): County Number, County Name, All, White, Black, Hispanic, Asian, Indian, Multi-Racial, Pacific Islander, Male, ...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Join Data

Correlation Matrix

Warning: package ‘ggcorrplot’ was built under R version 4.4.3

Histograms of Variables

    county             school          school_name       
 Length:55          Length:55          Length:55         
 Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character  
                                                         
                                                         
                                                         
 population_group     subgroup         science_proficiency
 Length:55          Length:55          Min.   :14.81      
 Class :character   Class :character   1st Qu.:21.45      
 Mode  :character   Mode  :character   Median :24.36      
                                       Mean   :25.30      
                                       3rd Qu.:29.39      
                                       Max.   :41.80      
  proficiency        name               enroll     
 Min.   :14.81   Length:55          Min.   :  800  
 1st Qu.:21.45   Class :character   1st Qu.: 1654  
 Median :24.36   Mode  :character   Median : 3177  
 Mean   :25.30                      Mean   : 4586  
 3rd Qu.:29.39                      3rd Qu.: 5104  
 Max.   :41.80                      Max.   :24392  
    tfedrev           tstrev          tlocrev      
 Min.   :  1511   Min.   :  3895   Min.   :  1956  
 1st Qu.:  4991   1st Qu.: 12668   1st Qu.:  8194  
 Median : 10158   Median : 26858   Median : 14813  
 Mean   : 13312   Mean   : 34234   Mean   : 25032  
 3rd Qu.: 14518   3rd Qu.: 39496   3rd Qu.: 33333  
 Max.   :109522   Max.   :176062   Max.   :145623  
    totalexp         ppcstot      unemployment_rate
 Min.   : 13954   Min.   :11885   Min.   : 2.600   
 1st Qu.: 26486   1st Qu.:13151   1st Qu.: 5.050   
 Median : 48642   Median :13777   Median : 6.400   
 Mean   : 69482   Mean   :14466   Mean   : 7.055   
 3rd Qu.: 81172   3rd Qu.:15236   3rd Qu.: 8.500   
 Max.   :416491   Max.   :23563   Max.   :15.100   
     FIPS           median_income    graduation_rate 
 Length:55          Min.   : 39226   Min.   : 79.56  
 Class :character   1st Qu.: 61577   1st Qu.: 89.98  
 Mode  :character   Median : 70457   Median : 93.33  
                    Mean   : 70170   Mean   : 93.05  
                    3rd Qu.: 76648   3rd Qu.: 96.23  
                    Max.   :118108   Max.   :100.00  
     fips          
 Length:55         
 Class :character  
 Mode  :character  
                   
                   
                   

PCA Analysis

Importance of components:
                          PC1    PC2     PC3     PC4
Standard deviation     2.3632 1.5442 0.98195 0.95018
Proportion of Variance 0.5077 0.2168 0.08766 0.08208
Cumulative Proportion  0.5077 0.7245 0.81214 0.89422
                          PC5     PC6     PC7     PC8
Standard deviation     0.8630 0.51713 0.28106 0.26001
Proportion of Variance 0.0677 0.02431 0.00718 0.00615
Cumulative Proportion  0.9619 0.98623 0.99341 0.99956
                           PC9    PC10      PC11
Standard deviation     0.05522 0.04256 1.403e-16
Proportion of Variance 0.00028 0.00016 0.000e+00
Cumulative Proportion  0.99984 1.00000 1.000e+00

Supervised Models

Linear Regression Model


Call:
lm(formula = proficiency ~ ., data = train)

Residuals:
    Min      1Q  Median      3Q     Max 
-8.7269 -3.7901  0.4995  2.9807  8.1894 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)
(Intercept)       -8.482e+00  1.504e+01  -0.564    0.576
graduation_rate    2.860e-02  1.685e-01   0.170    0.866
unemployment_rate  4.211e-01  2.973e-01   1.416    0.164
median_income      3.033e-04  5.905e-05   5.136 6.84e-06
ppcstot            4.697e-04  3.102e-04   1.514    0.138
                     
(Intercept)          
graduation_rate      
unemployment_rate    
median_income     ***
ppcstot              
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.527 on 42 degrees of freedom
Multiple R-squared:  0.4377,    Adjusted R-squared:  0.3842 
F-statistic: 8.174 on 4 and 42 DF,  p-value: 5.717e-05

[1] 4.586167

Data Tree

[1] 7.627723

Cause & Effect Chart

Proficiency by County in West Viriginia

Conclusion and Recommendations

Conclusion: - Proficiency is most strongly related to median income and graduation rate. - Total per-pupil cost had weaker correlations with outcomes than expected. - PCA suggests counties form clusters based on socio-economic metrics.

Recommendations: - Invest in support for low-income counties. - Address socio-economic inequities alongside educational spending.

RPubs URL

https://rpubs.com/ef0052/1304674

References

Graduation Rate Data: https://zoomwv.k12.wv.us/Dashboard/dashboard/2111

LS0tDQp0aXRsZTogIldWIENvdW50eSBFZHVjYXRpb24gT3V0Y29tZXMgUHJlZGljdGlvbiINCmF1dGhvcjogJ0VtbWEgRnJpZGxleScNCmRhdGU6ICdNYXkgMSwgMjAyNScNCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMgSW50cm9kdWN0aW9uDQoNClVuZGVyc3RhbmRpbmcgdGhlIGZhY3RvcnMgdGhhdCBpbmZsdWVuY2UgZWR1Y2F0aW9uYWwgb3V0Y29tZXMgaXMgdml0YWwgZm9yIGVuc3VyaW5nIGVxdWl0YWJsZSBsZWFybmluZyBvcHBvcnR1bml0aWVzIGFjcm9zcyByZWdpb25zLiBJbiB0aGlzIGFuYWx5c2lzLCB3ZSBleGFtaW5lIGhvdyBjb3VudHktbGV2ZWwgY2hhcmFjdGVyaXN0aWNzIGluIFdlc3QgVmlyZ2luaWHigJRpbmNsdWRpbmcgc2Nob29sIHNwZW5kaW5nLCBpbmNvbWUgbGV2ZWxzLCB1bmVtcGxveW1lbnQgcmF0ZXMsIGFuZCBncmFkdWF0aW9uIHJhdGVz4oCUYWZmZWN0IHN0dWRlbnQgcHJvZmljaWVuY3kgaW4gc2NpZW5jZS4gQnkgYW5hbHl6aW5nIGRhdGEgZnJvbSBzdGF0ZSBhc3Nlc3NtZW50IHJlc3VsdHMsIHNwZW5kaW5nIHJlY29yZHMsIGRlbW9ncmFwaGljIHNvdXJjZXMsIGFuZCBncmFkdWF0aW9uIHN0YXRpc3RpY3MsIHdlIGFpbSB0byBpZGVudGlmeSBrZXkgcHJlZGljdG9ycyBvZiBlZHVjYXRpb25hbCBzdWNjZXNzLg0KDQoqKlRoZXNpcyoqOiBDb3VudHktbGV2ZWwgc29jaW8tZWNvbm9taWMgaW5kaWNhdG9ycywgcGFydGljdWxhcmx5IGhvdXNlaG9sZCBpbmNvbWUgYW5kIGdyYWR1YXRpb24gcmF0ZXMsIGhhdmUgYSBzdHJvbmdlciBpbmZsdWVuY2Ugb24gc2NpZW5jZSBwcm9maWNpZW5jeSB0aGFuIHNjaG9vbCBzcGVuZGluZyBhbG9uZS4NCg0KbGlicmFyeShycGFydCkNCmxpYnJhcnkocnBhcnQucGxvdCkNCg0KIyBMb2FkICYgQ2xlYW4gRGF0YSBTZXRzDQoNCiMjIExvYWQgQXNzZXNzbWVudCBEYXRhDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoY2FyZXQpDQpsaWJyYXJ5KHJwYXJ0KQ0KbGlicmFyeShyZWFkeGwpDQphc3Nlc3NtZW50X3BhdGggPC0gJ0hpc3RvcmljYWxfQXNzZXNzbWVudFJlc3VsdHNfU1kxNS10by1TWTIxLnhsc3gnDQoNCg0KdF9hc3Nlc3NfcmF3X3NjaG9vbCA8LSByZWFkX2V4Y2VsKHBhdGggPSBhc3Nlc3NtZW50X3BhdGgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVldCA9ICdTWTIxIFNjaG9vbCAmIERpc3RyaWN0JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gJ2IyOmY3MzEyJykNCg0KDQp0X2Fzc2Vzc19yYXdfc2NpZW5jZSA8LSByZWFkX2V4Y2VsKHBhdGggPSBhc3Nlc3NtZW50X3BhdGgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVldCA9ICdTWTIxIFNjaG9vbCAmIERpc3RyaWN0JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gJ2RiMzpkYjczMTInLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF9uYW1lcyA9IGMoJ3NjaWVuY2VfcHJvZmljaWVuY3knKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hID0gJyoqJykNCg0KdF9hc3Nlc3NfcmF3IDwtIHRfYXNzZXNzX3Jhd19zY2hvb2wgJT4lDQogIGJpbmRfY29scyh0X2Fzc2Vzc19yYXdfc2NpZW5jZSkgJT4lIA0KICBqYW5pdG9yOjpjbGVhbl9uYW1lcygpICANCg0KDQojIFJlbW92ZSBzdWJncm91cHMNCnRfYXNzZXNzIDwtIHRfYXNzZXNzX3JhdyAlPiUgDQogIGZpbHRlcihzY2hvb2wgPT0gOTk5KSAlPiUgDQogIGZpbHRlcihwb3B1bGF0aW9uX2dyb3VwID09ICdUb3RhbCBQb3B1bGF0aW9uJykgJT4lIA0KICBmaWx0ZXIoY291bnR5ICE9ICdTdGF0ZXdpZGUnKSAlPiUgDQogIG11dGF0ZShwcm9maWNpZW5jeSA9IHNjaWVuY2VfcHJvZmljaWVuY3kpIA0KDQpwcmludCh0X2Fzc2VzcykNCmBgYA0KDQojIyBMb2FkIFNwZW5kaW5nIERhdGENCg0KYGBge3IgZWNobz1GQUxTRX0NCnNwZW5kaW5nX3BhdGggPC0gJ2Vsc2VjMjJ0LnhscycNCg0KdF9zcGVuZGluZ19yYXcgPC0gcmVhZF9leGNlbChwYXRoID0gc3BlbmRpbmdfcGF0aCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gJ2Vsc2VjMjJ0JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gJ2ExOmdiMTQxMDYnKSAlPiUgDQogIGphbml0b3I6OmNsZWFuX25hbWVzKCkNCg0KDQpjb29wZXJhdGVzIDwtIGMoJ01PVU5UQUlOIFNUQVRFIEVEVUNBVElPTkFMIFNFUlZJQ0VTIENPT1BFUkFUSVZFJywNCiAgICAgICAgICAgICAgICAnRUFTVEVSTiBQQU5IQU5ETEUgSU5TVFJVQ1RJT05BTCBDT09QRVJBVElWRScsDQogICAgICAgICAgICAgICAgJ1NPVVRIRVJOIEVEVUNBVElPTkFMIFNFUlZJQ0VTIENPT1BFUkFUSVZFJykNCg0KdF9zcGVuZGluZyA8LSB0X3NwZW5kaW5nX3JhdyAlPiUgDQogIGZpbHRlcihzdGF0ZSA9PSA0OSkgJT4lIA0KICBmaWx0ZXIoIW5hbWUgJWluJSBjb29wZXJhdGVzKSAlPiUgDQogIHNlbGVjdChuYW1lLCBlbnJvbGwsIHRmZWRyZXYsIHRzdHJldiwgdGxvY3JldiwgdG90YWxleHAsIHBwY3N0b3QpICU+JSANCiAgbXV0YXRlKGNvdW50eSA9IHN0cl90b190aXRsZShzdHJfc3BsaXRfaShuYW1lLCAnICcsMSkpLA0KICAgICAgICAgY291bnR5ID0gaWZlbHNlKGNvdW50eSA9PSAnTWMnLCAnTWNEb3dlbGwnLCBjb3VudHkpKQ0KDQoNCnByaW50KHRfc3BlbmRpbmcpDQpgYGANCg0KIyMgTG9hZCBVbmVtcGxveW1lbnQgRGF0YQ0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KDQp0X2RlbW9ncmFwaGljX3VuZW1wbG95ZWQgPC0gcmVhZF9jc3YoJ3VuZW1wbG95ZWQuY3N2JywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IDQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEgPSAnTi9BJykgJT4lDQogIGphbml0b3I6OmNsZWFuX25hbWVzKCkgJT4lIA0KICBmaWx0ZXIoY291bnR5ICE9ICdXZXN0IFZpcmdpbmlhJywNCiAgICAgICAgIGNvdW50eSAhPSAnVW5pdGVkIFN0YXRlcycsDQogICAgICAgICAhaXMubmEodmFsdWVfcGVyY2VudCkgKSAlPiUgDQogIHNlbGVjdChjb3VudHksIHZhbHVlX3BlcmNlbnQpICU+JQ0KICByZW5hbWUodW5lbXBsb3ltZW50X3JhdGUgPSB2YWx1ZV9wZXJjZW50KQ0KDQoNCnByaW50KHRfZGVtb2dyYXBoaWNfdW5lbXBsb3llZCkNCmBgYA0KDQojIyBMb2FkIEluY29tZSBEYXRhDQoNCmBgYHtyIGVjaG89RkFMU0V9DQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkoZHBseXIpDQoNCiMgUmVhZCB0aGUgZmlsZSwgc2tpcHBpbmcgdGhlIGZpcnN0IDQgcm93cyBvZiBtZXRhZGF0YQ0KZGF0YV9wYXRoIDwtICJIRFB1bHNlX2RhdGFfZXhwb3J0LmNzdiINCmRmIDwtIHJlYWRfY3N2KGRhdGFfcGF0aCwgc2tpcCA9IDQsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpDQoNCiMgQ2xlYW4gbnVtZXJpYyBjb2x1bW5zDQp0X2RlbW9ncmFwaGljX2luY29tZSA8LSBkZiAlPiUNCiAgc2VsZWN0KC1gUmFuayB3aXRoaW4gVVMgKG9mIDMxMzkgY291bnRpZXMpYCkgJT4lDQogIHJlbmFtZSgNCiAgICBjb3VudHkgPSBDb3VudHksDQogICAgbWVkaWFuX2luY29tZSA9IGBWYWx1ZSAoRG9sbGFycylgDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBtZWRpYW5faW5jb21lID0gcGFyc2VfbnVtYmVyKGFzLmNoYXJhY3RlcihtZWRpYW5faW5jb21lKSkNCiAgKQ0KDQojIEZpbHRlciBvdXQgc3VtbWFyeSByb3dzIGxpa2UgIlVuaXRlZCBTdGF0ZXMiDQp0X2RlbW9ncmFwaGljX2luY29tZSA8LSB0X2RlbW9ncmFwaGljX2luY29tZSAlPiUNCiAgZmlsdGVyKCFjb3VudHkgJWluJSBjKCJXZXN0IFZpcmdpbmlhIiwgIlVuaXRlZCBTdGF0ZXMiKSkNCg0KIyBSZW1vdmUgcm93cyA1NiB0aHJvdWdoIDYyIChSIGlzIDEtYmFzZWQgaW5kZXhpbmcpDQp0X2RlbW9ncmFwaGljX2luY29tZSA8LSB0X2RlbW9ncmFwaGljX2luY29tZSAlPiUgc2xpY2UoLTU2Oi02MikNCg0KIyBWaWV3IGNsZWFuZWQgZGF0YQ0KcHJpbnQodF9kZW1vZ3JhcGhpY19pbmNvbWUpDQoNCg0KDQpgYGANCg0KIyMgTG9hZCBHcmFkdWF0aW9uIFJhdGUgRGF0YQ0KYGBge3IgZWNobz1GQUxTRX0NCiMgTG9hZCB0aGUgY2xlYW5lZCBDU1YNCmdyYWRfcGF0aCA8LSAiRm91ciBZZWFyIEdyYWR1YXRpb24gUmF0ZSBieSBDb3VudHkgJiBTdWJncm91cF8yMDI1MDQzMC5jc3YiDQpncmFkX3JhdyA8LSByZWFkX2NzdihncmFkX3BhdGgpDQoNCiMgQ2xlYW46IHJlbmFtZSAnQ291bnR5IE5hbWUnIHRvICdjb3VudHknIGFuZCBjbGVhbiBwZXJjZW50YWdlIGNvbHVtbnMNCnRfZ3JhZHVhdGlvbl9yYXRlIDwtIGdyYWRfcmF3ICU+JQ0KICBzZWxlY3QoJ0NvdW50eSBOYW1lJywgJ0FsbCcpICU+JSANCiAgcmVuYW1lKGNvdW50eSA9IGBDb3VudHkgTmFtZWAsIGdyYWR1YXRpb25fcmF0ZSA9ICdBbGwnKSAlPiUNCiAgbXV0YXRlKGFjcm9zcygtY291bnR5LCB+IGFzLm51bWVyaWMoc3RyX3JlbW92ZShhcy5jaGFyYWN0ZXIoLiksICIlIikpKSkgJT4lDQogIG11dGF0ZShjb3VudHkgPSBzdHJfdG9fdGl0bGUoc3RyX3JlcGxhY2UoY291bnR5LCAiIENvdW50eSIsICIiKSkgJT4lIHN0cl90cmltKCkpDQoNCnByaW50KHRfZ3JhZHVhdGlvbl9yYXRlKQ0KDQpgYGANCg0KDQojIEpvaW4gRGF0YQ0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KZml4X2NvdW50eV9uYW1lcyA8LSBmdW5jdGlvbihkZikgew0KICBkZiAlPiUgDQogICAgbXV0YXRlKGNvdW50eSA9IHN0cl90b190aXRsZShjb3VudHkpLA0KICAgICAgICAgICBjb3VudHkgPSBzdHJfcmVwbGFjZShjb3VudHksICIgQ291bnR5JCIsICIiKSwNCiAgICAgICAgICAgY291bnR5ID0gc3RyX3RyaW0oY291bnR5KSkNCn0NCg0KdF9hc3Nlc3MgPC0gZml4X2NvdW50eV9uYW1lcyh0X2Fzc2VzcykNCnRfc3BlbmRpbmcgPC0gZml4X2NvdW50eV9uYW1lcyh0X3NwZW5kaW5nKQ0KdF9kZW1vZ3JhcGhpY191bmVtcGxveWVkIDwtIGZpeF9jb3VudHlfbmFtZXModF9kZW1vZ3JhcGhpY191bmVtcGxveWVkKQ0KdF9kZW1vZ3JhcGhpY19pbmNvbWUgPC0gZml4X2NvdW50eV9uYW1lcyh0X2RlbW9ncmFwaGljX2luY29tZSkNCg0KDQoNCiMgTWVyZ2UgZGF0YQ0KDQpjb3VudHlfY29scyA8LSBzZWxlY3QodF9hc3Nlc3MsIGNvdW50eSkNCg0KdCA8LSB0X2Fzc2VzcyAlPiUgDQogIGxlZnRfam9pbih0X3NwZW5kaW5nLCBieSA9ICJjb3VudHkiKSAlPiUgDQogIGxlZnRfam9pbih0X2RlbW9ncmFwaGljX3VuZW1wbG95ZWQsIGJ5ID0gImNvdW50eSIpICU+JQ0KICBsZWZ0X2pvaW4odF9kZW1vZ3JhcGhpY19pbmNvbWUsIGJ5ID0gImNvdW50eSIpICU+JQ0KICBsZWZ0X2pvaW4odF9ncmFkdWF0aW9uX3JhdGUsIGJ5ID0gImNvdW50eSIpICU+JQ0KICBkcm9wX25hKCkNCmBgYA0KDQoNCiMgQ29ycmVsYXRpb24gTWF0cml4DQoNCmBgYHtyIGVjaG89RkFMU0V9DQpudW1lcmljX3QgPC0gdCAlPiUgDQogIHNlbGVjdCh3aGVyZShpcy5udW1lcmljKSkNCg0KbGlicmFyeShnZ2NvcnJwbG90KQ0KDQpjb3JfbWF0cml4IDwtIGNvcihudW1lcmljX3QsIHVzZSA9ICJwYWlyd2lzZS5jb21wbGV0ZS5vYnMiKQ0KDQpnZ2NvcnJwbG90KGNvcl9tYXRyaXgsIA0KICAgICAgICAgICBoYy5vcmRlciA9IFRSVUUsIA0KICAgICAgICAgICB0eXBlID0gImxvd2VyIiwgDQogICAgICAgICAgIGxhYiA9IFRSVUUsDQogICAgICAgICAgIGNvbG9ycyA9IGMoInJlZCIsICJ3aGl0ZSIsICJncmVlbiIpKQ0KDQpgYGANCiMgSGlzdG9ncmFtcyBvZiBWYXJpYWJsZXMNCg0KYGBge3IgZWNobz1GQUxTRX0NCnN1bW1hcnkodCkNCmdncGxvdCh0LCBhZXMoeCA9IHByb2ZpY2llbmN5KSkgKyANCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDE1KSArIA0KICBsYWJzKHRpdGxlID0gIlNjaWVuY2UgUHJvZmljaWVuY3kgRGlzdHJpYnV0aW9uIikNCg0KZ2dwbG90KHQsIGFlcyh4ID0gZ3JhZHVhdGlvbl9yYXRlKSkgKyANCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDE1KSArIA0KICBsYWJzKHRpdGxlID0gIkdyYWR1YXRpb24gUmF0ZSBEaXN0cmlidXRpb24iKQ0KDQpgYGANCg0KIyBQQ0EgQW5hbHlzaXMNCg0KYGBge3IgZWNobz1GQUxTRX0NCnBjYV9kYXRhIDwtIHQgJT4lIHNlbGVjdCh3aGVyZShpcy5udW1lcmljKSkgJT4lIHNjYWxlKCkNCnBjYV9yZXN1bHQgPC0gcHJjb21wKHBjYV9kYXRhLCBjZW50ZXIgPSBUUlVFLCBzY2FsZS4gPSBUUlVFKQ0Kc3VtbWFyeShwY2FfcmVzdWx0KQ0KYmlwbG90KHBjYV9yZXN1bHQsIHNjYWxlID0gMCkNCmBgYA0KDQojIFN1cGVydmlzZWQgTW9kZWxzDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpzZXQuc2VlZCgxMjMpDQptb2RlbF9kYXRhIDwtIHQgJT4lIA0KICBzZWxlY3QocHJvZmljaWVuY3ksIGdyYWR1YXRpb25fcmF0ZSwgdW5lbXBsb3ltZW50X3JhdGUsIG1lZGlhbl9pbmNvbWUsIHBwY3N0b3QpICU+JSANCiAgZHJvcF9uYSgpDQoNCnNwbGl0IDwtIGNyZWF0ZURhdGFQYXJ0aXRpb24obW9kZWxfZGF0YSRwcm9maWNpZW5jeSwgcCA9IDAuOCwgbGlzdCA9IEZBTFNFKQ0KdHJhaW4gPC0gbW9kZWxfZGF0YVtzcGxpdCwgXQ0KdGVzdCA8LSBtb2RlbF9kYXRhWy1zcGxpdCwgXQ0KYGBgDQoNCiMgTGluZWFyIFJlZ3Jlc3Npb24gTW9kZWwNCg0KYGBge3IgZWNobz1GQUxTRX0NCmxtX21vZGVsIDwtIGxtKHByb2ZpY2llbmN5IH4gLiwgZGF0YSA9IHRyYWluKQ0Kc3VtbWFyeShsbV9tb2RlbCkNClJNU0UocHJlZGljdChsbV9tb2RlbCwgdGVzdCksIHRlc3QkcHJvZmljaWVuY3kpDQpgYGANCiMgRGF0YSBUcmVlDQoNCmBgYHtyIGVjaG89RkFMU0V9DQp0cmVlX21vZGVsIDwtIHJwYXJ0KHByb2ZpY2llbmN5IH4gLiwgZGF0YSA9IHRyYWluKQ0KcnBhcnQucGxvdCh0cmVlX21vZGVsKQ0KUk1TRShwcmVkaWN0KHRyZWVfbW9kZWwsIHRlc3QpLCB0ZXN0JHByb2ZpY2llbmN5KQ0KYGBgDQojIENhdXNlICYgRWZmZWN0IENoYXJ0DQoNCmBgYHtyIGVjaG89RkFMU0V9DQpnZ3Bsb3QodCwgYWVzKHggPSBtZWRpYW5faW5jb21lLCB5ID0gcHJvZmljaWVuY3kpKSArDQogIGdlb21fcG9pbnQoKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsNCiAgbGFicyh0aXRsZSA9ICJJbmNvbWUgdnMgUHJvZmljaWVuY3kiKQ0KYGBgDQojIFByb2ZpY2llbmN5IGJ5IENvdW50eSBpbiBXZXN0IFZpcmlnaW5pYQ0KDQpgYGB7dW5kZWZpbmVkIGVjaG89RkFMU0V9DQpsaWJyYXJ5KHVzbWFwKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIE1ha2Ugc3VyZSAnZmlwcycgaXMgcHJlc2VudCBhbmQgbnVtZXJpYyAocmVxdWlyZWQgYnkgdXNtYXApDQojIEFzc3VtZSAndCcgaGFzIGEgY29sdW1uIG5hbWVkICdGSVBTJyBvciBzaW1pbGFyDQp0IDwtIHQgJT4lDQogIG11dGF0ZShmaXBzID0gYXMuY2hhcmFjdGVyKEZJUFMpKSAgIyBvciBjaGFuZ2UgJ0ZJUFMnIHRvIHlvdXIgYWN0dWFsIGNvbHVtbg0KDQojIFBsb3QNCnBsb3RfdXNtYXAoZGF0YSA9IHQsIHJlZ2lvbnMgPSAiY291bnRpZXMiLCBpbmNsdWRlID0gIldWIiwgdmFsdWVzID0gInByb2ZpY2llbmN5IikgKw0KICBzY2FsZV9maWxsX2NvbnRpbnVvdXMobmFtZSA9ICJQcm9maWNpZW5jeSIsIGxvdyA9ICJyZWQiLCBoaWdoID0gImJsdWUiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsNCiAgbGFicyh0aXRsZSA9ICJQcm9maWNpZW5jeSBieSBDb3VudHkgaW4gV1YiKQ0KDQoNCmBgYA0KIyBDb25jbHVzaW9uIGFuZCBSZWNvbW1lbmRhdGlvbnMNCkNvbmNsdXNpb246DQotIFByb2ZpY2llbmN5IGlzIG1vc3Qgc3Ryb25nbHkgcmVsYXRlZCB0byBtZWRpYW4gaW5jb21lIGFuZCBncmFkdWF0aW9uIHJhdGUuDQotIFRvdGFsIHBlci1wdXBpbCBjb3N0IGhhZCB3ZWFrZXIgY29ycmVsYXRpb25zIHdpdGggb3V0Y29tZXMgdGhhbiBleHBlY3RlZC4NCi0gUENBIHN1Z2dlc3RzIGNvdW50aWVzIGZvcm0gY2x1c3RlcnMgYmFzZWQgb24gc29jaW8tZWNvbm9taWMgbWV0cmljcy4NCg0KUmVjb21tZW5kYXRpb25zOg0KLSBJbnZlc3QgaW4gc3VwcG9ydCBmb3IgbG93LWluY29tZSBjb3VudGllcy4NCi0gQWRkcmVzcyBzb2Npby1lY29ub21pYyBpbmVxdWl0aWVzIGFsb25nc2lkZSBlZHVjYXRpb25hbCBzcGVuZGluZy4NCg0KIyBSUHVicyBVUkwNCmh0dHBzOi8vcnB1YnMuY29tL2VmMDA1Mi8xMzA0Njc0DQoNCiMgUmVmZXJlbmNlcw0KR3JhZHVhdGlvbiBSYXRlIERhdGE6IGh0dHBzOi8vem9vbXd2LmsxMi53di51cy9EYXNoYm9hcmQvZGFzaGJvYXJkLzIxMTEgDQo=