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.

alpha = 0
sigma = 1
T = 1
n1 = 2^2
n2 = 2^5
n3=  2^12
X0 = 0.1
dt1 = T/n1
dt2 = T/n2
dt3 = T/n3
t1 = seq(0,T,by=dt1)
t2 = seq(0,T,by=dt2)
t3 = seq(0,T,by=dt3)
x = c(X0,alpha*dt1+sigma*sqrt(dt1)*rnorm(n1,mean=0,sd=1))
Xt = cumsum(x)
plot(t1,Xt,type='l',xlab="time")

x = c(X0,alpha*dt2+sigma*sqrt(dt2)*rnorm(n2,mean=0,sd=1))
Xt = cumsum(x)
plot(t2,Xt,type='l',xlab="time")

x = c(X0,alpha*dt3+sigma*sqrt(dt3)*rnorm(n3,mean=0,sd=1))
Xt = cumsum(x)
plot(t3,Xt,type='l',xlab="time")

As n increases, there are more data points and a better representation of the changes in price through time.

##### 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_{n} = \alpha * dt + \sigma*\sqrt(dt) * \epsilon_i\) $Xt_{n} = X_{t-1} + X_{n} $

X is a vector of n+1 values, the step size multiplied by a normally distributed random number. Xt is a vector of the cumulative sum of the values in the X matrix and is represented on the X axis as the current price for each point in time. Epsilon is a normally distributed random number with mean 0 and standard deviation 1.

##### 1C) Follow example in book to simulate a geometric Brownian motion.

library(sde)
mu= .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,],t='l',ylim=c(ymin,ymax),col=1, ylab="Price P(t)",xlab = "time t")
for (i in 2:nt){lines(t,X[i,], t ='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_0*exp{(\mu - \frac{\sigma^2}{2})T + \sigma\epsilon_t sqrt(\Delta*t)}\) \(P_0\) is the initial price, \(\mu\) is the expected rate of return, \(\sigma\) is the volatility, T is the length of time, \(\epsilon_t\) is a random N~(0,1)$

##### 1E) How is the geometric Brownian simulation different from the arithmetic simulation? Elaborate.

The geometric Brownian simulation uses log returns which prevent the negative values that the arithmetic simulatio has.

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.

library(fOptions)
#Call
GBSOption(TypeFlag = "c", S = 60, X = 65, Time = 1/4, r = 0.08, b = 0.08, sigma = 0.30)
#Put
GBSOption(TypeFlag = "p", S = 60, X = 65, Time = 1/4, r = 0.08, b = 0.08, sigma = 0.30)

r is the risk free interest rate and b is the cost of carrying rate. In the Black Scholes model, b = r.

##### 2B) Calculate the particular Greeks Delta, Gamma, and Vega for the above corresponding Call option. test

library(fOptions)
GBSGreeks(Selection = "delta",TypeFlag="c",S=60,X=65,Time=1/4,r=0.08,b=0.08,sigma=0.3)
[1] 0.3724829
GBSGreeks(Selection = "gamma",TypeFlag="c",S=60,X=65,Time=1/4,r=0.08,b=0.08,sigma=0.3)
[1] 0.04204276
GBSGreeks(Selection = "vega",TypeFlag="c",S=60,X=65,Time=1/4,r=0.08,b=0.08,sigma=0.3)
[1] 11.35154

##### 2C) Calculate the Delta, Gamma, and Vega for same option using instead numerical differentiation. Write the mathematical equations corresponding to each numerical differentiation.

\(D_1 = \frac{ln(\frac{S}X) + t(r - q + \frac{\sigma^2}2))} {\sigma\sqrt(t)}\) \(D_1 = \frac{ln(\frac{60}65) + .25(.08 - 0 + \frac{.3^2}2))} {.3\sqrt(.25)} = -.32528\)

Gamma = (e^(-qt))/(S0Sigmasqrt(t)) * 1/(sqrt(2pi) * e((-d1/2)2) Gamma = (e0)/(60.3sqrt(.25))1/(sqrt(2pi))e((-(-.32528/2))^2) = .045515 Vega = 1/100 * S0e^(-qt) sqrt(t) * 1/(sqrt(2pi)) * e((-d1/2)2) Vega – 1/10060e^0 * sqrt(.25) * 1/(sqrt(2pi)) * e((-(-.32528/2))2) = 15.0402 Delta = e^(-qt)1/(sigmasqrt(2pi))*e(((-d1-mu)2)/(2sigma^2)) Delta = e^0 * 1/(.3sqrt(2pi))e^((-(-.32528-0))/(2.32))2 = .12289

##### 2D) Compare results from 2B and 2C. Share observations.

When comparing the numerical differentiation values to the R calculated values, Gamma was fairly close, Delta was lower and Vega was higher.

*http://computationalfinance.lsi.upc.edu

LS0tCnRpdGxlOiAiRklOQzYyMSBXaW50ZXIgMjAxOC0xOSBMYWIgV29ya3NoZWV0IDA0IgphdXRob3I6ICJEZWlvbiBGb3N0ZXIiCmRhdGU6ICIxMi8xMi8yMDE4IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKc3VidGl0bGU6IFN0b2NoYXN0aWMgTW9kZWxpbmcgJiBOdW1lcmljYWwgRGlmZmVyZW50aWF0aW9uIChmaW5jNjIxLWxhYjA0KQotLS0KCiMjIyBBYm91dAoKVGhpcyB3b3Jrc2hlZXQgbG9va3MgYXQgc2ltdWxhdGluZywgYm90aCBhcml0aG1ldGljcyBhbmQgZ2VvbWV0cmljLCBCcm93bmlhbiBtb3Rpb24gZm9yIHN0b2NrIHByaWNlcywgcHJpY2luZyBvcHRpb25zLCBhbmQgY2FsY3VsYXRpbmcgR3JlZWtzIHVzaW5nIG51bWVyaWNhbCBkaWZmZXJlbnRpYXRpb24uICAKCiMjIyBTZXR1cAoKUmVtZW1iZXIgdG8gYWx3YXlzIHNldCB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbi4gR28gdG8gJ1Nlc3Npb24nLCBzY3JvbGwgZG93biB0byAnU2V0IFdvcmtpbmcgRGlyZWN0b3J5JywgYW5kIGNsaWNrICdUbyBTb3VyY2UgRmlsZSBMb2NhdGlvbicuIFJlYWQgY2FyZWZ1bGx5IHRoZSBiZWxvdyBhbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgdG8gY29tcGxldGUgdGhlIHRhc2tzIGFuZCBhbnN3ZXIgYW55IHF1ZXN0aW9ucy4gIFN1Ym1pdCB5b3VyIHdvcmsgdG8gUlB1YnMgYXMgZGV0YWlsZWQgaW4gcHJldmlvdXMgbm90ZXMuIAoKIyMjIE5vdGUKCkFsd2F5cyByZWFkIGNhcmVmdWxseSB0aGUgaW5zdHJ1Y3Rpb25zIG9uIFNha2FpLiAgRm9yIGNsYXJpdHksIHRhc2tzL3F1ZXN0aW9ucyB0byBiZSBjb21wbGV0ZWQvYW5zd2VyZWQgYXJlIGhpZ2hsaWdodGVkIGluIHJlZCBjb2xvciAodmlzaWJsZSBpbiBwcmV2aWV3KSBhbmQgbnVtYmVyZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHBhcnRpY3VsYXIgcGxhY2VtZW50IGluIHRoZSB0YXNrIHNlY3Rpb24uICBRdWl0ZSBvZnRlbiB5b3Ugd2lsbCBuZWVkIHRvIGFkZCB5b3VyIG93biBjb2RlIGNodW5rLgoKRXhlY3V0ZSBhbGwgY29kZSBjaHVua3MsIHByZXZpZXcsIHB1Ymxpc2gsIGFuZCBzdWJtaXQgbGluayBvbiBTYWthaSBmb2xsd29pbmcgdGhlIG5hbWluZyBjb252ZW50aW9uLiBNYWtlIHN1cmUgdG8gYWRkIGNvbW1lbnRzIHRvIHlvdXIgY29kZSB3aGVyZSBhcHByb3ByaWF0ZS4gVXNlIG93biBsYW5ndWFnZSEKCi0tLS0tLS0tLS0tLS0tCgojIyMgVGFzayAxOiBTaW11bGF0aW5nIEJyb3duaWFuIE1vdGlvbgoKVGhpcyB0YXNrIGZvbGxvd3MgdGhlIHR3byBleGFtcGxlcyBpbiB0aGUgYm9vayBgUiBFeGFtcGxlIDUuMS9wIDE0OGAgZm9yIHNpbXVsYXRpbmcgYW4gYXJpdGhtZXRpYyBCcm93bmlhbiBtb3Rpb24gYW5kIGBSIEV4YW1wbGUgNS4yL3AxNTJgIGZvciBzaW11bGF0aW5nIGEgZ2VvbWV0cmljIG1vdGlvbi4gVHdvIG5ldyBwYWNrYWdlcyB3aWxsIGJlIHJlcXVpcmVkIGZvciB0aGlzIHdvcmtzaGVldC4gIFRoZXkgYXJlIGluY2x1ZGVkIGluIHRoZSBjb2RlIGNodW5rIGJlbG93LgoKYGBge3J9CiNJbnN0YWxsIHBhY2thZ2UgcXVhbnRtb2QgCmlmKCFyZXF1aXJlKCJxdWFudG1vZCIscXVpZXRseSA9IFRSVUUpKQogIGluc3RhbGwucGFja2FnZXMoInF1YW50bW9kIixkZXBlbmRlbmNpZXMgPSBUUlVFLCByZXBvcyA9ICJodHRwczovL2Nsb3VkLnItcHJvamVjdC5vcmciKQpgYGAKCmBgYHtyfQojSW5zdGFsbCBwYWNrYWdlIHNkZSBmb3IgU3RvY2hhc3RpYyBEaWZmZXJlbnRpYWwgRXF1YXRpb24KaWYoIXJlcXVpcmUoInNkZSIscXVpZXRseSA9IFRSVUUpKQogIGluc3RhbGwucGFja2FnZXMoInNkZSIsZGVwZW5kZW5jaWVzID0gVFJVRSwgcmVwb3MgPSAiaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnIikKYGBgCgpgYGB7cn0KI0luc3RhbGwgcGFja2FnZSBmT3B0aW9ucyBmb3IgcHJpY2luZyBhbmQgZXZhbHVhdGluZyBiYXNpYyBvcHRpb25zCmlmKCFyZXF1aXJlKCJmT3B0aW9ucyIscXVpZXRseSA9IFRSVUUpKQogIGluc3RhbGwucGFja2FnZXMoImZPcHRpb25zIixkZXBlbmRlbmNpZXMgPSBUUlVFLCByZXBvcyA9ICJodHRwczovL2Nsb3VkLnItcHJvamVjdC5vcmciKQpgYGAKCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMUEpIEZvbGxvdyBleGFtcGxlIGluIGJvb2sgdG8gc2ltdWxhdGUgYW5kIHBsb3QgZXhhbXBsZSBvZiBhbiBhcml0aG1ldGljIEJyb3duaWFuIG1vdGlvbi4gQ29uc2lkZXIgdGhyZWUgdmFsdWVzIGZvciBuIChudW1iZXIgb2YgcG9pbnRzKTogJDJeMiwgMl41LCAyXnsxMn0kLiBFeHBsYWluIGJlaGF2aW9yIGFzIG4gaW5jcmVhc2VzLgo8L3NwYW4+CgpgYGB7cn0KYWxwaGEgPSAwCnNpZ21hID0gMQpUID0gMQpuMSA9IDJeMgpuMiA9IDJeNQpuMz0gIDJeMTIKWDAgPSAwLjEKZHQxID0gVC9uMQpkdDIgPSBUL24yCmR0MyA9IFQvbjMKdDEgPSBzZXEoMCxULGJ5PWR0MSkKdDIgPSBzZXEoMCxULGJ5PWR0MikKdDMgPSBzZXEoMCxULGJ5PWR0MykKeCA9IGMoWDAsYWxwaGEqZHQxK3NpZ21hKnNxcnQoZHQxKSpybm9ybShuMSxtZWFuPTAsc2Q9MSkpClh0ID0gY3Vtc3VtKHgpCnBsb3QodDEsWHQsdHlwZT0nbCcseGxhYj0idGltZSIpCnggPSBjKFgwLGFscGhhKmR0MitzaWdtYSpzcXJ0KGR0Mikqcm5vcm0objIsbWVhbj0wLHNkPTEpKQpYdCA9IGN1bXN1bSh4KQpwbG90KHQyLFh0LHR5cGU9J2wnLHhsYWI9InRpbWUiKQp4ID0gYyhYMCxhbHBoYSpkdDMrc2lnbWEqc3FydChkdDMpKnJub3JtKG4zLG1lYW49MCxzZD0xKSkKWHQgPSBjdW1zdW0oeCkKcGxvdCh0MyxYdCx0eXBlPSdsJyx4bGFiPSJ0aW1lIikKYGBgCjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4KQXMgbiBpbmNyZWFzZXMsIHRoZXJlIGFyZSBtb3JlIGRhdGEgcG9pbnRzIGFuZCBhIGJldHRlciByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2hhbmdlcyBpbiBwcmljZSB0aHJvdWdoIHRpbWUuCjwvc3Bhbj4KCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAxQikgV3JpdGUgdGhlIG1hdGhlbWF0aWNhbCBlcXVhdGlvbiByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBhbG9uZyB0aGUgeS1heGlzIGluIHRoZSBhYm92ZSBwbG90LiBTZXBhcmF0ZWx5IGV4cHJlc3Mgd2hhdCB0aGUgdmFsdWUgb2YgZWFjaCB2YXJpYWJsZSBpbiB0aGUgZXF1YXRpb24gaXMuCjwvc3Bhbj4KCiRYX3tufSA9IFxhbHBoYSAqIGR0ICsgXHNpZ21hKlxzcXJ0KGR0KSAqICBcZXBzaWxvbl9pJAokWHRfe259ID0gWF97dC0xfSArIFhfe259ICQKCjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4KWCBpcyBhIHZlY3RvciBvZiBuKzEgdmFsdWVzLCB0aGUgc3RlcCBzaXplIG11bHRpcGxpZWQgYnkgYSBub3JtYWxseSBkaXN0cmlidXRlZCByYW5kb20gbnVtYmVyLiBYdCBpcyBhIHZlY3RvciBvZiB0aGUgY3VtdWxhdGl2ZSBzdW0gb2YgdGhlIHZhbHVlcyBpbiB0aGUgWCBtYXRyaXggYW5kIGlzIHJlcHJlc2VudGVkIG9uIHRoZSBYIGF4aXMgYXMgdGhlIGN1cnJlbnQgcHJpY2UgZm9yIGVhY2ggcG9pbnQgaW4gdGltZS4gRXBzaWxvbiBpcyBhIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIHJhbmRvbSBudW1iZXIgd2l0aCBtZWFuIDAgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiAxLgo8L3NwYW4+Cgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMUMpIEZvbGxvdyBleGFtcGxlIGluIGJvb2sgdG8gc2ltdWxhdGUgYSBnZW9tZXRyaWMgQnJvd25pYW4gbW90aW9uLiAKPC9zcGFuPgoKYGBge3J9CmxpYnJhcnkoc2RlKQptdT0gLjE2CnNpZ21hID0gMC4yClAwID0gNDAKVCA9IDEvMTIKbnQgPSA1MApuID0gMl44CmR0ID0gVC9uCnQgPSBzZXEoMCxULGJ5PWR0KQpYID0gbWF0cml4KHJlcCgwLGxlbmd0aCh0KSpudCksbnJvdz1udCkKZm9yIChpIGluIDE6bnQpIAogIHtYW2ksXSA9IEdCTSh4PVAwLHI9bXUsc2lnbWE9c2lnbWEsVD1ULE49bil9CnltYXg9bWF4KFgpCnltaW49bWluKFgpCnBsb3QodCxYWzEsXSx0PSdsJyx5bGltPWMoeW1pbix5bWF4KSxjb2w9MSwgeWxhYj0iUHJpY2UgUCh0KSIseGxhYiA9ICJ0aW1lIHQiKQpmb3IgKGkgaW4gMjpudCl7bGluZXModCxYW2ksXSwgdCA9J2wnLCB5bGltPWMoeW1pbix5bWF4KSxjb2w9aSl9CmBgYAoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDFEKSBXcml0ZSB0aGUgbWF0aGVtYXRpY2FsIGVxdWF0aW9uIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzIGFsb25nIHRoZSB5LWF4aXMgaW4gdGhlIGFib3ZlIHBsb3QuIFNlcGFyYXRlbHkgZXhwcmVzcyB3aGF0IHRoZSB2YWx1ZSBvZiBlYWNoIHZhcmlhYmxlIGluIHRoZSBlcXVhdGlvbiBpcy4KPC9zcGFuPgoKPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPgokUF9UID0gUF8wKmV4cHsoXG11IC0gXGZyYWN7XHNpZ21hXjJ9ezJ9KVQgKyBcc2lnbWFcZXBzaWxvbl90IHNxcnQoXERlbHRhKnQpfSQKPC9zcGFuPgo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+CiRQXzAkIGlzIHRoZSBpbml0aWFsIHByaWNlLCAkXG11JCBpcyB0aGUgZXhwZWN0ZWQgcmF0ZSBvZiByZXR1cm4sICRcc2lnbWEkIGlzIHRoZSB2b2xhdGlsaXR5LCBUIGlzIHRoZSBsZW5ndGggb2YgdGltZSwgJFxlcHNpbG9uX3QkIGlzIGEgcmFuZG9tIE5+KDAsMSkkCjwvc3Bhbj4KCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAxRSkgSG93IGlzIHRoZSBnZW9tZXRyaWMgQnJvd25pYW4gc2ltdWxhdGlvbiBkaWZmZXJlbnQgZnJvbSB0aGUgYXJpdGhtZXRpYyBzaW11bGF0aW9uPyBFbGFib3JhdGUuCjwvc3Bhbj4KCjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4KVGhlIGdlb21ldHJpYyBCcm93bmlhbiBzaW11bGF0aW9uIHVzZXMgbG9nIHJldHVybnMgd2hpY2ggcHJldmVudCB0aGUgbmVnYXRpdmUgdmFsdWVzIHRoYXQgdGhlIGFyaXRobWV0aWMgc2ltdWxhdGlvIGhhcy4KPC9zcGFuPgoKIyMjIFRhc2sgMjogT3B0aW9uIFByaWNpbmcsIEdyZWVrcywgYW5kIE51bWVyaWNhbCBEaWZmZXJlbnRpYXRpb24KCkZvbGxvd3MgdGhlIGV4YW1wbGUgaW4gdGhlIGJvb2sgIGBSIEV4YW1wbGUgNS4zL3AgMTU2IGAgYW5kIGBSIEV4YW1wbGUgNS41L3AgMTU3YAoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDJBKSBDYWxjdWxhdGUgdGhlIENhbGwgYW5kIFB1dCBwcmljZSBvZiB0aGUgZ2l2ZW4gRXVyb3BlYW4gT3B0aW9uLiAgRXhwbGFpbiB3aGF0IHRoZSB2YXJpYWJsZXMgYHJgIGFuZCBgYmAgaW4gdGhlIGZ1bmN0aW9uIGNhbGwgYEdCU09wdGlvbmAgcmVwcmVzZW50LiAgICAKPC9zcGFuPgoKYGBge3J9CmxpYnJhcnkoZk9wdGlvbnMpCiNDYWxsCkdCU09wdGlvbihUeXBlRmxhZyA9ICJjIiwgUyA9IDYwLCBYID0gNjUsIFRpbWUgPSAxLzQsIHIgPSAwLjA4LCBiID0gMC4wOCwgc2lnbWEgPSAwLjMwKQojUHV0CkdCU09wdGlvbihUeXBlRmxhZyA9ICJwIiwgUyA9IDYwLCBYID0gNjUsIFRpbWUgPSAxLzQsIHIgPSAwLjA4LCBiID0gMC4wOCwgc2lnbWEgPSAwLjMwKQpgYGAKPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPgpyIGlzIHRoZSByaXNrIGZyZWUgaW50ZXJlc3QgcmF0ZSBhbmQgYiBpcyB0aGUgY29zdCBvZiBjYXJyeWluZyByYXRlLiBJbiB0aGUgQmxhY2sgU2Nob2xlcyBtb2RlbCwgYiA9IHIuCjwvc3Bhbj4KCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAyQikgQ2FsY3VsYXRlIHRoZSBwYXJ0aWN1bGFyIEdyZWVrcyBEZWx0YSwgR2FtbWEsIGFuZCBWZWdhIGZvciB0aGUgYWJvdmUgY29ycmVzcG9uZGluZyBDYWxsIG9wdGlvbi4KPC9zcGFuPgohW3Rlc3RdKEdyZWVrcy5wbmcpCmBgYHtyfQpsaWJyYXJ5KGZPcHRpb25zKQpHQlNHcmVla3MoU2VsZWN0aW9uID0gImRlbHRhIixUeXBlRmxhZz0iYyIsUz02MCxYPTY1LFRpbWU9MS80LHI9MC4wOCxiPTAuMDgsc2lnbWE9MC4zKQpHQlNHcmVla3MoU2VsZWN0aW9uID0gImdhbW1hIixUeXBlRmxhZz0iYyIsUz02MCxYPTY1LFRpbWU9MS80LHI9MC4wOCxiPTAuMDgsc2lnbWE9MC4zKQpHQlNHcmVla3MoU2VsZWN0aW9uID0gInZlZ2EiLFR5cGVGbGFnPSJjIixTPTYwLFg9NjUsVGltZT0xLzQscj0wLjA4LGI9MC4wOCxzaWdtYT0wLjMpCmBgYAo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMkMpIENhbGN1bGF0ZSB0aGUgRGVsdGEsIEdhbW1hLCBhbmQgVmVnYSBmb3Igc2FtZSBvcHRpb24gdXNpbmcgaW5zdGVhZCBudW1lcmljYWwgZGlmZmVyZW50aWF0aW9uLiBXcml0ZSB0aGUgbWF0aGVtYXRpY2FsIGVxdWF0aW9ucyBjb3JyZXNwb25kaW5nIHRvIGVhY2ggbnVtZXJpY2FsIGRpZmZlcmVudGlhdGlvbi4KPC9zcGFuPgoKCiREXzEgPSBcZnJhY3tsbihcZnJhY3tTfVgpICsgdChyIC0gcSArIFxmcmFje1xzaWdtYV4yfTIpKX0ge1xzaWdtYVxzcXJ0KHQpfSQKJERfMSA9IFxmcmFje2xuKFxmcmFjezYwfTY1KSArIC4yNSguMDggLSAwICsgXGZyYWN7LjNeMn0yKSl9IHsuM1xzcXJ0KC4yNSl9ID0gLS4zMjUyOCQKCjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4KR2FtbWEgPSAoZV4oLXF0KSkvKFMwKlNpZ21hKnNxcnQodCkpICogMS8oc3FydCgycGkpICogZV4oKC1kMS8yKV4yKQo8L3NwYW4+CjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4KR2FtbWEgPSAoZV4wKS8oNjAqLjMqc3FydCguMjUpKSoxLyhzcXJ0KDJwaSkpKmVeKCgtKC0uMzI1MjgvMikpXjIpID0gLjA0NTUxNQo8L3NwYW4+CjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4KVmVnYSA9IDEvMTAwICogUzAqZV4oLXF0KSAqIHNxcnQodCkgKiAxLyhzcXJ0KDJwaSkpICogZV4oKC1kMS8yKV4yKQo8L3NwYW4+CjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4KVmVnYSDigJMgMS8xMDAqNjAqZV4wICogc3FydCguMjUpICogMS8oc3FydCgycGkpKSAqIGVeKCgtKC0uMzI1MjgvMikpXjIpID0gMTUuMDQwMgo8L3NwYW4+CjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4KRGVsdGEgPSBlXigtcXQpKjEvKHNpZ21hKnNxcnQoMnBpKSkqZV4oKCgtZDEtbXUpXjIpLygyc2lnbWFeMikpCjwvc3Bhbj4KPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPgpEZWx0YSA9IGVeMCAqIDEvKC4zc3FydCgycGkpKSplXigoLSgtLjMyNTI4LTApKS8oMiouM14yKSleMiA9IC4xMjI4OQo8L3NwYW4+Cgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMkQpIENvbXBhcmUgcmVzdWx0cyBmcm9tIDJCIGFuZCAyQy4gU2hhcmUgb2JzZXJ2YXRpb25zLgo8L3NwYW4+Cgo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+CldoZW4gY29tcGFyaW5nIHRoZSBudW1lcmljYWwgZGlmZmVyZW50aWF0aW9uIHZhbHVlcyB0byB0aGUgUiBjYWxjdWxhdGVkIHZhbHVlcywgR2FtbWEgd2FzIGZhaXJseSBjbG9zZSwgRGVsdGEgd2FzIGxvd2VyIGFuZCBWZWdhIHdhcyBoaWdoZXIuCjwvc3Bhbj4KCipbaHR0cDovL2NvbXB1dGF0aW9uYWxmaW5hbmNlLmxzaS51cGMuZWR1IF0oaHR0cDovL2NvbXB1dGF0aW9uYWxmaW5hbmNlLmxzaS51cGMuZWR1KQo=