An Analysis of Educational Attainment and Health Outcomes in New York Counties

Methods 1 Final Project | Fall 2023

Natalie Temple

Introduction and Background

The relationship between educational attainment and health outcomes has garnered significant attention in research over the last several decades, playing a pivotal role in understanding and addressing health disparities within the United States. A comprehensive understanding of this link is crucial for mitigating health inequalities and enhancing the overall well-being of 21st-century populations. Empirical research has consistently demonstrated the correlation between educational achievement and health status, illuminating how disparities in education perpetuate inequalities in health outcomes (Zajacova and Lawrence 2018).

As education increasingly became the conduit to financial stability and societal advancement in the U.S., disparities in educational opportunities emerged, driven by factors like neighborhood characteristics, racial disparities, and economic shifts. Additionally, a student’s social context, including family background and support systems, significantly impacts their ability to access and succeed in higher education. Students with parental experience in college benefit from their parents’ knowledge and networks, aiding them in navigating the complex college admission processes and academic expectations. Conversely, first-generation college students may face challenges due to the absence of similar support structures. Institutional barriers within colleges and universities also hinder enrollment and graduation rates. Factors such as diminishing public funding leading to higher tuition fees, limited financial aid resources, and inadequate support services, particularly in community colleges, present hurdles for students.(Office of Disease Prevention and Health Promotion).

Because of the strong, fairly clear relationship between educational attainment and health outcomes, education can serve as a strong driver of both opportunity and inequality (Raghupathi and Raghupathi 2020).

A far less clear relationship, however, is that between a place’s degree of ‘urban-ness’ (which I will refer to as urbanicity) and health outcomes. Just as education can drive both opportunity and inequality, urban environments seem to symbolize a paradox in terms of healthcare. While urban environments have been associated with increased access to and utilization of health services, they have also been linked to more health risks than rural areas often due to the inherent overcrowded nature of urban places (World Health Organization 2021) & (Assaf 2020). As such, for this project I wanted to investigate the relationship between educational attainment and health outcomes in the context of New York State, paying attention to differences across rural and urban county contexts.

Research Focus and Data Sources

Research Questions: In this analysis, I sought to explore the relationship between educational attainment and health outcomes in New York, factoring in the urban and rural contexts of the different counties across the state. I was particularly interested in whether a county’s urbanicity would have any effect on the well-documented relationship between educational attainment and health outcomes, and if so, I was curious as to any potential commonalities along the types of health outcomes for which urbanicity would be a strong confounding factor.

Data and Sources: To define and measure educational attainment and county poverty, I obtained data from the 2017-2021 American Community Survey. While the former was accessed with the tidyverse R package, the latter was accessed through the Small Area Income and Poverty Estimates database.

The two sources used for health outcomes data were the 2021 New York County Health Rankings Data from the University of Wisconsin Population Health Institute and the 2021 County-Level Behavioral Risk Factor Surveillance System from the New York State Department of Health data portal.

Educational Attainment

The first step in this exploration was looking into educational attainment in New York at the county-level.

Fig. 1: The map above shows educational attainment, here measured by the percentage of adults 25+ with at least a Bachelors degree, by county. New York County, housing the borough of Manhattan, demonstrates the highest educational attainment along this marker at 63%.

Fig. 2: The map above also shows similar data on educational attainment, but with the operational definition of educational attainment being a maximum of a High School Diploma, GED, or other equivalent. In this case, New York County ranks the lowest for the percentage of the adult population whose maximum educational attainment is a high school diploma or equivalent degree.

Health Outcomes

Next, I sorted through the county-level health data and pulled out some variables pertaining to health outcomes of different types (chronic illness, social determinants of health, life expectancy, etc).

Fig. 3: The map above shows the average life expectancy by county. Again, New York County ranks the highest in life expectancy with an average of 85 years, while all counties containing the five boroughs of New York City rank within the top 16 out of 62 total counties.

County Poverty and Percent Rural

The table above can be used to see side by side comparisons of poverty rates, life expectancy, educational attainment, and the rural/urban nature of each county.

Results and Analysis

After getting an initial look at the data with maps, I made a series of scatter plots to get a better sense of the relationship between educational attainment and the specific health outcomes I chose to investigate. At this point, I also factored in the census variable designating the percentage of county residents living in a rural area to serve as a measure of a county’s urban or rural status.

Fig. 4: The plot above demonstrates a strong positive correlation between educational attainment and life expectancy, immediately underscoring the utility of addressing education-related inequities as a tool for also addressing health disparities overall.

Chronic Conditions

To examine the relationship between educational attainment and chronic health conditions, I chose to look at: - Percent of Adults with Diabetes - Percent of Adults living with a Disability - Percent of Adults Diagnosed with High Blood Pressure - Percent of Adults Diagnosed with Cardiovascular Disease - Percent of Adults Diagnosed with Arthritis - Percent of Adults Diagnosed with Asthma - Percent of Adults Diagnosed with COPD (Chronic Obstructive Pulmonary Disease)

Most of these relationships demonstrated strong relationships linking higher educational attainment to better health outcomes, in this case in the form of lower rates of chronic conditions.

Fig. 5: The plot above exhibits a strong negative correlation between rates of Diabetes and educational attainment, seeing as counties with higher levels of educational attainment also have lower rates of diabetes. Again, the county with the lowest Diabetes rate is New York County.

Fig. 6: While this plot reflects a similar fairly strong negative correlation between educational attainment and disability to that in the previous plot, New York County is a slight outlier this time, marking a departure from the consistent relationship that has been observed thus far. This is especially interesting because NYC has an extensive health care system with an abundance services available for individuals with disabilities, so this is quite a poignant case of the urban paradox.

Fig. 7: The plot above demonstrates a strong negative correlation between educational attainment and rates of High Blood Pressure diagnosis, reflecting the same trend as the health outcomes of life expectancy and Diabetes rate. Again, New York County ranks the lowest in High Blood Pressure diagnoses, but this time, it is tied for the spot with Sullivan County and Schuyler County, both much smaller in overall population with much larger proportions of their population living in rural areas.

Fig. 8: While still demonstrating a moderately strong negative correlation between educational attainment and Cardiovascular Disease, the plot above is far more varied when it comes to the relationship between educational attainment and Cardiovascular Disease. New York County is an outlier again while a much smaller, more rural county (Tompkins) ranks lowest in the percentage of adult population diagnosed with Cardiovascular Disease.

The trend exhibited above, where New York County becomes a slight outlier to the overall moderate negative correlation between educational attainment and chronic health conditions continues for the remaining plots in this category.

Fig. 9: While the general trend can still be observed, there is more variation in rates of COPD throughout New York counties than in other rates of chronic health conditions. For counties that have educational attainments between 10-20%, there appears to be a weak relationship between the two variables.

Fig. 10: The plot above demonstrates a similar theme to Figure 9, that is, a less clear relationship between educational attainment and the chronic condition at hand. Interestingly, both COPD and Asthma are conditions characterized by underlying airway inflammation (Cukic et al. 2012).

Fig. 11: The plot above demonstrates the same general trend as the other chronic conditions, but a weaker relationship between educational attainment and Arthritis specifically.

Social Determinants of Health

To examine the relationship between educational attainment and social determinants of health, I chose to look at: - Adults reporting a Depressive Disorder - Food Insecure Population - Drug Overdose Mortality Rate - Suicide Rate - Percent of Population with Limited Access to Healthy Foods

Overall, educational attainment is less of a reliable predictor of health outcomes when it comes to social determinants of health, especially with the added consideration of urbanicity.

Fig. 12: Above, you can see that the urban or rural nature of counties starts to become a larger confounding variable in the relationship between educational attainment and health outcomes. Here, we begin to measure health outcomes a bit differently, focusing more on social determinants of health, in this case the percentage of the county’s population experiencing Food Insecurity.

Fig. 13: The plot above suggests that the relationship typical of educational attainment and health outcomes probably does not characterize the health outcome of drug overdose mortality.

Fig. 14: Overall, it appears that suicide rates are lower in more urban areas (such as Bronx, Kings, and Queens counties) and higher in more rural areas (like Lewis, Schuyler, Greene counties).

Fig. 15: Again, it appears that Depressive Disorders are relatively lower in urban areas compared to rural areas, perhaps suggesting more of a relationship between urbanicity and social determinants of health than educational attainment and social determinants of health.

Fig. 16: While it appears that there might be some correlation between urban environments and more access to healthy foods, the relationship is not very strong.

Behavioral Risk Factors

To examine the relationship between educational attainment and health outcomes in the form of behavioral risk factors, I chose to look at: - Juvenile Arrest Rate - Percent of Adults who are Overweight or Obese - Percent of Adults who are Current Smokers - Percent of Adults Binge Drinking in the Last Month

Overall, educational attainment remained a fairly strong predictor of health outcomes in the category of behavioral risk factors.

Fig. 17: New York County, Tompkins County, and Albany County are key outliers.

Fig. 18: This relationship demonstrates a strong negative correlation consistent with other health outcomes, Bronx County marks an outlier in urbanicity.

Fig. 19: This relationship demonstrates a moderate negative correlation consistent with other health outcomes, New York County and Tompkins County mark appear to be outliers in terms of urbanicity.

Fig. 20: There doesn’t appear to be much of a relationship between educational attainment and binge drinking, nor does there appear to be one between urbanicity and binge drinking.

Discussion

Between the three categories of health outcomes, educational attainment seems to be the most reliable predictor of health outcomes in the category of Chronic Conditions, and the least reliable predictor of health outcomes in the category of Social Determinants of Health. Additionally, urbanicity seemed to influence this relationship the most along the axis of Social Determinants of Health, perhaps lending to the explanation of why educational attainment is a less reliable predictor of health outcomes of this particular type.

In conclusion, addressing health disparities requires a comprehensive understanding of the interplay between various determinants of health. Education impacts health outcomes through multifaceted pathways, offering access to economic resources, healthier environments, and improved lifestyle choices. Moreover, it’s deeply intertwined with contextual factors that affect both health and educational outcomes. Addressing chronic stress, trauma, and improving living conditions in both rural and urban areas can substantially impact health trajectories and educational achievements (National Academy of Sciences 2020). As such, efforts focusing on the nexus between education, health, and community experiences are crucial for ameliorating the pervasive disparities that simultaneously impact our healthcare and education systems in both rural and urban environments.

Insights from the Outliers

In cases where most of the data followed a consistent trend with the exception of a few outliers, those outliers tended to be New York County and Tompkins County. New York County offers insight into the urban paradox with respect to health outcomes, where advantages in healthcare access and resources frequently coexist with significant health disparities and challenges, influenced by diverse socioeconomic and environmental factors within urban settings.

Initially, the reason for Tompkins County’s reoccurring status as an outlier, relative to other counties of similar population and urbanicity, along several health outcomes was less clear. However, when looking at the County’s level of educational attainment, where 55% of the adult population has at least a Bachelors Degree, the slightly better health outcomes make more sense as they follow the typical relationship between educational attainment and health outcomes. The more confusing component of this outlier is the atypically high rate of educational attainment relative to the county’s population and urbanicity. Upon looking into it, I discovered that Tompkins County contains Ithaca, NY, which is home to Cornell University, which explains the abnormally high rate of educational attainment for a county of Tompkins County’s size and urbanicity. This also reinforces the link between educational attainment and health outcomes, and even suggesting that educational attainment might hold more weight than urbanicity when it comes to predicting health outcomes, as Tompkins County frequently outperformed counties of similar size and urbanicity with the main difference between them being educational attainment.

Further Research

In order to truly understand the impact of urbanicity on the relationship between educational attainment and health outcomes, I believe a smaller-scale analysis is necessary, in part due to the fact that there is a great deal of variation in health outcomes within urban centers, and this variation is overlooked in a county-level analysis like this one. Additional investigation with more counties of differing populations and urbanicities is also necessary to make conclusions about the extent to which urbanicity might influence health outcomes, and whether urbanicity can be seen as a predictor for health outcomes in a way comporable to educational attainment.

It’s also worth looking into the potential connection between urbanicity and inflammatory lung conditions like Asthma and COPD, considering that New York County was a slight outlier in both of those analyses where the rest of the data was fairly uniform. Conversely, health outcomes which didn’t seem to have patterns across educational attainment or urbanicity (binge drinking, for example) should be investigated through different lenses in order to gain insight as to why these particular outcomes defy the pattern that many similar outcomes follow.

Works Cited

Assaf, Shireen and Christina Juan. 2020. Variations in health outcomes with alternative measures of urbanicity, using demographic and health surveys 2013-18. DHS Analytical Studies No. 73. Rockville, Maryland, USA: ICF. Available at https://www.dhsprogram.com/pubs/pdf/AS73/AS73.pdf.

National Academies of Sciences, Engineering, and Medicine; Health and Medicine Division; Board on Population Health and Public Health Practice; Roundtable on Population Health Improvement; Wizemann, T. M. (Ed.). (2019). School Success: An Opportunity for Population Health: Proceedings of a Workshop. Washington (DC): National Academies Press (US). The Relationship Between Education and Health. Available from: https://www.ncbi.nlm.nih.gov/books/NBK566338/

National Academy of Medicine. (2014). Perspectives 2014: Understanding the Relationship Between Education and Health. Retrieved from https://nam.edu/perspectives-2014-understanding-the-relationship-between-education-and-health/

Raghupathi, V., & Raghupathi, W. (2020). The influence of education on health: An empirical assessment of OECD countries for the period 1995–2015. Archives of Public Health, 78(1), 20. https://doi.org/10.1186/s13690-020-00402-5

U.S. Department of Health and Human Services, Office of Disease Prevention and Health Promotion. (n.d.). Enrollment in Higher Education. Healthy People 2030. Retrieved from https://health.gov/healthypeople/priority-areas/social-determinants-health/literature-summaries/enrollment-higher-education

Weeks, W. B., Chang, J. E., Pagán, J. A., Lumpkin, J., Michael, D., Salcido, S., et al. (2023). Rural-urban disparities in health outcomes, clinical care, health behaviors, and social determinants of health and an action-oriented, dynamic tool for visualizing them. PLOS Global Public Health, 3(10), e0002420. https://doi.org/10.1371/journal.pgph.0002420

World Health Organization. (n.d.). Urban health. Retrieved from https://www.who.int/news-room/fact-sheets/detail/urban-health#:~:text=While%20urbanization%20can%20bring%20health,varying%20from%20street%20to%20street.

Zajacova, A., & Lawrence, E. M. (2018). The Relationship Between Education and Health: Reducing Disparities Through a Contextual Approach. Annual review of public health, 39, 273–289. https://doi.org/10.1146/annurev-publhealth-031816-044628

LS0tCnRpdGxlOiAiRWR1Y2F0aW9uYWwgQXR0YWlubWVudCBhbmQgSGVhbHRoIE91dGNvbWVzIC0gTWV0aG9kcyAxIEZpbmFsIFByb2plY3QgRmFsbAogIDIwMjMiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgdGhlbWU6IGpvdXJuYWwKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBkZl9wcmludDogcGFnZWQKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQobWVzc2FnZSA9IEYsCiAgICAgICAgICAgICAgICAgICAgICBlY2hvID0gRiwKICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGKQpgYGAKCiMjIEFuIEFuYWx5c2lzIG9mIEVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgYW5kIEhlYWx0aCBPdXRjb21lcyBpbiBOZXcgWW9yayBDb3VudGllcwojIyMgTWV0aG9kcyAxIEZpbmFsIFByb2plY3QgfCBGYWxsIDIwMjMKIyMjIE5hdGFsaWUgVGVtcGxlCgpgYGB7cn0KbGlicmFyeShyZWFkeGwpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFJTb2NyYXRhKQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5Y2Vuc3VzKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShEVCkKb3B0aW9ucyhzY2lwZW4gPSA5OTkpCmBgYAoKCiMjIyBJbnRyb2R1Y3Rpb24gYW5kIEJhY2tncm91bmQKClRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBlZHVjYXRpb25hbCBhdHRhaW5tZW50IGFuZCBoZWFsdGggb3V0Y29tZXMgaGFzIGdhcm5lcmVkIHNpZ25pZmljYW50IGF0dGVudGlvbiBpbiByZXNlYXJjaCBvdmVyIHRoZSBsYXN0IHNldmVyYWwgZGVjYWRlcywgcGxheWluZyBhIHBpdm90YWwgcm9sZSBpbiB1bmRlcnN0YW5kaW5nIGFuZCBhZGRyZXNzaW5nIGhlYWx0aCBkaXNwYXJpdGllcyB3aXRoaW4gdGhlIFVuaXRlZCBTdGF0ZXMuIEEgY29tcHJlaGVuc2l2ZSB1bmRlcnN0YW5kaW5nIG9mIHRoaXMgbGluayBpcyBjcnVjaWFsIGZvciBtaXRpZ2F0aW5nIGhlYWx0aCBpbmVxdWFsaXRpZXMgYW5kIGVuaGFuY2luZyB0aGUgb3ZlcmFsbCB3ZWxsLWJlaW5nIG9mIDIxc3QtY2VudHVyeSBwb3B1bGF0aW9ucy4gRW1waXJpY2FsIHJlc2VhcmNoIGhhcyBjb25zaXN0ZW50bHkgZGVtb25zdHJhdGVkIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGVkdWNhdGlvbmFsIGFjaGlldmVtZW50IGFuZCBoZWFsdGggc3RhdHVzLCBpbGx1bWluYXRpbmcgaG93IGRpc3Bhcml0aWVzIGluIGVkdWNhdGlvbiBwZXJwZXR1YXRlIGluZXF1YWxpdGllcyBpbiBoZWFsdGggb3V0Y29tZXMgKFphamFjb3ZhIGFuZCBMYXdyZW5jZSAyMDE4KS4KCkFzIGVkdWNhdGlvbiBpbmNyZWFzaW5nbHkgYmVjYW1lIHRoZSBjb25kdWl0IHRvIGZpbmFuY2lhbCBzdGFiaWxpdHkgYW5kIHNvY2lldGFsIGFkdmFuY2VtZW50IGluIHRoZSBVLlMuLCBkaXNwYXJpdGllcyBpbiBlZHVjYXRpb25hbCBvcHBvcnR1bml0aWVzIGVtZXJnZWQsIGRyaXZlbiBieSBmYWN0b3JzIGxpa2UgbmVpZ2hib3Job29kIGNoYXJhY3RlcmlzdGljcywgcmFjaWFsIGRpc3Bhcml0aWVzLCBhbmQgZWNvbm9taWMgc2hpZnRzLiBBZGRpdGlvbmFsbHksIGEgc3R1ZGVudCdzIHNvY2lhbCBjb250ZXh0LCBpbmNsdWRpbmcgZmFtaWx5IGJhY2tncm91bmQgYW5kIHN1cHBvcnQgc3lzdGVtcywgc2lnbmlmaWNhbnRseSBpbXBhY3RzIHRoZWlyIGFiaWxpdHkgdG8gYWNjZXNzIGFuZCBzdWNjZWVkIGluIGhpZ2hlciBlZHVjYXRpb24uIFN0dWRlbnRzIHdpdGggcGFyZW50YWwgZXhwZXJpZW5jZSBpbiBjb2xsZWdlIGJlbmVmaXQgZnJvbSB0aGVpciBwYXJlbnRzJyBrbm93bGVkZ2UgYW5kIG5ldHdvcmtzLCBhaWRpbmcgdGhlbSBpbiBuYXZpZ2F0aW5nIHRoZSBjb21wbGV4IGNvbGxlZ2UgYWRtaXNzaW9uIHByb2Nlc3NlcyBhbmQgYWNhZGVtaWMgZXhwZWN0YXRpb25zLiBDb252ZXJzZWx5LCBmaXJzdC1nZW5lcmF0aW9uIGNvbGxlZ2Ugc3R1ZGVudHMgbWF5IGZhY2UgY2hhbGxlbmdlcyBkdWUgdG8gdGhlIGFic2VuY2Ugb2Ygc2ltaWxhciBzdXBwb3J0IHN0cnVjdHVyZXMuIEluc3RpdHV0aW9uYWwgYmFycmllcnMgd2l0aGluIGNvbGxlZ2VzIGFuZCB1bml2ZXJzaXRpZXMgYWxzbyBoaW5kZXIgZW5yb2xsbWVudCBhbmQgZ3JhZHVhdGlvbiByYXRlcy4gRmFjdG9ycyBzdWNoIGFzIGRpbWluaXNoaW5nIHB1YmxpYyBmdW5kaW5nIGxlYWRpbmcgdG8gaGlnaGVyIHR1aXRpb24gZmVlcywgbGltaXRlZCBmaW5hbmNpYWwgYWlkIHJlc291cmNlcywgYW5kIGluYWRlcXVhdGUgc3VwcG9ydCBzZXJ2aWNlcywgcGFydGljdWxhcmx5IGluIGNvbW11bml0eSBjb2xsZWdlcywgcHJlc2VudCBodXJkbGVzIGZvciBzdHVkZW50cy4oT2ZmaWNlIG9mIERpc2Vhc2UgUHJldmVudGlvbiBhbmQgSGVhbHRoIFByb21vdGlvbikuIAoKQmVjYXVzZSBvZiB0aGUgc3Ryb25nLCBmYWlybHkgY2xlYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gZWR1Y2F0aW9uYWwgYXR0YWlubWVudCBhbmQgaGVhbHRoIG91dGNvbWVzLCBlZHVjYXRpb24gY2FuIHNlcnZlIGFzIGEgc3Ryb25nIGRyaXZlciBvZiBib3RoIG9wcG9ydHVuaXR5IGFuZCBpbmVxdWFsaXR5IChSYWdodXBhdGhpIGFuZCBSYWdodXBhdGhpIDIwMjApLiAKCkEgZmFyIGxlc3MgY2xlYXIgcmVsYXRpb25zaGlwLCBob3dldmVyLCBpcyB0aGF0IGJldHdlZW4gYSBwbGFjZSdzIGRlZ3JlZSBvZiAndXJiYW4tbmVzcycgKHdoaWNoIEkgd2lsbCByZWZlciB0byBhcyB1cmJhbmljaXR5KSBhbmQgaGVhbHRoIG91dGNvbWVzLiBKdXN0IGFzIGVkdWNhdGlvbiBjYW4gZHJpdmUgYm90aCBvcHBvcnR1bml0eSBhbmQgaW5lcXVhbGl0eSwgdXJiYW4gZW52aXJvbm1lbnRzIHNlZW0gdG8gc3ltYm9saXplIGEgcGFyYWRveCBpbiB0ZXJtcyBvZiBoZWFsdGhjYXJlLiBXaGlsZSB1cmJhbiBlbnZpcm9ubWVudHMgaGF2ZSBiZWVuIGFzc29jaWF0ZWQgd2l0aCBpbmNyZWFzZWQgYWNjZXNzIHRvIGFuZCB1dGlsaXphdGlvbiBvZiBoZWFsdGggc2VydmljZXMsIHRoZXkgaGF2ZSBhbHNvIGJlZW4gbGlua2VkIHRvIG1vcmUgaGVhbHRoIHJpc2tzIHRoYW4gcnVyYWwgYXJlYXMgb2Z0ZW4gZHVlIHRvIHRoZSBpbmhlcmVudCBvdmVyY3Jvd2RlZCBuYXR1cmUgb2YgdXJiYW4gcGxhY2VzIChXb3JsZCBIZWFsdGggT3JnYW5pemF0aW9uIDIwMjEpICYgKEFzc2FmIDIwMjApLiBBcyBzdWNoLCBmb3IgdGhpcyBwcm9qZWN0IEkgd2FudGVkIHRvIGludmVzdGlnYXRlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBlZHVjYXRpb25hbCBhdHRhaW5tZW50IGFuZCBoZWFsdGggb3V0Y29tZXMgaW4gdGhlIGNvbnRleHQgb2YgTmV3IFlvcmsgU3RhdGUsIHBheWluZyBhdHRlbnRpb24gdG8gZGlmZmVyZW5jZXMgYWNyb3NzIHJ1cmFsIGFuZCB1cmJhbiBjb3VudHkgY29udGV4dHMuCgojIyMgUmVzZWFyY2ggRm9jdXMgYW5kIERhdGEgU291cmNlcwoKX1Jlc2VhcmNoIFF1ZXN0aW9uczpfCkluIHRoaXMgYW5hbHlzaXMsIEkgc291Z2h0IHRvIGV4cGxvcmUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgYW5kIGhlYWx0aCBvdXRjb21lcyBpbiBOZXcgWW9yaywgZmFjdG9yaW5nIGluIHRoZSB1cmJhbiBhbmQgcnVyYWwgY29udGV4dHMgb2YgdGhlIGRpZmZlcmVudCBjb3VudGllcyBhY3Jvc3MgdGhlIHN0YXRlLiBJIHdhcyBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBpbiB3aGV0aGVyIGEgY291bnR5J3MgdXJiYW5pY2l0eSB3b3VsZCBoYXZlIGFueSBlZmZlY3Qgb24gdGhlIHdlbGwtZG9jdW1lbnRlZCByZWxhdGlvbnNoaXAgYmV0d2VlbiBlZHVjYXRpb25hbCBhdHRhaW5tZW50IGFuZCBoZWFsdGggb3V0Y29tZXMsIGFuZCBpZiBzbywgSSB3YXMgY3VyaW91cyBhcyB0byBhbnkgcG90ZW50aWFsIGNvbW1vbmFsaXRpZXMgYWxvbmcgdGhlIHR5cGVzIG9mIGhlYWx0aCBvdXRjb21lcyBmb3Igd2hpY2ggdXJiYW5pY2l0eSB3b3VsZCBiZSBhIHN0cm9uZyBjb25mb3VuZGluZyBmYWN0b3IuCgpfRGF0YSBhbmQgU291cmNlczpfClRvIGRlZmluZSBhbmQgbWVhc3VyZSBlZHVjYXRpb25hbCBhdHRhaW5tZW50IGFuZCBjb3VudHkgcG92ZXJ0eSwgSSBvYnRhaW5lZCBkYXRhIGZyb20gdGhlIDIwMTctMjAyMSBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5LiBXaGlsZSB0aGUgZm9ybWVyIHdhcyBhY2Nlc3NlZCB3aXRoIHRoZSB0aWR5dmVyc2UgUiBwYWNrYWdlLCB0aGUgbGF0dGVyIHdhcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBTbWFsbCBBcmVhIEluY29tZSBhbmQgUG92ZXJ0eSBFc3RpbWF0ZXMgZGF0YWJhc2UuIAoKVGhlIHR3byBzb3VyY2VzIHVzZWQgZm9yIGhlYWx0aCBvdXRjb21lcyBkYXRhIHdlcmUgdGhlIDIwMjEgTmV3IFlvcmsgQ291bnR5IEhlYWx0aCBSYW5raW5ncyBEYXRhIGZyb20gdGhlIFVuaXZlcnNpdHkgb2YgV2lzY29uc2luIFBvcHVsYXRpb24gSGVhbHRoIEluc3RpdHV0ZSBhbmQgdGhlIDIwMjEgQ291bnR5LUxldmVsIEJlaGF2aW9yYWwgUmlzayBGYWN0b3IgU3VydmVpbGxhbmNlIFN5c3RlbSBmcm9tIHRoZSBOZXcgWW9yayBTdGF0ZSBEZXBhcnRtZW50IG9mIEhlYWx0aCBkYXRhIHBvcnRhbC4KCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIGltcG9ydCByYXcgZGF0YQpyYXdfaGVhbHRoX291dGNvbWVzIDwtIHN1cHByZXNzV2FybmluZ3MocmVhZF9leGNlbCgifi9EZXNrdG9wL21ldGhvZHMxL3BhcnQyL2RhdGEvcmF3LzIwMjEgQ291bnR5IEhlYWx0aCBSYW5raW5ncyBOZXcgWW9yayBEYXRhIC0gdjEueGxzeCIsIAogICAgc2hlZXQgPSAiQWRkaXRpb25hbCBNZWFzdXJlIERhdGEiLCBza2lwID0gMSkpCgpyYXdfY291bnR5X3BvdiA8LSBzdXBwcmVzc1dhcm5pbmdzKHJlYWRfY3N2KCJ+L0Rlc2t0b3AvbWV0aG9kczEvcGFydDIvZGF0YS9yYXcvcHJvZHVjdERvd25sb2FkXzIwMjMtMTItMTBUMTg1NDA0L2FjczIxX2NvdW50eV9wb3YuY3N2IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSAxKSkKCnJhd19jb3VudHlfYnJmc3MgPC0gc3VwcHJlc3NXYXJuaW5ncyhyZWFkLnNvY3JhdGEoImh0dHBzOi8vaGVhbHRoLmRhdGEubnkuZ292L3Jlc291cmNlL2pzeTctZWI0bi5jc3YiKSkKCnJhd19hdHRhaW5tZW50X255ID0gc3VwcHJlc3NXYXJuaW5ncyhnZXRfYWNzKGdlb2dyYXBoeSA9ICJjb3VudHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzID0gYyh0b3RhbF8yNV9vdmVyID0gIkIxNTAwM18wMDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMTJub19kaXBgID0gIkIxNTAwM18wMTYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdfZGlwID0gIkIxNTAwM18wMTciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZWRfb3JfYWx0ID0gIkIxNTAwM18wMTgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNoZWxvcnMgPSAiQjE1MDAzXzAyMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3RlcnMgPSAiQjE1MDAzXzAyMyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9mZXNzaW9uYWwgPSAiQjE1MDAzXzAyNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoZCA9ICJCMTUwMDNfMDI1IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9ICJOWSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0gMjAyMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAid2lkZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeSA9IFQpKQpgYGAKCgpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQojIHByb2Nlc3MgZGF0YQphdHRhaW5tZW50X255IDwtIHJhd19hdHRhaW5tZW50X255IHw+CiAgbXV0YXRlKE5BTUUgPSBnc3ViKCIgQ291bnR5LCBOZXcgWW9yayIsICIiLCBOQU1FKSkgfD4KICByZW5hbWUoY291bnR5ID0gTkFNRSkgfD4KICBtdXRhdGUocGN0X2JhY2hlbG9yc19wbHVzID0gKGJhY2hlbG9yc0UgKyBtYXN0ZXJzRSArIHByb2Zlc3Npb25hbEUgK3BoZEUpL3RvdGFsXzI1X292ZXJFKSB8PgogIG11dGF0ZShwY3RfaHNfZGlwX2VxID0gKHJlZ19kaXBFICsgYDEybm9fZGlwRWApL3RvdGFsXzI1X292ZXJFKQoKY291bnR5X2JyZnNzIDwtIHJhd19jb3VudHlfYnJmc3MgfD4KICBmaWx0ZXIoeWVhcnMgPT0gIjIwMjEiICYgZ2VvZ3JhcGh5ID09ICJDb3VudHkiKSB8PgogIHNlbGVjdCgtKHByZXZlbnRpb25fYWdlbmRhX3BhKSAmIC0ocGFfcmF0ZV90eXBlICkgJiAtKHNoaXApICYgLShzaGlwX3JhdGVfdHlwZSkKICAgICAgICAgJiAtKGRzcmlwKSAmIC0oZHNyaXBfcmF0ZV90eXBlKSAmIC0oY2hpcnMpICYgLShjaGlyc19yYXRlX3R5cGUpICYgCiAgICAgICAgICAgLSh1cHN0YXRlX2Rvd25zdGF0ZV9zb3J0X2tleSkgJiAtKGRzcmlwX3JlZ2lvbl9zb3J0X2tleSkgJiAtKGNvdW50eV9zb3J0X2tleSkgJiAtKGhlYWx0aF9pbmRpY2F0b3Jfc29ydF9rZXkpKSB8PgogIHJlbmFtZSgiY291bnR5IiA9ICJyZWdpb25fY291bnR5IiwKICAgICAgICAgInRwb3BfYXRyaXNrIiA9ICJlc3RfZGVub21pbmF0b3IiKSB8PgogIHNlcGFyYXRlKGxvY2F0aW9uLCBpbnRvID0gYygiZXh0cmEiLCAibGF0aXR1ZGUiLCAibG9uZ2l0dWRlIiksIHNlcCA9ICIsIikgfD4KICBzZWxlY3QoLShleHRyYSkpIHw+CiAgc2VsZWN0KC0oY2xfOTVfbG93ZXJfdW5hZGp1c3RlZCkpIHw+CiAgc2VsZWN0KC0oY2xfOTVfdXBwZXJfdW5hZGp1c3RlZCkpIHw+CiAgc2VsZWN0KC0oY2xfOTVfdXBwZXJfYWRqdXN0ZWQpKSB8PgogIHNlbGVjdCgtKGNsXzk1X2xvd2VyX2FkanVzdGVkKSkgfD4KICBncm91cF9ieShnZW9ncmFwaHkpCgpoZWFsdGhfZWR1IDwtIGF0dGFpbm1lbnRfbnkgfD4KICBsZWZ0X2pvaW4ocmF3X2hlYWx0aF9vdXRjb21lcywgYnkgPSBjKCJHRU9JRCIgPSAiRklQUyIpKSB8PgogIHNlbGVjdCgtKGNvbnRhaW5zKCI5NSUgQ0kiKSkpIHw+CiAgc2VsZWN0KC0oY29udGFpbnMoIkdyYWRlIFBlcmZvcm1hbmNlIikpKSB8PgogIHJlbmFtZShsaWZlX2V4cGVjdGFuY3kgPSAiTGlmZSBFeHBlY3RhbmN5IiwKICAgICAgICAgdHBvcCA9ICJQb3B1bGF0aW9uIiwKICAgICAgICAgcGN0X2RpYWJldGljID0gIiUgQWR1bHRzIHdpdGggRGlhYmV0ZXMiLAogICAgICAgICBwY3RfZm9vZF9pbnNlY3VyZSA9ICIlIEZvb2QgSW5zZWN1cmUiLAogICAgICAgICBkcnVnX29kX21vcnRhbGl0eV9yYXRlID0gIkRydWcgT3ZlcmRvc2UgTW9ydGFsaXR5IFJhdGUiLAogICAgICAgICBzdWljaWRlX3JhdGUgPSAiU3VpY2lkZSBSYXRlIChBZ2UtQWRqdXN0ZWQpIiwKICAgICAgICAganV2X2FycmVzdF9yYXRlID0gIkp1dmVuaWxlIEFycmVzdCBSYXRlIiwKICAgICAgICAgaHNfZ3JhZF9yYXRlID0gIkhpZ2ggU2Nob29sIEdyYWR1YXRpb24gUmF0ZSIsCiAgICAgICAgIGxpbV9hY2NfaGZvb2QgPSAiJSBMaW1pdGVkIEFjY2VzcyB0byBIZWFsdGh5IEZvb2RzIiwKICAgICAgICAgcGN0X3J1cmFsID0gIiUgUnVyYWwiKSB8PgogIHNlbGVjdCgtKFN0YXRlKSkgfD4KICBzZWxlY3QoLShDb3VudHkpKSB8PgogIG11dGF0ZShwY3RfZGlhYmV0aWMgPSAocGN0X2RpYWJldGljKi4wMSksCiAgICAgICAgIHBjdF9mb29kX2luc2VjdXJlID0gKHBjdF9mb29kX2luc2VjdXJlKi4wMSksCiAgICAgICAgIGRydWdfb2RfbW9ydGFsaXR5X3JhdGUgPSAoZHJ1Z19vZF9tb3J0YWxpdHlfcmF0ZSouMDEpLAogICAgICAgICBzdWljaWRlX3JhdGUgPSAoc3VpY2lkZV9yYXRlKi4wMSksCiAgICAgICAgIGp1dl9hcnJlc3RfcmF0ZSA9IChqdXZfYXJyZXN0X3JhdGUqLjAxKSwKICAgICAgICAgaHNfZ3JhZF9yYXRlID0gKGhzX2dyYWRfcmF0ZSouMDEpLAogICAgICAgICBsaW1fYWNjX2hmb29kID0gKGxpbV9hY2NfaGZvb2QqLjAxKSwKICAgICAgICAgcGN0X3J1cmFsID0gKHBjdF9ydXJhbCouMDEpKQoKYnJmc3NfZWR1IDwtIGF0dGFpbm1lbnRfbnkgfD4KICBsZWZ0X2pvaW4oY291bnR5X2JyZnNzLCBieSA9ICJjb3VudHkiKSB8PgogIG11dGF0ZSh1bmFkanVzdGVkX3JhdGUgPSB1bmFkanVzdGVkX3JhdGUqLjAxKSB8PgogIG11dGF0ZShhZGp1c3RlZF9yYXRlID0gYWRqdXN0ZWRfcmF0ZSouMDEpIHw+CiAgc2VsZWN0KC0oaGVhbHRoX2RvbWFpbikpIHw+CiAgc2VsZWN0KC0oeWVhcnMpKQoKZGlzYWJpbGl0eSA8LSBicmZzc19lZHUgfD4KICBncm91cF9ieShjb3VudHksIGhlYWx0aF9pbmRpY2F0b3Jfc2hvcnRfbmFtZSkgfD4KICBmaWx0ZXIoaGVhbHRoX2luZGljYXRvcl9zaG9ydF9uYW1lID09ICJEaXNhYmlsaXR5IikKCm93X29iZXNlIDwtIGJyZnNzX2VkdSB8PgogIGdyb3VwX2J5KGNvdW50eSwgaGVhbHRoX2luZGljYXRvcl9zaG9ydF9uYW1lKSB8PgogIGZpbHRlcihoZWFsdGhfaW5kaWNhdG9yX3Nob3J0X25hbWUgPT0gIk92ZXJ3ZWlnaHQgb3IgT2Jlc2UiKQoKc21va2luZyA8LSBicmZzc19lZHUgfD4KICBncm91cF9ieShjb3VudHksIGhlYWx0aF9pbmRpY2F0b3Jfc2hvcnRfbmFtZSkgfD4KICBmaWx0ZXIoaGVhbHRoX2luZGljYXRvcl9zaG9ydF9uYW1lID09ICJDdXJyZW50IFNtb2tpbmciKQoKYmxvb2RfcHJlc3N1cmUgPC0gYnJmc3NfZWR1IHw+CiAgZ3JvdXBfYnkoY291bnR5LCBoZWFsdGhfaW5kaWNhdG9yX3Nob3J0X25hbWUpIHw+CiAgZmlsdGVyKGhlYWx0aF9pbmRpY2F0b3Jfc2hvcnRfbmFtZSA9PSAiSGlnaCBCbG9vZCBQcmVzc3VyZSIpCgpjYXJkaW9fZGlzZWFzZSA8LSBicmZzc19lZHUgfD4KICBncm91cF9ieShjb3VudHksIGhlYWx0aF9pbmRpY2F0b3Jfc2hvcnRfbmFtZSkgfD4KICBmaWx0ZXIoaGVhbHRoX2luZGljYXRvcl9zaG9ydF9uYW1lID09ICJDYXJkaW92YXNjdWxhciBEaXNlYXNlIikKCmNvcGQgPC0gYnJmc3NfZWR1IHw+CiAgZ3JvdXBfYnkoY291bnR5LCBoZWFsdGhfaW5kaWNhdG9yX3Nob3J0X25hbWUpIHw+CiAgZmlsdGVyKGhlYWx0aF9pbmRpY2F0b3Jfc2hvcnRfbmFtZSA9PSAiQ09QRCIpCgphc3RobWEgPC0gYnJmc3NfZWR1IHw+CiAgZ3JvdXBfYnkoY291bnR5LCBoZWFsdGhfaW5kaWNhdG9yX3Nob3J0X25hbWUpIHw+CiAgZmlsdGVyKGhlYWx0aF9pbmRpY2F0b3Jfc2hvcnRfbmFtZSA9PSAiQXN0aG1hIikKCmFydGhyaXRpcyA8LSBicmZzc19lZHUgfD4KICBncm91cF9ieShjb3VudHksIGhlYWx0aF9pbmRpY2F0b3Jfc2hvcnRfbmFtZSkgfD4KICBmaWx0ZXIoaGVhbHRoX2luZGljYXRvcl9zaG9ydF9uYW1lID09ICJBcnRocml0aXMiKQoKZGVwcmVzc2lvbiA8LSBicmZzc19lZHUgfD4KICBncm91cF9ieShjb3VudHksIGhlYWx0aF9pbmRpY2F0b3Jfc2hvcnRfbmFtZSkgfD4KICBmaWx0ZXIoaGVhbHRoX2luZGljYXRvcl9zaG9ydF9uYW1lID09ICJEZXByZXNzaXZlIERpc29yZGVyIikKCmJpbmdlX2RyaW5raW5nIDwtIGJyZnNzX2VkdSB8PgogIGdyb3VwX2J5KGNvdW50eSwgaGVhbHRoX2luZGljYXRvcl9zaG9ydF9uYW1lKSB8PgogIGZpbHRlcihoZWFsdGhfaW5kaWNhdG9yX3Nob3J0X25hbWUgPT0gIkJpbmdlIERyaW5raW5nIikKCmNvdW50eV9wb3YgPC0gcmF3X2NvdW50eV9wb3YgfD4KICBmaWx0ZXIoYEdlb2dyYXBoaWMgQXJlYSBOYW1lYCAhPSAiVW5pdGVkIFN0YXRlcyIpIHw+CiAgbXV0YXRlKGBHZW9ncmFwaGljIEFyZWEgTmFtZWAgPSBnc3ViKCIgQ291bnR5LCBOZXcgWW9yayIsICIiLCBgR2VvZ3JhcGhpYyBBcmVhIE5hbWVgKSkgfD4KICByZW5hbWUoY291bnR5ID0gYEdlb2dyYXBoaWMgQXJlYSBOYW1lYCwKICAgICAgICAgcG9wX29mX2ludGVyZXN0ID0gYEVzdGltYXRlISFUb3RhbCEhUG9wdWxhdGlvbiBmb3Igd2hvbSBwb3ZlcnR5IHN0YXR1cyBpcyBkZXRlcm1pbmVkYCwKICAgICAgICAgcG92X3N0YXR1cyA9IGBFc3RpbWF0ZSEhQmVsb3cgcG92ZXJ0eSBsZXZlbCEhUG9wdWxhdGlvbiBmb3Igd2hvbSBwb3ZlcnR5IHN0YXR1cyBpcyBkZXRlcm1pbmVkYCwKICAgICAgICAgcGN0X2luX3BvdiA9IGBFc3RpbWF0ZSEhUGVyY2VudCBiZWxvdyBwb3ZlcnR5IGxldmVsISFQb3B1bGF0aW9uIGZvciB3aG9tIHBvdmVydHkgc3RhdHVzIGlzIGRldGVybWluZWRgKSB8PgogIHNlbGVjdChwb3Bfb2ZfaW50ZXJlc3QsIHBvdl9zdGF0dXMsIHBjdF9pbl9wb3YsIGNvdW50eSkgfD4KICBtdXRhdGUocGN0X2luX3BvdiA9IHBjdF9pbl9wb3YqLjAxKQoKcG92X2VkdSA8LSBhdHRhaW5tZW50X255IHw+CiAgcmlnaHRfam9pbihjb3VudHlfcG92LCBieSA9ICJjb3VudHkiKQpgYGAKCgojIyMgRWR1Y2F0aW9uYWwgQXR0YWlubWVudAoKVGhlIGZpcnN0IHN0ZXAgaW4gdGhpcyBleHBsb3JhdGlvbiB3YXMgbG9va2luZyBpbnRvIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgaW4gTmV3IFlvcmsgYXQgdGhlIGNvdW50eS1sZXZlbC4KCgpgYGB7cn0KYmFjaF9wbHVzX3N1bW0gPC0gc3RfZHJvcF9nZW9tZXRyeShhdHRhaW5tZW50X255KSB8PiAKICBncm91cF9ieShjb3VudHkpIHw+IAogIHJlbmFtZShDb3VudHkgPSAiY291bnR5IikgfD4KICBtdXRhdGUoYFBlcmNlbnQgb2YgQWR1bHRzIDI1KyB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZWAgPSBwZXJjZW50KHBjdF9iYWNoZWxvcnNfcGx1cykpfD4KICBzZWxlY3QoQ291bnR5LCBgUGVyY2VudCBvZiBBZHVsdHMgMjUrIHdpdGggYXQgbGVhc3QgYSBCYWNoZWxvcnMgRGVncmVlYCkKCmJhY2hfcGx1c19zdW1tIHw+IAogIGFycmFuZ2UoZGVzYyhgUGVyY2VudCBvZiBBZHVsdHMgMjUrIHdpdGggYXQgbGVhc3QgYSBCYWNoZWxvcnMgRGVncmVlYCkpIHw+CiAgZGF0YXRhYmxlKCkKYGBgCgoKYGBge3J9CmJhY2hfcGx1c19tYXAgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGF0dGFpbm1lbnRfbnksCiAgICAgICAgICBtYXBwaW5nID0gYWVzKGZpbGwgPSBwY3RfYmFjaGVsb3JzX3BsdXMsCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoY291bnR5LCAiOiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5QZXJjZW50IG9mIGFkdWx0cyB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXM6OnBlcmNlbnQocGN0X2JhY2hlbG9yc19wbHVzLCBhY2N1cmFjeSA9IDEpKSksCiAgICAgICAgICBjb2xvciA9ICJ0cmFuc3BhcmVudCIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfZmVybWVudGVyKGJyZWFrcz1jKDAsIC4xLCAuMiwgLjMsIC40KSwKICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gIlB1UmQiLCAKICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAxLAogICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IkFkdWx0cyB3aXRoIEJhY2hlbG9ycyBEZWdyZWUgb3IgSGlnaGVyICglKSIsIAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1wZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDFMKSkgKwogIGxhYnModGl0bGUgPSAiRWR1Y2F0aW9uYWwgQXR0YWlubWVudCBpbiBOZXcgWW9yayAyMDIxIiwKICAgICAgIGNhcHRpb24gPSAiU291cmNlOiBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5LCAyMDIxICIpCgpnZ3Bsb3RseShiYWNoX3BsdXNfbWFwLCB0b29sdGlwID0gInRleHQiKQoKYGBgCioqRmlnLiAxOioqClRoZSBtYXAgYWJvdmUgc2hvd3MgZWR1Y2F0aW9uYWwgYXR0YWlubWVudCwgaGVyZSBtZWFzdXJlZCBieSB0aGUgcGVyY2VudGFnZSBvZiBhZHVsdHMgMjUrIHdpdGggYXQgbGVhc3QgYSBCYWNoZWxvcnMgZGVncmVlLCBieSBjb3VudHkuIE5ldyBZb3JrIENvdW50eSwgaG91c2luZyB0aGUgYm9yb3VnaCBvZiBNYW5oYXR0YW4sIGRlbW9uc3RyYXRlcyB0aGUgaGlnaGVzdCBlZHVjYXRpb25hbCBhdHRhaW5tZW50IGFsb25nIHRoaXMgbWFya2VyIGF0IDYzJS4KCgpgYGB7cn0KaHNfZ3JhZF9tYXAgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGhlYWx0aF9lZHUsCiAgICAgICBtYXBwaW5nID0gYWVzKGZpbGwgPSBwY3RfaHNfZGlwX2VxLAogICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKGNvdW50eSwgIjoiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+UGVyY2VudCBvZiBhZHVsdHMgd2l0aCBIUyBEaXBsb21hIG9yIGVxdWl2YWxlbnQ6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlczo6cGVyY2VudChwY3RfaHNfZGlwX2VxLCBhY2N1cmFjeSA9IDEpKSksCiAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gInRyYW5zcGFyZW50IikgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9mZXJtZW50ZXIocGFsZXR0ZSA9ICJQdXJwbGVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gMSwKICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJQZXJjZW50IG9mIEFkdWx0cyAyNSsgd2l0aCBNYXggSFMgRGlwbG9tYSwgCiAgICAgICAgICAgICAgICAgICAgICAgR0VEIG9yIEVxdWl2YWxlbnQgKCUpIiwgCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPXBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMUwpKSArCiAgbGFicyh0aXRsZSA9ICJFZHVjYXRpb25hbCBBdHRhaW5tZW50IGJ5IENvdW50eSBpbiBOZXcgWW9yayAyMDIxIiwKICAgICAgIGNhcHRpb24gPSAiU291cmNlOiBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5LCAyMDIxIikKCmdncGxvdGx5KGhzX2dyYWRfbWFwLCB0b29sdGlwID0gInRleHQiKQpgYGAKKipGaWcuIDI6KioKVGhlIG1hcCBhYm92ZSBhbHNvIHNob3dzIHNpbWlsYXIgZGF0YSBvbiBlZHVjYXRpb25hbCBhdHRhaW5tZW50LCBidXQgd2l0aCB0aGUgb3BlcmF0aW9uYWwgZGVmaW5pdGlvbiBvZiBlZHVjYXRpb25hbCBhdHRhaW5tZW50IGJlaW5nIGEgX21heGltdW1fIG9mIGEgSGlnaCBTY2hvb2wgRGlwbG9tYSwgR0VELCBvciBvdGhlciBlcXVpdmFsZW50LiBJbiB0aGlzIGNhc2UsIE5ldyBZb3JrIENvdW50eSByYW5rcyB0aGUgbG93ZXN0IGZvciB0aGUgcGVyY2VudGFnZSBvZiB0aGUgYWR1bHQgcG9wdWxhdGlvbiB3aG9zZSBtYXhpbXVtIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgaXMgYSBoaWdoIHNjaG9vbCBkaXBsb21hIG9yIGVxdWl2YWxlbnQgZGVncmVlLgoKIyMjIEhlYWx0aCBPdXRjb21lcwoKTmV4dCwgSSBzb3J0ZWQgdGhyb3VnaCB0aGUgY291bnR5LWxldmVsIGhlYWx0aCBkYXRhIGFuZCBwdWxsZWQgb3V0IHNvbWUgdmFyaWFibGVzIHBlcnRhaW5pbmcgdG8gaGVhbHRoIG91dGNvbWVzIG9mIGRpZmZlcmVudCB0eXBlcyAoY2hyb25pYyBpbGxuZXNzLCBzb2NpYWwgZGV0ZXJtaW5hbnRzIG9mIGhlYWx0aCwgbGlmZSBleHBlY3RhbmN5LCBldGMpLgoKCmBgYHtyfQpoZWFsdGhfc3VtbSA8LSBzdF9kcm9wX2dlb21ldHJ5KGhlYWx0aF9lZHUpIHw+IAogIGdyb3VwX2J5KGNvdW50eSkgfD4gCiAgcmVuYW1lKENvdW50eSA9ICJjb3VudHkiKSB8PgogIG11dGF0ZShgUGVyY2VudCBvZiBBZHVsdHMgd2l0aCBEaWFiZXRlc2AgPSBwZXJjZW50KHBjdF9kaWFiZXRpYyksCiAgICAgICAgIGBMaWZlIEV4cGVjdGFuY3lgID0gY29tbWEobGlmZV9leHBlY3RhbmN5KSwKICAgICAgICAgYEZvb2QgSW5zZWN1cmUgUG9wdWxhdGlvbmAgPSBwZXJjZW50KHBjdF9mb29kX2luc2VjdXJlKSwKICAgICAgICAgYERydWcgT3ZlcmRvc2UgTW9ydGFsaXR5IFJhdGVgID0gcGVyY2VudChkcnVnX29kX21vcnRhbGl0eV9yYXRlKSwKICAgICAgICAgYFN1aWNpZGUgUmF0ZSAoQWdlLUFkanVzdGVkKWAgPSBwZXJjZW50KHN1aWNpZGVfcmF0ZSksCiAgICAgICAgIGBKdXZlbmlsZSBBcnJlc3QgUmF0ZWAgPSBwZXJjZW50KGp1dl9hcnJlc3RfcmF0ZSksCiAgICAgICAgIGBQb3B1bGF0aW9uIHdpdGggTGltaXRlZCBBY2Nlc3MgdG8gSGVhbHRoeSBGb29kYCA9IHBlcmNlbnQobGltX2FjY19oZm9vZCkpfD4KICBzZWxlY3QoYENvdW50eWAsIGBQZXJjZW50IG9mIEFkdWx0cyB3aXRoIERpYWJldGVzYCwgYExpZmUgRXhwZWN0YW5jeWAsIGBGb29kIEluc2VjdXJlIFBvcHVsYXRpb25gLCBgRHJ1ZyBPdmVyZG9zZSBNb3J0YWxpdHkgUmF0ZWAsIGBTdWljaWRlIFJhdGUgKEFnZS1BZGp1c3RlZClgLCBgSnV2ZW5pbGUgQXJyZXN0IFJhdGVgLCBgUG9wdWxhdGlvbiB3aXRoIExpbWl0ZWQgQWNjZXNzIHRvIEhlYWx0aHkgRm9vZGApCgpoZWFsdGhfc3VtbSB8PiAKICBkYXRhdGFibGUoKQpgYGAKCgpgYGB7cn0KbGlmZV9leHBlY3RhbmN5X21hcCA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gaGVhbHRoX2VkdSwKICAgICAgICAgIG1hcHBpbmcgPSBhZXMoZmlsbCA9IGxpZmVfZXhwZWN0YW5jeSwKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMChjb3VudHksICI6IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkF2ZXJhZ2UgTGlmZSBFeHBlY3RhbmN5OiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlczo6Y29tbWEobGlmZV9leHBlY3RhbmN5LCBhY2N1cmFjeSA9IDEpKSksCiAgICAgICAgICBjb2xvciA9ICJ0cmFuc3BhcmVudCIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUHVCdUduIiwKICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAxLAogICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IkF2ZXJhZ2UgTGlmZSBFeHBlY3RhbmN5IiwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9Y29tbWFfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIkxpZmUgRXhwZWN0YW5jeSBpbiBOZXcgWW9yayBieSBDb3VudHkiLAogICAgICAgY2FwdGlvbiA9ICJTb3VyY2U6IFVuaXZlcnNpdHkgb2YgV2lzY29uc2luIFBvcHVsYXRpb24gSGVhbHRoIEluc3RpdHV0ZSIpCgpnZ3Bsb3RseShsaWZlX2V4cGVjdGFuY3lfbWFwLCB0b29sdGlwID0gInRleHQiKQpgYGAKKipGaWcuIDM6KioKVGhlIG1hcCBhYm92ZSBzaG93cyB0aGUgYXZlcmFnZSBsaWZlIGV4cGVjdGFuY3kgYnkgY291bnR5LiBBZ2FpbiwgTmV3IFlvcmsgQ291bnR5IHJhbmtzIHRoZSBoaWdoZXN0IGluIGxpZmUgZXhwZWN0YW5jeSB3aXRoIGFuIGF2ZXJhZ2Ugb2YgODUgeWVhcnMsIHdoaWxlIGFsbCBjb3VudGllcyBjb250YWluaW5nIHRoZSBmaXZlIGJvcm91Z2hzIG9mIE5ldyBZb3JrIENpdHkgcmFuayB3aXRoaW4gdGhlIHRvcCAxNiBvdXQgb2YgNjIgdG90YWwgY291bnRpZXMuCgojIyMgQ291bnR5IFBvdmVydHkgYW5kIFBlcmNlbnQgUnVyYWwKCgpgYGB7cn0KY291bnR5X3BvdiA8LSByYXdfY291bnR5X3BvdiB8PgogIGZpbHRlcihgR2VvZ3JhcGhpYyBBcmVhIE5hbWVgICE9ICJVbml0ZWQgU3RhdGVzIikgfD4KICBtdXRhdGUoYEdlb2dyYXBoaWMgQXJlYSBOYW1lYCA9IGdzdWIoIiBDb3VudHksIE5ldyBZb3JrIiwgIiIsIGBHZW9ncmFwaGljIEFyZWEgTmFtZWApKSB8PgogIHJlbmFtZShjb3VudHkgPSBgR2VvZ3JhcGhpYyBBcmVhIE5hbWVgLAogICAgICAgICBwb3Bfb2ZfaW50ZXJlc3QgPSBgRXN0aW1hdGUhIVRvdGFsISFQb3B1bGF0aW9uIGZvciB3aG9tIHBvdmVydHkgc3RhdHVzIGlzIGRldGVybWluZWRgLAogICAgICAgICBwb3Zfc3RhdHVzID0gYEVzdGltYXRlISFCZWxvdyBwb3ZlcnR5IGxldmVsISFQb3B1bGF0aW9uIGZvciB3aG9tIHBvdmVydHkgc3RhdHVzIGlzIGRldGVybWluZWRgLAogICAgICAgICBwY3RfaW5fcG92ID0gYEVzdGltYXRlISFQZXJjZW50IGJlbG93IHBvdmVydHkgbGV2ZWwhIVBvcHVsYXRpb24gZm9yIHdob20gcG92ZXJ0eSBzdGF0dXMgaXMgZGV0ZXJtaW5lZGApIHw+CiAgc2VsZWN0KHBvcF9vZl9pbnRlcmVzdCwgcG92X3N0YXR1cywgcGN0X2luX3BvdiwgY291bnR5KSB8PgogIG11dGF0ZShwY3RfaW5fcG92ID0gcGN0X2luX3BvdiouMDEpCgpoZWFsdGhfcG92X2VkdSA8LSBoZWFsdGhfZWR1IHw+CiAgbGVmdF9qb2luKGNvdW50eV9wb3YsIGJ5ID0gImNvdW50eSIpCiAgCmBgYAoKCmBgYHtyfQpjb3VudHlfcG92X3N1bW0gPC0gc3RfZHJvcF9nZW9tZXRyeShoZWFsdGhfcG92X2VkdSkgfD4gCiAgZ3JvdXBfYnkoY291bnR5KSB8PiAKICByZW5hbWUoQ291bnR5ID0gImNvdW50eSIpIHw+CiAgbXV0YXRlKGBQb3ZlcnR5IFJhdGVgID0gcGVyY2VudChwY3RfaW5fcG92KSwKICAgICAgICAgYFBvcHVsYXRpb24gd2l0aCBhdCBsZWFzdCBhIEJhY2hlbG9ycyBEZWdyZWVgID0gcGVyY2VudChwY3RfYmFjaGVsb3JzX3BsdXMpLAogICAgICAgICBgUGVyY2VudCBSdXJhbGAgPSBwZXJjZW50KHBjdF9ydXJhbCksCiAgICAgICAgIGBMaWZlIEV4cGVjdGFuY3lgID0gY29tbWEobGlmZV9leHBlY3RhbmN5KSkgfD4KICBzZWxlY3QoQ291bnR5LCBgUG92ZXJ0eSBSYXRlYCwgYExpZmUgRXhwZWN0YW5jeWAsIGBQb3B1bGF0aW9uIHdpdGggYXQgbGVhc3QgYSBCYWNoZWxvcnMgRGVncmVlYCwgYFBlcmNlbnQgUnVyYWxgKQoKY291bnR5X3Bvdl9zdW1tIHw+IAogIGFycmFuZ2UoZGVzYyhgUG92ZXJ0eSBSYXRlYCkpIHw+CiAgZGF0YXRhYmxlKCkKYGBgCgoKVGhlIHRhYmxlIGFib3ZlIGNhbiBiZSB1c2VkIHRvIHNlZSBzaWRlIGJ5IHNpZGUgY29tcGFyaXNvbnMgb2YgcG92ZXJ0eSByYXRlcywgbGlmZSBleHBlY3RhbmN5LCBlZHVjYXRpb25hbCBhdHRhaW5tZW50LCBhbmQgdGhlIHJ1cmFsL3VyYmFuIG5hdHVyZSBvZiBlYWNoIGNvdW50eS4KCgojIyMgUmVzdWx0cyBhbmQgQW5hbHlzaXMKCkFmdGVyIGdldHRpbmcgYW4gaW5pdGlhbCBsb29rIGF0IHRoZSBkYXRhIHdpdGggbWFwcywgSSBtYWRlIGEgc2VyaWVzIG9mIHNjYXR0ZXIgcGxvdHMgdG8gZ2V0IGEgYmV0dGVyIHNlbnNlIG9mIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBlZHVjYXRpb25hbCBhdHRhaW5tZW50IGFuZCB0aGUgc3BlY2lmaWMgaGVhbHRoIG91dGNvbWVzIEkgY2hvc2UgdG8gaW52ZXN0aWdhdGUuIEF0IHRoaXMgcG9pbnQsIEkgYWxzbyBmYWN0b3JlZCBpbiB0aGUgY2Vuc3VzIHZhcmlhYmxlIGRlc2lnbmF0aW5nIHRoZSBwZXJjZW50YWdlIG9mIGNvdW50eSByZXNpZGVudHMgbGl2aW5nIGluIGEgcnVyYWwgYXJlYSB0byBzZXJ2ZSBhcyBhIG1lYXN1cmUgb2YgYSBjb3VudHkncyB1cmJhbiBvciBydXJhbCBzdGF0dXMuCgpgYGB7cn0KYmFjaF9wbHVzX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBoZWFsdGhfZWR1LCBuYS5ybSA9IFRSVUUsCiAgICAgICBhZXMoeCA9IHBjdF9iYWNoZWxvcnNfcGx1cywgeSA9IGxpZmVfZXhwZWN0YW5jeSwKICAgICAgICAgICBzaXplID0gdHBvcCwgCiAgICAgICAgICAgdGV4dCA9IHBhc3RlMChjb3VudHksICI6IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPkF2ZXJhZ2UgTGlmZSBFeHBlY3RhbmN5OiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlczo6Y29tbWEobGlmZV9leHBlY3RhbmN5LCBhY2N1cmFjeSA9IDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5QZXJjZW50YWdlIG9mIFBvcHVsYXRpb24gd2l0aCBhdCBsZWFzdCBhIEJhY2hlbG9ycyBEZWdyZWU6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXM6OnBlcmNlbnQocGN0X2JhY2hlbG9yc19wbHVzLCBhY2N1cmFjeSA9IDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5QZXJjZW50IG9mIFBvcHVsYXRpb24gbGl2aW5nIGluIGEgUnVyYWwgQXJlYTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlczo6cGVyY2VudChwY3RfcnVyYWwsIGFjY3VyYWN5ID0gMSkpKSwKICAgICAgIGNvbG9yID0gInRyYW5zcGFyZW50IikgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAuODUsCiAgICAgICAgICAgICBjb2xvciA9ICJkYXJrc2VhZ3JlZW4iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWFfZm9ybWF0KCkpICsKICAjIGNoYW5nZSBsZWdlbmQgbGFiZWwgZm9ybWF0dGluZwogIHNjYWxlX3NpemVfYXJlYShsYWJlbHMgPSBjb21tYSwgbWF4X3NpemUgPSAxMCkgKwogIGxhYnMoeCA9ICJFZHVjYXRpb25hbCBBdHRhaW5tZW50IChQZW9wbGUgMjUrIHdpdGggYXQgbGVhc3QgYSBCYWNoZWxvcnMgRGVncmVlKSIsIHkgPSAiTGlmZSBFeHBlY3RhbmN5IiwKICAgICAgIHRpdGxlID0gIkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgYW5kIExpZmUgRXhwZWN0YW5jeSIsCiAgICAgICBjYXB0aW9uID0gIlNvdXJjZXM6IFVuaXZlcnNpdHkgb2YgV2lzY29uc2luIFBvcHVsYXRpb24gSGVhbHRoIEluc3RpdHV0ZTsgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleSAyMDIxIiwKICAgICAgIHNpemUgPSAiUG9wdWxhdGlvbiIpICsKICB0aGVtZV9idygpCgpnZ3Bsb3RseShiYWNoX3BsdXNfcGxvdCwgdG9vbHRpcCA9ICJ0ZXh0IikKYGBgCioqRmlnLiA0OioqClRoZSBwbG90IGFib3ZlIGRlbW9uc3RyYXRlcyBhIHN0cm9uZyBwb3NpdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgYW5kIGxpZmUgZXhwZWN0YW5jeSwgaW1tZWRpYXRlbHkgdW5kZXJzY29yaW5nIHRoZSB1dGlsaXR5IG9mIGFkZHJlc3NpbmcgZWR1Y2F0aW9uLXJlbGF0ZWQgaW5lcXVpdGllcyBhcyBhIHRvb2wgZm9yIGFsc28gYWRkcmVzc2luZyBoZWFsdGggZGlzcGFyaXRpZXMgb3ZlcmFsbC4KCiMjIyMgQ2hyb25pYyBDb25kaXRpb25zCgpUbyBleGFtaW5lIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBlZHVjYXRpb25hbCBhdHRhaW5tZW50IGFuZCBjaHJvbmljIGhlYWx0aCBjb25kaXRpb25zLCBJIGNob3NlIHRvIGxvb2sgYXQ6Ci0gUGVyY2VudCBvZiBBZHVsdHMgd2l0aCBEaWFiZXRlcwotIFBlcmNlbnQgb2YgQWR1bHRzIGxpdmluZyB3aXRoIGEgRGlzYWJpbGl0eQotIFBlcmNlbnQgb2YgQWR1bHRzIERpYWdub3NlZCB3aXRoIEhpZ2ggQmxvb2QgUHJlc3N1cmUKLSBQZXJjZW50IG9mIEFkdWx0cyBEaWFnbm9zZWQgd2l0aCBDYXJkaW92YXNjdWxhciBEaXNlYXNlCi0gUGVyY2VudCBvZiBBZHVsdHMgRGlhZ25vc2VkIHdpdGggQXJ0aHJpdGlzCi0gUGVyY2VudCBvZiBBZHVsdHMgRGlhZ25vc2VkIHdpdGggQXN0aG1hCi0gUGVyY2VudCBvZiBBZHVsdHMgRGlhZ25vc2VkIHdpdGggQ09QRCAoQ2hyb25pYyBPYnN0cnVjdGl2ZSBQdWxtb25hcnkgRGlzZWFzZSkKCk1vc3Qgb2YgdGhlc2UgcmVsYXRpb25zaGlwcyBkZW1vbnN0cmF0ZWQgc3Ryb25nIHJlbGF0aW9uc2hpcHMgbGlua2luZyBoaWdoZXIgZWR1Y2F0aW9uYWwgYXR0YWlubWVudCB0byBiZXR0ZXIgaGVhbHRoIG91dGNvbWVzLCBpbiB0aGlzIGNhc2UgaW4gdGhlIGZvcm0gb2YgbG93ZXIgcmF0ZXMgb2YgY2hyb25pYyBjb25kaXRpb25zLgoKCmBgYHtyfQpkaWFiZXRlc19iYWNoX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBoZWFsdGhfZWR1LCBuYS5ybSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IHBjdF9iYWNoZWxvcnNfcGx1cywgeSA9IHBjdF9kaWFiZXRpYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gdHBvcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMChjb3VudHksICI6IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+UGVyY2VudCBvZiBBZHVsdHMgd2l0aCBEaWFiZXRlczogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlczo6cGVyY2VudChwY3RfZGlhYmV0aWMsIGFjY3VyYWN5ID0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlBlcmNlbnRhZ2Ugb2YgUG9wdWxhdGlvbiB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlczo6cGVyY2VudChwY3RfYmFjaGVsb3JzX3BsdXMsIGFjY3VyYWN5ID0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlBlcmNlbnQgb2YgUG9wdWxhdGlvbiBsaXZpbmcgaW4gYSBSdXJhbCBBcmVhOiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzOjpwZXJjZW50KHBjdF9ydXJhbCwgYWNjdXJhY3kgPSAxKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAidHJhbnNwYXJlbnQiKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IC44NSwKICAgICAgICAgICAgIGNvbG9yID0gInRoaXN0bGUyIikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsKICAjIGNoYW5nZSBsZWdlbmQgbGFiZWwgZm9ybWF0dGluZwogIHNjYWxlX3NpemVfYXJlYShsYWJlbHMgPSBjb21tYSwgbWF4X3NpemUgPSAxMCkgKwogIGxhYnMoeCA9ICJFZHVjYXRpb25hbCBBdHRhaW5tZW50IChQZW9wbGUgd2l0aCBhdCBsZWFzdCBhIEJhY2hlbG9ycyBEZWdyZWUpIiwgCiAgICAgICB5ID0gIlBlcmNlbnQgb2YgQWR1bHQgUG9wdWxhdGlvbiB3aXRoIERpYWJldGVzIiwKICAgICAgIHRpdGxlID0gIkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgYW5kIERpYWJldGVzIiwKICAgICAgIGNhcHRpb24gPSAiU291cmNlczogVW5pdmVyc2l0eSBvZiBXaXNjb25zaW4gUG9wdWxhdGlvbiBIZWFsdGggSW5zdGl0dXRlOyBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5IDIwMjEiLAogICAgICAgc2l6ZSA9ICJQb3B1bGF0aW9uIiwKICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsKICB0aGVtZV9idygpCgpnZ3Bsb3RseShkaWFiZXRlc19iYWNoX3Bsb3QsIHRvb2x0aXAgPSAidGV4dCIpCmBgYAoqKkZpZy4gNToqKgpUaGUgcGxvdCBhYm92ZSBleGhpYml0cyBhIHN0cm9uZyBuZWdhdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHJhdGVzIG9mIERpYWJldGVzIGFuZCBlZHVjYXRpb25hbCBhdHRhaW5tZW50LCBzZWVpbmcgYXMgY291bnRpZXMgd2l0aCBoaWdoZXIgbGV2ZWxzIG9mIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgYWxzbyBoYXZlIGxvd2VyIHJhdGVzIG9mIGRpYWJldGVzLiBBZ2FpbiwgdGhlIGNvdW50eSB3aXRoIHRoZSBsb3dlc3QgRGlhYmV0ZXMgcmF0ZSBpcyBOZXcgWW9yayBDb3VudHkuCgoKYGBge3J9CmRpc2FiaWxpdHlfYmFjaF9wbG90IDwtIGdncGxvdChkYXRhID0gZGlzYWJpbGl0eSwgbmEucm0gPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBwY3RfYmFjaGVsb3JzX3BsdXMsIHkgPSBhZGp1c3RlZF9yYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSB0b3RhbF8yNV9vdmVyRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMChjb3VudHksICI6IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+UGVyY2VudGFnZSBvZiBBZHVsdHMgbGl2aW5nIHdpdGggYSBEaXNhYmlsaXR5OiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzOjpwZXJjZW50KGFkanVzdGVkX3JhdGUsIGFjY3VyYWN5ID0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlBlcmNlbnRhZ2Ugb2YgUG9wdWxhdGlvbiB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlczo6cGVyY2VudChwY3RfYmFjaGVsb3JzX3BsdXMsIGFjY3VyYWN5ID0gMSkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gInRyYW5zcGFyZW50IikgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAuODUsCiAgICAgICAgICAgICBjb2xvciA9ICJkYXJrb3JhbmdlMSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArCiAgIyBjaGFuZ2UgbGVnZW5kIGxhYmVsIGZvcm1hdHRpbmcKICBzY2FsZV9zaXplX2FyZWEobGFiZWxzID0gY29tbWEsIG1heF9zaXplID0gMTApICsKICBsYWJzKHggPSAiRWR1Y2F0aW9uYWwgQXR0YWlubWVudCAoUGVvcGxlIHdpdGggYXQgbGVhc3QgYSBCYWNoZWxvcnMgRGVncmVlKSIsIHkgPSAiQWR1bHRzIGxpdmluZyB3aXRoIGEgRGlzYWJpbGl0eSIsCiAgICAgICB0aXRsZSA9ICJFZHVjYXRpb25hbCBBdHRhaW5tZW50IGFuZCBBZHVsdHMgd2l0aCBEaXNhYmlsaXRpZXMiLAogICAgICAgY2FwdGlvbiA9ICJTb3VyY2VzOiBVbml2ZXJzaXR5IG9mIFdpc2NvbnNpbiBQb3B1bGF0aW9uIEhlYWx0aCBJbnN0aXR1dGU7IEFtZXJpY2FuIENvbW11bml0eSBTdXJ2ZXkgMjAyMSIsCiAgICAgICBzaXplID0gIlBvcHVsYXRpb24iKSArCiAgdGhlbWVfYncoKQoKZ2dwbG90bHkoZGlzYWJpbGl0eV9iYWNoX3Bsb3QsIHRvb2x0aXAgPSAidGV4dCIpCmBgYAoqKkZpZy4gNjoqKgpXaGlsZSB0aGlzIHBsb3QgcmVmbGVjdHMgYSBzaW1pbGFyIGZhaXJseSBzdHJvbmcgbmVnYXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiBlZHVjYXRpb25hbCBhdHRhaW5tZW50IGFuZCBkaXNhYmlsaXR5IHRvIHRoYXQgaW4gdGhlIHByZXZpb3VzIHBsb3QsIE5ldyBZb3JrIENvdW50eSBpcyBhIHNsaWdodCBvdXRsaWVyIHRoaXMgdGltZSwgbWFya2luZyBhIGRlcGFydHVyZSBmcm9tIHRoZSBjb25zaXN0ZW50IHJlbGF0aW9uc2hpcCB0aGF0IGhhcyBiZWVuIG9ic2VydmVkIHRodXMgZmFyLiBUaGlzIGlzIGVzcGVjaWFsbHkgaW50ZXJlc3RpbmcgYmVjYXVzZSBOWUMgaGFzIGFuIGV4dGVuc2l2ZSBoZWFsdGggY2FyZSBzeXN0ZW0gd2l0aCBhbiBhYnVuZGFuY2Ugc2VydmljZXMgYXZhaWxhYmxlIGZvciBpbmRpdmlkdWFscyB3aXRoIGRpc2FiaWxpdGllcywgc28gdGhpcyBpcyBxdWl0ZSBhIHBvaWduYW50IGNhc2Ugb2YgdGhlIHVyYmFuIHBhcmFkb3guCgoKYGBge3J9CmJsb29kX3ByZXNzdXJlX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBibG9vZF9wcmVzc3VyZSwgbmEucm0gPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBwY3RfYmFjaGVsb3JzX3BsdXMsIHkgPSBhZGp1c3RlZF9yYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSB0b3RhbF8yNV9vdmVyRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMChjb3VudHksICI6IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+UGVyY2VudGFnZSBvZiBBZHVsdHMgRGlhZ25vc2VkIHdpdGggSGlnaCBCbG9vZCBQcmVzc3VyZTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlczo6cGVyY2VudChhZGp1c3RlZF9yYXRlLCBhY2N1cmFjeSA9IDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5QZXJjZW50YWdlIG9mIFBvcHVsYXRpb24gd2l0aCBhdCBsZWFzdCBhIEJhY2hlbG9ycyBEZWdyZWU6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXM6OnBlcmNlbnQocGN0X2JhY2hlbG9yc19wbHVzLCBhY2N1cmFjeSA9IDEpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gInRyYW5zcGFyZW50IikgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAuODUsCiAgICAgICAgICAgICBjb2xvciA9ICJzdGVlbGJsdWUiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogICMgY2hhbmdlIGxlZ2VuZCBsYWJlbCBmb3JtYXR0aW5nCiAgc2NhbGVfc2l6ZV9hcmVhKGxhYmVscyA9IGNvbW1hLCBtYXhfc2l6ZSA9IDEwKSArCiAgbGFicyh4ID0gIkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgKFBlb3BsZSB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZSkiLCB5ID0gIkFkdWx0cyBkaWFnbm9zZWQgd2l0aCBIaWdoIEJsb29kIFByZXNzdXJlIiwKICAgICAgIHRpdGxlID0gIkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgYW5kIEFkdWx0cyB3aXRoIEhpZ2ggQmxvb2QgUHJlc3N1cmUiLAogICAgICAgY2FwdGlvbiA9ICJTb3VyY2VzOiBVbml2ZXJzaXR5IG9mIFdpc2NvbnNpbiBQb3B1bGF0aW9uIEhlYWx0aCBJbnN0aXR1dGU7IEFtZXJpY2FuIENvbW11bml0eSBTdXJ2ZXkgMjAyMSIsCiAgICAgICBzaXplID0gIlBvcHVsYXRpb24iKSArCiAgdGhlbWVfYncoKQoKZ2dwbG90bHkoYmxvb2RfcHJlc3N1cmVfcGxvdCwgdG9vbHRpcCA9ICJ0ZXh0IikKYGBgCioqRmlnLiA3OioqClRoZSBwbG90IGFib3ZlIGRlbW9uc3RyYXRlcyBhIHN0cm9uZyBuZWdhdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgYW5kIHJhdGVzIG9mIEhpZ2ggQmxvb2QgUHJlc3N1cmUgZGlhZ25vc2lzLCByZWZsZWN0aW5nIHRoZSBzYW1lIHRyZW5kIGFzIHRoZSBoZWFsdGggb3V0Y29tZXMgb2YgbGlmZSBleHBlY3RhbmN5IGFuZCBEaWFiZXRlcyByYXRlLiBBZ2FpbiwgTmV3IFlvcmsgQ291bnR5IHJhbmtzIHRoZSBsb3dlc3QgaW4gSGlnaCBCbG9vZCBQcmVzc3VyZSBkaWFnbm9zZXMsIGJ1dCB0aGlzIHRpbWUsIGl0IGlzIHRpZWQgZm9yIHRoZSBzcG90IHdpdGggU3VsbGl2YW4gQ291bnR5IGFuZCBTY2h1eWxlciBDb3VudHksIGJvdGggbXVjaCBzbWFsbGVyIGluIG92ZXJhbGwgcG9wdWxhdGlvbiB3aXRoIG11Y2ggbGFyZ2VyIHByb3BvcnRpb25zIG9mIHRoZWlyIHBvcHVsYXRpb24gbGl2aW5nIGluIHJ1cmFsIGFyZWFzLgoKCmBgYHtyfQpjYXJkaW9fZGlzZWFzZV9wbG90IDwtIGdncGxvdChkYXRhID0gY2FyZGlvX2Rpc2Vhc2UsIG5hLnJtID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gcGN0X2JhY2hlbG9yc19wbHVzLCB5ID0gYWRqdXN0ZWRfcmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gdG90YWxfMjVfb3ZlckUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoY291bnR5LCAiOiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlBlcmNlbnRhZ2Ugb2YgQWR1bHRzIHdpdGggQ2FyZGlvdmFzY3VsYXIgRGlzZWFzZTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlczo6cGVyY2VudChhZGp1c3RlZF9yYXRlLCBhY2N1cmFjeSA9IDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5QZXJjZW50YWdlIG9mIFBvcHVsYXRpb24gd2l0aCBhdCBsZWFzdCBhIEJhY2hlbG9ycyBEZWdyZWU6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXM6OnBlcmNlbnQocGN0X2JhY2hlbG9yc19wbHVzLCBhY2N1cmFjeSA9IDEpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gInRyYW5zcGFyZW50IikgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAuODUsCiAgICAgICAgICAgICBjb2xvciA9ICJtYXJvb24iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogICMgY2hhbmdlIGxlZ2VuZCBsYWJlbCBmb3JtYXR0aW5nCiAgc2NhbGVfc2l6ZV9hcmVhKGxhYmVscyA9IGNvbW1hLCBtYXhfc2l6ZSA9IDEwKSArCiAgbGFicyh4ID0gIkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgKFBlb3BsZSB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZSkiLCB5ID0gIkFkdWx0cyB3aXRoIENhcmRpb3Zhc2N1bGFyIERpc2Vhc2UiLAogICAgICAgdGl0bGUgPSAiRWR1Y2F0aW9uYWwgQXR0YWlubWVudCBhbmQgQ2FyZGlvdmFzY3VsYXIgRGlzZWFzZSIsCiAgICAgICBjYXB0aW9uID0gIlNvdXJjZXM6IFVuaXZlcnNpdHkgb2YgV2lzY29uc2luIFBvcHVsYXRpb24gSGVhbHRoIEluc3RpdHV0ZTsgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleSAyMDIxIiwKICAgICAgIHNpemUgPSAiUG9wdWxhdGlvbiIpICsKICB0aGVtZV9idygpCgpnZ3Bsb3RseShjYXJkaW9fZGlzZWFzZV9wbG90LCB0b29sdGlwID0gInRleHQiKQpgYGAKKipGaWcuIDg6KioKV2hpbGUgc3RpbGwgZGVtb25zdHJhdGluZyBhIG1vZGVyYXRlbHkgc3Ryb25nIG5lZ2F0aXZlIGNvcnJlbGF0aW9uIGJldHdlZW4gZWR1Y2F0aW9uYWwgYXR0YWlubWVudCBhbmQgQ2FyZGlvdmFzY3VsYXIgRGlzZWFzZSwgdGhlIHBsb3QgYWJvdmUgaXMgZmFyIG1vcmUgdmFyaWVkIHdoZW4gaXQgY29tZXMgdG8gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgYW5kIENhcmRpb3Zhc2N1bGFyIERpc2Vhc2UuIE5ldyBZb3JrIENvdW50eSBpcyBhbiBvdXRsaWVyIGFnYWluIHdoaWxlIGEgbXVjaCBzbWFsbGVyLCBtb3JlIHJ1cmFsIGNvdW50eSAoVG9tcGtpbnMpIHJhbmtzIGxvd2VzdCBpbiB0aGUgcGVyY2VudGFnZSBvZiBhZHVsdCBwb3B1bGF0aW9uIGRpYWdub3NlZCB3aXRoIENhcmRpb3Zhc2N1bGFyIERpc2Vhc2UuIAoKVGhlIHRyZW5kIGV4aGliaXRlZCBhYm92ZSwgd2hlcmUgTmV3IFlvcmsgQ291bnR5IGJlY29tZXMgYSBzbGlnaHQgb3V0bGllciB0byB0aGUgb3ZlcmFsbCBtb2RlcmF0ZSBuZWdhdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgYW5kIGNocm9uaWMgaGVhbHRoIGNvbmRpdGlvbnMgY29udGludWVzIGZvciB0aGUgcmVtYWluaW5nIHBsb3RzIGluIHRoaXMgY2F0ZWdvcnkuCgoKYGBge3J9CmNvcGRfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGNvcGQsIG5hLnJtID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gcGN0X2JhY2hlbG9yc19wbHVzLCB5ID0gYWRqdXN0ZWRfcmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gdG90YWxfMjVfb3ZlckUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoY291bnR5LCAiOiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlBlcmNlbnRhZ2Ugb2YgQWR1bHRzIHdpdGggQ09QRDogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlczo6cGVyY2VudChhZGp1c3RlZF9yYXRlLCBhY2N1cmFjeSA9IDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5QZXJjZW50YWdlIG9mIFBvcHVsYXRpb24gd2l0aCBhdCBsZWFzdCBhIEJhY2hlbG9ycyBEZWdyZWU6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXM6OnBlcmNlbnQocGN0X2JhY2hlbG9yc19wbHVzLCBhY2N1cmFjeSA9IDEpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gInRyYW5zcGFyZW50IikgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAuODUsCiAgICAgICAgICAgICBjb2xvciA9ICJuYXZ5IikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsKICAjIGNoYW5nZSBsZWdlbmQgbGFiZWwgZm9ybWF0dGluZwogIHNjYWxlX3NpemVfYXJlYShsYWJlbHMgPSBjb21tYSwgbWF4X3NpemUgPSAxMCkgKwogIGxhYnMoeCA9ICJFZHVjYXRpb25hbCBBdHRhaW5tZW50IChQZW9wbGUgd2l0aCBhdCBsZWFzdCBhIEJhY2hlbG9ycyBEZWdyZWUpIiwgeSA9ICJBZHVsdHMgd2l0aCBDT1BEIiwKICAgICAgIHRpdGxlID0gIkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgYW5kIEFkdWx0cyB3aXRoIENPUEQiLAogICAgICAgY2FwdGlvbiA9ICJTb3VyY2VzOiBVbml2ZXJzaXR5IG9mIFdpc2NvbnNpbiBQb3B1bGF0aW9uIEhlYWx0aCBJbnN0aXR1dGU7IEFtZXJpY2FuIENvbW11bml0eSBTdXJ2ZXkgMjAyMSIsCiAgICAgICBzaXplID0gIlBvcHVsYXRpb24iKSArCiAgdGhlbWVfYncoKQoKZ2dwbG90bHkoY29wZF9wbG90LCB0b29sdGlwID0gInRleHQiKQpgYGAKKipGaWcuIDk6KioKV2hpbGUgdGhlIGdlbmVyYWwgdHJlbmQgY2FuIHN0aWxsIGJlIG9ic2VydmVkLCB0aGVyZSBpcyBtb3JlIHZhcmlhdGlvbiBpbiByYXRlcyBvZiBDT1BEIHRocm91Z2hvdXQgTmV3IFlvcmsgY291bnRpZXMgdGhhbiBpbiBvdGhlciByYXRlcyBvZiBjaHJvbmljIGhlYWx0aCBjb25kaXRpb25zLiBGb3IgY291bnRpZXMgdGhhdCBoYXZlIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnRzIGJldHdlZW4gMTAtMjAlLCB0aGVyZSBhcHBlYXJzIHRvIGJlIGEgd2VhayByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgdHdvIHZhcmlhYmxlcy4KCgpgYGB7cn0KYXN0aG1hX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBhc3RobWEsIG5hLnJtID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gcGN0X2JhY2hlbG9yc19wbHVzLCB5ID0gYWRqdXN0ZWRfcmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gdG90YWxfMjVfb3ZlckUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoY291bnR5LCAiOiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlBlcmNlbnRhZ2Ugb2YgQWR1bHRzIHdpdGggQXN0aG1hOiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzOjpwZXJjZW50KGFkanVzdGVkX3JhdGUsIGFjY3VyYWN5ID0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlBlcmNlbnRhZ2Ugb2YgUG9wdWxhdGlvbiB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlczo6cGVyY2VudChwY3RfYmFjaGVsb3JzX3BsdXMsIGFjY3VyYWN5ID0gMSkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAidHJhbnNwYXJlbnQiKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IC44NSwKICAgICAgICAgICAgIGNvbG9yID0gInBhbGV2aW9sZXRyZWQiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogICMgY2hhbmdlIGxlZ2VuZCBsYWJlbCBmb3JtYXR0aW5nCiAgc2NhbGVfc2l6ZV9hcmVhKGxhYmVscyA9IGNvbW1hLCBtYXhfc2l6ZSA9IDEwKSArCiAgbGFicyh4ID0gIkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgKFBlb3BsZSB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZSkiLCB5ID0gIkFkdWx0cyB3aXRoIEFzdGhtYSIsCiAgICAgICB0aXRsZSA9ICJFZHVjYXRpb25hbCBBdHRhaW5tZW50IGFuZCBBZHVsdHMgd2l0aCBBc3RobWEiLAogICAgICAgY2FwdGlvbiA9ICJTb3VyY2VzOiBVbml2ZXJzaXR5IG9mIFdpc2NvbnNpbiBQb3B1bGF0aW9uIEhlYWx0aCBJbnN0aXR1dGU7IEFtZXJpY2FuIENvbW11bml0eSBTdXJ2ZXkgMjAyMSIsCiAgICAgICBzaXplID0gIlBvcHVsYXRpb24iKSArCiAgdGhlbWVfYncoKQoKZ2dwbG90bHkoYXN0aG1hX3Bsb3QsIHRvb2x0aXAgPSAidGV4dCIpCmBgYAoqKkZpZy4gMTA6KioKVGhlIHBsb3QgYWJvdmUgZGVtb25zdHJhdGVzIGEgc2ltaWxhciB0aGVtZSB0byBGaWd1cmUgOSwgdGhhdCBpcywgYSBsZXNzIGNsZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgYW5kIHRoZSBjaHJvbmljIGNvbmRpdGlvbiBhdCBoYW5kLiBJbnRlcmVzdGluZ2x5LCBib3RoIENPUEQgYW5kIEFzdGhtYSBhcmUgY29uZGl0aW9ucyBjaGFyYWN0ZXJpemVkIGJ5IHVuZGVybHlpbmcgYWlyd2F5IGluZmxhbW1hdGlvbiAoQ3VraWMgZXQgYWwuIDIwMTIpLgoKCmBgYHtyfQphcnRocml0aXNfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGFydGhyaXRpcywgbmEucm0gPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBwY3RfYmFjaGVsb3JzX3BsdXMsIHkgPSBhZGp1c3RlZF9yYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSB0b3RhbF8yNV9vdmVyRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMChjb3VudHksICI6IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+UGVyY2VudGFnZSBvZiBBZHVsdHMgd2l0aCBBcnRocml0aXM6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXM6OnBlcmNlbnQoYWRqdXN0ZWRfcmF0ZSwgYWNjdXJhY3kgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+UGVyY2VudGFnZSBvZiBQb3B1bGF0aW9uIHdpdGggYXQgbGVhc3QgYSBCYWNoZWxvcnMgRGVncmVlOiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzOjpwZXJjZW50KHBjdF9iYWNoZWxvcnNfcGx1cywgYWNjdXJhY3kgPSAxKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ0cmFuc3BhcmVudCIpICsKICBnZW9tX3BvaW50KGFscGhhID0gLjg1LAogICAgICAgICAgICAgY29sb3IgPSAicGFsZXR1cnF1b2lzZTMiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogICMgY2hhbmdlIGxlZ2VuZCBsYWJlbCBmb3JtYXR0aW5nCiAgc2NhbGVfc2l6ZV9hcmVhKGxhYmVscyA9IGNvbW1hLCBtYXhfc2l6ZSA9IDEwKSArCiAgbGFicyh4ID0gIkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgKFBlb3BsZSB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZSkiLCB5ID0gIkFkdWx0cyB3aXRoIEFydGhyaXRpcyIsCiAgICAgICB0aXRsZSA9ICJFZHVjYXRpb25hbCBBdHRhaW5tZW50IGFuZCBBcnRocml0aXMiLAogICAgICAgY2FwdGlvbiA9ICJTb3VyY2VzOiBVbml2ZXJzaXR5IG9mIFdpc2NvbnNpbiBQb3B1bGF0aW9uIEhlYWx0aCBJbnN0aXR1dGU7IEFtZXJpY2FuIENvbW11bml0eSBTdXJ2ZXkgMjAyMSIsCiAgICAgICBzaXplID0gIlBvcHVsYXRpb24iKSArCiAgdGhlbWVfYncoKQoKZ2dwbG90bHkoYXJ0aHJpdGlzX3Bsb3QsIHRvb2x0aXAgPSAidGV4dCIpCmBgYAoqKkZpZy4gMTE6KioKVGhlIHBsb3QgYWJvdmUgZGVtb25zdHJhdGVzIHRoZSBzYW1lIGdlbmVyYWwgdHJlbmQgYXMgdGhlIG90aGVyIGNocm9uaWMgY29uZGl0aW9ucywgYnV0IGEgd2Vha2VyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgYW5kIEFydGhyaXRpcyBzcGVjaWZpY2FsbHkuCgoKIyMjIFNvY2lhbCBEZXRlcm1pbmFudHMgb2YgSGVhbHRoCgpUbyBleGFtaW5lIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBlZHVjYXRpb25hbCBhdHRhaW5tZW50IGFuZCBzb2NpYWwgZGV0ZXJtaW5hbnRzIG9mIGhlYWx0aCwgSSBjaG9zZSB0byBsb29rIGF0OgotIEFkdWx0cyByZXBvcnRpbmcgYSBEZXByZXNzaXZlIERpc29yZGVyCi0gRm9vZCBJbnNlY3VyZSBQb3B1bGF0aW9uCi0gRHJ1ZyBPdmVyZG9zZSBNb3J0YWxpdHkgUmF0ZQotIFN1aWNpZGUgUmF0ZQotIFBlcmNlbnQgb2YgUG9wdWxhdGlvbiB3aXRoIExpbWl0ZWQgQWNjZXNzIHRvIEhlYWx0aHkgRm9vZHMKCk92ZXJhbGwsIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgaXMgbGVzcyBvZiBhIHJlbGlhYmxlIHByZWRpY3RvciBvZiBoZWFsdGggb3V0Y29tZXMgd2hlbiBpdCBjb21lcyB0byBzb2NpYWwgZGV0ZXJtaW5hbnRzIG9mIGhlYWx0aCwgZXNwZWNpYWxseSB3aXRoIHRoZSBhZGRlZCBjb25zaWRlcmF0aW9uIG9mIHVyYmFuaWNpdHkuCgoKYGBge3J9CmZvb2RfaW5zZWN1cmVfYmFjaF9wbG90IDwtIGdncGxvdChkYXRhID0gaGVhbHRoX2VkdSwgbmEucm0gPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gcGN0X2JhY2hlbG9yc19wbHVzLCB5ID0gcGN0X2Zvb2RfaW5zZWN1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSB0cG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKGNvdW50eSwgIjoiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+Rm9vZCBJbnNlY3VyZSBQb3B1bGF0aW9uOiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlczo6cGVyY2VudChwY3RfZm9vZF9pbnNlY3VyZSwgYWNjdXJhY3kgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlBlcmNlbnRhZ2Ugb2YgUG9wdWxhdGlvbiB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXM6OnBlcmNlbnQocGN0X2JhY2hlbG9yc19wbHVzLCBhY2N1cmFjeSA9IDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+UGVyY2VudCBvZiBQb3B1bGF0aW9uIGxpdmluZyBpbiBhIFJ1cmFsIEFyZWE6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzOjpwZXJjZW50KHBjdF9ydXJhbCwgYWNjdXJhY3kgPSAxKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gInRyYW5zcGFyZW50IikgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAuODUsCiAgICAgICAgICAgICBjb2xvciA9ICJjb3JhbDQiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogICMgY2hhbmdlIGxlZ2VuZCBsYWJlbCBmb3JtYXR0aW5nCiAgc2NhbGVfc2l6ZV9hcmVhKGxhYmVscyA9IGNvbW1hLCBtYXhfc2l6ZSA9IDEwKSArCiAgbGFicyh4ID0gIkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgKFBlb3BsZSB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZSkiLCB5ID0gIkZvb2QgSW5zZWN1cmUgUG9wdWxhdGlvbiIsCiAgICAgICB0aXRsZSA9ICJFZHVjYXRpb25hbCBBdHRhaW5tZW50IGFuZCBGb29kIEluc2VjdXJpdHkiLAogICAgICAgY2FwdGlvbiA9ICJTb3VyY2VzOiBVbml2ZXJzaXR5IG9mIFdpc2NvbnNpbiBQb3B1bGF0aW9uIEhlYWx0aCBJbnN0aXR1dGU7IEFtZXJpY2FuIENvbW11bml0eSBTdXJ2ZXkgMjAyMSIsCiAgICAgICAjIGFkZCBuaWNlIGxhYmVsIGZvciBzaXplIGVsZW1lbnQKICAgICAgIHNpemUgPSAiUG9wdWxhdGlvbiIpICsKICB0aGVtZV9idygpCgpnZ3Bsb3RseShmb29kX2luc2VjdXJlX2JhY2hfcGxvdCwgdG9vbHRpcCA9ICJ0ZXh0IikKYGBgCioqRmlnLiAxMjoqKgpBYm92ZSwgeW91IGNhbiBzZWUgdGhhdCB0aGUgdXJiYW4gb3IgcnVyYWwgbmF0dXJlIG9mIGNvdW50aWVzIHN0YXJ0cyB0byBiZWNvbWUgYSBsYXJnZXIgY29uZm91bmRpbmcgdmFyaWFibGUgaW4gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgYW5kIGhlYWx0aCBvdXRjb21lcy4gSGVyZSwgd2UgYmVnaW4gdG8gbWVhc3VyZSBoZWFsdGggb3V0Y29tZXMgYSBiaXQgZGlmZmVyZW50bHksIGZvY3VzaW5nIG1vcmUgb24gc29jaWFsIGRldGVybWluYW50cyBvZiBoZWFsdGgsIGluIHRoaXMgY2FzZSB0aGUgcGVyY2VudGFnZSBvZiB0aGUgY291bnR5J3MgcG9wdWxhdGlvbiBleHBlcmllbmNpbmcgRm9vZCBJbnNlY3VyaXR5LiAKCgpgYGB7cn0KZHJ1Z19vZF9iYWNoX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBoZWFsdGhfZWR1LCBuYS5ybSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IHBjdF9iYWNoZWxvcnNfcGx1cywgeSA9IGRydWdfb2RfbW9ydGFsaXR5X3JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHRwb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMChjb3VudHksICI6IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+RHJ1ZyBPdmVyZG9zZSBNb3J0YWxpdHkgUmF0ZTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlczo6cGVyY2VudChkcnVnX29kX21vcnRhbGl0eV9yYXRlLCBhY2N1cmFjeSA9IDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5QZXJjZW50YWdlIG9mIFBvcHVsYXRpb24gd2l0aCBhdCBsZWFzdCBhIEJhY2hlbG9ycyBEZWdyZWU6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXM6OnBlcmNlbnQocGN0X2JhY2hlbG9yc19wbHVzLCBhY2N1cmFjeSA9IDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5QZXJjZW50IG9mIFBvcHVsYXRpb24gbGl2aW5nIGluIGEgUnVyYWwgQXJlYTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlczo6cGVyY2VudChwY3RfcnVyYWwsIGFjY3VyYWN5ID0gMSkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gInRyYW5zcGFyZW50IikgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAuODUsCiAgICAgICAgICAgICBjb2xvciA9ICJkYXJrb3JjaGlkNCIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArCiAgIyBjaGFuZ2UgbGVnZW5kIGxhYmVsIGZvcm1hdHRpbmcKICBzY2FsZV9zaXplX2FyZWEobGFiZWxzID0gY29tbWEsIG1heF9zaXplID0gMTApICsKICBsYWJzKHggPSAiRWR1Y2F0aW9uYWwgQXR0YWlubWVudCAoUGVvcGxlIHdpdGggYXQgbGVhc3QgYSBCYWNoZWxvcnMgRGVncmVlKSIsIHkgPSAiRHJ1ZyBPdmVyZG9zZSBNb3J0YWxpdHkgUmF0ZSIsCiAgICAgICB0aXRsZSA9ICJFZHVjYXRpb25hbCBBdHRhaW5tZW50IGFuZCBEcnVnIE92ZXJkb3NlIE1vcnRhbGl0eSIsCiAgICAgICBjYXB0aW9uID0gIlNvdXJjZXM6IFVuaXZlcnNpdHkgb2YgV2lzY29uc2luIFBvcHVsYXRpb24gSGVhbHRoIEluc3RpdHV0ZTsgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleSAyMDIxIiwKICAgICAgICMgYWRkIG5pY2UgbGFiZWwgZm9yIHNpemUgZWxlbWVudAogICAgICAgc2l6ZSA9ICJQb3B1bGF0aW9uIikgKwogIHRoZW1lX2J3KCkKCmdncGxvdGx5KGRydWdfb2RfYmFjaF9wbG90LCB0b29sdGlwID0gInRleHQiKQpgYGAKKipGaWcuIDEzOioqClRoZSBwbG90IGFib3ZlIHN1Z2dlc3RzIHRoYXQgdGhlIHJlbGF0aW9uc2hpcCB0eXBpY2FsIG9mIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgYW5kIGhlYWx0aCBvdXRjb21lcyBwcm9iYWJseSBkb2VzIG5vdCBjaGFyYWN0ZXJpemUgdGhlIGhlYWx0aCBvdXRjb21lIG9mIGRydWcgb3ZlcmRvc2UgbW9ydGFsaXR5LgoKCmBgYHtyfQpzdWljaWRlX2JhY2hfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGhlYWx0aF9lZHUsIG5hLnJtID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gcGN0X2JhY2hlbG9yc19wbHVzLCB5ID0gc3VpY2lkZV9yYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSB0cG9wLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKGNvdW50eSwgIjoiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5TdWljaWRlIFJhdGU6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXM6OnBlcmNlbnQoc3VpY2lkZV9yYXRlLCBhY2N1cmFjeSA9IDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5QZXJjZW50YWdlIG9mIFBvcHVsYXRpb24gd2l0aCBhdCBsZWFzdCBhIEJhY2hlbG9ycyBEZWdyZWU6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXM6OnBlcmNlbnQocGN0X2JhY2hlbG9yc19wbHVzLCBhY2N1cmFjeSA9IDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5QZXJjZW50IG9mIFBvcHVsYXRpb24gbGl2aW5nIGluIGEgUnVyYWwgQXJlYTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlczo6cGVyY2VudChwY3RfcnVyYWwsIGFjY3VyYWN5ID0gMSkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gInRyYW5zcGFyZW50IikgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAuODUsCiAgICAgICAgICAgICBjb2xvciA9ICJsaWdodGJsdWUzIikgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsKICAjIGNoYW5nZSBsZWdlbmQgbGFiZWwgZm9ybWF0dGluZwogIHNjYWxlX3NpemVfYXJlYShsYWJlbHMgPSBjb21tYSwgbWF4X3NpemUgPSAxMCkgKwogIGxhYnMoeCA9ICJFZHVjYXRpb25hbCBBdHRhaW5tZW50IChQZW9wbGUgd2l0aCBhdCBsZWFzdCBhIEJhY2hlbG9ycyBEZWdyZWUpIiwgeSA9ICJBZ2UtQWRqdXN0ZWQgU3VpY2lkZSBSYXRlIiwKICAgICAgIHRpdGxlID0gIkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgYW5kIFN1aWNpZGUgUmF0ZSIsCiAgICAgICBjYXB0aW9uID0gIlNvdXJjZXM6IFVuaXZlcnNpdHkgb2YgV2lzY29uc2luIFBvcHVsYXRpb24gSGVhbHRoIEluc3RpdHV0ZTsgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleSAyMDIxIiwKICAgICAgIHNpemUgPSAiUG9wdWxhdGlvbiIpICsKICB0aGVtZV9idygpCgpnZ3Bsb3RseShzdWljaWRlX2JhY2hfcGxvdCwgdG9vbHRpcCA9ICJ0ZXh0IikKYGBgCioqRmlnLiAxNDoqKgpPdmVyYWxsLCBpdCBhcHBlYXJzIHRoYXQgc3VpY2lkZSByYXRlcyBhcmUgbG93ZXIgaW4gbW9yZSB1cmJhbiBhcmVhcyAoc3VjaCBhcyBCcm9ueCwgS2luZ3MsIGFuZCBRdWVlbnMgY291bnRpZXMpIGFuZCBoaWdoZXIgaW4gbW9yZSBydXJhbCBhcmVhcyAobGlrZSBMZXdpcywgU2NodXlsZXIsIEdyZWVuZSBjb3VudGllcykuCgoKYGBge3J9CmRlcHJlc3Npb25fcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGRlcHJlc3Npb24sIG5hLnJtID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gcGN0X2JhY2hlbG9yc19wbHVzLCB5ID0gYWRqdXN0ZWRfcmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gdG90YWxfMjVfb3ZlckUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoY291bnR5LCAiOiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlBlcmNlbnRhZ2Ugb2YgQWR1bHRzIHJlcG9ydGluZyBhIERlcHJlc3NpdmUgRGlzb3JkZXI6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXM6OnBlcmNlbnQoYWRqdXN0ZWRfcmF0ZSwgYWNjdXJhY3kgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+UGVyY2VudGFnZSBvZiBQb3B1bGF0aW9uIHdpdGggYXQgbGVhc3QgYSBCYWNoZWxvcnMgRGVncmVlOiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzOjpwZXJjZW50KHBjdF9iYWNoZWxvcnNfcGx1cywgYWNjdXJhY3kgPSAxKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ0cmFuc3BhcmVudCIpICsKICBnZW9tX3BvaW50KGFscGhhID0gLjg1LAogICAgICAgICAgICAgY29sb3IgPSAiZGFya2JsdWUiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogICMgY2hhbmdlIGxlZ2VuZCBsYWJlbCBmb3JtYXR0aW5nCiAgc2NhbGVfc2l6ZV9hcmVhKGxhYmVscyA9IGNvbW1hLCBtYXhfc2l6ZSA9IDEwKSArCiAgbGFicyh4ID0gIkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgKFBlb3BsZSB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZSkiLCB5ID0gIkFkdWx0cyByZXBvcnRpbmcgYSBEZXByZXNzaXZlIERpc29yZGVyIiwKICAgICAgIHRpdGxlID0gIkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgYW5kIERlcHJlc3NpdmUgRGlzb3JkZXJzIiwKICAgICAgIGNhcHRpb24gPSAiU291cmNlczogVW5pdmVyc2l0eSBvZiBXaXNjb25zaW4gUG9wdWxhdGlvbiBIZWFsdGggSW5zdGl0dXRlOyBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5IDIwMjEiLAogICAgICAgc2l6ZSA9ICJQb3B1bGF0aW9uIikgKwogIHRoZW1lX2J3KCkKCmdncGxvdGx5KGRlcHJlc3Npb25fcGxvdCwgdG9vbHRpcCA9ICJ0ZXh0IikKYGBgCioqRmlnLiAxNToqKgpBZ2FpbiwgaXQgYXBwZWFycyB0aGF0IERlcHJlc3NpdmUgRGlzb3JkZXJzIGFyZSByZWxhdGl2ZWx5IGxvd2VyIGluIHVyYmFuIGFyZWFzIGNvbXBhcmVkIHRvIHJ1cmFsIGFyZWFzLCBwZXJoYXBzIHN1Z2dlc3RpbmcgbW9yZSBvZiBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHVyYmFuaWNpdHkgYW5kIHNvY2lhbCBkZXRlcm1pbmFudHMgb2YgaGVhbHRoIHRoYW4gZWR1Y2F0aW9uYWwgYXR0YWlubWVudCBhbmQgc29jaWFsIGRldGVybWluYW50cyBvZiBoZWFsdGguCgoKYGBge3J9Cmhmb29kX2FjY2Vzc19wbG90IDwtIGdncGxvdChkYXRhID0gaGVhbHRoX2VkdSwgbmEucm0gPSBUUlVFLAogICAgICAgICAgICAgICAgICAgYWVzKHggPSBwY3RfYmFjaGVsb3JzX3BsdXMsIHkgPSBsaW1fYWNjX2hmb29kLAogICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSB0b3RhbF8yNV9vdmVyRSwgCiAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMChjb3VudHksICI6IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+UG9wdWxhdGlvbiB3aXRoIExpbWl0ZWQgQWNjZXNzIHRvIEhlYWx0aHkgRm9vZHM6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXM6OnBlcmNlbnQobGltX2FjY19oZm9vZCwgYWNjdXJhY3kgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+UGVyY2VudGFnZSBvZiBQb3B1bGF0aW9uIHdpdGggYXQgbGVhc3QgYSBCYWNoZWxvcnMgRGVncmVlOiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzOjpwZXJjZW50KHBjdF9iYWNoZWxvcnNfcGx1cywgYWNjdXJhY3kgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+UGVyY2VudCBvZiBQb3B1bGF0aW9uIGxpdmluZyBpbiBhIFJ1cmFsIEFyZWE6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXM6OnBlcmNlbnQocGN0X3J1cmFsLCBhY2N1cmFjeSA9IDEpKSksCiAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ0cmFuc3BhcmVudCIpICsKICBnZW9tX3BvaW50KGFscGhhID0gLjg1LAogICAgICAgICAgICAgY29sb3IgPSAibWVkaXVtc2VhZ3JlZW4iKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogICMgY2hhbmdlIGxlZ2VuZCBsYWJlbCBmb3JtYXR0aW5nCiAgc2NhbGVfc2l6ZV9hcmVhKGxhYmVscyA9IGNvbW1hLCBtYXhfc2l6ZSA9IDEwKSArCiAgbGFicyh4ID0gIkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgKFBlb3BsZSB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZSkiLCB5ID0gIlBvcHVsYXRpb24gd2l0aCBMaW1pdGVkIEFjY2VzcyB0byBIZWFsdGh5IEZvb2RzIiwKICAgICAgIHRpdGxlID0gIkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgYW5kIEFjY2VzcyB0byBIZWFsdGh5IEZvb2RzIiwKICAgICAgIGNhcHRpb24gPSAiU291cmNlczogVW5pdmVyc2l0eSBvZiBXaXNjb25zaW4gUG9wdWxhdGlvbiBIZWFsdGggSW5zdGl0dXRlOyBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5IDIwMjEiLAogICAgICAgc2l6ZSA9ICJQb3B1bGF0aW9uIikgKwogIHRoZW1lX2J3KCkKCmdncGxvdGx5KGhmb29kX2FjY2Vzc19wbG90LCB0b29sdGlwID0gInRleHQiKQpgYGAKKipGaWcuIDE2OioqCldoaWxlIGl0IGFwcGVhcnMgdGhhdCB0aGVyZSBtaWdodCBiZSBzb21lIGNvcnJlbGF0aW9uIGJldHdlZW4gdXJiYW4gZW52aXJvbm1lbnRzIGFuZCBtb3JlIGFjY2VzcyB0byBoZWFsdGh5IGZvb2RzLCB0aGUgcmVsYXRpb25zaGlwIGlzIG5vdCB2ZXJ5IHN0cm9uZy4KCgojIyMgQmVoYXZpb3JhbCBSaXNrIEZhY3RvcnMKClRvIGV4YW1pbmUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgYW5kIGhlYWx0aCBvdXRjb21lcyBpbiB0aGUgZm9ybSBvZiBiZWhhdmlvcmFsIHJpc2sgZmFjdG9ycywgSSBjaG9zZSB0byBsb29rIGF0OgotIEp1dmVuaWxlIEFycmVzdCBSYXRlCi0gUGVyY2VudCBvZiBBZHVsdHMgd2hvIGFyZSBPdmVyd2VpZ2h0IG9yIE9iZXNlCi0gUGVyY2VudCBvZiBBZHVsdHMgd2hvIGFyZSBDdXJyZW50IFNtb2tlcnMKLSBQZXJjZW50IG9mIEFkdWx0cyBCaW5nZSBEcmlua2luZyBpbiB0aGUgTGFzdCBNb250aAoKCk92ZXJhbGwsIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgcmVtYWluZWQgYSBmYWlybHkgc3Ryb25nIHByZWRpY3RvciBvZiBoZWFsdGggb3V0Y29tZXMgaW4gdGhlIGNhdGVnb3J5IG9mIGJlaGF2aW9yYWwgcmlzayBmYWN0b3JzLgoKCmBgYHtyfQpqdXZfYXJyZXN0X2JhY2hfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGhlYWx0aF9lZHUsIG5hLnJtID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gcGN0X2JhY2hlbG9yc19wbHVzLCB5ID0ganV2X2FycmVzdF9yYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSB0cG9wLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKGNvdW50eSwgIjoiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5KdXZlbmlsZSBBcnJlc3QgUmF0ZTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlczo6cGVyY2VudChqdXZfYXJyZXN0X3JhdGUsIGFjY3VyYWN5ID0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlBlcmNlbnRhZ2Ugb2YgUG9wdWxhdGlvbiB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlczo6cGVyY2VudChwY3RfYmFjaGVsb3JzX3BsdXMsIGFjY3VyYWN5ID0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlBlcmNlbnQgb2YgUG9wdWxhdGlvbiBsaXZpbmcgaW4gYSBSdXJhbCBBcmVhOiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzOjpwZXJjZW50KHBjdF9ydXJhbCwgYWNjdXJhY3kgPSAxKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAidHJhbnNwYXJlbnQiKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IC44NSwKICAgICAgICAgICAgIGNvbG9yID0gInNsYXRlYmx1ZTEiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogICMgY2hhbmdlIGxlZ2VuZCBsYWJlbCBmb3JtYXR0aW5nCiAgc2NhbGVfc2l6ZV9hcmVhKGxhYmVscyA9IGNvbW1hLCBtYXhfc2l6ZSA9IDEwKSArCiAgbGFicyh4ID0gIkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgKFBlb3BsZSB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZSkiLCB5ID0gIkp1dmVuaWxlIEFycmVzdCBSYXRlIiwKICAgICAgIHRpdGxlID0gIkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgYW5kIEp1dmVuaWxlIEFycmVzdCBSYXRlIiwKICAgICAgIGNhcHRpb24gPSAiU291cmNlczogVW5pdmVyc2l0eSBvZiBXaXNjb25zaW4gUG9wdWxhdGlvbiBIZWFsdGggSW5zdGl0dXRlOyBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5IDIwMjEiLAogICAgICAgc2l6ZSA9ICJQb3B1bGF0aW9uIikgKwogIHRoZW1lX2J3KCkKCmdncGxvdGx5KGp1dl9hcnJlc3RfYmFjaF9wbG90LCB0b29sdGlwID0gInRleHQiKQpgYGAKKipGaWcuIDE3OioqCk5ldyBZb3JrIENvdW50eSwgVG9tcGtpbnMgQ291bnR5LCBhbmQgQWxiYW55IENvdW50eSBhcmUga2V5IG91dGxpZXJzLgoKCmBgYHtyfQpvd19vYmVzZV9wbG90IDwtIGdncGxvdChkYXRhID0gb3dfb2Jlc2UsIG5hLnJtID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gcGN0X2JhY2hlbG9yc19wbHVzLCB5ID0gYWRqdXN0ZWRfcmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gdG90YWxfMjVfb3ZlckUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoY291bnR5LCAiOiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlBlcmNlbnRhZ2Ugb2YgQWR1bHRzIHRoYXQgYXJlIE92ZXJ3ZWlnaHQgb3IgT2Jlc2U6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXM6OnBlcmNlbnQoYWRqdXN0ZWRfcmF0ZSwgYWNjdXJhY3kgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+UGVyY2VudGFnZSBvZiBQb3B1bGF0aW9uIHdpdGggYXQgbGVhc3QgYSBCYWNoZWxvcnMgRGVncmVlOiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzOjpwZXJjZW50KHBjdF9iYWNoZWxvcnNfcGx1cywgYWNjdXJhY3kgPSAxKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ0cmFuc3BhcmVudCIpICsKICBnZW9tX3BvaW50KGFscGhhID0gLjg1LAogICAgICAgICAgICAgY29sb3IgPSAiZGFya3NsYXRlYmx1ZSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArCiAgIyBjaGFuZ2UgbGVnZW5kIGxhYmVsIGZvcm1hdHRpbmcKICBzY2FsZV9zaXplX2FyZWEobGFiZWxzID0gY29tbWEsIG1heF9zaXplID0gMTApICsKICBsYWJzKHggPSAiRWR1Y2F0aW9uYWwgQXR0YWlubWVudCAoUGVvcGxlIHdpdGggYXQgbGVhc3QgYSBCYWNoZWxvcnMgRGVncmVlKSIsIHkgPSAiQWR1bHRzIHRoYXQgYXJlIE92ZXJ3ZWlnaHQgb3IgT2Jlc2UiLAogICAgICAgdGl0bGUgPSAiRWR1Y2F0aW9uYWwgQXR0YWlubWVudCBhbmQgT2Jlc2l0eSIsCiAgICAgICBjYXB0aW9uID0gIlNvdXJjZXM6IFVuaXZlcnNpdHkgb2YgV2lzY29uc2luIFBvcHVsYXRpb24gSGVhbHRoIEluc3RpdHV0ZTsgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleSAyMDIxIiwKICAgICAgIHNpemUgPSAiUG9wdWxhdGlvbiIpICsKICB0aGVtZV9idygpCgpnZ3Bsb3RseShvd19vYmVzZV9wbG90LCB0b29sdGlwID0gInRleHQiKQpgYGAKKipGaWcuIDE4OioqClRoaXMgcmVsYXRpb25zaGlwIGRlbW9uc3RyYXRlcyBhIHN0cm9uZyBuZWdhdGl2ZSBjb3JyZWxhdGlvbiBjb25zaXN0ZW50IHdpdGggb3RoZXIgaGVhbHRoIG91dGNvbWVzLCBCcm9ueCBDb3VudHkgbWFya3MgYW4gb3V0bGllciBpbiB1cmJhbmljaXR5LgoKCmBgYHtyfQpzbW9raW5nX2JhY2hfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IHNtb2tpbmcsIG5hLnJtID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gcGN0X2JhY2hlbG9yc19wbHVzLCB5ID0gYWRqdXN0ZWRfcmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gdG90YWxfMjVfb3ZlckUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoY291bnR5LCAiOiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlBlcmNlbnRhZ2Ugb2YgQWR1bHRzIHdobyBhcmUgQ3VycmVudCBTbW9rZXJzOiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzOjpwZXJjZW50KGFkanVzdGVkX3JhdGUsIGFjY3VyYWN5ID0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlBlcmNlbnRhZ2Ugb2YgUG9wdWxhdGlvbiB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlczo6cGVyY2VudChwY3RfYmFjaGVsb3JzX3BsdXMsIGFjY3VyYWN5ID0gMSkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAidHJhbnNwYXJlbnQiKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IC44NSwKICAgICAgICAgICAgIGNvbG9yID0gIm9yYW5nZXJlZDMiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogICMgY2hhbmdlIGxlZ2VuZCBsYWJlbCBmb3JtYXR0aW5nCiAgc2NhbGVfc2l6ZV9hcmVhKGxhYmVscyA9IGNvbW1hLCBtYXhfc2l6ZSA9IDEwKSArCiAgbGFicyh4ID0gIkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgKFBlb3BsZSB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZSkiLCB5ID0gIkFkdWx0cyB3aG8gYXJlIEN1cnJlbnQgU21va2VycyIsCiAgICAgICB0aXRsZSA9ICJFZHVjYXRpb25hbCBBdHRhaW5tZW50IGFuZCBTbW9raW5nIiwKICAgICAgIGNhcHRpb24gPSAiU291cmNlczogVW5pdmVyc2l0eSBvZiBXaXNjb25zaW4gUG9wdWxhdGlvbiBIZWFsdGggSW5zdGl0dXRlOyBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5IDIwMjEiLAogICAgICAgc2l6ZSA9ICJQb3B1bGF0aW9uIikgKwogIHRoZW1lX2J3KCkKCmdncGxvdGx5KHNtb2tpbmdfYmFjaF9wbG90LCB0b29sdGlwID0gInRleHQiKQoKYGBgCioqRmlnLiAxOToqKgpUaGlzIHJlbGF0aW9uc2hpcCBkZW1vbnN0cmF0ZXMgYSBtb2RlcmF0ZSBuZWdhdGl2ZSBjb3JyZWxhdGlvbiBjb25zaXN0ZW50IHdpdGggb3RoZXIgaGVhbHRoIG91dGNvbWVzLCBOZXcgWW9yayBDb3VudHkgYW5kIFRvbXBraW5zIENvdW50eSBtYXJrIGFwcGVhciB0byBiZSBvdXRsaWVycyBpbiB0ZXJtcyBvZiB1cmJhbmljaXR5LgoKCmBgYHtyfQpkcmlua2luZ19wbG90IDwtIGdncGxvdChkYXRhID0gYmluZ2VfZHJpbmtpbmcsIG5hLnJtID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gcGN0X2JhY2hlbG9yc19wbHVzLCB5ID0gYWRqdXN0ZWRfcmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gdG90YWxfMjVfb3ZlckUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoY291bnR5LCAiOiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlBlcmNlbnRhZ2Ugb2YgQWR1bHRzIEJpbmdlIERyaW5raW5nIGluIHRoZSBQYXN0IE1vbnRoOiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVzOjpwZXJjZW50KGFkanVzdGVkX3JhdGUsIGFjY3VyYWN5ID0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlBlcmNlbnRhZ2Ugb2YgUG9wdWxhdGlvbiB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlczo6cGVyY2VudChwY3RfYmFjaGVsb3JzX3BsdXMsIGFjY3VyYWN5ID0gMSkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAidHJhbnNwYXJlbnQiKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IC44NSwKICAgICAgICAgICAgIGNvbG9yID0gImRhcmtzbGF0ZWdyYXkiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogICMgY2hhbmdlIGxlZ2VuZCBsYWJlbCBmb3JtYXR0aW5nCiAgc2NhbGVfc2l6ZV9hcmVhKGxhYmVscyA9IGNvbW1hLCBtYXhfc2l6ZSA9IDEwKSArCiAgbGFicyh4ID0gIkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgKFBlb3BsZSB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZSkiLCB5ID0gIkFkdWx0cyBCaW5nZSBEcmlua2luZyBpbiB0aGUgUGFzdCBNb250aCIsCiAgICAgICB0aXRsZSA9ICJFZHVjYXRpb25hbCBBdHRhaW5tZW50IGFuZCBCaW5nZSBEcmlua2luZyIsCiAgICAgICBjYXB0aW9uID0gIlNvdXJjZXM6IFVuaXZlcnNpdHkgb2YgV2lzY29uc2luIFBvcHVsYXRpb24gSGVhbHRoIEluc3RpdHV0ZTsgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleSAyMDIxIiwKICAgICAgIHNpemUgPSAiUG9wdWxhdGlvbiIpICsKICB0aGVtZV9idygpCgpnZ3Bsb3RseShkcmlua2luZ19wbG90LCB0b29sdGlwID0gInRleHQiKQpgYGAKKipGaWcuIDIwOioqClRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIG11Y2ggb2YgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiBlZHVjYXRpb25hbCBhdHRhaW5tZW50IGFuZCBiaW5nZSBkcmlua2luZywgbm9yIGRvZXMgdGhlcmUgYXBwZWFyIHRvIGJlIG9uZSBiZXR3ZWVuIHVyYmFuaWNpdHkgYW5kIGJpbmdlIGRyaW5raW5nLgoKCiMjIyBEaXNjdXNzaW9uCgpCZXR3ZWVuIHRoZSB0aHJlZSBjYXRlZ29yaWVzIG9mIGhlYWx0aCBvdXRjb21lcywgZWR1Y2F0aW9uYWwgYXR0YWlubWVudCBzZWVtcyB0byBiZSB0aGUgbW9zdCByZWxpYWJsZSBwcmVkaWN0b3Igb2YgaGVhbHRoIG91dGNvbWVzIGluIHRoZSBjYXRlZ29yeSBvZiBfX0Nocm9uaWMgQ29uZGl0aW9uc19fLCBhbmQgdGhlIGxlYXN0IHJlbGlhYmxlIHByZWRpY3RvciBvZiBoZWFsdGggb3V0Y29tZXMgaW4gdGhlIGNhdGVnb3J5IG9mIF9fU29jaWFsIERldGVybWluYW50cyBvZiBIZWFsdGhfXy4gQWRkaXRpb25hbGx5LCB1cmJhbmljaXR5IHNlZW1lZCB0byBpbmZsdWVuY2UgdGhpcyByZWxhdGlvbnNoaXAgdGhlIG1vc3QgYWxvbmcgdGhlIGF4aXMgb2YgX19Tb2NpYWwgRGV0ZXJtaW5hbnRzIG9mIEhlYWx0aF9fLCBwZXJoYXBzIGxlbmRpbmcgdG8gdGhlIGV4cGxhbmF0aW9uIG9mIHdoeSBlZHVjYXRpb25hbCBhdHRhaW5tZW50IGlzIGEgbGVzcyByZWxpYWJsZSBwcmVkaWN0b3Igb2YgaGVhbHRoIG91dGNvbWVzIG9mIHRoaXMgcGFydGljdWxhciB0eXBlLgoKSW4gY29uY2x1c2lvbiwgYWRkcmVzc2luZyBoZWFsdGggZGlzcGFyaXRpZXMgcmVxdWlyZXMgYSBjb21wcmVoZW5zaXZlIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGludGVycGxheSBiZXR3ZWVuIHZhcmlvdXMgZGV0ZXJtaW5hbnRzIG9mIGhlYWx0aC4gRWR1Y2F0aW9uIGltcGFjdHMgaGVhbHRoIG91dGNvbWVzIHRocm91Z2ggbXVsdGlmYWNldGVkIHBhdGh3YXlzLCBvZmZlcmluZyBhY2Nlc3MgdG8gZWNvbm9taWMgcmVzb3VyY2VzLCBoZWFsdGhpZXIgZW52aXJvbm1lbnRzLCBhbmQgaW1wcm92ZWQgbGlmZXN0eWxlIGNob2ljZXMuIE1vcmVvdmVyLCBpdCdzIGRlZXBseSBpbnRlcnR3aW5lZCB3aXRoIGNvbnRleHR1YWwgZmFjdG9ycyB0aGF0IGFmZmVjdCBib3RoIGhlYWx0aCBhbmQgZWR1Y2F0aW9uYWwgb3V0Y29tZXMuIEFkZHJlc3NpbmcgY2hyb25pYyBzdHJlc3MsIHRyYXVtYSwgYW5kIGltcHJvdmluZyBsaXZpbmcgY29uZGl0aW9ucyBpbiBib3RoIHJ1cmFsIGFuZCB1cmJhbiBhcmVhcyBjYW4gc3Vic3RhbnRpYWxseSBpbXBhY3QgaGVhbHRoIHRyYWplY3RvcmllcyBhbmQgZWR1Y2F0aW9uYWwgYWNoaWV2ZW1lbnRzIChOYXRpb25hbCBBY2FkZW15IG9mIFNjaWVuY2VzIDIwMjApLiBBcyBzdWNoLCBlZmZvcnRzIGZvY3VzaW5nIG9uIHRoZSBuZXh1cyBiZXR3ZWVuIGVkdWNhdGlvbiwgaGVhbHRoLCBhbmQgY29tbXVuaXR5IGV4cGVyaWVuY2VzIGFyZSBjcnVjaWFsIGZvciBhbWVsaW9yYXRpbmcgdGhlIHBlcnZhc2l2ZSBkaXNwYXJpdGllcyB0aGF0IHNpbXVsdGFuZW91c2x5IGltcGFjdCBvdXIgaGVhbHRoY2FyZSBhbmQgZWR1Y2F0aW9uIHN5c3RlbXMgaW4gYm90aCBydXJhbCBhbmQgdXJiYW4gZW52aXJvbm1lbnRzLgoKCiMjIyMgSW5zaWdodHMgZnJvbSB0aGUgT3V0bGllcnMKCkluIGNhc2VzIHdoZXJlIG1vc3Qgb2YgdGhlIGRhdGEgZm9sbG93ZWQgYSBjb25zaXN0ZW50IHRyZW5kIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBhIGZldyBvdXRsaWVycywgdGhvc2Ugb3V0bGllcnMgdGVuZGVkIHRvIGJlIE5ldyBZb3JrIENvdW50eSBhbmQgVG9tcGtpbnMgQ291bnR5LiBOZXcgWW9yayBDb3VudHkgb2ZmZXJzIGluc2lnaHQgaW50byB0aGUgdXJiYW4gcGFyYWRveCB3aXRoIHJlc3BlY3QgdG8gaGVhbHRoIG91dGNvbWVzLCB3aGVyZSBhZHZhbnRhZ2VzIGluIGhlYWx0aGNhcmUgYWNjZXNzIGFuZCByZXNvdXJjZXMgZnJlcXVlbnRseSBjb2V4aXN0IHdpdGggc2lnbmlmaWNhbnQgaGVhbHRoIGRpc3Bhcml0aWVzIGFuZCBjaGFsbGVuZ2VzLCBpbmZsdWVuY2VkIGJ5IGRpdmVyc2Ugc29jaW9lY29ub21pYyBhbmQgZW52aXJvbm1lbnRhbCBmYWN0b3JzIHdpdGhpbiB1cmJhbiBzZXR0aW5ncy4KCkluaXRpYWxseSwgdGhlIHJlYXNvbiBmb3IgVG9tcGtpbnMgQ291bnR5J3MgcmVvY2N1cnJpbmcgc3RhdHVzIGFzIGFuIG91dGxpZXIsIHJlbGF0aXZlIHRvIG90aGVyIGNvdW50aWVzIG9mIHNpbWlsYXIgcG9wdWxhdGlvbiBhbmQgdXJiYW5pY2l0eSwgYWxvbmcgc2V2ZXJhbCBoZWFsdGggb3V0Y29tZXMgd2FzIGxlc3MgY2xlYXIuIEhvd2V2ZXIsIHdoZW4gbG9va2luZyBhdCB0aGUgQ291bnR5J3MgbGV2ZWwgb2YgZWR1Y2F0aW9uYWwgYXR0YWlubWVudCwgd2hlcmUgNTUlIG9mIHRoZSBhZHVsdCBwb3B1bGF0aW9uIGhhcyBhdCBsZWFzdCBhIEJhY2hlbG9ycyBEZWdyZWUsIHRoZSBzbGlnaHRseSBiZXR0ZXIgaGVhbHRoIG91dGNvbWVzIG1ha2UgbW9yZSBzZW5zZSBhcyB0aGV5IGZvbGxvdyB0aGUgdHlwaWNhbCByZWxhdGlvbnNoaXAgYmV0d2VlbiBlZHVjYXRpb25hbCBhdHRhaW5tZW50IGFuZCBoZWFsdGggb3V0Y29tZXMuIFRoZSBtb3JlIGNvbmZ1c2luZyBjb21wb25lbnQgb2YgdGhpcyBvdXRsaWVyIGlzIHRoZSBhdHlwaWNhbGx5IGhpZ2ggcmF0ZSBvZiBlZHVjYXRpb25hbCBhdHRhaW5tZW50IHJlbGF0aXZlIHRvIHRoZSBjb3VudHkncyBwb3B1bGF0aW9uIGFuZCB1cmJhbmljaXR5LiBVcG9uIGxvb2tpbmcgaW50byBpdCwgSSBkaXNjb3ZlcmVkIHRoYXQgVG9tcGtpbnMgQ291bnR5IGNvbnRhaW5zIEl0aGFjYSwgTlksIHdoaWNoIGlzIGhvbWUgdG8gQ29ybmVsbCBVbml2ZXJzaXR5LCB3aGljaCBleHBsYWlucyB0aGUgYWJub3JtYWxseSBoaWdoIHJhdGUgb2YgZWR1Y2F0aW9uYWwgYXR0YWlubWVudCBmb3IgYSBjb3VudHkgb2YgVG9tcGtpbnMgQ291bnR5J3Mgc2l6ZSBhbmQgdXJiYW5pY2l0eS4gVGhpcyBhbHNvIHJlaW5mb3JjZXMgdGhlIGxpbmsgYmV0d2VlbiBlZHVjYXRpb25hbCBhdHRhaW5tZW50IGFuZCBoZWFsdGggb3V0Y29tZXMsIGFuZCBldmVuIHN1Z2dlc3RpbmcgdGhhdCBlZHVjYXRpb25hbCBhdHRhaW5tZW50IG1pZ2h0IGhvbGQgbW9yZSB3ZWlnaHQgdGhhbiB1cmJhbmljaXR5IHdoZW4gaXQgY29tZXMgdG8gcHJlZGljdGluZyBoZWFsdGggb3V0Y29tZXMsIGFzIFRvbXBraW5zIENvdW50eSBmcmVxdWVudGx5IG91dHBlcmZvcm1lZCBjb3VudGllcyBvZiBzaW1pbGFyIHNpemUgYW5kIHVyYmFuaWNpdHkgd2l0aCB0aGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlbSBiZWluZyBlZHVjYXRpb25hbCBhdHRhaW5tZW50LgoKCiMjIyMgRnVydGhlciBSZXNlYXJjaAoKSW4gb3JkZXIgdG8gdHJ1bHkgdW5kZXJzdGFuZCB0aGUgaW1wYWN0IG9mIHVyYmFuaWNpdHkgb24gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgYW5kIGhlYWx0aCBvdXRjb21lcywgSSBiZWxpZXZlIGEgc21hbGxlci1zY2FsZSBhbmFseXNpcyBpcyBuZWNlc3NhcnksIGluIHBhcnQgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlcmUgaXMgYSBncmVhdCBkZWFsIG9mIHZhcmlhdGlvbiBpbiBoZWFsdGggb3V0Y29tZXMgd2l0aGluIHVyYmFuIGNlbnRlcnMsIGFuZCB0aGlzIHZhcmlhdGlvbiBpcyBvdmVybG9va2VkIGluIGEgY291bnR5LWxldmVsIGFuYWx5c2lzIGxpa2UgdGhpcyBvbmUuIEFkZGl0aW9uYWwgaW52ZXN0aWdhdGlvbiB3aXRoIG1vcmUgY291bnRpZXMgb2YgZGlmZmVyaW5nIHBvcHVsYXRpb25zIGFuZCB1cmJhbmljaXRpZXMgaXMgYWxzbyBuZWNlc3NhcnkgdG8gbWFrZSBjb25jbHVzaW9ucyBhYm91dCB0aGUgZXh0ZW50IHRvIHdoaWNoIHVyYmFuaWNpdHkgbWlnaHQgaW5mbHVlbmNlIGhlYWx0aCBvdXRjb21lcywgYW5kIHdoZXRoZXIgdXJiYW5pY2l0eSBjYW4gYmUgc2VlbiBhcyBhIHByZWRpY3RvciBmb3IgaGVhbHRoIG91dGNvbWVzIGluIGEgd2F5IGNvbXBvcmFibGUgdG8gZWR1Y2F0aW9uYWwgYXR0YWlubWVudC4KCkl0J3MgYWxzbyB3b3J0aCBsb29raW5nIGludG8gdGhlIHBvdGVudGlhbCBjb25uZWN0aW9uIGJldHdlZW4gdXJiYW5pY2l0eSBhbmQgaW5mbGFtbWF0b3J5IGx1bmcgY29uZGl0aW9ucyBsaWtlIEFzdGhtYSBhbmQgQ09QRCwgY29uc2lkZXJpbmcgdGhhdCBOZXcgWW9yayBDb3VudHkgd2FzIGEgc2xpZ2h0IG91dGxpZXIgaW4gYm90aCBvZiB0aG9zZSBhbmFseXNlcyB3aGVyZSB0aGUgcmVzdCBvZiB0aGUgZGF0YSB3YXMgZmFpcmx5IHVuaWZvcm0uIENvbnZlcnNlbHksIGhlYWx0aCBvdXRjb21lcyB3aGljaCBkaWRuJ3Qgc2VlbSB0byBoYXZlIHBhdHRlcm5zIGFjcm9zcyBlZHVjYXRpb25hbCBhdHRhaW5tZW50IG9yIHVyYmFuaWNpdHkgKGJpbmdlIGRyaW5raW5nLCBmb3IgZXhhbXBsZSkgc2hvdWxkIGJlIGludmVzdGlnYXRlZCB0aHJvdWdoIGRpZmZlcmVudCBsZW5zZXMgaW4gb3JkZXIgdG8gZ2FpbiBpbnNpZ2h0IGFzIHRvIHdoeSB0aGVzZSBwYXJ0aWN1bGFyIG91dGNvbWVzIGRlZnkgdGhlIHBhdHRlcm4gdGhhdCBtYW55IHNpbWlsYXIgb3V0Y29tZXMgZm9sbG93LgoKIyMjIFdvcmtzIENpdGVkCgpBc3NhZiwgU2hpcmVlbiBhbmQgQ2hyaXN0aW5hIEp1YW4uIDIwMjAuIFZhcmlhdGlvbnMgaW4gaGVhbHRoIG91dGNvbWVzIHdpdGggYWx0ZXJuYXRpdmUgbWVhc3VyZXMgb2YgdXJiYW5pY2l0eSwgdXNpbmcgZGVtb2dyYXBoaWMgYW5kIGhlYWx0aCBzdXJ2ZXlzIDIwMTMtMTguIERIUyBBbmFseXRpY2FsIFN0dWRpZXMgTm8uIDczLiBSb2NrdmlsbGUsIE1hcnlsYW5kLCBVU0E6IElDRi4gQXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmRoc3Byb2dyYW0uY29tL3B1YnMvcGRmL0FTNzMvQVM3My5wZGYuCgpOYXRpb25hbCBBY2FkZW1pZXMgb2YgU2NpZW5jZXMsIEVuZ2luZWVyaW5nLCBhbmQgTWVkaWNpbmU7IEhlYWx0aCBhbmQgTWVkaWNpbmUgRGl2aXNpb247IEJvYXJkIG9uIFBvcHVsYXRpb24gSGVhbHRoIGFuZCBQdWJsaWMgSGVhbHRoIFByYWN0aWNlOyBSb3VuZHRhYmxlIG9uIFBvcHVsYXRpb24gSGVhbHRoIEltcHJvdmVtZW50OyBXaXplbWFubiwgVC4gTS4gKEVkLikuICgyMDE5KS4gU2Nob29sIFN1Y2Nlc3M6IEFuIE9wcG9ydHVuaXR5IGZvciBQb3B1bGF0aW9uIEhlYWx0aDogUHJvY2VlZGluZ3Mgb2YgYSBXb3Jrc2hvcC4gV2FzaGluZ3RvbiAoREMpOiBOYXRpb25hbCBBY2FkZW1pZXMgUHJlc3MgKFVTKS4gVGhlIFJlbGF0aW9uc2hpcCBCZXR3ZWVuIEVkdWNhdGlvbiBhbmQgSGVhbHRoLiBBdmFpbGFibGUgZnJvbTogaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9ib29rcy9OQks1NjYzMzgvCgpOYXRpb25hbCBBY2FkZW15IG9mIE1lZGljaW5lLiAoMjAxNCkuIFBlcnNwZWN0aXZlcyAyMDE0OiBVbmRlcnN0YW5kaW5nIHRoZSBSZWxhdGlvbnNoaXAgQmV0d2VlbiBFZHVjYXRpb24gYW5kIEhlYWx0aC4gUmV0cmlldmVkIGZyb20gaHR0cHM6Ly9uYW0uZWR1L3BlcnNwZWN0aXZlcy0yMDE0LXVuZGVyc3RhbmRpbmctdGhlLXJlbGF0aW9uc2hpcC1iZXR3ZWVuLWVkdWNhdGlvbi1hbmQtaGVhbHRoLwoKUmFnaHVwYXRoaSwgVi4sICYgUmFnaHVwYXRoaSwgVy4gKDIwMjApLiBUaGUgaW5mbHVlbmNlIG9mIGVkdWNhdGlvbiBvbiBoZWFsdGg6IEFuIGVtcGlyaWNhbCBhc3Nlc3NtZW50IG9mIE9FQ0QgY291bnRyaWVzIGZvciB0aGUgcGVyaW9kIDE5OTXigJMyMDE1LiBBcmNoaXZlcyBvZiBQdWJsaWMgSGVhbHRoLCA3OCgxKSwgMjAuIGh0dHBzOi8vZG9pLm9yZy8xMC4xMTg2L3MxMzY5MC0wMjAtMDA0MDItNQoKVS5TLiBEZXBhcnRtZW50IG9mIEhlYWx0aCBhbmQgSHVtYW4gU2VydmljZXMsIE9mZmljZSBvZiBEaXNlYXNlIFByZXZlbnRpb24gYW5kIEhlYWx0aCBQcm9tb3Rpb24uIChuLmQuKS4gRW5yb2xsbWVudCBpbiBIaWdoZXIgRWR1Y2F0aW9uLiBIZWFsdGh5IFBlb3BsZSAyMDMwLiBSZXRyaWV2ZWQgZnJvbSBodHRwczovL2hlYWx0aC5nb3YvaGVhbHRoeXBlb3BsZS9wcmlvcml0eS1hcmVhcy9zb2NpYWwtZGV0ZXJtaW5hbnRzLWhlYWx0aC9saXRlcmF0dXJlLXN1bW1hcmllcy9lbnJvbGxtZW50LWhpZ2hlci1lZHVjYXRpb24KCldlZWtzLCBXLiBCLiwgQ2hhbmcsIEouIEUuLCBQYWfDoW4sIEouIEEuLCBMdW1wa2luLCBKLiwgTWljaGFlbCwgRC4sIFNhbGNpZG8sIFMuLCBldCBhbC4gKDIwMjMpLiBSdXJhbC11cmJhbiBkaXNwYXJpdGllcyBpbiBoZWFsdGggb3V0Y29tZXMsIGNsaW5pY2FsIGNhcmUsIGhlYWx0aCBiZWhhdmlvcnMsIGFuZCBzb2NpYWwgZGV0ZXJtaW5hbnRzIG9mIGhlYWx0aCBhbmQgYW4gYWN0aW9uLW9yaWVudGVkLCBkeW5hbWljIHRvb2wgZm9yIHZpc3VhbGl6aW5nIHRoZW0uIFBMT1MgR2xvYmFsIFB1YmxpYyBIZWFsdGgsIDMoMTApLCBlMDAwMjQyMC4gaHR0cHM6Ly9kb2kub3JnLzEwLjEzNzEvam91cm5hbC5wZ3BoLjAwMDI0MjAKCldvcmxkIEhlYWx0aCBPcmdhbml6YXRpb24uIChuLmQuKS4gVXJiYW4gaGVhbHRoLiBSZXRyaWV2ZWQgZnJvbSBodHRwczovL3d3dy53aG8uaW50L25ld3Mtcm9vbS9mYWN0LXNoZWV0cy9kZXRhaWwvdXJiYW4taGVhbHRoIzp+OnRleHQ9V2hpbGUlMjB1cmJhbml6YXRpb24lMjBjYW4lMjBicmluZyUyMGhlYWx0aCx2YXJ5aW5nJTIwZnJvbSUyMHN0cmVldCUyMHRvJTIwc3RyZWV0LgoKWmFqYWNvdmEsIEEuLCAmIExhd3JlbmNlLCBFLiBNLiAoMjAxOCkuIFRoZSBSZWxhdGlvbnNoaXAgQmV0d2VlbiBFZHVjYXRpb24gYW5kIEhlYWx0aDogUmVkdWNpbmcgRGlzcGFyaXRpZXMgVGhyb3VnaCBhIENvbnRleHR1YWwgQXBwcm9hY2guIEFubnVhbCByZXZpZXcgb2YgcHVibGljIGhlYWx0aCwgMzksIDI3M+KAkzI4OS4gaHR0cHM6Ly9kb2kub3JnLzEwLjExNDYvYW5udXJldi1wdWJsaGVhbHRoLTAzMTgxNi0wNDQ2MjgKCgo=