Introduction

The SARS-COV-2 global pandemic has exposed weaknesses throughout our institutions, and the sciences are no exception. Given the deluge of official statistics and 300+ new COVID-19 working papers posted each day1, it is imperative for both consumers and producers of COVID-19 knowledge to be clear on what we do and do not know. In this brief review, we enumerate ways that data science has highlighted these weaknesses and is helping to address them.

In terms of understanding where we are, how we got here, and what is likely to follow, here are some things we need to know. We need to know the rate of spread of COVID-19 in a population \(R\), over time \(R_{t}\), across different political and demographic communities \(R_{ct}\), and prior to any non-pharmaceutical interventions \(R_{c0}\). We need to know how many cases of active infection exist in a community \(I_{ct}\) and how many of those infections resulted in death \(D_{ct}\). We need to know the causal effect of interventions \(X_{ct}\) on say rate of spread, between the observed treated populations \(R_{ct1}\) and the counterfactual populations had they not been treated \(R_{ct0}\). To do so, we need some plausible causal identification strategy that allows us to account for the fact that interventions are themselves chosen and implemented in response to changes in \(R_{ct}\), and that many outside factors likely drive both \(R_{ct}\) and \(X_{ct}\) simultaneously. These unknowns give rise to fundamental problems of measurement, inference, and interpretation.

Measurement

For the first several months of the pandemic and still in most countries now, there is no direct measure of \(I_{ct}\). Very few countries have implemented an ideal regularly timed national survey like the U.K.’s Office for National Statistics COVID-19 infection survey (Pouwels et al. 2020). More typically, we are reliant on serological estimates of Cumulative Infections \(CI_{ct}\) that measure the presence of antibodies indicative of infection at some point in the past. These are also still rare, and they have false positive rates that make them inappropriate for populations with low infection rates (Peeling et al. 2020).

More commonly available are Confirmed Cases \(CC_{ct}\). COVID-19 tests are administered in a jurisdiction, and positive results are anonymized, tabulated, reported, and aggregated by increasingly nested bureaucracies. These bureaucracies are concerned primarily with releasing legally required contemporary measurements and not maintaining consistent historical time series. This has resulted in the world’s largest, most desperate scavenger hunt to scrape, transcribe, and translate counts disseminated in oral briefings, public websites, PDFs, and even static images (Alamo et al. 2020). Teams from every country are working in often uncoordinated and duplicated efforts to compile government reporting into consistent panel data; these teams include newspapers (Sun et al. 2020), nonprofits (USAFacts 2020), large private companies (Zhang, Donthini, and Source 2020; Wolf, Ary, and Firooz 2020), consortiums of volunteers (Yang et al. 2020; Zohrab et al. 2020; Group 2020), and Wikipedians.

The resulting ecosystem of panel datasets vary in spatial and temporal coverage, have little metadata about sources or changing definitions, and generally do not handle revisions to past counts from reporting sources. Direct comparisons between sources reveal worrying disagreements and temporal artifacts like reporting delays, seasonalities, discontinuities, and sudden revisions in counts both upwards and downwards (Wang et al. 2020). It is not obvious how to correctly account for these problems or adjudicate between conflicting sources without a clear ground truth. There also is no permanent archive of the raw source material meaning reconstructing the full chain of evidence may no longer be possible.

Likewise, we do not have direct measures of Deaths \(D_{ct}\) but only Confirmed Deaths \(CD_{ct}\). \(CD_{ct}\) suffers from all of the problems of Confirmed Cases \(CC_{ct}\) except for possibly less under-reporting depending on if the person died at home or in medical care. Choosing \(CD_{ct}\) as the lesser of two evils, many projects attempt to take plausible values of the Infected Fatality Rate \(IFR=D/I\) to back out an estimation for \(I_{ct}\) (Meyerowitz-Katz and Merone 2020). Others have turned to estimating Excess Deaths \(ED_{ct}\), which is a number proportional to the number of total deaths reported in an area above what would be expected given the number of deaths reported in previous years (Weinberger et al. 2020). \(ED_{ct}\) is also not a direct estimate of \(D_{ct}\) as it can include deaths that were not caused by COVID-19 directly, e.g. other health conditions that received inadequate care during this period, and similarly can undercount the number of COVID-19 caused deaths as lockdowns reduce mobility and economic activity that might typically lead to deaths, e.g. car accidents.

Confirmed case and death counts mechanically depend on testing, but records of tests administered \(T_{ct}\) are even worse. In the U.S., much of what we know about trends in testing patterns come from journalistic efforts like the Covid-Tracking Project (Lipton et al. 2020). They encountered all of the regular problems plus additional ones specific to ambiguity to what kind of test count is being reported (testing encounters, number of people tested, number of swabs tested, etc). The type of test performed (and its false positive and false negative rate) is almost never included as metadata. Nor are the rules about how tests are being rationed and distributed being recorded systematically.

The general failure to track COVID-19 spread directly has led to a proliferation of innovative attempts to use other signals such as web searches, searches of medical databases, social media posts, fevers reported by home thermometer, and traditional flu symptom survailence networks (Kogan et al. 2020). While promising, proxy measures require ground truthing and regular calibration using something like regularly timed serological surveys on smaller geographic samples of the population. It is precisely the lack of such capabilities that are motivating the search for alternatives in the first place.

Finally, non-pharmaceutical interventions are tracked by several academic and nonprofit teams (Hale et al. 2020; Cheng et al. 2020). These interventions are intended to limit human mobility which is more directly measured by cell phone data which are being provided by companies like Google, Apple, and SafeGraph.

Inference

The workhorse theoretical model for infectious disease spread is the Susceptible, Exposed, Infectious, and Removed (SEIR) compartmental model (Brauer and Castillo-Chavez 2012). The intuition behind the SEIR model is that there are mechanical relationships, such as previous infections or deaths removing candidates from infection, the timing between exposure to the next possible transmission, and the degree to which immunity may exist in the population, which induce nonlinearities in disease spread. Disease spreads slowly at first, accelerates, and then burns out if left to its own devices. SEIR should be considered the theoretical floor for analysis, and an entire menagerie of extensions account for demography, testing, mobility, social networks, etc.

The necessity of directly including testing in models of disease spread can’t be understated. Per capita cases are so temporarily correlated with per capita testing rates they are more of a proxy of testing availability than infections (Kaashoek and Santillana 2020). Spatially, per capita testing rates correlate with urbanity and a wide range of co-morbids (Souch and Cossman 2020). How many tests are given and to who varies systematically in response to conditions on the ground with both periods of rationing and blitzes.

Measuring the effect of interventions is difficult because they are assigned endogenously in response to both local conditions and national signals. Similarly, populations responded to both government orders and local conditions, often reducing their activity prior to being ordered to and also increasing their activity prior to being officially allowed to. Governments, the public, and the disease are all responding simultaneously to each other in often nonlinear and unobserved ways. Statistical instruments that cause government interventions but do not directly cause testing rates or rate of spread except through the government intervention are few and far between. Further, interventions are often implemented simultaneously or in a rolling cumulative pattern directly in response to changes in cases and testing results, making isolating the effect of any one treatment exceptionally difficult.

Even if we had an exogenous intervention, its treatment effect on the rate of spread is still unlikely to be identified since almost any intervention will affect both cases and testing. Estimating an effect on just spread requires imposing additional assumptions, e.g. sharp constraints on some parameters and informative priors on the relationship between the number of tests and the number of cases (Kubinec and Carvalho 2020).

Interpretation

One promising development is rigorous forecast evaluations (Reich et al. 2020). Notoriously, many early simple growth models fit to the takeoff period of infections performed well right up until the curve broke and then failed entirely. A parade of predicted peaks in cases since continue the tradition, with groups celebrating success on uninteresting short-term autocorrelations while ignoring failures on actually interesting shifts in trends. All we can do is develop a very long memory of predictions and constantly hold models accountable for their long run out-of-sample performance on unseen future data.

Other trends in COVID-19 work are less promising.2 An overabundance of observational work still presents correlations as evidence of causation. Without identification, correlations on short highly autocorrelated time series are as likely to be misleading as informative. The SEIR model expects a nonlinear and highly autocorrelated pattern of an increasing infection rate that then levels off independent of any interventions. An unscrupulous, or naive, analyst can easily find interventions that increased (or decreased) spread solely by where those interventions land in the natural disease cycle, completely independent of the intervention’s actual effect.

Another bad habit is the pursuit of statistically distinguishable correlations over actually attempting to explain variation in COVID-19 outcomes themselves. Papers that can show a particular political party or demographic group is ‘worse’ on some COVID-19 dimension receive much attention. Such results lack strong explanatory power or clear policy recommendations, and so while great for making headlines, they do little to help us end the current pandemic.

Perhaps the most egregious trend in recent scholarship is setting up straw man null hypotheses and then presenting the inability to reject them as positive evidence for medical and safety decisions, e.g. social distancing might not be required because a model was unable to statistically distinguish a large uptick in cases following a mass-meeting. In the best of circumstances, absence of evidence is not evidence of absence. Our underfit, undertheorized, and underperforming observational models are not the best of circumstances, and they are not sufficiently sensitive to evaluate more than macro-level general trends.

Conclusion

This necessarily brief review omitted positive developments in studying COVID-19 outside of macro-observational settings. There has been remarkable progress in areas of diagnosis, clinical treatment, and phylogenetic tracking. Data science has contributed to the rapid collaboration, development, and dissemination of research in a way not seen in prior disease outbreaks. We also neglected topics like tracing, and the accompanying contributions from the tech field such as monitoring through mobile apps and social media. Further, our review is overly U.S.-centric, with other countries like South Korea monitoring the disease so effectively they succeeded at containment without having to resort to difficult mitigation.

Any research related to COVID-19 requires healthy caution of and respect for how little we actually know about the history of this pandemic. Practioners working on these questions and with these data will be deeply familiar with many of these concerns, but some may be especially subtle or less prominant within one’s main field of study. At a minimum, there is research being produced today which ignores much of these known methodological problems and subsequently generates confusion for novice consumers of analysis. We hope this enumeration of challenges in measurement, inference, and interpretation, can help both consumers and producers of COVID-19 knowledge alike.

Acknowledgments

Our thanks the Center for Peace and Security Studies and its members, and to the Office of Naval Research [N00014-19-1-2491] and the Charles Koch Foundation for financial support. Thank you to all who provided feedback on the early draft.

Author contributions: Conceptualization, R.W.D., T.L.S., and E.G.; Investigation, R.W.D.; Writing - Original Draft, R.W.D.; Writing - Review & Editing, R.W.D. and T.L.S.; Funding - E.G.

References

Alamo, Teodoro, Daniel G. Reina, Martina Mammarella, and Alberto Abella. 2020. “Covid-19: Open-Data Resources for Monitoring, Modeling, and Forecasting the Epidemic.” Electronics 9 (5): 827. https://doi.org/10.3390/electronics9050827.

Brauer, Fred, and Carlos Castillo-Chavez. 2012. Mathematical Models in Population Biology and Epidemiology. Vol. 2. Springer.

Cheng, Cindy, Joan Barceló, Allison Spencer Hartnett, Robert Kubinec, and Luca Messerschmidt. 2020. “COVID-19 Government Response Event Dataset (CoronaNet V.1.0).” Nature Human Behaviour 4 (7): 756–68. https://doi.org/10.1038/s41562-020-0909-7.

Group, COVID-19 India Org Data Operations. 2020. “Dataset for Tracking COVID-19 Spread in India.”

Hale, Thomas, Anna Petherick, Toby Phillips, and Samuel Webster. 2020. “Variation in Government Responses to COVID-19.” Blavatnik School of Government Working Paper 31.

Kaashoek, Justin, and Mauricio Santillana. 2020. “COVID-19 Positive Cases, Evidence on the Time Evolution of the Epidemic or an Indicator of Local Testing Capabilities? A Case Study in the United States.” SSRN Scholarly Paper ID 3574849. Rochester, NY: Social Science Research Network. https://doi.org/10.2139/ssrn.3574849.

Kogan, Nicole E., Leonardo Clemente, Parker Liautaud, Justin Kaashoek, Nicholas B. Link, Andre T. Nguyen, Fred S. Lu, et al. 2020. “An Early Warning Approach to Monitor COVID-19 Activity with Multiple Digital Traces in Near Real-Time.” arXiv:2007.00756 [Q-Bio, Stat], July. http://arxiv.org/abs/2007.00756.

Kubinec, Robert, and Luiz Carvalho. 2020. “A Retrospective Bayesian Model for Measuring Covariate Effects on Observed COVID-19 Test and Case Counts,” April. https://doi.org/10.31235/osf.io/jp4wk.

Lipton, Zach, Josh Ellington, smike, James Ouyang, Ken Riley, Joshua Ellinger, Jeff Hammerbacher, Olivier Lacan, Jason Crane, and space-buzzer. 2020. “The Covid-Tracking Project.” Zenodo. https://doi.org/10.5281/zenodo.3981599.

Meyerowitz-Katz, Gideon, and Lea Merone. 2020. “A Systematic Review and Meta-Analysis of Published Research Data on COVID-19 Infection-Fatality Rates.” medRxiv, May, 2020.05.03.20089854. https://doi.org/10.1101/2020.05.03.20089854.

Peeling, Rosanna W., Catherine J. Wedderburn, Patricia J. Garcia, Debrah Boeras, Noah Fongwen, John Nkengasong, Amadou Sall, Amilcar Tanuri, and David L. Heymann. 2020. “Serology Testing in the COVID-19 Pandemic Response.” The Lancet Infectious Diseases 0 (0). https://doi.org/10.1016/S1473-3099(20)30517-X.

Pouwels, Koen B., Thomas House, Julie V. Robotham, Paul Birrell, Andrew B. Gelman, Nikola Bowers, Ian Boreham, et al. 2020. “Community Prevalence of SARS-CoV-2 in England: Results from the ONS Coronavirus Infection Survey Pilot.” medRxiv, July, 2020.07.06.20147348. https://doi.org/10.1101/2020.07.06.20147348.

Reich, Nicholas G, Jarad Niemi, Katie House, Abdul Hannan, Estee Cramer, Steve Horstman, Shanghong Xie, et al. 2020. “Reichlab/Covid19-Forecast-Hub: Pre-Publication Snapshot.” Zenodo. https://doi.org/10.5281/zenodo.3963372.

Souch, Jacob M., and Jeralynn S. Cossman. 2020. “A Commentary on Rural-Urban Disparities in COVID-19 Testing Rates Per 100,000 and Risk Factors.” The Journal of Rural Health, June, jrh.12450. https://doi.org/10.1111/jrh.12450.

Sun, Albert, Tiff Fehr, Archie Tse, Rachel, and Wilson Andrews. 2020. “New York Times Coronavirus (Covid-19) Data in the United States.” Zenodo. https://doi.org/10.5281/zenodo.3981451.

USAFacts. 2020. “US Coronavirus Cases and Deaths.” Zenodo. https://doi.org/10.5281/zenodo.3981486.

Wang, Guannan, Zhiling Gu, Xinyi Li, Shan Yu, Myungjin Kim, Yueying Wang, Lei Gao, and Li Wang. 2020. “Comparing and Integrating US COVID-19 Daily Data from Multiple Sources: A County-Level Dataset with Local Characteristics.” arXiv:2006.01333 [Stat], June. http://arxiv.org/abs/2006.01333.

Weinberger, Daniel M., Jenny Chen, Ted Cohen, Forrest W. Crawford, Farzad Mostashari, Don Olson, Virginia E. Pitzer, et al. 2020. “Estimation of Excess Deaths Associated with the COVID-19 Pandemic in the United States, March to May 2020.” JAMA Internal Medicine, July. https://doi.org/10.1001/jamainternmed.2020.3391.

Wolf, Ashley, Asaf Ary, and Hossein Firooz. 2020. “Yahoo Knowledge Graph COVID-19 Datasets.” Zenodo. https://doi.org/10.5281/zenodo.3981432.

Yang, Tong, Kai Shen, Sixuan He, Enyu Li, Peter Sun, Pingying Chen, Lin Zuo, et al. 2020. “CovidNet: To Bring Data Transparency in the Era of COVID-19.” arXiv:2005.10948 [Cs, Q-Bio], July. http://arxiv.org/abs/2005.10948.

Zhang, Chiqun, Chaitanya Donthini, and Microsoft Open Source. 2020. “Bing-COVID-19-Data.” Zenodo. https://doi.org/10.5281/zenodo.3978733.

Zohrab, J, Ryan Block, Cameron Chamberlain, Larry Davis, Minh Nguyeñ̂, Alastair Gifillan, Adam Hughes, BriceWolfgang, and andys1376. 2020. “COVID Atlas Li.” Zenodo. https://doi.org/10.5281/zenodo.3981563.


  1. “COVID-19 Primer.” Accessed August 17, 2020. https://covid19primer.com/.↩︎

  2. We omit citations falling under the criticisms provided below as they are working papers and likely to change before finalization.↩︎

LS0tCnRpdGxlOiAnVGhlIERhdGEgU2NpZW5jZSBvZiBDT1ZJRC0xOSBTcHJlYWQ6IFNvbWUgVHJvdWJsaW5nIEN1cnJlbnQgYW5kIEZ1dHVyZSBUcmVuZHMnCmF1dGhvcjoKICAtIG5hbWU6ICJSZXggRG91Z2xhc3MiCiAgICBhZmZpbGlhdGlvbjogIlVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgU2FuIERpZWdvIgogICAgY29ycmVzcG9uZGluZzogcmV4ZG91Z2xhc3NAZ21haWwuY29tCiAgICBlbWFpbDogcmV4ZG91Z2xhc3NAZ21haWwuY29tCiAgLSBuYW1lOiAiVGhvbWFzIExlbyBTY2hlcmVyIgogICAgYWZmaWxpYXRpb246ICJVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIFNhbiBEaWVnbyIKICAgIGVtYWlsOiB0bHNjaGVyZXJAdWNzZC5lZHUKICAtIG5hbWU6ICJFcmlrIEdhcnR6a2UiCiAgICBhZmZpbGlhdGlvbjogIlVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgU2FuIERpZWdvIgogICAgZW1haWw6IGVnYXJ0emtlQHVjc2QuZWR1CmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCIKb3V0cHV0OgogIHJ0aWNsZXM6OnBsb3NfYXJ0aWNsZTogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogCiAgICBrZWVwX3RleDogeWVzCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKYmlibGlvZ3JhcGh5OiBjcGFzX2NvdmlkXzE5LmJpYgphZGRyZXNzOgotIGFkZHJlc3M6IFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgU2FuIERpZWdvLCBMYSBKb2xsYSxDQSwgOTIwOTMKICBjb2RlOiBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgU2FuIERpZWdvCi0tLQoKPCEtLWh0bWxfcHJlc2VydmUtLT4KPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4KPHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZXRhZ21hbmFnZXIuY29tL2d0YWcvanM/aWQ9VUEtMTc1NjE3MDIxLTEiPjwvc2NyaXB0Pgo8c2NyaXB0PgogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwogIGZ1bmN0aW9uIGd0YWcoKXtkYXRhTGF5ZXIucHVzaChhcmd1bWVudHMpO30KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOwoKICBndGFnKCdjb25maWcnLCAnVUEtMTc1NjE3MDIxLTEnKTsKPC9zY3JpcHQ+CjwhLS0vaHRtbF9wcmVzZXJ2ZS0tPgoKPCEtLSBXb3JraW5nIGRyYWZ0LiBDb21tZW50cyB3ZWxjb21lISBGb2xsb3cgdGhlIFtUd2l0dGVyIERpc2N1c3Npb25dKGh0dHBzOi8vdHdpdHRlci5jb20vUmV4RG91Z2xhc3Mvc3RhdHVzLzEyOTUzOTE0OTg0Nzc4MjYwNTMpe3RhcmdldD0iX2JsYW5rIn0uIAoKWzI2NDIvMjUwMCB3b3Jkc10KLS0+Cgo8IS0tIAphYnN0cmFjdDogQWJzdHJhY3QgaGVyZQotLT4KCiMgSW50cm9kdWN0aW9uCgpUaGUgU0FSUy1DT1YtMiBnbG9iYWwgcGFuZGVtaWMgaGFzIGV4cG9zZWQgd2Vha25lc3NlcyB0aHJvdWdob3V0IG91ciBpbnN0aXR1dGlvbnMsIGFuZCB0aGUgc2NpZW5jZXMgYXJlIG5vIGV4Y2VwdGlvbi4gR2l2ZW4gdGhlIGRlbHVnZSBvZiBvZmZpY2lhbCBzdGF0aXN0aWNzIGFuZCAzMDArIG5ldyBDT1ZJRC0xOSB3b3JraW5nIHBhcGVycyBwb3N0ZWQgZWFjaCBkYXleW+KAnENPVklELTE5IFByaW1lci7igJ0gQWNjZXNzZWQgQXVndXN0IDE3LCAyMDIwLiBodHRwczovL2NvdmlkMTlwcmltZXIuY29tLy5dLCBpdCBpcyBpbXBlcmF0aXZlIGZvciBib3RoIGNvbnN1bWVycyBhbmQgcHJvZHVjZXJzIG9mIENPVklELTE5IGtub3dsZWRnZSB0byBiZSBjbGVhciBvbiB3aGF0IHdlIGRvIGFuZCBkbyBub3Qga25vdy4gSW4gdGhpcyBicmllZiByZXZpZXcsIHdlIGVudW1lcmF0ZSB3YXlzIHRoYXQgZGF0YSBzY2llbmNlIGhhcyBoaWdobGlnaHRlZCB0aGVzZSB3ZWFrbmVzc2VzIGFuZCBpcyBoZWxwaW5nIHRvIGFkZHJlc3MgdGhlbS4KCkluIHRlcm1zIG9mIHVuZGVyc3RhbmRpbmcgd2hlcmUgd2UgYXJlLCBob3cgd2UgZ290IGhlcmUsIGFuZCB3aGF0IGlzIGxpa2VseSB0byBmb2xsb3csIGhlcmUgYXJlIHNvbWUgdGhpbmdzIHdlIG5lZWQgdG8ga25vdy4gV2UgbmVlZCB0byBrbm93IHRoZSByYXRlIG9mIHNwcmVhZCBvZiBDT1ZJRC0xOSBpbiBhIHBvcHVsYXRpb24gJFIkLCBvdmVyIHRpbWUgJFJfe3R9JCwgYWNyb3NzIGRpZmZlcmVudCBwb2xpdGljYWwgYW5kIGRlbW9ncmFwaGljIGNvbW11bml0aWVzICRSX3tjdH0kLCBhbmQgcHJpb3IgdG8gYW55IG5vbi1waGFybWFjZXV0aWNhbCBpbnRlcnZlbnRpb25zICRSX3tjMH0kLiBXZSBuZWVkIHRvIGtub3cgaG93IG1hbnkgY2FzZXMgb2YgYWN0aXZlIGluZmVjdGlvbiBleGlzdCBpbiBhIGNvbW11bml0eSAkSV97Y3R9JCBhbmQgaG93IG1hbnkgb2YgdGhvc2UgaW5mZWN0aW9ucyByZXN1bHRlZCBpbiBkZWF0aCAkRF97Y3R9JC4gV2UgbmVlZCB0byBrbm93IHRoZSBjYXVzYWwgZWZmZWN0IG9mIGludGVydmVudGlvbnMgJFhfe2N0fSQgb24gc2F5IHJhdGUgb2Ygc3ByZWFkLCBiZXR3ZWVuIHRoZSBvYnNlcnZlZCB0cmVhdGVkIHBvcHVsYXRpb25zICRSX3tjdDF9JCBhbmQgdGhlIGNvdW50ZXJmYWN0dWFsIHBvcHVsYXRpb25zIGhhZCB0aGV5IG5vdCBiZWVuIHRyZWF0ZWQgJFJfe2N0MH0kLiBUbyBkbyBzbywgd2UgbmVlZCBzb21lIHBsYXVzaWJsZSBjYXVzYWwgaWRlbnRpZmljYXRpb24gc3RyYXRlZ3kgdGhhdCBhbGxvd3MgdXMgdG8gYWNjb3VudCBmb3IgdGhlIGZhY3QgdGhhdCBpbnRlcnZlbnRpb25zIGFyZSB0aGVtc2VsdmVzIGNob3NlbiBhbmQgaW1wbGVtZW50ZWQgaW4gcmVzcG9uc2UgdG8gY2hhbmdlcyBpbiAkUl97Y3R9JCwgYW5kIHRoYXQgbWFueSBvdXRzaWRlIGZhY3RvcnMgbGlrZWx5IGRyaXZlIGJvdGggJFJfe2N0fSQgYW5kICRYX3tjdH0kIHNpbXVsdGFuZW91c2x5LiBUaGVzZSB1bmtub3ducyBnaXZlIHJpc2UgdG8gZnVuZGFtZW50YWwgcHJvYmxlbXMgb2YgbWVhc3VyZW1lbnQsIGluZmVyZW5jZSwgYW5kIGludGVycHJldGF0aW9uLgoKIyBNZWFzdXJlbWVudAoKRm9yIHRoZSBmaXJzdCBzZXZlcmFsIG1vbnRocyBvZiB0aGUgcGFuZGVtaWMgYW5kIHN0aWxsIGluIG1vc3QgY291bnRyaWVzIG5vdywgdGhlcmUgaXMgbm8gZGlyZWN0IG1lYXN1cmUgb2YgJElfe2N0fSQuIFZlcnkgZmV3IGNvdW50cmllcyBoYXZlIGltcGxlbWVudGVkIGFuIGlkZWFsIHJlZ3VsYXJseSB0aW1lZCBuYXRpb25hbCBzdXJ2ZXkgbGlrZSB0aGUgVS5LLidzIE9mZmljZSBmb3IgTmF0aW9uYWwgU3RhdGlzdGljcyBDT1ZJRC0xOSBpbmZlY3Rpb24gc3VydmV5IFtAcG91d2Vsc0NvbW11bml0eVByZXZhbGVuY2VTQVJTQ29WMjIwMjBdLiBNb3JlIHR5cGljYWxseSwgd2UgYXJlIHJlbGlhbnQgb24gc2Vyb2xvZ2ljYWwgZXN0aW1hdGVzIG9mIEN1bXVsYXRpdmUgSW5mZWN0aW9ucyAkQ0lfe2N0fSQgdGhhdCBtZWFzdXJlIHRoZSBwcmVzZW5jZSBvZiBhbnRpYm9kaWVzIGluZGljYXRpdmUgb2YgaW5mZWN0aW9uIGF0IHNvbWUgcG9pbnQgaW4gdGhlIHBhc3QuIFRoZXNlIGFyZSBhbHNvIHN0aWxsIHJhcmUsIGFuZCB0aGV5IGhhdmUgZmFsc2UgcG9zaXRpdmUgcmF0ZXMgdGhhdCBtYWtlIHRoZW0gaW5hcHByb3ByaWF0ZSBmb3IgcG9wdWxhdGlvbnMgd2l0aCBsb3cgaW5mZWN0aW9uIHJhdGVzIFtAcGVlbGluZ1Nlcm9sb2d5VGVzdGluZ0NPVklEMTkyMDIwXS4KCk1vcmUgY29tbW9ubHkgYXZhaWxhYmxlIGFyZSBDb25maXJtZWQgQ2FzZXMgJENDX3tjdH0kLiBDT1ZJRC0xOSB0ZXN0cyBhcmUgYWRtaW5pc3RlcmVkIGluIGEganVyaXNkaWN0aW9uLCBhbmQgcG9zaXRpdmUgcmVzdWx0cyBhcmUgYW5vbnltaXplZCwgdGFidWxhdGVkLCByZXBvcnRlZCwgYW5kIGFnZ3JlZ2F0ZWQgYnkgaW5jcmVhc2luZ2x5IG5lc3RlZCBidXJlYXVjcmFjaWVzLiBUaGVzZSBidXJlYXVjcmFjaWVzIGFyZSBjb25jZXJuZWQgcHJpbWFyaWx5IHdpdGggcmVsZWFzaW5nIGxlZ2FsbHkgcmVxdWlyZWQgY29udGVtcG9yYXJ5IG1lYXN1cmVtZW50cyBhbmQgbm90IG1haW50YWluaW5nIGNvbnNpc3RlbnQgaGlzdG9yaWNhbCB0aW1lIHNlcmllcy4gVGhpcyBoYXMgcmVzdWx0ZWQgaW4gdGhlIHdvcmxkJ3MgbGFyZ2VzdCwgbW9zdCBkZXNwZXJhdGUgc2NhdmVuZ2VyIGh1bnQgdG8gc2NyYXBlLCB0cmFuc2NyaWJlLCBhbmQgdHJhbnNsYXRlIGNvdW50cyBkaXNzZW1pbmF0ZWQgaW4gb3JhbCBicmllZmluZ3MsIHB1YmxpYyB3ZWJzaXRlcywgUERGcywgYW5kIGV2ZW4gc3RhdGljIGltYWdlcyBbQGFsYW1vQ292aWQxOU9wZW5EYXRhUmVzb3VyY2VzMjAyMF0uIFRlYW1zIGZyb20gZXZlcnkgY291bnRyeSBhcmUgd29ya2luZyBpbiBvZnRlbiB1bmNvb3JkaW5hdGVkIGFuZCBkdXBsaWNhdGVkIGVmZm9ydHMgdG8gY29tcGlsZSBnb3Zlcm5tZW50IHJlcG9ydGluZyBpbnRvIGNvbnNpc3RlbnQgcGFuZWwgZGF0YTsgdGhlc2UgdGVhbXMgaW5jbHVkZSBuZXdzcGFwZXJzIFtAYWxiZXJ0c3VuTmV3WW9ya1RpbWVzMjAyMF0sIG5vbnByb2ZpdHMgW0B1c2FmYWN0c1VTQ29yb25hdmlydXNDYXNlczIwMjBdLCBsYXJnZSBwcml2YXRlIGNvbXBhbmllcyBbQGNoaXF1bnpoYW5nQmluZ0NPVklEMTlEYXRhMjAyMDsgQGFzaGxleXdvbGZZYWhvb0tub3dsZWRnZUdyYXBoMjAyMF0sIGNvbnNvcnRpdW1zIG9mIHZvbHVudGVlcnMgW0B5YW5nQ292aWROZXRCcmluZ0RhdGEyMDIwOyBAanpvaHJhYkNPVklEQXRsYXNMaTIwMjA7IEBjb3ZpZDE5aW5kaWFvcmcyMDIwdHJhY2tlcl0sIGFuZCBXaWtpcGVkaWFucy4KClRoZSByZXN1bHRpbmcgZWNvc3lzdGVtIG9mIHBhbmVsIGRhdGFzZXRzIHZhcnkgaW4gc3BhdGlhbCBhbmQgdGVtcG9yYWwgY292ZXJhZ2UsIGhhdmUgbGl0dGxlIG1ldGFkYXRhIGFib3V0IHNvdXJjZXMgb3IgY2hhbmdpbmcgZGVmaW5pdGlvbnMsIGFuZCBnZW5lcmFsbHkgZG8gbm90IGhhbmRsZSByZXZpc2lvbnMgdG8gcGFzdCBjb3VudHMgZnJvbSByZXBvcnRpbmcgc291cmNlcy4gRGlyZWN0IGNvbXBhcmlzb25zIGJldHdlZW4gc291cmNlcyByZXZlYWwgd29ycnlpbmcgZGlzYWdyZWVtZW50cyBhbmQgdGVtcG9yYWwgYXJ0aWZhY3RzIGxpa2UgcmVwb3J0aW5nIGRlbGF5cywgc2Vhc29uYWxpdGllcywgZGlzY29udGludWl0aWVzLCBhbmQgc3VkZGVuIHJldmlzaW9ucyBpbiBjb3VudHMgYm90aCB1cHdhcmRzIGFuZCBkb3dud2FyZHMgW0B3YW5nQ29tcGFyaW5nSW50ZWdyYXRpbmdVUzIwMjBdLiBJdCBpcyBub3Qgb2J2aW91cyBob3cgdG8gY29ycmVjdGx5IGFjY291bnQgZm9yIHRoZXNlIHByb2JsZW1zIG9yIGFkanVkaWNhdGUgYmV0d2VlbiBjb25mbGljdGluZyBzb3VyY2VzIHdpdGhvdXQgYSBjbGVhciBncm91bmQgdHJ1dGguIFRoZXJlIGFsc28gaXMgbm8gcGVybWFuZW50IGFyY2hpdmUgb2YgdGhlIHJhdyBzb3VyY2UgbWF0ZXJpYWwgbWVhbmluZyByZWNvbnN0cnVjdGluZyB0aGUgZnVsbCBjaGFpbiBvZiBldmlkZW5jZSBtYXkgbm8gbG9uZ2VyIGJlIHBvc3NpYmxlLiAKCkxpa2V3aXNlLCB3ZSBkbyBub3QgaGF2ZSBkaXJlY3QgbWVhc3VyZXMgb2YgRGVhdGhzICREX3tjdH0kIGJ1dCBvbmx5IENvbmZpcm1lZCBEZWF0aHMgJENEX3tjdH0kLiAkQ0Rfe2N0fSQgc3VmZmVycyBmcm9tIGFsbCBvZiB0aGUgcHJvYmxlbXMgb2YgQ29uZmlybWVkIENhc2VzICRDQ197Y3R9JCBleGNlcHQgZm9yIHBvc3NpYmx5IGxlc3MgdW5kZXItcmVwb3J0aW5nIGRlcGVuZGluZyBvbiBpZiB0aGUgcGVyc29uIGRpZWQgYXQgaG9tZSBvciBpbiBtZWRpY2FsIGNhcmUuIENob29zaW5nICRDRF97Y3R9JCBhcyB0aGUgbGVzc2VyIG9mIHR3byBldmlscywgbWFueSBwcm9qZWN0cyBhdHRlbXB0IHRvIHRha2UgcGxhdXNpYmxlIHZhbHVlcyBvZiB0aGUgSW5mZWN0ZWQgRmF0YWxpdHkgUmF0ZSAkSUZSPUQvSSQgdG8gYmFjayBvdXQgYW4gZXN0aW1hdGlvbiBmb3IgJElfe2N0fSQgW0BtZXllcm93aXR6LWthdHpTeXN0ZW1hdGljUmV2aWV3TWV0YWFuYWx5c2lzMjAyMF0uIE90aGVycyBoYXZlIHR1cm5lZCB0byBlc3RpbWF0aW5nIEV4Y2VzcyBEZWF0aHMgJEVEX3tjdH0kLCB3aGljaCBpcyBhIG51bWJlciBwcm9wb3J0aW9uYWwgdG8gdGhlIG51bWJlciBvZiB0b3RhbCBkZWF0aHMgcmVwb3J0ZWQgaW4gYW4gYXJlYSBhYm92ZSB3aGF0IHdvdWxkIGJlIGV4cGVjdGVkIGdpdmVuIHRoZSBudW1iZXIgb2YgZGVhdGhzIHJlcG9ydGVkIGluIHByZXZpb3VzIHllYXJzIFtAd2VpbmJlcmdlckVzdGltYXRpb25FeGNlc3NEZWF0aHMyMDIwXS4gJEVEX3tjdH0kIGlzIGFsc28gbm90IGEgZGlyZWN0IGVzdGltYXRlIG9mICREX3tjdH0kIGFzIGl0IGNhbiBpbmNsdWRlIGRlYXRocyB0aGF0IHdlcmUgbm90IGNhdXNlZCBieSBDT1ZJRC0xOSBkaXJlY3RseSwgZS5nLiBvdGhlciBoZWFsdGggY29uZGl0aW9ucyB0aGF0IHJlY2VpdmVkIGluYWRlcXVhdGUgY2FyZSBkdXJpbmcgdGhpcyBwZXJpb2QsIGFuZCBzaW1pbGFybHkgY2FuIHVuZGVyY291bnQgdGhlIG51bWJlciBvZiBDT1ZJRC0xOSBjYXVzZWQgZGVhdGhzIGFzIGxvY2tkb3ducyByZWR1Y2UgbW9iaWxpdHkgYW5kIGVjb25vbWljIGFjdGl2aXR5IHRoYXQgbWlnaHQgdHlwaWNhbGx5IGxlYWQgdG8gZGVhdGhzLCBlLmcuIGNhciBhY2NpZGVudHMuCgpDb25maXJtZWQgY2FzZSBhbmQgZGVhdGggY291bnRzIG1lY2hhbmljYWxseSBkZXBlbmQgb24gdGVzdGluZywgYnV0IHJlY29yZHMgb2YgdGVzdHMgYWRtaW5pc3RlcmVkICRUX3tjdH0kIGFyZSBldmVuIHdvcnNlLiBJbiB0aGUgVS5TLiwgbXVjaCBvZiB3aGF0IHdlIGtub3cgYWJvdXQgdHJlbmRzIGluIHRlc3RpbmcgcGF0dGVybnMgY29tZSBmcm9tIGpvdXJuYWxpc3RpYyBlZmZvcnRzIGxpa2UgdGhlIENvdmlkLVRyYWNraW5nIFByb2plY3QgW0B6YWNobGlwdG9uQ292aWRUcmFja2luZ1Byb2plY3QyMDIwXS4gVGhleSBlbmNvdW50ZXJlZCBhbGwgb2YgdGhlIHJlZ3VsYXIgcHJvYmxlbXMgcGx1cyBhZGRpdGlvbmFsIG9uZXMgc3BlY2lmaWMgdG8gYW1iaWd1aXR5IHRvIHdoYXQga2luZCBvZiB0ZXN0IGNvdW50IGlzIGJlaW5nIHJlcG9ydGVkICh0ZXN0aW5nIGVuY291bnRlcnMsIG51bWJlciBvZiBwZW9wbGUgdGVzdGVkLCBudW1iZXIgb2Ygc3dhYnMgdGVzdGVkLCBldGMpLiBUaGUgdHlwZSBvZiB0ZXN0IHBlcmZvcm1lZCAoYW5kIGl0cyBmYWxzZSBwb3NpdGl2ZSBhbmQgZmFsc2UgbmVnYXRpdmUgcmF0ZSkgaXMgYWxtb3N0IG5ldmVyIGluY2x1ZGVkIGFzIG1ldGFkYXRhLiBOb3IgYXJlIHRoZSBydWxlcyBhYm91dCBob3cgdGVzdHMgYXJlIGJlaW5nIHJhdGlvbmVkIGFuZCBkaXN0cmlidXRlZCBiZWluZyByZWNvcmRlZCBzeXN0ZW1hdGljYWxseS4KClRoZSBnZW5lcmFsIGZhaWx1cmUgdG8gdHJhY2sgQ09WSUQtMTkgc3ByZWFkIGRpcmVjdGx5IGhhcyBsZWQgdG8gYSBwcm9saWZlcmF0aW9uIG9mIGlubm92YXRpdmUgYXR0ZW1wdHMgdG8gdXNlIG90aGVyIHNpZ25hbHMgc3VjaCBhcyB3ZWIgc2VhcmNoZXMsIHNlYXJjaGVzIG9mIG1lZGljYWwgZGF0YWJhc2VzLCBzb2NpYWwgbWVkaWEgcG9zdHMsIGZldmVycyByZXBvcnRlZCBieSBob21lIHRoZXJtb21ldGVyLCBhbmQgdHJhZGl0aW9uYWwgZmx1IHN5bXB0b20gc3VydmFpbGVuY2UgbmV0d29ya3MgW0Brb2dhbkVhcmx5V2FybmluZ0FwcHJvYWNoMjAyMF0uIFdoaWxlIHByb21pc2luZywgcHJveHkgbWVhc3VyZXMgcmVxdWlyZSBncm91bmQgdHJ1dGhpbmcgYW5kIHJlZ3VsYXIgY2FsaWJyYXRpb24gdXNpbmcgc29tZXRoaW5nIGxpa2UgcmVndWxhcmx5IHRpbWVkIHNlcm9sb2dpY2FsIHN1cnZleXMgb24gc21hbGxlciBnZW9ncmFwaGljIHNhbXBsZXMgb2YgdGhlIHBvcHVsYXRpb24uIEl0IGlzIHByZWNpc2VseSB0aGUgbGFjayBvZiBzdWNoIGNhcGFiaWxpdGllcyB0aGF0IGFyZSBtb3RpdmF0aW5nIHRoZSBzZWFyY2ggZm9yIGFsdGVybmF0aXZlcyBpbiB0aGUgZmlyc3QgcGxhY2UuCgpGaW5hbGx5LCBub24tcGhhcm1hY2V1dGljYWwgaW50ZXJ2ZW50aW9ucyBhcmUgdHJhY2tlZCBieSBzZXZlcmFsIGFjYWRlbWljIGFuZCBub25wcm9maXQgdGVhbXMgW0BoYWxlVmFyaWF0aW9uR292ZXJubWVudFJlc3BvbnNlczIwMjA7IEBjaGVuZ0NPVklEMTlHb3Zlcm5tZW50UmVzcG9uc2UyMDIwYV0uIFRoZXNlIGludGVydmVudGlvbnMgYXJlIGludGVuZGVkIHRvIGxpbWl0IGh1bWFuIG1vYmlsaXR5IHdoaWNoIGlzIG1vcmUgZGlyZWN0bHkgbWVhc3VyZWQgYnkgY2VsbCBwaG9uZSBkYXRhIHdoaWNoIGFyZSBiZWluZyBwcm92aWRlZCBieSBjb21wYW5pZXMgbGlrZSBHb29nbGUsIEFwcGxlLCBhbmQgU2FmZUdyYXBoLiA8IS0tbmVlZCB0aGUgY2l0ZSAtLT4KCiMgSW5mZXJlbmNlCgpUaGUgd29ya2hvcnNlIHRoZW9yZXRpY2FsIG1vZGVsIGZvciBpbmZlY3Rpb3VzIGRpc2Vhc2Ugc3ByZWFkIGlzIHRoZSBTdXNjZXB0aWJsZSwgRXhwb3NlZCwgSW5mZWN0aW91cywgYW5kIFJlbW92ZWQgKFNFSVIpIGNvbXBhcnRtZW50YWwgbW9kZWwgW0BicmF1ZXJNYXRoZW1hdGljYWxNb2RlbHNQb3B1bGF0aW9uMjAxMl0uIFRoZSBpbnR1aXRpb24gYmVoaW5kIHRoZSBTRUlSIG1vZGVsIGlzIHRoYXQgdGhlcmUgYXJlIG1lY2hhbmljYWwgcmVsYXRpb25zaGlwcywgc3VjaCBhcyBwcmV2aW91cyBpbmZlY3Rpb25zIG9yIGRlYXRocyByZW1vdmluZyBjYW5kaWRhdGVzIGZyb20gaW5mZWN0aW9uLCB0aGUgdGltaW5nIGJldHdlZW4gZXhwb3N1cmUgdG8gdGhlIG5leHQgcG9zc2libGUgdHJhbnNtaXNzaW9uLCBhbmQgdGhlIGRlZ3JlZSB0byB3aGljaCBpbW11bml0eSBtYXkgZXhpc3QgaW4gdGhlIHBvcHVsYXRpb24sIHdoaWNoIGluZHVjZSBub25saW5lYXJpdGllcyBpbiBkaXNlYXNlIHNwcmVhZC4gRGlzZWFzZSBzcHJlYWRzIHNsb3dseSBhdCBmaXJzdCwgYWNjZWxlcmF0ZXMsIGFuZCB0aGVuIGJ1cm5zIG91dCBpZiBsZWZ0IHRvIGl0cyBvd24gZGV2aWNlcy4gU0VJUiBzaG91bGQgYmUgY29uc2lkZXJlZCB0aGUgdGhlb3JldGljYWwgZmxvb3IgZm9yIGFuYWx5c2lzLCBhbmQgYW4gZW50aXJlIG1lbmFnZXJpZSBvZiBleHRlbnNpb25zIGFjY291bnQgZm9yIGRlbW9ncmFwaHksIHRlc3RpbmcsIG1vYmlsaXR5LCBzb2NpYWwgbmV0d29ya3MsIGV0Yy4gCgpUaGUgbmVjZXNzaXR5IG9mIGRpcmVjdGx5IGluY2x1ZGluZyB0ZXN0aW5nIGluIG1vZGVscyBvZiBkaXNlYXNlIHNwcmVhZCBjYW4ndCBiZSB1bmRlcnN0YXRlZC4gUGVyIGNhcGl0YSBjYXNlcyBhcmUgc28gdGVtcG9yYXJpbHkgY29ycmVsYXRlZCB3aXRoIHBlciBjYXBpdGEgdGVzdGluZyByYXRlcyB0aGV5IGFyZSBtb3JlIG9mIGEgcHJveHkgb2YgdGVzdGluZyBhdmFpbGFiaWxpdHkgdGhhbiBpbmZlY3Rpb25zIFtAa2Fhc2hvZWtDT1ZJRDE5UG9zaXRpdmVDYXNlczIwMjBhXS4gU3BhdGlhbGx5LCBwZXIgY2FwaXRhIHRlc3RpbmcgcmF0ZXMgY29ycmVsYXRlIHdpdGggdXJiYW5pdHkgYW5kIGEgd2lkZSByYW5nZSBvZiBjby1tb3JiaWRzIFtAc291Y2hDb21tZW50YXJ5UnVyYWxVcmJhbjIwMjBdLiBIb3cgbWFueSB0ZXN0cyBhcmUgZ2l2ZW4gYW5kIHRvIHdobyB2YXJpZXMgc3lzdGVtYXRpY2FsbHkgaW4gcmVzcG9uc2UgdG8gY29uZGl0aW9ucyBvbiB0aGUgZ3JvdW5kIHdpdGggYm90aCBwZXJpb2RzIG9mIHJhdGlvbmluZyBhbmQgYmxpdHplcy4KCk1lYXN1cmluZyB0aGUgZWZmZWN0IG9mIGludGVydmVudGlvbnMgaXMgZGlmZmljdWx0IGJlY2F1c2UgdGhleSBhcmUgYXNzaWduZWQgZW5kb2dlbm91c2x5IGluIHJlc3BvbnNlIHRvIGJvdGggbG9jYWwgY29uZGl0aW9ucyBhbmQgbmF0aW9uYWwgc2lnbmFscy4gU2ltaWxhcmx5LCAgcG9wdWxhdGlvbnMgcmVzcG9uZGVkIHRvIGJvdGggZ292ZXJubWVudCBvcmRlcnMgYW5kIGxvY2FsIGNvbmRpdGlvbnMsIG9mdGVuIHJlZHVjaW5nIHRoZWlyIGFjdGl2aXR5IHByaW9yIHRvIGJlaW5nIG9yZGVyZWQgdG8gYW5kIGFsc28gaW5jcmVhc2luZyB0aGVpciBhY3Rpdml0eSBwcmlvciB0byBiZWluZyBvZmZpY2lhbGx5IGFsbG93ZWQgdG8uIEdvdmVybm1lbnRzLCB0aGUgcHVibGljLCBhbmQgdGhlIGRpc2Vhc2UgYXJlIGFsbCByZXNwb25kaW5nIHNpbXVsdGFuZW91c2x5IHRvIGVhY2ggb3RoZXIgaW4gb2Z0ZW4gbm9ubGluZWFyIGFuZCB1bm9ic2VydmVkIHdheXMuIFN0YXRpc3RpY2FsIGluc3RydW1lbnRzIHRoYXQgY2F1c2UgZ292ZXJubWVudCBpbnRlcnZlbnRpb25zIGJ1dCBkbyBub3QgZGlyZWN0bHkgY2F1c2UgdGVzdGluZyByYXRlcyBvciByYXRlIG9mIHNwcmVhZCBleGNlcHQgdGhyb3VnaCB0aGUgZ292ZXJubWVudCBpbnRlcnZlbnRpb24gYXJlIGZldyBhbmQgZmFyIGJldHdlZW4uIEZ1cnRoZXIsIGludGVydmVudGlvbnMgYXJlIG9mdGVuIGltcGxlbWVudGVkIHNpbXVsdGFuZW91c2x5IG9yIGluIGEgcm9sbGluZyBjdW11bGF0aXZlIHBhdHRlcm4gZGlyZWN0bHkgaW4gcmVzcG9uc2UgdG8gY2hhbmdlcyBpbiBjYXNlcyBhbmQgdGVzdGluZyByZXN1bHRzLCBtYWtpbmcgaXNvbGF0aW5nIHRoZSBlZmZlY3Qgb2YgYW55IG9uZSB0cmVhdG1lbnQgZXhjZXB0aW9uYWxseSBkaWZmaWN1bHQuIAoKRXZlbiBpZiB3ZSBoYWQgYW4gZXhvZ2Vub3VzIGludGVydmVudGlvbiwgaXRzIHRyZWF0bWVudCBlZmZlY3Qgb24gdGhlIHJhdGUgb2Ygc3ByZWFkIGlzIHN0aWxsIHVubGlrZWx5IHRvIGJlIGlkZW50aWZpZWQgc2luY2UgYWxtb3N0IGFueSBpbnRlcnZlbnRpb24gd2lsbCBhZmZlY3QgYm90aCBjYXNlcyBhbmQgdGVzdGluZy4gRXN0aW1hdGluZyBhbiBlZmZlY3Qgb24ganVzdCBzcHJlYWQgcmVxdWlyZXMgaW1wb3NpbmcgYWRkaXRpb25hbCBhc3N1bXB0aW9ucywgZS5nLiBzaGFycCBjb25zdHJhaW50cyBvbiBzb21lIHBhcmFtZXRlcnMgYW5kIGluZm9ybWF0aXZlIHByaW9ycyBvbiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIG51bWJlciBvZiB0ZXN0cyBhbmQgdGhlIG51bWJlciBvZiBjYXNlcyBbQGt1YmluZWNSZXRyb3NwZWN0aXZlQmF5ZXNpYW5Nb2RlbDIwMjBdLgoKIyBJbnRlcnByZXRhdGlvbgoKT25lIHByb21pc2luZyBkZXZlbG9wbWVudCBpcyByaWdvcm91cyBmb3JlY2FzdCBldmFsdWF0aW9ucyBbQG5pY2hvbGFzZ3JlaWNoUmVpY2hsYWJDb3ZpZDE5Zm9yZWNhc3RodWJQcmVwdWJsaWNhdGlvbjIwMjBdLiBOb3RvcmlvdXNseSwgbWFueSBlYXJseSBzaW1wbGUgZ3Jvd3RoIG1vZGVscyBmaXQgdG8gdGhlIHRha2VvZmYgcGVyaW9kIG9mIGluZmVjdGlvbnMgcGVyZm9ybWVkIHdlbGwgcmlnaHQgdXAgdW50aWwgdGhlIGN1cnZlIGJyb2tlIGFuZCB0aGVuIGZhaWxlZCBlbnRpcmVseS4gQSBwYXJhZGUgb2YgcHJlZGljdGVkIHBlYWtzIGluIGNhc2VzIHNpbmNlIGNvbnRpbnVlIHRoZSB0cmFkaXRpb24sIHdpdGggZ3JvdXBzIGNlbGVicmF0aW5nIHN1Y2Nlc3Mgb24gdW5pbnRlcmVzdGluZyBzaG9ydC10ZXJtIGF1dG9jb3JyZWxhdGlvbnMgd2hpbGUgaWdub3JpbmcgZmFpbHVyZXMgb24gYWN0dWFsbHkgaW50ZXJlc3Rpbmcgc2hpZnRzIGluIHRyZW5kcy4gQWxsIHdlIGNhbiBkbyBpcyBkZXZlbG9wIGEgdmVyeSBsb25nIG1lbW9yeSBvZiBwcmVkaWN0aW9ucyBhbmQgY29uc3RhbnRseSBob2xkIG1vZGVscyBhY2NvdW50YWJsZSBmb3IgdGhlaXIgbG9uZyBydW4gb3V0LW9mLXNhbXBsZSBwZXJmb3JtYW5jZSBvbiB1bnNlZW4gZnV0dXJlIGRhdGEuCgpPdGhlciB0cmVuZHMgaW4gQ09WSUQtMTkgd29yayBhcmUgbGVzcyBwcm9taXNpbmcuXltXZSBvbWl0IGNpdGF0aW9ucyBmYWxsaW5nIHVuZGVyIHRoZSBjcml0aWNpc21zIHByb3ZpZGVkIGJlbG93IGFzIHRoZXkgYXJlIHdvcmtpbmcgcGFwZXJzIGFuZCBsaWtlbHkgdG8gY2hhbmdlIGJlZm9yZSBmaW5hbGl6YXRpb24uXSBBbiBvdmVyYWJ1bmRhbmNlIG9mIG9ic2VydmF0aW9uYWwgd29yayBzdGlsbCBwcmVzZW50cyBjb3JyZWxhdGlvbnMgYXMgZXZpZGVuY2Ugb2YgY2F1c2F0aW9uLiBXaXRob3V0IGlkZW50aWZpY2F0aW9uLCBjb3JyZWxhdGlvbnMgb24gc2hvcnQgaGlnaGx5IGF1dG9jb3JyZWxhdGVkIHRpbWUgc2VyaWVzIGFyZSBhcyBsaWtlbHkgdG8gYmUgbWlzbGVhZGluZyBhcyBpbmZvcm1hdGl2ZS4gVGhlIFNFSVIgbW9kZWwgZXhwZWN0cyBhIG5vbmxpbmVhciBhbmQgaGlnaGx5IGF1dG9jb3JyZWxhdGVkIHBhdHRlcm4gb2YgYW4gaW5jcmVhc2luZyBpbmZlY3Rpb24gcmF0ZSB0aGF0IHRoZW4gbGV2ZWxzIG9mZiBpbmRlcGVuZGVudCBvZiBhbnkgaW50ZXJ2ZW50aW9ucy4gQW4gdW5zY3J1cHVsb3VzLCBvciBuYWl2ZSwgYW5hbHlzdCBjYW4gZWFzaWx5IGZpbmQgaW50ZXJ2ZW50aW9ucyB0aGF0IGluY3JlYXNlZCAob3IgZGVjcmVhc2VkKSBzcHJlYWQgc29sZWx5IGJ5IHdoZXJlIHRob3NlIGludGVydmVudGlvbnMgbGFuZCBpbiB0aGUgbmF0dXJhbCBkaXNlYXNlIGN5Y2xlLCBjb21wbGV0ZWx5IGluZGVwZW5kZW50IG9mIHRoZSBpbnRlcnZlbnRpb24ncyBhY3R1YWwgZWZmZWN0LiAKCkFub3RoZXIgYmFkIGhhYml0IGlzIHRoZSBwdXJzdWl0IG9mIHN0YXRpc3RpY2FsbHkgZGlzdGluZ3Vpc2hhYmxlIGNvcnJlbGF0aW9ucyBvdmVyIGFjdHVhbGx5IGF0dGVtcHRpbmcgdG8gZXhwbGFpbiB2YXJpYXRpb24gaW4gQ09WSUQtMTkgb3V0Y29tZXMgdGhlbXNlbHZlcy4gUGFwZXJzIHRoYXQgY2FuIHNob3cgYSBwYXJ0aWN1bGFyIHBvbGl0aWNhbCBwYXJ0eSBvciBkZW1vZ3JhcGhpYyBncm91cCBpcyAnd29yc2UnIG9uIHNvbWUgQ09WSUQtMTkgZGltZW5zaW9uIHJlY2VpdmUgbXVjaCBhdHRlbnRpb24uIFN1Y2ggcmVzdWx0cyBsYWNrIHN0cm9uZyBleHBsYW5hdG9yeSBwb3dlciBvciBjbGVhciBwb2xpY3kgcmVjb21tZW5kYXRpb25zLCBhbmQgc28gd2hpbGUgZ3JlYXQgZm9yIG1ha2luZyBoZWFkbGluZXMsIHRoZXkgZG8gbGl0dGxlIHRvIGhlbHAgdXMgZW5kIHRoZSBjdXJyZW50IHBhbmRlbWljLgoKUGVyaGFwcyB0aGUgbW9zdCBlZ3JlZ2lvdXMgdHJlbmQgaW4gcmVjZW50IHNjaG9sYXJzaGlwIGlzIHNldHRpbmcgdXAgc3RyYXcgbWFuIG51bGwgaHlwb3RoZXNlcyBhbmQgdGhlbiBwcmVzZW50aW5nIHRoZSBpbmFiaWxpdHkgdG8gcmVqZWN0IHRoZW0gYXMgcG9zaXRpdmUgZXZpZGVuY2UgZm9yIG1lZGljYWwgYW5kIHNhZmV0eSBkZWNpc2lvbnMsIGUuZy4gc29jaWFsIGRpc3RhbmNpbmcgbWlnaHQgbm90IGJlIHJlcXVpcmVkIGJlY2F1c2UgYSBtb2RlbCB3YXMgdW5hYmxlIHRvIHN0YXRpc3RpY2FsbHkgZGlzdGluZ3Vpc2ggYSBsYXJnZSB1cHRpY2sgaW4gY2FzZXMgZm9sbG93aW5nIGEgbWFzcy1tZWV0aW5nLiBJbiB0aGUgYmVzdCBvZiBjaXJjdW1zdGFuY2VzLCBhYnNlbmNlIG9mIGV2aWRlbmNlIGlzIG5vdCBldmlkZW5jZSBvZiBhYnNlbmNlLiBPdXIgdW5kZXJmaXQsIHVuZGVydGhlb3JpemVkLCBhbmQgdW5kZXJwZXJmb3JtaW5nIG9ic2VydmF0aW9uYWwgbW9kZWxzIGFyZSBub3QgdGhlIGJlc3Qgb2YgY2lyY3Vtc3RhbmNlcywgYW5kIHRoZXkgYXJlIG5vdCBzdWZmaWNpZW50bHkgc2Vuc2l0aXZlIHRvIGV2YWx1YXRlIG1vcmUgdGhhbiBtYWNyby1sZXZlbCBnZW5lcmFsIHRyZW5kcy4KCiMgQ29uY2x1c2lvbgoKVGhpcyBuZWNlc3NhcmlseSBicmllZiByZXZpZXcgb21pdHRlZCBwb3NpdGl2ZSBkZXZlbG9wbWVudHMgaW4gc3R1ZHlpbmcgQ09WSUQtMTkgb3V0c2lkZSBvZiBtYWNyby1vYnNlcnZhdGlvbmFsIHNldHRpbmdzLiBUaGVyZSBoYXMgYmVlbiByZW1hcmthYmxlIHByb2dyZXNzIGluIGFyZWFzIG9mIGRpYWdub3NpcywgY2xpbmljYWwgdHJlYXRtZW50LCBhbmQgcGh5bG9nZW5ldGljIHRyYWNraW5nLiBEYXRhIHNjaWVuY2UgaGFzIGNvbnRyaWJ1dGVkIHRvIHRoZSByYXBpZCBjb2xsYWJvcmF0aW9uLCBkZXZlbG9wbWVudCwgYW5kIGRpc3NlbWluYXRpb24gb2YgcmVzZWFyY2ggaW4gYSB3YXkgbm90IHNlZW4gaW4gcHJpb3IgZGlzZWFzZSBvdXRicmVha3MuIFdlIGFsc28gbmVnbGVjdGVkIHRvcGljcyBsaWtlIHRyYWNpbmcsIGFuZCB0aGUgYWNjb21wYW55aW5nIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgdGVjaCBmaWVsZCBzdWNoIGFzIG1vbml0b3JpbmcgdGhyb3VnaCBtb2JpbGUgYXBwcyBhbmQgc29jaWFsIG1lZGlhLiAgIEZ1cnRoZXIsIG91ciByZXZpZXcgaXMgb3Zlcmx5IFUuUy4tY2VudHJpYywgd2l0aCBvdGhlciBjb3VudHJpZXMgbGlrZSBTb3V0aCBLb3JlYSBtb25pdG9yaW5nIHRoZSBkaXNlYXNlIHNvIGVmZmVjdGl2ZWx5IHRoZXkgc3VjY2VlZGVkIGF0IGNvbnRhaW5tZW50IHdpdGhvdXQgaGF2aW5nIHRvIHJlc29ydCB0byBkaWZmaWN1bHQgbWl0aWdhdGlvbi4KCkFueSByZXNlYXJjaCByZWxhdGVkIHRvIENPVklELTE5IHJlcXVpcmVzIGhlYWx0aHkgY2F1dGlvbiBvZiBhbmQgcmVzcGVjdCBmb3IgaG93IGxpdHRsZSB3ZSBhY3R1YWxseSBrbm93IGFib3V0IHRoZSBoaXN0b3J5IG9mIHRoaXMgcGFuZGVtaWMuIFByYWN0aW9uZXJzIHdvcmtpbmcgb24gdGhlc2UgcXVlc3Rpb25zIGFuZCB3aXRoIHRoZXNlIGRhdGEgd2lsbCBiZSBkZWVwbHkgZmFtaWxpYXIgd2l0aCBtYW55IG9mIHRoZXNlIGNvbmNlcm5zLCBidXQgc29tZSBtYXkgYmUgZXNwZWNpYWxseSBzdWJ0bGUgb3IgbGVzcyBwcm9taW5hbnQgIHdpdGhpbiBvbmUncyBtYWluIGZpZWxkIG9mIHN0dWR5LiBBdCBhIG1pbmltdW0sIHRoZXJlIGlzIHJlc2VhcmNoIGJlaW5nIHByb2R1Y2VkIHRvZGF5IHdoaWNoIGlnbm9yZXMgbXVjaCBvZiB0aGVzZSBrbm93biBtZXRob2RvbG9naWNhbCBwcm9ibGVtcyBhbmQgc3Vic2VxdWVudGx5IGdlbmVyYXRlcyBjb25mdXNpb24gZm9yIG5vdmljZSBjb25zdW1lcnMgb2YgYW5hbHlzaXMuIFdlIGhvcGUgdGhpcyBlbnVtZXJhdGlvbiBvZiBjaGFsbGVuZ2VzIGluIG1lYXN1cmVtZW50LCBpbmZlcmVuY2UsIGFuZCBpbnRlcnByZXRhdGlvbiwgY2FuIGhlbHAgYm90aCBjb25zdW1lcnMgYW5kIHByb2R1Y2VycyBvZiBDT1ZJRC0xOSBrbm93bGVkZ2UgYWxpa2UuCgojIEFja25vd2xlZGdtZW50cwoKT3VyIHRoYW5rcyB0aGUgW0NlbnRlciBmb3IgUGVhY2UgYW5kIFNlY3VyaXR5IFN0dWRpZXNdKHd3dy51Y3NkLmNwYXNzLmVkdSkgYW5kIGl0cyBtZW1iZXJzLCBhbmQgdG8gdGhlIE9mZmljZSBvZiBOYXZhbCBSZXNlYXJjaCBbTjAwMDE0LTE5LTEtMjQ5MV0gYW5kIHRoZSBDaGFybGVzIEtvY2ggRm91bmRhdGlvbiBmb3IgZmluYW5jaWFsIHN1cHBvcnQuIFRoYW5rIHlvdSB0byBhbGwgd2hvIHByb3ZpZGVkIGZlZWRiYWNrIG9uIHRoZSBlYXJseSBkcmFmdC4gCgpBdXRob3IgY29udHJpYnV0aW9uczogQ29uY2VwdHVhbGl6YXRpb24sIFIuVy5ELiwgVC5MLlMuLCBhbmQgRS5HLjsgSW52ZXN0aWdhdGlvbiwgUi5XLkQuOyBXcml0aW5nIC0gT3JpZ2luYWwgRHJhZnQsIFIuVy5ELjsgV3JpdGluZyAtIFJldmlldyAmIEVkaXRpbmcsIFIuVy5ELiBhbmQgVC5MLlMuOyBGdW5kaW5nIC0gRS5HLgoKCiMgUmVmZXJlbmNlcwoK