PGh0bWw+Cgk8aGVhZD4KCQk8dGl0bGU+ZmlsZV9pdGVyYXRpb24uaHRtbDwvdGl0bGU+CgkJPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzLmNzcyI+Cgk8L2hlYWQ+Cgk8Ym9keT4KCQk8aDQ+CgkJCUZpbGUgSXRlcmF0aW9uCgkJPC9oND4KCQk8ZGl2PgoJCQlGaWxlIGl0ZXJhdGlvbiBpcyBhIGNvbXBsZXgsIGJ1dCBwb3dlcmZ1bCwgdmVydGljYWwgcmVwZXRpdGlvbiBjb25zdHJ1Y3QuJm5ic3A7IAoJCQlJdCByZXBlYXRlZGx5IGluY2x1ZGVzIGEgPGk+ZmlsZTwvaT4gZm9yIGVhY2ggbnVtYmVyIGluIGEgdXNlci1zcGVjaWZpZWQgcmFuZ2UuCgkJPC9kaXY+CgkJPGg0PgoJCQlUdXRvcmlhbAoJCTwvaDQ+CgkJPGRpdj4KCQkJVGhpcyBtZWNoYW5pc20gcmVxdWlyZXMgdHdvIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiB0byBvcGVyYXRlOiZuYnNwOyBhIHJhbmdlIHRvIAoJCQlpdGVyYXRlIG92ZXIgYW5kIGEgZmlsZSB0byBpbmNsdWRlIG9uIGVhY2ggaXRlcmF0aW9uLiZuYnNwOyBJdCBjYW4gb3B0aW9uYWxseSAKCQkJdGFrZSBhIHRoaXJkIHBpZWNlIG9mIGluZm9ybWF0aW9uIHRoYXQgcmVwcmVzZW50cyBmbGFncyB1c2VkIHRvIGRpc2NyaW1pbmF0ZSAKCQkJYmV0d2VlbiBkaWZmZXJlbnQgaXRlcmF0aW9ucyBvZiB0aGUgc2FtZSBmaWxlLiZuYnNwOyBUaGlzIGluZm9ybWF0aW9uIGlzIAoJCQlvYnRhaW5lZCBieSB0aGUgbWVjaGFuaXNtIHRocm91Z2ggb25lIG9yIHR3byA8aT5uYW1lZCBleHRlcm5hbCBhcmd1bWVudHM8L2k+LiZuYnNwOyAKCQkJVGhlc2UgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQgYXMgdXNlci1kZWZpbmVkIG1hY3JvcyBuYW1lZCA8Yj5CT09TVF9QUF9JVEVSQVRJT05fUEFSQU1TXzxpPng8L2k+PC9iPgoJCQlvciB0aGUgY29tYmluYXRpb24gb2YgPGI+Qk9PU1RfUFBfRklMRU5BTUVfPGk+eDwvaT48L2I+IGFuZCA8Yj5CT09TVF9QUF9JVEVSQVRJT05fTElNSVRTPC9iPi4KCQk8L2Rpdj4KCQk8ZGl2PgoJCQk8Yj5CT09TVF9QUF9JVEVSQVRJT05fTElNSVRTPC9iPiBzcGVjaWZpZXMgdGhlIHJhbmdlIG9mIHZhbHVlcyB0byBpdGVyYXRlIAoJCQlvdmVyLiZuYnNwOyBJdCA8aT5tdXN0PC9pPiBleHBhbmQgdG8gYSA8aT50dXBsZTwvaT4gY29udGFpbmluZyB0d28gZWxlbWVudHMtLWEgCgkJCWxvd2VyIGFuZCB1cHBlciBib3VuZC4mbmJzcDsgQm90aCB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyBtdXN0IGJlIG51bWVyaWMgCgkJCXZhbHVlcyBpbiB0aGUgcmFuZ2Ugb2YgPGk+MDwvaT4gdG8gPGI+Qk9PU1RfUFBfTElNSVRfSVRFUkFUSU9OPC9iPi4mbmJzcDsgRm9yIAoJCQlleGFtcGxlLCBpZiB0aGUgdXNlciB3aXNoZXMgYSBmaWxlIHRvIGJlIGluY2x1ZGVkIGZvciBudW1iZXJzIHJhbmdpbmcgZnJvbSA8aT4wPC9pPgoJCQl0byA8aT4xMDwvaT4sIDxiPkJPT1NUX1BQX0lURVJBVElPTl9MSU1JVFM8L2I+IHdvdWxkIGJlIGRlZmluZWQgbGlrZSB0aGlzOgoJCTwvZGl2PgoJCTxkaXYgY2xhc3M9ImNvZGUiPgoJCQk8cHJlPgojZGVmaW5lIEJPT1NUX1BQX0lURVJBVElPTl9MSU1JVFMgKDAsIDEwKQo8L3ByZT4KCQk8L2Rpdj4KCQk8ZGl2PgoJCQlOb3RlIHRoYXQgdGhlcmUgaXMgd2hpdGVzcGFjZSBhZnRlciB0aGUgbmFtZSBvZiB0aGUgbWFjcm8uJm5ic3A7IFRoZSBtYWNybyA8aT5kb2VzIAoJCQkJbm90PC9pPiB0YWtlIDxpPnR3bzwvaT4gYXJndW1lbnRzLiZuYnNwOyBJbiB0aGUgY2FzZSBhYm92ZSwgaWYgdGhlcmUgd2FzIAoJCQlubyB3aGl0ZXNwYWNlLCBhIHByZXByb2Nlc3NpbmcgZXJyb3Igd291bGQgb2NjdXIgYmVjYXVzZSA8aT4wPC9pPiBhbmQgPGk+MTA8L2k+IAoJCQlhcmUgaW52YWxpZCBpZGVudGlmaWVycy4KCQk8L2Rpdj4KCQk8ZGl2PgoJCQlCb3RoIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzIHNwZWNpZmllZCBpbiB0aGUgPGI+Qk9PU1RfUFBfSVRFUkFUSU9OX0xJTUlUUzwvYj4KCQkJbWFjcm8gYXJlIDxpPmV2YWx1YXRlZCBwYXJhbWV0ZXJzPC9pPi4mbmJzcDsgVGhpcyBpbXBsaWVzIHRoYXQgdGhleSBjYW4gaW5jbHVkZSAKCQkJc2ltcGxlIGFyaXRobWV0aWMgb3IgbG9naWNhbCBleHByZXNzaW9ucy4mbmJzcDsgRm9yIGluc3RhbmNlLCB0aGUgYWJvdmUgCgkJCWRlZmluaXRpb24gY291bGQgZWFzaWx5IGhhdmUgYmVlbiB3cml0dGVuIGxpa2UgdGhpczoKCQk8L2Rpdj4KCQk8ZGl2IGNsYXNzPSJjb2RlIj4KCQkJPHByZT4KI2RlZmluZSBOKCkgNQojZGVmaW5lIEJPT1NUX1BQX0lURVJBVElPTl9MSU1JVFMgKDAsIE4oKSArIDUpCjwvcHJlPgoJCTwvZGl2PgoJCTxkaXY+CgkJCUJlY2F1c2Ugb2YgdGhpcywgaWYgdGhlIHdoaXRlc3BhY2UgYWZ0ZXIgdGhlIG1hY3JvIG5hbWUgaXMgZWxpZGVkLCBpdCBpcyAKCQkJcG9zc2libGUgZm9yIHRoZSBkZWZpbml0aW9uIHRvIGJlIHN5bnRhY3RpY2FsbHkgdmFsaWQ6CgkJPC9kaXY+CgkJPGRpdiBjbGFzcz0iY29kZSI+CgkJCTxwcmU+CiNkZWZpbmUgQSAwCiNkZWZpbmUgQiAxMAojZGVmaW5lIEJPT1NUX1BQX0lURVJBVElPTl9MSU1JVFMoQSwgQikKICAgLy8gbm90ZTogIG5vIHdoaXRlc3BhY2UgICAgICAgXgo8L3ByZT4KCQk8L2Rpdj4KCQk8ZGl2PgoJCQlJZiB0aGlzIGhhcHBlbnMsIGFuIGVycm9yIHdpbGwgb2NjdXIgaW5zaWRlIHRoZSBtZWNoYW5pc20gd2hlbiBpdCBhdHRlbXB0cyB0byAKCQkJdXNlIHRoaXMgbWFjcm8uJm5ic3A7IFRoZSBlcnJvciBtZXNzYWdlcyB0aGF0IHJlc3VsdCBtYXkgYmUgb2JzY3VyZSwgc28gYWx3YXlzIAoJCQlyZW1lbWJlciB0byBpbmNsdWRlIHRoZSB3aGl0ZXNwYWNlLiZuYnNwOyBBIDxpPmNvcnJlY3Q8L2k+IHZlcnNpb24gb2YgdGhlIGFib3ZlIAoJCQlsb29rcyBsaWtlIHRoaXM6CgkJPC9kaXY+CgkJPGRpdiBjbGFzcz0iY29kZSI+CgkJCTxwcmU+CiNkZWZpbmUgQSAwCiNkZWZpbmUgQiAxMAojZGVmaW5lIEJPT1NUX1BQX0lURVJBVElPTl9MSU1JVFMgKEEsIEIpCiAgIC8vIG5vdGU6ICBoYXMgd2hpdGVzcGFjZSAgICAgIF4KPC9wcmU+CgkJPC9kaXY+CgkJPGRpdj4KCQkJPGI+Qk9PU1RfUFBfRklMRU5BTUVfPGk+eDwvaT48L2I+IHNwZWNpZmllcyB0aGUgZmlsZSB0byBpdGVyYXRlIG92ZXIuJm5ic3A7IFRoZSA8aT54PC9pPgoJCQlpcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgZGltZW5zaW9uIG9mIGl0ZXJhdGlvbi4mbmJzcDsgKEZvciBub3csIHdlJ2xsIGFzc3VtZSAKCQkJdGhpcyBpcyA8aT4xPC9pPi0taS5lLiB0aGUgZmlyc3QgZGltZW5zaW9uLCBzbyB3ZSBhcmUgYWN0dWFsbHkgZGVhbGluZyB3aXRoIDxiPkJPT1NUX1BQX0ZJTEVOQU1FXzE8L2I+LikmbmJzcDsgCgkJCVRoaXMgbWFjcm8gbXVzdCBleHBhbmQgdG8gYSB2YWxpZCBmaWxlbmFtZS0taW4gcXVvdGVzIG9yIGluIGFuZ2xlIGJyYWNrZXRzIAoJCQlkZXBlbmRpbmcgb24gaG93IHRoZSBmaWxlIGlzIGFjY2Vzc2VkOgoJCTwvZGl2PgoJCTxkaXYgY2xhc3M9ImNvZGUiPgoJCQk8cHJlPgojZGVmaW5lIEJPT1NUX1BQX0ZJTEVOQU1FXzEgImZpbGUuaCIKLy8gLW9yLQojZGVmaW5lIEJPT1NUX1BQX0ZJTEVOQU1FXzEgJmx0O2ZpbGUuaCZndDsKPC9wcmU+CgkJPC9kaXY+CgkJPGRpdj4KCQkJQWxsIHRoYXQgd2UgbmVlZCBub3cgdG8gcGVyZm9ybSBhIHNpbXBsZSBmaWxlIGl0ZXJhdGlvbiBpcyB0byBpbnZva2UgdGhlIAoJCQltZWNoYW5pc206CgkJPC9kaXY+CgkJPGRpdiBjbGFzcz0iY29kZSI+CgkJCTxwcmU+Cj8/PWluY2x1ZGUgQk9PU1RfUFBfSVRFUkFURSgpCjwvcHJlPgoJCTwvZGl2PgoJCTxkaXY+CgkJCShUaGUgPGNvZGU+Pz89PC9jb2RlPiB0b2tlbiBpcyBhIHRyaWdyYXBoIGZvciA8Y29kZT4jPC9jb2RlPi4mbmJzcDsgSSB1c2UgdGhlIAoJCQl0cmlncmFwaCB0byBtYWtlIGl0IGNsZWFyIHRoYXQgSSBhbSA8aT5pbmNsdWRpbmc8L2k+IGEgZmlsZSByYXRoZXIgdGhhbiAKCQkJZGVmaW5pbmcgb3IgZXhwYW5kaW5nIGEgbWFjcm8sIGJ1dCBpdCBpcyBub3QgbmVjZXNzYXJ5LiZuYnNwOyBFdmVuIHRoZSBkaWdyYXBoIAoJCQl2ZXJzaW9uLCA8Y29kZT4lOjwvY29kZT4sIGNvdWxkIGJlIHVzZWQuJm5ic3A7IFNvbWUgY29tcGlsZXJzIGRvIG5vdCByZWFkaWx5IAoJCQlhY2NlcHQgdHJpZ3JhcGhzIGFuZCBkaWdyYXBocywgc28ga2VlcCB0aGF0IGluIG1pbmQuJm5ic3A7IE90aGVyIHRoYW4gdGhhdCwgdXNlIAoJCQl3aGljaGV2ZXIgb25lIHlvdSBwcmVmZXIuKQoJCTwvZGl2PgoJCTxkaXY+CgkJCVNvLCBpZiB3ZSB3aXNoIHRvIGl0ZXJhdGUgImZpbGUuaCIgZnJvbSA8aT4xPC9pPiB0byA8aT4xMDwvaT4sIHdlIGp1c3QgbmVlZCB0byAKCQkJcHV0IHRoZSBwaWVjZXMgdG9nZXRoZXI6CgkJPC9kaXY+CgkJPGRpdiBjbGFzcz0iY29kZSI+CgkJCTxwcmU+CiNkZWZpbmUgQk9PU1RfUFBfSVRFUkFUSU9OX0xJTUlUUyAoMSwgMTApCiNkZWZpbmUgQk9PU1RfUFBfRklMRU5BTUVfMSAiZmlsZS5oIgo/Pz1pbmNsdWRlIEJPT1NUX1BQX0lURVJBVEUoKQo8L3ByZT4KCQk8L2Rpdj4KCQk8ZGl2PgoJCQlUaGUgYWJvdmUgY29kZSBoYXMgdGhlIGVmZmVjdCBvZiBpbmNsdWRpbmcgImZpbGUuaCIgdGVuIHRpbWVzIGluIAoJCQlzdWNjZXNzaW9uLiZuYnNwOwoJCTwvZGl2PgoJCTxkaXY+CgkJCUFsdGVybmF0ZWx5LCBib3RoIHRoZSByYW5nZSBhbmQgdGhlIGZpbGUgdG8gaXRlcmF0ZSBvdmVyIGNhbiBiZSBleHByZXNzZWQgaW4gCgkJCW9uZSBtYWNybywgPGI+Qk9PU1RfUFBfSVRFUkFUSU9OX1BBUkFNU188aT54PC9pPjwvYj4uJm5ic3A7IE9uY2UgYWdhaW4sIHRoZSA8aT54PC9pPgoJCQlpcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgZGltZW5zaW9uIG9mIGl0ZXJhdGlvbi0td2hpY2ggd2UnbGwgYXNzdW1lIGlzIDxpPjE8L2k+LiZuYnNwOyAKCQkJVGhpcyBtYWNybyBtdXN0IGV4cGFuZCB0byBhbiA8aT5hcnJheTwvaT4gdGhhdCBpbmNsdWRlcyB0aGUgbG93ZXIgYm91bmQsIHVwcGVyIAoJCQlib3VuZCwgZmlsZW5hbWUsIGFuZCBvcHRpb25hbCBmbGFncyAoaW4gdGhhdCBvcmRlcikuCgkJPC9kaXY+CgkJPGRpdiBjbGFzcz0iY29kZSI+CgkJCTxwcmU+CiNkZWZpbmUgQk9PU1RfUFBfSVRFUkFUSU9OX1BBUkFNU18xICgzLCAoMSwgMTAsICJmaWxlLmgiKSkKPz89aW5jbHVkZSBCT09TVF9QUF9JVEVSQVRFKCkKPC9wcmU+CgkJPC9kaXY+CgkJPGRpdj4KCQkJVGhpcyBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIHRoZSBwcmV2aW91cyB2ZXJzaW9uLiZuYnNwOyBPbmx5IG9uZSBvZiB0aGVzZSB0d28gCgkJCXdheXMgdG8gc3BlY2lmeSB0aGUgcGFyYW1ldGVycyBjYW4gYmUgdXNlZCBhdCBhIHRpbWUuJm5ic3A7IChUaGUgcmVhc29uIHRoYXQgCgkJCXRoZXJlIGFyZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgaGFzIHRvIGRvIHdpdGggZGltZW5zaW9uYWwgYWJzdHJhY3Rpb24gd2hpY2ggCgkJCUknbGwgZ2V0IHRvIGxhdGVyLikKCQk8L2Rpdj4KCQk8ZGl2PgoJCQlUaGVyZSBpcyBub3RoaW5nIHBhcnRpY3VsYXJseSB1c2VmdWwgYWJvdXQgaW5jbHVkaW5nIGEgZmlsZSB0ZW4gdGltZXMuJm5ic3A7IAoJCQlUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSBjdXJyZW50IG1hY3JvIHN0YXRlIGNoYW5nZXMgZWFjaCB0aW1lLiZuYnNwOyBGb3IgCgkJCWV4YW1wbGUsIHRoZSBjdXJyZW50ICJpdGVyYXRpb24gdmFsdWUiIGlzIGF2YWlsYWJsZSB3aXRoIDxiPkJPT1NUX1BQX0lURVJBVElPTjwvYj4oKS4mbmJzcDsgCgkJCUlmICJmaWxlLmgiIGlzIGRlZmluZWQgbGlrZSB0aGlzLi4uCgkJPC9kaXY+CgkJPGRpdiBjbGFzcz0iY29kZSI+CgkJCTxwcmU+Ci8vIGZpbGUuaAp0ZW1wbGF0ZSZsdDsmZ3Q7IHN0cnVjdCBzYW1wbGUmbHQ7Qk9PU1RfUFBfSVRFUkFUSU9OKCkmZ3Q7IHsgfTsKPC9wcmU+CgkJPC9kaXY+CgkJPGRpdj4KCQkJLi4uYW5kIGl0IGlzIGl0ZXJhdGVkIGFzIGZvbGxvd3MuLi4KCQk8L2Rpdj4KCQk8ZGl2IGNsYXNzPSJjb2RlIj4KCQkJPHByZT4KdGVtcGxhdGUmbHQ7aW50Jmd0OyBzdHJ1Y3Qgc2FtcGxlOwoKI2RlZmluZSBCT09TVF9QUF9JVEVSQVRJT05fUEFSQU1TXzEgKDMsICgxLCA1LCAiZmlsZS5oIikpCj8/PWluY2x1ZGUgQk9PU1RfUFBfSVRFUkFURSgpCjwvcHJlPgoJCTwvZGl2PgoJCTxkaXY+CgkJCS4uLnRoZSByZXN1bHQgaXMgZGlmZmVyZW50IGVhY2ggdGltZToKCQk8L2Rpdj4KCQk8ZGl2PgoJCQk8cHJlPgp0ZW1wbGF0ZSZsdDsmZ3Q7IHN0cnVjdCBzYW1wbGUmbHQ7MSZndDsgeyB9Owp0ZW1wbGF0ZSZsdDsmZ3Q7IHN0cnVjdCBzYW1wbGUmbHQ7MiZndDsgeyB9Owp0ZW1wbGF0ZSZsdDsmZ3Q7IHN0cnVjdCBzYW1wbGUmbHQ7MyZndDsgeyB9Owp0ZW1wbGF0ZSZsdDsmZ3Q7IHN0cnVjdCBzYW1wbGUmbHQ7NCZndDsgeyB9Owp0ZW1wbGF0ZSZsdDsmZ3Q7IHN0cnVjdCBzYW1wbGUmbHQ7NSZndDsgeyB9Owo8L3ByZT4KCQk8L2Rpdj4KCQk8ZGl2PgoJCQlUaGVyZSBpcyBubyByZWFzb24gdGhhdCBhIGZpbGUgY2FuJ3QgaXRlcmF0ZSBvdmVyIGl0c2VsZi4mbmJzcDsgVGhpcyBoYXMgdGhlIAoJCQlhZHZhbnRhZ2Ugb2Yga2VlcGluZyB0aGUgY29kZSB0b2dldGhlci4mbmJzcDsgVGhlIHByb2JsZW0gaXMgdGhhdCB5b3UgaGF2ZSB0byAKCQkJZGlzY3JpbWluYXRlIHRoZSAicmVndWxhciIgc2VjdGlvbiBvZiB0aGUgZmlsZSBmcm9tIHRoZSBpdGVyYXRlZCBzZWN0aW9uIG9mIHRoZSAKCQkJZmlsZS4mbmJzcDsgVGhlIGxpYnJhcnkgcHJvdmlkZXMgdGhlIDxiPkJPT1NUX1BQX0lTX0lURVJBVElORzwvYj4gbWFjcm8gdG8gaGVscCAKCQkJaW4gdGhpcyByZWdhcmQuJm5ic3A7IFRoaXMgbWFjcm8gaXMgZGVmaW5lZCBhcyA8aT4xPC9pPiBpZiBhbiBpdGVyYXRpb24gaXMgaW4gCgkJCXByb2dyZXNzLiZuYnNwOyBGb3IgZXhhbXBsZSwgdG8gbWVyZ2UgdGhlIGNvbnRlbnRzIG9mICJmaWxlLmgiIGludG8gdGhlIGZpbGUgCgkJCXRoYXQgaXRlcmF0ZXMgaXQ6CgkJPC9kaXY+CgkJPGRpdiBjbGFzcz0iY29kZSI+CgkJCTxwcmU+Ci8vIHNhbXBsZS5oCiNpZiAhQk9PU1RfUFBfSVNfSVRFUkFUSU5HCgogICAjaWZuZGVmIFNBTVBMRV9ICiAgICNkZWZpbmUgU0FNUExFX0gKCiAgICNpbmNsdWRlICZsdDtib29zdC9wcmVwcm9jZXNzb3IvaXRlcmF0aW9uL2l0ZXJhdGUuaHBwJmd0OwoKICAgdGVtcGxhdGUmbHQ7aW50Jmd0OyBzdHJ1Y3Qgc2FtcGxlOwoKICAgI2RlZmluZSBCT09TVF9QUF9JVEVSQVRJT05fUEFSQU1TXzEgKDMsICgxLCA1LCAic2FtcGxlLmgiKSkKICAgPz89aW5jbHVkZSBCT09TVF9QUF9JVEVSQVRFKCkKCiAgICNlbmRpZiAvLyBTQU1QTEVfSAoKI2Vsc2UKCiAgIHRlbXBsYXRlJmx0OyZndDsgc3RydWN0IHNhbXBsZSZsdDtCT09TVF9QUF9JVEVSQVRJT04oKSZndDsgeyB9OwoKI2VuZGlmCjwvcHJlPgoJCTwvZGl2PgoJCTxkaXY+CgkJCVVzaW5nIHRoZSBzYW1lIGZpbGUgbGlrZSB0aGlzIHJhaXNlcyBhbm90aGVyIGlzc3VlLiZuYnNwOyBXaGF0IGhhcHBlbnMgd2hlbiBhIAoJCQlmaWxlIHBlcmZvcm1zIHR3byBzZXBhcmF0ZSBmaWxlIGl0ZXJhdGlvbnMgb3ZlciBpdHNlbGY/Jm5ic3A7IFRoaXMgaXMgdGhlIAoJCQlwdXJwb3NlIG9mIHRoZSBvcHRpb25hbCBmbGFncyBwYXJhbWV0ZXIuJm5ic3A7IEl0IGlzIHVzZWQgdG8gZGlzY3JpbWluYXRlIAoJCQliZXR3ZWVuIHNlcGFyYXRlIGl0ZXJhdGlvbnMuCgkJPC9kaXY+CgkJPGRpdiBjbGFzcz0iY29kZSI+CgkJCTxwcmU+Ci8vIHNhbXBsZS5oCiNpZiAhQk9PU1RfUFBfSVNfSVRFUkFUSU5HCgogICAjaWZuZGVmIFNBTVBMRV9ICiAgICNkZWZpbmUgU0FNUExFX0gKCiAgICNpbmNsdWRlICZsdDtib29zdC9wcmVwcm9jZXNzb3IvaXRlcmF0aW9uL2l0ZXJhdGUuaHBwJmd0OwogICAjaW5jbHVkZSAmbHQ7Ym9vc3QvcHJlcHJvY2Vzc29yL3JlcGV0aXRpb24vZW51bV9wYXJhbXMuaHBwJmd0OwogICAjaW5jbHVkZSAmbHQ7Ym9vc3QvcHJlcHJvY2Vzc29yL3JlcGV0aXRpb24vZW51bV9zaGlmdGVkX3BhcmFtcy5ocHAmZ3Q7CgogICB0ZW1wbGF0ZSZsdDtpbnQmZ3Q7IHN0cnVjdCBzYW1wbGU7CgogICAjZGVmaW5lIEJPT1NUX1BQX0lURVJBVElPTl9QQVJBTVNfMSAoNCwgKDEsIDUsICJzYW1wbGUuaCIsIDEpKQogICA/Pz1pbmNsdWRlIEJPT1NUX1BQX0lURVJBVEUoKQoKICAgdGVtcGxhdGUmbHQ7Y2xhc3MgVCwgY2xhc3MgVSZndDsgc3RydWN0IHR5cGVsaXN0X3QgewogICAgICB0eXBlZGVmIFQgaGVhZDsKICAgICAgdHlwZWRlZiBVIHRhaWw7CiAgIH07CgogICB0ZW1wbGF0ZSZsdDtpbnQmZ3Q7IHN0cnVjdCB0eXBlbGlzdDsKICAgc3RydWN0IG51bGxfdDsKCiAgIHRlbXBsYXRlJmx0OyZndDsgc3RydWN0IHR5cGVsaXN0Jmx0OzEmZ3Q7IHsKICAgICAgdGVtcGxhdGUmbHQ7Y2xhc3MgVDAmZ3Q7IHN0cnVjdCBhcmdzIHsKICAgICAgICAgdHlwZWRlZiB0eXBlbGlzdF90Jmx0O1QwLCBudWxsX3QmZ3Q7IHR5cGU7CiAgICAgIH07CiAgIH07CgogICAjaWZuZGVmIFRZUEVMSVNUX01BWAogICAjZGVmaW5lIFRZUEVMSVNUX01BWCA1MAogICAjZW5kaWYKCiAgICNkZWZpbmUgQk9PU1RfUFBfSVRFUkFUSU9OX1BBUkFNU18xICg0LCAoMiwgVFlQRUxJU1RfTUFYLCAic2FtcGxlLmgiLCAyKSkKICAgPz89aW5jbHVkZSBCT09TVF9QUF9JVEVSQVRFKCkKCiAgICNlbmRpZiAvLyBTQU1QTEVfSAoKI2VsaWYgQk9PU1RfUFBfSVRFUkFUSU9OX0ZMQUdTKCkgPT0gMQoKICAgdGVtcGxhdGUmbHQ7Jmd0OyBzdHJ1Y3Qgc2FtcGxlJmx0O0JPT1NUX1BQX0lURVJBVElPTigpJmd0OyB7IH07CgojZWxpZiBCT09TVF9QUF9JVEVSQVRJT05fRkxBR1MoKSA9PSAyCgogICAjZGVmaW5lIE4gQk9PU1RfUFBfSVRFUkFUSU9OKCkKCiAgIHRlbXBsYXRlJmx0OyZndDsgc3RydWN0IHR5cGVsaXN0Jmx0O04mZ3Q7IHsKICAgICAgdGVtcGxhdGUmbHQ7Qk9PU1RfUFBfRU5VTV9QQVJBTVMoTiwgY2xhc3MgVCkmZ3Q7IHN0cnVjdCBhcmdzIHsKICAgICAgICAgdHlwZWRlZiB0eXBlbGlzdF90Jmx0OwogICAgICAgICAgICBUMCwKICAgICAgICAgICAgdHlwZW5hbWUgdHlwZWxpc3QmbHQ7TiAtIDEmZ3Q7OjphcmdzJmx0O0JPT1NUX1BQX0VOVU1fU0hJRlRFRF9QQVJBTVMoTiwgVCkmZ3Q7Ojp0eXBlCiAgICAgICAgICZndDsgdHlwZTsKICAgICAgfTsKICAgfTsKCiAgICN1bmRlZiBOCgojZW5kaWYKPC9wcmU+CgkJPC9kaXY+CgkJPGRpdj4KCQkJTm90aWNlIHRoZSB1c2Ugb2YgdGhlICJmbGFncyIgcGFyYW1ldGVyICh3aGljaCBpcyBhY2Nlc3NlZCB0aHJvdWdoIDxiPkJPT1NUX1BQX0lURVJBVElPTl9GTEFHUzwvYj4oKSkuJm5ic3A7IAoJCQlJdCBkaXNjcmltaW5hdGVzIGJldHdlZW4gb3VyIHJlY3VycmluZyA8Y29kZT5zYW1wbGU8L2NvZGU+IGl0ZXJhdGlvbiBhbmQgYSAKCQkJdHlwZWxpc3QgbGluZWFyaXphdGlvbiBpdGVyYXRpb24uJm5ic3A7CgkJPC9kaXY+CgkJPGRpdj4KCQkJVGhlIHNlY29uZCBpdGVyYXRpb24gaWxsdXN0cmF0ZXMgdGhlIHBvd2VyIG9mIHRoZSBmaWxlIGl0ZXJhdGlvbiAKCQkJbWVjaGFuaXNtLiZuYnNwOyBJdCBnZW5lcmF0ZXMgdHlwZWxpc3QgbGluZWFyaXphdGlvbnMgb2YgdGhlIGZvcm0gPGNvZGU+dHlwZWxpc3QmbHQ7MyZndDs6OmFyZ3MmbHQ7aW50LCAKCQkJCWRvdWJsZSwgY2hhciZndDs6OnR5cGU8L2NvZGU+LgoJCTwvZGl2PgoJCTxkaXY+CgkJCUFjdHVhbGx5LCB0byBjb250aW51ZSB0aGUgdHlwZWxpc3QgZXhhbXBsZSwgd2l0aCB0aGUgaGVscCBvZiBhbm90aGVyIGl0ZXJhdGlvbiAKCQkJd2UgY2FuIDxpPmZ1bGx5PC9pPiBsaW5lYXJpemUgdHlwZWxpc3QgY3JlYXRpb24uLi4uCgkJPC9kaXY+CgkJPGRpdiBjbGFzcz0iY29kZSI+CgkJCTxwcmU+Ci8vIGV4dHJhY3QuaAojaWYgIUJPT1NUX1BQX0lTX0lURVJBVElORwoKICAgI2lmbmRlZiBFWFRSQUNUX0gKICAgI2RlZmluZSBFWFRSQUNUX0gKCiAgICNpbmNsdWRlICZsdDtib29zdC9wcmVwcm9jZXNzb3IvaXRlcmF0aW9uL2l0ZXJhdGUuaHBwJmd0OwogICAjaW5jbHVkZSAmbHQ7Ym9vc3QvcHJlcHJvY2Vzc29yL3JlcGV0aXRpb24vZW51bS5ocHAmZ3Q7CiAgICNpbmNsdWRlICZsdDtib29zdC9wcmVwcm9jZXNzb3IvcmVwZXRpdGlvbi9lbnVtX3BhcmFtcy5ocHAmZ3Q7CiAgICNpbmNsdWRlICZsdDtib29zdC9wcmVwcm9jZXNzb3IvcmVwZXRpdGlvbi9lbnVtX3RyYWlsaW5nX3BhcmFtcy5ocHAmZ3Q7CgogICAvLyBjZXJ0YWluIHR5cGVzIHN1Y2ggYXMgInZvaWQiIGNhbid0IGJlIGZ1bmN0aW9uIGFyZ3VtZW50IHR5cGVzCgogICB0ZW1wbGF0ZSZsdDtjbGFzcyBUJmd0OyBzdHJ1Y3QgaW5jb21wbGV0ZSB7CiAgICAgIHR5cGVkZWYgVCB0eXBlOwogICB9OwoKICAgdGVtcGxhdGUmbHQ7Y2xhc3MgVCZndDsgc3RydWN0IHN0cmlwX2luY29tcGxldGUgewogICAgICB0eXBlZGVmIFQgdHlwZTsKICAgfTsKCiAgIHRlbXBsYXRlJmx0O2NsYXNzIFQmZ3Q7IHN0cnVjdCBzdHJpcF9pbmNvbXBsZXRlJmx0O2luY29tcGxldGUmbHQ7VCZndDsgJmd0OyB7CiAgICAgIHR5cGVkZWYgVCB0eXBlOwogICB9OwoKICAgdGVtcGxhdGUmbHQ7dGVtcGxhdGUmbHQ7aW50Jmd0OyBjbGFzcyBvdXRwdXQsIGNsYXNzIGZ1bmNfdCZndDsgc3RydWN0IGV4dHJhY3Q7CgogICAjaWZuZGVmIEVYVFJBQ1RfTUFYCiAgICNkZWZpbmUgRVhUUkFDVF9NQVggNTAKICAgI2VuZGlmCgogICAjZGVmaW5lIEJPT1NUX1BQX0lURVJBVElPTl9QQVJBTVNfMSAoMywgKDEsIEVYVFJBQ1RfTUFYLCAiZXh0cmFjdC5oIikpCiAgID8/PWluY2x1ZGUgQk9PU1RfUFBfSVRFUkFURSgpCgogICAjZW5kaWYgLy8gRVhUUkFDVF9ICgojZWxzZQoKICAgI2RlZmluZSBOIEJPT1NUX1BQX0lURVJBVElPTigpCiAgICNkZWZpbmUgU1RSSVAoeiwgbiwgXykgXAogICAgICB0eXBlbmFtZSBzdHJpcF9pbmNvbXBsZXRlJmx0O1QgIyMgbiZndDs6OnR5cGUgXAogICAgICAvKiovCgogICB0ZW1wbGF0ZSZsdDt0ZW1wbGF0ZSZsdDtpbnQmZ3Q7IGNsYXNzIG91dHB1dCwgY2xhc3MgUiBCT09TVF9QUF9FTlVNX1RSQUlMSU5HX1BBUkFNUyhOLCBjbGFzcyBUKSZndDsKICAgc3RydWN0IGV4dHJhY3QmbHQ7UiAoQk9PU1RfUFBfRU5VTV9QQVJBTVMoTiwgVCkpJmd0OyB7CiAgICAgIHR5cGVkZWYgdHlwZW5hbWUgb3V0cHV0Jmx0O04mZ3Q7Ojp0ZW1wbGF0ZSBhcmdzJmx0O0JPT1NUX1BQX0VOVU0oTiwgU1RSSVAsIG5pbCkmZ3Q7Ojp0eXBlIHR5cGU7CiAgIH07CgogICAjdW5kZWYgU1RSSVAKICAgI3VuZGVmIE4KCiNlbmRpZgo8L3ByZT4KCQk8L2Rpdj4KCQk8ZGl2PgoJCQlOb3cgd2UgY2FuIGRlZmluZSBhIGhlbHBlciBtYWNybyB0byBmaW5pc2ggdGhlIGpvYjoKCQk8L2Rpdj4KCQk8ZGl2IGNsYXNzPSJjb2RlIj4KCQkJPHByZT4KI2RlZmluZSBUWVBFTElTVChhcmdzKSBleHRyYWN0Jmx0O3R5cGVsaXN0LCB2b2lkIGFyZ3MmZ3Q7Ojp0eXBlCgp0eXBlZGVmIFRZUEVMSVNUKChpbnQsIGRvdWJsZSwgaW5jb21wbGV0ZSZsdDt2b2lkJmd0OykpIHh5ejsKPC9wcmU+CgkJPC9kaXY+CgkJPGRpdj4KCQkJVGhlcmUgYXJlIHR3byBtaW5vciBjYXZlYXRzIHdpdGggdGhpcyByZXN1bHQuJm5ic3A7IEZpcnN0LCBjZXJ0YWluIHR5cGVzIGxpa2UgPGNvZGU+dm9pZDwvY29kZT4KCQkJY2FuJ3QgYmUgdGhlIHR5cGUgb2YgYW4gYXJndW1lbnQsIHNvIHRoZXkgaGF2ZSB0byBiZSB3cmFwcGVkIHdpdGggPGNvZGU+aW5jb21wbGV0ZSZsdDtUJmd0OzwvY29kZT4uJm5ic3A7IAoJCQlTZWNvbmQsIHRoZSBuZWNlc3NhcnkgZG91YmxlIHBhcmVudGhlc2lzIGlzIGFubm95aW5nLiZuYnNwOyBJZiBhbmQgd2hlbiBDKysgCgkJCWdldHMgQzk5J3MgdmFyaWFkaWMgbWFjcm9zLCA8Y29kZT5UWVBFTElTVDwvY29kZT4gY2FuIGJlIHJlZGVmaW5lZDoKCQk8L2Rpdj4KCQk8ZGl2IGNsYXNzPSJjb2RlIj4KCQkJPHByZT4KI2RlZmluZSBUWVBFTElTVCguLi4pIGV4dHJhY3QmbHQ7dHlwZWxpc3QsIHZvaWQgKF9fVkFfQVJHU19fKSZndDs6OnR5cGUKCnR5cGVkZWYgVFlQRUxJU1QoaW50LCBkb3VibGUsIHNob3J0KSB4eXo7CjwvcHJlPgoJCTwvZGl2PgoJCTxkaXY+CgkJCU5vdGUgYWxzbyB0aGF0IGJvdGggdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZHMgb2YgYW4gaXRlcmF0aW9uIGFyZSBhbHNvIAoJCQlhY2Nlc3NpYmxlIGluc2lkZSBhbiBpdGVyYXRpb24gd2l0aCA8Yj5CT09TVF9QUF9JVEVSQVRJT05fU1RBUlQ8L2I+KCkgYW5kIDxiPkJPT1NUX1BQX0lURVJBVElPTl9GSU5JU0g8L2I+KCkuCgkJPC9kaXY+CgkJPGRpdj4KCQkJSXQgaXMgbXkgaG9wZSB0aGF0IHRoZSBleHBsYW5hdGlvbiBhbmQgZXhhbXBsZXMgcHJlc2VudGVkIGhlcmUgZGVtb25zdHJhdGUgdGhlIAoJCQlwb3dlciBvZiBmaWxlIGl0ZXJhdGlvbi4mbmJzcDsgRXZlbiBzbywgdGhpcyBpcyBqdXN0IHRoZSBiZWdpbm5pbmcuJm5ic3A7IFRoZSAKCQkJZmlsZSBpdGVyYXRpb24gbWVjaGFuaXNtIGFsc28gZGVmaW5lcyBhIGZ1bGwgc3VpdGUgb2YgZmFjaWxpdGllcyB0byBzdXBwb3J0IAoJCQltdWx0aWRpbWVuc2lvbmFsIGl0ZXJhdGlvbi4KCQk8L2Rpdj4KCQk8aDQ+CgkJCU11bHRpcGxlIERpbWVuc2lvbnMKCQk8L2g0PgoJCTxkaXY+CgkJCVRoZSBmaWxlIGl0ZXJhdGlvbiBtZWNoYW5pc20gc3VwcG9ydHMgdXAgdG8gPGI+Qk9PU1RfUFBfTElNSVRfSVRFUkFUSU9OX0RJTTwvYj4gCgkJCWRpbWVuc2lvbnMuJm5ic3A7IFRoZSBmaXJzdCBkaW1lbnNpb24gKGkuZS4gdGhlIG91dGVybW9zdCkgd2UgaGF2ZSBhbHJlYWR5IHVzZWQgCgkJCWFib3ZlLiZuYnNwOyBJbiBvcmRlciB0byB1c2UgdGhlIHNlY29uZCBkaW1lbnNpb24gKGluc2lkZSB0aGUgZmlyc3QpLCB3ZSBzaW1wbHkgCgkJCWhhdmUgdG8gcmVwbGFjZSB0aGUgcGxhY2Vob2xkZXIgPGk+eDwvaT4gd2l0aCA8aT4yPC9pPiBpbnN0ZWFkIG9mIDxpPjE8L2k+LgoJCTwvZGl2PgoJCTxkaXYgY2xhc3M9ImNvZGUiPgoJCQk8cHJlPgojZGVmaW5lIEJPT1NUX1BQX0lURVJBVElPTl9QQVJBTVNfMiAvKiAuLi4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KPC9wcmU+CgkJPC9kaXY+CgkJPGRpdj4KCQkJLi4ub3IuLi4KCQk8L2Rpdj4KCQk8ZGl2IGNsYXNzPSJjb2RlIj4KCQkJPHByZT4KI2RlZmluZSBCT09TVF9QUF9GSUxFTkFNRV8yIC8qIC4uLiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIF4KPC9wcmU+CgkJPC9kaXY+CgkJPGRpdj4KCQkJRWFjaCBkaW1lbnNpb24gbXVzdCBiZSB1c2VkIDxpPmluIG9yZGVyPC9pPiBzdGFydGluZyB3aXRoIDxpPjE8L2k+LiZuYnNwOyAKCQkJVGhlcmVmb3JlLCB0aGUgYWJvdmUgY2FuIDxpPm9ubHk8L2k+IGJlIHZhbGlkIGltbWVkaWF0ZWx5IGluc2lkZSB0aGUgZmlyc3QgCgkJCWRpbWVuc2lvbi4mbmJzcDsKCQk8L2Rpdj4KCQk8ZGl2PgoJCQlBdCB0aGlzIHBvaW50LCBmdXJ0aGVyIGV4cGxhbmF0aW9uIGlzIG5lY2Vzc2FyeSByZWdhcmRpbmcgPGI+Qk9PU1RfUFBfSVRFUkFUSU9OPC9iPiwKCQkJPGI+Qk9PU1RfUFBfSVRFUkFUSU9OX1NUQVJUPC9iPiwgYW5kIDxiPkJPT1NUX1BQX0lURVJBVElPTl9GSU5JU0g8L2I+LiZuYnNwOyA8Yj5CT09TVF9QUF9JVEVSQVRJT048L2I+KCkgCgkJCWV4cGFuZHMgdG8gdGhlIGl0ZXJhdGlvbiB2YWx1ZSBvZiB0aGUgPGk+Y3VycmVudDwvaT4gZGltZW5zaW9uLS1yZWdhcmRsZXNzIG9mIAoJCQl3aGF0IGRpbWVuc2lvbiB0aGF0IGlzLiZuYnNwOyBMaWtld2lzZSwgPGI+Qk9PU1RfUFBfSVRFUkFUSU9OX1NUQVJUPC9iPigpIGFuZCA8Yj5CT09TVF9QUF9JVEVSQVRJT05fRklOSVNIPC9iPigpIAoJCQlleHBhbmQgdG8gdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZHMgb2YgdGhlIDxpPmN1cnJlbnQ8L2k+IGRpbWVuc2lvbi4mbmJzcDsgCgkJCVVzaW5nIHRoZSBmb2xsb3dpbmcgcHNldWRvLWNvZGUgYXMgcmVmZXJlbmNlOgoJCTwvZGl2PgoJCTxkaXYgY2xhc3M9ImNvZGUiPgoJCQk8cHJlPgpmb3IgKGludCBpID0gc3RhcnQoMSk7IGkgPD0gZmluaXNoKDEpOyArK2kpIHsKICAgLy8gQQogICBmb3IgKGludCBqID0gc3RhcnQoMik7IGogPD0gZmluaXNoKDIpOyArK2opIHsKICAgICAgLy8gQgogICB9CiAgIC8vIEMKfQo8L3ByZT4KCQk8L2Rpdj4KCQk8ZGl2PgoJCQlBdCBwb2ludCA8aT5BPC9pPiwgPGI+Qk9PU1RfUFBfSVRFUkFUSU9OPC9iPigpIHJlZmVycyB0byA8Y29kZT5pPC9jb2RlPi4mbmJzcDsgPGI+Qk9PU1RfUFBfSVRFUkFUSU9OX1NUQVJUPC9iPigpIAoJCQlhbmQgPGI+Qk9PU1RfUFBfSVRFUkFUSU9OX0ZJTklTSDwvYj4oKSByZWZlciB0byA8Y29kZT5zdGFydCgxKTwvY29kZT4gYW5kIDxjb2RlPmZpbmlzaCgxKTwvY29kZT4KCQkJcmVzcGVjdGl2ZWx5LiZuYnNwOyBBdCBwb2ludCA8aT5CPC9pPiwgaG93ZXZlciwgPGI+Qk9PU1RfUFBfSVRFUkFUSU9OPC9iPigpIAoJCQlyZWZlcnMgdG8gPGNvZGU+ajwvY29kZT4tLXRoZSA8aT5jdXJyZW50PC9pPiBpdGVyYXRpb24gdmFsdWUgYXQgcG9pbnQgPGk+QjwvaT4uJm5ic3A7IAoJCQlUaGUgc2FtZSBpcyB0cnVlIGZvciA8Yj5CT09TVF9QUF9JVEVSQVRJT05fU1RBUlQ8L2I+KCkgd2hpY2ggcmVmZXJzIHRvIDxjb2RlPnN0YXJ0KDIpPC9jb2RlPiwgCgkJCWV0Yy4uCgkJPC9kaXY+CgkJPGRpdj4KCQkJSWYgc2VwYXJhdGUgZmlsZXMgYXJlIHVzZWQgZm9yIGVhY2ggZGltZW5zaW9uLCB0aGVuIHRoZXJlIGFyZSBubyBtYWpvciAKCQkJcHJvYmxlbXMsIGFuZCB1c2luZyBtdWx0aXBsZSBkaW1lbnNpb25zIGlzIHN0cmFpZ2h0Zm9yd2FyZC4mbmJzcDsgSG93ZXZlciwgaWYgCgkJCW1vcmUgdGhhbiBvbmUgZGltZW5zaW9uIGlzIGxvY2F0ZWQgaW4gdGhlIHNhbWUgZmlsZSwgdGhleSBuZWVkIHRvIGJlIAoJCQlkaXN0aW5ndWlzaGVkIGZyb20gb25lIGFub3RoZXIuJm5ic3A7IFRoZSBmaWxlIGl0ZXJhdGlvbiBtZWNoYW5pc20gcHJvdmlkZXMgdGhlIAoJCQltYWNybyA8Yj5CT09TVF9QUF9JVEVSQVRJT05fREVQVEg8L2I+IGZvciB0aGlzIHB1cnBvc2U6CgkJPC9kaXY+CgkJPGRpdiBjbGFzcz0iY29kZSI+CgkJCTxwcmU+Ci8vIGZpbGUuaAojaWYgIUJPT1NUX1BQX0lTX0lURVJBVElORwoKICAgI2lmbmRlZiBGSUxFX0gKICAgI2RlZmluZSBGSUxFX0gKCiAgICNpbmNsdWRlICZsdDtib29zdC9wcmVwcm9jZXNzb3IvaXRlcmF0aW9uL2l0ZXJhdGUuaHBwJmd0OwoKICAgI2RlZmluZSBCT09TVF9QUF9JVEVSQVRJT05fUEFSQU1TXzEgKDMsICgxLCAyLCAiZmlsZS5oIikpCiAgID8/PWluY2x1ZGUgQk9PU1RfUFBfSVRFUkFURSgpCgogICAjZW5kaWYgLy8gRklMRV9ICgojZWxpZiBCT09TVF9QUF9JVEVSQVRJT05fREVQVEgoKSA9PSAxCgogICAvLyBBCiAgICsgQk9PU1RfUFBfSVRFUkFUSU9OKCkKCiAgICNkZWZpbmUgQk9PU1RfUFBfSVRFUkFUSU9OX1BBUkFNU18yICgzLCAoMSwgMiwgImZpbGUuaCIpKQogICA/Pz1pbmNsdWRlIEJPT1NUX1BQX0lURVJBVEUoKQoKICAgLy8gQwoKI2VsaWYgQk9PU1RfUFBfSVRFUkFUSU9OX0RFUFRIKCkgPT0gMgoKICAgLy8gQgogICAtIEJPT1NUX1BQX0lURVJBVElPTigpCgojZW5kaWYKPC9wcmU+CgkJPC9kaXY+CgkJPGRpdj4KCQkJVGhpcyB3aWxsIHJlc3VsdCB0byB0aGUgZm9sbG93aW5nOgoJCTwvZGl2PgoJCTxkaXY+CgkJCTxwcmU+CisgMQotIDEKLSAyCisgMgotIDEKLSAyCjwvcHJlPgoJCTwvZGl2PgoJCTxkaXY+CgkJCU11bHRpcGxlIGRpbWVuc2lvbnMgcmFpc2UgYW5vdGhlciBxdWVzdGlvbi4mbmJzcDsgSG93IGRvZXMgb25lIGFjY2VzcyB0aGUgc3RhdGUgCgkJCW9mIGRpbWVuc2lvbnMgPGk+b3RoZXI8L2k+IHRoYW4gdGhlIGN1cnJlbnQgZGltZW5zaW9uPyZuYnNwOyBJbiBvdGhlciB3b3JkcywgCgkJCWhvdyBkb2VzIG9uZSBhY2Nlc3MgPGNvZGU+aTwvY29kZT4gYXQgcG9pbnQgPGk+QTwvaT4/Jm5ic3A7IEJlY2F1c2Ugb2YgdGhlIAoJCQlwcmVwcm9jZXNzb3IncyBsYXp5IGV2YWx1YXRpb24sIHRoaXMgPGk+ZG9lc24ndDwvaT4gd29yay4uLi4KCQk8L2Rpdj4KCQk8ZGl2IGNsYXNzPSJjb2RlIj4KCQkJPHByZT4KLy8gLi4uCgojZWxpZiBCT09TVF9QUF9JVEVSQVRJT05fREVQVEgoKSA9PSAxCgogICAjZGVmaW5lIEkgQk9PU1RfUFBfSVRFUkFUSU9OKCkKCiAgICNkZWZpbmUgQk9PU1RfUFBfSVRFUkFUSU9OX1BBUkFNU18yICgzLCAoMSwgMiwgImZpbGUuaCIpKQogICA/Pz1pbmNsdWRlIEJPT1NUX1BQX0lURVJBVEUoKQoKICAgI3VuZGVmIEkKCiNlbGlmIEJPT1NUX1BQX0lURVJBVElPTl9ERVBUSCgpID09IDIKCiAgICNkZWZpbmUgSiBCT09TVF9QUF9JVEVSQVRJT04oKQoKICAgLy8gdXNlIEkgYW5kIEoKCiAgICN1bmRlZiBJCgojZW5kaWYKPC9wcmU+CgkJPC9kaXY+CgkJPGRpdj4KCQkJVGhlIHByb2JsZW0gaGVyZSBpcyB0aGF0IDxjb2RlPkk8L2NvZGU+IHJlZmVycyB0byA8Yj5CT09TVF9QUF9JVEVSQVRJT048L2I+KCksIAoJCQlub3QgdG8gdGhlIDxpPnZhbHVlPC9pPiBvZiA8Yj5CT09TVF9QUF9JVEVSQVRJT048L2I+KCkgYXQgdGhlIHBvaW50IG9mIDxjb2RlPkk8L2NvZGU+J3MgCgkJCWRlZmluaXRpb24uCgkJPC9kaXY+CgkJPGRpdj4KCQkJVGhlIGxpYnJhcnkgcHJvdmlkZXMgbWFjcm9zIHRvIGFjY2VzcyB0aGVzZSB2YWx1ZXMgaW4gdHdvIHdheXMtLWFic29sdXRlbHkgb3IgCgkJCXJlbGF0aXZlbHkuJm5ic3A7IFRoZSBmaXJzdCB2YXJpZXR5IGFjY2Vzc2VzIGEgdmFsdWUgb2YgYSBzcGVjaWZpYyBpdGVyYXRpb24gCgkJCWZyYW1lIChpLmUuIGRpbWVuc2lvbikuJm5ic3A7IFRvIGFjY2VzcyB0aGUgaXRlcmF0aW9uIHZhbHVlIG9mIHRoZSBmaXJzdCAKCQkJZGltZW5zaW9uLS1mcm9tIDxpPmFueTwvaT4gZGltZW5zaW9uLS08Yj5CT09TVF9QUF9GUkFNRV9JVEVSQVRJT048L2I+KDxpPjE8L2k+KSAKCQkJaXMgdXNlZC4mbmJzcDsgVG8gYWNjZXNzIHRoZSBpdGVyYXRpb24gdmFsdWUgb2YgdGhlIHNlY29uZCBkaW1lbnNpb24sIDxiPkJPT1NUX1BQX0ZSQU1FX0lURVJBVElPTjwvYj4oPGk+MjwvaT4pIAoJCQlpcyB1c2VkLCBhbmQgc28gb24uJm5ic3A7CgkJPC9kaXY+CgkJPGRpdj4KCQkJVGhlcmUgYXJlIGFsc28gZnJhbWUgdmVyc2lvbnMgdG8gYWNjZXNzIHRoZSBsb3dlciBib3VuZCwgdGhlIHVwcGVyIGJvdW5kLCBhbmQgCgkJCXRoZSBmbGFncyBvZiBhIGRpbWVuc2lvbjombmJzcDsgPGI+Qk9PU1RfUFBfRlJBTUVfU1RBUlQ8L2I+LCA8Yj5CT09TVF9QUF9GUkFNRV9GSU5JU0g8L2I+LCAKCQkJYW5kIDxiPkJPT1NUX1BQX0ZSQU1FX0ZMQUdTPC9iPi4KCQk8L2Rpdj4KCQk8ZGl2PgoJCQlTbywgdG8gZml4IHRoZSBsYXN0IGV4YW1wbGUsIHdlIG1vZGlmeSB0aGUgZGVmaW5pdGlvbiBvZiA8Y29kZT5JPC9jb2RlPi4uLi4KCQk8L2Rpdj4KCQk8ZGl2IGNsYXNzPSJjb2RlIj4KCQkJPHByZT4KLy8gLi4uCgojZWxpZiBCT09TVF9QUF9JVEVSQVRJT05fREVQVEgoKSA9PSAxCgogICAjZGVmaW5lIEkgQk9PU1RfUFBfRlJBTUVfSVRFUkFUSU9OKDEpCgovLyAuLi4KPC9wcmU+CgkJPC9kaXY+CgkJPGRpdj4KCQkJVGhlIGxpYnJhcnkgYWxzbyBwcm92aWRlcyBtYWNyb3MgdG8gYWNjZXNzIHZhbHVlcyBpbiBkaW1lbnNpb25zIDxpPnJlbGF0aXZlPC9pPiAKCQkJdG8gdGhlIGN1cnJlbnQgZGltZW5zaW9uIChlLmcuIHRoZSA8aT5wcmV2aW91czwvaT4gZGltZW5zaW9uKS4mbmJzcDsgVGhlc2UgCgkJCW1hY3JvcyB0YWtlIGFuIGFyZ3VtZW50IHRoYXQgaXMgaW50ZXJwcmV0ZWQgYXMgYW4gb2Zmc2V0IGZyb20gdGhlIGN1cnJlbnQgCgkJCWZyYW1lLiZuYnNwOyBGb3IgZXhhbXBsZSwgPGI+Qk9PU1RfUFBfUkVMQVRJVkVfSVRFUkFUSU9OPC9iPig8aT4xPC9pPikgYWx3YXlzIAoJCQlyZWZlcnMgdG8gdGhlIG91dGVyIGRpbWVuc2lvbiBpbW1lZGlhdGVseSBwcmV2aW91cyB0byB0aGUgY3VycmVudCAKCQkJZGltZW5zaW9uLiZuYnNwOyBBbiBhcmd1bWVudCBvZiA8aT4wPC9pPiBpcyBpbnRlcnByZXRlZCBhcyBhbiBvZmZzZXQgb2YgPGk+MDwvaT4KCQkJd2hpY2ggY2F1c2VzIDxiPkJPT1NUX1BQX1JFTEFUSVZFX0lURVJBVElPTjwvYj4oPGk+MDwvaT4pIHRvIGJlIGVxdWl2YWxlbnQgdG8gPGI+Qk9PU1RfUFBfSVRFUkFUSU9OPC9iPigpLiZuYnNwOwoJCQk8Yj5CT09TVF9QUF9SRUxBVElWRV9JVEVSQVRJT048L2I+KDxpPjI8L2k+KSByZWZlcnMgdG8gdGhlIGl0ZXJhdGlvbiB2YWx1ZSBvZiAKCQkJdGhlIGRpbWVuc2lvbiBpbW1lZGlhdGVseSBwcmVjZWRpbmcgdGhlIGRpbWVuc2lvbiB0aGF0IHByZWNlZGVzIHRoZSBjdXJyZW50IAoJCQlkaW1lbnNpb24uJm5ic3A7CgkJPC9kaXY+CgkJPGRpdj4KCQkJVGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZHMgb2YgYSBkaW1lbnNpb24gY2FuIGJlIGFjY2Vzc2VkIGluIHRoaXMgZmFzaGlvbiBhcyAKCQkJd2VsbCB3aXRoIDxiPkJPT1NUX1BQX1JFTEFUSVZFX1NUQVJUPC9iPiBhbmQgPGI+Qk9PU1RfUFBfUkVMQVRJVkVfRklOSVNIPC9iPi4mbmJzcDsgCgkJCVRoZSBmbGFncyBvZiBhIHJlbGF0aXZlIGRpbWVuc2lvbiBjYW4gYmUgYWNjZXNzZWQgd2l0aCA8Yj5CT09TVF9QUF9SRUxBVElWRV9GTEFHUzwvYj4uCgkJPC9kaXY+CgkJPGg0PgoJCQlSZWxhdGl2aXR5CgkJPC9oND4KCQk8ZGl2PgoJCQlJIG1lbnRpb25lZCBlYXJsaWVyIHRoYXQgdGhlcmUgaXMgYSByZWFzb24gdGhhdCB0aGVyZSBhcmUgdHdvIHdheXMgdG8gCgkJCXBhcmFtZXRpemUgdGhlIG1lY2hhbmlzbS4mbmJzcDsgVGhlIHJlYXNvbiBpcyBkaW1lbnNpb25hbCBhYnN0cmFjdGlvbi4mbmJzcDsgSW4gCgkJCWNlcnRhaW4gc2l0dWF0aW9ucyB0aGUgZGltZW5zaW9uIGlzIHVua25vd24gYnkgdGhlIGNvZGUgdGhhdCBpcyBiZWluZyAKCQkJaXRlcmF0ZWQtLXBvc3NpYmx5IGJlY2F1c2UgdGhlIGNvZGUgaXMgcmV1c2VkIGF0IG11bHRpcGxlLCBkaWZmZXJlbnQgCgkJCWRpbWVuc2lvbnMuJm5ic3A7IElmIHRoYXQgY29kZSBuZWVkcyB0byBpdGVyYXRlIGFnYWluLCBpdCBoYXMgdG8gZGVmaW5lIHRoZSAKCQkJcmlnaHQgcGFyYW1ldGVycyAoYmFzZWQgb24gdGhlIGRpbWVuc2lvbikgZm9yIHRoZSBtZWNoYW5pc20gdG8gY29uc3VtZS4mbmJzcDsKCQk8L2Rpdj4KCQk8ZGl2PgoJCQlBbGwgb2YgdGhlIG1hY3JvIHN0YXRlIG1haW50YWluZWQgYnkgdGhlIG1lY2hhbmlzbSBjYW4gYmUgcmVmZXJyZWQgdG8gaW4gYW4gCgkJCWluZGlyZWN0IHdheSByZWxhdGl2ZSB0byBhIGRpbWVuc2lvbi4mbmJzcDsgVGhpcyBpcyB0aGUgcHVycG9zZSBvZiB0aGUgPGI+Qk9PU1RfUFBfUkVMQVRJVkVfPC9iPgoJCQlhY2Nlc3NvcnMuJm5ic3A7CgkJPC9kaXY+CgkJPGRpdj4KCQkJTGlrZXdpc2UsIHRoZSB1c2VyLWRlZmluZWQgPGk+bmFtZWQgZXh0ZXJuYWwgYXJndW1lbnRzPC9pPiBjYW4gYmUgZGVmaW5lZCB0aGlzIAoJCQl3YXkgYXMgd2VsbC0tPGk+ZXhjZXB0PC9pPiB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBpdGVyYXRlLiZuYnNwOyBCZWNhdXNlIHRoZSAKCQkJbG93ZXIgYW5kIHVwcGVyIGJvdW5kYXJpZXMgYXJlIDxpPmV2YWx1YXRlZDwvaT4gYnkgdGhlIG1lY2hhbmlzbSwgdGhlIAoJCQlpbXBsZW1lbnRhdGlvbiBubyBsb25nZXIgbmVlZHMgdGhlIG1hY3JvIDxiPkJPT1NUX1BQX0lURVJBVElPTl9MSU1JVFM8L2I+LCBhbmQgCgkJCXRoZSBpZGVudGlmaWVyIGNhbiBiZSByZXVzZWQgZm9yIGVhY2ggZGltZW5zaW9uIG9mIGl0ZXJhdGlvbi4mbmJzcDsKCQk8L2Rpdj4KCQk8ZGl2PgoJCQlVbmZvcnR1bmF0ZWx5LCB0aGUgZmlsZW5hbWUgaXMgYSBkaWZmZXJlbnQgc3RvcnkuJm5ic3A7IFRoZSBsaWJyYXJ5IGhhcyBubyB3YXkgCgkJCXRvIGV2YWx1YXRlIHRoZSBxdW90ZWQgKG9yIGFuZ2xlLWJyYWNrZXRlZCkgdGV4dC4mbmJzcDsgVGhlcmVmb3JlLCBpdCBoYXMgdG8gCgkJCXVzZSBhIGRpZmZlcmVudCBtYWNybyBmb3IgZWFjaCBkaW1lbnNpb24uJm5ic3A7IFRoYXQgaXMgdGhlIHB1cnBvc2Ugb2YgdGhlIDxiPkJPT1NUX1BQX0ZJTEVOQU1FXzxpPng8L2k+PC9iPgoJCQltYWNyb3MuJm5ic3A7IFRoZXkgZXhpc3QgdG8gaXNvbGF0ZSB0aGUgb25seSBub24tYWJzdHJhY3RhYmxlIHBpZWNlIG9mIGRhdGEgCgkJCXJlcXVpcmVkIGJ5IHRoZSBtZWNoYW5pc20uJm5ic3A7CgkJPC9kaXY+CgkJPGRpdj4KCQkJSW4gb3JkZXIgdG8gZGVmaW5lIHRoZSBmaWxlbmFtZSBpbiBhbiBhYnN0cmFjdCBmYXNoaW9uLCB5b3UgbmVlZCB0byBkbyAKCQkJc29tZXRoaW5nIGxpa2UgdGhpczoKCQk8L2Rpdj4KCQk8ZGl2IGNsYXNzPSJjb2RlIj4KCQkJPHByZT4KI2RlZmluZSBVTklRVUVfVE9fRklMRSAic29tZV9maWxlLmgiCgojaWYgQk9PU1RfUFBfSVRFUkFUSU9OX0RFUFRIKCkgPT0gMAogICAjZGVmaW5lIEJPT1NUX1BQX0ZJTEVOQU1FXzEgVU5JUVVFX1RPX0ZJTEUKI2VsaWYgQk9PU1RfUFBfSVRFUkFUSU9OX0RFUFRIKCkgPT0gMQogICAjZGVmaW5lIEJPT1NUX1BQX0ZJTEVOQU1FXzIgVU5JUVVFX1RPX0ZJTEUKI2VsaWYgQk9PU1RfUFBfSVRFUkFUSU9OX0RFUFRIKCkgPT0gMgogICAjZGVmaW5lIEJPT1NUX1BQX0ZJTEVOQU1FXzMgVU5JUVVFX1RPX0ZJTEUKCi8vIC4uLiB1cCB0byBCT09TVF9QUF9MSU1JVF9JVEVSQVRJT05fRElNCgojZW5kaWYKPC9wcmU+CgkJPC9kaXY+CgkJPGRpdj4KCQkJVGhlIGludGVudCBpcyB0byBhdm9pZCBoYXZpbmcgdG8gZG8gdGhpcyBmb3IgYW55dGhpbmcgYnV0IHRoZSBmaWxlbmFtZS4mbmJzcDsgCgkJCUlmIHRoaXMgbmVlZHMgdG8gYmUgZG9uZSBtb3JlIHRoYW4gb25jZSBpbiBhIGZpbGUgKDxiPkJPT1NUX1BQX0ZJTEVOQU1FXzxpPng8L2k+PC9iPgoJCQlpcyB1bmRlZmluZWQgYnkgdGhlIG1lY2hhbmlzbSBhZnRlciBpdCBpcyB1c2VkLiksIGNvbnNpZGVyIHVzaW5nIGEgc2VwYXJhdGUgCgkJCWZpbGUgdG8gbWFrZSB0aGUgcHJvcGVyIGRlZmluaXRpb246CgkJPC9kaXY+CgkJPGRpdiBjbGFzcz0iY29kZSI+CgkJCTxwcmU+CiMgLy8gZGV0YWlsL2RlZmluZV9maWxlX2guaAojIGlmbmRlZiBGSUxFX0gKIyAgIGVycm9yIEZJTEVfSCBpcyBub3QgZGVmaW5lZAojIGVuZGlmCiMKIyBpZiBCT09TVF9QUF9JVEVSQVRJT05fREVQVEgoKSA9PSAwCiMgICBkZWZpbmUgQk9PU1RfUFBfRklMRU5BTUVfMSBGSUxFX0gKIyBlbGlmIEJPT1NUX1BQX0lURVJBVElPTl9ERVBUSCgpID09IDEKIyAgIGRlZmluZSBCT09TVF9QUF9GSUxFTkFNRV8yIEZJTEVfSAojIGVsaWYgQk9PU1RfUFBfSVRFUkFUSU9OX0RFUFRIKCkgPT0gMgojICAgZGVmaW5lIEJPT1NUX1BQX0ZJTEVOQU1FXzMgRklMRV9ICiMgZWxpZiBCT09TVF9QUF9JVEVSQVRJT05fREVQVEgoKSA9PSAzCiMgICBkZWZpbmUgQk9PU1RfUFBfRklMRU5BTUVfNCBGSUxFX0gKIyBlbGlmIEJPT1NUX1BQX0lURVJBVElPTl9ERVBUSCgpID09IDQKIyAgIGRlZmluZSBCT09TVF9QUF9GSUxFTkFNRV81IEZJTEVfSAojIGVsc2UKIyAgIGVycm9yIHVuc3VwcG9ydGVkIGl0ZXJhdGlvbiBkaW1lbnNpb24KIyBlbmRpZgo8L3ByZT4KCQk8L2Rpdj4KCQk8ZGl2PgoJCQlBbmQgdGhlbiB1c2UgaXQgbGlrZSB0aGlzLi4uLgoJCTwvZGl2PgoJCTxkaXYgY2xhc3M9ImNvZGUiPgoJCQk8cHJlPgovLyBmaWxlLmgKI2lmICFCT09TVF9QUF9JU19JVEVSQVRJTkcKCiAgICNpZm5kZWYgRklMRV9ICiAgICNkZWZpbmUgRklMRV9IICJmaWxlLmgiCgogICAjZGVmaW5lIEJPT1NUX1BQX0lURVJBVElPTl9MSU1JVFMgKDEsIDEwKQogICAjaW5jbHVkZSAiZGV0YWlsL2RlZmluZV9maWxlX2guaCIKCiAgID8/PWluY2x1ZGUgQk9PU1RfUFBfSVRFUkFURSgpCgojZW5kaWYgLy8gRklMRV9ICgojZWxzZQogICAvLyBpdGVyYXRlZCBwb3J0aW9uCiNlbmRpZgo8L3ByZT4KCQk8L2Rpdj4KCQk8ZGl2PgoJCQlXaXRoIGEgbGl0dGxlIGVmZm9ydCBsaWtlIHRoaXMsIGl0IGlzIHBvc3NpYmxlIHRvIG1haW50YWluIHRoZSBhYnN0cmFjdGlvbiAKCQkJd2l0aG91dCB0aGUgY29kZSBibG9hdCB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSByZXF1aXJlZC4mbmJzcDsgVW5mb3J0dW5hdGVseSwgCgkJCXRoaXMgaXMgbm90IGEgY29tcGxldGVseSBnZW5lcmFsIHNvbHV0aW9uIGFzIGl0IHdvdWxkIG5lZWQgdG8gYmUgZG9uZSBmb3IgZWFjaCAKCQkJdW5pcXVlIGZpbGVuYW1lLCBidXQgaXQgaXMgYmV0dGVyIHRoYW4gbm90aGluZy4KCQk8L2Rpdj4KCQk8aDQ+CgkJCUNvbmNsdXNpb24KCQk8L2g0PgoJCTxkaXY+CgkJCVRoYXQgYWJvdXQgY292ZXJzIHRoZSBmYWNpbGl0aWVzIHRoYXQgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBtZWNoYW5pc20uJm5ic3A7IAoJCQlVc2luZyB0aGVzZSBmYWNpbGl0aWVzLCBsZXQncyBpbXBsZW1lbnQgYSA8Y29kZT5mdW5jdGlvbl90cmFpdHM8L2NvZGU+IHRlbXBsYXRlIAoJCQl0byBkZW1vbnN0cmF0ZSBhIGZ1bGwtZmxlZGdlIHVzZSBvZiB0aGUgbWVjaGFuaXNtLgoJCTwvZGl2PgoJCTxoND4KCQkJRnVuY3Rpb24gVHJhaXRzIC0gQW4gSW52b2x2ZWQgRXhhbXBsZQoJCTwvaDQ+CgkJPGRpdj4KCQkJSW1wbGVtZW50aW5nIGEgY29tcHJlaGVuc2l2ZSA8Y29kZT5mdW5jdGlvbl90cmFpdHM8L2NvZGU+IHRlbXBsYXRlIG1ldGFmdW5jdGlvbiAKCQkJcmVxdWlyZXMgdGhlIHVzZSBvZiBldmVyeSBtYWpvciBwYXJ0IG9mIHRoZSBmaWxlIGl0ZXJhdGlvbiBtZWNoYW5pc20uJm5ic3A7CgkJPC9kaXY+CgkJPGRpdj4KCQkJKFRoaXMgZXhhbXBsZSBtYWtlcyBubyBhdHRlbXB0IG9mIHdvcmsgYXJvdW5kIGNvbXBpbGVyIGRlZmljaWVuY2llcyBhbmQgZXhpc3RzIAoJCQlvbmx5IHRvIGlsbHVzdHJhdGUgdGhlIG1lY2hhbmlzbS4pCgkJPC9kaXY+CgkJPGRpdj4KCQkJVGhlIHJlc3VsdCBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOgoJCTwvZGl2PgoJCTx1bD4KCQkJPGxpPgoJCQkJcmV0dXJuIHR5cGU8L2xpPgoJCQk8bGk+CgkJCQludW1iZXIgYW5kIHR5cGVzIG9mIHBhcmFtZXRlcnM8L2xpPgoJCQk8bGk+CgkJCQl3aGV0aGVyIG9yIG5vdCB0aGUgdHlwZSBpcyBhIHBvaW50ZXItdG8tZnVuY3Rpb24sIHJlZmVyZW5jZS10by1mdW5jdGlvbiwgCgkJCQlwb2ludGVyLXRvLW1lbWJlci1mdW5jdGlvbiwgb3IgYSBwbGFpbiBmdW5jdGlvbiB0eXBlPC9saT4KCQkJPGxpPgoJCQkJd2hldGhlciB0aGUgdHlwZSBoYXMgYW4gZWxsaXBzaXM8L2xpPgoJCQk8bGk+CgkJCQlpZiBub3QgYSBwb2ludGVyLXRvLW1lbWJlci1mdW5jdGlvbiwgdGhlIGVxdWl2YWxlbnQgcG9pbnRlci10by1mdW5jdGlvbiwgCgkJCQlyZWZlcmVuY2UtdG8tZnVuY3Rpb24sIGFuZCBmdW5jdGlvbiB0eXBlPC9saT4KCQkJPGxpPgoJCQkJb3RoZXJ3aXNlLCB0aGUgcG9pbnRlci10by1tZW1iZXIgdHlwZSwgdGhlIGNsYXNzIHR5cGUgdG8gd2hpY2ggaXQgcmVmZXJzLCBhbmQgCgkJCQl3aGV0aGVyIGl0IGlzIGNvbnN0IGFuZC9vciB2b2xhdGlsZSBxdWFsaWZpZWQ8L2xpPgoJCTwvdWw+CgkJPGRpdj4KCQkJVGhlcmUgYXJlIGEgbXlyaWFkIG9mIHdheXMgdGhhdCB0aGlzIGNhbiBiZSBpbXBsZW1lbnRlZC4mbmJzcDsgSSdsbCBnaXZlIGEgCgkJCWJyaWVmIHN1bW1hcnkgaGVyZSBvZiB3aGF0IGlzIGhhcHBlbmluZyBpbiB0aGUgaW1wbGVtZW50YXRpb24gYmVsb3cuJm5ic3A7CgkJPC9kaXY+CgkJPGRpdj4KCQkJVGhlIGltcGxlbWVudGF0aW9uIGluaGVyZW50bHkgaGFzIHRvIGRlYWwgd2l0aCBmdW5jdGlvbiBhcml0eS4mbmJzcDsgVGhlcmVmb3JlLCAKCQkJYXQgbWluaW11bSwgd2UgbmVlZCB0byBpdGVyYXRlIG92ZXIgZnVuY3Rpb24gYXJpdGllcyBhbmQgZGVmaW5lIHBhcnRpYWwgCgkJCXNwZWNpYWxpemF0aW9ucyBvZiB0aGUgcHJpbWFyeSB0ZW1wbGF0ZSA8Y29kZT5mdW5jdGlvbl90cmFpdHM8L2NvZGU+LiZuYnNwOyBUaGUgCgkJCXNpdHVhdGlvbiBpcyBmdXJ0aGVyIGNvbXBsaWNhdGVkIGJ5IHZhcmlhZGljIGZ1bmN0aW9ucyAoaS5lLiBmdW5jdGlvbnMgd2l0aCBhbiAKCQkJZWxsaXBzaXMpLiZuYnNwOyBUaGVyZWZvcmUsIGZvciBldmVyeSBhcml0eSwgd2UgbmVlZCBhIHZhcmlhZGljIHZlcnNpb24gYXMgCgkJCXdlbGwuCgkJPC9kaXY+CgkJPGRpdj4KCQkJV2UgYWxzbyBuZWVkIHRvIGhhbmRsZSBwb2ludGVycy10by1tZW1iZXItZnVuY3Rpb25zLiZuYnNwOyBUaGlzIGltcGxpZXMgdGhhdCB3ZSAKCQkJaGF2ZSB0byBoYW5kbGUgbm90IGp1c3QgYXJpdHkgYW5kIHZhcmlhZGljcywgYnV0IGFsc28gY3YtcXVhbGlmaWNhdGlvbnMuJm5ic3A7CgkJPC9kaXY+CgkJPGRpdj4KCQkJRm9yIHRoZSBzYWtlIG9mIGNsYXJpdHksIHRoZSBpbXBsZW1lbnRhdGlvbiBiZWxvdyBoYW5kbGVzIGZ1bmN0aW9uIHR5cGVzIGFuZCAKCQkJcG9pbnRlcnMtdG8tbWVtYmVyLWZ1bmN0aW9ucyBzZXBhcmF0ZWx5LiZuYnNwOyBUaGV5IGNvdWxkIGJlIG1lcmdlZCwgYnV0IHRoZSAKCQkJcmVzdWx0IHdvdWxkIGJlIHNpZ25pZmljYW50bHkgbWVzc2llci4KCQk8L2Rpdj4KCQk8ZGl2PgoJCQlUbyBoYW5kbGUgZnVuY3Rpb24gdHlwZXMsIHRoZSBpbXBsZW1lbnRhdGlvbiBiZWxvdyBpdGVyYXRlcyBvdmVyIGZ1bmN0aW9uIAoJCQlhcml0aWVzLiZuYnNwOyBGb3IgZWFjaCBhcml0eSwgaXQgaXRlcmF0ZXMgb3ZlciBlYWNoIHBhcmFtZXRlciB0byBwcm92aWRlIAoJCQlhY2Nlc3MgdG8gZWFjaCBpbmRpdmlkdWFsbHkuJm5ic3A7IEl0IHRoZW4gcmUtaW5jbHVkZXMgaXRzZWxmIHRvIGRlZmluZSBhIAoJCQl2YXJpYWRpYyBzcGVjaWFsaXphdGlvbiBvZiB0aGUgc2FtZSBhcml0eS4mbmJzcDsgSXQgcGVyZm9ybXMgdGhlIHJvdWdoIAoJCQllcXVpdmFsZW50IG9mIHRoZSBmb2xsb3dpbmcgcHNldWRvLWNvZGU6CgkJPC9kaXY+CgkJPGRpdiBjbGFzcz0iY29kZSI+CgkJCTxwcmU+CnZvaWQgbWFrZV9zcGVjKGludCBpLCBib29sIHZhcmlhZGljKSB7CiAgIDpvcGVuIGZ1bmN0aW9uX3RyYWl0cyZsdDtpLCB2YXJpYWRpYyZndDsKICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyArK2opIHsKICAgICAgICAgOnBhcmFtZXRlciZsdDtqJmd0OwogICAgICB9CiAgIDpjbG9zZQogICBpZiAoIXZhcmlhZGljKSB7CiAgICAgIG1ha2Vfc3BlYyhpLCB0cnVlKTsKICAgfQogICByZXR1cm47Cn0KCnZvaWQgZnVuY3Rpb25fdHlwZXMoaW50IG1heF9hcml0eSkgewogICBmb3IgKGludCBpID0gMDsgaSA8PSBtYXhfYXJpdHk7ICsraSkgewogICAgICBtYWtlX3NwZWMoaSwgZmFsc2UpOwogICB9CiAgIHJldHVybjsKfQo8L3ByZT4KCQk8L2Rpdj4KCQk8ZGl2PgoJCQlUaGUgaW1wbGVtZW50YXRpb24gb2YgcG9pbnRlcnMtdG8tbWVtYmVyLWZ1bmN0aW9ucyBpcyBhIGJpdCBkaWZmZXJlbnQuJm5ic3A7IAoJCQlGaXJzdCwgaXQgaXRlcmF0ZXMgb3ZlciBjdi1xdWFsaWZpZXJzLiZuYnNwOyBGb3IgZWFjaCBjdi1xdWFsaWZpZXIsIGl0IGl0ZXJhdGVzIAoJCQlvdmVyIGZ1bmN0aW9uIGFyaXRpZXMuJm5ic3A7IEZvciBlYWNoIGZ1bmN0aW9uIGFyaXR5LCBpdCBpdGVyYXRlcyBhZ2FpbiBvdmVyIAoJCQllYWNoIHBhcmFtZXRlci4mbmJzcDsgSXQgdGhlbiByZS1pbmNsdWRlcyBpdHNlbGYgdG8gZGVmaW5lIGEgdmFyaWFkaWMgCgkJCXNwZWNpYWxpemF0aW9uIG9mIHRoZSBzYW1lIGFyaXR5Li4uLgoJCTwvZGl2PgoJCTxkaXYgY2xhc3M9ImNvZGUiPgoJCQk8cHJlPgp2b2lkIG1ha2Vfc3BlYyhpbnQgaiwgY29uc3QgY2hhciogY3YsIGJvb2wgdmFyaWFkaWMpIHsKICAgOm9wZW4gZnVuY3Rpb25fdHJhaXRzJmx0O2osIGN2LCB2YXJpYWRpYyZndDsKICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBqOyArK2spIHsKICAgICAgICAgcGFyYW1ldGVyJmx0O2smZ3Q7CiAgICAgIH0KICAgOmNsb3NlCiAgIGlmICghdmFyaWFkaWMpIHsKICAgICAgbWFrZV9zcGVjKGosIGN2LCB0cnVlKTsKICAgfQogICByZXR1cm47Cn0KCnZvaWQgZ2VuX2FyaXRpZXMoY29uc3QgY2hhciogY3YsIGludCBtYXhfYXJpdHkpIHsKICAgZm9yIChpbnQgaiA9IDA7IGogPD0gbWF4X2FyaXR5OyArK2opIHsKICAgICAgbWFrZV9zcGVjKGosIGN2LCBmYWxzZSk7CiAgIH0KICAgcmV0dXJuOwp9Cgp2b2lkIHBvaW50ZXJzX3RvX21lbWJlcnMoaW50IG1heF9hcml0eSkgewogICBzdGF0aWMgY29uc3QgY2hhciogY3ZfcXVhbGlmaWVyc1tdID0geyAiIiwgImNvbnN0IiwgInZvbGF0aWxlIiwgImNvbnN0IHZvbGF0aWxlIiB9OwogICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgewogICAgICBnZW5fYXJpdGllcyhjdl9xdWFsaWZpZXJzW2ldLCBtYXhfYXJpdHkpOwogICB9CiAgIHJldHVybjsKfQo8L3ByZT4KCQk8L2Rpdj4KCQk8ZGl2PgoJCQlIZXJlIGlzIHRoZSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbi4mbmJzcDsgVGhpcyBleGFtcGxlIHJlcHJlc2VudHMgdGhlIHBvd2VyIG9mIAoJCQl0aGUgZmlsZSBpdGVyYXRpb24gbWVjaGFuaXNtIGFzIHdlbGwgYXMgdGhlIGxpYnJhcnkgaW4gZ2VuZXJhbCwgc28gZm9sbG93IGl0IAoJCQljYXJlZnVsbHkgaWYgeW91IHdpc2ggdG8gZnVsbHkgdW5kZXJzdGFuZCB3aGF0IHRoZSBtZWNoYW5pc20gZG9lcy4uLi4KCQk8L2Rpdj4KCQk8ZGl2IGNsYXNzPSJjb2RlIj4KCQkJPHByZT4KLy8gZnVuY3Rpb25fdHJhaXRzLmhwcAoKI2lmICFCT09TVF9QUF9JU19JVEVSQVRJTkcKCiNpZm5kZWYgRlVOQ1RJT05fVFJBSVRTX0hQUAojZGVmaW5lIEZVTkNUSU9OX1RSQUlUU19IUFAKCiNpbmNsdWRlICZsdDtib29zdC9wcmVwcm9jZXNzb3IvY2F0LmhwcCZndDsKI2luY2x1ZGUgJmx0O2Jvb3N0L3ByZXByb2Nlc3Nvci9mYWNpbGl0aWVzL2FwcGx5LmhwcCZndDsKI2luY2x1ZGUgJmx0O2Jvb3N0L3ByZXByb2Nlc3Nvci9pdGVyYXRpb24vaXRlcmF0ZS5ocHAmZ3Q7CiNpbmNsdWRlICZsdDtib29zdC9wcmVwcm9jZXNzb3IvaXRlcmF0aW9uL3NlbGYuaHBwJmd0OwojaW5jbHVkZSAmbHQ7Ym9vc3QvcHJlcHJvY2Vzc29yL3JlcGV0aXRpb24vZW51bV9wYXJhbXMuaHBwJmd0OwojaW5jbHVkZSAmbHQ7Ym9vc3QvcHJlcHJvY2Vzc29yL3JlcGV0aXRpb24vZW51bV90cmFpbGluZ19wYXJhbXMuaHBwJmd0OwojaW5jbHVkZSAmbHQ7Ym9vc3QvcHJlcHJvY2Vzc29yL3R1cGxlL2VsZW0uaHBwJmd0OwoKLy8gZW5hYmxlIHVzZXItZXhwYW5zaW9uCiNpZm5kZWYgRlVOQ1RJT05fVFJBSVRTX01BWF9BUklUWQogICAjZGVmaW5lIEZVTkNUSU9OX1RSQUlUU19NQVhfQVJJVFkgMTUKI2VuZGlmCgpuYW1lc3BhY2UgZGV0YWlsIHsKCi8vIGF2b2lkIHJlcGxpY2F0aW9uIG9mICJkZWZhdWx0IiB2YWx1ZXMKc3RydWN0IGZ1bmN0aW9uX3RyYWl0c19iYXNlIHsKICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfcGxhaW4gPSBmYWxzZTsKICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfcG9pbnRlciA9IGZhbHNlOwogICBzdGF0aWMgY29uc3QgYm9vbCBpc19yZWZlcmVuY2UgPSBmYWxzZTsKICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfbWVtYmVyID0gZmFsc2U7Cn07Cgp9IC8vIGRldGFpbAoKLy8gbm8gZGVmaW5pdGlvbgp0ZW1wbGF0ZSZsdDtjbGFzcyZndDsgc3RydWN0IGZ1bmN0aW9uX3RyYWl0czsKCi8vIGV4dHJhY3QgZWxsaXBzaXMgc3RhdGUKI2RlZmluZSBFTExJUFNJUyhuKSBcCiAgIEJPT1NUX1BQX0FQUExZKCBcCiAgICAgIEJPT1NUX1BQX1RVUExFX0VMRU0oMiwgbiwgRUxMSVBTSVNfSSkgXAogICApIFwKICAgLyoqLwoKLy8gaXRlcmF0ZSBvdmVyIGZ1bmN0aW9uIGFyaXRpZXMgZm9yIGZ1bmN0aW9uIHR5cGVzCiNkZWZpbmUgQk9PU1RfUFBfSVRFUkFUSU9OX1BBUkFNU18xIFwKICAgKDQsICgwLCBGVU5DVElPTl9UUkFJVFNfTUFYX0FSSVRZLCAiZnVuY3Rpb25fdHJhaXRzLmhwcCIsIDApKSBcCiAgIC8qKi8KPz89aW5jbHVkZSBCT09TVF9QUF9JVEVSQVRFKCkKCi8vIG9idGFpbiBhIGN2LXF1YWxpZmllciBieSBpbmRleAojZGVmaW5lIFFVQUxJRklFUihuKSBcCiAgIEJPT1NUX1BQX0FQUExZKCBcCiAgICAgIEJPT1NUX1BQX1RVUExFX0VMRU0oIFwKICAgICAgICAgNCwgbiwgXAogICAgICAgICAoQk9PU1RfUFBfTklMLCAoY29uc3QpLCAodm9sYXRpbGUpLCAoY29uc3Qgdm9sYXRpbGUpKSBcCiAgICAgICkgXAogICApIFwKICAgLyoqLwoKLy8gaXRlcmF0ZSBvdmVyIGN2LXF1YWxpZmllcnMgZm9yIHBvaW50ZXJzLXRvLW1lbWJlcnMKI2RlZmluZSBCT09TVF9QUF9JVEVSQVRJT05fUEFSQU1TXzEgXAogICAoNCwgKDAsIDMsICJmdW5jdGlvbl90cmFpdHMuaHBwIiwgMSkpIFwKICAgLyoqLwo/Pz1pbmNsdWRlIEJPT1NUX1BQX0lURVJBVEUoKQoKLy8gcmVtb3ZlIHRlbXBvcmFyeSBtYWNyb3MKI3VuZGVmIFFVQUxJRklFUgojdW5kZWYgRUxMSVBTSVMKCi8vIG92ZXJyaWRpbmcganVtcGVyIGZvciBwb2ludGVycy10by1mdW5jdGlvbnMKdGVtcGxhdGUmbHQ7Y2xhc3MgVCZndDsgc3RydWN0IGZ1bmN0aW9uX3RyYWl0cyZsdDtUKiZndDsgOiBmdW5jdGlvbl90cmFpdHMmbHQ7VCZndDsgewogICBzdGF0aWMgY29uc3QgYm9vbCBpc19wbGFpbiA9IGZhbHNlOwogICBzdGF0aWMgY29uc3QgYm9vbCBpc19wb2ludGVyID0gdHJ1ZTsKfTsKCi8vIG92ZXJyaWRpbmcganVtcGVyIGZvciByZWZlcmVuY2VzLXRvLWZ1bmN0aW9ucwp0ZW1wbGF0ZSZsdDtjbGFzcyBUJmd0OyBzdHJ1Y3QgZnVuY3Rpb25fdHJhaXRzJmx0O1QmYW1wOyZndDsgOiBmdW5jdGlvbl90cmFpdHMmbHQ7VCZndDsgewogICBzdGF0aWMgY29uc3QgYm9vbCBpc19wbGFpbiA9IGZhbHNlOwogICBzdGF0aWMgY29uc3QgYm9vbCBpc19yZWZlcmVuY2UgPSB0cnVlOwp9OwoKLy8gZW9mCiNlbmRpZiAvLyBGVU5DVElPTl9UUkFJVFNfSFBQCgovLyBzcGVjaWFsaXphdGlvbnMgZm9yIGZ1bmN0aW9uIHR5cGVzCiNlbGlmIEJPT1NUX1BQX0lURVJBVElPTl9ERVBUSCgpID09IDEgXAogICAmYW1wOyZhbXA7IEJPT1NUX1BQX0lURVJBVElPTl9GTEFHUygpID09IDAgXAogICAvKiovCgogICAvLyBkZWZpbmUgZWxsaXBzaXMgc3RhdGUKICAgI2lmIEJPT1NUX1BQX0lTX1NFTEZJU0gKICAgICAgI2RlZmluZSBFTExJUFNJU19JICgodHJ1ZSksICguLi4pKQogICAjZWxzZQogICAgICAjZGVmaW5lIEVMTElQU0lTX0kgKChmYWxzZSksIEJPT1NUX1BQX05JTCkKICAgI2VuZGlmCgogICAjZGVmaW5lIE4gQk9PU1RfUFBfSVRFUkFUSU9OKCkKCiAgIHRlbXBsYXRlJmx0O2NsYXNzIFIgQk9PU1RfUFBfRU5VTV9UUkFJTElOR19QQVJBTVMoTiwgY2xhc3MgVCkmZ3Q7CiAgIHN0cnVjdCBmdW5jdGlvbl90cmFpdHMmbHQ7UiAoQk9PU1RfUFBfRU5VTV9QQVJBTVMoTiwgVCkgRUxMSVBTSVMoMSkpJmd0OwogICAgICA6IGRldGFpbDo6ZnVuY3Rpb25fdHJhaXRzX2Jhc2UgewogICAgICBzdGF0aWMgY29uc3QgYm9vbCBpc19wbGFpbiA9IHRydWU7CiAgICAgIHR5cGVkZWYgUiBmdW5jdGlvbl90eXBlKEJPT1NUX1BQX0VOVU1fUEFSQU1TKE4sIFQpIEVMTElQU0lTKDEpKTsKICAgICAgdHlwZWRlZiBmdW5jdGlvbl90eXBlKiBwb2ludGVyX3R5cGU7CiAgICAgIHR5cGVkZWYgZnVuY3Rpb25fdHlwZSZhbXA7IHJlZmVyZW5jZV90eXBlOwogICAgICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfZWxsaXBzaXMgPSBFTExJUFNJUygwKTsKICAgICAgdHlwZWRlZiBSIHJldHVybl90eXBlOwogICAgICBzdGF0aWMgY29uc3QgaW50IHBhcmFtZXRlcl9jb3VudCA9IE47CiAgICAgIHRlbXBsYXRlJmx0O2ludCwgY2xhc3MgRCA9IGludCZndDsgc3RydWN0IHBhcmFtZXRlcjsKICAgICAgI2lmIE4KICAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIHBhcmFtZXRlcnMKICAgICAgICAgI2RlZmluZSBCT09TVF9QUF9JVEVSQVRJT05fUEFSQU1TXzIgXAogICAgICAgICAgICAoMywgKDAsIE4gLSAxLCAiZnVuY3Rpb25fdHJhaXRzLmhwcCIpKSBcCiAgICAgICAgICAgIC8qKi8KICAgICAgICAgPz89aW5jbHVkZSBCT09TVF9QUF9JVEVSQVRFKCkKICAgICAgI2VuZGlmCiAgIH07CgogICAjdW5kZWYgTgogICAjdW5kZWYgRUxMSVBTSVNfSQoKICAgLy8gcmUtaW5jbHVkZSB0aGlzIHNlY3Rpb24gZm9yIGFuIGVsbGlwc2lzIHZhcmlhbnQKICAgI2lmICFCT09TVF9QUF9JU19TRUxGSVNICiAgICAgICNkZWZpbmUgQk9PU1RfUFBfSU5ESVJFQ1RfU0VMRiAiZnVuY3Rpb25fdHJhaXRzLmhwcCIKICAgICAgPz89aW5jbHVkZSBCT09TVF9QUF9JTkNMVURFX1NFTEYoKQogICAjZW5kaWYKCi8vIGl0ZXJhdGlvbiBvdmVyIGN2LXF1YWxpZmllcnMKI2VsaWYgQk9PU1RfUFBfSVRFUkFUSU9OX0RFUFRIKCkgPT0gMSBcCiAgICZhbXA7JmFtcDsgQk9PU1RfUFBfSVRFUkFUSU9OX0ZMQUdTKCkgPT0gMSBcCiAgIC8qKi8KCiAgICNkZWZpbmUgQk9PU1RfUFBfSVRFUkFUSU9OX1BBUkFNU18yIFwKICAgICAgKDMsICgwLCBGVU5DVElPTl9UUkFJVFNfTUFYX0FSSVRZLCAiZnVuY3Rpb25fdHJhaXRzLmhwcCIpKSBcCiAgICAgIC8qKi8KICAgPz89aW5jbHVkZSBCT09TVF9QUF9JVEVSQVRFKCkKCi8vIGdlbmVyYXRlIHNwZWNpYWxpemF0aW9ucyBmb3IgcG9pbnRlcnMtdG8tbWVtYmVycwojZWxpZiBCT09TVF9QUF9JVEVSQVRJT05fREVQVEgoKSA9PSAyIFwKICAgJmFtcDsmYW1wOyBCT09TVF9QUF9GUkFNRV9GTEFHUygxKSA9PSAxIFwKCiAgIC8vIGRlZmluZSBlbGxpcHNpcyBzdGF0ZQogICAjaWYgQk9PU1RfUFBfSVNfU0VMRklTSAogICAgICAjZGVmaW5lIEVMTElQU0lTX0kgKCh0cnVlKSwgKC4uLikpCiAgICNlbHNlCiAgICAgICNkZWZpbmUgRUxMSVBTSVNfSSAoKGZhbHNlKSwgQk9PU1RfUFBfTklMKQogICAjZW5kaWYKCiAgICNkZWZpbmUgTiBCT09TVF9QUF9JVEVSQVRJT04oKQogICAjZGVmaW5lIFEgUVVBTElGSUVSKEJPT1NUX1BQX0ZSQU1FX0lURVJBVElPTigxKSkKCiAgIHRlbXBsYXRlJmx0O2NsYXNzIFIsIGNsYXNzIE8gQk9PU1RfUFBfRU5VTV9UUkFJTElOR19QQVJBTVMoTiwgY2xhc3MgVCkmZ3Q7CiAgIHN0cnVjdCBmdW5jdGlvbl90cmFpdHMmbHQ7UiAoTzo6KikoQk9PU1RfUFBfRU5VTV9QQVJBTVMoTiwgVCkgRUxMSVBTSVMoMSkpIFEmZ3Q7CiAgICAgIDogZGV0YWlsOjpmdW5jdGlvbl90cmFpdHNfYmFzZSB7CiAgICAgIHN0YXRpYyBjb25zdCBib29sIGlzX21lbWJlciA9IHRydWU7CiAgICAgIHR5cGVkZWYgUiAoTzo6KiBwb2ludGVyX3RvX21lbWJlcl90eXBlKShCT09TVF9QUF9FTlVNX1BBUkFNUyhOLCBUKSBFTExJUFNJUygxKSkgUTsKICAgICAgdHlwZWRlZiBPIGNsYXNzX3R5cGU7CiAgICAgIHR5cGVkZWYgUSBPIHF1YWxpZmllZF9jbGFzc190eXBlOwogICAgICBzdGF0aWMgY29uc3QgYm9vbCBoYXNfZWxsaXBzaXMgPSBFTExJUFNJUygwKTsKICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfY29uc3QgPQogICAgICAgICBCT09TVF9QUF9GUkFNRV9JVEVSQVRJT04oMSkgPT0gMSB8fCBCT09TVF9QUF9GUkFNRV9JVEVSQVRJT04oMSkgPT0gMzsKICAgICAgc3RhdGljIGNvbnN0IGJvb2wgaXNfdm9sYXRpbGUgPQogICAgICAgICBCT09TVF9QUF9GUkFNRV9JVEVSQVRJT04oMSkgPT0gMiB8fCBCT09TVF9QUF9GUkFNRV9JVEVSQVRJT04oMSkgPT0gMzsKICAgICAgdHlwZWRlZiBSIHJldHVybl90eXBlOwogICAgICBzdGF0aWMgY29uc3QgaW50IHBhcmFtZXRlcl9jb3VudCA9IE47CiAgICAgIHRlbXBsYXRlJmx0O2ludCwgY2xhc3MgRCA9IGludCZndDsgc3RydWN0IHBhcmFtZXRlcjsKICAgICAgI2lmIE4KICAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIHBhcmFtZXRlcnMKICAgICAgICAgI2RlZmluZSBCT09TVF9QUF9JVEVSQVRJT05fUEFSQU1TXzMgXAogICAgICAgICAgICAoMywgKDAsIE4gLSAxLCAiZnVuY3Rpb25fdHJhaXRzLmhwcCIpKSBcCiAgICAgICAgICAgIC8qKi8KICAgICAgICAgPz89aW5jbHVkZSBCT09TVF9QUF9JVEVSQVRFKCkKICAgICAgI2VuZGlmCiAgIH07CgogICAjdW5kZWYgUQogICAjdW5kZWYgTgogICAjdW5kZWYgRUxMSVBTSVNfSQoKICAgLy8gcmUtaW5jbHVkZSB0aGlzIHNlY3Rpb24gZm9yIGFuIGVsbGlwc2lzIHZhcmlhbnQKICAgI2lmICFCT09TVF9QUF9JU19TRUxGSVNICiAgICAgICNkZWZpbmUgQk9PU1RfUFBfSU5ESVJFQ1RfU0VMRiAiZnVuY3Rpb25fdHJhaXRzLmhwcCIKICAgICAgPz89aW5jbHVkZSBCT09TVF9QUF9JTkNMVURFX1NFTEYoKQogICAjZW5kaWYKCi8vIHBhcmFtZXRlciBzcGVjaWFsaXphdGlvbnMKI2Vsc2UKCiAgICNkZWZpbmUgWCBCT09TVF9QUF9JVEVSQVRJT04oKQoKICAgICAgdGVtcGxhdGUmbHQ7Y2xhc3MgRCZndDsgc3RydWN0IHBhcmFtZXRlciZsdDtYLCBEJmd0OyB7CiAgICAgICAgIHR5cGVkZWYgQk9PU1RfUFBfQ0FUKFQsIFgpIHR5cGU7CiAgICAgIH07CgogICAjdW5kZWYgWAoKI2VuZGlmCjwvcHJlPgoJCTwvZGl2PgoJCTxkaXY+CgkJCU9uZSBwcm9ibGVtIHRoYXQgc3RpbGwgZXhpc3RzIGlzIHRoZSBsYWNrIG9mIHN1cHBvcnQgZm9yIDxjb2RlPnRocm93PC9jb2RlPiBzcGVjaWZpY2F0aW9ucy4mbmJzcDsgCgkJCVRoZXJlIGlzIG5vIHdheSB0aGF0IHdlIGNhbiBjb21wbGV0ZWx5IGhhbmRsZSBpdCBhbnl3YXkgYmVjYXVzZSB3ZSBjYW5ub3QgCgkJCXBhcnRpYWxseSBzcGVjaWFsaXplIG9uIDxjb2RlPnRocm93PC9jb2RlPiBzcGVjaWZpY2F0aW9ucy4mbmJzcDsgSG93ZXZlciwgd2UgCgkJCWNvdWxkIGFjY3VyYXRlbHkgcmVwb3J0IHRoZSAiYWN0dWFsIiBmdW5jdGlvbiB0eXBlLCBldGMuLCBpbmNsdWRpbmcgdGhlIDxjb2RlPnRocm93PC9jb2RlPgoJCQlzcGVjaWZpY2F0aW9uICh3aGljaCB0aGUgYWJvdmUgaW1wbGVtZW50YXRpb24gZG9lc24ndCBkbywgYXMgaXQgcmVjb25zdHJ1Y3RzIAoJCQl0aG9zZSB0eXBlcykuJm5ic3A7IElmIHlvdSBsaWtlLCB5b3UgY2FuIGZpZ3VyZSBvdXQgaG93IHRvIGRvIHRoYXQgb24geW91ciBvd24gCgkJCWFzIGFuIGV4ZXJjaXNlLiZuYnNwOwoJCTwvZGl2PgoJCTxoND4KCQkJU2VlIEFsc28KCQk8L2g0PgoJCTx1bD4KCQkJPGxpPgoJCQkJPGEgaHJlZj0iLi4vcmVmL2l0ZXJhdGUuaHRtbCI+Qk9PU1RfUFBfSVRFUkFURTwvYT48L2xpPgoJCTwvdWw+CgkJPGRpdiBjbGFzcz0ic2lnIj4KCQkJLSBQYXVsIE1lbnNvbmlkZXMKCQk8L2Rpdj4KCTxociBzaXplPSIxIj4KCTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAwcHg7Ij4KCQk8aT6pIENvcHlyaWdodCA8YSBocmVmPSJodHRwOi8vd3d3LmhvdXNlbWFycXVlLmNvbSIgdGFyZ2V0PSJfdG9wIj5Ib3VzZW1hcnF1ZSBPeTwvYT4gMjAwMjwvaT4KCQk8L2JyPjxpPqkgQ29weXJpZ2h0IFBhdWwgTWVuc29uaWRlcyAyMDAyPC9pPgoJPC9kaXY+Cgk8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMHB4OyI+CgkJPHA+PHNtYWxsPkRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZQoJCWFjY29tcGFueWluZyBmaWxlIDxhIGhyZWY9Ii4uLy4uLy4uLy4uL0xJQ0VOU0VfMV8wLnR4dCI+TElDRU5TRV8xXzAudHh0PC9hPiBvcgoJCWNvcHkgYXQgPGEgaHJlZj0KCQkiaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0Ij53d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dDwvYT4pPC9zbWFsbD48L3A+Cgk8L2Rpdj4KCTwvYm9keT4KPC9odG1sPgo=