Using Linear Regression to predict the total 3-month salary for 100 respondents from the ANZ datasets

Data from InsideSherpa Virtual Internship https://www.insidesherpa.com/modules/ZLJCsrpkHo9pZBJNY/BnwCTubtx8NW5W5Kr

Summary of Results

Model 2 has an F-statistic of 6011.491 and a p-value of <2.2e^-16 less than the alpha level of 0.05, therefore we conclude that the model is a good predictor of salary and these results are significant and less likely to be due to chance.

Model2 Multiple Linear Regression

l_salary=1.233+0.111(No_payments)+0.983(Age)+0.011(Gender)

Subset of Dataset used for regression analysis

Variables chosen for Analysis

After filtering the data, to include only observations with credit transactions, there were 883 observations for 100 unique customers left,

THe data was summarized to find the total number of credit transactions for each individual customer_id.

[1]  2 14

Questions guiding my analysis

Range indicates that the respondents had between two and 14 credit transactions.

1.Why are some people paid more than once a month? Eg. Abigail had 13 credit transactions while Alexander had 6 credit transactions?

2.Why did not some people receive a payment in a month? Eg. Diana was paid a weekly amount of 1,013.67 AUD during the 3-month period-at total of 13 payments. While, Ronald had only two transactions 6,111.57 AUD in September and 10,753.02 AUD in October.

3.Are the respondents with fewer credit payments freelance consultants while the respondents with more credit payments salaried employees?

4.Do the people work in the same place?

Performing Simple Linear Regression Salary~Average_Salary

Explanation of model1 Salary versus Number of Payments

Beta-nought=when no_payments is zero, the average salary is 17,434 AUD

Beta1= For every one unit increase in the no_payments, the average salary would decrease by 55.74 AUD Rsquared= 0.08%

The very low F-statistic, 0.7174 and the p-value= 0.397 indicate that at the alpha level of 0.05, there is no correlation between the no_payments and the salary of respondents.

Thus, we can conclude that there is no significant a relationship between no_payments and the salary of respondents.

model1=lm(salary~no_payments, data=pay2)
summary(model1)

Call:
lm(formula = salary ~ no_payments, data = pay2)

Residuals:
   Min     1Q Median     3Q    Max 
 -9608  -5108  -1904   4569  18133 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 17434.25     717.24  24.307   <2e-16 ***
no_payments   -55.84      65.93  -0.847    0.397    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6714 on 881 degrees of freedom
Multiple R-squared:  0.0008136, Adjusted R-squared:  -0.0003205 
F-statistic: 0.7174 on 1 and 881 DF,  p-value: 0.3972

Confidence Interval for Model1

Confidence interval of beta1 for Model1, no_payments is (-185, 73). Since zero 0 is in the middle of the interval, the results are not significant, evidenced by low t-statistic =-0.847 and the p-value = 0.3972 meaning that we are likely to observe such a (substantial) association between no_payments and salary by chance.

                 2.5 %      97.5 %
(Intercept) 16026.5556 18841.94903
no_payments  -185.2392    73.55536
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using method = 'loess' and formula 'y ~ x'
`geom_smooth()` using method = 'loess' and formula 'y ~ x'

Residuals versus Fitted plot

The Residuals versus Fitted plot for the simple linear regression model above shows that number of credit payments is not linearly related to the total 3-month salary.

Also from the model summary above the R-squared value was 0.08% meaning that number of payments only explained 0.08% of the variation in the salary.

Thus, the next step to find the appropriate model is add more independent variables to explain the variation in the salary.


Plotting histograms of salary, average 3-month salary, age and number of credit transactions showed that these variables needed to be transformed using the natural log to approximate a normal distribution.

`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Histograms after natural log transformations of total 3-month Salary and average 3-month salary

`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Histograms after natural log transformations of Age and Number if Credit payments

Multiple Linear Regression

Multiple Linear Regression=ln (total_3_month_Salary)~ln(Number of credit transactions)+ln(average_3_month_salary)+ln(age)+gender

l_salary=1.233+0.111(No_payments)+0.983(Age)+0.011(Gender)

model2=lm(l_salary~no_payments+l_avg_salary+age+gender, data=pay2)

summary(model2)

Call:
lm(formula = l_salary ~ no_payments + l_avg_salary + age + gender, 
    data = pay2)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.62821 -0.00931  0.00337  0.01709  0.07246 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  1.2330488  0.0568215  21.700   <2e-16 ***
no_payments  0.1113100  0.0010231 108.799   <2e-16 ***
l_avg_salary 0.9830141  0.0064506 152.390   <2e-16 ***
age          0.0001063  0.0002020   0.526   0.5990    
genderM      0.0109763  0.0049655   2.211   0.0273 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.07179 on 878 degrees of freedom
Multiple R-squared:  0.9648,    Adjusted R-squared:  0.9646 
F-statistic:  6011 on 4 and 878 DF,  p-value: < 2.2e-16
plot(model2)

Explanation of Multiple Linear Regression results

Residuals versus Fitted plot The points are gathered randomly around the residual= 0 line indicating that the assumption that there is a linear relationship between the response variable (Salary) and the Predictor variables is reasonable.

However, the points around(10,-0.6) show that there are outliers in the data.

Normal Q-Q Plot The Normal Q-Q Plot shows that there are a lot of negative residual values. Since the relationship between the Standardized and theoretical residuals is not linear, the assumption of linear regression that the error terms are normally distributed is not met.


The Comparison of the Residual vs Fitted plots for Model1 and Model2 show that Model2 is a better fit for the data to predict the salary.

Model2 has an adjusted R-squared value of 96.46% meaning that 96.46% of the variation in ln(salary) is explained by the predictor variables, ln(average 3-month salary),age,gender and number of credit payments.

Model 2 has an F-statistic of 6011.491 and a p-value of <2.2e^-16 less than the alpha level of 0.05, therefore we conclude that the model is a good predictor of salary and these results are significant and less likely to be due to chance.

$model1

$model2
NA

chu

LS0tDQp0aXRsZTogIkxpbmVhciBSZWdyZXNzaW9uIEFuYWx5c2lzIg0KYXV0aG9yOiBBbWEgS29yYW50ZW1hIE93dXN1LURhcmtvDQpkYXRlOiAxN3RoIEp1bmUsIDIwMjANCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIyMgKipVc2luZyBMaW5lYXIgUmVncmVzc2lvbiB0byBwcmVkaWN0IHRoZSB0b3RhbCAzLW1vbnRoIHNhbGFyeSBmb3IgMTAwIHJlc3BvbmRlbnRzIGZyb20gdGhlIEFOWiBkYXRhc2V0cyoqDQoNCipEYXRhIGZyb20gSW5zaWRlU2hlcnBhIERhdGFAQU5aIFZpcnR1YWwgSW50ZXJuc2hpcCoNCmh0dHBzOi8vd3d3Lmluc2lkZXNoZXJwYS5jb20vbW9kdWxlcy9aTEpDc3Jwa0hvOXBaQkpOWS9CbndDVHVidHg4Tlc1VzVLcg0KDQojIyMjICoqU3VtbWFyeSBvZiBSZXN1bHRzKioNCg0KKipNb2RlbCAyIGhhcyBhbiBGLXN0YXRpc3RpYyBvZiA2MDExLjQ5MSBhbmQgYSBwLXZhbHVlIG9mIDwyLjJlXi0xNiBsZXNzIHRoYW4gdGhlIGFscGhhIGxldmVsIG9mIDAuMDUsIHRoZXJlZm9yZSB3ZSBjb25jbHVkZSB0aGF0IHRoZSBtb2RlbCBpcyBhIGdvb2QgcHJlZGljdG9yIG9mIHNhbGFyeSBhbmQgdGhlc2UgcmVzdWx0cyBhcmUgc2lnbmlmaWNhbnQgYW5kIGxlc3MgbGlrZWx5IHRvIGJlIGR1ZSB0byBjaGFuY2UuKioNCg0KDQojIyMjICpNb2RlbDIgTXVsdGlwbGUgTGluZWFyIFJlZ3Jlc3Npb24qDQoNCipsX3NhbGFyeSo9MS4yMzMrMC4xMTEoKk5vX3BheW1lbnRzKikrMC45ODMoKkFnZSopKzAuMDExKCpHZW5kZXIqKQ0KDQojIyMjICoqU3Vic2V0IG9mIERhdGFzZXQgdXNlZCBmb3IgcmVncmVzc2lvbiBhbmFseXNpcyoqDQpgYGB7ciByZXN1bHRzPSdhc2lzJyxlY2hvPUZBTFNFfQ0KDQpEVDo6ZGF0YXRhYmxlKHBheTVbLGMoMTo2LDEwKV0pDQpgYGANCiMjIyMgKipWYXJpYWJsZXMgY2hvc2VuIGZvciBBbmFseXNpcyoqDQoNCkFmdGVyIGZpbHRlcmluZyB0aGUgZGF0YSwgdG8gaW5jbHVkZSBvbmx5IG9ic2VydmF0aW9ucyB3aXRoIGNyZWRpdCB0cmFuc2FjdGlvbnMsIHRoZXJlIHdlcmUgODgzIG9ic2VydmF0aW9ucyBmb3IgMTAwIHVuaXF1ZSBjdXN0b21lcnMgbGVmdCwNCg0KVEhlIGRhdGEgd2FzIHN1bW1hcml6ZWQgdG8gZmluZCB0aGUgdG90YWwgbnVtYmVyIG9mIGNyZWRpdCB0cmFuc2FjdGlvbnMgZm9yIGVhY2ggaW5kaXZpZHVhbCBjdXN0b21lcl9pZC4NCmBgYHtyIGRhdGEsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCnBheT1kYXRhJT4lDQogIGZpbHRlcihtb3ZlbWVudD09ImNyZWRpdCIpDQpjdXN0b21lcl90cmFuc2FjdGlvbnM9ZGF0YS5mcmFtZShzMSRmaXJzdF9uYW1lLHMxJGN1c3RvbWVyX2lkLHMxJG4pDQoNCkRUOjpkYXRhdGFibGUoY3VzdG9tZXJfdHJhbnNhY3Rpb25zKQ0KDQpgYGANCg0KYGBge3IsZWNobz1GQUxTRX0NCg0KcmFuZ2UocGF5MiRub19wYXltZW50cykNCmBgYA0KDQojIyMjICoqUXVlc3Rpb25zIGd1aWRpbmcgbXkgYW5hbHlzaXMqKg0KDQpSYW5nZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVzcG9uZGVudHMgaGFkIGJldHdlZW4gdHdvIGFuZCAxNCBjcmVkaXQgdHJhbnNhY3Rpb25zLg0KDQoqKjEuV2h5IGFyZSBzb21lIHBlb3BsZSBwYWlkIG1vcmUgdGhhbiBvbmNlIGEgbW9udGg/IEVnLiBBYmlnYWlsIGhhZCAxMyBjcmVkaXQgdHJhbnNhY3Rpb25zIHdoaWxlIEFsZXhhbmRlciBoYWQgNiBjcmVkaXQgdHJhbnNhY3Rpb25zPyoqDQoNCioqMi4qKldoeSBkaWQgbm90IHNvbWUgcGVvcGxlIHJlY2VpdmUgYSBwYXltZW50IGluIGEgbW9udGg/IEVnLiBEaWFuYSB3YXMgcGFpZCBhIHdlZWtseSBhbW91bnQgb2YgMSwwMTMuNjcgQVVEIGR1cmluZyB0aGUgMy1tb250aCBwZXJpb2QtYXQgdG90YWwgb2YgMTMgcGF5bWVudHMuIFdoaWxlLCBSb25hbGQgaGFkIG9ubHkgdHdvIHRyYW5zYWN0aW9ucyA2LDExMS41NyBBVUQgaW4gU2VwdGVtYmVyIGFuZCAxMCw3NTMuMDIgQVVEIGluIE9jdG9iZXIuDQoNCioqMy5BcmUgdGhlIHJlc3BvbmRlbnRzIHdpdGggZmV3ZXIgY3JlZGl0IHBheW1lbnRzIGZyZWVsYW5jZSBjb25zdWx0YW50cyB3aGlsZSB0aGUgcmVzcG9uZGVudHMgd2l0aCBtb3JlIGNyZWRpdCBwYXltZW50cyBzYWxhcmllZCBlbXBsb3llZXM/KioNCg0KKio0LioqRG8gdGhlIHBlb3BsZSB3b3JrIGluIHRoZSBzYW1lIHBsYWNlPw0KDQoNCg0KIyMjIyAqKlBlcmZvcm1pbmcgU2ltcGxlIExpbmVhciBSZWdyZXNzaW9uIFNhbGFyeX5BdmVyYWdlX1NhbGFyeSoqDQoqRXhwbGFuYXRpb24gb2YgbW9kZWwxIFNhbGFyeSB2ZXJzdXMgTnVtYmVyIG9mIFBheW1lbnRzKiANCg0KKipCZXRhLW5vdWdodD0qKndoZW4gbm9fcGF5bWVudHMgaXMgemVybywgdGhlIGF2ZXJhZ2Ugc2FsYXJ5IGlzICoqMTcsNDM0IEFVRCoqDQoNCioqQmV0YTE9KiogRm9yIGV2ZXJ5IG9uZSB1bml0IGluY3JlYXNlIGluIHRoZSBub19wYXltZW50cywgdGhlIGF2ZXJhZ2Ugc2FsYXJ5IHdvdWxkIA0KZGVjcmVhc2UgYnkgKio1NS43NCBBVUQqKg0KUnNxdWFyZWQ9IDAuMDglDQoNClRoZSB2ZXJ5IGxvdyBGLXN0YXRpc3RpYywgKiowLjcxNzQqKiBhbmQgdGhlICoqcC12YWx1ZT0gMC4zOTcqKiBpbmRpY2F0ZSB0aGF0IGF0IHRoZSBhbHBoYSBsZXZlbCBvZiAwLjA1LCB0aGVyZSBpcyBubyBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBub19wYXltZW50cyBhbmQgdGhlIHNhbGFyeSBvZiByZXNwb25kZW50cy4NCg0KKipUaHVzLCB3ZSBjYW4gY29uY2x1ZGUgdGhhdCB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG5vX3BheW1lbnRzIGFuZCB0aGUgc2FsYXJ5IG9mIHJlc3BvbmRlbnRzLioqDQoNCg0KDQpgYGB7ciBleHBsYW5hdGlvbiBvZiBtb2RlbDF9DQptb2RlbDE9bG0oc2FsYXJ5fm5vX3BheW1lbnRzLCBkYXRhPXBheTIpDQpzdW1tYXJ5KG1vZGVsMSkNCg0KYGBgDQojIyMjICoqQ29uZmlkZW5jZSBJbnRlcnZhbCBmb3IgTW9kZWwxKioNCipDb25maWRlbmNlIGludGVydmFsIG9mIGJldGExIGZvciBNb2RlbDEsIG5vX3BheW1lbnRzIGlzICgtMTg1LCA3MykuKiANClNpbmNlIHplcm8gMCBpcyBpbiB0aGUgbWlkZGxlIG9mIHRoZSBpbnRlcnZhbCwgdGhlIHJlc3VsdHMgYXJlIG5vdCBzaWduaWZpY2FudCwgZXZpZGVuY2VkIGJ5ICoqbG93IHQtc3RhdGlzdGljID0tMC44NDcgYW5kIHRoZSBwLXZhbHVlID0gMC4zOTcyICoqIG1lYW5pbmcgdGhhdCB3ZSBhcmUgbGlrZWx5IHRvIG9ic2VydmUgc3VjaCBhIChzdWJzdGFudGlhbCkgYXNzb2NpYXRpb24gYmV0d2VlbiBub19wYXltZW50cyBhbmQgc2FsYXJ5IGJ5IGNoYW5jZS4NCmBgYHtyIGNvbmZpbnQsZWNobz1GQUxTRX0NCmxpYnJhcnkoYnJvb20pDQpjb25maW50KG1vZGVsMSkNCg0KYTE9Z2dwbG90KHBheTIsYWVzKG5vX3BheW1lbnRzLHNhbGFyeSkpKw0KICBnZW9tX3BvaW50KCkrZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikrDQogIGdlb21fc21vb3RoKHNlID1GLCBjb2xvcj0gInJlZCIpK2dndGl0bGUoIiNwYXltZW50cyB2ZXJzdXMgU2FsYXJ5IikNCg0KbW9kZWwxX3Jlc3VsdHMgPC1hdWdtZW50KG1vZGVsMSwgcGF5MikNCmIxPWdncGxvdChtb2RlbDFfcmVzdWx0cywgYWVzKC5maXR0ZWQsIC5yZXNpZCkpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgZ2VvbV9zbW9vdGgoc2UgPSBGQUxTRSkgKw0KICBnZ3RpdGxlKCJSZXNpZHVhbHMgdnMgRml0dGVkIikNCg0KZ2dwdWJyOjpnZ2FycmFuZ2UoYTEsYjEpDQoNCmBgYA0KDQojIyMjICoqUmVzaWR1YWxzIHZlcnN1cyBGaXR0ZWQgcGxvdCoqDQogVGhlIFJlc2lkdWFscyB2ZXJzdXMgRml0dGVkIHBsb3QgZm9yIHRoZSBzaW1wbGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgYWJvdmUgc2hvd3MgdGhhdCBudW1iZXIgb2YgY3JlZGl0IHBheW1lbnRzIGlzIG5vdCBsaW5lYXJseSByZWxhdGVkIHRvIHRoZSB0b3RhbCAzLW1vbnRoIHNhbGFyeS4NCiANCiBBbHNvIGZyb20gdGhlIG1vZGVsIHN1bW1hcnkgYWJvdmUgdGhlIFItc3F1YXJlZCB2YWx1ZSB3YXMgMC4wOCUgbWVhbmluZyB0aGF0IG51bWJlciBvZiBwYXltZW50cyBvbmx5IGV4cGxhaW5lZCAwLjA4JSBvZiB0aGUgdmFyaWF0aW9uIGluIHRoZSBzYWxhcnkuDQogDQogVGh1cywgdGhlIG5leHQgc3RlcCB0byBmaW5kIHRoZSBhcHByb3ByaWF0ZSBtb2RlbCBpcyBhZGQgbW9yZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMgdG8gZXhwbGFpbiB0aGUgdmFyaWF0aW9uIGluIHRoZSBzYWxhcnkuDQogDQotLS0gDQogDQogUGxvdHRpbmcgaGlzdG9ncmFtcyBvZiBzYWxhcnksIGF2ZXJhZ2UgMy1tb250aCBzYWxhcnksIGFnZSBhbmQgbnVtYmVyIG9mIGNyZWRpdCB0cmFuc2FjdGlvbnMgc2hvd2VkIHRoYXQgdGhlc2UgdmFyaWFibGVzIG5lZWRlZCB0byBiZSB0cmFuc2Zvcm1lZCB1c2luZyB0aGUgbmF0dXJhbCBsb2cgdG8gYXBwcm94aW1hdGUgYSBub3JtYWwgZGlzdHJpYnV0aW9uLg0KDQpgYGB7ciBoaXN0b2dyYW0sIGVjaG89RkFMU0V9DQphPWdncGxvdChwYXkyLGFlcyhzYWxhcnkpKStnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmx1ZSIpK2dndGl0bGUoIkhpc3RvZ3JhbSBvZiBTYWxhcnkiKQ0KDQphMT1nZ3Bsb3QocGF5MixhZXMobF9zYWxhcnkpKStnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmx1ZSIpK2dndGl0bGUoIkhpc3RvZ3JhbSBvZiBsbihTYWxhcnkpIikNCg0KYjE9Z2dwbG90KHBheTIsYWVzKGF2Z19zYWxhcnkpKStnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmx1ZSIpK2dndGl0bGUoIkhpc3RvZ3JhbSBBdmdfU2FsYXJ5IikNCg0KYj1nZ3Bsb3QocGF5MixhZXMobF9hdmdfc2FsYXJ5KSkrZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsdWUiKStnZ3RpdGxlKCJIaXN0b2dyYW0gbG4oQXZnX1NhbGFyeSkiKQ0KDQpnZ3B1YnI6OmdnYXJyYW5nZShhLGExLGIxLGIsIG5jb2w9MiwgbnJvdz0yKQ0KYGBgDQoqKkhpc3RvZ3JhbXMgYWZ0ZXIgbmF0dXJhbCBsb2cgdHJhbnNmb3JtYXRpb25zIG9mIHRvdGFsIDMtbW9udGggU2FsYXJ5IGFuZCBhdmVyYWdlIDMtbW9udGggc2FsYXJ5KiogDQoNCmBgYHtyIGxuIGhpc3RvZ3JhbSwgZWNobz1GQUxTRX0NCg0KZDE9Z2dwbG90KHBheTIsYWVzKGFnZSkpK2dlb21faGlzdG9ncmFtKGNvbG9yPSJibHVlIikrZ2d0aXRsZSgiSGlzdG9ncmFtIG9mIEFnZSIpDQoNCmQ9Z2dwbG90KHBheTIsYWVzKGxfYWdlKSkrZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsdWUiKStnZ3RpdGxlKCJIaXN0b2dyYW0gb2YgbG4oQWdlKSIpDQoNCmM9Z2dwbG90KHBheTIsYWVzKG5vX3BheW1lbnRzKSkrZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsdWUiKStnZ3RpdGxlKCJIaXN0b2dyYW0gb2YgIyBjcmVkaXQgcGF5bWVudHMiKQ0KDQpjMT1nZ3Bsb3QocGF5MixhZXMobF9ub19wYXltZW50cykpK2dlb21faGlzdG9ncmFtKGNvbG9yPSJibHVlIikrZ2d0aXRsZSgiSGlzdG9ncmFtIG9mIGxuKCNjcmVkaXQgcGF5bWVudHMpIikNCg0KZ2dwdWJyOjpnZ2FycmFuZ2UoZDEsZCxjLGMxLCBuY29sPTIsIG5yb3c9MikNCmBgYA0KKipIaXN0b2dyYW1zIGFmdGVyIG5hdHVyYWwgbG9nIHRyYW5zZm9ybWF0aW9ucyBvZiBBZ2UgYW5kIE51bWJlciBpZiBDcmVkaXQgcGF5bWVudHMqKg0KDQoNCiMjIyMgKipNdWx0aXBsZSBMaW5lYXIgUmVncmVzc2lvbioqDQogKipNdWx0aXBsZSBMaW5lYXIgUmVncmVzc2lvbj1sbiAodG90YWxfM19tb250aF9TYWxhcnkpfmxuKE51bWJlciBvZiBjcmVkaXQgdHJhbnNhY3Rpb25zKStsbihhdmVyYWdlXzNfbW9udGhfc2FsYXJ5KStsbihhZ2UpK2dlbmRlcioqDQoNCipsX3NhbGFyeSo9MS4yMzMrMC4xMTEoKk5vX3BheW1lbnRzKikrMC45ODMoKkFnZSopKzAuMDExKCpHZW5kZXIqKQ0KDQoNCmBgYHtyIG1vZGVsMn0NCm1vZGVsMj1sbShsX3NhbGFyeX5ub19wYXltZW50cytsX2F2Z19zYWxhcnkrYWdlK2dlbmRlciwgZGF0YT1wYXkyKQ0KDQpzdW1tYXJ5KG1vZGVsMikNCnBsb3QobW9kZWwyKQ0KYGBgDQoNCiMjIyMgKipFeHBsYW5hdGlvbiBvZiBNdWx0aXBsZSBMaW5lYXIgUmVncmVzc2lvbiByZXN1bHRzKioNCg0KKipSZXNpZHVhbHMgdmVyc3VzIEZpdHRlZCBwbG90KioNClRoZSBwb2ludHMgYXJlIGdhdGhlcmVkIHJhbmRvbWx5IGFyb3VuZCB0aGUgcmVzaWR1YWw9IDAgbGluZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGVyZSBpcyBhIGxpbmVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgcmVzcG9uc2UgdmFyaWFibGUgKFNhbGFyeSkgYW5kIHRoZSBQcmVkaWN0b3IgdmFyaWFibGVzIGlzIHJlYXNvbmFibGUuDQoNCkhvd2V2ZXIsIHRoZSBwb2ludHMgYXJvdW5kKDEwLC0wLjYpIHNob3cgdGhhdCB0aGVyZSBhcmUgb3V0bGllcnMgaW4gdGhlIGRhdGEuDQoNCioqTm9ybWFsIFEtUSBQbG90KioNClRoZSBOb3JtYWwgUS1RIFBsb3Qgc2hvd3MgdGhhdCB0aGVyZSBhcmUgYSBsb3Qgb2YgbmVnYXRpdmUgcmVzaWR1YWwgdmFsdWVzLiBTaW5jZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIFN0YW5kYXJkaXplZCBhbmQgdGhlb3JldGljYWwgcmVzaWR1YWxzIGlzIG5vdCBsaW5lYXIsIHRoZSBhc3N1bXB0aW9uIG9mIGxpbmVhciByZWdyZXNzaW9uIHRoYXQgdGhlIGVycm9yIHRlcm1zIGFyZSBub3JtYWxseSBkaXN0cmlidXRlZCBpcyBub3QgbWV0LiANCg0KDQotLS0tDQpUaGUgQ29tcGFyaXNvbiBvZiB0aGUgUmVzaWR1YWwgdnMgRml0dGVkIHBsb3RzIGZvciBNb2RlbDEgYW5kIE1vZGVsMiBzaG93IHRoYXQgTW9kZWwyIGlzIGEgYmV0dGVyIGZpdCBmb3IgdGhlIGRhdGEgdG8gcHJlZGljdCB0aGUgc2FsYXJ5Lg0KDQoqKk1vZGVsMiBoYXMgYW4gYWRqdXN0ZWQgUi1zcXVhcmVkIHZhbHVlIG9mIDk2LjQ2JSoqIG1lYW5pbmcgdGhhdCA5Ni40NiUgb2YgdGhlIHZhcmlhdGlvbiBpbiBsbihzYWxhcnkpIGlzIGV4cGxhaW5lZCBieSB0aGUgcHJlZGljdG9yIHZhcmlhYmxlcywgbG4oYXZlcmFnZSAzLW1vbnRoIHNhbGFyeSksYWdlLGdlbmRlciBhbmQgbnVtYmVyIG9mIGNyZWRpdCBwYXltZW50cy4NCg0KKipNb2RlbCAyIGhhcyBhbiBGLXN0YXRpc3RpYyBvZiA2MDExLjQ5MSBhbmQgYSBwLXZhbHVlIG9mIDwyLjJlXi0xNiBsZXNzIHRoYW4gdGhlIGFscGhhIGxldmVsIG9mIDAuMDUsIHRoZXJlZm9yZSB3ZSBjb25jbHVkZSB0aGF0IHRoZSBtb2RlbCBpcyBhIGdvb2QgcHJlZGljdG9yIG9mIHNhbGFyeSBhbmQgdGhlc2UgcmVzdWx0cyBhcmUgc2lnbmlmaWNhbnQgYW5kIGxlc3MgbGlrZWx5IHRvIGJlIGR1ZSB0byBjaGFuY2UuKioNCg0KYGBge3IsIGVjaG89RkFMU0V9DQpsaXN0KG1vZGVsMSA9IGdsYW5jZShtb2RlbDEpLCBtb2RlbDIgPSBnbGFuY2UobW9kZWwyKSkNCmBgYA0KDQoNCg0KIGNodQ==