This paper explores the lexicalisation of HAPPINESS in the Malayic varieties spoken in the Indonesian archipelago. We specifically investigate (i) the inventory of lexical forms, and the conceptual categories they encode, that refer to the generic concept of HAPPINESS in English, and (ii) how they vary along the quantitative and sociolinguistic dimensions, particularly the regional variation. Our study reveals that HAPPINESS is strongly lexicalised by forms referring to SENANG overall. In addition to this general trend, we also demonstrated that the lexicalisation of HAPPINESS concept can vary, both qualitatively and quantitatively, across the region at a more generic, concept level, and a more specific level of morph types.
Keywords: HAPPINESS; lexicalisation; colloquial Malayic varieties; corpus linguistics; MPI EVA JFS
Introduction
On the notions of Lexicon and Lexicalisation
One thing that may come up in our mind when hearing the notion lexicon is a (set of) word(s) and the meaning, or “information content” (Jezek, 2016, p. 5), its expresses. This idea of the lexicon, which may be seen as an oversimplification, reveals two dimensions that constitute a basic consideration in any semiotic system such as language, namely form (e.g., lexical form, such as earth) and content (i.e., meaning evoked by or associated with the form, such as ‘planet in the solar system’, ‘substance on the land surface’, etc. associated with the form earth) (Jezek, 2016, p. 5). Meaning, when not yet associated with a lexical form, is generically conceived of as a concept: “mental categories carrying some information content, which can be said to exist independently from language” (Jezek, 2016, p. 5).
With respect to the aforementioned view, the notion lexicalisation attempts to capture the way in which concept is directly linked with a lexical form or word in a language. In fact, lexicalisation receives different interpretation (see Jezek, 2016, pp. 5–13, for an overview) from different areas of the linguistics sub-fields, such as morphology (see Hilpert, 2019) and language change (Brinton & Traugott, 2005). Word-formation processes are at the heart of lexicalisation if we view it as “the process by which new items that are considered ‘lexical’ (in terms of the theory in question) come into being” (Brinton & Traugott, 2005, p. 32), adding new open-class lexical items into the lexicon (Hilpert, 2019).
In this paper, we adopt the definition of lexicalisation as the lexical encoding or expressions of concept or conceptual categories (Brinton & Traugott, 2005, p. 18), such as the lexicalisation of the concept ‘father’s or mother’s sister’ by the English word aunt (Jezek, 2016, p. 6). This is a synchronic view of lexicalisation (Brinton & Traugott, 2005, p. 18), and may be related with the static interpretation of lexicalisation as a product/outcome, that is, the lexical inventory to express certain concept (Jezek, 2016, p. 7). For instance, liberty and freedom can be viewed as two lexicalisations of “being able or allowed to do what one wants to do” (Jezek, 2016, p. 7).
Aim of the Study
This paper provides an account of the lexicalisation of HAPPINESS in the colloquial Malayic varieties of Indonesia. The main aim is to investigate (i) the inventory of lexical forms, and their conceptual categories, that refer to the generic concept of HAPPINESS in English, and (ii) how they vary along the quantitative and sociolinguistic dimensions, particularly along the regional variation (cf. Geeraerts, 2006, p. 30). Our study contributes different dimensions and new corpus data to previous quantitative corpus-linguistic studies that have investigated HAPPINESS near-synonyms in (mostly written Standard) Indonesian, especially in terms of internal-variation in their metaphorical usages (Rajeg, 2019) and collocational patterns (Rajeg, 2020).
Inherent in this study is the notion of onomasiology, which “takes its starting point in a concept or referent and investigates by which different expressions the concept or referent can be designated, or named” (Grondelaers et al., 2007, p. 989). Our study also represents a facet of the broader area of usage-based, (socio)lexicology (cf. Grondelaers et al., 2007) that adopts quantitative, corpus-based approach and incorporates “lectal” variation (Geeraerts, 2006, p. 30). To pursue our aim, we use large collection of colloquial Malay/Indonesian corpora (cf. the next section), in an attempt to highlight its potential for the study of language variation in the archipelago, given the large body of linguistic and non-linguistic data available in the corpora. With the help of computational data-science tool, we show how descriptive statistical information and geo mapping data can feed into geospatial map for the variation of the lexicalisations.
Method
Since 2015, the colloquial Malay/Indonesian corpora have been made public by the Max Planck Institute for Evolutionary Anthropology (MPI EVA) Jakarta Field Station (JFS) (Gil et al., 2015). MPI EVA JFS engaged in a variety of projects that involve documentation, description, and analyses of the languages of Indonesia. The adult language projects focused on varieties of Malayic languages, ranging from Sumatra, West Kalimantan, Jakarta and the neighbouring area (e.g., West Java), and the Eastern varieties of Malay (i.e., Kupang Malay, Ternate Malay, and Papuan Malay). The complete corpora also include the child-language acquisition project (of Jakarta Indonesian) but it is not the focus of this study. The corpora are downloadable as a set of tabular files with comma-separated values (.csv
) format. The files are comprised of (i) metadata information, such as language name, project name, region, word counts, inter alia, and (ii) linguistic-proper database, such as the text corpus, tokenised words, morphs, word lists, and more. The relationship between the files are indicated by the key column-id (see Figure 2.1). These interlocking keys then allow us to merge programmatically one or more files and, eventually, build up the whole collection of the corpora into tabular database (see Table 2.1).
Table 2.1: Snippet of the corpora with selected variables/columns
kəluwarga daʔ bahagia |
family NEG happy |
Tapan Binjai |
West Sumatra |
kalu suda snaŋ ati |
TOP finish glad liver |
Tanjung Raden Malay |
Jambi Province |
senang ia be- duduk |
happy 3SG BE- sit |
Langkat Malay |
North Sumatra |
The Malayic-related corpora are extracted by filtering the database whose JFS languoid-codes begin with “M”, which stands for the Malayic family, or whose languoid name includes the word “Malay”. In total, the Malayic-related database amounts to 5,286,633 word-tokens across 1,280 sessions. Now let us dive into some details about the nature of the texts in the corpora (such as their mode, genres, and naturalness of the production). The predominant mode of production of the text in the sessions is via spoken language (88.75%; N=1,136); written texts only constitute 6.56% of all sessions and the remaining bit (4.69%) is not classified (NA
). The highest proportion (i.e., 91.33%; N=1,169) of all these sessions is comprised of naturally occurring texts; only 3.98% (N=51) of the sessions are elicited texts and the remaining 4.69% are not classified (i.e., NA
). In terms of the genre of the corpora, the lion’s share (65.55%; N=839) of the sessions is “conversation” genre, followed by “narrative” (20.39%; N=261), “word list” (3.59%; N=46), and other genres (0.39%; N=5), namely song, celebration, and mixed of narrative and conversation; the remaining 10.08% (N=129) is NA
.
Next, we retrieved the morphs glossed as ‘happy’, ‘glad’, and ‘joy(ful)’. Note that the values of the retrieved morphs
column are the same with those in the word_form
column; for this reason and succinctness, we use “morphs” in replace of “word_forms”. We excluded the derivatives (e.g., as derived verbs or derived nouns) of the morphs, which will be part of a future work on their morphological profiles. Table 2.2 shows examples of the database (the Phon. transc.
column is the phonetic transcription of the values in the Morphs
column).
Table 2.2: Snippet of the HAPPINESS lexicon database
bahagiya |
bahagia |
happy |
Kerinci, Sungai Penuh |
Jambi Province |
senaŋ |
senang |
happy |
Papuan Malay |
Papua |
giraŋ |
girang |
happy |
Tangerang Chinese Malay |
Banten |
In the analyses, we group a set of related morphs under the same conceptual categories that are labelled in standard Indonesian. For instance, the conceptual category or concept of SENANG subsumes such morphs as snang, sonaŋ, seneng, sanang, inter alia, that differ slightly in terms of their phonemic structures, such as the vowels. Another example is the concept BAHAGIA that can be lexicalised by bahɐgiɐ, bahagié, bahagiya, among others. The quantitative analyses involve descriptive statistics, namely frequency count and percentages for univariate and bivariate designs (Gries, 2013, pp. 102, 136). In the univariate descriptive statistics, we tally the total frequency of morphs lexicalising a given concept; this way, we can assess the relative prominence (statistically speaking) of the Malayic conceptual categories for HAPPINESS (Figure 3.1). The bivariate analysis captures the frequency distribution of the top-five Malayic HAPPINESS concepts by regions, both at the level of token and type frequencies. The token frequency of a concept by region refers to the total occurrences of the concept in the corpus of the region. The type frequency of a region refers to the number of different HAPPINESS concepts lexicalised in the given region. Geo spatial visualisations are included to capture the regional distribution of the HAPPINESS concepts and morphs more intuitively. All data pre-processing, statistical analyses, and visualisations are performed in RStudio using the R programming language (R Core Team, 2021). We wrote the paper fully in R Markdown Notebook that interleaves the regular texts and programming codes to run the quantitative and graphical analyses. The Notebook and the data are published at Open Science Framework (OSF) (see Rajeg & Rajeg, 2021 for the download link).
Findings and Discussion
Distribution of the concepts of HAPPINESS in colloquial Malayic varieties
To begin with, we discuss the prominent concepts referring to HAPPINESS in the Malayic varieties. As mentioned in the previous section, the concepts are postulated from a set of morphs. Figure 3.1 shows the relative distribution (in percentages) of these concepts in the database.
It can be observed that morphs lexicalising the concept SENANG are the most prominent for the Malayic varieties in Indonesia (N=435; 62.95% of the total tokens of all concepts); it is followed by BAHAGIA (N=78; 11.29%), SUKA (N=63; 9.12%), HAPPY (N=29; 4.2%), and (K)AROʔ (N=28; 4.05%). The concept (K)AROʔ is attested in the Kerinci, Pulau Tengah and Kerinci, Sungai Penuh languages spoken in the region of Jambi Province (cf. Figure 3.2), and postulated from these morphs: aroʔ, arawʔ, karóq. The prominence of SENANG and BAHAGIA in the colloquial Malayic varieties corroborates findings from previous experimental study on Indonesian emotion lexicon (cf. Shaver et al., 2001, p. 208), showing that SENANG and BAHAGIA are two of the five prototypical conceptual categories for HAPPINESS in Indonesian (together with GEMBIRA, CERIA, and RIANG).
Distribution of the top-five HAPPINESS concepts by regions
This sub-section discusses the distribution of the top-five concepts across the regions in the archipelago. This is visualised in Figure 3.2. The points represent certain areas within the region. If the database provides specific areas/location for a given region, but missing the geo mapping data (i.e., latitude and longitude) for these areas (indicated by NA
in the database), we identified their approximate latitude and longitude information via Google Maps. For instance, data for the Jambi Province subset includes the geo mapping information for these specific projects: Tanjung Raden; Mudung Darat; Jambi City; Kerinci, Pulau Tengah. However, the other projects in the same region do not have such geo mapping data: Kerinci, Sungai Penuh; Kerinci, Tanjung Pauh Mudik; Sarolangun; Rantau Panjang. For these projects lacking the geo mapping data, we retrieved them from Google Map by searching the specific areas mentioned as the project and/or data set names.
In addition to being the most frequent concept overall, SENANG is also the most frequent for six out of the eleven studied regions (Figure 3.2). The frequency of SENANG is the highest in three of the six regions, namely in East Nusa Tenggara (N=191), Jambi Province (N=123), and West Sumatra (N=97). The English concept HAPPY is also distributed rather widely, namely in six out of the total eleven regions. In terms of its proportion, HAPPY is relatively the most frequent in North Maluku (N=3; that is, 30% of the total 10 tokens from all concepts in this region) compared to the other five regions (i.e., West Java [14.29%; N=1]; West Kalimantan [13.22%; N=16]; West Sumatra [1.56%; N=2]; East Nusa Tenggara [2.38%; N=5]; and Jambi Province [0.99%; N=2]). The presence of morphs referring to English HAPPY among the top-five concepts suggests that the lexicalisation incorporates foreign words. Another interesting finding from Figure 3.2 is the distribution of SUKA, in which 61 (96.83%) of its total 63 tokens glossed as ‘happy’ are used in Sambas Malay in West Kalimantan (cf. the panel for SUKA in Figure 3.2); morphs evoking SUKA are not attested to be glossed as ‘happy’ or ‘glad’ in the corpora for the other regions, except in West Kalimantan and East Nusa Tenggara.
Out of curiousity, we further checked if morphs referring to the concept SUKA are exclusively used to encode ‘happy’/‘glad’ in the corpora from the two regions and the rests. The motivation for this is that in the standard Indonesian language, SUKA tends to lexicalise verbal concept of LIKING. To verify this assumption, we searched for the morphs glossed as ‘like’ and check if the morphs include those referring to HAPPINESS concepts in the top-five list. We found that only morphs referring to SENANG (in addition to SUKA) are attested to be glossed as ‘like’. We then calculated the relative frequency (i.e., in percentages) of ‘to like’ and ‘happy’ to be lexicalised by morphs for SUKA and SENANG in the two regions and the other regions in the database. The results are visualised in Figure 3.3.
As can be seen from all panels in Figure 3.3, morphs referring to SUKA are overwhelmingly used to express ‘to like’ than ‘happy’ in Kupang Malay (East Nusa Tenggara), the Malayic varieties of West Kalimantan (i.e., Pontianak Malay, Sambas Malay, Ketapang Malay, and Dayak Keninjal), and in the other regions coded in the database. It is also now clear that the glossing of SUKA as ‘happy’ in West Kalimantan is a minority compared to its predominant gloss of ‘to like’, even though the proportion of SUKA as ‘happy’ is still the highest in West Kalimantan. Figure 3.3 also shows that morphs referring to SENANG are found to be glossed as ‘to like’. However, it is rare for Kupang Malay and the other regions, but is not the case for the Malayic varieties in West Kalimantan since the morphs referring to SENANG appears to have relatively similar proportion in lexicalising ‘happy’ (48.15%) and ‘to like’ (51.85%). The question as to whether this could be variation between people who did the coding of the glossing for morphs encoding SUKA and SENANG (i) remains unclear, and (ii) requires in-depth study for the usage contexts of SUKA and SENANG as to when/why they were coded as ‘happy’ vs. ‘to like’.
The next analysis to report in this sub-section is the type frequency analysis, measuring the number of different HAPPINESS concepts attested in each region. We found that, of the eleven regions, the five regions exhibiting the highest type frequency are Jambi Province (eight different types of the HAPPINESS concepts), East Nusa Tenggara (seven types), and three other regions (i.e., North Maluku, West Kalimantan, West Sumatra) with ties (six types).
Distribution of morphs across the region
In the previous two sub-sections, we focus on generic, abstract level of conceptual categories, referred to by the specific morphs. It is also possible now to explore concrete, lexicalisations of each concept across the relevant regions, and reveal the phonemic variation of morphs for a given concept both qualitatively and quantitatively. For the reason of space, we illustrate this idea with SENANG. Figure 3.4 maps out all morphs referring to SENANG; the morphs labels are available from the morphs.csv
file (cf. Figure 2.1) and incorporated into the Morphs
column (cf. Table 2.2).
One qualitative observation that we can make from Figure 3.4 is that phonemic variation for the morphs lexicalising SENANG appears in the first and second syllables, such as the use of different vowel phonemes. For instance, SENANG is realised as sənang, sənaŋ, senang, and sénang in West Kalimantan. Meanwhile in Jambi Province, the morphs can vary in terms of omission of phonemes in the first syllable, such as (i) the omission of vowel leading to initial consonant cluster (e.g., snaŋ, sna, snang) or (ii) the omission of the initial s consonant (e.g., naŋ) and final consonant (sna).
Another aspect of variation that can be explored is quantitative in nature. One example is the average length (measured by the number of character) of the morphs, such that the morphs for SENANG in Jambi Province is on average shorter (\(\tilde{x}\)=3.5; IQR=1.25) than those in West Kalimantan (\(\tilde{x}\)=6; IQR=0.25). We can also measure the number of different variants of morphs per region (i.e., the type frequency) and the relative frequency of occurrence (i.e., relative token-frequency, such as percentage) of a given variant over the others (both of these measures are graphically represented in Figure 3.4). For example, North Sumatra, West Java, North Maluku all have only one type of morph evoking SENANG. Meanwhile Jambi Province and West Kalimantan have the highest number of morphs, namely four types, with East Nusa Tenggara and West Sumatra have respectively three and two types. We can also calculate the relative token-frequency for each morph attested in the corpus of a given region to reveal the prominence of a given variant of morph compared to the others. For instance, the three variants of morphs attested in East Nusa Tenggara (i.e., senang, sanang, and snang) have different rate of occurrences: senang is the most dominant one (as shown by its largest size in Figure 3.4) (N=169; 88.48%), followed by sanang (N=20; 10.47%) and snang (N=2; 1.05%).
Conclusion
This corpus-based study reveals that HAPPINESS is most predominantly lexicalised by morphs referring to the concept SENANG in the colloquial Malayic varieties in Indonesia, corroborating a previous experimental study on HAPPINESS conceptual categories in Indonesian (Shaver et al., 2001, p. 208). It is also demonstrated that each region varies in the distribution of each HAPPINESS concepts (e.g., variation in terms of the type and token frequencies of the concepts per region). At a more specific level, we show that the morphs lexicalising a given concept (e.g., SENANG) in certain regions also exhibit qualitative (e.g., the phonemic structure) and quantitative variations (e.g., the number of different morphs attested in a region and the morphs’ token frequencies). To conclude, we hope to have provided a glimpse of insights from exploring the open-access corpora of colloquial Malayic varieties in the Indonesian archipelago for the study of emotion lexicalisation in the context of regional variation.
References
Brinton, L. J., & Traugott, E. C. (2005). Lexicalization and language change. Cambridge University Press.
Geeraerts, D. (2006). Methodology in Cognitive Linguistics. In G. Kristiansen, M. Achard, R. Dirven, & F. J. Ruiz de Mendoza Ibáñez (Eds.), Cognitive linguistics: Current applications and future perspectives (pp. 21–49). Mouton de Gruyter.
Gil, D., Tadmor, U., Bowden, J., & Taylor, B. (2015).
Data from the Jakarta Field Station, Department of Linguistics, Max Planck Institute for Evolutionary Anthropology, 1999-2015.
https://lingweb.eva.mpg.de/archive/jakarta/data.php.html
Gries, S. Th. (2013). Statistics for linguistics with R: A practical introduction (Second). Mouton de Gruyter.
Grondelaers, S., Speelman, D., & Geeraerts, D. (2007). Lexical variation and change. In D. Geeraerts & H. Cuyckens (Eds.), The Oxford Handbook of Cognitive Linguistics (pp. 988–1011). Oxford University Press.
Hilpert, M. (2019). Lexicalization in
Morphology. In
Oxford Research Encyclopedia of Linguistics.
Oxford University Press.
https://doi.org/10.1093/acrefore/9780199384655.013.622
Jezek, E. (2016). The lexicon: An introduction. Oxford University Press.
R Core Team. (2021).
R: A language and environment for statistical computing. R Foundation for Statistical Computing.
https://www.R-project.org/
Rajeg, G. P. W. (2019).
Metaphorical profiles and near-synonyms: A corpus-based study of Indonesian words for Happiness [PhD Thesis, Monash University, Australia].
https://doi.org/10.26180/5cac231a97fb1
Rajeg, G. P. W. (2020). Linguistik korpus kuantitatif dan kajian semantik leksikal sinonim emosi bahasa
Indonesia.
Linguistik Indonesia,
38(2), 123–150.
https://doi.org/10.26499/li.v38i2.155
Rajeg, G. P. W., & Rajeg, I. M. (2021). Supplementary materials for
The Lexicalisation of HAPPINESS in the Malayic Varieties of Indonesia.
Open Science Framework (OSF).
https://doi.org/10.17605/OSF.IO/Y42F6
Shaver, P. R., Murdaya, U., & Fraley, R. C. (2001). Structure of the
Indonesian emotion lexicon.
Asian Journal of Social Psychology,
4(3), 201–224.
https://doi.org/10.1111/1467-839X.00086
Trask, R. L. (1997). A Student’s Dictionary of Language and Linguistics. Arnold ; Distributed by St. Martin’s Press.
LS0tDQp0aXRsZTogIlRoZSBsZXhpY2FsaXNhdGlvbiBvZiBIQVBQSU5FU1MgaW4gdGhlIE1hbGF5aWMgdmFyaWV0aWVzIG9mIEluZG9uZXNpYSINCmF1dGhvcjogIltHZWRlIFByaW1haGFkaSBXaWpheWEgUmFqZWddKGh0dHBzOi8vdWRheWFuYW5ldHdvcmtpbmcudW51ZC5hYy5pZC9sZWN0dXJlci84ODAtZ2VkZS1wcmltYWhhZGktd2lqYXlhLXJhamVnKSAmIFtJIE1hZGUgUmFqZWddKGh0dHBzOi8vdWRheWFuYW5ldHdvcmtpbmcudW51ZC5hYy5pZC9sZWN0dXJlci8xODE3LWktbWFkZS1yYWplZykiDQpkYXRlOiAiVW5pdmVyc2l0YXMgVWRheWFuYSwgSW5kb25lc2lhIg0Kb3V0cHV0OiANCiAgYm9va2Rvd246Omh0bWxfbm90ZWJvb2syOiANCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIHRvYzogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIHRoZW1lOiBjb3Ntbw0KICAgIGhpZ2hsaWdodDogemVuYnVybg0KICBodG1sX2RvY3VtZW50OiANCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIHRvYzogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIHRoZW1lOiBjb3Ntbw0KICAgIGhpZ2hsaWdodDogemVuYnVybg0KICBib29rZG93bjo6d29yZF9kb2N1bWVudDI6DQogICAgZmlnX2NhcHRpb246IHRydWUNCiAgICBmaWdfd2lkdGg6IDYNCiAgICByZWZlcmVuY2VfZG9jeDogImF1c3Ryb25lc2lhbi1hYnN0cmFjdC0yMDIxLWdwd3JhamVnLXRlbXAuZG9jeCINCmxpbmstY2l0YXRpb25zOiB5ZXMNCmJpYmxpb2dyYXBoeTogYmlibGlvLmJpYg0KY3NsOiAnYXBhLmNzbCcNCi0tLQ0KDQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICBib2R5ew0KICBmb250LXNpemU6IDE2cHQ7DQp9DQo8L3N0eWxlPg0KDQpgYGB7ciBzZXR1cCwgbWVzc2FnZSA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIGluY2x1ZGUgPSBGQUxTRX0NCiMgZ2xvYmFsIG9wdGlvbiBjaHVuY2sNCmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcud2lkdGggPSA3LCANCiAgICAgICAgICAgICAgICAgICAgICBmaWcuYXNwID0gMC42MTgsDQogICAgICAgICAgICAgICAgICAgICAgZmlnLnJldGluYSA9IDIsDQogICAgICAgICAgICAgICAgICAgICAgZHBpID0gMzAwLA0KICAgICAgICAgICAgICAgICAgICAgIGRldiA9ICJwbmciLA0KICAgICAgICAgICAgICAgICAgICAgIGVjaG8gPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGZpZy5wYXRoID0gImZpZ3VyZXMvIikNCg0KIyBsb2FkIHBhY2thZ2VzDQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeSh0aWR5dmVyc2UpKQ0Kc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkobWFwcykpDQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeShtYXBkYXRhKSkNCnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyhsaWJyYXJ5KGdndGhlbWVzKSkNCnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyhsaWJyYXJ5KGdncmVwZWwpKQ0KDQojIGxvYWQgdGhlIG1haW4gbm9uLWFjcXVpc2l0aW9uIG1ldGEtZGF0YSBmb3IgYWxsIHRoZSBNYWxheWljIHZhcmlldGllcw0Kbm9uX2FjcXVpc2l0aW9uX21hbGF5aWNfc2Vzc2lvbnNfZGF0YXNldF9wcm9qZWN0IDwtIHJlYWRyOjpyZWFkX3RzdigiZGF0YS9ub25fYWNxdWlzaXRpb25fbWFsYXlpY19zZXNzaW9uc19kYXRhc2V0X3Byb2plY3QudHN2IikNCm5vbl9hY3F1aXNpdGlvbl9tYWxheWljX3Nlc3Npb25zX2RhdGFzZXRfcHJvamVjdF9taW5pIDwtIG5vbl9hY3F1aXNpdGlvbl9tYWxheWljX3Nlc3Npb25zX2RhdGFzZXRfcHJvamVjdCAlPiUgDQogIHNlbGVjdChzZXNzaW9uX2lkLCBzZXNzaW9uX25hbWUsIGRhdGFfc2V0X25hbWUsIHByb2plY3RfbmFtZSwgd29yZF9jb3VudCwgDQogICAgICAgICBsYW5ndW9pZF9uYW1lX25ldywgZWxpY2l0ZWRfb3JfbmF0dXJhbCwgZ2VucmUsIHN1YmdlbnJlLCBtb2RlLCBjbGFzc2lmaWNhdGlvbikgJT4lIA0KICBkaXN0aW5jdCgpICU+JSANCiAgbXV0YXRlKGdlbnJlID0gc3RyX3RvX2xvd2VyKGdlbnJlKSwNCiAgICAgICAgIHN1YmdlbnJlID0gcmVwbGFjZShzdWJnZW5yZSwgc3ViZ2VucmUgPT0gIlwiT3RoZXJcIiIsICJPdGhlciIpLA0KICAgICAgICAgc3ViZ2VucmUgPSByZXBsYWNlKHN1YmdlbnJlLCBzdWJnZW5yZSA9PSAiVHJhZGl0b25hbGZvbGsgc3RvcnkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhZGl0aW9uYWwgZm9sayBzdG9yeSIpLA0KICAgICAgICAgc3ViZ2VucmUgPSBzdHJfcmVwbGFjZShzdWJnZW5yZSwgIl4oP2kpdHJhZGl0b25hbCIsICJ0cmFkaXRpb25hbCIpLA0KICAgICAgICAgc3ViZ2VucmUgPSBzdHJfdG9fbG93ZXIoc3ViZ2VucmUpLA0KICAgICAgICAgbW9kZSA9IHJlcGxhY2UobW9kZSwgbW9kZSA9PSAiU3Bva2UiLCAic3Bva2VuIiksDQogICAgICAgICBtb2RlID0gc3RyX3RvX2xvd2VyKG1vZGUpLA0KICAgICAgICAgZWxpY2l0ZWRfb3JfbmF0dXJhbCA9IHN0cl9yZXBsYWNlKGVsaWNpdGVkX29yX25hdHVyYWwsICJeKD9pKShuYSlyKHR1cmFsKSIsICJcXDFcXDIiKSwNCiAgICAgICAgIGVsaWNpdGVkX29yX25hdHVyYWwgPSBzdHJfdG9fbG93ZXIoZWxpY2l0ZWRfb3JfbmF0dXJhbCkpDQoNCiMgZ2VuZXJhdGUgd29yZCBjb3VudHMNCm5vbl9hY3F1aXNpdGlvbl9tYWxheWljX3dvcmRfY291bnQgPC0gc3VtKG5vbl9hY3F1aXNpdGlvbl9tYWxheWljX3Nlc3Npb25zX2RhdGFzZXRfcHJvamVjdCR3b3JkX2NvdW50KQ0Kd29yZF9jb3VudF9wZXJfcHJvamVjdF9uYW1lIDwtIGRwbHlyOjpzdW1tYXJpc2UoZHBseXI6Omdyb3VwX2J5KG5vbl9hY3F1aXNpdGlvbl9tYWxheWljX3Nlc3Npb25zX2RhdGFzZXRfcHJvamVjdCwgcHJvamVjdF9uYW1lKSwgd29yZF9jb3VudF9wcm9qZWN0ID0gc3VtKHdvcmRfY291bnQpKQ0Kd29yZF9jb3VudF9wZXJfZGF0YV9zZXRfbmFtZSA8LSBkcGx5cjo6c3VtbWFyaXNlKGRwbHlyOjpncm91cF9ieShub25fYWNxdWlzaXRpb25fbWFsYXlpY19zZXNzaW9uc19kYXRhc2V0X3Byb2plY3QsIGRhdGFfc2V0X25hbWUpLCB3b3JkX2NvdW50X2RhdGFfc2V0ID0gc3VtKHdvcmRfY291bnQpKQ0Kd29yZF9jb3VudF9wZXJfbGFuZ3VvaWRfbmFtZSA8LSBkcGx5cjo6c3VtbWFyaXNlKGRwbHlyOjpncm91cF9ieShub25fYWNxdWlzaXRpb25fbWFsYXlpY19zZXNzaW9uc19kYXRhc2V0X3Byb2plY3QsIGxhbmd1b2lkX25hbWVfbmV3KSwgd29yZF9jb3VudF9sYW5ndW9pZCA9IHN1bSh3b3JkX2NvdW50KSkNCndvcmRfY291bnRfcGVyX2NsYXNzaWZpY2F0aW9uIDwtIGRwbHlyOjpzdW1tYXJpc2UoZHBseXI6Omdyb3VwX2J5KG5vbl9hY3F1aXNpdGlvbl9tYWxheWljX3Nlc3Npb25zX2RhdGFzZXRfcHJvamVjdCwgY2xhc3NpZmljYXRpb24pLCB3b3JkX2NvdW50X2NsYXNzaWZpY2F0aW9uID0gc3VtKHdvcmRfY291bnQpKQ0Kd29yZF9jb3VudF9wZXJfcmVnaW9uIDwtIGRwbHlyOjpzdW1tYXJpc2UoZHBseXI6Omdyb3VwX2J5KG5vbl9hY3F1aXNpdGlvbl9tYWxheWljX3Nlc3Npb25zX2RhdGFzZXRfcHJvamVjdCwgcmVnaW9uKSwgd29yZF9jb3VudF9yZWdpb24gPSBzdW0od29yZF9jb3VudCkpDQoNCiMgbG9hZCB0aGUgbWFpbiBoYXBweSBsZXhpY29uIGRhdGFiYXNlDQptYWxheWljX2hhcHB5IDwtIHJlYWRyOjpyZWFkX3RzdigiZGF0YS9tYWxheWljX2hhcHB5LnRzdiIpICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoZ2xvc3NfdGV4dCwgImpveSBncmllZiIsIG5lZ2F0ZSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZShtb3JwaHMgPSByZXBsYWNlKG1vcnBocywgbW9ycGhzID09ICJIYXBweSIsICJoYXBweSIpLA0KICAgICAgICAgd29yZF9mb3JtID0gcmVwbGFjZSh3b3JkX2Zvcm0sIHdvcmRfZm9ybSA9PSAiSGFwcHkiLCAiaGFwcHkiKSkNCg0KIyBsb2FkIHRoZSBkYXRhIHdpdGggdGhlIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgdmFyaWFibGVzDQptYWxheWljX2hhcHB5X2ZyZXFfbG9uZ19sYXQgPC0gcmVhZHI6OnJlYWRfdHN2KCJkYXRhL21hbGF5aWNfaGFwcHlfZnJlcV9sb25nX2xhdC50c3YiKSAlPiUgDQogIHNlbGVjdChwcm9qZWN0X25hbWUsIHJlZ2lvbiwgcHJvdmluY2UsIGRhdGFfc2V0X25hbWUsIGxhbmd1b2lkX25hbWVfbmV3LCANCiAgICAgICAgIGxhdGl0dWRlLCBsb25naXR1ZGUsIG1vcnBocywgZ2xvc3MpICU+JSANCiAgZGlzdGluY3QoKSAlPiUgDQogIG11dGF0ZShtb3JwaHMgPSByZXBsYWNlKG1vcnBocywgbW9ycGhzID09ICJIYXBweSIsICJoYXBweSIpKQ0KDQojIGdldCB0aGUgaW5kb25lc2lhbiBwcm92aW5jZSBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIGRhdGENCmluZG9wcm92IDwtIHJlYWRyOjpyZWFkX3RzdigiZGF0YS9pbmRvLXByb3YtbGF0bG9uZy5jc3YiKQ0KYGBgDQoNCmBgYHtyIGV2YWwgPSBGQUxTRX0NCiMgZ2VuZXJhdGUgYmlibGlvZ3JhcGhpZXMgZm9yIFIgcGFja2FnZXMNCmtuaXRyOjp3cml0ZV9iaWIoYygNCiAgLnBhY2thZ2VzKCksICJib29rZG93biIsICJrbml0ciIsICJybWFya2Rvd24iLCAidGlkeXZlcnNlIiwgDQogICJtYXBzIiwgIm1hcGRhdGEiLCAiZ2d0aGVtZXMiLCAiZ2dyZXBlbCINCiksICJwYWNrYWdlcy5iaWIiKQ0KYGBgDQoNCg0KYGBge3IgbnVtYmVyLTItd29yZHMtZnVuY3Rpb259DQojIyBGdW5jdGlvbiBieSBKb2huIEZveCBmb3VuZCBoZXJlOg0KIyMgaHR0cDovL3RvbHN0b3kubmV3Y2FzdGxlLmVkdS5hdS9SL2hlbHAvMDUvMDQvMjcxNS5odG1sDQojIyBUd2Vha3MgYnkgQUpIIHRvIGFkZCBjb21tYXMgYW5kICJhbmQiDQojIyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9wc3ljaGVtZWRpYS8xNTBjYjk5MDE1MjlkYTU4MTI0YQ0KbnVtYmVyczJ3b3JkcyA8LSBmdW5jdGlvbih4KSB7DQogICAgaGVscGVyIDwtIGZ1bmN0aW9uKHgpew0KDQogICAgZGlnaXRzIDwtIHJldihzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICIiKVtbMV1dKQ0KICAgIG5EaWdpdHMgPC0gbGVuZ3RoKGRpZ2l0cykNCiAgICBpZiAobkRpZ2l0cyA9PSAxKSBhcy52ZWN0b3Iob25lc1tkaWdpdHNdKQ0KICAgIGVsc2UgaWYgKG5EaWdpdHMgPT0gMikNCiAgICAgIGlmICh4IDw9IDE5KSBhcy52ZWN0b3IodGVlbnNbZGlnaXRzWzFdXSkNCiAgICBlbHNlIHRyaW0ocGFzdGUodGVuc1tkaWdpdHNbMl1dLA0KICAgICAgICAgICAgICAgICAgICBSZWNhbGwoYXMubnVtZXJpYyhkaWdpdHNbMV0pKSkpDQogICAgZWxzZSBpZiAobkRpZ2l0cyA9PSAzKSB0cmltKHBhc3RlKG9uZXNbZGlnaXRzWzNdXSwgImh1bmRyZWQgYW5kIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjYWxsKG1ha2VOdW1iZXIoZGlnaXRzWzI6MV0pKSkpDQogICAgZWxzZSB7DQogICAgICBuU3VmZml4IDwtICgobkRpZ2l0cyArIDIpICUvJSAzKSAtIDENCiAgICAgIGlmIChuU3VmZml4ID4gbGVuZ3RoKHN1ZmZpeGVzKSkgc3RvcChwYXN0ZSh4LCAiaXMgdG9vIGxhcmdlISIpKQ0KICAgICAgdHJpbShwYXN0ZShSZWNhbGwobWFrZU51bWJlcihkaWdpdHNbDQogICAgICAgIG5EaWdpdHM6KDMqblN1ZmZpeCArIDEpXSkpLA0KICAgICAgICBzdWZmaXhlc1tuU3VmZml4XSwiLCIgLA0KICAgICAgICBSZWNhbGwobWFrZU51bWJlcihkaWdpdHNbKDMqblN1ZmZpeCk6MV0pKSkpDQogICAgfQ0KICB9DQogIHRyaW0gPC0gZnVuY3Rpb24odGV4dCl7DQogICAgI1RpZHkgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlLCBzcGFjZSBiZWZvcmUgY29tbWENCiAgICB0ZXh0PWdzdWIoIl5cICIsICIiLCBnc3ViKCJcICokIiwgIiIsIGdzdWIoIlwgLCIsIiwiLHRleHQpKSkNCiAgICAjQ2xlYXIgYW55IHRyYWlsaW5nICIgYW5kIg0KICAgIHRleHQ9Z3N1YigiIGFuZCQiLCIiLHRleHQpDQogICAgI0NsZWFyIGFueSB0cmFpbGluZyBjb21tYQ0KICAgIGdzdWIoIlwgKiwkIiwiIix0ZXh0KQ0KICB9DQogIG1ha2VOdW1iZXIgPC0gZnVuY3Rpb24oLi4uKSBhcy5udW1lcmljKHBhc3RlKC4uLiwgY29sbGFwc2U9IiIpKQ0KICAjRGlzYWJsZSBzY2llbnRpZmljIG5vdGF0aW9uDQogIG9wdHMgPC0gb3B0aW9ucyhzY2lwZW49MTAwKQ0KICBvbi5leGl0KG9wdGlvbnMob3B0cykpDQogIG9uZXMgPC0gYygiIiwgIm9uZSIsICJ0d28iLCAidGhyZWUiLCAiZm91ciIsICJmaXZlIiwgInNpeCIsICJzZXZlbiIsDQogICAgICAgICAgICAiZWlnaHQiLCAibmluZSIpDQogIG5hbWVzKG9uZXMpIDwtIDA6OQ0KICB0ZWVucyA8LSBjKCJ0ZW4iLCAiZWxldmVuIiwgInR3ZWx2ZSIsICJ0aGlydGVlbiIsICJmb3VydGVlbiIsICJmaWZ0ZWVuIiwNCiAgICAgICAgICAgICAic2l4dGVlbiIsICIgc2V2ZW50ZWVuIiwgImVpZ2h0ZWVuIiwgIm5pbmV0ZWVuIikNCiAgbmFtZXModGVlbnMpIDwtIDA6OQ0KICB0ZW5zIDwtIGMoInR3ZW50eSIsICJ0aGlydHkiLCAiZm9ydHkiLCAiZmlmdHkiLCAic2l4dHkiLCAic2V2ZW50eSIsICJlaWdodHkiLA0KICAgICAgICAgICAgIm5pbmV0eSIpDQogIG5hbWVzKHRlbnMpIDwtIDI6OQ0KICB4IDwtIHJvdW5kKHgpDQogIHN1ZmZpeGVzIDwtIGMoInRob3VzYW5kIiwgIm1pbGxpb24iLCAiYmlsbGlvbiIsICJ0cmlsbGlvbiIpDQogIGlmIChsZW5ndGgoeCkgPiAxKSByZXR1cm4odHJpbShzYXBwbHkoeCwgaGVscGVyKSkpDQogIGhlbHBlcih4KQ0KfQ0KYGBgDQoNCmBgYHtyIGNyb3NzLXRhYnVsYXRpb259DQojIGNvdW50IHRoZSBkaXN0cmlidXRpb24gZm9yIHRoZSBtb3JwaHMgd2l0aCBgZ2xvc3NgLCBgZGF0YV9zZXRfbmFtZWAsIGByZWdpb25gLCBgcHJvamVjdF9uYW1lYCwgYW5kIGBsYW5ndW9pZF9uYW1lX25ld2AuDQptYWxheWljX2hhcHB5X2ZyZXEgPC0gbWFsYXlpY19oYXBweSAlPiUgDQogIGNvdW50KG1vcnBocywgZ2xvc3MsIGRhdGFfc2V0X25hbWUsIHJlZ2lvbiwgcHJvamVjdF9uYW1lLCBsYW5ndW9pZF9uYW1lX25ldykgJT4lIA0KICBzZWxlY3QocHJvamVjdF9uYW1lLCByZWdpb24sIGRhdGFfc2V0X25hbWUsIGxhbmd1b2lkX25hbWVfbmV3LCBtb3JwaHMsIGdsb3NzLCBuKSAlPiUgDQogIGFycmFuZ2UocHJvamVjdF9uYW1lLCByZWdpb24sIGRhdGFfc2V0X25hbWUsIGxhbmd1b2lkX25hbWVfbmV3LCBkZXNjKG4pLCBtb3JwaHMsIGdsb3NzKSAlPiUgDQogIG11dGF0ZShnbG9zcyA9IHN0cl9yZXBsYWNlKGdsb3NzLCAiWzouXVtBLVpdJCIsICIiKSkNCmBgYA0KDQpgYGB7ciBjb3VudC1mcmVxLW1vcnBoc30NCiMgY291bnQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbW9ycGhzIG9ubHkNCm1hbGF5aWNfaGFwcHlfZnJlcV9tb3JwaHMgPC0gbWFsYXlpY19oYXBweV9mcmVxICU+JSANCiAgZ3JvdXBfYnkobW9ycGhzKSAlPiUgDQogIHN1bW1hcmlzZShuID0gc3VtKG4pKSAlPiUgDQogIGFycmFuZ2UobW9ycGhzLCBkZXNjKG4pKSAlPiUgDQogICMgYWRkIHRoZSBJbmRvbmVzaWFuIGxlbW1hIGluZm9ybWF0aW9uIG9mIHRoZSBtb3JwaHMNCiAgbXV0YXRlKGxlbW1hID0gIkJBSEFHSUEiLA0KICAgICAgICAgbGVtbWEgPSBpZl9lbHNlKG1vcnBocyAlaW4lIGMoImFyYXfKlCIsICJhcm/KlCIsICJrYXLDs3EiKSwgIihLKUFST8qUIiwgbGVtbWEpLA0KICAgICAgICAgbGVtbWEgPSBpZl9lbHNlKG1vcnBocyAlaW4lIGMoImNlcmlhIiksICJDRVJJQSIsIGxlbW1hKSwNCiAgICAgICAgIGxlbW1hID0gaWZfZWxzZShtb3JwaHMgJWluJSBjKCJnYW1iaXJhIiwgImdlbWJpcmEiLCAiZ2VtYmlyw6kiLCAiZ8mbbWJpcmEiKSwgIkdFTUJJUkEiLCBsZW1tYSksDQogICAgICAgICBsZW1tYSA9IGlmX2Vsc2UobW9ycGhzICVpbiUgYygiZ2lyYW5nIiksICJHSVJBTkciLCBsZW1tYSksDQogICAgICAgICBsZW1tYSA9IGlmX2Vsc2UobW9ycGhzICVpbiUgYygiaGFwcHkiLCAiSGFwcHkiLCAiaGVwZSIsICJow6lwaSIsICJoyZtwaSIsICJoZXBpIiksICJIQVBQWSIsIGxlbW1hKSwNCiAgICAgICAgIGxlbW1hID0gaWZfZWxzZShtb3JwaHMgJWluJSBjKCJsYWRhcyIpLCAiTEFEQVMiLCBsZW1tYSksDQogICAgICAgICBsZW1tYSA9IGlmX2Vsc2UobW9ycGhzICVpbiUgYygibmHFiyIpLCAiU0VOQU5HIiwgbGVtbWEpLA0KICAgICAgICAgbGVtbWEgPSBpZl9lbHNlKG1vcnBocyAlaW4lIGMoInJpYSIpLCAiUklBIiwgbGVtbWEpLA0KICAgICAgICAgbGVtbWEgPSBpZl9lbHNlKG1vcnBocyAlaW4lIGMoInJpYmFuZyIpLCAiUklCQU5HIiwgbGVtbWEpLA0KICAgICAgICAgbGVtbWEgPSBpZl9lbHNlKG1vcnBocyAlaW4lIGMoInNlbW9yZSIpLCAiU0VNT1JFIiwgbGVtbWEpLA0KICAgICAgICAgbGVtbWEgPSBpZl9lbHNlKG1vcnBocyAlaW4lIGMoInNhbmFuZyIsICJzZW5hbmciLCAic8OpbmFuZyIsICJzZW5lbmciLCAic8mZbmFuZyIsICJzyZluYcWLIiwgInNuYW5nIiwgInNuYcWLIiwgInNvbmHFi8uQIiwgInNvbmHFiyIsICJzbmEiKSwgIlNFTkFORyIsIGxlbW1hKSwNCiAgICAgICAgIGxlbW1hID0gaWZfZWxzZShtb3JwaHMgJWluJSBjKCJzdWthY2l0YSIpLCAiU1VLQUNJVEEiLCBsZW1tYSksDQogICAgICAgICBsZW1tYSA9IGlmX2Vsc2UobW9ycGhzICVpbiUgYygic3Vrw6kiLCAic3VrYSIpLCAiU1VLQSIsIGxlbW1hKSwNCiAgICAgICAgIGxlbW1hID0gaWZfZWxzZShtb3JwaHMgPT0gImxhZMmQeXMiLCAiTEFEQVMiLCBsZW1tYSksDQogICAgICAgICBsZW1tYSA9IGlmX2Vsc2UobW9ycGhzID09ICJqyZR5IiwgIkpPWSIsIGxlbW1hKSwNCiAgICAgICAgIGxlbW1hID0gaWZfZWxzZShtb3JwaHMgJWluJSBjKCJrcnTJmW4iLCAia8mocnTJmW4iKSwgdG91cHBlcigia8mocnTJmW4iKSwgbGVtbWEpLA0KICAgICAgICAgbGVtbWEgPSBpZl9lbHNlKG1vcnBocyA9PSAiYm9yb2kiLCAiQk9ST0kiLCBsZW1tYSksDQogICAgICAgICBsZW1tYSA9IGlmX2Vsc2UobW9ycGhzID09ICJpeWHFiyIsICJJWUFORyIsIGxlbW1hKSkNCmBgYA0KDQoNCmBgYHtyIGNvdW50LWZyZXEtbGVtbWF9DQojIGNvdW50IHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIGxlbW1hcyBvbmx5DQptYWxheWljX2hhcHB5X2ZyZXFfbGVtbWEgPC0gbWFsYXlpY19oYXBweV9mcmVxX21vcnBocyAlPiUgDQogIGdyb3VwX2J5KGxlbW1hKSAlPiUgDQogIHN1bW1hcmlzZShuID0gc3VtKG4pLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhuKSkgJT4lIA0KICBtdXRhdGUocGVyY19sZW1tYSA9IHJvdW5kKG4gLyBzdW0obikgKiAxMDAsIDIpKQ0KDQojIG1hcmsgdGhlIHNpbmdsZXRvbiBsZW1tYSBhcyAnT1RIRVJTJw0KbWFsYXlpY19oYXBweV9mcmVxX2xlbW1hIDwtIG1hbGF5aWNfaGFwcHlfZnJlcV9sZW1tYSAlPiUgDQogIG11dGF0ZShsZW1tYV9uZXcgPSBpZl9lbHNlKHBlcmNfbGVtbWEgPCAxLCAiT1RIRVJTIiwgbGVtbWEpKQ0KYGBgDQoNCmBgYHtyIGNvbWJpbmUtbGVtbWEtdG8tbWFsYXlpYy1tYWluLWhhcHB5LWZyZXF9DQojIGNvbWJpbmUgdGhlIGxlbW1hIGludG8gdGhlIGBtYWxheWljX2hhcHB5X2ZyZXFgDQptYWxheWljX2hhcHB5X2ZyZXEgPC0gbWFsYXlpY19oYXBweV9mcmVxICU+JSANCiAgbGVmdF9qb2luKG1hbGF5aWNfaGFwcHlfZnJlcV9tb3JwaHMgJT4lDQogICAgICAgICAgICAgIHNlbGVjdCgtbiksIA0KICAgICAgICAgICAgYnkgPSAibW9ycGhzIikgJT4lIA0KICBsZWZ0X2pvaW4obWFsYXlpY19oYXBweV9mcmVxX2xlbW1hICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KC1uKSwNCiAgICAgICAgICAgIGJ5ID0gImxlbW1hIikNCmBgYA0KDQoNCmBgYHtyIGNvbWJpbmUtZ2VvZ3JhcGhpY2FsLWxvY2F0aW9uLWRhdGF9DQptYWxheWljX2hhcHB5X2ZyZXEgPC0gbWFsYXlpY19oYXBweV9mcmVxICU+JSANCiAgbGVmdF9qb2luKG1hbGF5aWNfaGFwcHlfZnJlcV9sb25nX2xhdCwNCiAgICAgICAgICAgIGJ5ID0gYygicHJvamVjdF9uYW1lIiwgInJlZ2lvbiIsICJkYXRhX3NldF9uYW1lIiwgDQogICAgICAgICAgICAgICAgICAgImxhbmd1b2lkX25hbWVfbmV3IiwgIm1vcnBocyIsICJnbG9zcyIpKSAlPiUgDQogIGxlZnRfam9pbihpbmRvcHJvdiwgYnkgPSAicHJvdmluY2UiKQ0KYGBgDQoNCmBgYHtyIHN1bW1hcmlzZS10b2tlbi1vZi1sZW1tYS1ieS1wcm9qZWN0LW5hbWUtYW5kLXJlZ2lvbn0NCiMgc3VtbWFyaXNlIHRva2VuLWZyZXF1ZW5jeSBvZiB0aGUgbGVtbWEgYnkgcHJvamVjdF9uYW1lIGFuZCByZWdpb24NCm1hbGF5aWNfaGFwcHlfbGVtbWFfZnJlcV9ieV9wcm9qZWN0X3JlZ2lvbiA8LSBtYWxheWljX2hhcHB5X2ZyZXEgJT4lIA0KICBncm91cF9ieShwcm9qZWN0X25hbWUsIHJlZ2lvbiwgbGVtbWEpICU+JSANCiAgc3VtbWFyaXNlKG4gPSBzdW0obiksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgYXJyYW5nZShwcm9qZWN0X25hbWUsIHJlZ2lvbiwgZGVzYyhuKSwgbGVtbWEpDQpgYGANCg0KYGBge3Igc3VtbWFyaXNlLXRva2VuLW9mLWxlbW1hLWJ5LWxhbmd1b2lkLW5hbWUtYW5kLXJlZ2lvbiwgZXZhbCA9IEZBTFNFfQ0KIyBzdW1tYXJpc2UgdG9rZW4tZnJlcXVlbmN5IG9mIHRoZSBsZW1tYSBieSBsYW5ndW9pZF9uYW1lX25ldyBhbmQgcmVnaW9uDQptYWxheWljX2hhcHB5X2xlbW1hX2ZyZXFfYnlfbGFuZ3VvaWRfcmVnaW9uIDwtIG1hbGF5aWNfaGFwcHlfZnJlcSAlPiUgDQogIGdyb3VwX2J5KGxhbmd1b2lkX25hbWVfbmV3LCByZWdpb24sIGxlbW1hKSAlPiUgDQogIHN1bW1hcmlzZShuID0gc3VtKG4pLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGFycmFuZ2UobGFuZ3VvaWRfbmFtZV9uZXcsIHJlZ2lvbiwgZGVzYyhuKSwgbGVtbWEpDQpgYGANCg0KYGBge3Igc3VtbWFyaXNlLXRva2VuLW9mLWxlbW1hLWJ5LWxhbmd1b2lkLW5hbWUsIGV2YWwgPSBGQUxTRX0NCiMgc3VtbWFyaXNlIHRva2VuLWZyZXF1ZW5jeSBvZiB0aGUgbGVtbWEgYnkgbGFuZ3VvaWRfbmFtZV9uZXcNCm1hbGF5aWNfaGFwcHlfbGVtbWFfZnJlcV9ieV9sYW5ndW9pZCA8LSBtYWxheWljX2hhcHB5X2ZyZXEgJT4lIA0KICBncm91cF9ieShsYW5ndW9pZF9uYW1lX25ldywgbGVtbWEpICU+JSANCiAgc3VtbWFyaXNlKG4gPSBzdW0obiksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgYXJyYW5nZShsYW5ndW9pZF9uYW1lX25ldywgZGVzYyhuKSwgbGVtbWEpDQpgYGANCg0KYGBge3Igc3VtbWFyaXNlLXRva2VuLW9mLWxlbW1hLWFuZC1wZXJjZW50YWdlcy1ieS1yZWdpb259DQojIHN1bW1hcmlzZSB0b2tlbi1mcmVxdWVuY3kgYW5kIHBlcmNlbnRhZ2VzIG9mIHRoZSBsZW1tYSBieSByZWdpb24NCm1hbGF5aWNfaGFwcHlfbGVtbWFfZnJlcV9wZXJjX2J5X3JlZ2lvbiA8LSBtYWxheWljX2hhcHB5X2ZyZXEgJT4lIA0KICBncm91cF9ieShyZWdpb24sIGxlbW1hKSAlPiUgDQogIHN1bW1hcmlzZShuID0gc3VtKG4pLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGFycmFuZ2UocmVnaW9uLCBkZXNjKG4pLCBsZW1tYSkgJT4lIA0KICBncm91cF9ieShyZWdpb24pICU+JSANCiAgbXV0YXRlKHBlcmNfbGVtbWFfYnlfcmVnaW9uID0gcm91bmQoKG4gLyBzdW0obikgKiAxMDApLCAyKSkNCmBgYA0KDQpgYGB7ciBzdW1tYXJpc2UtdG9rZW4tb2YtbGVtbWEtYW5kLXBlcmNlbnRhZ2VzLWJ5LWxhbmd1b2lkLW5hbWUsIGV2YWwgPSBGQUxTRX0NCiMgc3VtbWFyaXNlIHRva2VuLWZyZXF1ZW5jeSBhbmQgcGVyY2VudGFnZXMgb2YgdGhlIGxlbW1hIGJ5IGxhbmd1b2lkLW5hbWUNCm1hbGF5aWNfaGFwcHlfbGVtbWFfZnJlcV9wZXJjX2J5X2xhbmd1b2lkIDwtIG1hbGF5aWNfaGFwcHlfZnJlcSAlPiUgDQogIGdyb3VwX2J5KGxhbmd1b2lkX25hbWVfbmV3LCBsZW1tYSkgJT4lIA0KICBzdW1tYXJpc2UobiA9IHN1bShuKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBhcnJhbmdlKGxhbmd1b2lkX25hbWVfbmV3LCBkZXNjKG4pLCBsZW1tYSkgJT4lIA0KICBncm91cF9ieShsYW5ndW9pZF9uYW1lX25ldykgJT4lIA0KICBtdXRhdGUocGVyY19sZW1tYV9ieV9sYW5ndW9pZCA9IHJvdW5kKChuIC8gc3VtKG4pICogMTAwKSwgMikpDQpgYGANCg0KYGBge3Igc3VtbWFyaXNlLXRva2VuLW9mLWxlbW1hLWFuZC1wZXJjZW50YWdlcy1ieS1wcm9qZWN0LW5hbWUsIGV2YWwgPSBGQUxTRX0NCiMgc3VtbWFyaXNlIHRva2VuLWZyZXF1ZW5jeSBhbmQgcGVyY2VudGFnZXMgb2YgdGhlIGxlbW1hIGJ5IHByb2plY3QtbmFtZQ0KbWFsYXlpY19oYXBweV9sZW1tYV9mcmVxX3BlcmNfYnlfcHJvamVjdG5hbWUgPC0gbWFsYXlpY19oYXBweV9mcmVxICU+JSANCiAgZ3JvdXBfYnkocHJvamVjdF9uYW1lLCBsZW1tYSkgJT4lIA0KICBzdW1tYXJpc2UobiA9IHN1bShuKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBhcnJhbmdlKHByb2plY3RfbmFtZSwgZGVzYyhuKSwgbGVtbWEpICU+JSANCiAgZ3JvdXBfYnkocHJvamVjdF9uYW1lKSAlPiUgDQogIG11dGF0ZShwZXJjX2xlbW1hX2J5X3Byb2plY3RuYW1lID0gcm91bmQoKG4gLyBzdW0obikgKiAxMDApLCAyKSkNCmBgYA0KDQpgYGB7ciBzdW1tYXJpc2UtdHlwZS1mcmVxLW9mLWxlbW1hLWJ5LXJlZ2lvbn0NCiMgc3VtbWFyaXNlIHR5cGUtZnJlcXVlbmN5IG9mIHRoZSBsZW1tYSBieSByZWdpb24NCm1hbGF5aWNfaGFwcHlfbGVtbWFfdHlwZWZyZXFfYnlfcmVnaW9uIDwtIG1hbGF5aWNfaGFwcHlfZnJlcSAlPiUgDQogIGdyb3VwX2J5KHJlZ2lvbiwgbGVtbWEpICU+JSANCiAgc3VtbWFyaXNlKG4gPSBzdW0obiksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgYXJyYW5nZShyZWdpb24sIGRlc2MobiksIGxlbW1hKSAlPiUgDQogIGdyb3VwX2J5KHJlZ2lvbikgJT4lIA0KICBzdW1tYXJpc2Uobl90eXBlX2xlbW1hID0gbGVuZ3RoKGxlbW1hKSwgLmdyb3VwcyA9ICJkcm9wIikNCmBgYA0KDQpgYGB7ciBzdW1tYXJpc2UtdHlwZS1mcmVxLW9mLWxlbW1hLWJ5LXByb2plY3QtbmFtZSwgZXZhbCA9IEZBTFNFfQ0KIyBzdW1tYXJpc2UgdHlwZS1mcmVxdWVuY3kgb2YgdGhlIGxlbW1hIGJ5IHByb2plY3RfbmFtZQ0KbWFsYXlpY19oYXBweV9sZW1tYV90eXBlZnJlcV9ieV9wcm9qZWN0bmFtZSA8LSBtYWxheWljX2hhcHB5X2ZyZXEgJT4lIA0KICBncm91cF9ieShwcm9qZWN0X25hbWUsIGxlbW1hKSAlPiUgDQogIHN1bW1hcmlzZShuID0gc3VtKG4pLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGFycmFuZ2UocHJvamVjdF9uYW1lLCBkZXNjKG4pLCBsZW1tYSkgJT4lIA0KICBncm91cF9ieShwcm9qZWN0X25hbWUpICU+JSANCiAgc3VtbWFyaXNlKG5fdHlwZV9sZW1tYSA9IGxlbmd0aChsZW1tYSksIC5ncm91cHMgPSAiZHJvcCIpDQpgYGANCg0KYGBge3Igc3VtbWFyaXNlLXRvdGFsLXRva2VuLWFuZC10eXBlLW9mLWhhcHBpbmVzcy1sZW1tYS1ieS1yZWdpb24sIGV2YWwgPSBGQUxTRX0NCiMgc3VtbWFyaXNlIHR5cGUtZnJlcXVlbmN5IGFuZCB0b3RhbCB0b2tlbnMgb2YgdGhlIGxlbW1hIGJ5IHJlZ2lvbg0KbWFsYXlpY19oYXBweV90eXBlX2FuZF90b2tlbl9ieV9yZWdpb24gPC0gbWFsYXlpY19oYXBweV9mcmVxICU+JSANCiAgZ3JvdXBfYnkocmVnaW9uKSAlPiUgDQogIHN1bW1hcmlzZShzdW1fdG9rZW5fbGVtbWEgPSBzdW0obiksIA0KICAgICAgICAgICAgdHlwZWZyZXFfbGVtbWEgPSBuX2Rpc3RpbmN0KGxlbW1hKSwNCiAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgbXV0YXRlKHR0ciA9IHR5cGVmcmVxX2xlbW1hL3N1bV90b2tlbl9sZW1tYSkNCmBgYA0KDQpgYGB7ciBzdW1tYXJpc2UtdG90YWwtdG9rZW4tYW5kLXR5cGUtb2YtaGFwcGluZXNzLWxlbW1hLWJ5LWxhbmd1b2lkLCBldmFsID0gRkFMU0V9DQojIHN1bW1hcmlzZSB0eXBlLWZyZXF1ZW5jeSBhbmQgdG90YWwgdG9rZW5zIG9mIHRoZSBsZW1tYSBieSBsYW5ndW9pZA0KbWFsYXlpY19oYXBweV90eXBlX2FuZF90b2tlbl9ieV9sYW5ndW9pZCA8LSBtYWxheWljX2hhcHB5X2ZyZXEgJT4lIA0KICBncm91cF9ieShsYW5ndW9pZF9uYW1lX25ldykgJT4lIA0KICBzdW1tYXJpc2Uoc3VtX3Rva2VuX2xlbW1hID0gc3VtKG4pLCANCiAgICAgICAgICAgIHR5cGVmcmVxX2xlbW1hID0gbl9kaXN0aW5jdChsZW1tYSksDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIG11dGF0ZSh0dHIgPSB0eXBlZnJlcV9sZW1tYS9zdW1fdG9rZW5fbGVtbWEpDQpgYGANCg0KYGBge3Igc3VtbWFyaXNlLXRvdGFsLXRva2VuLWFuZC10eXBlLW9mLWhhcHBpbmVzcy1sZW1tYS1ieS1wcm9qZWN0LW5hbWUsIGV2YWwgPSBGQUxTRX0NCiMgc3VtbWFyaXNlIHR5cGUtZnJlcXVlbmN5IGFuZCB0b3RhbCB0b2tlbnMgb2YgdGhlIGxlbW1hIGJ5IHByb2plY3QtbmFtZQ0KbWFsYXlpY19oYXBweV90eXBlX2FuZF90b2tlbl9ieV9wcm9qZWN0bmFtZSA8LSBtYWxheWljX2hhcHB5X2ZyZXEgJT4lIA0KICBncm91cF9ieShwcm9qZWN0X25hbWUpICU+JSANCiAgc3VtbWFyaXNlKHN1bV90b2tlbl9sZW1tYSA9IHN1bShuKSwgDQogICAgICAgICAgICB0eXBlZnJlcV9sZW1tYSA9IG5fZGlzdGluY3QobGVtbWEpLA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBtdXRhdGUodHRyID0gdHlwZWZyZXFfbGVtbWEvc3VtX3Rva2VuX2xlbW1hKQ0KYGBgDQoNCmBgYHtyIHRvcC1maXZlLWhhcHBpbmVzcy1sZW1tYX0NCm1hbGF5aWNfaGFwcHlfbGVtbWFfdG9wZml2ZSA8LSBtYWxheWljX2hhcHB5X2ZyZXFfbGVtbWEgJT4lIA0KICBzbGljZV9tYXgob3JkZXJfYnkgPSBwZXJjX2xlbW1hLCBuID0gNSkNCmBgYA0KDQpgYGB7ciBkaXN0cmlidXRpb24tb2Ytc2VuYW5nLWluLXJlZ2lvbn0NCnNlbmFuZ19hY3Jvc3NfcmVnaW9uIDwtIGZpbHRlcihtYWxheWljX2hhcHB5X2xlbW1hX2ZyZXFfcGVyY19ieV9yZWdpb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9PSBtYXgobiksIGxlbW1hID09ICJTRU5BTkciKQ0KYGBgDQoNCmBgYHtyIHJlZ2lvbi13aXRoLWFib3ZlLWF2ZXJhZ2UtdHlwZS1mcmVxfQ0KcmVnaW9uX3dpdGhfYWJvdmVfYXZlcmFnZV90eXBlZnJlcSA8LSBmaWx0ZXIobWFsYXlpY19oYXBweV9sZW1tYV90eXBlZnJlcV9ieV9yZWdpb24sIG5fdHlwZV9sZW1tYSA+IG1lYW4obWFsYXlpY19oYXBweV9sZW1tYV90eXBlZnJlcV9ieV9yZWdpb24kbl90eXBlX2xlbW1hKSkgJT4lIA0KICBhcnJhbmdlKGRlc2Mobl90eXBlX2xlbW1hKSkNCmBgYA0KDQpgYGB7ciBnZXQtaW5kb25lc2lhLXJlZ2lvbi1kYXRhfQ0KIyBnZXQgdGhlIGluZG9uZXNpYSByZWdpb24NCmluZG9tYXAgPC0gbWFwX2RhdGEoIndvcmxkMiIsIHJlZ2lvbiA9ICJJbmRvbmVzaWEiKSAlPiUgDQogIGFzX3RpYmJsZSgpDQoNCmBgYA0KDQoNClRoaXMgcGFwZXIgZXhwbG9yZXMgdGhlIGxleGljYWxpc2F0aW9uIG9mIEhBUFBJTkVTUyBpbiB0aGUgTWFsYXlpYyB2YXJpZXRpZXMgc3Bva2VuIGluIHRoZSBJbmRvbmVzaWFuIGFyY2hpcGVsYWdvLiBXZSBzcGVjaWZpY2FsbHkgaW52ZXN0aWdhdGUgKGkpIHRoZSBpbnZlbnRvcnkgb2YgbGV4aWNhbCBmb3JtcywgYW5kIHRoZSBjb25jZXB0dWFsIGNhdGVnb3JpZXMgdGhleSBlbmNvZGUsIHRoYXQgcmVmZXIgdG8gdGhlIGdlbmVyaWMgY29uY2VwdCBvZiBIQVBQSU5FU1MgaW4gRW5nbGlzaCwgYW5kIChpaSkgaG93IHRoZXkgdmFyeSBhbG9uZyB0aGUgcXVhbnRpdGF0aXZlIGFuZCBzb2Npb2xpbmd1aXN0aWMgZGltZW5zaW9ucywgcGFydGljdWxhcmx5IHRoZSByZWdpb25hbCB2YXJpYXRpb24uIE91ciBzdHVkeSByZXZlYWxzIHRoYXQgSEFQUElORVNTIGlzIHN0cm9uZ2x5IGxleGljYWxpc2VkIGJ5IGZvcm1zIHJlZmVycmluZyB0byBTRU5BTkcgb3ZlcmFsbC4gSW4gYWRkaXRpb24gdG8gdGhpcyBnZW5lcmFsIHRyZW5kLCB3ZSBhbHNvIGRlbW9uc3RyYXRlZCB0aGF0IHRoZSBsZXhpY2FsaXNhdGlvbiBvZiBIQVBQSU5FU1MgY29uY2VwdCBjYW4gdmFyeSwgYm90aCBxdWFsaXRhdGl2ZWx5IGFuZCBxdWFudGl0YXRpdmVseSwgYWNyb3NzIHRoZSByZWdpb24gYXQgYSBtb3JlIGdlbmVyaWMsIGNvbmNlcHQgbGV2ZWwsIGFuZCBhIG1vcmUgc3BlY2lmaWMgbGV2ZWwgb2YgbW9ycGggdHlwZXMuDQoNCioqS2V5d29yZHMqKjogSEFQUElORVNTOyBsZXhpY2FsaXNhdGlvbjsgY29sbG9xdWlhbCBNYWxheWljIHZhcmlldGllczsgY29ycHVzIGxpbmd1aXN0aWNzOyBNUEkgRVZBIEpGUw0KDQojIEhvdyB0byBjaXRlIHstfQ0KDQo+IFJhamVnLCBHZWRlIFByaW1haGFkaSBXaWpheWEgJiBJIE1hZGUgUmFqZWcuIDIwMjEuIFRoZSBsZXhpY2FsaXNhdGlvbiBvZiBIQVBQSU5FU1MgaW4gdGhlIE1hbGF5aWMgdmFyaWV0aWVzIG9mIEluZG9uZXNpYS4gKkludGVybmF0aW9uYWwgU2VtaW5hciBvbiBBdXN0cm9uZXNpYW4gTGFuZ3VhZ2VzIGFuZCBMaXRlcmF0dXJlKiA5KDEpLiA0NOKAkzUxLiBodHRwczovL29qcy51bnVkLmFjLmlkL2luZGV4LnBocC9pc2FsbC9hcnRpY2xlL3ZpZXcvNzk4NTYNCg0KPiBSYWplZywgR2VkZSBQcmltYWhhZGkgV2lqYXlhOyBSYWplZywgSSBNYWRlICgyMDIxKTogU3VwcGxlbWVudGFyeSBtYXRlcmlhbHMgZm9yICpUaGUgbGV4aWNhbGlzYXRpb24gb2YgSEFQUElORVNTIGluIHRoZSBNYWxheWljIHZhcmlldGllcyBvZiBJbmRvbmVzaWEqLiBmaWdzaGFyZS4gT25saW5lIHJlc291cmNlLiBodHRwczovL2RvaS5vcmcvMTAuNjA4NC9tOS5maWdzaGFyZS4xNTEyNDcxMw0KDQojIEludHJvZHVjdGlvbg0KDQojIyBPbiB0aGUgbm90aW9ucyBvZiBMZXhpY29uIGFuZCBMZXhpY2FsaXNhdGlvbg0KDQpPbmUgdGhpbmcgdGhhdCBtYXkgY29tZSB1cCBpbiBvdXIgbWluZCB3aGVuIGhlYXJpbmcgdGhlIG5vdGlvbiAqKmxleGljb24qKiBpcyBhIChzZXQgb2YpIHdvcmQocykgYW5kIHRoZSBtZWFuaW5nLCBvciAiaW5mb3JtYXRpb24gY29udGVudCIgW0BqZXpla19sZXhpY29uXzIwMTYsIDVdLCBpdHMgZXhwcmVzc2VzLiBUaGlzIGlkZWEgb2YgdGhlIGxleGljb24sIHdoaWNoIG1heSBiZSBzZWVuIGFzIGFuIG92ZXJzaW1wbGlmaWNhdGlvbiwgcmV2ZWFscyB0d28gZGltZW5zaW9ucyB0aGF0IGNvbnN0aXR1dGUgYSBiYXNpYyBjb25zaWRlcmF0aW9uIGluIGFueSBzZW1pb3RpYyBzeXN0ZW0gc3VjaCBhcyBsYW5ndWFnZSwgbmFtZWx5ICoqZm9ybSoqIChlLmcuLCBsZXhpY2FsIGZvcm0sIHN1Y2ggYXMgKmVhcnRoKikgYW5kICoqY29udGVudCoqIChpLmUuLCBtZWFuaW5nIGV2b2tlZCBieSBvciBhc3NvY2lhdGVkIHdpdGggdGhlIGZvcm0sIHN1Y2ggYXMgJ3BsYW5ldCBpbiB0aGUgc29sYXIgc3lzdGVtJywgJ3N1YnN0YW5jZSBvbiB0aGUgbGFuZCBzdXJmYWNlJywgZXRjLiBhc3NvY2lhdGVkIHdpdGggdGhlIGZvcm0gKmVhcnRoKikgW0BqZXpla19sZXhpY29uXzIwMTYsIDVdLiBNZWFuaW5nLCB3aGVuIG5vdCB5ZXQgYXNzb2NpYXRlZCB3aXRoIGEgbGV4aWNhbCBmb3JtLCBpcyBnZW5lcmljYWxseSBjb25jZWl2ZWQgb2YgYXMgYSAqKmNvbmNlcHQqKjogIm1lbnRhbCBjYXRlZ29yaWVzIGNhcnJ5aW5nIHNvbWUgaW5mb3JtYXRpb24gY29udGVudCwgd2hpY2ggY2FuIGJlIHNhaWQgdG8gZXhpc3QgaW5kZXBlbmRlbnRseSBmcm9tIGxhbmd1YWdlIiBbQGplemVrX2xleGljb25fMjAxNiwgNV0uIA0KDQpXaXRoIHJlc3BlY3QgdG8gdGhlIGFmb3JlbWVudGlvbmVkIHZpZXcsIHRoZSBub3Rpb24gKipsZXhpY2FsaXNhdGlvbioqIGF0dGVtcHRzIHRvIGNhcHR1cmUgdGhlIHdheSBpbiB3aGljaCBjb25jZXB0IGlzIGRpcmVjdGx5IGxpbmtlZCB3aXRoIGEgbGV4aWNhbCBmb3JtIG9yIHdvcmQgaW4gYSBsYW5ndWFnZS4gSW4gZmFjdCwgbGV4aWNhbGlzYXRpb24gcmVjZWl2ZXMgZGlmZmVyZW50IGludGVycHJldGF0aW9uIFtzZWUgQGplemVrX2xleGljb25fMjAxNiwgNS0xMywgZm9yIGFuIG92ZXJ2aWV3XSBmcm9tIGRpZmZlcmVudCBhcmVhcyBvZiB0aGUgbGluZ3Vpc3RpY3Mgc3ViLWZpZWxkcywgc3VjaCBhcyBtb3JwaG9sb2d5IFtzZWUgQGhpbHBlcnRfbGV4aWNhbGl6YXRpb25fMjAxOV0gYW5kIGxhbmd1YWdlIGNoYW5nZSBbQGJyaW50b25fbGV4aWNhbGl6YXRpb25fMjAwNV0uIFdvcmQtZm9ybWF0aW9uIHByb2Nlc3NlcyBhcmUgYXQgdGhlIGhlYXJ0IG9mIGxleGljYWxpc2F0aW9uIGlmIHdlIHZpZXcgaXQgYXMgInRoZSBwcm9jZXNzIGJ5IHdoaWNoIG5ldyBpdGVtcyB0aGF0IGFyZSBjb25zaWRlcmVkICdsZXhpY2FsJyAoaW4gdGVybXMgb2YgdGhlIHRoZW9yeSBpbiBxdWVzdGlvbikgY29tZSBpbnRvIGJlaW5nIiBbQGJyaW50b25fbGV4aWNhbGl6YXRpb25fMjAwNSwgMzJdLCBhZGRpbmcgbmV3IG9wZW4tY2xhc3MgbGV4aWNhbCBpdGVtcyBpbnRvIHRoZSBsZXhpY29uIFtAaGlscGVydF9sZXhpY2FsaXphdGlvbl8yMDE5XS4NCg0KSW4gdGhpcyBwYXBlciwgd2UgYWRvcHQgdGhlIGRlZmluaXRpb24gb2YgbGV4aWNhbGlzYXRpb24gYXMgdGhlIGxleGljYWwgZW5jb2Rpbmcgb3IgZXhwcmVzc2lvbnMgb2YgY29uY2VwdCBvciBjb25jZXB0dWFsIGNhdGVnb3JpZXMgW0BicmludG9uX2xleGljYWxpemF0aW9uXzIwMDUsIDE4XSwgc3VjaCBhcyB0aGUgbGV4aWNhbGlzYXRpb24gb2YgdGhlIGNvbmNlcHQgJ2ZhdGhlcidzIG9yIG1vdGhlcidzIHNpc3RlcicgYnkgdGhlIEVuZ2xpc2ggd29yZCAqYXVudCogW0BqZXpla19sZXhpY29uXzIwMTYsIDZdLiBUaGlzIGlzIGEgc3luY2hyb25pYyB2aWV3IG9mIGxleGljYWxpc2F0aW9uIFtAYnJpbnRvbl9sZXhpY2FsaXphdGlvbl8yMDA1LCAxOF0sIGFuZCBtYXkgYmUgcmVsYXRlZCB3aXRoIHRoZSBzdGF0aWMgaW50ZXJwcmV0YXRpb24gb2YgbGV4aWNhbGlzYXRpb24gYXMgYSBwcm9kdWN0L291dGNvbWUsIHRoYXQgaXMsIHRoZSBsZXhpY2FsIGludmVudG9yeSB0byBleHByZXNzIGNlcnRhaW4gY29uY2VwdCBbQGplemVrX2xleGljb25fMjAxNiwgN10uIEZvciBpbnN0YW5jZSwgKmxpYmVydHkqIGFuZCAqZnJlZWRvbSogY2FuIGJlIHZpZXdlZCBhcyB0d28gbGV4aWNhbGlzYXRpb25zIG9mICJiZWluZyBhYmxlIG9yIGFsbG93ZWQgdG8gZG8gd2hhdCBvbmUgd2FudHMgdG8gZG8iIFtAamV6ZWtfbGV4aWNvbl8yMDE2LCA3XS4NCg0KIyMgQWltIG9mIHRoZSBTdHVkeQ0KDQpUaGlzIHBhcGVyIHByb3ZpZGVzIGFuIGFjY291bnQgb2YgdGhlIGxleGljYWxpc2F0aW9uIG9mIEhBUFBJTkVTUyBpbiB0aGUgY29sbG9xdWlhbCBNYWxheWljIHZhcmlldGllcyBvZiBJbmRvbmVzaWEuIFRoZSBtYWluIGFpbSBpcyB0byBpbnZlc3RpZ2F0ZSAoaSkgdGhlIGludmVudG9yeSBvZiBsZXhpY2FsIGZvcm1zLCBhbmQgdGhlaXIgY29uY2VwdHVhbCBjYXRlZ29yaWVzLCB0aGF0IHJlZmVyIHRvIHRoZSBnZW5lcmljIGNvbmNlcHQgb2YgSEFQUElORVNTIGluIEVuZ2xpc2gsIGFuZCAoaWkpIGhvdyB0aGV5IHZhcnkgYWxvbmcgdGhlIHF1YW50aXRhdGl2ZSBhbmQgc29jaW9saW5ndWlzdGljIGRpbWVuc2lvbnMsIHBhcnRpY3VsYXJseSBhbG9uZyB0aGUgcmVnaW9uYWwgdmFyaWF0aW9uIFtjZi4gQGtyaXN0aWFuc2VuX21ldGhvZG9sb2d5XzIwMDYsIDMwXS4gT3VyIHN0dWR5IGNvbnRyaWJ1dGVzIGRpZmZlcmVudCBkaW1lbnNpb25zIGFuZCBuZXcgY29ycHVzIGRhdGEgdG8gcHJldmlvdXMgcXVhbnRpdGF0aXZlIGNvcnB1cy1saW5ndWlzdGljIHN0dWRpZXMgdGhhdCBoYXZlIGludmVzdGlnYXRlZCBIQVBQSU5FU1MgbmVhci1zeW5vbnltcyBpbiAobW9zdGx5IHdyaXR0ZW4gU3RhbmRhcmQpIEluZG9uZXNpYW4sIGVzcGVjaWFsbHkgaW4gdGVybXMgb2YgaW50ZXJuYWwtdmFyaWF0aW9uIGluIHRoZWlyIG1ldGFwaG9yaWNhbCB1c2FnZXMgW0ByYWplZ19tZXRhcGhvcmljYWxfMjAxOV0gYW5kIGNvbGxvY2F0aW9uYWwgcGF0dGVybnMgW0ByYWplZ19saW5ndWlzdGlrXzIwMjBdLg0KDQpJbmhlcmVudCBpbiB0aGlzIHN0dWR5IGlzIHRoZSBub3Rpb24gb2YgKipvbm9tYXNpb2xvZ3kqKiwgd2hpY2ggInRha2VzIGl0cyBzdGFydGluZyBwb2ludCBpbiBhIGNvbmNlcHQgb3IgcmVmZXJlbnQgYW5kIGludmVzdGlnYXRlcyBieSB3aGljaCBkaWZmZXJlbnQgZXhwcmVzc2lvbnMgdGhlIGNvbmNlcHQgb3IgcmVmZXJlbnQgY2FuIGJlIGRlc2lnbmF0ZWQsIG9yIG5hbWVkIiBbQGdyb25kZWxhZXJzX2xleGljYWxfMjAwNywgOTg5XS4gT3VyIHN0dWR5IGFsc28gcmVwcmVzZW50cyBhIGZhY2V0IG9mIHRoZSBicm9hZGVyIGFyZWEgb2YgdXNhZ2UtYmFzZWQsIChzb2NpbylsZXhpY29sb2d5IFtjZi4gQGdyb25kZWxhZXJzX2xleGljYWxfMjAwN10gdGhhdCBhZG9wdHMgcXVhbnRpdGF0aXZlLCBjb3JwdXMtYmFzZWQgYXBwcm9hY2ggYW5kIGluY29ycG9yYXRlcyAibGVjdGFsIiB2YXJpYXRpb24gW0BrcmlzdGlhbnNlbl9tZXRob2RvbG9neV8yMDA2LCAzMF0uIFRvIHB1cnN1ZSBvdXIgYWltLCB3ZSB1c2UgbGFyZ2UgY29sbGVjdGlvbiBvZiBjb2xsb3F1aWFsIE1hbGF5L0luZG9uZXNpYW4gY29ycG9yYSAoY2YuIHRoZSBuZXh0IHNlY3Rpb24pLCBpbiBhbiBhdHRlbXB0IHRvIGhpZ2hsaWdodCBpdHMgcG90ZW50aWFsIGZvciB0aGUgc3R1ZHkgb2YgbGFuZ3VhZ2UgdmFyaWF0aW9uIGluIHRoZSBhcmNoaXBlbGFnbywgZ2l2ZW4gdGhlIGxhcmdlIGJvZHkgb2YgbGluZ3Vpc3RpYyBhbmQgbm9uLWxpbmd1aXN0aWMgZGF0YSBhdmFpbGFibGUgaW4gdGhlIGNvcnBvcmEuIFdpdGggdGhlIGhlbHAgb2YgY29tcHV0YXRpb25hbCBkYXRhLXNjaWVuY2UgdG9vbCwgd2Ugc2hvdyBob3cgZGVzY3JpcHRpdmUgc3RhdGlzdGljYWwgaW5mb3JtYXRpb24gYW5kIGdlbyBtYXBwaW5nIGRhdGEgY2FuIGZlZWQgaW50byBnZW9zcGF0aWFsIG1hcCBmb3IgdGhlIHZhcmlhdGlvbiBvZiB0aGUgbGV4aWNhbGlzYXRpb25zLg0KDQojIE1ldGhvZA0KDQpTaW5jZSAyMDE1LCB0aGUgY29sbG9xdWlhbCBNYWxheS9JbmRvbmVzaWFuIGNvcnBvcmEgaGF2ZSBiZWVuIG1hZGUgcHVibGljIGJ5IHRoZSBNYXggUGxhbmNrIEluc3RpdHV0ZSBmb3IgRXZvbHV0aW9uYXJ5IEFudGhyb3BvbG9neSAoTVBJIEVWQSkgSmFrYXJ0YSBGaWVsZCBTdGF0aW9uIChKRlMpIFtAZ2lsX2RhdGFfMjAxNV0uIE1QSSBFVkEgSkZTIGVuZ2FnZWQgaW4gYSB2YXJpZXR5IG9mIHByb2plY3RzIHRoYXQgaW52b2x2ZSBkb2N1bWVudGF0aW9uLCBkZXNjcmlwdGlvbiwgYW5kIGFuYWx5c2VzIG9mIHRoZSBsYW5ndWFnZXMgb2YgSW5kb25lc2lhLiBUaGUgYWR1bHQgbGFuZ3VhZ2UgcHJvamVjdHMgZm9jdXNlZCBvbiB2YXJpZXRpZXMgb2YgTWFsYXlpYyBsYW5ndWFnZXMsIHJhbmdpbmcgZnJvbSBTdW1hdHJhLCBXZXN0IEthbGltYW50YW4sIEpha2FydGEgYW5kIHRoZSBuZWlnaGJvdXJpbmcgYXJlYSAoZS5nLiwgV2VzdCBKYXZhKSwgYW5kIHRoZSBFYXN0ZXJuIHZhcmlldGllcyBvZiBNYWxheSAoaS5lLiwgS3VwYW5nIE1hbGF5LCBUZXJuYXRlIE1hbGF5LCBhbmQgUGFwdWFuIE1hbGF5KS4gVGhlIGNvbXBsZXRlIGNvcnBvcmEgYWxzbyBpbmNsdWRlIHRoZSBjaGlsZC1sYW5ndWFnZSBhY3F1aXNpdGlvbiBwcm9qZWN0IChvZiBKYWthcnRhIEluZG9uZXNpYW4pIGJ1dCBpdCBpcyBub3QgdGhlIGZvY3VzIG9mIHRoaXMgc3R1ZHkuIFRoZSBjb3Jwb3JhIGFyZSBkb3dubG9hZGFibGUgYXMgYSBzZXQgb2YgdGFidWxhciBmaWxlcyB3aXRoIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMgKGAuY3N2YCkgZm9ybWF0LiBUaGUgZmlsZXMgYXJlIGNvbXByaXNlZCBvZiAoaSkgbWV0YWRhdGEgaW5mb3JtYXRpb24sIHN1Y2ggYXMgbGFuZ3VhZ2UgbmFtZSwgcHJvamVjdCBuYW1lLCByZWdpb24sIHdvcmQgY291bnRzLCBpbnRlciBhbGlhLCBhbmQgKGlpKSBsaW5ndWlzdGljLXByb3BlciBkYXRhYmFzZSwgc3VjaCBhcyB0aGUgdGV4dCBjb3JwdXMsIHRva2VuaXNlZCB3b3JkcywgbW9ycGhzXltBY2NvcmRpbmcgdG8gVHJhc2sgWy1AdHJhc2tfc3R1ZGVudHNfMTk5NywgMTQ0XSwgYSAqKm1vcnBoKiogaXMgIlthXW55IHBpZWNlIG9mIG1vcnBob2xvZ2ljYWwgbWF0ZXJpYWwgd2hpY2ggeW91IHdhbnQgdG8gdGFsayBhYm91dCwgd2l0aG91dCBjb21taXR0aW5nIHlvdXJzZWxmIHRvIGFueSB2aWV3IG9mIGl0cyBtb3JwaG9sb2dpY2FsIHN0YXR1cyIuXSwgd29yZCBsaXN0cywgYW5kIG1vcmUuIFRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgZmlsZXMgYXJlIGluZGljYXRlZCBieSB0aGUgKiprZXkqKiBjb2x1bW4taWQgKHNlZSBGaWd1cmUgW1xAcmVmKGZpZzptcGktY29ycHVzLXJlbGF0aW9uc2hpcCldKCNtcGktY29ycHVzLXJlbGF0aW9uc2hpcCkpLiBUaGVzZSBpbnRlcmxvY2tpbmcga2V5cyB0aGVuIGFsbG93IHVzIHRvIG1lcmdlIHByb2dyYW1tYXRpY2FsbHkgb25lIG9yIG1vcmUgZmlsZXMgYW5kLCBldmVudHVhbGx5LCBidWlsZCB1cCB0aGUgd2hvbGUgY29sbGVjdGlvbiBvZiB0aGUgY29ycG9yYSBpbnRvIHRhYnVsYXIgZGF0YWJhc2UgKHNlZSBUYWJsZSBbXEByZWYodGFiOmNvcnBvcmEtc3Vic2V0LXRhYmxlKV0oI2NvcnBvcmEtc3Vic2V0LXRhYmxlKSkuDQoNCmBgYHtyIGNvcnBvcmEtc3Vic2V0LXRhYmxlLCBpbmNsdWRlID0gVFJVRX0NCm1hbGF5aWNfaGFwcHkgJT4lIA0KICBhcy5kYXRhLmZyYW1lKCkgJT4lIA0KICBzZWxlY3QobW9ycGhzX3RleHQsIGdsb3NzX3RleHQsIGxhbmd1b2lkX25hbWVfbmV3LCByZWdpb24pICU+JSANCiAgbXV0YXRlKG5fd29yZF9wZXJfdGV4dCA9IHN0cl9jb3VudChtb3JwaHNfdGV4dCwgIlxcYlteIC4hJz8sXStcXGIiKSkgJT4lIA0KICBmaWx0ZXIobl93b3JkX3Blcl90ZXh0ID4gMSwgbl93b3JkX3Blcl90ZXh0IDwgNSwgc3RyX2RldGVjdChnbG9zc190ZXh0LCAiWzouXVtBLVpdIiwgbmVnYXRlID0gVFJVRSkpICU+JSANCiAgc2VsZWN0KC1uX3dvcmRfcGVyX3RleHQpICU+JSANCiAgcmVuYW1lKGBMYW5ndW9pZCBuYW1lYCA9IGxhbmd1b2lkX25hbWVfbmV3LA0KICAgICAgICAgUmVnaW9uID0gcmVnaW9uLA0KICAgICAgICAgYE1vcnBocyB0ZXh0YCA9IG1vcnBoc190ZXh0LA0KICAgICAgICAgYEdsb3NzYCA9IGdsb3NzX3RleHQpICU+JSANCiAgZ3JvdXBfYnkoYExhbmd1b2lkIG5hbWVgKSAlPiUgDQogIHNsaWNlX3NhbXBsZShuID0gMSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzbGljZV9zYW1wbGUobiA9IDMpICU+JSANCiAga25pdHI6OmthYmxlKGNhcHRpb24gPSAiU25pcHBldCBvZiB0aGUgY29ycG9yYSB3aXRoIHNlbGVjdGVkIHZhcmlhYmxlcy9jb2x1bW5zIikNCmBgYA0KDQpgYGB7ciB0eXBlcy1vZi10aGUtY29ycG9yYX0NCiMjIGdlbnJlID09PT09DQpnZW5yZV9jb3VudCA8LSBub25fYWNxdWlzaXRpb25fbWFsYXlpY19zZXNzaW9uc19kYXRhc2V0X3Byb2plY3RfbWluaSAlPiUgDQogIGNvdW50KGdlbnJlLCBzb3J0ID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoZ2VucmVfYWJzID0gTkEsIA0KICAgICAgICAgZ2VucmVfYWJzID0gaWZfZWxzZShzdHJfZGV0ZWN0KGdlbnJlLCAiXm5hcnJhdGl2ZSggWyhdKT8iKSwgIm5hcnJhdGl2ZSIsICJjb252ZXJzYXRpb24iKSwgDQogICAgICAgICBnZW5yZV9hYnMgPSBpZl9lbHNlKHN0cl9kZXRlY3QoZ2VucmUsICJ3b3JkIGxpc3QiKSwgIndvcmQgbGlzdCIsIGdlbnJlX2FicyksIA0KICAgICAgICAgZ2VucmVfYWJzID0gaWZfZWxzZShzdHJfZGV0ZWN0KGdlbnJlLCAiY2VsZWJyYXRpb258YW5kIGNvbnZlcnNhdGlvbnxzb25nIiksICJvdGhlcnMiLCBnZW5yZV9hYnMpKQ0KZ2VucmVfY291bnRfc3VtIDwtIGdlbnJlX2NvdW50ICU+JSANCiAgc2VsZWN0KGdlbnJlID0gZ2VucmVfYWJzLCBuKSAlPiUgDQogIGdyb3VwX2J5KGdlbnJlKSAlPiUgDQogIHN1bW1hcmlzZShuID0gc3VtKG4pLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhuKSkgJT4lIA0KICBtdXRhdGUocGVyYyA9IHJvdW5kKChuIC8gc3VtKG4pKSAqIDEwMCwgZGlnaXRzID0gMikpDQoNCiMjIG5hdHVyYWxuZXNzID09PT09DQpuYXR1cmFsbmVzcyA8LSBub25fYWNxdWlzaXRpb25fbWFsYXlpY19zZXNzaW9uc19kYXRhc2V0X3Byb2plY3RfbWluaSAlPiUgDQogIGNvdW50KGVsaWNpdGVkX29yX25hdHVyYWwsIHNvcnQgPSBUUlVFKSAlPiUgDQogIG11dGF0ZShwZXJjID0gcm91bmQoKG4gLyBzdW0obikpICogMTAwLCAyKSkgJT4lIA0KICByZW5hbWUobmF0dXJhbG5lc3MgPSBlbGljaXRlZF9vcl9uYXR1cmFsKQ0KDQojIyBtb2RlID09PT09DQptb2RlX3R5cGUgPC0gbm9uX2FjcXVpc2l0aW9uX21hbGF5aWNfc2Vzc2lvbnNfZGF0YXNldF9wcm9qZWN0X21pbmkgJT4lIA0KICBjb3VudChtb2RlLCBzb3J0ID0gVFJVRSkgJT4lIA0KICBtdXRhdGUocGVyYyA9IHJvdW5kKChuIC8gc3VtKG4pKSAqIDEwMCwgMikpDQpgYGANCg0KDQpUaGUgTWFsYXlpYy1yZWxhdGVkIGNvcnBvcmEgYXJlIGV4dHJhY3RlZCBieSBmaWx0ZXJpbmcgdGhlIGRhdGFiYXNlIHdob3NlIEpGUyBsYW5ndW9pZC1jb2RlcyBiZWdpbiB3aXRoICJNIiwgd2hpY2ggc3RhbmRzIGZvciB0aGUgTWFsYXlpYyBmYW1pbHksIG9yIHdob3NlIGxhbmd1b2lkIG5hbWUgaW5jbHVkZXMgdGhlIHdvcmQgIk1hbGF5Ii4gSW4gdG90YWwsIHRoZSBNYWxheWljLXJlbGF0ZWQgZGF0YWJhc2UgYW1vdW50cyB0byBgciBmb3JtYXQobm9uX2FjcXVpc2l0aW9uX21hbGF5aWNfd29yZF9jb3VudCwgYmlnLm1hcmsgPSAiLCIpYCB3b3JkLXRva2VucyBhY3Jvc3MgYHIgZm9ybWF0KG5yb3coZGlzdGluY3Qoc2VsZWN0KG5vbl9hY3F1aXNpdGlvbl9tYWxheWljX3Nlc3Npb25zX2RhdGFzZXRfcHJvamVjdF9taW5pLCBzZXNzaW9uX2lkKSkpLCBiaWcubWFyayA9ICIsIilgIHNlc3Npb25zLiBOb3cgbGV0IHVzIGRpdmUgaW50byBzb21lIGRldGFpbHMgYWJvdXQgdGhlIG5hdHVyZSBvZiB0aGUgdGV4dHMgaW4gdGhlIGNvcnBvcmEgKHN1Y2ggYXMgdGhlaXIgbW9kZSwgZ2VucmVzLCBhbmQgbmF0dXJhbG5lc3Mgb2YgdGhlIHByb2R1Y3Rpb24pLiBUaGUgcHJlZG9taW5hbnQgbW9kZSBvZiBwcm9kdWN0aW9uIG9mIHRoZSB0ZXh0IGluIHRoZSBzZXNzaW9ucyBpcyB2aWEgYHIgcHVsbChmaWx0ZXIobW9kZV90eXBlLCBwZXJjID09IG1heChwZXJjKSksIG1vZGUpYCBsYW5ndWFnZSAoYHIgcHVsbChmaWx0ZXIobW9kZV90eXBlLCBwZXJjID09IG1heChwZXJjKSksIHBlcmMpYCU7IE49YHIgZm9ybWF0KHB1bGwoZmlsdGVyKG1vZGVfdHlwZSwgcGVyYyA9PSBtYXgocGVyYykpLCBuKSwgYmlnLm1hcmsgPSAiLCIpYCk7IHdyaXR0ZW4gdGV4dHMgb25seSBjb25zdGl0dXRlIGByIHB1bGwoZmlsdGVyKG1vZGVfdHlwZSwgbW9kZSA9PSAid3JpdHRlbiIpLCBwZXJjKWAlIG9mIGFsbCBzZXNzaW9ucyBhbmQgdGhlIHJlbWFpbmluZyBiaXQgKGByIHB1bGwoZmlsdGVyKG1vZGVfdHlwZSwgaXMubmEobW9kZSkpLCBwZXJjKWAlKSBpcyBub3QgY2xhc3NpZmllZCAoYE5BYCkuIFRoZSBoaWdoZXN0IHByb3BvcnRpb24gKGkuZS4sIGByIHB1bGwoZmlsdGVyKG5hdHVyYWxuZXNzLCBwZXJjID09IG1heChwZXJjKSksIHBlcmMpYCU7IE49YHIgZm9ybWF0KHB1bGwoZmlsdGVyKG5hdHVyYWxuZXNzLCBwZXJjID09IG1heChwZXJjKSksIG4pLCBiaWcubWFyayA9ICIsIilgKSBvZiBhbGwgdGhlc2Ugc2Vzc2lvbnMgaXMgY29tcHJpc2VkIG9mIG5hdHVyYWxseSBvY2N1cnJpbmcgdGV4dHM7IG9ubHkgYHIgcHVsbChmaWx0ZXIobmF0dXJhbG5lc3MsIHBlcmMgPT0gbWluKHBlcmMpKSwgcGVyYylgJSAoTj1gciBwdWxsKGZpbHRlcihuYXR1cmFsbmVzcywgcGVyYyA9PSBtaW4ocGVyYykpLCBuKWApIG9mIHRoZSBzZXNzaW9ucyBhcmUgZWxpY2l0ZWQgdGV4dHMgYW5kIHRoZSByZW1haW5pbmcgYHIgcHVsbChmaWx0ZXIoZmlsdGVyKG5hdHVyYWxuZXNzLCBwZXJjICE9IG1pbihwZXJjKSksIHBlcmMgPT0gbWluKHBlcmMpKSwgcGVyYylgJSBhcmUgbm90IGNsYXNzaWZpZWQgKGkuZS4sIGBOQWApLiBJbiB0ZXJtcyBvZiB0aGUgZ2VucmUgb2YgdGhlIGNvcnBvcmEsIHRoZSBsaW9uJ3Mgc2hhcmUgKGByIHB1bGwoZmlsdGVyKGdlbnJlX2NvdW50X3N1bSwgcGVyYyA9PSBtYXgocGVyYykpLCBwZXJjKWAlOyBOPWByIHB1bGwoZmlsdGVyKGdlbnJlX2NvdW50X3N1bSwgcGVyYyA9PSBtYXgocGVyYykpLCBuKWApIG9mIHRoZSBzZXNzaW9ucyBpcyAiYHIgcHVsbChmaWx0ZXIoZ2VucmVfY291bnRfc3VtLCBwZXJjID09IG1heChwZXJjKSksIGdlbnJlKWAiIGdlbnJlLCBmb2xsb3dlZCBieSAiYHIgcHVsbChmaWx0ZXIoZmlsdGVyKGdlbnJlX2NvdW50X3N1bSwgcGVyYyAhPSBtYXgocGVyYykpLCBwZXJjID09IG1heChwZXJjKSksIGdlbnJlKWAiIChgciBwdWxsKGZpbHRlcihmaWx0ZXIoZ2VucmVfY291bnRfc3VtLCBwZXJjICE9IG1heChwZXJjKSksIHBlcmMgPT0gbWF4KHBlcmMpKSwgcGVyYylgJTsgTj1gciBwdWxsKGZpbHRlcihmaWx0ZXIoZ2VucmVfY291bnRfc3VtLCBwZXJjICE9IG1heChwZXJjKSksIHBlcmMgPT0gbWF4KHBlcmMpKSwgbilgKSwgIndvcmQgbGlzdCIgKGByIHB1bGwoZmlsdGVyKGdlbnJlX2NvdW50X3N1bSwgZ2VucmUgPT0gIndvcmQgbGlzdCIpLCBwZXJjKWAlOyBOPWByIHB1bGwoZmlsdGVyKGdlbnJlX2NvdW50X3N1bSwgZ2VucmUgPT0gIndvcmQgbGlzdCIpLCBuKWApLCBhbmQgb3RoZXIgZ2VucmVzIChgciBwdWxsKGZpbHRlcihnZW5yZV9jb3VudF9zdW0sIGdlbnJlID09ICJvdGhlcnMiKSwgcGVyYylgJTsgTj1gciBwdWxsKGZpbHRlcihnZW5yZV9jb3VudF9zdW0sIGdlbnJlID09ICJvdGhlcnMiKSwgbilgKSwgbmFtZWx5IHNvbmcsIGNlbGVicmF0aW9uLCBhbmQgbWl4ZWQgb2YgbmFycmF0aXZlIGFuZCBjb252ZXJzYXRpb247IHRoZSByZW1haW5pbmcgYHIgcHVsbChmaWx0ZXIoZ2VucmVfY291bnRfc3VtLCBpcy5uYShnZW5yZSkpLCBwZXJjKWAlIChOPWByIHB1bGwoZmlsdGVyKGdlbnJlX2NvdW50X3N1bSwgaXMubmEoZ2VucmUpKSwgbilgKSBpcyBgTkFgLiANCg0KDQoNCmBgYHtyIG1waS1jb3JwdXMtcmVsYXRpb25zaGlwLCBmaWcuY2FwID0gIlNjaGVtYXRpYyByZWxhdGlvbnNoaXAgYmV0d2VlbiBmaWxlcyBpbiB0aGUgTVBJIEVWQSBKRlMgY29ycG9yYSAoQXZhaWxhYmxlIGZyb20gaHR0cHM6Ly9saW5nd2ViLmV2YS5tcGcuZGUvYXJjaGl2ZS9qYWthcnRhL2RhdGEucGhwLmh0bWwpIiwgZmlnLmFzcCA9IC45LCBmaWcud2lkdGg9OX0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJmaWd1cmVzL0ZJRy1tcGktcmVsYXRpb25zaGlwLnBuZyIsIGRwaSA9IDMwMCkNCmBgYA0KDQpOZXh0LCB3ZSByZXRyaWV2ZWQgdGhlIG1vcnBocyBnbG9zc2VkIGFzICdoYXBweScsICdnbGFkJywgYW5kICdqb3koZnVsKScuIE5vdGUgdGhhdCB0aGUgdmFsdWVzIG9mIHRoZSByZXRyaWV2ZWQgYG1vcnBoc2AgY29sdW1uIGFyZSB0aGUgc2FtZSB3aXRoIHRob3NlIGluIHRoZSBgd29yZF9mb3JtYCBjb2x1bW47IGZvciB0aGlzIHJlYXNvbiBhbmQgc3VjY2luY3RuZXNzLCB3ZSB1c2UgIm1vcnBocyIgaW4gcmVwbGFjZSBvZiAid29yZF9mb3JtcyIuIFdlIGV4Y2x1ZGVkIHRoZSBkZXJpdmF0aXZlcyAoZS5nLiwgYXMgZGVyaXZlZCB2ZXJicyBvciBkZXJpdmVkIG5vdW5zKSBvZiB0aGUgbW9ycGhzLCB3aGljaCB3aWxsIGJlIHBhcnQgb2YgYSBmdXR1cmUgd29yayBvbiB0aGVpciBtb3JwaG9sb2dpY2FsIHByb2ZpbGVzLiBUYWJsZSBbXEByZWYodGFiOmhhcHB5LXdvcmQtc25pcHBldCldKCNoYXBweS13b3JkLXNuaXBwZXQpIHNob3dzIGV4YW1wbGVzIG9mIHRoZSBkYXRhYmFzZSAodGhlIGBQaG9uLiB0cmFuc2MuYF5bT25seSBgciByb3VuZChucm93KGZpbHRlcihtYWxheWljX2hhcHB5LCAhaXMubmEocGhvbmV0aWNfdHJhbnNjcmlwdGlvbikpKS9ucm93KG1hbGF5aWNfaGFwcHkpICogMTAwLCAyKWAlIG9mIHRoZSB0b3RhbCBgciBucm93KG1hbGF5aWNfaGFwcHkpYCBjYXNlcyBvZiB0aGUgSEFQUElORVNTIGxleGljb24gZGF0YWJhc2UgY29udGFpbiB0aGUgcGhvbmV0aWMgdHJhbnNjcmlwdGlvbiBpbmZvcm1hdGlvbi5dIGNvbHVtbiBpcyB0aGUgcGhvbmV0aWMgdHJhbnNjcmlwdGlvbiBvZiB0aGUgdmFsdWVzIGluIHRoZSBgTW9ycGhzYCBjb2x1bW4pLg0KDQpgYGB7ciBoYXBweS13b3JkLXNuaXBwZXR9DQptYWxheWljX2hhcHB5ICU+JSANCiAgc2VsZWN0KHBob25ldGljX3RyYW5zY3JpcHRpb24sIG1vcnBocywgZ2xvc3MsIGxhbmd1b2lkX25hbWVfbmV3LCByZWdpb24pICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoZ2xvc3MsICJbOi5dW0EtWl0kIiwgbmVnYXRlID0gVFJVRSksICFpcy5uYShwaG9uZXRpY190cmFuc2NyaXB0aW9uKSkgJT4lIA0KICByZW5hbWUoYFBob24uIHRyYW5zYy5gID0gcGhvbmV0aWNfdHJhbnNjcmlwdGlvbiwNCiAgICAgICAgIGBMYW5ndW9pZCBuYW1lYCA9IGxhbmd1b2lkX25hbWVfbmV3LA0KICAgICAgICAgUmVnaW9uID0gcmVnaW9uLA0KICAgICAgICAgTW9ycGhzID0gbW9ycGhzLA0KICAgICAgICAgR2xvc3MgPSBnbG9zcykgJT4lDQogIGdyb3VwX2J5KGBMYW5ndW9pZCBuYW1lYCkgJT4lIA0KICBzbGljZV9zYW1wbGUobiA9IDEpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgc2xpY2Vfc2FtcGxlKG4gPSAzKSAlPiUgDQogIGtuaXRyOjprYWJsZShjYXB0aW9uID0gIlNuaXBwZXQgb2YgdGhlIEhBUFBJTkVTUyBsZXhpY29uIGRhdGFiYXNlIikNCmBgYA0KDQpJbiB0aGUgYW5hbHlzZXMsIHdlIGdyb3VwIGEgc2V0IG9mIHJlbGF0ZWQgbW9ycGhzIHVuZGVyIHRoZSBzYW1lIGNvbmNlcHR1YWwgY2F0ZWdvcmllcyB0aGF0IGFyZSBsYWJlbGxlZCBpbiBzdGFuZGFyZCBJbmRvbmVzaWFuLiBGb3IgaW5zdGFuY2UsIHRoZSBjb25jZXB0dWFsIGNhdGVnb3J5IG9yIGNvbmNlcHQgb2YgU0VOQU5HIHN1YnN1bWVzIHN1Y2ggbW9ycGhzIGFzICpzbmFuZyosICpzb25hxYsqLCAqc2VuZW5nKiwgKnNhbmFuZyosIGludGVyIGFsaWEsIHRoYXQgZGlmZmVyIHNsaWdodGx5IGluIHRlcm1zIG9mIHRoZWlyIHBob25lbWljIHN0cnVjdHVyZXMsIHN1Y2ggYXMgdGhlIHZvd2Vscy4gQW5vdGhlciBleGFtcGxlIGlzIHRoZSBjb25jZXB0IEJBSEFHSUEgdGhhdCBjYW4gYmUgbGV4aWNhbGlzZWQgYnkgKmJhaMmQZ2nJkCosICpiYWhhZ2nDqSosICpiYWhhZ2l5YSosIGFtb25nIG90aGVycy4gVGhlIHF1YW50aXRhdGl2ZSBhbmFseXNlcyBpbnZvbHZlIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MsIG5hbWVseSBmcmVxdWVuY3kgY291bnQgYW5kIHBlcmNlbnRhZ2VzIGZvciB1bml2YXJpYXRlIGFuZCBiaXZhcmlhdGUgZGVzaWducyBbQGdyaWVzX3N0YXRpc3RpY3NfMjAxMywgMTAyLCAxMzZdLiBJbiB0aGUgdW5pdmFyaWF0ZSBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzLCB3ZSB0YWxseSB0aGUgdG90YWwgZnJlcXVlbmN5IG9mIG1vcnBocyBsZXhpY2FsaXNpbmcgYSBnaXZlbiBjb25jZXB0OyB0aGlzIHdheSwgd2UgY2FuIGFzc2VzcyB0aGUgcmVsYXRpdmUgcHJvbWluZW5jZSAoc3RhdGlzdGljYWxseSBzcGVha2luZykgb2YgdGhlIE1hbGF5aWMgY29uY2VwdHVhbCBjYXRlZ29yaWVzIGZvciBIQVBQSU5FU1MgKEZpZ3VyZSBbXEByZWYoZmlnOkZJRy1sZW1tYS1IQVBQWS1iYXJwbG90KV0oI0ZJRy1sZW1tYS1IQVBQWS1iYXJwbG90KSkuIFRoZSBiaXZhcmlhdGUgYW5hbHlzaXMgY2FwdHVyZXMgdGhlIGZyZXF1ZW5jeSBkaXN0cmlidXRpb24gb2YgdGhlIHRvcC1maXZlIE1hbGF5aWMgSEFQUElORVNTIGNvbmNlcHRzIGJ5IHJlZ2lvbnMsIGJvdGggYXQgdGhlIGxldmVsIG9mIHRva2VuIGFuZCB0eXBlIGZyZXF1ZW5jaWVzLiBUaGUgdG9rZW4gZnJlcXVlbmN5IG9mIGEgY29uY2VwdCBieSByZWdpb24gcmVmZXJzIHRvIHRoZSB0b3RhbCBvY2N1cnJlbmNlcyBvZiB0aGUgY29uY2VwdCBpbiB0aGUgY29ycHVzIG9mIHRoZSByZWdpb24uIFRoZSB0eXBlIGZyZXF1ZW5jeSBvZiBhIHJlZ2lvbiByZWZlcnMgdG8gdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgSEFQUElORVNTIGNvbmNlcHRzIGxleGljYWxpc2VkIGluIHRoZSBnaXZlbiByZWdpb24uIEdlbyBzcGF0aWFsIHZpc3VhbGlzYXRpb25zIGFyZSBpbmNsdWRlZCB0byBjYXB0dXJlIHRoZSByZWdpb25hbCBkaXN0cmlidXRpb24gb2YgdGhlIEhBUFBJTkVTUyBjb25jZXB0cyBhbmQgbW9ycGhzIG1vcmUgaW50dWl0aXZlbHkuIEFsbCBkYXRhIHByZS1wcm9jZXNzaW5nLCBzdGF0aXN0aWNhbCBhbmFseXNlcywgYW5kIHZpc3VhbGlzYXRpb25zIGFyZSBwZXJmb3JtZWQgaW4gUlN0dWRpbyB1c2luZyB0aGUgUiBwcm9ncmFtbWluZyBsYW5ndWFnZSBbQHJjb3JlMjAyMV0uIFdlIHdyb3RlIHRoZSBwYXBlciBmdWxseSBpbiBSIE1hcmtkb3duIE5vdGVib29rIHRoYXQgaW50ZXJsZWF2ZXMgdGhlIHJlZ3VsYXIgdGV4dHMgYW5kIHByb2dyYW1taW5nIGNvZGVzIHRvIHJ1biB0aGUgcXVhbnRpdGF0aXZlIGFuZCBncmFwaGljYWwgYW5hbHlzZXMuIFRoZSBOb3RlYm9vayBhbmQgdGhlIGRhdGEgYXJlIHB1Ymxpc2hlZCBhdCAqT3BlbiBTY2llbmNlIEZyYW1ld29yayogKE9TRikgW3NlZSBAcmFqZWdfY29kZWRhdGFfMjAyMSBmb3IgdGhlIGRvd25sb2FkIGxpbmtdLg0KDQoNCiMgRmluZGluZ3MgYW5kIERpc2N1c3Npb24NCg0KIyMgRGlzdHJpYnV0aW9uIG9mIHRoZSBjb25jZXB0cyBvZiBIQVBQSU5FU1MgaW4gY29sbG9xdWlhbCBNYWxheWljIHZhcmlldGllcw0KDQpUbyBiZWdpbiB3aXRoLCB3ZSBkaXNjdXNzIHRoZSBwcm9taW5lbnQgY29uY2VwdHMgcmVmZXJyaW5nIHRvIEhBUFBJTkVTUyBpbiB0aGUgTWFsYXlpYyB2YXJpZXRpZXMuIEFzIG1lbnRpb25lZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgdGhlIGNvbmNlcHRzIGFyZSBwb3N0dWxhdGVkIGZyb20gYSBzZXQgb2YgbW9ycGhzLiBGaWd1cmUgW1xAcmVmKGZpZzpGSUctbGVtbWEtSEFQUFktYmFycGxvdCldKCNGSUctbGVtbWEtSEFQUFktYmFycGxvdCkgc2hvd3MgdGhlIHJlbGF0aXZlIGRpc3RyaWJ1dGlvbiAoaW4gcGVyY2VudGFnZXMpIG9mIHRoZXNlIGNvbmNlcHRzIGluIHRoZSBkYXRhYmFzZS4gDQoNCmBgYHtyIEZJRy1sZW1tYS1IQVBQWS1iYXJwbG90LCBmaWcuY2FwID0gIlBlcmNlbnRhZ2VzIG9mIHRoZSBIQVBQSU5FU1MgY29uY2VwdHMgaW4gY29sbG9xdWlhbCBNYWxheS9JbmRvbmVzaWFuIGNvcnBvcmEiLCBmaWcuYXNwID0gLjZ9DQptYWxheWljX2hhcHB5X2ZyZXFfbGVtbWEgJT4lIA0KICBtdXRhdGUobGVtbWEgPSBmYWN0b3IobGVtbWEsIGxldmVscyA9IGMobWFsYXlpY19oYXBweV9mcmVxX2xlbW1hJGxlbW1hKSksDQogICAgICAgICBmaWxsY29sID0gaWZfZWxzZShsZW1tYSAlaW4lIG1hbGF5aWNfaGFwcHlfbGVtbWFfdG9wZml2ZSRsZW1tYSwgIiNENTNFNEYiLCAiI0U2RjU5OCIpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIobGVtbWEsIHBlcmNfbGVtbWEpLCB5ID0gcGVyY19sZW1tYSkpICsgDQogIGdlb21fY29sKGFlcyhmaWxsID0gZmlsbGNvbCksIHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI0Q1M0U0RiIsICIjRTZGNTk4IikpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgbGFicyh4ID0gIkNvbmNlcHRzIiwgeSA9ICJQZXJjZW50YWdlcyIsDQogICAgICAgY2FwdGlvbiA9ICJUaGUgdG9wLTUgY29uY2VwdHMgYXJlIGluIHJlZCBiYXJzLiIpICsNCiAgdGhlbWVfbGlnaHQoKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKQ0KYGBgDQoNCkl0IGNhbiBiZSBvYnNlcnZlZCB0aGF0IG1vcnBocyBsZXhpY2FsaXNpbmcgdGhlIGNvbmNlcHQgYHIgcHVsbChmaWx0ZXIobWFsYXlpY19oYXBweV9sZW1tYV90b3BmaXZlLCBuID09IG1heChuKSksIGxlbW1hKWAgYXJlIHRoZSBtb3N0IHByb21pbmVudCBmb3IgdGhlIE1hbGF5aWMgdmFyaWV0aWVzIGluIEluZG9uZXNpYSAoTj1gciBwdWxsKGZpbHRlcihtYWxheWljX2hhcHB5X2xlbW1hX3RvcGZpdmUsIG4gPT0gbWF4KG4pKSwgbilgOyBgciBwdWxsKGZpbHRlcihtYWxheWljX2hhcHB5X2xlbW1hX3RvcGZpdmUsIG4gPT0gbWF4KG4pKSwgcGVyY19sZW1tYSlgJSBvZiB0aGUgdG90YWwgdG9rZW5zIG9mIGFsbCBjb25jZXB0cyk7IGl0IGlzIGZvbGxvd2VkIGJ5IGByIG1hbGF5aWNfaGFwcHlfbGVtbWFfdG9wZml2ZSRsZW1tYVsyXWAgKE49YHIgbWFsYXlpY19oYXBweV9sZW1tYV90b3BmaXZlJG5bMl1gOyBgciBtYWxheWljX2hhcHB5X2xlbW1hX3RvcGZpdmUkcGVyY19sZW1tYVsyXWAlKSwgYHIgbWFsYXlpY19oYXBweV9sZW1tYV90b3BmaXZlJGxlbW1hWzNdYCAoTj1gciBtYWxheWljX2hhcHB5X2xlbW1hX3RvcGZpdmUkblszXWA7IGByIG1hbGF5aWNfaGFwcHlfbGVtbWFfdG9wZml2ZSRwZXJjX2xlbW1hWzNdYCUpLCBgciBtYWxheWljX2hhcHB5X2xlbW1hX3RvcGZpdmUkbGVtbWFbNF1gIChOPWByIG1hbGF5aWNfaGFwcHlfbGVtbWFfdG9wZml2ZSRuWzRdYDsgYHIgbWFsYXlpY19oYXBweV9sZW1tYV90b3BmaXZlJHBlcmNfbGVtbWFbNF1gJSksIGFuZCBgciBtYWxheWljX2hhcHB5X2xlbW1hX3RvcGZpdmUkbGVtbWFbNV1gIChOPWByIG1hbGF5aWNfaGFwcHlfbGVtbWFfdG9wZml2ZSRuWzVdYDsgYHIgbWFsYXlpY19oYXBweV9sZW1tYV90b3BmaXZlJHBlcmNfbGVtbWFbNV1gJSkuIFRoZSBjb25jZXB0IChLKUFST8qUIGlzIGF0dGVzdGVkIGluIHRoZSBgciBwYXN0ZSh1bmlxdWUobWFsYXlpY19oYXBweV9mcmVxJGxhbmd1b2lkX25hbWVfbmV3W21hbGF5aWNfaGFwcHlfZnJlcSRsZW1tYSA9PSAiKEspQVJPypQiXSksIGNvbGxhcHNlID0gIiBhbmQgIilgIGxhbmd1YWdlcyBzcG9rZW4gaW4gdGhlIHJlZ2lvbiBvZiBgciB1bmlxdWUobWFsYXlpY19oYXBweV9mcmVxJHJlZ2lvblttYWxheWljX2hhcHB5X2ZyZXEkbGVtbWEgPT0gIihLKUFST8qUIl0pYCAoY2YuIEZpZ3VyZSBbXEByZWYoZmlnOkZJRy10b3AtZml2ZS1IQVBQWS1hY3Jvc3MtcmVnaW9uKV0oI0ZJRy10b3AtZml2ZS1IQVBQWS1hY3Jvc3MtcmVnaW9uKSksIGFuZCBwb3N0dWxhdGVkIGZyb20gdGhlc2UgbW9ycGhzOiAqYHIgcGFzdGUobWFsYXlpY19oYXBweV9mcmVxJG1vcnBoc1ttYWxheWljX2hhcHB5X2ZyZXEkbGVtbWEgPT0gIihLKUFST8qUIl0sIGNvbGxhcHNlID0gIiwgIilgKi4gVGhlIHByb21pbmVuY2Ugb2YgU0VOQU5HIGFuZCBCQUhBR0lBIGluIHRoZSBjb2xsb3F1aWFsIE1hbGF5aWMgdmFyaWV0aWVzIGNvcnJvYm9yYXRlcyBmaW5kaW5ncyBmcm9tIHByZXZpb3VzIGV4cGVyaW1lbnRhbCBzdHVkeSBvbiBJbmRvbmVzaWFuIGVtb3Rpb24gbGV4aWNvbiBbY2YuIEBzaGF2ZXJfc3RydWN0dXJlXzIwMDEsIDIwOF0sIHNob3dpbmcgdGhhdCBTRU5BTkcgYW5kIEJBSEFHSUEgYXJlIHR3byBvZiB0aGUgZml2ZSBwcm90b3R5cGljYWwgY29uY2VwdHVhbCBjYXRlZ29yaWVzIGZvciBIQVBQSU5FU1MgaW4gSW5kb25lc2lhbiAodG9nZXRoZXIgd2l0aCBHRU1CSVJBLCBDRVJJQSwgYW5kIFJJQU5HKS4NCg0KIyMgRGlzdHJpYnV0aW9uIG9mIHRoZSB0b3AtZml2ZSBIQVBQSU5FU1MgY29uY2VwdHMgYnkgcmVnaW9ucw0KDQpUaGlzIHN1Yi1zZWN0aW9uIGRpc2N1c3NlcyB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB0b3AtZml2ZSBjb25jZXB0cyBhY3Jvc3MgdGhlIHJlZ2lvbnMgaW4gdGhlIGFyY2hpcGVsYWdvLiBUaGlzIGlzIHZpc3VhbGlzZWQgaW4gRmlndXJlIFtcQHJlZihmaWc6RklHLXRvcC1maXZlLUhBUFBZLWFjcm9zcy1yZWdpb24pXSgjRklHLXRvcC1maXZlLUhBUFBZLWFjcm9zcy1yZWdpb24pLiBUaGUgcG9pbnRzIHJlcHJlc2VudCBjZXJ0YWluIGFyZWFzIHdpdGhpbiB0aGUgcmVnaW9uLiBJZiB0aGUgZGF0YWJhc2UgcHJvdmlkZXMgc3BlY2lmaWMgYXJlYXMvbG9jYXRpb24gZm9yIGEgZ2l2ZW4gcmVnaW9uLCBidXQgbWlzc2luZyB0aGUgZ2VvIG1hcHBpbmcgZGF0YSAoaS5lLiwgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSkgZm9yIHRoZXNlIGFyZWFzIChpbmRpY2F0ZWQgYnkgYE5BYCBpbiB0aGUgZGF0YWJhc2UpLCB3ZSBpZGVudGlmaWVkIHRoZWlyIGFwcHJveGltYXRlIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgaW5mb3JtYXRpb24gdmlhIEdvb2dsZSBNYXBzLiBGb3IgaW5zdGFuY2UsIGRhdGEgZm9yIHRoZSBKYW1iaSBQcm92aW5jZSBzdWJzZXQgaW5jbHVkZXMgdGhlIGdlbyBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciB0aGVzZSBzcGVjaWZpYyBwcm9qZWN0czogYHIgbWFsYXlpY19oYXBweSAlPiUgZmlsdGVyKHN0cl9kZXRlY3QocmVnaW9uLCAnSmFtYmknKSkgJT4lIHNlbGVjdChyZWdpb24sIHByb2plY3RfbmFtZSwgZGF0YV9zZXRfbmFtZSwgbGF0aXR1ZGUsIGxvbmdpdHVkZSkgJT4lIGZpbHRlcighaXMubmEobGF0aXR1ZGUpKSAlPiUgcHVsbChkYXRhX3NldF9uYW1lKSAlPiUgdW5pcXVlKCkgJT4lIHBhc3RlKGNvbGxhcHNlID0gJzsgJylgLiBIb3dldmVyLCB0aGUgb3RoZXIgcHJvamVjdHMgaW4gdGhlIHNhbWUgcmVnaW9uIGRvIG5vdCBoYXZlIHN1Y2ggZ2VvIG1hcHBpbmcgZGF0YTogYHIgbWFsYXlpY19oYXBweSAlPiUgZmlsdGVyKHN0cl9kZXRlY3QocmVnaW9uLCAnSmFtYmknKSkgJT4lIHNlbGVjdChyZWdpb24sIHByb2plY3RfbmFtZSwgZGF0YV9zZXRfbmFtZSwgbGF0aXR1ZGUsIGxvbmdpdHVkZSkgJT4lIGZpbHRlcihpcy5uYShsYXRpdHVkZSkpICU+JSBwdWxsKGRhdGFfc2V0X25hbWUpICU+JSB1bmlxdWUoKSAlPiUgcGFzdGUoY29sbGFwc2UgPSAnOyAnKWAuIEZvciB0aGVzZSBwcm9qZWN0cyBsYWNraW5nIHRoZSBnZW8gbWFwcGluZyBkYXRhLCB3ZSByZXRyaWV2ZWQgdGhlbSBmcm9tIEdvb2dsZSBNYXAgYnkgc2VhcmNoaW5nIHRoZSBzcGVjaWZpYyBhcmVhcyBtZW50aW9uZWQgYXMgdGhlIHByb2plY3QgYW5kL29yIGRhdGEgc2V0IG5hbWVzLiANCg0KYGBge3IgRklHLXRvcC1maXZlLUhBUFBZLWFjcm9zcy1yZWdpb24sIGZpZy5jYXAgPSAiVG9wLWZpdmUgSEFQUElORVNTIGNvbmNlcHRzIGluIHRoZSBNYWxheWljIHZhcmlldGllcyBhY3Jvc3MgdGhlIHJlZ2lvbnMuIiwgbWVzc2FnZSA9IEZBTFNFfQ0KIyBjcmVhdGUgdGhlIElORE9ORVNJQU4gcGxvdA0KaW5kb3Bsb3QgPC0gaW5kb21hcCAlPiUgDQogIGdncGxvdCgpICsgDQogIGdlb21fcG9seWdvbihhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXApLA0KICAgICAgICAgICAgICAgZmlsbCA9ICJncmF5OTAiKSArDQogICMgY29vcmRfZml4ZWQoMS40KSArDQogIHRoZW1lX21hcCgpICsNCiAgbGFicyh4ID0gIkxvbmdpdHVkZSIsIHkgPSAiTGF0aXR1ZGUiKQ0KDQptYWxheWljX2hhcHB5X2ZyZXFfZGYgPC0gbWFsYXlpY19oYXBweV9mcmVxICU+JSANCiAgbXV0YXRlKGFjcm9zcyh3aGVyZShpcy5jaGFyYWN0ZXIpLCBhcy5mYWN0b3IpKQ0KDQojIGRhdGFfcGxvdF90b3BfZml2ZSA8LSBtYWxheWljX2hhcHB5X2ZyZXFfZGYgJT4lIA0KIyAgIGZpbHRlcihsZW1tYSAlaW4lIG1hbGF5aWNfaGFwcHlfbGVtbWFfdG9wZml2ZSRsZW1tYSkgJT4lIA0KIyAgIG11dGF0ZShsZW1tYSA9IGZhY3RvcihsZW1tYSwgbGV2ZWxzID0gbWFsYXlpY19oYXBweV9sZW1tYV90b3BmaXZlJGxlbW1hKSkNCg0KIyBjb21iaW5lIHRoZSBsZW1tYSBmcmVxIGFuZCBwZXJjIGJ5IHJlZ2lvbiB3aXRoIHRoZSBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlIGRhdGENCmRhdGFfcGxvdF9ieV9yZWdpb24gPC0gbWFsYXlpY19oYXBweV9sZW1tYV9mcmVxX3BlcmNfYnlfcmVnaW9uICU+JQ0KICBtdXRhdGUoYWNyb3NzKHdoZXJlKGlzLmNoYXJhY3RlciksIGFzLmZhY3RvcikpICU+JSANCiAgbGVmdF9qb2luKG1hbGF5aWNfaGFwcHlfZnJlcV9kZiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChsYXRpdHVkZSwgbG9uZ2l0dWRlLCByZWdpb24sIHByb3ZpbmNlLCBsYW5ndW9pZF9uYW1lX25ldywgbGVtbWEpICU+JSANCiAgICAgICAgICAgICAgZGlzdGluY3QoKSwNCiAgICAgICAgICAgIGJ5ID0gYygicmVnaW9uIiwgImxlbW1hIikpDQoNCmRhdGFfcGxvdF9ieV9yZWdpb25fdG9wX2ZpdmUgPC0gZGF0YV9wbG90X2J5X3JlZ2lvbiAlPiUgDQogIGZpbHRlcihsZW1tYSAlaW4lIG1hbGF5aWNfaGFwcHlfbGVtbWFfdG9wZml2ZSRsZW1tYSkgJT4lDQogIG11dGF0ZShsZW1tYSA9IGZhY3RvcihsZW1tYSwgbGV2ZWxzID0gbWFsYXlpY19oYXBweV9sZW1tYV90b3BmaXZlJGxlbW1hKSkNCg0KaW5kb3Bsb3QgKw0KICBnZW9tX2ppdHRlcihkYXRhID0gZGF0YV9wbG90X2J5X3JlZ2lvbl90b3BfZml2ZSAlPiUNCiAgICAgICAgICAgICAgICBzZWxlY3QobGVtbWEsIGxvbmdpdHVkZSwgbGF0aXR1ZGUsIHByb3ZpbmNlLCByZWdpb24sIG4sIHBlcmNfbGVtbWFfYnlfcmVnaW9uKSAlPiUNCiAgICAgICAgICAgICAgICBkaXN0aW5jdCgpLA0KICAgICAgICAgICAgICBhZXMoeCA9IGxvbmdpdHVkZSwgeSA9IGxhdGl0dWRlLCBjb2xvdXIgPSBsZW1tYSwgc2l6ZSA9IHBlcmNfbGVtbWFfYnlfcmVnaW9uKSwNCiAgICAgICAgICAgICAgYWxwaGEgPSAuNiwNCiAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBUUlVFKSArDQogIGd1aWRlcyhzaXplID0gRkFMU0UpICsNCiAgZmFjZXRfd3JhcCh+bGVtbWEpICsNCiAgc2NhbGVfY29sb3VyX2JyZXdlcih0eXBlID0gInF1YWwiLCBwYWxldHRlID0gIlNldDEiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArDQogIHNjYWxlX3NpemUocmFuZ2UgPSBjKDEsIDMuNSkpICsNCiAgbGFicyhzaXplID0gIlRva2VucyBvZiBDb25jZXB0XG4ocGVyIHJlZ2lvbikiLA0KICAgICAgIGNvbG91ciA9ICJDb25jZXB0IiwNCiAgICAgICBjYXB0aW9uID0gIlRoZSBzaXplIG9mIHRoZSBidWJibGUgaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBwZXJjZW50YWdlcyBvZiB0aGUgY29uY2VwdHMgcGVyIHJlZ2lvbi4iKSArDQogIGdlb21fdGV4dChkYXRhID0gZGF0YV9wbG90X2J5X3JlZ2lvbl90b3BfZml2ZSAlPiUgDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdChsZW1tYSwgbG9uZ2l0dWRlLCBsYXRpdHVkZSwgcHJvdmluY2UsIHJlZ2lvbiwgbiwgcGVyY19sZW1tYV9ieV9yZWdpb24pICU+JSANCiAgICAgICAgICAgICAgICAgICAgZGlzdGluY3QoKSAlPiUgDQogICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KHJlZ2lvbiwgbGVtbWEpICU+JSANCiAgICAgICAgICAgICAgICAgICAgc2xpY2Vfc2FtcGxlKG4gPSAxKSwNCiAgICAgICAgICAgICAgICAgIGFlcyh4ID0gbG9uZ2l0dWRlLCBsYXRpdHVkZSwgbGFiZWwgPSBwcm92aW5jZSksDQogICAgICAgICAgICAgICAgICBzaXplID0gMS43NSkNCg0KIyB0b3RhbCB3b3JkIGNvdW50IHBlciByZWdpb24gZm9yIHRoZSB0b3AtZml2ZSBsZW1tYXMNCndvcmRfY291bnRfcGVyX3JlZ2lvbl90b3BfZml2ZSA8LSB3b3JkX2NvdW50X3Blcl9yZWdpb24gJT4lIA0KICBmaWx0ZXIocmVnaW9uICVpbiUgdW5pcXVlKGRhdGFfcGxvdF9ieV9yZWdpb25fdG9wX2ZpdmUkcmVnaW9uKSkgJT4lIA0KICBtdXRhdGUocGVyYyA9IHJvdW5kKHdvcmRfY291bnRfcmVnaW9uL3N1bSh3b3JkX2NvdW50X3JlZ2lvbikgKiAxMDAsIDMpKQ0KDQpgYGANCg0KSW4gYWRkaXRpb24gdG8gYmVpbmcgdGhlIG1vc3QgZnJlcXVlbnQgY29uY2VwdCBvdmVyYWxsLCBTRU5BTkcgaXMgYWxzbyB0aGUgbW9zdCBmcmVxdWVudCBmb3IgYHIgbnVtYmVyczJ3b3Jkcyhucm93KHNlbmFuZ19hY3Jvc3NfcmVnaW9uKSlgIG91dCBvZiB0aGUgYHIgbnVtYmVyczJ3b3Jkcyhucm93KG1hbGF5aWNfaGFwcHlfbGVtbWFfdHlwZWZyZXFfYnlfcmVnaW9uKSlgIHN0dWRpZWQgcmVnaW9ucyAoRmlndXJlIFtcQHJlZihmaWc6RklHLXRvcC1maXZlLUhBUFBZLWFjcm9zcy1yZWdpb24pXSgjRklHLXRvcC1maXZlLUhBUFBZLWFjcm9zcy1yZWdpb24pKS4gVGhlIGZyZXF1ZW5jeSBvZiBTRU5BTkcgaXMgdGhlIGhpZ2hlc3QgaW4gYHIgbnVtYmVyczJ3b3Jkcyhucm93KGZpbHRlcihhcnJhbmdlKHNlbmFuZ19hY3Jvc3NfcmVnaW9uLCBkZXNjKG4pKSwgbiA+IDkwKSkpYCBvZiB0aGUgYHIgbnVtYmVyczJ3b3Jkcyhucm93KGFycmFuZ2Uoc2VuYW5nX2Fjcm9zc19yZWdpb24sIGRlc2MobikpKSlgIHJlZ2lvbnMsIG5hbWVseSBpbiBgciBwdWxsKGZpbHRlcihhcnJhbmdlKHNlbmFuZ19hY3Jvc3NfcmVnaW9uLCBkZXNjKG4pKSwgbiA+IDkwKSwgcmVnaW9uKVsxXWAgKE49YHIgcHVsbChhcnJhbmdlKHNlbmFuZ19hY3Jvc3NfcmVnaW9uLCBkZXNjKG4pKSwgbilbMV1gKSwgYHIgcHVsbChmaWx0ZXIoYXJyYW5nZShzZW5hbmdfYWNyb3NzX3JlZ2lvbiwgZGVzYyhuKSksIG4gPiA5MCksIHJlZ2lvbilbMl1gIChOPWByIHB1bGwoYXJyYW5nZShzZW5hbmdfYWNyb3NzX3JlZ2lvbiwgZGVzYyhuKSksIG4pWzJdYCksIGFuZCBgciBwdWxsKGZpbHRlcihhcnJhbmdlKHNlbmFuZ19hY3Jvc3NfcmVnaW9uLCBkZXNjKG4pKSwgbiA+IDkwKSwgcmVnaW9uKVszXWAgKE49YHIgcHVsbChhcnJhbmdlKHNlbmFuZ19hY3Jvc3NfcmVnaW9uLCBkZXNjKG4pKSwgbilbM11gKV5bVGhlIG90aGVyIHRocmVlIHJlZ2lvbnMgd2hlcmUgU0VOQU5HIGlzIHRoZSBtb3N0IGZyZXF1ZW50IGNvbmNlcHQgYXJlIGByIHB1bGwoZmlsdGVyKGFycmFuZ2Uoc2VuYW5nX2Fjcm9zc19yZWdpb24sIGRlc2MobikpLCBuIDwgOTApLCByZWdpb24pWzFdYCAoTj1gciBwdWxsKGFycmFuZ2Uoc2VuYW5nX2Fjcm9zc19yZWdpb24sIGRlc2MobikpLCBuKVs0XWApLCBgciBwdWxsKGZpbHRlcihhcnJhbmdlKHNlbmFuZ19hY3Jvc3NfcmVnaW9uLCBkZXNjKG4pKSwgbiA8IDkwKSwgcmVnaW9uKVsyXWAgKE49YHIgcHVsbChhcnJhbmdlKHNlbmFuZ19hY3Jvc3NfcmVnaW9uLCBkZXNjKG4pKSwgbilbNV1gKSwgYW5kIGByIHB1bGwoZmlsdGVyKGFycmFuZ2Uoc2VuYW5nX2Fjcm9zc19yZWdpb24sIGRlc2MobikpLCBuIDwgOTApLCByZWdpb24pWzNdYCAoTj1gciBwdWxsKGFycmFuZ2Uoc2VuYW5nX2Fjcm9zc19yZWdpb24sIGRlc2MobikpLCBuKVs2XWApLl0uIFRoZSBFbmdsaXNoIGNvbmNlcHQgSEFQUFkgaXMgYWxzbyBkaXN0cmlidXRlZCByYXRoZXIgd2lkZWx5LCBuYW1lbHkgaW4gYHIgbnVtYmVyczJ3b3Jkcyhucm93KG1hbGF5aWNfaGFwcHlfbGVtbWFfZnJlcV9wZXJjX2J5X3JlZ2lvbiAlPiUgZmlsdGVyKGxlbW1hPT0nSEFQUFknKSkpYCBvdXQgb2YgdGhlIHRvdGFsIGByIG51bWJlcnMyd29yZHMobnJvdyhtYWxheWljX2hhcHB5X2xlbW1hX3R5cGVmcmVxX2J5X3JlZ2lvbikpYCByZWdpb25zLiBJbiB0ZXJtcyBvZiBpdHMgcHJvcG9ydGlvbiwgSEFQUFkgaXMgcmVsYXRpdmVseSB0aGUgbW9zdCBmcmVxdWVudCBpbiBgciBtYWxheWljX2hhcHB5X2xlbW1hX2ZyZXFfcGVyY19ieV9yZWdpb24gJT4lIHVuZ3JvdXAoKSAlPiUgZmlsdGVyKGxlbW1hPT0nSEFQUFknKSAlPiUgZmlsdGVyKHBlcmNfbGVtbWFfYnlfcmVnaW9uPT1tYXgocGVyY19sZW1tYV9ieV9yZWdpb24pKSAlPiUgcHVsbChyZWdpb24pYCAoTj1gciBtYWxheWljX2hhcHB5X2xlbW1hX2ZyZXFfcGVyY19ieV9yZWdpb24gJT4lIHVuZ3JvdXAoKSAlPiUgZmlsdGVyKGxlbW1hPT0nSEFQUFknKSAlPiUgZmlsdGVyKHBlcmNfbGVtbWFfYnlfcmVnaW9uPT1tYXgocGVyY19sZW1tYV9ieV9yZWdpb24pKSAlPiUgcHVsbChuKWA7IHRoYXQgaXMsIGByIG1hbGF5aWNfaGFwcHlfbGVtbWFfZnJlcV9wZXJjX2J5X3JlZ2lvbiAlPiUgdW5ncm91cCgpICU+JSBmaWx0ZXIobGVtbWE9PSdIQVBQWScpICU+JSBmaWx0ZXIocGVyY19sZW1tYV9ieV9yZWdpb249PW1heChwZXJjX2xlbW1hX2J5X3JlZ2lvbikpICU+JSBwdWxsKHBlcmNfbGVtbWFfYnlfcmVnaW9uKWAlIG9mIHRoZSB0b3RhbCBgciBzdW0oZmlsdGVyKG1hbGF5aWNfaGFwcHlfbGVtbWFfZnJlcV9wZXJjX2J5X3JlZ2lvbiwgcmVnaW9uID09IHB1bGwoZmlsdGVyKGZpbHRlcih1bmdyb3VwKG1hbGF5aWNfaGFwcHlfbGVtbWFfZnJlcV9wZXJjX2J5X3JlZ2lvbiksIGxlbW1hID09ICJIQVBQWSIpLCBwZXJjX2xlbW1hX2J5X3JlZ2lvbiA9PSBtYXgocGVyY19sZW1tYV9ieV9yZWdpb24pKSwgcmVnaW9uKSkkbilgIHRva2VucyBmcm9tIGFsbCBjb25jZXB0cyBpbiB0aGlzIHJlZ2lvbikgY29tcGFyZWQgdG8gdGhlIG90aGVyIGByIG51bWJlcnMyd29yZHMobnJvdyhmaWx0ZXIoYXJyYW5nZShmaWx0ZXIodW5ncm91cChtYWxheWljX2hhcHB5X2xlbW1hX2ZyZXFfcGVyY19ieV9yZWdpb24pLCBsZW1tYSA9PSAiSEFQUFkiKSwgZGVzYyhwZXJjX2xlbW1hX2J5X3JlZ2lvbikpLCBwZXJjX2xlbW1hX2J5X3JlZ2lvbiAhPSBtYXgocGVyY19sZW1tYV9ieV9yZWdpb24pKSkpYCByZWdpb25zIChpLmUuLCBXZXN0IEphdmEgW2ByIG1hbGF5aWNfaGFwcHlfbGVtbWFfZnJlcV9wZXJjX2J5X3JlZ2lvbiAlPiUgdW5ncm91cCgpICU+JSBmaWx0ZXIobGVtbWE9PSdIQVBQWScpICU+JSBmaWx0ZXIocmVnaW9uID09ICJXZXN0IEphdmEiKSAlPiUgcHVsbChwZXJjX2xlbW1hX2J5X3JlZ2lvbilgJTsgTj1gciBtYWxheWljX2hhcHB5X2xlbW1hX2ZyZXFfcGVyY19ieV9yZWdpb24gJT4lIHVuZ3JvdXAoKSAlPiUgZmlsdGVyKGxlbW1hPT0nSEFQUFknKSAlPiUgZmlsdGVyKHJlZ2lvbiA9PSAiV2VzdCBKYXZhIikgJT4lIHB1bGwobilgXTsgV2VzdCBLYWxpbWFudGFuIFtgciBtYWxheWljX2hhcHB5X2xlbW1hX2ZyZXFfcGVyY19ieV9yZWdpb24gJT4lIHVuZ3JvdXAoKSAlPiUgZmlsdGVyKGxlbW1hPT0nSEFQUFknKSAlPiUgZmlsdGVyKHJlZ2lvbiA9PSAiV2VzdCBLYWxpbWFudGFuIikgJT4lIHB1bGwocGVyY19sZW1tYV9ieV9yZWdpb24pYCU7IE49YHIgbWFsYXlpY19oYXBweV9sZW1tYV9mcmVxX3BlcmNfYnlfcmVnaW9uICU+JSB1bmdyb3VwKCkgJT4lIGZpbHRlcihsZW1tYT09J0hBUFBZJykgJT4lIGZpbHRlcihyZWdpb24gPT0gIldlc3QgS2FsaW1hbnRhbiIpICU+JSBwdWxsKG4pYF07IFdlc3QgU3VtYXRyYSBbYHIgbWFsYXlpY19oYXBweV9sZW1tYV9mcmVxX3BlcmNfYnlfcmVnaW9uICU+JSB1bmdyb3VwKCkgJT4lIGZpbHRlcihsZW1tYT09J0hBUFBZJykgJT4lIGZpbHRlcihyZWdpb24gPT0gIldlc3QgU3VtYXRyYSIpICU+JSBwdWxsKHBlcmNfbGVtbWFfYnlfcmVnaW9uKWAlOyBOPWByIG1hbGF5aWNfaGFwcHlfbGVtbWFfZnJlcV9wZXJjX2J5X3JlZ2lvbiAlPiUgdW5ncm91cCgpICU+JSBmaWx0ZXIobGVtbWE9PSdIQVBQWScpICU+JSBmaWx0ZXIocmVnaW9uID09ICJXZXN0IFN1bWF0cmEiKSAlPiUgcHVsbChuKWBdOyBFYXN0IE51c2EgVGVuZ2dhcmEgW2ByIG1hbGF5aWNfaGFwcHlfbGVtbWFfZnJlcV9wZXJjX2J5X3JlZ2lvbiAlPiUgdW5ncm91cCgpICU+JSBmaWx0ZXIobGVtbWE9PSdIQVBQWScpICU+JSBmaWx0ZXIocmVnaW9uID09ICJFYXN0IE51c2EgVGVuZ2dhcmEiKSAlPiUgcHVsbChwZXJjX2xlbW1hX2J5X3JlZ2lvbilgJTsgTj1gciBtYWxheWljX2hhcHB5X2xlbW1hX2ZyZXFfcGVyY19ieV9yZWdpb24gJT4lIHVuZ3JvdXAoKSAlPiUgZmlsdGVyKGxlbW1hPT0nSEFQUFknKSAlPiUgZmlsdGVyKHJlZ2lvbiA9PSAiRWFzdCBOdXNhIFRlbmdnYXJhIikgJT4lIHB1bGwobilgXTsgYW5kIEphbWJpIFByb3ZpbmNlIFtgciBtYWxheWljX2hhcHB5X2xlbW1hX2ZyZXFfcGVyY19ieV9yZWdpb24gJT4lIHVuZ3JvdXAoKSAlPiUgZmlsdGVyKGxlbW1hPT0nSEFQUFknKSAlPiUgZmlsdGVyKHJlZ2lvbiA9PSAiSmFtYmkgUHJvdmluY2UiKSAlPiUgcHVsbChwZXJjX2xlbW1hX2J5X3JlZ2lvbilgJTsgTj1gciBtYWxheWljX2hhcHB5X2xlbW1hX2ZyZXFfcGVyY19ieV9yZWdpb24gJT4lIHVuZ3JvdXAoKSAlPiUgZmlsdGVyKGxlbW1hPT0nSEFQUFknKSAlPiUgZmlsdGVyKHJlZ2lvbiA9PSAiSmFtYmkgUHJvdmluY2UiKSAlPiUgcHVsbChuKWBdKS4gVGhlIHByZXNlbmNlIG9mIG1vcnBocyByZWZlcnJpbmcgdG8gRW5nbGlzaCBIQVBQWSBhbW9uZyB0aGUgdG9wLWZpdmUgY29uY2VwdHMgc3VnZ2VzdHMgdGhhdCB0aGUgbGV4aWNhbGlzYXRpb24gaW5jb3Jwb3JhdGVzIGZvcmVpZ24gd29yZHMuIEFub3RoZXIgaW50ZXJlc3RpbmcgZmluZGluZyBmcm9tIEZpZ3VyZSBbXEByZWYoZmlnOkZJRy10b3AtZml2ZS1IQVBQWS1hY3Jvc3MtcmVnaW9uKV0oI0ZJRy10b3AtZml2ZS1IQVBQWS1hY3Jvc3MtcmVnaW9uKSBpcyB0aGUgZGlzdHJpYnV0aW9uIG9mIFNVS0EsIGluIHdoaWNoIGByIG1heChtYWxheWljX2hhcHB5X2xlbW1hX2ZyZXFfcGVyY19ieV9yZWdpb24kblttYWxheWljX2hhcHB5X2xlbW1hX2ZyZXFfcGVyY19ieV9yZWdpb24kbGVtbWE9PSdTVUtBJ10pYCAoYHIgcm91bmQoKG1heChtYWxheWljX2hhcHB5X2xlbW1hX2ZyZXFfcGVyY19ieV9yZWdpb24kblttYWxheWljX2hhcHB5X2xlbW1hX2ZyZXFfcGVyY19ieV9yZWdpb24kbGVtbWE9PSdTVUtBJ10pL21hbGF5aWNfaGFwcHlfZnJlcV9sZW1tYSRuW21hbGF5aWNfaGFwcHlfZnJlcV9sZW1tYSRsZW1tYT09J1NVS0EnXSkqMTAwLCAyKWAlKSBvZiBpdHMgdG90YWwgYHIgbWFsYXlpY19oYXBweV9mcmVxX2xlbW1hJG5bbWFsYXlpY19oYXBweV9mcmVxX2xlbW1hJGxlbW1hPT0nU1VLQSddYCB0b2tlbnMgZ2xvc3NlZCBhcyAnaGFwcHknIGFyZSB1c2VkIGluIGByIHB1bGwoZmlsdGVyKG1hbGF5aWNfaGFwcHlfZnJlcSwgbGVtbWE9PSdTVUtBJywgcmVnaW9uID09ICJXZXN0IEthbGltYW50YW4iKSwgbGFuZ3VvaWRfbmFtZV9uZXcpYCBpbiBgciBtYXgobWFsYXlpY19oYXBweV9sZW1tYV9mcmVxX3BlcmNfYnlfcmVnaW9uJHJlZ2lvblttYWxheWljX2hhcHB5X2xlbW1hX2ZyZXFfcGVyY19ieV9yZWdpb24kbGVtbWE9PSdTVUtBJ10pYCAoY2YuIHRoZSBwYW5lbCBmb3IgU1VLQSBpbiBGaWd1cmUgW1xAcmVmKGZpZzpGSUctdG9wLWZpdmUtSEFQUFktYWNyb3NzLXJlZ2lvbildKCNGSUctdG9wLWZpdmUtSEFQUFktYWNyb3NzLXJlZ2lvbikpOyBtb3JwaHMgZXZva2luZyBTVUtBIGFyZSBub3QgYXR0ZXN0ZWQgdG8gYmUgZ2xvc3NlZCBhcyAnaGFwcHknIG9yICdnbGFkJyBpbiB0aGUgY29ycG9yYSBmb3IgdGhlIG90aGVyIHJlZ2lvbnMsIGV4Y2VwdCBpbiBXZXN0IEthbGltYW50YW4gYW5kIEVhc3QgTnVzYSBUZW5nZ2FyYS4NCg0KYGBge3IgYW5hbHlzaXMtb2Ytc3VrYS1hcy1saWtlLXZzLWhhcHB5LCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0NCiMgZmlsdGVyIHRoZSAnaGFwcHknIGRhdGEgb2YgU1VLQSBhbmQgU0VOQU5HIGZvciBXZXN0IEthbGltYW50YW4gYW5kIEVhc3QgTnVzYSBUZW5nZ2FyYQ0Kc3VrYV9zZW5hbmdfaGFwcHkgPC0gbWFsYXlpY19oYXBweV9sZW1tYV9mcmVxX3BlcmNfYnlfcmVnaW9uICU+JSANCiAgZmlsdGVyKGxlbW1hICVpbiUgYygiU0VOQU5HIiwgIlNVS0EiKSwgDQogICAgICAgICByZWdpb24gJWluJSBjKCJXZXN0IEthbGltYW50YW4iLCAiRWFzdCBOdXNhIFRlbmdnYXJhIikpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHNlbnNlID0gImhhcHB5IikgJT4lIA0KICBhcnJhbmdlKGRlc2MocmVnaW9uKSwgZGVzYyhuKSkgJT4lIA0KICBzZWxlY3QoLXBlcmNfbGVtbWFfYnlfcmVnaW9uKQ0KDQplbHNld2hlcmVfcmVnaW9uc18yIDwtIG1hbGF5aWNfaGFwcHlfbGVtbWFfZnJlcV9wZXJjX2J5X3JlZ2lvbiAlPiUgDQogIGZpbHRlcihsZW1tYSAlaW4lIGMoIlNFTkFORyIsICJTVUtBIiksIA0KICAgICAgICAgIXJlZ2lvbiAlaW4lIGMoIldlc3QgS2FsaW1hbnRhbiIsICJFYXN0IE51c2EgVGVuZ2dhcmEiKSkgJT4lIA0KICBwdWxsKHJlZ2lvbikgJT4lIA0KICB1bmlxdWUoKQ0KDQpzdWthX3NlbmFuZ19oYXBweV9lbHNld2hlcmUgPC0gbWFsYXlpY19oYXBweV9sZW1tYV9mcmVxX3BlcmNfYnlfcmVnaW9uICU+JSANCiAgZmlsdGVyKGxlbW1hICVpbiUgYygiU0VOQU5HIiwgIlNVS0EiKSwgDQogICAgICAgICAhcmVnaW9uICVpbiUgYygiV2VzdCBLYWxpbWFudGFuIiwgIkVhc3QgTnVzYSBUZW5nZ2FyYSIpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZShzZW5zZSA9ICJoYXBweSIpICU+JSANCiAgYXJyYW5nZShkZXNjKHJlZ2lvbiksIGRlc2MobikpICU+JSANCiAgc2VsZWN0KC1wZXJjX2xlbW1hX2J5X3JlZ2lvbikgJT4lIA0KICBtdXRhdGUocmVnaW9uID0gImVsc2V3aGVyZSIpICU+JSANCiAgZ3JvdXBfYnkocmVnaW9uLCBsZW1tYSwgc2Vuc2UpICU+JSANCiAgc3VtbWFyaXNlKG4gPSBzdW0obiksIC5ncm91cHMgPSAiZHJvcCIpDQoNCnNvdXJjZSgibWFsYXlpY19MSUtFX2FuYWx5c2lzX2NvZGUuUiIpDQoNCnN1a2Ffc2VuYW5nX2FzX2hhcHB5X2FuZF9saWtlIDwtIGJpbmRfcm93cyhzdWthX3NlbmFuZ19oYXBweSwgc3VrYV9zZW5hbmdfaGFwcHlfZWxzZXdoZXJlLCBsaWtlX2FsbF92ZXJiX2xlbW1hKSAlPiUgDQogIGdyb3VwX2J5KHJlZ2lvbiwgbGVtbWEpICU+JSANCiAgbXV0YXRlKHBlcmNfc2Vuc2VfYnlfbGVtbWEgPSByb3VuZChuIC8gc3VtKG4pICogMTAwLCAyKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBhcnJhbmdlKGRlc2MocmVnaW9uKSwgbGVtbWEsIGRlc2MocGVyY19zZW5zZV9ieV9sZW1tYSkpICU+JSANCiAgbXV0YXRlKHJlZ2lvbiA9IHJlcGxhY2UocmVnaW9uLCByZWdpb24gPT0gImVsc2V3aGVyZSIsICJFbHNld2hlcmUiKSwNCiAgICAgICAgIHJlZ2lvbiA9IGZhY3RvcihyZWdpb24sIGxldmVscyA9IGMoIldlc3QgS2FsaW1hbnRhbiIsICJFYXN0IE51c2EgVGVuZ2dhcmEiLCAiRWxzZXdoZXJlIikpKQ0KDQplbHNld2hlcmVfcmVnaW9uc19hbGwgPC0gdW5pcXVlKGMoZWxzZXdoZXJlX3JlZ2lvbnNfMiwgZWxzZXdoZXJlX3JlZ2lvbnNfMSkpDQpgYGANCg0KT3V0IG9mIGN1cmlvdXNpdHksIHdlIGZ1cnRoZXIgY2hlY2tlZCBpZiBtb3JwaHMgcmVmZXJyaW5nIHRvIHRoZSBjb25jZXB0IFNVS0EgYXJlIGV4Y2x1c2l2ZWx5IHVzZWQgdG8gZW5jb2RlICdoYXBweScvJ2dsYWQnIGluIHRoZSBjb3Jwb3JhIGZyb20gdGhlIHR3byByZWdpb25zIGFuZCB0aGUgcmVzdHMuIFRoZSBtb3RpdmF0aW9uIGZvciB0aGlzIGlzIHRoYXQgaW4gdGhlIHN0YW5kYXJkIEluZG9uZXNpYW4gbGFuZ3VhZ2UsIFNVS0EgdGVuZHMgdG8gbGV4aWNhbGlzZSB2ZXJiYWwgY29uY2VwdCBvZiBMSUtJTkcuIFRvIHZlcmlmeSB0aGlzIGFzc3VtcHRpb24sIHdlIHNlYXJjaGVkIGZvciB0aGUgbW9ycGhzIGdsb3NzZWQgYXMgJ2xpa2UnIGFuZCBjaGVjayBpZiB0aGUgbW9ycGhzIGluY2x1ZGUgdGhvc2UgcmVmZXJyaW5nIHRvIEhBUFBJTkVTUyBjb25jZXB0cyBpbiB0aGUgdG9wLWZpdmUgbGlzdC4gV2UgZm91bmQgdGhhdCBvbmx5IG1vcnBocyByZWZlcnJpbmcgdG8gU0VOQU5HIChpbiBhZGRpdGlvbiB0byBTVUtBKSBhcmUgYXR0ZXN0ZWQgdG8gYmUgZ2xvc3NlZCBhcyAnbGlrZSdeW1dlIGZvdW5kIHRoYXQgdGhlIG1vcnBocyAqbmFrc2lyKiBhbmQgKm5ha3NlciogYXJlIGdsb3NzZWQgd2l0aCAndG8gbGlrZScsIGVzcGVjaWFsbHkgaW4gYSByb21hbnRpYyBzZW5zZS4gSG93ZXZlciwgdGhleSBvY2N1ciB2ZXJ5IHJhcmVseSAoTj1gciBucm93KGZpbHRlcihub25fa2FsYmFyX250dCwgc3RyX2RldGVjdChtb3JwaHMsICdebicpKSlgKSwgb25jZSBpbiBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgbGFuZ3VhZ2VzOiBgciBwYXN0ZShwdWxsKGZpbHRlcihub25fa2FsYmFyX250dCwgc3RyX2RldGVjdChtb3JwaHMsICdebicpKSwgbGFuZ3VvaWRfbmFtZV9uZXcpLCBjb2xsYXBzZSA9ICI7ICIpYC4gV2UgZXhjbHVkZWQgKm5ha3NpciogYW5kICpuYWtzZXIqIGZvciB0aGUgYW5hbHlzaXMgcmVwb3J0ZWQgaW4gRmlndXJlIFtcQHJlZihmaWc6RklHLXN1a2EtYXMtbGlrZS12cy1oYXBweSldKCNGSUctc3VrYS1hcy1saWtlLXZzLWhhcHB5KSBzaW5jZSB0aGV5IGFyZSBub3QgZm91bmQgdG8gYmUgZ2xvc3NlZCBhcyAnaGFwcHkvZ2xhZC9qb3lmdWwnIGluIHRoZSBkYXRhYmFzZS5dLiBXZSB0aGVuIGNhbGN1bGF0ZWQgdGhlIHJlbGF0aXZlIGZyZXF1ZW5jeSAoaS5lLiwgaW4gcGVyY2VudGFnZXMpIG9mICd0byBsaWtlJyBhbmQgJ2hhcHB5JyB0byBiZSBsZXhpY2FsaXNlZCBieSBtb3JwaHMgZm9yIFNVS0EgYW5kIFNFTkFORyBpbiB0aGUgdHdvIHJlZ2lvbnMgYW5kIHRoZSBvdGhlciByZWdpb25zIGluIHRoZSBkYXRhYmFzZS4gVGhlIHJlc3VsdHMgYXJlIHZpc3VhbGlzZWQgaW4gRmlndXJlIFtcQHJlZihmaWc6RklHLXN1a2EtYXMtbGlrZS12cy1oYXBweSldKCNGSUctc3VrYS1hcy1saWtlLXZzLWhhcHB5KS4NCg0KDQpgYGB7ciBGSUctc3VrYS1hcy1saWtlLXZzLWhhcHB5LCBmaWcuY2FwID0gIkRpc3RyaWJ1dGlvbiBvZiBtb3JwaHMgZm9yIHRoZSBjb25jZXB0cyBTRU5BTkcgYW5kIFNVS0EgdGhhdCBleHByZXNzICdoYXBweScgYW5kICd0byBsaWtlJyBpbiBXZXN0IEthbGltYW50YW4sIEVhc3QgTnVzYSBUZW5nZ2FyYSwgYW5kIEVsc2V3aGVyZSIsIGZpZy5hc3AgPSAuNX0NCnN1a2Ffc2VuYW5nX2FzX2hhcHB5X2FuZF9saWtlICU+JSANCiAgZmlsdGVyKGxlbW1hICE9ICJOQUtTSVIiKSAlPiUgIyBleGNsdWRlICduYWtzaXInDQogIGdncGxvdChhZXMoeCA9IGxlbW1hLCB5ID0gcGVyY19zZW5zZV9ieV9sZW1tYSwgZmlsbCA9IHNlbnNlKSkgKyANCiAgZ2VvbV9jb2wocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArIA0KICBmYWNldF93cmFwKH5yZWdpb24pICsNCiAgbGFicyh5ID0gIiUgb2YgZ2xvc3NlcyBieSBjb25jZXB0IiwNCiAgICAgICB4ID0gIkNvbmNlcHRzIiwNCiAgICAgICBmaWxsID0gIkdsb3NzZXMiLA0KICAgICAgIGNhcHRpb24gPSAiTnVtYmVycyBpbiBicmFja2V0cyBhcmUgcmF3IGZyZXF1ZW5jaWVzLiIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI0ZCODA3MiIsICIjODBCMUQzIikpICsNCiAgdGhlbWVfYncoKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwYXN0ZSgiKE49IiwgbiwgIikiLCBzZXAgPSAiIikpLCANCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjkpLCANCiAgICAgICAgICAgIHZqdXN0ID0gLS41LA0KICAgICAgICAgICAgc2l6ZSA9IDIuNSwgZm9udGZhY2UgPSAiYm9sZCIpDQpgYGANCg0KQXMgY2FuIGJlIHNlZW4gZnJvbSBhbGwgcGFuZWxzIGluIEZpZ3VyZSBbXEByZWYoZmlnOkZJRy1zdWthLWFzLWxpa2UtdnMtaGFwcHkpXSgjRklHLXN1a2EtYXMtbGlrZS12cy1oYXBweSksIG1vcnBocyByZWZlcnJpbmcgdG8gU1VLQSBhcmUgb3ZlcndoZWxtaW5nbHkgdXNlZCB0byBleHByZXNzICd0byBsaWtlJyB0aGFuICdoYXBweScgaW4gS3VwYW5nIE1hbGF5IChFYXN0IE51c2EgVGVuZ2dhcmEpLCB0aGUgTWFsYXlpYyB2YXJpZXRpZXMgb2YgV2VzdCBLYWxpbWFudGFuIChpLmUuLCBQb250aWFuYWsgTWFsYXksIFNhbWJhcyBNYWxheSwgS2V0YXBhbmcgTWFsYXksIGFuZCBEYXlhayBLZW5pbmphbCksIGFuZCBpbiB0aGUgb3RoZXIgcmVnaW9ucyBjb2RlZCBpbiB0aGUgZGF0YWJhc2VeW1JlZ2lvbnMgY29uc3RpdHV0aW5nIHRoZSAiRWxzZXdoZXJlIiBjYXRlZ29yeSBpbiBGaWd1cmUgW1xAcmVmKGZpZzpGSUctc3VrYS1hcy1saWtlLXZzLWhhcHB5KV0oI0ZJRy1zdWthLWFzLWxpa2UtdnMtaGFwcHkpIGFyZSBhcyBmb2xsb3dzOiBgciBwYXN0ZShzb3J0KGVsc2V3aGVyZV9yZWdpb25zX2FsbFshZWxzZXdoZXJlX3JlZ2lvbnNfYWxsICVpbiUgYygiRWFzdCBOdXNhIFRlbmdnYXJhIiwgIldlc3QgS2FsaW1hbnRhbiIpXSksIGNvbGxhcHNlID0gIjsgIilgXS4gSXQgaXMgYWxzbyBub3cgY2xlYXIgdGhhdCB0aGUgZ2xvc3Npbmcgb2YgU1VLQSBhcyAnaGFwcHknIGluIFdlc3QgS2FsaW1hbnRhbiBpcyBhIG1pbm9yaXR5IGNvbXBhcmVkIHRvIGl0cyBwcmVkb21pbmFudCBnbG9zcyBvZiAndG8gbGlrZScsIGV2ZW4gdGhvdWdoIHRoZSBwcm9wb3J0aW9uIG9mIFNVS0EgYXMgJ2hhcHB5JyBpcyBzdGlsbCB0aGUgaGlnaGVzdCBpbiBXZXN0IEthbGltYW50YW4uIEZpZ3VyZSBbXEByZWYoZmlnOkZJRy1zdWthLWFzLWxpa2UtdnMtaGFwcHkpXSgjRklHLXN1a2EtYXMtbGlrZS12cy1oYXBweSkgYWxzbyBzaG93cyB0aGF0IG1vcnBocyByZWZlcnJpbmcgdG8gU0VOQU5HIGFyZSBmb3VuZCB0byBiZSBnbG9zc2VkIGFzICd0byBsaWtlJy4gSG93ZXZlciwgaXQgaXMgcmFyZSBmb3IgS3VwYW5nIE1hbGF5IGFuZCB0aGUgb3RoZXIgcmVnaW9ucywgYnV0IGlzIG5vdCB0aGUgY2FzZSBmb3IgdGhlIE1hbGF5aWMgdmFyaWV0aWVzIGluIFdlc3QgS2FsaW1hbnRhbiBzaW5jZSB0aGUgbW9ycGhzIHJlZmVycmluZyB0byBTRU5BTkcgYXBwZWFycyB0byBoYXZlIHJlbGF0aXZlbHkgc2ltaWxhciBwcm9wb3J0aW9uIGluIGxleGljYWxpc2luZyAnaGFwcHknIChgciBwdWxsKGZpbHRlcihzdWthX3NlbmFuZ19hc19oYXBweV9hbmRfbGlrZSwgcmVnaW9uID09ICJXZXN0IEthbGltYW50YW4iLCBsZW1tYSA9PSAiU0VOQU5HIiwgc2Vuc2UgPT0gImhhcHB5IiksIHBlcmNfc2Vuc2VfYnlfbGVtbWEpYCUpIGFuZCAndG8gbGlrZScgKGByIHB1bGwoZmlsdGVyKHN1a2Ffc2VuYW5nX2FzX2hhcHB5X2FuZF9saWtlLCByZWdpb24gPT0gIldlc3QgS2FsaW1hbnRhbiIsIGxlbW1hID09ICJTRU5BTkciLCBzZW5zZSA9PSAidG8gbGlrZSIpLCBwZXJjX3NlbnNlX2J5X2xlbW1hKWAlKS4gVGhlIHF1ZXN0aW9uIGFzIHRvIHdoZXRoZXIgdGhpcyBjb3VsZCBiZSB2YXJpYXRpb24gYmV0d2VlbiBwZW9wbGUgd2hvIGRpZCB0aGUgY29kaW5nIG9mIHRoZSBnbG9zc2luZyBmb3IgbW9ycGhzIGVuY29kaW5nIFNVS0EgYW5kIFNFTkFORyAoaSkgcmVtYWlucyB1bmNsZWFyLCBhbmQgKGlpKSByZXF1aXJlcyBpbi1kZXB0aCBzdHVkeSBmb3IgdGhlIHVzYWdlIGNvbnRleHRzIG9mIFNVS0EgYW5kIFNFTkFORyBhcyB0byB3aGVuL3doeSB0aGV5IHdlcmUgY29kZWQgYXMgJ2hhcHB5JyB2cy4gJ3RvIGxpa2UnLiANCg0KVGhlIG5leHQgYW5hbHlzaXMgdG8gcmVwb3J0IGluIHRoaXMgc3ViLXNlY3Rpb24gaXMgdGhlIHR5cGUgZnJlcXVlbmN5IGFuYWx5c2lzLCBtZWFzdXJpbmcgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgSEFQUElORVNTIGNvbmNlcHRzIGF0dGVzdGVkIGluIGVhY2ggcmVnaW9uLiBXZSBmb3VuZCB0aGF0LCBvZiB0aGUgZWxldmVuIHJlZ2lvbnMsIHRoZSBgciBudW1iZXJzMndvcmRzKG5yb3coZmlsdGVyKG1hbGF5aWNfaGFwcHlfbGVtbWFfdHlwZWZyZXFfYnlfcmVnaW9uLCBuX3R5cGVfbGVtbWEgPiBtZWFuKG1hbGF5aWNfaGFwcHlfbGVtbWFfdHlwZWZyZXFfYnlfcmVnaW9uJG5fdHlwZV9sZW1tYSkpKSlgIHJlZ2lvbnMgZXhoaWJpdGluZyB0aGUgaGlnaGVzdCB0eXBlIGZyZXF1ZW5jeSBhcmUgYHIgcmVnaW9uX3dpdGhfYWJvdmVfYXZlcmFnZV90eXBlZnJlcSRyZWdpb25bcmVnaW9uX3dpdGhfYWJvdmVfYXZlcmFnZV90eXBlZnJlcSRuX3R5cGVfbGVtbWEgPT0gbWF4KHJlZ2lvbl93aXRoX2Fib3ZlX2F2ZXJhZ2VfdHlwZWZyZXEkbl90eXBlX2xlbW1hKV1gIChgciBudW1iZXJzMndvcmRzKHJlZ2lvbl93aXRoX2Fib3ZlX2F2ZXJhZ2VfdHlwZWZyZXEkbl90eXBlX2xlbW1hWzFdKWAgZGlmZmVyZW50IHR5cGVzIG9mIHRoZSBIQVBQSU5FU1MgY29uY2VwdHMpLCBgciByZWdpb25fd2l0aF9hYm92ZV9hdmVyYWdlX3R5cGVmcmVxJHJlZ2lvblsyXWAgKGByIG51bWJlcnMyd29yZHMocmVnaW9uX3dpdGhfYWJvdmVfYXZlcmFnZV90eXBlZnJlcSRuX3R5cGVfbGVtbWFbMl0pYCB0eXBlcyksIGFuZCB0aHJlZSBvdGhlciByZWdpb25zIChpLmUuLCBgciBwYXN0ZShyZWdpb25fd2l0aF9hYm92ZV9hdmVyYWdlX3R5cGVmcmVxJHJlZ2lvblszOm5yb3cocmVnaW9uX3dpdGhfYWJvdmVfYXZlcmFnZV90eXBlZnJlcSldLCBjb2xsYXBzZSA9ICIsICIpYCkgd2l0aCB0aWVzIChgciBudW1iZXJzMndvcmRzKHVuaXF1ZShyZWdpb25fd2l0aF9hYm92ZV9hdmVyYWdlX3R5cGVmcmVxJG5fdHlwZV9sZW1tYVszOm5yb3cocmVnaW9uX3dpdGhfYWJvdmVfYXZlcmFnZV90eXBlZnJlcSldKSlgIHR5cGVzKS4NCg0KIyMgRGlzdHJpYnV0aW9uIG9mIG1vcnBocyBhY3Jvc3MgdGhlIHJlZ2lvbg0KDQpJbiB0aGUgcHJldmlvdXMgdHdvIHN1Yi1zZWN0aW9ucywgd2UgZm9jdXMgb24gZ2VuZXJpYywgYWJzdHJhY3QgbGV2ZWwgb2YgY29uY2VwdHVhbCBjYXRlZ29yaWVzLCByZWZlcnJlZCB0byBieSB0aGUgc3BlY2lmaWMgbW9ycGhzLiBJdCBpcyBhbHNvIHBvc3NpYmxlIG5vdyB0byBleHBsb3JlIGNvbmNyZXRlLCBsZXhpY2FsaXNhdGlvbnMgb2YgZWFjaCBjb25jZXB0IGFjcm9zcyB0aGUgcmVsZXZhbnQgcmVnaW9ucywgYW5kIHJldmVhbCB0aGUgcGhvbmVtaWMgdmFyaWF0aW9uIG9mIG1vcnBocyBmb3IgYSBnaXZlbiBjb25jZXB0IGJvdGggcXVhbGl0YXRpdmVseSBhbmQgcXVhbnRpdGF0aXZlbHkuIEZvciB0aGUgcmVhc29uIG9mIHNwYWNlLCB3ZSBpbGx1c3RyYXRlIHRoaXMgaWRlYSB3aXRoIFNFTkFOR15bV2l0aGluIHRoZSBgZmlndXJlc2AgZm9sZGVyIGluIHRoZSBzdXBwbGVtZW50YXJ5IG1hdGVyaWFscyByZXBvc2l0b3J5IFtAcmFqZWdfY29kZWRhdGFfMjAyMV0sIHdlIGluY2x1ZGVkIHR3byBwbG90cyBzaG93aW5nIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbW9ycGhzIGV2b2tpbmcgQkFIQUdJQSBhbmQgSEFQUFkgYXMgaW4gRmlndXJlIFtcQHJlZihmaWc6RklHLXNlbmFuZy1vcnRvZ3JhZmlzLWRhdGEpXSgjRklHLXNlbmFuZy1vcnRvZ3JhZmlzLWRhdGEpLl0uIEZpZ3VyZSBbXEByZWYoZmlnOkZJRy1zZW5hbmctb3J0b2dyYWZpcy1kYXRhKV0oI0ZJRy1zZW5hbmctb3J0b2dyYWZpcy1kYXRhKSBtYXBzIG91dCBhbGwgbW9ycGhzIHJlZmVycmluZyB0byBTRU5BTkc7IHRoZSBtb3JwaHMgbGFiZWxzIGFyZSBhdmFpbGFibGUgZnJvbSB0aGUgYG1vcnBocy5jc3ZgIGZpbGUgKGNmLiBGaWd1cmUgW1xAcmVmKGZpZzptcGktY29ycHVzLXJlbGF0aW9uc2hpcCldKCNtcGktY29ycHVzLXJlbGF0aW9uc2hpcCkpIGFuZCBpbmNvcnBvcmF0ZWQgaW50byB0aGUgYE1vcnBoc2AgY29sdW1uIChjZi4gVGFibGUgW1xAcmVmKHRhYjpoYXBweS13b3JkLXNuaXBwZXQpXSgjaGFwcHktd29yZC1zbmlwcGV0KSkuDQoNCg0KYGBge3IgRklHLXNlbmFuZy1vcnRvZ3JhZmlzLWRhdGEsIGZpZy5jYXAgPSAiRGlzdHJpYnV0aW9uIG9mIG1vcnBocyByZWFsaXNpbmcgdGhlIGNvbmNlcHQgU0VOQU5HIGFjcm9zcyB0aGUgcmVnaW9ucyJ9DQpzZW5hbmdfb3J0aG8gPC0gbWFsYXlpY19oYXBweV9mcmVxICU+JSANCiAgZmlsdGVyKGxlbW1hID09ICJTRU5BTkciKSAlPiUgDQogIHNlbGVjdChyZWdpb24sIHByb3ZpbmNlLCBtb3JwaHMsIG4sIGxhdGl0dWRlLCBsb25naXR1ZGUpICU+JSANCiAgZ3JvdXBfYnkocmVnaW9uLCBwcm92aW5jZSwgbW9ycGhzLCBsYXRpdHVkZSwgbG9uZ2l0dWRlKSAlPiUgDQogIHN1bW1hcmlzZShuID0gc3VtKG4pLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGdyb3VwX2J5KHByb3ZpbmNlLCByZWdpb24pICU+JSANCiAgbXV0YXRlKHBlcmNfbW9ycGhzX2J5X3JlZ2lvbiA9IHJvdW5kKChuIC8gc3VtKG4pKSAqIDEwMCwgMikpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHJlZ2lvbiA9IGZhY3RvcihyZWdpb24sIGxldmVscyA9IGMoIk5vcnRoIFN1bWF0cmEiLCAiV2VzdCBTdW1hdHJhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkphbWJpIFByb3ZpbmNlIiwgIldlc3QgSmF2YSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXZXN0IEthbGltYW50YW4iLCAiRWFzdCBOdXNhIFRlbmdnYXJhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vcnRoIE1hbHVrdSIsICJQYXB1YSIpKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocmVnaW9uKSwgZGVzYyhuKSkNCg0KIyBjcmVhdGUgdGhlIElORE9ORVNJQU4gcGxvdA0KaW5kb3Bsb3QgPC0gaW5kb21hcCAlPiUgDQogIGdncGxvdCgpICsgDQogIGdlb21fcG9seWdvbihhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXApLA0KICAgICAgICAgICAgICAgZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJncmF5ODAiKSArDQogICMgY29vcmRfZml4ZWQoMS40KSArDQogIHRoZW1lX21hcCgpICsNCiAgbGFicyh4ID0gIkxvbmdpdHVkZSIsIHkgPSAiTGF0aXR1ZGUiKQ0KDQppbmRvcGxvdCArDQogIGdlb21fcG9pbnQoZGF0YSA9IHNlbmFuZ19vcnRobywNCiAgICAgICAgICAgICBhZXMoeCA9IGxvbmdpdHVkZSwgeSA9IGxhdGl0dWRlLCBjb2xvdXIgPSByZWdpb24pKSArDQogIGdlb21fdGV4dF9yZXBlbChkYXRhID0gc2VuYW5nX29ydGhvLA0KICAgICAgICAgICAgICAgICAgYWVzKHggPSBsb25naXR1ZGUsIHkgPSBsYXRpdHVkZSwgbGFiZWwgPSBtb3JwaHMsIA0KICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IHJlZ2lvbiwgc2l6ZSA9IHBlcmNfbW9ycGhzX2J5X3JlZ2lvbiksDQogICAgICAgICAgICAgICAgICAjIGFlcyh4ID0gbG9uZ2l0dWRlLCB5ID0gbGF0aXR1ZGUsIGxhYmVsID0gbW9ycGhzLCBjb2xvdXIgPSByZWdpb24pLA0KICAgICAgICAgICAgICAgICAgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgIyBzY2FsZV9jb2xvdXJfYnJld2VyKHR5cGUgPSAicXVhbCIsIHBhbGV0dGUgPSAiRGFyazIiLCBkaXJlY3Rpb24gPSAxKSArDQogICMgc2NhbGVfY29sb3VyX2JyZXdlcih0eXBlID0gImRpdiIsIHBhbGV0dGUgPSAiU3BlY3RyYWwiKSArDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiIzlFMDE0MiIsICIjRDUzRTRGIiwgIiNGNDZENDMiLCAiI0ZEQUU2MSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI0FCRERBNCIsICIjNjZDMkE1IiwgIiMzMjg4QkQiLCAiIzVFNEZBMiIpKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArDQogIGd1aWRlcyhzaXplID0gRkFMU0UpICsNCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMSwgNSkpICsNCiAgbGFicyhjYXB0aW9uID0gIlRoZSBzaXplIG9mIHRoZSBsYWJlbHMgcmVwcmVzZW50cyB0aGUgcGVyY2VudGFnZXMgb2YgdGhlIG1vcnBocyBwZXIgcmVnaW9uLlxuVGhlIGxhcmdlciB0aGUgc2l6ZSwgdGhlIG1vcmUgZnJlcXVlbnRseSB0aG9zZSBtb3JwaHMgYXJlIGF0dGVzdGVkIGluIHRoZSBjb3JwdXMgb2YgdGhlIHJlZ2lvbi5cbkl0IHNob3VsZCBiZSBub3RlZCB0aGF0IGEgZ2l2ZW4gbW9ycGggY2FuIGJlIHRoZSBvbmx5IHR5cGUgYXR0ZXN0ZWQgaW4gdGhlIGNvcnB1cyBmb3IgYSBnaXZlbiByZWdpb247XG5oZW5jZSwgdGhhdCBzaW5nbGUgdHlwZSByZWNlaXZlcyAxMDAlIGluIHRoZSByZXNwZWN0aXZlIHJlZ2lvbiAoZS5nLiwgdGhlIG1vcnBoIFwic2FuYW5nXCIgaW4gTm9ydGggTWFsdWt1KS4iKQ0KYGBgDQoNCmBgYHtyIG9ydGhvLXNlbmFuZy1leGFtcGxlc30NCiMgV2VzdCBLYWxpbWFudGFuDQprYWxiYXJfZXhfbW9ycGhzIDwtIHNlbmFuZ19vcnRobyAlPiUgDQogIGZpbHRlcihyZWdpb24gPT0gIldlc3QgS2FsaW1hbnRhbiIpICU+JSANCiAgcHVsbChtb3JwaHMpICU+JSANCiAgdW5pcXVlKCkNCg0KIyBKYW1iaQ0KamFtYmlfZXhfbW9ycGhzIDwtIHNlbmFuZ19vcnRobyAlPiUgDQogIGZpbHRlcihyZWdpb24gPT0gIkphbWJpIFByb3ZpbmNlIikgJT4lIA0KICBwdWxsKG1vcnBocykgJT4lIA0KICB1bmlxdWUoKQ0KDQpgYGANCg0KDQpPbmUgcXVhbGl0YXRpdmUgb2JzZXJ2YXRpb24gdGhhdCB3ZSBjYW4gbWFrZSBmcm9tIEZpZ3VyZSBbXEByZWYoZmlnOkZJRy1zZW5hbmctb3J0b2dyYWZpcy1kYXRhKV0oI0ZJRy1zZW5hbmctb3J0b2dyYWZpcy1kYXRhKSBpcyB0aGF0IHBob25lbWljIHZhcmlhdGlvbiBmb3IgdGhlIG1vcnBocyBsZXhpY2FsaXNpbmcgU0VOQU5HIGFwcGVhcnMgaW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgc3lsbGFibGVzLCBzdWNoIGFzIHRoZSB1c2Ugb2YgZGlmZmVyZW50IHZvd2VsIHBob25lbWVzLiBGb3IgaW5zdGFuY2UsIFNFTkFORyBpcyByZWFsaXNlZCBhcyBgciBwYXN0ZShwYXN0ZSgiKiIsIGthbGJhcl9leF9tb3JwaHNbMTpsZW5ndGgoa2FsYmFyX2V4X21vcnBocyktMV0sICIqIiwgc2VwID0gIiIpLCBjb2xsYXBzZSA9ICIsICIpYCwgYW5kICpgciBrYWxiYXJfZXhfbW9ycGhzW2xlbmd0aChrYWxiYXJfZXhfbW9ycGhzKV1gKiBpbiBXZXN0IEthbGltYW50YW4uIE1lYW53aGlsZSBpbiBKYW1iaSBQcm92aW5jZSwgdGhlIG1vcnBocyBjYW4gdmFyeSBpbiB0ZXJtcyBvZiBvbWlzc2lvbiBvZiBwaG9uZW1lcyBpbiB0aGUgZmlyc3Qgc3lsbGFibGUsIHN1Y2ggYXMgKGkpIHRoZSBvbWlzc2lvbiBvZiB2b3dlbCBsZWFkaW5nIHRvIGluaXRpYWwgY29uc29uYW50IGNsdXN0ZXIgKGUuZy4sIGByIHBhc3RlKHBhc3RlKCIqIiwgc3RyX3N1YnNldChqYW1iaV9leF9tb3JwaHMsICJecyIpLCAiKiIsIHNlcCA9ICIiKSwgY29sbGFwc2UgPSAiLCAiKWApIG9yIChpaSkgdGhlIG9taXNzaW9uIG9mIHRoZSBpbml0aWFsICpzKiBjb25zb25hbnQgKGUuZy4sIGByIHBhc3RlKHBhc3RlKCIqIiwgc3RyX3N1YnNldChqYW1iaV9leF9tb3JwaHMsICJecyIsIG5lZ2F0ZSA9IFRSVUUpLCAiKiIsIHNlcCA9ICIiKSwgY29sbGFwc2UgPSAiLCAiKWApIGFuZCBmaW5hbCBjb25zb25hbnQgKGByIHBhc3RlKCIqIiwgc3RyX3N1YnNldChqYW1iaV9leF9tb3JwaHMsICJec25hJCIpLCAiKiIsIHNlcCA9ICIiKWApLiANCg0KYGBge3IgdGFibGUtdHlwZS1mcmVxLW1vcnBocy1TRU5BTkd9DQpzZW5hbmdfb3J0aG9fdHlwZWZyZXEgPC0gc2VuYW5nX29ydGhvICU+JSANCiAgZ3JvdXBfYnkocmVnaW9uKSAlPiUgDQogIHN1bW1hcmlzZShtb3JwaHNfdHlwZSA9IG5fZGlzdGluY3QobW9ycGhzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIGFycmFuZ2UoZGVzYyhtb3JwaHNfdHlwZSkpDQpgYGANCg0KQW5vdGhlciBhc3BlY3Qgb2YgdmFyaWF0aW9uIHRoYXQgY2FuIGJlIGV4cGxvcmVkIGlzIHF1YW50aXRhdGl2ZSBpbiBuYXR1cmUuIE9uZSBleGFtcGxlIGlzIHRoZSBhdmVyYWdlIGxlbmd0aCAobWVhc3VyZWQgYnkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXIpIG9mIHRoZSBtb3JwaHMsIHN1Y2ggdGhhdCB0aGUgbW9ycGhzIGZvciBTRU5BTkcgaW4gSmFtYmkgUHJvdmluY2UgaXMgb24gYXZlcmFnZSBzaG9ydGVyICgkXHRpbGRle3h9JF5bVGhlICIkXHRpbGRle3h9JCIgKGkuZS4sIHRoZSAneCB0aWxkZScpIHN5bWJvbCByZWZlcnMgdG8gYSBtZWFzdXJlIG9mIGNlbnRyYWwgdGVuZGVuY3kgY2FsbGVkIG1lZGlhbiwgd2hpbGUgIklRUiIgc3RhbmRzIGZvciBJbnRlcnF1YXJ0aWxlIFJhbmdlLCB3aGljaCBpcyBhIG1lYXN1cmUgb2YgZGlzcGVyc2lvbiBmb3IgbWVkaWFuLl09YHIgbWVkaWFuKG5jaGFyKGphbWJpX2V4X21vcnBocykpYDsgSVFSPWByIElRUihuY2hhcihqYW1iaV9leF9tb3JwaHMpKWApIHRoYW4gdGhvc2UgaW4gV2VzdCBLYWxpbWFudGFuICgkXHRpbGRle3h9JD1gciBtZWRpYW4obmNoYXIoa2FsYmFyX2V4X21vcnBocykpYDsgSVFSPWByIElRUihuY2hhcihrYWxiYXJfZXhfbW9ycGhzKSlgKS4gV2UgY2FuIGFsc28gbWVhc3VyZSB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCB2YXJpYW50cyBvZiBtb3JwaHMgcGVyIHJlZ2lvbiAoaS5lLiwgdGhlIHR5cGUgZnJlcXVlbmN5KSBhbmQgdGhlIHJlbGF0aXZlIGZyZXF1ZW5jeSBvZiBvY2N1cnJlbmNlIChpLmUuLCByZWxhdGl2ZSB0b2tlbi1mcmVxdWVuY3ksIHN1Y2ggYXMgcGVyY2VudGFnZSkgb2YgYSBnaXZlbiB2YXJpYW50IG92ZXIgdGhlIG90aGVycyAoYm90aCBvZiB0aGVzZSBtZWFzdXJlcyBhcmUgZ3JhcGhpY2FsbHkgcmVwcmVzZW50ZWQgaW4gRmlndXJlIFtcQHJlZihmaWc6RklHLXNlbmFuZy1vcnRvZ3JhZmlzLWRhdGEpXSgjRklHLXNlbmFuZy1vcnRvZ3JhZmlzLWRhdGEpKS4gRm9yIGV4YW1wbGUsIE5vcnRoIFN1bWF0cmEsIFdlc3QgSmF2YSwgTm9ydGggTWFsdWt1IGFsbCBoYXZlIG9ubHkgb25lIHR5cGUgb2YgbW9ycGggZXZva2luZyBTRU5BTkcuIE1lYW53aGlsZSBKYW1iaSBQcm92aW5jZSBhbmQgV2VzdCBLYWxpbWFudGFuIGhhdmUgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIG1vcnBocywgbmFtZWx5IGByIG51bWJlcnMyd29yZHMobWF4KHNlbmFuZ19vcnRob190eXBlZnJlcSRtb3JwaHNfdHlwZSkpYCB0eXBlcywgd2l0aCBFYXN0IE51c2EgVGVuZ2dhcmEgYW5kIFdlc3QgU3VtYXRyYSBoYXZlIHJlc3BlY3RpdmVseSBgciBudW1iZXJzMndvcmRzKHB1bGwoZmlsdGVyKHNlbmFuZ19vcnRob190eXBlZnJlcSwgcmVnaW9uID09ICJFYXN0IE51c2EgVGVuZ2dhcmEiKSwgbW9ycGhzX3R5cGUpKWAgYW5kIGByIG51bWJlcnMyd29yZHMocHVsbChmaWx0ZXIoc2VuYW5nX29ydGhvX3R5cGVmcmVxLCByZWdpb24gPT0gIldlc3QgU3VtYXRyYSIpLCBtb3JwaHNfdHlwZSkpYCB0eXBlcy4gV2UgY2FuIGFsc28gY2FsY3VsYXRlIHRoZSByZWxhdGl2ZSB0b2tlbi1mcmVxdWVuY3kgZm9yIGVhY2ggbW9ycGggYXR0ZXN0ZWQgaW4gdGhlIGNvcnB1cyBvZiBhIGdpdmVuIHJlZ2lvbiB0byByZXZlYWwgdGhlIHByb21pbmVuY2Ugb2YgYSBnaXZlbiB2YXJpYW50IG9mIG1vcnBoIGNvbXBhcmVkIHRvIHRoZSBvdGhlcnMuIEZvciBpbnN0YW5jZSwgdGhlIGByIG51bWJlcnMyd29yZHMocHVsbChmaWx0ZXIoc2VuYW5nX29ydGhvX3R5cGVmcmVxLCByZWdpb24gPT0gIkVhc3QgTnVzYSBUZW5nZ2FyYSIpLCBtb3JwaHNfdHlwZSkpYCB2YXJpYW50cyBvZiBtb3JwaHMgYXR0ZXN0ZWQgaW4gRWFzdCBOdXNhIFRlbmdnYXJhIChpLmUuLCBgciBwYXN0ZShwYXN0ZShwYXN0ZSgiKiIsIHB1bGwoZmlsdGVyKHNlbmFuZ19vcnRobywgcmVnaW9uID09ICJFYXN0IE51c2EgVGVuZ2dhcmEiKSwgbW9ycGhzKSwgIioiLCBzZXAgPSAiIilbMToyXSwgY29sbGFwc2UgPSAiLCAiKSwgIiwgYW5kICIsIHBhc3RlKHBhc3RlKCIqIiwgcHVsbChmaWx0ZXIoc2VuYW5nX29ydGhvLCByZWdpb24gPT0gIkVhc3QgTnVzYSBUZW5nZ2FyYSIpLCBtb3JwaHMpLCAiKiIsIHNlcCA9ICIiKVszXSwgY29sbGFwc2UgPSAiLCAiKSwgc2VwID0gIiIpYCkgaGF2ZSBkaWZmZXJlbnQgcmF0ZSBvZiBvY2N1cnJlbmNlczogKmByIHB1bGwoZmlsdGVyKHNlbmFuZ19vcnRobywgcmVnaW9uID09ICJFYXN0IE51c2EgVGVuZ2dhcmEiLCBuID09IG1heChuKSksIG1vcnBocylgKiBpcyB0aGUgbW9zdCBkb21pbmFudCBvbmUgKGFzIHNob3duIGJ5IGl0cyBsYXJnZXN0IHNpemUgaW4gRmlndXJlIFtcQHJlZihmaWc6RklHLXNlbmFuZy1vcnRvZ3JhZmlzLWRhdGEpXSgjRklHLXNlbmFuZy1vcnRvZ3JhZmlzLWRhdGEpKSAoTj1gciBwdWxsKGZpbHRlcihzZW5hbmdfb3J0aG8sIHJlZ2lvbiA9PSAiRWFzdCBOdXNhIFRlbmdnYXJhIiwgbiA9PSBtYXgobikpLCBuKWA7IGByIHB1bGwoZmlsdGVyKHNlbmFuZ19vcnRobywgcmVnaW9uID09ICJFYXN0IE51c2EgVGVuZ2dhcmEiLCBuID09IG1heChuKSksIHBlcmNfbW9ycGhzX2J5X3JlZ2lvbilgJSksIGZvbGxvd2VkIGJ5ICpgciBwdWxsKGZpbHRlcihmaWx0ZXIoc2VuYW5nX29ydGhvLCByZWdpb24gPT0gIkVhc3QgTnVzYSBUZW5nZ2FyYSIsIG4gIT0gbWF4KG4pKSwgbiA9PSBtYXgobikpLCBtb3JwaHMpYCogKE49YHIgcHVsbChmaWx0ZXIoZmlsdGVyKHNlbmFuZ19vcnRobywgcmVnaW9uID09ICJFYXN0IE51c2EgVGVuZ2dhcmEiLCBuICE9IG1heChuKSksIG4gPT0gbWF4KG4pKSwgbilgOyBgciBwdWxsKGZpbHRlcihmaWx0ZXIoc2VuYW5nX29ydGhvLCByZWdpb24gPT0gIkVhc3QgTnVzYSBUZW5nZ2FyYSIsIG4gIT0gbWF4KG4pKSwgbiA9PSBtYXgobikpLCBwZXJjX21vcnBoc19ieV9yZWdpb24pYCUpIGFuZCAqYHIgcHVsbChmaWx0ZXIoZmlsdGVyKHNlbmFuZ19vcnRobywgcmVnaW9uID09ICJFYXN0IE51c2EgVGVuZ2dhcmEiLCBuICE9IG1heChuKSksIG4gPT0gbWluKG4pKSwgbW9ycGhzKWAqIChOPWByIHB1bGwoZmlsdGVyKGZpbHRlcihzZW5hbmdfb3J0aG8sIHJlZ2lvbiA9PSAiRWFzdCBOdXNhIFRlbmdnYXJhIiwgbiAhPSBtYXgobikpLCBuID09IG1pbihuKSksIG4pYDsgYHIgcHVsbChmaWx0ZXIoZmlsdGVyKHNlbmFuZ19vcnRobywgcmVnaW9uID09ICJFYXN0IE51c2EgVGVuZ2dhcmEiLCBuICE9IG1heChuKSksIG4gPT0gbWluKG4pKSwgcGVyY19tb3JwaHNfYnlfcmVnaW9uKWAlKS4NCg0KDQoNCmBgYHtyIEZJRy1iYWhhZ2lhLW9ydG9ncmFmaXMtZGF0YSwgZmlnLmNhcCA9ICJEaXN0cmlidXRpb24gb2YgbW9ycGhzIHJlYWxpc2luZyB0aGUgY29uY2VwdCBCQUhBR0lBIGFjcm9zcyB0aGUgcmVnaW9ucyIsIGluY2x1ZGUgPSBGQUxTRX0NCmJhaGFnaWFfb3J0aG8gPC0gbWFsYXlpY19oYXBweV9mcmVxICU+JSANCiAgZmlsdGVyKGxlbW1hID09ICJCQUhBR0lBIikgJT4lIA0KICBzZWxlY3QocmVnaW9uLCBwcm92aW5jZSwgbW9ycGhzLCBuLCBsYXRpdHVkZSwgbG9uZ2l0dWRlKSAlPiUgDQogIGdyb3VwX2J5KHJlZ2lvbiwgcHJvdmluY2UsIG1vcnBocywgbGF0aXR1ZGUsIGxvbmdpdHVkZSkgJT4lIA0KICBzdW1tYXJpc2UobiA9IHN1bShuKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBncm91cF9ieShwcm92aW5jZSwgcmVnaW9uKSAlPiUgDQogIG11dGF0ZShwZXJjX21vcnBoc19ieV9yZWdpb24gPSByb3VuZCgobiAvIHN1bShuKSkgKiAxMDAsIDIpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZShyZWdpb24gPSBmYWN0b3IocmVnaW9uLCBsZXZlbHMgPSBjKCJXZXN0IFN1bWF0cmEiLCAiSmFtYmkgUHJvdmluY2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2VzdCBLYWxpbWFudGFuIiwgIkVhc3QgTnVzYSBUZW5nZ2FyYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3J0aCBNYWx1a3UiKSkpDQoNCiMgY3JlYXRlIHRoZSBJTkRPTkVTSUFOIHBsb3QNCmluZG9wbG90IDwtIGluZG9tYXAgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3BvbHlnb24oYWVzKHggPSBsb25nLCB5ID0gbGF0LCBncm91cCA9IGdyb3VwKSwNCiAgICAgICAgICAgICAgIGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSAiZ3JheTgwIikgKw0KICAjIGNvb3JkX2ZpeGVkKDEuNCkgKw0KICB0aGVtZV9tYXAoKSArDQogIGxhYnMoeCA9ICJMb25naXR1ZGUiLCB5ID0gIkxhdGl0dWRlIikNCg0KaW5kb3Bsb3QgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBiYWhhZ2lhX29ydGhvLA0KICAgICAgICAgICAgIGFlcyh4ID0gbG9uZ2l0dWRlLCB5ID0gbGF0aXR1ZGUsIGNvbG91ciA9IHJlZ2lvbikpICsNCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBiYWhhZ2lhX29ydGhvLA0KICAgICAgICAgICAgICAgICAgYWVzKHggPSBsb25naXR1ZGUsIHkgPSBsYXRpdHVkZSwgbGFiZWwgPSBtb3JwaHMsIA0KICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IHJlZ2lvbiwgc2l6ZSA9IHBlcmNfbW9ycGhzX2J5X3JlZ2lvbiksDQogICAgICAgICAgICAgICAgICAjIGFlcyh4ID0gbG9uZ2l0dWRlLCB5ID0gbGF0aXR1ZGUsIGxhYmVsID0gbW9ycGhzLCBjb2xvdXIgPSByZWdpb24pLA0KICAgICAgICAgICAgICAgICAgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgIyBzY2FsZV9jb2xvdXJfYnJld2VyKHR5cGUgPSAicXVhbCIsIHBhbGV0dGUgPSAiRGFyazIiLCBkaXJlY3Rpb24gPSAxKSArDQogICMgc2NhbGVfY29sb3VyX2JyZXdlcih0eXBlID0gImRpdiIsIHBhbGV0dGUgPSAiU3BlY3RyYWwiKSArDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiIzlFMDE0MiIsICIjRkRBRTYxIiwgIiM2NkMyQTUiLCAiIzMyODhCRCIsICIjNUU0RkEyIikpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICsNCiAgZ3VpZGVzKHNpemUgPSBGQUxTRSkgKw0KICBzY2FsZV9zaXplKHJhbmdlID0gYygxLCA1KSkgKw0KICBsYWJzKGNhcHRpb24gPSAiVGhlIHNpemUgb2YgdGhlIGxhYmVscyByZXByZXNlbnRzIHRoZSBwZXJjZW50YWdlcyBvZiB0aGUgbW9ycGhzIHBlciByZWdpb24uXG5UaGUgbGFyZ2VyIHRoZSBzaXplLCB0aGUgbW9yZSBmcmVxdWVudGx5IHRob3NlIG1vcnBocyBhcmUgYXR0ZXN0ZWQgaW4gdGhlIGNvcnB1cyBvZiB0aGUgcmVnaW9uLlxuSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgYSBnaXZlbiBtb3JwaCBjYW4gYmUgdGhlIG9ubHkgdHlwZSBhdHRlc3RlZCBpbiB0aGUgY29ycHVzIGZvciBhIGdpdmVuIHJlZ2lvbjtcbmhlbmNlLCB0aGF0IHNpbmdsZSB0eXBlIHJlY2VpdmVzIDEwMCUgaW4gdGhlIHJlc3BlY3RpdmUgcmVnaW9uIChlLmcuLCB0aGUgbW9ycGggXCJiYWhhZ2lhXCIgaW4gTm9ydGggTWFsdWt1KS4iKQ0KYGBgDQoNCg0KDQpgYGB7ciBGSUctaGFwcHktb3J0b2dyYWZpcy1kYXRhLCBmaWcuY2FwID0gIkRpc3RyaWJ1dGlvbiBvZiBtb3JwaHMgcmVhbGlzaW5nIHRoZSBjb25jZXB0IEhBUFBZIGFjcm9zcyB0aGUgcmVnaW9ucyIsIGluY2x1ZGUgPSBGQUxTRX0NCmhhcHB5X29ydGhvIDwtIG1hbGF5aWNfaGFwcHlfZnJlcSAlPiUgDQogIGZpbHRlcihsZW1tYSA9PSAiSEFQUFkiKSAlPiUgDQogIHNlbGVjdChyZWdpb24sIHByb3ZpbmNlLCBtb3JwaHMsIG4sIGxhdGl0dWRlLCBsb25naXR1ZGUpICU+JSANCiAgZ3JvdXBfYnkocmVnaW9uLCBwcm92aW5jZSwgbW9ycGhzLCBsYXRpdHVkZSwgbG9uZ2l0dWRlKSAlPiUgDQogIHN1bW1hcmlzZShuID0gc3VtKG4pLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGdyb3VwX2J5KHByb3ZpbmNlLCByZWdpb24pICU+JSANCiAgbXV0YXRlKHBlcmNfbW9ycGhzX2J5X3JlZ2lvbiA9IHJvdW5kKChuIC8gc3VtKG4pKSAqIDEwMCwgMikpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHJlZ2lvbiA9IGZhY3RvcihyZWdpb24sIGxldmVscyA9IGMoIldlc3QgU3VtYXRyYSIsICJKYW1iaSBQcm92aW5jZSIsICJXZXN0IEphdmEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2VzdCBLYWxpbWFudGFuIiwgIkVhc3QgTnVzYSBUZW5nZ2FyYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3J0aCBNYWx1a3UiKSkpDQoNCiMgY3JlYXRlIHRoZSBJTkRPTkVTSUFOIHBsb3QNCmluZG9wbG90IDwtIGluZG9tYXAgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3BvbHlnb24oYWVzKHggPSBsb25nLCB5ID0gbGF0LCBncm91cCA9IGdyb3VwKSwNCiAgICAgICAgICAgICAgIGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSAiZ3JheTgwIikgKw0KICAjIGNvb3JkX2ZpeGVkKDEuNCkgKw0KICB0aGVtZV9tYXAoKSArDQogIGxhYnMoeCA9ICJMb25naXR1ZGUiLCB5ID0gIkxhdGl0dWRlIikNCg0KaW5kb3Bsb3QgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBoYXBweV9vcnRobywNCiAgICAgICAgICAgICBhZXMoeCA9IGxvbmdpdHVkZSwgeSA9IGxhdGl0dWRlLCBjb2xvdXIgPSByZWdpb24pKSArDQogIGdlb21fdGV4dF9yZXBlbChkYXRhID0gaGFwcHlfb3J0aG8sDQogICAgICAgICAgICAgICAgICBhZXMoeCA9IGxvbmdpdHVkZSwgeSA9IGxhdGl0dWRlLCBsYWJlbCA9IG1vcnBocywgDQogICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gcmVnaW9uLCBzaXplID0gcGVyY19tb3JwaHNfYnlfcmVnaW9uKSwNCiAgICAgICAgICAgICAgICAgICMgYWVzKHggPSBsb25naXR1ZGUsIHkgPSBsYXRpdHVkZSwgbGFiZWwgPSBtb3JwaHMsIGNvbG91ciA9IHJlZ2lvbiksDQogICAgICAgICAgICAgICAgICBmb250ZmFjZSA9ICJib2xkIikgKw0KICAjIHNjYWxlX2NvbG91cl9icmV3ZXIodHlwZSA9ICJxdWFsIiwgcGFsZXR0ZSA9ICJEYXJrMiIsIGRpcmVjdGlvbiA9IDEpICsNCiAgIyBzY2FsZV9jb2xvdXJfYnJld2VyKHR5cGUgPSAiZGl2IiwgcGFsZXR0ZSA9ICJTcGVjdHJhbCIpICsNCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCIjOUUwMTQyIiwgIiNGREFFNjEiLCAiI0FCRERBNCIsICIjNjZDMkE1IiwgIiMzMjg4QkQiLCAiIzVFNEZBMiIpKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArDQogIGd1aWRlcyhzaXplID0gRkFMU0UpICsNCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMSwgNSkpICsNCiAgbGFicyhjYXB0aW9uID0gIlRoZSBzaXplIG9mIHRoZSBsYWJlbHMgcmVwcmVzZW50cyB0aGUgcGVyY2VudGFnZXMgb2YgdGhlIG1vcnBocyBwZXIgcmVnaW9uLlxuVGhlIGxhcmdlciB0aGUgc2l6ZSwgdGhlIG1vcmUgZnJlcXVlbnRseSB0aG9zZSBtb3JwaHMgYXJlIGF0dGVzdGVkIGluIHRoZSBjb3JwdXMgb2YgdGhlIHJlZ2lvbi5cbkl0IHNob3VsZCBiZSBub3RlZCB0aGF0IGEgZ2l2ZW4gbW9ycGggY2FuIGJlIHRoZSBvbmx5IHR5cGUgYXR0ZXN0ZWQgaW4gdGhlIGNvcnB1cyBmb3IgYSBnaXZlbiByZWdpb247XG5oZW5jZSwgdGhhdCBzaW5nbGUgdHlwZSByZWNlaXZlcyAxMDAlIGluIHRoZSByZXNwZWN0aXZlIHJlZ2lvbiAoZS5nLiwgdGhlIG1vcnBoIFwiaGVwaVwiIGluIEVhc3QgTnVzYSBUZW5nZ2FyYSkuIikNCmBgYA0KDQoNCiMgQ29uY2x1c2lvbg0KDQpUaGlzIGNvcnB1cy1iYXNlZCBzdHVkeSByZXZlYWxzIHRoYXQgSEFQUElORVNTIGlzIG1vc3QgcHJlZG9taW5hbnRseSBsZXhpY2FsaXNlZCBieSBtb3JwaHMgcmVmZXJyaW5nIHRvIHRoZSBjb25jZXB0IFNFTkFORyBpbiB0aGUgY29sbG9xdWlhbCBNYWxheWljIHZhcmlldGllcyBpbiBJbmRvbmVzaWEsIGNvcnJvYm9yYXRpbmcgYSBwcmV2aW91cyBleHBlcmltZW50YWwgc3R1ZHkgb24gSEFQUElORVNTIGNvbmNlcHR1YWwgY2F0ZWdvcmllcyBpbiBJbmRvbmVzaWFuIFtAc2hhdmVyX3N0cnVjdHVyZV8yMDAxLCAyMDhdLiBJdCBpcyBhbHNvIGRlbW9uc3RyYXRlZCB0aGF0IGVhY2ggcmVnaW9uIHZhcmllcyBpbiB0aGUgZGlzdHJpYnV0aW9uIG9mIGVhY2ggSEFQUElORVNTIGNvbmNlcHRzIChlLmcuLCB2YXJpYXRpb24gaW4gdGVybXMgb2YgdGhlIHR5cGUgYW5kIHRva2VuIGZyZXF1ZW5jaWVzIG9mIHRoZSBjb25jZXB0cyBwZXIgcmVnaW9uKS4gQXQgYSBtb3JlIHNwZWNpZmljIGxldmVsLCB3ZSBzaG93IHRoYXQgdGhlIG1vcnBocyBsZXhpY2FsaXNpbmcgYSBnaXZlbiBjb25jZXB0IChlLmcuLCBTRU5BTkcpIGluIGNlcnRhaW4gcmVnaW9ucyBhbHNvIGV4aGliaXQgcXVhbGl0YXRpdmUgKGUuZy4sIHRoZSBwaG9uZW1pYyBzdHJ1Y3R1cmUpIGFuZCBxdWFudGl0YXRpdmUgdmFyaWF0aW9ucyAoZS5nLiwgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgbW9ycGhzIGF0dGVzdGVkIGluIGEgcmVnaW9uIGFuZCB0aGUgbW9ycGhzJyB0b2tlbiBmcmVxdWVuY2llcykuIFRvIGNvbmNsdWRlLCB3ZSBob3BlIHRvIGhhdmUgcHJvdmlkZWQgYSBnbGltcHNlIG9mIGluc2lnaHRzIGZyb20gZXhwbG9yaW5nIHRoZSBvcGVuLWFjY2VzcyBjb3Jwb3JhIG9mIGNvbGxvcXVpYWwgTWFsYXlpYyB2YXJpZXRpZXMgaW4gdGhlIEluZG9uZXNpYW4gYXJjaGlwZWxhZ28gZm9yIHRoZSBzdHVkeSBvZiBlbW90aW9uIGxleGljYWxpc2F0aW9uIGluIHRoZSBjb250ZXh0IG9mIHJlZ2lvbmFsIHZhcmlhdGlvbi4NCg0KIyBSZWZlcmVuY2VzIHstfQ==