Introduction

The following document shows an analysis of the data associated with the coronavirus pandemic (Covid19).

The analysis is divided into two parts, the first comprises general graphs of the data and then a numerical simulation is performed using the logistic growth model (LGM) in order to forecast the possible total number of cases.

Data Repository by Johns Hopkins CSSE

Terms used

Recovery ratio

The proportion of people recovered from a specified disease among all individuals diagnosed with the disease over a certain period of time.

\[RecoveryRatio (RR) = \frac{Recovered}{Confirmed}\]

Case Fatality ratio

Case fatality rate, also called case fatality ratio, in epidemiology, the proportion of people who die from a specified disease among all individuals diagnosed with the disease over a certain period of time.

https://www.britannica.com/science/case-fatality-rate

\[Case Fatality Ratio (CFR) = \frac{Deaths}{Confirmed}\]

Logistic Growth Model (LGM)

Clark (2011) propose a new empirical model based on logistic growth models.

A nonlinear model formula including variables and parameters.

\[ProjectedCases = \frac{(K * t ^ n)}{(a + t ^ n)}\]

Where:

Cases = Projected Case
K = Carrying capacity
n = Hyperbolic exponent
a = Constant
t = Time

The best-fit nonlineal model is obtained by an iterative least-squared method.

The logistic growth model was used to determine the progression of the disease in certain countries.

There are certain countries that are included in this analysis and where the model was not used essentially because the model fails.

Projected - Confirmed Cases Ratio

Assuming that the total number of projected cases corresponds to the maximum number of cases that would occur in a given country, the projected - confirmed cases ratio is calculated using the following expression.

\[ProjectedConfirmedCases Ratio = 100 - (100 * \frac{(max(Projected Case) - max(Confirmed))}{ max(Projected Case)}\]

Global Case

Average Cases (Last three days)

Global Case Summary

Country Cases

China

Cruise Ship

The Americas

Mexico

United State (US)

Argentina

Brazil

Colombia

Chile

Venezuela

Europe

Italy

Spain

United Kingdom

France

Germany

Switzerland

Norway

Others

Japan

Korea, South

Iran

India

Russia

References

Source data: https://github.com/CSSEGISandData/COVID-19.git

Clark, A.J. (2011). “Decline Curve Analysis in Unconventional Resource Plays Using Logistic Growth Models.” M.S. Thesis, The University of Texas at Austin, August 2011.

LS0tCnRpdGxlOiAiQ292aWQtMTkgRGF0YSBMb2dpc3RpYyBHcm93dGggTW9kZWwgaW4gUiIKYXV0aG9yOiAiQW5kcmVzIFBFTkEgYW5kcmVzcGVuYUBnbWFpbC5jb20iCmRhdGU6IDE3IE1hcmNoIDIwMjAKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCi0tLQoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCmJvZHl7IC8qIE5vcm1hbCAgKi8KICAgICAgZm9udC1zaXplOiAxNnB4OwogIH0KdGQgeyAgLyogVGFibGUgICovCiAgZm9udC1zaXplOiAxNHB4Owp9CmgxLnRpdGxlIHsKICBmb250LXNpemU6IDM4cHg7CiAgY29sb3I6IERhcmtSZWQ7Cn0KaDEgeyAvKiBIZWFkZXIgMSAqLwogIGZvbnQtc2l6ZTogMjhweDsKICBjb2xvcjogQmx1ZTsKfQpoMiB7IC8qIEhlYWRlciAyICovCiAgICBmb250LXNpemU6IDI0cHg7CiAgY29sb3I6IERhcmtCbHVlOwp9CmgzIHsgLyogSGVhZGVyIDMgKi8KICBmb250LXNpemU6IDIwcHg7CiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgY29sb3I6IERhcmtCbHVlOwp9CmNvZGUucnsgLyogQ29kZSBibG9jayAqLwogICAgZm9udC1zaXplOiAxMnB4Owp9CnByZSB7IC8qIENvZGUgYmxvY2sgLSBkZXRlcm1pbmVzIGNvZGUgc3BhY2luZyBiZXR3ZWVuIGxpbmVzICovCiAgICBmb250LXNpemU6IDE0cHg7Cn0KPC9zdHlsZT4KCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnJtKGxpc3QgPSBscygpKQpsaWJyYXJ5KCJ0aWR5dmVyc2UiKQpsaWJyYXJ5KCJjb3dwbG90IikKbGlicmFyeSgibWlucGFjay5sbSIpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc2V0d2QoIn4vRG9jdW1lbnRzL0NPVklELTE5LW1hc3Rlci9kYXRhL0NPVklELTE5LW1hc3RlciAyMDIwLTAzLTE3IikKY292aWQxOSA8LSByZWFkX2NzdigiY3NzZV9jb3ZpZF8xOV9kYXRhL2Nzc2VfY292aWRfMTlfZGFpbHlfcmVwb3J0cy8wMy0xNi0yMDIwLmNzdiIpCgp0c2MgPC0gcmVhZF9jc3YoImNzc2VfY292aWRfMTlfZGF0YS9jc3NlX2NvdmlkXzE5X3RpbWVfc2VyaWVzL3RpbWVfc2VyaWVzXzE5LWNvdmlkLUNvbmZpcm1lZC5jc3YiKQoKdHNkIDwtIHJlYWRfY3N2KCJjc3NlX2NvdmlkXzE5X2RhdGEvY3NzZV9jb3ZpZF8xOV90aW1lX3Nlcmllcy90aW1lX3Nlcmllc18xOS1jb3ZpZC1EZWF0aHMuY3N2IikKCnRzciA8LSByZWFkX2NzdigiY3NzZV9jb3ZpZF8xOV9kYXRhL2Nzc2VfY292aWRfMTlfdGltZV9zZXJpZXMvdGltZV9zZXJpZXNfMTktY292aWQtUmVjb3ZlcmVkLmNzdiIpCmBgYAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KIycgQHRpdGxlIEEgd3JhbmdsX2NvdmlkMTkgZnVuY3Rpb24KIycgQHBhcmFtIGNvdmlkMTkgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcmV0dXJuIHdyYW5nbF9jb3ZpZDE5CiMnIEBleHBvcnQgd3JhbmdsX2NvdmlkMTkKIycgQGtleXdvcmRzIHdyYW5nbF9jb3ZpZDE5CiMnCndyYW5nbF9jb3ZpZDE5IDwtIGZ1bmN0aW9uKGNvdmlkMTkpIHsKY292aWQxOSAlPiUgCiAgcmVuYW1lKHN0YXRlID0gIlByb3ZpbmNlL1N0YXRlIiwgCiAgICAgICAgIGNvdW50cnkgPSAiQ291bnRyeS9SZWdpb24iLAogICAgICAgICBsYXN0X3VwZCA9ICJMYXN0IFVwZGF0ZSIpICU+JQogIHN1bW1hcmlzZShjb25maXJtZWQgPSBzdW0oQ29uZmlybWVkLCBuYS5ybSA9IFQpLAogICAgICAgICAgICByZWNvdmVyZWQgPSBzdW0oUmVjb3ZlcmVkLCBuYS5ybSA9IFQpLCAgICAgICAgICAgICAgICAKICAgICAgICAgICAgZGVhdGhzID0gc3VtKERlYXRocywgbmEucm0gPSBUKSwKICAgICAgICAgICAgUlIgPSByb3VuZCgxMDAgKiByZWNvdmVyZWQvY29uZmlybWVkLCAwKSwKICAgICAgICAgICAgQ0ZSID0gcm91bmQoMTAwICogZGVhdGhzL2NvbmZpcm1lZCwgMCkpICAgIAp9CgojJyBAdGl0bGUgQSB3cmFuZ2xfdHNjIGZ1bmN0aW9uCiMnIEBwYXJhbSB0c2MgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcmV0dXJuIHdyYW5nbF90c2MKIycgQGV4cG9ydCB3cmFuZ2xfdHNjCiMnIEBrZXl3b3JkcyB3cmFuZ2xfdHNjCiMnCndyYW5nbF90c2MgPC0gZnVuY3Rpb24odHNjKSB7CnRzYyAlPiUgcmVuYW1lKHN0YXRlID0gIlByb3ZpbmNlL1N0YXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID0gIkNvdW50cnkvUmVnaW9uIiwKICAgICAgICAgICAgICAgICAgICAgIGxhdCA9IExhdCwgbG9uZyA9IExvbmcpICAKfQoKIycgQHRpdGxlIEEgd3JhbmdsX3RzYyBmdW5jdGlvbgojJyBAcGFyYW0gdHNkIC0gIGlucHV0IGRhdGEgZnJhbWUKIycgQHJldHVybiB3cmFuZ2xfdHNkCiMnIEBleHBvcnQgd3JhbmdsX3RzZAojJyBAa2V5d29yZHMgd3JhbmdsX3RzZAojJwp3cmFuZ2xfdHNkIDwtIGZ1bmN0aW9uKHRzZCkgewp0c2QgJT4lIHJlbmFtZShzdGF0ZSA9ICJQcm92aW5jZS9TdGF0ZSIsIAogICAgICAgICAgICAgICAgICAgICAgY291bnRyeSA9ICJDb3VudHJ5L1JlZ2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICBsYXQgPSBMYXQsIGxvbmcgPSBMb25nKQp9CgojJyBAdGl0bGUgQSB3cmFuZ2xfdHNyIGZ1bmN0aW9uCiMnIEBwYXJhbSB0c3IgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcmV0dXJuIHdyYW5nbF90c3IKIycgQGV4cG9ydCB3cmFuZ2xfdHNyCiMnIEBrZXl3b3JkcyB3cmFuZ2xfdHNyCiMnCndyYW5nbF90c3IgPC0gZnVuY3Rpb24odHNyKSB7CnRzciAlPiUgcmVuYW1lKHN0YXRlID0gIlByb3ZpbmNlL1N0YXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID0gIkNvdW50cnkvUmVnaW9uIiwKICAgICAgICAgICAgICAgICAgICAgIGxhdCA9IExhdCwgbG9uZyA9IExvbmcpCn0KCiMnIEB0aXRsZSBBIHRpZHlfam9pbl9mdW5fc3VtIGJ5IGNvdW50cnkgZnVuY3Rpb24KIycgQHBhcmFtIHRpZHlfam9pbiAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEByZXR1cm4gdGlkeV9qb2luX2Z1bl9zdW0KIycgQGV4cG9ydCB0aWR5X2pvaW5fZnVuX3N1bQojJyBAa2V5d29yZHMgdGlkeV9qb2luX2Z1bl9zdW0KIycKdGlkeV9qb2luX2Z1bl9zdW0gPC0gZnVuY3Rpb24odGlkeV9qb2luKSB7CnRpZHlfam9pbiAlPiUgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgc3VtbWFyaXNlKGNvbmZpcm1lZCA9IG1heChjb25maXJtZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIHJlY292ZXJlZCA9IG1heChyZWNvdmVyZWQsIG5hLnJtID0gVCksICAgICAgICAgICAgICAgIAogICAgICAgICAgICBkZWF0aHMgPSBtYXgoZGVhdGgsIG5hLnJtID0gVCksCiAgICAgICAgICAgIFJSID0gcm91bmQoMTAwICogcmVjb3ZlcmVkL2NvbmZpcm1lZCwgMCksCiAgICAgICAgICAgIENGUiA9IHJvdW5kKDEwMCAqIGRlYXRocy9jb25maXJtZWQsIDApKSAlPiUKICBhcnJhbmdlKC1jb25maXJtZWQpICAKfQoKIycgQHRpdGxlIEEgZ2F0aGVyIGZ1bmN0aW9uCiMnIEBwYXJhbSBkYXRhIC0gIGlucHV0IGRhdGEgZnJhbWUKIycgQHBhcmFtIHZhciAtICB4IGlucHV0IGRhdGEKIycgQHJldHVybiBnYXRoZXJfZnVuCiMnIEBleHBvcnQgZ2F0aGVyX2Z1bgojJyBAa2V5d29yZHMgZ2F0aGVyX2Z1bgojJyAKZ2F0aGVyX2Z1biA8LSBmdW5jdGlvbihkYXRhLCB2YXIpIHsKICB2YXIgPC0gZW5xdW8odmFyKQogIGRhdGEgJT4lIGdhdGhlcihkYXRlLCAhIXZhciwgLWxhdCwgLWxvbmcsIC1zdGF0ZSwgLWNvdW50cnkpICU+JSAgCiAgbXV0YXRlKGRhdGUgPSBhcy5EYXRlKGRhdGUsICIlbS8lZC8leSIpKQp9CgojJyBAdGl0bGUgdGlkeV9qb2luX2Z1bgojJyBAcmV0dXJuIHRpZHlfam9pbgojJyBAZXhwb3J0IHRpZHlfam9pbgojJyBAa2V5d29yZHMgdGlkeV9qb2luX2Z1bgojJyAKdGlkeV9qb2luX2Z1biA8LSBmdW5jdGlvbigpIHsKICAKIyBSdW4gZ2F0aGVyIGZ1bmN0aW9uCnRzY190aWR5IDwtIGdhdGhlcl9mdW4odHNjLCBjb25maXJtZWQpCnRzZF90aWR5IDwtIGdhdGhlcl9mdW4odHNkLCBkZWF0aCkKdHNyX3RpZHkgPC0gZ2F0aGVyX2Z1bih0c3IsIHJlY292ZXJlZCkKCiMgSm9pbiBkYXRhIGZyYW1lcwp0aWR5X2pvaW4gPC0gZnVsbF9qb2luKHRzY190aWR5LCB0c2RfdGlkeSwgCiAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJzdGF0ZSIsICJjb3VudHJ5IiwgImxhdCIsICJsb25nIiwgImRhdGUiKSkgCnRpZHlfam9pbiA8LSBmdWxsX2pvaW4odGlkeV9qb2luLCB0c3JfdGlkeSwgCiAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJzdGF0ZSIsICJjb3VudHJ5IiwgImxhdCIsICJsb25nIiwgImRhdGUiKSkgCiMgUmVtb3ZlIE5BCiMgdGlkeV9qb2luIDwtIHRpZHlfam9pbiAlPiUgZHJvcF9uYSgpCgp0aWR5X2pvaW4kY29uZmlybWVkIDwtIGFzLm51bWVyaWModGlkeV9qb2luJGNvbmZpcm1lZCkKdGlkeV9qb2luJGRlYXRoIDwtIGFzLm51bWVyaWModGlkeV9qb2luJGRlYXRoKQp0aWR5X2pvaW4kcmVjb3ZlcmVkIDwtIGFzLm51bWVyaWModGlkeV9qb2luJHJlY292ZXJlZCkKCiMgQ2FsY3VsYXRlIGFkZGl0aW9uYWwgdmFyaWFibGVzCnRpZHlfam9pbiA8LSB0aWR5X2pvaW4gJT4lIAojIFJlY292ZXJ5IFJhdGlvICglKSAmIENhc2UgRmF0YWxpdHkgUmF0aW8gKCUpICAgICAgICAgCm11dGF0ZShSUiA9IHJvdW5kKDEwMCAqIHJlY292ZXJlZC9jb25maXJtZWQsIDApLAogICAgICAgQ0ZSID0gcm91bmQoMTAwICogZGVhdGgvY29uZmlybWVkLCAwKSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lIAojIG1lYW4gY29uZmlybWVkIGNhc2UgbGFzdCAzIGRheXMgICAgICAgIAogIG11dGF0ZShjM2QgPSBtZWFuKHRhaWwoY29uZmlybWVkLCAzTCkpLAogICAgICAgICBkM2QgPSBtZWFuKHRhaWwoZGVhdGgsIDNMKSksCiAgICAgICAgIHIzZCAgPSBtZWFuKHRhaWwocmVjb3ZlcmVkLCAzTCkpKSAlPiUKICB1bmdyb3VwKCkKfQoKIycgQHRpdGxlIHBsb3RfZW5xdW8gZnVuY3Rpb24KIycgQHBhcmFtIGRhdGEgLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcGFyYW0geCAtICB4IGlucHV0IGRhdGEKIycgQHBhcmFtIHkgLSAgeSBpbnB1dCBkYXRhCiMnIEBwYXJhbSBUaXRsZSAtICB0aXRsZQojJyBAcmV0dXJuIHBsb3QKIycgQGV4cG9ydCBwbG90IHBsb3QgZ3JhcGgKIycgQGtleXdvcmRzIHBsb3QKIycgCnBsb3RfZW5xdW8gPC0gZnVuY3Rpb24oLmRhdGEsIHgsIHksIFRpdGxlKQp7CiAgeCA8LSBlbnF1byh4KQogIHkgPC0gZW5xdW8oeSkKICBnZ3Bsb3QoLmRhdGEsIGFlcyghIXgsICEheSkpICsKICAgIGdlb21fcG9pbnQoYWVzKGFscGhhID0gMC42LCBjb2xvciA9ICEheSkpICsgCiAgICBnZW9tX2xpbmUoYWVzKGFscGhhID0gMC42LCBjb2xvciA9ICEheSkpICsKICAgIGxhYnModGl0bGUgPSBUaXRsZSwgeCA9ICIiLCB5ID0gIiIpICArCiAgICB0aGVtZV9taW5pbWFsX2dyaWQoMTIpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKfQoKIycgQHRpdGxlIGdsb2JhbF9jYXNlIGZ1bmN0aW9uCiMnIEBwYXJhbSBkYXRhIC0gIGlucHV0IGRhdGEgZnJhbWUKIycgQHBhcmFtIGNvbmZpcm1lZCAtICBjb25maXJtZWQgaW5wdXQgZGF0YQojJyBAcGFyYW0gcmVjb3ZlcmVkIC0gIHJlY292ZXJlZCBpbnB1dCBkYXRhCiMnIEBwYXJhbSBkZWF0aCAtICBkZWF0aHMgaW5wdXQgZGF0YQojJyBAcmV0dXJuIGdsb2JhbF9jYXNlCiMnIEBleHBvcnQgZ2xvYmFsX2Nhc2UgcGxvdCBncmFwaAojJyBAa2V5d29yZHMgZ2xvYmFsX2Nhc2UKIycgCmdsb2JhbF9jYXNlIDwtIGZ1bmN0aW9uKGRhdGEsIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkgewogIGNvbmZpcm1lZCA8LSBlbnF1byhjb25maXJtZWQpCiAgcmVjb3ZlcmVkIDwtIGVucXVvKHJlY292ZXJlZCkKICBkZWF0aCA8LSBlbnF1byhkZWF0aCkgICAgCiAgCmRhdGEgJT4lIAogIGdyb3VwX2J5KGRhdGUpICU+JQogIHN1bW1hcmlzZShjb25maXJtZWQgPSBzdW0oISFjb25maXJtZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIHJlY292ZXJlZCA9IHN1bSghIXJlY292ZXJlZCwgbmEucm0gPSBUKSwKICAgICAgICAgICAgZGVhdGggPSBzdW0oISFkZWF0aCwgbmEucm0gPSBUKSwgCiAgICAgICAgICAgIFJSID0gcm91bmQoMTAwICogcmVjb3ZlcmVkIC8gY29uZmlybWVkLCAxKSwKICAgICAgICAgICAgQ0ZSID0gcm91bmQoMTAwICogZGVhdGggLyBjb25maXJtZWQsIDEpKSAKfQoKIycgQHRpdGxlIHBsb3RfZ3JpZF9nbG9iYWwKIycgQHBhcmFtIHRpZHlfam9pbiAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEByZXR1cm4gcGxvdF9ncmlkX2dsb2JhbAojJyBAZXhwb3J0IHBsb3RfZ3JpZF9nbG9iYWwKIycgQGtleXdvcmRzIHBsb3RfZ3JpZF9nbG9iYWwKIycgCnBsb3RfZ3JpZF9nbG9iYWwgPC0gZnVuY3Rpb24odGlkeV9qb2luKXsKICBkYXRhIDwtIGdsb2JhbF9jYXNlKHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKSAKICBwMSA8LSBwbG90X2VucXVvKGRhdGEsIGRhdGUsIGNvbmZpcm1lZCwgIkNvbmZpcm1lZCIpCiAgcDIgPC0gcGxvdF9lbnF1byhkYXRhLCBkYXRlLCByZWNvdmVyZWQsICJSZWNvdmVyZWQiKQogIHAzIDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgZGVhdGgsICJEZWF0aHMiKQogIHA0IDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgUlIsICJSZWNvdmVyeSBSYXRpbyAoJSkiKQogIHA1IDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgQ0ZSLCAiQ2FzZSBGYXRhbGl0eSBSYXRpbyAoJSkiKQogIAp0aXRsZV9nZyA8LSBnZ3Bsb3QoKSArIAogIGxhYnModGl0bGUgPSAiR2xvYmFsIENhc2VzIiwgCiAgICAgICBzdWJ0aXRsZSA9IHBhc3RlKCJSZXBvcnQgZGF0ZToiLCBTeXMuRGF0ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICBtaW4oZGF0YSRkYXRlW2RhdGEkY29uZmlybWVkID49IDFdLCBuYS5ybSA9IFQpKSkgKwogIHRoZW1lX21pbmltYWxfZ3JpZCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpIAoKICBwbG90X2dyaWQodGl0bGVfZ2csIHAxLCBwMiwgcDMsIHA0LCBwNSwgbmNvbCA9IDMpICAgCn0KCiMnIEB0aXRsZSBwbG90X2dyaWRfY291bnRyeQojJyBAcGFyYW0gY291bnRyeSAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEBwYXJhbSB0aWR5X2pvaW4gLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcmV0dXJuIHBsb3RfZ3JpZF9jb3VudHJ5CiMnIEBleHBvcnQgcGxvdF9ncmlkX2NvdW50cnkKIycgQGtleXdvcmRzIHBsb3RfZ3JpZF9jb3VudHJ5CiMnICAgCnBsb3RfZ3JpZF9jb3VudHJ5IDwtIGZ1bmN0aW9uKGNvdW50cnksIHRpZHlfam9pbil7CiAgY291bnRyeSA8LSBlbnF1byhjb3VudHJ5KSAgCiAgZGF0YSA8LSBjb3VudHJ5X2NhbGMoISFjb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkgCiAgcDEgPC0gcGxvdF9lbnF1byhkYXRhLCBkYXRlLCBjb25maXJtZWQsICJDb25maXJtZWQiKQogIHAyIDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgcmVjb3ZlcmVkLCAiUmVjb3ZlcmVkIikKICBwMyA8LSBwbG90X2VucXVvKGRhdGEsIGRhdGUsIGRlYXRoLCAiRGVhdGhzIikKICBwNCA8LSBwbG90X2VucXVvKGRhdGEsIGRhdGUsIFJSLCAiUmVjb3ZlcnkgUmF0aW8gKCUpIikKICBwNSA8LSBwbG90X2VucXVvKGRhdGEsIGRhdGUsIENGUiwgIkNhc2UgRmF0YWxpdHkgUmF0aW8gKCUpIikKICAKIyBGaXJzdCBjYXNlIGRhdGUKdGl0bGVfZ2cgPC0gZ2dwbG90KCkgKyAKICBsYWJzKHRpdGxlID0gcGFzdGUoIkNvdW50cnk6IiwgQ291bnRyeSksCiAgICAgICBzdWJ0aXRsZSA9IHBhc3RlKCJSZXBvcnQgZGF0ZToiLCBTeXMuRGF0ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAiXG5GaXJzdCBjYXNlIGRhdGU6IiwgCiAgICAgICAgICAgICAgICAgICAgICAgIG1pbihkYXRhJGRhdGVbZGF0YSRjb25maXJtZWQgPj0gMV0sIG5hLnJtID0gVCkpKSArCiAgdGhlbWVfbWluaW1hbF9ncmlkKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgCgogIHBsb3RfZ3JpZCh0aXRsZV9nZywgcDEsIHAyLCBwMywgcDQsIHA1LCBuY29sID0gMykgICAgIAp9CgojJyBAdGl0bGUgcGxvdF9ncmlkX3N0YXRlCiMnIEBwYXJhbSBzdGF0ZSAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEBwYXJhbSB0aWR5X2pvaW4gLSAgaW5wdXQgZGF0YSBmcmFtZQojJyBAcmV0dXJuIHBsb3RfZ3JpZF9zdGF0ZQojJyBAZXhwb3J0IHBsb3RfZ3JpZF9zdGF0ZQojJyBAa2V5d29yZHMgcGxvdF9ncmlkX3N0YXRlCiMnICAgCnBsb3RfZ3JpZF9zdGF0ZSA8LSBmdW5jdGlvbihzdGF0ZSwgdGlkeV9qb2luKXsKICBzdGF0ZSA8LSBlbnF1byhzdGF0ZSkgIAogIGRhdGEgPC0gc3RhdGVfY2FsYyghIXN0YXRlLCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkgCiAgcDEgPC0gcGxvdF9lbnF1byhkYXRhLCBkYXRlLCBjb25maXJtZWQsICJDb25maXJtZWQiKQogIHAyIDwtIHBsb3RfZW5xdW8oZGF0YSwgZGF0ZSwgcmVjb3ZlcmVkLCAiUmVjb3ZlcmVkIikKICBwMyA8LSBwbG90X2VucXVvKGRhdGEsIGRhdGUsIGRlYXRoLCAiRGVhdGhzIikKICBwNCA8LSBwbG90X2VucXVvKGRhdGEsIGRhdGUsIFJSLCAiUmVjb3ZlcnkgUmF0aW8gKCUpIikKICBwNSA8LSBwbG90X2VucXVvKGRhdGEsIGRhdGUsIENGUiwgIkNhc2UgRmF0YWxpdHkgUmF0aW8gKCUpIikKICAKICBwbG90X2dyaWQocDEsIHAyLCBwMywgcDQsIHA1KSAgIAp9CgojJyBAdGl0bGUgQ291bnRyeSBDYXNlIENhbGN1bGF0aW9ucwojJyBAcGFyYW0gY291bnRyeSAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEBwYXJhbSBkYXRhIC0gIGlucHV0IGRhdGEgZnJhbWUKIycgQHBhcmFtIGNvbmZpcm1lZCAtICBpbnB1dCBkYXRhCiMnIEBwYXJhbSByZWNvdmVyZWQgLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0gZGVhdGggLSAgaW5wdXQgZGF0YQojJyBAcmV0dXJuIGNvdW50cnlfY2FsYwojJyBAZXhwb3J0IGNvdW50cnlfY2FsYwojJyBAa2V5d29yZHMgY291bnRyeV9jYWxjCiMnIApjb3VudHJ5X2NhbGMgPC0gZnVuY3Rpb24oY291bnRyeSwgZGF0YSwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKSB7CiAgY291bnRyeSA8LSBlbnF1byhjb3VudHJ5KQogIGNvbmZpcm1lZCA8LSBlbnF1byhjb25maXJtZWQpCiAgcmVjb3ZlcmVkIDwtIGVucXVvKHJlY292ZXJlZCkKICBkZWF0aCA8LSBlbnF1byhkZWF0aCkgICAgCiAgCmRhdGEgJT4lIGZpbHRlcihjb3VudHJ5ID09ICEhY291bnRyeSkgJT4lCiAgZ3JvdXBfYnkoZGF0ZSkgJT4lCiAgc3VtbWFyaXNlKGNvbmZpcm1lZCA9IHN1bSghIWNvbmZpcm1lZCwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICByZWNvdmVyZWQgPSBzdW0oISFyZWNvdmVyZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgZGVhdGggPSBzdW0oISFkZWF0aCwgbmEucm0gPSBUKSwgCiAgICAgICAgICAgICAgUlIgPSByb3VuZCgxMDAgKiByZWNvdmVyZWQgLyBjb25maXJtZWQsIDEpLAogICAgICAgICAgICAgIENGUiA9IHJvdW5kKDEwMCAqIGRlYXRoIC8gY29uZmlybWVkLCAxKSkgJT4lCiAgYXJyYW5nZShkZXNjKGRhdGUpKQp9ICAgIAoKIycgQHRpdGxlIFN0YXRlIENhc2UgQ2FsY3VsYXRpb25zCiMnIEBwYXJhbSBzdGF0ZSAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEBwYXJhbSBkYXRhIC0gIGlucHV0IGRhdGEgZnJhbWUKIycgQHBhcmFtIGNvbmZpcm1lZCAtICBpbnB1dCBkYXRhCiMnIEBwYXJhbSByZWNvdmVyZWQgLSAgaW5wdXQgZGF0YQojJyBAcGFyYW0gZGVhdGggLSAgaW5wdXQgZGF0YQojJyBAcmV0dXJuIHN0YXRlX2NhbGMKIycgQGV4cG9ydCBzdGF0ZV9jYWxjCiMnIEBrZXl3b3JkcyBzdGF0ZV9jYWxjCiMnIApzdGF0ZV9jYWxjIDwtIGZ1bmN0aW9uKHN0YXRlLCBkYXRhLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpIHsKICBzdGF0ZSA8LSBlbnF1byhzdGF0ZSkKICBjb25maXJtZWQgPC0gZW5xdW8oY29uZmlybWVkKQogIHJlY292ZXJlZCA8LSBlbnF1byhyZWNvdmVyZWQpCiAgZGVhdGggPC0gZW5xdW8oZGVhdGgpICAgIAogIApkYXRhICU+JSBmaWx0ZXIoc3RhdGUgPT0gISFzdGF0ZSkgJT4lCiAgZ3JvdXBfYnkoZGF0ZSkgJT4lCiAgc3VtbWFyaXNlKGNvbmZpcm1lZCA9IHN1bSghIWNvbmZpcm1lZCwgbmEucm0gPSBUKSwKICAgICAgICAgICAgcmVjb3ZlcmVkID0gc3VtKCEhcmVjb3ZlcmVkLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBkZWF0aCA9IHN1bSghIWRlYXRoLCBuYS5ybSA9IFQpLCAKICAgICAgICAgICAgUlIgPSByb3VuZCgxMDAgKiByZWNvdmVyZWQgLyBjb25maXJtZWQsIDEpLAogICAgICAgICAgICBDRlIgPSByb3VuZCgxMDAgKiBkZWF0aCAvIGNvbmZpcm1lZCwgMSkpCn0gICAgCgojJyBAdGl0bGUgcmVzdW1lIENhbGN1bGF0aW9ucwojJyBAcGFyYW0gY291bnRyeSAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEByZXR1cm4gcmVzdW1lCiMnIEBleHBvcnQgcmVzdW1lCiMnIEBrZXl3b3JkcyByZXN1bWUKIycgCnJlc3VtZSA8LSBmdW5jdGlvbihDb3VudHJ5KSB7CiAgCnRpZHlfam9pbiAlPiUgCiAgZmlsdGVyKGNvdW50cnkgPT0gQ291bnRyeSAmIGRhdGUgPT0gbWF4KGRhdGUpKSAlPiUgCiAgc3VtbWFyaXNlKGRhdGUgPSBtYXgoZGF0ZSksCiAgICAgICAgICAgIGNvbmZpcm1lZCA9IHN1bShjb25maXJtZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIHJlY292ZXJlZCA9IHN1bShyZWNvdmVyZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIGRlYXRoID0gc3VtKGRlYXRoLCBuYS5ybSA9IFQpKQp9CgojJyBAdGl0bGUgcmVzdW1lIHN0YXRlIENhbGN1bGF0aW9ucwojJyBAcGFyYW0gcmVzdW1lIHN0YXRlICAtICBpbnB1dCBkYXRhIGZyYW1lCiMnIEByZXR1cm4gcmVzdW1lIHN0YXRlIAojJyBAZXhwb3J0IHJlc3VtZSBzdGF0ZSAKIycgQGtleXdvcmRzIHJlc3VtZSBzdGF0ZSAKIycgCnJlc3VtZV9zdGF0ZSA8LSBmdW5jdGlvbihTdGF0ZSkgewogIAp0aWR5X2pvaW4gJT4lIAogIGZpbHRlcihzdGF0ZSA9PSBTdGF0ZSAmIGRhdGUgPT0gbWF4KGRhdGUpKSAlPiUgCiAgc3VtbWFyaXNlKGRhdGUgPSBtYXgoZGF0ZSksCiAgICAgICAgICAgIGNvbmZpcm1lZCA9IHN1bShjb25maXJtZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIHJlY292ZXJlZCA9IHN1bShyZWNvdmVyZWQsIG5hLnJtID0gVCksCiAgICAgICAgICAgIGRlYXRoID0gc3VtKGRlYXRoLCBuYS5ybSA9IFQpKQp9CgojJyBAdGl0bGUgbG9naXN0aWNfZ3Jvd3RoX2RhdGFfcHJlcCBjYWxjdWxhdGlvbnMKIycgQHBhcmFtIGNvdW50cnkgLSAgaW5wdXQgZGF0YQojJyBAcmV0dXJuIGxvZ2lzdGljX2dyb3d0aF9kYXRhX3ByZXAKIycgQGV4cG9ydCBsb2dpc3RpY19ncm93dGhfZGF0YV9wcmVwCiMnIEBrZXl3b3JkcyBsb2dpc3RpY19ncm93dGhfZGF0YV9wcmVwCiMnIApsb2dpc3RpY19ncm93dGhfZGF0YV9wcmVwIDwtIGZ1bmN0aW9uKENvdW50cnksIGN1dG9mZikgewogIAojIHByZXBhcmUgZGF0YSAgCnRpZHlfam9pbiAlPiUgCiAgZmlsdGVyKGNvdW50cnkgPT0gQ291bnRyeSkgJT4lIAogIGdyb3VwX2J5KGNvdW50cnksIGRhdGUpICU+JSAKICBzdW1tYXJpc2UoY29uZmlybWVkID0gc3VtKGNvbmZpcm1lZCkpICU+JQogIGZpbHRlcihjb25maXJtZWQgPiBjdXRvZmYpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUodCA9IDE6bigpKQp9CgojJyBAdGl0bGUgbG9naXN0aWNfZ3Jvd3RoX21vZGVsIENhbGN1bGF0aW9ucwojJyBAcGFyYW0gY291bnRyeSAtICBpbnB1dCBkYXRhCiMnIEBwYXJhbSBkYXRhIC0gIGlucHV0IGRhdGEKIycgQHBhcmFtIGN1dG9vZiAtICBpbnB1dCBkYXRhCiMnIEByZXR1cm4gbG9naXN0aWNfZ3Jvd3RoX21vZGVsCiMnIEBleHBvcnQgbG9naXN0aWNfZ3Jvd3RoX21vZGVsCiMnIEBrZXl3b3JkcyBsb2dpc3RpY19ncm93dGhfbW9kZWwKIycgCmxvZ2lzdGljX2dyb3d0aF9tb2RlbCA8LSBmdW5jdGlvbihDb3VudHJ5LCBjdXRvZmYsIHRyYWNlLCB0bWF4KSB7CgojIHByZXBhcmUgZGF0YQpkYXRhIDwtIGxvZ2lzdGljX2dyb3d0aF9kYXRhX3ByZXAoQ291bnRyeSwgY3V0b2ZmKSAgCiAgCiMgU2V0IGlucHV0IG1vZGVsIHBhcmFtZXRlcnMgICAgICAKc2V0LnNlZWQoMTcpCm1heGl0ZXIgPC0gMTAyNApwYXJtcyA8LSBjKEsgPSBtYXgoZGF0YSRjb25maXJtZWQsIG5hLnJtID0gVCksIAogICAgICAgICAgIGEgPSBtYXgoZGF0YSRjb25maXJtZWQsIG5hLnJtID0gVCksIAogICAgICAgICAgIG4gPSAxKQpjb250cm9sIDwtIGMobmxzLmNvbnRyb2wobWF4aXRlciA9IG1heGl0ZXIpKSAgICAKICAgIAojIFJ1biBMb2dpc3RpYyBtb2RlbCAgICAgIAptb2RlbCA8LSBtaW5wYWNrLmxtOjpubHNMTShjb25maXJtZWQgfiAoSyAqIHQgXiBuKSAvIChhICsgdCBeIG4pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBwYXJtcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjb250cm9sLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2UgPSB0cmFjZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsID0gVCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhKQogICAgICAKIyBTdG9yZSBsb2dpc3RpYyBwYXJhbWV0ZXIgcmVzdWx0cwptb2RlbF9wYXJtIDwtIGRhdGEuZnJhbWUoY291bnRyeSA9IENvdW50cnksIAogICAgICAgICAgICAgICAgICAgICBLID0gY29lZihtb2RlbClbMV0sCiAgICAgICAgICAgICAgICAgICAgIGEgPSBjb2VmKG1vZGVsKVsyXSwKICAgICAgICAgICAgICAgICAgICAgbiA9IGNvZWYobW9kZWwpWzNdLAogICAgICAgICAgICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCgojIENyZWF0ZSB0aW1lIHZlY3RvciBhIHNsaWdodGx5IGxhcmdlciB0byByZWFsIGRhdGEgCnQgPC0gMTp0bWF4CgojIENhbGN1bGF0ZSBjb25maXJtZWRfTEdNIGZyb20gbW9kZWwKUHJvamVjdGVkX0xHTSA9IChtb2RlbF9wYXJtJEsgKiB0IF4gbW9kZWxfcGFybSRuKSAvIAogICAgICAgICAgICAgICAgICAobW9kZWxfcGFybSRhICsgdCBeIG1vZGVsX3Bhcm0kbikKCiMgQ3JlYXRlIGRhdGEgdG8gc3RvcmUgTEdNIGNhbGN1bGF0aW9uCmZvbyA8LSBkYXRhX2ZyYW1lKHQgPSB0LCBQcm9qZWN0ZWRfTEdNID0gUHJvamVjdGVkX0xHTSkKCiMgSm9pbiBjYWxjdWxhdGUgZGF0YSB3aXRoIHJlYWwgZGF0YQpkYXRhIDwtIGxlZnRfam9pbihmb28sIGRhdGEsIGJ5ID0gInQiKQoKIyBDcmVhdGUgbGFiZWwgZGF0YSBmcmFtZQphbm5vdGF0aW9uIDwtIGRhdGEuZnJhbWUoCiAgeCA9IHRtYXggKyA1LAogIHkgPSBtYXgoZGF0YSRQcm9qZWN0ZWRfTEdNLCBuYS5ybSA9IFQpLAogIGxhYmVsID0gcGFzdGUoIlByb2plY3RlZCBjYXNlcyA9IiwgCiAgICAgICAgICAgICAgICByb3VuZChtYXgoZGF0YSRQcm9qZWN0ZWRfTEdNKSwgMCkpLAojIFByb2plY3RlZCAtIENvbmZpcm1lZCBDYXNlcyBSYXRpbyBjYWxjdWxhdGlvbiAgCiAgcmF0aW8gPSByb3VuZCgxMDAgLSAoMTAwICogCiAgICAgICAgICAgICAgICAgIChtYXgoZGF0YSRQcm9qZWN0ZWRfTEdNLCBuYS5ybSA9IFQpIC0gCiAgICAgICAgICAgICAgICAgIG1heChkYXRhJGNvbmZpcm1lZCwgbmEucm0gPSBUKSkgLyAKICAgICAgICAgICAgICAgICAgbWF4KGRhdGEkUHJvamVjdGVkX0xHTSwgbmEucm0gPSBUKSkpKQoKIyBQbG90IExvZ2lzdGljIEdyb3d0aCBNb2RlbCByZXN1bHRzCmdncGxvdCgpICsKICBnZW9tX2xpbmUoZGF0YSA9IGRhdGEsIAogICAgICAgICAgICAgYWVzKHQsIFByb2plY3RlZF9MR00sIGNvbCA9ICJQcm9qZWN0ZWRfTEdNIikpICsgICAKICBnZW9tX3BvaW50KGRhdGEgPSBkYXRhLCAKICAgICAgICAgICAgIGFlcyh0LCBjb25maXJtZWQsIGNvbCA9ICJjb25maXJtZWQiKSkgKwogIGdlb21fbGFiZWwoZGF0YSA9IGFubm90YXRpb24sIAogICAgICAgICAgICBhZXMoIHggPSB4LCB5ID0geSwgbGFiZWwgPSBsYWJlbCksIAogICAgICAgICAgICBmaWxsID0gImxpZ2h0Ymx1ZSIsCiAgICAgICAgICAgIG51ZGdlX3ggPSAtNDAsCiAgICAgICAgICAgIHNpemUgPSA1LjAsCiAgICAgICAgICAgIGZvbnRmYWNlID0gImJvbGQiKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKENvdW50cnksICItIExvZ2lzdGljIEdyb3d0aCBNb2RlbCAoTEdNKSIpLAogICAgICAgc3VidGl0bGUgPSBwYXN0ZSgiUHJvamVjdGVkIC0gQ29uZmlybWVkIENhc2VzIFJhdGlvIDoiLAogICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uJHJhdGlvLCAiJSIpLAogICAgICAgY2FwdGlvbiA9ICJTb3VyY2UgaHR0cHM6Ly9naXRodWIuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5LmdpdCIsIAogICAgICAgeCA9ICJEYXlzIiwgCiAgICAgICB5ID0gIk51bWJlciBvZiBDb25maXJtZWQgQ2FzZXMiKSArCiAgdGhlbWVfbWluaW1hbF9ncmlkKDE0KSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICAKfQoKIycgQHRpdGxlIGJhcl9ncmFwaF9hdmVyYWdlCiMnIEBwYXJhbSB0aWR5X2pvaW4gLSAgaW5wdXQgZGF0YQojJyBAcmV0dXJuIGJhcl9ncmFwaF9hdmVyYWdlCiMnIEBleHBvcnQgYmFyX2dyYXBoX2F2ZXJhZ2UKIycgQGtleXdvcmRzIGJhcl9ncmFwaF9hdmVyYWdlCiMnIApiYXJfZ3JhcGhfYXZlcmFnZSA8LSBmdW5jdGlvbih0aWR5X2pvaW4sIHgsIHRpdGxlKSB7CnggPC0gZW5xdW8oeCkgIAp0aWR5X2pvaW4gJT4lIGdyb3VwX2J5KGNvdW50cnkpICU+JSAKICBzdW1tYXJpc2UoYzNkID0gbWF4KCEheCkpICU+JSAKICB0b3BfbigxMCkgJT4lIGFycmFuZ2UoYzNkKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBhc19mYWN0b3IoY291bnRyeSksIHkgPSBjM2QpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIAogICAgICAgICAgIGZpbGwgPSAibGlnaHRibHVlIiwgCiAgICAgICAgICAgYWxwaGEgPSAwLjYpICsgCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKGMzZCwgMCkpLCAKICAgICAgICAgICAgaGp1c3QgPSAicmlndGgiLAogICAgICAgICAgICBzaXplID0gNC41LAogICAgICAgICAgICBmb250ZmFjZSA9ICJib2xkIikgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgiR2xvYmFsIENhc2U6IiwgdGl0bGUpLAogICAgICAgc3VidGl0bGUgPSBwYXN0ZSgiQXZlcmFnZSBMYXN0IFRocmVlIERheXMiKSwKICAgICAgIGNhcHRpb24gPSAiU291cmNlIGh0dHBzOi8vZ2l0aHViLmNvbS9DU1NFR0lTYW5kRGF0YS9DT1ZJRC0xOS5naXQiLCAKICAgICAgIHggPSAiIiwgeSA9ICIiKSArCiAgY29vcmRfZmxpcCgpICsgdGhlbWVfbWluaW1hbF9ncmlkKDE0KSAgCn0KYGBgCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIFJ1biB0aWR5X2pvaW5fZnVuIGZ1bmN0aW9uCmNvdmlkMTkgPC0gd3JhbmdsX2NvdmlkMTkoY292aWQxOSkKdHNjIDwtIHdyYW5nbF90c2ModHNjKQp0c2QgPC0gd3JhbmdsX3RzYyh0c2QpCnRzciA8LSB3cmFuZ2xfdHNjKHRzcikKdGlkeV9qb2luIDwtIHRpZHlfam9pbl9mdW4oKQpgYGAKCiMgSW50cm9kdWN0aW9uICAKClRoZSBmb2xsb3dpbmcgZG9jdW1lbnQgc2hvd3MgYW4gYW5hbHlzaXMgb2YgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JvbmF2aXJ1cyBwYW5kZW1pYyAoQ292aWQxOSkuCgpUaGUgYW5hbHlzaXMgaXMgZGl2aWRlZCBpbnRvIHR3byBwYXJ0cywgdGhlIGZpcnN0IGNvbXByaXNlcyBnZW5lcmFsIGdyYXBocyBvZiB0aGUgZGF0YSBhbmQgdGhlbiBhIG51bWVyaWNhbCBzaW11bGF0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyB0aGUgbG9naXN0aWMgZ3Jvd3RoIG1vZGVsIChMR00pIGluIG9yZGVyIHRvIGZvcmVjYXN0IHRoZSBwb3NzaWJsZSB0b3RhbCBudW1iZXIgb2YgY2FzZXMuICAKCioqRGF0YSBSZXBvc2l0b3J5IGJ5IEpvaG5zIEhvcGtpbnMgQ1NTRSoqCgojIFRlcm1zIHVzZWQgICAgCgojIyMgUmVjb3ZlcnkgcmF0aW8gICAKClRoZSBwcm9wb3J0aW9uIG9mIHBlb3BsZSByZWNvdmVyZWQgZnJvbSBhIHNwZWNpZmllZCBkaXNlYXNlIGFtb25nIGFsbCBpbmRpdmlkdWFscyBkaWFnbm9zZWQgd2l0aCB0aGUgZGlzZWFzZSBvdmVyIGEgY2VydGFpbiBwZXJpb2Qgb2YgdGltZS4gICAgCgokJFJlY292ZXJ5UmF0aW8gKFJSKSA9IFxmcmFje1JlY292ZXJlZH17Q29uZmlybWVkfSQkICAKCiMjIyBDYXNlIEZhdGFsaXR5IHJhdGlvICAKCkNhc2UgZmF0YWxpdHkgcmF0ZSwgYWxzbyBjYWxsZWQgY2FzZSBmYXRhbGl0eSByYXRpbywgaW4gZXBpZGVtaW9sb2d5LCB0aGUgcHJvcG9ydGlvbiBvZiBwZW9wbGUgd2hvIGRpZSBmcm9tIGEgc3BlY2lmaWVkIGRpc2Vhc2UgYW1vbmcgYWxsIGluZGl2aWR1YWxzIGRpYWdub3NlZCB3aXRoIHRoZSBkaXNlYXNlIG92ZXIgYSBjZXJ0YWluIHBlcmlvZCBvZiB0aW1lLiAgCgpodHRwczovL3d3dy5icml0YW5uaWNhLmNvbS9zY2llbmNlL2Nhc2UtZmF0YWxpdHktcmF0ZQoKJCRDYXNlIEZhdGFsaXR5IFJhdGlvIChDRlIpID0gXGZyYWN7RGVhdGhzfXtDb25maXJtZWR9JCQgIAoKIyMjIExvZ2lzdGljIEdyb3d0aCBNb2RlbCAoTEdNKSAgICAgIAoKQ2xhcmsgKDIwMTEpIHByb3Bvc2UgYSBuZXcgZW1waXJpY2FsIG1vZGVsIGJhc2VkIG9uIGxvZ2lzdGljIGdyb3d0aCBtb2RlbHMuICAKCkEgbm9ubGluZWFyIG1vZGVsIGZvcm11bGEgaW5jbHVkaW5nIHZhcmlhYmxlcyBhbmQgcGFyYW1ldGVycy4gIAoKJCRQcm9qZWN0ZWRDYXNlcyA9IFxmcmFjeyhLICogdCBeIG4pfXsoYSArIHQgXiBuKX0kJCAgICAKCldoZXJlOiAgCgpDYXNlcyA9IFByb2plY3RlZCBDYXNlICAgCksgPSBDYXJyeWluZyBjYXBhY2l0eSAgCm4gPSBIeXBlcmJvbGljIGV4cG9uZW50ICAKYSA9IENvbnN0YW50ICAKdCAgPSBUaW1lICAKClRoZSBiZXN0LWZpdCBub25saW5lYWwgbW9kZWwgaXMgb2J0YWluZWQgYnkgYW4gaXRlcmF0aXZlIGxlYXN0LXNxdWFyZWQgbWV0aG9kLgoKVGhlIGxvZ2lzdGljIGdyb3d0aCBtb2RlbCB3YXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHByb2dyZXNzaW9uIG9mIHRoZSBkaXNlYXNlIGluIGNlcnRhaW4gY291bnRyaWVzLiAgCgpUaGVyZSBhcmUgY2VydGFpbiBjb3VudHJpZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhpcyBhbmFseXNpcyBhbmQgd2hlcmUgdGhlIG1vZGVsIHdhcyBub3QgdXNlZCBlc3NlbnRpYWxseSBiZWNhdXNlIHRoZSBtb2RlbCBmYWlscy4gIAoKIyMjIFByb2plY3RlZCAtIENvbmZpcm1lZCBDYXNlcyBSYXRpbyAgCgpBc3N1bWluZyB0aGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgKipwcm9qZWN0ZWQgY2FzZXMqKiBjb3JyZXNwb25kcyB0byB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2FzZXMgdGhhdCB3b3VsZCBvY2N1ciBpbiBhIGdpdmVuIGNvdW50cnksIHRoZSBwcm9qZWN0ZWQgLSBjb25maXJtZWQgY2FzZXMgcmF0aW8gaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb24uCgokJFByb2plY3RlZENvbmZpcm1lZENhc2VzIFJhdGlvID0gMTAwIC0gKDEwMCAqIFxmcmFjeyhtYXgoUHJvamVjdGVkIENhc2UpIC0gbWF4KENvbmZpcm1lZCkpfXsgCiAgICAgICAgICAgICAgICAgIG1heChQcm9qZWN0ZWQgQ2FzZSl9JCQKICAgICAgICAgICAgICAgICAgCiMgR2xvYmFsIENhc2UgIAoKIyMgQXZlcmFnZSBDYXNlcyAoTGFzdCB0aHJlZSBkYXlzKQoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTgsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgQmFyIGdyYXBoIEF2ZXJhZ2UgQ29uZmlybWVkIENhc2VzIChMYXN0IHRocmVlIGRheXMpCmJhcl9ncmFwaF9hdmVyYWdlKHRpZHlfam9pbiwgYzNkLCAiQ29uZmlybWVkIENhc2UiKQpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD04LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpiYXJfZ3JhcGhfYXZlcmFnZSh0aWR5X2pvaW4sIHIzZCwgIlJlY292ZXJlZCBDYXNlIikKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KYmFyX2dyYXBoX2F2ZXJhZ2UodGlkeV9qb2luLCBkM2QsICJEZWF0aHMiKQpgYGAKCiMjIEdsb2JhbCBDYXNlIFN1bW1hcnkgIAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KY292aWQxOQpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcGxvdF9ncmlkX2dsb2JhbCh0aWR5X2pvaW4pCmBgYAoKIyMgQ291bnRyeSBDYXNlcwoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KdGlkeV9qb2luX2Z1bl9zdW0odGlkeV9qb2luKQpgYGAKCiMjIENoaW5hICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJDaGluYSIKcmVzdW1lKENvdW50cnkpCmNvdW50cnlfY2FsYyhDb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkKcGxvdF9ncmlkX2NvdW50cnkoQ291bnRyeSwgdGlkeV9qb2luKQpsb2dpc3RpY19ncm93dGhfbW9kZWwoQ291bnRyeSwgY3V0b2ZmID0gNTAwLCB0cmFjZSA9IEZBTFNFLCB0bWF4ID0gNjApCmBgYAoKIyMgQ3J1aXNlIFNoaXAgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkNydWlzZSBTaGlwIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCmxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSA2MCwgdHJhY2UgPSBGQUxTRSwgdG1heCA9IDQwKQpgYGAKCiMgVGhlIEFtZXJpY2FzICAKCiMjIE1leGljbyAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiTWV4aWNvIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCmxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSA0LCB0cmFjZSA9IEZBTFNFLCB0bWF4ID0gMTAwKQpgYGAKCiMjIFVuaXRlZCBTdGF0ZSAoVVMpCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiVVMiCnJlc3VtZShDb3VudHJ5KQpjb3VudHJ5X2NhbGMoQ291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpCnBsb3RfZ3JpZF9jb3VudHJ5KENvdW50cnksIHRpZHlfam9pbikKbG9naXN0aWNfZ3Jvd3RoX21vZGVsKENvdW50cnksIGN1dG9mZiA9IDYwLCB0cmFjZSA9IEZBTFNFLCB0bWF4ID0gMTAwKQpgYGAKCiMjIEFyZ2VudGluYSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiQXJnZW50aW5hIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCmBgYAoKIyMgQnJhemlsICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJCcmF6aWwiCnJlc3VtZShDb3VudHJ5KQpjb3VudHJ5X2NhbGMoQ291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpCnBsb3RfZ3JpZF9jb3VudHJ5KENvdW50cnksIHRpZHlfam9pbikKbG9naXN0aWNfZ3Jvd3RoX21vZGVsKENvdW50cnksIGN1dG9mZiA9IDQsIHRyYWNlID0gRkFMU0UsIHRtYXggPSAxMDApCmBgYAoKIyMgQ29sb21iaWEgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkNvbG9tYmlhIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCmxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSAwLCB0cmFjZSA9IEZBTFNFLCB0bWF4ID0gMTAwKQpgYGAKCiMjIENoaWxlICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJDaGlsZSIKcmVzdW1lKENvdW50cnkpCmNvdW50cnlfY2FsYyhDb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkKcGxvdF9ncmlkX2NvdW50cnkoQ291bnRyeSwgdGlkeV9qb2luKQpsb2dpc3RpY19ncm93dGhfbW9kZWwoQ291bnRyeSwgY3V0b2ZmID0gMCwgdHJhY2UgPSBGQUxTRSwgdG1heCA9IDEwMCkKYGBgCgojIyBWZW5lenVlbGEgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIlZlbmV6dWVsYSIKcmVzdW1lKENvdW50cnkpCmNvdW50cnlfY2FsYyhDb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkKcGxvdF9ncmlkX2NvdW50cnkoQ291bnRyeSwgdGlkeV9qb2luKQpgYGAKCiMgRXVyb3BlICAKCiMjIEl0YWx5ICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJJdGFseSIKcmVzdW1lKENvdW50cnkpCmNvdW50cnlfY2FsYyhDb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkKcGxvdF9ncmlkX2NvdW50cnkoQ291bnRyeSwgdGlkeV9qb2luKQpsb2dpc3RpY19ncm93dGhfbW9kZWwoQ291bnRyeSwgY3V0b2ZmID0gMjAsIHRyYWNlID0gRkFMU0UsIHRtYXggPSA4MCkKYGBgCgojIyBTcGFpbiAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiU3BhaW4iCnJlc3VtZShDb3VudHJ5KQpjb3VudHJ5X2NhbGMoQ291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpCnBsb3RfZ3JpZF9jb3VudHJ5KENvdW50cnksIHRpZHlfam9pbikKbG9naXN0aWNfZ3Jvd3RoX21vZGVsKENvdW50cnksIGN1dG9mZiA9IDMwLCB0cmFjZSA9IEZBTFNFLCB0bWF4ID0gODApCmBgYAoKIyMgVW5pdGVkIEtpbmdkb20gIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIlVuaXRlZCBLaW5nZG9tIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCmxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSAxNSwgdHJhY2UgPSBGQUxTRSwgdG1heCA9IDgwKQpgYGAKCiMjIEZyYW5jZSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiRnJhbmNlIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCmxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSAxNSwgdHJhY2UgPSBGQUxTRSwgdG1heCA9IDgwKQpgYGAKCiMjIEdlcm1hbnkgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkdlcm1hbnkiCnJlc3VtZShDb3VudHJ5KQpjb3VudHJ5X2NhbGMoQ291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpCnBsb3RfZ3JpZF9jb3VudHJ5KENvdW50cnksIHRpZHlfam9pbikKbG9naXN0aWNfZ3Jvd3RoX21vZGVsKENvdW50cnksIGN1dG9mZiA9IDI1LCB0cmFjZSA9IEZBTFNFLCB0bWF4ID0gODApCmBgYAoKIyMgU3dpdHplcmxhbmQgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIlN3aXR6ZXJsYW5kIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCmxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCAxLCB0cmFjZSA9IEZBTFNFLCB0bWF4ID0gODApCmBgYAoKIyMgTm9yd2F5ICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJOb3J3YXkiCnJlc3VtZShDb3VudHJ5KQpjb3VudHJ5X2NhbGMoQ291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpCnBsb3RfZ3JpZF9jb3VudHJ5KENvdW50cnksIHRpZHlfam9pbikKbG9naXN0aWNfZ3Jvd3RoX21vZGVsKENvdW50cnksIDE1LCB0cmFjZSA9IEZBTFNFLCB0bWF4ID0gODApCmBgYAoKIyBPdGhlcnMKCiMjIEphcGFuICAgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIkphcGFuIgpyZXN1bWUoQ291bnRyeSkKY291bnRyeV9jYWxjKENvdW50cnksIHRpZHlfam9pbiwgY29uZmlybWVkLCByZWNvdmVyZWQsIGRlYXRoKQpwbG90X2dyaWRfY291bnRyeShDb3VudHJ5LCB0aWR5X2pvaW4pCmxvZ2lzdGljX2dyb3d0aF9tb2RlbChDb3VudHJ5LCBjdXRvZmYgPSAxMCwgdHJhY2UgPSBGLCB0bWF4ID0gMTAwKQpgYGAKCiMjIEtvcmVhLCBTb3V0aCAgICAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDb3VudHJ5IDwtICJLb3JlYSwgU291dGgiCnJlc3VtZShDb3VudHJ5KQpjb3VudHJ5X2NhbGMoQ291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpCnBsb3RfZ3JpZF9jb3VudHJ5KENvdW50cnksIHRpZHlfam9pbikKbG9naXN0aWNfZ3Jvd3RoX21vZGVsKENvdW50cnksIGN1dG9mZiA9IDUwLCB0cmFjZSA9IEZBTFNFLCB0bWF4ID0gNTApCmBgYAoKIyMgSXJhbiAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiSXJhbiIKcmVzdW1lKENvdW50cnkpCmNvdW50cnlfY2FsYyhDb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkKcGxvdF9ncmlkX2NvdW50cnkoQ291bnRyeSwgdGlkeV9qb2luKQpsb2dpc3RpY19ncm93dGhfbW9kZWwoQ291bnRyeSwgY3V0b2ZmID0gMTAsIHRyYWNlID0gRkFMU0UsIHRtYXggPSA1MCkKYGBgCgojIyBJbmRpYSAgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KQ291bnRyeSA8LSAiSW5kaWEiCnJlc3VtZShDb3VudHJ5KQpjb3VudHJ5X2NhbGMoQ291bnRyeSwgdGlkeV9qb2luLCBjb25maXJtZWQsIHJlY292ZXJlZCwgZGVhdGgpCnBsb3RfZ3JpZF9jb3VudHJ5KENvdW50cnksIHRpZHlfam9pbikKYGBgCgojIyBSdXNzaWEgIAoKYGBge3IgZWNobz1GQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkNvdW50cnkgPC0gIlJ1c3NpYSIKcmVzdW1lKENvdW50cnkpCmNvdW50cnlfY2FsYyhDb3VudHJ5LCB0aWR5X2pvaW4sIGNvbmZpcm1lZCwgcmVjb3ZlcmVkLCBkZWF0aCkKcGxvdF9ncmlkX2NvdW50cnkoQ291bnRyeSwgdGlkeV9qb2luKQpgYGAKCiMgUmVmZXJlbmNlcyAgCgpTb3VyY2UgZGF0YTogaHR0cHM6Ly9naXRodWIuY29tL0NTU0VHSVNhbmREYXRhL0NPVklELTE5LmdpdCAgCgpDbGFyaywgQS5KLiAoMjAxMSkuICJEZWNsaW5lIEN1cnZlIEFuYWx5c2lzIGluIFVuY29udmVudGlvbmFsIFJlc291cmNlIFBsYXlzCiAgICBVc2luZyBMb2dpc3RpYyBHcm93dGggTW9kZWxzLiIgTS5TLiAKICAgIFRoZXNpcywgVGhlIFVuaXZlcnNpdHkgb2YgVGV4YXMgYXQgQXVzdGluLCBBdWd1c3QgMjAxMS4gCg==