We aim here at modeling the spread of the COVID-19 epidemics in Slovenia over time using the data on the infected individuals in Slovenia. For modeling the temporal dynamics of the population of infected individuals, we use a Kermack-McKendrick variant of the SIR epidemiological model. We fit the model parameters to the data using the modeling tool ProBMoT. In turn, we use the model to simulate and predict the dynamics of the infected population in the future. From the predicted dynamics, we can infer the expected time point of the infection peak, the number of infected individuals at the peak and the expected time point of the epidemics demise.

The model

The Kermack-McKendrick variant of the SIR model of the temporal spread of the infectuous disease in a closed, homogeneous population of individuals. It comprises three differential equations modeling the change of the three variables S, I and R, corresponding to the size of the populations of susceptible (S), infected (I) and recovered (R) individuals: \[ \frac{d S}{d t} = - \beta S I \\ \frac{d I}{d t} = \beta S I - \gamma I \\ \frac{d R}{d t} = \gamma I . \] The two constant parameters of \(\beta\) and \(\gamma\) represent the rates of infection and recovery, respectively.

Given the population sizes at the initial time point \(t_0\), \(S(t_0)\), \(I(t_0)\) and \(R(t_0)\), along with the values of \(\beta\) and \(\gamma\), we can simulate the dynamical change of the three populations through time. At any simulation time point \(t\), the sum \(S(t) + I(t) + R(t)\) is constant and equals the size of the whole population.

Fitting the model to the data

The data used for fitting the model comprises the time-series corresponding to the dynamic change of the number of infected individuals in Slovenia from 14th of March to the current date obtained from the Covid-19 sledilnik Website. After the initial experiments on these dates, we realized that the trend of the time-series of the number of infected individuals changed notably on 14th of March, when Slovene government revised the testing policy. After the initial set of preliminary experiment, we decided to trim the initial time-series, so they start on 14th of March, when the revised testing policy has been implemented.

To obtain the values of the model parameters \(\beta\) and \(\gamma\), we fit the model agains the observations of the number of infected individuals in Slovenia. To this end, we use the ProBMoT tool for data- and knowledge-driven modeling of dynmical systems. ProBMoT formulates the fitting of the model parameters to observed data as a task of numerical optimization, where the objective is to minimize the discrepancy between the observations \(I\) and simulated values \(\hat{I}\) of the size of the infected population. The discrepancy is measured using the standard root-mean-square-error (RMSE):

\[ {RMSE} = \sqrt{ \frac{1}{n} \sum _{t = t_0} ^{t_{n-1}} (I(t) - \hat{I}(t))^2}, \] where \(n\) is the number of observations at the time points \(t_0, t_1, \ldots t_{n-1}\). Note that \(RMSE\) is measured using the simulated behavior of the model \(\hat{y}\): ProBMoT simulates the SIR model using the CVODE solver of ordinary differential equations as implemented in the Sundials suite.

Beside the model parameters \(\beta\) and \(\gamma\), we also treat the three population sizes at the initial time point \(t_0\) as free parameters to be fitted against the observations. Thus, the parameter fitting of the SIR model leads to a five-dimensional numerical optimization problem. To solve it, ProBMoT employs the Differential Evolution algorithm with standard settings and a population size of 100. The obtained solution of the optimization problem assigns values to the fitted parameters that lead to the minimal RMSE discrepancy between the observations and the simulations.

Simulating the model

Once we fit the values of the initial population sizes and the two rate parameters, we can simulate the model beyond the last observation point \(t_{n-1}\) and therefore obtain prediction of the infection dynamics.

However, the observations are severely limited. First, we observe only few initial points at the very beginning of the epidemics with the (rapidly) growing size of the population of infected individuals. Second, the observations are based on a very limited sample of individuals that have been tested. On such a small set of observations, we face a high risk of overfitting. While the bias component of the fitting error can be kept at bay by assuming the SIR model, the variance of the parameter estimates is out of control.

To account for the high variance, of the parameter estimates, we perform a bootstrap simulation of the model as opposed to a single model simulation with the optimally fitted parameter values. The bootstrap simulation procedure samples the parameter values in two ways. First, we sample all the parameter values considered by the Differential Evolution algorithm during the optimization: given the algorithm settings, 2,000 evaluations are performed. We constrain the sampling to those parameter values that lead to RMSE, which is within a 25% margin of the RMSE of the optimal parameter values, i.e., lies within the interval \([RMSE_{opt}, RMSE_{opt} \cdot 1.25]\), where \({RMSE}_{opt}\) is the error obtained with the optimal parameter values.

Second, given this initial set of parameter values, we sample their neighborhoods from the Gaussian distribution \(N(p_0, \sigma_p)\), where \(p_0\) and \(\sigma_p\) are estimated from the ProBMoT evaluations selected in the first phase. Again, we constrain the sampling to those parameter values that lead to RMSE, which is less than a half of the RMSE of the simplest model that predicts the mean of the observed values.

For each sample of parameter values, we simulate the model for a period of time from the 14th of March 2020 to the 1st of July 2020. The simulations are aggregated using minimal and maximal simulated values at each time point leading to the graph in Figure 1.

Figure 1: The bootstrap simulation (red polygon) of the SIR model fitted to the observations of the number of infected individuals in Slovenia from 14th of March to 16th of April 2020 (black circles). The solid black line within the polygon depicts the simulation of the model with optimal parameter values (lowest RMSE).

Figure 1: The bootstrap simulation (red polygon) of the SIR model fitted to the observations of the number of infected individuals in Slovenia from 14th of March to 16th of April 2020 (black circles). The solid black line within the polygon depicts the simulation of the model with optimal parameter values (lowest RMSE).

Analysis of the simulations

From the simulations, we would like to predict two important time points of the epidemics. The first is the time position of the extreme size of the infected population, which we refer to as peak. The second is the time point of the epidemics demise, i.e., a time point after the peak, when the infected population size diminishes to at most 10 infected individuals.

When considering the peak, both, the magnitude and the time point of the peak are of interest. The series of figures 2a-k and 3a-k (later in the Appendix) depict the distribution of the predicted peak time points and the predicted peak magnitudes in the bootstraped simulations of the updated models. After the first five updates of the model, we put the predictions into perspective in Figures 2 and 3.

Figure 2: Temporal change of the predicted peak time point with the model updates: the black line corresponds to the median predictions, while the red polygon is based on the first and the thirth quartile of the predictions.

Figure 2: Temporal change of the predicted peak time point with the model updates: the black line corresponds to the median predictions, while the red polygon is based on the first and the thirth quartile of the predictions.

MMajority of the bootstraped simulations predict the median time point of the peak to be between the 8th and 13th of April. The model updates in the beginning of April stabilized the prediction of the median value on 10th of April, than slid down towards the 8th of April and got back to the 13th of April.

This still might be considered an optimistic estimate since the observed size of the infected population is unrealistically small due to the policy of limited, non-systematic testing for Covid-19 in Slovenia. Note also that the model learned from data staring at 4th of March lead to even more optimistic estimates. In particular, due to the change of the testing policy in mid March, the observed dynamics of the number of infected individuals has slowed down, which leads to smaller estimates of the infection rate, thus leading to early peak estimate. Which was the reason we have trimmed the training data of the model so it starts on 14th of March, the date when the revised testing policy was introduced.

On the other hand, note that the number of recovered individuals in Slovenia is reported to be constant (16) for more than 10 days in a row. This means, that the status of some of the infected individuals is not being updated, once an individual is registered as infected, it is not clear whether and when his/her status is being updated to recovered. This means, that, despite the obvious inconsistency with the empirical data, the model might have correctly predicted the peak of the number of infected individuals to be between 9th and 12th of April.

Data update on 14th of April: the data on number of recovered individuals was revised for the whole period from 4th to 14th of April, so the numebr of recovered individuals in the whole period is 26, as oposed to 16, the number before the update. Despite this abrupt data update, the model predictions are still stable: the median preicted time point of the peak is still between 12th and 13th of April.

Figure 3: Temporal change of the predicted peak magnitude with the model updates: the black line corresponds to the median predictions, while the red polygon is based on the first and the thirth quartile of the predictions.

Figure 3: Temporal change of the predicted peak magnitude with the model updates: the black line corresponds to the median predictions, while the red polygon is based on the first and the thirth quartile of the predictions.

With the model updates, the median predictions of the magnitude of the peaks vary between 900 and 1,200. After the initial decrease observed in the March updates, the median prediction is quite stable and varies between 950 and 1,100, with a slight increase to more than 1,000 towards the end of the update period: current median prediction being 1,086. Note that this is definitely optimistic, given that the predictions are models learned from data based on relatively modest rates of testing in Slovenia. Note also, that the current median prediction is slightly smaller than the observed number of the infected individuals.

Note again, that, despite the obvious inconsistency with the empirical data, the model might have still correctly predicted the magnitude of the magnitude of the peak of the number of infected individuals. Despite the abrupt data update and revision on 14th of April, the prediction of the updated model remain stable showing a slight increasing trend in the most recent updates.

Figure 4: Temporal change of the predicted time point of the epidemic demise with the model updates.

Figure 4: Temporal change of the predicted time point of the epidemic demise with the model updates.

Figure 4 depicts the prediction of the time point of the epidemics demise in Slovenia. Majority of the bootstraped simulations predict that the epidemic demise is to be expected by mid June with a median varying between 4th and 13th of June. The prediction trend at the beginning of April pointed towards earlier dates in the first half of June with an increase towards the 16th of June with the most recent model updates. For the reasons similar to the ones outlined above, this estimate tend to be optimistically premature as well.

Figure 5: Temporal change of the epidemiological threshold R_0 with the model updates: the black line corresponds to the median vlues, while the red polygon is based on the first and the thirth quartile.

Figure 5: Temporal change of the epidemiological threshold \(R_0\) with the model updates: the black line corresponds to the median vlues, while the red polygon is based on the first and the thirth quartile.

Finally, Figure 5 depicts the change of the epidemiological threshold \(R_0\), i.e., the number of individuals infected by contact with a single infected person before her/his recovery. The median value of \(R_0\) monotonlically decreased with the early model updates, which is a plausible consequence of the introduction of the social distancing measures. With the later updates the value stabilized at values lower than 1.03, the medeain value of 1.0297 being predicted with the last model update.

Notes

Why this simple variant of SIR (and not, e.g., SEIR or more complex ones)? Because it is simple and has two parameters only, which we have to fit against a very limited amount of data. The variance of the parameter fit is high enough even with these two parameters, fitting complex models with higher number of parameters is out of scope in this situation.

Parameter values are out of the usual ranges. The values of both \(\beta N\) and \(\gamma\) vary between 3 and 3.5, which is obviously out of the prescribed range, especially the value of \(\gamma\) which should be at most 1. Note that this is an artifact of the simple model being used. The learned parameter values also compensate for the bias in the measurements, especially the unrealistically small measured number of the number of infected individuals, which is the consequence of the non-systematic testing policy in Slovenia. Note however, that the ratio of \(\beta N / \gamma\) has a pretty steady estimated value between 1.02 and 1.04, which is realistic.

Appendix

Simulation of the previous model updates

Figure 1a: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 29th of March 2020.

Figure 1a: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 29th of March 2020.

Figure 1b: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 30th of March 2020.

Figure 1b: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 30th of March 2020.

Figure 1c: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 31st of March 2020.

Figure 1c: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 31st of March 2020.

Figure 1d: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 1st of April 2020.

Figure 1d: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 1st of April 2020.

Figure 1e: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 2nd of April 2020.

Figure 1e: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 2nd of April 2020.

Figure 1f: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 3rd of April 2020.

Figure 1f: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 3rd of April 2020.

Figure 1g: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 4th of April 2020.

Figure 1g: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 4th of April 2020.

Figure 1h: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 5th of April 2020.

Figure 1h: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 5th of April 2020.

Figure 1i: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 6th of April 2020.

Figure 1i: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 6th of April 2020.

Figure 1j: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 7th of April 2020.

Figure 1j: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 7th of April 2020.

Figure 1k: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 8th of April 2020.

Figure 1k: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 8th of April 2020.

Figure 1l: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 9th of April 2020.

Figure 1l: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 9th of April 2020.

Figure 1m: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 10th of April 2020.

Figure 1m: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 10th of April 2020.

Figure 1n: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 11th of April 2020.

Figure 1n: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 11th of April 2020.

Figure 1o: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 12th of April 2020.

Figure 1o: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 12th of April 2020.

Figure 1p: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 13th of April 2020.

Figure 1p: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 13th of April 2020.

Figure 1q: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 14th of April 2020.

Figure 1q: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 14th of April 2020.

Figure 1r: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 15th of April 2020.

Figure 1r: Bootstrap simulation of the model updated with the number of infected individuals in Slovenia up to 15th of April 2020.

What to do next?


This is an R Markdown Notebook. The first version of this report was prepared on 31st of March 2020. The last update took place on 17th of April 2020. Modeling and simulation experiments performed by Nikola Simidjievski, Matej Petković and Ljupčo Todorovski.

LS0tCnRpdGxlOiAiTW9kZWxpbmcgdGhlIENPVklELTE5IEVwaWRlbWljcyBpbiBTbG92ZW5pYSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCgpXZSBhaW0gaGVyZSBhdCBtb2RlbGluZyB0aGUgc3ByZWFkIG9mIHRoZSBDT1ZJRC0xOSBlcGlkZW1pY3MgaW4gU2xvdmVuaWEgb3ZlciB0aW1lIHVzaW5nIHRoZSBkYXRhIG9uIHRoZSBpbmZlY3RlZCBpbmRpdmlkdWFscyBpbiBTbG92ZW5pYS4gRm9yIG1vZGVsaW5nIHRoZSB0ZW1wb3JhbCBkeW5hbWljcyBvZiB0aGUgcG9wdWxhdGlvbiBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscywgd2UgdXNlIGEgW0tlcm1hY2stTWNLZW5kcmlja10oaHR0cHM6Ly9tYXRod29ybGQud29sZnJhbS5jb20vS2VybWFjay1NY0tlbmRyaWNrTW9kZWwuaHRtbCkgdmFyaWFudCBvZiB0aGUgW1NJUiBlcGlkZW1pb2xvZ2ljYWwgbW9kZWxdKGh0dHBzOi8vbWF0aHdvcmxkLndvbGZyYW0uY29tL1NJUk1vZGVsLmh0bWwpLiBXZSBmaXQgdGhlIG1vZGVsIHBhcmFtZXRlcnMgdG8gdGhlIGRhdGEgdXNpbmcgdGhlIG1vZGVsaW5nIHRvb2wgW1Byb0JNb1RdKGh0dHA6Ly9wcm9ibW90Lmlqcy5zaS8pLiBJbiB0dXJuLCB3ZSB1c2UgdGhlIG1vZGVsIHRvIHNpbXVsYXRlIGFuZCBwcmVkaWN0IHRoZSBkeW5hbWljcyBvZiB0aGUgaW5mZWN0ZWQgcG9wdWxhdGlvbiBpbiB0aGUgZnV0dXJlLiBGcm9tIHRoZSBwcmVkaWN0ZWQgZHluYW1pY3MsIHdlIGNhbiBpbmZlciB0aGUgZXhwZWN0ZWQgdGltZSBwb2ludCBvZiB0aGUgaW5mZWN0aW9uIHBlYWssIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgYXQgdGhlIHBlYWsgYW5kIHRoZSBleHBlY3RlZCB0aW1lIHBvaW50IG9mIHRoZSBlcGlkZW1pY3MgZGVtaXNlLgoKCiMgVGhlIG1vZGVsCgpUaGUgW0tlcm1hY2stTWNLZW5kcmlja10oaHR0cHM6Ly9tYXRod29ybGQud29sZnJhbS5jb20vS2VybWFjay1NY0tlbmRyaWNrTW9kZWwuaHRtbCkgdmFyaWFudCBvZiB0aGUgU0lSIG1vZGVsIG9mIHRoZSB0ZW1wb3JhbCBzcHJlYWQgb2YgdGhlIGluZmVjdHVvdXMgZGlzZWFzZSBpbiBhIGNsb3NlZCwgaG9tb2dlbmVvdXMgcG9wdWxhdGlvbiBvZiBpbmRpdmlkdWFscy4gSXQgY29tcHJpc2VzIHRocmVlIGRpZmZlcmVudGlhbCBlcXVhdGlvbnMgbW9kZWxpbmcgdGhlIGNoYW5nZSBvZiB0aGUgdGhyZWUgdmFyaWFibGVzIFMsIEkgYW5kIFIsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNpemUgb2YgdGhlIHBvcHVsYXRpb25zIG9mIHN1c2NlcHRpYmxlIChTKSwgaW5mZWN0ZWQgKEkpIGFuZCByZWNvdmVyZWQgKFIpIGluZGl2aWR1YWxzOgokJApcZnJhY3tkIFN9e2QgdH0gPSAtIFxiZXRhIFMgSSBcXApcZnJhY3tkIEl9e2QgdH0gPSBcYmV0YSBTIEkgLSBcZ2FtbWEgSSBcXApcZnJhY3tkIFJ9e2QgdH0gPSBcZ2FtbWEgSSAuCiQkClRoZSB0d28gY29uc3RhbnQgcGFyYW1ldGVycyBvZiAkXGJldGEkIGFuZCAkXGdhbW1hJCByZXByZXNlbnQgdGhlIHJhdGVzIG9mIGluZmVjdGlvbiBhbmQgcmVjb3ZlcnksIHJlc3BlY3RpdmVseS4KCkdpdmVuIHRoZSBwb3B1bGF0aW9uIHNpemVzIGF0IHRoZSBpbml0aWFsIHRpbWUgcG9pbnQgJHRfMCQsICRTKHRfMCkkLCAkSSh0XzApJCBhbmQgJFIodF8wKSQsIGFsb25nIHdpdGggdGhlIHZhbHVlcyBvZiAkXGJldGEkIGFuZCAkXGdhbW1hJCwgd2UgY2FuIHNpbXVsYXRlIHRoZSBkeW5hbWljYWwgY2hhbmdlIG9mIHRoZSB0aHJlZSBwb3B1bGF0aW9ucyB0aHJvdWdoIHRpbWUuIEF0IGFueSBzaW11bGF0aW9uIHRpbWUgcG9pbnQgJHQkLCB0aGUgc3VtICRTKHQpICsgSSh0KSArIFIodCkkIGlzIGNvbnN0YW50IGFuZCBlcXVhbHMgdGhlIHNpemUgb2YgdGhlIHdob2xlIHBvcHVsYXRpb24uCgoKIyBGaXR0aW5nIHRoZSBtb2RlbCB0byB0aGUgZGF0YQoKVGhlIGRhdGEgdXNlZCBmb3IgZml0dGluZyB0aGUgbW9kZWwgY29tcHJpc2VzIHRoZSB0aW1lLXNlcmllcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBkeW5hbWljIGNoYW5nZSBvZiB0aGUgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGluIFNsb3ZlbmlhIGZyb20gMTR0aCBvZiBNYXJjaCB0byB0aGUgY3VycmVudCBkYXRlIG9idGFpbmVkIGZyb20gdGhlIFtDb3ZpZC0xOSBzbGVkaWxuaWtdKGh0dHBzOi8vY292aWQtMTkuc2xlZGlsbmlrLm9yZy8pIFdlYnNpdGUuIEFmdGVyIHRoZSBpbml0aWFsIGV4cGVyaW1lbnRzIG9uIHRoZXNlIGRhdGVzLCB3ZSByZWFsaXplZCB0aGF0IHRoZSB0cmVuZCBvZiB0aGUgdGltZS1zZXJpZXMgb2YgdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBjaGFuZ2VkIG5vdGFibHkgb24gMTR0aCBvZiBNYXJjaCwgd2hlbiBTbG92ZW5lIGdvdmVybm1lbnQgcmV2aXNlZCB0aGUgdGVzdGluZyBwb2xpY3kuIEFmdGVyIHRoZSBpbml0aWFsIHNldCBvZiBwcmVsaW1pbmFyeSBleHBlcmltZW50LCB3ZSBkZWNpZGVkIHRvIHRyaW0gdGhlIGluaXRpYWwgdGltZS1zZXJpZXMsIHNvIHRoZXkgc3RhcnQgb24gMTR0aCBvZiBNYXJjaCwgd2hlbiB0aGUgcmV2aXNlZCB0ZXN0aW5nIHBvbGljeSBoYXMgYmVlbiBpbXBsZW1lbnRlZC4KCgpUbyBvYnRhaW4gdGhlIHZhbHVlcyBvZiB0aGUgbW9kZWwgcGFyYW1ldGVycyAkXGJldGEkIGFuZCAkXGdhbW1hJCwgd2UgZml0IHRoZSBtb2RlbCBhZ2FpbnMgdGhlIG9ic2VydmF0aW9ucyBvZiB0aGUgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGluIFNsb3ZlbmlhLiBUbyB0aGlzIGVuZCwgd2UgdXNlIHRoZSBbUHJvQk1vVF0oaHR0cDovL3Byb2Jtb3QuaWpzLnNpLykgdG9vbCBmb3IgZGF0YS0gYW5kIGtub3dsZWRnZS1kcml2ZW4gbW9kZWxpbmcgb2YgZHlubWljYWwgc3lzdGVtcy4gUHJvQk1vVCBmb3JtdWxhdGVzIHRoZSBmaXR0aW5nIG9mIHRoZSBtb2RlbCBwYXJhbWV0ZXJzIHRvIG9ic2VydmVkIGRhdGEgYXMgYSB0YXNrIG9mIG51bWVyaWNhbCBvcHRpbWl6YXRpb24sIHdoZXJlIHRoZSBvYmplY3RpdmUgaXMgdG8gbWluaW1pemUgdGhlIGRpc2NyZXBhbmN5IGJldHdlZW4gdGhlIG9ic2VydmF0aW9ucyAkSSQgYW5kIHNpbXVsYXRlZCB2YWx1ZXMgJFxoYXR7SX0kIG9mIHRoZSBzaXplIG9mIHRoZSBpbmZlY3RlZCBwb3B1bGF0aW9uLiBUaGUgZGlzY3JlcGFuY3kgaXMgbWVhc3VyZWQgdXNpbmcgdGhlIHN0YW5kYXJkIHJvb3QtbWVhbi1zcXVhcmUtZXJyb3IgKFJNU0UpOgoKJCQge1JNU0V9ID0gXHNxcnR7IFxmcmFjezF9e259IFxzdW0gX3t0ID0gdF8wfSBee3Rfe24tMX19IChJKHQpIC0gXGhhdHtJfSh0KSleMn0sICQkCndoZXJlICRuJCBpcyB0aGUgbnVtYmVyIG9mIG9ic2VydmF0aW9ucyBhdCB0aGUgdGltZSBwb2ludHMgJHRfMCwgdF8xLCBcbGRvdHMgdF97bi0xfSQuIE5vdGUgdGhhdCAkUk1TRSQgaXMgbWVhc3VyZWQgdXNpbmcgdGhlIHNpbXVsYXRlZCBiZWhhdmlvciBvZiB0aGUgbW9kZWwgJFxoYXR7eX0kOiBQcm9CTW9UIHNpbXVsYXRlcyB0aGUgU0lSIG1vZGVsIHVzaW5nIHRoZSBDVk9ERSBzb2x2ZXIgb2Ygb3JkaW5hcnkgZGlmZmVyZW50aWFsIGVxdWF0aW9ucyBhcyBpbXBsZW1lbnRlZCBpbiB0aGUgW1N1bmRpYWxzIHN1aXRlXShodHRwczovL2NvbXB1dGluZy5sbG5sLmdvdi9wcm9qZWN0cy9zdW5kaWFscykuCgpCZXNpZGUgdGhlIG1vZGVsIHBhcmFtZXRlcnMgJFxiZXRhJCBhbmQgJFxnYW1tYSQsIHdlIGFsc28gdHJlYXQgdGhlIHRocmVlIHBvcHVsYXRpb24gc2l6ZXMgYXQgdGhlIGluaXRpYWwgdGltZSBwb2ludCAkdF8wJCBhcyBmcmVlIHBhcmFtZXRlcnMgdG8gYmUgZml0dGVkIGFnYWluc3QgdGhlIG9ic2VydmF0aW9ucy4gVGh1cywgdGhlIHBhcmFtZXRlciBmaXR0aW5nIG9mIHRoZSBTSVIgbW9kZWwgbGVhZHMgdG8gYSBmaXZlLWRpbWVuc2lvbmFsIG51bWVyaWNhbCBvcHRpbWl6YXRpb24gcHJvYmxlbS4gVG8gc29sdmUgaXQsIFByb0JNb1QgZW1wbG95cyB0aGUgW0RpZmZlcmVudGlhbCBFdm9sdXRpb25dKGh0dHBzOi8vd3d3MS5pY3NpLmJlcmtlbGV5LmVkdS9+c3Rvcm4vY29kZS5odG1sKSBhbGdvcml0aG0gd2l0aCBzdGFuZGFyZCBzZXR0aW5ncyBhbmQgYSBwb3B1bGF0aW9uIHNpemUgb2YgMTAwLiBUaGUgb2J0YWluZWQgc29sdXRpb24gb2YgdGhlIG9wdGltaXphdGlvbiBwcm9ibGVtIGFzc2lnbnMgdmFsdWVzIHRvIHRoZSBmaXR0ZWQgcGFyYW1ldGVycyB0aGF0IGxlYWQgdG8gdGhlIG1pbmltYWwgUk1TRSBkaXNjcmVwYW5jeSBiZXR3ZWVuIHRoZSBvYnNlcnZhdGlvbnMgYW5kIHRoZSBzaW11bGF0aW9ucy4KCgojIFNpbXVsYXRpbmcgdGhlIG1vZGVsCgpPbmNlIHdlIGZpdCB0aGUgdmFsdWVzIG9mIHRoZSBpbml0aWFsIHBvcHVsYXRpb24gc2l6ZXMgYW5kIHRoZSB0d28gcmF0ZSBwYXJhbWV0ZXJzLCB3ZSBjYW4gc2ltdWxhdGUgdGhlIG1vZGVsIGJleW9uZCB0aGUgbGFzdCBvYnNlcnZhdGlvbiBwb2ludCAkdF97bi0xfSQgYW5kIHRoZXJlZm9yZSBvYnRhaW4gcHJlZGljdGlvbiBvZiB0aGUgaW5mZWN0aW9uIGR5bmFtaWNzLgoKSG93ZXZlciwgdGhlIG9ic2VydmF0aW9ucyBhcmUgc2V2ZXJlbHkgbGltaXRlZC4gRmlyc3QsIHdlIG9ic2VydmUgb25seSBmZXcgaW5pdGlhbCBwb2ludHMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSBlcGlkZW1pY3Mgd2l0aCB0aGUgKHJhcGlkbHkpIGdyb3dpbmcgc2l6ZSBvZiB0aGUgcG9wdWxhdGlvbiBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscy4gU2Vjb25kLCB0aGUgb2JzZXJ2YXRpb25zIGFyZSBiYXNlZCBvbiBhIHZlcnkgbGltaXRlZCBzYW1wbGUgb2YgaW5kaXZpZHVhbHMgdGhhdCBoYXZlIGJlZW4gdGVzdGVkLiBPbiBzdWNoIGEgc21hbGwgc2V0IG9mIG9ic2VydmF0aW9ucywgd2UgZmFjZSBhIGhpZ2ggcmlzayBvZiBvdmVyZml0dGluZy4gV2hpbGUgdGhlIGJpYXMgY29tcG9uZW50IG9mIHRoZSBmaXR0aW5nIGVycm9yIGNhbiBiZSBrZXB0IGF0IGJheSBieSBhc3N1bWluZyB0aGUgU0lSIG1vZGVsLCB0aGUgdmFyaWFuY2Ugb2YgdGhlIHBhcmFtZXRlciBlc3RpbWF0ZXMgaXMgb3V0IG9mIGNvbnRyb2wuCgpUbyBhY2NvdW50IGZvciB0aGUgaGlnaCB2YXJpYW5jZSwgb2YgdGhlIHBhcmFtZXRlciBlc3RpbWF0ZXMsIHdlIHBlcmZvcm0gYSBib290c3RyYXAgc2ltdWxhdGlvbiBvZiB0aGUgbW9kZWwgYXMgb3Bwb3NlZCB0byBhIHNpbmdsZSBtb2RlbCBzaW11bGF0aW9uIHdpdGggdGhlIG9wdGltYWxseSBmaXR0ZWQgcGFyYW1ldGVyIHZhbHVlcy4gVGhlIGJvb3RzdHJhcCBzaW11bGF0aW9uIHByb2NlZHVyZSBzYW1wbGVzIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGluIHR3byB3YXlzLiBGaXJzdCwgd2Ugc2FtcGxlIGFsbCB0aGUgcGFyYW1ldGVyIHZhbHVlcyBjb25zaWRlcmVkIGJ5IHRoZSBEaWZmZXJlbnRpYWwgRXZvbHV0aW9uIGFsZ29yaXRobSBkdXJpbmcgdGhlIG9wdGltaXphdGlvbjogZ2l2ZW4gdGhlIGFsZ29yaXRobSBzZXR0aW5ncywgMiwwMDAgZXZhbHVhdGlvbnMgYXJlIHBlcmZvcm1lZC4gV2UgY29uc3RyYWluIHRoZSBzYW1wbGluZyB0byB0aG9zZSBwYXJhbWV0ZXIgdmFsdWVzIHRoYXQgbGVhZCB0byBSTVNFLCB3aGljaCBpcyB3aXRoaW4gYSAyNSUgbWFyZ2luIG9mIHRoZSBSTVNFIG9mIHRoZSBvcHRpbWFsIHBhcmFtZXRlciB2YWx1ZXMsIGkuZS4sIGxpZXMgd2l0aGluIHRoZSBpbnRlcnZhbCAkW1JNU0Vfe29wdH0sIFJNU0Vfe29wdH0gXGNkb3QgMS4yNV0kLCB3aGVyZSAke1JNU0V9X3tvcHR9JCBpcyB0aGUgZXJyb3Igb2J0YWluZWQgd2l0aCB0aGUgb3B0aW1hbCBwYXJhbWV0ZXIgdmFsdWVzLgoKU2Vjb25kLCBnaXZlbiB0aGlzIGluaXRpYWwgc2V0IG9mIHBhcmFtZXRlciB2YWx1ZXMsIHdlIHNhbXBsZSB0aGVpciBuZWlnaGJvcmhvb2RzIGZyb20gdGhlIEdhdXNzaWFuIGRpc3RyaWJ1dGlvbiAkTihwXzAsIFxzaWdtYV9wKSQsIHdoZXJlICRwXzAkIGFuZCAkXHNpZ21hX3AkIGFyZSBlc3RpbWF0ZWQgZnJvbSB0aGUgUHJvQk1vVCBldmFsdWF0aW9ucyBzZWxlY3RlZCBpbiB0aGUgZmlyc3QgcGhhc2UuIEFnYWluLCB3ZSBjb25zdHJhaW4gdGhlIHNhbXBsaW5nIHRvIHRob3NlIHBhcmFtZXRlciB2YWx1ZXMgdGhhdCBsZWFkIHRvIFJNU0UsIHdoaWNoIGlzIGxlc3MgdGhhbiBhIGhhbGYgb2YgdGhlIFJNU0Ugb2YgdGhlIHNpbXBsZXN0IG1vZGVsIHRoYXQgcHJlZGljdHMgdGhlIG1lYW4gb2YgdGhlIG9ic2VydmVkIHZhbHVlcy4KCkZvciBlYWNoIHNhbXBsZSBvZiBwYXJhbWV0ZXIgdmFsdWVzLCB3ZSBzaW11bGF0ZSB0aGUgbW9kZWwgZm9yIGEgcGVyaW9kIG9mIHRpbWUgZnJvbSB0aGUgMTR0aCBvZiBNYXJjaCAyMDIwIHRvIHRoZSAxc3Qgb2YgSnVseSAyMDIwLiBUaGUgc2ltdWxhdGlvbnMgYXJlIGFnZ3JlZ2F0ZWQgdXNpbmcgbWluaW1hbCBhbmQgbWF4aW1hbCBzaW11bGF0ZWQgdmFsdWVzIGF0IGVhY2ggdGltZSBwb2ludCBsZWFkaW5nIHRvIHRoZSBncmFwaCBpbiBGaWd1cmUgMS4KCiFbRmlndXJlIDE6IFRoZSBib290c3RyYXAgc2ltdWxhdGlvbiAocmVkIHBvbHlnb24pIG9mIHRoZSBTSVIgbW9kZWwgZml0dGVkIHRvIHRoZSBvYnNlcnZhdGlvbnMgb2YgdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBpbiBTbG92ZW5pYSBmcm9tIDE0dGggb2YgTWFyY2ggdG8gMTZ0aCBvZiBBcHJpbCAyMDIwIChibGFjayBjaXJjbGVzKS4gVGhlIHNvbGlkIGJsYWNrIGxpbmUgd2l0aGluIHRoZSBwb2x5Z29uIGRlcGljdHMgdGhlIHNpbXVsYXRpb24gb2YgdGhlIG1vZGVsIHdpdGggb3B0aW1hbCBwYXJhbWV0ZXIgdmFsdWVzIChsb3dlc3QgUk1TRSkuXSguL2dyYXBocy9zaW0tMjAwMzE0LTIwMDQxNi5wbmcpCgoKIyBBbmFseXNpcyBvZiB0aGUgc2ltdWxhdGlvbnMKCkZyb20gdGhlIHNpbXVsYXRpb25zLCB3ZSB3b3VsZCBsaWtlIHRvIHByZWRpY3QgdHdvIGltcG9ydGFudCB0aW1lIHBvaW50cyBvZiB0aGUgZXBpZGVtaWNzLiBUaGUgZmlyc3QgaXMgdGhlIHRpbWUgcG9zaXRpb24gb2YgdGhlIGV4dHJlbWUgc2l6ZSBvZiB0aGUgaW5mZWN0ZWQgcG9wdWxhdGlvbiwgd2hpY2ggd2UgcmVmZXIgdG8gYXMgcGVhay4gVGhlIHNlY29uZCBpcyB0aGUgdGltZSBwb2ludCBvZiB0aGUgZXBpZGVtaWNzIGRlbWlzZSwgaS5lLiwgYSB0aW1lIHBvaW50IGFmdGVyIHRoZSBwZWFrLCB3aGVuIHRoZSBpbmZlY3RlZCBwb3B1bGF0aW9uIHNpemUgZGltaW5pc2hlcyB0byBhdCBtb3N0IDEwIGluZmVjdGVkIGluZGl2aWR1YWxzLgoKV2hlbiBjb25zaWRlcmluZyB0aGUgcGVhaywgYm90aCwgdGhlIG1hZ25pdHVkZSBhbmQgdGhlIHRpbWUgcG9pbnQgb2YgdGhlIHBlYWsgYXJlIG9mIGludGVyZXN0LiBUaGUgc2VyaWVzIG9mIGZpZ3VyZXMgMmEtayBhbmQgM2EtayAobGF0ZXIgaW4gdGhlIEFwcGVuZGl4KSBkZXBpY3QgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgcHJlZGljdGVkIHBlYWsgdGltZSBwb2ludHMgYW5kIHRoZSBwcmVkaWN0ZWQgcGVhayBtYWduaXR1ZGVzIGluIHRoZSBib290c3RyYXBlZCBzaW11bGF0aW9ucyBvZiB0aGUgdXBkYXRlZCBtb2RlbHMuIEFmdGVyIHRoZSBmaXJzdCBmaXZlIHVwZGF0ZXMgb2YgdGhlIG1vZGVsLCB3ZSBwdXQgdGhlIHByZWRpY3Rpb25zIGludG8gcGVyc3BlY3RpdmUgaW4gRmlndXJlcyAyIGFuZCAzLgoKIVtGaWd1cmUgMjogVGVtcG9yYWwgY2hhbmdlIG9mIHRoZSBwcmVkaWN0ZWQgX19wZWFrIHRpbWUgcG9pbnRfXyB3aXRoIHRoZSBtb2RlbCB1cGRhdGVzOiB0aGUgYmxhY2sgbGluZSBjb3JyZXNwb25kcyB0byB0aGUgbWVkaWFuIHByZWRpY3Rpb25zLCB3aGlsZSB0aGUgcmVkIHBvbHlnb24gaXMgYmFzZWQgb24gdGhlIGZpcnN0IGFuZCB0aGUgdGhpcnRoIHF1YXJ0aWxlIG9mIHRoZSBwcmVkaWN0aW9ucy5dKC4vZ3JhcGhzL3BlYWstdHMtc3ludGgucG5nKQoKTU1ham9yaXR5IG9mIHRoZSBib290c3RyYXBlZCBzaW11bGF0aW9ucyBwcmVkaWN0IHRoZSBtZWRpYW4gdGltZSBwb2ludCBvZiB0aGUgcGVhayB0byBiZSBiZXR3ZWVuIHRoZSA4dGggYW5kIDEzdGggb2YgQXByaWwuIFRoZSBtb2RlbCB1cGRhdGVzIGluIHRoZSBiZWdpbm5pbmcgb2YgQXByaWwgc3RhYmlsaXplZCB0aGUgcHJlZGljdGlvbiBvZiB0aGUgbWVkaWFuIHZhbHVlIG9uIDEwdGggb2YgQXByaWwsIHRoYW4gc2xpZCBkb3duIHRvd2FyZHMgdGhlIDh0aCBvZiBBcHJpbCBhbmQgZ290IGJhY2sgdG8gdGhlIF9fMTN0aCBvZiBBcHJpbF9fLgoKVGhpcyBzdGlsbCBtaWdodCBiZSBjb25zaWRlcmVkIGFuIG9wdGltaXN0aWMgZXN0aW1hdGUgc2luY2UgdGhlIG9ic2VydmVkIHNpemUgb2YgdGhlIGluZmVjdGVkIHBvcHVsYXRpb24gaXMgdW5yZWFsaXN0aWNhbGx5IHNtYWxsIGR1ZSB0byB0aGUgcG9saWN5IG9mIGxpbWl0ZWQsIG5vbi1zeXN0ZW1hdGljIHRlc3RpbmcgZm9yIENvdmlkLTE5IGluIFNsb3ZlbmlhLiBOb3RlIGFsc28gdGhhdCB0aGUgbW9kZWwgbGVhcm5lZCBmcm9tIGRhdGEgc3RhcmluZyBhdCA0dGggb2YgTWFyY2ggbGVhZCB0byBldmVuIG1vcmUgb3B0aW1pc3RpYyBlc3RpbWF0ZXMuIEluIHBhcnRpY3VsYXIsIGR1ZSB0byB0aGUgY2hhbmdlIG9mIHRoZSB0ZXN0aW5nIHBvbGljeSBpbiBtaWQgTWFyY2gsIHRoZSBvYnNlcnZlZCBkeW5hbWljcyBvZiB0aGUgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGhhcyBzbG93ZWQgZG93biwgd2hpY2ggbGVhZHMgdG8gc21hbGxlciBlc3RpbWF0ZXMgb2YgdGhlIGluZmVjdGlvbiByYXRlLCB0aHVzIGxlYWRpbmcgdG8gZWFybHkgcGVhayBlc3RpbWF0ZS4gV2hpY2ggd2FzIHRoZSByZWFzb24gd2UgaGF2ZSB0cmltbWVkIHRoZSB0cmFpbmluZyBkYXRhIG9mIHRoZSBtb2RlbCBzbyBpdCBzdGFydHMgb24gMTR0aCBvZiBNYXJjaCwgdGhlIGRhdGUgd2hlbiB0aGUgcmV2aXNlZCB0ZXN0aW5nIHBvbGljeSB3YXMgaW50cm9kdWNlZC4KCl9fT24gdGhlIG90aGVyIGhhbmQsIG5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIHJlY292ZXJlZCBpbmRpdmlkdWFscyBpbiBTbG92ZW5pYSBpcyByZXBvcnRlZCB0byBiZSBjb25zdGFudCAoMTYpIGZvciBtb3JlIHRoYW4gMTAgZGF5cyBpbiBhIHJvd19fLiBUaGlzIG1lYW5zLCB0aGF0IHRoZSBzdGF0dXMgb2Ygc29tZSBvZiB0aGUgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaXMgbm90IGJlaW5nIHVwZGF0ZWQsIG9uY2UgYW4gaW5kaXZpZHVhbCBpcyByZWdpc3RlcmVkIGFzIGluZmVjdGVkLCBpdCBpcyBub3QgY2xlYXIgd2hldGhlciBhbmQgd2hlbiBoaXMvaGVyIHN0YXR1cyBpcyBiZWluZyB1cGRhdGVkIHRvIHJlY292ZXJlZC4gX19UaGlzIG1lYW5zLCB0aGF0LCBkZXNwaXRlIHRoZSBvYnZpb3VzIGluY29uc2lzdGVuY3kgd2l0aCB0aGUgZW1waXJpY2FsIGRhdGEsIHRoZSBtb2RlbCBtaWdodCBoYXZlIGNvcnJlY3RseSBwcmVkaWN0ZWQgdGhlIHBlYWsgb2YgdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyB0byBiZSBiZXR3ZWVuIDl0aCBhbmQgMTJ0aCBvZiBBcHJpbF9fLgoKX19EYXRhIHVwZGF0ZSBvbiAxNHRoIG9mIEFwcmlsX186IHRoZSBkYXRhIG9uIG51bWJlciBvZiByZWNvdmVyZWQgaW5kaXZpZHVhbHMgd2FzIHJldmlzZWQgZm9yIHRoZSB3aG9sZSBwZXJpb2QgZnJvbSA0dGggdG8gMTR0aCBvZiBBcHJpbCwgc28gdGhlIG51bWViciBvZiByZWNvdmVyZWQgaW5kaXZpZHVhbHMgaW4gdGhlIHdob2xlIHBlcmlvZCBpcyAyNiwgYXMgb3Bvc2VkIHRvIDE2LCB0aGUgbnVtYmVyIGJlZm9yZSB0aGUgdXBkYXRlLiBEZXNwaXRlIHRoaXMgYWJydXB0IGRhdGEgdXBkYXRlLCB0aGUgbW9kZWwgcHJlZGljdGlvbnMgYXJlIHN0aWxsIHN0YWJsZTogdGhlIG1lZGlhbiBwcmVpY3RlZCB0aW1lIHBvaW50IG9mIHRoZSBwZWFrIGlzIHN0aWxsIGJldHdlZW4gX18xMnRoIGFuZCAxM3RoIG9mIEFwcmlsX18uCgohW0ZpZ3VyZSAzOiBUZW1wb3JhbCBjaGFuZ2Ugb2YgdGhlIHByZWRpY3RlZCBfX3BlYWsgbWFnbml0dWRlX18gd2l0aCB0aGUgbW9kZWwgdXBkYXRlczogdGhlIGJsYWNrIGxpbmUgY29ycmVzcG9uZHMgdG8gdGhlIG1lZGlhbiBwcmVkaWN0aW9ucywgd2hpbGUgdGhlIHJlZCBwb2x5Z29uIGlzIGJhc2VkIG9uIHRoZSBmaXJzdCBhbmQgdGhlIHRoaXJ0aCBxdWFydGlsZSBvZiB0aGUgcHJlZGljdGlvbnMuXSguL2dyYXBocy9wZWFrLW1zLXN5bnRoLnBuZykKCldpdGggdGhlIG1vZGVsIHVwZGF0ZXMsIHRoZSBtZWRpYW4gcHJlZGljdGlvbnMgb2YgdGhlIG1hZ25pdHVkZSBvZiB0aGUgcGVha3MgdmFyeSBiZXR3ZWVuIDkwMCBhbmQgMSwyMDAuIEFmdGVyIHRoZSBpbml0aWFsIGRlY3JlYXNlIG9ic2VydmVkIGluIHRoZSBNYXJjaCB1cGRhdGVzLCB0aGUgbWVkaWFuIHByZWRpY3Rpb24gaXMgcXVpdGUgc3RhYmxlIGFuZCB2YXJpZXMgYmV0d2VlbiA5NTAgYW5kIDEsMTAwLCB3aXRoIGEgc2xpZ2h0IGluY3JlYXNlIHRvIG1vcmUgdGhhbiAxLDAwMCB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIHVwZGF0ZSBwZXJpb2Q6IF9fY3VycmVudCBtZWRpYW4gcHJlZGljdGlvbiBiZWluZyAxLDA4Nl9fLiBOb3RlIHRoYXQgdGhpcyBpcyBkZWZpbml0ZWx5IG9wdGltaXN0aWMsIGdpdmVuIHRoYXQgdGhlIHByZWRpY3Rpb25zIGFyZSBtb2RlbHMgbGVhcm5lZCBmcm9tIGRhdGEgYmFzZWQgb24gcmVsYXRpdmVseSBtb2Rlc3QgcmF0ZXMgb2YgdGVzdGluZyBpbiBTbG92ZW5pYS4gTm90ZSBhbHNvLCB0aGF0IHRoZSBjdXJyZW50IG1lZGlhbiBwcmVkaWN0aW9uIGlzIHNsaWdodGx5IHNtYWxsZXIgdGhhbiB0aGUgb2JzZXJ2ZWQgbnVtYmVyIG9mIHRoZSBpbmZlY3RlZCBpbmRpdmlkdWFscy4KCk5vdGUgYWdhaW4sIHRoYXQsIGRlc3BpdGUgdGhlIG9idmlvdXMgaW5jb25zaXN0ZW5jeSB3aXRoIHRoZSBlbXBpcmljYWwgZGF0YSwgdGhlIG1vZGVsIG1pZ2h0IGhhdmUgc3RpbGwgY29ycmVjdGx5IHByZWRpY3RlZCB0aGUgbWFnbml0dWRlIG9mIHRoZSBtYWduaXR1ZGUgb2YgdGhlIHBlYWsgb2YgdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscy4gX19EZXNwaXRlIHRoZSBhYnJ1cHQgZGF0YSB1cGRhdGUgYW5kIHJldmlzaW9uIG9uIDE0dGggb2YgQXByaWwsIHRoZSBwcmVkaWN0aW9uIG9mIHRoZSB1cGRhdGVkIG1vZGVsIHJlbWFpbiBzdGFibGUgc2hvd2luZyBhIHNsaWdodCBpbmNyZWFzaW5nIHRyZW5kIGluIHRoZSBtb3N0IHJlY2VudCB1cGRhdGVzX18uCgohW0ZpZ3VyZSA0OiBUZW1wb3JhbCBjaGFuZ2Ugb2YgdGhlIHByZWRpY3RlZCBfX3RpbWUgcG9pbnQgb2YgdGhlIGVwaWRlbWljIGRlbWlzZV9fIHdpdGggdGhlIG1vZGVsIHVwZGF0ZXMuXSguL2dyYXBocy9lbmRzLXN5bnRoLnBuZykKCkZpZ3VyZSA0IGRlcGljdHMgdGhlIHByZWRpY3Rpb24gb2YgdGhlIHRpbWUgcG9pbnQgb2YgdGhlIGVwaWRlbWljcyBkZW1pc2UgaW4gU2xvdmVuaWEuIE1ham9yaXR5IG9mIHRoZSBib290c3RyYXBlZCBzaW11bGF0aW9ucyBwcmVkaWN0IHRoYXQgdGhlIGVwaWRlbWljIGRlbWlzZSBpcyB0byBiZSBleHBlY3RlZCBieSBtaWQgSnVuZSB3aXRoIGEgbWVkaWFuIHZhcnlpbmcgYmV0d2VlbiA0dGggYW5kIDEzdGggb2YgSnVuZS4gVGhlIHByZWRpY3Rpb24gdHJlbmQgYXQgdGhlIGJlZ2lubmluZyBvZiBBcHJpbCBwb2ludGVkICBfX3Rvd2FyZHMgZWFybGllciBkYXRlcyBpbiB0aGUgZmlyc3QgaGFsZiBvZiBKdW5lIHdpdGggYW4gaW5jcmVhc2UgdG93YXJkcyB0aGUgMTZ0aCBvZiBKdW5lX18gd2l0aCB0aGUgbW9zdCByZWNlbnQgbW9kZWwgdXBkYXRlcy4gRm9yIHRoZSByZWFzb25zIHNpbWlsYXIgdG8gdGhlIG9uZXMgb3V0bGluZWQgYWJvdmUsIHRoaXMgZXN0aW1hdGUgdGVuZCB0byBiZSBvcHRpbWlzdGljYWxseSBwcmVtYXR1cmUgYXMgd2VsbC4KCiFbRmlndXJlIDU6IFRlbXBvcmFsIGNoYW5nZSBvZiBfX3RoZSBlcGlkZW1pb2xvZ2ljYWwgdGhyZXNob2xkICRSXzAkX18gd2l0aCB0aGUgbW9kZWwgdXBkYXRlczogdGhlIGJsYWNrIGxpbmUgY29ycmVzcG9uZHMgdG8gdGhlIG1lZGlhbiB2bHVlcywgd2hpbGUgdGhlIHJlZCBwb2x5Z29uIGlzIGJhc2VkIG9uIHRoZSBmaXJzdCBhbmQgdGhlIHRoaXJ0aCBxdWFydGlsZS5dKC4vZ3JhcGhzL3IwLXN5bnRoLnBuZykKCkZpbmFsbHksIEZpZ3VyZSA1IGRlcGljdHMgdGhlIGNoYW5nZSBvZiB0aGUgZXBpZGVtaW9sb2dpY2FsIHRocmVzaG9sZCAkUl8wJCwgaS5lLiwgIHRoZSBudW1iZXIgb2YgaW5kaXZpZHVhbHMgaW5mZWN0ZWQgYnkgY29udGFjdCB3aXRoIGEgc2luZ2xlIGluZmVjdGVkIHBlcnNvbiBiZWZvcmUgaGVyL2hpcyByZWNvdmVyeS4gVGhlIG1lZGlhbiB2YWx1ZSBvZiAkUl8wJCBtb25vdG9ubGljYWxseSBkZWNyZWFzZWQgd2l0aCB0aGUgZWFybHkgbW9kZWwgdXBkYXRlcywgd2hpY2ggaXMgYSBwbGF1c2libGUgY29uc2VxdWVuY2Ugb2YgdGhlIGludHJvZHVjdGlvbiBvZiB0aGUgc29jaWFsIGRpc3RhbmNpbmcgbWVhc3VyZXMuIFdpdGggdGhlIGxhdGVyIHVwZGF0ZXMgdGhlIHZhbHVlIHN0YWJpbGl6ZWQgYXQgdmFsdWVzIGxvd2VyIHRoYW4gMS4wMywgdGhlIG1lZGVhaW4gdmFsdWUgb2YgX18xLjAyOTcgYmVpbmcgcHJlZGljdGVkIHdpdGggdGhlIGxhc3QgbW9kZWwgdXBkYXRlX18uCgoKIyBOb3RlcwoKX19XaHkgdGhpcyBzaW1wbGUgdmFyaWFudCBvZiBTSVIgKGFuZCBub3QsIGUuZy4sIFNFSVIgb3IgbW9yZSBjb21wbGV4IG9uZXMpP19fIEJlY2F1c2UgaXQgaXMgc2ltcGxlIGFuZCBoYXMgdHdvIHBhcmFtZXRlcnMgb25seSwgd2hpY2ggd2UgaGF2ZSB0byBmaXQgYWdhaW5zdCBhIHZlcnkgbGltaXRlZCBhbW91bnQgb2YgZGF0YS4gVGhlIHZhcmlhbmNlIG9mIHRoZSBwYXJhbWV0ZXIgZml0IGlzIGhpZ2ggZW5vdWdoIGV2ZW4gd2l0aCB0aGVzZSB0d28gcGFyYW1ldGVycywgZml0dGluZyBjb21wbGV4IG1vZGVscyB3aXRoIGhpZ2hlciBudW1iZXIgb2YgcGFyYW1ldGVycyBpcyBvdXQgb2Ygc2NvcGUgaW4gdGhpcyBzaXR1YXRpb24uCgpfX1BhcmFtZXRlciB2YWx1ZXNfXyBhcmUgb3V0IG9mIHRoZSB1c3VhbCByYW5nZXMuIFRoZSB2YWx1ZXMgb2YgYm90aCAkXGJldGEgTiQgYW5kICRcZ2FtbWEkIHZhcnkgYmV0d2VlbiAzIGFuZCAzLjUsIHdoaWNoIGlzIG9idmlvdXNseSBvdXQgb2YgdGhlIHByZXNjcmliZWQgcmFuZ2UsIGVzcGVjaWFsbHkgdGhlIHZhbHVlIG9mICRcZ2FtbWEkIHdoaWNoIHNob3VsZCBiZSBhdCBtb3N0IDEuIE5vdGUgdGhhdCB0aGlzIGlzIGFuIGFydGlmYWN0IG9mIHRoZSBzaW1wbGUgbW9kZWwgYmVpbmcgdXNlZC4gVGhlIGxlYXJuZWQgcGFyYW1ldGVyIHZhbHVlcyBhbHNvIGNvbXBlbnNhdGUgZm9yIHRoZSBiaWFzIGluIHRoZSBtZWFzdXJlbWVudHMsIGVzcGVjaWFsbHkgdGhlIHVucmVhbGlzdGljYWxseSBzbWFsbCBtZWFzdXJlZCBudW1iZXIgb2YgdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscywgd2hpY2ggaXMgdGhlIGNvbnNlcXVlbmNlIG9mIHRoZSBub24tc3lzdGVtYXRpYyB0ZXN0aW5nIHBvbGljeSBpbiBTbG92ZW5pYS4gTm90ZSBob3dldmVyLCB0aGF0IHRoZSByYXRpbyBvZiAkXGJldGEgTiAvIFxnYW1tYSQgaGFzIGEgcHJldHR5IHN0ZWFkeSBlc3RpbWF0ZWQgdmFsdWUgYmV0d2VlbiAxLjAyIGFuZCAxLjA0LCB3aGljaCBpcyByZWFsaXN0aWMuCgoKIyBBcHBlbmRpeAoKIyMgU2ltdWxhdGlvbiBvZiB0aGUgcHJldmlvdXMgbW9kZWwgdXBkYXRlcwoKIVtGaWd1cmUgMWE6IEJvb3RzdHJhcCBzaW11bGF0aW9uIG9mIHRoZSBtb2RlbCB1cGRhdGVkIHdpdGggdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBpbiBTbG92ZW5pYSB1cCB0byAyOXRoIG9mIE1hcmNoIDIwMjAuXSguL2dyYXBocy9zaW0tMjAwMzE0LTIwMDMyOS5wbmcpCgohW0ZpZ3VyZSAxYjogQm9vdHN0cmFwIHNpbXVsYXRpb24gb2YgdGhlIG1vZGVsIHVwZGF0ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGluIFNsb3ZlbmlhIHVwIHRvIDMwdGggb2YgTWFyY2ggMjAyMC5dKC4vZ3JhcGhzL3NpbS0yMDAzMTQtMjAwMzMwLnBuZykKCiFbRmlndXJlIDFjOiBCb290c3RyYXAgc2ltdWxhdGlvbiBvZiB0aGUgbW9kZWwgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gMzFzdCBvZiBNYXJjaCAyMDIwLl0oLi9ncmFwaHMvc2ltLTIwMDMxNC0yMDAzMzEucG5nKQoKIVtGaWd1cmUgMWQ6IEJvb3RzdHJhcCBzaW11bGF0aW9uIG9mIHRoZSBtb2RlbCB1cGRhdGVkIHdpdGggdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBpbiBTbG92ZW5pYSB1cCB0byAxc3Qgb2YgQXByaWwgMjAyMC5dKC4vZ3JhcGhzL3NpbS0yMDAzMTQtMjAwNDAxLnBuZykKCiFbRmlndXJlIDFlOiBCb290c3RyYXAgc2ltdWxhdGlvbiBvZiB0aGUgbW9kZWwgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gMm5kIG9mIEFwcmlsIDIwMjAuXSguL2dyYXBocy9zaW0tMjAwMzE0LTIwMDQwMi5wbmcpCgohW0ZpZ3VyZSAxZjogQm9vdHN0cmFwIHNpbXVsYXRpb24gb2YgdGhlIG1vZGVsIHVwZGF0ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGluIFNsb3ZlbmlhIHVwIHRvIDNyZCBvZiBBcHJpbCAyMDIwLl0oLi9ncmFwaHMvc2ltLTIwMDMxNC0yMDA0MDMucG5nKQoKIVtGaWd1cmUgMWc6IEJvb3RzdHJhcCBzaW11bGF0aW9uIG9mIHRoZSBtb2RlbCB1cGRhdGVkIHdpdGggdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBpbiBTbG92ZW5pYSB1cCB0byA0dGggb2YgQXByaWwgMjAyMC5dKC4vZ3JhcGhzL3NpbS0yMDAzMTQtMjAwNDA0LnBuZykKCiFbRmlndXJlIDFoOiBCb290c3RyYXAgc2ltdWxhdGlvbiBvZiB0aGUgbW9kZWwgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gNXRoIG9mIEFwcmlsIDIwMjAuXSguL2dyYXBocy9zaW0tMjAwMzE0LTIwMDQwNS5wbmcpCgohW0ZpZ3VyZSAxaTogQm9vdHN0cmFwIHNpbXVsYXRpb24gb2YgdGhlIG1vZGVsIHVwZGF0ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGluIFNsb3ZlbmlhIHVwIHRvIDZ0aCBvZiBBcHJpbCAyMDIwLl0oLi9ncmFwaHMvc2ltLTIwMDMxNC0yMDA0MDYucG5nKQoKIVtGaWd1cmUgMWo6IEJvb3RzdHJhcCBzaW11bGF0aW9uIG9mIHRoZSBtb2RlbCB1cGRhdGVkIHdpdGggdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBpbiBTbG92ZW5pYSB1cCB0byA3dGggb2YgQXByaWwgMjAyMC5dKC4vZ3JhcGhzL3NpbS0yMDAzMTQtMjAwNDA3LnBuZykKCiFbRmlndXJlIDFrOiBCb290c3RyYXAgc2ltdWxhdGlvbiBvZiB0aGUgbW9kZWwgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gOHRoIG9mIEFwcmlsIDIwMjAuXSguL2dyYXBocy9zaW0tMjAwMzE0LTIwMDQwOC5wbmcpCgohW0ZpZ3VyZSAxbDogQm9vdHN0cmFwIHNpbXVsYXRpb24gb2YgdGhlIG1vZGVsIHVwZGF0ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGluIFNsb3ZlbmlhIHVwIHRvIDl0aCBvZiBBcHJpbCAyMDIwLl0oLi9ncmFwaHMvc2ltLTIwMDMxNC0yMDA0MDkucG5nKQoKIVtGaWd1cmUgMW06IEJvb3RzdHJhcCBzaW11bGF0aW9uIG9mIHRoZSBtb2RlbCB1cGRhdGVkIHdpdGggdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBpbiBTbG92ZW5pYSB1cCB0byAxMHRoIG9mIEFwcmlsIDIwMjAuXSguL2dyYXBocy9zaW0tMjAwMzE0LTIwMDQxMC5wbmcpCgohW0ZpZ3VyZSAxbjogQm9vdHN0cmFwIHNpbXVsYXRpb24gb2YgdGhlIG1vZGVsIHVwZGF0ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGluIFNsb3ZlbmlhIHVwIHRvIDExdGggb2YgQXByaWwgMjAyMC5dKC4vZ3JhcGhzL3NpbS0yMDAzMTQtMjAwNDExLnBuZykKCiFbRmlndXJlIDFvOiBCb290c3RyYXAgc2ltdWxhdGlvbiBvZiB0aGUgbW9kZWwgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gMTJ0aCBvZiBBcHJpbCAyMDIwLl0oLi9ncmFwaHMvc2ltLTIwMDMxNC0yMDA0MTIucG5nKQoKIVtGaWd1cmUgMXA6IEJvb3RzdHJhcCBzaW11bGF0aW9uIG9mIHRoZSBtb2RlbCB1cGRhdGVkIHdpdGggdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBpbiBTbG92ZW5pYSB1cCB0byAxM3RoIG9mIEFwcmlsIDIwMjAuXSguL2dyYXBocy9zaW0tMjAwMzE0LTIwMDQxMy5wbmcpCgohW0ZpZ3VyZSAxcTogQm9vdHN0cmFwIHNpbXVsYXRpb24gb2YgdGhlIG1vZGVsIHVwZGF0ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGluIFNsb3ZlbmlhIHVwIHRvIDE0dGggb2YgQXByaWwgMjAyMC5dKC4vZ3JhcGhzL3NpbS0yMDAzMTQtMjAwNDE0LnBuZykKCiFbRmlndXJlIDFyOiBCb290c3RyYXAgc2ltdWxhdGlvbiBvZiB0aGUgbW9kZWwgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gMTV0aCBvZiBBcHJpbCAyMDIwLl0oLi9ncmFwaHMvc2ltLTIwMDMxNC0yMDA0MTUucG5nKQoKPCEtLQoKIyMgVXBkYXRlcyBvZiB0aGUgcHJlZGljdGlvbnMgb2YgdGhlIHBlYWsgdGltZSBwb2ludHMKCiFbRmlndXJlIDJhOiBEaXN0cmlidXRpb24gb2YgdGhlIHByZWRpY3RlZCBwZWFrIHRpbWUgcG9pbnRzIGluIHRoZSBib290c3RyYXAgc2ltdWxhdGlvbnMgb2YgdGhlIFNJUiBtb2RlbCAoZGF0YSB1cCB0byAyOXRoIG9mIE1hcmNoKS5dKC4vZ3JhcGhzL3BlYWstdHMtMjAwMzE0LTIwMDMyOS5wbmcpCgohW0ZpZ3VyZSAyYjogRGlzdHJpYnV0aW9uIG9mIHRoZSBwZWFrIHRpbWUgcG9pbnRzIHVwZGF0ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGluIFNsb3ZlbmlhIHVwIHRvIDMwdGggb2YgTWFyY2guXSguL2dyYXBocy9wZWFrLXRzLTIwMDMxNC0yMDAzMzAucG5nKQoKIVtGaWd1cmUgMmM6IERpc3RyaWJ1dGlvbiBvZiB0aGUgcGVhayB0aW1lIHBvaW50cyB1cGRhdGVkIHdpdGggdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBpbiBTbG92ZW5pYSB1cCB0byAzMXN0IG9mIE1hcmNoLl0oLi9ncmFwaHMvcGVhay10cy0yMDAzMTQtMjAwMzMxLnBuZykKCiFbRmlndXJlIDJkOiBEaXN0cmlidXRpb24gb2YgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gMXN0IG9mIEFwcmlsLl0oLi9ncmFwaHMvcGVhay10cy0yMDAzMTQtMjAwNDAxLnBuZykKCiFbRmlndXJlIDJlOiBEaXN0cmlidXRpb24gb2YgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gMm5kIG9mIEFwcmlsLl0oLi9ncmFwaHMvcGVhay10cy0yMDAzMTQtMjAwNDAyLnBuZykKCiFbRmlndXJlIDJmOiBEaXN0cmlidXRpb24gb2YgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gM3JkIG9mIEFwcmlsLl0oLi9ncmFwaHMvcGVhay10cy0yMDAzMTQtMjAwNDAzLnBuZykKCiFbRmlndXJlIDJnOiBEaXN0cmlidXRpb24gb2YgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gNHRoIG9mIEFwcmlsLl0oLi9ncmFwaHMvcGVhay10cy0yMDAzMTQtMjAwNDA0LnBuZykKCiFbRmlndXJlIDJoOiBEaXN0cmlidXRpb24gb2YgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gNXRoIG9mIEFwcmlsLl0oLi9ncmFwaHMvcGVhay10cy0yMDAzMTQtMjAwNDA1LnBuZykKCiFbRmlndXJlIDJpOiBEaXN0cmlidXRpb24gb2YgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gNnRoIG9mIEFwcmlsLl0oLi9ncmFwaHMvcGVhay10cy0yMDAzMTQtMjAwNDA2LnBuZykKCiFbRmlndXJlIDJqOiBEaXN0cmlidXRpb24gb2YgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gN3RoIG9mIEFwcmlsLl0oLi9ncmFwaHMvcGVhay10cy0yMDAzMTQtMjAwNDA3LnBuZykKCiFbRmlndXJlIDJrOiBEaXN0cmlidXRpb24gb2YgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gOHRoIG9mIEFwcmlsLl0oLi9ncmFwaHMvcGVhay10cy0yMDAzMTQtMjAwNDA4LnBuZykKCiFbRmlndXJlIDJsOiBEaXN0cmlidXRpb24gb2YgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gOXRoIG9mIEFwcmlsLl0oLi9ncmFwaHMvcGVhay10cy0yMDAzMTQtMjAwNDA5LnBuZykKCiFbRmlndXJlIDJtOiBEaXN0cmlidXRpb24gb2YgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gMTB0aCBvZiBBcHJpbC5dKC4vZ3JhcGhzL3BlYWstdHMtMjAwMzE0LTIwMDQxMC5wbmcpCgohW0ZpZ3VyZSAybjogRGlzdHJpYnV0aW9uIG9mIHRoZSBwZWFrIHRpbWUgcG9pbnRzIHVwZGF0ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGluIFNsb3ZlbmlhIHVwIHRvIDExdGggb2YgQXByaWwuXSguL2dyYXBocy9wZWFrLXRzLTIwMDMxNC0yMDA0MTEucG5nKQoKIVtGaWd1cmUgMm86IERpc3RyaWJ1dGlvbiBvZiB0aGUgcGVhayB0aW1lIHBvaW50cyB1cGRhdGVkIHdpdGggdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBpbiBTbG92ZW5pYSB1cCB0byAxMnRoIG9mIEFwcmlsLl0oLi9ncmFwaHMvcGVhay10cy0yMDAzMTQtMjAwNDEyLnBuZykKCiFbRmlndXJlIDJwOiBEaXN0cmlidXRpb24gb2YgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gMTN0aCBvZiBBcHJpbC5dKC4vZ3JhcGhzL3BlYWstdHMtMjAwMzE0LTIwMDQxMy5wbmcpCgohW0ZpZ3VyZSAycTogRGlzdHJpYnV0aW9uIG9mIHRoZSBwZWFrIHRpbWUgcG9pbnRzIHVwZGF0ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGluIFNsb3ZlbmlhIHVwIHRvIDE0dGggb2YgQXByaWwuXSguL2dyYXBocy9wZWFrLXRzLTIwMDMxNC0yMDA0MTQucG5nKQoKIVtGaWd1cmUgMnI6IERpc3RyaWJ1dGlvbiBvZiB0aGUgcGVhayB0aW1lIHBvaW50cyB1cGRhdGVkIHdpdGggdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBpbiBTbG92ZW5pYSB1cCB0byAxNXRoIG9mIEFwcmlsLl0oLi9ncmFwaHMvcGVhay10cy0yMDAzMTQtMjAwNDE1LnBuZykKCiFbRmlndXJlIDJzOiBEaXN0cmlidXRpb24gb2YgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gMTZ0aCBvZiBBcHJpbC5dKC4vZ3JhcGhzL3BlYWstdHMtMjAwMzE0LTIwMDQxNi5wbmcpCgojIyBVcGRhdGVzIG9mIHRoZSBwcmVkaWN0aW9ucyBvZiB0aGUgcGVhayBtYWduaXR1ZGVzCgohW0ZpZ3VyZSAzYTogRGlzdHJpYnV0aW9uIG9mIHRoZSBwcmVkaWN0ZWQgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGF0IHRoZSBwZWFrIHRpbWUgcG9pbnRzIGluIHRoZSBib290c3RyYXAgc2ltdWxhdGlvbnMgb2YgdGhlIFNJUiBtb2RlbCAoZGF0YSB1cCB0byAyOXRoIG9mIE1hcmNoKS5dKC4vZ3JhcGhzL3BlYWstbXMtMjAwMzE0LTIwMDMyOS5wbmcpCgohW0ZpZ3VyZSAzYjogRGlzdHJpYnV0aW9uIG9mIHRoZSBwcmVkaWN0ZWQgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGF0IHRoZSBwZWFrIHRpbWUgcG9pbnRzIHVwZGF0ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGluIFNsb3ZlbmlhIHVwIHRvIDMwdGggb2YgTWFyY2guXSguL2dyYXBocy9wZWFrLW1zLTIwMDMxNC0yMDAzMzAucG5nKQoKIVtGaWd1cmUgM2M6IERpc3RyaWJ1dGlvbiBvZiB0aGUgcHJlZGljdGVkIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBhdCB0aGUgcGVhayB0aW1lIHBvaW50cyB1cGRhdGVkIHdpdGggdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBpbiBTbG92ZW5pYSB1cCB0byAzMXN0IG9mIE1hcmNoLl0oLi9ncmFwaHMvcGVhay1tcy0yMDAzMTQtMjAwMzMxLnBuZykKCiFbRmlndXJlIDNkOiBEaXN0cmlidXRpb24gb2YgdGhlIHByZWRpY3RlZCBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgYXQgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gMXN0IG9mIEFwcmlsLl0oLi9ncmFwaHMvcGVhay1tcy0yMDAzMTQtMjAwNDAxLnBuZykKCiFbRmlndXJlIDNmOiBEaXN0cmlidXRpb24gb2YgdGhlIHByZWRpY3RlZCBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgYXQgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gM3JkIG9mIEFwcmlsLl0oLi9ncmFwaHMvcGVhay1tcy0yMDAzMTQtMjAwNDAzLnBuZykKCiFbRmlndXJlIDNnOiBEaXN0cmlidXRpb24gb2YgdGhlIHByZWRpY3RlZCBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgYXQgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gNHRoIG9mIEFwcmlsLl0oLi9ncmFwaHMvcGVhay1tcy0yMDAzMTQtMjAwNDA0LnBuZykKCiFbRmlndXJlIDNoOiBEaXN0cmlidXRpb24gb2YgdGhlIHByZWRpY3RlZCBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgYXQgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gNXRoIG9mIEFwcmlsLl0oLi9ncmFwaHMvcGVhay1tcy0yMDAzMTQtMjAwNDA1LnBuZykKCiFbRmlndXJlIDNpOiBEaXN0cmlidXRpb24gb2YgdGhlIHByZWRpY3RlZCBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgYXQgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gNnRoIG9mIEFwcmlsLl0oLi9ncmFwaHMvcGVhay1tcy0yMDAzMTQtMjAwNDA2LnBuZykKCiFbRmlndXJlIDNqOiBEaXN0cmlidXRpb24gb2YgdGhlIHByZWRpY3RlZCBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgYXQgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gN3RoIG9mIEFwcmlsLl0oLi9ncmFwaHMvcGVhay1tcy0yMDAzMTQtMjAwNDA3LnBuZykKCiFbRmlndXJlIDNrOiBEaXN0cmlidXRpb24gb2YgdGhlIHByZWRpY3RlZCBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgYXQgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gOHRoIG9mIEFwcmlsLl0oLi9ncmFwaHMvcGVhay1tcy0yMDAzMTQtMjAwNDA4LnBuZykKCiFbRmlndXJlIDNsOiBEaXN0cmlidXRpb24gb2YgdGhlIHByZWRpY3RlZCBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgYXQgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gOXRoIG9mIEFwcmlsLl0oLi9ncmFwaHMvcGVhay1tcy0yMDAzMTQtMjAwNDA5LnBuZykKCiFbRmlndXJlIDNtOiBEaXN0cmlidXRpb24gb2YgdGhlIHByZWRpY3RlZCBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgYXQgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gMTB0aCBvZiBBcHJpbC5dKC4vZ3JhcGhzL3BlYWstbXMtMjAwMzE0LTIwMDQxMC5wbmcpCgohW0ZpZ3VyZSAzbjogRGlzdHJpYnV0aW9uIG9mIHRoZSBwcmVkaWN0ZWQgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGF0IHRoZSBwZWFrIHRpbWUgcG9pbnRzIHVwZGF0ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGluIFNsb3ZlbmlhIHVwIHRvIDExdGggb2YgQXByaWwuXSguL2dyYXBocy9wZWFrLW1zLTIwMDMxNC0yMDA0MTEucG5nKQoKIVtGaWd1cmUgM286IERpc3RyaWJ1dGlvbiBvZiB0aGUgcHJlZGljdGVkIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBhdCB0aGUgcGVhayB0aW1lIHBvaW50cyB1cGRhdGVkIHdpdGggdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBpbiBTbG92ZW5pYSB1cCB0byAxMnRoIG9mIEFwcmlsLl0oLi9ncmFwaHMvcGVhay1tcy0yMDAzMTQtMjAwNDEyLnBuZykKCiFbRmlndXJlIDNwOiBEaXN0cmlidXRpb24gb2YgdGhlIHByZWRpY3RlZCBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgYXQgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gMTN0aCBvZiBBcHJpbC5dKC4vZ3JhcGhzL3BlYWstbXMtMjAwMzE0LTIwMDQxMy5wbmcpCgohW0ZpZ3VyZSAzcTogRGlzdHJpYnV0aW9uIG9mIHRoZSBwcmVkaWN0ZWQgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGF0IHRoZSBwZWFrIHRpbWUgcG9pbnRzIHVwZGF0ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGluIFNsb3ZlbmlhIHVwIHRvIDE0dGggb2YgQXByaWwuXSguL2dyYXBocy9wZWFrLW1zLTIwMDMxNC0yMDA0MTQucG5nKQoKIVtGaWd1cmUgM3I6IERpc3RyaWJ1dGlvbiBvZiB0aGUgcHJlZGljdGVkIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBhdCB0aGUgcGVhayB0aW1lIHBvaW50cyB1cGRhdGVkIHdpdGggdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBpbiBTbG92ZW5pYSB1cCB0byAxNXRoIG9mIEFwcmlsLl0oLi9ncmFwaHMvcGVhay1tcy0yMDAzMTQtMjAwNDE1LnBuZykKCiFbRmlndXJlIDNzOiBEaXN0cmlidXRpb24gb2YgdGhlIHByZWRpY3RlZCBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgYXQgdGhlIHBlYWsgdGltZSBwb2ludHMgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gMTZ0aCBvZiBBcHJpbC5dKC4vZ3JhcGhzL3BlYWstbXMtMjAwMzE0LTIwMDQxNi5wbmcpCgojIyBVcGRhdGVzIG9mIHRoZSBwcmVkaWN0aW9ucyBvZiB0aGUgZXBpZGVtaWMgZGVtaXNlIHRpbWUgcG9pbnRzCgohW0ZpZ3VyZSA0YTogRGlzdHJpYnV0aW9uIG9mIHRoZSBwcmVkaWN0ZWQgdGltZSBwb2ludHMgb2YgdGhlIGVwaWRlbWljIGRlbWlzZSBpbiB0aGUgYm9vdHN0cmFwIHNpbXVsYXRpb25zIG9mIHRoZSBTSVIgbW9kZWwgKGRhdGEgdXAgdG8gMjl0aCBvZiBNYXJjaC5dKC4vZ3JhcGhzL2VuZHMtMjAwMzE0LTIwMDMyOS5wbmcpCgohW0ZpZ3VyZSA0YjogRGlzdHJpYnV0aW9uIG9mIHRoZSBwcmVkaWN0ZWQgdGltZSBwb2ludHMgb2YgdGhlIGVwaWRlbWljIGRlbWlzZSB1cGRhdGVkIHdpdGggdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBpbiBTbG92ZW5pYSB1cCB0byAzMHRoIG9mIE1hcmNoLl0oLi9ncmFwaHMvZW5kcy0yMDAzMTQtMjAwMzMwLnBuZykKCiFbRmlndXJlIDRjOiBEaXN0cmlidXRpb24gb2YgdGhlIHByZWRpY3RlZCB0aW1lIHBvaW50cyBvZiB0aGUgZXBpZGVtaWMgZGVtaXNlIHVwZGF0ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGluIFNsb3ZlbmlhIHVwIHRvIDMxc3Qgb2YgTWFyY2guXSguL2dyYXBocy9lbmRzLTIwMDMxNC0yMDAzMzEucG5nKQoKIVtGaWd1cmUgNGQ6IERpc3RyaWJ1dGlvbiBvZiB0aGUgcHJlZGljdGVkIHRpbWUgcG9pbnRzIG9mIHRoZSBlcGlkZW1pYyBkZW1pc2UgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gMXN0IG9mIEFwcmlsLl0oLi9ncmFwaHMvZW5kcy0yMDAzMTQtMjAwNDAxLnBuZykKCiFbRmlndXJlIDRlOiBEaXN0cmlidXRpb24gb2YgdGhlIHByZWRpY3RlZCB0aW1lIHBvaW50cyBvZiB0aGUgZXBpZGVtaWMgZGVtaXNlIHVwZGF0ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGluIFNsb3ZlbmlhIHVwIHRvIDJuZCBvZiBBcHJpbC5dKC4vZ3JhcGhzL2VuZHMtMjAwMzE0LTIwMDQwMi5wbmcpCgohW0ZpZ3VyZSA0ZjogRGlzdHJpYnV0aW9uIG9mIHRoZSBwcmVkaWN0ZWQgdGltZSBwb2ludHMgb2YgdGhlIGVwaWRlbWljIGRlbWlzZSB1cGRhdGVkIHdpdGggdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBpbiBTbG92ZW5pYSB1cCB0byAzcmQgb2YgQXByaWwuXSguL2dyYXBocy9lbmRzLTIwMDMxNC0yMDA0MDMucG5nKQoKIVtGaWd1cmUgNGc6IERpc3RyaWJ1dGlvbiBvZiB0aGUgcHJlZGljdGVkIHRpbWUgcG9pbnRzIG9mIHRoZSBlcGlkZW1pYyBkZW1pc2UgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gNHRoIG9mIEFwcmlsLl0oLi9ncmFwaHMvZW5kcy0yMDAzMTQtMjAwNDA0LnBuZykKCiFbRmlndXJlIDRoOiBEaXN0cmlidXRpb24gb2YgdGhlIHByZWRpY3RlZCB0aW1lIHBvaW50cyBvZiB0aGUgZXBpZGVtaWMgZGVtaXNlIHVwZGF0ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGluIFNsb3ZlbmlhIHVwIHRvIDV0aCBvZiBBcHJpbC5dKC4vZ3JhcGhzL2VuZHMtMjAwMzE0LTIwMDQwNS5wbmcpCgohW0ZpZ3VyZSA0aTogRGlzdHJpYnV0aW9uIG9mIHRoZSBwcmVkaWN0ZWQgdGltZSBwb2ludHMgb2YgdGhlIGVwaWRlbWljIGRlbWlzZSB1cGRhdGVkIHdpdGggdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBpbiBTbG92ZW5pYSB1cCB0byA2dGggb2YgQXByaWwuXSguL2dyYXBocy9lbmRzLTIwMDMxNC0yMDA0MDYucG5nKQoKIVtGaWd1cmUgNGo6IERpc3RyaWJ1dGlvbiBvZiB0aGUgcHJlZGljdGVkIHRpbWUgcG9pbnRzIG9mIHRoZSBlcGlkZW1pYyBkZW1pc2UgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gN3RoIG9mIEFwcmlsLl0oLi9ncmFwaHMvZW5kcy0yMDAzMTQtMjAwNDA3LnBuZykKCiFbRmlndXJlIDRrOiBEaXN0cmlidXRpb24gb2YgdGhlIHByZWRpY3RlZCB0aW1lIHBvaW50cyBvZiB0aGUgZXBpZGVtaWMgZGVtaXNlIHVwZGF0ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGluIFNsb3ZlbmlhIHVwIHRvIDh0aCBvZiBBcHJpbC5dKC4vZ3JhcGhzL2VuZHMtMjAwMzE0LTIwMDQwOC5wbmcpCgohW0ZpZ3VyZSA0bDogRGlzdHJpYnV0aW9uIG9mIHRoZSBwcmVkaWN0ZWQgdGltZSBwb2ludHMgb2YgdGhlIGVwaWRlbWljIGRlbWlzZSB1cGRhdGVkIHdpdGggdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBpbiBTbG92ZW5pYSB1cCB0byA5dGggb2YgQXByaWwuXSguL2dyYXBocy9lbmRzLTIwMDMxNC0yMDA0MDkucG5nKQoKIVtGaWd1cmUgNG06IERpc3RyaWJ1dGlvbiBvZiB0aGUgcHJlZGljdGVkIHRpbWUgcG9pbnRzIG9mIHRoZSBlcGlkZW1pYyBkZW1pc2UgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gMTB0aCBvZiBBcHJpbC5dKC4vZ3JhcGhzL2VuZHMtMjAwMzE0LTIwMDQxMC5wbmcpCgohW0ZpZ3VyZSA0bjogRGlzdHJpYnV0aW9uIG9mIHRoZSBwcmVkaWN0ZWQgdGltZSBwb2ludHMgb2YgdGhlIGVwaWRlbWljIGRlbWlzZSB1cGRhdGVkIHdpdGggdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBpbiBTbG92ZW5pYSB1cCB0byAxMXRoIG9mIEFwcmlsLl0oLi9ncmFwaHMvZW5kcy0yMDAzMTQtMjAwNDExLnBuZykKCiFbRmlndXJlIDRvOiBEaXN0cmlidXRpb24gb2YgdGhlIHByZWRpY3RlZCB0aW1lIHBvaW50cyBvZiB0aGUgZXBpZGVtaWMgZGVtaXNlIHVwZGF0ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGluIFNsb3ZlbmlhIHVwIHRvIDEydGggb2YgQXByaWwuXSguL2dyYXBocy9lbmRzLTIwMDMxNC0yMDA0MTIucG5nKQoKIVtGaWd1cmUgNHA6IERpc3RyaWJ1dGlvbiBvZiB0aGUgcHJlZGljdGVkIHRpbWUgcG9pbnRzIG9mIHRoZSBlcGlkZW1pYyBkZW1pc2UgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gMTN0aCBvZiBBcHJpbC5dKC4vZ3JhcGhzL2VuZHMtMjAwMzE0LTIwMDQxMy5wbmcpCgohW0ZpZ3VyZSA0cTogRGlzdHJpYnV0aW9uIG9mIHRoZSBwcmVkaWN0ZWQgdGltZSBwb2ludHMgb2YgdGhlIGVwaWRlbWljIGRlbWlzZSB1cGRhdGVkIHdpdGggdGhlIG51bWJlciBvZiBpbmZlY3RlZCBpbmRpdmlkdWFscyBpbiBTbG92ZW5pYSB1cCB0byAxNHRoIG9mIEFwcmlsLl0oLi9ncmFwaHMvZW5kcy0yMDAzMTQtMjAwNDE0LnBuZykKCiFbRmlndXJlIDRyOiBEaXN0cmlidXRpb24gb2YgdGhlIHByZWRpY3RlZCB0aW1lIHBvaW50cyBvZiB0aGUgZXBpZGVtaWMgZGVtaXNlIHVwZGF0ZWQgd2l0aCB0aGUgbnVtYmVyIG9mIGluZmVjdGVkIGluZGl2aWR1YWxzIGluIFNsb3ZlbmlhIHVwIHRvIDE1dGggb2YgQXByaWwuXSguL2dyYXBocy9lbmRzLTIwMDMxNC0yMDA0MTUucG5nKQoKIVtGaWd1cmUgNHI6IERpc3RyaWJ1dGlvbiBvZiB0aGUgcHJlZGljdGVkIHRpbWUgcG9pbnRzIG9mIHRoZSBlcGlkZW1pYyBkZW1pc2UgdXBkYXRlZCB3aXRoIHRoZSBudW1iZXIgb2YgaW5mZWN0ZWQgaW5kaXZpZHVhbHMgaW4gU2xvdmVuaWEgdXAgdG8gMTZ0aCBvZiBBcHJpbC5dKC4vZ3JhcGhzL2VuZHMtMjAwMzE0LTIwMDQxNi5wbmcpCi0tPgoKCiMgV2hhdCB0byBkbyBuZXh0PwoKLSBNb2RlbGluZyB0aGUgbnVtYmVyIG9mIGhvc3BpdGFsaXplZCBpbmRpdmlkdWFscy4KLSBDb25zaWRlciBvdGhlciBjb3VudHJ5IHdpdGggbW9yZSBzeXN0ZW1hdGljIHRlc3RpbmcsIGUuZy4sIEdlcm1hbnkuCjwhLS0gLSBCb290c3RyYXAgc2V0dGluZ3M6IHN0YW5kYXJkIGRldmlhdGlvbnMsIGZvY3VzIG9uIGxvdy1STVNFIG9ubHk/IC0tPgotIEdvIHRvd2FyZHMgX19hZ2VudC1iYXNlZCBtb2RlbHNfXyB0byBpbmNvcnBvcmF0ZSBwb2xpY3kgdXBkYXRlcyAodGVzdGluZywgc29jaWFsIGRpc3RhbmNpbmcsIGV0YykuCgotLS0KClRoaXMgaXMgYW4gW1IgTWFya2Rvd25dKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20pIE5vdGVib29rLiBUaGUgZmlyc3QgdmVyc2lvbiBvZiB0aGlzIHJlcG9ydCB3YXMgcHJlcGFyZWQgb24gMzFzdCBvZiBNYXJjaCAyMDIwLiBUaGUgbGFzdCBfX3VwZGF0ZSB0b29rIHBsYWNlIG9uIDE3dGggb2YgQXByaWwgMjAyMF9fLiBNb2RlbGluZyBhbmQgc2ltdWxhdGlvbiBleHBlcmltZW50cyBwZXJmb3JtZWQgYnkgW05pa29sYSBTaW1pZGppZXZza2ldKG1haWx0bzpuczc3OUBjYW0uYWMudWspLCBbTWF0ZWogUGV0a292acSHXShtYWlsdG86bWF0ZWoucGV0a292aWNAaWpzLnNpKSBhbmQgW0xqdXDEjW8gVG9kb3JvdnNraV0obWFpbHRvOmxqdXBjby50b2Rvcm92c2tpQGZ1LnVuaS1sai5zaSkuCg==