Introduction
Alvin Tan created interesting Noteboook, which is partly
used in this presentation. The Investopedia information source
is also used. In addition, a Bookdown of Technical
Analysis with R (second edition) from Ko Chiu Yu and ChatGPT were
helpful with the coding in R.
Technical analysis is a method to predict price movement in the
financial markets. Unlike the usual balance sheet analysis (fundamental
investing), technical analysis estimates the value of a given stock
using underlying trends of the price movement. The core assumption
behind this method is that the fundamentals (information from financial
statements) were factored into the price fluctuation, hence, detecting
the patterns and signals from the fluctuation should provide sufficient
indicator for future performance.
For this project, we are going to explore some of the common
technical indicators using the TQQQ Exchange trade fund (ETF) stock.
Among leveraged ETFs, ProShares UltraPro QQQ (TQQQ) is one of the
largest with assets under management of \(\$18.56\) billion as of July 2022. TQQQ is
also one of the more heavily traded leveraged ETFs in the U.S. with an
average daily volume of \(\$5.29\)
billion (compared with QQQ’s \(\$21\)
billion).
TQQQ carries an expense
ratio of 0.95%.
#install.packages("quantmod")
#install.packages("data.table")
#install.packages("ggplot2")
#install.packages("tidyquant")
library(quantmod)
library(data.table)
library(ggplot2)
library(tidyquant)
structure of the stock data
stock <<- as.data.table(KO) ###### change TQQQ ticker to Your ticker symbol #########
names(stock)[1] <- c('Date')
tail(stock)
Interpretation of the HLCO graph
In finance, HLCO graph is a type of financial chart that plots the
high, low, close, and open prices for a given period of time. The HLCO
chart is similar to a candlestick chart, but it includes the open price
in addition to the high, low, and close prices.
The interpretation of an HLCO chart can provide insights into the
price action of a security during a given period of time. Here is a
brief explanation of how to interpret each component of an HLCO
chart:
High: The top of the vertical line represents the highest price
reached during the given period. This shows the highest price that
buyers were willing to pay for the security during the period.
Low: The bottom of the vertical line represents the lowest price
reached during the given period. This shows the lowest price that
sellers were willing to accept for the security during the
period.
Close: The horizontal line to the right of the vertical line
represents the closing price for the period. This shows the final price
at which the security traded during the period.
Open: The horizontal line to the left of the vertical line
represents the opening price for the period. This shows the initial
price at which the security traded during the period.
By looking at the patterns of the high, low, close, and open prices
in an HLCO chart, traders and investors can gain insight into the
overall trend and sentiment of the market for the given security. For
example, a long green candlestick with a high close and low open may
indicate bullish sentiment, while a long red candlestick with a low
close and high open may indicate bearish sentiment.
# feel free to change "HLCO" to "candlestick" or to some other types ("lines", "auto").
chartSeries(stock, subset='2020-01-01::2020-09-23', type = "candlesticks", bar.type = "ohlc",theme=chartTheme('white'))

Volume
One of the most common basic indicators traders examine is the
trading volume. Trading volume is an indication for the ‘activeness’ of
a financial instrument. Depending on the financial instruments, trading
volume can be measured either using the number of stocks traded or
number of contracts with changed ownerships. To put this in practice, if
an increase in volume is observed with a steady increase in price, the
instrument can be viewed as steady and strong. However, if volume and
price are changing in different directions, a reversal might be
happened.
You can analyze it in the previous picture.
Price - Moving Average
In terms of trading price, traders often observed the trends based on
the charts shape and cross in ways that form shapes - often times with
weird names like ‘head and shoulder’, ’ reverse head and sholder’,
‘double top’, ‘golden cross’, etc. A golden cross indicates a long term
bull market going forward, whereas the death cross is the exact
opposite, indicating a potential long term bear market. Both of these
refer to the confirmation of long term trend by the occurance of the
overlapping of moving average lines as shown below.
In the quantmod package in R, the addMA function can be used to add
moving averages to a financial time series chart. There are various
methods of calculating moving averages that can be used in this
function, which I will describe below:
Simple Moving Average (SMA): This is the most basic type of
moving average and is calculated by taking the average of a set number
of periods of data. For example, a 20-day SMA would be the average of
the closing prices for the last 20 days. This method gives equal weight
to all periods in the moving average. \[SMA_t
= \frac{P_t + \dots + P_{t-n+1}}{n}\] Buy signal arises
when a short-run SMA crosses from below to above a long-run SMA.
Sell signal arrises when a short-run SMA crosses from above to
below a long-run SMA.
Weighted Moving Average (WMA): This method assigns a weight to
each data point in the moving average, with more recent data points
given greater weight. The weights can be calculated in various ways,
such as linear or exponential.
Exponential Moving Average (EMA): This method is similar to the
WMA, but it gives greater weight to more recent data points using an
exponential decay formula. The formula used to calculate the EMA
involves a smoothing factor, which determines the weight given to each
data point. \[EMA_t = \beta P_t + (1-\beta)
EMA_{t-1}\] where the smoothing coefficient is usually defined
\(\beta = \frac{2}{n+1} \in
(0;1)\).
Double Exponential Moving Average (DEMA): This method is similar
to the EMA, but it uses a second EMA to smooth the first EMA. This
results in a smoother moving average that is less sensitive to
short-term fluctuations.
Triple Exponential Moving Average (TEMA): This method is similar
to the DEMA, but it uses a third EMA to further smooth the moving
average. This method is even less sensitive to short-term fluctuations
than the DEMA.
These are the main types of moving averages that can be used in the
addMA function in quantmod. Each method has its own advantages and
disadvantages, and the choice of method will depend on the specific
needs of the analysis being performed.
chartSeries(stock,
subset='2020-01-01::2020-09-23', type = "candlestick",
theme=chartTheme('white'))

addSMA(n = 12, on = 1, with.col = Cl, overlay = TRUE, col = "brown")

addSMA(n = 24, on = 1, with.col = Cl, overlay = TRUE, col = "blue")

NA
NA
in January 02 the trend was very high on the graph, in March 02 it
started to decrease dramatically, and then from May01 until September01
it shows a slow increase ## Moving Average Convergence Divergence
(MACD)
chartSeries(stock,
subset='2020-01-01::2020-09-23', type = "bars",
theme=chartTheme('white'))

addMACD(fast=12,slow=26,signal=9,type="EMA")

the chart shows a high trend from january 02 until march 02, then a
decrease from april 01. after that a continuous slow increase from
barley until september 23
LS0tCnRpdGxlOiAiVGVjaG5pY2FsIGFuYWx5c2lzIGluIFIiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiMjIEludHJvZHVjdGlvbgoKQWx2aW4gVGFuIGNyZWF0ZWQgaW50ZXJlc3RpbmcgW05vdGVib29va10oaHR0cDovL3JwdWJzLmNvbS96aGVzaHVlbi82NjU2MTYpLCB3aGljaCBpcyBwYXJ0bHkgdXNlZCBpbiB0aGlzIHByZXNlbnRhdGlvbi4gVGhlIFtJbnZlc3RvcGVkaWFdKGh0dHBzOi8vd3d3LmludmVzdG9wZWRpYS5jb20vKSBpbmZvcm1hdGlvbiBzb3VyY2UgaXMgYWxzbyB1c2VkLiBJbiBhZGRpdGlvbiwgYSBCb29rZG93biBvZiBbVGVjaG5pY2FsIEFuYWx5c2lzIHdpdGggUiAoc2Vjb25kIGVkaXRpb24pIGZyb20gS28gQ2hpdSBZdV0oaHR0cHM6Ly9ib29rZG93bi5vcmcva29jaGl1eXUvdGVjaG5pY2FsLWFuYWx5c2lzLXdpdGgtci1zZWNvbmQtZWRpdGlvbjIvKSAgYW5kIENoYXRHUFQgd2VyZSBoZWxwZnVsIHdpdGggdGhlIGNvZGluZyBpbiBSLgoKVGVjaG5pY2FsIGFuYWx5c2lzIGlzIGEgbWV0aG9kIHRvIHByZWRpY3QgcHJpY2UgbW92ZW1lbnQgaW4gdGhlIGZpbmFuY2lhbCBtYXJrZXRzLiBVbmxpa2UgdGhlIHVzdWFsIGJhbGFuY2Ugc2hlZXQgYW5hbHlzaXMgKGZ1bmRhbWVudGFsIGludmVzdGluZyksIHRlY2huaWNhbCBhbmFseXNpcyBlc3RpbWF0ZXMgdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gc3RvY2sgdXNpbmcgdW5kZXJseWluZyB0cmVuZHMgb2YgdGhlIHByaWNlIG1vdmVtZW50LiBUaGUgY29yZSBhc3N1bXB0aW9uIGJlaGluZCB0aGlzIG1ldGhvZCBpcyB0aGF0IHRoZSBmdW5kYW1lbnRhbHMgKGluZm9ybWF0aW9uIGZyb20gZmluYW5jaWFsIHN0YXRlbWVudHMpIHdlcmUgZmFjdG9yZWQgaW50byB0aGUgcHJpY2UgZmx1Y3R1YXRpb24sIGhlbmNlLCBkZXRlY3RpbmcgdGhlIHBhdHRlcm5zIGFuZCBzaWduYWxzIGZyb20gdGhlIGZsdWN0dWF0aW9uIHNob3VsZCBwcm92aWRlIHN1ZmZpY2llbnQgaW5kaWNhdG9yIGZvciBmdXR1cmUgcGVyZm9ybWFuY2UuCgpGb3IgdGhpcyBwcm9qZWN0LCB3ZSBhcmUgZ29pbmcgdG8gZXhwbG9yZSBzb21lIG9mIHRoZSBjb21tb24gdGVjaG5pY2FsIGluZGljYXRvcnMgdXNpbmcgdGhlIFRRUVEgRXhjaGFuZ2UgdHJhZGUgZnVuZCAoRVRGKSBzdG9jay4gQW1vbmcgbGV2ZXJhZ2VkIEVURnMsIFByb1NoYXJlcyBVbHRyYVBybyBRUVEgKFRRUVEpIGlzIG9uZSBvZiB0aGUgbGFyZ2VzdCB3aXRoIGFzc2V0cyB1bmRlciBtYW5hZ2VtZW50IG9mICRcJDE4LjU2JCBiaWxsaW9uIGFzIG9mIEp1bHkgMjAyMi4gVFFRUSBpcyBhbHNvIG9uZSBvZiB0aGUgbW9yZSBoZWF2aWx5IHRyYWRlZCBsZXZlcmFnZWQgRVRGcyBpbiB0aGUgVS5TLiB3aXRoIGFuIGF2ZXJhZ2UgZGFpbHkgdm9sdW1lIG9mICRcJDUuMjkkIGJpbGxpb24gKGNvbXBhcmVkIHdpdGggUVFRJ3MgJFwkMjEkIGJpbGxpb24pLgoKVFFRUSBjYXJyaWVzIGFuIFtleHBlbnNlIHJhdGlvXShodHRwczovL3d3dy5pbnZlc3RvcGVkaWEuY29tL3Rlcm1zL2UvZXhwZW5zZXJhdGlvLmFzcCkgb2YgMC45NSUuCgpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoInF1YW50bW9kIikKI2luc3RhbGwucGFja2FnZXMoImRhdGEudGFibGUiKQojaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpCiNpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5cXVhbnQiKQpsaWJyYXJ5KHF1YW50bW9kKQpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeSh0aWR5cXVhbnQpICAKYGBgCgojIyBEYXRhIEV4dHJhY3Rpb24gJiBNYW5pcHVsYXRpb24sIERhdGEgc3RydWN0dXJlCgpUUVFRIGRhdGEgaXMgZXh0cmFjdGVkIHVzaW5nIHRoZSBnZXRTeW1ib2xzIGZ1bmN0aW9uIGZyb20gWWFob28gRmluYW5jZS4gQWx0ZXJuYXRpdmVseSwgdGhlIHNvdXJjZSBjYW4gYmUgcmVwbGFjZWQgd2l0aCBGUkVELCBNeVNRTCwgR29vZ2xlLCBvciBvdGhlcnMuIFRoZSBkYXRhIGV4dHJhY3RlZCBzaG91bGQgYmUgaW4gYW4g4oCYeHRz4oCZIG9iamVjdCAtIGEgZm9ybWF0IGNvbW1vbmx5IHVzZWQgaW4gdGltZSBzZXJpZXMgYW5hbHlzaXMgd2hlcmUgb2JzZXJ2YXRpb25zIGFyZSByZWNvcmRlZCBpbiBhIG1hdHJpeCBzdHJ1Y3R1cmUgd2l0aCBhbiBpbmRleCBvZiBjb3JyZXNwb25kaW5nIHRpbWUuCgpUZWNobmljYWxseSwgYW5hbHlzaXMgY2FuIGJlIGRvbmUgaW4geHRzIGZvcm1hdCBhbG9uZSwgYnV0IGZvciB0aGUgc2FrZSBvZiBzaW1wbGljaXR5LCBkYXRhIGlzIGNvbnZlcnRlZCBpbnRvIGEgc3RhbmRhcmQgZGF0YWZyYW1lIGFuZCBpbmRleCBjb2x1bW4gaXMgcmVuYW1lZCBhcyAiRGF0ZeKAmS4gVGhlIGVuZCByZXN1bHQgaXMgc2hvd24gYXMgYmVsb3c6CgpgYGB7ciBkb3dubG9hZF9zdG9ja19oaXN0b3J5fQpnZXRTeW1ib2xzKCdLTycsc3JjID0gJ3lhaG9vJykgICAgICAgIyMgY2hhbmdlIFRRUVEgdGlja2VyIHRvIFlvdXIgdGlja2VyIHN5bWJvbApgYGAKCiMjIHN0cnVjdHVyZSBvZiB0aGUgKnN0b2NrKiBkYXRhCgpgYGB7cn0Kc3RvY2sgPDwtIGFzLmRhdGEudGFibGUoS08pICAgICAgICAjIyMjIyMgY2hhbmdlIFRRUVEgdGlja2VyIHRvIFlvdXIgdGlja2VyIHN5bWJvbCAgIyMjIyMjIyMjCm5hbWVzKHN0b2NrKVsxXSA8LSBjKCdEYXRlJykKCnRhaWwoc3RvY2spCmBgYAoKCiMjIEludGVycHJldGF0aW9uIG9mIHRoZSBITENPIGdyYXBoCgpJbiBmaW5hbmNlLCBITENPIGdyYXBoIGlzIGEgdHlwZSBvZiBmaW5hbmNpYWwgY2hhcnQgdGhhdCBwbG90cyB0aGUgaGlnaCwgbG93LCBjbG9zZSwgYW5kIG9wZW4gcHJpY2VzIGZvciBhIGdpdmVuIHBlcmlvZCBvZiB0aW1lLiBUaGUgSExDTyBjaGFydCBpcyBzaW1pbGFyIHRvIGEgY2FuZGxlc3RpY2sgY2hhcnQsIGJ1dCBpdCBpbmNsdWRlcyB0aGUgb3BlbiBwcmljZSBpbiBhZGRpdGlvbiB0byB0aGUgaGlnaCwgbG93LCBhbmQgY2xvc2UgcHJpY2VzLgoKVGhlIGludGVycHJldGF0aW9uIG9mIGFuIEhMQ08gY2hhcnQgY2FuIHByb3ZpZGUgaW5zaWdodHMgaW50byB0aGUgcHJpY2UgYWN0aW9uIG9mIGEgc2VjdXJpdHkgZHVyaW5nIGEgZ2l2ZW4gcGVyaW9kIG9mIHRpbWUuIEhlcmUgaXMgYSBicmllZiBleHBsYW5hdGlvbiBvZiBob3cgdG8gaW50ZXJwcmV0IGVhY2ggY29tcG9uZW50IG9mIGFuIEhMQ08gY2hhcnQ6CgoxLiBIaWdoOiBUaGUgdG9wIG9mIHRoZSB2ZXJ0aWNhbCBsaW5lIHJlcHJlc2VudHMgdGhlIGhpZ2hlc3QgcHJpY2UgcmVhY2hlZCBkdXJpbmcgdGhlIGdpdmVuIHBlcmlvZC4gVGhpcyBzaG93cyB0aGUgaGlnaGVzdCBwcmljZSB0aGF0IGJ1eWVycyB3ZXJlIHdpbGxpbmcgdG8gcGF5IGZvciB0aGUgc2VjdXJpdHkgZHVyaW5nIHRoZSBwZXJpb2QuCgoyLiBMb3c6IFRoZSBib3R0b20gb2YgdGhlIHZlcnRpY2FsIGxpbmUgcmVwcmVzZW50cyB0aGUgbG93ZXN0IHByaWNlIHJlYWNoZWQgZHVyaW5nIHRoZSBnaXZlbiBwZXJpb2QuIFRoaXMgc2hvd3MgdGhlIGxvd2VzdCBwcmljZSB0aGF0IHNlbGxlcnMgd2VyZSB3aWxsaW5nIHRvIGFjY2VwdCBmb3IgdGhlIHNlY3VyaXR5IGR1cmluZyB0aGUgcGVyaW9kLgoKMy4gQ2xvc2U6IFRoZSBob3Jpem9udGFsIGxpbmUgdG8gdGhlIHJpZ2h0IG9mIHRoZSB2ZXJ0aWNhbCBsaW5lIHJlcHJlc2VudHMgdGhlIGNsb3NpbmcgcHJpY2UgZm9yIHRoZSBwZXJpb2QuIFRoaXMgc2hvd3MgdGhlIGZpbmFsIHByaWNlIGF0IHdoaWNoIHRoZSBzZWN1cml0eSB0cmFkZWQgZHVyaW5nIHRoZSBwZXJpb2QuCgo0LiBPcGVuOiBUaGUgaG9yaXpvbnRhbCBsaW5lIHRvIHRoZSBsZWZ0IG9mIHRoZSB2ZXJ0aWNhbCBsaW5lIHJlcHJlc2VudHMgdGhlIG9wZW5pbmcgcHJpY2UgZm9yIHRoZSBwZXJpb2QuIFRoaXMgc2hvd3MgdGhlIGluaXRpYWwgcHJpY2UgYXQgd2hpY2ggdGhlIHNlY3VyaXR5IHRyYWRlZCBkdXJpbmcgdGhlIHBlcmlvZC4KCkJ5IGxvb2tpbmcgYXQgdGhlIHBhdHRlcm5zIG9mIHRoZSBoaWdoLCBsb3csIGNsb3NlLCBhbmQgb3BlbiBwcmljZXMgaW4gYW4gSExDTyBjaGFydCwgdHJhZGVycyBhbmQgaW52ZXN0b3JzIGNhbiBnYWluIGluc2lnaHQgaW50byB0aGUgb3ZlcmFsbCB0cmVuZCBhbmQgc2VudGltZW50IG9mIHRoZSBtYXJrZXQgZm9yIHRoZSBnaXZlbiBzZWN1cml0eS4gRm9yIGV4YW1wbGUsIGEgbG9uZyBncmVlbiBjYW5kbGVzdGljayB3aXRoIGEgaGlnaCBjbG9zZSBhbmQgbG93IG9wZW4gbWF5IGluZGljYXRlIGJ1bGxpc2ggc2VudGltZW50LCB3aGlsZSBhIGxvbmcgcmVkIGNhbmRsZXN0aWNrIHdpdGggYSBsb3cgY2xvc2UgYW5kIGhpZ2ggb3BlbiBtYXkgaW5kaWNhdGUgYmVhcmlzaCBzZW50aW1lbnQuCgpgYGB7cn0KIyBmZWVsIGZyZWUgdG8gY2hhbmdlICJITENPIiB0byAiY2FuZGxlc3RpY2siIG9yIHRvIHNvbWUgb3RoZXIgdHlwZXMgKCJsaW5lcyIsICJhdXRvIikuIApjaGFydFNlcmllcyhzdG9jaywgc3Vic2V0PScyMDIwLTAxLTAxOjoyMDIwLTA5LTIzJywgdHlwZSA9ICJjYW5kbGVzdGlja3MiLCBiYXIudHlwZSA9ICJvaGxjIix0aGVtZT1jaGFydFRoZW1lKCd3aGl0ZScpKQpgYGAKCgoKCiMjIFZvbHVtZSAKCk9uZSBvZiB0aGUgbW9zdCBjb21tb24gYmFzaWMgaW5kaWNhdG9ycyB0cmFkZXJzIGV4YW1pbmUgaXMgdGhlIHRyYWRpbmcgdm9sdW1lLiBUcmFkaW5nIHZvbHVtZSBpcyBhbiBpbmRpY2F0aW9uIGZvciB0aGUg4oCYYWN0aXZlbmVzc+KAmSBvZiBhIGZpbmFuY2lhbCBpbnN0cnVtZW50LiBEZXBlbmRpbmcgb24gdGhlIGZpbmFuY2lhbCBpbnN0cnVtZW50cywgdHJhZGluZyB2b2x1bWUgY2FuIGJlIG1lYXN1cmVkIGVpdGhlciB1c2luZyB0aGUgbnVtYmVyIG9mIHN0b2NrcyB0cmFkZWQgb3IgbnVtYmVyIG9mIGNvbnRyYWN0cyB3aXRoIGNoYW5nZWQgb3duZXJzaGlwcy4gVG8gcHV0IHRoaXMgaW4gcHJhY3RpY2UsIGlmIGFuIGluY3JlYXNlIGluIHZvbHVtZSBpcyBvYnNlcnZlZCB3aXRoIGEgc3RlYWR5IGluY3JlYXNlIGluIHByaWNlLCB0aGUgaW5zdHJ1bWVudCBjYW4gYmUgdmlld2VkIGFzIHN0ZWFkeSBhbmQgc3Ryb25nLiBIb3dldmVyLCBpZiB2b2x1bWUgYW5kIHByaWNlIGFyZSBjaGFuZ2luZyBpbiBkaWZmZXJlbnQgZGlyZWN0aW9ucywgYSByZXZlcnNhbCBtaWdodCBiZSBoYXBwZW5lZC4KCllvdSBjYW4gYW5hbHl6ZSBpdCBpbiB0aGUgcHJldmlvdXMgcGljdHVyZS4KCgojIyBQcmljZSAtIE1vdmluZyBBdmVyYWdlCgpJbiB0ZXJtcyBvZiB0cmFkaW5nIHByaWNlLCB0cmFkZXJzIG9mdGVuIG9ic2VydmVkIHRoZSB0cmVuZHMgYmFzZWQgb24gdGhlIGNoYXJ0cyBzaGFwZSBhbmQgY3Jvc3MgaW4gd2F5cyB0aGF0IGZvcm0gc2hhcGVzIC0gb2Z0ZW4gdGltZXMgd2l0aCB3ZWlyZCBuYW1lcyBsaWtlIOKAmGhlYWQgYW5kIHNob3VsZGVy4oCZLCDigJkgcmV2ZXJzZSBoZWFkIGFuZCBzaG9sZGVy4oCZLCDigJhkb3VibGUgdG9w4oCZLCDigJhnb2xkZW4gY3Jvc3PigJksIGV0Yy4gQSBnb2xkZW4gY3Jvc3MgaW5kaWNhdGVzIGEgbG9uZyB0ZXJtIGJ1bGwgbWFya2V0IGdvaW5nIGZvcndhcmQsIHdoZXJlYXMgdGhlIGRlYXRoIGNyb3NzIGlzIHRoZSBleGFjdCBvcHBvc2l0ZSwgaW5kaWNhdGluZyBhIHBvdGVudGlhbCBsb25nIHRlcm0gYmVhciBtYXJrZXQuIEJvdGggb2YgdGhlc2UgcmVmZXIgdG8gdGhlIGNvbmZpcm1hdGlvbiBvZiBsb25nIHRlcm0gdHJlbmQgYnkgdGhlIG9jY3VyYW5jZSBvZiB0aGUgb3ZlcmxhcHBpbmcgb2YgbW92aW5nIGF2ZXJhZ2UgbGluZXMgYXMgc2hvd24gYmVsb3cuCgpJbiB0aGUgcXVhbnRtb2QgcGFja2FnZSBpbiBSLCB0aGUgYWRkTUEgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gYWRkIG1vdmluZyBhdmVyYWdlcyB0byBhIGZpbmFuY2lhbCB0aW1lIHNlcmllcyBjaGFydC4gVGhlcmUgYXJlIHZhcmlvdXMgbWV0aG9kcyBvZiBjYWxjdWxhdGluZyBtb3ZpbmcgYXZlcmFnZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGlzIGZ1bmN0aW9uLCB3aGljaCBJIHdpbGwgZGVzY3JpYmUgYmVsb3c6CgoxLiBTaW1wbGUgTW92aW5nIEF2ZXJhZ2UgKFNNQSk6IFRoaXMgaXMgdGhlIG1vc3QgYmFzaWMgdHlwZSBvZiBtb3ZpbmcgYXZlcmFnZSBhbmQgaXMgY2FsY3VsYXRlZCBieSB0YWtpbmcgdGhlIGF2ZXJhZ2Ugb2YgYSBzZXQgbnVtYmVyIG9mIHBlcmlvZHMgb2YgZGF0YS4gRm9yIGV4YW1wbGUsIGEgMjAtZGF5IFNNQSB3b3VsZCBiZSB0aGUgYXZlcmFnZSBvZiB0aGUgY2xvc2luZyBwcmljZXMgZm9yIHRoZSBsYXN0IDIwIGRheXMuIFRoaXMgbWV0aG9kIGdpdmVzIGVxdWFsIHdlaWdodCB0byBhbGwgcGVyaW9kcyBpbiB0aGUgbW92aW5nIGF2ZXJhZ2UuCiAkJFNNQV90ID0gXGZyYWN7UF90ICsgXGRvdHMgKyBQX3t0LW4rMX19e259JCQKKkJ1eSBzaWduYWwqIGFyaXNlcyB3aGVuIGEgc2hvcnQtcnVuIFNNQSBjcm9zc2VzIGZyb20gYmVsb3cgdG8gYWJvdmUgYSBsb25nLXJ1biBTTUEuICpTZWxsIHNpZ25hbCogYXJyaXNlcyB3aGVuIGEgc2hvcnQtcnVuIFNNQSBjcm9zc2VzIGZyb20gYWJvdmUgdG8gYmVsb3cgYSBsb25nLXJ1biBTTUEuCgoyLiBXZWlnaHRlZCBNb3ZpbmcgQXZlcmFnZSAoV01BKTogVGhpcyBtZXRob2QgYXNzaWducyBhIHdlaWdodCB0byBlYWNoIGRhdGEgcG9pbnQgaW4gdGhlIG1vdmluZyBhdmVyYWdlLCB3aXRoIG1vcmUgcmVjZW50IGRhdGEgcG9pbnRzIGdpdmVuIGdyZWF0ZXIgd2VpZ2h0LiBUaGUgd2VpZ2h0cyBjYW4gYmUgY2FsY3VsYXRlZCBpbiB2YXJpb3VzIHdheXMsIHN1Y2ggYXMgbGluZWFyIG9yIGV4cG9uZW50aWFsLgoKMy4gRXhwb25lbnRpYWwgTW92aW5nIEF2ZXJhZ2UgKEVNQSk6IFRoaXMgbWV0aG9kIGlzIHNpbWlsYXIgdG8gdGhlIFdNQSwgYnV0IGl0IGdpdmVzIGdyZWF0ZXIgd2VpZ2h0IHRvIG1vcmUgcmVjZW50IGRhdGEgcG9pbnRzIHVzaW5nIGFuIGV4cG9uZW50aWFsIGRlY2F5IGZvcm11bGEuIFRoZSBmb3JtdWxhIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBFTUEgaW52b2x2ZXMgYSBzbW9vdGhpbmcgZmFjdG9yLCB3aGljaCBkZXRlcm1pbmVzIHRoZSB3ZWlnaHQgZ2l2ZW4gdG8gZWFjaCBkYXRhIHBvaW50LgokJEVNQV90ID0gXGJldGEgUF90ICsgKDEtXGJldGEpIEVNQV97dC0xfSQkCndoZXJlIHRoZSBzbW9vdGhpbmcgY29lZmZpY2llbnQgaXMgdXN1YWxseSBkZWZpbmVkICRcYmV0YSA9IFxmcmFjezJ9e24rMX0gXGluICgwOzEpJC4KCjQuIERvdWJsZSBFeHBvbmVudGlhbCBNb3ZpbmcgQXZlcmFnZSAoREVNQSk6IFRoaXMgbWV0aG9kIGlzIHNpbWlsYXIgdG8gdGhlIEVNQSwgYnV0IGl0IHVzZXMgYSBzZWNvbmQgRU1BIHRvIHNtb290aCB0aGUgZmlyc3QgRU1BLiBUaGlzIHJlc3VsdHMgaW4gYSBzbW9vdGhlciBtb3ZpbmcgYXZlcmFnZSB0aGF0IGlzIGxlc3Mgc2Vuc2l0aXZlIHRvIHNob3J0LXRlcm0gZmx1Y3R1YXRpb25zLgoKNS4gVHJpcGxlIEV4cG9uZW50aWFsIE1vdmluZyBBdmVyYWdlIChURU1BKTogVGhpcyBtZXRob2QgaXMgc2ltaWxhciB0byB0aGUgREVNQSwgYnV0IGl0IHVzZXMgYSB0aGlyZCBFTUEgdG8gZnVydGhlciBzbW9vdGggdGhlIG1vdmluZyBhdmVyYWdlLiBUaGlzIG1ldGhvZCBpcyBldmVuIGxlc3Mgc2Vuc2l0aXZlIHRvIHNob3J0LXRlcm0gZmx1Y3R1YXRpb25zIHRoYW4gdGhlIERFTUEuCgpUaGVzZSBhcmUgdGhlIG1haW4gdHlwZXMgb2YgbW92aW5nIGF2ZXJhZ2VzIHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlIGFkZE1BIGZ1bmN0aW9uIGluIHF1YW50bW9kLiBFYWNoIG1ldGhvZCBoYXMgaXRzIG93biBhZHZhbnRhZ2VzIGFuZCBkaXNhZHZhbnRhZ2VzLCBhbmQgdGhlIGNob2ljZSBvZiBtZXRob2Qgd2lsbCBkZXBlbmQgb24gdGhlIHNwZWNpZmljIG5lZWRzIG9mIHRoZSBhbmFseXNpcyBiZWluZyBwZXJmb3JtZWQuCgpgYGB7cn0KY2hhcnRTZXJpZXMoc3RvY2ssCiAgICAgICAgICAgIHN1YnNldD0nMjAyMC0wMS0wMTo6MjAyMC0wOS0yMycsIHR5cGUgPSAiY2FuZGxlc3RpY2siLAogICAgICAgICAgICB0aGVtZT1jaGFydFRoZW1lKCd3aGl0ZScpKQphZGRTTUEobiA9IDEyLCBvbiA9IDEsIHdpdGguY29sID0gQ2wsIG92ZXJsYXkgPSBUUlVFLCBjb2wgPSAiYnJvd24iKQphZGRTTUEobiA9IDI0LCBvbiA9IDEsIHdpdGguY29sID0gQ2wsIG92ZXJsYXkgPSBUUlVFLCBjb2wgPSAiYmx1ZSIpCgoKYGBgCmluIEphbnVhcnkgMDIgdGhlIHRyZW5kIHdhcyB2ZXJ5IGhpZ2ggb24gdGhlIGdyYXBoLCBpbiBNYXJjaCAwMiBpdCBzdGFydGVkIHRvIGRlY3JlYXNlIGRyYW1hdGljYWxseSwgYW5kIHRoZW4gZnJvbSBNYXkwMSB1bnRpbCBTZXB0ZW1iZXIwMSBpdCBzaG93cyBhIHNsb3cgaW5jcmVhc2UgCiMjIE1vdmluZyBBdmVyYWdlIENvbnZlcmdlbmNlIERpdmVyZ2VuY2UgKE1BQ0QpCgoKCgoKCgoKYGBge3J9CmNoYXJ0U2VyaWVzKHN0b2NrLAogICAgICAgICAgICBzdWJzZXQ9JzIwMjAtMDEtMDE6OjIwMjAtMDktMjMnLCB0eXBlID0gImJhcnMiLAogICAgICAgICAgICB0aGVtZT1jaGFydFRoZW1lKCd3aGl0ZScpKQphZGRNQUNEKGZhc3Q9MTIsc2xvdz0yNixzaWduYWw9OSx0eXBlPSJFTUEiKQoKYGBgCnRoZSBjaGFydCBzaG93cyBhIGhpZ2ggdHJlbmQgZnJvbSBqYW51YXJ5IDAyIHVudGlsIG1hcmNoIDAyLCB0aGVuIGEgZGVjcmVhc2UgZnJvbSBhcHJpbCAwMS4gYWZ0ZXIgdGhhdCBhIGNvbnRpbnVvdXMgc2xvdyBpbmNyZWFzZSBmcm9tIGJhcmxleSB1bnRpbCBzZXB0ZW1iZXIgMjMgCgogCg==