Introduction

For this assignment, I used the data set “Students’ Academic Performance Data set” from Kaggle. This is an educational data set which is collected from learning management system (LMS) called Kalboard 360. The data is collected using a leaning activity tracker tool which is called experience API. The data set contains 480 student records of which 305 are male and 175 are female. There are a total of 16 features in this data set that are classified into three major categories: (1) Demographic features such as gender and nationality, (2) Academic background features such as educational stage, grade level and section, (3) Behavioral Features such as raised hand in class, viewing resources, answering survey by parents, and school satisfaction.

Research Question and Hypotheses

The purpose of this analysis is to determine what factors influence student performance in school. I used Ordered Logistic Regression models to predict student academic achievement. The dependent variable used in the models is “grades1” which is an ordered categorical dependent variable that has been ordered from lowest grade marks to highest grade marks. I am most interested in looking at the following variables: VisitedResources, StudentAbsenceDays, and gender to see which affects student grades the most and predict the differences in gender. I believe students who visit resources the most often will obtain high grade marks because this enables students to refresh their minds about the course content. Students who are serious and want to perform well in a course will continue to go back to the resources to learn much as possible about the course requirements and assignments. The number of times students visit resources will be positively correlated with high grade marks. I also suspect students who are absent under seven days will perform exceptionally well in school because they will be present for class most of the time to learn about the day’s lesson. Students who are absent under 7 days will will obtain high grades marks. Lastly, I predict males will perform well in school than females because in this data set, there are more males (305) than females (175).

Defining Variables

grades1: grade level of the student (Ordered Categorical Dependent Variable)

The students are classified into three numerical intervals based on their total grade/mark:

Low-Level: interval includes values from 0 to 69,

Middle-Level: interval includes values from 70 to 89,

High-Level: interval includes values from 90-100.

Student Absence Days: the number of absence days for each student (nominal: above-7, under-7)

Visited Resources: how many times the student visits a course content(numeric:0-100)

gender: whether the student is male of female

Importing and previewing the data set

library(readr)
Student_Academic_Data<-read_csv("C:\\Users\\Sangita Roy\\Desktop\\Student_Academic_Data.csv")
head(Student_Academic_Data)

Cleaning the data set

library(dplyr)
Student_Data1<- Student_Academic_Data %>% 
  rename(Nationality=NationalITy,
  VisitedResources=VisITedResources,
  Grades=Class) %>%
  mutate(grades1= factor(Grades, ordered=TRUE, levels=c("L", "M", "H")),
         gender = as.factor(gender),
         StudentAbsenceDays=as.factor(StudentAbsenceDays),
         StageID=as.factor(StageID)) %>%
  mutate(Relation=as.factor(Relation))
  head(Student_Data1)
unique(Student_Data1$grades1)
[1] M L H
Levels: L < M < H

Ordered Logistic Regression: Model1

library(ZeligChoice)
z.multi <- zelig(grades1 ~ VisitedResources + StudentAbsenceDays, model = "ologit", data = Student_Data1, cite = F)
summary(z.multi)
Model: 
Call:
z5$zelig(formula = grades1 ~ VisitedResources + StudentAbsenceDays, 
    data = Student_Data1)

Coefficients:
                            Value Std. Error t value
VisitedResources          0.04638    0.00441  10.515
StudentAbsenceDaysUnder-7 3.05166    0.31367   9.729

Intercepts:
    Value   Std. Error t value
L|M  2.1378  0.2391     8.9392
M|H  6.4703  0.4541    14.2480

Residual Deviance: 614.2876 
AIC: 622.2876 
Next step: Use 'setx' method

The first model using ordered logistic regression predicts students performance based on the number of times they visit the course content and the number of days they are absent which is either under or above 7 days. P-values were not shown in the models to indicate significance. I used “Social Science Statistics” to calculate the p-value from T score calculator. Results of Model1 are significant at p< .05. (The p-value is 0.00001 for Model1)

Ordered Logistic Regression: Model2

library(ZeligChoice)
z.multi2 <- zelig(grades1 ~ gender + StudentAbsenceDays, model = "ologit", data = Student_Data1, cite = F)
summary(z.multi2)
Model: 
Call:
z5$zelig(formula = grades1 ~ gender + StudentAbsenceDays, data = Student_Data1)

Coefficients:
                            Value Std. Error t value
genderM                   -0.6784     0.1938  -3.501
StudentAbsenceDaysUnder-7  3.5987     0.3005  11.977

Intercepts:
    Value   Std. Error t value
L|M -0.0723  0.2073    -0.3488
M|H  3.3226  0.3186    10.4278

Residual Deviance: 753.6634 
AIC: 761.6634 
Next step: Use 'setx' method

The second model using OLR shows the effect gender and the number of days absent in school has on student academic performance. Results are significant at p< .05. (P-value for gender is .000253 and p-value for the second independent variable is 0.00001)

Ordered Logistic Regression: Model3

library(ZeligChoice)
z.multi3 <- zelig(grades1 ~ VisitedResources + gender + StudentAbsenceDays, model = "ologit", data = Student_Data1, cite = F)
summary(z.multi3)
Model: 
Call:
z5$zelig(formula = grades1 ~ VisitedResources + gender + StudentAbsenceDays, 
    data = Student_Data1)

Coefficients:
                             Value Std. Error t value
VisitedResources           0.04584   0.004425  10.361
genderM                   -0.55759   0.216609  -2.574
StudentAbsenceDaysUnder-7  2.99097   0.313767   9.532

Intercepts:
    Value   Std. Error t value
L|M  1.6964  0.2887     5.8755
M|H  6.0678  0.4735    12.8157

Residual Deviance: 607.6281 
AIC: 617.6281 
Next step: Use 'setx' method

The third model predicts student academic performance based on the number of times they visit resources, gender and the number of days they are absent in school. Males are less likely of achieving academic success than females as shown above. Results are significant at p< .05. (P-value for Visited Resources and Student Absence Days under 7 is 0.00001 and .005176 for gender (M).)

Best-Fit Model

Based on the AIC and deviance values, Model3 is the best-fit model because it has the lowest AIC (617.63) and deviance (607.62) value compared to the other two models. This indicates that Model3 is a better predictor of student academic performance in school.

Testing student performance variations in the number of absent days differences using OLR (Best Fit Model)

x.below <- setx(z.multi3, StudentAbsenceDays = "Under-7")
x.above <- setx(z.multi3, StudentAbsenceDays = "Above-7")
s.multi3 <- sim(z.multi3, x = x.below, x1 = x.above)
summary(s.multi3)

 sim x :
 -----
ev
       mean         sd        50%         2.5%      97.5%
L 0.0391725 0.01183576 0.03759658 0.0223391393 0.06772869
M 0.6608589 0.24736272 0.70792347 0.1676966686 0.97213759
H 0.2999686 0.24060561 0.25514908 0.0008991979 0.77808061
pv
      mean        sd 50% 2.5% 97.5%
[1,] 2.281 0.5121536   2    1     3

 sim x1 :
 -----
ev
        mean         sd        50%         2.5%     97.5%
L 0.43509246 0.04917877 0.43552148 3.405390e-01 0.5330134
M 0.52527322 0.07256877 0.53042908 3.473244e-01 0.6461057
H 0.03963432 0.05555243 0.01678055 3.727199e-05 0.2073550
pv
      mean        sd 50% 2.5% 97.5%
[1,] 1.606 0.5754086   2    1     3
fd
        mean         sd        50%       2.5%         97.5%
L  0.3959200 0.04768416  0.3953971  0.3026185  0.4879053248
M -0.1355857 0.20299326 -0.1612539 -0.4461711  0.2167258008
H -0.2603343 0.19583783 -0.2353921 -0.5969084 -0.0008715503

The table above shows the simulated probabilities of the three grades for the two counter-factual situations which is the number of days absent in school, under or above 7 days. The probability of students obtaining a high grade mark if they are absent under 7 days is 30% whereas the probability of obtaining a high grade mark significantly decreases to 4% for students absent above 7 days. The probability of students obtaining a low grade mark in school is greater (44%) when they are absent above 7 days than under 7 days (4%). The difference between the predicted probability of obtaining high grades is -.26 between these two counter-factual situations. In other words, students are 26% less likely of achieving high grade marks when absent for above 7 days than students who are absent under 7 days.

plot(s.multi3)

The variation of the grade levels is very wide as shown in the graphs. This is probably because there are only 480 observations in this data set.

Testing student performance variations in gender differences using OLR

x.male <- setx(z.multi3, gender = "M")
x.female <- setx(z.multi3, gender = "F")
s.multi4 <- sim(z.multi3, x = x.male, x1 = x.female)
summary(s.multi4)

 sim x :
 -----
ev
        mean         sd        50%         2.5%      97.5%
L 0.03848613 0.01128416 0.03656384 0.0217086566 0.06438851
M 0.68482162 0.24173246 0.74002732 0.1975581167 0.97477881
H 0.27669225 0.23522404 0.21971781 0.0004277427 0.74964619
pv
      mean        sd 50% 2.5% 97.5%
[1,] 2.254 0.5155092   2    1     3

 sim x1 :
 -----
ev
        mean          sd       50%         2.5%      97.5%
L 0.02291007 0.007720657 0.0213892 0.0120233568 0.04143212
M 0.61374448 0.281678064 0.6496070 0.1165496809 0.98296703
H 0.36334545 0.279471962 0.3309653 0.0006863242 0.85868700
pv
      mean        sd 50% 2.5% 97.5%
[1,] 2.336 0.5131933   2    2     3
fd
         mean          sd         50%          2.5%        97.5%
L -0.01557606 0.007244134 -0.01467321 -0.0323113456 -0.003507497
M -0.07107714 0.059148852 -0.06810749 -0.1892625388  0.011021669
H  0.08665321 0.064012412  0.08422758  0.0001008528  0.215577104

Next, I wanted to view the student performance variations between males and females. The probability of males obtaining high grade marks is 28% whereas the probability for females performing well in school is 36%. The simulated difference in the probability for obtaining high grade marks between males and females is 0.08. In other words, females are 8% more likely of obtaining high grades than males. On the other hand, females are 8% less likely of obtaining middle-level grade marks than males.

plot(s.multi4)

Conclusion

In conclusion, students who are absent under 7 days have a higher probability of achieving high grades in school than students who are absent above 7 days as predicted. However, females have a higher probability of achieving academic success than males. A probable explanation is that since there are fewer females in this data set, females are more serious about achieving academic success to make their own careers.

Sources

Amrieh, E. A., Hamtini, T., & Aljarah, I. (2016). Mining Educational Data to Predict Student’s academic Performance using Ensemble Methods. International Journal of Database Theory and Application, 9(8), 119-136.

Amrieh, E. A., Hamtini, T., & Aljarah, I. (2015, November). Preprocessing and analyzing educational data set using X-API for improving student’s performance. In Applied Electrical Engineering and Computing Technologies (AEECT), 2015 IEEE Jordan Conference on (pp. 1-5). IEEE.

LS0tDQp0aXRsZTogIiMqKldoYXQgRmFjdG9ycyBJbmZsdWVuY2UgU3R1ZGVudCBBY2FkZW1pYyBBY2hpZXZlbWVudD8qKiINCmF1dGhvcjogIlNhbmdpdGEgUm95Ig0KRGF0ZTogIk1hcmNoIDI1LCAyMDE4Ig0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyMqKkludHJvZHVjdGlvbioqDQoNCkZvciB0aGlzIGFzc2lnbm1lbnQsIEkgdXNlZCB0aGUgZGF0YSBzZXQgIlN0dWRlbnRzJyBBY2FkZW1pYyBQZXJmb3JtYW5jZSBEYXRhIHNldCIgZnJvbSBLYWdnbGUuIFRoaXMgaXMgYW4gZWR1Y2F0aW9uYWwgZGF0YSBzZXQgd2hpY2ggaXMgY29sbGVjdGVkIGZyb20gbGVhcm5pbmcgbWFuYWdlbWVudCBzeXN0ZW0gKExNUykgY2FsbGVkIEthbGJvYXJkIDM2MC4gVGhlIGRhdGEgaXMgY29sbGVjdGVkIHVzaW5nIGEgbGVhbmluZyBhY3Rpdml0eSB0cmFja2VyIHRvb2wgd2hpY2ggaXMgY2FsbGVkIGV4cGVyaWVuY2UgQVBJLiBUaGUgZGF0YSBzZXQgY29udGFpbnMgNDgwIHN0dWRlbnQgcmVjb3JkcyBvZiB3aGljaCAzMDUgYXJlIG1hbGUgYW5kIDE3NSBhcmUgZmVtYWxlLiBUaGVyZSBhcmUgYSB0b3RhbCBvZiAxNiBmZWF0dXJlcyBpbiB0aGlzIGRhdGEgc2V0IHRoYXQgYXJlIGNsYXNzaWZpZWQgaW50byB0aHJlZSBtYWpvciBjYXRlZ29yaWVzOiAoMSkgRGVtb2dyYXBoaWMgZmVhdHVyZXMgc3VjaCBhcyBnZW5kZXIgYW5kIG5hdGlvbmFsaXR5LCAoMikgQWNhZGVtaWMgYmFja2dyb3VuZCBmZWF0dXJlcyBzdWNoIGFzIGVkdWNhdGlvbmFsIHN0YWdlLCBncmFkZSBsZXZlbCBhbmQgc2VjdGlvbiwgKDMpIEJlaGF2aW9yYWwgRmVhdHVyZXMgc3VjaCBhcyByYWlzZWQgaGFuZCBpbiBjbGFzcywgdmlld2luZyByZXNvdXJjZXMsIGFuc3dlcmluZyBzdXJ2ZXkgYnkgcGFyZW50cywgYW5kIHNjaG9vbCBzYXRpc2ZhY3Rpb24uDQoNCiMjKipSZXNlYXJjaCBRdWVzdGlvbiBhbmQgSHlwb3RoZXNlcyoqDQoNClRoZSBwdXJwb3NlIG9mIHRoaXMgYW5hbHlzaXMgaXMgdG8gZGV0ZXJtaW5lIHdoYXQgZmFjdG9ycyBpbmZsdWVuY2Ugc3R1ZGVudCBwZXJmb3JtYW5jZSBpbiBzY2hvb2wuIEkgdXNlZCBPcmRlcmVkIExvZ2lzdGljIFJlZ3Jlc3Npb24gbW9kZWxzIHRvIHByZWRpY3Qgc3R1ZGVudCBhY2FkZW1pYyBhY2hpZXZlbWVudC4gVGhlIGRlcGVuZGVudCB2YXJpYWJsZSB1c2VkIGluIHRoZSBtb2RlbHMgaXMgImdyYWRlczEiIHdoaWNoIGlzIGFuIG9yZGVyZWQgY2F0ZWdvcmljYWwgZGVwZW5kZW50IHZhcmlhYmxlIHRoYXQgaGFzIGJlZW4gb3JkZXJlZCBmcm9tIGxvd2VzdCBncmFkZSBtYXJrcyB0byBoaWdoZXN0IGdyYWRlIG1hcmtzLiBJIGFtIG1vc3QgaW50ZXJlc3RlZCBpbiBsb29raW5nIGF0IHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOiBWaXNpdGVkUmVzb3VyY2VzLCBTdHVkZW50QWJzZW5jZURheXMsIGFuZCBnZW5kZXIgdG8gc2VlIHdoaWNoIGFmZmVjdHMgc3R1ZGVudCBncmFkZXMgdGhlIG1vc3QgYW5kIHByZWRpY3QgdGhlIGRpZmZlcmVuY2VzIGluIGdlbmRlci4gSSBiZWxpZXZlIHN0dWRlbnRzIHdobyB2aXNpdCByZXNvdXJjZXMgdGhlIG1vc3Qgb2Z0ZW4gd2lsbCBvYnRhaW4gaGlnaCBncmFkZSBtYXJrcyBiZWNhdXNlIHRoaXMgZW5hYmxlcyBzdHVkZW50cyB0byByZWZyZXNoIHRoZWlyIG1pbmRzIGFib3V0IHRoZSBjb3Vyc2UgY29udGVudC4gU3R1ZGVudHMgd2hvIGFyZSBzZXJpb3VzIGFuZCB3YW50IHRvIHBlcmZvcm0gd2VsbCBpbiBhIGNvdXJzZSB3aWxsIGNvbnRpbnVlIHRvIGdvIGJhY2sgdG8gdGhlIHJlc291cmNlcyB0byBsZWFybiBtdWNoIGFzIHBvc3NpYmxlIGFib3V0IHRoZSBjb3Vyc2UgcmVxdWlyZW1lbnRzIGFuZCBhc3NpZ25tZW50cy4gVGhlIG51bWJlciBvZiB0aW1lcyBzdHVkZW50cyB2aXNpdCByZXNvdXJjZXMgd2lsbCBiZSBwb3NpdGl2ZWx5IGNvcnJlbGF0ZWQgd2l0aCBoaWdoIGdyYWRlIG1hcmtzLiBJIGFsc28gc3VzcGVjdCBzdHVkZW50cyB3aG8gYXJlIGFic2VudCB1bmRlciBzZXZlbiBkYXlzIHdpbGwgcGVyZm9ybSBleGNlcHRpb25hbGx5IHdlbGwgaW4gc2Nob29sIGJlY2F1c2UgdGhleSB3aWxsIGJlIHByZXNlbnQgZm9yIGNsYXNzIG1vc3Qgb2YgdGhlIHRpbWUgdG8gbGVhcm4gYWJvdXQgdGhlIGRheSdzIGxlc3Nvbi4gU3R1ZGVudHMgd2hvIGFyZSBhYnNlbnQgdW5kZXIgNyBkYXlzIHdpbGwgd2lsbCBvYnRhaW4gaGlnaCBncmFkZXMgbWFya3MuIExhc3RseSwgSSBwcmVkaWN0IG1hbGVzIHdpbGwgcGVyZm9ybSB3ZWxsIGluIHNjaG9vbCB0aGFuIGZlbWFsZXMgYmVjYXVzZSBpbiB0aGlzIGRhdGEgc2V0LCB0aGVyZSBhcmUgbW9yZSBtYWxlcyAoMzA1KSB0aGFuIGZlbWFsZXMgKDE3NSkuDQoNCg0KIyNEZWZpbmluZyBWYXJpYWJsZXMNCg0KKipncmFkZXMxKio6IGdyYWRlIGxldmVsIG9mIHRoZSBzdHVkZW50IChPcmRlcmVkIENhdGVnb3JpY2FsIERlcGVuZGVudCBWYXJpYWJsZSkgDQoNClRoZSBzdHVkZW50cyBhcmUgY2xhc3NpZmllZCBpbnRvIHRocmVlIG51bWVyaWNhbCBpbnRlcnZhbHMgYmFzZWQgb24gdGhlaXIgdG90YWwgZ3JhZGUvbWFyazoNCg0KTG93LUxldmVsOiBpbnRlcnZhbCBpbmNsdWRlcyB2YWx1ZXMgZnJvbSAwIHRvIDY5LA0KDQpNaWRkbGUtTGV2ZWw6IGludGVydmFsIGluY2x1ZGVzIHZhbHVlcyBmcm9tIDcwIHRvIDg5LA0KDQpIaWdoLUxldmVsOiBpbnRlcnZhbCBpbmNsdWRlcyB2YWx1ZXMgZnJvbSA5MC0xMDAuDQoNCioqU3R1ZGVudCBBYnNlbmNlIERheXMqKjogdGhlIG51bWJlciBvZiBhYnNlbmNlIGRheXMgZm9yIGVhY2ggc3R1ZGVudCAobm9taW5hbDogYWJvdmUtNywgdW5kZXItNykNCg0KKipWaXNpdGVkIFJlc291cmNlcyoqOiBob3cgbWFueSB0aW1lcyB0aGUgc3R1ZGVudCB2aXNpdHMgYSBjb3Vyc2UgY29udGVudChudW1lcmljOjAtMTAwKQ0KDQoqKmdlbmRlcioqOiB3aGV0aGVyIHRoZSBzdHVkZW50IGlzIG1hbGUgb2YgZmVtYWxlDQoNCg0KIyNJbXBvcnRpbmcgYW5kIHByZXZpZXdpbmcgdGhlIGRhdGEgc2V0DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShyZWFkcikNClN0dWRlbnRfQWNhZGVtaWNfRGF0YTwtcmVhZF9jc3YoIkM6XFxVc2Vyc1xcU2FuZ2l0YSBSb3lcXERlc2t0b3BcXFN0dWRlbnRfQWNhZGVtaWNfRGF0YS5jc3YiKQ0KaGVhZChTdHVkZW50X0FjYWRlbWljX0RhdGEpDQpgYGANCg0KIyNDbGVhbmluZyB0aGUgZGF0YSBzZXQNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGRwbHlyKQ0KU3R1ZGVudF9EYXRhMTwtIFN0dWRlbnRfQWNhZGVtaWNfRGF0YSAlPiUgDQogIHJlbmFtZShOYXRpb25hbGl0eT1OYXRpb25hbElUeSwNCiAgVmlzaXRlZFJlc291cmNlcz1WaXNJVGVkUmVzb3VyY2VzLA0KICBHcmFkZXM9Q2xhc3MpICU+JQ0KICBtdXRhdGUoZ3JhZGVzMT0gZmFjdG9yKEdyYWRlcywgb3JkZXJlZD1UUlVFLCBsZXZlbHM9YygiTCIsICJNIiwgIkgiKSksDQogICAgICAgICBnZW5kZXIgPSBhcy5mYWN0b3IoZ2VuZGVyKSwNCiAgICAgICAgIFN0dWRlbnRBYnNlbmNlRGF5cz1hcy5mYWN0b3IoU3R1ZGVudEFic2VuY2VEYXlzKSwNCiAgICAgICAgIFN0YWdlSUQ9YXMuZmFjdG9yKFN0YWdlSUQpKSAlPiUNCiAgbXV0YXRlKFJlbGF0aW9uPWFzLmZhY3RvcihSZWxhdGlvbikpDQoNCiAgaGVhZChTdHVkZW50X0RhdGExKQ0KYGBgDQoNCmBgYHtyfQ0KdW5pcXVlKFN0dWRlbnRfRGF0YTEkZ3JhZGVzMSkNCmBgYA0KDQojI09yZGVyZWQgTG9naXN0aWMgUmVncmVzc2lvbjogTW9kZWwxDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShaZWxpZ0Nob2ljZSkNCnoubXVsdGkgPC0gemVsaWcoZ3JhZGVzMSB+IFZpc2l0ZWRSZXNvdXJjZXMgKyBTdHVkZW50QWJzZW5jZURheXMsIG1vZGVsID0gIm9sb2dpdCIsIGRhdGEgPSBTdHVkZW50X0RhdGExLCBjaXRlID0gRikNCnN1bW1hcnkoei5tdWx0aSkNCmBgYA0KVGhlIGZpcnN0IG1vZGVsIHVzaW5nIG9yZGVyZWQgbG9naXN0aWMgcmVncmVzc2lvbiBwcmVkaWN0cyBzdHVkZW50cyBwZXJmb3JtYW5jZSBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZXkgdmlzaXQgdGhlIGNvdXJzZSBjb250ZW50IGFuZCB0aGUgbnVtYmVyIG9mIGRheXMgdGhleSBhcmUgYWJzZW50IHdoaWNoIGlzIGVpdGhlciB1bmRlciBvciBhYm92ZSA3IGRheXMuIFAtdmFsdWVzIHdlcmUgbm90IHNob3duIGluIHRoZSBtb2RlbHMgdG8gaW5kaWNhdGUgc2lnbmlmaWNhbmNlLiBJIHVzZWQgIlNvY2lhbCBTY2llbmNlIFN0YXRpc3RpY3MiIHRvIGNhbGN1bGF0ZSB0aGUgcC12YWx1ZSBmcm9tIFQgc2NvcmUgY2FsY3VsYXRvci4gUmVzdWx0cyBvZiBNb2RlbDEgYXJlIHNpZ25pZmljYW50IGF0IHA8IC4wNS4gKFRoZSBwLXZhbHVlIGlzIDAuMDAwMDEgZm9yIE1vZGVsMSkNCg0KIyNPcmRlcmVkIExvZ2lzdGljIFJlZ3Jlc3Npb246IE1vZGVsMg0KYGBge3J9DQpsaWJyYXJ5KFplbGlnQ2hvaWNlKQ0Kei5tdWx0aTIgPC0gemVsaWcoZ3JhZGVzMSB+IGdlbmRlciArIFN0dWRlbnRBYnNlbmNlRGF5cywgbW9kZWwgPSAib2xvZ2l0IiwgZGF0YSA9IFN0dWRlbnRfRGF0YTEsIGNpdGUgPSBGKQ0Kc3VtbWFyeSh6Lm11bHRpMikNCmBgYA0KVGhlIHNlY29uZCBtb2RlbCB1c2luZyBPTFIgc2hvd3MgdGhlIGVmZmVjdCBnZW5kZXIgYW5kIHRoZSBudW1iZXIgb2YgZGF5cyBhYnNlbnQgaW4gc2Nob29sIGhhcyBvbiBzdHVkZW50IGFjYWRlbWljIHBlcmZvcm1hbmNlLiBSZXN1bHRzIGFyZSBzaWduaWZpY2FudCBhdCBwPCAuMDUuIChQLXZhbHVlIGZvciBnZW5kZXIgaXMgLjAwMDI1MyBhbmQgcC12YWx1ZSBmb3IgdGhlIHNlY29uZCBpbmRlcGVuZGVudCB2YXJpYWJsZSBpcyAwLjAwMDAxKQ0KDQojI09yZGVyZWQgTG9naXN0aWMgUmVncmVzc2lvbjogTW9kZWwzDQpgYGB7cn0NCmxpYnJhcnkoWmVsaWdDaG9pY2UpDQp6Lm11bHRpMyA8LSB6ZWxpZyhncmFkZXMxIH4gVmlzaXRlZFJlc291cmNlcyArIGdlbmRlciArIFN0dWRlbnRBYnNlbmNlRGF5cywgbW9kZWwgPSAib2xvZ2l0IiwgZGF0YSA9IFN0dWRlbnRfRGF0YTEsIGNpdGUgPSBGKQ0Kc3VtbWFyeSh6Lm11bHRpMykNCmBgYA0KVGhlIHRoaXJkIG1vZGVsIHByZWRpY3RzIHN0dWRlbnQgYWNhZGVtaWMgcGVyZm9ybWFuY2UgYmFzZWQgb24gdGhlIG51bWJlciBvZiB0aW1lcyB0aGV5IHZpc2l0IHJlc291cmNlcywgZ2VuZGVyIGFuZCB0aGUgbnVtYmVyIG9mIGRheXMgdGhleSBhcmUgYWJzZW50IGluIHNjaG9vbC4gTWFsZXMgYXJlIGxlc3MgbGlrZWx5IG9mIGFjaGlldmluZyBhY2FkZW1pYyBzdWNjZXNzIHRoYW4gZmVtYWxlcyBhcyBzaG93biBhYm92ZS4gUmVzdWx0cyBhcmUgc2lnbmlmaWNhbnQgYXQgcDwgLjA1LiAoUC12YWx1ZSBmb3IgVmlzaXRlZCBSZXNvdXJjZXMgYW5kIFN0dWRlbnQgQWJzZW5jZSBEYXlzIHVuZGVyIDcgaXMgMC4wMDAwMSBhbmQgLjAwNTE3NiBmb3IgZ2VuZGVyIChNKS4pDQoNCiMjI0Jlc3QtRml0IE1vZGVsDQpCYXNlZCBvbiB0aGUgQUlDIGFuZCBkZXZpYW5jZSB2YWx1ZXMsIE1vZGVsMyBpcyB0aGUgYmVzdC1maXQgbW9kZWwgYmVjYXVzZSBpdCBoYXMgdGhlIGxvd2VzdCBBSUMgKDYxNy42MykgYW5kIGRldmlhbmNlICg2MDcuNjIpIHZhbHVlIGNvbXBhcmVkIHRvIHRoZSBvdGhlciB0d28gbW9kZWxzLiBUaGlzIGluZGljYXRlcyB0aGF0IE1vZGVsMyBpcyBhIGJldHRlciBwcmVkaWN0b3Igb2Ygc3R1ZGVudCBhY2FkZW1pYyBwZXJmb3JtYW5jZSBpbiBzY2hvb2wuDQoNCiMjVGVzdGluZyBzdHVkZW50IHBlcmZvcm1hbmNlIHZhcmlhdGlvbnMgaW4gdGhlIG51bWJlciBvZiBhYnNlbnQgZGF5cyBkaWZmZXJlbmNlcyB1c2luZyBPTFIgKEJlc3QgRml0IE1vZGVsKQ0KYGBge3J9DQp4LmJlbG93IDwtIHNldHgoei5tdWx0aTMsIFN0dWRlbnRBYnNlbmNlRGF5cyA9ICJVbmRlci03IikNCnguYWJvdmUgPC0gc2V0eCh6Lm11bHRpMywgU3R1ZGVudEFic2VuY2VEYXlzID0gIkFib3ZlLTciKQ0Kcy5tdWx0aTMgPC0gc2ltKHoubXVsdGkzLCB4ID0geC5iZWxvdywgeDEgPSB4LmFib3ZlKQ0Kc3VtbWFyeShzLm11bHRpMykNCmBgYA0KVGhlIHRhYmxlIGFib3ZlIHNob3dzIHRoZSBzaW11bGF0ZWQgcHJvYmFiaWxpdGllcyBvZiB0aGUgdGhyZWUgZ3JhZGVzIGZvciB0aGUgdHdvIGNvdW50ZXItZmFjdHVhbCBzaXR1YXRpb25zIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgZGF5cyBhYnNlbnQgaW4gc2Nob29sLCB1bmRlciBvciBhYm92ZSA3IGRheXMuIFRoZSBwcm9iYWJpbGl0eSBvZiBzdHVkZW50cyBvYnRhaW5pbmcgYSBoaWdoIGdyYWRlIG1hcmsgaWYgdGhleSBhcmUgYWJzZW50IHVuZGVyIDcgZGF5cyBpcyAzMCUgd2hlcmVhcyB0aGUgcHJvYmFiaWxpdHkgb2Ygb2J0YWluaW5nIGEgaGlnaCBncmFkZSBtYXJrIHNpZ25pZmljYW50bHkgZGVjcmVhc2VzIHRvIDQlIGZvciBzdHVkZW50cyBhYnNlbnQgYWJvdmUgNyBkYXlzLiBUaGUgcHJvYmFiaWxpdHkgb2Ygc3R1ZGVudHMgb2J0YWluaW5nIGEgbG93IGdyYWRlIG1hcmsgaW4gc2Nob29sIGlzIGdyZWF0ZXIgKDQ0JSkgd2hlbiB0aGV5IGFyZSBhYnNlbnQgYWJvdmUgNyBkYXlzIHRoYW4gdW5kZXIgNyBkYXlzICg0JSkuIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHByZWRpY3RlZCBwcm9iYWJpbGl0eSBvZiBvYnRhaW5pbmcgaGlnaCBncmFkZXMgaXMgLS4yNiBiZXR3ZWVuIHRoZXNlIHR3byBjb3VudGVyLWZhY3R1YWwgc2l0dWF0aW9ucy4gSW4gb3RoZXIgd29yZHMsIHN0dWRlbnRzIGFyZSAyNiUgbGVzcyBsaWtlbHkgb2YgYWNoaWV2aW5nIGhpZ2ggZ3JhZGUgbWFya3Mgd2hlbiBhYnNlbnQgZm9yIGFib3ZlIDcgZGF5cyB0aGFuIHN0dWRlbnRzIHdobyBhcmUgYWJzZW50IHVuZGVyIDcgZGF5cy4NCg0KYGBge3IgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTEwfQ0KcGxvdChzLm11bHRpMykNCmBgYA0KVGhlIHZhcmlhdGlvbiBvZiB0aGUgZ3JhZGUgbGV2ZWxzIGlzIHZlcnkgd2lkZSBhcyBzaG93biBpbiB0aGUgZ3JhcGhzLiBUaGlzIGlzIHByb2JhYmx5IGJlY2F1c2UgdGhlcmUgYXJlIG9ubHkgNDgwIG9ic2VydmF0aW9ucyBpbiB0aGlzIGRhdGEgc2V0Lg0KDQoNCiMjVGVzdGluZyBzdHVkZW50IHBlcmZvcm1hbmNlIHZhcmlhdGlvbnMgaW4gZ2VuZGVyIGRpZmZlcmVuY2VzIHVzaW5nIE9MUg0KYGBge3J9DQp4Lm1hbGUgPC0gc2V0eCh6Lm11bHRpMywgZ2VuZGVyID0gIk0iKQ0KeC5mZW1hbGUgPC0gc2V0eCh6Lm11bHRpMywgZ2VuZGVyID0gIkYiKQ0Kcy5tdWx0aTQgPC0gc2ltKHoubXVsdGkzLCB4ID0geC5tYWxlLCB4MSA9IHguZmVtYWxlKQ0Kc3VtbWFyeShzLm11bHRpNCkNCmBgYA0KTmV4dCwgSSB3YW50ZWQgdG8gdmlldyB0aGUgc3R1ZGVudCBwZXJmb3JtYW5jZSB2YXJpYXRpb25zIGJldHdlZW4gbWFsZXMgYW5kIGZlbWFsZXMuIFRoZSBwcm9iYWJpbGl0eSBvZiBtYWxlcyBvYnRhaW5pbmcgaGlnaCBncmFkZSBtYXJrcyBpcyAyOCUgd2hlcmVhcyB0aGUgcHJvYmFiaWxpdHkgZm9yIGZlbWFsZXMgcGVyZm9ybWluZyB3ZWxsIGluIHNjaG9vbCBpcyAzNiUuIFRoZSBzaW11bGF0ZWQgZGlmZmVyZW5jZSBpbiB0aGUgcHJvYmFiaWxpdHkgZm9yIG9idGFpbmluZyBoaWdoIGdyYWRlIG1hcmtzIGJldHdlZW4gbWFsZXMgYW5kIGZlbWFsZXMgaXMgMC4wOC4gSW4gb3RoZXIgd29yZHMsIGZlbWFsZXMgYXJlIDglIG1vcmUgbGlrZWx5IG9mIG9idGFpbmluZyBoaWdoIGdyYWRlcyB0aGFuIG1hbGVzLiBPbiB0aGUgb3RoZXIgaGFuZCwgZmVtYWxlcyBhcmUgOCUgbGVzcyBsaWtlbHkgb2Ygb2J0YWluaW5nIG1pZGRsZS1sZXZlbCBncmFkZSBtYXJrcyB0aGFuIG1hbGVzLiANCg0KYGBge3IgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTEwfQ0KcGxvdChzLm11bHRpNCkNCmBgYA0KDQojIyoqQ29uY2x1c2lvbioqDQpJbiBjb25jbHVzaW9uLCBzdHVkZW50cyB3aG8gYXJlIGFic2VudCB1bmRlciA3IGRheXMgaGF2ZSBhIGhpZ2hlciBwcm9iYWJpbGl0eSBvZiBhY2hpZXZpbmcgaGlnaCBncmFkZXMgaW4gc2Nob29sIHRoYW4gc3R1ZGVudHMgd2hvIGFyZSBhYnNlbnQgYWJvdmUgNyBkYXlzIGFzIHByZWRpY3RlZC4gSG93ZXZlciwgZmVtYWxlcyBoYXZlIGEgaGlnaGVyIHByb2JhYmlsaXR5IG9mIGFjaGlldmluZyBhY2FkZW1pYyBzdWNjZXNzIHRoYW4gbWFsZXMuIEEgcHJvYmFibGUgZXhwbGFuYXRpb24gaXMgdGhhdCBzaW5jZSB0aGVyZSBhcmUgZmV3ZXIgZmVtYWxlcyBpbiB0aGlzIGRhdGEgc2V0LCBmZW1hbGVzIGFyZSBtb3JlIHNlcmlvdXMgYWJvdXQgYWNoaWV2aW5nIGFjYWRlbWljIHN1Y2Nlc3MgdG8gbWFrZSB0aGVpciBvd24gY2FyZWVycy4gDQoNCg0KIyMqKlNvdXJjZXMqKg0KQW1yaWVoLCBFLiBBLiwgSGFtdGluaSwgVC4sICYgQWxqYXJhaCwgSS4gKDIwMTYpLiBNaW5pbmcgRWR1Y2F0aW9uYWwgRGF0YSB0byBQcmVkaWN0IFN0dWRlbnQncyBhY2FkZW1pYyBQZXJmb3JtYW5jZSB1c2luZyBFbnNlbWJsZSBNZXRob2RzLiBJbnRlcm5hdGlvbmFsIEpvdXJuYWwgb2YgRGF0YWJhc2UgVGhlb3J5IGFuZCBBcHBsaWNhdGlvbiwgOSg4KSwgMTE5LTEzNi4NCg0KQW1yaWVoLCBFLiBBLiwgSGFtdGluaSwgVC4sICYgQWxqYXJhaCwgSS4gKDIwMTUsIE5vdmVtYmVyKS4gUHJlcHJvY2Vzc2luZyBhbmQgYW5hbHl6aW5nIGVkdWNhdGlvbmFsIGRhdGEgc2V0IHVzaW5nIFgtQVBJIGZvciBpbXByb3Zpbmcgc3R1ZGVudCdzIHBlcmZvcm1hbmNlLiBJbiBBcHBsaWVkIEVsZWN0cmljYWwgRW5naW5lZXJpbmcgYW5kIENvbXB1dGluZyBUZWNobm9sb2dpZXMgKEFFRUNUKSwgMjAxNSBJRUVFIEpvcmRhbiBDb25mZXJlbmNlIG9uIChwcC4gMS01KS4gSUVFRS4NCg==