library(ggplot2)
Warning: package ‘ggplot2’ was built under R version 4.3.2
US_Admission = read.csv("US Admission.csv")
US_Admission
US_Admission_data = US_Admission[ , c(1, 2, 3, 4, 5, 6, 7, 8, 9)]
US_Admission_data
ggplot(data = US_Admission, aes(x= Chance.of.Admit, y = GRE.Score, fill = Chance.of.Admit)) +
geom_boxplot() +
labs(title = "This plot is created using ggplot",
x = "Class",
y = "GRE Score",
caption = "Source: US Admission dataset")

ggplot(data = US_Admission, aes(x= Chance.of.Admit, y = GRE.Score, fill = Chance.of.Admit)) +
geom_boxplot() +
labs(title = "This plot is created using ggplot",
x = "Class",
y = "GRE Score",
caption = "Source: US Admission dataset")

ggplot(data = US_Admission, aes(x= Chance.of.Admit, y = GRE.Score, fill = Chance.of.Admit)) +
geom_violin() +
labs(title = "This plot is created using ggplot",
x = "Class",
y = "Gre Score",
caption = "Source: US Admission dataset")

summary(US_Admission)
Serial.No. GRE.Score TOEFL.Score University.Rating SOP LOR
Min. : 1.0 Min. :290.0 Min. : 92.0 Min. :1.000 Min. :1.0 Min. :1.000
1st Qu.:100.8 1st Qu.:308.0 1st Qu.:103.0 1st Qu.:2.000 1st Qu.:2.5 1st Qu.:3.000
Median :200.5 Median :317.0 Median :107.0 Median :3.000 Median :3.5 Median :3.500
Mean :200.5 Mean :316.8 Mean :107.4 Mean :3.087 Mean :3.4 Mean :3.453
3rd Qu.:300.2 3rd Qu.:325.0 3rd Qu.:112.0 3rd Qu.:4.000 3rd Qu.:4.0 3rd Qu.:4.000
Max. :400.0 Max. :340.0 Max. :120.0 Max. :5.000 Max. :5.0 Max. :5.000
CGPA Research Chance.of.Admit
Min. :6.800 Min. :0.0000 Min. :0.3400
1st Qu.:8.170 1st Qu.:0.0000 1st Qu.:0.6400
Median :8.610 Median :1.0000 Median :0.7300
Mean :8.599 Mean :0.5475 Mean :0.7244
3rd Qu.:9.062 3rd Qu.:1.0000 3rd Qu.:0.8300
Max. :9.920 Max. :1.0000 Max. :0.9700
cor(US_Admission$GRE.Score, US_Admission$Chance.of.Admit)
[1] 0.8026105
cor(US_Admission$GRE.Score, US_Admission$Chance.of.Admit)
[1] 0.8026105
cor_matrix = cor([ ,1:9])
Error: unexpected '[' in "cor_matrix = cor(["
library(ggcorrplot)
Warning: package ‘ggcorrplot’ was built under R version 4.3.2
ggcorrplot(cor_matrix)
Error: object 'cor_matrix' not found
ggcorrplot(cor_matrix, type = "lower")
Error: object 'cor_matrix' not found
ggcorrplot(cor_matrix, type = "upper")
Error: object 'cor_matrix' not found
ggcorrplot(cor_matrix,
type = "lower",
colors = c("purple", "white", "red"))
Error: object 'cor_matrix' not found
ggcorrplot(cor_matrix,
type = "lower",
colors = c("purple", "white", "red"),
lab = TRUE)
Error: object 'cor_matrix' not found
library(GGally)
Warning: package ‘GGally’ was built under R version 4.3.2Registered S3 method overwritten by 'GGally':
method from
+.gg ggplot2
ggpairs(US_Admission, aes(colour = Chance.of.Admit))
Error in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm, :
`mapping` color column must be categorical, not numeric

Interactive plots
library(plotly)
Warning: package ‘plotly’ was built under R version 4.3.2Registered S3 method overwritten by 'data.table':
method from
print.data.table
Registered S3 method overwritten by 'htmlwidgets':
method from
print.htmlwidget tools:rstudio
Attaching package: ‘plotly’
The following object is masked from ‘package:ggplot2’:
last_plot
The following object is masked from ‘package:stats’:
filter
The following object is masked from ‘package:graphics’:
layout
fig = US_Admission %>%
plot_ly(y = ~GRE.Score, type = 'violin')
fig
library(plotly)
plot_ly(US_Admission, y = ~GRE.Score, type = 'violin')
plot_ly(US_Admission, y = ~GRE.Score, type = 'box')
plot_ly(US_Admission, y = ~GRE.Score, type = 'histogram')
plot_ly(US_Admission, y = ~GRE.Score, type = 'box')
Principal Component Analysis (PCA)
# dimension = axis = features
library(stats)
US_Admission_pca = prcomp(US_Admission[ , -5], scale = TRUE, center = TRUE)
US_Admission_pca
Standard deviations (1, .., p=8):
[1] 2.2448897 1.0147558 0.8159866 0.7174349 0.5497783 0.4215816 0.3921441 0.3412182
Rotation (n x k) = (8 x 8):
PC1 PC2 PC3 PC4 PC5 PC6 PC7
Serial.No. 0.0522962 0.97239831 -0.05516732 0.02516041 0.11826286 0.18053185 0.01360579
GRE.Score -0.4008352 0.01577663 0.14494210 -0.35298064 -0.16372872 0.32176541 -0.72921638
TOEFL.Score -0.3973989 -0.05095482 -0.02307034 -0.42528893 -0.10456264 0.46649795 0.65477384
University.Rating -0.3733997 -0.11605801 -0.25765128 0.16415311 0.85869402 0.08727854 -0.06603407
LOR -0.3386775 -0.01537971 -0.41482054 0.68312815 -0.43137705 0.24444101 -0.02098251
CGPA -0.4158514 0.07432586 -0.10144202 -0.16633583 -0.07287889 -0.39114789 -0.05727696
Research -0.2909253 0.03559183 0.85096897 0.40868850 0.06649445 0.03006554 0.11376525
Chance.of.Admit -0.4086206 0.17634946 -0.05017154 -0.07481135 -0.12287811 -0.65190902 0.13529827
PC8
Serial.No. -0.035597656
GRE.Score 0.177149898
TOEFL.Score 0.028148682
University.Rating 0.066628227
LOR 0.006562243
CGPA -0.788667593
Research -0.068214708
Chance.of.Admit 0.579159882
summary(US_Admission_pca)
Importance of components:
PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8
Standard deviation 2.2449 1.0148 0.81599 0.71743 0.54978 0.42158 0.39214 0.34122
Proportion of Variance 0.6299 0.1287 0.08323 0.06434 0.03778 0.02222 0.01922 0.01455
Cumulative Proportion 0.6299 0.7587 0.84189 0.90623 0.94401 0.96622 0.98545 1.00000
pc_12 = data.frame(US_Admission_pca$x[ , 1:2])
head(pc_12)
pc_12_class = cbind(pc_12, Chance.of.Admit= US_Admission$Chance.of.Admit)
pc_12_class
ggplot(pc_12_class, aes(PC1, PC2, color=Chance.of.Admit)) +
geom_point() +
theme_minimal()

library(factoextra)
Warning: package ‘factoextra’ was built under R version 4.3.2Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
fviz_eig(US_Admission_pca, addlabels = TRUE)

fviz_pca_var(US_Admission_pca,
col.var = "contrib")

library("corrplot")
Warning: package ‘corrplot’ was built under R version 4.3.2corrplot 0.92 loaded
var = get_pca_var(US_Admission_pca)
corrplot(var$cos2)

fviz_pca_ind(US_Admission_pca,
geom.ind = "point",
col.ind = US_Admission$Chance.of.Admit,
addEllipses = TRUE)
Error in `train_continuous()`:
! Discrete value supplied to a continuous scale
Backtrace:
1. base (local) `<fn>`(x)
2. ggplot2:::print.ggplot(x)
4. ggplot2:::ggplot_build.ggplot(x)
5. base::lapply(data, scales_train_df, scales = npscales)
6. ggplot2 (local) FUN(X[[i]], ...)
...
10. ggplot2 (local) train_df(..., self = self)
11. self$train(df[[aesthetic]])
12. ggplot2 (local) train(..., self = self)
13. self$range$train(x)
14. scales::train_continuous(x, self$range)

Regression
library(datasets)
data(US_Admission)
Warning: data set ‘US_Admission’ not found
lm_model = lm(GRE.Score ~ TOEFL.Score, data = US_Admission)
summary(lm_model)
Call:
lm(formula = GRE.Score ~ TOEFL.Score, data = US_Admission)
Residuals:
Min 1Q Median 3Q Max
-21.419 -3.910 0.273 3.421 18.903
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 147.067 5.594 26.29 <2e-16 ***
TOEFL.Score 1.580 0.052 30.39 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 6.304 on 398 degrees of freedom
Multiple R-squared: 0.6989, Adjusted R-squared: 0.6981
F-statistic: 923.6 on 1 and 398 DF, p-value: < 2.2e-16
# p < 0.05
x = US_Admission$GRE.Score
y = US_Admission$TOEFL.Score
plot(x, y)

pred = predict(lm_model)
ix = sort(x, index.return = T)$ix # sort and return index not the acrtual values
plot(x, y)
lines(x[ix], pred[ix])

NA
NA
ggplot(US_Admission, aes(x = GRE.Score, y = TOEFL.Score)) +
geom_point() +
geom_smooth(method = "lm", level = 0.95)

ggplot(US_Admission, aes(x = GRE.Score, y = TOEFL.Score, color = Chance.of.Admit)) +
geom_point() +
geom_smooth(method = "lm", level = 0.95)

ggplot(US_Admission, aes(x = GRE.Score, y = TOEFL.Score, color = Chance.of.Admit)) +
geom_point() +
geom_smooth(method = "lm", formula = y~poly(x, 2), level = 0.95)

Clustering
kmeans_result = kmeans(US_Admission[ , 1:6], centers = 3 )
kmeans_result
K-means clustering with 3 clusters of sizes 133, 134, 133
Cluster means:
Serial.No. GRE.Score TOEFL.Score University.Rating SOP LOR
1 67.0 317.3835 107.9398 3.315789 3.571429 3.492481
2 333.5 314.9254 105.8955 2.776119 3.115672 3.242537
3 200.0 318.1278 108.4060 3.172932 3.515038 3.624060
Clustering vector:
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[49] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[97] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3
[145] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
[193] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
[241] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[289] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[337] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[385] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
Within cluster sum of squares by cluster:
[1] 221793.8 222220.4 215766.1
(between_SS / total_SS = 87.8 %)
Available components:
[1] "cluster" "centers" "totss" "withinss" "tot.withinss" "betweenss"
[7] "size" "iter" "ifault"
library(cluster)
clusplot(US_Admission, kmeans_result$cluster)

Classification
library(lattice)
library(e1071)
library(caret)
train_ix = createDataPartition(US_Admission$Chance.of.Admit, p = 0.8, list = FALSE)
train_data = US_Admission[train_ix, ]
test_data = US_Admission[-train_ix, ]
train_data
test_data
svm_model = svm(Chance.of.Admit ~ GRE.Score+TOEFL.Score+University.Rating+SOP+LOR+CGPA+Research, data = train_data, kernel = "linear")
test_data[24, ]
predict(svm_model, newdata = test_data[24, -9])
108
0.9365611
predictions = predict(svm_model, newdata = test_data)
conf_max = confusionMatrix(predictions, test_data$Chance.of.Admit)
Error: `data` and `reference` should be factors with the same levels.
cm = as.data.frame(conf_max$table)
Error: object 'conf_max' not found
LS0tDQpuYW1lOiAiYWZyb3phX3BhcnZpbiINCmFmZmlsaWF0aW9uOiAic3NvX2Jjc2lyIg0KdGl0bGU6IOKAnGRhdGEtc2NpZW5jZS1wcm9qZWN0LXBhcnQy4oCdDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCi0tLQ0KDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpVU19BZG1pc3Npb24gPSByZWFkLmNzdigiVVMgQWRtaXNzaW9uLmNzdiIpDQpVU19BZG1pc3Npb24NCmBgYA0KDQoNCg0KYGBge3J9DQpVU19BZG1pc3Npb25fZGF0YSA9IFVTX0FkbWlzc2lvblsgLCBjKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpXQ0KVVNfQWRtaXNzaW9uX2RhdGENCmBgYA0KDQoNCg0KYGBge3J9DQoNCmdncGxvdChkYXRhID0gVVNfQWRtaXNzaW9uLCBhZXMoeD0gQ2hhbmNlLm9mLkFkbWl0LCB5ID0gR1JFLlNjb3JlLCBmaWxsID0gQ2hhbmNlLm9mLkFkbWl0KSkgKyANCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBsYWJzKHRpdGxlID0gIlRoaXMgcGxvdCBpcyBjcmVhdGVkIHVzaW5nIGdncGxvdCIsDQogICAgICAgeCA9ICJDbGFzcyIsDQogICAgICAgeSA9ICJHUkUgU2NvcmUiLA0KICAgICAgIGNhcHRpb24gPSAiU291cmNlOiBVUyBBZG1pc3Npb24gZGF0YXNldCIpDQpgYGANCg0KDQoNCmBgYHtyfQ0KDQpnZ3Bsb3QoZGF0YSA9IFVTX0FkbWlzc2lvbiwgYWVzKHg9IENoYW5jZS5vZi5BZG1pdCwgeSA9IEdSRS5TY29yZSwgZmlsbCA9IENoYW5jZS5vZi5BZG1pdCkpICsgDQogIGdlb21fYm94cGxvdCgpICsNCiAgbGFicyh0aXRsZSA9ICJUaGlzIHBsb3QgaXMgY3JlYXRlZCB1c2luZyBnZ3Bsb3QiLA0KICAgICAgIHggPSAiQ2xhc3MiLA0KICAgICAgIHkgPSAiR1JFIFNjb3JlIiwNCiAgICAgICBjYXB0aW9uID0gIlNvdXJjZTogVVMgQWRtaXNzaW9uIGRhdGFzZXQiKQ0KYGBgDQoNCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IFVTX0FkbWlzc2lvbiwgYWVzKHg9IENoYW5jZS5vZi5BZG1pdCwgeSA9IEdSRS5TY29yZSwgZmlsbCA9IENoYW5jZS5vZi5BZG1pdCkpICsgDQogIGdlb21fdmlvbGluKCkgKw0KICBsYWJzKHRpdGxlID0gIlRoaXMgcGxvdCBpcyBjcmVhdGVkIHVzaW5nIGdncGxvdCIsDQogICAgICAgeCA9ICJDbGFzcyIsDQogICAgICAgeSA9ICJHcmUgU2NvcmUiLA0KICAgICAgIGNhcHRpb24gPSAiU291cmNlOiBVUyBBZG1pc3Npb24gZGF0YXNldCIpDQpgYGANCg0KDQpgYGB7cn0NCnN1bW1hcnkoVVNfQWRtaXNzaW9uKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCmNvcihVU19BZG1pc3Npb24kR1JFLlNjb3JlLCBVU19BZG1pc3Npb24kQ2hhbmNlLm9mLkFkbWl0KQ0KY29yKFVTX0FkbWlzc2lvbiRHUkUuU2NvcmUsIFVTX0FkbWlzc2lvbiRDaGFuY2Uub2YuQWRtaXQpDQpgYGANCg0KDQpgYGB7cn0NCmNvcl9tYXRyaXggPSBjb3IoWyAsMTo5XSkNCmNvcl9tYXRyaXgNCmBgYA0KDQoNCmBgYHtyfQ0KbGlicmFyeShnZ2NvcnJwbG90KQ0KZ2djb3JycGxvdChjb3JfbWF0cml4KQ0KYGBgDQoNCg0KYGBge3J9DQpnZ2NvcnJwbG90KGNvcl9tYXRyaXgsIHR5cGUgPSAibG93ZXIiKQ0KYGBgDQoNCg0KYGBge3J9DQpnZ2NvcnJwbG90KGNvcl9tYXRyaXgsIHR5cGUgPSAidXBwZXIiKQ0KYGBgDQoNCg0KYGBge3J9DQpnZ2NvcnJwbG90KGNvcl9tYXRyaXgsIA0KICAgICAgICAgICB0eXBlID0gImxvd2VyIiwNCiAgICAgICAgICAgY29sb3JzID0gYygicHVycGxlIiwgIndoaXRlIiwgInJlZCIpKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCmdnY29ycnBsb3QoY29yX21hdHJpeCwgDQogICAgICAgICAgIHR5cGUgPSAibG93ZXIiLA0KICAgICAgICAgICBjb2xvcnMgPSBjKCJwdXJwbGUiLCAid2hpdGUiLCAicmVkIiksDQogICAgICAgICAgIGxhYiA9IFRSVUUpDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkoR0dhbGx5KQ0KZ2dwYWlycyhVU19BZG1pc3Npb24sIGFlcyhjb2xvdXIgPSBDaGFuY2Uub2YuQWRtaXQpKQ0KYGBgDQoNCg0KIyBJbnRlcmFjdGl2ZSBwbG90cw0KYGBge3J9DQpsaWJyYXJ5KHBsb3RseSkNCg0KZmlnID0gVVNfQWRtaXNzaW9uICU+JQ0KICBwbG90X2x5KHkgPSB+R1JFLlNjb3JlLCB0eXBlID0gJ3Zpb2xpbicpDQogIA0KZmlnDQpgYGANCg0KDQoNCmBgYHtyfQ0KDQpsaWJyYXJ5KHBsb3RseSkNCnBsb3RfbHkoVVNfQWRtaXNzaW9uLCB5ID0gfkdSRS5TY29yZSwgdHlwZSA9ICd2aW9saW4nKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCnBsb3RfbHkoVVNfQWRtaXNzaW9uLCB5ID0gfkdSRS5TY29yZSwgdHlwZSA9ICdib3gnKQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdF9seShVU19BZG1pc3Npb24sIHkgPSB+R1JFLlNjb3JlLCB0eXBlID0gJ2hpc3RvZ3JhbScpDQpgYGANCg0KDQoNCmBgYHtyfQ0KcGxvdF9seShVU19BZG1pc3Npb24sIHkgPSB+R1JFLlNjb3JlLCB0eXBlID0gJ2JveCcpDQpgYGANCg0KDQojIFByaW5jaXBhbCBDb21wb25lbnQgQW5hbHlzaXMgKFBDQSkNCg0KYGBge3J9DQojIGRpbWVuc2lvbiA9IGF4aXMgPSBmZWF0dXJlcw0KbGlicmFyeShzdGF0cykNCg0KVVNfQWRtaXNzaW9uX3BjYSA9IHByY29tcChVU19BZG1pc3Npb25bICwgLTVdLCBzY2FsZSA9IFRSVUUsIGNlbnRlciA9IFRSVUUpDQpVU19BZG1pc3Npb25fcGNhDQpgYGANCg0KDQpgYGB7cn0NCnN1bW1hcnkoVVNfQWRtaXNzaW9uX3BjYSkNCmBgYA0KDQpgYGB7cn0NCnBjXzEyID0gZGF0YS5mcmFtZShVU19BZG1pc3Npb25fcGNhJHhbICwgMToyXSkNCmhlYWQocGNfMTIpDQoNCnBjXzEyX2NsYXNzID0gY2JpbmQocGNfMTIsIENoYW5jZS5vZi5BZG1pdD0gVVNfQWRtaXNzaW9uJENoYW5jZS5vZi5BZG1pdCkNCnBjXzEyX2NsYXNzDQpgYGANCg0KDQoNCmBgYHtyfQ0KZ2dwbG90KHBjXzEyX2NsYXNzLCBhZXMoUEMxLCBQQzIsIGNvbG9yPUNoYW5jZS5vZi5BZG1pdCkpICsgDQogIGdlb21fcG9pbnQoKSArIA0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZmFjdG9leHRyYSkNCmZ2aXpfZWlnKFVTX0FkbWlzc2lvbl9wY2EsIGFkZGxhYmVscyA9IFRSVUUpDQpgYGANCg0KDQoNCmBgYHtyfQ0KZnZpel9wY2FfdmFyKFVTX0FkbWlzc2lvbl9wY2EsDQogICAgICAgICAgICAgY29sLnZhciA9ICJjb250cmliIikNCmBgYA0KDQoNCg0KYGBge3J9DQpsaWJyYXJ5KCJjb3JycGxvdCIpDQp2YXIgPSBnZXRfcGNhX3ZhcihVU19BZG1pc3Npb25fcGNhKQ0KY29ycnBsb3QodmFyJGNvczIpDQpgYGANCg0KDQpgYGB7cn0NCmZ2aXpfcGNhX2luZChVU19BZG1pc3Npb25fcGNhLA0KICAgICAgICAgICAgIGdlb20uaW5kID0gInBvaW50IiwNCiAgICAgICAgICAgICBjb2wuaW5kID0gVVNfQWRtaXNzaW9uJENoYW5jZS5vZi5BZG1pdCwNCiAgICAgICAgICAgICBhZGRFbGxpcHNlcyA9IFRSVUUpDQpgYGANCg0KDQojIFJlZ3Jlc3Npb24NCg0KYGBge3J9DQoNCmxpYnJhcnkoZGF0YXNldHMpDQpkYXRhKFVTX0FkbWlzc2lvbikNCg0KbG1fbW9kZWwgPSBsbShHUkUuU2NvcmUgfiBUT0VGTC5TY29yZSwgZGF0YSA9IFVTX0FkbWlzc2lvbikNCnN1bW1hcnkobG1fbW9kZWwpDQpgYGANCg0KDQpgYGB7cn0NCiMgcCA8IDAuMDUNCg0KeCA9IFVTX0FkbWlzc2lvbiRHUkUuU2NvcmUNCnkgPSBVU19BZG1pc3Npb24kVE9FRkwuU2NvcmUNCg0KcGxvdCh4LCB5KQ0KYGBgDQoNCg0KYGBge3J9DQpwcmVkID0gcHJlZGljdChsbV9tb2RlbCkNCml4ID0gc29ydCh4LCBpbmRleC5yZXR1cm4gPSBUKSRpeCAjIHNvcnQgYW5kIHJldHVybiBpbmRleCBub3QgdGhlIGFjcnR1YWwgdmFsdWVzDQoNCnBsb3QoeCwgeSkNCmxpbmVzKHhbaXhdLCBwcmVkW2l4XSkNCg0KDQpgYGANCg0KDQpgYGB7cn0NCmdncGxvdChVU19BZG1pc3Npb24sIGFlcyh4ID0gR1JFLlNjb3JlLCB5ID0gVE9FRkwuU2NvcmUpKSArIA0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBsZXZlbCA9IDAuOTUpDQpgYGANCg0KDQoNCmBgYHtyfQ0KZ2dwbG90KFVTX0FkbWlzc2lvbiwgYWVzKHggPSBHUkUuU2NvcmUsIHkgPSBUT0VGTC5TY29yZSwgY29sb3IgPSBDaGFuY2Uub2YuQWRtaXQpKSArIA0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBsZXZlbCA9IDAuOTUpDQpgYGANCg0KDQpgYGB7cn0NCmdncGxvdChVU19BZG1pc3Npb24sIGFlcyh4ID0gR1JFLlNjb3JlLCB5ID0gVE9FRkwuU2NvcmUsIGNvbG9yID0gQ2hhbmNlLm9mLkFkbWl0KSkgKyANCiAgZ2VvbV9wb2ludCgpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgZm9ybXVsYSA9IHl+cG9seSh4LCAyKSwgbGV2ZWwgPSAwLjk1KQ0KYGBgDQoNCiMgQ2x1c3RlcmluZw0KDQpgYGB7cn0NCmttZWFuc19yZXN1bHQgPSBrbWVhbnMoVVNfQWRtaXNzaW9uWyAsIDE6Nl0sIGNlbnRlcnMgPSAzICkNCmttZWFuc19yZXN1bHQNCmBgYA0KDQoNCmBgYHtyfQ0KbGlicmFyeShjbHVzdGVyKQ0KY2x1c3Bsb3QoVVNfQWRtaXNzaW9uLCBrbWVhbnNfcmVzdWx0JGNsdXN0ZXIpDQpgYGANCg0KDQojIENsYXNzaWZpY2F0aW9uDQpgYGB7cn0NCmxpYnJhcnkobGF0dGljZSkNCmxpYnJhcnkoZTEwNzEpDQpsaWJyYXJ5KGNhcmV0KQ0KDQp0cmFpbl9peCA9IGNyZWF0ZURhdGFQYXJ0aXRpb24oVVNfQWRtaXNzaW9uJENoYW5jZS5vZi5BZG1pdCwgcCA9IDAuOCwgbGlzdCA9IEZBTFNFKQ0KdHJhaW5fZGF0YSA9IFVTX0FkbWlzc2lvblt0cmFpbl9peCwgXQ0KdGVzdF9kYXRhID0gVVNfQWRtaXNzaW9uWy10cmFpbl9peCwgXQ0KDQp0cmFpbl9kYXRhDQp0ZXN0X2RhdGENCg0KDQpzdm1fbW9kZWwgPSBzdm0oQ2hhbmNlLm9mLkFkbWl0IH4gR1JFLlNjb3JlK1RPRUZMLlNjb3JlK1VuaXZlcnNpdHkuUmF0aW5nK1NPUCtMT1IrQ0dQQStSZXNlYXJjaCwgZGF0YSA9IHRyYWluX2RhdGEsIGtlcm5lbCA9ICJsaW5lYXIiKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KdGVzdF9kYXRhWzI0LCBdDQpgYGANCg0KDQoNCmBgYHtyfQ0KDQpwcmVkaWN0KHN2bV9tb2RlbCwgbmV3ZGF0YSA9IHRlc3RfZGF0YVsyNCwgLTldKQ0KYGBgDQoNCg0KYGBge3J9DQpwcmVkaWN0aW9ucyA9IHByZWRpY3Qoc3ZtX21vZGVsLCBuZXdkYXRhID0gdGVzdF9kYXRhKQ0KY29uZl9tYXggPSBjb25mdXNpb25NYXRyaXgocHJlZGljdGlvbnMsIHRlc3RfZGF0YSRDaGFuY2Uub2YuQWRtaXQpDQpjb25mX21heA0KYGBgDQoNCmBgYHtyfQ0KDQpjbSA9IGFzLmRhdGEuZnJhbWUoY29uZl9tYXgkdGFibGUpDQoNCmdncGxvdChjbSwgYWVzKFByZWRpY3Rpb24sIFJlZmVyZW5jZSwgZmlsbCA9IEZyZXEpKSArIA0KICBnZW9tX3RpbGUoKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBGcmVxKSkgKyANCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3c9IndoaXRlIiwgaGlnaD0ic2t5Ymx1ZSIpDQpgYGANCg0KDQo=