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=
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.