Abstract

This paper presents an experimental analysis of the Stag Hunt and Prisoner’s Dilemma games. The experiment was run at the Faculty of Management, Comenius University, with the participation of 16 and 18 players, respectively. In analyzing the experiment results, we note that the game-theoretical Nash Equilibria were achieved by the majority of players, albeit after experiencing a few introductory rounds. We interpret this fact as an absence of the players’ perfect rationality and we incline in our interpretations more to the players’ bounded rationality assumption.

Stag Hunt Game

The Stug Hunt game is a popular theoretical game that highlights the cooperation of players in light of their risk and payoff preferences.

Table 1. Payoff matrix of the Prisoner’s Dilemma.

Player R  Player C Cooperate Non-Cooperate
Cooperate 2 \ 2 0 \ 1
Non-Cooperate 1 \ 0 1 \ 1

The Stag Hunt is a coordination game in which two players must choose between hunting a stag or a hare. Hunting the stag is a great way to win, but only if both players work together. Hunting the hare is a safer, lower-reward option that does not require cooperation. The game reflects the tension between trust and risk on one side and high mutual benefits on the other.

If analysing the payoff matrix (see Table. 1) and experiment results (Fig. 1), the following is apparent:

The majority of players converged to the Pareto-efficient Nash equilibrium based on cooperation, while a minority of players maintain their Nash equilibrium strategies, focusing on risk elimination. The other non-coordination solutions remain minor and not systematic.

Evolution

Fig. 1 depicts the evolution of the Cooperation / Non-Cooperation strategies in 8 rounds. There were 18 participants, who were randomly matched at the start of the experiment. The created pairs persisted during the whole experiment. The evolution of the played strategies shows that the participants played the first round somewhat randomly, but in later rounds, the players converged mainly to the cooperating strategy. In the last round, five pairs of players out of nine employed the Nash equilibrium strategy, in which both players cooperate. Thus, we show that convergence towards a dominant Nash equilibrium does not emerge suddenly, but rather it is the result of trial-and-error experiments by the players. At the same time, two pairs of players played the dominated Nash equilibrium of mutual non-cooperation. Just two pairs of players played out of the equilibria in the last round.

Fig. 1. Eight rounds of the strategies evolution

The blue line in Fig. 2 depicts the evolution of the average payoffs achieved during the simulation. The solid red line fits the experimental results, showing that the average payoffs increase as the simulation progresses through the rounds. The dotted red line denotes the payoff if playing the cooperative Nash equilibrium, which is the maximum possible payoff in the game. The dashed red line denotes the payoffs of playing the non-cooperative Nash equilibrium. The real average payoffs evolve progressively between the two horizontal lines; however, there is a slight chance of reaching the cooperative strategies played by all the experiment participants.

Fig 2. Evolution of the average payoffs

Prisoner’s Dilemma Game

The Prisoner’s Dilemma is a strategic game that captures the conflict between mutual benefits of cooperation and selfish incentives to unilaterally break the cooperation.

Table 2. Payoff matrix of the Prisoner’s Dilemma.

Player R  Player C Cooperate Non-Cooperate (Defect)
Cooperate 3 \ 3 0 \ 5
Non-Cooperate (Defect) 5 \ 0 2 \ 2

Two players each choose between cooperating and defecting. Cooperation leads to a moderate payoff for both, while unilateral defection offers a tempting, higher reward if the other remains cooperative — but at the cost of severely punishing the cooperator. If both defect, they each receive a lower payoff than if they had cooperated. The dilemma lies in the fact that mutual defection is a Nash Equilibrium strategy, even though cooperation payoff dominates mutual defection, i.e., mutual cooperation would lead to a better outcome for both (red color). The game reveals the challenges of trust and the tempting option of unilateral defection, showing how rational self-interest can lead to collectively suboptimal outcomes. Mutual cooperation is Pareto efficient, while mutual defection constitutes a Pareto inefficient Nash equilibrium.

Evolution

Upon inspecting Fig. 3, the apparent dominance in mutually playing the defective strategies is evident from the very start of the simulation. Five pairs of players played the Nash equilibrium in the first round; however, no pair played the Pareto-efficient strategy profile of mutually playing the Cooperative strategies. However, the other strategies are tempting, causing the Nash equilibrium to be less stable, and some players try individually to restore the Pareto-optimal strategy profile of mutual cooperation. It was achieved only once in the fourth round; otherwise, no pair converted to this strategy profile throughout the entire simulation. We explain it so that there is no cooperation incentive preventing unilateral violation of the cooperation.

Fig.3 Eight rounds of the strategies evolution

If inspecting average payoffs, as introduced in Fig. 4, the following is apparent: the red solid line demonstrates the general trend, which is sloping down; however, we do not consider it to be statistically significant. During the entire experiment, the number of defective player pairs oscillates around five. It means that the Nash equilibrium of mutual defection (meaning the lowest average payoff (2) for both players) is played most frequently; however, the players always try to destroy this kind of disadvantageous equilibrium. Attempts to disrupt this kind of equilibrium result in significant oscillations in the average payoffs (blue curve) around the trend line.

Fig 4. Evolution of the average payoffs

Inspecting the payoff matrix given in Table 2. concludes that selection of the second row, or selection of the left column is not rationale, as both strategies dominate their counterpart (i.e., first row or the right column) as regardless the turn of the opponent, the second raw (right column) provides higher payoff than the first raw (left column). Fig. 5 demonstrates that the number of these irrational strategies selected decreases as the number of rounds passed increases. However, there is a relatively small chance they converge to zero, as the incentives to deviate from the high cooperation payoffs strategies are high.

Fig.5 Number of Not Best Responses - evolution

LS0tCnRpdGxlOiAiUHJpc29uZXIncyBEaWxlbW1hICYgU3RhZyBhbmQgSHVudCBHYW1lcyIKc3VidGl0bGU6ICJFeHBlcmltZW50YWwgY29udHJvdmVyc3kiCmF1dGhvcjogIk1pY2hhbCBQw6FsZW7DrWsgYW5kIFZsYWRpbcOtciBHYXpkYSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCmBgYHtyIHNldHVwMiwgaW5jbHVkZT1GQUxTRX0Kcm0obGlzdD1scygpKQpsaWJyYXJ5KGtuaXRyKQoKa25pdHI6Om9wdHNfY2h1bmskc2V0KAogIGVjaG8gPSBGQUxTRSwKICBtZXNzYWdlID0gRkFMU0UsCiAgd2FybmluZyA9IEZBTFNFLAogIGVycm9yID0gRkFMU0UsCiAgaW5jbHVkZSA9IFRSVUUsCgogICMg4pyz77iPIEdMT0JBTCBmaWd1cmUgc2V0dGluZ3MKICBmaWcud2lkdGggPSA1LCAgICAgICMgd2lkdGggaW4gaW5jaGVzCiAgZmlnLmhlaWdodCA9IDMuNzUsICAgICAjIGhlaWdodCBpbiBpbmNoZXMKICBvdXQud2lkdGggPSAiNzUlIiwgICMgcmVsYXRpdmUgc2l6ZSBpbiBIVE1MCiAgZmlnLmFsaWduID0gImNlbnRlciIsCiAgZHBpID0gNDAwLCAgICAgICAgICAjIHNoYXJwIHRleHQgYW5kIGxpbmVzCiAgZGV2ID0gInN2ZyIgICAgICAgICAjIHZlY3RvciBncmFwaGljcyAobm8gYmx1ciBpbiBIVE1MKQopCmBgYAoKIyMgQWJzdHJhY3QKClRoaXMgcGFwZXIgcHJlc2VudHMgYW4gZXhwZXJpbWVudGFsIGFuYWx5c2lzIG9mIHRoZSBTdGFnIEh1bnQgYW5kIFByaXNvbmVy4oCZcyBEaWxlbW1hIGdhbWVzLiBUaGUgZXhwZXJpbWVudCB3YXMgcnVuIGF0IHRoZSBGYWN1bHR5IG9mIE1hbmFnZW1lbnQsIENvbWVuaXVzIFVuaXZlcnNpdHksIHdpdGggdGhlIHBhcnRpY2lwYXRpb24gb2YgMTYgYW5kIDE4IHBsYXllcnMsIHJlc3BlY3RpdmVseS4gSW4gYW5hbHl6aW5nIHRoZSBleHBlcmltZW50IHJlc3VsdHMsIHdlIG5vdGUgdGhhdCB0aGUgZ2FtZS10aGVvcmV0aWNhbCBOYXNoIEVxdWlsaWJyaWEgd2VyZSBhY2hpZXZlZCBieSB0aGUgbWFqb3JpdHkgb2YgcGxheWVycywgYWxiZWl0IGFmdGVyIGV4cGVyaWVuY2luZyBhIGZldyBpbnRyb2R1Y3Rvcnkgcm91bmRzLiBXZSBpbnRlcnByZXQgdGhpcyBmYWN0IGFzIGFuIGFic2VuY2Ugb2YgdGhlIHBsYXllcnMnIHBlcmZlY3QgcmF0aW9uYWxpdHkgYW5kIHdlIGluY2xpbmUgaW4gb3VyIGludGVycHJldGF0aW9ucyBtb3JlIHRvIHRoZSBwbGF5ZXJzJyBib3VuZGVkIHJhdGlvbmFsaXR5IGFzc3VtcHRpb24uCgojIyBTdGFnIEh1bnQgR2FtZQoKVGhlIFN0dWcgSHVudCBnYW1lIGlzIGEgcG9wdWxhciB0aGVvcmV0aWNhbCBnYW1lIHRoYXQgaGlnaGxpZ2h0cyB0aGUgY29vcGVyYXRpb24gb2YgcGxheWVycyBpbiBsaWdodCBvZiB0aGVpciByaXNrIGFuZCBwYXlvZmYgcHJlZmVyZW5jZXMuIAoKKipUYWJsZSAxLioqIFBheW9mZiBtYXRyaXggb2YgdGhlIFByaXNvbmVy4oCZcyBEaWxlbW1hLgoKfCBQbGF5ZXIgUiBcIFBsYXllciBDIHwgQ29vcGVyYXRlIHwgTm9uLUNvb3BlcmF0ZSAgfAp8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLTp8Oi0tLS0tLS06fAp8IENvb3BlcmF0ZSB8IDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPjIgXFwgMjwvc3Bhbj4gfCAwIFxcIDEgfAp8IE5vbi1Db29wZXJhdGUgfCAxIFxcIDAgfCA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+MSBcXCAxPC9zcGFuPiB8CgoKVGhlIFN0YWcgSHVudCBpcyBhIGNvb3JkaW5hdGlvbiBnYW1lIGluIHdoaWNoIHR3byBwbGF5ZXJzIG11c3QgY2hvb3NlIGJldHdlZW4gaHVudGluZyBhIHN0YWcgb3IgYSBoYXJlLiBIdW50aW5nIHRoZSBzdGFnIGlzIGEgZ3JlYXQgd2F5IHRvIHdpbiwgYnV0IG9ubHkgaWYgYm90aCBwbGF5ZXJzIHdvcmsgdG9nZXRoZXIuIEh1bnRpbmcgdGhlIGhhcmUgaXMgYSBzYWZlciwgbG93ZXItcmV3YXJkIG9wdGlvbiB0aGF0IGRvZXMgbm90IHJlcXVpcmUgY29vcGVyYXRpb24uIFRoZSBnYW1lIHJlZmxlY3RzIHRoZSB0ZW5zaW9uIGJldHdlZW4gdHJ1c3QgYW5kIHJpc2sgb24gb25lIHNpZGUgYW5kIGhpZ2ggbXV0dWFsIGJlbmVmaXRzIG9uIHRoZSBvdGhlci4gIAoKSWYgYW5hbHlzaW5nIHRoZSBwYXlvZmYgbWF0cml4IChzZWUgKipUYWJsZS4gMSoqKSBhbmQgZXhwZXJpbWVudCByZXN1bHRzICgqKkZpZy4gMSoqKSwgdGhlIGZvbGxvd2luZyBpcyBhcHBhcmVudDoKCi0gVGhlcmUgaXMganVzdCBvbmUgUGFyZXRvLWVmZmljaWVudCBzb2x1dGlvbjogYm90aCBodW50ZXJzIHNob3VsZCBjb29wZXJhdGUgKHJlZCkuIFRoaXMgc3RyYXRlZ3kgcHJvZmlsZSBpcyB0aGUgb25seSB0aGVvcmV0aWNhbCBwcmVkaWN0aW9uIChkb21pbmFudCBOYXNoIGVxdWlsaWJyaXVtKSBiYXNlZCBvbiBHYW1lIHRoZW9yeSBtYXhpbWlzaW5nIHBheW9mZnMgb2YgYm90aCBwbGF5ZXJzLiBUaGUgc2Vjb25kIE5hc2ggZXF1aWxpYnJpdW0gY29uc2lzdHMgb2YgdGhlIHNhZmUgTm9uLWNvb3BlcmF0aXZlIHN0cmF0ZWdpZXMsIGkuZS4sIGJvdGggaHVudGVycyBhcmUgaHVudGluZyB0aGUgcmFiYml0IGluZGl2aWR1YWxseS4gCi0gSWYgcGxheWluZyBlaWdodCByb3VuZHMgb2YgdGhlIGV4cGVyaW1lbnQsIHRoZSBkb21pbmFudCBOYXNoIGVxdWlsaWJyaXVtIHdhcyBub3QgcGxheWVkIGF1dG9tYXRpY2FsbHkgYnkgYWxsIHRoZSBwbGF5ZXJzOyBvbiB0aGUgY29udHJhcnksICB0aGUgZ2FtZSByZXN1bHRzIHJlZmxlY3QgaG93IHBheW9mZnMsIHRydXN0LCByaXNrIHByZWZlcmVuY2VzLCBhbmQgZXhwZXJpZW5jZSBjb2xsZWN0ZWQgaW4gcHJldmlvdXMgcm91bmRzIGluZmx1ZW5jZSB0aGUgcGxheWVycycgc3RyYXRlZ2ljIGRlY2lzaW9ucy4gCgpUaGUgbWFqb3JpdHkgb2YgcGxheWVycyBjb252ZXJnZWQgdG8gdGhlIFBhcmV0by1lZmZpY2llbnQgTmFzaCBlcXVpbGlicml1bSBiYXNlZCBvbiBjb29wZXJhdGlvbiwgd2hpbGUgYSBtaW5vcml0eSBvZiBwbGF5ZXJzIG1haW50YWluIHRoZWlyIE5hc2ggZXF1aWxpYnJpdW0gc3RyYXRlZ2llcywgZm9jdXNpbmcgb24gcmlzayBlbGltaW5hdGlvbi4gVGhlIG90aGVyIG5vbi1jb29yZGluYXRpb24gc29sdXRpb25zIHJlbWFpbiBtaW5vciBhbmQgbm90IHN5c3RlbWF0aWMuIAoKCgoKIyMjIEV2b2x1dGlvbgoKKipGaWcuIDEqKiBkZXBpY3RzIHRoZSBldm9sdXRpb24gb2YgdGhlIENvb3BlcmF0aW9uIC8gTm9uLUNvb3BlcmF0aW9uIHN0cmF0ZWdpZXMgaW4gOCByb3VuZHMuIFRoZXJlIHdlcmUgMTggcGFydGljaXBhbnRzLCB3aG8gd2VyZSByYW5kb21seSBtYXRjaGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgZXhwZXJpbWVudC4gVGhlIGNyZWF0ZWQgcGFpcnMgcGVyc2lzdGVkIGR1cmluZyB0aGUgd2hvbGUgZXhwZXJpbWVudC4gVGhlIGV2b2x1dGlvbiBvZiB0aGUgcGxheWVkIHN0cmF0ZWdpZXMgc2hvd3MgdGhhdCB0aGUgcGFydGljaXBhbnRzIHBsYXllZCB0aGUgZmlyc3Qgcm91bmQgc29tZXdoYXQgcmFuZG9tbHksIGJ1dCBpbiBsYXRlciByb3VuZHMsIHRoZSBwbGF5ZXJzIGNvbnZlcmdlZCBtYWlubHkgdG8gdGhlIGNvb3BlcmF0aW5nIHN0cmF0ZWd5LiBJbiB0aGUgbGFzdCByb3VuZCwgZml2ZSBwYWlycyBvZiBwbGF5ZXJzIG91dCBvZiBuaW5lIGVtcGxveWVkIHRoZSBOYXNoIGVxdWlsaWJyaXVtIHN0cmF0ZWd5LCBpbiB3aGljaCBib3RoIHBsYXllcnMgY29vcGVyYXRlLiBUaHVzLCB3ZSBzaG93IHRoYXQgY29udmVyZ2VuY2UgdG93YXJkcyBhIGRvbWluYW50IE5hc2ggZXF1aWxpYnJpdW0gZG9lcyBub3QgZW1lcmdlIHN1ZGRlbmx5LCBidXQgcmF0aGVyIGl0IGlzIHRoZSByZXN1bHQgb2YgdHJpYWwtYW5kLWVycm9yIGV4cGVyaW1lbnRzIGJ5IHRoZSBwbGF5ZXJzLiBBdCB0aGUgc2FtZSB0aW1lLCB0d28gcGFpcnMgb2YgcGxheWVycyBwbGF5ZWQgdGhlIGRvbWluYXRlZCBOYXNoIGVxdWlsaWJyaXVtIG9mIG11dHVhbCBub24tY29vcGVyYXRpb24uIEp1c3QgdHdvIHBhaXJzIG9mIHBsYXllcnMgcGxheWVkIG91dCBvZiB0aGUgZXF1aWxpYnJpYSBpbiB0aGUgbGFzdCByb3VuZC4KCioqRmlnLiAxLioqIEVpZ2h0IHJvdW5kcyBvZiB0aGUgc3RyYXRlZ2llcyBldm9sdXRpb24KCmBgYHtyfQojIExvYWQgcmVxdWlyZWQgcGFja2FnZXMKbGlicmFyeSh0aWR5dmVyc2UpCgojIExvYWQgZGF0YQojIHVkYWplU0ggPC0gcmVhZF9jc3YyKCJTdGFnSHVudERhdGEuY3N2IikKdWRhamVTSCA8LSByZWFkX2NzdjIoInVkYWplU0guY3N2IikKCiMgRmlsdGVyIGZvciBSb2xlID09IDEKcm9sZTEgPC0gdWRhamVTSCAlPiUgCiAgZmlsdGVyKFJvbGUgPT0gMSkKCiMgLS0tIENvbXB1dGUgMngyIG9jY3VycmVuY2UgdGFibGVzIC0tLQpyb3VuZF90YWJsZXMgPC0gcm9sZTEgJT4lCiAgZ3JvdXBfYnkoUm91bmQsIERlY2lzaW9uLCBPdGhlckRlY2lzaW9uKSAlPiUKICBzdW1tYXJpc2UoY291bnQgPSBuKCksIC5ncm91cHMgPSAiZHJvcCIpICU+JQogIGNvbXBsZXRlKFJvdW5kLCBEZWNpc2lvbiA9IDE6MiwgT3RoZXJEZWNpc2lvbiA9IDE6MiwgZmlsbCA9IGxpc3QoY291bnQgPSAwKSkKCiMgLS0tIFByaW50IDJ4MiB0YWJsZXMgZm9yIGVhY2ggcm91bmQgLS0tCmZvciAociBpbiBzb3J0KHVuaXF1ZShyb3VuZF90YWJsZXMkUm91bmQpKSkgewogICNjYXQoIlxuUm91bmQiLCByLCAiXG4iKQogIHRibCA8LSByb3VuZF90YWJsZXMgJT4lCiAgICBmaWx0ZXIoUm91bmQgPT0gcikgJT4lCiAgICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gT3RoZXJEZWNpc2lvbiwgdmFsdWVzX2Zyb20gPSBjb3VudCkKICAjcHJpbnQodGJsKQp9CmBgYAoKCgoKYGBge3IgaGVhdG1hcHNTSH0KCiMgLS0tIEhlYXRtYXBzIGFjcm9zcyByb3VuZHMgKHdoaXRlIOKGkiBsaWdodCBibHVlIOKGkiBkYXJrIGJsdWUpIC0tLQpnZ3Bsb3Qocm91bmRfdGFibGVzLCBhZXMoeCA9IGZhY3RvcihPdGhlckRlY2lzaW9uKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBmYWN0b3IoRGVjaXNpb24pLAogICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGNvdW50KSkgKwogIGdlb21fdGlsZShjb2xvciA9ICJ3aGl0ZSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY291bnQpLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSA0KSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oCiAgICBjb2xvdXJzID0gYygid2hpdGUiLCAiI0FERDhFNiIsICIjMDAwMDhCIiksICAjIHdoaXRlIOKGkiBsaWdodCBibHVlIOKGkiBkYXJrIGJsdWUKICAgIGxpbWl0cyA9IGMoMCwgNiksCiAgICBuYW1lID0gIkNvdW50IgogICkgKwogIHNjYWxlX3lfZGlzY3JldGUobGltaXRzID0gYygiMiIsICIxIikpICsgICMgUmV2ZXJzZSBZLWF4aXM6IDEgb24gdG9wCiAgZmFjZXRfd3JhcCh+IFJvdW5kLCBuY29sID0gNCkgKwogIGxhYnMoCiAgICAjIHRpdGxlID0gIiIsCiAgICB4ID0gIkNvbHVtbiBQbGF5ZXIgMS1jb29wZXJhdGUsIDIgbm9uLWNvb3BlcmF0ZSIsCiAgICB5ID0gIlJvdyBQbGF5ZXIgMS1jb29wZXJhdGUsIDIgbm9uLWNvb3BlcmF0ZSIKICApICsKICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDkpICsKICB0aGVtZSgKICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpCiAgKQoKCmBgYAoKClRoZSBibHVlIGxpbmUgaW4gKipGaWcuIDIqKiBkZXBpY3RzIHRoZSBldm9sdXRpb24gb2YgdGhlIGF2ZXJhZ2UgcGF5b2ZmcyBhY2hpZXZlZCBkdXJpbmcgdGhlIHNpbXVsYXRpb24uIFRoZSBzb2xpZCByZWQgbGluZSBmaXRzIHRoZSBleHBlcmltZW50YWwgcmVzdWx0cywgc2hvd2luZyB0aGF0IHRoZSBhdmVyYWdlIHBheW9mZnMgaW5jcmVhc2UgYXMgdGhlIHNpbXVsYXRpb24gcHJvZ3Jlc3NlcyB0aHJvdWdoIHRoZSByb3VuZHMuIFRoZSBkb3R0ZWQgcmVkIGxpbmUgZGVub3RlcyB0aGUgcGF5b2ZmIGlmIHBsYXlpbmcgdGhlIGNvb3BlcmF0aXZlIE5hc2ggZXF1aWxpYnJpdW0sIHdoaWNoIGlzIHRoZSBtYXhpbXVtIHBvc3NpYmxlIHBheW9mZiBpbiB0aGUgZ2FtZS4gVGhlIGRhc2hlZCByZWQgbGluZSBkZW5vdGVzIHRoZSBwYXlvZmZzIG9mIHBsYXlpbmcgdGhlIG5vbi1jb29wZXJhdGl2ZSBOYXNoIGVxdWlsaWJyaXVtLiBUaGUgcmVhbCBhdmVyYWdlIHBheW9mZnMgZXZvbHZlIHByb2dyZXNzaXZlbHkgYmV0d2VlbiB0aGUgdHdvIGhvcml6b250YWwgbGluZXM7IGhvd2V2ZXIsIHRoZXJlIGlzIGEgc2xpZ2h0IGNoYW5jZSBvZiByZWFjaGluZyB0aGUgY29vcGVyYXRpdmUgc3RyYXRlZ2llcyBwbGF5ZWQgYnkgYWxsIHRoZSBleHBlcmltZW50IHBhcnRpY2lwYW50cy4KCioqRmlnIDIuKiogRXZvbHV0aW9uIG9mIHRoZSBhdmVyYWdlIHBheW9mZnMKCmBgYHtyIGxpbmVncmFwaFNIfQojIC0tLSBDb21wdXRlIGF2ZXJhZ2UgcGF5b2ZmIHBlciByb3VuZCAoc3ltbWV0cmljIGdhbWUpIC0tLQphdmdfcGF5b2ZmcyA8LSB1ZGFqZVNIICU+JQogIGdyb3VwX2J5KFJvdW5kKSAlPiUKICBzdW1tYXJpc2UoQXZlcmFnZV9QYXlvZmYgPSBtZWFuKEVhcm5pbmdzLCBuYS5ybSA9IFRSVUUpKSAlPiUKICB1bmdyb3VwKCkKCiMgLS0tIExpbmUgcGxvdCBvZiBhdmVyYWdlIHBheW9mZnMgYnkgcm91bmQgLS0tCmdncGxvdChhdmdfcGF5b2ZmcywgYWVzKHggPSBSb3VuZCwgeSA9IEF2ZXJhZ2VfUGF5b2ZmKSkgKwogICMgRXZvbHV0aW9uIGxpbmUgKGRhcmsgYmx1ZSkKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gIkV2b2x1dGlvbiBvZiBhdmVyYWdlIHBheW9mZnMiKSwgbGluZXdpZHRoID0gMC42KSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSAyKSArCiAgCgoKICAjIFRyZW5kIGxpbmUgKHNvbGlkIHJlZCkKICBnZW9tX3Ntb290aChhZXMoY29sb3IgPSAiVHJlbmQgZXZvbHV0aW9uIGxpbmUiKSwKICAgICAgICAgICAgICBtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBsaW5ldHlwZSA9ICJzb2xpZCIsIGxpbmV3aWR0aCA9IDAuNSkgKwogIAogICMgSG9yaXpvbnRhbCBsaW5lcyAoZG90dGVkICYgZGFzaGVkIHJlZCkKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gMiwgY29sb3IgPSAiQXZnLiBwYXlvZmYgaWYgYm90aCBjb29wZXJhdGluZyAoMykiKSwKICAgICAgICAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsIGxpbmV3aWR0aCA9IDAuNSkgKwogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSAxLCBjb2xvciA9ICJBdmcuIHBheW9mZiBpZiBib3RoIGRlZmVjdGluZyAoMikiKSwKICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIGxpbmV3aWR0aCA9IDAuNSkgKwogIAogICMgRGVmaW5lIGxlZ2VuZCBhbmQgY29sb3JzCiAgc2NhbGVfY29sb3JfbWFudWFsKAogICAgbmFtZSA9ICJMZWdlbmQiLAogICAgdmFsdWVzID0gYygKICAgICAgIkV2b2x1dGlvbiBvZiBhdmVyYWdlIHBheW9mZnMiID0gImRhcmtibHVlIiwKICAgICAgIkF2Zy4gcGF5b2ZmIGlmIGJvdGggY29vcGVyYXRpbmcgKDIpIiA9ICJyZWQiLAogICAgICAiQXZnLiBwYXlvZmYgaWYgYm90aCBkZWZlY3RpbmcgKDEpIiA9ICJyZWQiLAogICAgICAiVHJlbmQgZXZvbHV0aW9uIGxpbmUiID0gInJlZCIKICAgICkKICApICsKICAKICAjIFdyYXAgbGVnZW5kIGludG8gdHdvIHJvd3MKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQobnJvdyA9IDQsIGJ5cm93ID0gVFJVRSkpICsKICAKICBsYWJzKAogICAgIyB0aXRsZSA9ICIiLAogICAgeCA9ICJSb3VuZCIsCiAgICB5ID0gIkF2ZXJhZ2UgUGF5b2ZmIgogICkgKwogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gOSkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpCiAgKQoKCmBgYAoKCgojIyBQcmlzb25lcidzIERpbGVtbWEgR2FtZQoKCmBgYHtyfQpybShsaXN0PWxzKCkpCmBgYAoKVGhlIFByaXNvbmVyJ3MgRGlsZW1tYSBpcyBhIHN0cmF0ZWdpYyBnYW1lIHRoYXQgY2FwdHVyZXMgdGhlIGNvbmZsaWN0IGJldHdlZW4gbXV0dWFsIGJlbmVmaXRzIG9mIGNvb3BlcmF0aW9uIGFuZCBzZWxmaXNoIGluY2VudGl2ZXMgdG8gdW5pbGF0ZXJhbGx5IGJyZWFrIHRoZSBjb29wZXJhdGlvbi4KCioqVGFibGUgMi4qKiBQYXlvZmYgbWF0cml4IG9mIHRoZSBQcmlzb25lcuKAmXMgRGlsZW1tYS4KCnwgUGxheWVyIFIgXCBQbGF5ZXIgQyB8IENvb3BlcmF0ZSB8IE5vbi1Db29wZXJhdGUgKERlZmVjdCkgfAp8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLTp8Oi0tLS0tLS06fAp8IENvb3BlcmF0ZSB8IDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPjMgXFwgMzwvc3Bhbj4gfCAwIFxcIDUgfAp8IE5vbi1Db29wZXJhdGUgKERlZmVjdCkgfCA1IFxcIDAgfCA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+MiBcXCAyPC9zcGFuPiB8CgpUd28gcGxheWVycyBlYWNoIGNob29zZSBiZXR3ZWVuIGNvb3BlcmF0aW5nIGFuZCBkZWZlY3RpbmcuIENvb3BlcmF0aW9uIGxlYWRzIHRvIGEgbW9kZXJhdGUgcGF5b2ZmIGZvciBib3RoLCB3aGlsZSB1bmlsYXRlcmFsIGRlZmVjdGlvbiBvZmZlcnMgYSB0ZW1wdGluZywgaGlnaGVyIHJld2FyZCBpZiB0aGUgb3RoZXIgcmVtYWlucyBjb29wZXJhdGl2ZSDigJQgYnV0IGF0IHRoZSBjb3N0IG9mIHNldmVyZWx5IHB1bmlzaGluZyB0aGUgY29vcGVyYXRvci4gSWYgYm90aCBkZWZlY3QsIHRoZXkgZWFjaCByZWNlaXZlIGEgbG93ZXIgcGF5b2ZmIHRoYW4gaWYgdGhleSBoYWQgY29vcGVyYXRlZC4gVGhlIGRpbGVtbWEgbGllcyBpbiB0aGUgZmFjdCB0aGF0IG11dHVhbCBkZWZlY3Rpb24gaXMgYSBOYXNoIEVxdWlsaWJyaXVtIHN0cmF0ZWd5LCBldmVuIHRob3VnaCBjb29wZXJhdGlvbiBwYXlvZmYgZG9taW5hdGVzIG11dHVhbCBkZWZlY3Rpb24sIGkuZS4sIG11dHVhbCBjb29wZXJhdGlvbiB3b3VsZCBsZWFkIHRvIGEgYmV0dGVyIG91dGNvbWUgZm9yIGJvdGggKHJlZCBjb2xvcikuIFRoZSBnYW1lIHJldmVhbHMgdGhlIGNoYWxsZW5nZXMgb2YgdHJ1c3QgYW5kIHRoZSB0ZW1wdGluZyBvcHRpb24gb2YgdW5pbGF0ZXJhbCBkZWZlY3Rpb24sIHNob3dpbmcgaG93IHJhdGlvbmFsIHNlbGYtaW50ZXJlc3QgY2FuIGxlYWQgdG8gY29sbGVjdGl2ZWx5IHN1Ym9wdGltYWwgb3V0Y29tZXMuIE11dHVhbCBjb29wZXJhdGlvbiBpcyBQYXJldG8gZWZmaWNpZW50LCB3aGlsZSBtdXR1YWwgZGVmZWN0aW9uIGNvbnN0aXR1dGVzIGEgUGFyZXRvIGluZWZmaWNpZW50IE5hc2ggZXF1aWxpYnJpdW0uCgoKIyMjIEV2b2x1dGlvbgoKVXBvbiBpbnNwZWN0aW5nICoqRmlnLiAzKiosIHRoZSBhcHBhcmVudCBkb21pbmFuY2UgaW4gbXV0dWFsbHkgcGxheWluZyB0aGUgZGVmZWN0aXZlIHN0cmF0ZWdpZXMgaXMgZXZpZGVudCBmcm9tIHRoZSB2ZXJ5IHN0YXJ0IG9mIHRoZSBzaW11bGF0aW9uLiBGaXZlIHBhaXJzIG9mIHBsYXllcnMgcGxheWVkIHRoZSBOYXNoIGVxdWlsaWJyaXVtIGluIHRoZSBmaXJzdCByb3VuZDsgaG93ZXZlciwgbm8gcGFpciBwbGF5ZWQgdGhlIFBhcmV0by1lZmZpY2llbnQgc3RyYXRlZ3kgcHJvZmlsZSBvZiBtdXR1YWxseSBwbGF5aW5nIHRoZSBDb29wZXJhdGl2ZSBzdHJhdGVnaWVzLiBIb3dldmVyLCB0aGUgb3RoZXIgc3RyYXRlZ2llcyBhcmUgdGVtcHRpbmcsIGNhdXNpbmcgdGhlIE5hc2ggZXF1aWxpYnJpdW0gdG8gYmUgbGVzcyBzdGFibGUsIGFuZCBzb21lIHBsYXllcnMgdHJ5IGluZGl2aWR1YWxseSB0byByZXN0b3JlIHRoZSBQYXJldG8tb3B0aW1hbCBzdHJhdGVneSBwcm9maWxlIG9mIG11dHVhbCBjb29wZXJhdGlvbi4gSXQgd2FzIGFjaGlldmVkIG9ubHkgb25jZSBpbiB0aGUgZm91cnRoIHJvdW5kOyBvdGhlcndpc2UsIG5vIHBhaXIgY29udmVydGVkIHRvIHRoaXMgc3RyYXRlZ3kgcHJvZmlsZSB0aHJvdWdob3V0IHRoZSBlbnRpcmUgc2ltdWxhdGlvbi4gV2UgZXhwbGFpbiBpdCBzbyB0aGF0IHRoZXJlIGlzIG5vIGNvb3BlcmF0aW9uIGluY2VudGl2ZSBwcmV2ZW50aW5nIHVuaWxhdGVyYWwgdmlvbGF0aW9uIG9mIHRoZSBjb29wZXJhdGlvbi4KCioqRmlnLjMqKiBFaWdodCByb3VuZHMgb2YgdGhlIHN0cmF0ZWdpZXMgZXZvbHV0aW9uCgpgYGB7ciBoZWF0bWFwUER9CiMgTG9hZCByZXF1aXJlZCBwYWNrYWdlcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKCiMgTG9hZCBkYXRhCnVkYWplUEQgPC0gcmVhZF9jc3YyKCJQcmlzb25lcnNEaWxlbW1hRGF0YS5jc3YiKQoKIyBGaWx0ZXIgZm9yIFJvbGUgPT0gMQpyb2xlMSA8LSB1ZGFqZVBEICU+JSAKICBmaWx0ZXIoUm9sZSA9PSAxKQoKIyAtLS0gQ29tcHV0ZSAyeDIgb2NjdXJyZW5jZSB0YWJsZXMgLS0tCnJvdW5kX3RhYmxlcyA8LSByb2xlMSAlPiUKICBncm91cF9ieShSb3VuZCwgRGVjaXNpb24sIE90aGVyRGVjaXNpb24pICU+JQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lCiAgY29tcGxldGUoUm91bmQsIERlY2lzaW9uID0gMToyLCBPdGhlckRlY2lzaW9uID0gMToyLCBmaWxsID0gbGlzdChjb3VudCA9IDApKQoKIyAtLS0gUHJpbnQgMngyIHRhYmxlcyBmb3IgZWFjaCByb3VuZCAtLS0KZm9yIChyIGluIHNvcnQodW5pcXVlKHJvdW5kX3RhYmxlcyRSb3VuZCkpKSB7CiMgIGNhdCgiXG5Sb3VuZCIsIHIsICJcbiIpCiAgdGJsIDwtIHJvdW5kX3RhYmxlcyAlPiUKICAgIGZpbHRlcihSb3VuZCA9PSByKSAlPiUKICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBPdGhlckRlY2lzaW9uLCB2YWx1ZXNfZnJvbSA9IGNvdW50KQogICNwcmludCh0YmwpCn0KCiMgLS0tIEhlYXRtYXBzIGFjcm9zcyByb3VuZHMgKHdoaXRlIOKGkiBsaWdodCBibHVlIOKGkiBkYXJrIGJsdWUpIC0tLQpnZ3Bsb3Qocm91bmRfdGFibGVzLCBhZXMoeCA9IGZhY3RvcihPdGhlckRlY2lzaW9uKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBmYWN0b3IoRGVjaXNpb24pLAogICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGNvdW50KSkgKwogIGdlb21fdGlsZShjb2xvciA9ICJ3aGl0ZSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY291bnQpLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSA0KSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oCiAgICBjb2xvdXJzID0gYygid2hpdGUiLCAiI0FERDhFNiIsICIjMDAwMDhCIiksICAjIHdoaXRlIOKGkiBsaWdodCBibHVlIOKGkiBkYXJrIGJsdWUKICAgIGxpbWl0cyA9IGMoMCwgNyksCiAgICBuYW1lID0gIkNvdW50IgogICkgKwogIHNjYWxlX3lfZGlzY3JldGUobGltaXRzID0gYygiMiIsICIxIikpICsgICMgUmV2ZXJzZSBZLWF4aXM6IDEgb24gdG9wCiAgZmFjZXRfd3JhcCh+IFJvdW5kLCBuY29sID0gNCkgKwogIGxhYnMoCiAgICAjIHRpdGxlID0gIiIsCiAgICB4ID0gIkNvbHVtbiBQbGF5ZXIgMS1jb29wZXJhdGUsIDIgbm9uLWNvb3BlcmF0ZSIsCiAgICB5ID0gIlJvdyBQbGF5ZXIgMS1jb29wZXJhdGUsIDIgbm9uLWNvb3BlcmF0ZSIKICApICsKICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDkpICsKICB0aGVtZSgKICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpCiAgKQoKCmBgYAoKCgpJZiBpbnNwZWN0aW5nIGF2ZXJhZ2UgcGF5b2ZmcywgYXMgaW50cm9kdWNlZCBpbiAqKkZpZy4gNCoqLCB0aGUgZm9sbG93aW5nIGlzIGFwcGFyZW50OiB0aGUgcmVkIHNvbGlkIGxpbmUgZGVtb25zdHJhdGVzIHRoZSBnZW5lcmFsIHRyZW5kLCB3aGljaCBpcyBzbG9waW5nIGRvd247IGhvd2V2ZXIsIHdlIGRvIG5vdCBjb25zaWRlciBpdCB0byBiZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBEdXJpbmcgdGhlIGVudGlyZSBleHBlcmltZW50LCB0aGUgbnVtYmVyIG9mIGRlZmVjdGl2ZSBwbGF5ZXIgcGFpcnMgb3NjaWxsYXRlcyBhcm91bmQgZml2ZS4gSXQgbWVhbnMgdGhhdCB0aGUgTmFzaCBlcXVpbGlicml1bSBvZiBtdXR1YWwgZGVmZWN0aW9uIChtZWFuaW5nIHRoZSBsb3dlc3QgYXZlcmFnZSBwYXlvZmYgKDIpIGZvciBib3RoIHBsYXllcnMpIGlzIHBsYXllZCBtb3N0IGZyZXF1ZW50bHk7IGhvd2V2ZXIsIHRoZSBwbGF5ZXJzIGFsd2F5cyB0cnkgdG8gZGVzdHJveSB0aGlzIGtpbmQgb2YgZGlzYWR2YW50YWdlb3VzIGVxdWlsaWJyaXVtLiBBdHRlbXB0cyB0byBkaXNydXB0IHRoaXMga2luZCBvZiBlcXVpbGlicml1bSByZXN1bHQgaW4gc2lnbmlmaWNhbnQgb3NjaWxsYXRpb25zIGluIHRoZSBhdmVyYWdlIHBheW9mZnMgKGJsdWUgY3VydmUpIGFyb3VuZCB0aGUgdHJlbmQgbGluZS4gCgoKCgoqKkZpZyA0LioqIEV2b2x1dGlvbiBvZiB0aGUgYXZlcmFnZSBwYXlvZmZzCgpgYGB7ciB0cmVuZHBsb3RQRH0KIyAtLS0gQ29tcHV0ZSBhdmVyYWdlIHBheW9mZiBwZXIgcm91bmQgKHN5bW1ldHJpYyBnYW1lKSAtLS0KYXZnX3BheW9mZnMgPC0gdWRhamVQRCAlPiUKICBncm91cF9ieShSb3VuZCkgJT4lCiAgc3VtbWFyaXNlKEF2ZXJhZ2VfUGF5b2ZmID0gbWVhbihFYXJuaW5ncywgbmEucm0gPSBUUlVFKSkgJT4lCiAgdW5ncm91cCgpCgojIC0tLSBMaW5lIHBsb3Qgb2YgYXZlcmFnZSBwYXlvZmZzIGJ5IHJvdW5kIC0tLQpnZ3Bsb3QoYXZnX3BheW9mZnMsIGFlcyh4ID0gUm91bmQsIHkgPSBBdmVyYWdlX1BheW9mZikpICsKICAjIEV2b2x1dGlvbiBsaW5lIChkYXJrIGJsdWUpCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9ICJFdm9sdXRpb24gb2YgYXZlcmFnZSBwYXlvZmZzIiksIGxpbmV3aWR0aCA9IDAuNikgKwogIGdlb21fcG9pbnQoY29sb3IgPSAiZGFya2JsdWUiLCBzaXplID0gMikgKwogIAogICMgVHJlbmQgbGluZSAoc29saWQgcmVkKQogIGdlb21fc21vb3RoKGFlcyhjb2xvciA9ICJUcmVuZCBldm9sdXRpb24gbGluZSIpLAogICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGxpbmV0eXBlID0gInNvbGlkIiwgbGluZXdpZHRoID0gMC41KSArCiAgCiAgIyBIb3Jpem9udGFsIGxpbmVzIChkb3R0ZWQgJiBkYXNoZWQgcmVkKQogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSAzLCBjb2xvciA9ICJBdmcuIHBheW9mZiBpZiBib3RoIGNvb3BlcmF0aW5nICgzKSIpLAogICAgICAgICAgICAgbGluZXR5cGUgPSAiZG90dGVkIiwgbGluZXdpZHRoID0gMC41KSArCiAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdCA9IDIsIGNvbG9yID0gIkF2Zy4gcGF5b2ZmIGlmIGJvdGggZGVmZWN0aW5nICgyKSIpLAogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgbGluZXdpZHRoID0gMC41KSArCiAgCiAgIyBEZWZpbmUgbGVnZW5kIGFuZCBjb2xvcnMKICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICBuYW1lID0gIkxlZ2VuZCIsCiAgICB2YWx1ZXMgPSBjKAogICAgICAiRXZvbHV0aW9uIG9mIGF2ZXJhZ2UgcGF5b2ZmcyIgPSAiZGFya2JsdWUiLAogICAgICAiQXZnLiBwYXlvZmYgaWYgYm90aCBjb29wZXJhdGluZyAoMykiID0gInJlZCIsCiAgICAgICJBdmcuIHBheW9mZiBpZiBib3RoIGRlZmVjdGluZyAoMikiID0gInJlZCIsCiAgICAgICJUcmVuZCBldm9sdXRpb24gbGluZSIgPSAicmVkIgogICAgKQogICkgKwogIAogICMgV3JhcCBsZWdlbmQgaW50byB0d28gcm93cwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChucm93ID0gNCwgYnlyb3cgPSBUUlVFKSkgKwogIAogIGxhYnMoCiAgICAjIHRpdGxlID0gIiIsCiAgICB4ID0gIlJvdW5kIiwKICAgIHkgPSAiQXZlcmFnZSBQYXlvZmYiCiAgKSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSA5KSArCiAgdGhlbWUoCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwKICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkKICApCgpgYGAKSW5zcGVjdGluZyB0aGUgcGF5b2ZmIG1hdHJpeCBnaXZlbiBpbiAqKlRhYmxlIDIuKiogY29uY2x1ZGVzIHRoYXQgc2VsZWN0aW9uIG9mIHRoZSBzZWNvbmQgcm93LCBvciBzZWxlY3Rpb24gb2YgdGhlIGxlZnQgY29sdW1uIGlzIG5vdCByYXRpb25hbGUsIGFzIGJvdGggc3RyYXRlZ2llcyBkb21pbmF0ZSB0aGVpciBjb3VudGVycGFydCAoaS5lLiwgZmlyc3Qgcm93IG9yIHRoZSByaWdodCBjb2x1bW4pIGFzIHJlZ2FyZGxlc3MgdGhlIHR1cm4gb2YgdGhlIG9wcG9uZW50LCB0aGUgc2Vjb25kIHJhdyAocmlnaHQgY29sdW1uKSBwcm92aWRlcyBoaWdoZXIgcGF5b2ZmIHRoYW4gdGhlIGZpcnN0IHJhdyAobGVmdCBjb2x1bW4pLiAqKkZpZy4gNSoqIGRlbW9uc3RyYXRlcyB0aGF0IHRoZSBudW1iZXIgb2YgdGhlc2UgaXJyYXRpb25hbCBzdHJhdGVnaWVzIHNlbGVjdGVkIGRlY3JlYXNlcyBhcyB0aGUgbnVtYmVyIG9mIHJvdW5kcyBwYXNzZWQgaW5jcmVhc2VzLiBIb3dldmVyLCB0aGVyZSBpcyBhIHJlbGF0aXZlbHkgc21hbGwgY2hhbmNlIHRoZXkgY29udmVyZ2UgdG8gemVybywgYXMgdGhlIGluY2VudGl2ZXMgdG8gZGV2aWF0ZSBmcm9tIHRoZSBoaWdoIGNvb3BlcmF0aW9uIHBheW9mZnMgc3RyYXRlZ2llcyBhcmUgaGlnaC4KCioqRmlnLjUqKiBOdW1iZXIgb2YgTm90IEJlc3QgUmVzcG9uc2VzIC0gZXZvbHV0aW9uCgpgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQoKbm90X2Jlc3QgPC0gZGF0YS5mcmFtZSgKICBSb3VuZCA9IDE6OCwKICBOb3RfQmVzdF9SZXNwb25zZSA9IGMoMywgNywgNCwgMiwgMywgNiwgMiwgMykKKQoKZ2dwbG90KG5vdF9iZXN0LCBhZXMoeCA9IFJvdW5kLCB5ID0gTm90X0Jlc3RfUmVzcG9uc2UpKSArCiAgZ2VvbV9jb2woZmlsbCA9ICJzdGVlbGJsdWUiLCB3aWR0aCA9IDAuNSkgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBOb3RfQmVzdF9SZXNwb25zZSksCiAgICAgICAgICAgIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMuNSwgY29sb3IgPSAicmVkIikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGNvbG9yID0gInJlZCIsIGxpbmV3aWR0aCA9IDAuOCkgKyAgIyByZWdyZXNzaW9uIGxpbmUKICBsYWJzKAogICAgeCA9ICJSb3VuZCIsCiAgICB5ID0gIkNvdW50IG9mIE5vbuKAk0Jlc3TigJNSZXNwb25zZSBTdHJhdGVnaWVzIgogICkgKwogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gOSkgKwogIHRoZW1lKAogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KQogICkgKwogIHlsaW0oMCwgbWF4KG5vdF9iZXN0JE5vdF9CZXN0X1Jlc3BvbnNlKSArIDEpCgpgYGAKCg==