About

This assignment is an extra credit opportunity worth 10 points. The goal is to demonstrate your understanding of the topic in the different areas of problem statement through a flowchart diagram propely marked, the analytics through a clear representation of the mathematical equations, the coding through the clear and properly commented execution steps, and finally results evaluation through the assessment of quality and integrity.

The topic of interest is the pricing of an Asian option. Asian options are a form of exotic options unlike the more vanilla European options. The case considered here is a special type of Asian options where the payoff is given by the average price of the underline asset over some predetermined period until expiration time. Other variations of Asian options (outside our scope) are possible and left for the reader’s investigation. The case in point is described on p.169 . Note that Asian options are characterized as path dependent options. By this we mean that the payoff of the option is dependent on the intermediate values of the underline asset along the path. In contrast a European option is path independent because the payoff depends only on the final value of the underline asset, and not on the intermediate or historical values. The case of American options is slightly tricky. Because of the early exercise opportunity one may be inclined to view American options as path dependendent. However at any exercise point the payoff is only dependent on the current asset price and not historical. As such it is not really path dependent.

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!

Any sign of plagiarism, will result in dissmissal of work!


#Install package quantmod 
if(!require("quantmod",quietly = TRUE))
  install.packages("quantmod",dependencies = TRUE, repos = "https://cloud.r-project.org")

Question 1 : Flowchart Diagram (2pts)

Inspired by the flowchart diagram of the MC simulation for European option, create an equivalent flowchart diagram for the considered case of Asian option. Describe the variables, label clearly, and write the discrete mathematical representation to be coded later. You can create the flowchart using a separate tool and include an image capture here. A hand drawn image is acceptable only if well executed.

black. black. ### Question 2: MC Simulation (2pts)

Implement the R-code for the MC simulation to price an Asian Call option with input characteristics similar to the European Call option considered in Lab 6, task 2B.

AsianMC <- function(Type ="c",S=155,K=140,T=1/2,r=0.025,sigma=0.23,n=1000,m=1000){
  sum=0;
  dt=T/n;
  Snew=0
  for(i in 1:m){ #simulated paths
    Asum=0; #contains sum of option prices in the path
    Sold=S;
    for(j in 1:n) { # for all periods in each simulated path
      Asum = Asum+Snew; # adds previous option price to sum
      E=rnorm(1,0,1); # random variable
             Snew=Sold+r*Sold*dt+sigma*Sold*sqrt(dt)*E; #  
      Sold=Snew;}
    if (Type == "c") {payoff=max((1/n)*Asum-K,0)}
    else if (Type == "p"){payoff=max(K-(1/n)*Asum,0)}
    else {payoff=max((1/n)*Asum-K,0)}# default is call
    sum=sum+payoff}
  OptionValue=(sum*exp(-r*T))/m;
  return(OptionValue)
}
AsianMC(Type="c",S=155,K=140,T=1/2,r=0.025,sigma=0.23,n=1000,m=1000)
[1] 16.71047

Question 3: Function Calculation (2pts)

For this question the below package is needed. Follow the example at bottom of p.171 to price the same Asian Call option using instead the approximate function referenced in the example. Compare to the MC simulation.

#Install required package  
if(!require("fExoticOptions",quietly = TRUE))
  install.packages("fExoticOptions",dependencies = TRUE, repos = "https://cloud.r-project.org")
library("fExoticOptions")
TW=TurnbullWakemanAsianApproxOption(TypeFlag = "c",S=155,SA=155,X=140,Time=1/2,time=1/2,tau=0,r=0.025,b=0.025,sigma=0.23)
print(TW)

Title:
 Turnbull Wakeman Asian Approximated Option 

Call:
 TurnbullWakemanAsianApproxOption(TypeFlag = "c", S = 155, SA = 155, 
     X = 140, Time = 1/2, time = 1/2, tau = 0, r = 0.025, b = 0.025, 
     sigma = 0.23)

Parameters:
          Value:
 TypeFlag c     
 S        155   
 SA       155   
 X        140   
 Time     0.5   
 time     0.5   
 tau      0     
 r        0.025 
 b        0.025 
 sigma    0.23  

Option Price:
 16.63123 

Description:
 Fri Feb  8 15:06:02 2019 

With similar parameters, the option prices are similar. The MC simulation resulted in a value of 16.71047 while the Turnbull Wakeman resulted in 16.63123. This is to be expected because although they are different approaches, the end result is still expected to be in a reasonable range.

Question 4: Greeks Calculation (2pts)

Calculating the Greeks for the Asian Option is not as straightforward using the approximate function. Instead we can approximate using numerical differentiation. Describe how would you implement a numerical differentiation to calculate the Delta. Show the code execution and the intermediate values to calculate the Delta and the Theta for the considered Asian Call option.

The Delta is the change in the option price with respect to the change in the underlying stock price. The Theta is the change in the option price with respect to the change in time. By calculating 10 option prices, varying the stock price from 101 to 110, calculating the incremental changes and taking a final average, this can determine Delta. Theta can be computed by averaging the change in 12 samples, varying time from 1/12 to 1. This value is multiplied by 12 to scale to the length of one year.

DeltaCalc = vector(mode="double",length=10)
for(k in 101:110){
DeltaCalc[k-100]=AsianMC(Type="c",S=k,K=100,T=1/2,r=0.025,sigma=0.23,n=1000,m=10000)}
ThetaCalc = vector(mode="double",length=12)
for(k in 1:12){
  ThetaCalc[k] =      AsianMC(Type="c",S=100,K=100,T=k/12,r=.025,sigma=.23,n=1000,m=10000)}
print(ThetaCalc)
 [1] 1.603752 2.242880 2.919543 3.192918 3.619327
 [6] 3.915535 4.446727 4.740621 5.063970 5.190066
[11] 5.569918 5.891507
ThetaAverage = vector(mode = "double", length = 11)
for(j in 11:1){
  ThetaAverage[j] = ThetaCalc[j+1] - ThetaCalc[j]
}
mean(ThetaAverage) * 12
[1] 4.67755

Question 5: Evaluation of Results (2pts)

Explain how the price of the Asian Call option compares to the equivalent European Call option. Is it an expected behavior? What about the Delta comparison? Poorly stated insights will receive poor grade!

GBSGreeks(Selection="delta",TypeFlag="c",S=100,X=100,T=1/2,r=.025,b=.025,sigma=.23)
[1] 0.5628412
#### Euler MC to calculate price of European Option (p 157)
EulerMC <- function(Type ="c",S=155,K=140,T=1/2,r=0.025,sigma=0.23,n=1000,m=1000){
  sum=0;
  dt=T/n;
  mu = r - sigma^2/2; 
#  print(m);
#  print(S);
  for(i in 1:m){ #simulated paths
    Sold=S
    for(j in 1:n) { # for all periods in each simulated path
      E=rnorm(1,0,1);
             Snew=Sold+r*Sold*dt+sigma*Sold*sqrt(dt)*E; #  discrete version
      Sold=Snew;}
    if (Type == "c") {payoff=max(Snew-K,0)}
    else if (Type == "p"){payoff=max(K-Snew,0)}
    else {payoff=max(Snew-K,0)}# default is call
    sum=sum+payoff}
  OptionValue=(sum*exp(-r*T))/m;
  return(OptionValue)}
EulerMC(Type="c",S=155,K=140,T=1/2,r=0.025,sigma=0.23,n=1000,m=1000)
[1] 19.31355

Using the same parameters and number of samples, the price of the Asian Call option is 16.71 while the European Call option is 19.31. Since the Asian price is based on an average while the European is based on the spot price,it is expected to be smaller in most cases. With a larger amount of samples and path lengths used, there will be less volatility in the average than there is in the spot price. With less risk involved and a smaller variance in returns, this results in the Asian option pricing being smaller. The delta for the Asian option was calculated as 0.7353257 while the European option has 0.5628412. This shows that the Asian option is more sensitive to changes in the underlying price of the stock, because the overall history of the path is used in calculating the option price. Since the option price of each path is based on an average, every intermediate value is important in calculating the price and the final value of each price rolls up into the final average of all paths. With the European option, only the final value of each path is considered, and the evolution of price throughout the path is not used in the calculations. *http://computationalfinance.lsi.upc.edu

LS0tCnRpdGxlOiAiRklOQzYyMSBXaW50ZXIgMjAxOC0xOSBFeHRyYSBDcmVkaXQgKDEwcHRzKSIKYXV0aG9yOiAiRGVpb24gRm9zdGVyIgpkYXRlOiAiMi84LzIwMTkiCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdApzdWJ0aXRsZTogQXNpYW4gT3B0aW9uIFByaWNpbmcgJiBNQyBTaW11bGF0aW9uCi0tLQoKIyMjIEFib3V0CgpUaGlzIGFzc2lnbm1lbnQgaXMgYW4gZXh0cmEgY3JlZGl0IG9wcG9ydHVuaXR5IHdvcnRoIDEwIHBvaW50cy4gIFRoZSBnb2FsIGlzIHRvIGRlbW9uc3RyYXRlIHlvdXIgdW5kZXJzdGFuZGluZyBvZiB0aGUgdG9waWMgaW4gdGhlIGRpZmZlcmVudCBhcmVhcyBvZiBwcm9ibGVtIHN0YXRlbWVudCB0aHJvdWdoIGEgZmxvd2NoYXJ0IGRpYWdyYW0gcHJvcGVseSBtYXJrZWQsIHRoZSBhbmFseXRpY3MgdGhyb3VnaCBhIGNsZWFyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtYXRoZW1hdGljYWwgZXF1YXRpb25zLCB0aGUgY29kaW5nIHRocm91Z2ggdGhlIGNsZWFyIGFuZCBwcm9wZXJseSBjb21tZW50ZWQgZXhlY3V0aW9uIHN0ZXBzLCBhbmQgZmluYWxseSByZXN1bHRzIGV2YWx1YXRpb24gdGhyb3VnaCB0aGUgYXNzZXNzbWVudCBvZiBxdWFsaXR5IGFuZCBpbnRlZ3JpdHkuIAoKVGhlIHRvcGljIG9mIGludGVyZXN0IGlzIHRoZSBwcmljaW5nIG9mIGFuIEFzaWFuIG9wdGlvbi4gQXNpYW4gb3B0aW9ucyBhcmUgYSBmb3JtIG9mIGV4b3RpYyBvcHRpb25zIHVubGlrZSB0aGUgbW9yZSB2YW5pbGxhIEV1cm9wZWFuIG9wdGlvbnMuICBUaGUgY2FzZSBjb25zaWRlcmVkIGhlcmUgaXMgYSBzcGVjaWFsIHR5cGUgb2YgQXNpYW4gb3B0aW9ucyB3aGVyZSB0aGUgcGF5b2ZmIGlzIGdpdmVuIGJ5IHRoZSBhdmVyYWdlIHByaWNlIG9mIHRoZSB1bmRlcmxpbmUgYXNzZXQgb3ZlciBzb21lIHByZWRldGVybWluZWQgcGVyaW9kIHVudGlsIGV4cGlyYXRpb24gdGltZS4gT3RoZXIgdmFyaWF0aW9ucyBvZiBBc2lhbiBvcHRpb25zIChvdXRzaWRlIG91ciBzY29wZSkgYXJlIHBvc3NpYmxlIGFuZCBsZWZ0IGZvciB0aGUgcmVhZGVyJ3MgaW52ZXN0aWdhdGlvbi4gVGhlIGNhc2UgaW4gcG9pbnQgaXMgZGVzY3JpYmVkIG9uIHAuMTY5IC4gIE5vdGUgdGhhdCBBc2lhbiBvcHRpb25zIGFyZSBjaGFyYWN0ZXJpemVkIGFzIHBhdGggZGVwZW5kZW50IG9wdGlvbnMuICBCeSB0aGlzIHdlIG1lYW4gdGhhdCB0aGUgcGF5b2ZmIG9mIHRoZSBvcHRpb24gaXMgZGVwZW5kZW50IG9uIHRoZSBpbnRlcm1lZGlhdGUgdmFsdWVzIG9mIHRoZSB1bmRlcmxpbmUgYXNzZXQgYWxvbmcgdGhlIHBhdGguICBJbiBjb250cmFzdCBhIEV1cm9wZWFuIG9wdGlvbiBpcyBwYXRoIGluZGVwZW5kZW50IGJlY2F1c2UgdGhlIHBheW9mZiBkZXBlbmRzIG9ubHkgb24gdGhlIGZpbmFsIHZhbHVlIG9mIHRoZSB1bmRlcmxpbmUgYXNzZXQsIGFuZCBub3Qgb24gdGhlIGludGVybWVkaWF0ZSBvciBoaXN0b3JpY2FsIHZhbHVlcy4gVGhlIGNhc2Ugb2YgQW1lcmljYW4gb3B0aW9ucyBpcyBzbGlnaHRseSB0cmlja3kuIEJlY2F1c2Ugb2YgdGhlIGVhcmx5IGV4ZXJjaXNlIG9wcG9ydHVuaXR5IG9uZSBtYXkgYmUgaW5jbGluZWQgdG8gdmlldyBBbWVyaWNhbiBvcHRpb25zIGFzIHBhdGggZGVwZW5kZW5kZW50LiBIb3dldmVyIGF0IGFueSBleGVyY2lzZSBwb2ludCB0aGUgcGF5b2ZmIGlzIG9ubHkgZGVwZW5kZW50IG9uIHRoZSBjdXJyZW50IGFzc2V0IHByaWNlIGFuZCBub3QgaGlzdG9yaWNhbC4gIEFzIHN1Y2ggaXQgaXMgbm90IHJlYWxseSBwYXRoIGRlcGVuZGVudC4KCiMjIyBTZXR1cAoKUmVtZW1iZXIgdG8gYWx3YXlzIHNldCB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbi4gR28gdG8gJ1Nlc3Npb24nLCBzY3JvbGwgZG93biB0byAnU2V0IFdvcmtpbmcgRGlyZWN0b3J5JywgYW5kIGNsaWNrICdUbyBTb3VyY2UgRmlsZSBMb2NhdGlvbicuIFJlYWQgY2FyZWZ1bGx5IHRoZSBiZWxvdyBhbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgdG8gY29tcGxldGUgdGhlIHRhc2tzIGFuZCBhbnN3ZXIgYW55IHF1ZXN0aW9ucy4gIFN1Ym1pdCB5b3VyIHdvcmsgdG8gUlB1YnMgYXMgZGV0YWlsZWQgaW4gcHJldmlvdXMgbm90ZXMuIAoKIyMjIE5vdGUKCkFsd2F5cyByZWFkIGNhcmVmdWxseSB0aGUgaW5zdHJ1Y3Rpb25zIG9uIFNha2FpLiAgRm9yIGNsYXJpdHksIHRhc2tzL3F1ZXN0aW9ucyB0byBiZSBjb21wbGV0ZWQvYW5zd2VyZWQgYXJlIGhpZ2hsaWdodGVkIGluIHJlZCBjb2xvciAodmlzaWJsZSBpbiBwcmV2aWV3KSBhbmQgbnVtYmVyZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHBhcnRpY3VsYXIgcGxhY2VtZW50IGluIHRoZSB0YXNrIHNlY3Rpb24uICBRdWl0ZSBvZnRlbiB5b3Ugd2lsbCBuZWVkIHRvIGFkZCB5b3VyIG93biBjb2RlIGNodW5rLgoKRXhlY3V0ZSBhbGwgY29kZSBjaHVua3MsIHByZXZpZXcsIHB1Ymxpc2gsIGFuZCBzdWJtaXQgbGluayBvbiBTYWthaSBmb2xsd29pbmcgdGhlIG5hbWluZyBjb252ZW50aW9uLiBNYWtlIHN1cmUgdG8gYWRkIGNvbW1lbnRzIHRvIHlvdXIgY29kZSB3aGVyZSBhcHByb3ByaWF0ZS4gVXNlIG93biBsYW5ndWFnZSEKCioqQW55IHNpZ24gb2YgcGxhZ2lhcmlzbSwgd2lsbCByZXN1bHQgaW4gZGlzc21pc3NhbCBvZiB3b3JrISoqCgotLS0tLS0tLS0tLS0tLQpgYGB7cn0KI0luc3RhbGwgcGFja2FnZSBxdWFudG1vZCAKaWYoIXJlcXVpcmUoInF1YW50bW9kIixxdWlldGx5ID0gVFJVRSkpCiAgaW5zdGFsbC5wYWNrYWdlcygicXVhbnRtb2QiLGRlcGVuZGVuY2llcyA9IFRSVUUsIHJlcG9zID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpCmBgYAoKIyMjIFF1ZXN0aW9uIDEgOiBGbG93Y2hhcnQgRGlhZ3JhbSAoMnB0cykKCkluc3BpcmVkIGJ5IHRoZSBmbG93Y2hhcnQgZGlhZ3JhbSBvZiB0aGUgTUMgc2ltdWxhdGlvbiBmb3IgRXVyb3BlYW4gb3B0aW9uLCBjcmVhdGUgYW4gZXF1aXZhbGVudCBmbG93Y2hhcnQgZGlhZ3JhbSBmb3IgdGhlIGNvbnNpZGVyZWQgY2FzZSBvZiBBc2lhbiBvcHRpb24uIERlc2NyaWJlIHRoZSB2YXJpYWJsZXMsIGxhYmVsIGNsZWFybHksICBhbmQgd3JpdGUgdGhlIGRpc2NyZXRlIG1hdGhlbWF0aWNhbCByZXByZXNlbnRhdGlvbiB0byBiZSBjb2RlZCBsYXRlci4gWW91IGNhbiBjcmVhdGUgdGhlIGZsb3djaGFydCB1c2luZyBhIHNlcGFyYXRlIHRvb2wgYW5kIGluY2x1ZGUgYW4gaW1hZ2UgY2FwdHVyZSBoZXJlLiAgQSBoYW5kIGRyYXduIGltYWdlIGlzIGFjY2VwdGFibGUgb25seSBpZiB3ZWxsIGV4ZWN1dGVkLgoKIVtibGFjay5dKC9Vc2Vycy9kZWlvbmZvc3Rlci9Eb3dubG9hZHMvRmxvd0NoYXJ0cy5wbmcpCiFbYmxhY2suXSgvVXNlcnMvZGVpb25mb3N0ZXIvRG93bmxvYWRzL0FGb3JtdWxhLnBuZykKIyMjIFF1ZXN0aW9uIDI6IE1DIFNpbXVsYXRpb24gKDJwdHMpCgpJbXBsZW1lbnQgdGhlIFItY29kZSBmb3IgdGhlIE1DIHNpbXVsYXRpb24gdG8gcHJpY2UgYW4gQXNpYW4gQ2FsbCBvcHRpb24gd2l0aCBpbnB1dCBjaGFyYWN0ZXJpc3RpY3Mgc2ltaWxhciB0byB0aGUgRXVyb3BlYW4gQ2FsbCBvcHRpb24gY29uc2lkZXJlZCBpbiBMYWIgNiwgdGFzayAyQi4KCmBgYHtyfQpBc2lhbk1DIDwtIGZ1bmN0aW9uKFR5cGUgPSJjIixTPTE1NSxLPTE0MCxUPTEvMixyPTAuMDI1LHNpZ21hPTAuMjMsbj0xMDAwLG09MTAwMCl7CiAgc3VtPTA7CiAgZHQ9VC9uOwogIFNuZXc9MAogIGZvcihpIGluIDE6bSl7ICNzaW11bGF0ZWQgcGF0aHMKICAgIEFzdW09MDsgI2NvbnRhaW5zIHN1bSBvZiBvcHRpb24gcHJpY2VzIGluIHRoZSBwYXRoCiAgICBTb2xkPVM7CiAgICBmb3IoaiBpbiAxOm4pIHsgIyBmb3IgYWxsIHBlcmlvZHMgaW4gZWFjaCBzaW11bGF0ZWQgcGF0aAogICAgICBBc3VtID0gQXN1bStTbmV3OyAjIGFkZHMgcHJldmlvdXMgb3B0aW9uIHByaWNlIHRvIHN1bQogICAgICBFPXJub3JtKDEsMCwxKTsgIyByYW5kb20gdmFyaWFibGUKICAgICAgICAgICAgIFNuZXc9U29sZCtyKlNvbGQqZHQrc2lnbWEqU29sZCpzcXJ0KGR0KSpFOyAjICAKICAgICAgU29sZD1TbmV3O30KICAgIGlmIChUeXBlID09ICJjIikge3BheW9mZj1tYXgoKDEvbikqQXN1bS1LLDApfQogICAgZWxzZSBpZiAoVHlwZSA9PSAicCIpe3BheW9mZj1tYXgoSy0oMS9uKSpBc3VtLDApfQogICAgZWxzZSB7cGF5b2ZmPW1heCgoMS9uKSpBc3VtLUssMCl9IyBkZWZhdWx0IGlzIGNhbGwKICAgIHN1bT1zdW0rcGF5b2ZmfQogIE9wdGlvblZhbHVlPShzdW0qZXhwKC1yKlQpKS9tOwogIHJldHVybihPcHRpb25WYWx1ZSkKfQpgYGAKYGBge3J9CkFzaWFuTUMoVHlwZT0iYyIsUz0xNTUsSz0xNDAsVD0xLzIscj0wLjAyNSxzaWdtYT0wLjIzLG49MTAwMCxtPTEwMDApCmBgYAoKIyMjIFF1ZXN0aW9uIDM6ICBGdW5jdGlvbiBDYWxjdWxhdGlvbiAoMnB0cykKCkZvciB0aGlzIHF1ZXN0aW9uIHRoZSBiZWxvdyBwYWNrYWdlIGlzIG5lZWRlZC4gRm9sbG93IHRoZSBleGFtcGxlIGF0IGJvdHRvbSBvZiBwLjE3MSB0byBwcmljZSB0aGUgc2FtZSBBc2lhbiBDYWxsIG9wdGlvbiB1c2luZyBpbnN0ZWFkIHRoZSBhcHByb3hpbWF0ZSBmdW5jdGlvbiByZWZlcmVuY2VkIGluIHRoZSBleGFtcGxlLiBDb21wYXJlIHRvIHRoZSBNQyBzaW11bGF0aW9uLgoKYGBge3J9CiNJbnN0YWxsIHJlcXVpcmVkIHBhY2thZ2UgIAppZighcmVxdWlyZSgiZkV4b3RpY09wdGlvbnMiLHF1aWV0bHkgPSBUUlVFKSkKICBpbnN0YWxsLnBhY2thZ2VzKCJmRXhvdGljT3B0aW9ucyIsZGVwZW5kZW5jaWVzID0gVFJVRSwgcmVwb3MgPSAiaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnIikKYGBgCmBgYHtyfQpsaWJyYXJ5KCJmRXhvdGljT3B0aW9ucyIpClRXPVR1cm5idWxsV2FrZW1hbkFzaWFuQXBwcm94T3B0aW9uKFR5cGVGbGFnID0gImMiLFM9MTU1LFNBPTE1NSxYPTE0MCxUaW1lPTEvMix0aW1lPTEvMix0YXU9MCxyPTAuMDI1LGI9MC4wMjUsc2lnbWE9MC4yMykKcHJpbnQoVFcpCmBgYAo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+CldpdGggc2ltaWxhciBwYXJhbWV0ZXJzLCB0aGUgb3B0aW9uIHByaWNlcyBhcmUgc2ltaWxhci4gVGhlIE1DIHNpbXVsYXRpb24gcmVzdWx0ZWQgaW4gYSB2YWx1ZSBvZiAxNi43MTA0NyB3aGlsZSB0aGUgVHVybmJ1bGwgV2FrZW1hbiByZXN1bHRlZCBpbiAxNi42MzEyMy4gVGhpcyBpcyB0byBiZSBleHBlY3RlZCBiZWNhdXNlIGFsdGhvdWdoIHRoZXkgYXJlIGRpZmZlcmVudCBhcHByb2FjaGVzLCB0aGUgZW5kIHJlc3VsdCBpcyBzdGlsbCBleHBlY3RlZCB0byBiZSBpbiBhIHJlYXNvbmFibGUgcmFuZ2UuCjwvc3Bhbj4KCiMjIyBRdWVzdGlvbiA0OiBHcmVla3MgQ2FsY3VsYXRpb24gKDJwdHMpCgpDYWxjdWxhdGluZyB0aGUgR3JlZWtzIGZvciB0aGUgQXNpYW4gT3B0aW9uIGlzIG5vdCBhcyBzdHJhaWdodGZvcndhcmQgdXNpbmcgdGhlIGFwcHJveGltYXRlIGZ1bmN0aW9uLiAgSW5zdGVhZCB3ZSBjYW4gYXBwcm94aW1hdGUgdXNpbmcgbnVtZXJpY2FsIGRpZmZlcmVudGlhdGlvbi4gIERlc2NyaWJlIGhvdyB3b3VsZCB5b3UgaW1wbGVtZW50IGEgbnVtZXJpY2FsIGRpZmZlcmVudGlhdGlvbiB0byBjYWxjdWxhdGUgdGhlIERlbHRhLiAgU2hvdyB0aGUgY29kZSBleGVjdXRpb24gYW5kIHRoZSBpbnRlcm1lZGlhdGUgdmFsdWVzIHRvIGNhbGN1bGF0ZSB0aGUgRGVsdGEgYW5kIHRoZSBUaGV0YSBmb3IgdGhlIGNvbnNpZGVyZWQgQXNpYW4gQ2FsbCBvcHRpb24uCgo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+ClRoZSBEZWx0YSBpcyB0aGUgY2hhbmdlIGluIHRoZSBvcHRpb24gcHJpY2Ugd2l0aCByZXNwZWN0IHRvIHRoZSBjaGFuZ2UgaW4gdGhlIHVuZGVybHlpbmcgc3RvY2sgcHJpY2UuIFRoZSBUaGV0YSBpcyB0aGUgY2hhbmdlIGluIHRoZSBvcHRpb24gcHJpY2Ugd2l0aCByZXNwZWN0IHRvIHRoZSBjaGFuZ2UgaW4gdGltZS4gQnkgY2FsY3VsYXRpbmcgMTAgb3B0aW9uIHByaWNlcywgdmFyeWluZyB0aGUgc3RvY2sgcHJpY2UgZnJvbSAxMDEgdG8gMTEwLCBjYWxjdWxhdGluZyB0aGUgaW5jcmVtZW50YWwgY2hhbmdlcyBhbmQgdGFraW5nIGEgZmluYWwgYXZlcmFnZSwgdGhpcyBjYW4gZGV0ZXJtaW5lIERlbHRhLiBUaGV0YSBjYW4gYmUgY29tcHV0ZWQgYnkgYXZlcmFnaW5nIHRoZSBjaGFuZ2UgaW4gMTIgc2FtcGxlcywgdmFyeWluZyB0aW1lIGZyb20gMS8xMiB0byAxLiBUaGlzIHZhbHVlIGlzIG11bHRpcGxpZWQgYnkgMTIgdG8gc2NhbGUgdG8gdGhlIGxlbmd0aCBvZiBvbmUgeWVhci4KPC9zcGFuPgoKYGBge3J9CkRlbHRhQ2FsYyA9IHZlY3Rvcihtb2RlPSJkb3VibGUiLGxlbmd0aD0xMCkKZm9yKGsgaW4gMTAxOjExMCl7CkRlbHRhQ2FsY1trLTEwMF09QXNpYW5NQyhUeXBlPSJjIixTPWssSz0xMDAsVD0xLzIscj0wLjAyNSxzaWdtYT0wLjIzLG49MTAwMCxtPTEwMDAwKX0KcHJpbnQoRGVsdGFDYWxjKQpEZWx0YUF2ZXJhZ2UgPSB2ZWN0b3IobW9kZSA9ICJkb3VibGUiLCBsZW5ndGggPSA5KQpmb3IoaiBpbiAxOjkpewogIERlbHRhQXZlcmFnZVtqXSA9IERlbHRhQ2FsY1tqKzFdIC0gRGVsdGFDYWxjW2pdCn0KbWVhbihEZWx0YUF2ZXJhZ2UpCmBgYApgYGB7cn0KVGhldGFDYWxjID0gdmVjdG9yKG1vZGU9ImRvdWJsZSIsbGVuZ3RoPTEyKQpmb3IoayBpbiAxOjEyKXsKICBUaGV0YUNhbGNba10gPSAgICAgIEFzaWFuTUMoVHlwZT0iYyIsUz0xMDAsSz0xMDAsVD1rLzEyLHI9LjAyNSxzaWdtYT0uMjMsbj0xMDAwLG09MTAwMDApfQpwcmludChUaGV0YUNhbGMpClRoZXRhQXZlcmFnZSA9IHZlY3Rvcihtb2RlID0gImRvdWJsZSIsIGxlbmd0aCA9IDExKQpmb3IoaiBpbiAxMToxKXsKICBUaGV0YUF2ZXJhZ2Vbal0gPSBUaGV0YUNhbGNbaisxXSAtIFRoZXRhQ2FsY1tqXQp9Cm1lYW4oVGhldGFBdmVyYWdlKSAqIDEyCmBgYAoKCgoKIyMjIFF1ZXN0aW9uIDU6IEV2YWx1YXRpb24gb2YgUmVzdWx0cyAoMnB0cykKCkV4cGxhaW4gaG93IHRoZSBwcmljZSBvZiB0aGUgQXNpYW4gQ2FsbCBvcHRpb24gY29tcGFyZXMgdG8gdGhlIGVxdWl2YWxlbnQgRXVyb3BlYW4gQ2FsbCBvcHRpb24uICBJcyBpdCBhbiBleHBlY3RlZCBiZWhhdmlvcj8gV2hhdCBhYm91dCB0aGUgRGVsdGEgY29tcGFyaXNvbj8gIFBvb3JseSBzdGF0ZWQgaW5zaWdodHMgd2lsbCByZWNlaXZlIHBvb3IgZ3JhZGUhCgpgYGB7cn0KR0JTR3JlZWtzKFNlbGVjdGlvbj0iZGVsdGEiLFR5cGVGbGFnPSJjIixTPTEwMCxYPTEwMCxUPTEvMixyPS4wMjUsYj0uMDI1LHNpZ21hPS4yMykKYGBgCmBgYHtyfQojIyMjIEV1bGVyIE1DIHRvIGNhbGN1bGF0ZSBwcmljZSBvZiBFdXJvcGVhbiBPcHRpb24gKHAgMTU3KQpFdWxlck1DIDwtIGZ1bmN0aW9uKFR5cGUgPSJjIixTPTE1NSxLPTE0MCxUPTEvMixyPTAuMDI1LHNpZ21hPTAuMjMsbj0xMDAwLG09MTAwMCl7CiAgc3VtPTA7CiAgZHQ9VC9uOwogIG11ID0gciAtIHNpZ21hXjIvMjsgCiMgIHByaW50KG0pOwojICBwcmludChTKTsKICBmb3IoaSBpbiAxOm0peyAjc2ltdWxhdGVkIHBhdGhzCiAgICBTb2xkPVMKICAgIGZvcihqIGluIDE6bikgeyAjIGZvciBhbGwgcGVyaW9kcyBpbiBlYWNoIHNpbXVsYXRlZCBwYXRoCiAgICAgIEU9cm5vcm0oMSwwLDEpOwogICAgICAgICAgICAgU25ldz1Tb2xkK3IqU29sZCpkdCtzaWdtYSpTb2xkKnNxcnQoZHQpKkU7ICMgIGRpc2NyZXRlIHZlcnNpb24KICAgICAgU29sZD1TbmV3O30KICAgIGlmIChUeXBlID09ICJjIikge3BheW9mZj1tYXgoU25ldy1LLDApfQogICAgZWxzZSBpZiAoVHlwZSA9PSAicCIpe3BheW9mZj1tYXgoSy1TbmV3LDApfQogICAgZWxzZSB7cGF5b2ZmPW1heChTbmV3LUssMCl9IyBkZWZhdWx0IGlzIGNhbGwKICAgIHN1bT1zdW0rcGF5b2ZmfQogIE9wdGlvblZhbHVlPShzdW0qZXhwKC1yKlQpKS9tOwogIHJldHVybihPcHRpb25WYWx1ZSl9CgpFdWxlck1DKFR5cGU9ImMiLFM9MTU1LEs9MTQwLFQ9MS8yLHI9MC4wMjUsc2lnbWE9MC4yMyxuPTEwMDAsbT0xMDAwKQpgYGAKPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPgpVc2luZyB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFuZCBudW1iZXIgb2Ygc2FtcGxlcywgdGhlIHByaWNlIG9mIHRoZSBBc2lhbiBDYWxsIG9wdGlvbiBpcyAxNi43MSB3aGlsZSB0aGUgRXVyb3BlYW4gQ2FsbCBvcHRpb24gaXMgMTkuMzEuIFNpbmNlIHRoZSBBc2lhbiBwcmljZSBpcyBiYXNlZCBvbiBhbiBhdmVyYWdlIHdoaWxlIHRoZSBFdXJvcGVhbiBpcyBiYXNlZCBvbiB0aGUgc3BvdCBwcmljZSxpdCBpcyBleHBlY3RlZCB0byBiZSBzbWFsbGVyIGluIG1vc3QgY2FzZXMuIFdpdGggYSBsYXJnZXIgYW1vdW50IG9mIHNhbXBsZXMgYW5kIHBhdGggbGVuZ3RocyB1c2VkLCB0aGVyZSB3aWxsIGJlIGxlc3Mgdm9sYXRpbGl0eSBpbiB0aGUgYXZlcmFnZSB0aGFuIHRoZXJlIGlzIGluIHRoZSBzcG90IHByaWNlLiBXaXRoIGxlc3MgcmlzayBpbnZvbHZlZCBhbmQgYSBzbWFsbGVyIHZhcmlhbmNlIGluIHJldHVybnMsIHRoaXMgcmVzdWx0cyBpbiB0aGUgQXNpYW4gb3B0aW9uIHByaWNpbmcgYmVpbmcgc21hbGxlci4KVGhlIGRlbHRhIGZvciB0aGUgQXNpYW4gb3B0aW9uIHdhcyBjYWxjdWxhdGVkIGFzIDAuNzM1MzI1NyB3aGlsZSB0aGUgRXVyb3BlYW4gb3B0aW9uIGhhcyAwLjU2Mjg0MTIuIFRoaXMgc2hvd3MgdGhhdCB0aGUgQXNpYW4gb3B0aW9uIGlzIG1vcmUgc2Vuc2l0aXZlIHRvIGNoYW5nZXMgaW4gdGhlIHVuZGVybHlpbmcgcHJpY2Ugb2YgdGhlIHN0b2NrLCBiZWNhdXNlIHRoZSBvdmVyYWxsIGhpc3Rvcnkgb2YgdGhlIHBhdGggaXMgdXNlZCBpbiBjYWxjdWxhdGluZyB0aGUgb3B0aW9uIHByaWNlLiBTaW5jZSB0aGUgb3B0aW9uIHByaWNlIG9mIGVhY2ggcGF0aCBpcyBiYXNlZCBvbiBhbiBhdmVyYWdlLCBldmVyeSBpbnRlcm1lZGlhdGUgdmFsdWUgaXMgaW1wb3J0YW50IGluIGNhbGN1bGF0aW5nIHRoZSBwcmljZSBhbmQgdGhlIGZpbmFsIHZhbHVlIG9mIGVhY2ggcHJpY2Ugcm9sbHMgdXAgaW50byB0aGUgZmluYWwgYXZlcmFnZSBvZiBhbGwgcGF0aHMuIFdpdGggdGhlIEV1cm9wZWFuIG9wdGlvbiwgb25seSB0aGUgZmluYWwgdmFsdWUgb2YgZWFjaCBwYXRoIGlzIGNvbnNpZGVyZWQsIGFuZCB0aGUgZXZvbHV0aW9uIG9mIHByaWNlIHRocm91Z2hvdXQgdGhlIHBhdGggaXMgbm90IHVzZWQgaW4gdGhlIGNhbGN1bGF0aW9ucy4KPC9zcGFuPgoqW2h0dHA6Ly9jb21wdXRhdGlvbmFsZmluYW5jZS5sc2kudXBjLmVkdSBdKGh0dHA6Ly9jb21wdXRhdGlvbmFsZmluYW5jZS5sc2kudXBjLmVkdSkK