Part 1
Scatter plot of the return on the Experts (x axis) vs the return on
Eli Lilly(yaxis):
plot(StockData$Experts, StockData$Eli.Lilly, xlab = "Experts", ylab = "Eli Lilly", pch=18, col="red")
abline(h=0)
abline(v=0)

It does not appear that the two plots move together. The “Experts”
have a higher dispersion as measured by variance and standard deviation
vs. Eli Lilly, and is therefore riskier.
plot(range(StockData$Period), range(StockData$Experts), type="n", xlab="Period",
ylab="Return" )
colors = rainbow(3)
linetype = c(1:3)
lines(StockData$Period, StockData$Experts, type="l", lwd=2.5,lty=linetype[1], col=colors[1])
lines(StockData$Period, StockData$Eli.Lilly, type="l", lwd=2.5,lty=linetype[2], col=colors[2])
lines(StockData$Period, StockData$DJIA, type="l", lwd=2.5,lty=linetype[3], col=colors[3])
title("Time Series of Returns")
legend(range(StockData$Period)[1], range(StockData$Experts)[2],
c("Experts","Eli Lilly","DJIA"), cex=0.8, col=colors,lty=linetype)

The “Experts” appear to be the riskiest, as they have the most
volatility. The DJIA appears the least risky as its plot is the least
volatile. The investments appear weakly correlated.
Variance and standard deviation for each investment:
variance_experts <- var(StockData$Experts)
variance_eli_lilly <- var(StockData$Eli.Lilly)
variance_djia <- var(StockData$DJIA)
sd_experts <- sd(StockData$Experts)
sd_eli_lilly <- sd(StockData$Eli.Lilly)
sd_djia <- sd(StockData$DJIA)
cat("Variance of Experts:", variance_experts, "\n")
Variance of Experts: 522.1556
cat("Variance of Eli Lilly:", variance_eli_lilly, "\n")
Variance of Eli Lilly: 326.9819
cat("Variance of DJIA:", variance_djia, "\n")
Variance of DJIA: 53.67359
cat("Standard Deviation of Experts:", sd_experts, "\n")
Standard Deviation of Experts: 22.85072
cat("Standard Deviation of Eli Lilly:", sd_eli_lilly, "\n")
Standard Deviation of Eli Lilly: 18.08264
cat("Standard Deviation of DJIA:", sd_djia, "\n")
Standard Deviation of DJIA: 7.326226
Riskiest and least risky investments:
investment_sd <- c(Experts = sd_experts, Eli_Lilly = sd_eli_lilly, DJIA = sd_djia)
riskiest <- names(investment_sd)[which.max(investment_sd)]
least_risky <- names(investment_sd)[which.min(investment_sd)]
cat("Riskiest investment:", riskiest, "\n")
Riskiest investment: Experts
cat("Least risky investment:", least_risky, "\n")
Least risky investment: DJIA
The investments with higher returns are also the investments with
higher volatility as measured by standard deviation. It appears that the
higher return investments also come with higher risk.
Correlation matrix for Experts, Eli Lilly, and DJIA (to identify iF
they move together):
cor_matrix <- cor(StockData[, c("Experts", "Eli.Lilly", "DJIA")])
print(cor_matrix)
Experts Eli.Lilly DJIA
Experts 1.0000000 0.2505657 0.5459410
Eli.Lilly 0.2505657 1.0000000 0.4597221
DJIA 0.5459410 0.4597221 1.0000000
# Analyze correlations between pairs
cor_experts_eli_lilly <- cor_matrix["Experts", "Eli.Lilly"]
cor_experts_djia <- cor_matrix["Experts", "DJIA"]
cor_eli_lilly_djia <- cor_matrix["Eli.Lilly", "DJIA"]
# Print individual correlations
cat("Correlation between Experts and Eli Lilly:", cor_experts_eli_lilly, "\n")
Correlation between Experts and Eli Lilly: 0.2505657
cat("Correlation between Experts and DJIA:", cor_experts_djia, "\n")
Correlation between Experts and DJIA: 0.545941
cat("Correlation between Eli Lilly and DJIA:", cor_eli_lilly_djia, "\n")
Correlation between Eli Lilly and DJIA: 0.4597221
# Interpretation: Are they moving together?
if (cor_experts_eli_lilly > 0) {
cat("Experts and Eli Lilly move together (positive correlation).\n")
} else {
cat("Experts and Eli Lilly do not move together (negative or no correlation).\n")
}
Experts and Eli Lilly move together (positive correlation).
if (cor_experts_djia > 0) {
cat("Experts and DJIA move together (positive correlation).\n")
} else {
cat("Experts and DJIA do not move together (negative or no correlation).\n")
}
Experts and DJIA move together (positive correlation).
if (cor_eli_lilly_djia > 0) {
cat("Eli Lilly and DJIA move together (positive correlation).\n")
} else {
cat("Eli Lilly and DJIA do not move together (negative or no correlation).\n")
}
Eli Lilly and DJIA move together (positive correlation).
Average return and sd of the return on the portfolio:
average_experts <- mean(StockData$Experts)
average_eli_lilly <- mean(StockData$Eli.Lilly)
average_djia <- mean(StockData$DJIA)
cat("Sample average return for Experts:", average_experts, "\n")
Sample average return for Experts: 10.30658
cat("Sample average return for Eli Lilly:", average_eli_lilly, "\n")
Sample average return for Eli Lilly: 6.373158
cat("Sample average return for DJIA:", average_djia, "\n")
Sample average return for DJIA: 5.838158
# Calculate the sample standard deviation for each investment
sd_experts <- sd(StockData$Experts)
sd_eli_lilly <- sd(StockData$Eli.Lilly)
sd_djia <- sd(StockData$DJIA)
cat("Sample standard deviation for Experts:", sd_experts, "\n")
Sample standard deviation for Experts: 22.85072
cat("Sample standard deviation for Eli Lilly:", sd_eli_lilly, "\n")
Sample standard deviation for Eli Lilly: 18.08264
cat("Sample standard deviation for DJIA:", sd_djia, "\n")
Sample standard deviation for DJIA: 7.326226
Part 2
Covariance matrix:
cov_matrix <- cov(StockData[,2:4])
cov_matrix
Experts Eli.Lilly DJIA
Experts 522.15556 103.53413 91.39575
Eli.Lilly 103.53413 326.98194 60.90285
DJIA 91.39575 60.90285 53.67359
Correlation matrix:
cor_matrix <- cor(StockData[,2:4])
cor_matrix
Experts Eli.Lilly DJIA
Experts 1.0000000 0.2505657 0.5459410
Eli.Lilly 0.2505657 1.0000000 0.4597221
DJIA 0.5459410 0.4597221 1.0000000
Portfolio return calculation Mean and standard deviation for Experts
and Eli Lilly:
mean_experts <- mean(StockData$Experts)
mean_eli_lilly <- mean(StockData$Eli.Lilly)
sd_experts <- sd(StockData$Experts)
sd_eli_lilly <- sd(StockData$Eli.Lilly)
Covariance between Experts and Eli Lilly:
cov_experts_eli_lilly <- cov(StockData$Experts, StockData$Eli.Lilly)
Alpha values (weights on Experts):
alphas <- seq(0, 1, 0.05)
Portfolio mean (expected return) and standard deviation (risk):
portfolio_means <- alphas * mean_experts + (1 - alphas) * mean_eli_lilly
portfolio_variances <- alphas^2 * sd_experts^2 + (1 - alphas)^2 * sd_eli_lilly^2 +
2 * alphas * (1 - alphas) * cov_experts_eli_lilly
portfolio_sds <- sqrt(portfolio_variances)
Return-to-risk ratio (return / standard deviation)
return_to_risk <- portfolio_means / portfolio_sds
portfolio_analysis <- data.frame(
Alpha = alphas,
Portfolio_Return = portfolio_means,
Portfolio_SD = portfolio_sds,
Return_to_Risk = return_to_risk
)
# Print the data frame with the results
print(portfolio_analysis)
NA
Portfolio Return vs Risk (Standard Deviation)
plot(portfolio_sds, portfolio_means, type="l", xlab="Portfolio Risk (Standard Deviation)", ylab="Portfolio Return",
main="Portfolio Risk-Return Tradeoff", col="blue", lwd=2)
grid()

The resulting curve tells us that diversification can actually drive
lower risk and higher returns for certain alphas vs. single asset
portfolios. The alphas of 0.30 and below would be the least desirable
since they all have higher risk for lower returns. We would choose an
alpha of 0.55, since that is where the expected return / standard
deviation is the highest.
LS0tCnRpdGxlOiAiRGF0YSAmIERlY2lzaW9ucyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIyMgKipMYWIgQXNzaWdubWVudCAjMioqCiMjIyAqKkFnYXRhIEJyYWphLCBNaWNoYWVsIFBhcXVldHRlKioKKipPY3RvYmVyIDQsIDIwMjQqKgoKCkxvYWQgdGhlIFN0b2NrIERhdGEgQ1NWIGZpbGU6CmBgYHtyfQpTdG9ja0RhdGEgPC0gcmVhZC5jc3YoJ1N0b2NrRGF0YS5jc3YnLCBzdHJpbmdzQXNGYWN0b3JzID0gVFJVRSkKYGBgCiMjIyBQYXJ0IDEKU2NhdHRlciBwbG90IG9mIHRoZSByZXR1cm4gb24gdGhlIEV4cGVydHMgKHggYXhpcykgdnMgdGhlIHJldHVybiBvbiBFbGkgTGlsbHkoeWF4aXMpOgoKYGBge3J9CnBsb3QoU3RvY2tEYXRhJEV4cGVydHMsIFN0b2NrRGF0YSRFbGkuTGlsbHksIHhsYWIgPSAiRXhwZXJ0cyIsIHlsYWIgPSAiRWxpIExpbGx5IiwgcGNoPTE4LCBjb2w9InJlZCIpCmFibGluZShoPTApIAphYmxpbmUodj0wKQpgYGAKSXQgZG9lcyBub3QgYXBwZWFyIHRoYXQgdGhlIHR3byBwbG90cyBtb3ZlIHRvZ2V0aGVyLiAgVGhlIOKAnEV4cGVydHPigJ0gaGF2ZSBhIGhpZ2hlciBkaXNwZXJzaW9uIGFzIG1lYXN1cmVkIGJ5IHZhcmlhbmNlIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gdnMuIEVsaSBMaWxseSwgYW5kIGlzIHRoZXJlZm9yZSByaXNraWVyLgoKCmBgYHtyfQoKcGxvdChyYW5nZShTdG9ja0RhdGEkUGVyaW9kKSwgcmFuZ2UoU3RvY2tEYXRhJEV4cGVydHMpLCB0eXBlPSJuIiwgeGxhYj0iUGVyaW9kIiwKICAgICB5bGFiPSJSZXR1cm4iICkgCmNvbG9ycyA9IHJhaW5ib3coMykgCmxpbmV0eXBlID0gYygxOjMpIAoKbGluZXMoU3RvY2tEYXRhJFBlcmlvZCwgU3RvY2tEYXRhJEV4cGVydHMsIHR5cGU9ImwiLCBsd2Q9Mi41LGx0eT1saW5ldHlwZVsxXSwgY29sPWNvbG9yc1sxXSkgCmxpbmVzKFN0b2NrRGF0YSRQZXJpb2QsIFN0b2NrRGF0YSRFbGkuTGlsbHksIHR5cGU9ImwiLCBsd2Q9Mi41LGx0eT1saW5ldHlwZVsyXSwgY29sPWNvbG9yc1syXSkKbGluZXMoU3RvY2tEYXRhJFBlcmlvZCwgU3RvY2tEYXRhJERKSUEsIHR5cGU9ImwiLCBsd2Q9Mi41LGx0eT1saW5ldHlwZVszXSwgY29sPWNvbG9yc1szXSkKCnRpdGxlKCJUaW1lIFNlcmllcyBvZiBSZXR1cm5zIikKbGVnZW5kKHJhbmdlKFN0b2NrRGF0YSRQZXJpb2QpWzFdLCByYW5nZShTdG9ja0RhdGEkRXhwZXJ0cylbMl0sCiAgICAgICBjKCJFeHBlcnRzIiwiRWxpIExpbGx5IiwiREpJQSIpLCBjZXg9MC44LCBjb2w9Y29sb3JzLGx0eT1saW5ldHlwZSkKYGBgCgpUaGUg4oCcRXhwZXJ0c+KAnSBhcHBlYXIgdG8gYmUgdGhlIHJpc2tpZXN0LCBhcyB0aGV5IGhhdmUgdGhlIG1vc3Qgdm9sYXRpbGl0eS4gVGhlIERKSUEgYXBwZWFycyB0aGUgbGVhc3Qgcmlza3kgYXMgaXRzIHBsb3QgaXMgdGhlIGxlYXN0IHZvbGF0aWxlLiBUaGUgaW52ZXN0bWVudHMgYXBwZWFyIHdlYWtseSBjb3JyZWxhdGVkLgoKVmFyaWFuY2UgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgZWFjaCBpbnZlc3RtZW50OgpgYGB7cn0gIAp2YXJpYW5jZV9leHBlcnRzIDwtIHZhcihTdG9ja0RhdGEkRXhwZXJ0cykKdmFyaWFuY2VfZWxpX2xpbGx5IDwtIHZhcihTdG9ja0RhdGEkRWxpLkxpbGx5KQp2YXJpYW5jZV9kamlhIDwtIHZhcihTdG9ja0RhdGEkREpJQSkKCnNkX2V4cGVydHMgPC0gc2QoU3RvY2tEYXRhJEV4cGVydHMpCnNkX2VsaV9saWxseSA8LSBzZChTdG9ja0RhdGEkRWxpLkxpbGx5KQpzZF9kamlhIDwtIHNkKFN0b2NrRGF0YSRESklBKQoKY2F0KCJWYXJpYW5jZSBvZiBFeHBlcnRzOiIsIHZhcmlhbmNlX2V4cGVydHMsICJcbiIpCmNhdCgiVmFyaWFuY2Ugb2YgRWxpIExpbGx5OiIsIHZhcmlhbmNlX2VsaV9saWxseSwgIlxuIikKY2F0KCJWYXJpYW5jZSBvZiBESklBOiIsIHZhcmlhbmNlX2RqaWEsICJcbiIpCgpjYXQoIlN0YW5kYXJkIERldmlhdGlvbiBvZiBFeHBlcnRzOiIsIHNkX2V4cGVydHMsICJcbiIpCmNhdCgiU3RhbmRhcmQgRGV2aWF0aW9uIG9mIEVsaSBMaWxseToiLCBzZF9lbGlfbGlsbHksICJcbiIpCmNhdCgiU3RhbmRhcmQgRGV2aWF0aW9uIG9mIERKSUE6Iiwgc2RfZGppYSwgIlxuIikKCmBgYAoKUmlza2llc3QgYW5kIGxlYXN0IHJpc2t5IGludmVzdG1lbnRzOgpgYGB7cn0gIAppbnZlc3RtZW50X3NkIDwtIGMoRXhwZXJ0cyA9IHNkX2V4cGVydHMsIEVsaV9MaWxseSA9IHNkX2VsaV9saWxseSwgREpJQSA9IHNkX2RqaWEpCgpyaXNraWVzdCA8LSBuYW1lcyhpbnZlc3RtZW50X3NkKVt3aGljaC5tYXgoaW52ZXN0bWVudF9zZCldCmxlYXN0X3Jpc2t5IDwtIG5hbWVzKGludmVzdG1lbnRfc2QpW3doaWNoLm1pbihpbnZlc3RtZW50X3NkKV0KCmNhdCgiUmlza2llc3QgaW52ZXN0bWVudDoiLCByaXNraWVzdCwgIlxuIikKY2F0KCJMZWFzdCByaXNreSBpbnZlc3RtZW50OiIsIGxlYXN0X3Jpc2t5LCAiXG4iKQoKYGBgClRoZSBpbnZlc3RtZW50cyB3aXRoIGhpZ2hlciByZXR1cm5zIGFyZSBhbHNvIHRoZSBpbnZlc3RtZW50cyB3aXRoIGhpZ2hlciB2b2xhdGlsaXR5IGFzIG1lYXN1cmVkIGJ5IHN0YW5kYXJkIGRldmlhdGlvbi4gSXQgYXBwZWFycyB0aGF0IHRoZSBoaWdoZXIgcmV0dXJuIGludmVzdG1lbnRzIGFsc28gY29tZSB3aXRoIGhpZ2hlciByaXNrLgoKQ29ycmVsYXRpb24gbWF0cml4IGZvciBFeHBlcnRzLCBFbGkgTGlsbHksIGFuZCBESklBICh0byBpZGVudGlmeSBpRiB0aGV5IG1vdmUgdG9nZXRoZXIpOgpgYGB7cn0gCmNvcl9tYXRyaXggPC0gY29yKFN0b2NrRGF0YVssIGMoIkV4cGVydHMiLCAiRWxpLkxpbGx5IiwgIkRKSUEiKV0pCnByaW50KGNvcl9tYXRyaXgpCgojIEFuYWx5emUgY29ycmVsYXRpb25zIGJldHdlZW4gcGFpcnMKY29yX2V4cGVydHNfZWxpX2xpbGx5IDwtIGNvcl9tYXRyaXhbIkV4cGVydHMiLCAiRWxpLkxpbGx5Il0KY29yX2V4cGVydHNfZGppYSA8LSBjb3JfbWF0cml4WyJFeHBlcnRzIiwgIkRKSUEiXQpjb3JfZWxpX2xpbGx5X2RqaWEgPC0gY29yX21hdHJpeFsiRWxpLkxpbGx5IiwgIkRKSUEiXQoKIyBQcmludCBpbmRpdmlkdWFsIGNvcnJlbGF0aW9ucwpjYXQoIkNvcnJlbGF0aW9uIGJldHdlZW4gRXhwZXJ0cyBhbmQgRWxpIExpbGx5OiIsIGNvcl9leHBlcnRzX2VsaV9saWxseSwgIlxuIikKY2F0KCJDb3JyZWxhdGlvbiBiZXR3ZWVuIEV4cGVydHMgYW5kIERKSUE6IiwgY29yX2V4cGVydHNfZGppYSwgIlxuIikKY2F0KCJDb3JyZWxhdGlvbiBiZXR3ZWVuIEVsaSBMaWxseSBhbmQgREpJQToiLCBjb3JfZWxpX2xpbGx5X2RqaWEsICJcbiIpCgojIEludGVycHJldGF0aW9uOiBBcmUgdGhleSBtb3ZpbmcgdG9nZXRoZXI/CmlmIChjb3JfZXhwZXJ0c19lbGlfbGlsbHkgPiAwKSB7CiAgY2F0KCJFeHBlcnRzIGFuZCBFbGkgTGlsbHkgbW92ZSB0b2dldGhlciAocG9zaXRpdmUgY29ycmVsYXRpb24pLlxuIikKfSBlbHNlIHsKICBjYXQoIkV4cGVydHMgYW5kIEVsaSBMaWxseSBkbyBub3QgbW92ZSB0b2dldGhlciAobmVnYXRpdmUgb3Igbm8gY29ycmVsYXRpb24pLlxuIikKfQoKaWYgKGNvcl9leHBlcnRzX2RqaWEgPiAwKSB7CiAgY2F0KCJFeHBlcnRzIGFuZCBESklBIG1vdmUgdG9nZXRoZXIgKHBvc2l0aXZlIGNvcnJlbGF0aW9uKS5cbiIpCn0gZWxzZSB7CiAgY2F0KCJFeHBlcnRzIGFuZCBESklBIGRvIG5vdCBtb3ZlIHRvZ2V0aGVyIChuZWdhdGl2ZSBvciBubyBjb3JyZWxhdGlvbikuXG4iKQp9CgppZiAoY29yX2VsaV9saWxseV9kamlhID4gMCkgewogIGNhdCgiRWxpIExpbGx5IGFuZCBESklBIG1vdmUgdG9nZXRoZXIgKHBvc2l0aXZlIGNvcnJlbGF0aW9uKS5cbiIpCn0gZWxzZSB7CiAgY2F0KCJFbGkgTGlsbHkgYW5kIERKSUEgZG8gbm90IG1vdmUgdG9nZXRoZXIgKG5lZ2F0aXZlIG9yIG5vIGNvcnJlbGF0aW9uKS5cbiIpCn0KCgpgYGAKCkF2ZXJhZ2UgcmV0dXJuIGFuZCBzZCBvZiB0aGUgcmV0dXJuIG9uIHRoZSBwb3J0Zm9saW86CmBgYHtyfSAKYXZlcmFnZV9leHBlcnRzIDwtIG1lYW4oU3RvY2tEYXRhJEV4cGVydHMpCmF2ZXJhZ2VfZWxpX2xpbGx5IDwtIG1lYW4oU3RvY2tEYXRhJEVsaS5MaWxseSkKYXZlcmFnZV9kamlhIDwtIG1lYW4oU3RvY2tEYXRhJERKSUEpCgpjYXQoIlNhbXBsZSBhdmVyYWdlIHJldHVybiBmb3IgRXhwZXJ0czoiLCBhdmVyYWdlX2V4cGVydHMsICJcbiIpCmNhdCgiU2FtcGxlIGF2ZXJhZ2UgcmV0dXJuIGZvciBFbGkgTGlsbHk6IiwgYXZlcmFnZV9lbGlfbGlsbHksICJcbiIpCmNhdCgiU2FtcGxlIGF2ZXJhZ2UgcmV0dXJuIGZvciBESklBOiIsIGF2ZXJhZ2VfZGppYSwgIlxuIikKCiMgQ2FsY3VsYXRlIHRoZSBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uIGZvciBlYWNoIGludmVzdG1lbnQKc2RfZXhwZXJ0cyA8LSBzZChTdG9ja0RhdGEkRXhwZXJ0cykKc2RfZWxpX2xpbGx5IDwtIHNkKFN0b2NrRGF0YSRFbGkuTGlsbHkpCnNkX2RqaWEgPC0gc2QoU3RvY2tEYXRhJERKSUEpCgpjYXQoIlNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gZm9yIEV4cGVydHM6Iiwgc2RfZXhwZXJ0cywgIlxuIikKY2F0KCJTYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uIGZvciBFbGkgTGlsbHk6Iiwgc2RfZWxpX2xpbGx5LCAiXG4iKQpjYXQoIlNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gZm9yIERKSUE6Iiwgc2RfZGppYSwgIlxuIikKCmBgYAojIyMgUGFydCAyCgpDb3ZhcmlhbmNlIG1hdHJpeDoKYGBge3J9CmNvdl9tYXRyaXggPC0gY292KFN0b2NrRGF0YVssMjo0XSkKY292X21hdHJpeApgYGAKCkNvcnJlbGF0aW9uIG1hdHJpeDoKYGBge3J9CmNvcl9tYXRyaXggPC0gY29yKFN0b2NrRGF0YVssMjo0XSkKY29yX21hdHJpeAoKYGBgCgpQb3J0Zm9saW8gcmV0dXJuIGNhbGN1bGF0aW9uCk1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgRXhwZXJ0cyBhbmQgRWxpIExpbGx5OgoKYGBge3J9Cm1lYW5fZXhwZXJ0cyA8LSBtZWFuKFN0b2NrRGF0YSRFeHBlcnRzKQptZWFuX2VsaV9saWxseSA8LSBtZWFuKFN0b2NrRGF0YSRFbGkuTGlsbHkpCnNkX2V4cGVydHMgPC0gc2QoU3RvY2tEYXRhJEV4cGVydHMpCnNkX2VsaV9saWxseSA8LSBzZChTdG9ja0RhdGEkRWxpLkxpbGx5KQoKYGBgCkNvdmFyaWFuY2UgYmV0d2VlbiBFeHBlcnRzIGFuZCBFbGkgTGlsbHk6CmBgYHtyfQpjb3ZfZXhwZXJ0c19lbGlfbGlsbHkgPC0gY292KFN0b2NrRGF0YSRFeHBlcnRzLCBTdG9ja0RhdGEkRWxpLkxpbGx5KQoKYGBgCkFscGhhIHZhbHVlcyAod2VpZ2h0cyBvbiBFeHBlcnRzKToKYGBge3J9CmFscGhhcyA8LSBzZXEoMCwgMSwgMC4wNSkKYGBgClBvcnRmb2xpbyBtZWFuIChleHBlY3RlZCByZXR1cm4pIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gKHJpc2spOgpgYGB7cn0KcG9ydGZvbGlvX21lYW5zIDwtIGFscGhhcyAqIG1lYW5fZXhwZXJ0cyArICgxIC0gYWxwaGFzKSAqIG1lYW5fZWxpX2xpbGx5CnBvcnRmb2xpb192YXJpYW5jZXMgPC0gYWxwaGFzXjIgKiBzZF9leHBlcnRzXjIgKyAoMSAtIGFscGhhcyleMiAqIHNkX2VsaV9saWxseV4yICsgCiAgMiAqIGFscGhhcyAqICgxIC0gYWxwaGFzKSAqIGNvdl9leHBlcnRzX2VsaV9saWxseQpwb3J0Zm9saW9fc2RzIDwtIHNxcnQocG9ydGZvbGlvX3ZhcmlhbmNlcykKYGBgClJldHVybi10by1yaXNrIHJhdGlvIChyZXR1cm4gLyBzdGFuZGFyZCBkZXZpYXRpb24pCmBgYHtyfQpyZXR1cm5fdG9fcmlzayA8LSBwb3J0Zm9saW9fbWVhbnMgLyBwb3J0Zm9saW9fc2RzCnBvcnRmb2xpb19hbmFseXNpcyA8LSBkYXRhLmZyYW1lKAogIEFscGhhID0gYWxwaGFzLAogIFBvcnRmb2xpb19SZXR1cm4gPSBwb3J0Zm9saW9fbWVhbnMsCiAgUG9ydGZvbGlvX1NEID0gcG9ydGZvbGlvX3NkcywKICBSZXR1cm5fdG9fUmlzayA9IHJldHVybl90b19yaXNrCikKCiMgUHJpbnQgdGhlIGRhdGEgZnJhbWUgd2l0aCB0aGUgcmVzdWx0cwpwcmludChwb3J0Zm9saW9fYW5hbHlzaXMpCgpgYGAKUG9ydGZvbGlvIFJldHVybiB2cyBSaXNrIChTdGFuZGFyZCBEZXZpYXRpb24pCmBgYHtyfQpwbG90KHBvcnRmb2xpb19zZHMsIHBvcnRmb2xpb19tZWFucywgdHlwZT0ibCIsIHhsYWI9IlBvcnRmb2xpbyBSaXNrIChTdGFuZGFyZCBEZXZpYXRpb24pIiwgeWxhYj0iUG9ydGZvbGlvIFJldHVybiIsCiAgICAgbWFpbj0iUG9ydGZvbGlvIFJpc2stUmV0dXJuIFRyYWRlb2ZmIiwgY29sPSJibHVlIiwgbHdkPTIpCmdyaWQoKQpgYGAKVGhlIHJlc3VsdGluZyBjdXJ2ZSB0ZWxscyB1cyB0aGF0IGRpdmVyc2lmaWNhdGlvbiBjYW4gYWN0dWFsbHkgZHJpdmUgbG93ZXIgcmlzayBhbmQgaGlnaGVyIHJldHVybnMgZm9yIGNlcnRhaW4gYWxwaGFzIHZzLiBzaW5nbGUgYXNzZXQgcG9ydGZvbGlvcy4KVGhlIGFscGhhcyBvZiAwLjMwIGFuZCBiZWxvdyB3b3VsZCBiZSB0aGUgbGVhc3QgZGVzaXJhYmxlIHNpbmNlIHRoZXkgYWxsIGhhdmUgaGlnaGVyIHJpc2sgZm9yIGxvd2VyIHJldHVybnMuIApXZSB3b3VsZCBjaG9vc2UgYW4gYWxwaGEgb2YgMC41NSwgc2luY2UgdGhhdCBpcyB3aGVyZSB0aGUgZXhwZWN0ZWQgcmV0dXJuIC8gc3RhbmRhcmQgZGV2aWF0aW9uIGlzIHRoZSBoaWdoZXN0LgoKCgoK