課本第四章習題:第7題、第8題、第9題、第12題、第13題
4.7
Suppose that we wish to predict whether a given stock will issue a dividend this year (“Yes” or “No”) based on \(X\), last year’s percent profit. We examine a large number of companies and discover that the mean value of \(X\) for companies that issued a dividend was \(\overline{X}\) = 10, while the mean for those that didn’t was \(\overline{X}\) = 0. In addition, the variance of X for these two sets of companies was \(\sigma^2\) = 36. Finally, 80 % of companies issued dividends. Assuming that X follows a normal distribution, predict the probability that a company will issue a dividend this year given that its percentage profit was \(X\) = 4 last year.
Hint: Recall that the density function for a normal random variable is \[f(x) = \frac{1}{\sqrt{2\pi\sigma^2}}e^{\frac{-(x-\mu)^2}{2\sigma^2}}\] You will need to use Bayes’ theorem.
(4.12)
x = 4
mean1 = 10
mean2 = 0
variance = 36
prior1 = 0.8
prior2 = 0.2
#fk1 = 1/sqrt(2*prior*variance)*exp(-(x-mean)^2 / 2*variance);fk1
fk1 = (prior1*exp(-(x-mean1)^2 / 2*variance))/(prior1*exp(-(x-mean1)^2 / 2*variance) + prior2*exp(-(x-mean2)^2 / 2*variance)) ; fk1
[1] 1.803211e-156
4.8
Suppose that we take a data set, divide it into equally-sized training and test sets, and then try out two different classification procedures. First we use logistic regression and get an error rate of 20 % on the training data and 30 % on the test data. Next we use 1-nearest neigh- bors (i.e. K = 1) and get an average error rate (averaged over both test and training data sets) of 18 %. Based on these results, which method should we prefer to use for classification of new observations? Why?
logistic是線性的、paramatric的,knn是非線性、non-paramatric的,knn不論在test或train中error rate都比logistic小,代表這份資料是適合使用knn這類型的方式。
4.9
This problem has to do with odds.
- On average, what fraction of people with an odds of 0.37 of defaulting on their credit card payment will in fact default?
\[odds = \frac {P(X)}{1-P(X)}\]
p = 0.37/(1+0.37);p
[1] 0.270073
由odds算出約有27%的人會違約
- Suppose that an individual has a 16 % chance of defaulting on her credit card payment. What are the odds that she will de- fault?
odds = 0.16/(1-0.16);odds
[1] 0.1904762
4.12
This problem involves writing functions. (a) Write a function, Power(), that prints out the result of raising 2 to the 3rd power. In other words, your function should compute \(2^3\) and print out the results. Hint: Recall that x^a raises x to the power a. Use the print() function to output the result.
power <- function(x){
print (x^3)
}
Create a new function, Power2(), that allows you to pass any two numbers, x and a, and prints out the value of x^a. You can do this by beginning your function with the line
Power2=function(x,a){
You should be able to call your function by entering, for instance,
Power2(3,8)
on the command line. This should output the value of 38, namely, 6, 561.
power2 <- function(x,a){
print(x^a)
}
- Using the Power2() function that you just wrote, compute \(10^3\), \(8^17\), and \(131^3\).
power2(10,3)
[1] 1000
power2(8,17)
[1] 2.2518e+15
power2(131,3)
[1] 2248091
Now create a new function, Power3(), that actually returns the result x^a as an R object, rather than simply printing it to the screen. That is, if you store the value x^a in an object called result within your function, then you can simply return() this
return()
result, using the following line:
return(result)
The line above should be the last line in your function, before the } symbol.
power3 <- function(x,a){
result = x^a
return(result)
}
- Now using the Power3() function, create a plot of f(x) = \(x^2\). The x-axis should display a range of integers from 1 to 10, and the y-axis should display \(x^2\). Label the axes appropriately, and use an appropriate title for the figure. Consider displaying either the x-axis, the y-axis, or both on the log-scale. You can do this by using log=‘‘x’’, log=‘‘y’’, or log=‘‘xy’’ as arguments to the plot() function.
x = c(1:10)
plot(x,power3(x, 2),xlab="Log of x",ylab="Log of x^2", main = "Log of x^2 vs Log of x",log = "xy")

Create a function, PlotPower(), that allows you to create a plot of x against x^a for a fixed a and for a range of values of x. For instance, if you call
PlotPower (1:10,3)
then a plot should be created with an x-axis taking on values 1, 2, . . . , 10, and a y-axis taking on values \(1^3\), \(2^3\), . . . , \(10^3\).
PlotPower<- function(x,a){
yt = paste("Log of x^",a)
maint = paste(yt,"vs Log of x")
plot(x,power3(x, a),xlab="Log of x",ylab=yt, main = maint,log = "xy")
}
PlotPower(c(1:10),3)

4.13
Using the Boston data set, fit classification models in order to predict whether a given suburb has a crime rate above or below the median. Explore logistic regression, LDA, and KNN models using various sub- sets of the predictors. Describe your findings.
library(ISLR)
data(Boston)
summary(Boston$crim)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00632 0.08204 0.25651 3.61352 3.67708 88.97620
#median = 0.25651
Boston$below <- ifelse(Boston$crim > 0.25651,1,0)
Boston$below <- as.factor(Boston$below)
# below = 1 :高於平均 / 0 : 低於平均
library(corrplot)
Boston$below <- as.numeric(Boston$below)
cor <- cor(Boston)
corrplot(cor)

set.seed(144)
library(caTools)
split = sample.split(Boston$below,SplitRatio = 0.7)
TR = subset(Boston,split == TRUE)
TS = subset(Boston,split == FALSE)
glm1 <- glm(below~zn+indus+nox+age+dis+rad+tax+black+lstat,TR,family = "binomial")#correlation高的
pred = predict(glm1, newdata=TS, type="response")
x = table(actual = TS$below,predict = pred > 0.5);x
predict
actual FALSE TRUE
0 67 9
1 9 67
acc = sum(diag(x))/sum(x);acc
[1] 0.8815789
library(MASS)
lda1 <- lda(below~zn+indus+nox+age+dis+rad+tax+black+lstat,TR)
pred <- predict(lda1, TS)
x <- table(actual = TS$below , pred = pred$class);x
pred
actual 0 1
0 68 8
1 16 60
acc = sum(diag(x))/sum(x) ; acc
[1] 0.8421053
library(class)
TR.X <- as.matrix(TR$below)
TS.X <- as.matrix(TS$below)
set.seed(1)
pred <- knn(TR.X,TS.X,TR$below, k = 1)
x <- table(pred = pred,actual = TS$below);x
actual
pred 0 1
0 76 0
1 0 76
acc = sum(diag(x))/sum(x) ; acc
[1] 1
在同樣的predictor組合下,準確率是 knn(k=1) > logistic > lda,代表這份資料適合使用non-parametric,非線性的方法
LS0tDQp0aXRsZTogIlN0YXRpc3RpY2FsIGxlYXJuaW5nIEhXOCINCmF1dGhvcjogIk0wNzQwMjAwMTAg6Zmz6Z+75Y2JIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KDQroqrLmnKznrKzlm5vnq6Dnv5LpoYzvvJrnrKw36aGM44CB56ysOOmhjOOAgeesrDnpoYzjgIHnrKwxMumhjOOAgeesrDEz6aGMDQoNCg0KIyMgNC43DQpTdXBwb3NlIHRoYXQgd2Ugd2lzaCB0byBwcmVkaWN0IHdoZXRoZXIgYSBnaXZlbiBzdG9jayB3aWxsIGlzc3VlIGENCmRpdmlkZW5kIHRoaXMgeWVhciAo4oCcWWVz4oCdIG9yIOKAnE5v4oCdKSBiYXNlZCBvbiAkWCQsIGxhc3QgeWVhcuKAmXMgcGVyY2VudA0KcHJv76yBdC4gV2UgZXhhbWluZSBhIGxhcmdlIG51bWJlciBvZiBjb21wYW5pZXMgYW5kIGRpc2NvdmVyIHRoYXQgdGhlDQptZWFuIHZhbHVlIG9mICRYJCBmb3IgY29tcGFuaWVzIHRoYXQgaXNzdWVkIGEgZGl2aWRlbmQgd2FzICRcb3ZlcmxpbmV7WH0kID0gMTAsDQp3aGlsZSB0aGUgbWVhbiBmb3IgdGhvc2UgdGhhdCBkaWRu4oCZdCB3YXMgJFxvdmVybGluZXtYfSQgPSAwLiBJbiBhZGRpdGlvbiwgdGhlIHZhcmlhbmNlIG9mIFggZm9yIHRoZXNlIHR3byBzZXRzIG9mIGNvbXBhbmllcyB3YXMgJFxzaWdtYV4yJCA9IDM2LiBGaW5hbGx5LCA4MCAlIG9mIGNvbXBhbmllcyBpc3N1ZWQgZGl2aWRlbmRzLiBBc3N1bWluZyB0aGF0IFggZm9sbG93cyBhIG5vcm1hbCBkaXN0cmlidXRpb24sIHByZWRpY3QgdGhlIHByb2JhYmlsaXR5IHRoYXQgYSBjb21wYW55IHdpbGwgaXNzdWUNCmEgZGl2aWRlbmQgdGhpcyB5ZWFyIGdpdmVuIHRoYXQgaXRzIHBlcmNlbnRhZ2UgcHJv76yBdCB3YXMgJFgkID0gNCBsYXN0DQp5ZWFyLg0KDQpIaW50OiBSZWNhbGwgdGhhdCB0aGUgZGVuc2l0eSBmdW5jdGlvbiBmb3IgYSBub3JtYWwgcmFuZG9tIHZhcmlhYmxlDQppcyANCiQkZih4KSA9IFxmcmFjezF9e1xzcXJ0ezJccGlcc2lnbWFeMn19ZV57XGZyYWN7LSh4LVxtdSleMn17MlxzaWdtYV4yfX0kJCANCllvdSB3aWxsIG5lZWQgdG8gdXNlIEJheWVz4oCZIHRoZW9yZW0uPGJyPg0KDQohW10oLi8xLlBORykNCig0LjEyKQ0KDQpgYGB7cn0NCnggPSA0DQptZWFuMSA9IDEwDQptZWFuMiA9IDANCnZhcmlhbmNlID0gMzYNCnByaW9yMSA9IDAuOA0KcHJpb3IyID0gMC4yDQojZmsxID0gMS9zcXJ0KDIqcHJpb3IqdmFyaWFuY2UpKmV4cCgtKHgtbWVhbileMiAvIDIqdmFyaWFuY2UpO2ZrMQ0KZmsxID0gKHByaW9yMSpleHAoLSh4LW1lYW4xKV4yIC8gMip2YXJpYW5jZSkpLyhwcmlvcjEqZXhwKC0oeC1tZWFuMSleMiAvIDIqdmFyaWFuY2UpICsgcHJpb3IyKmV4cCgtKHgtbWVhbjIpXjIgLyAyKnZhcmlhbmNlKSkgOyBmazENCmBgYA0KDQoNCiMjIDQuOA0KDQpTdXBwb3NlIHRoYXQgd2UgdGFrZSBhIGRhdGEgc2V0LCBkaXZpZGUgaXQgaW50byBlcXVhbGx5LXNpemVkIHRyYWluaW5nDQphbmQgdGVzdCBzZXRzLCBhbmQgdGhlbiB0cnkgb3V0IHR3byBkae+sgGVyZW50IGNsYXNzae+sgWNhdGlvbiBwcm9jZWR1cmVzLg0KRmlyc3Qgd2UgdXNlIGxvZ2lzdGljIHJlZ3Jlc3Npb24gYW5kIGdldCBhbiBlcnJvciByYXRlIG9mIDIwICUgb24gdGhlDQp0cmFpbmluZyBkYXRhIGFuZCAzMCAlIG9uIHRoZSB0ZXN0IGRhdGEuIE5leHQgd2UgdXNlIDEtbmVhcmVzdCBuZWlnaC0NCmJvcnMgKGkuZS4gSyA9IDEpIGFuZCBnZXQgYW4gYXZlcmFnZSBlcnJvciByYXRlIChhdmVyYWdlZCBvdmVyIGJvdGgNCnRlc3QgYW5kIHRyYWluaW5nIGRhdGEgc2V0cykgb2YgMTggJS4gQmFzZWQgb24gdGhlc2UgcmVzdWx0cywgd2hpY2gNCm1ldGhvZCBzaG91bGQgd2UgcHJlZmVyIHRvIHVzZSBmb3IgY2xhc3Np76yBY2F0aW9uIG9mIG5ldyBvYnNlcnZhdGlvbnM/DQpXaHk/DQoNCmxvZ2lzdGlj5piv57ea5oCn55qE44CBcGFyYW1hdHJpY+eahO+8jGtubuaYr+mdnue3muaAp+OAgW5vbi1wYXJhbWF0cmlj55qE77yMa25u5LiN6KuW5ZyodGVzdOaIlnRyYWlu5LitZXJyb3IgcmF0ZemDveavlGxvZ2lzdGlj5bCP77yM5Luj6KGo6YCZ5Lu96LOH5paZ5piv6YGp5ZCI5L2/55Soa25u6YCZ6aGe5Z6L55qE5pa55byP44CCDQoNCiMjIDQuOQ0KVGhpcyBwcm9ibGVtIGhhcyB0byBkbyB3aXRoIG9kZHMuDQoNCihhKSBPbiBhdmVyYWdlLCB3aGF0IGZyYWN0aW9uIG9mIHBlb3BsZSB3aXRoIGFuIG9kZHMgb2YgMC4zNyBvZg0KZGVmYXVsdGluZyBvbiB0aGVpciBjcmVkaXQgY2FyZCBwYXltZW50IHdpbGwgaW4gZmFjdCBkZWZhdWx0Pw0KDQokJG9kZHMgPSBcZnJhYyB7UChYKX17MS1QKFgpfSQkDQoNCmBgYHtyfQ0KcCA9IDAuMzcvKDErMC4zNyk7cA0KYGBgDQrnlLFvZGRz566X5Ye657SE5pyJMjcl55qE5Lq65pyD6YGV57SEDQoNCihiKSBTdXBwb3NlIHRoYXQgYW4gaW5kaXZpZHVhbCBoYXMgYSAxNiAlIGNoYW5jZSBvZiBkZWZhdWx0aW5nIG9uDQpoZXIgY3JlZGl0IGNhcmQgcGF5bWVudC4gV2hhdCBhcmUgdGhlIG9kZHMgdGhhdCBzaGUgd2lsbCBkZS0NCmZhdWx0Pw0KDQpgYGB7cn0NCm9kZHMgPSAwLjE2LygxLTAuMTYpO29kZHMNCmBgYA0KDQoNCiMjIDQuMTINCg0KIFRoaXMgcHJvYmxlbSBpbnZvbHZlcyB3cml0aW5nIGZ1bmN0aW9ucy4NCihhKSBXcml0ZSBhIGZ1bmN0aW9uLCBQb3dlcigpLCB0aGF0IHByaW50cyBvdXQgdGhlIHJlc3VsdCBvZiByYWlzaW5nIDINCnRvIHRoZSAzcmQgcG93ZXIuIEluIG90aGVyIHdvcmRzLCB5b3VyIGZ1bmN0aW9uIHNob3VsZCBjb21wdXRlDQokMl4zJCBhbmQgcHJpbnQgb3V0IHRoZSByZXN1bHRzLg0KSGludDogUmVjYWxsIHRoYXQgeF5hIHJhaXNlcyB4IHRvIHRoZSBwb3dlciBhLiBVc2UgdGhlIHByaW50KCkNCmZ1bmN0aW9uIHRvIG91dHB1dCB0aGUgcmVzdWx0Lg0KDQpgYGB7cn0NCnBvd2VyIDwtIGZ1bmN0aW9uKHgpew0KICBwcmludCAoeF4zKQ0KfQ0KYGBgDQoNCg0KKGIpIENyZWF0ZSBhIG5ldyBmdW5jdGlvbiwgUG93ZXIyKCksIHRoYXQgYWxsb3dzIHlvdSB0byBwYXNzIGFueQ0KdHdvIG51bWJlcnMsIHggYW5kIGEsIGFuZCBwcmludHMgb3V0IHRoZSB2YWx1ZSBvZiB4XmEuIFlvdSBjYW4NCmRvIHRoaXMgYnkgYmVnaW5uaW5nIHlvdXIgZnVuY3Rpb24gd2l0aCB0aGUgbGluZQ0KDQogICAgUG93ZXIyPWZ1bmN0aW9uKHgsYSl7DQogICAgDQpZb3Ugc2hvdWxkIGJlIGFibGUgdG8gY2FsbCB5b3VyIGZ1bmN0aW9uIGJ5IGVudGVyaW5nLCBmb3IgaW5zdGFuY2UsDQoNCiAgICBQb3dlcjIoMyw4KQ0KDQpvbiB0aGUgY29tbWFuZCBsaW5lLiBUaGlzIHNob3VsZCBvdXRwdXQgdGhlIHZhbHVlIG9mIDM4LCBuYW1lbHksDQo2LCA1NjEuDQoNCmBgYHtyfQ0KcG93ZXIyIDwtIGZ1bmN0aW9uKHgsYSl7DQogIHByaW50KHheYSkNCn0NCmBgYA0KDQooYykgVXNpbmcgdGhlIFBvd2VyMigpIGZ1bmN0aW9uIHRoYXQgeW91IGp1c3Qgd3JvdGUsIGNvbXB1dGUgJDEwXjMkLA0KJDheMTckLCBhbmQgJDEzMV4zJC4NCg0KYGBge3J9DQpwb3dlcjIoMTAsMykNCnBvd2VyMig4LDE3KQ0KcG93ZXIyKDEzMSwzKQ0KYGBgDQoNCihkKSBOb3cgY3JlYXRlIGEgbmV3IGZ1bmN0aW9uLCBQb3dlcjMoKSwgdGhhdCBhY3R1YWxseSByZXR1cm5zIHRoZQ0KcmVzdWx0IHheYSBhcyBhbiBSIG9iamVjdCwgcmF0aGVyIHRoYW4gc2ltcGx5IHByaW50aW5nIGl0IHRvIHRoZQ0Kc2NyZWVuLiBUaGF0IGlzLCBpZiB5b3Ugc3RvcmUgdGhlIHZhbHVlIHheYSBpbiBhbiBvYmplY3QgY2FsbGVkDQpyZXN1bHQgd2l0aGluIHlvdXIgZnVuY3Rpb24sIHRoZW4geW91IGNhbiBzaW1wbHkgcmV0dXJuKCkgdGhpcw0KDQogICAgcmV0dXJuKCkNCg0KcmVzdWx0LCB1c2luZyB0aGUgZm9sbG93aW5nIGxpbmU6DQoNCiAgICByZXR1cm4ocmVzdWx0KQ0KDQpUaGUgbGluZSBhYm92ZSBzaG91bGQgYmUgdGhlIGxhc3QgbGluZSBpbiB5b3VyIGZ1bmN0aW9uLCBiZWZvcmUNCnRoZSB9IHN5bWJvbC4NCg0KYGBge3J9DQpwb3dlcjMgPC0gZnVuY3Rpb24oeCxhKXsNCiAgcmVzdWx0ID0geF5hDQogIHJldHVybihyZXN1bHQpDQp9DQpgYGANCg0KKGUpIE5vdyB1c2luZyB0aGUgUG93ZXIzKCkgZnVuY3Rpb24sIGNyZWF0ZSBhIHBsb3Qgb2YgZih4KSA9ICR4XjIkLg0KVGhlIHgtYXhpcyBzaG91bGQgZGlzcGxheSBhIHJhbmdlIG9mIGludGVnZXJzIGZyb20gMSB0byAxMCwgYW5kDQp0aGUgeS1heGlzIHNob3VsZCBkaXNwbGF5ICR4XjIkLiBMYWJlbCB0aGUgYXhlcyBhcHByb3ByaWF0ZWx5LCBhbmQNCnVzZSBhbiBhcHByb3ByaWF0ZSB0aXRsZSBmb3IgdGhlIO+sgWd1cmUuIENvbnNpZGVyIGRpc3BsYXlpbmcgZWl0aGVyDQp0aGUgeC1heGlzLCB0aGUgeS1heGlzLCBvciBib3RoIG9uIHRoZSBsb2ctc2NhbGUuIFlvdSBjYW4gZG8gdGhpcw0KYnkgdXNpbmcgbG9nPeKAmOKAmHjigJnigJksIGxvZz3igJjigJh54oCZ4oCZLCBvciBsb2c94oCY4oCYeHnigJnigJkgYXMgYXJndW1lbnRzIHRvDQp0aGUgcGxvdCgpIGZ1bmN0aW9uLg0KDQpgYGB7cn0NCnggPSBjKDE6MTApDQpwbG90KHgscG93ZXIzKHgsIDIpLHhsYWI9IkxvZyBvZiB4Iix5bGFiPSJMb2cgb2YgeF4yIiwgbWFpbiA9ICJMb2cgb2YgeF4yIHZzIExvZyBvZiB4Iixsb2cgPSAieHkiKQ0KDQpgYGANCg0KDQooZikgQ3JlYXRlIGEgZnVuY3Rpb24sIFBsb3RQb3dlcigpLCB0aGF0IGFsbG93cyB5b3UgdG8gY3JlYXRlIGEgcGxvdA0Kb2YgeCBhZ2FpbnN0IHheYSBmb3IgYSDvrIF4ZWQgYSBhbmQgZm9yIGEgcmFuZ2Ugb2YgdmFsdWVzIG9mIHguIEZvcg0KaW5zdGFuY2UsIGlmIHlvdSBjYWxsDQoNCiAgICBQbG90UG93ZXIgKDE6MTAsMykNCg0KdGhlbiBhIHBsb3Qgc2hvdWxkIGJlIGNyZWF0ZWQgd2l0aCBhbiB4LWF4aXMgdGFraW5nIG9uIHZhbHVlcw0KMSwgMiwgLiAuIC4gLCAxMCwgYW5kIGEgeS1heGlzIHRha2luZyBvbiB2YWx1ZXMgJDFeMyQsICQyXjMkLCAuIC4gLiAsICQxMF4zJC4NCg0KYGBge3J9DQpQbG90UG93ZXI8LSBmdW5jdGlvbih4LGEpew0KICB5dCA9IHBhc3RlKCJMb2cgb2YgeF4iLGEpDQogIG1haW50ID0gcGFzdGUoeXQsInZzIExvZyBvZiB4IikNCiAgcGxvdCh4LHBvd2VyMyh4LCBhKSx4bGFiPSJMb2cgb2YgeCIseWxhYj15dCwgbWFpbiA9IG1haW50LGxvZyA9ICJ4eSIpDQp9DQpgYGANCg0KDQpgYGB7cn0NClBsb3RQb3dlcihjKDE6MTApLDMpDQpgYGANCg0KIyMgNC4xMw0KDQpVc2luZyB0aGUgQm9zdG9uIGRhdGEgc2V0LCDvrIF0IGNsYXNzae+sgWNhdGlvbiBtb2RlbHMgaW4gb3JkZXIgdG8gcHJlZGljdA0Kd2hldGhlciBhIGdpdmVuIHN1YnVyYiBoYXMgYSBjcmltZSByYXRlIGFib3ZlIG9yIGJlbG93IHRoZSBtZWRpYW4uDQpFeHBsb3JlIGxvZ2lzdGljIHJlZ3Jlc3Npb24sIExEQSwgYW5kIEtOTiBtb2RlbHMgdXNpbmcgdmFyaW91cyBzdWItDQpzZXRzIG9mIHRoZSBwcmVkaWN0b3JzLiBEZXNjcmliZSB5b3VyIO+sgW5kaW5ncy4NCg0KYGBge3J9DQpsaWJyYXJ5KElTTFIpDQpkYXRhKEJvc3RvbikNCg0Kc3VtbWFyeShCb3N0b24kY3JpbSkNCg0KYGBgDQoNCmBgYHtyfQ0KI21lZGlhbiA9IDAuMjU2NTENCkJvc3RvbiRiZWxvdyA8LSBpZmVsc2UoQm9zdG9uJGNyaW0gPiAwLjI1NjUxLDEsMCkNCiMgYmVsb3cgPSAxIDrpq5jmlrzlubPlnYcgLyAwIDog5L2O5pa85bmz5Z2HDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGNvcnJwbG90KQ0KQm9zdG9uJGJlbG93IDwtIGFzLm51bWVyaWMoQm9zdG9uJGJlbG93KQ0KY29yIDwtIGNvcihCb3N0b24pDQpjb3JycGxvdChjb3IpDQpgYGANCg0KDQpgYGB7cn0NCnNldC5zZWVkKDE0NCkNCmxpYnJhcnkoY2FUb29scykNCkJvc3RvbiRiZWxvdyA8LSAgYXMuZmFjdG9yKEJvc3RvbiRiZWxvdykNCnNwbGl0ID0gc2FtcGxlLnNwbGl0KEJvc3RvbiRiZWxvdyxTcGxpdFJhdGlvID0gMC43KQ0KVFIgPSBzdWJzZXQoQm9zdG9uLHNwbGl0ID09IFRSVUUpDQpUUyA9IHN1YnNldChCb3N0b24sc3BsaXQgPT0gRkFMU0UpDQpgYGANCg0KYGBge3J9DQoNCmdsbTEgPC0gZ2xtKGJlbG93fnpuK2luZHVzK25veCthZ2UrZGlzK3JhZCt0YXgrYmxhY2srbHN0YXQsVFIsZmFtaWx5ID0gImJpbm9taWFsIikjY29ycmVsYXRpb27pq5jnmoQNCmBgYA0KDQoNCmBgYHtyfQ0KcHJlZCA9IHByZWRpY3QoZ2xtMSwgbmV3ZGF0YT1UUywgdHlwZT0icmVzcG9uc2UiKQ0KeCA9IHRhYmxlKGFjdHVhbCA9IFRTJGJlbG93LHByZWRpY3QgPSBwcmVkID4gMC41KTt4DQphY2MgPSBzdW0oZGlhZyh4KSkvc3VtKHgpO2FjYw0KYGBgDQoNCg0KYGBge3J9DQpsaWJyYXJ5KE1BU1MpDQpsZGExIDwtIGxkYShiZWxvd356bitpbmR1cytub3grYWdlK2RpcytyYWQrdGF4K2JsYWNrK2xzdGF0LFRSKQ0KYGBgDQoNCg0KYGBge3J9DQpwcmVkIDwtIHByZWRpY3QobGRhMSwgVFMpDQp4IDwtIHRhYmxlKGFjdHVhbCA9IFRTJGJlbG93ICwgcHJlZCA9IHByZWQkY2xhc3MpO3gNCmFjYyA9IHN1bShkaWFnKHgpKS9zdW0oeCkgOyBhY2MNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoY2xhc3MpDQpUUi5YIDwtIGFzLm1hdHJpeChUUiRiZWxvdykNClRTLlggPC0gYXMubWF0cml4KFRTJGJlbG93KQ0Kc2V0LnNlZWQoMSkNCnByZWQgPC0ga25uKFRSLlgsVFMuWCxUUiRiZWxvdywgayA9IDEpDQp4IDwtIHRhYmxlKHByZWQgPSBwcmVkLGFjdHVhbCA9IFRTJGJlbG93KTt4DQphY2MgPSBzdW0oZGlhZyh4KSkvc3VtKHgpIDsgYWNjDQpgYGANCg0K5Zyo5ZCM5qij55qEcHJlZGljdG9y57WE5ZCI5LiL77yM5rqW56K6546H5pivIGtubihrPTEpID4gbG9naXN0aWMgPiBsZGHvvIzku6PooajpgJnku73os4fmlpnpganlkIjkvb/nlKhub24tcGFyYW1ldHJpYyzpnZ7nt5rmgKfnmoTmlrnms5UNCg0K