Research question : HR wants to evaluate how satisfied employees working for their Organization in order to define better employee retention policies
Hypothesis: Is there any significant difference between dependent & independent variables
Null Hypothesis: There is NO significant difference between Satisfaction level & number of projects, average monthly hours, time spend in company, work accident, promotion last year, last evaluation
Alternate Hypothesis: There is a significant difference between Satisfaction level & number of projects, average monthly hours, time spent in company, work accident, promotion last year, last evaluation
Proportion tables
Retain Left
left 76.19175 23.808254
Work_accident 85.53904 14.460964
promotion_last_5years 97.87319 2.126808
Retain Left
high 7.700513 0.5467031
low 34.295620 14.4809654
medium 34.195613 8.7805854
Retain Left
accounting 3.753584 1.3600907
hr 3.493566 1.4334289
IT 6.360424 1.8201213
management 3.593573 0.6067071
marketing 4.366958 1.3534236
product_mng 4.693646 1.3200880
RandD 4.440296 0.8067204
sales 20.841389 6.7604507
support 11.160744 3.7002467
technical 13.487566 4.6469765
Insights
- ~24% of employees has left organization
- ~14% of employees had Work accident
- ~2% of employees got promoted
- ~ 14% of employees from Low salary & ~9% of employees from medium salary has left organization
- ~7%, 4% and 5% of employees from Sales, Support & Technical department has left organization respectively
Distribution of Variables : Histogram

$Retain
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 11428 0.67 0.22 0.69 0.69 0.22 0.12 1 0.88 -0.6 -0.22 0
$Left
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 3571 0.44 0.26 0.41 0.43 0.44 0.09 0.92 0.83 0.29 -1.03 0
- Distribution of Satisfaction levels across employees who retained & left in/from the organization appears normal

$Retain
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 11428 0.72 0.16 0.71 0.72 0.19 0.36 1 0.64 -0.04 -1.01 0
$Left
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 3571 0.72 0.2 0.79 0.72 0.3 0.45 1 0.55 -0.01 -1.71 0
- Distribution of Last Evaluation across employees who retained & left in/from the organization appears normal

$Retain
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 11428 3.79 0.98 4 3.77 1.48 2 6 4 0.27 -0.44 0.01
$Left
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 3571 3.86 1.82 4 3.73 2.97 2 7 5 0.25 -1.5 0.03
- Distribution of Number of Projects across employees who retained & left in/from the organization appears normal

$Retain
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 11428 199.06 45.68 198 199.48 56.34 96 287 191 -0.06 -0.99 0.43
$Left
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 3571 207.42 61.2 224 205.71 97.85 126 310 184 0.05 -1.63 1.02
- Distribution of Average Monthly hours across employees who retained & left in/from the organization appears normal

$Retain
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 11428 3.38 1.56 3 3.08 1.48 2 10 8 2.08 5.19 0.01
$Left
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 3571 3.88 0.98 4 3.79 1.48 2 6 4 0.53 -0.8 0.02
- Distribution of Time Spend in Company of the employees who retained appears right skewed & who left appears normal
Distribution of Variables : Boxplot

- Distribution of Satisfaction levels across employees who retained & left in/from the organization appears normal

- Distribution of Last Evaluation across employees who retained & left in/from the organization appears normal

- 50th & 75th percentile of employees who retained shares same number of projects with one outlier(6)
- Distribution of Number of Projects across employees who left from the organization appears normal

- Distribution of Average Monthly Hours across employees who retained & left in/from the organization appears normal

- Distribution of Average Monthly Hours across employees who retained appeared right skewed with outliers
- Distribution of Average Monthly Hours across employees who left appears normal
Relationship between Variables : Scatterplot

[1] 0.1050212
- There is Weak relationship between Satisfaction level & Last evaluation across employees who retained & left in/from the Organization

[1] -0.1429696
- There is Weak relationship between Satisfaction level & Number of Projects across employees who retained & left in/from the Organization

[1] -0.02004811
- There is Weak relationship between Satisfaction level & Average Monthly Hours across employees who retained & left in/from the Organization

[1] -0.1008661
- There is Weak relationship between Satisfaction level & Time Spend across employees who retained in the Organization
- There is fairly strong relationship between Satisfaction level & Time Spend across employees who left from Organization
Relationship between Variables(Correlation Analysis) : Tetrachoric & Polychoric Correlation Reference
Polychoric Correlation, ML est. = -0.3908 (0.01739)
Row Threshold
Threshold Std.Err.
0.7125 0.01124
Column Threshold
Threshold Std.Err.
1.06 0.01262
- There is fairly negative relationship between employees who left & work accident
Polychoric Correlation, ML est. = -0.3219 (0.03705)
Row Threshold
Threshold Std.Err.
0.7125 0.01124
Column Threshold
Threshold Std.Err.
2.028 0.0231
- There is fairly negative relationship between employees who left & given promotion in last 5-years
Polychoric Correlation, ML est. = -0.00565 (0.01314)
Test of bivariate normality: Chisquare = 434.3, df = 1, p = 1.88e-96
Row Threshold
Threshold Std.Err.
0.7125 0.01124
Column Thresholds
Threshold Std.Err.
1 -1.389 0.01477
2 0.177 0.01029
- There is weak negative relationship between employees who left & salary break-up
Correlation Matrix
satisfaction_level last_evaluation number_project average_monthly_hours
satisfaction_level 1.00000000 0.1050212 -0.1429696 -0.02004811
last_evaluation 0.10502121 1.0000000 0.3493326 0.33974180
number_project -0.14296959 0.3493326 1.0000000 0.41721063
average_monthly_hours -0.02004811 0.3397418 0.4172106 1.00000000
time_spend_company -0.10086607 0.1315907 0.1967859 0.12775491
time_spend_company
satisfaction_level -0.1008661
last_evaluation 0.1315907
number_project 0.1967859
average_monthly_hours 0.1277549
time_spend_company 1.0000000
- In general, there is no strong correlation exists between variables
ANOVA
Null Hypothesis: There is NO significant relationship between means(SL) of groups of left & other attributes
Alternate Hypothesis: There is significant relationship between means(SL) of groups of left & other attributes
Analysis of Variance Table
Response: satisfaction_level
Df Sum Sq Mean Sq F value Pr(>F)
Work_accident 1 3.19 3.1943 51.9854 5.859e-13 ***
promotion_last_5years 1 0.50 0.5042 8.2052 0.004183 **
salary 2 2.11 1.0544 17.1595 3.599e-08 ***
Residuals 14994 921.33 0.0614
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = satisfaction_level ~ Work_accident + promotion_last_5years + salary, data = HR_Analytics)
$Work_accident
diff lwr upr p adj
1-0 0.04149321 0.03021295 0.05277348 0
$promotion_last_5years
diff lwr upr p adj
1-0 0.04015407 0.01265588 0.06765227 0.0042122
$salary
diff lwr upr p adj
low-high -0.03420511 -0.05206715 -0.016343068 0.0000215
medium-high -0.01403907 -0.03207460 0.003996465 0.1615779
medium-low 0.02016604 0.01024054 0.030091540 0.0000058
Insights
- There is a significant difference in the means of satisfaction level against work accident, promotion last 5-years & salary(low-high,medium-low)
- However, there is only 84% significant difference in the means of satisfaction level against medium-high salary bucket
Principal Component Analysis
Standard deviations:
[1] 1.3504058 0.9603645 0.8235570 0.7588532
Rotation:
PC1 PC2 PC3 PC4
last_evaluation 0.5205189 -0.21869921 -0.82394561 -0.04841845
number_project 0.5740580 -0.06378274 0.33586240 0.74403334
average_monthly_hours 0.5530046 -0.24900053 0.45381212 -0.65287002
time_spend_company 0.3061101 0.94132946 -0.04862758 -0.13353197
Importance of components:
PC1 PC2 PC3 PC4
Standard deviation 1.3504 0.9604 0.8236 0.7589
Proportion of Variance 0.4559 0.2306 0.1696 0.1440
Cumulative Proportion 0.4559 0.6865 0.8560 1.0000


satisfaction_level last_evaluation number_project average_monthly_hours time_spend_company
[1,] 0.2486307 0.1711691 1.232592 49.9431 1.460136
satisfaction_level last_evaluation number_project average_monthly_hours time_spend_company
[1,] 40.57067 23.9029 32.4106 24.84109 41.73925
Drop time_spend_company variable & continue transformation with first-3-components
Note: As there are only few Variables, PCA is unable/not-suitable to explain more variances. Hence regression might not be prefered on PCA loadings
Linear Regression
Null Hypothesis: There is NO significant relationship between satisfaction level & other attributes
Alternate Hypothesis: There is significant relationship between satisfaction level & other attributes
Simple/Stratified Random Sampling
Call:
lm(formula = satisfaction_level ~ last_evaluation + number_project +
average_monthly_hours + Work_accident + promotion_last_5years +
salary, data = HR_Analytics_Trans_StRS)
Residuals:
Min 1Q Median 3Q Max
-0.64886 -0.17989 0.02279 0.19838 0.57074
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.637910 0.008362 76.290 < 2e-16 ***
last_evaluation -0.007965 0.001755 -4.539 5.73e-06 ***
number_project -0.029163 0.002464 -11.838 < 2e-16 ***
average_monthly_hours -0.048339 0.002847 -16.978 < 2e-16 ***
Work_accident1 0.040722 0.006751 6.032 1.67e-09 ***
promotion_last_5years1 0.035646 0.016333 2.182 0.0291 *
salarylow -0.045788 0.008956 -5.113 3.23e-07 ***
salarymedium -0.018362 0.009011 -2.038 0.0416 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.2422 on 10493 degrees of freedom
Multiple R-squared: 0.04811, Adjusted R-squared: 0.04748
F-statistic: 75.77 on 7 and 10493 DF, p-value: < 2.2e-16

Call:
lm(formula = log(satisfaction_level) ~ last_evaluation + number_project +
average_monthly_hours + Work_accident + promotion_last_5years +
salary, data = HR_Analytics_Trans_StRS)
Residuals:
Min 1Q Median 3Q Max
-1.9751 -0.3358 0.1401 0.4192 1.1345
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.544863 0.019356 -28.149 < 2e-16 ***
last_evaluation -0.092905 0.004062 -22.870 < 2e-16 ***
number_project -0.052265 0.005703 -9.165 < 2e-16 ***
average_monthly_hours -0.131399 0.006591 -19.936 < 2e-16 ***
Work_accident1 0.101834 0.015628 6.516 7.54e-11 ***
promotion_last_5years1 0.112891 0.037809 2.986 0.00283 **
salarylow -0.130374 0.020732 -6.289 3.33e-10 ***
salarymedium -0.061151 0.020859 -2.932 0.00338 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.5608 on 10493 degrees of freedom
Multiple R-squared: 0.09644, Adjusted R-squared: 0.09584
F-statistic: 160 on 7 and 10493 DF, p-value: < 2.2e-16

Insights
- Log-transformation is successful. However, overall varaitions explained by the model is just 10%(5%). Hence model will have poor prediction power
- Since p<0.05, we reject NH & conclude that there is a signficant relationship between satisfaction level & other attributes
LS0tDQp0aXRsZTogIkxpbmVhciBSZWdyZXNzaW9uIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyMjICoqUmVzZWFyY2ggcXVlc3Rpb24gOiBIUiB3YW50cyB0byBldmFsdWF0ZSBob3cgc2F0aXNmaWVkIGVtcGxveWVlcyB3b3JraW5nIGZvciB0aGVpciBPcmdhbml6YXRpb24gaW4gb3JkZXIgdG8gZGVmaW5lIGJldHRlciBlbXBsb3llZSByZXRlbnRpb24gcG9saWNpZXMqKg0KDQojIyMjICoqSHlwb3RoZXNpczogSXMgdGhlcmUgYW55IHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiBkZXBlbmRlbnQgJiBpbmRlcGVuZGVudCB2YXJpYWJsZXMqKg0KIyMjIyMgCU51bGwgSHlwb3RoZXNpczogVGhlcmUgaXMgTk8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIFNhdGlzZmFjdGlvbiBsZXZlbCAmIG51bWJlciBvZiBwcm9qZWN0cywgYXZlcmFnZSBtb250aGx5IGhvdXJzLCB0aW1lIHNwZW5kIGluIGNvbXBhbnksIHdvcmsgYWNjaWRlbnQsIHByb21vdGlvbiBsYXN0IHllYXIsIGxhc3QgZXZhbHVhdGlvbg0KIyMjIyMgCUFsdGVybmF0ZSBIeXBvdGhlc2lzOiBUaGVyZSBpcyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiBTYXRpc2ZhY3Rpb24gbGV2ZWwgJiBudW1iZXIgb2YgcHJvamVjdHMsIGF2ZXJhZ2UgbW9udGhseSBob3VycywgdGltZSBzcGVudCBpbiBjb21wYW55LCB3b3JrIGFjY2lkZW50LCBwcm9tb3Rpb24gbGFzdCB5ZWFyLCBsYXN0IGV2YWx1YXRpb24NCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KbGlicmFyeShvcGVueGxzeCkNCkhSX0FuYWx5dGljcyA8LSByZWFkLnhsc3goIkg6L1lhc2h3YW50aC9LYWdnbGUvSFJfY29tbWFfc2VwLnhsc3giLHNoZWV0ID0gMSkNCkhSX0FuYWx5dGljcyRsZWZ0IDwtIGZhY3RvcihIUl9BbmFseXRpY3MkbGVmdCwgbGFiZWxzID0gYygiUmV0YWluIiwiTGVmdCIpKQ0KSFJfQW5hbHl0aWNzJFdvcmtfYWNjaWRlbnQgPC0gYXMuZmFjdG9yKEhSX0FuYWx5dGljcyRXb3JrX2FjY2lkZW50KQ0KSFJfQW5hbHl0aWNzJHByb21vdGlvbl9sYXN0XzV5ZWFycyA8LSBhcy5mYWN0b3IoSFJfQW5hbHl0aWNzJHByb21vdGlvbl9sYXN0XzV5ZWFycykNCmBgYA0KLS0tDQoNCiMjIyMgKipQcm9wb3J0aW9uIHRhYmxlcyoqDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZ3M9RkFMU0V9DQpwcmludChyYmluZChsZWZ0PXByb3AudGFibGUodGFibGUoSFJfQW5hbHl0aWNzJGxlZnQpKSoxMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICBXb3JrX2FjY2lkZW50PXByb3AudGFibGUodGFibGUoSFJfQW5hbHl0aWNzJFdvcmtfYWNjaWRlbnQpKSoxMDAsDQogICAgICBwcm9tb3Rpb25fbGFzdF81eWVhcnM9cHJvcC50YWJsZSh0YWJsZShIUl9BbmFseXRpY3MkcHJvbW90aW9uX2xhc3RfNXllYXJzKSkqMTAwKSkNCiAgICAgIA0KcHJpbnQocmJpbmQoc2FsYXJ5PXByb3AudGFibGUodGFibGUoSFJfQW5hbHl0aWNzJHNhbGFyeSxIUl9BbmFseXRpY3MkbGVmdCkpKjEwMCkpDQoNCnByaW50KHJiaW5kKERlcGFydG1lbnQ9cHJvcC50YWJsZSh0YWJsZShIUl9BbmFseXRpY3MkRGVwYXJ0bWVudCxIUl9BbmFseXRpY3MkbGVmdCkpKjEwMCkpDQpgYGANCioqSW5zaWdodHMqKg0KDQoqIH4yNCUgb2YgZW1wbG95ZWVzIGhhcyBsZWZ0IG9yZ2FuaXphdGlvbg0KKiB+MTQlIG9mIGVtcGxveWVlcyBoYWQgV29yayBhY2NpZGVudA0KKiB+MiUgb2YgZW1wbG95ZWVzIGdvdCBwcm9tb3RlZA0KKiB+IDE0JSBvZiBlbXBsb3llZXMgZnJvbSBMb3cgc2FsYXJ5ICYgfjklIG9mIGVtcGxveWVlcyBmcm9tIG1lZGl1bSBzYWxhcnkgaGFzIGxlZnQgb3JnYW5pemF0aW9uDQoqIH43JSwgNCUgYW5kIDUlIG9mIGVtcGxveWVlcyBmcm9tIFNhbGVzLCBTdXBwb3J0ICYgVGVjaG5pY2FsIGRlcGFydG1lbnQgaGFzIGxlZnQgb3JnYW5pemF0aW9uIHJlc3BlY3RpdmVseQ0KDQotLS0NCg0KIyMjIyAqKkRpc3RyaWJ1dGlvbiBvZiBWYXJpYWJsZXMgOiBIaXN0b2dyYW0qKg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoZ2dwbG90MikNCmF0dGFjaChIUl9BbmFseXRpY3MpDQpnZ3Bsb3QoSFJfQW5hbHl0aWNzLGFlcyh4PXNhdGlzZmFjdGlvbl9sZXZlbCkpICsNCiAgZmFjZXRfd3JhcCh+IGxlZnQpKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLiksY29sID0gImJsdWUyIixiaW5zID0gNDApICsNCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSxhcmdzID0gbGlzdChtZWFuPW1lYW4obGFzdF9ldmFsdWF0aW9uKSxzZD1zZChsYXN0X2V2YWx1YXRpb24pKSxjb2xvdXIgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBTYXRpc2ZhY3Rpb24gbGV2ZWwiLCB4ID0gImxlZnQiLCB5ID0gIlNhdGlzZmFjdGlvbiBsZXZlbCIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpkZXRhY2goSFJfQW5hbHl0aWNzKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmxpYnJhcnkocHN5Y2gpDQpwcmludChkZXNjcmliZUJ5KEhSX0FuYWx5dGljcyRzYXRpc2ZhY3Rpb25fbGV2ZWwsZ3JvdXAgPSBIUl9BbmFseXRpY3MkbGVmdClbMToyXSkNCmBgYA0KDQoqIERpc3RyaWJ1dGlvbiBvZiBTYXRpc2ZhY3Rpb24gbGV2ZWxzIGFjcm9zcyBlbXBsb3llZXMgd2hvIHJldGFpbmVkICYgbGVmdCBpbi9mcm9tIHRoZSBvcmdhbml6YXRpb24gYXBwZWFycyBub3JtYWwNCg0KLS0tDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmF0dGFjaChIUl9BbmFseXRpY3MpDQpnZ3Bsb3QoSFJfQW5hbHl0aWNzLGFlcyh4PWxhc3RfZXZhbHVhdGlvbikpICsNCiAgZmFjZXRfd3JhcCh+IGxlZnQpKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLiksY29sID0gImJsdWUyIiwgYmlucyA9IDQwKSArDQogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sYXJncyA9IGxpc3QobWVhbj1tZWFuKGxhc3RfZXZhbHVhdGlvbiksc2Q9c2QobGFzdF9ldmFsdWF0aW9uKSksY29sb3VyID0gInJlZCIpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgTGFzdCBFdmFsdWF0aW9uIiwgeCA9ICJsZWZ0IiwgeSA9ICJMYXN0IEV2YWx1YXRpb24iKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUwKSkNCmRldGFjaChIUl9BbmFseXRpY3MpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KcHJpbnQoZGVzY3JpYmVCeShIUl9BbmFseXRpY3MkbGFzdF9ldmFsdWF0aW9uLGdyb3VwID0gSFJfQW5hbHl0aWNzJGxlZnQpWzE6Ml0pDQpgYGANCg0KKiBEaXN0cmlidXRpb24gb2YgTGFzdCBFdmFsdWF0aW9uIGFjcm9zcyBlbXBsb3llZXMgd2hvIHJldGFpbmVkICYgbGVmdCBpbi9mcm9tIHRoZSBvcmdhbml6YXRpb24gYXBwZWFycyBub3JtYWwNCg0KLS0tDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmF0dGFjaChIUl9BbmFseXRpY3MpDQpnZ3Bsb3QoSFJfQW5hbHl0aWNzLGFlcyh4PW51bWJlcl9wcm9qZWN0KSkgKw0KICBmYWNldF93cmFwKH4gbGVmdCkrDQogIGdlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uKSxjb2wgPSAiYmx1ZTIiLCBiaW5zID0gMjApICsNCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSxhcmdzID0gbGlzdChtZWFuPW1lYW4obnVtYmVyX3Byb2plY3QpLHNkPXNkKG51bWJlcl9wcm9qZWN0KSksY29sb3VyID0gInJlZCIpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgTnVtYmVyIG9mIFByb2plY3RzIiwgeCA9ICJsZWZ0IiwgeSA9ICJOdW1iZXIgb2YgUHJvamVjdCIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpkZXRhY2goSFJfQW5hbHl0aWNzKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCnByaW50KGRlc2NyaWJlQnkoSFJfQW5hbHl0aWNzJG51bWJlcl9wcm9qZWN0LGdyb3VwID0gSFJfQW5hbHl0aWNzJGxlZnQpWzE6Ml0pDQpgYGANCg0KKiBEaXN0cmlidXRpb24gb2YgTnVtYmVyIG9mIFByb2plY3RzIGFjcm9zcyBlbXBsb3llZXMgd2hvIHJldGFpbmVkICYgbGVmdCBpbi9mcm9tIHRoZSBvcmdhbml6YXRpb24gYXBwZWFycyBub3JtYWwNCg0KLS0tDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmF0dGFjaChIUl9BbmFseXRpY3MpDQpnZ3Bsb3QoSFJfQW5hbHl0aWNzLGFlcyh4PWF2ZXJhZ2VfbW9udGhseV9ob3VycykpICsNCiAgZmFjZXRfd3JhcCh+IGxlZnQpKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLiksY29sID0gImJsdWUyIiwgYmlucyA9IDQwKSArDQogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sYXJncyA9IGxpc3QobWVhbj1tZWFuKGF2ZXJhZ2VfbW9udGhseV9ob3Vycyksc2Q9c2QoYXZlcmFnZV9tb250aGx5X2hvdXJzKSksDQogICAgICAgICAgICAgICAgY29sb3VyID0gInJlZCIpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgQXZlcmFnZSBNb250aGx5IEhvdXJzIiwgeCA9ICJsZWZ0IiwgeSA9ICJBdmVyYWdlIE1vbnRobHkgSG91cnMiKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KZGV0YWNoKEhSX0FuYWx5dGljcykNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZ3M9RkFMU0V9DQpwcmludChkZXNjcmliZUJ5KEhSX0FuYWx5dGljcyRhdmVyYWdlX21vbnRobHlfaG91cnMsZ3JvdXAgPSBIUl9BbmFseXRpY3MkbGVmdClbMToyXSkNCmBgYA0KDQoqIERpc3RyaWJ1dGlvbiBvZiBBdmVyYWdlIE1vbnRobHkgaG91cnMgYWNyb3NzIGVtcGxveWVlcyB3aG8gcmV0YWluZWQgJiBsZWZ0IGluL2Zyb20gdGhlIG9yZ2FuaXphdGlvbiBhcHBlYXJzIG5vcm1hbA0KDQotLS0NCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KYXR0YWNoKEhSX0FuYWx5dGljcykNCmdncGxvdChIUl9BbmFseXRpY3MsYWVzKHg9dGltZV9zcGVuZF9jb21wYW55KSkgKw0KICBmYWNldF93cmFwKH4gbGVmdCkrDQogIGdlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uKSxjb2wgPSAiYmx1ZTIiLCBiaW5zID0gNDApICsNCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSxhcmdzID0gbGlzdChtZWFuPW1lYW4odGltZV9zcGVuZF9jb21wYW55KSxzZD1zZCh0aW1lX3NwZW5kX2NvbXBhbnkpKSxjb2xvdXIgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBUaW1lIFNwZW5kIGluIENvbXBhbnkiLCB4ID0gImxlZnQiLCB5ID0gIlRpbWUgU3BlbmQgaW4gQ29tcGFueSIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpkZXRhY2goSFJfQW5hbHl0aWNzKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCnByaW50KGRlc2NyaWJlQnkoSFJfQW5hbHl0aWNzJHRpbWVfc3BlbmRfY29tcGFueSxncm91cCA9IEhSX0FuYWx5dGljcyRsZWZ0KVsxOjJdKQ0KYGBgDQoNCiogRGlzdHJpYnV0aW9uIG9mIFRpbWUgU3BlbmQgaW4gQ29tcGFueSBvZiB0aGUgZW1wbG95ZWVzIHdobyByZXRhaW5lZCBhcHBlYXJzIHJpZ2h0IHNrZXdlZCAmIHdobyBsZWZ0IGFwcGVhcnMgbm9ybWFsDQoNCi0tLQ0KDQojIyMjICoqRGlzdHJpYnV0aW9uIG9mIFZhcmlhYmxlcyA6IEJveHBsb3QqKg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZ3M9RkFMU0V9DQphdHRhY2goSFJfQW5hbHl0aWNzKQ0KZ2dwbG90KEhSX0FuYWx5dGljcyxhZXMobGVmdCxzYXRpc2ZhY3Rpb25fbGV2ZWwpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgU2F0aXNmYWN0aW9uIGxldmVsIiwgeCA9ICJsZWZ0IiwgeSA9ICJTYXRpc2ZhY3Rpb24gbGV2ZWwiKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KZGV0YWNoKEhSX0FuYWx5dGljcykNCmBgYA0KDQoqIERpc3RyaWJ1dGlvbiBvZiBTYXRpc2ZhY3Rpb24gbGV2ZWxzIGFjcm9zcyBlbXBsb3llZXMgd2hvIHJldGFpbmVkICYgbGVmdCBpbi9mcm9tIHRoZSBvcmdhbml6YXRpb24gYXBwZWFycyBub3JtYWwNCg0KLS0tDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmF0dGFjaChIUl9BbmFseXRpY3MpDQpnZ3Bsb3QoSFJfQW5hbHl0aWNzLGFlcyhsZWZ0LGxhc3RfZXZhbHVhdGlvbikpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBMYXN0IEV2YWx1YXRpb24iLCB4ID0gImxlZnQiLCB5ID0gIkxhc3QgRXZhbHVhdGlvbiIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpkZXRhY2goSFJfQW5hbHl0aWNzKQ0KYGBgDQoqIERpc3RyaWJ1dGlvbiBvZiBMYXN0IEV2YWx1YXRpb24gYWNyb3NzIGVtcGxveWVlcyB3aG8gcmV0YWluZWQgJiBsZWZ0IGluL2Zyb20gdGhlIG9yZ2FuaXphdGlvbiBhcHBlYXJzIG5vcm1hbA0KDQotLS0NCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KYXR0YWNoKEhSX0FuYWx5dGljcykNCmdncGxvdChIUl9BbmFseXRpY3MsYWVzKGxlZnQsbnVtYmVyX3Byb2plY3QpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgTnVtYmVyIG9mIFByb2plY3RzIiwgeCA9ICJsZWZ0IiwgeSA9ICJOdW1iZXIgb2YgUHJvamVjdCIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpkZXRhY2goSFJfQW5hbHl0aWNzKQ0KYGBgDQoqIDUwdGggJiA3NXRoIHBlcmNlbnRpbGUgb2YgZW1wbG95ZWVzIHdobyByZXRhaW5lZCBzaGFyZXMgc2FtZSBudW1iZXIgb2YgcHJvamVjdHMgd2l0aCBvbmUgb3V0bGllcig2KQ0KKiBEaXN0cmlidXRpb24gb2YgTnVtYmVyIG9mIFByb2plY3RzIGFjcm9zcyBlbXBsb3llZXMgd2hvIGxlZnQgZnJvbSB0aGUgb3JnYW5pemF0aW9uIGFwcGVhcnMgbm9ybWFsDQoNCi0tLQ0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZ3M9RkFMU0V9DQphdHRhY2goSFJfQW5hbHl0aWNzKQ0KZ2dwbG90KEhSX0FuYWx5dGljcyxhZXMobGVmdCxhdmVyYWdlX21vbnRobHlfaG91cnMpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgQXZlcmFnZSBNb250aGx5IEhvdXJzIiwgeCA9ICJsZWZ0IiwgeSA9ICJBdmVyYWdlIE1vbnRobHkgSG91cnMiKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KZGV0YWNoKEhSX0FuYWx5dGljcykNCmBgYA0KKiBEaXN0cmlidXRpb24gb2YgQXZlcmFnZSBNb250aGx5IEhvdXJzIGFjcm9zcyBlbXBsb3llZXMgd2hvIHJldGFpbmVkICYgbGVmdCBpbi9mcm9tIHRoZSBvcmdhbml6YXRpb24gYXBwZWFycyBub3JtYWwNCg0KLS0tDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmF0dGFjaChIUl9BbmFseXRpY3MpDQpnZ3Bsb3QoSFJfQW5hbHl0aWNzLGFlcyhsZWZ0LHRpbWVfc3BlbmRfY29tcGFueSkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBUaW1lIFNwZW5kIGluIENvbXBhbnkiLCB4ID0gImxlZnQiLCB5ID0gIlRpbWUgU3BlbmQgaW4gQ29tcGFueSIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpkZXRhY2goSFJfQW5hbHl0aWNzKQ0KYGBgDQoqIERpc3RyaWJ1dGlvbiBvZiBBdmVyYWdlIE1vbnRobHkgSG91cnMgYWNyb3NzIGVtcGxveWVlcyB3aG8gcmV0YWluZWQgYXBwZWFyZWQgcmlnaHQgc2tld2VkIHdpdGggb3V0bGllcnMNCiogRGlzdHJpYnV0aW9uIG9mIEF2ZXJhZ2UgTW9udGhseSBIb3VycyBhY3Jvc3MgZW1wbG95ZWVzIHdobyBsZWZ0IGFwcGVhcnMgbm9ybWFsDQoNCi0tLQ0KDQojIyMjICoqUmVsYXRpb25zaGlwIGJldHdlZW4gVmFyaWFibGVzIDogU2NhdHRlcnBsb3QqKg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZ3M9RkFMU0V9DQphdHRhY2goSFJfQW5hbHl0aWNzKQ0KZ2dwbG90KEhSX0FuYWx5dGljcywgYWVzKGxhc3RfZXZhbHVhdGlvbixzYXRpc2ZhY3Rpb25fbGV2ZWwpKSArDQogIGZhY2V0X3dyYXAofmxlZnQpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3I9bGVmdCkpICsNCiAgZ2VvbV9hYmxpbmUoY29sb3IgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlPSJSZWxhdGlvbnNoaXAgYmV0d2VlbiBTYXRpc2ZhY3Rpb24gbGV2ZWwgJiBMYXN0IEV2YWx1YXRpb24iLCANCiAgICAgICB4ID0gImxhc3QgZXZhbHVhdGlvbiIsIHkgPSAic2F0aXNmYWN0aW9uIGxldmVsIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmRldGFjaChIUl9BbmFseXRpY3MpDQpgYGANCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmxpYnJhcnkoZGF0YS50YWJsZSkNCkhSX0FuYWx5dGljcyA8LSBkYXRhLnRhYmxlKEhSX0FuYWx5dGljcykNCnByaW50KEhSX0FuYWx5dGljc1ssLihjb3Ioc2F0aXNmYWN0aW9uX2xldmVsLCBsYXN0X2V2YWx1YXRpb24pKSwgYnkgPSBsZWZ0XSkNCkhSX0FuYWx5dGljcyA8LSBkYXRhLmZyYW1lKEhSX0FuYWx5dGljcykNCnByaW50KGNvcihIUl9BbmFseXRpY3Mkc2F0aXNmYWN0aW9uX2xldmVsLEhSX0FuYWx5dGljcyRsYXN0X2V2YWx1YXRpb24pKQ0KYGBgDQoNCiogVGhlcmUgaXMgV2VhayByZWxhdGlvbnNoaXAgYmV0d2VlbiBTYXRpc2ZhY3Rpb24gbGV2ZWwgJiBMYXN0IGV2YWx1YXRpb24gYWNyb3NzIGVtcGxveWVlcyB3aG8gcmV0YWluZWQgJiBsZWZ0IGluL2Zyb20gdGhlIE9yZ2FuaXphdGlvbg0KDQotLS0NCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KYXR0YWNoKEhSX0FuYWx5dGljcykNCmdncGxvdChIUl9BbmFseXRpY3MsIGFlcyhzY2FsZShIUl9BbmFseXRpY3MkbnVtYmVyX3Byb2plY3QpWywxXSxzY2FsZShIUl9BbmFseXRpY3Mkc2F0aXNmYWN0aW9uX2xldmVsKVssMV0pKSArDQogIGZhY2V0X3dyYXAofmxlZnQpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3I9bGVmdCkpICsNCiAgZ2VvbV9hYmxpbmUoY29sb3IgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlPSJSZWxhdGlvbnNoaXAgYmV0d2VlbiBTYXRpc2ZhY3Rpb24gbGV2ZWwgJiBOdW1iZXIgb2YgUHJvamVjdHMiLCANCiAgICAgICB4ID0gIk51bWJlciBvZiBQcm9qZWN0cyIsIHkgPSAic2F0aXNmYWN0aW9uIGxldmVsIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmRldGFjaChIUl9BbmFseXRpY3MpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KSFJfQW5hbHl0aWNzIDwtIGRhdGEudGFibGUoSFJfQW5hbHl0aWNzKQ0KcHJpbnQoSFJfQW5hbHl0aWNzWywuKGNvcihzYXRpc2ZhY3Rpb25fbGV2ZWwsIG51bWJlcl9wcm9qZWN0KSksIGJ5ID0gbGVmdF0pDQpIUl9BbmFseXRpY3MgPC0gZGF0YS5mcmFtZShIUl9BbmFseXRpY3MpDQpwcmludChjb3IoSFJfQW5hbHl0aWNzJHNhdGlzZmFjdGlvbl9sZXZlbCxIUl9BbmFseXRpY3MkbnVtYmVyX3Byb2plY3QpKQ0KYGBgDQoNCiogVGhlcmUgaXMgV2VhayByZWxhdGlvbnNoaXAgYmV0d2VlbiBTYXRpc2ZhY3Rpb24gbGV2ZWwgJiBOdW1iZXIgb2YgUHJvamVjdHMgYWNyb3NzIGVtcGxveWVlcyB3aG8gcmV0YWluZWQgJiBsZWZ0IGluL2Zyb20gdGhlIE9yZ2FuaXphdGlvbg0KDQotLS0NCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KYXR0YWNoKEhSX0FuYWx5dGljcykNCmdncGxvdChIUl9BbmFseXRpY3MsIGFlcyhzY2FsZShhdmVyYWdlX21vbnRobHlfaG91cnMpWywxXSxzY2FsZShzYXRpc2ZhY3Rpb25fbGV2ZWwpWywxXSkpICsNCiAgZmFjZXRfd3JhcCh+bGVmdCkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvcj1sZWZ0KSkgKw0KICBnZW9tX2FibGluZShjb2xvciA9ICJyZWQiKSArDQogIGxhYnModGl0bGU9IlJlbGF0aW9uc2hpcCBiZXR3ZWVuIFNhdGlzZmFjdGlvbiBsZXZlbCAmIEF2ZXJhZ2UgTW9udGhseSBIb3VycyIsIA0KICAgICAgIHggPSAiYXZlcmFnZSBtb250aGx5IGhvdXJzIiwgeSA9ICJzYXRpc2ZhY3Rpb24gbGV2ZWwiKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KZGV0YWNoKEhSX0FuYWx5dGljcykNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZ3M9RkFMU0V9DQpIUl9BbmFseXRpY3MgPC0gZGF0YS50YWJsZShIUl9BbmFseXRpY3MpDQpwcmludChIUl9BbmFseXRpY3NbLC4oY29yKHNhdGlzZmFjdGlvbl9sZXZlbCwgYXZlcmFnZV9tb250aGx5X2hvdXJzKSksIGJ5ID0gbGVmdF0pDQpIUl9BbmFseXRpY3MgPC0gZGF0YS5mcmFtZShIUl9BbmFseXRpY3MpDQpwcmludChjb3IoSFJfQW5hbHl0aWNzJHNhdGlzZmFjdGlvbl9sZXZlbCxIUl9BbmFseXRpY3MkYXZlcmFnZV9tb250aGx5X2hvdXJzKSkNCmBgYA0KDQoqIFRoZXJlIGlzIFdlYWsgcmVsYXRpb25zaGlwIGJldHdlZW4gU2F0aXNmYWN0aW9uIGxldmVsICYgQXZlcmFnZSBNb250aGx5IEhvdXJzIGFjcm9zcyBlbXBsb3llZXMgd2hvIHJldGFpbmVkICYgbGVmdCBpbi9mcm9tIHRoZSBPcmdhbml6YXRpb24NCg0KLS0tDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmF0dGFjaChIUl9BbmFseXRpY3MpDQpnZ3Bsb3QoSFJfQW5hbHl0aWNzLCBhZXMoc2NhbGUodGltZV9zcGVuZF9jb21wYW55KVssMV0sc2NhbGUoc2F0aXNmYWN0aW9uX2xldmVsKVssMV0pKSArDQogIGZhY2V0X3dyYXAofmxlZnQpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3I9bGVmdCkpICsNCiAgZ2VvbV9hYmxpbmUoY29sb3IgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlPSJSZWxhdGlvbnNoaXAgYmV0d2VlbiBTYXRpc2ZhY3Rpb24gbGV2ZWwgJiBUaW1lIFNwZW5kIGluIENvbXBhbnkiLCANCiAgICAgICB4ID0gInRpbWUgc3BlbmQgaW4gY29tcGFueSIsIHkgPSAic2F0aXNmYWN0aW9uIGxldmVsIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmRldGFjaChIUl9BbmFseXRpY3MpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KSFJfQW5hbHl0aWNzIDwtIGRhdGEudGFibGUoSFJfQW5hbHl0aWNzKQ0KcHJpbnQoSFJfQW5hbHl0aWNzWywuKGNvcihzYXRpc2ZhY3Rpb25fbGV2ZWwsIHRpbWVfc3BlbmRfY29tcGFueSkpLCBieSA9IGxlZnRdKQ0KSFJfQW5hbHl0aWNzIDwtIGRhdGEuZnJhbWUoSFJfQW5hbHl0aWNzKQ0KcHJpbnQoY29yKEhSX0FuYWx5dGljcyRzYXRpc2ZhY3Rpb25fbGV2ZWwsSFJfQW5hbHl0aWNzJHRpbWVfc3BlbmRfY29tcGFueSkpDQpgYGANCg0KKiBUaGVyZSBpcyBXZWFrIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFNhdGlzZmFjdGlvbiBsZXZlbCAmIFRpbWUgU3BlbmQgYWNyb3NzIGVtcGxveWVlcyB3aG8gcmV0YWluZWQgaW4gdGhlIE9yZ2FuaXphdGlvbg0KKiBUaGVyZSBpcyBmYWlybHkgc3Ryb25nIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFNhdGlzZmFjdGlvbiBsZXZlbCAmIFRpbWUgU3BlbmQgYWNyb3NzIGVtcGxveWVlcyB3aG8gbGVmdCBmcm9tIE9yZ2FuaXphdGlvbg0KDQotLS0NCg0KIyMjIyAqKlJlbGF0aW9uc2hpcCBiZXR3ZWVuIFZhcmlhYmxlcyhDb3JyZWxhdGlvbiBBbmFseXNpcykgOiBUZXRyYWNob3JpYyAmIFBvbHljaG9yaWMgQ29ycmVsYXRpb24qKiBbUmVmZXJlbmNlXShodHRwOi8vam9obi11ZWJlcnNheC5jb20vc3RhdC90ZXRyYS5odG0jdHNvZnQpDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmxpYnJhcnkocG9seWNvcikNCnBvbHljaG9yKHRhYmxlKEhSX0FuYWx5dGljcyRsZWZ0LEhSX0FuYWx5dGljcyRXb3JrX2FjY2lkZW50KSwgTUwgPSBULCBzdGQuZXJyID0gVCkNCmBgYA0KKiBUaGVyZSBpcyBmYWlybHkgbmVnYXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gZW1wbG95ZWVzIHdobyBsZWZ0ICYgd29yayBhY2NpZGVudA0KDQotLS0NCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KcG9seWNob3IodGFibGUoSFJfQW5hbHl0aWNzJGxlZnQsSFJfQW5hbHl0aWNzJHByb21vdGlvbl9sYXN0XzV5ZWFycyksIE1MID0gVCwgc3RkLmVyciA9IFQpDQpgYGANCiogVGhlcmUgaXMgZmFpcmx5IG5lZ2F0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGVtcGxveWVlcyB3aG8gbGVmdCAmIGdpdmVuIHByb21vdGlvbiBpbiBsYXN0IDUteWVhcnMNCg0KLS0tDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCnBvbHljaG9yKHRhYmxlKEhSX0FuYWx5dGljcyRsZWZ0LEhSX0FuYWx5dGljcyRzYWxhcnkpLCBNTCA9IFQsIHN0ZC5lcnIgPSBUKQ0KYGBgDQoqIFRoZXJlIGlzIHdlYWsgbmVnYXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gZW1wbG95ZWVzIHdobyBsZWZ0ICYgc2FsYXJ5IGJyZWFrLXVwDQoNCi0tLQ0KDQojIyMjICoqQ29ycmVsYXRpb24gTWF0cml4KioNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KY29yKEhSX0FuYWx5dGljc1tzYXBwbHkoSFJfQW5hbHl0aWNzLGlzLm51bWVyaWMpXSkNCmBgYA0KKiBJbiBnZW5lcmFsLCB0aGVyZSBpcyBubyBzdHJvbmcgY29ycmVsYXRpb24gZXhpc3RzIGJldHdlZW4gdmFyaWFibGVzDQoNCi0tLQ0KDQojIyMjICoqQU5PVkEqKg0KIyMjIyMgTnVsbCBIeXBvdGhlc2lzOiBUaGVyZSBpcyBOTyBzaWduaWZpY2FudCByZWxhdGlvbnNoaXAgYmV0d2VlbiBtZWFucyhTTCkgb2YgZ3JvdXBzIG9mIGxlZnQgJiBvdGhlciBhdHRyaWJ1dGVzDQojIyMjIyBBbHRlcm5hdGUgSHlwb3RoZXNpczogVGhlcmUgaXMgc2lnbmlmaWNhbnQgcmVsYXRpb25zaGlwIGJldHdlZW4gbWVhbnMoU0wpIG9mIGdyb3VwcyBvZiBsZWZ0ICYgb3RoZXIgYXR0cmlidXRlcw0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZ3M9RkFMU0V9DQphbm92YShsbShzYXRpc2ZhY3Rpb25fbGV2ZWwgfiBXb3JrX2FjY2lkZW50K3Byb21vdGlvbl9sYXN0XzV5ZWFycytzYWxhcnksIGRhdGEgPSBIUl9BbmFseXRpY3MpKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NClR1a2V5SFNEKGFvdihzYXRpc2ZhY3Rpb25fbGV2ZWwgfiBXb3JrX2FjY2lkZW50K3Byb21vdGlvbl9sYXN0XzV5ZWFycytzYWxhcnksIGRhdGEgPSBIUl9BbmFseXRpY3MpKQ0KYGBgDQoNCiMjIyMjICoqSW5zaWdodHMqKg0KDQoqIFRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiB0aGUgbWVhbnMgb2Ygc2F0aXNmYWN0aW9uIGxldmVsIGFnYWluc3Qgd29yayBhY2NpZGVudCwgcHJvbW90aW9uIGxhc3QgNS15ZWFycyAmIHNhbGFyeShsb3ctaGlnaCxtZWRpdW0tbG93KQ0KKiBIb3dldmVyLCB0aGVyZSBpcyBvbmx5IDg0JSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIHRoZSBtZWFucyBvZiBzYXRpc2ZhY3Rpb24gbGV2ZWwgYWdhaW5zdCBtZWRpdW0taGlnaCBzYWxhcnkgYnVja2V0DQoNCi0tLQ0KDQojIyMjICoqUHJpbmNpcGFsIENvbXBvbmVudCBBbmFseXNpcyoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBQQ0ENClBDQSA8LSBwcmNvbXAoSFJfQW5hbHl0aWNzW3NhcHBseShIUl9BbmFseXRpY3MsaXMubnVtZXJpYyldWzI6NV0sY29yPVRSVUUsIHNjYWxlLiA9IFRSVUUsIHJldHggPSBUUlVFKTtQQ0ENCnN1bW1hcnkoUENBKQ0KI1RoZSBsb2FkaW5ncyBmb3IgdGhlIHByaW5jaXBhbCBjb21wb25lbnRzIGFyZSBzdG9yZWQgaW46DQojcHJpbnQoUENBJHJvdGF0aW9uKSAjIHdpdGggcHJpbmNvbXAoKTogcGNhJGxvYWRpbmdzDQoNCiNwbG90IG9mIHZhcmlhbmNlIG9mIGVhY2ggUENBLiBJdCB3aWxsIGJlIHVzZWZ1bCB0byBkZWNpZGUgaG93IG1hbnkgcHJpbmNpcGFsIGNvbXBvbmVudHMgc2hvdWxkIGJlIHJldGFpbmVkLg0Kc2NyZWVwbG90KFBDQSwgdHlwZT0ibGluZXMiLGNvbD0zKSAjIDMtY29tcG9uZW50cyBjYW4gYmUgcmV0YWluZWQNCg0KI2JpcGxvdCBvZiBmaXJzdCB0d28gcHJpbmNpcGFsIGNvbXBvbmVudHMNCmJpcGxvdChQQ0EsY2V4PTAuOCkNCmFibGluZShoID0gMCwgdiA9IDAsIGx0eSA9IDIsIGNvbCA9IDgpDQp0aXRsZSgiQmktUGxvdCIpDQoNCiMgSWRlbnRpZnkgd2hpY2ggdmFyaWFibGUgdG8gZHJvcA0KbGlicmFyeShyYXN0ZXIpDQpwcmludCh0KGxhcHBseShIUl9BbmFseXRpY3Nbc2FwcGx5KEhSX0FuYWx5dGljcyxpcy5udW1lcmljKV0sc2QpKSkNCnByaW50KHQobGFwcGx5KEhSX0FuYWx5dGljc1tzYXBwbHkoSFJfQW5hbHl0aWNzLGlzLm51bWVyaWMpXSxjdikpKQ0KDQpgYGANCg0KKiBEcm9wIHRpbWVfc3BlbmRfY29tcGFueSB2YXJpYWJsZSAmIGNvbnRpbnVlIHRyYW5zZm9ybWF0aW9uIHdpdGggZmlyc3QtMy1jb21wb25lbnRzDQoNCiogTm90ZTogQXMgdGhlcmUgYXJlIG9ubHkgZmV3IFZhcmlhYmxlcywgUENBIGlzIHVuYWJsZS9ub3Qtc3VpdGFibGUgdG8gZXhwbGFpbiBtb3JlIHZhcmlhbmNlcy4gSGVuY2UgcmVncmVzc2lvbiBtaWdodCBub3QgYmUgcHJlZmVyZWQgb24gUENBIGxvYWRpbmdzDQoNCi0tLQ0KDQojIyMjICoqTGluZWFyIFJlZ3Jlc3Npb24qKg0KIyMjIyMgTnVsbCBIeXBvdGhlc2lzOiBUaGVyZSBpcyBOTyBzaWduaWZpY2FudCByZWxhdGlvbnNoaXAgYmV0d2VlbiBzYXRpc2ZhY3Rpb24gbGV2ZWwgJiBvdGhlciBhdHRyaWJ1dGVzDQojIyMjIyBBbHRlcm5hdGUgSHlwb3RoZXNpczogVGhlcmUgaXMgc2lnbmlmaWNhbnQgcmVsYXRpb25zaGlwIGJldHdlZW4gc2F0aXNmYWN0aW9uIGxldmVsICYgb3RoZXIgYXR0cmlidXRlcw0KDQojIyMjIyAqKlNpbXBsZS9TdHJhdGlmaWVkIFJhbmRvbSBTYW1wbGluZyoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmxpYnJhcnkoc2FtcGxpbmcpDQpIUl9BbmFseXRpY3NfVHJhbnMgPC0gZGF0YS5mcmFtZShQQ0EkeFssMTozXSkNCm5hbWVzKEhSX0FuYWx5dGljc19UcmFucykgPC0gbmFtZXMoSFJfQW5hbHl0aWNzKVsyOjRdDQpIUl9BbmFseXRpY3NfVHJhbnNfRmluYWwgPC0gY2JpbmQoc2F0aXNmYWN0aW9uX2xldmVsPUhSX0FuYWx5dGljcyRzYXRpc2ZhY3Rpb25fbGV2ZWwsSFJfQW5hbHl0aWNzX1RyYW5zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSX0FuYWx5dGljc1tjKCJXb3JrX2FjY2lkZW50IiwicHJvbW90aW9uX2xhc3RfNXllYXJzIiwic2FsYXJ5IildKQ0KDQpIUl9BbmFseXRpY3NfVHJhbnNfRmluYWxfRlQgPC0gZGF0YS5mcmFtZSh0YWJsZShIUl9BbmFseXRpY3NfVHJhbnNfRmluYWwkc2FsYXJ5KSkNCkhSX0FuYWx5dGljc19UcmFuc19GaW5hbF9GVCRQZXIgPC0gKEhSX0FuYWx5dGljc19UcmFuc19GaW5hbF9GVCRGcmVxL3N1bShIUl9BbmFseXRpY3NfVHJhbnNfRmluYWxfRlQkRnJlcSkpKjEwMA0KbmFtZXMoSFJfQW5hbHl0aWNzX1RyYW5zX0ZpbmFsX0ZUKVsxXSA8LSAic2FsYXJ5Ig0KDQojIENvbnNpZGVyIDcwJSBvZiB0aGUgZGF0YSBhcyBzYW1wbGUNCkhSX0FuYWx5dGljc19UcmFuc19GaW5hbF9GVCRTdHJhdGFfU2l6ZSA8LSBjZWlsaW5nKChIUl9BbmFseXRpY3NfVHJhbnNfRmluYWxfRlQkRnJlcSooY2VpbGluZygoZGltKEhSX0FuYWx5dGljc19UcmFuc19GaW5hbClbMV0vMTAwKSo3MCkvc3VtKEhSX0FuYWx5dGljc19UcmFuc19GaW5hbF9GVCRGcmVxKSkpKQ0KSFJfQW5hbHl0aWNzX1RyYW5zX0ZpbmFsX0ZUIDwtIHdpdGgoSFJfQW5hbHl0aWNzX1RyYW5zX0ZpbmFsX0ZULEhSX0FuYWx5dGljc19UcmFuc19GaW5hbF9GVFtvcmRlcihTdHJhdGFfU2l6ZSxkZWNyZWFzaW5nID0gVFJVRSksXSkNCg0KIyBTdHJhdGlmaWNhdGlvbg0KSFJfQW5hbHl0aWNzX1RyYW5zX0ZpbmFsX1N0cmF0YSA8LSBzdHJhdGEoSFJfQW5hbHl0aWNzX1RyYW5zX0ZpbmFsLGMoInNhbGFyeSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IEhSX0FuYWx5dGljc19UcmFuc19GaW5hbF9GVCRTdHJhdGFfU2l6ZSwgbWV0aG9kID0gInNyc3dvciIpDQpIUl9BbmFseXRpY3NfVHJhbnNfU3RSUyA8LSBnZXRkYXRhKEhSX0FuYWx5dGljc19UcmFuc19GaW5hbCxIUl9BbmFseXRpY3NfVHJhbnNfRmluYWxfU3RyYXRhKQ0KaGVhZChIUl9BbmFseXRpY3NfVHJhbnNfU3RSUykNCmBgYA0KDQojIyMjIyAqKkxpbmVhciBNb2RlbCoqIFtSZWZlcmVuY2VdKGh0dHA6Ly9zdGF0dHJlay5jb20vcmVncmVzc2lvbi9saW5lYXItdHJhbnNmb3JtYXRpb24uYXNweD9UdXRvcmlhbD1BUCkNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KIyBMaW5lYXIgTW9kZWwNCnN1bW1hcnkobG0oc2F0aXNmYWN0aW9uX2xldmVsIH4gbGFzdF9ldmFsdWF0aW9uK251bWJlcl9wcm9qZWN0K2F2ZXJhZ2VfbW9udGhseV9ob3VycytXb3JrX2FjY2lkZW50Kw0KICAgICAgICAgICAgIHByb21vdGlvbl9sYXN0XzV5ZWFycytzYWxhcnksIGRhdGEgPSBIUl9BbmFseXRpY3NfVHJhbnNfU3RSUykpDQpwYXIobWZyb3cgPSBjKDIsMikpDQpwbG90KGxtKHNhdGlzZmFjdGlvbl9sZXZlbCB+IGxhc3RfZXZhbHVhdGlvbitudW1iZXJfcHJvamVjdCthdmVyYWdlX21vbnRobHlfaG91cnMrV29ya19hY2NpZGVudCsNCiAgICAgICAgICAgICBwcm9tb3Rpb25fbGFzdF81eWVhcnMrc2FsYXJ5LCBkYXRhID0gSFJfQW5hbHl0aWNzX1RyYW5zX1N0UlMpKQ0KYGBgDQoNCi0tLQ0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZ3M9RkFMU0V9DQojIFRyYW5zZm9ybWF0aW9uIG1ldGhvZHM6IExpbmVhciBNb2RlbA0Kc3VtbWFyeShsbShsb2coc2F0aXNmYWN0aW9uX2xldmVsKSB+IGxhc3RfZXZhbHVhdGlvbitudW1iZXJfcHJvamVjdCthdmVyYWdlX21vbnRobHlfaG91cnMrV29ya19hY2NpZGVudCsNCiAgICAgICAgICAgICBwcm9tb3Rpb25fbGFzdF81eWVhcnMrc2FsYXJ5LCBkYXRhID0gSFJfQW5hbHl0aWNzX1RyYW5zX1N0UlMpKQ0KcGFyKG1mcm93ID0gYygyLDIpKQ0KcGxvdChsbShleHAoc2F0aXNmYWN0aW9uX2xldmVsKSB+IGxhc3RfZXZhbHVhdGlvbitudW1iZXJfcHJvamVjdCthdmVyYWdlX21vbnRobHlfaG91cnMrV29ya19hY2NpZGVudCsNCiAgICAgICAgICAgICBwcm9tb3Rpb25fbGFzdF81eWVhcnMrc2FsYXJ5LCBkYXRhID0gSFJfQW5hbHl0aWNzX1RyYW5zX1N0UlMpKQ0KYGBgDQoNCiMjIyMjICoqSW5zaWdodHMqKg0KDQoqIExvZy10cmFuc2Zvcm1hdGlvbiBpcyBzdWNjZXNzZnVsLiBIb3dldmVyLCBvdmVyYWxsIHZhcmFpdGlvbnMgZXhwbGFpbmVkIGJ5IHRoZSBtb2RlbCBpcyBqdXN0IH4xMCUofjUlKS4gSGVuY2UgbW9kZWwgd2lsbCBoYXZlIHBvb3IgcHJlZGljdGlvbiBwb3dlcg0KKiBTaW5jZSBwPDAuMDUsIHdlIHJlamVjdCBOSCAmIGNvbmNsdWRlIHRoYXQgdGhlcmUgaXMgYSBzaWduZmljYW50IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNhdGlzZmFjdGlvbiBsZXZlbCAmIG90aGVyIGF0dHJpYnV0ZXMNCg==