Since October 2018, Twitter has been releasing archived datasets of tweets from state-sponsored information operations (IO) identified on its platform to enable independent academic research and investigation. Independent researchers have been analyzing the Twitter IO data to better understand how coordinated campaigns seek to distort public opinion around the world.
On 15 February 2019, Spanish Prime Minister Pedro Sanchez called for snap parliamentary elections, setting the stage for a showdown between the center-left Partido Socialista Obrero Español (PSOE) and its main opposition rival, the center-right Partido Popular (PP). Facing a challenge from the nationalist Vox party on its right flank, PP staked out tough positions on crime, abortion, immigration and Catalonian separatism. The PP’s campaign strategy led the party to suffer the worst defeat in its electoral history in the 28 April elections.
On 20 September, Twitter announced that the PP allegedly used fake accounts to fraudulently amplify its messages and support levels in the run up to the April 2019 elections:
“We have removed 259 accounts we identified as falsely boosting public sentiment online in Spain. Operated by Partido Popular, these accounts were active for a relatively short period, and consisted primarily of fake accounts engaging in spamming or retweet behaviour to increase engagement.”
PP denied responsibility for creating fake accounts, but acknowledges the possibility that its supporters could have been behind such a campaign. Twitter claims that it publishes datasets on information operations (IO) when it can reliably associate it with state-affiliated actors.
Twitter also published a full archive of the Spain IO accounts and activity it identified on its platform. We dove into the Twitter Spain IO data to see what behavioral patterns can be mined to better understand how the campaign operated. Here are the main trends we discovered in the data:
- Between 27 February and 22 April, 216 accounts posted 56,712 tweets.
- Although there were 259 accounts in the dataset, 43 never posted a single tweet.
- The 216 accounts that tweeted were most active on weekdays during mid-morning and early afternoon hours.
- While the accounts had relatively few followers, they used popular hashtags to reach a wider audience
- The average account was following 193 accounts and had 65 followers; given retweet patterns, it is likely that many followers of IO accounts were other IO accounts
- The accounts tweeted and retweeted messages using popular hashtags among PP supporters to extend the reach beyond their follower base.
- Of the 56,712 tweets posted by these accounts, 27,042 (47.6%) were retweets.
- The most retweeted content were posts from the official PP account or PP leader accounts, suggesting a directed campaign to inflate popular support levels
- 1 of every 3 retweets was an IO account retweeting another IO account, suggesting a coordinated campaign to amplify party narratives
The extent to which this coordinated campaign had any impact on voters and the results of the April elections is unknown. Clearly PP did not win the elections - and these 216 accounts surely made up a very small amount of total Twitter activity ahead of the polls - however the intentions of this information operation were clear: to artificially boost PP popular support levels and advance the party’s campaign agenda.
Below is a more detailed breakdown of the Spain IO data:
The Twitter Spain IO archive contained 56,712 tweets from 216 active Twitter accounts between 27 February and 22 April 2019 (note: while Twitter identified 259 IO accounts, 43 of them never tweeted). The number of active IO accounts on a given day was largely correlated with tweet activity levels (r^2=0.63) with some fluctuation. On average, 43 accounts were actively tweeting on any given day and the median number of tweets was 736 per day. The most number of accounts tweeting on a single day was 106 and the most tweets in one day was 4,838. Of the 56,712 total tweets from Spain IO accounts, 27,042 (47.6%) were retweets.

The Spain IO Accounts were much more active during weekdays than on weekends. Peak activity periods were mid-morning and early afternoon hours on weekdays. There were also small activity spikes during late evening hours, particularly on weekend days. Given the high number of retweets (detailed in further analysis), one hypothesis for the activity patterns is that they may coincide with activity patterns of the accounts of PP and its leaders however this hypothesis can’t be tested with the data available.

The Spain IO accounts did not have many followers and nearly all 216 active accounts were following more accounts that they had followers. Using a simple linear regression formula, the average IO account followed 193 accounts and had only 65 followers. The profile locations of the accounts were largely localities in Spain, with few exceptions. The profile descriptions were mostly generic however several mentioned affiliation with or support for PP. A handful denoted support for other parties (e.g. Podemos)

Although the Spain IO accounts had few followers, they frequently tweeted using popular hashtags enabling them to reach well beyond than their limited follower bases. The most widely used Twitter hashtags by the IO accounts were among the most commonly used by PP and its supporters: “PedroSeLoFunde” (Pedro Melts It), “Decretazo Sanchez” (Sanchez Decree), “NiObreroNiEspañol” (Neither Worker Nor Spanish), “StoPSOE” (Stop PSOE), and “Nohablamoshacemos” (We don’t talk we do).

Almost half of the tweets were retweets of other accounts, including direct retweets of posts from the official accounts of PP and its leaders. While theses retweets make up a small fraction of the total retweets that these posts received, it suggests that the IO accounts were seeking to further inflate the party’s popular support levels and amplify its narratives. The timing patterns of direct retweets of the top 20 most retweeted statuses by IO accounts of the indicates a high level of coordination and responsiveness.

The most retweeted post (47 times) was a post from then-Catalonia PP Deputy Andrea Levy Soler emphasizing a hardline stance against Catalonian separatism efforts:
A retweet of a post from the official PP Twitter account underscoring its tough position on criminal justice was retweeted 32 times:
A post highlighting that PP is tough on crime and illegal immigration while pushing back on a Vox party proposal to arm citizens from then-PP Deputy Javier Moroto was retweeted 30 times:
A topical analysis of the most frequently mentioned terms provides insight into the content of the messages that IO accounts tweeted. The terms used most often – excluding hashtags and mentions – were almost exclusively election-related in nature. PSOE leader Pedro Sanchez, Partido Popular and PP leader Pablo Casado were the mentioned entities by IO accounts while topics related to economic and social justice as well as executive decrees featured prominently

The Spain IO tweets very frequently mentioned PP and its leaders. Of the top ten most mentioned Twitter accounts, 8 were associated with PP and 2 with PSOE (the party’s official account and that of its leader Pedro Sanchez). There were far fewer mentions of other PSOE leaders, other parties, or thier leaders. Each line in the graph below represents a mention in a tweet by an IO account of a PP account (red) or a PSOE account (blue).

Of the 27,042 total retweets, 1 of every 3 was an IO account retweeting another IO account. Considering the content of the tweets, this pattern suggests a coordinated campaign to amplify party narratives. The graph below highlights the volume of retweet activity among IO accounts where each line represents an IO retweet of another IO account. Given the high number of retweets of other IO accounts and the low number of followers of these accounts, it is likely that many of the followers of IO accounts were IO accounts.

LS0tCnRpdGxlOiAiQW5hbHlzaXMgb2YgU3BhaW4gSU8gQWNjb3VudHMiCm91dHB1dDogaHRtbF9ub3RlYm9vawphdXRob3I6ICJNaWNoYWVsIEJhbGRhc3Nhcm8gKEBtYmFsZGFzc2FybykiIAotLS0KCipTaW5jZSBPY3RvYmVyIDIwMTgsIFR3aXR0ZXIgaGFzIGJlZW4gcmVsZWFzaW5nIFthcmNoaXZlZCBkYXRhc2V0cyBvZiB0d2VldHMgZnJvbSBzdGF0ZS1zcG9uc29yZWQgaW5mb3JtYXRpb24gb3BlcmF0aW9ucyAoSU8pXShodHRwczovL2Jsb2cudHdpdHRlci5jb20vZW5fdXMvdG9waWNzL2NvbXBhbnkvMjAxOC9lbmFibGluZy1mdXJ0aGVyLXJlc2VhcmNoLW9mLWluZm9ybWF0aW9uLW9wZXJhdGlvbnMtb24tdHdpdHRlci5odG1sKSBpZGVudGlmaWVkIG9uIGl0cyBwbGF0Zm9ybSB0byBlbmFibGUgaW5kZXBlbmRlbnQgYWNhZGVtaWMgcmVzZWFyY2ggYW5kIGludmVzdGlnYXRpb24uIEluZGVwZW5kZW50IHJlc2VhcmNoZXJzIGhhdmUgYmVlbiBhbmFseXppbmcgdGhlIFR3aXR0ZXIgSU8gZGF0YSB0byBiZXR0ZXIgdW5kZXJzdGFuZCBob3cgY29vcmRpbmF0ZWQgY2FtcGFpZ25zIHNlZWsgdG8gZGlzdG9ydCBwdWJsaWMgb3BpbmlvbiBhcm91bmQgdGhlIHdvcmxkLiogCgpPbiAxNSBGZWJydWFyeSAyMDE5LCBTcGFuaXNoIFByaW1lIE1pbmlzdGVyIFBlZHJvIFNhbmNoZXogW2NhbGxlZCBmb3Igc25hcCBwYXJsaWFtZW50YXJ5IGVsZWN0aW9uc10oaHR0cHM6Ly93d3cubnl0aW1lcy5jb20vMjAxOS8wMi8xNS93b3JsZC9ldXJvcGUvc3BhaW4tc25hcC1lbGVjdGlvbi5odG1sKSwgc2V0dGluZyB0aGUgc3RhZ2UgZm9yIGEgc2hvd2Rvd24gYmV0d2VlbiB0aGUgY2VudGVyLWxlZnQgUGFydGlkbyBTb2NpYWxpc3RhIE9icmVybyBFc3Bhw7FvbCAoUFNPRSkgYW5kIGl0cyBtYWluIG9wcG9zaXRpb24gcml2YWwsIHRoZSBjZW50ZXItcmlnaHQgUGFydGlkbyBQb3B1bGFyIChQUCkuIEZhY2luZyBhIFtjaGFsbGVuZ2UgZnJvbSB0aGUgbmF0aW9uYWxpc3QgVm94IHBhcnR5XShodHRwczovL2VscGFpcy5jb20vZWxwYWlzLzIwMTkvMDIvMTgvaW5lbmdsaXNoLzE1NTA1MDY5ODJfMDQ3Mzc0Lmh0bWwpIG9uIGl0cyByaWdodCBmbGFuaywgUFAgc3Rha2VkIG91dCBbdG91Z2ggcG9zaXRpb25zXShodHRwczovL2VscGFpcy5jb20vZWxwYWlzLzIwMTkvMDIvMjcvaW5lbmdsaXNoLzE1NTEyNTk3NzNfMjUyNzAzLmh0bWwpIG9uIGNyaW1lLCBhYm9ydGlvbiwgaW1taWdyYXRpb24gYW5kIENhdGFsb25pYW4gc2VwYXJhdGlzbS4gVGhlIFBQJ3MgY2FtcGFpZ24gc3RyYXRlZ3kgbGVkIHRoZSBwYXJ0eSB0byBzdWZmZXIgdGhlIFt3b3JzdCBkZWZlYXQgaW4gaXRzIGVsZWN0b3JhbCBoaXN0b3J5XShodHRwczovL3d3dy5ueXRpbWVzLmNvbS8yMDE5LzA0LzI5L3dvcmxkL2V1cm9wZS9zcGFpbi1lbGVjdGlvbi1zYW5jaGV6LXZveC5odG1sKSBpbiB0aGUgMjggQXByaWwgZWxlY3Rpb25zLiAKCk9uIDIwIFNlcHRlbWJlciwgVHdpdHRlciBhbm5vdW5jZWQgdGhhdCB0aGUgUFAgYWxsZWdlZGx5IHVzZWQgW2Zha2UgYWNjb3VudHMgdG8gZnJhdWR1bGVudGx5IGFtcGxpZnkgaXRzIG1lc3NhZ2VzIGFuZCBzdXBwb3J0IGxldmVsc10oaHR0cHM6Ly9ibG9nLnR3aXR0ZXIuY29tL2VuX3VzL3RvcGljcy9jb21wYW55LzIwMTkvaW5mby1vcHMtZGlzY2xvc3VyZS1kYXRhLXNlcHRlbWJlci0yMDE5Lmh0bWwpIGluIHRoZSBydW4gdXAgdG8gdGhlIEFwcmlsIDIwMTkgZWxlY3Rpb25zOgoKPiAiV2UgaGF2ZSByZW1vdmVkIDI1OSBhY2NvdW50cyB3ZSBpZGVudGlmaWVkIGFzIGZhbHNlbHkgYm9vc3RpbmcgcHVibGljIHNlbnRpbWVudCBvbmxpbmUgaW4gU3BhaW4uIE9wZXJhdGVkIGJ5IFBhcnRpZG8gUG9wdWxhciwgdGhlc2UgYWNjb3VudHMgd2VyZSBhY3RpdmUgZm9yIGEgcmVsYXRpdmVseSBzaG9ydCBwZXJpb2QsIGFuZCBjb25zaXN0ZWQgcHJpbWFyaWx5IG9mIGZha2UgYWNjb3VudHMgZW5nYWdpbmcgaW4gc3BhbW1pbmcgb3IgcmV0d2VldCBiZWhhdmlvdXIgdG8gaW5jcmVhc2UgZW5nYWdlbWVudC4iICAgICAKClBQIFtkZW5pZWQgcmVzcG9uc2liaWxpdHldKGh0dHBzOi8vd3d3LmZ0LmNvbS9jb250ZW50LzdmMDRlMWI2LWRiYjgtMTFlOS04ZjliLTc3MjE2ZWJlMWYxNykgZm9yIGNyZWF0aW5nIGZha2UgYWNjb3VudHMsIGJ1dCBhY2tub3dsZWRnZXMgdGhlIHBvc3NpYmlsaXR5IHRoYXQgaXRzIHN1cHBvcnRlcnMgY291bGQgaGF2ZSBiZWVuIGJlaGluZCBzdWNoIGEgY2FtcGFpZ24uIFR3aXR0ZXIgY2xhaW1zIHRoYXQgaXQgcHVibGlzaGVzIGRhdGFzZXRzIG9uIGluZm9ybWF0aW9uIG9wZXJhdGlvbnMgKElPKSB3aGVuIGl0IGNhbiBbcmVsaWFibHkgYXNzb2NpYXRlIGl0IHdpdGggc3RhdGUtYWZmaWxpYXRlZCBhY3RvcnNdKGh0dHBzOi8vYmxvZy50d2l0dGVyLmNvbS9lbl91cy90b3BpY3MvY29tcGFueS8yMDE5L2luZm9ybWF0aW9uLW9wcy1vbi10d2l0dGVyLmh0bWwpLgoKVHdpdHRlciBhbHNvIHB1Ymxpc2hlZCBhIFtmdWxsIGFyY2hpdmUgb2YgdGhlIFNwYWluIElPIGFjY291bnRzIGFuZCBhY3Rpdml0eV0oaHR0cHM6Ly9hYm91dC50d2l0dGVyLmNvbS9lbl91cy92YWx1ZXMvZWxlY3Rpb25zLWludGVncml0eS5odG1sI2RhdGEpIGl0IGlkZW50aWZpZWQgb24gaXRzIHBsYXRmb3JtLiBXZSBkb3ZlIGludG8gdGhlIFR3aXR0ZXIgU3BhaW4gSU8gZGF0YSB0byBzZWUgd2hhdCBiZWhhdmlvcmFsIHBhdHRlcm5zIGNhbiBiZSBtaW5lZCB0byBiZXR0ZXIgdW5kZXJzdGFuZCBob3cgdGhlIGNhbXBhaWduIG9wZXJhdGVkLiBIZXJlIGFyZSB0aGUgbWFpbiB0cmVuZHMgd2UgZGlzY292ZXJlZCBpbiB0aGUgZGF0YTogCgoqIEJldHdlZW4gMjcgRmVicnVhcnkgYW5kIDIyIEFwcmlsLCAyMTYgYWNjb3VudHMgcG9zdGVkIDU2LDcxMiB0d2VldHMuIAogICAgKyBBbHRob3VnaCB0aGVyZSB3ZXJlIDI1OSBhY2NvdW50cyBpbiB0aGUgZGF0YXNldCwgNDMgbmV2ZXIgcG9zdGVkIGEgc2luZ2xlIHR3ZWV0LgogICAgKyBUaGUgMjE2IGFjY291bnRzIHRoYXQgdHdlZXRlZCB3ZXJlIG1vc3QgYWN0aXZlIG9uIHdlZWtkYXlzIGR1cmluZyBtaWQtbW9ybmluZyBhbmQgZWFybHkgYWZ0ZXJub29uIGhvdXJzLgoqIFdoaWxlIHRoZSBhY2NvdW50cyBoYWQgcmVsYXRpdmVseSBmZXcgZm9sbG93ZXJzLCB0aGV5IHVzZWQgcG9wdWxhciBoYXNodGFncyB0byByZWFjaCBhIHdpZGVyIGF1ZGllbmNlIAogICAgKyBUaGUgYXZlcmFnZSBhY2NvdW50IHdhcyBmb2xsb3dpbmcgMTkzIGFjY291bnRzIGFuZCBoYWQgNjUgZm9sbG93ZXJzOyBnaXZlbiByZXR3ZWV0IHBhdHRlcm5zLCBpdCBpcyBsaWtlbHkgdGhhdCBtYW55IGZvbGxvd2VycyBvZiBJTyBhY2NvdW50cyB3ZXJlIG90aGVyIElPIGFjY291bnRzCiAgICArIFRoZSBhY2NvdW50cyB0d2VldGVkIGFuZCByZXR3ZWV0ZWQgbWVzc2FnZXMgdXNpbmcgcG9wdWxhciBoYXNodGFncyBhbW9uZyBQUCBzdXBwb3J0ZXJzIHRvIGV4dGVuZCB0aGUgcmVhY2ggYmV5b25kIHRoZWlyIGZvbGxvd2VyIGJhc2UuCiogT2YgdGhlIDU2LDcxMiB0d2VldHMgcG9zdGVkIGJ5IHRoZXNlIGFjY291bnRzLCAyNywwNDIgKDQ3LjYlKSB3ZXJlIHJldHdlZXRzLiAKICAgICsgVGhlIG1vc3QgcmV0d2VldGVkIGNvbnRlbnQgd2VyZSBwb3N0cyBmcm9tIHRoZSBvZmZpY2lhbCBQUCBhY2NvdW50IG9yIFBQIGxlYWRlciBhY2NvdW50cywgc3VnZ2VzdGluZyBhIGRpcmVjdGVkIGNhbXBhaWduIHRvIGluZmxhdGUgcG9wdWxhciBzdXBwb3J0IGxldmVscyAKICAgICsgMSBvZiBldmVyeSAzIHJldHdlZXRzIHdhcyBhbiBJTyBhY2NvdW50IHJldHdlZXRpbmcgYW5vdGhlciBJTyBhY2NvdW50LCBzdWdnZXN0aW5nIGEgY29vcmRpbmF0ZWQgY2FtcGFpZ24gdG8gYW1wbGlmeSBwYXJ0eSBuYXJyYXRpdmVzIAoKVGhlIGV4dGVudCB0byB3aGljaCB0aGlzIGNvb3JkaW5hdGVkIGNhbXBhaWduIGhhZCBhbnkgaW1wYWN0IG9uIHZvdGVycyBhbmQgdGhlIHJlc3VsdHMgb2YgdGhlIEFwcmlsIGVsZWN0aW9ucyBpcyB1bmtub3duLiBDbGVhcmx5IFBQIGRpZCBub3Qgd2luIHRoZSBlbGVjdGlvbnMgLSBhbmQgdGhlc2UgMjE2IGFjY291bnRzIHN1cmVseSBtYWRlIHVwIGEgdmVyeSBzbWFsbCBhbW91bnQgb2YgdG90YWwgVHdpdHRlciBhY3Rpdml0eSBhaGVhZCBvZiB0aGUgcG9sbHMgLSBob3dldmVyIHRoZSBpbnRlbnRpb25zIG9mIHRoaXMgaW5mb3JtYXRpb24gb3BlcmF0aW9uIHdlcmUgY2xlYXI6IHRvIGFydGlmaWNpYWxseSBib29zdCBQUCBwb3B1bGFyIHN1cHBvcnQgbGV2ZWxzIGFuZCBhZHZhbmNlIHRoZSBwYXJ0eSdzIGNhbXBhaWduIGFnZW5kYS4gCgpCZWxvdyBpcyBhIG1vcmUgZGV0YWlsZWQgYnJlYWtkb3duIG9mIHRoZSBTcGFpbiBJTyBkYXRhOiAKCmBgYHtyIHNldHVwLCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQpyZXF1aXJlKCJwYXJhbGxlbCIpCnJlcXVpcmUoIkRCSSIpCnJlcXVpcmUoIlJTUUxpdGUiKQpyZXF1aXJlKCJmb3JlYWNoIikKcmVxdWlyZSgiZG9QYXJhbGxlbCIpCnJlcXVpcmUoImRwbHlyIikKcmVxdWlyZSgiZ2dwbG90MiIpCnJlcXVpcmUoInJ0d2VldCIpCmNvcmVzIDwtIGRldGVjdENvcmVzKCkKd29ya2VycyA8LSBtYWtlQ2x1c3Rlcig0KQpyZWdpc3RlckRvUGFyYWxsZWwod29ya2VycykKZGJfY29uIDwtIGRiQ29ubmVjdChSU1FMaXRlOjpTUUxpdGUoKSwgIn4vdHdpdHRpby90d2l0dGlvLmRiIikKc3BhaW5iYXNpYyA8LSBkYkdldFF1ZXJ5KGRiX2NvbiwgInNlbGVjdCB1c2VyX3NjcmVlbl9uYW1lLCB0d2VldF90aW1lLCBpc19yZXR3ZWV0LCBmb2xsb3dlcl9jb3VudCwgZm9sbG93aW5nX2NvdW50LCBsaWtlX2NvdW50LCByZXBseV9jb3VudCwgcmV0d2VldF9jb3VudCBmcm9tIHNwYWluIikKc3BhaW5zbmEgPC0gZGJHZXRRdWVyeShkYl9jb24sICJzZWxlY3QgdXNlcmlkLCB1c2VyX3NjcmVlbl9uYW1lLCB0d2VldF90ZXh0LCB1c2VyX21lbnRpb25zIGZyb20gc3BhaW4iKQpzcGFpbnVybCA8LSBkYkdldFF1ZXJ5KGRiX2NvbiwgInNlbGVjdCB1c2VyX3NjcmVlbl9uYW1lLCB0d2VldF90ZXh0LCB1cmxzIGZyb20gc3BhaW4iKQpzcGFpbnJ0IDwtIGRiR2V0UXVlcnkoZGJfY29uLCAic2VsZWN0IHVzZXJpZCwgdHdlZXRpZCwgdHdlZXRfdGV4dCwgaXNfcmV0d2VldCwgcmV0d2VldF91c2VyaWQsIHJldHdlZXRfdHdlZXRpZCBmcm9tIHNwYWluIikKc3BhaW5ydHRpbWUgPC0gZGJHZXRRdWVyeShkYl9jb24sICJzZWxlY3QgdXNlcl9zY3JlZW5fbmFtZSwgdHdlZXRfdGltZSwgaXNfcmV0d2VldCwgcmV0d2VldF90d2VldGlkIGZyb20gc3BhaW4iKQpzdG9wSW1wbGljaXRDbHVzdGVyKCkKc3RvcENsdXN0ZXIod29ya2VycykKYGBgCgoqKipUaGUgVHdpdHRlciBTcGFpbiBJTyBhcmNoaXZlIGNvbnRhaW5lZCA1Niw3MTIgdHdlZXRzIGZyb20gMjE2IGFjdGl2ZSBUd2l0dGVyIGFjY291bnRzIGJldHdlZW4gMjcgRmVicnVhcnkgYW5kIDIyIEFwcmlsIDIwMTkgKG5vdGU6IHdoaWxlIFR3aXR0ZXIgaWRlbnRpZmllZCAyNTkgSU8gYWNjb3VudHMsIDQzIG9mIHRoZW0gbmV2ZXIgdHdlZXRlZCkuIFRoZSBudW1iZXIgb2YgYWN0aXZlIElPIGFjY291bnRzIG9uIGEgZ2l2ZW4gZGF5IHdhcyBsYXJnZWx5IGNvcnJlbGF0ZWQgd2l0aCB0d2VldCBhY3Rpdml0eSBsZXZlbHMgKHJeMj0wLjYzKSB3aXRoIHNvbWUgZmx1Y3R1YXRpb24uIE9uIGF2ZXJhZ2UsIDQzIGFjY291bnRzIHdlcmUgYWN0aXZlbHkgdHdlZXRpbmcgb24gYW55IGdpdmVuIGRheSBhbmQgdGhlIG1lZGlhbiBudW1iZXIgb2YgdHdlZXRzIHdhcyA3MzYgcGVyIGRheS4gVGhlIG1vc3QgbnVtYmVyIG9mIGFjY291bnRzIHR3ZWV0aW5nIG9uIGEgc2luZ2xlIGRheSB3YXMgMTA2IGFuZCB0aGUgbW9zdCB0d2VldHMgaW4gb25lIGRheSB3YXMgNCw4MzguIE9mIHRoZSA1Niw3MTIgdG90YWwgdHdlZXRzIGZyb20gU3BhaW4gSU8gYWNjb3VudHMsIDI3LDA0MiAoNDcuNiUpIHdlcmUgcmV0d2VldHMuKioqIAoKYGBge3J9CiN3YXMgODQgdHdlZXRzIHBlciBkYXkgLS0gYnV0IG5vIGludGVyYWN0aW9ucwojSG93IG1hbnkgaW50ZXJhY3Rpb25zID0gMjA1NDQgcmVhY3Rpb25zCiMxMDYgYWN0aXZlIGFjY291bnRzICgxMSBBcHJpbCAyMDE5KSAKIzQsODM4IHR3ZWV0cyAoMjIgTWFyY2ggMjAxOSkKc3BhaW5iYXNpY190YWJsZSA8LSBzcGFpbmJhc2ljICU+JSBncm91cF9ieSh1c2VyX3NjcmVlbl9uYW1lKSAlPiUgc3VtbWFyaXNlKHR3ZWV0cz1sZW5ndGgodXNlcl9zY3JlZW5fbmFtZSksIGludGVyYWN0aW9ucz1zdW0oYXMuaW50ZWdlcihsaWtlX2NvdW50KSkgKyBzdW0oYXMuaW50ZWdlcihyZXBseV9jb3VudCkpICsgc3VtKGFzLmludGVnZXIocmVwbHlfY291bnQpKSwgZm9sbG93ZXJzPW1lYW4oYXMuaW50ZWdlcihmb2xsb3dlcl9jb3VudCkpLCBmb2xsb3dpbmc9bWVhbihhcy5pbnRlZ2VyKGZvbGxvd2luZ19jb3VudCkpLCBmaXJzdD0obWluKGFzLlBPU0lYY3QodHdlZXRfdGltZSkpKSwgbGFzdD0obWF4KGFzLlBPU0lYY3QodHdlZXRfdGltZSkpKSwgYWN0aXZlPWNlaWxpbmcobGFzdC1maXJzdCksIHZvbHVtZT1jZWlsaW5nKHR3ZWV0cy9hcy5pbnRlZ2VyKGFjdGl2ZSkpKSAlPiUgYXJyYW5nZShkZXNjKHR3ZWV0cykpCnNwYWluYmFzaWNfdGFibGUkaW50ZXJhY3Rpb25zW2lzLm5hKHNwYWluYmFzaWNfdGFibGUkaW50ZXJhY3Rpb25zKV0gPC0gMAoKcmVxdWlyZSgibHVicmlkYXRlIikKaGVhZChzcGFpbmJhc2ljKQpzcGFpbmdyYXBoIDwtIHNwYWluYmFzaWMgJT4lIG11dGF0ZSh0d2VldF90aW1lPWFzLlBPU0lYY3QodHdlZXRfdGltZSksIGRhdGU9cm91bmRfZGF0ZSh0d2VldF90aW1lLCAiZGF5IikpICU+JSBncm91cF9ieShkYXRlKSAlPiUgbXV0YXRlKHR3ZWV0cz1sZW5ndGgoZGF0ZSksIGFjY291bnRzPWxlbmd0aCh1bmlxdWUoYXMuZmFjdG9yKHVzZXJfc2NyZWVuX25hbWUpKSksIHJldHdlZXQ9aWZlbHNlKGlzX3JldHdlZXQ9PSJ0cnVlIiwgMSwgMCkpIApzcGFpbmdyYXBoX3RhYmxlIDwtIHNwYWluZ3JhcGggJT4lIGdyb3VwX2J5KGRhdGUpICU+JSBzdW1tYXJpc2UodHdlZXRzPW1pbih0d2VldHMpLCBhY2NvdW50cz1taW4oYWNjb3VudHMpLCBpbnRlcmFjdGlvbnM9c3VtKGFzLmludGVnZXIobGlrZV9jb3VudCkpICsgc3VtKGFzLmludGVnZXIocmVwbHlfY291bnQpKSArIHN1bShhcy5pbnRlZ2VyKHJlcGx5X2NvdW50KSksIHJldHdlZXQ9c3VtKHJldHdlZXQpKQpzcGFpbmdyYXBoX3RhYmxlJGludGVyYWN0aW9uc1tpcy5uYShzcGFpbmdyYXBoX3RhYmxlJGludGVyYWN0aW9ucyldIDwtIDAKc3BhaW5ncmFwaF90YWJsZSAlPiUgbXV0YXRlKHJ0X3BjdD1yZXR3ZWV0L3R3ZWV0cyoxMDApICU+JSAgYXJyYW5nZShkZXNjKHJ0X3BjdCkpI2FycmFuZ2UoZGVzYyhhY2NvdW50cykpICAKI2NvcnJlbGF0aW9uIGNoZWNrCnRlc3QgPC0gc3BhaW5iYXNpYyAlPiUgc2VsZWN0KHVzZXJfc2NyZWVuX25hbWUsIHR3ZWV0X3RpbWUpCnRlc3QkdXNlcl9zY3JlZW5fbmFtZSA8LSBhcy5mYWN0b3IodGVzdCR1c2VyX3NjcmVlbl9uYW1lKQp0ZXN0JHR3ZWV0X3RpbWUgPC0gYXMuRGF0ZSh0ZXN0JHR3ZWV0X3RpbWUsIGZvcm1hdD0iJU0tJUQtJVkiKQp0ZXN0IDwtIHRlc3QgJT4lIGdyb3VwX2J5KHR3ZWV0X3RpbWUpICU+JSBzdW1tYXJpc2UoYWNjb3VudHM9bGVuZ3RoKHVuaXF1ZSh1c2VyX3NjcmVlbl9uYW1lKSkgLHR3ZWV0cz1sZW5ndGgodHdlZXRfdGltZSkpCiN0ZXN0ICU+JSBnZ3Bsb3QoYWVzKHg9YWNjb3VudHMsIHk9dHdlZXRzKSkgKyBnZW9tX3BvaW50KCkgCmNvcnJlbGF0aW9uIDwtIGNvcih0ZXN0JGFjY291bnRzLCB0ZXN0JHR3ZWV0cykKCiNHUkFQSApyZXF1aXJlKCJjb2xvcm1hcCIpCmcgPC0gc3BhaW5ncmFwaF90YWJsZSAlPiUgZ2dwbG90KGFlcyh4PWRhdGUsIHk9dHdlZXRzKSkgKyBnZW9tX2JhcihhZXMoZmlsbD1hY2NvdW50cyksIHN0YXQgPSAiaWRlbnRpdHkiKQpnICsgc2NhbGVfZmlsbF9jb2xvcm1hcChkaXNjcmV0ZSA9IEYsY29sb3JtYXAgPSBjb2xvcm1hcHMkdmlyaWRpcywgcmV2ZXJzZSA9IFQpICsKICAgIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTgpLAogICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT04KSwKICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTgpLAogICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT04KSwKICAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT04KSwKICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9OCksCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9OCksCiAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9OCksCiAgICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiLCBzaXplPTgpLAogICAgICAgICAgcGFuZWwuZ3JpZC5taW5vcj1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9ibGFuaygpKSArCiAgICBnZW9tX2xpbmUoZGF0YT1zcGFpbmdyYXBoX3RhYmxlLCBhZXMoeD1kYXRlLCB5PXJldHdlZXQpLCBjb2xvdXI9Im9yYW5nZSIpICsKICAgIGdncGxvdDI6OmxhYnMoCiAgICB4ID0gIkRhdGUiLCB5ID0gIlR3ZWV0cyIsIGZpbGw9IkFjY291bnRzIiwKICAgICN0aXRsZSA9ICIiLAogICAgI3N1YnRpdGxlID0gIiIsCiAgICBjYXB0aW9uID0gIlR3ZWV0IGFjdGl2aXR5IGxldmVscyBieSAyMTYgU3BhaW4gSU8gYWNjb3VudHMgcGVyIGRheVxuQmFyIENvbG9yID0gTnVtYmVyIG9mIEFjY291bnRzIFR3ZWV0aW5nIHBlciBEYXkgKERhcmtlciA9IE1vcmUgQWNjb3VudHMpXG5MaW5lID0gTnVtYmVyIG9mIFRvdGFsIFR3ZWV0cyB0aGF0IHdlcmUgUmV0d2VldHNcblNvdXJjZTogVHdpdHRlciB0cmFuc3BhcmVuY3kgcmVwb3J0IikKCmBgYAoKKioqVGhlIFNwYWluIElPIEFjY291bnRzIHdlcmUgbXVjaCBtb3JlIGFjdGl2ZSBkdXJpbmcgd2Vla2RheXMgdGhhbiBvbiB3ZWVrZW5kcy4gUGVhayBhY3Rpdml0eSBwZXJpb2RzIHdlcmUgbWlkLW1vcm5pbmcgYW5kIGVhcmx5IGFmdGVybm9vbiBob3VycyBvbiB3ZWVrZGF5cy4gVGhlcmUgd2VyZSBhbHNvIHNtYWxsIGFjdGl2aXR5IHNwaWtlcyBkdXJpbmcgbGF0ZSBldmVuaW5nIGhvdXJzLCBwYXJ0aWN1bGFybHkgb24gd2Vla2VuZCBkYXlzLiBHaXZlbiB0aGUgaGlnaCBudW1iZXIgb2YgcmV0d2VldHMgKGRldGFpbGVkIGluIGZ1cnRoZXIgYW5hbHlzaXMpLCBvbmUgaHlwb3RoZXNpcyBmb3IgdGhlIGFjdGl2aXR5IHBhdHRlcm5zIGlzIHRoYXQgdGhleSBtYXkgY29pbmNpZGUgd2l0aCBhY3Rpdml0eSBwYXR0ZXJucyBvZiB0aGUgYWNjb3VudHMgb2YgUFAgYW5kIGl0cyBsZWFkZXJzIGhvd2V2ZXIgdGhpcyBoeXBvdGhlc2lzIGNhbid0IGJlIHRlc3RlZCB3aXRoIHRoZSBkYXRhIGF2YWlsYWJsZS4qKioKYGBge3IsIGVjaG89RkFMU0V9CnJlcXVpcmUoImNocm9uIikKc3BhaW5iYXNpYyR0aW1lIDwtIHN1YigiLipcXHMrIiwgIiIsIHNwYWluYmFzaWMkdHdlZXRfdGltZSkgCnNwYWluYmFzaWMkdGltZSA8LSBzdWJzdHIoc3BhaW5iYXNpYyR0aW1lLCAwLDIpCnNwYWluYmFzaWMkdGltZSA8LSBhcy5pbnRlZ2VyKHNwYWluYmFzaWMkdGltZSkKc3BhaW5iYXNpYyR0d2VldF90aW1lIDwtIGFzLlBPU0lYY3Qoc3BhaW5iYXNpYyR0d2VldF90aW1lKQpzcGFpbmJhc2ljJGRheSA8LSB3ZWVrZGF5cyhhcy5EYXRlKHNwYWluYmFzaWMkdHdlZXRfdGltZSkpCnNwYWluYmFzaWMkZGF5IDwtIGFzLmZhY3RvcihzcGFpbmJhc2ljJGRheSkKc3BhaW5iYXNpYyA8LSBzcGFpbmJhc2ljICU+JSBtdXRhdGUoZGF5dGltZT1pZmVsc2UoZGF5PT0iU2F0dXJkYXkiIHwgZGF5PT0iU3VuZGF5IiwgIldlZWtlbmQiLCAiV2Vla2RheSIpKQpzcGFpbmJhc2ljJGRheXRpbWUgPC0gYXMuZmFjdG9yKHNwYWluYmFzaWMkZGF5dGltZSkKCiNzcGFpbmJhc2ljICU+JSBncm91cF9ieShkYXksdGltZSkKI3NwYWluYmFzaWMgJT4lIGdyb3VwX2J5KGRheXRpbWUsdGltZSkgJT4lIHN1bW1hcmlzZSh4PWxlbmd0aCh0aW1lKS8pKSAKCiNzcGFpbmJhc2ljICU+JSBncm91cF9ieShkYXl0aW1lLCB0aW1lKSAlPiUgbXV0YXRlKHg9aWZlbHNlKGRheXRpbWU9PSJXZWVrZGF5IiwgbWVhbihsZW5ndGgodGltZSkpLzUsIG1lYW4obGVuZ3RoKHRpbWUpKS8yKSwgeT1pZmVsc2UoZGF5dGltZT09IldlZWtkYXkiLCBtZWFuKGxlbmd0aCh1bmlxdWUodXNlcl9zY3JlZW5fbmFtZSkpKS81LCBtZWFuKGxlbmd0aCh1bmlxdWUodXNlcl9zY3JlZW5fbmFtZSkpKS8yKSkgCgpzcGFpbnRpbWUgPC0gc3BhaW5iYXNpYyAlPiUgZ3JvdXBfYnkoZGF5dGltZSwgdGltZSkgJT4lIG11dGF0ZSh4PWlmZWxzZShkYXl0aW1lPT0iV2Vla2RheSIsIG1lYW4obGVuZ3RoKHRpbWUpKS81LCBtZWFuKGxlbmd0aCh0aW1lKSkvMiksIHk9aWZlbHNlKGRheXRpbWU9PSJXZWVrZGF5IiwgbWVhbihsZW5ndGgodW5pcXVlKHVzZXJfc2NyZWVuX25hbWUpKSkvNSwgbWVhbihsZW5ndGgodW5pcXVlKHVzZXJfc2NyZWVuX25hbWUpKSkvMikpIAoKcmVxdWlyZSgiZ3JpZEV4dHJhIikKcDEgPC0gZ2dwbG90KHNwYWludGltZSkgKyBnZW9tX2JhcihhZXMoeD10aW1lLCB5PXgsIGdyb3VwPWRheXRpbWUsIGZpbGw9ZGF5dGltZSksIHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249ImRvZGdlIikgKyB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT04KSwKICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9OCksCiAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT04KSwKICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9OCksCiAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9OCksCiAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTYpLAogICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTgpLAogICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTgpLAogICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIiwgc2l6ZT04KSwKICAgICAgICAgIHBhbmVsLmdyaWQubWlub3I9ZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvcj1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogICAgZ2dwbG90Mjo6bGFicygKICAgIHggPSAiVGltZSIsIHkgPSAiVHdlZXRzIiwgZmlsbD1OVUxMLAogICAgdGl0bGUgPSAiIiwKICAgIHN1YnRpdGxlID0gIiIsCiAgICBjYXB0aW9uID0gIlxuXG5cbiIpCnAyIDwtIGdncGxvdChzcGFpbnRpbWUpICsgZ2VvbV9saW5lKGFlcyh4PXRpbWUsIHk9eSwgZ3JvdXA9ZGF5dGltZSwgY29sb3I9ZGF5dGltZSksIHN0YXQ9ImlkZW50aXR5IikgKyB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT04KSwKICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9OCksCiAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT04KSwKICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9OCksCiAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9OCksCiAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTYpLAogICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTgpLAogICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTgpLAogICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIiwgc2l6ZT04KSwKICAgICAgICAgIHBhbmVsLmdyaWQubWlub3I9ZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvcj1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogICAgZ2dwbG90Mjo6bGFicygKICAgIHggPSAiVGltZSIsIHkgPSAiQWNjb3VudHMiLCBmaWxsPU5VTEwsCiAgICB0aXRsZSA9ICIiLAogICAgc3VidGl0bGUgPSAiIiwKICAgIGNhcHRpb24gPSAiVHdlZXQgYWN0aXZpdHkgbGV2ZWxzIGJ5IDIxNiBTcGFpbiBJTyBhY2NvdW50cyBvbiBXZWVrZGF5cyAocmVkKSB2cy4gV2Vla2VuZHMgKGJsdWUpXG5UaGUgbGVmdCBncmFwaCBkaXNwbGF5cyBhdmVyYWdlIG51bWJlciBvZiB0d2VldHMgcG9zdGVkIGJ5IHR5cGUgb2YgZGF5IGFuZCBob3VyXG5UaGUgcmlnaHQgZ3JhcGggZGlzcGxheXMgYXZlcmFnZSBudW1iZXIgb2YgYWNjb3VudHMgYWN0aXZlIGJ5IHR5cGUgb2YgZGF5IGFuZCBieSBob3VyXG5Tb3VyY2U6IFR3aXR0ZXIgdHJhbnNwYXJlbmN5IHJlcG9ydCIpCmdyaWQuYXJyYW5nZShwMSxwMiwgbnJvdz0xKQoKYGBgCgoqKipUaGUgU3BhaW4gSU8gYWNjb3VudHMgZGlkIG5vdCBoYXZlIG1hbnkgZm9sbG93ZXJzIGFuZCBuZWFybHkgYWxsIDIxNiBhY3RpdmUgYWNjb3VudHMgd2VyZSBmb2xsb3dpbmcgbW9yZSBhY2NvdW50cyB0aGF0IHRoZXkgaGFkIGZvbGxvd2Vycy4gVXNpbmcgYSBzaW1wbGUgbGluZWFyIHJlZ3Jlc3Npb24gZm9ybXVsYSwgdGhlIGF2ZXJhZ2UgSU8gYWNjb3VudCBmb2xsb3dlZCAxOTMgYWNjb3VudHMgYW5kIGhhZCBvbmx5IDY1IGZvbGxvd2Vycy4gVGhlIHByb2ZpbGUgbG9jYXRpb25zIG9mIHRoZSBhY2NvdW50cyB3ZXJlIGxhcmdlbHkgbG9jYWxpdGllcyBpbiBTcGFpbiwgd2l0aCBmZXcgZXhjZXB0aW9ucy4gVGhlIHByb2ZpbGUgZGVzY3JpcHRpb25zIHdlcmUgbW9zdGx5IGdlbmVyaWMgaG93ZXZlciBzZXZlcmFsIG1lbnRpb25lZCBhZmZpbGlhdGlvbiB3aXRoIG9yIHN1cHBvcnQgZm9yIFBQLiBBIGhhbmRmdWwgZGVub3RlZCBzdXBwb3J0IGZvciBvdGhlciBwYXJ0aWVzIChlLmcuIFBvZGVtb3MpKioqICAgICAKCmBgYHtyIGZvbGxvd2VycywgZWNobz1GQUxTRX0Kc3BhaW5fZm9sbG93aW5nIDwtIHNwYWluYmFzaWMgJT4lIHNlbGVjdCh1c2VyX3NjcmVlbl9uYW1lLCBmb2xsb3dlcl9jb3VudCwgZm9sbG93aW5nX2NvdW50KSAlPiUgbXV0YXRlKGZvbGxvd2Vycz1hcy5udW1lcmljKGZvbGxvd2VyX2NvdW50KSwgZm9sbG93aW5nID0gYXMubnVtZXJpYyhmb2xsb3dpbmdfY291bnQpKSAlPiUgZGlzdGluY3QoKSAlPiUgYXJyYW5nZShkZXNjKGZvbGxvd2VycykpCnNwYWluX2ZvbGxvd2luZyRmb2xsb3dlcnMgPC0gYXMuaW50ZWdlcihzcGFpbl9mb2xsb3dpbmckZm9sbG93ZXJzKQpzcGFpbl9mb2xsb3dpbmckZm9sbG93aW5nIDwtIGFzLmludGVnZXIoc3BhaW5fZm9sbG93aW5nJGZvbGxvd2luZykKCiNtZWFuKHNwYWluX2ZvbGxvd2luZyRmb2xsb3dpbmcpCgojcmVncmVzc2lvbiA8LSBsbShmb2xsb3dlcnMgfiBmb2xsb3dpbmcsIGRhdGE9c3BhaW5fZm9sbG93aW5nKQojbmV3IDwtIGRhdGEuZnJhbWUoZm9sbG93aW5nPTE5MykKI3ByZWRpY3QocmVncmVzc2lvbiwgbmV3KQoKI0dSQVBICnNwYWluX2ZvbGxvd2luZ19wbG90IDwtIHNwYWluX2ZvbGxvd2luZyAlPiUgZ2dwbG90KGFlcyh4PWZvbGxvd2luZywgeT1mb2xsb3dlcnMsIGNvbG9yPWZvbGxvd2VycykpICsgZ2VvbV9wb2ludChzaGFwZSA9IDE2LCBzaXplID0gNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSwgYWxwaGEgPSAuNCkgKyBnZW9tX2FibGluZShjb2w9InJlZCIsIGx0eT0yLCBhbHBoYT0uNCkgKyBnZW9tX3Ntb290aChtZXRob2Q9J2xtJywgbHR5PTIsIGNvbG9yPSJncmF5IikKc3BhaW5fZm9sbG93aW5nX3Bsb3QgKyB4bGltKDAsIDQyMDApICsgeWxpbSgwLDQyMDApICsKICAgIGdncGxvdDI6OnRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTgpLAogICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT04KSwKICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTgpLAogICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT04KSwKICAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT04KSwKICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9OCksCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9OCksCiAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9OCksCiAgICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiLCBzaXplPTgpLAogICAgICAgICAgcGFuZWwuZ3JpZC5taW5vcj1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9ibGFuaygpKSArCiAgICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSAiIzAwOTFmZiIsIGhpZ2ggPSAiI2YwNjUwZSIpICsKICAgICNnZ3Bsb3QyOjp0aGVtZV9idygpICsKICAgICNnZW9tX2xpbmUoZGF0YT1zcGFpbmdyYXBoX3RhYmxlLCBhZXMoeD1kYXRlLCB5PXJldHdlZXQpLCBjb2xvdXI9Im9yYW5nZSIpICsKICAgIGdncGxvdDI6OmxhYnMoCiAgICB4ID0gIkZvbGxvd2luZyIsIHkgPSAiRm9sbG93ZXJzIiwKICAgIHRpdGxlID0gIiIsCiAgICBzdWJ0aXRsZSA9ICIiLAogICAgY2FwdGlvbiA9ICJGb2xsb3dlcnMgdnMuIEZvbGxvd2luZyBEYXRhIG9mIDIxNiBTcGFpbiBJTyBBY2NvdW50c1xuUmVkIExpbmUgPSBMaW5lIG9mIEVxdWlsaWJyaXVtXG5HcmF5IExpbmUgPSBSZWdyZXNzaW9uIExpbmUgKFJeMj0wLjY2LCBwLXZhbHVlIDwgMC4wMDEpXG5Tb3VyY2U6IFR3aXR0ZXIgdHJhbnNwYXJlbmN5IHJlcG9ydCIpCmBgYAoKKioqQWx0aG91Z2ggdGhlIFNwYWluIElPIGFjY291bnRzIGhhZCBmZXcgZm9sbG93ZXJzLCB0aGV5IGZyZXF1ZW50bHkgdHdlZXRlZCB1c2luZyBwb3B1bGFyIGhhc2h0YWdzIGVuYWJsaW5nIHRoZW0gdG8gcmVhY2ggd2VsbCBiZXlvbmQgdGhhbiB0aGVpciBsaW1pdGVkIGZvbGxvd2VyIGJhc2VzLiBUaGUgbW9zdCB3aWRlbHkgdXNlZCBUd2l0dGVyIGhhc2h0YWdzIGJ5IHRoZSBJTyBhY2NvdW50cyB3ZXJlIGFtb25nIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgYnkgUFAgYW5kIGl0cyBzdXBwb3J0ZXJzOiAiUGVkcm9TZUxvRnVuZGUiIChQZWRybyBNZWx0cyBJdCksICJEZWNyZXRhem8gU2FuY2hleiIgKFNhbmNoZXogRGVjcmVlKSwgIk5pT2JyZXJvTmlFc3Bhw7FvbCIgKE5laXRoZXIgV29ya2VyIE5vciBTcGFuaXNoKSwgIlN0b1BTT0UiIChTdG9wIFBTT0UpLCBhbmQgIk5vaGFibGFtb3NoYWNlbW9zIiAoV2UgZG9uJ3QgdGFsayB3ZSBkbykuKioqCgpgYGB7ciwgZWNobz1GQUxTRX0KI3JlZ2V4IDwtICIjKFtBLVphLXpdK1tBLVphLXowLTlfXSspKD8hW0EtWmEtejAtOV9dKlxcLikiCnJlcXVpcmUoInRpZHl0ZXh0IikKcmVxdWlyZSgic3RyaW5nciIpCmRhdGFfaGFzaCA8LSBzcGFpbnNuYSAlPiUgc2VsZWN0KHVzZXJfc2NyZWVuX25hbWUsIHR3ZWV0X3RleHQpICU+JSB1bm5lc3RfdG9rZW5zKHR3ZWV0cywgdG9rZW49InJlZ2V4IiwgdHdlZXRfdGV4dCkgJT4lIGZpbHRlcihzdHJfZGV0ZWN0KHR3ZWV0cywgIl4jIikpIAojaGVhZChkYXRhX2hhc2gpCmRhdGFfaGFzaCR0d2VldHMgPC0gZ3N1YigiXFw6IiwiIixkYXRhX2hhc2gkdHdlZXRzKQoKZGF0YV9oYXNoICU+JSBtdXRhdGUodHdlZXRzPWFzLmZhY3Rvcih0d2VldHMpKSAlPiUgZ3JvdXBfYnkodHdlZXRzKSAlPiUgY291bnQoKSAlPiUgYXJyYW5nZShkZXNjKG4pKSAlPiUgaGVhZCgyMCkgJT4lIGdncGxvdChhZXMoeD10d2VldHMsIHk9biwgZmlsbD1uKSkgKyBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsKICAgIGFlcyh4PXJlb3JkZXIodHdlZXRzLCBuKSkgKwogICAgdGhlbWUoYXhpcy5saW5lPWVsZW1lbnRfYmxhbmsoKSxheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLGF4aXMudGlja3M9ZWxlbWVudF9ibGFuaygpKSArCiAgICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdz0neWVsbG93JywgaGlnaD0ncmVkJywgbGltaXRzPWMoMCwyNTAwKSkgKyAgICAgCiAgICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT04KSwKICAgICAgICAgICNheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTgsIGFuZ2xlPS0yMCksCiAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTgpLAogICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT04KSwKICAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT04KSwKICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9OCksCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9OCksCiAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9OCksCiAgICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiLCBzaXplPTgpLAogICAgICAgICAgI3BhbmVsLmdyaWQubWlub3I9ZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgI3BhbmVsLmdyaWQubWFqb3I9ZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgIAogICAgICAgICAgI2F4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCkpICsKICAgICNjb29yZF9wb2xhcih0aGV0YT0ieCIsIGNsaXAgPSAib24iKSArIAogICAgY29vcmRfZmxpcCgpICsgCiAgICAjZ2dwbG90Mjo6dGhlbWVfYncoKSArCiAgICBnZ3Bsb3QyOjpsYWJzKAogICAgeCA9Ikhhc2h0YWciLCB5ID0gIkRpcmVjdCBUd2VldHMiLCBmaWxsPSJUd2VldHMiLAogICAgdGl0bGUgPSAiIiwKICAgIHN1YnRpdGxlID0gIiIsCiAgICBjYXB0aW9uID0gIlRvcCAyMCBoYXNodGFncyB1c2VkIGJ5IDIxNiBTcGFpbiBJTyBhY2NvdW50c1xuQmFyIENvbG9yID0gTnVtYmVyIG9mIFRpbWVzIEEgSGFzaHRhZyBXYXMgVXNlZCAoRGFya2VyID0gTW9yZSBVc2VkKVxuU291cmNlOiBUd2l0dGVyIHRyYW5zcGFyZW5jeSByZXBvcnQiKQpgYGAKCioqKkFsbW9zdCBoYWxmIG9mIHRoZSB0d2VldHMgd2VyZSByZXR3ZWV0cyBvZiBvdGhlciBhY2NvdW50cywgaW5jbHVkaW5nIGRpcmVjdCByZXR3ZWV0cyBvZiBwb3N0cyBmcm9tIHRoZSBvZmZpY2lhbCBhY2NvdW50cyBvZiBQUCBhbmQgaXRzIGxlYWRlcnMuIFdoaWxlIHRoZXNlcyByZXR3ZWV0cyBtYWtlIHVwIGEgc21hbGwgZnJhY3Rpb24gb2YgdGhlIHRvdGFsIHJldHdlZXRzIHRoYXQgdGhlc2UgcG9zdHMgcmVjZWl2ZWQsIGl0IHN1Z2dlc3RzIHRoYXQgdGhlIElPIGFjY291bnRzIHdlcmUgc2Vla2luZyB0byBmdXJ0aGVyIGluZmxhdGUgdGhlIHBhcnR5J3MgcG9wdWxhciBzdXBwb3J0IGxldmVscyBhbmQgYW1wbGlmeSBpdHMgbmFycmF0aXZlcy4gVGhlIHRpbWluZyBwYXR0ZXJucyBvZiBkaXJlY3QgcmV0d2VldHMgb2YgdGhlIHRvcCAyMCBtb3N0IHJldHdlZXRlZCBzdGF0dXNlcyBieSBJTyBhY2NvdW50cyBvZiB0aGUgaW5kaWNhdGVzIGEgaGlnaCBsZXZlbCBvZiBjb29yZGluYXRpb24gYW5kIHJlc3BvbnNpdmVuZXNzLioqKgoKCmBgYHtyfQpzcGFpbnJ0dGltZSR1c2VyX3NjcmVlbl9uYW1lIDwtIGFzLmZhY3RvcihzcGFpbnJ0dGltZSR1c2VyX3NjcmVlbl9uYW1lKQpzcGFpbnJ0dGltZSR0d2VldF90aW1lIDwtIGFzLlBPU0lYY3Qoc3BhaW5ydHRpbWUkdHdlZXRfdGltZSkKc3BhaW5ydHRpbWUkaXNfcmV0d2VldCA8LSBhcy5mYWN0b3Ioc3BhaW5ydHRpbWUkaXNfcmV0d2VldCkKc3BhaW5ydHRpbWUkcmV0d2VldF90d2VldGlkIDwtIGFzLmZhY3RvcihzcGFpbnJ0dGltZSRyZXR3ZWV0X3R3ZWV0aWQpCiNzcGFpbnJ0dGltZSAlPiUgc2VsZWN0KHR3ZWV0X3RpbWUsIGlzX3JldHdlZXQsIHJldHdlZXRfdHdlZXRpZCkgJT4lIGZpbHRlcihpc19yZXR3ZWV0PT0idHJ1ZSIpICU+JSBncm91cF9ieShyZXR3ZWV0X3R3ZWV0aWQpICU+JSBzdW1tYXJpc2Uobj1sZW5ndGgoKHJldHdlZXRfdHdlZXRpZCkpKSAlPiUgYXJyYW5nZShkZXNjKG4pKQpzcGFpbnJ0dGltZSAlPiUgc2VsZWN0KHR3ZWV0X3RpbWUsIHJldHdlZXRfdHdlZXRpZCkgJT4lIGZpbHRlcihyZXR3ZWV0X3R3ZWV0aWQgJWluJSBjKCIxMTE2MzExMDA1MzQzMjMyMDAwIiwgIjExMDYxNTM5OTQ0NDYwODIwNDgiLCAiMTEwOTAyNjQxMjIzOTk0OTgyNCIsICIxMTA5MDI2NDEyMjM5OTQ5ODI0IiwgIjExMTQxMDc1MDE0NTk0NDM3MTIiLCAiMTEwNjUxMTc1MDk5NDgxNzAyNCIsICIxMTA4MzgyNzIxODQyMjY2MTEyIiwgIjExMDgyNzM2MDczNTUwNTYxMjgiLCAiMTExNDYzMTI3NDQ1NzY0MDk2MCIsICIxMTA1Nzg3Nzg1NTU3MDEyNDgwIiwgIjExMTY2MDM5MDYwOTQ1OTIwMDAiLCAiMTExNDI2NDQ4ODk5NDM4MTgyNCIsICIxMTE2MzA3MDExNTA1OTM0MzM2IiwgIjExMTgyNDgzOTk1OTYyMTIyMjQiLCAiMTEwODc0NTQzMjY1NjczNjI1NiIsICIxMTE5NzA0Mjc0OTgyNjkwODE2IiwgIjExMDMyMzM2MzMwMzk2NzEyOTYiLCAiMTExNTkyNDE1Njg4ODExMzE1MiIsICIxMTE2NjAwOTUxMjM2Nzc1OTM2IiwgIjExMTc3MzE2MzgxMjM5MjU1MDQiLCAiMTEwMjUwMzYwNjM3OTU5NzgyNCIpKSAlPiUgZ3JvdXBfYnkocmV0d2VldF90d2VldGlkKSAlPiUgYXJyYW5nZSh0d2VldF90aW1lKSAlPiUgbXV0YXRlKHJlYWNoPXNlcV9hbG9uZyh0d2VldF90aW1lKSkgJT4lIGdncGxvdChhZXMoeD10d2VldF90aW1lLCB5PXJlYWNoKSkgKyBnZW9tX2ppdHRlcihhZXMoY29sb3I9cmV0d2VldF90d2VldGlkKSkgKyBnZW9tX3BhdGgoYWVzKGNvbG91cj1yZXR3ZWV0X3R3ZWV0aWQpLCBzaXplPTAuNSwgYWxwaGE9MC41KSArCiAgICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT04KSwKICAgICAgICAgICNheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTgsIGFuZ2xlPS0yMCksCiAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTgpLAogICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9OCksCiAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTgpLAogICAgICAgICAgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTgpLAogICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTgpLAogICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIiwgc2l6ZT04KSwKICAgICAgICAgICNwYW5lbC5ncmlkLm1pbm9yPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICNwYW5lbC5ncmlkLm1ham9yPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksICAKICAgICAgICAgICNheGlzLmxpbmUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpKSArCiAgICAjY29vcmRfcG9sYXIodGhldGE9IngiLCBjbGlwID0gIm9uIikgKyAKICAgICNjb29yZF9mbGlwKCkgKyAKICAgICNnZ3Bsb3QyOjp0aGVtZV9idygpICsKICAgIGdncGxvdDI6OmxhYnMoCiAgICB4ID0iRGF0ZSIsIHkgPSAiUmV0d2VldHMiLCBmaWxsPSJUd2VldHMiLAogICAgdGl0bGUgPSAiIiwKICAgIHN1YnRpdGxlID0gIiIsCiAgICBjYXB0aW9uID0gIlRvcCAyMCBkaXJlY3RseSByZXR3ZWV0ZWQgc3RhdHVzZXMgYnkgMjE2IFNwYWluIElPIGFjY291bnRzXG5EaWZmZXJlbnQgQ29sb3IgPSBEaWZmZXJlbnQgU3RhdHVzXG5PbmUgRG90ID0gT25lIHRldHdlZXQgb2Ygc3RhdHVzXG5UaGUgc3RyYWlnaHRlciB0aGUgbGluZSwgdGhlIHNob3J0ZXIgdGhlIHRpbWUgYmV0d2VlbiByZXR3ZWV0c1xuU291cmNlOiBUd2l0dGVyIHRyYW5zcGFyZW5jeSByZXBvcnQiKQoKYGBgCgoqKipUaGUgbW9zdCByZXR3ZWV0ZWQgcG9zdCAoNDcgdGltZXMpIHdhcyBhIHBvc3QgZnJvbSB0aGVuLUNhdGFsb25pYSBQUCBEZXB1dHkgQW5kcmVhIExldnkgU29sZXIgZW1waGFzaXppbmcgYSBoYXJkbGluZSBzdGFuY2UgYWdhaW5zdCBDYXRhbG9uaWFuIHNlcGFyYXRpc20gZWZmb3J0czoqKioKCjxibG9ja3F1b3RlIGNsYXNzPSJ0d2l0dGVyLXR3ZWV0Ij48cCBsYW5nPSJlcyIgZGlyPSJsdHIiPlRvZG8gbWkgYXBveW8uIFVuYSB2ZXogbcOhcywgY29tbyBhIG90cm9zIHF1ZSBoZW1vcyBzdWZyaWRvIGVwaXNvZGlvcyBhc8OtIHBvciBkZWZlbmRlciBpZGVhcyBjb250cmFyaWFzIGFsIHRvdGFsaXRhcmlzbW8gbmFjaW9uYWxpc3RhLCBhbGVudGFkbyB5IHBhdHJvY2luYWRvIHBvciBlbCBHb2JpZXJubyBpbmRlcGVuZGVudGlzdGEuIMKhQmFzdGEgeWEgZGUgZmFzY2lzbW8gZW4gQ2F0YWx1w7FhISBOaSB1biBwYXNvIGF0csOhcy4gwqFTZWd1aXJlbW9zIGRlZmVuZGllbmRvIGxhIGxpYmVydGFkISA8YSBocmVmPSJodHRwczovL3QuY28vOXZvaHR6SFdBdCI+aHR0cHM6Ly90LmNvLzl2b2h0ekhXQXQ8L2E+PC9wPiZtZGFzaDsgQW5kcmVhIExldnkgKEBBTGV2eVNvbGVyKSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL0FMZXZ5U29sZXIvc3RhdHVzLzExMTYzMTEwMDUzNDMyMzIwMDA/cmVmX3NyYz10d3NyYyU1RXRmdyI+QXByaWwgMTEsIDIwMTk8L2E+PC9ibG9ja3F1b3RlPiA8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CgoqKipBIHJldHdlZXQgb2YgYSBwb3N0IGZyb20gdGhlIG9mZmljaWFsIFBQIFR3aXR0ZXIgYWNjb3VudCB1bmRlcnNjb3JpbmcgaXRzIHRvdWdoIHBvc2l0aW9uIG9uIGNyaW1pbmFsIGp1c3RpY2Ugd2FzIHJldHdlZXRlZCAzMiB0aW1lczoqKioKCjxibG9ja3F1b3RlIGNsYXNzPSJ0d2l0dGVyLXR3ZWV0Ij48cCBsYW5nPSJlcyIgZGlyPSJsdHIiPkRlZmVuZGVtb3MgbGEgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL1ByaXNpJUMzJUIzblBlcm1hbmVudGVSZXZpc2FibGU/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNQcmlzacOzblBlcm1hbmVudGVSZXZpc2FibGU8L2E+IHBhcmEgcXVlIGFzZXNpbm9zLCB2aW9sYWRvcmVzLCBwZWRlcmFzdGFzIHkgcGlyw7NtYW5vcyBxdWUgY2F1c2FuIGluY2VuZGlvcyBjb24gdsOtY3RpbWFzIG1vcnRhbGVzIG5vIHNhbGdhbiBkZSBsYSBjw6FyY2VsLiA8YnI+PGJyPkVsIFBTT0Ugdm90w7MgZW4gY29udHJhLiBIYXkgcXVlIGVjaGFyIGEgUGVkcm8gU8OhbmNoZXouIDxhIGhyZWY9Imh0dHBzOi8vdC5jby9VSVZRS1hwQzFRIj5waWMudHdpdHRlci5jb20vVUlWUUtYcEMxUTwvYT48L3A+Jm1kYXNoOyBQYXJ0aWRvIFBvcHVsYXIg8J+HqvCfh7ggKEBwb3B1bGFyZXMpIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vcG9wdWxhcmVzL3N0YXR1cy8xMTE0MTA3NTAxNDU5NDQzNzEyP3JlZl9zcmM9dHdzcmMlNUV0ZnciPkFwcmlsIDUsIDIwMTk8L2E+PC9ibG9ja3F1b3RlPiA8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CgoqKipBIHBvc3QgaGlnaGxpZ2h0aW5nIHRoYXQgUFAgaXMgdG91Z2ggb24gY3JpbWUgYW5kIGlsbGVnYWwgaW1taWdyYXRpb24gd2hpbGUgcHVzaGluZyBiYWNrIG9uIGEgVm94IHBhcnR5IHByb3Bvc2FsIHRvIGFybSBjaXRpemVucyBmcm9tIHRoZW4tUFAgRGVwdXR5IEphdmllciBNb3JvdG8gd2FzIHJldHdlZXRlZCAzMCB0aW1lczoqKiogIAoKPGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiPjxwIGxhbmc9ImVzIiBkaXI9Imx0ciI+RWwgUFAgZGVmaWVuZGUgbWVkaWRhcyBlc3RyaWN0YXMgY29udHJhIGxhIGRlbGluY3VlbmNpYSwgbGFzIG1hZmlhcyB5IGxhIGlubWlncmFjacOzbiBpbGVnYWwuIFkgZGVmZW5kZW1vcyBhIGxhIHBvbGljaWEgeSBsYSBndWFyZGlhIGNpdmlsLiBJbmNsdXNvIGRlZmVuZGVtb3MgbGEgcHJlc2nDs24gcGVybWFuZW50ZSByZXZpc2FibGUgcGFyYSBkZWxpdG9zIG11eSBncmF2ZXMuPGJyPlBlcm8gcHJvcG9uZXIgcXVlIGxvcyBlc3Bhw7FvbGVzIGxsZXZlbW9zIHBpc3RvbGEgcG9yIGxhIGNhbGxlLCBOTyA8YSBocmVmPSJodHRwczovL3QuY28vNHVYQlMyM21XSiI+cGljLnR3aXR0ZXIuY29tLzR1WEJTMjNtV0o8L2E+PC9wPiZtZGFzaDsgSmF2aWVyIE1hcm90byAoQEphdmllck1hcm90bykgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9KYXZpZXJNYXJvdG8vc3RhdHVzLzExMDgyNzM2MDczNTUwNTYxMjg/cmVmX3NyYz10d3NyYyU1RXRmdyI+TWFyY2ggMjAsIDIwMTk8L2E+PC9ibG9ja3F1b3RlPiA8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CgoqKipBIHRvcGljYWwgYW5hbHlzaXMgb2YgdGhlIG1vc3QgZnJlcXVlbnRseSBtZW50aW9uZWQgdGVybXMgcHJvdmlkZXMgaW5zaWdodCBpbnRvIHRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlcyB0aGF0IElPIGFjY291bnRzIHR3ZWV0ZWQuIFRoZSB0ZXJtcyB1c2VkIG1vc3Qgb2Z0ZW4gLS0gZXhjbHVkaW5nIGhhc2h0YWdzIGFuZCBtZW50aW9ucyAtLSB3ZXJlIGFsbW9zdCBleGNsdXNpdmVseSBlbGVjdGlvbi1yZWxhdGVkIGluIG5hdHVyZS4gUFNPRSBsZWFkZXIgUGVkcm8gU2FuY2hleiwgUGFydGlkbyBQb3B1bGFyIGFuZCBQUCBsZWFkZXIgUGFibG8gQ2FzYWRvIHdlcmUgdGhlIG1lbnRpb25lZCBlbnRpdGllcyBieSBJTyBhY2NvdW50cyB3aGlsZSB0b3BpY3MgcmVsYXRlZCB0byBlY29ub21pYyBhbmQgc29jaWFsIGp1c3RpY2UgYXMgd2VsbCBhcyBleGVjdXRpdmUgZGVjcmVlcyBmZWF0dXJlZCBwcm9taW5lbnRseSoqKgoKYGBge3IsIGVjaG89RkFMU0V9CnJlcXVpcmUoInRpZHl0ZXh0IikKcmVxdWlyZSgidG0iKQpyZXF1aXJlKCJ3b3JkY2xvdWQiKQojIyMjIyMjIwoKI1RleHQgQ2xlYW5pbmcKc2V0LnNlZWQoMTIzKQpzcGFpbl90ZXh0IDwtIHNwYWluc25hICU+JSBzZWxlY3QodHdlZXRfdGV4dCkKcmVtb3ZlSGFzaCA8LSBmdW5jdGlvbih4KSBnc3ViKCIjXFx3KyAqIiwgIiIsIHgpCnNwYWluX3RleHQkdHdlZXRfdGV4dCA8LSBzYXBwbHkoc3BhaW5fdGV4dCR0d2VldF90ZXh0LCByZW1vdmVIYXNoKQpyZW1vdmVVUkwgPC0gZnVuY3Rpb24oeCkgZ3N1YigiaHR0cFtbOmFsbnVtOl1bOnB1bmN0Ol1dKiIsICIiLCB4KQpzcGFpbl90ZXh0JHR3ZWV0X3RleHQgPC0gc2FwcGx5KHNwYWluX3RleHQkdHdlZXRfdGV4dCwgcmVtb3ZlVVJMKQpyZW1vdmVNZW50aW9uIDwtIGZ1bmN0aW9uKHgpIGdzdWIoIkBcXHcrICoiLCAiIiwgeCkKc3BhaW5fdGV4dCR0d2VldF90ZXh0IDwtIHNhcHBseShzcGFpbl90ZXh0JHR3ZWV0X3RleHQsIHJlbW92ZU1lbnRpb24pCiNoZWFkKHNwYWluX3RleHQpCgojI0JpZ3JhbXMKc3BhaW5fYmlncmFtcyA8LSBzcGFpbl90ZXh0ICU+JSB1bm5lc3RfdG9rZW5zKGJpZ3JhbSwgdHdlZXRfdGV4dCwgdG9rZW49Im5ncmFtcyIsIG49MikKI3NwYWluX2JpZ3JhbXMgJT4lIGNvdW50KGJpZ3JhbSwgc29ydCA9IFRSVUUpCnJlcXVpcmUoInRpZHlyIikKY3VzdG9tX3N0b3Bfd29yZHMgPC0gYmluZF9yb3dzKHN0b3Bfd29yZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2ZyYW1lKHdvcmQgPSB0bTo6c3RvcHdvcmRzKCJzcGFuaXNoIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxleGljb24gPSAiY3VzdG9tIikpCmJpZ3JhbXNfc2VwYXJhdGVkIDwtIHNwYWluX2JpZ3JhbXMgJT4lCiAgc2VwYXJhdGUoYmlncmFtLCBjKCJ3b3JkMSIsICJ3b3JkMiIpLCBzZXAgPSAiICIpCmJpZ3JhbXNfZmlsdGVyZWQgPC0gYmlncmFtc19zZXBhcmF0ZWQgJT4lCiAgZmlsdGVyKCF3b3JkMSAlaW4lIGMoY3VzdG9tX3N0b3Bfd29yZHMkd29yZCwgd29yZCkpICU+JQogIGZpbHRlcighd29yZDIgJWluJSBjKGN1c3RvbV9zdG9wX3dvcmRzJHdvcmQsIHdvcmQpKQoKI2hlYWQobXlTdG9wd29yZHMpCiMgbmV3IGJpZ3JhbSBjb3VudHM6CmJpZ3JhbV9jb3VudHMgPC0gYmlncmFtc19maWx0ZXJlZCAlPiUgCiAgY291bnQod29yZDEsIHdvcmQyLCBzb3J0ID0gVFJVRSkKI2JpZ3JhbV9jb3VudHMKYmlncmFtX2NvdW50cyRiaWdyYW1zIDwtIGRvLmNhbGwocGFzdGUsIGMoYmlncmFtX2NvdW50c1tjKCJ3b3JkMSIsICJ3b3JkMiIpXSwgc2VwID0gIiAiKSkKYmlncmFtX2NvdW50cyAlPiUgc2VsZWN0KGJpZ3JhbXMsIG4pCndvcmRjbG91ZCh3b3JkcyA9IGJpZ3JhbV9jb3VudHMkYmlncmFtcywgZnJlcSA9IGJpZ3JhbV9jb3VudHMkbiwgbWluLmZyZXEgPSAxMDAsCiAgICAgICAgICBtYXgud29yZHM9NTAsIHJhbmRvbS5vcmRlcj1GQUxTRSwgc2NhbGU9YygzLC41KSwgcm90LnBlcj0wLjI1LCAKICAgICAgICAgIGNvbG9ycz1icmV3ZXIucGFsKDQsICJEYXJrMiIpKQoKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0KcmVxdWlyZSgidHJlZW1hcCIpCmJpZ3JhbV9jb3VudHMgJT4lIHNlbGVjdChiaWdyYW1zLCBuKSAlPiUgYXJyYW5nZShkZXNjKG4pKSAlPiUgdG9wX24oNTApICU+JSB0cmVlbWFwKGluZGV4PSJiaWdyYW1zIiwgdlNpemU9Im4iLCBwYWxldHRlPSJSZFlsR24iLCByYW5nZT1jKDIwMCwzMDAwKSAsIG1hcHBpbmc9YygyMDAsMTAwMCwzMDAwKSwgdGl0bGUgPSAiU2FsZXMgVHJlZW1hcCBGb3IgY2F0ZWdvcmllcyIsIGZvbnRzaXplLmxhYmVscyA9IGMoNywgNSksIGFsaWduLmxhYmVscyA9bGlzdChjKCJjZW50cmUiLCJjZW50cmUiKSxjKCJsZWZ0IiwidG9wIikpKQpgYGAKCioqKlRoZSBTcGFpbiBJTyB0d2VldHMgdmVyeSBmcmVxdWVudGx5IG1lbnRpb25lZCBQUCBhbmQgaXRzIGxlYWRlcnMuIE9mIHRoZSB0b3AgdGVuIG1vc3QgbWVudGlvbmVkIFR3aXR0ZXIgYWNjb3VudHMsIDggd2VyZSBhc3NvY2lhdGVkIHdpdGggUFAgYW5kIDIgd2l0aCBQU09FICh0aGUgcGFydHkncyBvZmZpY2lhbCBhY2NvdW50IGFuZCB0aGF0IG9mIGl0cyBsZWFkZXIgUGVkcm8gU2FuY2hleikuIFRoZXJlIHdlcmUgZmFyIGZld2VyIG1lbnRpb25zIG9mIG90aGVyIFBTT0UgbGVhZGVycywgb3RoZXIgcGFydGllcywgb3IgdGhpZXIgbGVhZGVycy4gRWFjaCBsaW5lIGluIHRoZSBncmFwaCBiZWxvdyByZXByZXNlbnRzIGEgbWVudGlvbiBpbiBhIHR3ZWV0IGJ5IGFuIElPIGFjY291bnQgb2YgYSBQUCBhY2NvdW50IChyZWQpIG9yIGEgUFNPRSBhY2NvdW50IChibHVlKS4qKioKCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPVRSVUV9CiNyZXF1aXJlKCJnZ3JhcGgiKQojcmVxdWlyZSgiaWdyYXBoIikKI3JlcXVpcmUoImhhdmVuIikKI3JlcXVpcmUoInJlYWRyIikKCmRhdGEgPC0gc3BhaW5zbmEgJT4lIHNlbGVjdCh1c2VyX3NjcmVlbl9uYW1lLCB0d2VldF90ZXh0KSAlPiUgdW5uZXN0X3Rva2Vucyh0d2VldHMsIHRva2VuPSJyZWdleCIsIHR3ZWV0X3RleHQpICU+JSBmaWx0ZXIoc3RyX2RldGVjdCh0d2VldHMsICJeQCIpKSAKZGF0YSR0d2VldHMgPC0gZ3N1YigiXFw6IiwiIixkYXRhJHR3ZWV0cykKZGF0YSAlPiUgZ3JvdXBfYnkodHdlZXRzKSAlPiUgY291bnQoKSAlPiUgYXJyYW5nZShkZXNjKG4pKQpzZXQuc2VlZCgzOTUyKQpsYWJlbHMgPC0gcmVhZC5jc3YoImxhYmVscy5jc3YiKQpsYWJlbHMgPC0gbGFiZWxzWywxOjJdCmRhdGEyIDwtIGRhdGEgJT4lIGxlZnRfam9pbihsYWJlbHMpCmRhdGEyIDwtIGRhdGEyICU+JSBuYS5vbWl0KCkKCiNkYXRhMiAlPiUgaGVhZCgyKQpoYWlyYmFsbCA8LSBncmFwaF9mcm9tX2RhdGFfZnJhbWUoZGF0YTIpCgpWKGhhaXJiYWxsKSRub2RlX2xhYmVsIDwtIHVubmFtZShpZmVsc2UoZGVncmVlKGhhaXJiYWxsLCBtb2RlPSJpbiIpW1YoaGFpcmJhbGwpXSA+IDEwMCwgbmFtZXMoVihoYWlyYmFsbCkpLCAiIikpCiNWKGhhaXJiYWxsKSRub2RlX3NpemUgPC0gdW5uYW1lKGlmZWxzZShkZWdyZWUoaGFpcmJhbGwpW1YoaGFpcmJhbGwpXSA+IDEwMCwgZGVncmVlKGhhaXJiYWxsKSwgMCkpIAoKI2hhaXJiYWxsICU+JSBnZ3JhcGgobGF5b3V0ID0gJ2xpbmVhcicsIGNpcmN1bGFyID0gVFJVRSkgKyAKIyAgZ2VvbV9lZGdlX2FyYyhlZGdlX3dpZHRoPTAuMDEyNSwgYWVzKGNvbG91cj1wYXJ0eSwgYWxwaGE9Li5pbmRleC4uKSkgKwojICBnZW9tX25vZGVfbGFiZWwoYWVzKGxhYmVsPW5vZGVfbGFiZWwsIHNpemU9MC4yKSwgbGFiZWwuc2l6ZT0wICxzZWdtZW50LmNvbG91cj0iZ3JheSIsIGNvbG9yPSJibGFjayIscmVwZWw9VCkgKwogICNjb29yZF9maXhlZCgpICsKICAjc2NhbGVfc2l6ZV9hcmVhKHRyYW5zPSJzcXJ0IikgKwojICBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9MiksCiMgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9MiksCiMgICAgICAgICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT0yKSwKIyAgICAgICAgICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIiwgc2l6ZT04KSwKIyAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vcj1lbGVtZW50X2JsYW5rKCksCiMgICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3I9ZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCAKIyAgICAgICAgICAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpKSArCiAgI3RoZW1lX3ZvaWQoKSsKIyAgbGFicyh0aXRsZT0iIiwgCiMgICAgICAgc3VidGl0bGU9IiIsIAojICAgICAgIGNhcHRpb249IlRvcCAxMCBtb3N0IG1lbnRpb25lZCBhY2NvdW50cyBieSBTcGFpbiBJTyBhY2NvdW50c1xuUmVkIExpbmVzID0gTWVudGlvbnMgb2YgUFAgYWNjb3VudHNcbkJsdWUgTGluZXMgPSBNZW50aW9ucyBvZiBQU09FIGFjY291bnRzXG5Tb3VyY2U6IFR3aXR0ZXIgdHJhbnNwYXJlbmN5IHJlcG9ydCIpICsKICAjdGhlbWVfZ3JhcGgoYmFzZV9mYW1pbHk9Zm9udF9hbikgKwojICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKaGFpcmJhbGwgJT4lIGdncmFwaChsYXlvdXQgPSAnbGluZWFyJywgY2lyY3VsYXIgPSBGQUxTRSkgKyAKICBnZW9tX2VkZ2VfYXJjKGVkZ2Vfd2lkdGg9MC4wMTI1LCBhZXMoY29sb3VyPXBhcnR5KSkgKwogICNnZW9tX2VkZ2VfYXJjKGNvbG9yID0gIm9yYW5nZSIsIHdpZHRoPTAuMDUpICsKICBnZW9tX25vZGVfcG9pbnQoc2l6ZT0wLjIsIGNvbG9yPSJncmF5NTAiKSArCiAgI2dlb21fbm9kZV9sYWJlbChhZXMobGFiZWw9bm9kZV9sYWJlbCwgc2l6ZT0wLjAwMDAwMDAwMDIpLCBjb2xvcj0iYmxhY2siKSArCiAgZ2VvbV9ub2RlX2xhYmVsKGFlcyhsYWJlbD1ub2RlX2xhYmVsLCBzaXplID0gMC4wMjUpLCBudWRnZV95PTEyLCByZXBlbCA9IFRSVUUsIGNvbG9yPSJibGFjayIpICsKICAjY29vcmRfZml4ZWQoKSArCiAgI3NjYWxlX3NpemVfYXJlYSh0cmFucz0ic3FydCIpICsKICBnZ3Bsb3QyOjp0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT0yKSwKICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9MiksCiAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTIpLAogICAgICAgICAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIsIHNpemU9OCksCiAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vcj1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvcj1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgICAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCkpICsKICAjdGhlbWVfdm9pZCgpKwogIGxhYnModGl0bGU9IiIsIAogICAgICAgc3VidGl0bGU9IiIsIAogICAgICAgY2FwdGlvbj0iVG9wIDEwIG1vc3QgbWVudGlvbmVkIGFjY291bnRzIGJ5IFNwYWluIElPIGFjY291bnRzXG5SZWQgTGluZXMgPSBNZW50aW9ucyBvZiBQUCBhY2NvdW50c1xuQmx1ZSBMaW5lcyA9IE1lbnRpb25zIG9mIFBTT0UgYWNjb3VudHNcblNvdXJjZTogVHdpdHRlciB0cmFuc3BhcmVuY3kgcmVwb3J0IikgKwogICN0aGVtZV9ncmFwaChiYXNlX2ZhbWlseT1mb250X2FuKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKYGBgCgoqKipPZiB0aGUgMjcsMDQyIHRvdGFsIHJldHdlZXRzLCAxIG9mIGV2ZXJ5IDMgd2FzIGFuIElPIGFjY291bnQgcmV0d2VldGluZyBhbm90aGVyIElPIGFjY291bnQuIENvbnNpZGVyaW5nIHRoZSBjb250ZW50IG9mIHRoZSB0d2VldHMsIHRoaXMgcGF0dGVybiBzdWdnZXN0cyBhIGNvb3JkaW5hdGVkIGNhbXBhaWduIHRvIGFtcGxpZnkgcGFydHkgbmFycmF0aXZlcy4gVGhlIGdyYXBoIGJlbG93IGhpZ2hsaWdodHMgdGhlIHZvbHVtZSBvZiByZXR3ZWV0IGFjdGl2aXR5IGFtb25nIElPIGFjY291bnRzIHdoZXJlIGVhY2ggbGluZSByZXByZXNlbnRzIGFuIElPIHJldHdlZXQgb2YgYW5vdGhlciBJTyBhY2NvdW50LiBHaXZlbiB0aGUgaGlnaCBudW1iZXIgb2YgcmV0d2VldHMgb2Ygb3RoZXIgSU8gYWNjb3VudHMgYW5kIHRoZSBsb3cgbnVtYmVyIG9mIGZvbGxvd2VycyBvZiB0aGVzZSBhY2NvdW50cywgaXQgaXMgbGlrZWx5IHRoYXQgbWFueSBvZiB0aGUgZm9sbG93ZXJzIG9mIElPIGFjY291bnRzIHdlcmUgSU8gYWNjb3VudHMuKioqCgpgYGB7ciwgZWNobz1GQUxTRX0KcmVxdWlyZSgidGlkeXRleHQiKQpyZXF1aXJlKCJzdHJpbmdyIikKcmVxdWlyZSgiaWdyYXBoIikKcmVxdWlyZSgiaGF2ZW4iKQpyZXF1aXJlKCJyZWFkciIpCnJlcXVpcmUoImdncmFwaCIpCnJlcXVpcmUoImhyYnJ0aGVtZXMiKQoKc3BhaW5ydDIgPC0gc3BhaW5ydApzcGFpbnJ0MiA8LSBzcGFpbnJ0MlshKGlzLm5hKHNwYWlucnQyJHJldHdlZXRfdXNlcmlkKSB8IHNwYWlucnQyJHJldHdlZXRfdXNlcmlkPT0iIiksIF0KI3NwYWlucnQyICU+JSBzZWxlY3QodXNlcmlkLCByZXR3ZWV0X3VzZXJpZCwgaXNfcmV0d2VldCkgJT4lIGZpbHRlcihpc19yZXR3ZWV0PT0idHJ1ZSIpICM4LDgzMSByZXR3ZWV0cwpzcGFpbnJ0MiA8LSBzcGFpbnJ0MiAlPiUgc2VsZWN0KHVzZXJpZCwgcmV0d2VldF91c2VyaWQpCgojbGVuZ3RoKHVuaXF1ZShhcy5mYWN0b3Ioc3BhaW5ydDIkdXNlcmlkKSkpCiNsZW5ndGgodW5pcXVlKGFzLmZhY3RvcihzcGFpbnJ0MiRyZXR3ZWV0X3VzZXJpZCkpKQoKc25hcnQgPC0gZ3JhcGguZGF0YS5mcmFtZShzcGFpbnJ0MiwgZGlyZWN0ZWQ9VCkKVihzbmFydCkkY29sb3IgPC0gIm9yYW5nZSIKI1Yoc25hKVtkZWdyZWUoc25hLCBtb2RlPSJpbiIpID4gMTAwMF0kY29sb3IgPC0gInJlZCIgI2Rpc3Rpbmd1aXNoaW5nIGhpZ2ggZGVncmVlCiNWKHNuYXJ0KSRub2RlX2xhYmVsIDwtIHVubmFtZShpZmVsc2UoZGVncmVlKHNuYXJ0LCBtb2RlPSJpbiIpW1Yoc25hcnQpXSA+IDEwLCBuYW1lcyhWKHNuYXJ0KSksICIiKSkKI1Yoc25hcnQpJG5vZGVfc2l6ZSA8LSB1bm5hbWUoaWZlbHNlKGRlZ3JlZShzbmFydClbVihzbmEpXSA+IDEwLCBkZWdyZWUoc25hcnQpLCAwKSkgCkUoc25hcnQpJGNvbG9yIDwtICJncmF5IgpzZXQuc2VlZCgzOTUyKQojcGxvdChzbmFydCwKIyAgICAgdmVydGV4LnNpemUgPSBkZWdyZWUoc25hcnQsIG1vZGU9J2luJykqMC4wMDUsCiMgICAgIHZlcnRleC5sYWJlbD1OQSwKIyAgICAgZWRnZS5hcnJvdy5zaXplID0gMC4wMDEsCiMgICAgIGVkZ2UuYXJyb3cubW9kZSA9ICJfIiwKIyAgICAgbGF5b3V0ID0gbGF5b3V0LmthbWFkYS5rYXdhaSkKICAgICAjbGF5b3V0ID0gbGF5b3V0LmF1dG8pCiAgICAgI2xheW91dCA9IGxheW91dF93aXRoX2trKQogICAgICN2ZXJ0ZXgubGFiZWwuY2V4PSAwLjYsCiAgICAgI3ZlcnRleC5sYWJlbC5kZWdyZWU9LXBpLzIpCgoKI0FSQyBMQVlPVVQgLSBWRVJZIFBSRVRUWSEKc25hcnQgJT4lIGdncmFwaChsYXlvdXQgPSAnbGluZWFyJykgKyAKICAgIGdlb21fZWRnZV9hcmMoY29sb3IgPSAib3JhbmdlIiwgd2lkdGg9MC4wNSkgKwogICAgZ2VvbV9ub2RlX3BvaW50KHNpemU9MC4yLCBjb2xvcj0iZ3JheTUwIikgKwogICAgZ2dwbG90Mjo6dGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT04KSwKICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTgpLAogICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTgpLAogICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIiwgc2l6ZT04KSwKICAgICAgICAgIHBhbmVsLmdyaWQubWlub3I9ZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvcj1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCkpICsKICAgICN0aGVtZV92b2lkKCkrCiAgICBsYWJzKHRpdGxlPSIiLCAKICAgICAgICAgc3VidGl0bGU9IiIsIAogICAgICAgICBjYXB0aW9uPSJTcGFpbiBJTyByZXR3ZWV0IGFjdGl2aXR5IGFtb25nIElPIGFjY291bnRzXG4xMjYgSU8gYWNjb3VudHMgcmV0d2VldGVkIDExMSBJTyBhY2NvdW50cyA4LDgzMSB0aW1lc1xuRG90cyA9IElPIGFjY291bnRzLiBMaW5lcyA9IFJldHdlZXRzXG5Tb3VyY2U6IFR3aXR0ZXIgdHJhbnNwYXJlbmN5IHJlcG9ydCIpICsKICAjdGhlbWVfZ3JhcGgoYmFzZV9mYW1pbHk9Zm9udF9hbikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCmBgYAoKCmBgYHtyLCBldmFsPUZBTFNFLCBlY2hvPUZBTFNFfQojVVJMUyBCVUJCTEUgR1JBUEg/CiNFCiMjc2x1Z3M/PwpyZXF1aXJlKCJ0aWR5ciIpCmRvbWFpbiA8LSBmdW5jdGlvbih4KSBzdHJzcGxpdChnc3ViKCJodHRwOi8vfGh0dHBzOi8vfHd3d1xcLiIsICIiLCB4KSwgIi8iKSNbYygxLCAxKV0Kc3BhaW51cmwkdXJscyA8LSBnc3ViKCJcXFt8XFxdIiwiIiwgc3BhaW51cmwkdXJscykgI3JlbW92ZSB0aGUgYnJhY2tldHMgYXJvdW5kCnNwYWludXJsJHVybHMgPC0gZ3N1YigiXFwnIiwiIiwgc3BhaW51cmwkdXJscykKc3BhaW51cmwkdXJsX2xpc3QgPC0gc2FwcGx5KHNwYWludXJsJHVybHMsIGRvbWFpbikKc3BhaW51cmwkZG9tYWluIDwtIGxhcHBseShzcGFpbnVybCR1cmxfbGlzdCwgZnVuY3Rpb24oeCkgeFsxXSkKc3BhaW51cmwkZG9tYWluMiA8LSB1bmxpc3Qoc3BhaW51cmwkZG9tYWluKQoKI01PU1QgU0hBUkVEIFVSTCBMSU5LUwpzcGFpbnVybCAlPiUgc2VsZWN0KHVybHMsIGRvbWFpbjIpICU+JSBncm91cF9ieSh1cmxzKSAlPiUgY291bnQoKSAlPiUgYXJyYW5nZShkZXNjKG4pKQojTU9TVCBTSEFSRUQgRE9NQUlOUwpzcGFpbnVybCAlPiUgc2VsZWN0KHVzZXJfc2NyZWVuX25hbWUsIGRvbWFpbjIsIHVybHMpICU+JSBncm91cF9ieShkb21haW4yKSAlPiUgY291bnQoKSAlPiUgYXJyYW5nZShkZXNjKG4pKQpzcGFpbnVybCAlPiUgc2VsZWN0KHVzZXJfc2NyZWVuX25hbWUsIGRvbWFpbjIsIHVybHMpICU+JSBncm91cF9ieSh1cmxzKSAlPiUgY291bnQoKSAlPiUgYXJyYW5nZShkZXNjKG4pKQoKYGBgCgoKYGBge3IsIGVjaG89RkFMU0UsIGV2YWw9RkFMU0V9CiNSZXR3ZWV0cyB2cy4gbm9uIFJldHdlZXRzCnNwYWlucnQgJT4lIGdyb3VwX2J5KGFzLmZhY3Rvcihpc19yZXR3ZWV0KSkgJT4lIGNvdW50KCkgCiNXaG8gd2VyZSB0aGV5IHJldHdlZXRpbmc/CnNwYWlucnQgJT4lIGdyb3VwX2J5KGFzLmZhY3RvcihyZXR3ZWV0X3VzZXJpZCkpICU+JSBmaWx0ZXIoaXNfcmV0d2VldD09InRydWUiKSAlPiUgY291bnQoKSAlPiUgYXJyYW5nZShkZXNjKG4pKQojd2hhdCB3ZXJlIHRoZXkgcmV0d2VldGluZwpzcGFpbnJ0ICU+JSBncm91cF9ieShhcy5mYWN0b3IocmV0d2VldF90d2VldGlkKSkgJT4lIGZpbHRlcihpc19yZXR3ZWV0PT0idHJ1ZSIpICU+JSBjb3VudCgpICU+JSBhcnJhbmdlKGRlc2MobikpCgojMSBodHRwczovL3R3aXR0ZXIuY29tL0FMZXZ5U29sZXIvc3RhdHVzLzExMTYzMTEwMDUzNDMyMzIwMDAKIzIgaHR0cHM6Ly90d2l0dGVyLmNvbS9wb3B1bGFyZXMvc3RhdHVzLzExMTQxMDc1MDE0NTk0NDM3MTIKIzMgaHR0cHM6Ly90d2l0dGVyLmNvbS9wb3B1bGFyZXMvc3RhdHVzLzExMDY1MTE3NTA5OTQ4MTcwMjQKCiNsZXQncyBnZXQgYSBjbGVhbiB2ZXJzaW9uIHdpdGggdXNlcmlkIDwtPiByZXR3ZWV0X3VzZXJpZCBmb3Igc29jaWFsIG5ldHdvcmsgYW5hbHlzaXMKc3BhaW5ydDIgPC0gc3BhaW5ydApzcGFpbnJ0MiA8LSBzcGFpbnJ0MlshKGlzLm5hKHNwYWlucnQyJHJldHdlZXRfdXNlcmlkKSB8IHNwYWlucnQyJHJldHdlZXRfdXNlcmlkPT0iIiksIF0Kc3BhaW5ydDIgJT4lIHNlbGVjdCh1c2VyaWQsIHJldHdlZXRfdXNlcmlkLCBpc19yZXR3ZWV0KSAlPiUgZmlsdGVyKGlzX3JldHdlZXQ9PSJ0cnVlIikgIzgsODMxIHJldHdlZXRzCnNwYWlucnQyIDwtIHNwYWlucnQyICU+JSBzZWxlY3QodXNlcmlkLCByZXR3ZWV0X3VzZXJpZCkKCmxlbmd0aCh1bmlxdWUoYXMuZmFjdG9yKHNwYWlucnQyJHVzZXJpZCkpKQpsZW5ndGgodW5pcXVlKGFzLmZhY3RvcihzcGFpbnJ0MiRyZXR3ZWV0X3VzZXJpZCkpKQoKI21hdGNoIHRoZSB1c2VyaWQgdG8gdGhlIHJldHdlZXQgaWQgdG8gc2VlIGhvdyB0aGV5IHdlcmUgc2hhcmluZyBpbmZvIHdpdGggb25lIGFub3RoZXIuLi4KCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0Kc25hX2hhc2ggPC0gZ3JhcGguZGF0YS5mcmFtZShkYXRhX2hhc2gsIGRpcmVjdGVkPVQpCiNsYXlvdXQxIDwtIGxheW91dC5mcnVjaHRlcm1hbi5yZWluZ29sZChzbmFfaGFzaCkKVihzbmFfaGFzaCkkY29sb3IgPC0gInllbGxvdyIKVihzbmFfaGFzaClbZGVncmVlKHNuYV9oYXNoLCBtb2RlPSJpbiIpID4gMTAwMF0kY29sb3IgPC0gInJlZCIgI2Rpc3Rpbmd1aXNoaW5nIGhpZ2ggZGVncmVlCkUoc25hX2hhc2gpJGNvbG9yIDwtICJncmF5IgpWKHNuYV9oYXNoKSRub2RlX2xhYmVsIDwtIHVubmFtZShpZmVsc2UoZGVncmVlKHNuYV9oYXNoLCBtb2RlPSJpbiIpW1Yoc25hKV0gPiAxMDAwLCBuYW1lcyhWKHNuYV9oYXNoKSksICIiKSkKc2V0LnNlZWQoMzk1MikKCnBsb3Qoc25hX2hhc2gsCiAgICAgdmVydGV4LnNpemUgPSBkZWdyZWUoc25hX2hhc2gsIG1vZGU9J2luJykqMC4wMSwKICAgICB2ZXJ0ZXgubGFiZWwgPSBpZmVsc2UoZGVncmVlKHNuYV9oYXNoKSA+IDEwMDAsIFYoc25hX2hhc2gpJG5vZGVfbGFiZWwsIE5BKSwKICAgICBlZGdlLmFycm93LnNpemUgPSAwLjAwMSwKICAgICBlZGdlLmFycm93Lm1vZGUgPSAiXyIsCiAgICAgdmVydGV4LmxhYmVsLmNleD0gMC42LAogICAgIGxheW91dCA9IGxheW91dC5ncmFwaG9wdCkKICAgICAjbGF5b3V0ID0gbGF5b3V0LmthbWFkYS5rYXdhaSkKICAgICAjbGF5b3V0ID0gbGF5b3V0LmF1dG8pCiAgICAgI2xheW91dCA9IGxheW91dC5ncmlkLjNkKQogICAgICNsYXlvdXQgPSBsYXlvdXRfd2l0aF9raykKCgpyZXF1aXJlKCJnZ3JhcGgiKQpyZXF1aXJlKCJocmJydGhlbWVzIikKCiNDSVJDVUxBUiBMQVlPVVQhIC0tIE5FRURTIFRXRUFLSU4Kc25hICU+JSBnZ3JhcGgobGF5b3V0ID0gJ2xpbmVhcicsIGNpcmN1bGFyID0gVFJVRSkgKyAKICBnZW9tX2VkZ2VfYXJjKGVkZ2Vfd2lkdGg9MC4wMjUsIGFlcyhhbHBoYT0uLmluZGV4Li4pKSArCiAgZ2VvbV9ub2RlX2xhYmVsKGFlcyhsYWJlbD1ub2RlX2xhYmVsLCBzaXplPW5vZGVfc2l6ZSksCiAgICAgICAgICAgICAgICAgIGxhYmVsLnNpemU9MCwgZmlsbD0iI2ZmZmZmZjY2Iiwgc2VnbWVudC5jb2xvdXI9InNwcmluZ2dyZWVuIiwKICAgICAgICAgICAgICAgICAgY29sb3I9InNsYXRlYmx1ZSIsIHJlcGVsPVRSVUUsIGZhbWlseT1mb250X2FuLCBmb250ZmFjZT0iYm9sZCIpICsKICBjb29yZF9maXhlZCgpICsKICBzY2FsZV9zaXplX2FyZWEodHJhbnM9InNxcnQiKSArCiAgbGFicyh0aXRsZT0iTWVudGlvbiBSZWxhdGlvbnNoaXBzIiwgc3VidGl0bGU9Ik1vc3QgbWVudGlvbmVkIHNjcmVlbiBuYW1lcyBsYWJlbGVkLiBEYXJrZXIgZWRnZXMgPT0gbW9yZSBtZW50aW9ucy4gTm9kZSBzaXplID09IGxhcmdlciBkZWdyZWUiKSArCiAgdGhlbWVfZ3JhcGgoYmFzZV9mYW1pbHk9Zm9udF9hbikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgojQVJDIExBWU9VVCAtIFZFUlkgUFJFVFRZIQpnZ3JhcGgoc25hX2hhc2gsIGxheW91dCA9ICdsaW5lYXInKSArIAogICAgZ2VvbV9lZGdlX2FyYyhjb2xvciA9ICJvcmFuZ2UiLCB3aWR0aD0wLjAwNykgKwogICAgZ2VvbV9ub2RlX3BvaW50KHNpemU9MiwgY29sb3I9ImdyYXk1MCIpICsKICAgIHRoZW1lX3ZvaWQoKQoKYGBgCgoKCmBgYHtyLCBlY2hvPUZBTFNFLCBlY2hvPUZBTFNFfQojdXNlciAtPiBtZW50aW9uIC0+IGhhc2h0YWcKI1NBTktFWSBESUFHUkFNCgpgYGAKCgpgYGB7ciwgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0KIyMjCnNwYWluX3RleHQgPC0gc3BhaW5zbmEgJT4lIHNlbGVjdCh0d2VldF90ZXh0KQpzcGFpbl9iaWdyYW1zIDwtIHNwYWluX3RleHQgJT4lIHVubmVzdF90b2tlbnMoYmlncmFtLCB0d2VldF90ZXh0LCB0b2tlbj0ibmdyYW1zIiwgbj0yKQpzcGFpbl9iaWdyYW1zICU+JSBjb3VudChiaWdyYW0sIHNvcnQgPSBUUlVFKQoKcmVxdWlyZSgidGlkeXIiKQpiaWdyYW1zX3NlcGFyYXRlZCA8LSBzcGFpbl9iaWdyYW1zICU+JQogIHNlcGFyYXRlKGJpZ3JhbSwgYygid29yZDEiLCAid29yZDIiKSwgc2VwID0gIiAiKQpiaWdyYW1zX2ZpbHRlcmVkIDwtIGJpZ3JhbXNfc2VwYXJhdGVkICU+JQogIGZpbHRlcighd29yZDEgJWluJSBjKGN1c3RvbV9zdG9wX3dvcmRzJHdvcmQsIHdvcmQpKSAlPiUKICBmaWx0ZXIoIXdvcmQyICVpbiUgYyhjdXN0b21fc3RvcF93b3JkcyR3b3JkLCB3b3JkKSkKIyBuZXcgYmlncmFtIGNvdW50czoKYmlncmFtX2NvdW50cyA8LSBiaWdyYW1zX2ZpbHRlcmVkICU+JSAKICBjb3VudCh3b3JkMSwgd29yZDIsIHNvcnQgPSBUUlVFKQpiaWdyYW1fY291bnRzCmBgYAoKIyMjCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQojU0lNUExJRllJTkcgQUxUCiNyZW1vdmluZyBzZWxmIGxvb3BzCnNuYV9zaW1wbGUgPC0gc2ltcGxpZnkoc25hLCByZW1vdmUubXVsdGlwbGU9VCwgcmVtb3ZlLmxvb3BzPVQpCiNsYXlvdXQgb3B0aW9ucwpsYXlvdXQyIDwtIGxheW91dC5mcnVjaHRlcm1hbi5yZWluZ29sZChzbmFfc2ltcGxlKQpWKHNuYV9zaW1wbGUpJGNvbG9yIDwtICJ5ZWxsb3ciClYoc25hX3NpbXBsZSlbZGVncmVlKHNuYV9zaW1wbGUsIG1vZGU9ImluIikgPiAxMDBdJGNvbG9yIDwtICJyZWQiClYoc25hX3NpbXBsZSkkc2l6ZT1kZWdyZWUoc25hX3NpbXBsZSwgbW9kZT0iaW4iKQpFKHNuYV9zaW1wbGUpJGNvbG9yIDwtICJncmF5IgpzZXQuc2VlZCgzOTUyKQpwbG90KHNuYV9zaW1wbGUsCiAgICAgI3ZlcnRleC5zaXplID0gVihzbmEpJGRlZ3JlZSwKICAgICB2ZXJ0ZXguc2l6ZSA9IGRlZ3JlZShzbmFfc2ltcGxlLCBtb2RlPSdpbicpKjAuMSwKICAgICB2ZXJ0ZXgubGFiZWw9aWZlbHNlKGRlZ3JlZShzbmFfc2ltcGxlKSA+IDEwMCwgVihzbmFfc2ltcGxlKSRub2RlX2xhYmVsLCBOQSksCiAgICAgZWRnZS5hcnJvdy5zaXplID0gMC4wMDEsCiAgICAgZWRnZS5hcnJvdy5tb2RlID0gIl8iLAogICAgIHZlcnRleC5sYWJlbC5jZXg9IDAuNiwKICAgICB2ZXJ0ZXgubGFiZWwuZGVncmVlPS1waS8yKQoKYGBgCgoKYGBge3IsIGVjaG89RkFMU0UsIGV2YWw9RkFMU0V9CiNNZXNzaW4nIGFyb3VuZC4uLgpzbmExIDwtIGdyYXBoLmRhdGEuZnJhbWUoZGF0YSkKI2RlZ3JlZShzbmExLCBtb2RlPSdpbicpClYoc25hMSkgIzQxNTYgdmVydGljZXMKRShzbmExKSAjNjgwODUgZWRnZXMKCnBsb3Qoc25hMSwKICAgICB2ZXJ0ZXguY29sb3I9cmFpbmJvdygzNSksCiAgICAgdmVydGV4LnNpemUgPSBWKHNuYTEpJGRlZ3JlZSwKICAgICBlZGdlLmFycm93LnNpemU9MC4xLAogICAgIGxheW91dD1sYXlvdXQuZnJ1Y2h0ZXJtYW4ucmVpbmdvbGQpCnBsb3Qoc25hMSwKICAgICB2ZXJ0ZXguY29sb3IgPSByYWluYm93KDM1KSwKICAgICB2ZXJ0ZXguc2l6ZSA9IGRlZ3JlZShzbmExLCBtb2RlPSdpbicpKjAuNCwKICAgICBlZGdlLmFycm93LnNpemU9MC4xLAogICAgIGxheW91dD1sYXlvdXQuZ3JhcGhvcHQpCgpoczEgPC0gaHViX3Njb3JlKHNuYTEpJHZlY3RvcgphczEgPC0gYXV0aG9yaXR5X3Njb3JlKHNuYTEpJHZlY3RvcgpwYXIobWZyb3c9YygxLDIpKQpzZXQuc2VlZCgxMjMpCnBsb3Qoc25hMSwgdmVydGV4LnNpemU9aHMxKjMwLAogICAgIG1haW49J0h1YnMnLAogICAgIHZlcnRleC5jb2xvcj1yYWluYm93KDUpLAogICAgIGVkZ2UuYXJyb3cuc2l6ZT0wLjEsCiAgICAgdmVydGV4LmxhYmVsPU5BLAogICAgIGxheW91dD1sYXlvdXQua2FtYWRhLmthd2FpKQpwbG90KHNuYTEsIHZlcnRleC5zaXplPWFzMSozMCwKICAgICBtYWluPSdBdXRob3JpdGllcycsCiAgICAgdmVydGV4LmNvbG9yPXJhaW5ib3coNSksCiAgICAgZWRnZS5hcnJvdy5zaXplPTAuMSwKICAgICB2ZXJ0ZXgubGFiZWw9TkEsCiAgICAgbGF5b3V0PWxheW91dC5rYW1hZGEua2F3YWkpCgpzcGFpbl9uZXQgPC0gZ3JhcGguZGF0YS5mcmFtZShkYXRhLCBkaXJlY3RlZD1GKQpzcGFpbl9jbmV0IDwtIGNsdXN0ZXJfZWRnZV9iZXR3ZWVubmVzcyhzcGFpbl9uZXQpCnBsb3Qoc3BhaW5fY25ldCwgCiAgICAgc3BhaW5fbmV0LAogICAgIHZlcnRleC5zaXplPTEwLAogICAgIHZlcnRleC5sYWJlbC5jZXg9MC44KQoKYGBgCgpgYGB7ciwgZWNobz1GQUxTRX0KVihzbmExKSRub2RlX2xhYmVsIDwtIHVubmFtZShpZmVsc2UoZGVncmVlKHNuYTEpW1Yoc25hMSldID4gMjAsIG5hbWVzKFYoc25hMSkpLCAiIikpIApWKHNuYTEpJG5vZGVfc2l6ZSA8LSB1bm5hbWUoaWZlbHNlKGRlZ3JlZShzbmExKVtWKHNuYTEpXSA+IDIwLCBkZWdyZWUoc25hMSksIDApKSAKcmVxdWlyZSgiZ2dyYXBoIikKcmVxdWlyZSgiaHJicnRoZW1lcyIpCmdncmFwaChzbmExLCBsYXlvdXQgPSAnbGluZWFyJywgY2lyY3VsYXIgPSBUUlVFKSArIAogIGdlb21fZWRnZV9hcmMoZWRnZV93aWR0aD0wLjEyNSwgYWVzKGFscGhhPS4uaW5kZXguLikpICsKICBnZW9tX25vZGVfbGFiZWwoYWVzKGxhYmVsPW5vZGVfbGFiZWwsIHNpemU9bm9kZV9zaXplKSwKICAgICAgICAgICAgICAgICAgbGFiZWwuc2l6ZT0wLCBmaWxsPSIjZmZmZmZmNjYiLCBzZWdtZW50LmNvbG91cj0ic3ByaW5nZ3JlZW4iLAogICAgICAgICAgICAgICAgICBjb2xvcj0ic2xhdGVibHVlIiwgcmVwZWw9VFJVRSwgZmFtaWx5PWZvbnRfcmMsIGZvbnRmYWNlPSJib2xkIikgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHNjYWxlX3NpemVfYXJlYSh0cmFucz0ic3FydCIpICsKICBsYWJzKHRpdGxlPSJSZXR3ZWV0IFJlbGF0aW9uc2hpcHMiLCBzdWJ0aXRsZT0iTW9zdCByZXR3ZWV0ZWQgc2NyZWVuIG5hbWVzIGxhYmVsZWQuIERhcmtlcnMgZWRnZXMgPT0gbW9yZSByZXR3ZWV0cy4gTm9kZSBzaXplID09IGxhcmdlciBkZWdyZWUiKSArCiAgdGhlbWVfZ3JhcGgoYmFzZV9mYW1pbHk9Zm9udF9yYykgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQpyZWdleCA8LSAiQChbQS1aYS16XStbQS1aYS16MC05X10rKSg/IVtBLVphLXowLTlfXSpcXC4pIgpkYXRhIDwtIHNwYWluc25hICU+JSBzZWxlY3QodXNlcl9zY3JlZW5fbmFtZSwgdHdlZXRfdGV4dCkgJT4lIHVubmVzdF90b2tlbnModHdlZXRzLCB0b2tlbj0icmVnZXgiLCB0d2VldF90ZXh0KSAlPiUgZmlsdGVyKHN0cl9kZXRlY3QodHdlZXRzLCAiXkAiKSkgCmRhdGEkdHdlZXRzIDwtIGdzdWIoIlxcOiIsIiIsZGF0YSR0d2VldHMpCgpkYXRhICU+JSBncm91cF9ieSh0d2VldHMpICU+JSBjb3VudCgpICU+JSBhcnJhbmdlKGRlc2MobikpCgpzbmEgPC0gZ3JhcGguZGF0YS5mcmFtZShkYXRhLCBkaXJlY3RlZD1UKQpzZXQuc2VlZCgzOTUyKQpsYXlvdXQxIDwtIGxheW91dC5mcnVjaHRlcm1hbi5yZWluZ29sZChzbmEpClYoc25hKSRjb2xvciA8LSAieWVsbG93IgpWKHNuYSlbZGVncmVlKHNuYSwgbW9kZT0iaW4iKSA+IDEwMDBdJGNvbG9yIDwtICJyZWQiICNkaXN0aW5ndWlzaGluZyBoaWdoIGRlZ3JlZQpWKHNuYSkkbm9kZV9sYWJlbCA8LSB1bm5hbWUoaWZlbHNlKGRlZ3JlZShzbmEsIG1vZGU9ImluIilbVihzbmEpXSA+IDEwMDAwLCBuYW1lcyhWKHNuYSkpLCAiIikpClYoc25hKSRub2RlX3NpemUgPC0gdW5uYW1lKGlmZWxzZShkZWdyZWUoc25hKVtWKHNuYSldID4gMTAwMDAsIGRlZ3JlZShzbmEpLCAwKSkgCkUoc25hKSRjb2xvciA8LSAiZ3JheSIKc2V0LnNlZWQoMzk1MikKc25hICU+JSBnZ3JhcGgoJ2NpcmNsZXBhY2snLCB3ZWlnaHQ9J3NpemUnKSArIGdlb21fZWRnZV9saW5rKCkgKyBnZW9tX25vZGVfcG9pbnQoYWVzKGNvbG91cj1kZXB0aCkpICsgY29vcmRfZml4ZWQoKQojI1JFUExBQ0UgV0lUSCBHR1JBUEggCnBsb3Qoc25hLAogICAgICN2ZXJ0ZXguc2l6ZSA9IFYoc25hKSRkZWdyZWUsCiAgICAgdmVydGV4LnNpemUgPSBkZWdyZWUoc25hLCBtb2RlPSdpbicpKjAuMDA1LAogICAgIHZlcnRleC5sYWJlbD1pZmVsc2UoZGVncmVlKHNuYSkgPiAxMDAwLCBWKHNuYSkkbm9kZV9sYWJlbCwgTkEpLAogICAgIGVkZ2UuYXJyb3cuc2l6ZSA9IDAuMDAxLAogICAgIGVkZ2UuYXJyb3cubW9kZSA9ICJfIiwKICAgICB2ZXJ0ZXgubGFiZWwuY2V4PSAwLjYsCiAgICAgdmVydGV4LmxhYmVsLmRlZ3JlZT0tcGkvMiwKICAgICBsYXlvdXQ9bGF5b3V0LmthbWFkYS5rYXdhaSkKCiM8YmxvY2txdW90ZSBjbGFzcz0idHdpdHRlci10d2VldCI+PHAgbGFuZz0iZXMiIGRpcj0ibHRyIj7wn5K4IFBlZHJvIFPDoW5jaGV6IHNpZ3VlIGdhc3RhbmRvIGVsIGRpbmVybyBkZSB0b2RvcyBsb3MgZXNwYcOxb2xlcyBwYXJhIHN1IGNhbXBhw7FhLiBObyBzb24gdmllcm5lcyBzb2NpYWxlcywgc29uIHZpZXJuZXMgZWxlY3RvcmFsZXMuIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9EZWNyZXRhem9TJUMzJUExbmNoZXo/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNEZWNyZXRhem9Tw6FuY2hlejwvYT4gPGEgaHJlZj0iaHR0cHM6Ly90LmNvL05zZHRhQ0tRblciPnBpYy50d2l0dGVyLmNvbS9Oc2R0YUNLUW5XPC9hPjwvcD4mbWRhc2g7IFBhcnRpZG8gUG9wdWxhciDwn4eq8J+HuCAoQHBvcHVsYXJlcykgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9wb3B1bGFyZXMvc3RhdHVzLzExMDY1MTE3NTA5OTQ4MTcwMjQ/cmVmX3NyYz10d3NyYyU1RXRmdyI+TWFyY2ggMTUsIDIwMTk8L2E+PC9ibG9ja3F1b3RlPiA8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CgojPGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiPjxwIGxhbmc9ImVzIiBkaXI9Imx0ciI+TGFzIHBlbnNpb25lcyBzZSBwYWdhbiBjb24gZW1wbGVvLiBRdWllbiBwb25lIGVuIHBlbGlncm8gbGFzIHBlbnNpb25lcyBzb24gbG9zIHF1ZSBjcmVhbiBwYXJvIGNvbiBzdXMgcG9sw610aWNhcyBzb2NpYWxpc3RhcyBmYWxsaWRhcy4gPGJyPjxicj5MYSBwb3N0dXJhIHF1ZSBoZSBkZWZlbmRpZG8gc2llbXByZSBlcyBjbGFyYS4gPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL0w2TnBhYmxvY2FzYWRvP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jTDZOcGFibG9jYXNhZG88L2E+IDxhIGhyZWY9Imh0dHBzOi8vdC5jby94VWl5NU5hSXBKIj5odHRwczovL3QuY28veFVpeTVOYUlwSjwvYT48L3A+Jm1kYXNoOyBEYW5pZWwgTGFjYWxsZSAoQGRsYWNhbGxlKSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2RsYWNhbGxlL3N0YXR1cy8xMTE0NjMxMjc0NDU3NjQwOTYwP3JlZl9zcmM9dHdzcmMlNUV0ZnciPkFwcmlsIDYsIDIwMTk8L2E+PC9ibG9ja3F1b3RlPiA8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIGV2YWw9RkFMU0V9CmFjY291bnRzIDwtIHJlYWQuY3N2KCJzcGFpbmFjY291bnRzLmNzdiIpCnByb2ZpbGUgPC0gYWNjb3VudHMgJT4lIHNlbGVjdCh1c2VyX3JlcG9ydGVkX2xvY2F0aW9uLCB1c2VyX3Byb2ZpbGVfZGVzY3JpcHRpb24pCnByb2ZpbGUkbG9jYXRpb24gPC0gcHJvZmlsZSR1c2VyX3JlcG9ydGVkX2xvY2F0aW9uCnByb2ZpbGUkZGVzY3JpcHRpb24gPC0gcHJvZmlsZSR1c2VyX3Byb2ZpbGVfZGVzY3JpcHRpb24KcHJvZmlsZSA8LSBwcm9maWxlICU+JSBzZWxlY3QoZGVzY3JpcHRpb24pCnByb2ZpbGUKCmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIGV2YWw9RkFMU0V9CiNUaGUgYWNjb3VudHMgd2VyZSBwcmltYXJpbHkgdHdlZXRpbmcgYW5kIHJldHdlZXRpbmcgcHJvLVBQIC0tIGFuZCBhbnRpLVBTT0UgLS0gbWVzc2FnZXMuQSByYW5kb20gc2FtcGxlIG9mIDEwMCB1bmlxdWUgdHdlZXRzIChleGNsdWRpbmcgcmV0d2VldHMpIGdpdmVzIGFuIGluZGljYXRpb24gb2YgdGhlIGNvbnRlbnQgdGhhdCB3YXMgZ2VuZXJhdGVkIGJ5IHRoZXNlIElPIGFjY291bnRzOioqKgoKcmVxdWlyZSgic2FtcGxlciIpCnNldC5zZWVkKDEyMykKc3BhaW5ydCRpc19yZXR3ZWV0IDwtIGFzLmZhY3RvcihzcGFpbnJ0JGlzX3JldHdlZXQpCnRleHQgPC0gc3BhaW5ydCAlPiUgc2VsZWN0KHR3ZWV0X3RleHQsIGlzX3JldHdlZXQpICU+JSBmaWx0ZXIoaXNfcmV0d2VldD09ImZhbHNlIikgJT4lIHJzYW1wKDEwMCkKbmFtZXModGV4dCkgPC0gYygiVHdlZXQiLCAiUmV0d2VldCIpCnRleHQgJT4lIHNlbGVjdChUd2VldCkKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfSAKc3BhaW5ydCAlPiUgZ3JvdXBfYnkoYXMuZmFjdG9yKGlzX3JldHdlZXQpKSAlPiUgY291bnQoKSAKI1dobyB3ZXJlIHRoZXkgcmV0d2VldGluZz8Kc3BhaW5ydCAlPiUgZ3JvdXBfYnkoYXMuZmFjdG9yKHJldHdlZXRfdXNlcmlkKSkgJT4lIGZpbHRlcihpc19yZXR3ZWV0PT0idHJ1ZSIpICU+JSBjb3VudCgpICU+JSBhcnJhbmdlKGRlc2MobikpCiN3aGF0IHdlcmUgdGhleSByZXR3ZWV0aW5nCnNwYWlucnQgJT4lIGdyb3VwX2J5KGFzLmZhY3RvcihyZXR3ZWV0X3R3ZWV0aWQpKSAlPiUgZmlsdGVyKGlzX3JldHdlZXQ9PSJ0cnVlIikgJT4lIGNvdW50KCkgJT4lIGFycmFuZ2UoZGVzYyhuKSkKYGBgCg==