About
This worksheet looks at simulating, both arithmetics and geometric, Brownian motion for stock prices, pricing options, and calculating Greeks using numerical differentiation.
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: Simulating Brownian Motion
This task follows the two examples in the book R Example 5.1/p 148 for simulating an arithmetic Brownian motion and R Example 5.2/p152 for simulating a geometric motion. Two new packages will be required for this worksheet. They are included in the code chunk below.
#Install package quantmod
if(!require("quantmod",quietly = TRUE))
install.packages("quantmod",dependencies = TRUE, repos = "https://cloud.r-project.org")
#Install package sde for Stochastic Differential Equation
if(!require("sde",quietly = TRUE))
install.packages("sde",dependencies = TRUE, repos = "https://cloud.r-project.org")
#Install package fOptions for pricing and evaluating basic options
if(!require("fOptions",quietly = TRUE))
install.packages("fOptions",dependencies = TRUE, repos = "https://cloud.r-project.org")
##### 1A) Follow example in book to simulate and plot example of an arithmetic Brownian motion. Consider three values for n (number of points): \(2^2, 2^5, 2^{12}\). Explain behavior as n increases.
require(sde)
alpha=0; sigma=1; T=1; n=2^(2); X0=0.1;
dt=T/n
t=seq(0,T,by=dt)
x=c(X0, alpha*dt+sigma*sqrt(dt)*rnorm(n,mean=0,sd=1))
Xt=cumsum(x)
plot(t, Xt, type="l", xlab= "time")

require(sde)
alpha=0; sigma=1; T=1; n=2^(5); X0=0.1;
dt=T/n
t=seq(0,T,by=dt)
x=c(X0, alpha*dt+sigma*sqrt(dt)*rnorm(n,mean=0,sd=1))
Xt=cumsum(x)
plot(t, Xt, type="l", xlab= "time")

require(sde)
alpha=0; sigma=1; T=1; n=2^(12); X0=0.1;
dt=T/n
t=seq(0,T,by=dt)
x=c(X0, alpha*dt+sigma*sqrt(dt)*rnorm(n,mean=0,sd=1))
Xt=cumsum(x)
plot(t, Xt, type="l", xlab= "time")

The behavior of the brownian motion becomes more accurate as n increases. By increasing the value of n, you are adding more plot points, and the time steps (T/n) become smaller. The “n=2^(2)” graph almost looks linear, and seems to increase as time goes on. The other two graphs, “n=2^(5)” and “n=2^(12)” have an overall negative trajectory.
##### 1B) Write the mathematical equation representing the values along the y-axis in the above plot. Separately express what the value of each variable in the equation is.
\(X(t) = X(t-1) + \alpha \frac{T}{n} + \sigma \varepsilon_{t} \sqrt{\frac{T}{n}}\)
The y-axis, \(X(t)\), represents the random walk that arithmetic brownian motion follows.
t = time period \(\alpha\) = constant drift rate T = total time n = number of time periods \(\sigma\) = variance \(\varepsilon_{t}\) = represents white noise. It is a randomly generated number that is normally distributed with a mean of 0 and a variance of 1.
##### 1C) Follow example in book to simulate a geometric Brownian motion.
require(sde)
mu=0.16; sigma=0.2; P0=40; T=1/12
nt=50; n=2^(8)
dt=T/n; t=seq(0,T,by=dt)
X=matrix(rep(0,length(t)*nt), nrow=nt)
for (i in 1:nt) {X[i,]= GBM(x=P0, r=mu, sigma=sigma, T=T, N=n)}
ymax=max(X); ymin=min(X)
plot(t, X[1,], type='l', ylim=c(ymin,ymax), col=1, ylab="price P(t)", xlab= "time t")
for (i in 2:nt) {lines(t, X[i,], type='l', ylim=c(ymin, ymax), col=i)}

##### 1D) Write the mathematical equation representing the values along the y-axis in the above plot. Separately express what the value of each variable in the equation is.
\(P_{T} = P_{o} e ^ { \mu - \frac{\sigma^{2}}{2} + \sigma \varepsilon_{t} \sqrt{\Delta t}}\)
The y-axis is \(P_{T}\) and it represents the price of the stock at time T. The graph from #1C has 50 different pathways of the same equation and the uppbound price point is $47.25. The lower bound price point is $35.96
\(P_{o}\) = Initial price of the stock T = total time \(\mu\) = mean, or expected retrun for the year \(\sigma^{2}\) = variance for the year \(\varepsilon_{t}\) = represents white noise. It is a randomly generated number that is normally distributed with a mean of 0 and a variance of 1.
##### 1E) How is the geometric Brownian simulation different from the arithmetic simulation? Elaborate. The arithmetric Browniam motion simulation is modeled as the sum of random terms whereas the geometric Bowniam motion simulation is the product of random factors. The arithmetric Brownian motion carries problems becasue prices cannt be negative. In order to fix this, we take the log of the the discrete SDE formula to gaurentee no negative values.
Task 2: Option Pricing, Greeks, and Numerical Differentiation
Follows the example in the book R Example 5.3/p 156 and R Example 5.5/p 157
##### 2A) Calculate the Call and Put price of the given European Option. Explain what the variables r and b in the function call GBSOption represent.
require(fOptions)
GBSOption(TypeFlag = "c", S = 60, X = 65, Time = 1/4, r = 0.08, b = 0.08, sigma = 0.30)
Title:
Black Scholes Option Valuation
Call:
GBSOption(TypeFlag = "c", S = 60, X = 65, Time = 1/4, r = 0.08,
b = 0.08, sigma = 0.3)
Parameters:
Value:
TypeFlag c
S 60
X 65
Time 0.25
r 0.08
b 0.08
sigma 0.3
Option Price:
2.133372
Description:
Sat Dec 8 17:44:30 2018
require(fOptions)
GBSOption(TypeFlag = "p", S = 60, X = 65, Time = 1/4, r = 0.08, b = 0.08, sigma = 0.30)
Title:
Black Scholes Option Valuation
Call:
GBSOption(TypeFlag = "p", S = 60, X = 65, Time = 1/4, r = 0.08,
b = 0.08, sigma = 0.3)
Parameters:
Value:
TypeFlag p
S 60
X 65
Time 0.25
r 0.08
b 0.08
sigma 0.3
Option Price:
5.846286
Description:
Sat Dec 8 17:44:57 2018
In the GBSOption function, the variable “r” represents the annualized rate of interest and the variable “b” represents the annualized cost of carry rate
##### 2B) Calculate the particular Greeks Delta, Gamma, and Vega for the above corresponding Call option.
require(fOptions)
GBSCharacteristics(TypeFlag = "c", S = 60, X = 65, Time = 1/4, r = 0.08, b = 0.08, sigma = 0.30)
$premium
[1] 2.133372
$delta
[1] 0.3724829
$theta
[1] -8.428174
$vega
[1] 11.35154
$rho
[1] 5.0539
$lambda
[1] 10.47589
$gamma
[1] 0.04204276
##### 2C) Calculate the Delta, Gamma, and Vega for same option using instead numerical differentiation. Write the mathematical equations corresponding to each numerical differentiation.
\(\Delta = \phi * (\frac{ln(P_{t}/k) + (r + \sigma^{2}/2)(T-t)}{\sigma \sqrt{T-t}})\)
\(\Gamma = \frac{\phi * (\frac{ln(P_{t}/k) + (r + \sigma^{2}/2)(T-t)}{\sigma \sqrt{T-t}})} {P\sigma \sqrt{T-t}}\)
\(v = P \sqrt{T-t} * \phi * (\frac{ln(P_{t}/k) + (r + \sigma^{2}/2)(T-t)}{\sigma \sqrt{T-t}})\)
##### 2D) Compare results from 2B and 2C. Share observations. There is no significant difference between 2B and 2C calculations.
*http://computationalfinance.lsi.upc.edu This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.
Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.
plot(cars)
Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.
When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).
The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.
LS0tCnRpdGxlOiAiRklOQzYyMSBXaW50ZXIgMjAxOC0xOSBMYWIgV29ya3NoZWV0IDA0IgphdXRob3I6ICJHcmFjZSBPbnVmZXIiCmRhdGU6ICJEZWNlbWJlciAxMnRoLCAyMDE4IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKc3VidGl0bGU6IFN0b2NoYXN0aWMgTW9kZWxpbmcgJiBOdW1lcmljYWwgRGlmZmVyZW50aWF0aW9uIChmaW5jNjIxLWxhYjA0KQotLS0KCiMjIyBBYm91dAoKVGhpcyB3b3Jrc2hlZXQgbG9va3MgYXQgc2ltdWxhdGluZywgYm90aCBhcml0aG1ldGljcyBhbmQgZ2VvbWV0cmljLCBCcm93bmlhbiBtb3Rpb24gZm9yIHN0b2NrIHByaWNlcywgcHJpY2luZyBvcHRpb25zLCBhbmQgY2FsY3VsYXRpbmcgR3JlZWtzIHVzaW5nIG51bWVyaWNhbCBkaWZmZXJlbnRpYXRpb24uICAKCiMjIyBTZXR1cAoKUmVtZW1iZXIgdG8gYWx3YXlzIHNldCB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbi4gR28gdG8gJ1Nlc3Npb24nLCBzY3JvbGwgZG93biB0byAnU2V0IFdvcmtpbmcgRGlyZWN0b3J5JywgYW5kIGNsaWNrICdUbyBTb3VyY2UgRmlsZSBMb2NhdGlvbicuIFJlYWQgY2FyZWZ1bGx5IHRoZSBiZWxvdyBhbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgdG8gY29tcGxldGUgdGhlIHRhc2tzIGFuZCBhbnN3ZXIgYW55IHF1ZXN0aW9ucy4gIFN1Ym1pdCB5b3VyIHdvcmsgdG8gUlB1YnMgYXMgZGV0YWlsZWQgaW4gcHJldmlvdXMgbm90ZXMuIAoKIyMjIE5vdGUKCkFsd2F5cyByZWFkIGNhcmVmdWxseSB0aGUgaW5zdHJ1Y3Rpb25zIG9uIFNha2FpLiAgRm9yIGNsYXJpdHksIHRhc2tzL3F1ZXN0aW9ucyB0byBiZSBjb21wbGV0ZWQvYW5zd2VyZWQgYXJlIGhpZ2hsaWdodGVkIGluIHJlZCBjb2xvciAodmlzaWJsZSBpbiBwcmV2aWV3KSBhbmQgbnVtYmVyZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHBhcnRpY3VsYXIgcGxhY2VtZW50IGluIHRoZSB0YXNrIHNlY3Rpb24uICBRdWl0ZSBvZnRlbiB5b3Ugd2lsbCBuZWVkIHRvIGFkZCB5b3VyIG93biBjb2RlIGNodW5rLgoKRXhlY3V0ZSBhbGwgY29kZSBjaHVua3MsIHByZXZpZXcsIHB1Ymxpc2gsIGFuZCBzdWJtaXQgbGluayBvbiBTYWthaSBmb2xsd29pbmcgdGhlIG5hbWluZyBjb252ZW50aW9uLiBNYWtlIHN1cmUgdG8gYWRkIGNvbW1lbnRzIHRvIHlvdXIgY29kZSB3aGVyZSBhcHByb3ByaWF0ZS4gVXNlIG93biBsYW5ndWFnZSEKCi0tLS0tLS0tLS0tLS0tCgojIyMgVGFzayAxOiBTaW11bGF0aW5nIEJyb3duaWFuIE1vdGlvbgoKVGhpcyB0YXNrIGZvbGxvd3MgdGhlIHR3byBleGFtcGxlcyBpbiB0aGUgYm9vayBgUiBFeGFtcGxlIDUuMS9wIDE0OGAgZm9yIHNpbXVsYXRpbmcgYW4gYXJpdGhtZXRpYyBCcm93bmlhbiBtb3Rpb24gYW5kIGBSIEV4YW1wbGUgNS4yL3AxNTJgIGZvciBzaW11bGF0aW5nIGEgZ2VvbWV0cmljIG1vdGlvbi4gVHdvIG5ldyBwYWNrYWdlcyB3aWxsIGJlIHJlcXVpcmVkIGZvciB0aGlzIHdvcmtzaGVldC4gIFRoZXkgYXJlIGluY2x1ZGVkIGluIHRoZSBjb2RlIGNodW5rIGJlbG93LgoKYGBge3J9CiNJbnN0YWxsIHBhY2thZ2UgcXVhbnRtb2QgCmlmKCFyZXF1aXJlKCJxdWFudG1vZCIscXVpZXRseSA9IFRSVUUpKQogIGluc3RhbGwucGFja2FnZXMoInF1YW50bW9kIixkZXBlbmRlbmNpZXMgPSBUUlVFLCByZXBvcyA9ICJodHRwczovL2Nsb3VkLnItcHJvamVjdC5vcmciKQpgYGAKCmBgYHtyfQojSW5zdGFsbCBwYWNrYWdlIHNkZSBmb3IgU3RvY2hhc3RpYyBEaWZmZXJlbnRpYWwgRXF1YXRpb24KaWYoIXJlcXVpcmUoInNkZSIscXVpZXRseSA9IFRSVUUpKQogIGluc3RhbGwucGFja2FnZXMoInNkZSIsZGVwZW5kZW5jaWVzID0gVFJVRSwgcmVwb3MgPSAiaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnIikKYGBgCgpgYGB7cn0KI0luc3RhbGwgcGFja2FnZSBmT3B0aW9ucyBmb3IgcHJpY2luZyBhbmQgZXZhbHVhdGluZyBiYXNpYyBvcHRpb25zCmlmKCFyZXF1aXJlKCJmT3B0aW9ucyIscXVpZXRseSA9IFRSVUUpKQogIGluc3RhbGwucGFja2FnZXMoImZPcHRpb25zIixkZXBlbmRlbmNpZXMgPSBUUlVFLCByZXBvcyA9ICJodHRwczovL2Nsb3VkLnItcHJvamVjdC5vcmciKQpgYGAKCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMUEpIEZvbGxvdyBleGFtcGxlIGluIGJvb2sgdG8gc2ltdWxhdGUgYW5kIHBsb3QgZXhhbXBsZSBvZiBhbiBhcml0aG1ldGljIEJyb3duaWFuIG1vdGlvbi4gQ29uc2lkZXIgdGhyZWUgdmFsdWVzIGZvciBuIChudW1iZXIgb2YgcG9pbnRzKTogJDJeMiwgMl41LCAyXnsxMn0kLiBFeHBsYWluIGJlaGF2aW9yIGFzIG4gaW5jcmVhc2VzLgo8L3NwYW4+CmBgYHtyfQpyZXF1aXJlKHNkZSkKCmFscGhhPTA7IHNpZ21hPTE7IFQ9MTsgbj0yXigyKTsgWDA9MC4xOwpkdD1UL24KdD1zZXEoMCxULGJ5PWR0KQp4PWMoWDAsIGFscGhhKmR0K3NpZ21hKnNxcnQoZHQpKnJub3JtKG4sbWVhbj0wLHNkPTEpKQpYdD1jdW1zdW0oeCkKcGxvdCh0LCBYdCwgdHlwZT0ibCIsIHhsYWI9ICJ0aW1lIikKCmBgYAoKYGBge3J9CnJlcXVpcmUoc2RlKQoKYWxwaGE9MDsgc2lnbWE9MTsgVD0xOyBuPTJeKDUpOyBYMD0wLjE7CmR0PVQvbgp0PXNlcSgwLFQsYnk9ZHQpCng9YyhYMCwgYWxwaGEqZHQrc2lnbWEqc3FydChkdCkqcm5vcm0obixtZWFuPTAsc2Q9MSkpClh0PWN1bXN1bSh4KQpwbG90KHQsIFh0LCB0eXBlPSJsIiwgeGxhYj0gInRpbWUiKQpgYGAKYGBge3J9CnJlcXVpcmUoc2RlKQoKYWxwaGE9MDsgc2lnbWE9MTsgVD0xOyBuPTJeKDEyKTsgWDA9MC4xOwpkdD1UL24KdD1zZXEoMCxULGJ5PWR0KQp4PWMoWDAsIGFscGhhKmR0K3NpZ21hKnNxcnQoZHQpKnJub3JtKG4sbWVhbj0wLHNkPTEpKQpYdD1jdW1zdW0oeCkKcGxvdCh0LCBYdCwgdHlwZT0ibCIsIHhsYWI9ICJ0aW1lIikKYGBgClRoZSBiZWhhdmlvciBvZiB0aGUgYnJvd25pYW4gbW90aW9uIGJlY29tZXMgbW9yZSBhY2N1cmF0ZSBhcyBuIGluY3JlYXNlcy4gIEJ5IGluY3JlYXNpbmcgdGhlIHZhbHVlIG9mIG4sIHlvdSBhcmUgYWRkaW5nIG1vcmUgcGxvdCBwb2ludHMsIGFuZCB0aGUgdGltZSBzdGVwcyAoVC9uKSBiZWNvbWUgc21hbGxlci4gIFRoZSAibj0yXigyKSIgZ3JhcGggYWxtb3N0IGxvb2tzIGxpbmVhciwgYW5kIHNlZW1zIHRvIGluY3JlYXNlIGFzIHRpbWUgZ29lcyBvbi4gIFRoZSBvdGhlciB0d28gZ3JhcGhzLCAibj0yXig1KSIgYW5kICJuPTJeKDEyKSIgaGF2ZSBhbiBvdmVyYWxsIG5lZ2F0aXZlIHRyYWplY3RvcnkuICAKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAxQikgV3JpdGUgdGhlIG1hdGhlbWF0aWNhbCBlcXVhdGlvbiByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBhbG9uZyB0aGUgeS1heGlzIGluIHRoZSBhYm92ZSBwbG90LiBTZXBhcmF0ZWx5IGV4cHJlc3Mgd2hhdCB0aGUgdmFsdWUgb2YgZWFjaCB2YXJpYWJsZSBpbiB0aGUgZXF1YXRpb24gaXMuCjwvc3Bhbj4KCiRYKHQpID0gWCh0LTEpICsgXGFscGhhIFxmcmFje1R9e259ICsgXHNpZ21hIFx2YXJlcHNpbG9uX3t0fSBcc3FydHtcZnJhY3tUfXtufX0kCgpUaGUgeS1heGlzLCAkWCh0KSQsIHJlcHJlc2VudHMgdGhlIHJhbmRvbSB3YWxrIHRoYXQgYXJpdGhtZXRpYyBicm93bmlhbiBtb3Rpb24gZm9sbG93cy4KCnQgPSB0aW1lIHBlcmlvZAokXGFscGhhJCA9IGNvbnN0YW50IGRyaWZ0IHJhdGUKVCA9IHRvdGFsIHRpbWUgCm4gPSBudW1iZXIgb2YgdGltZSBwZXJpb2RzCiRcc2lnbWEkID0gdmFyaWFuY2UgCiRcdmFyZXBzaWxvbl97dH0kID0gcmVwcmVzZW50cyB3aGl0ZSBub2lzZS4gIEl0IGlzIGEgcmFuZG9tbHkgZ2VuZXJhdGVkIG51bWJlciB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIHdpdGggYSBtZWFuIG9mIDAgYW5kIGEgdmFyaWFuY2Ugb2YgMS4KCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAxQykgRm9sbG93IGV4YW1wbGUgaW4gYm9vayB0byBzaW11bGF0ZSBhIGdlb21ldHJpYyBCcm93bmlhbiBtb3Rpb24uIAo8L3NwYW4+CmBgYHtyfQpyZXF1aXJlKHNkZSkKbXU9MC4xNjsgc2lnbWE9MC4yOyBQMD00MDsgVD0xLzEyCm50PTUwOyBuPTJeKDgpCmR0PVQvbjsgdD1zZXEoMCxULGJ5PWR0KQpYPW1hdHJpeChyZXAoMCxsZW5ndGgodCkqbnQpLCBucm93PW50KQpmb3IgKGkgaW4gMTpudCkge1hbaSxdPSBHQk0oeD1QMCwgcj1tdSwgc2lnbWE9c2lnbWEsIFQ9VCwgTj1uKX0KeW1heD1tYXgoWCk7IHltaW49bWluKFgpCnBsb3QodCwgWFsxLF0sIHR5cGU9J2wnLCB5bGltPWMoeW1pbix5bWF4KSwgY29sPTEsIHlsYWI9InByaWNlIFAodCkiLCB4bGFiPSAidGltZSB0IikKZm9yIChpIGluIDI6bnQpIHtsaW5lcyh0LCBYW2ksXSwgdHlwZT0nbCcsIHlsaW09Yyh5bWluLCB5bWF4KSwgY29sPWkpfQoKYGBgCgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDFEKSBXcml0ZSB0aGUgbWF0aGVtYXRpY2FsIGVxdWF0aW9uIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzIGFsb25nIHRoZSB5LWF4aXMgaW4gdGhlIGFib3ZlIHBsb3QuIFNlcGFyYXRlbHkgZXhwcmVzcyB3aGF0IHRoZSB2YWx1ZSBvZiBlYWNoIHZhcmlhYmxlIGluIHRoZSBlcXVhdGlvbiBpcy4KPC9zcGFuPgoKJFBfe1R9ID0gUF97b30gZSBeIHsgXG11IC0gXGZyYWN7XHNpZ21hXnsyfX17Mn0gKyBcc2lnbWEgXHZhcmVwc2lsb25fe3R9IFxzcXJ0e1xEZWx0YSB0fX0kIAoKVGhlIHktYXhpcyBpcyAkUF97VH0kIGFuZCBpdCByZXByZXNlbnRzIHRoZSBwcmljZSBvZiB0aGUgc3RvY2sgYXQgdGltZSBULiAgVGhlIGdyYXBoIGZyb20gIzFDIGhhcyA1MCBkaWZmZXJlbnQgcGF0aHdheXMgb2YgdGhlIHNhbWUgZXF1YXRpb24gYW5kIHRoZSB1cHBib3VuZCBwcmljZSBwb2ludCBpcyAkNDcuMjUuClRoZSBsb3dlciBib3VuZCBwcmljZSBwb2ludCBpcyAkMzUuOTYKCgokUF97b30kID0gSW5pdGlhbCBwcmljZSBvZiB0aGUgc3RvY2sKVCA9IHRvdGFsIHRpbWUgCiRcbXUkID0gbWVhbiwgb3IgZXhwZWN0ZWQgcmV0cnVuIGZvciB0aGUgeWVhcgokXHNpZ21hXnsyfSQgPSB2YXJpYW5jZSBmb3IgdGhlIHllYXIKJFx2YXJlcHNpbG9uX3t0fSQgPSByZXByZXNlbnRzIHdoaXRlIG5vaXNlLiAgSXQgaXMgYSByYW5kb21seSBnZW5lcmF0ZWQgbnVtYmVyIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgd2l0aCBhIG1lYW4gb2YgMCBhbmQgYSB2YXJpYW5jZSBvZiAxLgoKCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMUUpIEhvdyBpcyB0aGUgZ2VvbWV0cmljIEJyb3duaWFuIHNpbXVsYXRpb24gZGlmZmVyZW50IGZyb20gdGhlIGFyaXRobWV0aWMgc2ltdWxhdGlvbj8gRWxhYm9yYXRlLgo8L3NwYW4+ClRoZSBhcml0aG1ldHJpYyBCcm93bmlhbSBtb3Rpb24gc2ltdWxhdGlvbiBpcyBtb2RlbGVkIGFzIHRoZSBzdW0gb2YgcmFuZG9tIHRlcm1zIHdoZXJlYXMgdGhlIGdlb21ldHJpYyBCb3duaWFtIG1vdGlvbiBzaW11bGF0aW9uIGlzIHRoZSBwcm9kdWN0IG9mIHJhbmRvbSBmYWN0b3JzLiAKVGhlIGFyaXRobWV0cmljIEJyb3duaWFuIG1vdGlvbiBjYXJyaWVzIHByb2JsZW1zIGJlY2FzdWUgcHJpY2VzIGNhbm50IGJlIG5lZ2F0aXZlLiAgSW4gb3JkZXIgdG8gZml4IHRoaXMsIHdlIHRha2UgdGhlIGxvZyBvZiB0aGUgdGhlIGRpc2NyZXRlIFNERSBmb3JtdWxhIHRvIGdhdXJlbnRlZSBubyBuZWdhdGl2ZSB2YWx1ZXMuICAKCgojIyMgVGFzayAyOiBPcHRpb24gUHJpY2luZywgR3JlZWtzLCBhbmQgTnVtZXJpY2FsIERpZmZlcmVudGlhdGlvbgoKRm9sbG93cyB0aGUgZXhhbXBsZSBpbiB0aGUgYm9vayAgYFIgRXhhbXBsZSA1LjMvcCAxNTYgYCBhbmQgYFIgRXhhbXBsZSA1LjUvcCAxNTdgCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMkEpIENhbGN1bGF0ZSB0aGUgQ2FsbCBhbmQgUHV0IHByaWNlIG9mIHRoZSBnaXZlbiBFdXJvcGVhbiBPcHRpb24uICBFeHBsYWluIHdoYXQgdGhlIHZhcmlhYmxlcyBgcmAgYW5kIGBiYCBpbiB0aGUgZnVuY3Rpb24gY2FsbCBgR0JTT3B0aW9uYCByZXByZXNlbnQuICAgIAo8L3NwYW4+CgpgYGB7cn0KcmVxdWlyZShmT3B0aW9ucykKR0JTT3B0aW9uKFR5cGVGbGFnID0gImMiLCBTID0gNjAsIFggPSA2NSwgVGltZSA9IDEvNCwgciA9IDAuMDgsIGIgPSAwLjA4LCBzaWdtYSA9IDAuMzApCgpgYGAKYGBge3J9CnJlcXVpcmUoZk9wdGlvbnMpCkdCU09wdGlvbihUeXBlRmxhZyA9ICJwIiwgUyA9IDYwLCBYID0gNjUsIFRpbWUgPSAxLzQsIHIgPSAwLjA4LCBiID0gMC4wOCwgc2lnbWEgPSAwLjMwKQpgYGAKSW4gdGhlIEdCU09wdGlvbiBmdW5jdGlvbiwgdGhlIHZhcmlhYmxlICJyIiByZXByZXNlbnRzIHRoZSBhbm51YWxpemVkIHJhdGUgb2YgaW50ZXJlc3QgYW5kIHRoZSB2YXJpYWJsZSAiYiIgcmVwcmVzZW50cyB0aGUgYW5udWFsaXplZCBjb3N0IG9mIGNhcnJ5IHJhdGUgCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMkIpIENhbGN1bGF0ZSB0aGUgcGFydGljdWxhciBHcmVla3MgRGVsdGEsIEdhbW1hLCBhbmQgVmVnYSBmb3IgdGhlIGFib3ZlIGNvcnJlc3BvbmRpbmcgQ2FsbCBvcHRpb24uCjwvc3Bhbj4KCmBgYHtyfQpyZXF1aXJlKGZPcHRpb25zKQpHQlNDaGFyYWN0ZXJpc3RpY3MoVHlwZUZsYWcgPSAiYyIsIFMgPSA2MCwgWCA9IDY1LCBUaW1lID0gMS80LCByID0gMC4wOCwgYiA9IDAuMDgsIHNpZ21hID0gMC4zMCkKCmBgYAoKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAyQykgQ2FsY3VsYXRlIHRoZSBEZWx0YSwgR2FtbWEsIGFuZCBWZWdhIGZvciBzYW1lIG9wdGlvbiB1c2luZyBpbnN0ZWFkIG51bWVyaWNhbCBkaWZmZXJlbnRpYXRpb24uIFdyaXRlIHRoZSBtYXRoZW1hdGljYWwgZXF1YXRpb25zIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBudW1lcmljYWwgZGlmZmVyZW50aWF0aW9uLgo8L3NwYW4+CgokXERlbHRhID0gXHBoaSAqIChcZnJhY3tsbihQX3t0fS9rKSArIChyICsgXHNpZ21hXnsyfS8yKShULXQpfXtcc2lnbWEgXHNxcnR7VC10fX0pJAoKJFxHYW1tYSA9IFxmcmFje1xwaGkgKiAoXGZyYWN7bG4oUF97dH0vaykgKyAociArIFxzaWdtYV57Mn0vMikoVC10KX17XHNpZ21hIFxzcXJ0e1QtdH19KX0ge1Bcc2lnbWEgXHNxcnR7VC10fX0kCgokdiA9IFAgXHNxcnR7VC10fSAqIFxwaGkgKiAoXGZyYWN7bG4oUF97dH0vaykgKyAociArIFxzaWdtYV57Mn0vMikoVC10KX17XHNpZ21hIFxzcXJ0e1QtdH19KSQKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAyRCkgQ29tcGFyZSByZXN1bHRzIGZyb20gMkIgYW5kIDJDLiBTaGFyZSBvYnNlcnZhdGlvbnMuClRoZXJlIGlzIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiAyQiBhbmQgMkMgY2FsY3VsYXRpb25zLiAKCipbaHR0cDovL2NvbXB1dGF0aW9uYWxmaW5hbmNlLmxzaS51cGMuZWR1IF0oaHR0cDovL2NvbXB1dGF0aW9uYWxmaW5hbmNlLmxzaS51cGMuZWR1KQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiAKClRyeSBleGVjdXRpbmcgdGhpcyBjaHVuayBieSBjbGlja2luZyB0aGUgKlJ1biogYnV0dG9uIHdpdGhpbiB0aGUgY2h1bmsgb3IgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbnNpZGUgaXQgYW5kIHByZXNzaW5nICpDbWQrU2hpZnQrRW50ZXIqLiAKCmBgYHtyfQpwbG90KGNhcnMpCmBgYAoKQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkNtZCtPcHRpb24rSSouCgpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkNtZCtTaGlmdCtLKiB0byBwcmV2aWV3IHRoZSBIVE1MIGZpbGUpLiAKClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4KCg==