About
This worksheet looks at VaR calculations for the two cases of single and multiple equity asset. This is the last lab worksheet, other than the extra credit assignment.
Setup
Remember to always set your working directory to the source file location. Go to ‘Session’, scroll down to ‘Set Working Directory’, and click ‘To Source File Location’. Read carefully the below and follow the instructions to complete the tasks and answer any questions. Submit your work to RPubs as detailed in previous notes.
Note
Always read carefully the instructions on Sakai. For clarity, tasks/questions to be completed/answered are highlighted in red color (visible in preview) and numbered according to their particular placement in the task section. Quite often you will need to add your own code chunk.
Execute all code chunks, preview, publish, and submit link on Sakai follwoing the naming convention. Make sure to add comments to your code where appropriate. Use own language!
Task 1: VaR Calculations: Single Equity Asset
#Install package quantmod
install.packages("quantmod")
library("quantmod")
Consider the time series of a stock of your choice (other than AAPL and your colleague!) and for the time-period from Jan 1, 2015 to present.
We will first generate the historical time series of daily log returns, and calculate the mean and standard deviation of the time series.
##### 1A) Calculate the historical daily log returns, mean and standard deviation
getSymbols('MCD',src='yahoo', from="2015-01-01", to="2019-2-6")
[1] "MCD"
mcdRd = periodReturn(MCD,period="daily",type="log")
mean(mcdRd)
[1] 0.0006162021
sd(mcdRd)
[1] 0.0108596
Given a time series we can generate a histogram and mark the quantile value that corresponds to the 95% confidence level. The quantile value in this case is the critical value for which 95% of the data is on the right (higher) of the critical value as represented by the histogram. The remaining 5% will be on the left. To find the quantile value you will need to use the function quantile() with the proper arguments. For example quantile(xts,probs=0.01) applies to a time series xts and return the critical value correspondng to 99% confidence level.
##### 1B) Plot a histogram and mark the quantile value that corresponds to 95% confidence level. A mark can be added to a plot by using the function abline().
hist(mcdRd, breaks=20)
abline(v=quantile(mcdRd, probs=0.05),col = "red")

Given the above, we can calculate a VaR value for a given investment and a time horizon.
##### 1C) Assume $1000 investment in the stock, calculate the 95% VaR for 3 daysâ time horizon. Explain the meaning of VaR in practical terms.
quantile(mcdRd, probs=0.05)*1000*sqrt(3)
5%
-28.33466
The result means that if you invest $1000 in MCD stock, you will have 5% probability of losing at least $28.3347 in next three days.
##### 1D) How does the VaR calculated in 1C changes if we assumed simple returns instead of the log returns.
(exp(quantile(mcdRd, probs=0.05))-1)*1000*sqrt(3)
5%
-28.10415
We can calculate the VaR of simple returns from the VaR of log-returns using the formula: \(VaR_{R_t}=e^{VaR_{r_t}}-1\) and we will get the value of VaR of simple returns, which is above. And they are close to each other because \(e^{x}-1=x\) when x is small enough.
Calculations so far have been on the histogram of log returns. We can instead, looking at the histogram, assume a normal distribution of the log returns. The normal return assumption will have a mean and standard deviation equal to those calculated from the histogram, and properly scaled by the horizon time. Note that the mean is linearly scaled with time and volatility with square-root of time.
##### 1E) Repeat the calculation in 1D assuming instead a normal distribution. How the two results compare and why so?
getSymbols('MCD',src='yahoo', from="2015-01-01", to="2019-2-6")
[1] "MCD"
mcdRd = periodReturn(MCD,period="daily", type="log")
c=mean(mcdRd)*3
d=sd(mcdRd)*sqrt(3)
qnorm(0.05, mean=c, sd=d)*1000
[1] -29.09008
The VaR of the log-returns in normal distribution is larger than the VaR of the log-returns in a actual distribution (in absolute value). This is because the actual distribution of log-returns is not normally distributed. It has positive skewness, which means it has fat right tail.
##### 1F) Write down the mathematical representation corresponding to the VaR calculation in 1E. Explain what each variable in the equation represents, and provide the corresponding numerical value.
The mathematical representation corresponding to the VaR calculation is:
\(VaR_{s}=V*(Z_{c}*\sigma_{s}+\mu_{s})\)
V is the volume of investment, which is $1000 in the question; \(\mu_{s}\) is the mean of the distribution of log-returns of stock in three days, which is 0.0006162*3; \(\sigma_{s}\) is the standard deviation of the distribution of log-returns of stock in three days, which is 0.0108596\(*\sqrt3\); \(Z_{c}\) is the critical value at c=95% confidence level in the standard normal distribution, which is -1.645; \(VaR_{s}\) is the VaR of the actual return of the stock.
Task 2: VaR Calculations: Multiple Equity Assets
Consider the times series of the three stocks DIS, TWTR, and NFLX for the time-period from Jan 1,2015 to present. Assume an investment of $100,000 equally distributed among all three stocks.
To calculate the portfolio VaR we will follow the methodolgy described by the variance-covariance. First the covariance matrix needs to be computed. We then calculate the variance or volatility of the portolio as expressed in the varaince-covariance method taking into the weights associated with each asset in the portfolio. Fiinally we compute the mean or expected return of the portfolio taking also into account the weights. Given the expected return and volatility we should be able to compute the VaR of the portfolio. The assumption is we have a normal distribution of log returns.
First we calculate the overall portfolio VaR.
##### 2A) Calculate the portfolio 99% VaR for 1 day, and 3 days. Specify whether using log-returns or simple returns.
getSymbols('DIS',src='yahoo', from="2015-01-01", to="2019-2-6")
[1] "DIS"
disRd = periodReturn(DIS,period="daily", type="log")
getSymbols('TWTR',src='yahoo', from="2015-01-01", to="2019-2-6")
[1] "TWTR"
twtrRd = periodReturn(TWTR,period="daily", type="log")
getSymbols('NFLX',src='yahoo', from="2015-01-01", to="2019-2-6")
[1] "NFLX"
nflxRd = periodReturn(NFLX,period="daily", type="log")
M = cbind(disRd,twtrRd,nflxRd)
cor(M)
daily.returns daily.returns.1 daily.returns.2
daily.returns 1.0000000 0.2131246 0.2858335
daily.returns.1 0.2131246 1.0000000 0.2681317
daily.returns.2 0.2858335 0.2681317 1.0000000
cov(M)
daily.returns daily.returns.1 daily.returns.2
daily.returns 1.461219e-04 0.0000864939 9.356121e-05
daily.returns.1 8.649390e-05 0.0011271674 2.437628e-04
daily.returns.2 9.356121e-05 0.0002437628 7.332465e-04
w = rep(1/3, 3)
var_p = w %*% cov(M) %*% w
mu_p = colMeans(M) %*% w
(qnorm(0.01, mean=0, sd=1)*sqrt(var_p)+mu_p)*100000
[,1]
[1,] -4074.891
(qnorm(0.01, mean=0, sd=1)*sqrt(var_p)*sqrt(3)+mu_p*3)*100000
[,1]
[1,] -6971.819
We then describe the mathetical formulation useds in the code to perform the calculations
##### 2B) Write down the mathematical representations used in the code to calculate the VaR. Label properly each variable, what it represents, and the numerical value corresponding to in the code.
The mathematical representation corresponding to the VaR calculation is:
\(VaR_{p}=V*(Z_{c}*\sigma_{p}*\sqrt t+\mu_{p}*t)\)
V is the total volume of investment, which is $100000 in the portfolio; \(\mu_{p}*t\) is the mean of the distribution of actual return of portfolio in t days, which is 0.000679*t; \(\sigma_{p}\) is the standard deviation of the distribution of actual return of portfolio in t days, which is \(\sqrt{0.000317*t}\); t is the number of days, in this case t=1 or 3; \(Z_{c}\) is the critical value at 99% confidence level in the standard normal distribution, which is -2.326; \(VaR_{p}\) is the VaR of the actual return of the portfolio containing three stocks in t days.
We now calculated individual VaR corresponding to each asst in the portfolio
##### 2C) Calculate the three-individual asset 99% VaR for 1 day.
getSymbols('DIS',src='yahoo', from="2015-01-01", to="2019-2-6")
[1] "DIS"
disRd = periodReturn(DIS,period="daily", type="log")
quantile(disRd, probs=0.01)*100000*1/3
1%
-1257.976
getSymbols('TWTR',src='yahoo', from="2015-01-01", to="2019-2-6")
[1] "TWTR"
twtrRd = periodReturn(TWTR,period="daily", type="log")
quantile(twtrRd, probs=0.01)*100000*1/3
1%
-3831.365
getSymbols('NFLX',src='yahoo', from="2015-01-01", to="2019-2-6")
[1] "NFLX"
nflxRd = periodReturn(NFLX,period="daily", type="log")
quantile(nflxRd, probs=0.01)*100000*1/3
1%
-2355.64
Finally we compare the overall VaR to the individual VaR calculations
##### 2D) Compare the overall portfolio VaR to the sum of the individual asset VaR for the 1 day case. Share observations.
varsum=quantile(disRd, probs=0.01)*100000*1/3+quantile(twtrRd, probs=0.01)*100000*1/3+quantile(nflxRd, probs=0.01)*100000*1/3
varsum
1%
-7444.981
var1
1%
-1257.976
As we can see from the results above, the sum of three individual asset VaR for 1 day is greater than the overall portfolio VaR. Since \(VaR_{p}<VaR_{s1}+VaR_{s2}+VaR_{s3}\), we can conclude that diversification does reduce risk.
*http://computationalfinance.lsi.upc.edu
LS0tDQp0aXRsZTogIkZJTkM2MjEgV2ludGVyIDIwMTgtMTkgTGFiIFdvcmtzaGVldCAwNyINCmF1dGhvcjogIll1ZSBIdWFuZyINCmRhdGU6ICIyLzYvMjAxOSINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50OiBkZWZhdWx0DQpzdWJ0aXRsZTogVmFyIENhbGN1bGF0aW9ucyAoZmluYzYyMS1sYWIwNykNCi0tLQ0KDQojIyMgQWJvdXQNCg0KVGhpcyB3b3Jrc2hlZXQgbG9va3MgYXQgVmFSIGNhbGN1bGF0aW9ucyBmb3IgdGhlIHR3byBjYXNlcyBvZiBzaW5nbGUgYW5kIG11bHRpcGxlIGVxdWl0eSBhc3NldC4gVGhpcyBpcyB0aGUgbGFzdCBsYWIgd29ya3NoZWV0LCBvdGhlciB0aGFuIHRoZSBleHRyYSBjcmVkaXQgYXNzaWdubWVudC4NCg0KIyMjIFNldHVwDQoNClJlbWVtYmVyIHRvIGFsd2F5cyBzZXQgeW91ciB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgc291cmNlIGZpbGUgbG9jYXRpb24uIEdvIHRvICdTZXNzaW9uJywgc2Nyb2xsIGRvd24gdG8gJ1NldCBXb3JraW5nIERpcmVjdG9yeScsIGFuZCBjbGljayAnVG8gU291cmNlIEZpbGUgTG9jYXRpb24nLiBSZWFkIGNhcmVmdWxseSB0aGUgYmVsb3cgYW5kIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIHRvIGNvbXBsZXRlIHRoZSB0YXNrcyBhbmQgYW5zd2VyIGFueSBxdWVzdGlvbnMuICBTdWJtaXQgeW91ciB3b3JrIHRvIFJQdWJzIGFzIGRldGFpbGVkIGluIHByZXZpb3VzIG5vdGVzLiANCg0KIyMjIE5vdGUNCg0KQWx3YXlzIHJlYWQgY2FyZWZ1bGx5IHRoZSBpbnN0cnVjdGlvbnMgb24gU2FrYWkuICBGb3IgY2xhcml0eSwgdGFza3MvcXVlc3Rpb25zIHRvIGJlIGNvbXBsZXRlZC9hbnN3ZXJlZCBhcmUgaGlnaGxpZ2h0ZWQgaW4gcmVkIGNvbG9yICh2aXNpYmxlIGluIHByZXZpZXcpIGFuZCBudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlaXIgcGFydGljdWxhciBwbGFjZW1lbnQgaW4gdGhlIHRhc2sgc2VjdGlvbi4gIFF1aXRlIG9mdGVuIHlvdSB3aWxsIG5lZWQgdG8gYWRkIHlvdXIgb3duIGNvZGUgY2h1bmsuDQoNCkV4ZWN1dGUgYWxsIGNvZGUgY2h1bmtzLCBwcmV2aWV3LCBwdWJsaXNoLCBhbmQgc3VibWl0IGxpbmsgb24gU2FrYWkgZm9sbHdvaW5nIHRoZSBuYW1pbmcgY29udmVudGlvbi4gTWFrZSBzdXJlIHRvIGFkZCBjb21tZW50cyB0byB5b3VyIGNvZGUgd2hlcmUgYXBwcm9wcmlhdGUuIFVzZSBvd24gbGFuZ3VhZ2UhDQoNCi0tLS0tLS0tLS0tLS0tDQoNCiMjIyBUYXNrIDE6IFZhUiBDYWxjdWxhdGlvbnM6IFNpbmdsZSBFcXVpdHkgQXNzZXQNCg0KDQpgYGB7cn0NCiNJbnN0YWxsIHBhY2thZ2UgcXVhbnRtb2QgDQppbnN0YWxsLnBhY2thZ2VzKCJxdWFudG1vZCIpDQpsaWJyYXJ5KCJxdWFudG1vZCIpDQpgYGANCg0KQ29uc2lkZXIgdGhlIHRpbWUgc2VyaWVzIG9mIGEgc3RvY2sgb2YgeW91ciBjaG9pY2UgKG90aGVyIHRoYW4gQUFQTCBhbmQgeW91ciBjb2xsZWFndWUhKSBhbmQgZm9yIHRoZSB0aW1lLXBlcmlvZCBmcm9tIEphbiAxLCAyMDE1IHRvIHByZXNlbnQuIA0KDQpXZSB3aWxsIGZpcnN0IGdlbmVyYXRlIHRoZSBoaXN0b3JpY2FsIHRpbWUgc2VyaWVzIG9mIGRhaWx5IGxvZyByZXR1cm5zLCBhbmQgY2FsY3VsYXRlIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHRpbWUgc2VyaWVzLg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDFBKSBDYWxjdWxhdGUgdGhlIGhpc3RvcmljYWwgZGFpbHkgbG9nIHJldHVybnMsIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbg0KPC9zcGFuPg0KDQpgYGB7cn0NCmdldFN5bWJvbHMoJ01DRCcsc3JjPSd5YWhvbycsIGZyb209IjIwMTUtMDEtMDEiLCB0bz0iMjAxOS0yLTYiKQ0KbWNkUmQgPSBwZXJpb2RSZXR1cm4oTUNELHBlcmlvZD0iZGFpbHkiLHR5cGU9ImxvZyIpDQptZWFuKG1jZFJkKQ0Kc2QobWNkUmQpDQpgYGANCg0KR2l2ZW4gYSB0aW1lIHNlcmllcyB3ZSBjYW4gZ2VuZXJhdGUgYSBoaXN0b2dyYW0gYW5kIG1hcmsgdGhlIHF1YW50aWxlIHZhbHVlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIDk1JSBjb25maWRlbmNlIGxldmVsLiBUaGUgcXVhbnRpbGUgdmFsdWUgaW4gdGhpcyBjYXNlIGlzIHRoZSBjcml0aWNhbCB2YWx1ZSBmb3Igd2hpY2ggOTUlIG9mIHRoZSBkYXRhIGlzIG9uIHRoZSByaWdodCAoaGlnaGVyKSBvZiB0aGUgY3JpdGljYWwgdmFsdWUgYXMgcmVwcmVzZW50ZWQgYnkgdGhlIGhpc3RvZ3JhbS4gVGhlIHJlbWFpbmluZyA1JSB3aWxsIGJlIG9uIHRoZSBsZWZ0LiBUbyBmaW5kIHRoZSBxdWFudGlsZSB2YWx1ZSB5b3Ugd2lsbCBuZWVkIHRvIHVzZSB0aGUgZnVuY3Rpb24gYHF1YW50aWxlKClgIHdpdGggdGhlIHByb3BlciBhcmd1bWVudHMuIEZvciBleGFtcGxlIGBxdWFudGlsZSh4dHMscHJvYnM9MC4wMSlgICBhcHBsaWVzIHRvIGEgdGltZSBzZXJpZXMgYHh0c2AgYW5kIHJldHVybiB0aGUgY3JpdGljYWwgdmFsdWUgY29ycmVzcG9uZG5nIHRvIGA5OSVgIGNvbmZpZGVuY2UgbGV2ZWwuDQoNCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAxQikgUGxvdCBhIGhpc3RvZ3JhbSBhbmQgbWFyayB0aGUgcXVhbnRpbGUgdmFsdWUgdGhhdCBjb3JyZXNwb25kcyB0byA5NSUgY29uZmlkZW5jZSBsZXZlbC4gQSBtYXJrIGNhbiBiZSBhZGRlZCB0byBhIHBsb3QgYnkgdXNpbmcgdGhlIGZ1bmN0aW9uIGBhYmxpbmUoKWAuDQo8L3NwYW4+DQoNCmBgYHtyfQ0KaGlzdChtY2RSZCwgYnJlYWtzPTIwKQ0KYWJsaW5lKHY9cXVhbnRpbGUobWNkUmQsIHByb2JzPTAuMDUpLGNvbCA9ICJyZWQiKQ0KYGBgDQoNCkdpdmVuIHRoZSBhYm92ZSwgd2UgY2FuIGNhbGN1bGF0ZSBhIFZhUiB2YWx1ZSBmb3IgYSBnaXZlbiBpbnZlc3RtZW50IGFuZCBhIHRpbWUgaG9yaXpvbi4NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAxQykgQXNzdW1lICQxMDAwIGludmVzdG1lbnQgaW4gdGhlIHN0b2NrLCBjYWxjdWxhdGUgdGhlIDk1JSBWYVIgZm9yIDMgZGF5c+KAmSB0aW1lIGhvcml6b24uICBFeHBsYWluIHRoZSBtZWFuaW5nIG9mIFZhUiBpbiBwcmFjdGljYWwgdGVybXMuDQo8L3NwYW4+DQoNCmBgYHtyfQ0KcXVhbnRpbGUobWNkUmQsIHByb2JzPTAuMDUpKjEwMDAqc3FydCgzKQ0KYGBgDQpUaGUgcmVzdWx0IG1lYW5zIHRoYXQgaWYgeW91IGludmVzdCAkMTAwMCBpbiBNQ0Qgc3RvY2ssIHlvdSB3aWxsIGhhdmUgNSUgcHJvYmFiaWxpdHkgb2YgbG9zaW5nIGF0IGxlYXN0ICQyOC4zMzQ3IGluIG5leHQgdGhyZWUgZGF5cy4NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAxRCkgSG93IGRvZXMgdGhlIFZhUiBjYWxjdWxhdGVkIGluIDFDIGNoYW5nZXMgaWYgd2UgYXNzdW1lZCBzaW1wbGUgcmV0dXJucyBpbnN0ZWFkIG9mIHRoZSBsb2cgcmV0dXJucy4NCjwvc3Bhbj4NCg0KYGBge3J9DQooaGhleHAocXVhbnRpbGUobWNkUmQsIHByb2JzPTAuMDUpKS0xKSoxMDAwKnNxcnQoMykNCmBgYA0KV2UgY2FuIGNhbGN1bGF0ZSB0aGUgVmFSIG9mIHNpbXBsZSByZXR1cm5zIGZyb20gdGhlIFZhUiBvZiBsb2ctcmV0dXJucyB1c2luZyB0aGUgZm9ybXVsYTogJFZhUl97Ul90fT1lXntWYVJfe3JfdH19LTEkIGFuZCB3ZSB3aWxsIGdldCAgdGhlIHZhbHVlIG9mIFZhUiBvZiBzaW1wbGUgcmV0dXJucywgd2hpY2ggaXMgYWJvdmUuIEFuZCB0aGV5IGFyZSBjbG9zZSB0byBlYWNoIG90aGVyIGJlY2F1c2UgJGVee3h9LTE9eCQgd2hlbiB4IGlzIHNtYWxsIGVub3VnaC4NCg0KQ2FsY3VsYXRpb25zIHNvIGZhciBoYXZlIGJlZW4gb24gdGhlIGhpc3RvZ3JhbSBvZiBsb2cgcmV0dXJucy4gV2UgY2FuIGluc3RlYWQsIGxvb2tpbmcgYXQgdGhlIGhpc3RvZ3JhbSwgYXNzdW1lIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbG9nIHJldHVybnMuIFRoZSBub3JtYWwgcmV0dXJuIGFzc3VtcHRpb24gd2lsbCBoYXZlIGEgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIGVxdWFsIHRvIHRob3NlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgaGlzdG9ncmFtLCBhbmQgcHJvcGVybHkgc2NhbGVkIGJ5IHRoZSBob3Jpem9uIHRpbWUuICBOb3RlIHRoYXQgdGhlIG1lYW4gaXMgbGluZWFybHkgc2NhbGVkIHdpdGggdGltZSBhbmQgdm9sYXRpbGl0eSB3aXRoIHNxdWFyZS1yb290IG9mIHRpbWUuDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMUUpIFJlcGVhdCB0aGUgY2FsY3VsYXRpb24gaW4gMUQgYXNzdW1pbmcgaW5zdGVhZCBhIG5vcm1hbCBkaXN0cmlidXRpb24uIEhvdyB0aGUgdHdvIHJlc3VsdHMgY29tcGFyZSBhbmQgd2h5IHNvPw0KPC9zcGFuPg0KDQpgYGB7cn0NCmdldFN5bWJvbHMoJ01DRCcsc3JjPSd5YWhvbycsIGZyb209IjIwMTUtMDEtMDEiLCB0bz0iMjAxOS0yLTYiKQ0KbWNkUmQgPSBwZXJpb2RSZXR1cm4oTUNELHBlcmlvZD0iZGFpbHkiLCB0eXBlPSJsb2ciKQ0KYz1tZWFuKG1jZFJkKSozDQpkPXNkKG1jZFJkKSpzcXJ0KDMpDQpxbm9ybSgwLjA1LCBtZWFuPWMsIHNkPWQpKjEwMDANCmBgYA0KVGhlIFZhUiBvZiB0aGUgbG9nLXJldHVybnMgaW4gbm9ybWFsIGRpc3RyaWJ1dGlvbiBpcyBsYXJnZXIgdGhhbiB0aGUgVmFSIG9mIHRoZSBsb2ctcmV0dXJucyBpbiBhIGFjdHVhbCBkaXN0cmlidXRpb24gKGluIGFic29sdXRlIHZhbHVlKS4gVGhpcyBpcyBiZWNhdXNlIHRoZSBhY3R1YWwgZGlzdHJpYnV0aW9uIG9mIGxvZy1yZXR1cm5zIGlzIG5vdCBub3JtYWxseSBkaXN0cmlidXRlZC4gSXQgaGFzIHBvc2l0aXZlIHNrZXduZXNzLCB3aGljaCBtZWFucyBpdCBoYXMgZmF0IHJpZ2h0IHRhaWwuIA0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDFGKSBXcml0ZSBkb3duIHRoZSBtYXRoZW1hdGljYWwgcmVwcmVzZW50YXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgVmFSIGNhbGN1bGF0aW9uIGluIDFFLiBFeHBsYWluIHdoYXQgZWFjaCB2YXJpYWJsZSBpbiB0aGUgZXF1YXRpb24gcmVwcmVzZW50cywgYW5kIHByb3ZpZGUgdGhlIGNvcnJlc3BvbmRpbmcgbnVtZXJpY2FsIHZhbHVlLg0KPC9zcGFuPg0KDQpUaGUgbWF0aGVtYXRpY2FsIHJlcHJlc2VudGF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFZhUiBjYWxjdWxhdGlvbiBpczogDQoNCiRWYVJfe3N9PVYqKFpfe2N9KlxzaWdtYV97c30rXG11X3tzfSkkDQoNClYgaXMgdGhlIHZvbHVtZSBvZiBpbnZlc3RtZW50LCB3aGljaCBpcyAkMTAwMCBpbiB0aGUgcXVlc3Rpb247ICRcbXVfe3N9JCBpcyB0aGUgbWVhbiBvZiB0aGUgZGlzdHJpYnV0aW9uIG9mICBsb2ctcmV0dXJucyBvZiBzdG9jayBpbiB0aHJlZSBkYXlzLCB3aGljaCBpcyAwLjAwMDYxNjIqMzsgJFxzaWdtYV97c30kIGlzIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIGRpc3RyaWJ1dGlvbiBvZiBsb2ctcmV0dXJucyBvZiBzdG9jayBpbiB0aHJlZSBkYXlzLCB3aGljaCBpcyAwLjAxMDg1OTYkKlxzcXJ0MyQ7ICRaX3tjfSQgaXMgdGhlIGNyaXRpY2FsIHZhbHVlIGF0IGM9OTUlIGNvbmZpZGVuY2UgbGV2ZWwgaW4gdGhlIHN0YW5kYXJkIG5vcm1hbCBkaXN0cmlidXRpb24sIHdoaWNoIGlzIC0xLjY0NTsgJFZhUl97c30kIGlzIHRoZSBWYVIgb2YgdGhlIGFjdHVhbCByZXR1cm4gb2YgdGhlIHN0b2NrLg0KDQoNCiMjIyBUYXNrIDI6IFZhUiBDYWxjdWxhdGlvbnM6IE11bHRpcGxlIEVxdWl0eSBBc3NldHMNCg0KQ29uc2lkZXIgdGhlIHRpbWVzIHNlcmllcyBvZiB0aGUgdGhyZWUgc3RvY2tzIERJUywgVFdUUiwgYW5kIE5GTFggZm9yIHRoZSB0aW1lLXBlcmlvZCBmcm9tIEphbiAxLDIwMTUgdG8gcHJlc2VudC4gQXNzdW1lIGFuIGludmVzdG1lbnQgb2YgJDEwMCwwMDAgZXF1YWxseSBkaXN0cmlidXRlZCBhbW9uZyBhbGwgdGhyZWUgc3RvY2tzLiANCg0KVG8gY2FsY3VsYXRlIHRoZSBwb3J0Zm9saW8gVmFSIHdlIHdpbGwgZm9sbG93IHRoZSBtZXRob2RvbGd5IGRlc2NyaWJlZCBieSB0aGUgdmFyaWFuY2UtY292YXJpYW5jZS4gRmlyc3QgdGhlIGNvdmFyaWFuY2UgbWF0cml4IG5lZWRzIHRvIGJlIGNvbXB1dGVkLiAgV2UgdGhlbiBjYWxjdWxhdGUgdGhlIHZhcmlhbmNlIG9yIHZvbGF0aWxpdHkgb2YgdGhlIHBvcnRvbGlvIGFzIGV4cHJlc3NlZCBpbiB0aGUgdmFyYWluY2UtY292YXJpYW5jZSBtZXRob2QgdGFraW5nIGludG8gdGhlIHdlaWdodHMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggYXNzZXQgaW4gdGhlIHBvcnRmb2xpby4gIEZpaW5hbGx5IHdlIGNvbXB1dGUgdGhlIG1lYW4gb3IgZXhwZWN0ZWQgcmV0dXJuIG9mIHRoZSBwb3J0Zm9saW8gdGFraW5nIGFsc28gaW50byBhY2NvdW50IHRoZSB3ZWlnaHRzLiAgR2l2ZW4gdGhlIGV4cGVjdGVkIHJldHVybiBhbmQgdm9sYXRpbGl0eSB3ZSBzaG91bGQgYmUgYWJsZSB0byBjb21wdXRlIHRoZSBWYVIgb2YgdGhlIHBvcnRmb2xpby4gIFRoZSBhc3N1bXB0aW9uIGlzIHdlIGhhdmUgYSBub3JtYWwgZGlzdHJpYnV0aW9uIG9mIGxvZyByZXR1cm5zLg0KDQpGaXJzdCB3ZSBjYWxjdWxhdGUgdGhlIG92ZXJhbGwgcG9ydGZvbGlvIFZhUi4NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAyQSkgQ2FsY3VsYXRlIHRoZSBwb3J0Zm9saW8gOTklIFZhUiBmb3IgMSBkYXksIGFuZCAzIGRheXMuIFNwZWNpZnkgd2hldGhlciB1c2luZyBsb2ctcmV0dXJucyBvciBzaW1wbGUgcmV0dXJucy4NCjwvc3Bhbj4NCg0KYGBge3J9DQpnZXRTeW1ib2xzKCdESVMnLHNyYz0neWFob28nLCBmcm9tPSIyMDE1LTAxLTAxIiwgdG89IjIwMTktMi02IikNCmRpc1JkID0gcGVyaW9kUmV0dXJuKERJUyxwZXJpb2Q9ImRhaWx5IiwgdHlwZT0ibG9nIikNCmdldFN5bWJvbHMoJ1RXVFInLHNyYz0neWFob28nLCBmcm9tPSIyMDE1LTAxLTAxIiwgdG89IjIwMTktMi02IikNCnR3dHJSZCA9IHBlcmlvZFJldHVybihUV1RSLHBlcmlvZD0iZGFpbHkiLCB0eXBlPSJsb2ciKQ0KZ2V0U3ltYm9scygnTkZMWCcsc3JjPSd5YWhvbycsIGZyb209IjIwMTUtMDEtMDEiLCB0bz0iMjAxOS0yLTYiKQ0KbmZseFJkID0gcGVyaW9kUmV0dXJuKE5GTFgscGVyaW9kPSJkYWlseSIsIHR5cGU9ImxvZyIpDQpNID0gY2JpbmQoZGlzUmQsdHd0clJkLG5mbHhSZCkNCmNvcihNKQ0KY292KE0pDQp3ID0gcmVwKDEvMywgMykNCnZhcl9wID0gdyAlKiUgY292KE0pICUqJSB3DQptdV9wID0gY29sTWVhbnMoTSkgJSolIHcgDQoocW5vcm0oMC4wMSwgbWVhbj0wLCBzZD0xKSpzcXJ0KHZhcl9wKSttdV9wKSoxMDAwMDANCihxbm9ybSgwLjAxLCBtZWFuPTAsIHNkPTEpKnNxcnQodmFyX3ApKnNxcnQoMykrbXVfcCozKSoxMDAwMDANCg0KYGBgDQoNCldlIHRoZW4gZGVzY3JpYmUgdGhlIG1hdGhldGljYWwgZm9ybXVsYXRpb24gdXNlZHMgaW4gdGhlIGNvZGUgdG8gcGVyZm9ybSB0aGUgY2FsY3VsYXRpb25zDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMkIpIFdyaXRlIGRvd24gdGhlIG1hdGhlbWF0aWNhbCByZXByZXNlbnRhdGlvbnMgdXNlZCBpbiB0aGUgY29kZSB0byBjYWxjdWxhdGUgdGhlIFZhUi4gIExhYmVsIHByb3Blcmx5IGVhY2ggdmFyaWFibGUsIHdoYXQgaXQgcmVwcmVzZW50cywgYW5kIHRoZSBudW1lcmljYWwgdmFsdWUgY29ycmVzcG9uZGluZyB0byBpbiB0aGUgY29kZS4NCjwvc3Bhbj4NCg0KVGhlIG1hdGhlbWF0aWNhbCByZXByZXNlbnRhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBWYVIgY2FsY3VsYXRpb24gaXM6IA0KDQokVmFSX3twfT1WKihaX3tjfSpcc2lnbWFfe3B9KlxzcXJ0IHQrXG11X3twfSp0KSQNCg0KViBpcyB0aGUgdG90YWwgdm9sdW1lIG9mIGludmVzdG1lbnQsIHdoaWNoIGlzICQxMDAwMDAgaW4gdGhlIHBvcnRmb2xpbzsgJFxtdV97cH0qdCQgaXMgdGhlIG1lYW4gb2YgdGhlIGRpc3RyaWJ1dGlvbiBvZiBhY3R1YWwgcmV0dXJuIG9mIHBvcnRmb2xpbyBpbiB0IGRheXMsIHdoaWNoIGlzIDAuMDAwNjc5KnQ7ICRcc2lnbWFfe3B9JCBpcyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBkaXN0cmlidXRpb24gb2YgYWN0dWFsIHJldHVybiBvZiBwb3J0Zm9saW8gaW4gdCBkYXlzLCB3aGljaCBpcyAkXHNxcnR7MC4wMDAzMTcqdH0kOyB0IGlzIHRoZSBudW1iZXIgb2YgZGF5cywgaW4gdGhpcyBjYXNlIHQ9MSBvciAzOyAkWl97Y30kIGlzIHRoZSBjcml0aWNhbCB2YWx1ZSBhdCA5OSUgY29uZmlkZW5jZSBsZXZlbCBpbiB0aGUgc3RhbmRhcmQgbm9ybWFsIGRpc3RyaWJ1dGlvbiwgd2hpY2ggaXMgLTIuMzI2OyAkVmFSX3twfSQgaXMgdGhlIFZhUiBvZiB0aGUgYWN0dWFsIHJldHVybiBvZiB0aGUgcG9ydGZvbGlvIGNvbnRhaW5pbmcgdGhyZWUgc3RvY2tzIGluIHQgZGF5cy4NCg0KDQpXZSBub3cgY2FsY3VsYXRlZCBpbmRpdmlkdWFsIFZhUiBjb3JyZXNwb25kaW5nIHRvIGVhY2ggYXNzdCBpbiB0aGUgcG9ydGZvbGlvDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMkMpIENhbGN1bGF0ZSB0aGUgdGhyZWUtaW5kaXZpZHVhbCBhc3NldCA5OSUgVmFSIGZvciAxIGRheS4gIA0KPC9zcGFuPg0KDQpgYGB7cn0NCmdldFN5bWJvbHMoJ0RJUycsc3JjPSd5YWhvbycsIGZyb209IjIwMTUtMDEtMDEiLCB0bz0iMjAxOS0yLTYiKQ0KZGlzUmQgPSBwZXJpb2RSZXR1cm4oRElTLHBlcmlvZD0iZGFpbHkiLCB0eXBlPSJsb2ciKQ0KcXVhbnRpbGUoZGlzUmQsIHByb2JzPTAuMDEpKjEwMDAwMCoxLzMNCmdldFN5bWJvbHMoJ1RXVFInLHNyYz0neWFob28nLCBmcm9tPSIyMDE1LTAxLTAxIiwgdG89IjIwMTktMi02IikNCnR3dHJSZCA9IHBlcmlvZFJldHVybihUV1RSLHBlcmlvZD0iZGFpbHkiLCB0eXBlPSJsb2ciKQ0KcXVhbnRpbGUodHd0clJkLCBwcm9icz0wLjAxKSoxMDAwMDAqMS8zDQpnZXRTeW1ib2xzKCdORkxYJyxzcmM9J3lhaG9vJywgZnJvbT0iMjAxNS0wMS0wMSIsIHRvPSIyMDE5LTItNiIpDQpuZmx4UmQgPSBwZXJpb2RSZXR1cm4oTkZMWCxwZXJpb2Q9ImRhaWx5IiwgdHlwZT0ibG9nIikNCnF1YW50aWxlKG5mbHhSZCwgcHJvYnM9MC4wMSkqMTAwMDAwKjEvMw0KYGBgDQoNCkZpbmFsbHkgd2UgY29tcGFyZSB0aGUgb3ZlcmFsbCBWYVIgdG8gdGhlIGluZGl2aWR1YWwgVmFSIGNhbGN1bGF0aW9ucw0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDJEKSBDb21wYXJlIHRoZSBvdmVyYWxsIHBvcnRmb2xpbyBWYVIgdG8gdGhlIHN1bSBvZiB0aGUgaW5kaXZpZHVhbCBhc3NldCBWYVIgZm9yIHRoZSAxIGRheSBjYXNlLiAgU2hhcmUgb2JzZXJ2YXRpb25zLg0KPC9zcGFuPg0KDQpgYGB7cn0NCnZhcnN1bT1xdWFudGlsZShkaXNSZCwgcHJvYnM9MC4wMSkqMTAwMDAwKjEvMytxdWFudGlsZSh0d3RyUmQsIHByb2JzPTAuMDEpKjEwMDAwMCoxLzMrcXVhbnRpbGUobmZseFJkLCBwcm9icz0wLjAxKSoxMDAwMDAqMS8zDQp2YXJzdW0NCnZhcjENCmBgYA0KQXMgd2UgY2FuIHNlZSBmcm9tIHRoZSByZXN1bHRzIGFib3ZlLCB0aGUgc3VtIG9mIHRocmVlIGluZGl2aWR1YWwgYXNzZXQgVmFSIGZvciAxIGRheSBpcyBncmVhdGVyIHRoYW4gdGhlIG92ZXJhbGwgcG9ydGZvbGlvIFZhUi4gU2luY2UgJFZhUl97cH08VmFSX3tzMX0rVmFSX3tzMn0rVmFSX3tzM30kLCB3ZSBjYW4gY29uY2x1ZGUgdGhhdCBkaXZlcnNpZmljYXRpb24gZG9lcyByZWR1Y2Ugcmlzay4NCg0KKltodHRwOi8vY29tcHV0YXRpb25hbGZpbmFuY2UubHNpLnVwYy5lZHUgXShodHRwOi8vY29tcHV0YXRpb25hbGZpbmFuY2UubHNpLnVwYy5lZHUpDQo=