ZGlmZiAtLWdpdCBhLy5nZGJpbml0IGIvLmdkYmluaXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYjgzMzYuLjAwMDAwMDAKLS0tIGEvLmdkYmluaXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jIGdkYiBtYWNyb3Mgd2hpY2ggbWF5IGJlIHVzZWZ1bCBmb3IgZm9sa3MgdXNpbmcgZ2RiIHRvIGRlYnVnCi0jIGFwYWNoZS4gIERlbGV0ZSBpdCBpZiBpdCBib3RoZXJzIHlvdS4KLQotZGVmaW5lIGR1bXBfdGFibGUKLSAgICBzZXQgJHQgPSAodGFibGVfZW50cnkgKikoKGFycmF5X2hlYWRlciAqKSRhcmcwKS0+ZWx0cwotICAgIHNldCAkbiA9ICgoYXJyYXlfaGVhZGVyICopJGFyZzApLT5uZWx0cwotICAgIHNldCAkaSA9IDAKLSAgICB3aGlsZSAkaSA8ICRuCi0JcHJpbnRmICJbJXVdICclcyc9JyVzJ1xuIiwgJGksICR0WyRpXS5rZXksICR0WyRpXS52YWwKLQlzZXQgJGkgPSAkaSArIDEKLSAgICBlbmQKLWVuZAotZG9jdW1lbnQgZHVtcF90YWJsZQotICAgIFByaW50IHRoZSBrZXkvdmFsdWUgcGFpcnMgaW4gYSB0YWJsZS4KLWVuZAotCi0KLWRlZmluZSByaAotCXJ1biAtZiAvaG9tZS9kZ2F1ZGV0L2FwMi9jb25mL21wbS5jb25mCi1lbmQKLQotZGVmaW5lIGR1bXBfc3RyaW5nX2FycmF5Ci0gICAgc2V0ICRhID0gKGNoYXIgKiopKChhcnJheV9oZWFkZXIgKikkYXJnMCktPmVsdHMKLSAgICBzZXQgJG4gPSAoaW50KSgoYXJyYXlfaGVhZGVyICopJGFyZzApLT5uZWx0cwotICAgIHNldCAkaSA9IDAKLSAgICB3aGlsZSAkaSA8ICRuCi0JcHJpbnRmICJbJXVdICclcydcbiIsICRpLCAkYVskaV0KLQlzZXQgJGkgPSAkaSArIDEKLSAgICBlbmQKLWVuZAotZG9jdW1lbnQgZHVtcF9zdHJpbmdfYXJyYXkKLSAgICBQcmludCBhbGwgb2YgdGhlIGVsZW1lbnRzIGluIGFuIGFycmF5IG9mIHN0cmluZ3MuCi1lbmQKZGlmZiAtLWdpdCBhL0Fubm91bmNlbWVudCBiL0Fubm91bmNlbWVudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM5OTk2Mi4uMDAwMDAwMAotLS0gYS9Bbm5vdW5jZW1lbnQKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi1BcGFjaGUgMS4zLjYgUmVsZWFzZWQKLT09PT09PT09PT09PT09PT09PT09PQotCi1UaGUgQXBhY2hlIEdyb3VwIGlzIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgdmVyc2lvbgotMS4zLjYgb2YgdGhlIEFwYWNoZSBIVFRQIHNlcnZlci4KLQotVGhpcyBuZXcgQXBhY2hlIHZlcnNpb24gaW5jb3Jwb3JhdGVzIG92ZXIgNjAgc2lnbmlmaWNhbnQgaW1wcm92ZW1lbnRzCi10byB0aGUgc2VydmVyLiAgQXBhcnQgZnJvbSBwb3J0YWJpbGl0eSBhbmQgc2VjdXJpdHkgZml4ZXMsIGRvY3VtZW50YXRpb24KLWVuaGFuY2VtZW50cywgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzLCBhbmQgYXNzb3J0ZWQgb3RoZXIgbWlub3IKLWZlYXR1cmVzIG9yIGZpeGVzIG5vdGFibGUgY2hhbmdlcyBhcmU6Ci0KLSAtIG1vZF9sb2dfY29uZmlnIG5vdyBzdXBwb3J0cyBjb25kaXRpb25hbCBsb2dnaW5nIGJhc2VkIHVwb24KLSAgIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgc3VwcG9ydCBmb3IgbXVsdGlsaW5lIGVudHJpZXMuCi0KLSAtIE5ldyBDdXN0b21Mb2cgZGlyZWN0aXZlICVWOiBUaGlzIGxvZ3MgdGhlIGhvc3RuYW1lIGFjY29yZGluZyB0byB0aGUKLSAgIFVzZUNhbm9uaWNhbE5hbWUgc2V0dGluZyAodGhpcyBpcyB0aGUgcHJlLTEuMy40IGJlaGF2aW91ciBvZiAldikuCi0KLSAtIEVuaGFuY2VkIG1vZF9yZXdyaXRlJ3MgbWFwZmlsZSBoYW5kbGluZzogVGhlIGluLWNvcmUgY2FjaGUgZm9yIHRleHQKLSAgIGFuZCBEQk0gZm9ybWF0IG1hcGZpbGVzIG5vdyB1c2VzIGEgaGFzaCB0YWJsZSB3aXRoIExSVSBmdW5jdGlvbmFsaXR5LgotICAgRnVydGhlcm1vcmUgbWFwIGxvb2t1cHMgZm9yIG5vbi1leGlzdGVudCBrZXlzIGFyZSBub3cgY2FjaGVkIGFzIHdlbGwuCi0gICBUaGUgY2hhbmdlcyBkcmFzdGljYWxseSBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZSB3aGVuIGxhcmdlIHJld3JpdGUKLSAgIG1hcHMgYXJlIGluIHVzZS4KLQotIC0gQWJpbGl0eSB0byBoYW5kbGUgREVTIG9yIE1ENSBhdXRoZW50aWNhdGlvbiBwYXNzd29yZHMuCi0gCi0gLSBOZXcgPExpbWl0RXhjZXB0PiBkaXJlY3RpdmUgdG8gYWxsb3cgdGhlIHVzZXIgdG8gYXNzaWduIGF1dGhlbnRpY2F0aW9uCi0gICBjb250cm9sIHRvIGFueSBIVFRQIG1ldGhvZCB0aGF0IGlzICpub3QqIGdpdmVuIGluIHRoZSBhcmd1bWVudCBsaXN0OwotICAgaS5lLiwgdGhlIGxvZ2ljYWwgbmVnYXRpb24gb2YgdGhlIDxMaW1pdD4gZGlyZWN0aXZlLgotIAotIC0gSW1wcm92ZWQgY29udGVudCBuZWdvdGlhdGlvbi4KLSAKLSAtIE5ldyBTY3JpcHRJbnRlcnByZXRlclNvdXJjZSBkaXJlY3RpdmUgdG8gZW5hYmxlIHNlYXJjaGluZyB0aGUKLSAgIFdpbjMyIHJlZ2lzdHJ5IGZvciBzY3JpcHQgaW50ZXJwcmV0ZXJzLgotIAotIC0gVGhlIEZBUSBkb2N1bWVudCB3YXMgcmVvcmdhbmlzZWQuCi0gCi0gLSBPdmVyaGF1bGVkIEFwYWNoZUJlbmNoIGJlbmNobWFyayBwcm9ncmFtLgotIAotIC0gU2V2ZXJhbCBuZXcgQVBJIGZ1bmN0aW9ucyBoYXZlIGJlZW4gYWRkZWQuCi0KLUEgY29tcGxldGUgbGlzdGluZyB3aXRoIGRldGFpbGVkIGRlc2NyaXB0aW9ucyBpcyBwcm92aWRlZCBpbiB0aGUKLXNyYy9DSEFOR0VTIGZpbGUuCi0KLVdlIGNvbnNpZGVyIEFwYWNoZSAxLjMuNiB0byBiZSB0aGUgYmVzdCB2ZXJzaW9uIG9mIEFwYWNoZSBhdmFpbGFibGUgYW5kCi13ZSBzdHJvbmdseSByZWNvbW1lbmQgdGhhdCB1c2VycyBvZiBvbGRlciB2ZXJzaW9ucywgZXNwZWNpYWxseSBvZiB0aGUKLTEuMS54IGFuZCAxLjIueCBmYW1pbHksIHVwZ3JhZGUgYXMgc29vbiBhcyBwb3NzaWJsZS4gIE5vIGZ1cnRoZXIgcmVsZWFzZXMKLXdpbGwgYmUgbWFkZSBpbiB0aGUgMS4yLnggZmFtaWx5LgotCi0KLUFwYWNoZSAxLjMuNiBpcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGZyb20KLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0LwotCi1QbGVhc2Ugc2VlIHRoZSBDSEFOR0VTXzEuMyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBmb3IgYSBmdWxsCi1saXN0IG9mIGNoYW5nZXMuCi0KLUJpbmFyeSBkaXN0cmlidXRpb25zIGFyZSBhdmFpbGFibGUgZnJvbQotCi0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9iaW5hcmllcy8KLQotQXMgb2YgQXBhY2hlIDEuMy42IGJpbmFyeSBkaXN0cmlidXRpb25zIGNvbnRhaW4gYWxsIHN0YW5kYXJkIEFwYWNoZQotbW9kdWxlcyBhcyBzaGFyZWQgb2JqZWN0cyAoaWYgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybSkgYW5kIGluY2x1ZGUKLWZ1bGwgc291cmNlIGNvZGUuICBJbnN0YWxsYXRpb24gaXMgZWFzaWx5IGRvbmUgYnkgZXhlY3V0aW5nIHRoZQotaW5jbHVkZWQgaW5zdGFsbCBzY3JpcHQuICBTZWUgdGhlIFJFQURNRS5iaW5kaXN0IGFuZCBJTlNUQUxMLmJpbmRpc3QKLWZpbGVzIGZvciBhIGNvbXBsZXRlIGV4cGxhbmF0aW9uLiAgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYmluYXJ5Ci1kaXN0cmlidXRpb25zIGFyZSBvbmx5IHByb3ZpZGVkIGZvciB5b3VyIGNvbnZlbmllbmNlIGFuZCBjdXJyZW50Ci1kaXN0cmlidXRpb25zIGZvciBzcGVjaWZpYyBwbGF0Zm9ybXMgYXJlIG5vdCBhbHdheXMgYXZhaWxhYmxlLgotCi1UaGUgc291cmNlIGFuZCBiaW5hcnkgZGlzdHJpYnV0aW9ucyBhcmUgYWxzbyBhdmFpbGFibGUgdmlhIGFueSBvZiB0aGUKLW1pcnJvcnMgbGlzdGVkIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbWlycm9ycy8KLQotRm9yIGFuIG92ZXJ2aWV3IG9mIG5ldyBmZWF0dXJlcyBpbiAxLjMgcGxlYXNlIHNlZQotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvbmV3X2ZlYXR1cmVzXzFfMy5odG1sCi0KLUluIGdlbmVyYWwsIEFwYWNoZSAxLjMgb2ZmZXJzIHNldmVyYWwgc3Vic3RhbnRpYWwgaW1wcm92ZW1lbnRzCi1vdmVyIHZlcnNpb24gMS4yLCBpbmNsdWRpbmcgYmV0dGVyIHBlcmZvcm1hbmNlLCByZWxpYWJpbGl0eSBhbmQgYQotd2lkZXIgcmFuZ2Ugb2Ygc3VwcG9ydGVkIHBsYXRmb3JtcywgaW5jbHVkaW5nIFdpbmRvd3MgOTUvOTggYW5kIE5UCi0od2hpY2ggZmFsbCB1bmRlciB0aGUgIldpbjMyIiBsYWJlbCkuCi0KLUFwYWNoZSBpcyB0aGUgbW9zdCBwb3B1bGFyIHdlYiBzZXJ2ZXIgaW4gdGhlIGtub3duIHVuaXZlcnNlOyBvdmVyCi1oYWxmIG9mIHRoZSBzZXJ2ZXJzIG9uIHRoZSBJbnRlcm5ldCBhcmUgcnVubmluZyBBcGFjaGUgb3Igb25lIG9mCi1pdHMgdmFyaWFudHMuCi0KLUlNUE9SVEFOVCBOT1RFIEZPUiBXSU4zMiBVU0VSUzogT3ZlciB0aGUgeWVhcnMsIG1hbnkgdXNlcnMgaGF2ZQotY29tZSB0byB0cnVzdCBBcGFjaGUgYXMgYSBzZWN1cmUgYW5kIHN0YWJsZSBzZXJ2ZXIuICBJdCBtdXN0Ci1iZSByZWFsaXplZCB0aGF0IHRoZSBjdXJyZW50IFdpbjMyIGNvZGUgaGFzIG5vdCB5ZXQgcmVhY2hlZCB0aGVzZQotbGV2ZWxzIGFuZCBzaG91bGQgc3RpbGwgYmUgY29uc2lkZXJlZCB0byBiZSBvZiBiZXRhIHF1YWxpdHkuICBBbnkKLVdpbjMyIHN0YWJpbGl0eSBvciBzZWN1cml0eSBwcm9ibGVtcyBkbyBub3QgaW1wYWN0LCBpbiBhbnkgd2F5LAotQXBhY2hlIG9uIG90aGVyIHBsYXRmb3Jtcy4gIFdpdGggdGhlIGNvbnRpbnVlZCBkb25hdGlvbiBvZiB0aW1lCi1hbmQgcmVzb3VyY2VzIGJ5IGluZGl2aWR1YWxzIGFuZCBjb21wYW5pZXMsIHdlIGhvcGUgdGhhdCB0aGUgV2luMzIKLXZlcnNpb24gb2YgQXBhY2hlIHdpbGwgZ3JvdyBzdHJvbmdlciB0aHJvdWdoIHRoZSAxLjMueCByZWxlYXNlIGN5Y2xlLgotCmRpZmYgLS1naXQgYS9BcGFjaGUuZHNwIGIvQXBhY2hlLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE5OWI2MC4uMDAwMDAwMAotLS0gYS9BcGFjaGUuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iQXBhY2hlIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMwotCi1DRkc9QXBhY2hlIC0gV2luMzIgUmVsZWFzZQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJBcGFjaGUubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJBcGFjaGUubWFrIiBDRkc9IkFwYWNoZSAtIFdpbjMyIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAiQXBhY2hlIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFICJBcGFjaGUgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIkFwYWNoZSAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXEFwYWNoZUxhIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVMYSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICIuXEFwYWNoZVIiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVSIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dYIC9PMiAvSSAiLi9pbmNsdWRlIiAvSSAiLi9saWIvYXByL2luY2x1ZGUiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9DT05TT0xFIiAvRCAiV0lOMzJfTEVBTl9BTkRfTUVBTiIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgbGliXGFwclxSZWxlYXNlXGFwcmxpYi5saWIgQ29yZVJcQXBhY2hlQ29yZS5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFwYWNoZSAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxBcGFjaGVMMCIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIi5cQXBhY2hlTDAiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiLlxBcGFjaGVEIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi5cQXBhY2hlRCIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvSSAiLi9pbmNsdWRlIiAvSSAiLi9saWIvYXByL2luY2x1ZGUiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9DT05TT0xFIiAvRCAiV0lOMzJfTEVBTl9BTkRfTUVBTiIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIGxpYlxhcHJcZGVidWdcYXBybGliLmxpYiBDb3JlRFxBcGFjaGVDb3JlLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIkFwYWNoZSAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIkFwYWNoZSAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aHBqO2JhdDtmb3I7ZjkwIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxvc1x3aW4zMlxtYWluX3dpbjMyLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmw7Zmk7ZmQiCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO2NudDtydGY7Z2lmO2pwZztqcGVnO2pwZSIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cb3Ncd2luMzJcYXBhY2hlLmljbwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cb3Ncd2luMzJcYXBhY2hlLnJjCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvQXBhY2hlQ29yZS5kZWYgYi9BcGFjaGVDb3JlLmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0Zjc5MS4uMDAwMDAwMAotLS0gYS9BcGFjaGVDb3JlLmRlZgorKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi07IGFwYWNoZWNvcmUuZGVmIDogCi0KLUxJQlJBUlkgQXBhY2hlQ29yZQotREVTQ1JJUFRJT04gJycKLQotRVhQT1JUUwotCTsgQWRkIG5ldyBBUEkgY2FsbHMgdG8gdGhlIGVuZCBvZiB0aGlzIGxpc3QuCi07CWFwX01ENUZpbmFsICAgQDEKLTsJYXBfTUQ1SW5pdCAgIEAyCi07CWFwX01ENVVwZGF0ZSAgIEAzCi07CWFwX2FjcXVpcmVfbXV0ZXggICBANAotCWFwX2FkZF9jZ2lfdmFycwkgIEA1Ci0JYXBfYWRkX2NvbW1vbl92YXJzICAgQDYKLQlhcF9hZGRfbG9hZGVkX21vZHVsZSAgIEA3Ci0JYXBfYWRkX21vZHVsZSAgIEA4Ci0JYXBfYWRkX25hbWVkX21vZHVsZSAgIEA5Ci0JYXBfYWRkX3Blcl9kaXJfY29uZiAgIEAxMAotCWFwX2FkZF9wZXJfdXJsX2NvbmYgICBAMTEKLQk7YXBfYWRkX3ZlcnNpb25fY29tcG9uZW50ICAgQDEyCi0JYXBfYWxsb3dfb3B0aW9ucyAgIEAxMwotCWFwX2FsbG93X292ZXJyaWRlcyAgIEAxNAotOwlhcF9hcHBlbmRfYXJyYXlzICAgQDE1Ci07CWFwX2FycmF5X2NhdCAgIEAxNgotCWFwX2F1dGhfbmFtZSAgIEAxNwotCWFwX2F1dGhfdHlwZSAgIEAxOAotCWFwX2Jhc2ljX2h0dHBfaGVhZGVyICAgQDE5Ci0JYXBfYmNsb3NlICAgQDIwCi0JYXBfYmNyZWF0ZSAgIEAyMQotCWFwX2JmaWxidWYgICBAMjIKLQk7YXBfYmZpbGVubyAgIEAyMwotCWFwX2JmbHNidWYgICBAMjQKLQlhcF9iZmx1c2ggICBAMjUKLQlhcF9iZ2V0b3B0ICAgQDI2Ci0JYXBfYmdldHMgICBAMjcKLQk7YXBfYmhhbGZkdXBsZXggICBAMjgKLQk7YXBfYmxvY2tfYWxhcm1zICAgQDI5Ci0JYXBfYmxvb2tjICAgQDMwCi0JO2FwX2Jub25ibG9jayAgIEAzMQotCWFwX2JvbmVycm9yICAgQDMyCi0JO2FwX2JwdXNoZmQgICBAMzMKLQk7YXBfYnB1c2hoICAgQDM0Ci0JYXBfYnB1dHMgICBAMzUKLQlhcF9icmVhZCAgIEAzNgotCWFwX2JzZXRmbGFnICAgQDM3Ci0JYXBfYnNldG9wdCAgIEAzOAotCTthcF9ic2tpcGxmICAgQDM5Ci07CWFwX2JzcGF3bl9jaGlsZCAgIEA0MAotCWFwX2J3cml0ZSAgIEA0MQotCTthcF9ieXRlc19pbl9mcmVlX2Jsb2NrcyAgIEA0MgotCTthcF9ieXRlc19pbl9wb29sICAgQDQzCi07CWFwX2NhbGxfZXhlYyAgIEA0NAotCTthcF9jYW5fZXhlYyAgIEA0NQotCWFwX2NmZ19jbG9zZWZpbGUgICBANDYKLQlhcF9jZmdfZ2V0YyAgIEA0NwotCWFwX2NmZ19nZXRsaW5lICAgQDQ4Ci0JYXBfY2hkaXJfZmlsZSAgIEA0OQotCTthcF9jaGVja19hbGFybSAgIEA1MAotCWFwX2NoZWNrX2NtZF9jb250ZXh0ICAgQDUxCi0JYXBfY2hlY2ttYXNrICAgQDUyCi07CWFwX2NsZWFudXBfZm9yX2V4ZWMgICBANTMKLQlhcF9jbGVhcl9tb2R1bGVfbGlzdCAgIEA1NAotOwlhcF9jbGVhcl9wb29sICAgQDU1Ci07CWFwX2NsZWFyX3RhYmxlICAgQDU2Ci0JYXBfY2xvc2VfcGlwZWRfbG9nICAgQDU3Ci0JYXBfY29uc3RydWN0X3NlcnZlciAgIEA1OAotCWFwX2NvbnN0cnVjdF91cmwgICBANTkKLQlhcF9jb250ZW50X3R5cGVfdG9sb3dlciAgIEA2MAotOwlhcF9jb3B5X2FycmF5ICAgQDYxCi07CWFwX2NvcHlfYXJyYXlfaGRyICAgQDYyCi07CWFwX2NvcHlfdGFibGUgICBANjMKLQlhcF9jb3VudF9kaXJzICAgQDY0Ci07CWFwX2NweXN0cm4gICBANjUKLQlhcF9jcmVhdGVfZW52aXJvbm1lbnQgICBANjYKLTsJYXBfY3JlYXRlX211dGV4ICAgQDY3Ci0JYXBfY3JlYXRlX3Blcl9kaXJfY29uZmlnICAgQDY4Ci0JYXBfY3VzdG9tX3Jlc3BvbnNlICAgQDY5Ci0JYXBfZGVmYXVsdF9wb3J0X2Zvcl9yZXF1ZXN0ICAgQDcwCi0JYXBfZGVmYXVsdF9wb3J0X2Zvcl9zY2hlbWUgICBANzEKLQlhcF9kZWZhdWx0X3R5cGUgICBANzIKLTsJYXBfZGVzdHJveV9tdXRleCAgIEA3MwotOwlhcF9kZXN0cm95X3Bvb2wgICBANzQKLQlhcF9kZXN0cm95X3N1Yl9yZXEgICBANzUKLQlhcF9kaWUgICBANzYKLQlhcF9kaXNjYXJkX3JlcXVlc3RfYm9keSAgIEA3NwotCWFwX2RvY3VtZW50X3Jvb3QgICBANzgKLQlhcF9lYWNoX2J5dGVyYW5nZSAgIEA3OQotCWFwX2Vycm9yX2xvZzJzdGRlcnIgICBAODAKLQlhcF9lc2NhcGVfaHRtbCAgIEA4MQotCWFwX2VzY2FwZV9wYXRoX3NlZ21lbnQgICBAODIKLQlhcF9lc2NhcGVfcXVvdGVzICAgQDgzCi0JYXBfZXNjYXBlX3NoZWxsX2NtZCAgIEA4NAotCTthcF9leGlzdHNfc2NvcmVib2FyZF9pbWFnZSAgIEA4NQotCWFwX2ZpbmFsaXplX3JlcXVlc3RfcHJvdG9jb2wgICBAODYKLQlhcF9maW5kX2NvbW1hbmQgICBAODcKLQlhcF9maW5kX2NvbW1hbmRfaW5fbW9kdWxlcyAgIEA4OAotCWFwX2ZpbmRfbGFzdF90b2tlbiAgIEA4OQotCWFwX2ZpbmRfbGlua2VkX21vZHVsZSAgIEA5MAotCWFwX2ZpbmRfbW9kdWxlX25hbWUgICBAOTEKLQlhcF9maW5kX3BhdGhfaW5mbyAgIEA5MgotCWFwX2ZpbmRfdG9rZW4gICBAOTMKLQlhcF9nZXRfYmFzaWNfYXV0aF9wdyAgIEA5NAotCWFwX2dldF9jbGllbnRfYmxvY2sgICBAOTUKLTsJYXBfZ2V0X2dtdG9mZiAgIEA5NgotCWFwX2dldF9saW1pdF9yZXFfYm9keSAgIEA5NwotCWFwX2dldF9yZW1vdGVfaG9zdCAgIEA5OAotCWFwX2dldF9yZW1vdGVfbG9nbmFtZSAgIEA5OQotCWFwX2dldF9zZXJ2ZXJfYnVpbHQgICBAMTAwCi0JYXBfZ2V0X3NlcnZlcl9uYW1lICAgQDEwMQotCWFwX2dldF9zZXJ2ZXJfcG9ydCAgIEAxMDIKLQk7YXBfZ2V0X3NlcnZlcl92ZXJzaW9uICAgQDEwMwotOwlhcF9nZXRfdGltZSAgIEAxMDQKLQlhcF9nZXRfdG9rZW4gICBAMTA1Ci0JYXBfZ2V0cGFyZW50cyAgIEAxMDYKLQlhcF9nZXR3b3JkICAgQDEwNwotCWFwX2dldHdvcmRfY29uZiAgIEAxMDgKLQlhcF9nZXR3b3JkX2NvbmZfbmMgICBAMTA5Ci0JYXBfZ2V0d29yZF9uYyAgIEAxMTAKLQlhcF9nZXR3b3JkX251bGxzICAgQDExMQotCWFwX2dldHdvcmRfbnVsbHNfbmMgICBAMTEyCi0JYXBfZ2V0d29yZF93aGl0ZSAgIEAxMTMKLQlhcF9nZXR3b3JkX3doaXRlX25jICAgQDExNAotOwlhcF9nbV90aW1lc3RyXzgyMiAgIEAxMTUKLQlhcF9nbmFtZTJpZCAgIEAxMTYKLQlhcF9oYW5kbGVfY29tbWFuZCAgIEAxMTcKLQk7YXBfaGFyZF90aW1lb3V0ICAgQDExOAotCWFwX2h0X3RpbWUgICBAMTE5Ci0JYXBfaW5kICAgQDEyMAotCWFwX2luZGV4X29mX3Jlc3BvbnNlICAgQDEyMQotCWFwX2luaXRfdmlydHVhbF9ob3N0ICAgQDEyMgotCWFwX2ludGVybmFsX3JlZGlyZWN0ICAgQDEyMwotCWFwX2ludGVybmFsX3JlZGlyZWN0X2hhbmRsZXIgICBAMTI0Ci0JYXBfaXNfZGlyZWN0b3J5ICAgQDEyNQotOwlhcF9pc19mbm1hdGNoICAgQDEyNgotCWFwX2lzX2luaXRpYWxfcmVxICAgQDEyNwotCWFwX2lzX21hdGNoZXhwICAgQDEyOAotCWFwX2lzX3VybCAgIEAxMjkKLTsJYXBfa2lsbF9jbGVhbnVwICAgQDEzMAotOwlhcF9raWxsX2NsZWFudXBzX2Zvcl9mZCAgIEAxMzEKLTsJYXBfa2lsbF9jbGVhbnVwc19mb3Jfc29ja2V0ICAgQDEzMgotCTthcF9raWxsX3RpbWVvdXQgICBAMTMzCi0JYXBfbG9nX2Fzc2VydCAgIEAxMzQKLQlhcF9sb2dfZXJyb3Jfb2xkICAgQDEzNQotCWFwX2xvZ19yZWFzb24gICBAMTM2Ci0JYXBfbG9nX3VuaXhlcnIgICBAMTM3Ci07CWFwX21ha2VfYXJyYXkgICBAMTM4Ci0JYXBfbWFrZV9kaXJzdHIgICBAMTM5Ci0JYXBfbWFrZV9kaXJzdHJfcGFyZW50ICAgQDE0MAotCWFwX21ha2VfZGlyc3RyX3ByZWZpeCAgIEAxNDEKLQlhcF9tYWtlX2Z1bGxfcGF0aCAgIEAxNDIKLTsJYXBfbWFrZV9zdWJfcG9vbCAgIEAxNDMKLTsJYXBfbWFrZV90YWJsZSAgIEAxNDQKLQlhcF9tYXRjaGVzX3JlcXVlc3Rfdmhvc3QgICBAMTQ1Ci0JYXBfbWQ1ICAgQDE0NgotCWFwX21kNV9iaW5hcnkgICBAMTQ3Ci0JYXBfbWQ1Y29udGV4dFRvNjQgICBAMTQ4Ci0JYXBfbWQ1ZGlnZXN0ICAgQDE0OQotCWFwX21lZXRzX2NvbmRpdGlvbnMgICBAMTUwCi0JYXBfbm8yc2xhc2ggICBAMTUxCi0JYXBfbm90ZV9hdXRoX2ZhaWx1cmUgICBAMTUyCi0JYXBfbm90ZV9iYXNpY19hdXRoX2ZhaWx1cmUgICBAMTUzCi07CWFwX25vdGVfY2xlYW51cHNfZm9yX2ZkICAgQDE1NAotOwlhcF9ub3RlX2NsZWFudXBzX2Zvcl9maWxlICAgQDE1NQotOwlhcF9ub3RlX2NsZWFudXBzX2Zvcl9oICAgQDE1NgotOwlhcF9ub3RlX2NsZWFudXBzX2Zvcl9zb2NrZXQgICBAMTU3Ci0JYXBfbm90ZV9kaWdlc3RfYXV0aF9mYWlsdXJlICAgQDE1OAotOwlhcF9ub3RlX3N1YnByb2Nlc3MgICBAMTU5Ci07CWFwX29wZW5fbXV0ZXggICBAMTYwCi0JYXBfb3Blbl9waXBlZF9sb2cgICBAMTYxCi0JYXBfb3NfY2Fub25pY2FsX2ZpbGVuYW1lICAgQDE2MgotCWFwX29zX2VzY2FwZV9wYXRoICAgQDE2MwotOwlhcF9vdmVybGFwX3RhYmxlcyAgIEAxNjQKLTsJYXBfb3ZlcmxheV90YWJsZXMgICBAMTY1Ci07CWFwX3BhbGxvYyAgIEAxNjYKLQlhcF9wYXJzZUhUVFBkYXRlICAgQDE2NwotCWFwX3BhcnNlX2hvc3RpbmZvX2NvbXBvbmVudHMgICBAMTY4Ci0JYXBfcGFyc2VfdXJpICAgQDE2OQotCWFwX3BhcnNlX3VyaV9jb21wb25lbnRzICAgQDE3MAotOwlhcF9wY2FsbG9jICAgQDE3MQotCWFwX3BjZmdfb3Blbl9jdXN0b20gICBAMTcyCi0JYXBfcGNmZ19vcGVuZmlsZSAgIEAxNzMKLTsJYXBfcGNsb3NlZGlyICAgQDE3NAotOwlhcF9wY2xvc2VmICAgQDE3NQotOwlhcF9wY2xvc2VoICAgQDE3NgotOwlhcF9wY2xvc2Vzb2NrZXQgICBAMTc3Ci0JYXBfcGR1cGhvc3RlbnQgICBAMTc4Ci07CWFwX3BmY2xvc2UgICBAMTc5Ci07CWFwX3BmZG9wZW4gICBAMTgwCi07CWFwX3Bmb3BlbiAgIEAxODEKLQlhcF9wZ2V0aG9zdGJ5bmFtZSAgIEAxODIKLTsJYXBfcG9wZW5kaXIgICBAMTgzCi07CWFwX3BvcGVuZiAgIEAxODQKLQlhcF9wcmVnY29tcCAgIEAxODUKLQlhcF9wcmVnZnJlZSAgIEAxODYKLQlhcF9wcmVnc3ViICAgQDE4NwotCWFwX3BzaWduYXR1cmUgICBAMTg4Ci07CWFwX3Bzb2NrZXQgICBAMTg5Ci07CWFwX3BzdHJkdXAgICBAMTkwCi07CWFwX3BzdHJuZHVwICAgQDE5MQotOwlhcF9wdXNoX2FycmF5ICAgQDE5MgotOwlhcF9wdnNwcmludGYgICBAMTkzCi0JYXBfcmF0aW9uYWxpemVfbXRpbWUgICBAMTk0Ci07CWFwX3JlZ2lzdGVyX2NsZWFudXAgICBAMTk1Ci07CWFwX3JlbGVhc2VfbXV0ZXggICBAMTk2Ci0JYXBfcmVtb3ZlX2xvYWRlZF9tb2R1bGUgICBAMTk3Ci0JYXBfcmVtb3ZlX21vZHVsZSAgIEAxOTgKLQlhcF9yZXF1aXJlcyAgIEAxOTkKLQk7YXBfcmVzZXRfdGltZW91dCAgIEAyMDAKLQlhcF9yZmx1c2ggICBAMjAxCi0JYXBfcmluZCAgIEAyMDIKLQlhcF9ycHV0YyAgIEAyMDMKLQlhcF9ycHV0cyAgIEAyMDQKLTsJYXBfcnVuX2NsZWFudXAgICBAMjA1Ci0JYXBfcnVuX3N1Yl9yZXEgICBAMjA2Ci0JYXBfcndyaXRlICAgQDIwNwotCWFwX3NhdGlzZmllcyAgIEAyMDgKLQlhcF9zY2FuX3NjcmlwdF9oZWFkZXJfZXJyICAgQDIwOQotCWFwX3NjYW5fc2NyaXB0X2hlYWRlcl9lcnJfYnVmZiAgIEAyMTAKLQlhcF9zY2FuX3NjcmlwdF9oZWFkZXJfZXJyX2NvcmUgICBAMjExCi0JO2FwX3NlbmRfZmIgICBAMjEyCi0JO2FwX3NlbmRfZmJfbGVuZ3RoICAgQDIxMwotCWFwX3NlbmRfZmQgICBAMjE0Ci0JYXBfc2VuZF9mZF9sZW5ndGggICBAMjE1Ci0JYXBfc2VuZF9odHRwX2hlYWRlciAgIEAyMTYKLQlhcF9zZW5kX2h0dHBfdHJhY2UgICBAMjE3Ci07CWFwX3NlbmRfbW1hcCAgIEAyMTgKLQlhcF9zZW5kX3NpemUgICBAMjE5Ci0JYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUgICBAMjIwCi0JYXBfc2V0X2J5dGVyYW5nZSAgIEAyMjEKLQlhcF9zZXRfY29udGVudF9sZW5ndGggICBAMjIyCi0JYXBfc2V0X2V0YWcgICBAMjIzCi0JYXBfc2V0X2tlZXBhbGl2ZSAgIEAyMjQKLQlhcF9zZXRfbGFzdF9tb2RpZmllZCAgIEAyMjUKLQlhcF9zZXR1cF9jbGllbnRfYmxvY2sgICBAMjI2Ci0JYXBfc2hvdWxkX2NsaWVudF9ibG9jayAgIEAyMjcKLQk7YXBfc29mdF90aW1lb3V0ICAgQDIyOAotCWFwX3NvbWVfYXV0aF9yZXF1aXJlZCAgIEAyMjkKLTsJYXBfc3Bhd25fY2hpbGQgICBAMjMwCi0JYXBfc3JtX2NvbW1hbmRfbG9vcCAgIEAyMzEKLQlhcF9zdHJfdG9sb3dlciAgIEAyMzIKLQlhcF9zdHJjYXNlY21wX21hdGNoICAgQDIzMwotCWFwX3N0cmNtcF9tYXRjaCAgIEAyMzQKLQlhcF9zdWJfcmVxX2xvb2t1cF9maWxlICAgQDIzNQotCWFwX3N1Yl9yZXFfbG9va3VwX3VyaSAgIEAyMzYKLQk7YXBfc3luY19zY29yZWJvYXJkX2ltYWdlICAgQDIzNwotOwlhcF90YWJsZV9hZGQgICBAMjM4Ci07CWFwX3RhYmxlX2FkZG4gICBAMjM5Ci07CWFwX3RhYmxlX2dldCAgIEAyNDAKLTsJYXBfdGFibGVfbWVyZ2UgICBAMjQxCi07CWFwX3RhYmxlX21lcmdlbiAgIEAyNDIKLTsJYXBfdGFibGVfc2V0ICAgQDI0MwotOwlhcF90YWJsZV9zZXRuICAgQDI0NAotOwlhcF90YWJsZV91bnNldCAgIEAyNDUKLTsJYXBfdG0yc2VjICAgQDI0NgotCWFwX3VuYW1lMmlkICAgQDI0NwotCTthcF91bmJsb2NrX2FsYXJtcyAgIEAyNDgKLQlhcF91bmVzY2FwZV91cmwgICBAMjQ5Ci0JYXBfdW5wYXJzZV91cmlfY29tcG9uZW50cyAgIEAyNTAKLQlhcF91cGRhdGVfbXRpbWUgICBAMjUxCi0JYXBfdXVkZWNvZGUgICBAMjUyCi0JYXBfdXVlbmNvZGUgICBAMjUzCi0JYXBfdmJwcmludGYgICBAMjU0Ci07CWFwX3Zmb3JtYXR0ZXIgICBAMjU1Ci07CWFwX3ZzbnByaW50ZiAgIEAyNTYKLQljbG9zZWRpciAgIEAyNTcKLQlvcGVuZGlyICAgQDI1OAotOwlvc19zcGF3bnYgICBAMjU5Ci07CW9zX3NwYXdudmUgICBAMjYwCi0Jb3Nfc3RhdCAgIEAyNjEKLQlyZWFkZGlyICAgQDI2MgotCXJlZ2NvbXAgICBAMjYzCi0JcmVnZXhlYyAgIEAyNjQKLQlyZWdmcmVlICAgQDI2NQotCWFjY2Vzc19tb2R1bGUgQDI2NgotCWFsaWFzX21vZHVsZSAgIEAyNjcKLQlhcF9icHJpbnRmICAgQDI2OAotCWFwX2J2cHV0cyAgIEAyNjkKLTsJYXBfZGF5X3NuYW1lcyBAMjcwICAKLQk7YXBfZXh0ZW5kZWRfc3RhdHVzICBAMjcxICAgCi0JYXBfbGltaXRfc2VjdGlvbiAgIEAyNzIKLQlhcF9sb2FkZWRfbW9kdWxlcyAgIEAyNzMKLQlhcF9sb2dfZXJyb3IgICBAMjc0Ci0JYXBfbG9nX3ByaW50ZiAgIEAyNzUKLQlhcF9sb2dfcmVycm9yICAgQDI3NgotOwlhcF9tb250aF9zbmFtZXMgIEAyNzcKLTsJYXBfbnVsbF9jbGVhbnVwICAgQDI3OAotOwlhcF9wc3ByaW50ZiAgIEAyNzkKLTsJYXBfcHN0cmNhdCAgIEAyODAKLQk7YXBfcmVzdGFydF90aW1lICBAMjgxIAotCWFwX3JwcmludGYgICBAMjgyCi0JYXBfcnZwdXRzICAgQDI4MwotCTthcF9zY29yZWJvYXJkX2ltYWdlICAgQDI4NAotCWFwX3NlbmRfaGVhZGVyX2ZpZWxkICAgQDI4NQotCWFwX3NlcnZlcl9hcmd2MCAgIEAyODYKLQlhcF9zZXJ2ZXJfcm9vdCAgIEAyODcKLQlhcF9zZXRfZmlsZV9zbG90ICBAMjg4Ci0JYXBfc2V0X2ZsYWdfc2xvdCAgIEAyODkKLQlhcF9zZXRfc3RyaW5nX3Nsb3QgIEAyOTAKLQlhcF9zZXRfc3RyaW5nX3Nsb3RfbG93ZXIgIEAyOTEgCi07CWFwX3NucHJpbnRmICAgQDI5MgotCTthcF9zdWV4ZWNfZW5hYmxlZCAgQDI5MyAKLTsJYXBfdGFibGVfZG8gICBAMjk0Ci0JYXBhY2hlX21haW4gICBAMjk1Ci0JYXNpc19tb2R1bGUgICBAMjk2Ci0JYXV0aF9tb2R1bGUgICBAMjk3Ci0JYXV0b2luZGV4X21vZHVsZSAgQDI5OCAKLQk7Y2dpX21vZHVsZSAgIEAyOTkKLQljb25maWdfbG9nX21vZHVsZSAgQDMwMCAKLQljb3JlX21vZHVsZSAgIEAzMDEKLQlkaXJfbW9kdWxlICAgQDMwMgotCWVudl9tb2R1bGUgICBAMzAzCi0JaW1hcF9tb2R1bGUgICBAMzA0Ci0JO2luY2x1ZGVzX21vZHVsZSAgQDMwNSAgIAotCW1pbWVfbW9kdWxlICAgQDMwNgotCW5lZ290aWF0aW9uX21vZHVsZSBAMzA3ICAKLTsJb3Nfc3Bhd25sZSAgIEAzMDgKLQlzZXRlbnZpZl9tb2R1bGUgIEAzMDkgCi0JO3NvX21vZHVsZSAgIEAzMTAKLQl0b3BfbW9kdWxlICAgQDMxMQotOwlhcF9mbm1hdGNoICAgQDMxMgotCWFwX21ldGhvZF9udW1iZXJfb2YgICBAMzEzCi0JYXBfZXhpc3RzX2NvbmZpZ19kZWZpbmUgICBAMzE0Ci0JYXBfc2luZ2xlX21vZHVsZV9jb25maWd1cmUgICBAMzE1Ci0JYXBfbWFrZV9ldGFnICAgQDMxNwotOwlhcF9hcnJheV9wc3RyY2F0ICAgQDMxOAotCWFwX29zX2lzX2ZpbGVuYW1lX3ZhbGlkICAgQDMxOQotCWFwX2ZpbmRfbGlzdF9pdGVtICAgQDMyMAotOwlhcF9NRDVFbmNvZGUgICBAMzIxCi07CWFwX3ZhbGlkYXRlX3Bhc3N3b3JkICAgQDMyMgotCWFwX3NpemVfbGlzdF9pdGVtICAgQDMyMwotCWFwX2dldF9saXN0X2l0ZW0gICBAMzI0Ci0JO2FwX3Njb3JlYm9hcmRfZm5hbWUgICBAMzI1Ci0JO2FwX3BpZF9mbmFtZSAgIEAzMjYKLQk7YXBfZXhjZXNzX3JlcXVlc3RzX3Blcl9jaGlsZCAgIEAzMjcKLQk7YXBfdGhyZWFkc19wZXJfY2hpbGQgICBAMzI4Ci0JO2FwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQgICBAMzI5Ci0JO2FwX2RhZW1vbnNfdG9fc3RhcnQgICBAMzMwCi0JO2FwX2RhZW1vbnNfbWluX2ZyZWUgICBAMzMxCi0JO2FwX2RhZW1vbnNfbWF4X2ZyZWUgICBAMzMyCi0JO2FwX2RhZW1vbnNfbGltaXQgICBAMzMzCi0JO2FwX3VzZXJfbmFtZSAgIEAzMzQKLQk7YXBfdXNlcl9pZCAgIEAzMzUKLQk7YXBfZ3JvdXBfaWQgICBAMzM2Ci0JO2FwX3N0YW5kYWxvbmUgICBAMzM3Ci0JO2FwX3NlcnZlcl9jb25mbmFtZSAgIEAzMzgKLQlhcF9zdWJfcmVxX21ldGhvZF91cmkgICBAMzM5Ci0JYXBfcmVnZXJyb3IgICBAMzQxCi0JYXBfcmVnZXhlYyAgIEAzNDIKLQlhcF9maWVsZF9ub3BhcmFtICAgQDM0MwotCWFwX3BiYXNlNjRkZWNvZGUgICBAMzQ0Ci0JYXBfcGJhc2U2NGVuY29kZSAgIEAzNDUKLQlhcF9iYXNlNjRlbmNvZGUgICBAMzQ2Ci0JYXBfYmFzZTY0ZW5jb2RlX2JpbmFyeSAgIEAzNDcKLQlhcF9iYXNlNjRlbmNvZGVfbGVuICAgQDM0OAotCWFwX2Jhc2U2NGRlY29kZSAgIEAzNDkKLQlhcF9iYXNlNjRkZWNvZGVfYmluYXJ5ICAgQDM1MAotCWFwX2Jhc2U2NGRlY29kZV9sZW4gICBAMzUxCi0JYXBfU0hBMUluaXQgICBAMzUyCi0JYXBfU0hBMVVwZGF0ZV9iaW5hcnkgICBAMzUzCi0JYXBfU0hBMVVwZGF0ZSAgIEAzNTQKLQlhcF9TSEExRmluYWwgICBAMzU1Ci0JYXBfc2hhMV9iYXNlNjQgICBAMzU2Ci0JYXBfc2hvd19ob29rIEAzNTcKLQlhcF9ob29rX3NvcnRfcmVnaXN0ZXIgQDM1OAotCWFwX2hvb2tfcHJvY2Vzc19jb25uZWN0aW9uIEAzNTkKLQlhcF9wcm9jZXNzX2h0dHBfY29ubmVjdGlvbiBAMzYwCi0JYXBfaG9va19jaGVja191c2VyX2lkIEAzNjEKLQlhcF9ob29rX2F1dGhfY2hlY2tlciBAMzYyCi0JYXBfaG9va19maXh1cHMgQDM2MwotICAgICAgICByZWdlcnJvciBAMzY0Ci0gICAgICAgIGFwX3NlbmRfZXJyb3JfcmVzcG9uc2UgQDM2NQotCWFwX3N0YXJ0X3NodXRkb3duIEAzNjYKLSAgICAgICAgc2VuZF9zaWduYWxfdG9fc2VydmljZSAgQDM2NwotICAgICAgICBhcF9yZWFkX2NvbmZpZyAgIEAzNjgKLQlhcF9zZXJ2ZXJfcHJlX3JlYWRfY29uZmlnICBAMzY5Ci0JYXBfc2VydmVyX3Bvc3RfcmVhZF9jb25maWcgQDM3MAotCWFwX3NldHVwX3ByZWxpbmtlZF9tb2R1bGVzIEAzNzEKLQlSZW1vdmVTZXJ2aWNlIEAzNzIKLQlJbnN0YWxsU2VydmljZSBAMzczCi0JaXNWYWxpZFNlcnZpY2UgQDM3NAotCXNlcnZpY2VfbWFpbiAgQDM3NQotCWlzUHJvY2Vzc1NlcnZpY2UgQDM3NgotCWFwX3JlZ2lzdHJ5X2dldF9zZXJ2ZXJfcm9vdCBAMzc3Ci0JYXBfcmVnaXN0cnlfZ2V0X3NlcnZpY2VfY29uZiBAMzc4Ci0KZGlmZiAtLWdpdCBhL0FwYWNoZUNvcmUuZHNwIGIvQXBhY2hlQ29yZS5kc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNDdlZWIuLjAwMDAwMDAKLS0tIGEvQXBhY2hlQ29yZS5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJBcGFjaGVDb3JlIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDIKLQotQ0ZHPUFwYWNoZUNvcmUgLSBXaW4zMiBSZWxlYXNlCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIkFwYWNoZUNvcmUubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJBcGFjaGVDb3JlLm1hayIgQ0ZHPSJBcGFjaGVDb3JlIC0gV2luMzIgUmVsZWFzZSIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJBcGFjaGVDb3JlIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAiQXBhY2hlQ29yZSAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1NVEw9bWlkbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAiQXBhY2hlQ29yZSAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXEFwYWNoZUNvIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVDbyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICIuXENvcmVSIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi5cQ29yZVIiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dYIC9PMiAvSSAiLlxpbmNsdWRlIiAvSSAiLlxsaWJcYXByXGluY2x1ZGUiIC9JICIuXG9zXHdpbjMyIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIldJTjMyX0xFQU5fQU5EX01FQU4iIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIGxpYlxhcHJcUmVsZWFzZVxhcHJsaWIubGliIG9zXHdpbjMyXEFwYWNoZU9TUlxBcGFjaGVPUy5saWIgcmVnZXhccmVsZWFzZVxyZWdleC5saWIgYXBcUmVsZWFzZVxhcC5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIHdzMl8zMi5saWIgbXN3c29jay5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFjaGluZTpJMzg2Ci0KLSFFTFNFSUYgICIkKENGRykiID09ICJBcGFjaGVDb3JlIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXEFwYWNoZUMwIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVDMCIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICIuXENvcmVEIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi5cQ29yZUQiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvSSAiLlxpbmNsdWRlIiAvSSAiLlxsaWJcYXByXGluY2x1ZGUiIC9JICIuXG9zXHdpbjMyIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIldJTjMyX0xFQU5fQU5EX01FQU4iIC9GUiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgbGliXGFwclxkZWJ1Z1xhcHJsaWIubGliIHJlZ2V4XGRlYnVnXHJlZ2V4LmxpYiBvc1x3aW4zMlxBcGFjaGVPU0RcQXBhY2hlT1MubGliIGFwXERlYnVnXGFwLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgd3MyXzMyLmxpYiBtc3dzb2NrLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2Ci0jIFNVQlRSQUNUIExJTkszMiAvbWFwCi0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJBcGFjaGVDb3JlIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAiQXBhY2hlQ29yZSAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aHBqO2JhdDtmb3I7ZjkwIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxBcGFjaGVDb3JlLmRlZgotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbWFpblxidWZmLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGJ1aWxkbWFyay5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxtYWluXGh0dHBfY29uZmlnLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1haW5caHR0cF9jb25uZWN0aW9uLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1haW5caHR0cF9jb3JlLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1haW5caHR0cF9sb2cuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbWFpblxodHRwX21haW4uYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbWFpblxodHRwX3Byb3RvY29sLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1haW5caHR0cF9yZXF1ZXN0LmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1haW5caHR0cF92aG9zdC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxtYWluXGlvbF9maWxlLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG9zXHdpbjMyXGlvbF9zb2NrZXQuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbWFpblxsaXN0ZW4uYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kdWxlc1xzdGFuZGFyZFxtb2RfYWNjZXNzLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX2FjdGlvbnMuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kdWxlc1xzdGFuZGFyZFxtb2RfYWxpYXMuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kdWxlc1xzdGFuZGFyZFxtb2RfYXNpcy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2R1bGVzXHN0YW5kYXJkXG1vZF9hdXRoLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX2F1dG9pbmRleC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2R1bGVzXHN0YW5kYXJkXG1vZF9jZ2kuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kdWxlc1xzdGFuZGFyZFxtb2RfZGlyLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX2Vudi5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2R1bGVzXHN0YW5kYXJkXG1vZF9pbWFwLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX2luY2x1ZGUuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kdWxlc1xzdGFuZGFyZFxtb2RfbG9nX2NvbmZpZy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2R1bGVzXHN0YW5kYXJkXG1vZF9taW1lLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX25lZ290aWF0aW9uLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX3NldGVudmlmLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX3NvLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX3VzZXJkaXIuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cb3Ncd2luMzJcbW9kdWxlcy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxvc1x3aW4zMlxyZWdpc3RyeS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxtYWluXHJmYzE0MTMuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cb3Ncd2luMzJcc2VydmljZS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxtYWluXHV0aWwuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbWFpblx1dGlsX2RhdGUuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbWFpblx1dGlsX21kNS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxtYWluXHV0aWxfc2NyaXB0LmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1haW5cdXRpbF91cmkuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cb3Ncd2luMzJcdXRpbF93aW4zMi5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2R1bGVzXG1wbVx3aW5udFx3aW5udC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sO2ZpO2ZkIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxpbmNsdWRlXGFwLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGluY2x1ZGVcYXBfaG9va3MuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5jbHVkZVxhcF9pb2wuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5jbHVkZVxhcF9saXN0ZW4uaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5jbHVkZVxhcF9tZDUuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5jbHVkZVxidWZmLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGluY2x1ZGVcY29uZi5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxpbmNsdWRlXGV4cGxhaW4uaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5jbHVkZVxmbm1hdGNoLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGluY2x1ZGVcaHNyZWdleC5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxpbmNsdWRlXGh0dHBfY29uZl9nbG9iYWxzLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGluY2x1ZGVcaHR0cF9jb25maWcuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5jbHVkZVxodHRwX2Nvbm5lY3Rpb24uaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5jbHVkZVxodHRwX2NvcmUuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5jbHVkZVxodHRwX2xvZy5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxpbmNsdWRlXGh0dHBfbWFpbi5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxpbmNsdWRlXGh0dHBfcHJvdG9jb2wuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5jbHVkZVxodHRwX3JlcXVlc3QuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5jbHVkZVxodHRwX3Zob3N0LmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGluY2x1ZGVcaHR0cGQuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cb3Ncd2luMzJcaW9sX3NvY2tldC5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2R1bGVzXHN0YW5kYXJkXG1vZF9taW1lLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZHVsZXNcbXBtXHdpbm50XG1wbV9kZWZhdWx0LmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG9zXHdpbjMyXG9zLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG9zXHdpbjMyXHJlZ2lzdHJ5LmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGluY2x1ZGVccmZjMTQxMy5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxvc1x3aW4zMlxzZXJ2aWNlLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGluY2x1ZGVcdXRpbF9kYXRlLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGluY2x1ZGVcdXRpbF9tZDUuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5jbHVkZVx1dGlsX3NjcmlwdC5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxpbmNsdWRlXHV0aWxfdXJpLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZHVsZXNcbXBtXHdpbm50XHdpbm50LmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO2NudDtydGY7Z2lmO2pwZztqcGVnO2pwZSIKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJHZW5lcmF0ZWQgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxtYWluXHRlc3RfY2hhci5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxtYWluXHVyaV9kZWxpbXMuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL0tFWVMgYi9LRVlTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDBjNzgyLi4wMDAwMDAwCi0tLSBhL0tFWVMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTggKzAsMCBAQAotVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBQR1Aga2V5cyBvZiB2YXJpb3VzIEFwYWNoZSBkZXZlbG9wZXJzLgotUGxlYXNlIGRvbid0IHVzZSB0aGVtIGZvciBlbWFpbCB1bmxlc3MgeW91IGhhdmUgdG8uIFRoZWlyIG1haW4KLXB1cnBvc2UgaXMgY29kZSBzaWduaW5nLgotCi1BcGFjaGUgdXNlcnM6IHBncCA8IEtFWVMKLUFwYWNoZSBkZXZlbG9wZXJzOiBwZ3AgLWt4YSA8eW91ciBuYW1lPiBhbmQgYXBwZW5kIGl0IHRvIHRoaXMgZmlsZS4KLQotCi1UeXBlIEJpdHMvS2V5SUQgICAgRGF0ZSAgICAgICBVc2VyIElECi1wdWIgIDEwMjQvMjcxOUFGMzUgMTk5NS8wNS8xMyBCZW4gTGF1cmllIDxiZW5AYWxncm91cC5jby51az4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlbiBMYXVyaWUgPGJlbkBnb256by5iZW4uYWxncm91cC5jby51az4KLQotLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi1WZXJzaW9uOiAyLjYuM2lhCi0KLW1RQ05BaSswalFFQUFBRUVBSzdvWDBGZU5uY2FIZmExditWN1NNVXZpQW04cUI4b3JXRzB6dmphNFp0U3JIVmcKLS9QTXdwcFVoNDR0NUVSQTlsbHRSQmRIdTMwK1lTaDhhMWRZdDFYT0Q4M25rbnpqOXJodHBGQVBxeXl3bExWaE4KLVZZM1BWTHlNYlVMdzI3YUVBR2MrU3RGcXJEb1VRMCtqOVFVL1lIL0l5Vk45ckJhSnloc0lERVVuR2E4MUFBVVIKLXRCNUNaVzRnVEdGMWNtbGxJRHhpWlc1QVlXeG5jbTkxY0M1amJ5NTFhejZKQVJVREJSQXliMkRvYzNBc056eWsKLVloMEJBUmE2Q0FDVUJuc1A5VmIrVC9Qdk5ZS1ZRQklPRHorOTB0ejVHb3pXd0NWZlBWU2FSZDhEeitvRjFzRnMKLVlDei9LdXhxQmhMNVBraUN1U01mT1ZsUEE1bmlyam9rdE1GL2FmNXNhWnFoUHI1cnZyNjdaMU96Wm5WRHZXZTQKLURoRnJuOEVvTHJZNVlOSmhVd2ZJTm5acXlLYVF1OFRXNnA0Y2FMa1RDVzBLTSs0enRUZTc0eFJHOU5lRStLMCsKLTBSTXBBRjNqRVkzNkxHUmpxNm1pYXp0MmJWWlFEVGw2Q3VXRStnQWFGbFgyb2pWN2UxeGR4VnZwQklFYzM0TVAKLWc5T1JKMGV2eDFRaWxNdDFWeUdjUy9wZTRJUWdqZEpxalUvNGZ6cUZaa1Qybm50UU1iVjlrUXlOZTIrcWZxUDcKLWdpVHJ5SWFubUJBZmQzb09DVHNSejJWS1BmZGhDcUNSaVFCMUF3VVFNUmR6RUV5cjJHWnY0QUxKQVFFdWhBTDYKLUE4STg0QlIrODd1TkFIRDBaSmtUTTczV2R5TUVHdkFLQnZyWksvZzBWTFlqME50Z2tTdVJKZnJYbkdrdWgyN0kKLVpyamZMOTUyUS9tWGdNdEhoSkhKOVlmZW5HRldTRURIbm9sTnpLT3pUUUpwRTAxSVozbld2N2V6QTlOMUxaVkMKLWlRQ1ZBZ1VRTVJPcmRSc0lERVVuR2E4MUFRRVVOZ1FBbHZ5anQ1MzRSRFFkMkFZR29acmlhRnpqYUw3ZFRDUkgKLTRiMXp4dVdCTldmM3BJNFcwaXdVMDJRNXJFV0VtWTVETGw2L2llK3ZjUUtPV1NxWFZnbk0vczZFQVJkS0VONTYKLWQ2UHprd3N6Z2ZFeWJEWXJjQXhSZUpjVENjVjhJdEplci9pcXBCTGd0YXh5VXBJNzdOdktjREdIcDZCZ1lwbnYKLTFsTmtIMEZJU0srSkFKVURCUkF3dHpsV2RHeDdxSCtQVFZrQkFSRldBLzk5TlRDTWlobE9aUzdMbUhEVmljL3EKLUgxSzFEVmRNY3YwaUwzOSs3UHE0K0FBL0VUOGRXSWdjamFJcmVTcUFaVHBqd1UxcE1QYVdnZWNERDFyRU1DWVgKLVIrSm9vZkxKMjRCTGNTbHBYSi9nV01pZllOeHFkRGVNUmt3L2FXL2thWFFKV0l6K29EWU51T3lpNVZ2QjZmYUYKLTZMbTdQNWN3MW1YMEk1clljM3dvaDdRb1FtVnVJRXhoZFhKcFpTQThZbVZ1UUdkdmJucHZMbUpsYmk1aGJHZHkKLWIzVndMbU52TG5WclBva0FsUUlGRURFWGdDVWJDQXhGSnhtdk5RRUJpTDhELzNNTGpmSEd2dUJ5cVAxVkZRckYKLVFlTU5kMmFJUXVDN3lzM2xrRHZyTGtrUEpRQU51YTAvTWREYVprNkY1cENHY1RtbW1hSk9qY09jQ2hlRDdGVTUKLXc5enhrUUdSM1N3cjNvcEZIU3IvQ2tFbDgzalJ5M29xMU1GeWRXb0dhalFqSXIvYzIzWDh6citYbnRQeU82VlgKLXE1SGU0UnJUaVhlQUVGQnp6K0orUitFUQotPXpoMXUKLS0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KLQotCi1UeXBlIEJpdHMvS2V5SUQgICAgRGF0ZSAgICAgICBVc2VyIElECi1wdWIgIDEwMjQvQTk5Rjc1REQgMTk5Ny8wMS8yNCBSb2RlbnQgb2YgVW51c3VhbCBTaXplIDxLZW4uQ29hckBHb2x1eC5Db20+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb2RlbnQgb2YgVW51c3VhbCBTaXplIDxjb2FyQEFwYWNoZS5Pcmc+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb2RlbnQgb2YgVW51c3VhbCBTaXplIDxDb2FyQFJhbGVpZ2guSUJNLkNvbT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvZGVudCBvZiBVbnVzdWFsIFNpemUgPENvYXJAREVDVVMuT3JnPgotCi0tLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KLVZlcnNpb246IDIuNi4zYQotCi1tUUNOQXpMcEl5VUFBQUVFQU45S0M4Q3hUZW96UFlKanNuaEZwSjE0ZDRIaGYyTTZPVGdxUFFGUkhPc3dNLzNqCi1CN0lXMHMrSHdWeVE1L1NqSWxvKzh1cjlYN3lhajFGUzJHUW1LRDF4OUxLZUhSQW9vc0JJczMzb2tSdG9lRFJ5Ci11ZlRhVHlRVHdMa2x4Q2xXbTNKRWVmNHhaaW91bjFtdFdicHoweVZFT0NTWmNSdnRuSnJOUE1DcG4zWGRBQVVSCi10Q3RTYjJSbGJuUWdiMllnVlc1MWMzVmhiQ0JUYVhwbElEeExaVzR1UTI5aGNrQkhiMngxZUM1RGIyMCtpUUNWCi1Bd1VRTmlpWjJKck5QTUNwbjNYZEFRR2xnd1ArSkxsWnZOVi9mSjJhektJd2ppYkRhNG4yTFVEeGE3b2ZLYm9VCi1RTCtEN0ZEMjR6UWNtem1rQlFtL0JML0ZTVXR4WmFzSmt2ZFZiVTk4TjNHNGgzQzRBeUVyZlFPRmNyZXB5R0FCCi1NODhvblExRGJRNnRpVUEzZ3c5Z0lCKzJsMUM1Ujh3Qk90bHdvUkpNNEdGdmpqdFJwK0thUXF2TjNmK2xMTU10Ci1oS1lCNzBtMEtGSnZaR1Z1ZENCdlppQlZiblZ6ZFdGc0lGTnBlbVVnUEdOdllYSkFRWEJoWTJobExrOXlaejZKCi1BSlVEQlJBMktKbUltczA4d0ttZmRkMEJBVDN5QkFERURIQW4rKzc3bjdiTEEvdTlRWU0yTEJRSG5YZHc1SXM4Ci1ZR0hwSGNOWlZEQThDdFJUT2R1YjhyaGU5cWdzaWQvakVyeTBoVDlTeWdmeC9yeTVudGptRjEybHRueEJEUGRaCi11VTJEYUhhSWgvekJVQXYwaHlhUWVBWEVZaVY5Sjc1R3JEa1RqNUpycm5kNjIzdXlJUm9NWlBLWWIrb3FzWjRICi1qSWUvdytDRGZyUXRVbTlrWlc1MElHOW1JRlZ1ZFhOMVlXd2dVMmw2WlNBOFEyOWhja0JTWVd4bGFXZG9Ma2xDCi1UUzVEYjIwK2lRQ1ZBd1VRTmlpaWFack5QTUNwbjNYZEFRRm5Nd1AvY1gyMUtId2c2SUQ3Tm9HekVLeHNmWkUvCi1kRWdSR0hGcDVUNnZ6bkk5Zk85V1paMkhtSVNXakVqcmk1ekFBbVh2UUcybldFWUZWY0Yxb1dwaC9uZExnTHdzCi1QZklzWmlQWHBqMUxEN29vbjVQRVh2SmxrRmZwSERxaUc0eE9PUmJiR1dCY3Yxc3FreDZkamtwZnlYTG9NRDM2Ci01WWF6RnVLdXJIcFdQd0FRUkpLMEoxSnZaR1Z1ZENCdlppQlZiblZ6ZFdGc0lGTnBlbVVnUEVOdllYSkFSRVZECi1WVk11VDNKblBnPT0KLT1rV2RpCi0tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi0KLVR5cGUgQml0cy9LZXlJRCAgICBEYXRlICAgICAgIFVzZXIgSUQKLXB1YiAgIDc2OC9BMEJCNzFDMSAxOTk3LzA2LzAzIEppbSBKYWdpZWxza2kgPGppbUBqYWd1TkVULmNvbT4KLQotLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi1WZXJzaW9uOiAyLjYuMwotCi1tUUJ0QXpPVWtOTUFBQUVEQU5aZFRVSlFQd3JGSTk1MjZRZitERVdMOGRYZ2ZoV1c4bzZDemV3ZGNDb0hZRXB1Ci05Q2lPTUQzZjliZ28xVm96T1BjZUd6Q3UvOUZGMmhNTFV2VnNUQVprekMzcnJlNVR0UG8vdk9mNUhKK2FjOU03Ci1hcXhXK2dSdTIvOTBvTHR4d1FBRkViUWZTbWx0SUVwaFoybGxiSE5yYVNBOGFtbHRRR3BoWjNWT1JWUXVZMjl0Ci1Qb2tBZFFNRkVET1VrTlJ1Mi85MG9MdHh3UUVCOGlFQy9pOVFvNTVUbFQ4YlJwY3FlTTNsek5EcXpVOWNxS1JmCi05WDhwR0pJVkU1bTJKUG05OXFQTHM4UlBlZXBMQ2hpOFpaKzJoU2ZiN2xkUWh2VkxnTnFRcUxwc2pHdEpqSk9VCi1DK01yS0RlU2syV0FpY2c2VW8wRldDc0VIeHJzc3cxMzlBPT0KLT1wd2ltCi0tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi0KLVR5cGUgQml0cyBLZXlJRCAgICAgIENyZWF0ZWQgICAgRXhwaXJlcyAgICBBbGdvcml0aG0gICAgICAgVXNlCi1zZWMgIDEwMjQgMHgwOEM5NzVFNSAxOTk5LTA0LTE0IC0tLS0tLS0tLS0gRFNTICAgICAgICAgICAgIFNpZ24gJiBFbmNyeXB0Ci1zdWIgIDIwNDggMHg0Q0NEQjQzMCAxOTk5LTA0LTE0IC0tLS0tLS0tLS0gRGlmZmllLUhlbGxtYW4KLXVpZCAgSmltIEphZ2llbHNraSA8amltQGFwYWNoZS5vcmc+Ci0KLS0tLS0tQkVHSU4gUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQotVmVyc2lvbjogUEdQZnJlZXdhcmUgNS41LjNpCi0KLW1RR2lCRGNVbDlRUkJBRGw1dEY4a09EMHVkZGxubDlxc2FHNzAvaHd1akdUc1NYQVRucW9Mc2VUc1dPUm9WWGYKLW9Ca2xva0VBR21UMitDbDhYSVhaMzFXaCtHYUozQ1RiRXY4T2sxdmFwT3QrbHRQZ09LelpFQjR1UDI1RWJoQzIKLUxXZitsVW9hZmNkMlhpMEtCVjRmcVhxRUV1REdQMVRBZFo2azdOVnFncGp2Yko1VGRxTDBMcldPT3dDZy8wYjQKLSsvcC9hdlFyK3VaUlUycmRtWXUvYi8wRC8yTG5qY0VxVWpzc2xoMmU5bTBPZ0F1K2duWUFtUUg2RGJucCtpS2wKLWpmZldQQ2h3SU1GWmQvN0ZuR096WUR6b3FuelRGeUE0VkU1UEhXTDYxVjJscEhKV0IyMUs5RDZyYkVjeDBpWUIKLUFISHhaUUVteFNCVTZQbUduYkYrMlA3dkMwSno5Z1o1ZENianRHYm9ZeGQwMC9YUWxad0NzOGpIdWVUcFNmeDkKLW43ZFlCQUNGcFcrdjJwU2xHMFJlaVM2VWx0M2dhR1dpdzgxRDBuRlZ2Q3A1Qmx4Z1FEeW15RjFNUzZGYkNqL2cKLUZHSUxvc01obHNJSFRGYUMwREQwTFNYeU4xcm0weWtQdmkrdlVMSWxLTkp3VzdmQ2krMzNqMUF6eCt6Zk1OZU8KLVQ1dnFBZkY2Y3ZzWjZxUGI5Q2NZdlU0akVLdmtvdkExVTNqTUZlaHFjR2tUVjVzZnZiUWVTbWx0SUVwaFoybGwKLWJITnJhU0E4YW1sdFFHRndZV05vWlM1dmNtYytpUUJMQkJBUkFnQUxCUUkzRkpmVUJBc0RBZ0VBQ2drUWl6cGcKLUh3akpkZVUvOEFDZzNtdFllckE3UU4vOE9rcDJJZ0dyK2dlNHlLZ0FuMDlSWDVVUjhEeVoxL1E4T0Zhc0U2VDYKLVRnMlV1UUlOQkRjVWw5VVFDQUQyUWxlM0NIOElGM0tpdXRhcFF2TUY2UGxURVRsUHR2RnV1VXM0SU5vQnAxYWoKLUZPbVBRRlh6MEFmR3kwT3BsSzMzVEdTR1NmZ01nNzFsNlJmVW9kTlErUFZaWDl4MlVrODlQWTNienBuaFY1SloKLXpmMjRyblJQeGZ4MnZJUEZSekJoem56Slp2OFYrYnY5a1Y3SEFhclRXNTZOb0tWeU90UWE4TDlHQUZncjVmU0kKLS9WaE9TZHZOSUxTZDVKRUhObXN6YkRnTlJSMFBmSWl6SEh4YkxZNzI4OGtqd0VQd3BWc1lqWTY3Vll5NFhUalQKLU5QMThGMWREb3gwWWJONHpJU3kxS3Y4ODRiRXBRQmdSalh5RXB3cHkxb2JFQXhuSUJ5bDZ5cFVNMlphZnE5QUsKLVVKc0NSdE1JUFdha1hVR2ZuSHk5aVVzaUdTYTZxNkpldzFYcE1nczdBQUlDQ0FDRWh6Y1JHRWMzeTMvNFlOYUcKLTg5Rm10SVJwRlU1em9hWnh4RHJtVWlTMUhkaHFGeWt2OG96YVR5amZJbUN1aHE4aTZERzE1b0d1ZHhQbWE3RXkKLXNDY0EvcW1RRUJWclhGSzJEWVRGVzNVblB5cWlFODIycGxvMGQ0NXUxY3NLelB2R3BIWVZHQzRIT0VLQ2doUnkKLS81NG5IMGZzS1YzVlNsSVhBaFJHM0xJc3R6QXRzbHJTWUVMVzFMb3Y1M0dLK1lacFJESlRiTEF4aklZQjhrRVkKLWhpUVl6SG0vY2JCZVJwakc5QnBvQlFoNTRkTk9qMjJDVThIQzRLdlpTbkRjTEF6bUR5clFGWEZmZmZ2SnRRNysKLUhIMmlJV0tNRk9qcFJIaDJaSzZ1aEpiMDNZby92K2FkbUtzMUhTRUZkVjVWSlVDa3F5bWhLVDBPaVduWG1OSHEKLVFVZmxpUUJHQkJnUkFnQUdCUUkzRkpmVkFBb0pFSXM2WUI4SXlYWGxNRTRBbmlvZ01lVjNZTE5mNkMxWTIrazgKLUYzcnQwUy9PQUtESEYrd2Z4TER6Q3hzb1Fid2VzSVVBS2diN0hnPT0KLT1tclhWCi0tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi0KLVR5cGUgQml0cy9LZXlJRCAgICBEYXRlICAgICAgIFVzZXIgSUQKLXB1YiAgMjA0OC9ERDkxOUMzMSAxOTk2LzEyLzI0IHNhbWVlckBjMi5uZXQKLQotLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi1WZXJzaW9uOiAyLjYuM2lhCi0KLW1RRU5BeksvUVpJQUFBRUlBTHJzRWp1R2x0NndrSHk4Zngyd1BTa0g3cGFBcUpIRENiTzFXL0dNVnM0MUJzSDEKLXhweUJpOWxPdFVYSHNEQzhPYngvVEVTNC94VlBTc0ZLUFFMYTlRL09zeGpYbUVQQnZRNVBaZE9YSjV6bVJNSTEKLTFjZlVwMnM4dzZpK0lTNjhJV1JLZFBNc2hHV0ZHYXIxWVVQTTFVcFZNRTdVK3VHRDN3Z2RDNERyVkpIelM1RWgKLWdFRHlROUZQYis4Q3BzUk8zQXZVUHpzWkdHOEl5LzlHaUx6bWFKRzM0elo1ZnY1WDdzcjg5eGlXSjIxZWhrK1gKLWVQTzlrdnErbnpmT0NDSzZhM0daRDRnM0tKWC9QbTNvS2VhWGVMOFdTQ0NQenBOYnRSSmszb2ZlTjdabTFLMEwKLXlDaFBpeXVpK09PMDYzL1dBU3Y1MmJ4VUlsbXpiWDgyYTkyUm5ERUFCUkcwRFhOaGJXVmxja0JqTWk1dVpYU0oKLUFSVURCUkF5djBHVGJYODJhOTJSbkRFQkFmcVZCLzlHU3pBRElWcVkwZmFGT0xONitFM3FxZzNoUFJMQnZqZ0MKLTVjdlRsd1Q3VzY0ekkrYWlTWnVOK3hBWHErM2xuS3Rtem40NUYzaEQ3Z0J4UlBKYlNLc09ibjJ6VTRVY3FXL28KLXFvaVlFbk85RWhvQm9td1BVYlZ5OEMwMENXdkRMZmVGNEw1cisyb1hnaWxUc0NvalNhV0pYMFFvUEN3UlFhbzEKLVl3WjZDcUFBNzh2ZGJCTmttQTBXclBzVnF3ZDNpamdGYXBjWDY3MUFxaVQrcERidks2NDZJNnVHUFhKek4zWlUKLXZGdURpbTlEMnVOazlDZnZQaEtHc2NyNHFxUDQwVG5ObjVmalNzbXJGeUZ4WXNkd283STRURnBuc0VQT3cyMjYKLUdVK1RSN3pkd25CeVA3MkF4UEVCSi9GMjJMd055cmV1cGgrZlJwV0NuQ2YrOWdWVzlIZWgKLT1qUzVaCi0tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi0KLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJvYiBIYXJ0aWxsIDxyb2JoQGltZGIuY29tPgotCi0tLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KLVZlcnNpb246IDIuNi4yCi0KLW1RQ05Bekc2VmZNQUFBRUVBT3Z0dnBoRkcvRDAydkdMRU5CbDVPVlBnRUpnUDlFMXhoVWdLVFpuSnN0djMwa0QKLWgxSXFlSUJrRUF5NWJwS2FwQ2J2dnh1a3lRRXJoQjBlZlRpMnY1eVRBbHo1cFZqZ1dNNVNhOEN5VFhKbVhQSEgKLUV1T2Z5MURxYWlRU21aNktXWDB5Z3czZ0tEWk1pTk1mMDZVVVJMTFl0UmxHS1NZWTNXVmoydTJVQ21TOUFBVVIKLXRCNVNiMkpsY25RZ1NHRnlkR2xzYkNBOGNtOWlhRUJwYldSaUxtTnZiVDZKQUpVREJSQXg1ZUlBWldQYTdaUUsKLVpMMEJBVTJYQkFDWGZvcE16QzhrVzNLRXFxK045Vzlma0dOZ3kvLzhYcVE3N0ZtZlBRUGJPNFg3Wm4zY3lPNDYKLU14dlBQKzkyelN5TjNkeWoveFdaWW9STHdsbCt5bmM5ZDRLVUZ3S3c0NURBTEF2ejFDS0hNT3BRUEQ3ZElXZEUKLTlwb0pRcmNiS2VPcUxjR1pUdS9oWTkwZ1dCVVorKzl1bVI4WDhseWgvV0VnY1VvbGZnWUhldz09Ci09dXBZaAotLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQotCi1UeXBlIEJpdHMvS2V5SUQgICAgRGF0ZSAgICAgICBVc2VyIElECi1wdWIgIDEwMjQvNjMxQjU3NDkgMTk5Ni8wNi8yMSBSYW5keSBUZXJidXNoIDxyYW5keUB6eXp6eXZhLmNvbT4KLQotLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi1WZXJzaW9uOiAyLjYuMwotCi1tUUNOQXpITEJTOEFBQUVFQU5HRlhiOW8wTlBWZlZqU0x2UWgxajNmTjZjTWVWTkE1QkdVSjZIWkdQL05EeFRFCi1pOGh3ZWpKcWFra1U0dXgvZzZLcWNrcngzaDhXUjdPWFpaK1I4Q3NBMGJnOVNyNDJuZEVRQ1VJU2dBcmcrbFhaCi1nUlVuaUFSUFBBN3RhbVRTcTh2MW1ueHF5OXMyNkh0MnJBRzJENklpSy83djBKbGV6S2lyRGVCakcxZEpBQVVSCi10Q0ZTWVc1a2VTQlVaWEppZFhOb0lEeHlZVzVrZVVCNmVYcDZlWFpoTG1OdmJUNkpBSlVEQlJBeHl3VXdxS3NOCi00R01iVjBrQkFlZ25BL3NINjNXeWZ3TUZtbjNuV2U4VC81SVhPL1FrTVlvTUdMUzFpN0l4TVk5TzhCVnZLUU0rCi1veEVjSmRGQUc3elBaa3BnS3pUQnhtRXh6NWhNWjlod0o0MlhocnNsV29QN0pWdkFESmNkdGhyVUFZVzlXK2p4Ci1HY0RZQVczcVc1RHBLc1FjaGZ2WHE5UU9CRHhQK0tiYmUyQjh4R0V5R1VoTGthY0lTRlRySWhoUVNnPT0KLT04UDhzCi0tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi0KLVR5cGUgQml0cy9LZXlJRCAgICBEYXRlICAgICAgIFVzZXIgSUQKLXB1YiAgMTAyNC80OUE1NjNEOSAxOTk3LzAyLzI0IE1hcmsgQ294IDxtYXJrQGF3ZS5jb20+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJrIENveCA8bWNveEBjMi5uZXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJrIENveCA8bWFya0B1a3dlYi5jb20+Ci0KLS0tLS0tQkVHSU4gUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQotVmVyc2lvbjogMi42LjNpYQotCi1tUUNOQXpNUlkvSUFBQUVFQU9sb1RPVTBmNHc3RkRSTU02a0EvNlhhelh4Si9ISDhkc21iNkU3UnVZZlZsWHNkCi1rQ3d4VUJPa3lXK0FZaGtIYllVd25CNXFCb0ZVeUxyYkxHdXdLSFcxS25Bd2diZVpMVEg1bnFRTHBBMFJMR1ZaCi12M3R6SW1LVWR5eXhCcGhaV0M0SWVFZ1VibDljYytwaU9zRUo4UXpGN2ducXdXby9LdTZ0VFAxSnBXUFpBQVVSCi10QmROWVhKcklFTnZlQ0E4YldGeWEwQmhkMlV1WTI5dFBva0FsUU1GRURRdllUSHVyVXo5U2FWajJRRUIvaE1ECi0vaXg2cEFhKzRaZ0ZRTlJBYzdmQytJNHVHV3ZYb0k4Tjh3dGdpSmkvLzhLYzF2anR2VHlsTFBLVkJEc3kxaWhzCi1iVk9qRDNOVUVrSDk1VE5JM1FoVmVDd0pQbDJlM0dnRmwyNTNoajhKYWk5c25Iajc1cFhqUVhxME54US9KUlNyCi1FQXFyRk03K3lSTFBzN3pEd3NNb2MyT3g1ZW1xNGpvVmEzc3laVUV3VzdMeHRCWk5ZWEpySUVOdmVDQThiV052Ci1lRUJqTWk1dVpYUStpUUNWQXdVUU5IS2xCTzZ0VFAxSnBXUFpBUUVBOFFQOUhTalZNTG9oZk9WTzB0SGNMUkRCCi1lRGZuUm5CeGdUZUY3UDJ1OHFCK2VPZUxxQnpITm1FL2dST1d1WlhPcGt4ZUNxVDBHRzNvWHFtU0VtVk90RHNKCi1LOTJzS3Z0VGRKT0FHcTk1VVFJM3QxSXg2aU5Ia1ZKZm8xMVJrSnlVMmlMNlhGUjE5NTNuUzMzeEtHZGJVNnY3Ci01S1ZDdTNKVGUxa0RFRE95TVZEZFJtVzBHVTFoY21zZ1EyOTRJRHh0WVhKclFIVnJkMlZpTG1OdmJUNkpBSlVECi1CUkF6RVdQeTdxMU0vVW1sWTlrQkFmTjVBLzQzU2RBTnMvTlo2b3V5eEF2S0VXU1BEbk5rSEkzclNQeW5ibjdvCi1rU3J0RmVDUTNWd2UwQjBma3N6QkVBWjl6Ym54L3MvMUxLbnJpVWZ5emhkWmhKZmtaZnhnRHd5NnM2c21hZ1lXCi1zbXovTEZhZUR6RzNFajIwVlNlNmdoc2VxY1BzY0pMMDZQVWcxM0xKQzRMRmxnWWNDREVlR2w4MU5tMzdmZTB4Ci1JVWhsTkE9PQotPWs4dlAKLS0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KLQotVHlwZSBCaXRzL0tleUlEICAgIERhdGUgICAgICAgVXNlciBJRAotcHViICAxMDI0LzJGOTBBNjlEIDE5OTcvMDIvMjQgUGF1bCBTdXR0b24gPHBhdWxAdWt3ZWIuY29tPgotCi0tLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KLVZlcnNpb246IDIuNi4zaWEKLQotbVFDTkF6TVJzQjBBQUFFRUFLajJYWVlFR2NaaFQ2OXg0Z3NrUTN4eitLTVRMbjdnS1NxcWN5eWVpbkowWmpMbAotNkFKamIxLzY4bkdzRitJSVkrSUpTKzVzbXE4ZG8xcXBDM1VaY213NDIzU2c4RjcxR2VxRE80SFpYT0FPaWVWeQotcnBWczZTNVRhWGxKT2NyQzd6WkN4K2lxbDk3K3hKRmpVR2trUzdqL2pJa3gxQWFqek1Oa1NyMHZrS2FkQUFVUgotdEJ4UVlYVnNJRk4xZEhSdmJpQThjR0YxYkVCMWEzZGxZaTVqYjIwK2lRQ1ZBd1VRTXhHd0hjTmtTcjB2a0thZAotQVFHcmlnUDlGNDN6YmlPaWdZZWwrSkNNaUIwSEsvVWRxU3JmM3hXeEhJS1dLTmhRTmpobnllRitqS1F3RmxkNgotN0tRWXNxWklwSHNXTFdtU2swQW1LUU9VSXcrRHhjbER4QkwyZFQ0cCtDamdUZ0lBY2J2UHBhaFdrQkF3L0UrYwotRUdUaVliZStZM3NISmhoUCtkMFRPTG1zRVRHOXRwaTdnRlo2RmZOY1dQeEZNZHhHcmY0PQotPTBqUVcKLS0tLS0tRU5EIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KLQotVHlwZSBiaXRzL2tleUlEICAgIERhdGUgICAgICAgVXNlciBJRAotcHViICAxMDI0L0JBMjAzMjFEIDE5OTcvMDYvMDUgQ2h1Y2sgTXVyY2tvIDxjaHVja0B0b3BzYWlsLm9yZz4KLQotLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi1WZXJzaW9uOiAyLjYuMgotCi1tUUNOQXpPVzdtb0FBQUVFQU1ZWmxOT3hXQ2pMUi9Qb3NhZGJHK3hzckIydW5pZDJMaVlvYWtURmlESUJhWmp4Ci1idTZoTm1WWlBZZktPWFFjcXJDdTBFWTN1VkxQL0w4OWJTVDVwZklaT3p6OEdUbTMzenJFVGdmenBYWXlGZGJYCi1lWjV2YzZhYTMrN3ptSTdoL2FVNTY3UDlydUIyQy9SQkxsMUE1OXdtUFJSVnZqRUlBa0k0YkFPNklESWRBQVVSCi10Q0JEYUhWamF5Qk5kWEpqYTI4Z1BHTm9kV05yUUhSdmNITmhhV3d1YjNKblBnPT0KLT12VWRMCi0tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi0KLVR5cGUgQml0cy9LZXlJRCAgICBEYXRlICAgICAgIFVzZXIgSUQKLXB1YiAgMTAyNC8yNkJCNDM3RCAxOTk3LzA0LzI4IFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+Ci0KLS0tLS0tQkVHSU4gUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQotVmVyc2lvbjogMi42LjNpYQotCi1tUUNOQXpOa28vUUFBQUVFQU5aMmtwTi9vTWt6NHRxenh2S1Bad3MvWHdzRDBZK0U1L3k3UDJESXc0dUhTLzROCi1zeVFiZ2tkclpoUEJsWER2NjhEUWlvSFhXc2I5MDRxeXI3aVpCMUxDNUl0SzlNZ3FsSytaMm12UHFzR2JITThKCi0rb1lpYjhrZjJ6SjZIdnJZclA3TllCMHROOVlZdW0ySUN0eCtoSWk2YUtHWGRCMUFUQTVlcndZbXUwTjlBQVVSCi10Q2xTWVd4bUlGTXVJRVZ1WjJWc2MyTm9ZV3hzSUR4eWMyVkFaVzVuWld4elkyaGhiR3d1WTI5dFBva0FsUU1GCi1FRE5rby9RT1hxOEdKcnREZlFFQktWb0QvMksvKzRwY3doeG9rK0ZrdUx3QzVQbnVoLzFvZU9ZSGlLWXd4MFozCi1wMDlSTHZEdE5sZHI2VkQrYUw5Smx0eGRQVEFSelo4TTUwVXFvRjlqTXIyNUdpZmhlRlloaWx3dzQxT1ZaQTNlCi1jTFhsTGdkYTErdDB2V3MzRWcvaTJiMGFyUVFEYUlxN1BlUmRqZEVEZ3duRzR4QmFxYUFxZmd4d09YSitMUFdGCi1oaVhaCi09SzdsTAotLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQotCi1UeXBlIGJpdHMva2V5SUQgICAgRGF0ZSAgICAgICBVc2VyIElECi1wdWIgIDEwMjQvNDVCOTFERjEgMTk5Ni8wMy8wMiBEb3VnIE1hY0VhY2hlcm4gPGRvdWdtQG9zZi5vcmc+ICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tLS0tQkVHSU4gUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQotVmVyc2lvbjogMi42LjIKLQotbVFDTkF6RTRsZXNBQUFFRUFLSllTMXZMMmlCM293d2laZEN4cDNKeXZTTmFDN2gxcDJqUVhjSnZZMTBncXlabQotVmZmRHdGb1N2Sk0xSmRDeDNvMW1iM0pwWjJPVFY0U3JERGt6Y1NwVFhlbGd5aDdrOU8zSEI3b0c2cEhUTUw5ZwotRHE5Wkt5ZFNoTUl2SUpvczdLdUxXb00vZWVlZWp0a3Y3ci9nV3NHSEF5S2JUOGZzM3I3bmxteEZ1UjN4QUFVWAotdEI5RWIzVm5JRTFoWTBWaFkyaGxjbTRnUEdSdmRXZHRRRzl6Wmk1dmNtYysKLT15YVI5Ci0tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi0KLVR5cGUgQml0cy9LZXlJRCAgICBEYXRlICAgICAgIFVzZXIgSUQKLXB1YiAgMTAyMy8xNjM3NTFGNSAxOTk3LzA4LzE4IERlYW4gR2F1ZGV0IDxkZ2F1ZGV0QGFyY3RpYy5vcmc+Ci0KLS0tLS0tQkVHSU4gUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQotVmVyc2lvbjogMi42LjNhCi0KLW1RQ05BelAzMFFnQUFBRUQvMWs4aFBLc0pqOElsL1RmaFAxSklSR3duWHV6ZlEvZXR2K01aSk16ZU5lS2E4T1gKLUt3MGQ0ZTFTL0tkSitBWndXUXAzWk1Eb1gyZ2haNzlYNERERExFQWMvRm15MEdnOHQ4OUNQK3hKazdiNEVIamsKLUY3SFg2OUJSSnAzT240YVJUWFJORDNXdmlxRW1uNXBwemJCa1RlbkY5V1d1ZExSYnFyYzRObm9XTjFIMUFBVVIKLXRDQkVaV0Z1SUVkaGRXUmxkQ0E4WkdkaGRXUmxkRUJoY21OMGFXTXViM0puUG9rQWxRTUZFRFAzMFFtM09EWjYKLUZqZFI5UUVCOVZRRC8wK3p1bUZqMXp6WVoxK2JTOUF6MzZnaWpEVWI4cmxFVmYvbEJTaHg0VkV2aGE4ZnNSUnkKLXZrd25tSnl1cFl2R3RyU0lZQXdCMFZLK0daUFphN1hmWnZVQ004M0FaWTl2R3BFMEx3VzJWY3o5a1daZEowdCsKLUI3ekpFbG1CVXJtajlhVzZJQ21TTmJPQndWbzFZN2hnNmxQU0ZGTU9PRUNGcFQxV3VUWFhZcE5BCi09S1djRgotLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQotCi0KLVR5cGUgYml0cy9rZXlJRCAgICBEYXRlICAgICAgIFVzZXIgSUQKLXB1YiAgMTAyNC9FRTY1RTMyMSAxOTk4LzEwLzIyIE1hcnRpbiBLcmFlbWVyIDxtYXJ0aW5AYXBhY2hlLm9yZz4KLXNpZyAgICAgICBCQjFEOUY2RCAgICAgICAgICAgICBjdCBtYWdhemluZSBDRVJUSUZJQ0FURSA8cGdwQ0FAY3QuaGVpc2UuZGU+Ci1zaWcgICAgICAgRTI0NDkwMTkgICAgICAgICAgICAgTWFydGluIEtyYWVtZXIgPE1hcnRpbi5LcmFlbWVyQE1jaC5TTkkuRGU+Ci1zaWcgICAgICAgRUU2NUUzMjEgICAgICAgICAgICAgTWFydGluIEtyYWVtZXIgPG1hcnRpbkBhcGFjaGUub3JnPgotLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi1WZXJzaW9uOiAyLjYuMgotCi1tUUNOQXpZdmF3Y0FBQUVFQU8vbExPUVZZc1VTK2w3eWFuK1J6cjBlaGZXUnFsZ2VOc1Y0RFEweFR1UWV3RDlLCi01bG03dWpSd3V0eGxOYWY1ZFhqRTI0bWxzaVJOOEtEcCtmS3dtN1d0cXY0OTB4bWh6Uy82eThla3dCMDJQNGZpCi0vSkpOWDFQYkxTMGNMNitiejJkRnFMRGhoMDNPdnozRzE2WTloZTVtckoyUE5PV2E5RGZqOUYvdVplTWhBQVVSCi10Q0pOWVhKMGFXNGdTM0poWlcxbGNpQThiV0Z5ZEdsdVFHRndZV05vWlM1dmNtYytpUUNWQXdVUU5rY0FiVVM0Ci0zZGE3SFo5dEFRRlVuQVArUHJLYTNZRktwOVhUckFObU9SZXg0a095TnBNMWFkUzh6TTZiVGNIeUlrSDRXaXRCCi1iMm5SYnFPZE91U3diaDY1NWFTU3RsdUl4WTY2Q1ZhbGVMKzZFN01DRXFRL1VsenpNVm1kYk15V1NZd0Rsa1YzCi1nUWtnM3ZFNmJnRmxXbExMcjJIbmtsbFkzSVNFQ2hEV2g4eDdmUktMeSs4WkJHVzg5WlhPR2toSWI5bUpBSlVECi1CUkEyTDJ1ZUt3TERSZUpFa0JrQkFiZUdCQUNLTTFGQ21RQzU4My9JSHl3N3JEbHZuc1pLZUt2ZGJiTEdTbm1KCi1OV095ZjRWZ2tDOE9DS213UG5XTE9PSUs0NC9Kc1QyWW9uaWgyciswNEZCcVlvNlNzTWdCcU9CSnFLa3RIdnR4Ci1iRDNWZlVVa2tWOGtaNGl0dWVjV1R4MHpqMU9hMFFpQ2l2OEhIdmRzbVFCMG1qMDdtV1F6MUNhbVhQU3dIWW4rCi10K2ZKT0lrQWxRTUZFRFl2YTJjMzQvUmY3bVhqSVFFQmNOUUVBT3J0NCtvMkx3Y0NpSnAzYk9GOVdaTWlycE1RCi1RSklTcVhCbm9tM3IyZUIrazFhL0ppZzFzZVBTelB4bmVXOUVnV0lyV2cwRWZLK3Uya01ndlRKeW5EVXV4OXpMCi00cW5FQ21aVCtFU0VtK1A4clBLZWVjT2ZVSGdEalFsVFVDbmVPWDVwMFRiZHZKbStUY0pWalhqb1ZyWXY2aFpnCi1Jbll3K2psdkY1ZS9zZEk4Ci09MDNMVQotLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQotCi0KLVR5cGUgQml0cy9LZXlJRCAgICBEYXRlICAgICAgIFVzZXIgSUQKLXB1YiAgMTAyNC9FQzE0MEI4MSAxOTk3LzA0LzEwIERpcmstV2lsbGVtIHZhbiBHdWxpayA8ZGlya3hAd2Vid2VhdmluZy5vcmc+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJrLVdpbGxlbSB2YW4gR3VsaWsgPERpcmsudmFuR3VsaWtAanJjLml0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyay1XaWxsZW0gdmFuIEd1bGlrIDxkaXJreEB3ZWJ3ZWF2aW5nLm5sPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyay1XaWxsZW0gdmFuIEd1bGlrIDxkaXJreEBkZHMubmw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJrLVdpbGxlbSB2YW4gR3VsaWsgPGRpcmt4QGJpZ2Zvb3QuY29tPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyay1XaWxsZW0gdmFuIEd1bGlrIDxkaXJreEB0ZWNobm9sb2dpc3QuY29tPgotCi0tLS0tLUJFR0lOIFBHUCBQVUJMSUMgS0VZIEJMT0NLLS0tLS0KLVZlcnNpb246IDIuNi4zaQotCi1tUUNOQXpOTk9zTUFBQUVFQUptd2F6UmhOSkI0bVFrdnAwcnJ4TGtlT0F4UjlmR0JYZ0pOYTZISGRMdjdZSHd4Ci1td01vckhZRENBTXlwTzF5dXpuTlRhTVZUMXozY1MreXFoT2tUVnh3TkkxbXhXNlp0czFrT0pCOXBXdVUzM3NrCi1zVXVDa0xIWE1neXZQOWNtczZnY1lnQjVnM1VQNk0vYVE0VDAxNytHay83Y3JsSDg3REdtUFpic0ZBdUJBQVVSCi10Q3hFYVhKckxWZHBiR3hsYlNCMllXNGdSM1ZzYVdzZ1BHUnBjbXQ0UUhkbFluZGxZWFpwYm1jdWIzSm5Qb2tBCi1sUU1GRURSWjUrMHhwajJXN0JRTGdRRUIvS0FELzF4bmlGTkxIcCtqeElWckVMNkhjSTA2UVpVWVB2UnVhcldxCi0zYUkyZ2RlWGVqNTlSeTk2TU9vMk1VM01zdVErd1crNmdFSkF1eUNwMmp5WWZ6Ri84d2luTmNGV2M3MzhzL2hYCi1mUllDSmU0YnZ0TWNuaEJWN0dBbFRneXcwMGZjcm5hSmFRODExK1F3S25adlhYV2IrUXVvWEM0ZGRUb24yNXc0Ci1YSExqdERaSHRDeEVhWEpyTFZkcGJHeGxiU0IyWVc0Z1IzVnNhV3NnUEVScGNtc3VkbUZ1UjNWc2FXdEFhbkpqCi1MbWwwUG9rQWxRTUZFRE5OT3NNeHBqMlc3QlFMZ1FFQnpXOEVBSXRBRWFldUl6UElWbEtPazFMbkhsWWM0RnlXCi1haU5KQzIrclJtZnRZdTJiSXAvSkZ1WHUzeEMwVTBieXlIdTBwK1kxcGNBbnQyWXJxbVlVZk0wZDJjeDFiNCtMCi04UlFSNFNHS2hxOWpXS1MzaWNmS295TW5HaUQyQ2VJOC9YeDhWNmI4WGcwUXFzZGxTMGt6Ly9xR0NEV016MHZpCi1veHphc1ZFdkZqcUFzZTAzdEN0RWFYSnJMVmRwYkd4bGJTQjJZVzRnUjNWc2FXc2dQR1JwY210NFFIZGxZbmRsCi1ZWFpwYm1jdWJtdytpUUNWQXdVUU5Gbm4xREdtUFpic0ZBdUJBUUUwdkFQL2FPYi9yWHNFMjU2dHBpMCtDUnA2Ci1jZDliMW9CbXc4OTRVSytDZjREZU5IV2VoUFdKb2c0eTBlTkZVY0FNZExJZHViRHpjNktmeHc1UXlKdDJFQVhyCi0wNVh1SjJESmRHMjRTL2FQekdxKzZWekw3TnE3cHlsWHVockFDVGdlZXNhY2VFcFVkL05lT0NPeXpOUjdpOHFNCi16YkdGdFU3ZkgxaXBmSmpONmZYTG81SzBKRVJwY21zdFYybHNiR1Z0SUhaaGJpQkhkV3hwYXlBOFpHbHlhM2hBCi1aR1J6TG01c1Bva0FsUU1GRURSWjU4RXhwajJXN0JRTGdRRUJHUndEL2pkVWpDSlhGY0FiangzWTJwV1VrUjdDCi1od0pUb2hNMlR2aEZwODBGZmJoaDF4VDk2MVhHdUhMNWw0MWZSQUlnOUZFSGpRS05WZlhlaXNMSDY4UWg3M2NGCi01eHVORTZjMXgxVlNxZkRMbDlmWFo2VEEzNXF0MEc1OTlUNjdqbVZhaTRGL0xqSFdESTFPNlV2UFJ1WkUzTzdtCi1lUmFDZmJQTEFKMXp0RnVqdFMzYnRDbEVhWEpyTFZkcGJHeGxiU0IyWVc0Z1IzVnNhV3NnUEdScGNtdDRRR0pwCi1aMlp2YjNRdVkyOXRQb2tBbFFNRkVEUlo1NlF4cGoyVzdCUUxnUUVCdk9FRC8xTGhoUFA1T2tlQ0NFTVZubXlaCi1qWmV4enY2WE9IMkk1cUgwaXVvenNJOTg3c1NLK3pmdjhPMHdFQndqVU9RcUJ1emx2aktJbVlRL29xUjg5ZWdRCi1BaW5QYzR6MWIza2dlR3lxcm10ZWE2U2NtcEt1ZmNXVUJiaEgwcXNYRjQxZVUzQXJLWTRrQjl6blYrL1BhY0NlCi1Wck9EOHJvRmF4SURaMm5XOUZTMG1yaU90QzVFYVhKckxWZHBiR3hsYlNCMllXNGdSM1ZzYVdzZ1BHUnBjbXQ0Ci1RSFJsWTJodWIyeHZaMmx6ZEM1amIyMCtpUUNWQXdVUU5Gbm5qVEdtUFpic0ZBdUJBUUVhSHdQL1EyUnM2TUl1Ci16OGFsbC94aWxkRk9QZlJBWDczSW53QmVJbnIxTzRVVTRsNnlXUnZ1TGtnK202TzhlSlNIbzIxU05aQkN1OWdNCi1Gb1FzZDBqVk9pdFVyOCt3MldreXBCbEpvNXdsMW5Ddy8xc0xVNEF4dEJiMGp5QUR2Snp4RkNlamUvRmt4RXZzCi02WTNlTHhwSlJCeWxiZzZLRk9zbVNZNDZEeUdjNDlCNmNabz0KLT14VXcvCi0tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi0KLVR5cGUgQml0cyBLZXlJRCAgICAgIENyZWF0ZWQgICAgRXhwaXJlcyAgICBBbGdvcml0aG0gICAgICAgVXNlCi1zZWMrIDEwMjQgMHhGMDhFMDEyQSAxOTk4LTAyLTE5IC0tLS0tLS0tLS0gRFNTICAgICAgICAgICAgIFNpZ24gJiBFbmNyeXB0Ci1zdWIgIDIwNDggMHhEOEY4MTI1QSAxOTk4LTAyLTE5IC0tLS0tLS0tLS0gRGlmZmllLUhlbGxtYW4KLXVpZCAgRGVhbiBHYXVkZXQgPGRnYXVkZXRAYXJjdGljLm9yZz4KLXVpZCAgRGVhbiBHYXVkZXQgPGRnYXVkZXQtZGpnMjBAYXJjdGljLm9yZz4KLXVpZCAgRGVhbiBHYXVkZXQgPGRnYXVkZXRAYXBhY2hlLm9yZz4KLQotLS0tLS1CRUdJTiBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi1WZXJzaW9uOiBQR1BmcmVld2FyZSA1LjBpIGZvciBub24tY29tbWVyY2lhbCB1c2UKLQotbVFHaUJEVHNDSmtSQkFESm1EVWlKTDB4VWF4ZzB5dzcrVnFxRlVMNnNqV3haZVo3a1FaczRkeU4zUjFpbEJVRwotS21PWEU2cVNmYjZQaTBxRW1nQ3oxSzdnMUthZ2xNUnJwQU5ZNGgxQ2p6aUVWbVRINXMzb2N4ZTc3dzJ1YW91MQotZ0hKRVJJcVF1QzQvejBEd0ZxcTYxWlZmNWRVUVREOE9tZk93RzRwRnM1MVNpOVdTMDN1ZVZFRlFGd0NnLzlaMgotajZVekNMeVVBQnBXZVYxdjRtMHc4MmtFQUs5Nkd5S0RjVDIwVHltS0puTUt1d3lhK1p3cXJVTEgzU2RpMk13aQotMUdPSDdhb21HMmZLNEQyeXhXeDV4VGlZaG1ZTm5Sb29wZ3UvS3Y1YTR4NDN0T0tTM3plQURNbkhJdzlkTVNuOQotNEtiYTh2ZktiWm5sT2d0OXZlVitpV1p2N04yYVMyejd3L2k1M1k2TEFsVjFoQUlNdkdKM3pMZm1TaFpzMExESQotWWExOEEvd05jZEphelVrOW1MR0lveWNDWU9rNVloV0w5c0NhQ0JkbWRmRFB1KytyTG5xUk9TV2ttZllrT1R0KwotcEc5U1BudnYzWHJYL1NFd004Z1lmcGJad3JGREpGSTlXNjNsYzloZFNvc0ZEKzh4aVJsNmgyZ0tSd1d2YzFSeQoteEl0MytnVXJaeG92TnhCT3Y5OEJvU2YvajNsa2xkVStaakRHbENwbFJIU25keGxOL2JRZ1JHVmhiaUJIWVhWawotWlhRZ1BHUm5ZWFZrWlhSQVlYSmpkR2xqTG05eVp6NkpBRXNFRUJFQ0FBc0ZBalRzQ0prRUN3TUJBZ0FLQ1JCOQotYmIvUjhJNEJLcXF6QUtEYy80SDlpT1hKeFZFMHlDRUhlVFEyZ0FIZmhnQ2c3VlNxN2VOaGlKaEJnYmxRYXYvUgotWE9oYUhqMjBKa1JsWVc0Z1IyRjFaR1YwSUR4a1oyRjFaR1YwTFdScVp6SXdRR0Z5WTNScFl5NXZjbWMraVFCTAotQkJBUkFnQUxCUUkwN0FqU0JBc0RBUUlBQ2drUWZXMi8wZkNPQVNvV09BQ2ZiKzhPVnZ5NkZDcU4yTXhkQ3FwNgotZ2ZmTmJZZ0FvT3hsVGE0TmpDVVVPOWRmTEZGWXBEZkdyUnk3dENCRVpXRnVJRWRoZFdSbGRDQThaR2RoZFdSbAotZEVCaGNHRmphR1V1YjNKblBva0FTd1FRRVFJQUN3VUNOT3dJL2dRTEF3RUNBQW9KRUgxdHY5SHdqZ0VxaUM4QQotb0pEdTFIVHVHT2ZDaEZTSkozMVh2Vjh0bmxvNUFLQ0ZjZWNrNHZlSU1QOHBEQzBmNVVCR0dDM21aTGtDRFFRMAotN0FpWkVBZ0E5a0pYdHdoL0NCZHlvcnJXcVVMekJlajVVeEU1VDdieGJybExPQ0RhQWFkV294VHBqMEJWODlBSAoteHN0RHFaU3Q5MHhraGtuNERJTzlaZWtYMUtIVFVQajFXVi9jZGxKUFBUMk4yODZaNFZlU1djMzl1SzUwVDhYOAotZHJ5RHhVY3dZYzU4eVdiL0ZmbTcvWkZleHdHcTAxdWVqYUNsY2pyVUd2Qy9SZ0JZSytYMGlQMVlUa25ielNDMAotbmVTUkJ6WnJNMnc0RFVVZEQzeUlzeHg4V3kyTzl2UEpJOEJEOEtWYkdJMk91MVdNdUYwNDB6VDlmQmRYUTZNZAotR0d6ZU15RXN0U3IvUE9HeEtVQVlFWTE4aEtjS2N0YUd4QU1aeUFjcGVzcVZETm1XbjZ2UUNsQ2JBa2JUQ0QxbQotcEYxQm41eDh2WWxMSWhrbXVxdWlYc05WNlRJTE93QUNBZ2dBaGIzY0JtUjY3SDQrOVJqNEZlVHdKOGtmbFg2SQotcHAyQWVYWFppZmZpUFZCdjVjR3pHbjJSa0dQQVpxYnAyQWtyQ2I0VHJKSC8vMUdQZFI4Vm1QZUVHc202dTB1VAotME00MDRsLzRJVzFGRlE0SkJwVEVOUG40TllCSGtLQk5rUGNscy9pcDBsU2psbUxHVlFWT3RET2FGRDduNDR4VgotaFQ0V3BwdENyaXBnLzVreW1EbUs5YzhodjZyUFV2Tm9WckRkV1I0Ly9NQ3ZOQVp2R3EyYlpHZEZUeWQ1VG42RAotQW13YnZML1V3Z2lEbm05NXFCQmZDWnRtR2trRmFvT2VQdEJldldGYXZpRlpNMnBFclBSY2pZOEEvMWNac3ljagotSlBNRllxQktHRElrNzZ1bERTalUwUThkcWhDRURmMG8yb1FFZzZtc2pEdGV0VkZFRHc5eUplMEFHSWtBUHdNRgotR0RUc0NKbDliYi9SOEk0QktoRUNCS2dBb05SdFJhUk1kWU53YWpTTzcwNTZlS2F6Q0dTREFLRFNoYW1hUmpBZQotVGhRMUtlZm1KS3l6ZmNvc1pRPT0KLT0yNUN2Ci0tLS0tLUVORCBQR1AgUFVCTElDIEtFWSBCTE9DSy0tLS0tCi0KLQotVHlwZSBCaXRzL0tleUlEICAgIERhdGUgICAgICAgVXNlciBJRAotcHViICAgOTk5L0Y4ODM0MUQ5IDE5OTQvMTEvMDggTGFycyBFaWxlYnJlY2h0IDxzZnhAdW5peC1hZy5vcmc+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXJzIEVpbGVicmVjaHQgPExhcnMuRWlsZWJyZWNodEB1bml4LWFnLm9yZz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhcnMgYFNGWCcgRWlsZWJyZWNodCA8U0ZYQHVuaXgtYWcudW5pLXNpZWdlbi5kZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhcnMgYFNGWCcgRWlsZWJyZWNodCA8U0ZYQGFwcGwyLmhyei51bmktc2llZ2VuLmRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFycyBgU0ZYJyBFaWxlYnJlY2h0IDxTRlhAYXBwbDEuaHJ6LnVuaS1zaWVnZW4uZGU+Ci0KLS0tLS0tQkVHSU4gUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQotVmVyc2lvbjogMi42LjNhCi0KLW1RQ0tBaTYrd09zQUFBRUQ1M1BKZ3JJWVM3aUhiWm4weWNybnpTMDNmd3Z3c0Rwb0FWb3VvcXFCU1ZOb1ZYSCsKLWxMKzhIelgvZkFEdk55azFsWWk1a1RpWVIybWVLQjFwMHFwdmo0YlE4WkVtY0JlbWhWMEZiRVNKNEN4SWd5NlYKLWV1eE9EM3Y5Z2F1eWYxdTRsa2Z5TElzQ2VwdUpxcGtIK2FPdmlFOVZoVGNFL0Q2UHQvTDRnMEhaQUFVUnRDRk0KLVlYSnpJRVZwYkdWaWNtVmphSFFnUEhObWVFQjFibWw0TFdGbkxtOXlaejZKQUpVREJSQTJLUndabXMwOHdLbWYKLWRkMEJBU29TQS85Wnd5QVdpbFhKTk1Xc1YwS2Z5VWVIWjdDc0ZBOS9LUWl4THRwU0g4aWo0cmFMYXNyNnJ1cmMKLVNja3JkK09pUUtQUUcwL1RTWFNBRVA3c3VhdFY2WFRUTEVGSEpibXFjaFRaWE1TYXB3eEZXR0x4ZEcrYnVDaU8KLXVWeGJwb3A0Wm9LejJ4YitHdGRleWVEcisvL2dGTCt3YkVxbFpNWGZ2d2d6QkN4Y09NL3RaWWtBa2dNRkVEUE4KLUR0ZytqN2Z5K0lOQjJRRUJ4cGNENTI3d29jbU4yakh4Q2ttSW1JRCtZTVZGOGcxUmlqM0NFeStvTEFaaWlOV1MKLVJ4ajJsV1RIaHNWWlh0ekY1MytBRDc5ckpxckZoWlVDeCtXNnZHNDZ1TE11dTMvVnBuRWZxMlFzRDBkNnpJVXYKLVNERkl4c3kvczRrbnl2Z2ZNZVhjekhtYjd2akdiR3N5UDltcWpBeU43TVVjcWdCQkFOSDRIWDlDU1JOOHRDMU0KLVlYSnpJRVZwYkdWaWNtVmphSFFnUEV4aGNuTXVSV2xzWldKeVpXTm9kRUIxYm1sNExXRm5MbTl5Wno2SkFKSUQKLUJSQXp6UXdGUG8rMzh2aURRZGtCQWEzMUErZFB2c1J3MXpXdnlNRHAyYVF3cUlhd0lpMndpRmw1NmxZZnBrd1cKLVdqc2RmdHVLMEhIZStnZWswYUoxdkx3SkZscml2cm9FdWtGMUphSzNrUy9vYjJ1L1ROSVo0TUtXamZoYmtKVzQKLTBZN2dDS0NVSlB6aDZoRHcxbllmYzROOVhLbnd1YmlSVmRXMmlnMUhWb0taVU45QWQwMzRtMzBqTUhFenFYYk8KLTRMUXhUR0Z5Y3lCZ1UwWllKeUJGYVd4bFluSmxZMmgwSUR4VFJsaEFkVzVwZUMxaFp5NTFibWt0YzJsbFoyVnUKLUxtUmxQb2tBZFFNRkVETVI5WFZMWENVMEhtanczUUVCZnRBREFMZUs1Ym9MZmpOenhaN2cxVlBIdzZrNlF3U1UKLUVTd2lQSkNtR1RJVDVmOTQxWWhIcW9oZ3dONWtHUjlYRHhXQ0NKQXFRZkZ2YnhoaVp2MHp1NEh2UTdGWUxWTE8KLTJ6d1pyVnZPZlIyNTlqdkdERnBQcVJCcTFjY3hUTlh1dmYyYTQ0a0FsUUlGRURENUhuKytna1dYWm16SnJRRUIKLVdWWUQvUjRYRnhJbXNKeHpwYXlrdDhIbDRrcFFOV1lXSGQ1YWU4MVFGbGEvdmZJcGxCcWVWV3IyOTlwVWJPMXgKLUJ0NEVGUGk1YXlhOENHd1hzOHVSc0hLbjN1NzExamZUcmkxbUtwaU1CV3QxNDlCc1VrNWxGQ25FOWdWbzVVeFkKLWNwTTJ2YjFJNURLZW8vOC9EdVl6MUZRaFh3T3hHcUJxSXIrZ2dRMWZON1EwdjVxemlRRVZBd1VRTVN4VmRQQ0oKLWhHTUFWeGdSQVFGYWZBZitPWnhpWnFwZ2VBM2lNWnpiT3IxN3Y0WWpML0o0TjNwaHJjeThzc2gwcm1UQmJOSFcKLU9mUlIweXpHbEFYZXNwQ1NMekJuU1FNcGgyTVhjM0FsNTFMSzR6NDg3aUFReHB1NWsvWktyZzVhaFpJN1g1b2sKLXZpVGNSam1Ya3BiYlhwK3NNczZKM1pPT2p4TzF0V3l0U1hXNS8zbEt3Ymp6YVVSbGJVYkJBOVFRU0dBWVBuc3cKLVorQ1BLUk51VXNrMkVJM3k0RFdWanVhYk9jQ2VOeTRUTGZCOVVJWTgxb1hmWE95VCtpMkZ3WjBmMWJlZmVadXUKLVBJQ0dRSXhsRUZpM0hkM2hERUFnTko4SHU5QzZYQUNuWWllVDdkVll0bFlIMTRVVGs2L0NMS2tiV05oZC9JNVMKLVFNUGJpaktLMnpVNVUzdlBjb2xBMVVhbFNCY2tmdERRMmlUbW1Za0FsUU1GRURENVFZc2VLWENQR29TWlVRRUIKLXlGWUQvanFQeDJ1OEQxYVF6S0h2WnFTOVBVWVNzUE1UZ24xMEZSL3RwMmM5Q2g2MGYrQlE5NmZPVUN6bVJ0OTQKLUlxMWlNWnNKMG9UeUxMZjZ3Zi9NZGIxTGh2c0dmN3JYRkFUaDI1T1VwUHgxcVBVV3N0U1RvSFNuMCtaZjhlMUIKLTBwNlBKOTZkdUk2cmltb2M4TktwcE93U21SdnFBRDNBVENLcE1pT1N3V2U5K21CWmlRQlZBd1VRTVBsOVNnazAKLVl1eTVnams5QVFFWDJBSUFsQ3BoajRKSS95dm9kWUlscEMyTVBPcytoZlR2YU1QVmhTQ1paMEVWZlpnVFpwTFEKLVhRRGlVb2xZQnZUSEpuakJaeVhab3psbi9kZjRNQkhRZ0tXd21Ja0FWUUlGRURENVJQaytOTXpzT2ZoWkd3RUIKLTVFb0NBSU5NUVdaWm4rMTJyMm5GU2NDU2NmNVRhS3BtK1k2TWZFc3ZWZzB0cnZlRUo3NGliYkZEbzhBQloyZzYKLUZnemZEeEFNYnhOc1VRYU1yaGgwVGFTQzlFeUpBSlVDQlJBdytPNk9IZG0yZUhEOTE3RUJBZmoxQS80L2NZRUUKLWE3ak44K3B0bXhaS3NmWjB4T1AyZHhzUG5pY0RUNFZSMTZNSE42cmtWcnRvNzgyWFNpUngzWlVzZDlSalVtZkgKLVpBM21Ib0pJR282SlJGVk9leWpnM0xFQVNTU2ZacjRZRmtodXRuZjBsRGxKT2VFS2hxdkl3L2RTTzdNRHdkTHgKLWhPcUFGdjlVekFscE9tNEdMeDlwMU42MXhEbDFkSVlFblk5Y09Ja0FsUUlGRURENVFueUZhdDBiYWRhYzZRRUIKLUNDTUVBS1Y2MEFlZFdaeVhXb2tjd1dJYlcvUExnTlRDaDhKTDF2aWpYR25CdlQyUHVBMEw3L3JDWFBoYmIyMEEKLXJycStQNnhiR0Z4aTQyaVdpZWVVMlQ1ek41SWxQT2JUNmNQZVJXSmt4UG5hU2Y4WkQzM1kxYWxtY3VoaFlNVWMKLTdsa0w3eXFTbzFKOFRSVkNTeGpRNFcwK1FEVUZJRXZyaWdiNVNjZDd6WUhHT3FvU2lRQlZBZ1VRTVBqTjJwdmEKLVVZUHdoQnNSQVFHTmhRSC9aNklsQkk0aGRHYjh0ZWVsTWdZMmtmM0lxMDhOQnl5eWdKQUk0OEhxVGUwY0tJVzYKLUJQY0JrSnFNb29KdFJKVFg2Umt0OGZSS2UvSVBHZUhHcXlXM2VJa0E3Z01GRUREaFVSNkszV1RXRXMxMUtRRUIKLVRua0d3UUVnSk1rOFNIUisyaUJtT0pRMngra3Y0TFZtUHA4aGRhS0NCZGZ2SkRtclNwdUVnckJXRkk5UERwU3cKLUY3TldMUHFFU1BuV281ZGQ4WWV5bnpZejNhQ2lJWEFPVUIwckc4dHVqRjFkU24va0ZVQ01xZ3F2YlBPVTNzU3YKLTZ0VmxFQ0lBaDY3R1ROSG42MUlJaExNMEtHNHY5ZWxvMExrL1NwV3dSUlBKWlcvbHRRQkFwanRSK2p1Rk9pcTYKLTg2K2VFOWtLQkNJbUNJdGhCZUUvY2Y2SmZ3dVM0KzF1aStNbWtrcXJuTzgrMDdiZGpia1dUU3pUTDNsMTJ2L3QKLU0ycDhGd3FwczQxeSszbklFT3pxN0lzZjR6QmpmdzJaS2VYYkVYcTBNMHhoY25NZ1lGTkdXQ2NnUldsc1pXSnkKLVpXTm9kQ0E4VTBaWVFHRndjR3d5TG1oeWVpNTFibWt0YzJsbFoyVnVMbVJsUG9rQWxRSUZFREQ1SHY2K2drV1gKLVptekpyUUVCRDlRRC9pSUl2T1VxeUtSQldqSGdKRDd6b3NreERRSC9ZVmhKdTU5em9DRU9KR3dYRlBMbFQzY2UKLW1lTUNhVkxhNVh2b0RuTFlXWi9iZkk1bkZkOXZGOUd3d2JtUDgveDM5WjNOMnhLZkpwRDhlSDVpbnU1QXd0SXMKLWtmWGptY1poU2ZEZ3YyWHBBYUZpZ3ozd0lCdCtYYmtQUnhKSnhmcUQ1b0oxeXMwcU5lMFU2amp5aVFFVkF3VVEKLU1TeFZydkNKaEdNQVZ4Z1JBUUhMVmdmL2NXNkZsem1PZUl2Si8zeUI3dmhTT2xwaXZuWTAwaUtuenpDcFdMT2EKLXNhQzROUGF6aHFOSWV3QmEwMUtTdWFtSWljWWt6WGs4TWVhVHE1RWFRZkp5QStOdGRXU20vMy9pdktXb080S2EKLXFKYlZQbnhhRG5CMktCSCsybXEwQko0clM0aTJqVlp1b3BidE1BSFYrbFFVSGFWSDgyNllhRlBhKzQyNUEvSCsKLU9hcW4yRWRrTDgwZnBJSnNBQ3N1ZFlQREdDS1MzemNNanNwVksxY1hxTlJEeklPWjhJL1h0eU5FSnB3MXlSR2YKLXQ0anJuNGxqOWpVNHkwdjZzRk90NmpwdXZBbXlSTi9wZWJ3allKdzFZZTY5N01Na24wbkVhZkg1NUV0K1hmZEIKLU9ZTm0zU2IvSjJnOGoySlZWaE42Skt1Rll5TTFrdksxM1JreTNTaUxQVXpEOTRrQWxRSUZFREQ1UXFxRmF0MGIKLWFkYWM2UUVCNkhzRC9Sb29QUjZwRm5TaXNDZXJUbFBoU3ZESTJnbDJIVU1GdzBDWko1SktWbGo1R0ZEWnA1amwKLTB5aGdDRkN3ZUZ1RTdSVWdNT2t2R2VFb0VQWmV5aXBhY3NyVkljTzI2YUNReWVyTFRRZDZKVGdPdUNFZUV2a2oKLUJ3aXFPclZOU0VQTTVUV1B6UWM3UTdJRHRLVHNDVCt4Tkd0TzZQaTIrQXJaYW9kWlR0cDR0WGtDaVFCVkFnVVEKLU1Qak9DNXZhVVlQd2hCc1JBUUhkVkFIL2VJZ0NrNmZvMy9Ndnh1N0lFU2RETE0vb3poMTR5dlp6NkZ2Qy9WS3QKLVNwNTFnb3FzVjVqSTl3S0FOSWpvbkxlTzdHSnViak8rbHFIdnNFVnNHUSt3cElrQTdnTUZFRERoVWpPSzNXVFcKLUVzMTFLUUVCZ1RVR3dRR0g4SWM3ek5hVWxSbVltNUo4UjM3NWlQOENySi94SUxiRVQ2OVZzUjJhREcyTUEyejgKLU5CQmtWMUFSckFDMllXYTlzTzkxeUN5ZjNOQUk2STFvcXRidi8wOUltL3MwYlR1NjZkV3JxUkFpdVRCM091K2cKLUhKMGZjODVnVFdjQmQ5L3hTL21ObFpiMS9aWGprQmFZZGwwQnptNzJjMytIcVpqSHpUM25seFZZNUhDaTE1SjQKLWlEZ0N1Q1B6ZW8xcjhRZ0dtc2JQN2ZEKzBIa2E3dGxYYjg3V3hQWnQrbmtqR1M5eG1Mck5IdzUvdkpwY040K2YKLXpldnpoVFFEOEljc1VyMFFjWlVIOWpacG02eFdwaWJQRjV6N0Z6WFRvcmd1ZitXME0weGhjbk1nWUZOR1dDY2cKLVJXbHNaV0p5WldOb2RDQThVMFpZUUdGd2NHd3hMbWh5ZWk1MWJta3RjMmxsWjJWdUxtUmxQb2tBbFFJRkVERDUKLUh0cStna1dYWm16SnJRRUJqc3dELzFOd203eW9WNnNqN3FUaUthVzlTM0RRRDNMS1h0d2VpRGRZRjBscDk2MUkKLVdrdXlCdXI0YVlCTlJPUUs4MnpGUXFLTktmc20rRlh1K042QVlRMnpFVUpFVWtUOVJRZ21zcmZVMXEwNjdab28KLStkY2s1VDJ6dUgrL2txbUY5dDI4R3Y0amp4VlRpdDZDOTJORWhjaXV0Tk80OGtLMzJCVDJtZ1gydzd0ZHM2RzQKLWlRRVZBd1VRTVN4VnZQQ0poR01BVnhnUkFRRlVLZ2YvWTREamVvMTgrWkFmcjBCS2wxNFAyOWRLSzNwOE9MY24KLXFYaDZqdUJmVFJpV25GSnRyUWZHSDl3M3BRdnBpMlJSdURaVFRRemhPNGVPcTJnNWd5OU15dFUxaHRMUlZwVncKLUJubW1qTFJXejBXR3FyNHk0WlVMYmczaGE1TnNmQnBwZGdIS2s1WStCcHR2SUwvMzdaQmt6dGtpQlhmczBaYmMKLTNmWlI0YlNVMXhET0UrSFMwQm9mT3h1YnFmWnJDWnZBak1DQzVOSjRSMTNIOHhuWWc2TktRQ0FxT2ZlQ09WV2sKLUduYy9CSzdWQXJNWGpDOG8vOW5RRHpZMmZSUElOUG5DYjRmLzRQdW53T3JFemE2ekx4WGZnTnJhUUoxOWJvUGIKLS9vOURCbHZOT1drcTlnU21WblRFa3FyRU10aVhkMzFLQVUvTFZDUkgvNzBteDdYWmtGNS9ONGtBVlFNRkVERDUKLWZZNEpOR0xzdVlJNVBRRUJXMGtCLzBzOUFxYXdIcUovMHJPOWpzTWhrM3Z1SE5nd1ZGNERvS1RMNUVESU9SRVQKLWNjQWY0VVpWSm8rSnptall4YzFmMlJrd2tNa2svTjlhZktabWNOU1l6dGVKQUZVQ0JSQXcrVVVaUGpUTTdEbjQKLVdSc0JBYWg3QWdDSVdSL0hOdCtWMjBiRHVlQ085bWh3R2lycTVFN1RKVStDOXhUKzNCZVpYbXl5L0FSN3RXSmQKLUtuQzZsYUdETG5Na28zQ1dyL1hSS0QrckMwNTBuTnNyaVFDVkFnVVFNUGp1M1IzWnRuaHcvZGV4QVFGMGF3UC8KLWNYd0lCYUVBajREL1Noek1uYTNOUS9FTTRhVG5pQUhkVklINGQ2VWgyUndEQ29ZdDZId0VQMTF4ZkJ3STZiRFcKLWxRaGRVZ0R6R09YbU94S3h2L1h0aTR2aUhPd08xS3FqUnRIT3lEZjRoSS9vdTJwMGJudFhNWjV5VnYwV2FreVcKLTdrWWQ3S3hUYllkL0NUS2U4SEIrOHdrajhoMXBiMzFKSm9YeldzZ213WGlKQUpVQ0JSQXcrVUxZaFdyZEcyblcKLW5Pa0JBUVV3QS85QVVxRlFzWFc5a01pNVJvb0lUaVFiUnludW5QaDJhcWFkVm51TFpvQWh4cDE2YytFUVlwYzQKLVFpNmpMUEJWZW1IZFM0UFc4dkplZ0YxcEp0RFo0VmZMTnd3a0l4ajdZMGhVOEE0QmNIVUlmRmRPRVI3U3diVy8KLWk3UVRVOHUzdk5IZm1nSW9kdjE5RDdyRnhFenFxUHhNSFJwSXM4L0lPRzlMM3pjM2tWOHJuWWtBVlFJRkVERDQKLXppeWIybEdEOElRYkVRRUJnNmtDQU5qOW1yMjBnY1lSWjRlRGZudVRTa1N2dGp2S294MEV0TStVbkFBZ2loeFUKLXE1dk5DWkRFZW9oWlNaQlIvcDJwa3RjU3UrY2RrNWJCRkh0emthTlR0ODJKQUZVQ0JSQXYwdTJjbVRWT28yajkKLS8wMEJBZHViQWdDY21RbDNndmRlUXVBMnpTbXFITnJDRVhkbWpJSWx0T1djOFdGQ1BKakR0NmMyY0JkbXV3b08KLVlrbldXR0RNS1h2VGxoNmxQZ0lWeDNmaGxob2J4eEZLaVFDVkFnVVFMOU0rUjBheGlmdmczcXB0QVFGN3RBUDcKLUI3OHk5M2dhb2pETUM4TndmaU5LaDdsNWNCaDBPTkErVzFnM083WUxFNVc3Wi9mT2c0SDNwT3VqbnFVN0gzTnMKLUNobUR4dEJLUUlJaVpYcG5OZzROdDNGNzY1dDhFUHJNbWpqUUo0YTYrOENIZm1YbWZOU1dxUE1kamdKVzR5a00KLW5VYXNHaGdGMVo4ZmxOTmtmSDVnZlc5R3I4VWNDbGdLcWE1eHZraEM1Y3lKQUZVREJSQXYwenZLUXdaM1J4L3QKLUF6c0JBVnMwQWY5MWNFakgzb1pQSWF5ZFNaeFBVakYxU0UzcDkzTm5ZNkEzbUtaUjF2a2V3RzZzUnFWYTRNTzQKLWx3OHc4QVU3Z2UycnZ3dXBGM3dlRjFaOURHMmJhdUdtaVFDVkFnVVFMOU00U3VYTGhneXJSS0RKQVFIL3ZRUUEKLWpHTTM3ME13Y0lmbXRROWUvMGowbnp0UXdRMThkWE1BK2RNeU5IaUdyYytKQzcxdTV6anh3bU83UjFWdjdaU0EKLWFmOVBzbEYvMTE4d1M2ZkZnOUJQK0xPNVQ0RDQ0d01KVGZpTU12MzBRNFNmeG45RFg5TjNpWXpMMVBUSG1sQ08KLWZDUVFxdkM0NTFYYmNYRUNxbXFXSEVxSUk4Ly80dy9oOXlybC81Ri91WG1KQUZVQ0JSQXYwbGNmL1poSytiTFcKLThLVUJBYy9yQWY5cm1KNTZPNDBRVkQ4MDMrYlUxelNpU0UxeCtGVVJ0K2NlQXNvenFvOXRhRm9SSUdYVGE4TXAKLXN3U3R5QUxuSktweURrR0VuVGZSZEFSVlF0Y0V6WUpuaVFCVkFnVVFMOUpEdnhFWkNSejZsTTkvQVFHMnh3SCsKLUlRQUpaRXZsZE5IemVpa2V6MThUeHkxMkVuSjlrK3phMnJqUFZubFg3K3RlSVkzVk5PMWhvbVVnd3Fqb09IcFoKLWtkR2dkT2RtdWZPZ2xUM1Jxcms1RllrQWxRSUZFQy9SdCsxSlNhWXNFNTJRNFFFQnpVWUVBTW9uYzNVRk5qR28KLW44Ri9vbWMwUFBBM3JmSDJJUzZHMzFGTjZmUmFyVzFQd2s3Q1dseDN3Z0htNmdPOXhmVjVsRGpCSitsVm1ibUwKLXovMU1aaGc2NDZlRlJidWd0QlliT1h3RTZ6bU5yS0JoY2hWdWVWT056d1dQSUE4Qlp0UjJMdzZDaWtBT2hLZ2wKLTRuZGc4UE84VVVnOGdoMFZVS0dUUERLME1LUjdaQ3BHaVFCVkFnVVFMOUlYUG5tTUdBeDd0MTJKQVFHcElBSC8KLVpybDE2VUx3My9nbDdUMTFFYm5iQTlUM0xqWHVENFRHM0lHZUVWM3oxd2JScDIyN3lOMTJhM1BiYXZFS0pqMW0KLWZXclphVDg5WHQxc21ZQmFJd1g0YW9rQWxRSUZFQzhZR2VwSVg2c3ZJOWtyNHdFQm5PMEQvMVI0SGxVTTQzQ1UKLWp4ZGluemNpak9KeFJOZTdpZVhwcDd4Tm45U3VKb3REVmVDTERSRlNwbUYyRUZiMEtEeW9YMmJZMTh4UFQ5c1cKLXRJTVl2NFhpZ1NCd2Z1UitTcCtKMUNMZFArenptSVpiWkJjKzNHNXhNNm5pcHZhS2wxRGtoU2xMcWVkVzRkbWcKLTFyS2dDT1hZS0hkekhVY2FuZU5FNHJrb1dsVndHNXJoaVFDVkFnVVFMczErdng0cGNJOGFoSmxSQVFId1hBUDgKLUNLTERXRkxKN0ZjM0paME1udVB4Vzc5TTluUlF3TDJUSS9WZDRsQ1VTaURPVWRFdmpVNDVNTG1MZ1UrNE9aTlAKLWVYYUJTTGtONHo4UFVreEdFRXZTZUNGRTd1MDRWTnExR0oyYUMrZkhWRnp1V2JwMExzZXpxRFNubTZ4dkJ4ejQKLTB5RWFabmtYdTMrNjZrWFpWL0U0Qk5Ja0NhQjVWMnFYeHJCSWcwRDEwaUNKQUpRQ0JSQXV4N2F1RDBjdld6VFgKLVRjRUJBVE5WQS9qVStiVFVxbmxaZHJmNktnQ3YraERPczZWTzUzOGNFeFFOc0JsN3g4MkRqYnA4UTV0MjFZRVYKLThMaUZOMWltdUxZcUhYcURFSHQ3cXRyb05hQllYZ25SMjRRakkzdXJlbCtrWU1pYlpXeEdycTM4MkMyYXBSZWEKLUVEbVExcXRFelAra1hleGFhd0F6S01vOFZLV01uWGpRWUJMWm9odVVxZmNpRTlBN09RRjFpUUJGQWdVUUxyN0YKLXJaWFRpMUZtY2FsVkFRRk9MUUYvV0N1VGZjc0VjN3oxV0s1Qk1RbHRDZ25OdnV6MGhpbU5QMkZ4UGw0ZzVycTMKLXU4aTAzZHFQYnVWd2ZyeFN6eSttCi09dGcwRAotLS0tLS1FTkQgUEdQIFBVQkxJQyBLRVkgQkxPQ0stLS0tLQpkaWZmIC0tZ2l0IGEvTElDRU5TRSBiL0xJQ0VOU0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYzY1MzguLjAwMDAwMDAKLS0tIGEvTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotCi0KZGlmZiAtLWdpdCBhL01ha2VmaWxlLmluIGIvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OTJjMDguLjAwMDAwMDAKLS0tIGEvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0KLURFUFRIICAgICA9IC4KLXRvcHNyY2RpciA9IEB0b3BzcmNkaXJACi1zcmNkaXIgICAgPSBAc3JjZGlyQAotVlBBVEggICAgID0gQHNyY2RpckAKLQotU1VCRElSUyA9IGFwIGxpYiBtYWluIG1vZHVsZXMgb3MgJChSRUdFWF9ESVIpCi0KLVBST0dSQU1fTkFNRSAgICAgICAgID0gYXBhY2hlCi1QUk9HUkFNX1NPVVJDRVMgICAgICA9IG1vZHVsZXMuYyBidWlsZG1hcmsuYwotUFJPR1JBTV9MREFERCAgICAgICAgPSAkKEVYVFJBX0xERkxBR1MpICQoUFJPR1JBTV9ERVBFTkRFTkNJRVMpICQoRVhUUkFfTElCUykKLVBST0dSQU1fREVQRU5ERU5DSUVTID0gXAotICAkKEJVSUxUSU5fTElCUykgXAotICAkKE1QTV9MSUIpIFwKLSAgbWFpbi9saWJtYWluLmxhIFwKLSAgJChPU19ESVIpL2xpYm9zLmxhIFwKLSAgYXAvbGliYXAubGEgXAotICBsaWIvYXByL2xpYmFwci5hIFwKLSAgJChSRUdFWF9MSUIpCi0KLVBST0dSQU1TICAgICAgICA9ICQoUFJPR1JBTV9OQU1FKQotdGFyZ2V0cyAgICAgICAgID0gJChQUk9HUkFNUykKLXBob255X3RhcmdldHMgICA9IGJ1aWxkbWFyay5jCi1pbnN0YWxsX3RhcmdldHMgPSBpbnN0YWxsLWNvbmYgaW5zdGFsbC1odGRvY3MgaW5zdGFsbC1pY29ucyBpbnN0YWxsLW90aGVyIFwKLQlpbnN0YWxsLWNnaSBpbnN0YWxsLWluY2x1ZGUKLQotaW5jbHVkZSAkKHRvcHNyY2RpcikvYnVpbGQvcnVsZXMubWsKLWluY2x1ZGUgJCh0b3BzcmNkaXIpL2J1aWxkL3Byb2dyYW0ubWsKLQotaW5zdGFsbC1jb25mOgotCUBlY2hvIEluc3RhbGxpbmcgY29uZmlndXJhdGlvbiBmaWxlcwotCUB0ZXN0IC1kICQoc3lzY29uZmRpcikgfHwgJChta2luc3RhbGxkaXJzKSAkKHN5c2NvbmZkaXIpCi0JQGNkICQoc3JjZGlyKS8uLi9jb25mOyBcCi0JZm9yIGkgaW4gbWltZS50eXBlcyBtYWdpYzsgZG8gXAotCQkkKElOU1RBTExfREFUQSkgJCRpICQoc3lzY29uZmRpcik7IFwKLQlkb25lOyBcCi0JZm9yIGkgaW4gKi1kaXN0OyBkbyBcCi0JCXNlZCAtZSAncyNAQFNlcnZlclJvb3RAQCMkKHByZWZpeCkjZycgXAotCQkJPCAkJGkgPiAkKHN5c2NvbmZkaXIpLyQkaTsgXAotCQljaG1vZCAwNjQ0ICQoc3lzY29uZmRpcikvJCRpOyBcCi0JCWZpbGU9YGVjaG8gJCRpfHNlZCBzLy1kaXN0Ly9gOyBcCi0JCWlmIHRlc3QgIiQkZmlsZSIgIT0gIiQkaSIgJiYgdGVzdCAhIC1mICQoc3lzY29uZmRpcikvJCRmaWxlOyB0aGVuIFwKLQkJCSQoSU5TVEFMTF9EQVRBKSAkKHN5c2NvbmZkaXIpLyQkaSAkKHN5c2NvbmZkaXIpLyQkZmlsZTsgXAotCQlmaTsgXAotCWRvbmUKLQotaW5zdGFsbC1odGRvY3M6Ci0JQGVjaG8gSW5zdGFsbGluZyBIVE1MIGRvY3VtZW50cwotCUB0ZXN0IC1kICQoaHRkb2NzZGlyKSB8fCAkKG1raW5zdGFsbGRpcnMpICQoaHRkb2NzZGlyKQotCUBjcCAtcnAgJChzcmNkaXIpLy4uL2h0ZG9jcy8qICQoaHRkb2NzZGlyKQotCi1pbnN0YWxsLWljb25zOgotCUBlY2hvIEluc3RhbGxpbmcgaWNvbnMKLQlAdGVzdCAtZCAkKGljb25zZGlyKSB8fCAkKG1raW5zdGFsbGRpcnMpICQoaWNvbnNkaXIpCi0JQGNwIC1ycCAkKHNyY2RpcikvLi4vaWNvbnMvKiAkKGljb25zZGlyKQotCi1pbnN0YWxsLWNnaToKLQlAZWNobyBJbnN0YWxsaW5nIENHSXMKLQlAdGVzdCAtZCAkKGNnaWRpcikgfHwgJChta2luc3RhbGxkaXJzKSAkKGNnaWRpcikKLQlAY3AgLXJwICQoc3JjZGlyKS8uLi9jZ2ktYmluLyogJChjZ2lkaXIpCi0JCi1pbnN0YWxsLW90aGVyOgotCUB0ZXN0IC1kICQobG9nZGlyKSB8fCAkKG1raW5zdGFsbGRpcnMpICQobG9nZGlyKQotCi1pbnN0YWxsLWluY2x1ZGU6Ci0JQGVjaG8gSW5zdGFsbGluZyBoZWFkZXIgZmlsZXMKLQlAdGVzdCAtZCAkKGluY2x1ZGVkaXIpICAgICB8fCAkKG1raW5zdGFsbGRpcnMpICQoaW5jbHVkZWRpcikKLQlAdGVzdCAtZCAkKGluY2x1ZGVkaXIpL3htbCB8fCAkKG1raW5zdGFsbGRpcnMpICQoaW5jbHVkZWRpcikveG1sCi0JQHRlc3QgLWQgJChpbmNsdWRlZGlyKS9hcHIgfHwgJChta2luc3RhbGxkaXJzKSAkKGluY2x1ZGVkaXIpL2FwcgotCUBjcCBpbmNsdWRlLyouaCAkKHNyY2RpcikvaW5jbHVkZS8qLmggJChpbmNsdWRlZGlyKQotCUBjcCAkKHNyY2RpcikvbGliL2V4cGF0LWxpdGUvKi5oICQoaW5jbHVkZWRpcikveG1sCi0JQGNwIGxpYi9hcHIvaW5jbHVkZS8qLmggJChzcmNkaXIpL2xpYi9hcHIvaW5jbHVkZS8qLmggJChpbmNsdWRlZGlyKS9hcHIKLQlAY2htb2QgNjQ0ICQoaW5jbHVkZWRpcikvKi5oICQoaW5jbHVkZWRpcikveG1sLyouaCAkKGluY2x1ZGVkaXIpL2Fwci8qLmgKZGlmZiAtLWdpdCBhL1NUQVRVUyBiL1NUQVRVUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2MmYwMi4uMDAwMDAwMAotLS0gYS9TVEFUVVMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotQXBhY2hlIDIuMCBTVEFUVVM6Ci1MYXN0IG1vZGlmaWVkIGF0IFskRGF0ZTogMTk5OS8xMi8yMiAwNjoyMDoxMSAkXQotCi1SZWxlYXNlOgotCi0gICAgVmFndWUgcGxhbiwgYXNzdW1pbmcgbW9yZSBmZWF0dXJlcyBhcmVuJ3QgZGVtYW5kZWQgZm9yIHRoZSAyLjAgcmVsZWFzZQotICAgIDIuMGExL2IxOiBKYW51YXJ5IDIwMDAKLSAgICAyLjAgICAgIDogbGF0ZXIgaW4gMjAwMAotCi1SRUxFQVNFIFNIT1dTVE9QUEVSUzoKLQotICAgICogQ29tcGxldGUgSEFWRV9TRU5ERklMRSB3b3JrLiBOZWVkIHRvIGFkZCBpb3ZlYyBoZWFkIGFuZCB0YWlsIHBvaW50ZXJzIHRvIAotICAgICAgdGhlIGlvbCBzZW5kZmlsZSBBUEkgYW5kIG1ha2UgaXQgd29yayB1bmRlciBVbml4LgotICAgICAgICBTdGF0dXM6IEJpbGwgPHN0b2RkYXJkQHJhbGVpZ2guaWJtLmNvbT4gaXMgd29ya2luZyBvbiB0aGlzCi0KLSAgICAqIFBpcGVzIHRvIENHSSBzY3JpcHRzIGFyZSBub3QgYmVpbmcgdGltZWQgb3V0Ci0gICAgICAgIFN0YXR1czogY29kZSBoYXMgYmVlbiBhZGRlZCB0byBBUFIgdG8gc3VwcG9ydCB0aW1pbmcgb3V0IHBpcGVzLgotICAgICAgICAgICAgICAgIFRoaXMgbmVlZHMgdG8gYmUgdXNlZCBpbiBBcGFjaGUgbm93LgotCi0gICAgKiBQdXQgYmFjayByZXNvdXJjZSBsaW1pdCBjb2RlCi0KLSAgICAqIFBvcnQgbW9kX3Jld3JpdGUKLSAgICAgICAgU3RhdHVzOiBQYXVsIFJlZGVyIDxyZWRlcnBqQHJhbGVpZ2guaWJtLmNvbT4gaXMgd29ya2luZyBvbiB0aGlzLgotCi0gICAgKiBzdUVYRUMgZG9lc24ndCB3b3JrCi0gICAgICAgIFN0YXR1czogTWFub2ogaGFzIHBvc3RlZCBhbiBwYXRjaCB0byBmaXggdGhpcy4KLSAgICAgICAgPDE5OTkxMTAzMDAzNjA1LkEyMDYxMkBzYW1vc2EubWluZHNwcmluZy5jb20+Ci0KLSAgICAqIFdpbmRvd3MgTlQgcG9ydCBpc24ndCBkb25lCi0gICAgICAgIFN0YXR1czogQmlsbCAgPHN0b2RkYXJkQHJhbGVpZ2guaWJtLmNvbT4gaXMgd29ya2luZyBvbiBNUE0gYW5kIEFQUi4gCi0JUmVtYWluaW5nIHdvcms6Ci0gICAgICAgIDEuIEFkZCBiYWNrIGFiaWxpdHkgdG8gcnVuIEFwYWNoZSBhcyBhIHNlcnZpY2UKLSAgICAgICAgMi4gRml4IFdpbjkqIHNwZWNpZmljIGNvZGUgaW4gdGhlIHdpbm50IE1QTQotICAgICAgICAzLiBUZXN0IGFjY2VzcyBsb2dnaW5nIHdpdGggbXVsdGlwbGUgdGhyZWFkcy4gV2lsbCB0aGUgbmF0aXZlIGZpbGUgSS9PIAotICAgICAgICAgICBjYWxscyBzZXJpYWxpemUgYXV0b21hZ2ljYWxseSBsaWtlIHRoZSBDUlQgY2FsbHMgb3IgZG8gd2UgbmVlZCB0bwotICAgICAgICAgICBhZGQgcmVnaW9uIGxvY2tpbmcgZWFjaCB0aW1lIHdlIHdyaXRlIHRvIHRoZSBhY2Nlc3MvZXJyb3IgbG9ncz8KLSAgICAgICAgNC4gRml4IHRoZSBET1MgaG9sZSBpbiBBY2NlcHRFeCAobmVlZCB0byB0aW1lIG91dCBjb25uZWN0aW9ucyBvdmVyCi0gICAgICAgICAgIHdoaWNoIGRhdGEgaXMgbmV2ZXIgc2VudCkuCi0KLSAgICAqIEN1cnJlbnQgMi4wIGNvZGUgaXMgbm90IHRlc3RlZCBvbiBtYW55IFVuaXggcGxhdGZvcm1zLiBNYWtlIDIuMAotICAgICAgd29yayBvbiBtb3N0LCBpZiBub3QgYWxsIHRoZSBzeXN0ZW1zIDEuMyBkaWQKLSAgICAgICAgU3RhdHVzOiBBdXRvY29uZiBhbmQgQVBSIHdpbGwgZ2V0IHVzIG1vc3Qgb2YgdGhlIHdheSB0aGVyZS4KLQotICAgICogVGhlIG1vZHVsZSBBUEkgaXMgYSB3ZWlyZCBjb21iaW5hdGlvbiBvZiB0aGUgb2xkIHRhYmxlIGFuZCB0aGUgbmV3Ci0gICAgICBob29rIHN5c3RlbS4gU3dpdGNoIGNvbXBsZXRlbHkgdG8gdGhlIG5ldyBob29rIHN5c3RlbQotICAgICAgICBTdGF0dXM6IEJlbiBMYXVyaWUgaXMgd29ya2luZyBvbiB0aGlzLgotCi0gICAgKiBNb2R1bGVzLiAgV2hpY2ggbW9kdWxlcyBkbyBub3Qgd29yayB5ZXQsIGNhbiB3ZSBnZXQgYSBsaXN0PwotCi0gICAgKiBXZSBuZWVkIGEgdGhyZWFkLXNhZmUgcmVzb2x2ZXIsIGF0IGxlYXN0IG9uIFVuaXguCi0gICAgICAgIFN0YXR1czogVGhlIGJlc3Qga25vd24gY2FuZGlkYXRlIHdvdWxkIGJlIHNvbWV0aGluZyBmcm9tIEJJTkQKLSAgICAgICAgKHY4IG9yIHY5PykgVGhlIG9ubHkgb3RoZXIgb3B0aW9uIHdvdWxkIGJlIHRvIG11dGV4IGFsbCB0aGUKLSAgICAgICAgcmVzb2x2ZXIgY2FsbHMsCi0KLVJFTEVBU0UgTk9OLVNIT1dTVE9QUEVSUyBCVVQgV09VTEQgQkUgUkVBTCBOSUNFIFRPIFdSQVAgVEhFU0UgVVA6Ci0KLSAgICAqIENsZWFuIHRoZSBjb2RlLiAgVGhlcmUgYXJlIGEgbG90IG9mIHBsYWNlcyB3ZSB1c2VkIEFQUiBidXQgZGlkbid0IAotICAgICAgcmVtb3ZlIHRoZSBoYWNrcyB0aGF0IHdlcmUgcmVxdWlyZWQgZm9yIHRoZSBjcm9zcy1wbGF0Zm9ybSBjb2RlIGluCi0gICAgICAxLjMuICBXZSBuZWVkIHRvIG1ha2UgdGhlIGNvZGUgbG9vayBsaWtlIEFQUiB3YXMgc3VwcG9zZWQgdG8gYmUgdGhlcmUuIAotCi0gICAgKiBHbyB0aHJvdWdodCB0aGUgQnVnIERCIGFuZCByZXNlYXJjaCB0aGUgYnVncyBtYXJrZWQgInN1c3BlbmRlZCIuICBQZW9wbGUKLSAgICAgIHdlcmUgdG9sZCB0aGVzZSB3b3VsZCBiZSBjb25zaWRlcmVkIGZvciBpbmNsdXNpb24gaW4gQXBhY2hlIDIuMCwgaXQgCi0gICAgICB3b3VsZCBiZSBuaWNlIHRvIGFjdHVhbGx5IGRvIHNvLgotCi0gICAgKiBXaW4zMjogTWlncmF0ZSB0aGUgTVBNIG92ZXIgdG8gdXNlIEFQUiB0aHJlYWQvcHJvY2VzcyBjYWxscy4gVGhpcwotICAgICAgd291bGQgZWxpbWluYXRlIHNvbWUgY29kZSBpbiB0aGUgV2luMzIgYnJhbmNoIHRoYXQgZXNzZW50aWFsbHkKLSAgICAgIGR1cGxpY2F0ZXMgd2hhdCBpcyBpbiBBUFIuCi0gICAgICAgIFN0YXR1czogQmlsbCA8c3RvZGRhcmRAcmFsZWlnaC5pYm0uY29tPiBpcyB3b3JraW5nIG9uIHRoaXMuCi0KLSAgICAqIE1vdmUgSS9PIGxheWVyaW5nIGludG8gQVBSLgotCi0gICAgKiBUaGVyZSBhcmUgc3RpbGwgYSBudW1iZXIgb2YgcGxhY2VzIGluIHRoZSBjb2RlIHdoZXJlIHdlIGFyZQotICAgICAgbG9vc2luZyBlcnJvciBzdGF0dXMgKGkuZS4gdGhyb3dpbmcgYXdheSB0aGUgZXJyb3IgcmV0dXJuZWQgYnkgYQotICAgICAgc3lzdGVtIGNhbGwgYW5kIHJlcGxhY2luZyBpdCB3aXRoIGEgZ2VuZXJpYyBlcnJvciBjb2RlKQotCi0gICAgKiBBUFJpemUgdGhlIHN0YXQgZnVuY3Rpb24uIENSVCBzdGF0KCkgaXMgYWJvdXQgMzAlIHNsb3dlciBvbiBXaW5kb3dzIHRoYW4KLSAgICAgIHRoZSBlcXVpdmFsZW50IG5hdGl2ZSBXaW5kb3dzIGNhbGwuIFRoZSBBUFIgY2FsbCBzaG91bGQgcmV0dXJuIHRoZSBVbml4Ci0gICAgICBzdHlsZSBzdGF0IHN0cnVjdHVyZSwganVzdCB0byBrZWVwIGl0IGZhbWlsaWVyLgotCi0gICAgKiBJbXBsZW1lbnQgcmVsaWFibGUgcGlwZWQgbG9ncyBvbiBXaW5kb3dzCi0gICAgICAgIFN0YXR1czogQmlsbCA8c3RvZGRhcmRAcmFsZWlnaC5pYm0uY29tPiBoYXMgcHJvdG90eXBlIGNvZGUgKG5vdAotICAgICAgICByZWxpYWJsZSkgaW4gMS4zLiAgU2hvdWxkIGJlIG11Y2ggY2xlYW5lciB3aXRoIEFQUiBpbiAyLjAuCi0KLSAgICAqIFN3aXRjaCB0byBhdXRvY29uZiwgZXQgYWwuIGZvciBjb25maWd1cmF0aW9uLgotICAgICAgICBTdGF0dXM6IE1hbm9qIGhhcyBwbGFjZWQgYW4gaW5pdGlhbCB2ZXJzaW9uIGludG8gdGhlIDIuMAotICAgICAgICByZXBvc2l0b3J5LiBUb2RvcyBpbmNsdWRlOgotICAgICAgICAgIAotICAgICAgICAgIC0gIm1ha2UgaW5zdGFsbCIgc2hvdWxkIHdvcmsKLSAgICAgICAgICAtIGEgdG9vbCB0byBzaW1wbGZ5IHRoaXJkLXBhcnR5IG1vZHVsZSBidWlsZGluZyBzaG91bGQgYmUKLSAgICAgICAgICAgIHdyaXR0ZW4uIFNvbWV0aGluZyBsaWtlIGFweHMKLSAgICAgICAgICAtIEFkZCBhIGxvdCBtb3JlIGNoZWNrcyB0byBzYXRpc2Z5IHRoZSB2YXJpb3VzIHBsYXRmb3JtcywgZS5nLgotICAgICAgICAgICAgZm9yIHRocmVhZGluZwotCi0gICAgKiBVc2UgQVBSIHRvIGdldCByaWQgb2YgbW9yZSBwbGF0Zm9ybSBkZXBlbmRhbmNpZXMuCi0gICAgICAgIFN0YXR1czogUnlhbiBCbG9vbSA8cmJiQHJhbGVpZ2guaWJtLmNvbT4gaXMgd29ya2luZyBvbiB0aGlzLgotCi0gICAgKiBUaGUgY29ubmVjdGlvbiBzdGF0dXMgdGFibGUgaXMgbm90IHZlcnkgZWZmaWNpZW50LiBBbHNvLCB2ZXJ5IGZldyBzdGF0cwotICAgICAgYXJlIGV4cG9ydGVkIHRvIHRoZSBjb25uZWN0aW9uIHN0YXR1cyB0YWJsZSAoZWFzeSB0byBmaXgpLCBhbmQgbW9kX3N0YXR1cwotICAgICAgaXMgdWdseS4KLQotT3RoZXIgYnVncyB0aGF0IG5lZWQgZml4aW5nOgotCi0gICAgKiBNYXhSZXF1ZXN0c1BlckNoaWxkIG1lYXN1cmVzIGNvbm5lY3Rpb25zLCBub3QgcmVxdWVzdHMuCi0gICAgICAgIFVudGlsIHNvbWVvbmUgaGFzIGEgYmV0dGVyIHdheSwgd2UnbGwgcHJvYmFibHkganVzdCByZW5hbWUgaXQKLSAgICAgICAgIk1heENvbm5lY3Rpb25zUGVyQ2hpbGQiLgotICAgIAotICAgICogUmVnZXggY29udGFpbmVycyBkb24ndCB3b3JrIGluIGFuIGludHV0aXZlIHdheQotICAgICAgICBTdGF0dXM6IE5vIG9uZSBoYXMgY29tZSB1cCB3aXRoIGFuIGVmZmljaWVudCB3YXkgdG8gZml4IHRoaXMKLSAgICAgICAgYmVoYXZpb3IuIERlYW4gaGFzIHN1Z2dlc3RlZCBnZXR0aW5nIHJpZCBvZiByZWdleCBjb250YWluZXJzCi0gICAgICAgIGNvbXBsZXRlbHkuCi0KLSAgICAqIFNJR1NFR1Ygb24gTGludXggKGdsaWJjIDIuMS4yKSBpc24ndCBjYXVnaHQgcHJvcGVybHkgYnkgYQotICAgICAgc2lnd2FpdGluZyB0aHJlYWQuIFdlIG5lZWQgdG8gd29yayBhcm91bmQgdGhpcywgcGVyaGFwcyB1bmxlc3MKLSAgICAgIHRoZXJlIGlzIGhvcGUgc29vbiBmb3IgYSBmaXhlZCBnbGliYy4KLQotT3RoZXIgZmVhdHVyZXMgdGhhdCBuZWVkIHdyaXRpbmc6Ci0KLSAgICAqIEZpbmlzaCBpbmZyYXN0cnVjdHVyZSBpbiBjb3JlIGZvciBhc3luYyBNUE1zCi0gICAgICAgIFN0YXR1czogPwotCi0gICAgKiBUT0RPIGluIHNvdXJjZSAtLSBqdXN0IGRvIGFuIGVncmVwIG9uICJUT0RPIiBhbmQgc2VlIHdoYXQncyB0aGVyZQotCi0gICAgKiBXb3JrIG9uIG90aGVyIE1QTXMuIFBvc3NpYmxlIE1QTXMgZGlzY3Vzc2VkIG9yIGluIHByb2dyZXNzIGluY2x1ZGU6Ci0KLSAgICAgIC0gRGVhbiBHYXVkZXQncyBhc3luYyBNUE0KLSAgICAgICAgICBTdGF0dXM6IGRlYW4gaXMgdW5saWtlbHkgdG8gYmVnaW4gd29yayBvbiB0aGlzIGFueSB0aW1lIHNvb24uLi4KLQkgICAgaGFzIGxvdHMgb2YgaWRlYXMgaGUnbGwgc2hhcmUgd2l0aCBmb2xrcyB3aWxsaW5nIHRvIGJlZ2luCi0JICAgIHRhY2tsaW5nIHRoZSBpc3N1ZXMuICB0aGlzIGlzIGFwYWNoZSAyLjEgbWF0ZXJpYWwuCi0KLSAgICAgIC0gWmFjaCBCcm93bidzIDx6YWJAemFiYm8ubmV0PiBMaW51eCBzaWdpbmZvIE1QTQotICAgICAgICAgIFN0YXR1czogPwotCi1Eb2N1bWVudGF0aW9uIHRoYXQgbmVlZHMgd3JpdGluZzoKLQotICAgICogVGhlIGNvbmNlcHQgb2YgTVBNcywgZXNwZWNpYWxseSBpZiB3ZSBzaGlwIG1vcmUgdGhhbiBvbmUgTVBNIGZvciBhCi0gICAgICBnaXZlbiBwbGF0Zm9ybQotCi0gICAgKiBOZXcgZGlyZWN0aXZlcyBpbiB0aGUgdmFyaW91cyBNUE1zCi0KLSAgICAqIEFQSSBkb2N1bWVudGF0aW9uCi0gICAgICAgIFN0YXR1czogQmVuIExhdXJpZSBoYXMgd3JpdHRlbiBzb21lIGhvb2tzIGRvY3VtZW50YXRpb24KLSAgICAgICAgKGFwYWNoZS0yLjAvaHRkb2NzL2hvb2tzLmh0bWwpCi0KLSAgICAqIENoYW5nZXMgc2luY2UgMS4zLjkgY2FuIGJlIG1vcmUgZWFzaWx5IHNlZW4gaW4gdGhlIGNvbW1pdGxvZyBmaWxlCi0gICAgICAgICBkZXYuYXBhY2hlLm9yZzovaG9tZS9jdnMvQ1ZTUk9PVC9jb21taXRsb2dzL2FwYWNoZS0yLjAKLSAgICAgIHdoaWNoIGluY2x1ZGVzIHNvbWUgb2YgUm95J3MgY29tbWVudHMgd2hlbiB0aGUgY2hhbmdlcyB3ZXJlCi0gICAgICBjb21taXR0ZWQgaW4gcm91Z2ggY2hhbmdlLXNldHMgYnkgcHVycG9zZS4gIE5vdGUgdGhhdCB0aGUgY29tbWl0bG9nCi0gICAgICBkb2VzIG5vdCBzaG93IHRoZSBjb250ZW50cyBvZiBuZXcgZmlsZXMgdW50aWwgbGF0ZXIuCi0KLUF2YWlsYWJsZSBQYXRjaGVzOgotCi0gICAqIE1pa2UgQWJib3R0J3MgPG1qYUB0cnVkZ2UuZW5nci5zZ2kuY29tPiBwYXRjaGVzIHRvIGltcHJvdmUKLSAgICAgcGVyZm9ybWFuY2UKLSAgICAgICBTdGF0dXM6IFRoZXNlIHdlcmUgd3JpdHRlbiBmb3IgMS4zLCBhbmQgYXJlIGF3YWl0aW5nIGEgcG9ydCB0bwotICAgICAgIDIuMAotCi1PcGVuIGlzc3VlczoKLQotICAgKiBXaGF0IGRvIHdlIGRvIGFib3V0IG1vZF9wcm94eT8KLQotICAgKiBXaGljaCBNUE1zIHdpbGwgYmUgaW5jbHVkZWQgd2l0aCBBcGFjaGUgMi4wPwotCi0gICAqIElzIGNvbmYvaGlnaHBlcmZvcm1hbmNlLmNvbmYtZGlzdCBvYnNvbGV0ZT8gIEl0IGxvb2tzIG9ic29sZXRlLgotCmRpZmYgLS1naXQgYS9hY2luY2x1ZGUubTQgYi9hY2luY2x1ZGUubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NTI3MDIuLjAwMDAwMDAKLS0tIGEvYWNpbmNsdWRlLm00CisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLQotQUNfREVGVU4oQVBBQ0hFX1BBU1NUSFJVLFsKLSAgdW5zZXQgYWNfY3ZfcGFzc18kMQotICBBQ19DQUNIRV9WQUwoYWNfY3ZfcGFzc18kMSwgW2FjX2N2X3Bhc3NfJDE9JCQxXSkKLV0pCi0KLWRubCBBUEFDSEVfU1VCU1QoVkFSSUFCTEUpCi1kbmwgTWFrZXMgVkFSSUFCTEUgYXZhaWxhYmxlIGluIGdlbmVyYXRlZCBmaWxlcwotZG5sIChkbyBub3QgdXNlIEB2YXJpYWJsZUAgaW4gTWFrZWZpbGVzLCBidXQgJCh2YXJpYWJsZSkpCi1BQ19ERUZVTihBUEFDSEVfU1VCU1QsWwotICBBUEFDSEVfVkFSX1NVQlNUPSIkQVBBQ0hFX1ZBUl9TVUJTVCAkMSIKLSAgQUNfU1VCU1QoJDEpCi1dKQotCi1kbmwgQVBBQ0hFX0ZBU1RfT1VUUFVUKEZJTEVOQU1FKQotZG5sIFBlcmZvcm0gc3Vic3RpdHV0aW9ucyBvbiBGSUxFTkFNRSAoTWFrZWZpbGVzIG9ubHkpCi1BQ19ERUZVTihBUEFDSEVfRkFTVF9PVVRQVVQsWwotICBBUEFDSEVfRkFTVF9PVVRQVVRfRklMRVM9IiRBUEFDSEVfRkFTVF9PVVRQVVRfRklMRVMgJDEiCi1dKQotCi1kbmwgQVBBQ0hFX01LRElSX1BfQ0hFQ0sKLWRubCBjaGVja3Mgd2hldGhlciBta2RpciAtcCB3b3JrcwotQUNfREVGVU4oQVBBQ0hFX01LRElSX1BfQ0hFQ0ssWwotICBBQ19DQUNIRV9DSEVDSyhmb3Igd29ya2luZyBta2RpciAtcCwgYWNfY3ZfbWtkaXJfcCxbCi0gICAgdGVzdCAtZCBjb25mdGVzdGRpciAmJiBybSAtcmYgY29uZnRlc3RkaXIKLSAgICBta2RpciAtcCBjb25mdGVzdGRpci9zb21lZGlyID4vZGV2L251bGwgMj4mMQotICAgIGlmIHRlc3QgLWQgY29uZnRlc3RkaXIvc29tZWRpcjsgdGhlbgotICAgICAgYWNfY3ZfbWtkaXJfcD15ZXMKLSAgICBlbHNlCi0gICAgICBhY19jdl9ta2Rpcl9wPW5vCi0gICAgZmkKLSAgICBybSAtcmYgY29uZnRlc3RkaXIKLSAgXSkKLV0pCi0KLWRubCBBUEFDSEVfRkFTVF9HRU5FUkFURQotZG5sIENyZWF0ZXMgTWFrZWZpbGVzIGFuZCBjb25maWdfdmFycy5tawotQUNfREVGVU4oQVBBQ0hFX0ZBU1RfR0VORVJBVEUsWwotICBBUEFDSEVfU1VCU1QoYWJzX3NyY2RpcikKLSAgQVBBQ0hFX1NVQlNUKGJpbmRpcikKLSAgQVBBQ0hFX1NVQlNUKGNnaWRpcikKLSAgQVBBQ0hFX1NVQlNUKGxvZ2RpcikKLSAgQVBBQ0hFX1NVQlNUKGV4ZWNfcHJlZml4KQotICBBUEFDSEVfU1VCU1QobGliZXhlY2RpcikKLSAgQVBBQ0hFX1NVQlNUKGh0ZG9jc2RpcikKLSAgQVBBQ0hFX1NVQlNUKGluY2x1ZGVkaXIpCi0gIEFQQUNIRV9TVUJTVChpY29uc2RpcikKLSAgQVBBQ0hFX1NVQlNUKHN5c2NvbmZkaXIpCi0gIEFQQUNIRV9TVUJTVChwcmVmaXgpCi0gIEFQQUNIRV9TVUJTVChDQykKLSAgQVBBQ0hFX1NVQlNUKENGTEFHUykKLSAgQVBBQ0hFX1NVQlNUKENQUEZMQUdTKQotICBBUEFDSEVfU1VCU1QoTERGTEFHUykKLSAgQVBBQ0hFX1NVQlNUKERFRlMpCi0gIEFQQUNIRV9TVUJTVChMSUJUT09MKQotICBBUEFDSEVfU1VCU1QoU0hFTEwpCi0gIEFQQUNIRV9TVUJTVChNT0RVTEVfRElSUykKLQotICBhYnNfc3JjZGlyPSJgKGNkICRzcmNkaXIgJiYgcHdkKWAiCi0KLSAgQVBBQ0hFX01LRElSX1BfQ0hFQ0sKLSAgZWNobyBjcmVhdGluZyBjb25maWdfdmFycy5tawotICA+IGNvbmZpZ192YXJzLm1rCi0gIGZvciBpIGluICRBUEFDSEVfVkFSX1NVQlNUOyBkbwotICAgIGV2YWwgZWNobyAiJGkgPSBcJCRpIiA+PiBjb25maWdfdmFycy5tawotICBkb25lCi0gICRTSEVMTCAkc3JjZGlyL2J1aWxkL2Zhc3RnZW4uc2ggJHNyY2RpciAkYWNfY3ZfbWtkaXJfcCAkQVBBQ0hFX0ZBU1RfT1VUUFVUX0ZJTEVTCi1dKQotCi1BQ19ERUZVTihBUEFDSEVfTElCVE9PTF9TSUxFTlQsWwotICBMSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCAtLXNpbGVudCcKLV0pCi0KLSAgICAKLWRubCAjIyBBUEFDSEVfT1VUUFVUKGZpbGUpCi1kbmwgIyMgYWRkcyAiZmlsZSIgdG8gdGhlIGxpc3Qgb2YgZmlsZXMgZ2VuZXJhdGVkIGJ5IEFDX09VVFBVVAotZG5sICMjIFRoaXMgbWFjcm8gY2FuIGJlIHVzZWQgc2V2ZXJhbCB0aW1lcy4KLUFDX0RFRlVOKEFQQUNIRV9PVVRQVVQsIFsKLSAgQVBBQ0hFX09VVFBVVF9GSUxFUz0iJEFQQUNIRV9PVVRQVVRfRklMRVMgJDEiCi1dKQotCi1kbmwKLWRubCBBQ19BRERfTElCUkFSWShsaWJyYXJ5KQotZG5sCi1kbmwgYWRkIGEgbGlicmFyeSB0byB0aGUgbGluayBsaW5lCi1kbmwKLUFDX0RFRlVOKEFDX0FERF9MSUJSQVJZLFsKLSAgQVBBQ0hFX09OQ0UoTElCUkFSWSwgJDEsIFsKLSAgICBFWFRSQV9MSUJTPSIkRVhUUkFfTElCUyAtbCQxIgotICBdKQotXSkKLQotZG5sCi1kbmwgQUNfQ0hFQ0tfREVGSU5FKG1hY3JvLCBoZWFkZXJmaWxlKQotZG5sCi1kbmwgY2hlY2tzIGZvciB0aGUgbWFjcm8gaW4gdGhlIGhlYWRlciBmaWxlCi1kbmwKLUFDX0RFRlVOKEFDX0NIRUNLX0RFRklORSxbCi0gIEFDX0NBQ0hFX0NIRUNLKGZvciAkMSBpbiAkMiwgYWNfY3ZfZGVmaW5lXyQxLAotICBBQ19FR1JFUF9DUFAoW1lFU19JU19ERUZJTkVEXSwgWwotI2luY2x1ZGUgPCQyPgotI2lmZGVmICQxCi1ZRVNfSVNfREVGSU5FRAotI2VuZGlmCi0gIF0sIGFjX2N2X2RlZmluZV8kMT15ZXMsIGFjX2N2X2RlZmluZV8kMT1ubykpCi0gIGlmIHRlc3QgIiRhY19jdl9kZWZpbmVfJDEiID0gInllcyIgOyB0aGVuCi0gICAgICBBQ19ERUZJTkUoSEFWRV8kMSwsCi0gICAgICAgICAgW0RlZmluZSBpZiB0aGUgbWFjcm8gIiQxIiBpcyBkZWZpbmVkIG9uIHRoaXMgc3lzdGVtXSkKLSAgZmkKLV0pCi0KLWRubAotZG5sIEFDX1RZUEVfUkxJTV9UCi1kbmwKLWRubCBJZiBybGltX3QgaXMgbm90IGRlZmluZWQsIGRlZmluZSBpdCB0byBpbnQKLWRubAotQUNfREVGVU4oQUNfVFlQRV9STElNX1QsIFsKLSAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBybGltX3RdLCBhY19jdl90eXBlX3JsaW1fdCwgWwotICAgIEFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+XSwgW3JsaW1fdCBzcG9vbjtdLCBbCi0gICAgICBhY19jdl90eXBlX3JsaW1fdD15ZXMKLSAgICBdLFthY19jdl90eXBlX3JsaW1fdD1ubwotICAgIF0pCi0gIF0pCi0gIGlmIHRlc3QgIiRhY19hY190eXBlX3JsaW1fdCIgPSAibm8iIDsgdGhlbgotICAgICAgQUNfREVGSU5FKHJsaW1fdCwgaW50LAotICAgICAgICAgIFtEZWZpbmUgdG8gJ2ludCcgaWYgPHN5cy9yZXNvdXJjZS5oPiBkb2Vzbid0IGRlZmluZSBpdCBmb3IgdXNdKQotICBmaQotXSkKLQotZG5sCi1kbmwgQVBBQ0hFX09OQ0UobmFtZXNwYWNlLCB2YXJpYWJsZSwgY29kZSkKLWRubAotZG5sIGV4ZWN1dGUgY29kZSwgaWYgdmFyaWFibGUgaXMgbm90IHNldCBpbiBuYW1lc3BhY2UKLWRubAotQUNfREVGVU4oQVBBQ0hFX09OQ0UsWwotICB1bmlxdWU9YGVjaG8gJGFjX24gIiQyJGFjX2MiIHwgdHIgLWNkIGEtekEtWjAtOWAKLSAgY21kPSJlY2hvICRhY19uIFwiXCQkMSR1bmlxdWUkYWNfY1wiIgotICBpZiB0ZXN0IC1uICIkdW5pcXVlIiAmJiB0ZXN0ICJgZXZhbCAkY21kYCIgPSAiIiA7IHRoZW4KLSAgICBldmFsICIkMSR1bmlxdWU9c2V0IgotICAgICQzCi0gIGZpCi1dKQotCi1zaW5jbHVkZShsaWIvYXByL3RocmVhZHMubTQpCi0KLWRubAotZG5sIEFQQUNIRV9JTkFERFJfTk9ORQotZG5sCi1kbmwgY2hlY2tzIGZvciBtaXNzaW5nIElOQUREUl9OT05FIG1hY3JvCi1kbmwKLUFDX0RFRlVOKEFQQUNIRV9JTkFERFJfTk9ORSxbCi0gIEFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgc3lzdGVtIGRlZmluZXMgSU5BRERSX05PTkUsIGFjX2N2X2luYWRkcl9ub25lLFsKLSAgQUNfVFJZX0NPTVBJTEUoWwotI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICi0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX0FSUEFfSU5FVF9ICi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0jZW5kaWYKLV0sWwotdW5zaWduZWQgbG9uZyBmb28gPSBJTkFERFJfTk9ORTsKLV0sWwotICAgIGFjX2N2X2luYWRkcl9ub25lPXllcwotXSxbCi0gICAgYWNfY3ZfaW5hZGRyX25vbmU9bm8KLV0pXSkKLSAgaWYgdGVzdCAiJGFjX2N2X2luYWRkcl9ub25lIiA9ICJubyI7IHRoZW4JCi0gICAgQUNfREVGSU5FKElOQUREUl9OT05FLCAoKHVuc2lnbmVkIGludCkgMHhmZmZmZmZmZiksIFsgXSkKLSAgZmkKLV0pCi0KLUFDX0RFRlVOKEFQQUNIRV9DSEVDS19TSE1fUlcsWwotICBBQ19DQUNIRV9DSEVDSyhbd2hldGhlciBzeXN0ZW0gZGVmaW5lcyBTSE1fUixTSE1fV10sYWNfY3Zfc2htX3J3LFsKLSAgQUNfVFJZX0NPTVBJTEUoWwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9pcGMuaD4KLSNpbmNsdWRlIDxzeXMvc2htLmg+Ci1dLFsKLSAgaW50IHggPSBTSE1fUiB8IFNITV9XOwotXSxbCi0gIGFjX2N2X3NobV9ydz15ZXMKLV0sWwotICBhY19jdl9zaG1fcnc9bm8KLV0pXSkKLSAgaWYgdGVzdCAiJGFjX2N2X3NobV9ydyIgPSAibm8iOyB0aGVuCi0gICAgQUNfREVGSU5FKFNITV9SLCAweDQwMCwgWyBdKQotICAgIEFDX0RFRklORShTSE1fVywgMHgyMDAsIFsgXSkKLSAgZmkKLV0pCi0KLQotZG5sIEFQQUNIRV9NT0RQQVRIX0lOSVQobW9kcGF0aCkKLUFDX0RFRlVOKEFQQUNIRV9NT0RQQVRIX0lOSVQsWwotICBtb2RwYXRoX2N1cnJlbnQ9bW9kdWxlcy8kMQotICBtb2RwYXRoX3N0YXRpYz0KLSAgbW9kcGF0aF9zaGFyZWQ9Ci0gIHRlc3QgLWQgJDEgfHwgJHNyY2Rpci9oZWxwZXJzL21rZGlyLnNoICRtb2RwYXRoX2N1cnJlbnQKLSAgPiAkbW9kcGF0aF9jdXJyZW50L21vZHVsZXMubWsKLSAgTU9EVUxFX0RJUlM9IiRNT0RVTEVfRElSUyAkMSIKLV0pZG5sCi1kbmwKLUFDX0RFRlVOKEFQQUNIRV9NT0RQQVRIX0ZJTklTSCxbCi0gIGVjaG8gInN0YXRpYyA9ICRtb2RwYXRoX3N0YXRpYyIgPj4gJG1vZHBhdGhfY3VycmVudC9tb2R1bGVzLm1rCi0gIGVjaG8gInNoYXJlZCA9ICRtb2RwYXRoX3NoYXJlZCIgPj4gJG1vZHBhdGhfY3VycmVudC9tb2R1bGVzLm1rCi0gIEFQQUNIRV9GQVNUX09VVFBVVCgkbW9kcGF0aF9jdXJyZW50L01ha2VmaWxlKQotXSlkbmwKLWRubAotZG5sIEFQQUNIRV9NT0RQQVRIX0FERChuYW1lWywgc2hhcmVkWywgb2JqZWN0cyBbLCBsZGZsYWdzWywgbGlic11dXV0pCi1BQ19ERUZVTihBUEFDSEVfTU9EUEFUSF9BREQsWwotICBpZiB0ZXN0IC16ICIkMyI7IHRoZW4KLSAgICBvYmplY3RzPSJtb2RfJDEubG8iCi0gIGVsc2UKLSAgICBvYmplY3RzPSIkMyIKLSAgZmkKLQotICBpZiB0ZXN0IC16ICIkbW9kdWxlX3N0YW5kYWxvbmUiOyB0aGVuCi0gICAgaWYgdGVzdCAteiAiJDIiOyB0aGVuCi0gICAgICBsaWJuYW1lPSJsaWJhcGFjaGVtb2RfJDEubGEiCi0gICAgICBCVUlMVElOX0xJQlM9IiRCVUlMVElOX0xJQlMgJG1vZHBhdGhfY3VycmVudC8kbGlibmFtZSIKLSAgICAgIG1vZHBhdGhfc3RhdGljPSIkbW9kcGF0aF9zdGF0aWMgJGxpYm5hbWUiCi0gICAgICBjYXQgPj4kbW9kcGF0aF9jdXJyZW50L21vZHVsZXMubWs8PEVPRgotJGxpYm5hbWU6ICRvYmplY3RzCi0JXCQoTElOSykgJG9iamVjdHMKLUVPRgotICAgIGVsc2UKLSAgICAgIGFwYWNoZV9uZWVkX3NoYXJlZD15ZXMKLSAgICAgIGxpYm5hbWU9Im1vZF8kMS5sYSIKLSAgICAgIHNob2JqZWN0cz1gZWNobyAkb2JqZWN0cyB8IHNlZCAncy9cLmxvLy5zbG8vJ2AKLSAgICAgIG1vZHBhdGhfc2hhcmVkPSIkbW9kcGF0aF9zaGFyZWQgJGxpYm5hbWUiCi0gICAgICBjYXQgPj4kbW9kcGF0aF9jdXJyZW50L21vZHVsZXMubWs8PEVPRgotJGxpYm5hbWU6ICRzaG9iamVjdHMKLQlcJChTSExJTkspIC1ycGF0aCBcJChsaWJleGVjZGlyKSAtbW9kdWxlIC1hdm9pZC12ZXJzaW9uICQ0ICRvYmplY3RzICQ1Ci1FT0YKLSAgICBmaQotICBmaQotXSlkbmwKLWRubAotZG5sIEFQQUNIRV9NT0RVTEUobmFtZSwgaGVscHRleHRbLCBvYmplY3RzWywgc3RydWN0bmFtZVssIGRlZmF1bHRbLCBjb25maWddXV1dKQotQUNfREVGVU4oQVBBQ0hFX01PRFVMRSxbCi0gIEFDX01TR19DSEVDS0lORyh3aGV0aGVyIHRvIGVuYWJsZSBtb2RfJDEpCi0gIEFDX0FSR19FTkFCTEUodHJhbnNsaXQoJDEsXywtKSxbICAtLV1pZmVsc2UoJDUseWVzLGRpc2FibGUsZW5hYmxlKVstXXRyYW5zbGl0KCQxLF8sLSksLGVuYWJsZV8kMT1pZmVsc2UoJDUsLG5vLCQ1KSkKLSAgQUNfTVNHX1JFU1VMVCgkZW5hYmxlXyQxKQotICBpZiB0ZXN0ICIkZW5hYmxlXyQxIiAhPSAibm8iOyB0aGVuCi0gICAgY2FzZSAiJGVuYWJsZV8kMSIgaW4KLSAgICBzaGFyZWQqKQotICAgICAgZW5hYmxlXyQxPWBlY2hvICRhY19uICRlbmFibGVfJDEkYWNfY3xzZWQgJ3Mvc2hhcmVkLCovLydgCi0gICAgICBzaGFyZWQ9eWVzOzsKLSAgICAqKQotICAgICAgTU9ETElTVD0iJE1PRExJU1QgaWZlbHNlKCQ0LCwkMSwkNCkiCi0gICAgICBzaGFyZWQ9IiI7OwotICAgIGVzYWMKLSAgICBpZmVsc2UoJDYsLDosJDYpCi0gICAgQVBBQ0hFX01PRFBBVEhfQUREKCQxLCAkc2hhcmVkLCAkMykKLSAgZmkKLV0pZG5sCi1kbmwKLWRubCBBUEFDSEVfTEFZT1VUKGNvbmZpZ2xheW91dCwgbGF5b3V0bmFtZSkKLUFDX0RFRlVOKEFQQUNIRV9MQVlPVVQsWwotICBwbGRjb25mPWNvbmZpZy5wbGQKLSAgY2hhbmdlcXVvdGUoeyx9KQotICBzZWQgLWUgIjEsL1sgCV0qPFtsTF1heW91dFsgCV0qJDJbIAldKj5bIAldKi9kIiBcCi0gICAgICAtZSAnL1sgCV0qPFwvTGF5b3V0PlsgCV0qLywkZCcgXAotICAgICAgLWUgInMvXlsgCV0qLy9nIiBcCi0gICAgICAtZSAicy86WyAJXSovPVwnL2ciIFwKLSAgICAgIC1lICJzL1sgCV0qJC8nL2ciIFwKLSAgICAgICQxID4gJHBsZGNvbmYKLSAgY2hhbmdlcXVvdGUoWyxdKQotICBsYXlvdXRfbmFtZT0kbmFtZQotICAuICRwbGRjb25mCi0gIHJtICRwbGRjb25mCi0gIGZvciB2YXIgaW4gcHJlZml4IGV4ZWNfcHJlZml4IGJpbmRpciBzYmluZGlyIGxpYmV4ZWNkaXIgbWFuZGlyIFwKLSAgICAgICAgICAgICBzeXNjb25mZGlyIGRhdGFkaXIgaWNvbnNkaXIgaHRkb2NzZGlyIGNnaWRpciBpbmNsdWRlZGlyIFwKLSAgICAgICAgICAgICBsb2NhbHN0YXRlZGlyIHJ1bnRpbWVkaXIgbG9nZmlsZWRpciBwcm94eWNhY2hlZGlyOyBkbwotICAgIGV2YWwgInZhbD1cIlwkJHZhclwiIgotICAgIGNhc2UgJHZhbCBpbgotICAgICAgKispCi0gICAgICAgIHZhbD1gZWNobyAkdmFsIHwgc2VkIC1lICdzO1wrJDs7J2AKLSAgICAgICAgZXZhbCAiJHZhcj1cIlwkdmFsXCIiCi0gICAgICAgIGF1dG9zdWZmaXg9eWVzCi0gICAgICAgIDs7Ci0gICAgICAqKQotICAgICAgICBhdXRvc3VmZml4PW5vCi0gICAgICAgIDs7Ci0gICAgZXNhYwotICAgIHZhbD1gZWNobyAkdmFsIHwgc2VkIC1lICdzOlwoLlwpLyokOlwxOidgCi0gICAgaWYgdGVzdCAiJGF1dG9zdWZmaXgiID0gInllcyI7IHRoZW4KLSAgICAgIGlmIGVjaG8gJHZhbCB8IGdyZXAgYXBhY2hlID4vZGV2L251bGw7IHRoZW4KLSAgICAgICAgYWRkdGFyZ2V0PW5vCi0gICAgICBlbHNlCi0gICAgICAgIGFkZHRhcmdldD15ZXMKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0ICIkYWRkdGFyZ2V0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIHZhbD0iJHZhbC9hcGFjaGUiCi0gICAgICBmaQotICAgIGZpCi0gICAgZXZhbCAiJHZhcj1cIiR2YWxcIiIKLSAgZG9uZQotXSlkbmwKLWRubAotZG5sIEFQQUNIRV9FTkFCTEVfTEFZT1VUCi1kbmwKLUFDX0RFRlVOKEFQQUNIRV9FTkFCTEVfTEFZT1VULFsKLUFDX0FSR19FTkFCTEUobGF5b3V0LAotWyAgLS1lbmFibGUtbGF5b3V0PUxBWU9VVF0sWwotICBMQVlPVVQ9JGVuYWJsZXZhbAotXSkKLQotaWYgdGVzdCAteiAiJExBWU9VVCI7IHRoZW4KLSAgaHRkb2NzZGlyPSckKHByZWZpeCkvaHRkb2NzJwotICBpY29uc2Rpcj0nJChwcmVmaXgpL2ljb25zJwotICBjZ2lkaXI9JyQocHJlZml4KS9jZ2ktYmluJwotICBsb2dkaXI9JyQocHJlZml4KS9sb2dzJwotICBzeXNjb25mZGlyPSckKHByZWZpeCkvY29uZicKLSAgbGF5b3V0X25hbWU9QXBhY2hlCi1lbHNlICAKLSAgQVBBQ0hFX0xBWU9VVCgkc3JjZGlyLy4uL2NvbmZpZy5sYXlvdXQsICRMQVlPVVQpCi1maQotCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIGNob3NlbiBsYXlvdXQpCi1BQ19NU0dfUkVTVUxUKCRsYXlvdXRfbmFtZSkKLV0pZG5sCi1kbmwKLWRubCBBUEFDSEVfRU5BQkxFX1NIQVJFRAotZG5sCi1BQ19ERUZVTihBUEFDSEVfRU5BQkxFX1NIQVJFRCxbCi1BQ19BUkdfRU5BQkxFKHNoYXJlZCwKLVsgIC0tZW5hYmxlLXNoYXJlZD1NT0RVTEUtTElTVF0sWwotICBmb3IgaSBpbiAkZW5hYmxldmFsOyBkbwotICAJZXZhbCAiZW5hYmxlXyRpPXNoYXJlZCIKLSAgZG9uZQotXSkKLV0pZG5sCi1kbmwKLWRubCBBUEFDSEVfRU5BQkxFX01PRFVMRVMKLWRubAotQUNfREVGVU4oQVBBQ0hFX0VOQUJMRV9NT0RVTEVTLFsKLUFDX0FSR19FTkFCTEUobW9kdWxlcywKLVsgIC0tZW5hYmxlLW1vZHVsZXM9TU9EVUxFLUxJU1RdLFsKLSAgZm9yIGkgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBldmFsICJlbmFibGVfJGk9eWVzIgotICBkb25lCi1dKQotXSlkbmwKZGlmZiAtLWdpdCBhL2J1aWxkL01ha2VFdGFncyBiL2J1aWxkL01ha2VFdGFncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjVmNmJkYS4uMDAwMDAwMAotLS0gYS9idWlsZC9NYWtlRXRhZ3MKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBUaGlzIGZpbGUgaWxsdXN0cmF0ZXMgaG93IHRvIGdlbmVyYXRlIGEgdXNlZnVsIFRBR1MgZmlsZSB2aWEgZXRhZ3MKLSMgZm9yIGVtYWNzLiAgVGhpcyBzaG91bGQgYmUgaW52b2tlZCBmcm9tIHRoZSBzcmMgZGlyZWN0b3J5IGkuZS46Ci0jICAgPiBoZWxwZXJzL01ha2VFdGFncwotIyBhbmQgd2lsbCBjcmVhdGUgYSBUQUdTIGZpbGUgaW4gdGhlIHNyYyBkaXJlY3RvcnkuCi0KLSMgVGhpcyBzY3JpcHQgZmFsbHMgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLgotIyBTZWUgaHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvTElDRU5TRQotCi0jIE9uY2UgeW91IGhhdmUgY3JlYXRlZCBzcmMvVEFHUyBpbiBlbWFjcyB5b3UnbGwgbmVlZCB0byBzZXR1cAotIyB0YWctdGFibGUtYWxpc3Qgd2l0aCBhbiBlbnRyeSB0byBhc3N1cmUgaXQgZmluZHMgdGhlIHNpbmdsZSBzcmMvVEFHUwotIyBmaWxlIGZyb20gdGhlIG1hbnkgc291cmNlIGRpcmVjdG9yaWVzLiAgU29tZXRoaW5nIGFsb25nIHRoZXNlIGxpbmVzOgotIyAoc2V0cSB0YWctdGFibGUtYWxpc3QKLSMJJygoIi9ob21lL21lL3dvcmsvYXBhY2hlLTEuMy9zcmMvIiAKLSMJICAgLiAiL2hvbWUvbWUvd29yay9hcGFjaGUtMS4zL3NyYy8iKQotIwkgKSkKLQotIyBUaGlzIHJlcXVpcmVzIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIGV0YWdzLCBpLmUuIHRoZQotIyBvbmUgY2FsbGVkICJFeHViZXJhbnQgY3RhZ3MiIGF2YWlsYWJsZSBhdDoKLSMgICAgaHR0cDovL2ZseS5oaXdhYXkubmV0L35kYXJyZW4vY3RhZ3MvCi0jIE9uY2UgdGhhdCBpcyBzZXR1cCB5b3UnbGwgbmVlZCB0byBwb2ludCB0byB0aGUKLSMgZXhlY3V0YWJsZSBoZXJlOgotCi1ldGFncz1+L2xvY2FsL2Jpbi9ldGFncwotCi0jIEV4dWJlcmFudCBldGFncyBpcyBuZWNlc3Nhcnkgc2luY2UgaXQgY2FuIGlnbm9yZSBzb21lIGRlZmluZWQgc3ltYm9scwotIyB0aGF0IG9ic2N1cmUgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZXMuCi0KLWlnbm9yZT1BUElfRVhQT1JULEFQSV9FWFBPUlRfTk9OU1RELF9fZGVjbHNwZWMKLQotIyBDcmVhdGUgYW4gZXRhZ3MgZmlsZSBhdCB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0jIHRyZWUsIHRoZW4gY3JlYXRlIHN5bWJvbCBsaW5rcyB0byBpdCBmcm9tIGVhY2gKLSMgZGlyZWN0b3J5IGluIHRoZSBzb3VyY2UgdHJlZS4gIEJ5IHBhc3NpbmcgZXRhZ3MKLSMgYWJzb2x1dGUgcGF0aG5hbWVzIHdlIGdldCBhIHRhZyBmaWxlIHRoYXQgaXMKLSMgTk9UIHBvcnRhYmxlIHdoZW4gd2UgbW92ZSB0aGUgZGlyZWN0b3J5IHRyZWUuCi0KLWZpbmQgLiAtbmFtZSAnKi5bY2hdJyAtcHJpbnQgfCAkZXRhZ3MgLUkgIiRpZ25vcmUiICAtTCAtCi0KZGlmZiAtLWdpdCBhL2J1aWxkL1ByaW50UGF0aCBiL2J1aWxkL1ByaW50UGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTA4ZDI3NC4uMDAwMDAwMAotLS0gYS9idWlsZC9QcmludFBhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotIyEvYmluL3NoCi0jIExvb2sgZm9yIHByb2dyYW1bc10gc29tZXdoZXJlIGluICRQQVRILgotIwotIyBPcHRpb25zOgotIyAgLXMKLSMgICAgRG8gbm90IHByaW50IG91dCBmdWxsIHBhdGhuYW1lLiAoc2lsZW50KQotIyAgLXBQQVRITkFNRQotIyAgICBMb29rIGluIFBBVEhOQU1FIGluc3RlYWQgb2YgJFBBVEgKLSMKLSMgVXNhZ2U6Ci0jICBQcmludFBhdGggWy1zXSBbLXBQQVRITkFNRV0gcHJvZ3JhbSBbcHJvZ3JhbSAuLi5dCi0jCi0jIEluaXRpYWxseSB3cml0dGVuIGJ5IEppbSBKYWdpZWxza2kgZm9yIHRoZSBBcGFjaGUgY29uZmlndXJhdGlvbiBtZWNoYW5pc20KLSMgICh3aXRoIGt1ZG9zIHRvIEtlcm5pZ2hhbi9QaWtlKQotIwotIyBUaGlzIHNjcmlwdCBmYWxscyB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UuCi0jIFNlZSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvZG9jcy9MSUNFTlNFCi0KLSMjCi0jIFNvbWUgImNvbnN0YW50cyIKLSMjCi1wYXRobmFtZT0kUEFUSAotZWNobz0ieWVzIgotCi0jIwotIyBGaW5kIG91dCB3aGF0IE9TIHdlIGFyZSBydW5uaW5nIGZvciBsYXRlciBvbgotIyMKLW9zPWAodW5hbWUpIDI+L2Rldi9udWxsYAotCi0jIwotIyBQYXJzZSBjb21tYW5kIGxpbmUKLSMjCi1mb3IgYXJncyBpbiAkKgotZG8KLSAgICBjYXNlICRhcmdzIGluCi0JLXMgICkgZWNobz0ibm8iIDs7Ci0JLXAqICkgcGF0aG5hbWU9ImBlY2hvICRhcmdzIHwgc2VkICdzL14uLi8vJ2AiIDs7Ci0JKiAgICkgcHJvZ3JhbXM9IiRwcm9ncmFtcyAkYXJncyIgOzsKLSAgICBlc2FjCi1kb25lCi0KLSMjCi0jIE5vdyB3ZSBtYWtlIHRoZSBhZGp1c3RtZW50cyByZXF1aXJlZCBmb3IgT1MvMiBhbmQgZXZlcnlvbmUKLSMgZWxzZSA6KQotIwotIyBGaXJzdCBvZiBhbGwsIGFsbCBPUy8yIHByb2dyYW1zIGhhdmUgdGhlICcuZXhlJyBleHRlbnNpb24uCi0jIE5leHQsIHdlIGFkanVzdCBQQVRIIChvciB3aGF0IHdhcyBnaXZlbiB0byB1cyBhcyBQQVRIKSB0bwotIyBiZSB3aGl0ZXNwYWNlIHNlcGVyYXRlZCBkaXJlY3Rvcmllcy4KLSMgRmluYWxseSwgd2UgdHJ5IHRvIGRldGVybWluZSB0aGUgYmVzdCBmbGFnIHRvIHVzZSBmb3IKLSMgdGVzdC9bXSB0byBsb29rIGZvciBhbiBleGVjdXRhYmxlIGZpbGUuIE9TLzIganVzdCBoYXMgJy1yJwotIyBidXQgd2l0aCBvdGhlciBPU3MsIHdlIGRvIHNvbWUgZnVubnkgc3R1ZmYgdG8gY2hlY2sgdG8gc2VlCi0jIGlmIHRlc3QvW10ga25vd3MgYWJvdXQgLXgsIHdoaWNoIGlzIHRoZSBwcmVmZXJlZCBmbGFnLgotIyMKLQotaWYgWyAieCRvcyIgPSAieE9TLzIiIF0KLXRoZW4KLSAgICBleHQ9Ii5leGUiCi0gICAgcGF0aG5hbWU9YGVjaG8gLUUgJHBhdGhuYW1lIHwKLSAgICAgc2VkICdzL147Ly47LwotCSAgcy87Oy87LjsvZwotCSAgcy87JC87Li8KLQkgIHMvOy8gL2cKLQkgIHMvXFxcXC9cXC8vZycgYAotICAgIHRlc3RfZXhlY19mbGFnPSItciIKLWVsc2UKLSAgICBleHQ9IiIJIyBObyBkZWZhdWx0IGV4dGVuc2lvbnMKLSAgICBwYXRobmFtZT1gZWNobyAkcGF0aG5hbWUgfAotICAgICBzZWQgJ3MvXjovLjovCi0JICBzLzo6LzouOi9nCi0JICBzLzokLzouLwotCSAgcy86LyAvZycgYAotICAgICMgSGVyZSBpcyBob3cgd2UgdGVzdCB0byBzZWUgaWYgdGVzdC9bXSBjYW4gaGFuZGxlIC14Ci0gICAgdGVzdGZpbGU9InBwLnQuJCQiCi0KLSAgICBjYXQgPiAkdGVzdGZpbGUgPDxFTkRURVNUCi0jIS9iaW4vc2gKLWlmIFsgLXggLyBdIHx8IFsgLXggL2JpbiBdIHx8IFsgLXggL2Jpbi9scyBdOyB0aGVuCi0gICAgZXhpdCAwCi1maQotZXhpdCAxCi1FTkRURVNUCi0KLSAgICBpZiBgL2Jpbi9zaCAkdGVzdGZpbGUgMj4vZGV2L251bGxgOyB0aGVuCi0JdGVzdF9leGVjX2ZsYWc9Ii14IgotICAgIGVsc2UKLQl0ZXN0X2V4ZWNfZmxhZz0iLXIiCi0gICAgZmkKLSAgICBybSAtZiAkdGVzdGZpbGUKLWZpCi0KLWZvciBwcm9ncmFtIGluICRwcm9ncmFtcwotZG8KLSAgICBmb3IgcGF0aCBpbiAkcGF0aG5hbWUKLSAgICBkbwotCWlmIFsgJHRlc3RfZXhlY19mbGFnICRwYXRoLyR7cHJvZ3JhbX0ke2V4dH0gXSAmJiBcCi0JICAgWyAhIC1kICRwYXRoLyR7cHJvZ3JhbX0ke2V4dH0gXTsgdGhlbgotCSAgICBpZiBbICJ4JGVjaG8iID0gInh5ZXMiIF07IHRoZW4KLQkJZWNobyAkcGF0aC8ke3Byb2dyYW19JHtleHR9Ci0JICAgIGZpCi0JICAgIGV4aXQgMAotCWZpCi0gICAgZG9uZQotZG9uZQotZXhpdCAxCi0KZGlmZiAtLWdpdCBhL2J1aWxkL2J1aWxkLW1vZHVsZXMtYy5hd2sgYi9idWlsZC9idWlsZC1tb2R1bGVzLWMuYXdrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWZmODJjLi4wMDAwMDAwCi0tLSBhL2J1aWxkL2J1aWxkLW1vZHVsZXMtYy5hd2sKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1CRUdJTiB7Ci0gICAgUlMgPSAiICIKLSAgICBtb2R1bGVzW24rK10gPSAiY29yZSIKLSAgICBwbW9kdWxlc1twbisrXSA9ICJjb3JlIgotfSAKLXsKLSAgICBtb2R1bGVzW25dID0gJDE7Ci0gICAgcG1vZHVsZXNbcG5dID0gJDE7Ci0gICAgZ3N1YigiXG4iLCIiLG1vZHVsZXNbbl0pOwotICAgIGdzdWIoIlxuIiwiIixwbW9kdWxlc1twbl0pOwotICAgICsrbjsKLSAgICArK3BuOwotfSAKLUVORCB7Ci0gICAgcHJpbnQgIi8qIgotICAgIHByaW50ICIgKiBtb2R1bGVzLmMgLS0tIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IEFwYWNoZSIKLSAgICBwcmludCAiICogY29uZmlndXJhdGlvbiBzY3JpcHQuICBETyBOT1QgSEFORCBFRElUISEhISEiCi0gICAgcHJpbnQgIiAqLyIKLSAgICBwcmludCAiIgotICAgIHByaW50ICIjaW5jbHVkZSBcImFwX2NvbmZpZy5oXCIiCi0gICAgcHJpbnQgIiNpbmNsdWRlIFwiaHR0cGQuaFwiIgotICAgIHByaW50ICIjaW5jbHVkZSBcImh0dHBfY29uZmlnLmhcIiIKLSAgICBwcmludCAiIgotICAgIGZvciAoaSA9IDA7IGkgPCBwbjsgKytpKSB7Ci0gICAgICAgIHByaW50ZiAoImV4dGVybiBtb2R1bGUgJXNfbW9kdWxlO1xuIiwgcG1vZHVsZXNbaV0pCi0gICAgfQotICAgIHByaW50ICIiCi0gICAgcHJpbnQgIi8qIgotICAgIHByaW50ICIgKiAgTW9kdWxlcyB3aGljaCBpbXBsaWNpdGx5IGZvcm0gdGhlIgotICAgIHByaW50ICIgKiAgbGlzdCBvZiBhY3RpdmF0ZWQgbW9kdWxlcyBvbiBzdGFydHVwLCIKLSAgICBwcmludCAiICogIGkuZS4gdGhlc2UgYXJlIHRoZSBtb2R1bGVzIHdoaWNoIGFyZSIKLSAgICBwcmludCAiICogIGluaXRpYWxseSBsaW5rZWQgaW50byB0aGUgQXBhY2hlIHByb2Nlc3NpbmciCi0gICAgcHJpbnQgIiAqICBbZXh0ZW5kYWJsZSB1bmRlciBydW4tdGltZSB2aWEgQWRkTW9kdWxlXSIKLSAgICBwcmludCAiICovIgotICAgIHByaW50ICJtb2R1bGUgKmFwX3ByZWxpbmtlZF9tb2R1bGVzW10gPSB7IgotICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgcHJpbnRmICIgICYlc19tb2R1bGUsXG4iLCBtb2R1bGVzW2ldCi0gICAgfQotICAgIHByaW50ICIgIE5VTEwiCi0gICAgcHJpbnQgIn07IgotICAgIHByaW50ICIiCi0gICAgcHJpbnQgIi8qIgotICAgIHByaW50ICIgKiAgTW9kdWxlcyB3aGljaCBpbml0aWFsbHkgZm9ybSB0aGUiCi0gICAgcHJpbnQgIiAqICBsaXN0IG9mIGF2YWlsYWJsZSBtb2R1bGVzIG9uIHN0YXJ0dXAsIgotICAgIHByaW50ICIgKiAgaS5lLiB0aGVzZSBhcmUgdGhlIG1vZHVsZXMgd2hpY2ggYXJlIgotICAgIHByaW50ICIgKiAgaW5pdGlhbGx5IGxvYWRlZCBpbnRvIHRoZSBBcGFjaGUgcHJvY2VzcyIKLSAgICBwcmludCAiICogIFtleHRlbmRhYmxlIHVuZGVyIHJ1bi10aW1lIHZpYSBMb2FkTW9kdWxlXSIKLSAgICBwcmludCAiICovIgotICAgIHByaW50ICJtb2R1bGUgKmFwX3ByZWxvYWRlZF9tb2R1bGVzW10gPSB7IgotICAgIGZvciAoaSA9IDA7IGkgPCBwbjsgKytpKSB7Ci0gICAgICAgIHByaW50ZiAiICAmJXNfbW9kdWxlLFxuIiwgcG1vZHVsZXNbaV0KLSAgICB9Ci0gICAgcHJpbnQgIiAgTlVMTCIKLSAgICBwcmludCAifTsiCi0gICAgcHJpbnQgIiIKLX0KZGlmZiAtLWdpdCBhL2J1aWxkL2J1aWxkLm1rIGIvYnVpbGQvYnVpbGQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMzM0NzQuLjAwMDAwMDAKLS0tIGEvYnVpbGQvYnVpbGQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCBTYXNjaGEgU2NodW1hbm4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSMgYXJlIG1ldDoKLSMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0jICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0jIAotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFNBU0NIQSBTQ0hVTUFOTiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0jIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PCi0jIEVWRU5UIFNIQUxMIFNBU0NIQSBTQ0hVTUFOTiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0jIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOwotIyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSMgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLSMgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotIyBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAkSWQ6IGJ1aWxkLm1rLHYgMS4zIDIwMDAvMDEvMTYgMTc6MTg6MTMgc2FzY2hhIEV4cCAkIAotIwotIyBNYWtlZmlsZSB0byBnZW5lcmF0ZSBidWlsZCB0b29scwotIwotCi1TVEFNUCA9IGJ1aWxkbWsuc3RhbXAKLQotYWxsOiAkKFNUQU1QKSBnZW5lcmF0ZWRfbGlzdHMKLQlAJChNQUtFKSBBTUZMQUdTPSQoQU1GTEFHUykgLXMgLWYgYnVpbGQvYnVpbGQyLm1rCi0KLWdlbmVyYXRlZF9saXN0czoKLQlAZWNobyBjb25maWdfbTRfZmlsZXMgPSBgZmluZCAuIC1uYW1lIGNvbmZpZy5tNGAgPiAkQAotCUBuPWB3aGljaCBsaWJ0b29sYDsgZWNobyBsaWJ0b29sX3ByZWZpeCA9IGBkaXJuYW1lICQkbmAvLi4gPj4gJEAKLQotJChTVEFNUCk6IGJ1aWxkL2J1aWxkY2hlY2suc2gKLQlAYnVpbGQvYnVpbGRjaGVjay5zaCAmJiB0b3VjaCAkKFNUQU1QKQotCi1zbmFwc2hvdDoKLQlkaXN0bmFtZT0nJChESVNUTkFNRSknOyBcCi0JaWYgdGVzdCAteiAiJCRkaXN0bmFtZSI7IHRoZW4gXAotCQlkaXN0bmFtZT0nYXBhY2hlMi1zbmFwc2hvdCc7IFwKLQlmaTsgXAotCWNkIC4uOyBcCi0JbXluYW1lPWBiYXNlbmFtZSBcYHB3ZFxgYCA7IFwKLQljZCAuLiAmJiBjcCAtcnAgJCRteW5hbWUgJCRkaXN0bmFtZTsgXAotCWNkICQkZGlzdG5hbWUvc3JjOyBcCi0JZmluZCAuIC10eXBlIGwgLWV4ZWMgcm0ge30gXDsgOyBcCi0JJChNQUtFKSBBTUZMQUdTPS0tY29weSAtZiBidWlsZC9idWlsZC5tazsgXAotCWNkIC4uLy4uOyBcCi0JdGFyIGNmICQkZGlzdG5hbWUudGFyICQkZGlzdG5hbWU7IFwKLQlybSAtcmYgJCRkaXN0bmFtZSAkJGRpc3RuYW1lLnRhci4qOyBcCi0JYnppcDIgLTkgJCRkaXN0bmFtZS50YXI7IFwKLQliemlwMiAtdCAkJGRpc3RuYW1lLnRhci5iejIKLQotY3ZzY2xlYW46Ci0JQGZvciBpIGluIGBmaW5kIC4gLW5hbWUgLmN2c2lnbm9yZWA7IGRvIFwKLQkJKGNkIGBkaXJuYW1lICQkaWAgMj4vZGV2L251bGwgJiYgcm0gLXJmIGBjYXQgLmN2c2lnbm9yZWAgKi5vICouYSB8fCB0cnVlKTsgXAotCWRvbmUKLQlAcm0gLWYgJChTVUJESVJTKSAyPi9kZXYvbnVsbCB8fCB0cnVlCi0KLS5QSE9OWTogZ2VuZXJhdGVkX2xpc3RzIHNuYXBzaG90IGN2c2NsZWFuCmRpZmYgLS1naXQgYS9idWlsZC9idWlsZDIubWsgYi9idWlsZC9idWlsZDIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZmFlOGMuLjAwMDAwMDAKLS0tIGEvYnVpbGQvYnVpbGQyLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMDAgU2FzY2hhIFNjaHVtYW5uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0jIGFyZSBtZXQ6Ci0jIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotIyAKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBTQVNDSEEgU0NIVU1BTk4gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotIyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0jIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTwotIyBFVkVOVCBTSEFMTCBTQVNDSEEgU0NIVU1BTk4gQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotIyBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKLSMgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0jIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi0jIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLSMgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgJElkOiBidWlsZDIubWssdiAxLjQgMjAwMC8wMS8xNiAyMDowMDo0OCBzYXNjaGEgRXhwICQKLQotaW5jbHVkZSBnZW5lcmF0ZWRfbGlzdHMKLQotVE9VQ0hfRklMRVMgPSBta2luc3RhbGxkaXJzIGluc3RhbGwtc2ggbWlzc2luZwotCi1MVF9UQVJHRVRTID0gbHRjb25maWcgbHRtYWluLnNoIGNvbmZpZy5ndWVzcyBjb25maWcuc3ViCi0KLWNvbmZpZ19oX2luID0gaW5jbHVkZS9hcF9jb25maWdfYXV0by5oLmluCi1hcHJfY29uZmlnX2hfaW4gPSBsaWIvYXByL2luY2x1ZGUvYXByX2NvbmZpZy5oLmluCi1hcHJfY29uZmlndXJlID0gbGliL2Fwci9jb25maWd1cmUKLQotQVBBQ0hFX1RBUkdFVFMgPSAkKFRPVUNIX0ZJTEVTKSAkKExUX1RBUkdFVFMpIGNvbmZpZ3VyZSAkKGNvbmZpZ19oX2luKQotCi1BUFJfVEFSR0VUUyA9ICQoYXByX2NvbmZpZ3VyZSkgJChhcHJfY29uZmlnX2hfaW4pCi0KLXRhcmdldHMgPSAuZGVwcyBhY2xvY2FsLm00ICQoQVBBQ0hFX1RBUkdFVFMpICQoQVBSX1RBUkdFVFMpCi0KLWFsbDogJCh0YXJnZXRzKQotCi0uZGVwczoKLQl0b3VjaCAkQAotCi1saWJ0b29sX200ID0gJChsaWJ0b29sX3ByZWZpeCkvc2hhcmUvYWNsb2NhbC9saWJ0b29sLm00Ci0JCi1hY2xvY2FsLm00OiBhY2luY2x1ZGUubTQgJChsaWJ0b29sX200KQotCUBlY2hvIHJlYnVpbGRpbmcgJEAKLQlAY2F0IGFjaW5jbHVkZS5tNCAkKGxpYnRvb2xfbTQpID4gJEAKLQkKLSQoTFRfVEFSR0VUUyk6Ci0JbGlidG9vbGl6ZSAkKEFNRkxBR1MpIC0tZm9yY2UKLQkKLSQoY29uZmlnX2hfaW4pOiBjb25maWd1cmUKLSMgZXhwbGljaXRseSByZW1vdmUgdGFyZ2V0IHNpbmNlIGF1dG9oZWFkZXIgZG9lcyBub3Qgc2VlbSB0byB3b3JrIAotIyBjb3JyZWN0bHkgb3RoZXJ3aXNlICh0aW1lc3RhbXBzIGFyZSBub3QgdXBkYXRlZCkKLQlAZWNobyByZWJ1aWxkaW5nICRACi0JQHJtIC1mICRACi0JYXV0b2hlYWRlcgotCi0kKFRPVUNIX0ZJTEVTKToKLQl0b3VjaCAkKFRPVUNIX0ZJTEVTKQotCi1jb25maWd1cmU6IGFjbG9jYWwubTQgY29uZmlndXJlLmluICQoY29uZmlnX200X2ZpbGVzKQotCUBlY2hvIHJlYnVpbGRpbmcgJEAKLQlybSAtZiBjb25maWcuY2FjaGUKLQlhdXRvY29uZgotCi0kKGFwcl9jb25maWdfaF9pbik6ICQoYXByX2NvbmZpZ3VyZSkgbGliL2Fwci9hY2NvbmZpZy5oCi0JQGVjaG8gcmVidWlsZGluZyAkQAotCUBybSAtZiAkQAotCShjZCBsaWIvYXByICYmIGF1dG9oZWFkZXIpCi0KLSQoYXByX2NvbmZpZ3VyZSk6IGxpYi9hcHIvYWNsb2NhbC5tNCBsaWIvYXByL2NvbmZpZ3VyZS5pbiBsaWIvYXByL3RocmVhZHMubTQKLQlAZWNobyByZWJ1aWxkaW5nICRACi0JKGNkIGxpYi9hcHIgJiYgYXV0b2NvbmYpCmRpZmYgLS1naXQgYS9idWlsZC9idWlsZGNoZWNrLnNoIGIvYnVpbGQvYnVpbGRjaGVjay5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDkxYTE3Yi4uMDAwMDAwMAotLS0gYS9idWlsZC9idWlsZGNoZWNrLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi1lY2hvICJidWlsZGNvbmY6IGNoZWNraW5nIGluc3RhbGxhdGlvbi4uLiIKLQotIyBhdXRvY29uZiAyLjEzIG9yIG5ld2VyCi1hY192ZXJzaW9uPWBhdXRvY29uZiAtLXZlcnNpb24gMj4vZGV2L251bGx8aGVhZCAtMXxzZWQgLWUgJ3MvXlteMC05XSovLycgLWUgJ3MvW2Etel0qICokLy8nYAotaWYgdGVzdCAteiAiJGFjX3ZlcnNpb24iOyB0aGVuCi1lY2hvICJidWlsZGNvbmY6IGF1dG9jb25mIG5vdCBmb3VuZC4iCi1lY2hvICIgICAgICAgICAgIFlvdSBuZWVkIGF1dG9jb25mIHZlcnNpb24gMi4xMyBvciBuZXdlciBpbnN0YWxsZWQiCi1lY2hvICIgICAgICAgICAgIHRvIGJ1aWxkIEFwYWNoZSBmcm9tIENWUy4iCi1leGl0IDEKLWZpCi1JRlM9Ljsgc2V0ICRhY192ZXJzaW9uOyBJRlM9JyAnCi1pZiB0ZXN0ICIkMSIgPSAiMiIgLWEgIiQyIiAtbHQgIjEzIiB8fCB0ZXN0ICIkMSIgLWx0ICIyIjsgdGhlbgotZWNobyAiYnVpbGRjb25mOiBhdXRvY29uZiB2ZXJzaW9uICRhY192ZXJzaW9uIGZvdW5kLiIKLWVjaG8gIiAgICAgICAgICAgWW91IG5lZWQgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIG9yIG5ld2VyIGluc3RhbGxlZCIKLWVjaG8gIiAgICAgICAgICAgdG8gYnVpbGQgQXBhY2hlIGZyb20gQ1ZTLiIKLWV4aXQgMQotZWxzZQotZWNobyAiYnVpbGRjb25mOiBhdXRvY29uZiB2ZXJzaW9uICRhY192ZXJzaW9uIChvaykiCi1maQotCi0jIGxpYnRvb2wgMS4zLjMgb3IgbmV3ZXIKLWx0X3B2ZXJzaW9uPWBsaWJ0b29sIC0tdmVyc2lvbiAyPi9kZXYvbnVsbHxzZWQgLWUgJ3MvXlteMC05XSovLycgLWUgJ3MvWy0gXS4qLy8nYAotaWYgdGVzdCAiJGx0X3B2ZXJzaW9uIiA9ICIiOyB0aGVuCi1lY2hvICJidWlsZGNvbmY6IGxpYnRvb2wgbm90IGZvdW5kLiIKLWVjaG8gIiAgICAgICAgICAgWW91IG5lZWQgbGlidG9vbCB2ZXJzaW9uIDEuMyBvciBuZXdlciBpbnN0YWxsZWQiCi1lY2hvICIgICAgICAgICAgIHRvIGJ1aWxkIEFwYWNoZSBmcm9tIENWUy4iCi1leGl0IDEKLWZpCi1sdF92ZXJzaW9uPWBlY2hvICRsdF9wdmVyc2lvbnxzZWQgLWUgJ3MvXChbYS16XSpcKSQvLlwxLydgCi1JRlM9Ljsgc2V0ICRsdF92ZXJzaW9uOyBJRlM9JyAnCi1pZiB0ZXN0ICIkMSIgLWd0ICIxIiB8fCB0ZXN0ICIkMiIgLWd0ICIzIiB8fCB0ZXN0ICIkMiIgPSAiMyIgLWEgIiQzIiAtZ2UgIjMiCi10aGVuCi1lY2hvICJidWlsZGNvbmY6IGxpYnRvb2wgdmVyc2lvbiAkbHRfcHZlcnNpb24gKG9rKSIKLWVsc2UKLWVjaG8gImJ1aWxkY29uZjogbGlidG9vbCB2ZXJzaW9uICRsdF9wdmVyc2lvbiBmb3VuZC4iCi1lY2hvICIgICAgICAgICAgIFlvdSBuZWVkIGxpYnRvb2wgdmVyc2lvbiAxLjMuMyBvciBuZXdlciBpbnN0YWxsZWQiCi1lY2hvICIgICAgICAgICAgIHRvIGJ1aWxkIEFwYWNoZSBmcm9tIENWUy4iCi1leGl0IDEKLWZpCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvYnVpbGQvY29uZmlnLXN0dWJzIGIvYnVpbGQvY29uZmlnLXN0dWJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZmYwMGE1Li4wMDAwMDAwCi0tLSBhL2J1aWxkL2NvbmZpZy1zdHVicworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyEvYmluL3NoCi0KLWRpcj0kMQotZm9yIHN0dWJkaXIgaW4gYGZpbmQgJGRpciAtdHlwZSBkYDsgZG8KLSAgICBpZiBbIC1yICRzdHViZGlyL2NvbmZpZy5tNCBdOyB0aGVuCi0gICAgICAgIGVjaG8gInNpbmNsdWRlKCRzdHViZGlyL2NvbmZpZy5tNCkiCi0gICAgZmkKLWRvbmUKZGlmZiAtLWdpdCBhL2J1aWxkL2N2c2NsZWFuIGIvYnVpbGQvY3ZzY2xlYW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5OGVjNDkuLjAwMDAwMDAKLS0tIGEvYnVpbGQvY3ZzY2xlYW4KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMhIC9iaW4vc2gKLQotJHtNQUtFOi1tYWtlfSAtZiBidWlsZC9idWlsZC5tayBjdnNjbGVhbgpkaWZmIC0tZ2l0IGEvYnVpbGQvZmFzdGdlbi5zaCBiL2J1aWxkL2Zhc3RnZW4uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlhNTlhYjcuLjAwMDAwMDAKLS0tIGEvYnVpbGQvZmFzdGdlbi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSMhIC9iaW4vc2gKLSMKLSMgQ29weXJpZ2h0IChjKSAxOTk5LCAyMDAwIFNhc2NoYSBTY2h1bWFubi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIyBhcmUgbWV0OgotIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSMgCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgU0FTQ0hBIFNDSFVNQU5OIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSMgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotIyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8KLSMgRVZFTlQgU0hBTEwgU0FTQ0hBIFNDSFVNQU5OIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSMgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci0jIE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotIyBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgotIyBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi0jIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICRJZDogZmFzdGdlbi5zaCx2IDEuMSAyMDAwLzAxLzExIDEzOjEwOjU4IHNhc2NoYSBFeHAgJCAKLSMKLQotc3JjZGlyPSQxCi1zaGlmdAotCi10b3BzcmNkaXI9YChjZCAkc3JjZGlyOyBwd2QpYAotCi1ta2Rpcl9wPSQxCi1zaGlmdAotCi1pZiB0ZXN0ICIkbWtkaXJfcCIgPSAieWVzIjsgdGhlbgotICBta2Rpcl9wPSJta2RpciAtcCIKLWVsc2UKLSAgbWtkaXJfcD0iJHRvcHNyY2Rpci9oZWxwZXJzL21rZGlyLnNoIgotZmkKLQotYmFzZT0iXCQoREVQVEgpLyRzcmNkaXIiCi0KLWZvciBpIGluICRAIDsgZG8KLQllY2hvICJjcmVhdGluZyAkaSIKLQlkaXI9YGRpcm5hbWUgJGlgCi0JJG1rZGlyX3AgJGRpcgotCXNlZCBcCi0JCS1lIHMjQHRvcHNyY2RpckAjJGJhc2UjIFwKLQkJLWUgcyNAc3JjZGlyQCMkYmFzZS8kZGlyIyBcCi0JPCAkdG9wc3JjZGlyLyRpLmluID4gJGkKLWRvbmUKZGlmZiAtLWdpdCBhL2J1aWxkL2luc3RhbGwuc2ggYi9idWlsZC9pbnN0YWxsLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YTg4MjFmLi4wMDAwMDAwCi0tLSBhL2J1aWxkL2luc3RhbGwuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotIyEvYmluL3NoCi0jIwotIyMgIGluc3RhbGwuc2ggLS0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCBvciBkYXRhZmlsZQotIyMKLSMjICBCYXNlZCBvbiBgaW5zdGFsbC1zaCcgZnJvbSB0aGUgWCBDb25zb3J0aXVtJ3MgWDExUjUgZGlzdHJpYnV0aW9uCi0jIyAgYXMgb2YgODkvMTIvMTggd2hpY2ggaXMgZnJlZWx5IGF2YWlsYWJsZS4KLSMjICBDbGVhbmVkIHVwIGZvciBBcGFjaGUncyBBdXRvY29uZi1zdHlsZSBJbnRlcmZhY2UgKEFQQUNJKQotIyMgIGJ5IFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBhcGFjaGUub3JnPgotIyMKLSMKLSMgVGhpcyBzY3JpcHQgZmFsbHMgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLgotIyBTZWUgaHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvTElDRU5TRQotCi0KLSMKLSMgICBwdXQgaW4gYWJzb2x1dGUgcGF0aHMgaWYgeW91IGRvbid0IGhhdmUgdGhlbSBpbiB5b3VyIHBhdGg7IAotIyAgIG9yIHVzZSBlbnYuIHZhcnMuCi0jCi1tdnByb2c9IiR7TVZQUk9HLW12fSIKLWNwcHJvZz0iJHtDUFBST0ctY3B9IgotY2htb2Rwcm9nPSIke0NITU9EUFJPRy1jaG1vZH0iCi1jaG93bnByb2c9IiR7Q0hPV05QUk9HLWNob3dufSIKLWNoZ3JwcHJvZz0iJHtDSEdSUFBST0ctY2hncnB9Igotc3RyaXBwcm9nPSIke1NUUklQUFJPRy1zdHJpcH0iCi1ybXByb2c9IiR7Uk1QUk9HLXJtfSIKLQotIwotIyAgIHBhcnNlIGFyZ3VtZW50IGxpbmUKLSMKLWluc3RjbWQ9IiRtdnByb2ciCi1jaG1vZGNtZD0iIgotY2hvd25jbWQ9IiIKLWNoZ3JwY21kPSIiCi1zdHJpcGNtZD0iIgotcm1jbWQ9IiRybXByb2cgLWYiCi1tdmNtZD0iJG12cHJvZyIKLWV4dD0iIgotc3JjPSIiCi1kc3Q9IiIKLXdoaWxlIFsgIngkMSIgIT0gIngiIF07IGRvCi0gICAgY2FzZSAkMSBpbgotICAgICAgICAtYykgaW5zdGNtZD0iJGNwcHJvZyIKLSAgICAgICAgICAgIHNoaWZ0OyBjb250aW51ZQotICAgICAgICAgICAgOzsKLSAgICAgICAgLW0pIGNobW9kY21kPSIkY2htb2Rwcm9nICQyIgotICAgICAgICAgICAgc2hpZnQ7IHNoaWZ0OyBjb250aW51ZQotICAgICAgICAgICAgOzsKLSAgICAgICAgLW8pIGNob3duY21kPSIkY2hvd25wcm9nICQyIgotICAgICAgICAgICAgc2hpZnQ7IHNoaWZ0OyBjb250aW51ZQotICAgICAgICAgICAgOzsKLSAgICAgICAgLWcpIGNoZ3JwY21kPSIkY2hncnBwcm9nICQyIgotICAgICAgICAgICAgc2hpZnQ7IHNoaWZ0OyBjb250aW51ZQotICAgICAgICAgICAgOzsKLSAgICAgICAgLXMpIHN0cmlwY21kPSIkc3RyaXBwcm9nIgotICAgICAgICAgICAgc2hpZnQ7IGNvbnRpbnVlCi0gICAgICAgICAgICA7OwotICAgICAgICAtUykgc3RyaXBjbWQ9IiRzdHJpcHByb2cgJDIiCi0gICAgICAgICAgICBzaGlmdDsgc2hpZnQ7IGNvbnRpbnVlCi0gICAgICAgICAgICA7OwotICAgICAgICAtZSkgZXh0PSIkMiIKLSAgICAgICAgICAgIHNoaWZ0OyBzaGlmdDsgY29udGludWUKLSAgICAgICAgICAgIDs7Ci0gICAgICAgICopICBpZiBbICJ4JHNyYyIgPSAieCIgXTsgdGhlbgotICAgICAgICAgICAgICAgIHNyYz0kMQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGRzdD0kMQotICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIHNoaWZ0OyBjb250aW51ZQotICAgICAgICAgICAgOzsKLSAgICBlc2FjCi1kb25lCi1pZiBbICJ4JHNyYyIgPSAieCIgXTsgdGhlbgotICAgICBlY2hvICJpbnN0YWxsLnNoOiBubyBpbnB1dCBmaWxlIHNwZWNpZmllZCIKLSAgICAgZXhpdCAxCi1maQotaWYgWyAieCRkc3QiID0gIngiIF07IHRoZW4KLSAgICAgZWNobyAiaW5zdGFsbC5zaDogbm8gZGVzdGluYXRpb24gc3BlY2lmaWVkIgotICAgICBleGl0IDEKLWZpCi0KLSMKLSMgIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyBpZgotIyAgeW91ciBzeXN0ZW0gZG9lcyBub3QgbGlrZSBkb3VibGUgc2xhc2hlcyBpbiBmaWxlbmFtZXMsIHlvdSBtYXkKLSMgIG5lZWQgdG8gYWRkIHNvbWUgbG9naWMKLSMKLWlmIFsgLWQgJGRzdCBdOyB0aGVuCi0gICAgZHN0PSIkZHN0L2BiYXNlbmFtZSAkc3JjYCIKLWZpCi0KLSMgIEFkZCBhIHBvc3NpYmxlIGV4dGVuc2lvbiAoc3VjaCBhcyAiLmV4ZSIpIHRvIHNyYyBhbmQgZHN0Ci1zcmM9IiRzcmMkZXh0IgotZHN0PSIkZHN0JGV4dCIKLQotIyAgTWFrZSBhIHRlbXAgZmlsZSBuYW1lIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgotZHN0ZGlyPWBkaXJuYW1lICRkc3RgCi1kc3R0bXA9JGRzdGRpci8jaW5zdC4kJCMKLQotIyAgTW92ZSBvciBjb3B5IHRoZSBmaWxlIG5hbWUgdG8gdGhlIHRlbXAgbmFtZQotJGluc3RjbWQgJHNyYyAkZHN0dG1wCi0KLSMgIEFuZCBzZXQgYW55IG9wdGlvbnM7IGRvIGNobW9kIGxhc3QgdG8gcHJlc2VydmUgc2V0dWlkIGJpdHMKLWlmIFsgIngkY2hvd25jbWQiICE9ICJ4IiBdOyB0aGVuICRjaG93bmNtZCAkZHN0dG1wOyBmaQotaWYgWyAieCRjaGdycGNtZCIgIT0gIngiIF07IHRoZW4gJGNoZ3JwY21kICRkc3R0bXA7IGZpCi1pZiBbICJ4JHN0cmlwY21kIiAhPSAieCIgXTsgdGhlbiAkc3RyaXBjbWQgJGRzdHRtcDsgZmkKLWlmIFsgIngkY2htb2RjbWQiICE9ICJ4IiBdOyB0aGVuICRjaG1vZGNtZCAkZHN0dG1wOyBmaQotCi0jICBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgotJHJtY21kICRkc3QKLSRtdmNtZCAkZHN0dG1wICRkc3QKLQotZXhpdCAwCi0KZGlmZiAtLWdpdCBhL2J1aWxkL2xpYnJhcnkubWsgYi9idWlsZC9saWJyYXJ5Lm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmFkYjYzLi4wMDAwMDAwCi0tLSBhL2J1aWxkL2xpYnJhcnkubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCBTYXNjaGEgU2NodW1hbm4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSMgYXJlIG1ldDoKLSMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0jICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0jIAotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFNBU0NIQSBTQ0hVTUFOTiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0jIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PCi0jIEVWRU5UIFNIQUxMIFNBU0NIQSBTQ0hVTUFOTiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0jIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOwotIyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSMgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLSMgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotIyBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAkSWQ6IGxpYnJhcnkubWssdiAxLjEgMjAwMC8wMS8xMSAxMzoxMDo1OCBzYXNjaGEgRXhwICQgCi0jCi0KLUxUTElCUkFSWV9PQkpFQ1RTID0gJChMVExJQlJBUllfU09VUkNFUzouYz0ubG8pCi0KLSQoTFRMSUJSQVJZX05BTUUpOiAkKExUTElCUkFSWV9PQkpFQ1RTKSAkKExUTElCUkFSWV9ERVBFTkRFTkNJRVMpCi0JJChMSU5LKSAkKExUTElCUkFSWV9MREZMQUdTKSAkKExUTElCUkFSWV9PQkpFQ1RTKSAkKExUTElCUkFSWV9MSUJBREQpCi0KLSQoTFRMSUJSQVJZX1NIQVJFRF9OQU1FKTogJChMVExJQlJBUllfT0JKRUNUUykgJChMVExJQlJBUllfREVQRU5ERU5DSUVTKQotCUB0ZXN0IC1kICQocGhwbGliZGlyKSB8fCAkKG1raW5zdGFsbGRpcnMpICQocGhwbGliZGlyKQotCSQoTElOSykgLWF2b2lkLXZlcnNpb24gLW1vZHVsZSAtcnBhdGggJChwaHBsaWJkaXIpICQoTFRMSUJSQVJZX0xERkxBR1MpICQoTFRMSUJSQVJZX09CSkVDVFMpICQoTFRMSUJSQVJZX1NIQVJFRF9MSUJBREQpCi0JJChTSExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsIGluc3RhbGwgJEAgJChwaHBsaWJkaXIpCi0KLXNoYXJlZDoKLQlAaWYgdGVzdCAnJChTSExJQlRPT0wpJyAhPSAnJChMSUJUT09MKSc7IHRoZW4gXAotCQkkKE1BS0UpICdMSUJUT09MPSQoU0hMSUJUT09MKScgJChMVExJQlJBUllfU0hBUkVEX05BTUUpOyBcCi0JZWxzZSBcCi0JCSQoTUFLRSkgJChMVExJQlJBUllfU0hBUkVEX05BTUUpOyBcCi0JZmk7IFwKZGlmZiAtLWdpdCBhL2J1aWxkL2x0bGliLm1rIGIvYnVpbGQvbHRsaWIubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYmJiN2MuLjAwMDAwMDAKLS0tIGEvYnVpbGQvbHRsaWIubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMTk5OSwgMjAwMCBTYXNjaGEgU2NodW1hbm4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSMgYXJlIG1ldDoKLSMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0jICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0jIAotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFNBU0NIQSBTQ0hVTUFOTiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0jIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PCi0jIEVWRU5UIFNIQUxMIFNBU0NIQSBTQ0hVTUFOTiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0jIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOwotIyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSMgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLSMgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotIyBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAkSWQ6IGx0bGliLm1rLHYgMS4xIDIwMDAvMDEvMTEgMTM6MTA6NTggc2FzY2hhIEV4cCAkIAotIwotCi10YXJnZXRzID0gJChMVExJQlJBUllfTkFNRSkKLQotaW5jbHVkZSAkKHRvcHNyY2RpcikvYnVpbGQvcnVsZXMubWsKLWluY2x1ZGUgJCh0b3BzcmNkaXIpL2J1aWxkL2xpYnJhcnkubWsKLQpkaWZmIC0tZ2l0IGEvYnVpbGQvbWtkZXAucGVybCBiL2J1aWxkL21rZGVwLnBlcmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZTA2ZWEuLjAwMDAwMDAKLS0tIGEvYnVpbGQvbWtkZXAucGVybAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLSMhL3Vzci9iaW4vcGVybAotIwotIyAkSWQ6IG1rZGVwLnBlcmwsdiAxLjEgMjAwMC8wMS8xMSAxMzoxMDo1OSBzYXNjaGEgRXhwICQKLSMKLSMgQ3JlYXRlZDogVGh1IEF1ZyAxNSAxMTo1NzozMyAxOTk2IHRvbwotIyBMYXN0IG1vZGlmaWVkOiBNb24gRGVjIDI3IDA5OjIzOjU2IDE5OTkgdG9vCi0jCi0jIENvcHlyaWdodCAoYykgMTk5Ni0xOTk5IFRvbWkgT2xsaWxhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIyBhcmUgbWV0OgotIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSMgCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0jIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PCi0jIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotIyBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKLSMgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0jIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi0jIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLSMgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLWRpZSAiVXNhZ2U6IG1rZGVwIENQUC1jb21tYW5kIFtDUFAgb3B0aW9uc10gZmlsZTEgW2ZpbGUyLi4uXVxuIgotICBpZiAoJCNBUkdWIDwgMSk7Ci0KLSRjbWRsID0gc2hpZnQoQEFSR1YpOwotCi0kY21kbCA9ICIkY21kbCAiIC4gc2hpZnQgKEBBUkdWKSB3aGlsZSAoJEFSR1ZbMF0gPX4gL14tW0EtWl0vKTsKLSAgCi13aGlsZSAoJGZpbGUgPSBzaGlmdChAQVJHVikpCi17Ci0gICAgJGZpbGUgPX4gcy9cLm8kLy5jLzsKLQotICAgIG9wZW4oRiwgIiRjbWRsICRmaWxlfCIpOwotCi0gICAgJnBhcnNlb3V0OwotCi0gICAgY2xvc2UoRik7Ci19Ci0KLQotc3ViIGluaXRpbml0Ci17Ci0gICAgJXVzZWQgPSAoKTsKLSAgICAkb2YgPSAkZmlsZTsKLSAgICAkb2YgPX4gcy9cLmMkLy5sby87Ci0gICAgJHN0ciA9ICIkb2Y6XHQkZmlsZSI7Ci0gICAgJGxlbiA9IGxlbmd0aCAkc3RyOwotfQotCQotc3ViIGluaXRzdHIKLXsKLSAgICAkc3RyID0gIlx0IjsKLSAgICAkbGVuID0gbGVuZ3RoICRzdHI7Ci19Ci0KLXN1YiBwYXJzZW91dAotewotICAgICZpbml0aW5pdDsKLSAgICB3aGlsZSAoPEY+KQotICAgIHsKLQluZXh0IHVubGVzcyAoL14jIFswLTldKiAiKC4qXC5oKSIvKTsKLQotCW5leHQgaWYgKCQxID1+IC9eXC8vKTsKLQotCW5leHQgaWYgJHVzZWR7JDF9OwotCi0gICAgICAgICR1c2VkeyQxfSA9IDE7Ci0KLQkkbmxlbiA9IGxlbmd0aCgkMSkgKyAxOwotCi0JaWYgKCRsZW4gKyAkbmxlbiA+IDcyKQotCXsKLQkgICAgcHJpbnQgJHN0ciwgIlxcXG4iOwotCSAgICAmaW5pdHN0cjsKLQkgICAgJHN0ciA9ICRzdHIgLiAkMTsKLQl9Ci0JZWxzZSB7ICRzdHIgPSAkc3RyIC4gIiAiIC4gJDE7IH0KLQkJICAgICAKLQkkbGVuICs9ICRubGVuOwkKLQkJICAgICAKLSAgICB9Ci0gICAgcHJpbnQgJHN0ciwgIlxuIjsKLX0KZGlmZiAtLWdpdCBhL2J1aWxkL21rZGlyLnNoIGIvYnVpbGQvbWtkaXIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRjZDMzYzUuLjAwMDAwMDAKLS0tIGEvYnVpbGQvbWtkaXIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIS9iaW4vc2gKLSMjIAotIyMgIG1rZGlyLnNoIC0tIG1ha2UgZGlyZWN0b3J5IGhpZXJhcmNoeQotIyMKLSMjICBCYXNlZCBvbiBgbWtpbnN0YWxsZGlycycgZnJvbSBOb2FoIEZyaWVkbWFuIDxmcmllZG1hbkBwcmVwLmFpLm1pdC5lZHU+Ci0jIyAgYXMgb2YgMTk5NC0wMy0yNSwgd2hpY2ggd2FzIHBsYWNlZCBpbiB0aGUgUHVibGljIERvbWFpbi4KLSMjICBDbGVhbmVkIHVwIGZvciBBcGFjaGUncyBBdXRvY29uZi1zdHlsZSBJbnRlcmZhY2UgKEFQQUNJKQotIyMgIGJ5IFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBhcGFjaGUub3JnPgotIyMKLSMKLSMgVGhpcyBzY3JpcHQgZmFsbHMgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLgotIyBTZWUgaHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvTElDRU5TRQotCi0KLXVtYXNrIDAyMgotZXJyc3RhdHVzPTAKLWZvciBmaWxlIGluICR7MSsiJEAifSA7IGRvIAotICAgIHNldCBmbm9yZCBgZWNobyAiOiRmaWxlIiB8XAotICAgICAgICAgICAgICAgc2VkIC1lICdzL146XC8vJS8nIC1lICdzL146Ly8nIC1lICdzL1wvLyAvZycgLWUgJ3MvXiUvXC8vJ2AKLSAgICBzaGlmdAotICAgIHBhdGhjb21wPQotICAgIGZvciBkIGluICR7MSsiJEAifTsgZG8KLSAgICAgICAgcGF0aGNvbXA9IiRwYXRoY29tcCRkIgotICAgICAgICBjYXNlICIkcGF0aGNvbXAiIGluCi0gICAgICAgICAgICAtKiApIHBhdGhjb21wPS4vJHBhdGhjb21wIDs7Ci0gICAgICAgIGVzYWMKLSAgICAgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCi0gICAgICAgICAgICBlY2hvICJta2RpciAkcGF0aGNvbXAiIDE+JjIKLSAgICAgICAgICAgIG1rZGlyICIkcGF0aGNvbXAiIHx8IGVycnN0YXR1cz0kPwotICAgICAgICBmaQotICAgICAgICBwYXRoY29tcD0iJHBhdGhjb21wLyIKLSAgICBkb25lCi1kb25lCi1leGl0ICRlcnJzdGF0dXMKLQpkaWZmIC0tZ2l0IGEvYnVpbGQvcHJvZ3JhbS5tayBiL2J1aWxkL3Byb2dyYW0ubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNTJkODguLjAwMDAwMDAKLS0tIGEvYnVpbGQvcHJvZ3JhbS5taworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAxOTk5LCAyMDAwIFNhc2NoYSBTY2h1bWFubi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIyBhcmUgbWV0OgotIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSMgCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgU0FTQ0hBIFNDSFVNQU5OIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSMgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotIyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8KLSMgRVZFTlQgU0hBTEwgU0FTQ0hBIFNDSFVNQU5OIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSMgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci0jIE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotIyBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgotIyBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi0jIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICRJZDogcHJvZ3JhbS5tayx2IDEuMSAyMDAwLzAxLzExIDEzOjEwOjU5IHNhc2NoYSBFeHAgJCAKLSMKLQotUFJPR1JBTV9PQkpFQ1RTID0gJChQUk9HUkFNX1NPVVJDRVM6LmM9LmxvKQotCi0kKFBST0dSQU1fTkFNRSk6ICQoUFJPR1JBTV9ERVBFTkRFTkNJRVMpICQoUFJPR1JBTV9PQkpFQ1RTKQotCSQoTElOSykgJChQUk9HUkFNX0xERkxBR1MpICQoUFJPR1JBTV9PQkpFQ1RTKSAkKFBST0dSQU1fTERBREQpCmRpZmYgLS1naXQgYS9idWlsZC9ydWxlcy5tayBiL2J1aWxkL3J1bGVzLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDI4OWViLi4wMDAwMDAwCi0tLSBhL2J1aWxkL3J1bGVzLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAxOTk5LCAyMDAwIFNhc2NoYSBTY2h1bWFubi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIyBhcmUgbWV0OgotIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSMgCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgU0FTQ0hBIFNDSFVNQU5OIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSMgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotIyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8KLSMgRVZFTlQgU0hBTEwgU0FTQ0hBIFNDSFVNQU5OIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSMgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci0jIE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotIyBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgotIyBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi0jIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICRJZDogcnVsZXMubWssdiAxLjEgMjAwMC8wMS8xMSAxMzoxMDo1OSBzYXNjaGEgRXhwICQgCi0jCi0KLWluY2x1ZGUgJChERVBUSCkvY29uZmlnX3ZhcnMubWsKLQotCi1TSExJQl9TVUZGSVggPSBzbwotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChFWFRSQV9JTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoRVhUUkFfQ0ZMQUdTKQotTFRDT01QSUxFID0gJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoRVhUUkFfSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKEVYVFJBX0NGTEFHUykKLUNDTEQgPSAkKENDKQotTElOSyA9ICQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKENGTEFHUykgJChFWFRSQV9DRkxBR1MpICQoTERGTEFHUykgLW8gJEAKLW1raW5zdGFsbGRpcnMgPSAkKGFic19zcmNkaXIpL2hlbHBlcnMvbWtkaXIuc2gKLUlOU1RBTEwgPSAkKGFic19zcmNkaXIpL2hlbHBlcnMvaW5zdGFsbC5zaCAtYwotSU5TVEFMTF9EQVRBID0gJChJTlNUQUxMKSAtbSA2NDQKLUlOU1RBTExfUFJPR1JBTSA9ICQoSU5TVEFMTCkgLW0gNzU1Ci1TSExJQlRPT0wgPSAkKFNIRUxMKSAkKERFUFRIKS9zaGxpYnRvb2wgLS1zaWxlbnQKLUFQQUNIRV9DT01QSUxFID0gJChDT01QSUxFKSAtYyAkPCAmJiB0b3VjaCAkQAotQVBBQ0hFX1NIX0NPTVBJTEUgPSAkKFNITElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEVYVFJBX0lOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChFWFRSQV9DRkxBR1MpIC1jICQ8ICYmIHRvdWNoICRACi1TSExJTksgPSAkKFNITElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKENGTEFHUykgJChFWFRSQV9DRkxBR1MpICQoTERGTEFHUykgLW8gJEAKLQotREVGUyA9IC1ESEFWRV9DT05GSUdfSCAtSS4gLUkkKHNyY2RpcikgLUkkKERFUFRIKQotCi10b3Bfc3JjZGlyICAgPSAkKHRvcHNyY2RpcikKLXRvcF9idWlsZGRpciA9ICQoREVQVEgpCi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLlMgLmMgLmxvIC5vIC5zIC55IC5sIC5zbG8KLQotLmMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5zLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0uUy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLmMubG86Ci0JJChBUEFDSEVfQ09NUElMRSkKLQotLnMubG86Ci0JJChBUEFDSEVfQ09NUElMRSkKLQotLlMubG86Ci0JJChBUEFDSEVfQ09NUElMRSkKLQotLmMuc2xvOgotCSQoQVBBQ0hFX1NIX0NPTVBJTEUpCi0JCi0ueS5jOgotCSQoWUFDQykgJChZRkxBR1MpICQ8ICYmIG12IHkudGFiLmMgJCouYwotCWlmIHRlc3QgLWYgeS50YWIuaDsgdGhlbiBcCi0JaWYgY21wIC1zIHkudGFiLmggJCouaDsgdGhlbiBybSAtZiB5LnRhYi5oOyBlbHNlIG12IHkudGFiLmggJCouaDsgZmk7IFwKLQllbHNlIDo7IGZpCi0KLS5sLmM6Ci0JJChMRVgpICQoTEZMQUdTKSAkPCAmJiBtdiAkKExFWF9PVVRQVVRfUk9PVCkuYyAkQAotCi0KLWFsbDogYWxsLXJlY3Vyc2l2ZQotaW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKLQotZGlzdGNsZWFuLXJlY3Vyc2l2ZSBkZXBlbmQtcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBhbGwtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlOgotCUBvdGFyZ2V0PWBlY2hvICRAfHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlpZiB0ZXN0ICckKE5PX1JFQ1VSU0lPTiknICE9ICIkJG90YXJnZXQiOyB0aGVuIFwKLQkJbGlzdD0nJChTVUJESVJTKSc7IGZvciBpIGluICQkbGlzdDsgZG8gXAotCQkJdGFyZ2V0PSIkJG90YXJnZXQiOyBcCi0JCQllY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRpIjsgXAotCQkJaWYgdGVzdCAiJCRpIiA9ICIuIjsgdGhlbiBcCi0JCQkJb2s9eWVzOyBcCi0JCQkJdGFyZ2V0PSIkJHRhcmdldC1wIjsgXAotCQkJZmk7IFwKLQkJCWlmIHRlc3QgISAtZiAkJGkvLmRlcHM7IHRoZW4gdG91Y2ggJCRpLy5kZXBzOyBmaTsgXAotCQkJKGNkICQkaSAmJiAkKE1BS0UpICQkdGFyZ2V0KSB8fCBleGl0IDE7IFwKLQkJZG9uZTsgXAotCQlpZiB0ZXN0ICIkJG90YXJnZXQiID0gImFsbCIgJiYgdGVzdCAteiAnJCh0YXJnZXRzKSc7IHRoZW4gb2s9eWVzOyBmaTtcCi0JCWlmIHRlc3QgIiQkb2siICE9ICJ5ZXMiOyB0aGVuICQoTUFLRSkgIiQkb3RhcmdldC1wIiB8fCBleGl0IDE7IGZpO1wKLQlmaQotCi1hbGwtcDogJCh0YXJnZXRzKQotaW5zdGFsbC1wOiAkKHRhcmdldHMpICQoaW5zdGFsbF90YXJnZXRzKQotCUBpZiB0ZXN0IC1uICckKFBST0dSQU1TKSc7IHRoZW4gXAotCQl0ZXN0IC1kICQoYmluZGlyKSB8fCAkKG1raW5zdGFsbGRpcnMpICQoYmluZGlyKTsgXAotCQlmb3IgaSBpbiAiJChQUk9HUkFNUykiOyBkbyBcCi0JCQkkKElOU1RBTExfUFJPR1JBTSkgJCRpICQoYmluZGlyKTsgXAotCQlkb25lOyBcCi0JZmkKLQotZGlzdGNsZWFuLXAgZGVwZW5kLXAgY2xlYW4tcDoKLQotZGVwZW5kOiBkZXBlbmQtcmVjdXJzaXZlCi0JdGVzdCAiYGVjaG8gKi5jYCIgPSAnKi5jJyB8fCBwZXJsICQodG9wX3NyY2RpcikvYnVpbGQvbWtkZXAucGVybCAkKENQUCkgJChJTkNMVURFUykgJChFWFRSQV9JTkNMVURFUykgKi5jID4gLmRlcHMKLQotY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi14Ci0KLWNsZWFuLXg6Ci0Jcm0gLWYgJCh0YXJnZXRzKSAqLmxvICoubGEgKi5vICQoQ0xFQU5GSUxFUykKLQlybSAtcmYgLmxpYnMKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXgKLQlybSAtZiBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBjb25maWcuc3RhdHVzIGNvbmZpZ192YXJzLm1rIGxpYnRvb2wgXAotCXN0YW1wLWggTWFrZWZpbGUgc2hsaWJ0b29sCi0KLWluY2x1ZGUgJChzcmNkaXIpLy5kZXBzCi0KLS5QSE9OWTogYWxsLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgXAotJChpbnN0YWxsX3RhcmdldHMpIGluc3RhbGwgYWxsIGNsZWFuIGRlcGVuZCBkZXBlbmQtcmVjdXJzaXZlIHNoYXJlZCBcCi1kaXN0Y2xlYW4tcmVjdXJzaXZlIGRpc3RjbGVhbiBjbGVhbi14IGFsbC1wIGluc3RhbGwtcCBkaXN0Y2xlYW4tcCBcCi1kZXBlbmQtcCBjbGVhbi1wICQocGhvbnlfdGFyZ2V0cykKZGlmZiAtLWdpdCBhL2J1aWxkL3NuYXBzaG90IGIvYnVpbGQvc25hcHNob3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk1NTNhNzUuLjAwMDAwMDAKLS0tIGEvYnVpbGQvc25hcHNob3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotdGVzdCAtbiAiJDEiICYmIEFSRz0iRElTVE5BTUU9JyQxJyIKLQotJHtNQUtFOi1tYWtlfSAkQVJHIC1mIGJ1aWxkL2J1aWxkLm1rIHNuYXBzaG90CmRpZmYgLS1naXQgYS9idWlsZC9zcGVjaWFsLm1rIGIvYnVpbGQvc3BlY2lhbC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA2ODgzNi4uMDAwMDAwMAotLS0gYS9idWlsZC9zcGVjaWFsLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMDAgU2FzY2hhIFNjaHVtYW5uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0jIGFyZSBtZXQ6Ci0jIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotIyAKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBTQVNDSEEgU0NIVU1BTk4gYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotIyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0jIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTwotIyBFVkVOVCBTSEFMTCBTQVNDSEEgU0NIVU1BTk4gQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotIyBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKLSMgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCi0jIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi0jIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLSMgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgJElkOiBzcGVjaWFsLm1rLHYgMS4xIDIwMDAvMDEvMTEgMTM6MTA6NTkgc2FzY2hhIEV4cCAkIAotIwotCi0KLQotYWxsOiBhbGwtcmVjdXJzaXZlCi0KLWluY2x1ZGUgbW9kdWxlcy5tawotdGFyZ2V0cyA9ICQoc3RhdGljKSAkKHNoYXJlZCkKLWluc3RhbGxfdGFyZ2V0cyA9IGluc3RhbGwtbW9kdWxlcwotCi1pbnN0YWxsLW1vZHVsZXM6Ci0JQHNoYXJlZD0nJChzaGFyZWQpJzsgXAotCWlmIHRlc3QgLW4gIiQkc2hhcmVkIjsgdGhlbiBcCi0JCSQobWtpbnN0YWxsZGlycykgJChsaWJleGVjZGlyKTsgXAotCQlmb3IgaSBpbiAkJHNoYXJlZDsgZG8gXAotCQkJJChTSExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsIGNwICQkaSAkKGxpYmV4ZWNkaXIpOyBcCi0JCWRvbmU7IFwKLQlmaQkKLQotaW5jbHVkZSAkKHRvcHNyY2RpcikvYnVpbGQvcnVsZXMubWsKLQpkaWZmIC0tZ2l0IGEvYnVpbGRjb25mIGIvYnVpbGRjb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNzNlYWJkLi4wMDAwMDAwCi0tLSBhL2J1aWxkY29uZgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0ke01BS0U6LW1ha2V9IC1mIGJ1aWxkL2J1aWxkLm1rCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YjZkYzQuLjAwMDAwMDAKLS0tIGEvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLWRubCAjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0Ci0KLUFDX1BSRVJFUSgyLjEzKQotQUNfSU5JVChhY2luY2x1ZGUubTQpCi0KLWRubCAjIyBUaGlzIGlzIHRoZSBjZW50cmFsIHBsYWNlIHdoZXJlIEFwYWNoZSdzIHZlcnNpb24gc2hvdWxkIGJlIGtlcHQuCi1kbmwgQU1fSU5JVF9BVVRPTUFLRShhcGFjaGUsIDIuMC1kZXYpCi0KLVZFUlNJT049ImFwYWNoZS0yLjAtZGV2IgotCQotQUNfQ09ORklHX0hFQURFUihpbmNsdWRlL2FwX2NvbmZpZ19hdXRvLmgpCi0KLUFQQUNIRV9WRVJTSU9OPSRWRVJTSU9OCi1BUEFDSEVfU1VCU1QoQVBBQ0hFX1ZFUlNJT04pCi0KLXRlc3QgIiRleGVjX3ByZWZpeCIgPSAiTk9ORSIgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLXRlc3QgIiRwcmVmaXgiID0gIk5PTkUiICYmIHByZWZpeD0nL3Vzci9sb2NhbCcKLQotZG5sIFdlIHdhbnQgdGhpcyBvbmUgYmVmb3JlIHRoZSBjaGVja3MsIHNvIHRoZSBjaGVja3MgY2FuIG1vZGlmeSBDRkxBR1MKLXRlc3QgLXogIiRDRkxBR1MiICYmIGF1dG9fY2ZsYWdzPTEKLQotZG5sIE5lZWRlZCBmb3IgQVBBQ0hFX01PRFVMRSgpIHRvIHdvcmsKLWN3ZD1gcHdkYAotCi1kbmwgIyMgUnVuIGNvbmZpZ3VyZSBmb3IgcGFja2FnZXMgQXBhY2hlIHVzZXMKLUFDX0NPTkZJR19TVUJESVJTKGxpYi9hcHIpCi0KLWRubCAjIyBDaGVjayBmb3IgcHJvZ3JhbXMKLQotQUNfUFJPR19BV0sKLUFDX1BST0dfQ0MKLUFDX1BST0dfQ1BQCi1BQ19QUk9HX0lOU1RBTEwKLWRubCBBQ19QUk9HX1JBTkxJQgotZG5sIEFDX1BBVEhfUFJPRyhQRVJMX1BBVEgsIHBlcmwpCi0KLWRubCB2YXJpb3VzIE9TIGNoZWNrcyB0aGF0IGFwcGFyZW50bHkgc2V0IHJlcXVpcmVkIGZsYWdzCi1BQ19BSVgKLUFDX0lTQ19QT1NJWAotQUNfTUlOSVgKLQotZG5sICMjIENoZWNrIGZvciBsaWJyYXJpZXMKLQotZG5sICMjIENoZWNrIGZvciBoZWFkZXIgZmlsZXMKLQotZG5sIEkgdGhpbmsgdGhlc2UgYXJlIGp1c3QgdXNlZCBhbGwgb3ZlciB0aGUgcGxhY2UsIHNvIGp1c3QgY2hlY2sgZm9yCi1kbmwgdGhlbSBhdCB0aGUgYmFzZSBvZiB0aGUgdHJlZS4gSWYgc29tZSBhcmUgc3BlY2lmaWMgdG8gYSBzaW5nbGUKLWRubCBkaXJlY3RvcnksIHRoZXkgc2hvdWxkIGJlIG1vdmVkIChDb21tZW50ICNTcG9vbikKLQotQUNfSEVBREVSX1NUREMKLUFDX0NIRUNLX0hFQURFUlMoIFwKLXVuaXN0ZC5oIFwKLXN5cy9zdGF0LmggXAotc3lzL3RpbWUuaCBcCi1zeXMvdHlwZXMuaCBcCi1zeXMvc29ja2V0LmggXAotbmV0aW5ldC9pbi5oIFwKLWFycGEvaW5ldC5oIFwKLW5ldGRiLmggXAotcHdkLmggXAotZ3JwLmggXAotKQotQUNfSEVBREVSX1NZU19XQUlUCi0KLWRubCAjIyBDaGVjayBmb3IgQyBwcmVwcm9jZXNzb3Igc3ltYm9scwotCi1BQ19DSEVDS19ERUZJTkUoRUFHQUlOLCBlcnJuby5oKQotCi1kbmwgIyMgQ2hlY2sgZm9yIHR5cGVkZWZzLCBzdHJ1Y3R1cmVzLCBhbmQgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzLgotCi1BQ19DX0NPTlNUCi1BQ19DX0lOTElORQotQUNfVFlQRV9QSURfVAotCi1kbmwgIyMgQ2hlY2sgZm9yIGxpYnJhcnkgZnVuY3Rpb25zCi0KLWRubCBTZWUgQ29tbWVudCAjU3Bvb24KLQotQUNfQ0hFQ0tfRlVOQ1MoIFwKLXN0cmR1cCBcCi1zdHJjYXNlY21wIFwKLXN0cm5jYXNlY21wIFwKLXN0cnN0ciBcCi1zdHJlcnJvciBcCi1pbml0Z3JvdXBzIFwKLXdhaXRwaWQgXAotZ2V0dGltZW9mZGF5IFwKLW1lbW1vdmUgXAotYnplcm8gXAotKQotCi1BQ19DSEVDS19MSUIobnNsLCBnZXRob3N0YnluYW1lKQotQUNfQ0hFQ0tfTElCKHNvY2tldCwgc29ja2V0KQotCi1BQ19DSEVDS19GVU5DUyhpbmV0X2FkZHIgaW5ldF9uZXR3b3JrLCBicmVhaywgWwotICBBQ19NU0dfRVJST1IoaW5ldF9hZGRyIGZ1bmN0aW9uIG5vdCBmb3VuZCkKLV0pCi0KLUFQQUNIRV9JTkFERFJfTk9ORQotCi1SRUVOVFJBTkNZX0ZMQUdTCi0KLUFDX0ZVTkNfU0VMRUNUX0FSR1RZUEVTCi0KLWRubCBDaGVjayBpZiB3ZSdsbCBhY3R1YWxseSBuZWVkIHRvIGNhc3Qgc2VsZWN0IGFyZ3MgYWxsIHRoZSB0aW1lCi1pZiB0ZXN0ICIkYWNfY3ZfZnVuY19zZWxlY3RfYXJnMSIgIT0gImludCIgXAotICAgICAgICAtbyAiJGFjX2N2X2Z1bmNfc2VsZWN0X2FyZzIzNCIgIT0gImZkX3NldCAqIiBcCi0gICAgICAgIC1vICIkYWNfY3ZfZnVuY19zZWxlY3RfYXJnNSIgIT0gInN0cnVjdCB0aW1ldmFsICoiIDsgdGhlbgotCi0gICAgQUNfREVGSU5FKFNFTEVDVF9ORUVEU19DQVNULCwKLSAgICAgICAgW0RlZmluZSBpZiBhcmd1bWVudHMgdG8gc2VsZWN0KCkgYXJlbid0IHdoYXQgd2UgZXhwZWN0XSkKLWZpCi0KLWRubCAjIyBDaGVja2luZyBjb21tYW5kLWxpbmUgb3B0aW9ucwotdGVzdCAtbiAiJEdDQyIgJiYgdGVzdCAiJFVTRV9NQUlOVEFJTkVSX01PREUiID0gInllcyIgJiYgXAotICAgIENGTEFHUz0iJENGTEFHUyAtZyAtV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcyAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMiCi0KLUFQQUNIRV9FTkFCTEVfTEFZT1VUCi1BUEFDSEVfRU5BQkxFX01PRFVMRVMKLUFQQUNIRV9FTkFCTEVfU0hBUkVECi0KLUlOQ0xVREVTPSItSVwkKHRvcF9zcmNkaXIpL2luY2x1ZGUgLUlcJCh0b3Bfc3JjZGlyKS9saWIvYXByL2luY2x1ZGUiCi1BUEFDSEVfU1VCU1QoSU5DTFVERVMpCi0KLWRubCByZWFkaW5nIGNvbmZpZyBzdHVicwotZXN5c2NtZCguL2hlbHBlcnMvY29uZmlnLXN0dWJzIC4pCi0KLUlOQ0xVREVTPSIkSU5DTFVERVMgLUlcJCh0b3Bfc3JjZGlyKS9cJChPU19ESVIpIgotRVhUUkFfTElCUz0iJEVYVFJBX0xJQlMgJExJQlMiCi1FWFRSQV9MREZMQUdTPSIkTERGTEFHUyIKLUxJQlM9IiIKLUxERkxBR1M9IiIKLUFQQUNIRV9TVUJTVChFWFRSQV9MREZMQUdTKQotQVBBQ0hFX1NVQlNUKEVYVFJBX0xJQlMpCi1BUEFDSEVfU1VCU1QoUkVHRVhfRElSKQotQVBBQ0hFX1NVQlNUKFJFR0VYX0xJQikKLUFQQUNIRV9TVUJTVChNUE1fTElCKQotQVBBQ0hFX1NVQlNUKE9TKQotQVBBQ0hFX1NVQlNUKE9TX0RJUikKLUFQQUNIRV9TVUJTVChCVUlMVElOX0xJQlMpCi0KLUFNX0RJU0FCTEVfU0hBUkVECi1BTV9QUk9HX0xJQlRPT0wKLUFQQUNIRV9MSUJUT09MX1NJTEVOVAotCi1pZiB0ZXN0ICIkYXBhY2hlX25lZWRfc2hhcmVkIiA9ICJ5ZXMiOyB0aGVuCi0gICRTSEVMTCAkc3JjZGlyL2x0Y29uZmlnIC0tb3V0cHV0PXNobGlidG9vbCAtLWRpc2FibGUtc3RhdGljIC0tc3JjZGlyPSRzcmNkaXIgLS1jYWNoZS1maWxlPS4vY29uZmlnLmNhY2hlICRzcmNkaXIvbHRtYWluLnNoCi1maQotCi1BUEFDSEVfRkFTVF9PVVRQVVQoTWFrZWZpbGUgYXAvTWFrZWZpbGUgbGliL01ha2VmaWxlIG1haW4vTWFrZWZpbGUKLSAgICAgICAgICAgbW9kdWxlcy9NYWtlZmlsZSBvcy9NYWtlZmlsZSkKLUFQQUNIRV9GQVNUX0dFTkVSQVRFCi0JCi1kbmwgIyMgQnVpbGQgbW9kdWxlcy5jCi1ybSAtZiAkc3JjZGlyL21vZHVsZXMuYwotZWNobyAkTU9ETElTVCB8ICRBV0sgLWYgJHNyY2Rpci9oZWxwZXJzL2J1aWxkLW1vZHVsZXMtYy5hd2sgPiAkc3JjZGlyL21vZHVsZXMuYwotCi1BQ19PVVRQVVQoJEFQQUNIRV9PVVRQVVRfRklMRVMpCmRpZmYgLS1naXQgYS9kb2NzL2NnaS1leGFtcGxlcy9wcmludGVudiBiL2RvY3MvY2dpLWV4YW1wbGVzL3ByaW50ZW52CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDM4OWUwLi4wMDAwMDAwCi0tLSBhL2RvY3MvY2dpLWV4YW1wbGVzL3ByaW50ZW52CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIS91c3IvbG9jYWwvYmluL3BlcmwKLQotcHJpbnQgIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sXG5cbiI7Ci13aGlsZSAoKCRrZXksICR2YWwpID0gZWFjaCAlRU5WKSB7Ci0JcHJpbnQgIiRrZXkgPSAkdmFsPEJSPlxuIjsKLX0KLQpkaWZmIC0tZ2l0IGEvZG9jcy9jZ2ktZXhhbXBsZXMvdGVzdC1jZ2kgYi9kb2NzL2NnaS1leGFtcGxlcy90ZXN0LWNnaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg1NjMxZS4uMDAwMDAwMAotLS0gYS9kb2NzL2NnaS1leGFtcGxlcy90ZXN0LWNnaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIGRpc2FibGUgZmlsZW5hbWUgZ2xvYmJpbmcKLXNldCAtZgotCi1lY2hvIENvbnRlbnQtdHlwZTogdGV4dC9wbGFpbgotZWNobwotCi1lY2hvIENHSS8xLjAgdGVzdCBzY3JpcHQgcmVwb3J0OgotZWNobwotCi1lY2hvIGFyZ2MgaXMgJCMuIGFyZ3YgaXMgIiQqIi4KLWVjaG8KLQotZWNobyBTRVJWRVJfU09GVFdBUkUgPSAkU0VSVkVSX1NPRlRXQVJFCi1lY2hvIFNFUlZFUl9OQU1FID0gJFNFUlZFUl9OQU1FCi1lY2hvIEdBVEVXQVlfSU5URVJGQUNFID0gJEdBVEVXQVlfSU5URVJGQUNFCi1lY2hvIFNFUlZFUl9QUk9UT0NPTCA9ICRTRVJWRVJfUFJPVE9DT0wKLWVjaG8gU0VSVkVSX1BPUlQgPSAkU0VSVkVSX1BPUlQKLWVjaG8gUkVRVUVTVF9NRVRIT0QgPSAkUkVRVUVTVF9NRVRIT0QKLWVjaG8gSFRUUF9BQ0NFUFQgPSAiJEhUVFBfQUNDRVBUIgotZWNobyBQQVRIX0lORk8gPSAiJFBBVEhfSU5GTyIKLWVjaG8gUEFUSF9UUkFOU0xBVEVEID0gIiRQQVRIX1RSQU5TTEFURUQiCi1lY2hvIFNDUklQVF9OQU1FID0gIiRTQ1JJUFRfTkFNRSIKLWVjaG8gUVVFUllfU1RSSU5HID0gIiRRVUVSWV9TVFJJTkciCi1lY2hvIFJFTU9URV9IT1NUID0gJFJFTU9URV9IT1NUCi1lY2hvIFJFTU9URV9BRERSID0gJFJFTU9URV9BRERSCi1lY2hvIFJFTU9URV9VU0VSID0gJFJFTU9URV9VU0VSCi1lY2hvIEFVVEhfVFlQRSA9ICRBVVRIX1RZUEUKLWVjaG8gQ09OVEVOVF9UWVBFID0gJENPTlRFTlRfVFlQRQotZWNobyBDT05URU5UX0xFTkdUSCA9ICRDT05URU5UX0xFTkdUSApkaWZmIC0tZ2l0IGEvZG9jcy9jb25mL2hpZ2hwZXJmb3JtYW5jZS5jb25mIGIvZG9jcy9jb25mL2hpZ2hwZXJmb3JtYW5jZS5jb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzQ1ZDcyLi4wMDAwMDAwCi0tLSBhL2RvY3MvY29uZi9oaWdocGVyZm9ybWFuY2UuY29uZgorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLSMgSGEsIHlvdSdyZSByZWFkaW5nIHRoaXMgY29uZmlnIGZpbGUgbG9va2luZyBmb3IgdGhlIGVhc3kgd2F5IG91dCEKLSMgImhvdyBkbyBJIG1ha2UgbXkgYXBhY2hlIHNlcnZlciBnbyByZWFsbHkgcmVhbGx5IGZhc3Q/PyIKLSMgV2VsbCB5b3UgY291bGQgc3RhcnQgYnkgcmVhZGluZyB0aGUgaHRkb2NzL21hbnVhbC9taXNjL3BlcmYtdHVuaW5nLmh0bWwKLSMgcGFnZS4gIEJ1dCwgd2UnbGwgZ2l2ZSB5b3UgYSBoZWFkIHN0YXJ0LgotIwotIyBUaGlzIGNvbmZpZyBmaWxlIGlzIHNtYWxsLCBpdCBpcyBwcm9iYWJseSBub3Qgd2hhdCB5b3UnZCBleHBlY3Qgb24gYQotIyBmdWxsIGZlYXR1cmVkIGludGVybmV0IHdlYnNlcnZlciB3aXRoIG11bHRpcGxlIHVzZXJzLiAgQnV0IGl0J3MKLSMgcHJvYmFibHkgYSBnb29kIHN0YXJ0aW5nIHBvaW50IGZvciBhbnkgZm9sa3MgaW50ZXJlc3RlZCBpbiB0ZXN0aW5nCi0jIHBlcmZvcm1hbmNlLgotIwotIyBUbyBydW4gdGhpcyBjb25maWcgeW91J2xsIG5lZWQgdG8gdXNlIHNvbWV0aGluZyBsaWtlOgotIyAgICAgaHR0cGQgLWYgQEBTZXJ2ZXJSb290QEAvY29uZi9oaWdocGVyZm9ybWFuY2UuY29uZgotCi1Qb3J0IDgwCi1TZXJ2ZXJSb290IEBAU2VydmVyUm9vdEBACi1Eb2N1bWVudFJvb3QgQEBTZXJ2ZXJSb290QEAvaHRkb2NzCi1NYXhDbGllbnRzIDggCi1TdGFydFNlcnZlcnMgNQotTWluU3BhcmVTZXJ2ZXJzIDUKLU1heFNwYXJlU2VydmVycyAxMAotIyBBc3N1bWUgbm8gbWVtb3J5IGxlYWtzIGF0IGFsbAotTWF4UmVxdWVzdHNQZXJDaGlsZCAwCi0KLSMgdGhpcyBpcyBhIFRydWUgQ29uZmlnIEZpbGUKLSMgc2VlIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9pbmZvL3RocmVlLWNvbmZpZy1maWxlcy5odG1sCi1SZXNvdXJjZUNvbmZpZyAvZGV2L251bGwKLUFjY2Vzc0NvbmZpZyAvZGV2L251bGwKLQotIyBpdCdzIGFsd2F5cyBuaWNlIHRvIGtub3cgdGhlIHNlcnZlciBoYXMgc3RhcnRlZAotRXJyb3JMb2cgbG9ncy9lcnJvcl9sb2cKLQotIyBTb21lIGJlbmNobWFya3MgcmVxdWlyZSBsb2dnaW5nLCB3aGljaCBpcyBhIGdvb2QgcmVxdWlyZW1lbnQuICBVbmNvbW1lbnQKLSMgdGhpcyBpZiB5b3UgbmVlZCBsb2dnaW5nLgotI1RyYW5zZmVyTG9nIGxvZ3MvYWNjZXNzX2xvZwotCi0jIERpc2FibGUgc3ltbGluayBwcm90ZWN0aW9uIGFuZCBodGFjY2VzcyBmaWxlcywgdGhleSBjaGV3IGZhciB0b28gbXVjaC4KLTxEaXJlY3RvcnkgLz4KLSAgICBBbGxvd092ZXJyaWRlIG5vbmUKLSAgICBPcHRpb25zIEZvbGxvd1N5bUxpbmtzCi0gICAgIyBJZiB0aGlzIHdhcyBhIHJlYWwgaW50ZXJuZXQgc2VydmVyIHlvdSdkIHByb2JhYmx5IHdhbnQgdG8KLSAgICAjIHVuY29tbWVudCB0aGVzZToKLSAgICAjb3JkZXIgZGVueSxhbGxvdwotICAgICNkZW55IGZyb20gYWxsCi08L0RpcmVjdG9yeT4KLQotIyBJZiB0aGlzIHdhcyBhIHJlYWwgaW50ZXJuZXQgc2VydmVyIHlvdSdkIHByb2JhYmx5IHdhbnQgdG8gdW5jb21tZW50IHRoaXM6Ci0jPERpcmVjdG9yeSAiQEBTZXJ2ZXJSb290QEAvaHRkb2NzIj4KLSMgICAgb3JkZXIgYWxsb3csZGVueQotIyAgICBhbGxvdyBmcm9tIGFsbAotIzwvRGlyZWN0b3J5PgotCi0jIE9LIHRoYXQncyBlbm91Z2ggaGludHMuICBSZWFkIHRoZSBkb2N1bWVudGF0aW9uIGlmIHlvdSB3YW50IG1vcmUuCmRpZmYgLS1naXQgYS9kb2NzL2NvbmYvaHR0cGQtc3RkLmNvbmYgYi9kb2NzL2NvbmYvaHR0cGQtc3RkLmNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYzBmNGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9jb25mL2h0dHBkLXN0ZC5jb25mCisrKyAvZGV2L251bGwKQEAgLTEsODU5ICswLDAgQEAKLSMKLSMgQmFzZWQgdXBvbiB0aGUgTkNTQSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlcyBvcmlnaW5hbGx5IGJ5IFJvYiBNY0Nvb2wuCi0jCi0jIFRoaXMgaXMgdGhlIG1haW4gQXBhY2hlIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGUuICBJdCBjb250YWlucyB0aGUKLSMgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzIHRoYXQgZ2l2ZSB0aGUgc2VydmVyIGl0cyBpbnN0cnVjdGlvbnMuCi0jIFNlZSA8VVJMOmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzLz4gZm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0Ci0jIHRoZSBkaXJlY3RpdmVzLgotIwotIyBEbyBOT1Qgc2ltcGx5IHJlYWQgdGhlIGluc3RydWN0aW9ucyBpbiBoZXJlIHdpdGhvdXQgdW5kZXJzdGFuZGluZwotIyB3aGF0IHRoZXkgZG8uICBUaGV5J3JlIGhlcmUgb25seSBhcyBoaW50cyBvciByZW1pbmRlcnMuICBJZiB5b3UgYXJlIHVuc3VyZQotIyBjb25zdWx0IHRoZSBvbmxpbmUgZG9jcy4gWW91IGhhdmUgYmVlbiB3YXJuZWQuICAKLSMKLSMgQWZ0ZXIgdGhpcyBmaWxlIGlzIHByb2Nlc3NlZCwgdGhlIHNlcnZlciB3aWxsIGxvb2sgZm9yIGFuZCBwcm9jZXNzCi0jIEBAU2VydmVyUm9vdEBAL2NvbmYvc3JtLmNvbmYgYW5kIHRoZW4gQEBTZXJ2ZXJSb290QEAvY29uZi9hY2Nlc3MuY29uZgotIyB1bmxlc3MgeW91IGhhdmUgb3ZlcnJpZGRlbiB0aGVzZSB3aXRoIFJlc291cmNlQ29uZmlnIGFuZC9vcgotIyBBY2Nlc3NDb25maWcgZGlyZWN0aXZlcyBoZXJlLgotIwotIyBUaGUgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzIGFyZSBncm91cGVkIGludG8gdGhyZWUgYmFzaWMgc2VjdGlvbnM6Ci0jICAxLiBEaXJlY3RpdmVzIHRoYXQgY29udHJvbCB0aGUgb3BlcmF0aW9uIG9mIHRoZSBBcGFjaGUgc2VydmVyIHByb2Nlc3MgYXMgYQotIyAgICAgd2hvbGUgKHRoZSAnZ2xvYmFsIGVudmlyb25tZW50JykuCi0jICAyLiBEaXJlY3RpdmVzIHRoYXQgZGVmaW5lIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSAnbWFpbicgb3IgJ2RlZmF1bHQnIHNlcnZlciwKLSMgICAgIHdoaWNoIHJlc3BvbmRzIHRvIHJlcXVlc3RzIHRoYXQgYXJlbid0IGhhbmRsZWQgYnkgYSB2aXJ0dWFsIGhvc3QuCi0jICAgICBUaGVzZSBkaXJlY3RpdmVzIGFsc28gcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHNldHRpbmdzCi0jICAgICBvZiBhbGwgdmlydHVhbCBob3N0cy4KLSMgIDMuIFNldHRpbmdzIGZvciB2aXJ0dWFsIGhvc3RzLCB3aGljaCBhbGxvdyBXZWIgcmVxdWVzdHMgdG8gYmUgc2VudCB0bwotIyAgICAgZGlmZmVyZW50IElQIGFkZHJlc3NlcyBvciBob3N0bmFtZXMgYW5kIGhhdmUgdGhlbSBoYW5kbGVkIGJ5IHRoZQotIyAgICAgc2FtZSBBcGFjaGUgc2VydmVyIHByb2Nlc3MuCi0jCi0jIENvbmZpZ3VyYXRpb24gYW5kIGxvZ2ZpbGUgbmFtZXM6IElmIHRoZSBmaWxlbmFtZXMgeW91IHNwZWNpZnkgZm9yIG1hbnkKLSMgb2YgdGhlIHNlcnZlcidzIGNvbnRyb2wgZmlsZXMgYmVnaW4gd2l0aCAiLyIgKG9yICJkcml2ZTovIiBmb3IgV2luMzIpLCB0aGUKLSMgc2VydmVyIHdpbGwgdXNlIHRoYXQgZXhwbGljaXQgcGF0aC4gIElmIHRoZSBmaWxlbmFtZXMgZG8gKm5vdCogYmVnaW4KLSMgd2l0aCAiLyIsIHRoZSB2YWx1ZSBvZiBTZXJ2ZXJSb290IGlzIHByZXBlbmRlZCAtLSBzbyAibG9ncy9mb28ubG9nIgotIyB3aXRoIFNlcnZlclJvb3Qgc2V0IHRvICIvdXNyL2xvY2FsL2FwYWNoZSIgd2lsbCBiZSBpbnRlcnByZXRlZCBieSB0aGUKLSMgc2VydmVyIGFzICIvdXNyL2xvY2FsL2FwYWNoZS9sb2dzL2Zvby5sb2ciLgotIwotCi0jIyMgU2VjdGlvbiAxOiBHbG9iYWwgRW52aXJvbm1lbnQKLSMKLSMgVGhlIGRpcmVjdGl2ZXMgaW4gdGhpcyBzZWN0aW9uIGFmZmVjdCB0aGUgb3ZlcmFsbCBvcGVyYXRpb24gb2YgQXBhY2hlLAotIyBzdWNoIGFzIHRoZSBudW1iZXIgb2YgY29uY3VycmVudCByZXF1ZXN0cyBpdCBjYW4gaGFuZGxlIG9yIHdoZXJlIGl0Ci0jIGNhbiBmaW5kIGl0cyBjb25maWd1cmF0aW9uIGZpbGVzLgotIwotCi0jCi0jIFNlcnZlclR5cGUgaXMgZWl0aGVyIGluZXRkLCBvciBzdGFuZGFsb25lLiAgSW5ldGQgbW9kZSBpcyBvbmx5IHN1cHBvcnRlZCBvbgotIyBVbml4IHBsYXRmb3Jtcy4KLSMKLSNTZXJ2ZXJUeXBlIHN0YW5kYWxvbmUKLQotIwotIyBTZXJ2ZXJSb290OiBUaGUgdG9wIG9mIHRoZSBkaXJlY3RvcnkgdHJlZSB1bmRlciB3aGljaCB0aGUgc2VydmVyJ3MKLSMgY29uZmlndXJhdGlvbiwgZXJyb3IsIGFuZCBsb2cgZmlsZXMgYXJlIGtlcHQuCi0jCi0jIE5PVEUhICBJZiB5b3UgaW50ZW5kIHRvIHBsYWNlIHRoaXMgb24gYW4gTkZTIChvciBvdGhlcndpc2UgbmV0d29yaykKLSMgbW91bnRlZCBmaWxlc3lzdGVtIHRoZW4gcGxlYXNlIHJlYWQgdGhlIExvY2tGaWxlIGRvY3VtZW50YXRpb24KLSMgKGF2YWlsYWJsZSBhdCA8VVJMOmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL21vZC9jb3JlLmh0bWwjbG9ja2ZpbGU+KTsKLSMgeW91IHdpbGwgc2F2ZSB5b3Vyc2VsZiBhIGxvdCBvZiB0cm91YmxlLgotIwotIyBEbyBOT1QgYWRkIGEgc2xhc2ggYXQgdGhlIGVuZCBvZiB0aGUgZGlyZWN0b3J5IHBhdGguCi0jCi1TZXJ2ZXJSb290ICJAQFNlcnZlclJvb3RAQCIKLQotIwotIyBUaGUgTG9ja0ZpbGUgZGlyZWN0aXZlIHNldHMgdGhlIHBhdGggdG8gdGhlIGxvY2tmaWxlIHVzZWQgd2hlbiBBcGFjaGUKLSMgaXMgY29tcGlsZWQgd2l0aCBlaXRoZXIgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUIG9yCi0jIFVTRV9GTE9DS19TRVJJQUxJWkVEX0FDQ0VQVC4gVGhpcyBkaXJlY3RpdmUgc2hvdWxkIG5vcm1hbGx5IGJlIGxlZnQgYXQKLSMgaXRzIGRlZmF1bHQgdmFsdWUuIFRoZSBtYWluIHJlYXNvbiBmb3IgY2hhbmdpbmcgaXQgaXMgaWYgdGhlIGxvZ3MKLSMgZGlyZWN0b3J5IGlzIE5GUyBtb3VudGVkLCBzaW5jZSB0aGUgbG9ja2ZpbGUgTVVTVCBCRSBTVE9SRUQgT04gQSBMT0NBTAotIyBESVNLLiBUaGUgUElEIG9mIHRoZSBtYWluIHNlcnZlciBwcm9jZXNzIGlzIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQgdG8KLSMgdGhlIGZpbGVuYW1lLiAKLSMKLSNMb2NrRmlsZSBsb2dzL2FjY2VwdC5sb2NrCi0KLSMKLSMgUGlkRmlsZTogVGhlIGZpbGUgaW4gd2hpY2ggdGhlIHNlcnZlciBzaG91bGQgcmVjb3JkIGl0cyBwcm9jZXNzCi0jIGlkZW50aWZpY2F0aW9uIG51bWJlciB3aGVuIGl0IHN0YXJ0cy4KLSMKLVBpZEZpbGUgbG9ncy9odHRwZC5waWQKLQotIwotIyBTY29yZUJvYXJkRmlsZTogRmlsZSB1c2VkIHRvIHN0b3JlIGludGVybmFsIHNlcnZlciBwcm9jZXNzIGluZm9ybWF0aW9uLgotIyBOb3QgYWxsIGFyY2hpdGVjdHVyZXMgcmVxdWlyZSB0aGlzLiAgQnV0IGlmIHlvdXJzIGRvZXMgKHlvdSdsbCBrbm93IGJlY2F1c2UKLSMgdGhpcyBmaWxlIHdpbGwgYmUgIGNyZWF0ZWQgd2hlbiB5b3UgcnVuIEFwYWNoZSkgdGhlbiB5b3UgKm11c3QqIGVuc3VyZSB0aGF0Ci0jIG5vIHR3byBpbnZvY2F0aW9ucyBvZiBBcGFjaGUgc2hhcmUgdGhlIHNhbWUgc2NvcmVib2FyZCBmaWxlLgotIwotPElmTW9kdWxlICFkZXh0ZXIuYz4KLVNjb3JlQm9hcmRGaWxlIGxvZ3MvYXBhY2hlX3J1bnRpbWVfc3RhdHVzCi08L0lmTW9kdWxlPgotCi0jCi0jIEluIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uLCB0aGUgc2VydmVyIHdpbGwgcHJvY2VzcyB0aGlzIGZpbGUsCi0jIHNybS5jb25mLCBhbmQgYWNjZXNzLmNvbmYgaW4gdGhhdCBvcmRlci4gIFRoZSBsYXR0ZXIgdHdvIGZpbGVzIGFyZQotIyBub3cgZGlzdHJpYnV0ZWQgZW1wdHksIGFzIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYWxsIGRpcmVjdGl2ZXMKLSMgYmUga2VwdCBpbiBhIHNpbmdsZSBmaWxlIGZvciBzaW1wbGljaXR5LiAgVGhlIGNvbW1lbnRlZC1vdXQgdmFsdWVzCi0jIGJlbG93IGFyZSB0aGUgYnVpbHQtaW4gZGVmYXVsdHMuICBZb3UgY2FuIGhhdmUgdGhlIHNlcnZlciBpZ25vcmUKLSMgdGhlc2UgZmlsZXMgYWx0b2dldGhlciBieSB1c2luZyAiL2Rldi9udWxsIiAoZm9yIFVuaXgpIG9yCi0jICJudWwiIChmb3IgV2luMzIpIGZvciB0aGUgYXJndW1lbnRzIHRvIHRoZSBkaXJlY3RpdmVzLgotIwotI1Jlc291cmNlQ29uZmlnIGNvbmYvc3JtLmNvbmYKLSNBY2Nlc3NDb25maWcgY29uZi9hY2Nlc3MuY29uZgotCi0jCi0jIFRpbWVvdXQ6IFRoZSBudW1iZXIgb2Ygc2Vjb25kcyBiZWZvcmUgcmVjZWl2ZXMgYW5kIHNlbmRzIHRpbWUgb3V0LgotIwotVGltZW91dCAzMDAKLQotIwotIyBLZWVwQWxpdmU6IFdoZXRoZXIgb3Igbm90IHRvIGFsbG93IHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgKG1vcmUgdGhhbgotIyBvbmUgcmVxdWVzdCBwZXIgY29ubmVjdGlvbikuIFNldCB0byAiT2ZmIiB0byBkZWFjdGl2YXRlLgotIwotS2VlcEFsaXZlIE9uCi0KLSMKLSMgTWF4S2VlcEFsaXZlUmVxdWVzdHM6IFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyB0byBhbGxvdwotIyBkdXJpbmcgYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24uIFNldCB0byAwIHRvIGFsbG93IGFuIHVubGltaXRlZCBhbW91bnQuCi0jIFdlIHJlY29tbWVuZCB5b3UgbGVhdmUgdGhpcyBudW1iZXIgaGlnaCwgZm9yIG1heGltdW0gcGVyZm9ybWFuY2UuCi0jCi1NYXhLZWVwQWxpdmVSZXF1ZXN0cyAxMDAKLQotIwotIyBLZWVwQWxpdmVUaW1lb3V0OiBOdW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgbmV4dCByZXF1ZXN0IGZyb20gdGhlCi0jIHNhbWUgY2xpZW50IG9uIHRoZSBzYW1lIGNvbm5lY3Rpb24uCi0jCi1LZWVwQWxpdmVUaW1lb3V0IDE1Ci0KLSMjCi0jIyBTZXJ2ZXItUG9vbCBTaXplIFJlZ3VsYXRpb24gKE1QTSBzcGVjaWZpYykKLSMjIAotCi0jIHByZWZvcmsgTVBNCi0jIFN0YXJ0U2VydmVycyAuLi4uLi4uLi4gbnVtYmVyIG9mIHNlcnZlciBwcm9jZXNzZXMgdG8gc3RhcnQKLSMgTWluU3BhcmVTZXJ2ZXJzIC4uLi4uLiBtaW5pbXVtIG51bWJlciBvZiBzZXJ2ZXIgcHJvY2Vzc2VzIHdoaWNoIGFyZSBrZXB0IHNwYXJlCi0jIE1heFNwYXJlU2VydmVycyAuLi4uLi4gbWF4aW11bSBudW1iZXIgb2Ygc2VydmVyIHByb2Nlc3NlcyB3aGljaCBhcmUga2VwdCBzcGFyZQotIyBNYXhDbGllbnRzIC4uLi4uLi4uLi4uIG1heGltdW0gbnVtYmVyIG9mIHNlcnZlciBwcm9jZXNzZXMgYWxsb3dlZCB0byBzdGFydAotIyBNYXhSZXF1ZXN0c1BlckNoaWxkIC4uIG1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIGEgc2VydmVyIHByb2Nlc3Mgc2VydmVzCi08SWZNb2R1bGUgcHJlZm9yay5jPgotU3RhcnRTZXJ2ZXJzICAgICAgICAgNQotTWluU3BhcmVTZXJ2ZXJzICAgICAgNQotTWF4U3BhcmVTZXJ2ZXJzICAgICAxMAotTWF4Q2xpZW50cyAgICAgICAgICAyMAotTWF4UmVxdWVzdHNQZXJDaGlsZCAgMAotPC9JZk1vZHVsZT4KLQotIyBwdGhyZWFkIE1QTQotIyBTdGFydFNlcnZlcnMgLi4uLi4uLi4uIGluaXRpYWwgIG51bWJlciBvZiBzZXJ2ZXIgcHJvY2Vzc2VzIHRvIHN0YXJ0Ci0jIE1heENsaWVudHMgLi4uLi4uLi4uLi4gbWF4aW11bSAgbnVtYmVyIG9mIHNlcnZlciBwcm9jZXNzZXMgYWxsb3dlZCB0byBzdGFydAotIyBNaW5TcGFyZVRocmVhZHMgLi4uLi4uIG1pbmltdW0gIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyB3aGljaCBhcmUga2VwdCBzcGFyZQotIyBNYXhTcGFyZVRocmVhZHMgLi4uLi4uIG1heGltdW0gIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyB3aGljaCBhcmUga2VwdCBzcGFyZQotIyBUaHJlYWRzUGVyQ2hpbGQgLi4uLi4uIGNvbnN0YW50IG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyBpbiBlYWNoIHNlcnZlciBwcm9jZXNzCi0jIE1heFJlcXVlc3RzUGVyQ2hpbGQgLi4gbWF4aW11bSAgbnVtYmVyIG9mIHJlcXVlc3RzIGEgc2VydmVyIHByb2Nlc3Mgc2VydmVzCi08SWZNb2R1bGUgbXBtdF9wdGhyZWFkLmM+Ci1TdGFydFNlcnZlcnMgICAgICAgICA1Ci1NYXhDbGllbnRzICAgICAgICAgICA4Ci1NaW5TcGFyZVRocmVhZHMgICAgICA1Ci1NYXhTcGFyZVRocmVhZHMgICAgIDEwCi1UaHJlYWRzUGVyQ2hpbGQgICAgIDIwCi1NYXhSZXF1ZXN0c1BlckNoaWxkICAwCi08L0lmTW9kdWxlPgotCi0jIGRleHRlciBNUE0KLSMgTnVtU2VydmVycyAuLi4uLi4uLi4uLiBjb25zdGFudCBudW1iZXIgb2Ygc2VydmVyIHByb2Nlc3NlcwotIyBTdGFydFRocmVhZHMgLi4uLi4uLi4uIGluaXRpYWwgIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyBpbiBlYWNoIHNlcnZlciBwcm9jZXNzCi0jIE1pblNwYXJlVGhyZWFkcyAuLi4uLi4gbWluaW11bSAgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIHdoaWNoIGFyZSBrZXB0IHNwYXJlCi0jIE1heFNwYXJlVGhyZWFkcyAuLi4uLi4gbWF4aW11bSAgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIHdoaWNoIGFyZSBrZXB0IHNwYXJlCi0jIE1heFRocmVhZHNQZXJDaGlsZCAuLi4gbWF4aW11bSAgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIGluIGVhY2ggc2VydmVyIHByb2Nlc3MKLSMgTWF4UmVxdWVzdHNQZXJDaGlsZCAuLiBtYXhpbXVtICBudW1iZXIgb2YgY29ubmVjdGlvbnMgcGVyIHNlcnZlciBwcm9jZXNzICh0aGVuIGl0IGRpZXMpCi08SWZNb2R1bGUgZGV4dGVyLmM+Ci1OdW1TZXJ2ZXJzICAgICAgICAgICA1Ci1TdGFydFRocmVhZHMgICAgICAgICA1Ci1NaW5TcGFyZVRocmVhZHMgICAgICA1Ci1NYXhTcGFyZVRocmVhZHMgICAgIDEwCi1NYXhUaHJlYWRzUGVyQ2hpbGQgIDIwCi1NYXhSZXF1ZXN0c1BlckNoaWxkICAwCi08L0lmTW9kdWxlPgotCi0jCi0jIExpc3RlbjogQWxsb3dzIHlvdSB0byBiaW5kIEFwYWNoZSB0byBzcGVjaWZpYyBJUCBhZGRyZXNzZXMgYW5kL29yCi0jIHBvcnRzLCBpbiBhZGRpdGlvbiB0byB0aGUgZGVmYXVsdC4gU2VlIGFsc28gdGhlIDxWaXJ0dWFsSG9zdD4KLSMgZGlyZWN0aXZlLgotIwotI0xpc3RlbiAzMDAwCi0jTGlzdGVuIDEyLjM0LjU2Ljc4OjgwCi0KLSMKLSMgQmluZEFkZHJlc3M6IFlvdSBjYW4gc3VwcG9ydCB2aXJ0dWFsIGhvc3RzIHdpdGggdGhpcyBvcHRpb24uIFRoaXMgZGlyZWN0aXZlCi0jIGlzIHVzZWQgdG8gdGVsbCB0aGUgc2VydmVyIHdoaWNoIElQIGFkZHJlc3MgdG8gbGlzdGVuIHRvLiBJdCBjYW4gZWl0aGVyCi0jIGNvbnRhaW4gIioiLCBhbiBJUCBhZGRyZXNzLCBvciBhIGZ1bGx5IHF1YWxpZmllZCBJbnRlcm5ldCBkb21haW4gbmFtZS4KLSMgU2VlIGFsc28gdGhlIDxWaXJ0dWFsSG9zdD4gYW5kIExpc3RlbiBkaXJlY3RpdmVzLgotIwotI0JpbmRBZGRyZXNzICoKLQotIwotIyBEeW5hbWljIFNoYXJlZCBPYmplY3QgKERTTykgU3VwcG9ydAotIwotIyBUbyBiZSBhYmxlIHRvIHVzZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhIG1vZHVsZSB3aGljaCB3YXMgYnVpbHQgYXMgYSBEU08geW91Ci0jIGhhdmUgdG8gcGxhY2UgY29ycmVzcG9uZGluZyBgTG9hZE1vZHVsZScgbGluZXMgYXQgdGhpcyBsb2NhdGlvbiBzbyB0aGUKLSMgZGlyZWN0aXZlcyBjb250YWluZWQgaW4gaXQgYXJlIGFjdHVhbGx5IGF2YWlsYWJsZSBfYmVmb3JlXyB0aGV5IGFyZSB1c2VkLgotIyBQbGVhc2UgcmVhZCB0aGUgZmlsZSBSRUFETUUuRFNPIGluIHRoZSBBcGFjaGUgMS4zIGRpc3RyaWJ1dGlvbiBmb3IgbW9yZQotIyBkZXRhaWxzIGFib3V0IHRoZSBEU08gbWVjaGFuaXNtIGFuZCBydW4gYGh0dHBkIC1sJyBmb3IgdGhlIGxpc3Qgb2YgYWxyZWFkeQotIyBidWlsdC1pbiAoc3RhdGljYWxseSBsaW5rZWQgYW5kIHRodXMgYWx3YXlzIGF2YWlsYWJsZSkgbW9kdWxlcyBpbiB5b3VyIGh0dHBkCi0jIGJpbmFyeS4KLSMKLSMgTm90ZTogVGhlIG9yZGVyIGlzIHdoaWNoIG1vZHVsZXMgYXJlIGxvYWRlZCBpcyBpbXBvcnRhbnQuICBEb24ndCBjaGFuZ2UKLSMgdGhlIG9yZGVyIGJlbG93IHdpdGhvdXQgZXhwZXJ0IGFkdmljZS4KLSMKLSMgRXhhbXBsZToKLSMgTG9hZE1vZHVsZSBmb29fbW9kdWxlIGxpYmV4ZWMvbW9kX2Zvby5zbwotCi0jCi0jIEV4dGVuZGVkU3RhdHVzIGNvbnRyb2xzIHdoZXRoZXIgQXBhY2hlIHdpbGwgZ2VuZXJhdGUgImZ1bGwiIHN0YXR1cwotIyBpbmZvcm1hdGlvbiAoRXh0ZW5kZWRTdGF0dXMgT24pIG9yIGp1c3QgYmFzaWMgaW5mb3JtYXRpb24gKEV4dGVuZGVkU3RhdHVzCi0jIE9mZikgd2hlbiB0aGUgInNlcnZlci1zdGF0dXMiIGhhbmRsZXIgaXMgY2FsbGVkLiBUaGUgZGVmYXVsdCBpcyBPZmYuCi0jCi0jRXh0ZW5kZWRTdGF0dXMgT24KLQotIyMjIFNlY3Rpb24gMjogJ01haW4nIHNlcnZlciBjb25maWd1cmF0aW9uCi0jCi0jIFRoZSBkaXJlY3RpdmVzIGluIHRoaXMgc2VjdGlvbiBzZXQgdXAgdGhlIHZhbHVlcyB1c2VkIGJ5IHRoZSAnbWFpbicKLSMgc2VydmVyLCB3aGljaCByZXNwb25kcyB0byBhbnkgcmVxdWVzdHMgdGhhdCBhcmVuJ3QgaGFuZGxlZCBieSBhCi0jIDxWaXJ0dWFsSG9zdD4gZGVmaW5pdGlvbi4gIFRoZXNlIHZhbHVlcyBhbHNvIHByb3ZpZGUgZGVmYXVsdHMgZm9yCi0jIGFueSA8VmlydHVhbEhvc3Q+IGNvbnRhaW5lcnMgeW91IG1heSBkZWZpbmUgbGF0ZXIgaW4gdGhlIGZpbGUuCi0jCi0jIEFsbCBvZiB0aGVzZSBkaXJlY3RpdmVzIG1heSBhcHBlYXIgaW5zaWRlIDxWaXJ0dWFsSG9zdD4gY29udGFpbmVycywKLSMgaW4gd2hpY2ggY2FzZSB0aGVzZSBkZWZhdWx0IHNldHRpbmdzIHdpbGwgYmUgb3ZlcnJpZGRlbiBmb3IgdGhlCi0jIHZpcnR1YWwgaG9zdCBiZWluZyBkZWZpbmVkLgotIwotCi0jCi0jIElmIHlvdXIgU2VydmVyVHlwZSBkaXJlY3RpdmUgKHNldCBlYXJsaWVyIGluIHRoZSAnR2xvYmFsIEVudmlyb25tZW50JwotIyBzZWN0aW9uKSBpcyBzZXQgdG8gImluZXRkIiwgdGhlIG5leHQgZmV3IGRpcmVjdGl2ZXMgZG9uJ3QgaGF2ZSBhbnkKLSMgZWZmZWN0IHNpbmNlIHRoZWlyIHNldHRpbmdzIGFyZSBkZWZpbmVkIGJ5IHRoZSBpbmV0ZCBjb25maWd1cmF0aW9uLgotIyBTa2lwIGFoZWFkIHRvIHRoZSBTZXJ2ZXJBZG1pbiBkaXJlY3RpdmUuCi0jCi0KLSMKLSMgUG9ydDogVGhlIHBvcnQgdG8gd2hpY2ggdGhlIHN0YW5kYWxvbmUgc2VydmVyIGxpc3RlbnMuIEZvcgotIyBwb3J0cyA8IDEwMjMsIHlvdSB3aWxsIG5lZWQgaHR0cGQgdG8gYmUgcnVuIGFzIHJvb3QgaW5pdGlhbGx5LgotIwotUG9ydCA4MAotCi0jCi0jIElmIHlvdSB3aXNoIGh0dHBkIHRvIHJ1biBhcyBhIGRpZmZlcmVudCB1c2VyIG9yIGdyb3VwLCB5b3UgbXVzdCBydW4KLSMgaHR0cGQgYXMgcm9vdCBpbml0aWFsbHkgYW5kIGl0IHdpbGwgc3dpdGNoLiAgCi0jCi0jIFVzZXIvR3JvdXA6IFRoZSBuYW1lIChvciAjbnVtYmVyKSBvZiB0aGUgdXNlci9ncm91cCB0byBydW4gaHR0cGQgYXMuCi0jICAuIE9uIFNDTyAoT0RUIDMpIHVzZSAiVXNlciBub3VzZXIiIGFuZCAiR3JvdXAgbm9ncm91cCIuCi0jICAuIE9uIEhQVVggeW91IG1heSBub3QgYmUgYWJsZSB0byB1c2Ugc2hhcmVkIG1lbW9yeSBhcyBub2JvZHksIGFuZCB0aGUKLSMgICAgc3VnZ2VzdGVkIHdvcmthcm91bmQgaXMgdG8gY3JlYXRlIGEgdXNlciB3d3cgYW5kIHVzZSB0aGF0IHVzZXIuCi0jICBOT1RFIHRoYXQgc29tZSBrZXJuZWxzIHJlZnVzZSB0byBzZXRnaWQoR3JvdXApIG9yIHNlbWN0bChJUENfU0VUKQotIyAgd2hlbiB0aGUgdmFsdWUgb2YgKHVuc2lnbmVkKUdyb3VwIGlzIGFib3ZlIDYwMDAwOyAKLSMgIGRvbid0IHVzZSBHcm91cCAjLTEgb24gdGhlc2Ugc3lzdGVtcyEKLSMKLVVzZXIgbm9ib2R5Ci1Hcm91cCAjLTEKLQotIwotIyBTZXJ2ZXJBZG1pbjogWW91ciBhZGRyZXNzLCB3aGVyZSBwcm9ibGVtcyB3aXRoIHRoZSBzZXJ2ZXIgc2hvdWxkIGJlCi0jIGUtbWFpbGVkLiAgVGhpcyBhZGRyZXNzIGFwcGVhcnMgb24gc29tZSBzZXJ2ZXItZ2VuZXJhdGVkIHBhZ2VzLCBzdWNoCi0jIGFzIGVycm9yIGRvY3VtZW50cy4KLSMKLVNlcnZlckFkbWluIHlvdUB5b3VyLmFkZHJlc3MKLQotIwotIyBTZXJ2ZXJOYW1lIGFsbG93cyB5b3UgdG8gc2V0IGEgaG9zdCBuYW1lIHdoaWNoIGlzIHNlbnQgYmFjayB0byBjbGllbnRzIGZvcgotIyB5b3VyIHNlcnZlciBpZiBpdCdzIGRpZmZlcmVudCB0aGFuIHRoZSBvbmUgdGhlIHByb2dyYW0gd291bGQgZ2V0IChpLmUuLCB1c2UKLSMgInd3dyIgaW5zdGVhZCBvZiB0aGUgaG9zdCdzIHJlYWwgbmFtZSkuCi0jCi0jIE5vdGU6IFlvdSBjYW5ub3QganVzdCBpbnZlbnQgaG9zdCBuYW1lcyBhbmQgaG9wZSB0aGV5IHdvcmsuIFRoZSBuYW1lIHlvdSAKLSMgZGVmaW5lIGhlcmUgbXVzdCBiZSBhIHZhbGlkIEROUyBuYW1lIGZvciB5b3VyIGhvc3QuIElmIHlvdSBkb24ndCB1bmRlcnN0YW5kCi0jIHRoaXMsIGFzayB5b3VyIG5ldHdvcmsgYWRtaW5pc3RyYXRvci4KLSMgSWYgeW91ciBob3N0IGRvZXNuJ3QgaGF2ZSBhIHJlZ2lzdGVyZWQgRE5TIG5hbWUsIGVudGVyIGl0cyBJUCBhZGRyZXNzIGhlcmUuCi0jIFlvdSB3aWxsIGhhdmUgdG8gYWNjZXNzIGl0IGJ5IGl0cyBhZGRyZXNzIChlLmcuLCBodHRwOi8vMTIzLjQ1LjY3Ljg5LykKLSMgYW55d2F5LCBhbmQgdGhpcyB3aWxsIG1ha2UgcmVkaXJlY3Rpb25zIHdvcmsgaW4gYSBzZW5zaWJsZSB3YXkuCi0jCi0jU2VydmVyTmFtZSBuZXcuaG9zdC5uYW1lCi0KLSMKLSMgRG9jdW1lbnRSb290OiBUaGUgZGlyZWN0b3J5IG91dCBvZiB3aGljaCB5b3Ugd2lsbCBzZXJ2ZSB5b3VyCi0jIGRvY3VtZW50cy4gQnkgZGVmYXVsdCwgYWxsIHJlcXVlc3RzIGFyZSB0YWtlbiBmcm9tIHRoaXMgZGlyZWN0b3J5LCBidXQKLSMgc3ltYm9saWMgbGlua3MgYW5kIGFsaWFzZXMgbWF5IGJlIHVzZWQgdG8gcG9pbnQgdG8gb3RoZXIgbG9jYXRpb25zLgotIwotRG9jdW1lbnRSb290ICJAQFNlcnZlclJvb3RAQC9odGRvY3MiCi0KLSMKLSMgRWFjaCBkaXJlY3RvcnkgdG8gd2hpY2ggQXBhY2hlIGhhcyBhY2Nlc3MsIGNhbiBiZSBjb25maWd1cmVkIHdpdGggcmVzcGVjdAotIyB0byB3aGljaCBzZXJ2aWNlcyBhbmQgZmVhdHVyZXMgYXJlIGFsbG93ZWQgYW5kL29yIGRpc2FibGVkIGluIHRoYXQKLSMgZGlyZWN0b3J5IChhbmQgaXRzIHN1YmRpcmVjdG9yaWVzKS4gCi0jCi0jIEZpcnN0LCB3ZSBjb25maWd1cmUgdGhlICJkZWZhdWx0IiB0byBiZSBhIHZlcnkgcmVzdHJpY3RpdmUgc2V0IG9mIAotIyBwZXJtaXNzaW9ucy4gIAotIwotPERpcmVjdG9yeSAvPgotICAgIE9wdGlvbnMgRm9sbG93U3ltTGlua3MKLSAgICBBbGxvd092ZXJyaWRlIE5vbmUKLTwvRGlyZWN0b3J5PgotCi0jCi0jIE5vdGUgdGhhdCBmcm9tIHRoaXMgcG9pbnQgZm9yd2FyZCB5b3UgbXVzdCBzcGVjaWZpY2FsbHkgYWxsb3cKLSMgcGFydGljdWxhciBmZWF0dXJlcyB0byBiZSBlbmFibGVkIC0gc28gaWYgc29tZXRoaW5nJ3Mgbm90IHdvcmtpbmcgYXMKLSMgeW91IG1pZ2h0IGV4cGVjdCwgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgc3BlY2lmaWNhbGx5IGVuYWJsZWQgaXQKLSMgYmVsb3cuCi0jCi0KLSMKLSMgVGhpcyBzaG91bGQgYmUgY2hhbmdlZCB0byB3aGF0ZXZlciB5b3Ugc2V0IERvY3VtZW50Um9vdCB0by4KLSMKLTxEaXJlY3RvcnkgIkBAU2VydmVyUm9vdEBAL2h0ZG9jcyI+Ci0KLSMKLSMgVGhpcyBtYXkgYWxzbyBiZSAiTm9uZSIsICJBbGwiLCBvciBhbnkgY29tYmluYXRpb24gb2YgIkluZGV4ZXMiLAotIyAiSW5jbHVkZXMiLCAiRm9sbG93U3ltTGlua3MiLCAiRXhlY0NHSSIsIG9yICJNdWx0aVZpZXdzIi4KLSMKLSMgTm90ZSB0aGF0ICJNdWx0aVZpZXdzIiBtdXN0IGJlIG5hbWVkICpleHBsaWNpdGx5KiAtLS0gIk9wdGlvbnMgQWxsIgotIyBkb2Vzbid0IGdpdmUgaXQgdG8geW91LgotIwotICAgIE9wdGlvbnMgSW5kZXhlcyBGb2xsb3dTeW1MaW5rcwotCi0jCi0jIFRoaXMgY29udHJvbHMgd2hpY2ggb3B0aW9ucyB0aGUgLmh0YWNjZXNzIGZpbGVzIGluIGRpcmVjdG9yaWVzIGNhbgotIyBvdmVycmlkZS4gQ2FuIGFsc28gYmUgIkFsbCIsIG9yIGFueSBjb21iaW5hdGlvbiBvZiAiT3B0aW9ucyIsICJGaWxlSW5mbyIsIAotIyAiQXV0aENvbmZpZyIsIGFuZCAiTGltaXQiCi0jCi0gICAgQWxsb3dPdmVycmlkZSBOb25lCi0KLSMKLSMgQ29udHJvbHMgd2hvIGNhbiBnZXQgc3R1ZmYgZnJvbSB0aGlzIHNlcnZlci4KLSMKLSAgICBPcmRlciBhbGxvdyxkZW55Ci0gICAgQWxsb3cgZnJvbSBhbGwKLTwvRGlyZWN0b3J5PgotCi0jCi0jIFVzZXJEaXI6IFRoZSBuYW1lIG9mIHRoZSBkaXJlY3Rvcnkgd2hpY2ggaXMgYXBwZW5kZWQgb250byBhIHVzZXIncyBob21lCi0jIGRpcmVjdG9yeSBpZiBhIH51c2VyIHJlcXVlc3QgaXMgcmVjZWl2ZWQuCi0jCi1Vc2VyRGlyIHB1YmxpY19odG1sCi0KLSMKLSMgQ29udHJvbCBhY2Nlc3MgdG8gVXNlckRpciBkaXJlY3Rvcmllcy4gIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZQotIyBmb3IgYSBzaXRlIHdoZXJlIHRoZXNlIGRpcmVjdG9yaWVzIGFyZSByZXN0cmljdGVkIHRvIHJlYWQtb25seS4KLSMKLSM8RGlyZWN0b3J5IC9ob21lLyovcHVibGljX2h0bWw+Ci0jICAgIEFsbG93T3ZlcnJpZGUgRmlsZUluZm8gQXV0aENvbmZpZyBMaW1pdAotIyAgICBPcHRpb25zIE11bHRpVmlld3MgSW5kZXhlcyBTeW1MaW5rc0lmT3duZXJNYXRjaCBJbmNsdWRlc05vRXhlYwotIyAgICA8TGltaXQgR0VUIFBPU1QgT1BUSU9OUyBQUk9QRklORD4KLSMgICAgICAgIE9yZGVyIGFsbG93LGRlbnkKLSMgICAgICAgIEFsbG93IGZyb20gYWxsCi0jICAgIDwvTGltaXQ+Ci0jICAgIDxMaW1pdCBQVVQgREVMRVRFIFBBVENIIFBST1BQQVRDSCBNS0NPTCBDT1BZIE1PVkUgTE9DSyBVTkxPQ0s+Ci0jICAgICAgICBPcmRlciBkZW55LGFsbG93Ci0jICAgICAgICBEZW55IGZyb20gYWxsCi0jICAgIDwvTGltaXQ+Ci0jPC9EaXJlY3Rvcnk+Ci0KLSMKLSMgRGlyZWN0b3J5SW5kZXg6IE5hbWUgb2YgdGhlIGZpbGUgb3IgZmlsZXMgdG8gdXNlIGFzIGEgcHJlLXdyaXR0ZW4gSFRNTAotIyBkaXJlY3RvcnkgaW5kZXguICBTZXBhcmF0ZSBtdWx0aXBsZSBlbnRyaWVzIHdpdGggc3BhY2VzLgotIwotRGlyZWN0b3J5SW5kZXggaW5kZXguaHRtbAotCi0jCi0jIEFjY2Vzc0ZpbGVOYW1lOiBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byBsb29rIGZvciBpbiBlYWNoIGRpcmVjdG9yeQotIyBmb3IgYWNjZXNzIGNvbnRyb2wgaW5mb3JtYXRpb24uCi0jCi1BY2Nlc3NGaWxlTmFtZSAuaHRhY2Nlc3MKLQotIwotIyBUaGUgZm9sbG93aW5nIGxpbmVzIHByZXZlbnQgLmh0YWNjZXNzIGZpbGVzIGZyb20gYmVpbmcgdmlld2VkIGJ5Ci0jIFdlYiBjbGllbnRzLiAgU2luY2UgLmh0YWNjZXNzIGZpbGVzIG9mdGVuIGNvbnRhaW4gYXV0aG9yaXphdGlvbgotIyBpbmZvcm1hdGlvbiwgYWNjZXNzIGlzIGRpc2FsbG93ZWQgZm9yIHNlY3VyaXR5IHJlYXNvbnMuICBDb21tZW50Ci0jIHRoZXNlIGxpbmVzIG91dCBpZiB5b3Ugd2FudCBXZWIgdmlzaXRvcnMgdG8gc2VlIHRoZSBjb250ZW50cyBvZgotIyAuaHRhY2Nlc3MgZmlsZXMuICBJZiB5b3UgY2hhbmdlIHRoZSBBY2Nlc3NGaWxlTmFtZSBkaXJlY3RpdmUgYWJvdmUsCi0jIGJlIHN1cmUgdG8gbWFrZSB0aGUgY29ycmVzcG9uZGluZyBjaGFuZ2VzIGhlcmUuCi0jCi0jIEFsc28sIGZvbGtzIHRlbmQgdG8gdXNlIG5hbWVzIHN1Y2ggYXMgLmh0cGFzc3dkIGZvciBwYXNzd29yZAotIyBmaWxlcywgc28gdGhpcyB3aWxsIHByb3RlY3QgdGhvc2UgYXMgd2VsbC4KLSMKLTxGaWxlcyB+ICJeXC5odCI+Ci0gICAgT3JkZXIgYWxsb3csZGVueQotICAgIERlbnkgZnJvbSBhbGwKLTwvRmlsZXM+Ci0KLSMKLSMgQ2FjaGVOZWdvdGlhdGVkRG9jczogQnkgZGVmYXVsdCwgQXBhY2hlIHNlbmRzICJQcmFnbWE6IG5vLWNhY2hlIiB3aXRoIGVhY2gKLSMgZG9jdW1lbnQgdGhhdCB3YXMgbmVnb3RpYXRlZCBvbiB0aGUgYmFzaXMgb2YgY29udGVudC4gVGhpcyBhc2tzIHByb3h5Ci0jIHNlcnZlcnMgbm90IHRvIGNhY2hlIHRoZSBkb2N1bWVudC4gVW5jb21tZW50aW5nIHRoZSBmb2xsb3dpbmcgbGluZSBkaXNhYmxlcwotIyB0aGlzIGJlaGF2aW9yLCBhbmQgcHJveGllcyB3aWxsIGJlIGFsbG93ZWQgdG8gY2FjaGUgdGhlIGRvY3VtZW50cy4KLSMKLSNDYWNoZU5lZ290aWF0ZWREb2NzCi0KLSMKLSMgVXNlQ2Fub25pY2FsTmFtZTogIChuZXcgZm9yIDEuMykgIFdpdGggdGhpcyBzZXR0aW5nIHR1cm5lZCBvbiwgd2hlbmV2ZXIKLSMgQXBhY2hlIG5lZWRzIHRvIGNvbnN0cnVjdCBhIHNlbGYtcmVmZXJlbmNpbmcgVVJMIChhIFVSTCB0aGF0IHJlZmVycyBiYWNrCi0jIHRvIHRoZSBzZXJ2ZXIgdGhlIHJlc3BvbnNlIGlzIGNvbWluZyBmcm9tKSBpdCB3aWxsIHVzZSBTZXJ2ZXJOYW1lIGFuZAotIyBQb3J0IHRvIGZvcm0gYSAiY2Fub25pY2FsIiBuYW1lLiAgV2l0aCB0aGlzIHNldHRpbmcgb2ZmLCBBcGFjaGUgd2lsbAotIyB1c2UgdGhlIGhvc3RuYW1lOnBvcnQgdGhhdCB0aGUgY2xpZW50IHN1cHBsaWVkLCB3aGVuIHBvc3NpYmxlLiAgVGhpcwotIyBhbHNvIGFmZmVjdHMgU0VSVkVSX05BTUUgYW5kIFNFUlZFUl9QT1JUIGluIENHSSBzY3JpcHRzLgotIwotVXNlQ2Fub25pY2FsTmFtZSBPbgotCi0jCi0jIFR5cGVzQ29uZmlnIGRlc2NyaWJlcyB3aGVyZSB0aGUgbWltZS50eXBlcyBmaWxlIChvciBlcXVpdmFsZW50KSBpcwotIyB0byBiZSBmb3VuZC4KLSMKLVR5cGVzQ29uZmlnIGNvbmYvbWltZS50eXBlcwotCi0jCi0jIERlZmF1bHRUeXBlIGlzIHRoZSBkZWZhdWx0IE1JTUUgdHlwZSB0aGUgc2VydmVyIHdpbGwgdXNlIGZvciBhIGRvY3VtZW50Ci0jIGlmIGl0IGNhbm5vdCBvdGhlcndpc2UgZGV0ZXJtaW5lIG9uZSwgc3VjaCBhcyBmcm9tIGZpbGVuYW1lIGV4dGVuc2lvbnMuCi0jIElmIHlvdXIgc2VydmVyIGNvbnRhaW5zIG1vc3RseSB0ZXh0IG9yIEhUTUwgZG9jdW1lbnRzLCAidGV4dC9wbGFpbiIgaXMKLSMgYSBnb29kIHZhbHVlLiAgSWYgbW9zdCBvZiB5b3VyIGNvbnRlbnQgaXMgYmluYXJ5LCBzdWNoIGFzIGFwcGxpY2F0aW9ucwotIyBvciBpbWFnZXMsIHlvdSBtYXkgd2FudCB0byB1c2UgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIgaW5zdGVhZCB0bwotIyBrZWVwIGJyb3dzZXJzIGZyb20gdHJ5aW5nIHRvIGRpc3BsYXkgYmluYXJ5IGZpbGVzIGFzIHRob3VnaCB0aGV5IGFyZQotIyB0ZXh0LgotIwotRGVmYXVsdFR5cGUgdGV4dC9wbGFpbgotCi0jCi0jIFRoZSBtb2RfbWltZV9tYWdpYyBtb2R1bGUgYWxsb3dzIHRoZSBzZXJ2ZXIgdG8gdXNlIHZhcmlvdXMgaGludHMgZnJvbSB0aGUKLSMgY29udGVudHMgb2YgdGhlIGZpbGUgaXRzZWxmIHRvIGRldGVybWluZSBpdHMgdHlwZS4gIFRoZSBNSU1FTWFnaWNGaWxlCi0jIGRpcmVjdGl2ZSB0ZWxscyB0aGUgbW9kdWxlIHdoZXJlIHRoZSBoaW50IGRlZmluaXRpb25zIGFyZSBsb2NhdGVkLgotIyBtb2RfbWltZV9tYWdpYyBpcyBub3QgcGFydCBvZiB0aGUgZGVmYXVsdCBzZXJ2ZXIgKHlvdSBoYXZlIHRvIGFkZAotIyBpdCB5b3Vyc2VsZiB3aXRoIGEgTG9hZE1vZHVsZSBbc2VlIHRoZSBEU08gcGFyYWdyYXBoIGluIHRoZSAnR2xvYmFsCi0jIEVudmlyb25tZW50JyBzZWN0aW9uXSwgb3IgcmVjb21waWxlIHRoZSBzZXJ2ZXIgYW5kIGluY2x1ZGUgbW9kX21pbWVfbWFnaWMKLSMgYXMgcGFydCBvZiB0aGUgY29uZmlndXJhdGlvbiksIHNvIGl0J3MgZW5jbG9zZWQgaW4gYW4gPElmTW9kdWxlPiBjb250YWluZXIuCi0jIFRoaXMgbWVhbnMgdGhhdCB0aGUgTUlNRU1hZ2ljRmlsZSBkaXJlY3RpdmUgd2lsbCBvbmx5IGJlIHByb2Nlc3NlZCBpZiB0aGUKLSMgbW9kdWxlIGlzIHBhcnQgb2YgdGhlIHNlcnZlci4KLSMKLTxJZk1vZHVsZSBtb2RfbWltZV9tYWdpYy5jPgotICAgIE1JTUVNYWdpY0ZpbGUgY29uZi9tYWdpYwotPC9JZk1vZHVsZT4KLQotIwotIyBIb3N0bmFtZUxvb2t1cHM6IExvZyB0aGUgbmFtZXMgb2YgY2xpZW50cyBvciBqdXN0IHRoZWlyIElQIGFkZHJlc3NlcwotIyBlLmcuLCB3d3cuYXBhY2hlLm9yZyAob24pIG9yIDIwNC42Mi4xMjkuMTMyIChvZmYpLgotIyBUaGUgZGVmYXVsdCBpcyBvZmYgYmVjYXVzZSBpdCdkIGJlIG92ZXJhbGwgYmV0dGVyIGZvciB0aGUgbmV0IGlmIHBlb3BsZQotIyBoYWQgdG8ga25vd2luZ2x5IHR1cm4gdGhpcyBmZWF0dXJlIG9uLCBzaW5jZSBlbmFibGluZyBpdCBtZWFucyB0aGF0Ci0jIGVhY2ggY2xpZW50IHJlcXVlc3Qgd2lsbCByZXN1bHQgaW4gQVQgTEVBU1Qgb25lIGxvb2t1cCByZXF1ZXN0IHRvIHRoZQotIyBuYW1lc2VydmVyLgotIwotSG9zdG5hbWVMb29rdXBzIE9mZgotCi0jCi0jIEVycm9yTG9nOiBUaGUgbG9jYXRpb24gb2YgdGhlIGVycm9yIGxvZyBmaWxlLgotIyBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYW4gRXJyb3JMb2cgZGlyZWN0aXZlIHdpdGhpbiBhIDxWaXJ0dWFsSG9zdD4KLSMgY29udGFpbmVyLCBlcnJvciBtZXNzYWdlcyByZWxhdGluZyB0byB0aGF0IHZpcnR1YWwgaG9zdCB3aWxsIGJlCi0jIGxvZ2dlZCBoZXJlLiAgSWYgeW91ICpkbyogZGVmaW5lIGFuIGVycm9yIGxvZ2ZpbGUgZm9yIGEgPFZpcnR1YWxIb3N0PgotIyBjb250YWluZXIsIHRoYXQgaG9zdCdzIGVycm9ycyB3aWxsIGJlIGxvZ2dlZCB0aGVyZSBhbmQgbm90IGhlcmUuCi0jCi1FcnJvckxvZyBsb2dzL2Vycm9yX2xvZwotCi0jCi0jIExvZ0xldmVsOiBDb250cm9sIHRoZSBudW1iZXIgb2YgbWVzc2FnZXMgbG9nZ2VkIHRvIHRoZSBlcnJvcl9sb2cuCi0jIFBvc3NpYmxlIHZhbHVlcyBpbmNsdWRlOiBkZWJ1ZywgaW5mbywgbm90aWNlLCB3YXJuLCBlcnJvciwgY3JpdCwKLSMgYWxlcnQsIGVtZXJnLgotIwotTG9nTGV2ZWwgd2FybgotCi0jCi0jIFRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlcyBkZWZpbmUgc29tZSBmb3JtYXQgbmlja25hbWVzIGZvciB1c2Ugd2l0aAotIyBhIEN1c3RvbUxvZyBkaXJlY3RpdmUgKHNlZSBiZWxvdykuCi0jCi1Mb2dGb3JtYXQgIiVoICVsICV1ICV0IFwiJXJcIiAlPnMgJWIgXCIle1JlZmVyZXJ9aVwiIFwiJXtVc2VyLUFnZW50fWlcIiIgY29tYmluZWQKLUxvZ0Zvcm1hdCAiJWggJWwgJXUgJXQgXCIlclwiICU+cyAlYiIgY29tbW9uCi1Mb2dGb3JtYXQgIiV7UmVmZXJlcn1pIC0+ICVVIiByZWZlcmVyCi1Mb2dGb3JtYXQgIiV7VXNlci1hZ2VudH1pIiBhZ2VudAotCi0jCi0jIFRoZSBsb2NhdGlvbiBhbmQgZm9ybWF0IG9mIHRoZSBhY2Nlc3MgbG9nZmlsZSAoQ29tbW9uIExvZ2ZpbGUgRm9ybWF0KS4KLSMgSWYgeW91IGRvIG5vdCBkZWZpbmUgYW55IGFjY2VzcyBsb2dmaWxlcyB3aXRoaW4gYSA8VmlydHVhbEhvc3Q+Ci0jIGNvbnRhaW5lciwgdGhleSB3aWxsIGJlIGxvZ2dlZCBoZXJlLiAgQ29udHJhcml3aXNlLCBpZiB5b3UgKmRvKgotIyBkZWZpbmUgcGVyLTxWaXJ0dWFsSG9zdD4gYWNjZXNzIGxvZ2ZpbGVzLCB0cmFuc2FjdGlvbnMgd2lsbCBiZQotIyBsb2dnZWQgdGhlcmVpbiBhbmQgKm5vdCogaW4gdGhpcyBmaWxlLgotIwotQ3VzdG9tTG9nIGxvZ3MvYWNjZXNzX2xvZyBjb21tb24KLQotIwotIyBJZiB5b3Ugd291bGQgbGlrZSB0byBoYXZlIGFnZW50IGFuZCByZWZlcmVyIGxvZ2ZpbGVzLCB1bmNvbW1lbnQgdGhlCi0jIGZvbGxvd2luZyBkaXJlY3RpdmVzLgotIwotI0N1c3RvbUxvZyBsb2dzL3JlZmVyZXJfbG9nIHJlZmVyZXIKLSNDdXN0b21Mb2cgbG9ncy9hZ2VudF9sb2cgYWdlbnQKLQotIwotIyBJZiB5b3UgcHJlZmVyIGEgc2luZ2xlIGxvZ2ZpbGUgd2l0aCBhY2Nlc3MsIGFnZW50LCBhbmQgcmVmZXJlciBpbmZvcm1hdGlvbgotIyAoQ29tYmluZWQgTG9nZmlsZSBGb3JtYXQpIHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlLgotIwotI0N1c3RvbUxvZyBsb2dzL2FjY2Vzc19sb2cgY29tYmluZWQKLQotIwotIyBPcHRpb25hbGx5IGFkZCBhIGxpbmUgY29udGFpbmluZyB0aGUgc2VydmVyIHZlcnNpb24gYW5kIHZpcnR1YWwgaG9zdAotIyBuYW1lIHRvIHNlcnZlci1nZW5lcmF0ZWQgcGFnZXMgKGVycm9yIGRvY3VtZW50cywgRlRQIGRpcmVjdG9yeSBsaXN0aW5ncywKLSMgbW9kX3N0YXR1cyBhbmQgbW9kX2luZm8gb3V0cHV0IGV0Yy4sIGJ1dCBub3QgQ0dJIGdlbmVyYXRlZCBkb2N1bWVudHMpLgotIyBTZXQgdG8gIkVNYWlsIiB0byBhbHNvIGluY2x1ZGUgYSBtYWlsdG86IGxpbmsgdG8gdGhlIFNlcnZlckFkbWluLgotIyBTZXQgdG8gb25lIG9mOiAgT24gfCBPZmYgfCBFTWFpbAotIwotU2VydmVyU2lnbmF0dXJlIE9uCi0KLSMKLSMgQWxpYXNlczogQWRkIGhlcmUgYXMgbWFueSBhbGlhc2VzIGFzIHlvdSBuZWVkICh3aXRoIG5vIGxpbWl0KS4gVGhlIGZvcm1hdCBpcyAKLSMgQWxpYXMgZmFrZW5hbWUgcmVhbG5hbWUKLSMKLSMgTm90ZSB0aGF0IGlmIHlvdSBpbmNsdWRlIGEgdHJhaWxpbmcgLyBvbiBmYWtlbmFtZSB0aGVuIHRoZSBzZXJ2ZXIgd2lsbAotIyByZXF1aXJlIGl0IHRvIGJlIHByZXNlbnQgaW4gdGhlIFVSTC4gIFNvICIvaWNvbnMiIGlzbid0IGFsaWFzZWQgaW4gdGhpcwotIyBleGFtcGxlLCBvbmx5ICIvaWNvbnMvIi4uCi0jCi1BbGlhcyAvaWNvbnMvICJAQFNlcnZlclJvb3RAQC9pY29ucy8iCi0KLTxEaXJlY3RvcnkgIkBAU2VydmVyUm9vdEBAL2ljb25zIj4KLSAgICBPcHRpb25zIEluZGV4ZXMgTXVsdGlWaWV3cwotICAgIEFsbG93T3ZlcnJpZGUgTm9uZQotICAgIE9yZGVyIGFsbG93LGRlbnkKLSAgICBBbGxvdyBmcm9tIGFsbAotPC9EaXJlY3Rvcnk+Ci0KLSMKLSMgU2NyaXB0QWxpYXM6IFRoaXMgY29udHJvbHMgd2hpY2ggZGlyZWN0b3JpZXMgY29udGFpbiBzZXJ2ZXIgc2NyaXB0cy4KLSMgU2NyaXB0QWxpYXNlcyBhcmUgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgQWxpYXNlcywgZXhjZXB0IHRoYXQKLSMgZG9jdW1lbnRzIGluIHRoZSByZWFsbmFtZSBkaXJlY3RvcnkgYXJlIHRyZWF0ZWQgYXMgYXBwbGljYXRpb25zIGFuZAotIyBydW4gYnkgdGhlIHNlcnZlciB3aGVuIHJlcXVlc3RlZCByYXRoZXIgdGhhbiBhcyBkb2N1bWVudHMgc2VudCB0byB0aGUgY2xpZW50LgotIyBUaGUgc2FtZSBydWxlcyBhYm91dCB0cmFpbGluZyAiLyIgYXBwbHkgdG8gU2NyaXB0QWxpYXMgZGlyZWN0aXZlcyBhcyB0bwotIyBBbGlhcy4KLSMKLVNjcmlwdEFsaWFzIC9jZ2ktYmluLyAiQEBTZXJ2ZXJSb290QEAvY2dpLWJpbi8iCi0KLSMKLSMgIkBAU2VydmVyUm9vdEBAL2NnaS1iaW4iIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHdoYXRldmVyIHlvdXIgU2NyaXB0QWxpYXNlZAotIyBDR0kgZGlyZWN0b3J5IGV4aXN0cywgaWYgeW91IGhhdmUgdGhhdCBjb25maWd1cmVkLgotIwotPERpcmVjdG9yeSAiQEBTZXJ2ZXJSb290QEAvY2dpLWJpbiI+Ci0gICAgQWxsb3dPdmVycmlkZSBOb25lCi0gICAgT3B0aW9ucyBOb25lCi0gICAgT3JkZXIgYWxsb3csZGVueQotICAgIEFsbG93IGZyb20gYWxsCi08L0RpcmVjdG9yeT4KLQotIwotIyBSZWRpcmVjdCBhbGxvd3MgeW91IHRvIHRlbGwgY2xpZW50cyBhYm91dCBkb2N1bWVudHMgd2hpY2ggdXNlZCB0byBleGlzdCBpbgotIyB5b3VyIHNlcnZlcidzIG5hbWVzcGFjZSwgYnV0IGRvIG5vdCBhbnltb3JlLiBUaGlzIGFsbG93cyB5b3UgdG8gdGVsbCB0aGUKLSMgY2xpZW50cyB3aGVyZSB0byBsb29rIGZvciB0aGUgcmVsb2NhdGVkIGRvY3VtZW50LgotIyBGb3JtYXQ6IFJlZGlyZWN0IG9sZC1VUkkgbmV3LVVSTAotIwotCi0jCi0jIERpcmVjdGl2ZXMgY29udHJvbGxpbmcgdGhlIGRpc3BsYXkgb2Ygc2VydmVyLWdlbmVyYXRlZCBkaXJlY3RvcnkgbGlzdGluZ3MuCi0jCi0KLSMKLSMgRmFuY3lJbmRleGluZyBpcyB3aGV0aGVyIHlvdSB3YW50IGZhbmN5IGRpcmVjdG9yeSBpbmRleGluZyBvciBzdGFuZGFyZAotIwotSW5kZXhPcHRpb25zIEZhbmN5SW5kZXhpbmcKLQotIwotIyBBZGRJY29uKiBkaXJlY3RpdmVzIHRlbGwgdGhlIHNlcnZlciB3aGljaCBpY29uIHRvIHNob3cgZm9yIGRpZmZlcmVudAotIyBmaWxlcyBvciBmaWxlbmFtZSBleHRlbnNpb25zLiAgVGhlc2UgYXJlIG9ubHkgZGlzcGxheWVkIGZvcgotIyBGYW5jeUluZGV4ZWQgZGlyZWN0b3JpZXMuCi0jCi1BZGRJY29uQnlFbmNvZGluZyAoQ01QLC9pY29ucy9jb21wcmVzc2VkLmdpZikgeC1jb21wcmVzcyB4LWd6aXAKLQotQWRkSWNvbkJ5VHlwZSAoVFhULC9pY29ucy90ZXh0LmdpZikgdGV4dC8qCi1BZGRJY29uQnlUeXBlIChJTUcsL2ljb25zL2ltYWdlMi5naWYpIGltYWdlLyoKLUFkZEljb25CeVR5cGUgKFNORCwvaWNvbnMvc291bmQyLmdpZikgYXVkaW8vKgotQWRkSWNvbkJ5VHlwZSAoVklELC9pY29ucy9tb3ZpZS5naWYpIHZpZGVvLyoKLQotQWRkSWNvbiAvaWNvbnMvYmluYXJ5LmdpZiAuYmluIC5leGUKLUFkZEljb24gL2ljb25zL2JpbmhleC5naWYgLmhxeAotQWRkSWNvbiAvaWNvbnMvdGFyLmdpZiAudGFyCi1BZGRJY29uIC9pY29ucy93b3JsZDIuZ2lmIC53cmwgLndybC5neiAudnJtbCAudnJtIC5pdgotQWRkSWNvbiAvaWNvbnMvY29tcHJlc3NlZC5naWYgLlogLnogLnRneiAuZ3ogLnppcAotQWRkSWNvbiAvaWNvbnMvYS5naWYgLnBzIC5haSAuZXBzCi1BZGRJY29uIC9pY29ucy9sYXlvdXQuZ2lmIC5odG1sIC5zaHRtbCAuaHRtIC5wZGYKLUFkZEljb24gL2ljb25zL3RleHQuZ2lmIC50eHQKLUFkZEljb24gL2ljb25zL2MuZ2lmIC5jCi1BZGRJY29uIC9pY29ucy9wLmdpZiAucGwgLnB5Ci1BZGRJY29uIC9pY29ucy9mLmdpZiAuZm9yCi1BZGRJY29uIC9pY29ucy9kdmkuZ2lmIC5kdmkKLUFkZEljb24gL2ljb25zL3V1ZW5jb2RlZC5naWYgLnV1Ci1BZGRJY29uIC9pY29ucy9zY3JpcHQuZ2lmIC5jb25mIC5zaCAuc2hhciAuY3NoIC5rc2ggLnRjbAotQWRkSWNvbiAvaWNvbnMvdGV4LmdpZiAudGV4Ci1BZGRJY29uIC9pY29ucy9ib21iLmdpZiBjb3JlCi0KLUFkZEljb24gL2ljb25zL2JhY2suZ2lmIC4uCi1BZGRJY29uIC9pY29ucy9oYW5kLnJpZ2h0LmdpZiBSRUFETUUKLUFkZEljb24gL2ljb25zL2ZvbGRlci5naWYgXl5ESVJFQ1RPUlleXgotQWRkSWNvbiAvaWNvbnMvYmxhbmsuZ2lmIF5eQkxBTktJQ09OXl4KLQotIwotIyBEZWZhdWx0SWNvbiBpcyB3aGljaCBpY29uIHRvIHNob3cgZm9yIGZpbGVzIHdoaWNoIGRvIG5vdCBoYXZlIGFuIGljb24KLSMgZXhwbGljaXRseSBzZXQuCi0jCi1EZWZhdWx0SWNvbiAvaWNvbnMvdW5rbm93bi5naWYKLQotIwotIyBBZGREZXNjcmlwdGlvbiBhbGxvd3MgeW91IHRvIHBsYWNlIGEgc2hvcnQgZGVzY3JpcHRpb24gYWZ0ZXIgYSBmaWxlIGluCi0jIHNlcnZlci1nZW5lcmF0ZWQgaW5kZXhlcy4gIFRoZXNlIGFyZSBvbmx5IGRpc3BsYXllZCBmb3IgRmFuY3lJbmRleGVkCi0jIGRpcmVjdG9yaWVzLgotIyBGb3JtYXQ6IEFkZERlc2NyaXB0aW9uICJkZXNjcmlwdGlvbiIgZmlsZW5hbWUKLSMKLSNBZGREZXNjcmlwdGlvbiAiR1pJUCBjb21wcmVzc2VkIGRvY3VtZW50IiAuZ3oKLSNBZGREZXNjcmlwdGlvbiAidGFyIGFyY2hpdmUiIC50YXIKLSNBZGREZXNjcmlwdGlvbiAiR1pJUCBjb21wcmVzc2VkIHRhciBhcmNoaXZlIiAudGd6Ci0KLSMKLSMgUmVhZG1lTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgUkVBRE1FIGZpbGUgdGhlIHNlcnZlciB3aWxsIGxvb2sgZm9yIGJ5Ci0jIGRlZmF1bHQsIGFuZCBhcHBlbmQgdG8gZGlyZWN0b3J5IGxpc3RpbmdzLgotIwotIyBIZWFkZXJOYW1lIGlzIHRoZSBuYW1lIG9mIGEgZmlsZSB3aGljaCBzaG91bGQgYmUgcHJlcGVuZGVkIHRvCi0jIGRpcmVjdG9yeSBpbmRleGVzLiAKLSMKLSMgVGhlIHNlcnZlciB3aWxsIGZpcnN0IGxvb2sgZm9yIG5hbWUuaHRtbCBhbmQgaW5jbHVkZSBpdCBpZiBmb3VuZC4KLSMgSWYgbmFtZS5odG1sIGRvZXNuJ3QgZXhpc3QsIHRoZSBzZXJ2ZXIgd2lsbCB0aGVuIGxvb2sgZm9yIG5hbWUudHh0Ci0jIGFuZCBpbmNsdWRlIGl0IGFzIHBsYWludGV4dCBpZiBmb3VuZC4KLSMKLVJlYWRtZU5hbWUgUkVBRE1FCi1IZWFkZXJOYW1lIEhFQURFUgotCi0jCi0jIEluZGV4SWdub3JlIGlzIGEgc2V0IG9mIGZpbGVuYW1lcyB3aGljaCBkaXJlY3RvcnkgaW5kZXhpbmcgc2hvdWxkIGlnbm9yZQotIyBhbmQgbm90IGluY2x1ZGUgaW4gdGhlIGxpc3RpbmcuICBTaGVsbC1zdHlsZSB3aWxkY2FyZGluZyBpcyBwZXJtaXR0ZWQuCi0jCi1JbmRleElnbm9yZSAuPz8qICp+ICojIEhFQURFUiogUkVBRE1FKiBSQ1MgQ1ZTICosdiAqLHQKLQotIwotIyBBZGRFbmNvZGluZyBhbGxvd3MgeW91IHRvIGhhdmUgY2VydGFpbiBicm93c2VycyAoTW9zYWljL1ggMi4xKykgdW5jb21wcmVzcwotIyBpbmZvcm1hdGlvbiBvbiB0aGUgZmx5LiBOb3RlOiBOb3QgYWxsIGJyb3dzZXJzIHN1cHBvcnQgdGhpcy4KLSMgRGVzcGl0ZSB0aGUgbmFtZSBzaW1pbGFyaXR5LCB0aGUgZm9sbG93aW5nIEFkZCogZGlyZWN0aXZlcyBoYXZlIG5vdGhpbmcKLSMgdG8gZG8gd2l0aCB0aGUgRmFuY3lJbmRleGluZyBjdXN0b21pemF0aW9uIGRpcmVjdGl2ZXMgYWJvdmUuCi0jCi1BZGRFbmNvZGluZyB4LWNvbXByZXNzIFoKLUFkZEVuY29kaW5nIHgtZ3ppcCBneiB0Z3oKLQotIwotIyBBZGRMYW5ndWFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGxhbmd1YWdlIG9mIGEgZG9jdW1lbnQuIFlvdSBjYW4KLSMgdGhlbiB1c2UgY29udGVudCBuZWdvdGlhdGlvbiB0byBnaXZlIGEgYnJvd3NlciBhIGZpbGUgaW4gYSBsYW5ndWFnZQotIyBpdCBjYW4gdW5kZXJzdGFuZC4gIE5vdGUgdGhhdCB0aGUgc3VmZml4IGRvZXMgbm90IGhhdmUgdG8gYmUgdGhlIHNhbWUKLSMgYXMgdGhlIGxhbmd1YWdlIGtleXdvcmQgLS0tIHRob3NlIHdpdGggZG9jdW1lbnRzIGluIFBvbGlzaCAod2hvc2UKLSMgbmV0LXN0YW5kYXJkIGxhbmd1YWdlIGNvZGUgaXMgcGwpIG1heSB3aXNoIHRvIHVzZSAiQWRkTGFuZ3VhZ2UgcGwgLnBvIiAKLSMgdG8gYXZvaWQgdGhlIGFtYmlndWl0eSB3aXRoIHRoZSBjb21tb24gc3VmZml4IGZvciBwZXJsIHNjcmlwdHMuCi0jCi1BZGRMYW5ndWFnZSBlbiAuZW4KLUFkZExhbmd1YWdlIGZyIC5mcgotQWRkTGFuZ3VhZ2UgZGUgLmRlCi1BZGRMYW5ndWFnZSBkYSAuZGEKLUFkZExhbmd1YWdlIGVsIC5lbAotQWRkTGFuZ3VhZ2UgaXQgLml0Ci0KLSMKLSMgTGFuZ3VhZ2VQcmlvcml0eSBhbGxvd3MgeW91IHRvIGdpdmUgcHJlY2VkZW5jZSB0byBzb21lIGxhbmd1YWdlcwotIyBpbiBjYXNlIG9mIGEgdGllIGR1cmluZyBjb250ZW50IG5lZ290aWF0aW9uLgotIyBKdXN0IGxpc3QgdGhlIGxhbmd1YWdlcyBpbiBkZWNyZWFzaW5nIG9yZGVyIG9mIHByZWZlcmVuY2UuCi0jCi1MYW5ndWFnZVByaW9yaXR5IGVuIGZyIGRlCi0KLSMKLSMgQWRkVHlwZSBhbGxvd3MgeW91IHRvIHR3ZWFrIG1pbWUudHlwZXMgd2l0aG91dCBhY3R1YWxseSBlZGl0aW5nIGl0LCBvciB0bwotIyBtYWtlIGNlcnRhaW4gZmlsZXMgdG8gYmUgY2VydGFpbiB0eXBlcy4KLSMKLSMgRm9yIGV4YW1wbGUsIHRoZSBQSFAzIG1vZHVsZSAobm90IHBhcnQgb2YgdGhlIEFwYWNoZSBkaXN0cmlidXRpb24gLSBzZWUKLSMgaHR0cDovL3d3dy5waHAubmV0KSB3aWxsIHR5cGljYWxseSB1c2U6Ci0jCi0jQWRkVHlwZSBhcHBsaWNhdGlvbi94LWh0dHBkLXBocDMgLnBocDMKLSNBZGRUeXBlIGFwcGxpY2F0aW9uL3gtaHR0cGQtcGhwMy1zb3VyY2UgLnBocHMKLQotQWRkVHlwZSBhcHBsaWNhdGlvbi94LXRhciAudGd6Ci0KLSMKLSMgQWRkSGFuZGxlciBhbGxvd3MgeW91IHRvIG1hcCBjZXJ0YWluIGZpbGUgZXh0ZW5zaW9ucyB0byAiaGFuZGxlcnMiLAotIyBhY3Rpb25zIHVucmVsYXRlZCB0byBmaWxldHlwZS4gVGhlc2UgY2FuIGJlIGVpdGhlciBidWlsdCBpbnRvIHRoZSBzZXJ2ZXIKLSMgb3IgYWRkZWQgd2l0aCB0aGUgQWN0aW9uIGNvbW1hbmQgKHNlZSBiZWxvdykKLSMKLSMgSWYgeW91IHdhbnQgdG8gdXNlIHNlcnZlciBzaWRlIGluY2x1ZGVzLCBvciBDR0kgb3V0c2lkZQotIyBTY3JpcHRBbGlhc2VkIGRpcmVjdG9yaWVzLCB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lcy4KLSMKLSMgVG8gdXNlIENHSSBzY3JpcHRzOgotIwotI0FkZEhhbmRsZXIgY2dpLXNjcmlwdCAuY2dpCi0KLSMKLSMgVG8gdXNlIHNlcnZlci1wYXJzZWQgSFRNTCBmaWxlcwotIwotI0FkZFR5cGUgdGV4dC9odG1sIC5zaHRtbAotI0FkZEhhbmRsZXIgc2VydmVyLXBhcnNlZCAuc2h0bWwKLQotIwotIyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIGVuYWJsZSBBcGFjaGUncyBzZW5kLWFzaXMgSFRUUCBmaWxlCi0jIGZlYXR1cmUKLSMKLSNBZGRIYW5kbGVyIHNlbmQtYXMtaXMgYXNpcwotCi0jCi0jIElmIHlvdSB3aXNoIHRvIHVzZSBzZXJ2ZXItcGFyc2VkIGltYWdlbWFwIGZpbGVzLCB1c2UKLSMKLSNBZGRIYW5kbGVyIGltYXAtZmlsZSBtYXAKLQotIwotIyBUbyBlbmFibGUgdHlwZSBtYXBzLCB5b3UgbWlnaHQgd2FudCB0byB1c2UKLSMKLSNBZGRIYW5kbGVyIHR5cGUtbWFwIHZhcgotCi0jCi0jIEFjdGlvbiBsZXRzIHlvdSBkZWZpbmUgbWVkaWEgdHlwZXMgdGhhdCB3aWxsIGV4ZWN1dGUgYSBzY3JpcHQgd2hlbmV2ZXIKLSMgYSBtYXRjaGluZyBmaWxlIGlzIGNhbGxlZC4gVGhpcyBlbGltaW5hdGVzIHRoZSBuZWVkIGZvciByZXBlYXRlZCBVUkwKLSMgcGF0aG5hbWVzIGZvciBvZnQtdXNlZCBDR0kgZmlsZSBwcm9jZXNzb3JzLgotIyBGb3JtYXQ6IEFjdGlvbiBtZWRpYS90eXBlIC9jZ2ktc2NyaXB0L2xvY2F0aW9uCi0jIEZvcm1hdDogQWN0aW9uIGhhbmRsZXItbmFtZSAvY2dpLXNjcmlwdC9sb2NhdGlvbgotIwotCi0jCi0jIE1ldGFEaXI6IHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIEFwYWNoZSBjYW4gZmluZAotIyBtZXRhIGluZm9ybWF0aW9uIGZpbGVzLiBUaGVzZSBmaWxlcyBjb250YWluIGFkZGl0aW9uYWwgSFRUUCBoZWFkZXJzCi0jIHRvIGluY2x1ZGUgd2hlbiBzZW5kaW5nIHRoZSBkb2N1bWVudAotIwotI01ldGFEaXIgLndlYgotCi0jCi0jIE1ldGFTdWZmaXg6IHNwZWNpZmllcyB0aGUgZmlsZSBuYW1lIHN1ZmZpeCBmb3IgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSMgbWV0YSBpbmZvcm1hdGlvbi4KLSMKLSNNZXRhU3VmZml4IC5tZXRhCi0KLSMKLSMgQ3VzdG9taXphYmxlIGVycm9yIHJlc3BvbnNlIChBcGFjaGUgc3R5bGUpCi0jICB0aGVzZSBjb21lIGluIHRocmVlIGZsYXZvcnMKLSMKLSMgICAgMSkgcGxhaW4gdGV4dAotI0Vycm9yRG9jdW1lbnQgNTAwICJUaGUgc2VydmVyIG1hZGUgYSBib28gYm9vLgotIyAgbi5iLiAgdGhlICgiKSBtYXJrcyBpdCBhcyB0ZXh0LCBpdCBkb2VzIG5vdCBnZXQgb3V0cHV0Ci0jCi0jICAgIDIpIGxvY2FsIHJlZGlyZWN0cwotI0Vycm9yRG9jdW1lbnQgNDA0IC9taXNzaW5nLmh0bWwKLSMgIHRvIHJlZGlyZWN0IHRvIGxvY2FsIFVSTCAvbWlzc2luZy5odG1sCi0jRXJyb3JEb2N1bWVudCA0MDQgL2NnaS1iaW4vbWlzc2luZ19oYW5kbGVyLnBsCi0jICBOLkIuOiBZb3UgY2FuIHJlZGlyZWN0IHRvIGEgc2NyaXB0IG9yIGEgZG9jdW1lbnQgdXNpbmcgc2VydmVyLXNpZGUtaW5jbHVkZXMuCi0jCi0jICAgIDMpIGV4dGVybmFsIHJlZGlyZWN0cwotI0Vycm9yRG9jdW1lbnQgNDAyIGh0dHA6Ly9zb21lLm90aGVyX3NlcnZlci5jb20vc3Vic2NyaXB0aW9uX2luZm8uaHRtbAotIyAgTi5CLjogTWFueSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwKLSMgIHJlcXVlc3Qgd2lsbCAqbm90KiBiZSBhdmFpbGFibGUgdG8gc3VjaCBhIHNjcmlwdC4KLQotIwotIyBUaGUgZm9sbG93aW5nIGRpcmVjdGl2ZXMgbW9kaWZ5IG5vcm1hbCBIVFRQIHJlc3BvbnNlIGJlaGF2aW9yLgotIyBUaGUgZmlyc3QgZGlyZWN0aXZlIGRpc2FibGVzIGtlZXBhbGl2ZSBmb3IgTmV0c2NhcGUgMi54IGFuZCBicm93c2VycyB0aGF0Ci0jIHNwb29mIGl0LiBUaGVyZSBhcmUga25vd24gcHJvYmxlbXMgd2l0aCB0aGVzZSBicm93c2VyIGltcGxlbWVudGF0aW9ucy4KLSMgVGhlIHNlY29uZCBkaXJlY3RpdmUgaXMgZm9yIE1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciA0LjBiMgotIyB3aGljaCBoYXMgYSBicm9rZW4gSFRUUC8xLjEgaW1wbGVtZW50YXRpb24gYW5kIGRvZXMgbm90IHByb3Blcmx5Ci0jIHN1cHBvcnQga2VlcGFsaXZlIHdoZW4gaXQgaXMgdXNlZCBvbiAzMDEgb3IgMzAyIChyZWRpcmVjdCkgcmVzcG9uc2VzLgotIwotQnJvd3Nlck1hdGNoICJNb3ppbGxhLzIiIG5va2VlcGFsaXZlCi1Ccm93c2VyTWF0Y2ggIk1TSUUgNFwuMGIyOyIgbm9rZWVwYWxpdmUgZG93bmdyYWRlLTEuMCBmb3JjZS1yZXNwb25zZS0xLjAKLQotIwotIyBUaGUgZm9sbG93aW5nIGRpcmVjdGl2ZSBkaXNhYmxlcyBIVFRQLzEuMSByZXNwb25zZXMgdG8gYnJvd3NlcnMgd2hpY2gKLSMgYXJlIGluIHZpb2xhdGlvbiBvZiB0aGUgSFRUUC8xLjAgc3BlYyBieSBub3QgYmVpbmcgYWJsZSB0byBncm9rIGEKLSMgYmFzaWMgMS4xIHJlc3BvbnNlLgotIwotQnJvd3Nlck1hdGNoICJSZWFsUGxheWVyIDRcLjAiIGZvcmNlLXJlc3BvbnNlLTEuMAotQnJvd3Nlck1hdGNoICJKYXZhLzFcLjAiIGZvcmNlLXJlc3BvbnNlLTEuMAotQnJvd3Nlck1hdGNoICJKREsvMVwuMCIgZm9yY2UtcmVzcG9uc2UtMS4wCi0KLSMKLSMgQWxsb3cgc2VydmVyIHN0YXR1cyByZXBvcnRzLCB3aXRoIHRoZSBVUkwgb2YgaHR0cDovL3NlcnZlcm5hbWUvc2VydmVyLXN0YXR1cwotIyBDaGFuZ2UgdGhlICIueW91cl9kb21haW4uY29tIiB0byBtYXRjaCB5b3VyIGRvbWFpbiB0byBlbmFibGUuCi0jCi0jPExvY2F0aW9uIC9zZXJ2ZXItc3RhdHVzPgotIyAgICBTZXRIYW5kbGVyIHNlcnZlci1zdGF0dXMKLSMgICAgT3JkZXIgZGVueSxhbGxvdwotIyAgICBEZW55IGZyb20gYWxsCi0jICAgIEFsbG93IGZyb20gLnlvdXJfZG9tYWluLmNvbQotIzwvTG9jYXRpb24+Ci0KLSMKLSMgQWxsb3cgcmVtb3RlIHNlcnZlciBjb25maWd1cmF0aW9uIHJlcG9ydHMsIHdpdGggdGhlIFVSTCBvZgotIyAgaHR0cDovL3NlcnZlcm5hbWUvc2VydmVyLWluZm8gKHJlcXVpcmVzIHRoYXQgbW9kX2luZm8uYyBiZSBsb2FkZWQpLgotIyBDaGFuZ2UgdGhlICIueW91cl9kb21haW4uY29tIiB0byBtYXRjaCB5b3VyIGRvbWFpbiB0byBlbmFibGUuCi0jCi0jPExvY2F0aW9uIC9zZXJ2ZXItaW5mbz4KLSMgICAgU2V0SGFuZGxlciBzZXJ2ZXItaW5mbwotIyAgICBPcmRlciBkZW55LGFsbG93Ci0jICAgIERlbnkgZnJvbSBhbGwKLSMgICAgQWxsb3cgZnJvbSAueW91cl9kb21haW4uY29tCi0jPC9Mb2NhdGlvbj4KLQotIwotIyBUaGVyZSBoYXZlIGJlZW4gcmVwb3J0cyBvZiBwZW9wbGUgdHJ5aW5nIHRvIGFidXNlIGFuIG9sZCBidWcgZnJvbSBwcmUtMS4xCi0jIGRheXMuICBUaGlzIGJ1ZyBpbnZvbHZlZCBhIENHSSBzY3JpcHQgZGlzdHJpYnV0ZWQgYXMgYSBwYXJ0IG9mIEFwYWNoZS4KLSMgQnkgdW5jb21tZW50aW5nIHRoZXNlIGxpbmVzIHlvdSBjYW4gcmVkaXJlY3QgdGhlc2UgYXR0YWNrcyB0byBhIGxvZ2dpbmcgCi0jIHNjcmlwdCBvbiBwaGYuYXBhY2hlLm9yZy4gIE9yLCB5b3UgY2FuIHJlY29yZCB0aGVtIHlvdXJzZWxmLCB1c2luZyB0aGUgc2NyaXB0Ci0jIHN1cHBvcnQvcGhmX2FidXNlX2xvZy5jZ2kuCi0jCi0jPExvY2F0aW9uIC9jZ2ktYmluL3BoZio+Ci0jICAgIERlbnkgZnJvbSBhbGwKLSMgICAgRXJyb3JEb2N1bWVudCA0MDMgaHR0cDovL3BoZi5hcGFjaGUub3JnL3BoZl9hYnVzZV9sb2cuY2dpCi0jPC9Mb2NhdGlvbj4KLQotIwotIyBQcm94eSBTZXJ2ZXIgZGlyZWN0aXZlcy4gVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZXMgdG8KLSMgZW5hYmxlIHRoZSBwcm94eSBzZXJ2ZXI6Ci0jCi0jPElmTW9kdWxlIG1vZF9wcm94eS5jPgotI1Byb3h5UmVxdWVzdHMgT24KLSMKLSM8RGlyZWN0b3J5IHByb3h5Oio+Ci0jICAgIE9yZGVyIGRlbnksYWxsb3cKLSMgICAgRGVueSBmcm9tIGFsbAotIyAgICBBbGxvdyBmcm9tIC55b3VyX2RvbWFpbi5jb20KLSM8L0RpcmVjdG9yeT4KLQotIwotIyBFbmFibGUvZGlzYWJsZSB0aGUgaGFuZGxpbmcgb2YgSFRUUC8xLjEgIlZpYToiIGhlYWRlcnMuCi0jICgiRnVsbCIgYWRkcyB0aGUgc2VydmVyIHZlcnNpb247ICJCbG9jayIgcmVtb3ZlcyBhbGwgb3V0Z29pbmcgVmlhOiBoZWFkZXJzKQotIyBTZXQgdG8gb25lIG9mOiBPZmYgfCBPbiB8IEZ1bGwgfCBCbG9jawotIwotI1Byb3h5VmlhIE9uCi0KLSMKLSMgVG8gZW5hYmxlIHRoZSBjYWNoZSBhcyB3ZWxsLCBlZGl0IGFuZCB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lczoKLSMgKG5vIGNhY2hlaW5nIHdpdGhvdXQgQ2FjaGVSb290KQotIwotI0NhY2hlUm9vdCAiQEBTZXJ2ZXJSb290QEAvcHJveHkiCi0jQ2FjaGVTaXplIDUKLSNDYWNoZUdjSW50ZXJ2YWwgNAotI0NhY2hlTWF4RXhwaXJlIDI0Ci0jQ2FjaGVMYXN0TW9kaWZpZWRGYWN0b3IgMC4xCi0jQ2FjaGVEZWZhdWx0RXhwaXJlIDEKLSNOb0NhY2hlIGFfZG9tYWluLmNvbSBhbm90aGVyX2RvbWFpbi5lZHUgam9lcy5nYXJhZ2Vfc2FsZS5jb20KLQotIzwvSWZNb2R1bGU+Ci0jIEVuZCBvZiBwcm94eSBkaXJlY3RpdmVzLgotCi0jIyMgU2VjdGlvbiAzOiBWaXJ0dWFsIEhvc3RzCi0jCi0jIFZpcnR1YWxIb3N0OiBJZiB5b3Ugd2FudCB0byBtYWludGFpbiBtdWx0aXBsZSBkb21haW5zL2hvc3RuYW1lcyBvbiB5b3VyCi0jIG1hY2hpbmUgeW91IGNhbiBzZXR1cCBWaXJ0dWFsSG9zdCBjb250YWluZXJzIGZvciB0aGVtLgotIyBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudGF0aW9uIGF0IDxVUkw6aHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3Mvdmhvc3RzLz4KLSMgZm9yIGZ1cnRoZXIgZGV0YWlscyBiZWZvcmUgeW91IHRyeSB0byBzZXR1cCB2aXJ0dWFsIGhvc3RzLgotIyBZb3UgbWF5IHVzZSB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbiAnLVMnIHRvIHZlcmlmeSB5b3VyIHZpcnR1YWwgaG9zdAotIyBjb25maWd1cmF0aW9uLgotCi0jCi0jIElmIHlvdSB3YW50IHRvIHVzZSBuYW1lLWJhc2VkIHZpcnR1YWwgaG9zdHMgeW91IG5lZWQgdG8gZGVmaW5lIGF0Ci0jIGxlYXN0IG9uZSBJUCBhZGRyZXNzIChhbmQgcG9ydCBudW1iZXIpIGZvciB0aGVtLgotIwotI05hbWVWaXJ0dWFsSG9zdCAxMi4zNC41Ni43ODo4MAotI05hbWVWaXJ0dWFsSG9zdCAxMi4zNC41Ni43OAotCi0jCi0jIFZpcnR1YWxIb3N0IGV4YW1wbGU6Ci0jIEFsbW9zdCBhbnkgQXBhY2hlIGRpcmVjdGl2ZSBtYXkgZ28gaW50byBhIFZpcnR1YWxIb3N0IGNvbnRhaW5lci4KLSMKLSM8VmlydHVhbEhvc3QgaXAuYWRkcmVzcy5vZi5ob3N0LnNvbWVfZG9tYWluLmNvbT4KLSMgICAgU2VydmVyQWRtaW4gd2VibWFzdGVyQGhvc3Quc29tZV9kb21haW4uY29tCi0jICAgIERvY3VtZW50Um9vdCAvd3d3L2RvY3MvaG9zdC5zb21lX2RvbWFpbi5jb20KLSMgICAgU2VydmVyTmFtZSBob3N0LnNvbWVfZG9tYWluLmNvbQotIyAgICBFcnJvckxvZyBsb2dzL2hvc3Quc29tZV9kb21haW4uY29tLWVycm9yX2xvZwotIyAgICBDdXN0b21Mb2cgbG9ncy9ob3N0LnNvbWVfZG9tYWluLmNvbS1hY2Nlc3NfbG9nIGNvbW1vbgotIzwvVmlydHVhbEhvc3Q+Ci0KLSM8VmlydHVhbEhvc3QgX2RlZmF1bHRfOio+Ci0jPC9WaXJ0dWFsSG9zdD4KZGlmZiAtLWdpdCBhL2RvY3MvY29uZi9odHRwZC13aW4uY29uZiBiL2RvY3MvY29uZi9odHRwZC13aW4uY29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VjYTdlZi4uMDAwMDAwMAotLS0gYS9kb2NzL2NvbmYvaHR0cGQtd2luLmNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSw3ODEgKzAsMCBAQAotIwotIyBCYXNlZCB1cG9uIHRoZSBOQ1NBIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGVzIG9yaWdpbmFsbHkgYnkgUm9iIE1jQ29vbC4KLSMKLSMgVGhpcyBpcyB0aGUgbWFpbiBBcGFjaGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gZmlsZS4gIEl0IGNvbnRhaW5zIHRoZQotIyBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMgdGhhdCBnaXZlIHRoZSBzZXJ2ZXIgaXRzIGluc3RydWN0aW9ucy4KLSMgU2VlIDxVUkw6aHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvPiBmb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQKLSMgdGhlIGRpcmVjdGl2ZXMuCi0jCi0jIERvIE5PVCBzaW1wbHkgcmVhZCB0aGUgaW5zdHJ1Y3Rpb25zIGluIGhlcmUgd2l0aG91dCB1bmRlcnN0YW5kaW5nCi0jIHdoYXQgdGhleSBkby4gIFRoZXkncmUgaGVyZSBvbmx5IGFzIGhpbnRzIG9yIHJlbWluZGVycy4gIElmIHlvdSBhcmUgdW5zdXJlCi0jIGNvbnN1bHQgdGhlIG9ubGluZSBkb2NzLiBZb3UgaGF2ZSBiZWVuIHdhcm5lZC4gIAotIwotIyBBZnRlciB0aGlzIGZpbGUgaXMgcHJvY2Vzc2VkLCB0aGUgc2VydmVyIHdpbGwgbG9vayBmb3IgYW5kIHByb2Nlc3MKLSMgQEBTZXJ2ZXJSb290QEAvY29uZi9zcm0uY29uZiBhbmQgdGhlbiBAQFNlcnZlclJvb3RAQC9jb25mL2FjY2Vzcy5jb25mCi0jIHVubGVzcyB5b3UgaGF2ZSBvdmVycmlkZGVuIHRoZXNlIHdpdGggUmVzb3VyY2VDb25maWcgYW5kL29yCi0jIEFjY2Vzc0NvbmZpZyBkaXJlY3RpdmVzIGhlcmUuCi0jCi0jIFRoZSBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMgYXJlIGdyb3VwZWQgaW50byB0aHJlZSBiYXNpYyBzZWN0aW9uczoKLSMgIDEuIERpcmVjdGl2ZXMgdGhhdCBjb250cm9sIHRoZSBvcGVyYXRpb24gb2YgdGhlIEFwYWNoZSBzZXJ2ZXIgcHJvY2VzcyBhcyBhCi0jICAgICB3aG9sZSAodGhlICdnbG9iYWwgZW52aXJvbm1lbnQnKS4KLSMgIDIuIERpcmVjdGl2ZXMgdGhhdCBkZWZpbmUgdGhlIHBhcmFtZXRlcnMgb2YgdGhlICdtYWluJyBvciAnZGVmYXVsdCcgc2VydmVyLAotIyAgICAgd2hpY2ggcmVzcG9uZHMgdG8gcmVxdWVzdHMgdGhhdCBhcmVuJ3QgaGFuZGxlZCBieSBhIHZpcnR1YWwgaG9zdC4KLSMgICAgIFRoZXNlIGRpcmVjdGl2ZXMgYWxzbyBwcm92aWRlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgc2V0dGluZ3MKLSMgICAgIG9mIGFsbCB2aXJ0dWFsIGhvc3RzLgotIyAgMy4gU2V0dGluZ3MgZm9yIHZpcnR1YWwgaG9zdHMsIHdoaWNoIGFsbG93IFdlYiByZXF1ZXN0cyB0byBiZSBzZW50IHRvCi0jICAgICBkaWZmZXJlbnQgSVAgYWRkcmVzc2VzIG9yIGhvc3RuYW1lcyBhbmQgaGF2ZSB0aGVtIGhhbmRsZWQgYnkgdGhlCi0jICAgICBzYW1lIEFwYWNoZSBzZXJ2ZXIgcHJvY2Vzcy4KLSMKLSMgQ29uZmlndXJhdGlvbiBhbmQgbG9nZmlsZSBuYW1lczogSWYgdGhlIGZpbGVuYW1lcyB5b3Ugc3BlY2lmeSBmb3IgbWFueQotIyBvZiB0aGUgc2VydmVyJ3MgY29udHJvbCBmaWxlcyBiZWdpbiB3aXRoICIvIiAob3IgImRyaXZlOi8iIGZvciBXaW4zMiksIHRoZQotIyBzZXJ2ZXIgd2lsbCB1c2UgdGhhdCBleHBsaWNpdCBwYXRoLiAgSWYgdGhlIGZpbGVuYW1lcyBkbyAqbm90KiBiZWdpbgotIyB3aXRoICIvIiwgdGhlIHZhbHVlIG9mIFNlcnZlclJvb3QgaXMgcHJlcGVuZGVkIC0tIHNvICJsb2dzL2Zvby5sb2ciCi0jIHdpdGggU2VydmVyUm9vdCBzZXQgdG8gIi91c3IvbG9jYWwvYXBhY2hlIiB3aWxsIGJlIGludGVycHJldGVkIGJ5IHRoZQotIyBzZXJ2ZXIgYXMgIi91c3IvbG9jYWwvYXBhY2hlL2xvZ3MvZm9vLmxvZyIuCi0jCi0jIE5PVEU6IFdoZXJlIGZpbGVuYW1lcyBhcmUgc3BlY2lmaWVkLCB5b3UgbXVzdCB1c2UgZm9yd2FyZCBzbGFzaGVzCi0jIGluc3RlYWQgb2YgYmFja3NsYXNoZXMgKGUuZy4sICJjOi9hcGFjaGUiIGluc3RlYWQgb2YgImM6XGFwYWNoZSIpLgotIyBJZiBhIGRyaXZlIGxldHRlciBpcyBvbWl0dGVkLCB0aGUgZHJpdmUgb24gd2hpY2ggQXBhY2hlLmV4ZSBpcyBsb2NhdGVkCi0jIHdpbGwgYmUgdXNlZCBieSBkZWZhdWx0LiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgYWx3YXlzIHN1cHBseQotIyBhbiBleHBsaWNpdCBkcml2ZSBsZXR0ZXIgaW4gYWJzb2x1dGUgcGF0aHMsIGhvd2V2ZXIsIHRvIGF2b2lkCi0jIGNvbmZ1c2lvbi4KLSMKLQotIyMjIFNlY3Rpb24gMTogR2xvYmFsIEVudmlyb25tZW50Ci0jCi0jIFRoZSBkaXJlY3RpdmVzIGluIHRoaXMgc2VjdGlvbiBhZmZlY3QgdGhlIG92ZXJhbGwgb3BlcmF0aW9uIG9mIEFwYWNoZSwKLSMgc3VjaCBhcyB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgcmVxdWVzdHMgaXQgY2FuIGhhbmRsZSBvciB3aGVyZSBpdAotIyBjYW4gZmluZCBpdHMgY29uZmlndXJhdGlvbiBmaWxlcy4KLSMKLQotIwotIyBTZXJ2ZXJUeXBlIGlzIGVpdGhlciBpbmV0ZCwgb3Igc3RhbmRhbG9uZS4gIEluZXRkIG1vZGUgaXMgb25seSBzdXBwb3J0ZWQgb24KLSMgVW5peCBwbGF0Zm9ybXMuCi0jCi1TZXJ2ZXJUeXBlIHN0YW5kYWxvbmUKLQotIwotIyBTZXJ2ZXJSb290OiBUaGUgdG9wIG9mIHRoZSBkaXJlY3RvcnkgdHJlZSB1bmRlciB3aGljaCB0aGUgc2VydmVyJ3MKLSMgY29uZmlndXJhdGlvbiwgZXJyb3IsIGFuZCBsb2cgZmlsZXMgYXJlIGtlcHQuCi0jCi0jIERvIE5PVCBhZGQgYSBzbGFzaCBhdCB0aGUgZW5kIG9mIHRoZSBkaXJlY3RvcnkgcGF0aC4KLSMKLVNlcnZlclJvb3QgIkBAU2VydmVyUm9vdEBAIgotCi0jCi0jIFBpZEZpbGU6IFRoZSBmaWxlIGluIHdoaWNoIHRoZSBzZXJ2ZXIgc2hvdWxkIHJlY29yZCBpdHMgcHJvY2VzcwotIyBpZGVudGlmaWNhdGlvbiBudW1iZXIgd2hlbiBpdCBzdGFydHMuCi0jCi1QaWRGaWxlIGxvZ3MvaHR0cGQucGlkCi0KLSMKLSMgU2NvcmVCb2FyZEZpbGU6IEZpbGUgdXNlZCB0byBzdG9yZSBpbnRlcm5hbCBzZXJ2ZXIgcHJvY2VzcyBpbmZvcm1hdGlvbi4KLSMgTm90IGFsbCBhcmNoaXRlY3R1cmVzIHJlcXVpcmUgdGhpcy4gIEJ1dCBpZiB5b3VycyBkb2VzICh5b3UnbGwga25vdyBiZWNhdXNlCi0jIHRoaXMgZmlsZSB3aWxsIGJlICBjcmVhdGVkIHdoZW4geW91IHJ1biBBcGFjaGUpIHRoZW4geW91ICptdXN0KiBlbnN1cmUgdGhhdAotIyBubyB0d28gaW52b2NhdGlvbnMgb2YgQXBhY2hlIHNoYXJlIHRoZSBzYW1lIHNjb3JlYm9hcmQgZmlsZS4KLSMKLVNjb3JlQm9hcmRGaWxlIGxvZ3MvYXBhY2hlX3N0YXR1cwotCi0jCi0jIEluIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uLCB0aGUgc2VydmVyIHdpbGwgcHJvY2VzcyBodHRwZC5jb25mLAotIyBzcm0uY29uZiwgYW5kIGFjY2Vzcy5jb25mIGluIHRoYXQgb3JkZXIuICBUaGUgbGF0dGVyIHR3byBmaWxlcyBhcmUKLSMgbm93IGRpc3RyaWJ1dGVkIGVtcHR5LCBhcyBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IGFsbCBkaXJlY3RpdmVzCi0jIGJlIGtlcHQgaW4gYSBzaW5nbGUgZmlsZSBmb3Igc2ltcGxpY2l0eS4gIFRoZSBjb21tZW50ZWQtb3V0IHZhbHVlcwotIyBiZWxvdyBhcmUgdGhlIGJ1aWx0LWluIGRlZmF1bHRzLiAgWW91IGNhbiBoYXZlIHRoZSBzZXJ2ZXIgaWdub3JlCi0jIHRoZXNlIGZpbGVzIGFsdG9nZXRoZXIgYnkgdXNpbmcgIi9kZXYvbnVsbCIgKGZvciBVbml4KSBvcgotIyAibnVsIiAoZm9yIFdpbjMyKSBmb3IgdGhlIGFyZ3VtZW50cyB0byB0aGUgZGlyZWN0aXZlcy4KLSMKLSNSZXNvdXJjZUNvbmZpZyBjb25mL3NybS5jb25mCi0jQWNjZXNzQ29uZmlnIGNvbmYvYWNjZXNzLmNvbmYKLQotIwotIyBUaW1lb3V0OiBUaGUgbnVtYmVyIG9mIHNlY29uZHMgYmVmb3JlIHJlY2VpdmVzIGFuZCBzZW5kcyB0aW1lIG91dC4KLSMKLVRpbWVvdXQgMzAwCi0KLSMKLSMgS2VlcEFsaXZlOiBXaGV0aGVyIG9yIG5vdCB0byBhbGxvdyBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIChtb3JlIHRoYW4KLSMgb25lIHJlcXVlc3QgcGVyIGNvbm5lY3Rpb24pLiBTZXQgdG8gIk9mZiIgdG8gZGVhY3RpdmF0ZS4KLSMKLUtlZXBBbGl2ZSBPbgotCi0jCi0jIE1heEtlZXBBbGl2ZVJlcXVlc3RzOiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgdG8gYWxsb3cKLSMgZHVyaW5nIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uLiBTZXQgdG8gMCB0byBhbGxvdyBhbiB1bmxpbWl0ZWQgYW1vdW50LgotIyBXZSByZWNjb21lbmQgeW91IGxlYXZlIHRoaXMgbnVtYmVyIGhpZ2gsIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlLgotIwotTWF4S2VlcEFsaXZlUmVxdWVzdHMgMTAwCi0KLSMKLSMgS2VlcEFsaXZlVGltZW91dDogTnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBmb3IgdGhlIG5leHQgcmVxdWVzdCBmcm9tIHRoZQotIyBzYW1lIGNsaWVudCBvbiB0aGUgc2FtZSBjb25uZWN0aW9uLgotIwotS2VlcEFsaXZlVGltZW91dCAxNQotCi0jCi0jIEFwYWNoZSBvbiBXaW4zMiBhbHdheXMgY3JlYXRlcyBvbmUgY2hpbGQgcHJvY2VzcyB0byBoYW5kbGUgcmVxdWVzdHMuICBJZiBpdAotIyBkaWVzLCBhbm90aGVyIGNoaWxkIHByb2Nlc3MgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LiAgV2l0aGluIHRoZSBjaGlsZAotIyBwcm9jZXNzIG11bHRpcGxlIHRocmVhZHMgaGFuZGxlIGluY29taW5nIHJlcXVlc3RzLiAgVGhlIG5leHQgdHdvCi0jIGRpcmVjdGl2ZXMgY29udHJvbCB0aGUgYmVoYXZpb3VyIG9mIHRoZSB0aHJlYWRzIGFuZCBwcm9jZXNzZXMuCi0jCi0KLSMKLSMgTWF4UmVxdWVzdHNQZXJDaGlsZDogdGhlIG51bWJlciBvZiByZXF1ZXN0cyBlYWNoIGNoaWxkIHByb2Nlc3MgaXMKLSMgYWxsb3dlZCB0byBwcm9jZXNzIGJlZm9yZSB0aGUgY2hpbGQgZGllcy4gIFRoZSBjaGlsZCB3aWxsIGV4aXQgc28KLSMgYXMgdG8gYXZvaWQgcHJvYmxlbXMgYWZ0ZXIgcHJvbG9uZ2VkIHVzZSB3aGVuIEFwYWNoZSAoYW5kIG1heWJlIHRoZQotIyBsaWJyYXJpZXMgaXQgdXNlcykgbGVhayBtZW1vcnkgb3Igb3RoZXIgcmVzb3VyY2VzLiAgT24gbW9zdCBzeXN0ZW1zLCB0aGlzCi0jIGlzbid0IHJlYWxseSBuZWVkZWQsIGJ1dCBhIGZldyAoc3VjaCBhcyBTb2xhcmlzKSBkbyBoYXZlIG5vdGFibGUgbGVha3MKLSMgaW4gdGhlIGxpYnJhcmllcy4gIEZvciBXaW4zMiwgc2V0IHRoaXMgdmFsdWUgdG8gemVybyAodW5saW1pdGVkKQotIyB1bmxlc3MgYWR2aXNlZCBvdGhlcndpc2UuCi0jCi1NYXhSZXF1ZXN0c1BlckNoaWxkIDAKLQotIwotIyBOdW1iZXIgb2YgY29uY3VycmVudCB0aHJlYWRzIChpLmUuLCByZXF1ZXN0cykgdGhlIHNlcnZlciB3aWxsIGFsbG93LgotIyBTZXQgdGhpcyB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHJlc3BvbnNpdmVuZXNzIG9mIHRoZSBzZXJ2ZXIgKG1vcmUKLSMgcmVxdWVzdHMgYWN0aXZlIGF0IG9uY2UgbWVhbnMgdGhleSdyZSBhbGwgaGFuZGxlZCBtb3JlIHNsb3dseSkgYW5kCi0jIHRoZSBhbW91bnQgb2Ygc3lzdGVtIHJlc291cmNlcyB5b3UnbGwgYWxsb3cgdGhlIHNlcnZlciB0byBjb25zdW1lLgotIwotVGhyZWFkc1BlckNoaWxkIDUwCi0KLSMKLSMgTGlzdGVuOiBBbGxvd3MgeW91IHRvIGJpbmQgQXBhY2hlIHRvIHNwZWNpZmljIElQIGFkZHJlc3NlcyBhbmQvb3IKLSMgcG9ydHMsIGluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0LiBTZWUgYWxzbyB0aGUgPFZpcnR1YWxIb3N0PgotIyBkaXJlY3RpdmUuCi0jCi0jTGlzdGVuIDMwMDAKLSNMaXN0ZW4gMTIuMzQuNTYuNzg6ODAKLQotIwotIyBCaW5kQWRkcmVzczogWW91IGNhbiBzdXBwb3J0IHZpcnR1YWwgaG9zdHMgd2l0aCB0aGlzIG9wdGlvbi4gVGhpcyBkaXJlY3RpdmUKLSMgaXMgdXNlZCB0byB0ZWxsIHRoZSBzZXJ2ZXIgd2hpY2ggSVAgYWRkcmVzcyB0byBsaXN0ZW4gdG8uIEl0IGNhbiBlaXRoZXIKLSMgY29udGFpbiAiKiIsIGFuIElQIGFkZHJlc3MsIG9yIGEgZnVsbHkgcXVhbGlmaWVkIEludGVybmV0IGRvbWFpbiBuYW1lLgotIyBTZWUgYWxzbyB0aGUgPFZpcnR1YWxIb3N0PiBhbmQgTGlzdGVuIGRpcmVjdGl2ZXMuCi0jCi0jQmluZEFkZHJlc3MgKgotCi0jCi0jIER5bmFtaWMgU2hhcmVkIE9iamVjdCAoRFNPKSBTdXBwb3J0Ci0jCi0jIFRvIGJlIGFibGUgdG8gdXNlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGEgbW9kdWxlIHdoaWNoIHdhcyBidWlsdCBhcyBhIERTTyB5b3UKLSMgaGF2ZSB0byBwbGFjZSBjb3JyZXNwb25kaW5nIGBMb2FkTW9kdWxlJyBsaW5lcyBhdCB0aGlzIGxvY2F0aW9uIHNvIHRoZQotIyBkaXJlY3RpdmVzIGNvbnRhaW5lZCBpbiBpdCBhcmUgYWN0dWFsbHkgYXZhaWxhYmxlIF9iZWZvcmVfIHRoZXkgYXJlIHVzZWQuCi0jIFBsZWFzZSByZWFkIHRoZSBmaWxlIFJFQURNRS5EU08gaW4gdGhlIEFwYWNoZSAxLjMgZGlzdHJpYnV0aW9uIGZvciBtb3JlCi0jIGRldGFpbHMgYWJvdXQgdGhlIERTTyBtZWNoYW5pc20gYW5kIHJ1biBgYXBhY2hlIC1sJyBmb3IgdGhlIGxpc3Qgb2YgYWxyZWFkeQotIyBidWlsdC1pbiAoc3RhdGljYWxseSBsaW5rZWQgYW5kIHRodXMgYWx3YXlzIGF2YWlsYWJsZSkgbW9kdWxlcyBpbiB5b3VyIEFwYWNoZQotIyBiaW5hcnkuCi0jCi0jIE5vdGU6IFRoZSBvcmRlciBpbiB3aGljaCBtb2R1bGVzIGFyZSBsb2FkZWQgaXMgaW1wb3J0YW50LiAgRG9uJ3QgY2hhbmdlCi0jIHRoZSBvcmRlciBiZWxvdyB3aXRob3V0IGV4cGVydCBhZHZpY2UuCi0jCi0jTG9hZE1vZHVsZSBhbm9uX2F1dGhfbW9kdWxlIG1vZHVsZXMvQXBhY2hlTW9kdWxlQXV0aEFub24uZGxsCi0jTG9hZE1vZHVsZSBjZXJuX21ldGFfbW9kdWxlIG1vZHVsZXMvQXBhY2hlTW9kdWxlQ0VSTk1ldGEuZGxsCi0jTG9hZE1vZHVsZSBkaWdlc3RfbW9kdWxlIG1vZHVsZXMvQXBhY2hlTW9kdWxlRGlnZXN0LmRsbAotI0xvYWRNb2R1bGUgZXhwaXJlc19tb2R1bGUgbW9kdWxlcy9BcGFjaGVNb2R1bGVFeHBpcmVzLmRsbAotI0xvYWRNb2R1bGUgaGVhZGVyc19tb2R1bGUgbW9kdWxlcy9BcGFjaGVNb2R1bGVIZWFkZXJzLmRsbAotI0xvYWRNb2R1bGUgcHJveHlfbW9kdWxlIG1vZHVsZXMvQXBhY2hlTW9kdWxlUHJveHkuZGxsCi0jTG9hZE1vZHVsZSByZXdyaXRlX21vZHVsZSBtb2R1bGVzL0FwYWNoZU1vZHVsZVJld3JpdGUuZGxsCi0jTG9hZE1vZHVsZSBzcGVsaW5nX21vZHVsZSBtb2R1bGVzL0FwYWNoZU1vZHVsZVNwZWxpbmcuZGxsCi0jTG9hZE1vZHVsZSBzdGF0dXNfbW9kdWxlIG1vZHVsZXMvQXBhY2hlTW9kdWxlU3RhdHVzLmRsbAotI0xvYWRNb2R1bGUgdXNlcnRyYWNrX21vZHVsZSBtb2R1bGVzL0FwYWNoZU1vZHVsZVVzZXJUcmFjay5kbGwKLQotIwotIyBFeHRlbmRlZFN0YXR1cyBjb250cm9scyB3aGV0aGVyIEFwYWNoZSB3aWxsIGdlbmVyYXRlICJmdWxsIiBzdGF0dXMKLSMgaW5mb3JtYXRpb24gKEV4dGVuZGVkU3RhdHVzIE9uKSBvciBqdXN0IGJhc2ljIGluZm9ybWF0aW9uIChFeHRlbmRlZFN0YXR1cwotIyBPZmYpIHdoZW4gdGhlICJzZXJ2ZXItc3RhdHVzIiBoYW5kbGVyIGlzIGNhbGxlZC4gVGhlIGRlZmF1bHQgaXMgT2ZmLgotIwotI0V4dGVuZGVkU3RhdHVzIE9uCi0KLSMjIyBTZWN0aW9uIDI6ICdNYWluJyBzZXJ2ZXIgY29uZmlndXJhdGlvbgotIwotIyBUaGUgZGlyZWN0aXZlcyBpbiB0aGlzIHNlY3Rpb24gc2V0IHVwIHRoZSB2YWx1ZXMgdXNlZCBieSB0aGUgJ21haW4nCi0jIHNlcnZlciwgd2hpY2ggcmVzcG9uZHMgdG8gYW55IHJlcXVlc3RzIHRoYXQgYXJlbid0IGhhbmRsZWQgYnkgYQotIyA8VmlydHVhbEhvc3Q+IGRlZmluaXRpb24uICBUaGVzZSB2YWx1ZXMgYWxzbyBwcm92aWRlIGRlZmF1bHRzIGZvcgotIyBhbnkgPFZpcnR1YWxIb3N0PiBjb250YWluZXJzIHlvdSBtYXkgZGVmaW5lIGxhdGVyIGluIHRoZSBmaWxlLgotIwotIyBBbGwgb2YgdGhlc2UgZGlyZWN0aXZlcyBtYXkgYXBwZWFyIGluc2lkZSA8VmlydHVhbEhvc3Q+IGNvbnRhaW5lcnMsCi0jIGluIHdoaWNoIGNhc2UgdGhlc2UgZGVmYXVsdCBzZXR0aW5ncyB3aWxsIGJlIG92ZXJyaWRkZW4gZm9yIHRoZQotIyB2aXJ0dWFsIGhvc3QgYmVpbmcgZGVmaW5lZC4KLSMKLQotIwotIyBJZiB5b3VyIFNlcnZlclR5cGUgZGlyZWN0aXZlIChzZXQgZWFybGllciBpbiB0aGUgJ0dsb2JhbCBFbnZpcm9ubWVudCcKLSMgc2VjdGlvbikgaXMgc2V0IHRvICJpbmV0ZCIsIHRoZSBuZXh0IGZldyBkaXJlY3RpdmVzIGRvbid0IGhhdmUgYW55Ci0jIGVmZmVjdCBzaW5jZSB0aGVpciBzZXR0aW5ncyBhcmUgZGVmaW5lZCBieSB0aGUgaW5ldGQgY29uZmlndXJhdGlvbi4KLSMgU2tpcCBhaGVhZCB0byB0aGUgU2VydmVyQWRtaW4gZGlyZWN0aXZlLgotIwotCi0jCi0jIFBvcnQ6IFRoZSBwb3J0IHRvIHdoaWNoIHRoZSBzdGFuZGFsb25lIHNlcnZlciBsaXN0ZW5zLgotIwotUG9ydCA4MAotCi0jCi0jIFNlcnZlckFkbWluOiBZb3VyIGFkZHJlc3MsIHdoZXJlIHByb2JsZW1zIHdpdGggdGhlIHNlcnZlciBzaG91bGQgYmUKLSMgZS1tYWlsZWQuICBUaGlzIGFkZHJlc3MgYXBwZWFycyBvbiBzb21lIHNlcnZlci1nZW5lcmF0ZWQgcGFnZXMsIHN1Y2gKLSMgYXMgZXJyb3IgZG9jdW1lbnRzLgotIwotU2VydmVyQWRtaW4geW91QHlvdXIuYWRkcmVzcwotCi0jCi0jIFNlcnZlck5hbWUgYWxsb3dzIHlvdSB0byBzZXQgYSBob3N0IG5hbWUgd2hpY2ggaXMgc2VudCBiYWNrIHRvIGNsaWVudHMgZm9yCi0jIHlvdXIgc2VydmVyIGlmIGl0J3MgZGlmZmVyZW50IHRoYW4gdGhlIG9uZSB0aGUgcHJvZ3JhbSB3b3VsZCBnZXQgKGkuZS4sIHVzZQotIyAid3d3IiBpbnN0ZWFkIG9mIHRoZSBob3N0J3MgcmVhbCBuYW1lKS4KLSMKLSMgTm90ZTogWW91IGNhbm5vdCBqdXN0IGludmVudCBob3N0IG5hbWVzIGFuZCBob3BlIHRoZXkgd29yay4gVGhlIG5hbWUgeW91IAotIyBkZWZpbmUgaGVyZSBtdXN0IGJlIGEgdmFsaWQgRE5TIG5hbWUgZm9yIHlvdXIgaG9zdC4gSWYgeW91IGRvbid0IHVuZGVyc3RhbmQKLSMgdGhpcywgYXNrIHlvdXIgbmV0d29yayBhZG1pbmlzdHJhdG9yLgotIyBJZiB5b3VyIGhvc3QgZG9lc24ndCBoYXZlIGEgcmVnaXN0ZXJlZCBETlMgbmFtZSwgZW50ZXIgaXRzIElQIGFkZHJlc3MgaGVyZS4KLSMgWW91IHdpbGwgaGF2ZSB0byBhY2Nlc3MgaXQgYnkgaXRzIGFkZHJlc3MgKGUuZy4sIGh0dHA6Ly8xMjMuNDUuNjcuODkvKQotIyBhbnl3YXksIGFuZCB0aGlzIHdpbGwgbWFrZSByZWRpcmVjdGlvbnMgd29yayBpbiBhIHNlbnNpYmxlIHdheS4KLSMKLSNTZXJ2ZXJOYW1lIG5ldy5ob3N0Lm5hbWUKLQotIwotIyBEb2N1bWVudFJvb3Q6IFRoZSBkaXJlY3Rvcnkgb3V0IG9mIHdoaWNoIHlvdSB3aWxsIHNlcnZlIHlvdXIKLSMgZG9jdW1lbnRzLiBCeSBkZWZhdWx0LCBhbGwgcmVxdWVzdHMgYXJlIHRha2VuIGZyb20gdGhpcyBkaXJlY3RvcnksIGJ1dAotIyBzeW1ib2xpYyBsaW5rcyBhbmQgYWxpYXNlcyBtYXkgYmUgdXNlZCB0byBwb2ludCB0byBvdGhlciBsb2NhdGlvbnMuCi0jCi1Eb2N1bWVudFJvb3QgIkBAU2VydmVyUm9vdEBAL2h0ZG9jcyIKLQotIwotIyBFYWNoIGRpcmVjdG9yeSB0byB3aGljaCBBcGFjaGUgaGFzIGFjY2VzcywgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCByZXNwZWN0Ci0jIHRvIHdoaWNoIHNlcnZpY2VzIGFuZCBmZWF0dXJlcyBhcmUgYWxsb3dlZCBhbmQvb3IgZGlzYWJsZWQgaW4gdGhhdAotIyBkaXJlY3RvcnkgKGFuZCBpdHMgc3ViZGlyZWN0b3JpZXMpLiAKLSMKLSMgRmlyc3QsIHdlIGNvbmZpZ3VyZSB0aGUgImRlZmF1bHQiIHRvIGJlIGEgdmVyeSByZXN0cmljdGl2ZSBzZXQgb2YgCi0jIHBlcm1pc3Npb25zLiAgCi0jCi08RGlyZWN0b3J5IC8+Ci0gICAgT3B0aW9ucyBGb2xsb3dTeW1MaW5rcwotICAgIEFsbG93T3ZlcnJpZGUgTm9uZQotPC9EaXJlY3Rvcnk+Ci0KLSMKLSMgTm90ZSB0aGF0IGZyb20gdGhpcyBwb2ludCBmb3J3YXJkIHlvdSBtdXN0IHNwZWNpZmljYWxseSBhbGxvdwotIyBwYXJ0aWN1bGFyIGZlYXR1cmVzIHRvIGJlIGVuYWJsZWQgLSBzbyBpZiBzb21ldGhpbmcncyBub3Qgd29ya2luZyBhcwotIyB5b3UgbWlnaHQgZXhwZWN0LCBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSBzcGVjaWZpY2FsbHkgZW5hYmxlZCBpdAotIyBiZWxvdy4KLSMKLQotIwotIyBUaGlzIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHdoYXRldmVyIHlvdSBzZXQgRG9jdW1lbnRSb290IHRvLgotIwotPERpcmVjdG9yeSAiQEBTZXJ2ZXJSb290QEAvaHRkb2NzIj4KLQotIwotIyBUaGlzIG1heSBhbHNvIGJlICJOb25lIiwgIkFsbCIsIG9yIGFueSBjb21iaW5hdGlvbiBvZiAiSW5kZXhlcyIsCi0jICJJbmNsdWRlcyIsICJGb2xsb3dTeW1MaW5rcyIsICJFeGVjQ0dJIiwgb3IgIk11bHRpVmlld3MiLgotIwotIyBOb3RlIHRoYXQgIk11bHRpVmlld3MiIG11c3QgYmUgbmFtZWQgKmV4cGxpY2l0bHkqIC0tLSAiT3B0aW9ucyBBbGwiCi0jIGRvZXNuJ3QgZ2l2ZSBpdCB0byB5b3UuCi0jCi0gICAgT3B0aW9ucyBJbmRleGVzIEZvbGxvd1N5bUxpbmtzCi0KLSMKLSMgVGhpcyBjb250cm9scyB3aGljaCBvcHRpb25zIHRoZSAuaHRhY2Nlc3MgZmlsZXMgaW4gZGlyZWN0b3JpZXMgY2FuCi0jIG92ZXJyaWRlLiBDYW4gYWxzbyBiZSAiQWxsIiwgb3IgYW55IGNvbWJpbmF0aW9uIG9mICJPcHRpb25zIiwgIkZpbGVJbmZvIiwgCi0jICJBdXRoQ29uZmlnIiwgYW5kICJMaW1pdCIKLSMKLSAgICBBbGxvd092ZXJyaWRlIE5vbmUKLQotIwotIyBDb250cm9scyB3aG8gY2FuIGdldCBzdHVmZiBmcm9tIHRoaXMgc2VydmVyLgotIwotICAgIE9yZGVyIGFsbG93LGRlbnkKLSAgICBBbGxvdyBmcm9tIGFsbAotPC9EaXJlY3Rvcnk+Ci0KLSMKLSMgVXNlckRpcjogVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB3aGljaCBpcyBhcHBlbmRlZCBvbnRvIGEgdXNlcidzIGhvbWUKLSMgZGlyZWN0b3J5IGlmIGEgfnVzZXIgcmVxdWVzdCBpcyByZWNlaXZlZC4KLSMKLSMgVW5kZXIgV2luMzIsIHdlIGRvIG5vdCBjdXJyZW50bHkgdHJ5IHRvIGRldGVybWluZSB0aGUgaG9tZSBkaXJlY3Rvcnkgb2YKLSMgYSBXaW5kb3dzIGxvZ2luLCBzbyBhIGZvcm1hdCBzdWNoIGFzIHRoYXQgYmVsb3cgbmVlZHMgdG8gYmUgdXNlZC4gIFNlZQotIyB0aGUgVXNlckRpciBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgotIwotVXNlckRpciAiQEBTZXJ2ZXJSb290QEAvdXNlcnMvIgotCi0jCi0jIERpcmVjdG9yeUluZGV4OiBOYW1lIG9mIHRoZSBmaWxlIG9yIGZpbGVzIHRvIHVzZSBhcyBhIHByZS13cml0dGVuIEhUTUwKLSMgZGlyZWN0b3J5IGluZGV4LiAgU2VwYXJhdGUgbXVsdGlwbGUgZW50cmllcyB3aXRoIHNwYWNlcy4KLSMKLURpcmVjdG9yeUluZGV4IGluZGV4Lmh0bWwKLQotIwotIyBBY2Nlc3NGaWxlTmFtZTogVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gbG9vayBmb3IgaW4gZWFjaCBkaXJlY3RvcnkKLSMgZm9yIGFjY2VzcyBjb250cm9sIGluZm9ybWF0aW9uLgotIwotQWNjZXNzRmlsZU5hbWUgLmh0YWNjZXNzCi0KLSMKLSMgVGhlIGZvbGxvd2luZyBsaW5lcyBwcmV2ZW50IC5odGFjY2VzcyBmaWxlcyBmcm9tIGJlaW5nIHZpZXdlZCBieQotIyBXZWIgY2xpZW50cy4gIFNpbmNlIC5odGFjY2VzcyBmaWxlcyBvZnRlbiBjb250YWluIGF1dGhvcml6YXRpb24KLSMgaW5mb3JtYXRpb24sIGFjY2VzcyBpcyBkaXNhbGxvd2VkIGZvciBzZWN1cml0eSByZWFzb25zLiAgQ29tbWVudAotIyB0aGVzZSBsaW5lcyBvdXQgaWYgeW91IHdhbnQgV2ViIHZpc2l0b3JzIHRvIHNlZSB0aGUgY29udGVudHMgb2YKLSMgLmh0YWNjZXNzIGZpbGVzLiAgSWYgeW91IGNoYW5nZSB0aGUgQWNjZXNzRmlsZU5hbWUgZGlyZWN0aXZlIGFib3ZlLAotIyBiZSBzdXJlIHRvIG1ha2UgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbmdlcyBoZXJlLgotIwotPEZpbGVzIC5odGFjY2Vzcz4KLSAgICBPcmRlciBhbGxvdyxkZW55Ci0gICAgRGVueSBmcm9tIGFsbAotPC9GaWxlcz4KLQotIwotIyBDYWNoZU5lZ290aWF0ZWREb2NzOiBCeSBkZWZhdWx0LCBBcGFjaGUgc2VuZHMgIlByYWdtYTogbm8tY2FjaGUiIHdpdGggZWFjaAotIyBkb2N1bWVudCB0aGF0IHdhcyBuZWdvdGlhdGVkIG9uIHRoZSBiYXNpcyBvZiBjb250ZW50LiBUaGlzIGFza3MgcHJveHkKLSMgc2VydmVycyBub3QgdG8gY2FjaGUgdGhlIGRvY3VtZW50LiBVbmNvbW1lbnRpbmcgdGhlIGZvbGxvd2luZyBsaW5lIGRpc2FibGVzCi0jIHRoaXMgYmVoYXZpb3IsIGFuZCBwcm94aWVzIHdpbGwgYmUgYWxsb3dlZCB0byBjYWNoZSB0aGUgZG9jdW1lbnRzLgotIwotI0NhY2hlTmVnb3RpYXRlZERvY3MKLQotIwotIyBVc2VDYW5vbmljYWxOYW1lOiAgKG5ldyBmb3IgMS4zKSAgV2l0aCB0aGlzIHNldHRpbmcgdHVybmVkIG9uLCB3aGVuZXZlcgotIyBBcGFjaGUgbmVlZHMgdG8gY29uc3RydWN0IGEgc2VsZi1yZWZlcmVuY2luZyBVUkwgKGEgVVJMIHRoYXQgcmVmZXJzIGJhY2sKLSMgdG8gdGhlIHNlcnZlciB0aGUgcmVzcG9uc2UgaXMgY29taW5nIGZyb20pIGl0IHdpbGwgdXNlIFNlcnZlck5hbWUgYW5kCi0jIFBvcnQgdG8gZm9ybSBhICJjYW5vbmljYWwiIG5hbWUuICBXaXRoIHRoaXMgc2V0dGluZyBvZmYsIEFwYWNoZSB3aWxsCi0jIHVzZSB0aGUgaG9zdG5hbWU6cG9ydCB0aGF0IHRoZSBjbGllbnQgc3VwcGxpZWQsIHdoZW4gcG9zc2libGUuICBUaGlzCi0jIGFsc28gYWZmZWN0cyBTRVJWRVJfTkFNRSBhbmQgU0VSVkVSX1BPUlQgaW4gQ0dJIHNjcmlwdHMuCi0jCi1Vc2VDYW5vbmljYWxOYW1lIE9uCi0KLSMKLSMgVHlwZXNDb25maWcgZGVzY3JpYmVzIHdoZXJlIHRoZSBtaW1lLnR5cGVzIGZpbGUgKG9yIGVxdWl2YWxlbnQpIGlzCi0jIHRvIGJlIGZvdW5kLgotIwotVHlwZXNDb25maWcgY29uZi9taW1lLnR5cGVzCi0KLSMKLSMgRGVmYXVsdFR5cGUgaXMgdGhlIGRlZmF1bHQgTUlNRSB0eXBlIHRoZSBzZXJ2ZXIgd2lsbCB1c2UgZm9yIGEgZG9jdW1lbnQKLSMgaWYgaXQgY2Fubm90IG90aGVyd2lzZSBkZXRlcm1pbmUgb25lLCBzdWNoIGFzIGZyb20gZmlsZW5hbWUgZXh0ZW5zaW9ucy4KLSMgSWYgeW91ciBzZXJ2ZXIgY29udGFpbnMgbW9zdGx5IHRleHQgb3IgSFRNTCBkb2N1bWVudHMsICJ0ZXh0L3BsYWluIiBpcwotIyBhIGdvb2QgdmFsdWUuICBJZiBtb3N0IG9mIHlvdXIgY29udGVudCBpcyBiaW5hcnksIHN1Y2ggYXMgYXBwbGljYXRpb25zCi0jIG9yIGltYWdlcywgeW91IG1heSB3YW50IHRvIHVzZSAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiBpbnN0ZWFkIHRvCi0jIGtlZXAgYnJvd3NlcnMgZnJvbSB0cnlpbmcgdG8gZGlzcGxheSBiaW5hcnkgZmlsZXMgYXMgdGhvdWdoIHRoZXkgYXJlCi0jIHRleHQuCi0jCi1EZWZhdWx0VHlwZSB0ZXh0L3BsYWluCi0KLSMKLSMgVGhlIG1vZF9taW1lX21hZ2ljIG1vZHVsZSBhbGxvd3MgdGhlIHNlcnZlciB0byB1c2UgdmFyaW91cyBoaW50cyBmcm9tIHRoZQotIyBjb250ZW50cyBvZiB0aGUgZmlsZSBpdHNlbGYgdG8gZGV0ZXJtaW5lIGl0cyB0eXBlLiAgVGhlIE1JTUVNYWdpY0ZpbGUKLSMgZGlyZWN0aXZlIHRlbGxzIHRoZSBtb2R1bGUgd2hlcmUgdGhlIGhpbnQgZGVmaW5pdGlvbnMgYXJlIGxvY2F0ZWQuCi0jIG1vZF9taW1lX21hZ2ljIGlzIG5vdCBwYXJ0IG9mIHRoZSBkZWZhdWx0IHNlcnZlciAoeW91IGhhdmUgdG8gYWRkCi0jIGl0IHlvdXJzZWxmIHdpdGggYSBMb2FkTW9kdWxlIFtzZWUgdGhlIERTTyBwYXJhZ3JhcGggaW4gdGhlICdHbG9iYWwKLSMgRW52aXJvbm1lbnQnIHNlY3Rpb25dLCBvciByZWNvbXBpbGUgdGhlIHNlcnZlciBhbmQgaW5jbHVkZSBtb2RfbWltZV9tYWdpYwotIyBhcyBwYXJ0IG9mIHRoZSBjb25maWd1cmF0aW9uKSwgc28gaXQncyBlbmNsb3NlZCBpbiBhbiA8SWZNb2R1bGU+IGNvbnRhaW5lci4KLSMgVGhpcyBtZWFucyB0aGF0IHRoZSBNSU1FTWFnaWNGaWxlIGRpcmVjdGl2ZSB3aWxsIG9ubHkgYmUgcHJvY2Vzc2VkIGlmIHRoZQotIyBtb2R1bGUgaXMgcGFydCBvZiB0aGUgc2VydmVyLgotIwotPElmTW9kdWxlIG1vZF9taW1lX21hZ2ljLmM+Ci0gICAgTUlNRU1hZ2ljRmlsZSBjb25mL21hZ2ljCi08L0lmTW9kdWxlPgotCi0jCi0jIEhvc3RuYW1lTG9va3VwczogTG9nIHRoZSBuYW1lcyBvZiBjbGllbnRzIG9yIGp1c3QgdGhlaXIgSVAgYWRkcmVzc2VzCi0jIGUuZy4sIHd3dy5hcGFjaGUub3JnIChvbikgb3IgMjA0LjYyLjEyOS4xMzIgKG9mZikuCi0jIFRoZSBkZWZhdWx0IGlzIG9mZiBiZWNhdXNlIGl0J2QgYmUgb3ZlcmFsbCBiZXR0ZXIgZm9yIHRoZSBuZXQgaWYgcGVvcGxlCi0jIGhhZCB0byBrbm93aW5nbHkgdHVybiB0aGlzIGZlYXR1cmUgb24sIHNpbmNlIGVuYWJsaW5nIGl0IG1lYW5zIHRoYXQKLSMgZWFjaCBjbGllbnQgcmVxdWVzdCB3aWxsIHJlc3VsdCBpbiBBVCBMRUFTVCBvbmUgbG9va3VwIHJlcXVlc3QgdG8gdGhlCi0jIG5hbWVzZXJ2ZXIuCi0jCi1Ib3N0bmFtZUxvb2t1cHMgT2ZmCi0KLSMKLSMgRXJyb3JMb2c6IFRoZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IgbG9nIGZpbGUuCi0jIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhbiBFcnJvckxvZyBkaXJlY3RpdmUgd2l0aGluIGEgPFZpcnR1YWxIb3N0PgotIyBjb250YWluZXIsIGVycm9yIG1lc3NhZ2VzIHJlbGF0aW5nIHRvIHRoYXQgdmlydHVhbCBob3N0IHdpbGwgYmUKLSMgbG9nZ2VkIGhlcmUuICBJZiB5b3UgKmRvKiBkZWZpbmUgYW4gZXJyb3IgbG9nZmlsZSBmb3IgYSA8VmlydHVhbEhvc3Q+Ci0jIGNvbnRhaW5lciwgdGhhdCBob3N0J3MgZXJyb3JzIHdpbGwgYmUgbG9nZ2VkIHRoZXJlIGFuZCBub3QgaGVyZS4KLSMKLUVycm9yTG9nIGxvZ3MvZXJyb3IubG9nCi0KLSMKLSMgTG9nTGV2ZWw6IENvbnRyb2wgdGhlIG51bWJlciBvZiBtZXNzYWdlcyBsb2dnZWQgdG8gdGhlIGVycm9yLmxvZy4KLSMgUG9zc2libGUgdmFsdWVzIGluY2x1ZGU6IGRlYnVnLCBpbmZvLCBub3RpY2UsIHdhcm4sIGVycm9yLCBjcml0LAotIyBhbGVydCwgZW1lcmcuCi0jCi1Mb2dMZXZlbCB3YXJuCi0KLSMKLSMgVGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzIGRlZmluZSBzb21lIGZvcm1hdCBuaWNrbmFtZXMgZm9yIHVzZSB3aXRoCi0jIGEgQ3VzdG9tTG9nIGRpcmVjdGl2ZSAoc2VlIGJlbG93KS4KLSMKLUxvZ0Zvcm1hdCAiJWggJWwgJXUgJXQgXCIlclwiICU+cyAlYiBcIiV7UmVmZXJlcn1pXCIgXCIle1VzZXItQWdlbnR9aVwiIiBjb21iaW5lZAotTG9nRm9ybWF0ICIlaCAlbCAldSAldCBcIiVyXCIgJT5zICViIiBjb21tb24KLUxvZ0Zvcm1hdCAiJXtSZWZlcmVyfWkgLT4gJVUiIHJlZmVyZXIKLUxvZ0Zvcm1hdCAiJXtVc2VyLWFnZW50fWkiIGFnZW50Ci0KLSMKLSMgVGhlIGxvY2F0aW9uIGFuZCBmb3JtYXQgb2YgdGhlIGFjY2VzcyBsb2dmaWxlIChDb21tb24gTG9nZmlsZSBGb3JtYXQpLgotIyBJZiB5b3UgZG8gbm90IGRlZmluZSBhbnkgYWNjZXNzIGxvZ2ZpbGVzIHdpdGhpbiBhIDxWaXJ0dWFsSG9zdD4KLSMgY29udGFpbmVyLCB0aGV5IHdpbGwgYmUgbG9nZ2VkIGhlcmUuICBDb250cmFyaXdpc2UsIGlmIHlvdSAqZG8qCi0jIGRlZmluZSBwZXItPFZpcnR1YWxIb3N0PiBhY2Nlc3MgbG9nZmlsZXMsIHRyYW5zYWN0aW9ucyB3aWxsIGJlCi0jIGxvZ2dlZCB0aGVyZWluIGFuZCAqbm90KiBpbiB0aGlzIGZpbGUuCi0jCi1DdXN0b21Mb2cgbG9ncy9hY2Nlc3MubG9nIGNvbW1vbgotCi0jCi0jIElmIHlvdSB3b3VsZCBsaWtlIHRvIGhhdmUgYWdlbnQgYW5kIHJlZmVyZXIgbG9nZmlsZXMsIHVuY29tbWVudCB0aGUKLSMgZm9sbG93aW5nIGRpcmVjdGl2ZXMuCi0jCi0jQ3VzdG9tTG9nIGxvZ3MvcmVmZXJlci5sb2cgcmVmZXJlcgotI0N1c3RvbUxvZyBsb2dzL2FnZW50LmxvZyBhZ2VudAotCi0jCi0jIElmIHlvdSBwcmVmZXIgYSBzaW5nbGUgbG9nZmlsZSB3aXRoIGFjY2VzcywgYWdlbnQsIGFuZCByZWZlcmVyIGluZm9ybWF0aW9uCi0jIChDb21iaW5lZCBMb2dmaWxlIEZvcm1hdCkgeW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBkaXJlY3RpdmUuCi0jCi0jQ3VzdG9tTG9nIGxvZ3MvYWNjZXNzLmxvZyBjb21iaW5lZAotCi0jCi0jIE9wdGlvbmFsbHkgYWRkIGEgbGluZSBjb250YWluaW5nIHRoZSBzZXJ2ZXIgdmVyc2lvbiBhbmQgdmlydHVhbCBob3N0Ci0jIG5hbWUgdG8gc2VydmVyLWdlbmVyYXRlZCBwYWdlcyAoZXJyb3IgZG9jdW1lbnRzLCBGVFAgZGlyZWN0b3J5IGxpc3RpbmdzLAotIyBtb2Rfc3RhdHVzIGFuZCBtb2RfaW5mbyBvdXRwdXQgZXRjLiwgYnV0IG5vdCBDR0kgZ2VuZXJhdGVkIGRvY3VtZW50cykuCi0jIFNldCB0byAiRU1haWwiIHRvIGFsc28gaW5jbHVkZSBhIG1haWx0bzogbGluayB0byB0aGUgU2VydmVyQWRtaW4uCi0jIFNldCB0byBvbmUgb2Y6ICBPbiB8IE9mZiB8IEVNYWlsCi0jCi1TZXJ2ZXJTaWduYXR1cmUgT24KLQotIwotIyBBbGlhc2VzOiBBZGQgaGVyZSBhcyBtYW55IGFsaWFzZXMgYXMgeW91IG5lZWQgKHdpdGggbm8gbGltaXQpLiBUaGUgZm9ybWF0IGlzIAotIyBBbGlhcyBmYWtlbmFtZSByZWFsbmFtZQotIwotIyBOb3RlIHRoYXQgaWYgeW91IGluY2x1ZGUgYSB0cmFpbGluZyAvIG9uIGZha2VuYW1lIHRoZW4gdGhlIHNlcnZlciB3aWxsCi0jIHJlcXVpcmUgaXQgdG8gYmUgcHJlc2VudCBpbiB0aGUgVVJMLiAgU28gIi9pY29ucyIgaXNuJ3QgYWxpYXNlZCBpbiB0aGlzCi0jIGV4YW1wbGUsIG9ubHkgIi9pY29ucy8iLi4KLSMKLUFsaWFzIC9pY29ucy8gIkBAU2VydmVyUm9vdEBAL2ljb25zLyIKLQotIwotIyBTY3JpcHRBbGlhczogVGhpcyBjb250cm9scyB3aGljaCBkaXJlY3RvcmllcyBjb250YWluIHNlcnZlciBzY3JpcHRzLgotIyBTY3JpcHRBbGlhc2VzIGFyZSBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyBBbGlhc2VzLCBleGNlcHQgdGhhdAotIyBkb2N1bWVudHMgaW4gdGhlIHJlYWxuYW1lIGRpcmVjdG9yeSBhcmUgdHJlYXRlZCBhcyBhcHBsaWNhdGlvbnMgYW5kCi0jIHJ1biBieSB0aGUgc2VydmVyIHdoZW4gcmVxdWVzdGVkIHJhdGhlciB0aGFuIGFzIGRvY3VtZW50cyBzZW50IHRvIHRoZSBjbGllbnQuCi0jIFRoZSBzYW1lIHJ1bGVzIGFib3V0IHRyYWlsaW5nICIvIiBhcHBseSB0byBTY3JpcHRBbGlhcyBkaXJlY3RpdmVzIGFzIHRvCi0jIEFsaWFzLgotIwotU2NyaXB0QWxpYXMgL2NnaS1iaW4vICJAQFNlcnZlclJvb3RAQC9jZ2ktYmluLyIKLQotIwotIyAiQEBTZXJ2ZXJSb290QEAvY2dpLWJpbiIgc2hvdWxkIGJlIGNoYW5nZWQgdG8gd2hhdGV2ZXIgeW91ciBTY3JpcHRBbGlhc2VkCi0jIENHSSBkaXJlY3RvcnkgZXhpc3RzLCBpZiB5b3UgaGF2ZSB0aGF0IGNvbmZpZ3VyZWQuCi0jCi08RGlyZWN0b3J5ICJAQFNlcnZlclJvb3RAQC9jZ2ktYmluIj4KLSAgICBBbGxvd092ZXJyaWRlIE5vbmUKLSAgICBPcHRpb25zIE5vbmUKLTwvRGlyZWN0b3J5PgotCi0jCi0jIFJlZGlyZWN0IGFsbG93cyB5b3UgdG8gdGVsbCBjbGllbnRzIGFib3V0IGRvY3VtZW50cyB3aGljaCB1c2VkIHRvIGV4aXN0IGluCi0jIHlvdXIgc2VydmVyJ3MgbmFtZXNwYWNlLCBidXQgZG8gbm90IGFueW1vcmUuIFRoaXMgYWxsb3dzIHlvdSB0byB0ZWxsIHRoZQotIyBjbGllbnRzIHdoZXJlIHRvIGxvb2sgZm9yIHRoZSByZWxvY2F0ZWQgZG9jdW1lbnQuCi0jIEZvcm1hdDogUmVkaXJlY3Qgb2xkLVVSSSBuZXctVVJMCi0jCi0KLSMKLSMgRGlyZWN0aXZlcyBjb250cm9sbGluZyB0aGUgZGlzcGxheSBvZiBzZXJ2ZXItZ2VuZXJhdGVkIGRpcmVjdG9yeSBsaXN0aW5ncy4KLSMKLQotIwotIyBGYW5jeUluZGV4aW5nIGlzIHdoZXRoZXIgeW91IHdhbnQgZmFuY3kgZGlyZWN0b3J5IGluZGV4aW5nIG9yIHN0YW5kYXJkCi0jCi1JbmRleE9wdGlvbnMgRmFuY3lJbmRleGluZwotCi0jCi0jIEFkZEljb24qIGRpcmVjdGl2ZXMgdGVsbCB0aGUgc2VydmVyIHdoaWNoIGljb24gdG8gc2hvdyBmb3IgZGlmZmVyZW50Ci0jIGZpbGVzIG9yIGZpbGVuYW1lIGV4dGVuc2lvbnMuICBUaGVzZSBhcmUgb25seSBkaXNwbGF5ZWQgZm9yCi0jIEZhbmN5SW5kZXhlZCBkaXJlY3Rvcmllcy4KLSMKLUFkZEljb25CeUVuY29kaW5nIChDTVAsL2ljb25zL2NvbXByZXNzZWQuZ2lmKSB4LWNvbXByZXNzIHgtZ3ppcAotCi1BZGRJY29uQnlUeXBlIChUWFQsL2ljb25zL3RleHQuZ2lmKSB0ZXh0LyoKLUFkZEljb25CeVR5cGUgKElNRywvaWNvbnMvaW1hZ2UyLmdpZikgaW1hZ2UvKgotQWRkSWNvbkJ5VHlwZSAoU05ELC9pY29ucy9zb3VuZDIuZ2lmKSBhdWRpby8qCi1BZGRJY29uQnlUeXBlIChWSUQsL2ljb25zL21vdmllLmdpZikgdmlkZW8vKgotCi1BZGRJY29uIC9pY29ucy9iaW5hcnkuZ2lmIC5iaW4gLmV4ZQotQWRkSWNvbiAvaWNvbnMvYmluaGV4LmdpZiAuaHF4Ci1BZGRJY29uIC9pY29ucy90YXIuZ2lmIC50YXIKLUFkZEljb24gL2ljb25zL3dvcmxkMi5naWYgLndybCAud3JsLmd6IC52cm1sIC52cm0gLml2Ci1BZGRJY29uIC9pY29ucy9jb21wcmVzc2VkLmdpZiAuWiAueiAudGd6IC5neiAuemlwCi1BZGRJY29uIC9pY29ucy9hLmdpZiAucHMgLmFpIC5lcHMKLUFkZEljb24gL2ljb25zL2xheW91dC5naWYgLmh0bWwgLnNodG1sIC5odG0gLnBkZgotQWRkSWNvbiAvaWNvbnMvdGV4dC5naWYgLnR4dAotQWRkSWNvbiAvaWNvbnMvYy5naWYgLmMKLUFkZEljb24gL2ljb25zL3AuZ2lmIC5wbCAucHkKLUFkZEljb24gL2ljb25zL2YuZ2lmIC5mb3IKLUFkZEljb24gL2ljb25zL2R2aS5naWYgLmR2aQotQWRkSWNvbiAvaWNvbnMvdXVlbmNvZGVkLmdpZiAudXUKLUFkZEljb24gL2ljb25zL3NjcmlwdC5naWYgLmNvbmYgLnNoIC5zaGFyIC5jc2ggLmtzaCAudGNsCi1BZGRJY29uIC9pY29ucy90ZXguZ2lmIC50ZXgKLUFkZEljb24gL2ljb25zL2JvbWIuZ2lmIGNvcmUKLQotQWRkSWNvbiAvaWNvbnMvYmFjay5naWYgLi4KLUFkZEljb24gL2ljb25zL2hhbmQucmlnaHQuZ2lmIFJFQURNRQotQWRkSWNvbiAvaWNvbnMvZm9sZGVyLmdpZiBeXkRJUkVDVE9SWV5eCi1BZGRJY29uIC9pY29ucy9ibGFuay5naWYgXl5CTEFOS0lDT05eXgotCi0jCi0jIERlZmF1bHRJY29uIGlzIHdoaWNoIGljb24gdG8gc2hvdyBmb3IgZmlsZXMgd2hpY2ggZG8gbm90IGhhdmUgYW4gaWNvbgotIyBleHBsaWNpdGx5IHNldC4KLSMKLURlZmF1bHRJY29uIC9pY29ucy91bmtub3duLmdpZgotCi0jCi0jIEFkZERlc2NyaXB0aW9uIGFsbG93cyB5b3UgdG8gcGxhY2UgYSBzaG9ydCBkZXNjcmlwdGlvbiBhZnRlciBhIGZpbGUgaW4KLSMgc2VydmVyLWdlbmVyYXRlZCBpbmRleGVzLiAgVGhlc2UgYXJlIG9ubHkgZGlzcGxheWVkIGZvciBGYW5jeUluZGV4ZWQKLSMgZGlyZWN0b3JpZXMuCi0jIEZvcm1hdDogQWRkRGVzY3JpcHRpb24gImRlc2NyaXB0aW9uIiBmaWxlbmFtZQotIwotI0FkZERlc2NyaXB0aW9uICJHWklQIGNvbXByZXNzZWQgZG9jdW1lbnQiIC5negotI0FkZERlc2NyaXB0aW9uICJ0YXIgYXJjaGl2ZSIgLnRhcgotI0FkZERlc2NyaXB0aW9uICJHWklQIGNvbXByZXNzZWQgdGFyIGFyY2hpdmUiIC50Z3oKLQotIwotIyBSZWFkbWVOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBSRUFETUUgZmlsZSB0aGUgc2VydmVyIHdpbGwgbG9vayBmb3IgYnkKLSMgZGVmYXVsdCwgYW5kIGFwcGVuZCB0byBkaXJlY3RvcnkgbGlzdGluZ3MuCi0jCi0jIEhlYWRlck5hbWUgaXMgdGhlIG5hbWUgb2YgYSBmaWxlIHdoaWNoIHNob3VsZCBiZSBwcmVwZW5kZWQgdG8KLSMgZGlyZWN0b3J5IGluZGV4ZXMuIAotIwotIyBUaGUgc2VydmVyIHdpbGwgZmlyc3QgbG9vayBmb3IgbmFtZS5odG1sIGFuZCBpbmNsdWRlIGl0IGlmIGZvdW5kLgotIyBJZiBuYW1lLmh0bWwgZG9lc24ndCBleGlzdCwgdGhlIHNlcnZlciB3aWxsIHRoZW4gbG9vayBmb3IgbmFtZS50eHQKLSMgYW5kIGluY2x1ZGUgaXQgYXMgcGxhaW50ZXh0IGlmIGZvdW5kLgotIwotUmVhZG1lTmFtZSBSRUFETUUKLUhlYWRlck5hbWUgSEVBREVSCi0KLSMKLSMgSW5kZXhJZ25vcmUgaXMgYSBzZXQgb2YgZmlsZW5hbWVzIHdoaWNoIGRpcmVjdG9yeSBpbmRleGluZyBzaG91bGQgaWdub3JlCi0jIGFuZCBub3QgaW5jbHVkZSBpbiB0aGUgbGlzdGluZy4gIFNoZWxsLXN0eWxlIHdpbGRjYXJkaW5nIGlzIHBlcm1pdHRlZC4KLSMKLUluZGV4SWdub3JlIC4/PyogKn4gKiMgSEVBREVSKiBSRUFETUUqIFJDUyBDVlMgKix2ICosdAotCi0jCi0jIEFkZEVuY29kaW5nIGFsbG93cyB5b3UgdG8gaGF2ZSBjZXJ0YWluIGJyb3dzZXJzIChNb3NhaWMvWCAyLjErKSB1bmNvbXByZXNzCi0jIGluZm9ybWF0aW9uIG9uIHRoZSBmbHkuIE5vdGU6IE5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCB0aGlzLgotIyBEZXNwaXRlIHRoZSBuYW1lIHNpbWlsYXJpdHksIHRoZSBmb2xsb3dpbmcgQWRkKiBkaXJlY3RpdmVzIGhhdmUgbm90aGluZwotIyB0byBkbyB3aXRoIHRoZSBGYW5jeUluZGV4aW5nIGN1c3RvbWlzYXRpb24gZGlyZWN0aXZlcyBhYm92ZS4KLSMKLUFkZEVuY29kaW5nIHgtY29tcHJlc3MgWgotQWRkRW5jb2RpbmcgeC1nemlwIGd6IHRnegotCi0jCi0jIEFkZExhbmd1YWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgbGFuZ3VhZ2Ugb2YgYSBkb2N1bWVudC4gWW91IGNhbgotIyB0aGVuIHVzZSBjb250ZW50IG5lZ290aWF0aW9uIHRvIGdpdmUgYSBicm93c2VyIGEgZmlsZSBpbiBhIGxhbmd1YWdlCi0jIGl0IGNhbiB1bmRlcnN0YW5kLiAgTm90ZSB0aGF0IHRoZSBzdWZmaXggZG9lcyBub3QgaGF2ZSB0byBiZSB0aGUgc2FtZQotIyBhcyB0aGUgbGFuZ3VhZ2Uga2V5d29yZCAtLS0gdGhvc2Ugd2l0aCBkb2N1bWVudHMgaW4gUG9saXNoICh3aG9zZQotIyBuZXQtc3RhbmRhcmQgbGFuZ3VhZ2UgY29kZSBpcyBwbCkgbWF5IHdpc2ggdG8gdXNlICJBZGRMYW5ndWFnZSBwbCAucG8iIAotIyB0byBhdm9pZCB0aGUgYW1iaWd1aXR5IHdpdGggdGhlIGNvbW1vbiBzdWZmaXggZm9yIHBlcmwgc2NyaXB0cy4KLSMKLUFkZExhbmd1YWdlIGVuIC5lbgotQWRkTGFuZ3VhZ2UgZnIgLmZyCi1BZGRMYW5ndWFnZSBkZSAuZGUKLUFkZExhbmd1YWdlIGRhIC5kYQotQWRkTGFuZ3VhZ2UgZWwgLmVsCi1BZGRMYW5ndWFnZSBpdCAuaXQKLQotIwotIyBMYW5ndWFnZVByaW9yaXR5IGFsbG93cyB5b3UgdG8gZ2l2ZSBwcmVjZWRlbmNlIHRvIHNvbWUgbGFuZ3VhZ2VzCi0jIGluIGNhc2Ugb2YgYSB0aWUgZHVyaW5nIGNvbnRlbnQgbmVnb3RpYXRpb24uCi0jIEp1c3QgbGlzdCB0aGUgbGFuZ3VhZ2VzIGluIGRlY3JlYXNpbmcgb3JkZXIgb2YgcHJlZmVyZW5jZS4KLSMKLUxhbmd1YWdlUHJpb3JpdHkgZW4gZnIgZGUKLQotIwotIyBBZGRUeXBlIGFsbG93cyB5b3UgdG8gdHdlYWsgbWltZS50eXBlcyB3aXRob3V0IGFjdHVhbGx5IGVkaXRpbmcgaXQsIG9yIHRvCi0jIG1ha2UgY2VydGFpbiBmaWxlcyB0byBiZSBjZXJ0YWluIHR5cGVzLgotIwotIyBGb3IgZXhhbXBsZSwgdGhlIFBIUDMgbW9kdWxlIChub3QgcGFydCBvZiB0aGUgQXBhY2hlIGRpc3RyaWJ1dGlvbikKLSMgd2lsbCB0eXBpY2FsbHkgdXNlOgotIwotI0FkZFR5cGUgYXBwbGljYXRpb24veC1odHRwZC1waHAzIC5waHRtbAotI0FkZFR5cGUgYXBwbGljYXRpb24veC1odHRwZC1waHAzLXNvdXJjZSAucGhwcwotCi1BZGRUeXBlIGFwcGxpY2F0aW9uL3gtdGFyIC50Z3oKLQotIwotIyBBZGRIYW5kbGVyIGFsbG93cyB5b3UgdG8gbWFwIGNlcnRhaW4gZmlsZSBleHRlbnNpb25zIHRvICJoYW5kbGVycyIsCi0jIGFjdGlvbnMgdW5yZWxhdGVkIHRvIGZpbGV0eXBlLiBUaGVzZSBjYW4gYmUgZWl0aGVyIGJ1aWx0IGludG8gdGhlIHNlcnZlcgotIyBvciBhZGRlZCB3aXRoIHRoZSBBY3Rpb24gY29tbWFuZCAoc2VlIGJlbG93KQotIwotIyBJZiB5b3Ugd2FudCB0byB1c2Ugc2VydmVyIHNpZGUgaW5jbHVkZXMsIG9yIENHSSBvdXRzaWRlCi0jIFNjcmlwdEFsaWFzZWQgZGlyZWN0b3JpZXMsIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmVzLgotIwotIyBUbyB1c2UgQ0dJIHNjcmlwdHM6Ci0jCi0jQWRkSGFuZGxlciBjZ2ktc2NyaXB0IC5jZ2kKLQotIwotIyBUbyB1c2Ugc2VydmVyLXBhcnNlZCBIVE1MIGZpbGVzCi0jCi0jQWRkVHlwZSB0ZXh0L2h0bWwgLnNodG1sCi0jQWRkSGFuZGxlciBzZXJ2ZXItcGFyc2VkIC5zaHRtbAotCi0jCi0jIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gZW5hYmxlIEFwYWNoZSdzIHNlbmQtYXNpcyBIVFRQIGZpbGUKLSMgZmVhdHVyZQotIwotI0FkZEhhbmRsZXIgc2VuZC1hcy1pcyBhc2lzCi0KLSMKLSMgSWYgeW91IHdpc2ggdG8gdXNlIHNlcnZlci1wYXJzZWQgaW1hZ2VtYXAgZmlsZXMsIHVzZQotIwotI0FkZEhhbmRsZXIgaW1hcC1maWxlIG1hcAotCi0jCi0jIFRvIGVuYWJsZSB0eXBlIG1hcHMsIHlvdSBtaWdodCB3YW50IHRvIHVzZQotIwotI0FkZEhhbmRsZXIgdHlwZS1tYXAgdmFyCi0KLSMKLSMgQWN0aW9uIGxldHMgeW91IGRlZmluZSBtZWRpYSB0eXBlcyB0aGF0IHdpbGwgZXhlY3V0ZSBhIHNjcmlwdCB3aGVuZXZlcgotIyBhIG1hdGNoaW5nIGZpbGUgaXMgY2FsbGVkLiBUaGlzIGVsaW1pbmF0ZXMgdGhlIG5lZWQgZm9yIHJlcGVhdGVkIFVSTAotIyBwYXRobmFtZXMgZm9yIG9mdC11c2VkIENHSSBmaWxlIHByb2Nlc3NvcnMuCi0jIEZvcm1hdDogQWN0aW9uIG1lZGlhL3R5cGUgL2NnaS1zY3JpcHQvbG9jYXRpb24KLSMgRm9ybWF0OiBBY3Rpb24gaGFuZGxlci1uYW1lIC9jZ2ktc2NyaXB0L2xvY2F0aW9uCi0jCi0KLSMKLSMgTWV0YURpcjogc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggQXBhY2hlIGNhbiBmaW5kCi0jIG1ldGEgaW5mb3JtYXRpb24gZmlsZXMuIFRoZXNlIGZpbGVzIGNvbnRhaW4gYWRkaXRpb25hbCBIVFRQIGhlYWRlcnMKLSMgdG8gaW5jbHVkZSB3aGVuIHNlbmRpbmcgdGhlIGRvY3VtZW50Ci0jCi0jTWV0YURpciAud2ViCi0KLSMKLSMgTWV0YVN1ZmZpeDogc3BlY2lmaWVzIHRoZSBmaWxlIG5hbWUgc3VmZml4IGZvciB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotIyBtZXRhIGluZm9ybWF0aW9uLgotIwotI01ldGFTdWZmaXggLm1ldGEKLQotIwotIyBDdXN0b21pemFibGUgZXJyb3IgcmVzcG9uc2UgKEFwYWNoZSBzdHlsZSkKLSMgIHRoZXNlIGNvbWUgaW4gdGhyZWUgZmxhdm9ycwotIwotIyAgICAxKSBwbGFpbiB0ZXh0Ci0jRXJyb3JEb2N1bWVudCA1MDAgIlRoZSBzZXJ2ZXIgbWFkZSBhIGJvbyBib28uCi0jICBuLmIuICB0aGUgKCIpIG1hcmtzIGl0IGFzIHRleHQsIGl0IGRvZXMgbm90IGdldCBvdXRwdXQKLSMKLSMgICAgMikgbG9jYWwgcmVkaXJlY3RzCi0jRXJyb3JEb2N1bWVudCA0MDQgL21pc3NpbmcuaHRtbAotIyAgdG8gcmVkaXJlY3QgdG8gbG9jYWwgVVJMIC9taXNzaW5nLmh0bWwKLSNFcnJvckRvY3VtZW50IDQwNCAvY2dpLWJpbi9taXNzaW5nX2hhbmRsZXIucGwKLSMgIE4uQi46IFlvdSBjYW4gcmVkaXJlY3QgdG8gYSBzY3JpcHQgb3IgYSBkb2N1bWVudCB1c2luZyBzZXJ2ZXItc2lkZS1pbmNsdWRlcy4KLSMKLSMgICAgMykgZXh0ZXJuYWwgcmVkaXJlY3RzCi0jRXJyb3JEb2N1bWVudCA0MDIgaHR0cDovL3NvbWUub3RoZXJfc2VydmVyLmNvbS9zdWJzY3JpcHRpb25faW5mby5odG1sCi0jICBOLkIuOiBNYW55IG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hbAotIyAgcmVxdWVzdCB3aWxsICpub3QqIGJlIGF2YWlsYWJsZSB0byBzdWNoIGEgc2NyaXB0LgotCi0jCi0jIFRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlcyBkaXNhYmxlIGtlZXBhbGl2ZXMgYW5kIEhUVFAgaGVhZGVyIGZsdXNoZXMuCi0jIFRoZSBmaXJzdCBkaXJlY3RpdmUgZGlzYWJsZXMgaXQgZm9yIE5ldHNjYXBlIDIueCBhbmQgYnJvd3NlcnMgd2hpY2gKLSMgc3Bvb2YgaXQuIFRoZXJlIGFyZSBrbm93biBwcm9ibGVtcyB3aXRoIHRoZXNlLgotIyBUaGUgc2Vjb25kIGRpcmVjdGl2ZSBpcyBmb3IgTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIDQuMGIyCi0jIHdoaWNoIGhhcyBhIGJyb2tlbiBIVFRQLzEuMSBpbXBsZW1lbnRhdGlvbiBhbmQgZG9lcyBub3QgcHJvcGVybHkKLSMgc3VwcG9ydCBrZWVwYWxpdmUgd2hlbiBpdCBpcyB1c2VkIG9uIDMwMSBvciAzMDIgKHJlZGlyZWN0KSByZXNwb25zZXMuCi0jCi1Ccm93c2VyTWF0Y2ggIk1vemlsbGEvMiIgbm9rZWVwYWxpdmUKLUJyb3dzZXJNYXRjaCAiTVNJRSA0XC4wYjI7IiBub2tlZXBhbGl2ZSBkb3duZ3JhZGUtMS4wIGZvcmNlLXJlc3BvbnNlLTEuMAotCi0jCi0jIFRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlIGRpc2FibGVzIEhUVFAvMS4xIHJlc3BvbnNlcyB0byBicm93c2VycyB3aGljaAotIyBhcmUgaW4gdmlvbGF0aW9uIG9mIHRoZSBIVFRQLzEuMCBzcGVjIGJ5IG5vdCBiZWluZyBhYmxlIHRvIGdyb2sgYQotIyBiYXNpYyAxLjEgcmVzcG9uc2UuCi0jCi1Ccm93c2VyTWF0Y2ggIlJlYWxQbGF5ZXIgNFwuMCIgZm9yY2UtcmVzcG9uc2UtMS4wCi1Ccm93c2VyTWF0Y2ggIkphdmEvMVwuMCIgZm9yY2UtcmVzcG9uc2UtMS4wCi1Ccm93c2VyTWF0Y2ggIkpESy8xXC4wIiBmb3JjZS1yZXNwb25zZS0xLjAKLQotIwotIyBBbGxvdyBzZXJ2ZXIgc3RhdHVzIHJlcG9ydHMsIHdpdGggdGhlIFVSTCBvZiBodHRwOi8vc2VydmVybmFtZS9zZXJ2ZXItc3RhdHVzCi0jIENoYW5nZSB0aGUgIi55b3VyX2RvbWFpbi5jb20iIHRvIG1hdGNoIHlvdXIgZG9tYWluIHRvIGVuYWJsZS4KLSMKLSM8TG9jYXRpb24gL3NlcnZlci1zdGF0dXM+Ci0jICAgIFNldEhhbmRsZXIgc2VydmVyLXN0YXR1cwotIyAgICBPcmRlciBkZW55LGFsbG93Ci0jICAgIERlbnkgZnJvbSBhbGwKLSMgICAgQWxsb3cgZnJvbSAueW91cl9kb21haW4uY29tCi0jPC9Mb2NhdGlvbj4KLQotIwotIyBBbGxvdyByZW1vdGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gcmVwb3J0cywgd2l0aCB0aGUgVVJMIG9mCi0jICBodHRwOi8vc2VydmVybmFtZS9zZXJ2ZXItaW5mbyAocmVxdWlyZXMgdGhhdCBtb2RfaW5mby5jIGJlIGxvYWRlZCkuCi0jIENoYW5nZSB0aGUgIi55b3VyX2RvbWFpbi5jb20iIHRvIG1hdGNoIHlvdXIgZG9tYWluIHRvIGVuYWJsZS4KLSMKLSM8TG9jYXRpb24gL3NlcnZlci1pbmZvPgotIyAgICBTZXRIYW5kbGVyIHNlcnZlci1pbmZvCi0jICAgIE9yZGVyIGRlbnksYWxsb3cKLSMgICAgRGVueSBmcm9tIGFsbAotIyAgICBBbGxvdyBmcm9tIC55b3VyX2RvbWFpbi5jb20KLSM8L0xvY2F0aW9uPgotCi0jCi0jIFRoZXJlIGhhdmUgYmVlbiByZXBvcnRzIG9mIHBlb3BsZSB0cnlpbmcgdG8gYWJ1c2UgYW4gb2xkIGJ1ZyBmcm9tIHByZS0xLjEKLSMgZGF5cy4gIFRoaXMgYnVnIGludm9sdmVkIGEgQ0dJIHNjcmlwdCBkaXN0cmlidXRlZCBhcyBhIHBhcnQgb2YgQXBhY2hlLgotIyBCeSB1bmNvbW1lbnRpbmcgdGhlc2UgbGluZXMgeW91IGNhbiByZWRpcmVjdCB0aGVzZSBhdHRhY2tzIHRvIGEgbG9nZ2luZyAKLSMgc2NyaXB0IG9uIHBoZi5hcGFjaGUub3JnLiAgT3IsIHlvdSBjYW4gcmVjb3JkIHRoZW0geW91cnNlbGYsIHVzaW5nIHRoZSBzY3JpcHQKLSMgc3VwcG9ydC9waGZfYWJ1c2VfbG9nLmNnaS4KLSMKLSM8TG9jYXRpb24gL2NnaS1iaW4vcGhmKj4KLSMgICAgRGVueSBmcm9tIGFsbAotIyAgICBFcnJvckRvY3VtZW50IDQwMyBodHRwOi8vcGhmLmFwYWNoZS5vcmcvcGhmX2FidXNlX2xvZy5jZ2kKLSM8L0xvY2F0aW9uPgotCi0jCi0jIFByb3h5IFNlcnZlciBkaXJlY3RpdmVzLiBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIHRvCi0jIGVuYWJsZSB0aGUgcHJveHkgc2VydmVyOgotIwotI1Byb3h5UmVxdWVzdHMgT24KLQotIwotIyBFbmFibGUvZGlzYWJsZSB0aGUgaGFuZGxpbmcgb2YgSFRUUC8xLjEgIlZpYToiIGhlYWRlcnMuCi0jICgiRnVsbCIgYWRkcyB0aGUgc2VydmVyIHZlcnNpb247ICJCbG9jayIgcmVtb3ZlcyBhbGwgb3V0Z29pbmcgVmlhOiBoZWFkZXJzKQotIyBTZXQgdG8gb25lIG9mOiBPZmYgfCBPbiB8IEZ1bGwgfCBCbG9jawotIwotI1Byb3h5VmlhIE9uCi0KLSMKLSMgVG8gZW5hYmxlIHRoZSBjYWNoZSBhcyB3ZWxsLCBlZGl0IGFuZCB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lczoKLSMgKG5vIGNhY2hlaW5nIHdpdGhvdXQgQ2FjaGVSb290KQotIwotI0NhY2hlUm9vdCAiQEBTZXJ2ZXJSb290QEAvcHJveHkiCi0jQ2FjaGVTaXplIDUKLSNDYWNoZUdjSW50ZXJ2YWwgNAotI0NhY2hlTWF4RXhwaXJlIDI0Ci0jQ2FjaGVMYXN0TW9kaWZpZWRGYWN0b3IgMC4xCi0jQ2FjaGVEZWZhdWx0RXhwaXJlIDEKLSNOb0NhY2hlIGFfZG9tYWluLmNvbSBhbm90aGVyX2RvbWFpbi5lZHUgam9lcy5nYXJhZ2Vfc2FsZS5jb20KLQotIyMjIFNlY3Rpb24gMzogVmlydHVhbCBIb3N0cwotIwotIyBWaXJ0dWFsSG9zdDogSWYgeW91IHdhbnQgdG8gbWFpbnRhaW4gbXVsdGlwbGUgZG9tYWlucy9ob3N0bmFtZXMgb24geW91cgotIyBtYWNoaW5lIHlvdSBjYW4gc2V0dXAgVmlydHVhbEhvc3QgY29udGFpbmVycyBmb3IgdGhlbS4KLSMgUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBhdCA8VVJMOmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL3Zob3N0cy8+Ci0jIGZvciBmdXJ0aGVyIGRldGFpbHMgYmVmb3JlIHlvdSB0cnkgdG8gc2V0dXAgdmlydHVhbCBob3N0cy4KLSMgWW91IG1heSB1c2UgdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gJy1TJyB0byB2ZXJpZnkgeW91ciB2aXJ0dWFsIGhvc3QKLSMgY29uZmlndXJhdGlvbi4KLQotIwotIyBJZiB5b3Ugd2FudCB0byB1c2UgbmFtZS1iYXNlZCB2aXJ0dWFsIGhvc3RzIHlvdSBuZWVkIHRvIGRlZmluZSBhdAotIyBsZWFzdCBvbmUgSVAgYWRkcmVzcyAoYW5kIHBvcnQgbnVtYmVyKSBmb3IgdGhlbS4KLSMKLSNOYW1lVmlydHVhbEhvc3QgMTIuMzQuNTYuNzg6ODAKLSNOYW1lVmlydHVhbEhvc3QgMTIuMzQuNTYuNzgKLQotIwotIyBWaXJ0dWFsSG9zdCBleGFtcGxlOgotIyBBbG1vc3QgYW55IEFwYWNoZSBkaXJlY3RpdmUgbWF5IGdvIGludG8gYSBWaXJ0dWFsSG9zdCBjb250YWluZXIuCi0jCi0jPFZpcnR1YWxIb3N0IGlwLmFkZHJlc3Mub2YuaG9zdC5zb21lX2RvbWFpbi5jb20+Ci0jICAgIFNlcnZlckFkbWluIHdlYm1hc3RlckBob3N0LnNvbWVfZG9tYWluLmNvbQotIyAgICBEb2N1bWVudFJvb3QgL3d3dy9kb2NzL2hvc3Quc29tZV9kb21haW4uY29tCi0jICAgIFNlcnZlck5hbWUgaG9zdC5zb21lX2RvbWFpbi5jb20KLSMgICAgRXJyb3JMb2cgbG9ncy9ob3N0LnNvbWVfZG9tYWluLmNvbS1lcnJvcl9sb2cKLSMgICAgQ3VzdG9tTG9nIGxvZ3MvaG9zdC5zb21lX2RvbWFpbi5jb20tYWNjZXNzX2xvZyBjb21tb24KLSM8L1ZpcnR1YWxIb3N0PgotCi0jPFZpcnR1YWxIb3N0IF9kZWZhdWx0XzoqPgotIzwvVmlydHVhbEhvc3Q+CmRpZmYgLS1naXQgYS9kb2NzL2NvbmYvbWFnaWMgYi9kb2NzL2NvbmYvbWFnaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NWI3OTMuLjAwMDAwMDAKLS0tIGEvZG9jcy9jb25mL21hZ2ljCisrKyAvZGV2L251bGwKQEAgLTEsMzcxICswLDAgQEAKLSMgTWFnaWMgZGF0YSBmb3IgbW9kX21pbWVfbWFnaWMgQXBhY2hlIG1vZHVsZSAob3JpZ2luYWxseSBmb3IgZmlsZSgxKSBjb21tYW5kKQotIyBUaGUgbW9kdWxlIGlzIGRlc2NyaWJlZCBpbiBodGRvY3MvbWFudWFsL21vZC9tb2RfbWltZV9tYWdpYy5odG1sCi0jCi0jIFRoZSBmb3JtYXQgaXMgNC01IGNvbHVtbnM6Ci0jICAgIENvbHVtbiAjMTogYnl0ZSBudW1iZXIgdG8gYmVnaW4gY2hlY2tpbmcgZnJvbSwgIj4iIGluZGljYXRlcyBjb250aW51YXRpb24KLSMgICAgQ29sdW1uICMyOiB0eXBlIG9mIGRhdGEgdG8gbWF0Y2gKLSMgICAgQ29sdW1uICMzOiBjb250ZW50cyBvZiBkYXRhIHRvIG1hdGNoCi0jICAgIENvbHVtbiAjNDogTUlNRSB0eXBlIG9mIHJlc3VsdAotIyAgICBDb2x1bW4gIzU6IE1JTUUgZW5jb2Rpbmcgb2YgcmVzdWx0IChvcHRpb25hbCkKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBMb2NhbHN0dWZmOiAgZmlsZSgxKSBtYWdpYyBmb3IgbG9jYWxseSBvYnNlcnZlZCBmaWxlcwotIyBBZGQgYW55IGxvY2FsbHkgb2JzZXJ2ZWQgZmlsZXMgaGVyZS4KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBlbmQgbG9jYWwgc3R1ZmYKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBKYXZhCi0KLTAJc2hvcnQJCTB4Y2FmZQotPjIJc2hvcnQJCTB4YmFiZQkJYXBwbGljYXRpb24vamF2YQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGF1ZGlvOiAgZmlsZSgxKSBtYWdpYyBmb3Igc291bmQgZm9ybWF0cwotIwotIyBmcm9tIEphbiBOaWNvbGFpIExhbmdmZWxkdCA8amFubEBpZmkudWlvLm5vPiwKLSMKLQotIyBTdW4vTmVYVCBhdWRpbyBkYXRhCi0wCXN0cmluZwkJLnNuZAotPjEyCWJlbG9uZwkJMQkJYXVkaW8vYmFzaWMKLT4xMgliZWxvbmcJCTIJCWF1ZGlvL2Jhc2ljCi0+MTIJYmVsb25nCQkzCQlhdWRpby9iYXNpYwotPjEyCWJlbG9uZwkJNAkJYXVkaW8vYmFzaWMKLT4xMgliZWxvbmcJCTUJCWF1ZGlvL2Jhc2ljCi0+MTIJYmVsb25nCQk2CQlhdWRpby9iYXNpYwotPjEyCWJlbG9uZwkJNwkJYXVkaW8vYmFzaWMKLQotPjEyCWJlbG9uZwkJMjMJCWF1ZGlvL3gtYWRwY20KLQotIyBERUMgc3lzdGVtcyAoZS5nLiBERUNzdGF0aW9uIDUwMDApIHVzZSBhIHZhcmlhbnQgb2YgdGhlIFN1bi9OZVhUIGZvcm1hdAotIyB0aGF0IHVzZXMgbGl0dGxlLWVuZGlhbiBlbmNvZGluZyBhbmQgaGFzIGEgZGlmZmVyZW50IG1hZ2ljIG51bWJlcgotIyAoMHgwMDY0NzMyRSBpbiBsaXR0bGUtZW5kaWFuIGVuY29kaW5nKS4KLTAJbGVsb25nCQkweDAwNjQ3MzJFCQotPjEyCWxlbG9uZwkJMQkJYXVkaW8veC1kZWMtYmFzaWMKLT4xMglsZWxvbmcJCTIJCWF1ZGlvL3gtZGVjLWJhc2ljCi0+MTIJbGVsb25nCQkzCQlhdWRpby94LWRlYy1iYXNpYwotPjEyCWxlbG9uZwkJNAkJYXVkaW8veC1kZWMtYmFzaWMKLT4xMglsZWxvbmcJCTUJCWF1ZGlvL3gtZGVjLWJhc2ljCi0+MTIJbGVsb25nCQk2CQlhdWRpby94LWRlYy1iYXNpYwotPjEyCWxlbG9uZwkJNwkJYXVkaW8veC1kZWMtYmFzaWMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkIChHLjcyMSBBRFBDTSkKLT4xMglsZWxvbmcJCTIzCQlhdWRpby94LWRlYy1hZHBjbQotCi0jIEJ5dGVzIDAtMyBvZiBBSUZGLCBBSUZGLUMsICYgOFNWWCBhdWRpbyBmaWxlcyBhcmUgIkZPUk0iCi0jCQkJCQlBSUZGIGF1ZGlvIGRhdGEKLTgJc3RyaW5nCQlBSUZGCQlhdWRpby94LWFpZmYJCi0jCQkJCQlBSUZGLUMgYXVkaW8gZGF0YQotOAlzdHJpbmcJCUFJRkMJCWF1ZGlvL3gtYWlmZgkKLSMJCQkJCUlGRi84U1ZYIGF1ZGlvIGRhdGEKLTgJc3RyaW5nCQk4U1ZYCQlhdWRpby94LWFpZmYJCi0KLSMgQ3JlYXRpdmUgTGFicyBBVURJTyBzdHVmZgotIwkJCQkJU3RhbmRhcmQgTUlESSBkYXRhCi0wCXN0cmluZwlNVGhkCQkJYXVkaW8vdW5rbm93bgkKLSM+OSAJYnl0ZQk+MAkJCShmb3JtYXQgJWQpCi0jPjExCWJ5dGUJPjEJCQl1c2luZyAlZCBjaGFubmVscwotIwkJCQkJQ3JlYXRpdmUgTXVzaWMgKENNRikgZGF0YQotMAlzdHJpbmcJQ1RNRgkJCWF1ZGlvL3Vua25vd24JCi0jCQkJCQlTb3VuZEJsYXN0ZXIgaW5zdHJ1bWVudCBkYXRhCi0wCXN0cmluZwlTQkkJCQlhdWRpby91bmtub3duCQotIwkJCQkJQ3JlYXRpdmUgTGFicyB2b2ljZSBkYXRhCi0wCXN0cmluZwlDcmVhdGl2ZVwgVm9pY2VcIEZpbGUJYXVkaW8vdW5rbm93bgkKLSMjIGlzIHRoaXMgbmV4dCBsaW5lIHJpZ2h0PyAgaXQgY2FtZSB0aGlzIHdheS4uLgotIz4xOQlieXRlCTB4MUEKLSM+MjMJYnl0ZQk+MAkJCS0gdmVyc2lvbiAlZAotIz4yMglieXRlCT4wCQkJXGIuJWQKLQotIyBbR1JSIDk1MDExNTogIGlzIHRoaXMgYWxzbyBDcmVhdGl2ZSBMYWJzPyAgR3Vlc3NpbmcgdGhhdCBmaXJzdCBsaW5lCi0jICBzaG91bGQgYmUgc3RyaW5nIGluc3RlYWQgb2YgdW5rbm93bi1lbmRpYW4gbG9uZy4uLl0KLSMwCWxvbmcJCTB4NGU1NDUyNGIJTXVsdGlUcmFjayBzb3VuZCBkYXRhCi0jMAlzdHJpbmcJCU5UUksJCU11bHRpVHJhY2sgc291bmQgZGF0YQotIz40CWxvbmcJCXgJCS0gdmVyc2lvbiAlbGQKLQotIyBNaWNyb3NvZnQgV0FWRSBmb3JtYXQgKCoud2F2KQotIyBbR1JSIDk1MDExNTogIHByb2JhYmx5IGFsbCBvZiB0aGUgc2hvcnRzIGFuZCBsb25ncyBzaG91bGQgYmUgbGVzaG9ydC9sZWxvbmddCi0jCQkJCQlNaWNyb3NvZnQgUklGRgotMAlzdHJpbmcJCVJJRkYJCWF1ZGlvL3Vua25vd24JCi0jCQkJCQktIFdBVkUgZm9ybWF0Ci0+OAlzdHJpbmcJCVdBVkUJCWF1ZGlvL3gtd2F2CQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGMtbGFuZzogIGZpbGUoMSkgbWFnaWMgZm9yIEMgcHJvZ3JhbXMgb3IgdmFyaW91cyBzY3JpcHRzCi0jCi0KLSMgWFBNIGljb25zIChHcmVnIFJvZWxvZnMsIG5ld3RAdWNoaWNhZ28uZWR1KQotIyBpZGVhbGx5IHNob3VsZCBnbyBpbnRvICJpbWFnZXMiLCBidXQgZW50cmllcyBiZWxvdyB3b3VsZCB0YWcgWFBNIGFzIEMgc291cmNlCi0wCXN0cmluZwkJLypcIFhQTQkJaW1hZ2UveC14Ym0JN2JpdAotCi0jIHRoaXMgZmlyc3Qgd2lsbCB1cHNldCB5b3UgaWYgeW91J3JlIGEgUEwvMSBzaG9wLi4uIChhcmUgdGhlcmUgYW55IGxlZnQ/KQotIyBpbiB3aGljaCBjYXNlIHJtIGl0OyBhc2NtYWdpYyB3aWxsIGNhdGNoIHJlYWwgQyBwcm9ncmFtcwotIwkJCQkJQyBvciBSRVhYIHByb2dyYW0gdGV4dAotMAlzdHJpbmcJCS8qCQl0ZXh0L3BsYWluCi0jCQkJCQlDKysgcHJvZ3JhbSB0ZXh0Ci0wCXN0cmluZwkJLy8JCXRleHQvcGxhaW4KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBjb21wcmVzczogIGZpbGUoMSkgbWFnaWMgZm9yIHB1cmUtY29tcHJlc3Npb24gZm9ybWF0cyAobm8gYXJjaGl2ZXMpCi0jCi0jIGNvbXByZXNzLCBnemlwLCBwYWNrLCBjb21wYWN0LCBodWYsIHNxdWVlemUsIGNydW5jaCwgZnJlZXplLCB5YWJiYSwgd2hhcCwgZXRjLgotIwotIyBGb3JtYXRzIGZvciB2YXJpb3VzIGZvcm1zIG9mIGNvbXByZXNzZWQgZGF0YQotIyBGb3JtYXRzIGZvciAiY29tcHJlc3MiIHByb3BlciBoYXZlIGJlZW4gbW92ZWQgaW50byAiY29tcHJlc3MuYyIsCi0jIGJlY2F1c2UgaXQgdHJpZXMgdG8gdW5jb21wcmVzcyBpdCB0byBmaWd1cmUgb3V0IHdoYXQncyBpbnNpZGUuCi0KLSMgc3RhbmRhcmQgdW5peCBjb21wcmVzcwotMAlzdHJpbmcJCVwwMzdcMjM1CWFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQl4LWNvbXByZXNzCi0KLSMgZ3ppcCAoR05VIHppcCwgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggW0luZm8tWklQL1BLV0FSRV0gemlwIGFyY2hpdmVyKQotMCAgICAgICBzdHJpbmcgICAgICAgICAgXDAzN1wyMTMgICAgICAgIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQl4LWd6aXAKLQotIyBBY2NvcmRpbmcgdG8gZ3ppcC5oLCB0aGlzIGlzIHRoZSBjb3JyZWN0IGJ5dGUgb3JkZXIgZm9yIHBhY2tlZCBkYXRhLgotMAlzdHJpbmcJCVwwMzdcMDM2CWFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQotIwotIyBUaGlzIG1hZ2ljIG51bWJlciBpcyBieXRlLW9yZGVyLWluZGVwZW5kZW50LgotIwotMAlzaG9ydAkJMDE3NDM3CQlhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KLQotIyBYWFggLSB3aHkgKnR3byogZW50cmllcyBmb3IgImNvbXBhY3RlZCBkYXRhIiwgb25lIG9mIHdoaWNoIGlzCi0jIGJ5dGUtb3JkZXIgaW5kZXBlbmRlbnQsIGFuZCBvbmUgb2Ygd2hpY2ggaXMgYnl0ZS1vcmRlciBkZXBlbmRlbnQ/Ci0jCi0jIGNvbXBhY3RlZCBkYXRhCi0wCXNob3J0CQkweDFmZmYJCWFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQotMAlzdHJpbmcJCVwzNzdcMDM3CWFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQotIyBodWYgb3V0cHV0Ci0wCXNob3J0CQkwMTQ1NDA1CQlhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KLQotIyBTcXVlZXplIGFuZCBDcnVuY2guLi4KLSMgVGhlc2UgbnVtYmVycyB3ZXJlIGdsZWFuZWQgZnJvbSB0aGUgVW5peCB2ZXJzaW9ucyBvZiB0aGUgcHJvZ3JhbXMgdG8KLSMgaGFuZGxlIHRoZXNlIGZvcm1hdHMuICBOb3RlIHRoYXQgSSBjYW4gb25seSB1bmNydW5jaCwgbm90IGNydW5jaCwgYW5kCi0jIEkgZGlkbid0IGhhdmUgYSBjcnVuY2hlZCBmaWxlIGhhbmR5LCBzbyB0aGUgY3J1bmNoIG51bWJlciBpcyB1bnRlc3RlZC4KLSMJCQkJS2VpdGggV2FjbGVuYSA8a2VpdGhAY2VyYmVydXMudWNoaWNhZ28uZWR1PgotIzAJbGVzaG9ydAkJMHg3NkZGCQlzcXVlZXplZCBkYXRhIChDUC9NLCBET1MpCi0jMAlsZXNob3J0CQkweDc2RkUJCWNydW5jaGVkIGRhdGEgKENQL00sIERPUykKLQotIyBGcmVlemUKLSMwCXN0cmluZwkJXDAzN1wyMzcJRnJvemVuIGZpbGUgMi4xCi0jMAlzdHJpbmcJCVwwMzdcMjM2CUZyb3plbiBmaWxlIDEuMCAob3IgZ3ppcCAwLjUpCi0KLSMgbHpoPwotIzAJc3RyaW5nCQlcMDM3XDI0MAlMWkggY29tcHJlc3NlZCBkYXRhCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgZnJhbWU6ICBmaWxlKDEpIG1hZ2ljIGZvciBGcmFtZU1ha2VyIGZpbGVzCi0jCi0jIFRoaXMgc3R1ZmYgY2FtZSBvbiBhIEZyYW1lTWFrZXIgZGVtbyB0YXBlLCBtb3N0IG9mIHdoaWNoIGlzCi0jIGNvcHlyaWdodCwgYnV0IHRoaXMgZmlsZSBpcyAicHVibGlzaGVkIiBhcyB3aXRuZXNzIHRoZSBmb2xsb3dpbmc6Ci0jCi0wCXN0cmluZwkJXDxNYWtlckZpbGUJYXBwbGljYXRpb24veC1mcmFtZQotMAlzdHJpbmcJCVw8TUlGRmlsZQlhcHBsaWNhdGlvbi94LWZyYW1lCi0wCXN0cmluZwkJXDxNYWtlckRpY3Rpb25hcnkJYXBwbGljYXRpb24veC1mcmFtZQotMAlzdHJpbmcJCVw8TWFrZXJTY3JlZW5Gb24JYXBwbGljYXRpb24veC1mcmFtZQotMAlzdHJpbmcJCVw8TU1MCQlhcHBsaWNhdGlvbi94LWZyYW1lCi0wCXN0cmluZwkJXDxCb29rCQlhcHBsaWNhdGlvbi94LWZyYW1lCi0wCXN0cmluZwkJXDxNYWtlcgkJYXBwbGljYXRpb24veC1mcmFtZQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGh0bWw6ICBmaWxlKDEpIG1hZ2ljIGZvciBIVE1MIChIeXBlclRleHQgTWFya3VwIExhbmd1YWdlKSBkb2NzCi0jCi0jIGZyb20gRGFuaWVsIFF1aW5sYW4gPHF1aW5sYW5AeWdnZHJhc2lsLmNvbT4KLSMgYW5kIEFubmEgU2hlcmdvbGQgPGFubmFAaW5leHQuY28udWs+Ci0jCi0wCXN0cmluZwkJXDwhRE9DVFlQRVwgSFRNTAl0ZXh0L2h0bWwKLTAJc3RyaW5nCQlcPCFkb2N0eXBlXCBodG1sCXRleHQvaHRtbAotMAlzdHJpbmcJCVw8SEVBRAkJdGV4dC9odG1sCi0wCXN0cmluZwkJXDxoZWFkCQl0ZXh0L2h0bWwKLTAJc3RyaW5nCQlcPFRJVExFCQl0ZXh0L2h0bWwKLTAJc3RyaW5nCQlcPHRpdGxlCQl0ZXh0L2h0bWwKLTAgICAgICAgc3RyaW5nICAgICAgICAgIFw8aHRtbCAgICAgICAgICB0ZXh0L2h0bWwKLTAgICAgICAgc3RyaW5nICAgICAgICAgIFw8SFRNTCAgICAgICAgICB0ZXh0L2h0bWwKLTAJc3RyaW5nCQlcPCEtLQkJdGV4dC9odG1sCi0wCXN0cmluZwkJXDxoMQkJdGV4dC9odG1sCi0wCXN0cmluZwkJXDxIMQkJdGV4dC9odG1sCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgaW1hZ2VzOiAgZmlsZSgxKSBtYWdpYyBmb3IgaW1hZ2UgZm9ybWF0cyAoc2VlIGFsc28gImMtbGFuZyIgZm9yIFhQTSBiaXRtYXBzKQotIwotIyBvcmlnaW5hbGx5IGZyb20gamVmQGhlbGlvcy5lZS5sYmwuZ292IChKZWYgUG9za2FuemVyKSwKLSMgYWRkaXRpb25zIGJ5IGphbmxAaWZpLnVpby5ubyBhcyB3ZWxsIGFzIG90aGVycy4gSmFuIGFsc28gc3VnZ2VzdGVkCi0jIG1lcmdpbmcgc2V2ZXJhbCBvbmUtIGFuZCB0d28tbGluZSBmaWxlcyBpbnRvIGhlcmUuCi0jCi0jIFhYWCAtIGJ5dGUgb3JkZXIgZm9yIEdJRiBhbmQgVElGRiBmaWVsZHM/Ci0jIFtHUlI6ICBUSUZGIGFsbG93cyBib3RoIGJ5dGUgb3JkZXJzOyBHSUYgaXMgcHJvYmFibHkgbGl0dGxlLWVuZGlhbl0KLSMKLQotIyBbR1JSOiAgd2hhdCB0aGUgaGVsbCBpcyB0aGlzIGRvaW5nIGluIGhlcmU/XQotIzAJc3RyaW5nCQl4YnRvYQkJYnRvYSdkIGZpbGUKLQotIyBQQk1QTFVTCi0jCQkJCQlQQk0gZmlsZQotMAlzdHJpbmcJCVAxCQlpbWFnZS94LXBvcnRhYmxlLWJpdG1hcAk3Yml0Ci0jCQkJCQlQR00gZmlsZQotMAlzdHJpbmcJCVAyCQlpbWFnZS94LXBvcnRhYmxlLWdyZXltYXAJN2JpdAotIwkJCQkJUFBNIGZpbGUKLTAJc3RyaW5nCQlQMwkJaW1hZ2UveC1wb3J0YWJsZS1waXhtYXAJN2JpdAotIwkJCQkJUEJNICJyYXdiaXRzIiBmaWxlCi0wCXN0cmluZwkJUDQJCWltYWdlL3gtcG9ydGFibGUtYml0bWFwCi0jCQkJCQlQR00gInJhd2JpdHMiIGZpbGUKLTAJc3RyaW5nCQlQNQkJaW1hZ2UveC1wb3J0YWJsZS1ncmV5bWFwCi0jCQkJCQlQUE0gInJhd2JpdHMiIGZpbGUKLTAJc3RyaW5nCQlQNgkJaW1hZ2UveC1wb3J0YWJsZS1waXhtYXAKLQotIyBOSUZGIChOYXZ5IEludGVyY2hhbmdlIEZpbGUgRm9ybWF0LCBhIG1vZGlmaWNhdGlvbiBvZiBUSUZGKQotIyBbR1JSOiAgdGhpcyAqbXVzdCogZ28gYmVmb3JlIFRJRkZdCi0wCXN0cmluZwkJSUlOMQkJaW1hZ2UveC1uaWZmCi0KLSMgVElGRiBhbmQgZnJpZW5kcwotIwkJCQkJVElGRiBmaWxlLCBiaWctZW5kaWFuCi0wCXN0cmluZwkJTU0JCWltYWdlL3RpZmYKLSMJCQkJCVRJRkYgZmlsZSwgbGl0dGxlLWVuZGlhbgotMAlzdHJpbmcJCUlJCQlpbWFnZS90aWZmCi0KLSMgcG9zc2libGUgR0lGIHJlcGxhY2VtZW50czsgbm9uZSB5ZXQgcmVsZWFzZWQhCi0jIChHcmVnIFJvZWxvZnMsIG5ld3RAdWNoaWNhZ28uZWR1KQotIwotIyBHUlIgOTUwMTE1OiAgdGhpcyB3YXMgbWluZSAoIlppcCBHSUYiKToKLSMJCQkJCVpJRiBpbWFnZSAoR0lGK2RlZmxhdGUgYWxwaGEpCi0wCXN0cmluZwkJR0lGOTR6CQlpbWFnZS91bmtub3duCi0jCi0jIEdSUiA5NTAxMTU6ICB0aGlzIGlzIEplcmVteSBXb2hsJ3MgRnJlZSBHcmFwaGljcyBGb3JtYXQgKGJldHRlcik6Ci0jCQkJCQlGR0YgaW1hZ2UgKEdJRitkZWZsYXRlIGJldGEpCi0wCXN0cmluZwkJRkdGOTVhCQlpbWFnZS91bmtub3duCi0jCi0jIEdSUiA5NTAxMTU6ICB0aGlzIGlzIFRob21hcyBCb3V0ZWxsJ3MgUG9ydGFibGUgQml0bWFwIEZvcm1hdCBwcm9wb3NhbAotIyAoYmVzdDsgbm90IHlldCBpbXBsZW1lbnRlZCk6Ci0jCQkJCQlQQkYgaW1hZ2UgKGRlZmxhdGUgY29tcHJlc3Npb24pCi0wCXN0cmluZwkJUEJGCQlpbWFnZS91bmtub3duCi0KLSMgR0lGCi0wCXN0cmluZwkJR0lGCQlpbWFnZS9naWYKLQotIyBKUEVHIGltYWdlcwotMAliZXNob3J0CQkweGZmZDgJCWltYWdlL2pwZWcKLQotIyBQQyBiaXRtYXBzIChPUy8yLCBXaW5kb3plIEJNUCBmaWxlcykgIChHcmVnIFJvZWxvZnMsIG5ld3RAdWNoaWNhZ28uZWR1KQotMAlzdHJpbmcJCUJNCQlpbWFnZS9ibXAKLSM+MTQJYnl0ZQkJMTIJCShPUy8yIDEueCBmb3JtYXQpCi0jPjE0CWJ5dGUJCTY0CQkoT1MvMiAyLnggZm9ybWF0KQotIz4xNAlieXRlCQk0MAkJKFdpbmRvd3MgMy54IGZvcm1hdCkKLSMwCXN0cmluZwkJSUMJCWljb24KLSMwCXN0cmluZwkJUEkJCXBvaW50ZXIKLSMwCXN0cmluZwkJQ0kJCWNvbG9yIGljb24KLSMwCXN0cmluZwkJQ1AJCWNvbG9yIHBvaW50ZXIKLSMwCXN0cmluZwkJQkEJCWJpdG1hcCBhcnJheQotCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgbGlzcDogIGZpbGUoMSkgbWFnaWMgZm9yIGxpc3AgcHJvZ3JhbXMKLSMKLSMgdmFyaW91cyBsaXNwIHR5cGVzLCBmcm9tIERhbmllbCBRdWlubGFuIChxdWlubGFuQHlnZ2RyYXNpbC5jb20pCi0wCXN0cmluZwk7OwkJCXRleHQvcGxhaW4JOGJpdAotIyBFbWFjcyAxOCAtIHRoaXMgaXMgYWx3YXlzIGNvcnJlY3QsIGJ1dCBub3QgdmVyeSBtYWdpY2FsLgotMAlzdHJpbmcJXDAxMigJCQlhcHBsaWNhdGlvbi94LWVsYwotIyBFbWFjcyAxOQotMAlzdHJpbmcJO0VMQ1wwMjNcMDAwXDAwMFwwMDAJYXBwbGljYXRpb24veC1lbGMKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBtYWlsLm5ld3M6ICBmaWxlKDEpIG1hZ2ljIGZvciBtYWlsIGFuZCBuZXdzCi0jCi0jIFRoZXJlIGFyZSB0ZXN0cyB0byBhc2NtYWdpYy5jIHRvIGNvcGUgd2l0aCBtYWlsIGFuZCBuZXdzLgotMAlzdHJpbmcJCVJlbGF5LVZlcnNpb246IAltZXNzYWdlL3JmYzgyMgk3Yml0Ci0wCXN0cmluZwkJIyFcIHJuZXdzCW1lc3NhZ2UvcmZjODIyCTdiaXQKLTAJc3RyaW5nCQlOIyFcIHJuZXdzCW1lc3NhZ2UvcmZjODIyCTdiaXQKLTAJc3RyaW5nCQlGb3J3YXJkXCB0byAJbWVzc2FnZS9yZmM4MjIJN2JpdAotMAlzdHJpbmcJCVBpcGVcIHRvIAltZXNzYWdlL3JmYzgyMgk3Yml0Ci0wCXN0cmluZwkJUmV0dXJuLVBhdGg6CW1lc3NhZ2UvcmZjODIyCTdiaXQKLTAJc3RyaW5nCQlQYXRoOgkJbWVzc2FnZS9uZXdzCThiaXQKLTAJc3RyaW5nCQlYcmVmOgkJbWVzc2FnZS9uZXdzCThiaXQKLTAJc3RyaW5nCQlGcm9tOgkJbWVzc2FnZS9yZmM4MjIJN2JpdAotMAlzdHJpbmcJCUFydGljbGUgCW1lc3NhZ2UvbmV3cwk4Yml0Ci0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIG1zd29yZDogZmlsZSgxKSBtYWdpYyBmb3IgTVMgV29yZCBmaWxlcwotIwotIyBDb250cmlidXRvciBjbGFpbXM6Ci0jIFJldmVyc2VkLWVuZ2luZWVyZWQgTVMgV29yZCBtYWdpYyBudW1iZXJzCi0jCi0KLTAJc3RyaW5nCQlcMzc2XDA2N1wwXDA0MwkJCWFwcGxpY2F0aW9uL21zd29yZAotMAlzdHJpbmcJCVwzMzNcMjQ1LVwwXDBcMAkJCWFwcGxpY2F0aW9uL21zd29yZAotCi0jIGRpc2FibGUgdGhpcyBvbmUgYmVjYXVzZSBpdCBhcHBsaWVzIGFsc28gdG8gb3RoZXIKLSMgT2ZmaWNlL09MRSBkb2N1bWVudHMgZm9yIHdoaWNoIG1zd29yZCBpcyBub3QgY29ycmVjdC4gU2VlIFBSIzI2MDguCi0jMAlzdHJpbmcJCVwzMjBcMzE3XDAyMVwzNDBcMjQxXDI2MQlhcHBsaWNhdGlvbi9tc3dvcmQKLQotCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgcHJpbnRlcjogIGZpbGUoMSkgbWFnaWMgZm9yIHByaW50ZXItZm9ybWF0dGVkIGZpbGVzCi0jCi0KLSMgUG9zdFNjcmlwdAotMAlzdHJpbmcJCSUhCQlhcHBsaWNhdGlvbi9wb3N0c2NyaXB0Ci0wCXN0cmluZwkJXDAwNCUhCQlhcHBsaWNhdGlvbi9wb3N0c2NyaXB0Ci0KLSMgQWNyb2JhdAotIyAoZHVlIHRvIGNsYW1lbkBjcy5jbXUuZWR1KQotMAlzdHJpbmcJCSVQREYtCQlhcHBsaWNhdGlvbi9wZGYKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBzYzogIGZpbGUoMSkgbWFnaWMgZm9yICJzYyIgc3ByZWFkc2hlZXQKLSMKLTM4CXN0cmluZwkJU3ByZWFkc2hlZXQJYXBwbGljYXRpb24veC1zYwotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIHRleDogIGZpbGUoMSkgbWFnaWMgZm9yIFRlWCBmaWxlcwotIwotIyBYWFggLSBuZWVkcyBieXRlLWVuZGlhbiBzdHVmZiAoYmlnLWVuZGlhbiBhbmQgbGl0dGxlLWVuZGlhbiBEVkk/KQotIwotIyBGcm9tIDxjb25rbGluQHRhbGlzbWFuLmthbGVpZGEuY29tPgotCi0jIEFsdGhvdWdoIHdlIG1heSBrbm93IHRoZSBvZmZzZXQgb2YgY2VydGFpbiB0ZXh0IGZpZWxkcyBpbiBUZVggRFZJCi0jIGFuZCBmb250IGZpbGVzLCB3ZSBjYW4ndCB1c2UgdGhlbSByZWxpYWJseSBiZWNhdXNlIHRoZXkgYXJlIG5vdAotIyB6ZXJvIHRlcm1pbmF0ZWQuIFtidXQgd2UgZG8gYW55d2F5LCBjaHJpc3Rvc10KLTAJc3RyaW5nCQlcMzY3XDAwMglhcHBsaWNhdGlvbi94LWR2aQotIzAJc3RyaW5nCQlcMzY3XDIwMwlUZVggZ2VuZXJpYyBmb250IGRhdGEKLSMwCXN0cmluZwkJXDM2N1wxMzEJVGVYIHBhY2tlZCBmb250IGRhdGEKLSMwCXN0cmluZwkJXDM2N1wzMTIJVGVYIHZpcnR1YWwgZm9udCBkYXRhCi0jMAlzdHJpbmcJCVRoaXNcIGlzXCBUZVgsCVRlWCB0cmFuc2NyaXB0IHRleHQJCi0jMAlzdHJpbmcJCVRoaXNcIGlzXCBNRVRBRk9OVCwJTUVUQUZPTlQgdHJhbnNjcmlwdCB0ZXh0Ci0KLSMgVGhlcmUgaXMgbm8gd2F5IHRvIGRldGVjdCBUZVggRm9udCBNZXRyaWMgKCoudGZtKSBmaWxlcyB3aXRob3V0Ci0jIGJyZWFraW5nIHRoZW0gYXBhcnQgYW5kIHJlYWRpbmcgdGhlIGRhdGEuICBUaGUgZm9sbG93aW5nIHBhdHRlcm5zCi0jIG1hdGNoIG1vc3QgKi50Zm0gZmlsZXMgZ2VuZXJhdGVkIGJ5IE1FVEFGT05UIG9yIGFmbTJ0Zm0uCi0jMglzdHJpbmcJCVwwMDBcMDIxCVRlWCBmb250IG1ldHJpYyBkYXRhCi0jMglzdHJpbmcJCVwwMDBcMDIyCVRlWCBmb250IG1ldHJpYyBkYXRhCi0jPjM0CXN0cmluZwkJPlwwCQkoJXMpCi0KLSMgVGV4aW5mbyBhbmQgR05VIEluZm8sIGZyb20gRGFuaWVsIFF1aW5sYW4gKHF1aW5sYW5AeWdnZHJhc2lsLmNvbSkKLSMwCXN0cmluZwkJXFxpbnB1dFwgdGV4aW5mbwlUZXhpbmZvIHNvdXJjZSB0ZXh0Ci0jMAlzdHJpbmcJCVRoaXNcIGlzXCBJbmZvXCBmaWxlCUdOVSBJbmZvIHRleHQKLQotIyBjb3JyZWN0IFRlWCBtYWdpYyBmb3IgTGludXggKGFuZCBtYXliZSBtb3JlKQotIyBmcm9tIFBldGVyIFRvYmlhcyAodG9iaWFzQHNlcnZlci5ldC1pbmYuZmhvLWVtZGVuLmRlKQotIwotMAlsZXNob3J0CQkweDAyZjcJCWFwcGxpY2F0aW9uL3gtZHZpCi0KLSMgUlRGIC0gUmljaCBUZXh0IEZvcm1hdAotMAlzdHJpbmcJCXtcXHJ0ZgkJYXBwbGljYXRpb24vcnRmCi0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgYW5pbWF0aW9uOiAgZmlsZSgxKSBtYWdpYyBmb3IgYW5pbWF0aW9uL21vdmllIGZvcm1hdHMKLSMKLSMgYW5pbWF0aW9uIGZvcm1hdHMsIG9yaWdpbmFsbHkgZnJvbSB2YXhAY2N3Zi5jYy51dGV4YXMuZWR1IChWYVgjbjgpCi0jCQkJCQkJTVBFRyBmaWxlCi0wCXN0cmluZwkJXDAwMFwwMDBcMDAxXDI2Mwl2aWRlby9tcGVnCi0jCi0jIFRoZSBjb250cmlidXRvciBjbGFpbXM6Ci0jICAgSSBjb3VsZG4ndCBmaW5kIGEgcmVhbCBtYWdpYyBudW1iZXIgZm9yIHRoZXNlLCBob3dldmVyLCB0aGlzCi0jICAgLWFwcGVhcnMtIHRvIHdvcmsuICBOb3RlIHRoYXQgaXQgbWlnaHQgY2F0Y2ggb3RoZXIgZmlsZXMsIHRvbywKLSMgICBzbyBCRSBDQVJFRlVMIQotIwotIyBOb3RlIHRoYXQgdGl0bGUgYW5kIGF1dGhvciBhcHBlYXIgaW4gdGhlIHR3byAyMC1ieXRlIGNodW5rcwotIyBhdCBkZWNpbWFsIG9mZnNldHMgMiBhbmQgMjIsIHJlc3BlY3RpdmVseSwgYnV0IHRoZXkgYXJlIFhPUidlZCB3aXRoCi0jIDI1NSAoaGV4IEZGKSEgREwgZm9ybWF0IFNVQ0tTIEJJRyBST0NLUy4KLSMKLSMJCQkJCQlETCBmaWxlIHZlcnNpb24gMSAsIG1lZGl1bSBmb3JtYXQgKDE2MHgxMDAsIDQgaW1hZ2VzL3NjcmVlbikKLTAJYnl0ZQkJMQkJCXZpZGVvL3Vua25vd24KLTAJYnl0ZQkJMgkJCXZpZGVvL3Vua25vd24KLQpkaWZmIC0tZ2l0IGEvZG9jcy9jb25mL21pbWUudHlwZXMgYi9kb2NzL2NvbmYvbWltZS50eXBlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU2Y2NjNC4uMDAwMDAwMAotLS0gYS9kb2NzL2NvbmYvbWltZS50eXBlcworKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0jIFRoaXMgaXMgYSBjb21tZW50LiBJIGxvdmUgY29tbWVudHMuCi0KLSMgVGhpcyBmaWxlIGNvbnRyb2xzIHdoYXQgSW50ZXJuZXQgbWVkaWEgdHlwZXMgYXJlIHNlbnQgdG8gdGhlIGNsaWVudCBmb3IKLSMgZ2l2ZW4gZmlsZSBleHRlbnNpb24ocykuICBTZW5kaW5nIHRoZSBjb3JyZWN0IG1lZGlhIHR5cGUgdG8gdGhlIGNsaWVudAotIyBpcyBpbXBvcnRhbnQgc28gdGhleSBrbm93IGhvdyB0byBoYW5kbGUgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUuCi0jIEV4dHJhIHR5cGVzIGNhbiBlaXRoZXIgYmUgYWRkZWQgaGVyZSBvciBieSB1c2luZyBhbiBBZGRUeXBlIGRpcmVjdGl2ZQotIyBpbiB5b3VyIGNvbmZpZyBmaWxlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgSW50ZXJuZXQgbWVkaWEgdHlwZXMsCi0jIHBsZWFzZSByZWFkIFJGQyAyMDQ1LCAyMDQ2LCAyMDQ3LCAyMDQ4LCBhbmQgMjA3Ny4gIFRoZSBJbnRlcm5ldCBtZWRpYSB0eXBlCi0jIHJlZ2lzdHJ5IGlzIGF0IDxmdHA6Ly9mdHAuaWFuYS5vcmcvaW4tbm90ZXMvaWFuYS9hc3NpZ25tZW50cy9tZWRpYS10eXBlcy8+LgotCi0jIE1JTUUgdHlwZQkJCUV4dGVuc2lvbgotYXBwbGljYXRpb24vRURJLUNvbnNlbnQKLWFwcGxpY2F0aW9uL0VESS1YMTIKLWFwcGxpY2F0aW9uL0VESUZBQ1QKLWFwcGxpY2F0aW9uL2FjdGl2ZW1lc3NhZ2UKLWFwcGxpY2F0aW9uL2FuZHJldy1pbnNldAllegotYXBwbGljYXRpb24vYXBwbGVmaWxlCi1hcHBsaWNhdGlvbi9hdG9taWNtYWlsCi1hcHBsaWNhdGlvbi9iYXRjaC1zbXRwCi1hcHBsaWNhdGlvbi9jYWxzLTE4NDAKLWFwcGxpY2F0aW9uL2NvbW1vbmdyb3VuZAotYXBwbGljYXRpb24vY3liZXJjYXNoCi1hcHBsaWNhdGlvbi9kY2EtcmZ0Ci1hcHBsaWNhdGlvbi9kZWMtZHgKLWFwcGxpY2F0aW9uL2VzaG9wCi1hcHBsaWNhdGlvbi9odHRwCi1hcHBsaWNhdGlvbi9oeXBlcnN0dWRpbwotYXBwbGljYXRpb24vaWdlcwotYXBwbGljYXRpb24vaW5kZXgKLWFwcGxpY2F0aW9uL2luZGV4LmNtZAotYXBwbGljYXRpb24vaW5kZXgub2JqCi1hcHBsaWNhdGlvbi9pbmRleC5yZXNwb25zZQotYXBwbGljYXRpb24vaW5kZXgudm5kCi1hcHBsaWNhdGlvbi9pcHAKLWFwcGxpY2F0aW9uL21hYy1iaW5oZXg0MAlocXgKLWFwcGxpY2F0aW9uL21hYy1jb21wYWN0cHJvCWNwdAotYXBwbGljYXRpb24vbWFjd3JpdGVpaQotYXBwbGljYXRpb24vbWFyYwotYXBwbGljYXRpb24vbWF0aGVtYXRpY2EKLWFwcGxpY2F0aW9uL21hdGhlbWF0aWNhLW9sZAotYXBwbGljYXRpb24vbXN3b3JkCQlkb2MKLWFwcGxpY2F0aW9uL25ld3MtbWVzc2FnZS1pZAotYXBwbGljYXRpb24vbmV3cy10cmFuc21pc3Npb24KLWFwcGxpY2F0aW9uL29jc3AtcmVxdWVzdAotYXBwbGljYXRpb24vb2NzcC1yZXNwb25zZQotYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCWJpbiBkbXMgbGhhIGx6aCBleGUgY2xhc3MKLWFwcGxpY2F0aW9uL29kYQkJCW9kYQotYXBwbGljYXRpb24vcGRmCQkJcGRmCi1hcHBsaWNhdGlvbi9wZ3AtZW5jcnlwdGVkCi1hcHBsaWNhdGlvbi9wZ3Ata2V5cwotYXBwbGljYXRpb24vcGdwLXNpZ25hdHVyZQotYXBwbGljYXRpb24vcGtjczEwCi1hcHBsaWNhdGlvbi9wa2NzNy1taW1lCi1hcHBsaWNhdGlvbi9wa2NzNy1zaWduYXR1cmUKLWFwcGxpY2F0aW9uL3BraXgtY2VydAotYXBwbGljYXRpb24vcGtpeC1jcmwKLWFwcGxpY2F0aW9uL3BraXhjbXAKLWFwcGxpY2F0aW9uL3Bvc3RzY3JpcHQJCWFpIGVwcyBwcwotYXBwbGljYXRpb24vcHJzLmFsdmVzdHJhbmQudGl0cmF4LXNoZWV0Ci1hcHBsaWNhdGlvbi9wcnMuY3d3Ci1hcHBsaWNhdGlvbi9wcnMubnByZW5kCi1hcHBsaWNhdGlvbi9yZW1vdGUtcHJpbnRpbmcKLWFwcGxpY2F0aW9uL3Jpc2NvcwotYXBwbGljYXRpb24vcnRmCQkJcnRmCi1hcHBsaWNhdGlvbi9zZHAKLWFwcGxpY2F0aW9uL3NldC1wYXltZW50Ci1hcHBsaWNhdGlvbi9zZXQtcGF5bWVudC1pbml0aWF0aW9uCi1hcHBsaWNhdGlvbi9zZXQtcmVnaXN0cmF0aW9uCi1hcHBsaWNhdGlvbi9zZXQtcmVnaXN0cmF0aW9uLWluaXRpYXRpb24KLWFwcGxpY2F0aW9uL3NnbWwKLWFwcGxpY2F0aW9uL3NnbWwtb3Blbi1jYXRhbG9nCi1hcHBsaWNhdGlvbi9zbGF0ZQotYXBwbGljYXRpb24vc21pbAkJc21pIHNtaWwKLWFwcGxpY2F0aW9uL3ZlbW1pCi1hcHBsaWNhdGlvbi92bmQuM00uUG9zdC1pdC1Ob3RlcwotYXBwbGljYXRpb24vdm5kLkZsb0dyYXBoSXQKLWFwcGxpY2F0aW9uL3ZuZC5hY2NwYWMuc2ltcGx5LmFzbwotYXBwbGljYXRpb24vdm5kLmFjY3BhYy5zaW1wbHkuaW1wCi1hcHBsaWNhdGlvbi92bmQuYWN1Y29ib2wKLWFwcGxpY2F0aW9uL3ZuZC5hbnNlci13ZWItY2VydGlmaWNhdGUtaXNzdWUtaW5pdGlhdGlvbgotYXBwbGljYXRpb24vdm5kLmFuc2VyLXdlYi1mdW5kcy10cmFuc2Zlci1pbml0aWF0aW9uCi1hcHBsaWNhdGlvbi92bmQuYXVkaW9ncmFwaAotYXBwbGljYXRpb24vdm5kLmJ1c2luZXNzb2JqZWN0cwotYXBwbGljYXRpb24vdm5kLmNsYXltb3JlCi1hcHBsaWNhdGlvbi92bmQuY29tbWVyY2UtYmF0dGVsbGUKLWFwcGxpY2F0aW9uL3ZuZC5jb21tb25zcGFjZQotYXBwbGljYXRpb24vdm5kLmNvbXNvY2FsbGVyCi1hcHBsaWNhdGlvbi92bmQuY29zbW9jYWxsZXIKLWFwcGxpY2F0aW9uL3ZuZC5jdXBzLXBvc3RzY3JpcHQKLWFwcGxpY2F0aW9uL3ZuZC5jdXBzLXJhc3RlcgotYXBwbGljYXRpb24vdm5kLmN1cHMtcmF3Ci1hcHBsaWNhdGlvbi92bmQuY3liYW5rCi1hcHBsaWNhdGlvbi92bmQuZG5hCi1hcHBsaWNhdGlvbi92bmQuZHBncmFwaAotYXBwbGljYXRpb24vdm5kLmR4cgotYXBwbGljYXRpb24vdm5kLmVjZGlzLXVwZGF0ZQotYXBwbGljYXRpb24vdm5kLmVjb3dpbi5jaGFydAotYXBwbGljYXRpb24vdm5kLmVjb3dpbi5maWxlcmVxdWVzdAotYXBwbGljYXRpb24vdm5kLmVjb3dpbi5maWxldXBkYXRlCi1hcHBsaWNhdGlvbi92bmQuZWNvd2luLnNlcmllcwotYXBwbGljYXRpb24vdm5kLmVjb3dpbi5zZXJpZXNyZXF1ZXN0Ci1hcHBsaWNhdGlvbi92bmQuZWNvd2luLnNlcmllc3VwZGF0ZQotYXBwbGljYXRpb24vdm5kLmVubGl2ZW4KLWFwcGxpY2F0aW9uL3ZuZC5lcHNvbi5tc2YKLWFwcGxpY2F0aW9uL3ZuZC5lcHNvbi5xdWlja2FuaW1lCi1hcHBsaWNhdGlvbi92bmQuZXBzb24uc2FsdAotYXBwbGljYXRpb24vdm5kLmVwc29uLnNzZgotYXBwbGljYXRpb24vdm5kLmZkZgotYXBwbGljYXRpb24vdm5kLmZmc25zCi1hcHBsaWNhdGlvbi92bmQuZnJhbWVtYWtlcgotYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXMKLWFwcGxpY2F0aW9uL3ZuZC5mdWppdHN1Lm9hc3lzMgotYXBwbGljYXRpb24vdm5kLmZ1aml0c3Uub2FzeXMzCi1hcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5c2dwCi1hcHBsaWNhdGlvbi92bmQuZnVqaXRzdS5vYXN5c3BycwotYXBwbGljYXRpb24vdm5kLmZ1aml4ZXJveC5kb2N1d29ya3MKLWFwcGxpY2F0aW9uL3ZuZC5mdXQtbWlzbmV0Ci1hcHBsaWNhdGlvbi92bmQuaHAtSFBHTAotYXBwbGljYXRpb24vdm5kLmhwLVBDTAotYXBwbGljYXRpb24vdm5kLmhwLVBDTFhMCi1hcHBsaWNhdGlvbi92bmQuaHAtaHBpZAotYXBwbGljYXRpb24vdm5kLmhwLWhwcwotYXBwbGljYXRpb24vdm5kLmlibS5NaW5pUGF5Ci1hcHBsaWNhdGlvbi92bmQuaWJtLm1vZGNhcAotYXBwbGljYXRpb24vdm5kLmludGVyY29uLmZvcm1uZXQKLWFwcGxpY2F0aW9uL3ZuZC5pbnRlcnRydXN0LmRpZ2lib3gKLWFwcGxpY2F0aW9uL3ZuZC5pbnRlcnRydXN0Lm5uY3AKLWFwcGxpY2F0aW9uL3ZuZC5pbnR1LnFibwotYXBwbGljYXRpb24vdm5kLmludHUucWZ4Ci1hcHBsaWNhdGlvbi92bmQuaXMteHByCi1hcHBsaWNhdGlvbi92bmQuamFwYW5uZXQtZGlyZWN0b3J5LXNlcnZpY2UKLWFwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC1qcG5zdG9yZS13YWtldXAKLWFwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC1wYXltZW50LXdha2V1cAotYXBwbGljYXRpb24vdm5kLmphcGFubmV0LXJlZ2lzdHJhdGlvbgotYXBwbGljYXRpb24vdm5kLmphcGFubmV0LXJlZ2lzdHJhdGlvbi13YWtldXAKLWFwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC1zZXRzdG9yZS13YWtldXAKLWFwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC12ZXJpZmljYXRpb24KLWFwcGxpY2F0aW9uL3ZuZC5qYXBhbm5ldC12ZXJpZmljYXRpb24td2FrZXVwCi1hcHBsaWNhdGlvbi92bmQua29hbgotYXBwbGljYXRpb24vdm5kLmxvdHVzLTEtMi0zCi1hcHBsaWNhdGlvbi92bmQubG90dXMtYXBwcm9hY2gKLWFwcGxpY2F0aW9uL3ZuZC5sb3R1cy1mcmVlbGFuY2UKLWFwcGxpY2F0aW9uL3ZuZC5sb3R1cy1ub3RlcwotYXBwbGljYXRpb24vdm5kLmxvdHVzLW9yZ2FuaXplcgotYXBwbGljYXRpb24vdm5kLmxvdHVzLXNjcmVlbmNhbQotYXBwbGljYXRpb24vdm5kLmxvdHVzLXdvcmRwcm8KLWFwcGxpY2F0aW9uL3ZuZC5tZWRpYXN0YXRpb24uY2RrZXkKLWFwcGxpY2F0aW9uL3ZuZC5tZXJpZGlhbi1zbGluZ3Nob3QKLWFwcGxpY2F0aW9uL3ZuZC5taWYJCW1pZgotYXBwbGljYXRpb24vdm5kLm1pbmlzb2Z0LWhwMzAwMC1zYXZlCi1hcHBsaWNhdGlvbi92bmQubWl0c3ViaXNoaS5taXN0eS1ndWFyZC50cnVzdHdlYgotYXBwbGljYXRpb24vdm5kLm1vYml1cy5kYWYKLWFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMuZGlzCi1hcHBsaWNhdGlvbi92bmQubW9iaXVzLm1zbAotYXBwbGljYXRpb24vdm5kLm1vYml1cy5wbGMKLWFwcGxpY2F0aW9uL3ZuZC5tb2JpdXMudHhmCi1hcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlCi1hcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlLmFkc2kKLWFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5mbGV4c3VpdGUuZmlzCi1hcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlLmdvdGFwCi1hcHBsaWNhdGlvbi92bmQubW90b3JvbGEuZmxleHN1aXRlLmttcgotYXBwbGljYXRpb24vdm5kLm1vdG9yb2xhLmZsZXhzdWl0ZS50dGMKLWFwcGxpY2F0aW9uL3ZuZC5tb3Rvcm9sYS5mbGV4c3VpdGUud2VtCi1hcHBsaWNhdGlvbi92bmQubXMtYXJ0Z2FscnkKLWFwcGxpY2F0aW9uL3ZuZC5tcy1hc2YKLWFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbAl4bHMKLWFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50CXBwdAotYXBwbGljYXRpb24vdm5kLm1zLXByb2plY3QKLWFwcGxpY2F0aW9uL3ZuZC5tcy10bmVmCi1hcHBsaWNhdGlvbi92bmQubXMtd29ya3MKLWFwcGxpY2F0aW9uL3ZuZC5tdXNpYy1uaWZmCi1hcHBsaWNhdGlvbi92bmQubXVzaWNpYW4KLWFwcGxpY2F0aW9uL3ZuZC5uZXRmcHgKLWFwcGxpY2F0aW9uL3ZuZC5ub2JsZW5ldC1kaXJlY3RvcnkKLWFwcGxpY2F0aW9uL3ZuZC5ub2JsZW5ldC1zZWFsZXIKLWFwcGxpY2F0aW9uL3ZuZC5ub2JsZW5ldC13ZWIKLWFwcGxpY2F0aW9uL3ZuZC5ub3ZhZGlnbS5FRE0KLWFwcGxpY2F0aW9uL3ZuZC5ub3ZhZGlnbS5FRFgKLWFwcGxpY2F0aW9uL3ZuZC5ub3ZhZGlnbS5FWFQKLWFwcGxpY2F0aW9uL3ZuZC5vc2EubmV0ZGVwbG95Ci1hcHBsaWNhdGlvbi92bmQucGcuZm9ybWF0Ci1hcHBsaWNhdGlvbi92bmQucGcub3Nhc2xpCi1hcHBsaWNhdGlvbi92bmQucG93ZXJidWlsZGVyNgotYXBwbGljYXRpb24vdm5kLnBvd2VyYnVpbGRlcjYtcwotYXBwbGljYXRpb24vdm5kLnBvd2VyYnVpbGRlcjcKLWFwcGxpY2F0aW9uL3ZuZC5wb3dlcmJ1aWxkZXI3LXMKLWFwcGxpY2F0aW9uL3ZuZC5wb3dlcmJ1aWxkZXI3NQotYXBwbGljYXRpb24vdm5kLnBvd2VyYnVpbGRlcjc1LXMKLWFwcGxpY2F0aW9uL3ZuZC5wcmV2aWV3c3lzdGVtcy5ib3gKLWFwcGxpY2F0aW9uL3ZuZC5wdWJsaXNoYXJlLWRlbHRhLXRyZWUKLWFwcGxpY2F0aW9uL3ZuZC5yYXBpZAotYXBwbGljYXRpb24vdm5kLnNlZW1haWwKLWFwcGxpY2F0aW9uL3ZuZC5zaGFuYS5pbmZvcm1lZC5mb3JtZGF0YQotYXBwbGljYXRpb24vdm5kLnNoYW5hLmluZm9ybWVkLmZvcm10ZW1wbGF0ZQotYXBwbGljYXRpb24vdm5kLnNoYW5hLmluZm9ybWVkLmludGVyY2hhbmdlCi1hcHBsaWNhdGlvbi92bmQuc2hhbmEuaW5mb3JtZWQucGFja2FnZQotYXBwbGljYXRpb24vdm5kLnN0cmVldC1zdHJlYW0KLWFwcGxpY2F0aW9uL3ZuZC5zdmQKLWFwcGxpY2F0aW9uL3ZuZC5zd2lmdHZpZXctaWNzCi1hcHBsaWNhdGlvbi92bmQudHJpc2NhcGUubXhzCi1hcHBsaWNhdGlvbi92bmQudHJ1ZWRvYwotYXBwbGljYXRpb24vdm5kLnVmZGwKLWFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmFsZXJ0Ci1hcHBsaWNhdGlvbi92bmQudXBsYW5ldC5hbGVydC13YnhtbAotYXBwbGljYXRpb24vdm5kLnVwbGFuZXQuYmVhcmVyLWNob2ktd2J4bWwKLWFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmJlYXJlci1jaG9pY2UKLWFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmNhY2hlb3AKLWFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmNhY2hlb3Atd2J4bWwKLWFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmNoYW5uZWwKLWFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LmNoYW5uZWwtd2J4bWwKLWFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0Lmxpc3QKLWFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0Lmxpc3Qtd2J4bWwKLWFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0Lmxpc3RjbWQKLWFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0Lmxpc3RjbWQtd2J4bWwKLWFwcGxpY2F0aW9uL3ZuZC51cGxhbmV0LnNpZ25hbAotYXBwbGljYXRpb24vdm5kLnZjeAotYXBwbGljYXRpb24vdm5kLnZpc2lvCi1hcHBsaWNhdGlvbi92bmQud2FwLndieG1sCi1hcHBsaWNhdGlvbi92bmQud2FwLndtbGMKLWFwcGxpY2F0aW9uL3ZuZC53YXAud21sc2NyaXB0YwotYXBwbGljYXRpb24vdm5kLndlYnR1cmJvCi1hcHBsaWNhdGlvbi92bmQud3JxLWhwMzAwMC1sYWJlbGxlZAotYXBwbGljYXRpb24vdm5kLnd0LnN0ZgotYXBwbGljYXRpb24vdm5kLnhhcmEKLWFwcGxpY2F0aW9uL3ZuZC54ZmRsCi1hcHBsaWNhdGlvbi92bmQueWVsbG93cml2ZXItY3VzdG9tLW1lbnUKLWFwcGxpY2F0aW9uL3dpdGEKLWFwcGxpY2F0aW9uL3dvcmRwZXJmZWN0NS4xCi1hcHBsaWNhdGlvbi94LWJjcGlvCQliY3BpbwotYXBwbGljYXRpb24veC1jZGxpbmsJCXZjZAotYXBwbGljYXRpb24veC1jaGVzcy1wZ24JCXBnbgotYXBwbGljYXRpb24veC1jb21wcmVzcwotYXBwbGljYXRpb24veC1jcGlvCQljcGlvCi1hcHBsaWNhdGlvbi94LWNzaAkJY3NoCi1hcHBsaWNhdGlvbi94LWRpcmVjdG9yCQlkY3IgZGlyIGR4cgotYXBwbGljYXRpb24veC1kdmkJCWR2aQotYXBwbGljYXRpb24veC1mdXR1cmVzcGxhc2gJc3BsCi1hcHBsaWNhdGlvbi94LWd0YXIJCWd0YXIKLWFwcGxpY2F0aW9uL3gtZ3ppcAotYXBwbGljYXRpb24veC1oZGYJCWhkZgotYXBwbGljYXRpb24veC1qYXZhc2NyaXB0CWpzCi1hcHBsaWNhdGlvbi94LWtvYW4JCXNrcCBza2Qgc2t0IHNrbQotYXBwbGljYXRpb24veC1sYXRleAkJbGF0ZXgKLWFwcGxpY2F0aW9uL3gtbmV0Y2RmCQluYyBjZGYKLWFwcGxpY2F0aW9uL3gtc2gJCXNoCi1hcHBsaWNhdGlvbi94LXNoYXIJCXNoYXIKLWFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoCXN3ZgotYXBwbGljYXRpb24veC1zdHVmZml0CQlzaXQKLWFwcGxpY2F0aW9uL3gtc3Y0Y3BpbwkJc3Y0Y3BpbwotYXBwbGljYXRpb24veC1zdjRjcmMJCXN2NGNyYwotYXBwbGljYXRpb24veC10YXIJCXRhcgotYXBwbGljYXRpb24veC10Y2wJCXRjbAotYXBwbGljYXRpb24veC10ZXgJCXRleAotYXBwbGljYXRpb24veC10ZXhpbmZvCQl0ZXhpbmZvIHRleGkKLWFwcGxpY2F0aW9uL3gtdHJvZmYJCXQgdHIgcm9mZgotYXBwbGljYXRpb24veC10cm9mZi1tYW4JCW1hbgotYXBwbGljYXRpb24veC10cm9mZi1tZQkJbWUKLWFwcGxpY2F0aW9uL3gtdHJvZmYtbXMJCW1zCi1hcHBsaWNhdGlvbi94LXVzdGFyCQl1c3RhcgotYXBwbGljYXRpb24veC13YWlzLXNvdXJjZQlzcmMKLWFwcGxpY2F0aW9uL3g0MDAtYnAKLWFwcGxpY2F0aW9uL3htbAotYXBwbGljYXRpb24vemlwCQkJemlwCi1hdWRpby8zMmthZHBjbQotYXVkaW8vYmFzaWMJCQlhdSBzbmQKLWF1ZGlvL2wxNgotYXVkaW8vbWlkaQkJCW1pZCBtaWRpIGthcgotYXVkaW8vbXBlZwkJCW1wZ2EgbXAyIG1wMwotYXVkaW8vdm5kLmNucy5hbnAxCi1hdWRpby92bmQuY25zLmluZjEKLWF1ZGlvL3ZuZC5kaWdpdGFsLXdpbmRzCi1hdWRpby92bmQubHVjZW50LnZvaWNlCi1hdWRpby92bmQubm9ydGVsLnZiawotYXVkaW8vdm5kLm9jdGVsLnNiYwotYXVkaW8vdm5kLnFjZWxwCi1hdWRpby92bmQucmhldG9yZXguMzJrYWRwY20KLWF1ZGlvL3ZuZC52bXguY3ZzZAotYXVkaW8veC1haWZmCQkJYWlmIGFpZmYgYWlmYwotYXVkaW8veC1wbi1yZWFsYXVkaW8JCXJhbSBybQotYXVkaW8veC1wbi1yZWFsYXVkaW8tcGx1Z2luCXJwbQotYXVkaW8veC1yZWFsYXVkaW8JCXJhCi1hdWRpby94LXdhdgkJCXdhdgotY2hlbWljYWwveC1wZGIJCQlwZGIgeHl6Ci1pbWFnZS9ibXAJCQlibXAKLWltYWdlL2NnbQotaW1hZ2UvZzNmYXgKLWltYWdlL2dpZgkJCWdpZgotaW1hZ2UvaWVmCQkJaWVmCi1pbWFnZS9qcGVnCQkJanBlZyBqcGcganBlCi1pbWFnZS9uYXBscHMKLWltYWdlL3BuZwkJCXBuZwotaW1hZ2UvcHJzLmJ0aWYKLWltYWdlL3Bycy5wdGkKLWltYWdlL3RpZmYJCQl0aWZmIHRpZgotaW1hZ2Uvdm5kLmNucy5pbmYyCi1pbWFnZS92bmQuZHdnCi1pbWFnZS92bmQuZHhmCi1pbWFnZS92bmQuZmFzdGJpZHNoZWV0Ci1pbWFnZS92bmQuZnB4Ci1pbWFnZS92bmQubWl4Ci1pbWFnZS92bmQubmV0LWZweAotaW1hZ2Uvdm5kLnN2ZgotaW1hZ2Uvdm5kLndhcC53Ym1wCi1pbWFnZS92bmQueGlmZgotaW1hZ2UveC1jbXUtcmFzdGVyCQlyYXMKLWltYWdlL3gtcG9ydGFibGUtYW55bWFwCQlwbm0KLWltYWdlL3gtcG9ydGFibGUtYml0bWFwCQlwYm0KLWltYWdlL3gtcG9ydGFibGUtZ3JheW1hcAlwZ20KLWltYWdlL3gtcG9ydGFibGUtcGl4bWFwCQlwcG0KLWltYWdlL3gtcmdiCQkJcmdiCi1pbWFnZS94LXhiaXRtYXAJCQl4Ym0KLWltYWdlL3gteHBpeG1hcAkJCXhwbQotaW1hZ2UveC14d2luZG93ZHVtcAkJeHdkCi1tZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1cwotbWVzc2FnZS9kaXNwb3NpdGlvbi1ub3RpZmljYXRpb24KLW1lc3NhZ2UvZXh0ZXJuYWwtYm9keQotbWVzc2FnZS9odHRwCi1tZXNzYWdlL25ld3MKLW1lc3NhZ2UvcGFydGlhbAotbWVzc2FnZS9yZmM4MjIKLW1lc3NhZ2Uvcy1odHRwCi1tb2RlbC9pZ2VzCQkJaWdzIGlnZXMKLW1vZGVsL21lc2gJCQltc2ggbWVzaCBzaWxvCi1tb2RlbC92bmQuZHdmCi1tb2RlbC92bmQuZmxhdGxhbmQuM2RtbAotbW9kZWwvdm5kLmd0dwotbW9kZWwvdnJtbAkJCXdybCB2cm1sCi1tdWx0aXBhcnQvYWx0ZXJuYXRpdmUKLW11bHRpcGFydC9hcHBsZWRvdWJsZQotbXVsdGlwYXJ0L2J5dGVyYW5nZXMKLW11bHRpcGFydC9kaWdlc3QKLW11bHRpcGFydC9lbmNyeXB0ZWQKLW11bHRpcGFydC9mb3JtLWRhdGEKLW11bHRpcGFydC9oZWFkZXItc2V0Ci1tdWx0aXBhcnQvbWl4ZWQKLW11bHRpcGFydC9wYXJhbGxlbAotbXVsdGlwYXJ0L3JlbGF0ZWQKLW11bHRpcGFydC9yZXBvcnQKLW11bHRpcGFydC9zaWduZWQKLW11bHRpcGFydC92b2ljZS1tZXNzYWdlCi10ZXh0L2NhbGVuZGFyCi10ZXh0L2NzcwkJCWNzcwotdGV4dC9kaXJlY3RvcnkKLXRleHQvZW5yaWNoZWQKLXRleHQvaHRtbAkJCWh0bWwgaHRtCi10ZXh0L3BsYWluCQkJYXNjIHR4dAotdGV4dC9wcnMubGluZXMudGFnCi10ZXh0L3JmYzgyMi1oZWFkZXJzCi10ZXh0L3JpY2h0ZXh0CQkJcnR4Ci10ZXh0L3J0ZgkJCXJ0ZgotdGV4dC9zZ21sCQkJc2dtbCBzZ20KLXRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXMJdHN2Ci10ZXh0L3VyaS1saXN0Ci10ZXh0L3ZuZC5hYmMKLXRleHQvdm5kLmZsYXRsYW5kLjNkbWwKLXRleHQvdm5kLmZseQotdGV4dC92bmQuZm1pLmZsZXhzdG9yCi10ZXh0L3ZuZC5pbjNkLjNkbWwKLXRleHQvdm5kLmluM2Quc3BvdAotdGV4dC92bmQubGF0ZXgtegotdGV4dC92bmQubW90b3JvbGEucmVmbGV4Ci10ZXh0L3ZuZC53YXAud21sCi10ZXh0L3ZuZC53YXAud21sc2NyaXB0Ci10ZXh0L3gtc2V0ZXh0CQkJZXR4Ci10ZXh0L3htbAkJCXhtbAotdmlkZW8vbXBlZwkJCW1wZWcgbXBnIG1wZQotdmlkZW8vcXVpY2t0aW1lCQkJcXQgbW92Ci12aWRlby92bmQubW90b3JvbGEudmlkZW8KLXZpZGVvL3ZuZC5tb3Rvcm9sYS52aWRlb3AKLXZpZGVvL3ZuZC52aXZvCi12aWRlby94LW1zdmlkZW8JCQlhdmkKLXZpZGVvL3gtc2dpLW1vdmllCQltb3ZpZQoteC1jb25mZXJlbmNlL3gtY29vbHRhbGsJCWljZQpkaWZmIC0tZ2l0IGEvZG9jcy9kb2Nyb290L2FwYWNoZV9wYi5naWYgYi9kb2NzL2RvY3Jvb3QvYXBhY2hlX3BiLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ExYzEzOS4uMDAwMDAwMAotLS0gYS9kb2NzL2RvY3Jvb3QvYXBhY2hlX3BiLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvUkVBRE1FIGIvZG9jcy9pY29ucy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YjI5NzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotUHVibGljIERvbWFpbiBJY29ucwotCi0gICAgIFRoZXNlIGljb25zIHdlcmUgb3JpZ2luYWxseSBtYWRlIGZvciBNb3NhaWMgZm9yIFggYW5kIGhhdmUgYmVlbgotICAgICBpbmNsdWRlZCBpbiB0aGUgTkNTQSBodHRwZCBhbmQgQXBhY2hlIHNlcnZlciBkaXN0cmlidXRpb25zIGluIHRoZQotICAgICBwYXN0LiBUaGV5IGFyZSBpbiB0aGUgcHVibGljIGRvbWFpbiBhbmQgbWF5IGJlIGZyZWVseSBpbmNsdWRlZCBpbiBhbnkKLSAgICAgYXBwbGljYXRpb24uIFRoZSBvcmlnaW5hbHMgd2VyZSBkb25lIGJ5IEtldmluIEh1Z2hlcyAKLSAgICAgKGtldmluaEBrZXZjb20uY29tKS4KLQotICAgICBNYW55IHRoYW5rcyB0byBBbmR5IFBvbHlha292IGZvciB0dW5pbmcgdGhlIGljb24gY29sb3JzIGFuZCBhZGRpbmcgYQotICAgICBmZXcgbmV3IGltYWdlcy4gSWYgeW91J2QgbGlrZSB0byBjb250cmlidXRlIGFkZGl0aW9ucyBvciBpZGVhcyB0bwotICAgICB0aGlzIHNldCwgcGxlYXNlIGxldCBtZSBrbm93LgotCi0gICAgIEFsbW9zdCBhbGwgb2YgdGhlc2UgaWNvbnMgYXJlIDIweDIyIHBpeGVscyBpbiBzaXplLiAgVGhlcmUgYXJlCi0gICAgIGFsdGVybmF0aXZlIGljb25zIGluIHRoZSAic21hbGwiIGRpcmVjdG9yeSB0aGF0IGFyZSAxNngxNiBpbiBzaXplLAotICAgICBwcm92aWRlZCBieSBNaWtlIEJyb3duIChtaWtlQGh5cGVycmVhbC5vcmcpLgotCi1TdWdnZXN0ZWQgVXNlcwotCi1UaGUgZm9sbG93aW5nIGFyZSBhIGZldyBzdWdnZXN0aW9ucywgdG8gc2VydmUgYXMgYSBzdGFydGluZyBwb2ludCBmb3IgaWRlYXMuCi1QbGVhc2UgZmVlbCBmcmVlIHRvIHR3ZWFrIGFuZCByZW5hbWUgdGhlIGljb25zIGFzIHlvdSBsaWtlLgotCi0gICAgIGEuZ2lmCi0gICAgICAgICAgVGhpcyBtaWdodCBiZSB1c2VkIHRvIHJlcHJlc2VudCBQb3N0U2NyaXB0IG9yIHRleHQgbGF5b3V0Ci0gICAgICAgICAgbGFuZ3VhZ2VzLgotCi0gICAgIGFsZXJ0LmJsYWNrLmdpZiwgYWxlcnQucmVkLmdpZgotICAgICAgICAgIFRoZXNlIGNhbiBiZSB1c2VkIHRvIGhpZ2hsaWdodCBhbnkgaW1wb3J0YW50IGl0ZW1zLCBzdWNoIGFzIGEKLSAgICAgICAgICBSRUFETUUgZmlsZSBpbiBhIGRpcmVjdG9yeS4KLQotICAgICBiYWNrLmdpZiwgZm9yd2FyZC5naWYKLSAgICAgICAgICBUaGVzZSBjYW4gYmUgdXNlZCBhcyBsaW5rcyB0byBnbyB0byBwcmV2aW91cyBhbmQgbmV4dCBhcmVhcy4KLQotICAgICBiYWxsLmdyYXkuZ2lmLCBiYWxsLnJlZC5naWYKLSAgICAgICAgICBUaGVzZSBtaWdodCBiZSB1c2VkIGFzIGJ1bGxldHMuCi0KLSAgICAgYmluYXJ5LmdpZgotICAgICAgICAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IGJpbmFyeSBmaWxlcy4KLQotICAgICBiaW5oZXguZ2lmCi0gICAgICAgICAgVGhpcyBjYW4gcmVwcmVzZW50IEJpbkhleC1lbmNvZGVkIGRhdGEuCi0KLSAgICAgYmxhbmsuZ2lmCi0gICAgICAgICAgVGhpcyBjYW4gYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIG9yIGEgc3BhY2luZyBlbGVtZW50LgotCi0gICAgIGJvbWIuZ2lmCi0gICAgICAgICAgVGhpcyBjYW4gYmUgdXNlZCB0byByZXByZWVzbnQgY29yZSBmaWxlcy4KLQotICAgICBib3gxLmdpZiwgYm94Mi5naWYKLSAgICAgICAgICBUaGVzZSBpY29ucyBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgZ2VuZXJpYyAzRCBhcHBsaWNhdGlvbnMgYW5kCi0gICAgICAgICAgcmVsYXRlZCBmaWxlcy4KLQotICAgICBicm9rZW4uZ2lmCi0gICAgICAgICAgVGhpcyBjYW4gcmVwcmVzZW50IGNvcnJ1cHRlZCBkYXRhLgotCi0gICAgIGJ1cnN0LmdpZgotICAgICAgICAgIFRoaXMgY2FuIGNhbGwgYXR0ZW50aW9uIHRvIG5ldyBhbmQgaW1wb3J0YW50IGl0ZW1zLgotCi0gICAgIGMuZ2lmCi0gICAgICAgICAgVGhpcyBtaWdodCByZXByZXNlbnQgQyBzb3VyY2UgY29kZS4KLQotICAgICBjb21wLmJsdWUuZ2lmLCBjb21wLnJlZC5naWYKLSAgICAgICAgICBUaGVzZSBsaXR0bGUgY29tcHV0ZXIgaWNvbnMgY2FuIHN0YW5kIGZvciB0ZWxuZXQgb3IgRlRQCi0gICAgICAgICAgc2Vzc2lvbnMuCi0KLSAgICAgY29tcHJlc3NlZC5naWYKLSAgICAgICAgICBUaGlzIG1heSByZXByZXNlbnQgY29tcHJlc3NlZCBkYXRhLgotCi0gICAgIGNvbnRpbnVlZC5naWYKLSAgICAgICAgICBUaGlzIGNhbiBiZSBhIGxpbmsgdG8gYSBjb250aW51ZWQgbGlzdGluZyBvZiBhIGRpcmVjdG9yeS4KLQotICAgICBkb3duLmdpZiwgdXAuZ2lmLCBsZWZ0LmdpZiwgcmlnaHQuZ2lmCi0gICAgICAgICAgVGhlc2UgY2FuIGJlIHVzZWQgdG8gc2Nyb2xsIHVwLCBkb3duLCBsZWZ0IGFuZCByaWdodCBpbiBhCi0gICAgICAgICAgbGlzdGluZyBvciBtYXkgYmUgdXNlZCB0byBkZW5vdGUgaXRlbXMgaW4gYW4gb3V0bGluZS4KLQotICAgICBkdmkuZ2lmCi0gICAgICAgICAgVGhpcyBjYW4gcmVwcmVzZW50IERWSSBmaWxlcy4KLQotICAgICBmLmdpZgotICAgICAgICAgIFRoaXMgbWlnaHQgcmVwcmVzZW50IEZPUlRSQU4gb3IgRm9ydGggc291cmNlIGNvZGUuCi0KLSAgICAgZm9sZGVyLmdpZiwgZm9sZGVyLm9wZW4uZ2lmLCBmb2xkZXIuc2VjLmdpZgotICAgICAgICAgIFRoZSBmb2xkZXIgY2FuIHJlcHJlc2VudCBkaXJlY3Rvcmllcy4gVGhlcmUgaXMgYWxzbyBhIHZlcnNpb24KLSAgICAgICAgICB0aGF0IGNhbiByZXByZXNlbnQgc2VjdXJlIGRpcmVjdG9yaWVzIG9yIGRpcmVjdG9yaWVzIHRoYXQgY2Fubm90Ci0gICAgICAgICAgYmUgdmlld2VkLgotCi0gICAgIGdlbmVyaWMuZ2lmLCBnZW5lcmljLnNlYy5naWYsIGdlbmVyaWMucmVkLmdpZgotICAgICAgICAgIFRoZXNlIGNhbiByZXByZXNlbnQgZ2VuZXJpYyBmaWxlcywgc2VjdXJlIGZpbGVzLCBhbmQgaW1wb3J0YW50Ci0gICAgICAgICAgZmlsZXMsIHJlc3BlY3RpdmVseS4KLQotICAgICBoYW5kLnJpZ2h0LmdpZiwgaGFuZC51cC5naWYKLSAgICAgICAgICBUaGVzZSBjYW4gcG9pbnQgb3V0IGltcG9ydGFudCBpdGVtcyAocHVuIGludGVuZGVkKS4KLQotICAgICBpbWFnZTEuZ2lmLCBpbWFnZTIuZ2lmLCBpbWFnZTMuZ2lmCi0gICAgICAgICAgVGhlc2UgY2FuIHJlcHJlc2VudCBpbWFnZSBmb3JtYXRzIG9mIHZhcmlvdXMgdHlwZXMuCi0KLSAgICAgaW5kZXguZ2lmCi0gICAgICAgICAgVGhpcyBtaWdodCByZXByZXNlbnQgYSBXQUlTIGluZGV4IG9yIHNlYXJjaCBmYWNpbGl0eS4KLQotICAgICBsYXlvdXQuZ2lmCi0gICAgICAgICAgVGhpcyBtaWdodCByZXByZXNlbnQgZmlsZXMgYW5kIGZvcm1hdHMgdGhhdCBjb250YWluIGdyYXBoaWNzIGFzCi0gICAgICAgICAgd2VsbCBhcyB0ZXh0IGxheW91dCwgc3VjaCBhcyBIVE1MIGFuZCBQREYgZmlsZXMuCi0KLSAgICAgbGluay5naWYKLSAgICAgICAgICBUaGlzIG1pZ2h0IHJlcHJlc2VudCBmaWxlcyB0aGF0IGFyZSBzeW1ib2xpYyBsaW5rcy4KLQotICAgICBtb3ZpZS5naWYKLSAgICAgICAgICBUaGlzIGNhbiByZXByZXNlbnQgdmFyaW91cyBtb3ZpZSBmb3JtYXRzLgotCi0gICAgIHAuZ2lmCi0gICAgICAgICAgVGhpcyBtYXkgc3RhbmQgZm9yIFBlcmwgb3IgUHl0aG9uIHNvdXJjZSBjb2RlLgotCi0gICAgIHBpZTAuZ2lmIC4uLiBwaWU4LmdpZgotICAgICAgICAgIFRoZXNlIGljb25zIGNhbiBiZSB1c2VkIGluIGFwcGxpY2F0aW9ucyB3aGVyZSBhIGxpc3Qgb2YKLSAgICAgICAgICBkb2N1bWVudHMgaXMgcmV0dXJuZWQgZnJvbSBhIHNlYXJjaC4gVGhlIGxpdHRsZSBwaWUgY2hhcnQgaW1hZ2VzCi0gICAgICAgICAgY2FuIGRlbm90ZSBob3cgcmVsZXZhbnQgdGhlIGRvY3VtZW50cyBtYXkgYmUgdG8geW91ciBzZWFyY2gKLSAgICAgICAgICBxdWVyeS4KLQotICAgICBwYXRjaC5naWYKLSAgICAgICAgICBUaGlzIG1heSBzdGFuZCBmb3IgcGF0Y2hlcyBhbmQgZGlmZiBmaWxlcy4KLQotICAgICBwb3J0YWwuZ2lmCi0gICAgICAgICAgVGhpcyBtaWdodCBiZSBhIGxpbmsgdG8gYW4gb25saW5lIHNlcnZpY2Ugb3IgYSAzRCB3b3JsZC4KLQotICAgICBwcy5naWYsIHF1aWxsLmdpZgotICAgICAgICAgIFRoZXNlIG1heSByZXByZXNlbnQgUG9zdFNjcmlwdCBmaWxlcy4KLQotICAgICBzY3JldzEuZ2lmLCBzY3JldzIuZ2lmCi0gICAgICAgICAgVGhlc2UgbWF5IHJlcHJlc2VudCBDQUQgb3IgZW5naW5lZXJpbmcgZGF0YSBhbmQgZm9ybWF0cy4KLQotICAgICBzY3JpcHQuZ2lmCi0gICAgICAgICAgVGhpcyBjYW4gcmVwcmVzZW50IGFueSBvZiB2YXJpb3VzIGludGVycHJldGVkIGxhbmd1YWdlcywgc3VjaCBhcwotICAgICAgICAgIFBlcmwsIHB5dGhvbiwgVENMLCBhbmQgc2hlbGwgc2NyaXB0cywgYXMgd2VsbCBhcyBzZXJ2ZXIKLSAgICAgICAgICBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgIHNvdW5kMS5naWYsIHNvdW5kMi5naWYKLSAgICAgICAgICBUaGVzZSBjYW4gcmVwcmVzZW50IHNvdW5kIGZpbGVzLgotCi0gICAgIHNwaGVyZTEuZ2lmLCBzcGhlcmUyLmdpZgotICAgICAgICAgIFRoZXNlIGNhbiByZXByZXNlbnQgM0Qgd29ybGRzIG9yIHJlbmRlcmluZyBhcHBsaWNhdGlvbnMgYW5kCi0gICAgICAgICAgZm9ybWF0cy4KLQotICAgICB0ZXguZ2lmCi0gICAgICAgICAgVGhpcyBjYW4gcmVwcmVzZW50IFRlWCBmaWxlcy4KLQotICAgICB0ZXh0LmdpZgotICAgICAgICAgIFRoaXMgY2FuIHJlcHJlc2VudCBnZW5lcmljIChwbGFpbikgdGV4dCBmaWxlcy4KLQotICAgICB0cmFuc2Zlci5naWYKLSAgICAgICAgICBUaGlzIGNhbiByZXByZXNlbnQgRlRQIHRyYW5zZmVycyBvciB1cGxvYWRzL2Rvd25sb2Fkcy4KLQotICAgICB1bmtub3duLmdpZgotICAgICAgICAgIFRoaXMgbWF5IHJlcHJlc2VudCBhIGZpbGUgb2YgYW4gdW5rbm93biB0eXBlLgotCi0gICAgIHV1ZW5jb2RlZC5naWYKLSAgICAgICAgICBUaGlzIGNhbiBzdGFuZCBmb3IgdXVlbmNvZGVkIGRhdGEuCi0KLSAgICAgd29ybGQxLmdpZiwgd29ybGQyLmdpZgotICAgICAgICAgIFRoZXNlIGNhbiByZXByZXNlbnQgM0Qgd29ybGRzIG9yIG90aGVyIDNEIGZvcm1hdHMuCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2EuZ2lmIGIvZG9jcy9pY29ucy9hLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIyM2Q5Ny4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2EuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9hbGVydC5ibGFjay5naWYgYi9kb2NzL2ljb25zL2FsZXJ0LmJsYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlY2QyMS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2FsZXJ0LmJsYWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvYWxlcnQucmVkLmdpZiBiL2RvY3MvaWNvbnMvYWxlcnQucmVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyMzg5NC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2FsZXJ0LnJlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2FwYWNoZV9wYi5naWYgYi9kb2NzL2ljb25zL2FwYWNoZV9wYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMWMxMzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9hcGFjaGVfcGIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9iYWNrLmdpZiBiL2RvY3MvaWNvbnMvYmFjay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2OTRhZTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9iYWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvYmFsbC5ncmF5LmdpZiBiL2RvY3MvaWNvbnMvYmFsbC5ncmF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4NDI2OC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2JhbGwuZ3JheS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2JhbGwucmVkLmdpZiBiL2RvY3MvaWNvbnMvYmFsbC5yZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODQyNWNiLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvYmFsbC5yZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9iaW5hcnkuZ2lmIGIvZG9jcy9pY29ucy9iaW5hcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTE1Y2JhLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvYmluYXJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvYmluaGV4LmdpZiBiL2RvY3MvaWNvbnMvYmluaGV4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJkMDM2My4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2JpbmhleC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2JsYW5rLmdpZiBiL2RvY3MvaWNvbnMvYmxhbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2NmMDFlLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvYmxhbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9ib21iLmdpZiBiL2RvY3MvaWNvbnMvYm9tYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MGZkYjEuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9ib21iLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvYm94MS5naWYgYi9kb2NzL2ljb25zL2JveDEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWRjZDAwLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvYm94MS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2JveDIuZ2lmIGIvZG9jcy9pY29ucy9ib3gyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQzYmM0Zi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2JveDIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9icm9rZW4uZ2lmIGIvZG9jcy9pY29ucy9icm9rZW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjhjYmU5Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvYnJva2VuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvYnVyc3QuZ2lmIGIvZG9jcy9pY29ucy9idXJzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZGNmNTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9idXJzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2MuZ2lmIGIvZG9jcy9pY29ucy9jLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU1NWI2Yy4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9jb21wLmJsdWUuZ2lmIGIvZG9jcy9pY29ucy9jb21wLmJsdWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGQ3NmE4Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvY29tcC5ibHVlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvY29tcC5ncmF5LmdpZiBiL2RvY3MvaWNvbnMvY29tcC5ncmF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2NGNkMC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2NvbXAuZ3JheS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2NvbXByZXNzZWQuZ2lmIGIvZG9jcy9pY29ucy9jb21wcmVzc2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzllNzMyNy4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2NvbXByZXNzZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9jb250aW51ZWQuZ2lmIGIvZG9jcy9pY29ucy9jb250aW51ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGZmYjdlLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvY29udGludWVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvZGlyLmdpZiBiL2RvY3MvaWNvbnMvZGlyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyNjQ2MC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2Rpci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2Rvd24uZ2lmIGIvZG9jcy9pY29ucy9kb3duLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM1NGM4Ny4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2Rvd24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9kdmkuZ2lmIGIvZG9jcy9pY29ucy9kdmkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTFiZTMzLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvZHZpLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvZi5naWYgYi9kb2NzL2ljb25zL2YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmUzNTNjLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2ZvbGRlci5naWYgYi9kb2NzL2ljb25zL2ZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MjY0NjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9mb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9mb2xkZXIub3Blbi5naWYgYi9kb2NzL2ljb25zL2ZvbGRlci5vcGVuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA5NzljYi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2ZvbGRlci5vcGVuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvZm9sZGVyLnNlYy5naWYgYi9kb2NzL2ljb25zL2ZvbGRlci5zZWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTMzMmQ5Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvZm9sZGVyLnNlYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2ZvcndhcmQuZ2lmIGIvZG9jcy9pY29ucy9mb3J3YXJkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI5NTliNC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2ZvcndhcmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9nZW5lcmljLmdpZiBiL2RvY3MvaWNvbnMvZ2VuZXJpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNjBiMjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9nZW5lcmljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvZ2VuZXJpYy5yZWQuZ2lmIGIvZG9jcy9pY29ucy9nZW5lcmljLnJlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NzQzOTguLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9nZW5lcmljLnJlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2dlbmVyaWMuc2VjLmdpZiBiL2RvY3MvaWNvbnMvZ2VuZXJpYy5zZWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGQ1MjQwLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvZ2VuZXJpYy5zZWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9oYW5kLnJpZ2h0LmdpZiBiL2RvY3MvaWNvbnMvaGFuZC5yaWdodC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZGJjNzIuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9oYW5kLnJpZ2h0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvaGFuZC51cC5naWYgYi9kb2NzL2ljb25zL2hhbmQudXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWE1ZDY4Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvaGFuZC51cC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2ljb24uc2hlZXQuZ2lmIGIvZG9jcy9pY29ucy9pY29uLnNoZWV0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQxNjg2ZS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2ljb24uc2hlZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9pbWFnZTEuZ2lmIGIvZG9jcy9pY29ucy9pbWFnZTEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWU0NDJiLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvaW1hZ2UxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvaW1hZ2UyLmdpZiBiL2RvY3MvaWNvbnMvaW1hZ2UyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxZmFlZS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2ltYWdlMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2ltYWdlMy5naWYgYi9kb2NzL2ljb25zL2ltYWdlMy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzA0ODQuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9pbWFnZTMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9pbmRleC5naWYgYi9kb2NzL2ljb25zL2luZGV4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYyNDc4Zi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2luZGV4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvbGF5b3V0LmdpZiBiL2RvY3MvaWNvbnMvbGF5b3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk2MzM4YS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2xheW91dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL2xlZnQuZ2lmIGIvZG9jcy9pY29ucy9sZWZ0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc5ZTY3MS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL2xlZnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9saW5rLmdpZiBiL2RvY3MvaWNvbnMvbGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjY4ODkuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9saW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvbW92aWUuZ2lmIGIvZG9jcy9pY29ucy9tb3ZpZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMzUxODMuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9tb3ZpZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3AuZ2lmIGIvZG9jcy9pY29ucy9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I5MTdiNC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9wYXRjaC5naWYgYi9kb2NzL2ljb25zL3BhdGNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzliYzkwZS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3BhdGNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvcGRmLmdpZiBiL2RvY3MvaWNvbnMvcGRmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4ZmQ3Ny4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3BkZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3BpZTAuZ2lmIGIvZG9jcy9pY29ucy9waWUwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY3YTBhZS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3BpZTAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9waWUxLmdpZiBiL2RvY3MvaWNvbnMvcGllMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYWE2YmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9waWUxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvcGllMi5naWYgYi9kb2NzL2ljb25zL3BpZTIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDRjNWUwLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvcGllMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3BpZTMuZ2lmIGIvZG9jcy9pY29ucy9waWUzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRiOWQwMi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3BpZTMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9waWU0LmdpZiBiL2RvY3MvaWNvbnMvcGllNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNDcxZmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9waWU0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvcGllNS5naWYgYi9kb2NzL2ljb25zL3BpZTUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2FlZTkzLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvcGllNS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3BpZTYuZ2lmIGIvZG9jcy9pY29ucy9waWU2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRjMzI3Yi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3BpZTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9waWU3LmdpZiBiL2RvY3MvaWNvbnMvcGllNy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NjEzMzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9waWU3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvcGllOC5naWYgYi9kb2NzL2ljb25zL3BpZTguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWRkYjM0Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvcGllOC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3BvcnRhbC5naWYgYi9kb2NzL2ljb25zL3BvcnRhbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNmU1MDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9wb3J0YWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9wcy5naWYgYi9kb2NzL2ljb25zL3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY1NjViYy4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvcXVpbGwuZ2lmIGIvZG9jcy9pY29ucy9xdWlsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxOGE1Y2QuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9xdWlsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3JpZ2h0LmdpZiBiL2RvY3MvaWNvbnMvcmlnaHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjU2ZTVmLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvcmlnaHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zY3JldzEuZ2lmIGIvZG9jcy9pY29ucy9zY3JldzEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjZiYTJiLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc2NyZXcxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc2NyZXcyLmdpZiBiL2RvY3MvaWNvbnMvc2NyZXcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZkY2NiMy4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NjcmV3Mi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NjcmlwdC5naWYgYi9kb2NzL2ljb25zL3NjcmlwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YTg1M2IuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zY3JpcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9SRUFETUUudHh0IGIvZG9jcy9pY29ucy9zbWFsbC9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWI5NjcwLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotCi1UaGVzZSBpY29ucyBhcmUgcHJvdmlkZWQgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIHN0YW5kYXJkIEFwYWNoZQotaWNvbiBncmFwaGljcy4gIEFsbCBncmFwaGljcyBpbiB0aGlzIGRpcmVjdG9yeSwgd2l0aCB0aGUgZXhjZXB0aW9uCi1vZiByYWluYm93LmdpZiwgYXJlIDE2eDE2IHBpeGVscyBpbiBzaXplLCByYXRoZXIgdGhhbiB0aGUgMjB4MjIKLWRpbWVuc2lvbiBpY29ucyB3aGljaCBhcmUgdGhlIG5vcm1hbCBkZWZhdWx0cyBmb3IgQXBhY2hlIGFuZCBhcmUKLWluIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoaXMgb25lLgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9iYWNrLmdpZiBiL2RvY3MvaWNvbnMvc21hbGwvYmFjay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMzE0NTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9iYWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvYmluYXJ5LmdpZiBiL2RvY3MvaWNvbnMvc21hbGwvYmluYXJ5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk1Zjc5Yi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL2JpbmFyeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL2JpbmhleC5naWYgYi9kb2NzL2ljb25zL3NtYWxsL2JpbmhleC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNTRhNTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9iaW5oZXguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9ibGFuay5naWYgYi9kb2NzL2ljb25zL3NtYWxsL2JsYW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA2Nzg3YS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL2JsYW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvYnJva2VuLmdpZiBiL2RvY3MvaWNvbnMvc21hbGwvYnJva2VuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjYzU3Zi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL2Jyb2tlbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL2J1cnN0LmdpZiBiL2RvY3MvaWNvbnMvc21hbGwvYnVyc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODgyY2ViLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvYnVyc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9jb21wMS5naWYgYi9kb2NzL2ljb25zL3NtYWxsL2NvbXAxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyZjM2YS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL2NvbXAxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvY29tcDIuZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC9jb21wMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NTllYjEuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9jb21wMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL2NvbXByZXNzZWQuZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC9jb21wcmVzc2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNiMTU2MC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL2NvbXByZXNzZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9jb250aW51ZWQuZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC9jb250aW51ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWM5ZjJjLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvY29udGludWVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvZGlyLmdpZiBiL2RvY3MvaWNvbnMvc21hbGwvZGlyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzN2IwOS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL2Rpci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL2RpcjIuZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC9kaXIyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI1ZDZlNC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL2RpcjIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9kb2MuZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC9kb2MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmNmMThkLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvZG9jLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvZm9yd2FyZC5naWYgYi9kb2NzL2ljb25zL3NtYWxsL2ZvcndhcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTk3NDY2Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvZm9yd2FyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL2dlbmVyaWMuZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC9nZW5lcmljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhkYTZmZi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL2dlbmVyaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9nZW5lcmljMi5naWYgYi9kb2NzL2ljb25zL3NtYWxsL2dlbmVyaWMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkyZjEzMy4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL2dlbmVyaWMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvZ2VuZXJpYzMuZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC9nZW5lcmljMy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YWEyNzUuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9nZW5lcmljMy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL2ltYWdlLmdpZiBiL2RvY3MvaWNvbnMvc21hbGwvaW1hZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzNkOTVjLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvaW1hZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9pbWFnZTIuZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC9pbWFnZTIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWM0MGYxLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvaW1hZ2UyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvaW5kZXguZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC9pbmRleC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNmRmNmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9pbmRleC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL2tleS5naWYgYi9kb2NzL2ljb25zL3NtYWxsL2tleS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZmQ2YzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9rZXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9tb3ZpZS5naWYgYi9kb2NzL2ljb25zL3NtYWxsL21vdmllLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0YTQyZS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NtYWxsL21vdmllLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvcGF0Y2guZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC9wYXRjaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMDQ4NGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9wYXRjaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL3BzLmdpZiBiL2RvY3MvaWNvbnMvc21hbGwvcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTRiY2ZjLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC9yYWluYm93LmdpZiBiL2RvY3MvaWNvbnMvc21hbGwvcmFpbmJvdy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMTZiODkuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9yYWluYm93LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvc291bmQuZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC9zb3VuZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YTg5ZmYuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9zb3VuZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL3NvdW5kMi5naWYgYi9kb2NzL2ljb25zL3NtYWxsL3NvdW5kMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NzA2ZTAuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC9zb3VuZDIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC90YXIuZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC90YXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWMzZmZiLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvdGFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvdGV4dC5naWYgYi9kb2NzL2ljb25zL3NtYWxsL3RleHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmNlZWZiLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvdGV4dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NtYWxsL3RyYW5zZmVyLmdpZiBiL2RvY3MvaWNvbnMvc21hbGwvdHJhbnNmZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDYwZDNmLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc21hbGwvdHJhbnNmZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zbWFsbC91bmtub3duLmdpZiBiL2RvY3MvaWNvbnMvc21hbGwvdW5rbm93bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZjBiYmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC91bmtub3duLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc21hbGwvdXUuZ2lmIGIvZG9jcy9pY29ucy9zbWFsbC91dS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNzkzZjguLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zbWFsbC91dS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NvdW5kMS5naWYgYi9kb2NzL2ljb25zL3NvdW5kMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZmI0OWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy9zb3VuZDEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy9zb3VuZDIuZ2lmIGIvZG9jcy9pY29ucy9zb3VuZDIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGU2YTdmLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc291bmQyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvc3BoZXJlMS5naWYgYi9kb2NzL2ljb25zL3NwaGVyZTEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDY3MDcwLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvc3BoZXJlMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3NwaGVyZTIuZ2lmIGIvZG9jcy9pY29ucy9zcGhlcmUyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTllNDYyYS4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3NwaGVyZTIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy90YXIuZ2lmIGIvZG9jcy9pY29ucy90YXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDMyYzFiLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvdGFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvdGV4LmdpZiBiL2RvY3MvaWNvbnMvdGV4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVlNDMyMy4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3RleC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3RleHQuZ2lmIGIvZG9jcy9pY29ucy90ZXh0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM2MjM5MC4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3RleHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy90cmFuc2Zlci5naWYgYi9kb2NzL2ljb25zL3RyYW5zZmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM2OTdkYi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3RyYW5zZmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvdW5rbm93bi5naWYgYi9kb2NzL2ljb25zL3Vua25vd24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmIxZWEyLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvdW5rbm93bi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3VwLmdpZiBiL2RvY3MvaWNvbnMvdXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDZkNmQxLi4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvdXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy91dS5naWYgYi9kb2NzL2ljb25zL3V1LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM4N2Q1Mi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3V1LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaWNvbnMvdXVlbmNvZGVkLmdpZiBiL2RvY3MvaWNvbnMvdXVlbmNvZGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM4N2Q1Mi4uMDAwMDAwMAotLS0gYS9kb2NzL2ljb25zL3V1ZW5jb2RlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2ljb25zL3dvcmxkMS5naWYgYi9kb2NzL2ljb25zL3dvcmxkMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YjRlYzIuLjAwMDAwMDAKLS0tIGEvZG9jcy9pY29ucy93b3JsZDEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9pY29ucy93b3JsZDIuZ2lmIGIvZG9jcy9pY29ucy93b3JsZDIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzIwM2Y3Li4wMDAwMDAwCi0tLSBhL2RvY3MvaWNvbnMvd29ybGQyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvbWFuL2FiLjggYi9kb2NzL21hbi9hYi44CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmRhMjFjLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFuL2FiLjgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLlRIIGFiIDEgIk1hcmNoIDE5OTgiCi0uXCIgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5cIgotLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotLlwiIGFyZSBtZXQ6Ci0uXCIKLS5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0uXCIKLS5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotLlwiICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS5cIiAgICBkaXN0cmlidXRpb24uCi0uXCIKLS5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLS5cIiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLS5cIiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0uXCIgICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLS5cIgotLlwiIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLS5cIiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotLlwiICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS5cIgotLlwiIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0uXCIgICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0uXCIgICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotLlwiCi0uXCIgNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotLlwiICAgIGFja25vd2xlZGdtZW50OgotLlwiICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLS5cIiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotLlwiCi0uXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0uXCIgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotLlwiIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0uXCIgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLlwiIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotLlwiIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotLlwiIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0uXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotLlwiIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLS5cIiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0uXCIgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLlwiID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0uXCIKLS5cIiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotLlwiIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotLlwiIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotLlwiIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLS5cIiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0uXCIgcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0uU0ggTkFNRQotYWIgXC0gQXBhY2hlIEhUVFAgc2VydmVyIGJlbmNobWFya2luZyB0b29sCi0uU0ggU1lOT1BTSVMKLS5CIGFiIAotWwotLkIgXC1rCi1dIFsKLS5CSSBcLW4gIiByZXF1ZXN0cyIKLV0gWwotLkJJIFwtdCAiIHRpbWVsaW1pdCIKLV0gWwotLkJJIFwtYyAiIGNvbmN1cnJlbmN5IgotXSBbCi0uQkkgXC1wICIgUE9TVCBmaWxlIgotXSBbCi0uQkkgXC1BICIgQXV0aGVudGljYXRlIHVzZXJuYW1lOnBhc3N3b3JkIgotXSBbCi0uQkkgXC1QICIgUHJveHkgQXV0aGVudGljYXRlIHVzZXJuYW1lOnBhc3N3b3JkIgotXSBbCi0uQkkgXC1IICIgQ3VzdG9tIGhlYWRlciIKLV0gWwotLkJJIFwtQyAiIENvb2tpZSBuYW1lPXZhbHVlIgotXSBbCi0uQkkgXC1UICIgY29udGVudC10eXBlIgotXSBbCi0uQkkgXC12ICIgdmVyYm9zaXR5IgotXQotXSBbCi0uQkkgXC13ICIgb3V0cHV0IEhUTUwiCi1dCi1dIFsKLS5CSSBcLXggIiA8dGFibGU+IGF0dHJpYnV0ZXMiCi1dCi1dIFsKLS5CSSBcLXkgIiA8dHI+IGF0dHJpYnV0ZXMiCi1dCi1dIFsKLS5CSSBcLXogIiA8dGQ+IGF0dHJpYnV0ZXMiCi1dCi0uSSBbaHR0cDovL11ob3N0bmFtZVs6cG9ydF0vcGF0aCAKLQotLkIgYWIKLVsKLS5CIFwtVgotXSBbCi0uQiBcLWggCi1dCi0uUFAKLS5TSCBERVNDUklQVElPTgotLkIgYWIKLWlzIGEgdG9vbCBmb3IgYmVuY2htYXJraW5nIHlvdXIgQXBhY2hlIEh5cGVyVGV4dCBUcmFuc2ZlciBQcm90b2NvbCAoSFRUUCkKLXNlcnZlci4gSXQgaXMgZGVzaWduZWQgdG8gZ2l2ZSB5b3UgYW4gaW1wcmVzc2lvbiBvbiBob3cgcGVyZm9ybWFudCBpcyB5b3VyCi1jdXJyZW50IEFwYWNoZSBpbnN0YWxsYXRpb24uICBUaGlzIGVzcGVjaWFsbHkgc2hvd3MgeW91IGhvdyBtdWNoIHJlcXVlc3RzIHBlcgotdGltZSB5b3VyIEFwYWNoZSBpbnN0YWxsYXRpb24gaXMgY2FwYWJsZSB0byBzZXJ2ZS4gCi0uUFAKLS5TSCBPUFRJT05TCi0uVFAgMTIKLS5CIFwtayAKLUVuYWJsZSB0aGUgSFRUUCBLZWVwQWxpdmUgZmVhdHVyZSwgaS5lLiBwZXJmb3JtIG11bHRpcGxlIHJlcXVlc3RzIHdpdGhpbiBvbmUKLUhUVFAgc2Vzc2lvbiBpbnN0ZWFkLiBEZWZhdWx0IGlzIG5vIEtlZXBBbGl2ZS4KLS5UUCAxMgotLkJJIFwtbiAiIHJlcXVlc3RzIgotTnVtYmVyIG9mIHJlcXVlc3RzIHRvIHBlcmZvcm0gZm9yIHRoZSBiZW5jaG1hcmtpbmcgc2Vzc2lvbi4gIFRoZSBkZWZhdWx0IGlzIHRvCi1qdXN0IHBlcmZvcm0gb25lIHNpbmdsZSByZXF1ZXN0IHdoaWNoIHVzdWFsbHkgbGVhZHMgdG8gbm90IHZlcnkgcmVwcmVzZW50YXRpdmUKLWJlbmNobWFya2luZyByZXN1bHRzLgotLlRQIDEyCi0uQkkgXC10ICIgdGltZWxpbWl0IgotU2Vjb25kcyB0byBtYXguIHNwZW5kIGZvciBiZW5jaG1hcmtpbmcuIFRoaXMgaW1wbGllcwotYSAKLS5CIFwtbiAKLS5CIDUwMDAwCi1pbnRlcm5hbGx5LiBVc2UgdGhpcyB0byBiZW5jaG1hcmsgdGhlIHNlcnZlciB3aXRoaW4gYSBmaXhlZCB0b3RhbCBhbW91bnQgb2YKLXRpbWUuICBQZXIgZGVmYXVsdCB0aGVyZSBpcyBubyB0aW1lbGltaXQuIAotLlRQIDEyCi0uQkkgXC1jICIgY29uY3VycmVuY3kiCi1OdW1iZXIgb2YgbXVsdGlwbGUgcmVxdWVzdHMgcGVyIHRpbWUgdG8gcGVyZm9ybS4gCi1EZWZhdWx0IGlzIG9uZSByZXF1ZXN0IHBlciB0aW1lLgotCi0uVFAgMTIKLS5CSSBcLXAgIiBQT1NUIGZpbGUiCi1GaWxlIGNvbnRhaW5pbmcgZGF0YSB0byBQT1NULgotCi0uVFAgMTIKLS5CSSBcLUEgIiBBdXRob3JpemF0aW9uIHVzZXJuYW1lOnBhc3N3b3JkIgotU3VwcGx5IEJBU0lDIEF1dGhlbnRpZmljYXRpb24gY3JlZGVudGlhbHMgdG8gdGhlIHNlcnZlci4gVGhlIHVzZXJuYW1lCi1hbmQgcGFzc3dvcmQgYXJlIHNlcGFyYXRlZCBieSBhIHNpbmdsZSAnOicgYW5kIHNlbmQgb24gdGhlIHdpcmUgdXVlbmNvZGVkLgotVGhlIHN0cmluZyBpcyBzZW5kIHJlZ2FyZGxlc3Mgb2Ygd2V0aGVyIHRoZSBzZXJ2ZXIgbmVlZHMgaXQ7IChpLmUuIGhhcwotc2VuZCBhbiA0MDEuIEF1dGhlbnRpZmNhdGlvbiBuZWVkZWQpLgotCi0uVFAgMTIKLS5CSSBcLXAgIiBQcm94eS1BdXRob3JpemF0aW9uIHVzZXJuYW1lOnBhc3N3b3JkIgotU3VwcGx5IEJBU0lDIEF1dGhlbnRpZmljYXRpb24gY3JlZGVudGlhbHMgdG8gYSBwcm94eSBlbi1yb3V0ZS4gVGhlIHVzZXJuYW1lCi1hbmQgcGFzc3dvcmQgYXJlIHNlcGFyYXRlZCBieSBhIHNpbmdsZSAnOicgYW5kIHNlbmQgb24gdGhlIHdpcmUgdXVlbmNvZGVkLgotVGhlIHN0cmluZyBpcyBzZW5kIHJlZ2FyZGxlc3Mgb2Ygd2V0aGVyIHRoZSBwcm94eSBuZWVkcyBpdDsgKGkuZS4gaGFzCi1zZW5kIGFuIDQwNyBQcm94eSBhdXRoZW50aWZjYXRpb24gbmVlZGVkKS4KLQotLlRQIDEyCi0uQkkgXC1DICIgQ29va2llIG5hbWU9dmFsdWUiCi1BZGQgYSAnQ29va2llOicgbGluZSB0byB0aGUgcmVxdWVzdC4gVGhlIGFyZ3VtZW50IGlzIHR5cGljYWxseSBpbiB0aGUgZm9ybQotb2YgYSAnbmFtZT12YWx1ZScgcGFpci4gVGhpcyBmaWVsZCBpcyByZXBlYXRhYmxlLgotCi0uVFAgMTIKLS5CSSBcLXAgIiBIZWFkZXIgc3RyaW5nIgotUG9zdGZpeCBleHRyYSBoZWFkZXJzIHRvIHRoZSByZXF1ZXN0LiBUaGUgYXJndW1lbnQgaXMgdHlwaWNhbGx5IGluIHRoZSBmb3JtCi1vZiBhIHZhbGlkIGhlYWRlciBsaW5lOyBjb250YWluaW5nIGEgY29sb24gc2VwYXJhdGVkIGZpZWxkIHZhbHVlIHBhaXIuIChpLmUuIAotJ0FjY2VwdC1FbmNvZGluZzogemlwL3pvcDs4Yml0JykuCi0KLS5UUCAxMgotLkJJIFwtVCAiIGNvbnRlbnQtdHlwZSIKLUNvbnRlbnQtdHlwZSBoZWFkZXIgdG8gdXNlIGZvciBQT1NUIGRhdGEuCi0KLS5UUCAxMgotLkIgXC12IAotU2V0IHZlcmJvc2l0eSBsZXZlbCAtIDQgYW5kIGFib3ZlIHByaW50cyBpbmZvcm1hdGlvbiBvbiBoZWFkZXJzLCAzIGFuZAotYWJvdmUgcHJpbnRzIHJlc3BvbnNlIGNvZGVzICg0MDQsIDIwMCwgZXRjLiksIDIgYW5kIGFib3ZlIHByaW50cwotd2FybmluZ3MgYW5kIGluZm8uCi0KLS5UUCAxMgotLkJJIFwtdwotUHJpbnQgb3V0IHJlc3VsdHMgaW4gSFRNTCB0YWJsZXMuICBEZWZhdWx0IHRhYmxlIGlzIHR3byBjb2x1bW5zIHdpZGUsCi13aXRoIGEgd2hpdGUgYmFja2dyb3VuZC4KLS5UUCAxMgotLkJJIFwteCAiIGF0dHJpYnV0ZXMiCi1TdHJpbmcgdG8gdXNlIGFzIGF0dHJpYnV0ZXMgZm9yIDx0YWJsZT4uICBBdHRyaWJ1dGVzIGFyZSBpbnNlcnRlZAotPHRhYmxlIAotLkIgaGVyZQotPgotLlRQIDEyCi0uQkkgXC15ICIgYXR0cmlidXRlcyIKLVN0cmluZyB0byB1c2UgYXMgYXR0cmlidXRlcyBmb3IgPHRyPi4KLS5UUCAxMgotLkJJIFwteiAiIGF0dHJpYnV0ZXMiCi1TdHJpbmcgdG8gdXNlIGFzIGF0dHJpYnV0ZXMgZm9yIDx0ZD4uCi0uVFAgMTIKLS5CIFwtVgotRGlzcGxheSB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdC4KLS5UUCAxMgotLkIgXC1oIAotRGlzcGxheSB1c2FnZSBpbmZvcm1hdGlvbi4KLS5QRAotLlNIIEJVR1MKLVRoZXJlIGFyZSB2YXJpb3VzIHN0YXRpY2FsbHkgZGVjbGFyZWQgYnVmZmVycyBvZiBmaXhlZCBsZW5ndGguIENvbWJpbmVkCi13aXRoIHRoZSBsYXp5IHBhcnNpbmcgb2YgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMsIHRoZSByZXNwb25zZSBoZWFkZXJzCi1mcm9tIHRoZSBzZXJ2ZXIgYW5kIG90aGVyIGV4dGVybmFsIGlucHV0cyB0aGlzIG1pZ2h0IGJpdGUgeW91LgotLlAKLUl0IGRvZXMgbm90IGltcGxlbWVudCBIVFRQLzEueCBmdWxseTsgb25seSBhY2NlcHRzIHNvbWUgJ2V4cGVjdGVkJyBmb3Jtcwotb2YgcmVzcG9uc2VzLiBUaGUgcmF0aGVyIGhlYXZ5IHVzZSBvZiAKLS5CUiBzdHJzdHIoMykKLXNob3dzIHVwIHRvcCBpbiBwcm9maWxlLAotd2hpY2ggbWlnaHQgaW5kaWNhdGUgYSBwZXJmb3JtYW5jZSBwcm9ibGVtOyBpLmUuIHlvdSB3b3VsZCBtZWFzdXJlIHRoZQotLkJSIGFiCi1wZXJmb3JtYW5jZSByYXRoZXIgdGhhbiB0aGUgc2VydmVyJ3MuCi0KLS5TSCBTRUUgQUxTTwotLkJSIGh0dHBkKDgpCi0uCmRpZmYgLS1naXQgYS9kb2NzL21hbi9hcGFjaGVjdGwuOCBiL2RvY3MvbWFuL2FwYWNoZWN0bC44CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjMwMGViLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFuL2FwYWNoZWN0bC44CisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS5USCBhcGFjaGVjdGwgMSAiU2VwdGVtYmVyIDE5OTciCi0uXCIgQ29weXJpZ2h0IChjKSAxOTk3LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5cIgotLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotLlwiIGFyZSBtZXQ6Ci0uXCIKLS5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0uXCIKLS5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotLlwiICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS5cIiAgICBkaXN0cmlidXRpb24uCi0uXCIKLS5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLS5cIiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLS5cIiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0uXCIgICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLS5cIgotLlwiIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLS5cIiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotLlwiICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS5cIgotLlwiIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0uXCIgICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0uXCIgICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotLlwiCi0uXCIgNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotLlwiICAgIGFja25vd2xlZGdtZW50OgotLlwiICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLS5cIiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotLlwiCi0uXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0uXCIgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotLlwiIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0uXCIgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLlwiIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotLlwiIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotLlwiIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0uXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotLlwiIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLS5cIiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0uXCIgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLlwiID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0uXCIKLS5cIiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotLlwiIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotLlwiIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotLlwiIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLS5cIiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0uXCIgcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0uU0ggTkFNRQotYXBhY2hlY3RsIFwtIEFwYWNoZSBIVFRQIHNlcnZlciBjb250cm9sIGludGVyZmFjZQotLlNIIFNZTk9QU0lTCi0uQiBhcGFjaGVjdGwgCi1cZkljb21tYW5kXGZQIFsuLi5dCi0uU0ggREVTQ1JJUFRJT04KLS5CIGFwYWNoZWN0bAotaXMgYSBmcm9udCBlbmQgdG8gdGhlIEFwYWNoZSBIeXBlclRleHQgVHJhbnNmZXIgUHJvdG9jb2wgKEhUVFApIAotc2VydmVyLiAgSXQgaXMgZGVzaWduZWQgdG8gaGVscCB0aGUgYWRtaW5pc3RyYXRvciBjb250cm9sIHRoZSAKLWZ1bmN0aW9uaW5nIG9mIHRoZSBBcGFjaGUgCi0uQiBodHRwZAotZGFlbW9uLiAgCi0uUFAKLS5CIE5PVEU6IAotSWYgeW91ciBBcGFjaGUgaW5zdGFsbGF0aW9uIHVzZXMgbm9uLXN0YW5kYXJkIHBhdGhzLCB5b3Ugd2lsbCBuZWVkIHRvIAotZWRpdCB0aGUgCi0uQiBhcGFjaGVjdGwKLXNjcmlwdCB0byBzZXQgdGhlIGFwcHJvcHJpYXRlIHBhdGhzIHRvIHlvdXIgUElEIGZpbGUgYW5kIHlvdXIgCi0uQiBodHRwZAotYmluYXJ5LiAgU2VlIHRoZSBjb21tZW50cyBpbiB0aGUgc2NyaXB0IGZvciBkZXRhaWxzLgotLlBQCi1UaGUgCi0uQiBhcGFjaGVjdGwKLXNjcmlwdCByZXR1cm5zIGEgMCBleGl0IHZhbHVlIG9uIHN1Y2Nlc3MsIGFuZCA+MCBpZiBhbiBlcnJvciAKLW9jY3Vycy4gIEZvciBtb3JlIGRldGFpbHMsIHZpZXcgdGhlIGNvbW1lbnRzIGluIHRoZSBzY3JpcHQuCi0uUFAKLUZ1bGwgZG9jdW1lbnRhdGlvbiBmb3IgQXBhY2hlIGlzIGF2YWlsYWJsZSBhdCAKLS5CIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8KLS4KLS5TSCBPUFRJT05TCi1UaGUgXGZJY29tbWFuZFxmUCBjYW4gYmUgYW55IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKLS5UUCAxMgotLkJJIHN0YXJ0Ci1TdGFydCB0aGUgQXBhY2hlIGRhZW1vbi4gIEdpdmVzIGFuIGVycm9yIGlmIGl0IGlzIGFscmVhZHkgcnVubmluZy4KLS5UUAotLkJJIHN0b3AKLVN0b3BzIHRoZSBBcGFjaGUgZGFlbW9uLgotLlRQCi0uQkkgcmVzdGFydAotUmVzdGFydHMgdGhlIEFwYWNoZSBkYWVtb24gYnkgc2VuZGluZyBpdCBhIFNJR0hVUC4gIElmIHRoZSBkYWVtb24KLWlzIG5vdCBydW5uaW5nLCBpdCBpcyBzdGFydGVkLgotVGhpcyBjb21tYW5kIGF1dG9tYXRpY2FsbHkgY2hlY2tzIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIHZpYSAKLS5CSSBjb25maWd0ZXN0Ci1iZWZvcmUgaW5pdGlhdGluZyB0aGUgcmVzdGFydCB0byBtYWtlIHN1cmUgQXBhY2hlIGRvZXNuJ3QgZGllLgotLlRQCi0uQkkgZnVsbHN0YXR1cwotRGlzcGxheXMgYSBmdWxsIHN0YXR1cyByZXBvcnQgZnJvbSAKLS5CIG1vZF9zdGF0dXMuIAotRm9yIHRoaXMgdG8gd29yaywgeW91IG5lZWQgdG8gaGF2ZSBtb2Rfc3RhdHVzIGVuYWJsZWQgb24geW91ciBzZXJ2ZXIgCi1hbmQgYSB0ZXh0LWJhc2VkIGJyb3dzZXIgc3VjaCBhcyBcZklseW54XGZQIGF2YWlsYWJsZSBvbiB5b3VyIHN5c3RlbS4gIFRoZQotVVJMIHVzZWQgdG8gYWNjZXNzIHRoZSBzdGF0dXMgcmVwb3J0IGNhbiBiZSBzZXQgYnkgZWRpdGluZyB0aGUKLS5CIFNUQVRVU1VSTAotdmFyaWFibGUgaW4gdGhlIHNjcmlwdC4KLS5UUAotLkJJIHN0YXR1cwotRGlzcGxheXMgYSBicmllZiBzdGF0dXMgcmVwb3J0LiAgU2ltaWxhciB0byB0aGUgZnVsbHN0YXR1cyBvcHRpb24sCi1leGNlcHQgdGhhdCB0aGUgbGlzdCBvZiByZXF1ZXN0cyBjdXJyZW50bHkgYmVpbmcgc2VydmVkIGlzIG9taXR0ZWQuCi0uVFAKLS5CSSBncmFjZWZ1bAotR3JhY2VmdWxseSByZXN0YXJ0cyB0aGUgQXBhY2hlIGRhZW1vbiBieSBzZW5kaW5nIGl0IGEgU0lHVVNSMS4gIElmCi10aGUgZGFlbW9uIGlzIG5vdCBydW5uaW5nLCBpdCBpcyBzdGFydGVkLiAgVGhpcyBkaWZmZXJzIGZyb20gYQotbm9ybWFsIHJlc3RhcnQgaW4gdGhhdCBjdXJyZW50bHkgb3BlbiBjb25uZWN0aW9ucyBhcmUgbm90IGFib3J0ZWQuCi1BIHNpZGUgZWZmZWN0IGlzIHRoYXQgb2xkIGxvZyBmaWxlcyB3aWxsIG5vdCBiZSBjbG9zZWQgaW1tZWRpYXRlbHkuCi1UaGlzIG1lYW5zIHRoYXQgaWYgdXNlZCBpbiBhIGxvZyByb3RhdGlvbiBzY3JpcHQsIGEgc3Vic3RhbnRpYWwgZGVsYXkgbWF5IGJlCi1uZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIG9sZCBsb2cgZmlsZXMgYXJlIGNsb3NlZCBiZWZvcmUgcHJvY2Vzc2luZyB0aGVtLgotVGhpcyBjb21tYW5kIGF1dG9tYXRpY2FsbHkgY2hlY2tzIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIHZpYSAKLS5CSSBjb25maWd0ZXN0Ci1iZWZvcmUgaW5pdGlhdGluZyB0aGUgcmVzdGFydCB0byBtYWtlIHN1cmUgQXBhY2hlIGRvZXNuJ3QgZGllLgotLlRQCi0uQkkgY29uZmlndGVzdAotUnVuIGEgY29uZmlndXJhdGlvbiBmaWxlIHN5bnRheCB0ZXN0LiBJdCBwYXJzZXMgdGhlIGNvbmZpZ3VyYXRpb24KLWZpbGVzIGFuZCBlaXRoZXIgcmVwb3J0cyAKLS5CICJTeW50YXggT2siCi1vciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFydGljdWxhciBzeW50YXggZXJyb3IuCi0uVFAKLS5CSSBoZWxwCi1EaXNwbGF5cyBhIHNob3J0IGhlbHAgbWVzc2FnZS4KLS5TSCBTRUUgQUxTTwotLkJSIGh0dHBkKDgpCi0uCmRpZmYgLS1naXQgYS9kb2NzL21hbi9hcHhzLjggYi9kb2NzL21hbi9hcHhzLjgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NDc2NmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW4vYXB4cy44CisrKyAvZGV2L251bGwKQEAgLTEsNDU5ICswLDAgQEAKLS5USCBhcHhzIDggIkFwcmlsIDE5OTgiCi0uXCIgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5cIgotLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotLlwiIGFyZSBtZXQ6Ci0uXCIKLS5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0uXCIKLS5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotLlwiICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS5cIiAgICBkaXN0cmlidXRpb24uCi0uXCIKLS5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLS5cIiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLS5cIiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0uXCIgICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLS5cIgotLlwiIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLS5cIiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotLlwiICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS5cIgotLlwiIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0uXCIgICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0uXCIgICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotLlwiCi0uXCIgNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotLlwiICAgIGFja25vd2xlZGdtZW50OgotLlwiICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLS5cIiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotLlwiCi0uXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0uXCIgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotLlwiIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0uXCIgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLlwiIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotLlwiIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotLlwiIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0uXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotLlwiIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLS5cIiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0uXCIgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLlwiID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0uXCIKLS5cIiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotLlwiIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotLlwiIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotLlwiIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLS5cIiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0uXCIgcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0uU0ggTkFNRQotYXB4cyBcLSBBUGFjaGUgZVh0ZW5TaW9uIHRvb2wKLS5TSCBTWU5PUFNJUwotLkIgYXB4cwotLkIgXC1nCi1bCi0uQkkgXC1TICIgbmFtZT12YWx1ZQotXQotLkJJIFwtbiAiIG1vZG5hbWUiCi0KLS5CIGFweHMKLS5CIFwtcQotWwotLkJJIFwtUyAiIG5hbWU9dmFsdWUKLV0KLS5JUiBxdWVyeSAiIC4uLiIKLQotLkIgYXB4cwotLkIgXC1jCi1bCi0uQkkgXC1TICIgbmFtZT12YWx1ZQotXQotWwotLkJJIFwtbyAiIGRzb2ZpbGUiCi1dCi1bCi0uQkkgXC1JICIgaW5jZGlyIgotXQotWwotLkJJIFwtRCAiIG5hbWU9dmFsdWUiCi1dCi1bCi0uQkkgXC1MICIgbGliZGlyIgotXQotWwotLkJJIFwtbCAiIGxpYm5hbWUiCi1dCi1bCi0uQkkgXC1XYywgImNvbXBpbGVyLWZsYWdzIgotXQotWwotLkJJIFwtV2wsICJsaW5rZXItZmxhZ3MiCi1dCi0uSVIgZmlsZXMgIiAuLi4iCi0KLS5CIGFweHMKLS5CIFwtaQotWwotLkJJIFwtUyAiIG5hbWU9dmFsdWUKLV0KLVsKLS5CSSBcLW4gIiBtb2RuYW1lIgotXQotWwotLkIgXC1hCi1dCi1bCi0uQiBcLUEKLV0KLS5JUiBkc29maWxlICIgLi4uIgotCi0uQiBhcHhzCi0uQiBcLWUKLVsKLS5CSSBcLVMgIiBuYW1lPXZhbHVlCi1dCi1bCi0uQkkgXC1uICIgbW9kbmFtZSIKLV0KLVsKLS5CIFwtYQotXQotWwotLkIgXC1BCi1dCi0uSVIgZHNvZmlsZSAiIC4uLiIKLS5QUAotLlNIIERFU0NSSVBUSU9OCi0uQiBhcHhzCi1pcyBhIHRvb2wgZm9yIGJ1aWxkaW5nIGFuZCBpbnN0YWxsaW5nIGV4dGVuc2lvbiBtb2R1bGVzIGZvciB0aGUgQXBhY2hlCi1IeXBlclRleHQgVHJhbnNmZXIgUHJvdG9jb2wgKEhUVFApIHNlcnZlci4gVGhpcyBpcyBhY2hpZXZlZCBieSBidWlsZGluZyBhCi1keW5hbWljIHNoYXJlZCBvYmplY3QgKERTTykgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb3Igb2JqZWN0Ci0uSSBmaWxlcwotd2hpY2ggdGhlbiBjYW4gYmUgbG9hZGVkIGludG8KLXRoZSBBcGFjaGUgc2VydmVyIHVuZGVyIHJ1bnRpbWUgdmlhIHRoZQotLkIgTG9hZE1vZHVsZQotZGlyZWN0aXZlIGZyb20KLS5CUiBtb2Rfc28uCi0KLVNvIHRvIHVzZSB0aGlzIGV4dGVuc2lvbiBtZWNoYW5pc20geW91ciBwbGF0Zm9ybSBoYXMKLXRvIHN1cHBvcnQgdGhlIERTTyBmZWF0dXJlIGFuZCB5b3VyCi1BcGFjaGUKLS5CIGh0dHBkCi1iaW5hcnkgaGFzIHRvIGJlIGJ1aWx0IHdpdGggdGhlCi0uQiBtb2Rfc28KLW1vZHVsZS4KLVRoZQotLkIgYXB4cwotdG9vbCBhdXRvbWF0aWNhbGx5IGNvbXBsYWlucyBpZiB0aGlzIGlzIG5vdCB0aGUgY2FzZS4KLVlvdSBjYW4gY2hlY2sgdGhpcyB5b3Vyc2VsZiBieSBtYW51YWxseSBydW5uaW5nIHRoZSBjb21tYW5kCi0KLS5uZgotICAkIGh0dHBkIC1sCi0uZmkKLQotVGhlIG1vZHVsZQotLkIgbW9kX3NvCi1zaG91bGQgYmUgcGFydCBvZiB0aGUgZGlzcGxheWVkIGxpc3QuCi1JZiB0aGVzZSByZXF1aXJlbWVudHMgYXJlIGZ1bGZpbGxlZCB5b3UgY2FuIGVhc2lseSBleHRlbmQKLXlvdXIgQXBhY2hlIHNlcnZlcidzIGZ1bmN0aW9uYWxpdHkgYnkgaW5zdGFsbGluZyB5b3VyIG93bgotbW9kdWxlcyB3aXRoIHRoZSBEU08gbWVjaGFuaXNtIGJ5IHRoZSBoZWxwIG9mIHRoaXMKLS5CIGFweHMKLXRvb2w6Ci0KLS5uZgotICAkIGFweHMgLWkgLWEgLWMgbW9kX2Zvby5jCi0gIGdjYyAtZnBpYyAtRFNIQVJFRF9NT0RVTEUgLUkvcGF0aC90by9hcGFjaGUvaW5jbHVkZSAtYyBtb2RfZm9vLmMKLSAgbGQgLUJzaGFyZWFibGUgLW8gbW9kX2Zvby5zbyBtb2RfZm9vLm8KLSAgY3AgbW9kX2Zvby5zbyAvcGF0aC90by9hcGFjaGUvbGliZXhlYy9tb2RfZm9vLnNvCi0gIGNobW9kIDc1NSAvcGF0aC90by9hcGFjaGUvbGliZXhlYy9tb2RfZm9vLnNvCi0gIFthY3RpdmF0aW5nIG1vZHVsZSBgZm9vJyBpbiAvcGF0aC90by9hcGFjaGUvZXRjL2h0dHBkLmNvbmZdCi0gICQgYXBhY2hlY3RsIHJlc3RhcnQKLSAgL3BhdGgvdG8vYXBhY2hlL3NiaW4vYXBhY2hlY3RsIHJlc3RhcnQ6IGh0dHBkIG5vdCBydW5uaW5nLCB0cnlpbmcgdG8gc3RhcnQKLSAgW1R1ZSBNYXIgMzEgMTE6Mjc6NTUgMTk5OF0gW2RlYnVnXSBtb2Rfc28uYygzMDMpOiBsb2FkZWQgbW9kdWxlIGZvb19tb2R1bGUKLSAgL3BhdGgvdG8vYXBhY2hlL3NiaW4vYXBhY2hlY3RsIHJlc3RhcnQ6IGh0dHBkIHN0YXJ0ZWQKLSAgJCBfCi0uZmkKLQotVGhlIGFyZ3VtZW50cwotLkkgZmlsZXMKLWNhbiBiZSBhbnkgQyBzb3VyY2UgZmlsZSAoLmMpLCBhIG9iamVjdCBmaWxlICgubykgb3IKLWV2ZW4gYSBsaWJyYXJ5IGFyY2hpdmUgKC5hKS4gVGhlCi0uQiBhcHhzCi10b29sIGF1dG9tYXRpY2FsbHkgcmVjb2duaXplcyB0aGVzZSBleHRlbnNpb25zIGFuZCBhdXRvbXRhaWNhbGx5IHVzZWQgdGhlIEMKLXNvdXJjZSBmaWxlcyBmb3IgY29tcGlsYXRpb24gd2hpbGUganVzdCB1c2luZyB0aGUgb2JqZWN0IGFuZCBhcmNoaXZlIGZpbGVzIGZvcgotdGhlIGxpbmtpbmcgcGhhc2UuIEJ1dCB3aGVuIHVzaW5nIHN1Y2ggcHJlLWNvbXBpbGVkIG9iamVjdHMgbWFrZSBzdXJlIHRoZXkgYXJlCi1jb21waWxlZCBmb3IgcG9zaXRpb24gaW5kZXBlbmRlbmQgY29kZSAoUElDKSB0byBiZSBhYmxlIHRvIHVzZSB0aGVtIGZvciBhCi1keW5hbWljYWxseSBsb2FkZWQgc2hhcmVkIG9iamVjdC4KLUZvciBpbnN0YW5jZSB3aXRoIEdDQyB5b3UgYWx3YXlzIGp1c3QgaGF2ZSB0byB1c2UKLS5CUiAtZnBpYyAuCi1Gb3Igb3RoZXIKLUMgY29tcGlsZXJzIGNvbnN1bHQgaXRzIG1hbnVhbAotcGFnZSBvciBhdCB3YXRjaCBmb3IgdGhlIGZsYWdzCi0uQiBhcHhzCi11c2VzIHRvIGNvbXBpbGUgdGhlIG9iamVjdCBmaWxlcy4KLQotRm9yIG1vcmUgZGV0YWlscyBhYm91dCBEU08gc3VwcG9ydCBpbiBBcGFjaGUgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbgotb2YKLS5CIG1vZF9zbwotb3IgcGVyaGFwcyBldmVuIHJlYWQgdGhlCi0uQiBzcmMvbW9kdWxlcy9zdGFuZGFyZC9tb2Rfc28uYwotc291cmNlIGZpbGUuCi0KLS5QUAotLlNIIE9QVElPTlMKLUNvbW1vbiBvcHRpb25zOgotLlRQIDEyCi0uQkkgXC1uICIgbW9kbmFtZSIKLVRoaXMgZXhwbGljaXRseSBzZXRzIHRoZSBtb2R1bGUgbmFtZSBmb3IgdGhlCi0uQiBcLWkKLShpbnN0YWxsKQotYW5kCi0uQiBcLWcKLSh0ZW1wbGF0ZSBnZW5lcmF0aW9uKSBvcHRpb24uIFVzZSB0aGlzIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgbW9kdWxlIG5hbWUuCi1Gb3Igb3B0aW9uCi0uQiBcLWcKLXRoaXMgaXMgcmVxdWlyZWQsIGZvciBvcHRpb24KLS5CIFwtaQotdGhlCi0uQiBhcHhzCi10b29sIHRyaWVzIHRvIGRldGVybWluZSB0aGUgbmFtZSBmcm9tIHRoZSBzb3VyY2Ugb3IgKGFzIGEgZmFsbGJhY2spIGF0IGxlYXN0Ci1ieSBndWVzc2luZyBpdCBmcm9tIHRoZSBmaWxlbmFtZS4KLS5QUAotUXVlcnkgb3B0aW9uczoKLS5UUCAxMgotLkIgXC1xIAotUGVyZm9ybXMgYSBxdWVyeSBmb3IgCi0uQlIgYXB4cyAncwota25vd2xlZGdlIGFib3V0IGNlcnRhaW4gc2V0dGluZ3MuIFRoZQotLkkgcXVlcnkKLXBhcmFtZXRlcnMgY2FuIGJlIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgc3RyaW5nczoKLS5uZgotICBDQyAgICAgICAgICAgICAgVEFSR0VUCi0gIENGTEFHUyAgICAgICAgICBTQklORElSICAgIAotICBDRkxBR1NfU0hMSUIgICAgSU5DTFVERURJUiAKLSAgTERfU0hMSUIgICAgICAgIExJQkVYRUNESVIgCi0gIExERkxBR1NfU0hMSUIgICBTWVNDT05GRElSIAotICBMSUJTX1NITElCCi0uZmkKLVVzZSB0aGlzIGZvciBtYW51YWxseSBkZXRlcm1pbmluZyBzZXR0aW5ncy4gRm9yIGluc3RhbmNlIHVzZQotLm5mCi0gIElOQz0tSWBhcHhzIC1xIElOQ0xVREVESVJgCi0uZmkKLWluc2lkZSB5b3VyIG93biBNYWtlZmlsZXMgaWYgeW91IG5lZWQgbWFudWFsIGFjY2VzcwotdG8gQXBhY2hlJ3MgQyBoZWFkZXIgZmlsZXMuCi0uUFAKLUNvbmZpZ3VyYXRpb24gb3B0aW9uczoKLS5UUCAxMgotLkJJIFwtUyAiIG5hbWU9dmFsdWUiCi1UaGlzIG9wdGlvbiBjaGFuZ2VzIHRoZSBhcHhzIHNldHRpbmdzIGRlc2NyaWJlZCBhYm92ZS4KLS5QUAotVGVtcGxhdGUgR2VuZXJhdGlvbiBvcHRpb25zOgotLlRQIDEyCi0uQiBcLWcKLVRoaXMgZ2VuZXJhdGVzIGEgc3ViZGlyZWN0b3J5Ci0uSSBuYW1lCi0oc2VlIG9wdGlvbgotLkJSIFwtbiAiKSIKLWFuZCB0aGVyZSB0d28gZmlsZXM6IEEgc2FtcGxlIG1vZHVsZSBzb3VyY2UgZmlsZSBuYW1lZAotLkJJIG1vZF8gbmFtZS5jCi13aGljaCBjYW4gYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBjcmVhdGluZyB5b3VyIG93biBtb2R1bGVzIG9yCi1hcyBhIHF1aWNrIHN0YXJ0IGZvciBwbGF5aW5nIHdpdGggdGhlIEFQWFMgbWVjaGFuaXNtLgotQW5kIGEgY29ycmVzcG9uZGluZwotLkIgTWFrZWZpbGUKLWZvciBldmVuIGVhc2llciBidWlsZCBhbmQgaW5zdGFsbGluZyBvZiB0aGlzIG1vZHVsZS4KLS5QUAotRFNPIGNvbXBpbGF0aW9uIG9wdGlvbnM6Ci0uVFAgMTIKLS5CIFwtYwotVGhpcyBpbmRpY2F0ZXMgdGhlIGNvbXBpbGF0aW9uIG9wZXJhdGlvbi4gSXQgZmlyc3QgY29tcGlsZXMgdGhlIEMgc291cmNlCi1maWxlcyAoLmMpIG9mCi0uSSBmaWxlcwotaW50byBjb3JyZXNwb25kaW5nIG9iamVjdCBmaWxlcyAoLm8pIGFuZCB0aGVuIGJ1aWxkcyBhIGR5bmFtaWNhbGx5IHNoYXJlZCBvYmplY3QgaW4KLS5JIGRzb2ZpbGUKLWJ5IGxpbmtpbmcgdGhlc2Ugb2JqZWN0IGZpbGVzIHBsdXMgdGhlIHJlbWFpbmluZwotb2JqZWN0IGZpbGVzICgubyBhbmQgLmEpIG9mCi0uSSBmaWxlcwotSWYgbm8KLS5CIFwtbwotb3B0aW9uIGlzIHNwZWNpZmllZAotdGhlIG91dHB1dCBmaWxlIGlzIGd1ZXNzZWQgZnJvbSB0aGUgZmlyc3QgZmlsZW5hbWUgaW4KLS5JIGZpbGVzCi1hbmQgdGh1cyB1c3VhbGx5IGRlZmF1bHRzIHRvCi0uQkkgbW9kXyBuYW1lLnNvCi0uVFAgMTIKLS5CSSBcLW8gIiBkc29maWxlIgotRXhwbGljaXRseSBzcGVjaWZpZXMgdGhlIGZpbGVuYW1lIG9mIHRoZSBjcmVhdGVkIGR5bmFtaWNhbGx5IHNoYXJlZCBvYmplY3QuIElmCi1ub3Qgc3BlY2lmaWVkIGFuZCB0aGUgbmFtZSBjYW5ub3QgYmUgZ3Vlc3NlZCBmcm9tIHRoZQotLkkgZmlsZXMKLWxpc3QsIHRoZSBmYWxsYmFjayBuYW1lCi0uQiBtb2RfdW5rbm93bi5zbwotaXMgdXNlZC4KLS5UUCAxMgotLkJJIFwtRCAiIG5hbWU9dmFsdWUiCi1UaGlzIG9wdGlvbiBpcyBkaXJlY3RseSBwYXNzZWQgdGhyb3VnaCB0byB0aGUgY29tcGlsYXRpb24gY29tbWFuZChzKS4KLVVzZSB0aGlzIHRvIGFkZCB5b3VyIG93biBkZWZpbmVzIHRvIHRoZSBidWlsZCBwcm9jZXNzLgotLlRQIDEyCi0uQkkgXC1JICIgaW5jZGlyIgotVGhpcyBvcHRpb24gaXMgZGlyZWN0bHkgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGNvbXBpbGF0aW9uIGNvbW1hbmQocykuCi1Vc2UgdGhpcyB0byBhZGQgeW91ciBvd24gaW5jbHVkZSBkaXJlY3RvcmllcyB0byBzZWFyY2ggdG8gdGhlIGJ1aWxkIHByb2Nlc3MuCi0uVFAgMTIKLS5CSSBcLUwgIiBsaWJkaXIiCi1UaGlzIG9wdGlvbiBpcyBkaXJlY3RseSBwYXNzZWQgdGhyb3VnaCB0byB0aGUgbGlua2VyIGNvbW1hbmQuCi1Vc2UgdGhpcyB0byBhZGQgeW91ciBvd24gbGlicmFyeSBkaXJlY3RvcmllcyB0byBzZWFyY2ggdG8gdGhlIGJ1aWxkIHByb2Nlc3MuCi0uVFAgMTIKLS5CSSBcLWwgIiBsaWJuYW1lIgotVGhpcyBvcHRpb24gaXMgZGlyZWN0bHkgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGxpbmtlciBjb21tYW5kLgotVXNlIHRoaXMgdG8gYWRkIHlvdXIgb3duIGxpYnJhcmllcyB0byBzZWFyY2ggdG8gdGhlIGJ1aWxkIHByb2Nlc3MuCi0uVFAgMTIKLS5CSSBcLVdjLCAiY29tcGlsZXItZmxhZ3MiCi1UaGlzIG9wdGlvbiBwYXNzZXMgCi0uSSBjb21waWxlci1mbGFncwotYXMgYWRkaXRpb25hbCBmbGFncyB0byB0aGUgY29tcGlsZXIgY29tbWFuZC4KLVVzZSB0aGlzIHRvIGFkZCBsb2NhbCBjb21waWxlci1zcGVjaWZpYyBvcHRpb25zLgotLlRQIDEyCi0uQkkgXC1XbCwgImxpbmtlci1mbGFncyIKLVRoaXMgb3B0aW9uIHBhc3NlcyAKLS5JIGxpbmtlci1mbGFncwotYXMgYWRkaXRpb25hbCBmbGFncyB0byB0aGUgbGlua2VyIGNvbW1hbmQuCi1Vc2UgdGhpcyB0byBhZGQgbG9jYWwgbGlua2VyLXNwZWNpZmljIG9wdGlvbnMuCi0uUFAKLURTTyBpbnN0YWxsYXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9uczoKLS5UUCAxMgotLkIgXC1pCi1UaGlzIGluZGljYXRlcyB0aGUgaW5zdGFsbGF0aW9uIG9wZXJhdGlvbiBhbmQgaW5zdGFsbHMgb25lIG9yIG1vcmUKLWR5bmFtaWNhbGx5IHNoYXJlZCBvYmplY3RzIGludG8gdGhlCi1zZXJ2ZXIncwotLkkgbGliZXhlYwotZGlyZWN0b3J5LgotLlRQIDEyCi0uQiBcLWEKLVRoaXMgYWN0aXZhdGVzIHRoZSBtb2R1bGUgYnkgYXV0b21hdGljYWxseSBhZGRpbmcgYSBjb3JyZXNwb25kaW5nCi0uQiBMb2FkTW9kdWxlCi1saW5lIHRvIEFwYWNoZSdzCi0uQiBodHRwZC5jb25mCi1jb25maWd1cmF0aW9uIGZpbGUsIG9yIGJ5IGVuYWJsaW5nIGl0IGlmIGl0IGFscmVhZHkgZXhpc3RzLgotLlRQIDEyCi0uQiBcLUEKLVNhbWUgYXMgb3B0aW9uCi0uQiBcLWEKLWJ1dCB0aGUgY3JlYXRlZCAKLS5CIExvYWRNb2R1bGUKLWRpcmVjdGl2ZSBpcyBwcmVmaXhlZCB3aXRoIGEgaGFzaCBzaWduICgjKSwgaS5lLiB0aGUgbW9kdWxlIGlzCi1qdXN0IHByZXBhcmVkIGZvciBsYXRlciBhY3RpdmF0aW9uIGJ1dCBpbml0aWFsbHkgZGlzYWJsZWQuIAotLlRQIDEyCi0uQiBcLWUKLVRoaXMgaW5kaWNhdGVzIHRoZSBlZGl0aW5nIG9wZXJhdGlvbiwgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCB0aGUKLS5CIFwtYQotYW5kCi0uQiBcLUEKLW9wdGlvbnMgc2ltaWxhcmx5IHRvIHRoZQotLkIgXC1pCi1vcGVyYXRpb24gdG8gZWRpdCBBcGFjaGUncwotLkIgaHR0cGQuY29uZgotY29uZmlndXJhdGlvbiBmaWxlIHdpdGhvdXQgYXR0ZW1wdGluZyB0byBpbnN0YWxsIHRoZSBtb2R1bGUuCi0uUEQKLS5TSCBFWEFNUExFUwotQXNzdW1lIHlvdSBoYXZlIGFuIEFwYWNoZSBtb2R1bGUgbmFtZWQgbW9kX2Zvby5jIGF2YWlsYWJsZSB3aGljaCBzaG91bGQgZXh0ZW5kCi1BcGFjaGUncyBzZXJ2ZXIgZnVuY3Rpb25hbGl0eS4gVG8gYWNjb21wbGlzaCB0aGlzIHlvdSBmaXJzdCBoYXZlIHRvIGNvbXBpbGUKLXRoZSBDIHNvdXJjZSBpbnRvIGEgc2hhcmVkIG9iamVjdCBzdWl0YWJsZSBmb3IgbG9hZGluZyBpbnRvIHRoZSBBcGFjaGUgc2VydmVyCi11bmRlciBydW50aW1lIHZpYSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6Ci0KLS5uZgotICAkIGFweHMgLWMgbW9kX2Zvby5jCi0gIGdjYyAtZnBpYyAtRFNIQVJFRF9NT0RVTEUgLUkvcGF0aC90by9hcGFjaGUvaW5jbHVkZSAtYyBtb2RfZm9vLmMKLSAgbGQgLUJzaGFyZWFibGUgLW8gbW9kX2Zvby5zbyBtb2RfZm9vLm8KLSAgJCBfCi0uZmkKLQotVGhlbiB5b3UgaGF2ZSB0byB1cGRhdGUgdGhlIEFwYWNoZSBjb25maWd1cmF0aW9uIGJ5IG1ha2luZyBzdXJlIGEKLS5CIExvYWRNb2R1bGUKLWRpcmVjdGl2ZSBpcyBwcmVzZW50IHRvIGxvYWQgdGhpcyBzaGFyZWQgb2JqZWN0LiBUbyBzaW1wbGlmeSB0aGlzCi1zdGVwCi0uQiBhcHhzCi1wcm92aWRlcyBhbiBhdXRvbWF0aWMgd2F5IHRvIGluc3RhbGwgdGhlIHNoYXJlZCBvYmplY3QgaW4gaXRzCi0ibGliZXhlYyIgZGlyZWN0b3J5IGFuZCB1cGRhdGluZyB0aGUKLS5CIGh0dHBkLmNvbmYKLWZpbGUgYWNjb3JkaW5nbHkuIFRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHJ1bm5pbmc6Ci0KLS5uZgotICAkIGFweHMgLWkgLWEgbW9kX2Zvby5jCi0gIGNwIG1vZF9mb28uc28gL3BhdGgvdG8vYXBhY2hlL2xpYmV4ZWMvbW9kX2Zvby5zbwotICBjaG1vZCA3NTUgL3BhdGgvdG8vYXBhY2hlL2xpYmV4ZWMvbW9kX2Zvby5zbwotICBbYWN0aXZhdGluZyBtb2R1bGUgYGZvbycgaW4gL3BhdGgvdG8vYXBhY2hlL2V0Yy9odHRwZC5jb25mXQotICAkIF8KLS5maQotCi1UaGlzIHdheSBhIGxpbmUgbmFtZWQKLQotLm5mCi0gIExvYWRNb2R1bGUgZm9vX21vZHVsZSBsaWJleGVjL21vZF9mb28uc28KLS5maQotCi1pcyBhZGRlZCB0byB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGlmIHN0aWxsIG5vdCBwcmVzZW50LgotSWYgeW91IHdhbnQgdG8gaGF2ZSB0aGlzIHRoaXMgZGlzYWJsZWQgcGVyIGRlZmF1bHQgdXNlIHRoZQotLkIgXC1BCi1vcHRpb24sIGkuZS4KLQotLm5mCi0gICQgYXB4cyAtaSAtQSBtb2RfZm9vLmMKLS5maQotCi1Gb3IgYSBxdWljayB0ZXN0IG9mIHRoZSBBUFhTIG1lY2hhbmlzbSB5b3UgY2FuIGNyZWF0ZSBhIHNhbXBsZSBBcGFjaGUgbW9kdWxlCi10ZW1wbGF0ZSBwbHVzIGEgY29ycmVzcG9uZGluZyBNYWtlZmlsZSB2aWE6Ci0KLS5uZgotICAkIGFweHMgLWcgLW4gZm9vCi0gIENyZWF0aW5nIFtESVJdICBmb28KLSAgQ3JlYXRpbmcgW0ZJTEVdIGZvby9NYWtlZmlsZQotICBDcmVhdGluZyBbRklMRV0gZm9vL21vZF9mb28uYwotICAkIF8KLS5maQotCi1UaGVuIHlvdSBjYW4gaW1tZWRpYXRlbHkgY29tcGlsZSB0aGlzIHNhbXBsZSBtb2R1bGUgaW50byBhIHNoYXJlZCBvYmplY3QgYW5kCi1sb2FkIGl0IGludG8gdGhlIEFwYWNoZSBzZXJ2ZXI6Ci0KLS5uZgotICAkIGNkIGZvbwotICAkIG1ha2UgYWxsIHJlbG9hZAotICBhcHhzIC1jIG1vZF9mb28uYwotICBnY2MgLWZwaWMgLURTSEFSRURfTU9EVUxFIC1JL3BhdGgvdG8vYXBhY2hlL2luY2x1ZGUgLWMgbW9kX2Zvby5jCi0gIGxkIC1Cc2hhcmVhYmxlIC1vIG1vZF9mb28uc28gbW9kX2Zvby5vCi0gIGFweHMgLWkgLWEgLW4gImZvbyIgbW9kX2Zvby5zbwotICBjcCBtb2RfZm9vLnNvIC9wYXRoL3RvL2FwYWNoZS9saWJleGVjL21vZF9mb28uc28KLSAgY2htb2QgNzU1IC9wYXRoL3RvL2FwYWNoZS9saWJleGVjL21vZF9mb28uc28KLSAgW2FjdGl2YXRpbmcgbW9kdWxlIGBmb28nIGluIC9wYXRoL3RvL2FwYWNoZS9ldGMvaHR0cGQuY29uZl0KLSAgYXBhY2hlY3RsIHJlc3RhcnQKLSAgL3BhdGgvdG8vYXBhY2hlL3NiaW4vYXBhY2hlY3RsIHJlc3RhcnQ6IGh0dHBkIG5vdCBydW5uaW5nLCB0cnlpbmcgdG8gc3RhcnQKLSAgW1R1ZSBNYXIgMzEgMTE6Mjc6NTUgMTk5OF0gW2RlYnVnXSBtb2Rfc28uYygzMDMpOiBsb2FkZWQgbW9kdWxlIGZvb19tb2R1bGUKLSAgL3BhdGgvdG8vYXBhY2hlL3NiaW4vYXBhY2hlY3RsIHJlc3RhcnQ6IGh0dHBkIHN0YXJ0ZWQKLSAgJCBfCi0uZmkKLQotWW91IGNhbiBldmVuIHVzZQotLkIgYXB4cwotdG8gY29tcGlsZSBjb21wbGV4IG1vZHVsZXMgb3V0c2lkZSB0aGUgQXBhY2hlIHNvdXJjZSB0cmVlLCBsaWtlIFBIUDM6Ci0KLS5uZgotICAkIGNkIHBocDMKLSAgJCAuL2NvbmZpZ3VyZSAtLXdpdGgtc2hhcmVkLWFwYWNoZT0uLi9hcGFjaGUtMS4zCi0gICQgYXB4cyAtYyAtbyBsaWJwaHAzLnNvIG1vZF9waHAzLmMgbGlibW9kcGhwMy1zby5hCi0gIGdjYyAtZnBpYyAtRFNIQVJFRF9NT0RVTEUgLUkvdG1wL2FwYWNoZS9pbmNsdWRlICAtYyBtb2RfcGhwMy5jCi0gIGxkIC1Cc2hhcmVhYmxlIC1vIGxpYnBocDMuc28gbW9kX3BocDMubyBsaWJtb2RwaHAzLXNvLmEKLSAgJCBfCi0uZmkKLQotYmVjYXVzZQotLkIgYXB4cwotYXV0b21hdGljYWxseSByZWNvZ25pemVkIEMgc291cmNlIGZpbGVzIGFuZCBvYmplY3QgZmlsZXMuICBPbmx5IEMgc291cmNlIGZpbGVzCi1hcmUgY29tcGlsZWQgd2hpbGUgcmVtYWluaW5nIG9iamVjdCBmaWxlcyBhcmUgdXNlZCBmb3IgdGhlIGxpbmtpbmcgcGhhc2UuCi0KLS5QRAotLlNIIFNFRSBBTFNPCi0uQlIgYXBhY2hlY3RsKDEpLAotLkJSIGh0dHBkKDgpLgotLgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW4vZGJtbWFuYWdlLjEgYi9kb2NzL21hbi9kYm1tYW5hZ2UuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYzODBmZi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbi9kYm1tYW5hZ2UuMQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0uVEggZGJtbWFuYWdlIDEgIk1hcmNoIDE5OTgiCi0uXCIgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5cIgotLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotLlwiIGFyZSBtZXQ6Ci0uXCIKLS5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0uXCIKLS5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotLlwiICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS5cIiAgICBkaXN0cmlidXRpb24uCi0uXCIKLS5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLS5cIiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLS5cIiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0uXCIgICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLS5cIgotLlwiIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLS5cIiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotLlwiICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS5cIgotLlwiIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0uXCIgICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0uXCIgICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotLlwiCi0uXCIgNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotLlwiICAgIGFja25vd2xlZGdtZW50OgotLlwiICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLS5cIiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotLlwiCi0uXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0uXCIgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotLlwiIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0uXCIgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLlwiIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotLlwiIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotLlwiIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0uXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotLlwiIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLS5cIiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0uXCIgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLlwiID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0uXCIKLS5cIiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotLlwiIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotLlwiIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotLlwiIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLS5cIiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0uXCIgcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0uU0ggTkFNRQotZGJtbWFuYWdlIFwtIENyZWF0ZSBhbmQgdXBkYXRlIHVzZXIgYXV0aGVudGljYXRpb24gZmlsZXMgaW4gREJNIGZvcm1hdAotLlNIIFNZTk9QU0lTCi0uQiBkYm1tYW5hZ2UKLS5JIGZpbGVuYW1lCi1bCi0uSSBjb21tYW5kCi1dIFsKLS5JIHVzZXJuYW1lCi1bCi0uSSBlbmNwYXNzd2QKLV0gXQotLlBQCi0uU0ggREVTQ1JJUFRJT04KLS5CIGRibW1hbmFnZQotaXMgdXNlZCB0byBjcmVhdGUgYW5kIHVwZGF0ZSB0aGUgREJNIGZvcm1hdCBmaWxlcyB1c2VkIHRvIHN0b3JlCi11c2VybmFtZXMgYW5kIHBhc3N3b3JkIGZvciBiYXNpYyBhdXRoZW50aWNhdGlvbiBvZiBIVFRQIHVzZXJzLgotUmVzb3VyY2VzIGF2YWlsYWJsZSBmcm9tIHRoZQotLkIgaHR0cGQKLUFwYWNoZSB3ZWIgc2VydmVyIGNhbiBiZSByZXN0cmljdGVkIHRvIGp1c3QgdGhlIHVzZXJzIGxpc3RlZAotaW4gdGhlIGZpbGVzIGNyZWF0ZWQgYnkgCi0uQiBkYm1tYW5hZ2UuCi1UaGlzIHByb2dyYW0gY2FuIG9ubHkgYmUgdXNlZAotd2hlbiB0aGUgdXNlcm5hbWVzIGFyZSBzdG9yZWQgaW4gYSBEQk0gZmlsZS4gVG8gdXNlIGEKLWZsYXQtZmlsZSBkYXRhYmFzZSBzZWUgCi1cZkJodHBhc3N3ZFxmUC4KLS5QUAotVGhpcyBtYW51YWwgcGFnZSBvbmx5IGxpc3RzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiBGb3IgZGV0YWlscyBvZgotdGhlIGRpcmVjdGl2ZXMgbmVjZXNzYXJ5IHRvIGNvbmZpZ3VyZSB1c2VyIGF1dGhlbnRpY2F0aW9uIGluIAotLkIgaHR0cGQgCi1zZWUKLXRoZSBBcGFjaGUgbWFudWFsLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBBcGFjaGUgZGlzdHJpYnV0aW9uIG9yIGNhbiBiZQotZm91bmQgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnLy4KLS5TSCBPUFRJT05TCi0uSVAgXGZCXGZJZmlsZW5hbWVcZlAKLVRoZSBmaWxlbmFtZSBvZiB0aGUgREJNIGZvcm1hdCBmaWxlLiBVc3VhbGx5IHdpdGhvdXQgdGhlIAotZXh0ZW5zaW9uIC5kYiwgLnBhZywgb3IgLmRpci4KLS5JUCBcZkJcZkljb21tYW5kXGZQCi1UaGlzIHNlbGVjdHMgdGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtOgotLlRQIDEyCi0uQiBhZGQKLUFkZHMgYW4gZW50cnkgZm9yIFxmSXVzZXJuYW1lXGZQIHRvIFxmSWZpbGVuYW1lXGZQIHVzaW5nIHRoZSBlbmNyeXB0ZWQKLXBhc3N3b3JkIFxmSWVuY3Bhc3N3b3JkXGZQLgotLlRQIDEyCi0uQiBhZGR1c2VyCi1Bc2tzIGZvciBhIHBhc3N3b3JkIGFuZCB0aGVuIGFkZHMgYW4gZW50cnkgZm9yIFxmSXVzZXJuYW1lXGZQIHRvCi1cZklmaWxlbmFtZVxmUCAuCi0uVFAgMTIKLS5CIGNoZWNrCi1Bc2tzIGZvciBhIHBhc3N3b3JkIGFuZCB0aGVuIGNoZWNrcyBpZiAKLVxmSXVzZXJuYW1lXGZQIGlzIGluIFxmSWZpbGVuYW1lXGZQIGFuZCBpZiBpdCdzIHBhc3N3b3JkIG1hdGNoZXMKLXRoZSBzcGVjaWZpZWQgb25lLgotLlRQIDEyCi0uQiBkZWxldGUKLURlbGV0ZXMgdGhlIFxmSXVzZXJuYW1lXGZQIGVudHJ5IGZyb20gXGZJZmlsZW5hbWVcZlAuCi0uVFAgMTIKLS5CIGltcG9ydAotUmVhZHMgdXNlcm5hbWU6cGFzc3dvcmQgZW50cmllcyAob25lIHBlciBsaW5lKSBmcm9tIFNURElOIGFuZCBhZGRzIHRoZW0gdG8KLVxmSWZpbGVuYW1lXGZQLiBUaGUgcGFzc3dvcmRzIGFscmVhZHkgaGFzIHRvIGJlIGNyeXB0ZWQuCi0uVFAgMTIKLS5CIHVwZGF0ZQotU2FtZSBhcyB0aGUgImFkZHVzZXIiIGNvbW1hbmQsIGV4Y2VwdCB0aGF0IGl0IG1ha2VzIHN1cmUgXGZJdXNlcm5hbWVcZlAKLWFscmVhZHkgZXhpc3RzIGluIFxmSWZpbGVuYW1lXGZQLgotLlRQIDEyCi0uQiB2aWV3Ci1KdXN0IGRpc3BsYXlzIHRoZSBjb21wbGV0ZSBjb250ZW50cyBvZiB0aGUgREJNIGZpbGUuCi0uSVAgXGZCXGZJdXNlcm5hbWVcZlAKLVRoZSB1c2VyIGZvciB3aGljaCB0aGUgdXBkYXRlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuCi0uUEQKLS5TSCBCVUdTCi0uUFAKLU9uZSBzaG91bGQgYmUgYXdhcmUgdGhhdCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgZGlmZmVyZW50IERCTSBmaWxlCi1mb3JtYXRzIGluIGV4aXN0YW5jZSwgYW5kIHdpdGggYWxsIGxpa2VsaWhvb2QsIGxpYnJhcmllcyBmb3IgbW9yZSB0aGFuCi1vbmUgZm9ybWF0IG1heSBleGlzdCBvbiB5b3VyIHN5c3RlbS4gIFRoZSB0aHJlZSBwcmltYXJ5IGV4YW1wbGVzIGFyZQotTkRCTSwgdGhlIEdOVSBwcm9qZWN0J3MgR0RCTSwgYW5kIEJlcmtlbGV5IERCIDIuICBVbmZvcnR1bmF0ZWx5LCBhbGwKLXRoZXNlIGxpYnJhcmllcyB1c2UgZGlmZmVyZW50IGZpbGUgZm9ybWF0cywgYW5kIHlvdSBtdXN0IG1ha2Ugc3VyZQotdGhhdCB0aGUgZmlsZSBmb3JtYXQgdXNlZCBieQotLkkgZmlsZW5hbWUKLWlzIHRoZSBzYW1lIGZvcm1hdCB0aGF0IAotLkIgZGJtbWFuYWdlCi1leHBlY3RzIHRvIHNlZS4gIAotLkIgZGJtbWFuYWdlCi1jdXJyZW50bHkgaGFzIG5vIHdheSBvZiBkZXRlcm1pbmluZyB3aGF0IHR5cGUgb2YgREJNIGZpbGUgaXQgaXMKLWxvb2tpbmcgYXQuICBJZiB1c2VkIGFnYWluc3QgdGhlIHdyb25nIGZvcm1hdCwgCi0uZGJtbWFuYWdlCi13aWxsIHNpbXBseSByZXR1cm4gbm90aGluZywgb3IgbWF5IGNyZWF0ZSBhIGRpZmZlcmVudCBEQk0gZmlsZSB3aXRoIGEKLWRpZmZlcmVudCBuYW1lLCBvciBhdCB3b3JzdCwgaXQgbWF5IGNvcnJ1cHQgdGhlIERCTSBmaWxlIGlmIHlvdSB3ZXJlCi1hdHRlbXB0aW5nIHRvIHdyaXRlIHRvIGl0LgotLlBQCi0uQiBkYm1tYW5hZ2UKLWhhcyBhIGxpc3Qgb2YgREJNIGZvcm1hdCBwcmVmZXJlbmNlcywgZGVmaW5lZCBieSB0aGUgCi0uQiBAQW55REJNOjpJU0EKLWFycmF5IG5lYXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJvZ3JhbS4gIFNpbmNlIHdlIHByZWZlciB0aGUgQmVya2VsZXkKLURCIDIgZmlsZSBmb3JtYXQsIHRoZSBvcmRlciBpbiB3aGljaAotLkIgZGJtbWFuYWdlIAotd2lsbCBsb29rIGZvciBzeXN0ZW0gbGlicmFyaWVzIGlzIEJlcmtlbGV5IERCIDIsIHRoZW4gTkRCTSwgYW5kIHRoZW4KLUdEQk0uICBUaGUgZmlyc3QgbGlicmFyeSBmb3VuZCB3aWxsIGJlIHRoZSBsaWJyYXJ5Ci0uQiBkYm1tYW5hZ2UKLXdpbGwgYXR0ZW1wdCB0byB1c2UgZm9yIGFsbCBEQk0gZmlsZSB0cmFuc2FjdGlvbnMuICBUaGlzIG9yZGVyaW5nIGlzCi1zbGlnaHRseSBkaWZmZXJlbnQgdGhhbiB0aGUgc3RhbmRhcmQgCi0uQiBAQW55REJNOjpJU0EKLW9yZGVyaW5nIGluIHBlcmwsIGFzIHdlbGwgYXMgdGhlIG9yZGVyaW5nIHVzZWQgYnkgdGhlIHNpbXBsZSBkYm1vcGVuKCkKLWNhbGwgaW4gUGVybCwgc28gaWYgeW91IHVzZSBhbnkgb3RoZXIgdXRpbGl0aWVzIHRvIG1hbmFnZSB5b3VyIERCTQotZmlsZXMsIHRoZXkgbXVzdCBhbHNvIGZvbGxvdyB0aGlzIHByZWZlcmVuY2Ugb3JkZXJpbmcuICBTaW1pbGFyIGNhcmUKLW11c3QgYmUgdGFrZW4gaWYgdXNpbmcgcHJvZ3JhbXMgaW4gb3RoZXIgbGFuZ3VhZ2VzLCBsaWtlIEMsIHRvIAotYWNjZXNzIHRoZXNlIGZpbGVzLgotLlBQCi1BcGFjaGUncyAKLS5CIG1vZF9hdXRoX2RiLmMgCi1tb2R1bGUgY29ycmVzcG9uZHMgdG8gQmVya2VsZXkgREIgMiBsaWJyYXJ5LCB3aGlsZQotLkIgbW9kX2F1dGhfZGJtLmMKLWNvcnJlc3BvbmRzIHRvIHRoZSBOREJNIGxpYnJhcnkuICBBbHNvLCBvbmUgY2FuIHVzdWFsbHkgdXNlIHRoZSAKLS5CIGZpbGUKLXByb2dyYW0gc3VwcGxpZWQgd2l0aCBtb3N0IFVuaXggc3lzdGVtcyB0byBzZWUgd2hhdCBmb3JtYXQgYSBEQk0gZmlsZSBpcyBpbi4KLS5QRAotLlNIIFNFRSBBTFNPCi0uQlIgaHR0cGQoOCkKLS4KZGlmZiAtLWdpdCBhL2RvY3MvbWFuL2h0ZGlnZXN0LjEgYi9kb2NzL21hbi9odGRpZ2VzdC4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzE5ZTQ1Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFuL2h0ZGlnZXN0LjEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0uVEggaHRkaWdlc3QgMSAiTWFyY2ggMTk5OCIKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTctMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLlwiCi0uXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0uXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0uXCIgYXJlIG1ldDoKLS5cIgotLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLS5cIgotLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0uXCIgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLlwiICAgIGRpc3RyaWJ1dGlvbi4KLS5cIgotLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotLlwiICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotLlwiICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLS5cIiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotLlwiCi0uXCIgNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotLlwiICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0uXCIgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotLlwiICAgIGFwYWNoZUBhcGFjaGUub3JnLgotLlwiCi0uXCIgNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLS5cIiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLS5cIiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0uXCIKLS5cIiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0uXCIgICAgYWNrbm93bGVkZ21lbnQ6Ci0uXCIgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotLlwiICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0uXCIKLS5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLS5cIiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0uXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0uXCIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLS5cIiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0uXCIgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0uXCIgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0uXCIgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLS5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0uXCIgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotLlwiIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLS5cIiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0uXCIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS5cIgotLlwiIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0uXCIgaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0uXCIgb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0uXCIgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotLlwiIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLS5cIiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLS5TSCBOQU1FCi1odGRpZ2VzdCBcLSBDcmVhdGUgYW5kIHVwZGF0ZSB1c2VyIGF1dGhlbnRpY2F0aW9uIGZpbGVzCi0uU0ggU1lOT1BTSVMKLS5CIGh0ZGlnZXN0IAotWwotLkIgXC1jCi1dIAotLkkgcGFzc3dkZmlsZQotLkkgcmVhbG0KLS5JIHVzZXJuYW1lCi0uU0ggREVTQ1JJUFRJT04KLS5CIGh0ZGlnZXN0Ci1pcyB1c2VkIHRvIGNyZWF0ZSBhbmQgdXBkYXRlIHRoZSBmbGF0LWZpbGVzIHVzZWQgdG8gc3RvcmUKLXVzZXJuYW1lcywgcmVhbG0gYW5kIHBhc3N3b3JkIGZvciBkaWdlc3QgYXV0aGVudGljYXRpb24gb2YgSFRUUCB1c2Vycy4KLVJlc291cmNlcyBhdmFpbGFibGUgZnJvbSB0aGUKLS5CIGh0dHBkCi1BcGFjaGUgd2ViIHNlcnZlciBjYW4gYmUgcmVzdHJpY3RlZCB0byBqdXN0IHRoZSB1c2VycyBsaXN0ZWQKLWluIHRoZSBmaWxlcyBjcmVhdGVkIGJ5IAotLkIgaHRkaWdlc3QuCi0uUFAKLVRoaXMgbWFudWFsIHBhZ2Ugb25seSBsaXN0cyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4gRm9yIGRldGFpbHMgb2YKLXRoZSBkaXJlY3RpdmVzIG5lY2Vzc2FyeSB0byBjb25maWd1cmUgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIGluIAotLkIgaHR0cGQgCi1zZWUKLXRoZSBBcGFjaGUgbWFudWFsLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBBcGFjaGUgZGlzdHJpYnV0aW9uIG9yIGNhbiBiZQotZm91bmQgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnLy4KLS5TSCBPUFRJT05TCi0uSVAgXC1jIAotQ3JlYXRlIHRoZSBcZklwYXNzd2RmaWxlXGZQLiBJZiBcZklwYXNzd2RmaWxlXGZQIGFscmVhZHkgZXhpc3RzLCBpdAotaXMgZGVsZXRlZCBmaXJzdC4gCi0uSVAgXGZCXGZJcGFzc3dkZmlsZVxmUAotTmFtZSBvZiB0aGUgZmlsZSB0byBjb250YWluIHRoZSB1c2VybmFtZSwgcmVhbG0gYW5kIHBhc3N3b3JkLiBJZiBcLWMKLWlzIGdpdmVuLCB0aGlzIGZpbGUgaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LAotb3IgZGVsZXRlZCBhbmQgcmVjcmVhdGVkIGlmIGl0IGRvZXMgZXhpc3QuIAotLklQIFxmQlxmSXJlYWxtXGZQCi1UaGUgcmVhbG0gbmFtZSB0byB3aGljaCB0aGUgdXNlciBuYW1lIGJlbG9uZ3MgdG8uIAotLklQIFxmQlxmSXVzZXJuYW1lXGZQCi1UaGUgdXNlciBuYW1lIHRvIGNyZWF0ZSBvciB1cGRhdGUgaW4gXGZCcGFzc3dkZmlsZVxmUC4gSWYKLVxmSXVzZXJuYW1lXGZQIGRvZXMgbm90IGV4aXN0IGlzIHRoaXMgZmlsZSwgYW4gZW50cnkgaXMgYWRkZWQuIElmIGl0Ci1kb2VzIGV4aXN0LCB0aGUgcGFzc3dvcmQgaXMgY2hhbmdlZC4KLS5TSCBTRUUgQUxTTwotLkJSIGh0dHBkKDgpIAotLgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW4vaHRwYXNzd2QuMSBiL2RvY3MvbWFuL2h0cGFzc3dkLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ODdjZGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW4vaHRwYXNzd2QuMQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0uVEggaHRwYXNzd2QgMSAiRmVicnVhcnkgMTk5NyIKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTctMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLlwiCi0uXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0uXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0uXCIgYXJlIG1ldDoKLS5cIgotLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLS5cIgotLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0uXCIgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLlwiICAgIGRpc3RyaWJ1dGlvbi4KLS5cIgotLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotLlwiICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotLlwiICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLS5cIiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotLlwiCi0uXCIgNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotLlwiICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0uXCIgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotLlwiICAgIGFwYWNoZUBhcGFjaGUub3JnLgotLlwiCi0uXCIgNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLS5cIiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLS5cIiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0uXCIKLS5cIiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0uXCIgICAgYWNrbm93bGVkZ21lbnQ6Ci0uXCIgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotLlwiICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0uXCIKLS5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLS5cIiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0uXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0uXCIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLS5cIiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0uXCIgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0uXCIgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0uXCIgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLS5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0uXCIgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotLlwiIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLS5cIiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0uXCIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS5cIgotLlwiIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0uXCIgaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0uXCIgb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0uXCIgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotLlwiIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLS5cIiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLS5TSCBOQU1FCi1odHBhc3N3ZCBcLSBDcmVhdGUgYW5kIHVwZGF0ZSB1c2VyIGF1dGhlbnRpY2F0aW9uIGZpbGVzCi0uU0ggU1lOT1BTSVMKLS5CIGh0cGFzc3dkIAotWwotLkIgXC1jCi1dIAotWwotLkIgXC1tCi1dIAotLkkgcGFzc3dkZmlsZQotLkkgdXNlcm5hbWUKLS5icgotLkIgaHRwYXNzd2QKLS5CIFwtYiAgCi1bCi0uQiBcLWMKLV0gCi1bCi0uQiBcLW0KLS5CIFwtZAotLkIgXC1wCi0uQiBcLXMKLV0gCi0uSSBwYXNzd2RmaWxlCi0uSSB1c2VybmFtZQotLkkgcGFzc3dvcmQKLS5TSCBERVNDUklQVElPTgotLkIgaHRwYXNzd2QKLWlzIHVzZWQgdG8gY3JlYXRlIGFuZCB1cGRhdGUgdGhlIGZsYXQtZmlsZXMgdXNlZCB0byBzdG9yZQotdXNlcm5hbWVzIGFuZCBwYXNzd29yZCBmb3IgYmFzaWMgYXV0aGVudGljYXRpb24gb2YgSFRUUCB1c2Vycy4KLUlmCi0uQiBodHBhc3N3ZAotY2Fubm90IGFjY2VzcyBhIGZpbGUsIHN1Y2ggYXMgbm90IGJlaW5nIGFibGUgdG8gd3JpdGUgdG8gdGhlIG91dHB1dAotZmlsZSBvciBub3QgYmVpbmcgYWJsZSB0byByZWFkIHRoZSBmaWxlIGluIG9yZGVyIHRvIHVwZGF0ZSBpdCwKLWl0IHJldHVybnMgYW4gZXJyb3Igc3RhdHVzIGFuZCBtYWtlcyBubyBjaGFuZ2VzLgotLlBQCi1SZXNvdXJjZXMgYXZhaWxhYmxlIGZyb20gdGhlCi0uQiBodHRwZAotQXBhY2hlIHdlYiBzZXJ2ZXIgY2FuIGJlIHJlc3RyaWN0ZWQgdG8ganVzdCB0aGUgdXNlcnMgbGlzdGVkCi1pbiB0aGUgZmlsZXMgY3JlYXRlZCBieSAKLS5CIGh0cGFzc3dkLgotVGhpcyBwcm9ncmFtIGNhbiBvbmx5IGJlIHVzZWQKLXdoZW4gdGhlIHVzZXJuYW1lcyBhcmUgc3RvcmVkIGluIGEgZmxhdC1maWxlLiBUbyB1c2UgYQotREJNIGRhdGFiYXNlIHNlZSAKLVxmQmRibW1hbmFnZVxmUC4KLS5QUAotLkIgaHRwYXNzd2QKLWVuY3J5cHRzIHBhc3N3b3JkcyB1c2luZyBlaXRoZXIgYSB2ZXJzaW9uIG9mIE1ENSBtb2RpZmllZCBmb3IgQXBhY2hlLAotb3IgdGhlIHN5c3RlbSdzIFxmSWNyeXB0KClcZlAgcm91dGluZS4gIEZpbGVzIG1hbmFnZWQgYnkKLS5CIGh0cGFzc3dkCi1tYXkgY29udGFpbiBib3RoIHR5cGVzIG9mIHBhc3N3b3Jkczsgc29tZSB1c2VyIHJlY29yZHMgbWF5IGhhdmUKLU1ENS1lbmNyeXB0ZWQgcGFzc3dvcmRzIHdoaWxlIG90aGVycyBpbiB0aGUgc2FtZSBmaWxlIG1heSBoYXZlIHBhc3N3b3JkcwotZW5jcnlwdGVkIHdpdGggXGZJY3J5cHQoKVxmUC4KLS5QUAotVGhpcyBtYW51YWwgcGFnZSBvbmx5IGxpc3RzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiBGb3IgZGV0YWlscyBvZgotdGhlIGRpcmVjdGl2ZXMgbmVjZXNzYXJ5IHRvIGNvbmZpZ3VyZSB1c2VyIGF1dGhlbnRpY2F0aW9uIGluIAotLkIgaHR0cGQgCi1zZWUKLXRoZSBBcGFjaGUgbWFudWFsLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBBcGFjaGUgZGlzdHJpYnV0aW9uIG9yIGNhbiBiZQotZm91bmQgYXQgPFVSTDpodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLS5TSCBPUFRJT05TCi0uSVAgXC1iIAotVXNlIGJhdGNoIG1vZGU7IFxmSWkuZS5cZlAsIGdldCB0aGUgcGFzc3dvcmQgZnJvbSB0aGUgY29tbWFuZCBsaW5lCi1yYXRoZXIgdGhhbiBwcm9tcHRpbmcgZm9yIGl0LiBcZkJUaGlzIG9wdGlvbiBzaG91bGQgYmUgdXNlZCB3aXRoCi1leHRyZW1lIGNhcmUsIHNpbmNlIHRoZSBwYXNzd29yZCBpcyBjbGVhcmx5IHZpc2libGUgb24gdGhlIGNvbW1hbmQKLWxpbmUuXGZQCi0uSVAgXC1jIAotQ3JlYXRlIHRoZSBcZklwYXNzd2RmaWxlXGZQLiBJZiBcZklwYXNzd2RmaWxlXGZQIGFscmVhZHkgZXhpc3RzLCBpdAotaXMgcmV3cml0dGVuIGFuZCB0cnVuY2F0ZWQuCi0uSVAgXC1tIAotVXNlIE1ENSBlbmNyeXB0aW9uIGZvciBwYXNzd29yZHMuIE9uIFdpbmRvd3MgYW5kIFRQRiwgdGhpcyBpcyB0aGUgZGVmYXVsdC4KLS5JUCBcLWQKLVVzZSBjcnlwdCgpIGVuY3J5cHRpb24gZm9yIHBhc3N3b3Jkcy4gVGhlIGRlZmF1bHQgb24gYWxsIHBsYXRmb3JtcyBidXQKLVdpbmRvd3MgYW5kIFRQRi4gVGhvdWdoIHBvc3NpYmx5IHN1cHBvcnRlZCBieQotLkIgaHRwYXNzd2QKLW9ubSBhbGwgcGxhdGZvcm1zLCBpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZQotLkIgaHR0cGQKLXNlcnZlciBvbiBXaW5kb3dzIGFuZCBUUEYuCi0uSVAgXC1zCi1Vc2UgU0hBIGVuY3J5cHRpb24gZm9yIHBhc3N3b3Jkcy4gRmFjaWxpYXRlcyBtaWdyYXRpb24gZnJvbS90byBOZXRzY2FwZQotc2VydmVycyB1c2luZyB0aGUgTERBUCBEaXJlY3RvcnkgSW50ZXJjaGFuZ2UgRm9ybWF0IChsZGlmKS4KLS5JUCBcLXAKLVVzZSBwbGFpbnRleHQgcGFzc3dvcmRzLiBUaG91Z2ggCi0uQiBodHBhc3N3ZAotd2lsbCBzdXBwb3J0IGNyZWF0aW9uIG9uIGFsbCBwbGF0b2ZybXMsIHRoZQotLkIgaHR0cGQKLWRlYW1vbiB3aWxsIG9ubHkgYWNjZXB0IHBsYWluIHRleHQgcGFzc3dvcmRzIG9uIFdpbmRvd3MgYW5kIFRQRi4KLS5JUCBcZkJcZklwYXNzd2RmaWxlXGZQCi1OYW1lIG9mIHRoZSBmaWxlIHRvIGNvbnRhaW4gdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQuIElmIFwtYwotaXMgZ2l2ZW4sIHRoaXMgZmlsZSBpcyBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QsCi1vciByZXdyaXR0ZW4gYW5kIHRydW5jYXRlZCBpZiBpdCBkb2VzIGV4aXN0LiAKLS5JUCBcZkJcZkl1c2VybmFtZVxmUAotVGhlIHVzZXJuYW1lIHRvIGNyZWF0ZSBvciB1cGRhdGUgaW4gXGZCcGFzc3dkZmlsZVxmUC4gSWYKLVxmSXVzZXJuYW1lXGZQIGRvZXMgbm90IGV4aXN0IGluIHRoaXMgZmlsZSwgYW4gZW50cnkgaXMgYWRkZWQuIElmIGl0Ci1kb2VzIGV4aXN0LCB0aGUgcGFzc3dvcmQgaXMgY2hhbmdlZC4KLS5JUCBcZkJcZklwYXNzd29yZFxmUAotVGhlIHBsYWludGV4dCBwYXNzd29yZCB0byBiZSBlbmNyeXB0ZWQgYW5kIHN0b3JlZCBpbiB0aGUgZmlsZS4gIE9ubHkgdXNlZAotd2l0aCB0aGUgXGZJLWJcZlAgZmxhZy4KLS5TSCBFWElUIFNUQVRVUwotLkIgaHRwYXNzd2QKLXJldHVybnMgYSB6ZXJvIHN0YXR1cyAoInRydWUiKSBpZiB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGhhdmUKLWJlZW4gc3VjY2Vzc2Z1bGx5IGFkZGVkIG9yIHVwZGF0ZWQgaW4gdGhlIFxmSXBhc3N3ZGZpbGVcZlAuCi0uQiBodHBhc3N3ZAotcmV0dXJucyAxIGlmIGl0IGVuY291bnRlcnMgc29tZSBwcm9ibGVtIGFjY2Vzc2luZyBmaWxlcywgMiBpZiB0aGVyZQotd2FzIGEgc3ludGF4IHByb2JsZW0gd2l0aCB0aGUgY29tbWFuZCBsaW5lLCAzIGlmIHRoZSBwYXNzd29yZCB3YXMKLWVudGVyZWQgaW50ZXJhY3RpdmVseSBhbmQgdGhlIHZlcmlmaWNhdGlvbiBlbnRyeSBkaWRuJ3QgbWF0Y2gsIDQgaWYKLWl0cyBvcGVyYXRpb24gd2FzIGludGVycnVwdGVkLCA1IGlmIGEgdmFsdWUgaXMgdG9vIGxvbmcgKHVzZXJuYW1lLAotZmlsZW5hbWUsIHBhc3N3b3JkLCBvciBmaW5hbCBjb21wdXRlZCByZWNvcmQpLCBhbmQgNiBpZiB0aGUgdXNlcm5hbWUKLWNvbnRhaW5zIGlsbGVnYWwgY2hhcmFjdGVycyAoc2VlIHRoZSBcZkJSRVNUUklDVElPTlNcZlAgc2VjdGlvbikuCi0uU0ggRVhBTVBMRVMKLVxmQmh0cGFzc3dkIC91c3IvbG9jYWwvZXRjL2FwYWNoZS8uaHRwYXNzd2QtdXNlcnMganNtaXRoXGZQCi0uSVAKLUFkZHMgb3IgbW9kaWZpZXMgdGhlIHBhc3N3b3JkIGZvciB1c2VyIFxmSWpzbWl0aFxmUC4gIAotVGhlIHVzZXIgaXMgcHJvbXB0ZWQgZm9yIHRoZSBwYXNzd29yZC4gIElmIGV4ZWN1dGVkCi1vbiBhIFdpbmRvd3Mgc3lzdGVtLCB0aGUgcGFzc3dvcmQgd2lsbCBiZSBlbmNyeXB0ZWQgdXNpbmcgdGhlCi1tb2RpZmllZCBBcGFjaGUgTUQ1IGFsZ29yaXRobTsgb3RoZXJ3aXNlLCB0aGUgc3lzdGVtJ3MKLVxmSWNyeXB0KClcZlAgcm91dGluZSB3aWxsIGJlIHVzZWQuICBJZiB0aGUgZmlsZSBkb2VzIG5vdAotZXhpc3QsIAotLkIgaHRwYXNzd2QKLXdpbGwgZG8gbm90aGluZyBleGNlcHQgcmV0dXJuIGFuIGVycm9yLgotLkxQCi1cZkJodHBhc3N3ZCAtYyAvaG9tZS9kb2UvcHVibGljX2h0bWwvLmh0cGFzc3dkIGphbmVcZlAKLS5JUAotQ3JlYXRlcyBhIG5ldyBmaWxlIGFuZCBzdG9yZXMgYSByZWNvcmQgaW4gaXQgZm9yIHVzZXIgXGZJamFuZVxmUC4KLVRoZSB1c2VyIGlzIHByb21wdGVkIGZvciB0aGUgcGFzc3dvcmQuCi1JZiB0aGUgZmlsZSBleGlzdHMgYW5kIGNhbm5vdCBiZSByZWFkLCBvciBjYW5ub3QgYmUgd3JpdHRlbiwKLWl0IGlzIG5vdCBhbHRlcmVkIGFuZAotLkIgaHRwYXNzd2QKLXdpbGwgZGlzcGxheSBhIG1lc3NhZ2UgYW5kIHJldHVybiBhbiBlcnJvciBzdGF0dXMuCi0uTFAKLVxmQmh0cGFzc3dkIC1tYiAvdXNyL3dlYi8uaHRwYXNzd2QtYWxsIGpvbmVzIFB3ZDRTdGV2ZVxmUAotLklQCi1FbmNyeXB0cyB0aGUgcGFzc3dvcmQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIChcZklQd2Q0U3RldmVcZlApIHVzaW5nCi10aGUgTUQ1IGFsZ29yaXRobSwgYW5kIHN0b3JlcyBpdCBpbiB0aGUgc3BlY2lmaWVkIGZpbGUuCi0uTFAKLS5TSCBTRUNVUklUWSBDT05TSURFUkFUSU9OUwotV2ViIHBhc3N3b3JkIGZpbGVzIHN1Y2ggYXMgdGhvc2UgbWFuYWdlZCBieQotLkIgaHRwYXNzd2QKLXNob3VsZCBcZkJub3RcZlAgYmUgd2l0aGluIHRoZSBXZWIgc2VydmVyJ3MgVVJJIHNwYWNlIC0tIHRoYXQgaXMsCi10aGV5IHNob3VsZCBub3QgYmUgZmV0Y2hhYmxlIHdpdGggYSBicm93c2VyLgotLlBQCi1UaGUgdXNlIG9mIHRoZSBcZkktYlxmUCBvcHRpb24gaXMgZGlzY291cmFnZWQsIHNpbmNlIHdoZW4gaXQgaXMKLXVzZWQgdGhlIHVuZW5jcnlwdGVkIHBhc3N3b3JkIGFwcGVhcnMgb24gdGhlIGNvbW1hbmQgbGluZS4KLS5TSCBSRVNUUklDVElPTlMKLU9uIHRoZSBXaW5kb3dzIGFuZCBNUEUgcGxhdGZvcm1zLCBwYXNzd29yZHMgZW5jcnlwdGVkIHdpdGgKLS5CIGh0cGFzc3dkCi1hcmUgbGltaXRlZCB0byBubyBtb3JlIHRoYW4gMjU1IGNoYXJhY3RlcnMgaW4gbGVuZ3RoLiAgTG9uZ2VyCi1wYXNzd29yZHMgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gMjU1IGNoYXJhY3RlcnMuCi0uUFAKLVRoZSBNRDUgYWxnb3JpdGhtIHVzZWQgYnkKLS5CIGh0cGFzc3dkCi1pcyBzcGVjaWZpYyB0byB0aGUgQXBhY2hlIHNvZnR3YXJlOyBwYXNzd29yZHMgZW5jcnlwdGVkIHVzaW5nIGl0IHdpbGwgbm90IGJlCi11c2FibGUgd2l0aCBvdGhlciBXZWIgc2VydmVycy4KLS5QUAotVXNlcm5hbWVzIGFyZSBsaW1pdGVkIHRvIDI1NSBieXRlcyBhbmQgbWF5IG5vdCBpbmNsdWRlIHRoZSBjaGFyYWN0ZXIgJzonLgotLlNIIFNFRSBBTFNPCi0uQlIgaHR0cGQoOCkKLWFuZCB0aGUgc2NyaXB0cyBpbiBzdXBwb3J0L1NIQTEgd2hpY2ggY29tZSB3aXRoIHRoZSBkaXN0cmlidXRpb24uCmRpZmYgLS1naXQgYS9kb2NzL21hbi9odHRwZC44IGIvZG9jcy9tYW4vaHR0cGQuOApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzMjBiYS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbi9odHRwZC44CisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS5USCBodHRwZCA4ICJGZWJydWFyeSAxOTk3IgotLlwiIENvcHlyaWdodCAoYykgMTk5NS0xOTk3IERhdmlkIFJvYmluc29uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLlwiIENvcHlyaWdodCAoYykgMTk5Ny0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIKLS5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLS5cIiBhcmUgbWV0OgotLlwiCi0uXCIgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotLlwiCi0uXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLS5cIiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0uXCIgICAgZGlzdHJpYnV0aW9uLgotLlwiCi0uXCIgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0uXCIgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0uXCIgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotLlwiICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0uXCIKLS5cIiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0uXCIgICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLS5cIiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0uXCIgICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0uXCIKLS5cIiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotLlwiICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotLlwiICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLS5cIgotLlwiIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLS5cIiAgICBhY2tub3dsZWRnbWVudDoKLS5cIiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0uXCIgICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLS5cIgotLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotLlwiIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLS5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLS5cIiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotLlwiIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS5cIiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLS5cIiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLS5cIiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotLlwiIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLS5cIiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0uXCIgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotLlwiIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLS5cIiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLlwiCi0uXCIgVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLS5cIiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLS5cIiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLS5cIiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0uXCIgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotLlwiIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotLlNIIE5BTUUKLWh0dHBkIFwtIEFwYWNoZSBoeXBlcnRleHQgdHJhbnNmZXIgcHJvdG9jb2wgc2VydmVyCi0uU0ggU1lOT1BTSVMKLS5CIGh0dHBkIAotWwotLkIgXC1YCi1dIFsKLS5CSSBcLVIgIiBsaWJleGVjZGlyIgotXSBbCi0uQkkgXC1kICIgc2VydmVycm9vdCIKLV0gWwotLkJJIFwtZiAiIGNvbmZpZyIKLV0gWwotLkJJIFwtQyAiIGRpcmVjdGl2ZSIKLV0gWwotLkJJIFwtYyAiIGRpcmVjdGl2ZSIKLV0gWwotLkJJIFwtRCAiIHBhcmFtZXRlciIKLV0KLQotLkIgaHR0cGQgCi1bCi0uQiBcLWgKLV0gCi1bCi0uQiBcLWwKLV0gCi1bCi0uQiBcLUwKLV0gCi1bCi0uQiBcLXYKLV0gCi1bCi0uQiBcLVYKLV0gCi1bCi0uQiBcLVMKLV0gCi1bCi0uQiBcLXQKLV0gCi1bCi0uQiBcLVQKLV0KLQotLlNIIERFU0NSSVBUSU9OCi0uQiBodHRwZAotaXMgdGhlIEFwYWNoZSBIeXBlclRleHQgVHJhbnNmZXIgUHJvdG9jb2wgKEhUVFApIHNlcnZlciBwcm9ncmFtLiBJdCBpcwotZGVzaWduZWQgdG8gYmUgcnVuIGFzIGEgc3RhbmRhbG9uZSBkYWVtb24gcHJvY2Vzcy4gV2hlbiB1c2VkIGxpa2UgdGhpcwotaXQgd2lsbCBjcmVhdGUgYSBwb29sIG9mIGNoaWxkIHByb2Nlc3NlcyB0byBoYW5kbGUgcmVxdWVzdHMuIFRvIHN0b3AKLWl0LCBzZW5kIGEgVEVSTSBzaWduYWwgdG8gdGhlIGluaXRpYWwgKHBhcmVudCkgcHJvY2Vzcy4gVGhlIFBJRCBvZgotdGhpcyBwcm9jZXNzIGlzIHdyaXR0ZW4gdG8gYSBmaWxlIGFzIGdpdmVuIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi1BbHRlcm5hdGl2ZWx5IAotLkIgaHR0cGQgCi1tYXkgYmUgaW52b2tlZCBieSB0aGUgSW50ZXJuZXQgZGFlbW9uIGluZXRkKDgpIGVhY2gKLXRpbWUgYSBjb25uZWN0aW9uIHRvIHRoZSBIVFRQIHNlcnZpY2UgaXMgbWFkZS4KLS5QUAotVGhpcyBtYW51YWwgcGFnZSBvbmx5IGxpc3RzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiBGb3IgZGV0YWlscwotb2YgdGhlIGRpcmVjdGl2ZXMgbmVjZXNzYXJ5IHRvIGNvbmZpZ3VyZSAKLS5CIGh0dHBkCi1zZWUgdGhlIEFwYWNoZSBtYW51YWwsCi13aGljaCBpcyBwYXJ0IG9mIHRoZSBBcGFjaGUgZGlzdHJpYnV0aW9uIG9yIGNhbiBiZSBmb3VuZCBhdAotaHR0cDovL3d3dy5hcGFjaGUub3JnLy4gUGF0aHMgaW4gdGhpcyBtYW51YWwgbWF5IG5vdCByZWZsZWN0IHRob3NlCi1jb21waWxlZCBpbnRvIAotLkIgaHR0cGQuCi0uU0ggT1BUSU9OUwotLlRQIDEyCi0uQkkgXC1SICIgbGliZXhlY2RpciIKLVRoaXMgb3B0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIGlmIEFwYWNoZSB3YXMgYnVpbHQgd2l0aAotdGhlIAotLkkgU0hBUkVEX0NPUkUKLXJ1bGUgZW5hYmxlZCB3aGljaCBmb3JjZXMgdGhlIEFwYWNoZSBjb3JlIGNvZGUgdG8gYmUKLXBsYWNlZCBpbnRvIGEgZHluYW1pYyBzaGFyZWQgb2JqZWN0IChEU08pIGZpbGUuIFRoaXMgZmlsZQotaXMgc2VhcmNoZWQgaW4gYSBoYXJkY29kZWQgcGF0aCB1bmRlciBTZXJ2ZXJSb290IHBlciBkZWZhdWx0LiBVc2UgdGhpcwotb3B0aW9uIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIGl0LgotLlRQIDEyCi0uQkkgXC1kICIgc2VydmVycm9vdCIKLVNldCB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIFNlcnZlclJvb3QgZGlyZWN0aXZlIHRvIFxmSXNlcnZlcnJvb3RcZlAuIFRoaXMKLWNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBTZXJ2ZXJSb290IGNvbW1hbmQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4gVGhlCi1kZWZhdWx0IGlzIFxmQi91c3IvbG9jYWwvYXBhY2hlXGZQLgotLlRQCi0uQkkgXC1mICIgY29uZmlnIgotRXhlY3V0ZSB0aGUgY29tbWFuZHMgaW4gdGhlIGZpbGUgXGZJY29uZmlnXGZQIG9uIHN0YXJ0dXAuIElmIFxmSWNvbmZpZ1xmUAotZG9lcyBub3QgYmVnaW4gd2l0aCBhIC8sIHRoZW4gaXQgaXMgdGFrZW4gdG8gYmUgYSBwYXRoIHJlbGF0aXZlIHRvCi10aGUgU2VydmVyUm9vdC4gVGhlIGRlZmF1bHQgaXMgXGZCY29uZi9odHRwZC5jb25mXGZQLgotLlRQCi0uQkkgXC1DICIgZGlyZWN0aXZlIgotUHJvY2VzcyB0aGUgY29uZmlndXJhdGlvbiBcZklkaXJlY3RpdmVcZlAgYmVmb3JlIHJlYWRpbmcgY29uZmlnIGZpbGVzLgotLlRQCi0uQkkgXC1jICIgZGlyZWN0aXZlIgotUHJvY2VzcyB0aGUgY29uZmlndXJhdGlvbiBcZklkaXJlY3RpdmVcZlAgYWZ0ZXIgcmVhZGluZyBjb25maWcgZmlsZXMuCi0uVFAKLS5CSSBcLUQgIiBwYXJhbWV0ZXIiCi1TZXRzIGEgY29uZmlndXJhdGlvbiBcZklwYXJhbWV0ZXJcZlAgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aAotPElmRGVmaW5lPi4uLjwvSWZEZWZpbmU+IHNlY3Rpb25zIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzCi10byBjb25kaXRpb25hbGx5IHNraXAgb3IgcHJvY2VzcyBjb21tYW5kcy4KLS5UUAotLkIgXC1oCi1PdXRwdXQgYSBzaG9ydCBzdW1tYXJ5IG9mIGF2YWlsYWJsZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLS5UUAotLkIgXC1sCi1PdXRwdXQgYSBsaXN0IG9mIG1vZHVsZXMgY29tcGlsZWQgaW50byB0aGUgc2VydmVyLgotLlRQCi0uQiBcLUwKLU91dHB1dCBhIGxpc3Qgb2YgZGlyZWN0aXZlcyB0b2dldGhlciB3aXRoIGV4cGVjdGVkIGFyZ3VtZW50cyBhbmQKLXBsYWNlcyB3aGVyZSB0aGUgZGlyZWN0aXZlIGlzIHZhbGlkLgotLlRQCi0uQiBcLVMKLVNob3cgdGhlIHNldHRpbmdzIGFzIHBhcnNlZCBmcm9tIHRoZSBjb25maWcgZmlsZSAoY3VycmVudGx5IG9ubHkgc2hvd3MgdGhlCi12aXJ0dWFsaG9zdCBzZXR0aW5ncykuCi0uVFAKLS5CIFwtdAotUnVuIHN5bnRheCB0ZXN0cyBmb3IgY29uZmlndXJhdGlvbiBmaWxlcyBvbmx5LiBUaGUgcHJvZ3JhbSBpbW1lZGlhdGVseSBleGl0cwotYWZ0ZXIgdGhlc2Ugc3ludGF4IHBhcnNpbmcgd2l0aCBlaXRoZXIgYSByZXR1cm4gY29kZSBvZiAwIChTeW50YXggT0spIG9yCi1yZXR1cm4gY29kZSBub3QgZXF1YWwgdG8gMCAoU3ludGF4IEVycm9yKS4KLS5UUAotLkIgXC1UCi1TYW1lIGFzIG9wdGlvbiAKLS5CIFwtdAotYnV0IGRvZXMgbm90IGNoZWNrIHRoZSBjb25maWd1cmVkIGRvY3VtZW50IHJvb3RzLiAKLS5UUAotLkIgXC1YCi1SdW4gaW4gc2luZ2xlLXByb2Nlc3MgbW9kZSwgZm9yIGludGVybmFsIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5OyB0aGUgZGFlbW9uCi1kb2VzIG5vdCBkZXRhY2ggZnJvbSB0aGUgdGVybWluYWwgb3IgZm9yayBhbnkgY2hpbGRyZW4uIERvIE5PVCB1c2UgdGhpcyBtb2RlCi10byBwcm92aWRlIG9yZGluYXJ5IHdlYiBzZXJ2aWNlLgotLlRQCi0uQiBcLXYKLVByaW50IHRoZSB2ZXJzaW9uIG9mIAotLkIgaHR0cGQKLSwgYW5kIHRoZW4gZXhpdC4KLS5UUAotLkIgXC1WCi1QcmludCB0aGUgdmVyc2lvbiBhbmQgYnVpbGQgcGFyYW1ldGVycyBvZiAKLS5CIGh0dHBkCi0sIGFuZCB0aGVuIGV4aXQuCi0uU0ggRklMRVMKLS5QRCAwCi0uQiAvdXNyL2xvY2FsL2FwYWNoZS9jb25mL2h0dHBkLmNvbmYKLS5icgotLkIgL3Vzci9sb2NhbC9hcGFjaGUvY29uZi9zcm0uY29uZgotLmJyCi0uQiAvdXNyL2xvY2FsL2FwYWNoZS9jb25mL2FjY2Vzcy5jb25mCi0uYnIKLS5CIC91c3IvbG9jYWwvYXBhY2hlL2NvbmYvbWltZS50eXBlcwotLmJyCi0uQiAvdXNyL2xvY2FsL2FwYWNoZS9jb25mL21hZ2ljCi0uYnIKLS5CIC91c3IvbG9jYWwvYXBhY2hlL2xvZ3MvZXJyb3JfbG9nCi0uYnIKLS5CIC91c3IvbG9jYWwvYXBhY2hlL2xvZ3MvYWNjZXNzX2xvZwotLmJyCi0uQiAvdXNyL2xvY2FsL2FwYWNoZS9sb2dzL2h0dHBkLnBpZAotLlBECi0uU0ggU0VFIEFMU08KLS5CUiBpbmV0ZCAoOCkuCmRpZmYgLS1naXQgYS9kb2NzL21hbi9sb2dyZXNvbHZlLjggYi9kb2NzL21hbi9sb2dyZXNvbHZlLjgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NTEyNjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW4vbG9ncmVzb2x2ZS44CisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLlRIIGxvZ3Jlc29sdmUgOCAiTWFyY2ggMTk5OCIKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLlwiCi0uXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0uXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0uXCIgYXJlIG1ldDoKLS5cIgotLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLS5cIgotLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0uXCIgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLlwiICAgIGRpc3RyaWJ1dGlvbi4KLS5cIgotLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotLlwiICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotLlwiICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLS5cIiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotLlwiCi0uXCIgNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotLlwiICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0uXCIgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLlwiCi0uXCIgNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLS5cIiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLS5cIiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0uXCIKLS5cIiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0uXCIgICAgYWNrbm93bGVkZ21lbnQ6Ci0uXCIgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotLlwiICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0uXCIKLS5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLS5cIiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0uXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0uXCIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLS5cIiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0uXCIgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0uXCIgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0uXCIgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLS5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0uXCIgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotLlwiIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLS5cIiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0uXCIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS5cIgotLlwiIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0uXCIgaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0uXCIgb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0uXCIgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotLlwiIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLS5cIiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLS5TSCBOQU1FCi1sb2dyZXNvbHZlIFwtIHJlc29sdmUgaG9zdG5hbWVzIGZvciBJUC1hZHJlc3NlcyBpbiBBcGFjaGUgbG9nZmlsZXMKLS5TSCBTWU5PUFNJUwotLkIgbG9ncmVzb2x2ZQotWwotLkJJIFwtcyAiIGZpbGVuYW1lIgotXSBbCi0uQiBcLWMKLV0gPCAKLS5JIGFjY2Vzc19sb2cKLT4KLS5JIGFjY2Vzc19sb2cubmV3Ci0uUFAKLS5TSCBERVNDUklQVElPTgotLkIgbG9ncmVzb2x2ZQotaXMgYSBwb3N0LXByb2Nlc3NpbmcgcHJvZ3JhbSB0byByZXNvbHZlIElQLWFkcmVzc2VzIGluIEFwYWNoZSdzIGFjY2VzcwotbG9nZmlsZXMuICBUbyBtaW5pbWl6ZSBpbXBhY3Qgb24geW91ciBuYW1lc2VydmVyLCBsb2dyZXNvbHZlIGhhcyBpdHMgdmVyeSBvd24KLWludGVybmFsIGhhc2gtdGFibGUgY2FjaGUuIFRoaXMgbWVhbnMgdGhhdCBlYWNoIElQIG51bWJlciB3aWxsIG9ubHkgYmUgbG9va2VkCi11cCB0aGUgZmlyc3QgdGltZSBpdCBpcyBmb3VuZCBpbiB0aGUgbG9nIGZpbGUuCi0uU0ggT1BUSU9OUwotLlRQIDEyCi0uQkkgXC1zICIgZmlsZW5hbWUiCi1TcGVjaWZpZXMgYSBmaWxlbmFtZSB0byByZWNvcmQgc3RhdGlzdGljcy4KLS5UUCAxMgotLkIgXC1jIAotVGhpcyBjYXVzZXMgCi0uQiBsb2dyZXNvbHZlIAotdG8gYXBwbHkgc29tZSBETlMgY2hlY2tzOiBhZnRlciBmaW5kaW5nIHRoZSBob3N0bmFtZSBmcm9tIHRoZSBJUCBhZGRyZXNzLCBpdAotbG9va3MgdXAgdGhlIElQIGFkZHJlc3NlcyBmb3IgdGhlIGhvc3RuYW1lIGFuZCBjaGVja3MgdGhhdCBvbmUgb2YgdGhlc2UKLW1hdGNoZXMgdGhlIG9yaWdpbmFsIGFkZHJlc3MuCi0uUEQKLS5TSCBTRUUgQUxTTwotLkJSIGh0dHBkKDgpCi0uCmRpZmYgLS1naXQgYS9kb2NzL21hbi9yb3RhdGVsb2dzLjggYi9kb2NzL21hbi9yb3RhdGVsb2dzLjgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZTAyZTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW4vcm90YXRlbG9ncy44CisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLlRIIHJvdGF0ZWxvZ3MgOCAiTWFyY2ggMTk5OCIKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLlwiCi0uXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0uXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0uXCIgYXJlIG1ldDoKLS5cIgotLlwiIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLS5cIgotLlwiIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0uXCIgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0uXCIgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLlwiICAgIGRpc3RyaWJ1dGlvbi4KLS5cIgotLlwiIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotLlwiICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotLlwiICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLS5cIiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotLlwiCi0uXCIgNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotLlwiICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0uXCIgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLlwiCi0uXCIgNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLS5cIiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLS5cIiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0uXCIKLS5cIiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0uXCIgICAgYWNrbm93bGVkZ21lbnQ6Ci0uXCIgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotLlwiICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0uXCIKLS5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLS5cIiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0uXCIgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0uXCIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLS5cIiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0uXCIgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0uXCIgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0uXCIgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLS5cIiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0uXCIgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotLlwiIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLS5cIiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0uXCIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS5cIgotLlwiIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0uXCIgaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0uXCIgb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0uXCIgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotLlwiIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLS5cIiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLS5TSCBOQU1FCi1yb3RhdGVsb2dzIFwtIHJvdGF0ZSBBcGFjaGUgbG9ncyB3aXRob3V0IGhhdmluZyB0byBraWxsIHRoZSBzZXJ2ZXIKLS5TSCBTWU5PUFNJUwotLkIgcm90YXRlbG9ncwotLkkgbG9nZmlsZQotLkkgcm90YXRpb250aW1lCi0uUFAKLS5TSCBERVNDUklQVElPTgotLkIgcm90YXRlbG9ncwotaXMgYSBzaW1wbGUgcHJvZ3JhbSBmb3IgdXNlIGluIGNvbmp1bmN0aW9uIHdpdGggQXBhY2hlJ3MgcGlwZWQgbG9nZmlsZQotZmVhdHVyZSB3aGljaCBjYW4gYmUgdXNlZCBsaWtlIHRoaXM6Ci0KLS5maQotICAgVHJhbnNmZXJMb2cgInxyb3RhdGVsb2dzIC9wYXRoL3RvL2xvZ3MvYWNjZXNzX2xvZyA4NjQwMCIKLS5tZgotCi1UaGlzIGNyZWF0ZXMgdGhlIGZpbGVzIC9wYXRoL3RvL2xvZ3MvYWNjZXNzX2xvZy5ubm5uIHdoZXJlIG5ubm4gaXMgdGhlIHN5c3RlbQotdGltZSBhdCB3aGljaCB0aGUgbG9nIG5vbWluYWxseSBzdGFydHMgKHRoaXMgdGltZSB3aWxsIGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mCi10aGUgcm90YXRpb24gdGltZSwgc28geW91IGNhbiBzeW5jaHJvbml6ZSBjcm9uIHNjcmlwdHMgd2l0aCBpdCkuICBBdCB0aGUgZW5kCi1vZiBlYWNoIHJvdGF0aW9uIHRpbWUgKGhlcmUgYWZ0ZXIgMjQgaG91cnMpIGEgbmV3IGxvZyBpcyBzdGFydGVkLgotLlNIIE9QVElPTlMKLS5JUCBcZkJcZklsb2dmaWxlXGZQCi1UaGUgcGF0aCBwbHVzIGJhc2VuYW1lIG9mIHRoZSBsb2dmaWxlLiBUaGUgc3VmZml4IC5ubm5uIGlzIGF1dG9tYXRpY2FsbHkKLWFkZGVkLgotLklQIFxmQlxmSXJvdGF0aW9udGltZVxmUAotVGhlIHJvdGF0aW9uIHRpbWUgaW4gc2Vjb25kcy4KLS5QRAotLlNIIFNFRSBBTFNPCi0uQlIgaHR0cGQoOCkKLS4KZGlmZiAtLWdpdCBhL2RvY3MvbWFuL3N1ZXhlYy44IGIvZG9jcy9tYW4vc3VleGVjLjgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMWQ3YWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW4vc3VleGVjLjgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0uVEggc3VleGVjIDggIk1hcmNoIDE5OTgiCi0uXCIgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5cIgotLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotLlwiIGFyZSBtZXQ6Ci0uXCIKLS5cIiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0uXCIKLS5cIiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotLlwiICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotLlwiICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS5cIiAgICBkaXN0cmlidXRpb24uCi0uXCIKLS5cIiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLS5cIiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLS5cIiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0uXCIgICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLS5cIgotLlwiIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLS5cIiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotLlwiICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS5cIgotLlwiIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0uXCIgICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0uXCIgICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotLlwiCi0uXCIgNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotLlwiICAgIGFja25vd2xlZGdtZW50OgotLlwiICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLS5cIiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotLlwiCi0uXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0uXCIgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotLlwiIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotLlwiIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0uXCIgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLlwiIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotLlwiIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotLlwiIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0uXCIgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotLlwiIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLS5cIiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0uXCIgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotLlwiID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0uXCIKLS5cIiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotLlwiIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotLlwiIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotLlwiIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLS5cIiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0uXCIgcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0uU0ggTkFNRQotc3VleGVjIFwtIFN3aXRjaCBVc2VyIEZvciBFeGVjCi0uU0ggU1lOT1BTSVMKLU5vIHN5bm9wc2lzIGZvciB1c2FnZSwgYmVjYXVzZSB0aGlzIHByb2dyYW0KLWlzIHVzZWQgaW50ZXJuYWxseSBieSBBcGFjaGUgb25seS4gCi0uUFAKLS5TSCBERVNDUklQVElPTgotLkIgc3VleGVjCi1pcyB0aGUgIndyYXBwZXIiIHN1cHBvcnQgcHJvZ3JhbSBmb3IgdGhlIHN1RVhFQyBiZWhhdmlvdXIgZm9yIEFwYWNoZS4KLUl0IGlzIHJ1biBmcm9tIHdpdGhpbiBBcGFjaGUgYXV0b21hdGljYWxseSB0byBzd2l0Y2ggdGhlIHVzZXIgd2hlbgotYW4gZXh0ZXJuYWwgcHJvZ3JhbSBoYXMgdG8gYmUgcnVuIHVuZGVyIGEgZGlmZmVyZW50IHVzZXIuIEZvciBtb3JlCi1pbmZvcm1hdGlvbiBhYm91dCBzdUVYRUMgc2VlIHRoZSBkb2N1bWVudCBgQXBhY2hlIHN1RVhFQyBTdXBwb3J0JwotdW5kZXIgaHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3Mvc3VleGVjLmh0bWwgLgotLlBECi0uU0ggU0VFIEFMU08KLS5CUiBodHRwZCg4KQotLgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvTElDRU5TRSBiL2RvY3MvbWFudWFsL0xJQ0VOU0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYzY1MzguLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvTElDRU5TRQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotCi0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2JpbmQuaHRtbCBiL2RvY3MvbWFudWFsL2JpbmQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViYWNiYi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9iaW5kLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+PEhFQUQ+Ci08VElUTEU+U2V0dGluZyB3aGljaCBhZGRyZXNzZXMgYW5kIHBvcnRzIEFwYWNoZSB1c2VzPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+U2V0dGluZyB3aGljaCBhZGRyZXNzZXMgYW5kIHBvcnRzIEFwYWNoZSB1c2VzPC9IMT4KLQotPEhSPgotCi1XaGVuIEFwYWNoZSBzdGFydHMsIGl0IGNvbm5lY3RzIHRvIHNvbWUgcG9ydCBhbmQgYWRkcmVzcyBvbiB0aGUKLWxvY2FsIG1hY2hpbmUgYW5kIHdhaXRzIGZvciBpbmNvbWluZyByZXF1ZXN0cy4gQnkgZGVmYXVsdCwgaXQKLWxpc3RlbnMgdG8gYWxsIGFkZHJlc3NlcyBvbiB0aGUgbWFjaGluZSwgYW5kIHRvIHRoZSBwb3J0Ci1hcyBzcGVjaWZpZWQgYnkgdGhlIDxUVD5Qb3J0PC9UVD4gZGlyZWN0aXZlIGluIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLUhvd2V2ZXIsIGl0IGNhbiBiZSB0b2xkIHRvIGxpc3RlbiB0byBtb3JlIHRoZSBvbmUgcG9ydCwgb3IgdG8gbGlzdGVuCi10byBvbmx5IHNlbGVjdGVkIGFkZHJlc3Nlcywgb3IgYSBjb21iaW5hdGlvbi4gVGhpcyBpcyBvZnRlbiBjb21iaW5lZAotd2l0aCB0aGUgVmlydHVhbCBIb3N0IGZlYXR1cmUgd2hpY2ggZGV0ZXJtaW5lcyBob3cgQXBhY2hlCi1yZXNwb25kcyB0byBkaWZmZXJlbnQgSVAgYWRkcmVzc2VzLCBob3N0bmFtZXMgYW5kIHBvcnRzLjxQPgotCi1UaGVyZSBhcmUgdHdvIGRpcmVjdGl2ZXMgdXNlZCB0byByZXN0cmljdCBvciBzcGVjaWZ5IHdoaWNoIGFkZHJlc3NlcwotYW5kIHBvcnRzIEFwYWNoZSBsaXN0ZW5zIHRvLgotCi08VUw+Ci08TEk+PEEgSFJFRj0iI2JpbmRhZGRyZXNzIj5CaW5kQWRkcmVzczwvQT4gaXMgdXNlZCB0byByZXN0cmljdCB0aGUgc2VydmVyIHRvCi0gIGxpc3RlbmluZyB0bwotICBhIHNpbmdsZSBhZGRyZXNzLCBhbmQgY2FuIGJlIHVzZWQgdG8gcGVybWl0IG11bHRpcGxlIEFwYWNoZSBzZXJ2ZXJzCi0gIG9uIHRoZSBzYW1lIG1hY2hpbmUgbGlzdGVuaW5nIHRvIGRpZmZlcmVudCBJUCBhZGRyZXNzZXMuCi08TEk+PEEgSFJFRj0iI2xpc3RlbiI+TGlzdGVuPC9BPiBjYW4gYmUgdXNlZCB0byBtYWtlIGEgc2luZ2xlIEFwYWNoZSBzZXJ2ZXIKLSAgbGlzdGVuCi0gIHRvIG1vcmUgdGhhbiBvbmUgYWRkcmVzcyBhbmQvb3IgcG9ydC4KLTwvVUw+Ci0KLTxIMz48QSBOQU1FPSJiaW5kYWRkcmVzcyI+QmluZEFkZHJlc3M8L0E+PC9IMz4KLTxBCi0gSFJFRj0ibW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEJpbmRBZGRyZXNzIDxFTT5bICogfCBJUC1hZGRyZXNzIAotIHwgaG9zdG5hbWUgXTwvRU0+PEJSPgotPEEKLSBIUkVGPSJtb2QvZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5CaW5kQWRkcmVzcyAqPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0ibW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZzxCUj4KLTxBCi0gSFJFRj0ibW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IENvcmU8UD4KLQotTWFrZXMgdGhlIHNlcnZlciBsaXN0ZW4gdG8ganVzdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuIElmIHRoZSBhcmd1bWVudAotaXMgKiwgdGhlIHNlcnZlciBsaXN0ZW5zIHRvIGFsbCBhZGRyZXNzZXMuIFRoZSBwb3J0IGxpc3RlbmVkIHRvCi1pcyBzZXQgd2l0aCB0aGUgPFRUPlBvcnQ8L1RUPiBkaXJlY3RpdmUuIE9ubHkgb25lIEJpbmRBZGRyZXNzCi1zaG91bGQgYmUgdXNlZC4KLQotPEgzPjxBIE5BTUU9Imxpc3RlbiI+TGlzdGVuPC9BPjwvSDM+Ci08QQotIEhSRUY9Im1vZC9kaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBMaXN0ZW4gPEVNPlsgcG9ydCB8IElQLWFkZHJlc3M6cG9ydCBdPC9FTT48QlI+Ci08QQotIEhSRUY9Im1vZC9kaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPm5vbmU8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJtb2QvZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnPEJSPgotPEEKLSBIUkVGPSJtb2QvZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQ29yZTxQPgotCi08VFQ+TGlzdGVuPC9UVD4gY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiA8VFQ+QmluZEFkZHJlc3M8L1RUPiBhbmQKLTxUVD5Qb3J0PC9UVD4uIEl0IHRlbGxzIHRoZSBzZXJ2ZXIgdG8gYWNjZXB0IGluY29taW5nIHJlcXVlc3RzIG9uIHRoZQotc3BlY2lmaWVkIHBvcnQgb3IgYWRkcmVzcy1hbmQtcG9ydCBjb21iaW5hdGlvbi4gSWYgdGhlIGZpcnN0IGZvcm1hdCBpcwotdXNlZCwgd2l0aCBhIHBvcnQgbnVtYmVyIG9ubHksIHRoZSBzZXJ2ZXIgbGlzdGVucyB0byB0aGUgZ2l2ZW4gcG9ydCBvbgotYWxsIGludGVyZmFjZXMsIGluc3RlYWQgb2YgdGhlIHBvcnQgZ2l2ZW4gYnkgdGhlIDxUVD5Qb3J0PC9UVD4KLWRpcmVjdGl2ZS4gSWYgYW4gSVAgYWRkcmVzcyBpcyBnaXZlbiBhcyB3ZWxsIGFzIGEgcG9ydCwgdGhlIHNlcnZlcgotd2lsbCBsaXN0ZW4gb24gdGhlIGdpdmVuIHBvcnQgYW5kIGludGVyZmFjZS4gIDxQPiBNdWx0aXBsZSBMaXN0ZW4KLWRpcmVjdGl2ZXMgbWF5IGJlIHVzZWQgdG8gc3BlY2lmeSBhIG51bWJlciBvZiBhZGRyZXNzZXMgYW5kIHBvcnRzIHRvCi1saXN0ZW4gdG8uIFRoZSBzZXJ2ZXIgd2lsbCByZXNwb25kIHRvIHJlcXVlc3RzIGZyb20gYW55IG9mIHRoZSBsaXN0ZWQKLWFkZHJlc3NlcyBhbmQgcG9ydHMuPFA+Ci0KLUZvciBleGFtcGxlLCB0byBtYWtlIHRoZSBzZXJ2ZXIgYWNjZXB0IGNvbm5lY3Rpb25zIG9uIGJvdGggcG9ydAotODAgYW5kIHBvcnQgODAwMCwgdXNlOgotPFBSRT4KLSAgIExpc3RlbiA4MAotICAgTGlzdGVuIDgwMDAKLTwvUFJFPgotCi1UbyBtYWtlIHRoZSBzZXJ2ZXIgYWNjZXB0IGNvbm5lY3Rpb25zIG9uIHR3byBzcGVjaWZpZWQKLWludGVyZmFjZXMgYW5kIHBvcnQgbnVtYmVycywgdXNlCi08UFJFPgotICAgTGlzdGVuIDE5Mi4xNzAuMi4xOjgwCi0gICBMaXN0ZW4gMTkyLjE3MC4yLjU6ODAwMAotPC9QUkU+Ci0KLTxIMj5Ib3cgdGhpcyB3b3JrcyB3aXRoIFZpcnR1YWwgSG9zdHM8L0gyPgotCi1CaW5kQWRkcmVzcyBhbmQgTGlzdGVuIGRvIG5vdCBpbXBsZW1lbnQgVmlydHVhbCBIb3N0cy4gVGhleSB0ZWxsIHRoZQotbWFpbiBzZXJ2ZXIgd2hhdCBhZGRyZXNzZXMgYW5kIHBvcnRzIHRvIGxpc3RlbiB0by4gIElmIG5vCi0mbHQ7VmlydHVhbEhvc3QmZ3Q7IGRpcmVjdGl2ZXMgYXJlIHVzZWQsIHRoZSBzZXJ2ZXIgd2lsbCBiZWhhdmUgdGhlCi1zYW1lIGZvciBhbGwgYWNjZXB0ZWQgcmVxdWVzdHMuIEhvd2V2ZXIsICZsdDtWaXJ0dWFsSG9zdCZndDsgY2FuIGJlCi11c2VkIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgYmVoYXZpb3IgZm9yIG9uZSBvciBtb3JlIG9mIHRoZSBhZGRyZXNzZXMKLWFuZCBwb3J0cy4gVG8gaW1wbGVtZW50IGEgVmlydHVhbEhvc3QsIHRoZSBzZXJ2ZXIgbXVzdCBmaXJzdCBiZSB0b2xkCi10byBsaXN0ZW4gdG8gdGhlIGFkZHJlc3MgYW5kIHBvcnQgdG8gYmUgdXNlZC4gVGhlbiBhCi0mbHQ7VmlydHVhbEhvc3QmZ3Q7IHNlY3Rpb24gc2hvdWxkIGJlIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWVkIGFkZHJlc3MKLWFuZCBwb3J0IHRvIHNldCB0aGUgYmVoYXZpb3Igb2YgdGhpcyB2aXJ0dWFsIGhvc3QuIE5vdGUgdGhhdCBpZiB0aGUKLSZsdDtWaXJ0dWFsSG9zdCZndDsgaXMgc2V0IGZvciBhbiBhZGRyZXNzIGFuZCBwb3J0IHRoYXQgdGhlIHNlcnZlciBpcwotbm90IGxpc3RlbmluZyB0bywgaXQgY2Fubm90IGJlIGFjY2Vzc2VkLgotCi08SDI+U2VlIGFsc288L0gyPgotCi1TZWUgYWxzbyB0aGUgZG9jdW1lbnRhdGlvbiBvbgotPEEgSFJFRj0idmhvc3RzL2luZGV4Lmh0bWwiPlZpcnR1YWwgSG9zdHM8L0E+LAotPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNiaW5kYWRkcmVzcyI+QmluZEFkZHJlc3MgZGlyZWN0aXZlPC9BPiwKLTxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjcG9ydCI+UG9ydCBkaXJlY3RpdmU8L0E+LAotPEEgSFJFRj0iZG5zLWNhdmVhdHMuaHRtbCI+RE5TIElzc3VlczwvQT4KLWFuZAotPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCN2aXJ0dWFsaG9zdCI+Jmx0O1ZpcnR1YWxIb3N0Jmd0OyBzZWN0aW9uPC9BPi4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvYmluZC5odG1sLmVuIGIvZG9jcy9tYW51YWwvYmluZC5odG1sLmVuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWJhY2JiLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2JpbmQuaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD48SEVBRD4KLTxUSVRMRT5TZXR0aW5nIHdoaWNoIGFkZHJlc3NlcyBhbmQgcG9ydHMgQXBhY2hlIHVzZXM8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5TZXR0aW5nIHdoaWNoIGFkZHJlc3NlcyBhbmQgcG9ydHMgQXBhY2hlIHVzZXM8L0gxPgotCi08SFI+Ci0KLVdoZW4gQXBhY2hlIHN0YXJ0cywgaXQgY29ubmVjdHMgdG8gc29tZSBwb3J0IGFuZCBhZGRyZXNzIG9uIHRoZQotbG9jYWwgbWFjaGluZSBhbmQgd2FpdHMgZm9yIGluY29taW5nIHJlcXVlc3RzLiBCeSBkZWZhdWx0LCBpdAotbGlzdGVucyB0byBhbGwgYWRkcmVzc2VzIG9uIHRoZSBtYWNoaW5lLCBhbmQgdG8gdGhlIHBvcnQKLWFzIHNwZWNpZmllZCBieSB0aGUgPFRUPlBvcnQ8L1RUPiBkaXJlY3RpdmUgaW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uLgotSG93ZXZlciwgaXQgY2FuIGJlIHRvbGQgdG8gbGlzdGVuIHRvIG1vcmUgdGhlIG9uZSBwb3J0LCBvciB0byBsaXN0ZW4KLXRvIG9ubHkgc2VsZWN0ZWQgYWRkcmVzc2VzLCBvciBhIGNvbWJpbmF0aW9uLiBUaGlzIGlzIG9mdGVuIGNvbWJpbmVkCi13aXRoIHRoZSBWaXJ0dWFsIEhvc3QgZmVhdHVyZSB3aGljaCBkZXRlcm1pbmVzIGhvdyBBcGFjaGUKLXJlc3BvbmRzIHRvIGRpZmZlcmVudCBJUCBhZGRyZXNzZXMsIGhvc3RuYW1lcyBhbmQgcG9ydHMuPFA+Ci0KLVRoZXJlIGFyZSB0d28gZGlyZWN0aXZlcyB1c2VkIHRvIHJlc3RyaWN0IG9yIHNwZWNpZnkgd2hpY2ggYWRkcmVzc2VzCi1hbmQgcG9ydHMgQXBhY2hlIGxpc3RlbnMgdG8uCi0KLTxVTD4KLTxMST48QSBIUkVGPSIjYmluZGFkZHJlc3MiPkJpbmRBZGRyZXNzPC9BPiBpcyB1c2VkIHRvIHJlc3RyaWN0IHRoZSBzZXJ2ZXIgdG8KLSAgbGlzdGVuaW5nIHRvCi0gIGEgc2luZ2xlIGFkZHJlc3MsIGFuZCBjYW4gYmUgdXNlZCB0byBwZXJtaXQgbXVsdGlwbGUgQXBhY2hlIHNlcnZlcnMKLSAgb24gdGhlIHNhbWUgbWFjaGluZSBsaXN0ZW5pbmcgdG8gZGlmZmVyZW50IElQIGFkZHJlc3Nlcy4KLTxMST48QSBIUkVGPSIjbGlzdGVuIj5MaXN0ZW48L0E+IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBzaW5nbGUgQXBhY2hlIHNlcnZlcgotICBsaXN0ZW4KLSAgdG8gbW9yZSB0aGFuIG9uZSBhZGRyZXNzIGFuZC9vciBwb3J0LgotPC9VTD4KLQotPEgzPjxBIE5BTUU9ImJpbmRhZGRyZXNzIj5CaW5kQWRkcmVzczwvQT48L0gzPgotPEEKLSBIUkVGPSJtb2QvZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQmluZEFkZHJlc3MgPEVNPlsgKiB8IElQLWFkZHJlc3MgCi0gfCBob3N0bmFtZSBdPC9FTT48QlI+Ci08QQotIEhSRUY9Im1vZC9kaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPkJpbmRBZGRyZXNzICo8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJtb2QvZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnPEJSPgotPEEKLSBIUkVGPSJtb2QvZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQ29yZTxQPgotCi1NYWtlcyB0aGUgc2VydmVyIGxpc3RlbiB0byBqdXN0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4gSWYgdGhlIGFyZ3VtZW50Ci1pcyAqLCB0aGUgc2VydmVyIGxpc3RlbnMgdG8gYWxsIGFkZHJlc3Nlcy4gVGhlIHBvcnQgbGlzdGVuZWQgdG8KLWlzIHNldCB3aXRoIHRoZSA8VFQ+UG9ydDwvVFQ+IGRpcmVjdGl2ZS4gT25seSBvbmUgQmluZEFkZHJlc3MKLXNob3VsZCBiZSB1c2VkLgotCi08SDM+PEEgTkFNRT0ibGlzdGVuIj5MaXN0ZW48L0E+PC9IMz4KLTxBCi0gSFJFRj0ibW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IExpc3RlbiA8RU0+WyBwb3J0IHwgSVAtYWRkcmVzczpwb3J0IF08L0VNPjxCUj4KLTxBCi0gSFJFRj0ibW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+bm9uZTwvQ09ERT48QlI+Ci08QQotIEhSRUY9Im1vZC9kaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9Im1vZC9kaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBDb3JlPFA+Ci0KLTxUVD5MaXN0ZW48L1RUPiBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIDxUVD5CaW5kQWRkcmVzczwvVFQ+IGFuZAotPFRUPlBvcnQ8L1RUPi4gSXQgdGVsbHMgdGhlIHNlcnZlciB0byBhY2NlcHQgaW5jb21pbmcgcmVxdWVzdHMgb24gdGhlCi1zcGVjaWZpZWQgcG9ydCBvciBhZGRyZXNzLWFuZC1wb3J0IGNvbWJpbmF0aW9uLiBJZiB0aGUgZmlyc3QgZm9ybWF0IGlzCi11c2VkLCB3aXRoIGEgcG9ydCBudW1iZXIgb25seSwgdGhlIHNlcnZlciBsaXN0ZW5zIHRvIHRoZSBnaXZlbiBwb3J0IG9uCi1hbGwgaW50ZXJmYWNlcywgaW5zdGVhZCBvZiB0aGUgcG9ydCBnaXZlbiBieSB0aGUgPFRUPlBvcnQ8L1RUPgotZGlyZWN0aXZlLiBJZiBhbiBJUCBhZGRyZXNzIGlzIGdpdmVuIGFzIHdlbGwgYXMgYSBwb3J0LCB0aGUgc2VydmVyCi13aWxsIGxpc3RlbiBvbiB0aGUgZ2l2ZW4gcG9ydCBhbmQgaW50ZXJmYWNlLiAgPFA+IE11bHRpcGxlIExpc3RlbgotZGlyZWN0aXZlcyBtYXkgYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIGFkZHJlc3NlcyBhbmQgcG9ydHMgdG8KLWxpc3RlbiB0by4gVGhlIHNlcnZlciB3aWxsIHJlc3BvbmQgdG8gcmVxdWVzdHMgZnJvbSBhbnkgb2YgdGhlIGxpc3RlZAotYWRkcmVzc2VzIGFuZCBwb3J0cy48UD4KLQotRm9yIGV4YW1wbGUsIHRvIG1ha2UgdGhlIHNlcnZlciBhY2NlcHQgY29ubmVjdGlvbnMgb24gYm90aCBwb3J0Ci04MCBhbmQgcG9ydCA4MDAwLCB1c2U6Ci08UFJFPgotICAgTGlzdGVuIDgwCi0gICBMaXN0ZW4gODAwMAotPC9QUkU+Ci0KLVRvIG1ha2UgdGhlIHNlcnZlciBhY2NlcHQgY29ubmVjdGlvbnMgb24gdHdvIHNwZWNpZmllZAotaW50ZXJmYWNlcyBhbmQgcG9ydCBudW1iZXJzLCB1c2UKLTxQUkU+Ci0gICBMaXN0ZW4gMTkyLjE3MC4yLjE6ODAKLSAgIExpc3RlbiAxOTIuMTcwLjIuNTo4MDAwCi08L1BSRT4KLQotPEgyPkhvdyB0aGlzIHdvcmtzIHdpdGggVmlydHVhbCBIb3N0czwvSDI+Ci0KLUJpbmRBZGRyZXNzIGFuZCBMaXN0ZW4gZG8gbm90IGltcGxlbWVudCBWaXJ0dWFsIEhvc3RzLiBUaGV5IHRlbGwgdGhlCi1tYWluIHNlcnZlciB3aGF0IGFkZHJlc3NlcyBhbmQgcG9ydHMgdG8gbGlzdGVuIHRvLiAgSWYgbm8KLSZsdDtWaXJ0dWFsSG9zdCZndDsgZGlyZWN0aXZlcyBhcmUgdXNlZCwgdGhlIHNlcnZlciB3aWxsIGJlaGF2ZSB0aGUKLXNhbWUgZm9yIGFsbCBhY2NlcHRlZCByZXF1ZXN0cy4gSG93ZXZlciwgJmx0O1ZpcnR1YWxIb3N0Jmd0OyBjYW4gYmUKLXVzZWQgdG8gc3BlY2lmeSBhIGRpZmZlcmVudCBiZWhhdmlvciBmb3Igb25lIG9yIG1vcmUgb2YgdGhlIGFkZHJlc3NlcwotYW5kIHBvcnRzLiBUbyBpbXBsZW1lbnQgYSBWaXJ0dWFsSG9zdCwgdGhlIHNlcnZlciBtdXN0IGZpcnN0IGJlIHRvbGQKLXRvIGxpc3RlbiB0byB0aGUgYWRkcmVzcyBhbmQgcG9ydCB0byBiZSB1c2VkLiBUaGVuIGEKLSZsdDtWaXJ0dWFsSG9zdCZndDsgc2VjdGlvbiBzaG91bGQgYmUgY3JlYXRlZCBmb3IgYSBzcGVjaWZpZWQgYWRkcmVzcwotYW5kIHBvcnQgdG8gc2V0IHRoZSBiZWhhdmlvciBvZiB0aGlzIHZpcnR1YWwgaG9zdC4gTm90ZSB0aGF0IGlmIHRoZQotJmx0O1ZpcnR1YWxIb3N0Jmd0OyBpcyBzZXQgZm9yIGFuIGFkZHJlc3MgYW5kIHBvcnQgdGhhdCB0aGUgc2VydmVyIGlzCi1ub3QgbGlzdGVuaW5nIHRvLCBpdCBjYW5ub3QgYmUgYWNjZXNzZWQuCi0KLTxIMj5TZWUgYWxzbzwvSDI+Ci0KLVNlZSBhbHNvIHRoZSBkb2N1bWVudGF0aW9uIG9uCi08QSBIUkVGPSJ2aG9zdHMvaW5kZXguaHRtbCI+VmlydHVhbCBIb3N0czwvQT4sCi08QSBIUkVGPSJtb2QvY29yZS5odG1sI2JpbmRhZGRyZXNzIj5CaW5kQWRkcmVzcyBkaXJlY3RpdmU8L0E+LAotPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNwb3J0Ij5Qb3J0IGRpcmVjdGl2ZTwvQT4sCi08QSBIUkVGPSJkbnMtY2F2ZWF0cy5odG1sIj5ETlMgSXNzdWVzPC9BPgotYW5kCi08QSBIUkVGPSJtb2QvY29yZS5odG1sI3ZpcnR1YWxob3N0Ij4mbHQ7VmlydHVhbEhvc3QmZ3Q7IHNlY3Rpb248L0E+LgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9jZ2lfcGF0aC5odG1sIGIvZG9jcy9tYW51YWwvY2dpX3BhdGguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI3YmQ5Ni4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9jZ2lfcGF0aC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+PEhFQUQ+Ci08VElUTEU+UEFUSF9JTkZPIENoYW5nZXMgaW4gdGhlIENHSSBFbnZpcm9ubWVudDwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPlBBVEhfSU5GTyBDaGFuZ2VzIGluIHRoZSBDR0kgRW52aXJvbm1lbnQ8L0gxPgotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJvdmVyIj5PdmVydmlldzwvQT48L0gyPgotCi08UD5BcyBpbXBsZW1lbnRlZCBpbiBBcGFjaGUgMS4xLjEgYW5kIGVhcmxpZXIgdmVyc2lvbnMsIHRoZSBtZXRob2QKLUFwYWNoZSB1c2VkIHRvIGNyZWF0ZSBQQVRIX0lORk8gaW4gdGhlIENHSSBlbnZpcm9ubWVudCB3YXMKLWNvdW50ZXJpbnR1aXRpdmUsIGFuZCBjb3VsZCByZXN1bHQgaW4gY3Jhc2hlcyBpbiBjZXJ0YWluIGNhc2VzLiBJbgotQXBhY2hlIDEuMiBhbmQgYmV5b25kLCB0aGlzIGJlaGF2aW9yIGhhcyBjaGFuZ2VkLiBBbHRob3VnaCB0aGlzCi1yZXN1bHRzIGluIHNvbWUgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyB3aXRoIGNlcnRhaW4gbGVnYWN5IENHSQotYXBwbGljYXRpb25zLCB0aGUgQXBhY2hlIDEuMiBiZWhhdmlvciBpcyBzdGlsbCBjb21wYXRpYmxlIHdpdGggdGhlCi1DR0kvMS4xIHNwZWNpZmljYXRpb24sIGFuZCBDR0kgc2NyaXB0cyBjYW4gYmUgZWFzaWx5IG1vZGlmaWVkICg8QQotSFJFRj0iI2NvbXBhdCI+c2VlIGJlbG93PC9BPikuCi0KLTxIMj48QSBOQU1FPSJwcm9iIj5UaGUgUHJvYmxlbTwvQT48L0gyPgotCi08UD5BcGFjaGUgMS4xLjEgYW5kIGVhcmxpZXIgaW1wbGVtZW50ZWQgdGhlIFBBVEhfSU5GTyBhbmQgU0NSSVBUX05BTUUKLWVudmlyb25tZW50IHZhcmlhYmxlcyBieSBsb29raW5nIGF0IHRoZSBmaWxlbmFtZSwgbm90IHRoZSBVUkwuIFdoaWxlCi10aGlzIHJlc3VsdGVkIGluIHRoZSBjb3JyZWN0IHZhbHVlcyBpbiBtYW55IGNhc2VzLCB3aGVuIHRoZSBmaWxlc3lzdGVtCi1wYXRoIHdhcyBvdmVybG9hZGVkIHRvIGNvbnRhaW4gcGF0aCBpbmZvcm1hdGlvbiwgaXQgY291bGQgcmVzdWx0IGluCi1lcnJhbnQgYmVoYXZpb3IuIEZvciBleGFtcGxlLCBpZiB0aGUgZm9sbG93aW5nIGFwcGVhcmVkIGluIGEgY29uZmlnCi1maWxlOgotPFBSRT4KLSAgICAgQWxpYXMgL2NnaS1yYWxwaCAvdXNyL2xvY2FsL2h0dHBkL2NnaS1iaW4vdXNlci5jZ2kvcmFscGgKLTwvUFJFPgotPFA+SW4gdGhpcyBjYXNlLCA8Q09ERT51c2VyLmNnaTwvQ09ERT4gaXMgdGhlIENHSSBzY3JpcHQsIHRoZSAiL3JhbHBoIgotaXMgaW5mb3JtYXRpb24gdG8gYmUgcGFzc2VkIG9udG8gdGhlIENHSS4gSWYgdGhpcyBjb25maWd1cmF0aW9uIHdhcyBpbgotcGxhY2UsIGFuZCBhIHJlcXVlc3QgY2FtZSBmb3IgIjxDT0RFPi9jZ2ktcmFscGgvc2NyaXB0LzwvQ09ERT4iLCB0aGUKLWNvZGUgd291bGQgc2V0IFBBVEhfSU5GTyB0byAiPENPREU+L3JhbHBoL3NjcmlwdDwvQ09ERT4iLCBhbmQKLVNDUklQVF9OQU1FIHRvICI8Q09ERT4vY2dpLTwvQ09ERT4iLiBPYnZpb3VzbHksIHRoZSBsYXR0ZXIgaXMKLWluY29ycmVjdC4gSW4gY2VydGFpbiBjYXNlcywgdGhpcyBjb3VsZCBldmVuIGNhdXNlIHRoZSBzZXJ2ZXIgdG8KLWNyYXNoLjwvUD4KLQotPEgyPjxBIE5BTUU9InNvbHV0aW9uIj5UaGUgU29sdXRpb248L0E+PC9IMj4KLQotPFA+QXBhY2hlIDEuMiBhbmQgbGF0ZXIgbm93IGRldGVybWluZSBTQ1JJUFRfTkFNRSBhbmQgUEFUSF9JTkZPIGJ5Ci1sb29raW5nIGRpcmVjdGx5IGF0IHRoZSBVUkwsIGFuZCBkZXRlcm1pbmluZyBob3cgbXVjaCBvZiB0aGUgVVJMIGlzCi1jbGllbnQtbW9kaWZpYWJsZSwgYW5kIHNldHRpbmcgUEFUSF9JTkZPIHRvIGl0LiBUbyB1c2UgdGhlIGFib3ZlCi1leGFtcGxlLCBQQVRIX0lORk8gd291bGQgYmUgc2V0IHRvICI8Q09ERT4vc2NyaXB0PC9DT0RFPiIsIGFuZAotU0NSSVBUX05BTUUgdG8gIjxDT0RFPi9jZ2ktcmFscGg8L0NPREU+Ii4gVGhpcyBtYWtlcyBzZW5zZSBhbmQgcmVzdWx0cwotaW4gbm8gc2VydmVyIGJlaGF2aW9yIHByb2JsZW1zLiBJdCBhbHNvIHBlcm1pdHMgdGhlIHNjcmlwdCB0byBiZQotZ3VhcmFudGVlZCB0aGF0Ci0iPENPREU+aHR0cDovLyRTRVJWRVJfTkFNRTokU0VSVkVSX1BPUlQkU0NSSVBUX05BTUUkUEFUSF9JTkZPPC9DT0RFPiIKLXdpbGwgYWx3YXlzIGJlIGFuIGFjY2Vzc2libGUgVVJMIHRoYXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IHNjcmlwdCwKLXNvbWV0aGluZyB3aGljaCB3YXMgbm90IG5lY2Vzc2FyaWx5IHRydWUgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucyBvZgotQXBhY2hlLgotCi08UD5Ib3dldmVyLCB0aGUgIjxDT0RFPi9yYWxwaDwvQ09ERT4iCi1pbmZvcm1hdGlvbiBmcm9tIHRoZSA8Q09ERT5BbGlhczwvQ09ERT4gZGlyZWN0aXZlIGlzIGxvc3QuIFRoaXMgaXMKLXVuZm9ydHVuYXRlLCBidXQgd2UgZmVlbCB0aGF0IHVzaW5nIHRoZSBmaWxlc3lzdGVtIHRvIHBhc3MgYWxvbmcgdGhpcwotc29ydCBvZiBpbmZvcm1hdGlvbiBpcyBub3QgYSByZWNvbW1lbmRlZCBtZXRob2QsIGFuZCBhIHNjcmlwdCBtYWtpbmcKLXVzZSBvZiBpdCAiZGVzZXJ2ZXMiIG5vdCB0byB3b3JrLiBBcGFjaGUgMS4yYjMgYW5kIGxhdGVyLCBob3dldmVyLCBkbwotcHJvdmlkZSA8QSBIUkVGPSIjY29tcGF0Ij5hIHdvcmthcm91bmQuPC9BPgotCi08SDI+PEEgTkFNRT0iY29tcGF0Ij5Db21wYXRpYmlsaXR5IHdpdGggUHJldmlvdXMgU2VydmVyczwvQT48L0gyPgotCi08UD5JdCBtYXkgYmUgbmVjZXNzYXJ5IGZvciBhIHNjcmlwdCB0aGF0IHdhcyBkZXNpZ25lZCBmb3IgZWFybGllcgotdmVyc2lvbnMgb2YgQXBhY2hlIG9yIG90aGVyIHNlcnZlcnMgdG8gbmVlZCB0aGUgaW5mb3JtYXRpb24gdGhhdCB0aGUKLW9sZCBQQVRIX0lORk8gdmFyaWFibGUgcHJvdmlkZWQuIEZvciB0aGlzIHB1cnBvc2UsIEFwYWNoZSAxLjIgKDEuMmIzCi1hbmQgbGF0ZXIpIHNldHMgYW4gYWRkaXRpb25hbCB2YXJpYWJsZSwgRklMRVBBVEhfSU5GTy4gVGhpcwotZW52aXJvbm1lbnQgdmFyaWFibGUgY29udGFpbnMgdGhlIHZhbHVlIHRoYXQgUEFUSF9JTkZPIHdvdWxkIGhhdmUgaGFkCi13aXRoIEFwYWNoZSAxLjEuMS48L1A+Ci0KLTxQPkEgc2NyaXB0IHRoYXQgd2lzaGVzIHRvIHdvcmsgd2l0aCBib3RoIEFwYWNoZSAxLjIgYW5kIGVhcmxpZXIKLXZlcnNpb25zIGNhbiBzaW1wbHkgdGVzdCBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBGSUxFUEFUSF9JTkZPLCBhbmQgdXNlCi1pdCBpZiBhdmFpbGFibGUuIE90aGVyd2lzZSwgaXQgY2FuIHVzZSBQQVRIX0lORk8uIEZvciBleGFtcGxlLCBpbgotUGVybCwgb25lIG1pZ2h0IHVzZToKLTxQUkU+Ci0gICAgJHBhdGhfaW5mbyA9ICRFTlZ7J0ZJTEVQQVRIX0lORk8nfSB8fCAkRU5WeydQQVRIX0lORk8nfTsKLTwvUFJFPgotCi08UD5CeSBkb2luZyB0aGlzLCBhIHNjcmlwdCBjYW4gd29yayB3aXRoIGFsbCBzZXJ2ZXJzIHN1cHBvcnRpbmcgdGhlCi1DR0kvMS4xIHNwZWNpZmljYXRpb24sIGluY2x1ZGluZyBhbGwgdmVyc2lvbnMgb2YgQXBhY2hlLjwvUD4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvY2dpX3BhdGguaHRtbC5lbiBiL2RvY3MvbWFudWFsL2NnaV9wYXRoLmh0bWwuZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiN2JkOTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvY2dpX3BhdGguaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPjxIRUFEPgotPFRJVExFPlBBVEhfSU5GTyBDaGFuZ2VzIGluIHRoZSBDR0kgRW52aXJvbm1lbnQ8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5QQVRIX0lORk8gQ2hhbmdlcyBpbiB0aGUgQ0dJIEVudmlyb25tZW50PC9IMT4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0ib3ZlciI+T3ZlcnZpZXc8L0E+PC9IMj4KLQotPFA+QXMgaW1wbGVtZW50ZWQgaW4gQXBhY2hlIDEuMS4xIGFuZCBlYXJsaWVyIHZlcnNpb25zLCB0aGUgbWV0aG9kCi1BcGFjaGUgdXNlZCB0byBjcmVhdGUgUEFUSF9JTkZPIGluIHRoZSBDR0kgZW52aXJvbm1lbnQgd2FzCi1jb3VudGVyaW50dWl0aXZlLCBhbmQgY291bGQgcmVzdWx0IGluIGNyYXNoZXMgaW4gY2VydGFpbiBjYXNlcy4gSW4KLUFwYWNoZSAxLjIgYW5kIGJleW9uZCwgdGhpcyBiZWhhdmlvciBoYXMgY2hhbmdlZC4gQWx0aG91Z2ggdGhpcwotcmVzdWx0cyBpbiBzb21lIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgd2l0aCBjZXJ0YWluIGxlZ2FjeSBDR0kKLWFwcGxpY2F0aW9ucywgdGhlIEFwYWNoZSAxLjIgYmVoYXZpb3IgaXMgc3RpbGwgY29tcGF0aWJsZSB3aXRoIHRoZQotQ0dJLzEuMSBzcGVjaWZpY2F0aW9uLCBhbmQgQ0dJIHNjcmlwdHMgY2FuIGJlIGVhc2lseSBtb2RpZmllZCAoPEEKLUhSRUY9IiNjb21wYXQiPnNlZSBiZWxvdzwvQT4pLgotCi08SDI+PEEgTkFNRT0icHJvYiI+VGhlIFByb2JsZW08L0E+PC9IMj4KLQotPFA+QXBhY2hlIDEuMS4xIGFuZCBlYXJsaWVyIGltcGxlbWVudGVkIHRoZSBQQVRIX0lORk8gYW5kIFNDUklQVF9OQU1FCi1lbnZpcm9ubWVudCB2YXJpYWJsZXMgYnkgbG9va2luZyBhdCB0aGUgZmlsZW5hbWUsIG5vdCB0aGUgVVJMLiBXaGlsZQotdGhpcyByZXN1bHRlZCBpbiB0aGUgY29ycmVjdCB2YWx1ZXMgaW4gbWFueSBjYXNlcywgd2hlbiB0aGUgZmlsZXN5c3RlbQotcGF0aCB3YXMgb3ZlcmxvYWRlZCB0byBjb250YWluIHBhdGggaW5mb3JtYXRpb24sIGl0IGNvdWxkIHJlc3VsdCBpbgotZXJyYW50IGJlaGF2aW9yLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGZvbGxvd2luZyBhcHBlYXJlZCBpbiBhIGNvbmZpZwotZmlsZToKLTxQUkU+Ci0gICAgIEFsaWFzIC9jZ2ktcmFscGggL3Vzci9sb2NhbC9odHRwZC9jZ2ktYmluL3VzZXIuY2dpL3JhbHBoCi08L1BSRT4KLTxQPkluIHRoaXMgY2FzZSwgPENPREU+dXNlci5jZ2k8L0NPREU+IGlzIHRoZSBDR0kgc2NyaXB0LCB0aGUgIi9yYWxwaCIKLWlzIGluZm9ybWF0aW9uIHRvIGJlIHBhc3NlZCBvbnRvIHRoZSBDR0kuIElmIHRoaXMgY29uZmlndXJhdGlvbiB3YXMgaW4KLXBsYWNlLCBhbmQgYSByZXF1ZXN0IGNhbWUgZm9yICI8Q09ERT4vY2dpLXJhbHBoL3NjcmlwdC88L0NPREU+IiwgdGhlCi1jb2RlIHdvdWxkIHNldCBQQVRIX0lORk8gdG8gIjxDT0RFPi9yYWxwaC9zY3JpcHQ8L0NPREU+IiwgYW5kCi1TQ1JJUFRfTkFNRSB0byAiPENPREU+L2NnaS08L0NPREU+Ii4gT2J2aW91c2x5LCB0aGUgbGF0dGVyIGlzCi1pbmNvcnJlY3QuIEluIGNlcnRhaW4gY2FzZXMsIHRoaXMgY291bGQgZXZlbiBjYXVzZSB0aGUgc2VydmVyIHRvCi1jcmFzaC48L1A+Ci0KLTxIMj48QSBOQU1FPSJzb2x1dGlvbiI+VGhlIFNvbHV0aW9uPC9BPjwvSDI+Ci0KLTxQPkFwYWNoZSAxLjIgYW5kIGxhdGVyIG5vdyBkZXRlcm1pbmUgU0NSSVBUX05BTUUgYW5kIFBBVEhfSU5GTyBieQotbG9va2luZyBkaXJlY3RseSBhdCB0aGUgVVJMLCBhbmQgZGV0ZXJtaW5pbmcgaG93IG11Y2ggb2YgdGhlIFVSTCBpcwotY2xpZW50LW1vZGlmaWFibGUsIGFuZCBzZXR0aW5nIFBBVEhfSU5GTyB0byBpdC4gVG8gdXNlIHRoZSBhYm92ZQotZXhhbXBsZSwgUEFUSF9JTkZPIHdvdWxkIGJlIHNldCB0byAiPENPREU+L3NjcmlwdDwvQ09ERT4iLCBhbmQKLVNDUklQVF9OQU1FIHRvICI8Q09ERT4vY2dpLXJhbHBoPC9DT0RFPiIuIFRoaXMgbWFrZXMgc2Vuc2UgYW5kIHJlc3VsdHMKLWluIG5vIHNlcnZlciBiZWhhdmlvciBwcm9ibGVtcy4gSXQgYWxzbyBwZXJtaXRzIHRoZSBzY3JpcHQgdG8gYmUKLWd1YXJhbnRlZWQgdGhhdAotIjxDT0RFPmh0dHA6Ly8kU0VSVkVSX05BTUU6JFNFUlZFUl9QT1JUJFNDUklQVF9OQU1FJFBBVEhfSU5GTzwvQ09ERT4iCi13aWxsIGFsd2F5cyBiZSBhbiBhY2Nlc3NpYmxlIFVSTCB0aGF0IHBvaW50cyB0byB0aGUgY3VycmVudCBzY3JpcHQsCi1zb21ldGhpbmcgd2hpY2ggd2FzIG5vdCBuZWNlc3NhcmlseSB0cnVlIHdpdGggcHJldmlvdXMgdmVyc2lvbnMgb2YKLUFwYWNoZS4KLQotPFA+SG93ZXZlciwgdGhlICI8Q09ERT4vcmFscGg8L0NPREU+IgotaW5mb3JtYXRpb24gZnJvbSB0aGUgPENPREU+QWxpYXM8L0NPREU+IGRpcmVjdGl2ZSBpcyBsb3N0LiBUaGlzIGlzCi11bmZvcnR1bmF0ZSwgYnV0IHdlIGZlZWwgdGhhdCB1c2luZyB0aGUgZmlsZXN5c3RlbSB0byBwYXNzIGFsb25nIHRoaXMKLXNvcnQgb2YgaW5mb3JtYXRpb24gaXMgbm90IGEgcmVjb21tZW5kZWQgbWV0aG9kLCBhbmQgYSBzY3JpcHQgbWFraW5nCi11c2Ugb2YgaXQgImRlc2VydmVzIiBub3QgdG8gd29yay4gQXBhY2hlIDEuMmIzIGFuZCBsYXRlciwgaG93ZXZlciwgZG8KLXByb3ZpZGUgPEEgSFJFRj0iI2NvbXBhdCI+YSB3b3JrYXJvdW5kLjwvQT4KLQotPEgyPjxBIE5BTUU9ImNvbXBhdCI+Q29tcGF0aWJpbGl0eSB3aXRoIFByZXZpb3VzIFNlcnZlcnM8L0E+PC9IMj4KLQotPFA+SXQgbWF5IGJlIG5lY2Vzc2FyeSBmb3IgYSBzY3JpcHQgdGhhdCB3YXMgZGVzaWduZWQgZm9yIGVhcmxpZXIKLXZlcnNpb25zIG9mIEFwYWNoZSBvciBvdGhlciBzZXJ2ZXJzIHRvIG5lZWQgdGhlIGluZm9ybWF0aW9uIHRoYXQgdGhlCi1vbGQgUEFUSF9JTkZPIHZhcmlhYmxlIHByb3ZpZGVkLiBGb3IgdGhpcyBwdXJwb3NlLCBBcGFjaGUgMS4yICgxLjJiMwotYW5kIGxhdGVyKSBzZXRzIGFuIGFkZGl0aW9uYWwgdmFyaWFibGUsIEZJTEVQQVRIX0lORk8uIFRoaXMKLWVudmlyb25tZW50IHZhcmlhYmxlIGNvbnRhaW5zIHRoZSB2YWx1ZSB0aGF0IFBBVEhfSU5GTyB3b3VsZCBoYXZlIGhhZAotd2l0aCBBcGFjaGUgMS4xLjEuPC9QPgotCi08UD5BIHNjcmlwdCB0aGF0IHdpc2hlcyB0byB3b3JrIHdpdGggYm90aCBBcGFjaGUgMS4yIGFuZCBlYXJsaWVyCi12ZXJzaW9ucyBjYW4gc2ltcGx5IHRlc3QgZm9yIHRoZSBleGlzdGVuY2Ugb2YgRklMRVBBVEhfSU5GTywgYW5kIHVzZQotaXQgaWYgYXZhaWxhYmxlLiBPdGhlcndpc2UsIGl0IGNhbiB1c2UgUEFUSF9JTkZPLiBGb3IgZXhhbXBsZSwgaW4KLVBlcmwsIG9uZSBtaWdodCB1c2U6Ci08UFJFPgotICAgICRwYXRoX2luZm8gPSAkRU5WeydGSUxFUEFUSF9JTkZPJ30gfHwgJEVOVnsnUEFUSF9JTkZPJ307Ci08L1BSRT4KLQotPFA+QnkgZG9pbmcgdGhpcywgYSBzY3JpcHQgY2FuIHdvcmsgd2l0aCBhbGwgc2VydmVycyBzdXBwb3J0aW5nIHRoZQotQ0dJLzEuMSBzcGVjaWZpY2F0aW9uLCBpbmNsdWRpbmcgYWxsIHZlcnNpb25zIG9mIEFwYWNoZS48L1A+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2NvbnRlbnQtbmVnb3RpYXRpb24uaHRtbCBiL2RvY3MvbWFudWFsL2NvbnRlbnQtbmVnb3RpYXRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JmYWVlNS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9jb250ZW50LW5lZ290aWF0aW9uLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ODggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgQ29udGVudCBOZWdvdGlhdGlvbjwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPkNvbnRlbnQgTmVnb3RpYXRpb248L0gxPgotCi08UD4KLUFwYWNoZSdzIHN1cHBvcnQgZm9yIGNvbnRlbnQgbmVnb3RpYXRpb24gaGFzIGJlZW4gdXBkYXRlZCB0byBtZWV0IHRoZQotSFRUUC8xLjEgc3BlY2lmaWNhdGlvbi4gSXQgY2FuIGNob29zZSB0aGUgYmVzdCByZXByZXNlbnRhdGlvbiBvZiBhCi1yZXNvdXJjZSBiYXNlZCBvbiB0aGUgYnJvd3Nlci1zdXBwbGllZCBwcmVmZXJlbmNlcyBmb3IgbWVkaWEgdHlwZSwKLWxhbmd1YWdlcywgY2hhcmFjdGVyIHNldCBhbmQgZW5jb2RpbmcuICBJdCBpcyBhbHNvIGltcGxlbWVudHMgYQotY291cGxlIG9mIGZlYXR1cmVzIHRvIGdpdmUgbW9yZSBpbnRlbGxpZ2VudCBoYW5kbGluZyBvZiByZXF1ZXN0cyBmcm9tCi1icm93c2VycyB3aGljaCBzZW5kIGluY29tcGxldGUgbmVnb3RpYXRpb24gaW5mb3JtYXRpb24uICA8UD4KLQotQ29udGVudCBuZWdvdGlhdGlvbiBpcyBwcm92aWRlZCBieSB0aGUKLTxBIEhSRUY9Im1vZC9tb2RfbmVnb3RpYXRpb24uaHRtbCI+bW9kX25lZ290aWF0aW9uPC9BPiBtb2R1bGUsCi13aGljaCBpcyBjb21waWxlZCBpbiBieSBkZWZhdWx0LgotCi08SFI+Ci0KLTxIMj5BYm91dCBDb250ZW50IE5lZ290aWF0aW9uPC9IMj4KLQotPFA+Ci1BIHJlc291cmNlIG1heSBiZSBhdmFpbGFibGUgaW4gc2V2ZXJhbCBkaWZmZXJlbnQgcmVwcmVzZW50YXRpb25zLiBGb3IKLWV4YW1wbGUsIGl0IG1pZ2h0IGJlIGF2YWlsYWJsZSBpbiBkaWZmZXJlbnQgbGFuZ3VhZ2VzIG9yIGRpZmZlcmVudAotbWVkaWEgdHlwZXMsIG9yIGEgY29tYmluYXRpb24uICBPbmUgd2F5IG9mIHNlbGVjdGluZyB0aGUgbW9zdAotYXBwcm9wcmlhdGUgY2hvaWNlIGlzIHRvIGdpdmUgdGhlIHVzZXIgYW4gaW5kZXggcGFnZSwgYW5kIGxldCB0aGVtCi1zZWxlY3QuIEhvd2V2ZXIgaXQgaXMgb2Z0ZW4gcG9zc2libGUgZm9yIHRoZSBzZXJ2ZXIgdG8gY2hvb3NlCi1hdXRvbWF0aWNhbGx5LiBUaGlzIHdvcmtzIGJlY2F1c2UgYnJvd3NlcnMgY2FuIHNlbmQgYXMgcGFydCBvZiBlYWNoCi1yZXF1ZXN0IGluZm9ybWF0aW9uIGFib3V0IHdoYXQgcmVwcmVzZW50YXRpb25zIHRoZXkgcHJlZmVyLiBGb3IKLWV4YW1wbGUsIGEgYnJvd3NlciBjb3VsZCBpbmRpY2F0ZSB0aGF0IGl0IHdvdWxkIGxpa2UgdG8gc2VlCi1pbmZvcm1hdGlvbiBpbiBGcmVuY2gsIGlmIHBvc3NpYmxlLCBlbHNlIEVuZ2xpc2ggd2lsbCBkby4gQnJvd3NlcnMKLWluZGljYXRlIHRoZWlyIHByZWZlcmVuY2VzIGJ5IGhlYWRlcnMgaW4gdGhlIHJlcXVlc3QuIFRvIHJlcXVlc3Qgb25seQotRnJlbmNoIHJlcHJlc2VudGF0aW9ucywgdGhlIGJyb3dzZXIgd291bGQgc2VuZAotCi08UFJFPgotICBBY2NlcHQtTGFuZ3VhZ2U6IGZyCi08L1BSRT4KLQotPFA+Ci1Ob3RlIHRoYXQgdGhpcyBwcmVmZXJlbmNlIHdpbGwgb25seSBiZSBhcHBsaWVkIHdoZW4gdGhlcmUgaXMgYSBjaG9pY2UKLW9mIHJlcHJlc2VudGF0aW9ucyBhbmQgdGhleSB2YXJ5IGJ5IGxhbmd1YWdlLgotPFA+Ci0KLUFzIGFuIGV4YW1wbGUgb2YgYSBtb3JlIGNvbXBsZXggcmVxdWVzdCwgdGhpcyBicm93c2VyIGhhcyBiZWVuCi1jb25maWd1cmVkIHRvIGFjY2VwdCBGcmVuY2ggYW5kIEVuZ2xpc2gsIGJ1dCBwcmVmZXIgRnJlbmNoLCBhbmQgdG8KLWFjY2VwdCB2YXJpb3VzIG1lZGlhIHR5cGVzLCBwcmVmZXJyaW5nIEhUTUwgb3ZlciBwbGFpbiB0ZXh0IG9yIG90aGVyCi10ZXh0IHR5cGVzLCBhbmQgcHJlZmVycmluZyBHSUYgb3IgSlBFRyBvdmVyIG90aGVyIG1lZGlhIHR5cGVzLCBidXQgYWxzbwotYWxsb3dpbmcgYW55IG90aGVyIG1lZGlhIHR5cGUgYXMgYSBsYXN0IHJlc29ydDoKLQotPFBSRT4KLSAgQWNjZXB0LUxhbmd1YWdlOiBmcjsgcT0xLjAsIGVuOyBxPTAuNQotICBBY2NlcHQ6IHRleHQvaHRtbDsgcT0xLjAsIHRleHQvKjsgcT0wLjgsIGltYWdlL2dpZjsgcT0wLjYsCi0gICAgICAgIGltYWdlL2pwZWc7IHE9MC42LCBpbWFnZS8qOyBxPTAuNSwgKi8qOyBxPTAuMQotPC9QUkU+Ci0KLUFwYWNoZSAxLjIgc3VwcG9ydHMgJ3NlcnZlciBkcml2ZW4nIGNvbnRlbnQgbmVnb3RpYXRpb24sIGFzIGRlZmluZWQgaW4KLXRoZSBIVFRQLzEuMSBzcGVjaWZpY2F0aW9uLiBJdCBmdWxseSBzdXBwb3J0cyB0aGUgQWNjZXB0LAotQWNjZXB0LUxhbmd1YWdlLCBBY2NlcHQtQ2hhcnNldCBhbmQgQWNjZXB0LUVuY29kaW5nIHJlcXVlc3QgaGVhZGVycy4KLUFwYWNoZSAxLjMuNCBhbHNvIHN1cHBvcnRzICd0cmFuc3BhcmVudCcgY29udGVudCBuZWdvdGlhdGlvbiwgd2hpY2ggaXMKLWFuIGV4cGVyaW1lbnRhbCBuZWdvdGlhdGlvbiBwcm90b2NvbCBkZWZpbmVkIGluIFJGQyAyMjk1IGFuZCBSRkMgMjI5Ni4KLUl0IGRvZXMgbm90IG9mZmVyIHN1cHBvcnQgZm9yICdmZWF0dXJlIG5lZ290aWF0aW9uJyBhcyBkZWZpbmVkIGluCi10aGVzZSBSRkNzLiAgCi08UD4KLQotQSA8U1RST05HPnJlc291cmNlPC9TVFJPTkc+IGlzIGEgY29uY2VwdHVhbCBlbnRpdHkgaWRlbnRpZmllZCBieSBhIFVSSQotKFJGQyAyMzk2KS4gIEFuIEhUVFAgc2VydmVyIGxpa2UgQXBhY2hlIHByb3ZpZGVzIGFjY2VzcyB0bwotPFNUUk9ORz5yZXByZXNlbnRhdGlvbnM8L1NUUk9ORz4gb2YgdGhlIHJlc291cmNlKHMpIHdpdGhpbiBpdHMgbmFtZXNwYWNlLAotd2l0aCBlYWNoIHJlcHJlc2VudGF0aW9uIGluIHRoZSBmb3JtIG9mIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgd2l0aCBhCi1kZWZpbmVkIG1lZGlhIHR5cGUsIGNoYXJhY3RlciBzZXQsIGVuY29kaW5nLCBldGMuICBFYWNoIHJlc291cmNlIG1heSBiZQotYXNzb2NpYXRlZCB3aXRoIHplcm8sIG9uZSwgb3IgbW9yZSB0aGFuIG9uZSByZXByZXNlbnRhdGlvbgotYXQgYW55IGdpdmVuIHRpbWUuICBJZiBtdWx0aXBsZSByZXByZXNlbnRhdGlvbnMgYXJlIGF2YWlsYWJsZSwKLXRoZSByZXNvdXJjZSBpcyByZWZlcnJlZCB0byBhcyA8U1RST05HPm5lZ290aWFibGU8L1NUUk9ORz4gYW5kIGVhY2ggb2YgaXRzCi1yZXByZXNlbnRhdGlvbnMgaXMgdGVybWVkIGEgPFNUUk9ORz52YXJpYW50PC9TVFJPTkc+LiBUaGUgd2F5cyBpbiB3aGljaCB0aGUKLXZhcmlhbnRzIGZvciBhIG5lZ290aWFibGUgcmVzb3VyY2UgdmFyeSBhcmUgY2FsbGVkIHRoZQotPFNUUk9ORz5kaW1lbnNpb25zPC9TVFJPTkc+IG9mIG5lZ290aWF0aW9uLgotCi08SDI+TmVnb3RpYXRpb24gaW4gQXBhY2hlPC9IMj4KLQotPFA+Ci1JbiBvcmRlciB0byBuZWdvdGlhdGUgYSByZXNvdXJjZSwgdGhlIHNlcnZlciBuZWVkcyB0byBiZSBnaXZlbgotaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBvZiB0aGUgdmFyaWFudHMuIFRoaXMgaXMgZG9uZSBpbiBvbmUgb2YgdHdvCi13YXlzOgotCi08VUw+Ci0gIDxMST4gVXNpbmcgYSB0eXBlIG1hcCAoPEVNPmkuZS48L0VNPiwgYSA8Q09ERT4qLnZhcjwvQ09ERT4gZmlsZSkgd2hpY2gKLSAgICAgICBuYW1lcyB0aGUgZmlsZXMgY29udGFpbmluZyB0aGUgdmFyaWFudHMgZXhwbGljaXRseSwgb3IKLSAgPExJPiBVc2luZyBhICdNdWx0aVZpZXdzJyBzZWFyY2gsIHdoZXJlIHRoZSBzZXJ2ZXIgZG9lcyBhbiBpbXBsaWNpdAotICAgICAgIGZpbGVuYW1lIHBhdHRlcm4gbWF0Y2ggYW5kIGNob29zZXMgZnJvbSBhbW9uZyB0aGUgcmVzdWx0cy4KLTwvVUw+Ci0KLTxIMz5Vc2luZyBhIHR5cGUtbWFwIGZpbGU8L0gzPgotCi08UD4KLUEgdHlwZSBtYXAgaXMgYSBkb2N1bWVudCB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGhhbmRsZXIKLW5hbWVkIDxDT0RFPnR5cGUtbWFwPC9DT0RFPiAob3IsIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3aXRoCi1vbGRlciBBcGFjaGUgY29uZmlndXJhdGlvbnMsIHRoZSBtaW1lIHR5cGUKLTxDT0RFPmFwcGxpY2F0aW9uL3gtdHlwZS1tYXA8L0NPREU+KS4gIE5vdGUgdGhhdCB0byB1c2UgdGhpcyBmZWF0dXJlLAoteW91IG11c3QgaGF2ZSBhIGhhbmRsZXIgc2V0IGluIHRoZSBjb25maWd1cmF0aW9uIHRoYXQgZGVmaW5lcyBhCi1maWxlIHN1ZmZpeCBhcyA8Q09ERT50eXBlLW1hcDwvQ09ERT47IHRoaXMgaXMgYmVzdCBkb25lIHdpdGggYQotCi08UFJFPgotICBBZGRIYW5kbGVyIHR5cGUtbWFwIHZhcgotPC9QUkU+Ci0KLWluIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlLiAgU2VlIHRoZSBjb21tZW50cyBpbiB0aGUgc2FtcGxlIGNvbmZpZwotZmlsZSBmb3IgbW9yZSBkZXRhaWxzLiA8UD4KLQotVHlwZSBtYXAgZmlsZXMgaGF2ZSBhbiBlbnRyeSBmb3IgZWFjaCBhdmFpbGFibGUgdmFyaWFudDsgdGhlc2UgZW50cmllcwotY29uc2lzdCBvZiBjb250aWd1b3VzIEhUVFAtZm9ybWF0IGhlYWRlciBsaW5lcy4gIEVudHJpZXMgZm9yCi1kaWZmZXJlbnQgdmFyaWFudHMgYXJlIHNlcGFyYXRlZCBieSBibGFuayBsaW5lcy4gIEJsYW5rIGxpbmVzIGFyZQotaWxsZWdhbCB3aXRoaW4gYW4gZW50cnkuICBJdCBpcyBjb252ZW50aW9uYWwgdG8gYmVnaW4gYSBtYXAgZmlsZSB3aXRoCi1hbiBlbnRyeSBmb3IgdGhlIGNvbWJpbmVkIGVudGl0eSBhcyBhIHdob2xlIChhbHRob3VnaCB0aGlzCi1pcyBub3QgcmVxdWlyZWQsIGFuZCBpZiBwcmVzZW50IHdpbGwgYmUgaWdub3JlZCkuIEFuIGV4YW1wbGUKLW1hcCBmaWxlIGlzOgotCi08UFJFPgotICBVUkk6IGZvbwotCi0gIFVSSTogZm9vLmVuLmh0bWwKLSAgQ29udGVudC10eXBlOiB0ZXh0L2h0bWwKLSAgQ29udGVudC1sYW5ndWFnZTogZW4KLQotICBVUkk6IGZvby5mci5kZS5odG1sCi0gIENvbnRlbnQtdHlwZTogdGV4dC9odG1sO2NoYXJzZXQ9aXNvLTg4NTktMgotICBDb250ZW50LWxhbmd1YWdlOiBmciwgZGUKLTwvUFJFPgotCi1JZiB0aGUgdmFyaWFudHMgaGF2ZSBkaWZmZXJlbnQgc291cmNlIHF1YWxpdGllcywgdGhhdCBtYXkgYmUgaW5kaWNhdGVkCi1ieSB0aGUgInFzIiBwYXJhbWV0ZXIgdG8gdGhlIG1lZGlhIHR5cGUsIGFzIGluIHRoaXMgcGljdHVyZSAoYXZhaWxhYmxlCi1hcyBqcGVnLCBnaWYsIG9yIEFTQ0lJLWFydCk6Ci0KLTxQUkU+Ci0gIFVSSTogZm9vCi0KLSAgVVJJOiBmb28uanBlZwotICBDb250ZW50LXR5cGU6IGltYWdlL2pwZWc7IHFzPTAuOAotCi0gIFVSSTogZm9vLmdpZgotICBDb250ZW50LXR5cGU6IGltYWdlL2dpZjsgcXM9MC41Ci0KLSAgVVJJOiBmb28udHh0Ci0gIENvbnRlbnQtdHlwZTogdGV4dC9wbGFpbjsgcXM9MC4wMQotPC9QUkU+Ci08UD4KLQotcXMgdmFsdWVzIGNhbiB2YXJ5IGluIHRoZSByYW5nZSAwLjAwMCB0byAxLjAwMC4gTm90ZSB0aGF0IGFueSB2YXJpYW50IHdpdGgKLWEgcXMgdmFsdWUgb2YgMC4wMDAgd2lsbCBuZXZlciBiZSBjaG9zZW4uIFZhcmlhbnRzIHdpdGggbm8gJ3FzJwotcGFyYW1ldGVyIHZhbHVlIGFyZSBnaXZlbiBhIHFzIGZhY3RvciBvZiAxLjAuIFRoZSBxcyBwYXJhbWV0ZXIgaW5kaWNhdGVzCi10aGUgcmVsYXRpdmUgJ3F1YWxpdHknIG9mIHRoaXMgdmFyaWFudCBjb21wYXJlZCB0byB0aGUgb3RoZXIgYXZhaWxhYmxlCi12YXJpYW50cywgaW5kZXBlbmRlbnQgb2YgdGhlIGNsaWVudCdzIGNhcGFiaWxpdGllcy4gIEZvciBleGFtcGxlLCBhIGpwZWcKLWZpbGUgaXMgdXN1YWxseSBvZiBoaWdoZXIgc291cmNlIHF1YWxpdHkgdGhhbiBhbiBhc2NpaSBmaWxlIGlmIGl0IGlzCi1hdHRlbXB0aW5nIHRvIHJlcHJlc2VudCBhIHBob3RvZ3JhcGguICBIb3dldmVyLCBpZiB0aGUgcmVzb3VyY2UgYmVpbmcKLXJlcHJlc2VudGVkIGlzIGFuIG9yaWdpbmFsIGFzY2lpIGFydCwgdGhlbiBhbiBhc2NpaSByZXByZXNlbnRhdGlvbiB3b3VsZAotaGF2ZSBhIGhpZ2hlciBzb3VyY2UgcXVhbGl0eSB0aGFuIGEganBlZyByZXByZXNlbnRhdGlvbi4gIEEgcXMgdmFsdWUKLWlzIHRoZXJlZm9yZSBzcGVjaWZpYyB0byBhIGdpdmVuIHZhcmlhbnQgZGVwZW5kaW5nIG9uIHRoZSBuYXR1cmUgb2YKLXRoZSByZXNvdXJjZSBpdCByZXByZXNlbnRzLgotCi08UD4KLVRoZSBmdWxsIGxpc3Qgb2YgaGVhZGVycyByZWNvZ25pemVkIGlzOgotCi08REw+Ci0gIDxEVD4gPENPREU+VVJJOjwvQ09ERT4KLSAgPEREPiB1cmkgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgdmFyaWFudCAob2YgdGhlIGdpdmVuIG1lZGlhCi0gICAgICAgdHlwZSwgZW5jb2RlZCB3aXRoIHRoZSBnaXZlbiBjb250ZW50IGVuY29kaW5nKS4gIFRoZXNlIGFyZQotICAgICAgIGludGVycHJldGVkIGFzIFVSTHMgcmVsYXRpdmUgdG8gdGhlIG1hcCBmaWxlOyB0aGV5IG11c3QgYmUgb24KLSAgICAgICB0aGUgc2FtZSBzZXJ2ZXIgKCEpLCBhbmQgdGhleSBtdXN0IHJlZmVyIHRvIGZpbGVzIHRvIHdoaWNoIHRoZQotICAgICAgIGNsaWVudCB3b3VsZCBiZSBncmFudGVkIGFjY2VzcyBpZiB0aGV5IHdlcmUgdG8gYmUgcmVxdWVzdGVkCi0gICAgICAgZGlyZWN0bHkuCi0gIDxEVD4gPENPREU+Q29udGVudC1UeXBlOjwvQ09ERT4KLSAgPEREPiBtZWRpYSB0eXBlIC0tLSBjaGFyc2V0LCBsZXZlbCBhbmQgInFzIiBwYXJhbWV0ZXJzIG1heSBiZSBnaXZlbi4gIFRoZXNlCi0gICAgICAgYXJlIG9mdGVuIHJlZmVycmVkIHRvIGFzIE1JTUUgdHlwZXM7IHR5cGljYWwgbWVkaWEgdHlwZXMgYXJlCi0gICAgICAgPENPREU+aW1hZ2UvZ2lmPC9DT0RFPiwgPENPREU+dGV4dC9wbGFpbjwvQ09ERT4sIG9yCi0gICAgICAgPENPREU+dGV4dC9odG1sOyZuYnNwO2xldmVsPTM8L0NPREU+LgotICA8RFQ+IDxDT0RFPkNvbnRlbnQtTGFuZ3VhZ2U6PC9DT0RFPgotICA8REQ+IFRoZSBsYW5ndWFnZXMgb2YgdGhlIHZhcmlhbnQsIHNwZWNpZmllZCBhcyBhbiBJbnRlcm5ldCBzdGFuZGFyZAotICAgICAgIGxhbmd1YWdlIHRhZyBmcm9tIFJGQyAxNzY2ICg8RU0+ZS5nLjwvRU0+LCA8Q09ERT5lbjwvQ09ERT4gZm9yIEVuZ2xpc2gsCi0gICAgICAgPENPREU+a3I8L0NPREU+IGZvciBLb3JlYW4sIDxFTT5ldGMuPC9FTT4pLgotICA8RFQ+IDxDT0RFPkNvbnRlbnQtRW5jb2Rpbmc6PC9DT0RFPgotICA8REQ+IElmIHRoZSBmaWxlIGlzIGNvbXByZXNzZWQsIG9yIG90aGVyd2lzZSBlbmNvZGVkLCByYXRoZXIgdGhhbgotICAgICAgIGNvbnRhaW5pbmcgdGhlIGFjdHVhbCByYXcgZGF0YSwgdGhpcyBzYXlzIGhvdyB0aGF0IHdhcyBkb25lLgotICAgICAgIEFwYWNoZSBvbmx5IHJlY29nbml6ZXMgZW5jb2RpbmdzIHRoYXQgYXJlIGRlZmluZWQgYnkgYW4KLSAgICAgICA8QSBIUkVGPSJtb2QvbW9kX21pbWUuaHRtbCNhZGRlbmNvZGluZyI+QWRkRW5jb2Rpbmc8L0E+IGRpcmVjdGl2ZS4KLSAgICAgICBUaGlzIG5vcm1hbGx5IGluY2x1ZGVzIHRoZSBlbmNvZGluZ3MgPENPREU+eC1jb21wcmVzczwvQ09ERT4KLSAgICAgICBmb3IgY29tcHJlc3MnZCBmaWxlcywgYW5kIDxDT0RFPngtZ3ppcDwvQ09ERT4gZm9yIGd6aXAnZCBmaWxlcy4KLSAgICAgICBUaGUgPENPREU+eC08L0NPREU+IHByZWZpeCBpcyBpZ25vcmVkIGZvciBlbmNvZGluZyBjb21wYXJpc29ucy4KLSAgPERUPiA8Q09ERT5Db250ZW50LUxlbmd0aDo8L0NPREU+Ci0gIDxERD4gVGhlIHNpemUgb2YgdGhlIGZpbGUuICBTcGVjaWZ5aW5nIGNvbnRlbnQKLSAgICAgICBsZW5ndGhzIGluIHRoZSB0eXBlLW1hcCBhbGxvd3MgdGhlIHNlcnZlciB0byBjb21wYXJlIGZpbGUgc2l6ZXMKLSAgICAgICB3aXRob3V0IGNoZWNraW5nIHRoZSBhY3R1YWwgZmlsZXMuCi0gIDxEVD4gPENPREU+RGVzY3JpcHRpb246PC9DT0RFPgotICA8REQ+IEEgaHVtYW4tcmVhZGFibGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgdmFyaWFudC4gIElmIEFwYWNoZSBjYW5ub3QKLSAgICAgICBmaW5kIGFueSBhcHByb3ByaWF0ZSB2YXJpYW50IHRvIHJldHVybiwgaXQgd2lsbCByZXR1cm4gYW4gZXJyb3IgCi0gICAgICAgcmVzcG9uc2Ugd2hpY2ggbGlzdHMgYWxsIGF2YWlsYWJsZSB2YXJpYW50cyBpbnN0ZWFkLiAgU3VjaCBhIHZhcmlhbnQKLSAgICAgICBsaXN0IHdpbGwgaW5jbHVkZSB0aGUgaHVtYW4tcmVhZGFibGUgdmFyaWFudCBkZXNjcmlwdGlvbnMuCi08L0RMPgotCi08SDM+TXVsdGl2aWV3czwvSDM+Ci0KLTxQPgotPENPREU+TXVsdGlWaWV3czwvQ09ERT4gaXMgYSBwZXItZGlyZWN0b3J5IG9wdGlvbiwgbWVhbmluZyBpdCBjYW4gYmUgc2V0IHdpdGgKLWFuIDxDT0RFPk9wdGlvbnM8L0NPREU+IGRpcmVjdGl2ZSB3aXRoaW4gYSA8Q09ERT4mbHQ7RGlyZWN0b3J5Jmd0OzwvQ09ERT4sCi08Q09ERT4mbHQ7TG9jYXRpb24mZ3Q7PC9DT0RFPiBvciA8Q09ERT4mbHQ7RmlsZXMmZ3Q7PC9DT0RFPgotc2VjdGlvbiBpbiA8Q09ERT5hY2Nlc3MuY29uZjwvQ09ERT4sIG9yIChpZiA8Q09ERT5BbGxvd092ZXJyaWRlPC9DT0RFPgotaXMgcHJvcGVybHkgc2V0KSBpbiA8Q09ERT4uaHRhY2Nlc3M8L0NPREU+IGZpbGVzLiAgTm90ZSB0aGF0Ci08Q09ERT5PcHRpb25zIEFsbDwvQ09ERT4gZG9lcyBub3Qgc2V0IDxDT0RFPk11bHRpVmlld3M8L0NPREU+OyB5b3UKLWhhdmUgdG8gYXNrIGZvciBpdCBieSBuYW1lLgotCi08UD4KLVRoZSBlZmZlY3Qgb2YgPENPREU+TXVsdGlWaWV3czwvQ09ERT4gaXMgYXMgZm9sbG93czogaWYgdGhlIHNlcnZlcgotcmVjZWl2ZXMgYSByZXF1ZXN0IGZvciA8Q09ERT4vc29tZS9kaXIvZm9vPC9DT0RFPiwgaWYKLTxDT0RFPi9zb21lL2RpcjwvQ09ERT4gaGFzIDxDT0RFPk11bHRpVmlld3M8L0NPREU+IGVuYWJsZWQsIGFuZAotPENPREU+L3NvbWUvZGlyL2ZvbzwvQ09ERT4gZG9lcyA8RU0+bm90PC9FTT4gZXhpc3QsIHRoZW4gdGhlIHNlcnZlciByZWFkcyB0aGUKLWRpcmVjdG9yeSBsb29raW5nIGZvciBmaWxlcyBuYW1lZCBmb28uKiwgYW5kIGVmZmVjdGl2ZWx5IGZha2VzIHVwIGEKLXR5cGUgbWFwIHdoaWNoIG5hbWVzIGFsbCB0aG9zZSBmaWxlcywgYXNzaWduaW5nIHRoZW0gdGhlIHNhbWUgbWVkaWEKLXR5cGVzIGFuZCBjb250ZW50LWVuY29kaW5ncyBpdCB3b3VsZCBoYXZlIGlmIHRoZSBjbGllbnQgaGFkIGFza2VkIGZvcgotb25lIG9mIHRoZW0gYnkgbmFtZS4gIEl0IHRoZW4gY2hvb3NlcyB0aGUgYmVzdCBtYXRjaCB0byB0aGUgY2xpZW50J3MKLXJlcXVpcmVtZW50cy4KLQotPFA+Ci08Q09ERT5NdWx0aVZpZXdzPC9DT0RFPiBtYXkgYWxzbyBhcHBseSB0byBzZWFyY2hlcyBmb3IgdGhlIGZpbGUgbmFtZWQgYnkgdGhlCi08Q09ERT5EaXJlY3RvcnlJbmRleDwvQ09ERT4gZGlyZWN0aXZlLCBpZiB0aGUgc2VydmVyIGlzIHRyeWluZyB0bwotaW5kZXggYSBkaXJlY3RvcnkuIElmIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIHNwZWNpZnkKLQotPFBSRT4KLSAgRGlyZWN0b3J5SW5kZXggaW5kZXgKLTwvUFJFPgotCi10aGVuIHRoZSBzZXJ2ZXIgd2lsbCBhcmJpdHJhdGUgYmV0d2VlbiA8Q09ERT5pbmRleC5odG1sPC9DT0RFPgotYW5kIDxDT0RFPmluZGV4Lmh0bWwzPC9DT0RFPiBpZiBib3RoIGFyZSBwcmVzZW50LiAgSWYgbmVpdGhlciBhcmUKLXByZXNlbnQsIGFuZCA8Q09ERT5pbmRleC5jZ2k8L0NPREU+IGlzIHRoZXJlLCB0aGUgc2VydmVyIHdpbGwgcnVuIGl0LgotCi08UD4KLUlmIG9uZSBvZiB0aGUgZmlsZXMgZm91bmQgd2hlbiByZWFkaW5nIHRoZSBkaXJlY3RpdmUgaXMgYSBDR0kgc2NyaXB0LAotaXQncyBub3Qgb2J2aW91cyB3aGF0IHNob3VsZCBoYXBwZW4uICBUaGUgY29kZSBnaXZlcyB0aGF0IGNhc2UKLXNwZWNpYWwgdHJlYXRtZW50IC0tLSBpZiB0aGUgcmVxdWVzdCB3YXMgYSBQT1NULCBvciBhIEdFVCB3aXRoCi1RVUVSWV9BUkdTIG9yIFBBVEhfSU5GTywgdGhlIHNjcmlwdCBpcyBnaXZlbiBhbiBleHRyZW1lbHkgaGlnaCBxdWFsaXR5Ci1yYXRpbmcsIGFuZCBnZW5lcmFsbHkgaW52b2tlZDsgb3RoZXJ3aXNlIGl0IGlzIGdpdmVuIGFuIGV4dHJlbWVseSBsb3cKLXF1YWxpdHkgcmF0aW5nLCB3aGljaCBnZW5lcmFsbHkgY2F1c2VzIG9uZSBvZiB0aGUgb3RoZXIgdmlld3MgKGlmIGFueSkKLXRvIGJlIHJldHJpZXZlZC4KLQotPEgyPlRoZSBOZWdvdGlhdGlvbiBNZXRob2RzPC9IMj4KLQotQWZ0ZXIgQXBhY2hlIGhhcyBvYnRhaW5lZCBhIGxpc3Qgb2YgdGhlIHZhcmlhbnRzIGZvciBhIGdpdmVuIHJlc291cmNlLAotZWl0aGVyIGZyb20gYSB0eXBlLW1hcCBmaWxlIG9yIGZyb20gdGhlIGZpbGVuYW1lcyBpbiB0aGUgZGlyZWN0b3J5LCBpdAotaW52b2tlcyBvbmUgb2YgdHdvIG1ldGhvZHMgdG8gZGVjaWRlIG9uIHRoZSAnYmVzdCcgdmFyaWFudCB0bwotcmV0dXJuLCBpZiBhbnkuICBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGtub3cgYW55IG9mIHRoZSBkZXRhaWxzIG9mIGhvdwotbmVnb3RpYXRpb24gYWN0dWFsbHkgdGFrZXMgcGxhY2UgaW4gb3JkZXIgdG8gdXNlIEFwYWNoZSdzIGNvbnRlbnQKLW5lZ290aWF0aW9uIGZlYXR1cmVzLiBIb3dldmVyIHRoZSByZXN0IG9mIHRoaXMgZG9jdW1lbnQgZXhwbGFpbnMgdGhlCi1tZXRob2RzIHVzZWQgZm9yIHRob3NlIGludGVyZXN0ZWQuCi08UD4KLQotVGhlcmUgYXJlIHR3byBuZWdvdGlhdGlvbiBtZXRob2RzOgotCi08T0w+IAotCi08TEk+PFNUUk9ORz5TZXJ2ZXIgZHJpdmVuIG5lZ290aWF0aW9uIHdpdGggdGhlIEFwYWNoZQotYWxnb3JpdGhtPC9TVFJPTkc+IGlzIHVzZWQgaW4gdGhlIG5vcm1hbCBjYXNlLiAgVGhlIEFwYWNoZSBhbGdvcml0aG0gaXMKLWV4cGxhaW5lZCBpbiBtb3JlIGRldGFpbCBiZWxvdy4gIFdoZW4gdGhpcyBhbGdvcml0aG0gaXMgdXNlZCwgQXBhY2hlCi1jYW4gc29tZXRpbWVzICdmaWRkbGUnIHRoZSBxdWFsaXR5IGZhY3RvciBvZiBhIHBhcnRpY3VsYXIgZGltZW5zaW9uIHRvCi1hY2hpZXZlIGEgYmV0dGVyIHJlc3VsdC4gVGhlIHdheXMgQXBhY2hlIGNhbiBmaWRkbGUgcXVhbGl0eSBmYWN0b3JzIGlzCi1leHBsYWluZWQgaW4gbW9yZSBkZXRhaWwgYmVsb3cuCi0KLTxMST48U1RST05HPlRyYW5zcGFyZW50IGNvbnRlbnQgbmVnb3RpYXRpb248L1NUUk9ORz4gaXMgdXNlZCB3aGVuIHRoZQotYnJvd3NlciBzcGVjaWZpY2FsbHkgcmVxdWVzdHMgdGhpcyB0aHJvdWdoIHRoZSBtZWNoYW5pc20gZGVmaW5lZCBpbiBSRkMKLTIyOTUuICBUaGlzIG5lZ290aWF0aW9uIG1ldGhvZCBnaXZlcyB0aGUgYnJvd3NlciBmdWxsIGNvbnRyb2wgb3ZlcgotZGVjaWRpbmcgb24gdGhlICdiZXN0JyB2YXJpYW50LCB0aGUgcmVzdWx0IGlzIHRoZXJlZm9yZSBkZXBlbmRlbnQgb24KLXRoZSBzcGVjaWZpYyBhbGdvcml0aG1zIHVzZWQgYnkgdGhlIGJyb3dzZXIuICBBcyBwYXJ0IG9mIHRoZQotdHJhbnNwYXJlbnQgbmVnb3RpYXRpb24gcHJvY2VzcywgdGhlIGJyb3dzZXIgY2FuIGFzayBBcGFjaGUgdG8gcnVuIHRoZQotJ3JlbW90ZSB2YXJpYW50IHNlbGVjdGlvbiBhbGdvcml0aG0nIGRlZmluZWQgaW4gUkZDIDIyOTYuICA8L1VMPgotCi0KLTxIMz5EaW1lbnNpb25zIG9mIE5lZ290aWF0aW9uPC9IMz4KLQotPFRBQkxFPgotPFRSIHZhbGlnbj0idG9wIj4KLTxUSD5EaW1lbnNpb24KLTxUSD5Ob3RlcwotPFRSIHZhbGlnbj0idG9wIj4KLTxURD5NZWRpYSBUeXBlCi08VEQ+QnJvd3NlciBpbmRpY2F0ZXMgcHJlZmVyZW5jZXMgd2l0aCB0aGUgQWNjZXB0IGhlYWRlciBmaWVsZC4gRWFjaCBpdGVtCi1jYW4gaGF2ZSBhbiBhc3NvY2lhdGVkIHF1YWxpdHkgZmFjdG9yLiBWYXJpYW50IGRlc2NyaXB0aW9uIGNhbiBhbHNvCi1oYXZlIGEgcXVhbGl0eSBmYWN0b3IgKHRoZSAicXMiIHBhcmFtZXRlcikuCi08VFIgdmFsaWduPSJ0b3AiPgotPFREPkxhbmd1YWdlCi08VEQ+QnJvd3NlciBpbmRpY2F0ZXMgcHJlZmVyZW5jZXMgd2l0aCB0aGUgQWNjZXB0LUxhbmd1YWdlIGhlYWRlciBmaWVsZC4KLUVhY2ggaXRlbSBjYW4gaGF2ZSBhIHF1YWxpdHkgZmFjdG9yLiBWYXJpYW50cyBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIG5vbmUsIG9uZQotb3IgbW9yZSB0aGFuIG9uZSBsYW5ndWFnZS4KLTxUUiB2YWxpZ249InRvcCI+Ci08VEQ+RW5jb2RpbmcKLTxURD5Ccm93c2VyIGluZGljYXRlcyBwcmVmZXJlbmNlIHdpdGggdGhlIEFjY2VwdC1FbmNvZGluZyBoZWFkZXIgZmllbGQuCi1FYWNoIGl0ZW0gY2FuIGhhdmUgYSBxdWFsaXR5IGZhY3Rvci4KLTxUUiB2YWxpZ249InRvcCI+Ci08VEQ+Q2hhcnNldAotPFREPkJyb3dzZXIgaW5kaWNhdGVzIHByZWZlcmVuY2Ugd2l0aCB0aGUgQWNjZXB0LUNoYXJzZXQgaGVhZGVyIGZpZWxkLgotRWFjaCBpdGVtIGNhbiBoYXZlIGEgcXVhbGl0eSBmYWN0b3IuCi1WYXJpYW50cyBjYW4gaW5kaWNhdGUgYSBjaGFyc2V0IGFzIGEgcGFyYW1ldGVyIG9mIHRoZSBtZWRpYSB0eXBlLgotPC9UQUJMRT4KLQotPEgzPkFwYWNoZSBOZWdvdGlhdGlvbiBBbGdvcml0aG08L0gzPgotCi08UD4KLUFwYWNoZSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtIHRvIHNlbGVjdCB0aGUgJ2Jlc3QnIHZhcmlhbnQKLShpZiBhbnkpIHRvIHJldHVybiB0byB0aGUgYnJvd3Nlci4gIFRoaXMgYWxnb3JpdGhtIGlzIG5vdAotZnVydGhlciBjb25maWd1cmFibGUuIEl0IG9wZXJhdGVzIGFzIGZvbGxvd3M6Ci0KLTxPTD4KLTxMST5GaXJzdCwgZm9yIGVhY2ggZGltZW5zaW9uIG9mIHRoZSBuZWdvdGlhdGlvbiwgY2hlY2sgdGhlIGFwcHJvcHJpYXRlCi08RU0+QWNjZXB0KjwvRU0+IGhlYWRlciBmaWVsZCBhbmQgYXNzaWduIGEgcXVhbGl0eSB0byBlYWNoCi12YXJpYW50LiBJZiB0aGUgPEVNPkFjY2VwdCo8L0VNPiBoZWFkZXIgZm9yIGFueSBkaW1lbnNpb24gaW1wbGllcyB0aGF0IHRoaXMKLXZhcmlhbnQgaXMgbm90IGFjY2VwdGFibGUsIGVsaW1pbmF0ZSBpdC4gSWYgbm8gdmFyaWFudHMgcmVtYWluLCBnbwotdG8gc3RlcCA0LgotCi08TEk+U2VsZWN0IHRoZSAnYmVzdCcgdmFyaWFudCBieSBhIHByb2Nlc3Mgb2YgZWxpbWluYXRpb24uIEVhY2ggb2YgdGhlCi1mb2xsb3dpbmcgdGVzdHMgaXMgYXBwbGllZCBpbiBvcmRlci4gQW55IHZhcmlhbnRzIG5vdCBzZWxlY3RlZCBhdCBlYWNoCi10ZXN0IGFyZSBlbGltaW5hdGVkLiBBZnRlciBlYWNoIHRlc3QsIGlmIG9ubHkgb25lIHZhcmlhbnQgcmVtYWlucywKLXNlbGVjdCBpdCBhcyB0aGUgYmVzdCBtYXRjaCBhbmQgcHJvY2VlZCB0byBzdGVwIDMuIElmIG1vcmUgdGhhbiBvbmUKLXZhcmlhbnQgcmVtYWlucywgbW92ZSBvbiB0byB0aGUgbmV4dCB0ZXN0LgotCi08T0w+Ci08TEk+TXVsdGlwbHkgdGhlIHF1YWxpdHkgZmFjdG9yIGZyb20gdGhlIEFjY2VwdCBoZWFkZXIgd2l0aCB0aGUKLSAgcXVhbGl0eS1vZi1zb3VyY2UgZmFjdG9yIGZvciB0aGlzIHZhcmlhbnQncyBtZWRpYSB0eXBlLCBhbmQgc2VsZWN0Ci0gIHRoZSB2YXJpYW50cyB3aXRoIHRoZSBoaWdoZXN0IHZhbHVlLgotCi08TEk+U2VsZWN0IHRoZSB2YXJpYW50cyB3aXRoIHRoZSBoaWdoZXN0IGxhbmd1YWdlIHF1YWxpdHkgZmFjdG9yLgotCi08TEk+U2VsZWN0IHRoZSB2YXJpYW50cyB3aXRoIHRoZSBiZXN0IGxhbmd1YWdlIG1hdGNoLCB1c2luZyBlaXRoZXIgdGhlCi0gIG9yZGVyIG9mIGxhbmd1YWdlcyBpbiB0aGUgQWNjZXB0LUxhbmd1YWdlIGhlYWRlciAoaWYgcHJlc2VudCksIG9yIGVsc2UgCi0gIGVsc2UgdGhlIG9yZGVyIG9mIGxhbmd1YWdlcyBpbiB0aGUgPENPREU+TGFuZ3VhZ2VQcmlvcml0eTwvQ09ERT4gCi0gIGRpcmVjdGl2ZSAoaWYgcHJlc2VudCkuCi0KLTxMST5TZWxlY3QgdGhlIHZhcmlhbnRzIHdpdGggdGhlIGhpZ2hlc3QgJ2xldmVsJyBtZWRpYSBwYXJhbWV0ZXIKLSAgKHVzZWQgdG8gZ2l2ZSB0aGUgdmVyc2lvbiBvZiB0ZXh0L2h0bWwgbWVkaWEgdHlwZXMpLgotCi08TEk+U2VsZWN0IHZhcmlhbnRzIHdpdGggdGhlIGJlc3QgY2hhcnNldCBtZWRpYSBwYXJhbWV0ZXJzLAotICBhcyBnaXZlbiBvbiB0aGUgQWNjZXB0LUNoYXJzZXQgaGVhZGVyIGxpbmUuIENoYXJzZXQgSVNPLTg4NTktMQotICBpcyBhY2NlcHRhYmxlIHVubGVzcyBleHBsaWNpdGx5IGV4Y2x1ZGVkLiBWYXJpYW50cyB3aXRoIGEKLSAgPENPREU+dGV4dC8qPC9DT0RFPiBtZWRpYSB0eXBlIGJ1dCBub3QgZXhwbGljaXRseSBhc3NvY2lhdGVkCi0gIHdpdGggYSBwYXJ0aWN1bGFyIGNoYXJzZXQgYXJlIGFzc3VtZWQgdG8gYmUgaW4gSVNPLTg4NTktMS4KLQotPExJPlNlbGVjdCB0aG9zZSB2YXJpYW50cyB3aGljaCBoYXZlIGFzc29jaWF0ZWQKLSAgICBjaGFyc2V0IG1lZGlhIHBhcmFtZXRlcnMgdGhhdCBhcmUgPEVNPm5vdDwvRU0+IElTTy04ODU5LTEuCi0gICAgSWYgdGhlcmUgYXJlIG5vIHN1Y2ggdmFyaWFudHMsIHNlbGVjdCBhbGwgdmFyaWFudHMgaW5zdGVhZC4KLQotPExJPlNlbGVjdCB0aGUgdmFyaWFudHMgd2l0aCB0aGUgYmVzdCBlbmNvZGluZy4gSWYgdGhlcmUgYXJlCi0gIHZhcmlhbnRzIHdpdGggYW4gZW5jb2RpbmcgdGhhdCBpcyBhY2NlcHRhYmxlIHRvIHRoZSB1c2VyLWFnZW50LAotICBzZWxlY3Qgb25seSB0aGVzZSB2YXJpYW50cy4gT3RoZXJ3aXNlIGlmIHRoZXJlIGlzIGEgbWl4IG9mIGVuY29kZWQKLSAgYW5kIG5vbi1lbmNvZGVkIHZhcmlhbnRzLCBzZWxlY3Qgb25seSB0aGUgdW5lbmNvZGVkIHZhcmlhbnRzLgotICBJZiBlaXRoZXIgYWxsIHZhcmlhbnRzIGFyZSBlbmNvZGVkIG9yIGFsbCB2YXJpYW50cyBhcmUgbm90IGVuY29kZWQsIAotICBzZWxlY3QgYWxsIHZhcmlhbnRzLgotCi08TEk+U2VsZWN0IHRoZSB2YXJpYW50cyB3aXRoIHRoZSBzbWFsbGVzdCBjb250ZW50IGxlbmd0aC4KLQotPExJPlNlbGVjdCB0aGUgZmlyc3QgdmFyaWFudCBvZiB0aG9zZSByZW1haW5pbmcuIFRoaXMgd2lsbCBiZSBlaXRoZXIgdGhlCi0gIGZpcnN0IGxpc3RlZCBpbiB0aGUgdHlwZS1tYXAgZmlsZSwgb3Igd2hlbiB2YXJpYW50cyBhcmUgcmVhZCBmcm9tCi0gIHRoZSBkaXJlY3RvcnksIHRoZSBvbmUgd2hvc2UgZmlsZSBuYW1lIGNvbWVzIGZpcnN0IHdoZW4gc29ydGVkIHVzaW5nCi0gIEFTQ0lJIGNvZGUgb3JkZXIuCi0KLTwvT0w+Ci0KLTxMST5UaGUgYWxnb3JpdGhtIGhhcyBub3cgc2VsZWN0ZWQgb25lICdiZXN0JyB2YXJpYW50LCBzbyByZXR1cm4KLSAgaXQgYXMgdGhlIHJlc3BvbnNlLiBUaGUgSFRUUCByZXNwb25zZSBoZWFkZXIgVmFyeSBpcyBzZXQgdG8gaW5kaWNhdGUgdGhlCi0gIGRpbWVuc2lvbnMgb2YgbmVnb3RpYXRpb24gKGJyb3dzZXJzIGFuZCBjYWNoZXMgY2FuIHVzZSB0aGlzCi0gIGluZm9ybWF0aW9uIHdoZW4gY2FjaGluZyB0aGUgcmVzb3VyY2UpLiBFbmQuCi0KLTxMST5UbyBnZXQgaGVyZSBtZWFucyBubyB2YXJpYW50IHdhcyBzZWxlY3RlZCAoYmVjYXVzZSBub25lIGFyZSBhY2NlcHRhYmxlCi0gIHRvIHRoZSBicm93c2VyKS4gUmV0dXJuIGEgNDA2IHN0YXR1cyAobWVhbmluZyAiTm8gYWNjZXB0YWJsZSByZXByZXNlbnRhdGlvbiIpCi0gIHdpdGggYSByZXNwb25zZSBib2R5IGNvbnNpc3Rpbmcgb2YgYW4gSFRNTCBkb2N1bWVudCBsaXN0aW5nIHRoZQotICBhdmFpbGFibGUgdmFyaWFudHMuIEFsc28gc2V0IHRoZSBIVFRQIFZhcnkgaGVhZGVyIHRvIGluZGljYXRlIHRoZQotICBkaW1lbnNpb25zIG9mIHZhcmlhbmNlLgotCi08L09MPgotCi08SDI+PEEgTkFNRT0iYmV0dGVyIj5GaWRkbGluZyB3aXRoIFF1YWxpdHkgVmFsdWVzPC9BPjwvSDI+Ci0KLTxQPiAKLUFwYWNoZSBzb21ldGltZXMgY2hhbmdlcyB0aGUgcXVhbGl0eSB2YWx1ZXMgZnJvbSB3aGF0IHdvdWxkIGJlCi1leHBlY3RlZCBieSBhIHN0cmljdCBpbnRlcnByZXRhdGlvbiBvZiB0aGUgQXBhY2hlIG5lZ290aWF0aW9uCi1hbGdvcml0aG0gYWJvdmUuIFRoaXMgaXMgdG8gZ2V0IGEgYmV0dGVyIHJlc3VsdCBmcm9tIHRoZSBhbGdvcml0aG0gZm9yCi1icm93c2VycyB3aGljaCBkbyBub3Qgc2VuZCBmdWxsIG9yIGFjY3VyYXRlIGluZm9ybWF0aW9uLiBTb21lIG9mIHRoZQotbW9zdCBwb3B1bGFyIGJyb3dzZXJzIHNlbmQgQWNjZXB0IGhlYWRlciBpbmZvcm1hdGlvbiB3aGljaCB3b3VsZAotb3RoZXJ3aXNlIHJlc3VsdCBpbiB0aGUgc2VsZWN0aW9uIG9mIHRoZSB3cm9uZyB2YXJpYW50IGluIG1hbnkKLWNhc2VzLiBJZiBhIGJyb3dzZXIgc2VuZHMgZnVsbCBhbmQgY29ycmVjdCBpbmZvcm1hdGlvbiB0aGVzZSBmaWRkbGVzCi13aWxsIG5vdCBiZSBhcHBsaWVkLgotPFA+Ci0KLTxIMz5NZWRpYSBUeXBlcyBhbmQgV2lsZGNhcmRzPC9IMz4KLQotPFA+Ci1UaGUgQWNjZXB0OiByZXF1ZXN0IGhlYWRlciBpbmRpY2F0ZXMgcHJlZmVyZW5jZXMgZm9yIG1lZGlhIHR5cGVzLiBJdAotY2FuIGFsc28gaW5jbHVkZSAnd2lsZGNhcmQnIG1lZGlhIHR5cGVzLCBzdWNoIGFzICJpbWFnZS8qIiBvciAiKi8qIgotd2hlcmUgdGhlICogbWF0Y2hlcyBhbnkgc3RyaW5nLiBTbyBhIHJlcXVlc3QgaW5jbHVkaW5nOgotPFBSRT4KLSAgQWNjZXB0OiBpbWFnZS8qLCAqLyoKLTwvUFJFPgotCi13b3VsZCBpbmRpY2F0ZSB0aGF0IGFueSB0eXBlIHN0YXJ0aW5nICJpbWFnZS8iIGlzIGFjY2VwdGFibGUsCi1hcyBpcyBhbnkgb3RoZXIgdHlwZSAoc28gdGhlIGZpcnN0ICJpbWFnZS8qIiBpcyByZWR1bmRhbnQpLiBTb21lCi1icm93c2VycyByb3V0aW5lbHkgc2VuZCB3aWxkY2FyZHMgaW4gYWRkaXRpb24gdG8gZXhwbGljaXQgdHlwZXMgdGhleQotY2FuIGhhbmRsZS4gRm9yIGV4YW1wbGU6Ci08UFJFPgotICBBY2NlcHQ6IHRleHQvaHRtbCwgdGV4dC9wbGFpbiwgaW1hZ2UvZ2lmLCBpbWFnZS9qcGVnLCAqLyoKLTwvUFJFPgotCi1UaGUgaW50ZW50aW9uIG9mIHRoaXMgaXMgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZXhwbGljaXRseQotbGlzdGVkIHR5cGVzIGFyZSBwcmVmZXJyZWQsIGJ1dCBpZiBhIGRpZmZlcmVudCByZXByZXNlbnRhdGlvbiBpcwotYXZhaWxhYmxlLCB0aGF0IGlzIG9rIHRvby4gSG93ZXZlciB1bmRlciB0aGUgYmFzaWMgYWxnb3JpdGhtLCBhcyBnaXZlbgotYWJvdmUsIHRoZSAqLyogd2lsZGNhcmQgaGFzIGV4YWN0bHkgZXF1YWwgcHJlZmVyZW5jZSB0byBhbGwgdGhlIG90aGVyCi10eXBlcywgc28gdGhleSBhcmUgbm90IGJlaW5nIHByZWZlcnJlZC4gVGhlIGJyb3dzZXIgc2hvdWxkIHJlYWxseSBoYXZlCi1zZW50IGEgcmVxdWVzdCB3aXRoIGEgbG93ZXIgcXVhbGl0eSAocHJlZmVyZW5jZSkgdmFsdWUgZm9yICouKiwgc3VjaAotYXM6Ci08UFJFPgotICBBY2NlcHQ6IHRleHQvaHRtbCwgdGV4dC9wbGFpbiwgaW1hZ2UvZ2lmLCBpbWFnZS9qcGVnLCAqLyo7IHE9MC4wMQotPC9QUkU+Ci0KLVRoZSBleHBsaWNpdCB0eXBlcyBoYXZlIG5vIHF1YWxpdHkgZmFjdG9yLCBzbyB0aGV5IGRlZmF1bHQgdG8gYQotcHJlZmVyZW5jZSBvZiAxLjAgKHRoZSBoaWdoZXN0KS4gVGhlIHdpbGRjYXJkICovKiBpcyBnaXZlbgotYSBsb3cgcHJlZmVyZW5jZSBvZiAwLjAxLCBzbyBvdGhlciB0eXBlcyB3aWxsIG9ubHkgYmUgcmV0dXJuZWQgaWYKLW5vIHZhcmlhbnQgbWF0Y2hlcyBhbiBleHBsaWNpdGx5IGxpc3RlZCB0eXBlLgotPFA+Ci0KLUlmIHRoZSBBY2NlcHQ6IGhlYWRlciBjb250YWlucyA8RU0+bm88L0VNPiBxIGZhY3RvcnMgYXQgYWxsLCBBcGFjaGUgc2V0cwotdGhlIHEgdmFsdWUgb2YgIiovKiIsIGlmIHByZXNlbnQsIHRvIDAuMDEgdG8gZW11bGF0ZSB0aGUgZGVzaXJlZAotYmVoYXZpb3IuIEl0IGFsc28gc2V0cyB0aGUgcSB2YWx1ZSBvZiB3aWxkY2FyZHMgb2YgdGhlIGZvcm1hdAotInR5cGUvKiIgdG8gMC4wMiAoc28gdGhlc2UgYXJlIHByZWZlcnJlZCBvdmVyIG1hdGNoZXMgYWdhaW5zdAotIiovKiIuIElmIGFueSBtZWRpYSB0eXBlIG9uIHRoZSBBY2NlcHQ6IGhlYWRlciBjb250YWlucyBhIHEgZmFjdG9yLAotdGhlc2Ugc3BlY2lhbCB2YWx1ZXMgYXJlIDxFTT5ub3Q8L0VNPiBhcHBsaWVkLCBzbyByZXF1ZXN0cyBmcm9tIGJyb3dzZXJzCi13aGljaCBzZW5kIHRoZSBjb3JyZWN0IGluZm9ybWF0aW9uIHRvIHN0YXJ0IHdpdGggd29yayBhcyBleHBlY3RlZC4KLQotPEgzPlZhcmlhbnRzIHdpdGggbm8gTGFuZ3VhZ2U8L0gzPgotCi08UD4KLUlmIHNvbWUgb2YgdGhlIHZhcmlhbnRzIGZvciBhIHBhcnRpY3VsYXIgcmVzb3VyY2UgaGF2ZSBhIGxhbmd1YWdlCi1hdHRyaWJ1dGUsIGFuZCBzb21lIGRvIG5vdCwgdGhvc2UgdmFyaWFudHMgd2l0aCBubyBsYW5ndWFnZQotYXJlIGdpdmVuIGEgdmVyeSBsb3cgbGFuZ3VhZ2UgcXVhbGl0eSBmYWN0b3Igb2YgMC4wMDEuPFA+Ci0KLVRoZSByZWFzb24gZm9yIHNldHRpbmcgdGhpcyBsYW5ndWFnZSBxdWFsaXR5IGZhY3RvciBmb3IKLXZhcmlhbnQgd2l0aCBubyBsYW5ndWFnZSB0byBhIHZlcnkgbG93IHZhbHVlIGlzIHRvIGFsbG93Ci1mb3IgYSBkZWZhdWx0IHZhcmlhbnQgd2hpY2ggY2FuIGJlIHN1cHBsaWVkIGlmIG5vbmUgb2YgdGhlCi1vdGhlciB2YXJpYW50cyBtYXRjaCB0aGUgYnJvd3NlcidzIGxhbmd1YWdlIHByZWZlcmVuY2VzLgotCi1Gb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIHNpdHVhdGlvbiB3aXRoIHRocmVlIHZhcmlhbnRzOgotCi08VUw+Ci08TEk+Zm9vLmVuLmh0bWwsIGxhbmd1YWdlIGVuCi08TEk+Zm9vLmZyLmh0bWwsIGxhbmd1YWdlIGVuCi08TEk+Zm9vLmh0bWwsIG5vIGxhbmd1YWdlCi08L1VMPgotCi08UD4KLVRoZSBtZWFuaW5nIG9mIGEgdmFyaWFudCB3aXRoIG5vIGxhbmd1YWdlIGlzIHRoYXQgaXQgaXMKLWFsd2F5cyBhY2NlcHRhYmxlIHRvIHRoZSBicm93c2VyLiBJZiB0aGUgcmVxdWVzdCBBY2NlcHQtTGFuZ3VhZ2UKLWhlYWRlciBpbmNsdWRlcyBlaXRoZXIgZW4gb3IgZnIgKG9yIGJvdGgpIG9uZSBvZiBmb28uZW4uaHRtbAotb3IgZm9vLmZyLmh0bWwgd2lsbCBiZSByZXR1cm5lZC4gSWYgdGhlIGJyb3dzZXIgZG9lcyBub3QgbGlzdAotZWl0aGVyIGVuIG9yIGZyIGFzIGFjY2VwdGFibGUsIGZvby5odG1sIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZC4KLQotPEgyPkV4dGVuc2lvbnMgdG8gVHJhbnNwYXJlbnQgQ29udGVudCBOZWdvdGlhdGlvbjwvSDI+Ci0KLUFwYWNoZSBleHRlbmRzIHRoZSB0cmFuc3BhcmVudCBjb250ZW50IG5lZ290aWF0aW9uIHByb3RvY29sIChSRkMgMjI5NSkKLWFzIGZvbGxvd3MuICBBIG5ldyA8Q09ERT4ge2VuY29kaW5nIC4ufTwvQ09ERT4gZWxlbWVudCBpcyB1c2VkIGluCi12YXJpYW50IGxpc3RzIHRvIGxhYmVsIHZhcmlhbnRzIHdoaWNoIGFyZSBhdmFpbGFibGUgd2l0aCBhIHNwZWNpZmljCi1jb250ZW50LWVuY29kaW5nIG9ubHkuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLVJWU0EvMS4wIGFsZ29yaXRobSAoUkZDIDIyOTYpIGlzIGV4dGVuZGVkIHRvIHJlY29nbml6ZSBlbmNvZGVkCi12YXJpYW50cyBpbiB0aGUgbGlzdCwgYW5kIHRvIHVzZSB0aGVtIGFzIGNhbmRpZGF0ZSB2YXJpYW50cyB3aGVuZXZlcgotdGhlaXIgZW5jb2RpbmdzIGFyZSBhY2NlcHRhYmxlIGFjY29yZGluZyB0byB0aGUgQWNjZXB0LUVuY29kaW5nCi1yZXF1ZXN0IGhlYWRlci4gIFRoZSBSVlNBLzEuMCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCByb3VuZCBjb21wdXRlZAotcXVhbGl0eSBmYWN0b3JzIHRvIDUgZGVjaW1hbCBwbGFjZXMgYmVmb3JlIGNob29zaW5nIHRoZSBiZXN0IHZhcmlhbnQuCi0KLTxIMj5Ob3RlIG9uIGh5cGVybGlua3MgYW5kIG5hbWluZyBjb252ZW50aW9uczwvSDI+Ci0KLTxQPgotSWYgeW91IGFyZSB1c2luZyBsYW5ndWFnZSBuZWdvdGlhdGlvbiB5b3UgY2FuIGNob29zZSBiZXR3ZWVuCi1kaWZmZXJlbnQgbmFtaW5nIGNvbnZlbnRpb25zLCBiZWNhdXNlIGZpbGVzIGNhbiBoYXZlIG1vcmUgdGhhbiBvbmUKLWV4dGVuc2lvbiwgYW5kIHRoZSBvcmRlciBvZiB0aGUgZXh0ZW5zaW9ucyBpcyBub3JtYWxseSBpcnJlbGV2YW50Ci0oc2VlIDxBIEhSRUY9Im1vZC9tb2RfbWltZS5odG1sIj5tb2RfbWltZTwvQT4gZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscykuCi08UD4KLUEgdHlwaWNhbCBmaWxlIGhhcyBhIE1JTUUtdHlwZSBleHRlbnNpb24gKDxFTT5lLmcuPC9FTT4sIDxTQU1QPmh0bWw8L1NBTVA+KSwKLW1heWJlIGFuIGVuY29kaW5nIGV4dGVuc2lvbiAoPEVNPmUuZy48L0VNPiwgPFNBTVA+Z3o8L1NBTVA+KSwgYW5kIG9mIGNvdXJzZSBhCi1sYW5ndWFnZSBleHRlbnNpb24gKDxFTT5lLmcuPC9FTT4sIDxTQU1QPmVuPC9TQU1QPikgd2hlbiB3ZSBoYXZlIGRpZmZlcmVudAotbGFuZ3VhZ2UgdmFyaWFudHMgb2YgdGhpcyBmaWxlLgotCi08UD4KLUV4YW1wbGVzOgotPFVMPgotPExJPmZvby5lbi5odG1sCi08TEk+Zm9vLmh0bWwuZW4KLTxMST5mb28uZW4uaHRtbC5negotPC9VTD4KLQotPFA+Ci1IZXJlIHNvbWUgbW9yZSBleGFtcGxlcyBvZiBmaWxlbmFtZXMgdG9nZXRoZXIgd2l0aCB2YWxpZCBhbmQgaW52YWxpZAotaHlwZXJsaW5rczoKLTwvUD4KLQotPFRBQkxFIEJPUkRFUj0xIENFTExQQURESU5HPTggQ0VMTFNQQUNJTkc9MD4KLTxUUj4KLSA8VEg+RmlsZW5hbWU8L1RIPgotIDxUSD5WYWxpZCBoeXBlcmxpbms8L1RIPgotIDxUSD5JbnZhbGlkIGh5cGVybGluazwvVEg+Ci08L1RSPgotPFRSPgotIDxURD48RU0+Zm9vLmh0bWwuZW48L0VNPjwvVEQ+Ci0gPFREPmZvbzxCUj4KLSAgICAgZm9vLmh0bWw8L1REPgotIDxURD4tPC9URD4KLTwvVFI+Ci08VFI+Ci0gPFREPjxFTT5mb28uZW4uaHRtbDwvRU0+PC9URD4KLSA8VEQ+Zm9vPC9URD4KLSA8VEQ+Zm9vLmh0bWw8L1REPgotPC9UUj4KLTxUUj4KLSA8VEQ+PEVNPmZvby5odG1sLmVuLmd6PC9FTT48L1REPgotIDxURD5mb288QlI+Ci0gICAgIGZvby5odG1sPC9URD4KLSA8VEQ+Zm9vLmd6PEJSPgotICAgICBmb28uaHRtbC5nejwvVEQ+Ci08L1RSPgotPFRSPgotIDxURD48RU0+Zm9vLmVuLmh0bWwuZ3o8L0VNPjwvVEQ+Ci0gPFREPmZvbzwvVEQ+Ci0gPFREPmZvby5odG1sPEJSPgotICAgICBmb28uaHRtbC5nejxCUj4KLSAgICAgZm9vLmd6PC9URD4KLTwvVFI+Ci08VFI+Ci0gPFREPjxFTT5mb28uZ3ouaHRtbC5lbjwvRU0+PC9URD4KLSA8VEQ+Zm9vPEJSPgotICAgICBmb28uZ3o8QlI+Ci0gICAgIGZvby5nei5odG1sPC9URD4KLSA8VEQ+Zm9vLmh0bWw8L1REPgotPC9UUj4KLTxUUj4KLSA8VEQ+PEVNPmZvby5odG1sLmd6LmVuPC9FTT48L1REPgotIDxURD5mb288QlI+Ci0gICAgIGZvby5odG1sPEJSPgotICAgICBmb28uaHRtbC5nejwvVEQ+Ci0gPFREPmZvby5nejwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotPFA+Ci1Mb29raW5nIGF0IHRoZSB0YWJsZSBhYm92ZSB5b3Ugd2lsbCBub3RpY2UgdGhhdCBpdCBpcyBhbHdheXMgcG9zc2libGUgdG8KLXVzZSB0aGUgbmFtZSB3aXRob3V0IGFueSBleHRlbnNpb25zICBpbiBhbiBoeXBlcmxpbmsgKDxFTT5lLmcuPC9FTT4sIDxTQU1QPmZvbzwvU0FNUD4pLgotVGhlIGFkdmFudGFnZSBpcyB0aGF0IHlvdSBjYW4gaGlkZSB0aGUgYWN0dWFsIHR5cGUgb2YgYQotZG9jdW1lbnQgcnNwLiBmaWxlIGFuZCBjYW4gY2hhbmdlIGl0IGxhdGVyLCA8RU0+ZS5nLjwvRU0+LCBmcm9tIDxTQU1QPmh0bWw8L1NBTVA+Ci10byA8U0FNUD5zaHRtbDwvU0FNUD4gb3IgPFNBTVA+Y2dpPC9TQU1QPiB3aXRob3V0IGNoYW5naW5nIGFueQotaHlwZXJsaW5rIHJlZmVyZW5jZXMuCi0KLTxQPgotSWYgeW91IHdhbnQgdG8gY29udGludWUgdG8gdXNlIGEgTUlNRS10eXBlIGluIHlvdXIgaHlwZXJsaW5rcyAoPEVNPmUuZy48L0VNPgotPFNBTVA+Zm9vLmh0bWw8L1NBTVA+KSB0aGUgbGFuZ3VhZ2UgZXh0ZW5zaW9uIChpbmNsdWRpbmcgYW4gZW5jb2RpbmcgZXh0ZW5zaW9uCi1pZiB0aGVyZSBpcyBvbmUpIG11c3QgYmUgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgTUlNRS10eXBlIGV4dGVuc2lvbgotKDxFTT5lLmcuPC9FTT4sIDxTQU1QPmZvby5odG1sLmVuPC9TQU1QPikuCi0KLQotPEgyPk5vdGUgb24gQ2FjaGluZzwvSDI+Ci0KLTxQPgotV2hlbiBhIGNhY2hlIHN0b3JlcyBhIHJlcHJlc2VudGF0aW9uLCBpdCBhc3NvY2lhdGVzIGl0IHdpdGggdGhlIHJlcXVlc3QgVVJMLgotVGhlIG5leHQgdGltZSB0aGF0IFVSTCBpcyByZXF1ZXN0ZWQsIHRoZSBjYWNoZSBjYW4gdXNlIHRoZSBzdG9yZWQKLXJlcHJlc2VudGF0aW9uLiBCdXQsIGlmIHRoZSByZXNvdXJjZSBpcyBuZWdvdGlhYmxlIGF0IHRoZSBzZXJ2ZXIsCi10aGlzIG1pZ2h0IHJlc3VsdCBpbiBvbmx5IHRoZSBmaXJzdCByZXF1ZXN0ZWQgdmFyaWFudCBiZWluZyBjYWNoZWQgYW5kCi1zdWJzZXF1ZW50IGNhY2hlIGhpdHMgbWlnaHQgcmV0dXJuIHRoZSB3cm9uZyByZXNwb25zZS4gVG8gcHJldmVudCB0aGlzLAotQXBhY2hlIG5vcm1hbGx5IG1hcmtzIGFsbCByZXNwb25zZXMgdGhhdCBhcmUgcmV0dXJuZWQgYWZ0ZXIgY29udGVudCBuZWdvdGlhdGlvbgotYXMgbm9uLWNhY2hlYWJsZSBieSBIVFRQLzEuMCBjbGllbnRzLiBBcGFjaGUgYWxzbyBzdXBwb3J0cyB0aGUgSFRUUC8xLjEKLXByb3RvY29sIGZlYXR1cmVzIHRvIGFsbG93IGNhY2hpbmcgb2YgbmVnb3RpYXRlZCByZXNwb25zZXMuIDxQPgotCi1Gb3IgcmVxdWVzdHMgd2hpY2ggY29tZSBmcm9tIGEgSFRUUC8xLjAgY29tcGxpYW50IGNsaWVudCAoZWl0aGVyIGEKLWJyb3dzZXIgb3IgYSBjYWNoZSksIHRoZSBkaXJlY3RpdmUgPFRUPkNhY2hlTmVnb3RpYXRlZERvY3M8L1RUPiBjYW4gYmUKLXVzZWQgdG8gYWxsb3cgY2FjaGluZyBvZiByZXNwb25zZXMgd2hpY2ggd2VyZSBzdWJqZWN0IHRvIG5lZ290aWF0aW9uLgotVGhpcyBkaXJlY3RpdmUgY2FuIGJlIGdpdmVuIGluIHRoZSBzZXJ2ZXIgY29uZmlnIG9yIHZpcnR1YWwgaG9zdCwgYW5kCi10YWtlcyBubyBhcmd1bWVudHMuIEl0IGhhcyBubyBlZmZlY3Qgb24gcmVxdWVzdHMgZnJvbSBIVFRQLzEuMSBjbGllbnRzLgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvY29udGVudC1uZWdvdGlhdGlvbi5odG1sLmVuIGIvZG9jcy9tYW51YWwvY29udGVudC1uZWdvdGlhdGlvbi5odG1sLmVuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmZhZWU1Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2NvbnRlbnQtbmVnb3RpYXRpb24uaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDU4OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSBDb250ZW50IE5lZ290aWF0aW9uPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+Q29udGVudCBOZWdvdGlhdGlvbjwvSDE+Ci0KLTxQPgotQXBhY2hlJ3Mgc3VwcG9ydCBmb3IgY29udGVudCBuZWdvdGlhdGlvbiBoYXMgYmVlbiB1cGRhdGVkIHRvIG1lZXQgdGhlCi1IVFRQLzEuMSBzcGVjaWZpY2F0aW9uLiBJdCBjYW4gY2hvb3NlIHRoZSBiZXN0IHJlcHJlc2VudGF0aW9uIG9mIGEKLXJlc291cmNlIGJhc2VkIG9uIHRoZSBicm93c2VyLXN1cHBsaWVkIHByZWZlcmVuY2VzIGZvciBtZWRpYSB0eXBlLAotbGFuZ3VhZ2VzLCBjaGFyYWN0ZXIgc2V0IGFuZCBlbmNvZGluZy4gIEl0IGlzIGFsc28gaW1wbGVtZW50cyBhCi1jb3VwbGUgb2YgZmVhdHVyZXMgdG8gZ2l2ZSBtb3JlIGludGVsbGlnZW50IGhhbmRsaW5nIG9mIHJlcXVlc3RzIGZyb20KLWJyb3dzZXJzIHdoaWNoIHNlbmQgaW5jb21wbGV0ZSBuZWdvdGlhdGlvbiBpbmZvcm1hdGlvbi4gIDxQPgotCi1Db250ZW50IG5lZ290aWF0aW9uIGlzIHByb3ZpZGVkIGJ5IHRoZQotPEEgSFJFRj0ibW9kL21vZF9uZWdvdGlhdGlvbi5odG1sIj5tb2RfbmVnb3RpYXRpb248L0E+IG1vZHVsZSwKLXdoaWNoIGlzIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuCi0KLTxIUj4KLQotPEgyPkFib3V0IENvbnRlbnQgTmVnb3RpYXRpb248L0gyPgotCi08UD4KLUEgcmVzb3VyY2UgbWF5IGJlIGF2YWlsYWJsZSBpbiBzZXZlcmFsIGRpZmZlcmVudCByZXByZXNlbnRhdGlvbnMuIEZvcgotZXhhbXBsZSwgaXQgbWlnaHQgYmUgYXZhaWxhYmxlIGluIGRpZmZlcmVudCBsYW5ndWFnZXMgb3IgZGlmZmVyZW50Ci1tZWRpYSB0eXBlcywgb3IgYSBjb21iaW5hdGlvbi4gIE9uZSB3YXkgb2Ygc2VsZWN0aW5nIHRoZSBtb3N0Ci1hcHByb3ByaWF0ZSBjaG9pY2UgaXMgdG8gZ2l2ZSB0aGUgdXNlciBhbiBpbmRleCBwYWdlLCBhbmQgbGV0IHRoZW0KLXNlbGVjdC4gSG93ZXZlciBpdCBpcyBvZnRlbiBwb3NzaWJsZSBmb3IgdGhlIHNlcnZlciB0byBjaG9vc2UKLWF1dG9tYXRpY2FsbHkuIFRoaXMgd29ya3MgYmVjYXVzZSBicm93c2VycyBjYW4gc2VuZCBhcyBwYXJ0IG9mIGVhY2gKLXJlcXVlc3QgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCByZXByZXNlbnRhdGlvbnMgdGhleSBwcmVmZXIuIEZvcgotZXhhbXBsZSwgYSBicm93c2VyIGNvdWxkIGluZGljYXRlIHRoYXQgaXQgd291bGQgbGlrZSB0byBzZWUKLWluZm9ybWF0aW9uIGluIEZyZW5jaCwgaWYgcG9zc2libGUsIGVsc2UgRW5nbGlzaCB3aWxsIGRvLiBCcm93c2VycwotaW5kaWNhdGUgdGhlaXIgcHJlZmVyZW5jZXMgYnkgaGVhZGVycyBpbiB0aGUgcmVxdWVzdC4gVG8gcmVxdWVzdCBvbmx5Ci1GcmVuY2ggcmVwcmVzZW50YXRpb25zLCB0aGUgYnJvd3NlciB3b3VsZCBzZW5kCi0KLTxQUkU+Ci0gIEFjY2VwdC1MYW5ndWFnZTogZnIKLTwvUFJFPgotCi08UD4KLU5vdGUgdGhhdCB0aGlzIHByZWZlcmVuY2Ugd2lsbCBvbmx5IGJlIGFwcGxpZWQgd2hlbiB0aGVyZSBpcyBhIGNob2ljZQotb2YgcmVwcmVzZW50YXRpb25zIGFuZCB0aGV5IHZhcnkgYnkgbGFuZ3VhZ2UuCi08UD4KLQotQXMgYW4gZXhhbXBsZSBvZiBhIG1vcmUgY29tcGxleCByZXF1ZXN0LCB0aGlzIGJyb3dzZXIgaGFzIGJlZW4KLWNvbmZpZ3VyZWQgdG8gYWNjZXB0IEZyZW5jaCBhbmQgRW5nbGlzaCwgYnV0IHByZWZlciBGcmVuY2gsIGFuZCB0bwotYWNjZXB0IHZhcmlvdXMgbWVkaWEgdHlwZXMsIHByZWZlcnJpbmcgSFRNTCBvdmVyIHBsYWluIHRleHQgb3Igb3RoZXIKLXRleHQgdHlwZXMsIGFuZCBwcmVmZXJyaW5nIEdJRiBvciBKUEVHIG92ZXIgb3RoZXIgbWVkaWEgdHlwZXMsIGJ1dCBhbHNvCi1hbGxvd2luZyBhbnkgb3RoZXIgbWVkaWEgdHlwZSBhcyBhIGxhc3QgcmVzb3J0OgotCi08UFJFPgotICBBY2NlcHQtTGFuZ3VhZ2U6IGZyOyBxPTEuMCwgZW47IHE9MC41Ci0gIEFjY2VwdDogdGV4dC9odG1sOyBxPTEuMCwgdGV4dC8qOyBxPTAuOCwgaW1hZ2UvZ2lmOyBxPTAuNiwKLSAgICAgICAgaW1hZ2UvanBlZzsgcT0wLjYsIGltYWdlLyo7IHE9MC41LCAqLyo7IHE9MC4xCi08L1BSRT4KLQotQXBhY2hlIDEuMiBzdXBwb3J0cyAnc2VydmVyIGRyaXZlbicgY29udGVudCBuZWdvdGlhdGlvbiwgYXMgZGVmaW5lZCBpbgotdGhlIEhUVFAvMS4xIHNwZWNpZmljYXRpb24uIEl0IGZ1bGx5IHN1cHBvcnRzIHRoZSBBY2NlcHQsCi1BY2NlcHQtTGFuZ3VhZ2UsIEFjY2VwdC1DaGFyc2V0IGFuZCBBY2NlcHQtRW5jb2RpbmcgcmVxdWVzdCBoZWFkZXJzLgotQXBhY2hlIDEuMy40IGFsc28gc3VwcG9ydHMgJ3RyYW5zcGFyZW50JyBjb250ZW50IG5lZ290aWF0aW9uLCB3aGljaCBpcwotYW4gZXhwZXJpbWVudGFsIG5lZ290aWF0aW9uIHByb3RvY29sIGRlZmluZWQgaW4gUkZDIDIyOTUgYW5kIFJGQyAyMjk2LgotSXQgZG9lcyBub3Qgb2ZmZXIgc3VwcG9ydCBmb3IgJ2ZlYXR1cmUgbmVnb3RpYXRpb24nIGFzIGRlZmluZWQgaW4KLXRoZXNlIFJGQ3MuICAKLTxQPgotCi1BIDxTVFJPTkc+cmVzb3VyY2U8L1NUUk9ORz4gaXMgYSBjb25jZXB0dWFsIGVudGl0eSBpZGVudGlmaWVkIGJ5IGEgVVJJCi0oUkZDIDIzOTYpLiAgQW4gSFRUUCBzZXJ2ZXIgbGlrZSBBcGFjaGUgcHJvdmlkZXMgYWNjZXNzIHRvCi08U1RST05HPnJlcHJlc2VudGF0aW9uczwvU1RST05HPiBvZiB0aGUgcmVzb3VyY2Uocykgd2l0aGluIGl0cyBuYW1lc3BhY2UsCi13aXRoIGVhY2ggcmVwcmVzZW50YXRpb24gaW4gdGhlIGZvcm0gb2YgYSBzZXF1ZW5jZSBvZiBieXRlcyB3aXRoIGEKLWRlZmluZWQgbWVkaWEgdHlwZSwgY2hhcmFjdGVyIHNldCwgZW5jb2RpbmcsIGV0Yy4gIEVhY2ggcmVzb3VyY2UgbWF5IGJlCi1hc3NvY2lhdGVkIHdpdGggemVybywgb25lLCBvciBtb3JlIHRoYW4gb25lIHJlcHJlc2VudGF0aW9uCi1hdCBhbnkgZ2l2ZW4gdGltZS4gIElmIG11bHRpcGxlIHJlcHJlc2VudGF0aW9ucyBhcmUgYXZhaWxhYmxlLAotdGhlIHJlc291cmNlIGlzIHJlZmVycmVkIHRvIGFzIDxTVFJPTkc+bmVnb3RpYWJsZTwvU1RST05HPiBhbmQgZWFjaCBvZiBpdHMKLXJlcHJlc2VudGF0aW9ucyBpcyB0ZXJtZWQgYSA8U1RST05HPnZhcmlhbnQ8L1NUUk9ORz4uIFRoZSB3YXlzIGluIHdoaWNoIHRoZQotdmFyaWFudHMgZm9yIGEgbmVnb3RpYWJsZSByZXNvdXJjZSB2YXJ5IGFyZSBjYWxsZWQgdGhlCi08U1RST05HPmRpbWVuc2lvbnM8L1NUUk9ORz4gb2YgbmVnb3RpYXRpb24uCi0KLTxIMj5OZWdvdGlhdGlvbiBpbiBBcGFjaGU8L0gyPgotCi08UD4KLUluIG9yZGVyIHRvIG5lZ290aWF0ZSBhIHJlc291cmNlLCB0aGUgc2VydmVyIG5lZWRzIHRvIGJlIGdpdmVuCi1pbmZvcm1hdGlvbiBhYm91dCBlYWNoIG9mIHRoZSB2YXJpYW50cy4gVGhpcyBpcyBkb25lIGluIG9uZSBvZiB0d28KLXdheXM6Ci0KLTxVTD4KLSAgPExJPiBVc2luZyBhIHR5cGUgbWFwICg8RU0+aS5lLjwvRU0+LCBhIDxDT0RFPioudmFyPC9DT0RFPiBmaWxlKSB3aGljaAotICAgICAgIG5hbWVzIHRoZSBmaWxlcyBjb250YWluaW5nIHRoZSB2YXJpYW50cyBleHBsaWNpdGx5LCBvcgotICA8TEk+IFVzaW5nIGEgJ011bHRpVmlld3MnIHNlYXJjaCwgd2hlcmUgdGhlIHNlcnZlciBkb2VzIGFuIGltcGxpY2l0Ci0gICAgICAgZmlsZW5hbWUgcGF0dGVybiBtYXRjaCBhbmQgY2hvb3NlcyBmcm9tIGFtb25nIHRoZSByZXN1bHRzLgotPC9VTD4KLQotPEgzPlVzaW5nIGEgdHlwZS1tYXAgZmlsZTwvSDM+Ci0KLTxQPgotQSB0eXBlIG1hcCBpcyBhIGRvY3VtZW50IHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGFuZGxlcgotbmFtZWQgPENPREU+dHlwZS1tYXA8L0NPREU+IChvciwgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHdpdGgKLW9sZGVyIEFwYWNoZSBjb25maWd1cmF0aW9ucywgdGhlIG1pbWUgdHlwZQotPENPREU+YXBwbGljYXRpb24veC10eXBlLW1hcDwvQ09ERT4pLiAgTm90ZSB0aGF0IHRvIHVzZSB0aGlzIGZlYXR1cmUsCi15b3UgbXVzdCBoYXZlIGEgaGFuZGxlciBzZXQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCBkZWZpbmVzIGEKLWZpbGUgc3VmZml4IGFzIDxDT0RFPnR5cGUtbWFwPC9DT0RFPjsgdGhpcyBpcyBiZXN0IGRvbmUgd2l0aCBhCi0KLTxQUkU+Ci0gIEFkZEhhbmRsZXIgdHlwZS1tYXAgdmFyCi08L1BSRT4KLQotaW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGUuICBTZWUgdGhlIGNvbW1lbnRzIGluIHRoZSBzYW1wbGUgY29uZmlnCi1maWxlIGZvciBtb3JlIGRldGFpbHMuIDxQPgotCi1UeXBlIG1hcCBmaWxlcyBoYXZlIGFuIGVudHJ5IGZvciBlYWNoIGF2YWlsYWJsZSB2YXJpYW50OyB0aGVzZSBlbnRyaWVzCi1jb25zaXN0IG9mIGNvbnRpZ3VvdXMgSFRUUC1mb3JtYXQgaGVhZGVyIGxpbmVzLiAgRW50cmllcyBmb3IKLWRpZmZlcmVudCB2YXJpYW50cyBhcmUgc2VwYXJhdGVkIGJ5IGJsYW5rIGxpbmVzLiAgQmxhbmsgbGluZXMgYXJlCi1pbGxlZ2FsIHdpdGhpbiBhbiBlbnRyeS4gIEl0IGlzIGNvbnZlbnRpb25hbCB0byBiZWdpbiBhIG1hcCBmaWxlIHdpdGgKLWFuIGVudHJ5IGZvciB0aGUgY29tYmluZWQgZW50aXR5IGFzIGEgd2hvbGUgKGFsdGhvdWdoIHRoaXMKLWlzIG5vdCByZXF1aXJlZCwgYW5kIGlmIHByZXNlbnQgd2lsbCBiZSBpZ25vcmVkKS4gQW4gZXhhbXBsZQotbWFwIGZpbGUgaXM6Ci0KLTxQUkU+Ci0gIFVSSTogZm9vCi0KLSAgVVJJOiBmb28uZW4uaHRtbAotICBDb250ZW50LXR5cGU6IHRleHQvaHRtbAotICBDb250ZW50LWxhbmd1YWdlOiBlbgotCi0gIFVSSTogZm9vLmZyLmRlLmh0bWwKLSAgQ29udGVudC10eXBlOiB0ZXh0L2h0bWw7Y2hhcnNldD1pc28tODg1OS0yCi0gIENvbnRlbnQtbGFuZ3VhZ2U6IGZyLCBkZQotPC9QUkU+Ci0KLUlmIHRoZSB2YXJpYW50cyBoYXZlIGRpZmZlcmVudCBzb3VyY2UgcXVhbGl0aWVzLCB0aGF0IG1heSBiZSBpbmRpY2F0ZWQKLWJ5IHRoZSAicXMiIHBhcmFtZXRlciB0byB0aGUgbWVkaWEgdHlwZSwgYXMgaW4gdGhpcyBwaWN0dXJlIChhdmFpbGFibGUKLWFzIGpwZWcsIGdpZiwgb3IgQVNDSUktYXJ0KToKLQotPFBSRT4KLSAgVVJJOiBmb28KLQotICBVUkk6IGZvby5qcGVnCi0gIENvbnRlbnQtdHlwZTogaW1hZ2UvanBlZzsgcXM9MC44Ci0KLSAgVVJJOiBmb28uZ2lmCi0gIENvbnRlbnQtdHlwZTogaW1hZ2UvZ2lmOyBxcz0wLjUKLQotICBVUkk6IGZvby50eHQKLSAgQ29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBxcz0wLjAxCi08L1BSRT4KLTxQPgotCi1xcyB2YWx1ZXMgY2FuIHZhcnkgaW4gdGhlIHJhbmdlIDAuMDAwIHRvIDEuMDAwLiBOb3RlIHRoYXQgYW55IHZhcmlhbnQgd2l0aAotYSBxcyB2YWx1ZSBvZiAwLjAwMCB3aWxsIG5ldmVyIGJlIGNob3Nlbi4gVmFyaWFudHMgd2l0aCBubyAncXMnCi1wYXJhbWV0ZXIgdmFsdWUgYXJlIGdpdmVuIGEgcXMgZmFjdG9yIG9mIDEuMC4gVGhlIHFzIHBhcmFtZXRlciBpbmRpY2F0ZXMKLXRoZSByZWxhdGl2ZSAncXVhbGl0eScgb2YgdGhpcyB2YXJpYW50IGNvbXBhcmVkIHRvIHRoZSBvdGhlciBhdmFpbGFibGUKLXZhcmlhbnRzLCBpbmRlcGVuZGVudCBvZiB0aGUgY2xpZW50J3MgY2FwYWJpbGl0aWVzLiAgRm9yIGV4YW1wbGUsIGEganBlZwotZmlsZSBpcyB1c3VhbGx5IG9mIGhpZ2hlciBzb3VyY2UgcXVhbGl0eSB0aGFuIGFuIGFzY2lpIGZpbGUgaWYgaXQgaXMKLWF0dGVtcHRpbmcgdG8gcmVwcmVzZW50IGEgcGhvdG9ncmFwaC4gIEhvd2V2ZXIsIGlmIHRoZSByZXNvdXJjZSBiZWluZwotcmVwcmVzZW50ZWQgaXMgYW4gb3JpZ2luYWwgYXNjaWkgYXJ0LCB0aGVuIGFuIGFzY2lpIHJlcHJlc2VudGF0aW9uIHdvdWxkCi1oYXZlIGEgaGlnaGVyIHNvdXJjZSBxdWFsaXR5IHRoYW4gYSBqcGVnIHJlcHJlc2VudGF0aW9uLiAgQSBxcyB2YWx1ZQotaXMgdGhlcmVmb3JlIHNwZWNpZmljIHRvIGEgZ2l2ZW4gdmFyaWFudCBkZXBlbmRpbmcgb24gdGhlIG5hdHVyZSBvZgotdGhlIHJlc291cmNlIGl0IHJlcHJlc2VudHMuCi0KLTxQPgotVGhlIGZ1bGwgbGlzdCBvZiBoZWFkZXJzIHJlY29nbml6ZWQgaXM6Ci0KLTxETD4KLSAgPERUPiA8Q09ERT5VUkk6PC9DT0RFPgotICA8REQ+IHVyaSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSB2YXJpYW50IChvZiB0aGUgZ2l2ZW4gbWVkaWEKLSAgICAgICB0eXBlLCBlbmNvZGVkIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQgZW5jb2RpbmcpLiAgVGhlc2UgYXJlCi0gICAgICAgaW50ZXJwcmV0ZWQgYXMgVVJMcyByZWxhdGl2ZSB0byB0aGUgbWFwIGZpbGU7IHRoZXkgbXVzdCBiZSBvbgotICAgICAgIHRoZSBzYW1lIHNlcnZlciAoISksIGFuZCB0aGV5IG11c3QgcmVmZXIgdG8gZmlsZXMgdG8gd2hpY2ggdGhlCi0gICAgICAgY2xpZW50IHdvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIGlmIHRoZXkgd2VyZSB0byBiZSByZXF1ZXN0ZWQKLSAgICAgICBkaXJlY3RseS4KLSAgPERUPiA8Q09ERT5Db250ZW50LVR5cGU6PC9DT0RFPgotICA8REQ+IG1lZGlhIHR5cGUgLS0tIGNoYXJzZXQsIGxldmVsIGFuZCAicXMiIHBhcmFtZXRlcnMgbWF5IGJlIGdpdmVuLiAgVGhlc2UKLSAgICAgICBhcmUgb2Z0ZW4gcmVmZXJyZWQgdG8gYXMgTUlNRSB0eXBlczsgdHlwaWNhbCBtZWRpYSB0eXBlcyBhcmUKLSAgICAgICA8Q09ERT5pbWFnZS9naWY8L0NPREU+LCA8Q09ERT50ZXh0L3BsYWluPC9DT0RFPiwgb3IKLSAgICAgICA8Q09ERT50ZXh0L2h0bWw7Jm5ic3A7bGV2ZWw9MzwvQ09ERT4uCi0gIDxEVD4gPENPREU+Q29udGVudC1MYW5ndWFnZTo8L0NPREU+Ci0gIDxERD4gVGhlIGxhbmd1YWdlcyBvZiB0aGUgdmFyaWFudCwgc3BlY2lmaWVkIGFzIGFuIEludGVybmV0IHN0YW5kYXJkCi0gICAgICAgbGFuZ3VhZ2UgdGFnIGZyb20gUkZDIDE3NjYgKDxFTT5lLmcuPC9FTT4sIDxDT0RFPmVuPC9DT0RFPiBmb3IgRW5nbGlzaCwKLSAgICAgICA8Q09ERT5rcjwvQ09ERT4gZm9yIEtvcmVhbiwgPEVNPmV0Yy48L0VNPikuCi0gIDxEVD4gPENPREU+Q29udGVudC1FbmNvZGluZzo8L0NPREU+Ci0gIDxERD4gSWYgdGhlIGZpbGUgaXMgY29tcHJlc3NlZCwgb3Igb3RoZXJ3aXNlIGVuY29kZWQsIHJhdGhlciB0aGFuCi0gICAgICAgY29udGFpbmluZyB0aGUgYWN0dWFsIHJhdyBkYXRhLCB0aGlzIHNheXMgaG93IHRoYXQgd2FzIGRvbmUuCi0gICAgICAgQXBhY2hlIG9ubHkgcmVjb2duaXplcyBlbmNvZGluZ3MgdGhhdCBhcmUgZGVmaW5lZCBieSBhbgotICAgICAgIDxBIEhSRUY9Im1vZC9tb2RfbWltZS5odG1sI2FkZGVuY29kaW5nIj5BZGRFbmNvZGluZzwvQT4gZGlyZWN0aXZlLgotICAgICAgIFRoaXMgbm9ybWFsbHkgaW5jbHVkZXMgdGhlIGVuY29kaW5ncyA8Q09ERT54LWNvbXByZXNzPC9DT0RFPgotICAgICAgIGZvciBjb21wcmVzcydkIGZpbGVzLCBhbmQgPENPREU+eC1nemlwPC9DT0RFPiBmb3IgZ3ppcCdkIGZpbGVzLgotICAgICAgIFRoZSA8Q09ERT54LTwvQ09ERT4gcHJlZml4IGlzIGlnbm9yZWQgZm9yIGVuY29kaW5nIGNvbXBhcmlzb25zLgotICA8RFQ+IDxDT0RFPkNvbnRlbnQtTGVuZ3RoOjwvQ09ERT4KLSAgPEREPiBUaGUgc2l6ZSBvZiB0aGUgZmlsZS4gIFNwZWNpZnlpbmcgY29udGVudAotICAgICAgIGxlbmd0aHMgaW4gdGhlIHR5cGUtbWFwIGFsbG93cyB0aGUgc2VydmVyIHRvIGNvbXBhcmUgZmlsZSBzaXplcwotICAgICAgIHdpdGhvdXQgY2hlY2tpbmcgdGhlIGFjdHVhbCBmaWxlcy4KLSAgPERUPiA8Q09ERT5EZXNjcmlwdGlvbjo8L0NPREU+Ci0gIDxERD4gQSBodW1hbi1yZWFkYWJsZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIHRoZSB2YXJpYW50LiAgSWYgQXBhY2hlIGNhbm5vdAotICAgICAgIGZpbmQgYW55IGFwcHJvcHJpYXRlIHZhcmlhbnQgdG8gcmV0dXJuLCBpdCB3aWxsIHJldHVybiBhbiBlcnJvciAKLSAgICAgICByZXNwb25zZSB3aGljaCBsaXN0cyBhbGwgYXZhaWxhYmxlIHZhcmlhbnRzIGluc3RlYWQuICBTdWNoIGEgdmFyaWFudAotICAgICAgIGxpc3Qgd2lsbCBpbmNsdWRlIHRoZSBodW1hbi1yZWFkYWJsZSB2YXJpYW50IGRlc2NyaXB0aW9ucy4KLTwvREw+Ci0KLTxIMz5NdWx0aXZpZXdzPC9IMz4KLQotPFA+Ci08Q09ERT5NdWx0aVZpZXdzPC9DT0RFPiBpcyBhIHBlci1kaXJlY3Rvcnkgb3B0aW9uLCBtZWFuaW5nIGl0IGNhbiBiZSBzZXQgd2l0aAotYW4gPENPREU+T3B0aW9uczwvQ09ERT4gZGlyZWN0aXZlIHdpdGhpbiBhIDxDT0RFPiZsdDtEaXJlY3RvcnkmZ3Q7PC9DT0RFPiwKLTxDT0RFPiZsdDtMb2NhdGlvbiZndDs8L0NPREU+IG9yIDxDT0RFPiZsdDtGaWxlcyZndDs8L0NPREU+Ci1zZWN0aW9uIGluIDxDT0RFPmFjY2Vzcy5jb25mPC9DT0RFPiwgb3IgKGlmIDxDT0RFPkFsbG93T3ZlcnJpZGU8L0NPREU+Ci1pcyBwcm9wZXJseSBzZXQpIGluIDxDT0RFPi5odGFjY2VzczwvQ09ERT4gZmlsZXMuICBOb3RlIHRoYXQKLTxDT0RFPk9wdGlvbnMgQWxsPC9DT0RFPiBkb2VzIG5vdCBzZXQgPENPREU+TXVsdGlWaWV3czwvQ09ERT47IHlvdQotaGF2ZSB0byBhc2sgZm9yIGl0IGJ5IG5hbWUuCi0KLTxQPgotVGhlIGVmZmVjdCBvZiA8Q09ERT5NdWx0aVZpZXdzPC9DT0RFPiBpcyBhcyBmb2xsb3dzOiBpZiB0aGUgc2VydmVyCi1yZWNlaXZlcyBhIHJlcXVlc3QgZm9yIDxDT0RFPi9zb21lL2Rpci9mb288L0NPREU+LCBpZgotPENPREU+L3NvbWUvZGlyPC9DT0RFPiBoYXMgPENPREU+TXVsdGlWaWV3czwvQ09ERT4gZW5hYmxlZCwgYW5kCi08Q09ERT4vc29tZS9kaXIvZm9vPC9DT0RFPiBkb2VzIDxFTT5ub3Q8L0VNPiBleGlzdCwgdGhlbiB0aGUgc2VydmVyIHJlYWRzIHRoZQotZGlyZWN0b3J5IGxvb2tpbmcgZm9yIGZpbGVzIG5hbWVkIGZvby4qLCBhbmQgZWZmZWN0aXZlbHkgZmFrZXMgdXAgYQotdHlwZSBtYXAgd2hpY2ggbmFtZXMgYWxsIHRob3NlIGZpbGVzLCBhc3NpZ25pbmcgdGhlbSB0aGUgc2FtZSBtZWRpYQotdHlwZXMgYW5kIGNvbnRlbnQtZW5jb2RpbmdzIGl0IHdvdWxkIGhhdmUgaWYgdGhlIGNsaWVudCBoYWQgYXNrZWQgZm9yCi1vbmUgb2YgdGhlbSBieSBuYW1lLiAgSXQgdGhlbiBjaG9vc2VzIHRoZSBiZXN0IG1hdGNoIHRvIHRoZSBjbGllbnQncwotcmVxdWlyZW1lbnRzLgotCi08UD4KLTxDT0RFPk11bHRpVmlld3M8L0NPREU+IG1heSBhbHNvIGFwcGx5IHRvIHNlYXJjaGVzIGZvciB0aGUgZmlsZSBuYW1lZCBieSB0aGUKLTxDT0RFPkRpcmVjdG9yeUluZGV4PC9DT0RFPiBkaXJlY3RpdmUsIGlmIHRoZSBzZXJ2ZXIgaXMgdHJ5aW5nIHRvCi1pbmRleCBhIGRpcmVjdG9yeS4gSWYgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgc3BlY2lmeQotCi08UFJFPgotICBEaXJlY3RvcnlJbmRleCBpbmRleAotPC9QUkU+Ci0KLXRoZW4gdGhlIHNlcnZlciB3aWxsIGFyYml0cmF0ZSBiZXR3ZWVuIDxDT0RFPmluZGV4Lmh0bWw8L0NPREU+Ci1hbmQgPENPREU+aW5kZXguaHRtbDM8L0NPREU+IGlmIGJvdGggYXJlIHByZXNlbnQuICBJZiBuZWl0aGVyIGFyZQotcHJlc2VudCwgYW5kIDxDT0RFPmluZGV4LmNnaTwvQ09ERT4gaXMgdGhlcmUsIHRoZSBzZXJ2ZXIgd2lsbCBydW4gaXQuCi0KLTxQPgotSWYgb25lIG9mIHRoZSBmaWxlcyBmb3VuZCB3aGVuIHJlYWRpbmcgdGhlIGRpcmVjdGl2ZSBpcyBhIENHSSBzY3JpcHQsCi1pdCdzIG5vdCBvYnZpb3VzIHdoYXQgc2hvdWxkIGhhcHBlbi4gIFRoZSBjb2RlIGdpdmVzIHRoYXQgY2FzZQotc3BlY2lhbCB0cmVhdG1lbnQgLS0tIGlmIHRoZSByZXF1ZXN0IHdhcyBhIFBPU1QsIG9yIGEgR0VUIHdpdGgKLVFVRVJZX0FSR1Mgb3IgUEFUSF9JTkZPLCB0aGUgc2NyaXB0IGlzIGdpdmVuIGFuIGV4dHJlbWVseSBoaWdoIHF1YWxpdHkKLXJhdGluZywgYW5kIGdlbmVyYWxseSBpbnZva2VkOyBvdGhlcndpc2UgaXQgaXMgZ2l2ZW4gYW4gZXh0cmVtZWx5IGxvdwotcXVhbGl0eSByYXRpbmcsIHdoaWNoIGdlbmVyYWxseSBjYXVzZXMgb25lIG9mIHRoZSBvdGhlciB2aWV3cyAoaWYgYW55KQotdG8gYmUgcmV0cmlldmVkLgotCi08SDI+VGhlIE5lZ290aWF0aW9uIE1ldGhvZHM8L0gyPgotCi1BZnRlciBBcGFjaGUgaGFzIG9idGFpbmVkIGEgbGlzdCBvZiB0aGUgdmFyaWFudHMgZm9yIGEgZ2l2ZW4gcmVzb3VyY2UsCi1laXRoZXIgZnJvbSBhIHR5cGUtbWFwIGZpbGUgb3IgZnJvbSB0aGUgZmlsZW5hbWVzIGluIHRoZSBkaXJlY3RvcnksIGl0Ci1pbnZva2VzIG9uZSBvZiB0d28gbWV0aG9kcyB0byBkZWNpZGUgb24gdGhlICdiZXN0JyB2YXJpYW50IHRvCi1yZXR1cm4sIGlmIGFueS4gIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8ga25vdyBhbnkgb2YgdGhlIGRldGFpbHMgb2YgaG93Ci1uZWdvdGlhdGlvbiBhY3R1YWxseSB0YWtlcyBwbGFjZSBpbiBvcmRlciB0byB1c2UgQXBhY2hlJ3MgY29udGVudAotbmVnb3RpYXRpb24gZmVhdHVyZXMuIEhvd2V2ZXIgdGhlIHJlc3Qgb2YgdGhpcyBkb2N1bWVudCBleHBsYWlucyB0aGUKLW1ldGhvZHMgdXNlZCBmb3IgdGhvc2UgaW50ZXJlc3RlZC4KLTxQPgotCi1UaGVyZSBhcmUgdHdvIG5lZ290aWF0aW9uIG1ldGhvZHM6Ci0KLTxPTD4gCi0KLTxMST48U1RST05HPlNlcnZlciBkcml2ZW4gbmVnb3RpYXRpb24gd2l0aCB0aGUgQXBhY2hlCi1hbGdvcml0aG08L1NUUk9ORz4gaXMgdXNlZCBpbiB0aGUgbm9ybWFsIGNhc2UuICBUaGUgQXBhY2hlIGFsZ29yaXRobSBpcwotZXhwbGFpbmVkIGluIG1vcmUgZGV0YWlsIGJlbG93LiAgV2hlbiB0aGlzIGFsZ29yaXRobSBpcyB1c2VkLCBBcGFjaGUKLWNhbiBzb21ldGltZXMgJ2ZpZGRsZScgdGhlIHF1YWxpdHkgZmFjdG9yIG9mIGEgcGFydGljdWxhciBkaW1lbnNpb24gdG8KLWFjaGlldmUgYSBiZXR0ZXIgcmVzdWx0LiBUaGUgd2F5cyBBcGFjaGUgY2FuIGZpZGRsZSBxdWFsaXR5IGZhY3RvcnMgaXMKLWV4cGxhaW5lZCBpbiBtb3JlIGRldGFpbCBiZWxvdy4KLQotPExJPjxTVFJPTkc+VHJhbnNwYXJlbnQgY29udGVudCBuZWdvdGlhdGlvbjwvU1RST05HPiBpcyB1c2VkIHdoZW4gdGhlCi1icm93c2VyIHNwZWNpZmljYWxseSByZXF1ZXN0cyB0aGlzIHRocm91Z2ggdGhlIG1lY2hhbmlzbSBkZWZpbmVkIGluIFJGQwotMjI5NS4gIFRoaXMgbmVnb3RpYXRpb24gbWV0aG9kIGdpdmVzIHRoZSBicm93c2VyIGZ1bGwgY29udHJvbCBvdmVyCi1kZWNpZGluZyBvbiB0aGUgJ2Jlc3QnIHZhcmlhbnQsIHRoZSByZXN1bHQgaXMgdGhlcmVmb3JlIGRlcGVuZGVudCBvbgotdGhlIHNwZWNpZmljIGFsZ29yaXRobXMgdXNlZCBieSB0aGUgYnJvd3Nlci4gIEFzIHBhcnQgb2YgdGhlCi10cmFuc3BhcmVudCBuZWdvdGlhdGlvbiBwcm9jZXNzLCB0aGUgYnJvd3NlciBjYW4gYXNrIEFwYWNoZSB0byBydW4gdGhlCi0ncmVtb3RlIHZhcmlhbnQgc2VsZWN0aW9uIGFsZ29yaXRobScgZGVmaW5lZCBpbiBSRkMgMjI5Ni4gIDwvVUw+Ci0KLQotPEgzPkRpbWVuc2lvbnMgb2YgTmVnb3RpYXRpb248L0gzPgotCi08VEFCTEU+Ci08VFIgdmFsaWduPSJ0b3AiPgotPFRIPkRpbWVuc2lvbgotPFRIPk5vdGVzCi08VFIgdmFsaWduPSJ0b3AiPgotPFREPk1lZGlhIFR5cGUKLTxURD5Ccm93c2VyIGluZGljYXRlcyBwcmVmZXJlbmNlcyB3aXRoIHRoZSBBY2NlcHQgaGVhZGVyIGZpZWxkLiBFYWNoIGl0ZW0KLWNhbiBoYXZlIGFuIGFzc29jaWF0ZWQgcXVhbGl0eSBmYWN0b3IuIFZhcmlhbnQgZGVzY3JpcHRpb24gY2FuIGFsc28KLWhhdmUgYSBxdWFsaXR5IGZhY3RvciAodGhlICJxcyIgcGFyYW1ldGVyKS4KLTxUUiB2YWxpZ249InRvcCI+Ci08VEQ+TGFuZ3VhZ2UKLTxURD5Ccm93c2VyIGluZGljYXRlcyBwcmVmZXJlbmNlcyB3aXRoIHRoZSBBY2NlcHQtTGFuZ3VhZ2UgaGVhZGVyIGZpZWxkLgotRWFjaCBpdGVtIGNhbiBoYXZlIGEgcXVhbGl0eSBmYWN0b3IuIFZhcmlhbnRzIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggbm9uZSwgb25lCi1vciBtb3JlIHRoYW4gb25lIGxhbmd1YWdlLgotPFRSIHZhbGlnbj0idG9wIj4KLTxURD5FbmNvZGluZwotPFREPkJyb3dzZXIgaW5kaWNhdGVzIHByZWZlcmVuY2Ugd2l0aCB0aGUgQWNjZXB0LUVuY29kaW5nIGhlYWRlciBmaWVsZC4KLUVhY2ggaXRlbSBjYW4gaGF2ZSBhIHF1YWxpdHkgZmFjdG9yLgotPFRSIHZhbGlnbj0idG9wIj4KLTxURD5DaGFyc2V0Ci08VEQ+QnJvd3NlciBpbmRpY2F0ZXMgcHJlZmVyZW5jZSB3aXRoIHRoZSBBY2NlcHQtQ2hhcnNldCBoZWFkZXIgZmllbGQuCi1FYWNoIGl0ZW0gY2FuIGhhdmUgYSBxdWFsaXR5IGZhY3Rvci4KLVZhcmlhbnRzIGNhbiBpbmRpY2F0ZSBhIGNoYXJzZXQgYXMgYSBwYXJhbWV0ZXIgb2YgdGhlIG1lZGlhIHR5cGUuCi08L1RBQkxFPgotCi08SDM+QXBhY2hlIE5lZ290aWF0aW9uIEFsZ29yaXRobTwvSDM+Ci0KLTxQPgotQXBhY2hlIGNhbiB1c2UgdGhlIGZvbGxvd2luZyBhbGdvcml0aG0gdG8gc2VsZWN0IHRoZSAnYmVzdCcgdmFyaWFudAotKGlmIGFueSkgdG8gcmV0dXJuIHRvIHRoZSBicm93c2VyLiAgVGhpcyBhbGdvcml0aG0gaXMgbm90Ci1mdXJ0aGVyIGNvbmZpZ3VyYWJsZS4gSXQgb3BlcmF0ZXMgYXMgZm9sbG93czoKLQotPE9MPgotPExJPkZpcnN0LCBmb3IgZWFjaCBkaW1lbnNpb24gb2YgdGhlIG5lZ290aWF0aW9uLCBjaGVjayB0aGUgYXBwcm9wcmlhdGUKLTxFTT5BY2NlcHQqPC9FTT4gaGVhZGVyIGZpZWxkIGFuZCBhc3NpZ24gYSBxdWFsaXR5IHRvIGVhY2gKLXZhcmlhbnQuIElmIHRoZSA8RU0+QWNjZXB0KjwvRU0+IGhlYWRlciBmb3IgYW55IGRpbWVuc2lvbiBpbXBsaWVzIHRoYXQgdGhpcwotdmFyaWFudCBpcyBub3QgYWNjZXB0YWJsZSwgZWxpbWluYXRlIGl0LiBJZiBubyB2YXJpYW50cyByZW1haW4sIGdvCi10byBzdGVwIDQuCi0KLTxMST5TZWxlY3QgdGhlICdiZXN0JyB2YXJpYW50IGJ5IGEgcHJvY2VzcyBvZiBlbGltaW5hdGlvbi4gRWFjaCBvZiB0aGUKLWZvbGxvd2luZyB0ZXN0cyBpcyBhcHBsaWVkIGluIG9yZGVyLiBBbnkgdmFyaWFudHMgbm90IHNlbGVjdGVkIGF0IGVhY2gKLXRlc3QgYXJlIGVsaW1pbmF0ZWQuIEFmdGVyIGVhY2ggdGVzdCwgaWYgb25seSBvbmUgdmFyaWFudCByZW1haW5zLAotc2VsZWN0IGl0IGFzIHRoZSBiZXN0IG1hdGNoIGFuZCBwcm9jZWVkIHRvIHN0ZXAgMy4gSWYgbW9yZSB0aGFuIG9uZQotdmFyaWFudCByZW1haW5zLCBtb3ZlIG9uIHRvIHRoZSBuZXh0IHRlc3QuCi0KLTxPTD4KLTxMST5NdWx0aXBseSB0aGUgcXVhbGl0eSBmYWN0b3IgZnJvbSB0aGUgQWNjZXB0IGhlYWRlciB3aXRoIHRoZQotICBxdWFsaXR5LW9mLXNvdXJjZSBmYWN0b3IgZm9yIHRoaXMgdmFyaWFudCdzIG1lZGlhIHR5cGUsIGFuZCBzZWxlY3QKLSAgdGhlIHZhcmlhbnRzIHdpdGggdGhlIGhpZ2hlc3QgdmFsdWUuCi0KLTxMST5TZWxlY3QgdGhlIHZhcmlhbnRzIHdpdGggdGhlIGhpZ2hlc3QgbGFuZ3VhZ2UgcXVhbGl0eSBmYWN0b3IuCi0KLTxMST5TZWxlY3QgdGhlIHZhcmlhbnRzIHdpdGggdGhlIGJlc3QgbGFuZ3VhZ2UgbWF0Y2gsIHVzaW5nIGVpdGhlciB0aGUKLSAgb3JkZXIgb2YgbGFuZ3VhZ2VzIGluIHRoZSBBY2NlcHQtTGFuZ3VhZ2UgaGVhZGVyIChpZiBwcmVzZW50KSwgb3IgZWxzZSAKLSAgZWxzZSB0aGUgb3JkZXIgb2YgbGFuZ3VhZ2VzIGluIHRoZSA8Q09ERT5MYW5ndWFnZVByaW9yaXR5PC9DT0RFPiAKLSAgZGlyZWN0aXZlIChpZiBwcmVzZW50KS4KLQotPExJPlNlbGVjdCB0aGUgdmFyaWFudHMgd2l0aCB0aGUgaGlnaGVzdCAnbGV2ZWwnIG1lZGlhIHBhcmFtZXRlcgotICAodXNlZCB0byBnaXZlIHRoZSB2ZXJzaW9uIG9mIHRleHQvaHRtbCBtZWRpYSB0eXBlcykuCi0KLTxMST5TZWxlY3QgdmFyaWFudHMgd2l0aCB0aGUgYmVzdCBjaGFyc2V0IG1lZGlhIHBhcmFtZXRlcnMsCi0gIGFzIGdpdmVuIG9uIHRoZSBBY2NlcHQtQ2hhcnNldCBoZWFkZXIgbGluZS4gQ2hhcnNldCBJU08tODg1OS0xCi0gIGlzIGFjY2VwdGFibGUgdW5sZXNzIGV4cGxpY2l0bHkgZXhjbHVkZWQuIFZhcmlhbnRzIHdpdGggYQotICA8Q09ERT50ZXh0Lyo8L0NPREU+IG1lZGlhIHR5cGUgYnV0IG5vdCBleHBsaWNpdGx5IGFzc29jaWF0ZWQKLSAgd2l0aCBhIHBhcnRpY3VsYXIgY2hhcnNldCBhcmUgYXNzdW1lZCB0byBiZSBpbiBJU08tODg1OS0xLgotCi08TEk+U2VsZWN0IHRob3NlIHZhcmlhbnRzIHdoaWNoIGhhdmUgYXNzb2NpYXRlZAotICAgIGNoYXJzZXQgbWVkaWEgcGFyYW1ldGVycyB0aGF0IGFyZSA8RU0+bm90PC9FTT4gSVNPLTg4NTktMS4KLSAgICBJZiB0aGVyZSBhcmUgbm8gc3VjaCB2YXJpYW50cywgc2VsZWN0IGFsbCB2YXJpYW50cyBpbnN0ZWFkLgotCi08TEk+U2VsZWN0IHRoZSB2YXJpYW50cyB3aXRoIHRoZSBiZXN0IGVuY29kaW5nLiBJZiB0aGVyZSBhcmUKLSAgdmFyaWFudHMgd2l0aCBhbiBlbmNvZGluZyB0aGF0IGlzIGFjY2VwdGFibGUgdG8gdGhlIHVzZXItYWdlbnQsCi0gIHNlbGVjdCBvbmx5IHRoZXNlIHZhcmlhbnRzLiBPdGhlcndpc2UgaWYgdGhlcmUgaXMgYSBtaXggb2YgZW5jb2RlZAotICBhbmQgbm9uLWVuY29kZWQgdmFyaWFudHMsIHNlbGVjdCBvbmx5IHRoZSB1bmVuY29kZWQgdmFyaWFudHMuCi0gIElmIGVpdGhlciBhbGwgdmFyaWFudHMgYXJlIGVuY29kZWQgb3IgYWxsIHZhcmlhbnRzIGFyZSBub3QgZW5jb2RlZCwgCi0gIHNlbGVjdCBhbGwgdmFyaWFudHMuCi0KLTxMST5TZWxlY3QgdGhlIHZhcmlhbnRzIHdpdGggdGhlIHNtYWxsZXN0IGNvbnRlbnQgbGVuZ3RoLgotCi08TEk+U2VsZWN0IHRoZSBmaXJzdCB2YXJpYW50IG9mIHRob3NlIHJlbWFpbmluZy4gVGhpcyB3aWxsIGJlIGVpdGhlciB0aGUKLSAgZmlyc3QgbGlzdGVkIGluIHRoZSB0eXBlLW1hcCBmaWxlLCBvciB3aGVuIHZhcmlhbnRzIGFyZSByZWFkIGZyb20KLSAgdGhlIGRpcmVjdG9yeSwgdGhlIG9uZSB3aG9zZSBmaWxlIG5hbWUgY29tZXMgZmlyc3Qgd2hlbiBzb3J0ZWQgdXNpbmcKLSAgQVNDSUkgY29kZSBvcmRlci4KLQotPC9PTD4KLQotPExJPlRoZSBhbGdvcml0aG0gaGFzIG5vdyBzZWxlY3RlZCBvbmUgJ2Jlc3QnIHZhcmlhbnQsIHNvIHJldHVybgotICBpdCBhcyB0aGUgcmVzcG9uc2UuIFRoZSBIVFRQIHJlc3BvbnNlIGhlYWRlciBWYXJ5IGlzIHNldCB0byBpbmRpY2F0ZSB0aGUKLSAgZGltZW5zaW9ucyBvZiBuZWdvdGlhdGlvbiAoYnJvd3NlcnMgYW5kIGNhY2hlcyBjYW4gdXNlIHRoaXMKLSAgaW5mb3JtYXRpb24gd2hlbiBjYWNoaW5nIHRoZSByZXNvdXJjZSkuIEVuZC4KLQotPExJPlRvIGdldCBoZXJlIG1lYW5zIG5vIHZhcmlhbnQgd2FzIHNlbGVjdGVkIChiZWNhdXNlIG5vbmUgYXJlIGFjY2VwdGFibGUKLSAgdG8gdGhlIGJyb3dzZXIpLiBSZXR1cm4gYSA0MDYgc3RhdHVzIChtZWFuaW5nICJObyBhY2NlcHRhYmxlIHJlcHJlc2VudGF0aW9uIikKLSAgd2l0aCBhIHJlc3BvbnNlIGJvZHkgY29uc2lzdGluZyBvZiBhbiBIVE1MIGRvY3VtZW50IGxpc3RpbmcgdGhlCi0gIGF2YWlsYWJsZSB2YXJpYW50cy4gQWxzbyBzZXQgdGhlIEhUVFAgVmFyeSBoZWFkZXIgdG8gaW5kaWNhdGUgdGhlCi0gIGRpbWVuc2lvbnMgb2YgdmFyaWFuY2UuCi0KLTwvT0w+Ci0KLTxIMj48QSBOQU1FPSJiZXR0ZXIiPkZpZGRsaW5nIHdpdGggUXVhbGl0eSBWYWx1ZXM8L0E+PC9IMj4KLQotPFA+IAotQXBhY2hlIHNvbWV0aW1lcyBjaGFuZ2VzIHRoZSBxdWFsaXR5IHZhbHVlcyBmcm9tIHdoYXQgd291bGQgYmUKLWV4cGVjdGVkIGJ5IGEgc3RyaWN0IGludGVycHJldGF0aW9uIG9mIHRoZSBBcGFjaGUgbmVnb3RpYXRpb24KLWFsZ29yaXRobSBhYm92ZS4gVGhpcyBpcyB0byBnZXQgYSBiZXR0ZXIgcmVzdWx0IGZyb20gdGhlIGFsZ29yaXRobSBmb3IKLWJyb3dzZXJzIHdoaWNoIGRvIG5vdCBzZW5kIGZ1bGwgb3IgYWNjdXJhdGUgaW5mb3JtYXRpb24uIFNvbWUgb2YgdGhlCi1tb3N0IHBvcHVsYXIgYnJvd3NlcnMgc2VuZCBBY2NlcHQgaGVhZGVyIGluZm9ybWF0aW9uIHdoaWNoIHdvdWxkCi1vdGhlcndpc2UgcmVzdWx0IGluIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHdyb25nIHZhcmlhbnQgaW4gbWFueQotY2FzZXMuIElmIGEgYnJvd3NlciBzZW5kcyBmdWxsIGFuZCBjb3JyZWN0IGluZm9ybWF0aW9uIHRoZXNlIGZpZGRsZXMKLXdpbGwgbm90IGJlIGFwcGxpZWQuCi08UD4KLQotPEgzPk1lZGlhIFR5cGVzIGFuZCBXaWxkY2FyZHM8L0gzPgotCi08UD4KLVRoZSBBY2NlcHQ6IHJlcXVlc3QgaGVhZGVyIGluZGljYXRlcyBwcmVmZXJlbmNlcyBmb3IgbWVkaWEgdHlwZXMuIEl0Ci1jYW4gYWxzbyBpbmNsdWRlICd3aWxkY2FyZCcgbWVkaWEgdHlwZXMsIHN1Y2ggYXMgImltYWdlLyoiIG9yICIqLyoiCi13aGVyZSB0aGUgKiBtYXRjaGVzIGFueSBzdHJpbmcuIFNvIGEgcmVxdWVzdCBpbmNsdWRpbmc6Ci08UFJFPgotICBBY2NlcHQ6IGltYWdlLyosICovKgotPC9QUkU+Ci0KLXdvdWxkIGluZGljYXRlIHRoYXQgYW55IHR5cGUgc3RhcnRpbmcgImltYWdlLyIgaXMgYWNjZXB0YWJsZSwKLWFzIGlzIGFueSBvdGhlciB0eXBlIChzbyB0aGUgZmlyc3QgImltYWdlLyoiIGlzIHJlZHVuZGFudCkuIFNvbWUKLWJyb3dzZXJzIHJvdXRpbmVseSBzZW5kIHdpbGRjYXJkcyBpbiBhZGRpdGlvbiB0byBleHBsaWNpdCB0eXBlcyB0aGV5Ci1jYW4gaGFuZGxlLiBGb3IgZXhhbXBsZToKLTxQUkU+Ci0gIEFjY2VwdDogdGV4dC9odG1sLCB0ZXh0L3BsYWluLCBpbWFnZS9naWYsIGltYWdlL2pwZWcsICovKgotPC9QUkU+Ci0KLVRoZSBpbnRlbnRpb24gb2YgdGhpcyBpcyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBleHBsaWNpdGx5Ci1saXN0ZWQgdHlwZXMgYXJlIHByZWZlcnJlZCwgYnV0IGlmIGEgZGlmZmVyZW50IHJlcHJlc2VudGF0aW9uIGlzCi1hdmFpbGFibGUsIHRoYXQgaXMgb2sgdG9vLiBIb3dldmVyIHVuZGVyIHRoZSBiYXNpYyBhbGdvcml0aG0sIGFzIGdpdmVuCi1hYm92ZSwgdGhlICovKiB3aWxkY2FyZCBoYXMgZXhhY3RseSBlcXVhbCBwcmVmZXJlbmNlIHRvIGFsbCB0aGUgb3RoZXIKLXR5cGVzLCBzbyB0aGV5IGFyZSBub3QgYmVpbmcgcHJlZmVycmVkLiBUaGUgYnJvd3NlciBzaG91bGQgcmVhbGx5IGhhdmUKLXNlbnQgYSByZXF1ZXN0IHdpdGggYSBsb3dlciBxdWFsaXR5IChwcmVmZXJlbmNlKSB2YWx1ZSBmb3IgKi4qLCBzdWNoCi1hczoKLTxQUkU+Ci0gIEFjY2VwdDogdGV4dC9odG1sLCB0ZXh0L3BsYWluLCBpbWFnZS9naWYsIGltYWdlL2pwZWcsICovKjsgcT0wLjAxCi08L1BSRT4KLQotVGhlIGV4cGxpY2l0IHR5cGVzIGhhdmUgbm8gcXVhbGl0eSBmYWN0b3IsIHNvIHRoZXkgZGVmYXVsdCB0byBhCi1wcmVmZXJlbmNlIG9mIDEuMCAodGhlIGhpZ2hlc3QpLiBUaGUgd2lsZGNhcmQgKi8qIGlzIGdpdmVuCi1hIGxvdyBwcmVmZXJlbmNlIG9mIDAuMDEsIHNvIG90aGVyIHR5cGVzIHdpbGwgb25seSBiZSByZXR1cm5lZCBpZgotbm8gdmFyaWFudCBtYXRjaGVzIGFuIGV4cGxpY2l0bHkgbGlzdGVkIHR5cGUuCi08UD4KLQotSWYgdGhlIEFjY2VwdDogaGVhZGVyIGNvbnRhaW5zIDxFTT5ubzwvRU0+IHEgZmFjdG9ycyBhdCBhbGwsIEFwYWNoZSBzZXRzCi10aGUgcSB2YWx1ZSBvZiAiKi8qIiwgaWYgcHJlc2VudCwgdG8gMC4wMSB0byBlbXVsYXRlIHRoZSBkZXNpcmVkCi1iZWhhdmlvci4gSXQgYWxzbyBzZXRzIHRoZSBxIHZhbHVlIG9mIHdpbGRjYXJkcyBvZiB0aGUgZm9ybWF0Ci0idHlwZS8qIiB0byAwLjAyIChzbyB0aGVzZSBhcmUgcHJlZmVycmVkIG92ZXIgbWF0Y2hlcyBhZ2FpbnN0Ci0iKi8qIi4gSWYgYW55IG1lZGlhIHR5cGUgb24gdGhlIEFjY2VwdDogaGVhZGVyIGNvbnRhaW5zIGEgcSBmYWN0b3IsCi10aGVzZSBzcGVjaWFsIHZhbHVlcyBhcmUgPEVNPm5vdDwvRU0+IGFwcGxpZWQsIHNvIHJlcXVlc3RzIGZyb20gYnJvd3NlcnMKLXdoaWNoIHNlbmQgdGhlIGNvcnJlY3QgaW5mb3JtYXRpb24gdG8gc3RhcnQgd2l0aCB3b3JrIGFzIGV4cGVjdGVkLgotCi08SDM+VmFyaWFudHMgd2l0aCBubyBMYW5ndWFnZTwvSDM+Ci0KLTxQPgotSWYgc29tZSBvZiB0aGUgdmFyaWFudHMgZm9yIGEgcGFydGljdWxhciByZXNvdXJjZSBoYXZlIGEgbGFuZ3VhZ2UKLWF0dHJpYnV0ZSwgYW5kIHNvbWUgZG8gbm90LCB0aG9zZSB2YXJpYW50cyB3aXRoIG5vIGxhbmd1YWdlCi1hcmUgZ2l2ZW4gYSB2ZXJ5IGxvdyBsYW5ndWFnZSBxdWFsaXR5IGZhY3RvciBvZiAwLjAwMS48UD4KLQotVGhlIHJlYXNvbiBmb3Igc2V0dGluZyB0aGlzIGxhbmd1YWdlIHF1YWxpdHkgZmFjdG9yIGZvcgotdmFyaWFudCB3aXRoIG5vIGxhbmd1YWdlIHRvIGEgdmVyeSBsb3cgdmFsdWUgaXMgdG8gYWxsb3cKLWZvciBhIGRlZmF1bHQgdmFyaWFudCB3aGljaCBjYW4gYmUgc3VwcGxpZWQgaWYgbm9uZSBvZiB0aGUKLW90aGVyIHZhcmlhbnRzIG1hdGNoIHRoZSBicm93c2VyJ3MgbGFuZ3VhZ2UgcHJlZmVyZW5jZXMuCi0KLUZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgc2l0dWF0aW9uIHdpdGggdGhyZWUgdmFyaWFudHM6Ci0KLTxVTD4KLTxMST5mb28uZW4uaHRtbCwgbGFuZ3VhZ2UgZW4KLTxMST5mb28uZnIuaHRtbCwgbGFuZ3VhZ2UgZW4KLTxMST5mb28uaHRtbCwgbm8gbGFuZ3VhZ2UKLTwvVUw+Ci0KLTxQPgotVGhlIG1lYW5pbmcgb2YgYSB2YXJpYW50IHdpdGggbm8gbGFuZ3VhZ2UgaXMgdGhhdCBpdCBpcwotYWx3YXlzIGFjY2VwdGFibGUgdG8gdGhlIGJyb3dzZXIuIElmIHRoZSByZXF1ZXN0IEFjY2VwdC1MYW5ndWFnZQotaGVhZGVyIGluY2x1ZGVzIGVpdGhlciBlbiBvciBmciAob3IgYm90aCkgb25lIG9mIGZvby5lbi5odG1sCi1vciBmb28uZnIuaHRtbCB3aWxsIGJlIHJldHVybmVkLiBJZiB0aGUgYnJvd3NlciBkb2VzIG5vdCBsaXN0Ci1laXRoZXIgZW4gb3IgZnIgYXMgYWNjZXB0YWJsZSwgZm9vLmh0bWwgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkLgotCi08SDI+RXh0ZW5zaW9ucyB0byBUcmFuc3BhcmVudCBDb250ZW50IE5lZ290aWF0aW9uPC9IMj4KLQotQXBhY2hlIGV4dGVuZHMgdGhlIHRyYW5zcGFyZW50IGNvbnRlbnQgbmVnb3RpYXRpb24gcHJvdG9jb2wgKFJGQyAyMjk1KQotYXMgZm9sbG93cy4gIEEgbmV3IDxDT0RFPiB7ZW5jb2RpbmcgLi59PC9DT0RFPiBlbGVtZW50IGlzIHVzZWQgaW4KLXZhcmlhbnQgbGlzdHMgdG8gbGFiZWwgdmFyaWFudHMgd2hpY2ggYXJlIGF2YWlsYWJsZSB3aXRoIGEgc3BlY2lmaWMKLWNvbnRlbnQtZW5jb2Rpbmcgb25seS4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZQotUlZTQS8xLjAgYWxnb3JpdGhtIChSRkMgMjI5NikgaXMgZXh0ZW5kZWQgdG8gcmVjb2duaXplIGVuY29kZWQKLXZhcmlhbnRzIGluIHRoZSBsaXN0LCBhbmQgdG8gdXNlIHRoZW0gYXMgY2FuZGlkYXRlIHZhcmlhbnRzIHdoZW5ldmVyCi10aGVpciBlbmNvZGluZ3MgYXJlIGFjY2VwdGFibGUgYWNjb3JkaW5nIHRvIHRoZSBBY2NlcHQtRW5jb2RpbmcKLXJlcXVlc3QgaGVhZGVyLiAgVGhlIFJWU0EvMS4wIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHJvdW5kIGNvbXB1dGVkCi1xdWFsaXR5IGZhY3RvcnMgdG8gNSBkZWNpbWFsIHBsYWNlcyBiZWZvcmUgY2hvb3NpbmcgdGhlIGJlc3QgdmFyaWFudC4KLQotPEgyPk5vdGUgb24gaHlwZXJsaW5rcyBhbmQgbmFtaW5nIGNvbnZlbnRpb25zPC9IMj4KLQotPFA+Ci1JZiB5b3UgYXJlIHVzaW5nIGxhbmd1YWdlIG5lZ290aWF0aW9uIHlvdSBjYW4gY2hvb3NlIGJldHdlZW4KLWRpZmZlcmVudCBuYW1pbmcgY29udmVudGlvbnMsIGJlY2F1c2UgZmlsZXMgY2FuIGhhdmUgbW9yZSB0aGFuIG9uZQotZXh0ZW5zaW9uLCBhbmQgdGhlIG9yZGVyIG9mIHRoZSBleHRlbnNpb25zIGlzIG5vcm1hbGx5IGlycmVsZXZhbnQKLShzZWUgPEEgSFJFRj0ibW9kL21vZF9taW1lLmh0bWwiPm1vZF9taW1lPC9BPiBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzKS4KLTxQPgotQSB0eXBpY2FsIGZpbGUgaGFzIGEgTUlNRS10eXBlIGV4dGVuc2lvbiAoPEVNPmUuZy48L0VNPiwgPFNBTVA+aHRtbDwvU0FNUD4pLAotbWF5YmUgYW4gZW5jb2RpbmcgZXh0ZW5zaW9uICg8RU0+ZS5nLjwvRU0+LCA8U0FNUD5nejwvU0FNUD4pLCBhbmQgb2YgY291cnNlIGEKLWxhbmd1YWdlIGV4dGVuc2lvbiAoPEVNPmUuZy48L0VNPiwgPFNBTVA+ZW48L1NBTVA+KSB3aGVuIHdlIGhhdmUgZGlmZmVyZW50Ci1sYW5ndWFnZSB2YXJpYW50cyBvZiB0aGlzIGZpbGUuCi0KLTxQPgotRXhhbXBsZXM6Ci08VUw+Ci08TEk+Zm9vLmVuLmh0bWwKLTxMST5mb28uaHRtbC5lbgotPExJPmZvby5lbi5odG1sLmd6Ci08L1VMPgotCi08UD4KLUhlcmUgc29tZSBtb3JlIGV4YW1wbGVzIG9mIGZpbGVuYW1lcyB0b2dldGhlciB3aXRoIHZhbGlkIGFuZCBpbnZhbGlkCi1oeXBlcmxpbmtzOgotPC9QPgotCi08VEFCTEUgQk9SREVSPTEgQ0VMTFBBRERJTkc9OCBDRUxMU1BBQ0lORz0wPgotPFRSPgotIDxUSD5GaWxlbmFtZTwvVEg+Ci0gPFRIPlZhbGlkIGh5cGVybGluazwvVEg+Ci0gPFRIPkludmFsaWQgaHlwZXJsaW5rPC9USD4KLTwvVFI+Ci08VFI+Ci0gPFREPjxFTT5mb28uaHRtbC5lbjwvRU0+PC9URD4KLSA8VEQ+Zm9vPEJSPgotICAgICBmb28uaHRtbDwvVEQ+Ci0gPFREPi08L1REPgotPC9UUj4KLTxUUj4KLSA8VEQ+PEVNPmZvby5lbi5odG1sPC9FTT48L1REPgotIDxURD5mb288L1REPgotIDxURD5mb28uaHRtbDwvVEQ+Ci08L1RSPgotPFRSPgotIDxURD48RU0+Zm9vLmh0bWwuZW4uZ3o8L0VNPjwvVEQ+Ci0gPFREPmZvbzxCUj4KLSAgICAgZm9vLmh0bWw8L1REPgotIDxURD5mb28uZ3o8QlI+Ci0gICAgIGZvby5odG1sLmd6PC9URD4KLTwvVFI+Ci08VFI+Ci0gPFREPjxFTT5mb28uZW4uaHRtbC5nejwvRU0+PC9URD4KLSA8VEQ+Zm9vPC9URD4KLSA8VEQ+Zm9vLmh0bWw8QlI+Ci0gICAgIGZvby5odG1sLmd6PEJSPgotICAgICBmb28uZ3o8L1REPgotPC9UUj4KLTxUUj4KLSA8VEQ+PEVNPmZvby5nei5odG1sLmVuPC9FTT48L1REPgotIDxURD5mb288QlI+Ci0gICAgIGZvby5nejxCUj4KLSAgICAgZm9vLmd6Lmh0bWw8L1REPgotIDxURD5mb28uaHRtbDwvVEQ+Ci08L1RSPgotPFRSPgotIDxURD48RU0+Zm9vLmh0bWwuZ3ouZW48L0VNPjwvVEQ+Ci0gPFREPmZvbzxCUj4KLSAgICAgZm9vLmh0bWw8QlI+Ci0gICAgIGZvby5odG1sLmd6PC9URD4KLSA8VEQ+Zm9vLmd6PC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08UD4KLUxvb2tpbmcgYXQgdGhlIHRhYmxlIGFib3ZlIHlvdSB3aWxsIG5vdGljZSB0aGF0IGl0IGlzIGFsd2F5cyBwb3NzaWJsZSB0bwotdXNlIHRoZSBuYW1lIHdpdGhvdXQgYW55IGV4dGVuc2lvbnMgIGluIGFuIGh5cGVybGluayAoPEVNPmUuZy48L0VNPiwgPFNBTVA+Zm9vPC9TQU1QPikuCi1UaGUgYWR2YW50YWdlIGlzIHRoYXQgeW91IGNhbiBoaWRlIHRoZSBhY3R1YWwgdHlwZSBvZiBhCi1kb2N1bWVudCByc3AuIGZpbGUgYW5kIGNhbiBjaGFuZ2UgaXQgbGF0ZXIsIDxFTT5lLmcuPC9FTT4sIGZyb20gPFNBTVA+aHRtbDwvU0FNUD4KLXRvIDxTQU1QPnNodG1sPC9TQU1QPiBvciA8U0FNUD5jZ2k8L1NBTVA+IHdpdGhvdXQgY2hhbmdpbmcgYW55Ci1oeXBlcmxpbmsgcmVmZXJlbmNlcy4KLQotPFA+Ci1JZiB5b3Ugd2FudCB0byBjb250aW51ZSB0byB1c2UgYSBNSU1FLXR5cGUgaW4geW91ciBoeXBlcmxpbmtzICg8RU0+ZS5nLjwvRU0+Ci08U0FNUD5mb28uaHRtbDwvU0FNUD4pIHRoZSBsYW5ndWFnZSBleHRlbnNpb24gKGluY2x1ZGluZyBhbiBlbmNvZGluZyBleHRlbnNpb24KLWlmIHRoZXJlIGlzIG9uZSkgbXVzdCBiZSBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSBNSU1FLXR5cGUgZXh0ZW5zaW9uCi0oPEVNPmUuZy48L0VNPiwgPFNBTVA+Zm9vLmh0bWwuZW48L1NBTVA+KS4KLQotCi08SDI+Tm90ZSBvbiBDYWNoaW5nPC9IMj4KLQotPFA+Ci1XaGVuIGEgY2FjaGUgc3RvcmVzIGEgcmVwcmVzZW50YXRpb24sIGl0IGFzc29jaWF0ZXMgaXQgd2l0aCB0aGUgcmVxdWVzdCBVUkwuCi1UaGUgbmV4dCB0aW1lIHRoYXQgVVJMIGlzIHJlcXVlc3RlZCwgdGhlIGNhY2hlIGNhbiB1c2UgdGhlIHN0b3JlZAotcmVwcmVzZW50YXRpb24uIEJ1dCwgaWYgdGhlIHJlc291cmNlIGlzIG5lZ290aWFibGUgYXQgdGhlIHNlcnZlciwKLXRoaXMgbWlnaHQgcmVzdWx0IGluIG9ubHkgdGhlIGZpcnN0IHJlcXVlc3RlZCB2YXJpYW50IGJlaW5nIGNhY2hlZCBhbmQKLXN1YnNlcXVlbnQgY2FjaGUgaGl0cyBtaWdodCByZXR1cm4gdGhlIHdyb25nIHJlc3BvbnNlLiBUbyBwcmV2ZW50IHRoaXMsCi1BcGFjaGUgbm9ybWFsbHkgbWFya3MgYWxsIHJlc3BvbnNlcyB0aGF0IGFyZSByZXR1cm5lZCBhZnRlciBjb250ZW50IG5lZ290aWF0aW9uCi1hcyBub24tY2FjaGVhYmxlIGJ5IEhUVFAvMS4wIGNsaWVudHMuIEFwYWNoZSBhbHNvIHN1cHBvcnRzIHRoZSBIVFRQLzEuMQotcHJvdG9jb2wgZmVhdHVyZXMgdG8gYWxsb3cgY2FjaGluZyBvZiBuZWdvdGlhdGVkIHJlc3BvbnNlcy4gPFA+Ci0KLUZvciByZXF1ZXN0cyB3aGljaCBjb21lIGZyb20gYSBIVFRQLzEuMCBjb21wbGlhbnQgY2xpZW50IChlaXRoZXIgYQotYnJvd3NlciBvciBhIGNhY2hlKSwgdGhlIGRpcmVjdGl2ZSA8VFQ+Q2FjaGVOZWdvdGlhdGVkRG9jczwvVFQ+IGNhbiBiZQotdXNlZCB0byBhbGxvdyBjYWNoaW5nIG9mIHJlc3BvbnNlcyB3aGljaCB3ZXJlIHN1YmplY3QgdG8gbmVnb3RpYXRpb24uCi1UaGlzIGRpcmVjdGl2ZSBjYW4gYmUgZ2l2ZW4gaW4gdGhlIHNlcnZlciBjb25maWcgb3IgdmlydHVhbCBob3N0LCBhbmQKLXRha2VzIG5vIGFyZ3VtZW50cy4gSXQgaGFzIG5vIGVmZmVjdCBvbiByZXF1ZXN0cyBmcm9tIEhUVFAvMS4xIGNsaWVudHMuCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9jdXN0b20tZXJyb3IuaHRtbCBiL2RvY3MvbWFudWFsL2N1c3RvbS1lcnJvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTYwNGVhLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2N1c3RvbS1lcnJvci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+Q3VzdG9tIGVycm9yIHJlc3BvbnNlczwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPkN1c3RvbSBlcnJvciByZXNwb25zZXM8L0gxPgotCi08REw+Ci0KLTxEVD5QdXJwb3NlCi0KLSAgPEREPkFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eS4gQWxsb3dzIHdlYm1hc3RlcnMgdG8gY29uZmlndXJlIHRoZSByZXNwb25zZSBvZgotICAgICAgQXBhY2hlIHRvIHNvbWUgZXJyb3Igb3IgcHJvYmxlbS4KLQotICAgICAgPFA+Q3VzdG9taXphYmxlIHJlc3BvbnNlcyBjYW4gYmUgZGVmaW5lZCB0byBiZSBhY3RpdmF0ZWQgaW4gdGhlCi0gICAgICBldmVudCBvZiBhIHNlcnZlciBkZXRlY3RlZCBlcnJvciBvciBwcm9ibGVtLgotCi0gICAgICA8UD5lLmcuIGlmIGEgc2NyaXB0IGNyYXNoZXMgYW5kIHByb2R1Y2VzIGEgIjUwMCBTZXJ2ZXIgRXJyb3IiCi0gICAgICByZXNwb25zZSwgdGhlbiB0aGlzIHJlc3BvbnNlIGNhbiBiZSByZXBsYWNlZCB3aXRoIGVpdGhlciBzb21lCi0gICAgICBmcmllbmRsaWVyIHRleHQgb3IgYnkgYSByZWRpcmVjdGlvbiB0byBhbm90aGVyIFVSTCAobG9jYWwgb3IKLSAgICAgIGV4dGVybmFsKS4KLSAgICAgIDxQPgotCi08RFQ+T2xkIGJlaGF2aW9yCi0KLSAgPEREPk5DU0EgaHR0cGQgMS4zIHdvdWxkIHJldHVybiBzb21lIGJvcmluZyBvbGQgZXJyb3IvcHJvYmxlbSBtZXNzYWdlCi0gICAgICB3aGljaCB3b3VsZCBvZnRlbiBiZSBtZWFuaW5nbGVzcyB0byB0aGUgdXNlciwgYW5kIHdvdWxkIHByb3ZpZGUgbm8KLSAgICAgIG1lYW5zIG9mIGxvZ2dpbmcgdGhlIHN5bXB0b21zIHdoaWNoIGNhdXNlZCBpdC48QlI+Ci0KLSAgICAgIDxQPgotCi08RFQ+TmV3IGJlaGF2aW9yCi0KLSAgPEREPlRoZSBzZXJ2ZXIgY2FuIGJlIGFza2VkIHRvOwotICA8T0w+Ci0gICAgPExJPkRpc3BsYXkgc29tZSBvdGhlciB0ZXh0LCBpbnN0ZWFkIG9mIHRoZSBOQ1NBIGhhcmQgY29kZWQgbWVzc2FnZXMsIG9yCi0gICAgPExJPnJlZGlyZWN0IHRvIGEgbG9jYWwgVVJMLCBvcgotICAgIDxMST5yZWRpcmVjdCB0byBhbiBleHRlcm5hbCBVUkwuCi0gIDwvT0w+Ci0KLSAgPFA+UmVkaXJlY3RpbmcgdG8gYW5vdGhlciBVUkwgY2FuIGJlIHVzZWZ1bCwgYnV0IG9ubHkgaWYgc29tZSBpbmZvcm1hdGlvbgotICAgICBjYW4gYmUgcGFzc2VkIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgdG8gZXhwbGFpbiBhbmQvb3IgbG9nIHRoZQotICAgICBlcnJvci9wcm9ibGVtCi0gICAgIG1vcmUgY2xlYXJseS4KLQotICA8UD5UbyBhY2hpZXZlIHRoaXMsIEFwYWNoZSB3aWxsIGRlZmluZSBuZXcgQ0dJLWxpa2UgZW52aXJvbm1lbnQKLSAgICAgdmFyaWFibGVzLCA8RU0+ZS5nLjwvRU0+Ci0KLSAgPEJMT0NLUVVPVEU+PENPREU+Ci1SRURJUkVDVF9IVFRQX0FDQ0VQVD0qLyosIGltYWdlL2dpZiwgaW1hZ2UveC14Yml0bWFwLCBpbWFnZS9qcGVnIDxCUj4KLVJFRElSRUNUX0hUVFBfVVNFUl9BR0VOVD1Nb3ppbGxhLzEuMWIyIChYMTE7IEk7IEhQLVVYIEEuMDkuMDUgOTAwMC83MTIpIDxCUj4KLVJFRElSRUNUX1BBVEg9LjovYmluOi91c3IvbG9jYWwvYmluOi9ldGMgPEJSPgotUkVESVJFQ1RfUVVFUllfU1RSSU5HPSA8QlI+Ci1SRURJUkVDVF9SRU1PVEVfQUREUj0xMjEuMzQ1Ljc4LjEyMyA8QlI+Ci1SRURJUkVDVF9SRU1PVEVfSE9TVD1vb2guYWhoaC5jb20gPEJSPgotUkVESVJFQ1RfU0VSVkVSX05BTUU9Y3Jhc2guYmFuZy5lZHUgPEJSPgotUkVESVJFQ1RfU0VSVkVSX1BPUlQ9ODAgPEJSPgotUkVESVJFQ1RfU0VSVkVSX1NPRlRXQVJFPUFwYWNoZS8wLjguMTUgPEJSPgotUkVESVJFQ1RfVVJMPS9jZ2ktYmluL2J1Z2d5LnBsIDxCUj4KLSAgPC9DT0RFPjwvQkxPQ0tRVU9URT4KLQotICA8UD5ub3RlIHRoZSA8Q09ERT5SRURJUkVDVF88L0NPREU+IHByZWZpeC4KLQotICA8UD5BdCBsZWFzdCA8Q09ERT5SRURJUkVDVF9VUkw8L0NPREU+IGFuZCA8Q09ERT5SRURJUkVDVF9RVUVSWV9TVFJJTkc8L0NPREU+Ci0gICAgIHdpbGwKLSAgICAgYmUgcGFzc2VkIHRvIHRoZSBuZXcgVVJMIChhc3N1bWluZyBpdCdzIGEgY2dpLXNjcmlwdCBvciBhIGNnaS1pbmNsdWRlKS4KLSAgICAgVGhlCi0gICAgIG90aGVyIHZhcmlhYmxlcyB3aWxsIGV4aXN0IG9ubHkgaWYgdGhleSBleGlzdGVkIHByaW9yIHRvIHRoZQotICAgICBlcnJvci9wcm9ibGVtLgotICAgICA8U1RST05HPk5vbmU8L1NUUk9ORz4gb2YgdGhlc2Ugd2lsbCBiZSBzZXQgaWYgeW91ciBFcnJvckRvY3VtZW50IGlzIGFuCi0gICAgIDxFTT5leHRlcm5hbDwvRU0+IHJlZGlyZWN0ICg8RU0+aS5lLjwvRU0+LCBhbnl0aGluZyBzdGFydGluZyB3aXRoIGEKLSAgICAgc2NoZW1lIG5hbWUKLSAgICAgbGlrZSA8Q09ERT5odHRwOjwvQ09ERT4sIGV2ZW4gaWYgaXQgcmVmZXJzIHRvIHRoZSBzYW1lIGhvc3QgYXMgdGhlCi0gICAgIHNlcnZlcikuPFA+Ci0KLTxEVD5Db25maWd1cmF0aW9uCi0KLSAgPEREPiBVc2Ugb2YgIkVycm9yRG9jdW1lbnQiIGlzIGVuYWJsZWQgZm9yIC5odGFjY2VzcyBmaWxlcyB3aGVuIHRoZQotICAgICAgIDxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjYWxsb3dvdmVycmlkZSI+IkZpbGVJbmZvIiBvdmVycmlkZTwvQT4gaXMKLSAgICAgICBhbGxvd2VkLgotCi0gIDxQPkhlcmUgYXJlIHNvbWUgZXhhbXBsZXMuLi4KLQotICA8QkxPQ0tRVU9URT48Q09ERT4KLUVycm9yRG9jdW1lbnQgNTAwIC9jZ2ktYmluL2NyYXNoLXJlY292ZXIgPEJSPgotRXJyb3JEb2N1bWVudCA1MDAgIlNvcnJ5LCBvdXIgc2NyaXB0IGNyYXNoZWQuIE9oIGRlYXI8QlI+Ci1FcnJvckRvY3VtZW50IDUwMCBodHRwOi8veHh4LyA8QlI+Ci1FcnJvckRvY3VtZW50IDQwNCAvTGFtZV9leGN1c2VzL25vdF9mb3VuZC5odG1sICA8QlI+Ci1FcnJvckRvY3VtZW50IDQwMSAvU3Vic2NyaXB0aW9uL2hvd190b19zdWJzY3JpYmUuaHRtbAotICA8L0NPREU+PC9CTE9DS1FVT1RFPgotCi0gIDxQPlRoZSBzeW50YXggaXMsCi0KLSAgPFA+PENPREU+PEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNlcnJvcmRvY3VtZW50Ij5FcnJvckRvY3VtZW50PC9BPjwvQ09ERT4KLSZsdDszLWRpZ2l0LWNvZGUmZ3Q7IGFjdGlvbgotCi0gIDxQPndoZXJlIHRoZSBhY3Rpb24gY2FuIGJlLAotCi0gIDxPTD4KLSAgICA8TEk+VGV4dCB0byBiZSBkaXNwbGF5ZWQuICBQcmVmaXggdGhlIHRleHQgd2l0aCBhIHF1b3RlICgmcXVvdDspLiBXaGF0ZXZlcgotICAgICAgICBmb2xsb3dzIHRoZSBxdW90ZSBpcyBkaXNwbGF5ZWQuIDxFTT5Ob3RlOiB0aGUgKCZxdW90OykgcHJlZml4IGlzbid0Ci0gICAgICAgIGRpc3BsYXllZC48L0VNPgotCi0gICAgPExJPkFuIGV4dGVybmFsIFVSTCB0byByZWRpcmVjdCB0by4KLQotICAgIDxMST5BIGxvY2FsIFVSTCB0byByZWRpcmVjdCB0by4KLQotICA8L09MPgotPC9ETD4KLQotPFA+PEhSPjxQPgotCi08SDI+Q3VzdG9tIGVycm9yIHJlc3BvbnNlcyBhbmQgcmVkaXJlY3RzPC9IMj4KLQotPERMPgotCi08RFQ+UHVycG9zZQotCi0gIDxERD5BcGFjaGUncyBiZWhhdmlvciB0byByZWRpcmVjdGVkIFVSTHMgaGFzIGJlZW4gbW9kaWZpZWQgc28gdGhhdCBhZGRpdGlvbmFsCi0gICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGF2YWlsYWJsZSB0byBhIHNjcmlwdC9zZXJ2ZXItaW5jbHVkZS48UD4KLQotPERUPk9sZCBiZWhhdmlvcgotCi0gIDxERD5TdGFuZGFyZCBDR0kgdmFycyB3ZXJlIG1hZGUgYXZhaWxhYmxlIHRvIGEgc2NyaXB0IHdoaWNoIGhhcyBiZWVuCi0gICAgICByZWRpcmVjdGVkIHRvLiBObyBpbmRpY2F0aW9uIG9mIHdoZXJlIHRoZSByZWRpcmVjdGlvbiBjYW1lIGZyb20gd2FzCi0gICAgICBwcm92aWRlZC4KLQotICA8UD4KLQotPERUPk5ldyBiZWhhdmlvcgotICA8REQ+Ci0KLUEgbmV3IGJhdGNoIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aWxsIGJlIGluaXRpYWxpemVkIGZvciB1c2UgYnkgYQotc2NyaXB0IHdoaWNoIGhhcyBiZWVuIHJlZGlyZWN0ZWQgdG8uICBFYWNoIG5ldyB2YXJpYWJsZSB3aWxsIGhhdmUgdGhlCi1wcmVmaXggPENPREU+UkVESVJFQ1RfPC9DT0RFPi4gIDxDT0RFPlJFRElSRUNUXzwvQ09ERT4gZW52aXJvbm1lbnQKLXZhcmlhYmxlcyBhcmUgY3JlYXRlZCBmcm9tIHRoZSBDR0kgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdoaWNoIGV4aXN0ZWQKLXByaW9yIHRvIHRoZSByZWRpcmVjdCwgdGhleSBhcmUgcmVuYW1lZCB3aXRoIGEgPENPREU+UkVESVJFQ1RfPC9DT0RFPgotcHJlZml4LCA8RU0+aS5lLjwvRU0+LCA8Q09ERT5IVFRQX1VTRVJfQUdFTlQ8L0NPREU+IGJlY29tZXMKLTxDT0RFPlJFRElSRUNUX0hUVFBfVVNFUl9BR0VOVDwvQ09ERT4uICBJbiBhZGRpdGlvbiB0byB0aGVzZSBuZXcKLXZhcmlhYmxlcywgQXBhY2hlIHdpbGwgZGVmaW5lIDxDT0RFPlJFRElSRUNUX1VSTDwvQ09ERT4gYW5kCi08Q09ERT5SRURJUkVDVF9TVEFUVVM8L0NPREU+IHRvIGhlbHAgdGhlIHNjcmlwdCB0cmFjZSBpdHMgb3JpZ2luLgotQm90aCB0aGUgb3JpZ2luYWwgVVJMIGFuZCB0aGUgVVJMIGJlaW5nIHJlZGlyZWN0ZWQgdG8gY2FuIGJlIGxvZ2dlZCBpbgotdGhlIGFjY2VzcyBsb2cuCi0KLTwvREw+Ci08UD4KLUlmIHRoZSBFcnJvckRvY3VtZW50IHNwZWNpZmllcyBhIGxvY2FsIHJlZGlyZWN0IHRvIGEgQ0dJIHNjcmlwdCwgdGhlIHNjcmlwdAotc2hvdWxkIGluY2x1ZGUgYSAiPFNBTVA+U3RhdHVzOjwvU0FNUD4iIGhlYWRlciBmaWVsZCBpbiBpdHMgb3V0cHV0Ci1pbiBvcmRlciB0byBlbnN1cmUgdGhlIHByb3BhZ2F0aW9uIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIGNsaWVudAotb2YgdGhlIGVycm9yIGNvbmRpdGlvbiB0aGF0IGNhdXNlZCBpdCB0byBiZSBpbnZva2VkLiAgRm9yIGluc3RhbmNlLCBhIFBlcmwKLUVycm9yRG9jdW1lbnQgc2NyaXB0IG1pZ2h0IGluY2x1ZGUgdGhlIGZvbGxvd2luZzoKLTwvUD4KLTxQUkU+Ci0gICAgICA6Ci0gICAgcHJpbnQgICJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxuIjsKLSAgICBwcmludGYgIlN0YXR1czogJXMgQ29uZGl0aW9uIEludGVyY2VwdGVkXG4iLCAkRU5WeyJSRURJUkVDVF9TVEFUVVMifTsKLSAgICAgIDoKLTwvUFJFPgotPFA+Ci1JZiB0aGUgc2NyaXB0IGlzIGRlZGljYXRlZCB0byBoYW5kbGluZyBhIHBhcnRpY3VsYXIgZXJyb3IgY29uZGl0aW9uLCBzdWNoIGFzCi08U0FNUD40MDQmbmJzcDtOb3QmbmJzcDtGb3VuZDwvU0FNUD4sIGl0IGNhbiB1c2UgdGhlIHNwZWNpZmljIGNvZGUgYW5kCi1lcnJvciB0ZXh0IGluc3RlYWQuCi08L1A+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9jdXN0b20tZXJyb3IuaHRtbC5lbiBiL2RvY3MvbWFudWFsL2N1c3RvbS1lcnJvci5odG1sLmVuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTYwNGVhLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2N1c3RvbS1lcnJvci5odG1sLmVuCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+Q3VzdG9tIGVycm9yIHJlc3BvbnNlczwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPkN1c3RvbSBlcnJvciByZXNwb25zZXM8L0gxPgotCi08REw+Ci0KLTxEVD5QdXJwb3NlCi0KLSAgPEREPkFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eS4gQWxsb3dzIHdlYm1hc3RlcnMgdG8gY29uZmlndXJlIHRoZSByZXNwb25zZSBvZgotICAgICAgQXBhY2hlIHRvIHNvbWUgZXJyb3Igb3IgcHJvYmxlbS4KLQotICAgICAgPFA+Q3VzdG9taXphYmxlIHJlc3BvbnNlcyBjYW4gYmUgZGVmaW5lZCB0byBiZSBhY3RpdmF0ZWQgaW4gdGhlCi0gICAgICBldmVudCBvZiBhIHNlcnZlciBkZXRlY3RlZCBlcnJvciBvciBwcm9ibGVtLgotCi0gICAgICA8UD5lLmcuIGlmIGEgc2NyaXB0IGNyYXNoZXMgYW5kIHByb2R1Y2VzIGEgIjUwMCBTZXJ2ZXIgRXJyb3IiCi0gICAgICByZXNwb25zZSwgdGhlbiB0aGlzIHJlc3BvbnNlIGNhbiBiZSByZXBsYWNlZCB3aXRoIGVpdGhlciBzb21lCi0gICAgICBmcmllbmRsaWVyIHRleHQgb3IgYnkgYSByZWRpcmVjdGlvbiB0byBhbm90aGVyIFVSTCAobG9jYWwgb3IKLSAgICAgIGV4dGVybmFsKS4KLSAgICAgIDxQPgotCi08RFQ+T2xkIGJlaGF2aW9yCi0KLSAgPEREPk5DU0EgaHR0cGQgMS4zIHdvdWxkIHJldHVybiBzb21lIGJvcmluZyBvbGQgZXJyb3IvcHJvYmxlbSBtZXNzYWdlCi0gICAgICB3aGljaCB3b3VsZCBvZnRlbiBiZSBtZWFuaW5nbGVzcyB0byB0aGUgdXNlciwgYW5kIHdvdWxkIHByb3ZpZGUgbm8KLSAgICAgIG1lYW5zIG9mIGxvZ2dpbmcgdGhlIHN5bXB0b21zIHdoaWNoIGNhdXNlZCBpdC48QlI+Ci0KLSAgICAgIDxQPgotCi08RFQ+TmV3IGJlaGF2aW9yCi0KLSAgPEREPlRoZSBzZXJ2ZXIgY2FuIGJlIGFza2VkIHRvOwotICA8T0w+Ci0gICAgPExJPkRpc3BsYXkgc29tZSBvdGhlciB0ZXh0LCBpbnN0ZWFkIG9mIHRoZSBOQ1NBIGhhcmQgY29kZWQgbWVzc2FnZXMsIG9yCi0gICAgPExJPnJlZGlyZWN0IHRvIGEgbG9jYWwgVVJMLCBvcgotICAgIDxMST5yZWRpcmVjdCB0byBhbiBleHRlcm5hbCBVUkwuCi0gIDwvT0w+Ci0KLSAgPFA+UmVkaXJlY3RpbmcgdG8gYW5vdGhlciBVUkwgY2FuIGJlIHVzZWZ1bCwgYnV0IG9ubHkgaWYgc29tZSBpbmZvcm1hdGlvbgotICAgICBjYW4gYmUgcGFzc2VkIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgdG8gZXhwbGFpbiBhbmQvb3IgbG9nIHRoZQotICAgICBlcnJvci9wcm9ibGVtCi0gICAgIG1vcmUgY2xlYXJseS4KLQotICA8UD5UbyBhY2hpZXZlIHRoaXMsIEFwYWNoZSB3aWxsIGRlZmluZSBuZXcgQ0dJLWxpa2UgZW52aXJvbm1lbnQKLSAgICAgdmFyaWFibGVzLCA8RU0+ZS5nLjwvRU0+Ci0KLSAgPEJMT0NLUVVPVEU+PENPREU+Ci1SRURJUkVDVF9IVFRQX0FDQ0VQVD0qLyosIGltYWdlL2dpZiwgaW1hZ2UveC14Yml0bWFwLCBpbWFnZS9qcGVnIDxCUj4KLVJFRElSRUNUX0hUVFBfVVNFUl9BR0VOVD1Nb3ppbGxhLzEuMWIyIChYMTE7IEk7IEhQLVVYIEEuMDkuMDUgOTAwMC83MTIpIDxCUj4KLVJFRElSRUNUX1BBVEg9LjovYmluOi91c3IvbG9jYWwvYmluOi9ldGMgPEJSPgotUkVESVJFQ1RfUVVFUllfU1RSSU5HPSA8QlI+Ci1SRURJUkVDVF9SRU1PVEVfQUREUj0xMjEuMzQ1Ljc4LjEyMyA8QlI+Ci1SRURJUkVDVF9SRU1PVEVfSE9TVD1vb2guYWhoaC5jb20gPEJSPgotUkVESVJFQ1RfU0VSVkVSX05BTUU9Y3Jhc2guYmFuZy5lZHUgPEJSPgotUkVESVJFQ1RfU0VSVkVSX1BPUlQ9ODAgPEJSPgotUkVESVJFQ1RfU0VSVkVSX1NPRlRXQVJFPUFwYWNoZS8wLjguMTUgPEJSPgotUkVESVJFQ1RfVVJMPS9jZ2ktYmluL2J1Z2d5LnBsIDxCUj4KLSAgPC9DT0RFPjwvQkxPQ0tRVU9URT4KLQotICA8UD5ub3RlIHRoZSA8Q09ERT5SRURJUkVDVF88L0NPREU+IHByZWZpeC4KLQotICA8UD5BdCBsZWFzdCA8Q09ERT5SRURJUkVDVF9VUkw8L0NPREU+IGFuZCA8Q09ERT5SRURJUkVDVF9RVUVSWV9TVFJJTkc8L0NPREU+Ci0gICAgIHdpbGwKLSAgICAgYmUgcGFzc2VkIHRvIHRoZSBuZXcgVVJMIChhc3N1bWluZyBpdCdzIGEgY2dpLXNjcmlwdCBvciBhIGNnaS1pbmNsdWRlKS4KLSAgICAgVGhlCi0gICAgIG90aGVyIHZhcmlhYmxlcyB3aWxsIGV4aXN0IG9ubHkgaWYgdGhleSBleGlzdGVkIHByaW9yIHRvIHRoZQotICAgICBlcnJvci9wcm9ibGVtLgotICAgICA8U1RST05HPk5vbmU8L1NUUk9ORz4gb2YgdGhlc2Ugd2lsbCBiZSBzZXQgaWYgeW91ciBFcnJvckRvY3VtZW50IGlzIGFuCi0gICAgIDxFTT5leHRlcm5hbDwvRU0+IHJlZGlyZWN0ICg8RU0+aS5lLjwvRU0+LCBhbnl0aGluZyBzdGFydGluZyB3aXRoIGEKLSAgICAgc2NoZW1lIG5hbWUKLSAgICAgbGlrZSA8Q09ERT5odHRwOjwvQ09ERT4sIGV2ZW4gaWYgaXQgcmVmZXJzIHRvIHRoZSBzYW1lIGhvc3QgYXMgdGhlCi0gICAgIHNlcnZlcikuPFA+Ci0KLTxEVD5Db25maWd1cmF0aW9uCi0KLSAgPEREPiBVc2Ugb2YgIkVycm9yRG9jdW1lbnQiIGlzIGVuYWJsZWQgZm9yIC5odGFjY2VzcyBmaWxlcyB3aGVuIHRoZQotICAgICAgIDxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjYWxsb3dvdmVycmlkZSI+IkZpbGVJbmZvIiBvdmVycmlkZTwvQT4gaXMKLSAgICAgICBhbGxvd2VkLgotCi0gIDxQPkhlcmUgYXJlIHNvbWUgZXhhbXBsZXMuLi4KLQotICA8QkxPQ0tRVU9URT48Q09ERT4KLUVycm9yRG9jdW1lbnQgNTAwIC9jZ2ktYmluL2NyYXNoLXJlY292ZXIgPEJSPgotRXJyb3JEb2N1bWVudCA1MDAgIlNvcnJ5LCBvdXIgc2NyaXB0IGNyYXNoZWQuIE9oIGRlYXI8QlI+Ci1FcnJvckRvY3VtZW50IDUwMCBodHRwOi8veHh4LyA8QlI+Ci1FcnJvckRvY3VtZW50IDQwNCAvTGFtZV9leGN1c2VzL25vdF9mb3VuZC5odG1sICA8QlI+Ci1FcnJvckRvY3VtZW50IDQwMSAvU3Vic2NyaXB0aW9uL2hvd190b19zdWJzY3JpYmUuaHRtbAotICA8L0NPREU+PC9CTE9DS1FVT1RFPgotCi0gIDxQPlRoZSBzeW50YXggaXMsCi0KLSAgPFA+PENPREU+PEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNlcnJvcmRvY3VtZW50Ij5FcnJvckRvY3VtZW50PC9BPjwvQ09ERT4KLSZsdDszLWRpZ2l0LWNvZGUmZ3Q7IGFjdGlvbgotCi0gIDxQPndoZXJlIHRoZSBhY3Rpb24gY2FuIGJlLAotCi0gIDxPTD4KLSAgICA8TEk+VGV4dCB0byBiZSBkaXNwbGF5ZWQuICBQcmVmaXggdGhlIHRleHQgd2l0aCBhIHF1b3RlICgmcXVvdDspLiBXaGF0ZXZlcgotICAgICAgICBmb2xsb3dzIHRoZSBxdW90ZSBpcyBkaXNwbGF5ZWQuIDxFTT5Ob3RlOiB0aGUgKCZxdW90OykgcHJlZml4IGlzbid0Ci0gICAgICAgIGRpc3BsYXllZC48L0VNPgotCi0gICAgPExJPkFuIGV4dGVybmFsIFVSTCB0byByZWRpcmVjdCB0by4KLQotICAgIDxMST5BIGxvY2FsIFVSTCB0byByZWRpcmVjdCB0by4KLQotICA8L09MPgotPC9ETD4KLQotPFA+PEhSPjxQPgotCi08SDI+Q3VzdG9tIGVycm9yIHJlc3BvbnNlcyBhbmQgcmVkaXJlY3RzPC9IMj4KLQotPERMPgotCi08RFQ+UHVycG9zZQotCi0gIDxERD5BcGFjaGUncyBiZWhhdmlvciB0byByZWRpcmVjdGVkIFVSTHMgaGFzIGJlZW4gbW9kaWZpZWQgc28gdGhhdCBhZGRpdGlvbmFsCi0gICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGF2YWlsYWJsZSB0byBhIHNjcmlwdC9zZXJ2ZXItaW5jbHVkZS48UD4KLQotPERUPk9sZCBiZWhhdmlvcgotCi0gIDxERD5TdGFuZGFyZCBDR0kgdmFycyB3ZXJlIG1hZGUgYXZhaWxhYmxlIHRvIGEgc2NyaXB0IHdoaWNoIGhhcyBiZWVuCi0gICAgICByZWRpcmVjdGVkIHRvLiBObyBpbmRpY2F0aW9uIG9mIHdoZXJlIHRoZSByZWRpcmVjdGlvbiBjYW1lIGZyb20gd2FzCi0gICAgICBwcm92aWRlZC4KLQotICA8UD4KLQotPERUPk5ldyBiZWhhdmlvcgotICA8REQ+Ci0KLUEgbmV3IGJhdGNoIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyB3aWxsIGJlIGluaXRpYWxpemVkIGZvciB1c2UgYnkgYQotc2NyaXB0IHdoaWNoIGhhcyBiZWVuIHJlZGlyZWN0ZWQgdG8uICBFYWNoIG5ldyB2YXJpYWJsZSB3aWxsIGhhdmUgdGhlCi1wcmVmaXggPENPREU+UkVESVJFQ1RfPC9DT0RFPi4gIDxDT0RFPlJFRElSRUNUXzwvQ09ERT4gZW52aXJvbm1lbnQKLXZhcmlhYmxlcyBhcmUgY3JlYXRlZCBmcm9tIHRoZSBDR0kgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdoaWNoIGV4aXN0ZWQKLXByaW9yIHRvIHRoZSByZWRpcmVjdCwgdGhleSBhcmUgcmVuYW1lZCB3aXRoIGEgPENPREU+UkVESVJFQ1RfPC9DT0RFPgotcHJlZml4LCA8RU0+aS5lLjwvRU0+LCA8Q09ERT5IVFRQX1VTRVJfQUdFTlQ8L0NPREU+IGJlY29tZXMKLTxDT0RFPlJFRElSRUNUX0hUVFBfVVNFUl9BR0VOVDwvQ09ERT4uICBJbiBhZGRpdGlvbiB0byB0aGVzZSBuZXcKLXZhcmlhYmxlcywgQXBhY2hlIHdpbGwgZGVmaW5lIDxDT0RFPlJFRElSRUNUX1VSTDwvQ09ERT4gYW5kCi08Q09ERT5SRURJUkVDVF9TVEFUVVM8L0NPREU+IHRvIGhlbHAgdGhlIHNjcmlwdCB0cmFjZSBpdHMgb3JpZ2luLgotQm90aCB0aGUgb3JpZ2luYWwgVVJMIGFuZCB0aGUgVVJMIGJlaW5nIHJlZGlyZWN0ZWQgdG8gY2FuIGJlIGxvZ2dlZCBpbgotdGhlIGFjY2VzcyBsb2cuCi0KLTwvREw+Ci08UD4KLUlmIHRoZSBFcnJvckRvY3VtZW50IHNwZWNpZmllcyBhIGxvY2FsIHJlZGlyZWN0IHRvIGEgQ0dJIHNjcmlwdCwgdGhlIHNjcmlwdAotc2hvdWxkIGluY2x1ZGUgYSAiPFNBTVA+U3RhdHVzOjwvU0FNUD4iIGhlYWRlciBmaWVsZCBpbiBpdHMgb3V0cHV0Ci1pbiBvcmRlciB0byBlbnN1cmUgdGhlIHByb3BhZ2F0aW9uIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIGNsaWVudAotb2YgdGhlIGVycm9yIGNvbmRpdGlvbiB0aGF0IGNhdXNlZCBpdCB0byBiZSBpbnZva2VkLiAgRm9yIGluc3RhbmNlLCBhIFBlcmwKLUVycm9yRG9jdW1lbnQgc2NyaXB0IG1pZ2h0IGluY2x1ZGUgdGhlIGZvbGxvd2luZzoKLTwvUD4KLTxQUkU+Ci0gICAgICA6Ci0gICAgcHJpbnQgICJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxuIjsKLSAgICBwcmludGYgIlN0YXR1czogJXMgQ29uZGl0aW9uIEludGVyY2VwdGVkXG4iLCAkRU5WeyJSRURJUkVDVF9TVEFUVVMifTsKLSAgICAgIDoKLTwvUFJFPgotPFA+Ci1JZiB0aGUgc2NyaXB0IGlzIGRlZGljYXRlZCB0byBoYW5kbGluZyBhIHBhcnRpY3VsYXIgZXJyb3IgY29uZGl0aW9uLCBzdWNoIGFzCi08U0FNUD40MDQmbmJzcDtOb3QmbmJzcDtGb3VuZDwvU0FNUD4sIGl0IGNhbiB1c2UgdGhlIHNwZWNpZmljIGNvZGUgYW5kCi1lcnJvciB0ZXh0IGluc3RlYWQuCi08L1A+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9kZXZlbG9wZXIvQVBJLmh0bWwgYi9kb2NzL21hbnVhbC9kZXZlbG9wZXIvQVBJLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMGZiNzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvZGV2ZWxvcGVyL0FQSS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE1MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD48SEVBRD4KLTxUSVRMRT5BcGFjaGUgQVBJIG5vdGVzPC9USVRMRT4KLTwvSEVBRD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPkFwYWNoZSBBUEkgbm90ZXM8L0gxPgotCi1UaGVzZSBhcmUgc29tZSBub3RlcyBvbiB0aGUgQXBhY2hlIEFQSSBhbmQgdGhlIGRhdGEgc3RydWN0dXJlcyB5b3UKLWhhdmUgdG8gZGVhbCB3aXRoLCA8RU0+ZXRjLjwvRU0+ICBUaGV5IGFyZSBub3QgeWV0IG5lYXJseSBjb21wbGV0ZSwgYnV0Ci1ob3BlZnVsbHksIHRoZXkgd2lsbCBoZWxwIHlvdSBnZXQgeW91ciBiZWFyaW5ncy4gIEtlZXAgaW4gbWluZCB0aGF0Ci10aGUgQVBJIGlzIHN0aWxsIHN1YmplY3QgdG8gY2hhbmdlIGFzIHdlIGdhaW4gZXhwZXJpZW5jZSB3aXRoIGl0LgotKFNlZSB0aGUgVE9ETyBmaWxlIGZvciB3aGF0IDxFTT5taWdodDwvRU0+IGJlIGNvbWluZykuICBIb3dldmVyLAotaXQgd2lsbCBiZSBlYXN5IHRvIGFkYXB0IG1vZHVsZXMgdG8gYW55IGNoYW5nZXMgdGhhdCBhcmUgbWFkZS4KLShXZSBoYXZlIG1vcmUgbW9kdWxlcyB0byBhZGFwdCB0aGFuIHlvdSBkbykuCi08UD4KLQotQSBmZXcgbm90ZXMgb24gZ2VuZXJhbCBwZWRhZ29naWNhbCBzdHlsZSBoZXJlLiAgSW4gdGhlIGludGVyZXN0IG9mCi1jb25jaXNlbmVzcywgYWxsIHN0cnVjdHVyZSBkZWNsYXJhdGlvbnMgaGVyZSBhcmUgaW5jb21wbGV0ZSAtLS0gdGhlCi1yZWFsIG9uZXMgaGF2ZSBtb3JlIHNsb3RzIHRoYXQgSSdtIG5vdCB0ZWxsaW5nIHlvdSBhYm91dC4gIEZvciB0aGUKLW1vc3QgcGFydCwgdGhlc2UgYXJlIHJlc2VydmVkIHRvIG9uZSBjb21wb25lbnQgb2YgdGhlIHNlcnZlciBjb3JlIG9yCi1hbm90aGVyLCBhbmQgc2hvdWxkIGJlIGFsdGVyZWQgYnkgbW9kdWxlcyB3aXRoIGNhdXRpb24uICBIb3dldmVyLCBpbgotc29tZSBjYXNlcywgdGhleSByZWFsbHkgYXJlIHRoaW5ncyBJIGp1c3QgaGF2ZW4ndCBnb3R0ZW4gYXJvdW5kIHRvCi15ZXQuICBXZWxjb21lIHRvIHRoZSBibGVlZGluZyBlZGdlLjxQPgotCi1GaW5hbGx5LCBoZXJlJ3MgYW4gb3V0bGluZSwgdG8gZ2l2ZSB5b3Ugc29tZSBiYXJlIGlkZWEgb2Ygd2hhdCdzCi1jb21pbmcgdXAsIGFuZCBpbiB3aGF0IG9yZGVyOgotCi08VUw+Ci08TEk+IDxBIEhSRUY9IiNiYXNpY3MiPkJhc2ljIGNvbmNlcHRzLjwvQT4KLTxNRU5VPgotIDxMST4gPEEgSFJFRj0iI0hNUiI+SGFuZGxlcnMsIE1vZHVsZXMsIGFuZCBSZXF1ZXN0czwvQT4KLSA8TEk+IDxBIEhSRUY9IiNtb2R1bGV0b3VyIj5BIGJyaWVmIHRvdXIgb2YgYSBtb2R1bGU8L0E+Ci08L01FTlU+Ci08TEk+IDxBIEhSRUY9IiNoYW5kbGVycyI+SG93IGhhbmRsZXJzIHdvcms8L0E+Ci08TUVOVT4KLSA8TEk+IDxBIEhSRUY9IiNyZXFfdG91ciI+QSBicmllZiB0b3VyIG9mIHRoZSA8Q09ERT5yZXF1ZXN0X3JlYzwvQ09ERT48L0E+Ci0gPExJPiA8QSBIUkVGPSIjcmVxX29yaWciPldoZXJlIHJlcXVlc3RfcmVjIHN0cnVjdHVyZXMgY29tZSBmcm9tPC9BPgotIDxMST4gPEEgSFJFRj0iI3JlcV9yZXR1cm4iPkhhbmRsaW5nIHJlcXVlc3RzLCBkZWNsaW5pbmcsIGFuZCByZXR1cm5pbmcgZXJyb3IKLSAgY29kZXM8L0E+Ci0gPExJPiA8QSBIUkVGPSIjcmVzcF9oYW5kbGVycyI+U3BlY2lhbCBjb25zaWRlcmF0aW9ucyBmb3IgcmVzcG9uc2UgaGFuZGxlcnM8L0E+Ci0gPExJPiA8QSBIUkVGPSIjYXV0aF9oYW5kbGVycyI+U3BlY2lhbCBjb25zaWRlcmF0aW9ucyBmb3IgYXV0aGVudGljYXRpb24KLSAgaGFuZGxlcnM8L0E+Ci0gPExJPiA8QSBIUkVGPSIjbG9nX2hhbmRsZXJzIj5TcGVjaWFsIGNvbnNpZGVyYXRpb25zIGZvciBsb2dnaW5nIGhhbmRsZXJzPC9BPgotPC9NRU5VPgotPExJPiA8QSBIUkVGPSIjcG9vbHMiPlJlc291cmNlIGFsbG9jYXRpb24gYW5kIHJlc291cmNlIHBvb2xzPC9BPgotPExJPiA8QSBIUkVGPSIjY29uZmlnIj5Db25maWd1cmF0aW9uLCBjb21tYW5kcyBhbmQgdGhlIGxpa2U8L0E+Ci08TUVOVT4KLSA8TEk+IDxBIEhSRUY9IiNwZXItZGlyIj5QZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlczwvQT4KLSA8TEk+IDxBIEhSRUY9IiNjb21tYW5kcyI+Q29tbWFuZCBoYW5kbGluZzwvQT4KLSA8TEk+IDxBIEhSRUY9IiNzZXJ2Y29uZiI+U2lkZSBub3RlcyAtLS0gcGVyLXNlcnZlciBjb25maWd1cmF0aW9uLAotICB2aXJ0dWFsIHNlcnZlcnMsIDxFTT5ldGM8L0VNPi48L0E+Ci08L01FTlU+Ci08L1VMPgotCi08SDI+PEEgTkFNRT0iYmFzaWNzIj5CYXNpYyBjb25jZXB0cy48L0E+PC9IMj4KLQotV2UgYmVnaW4gd2l0aCBhbiBvdmVydmlldyBvZiB0aGUgYmFzaWMgY29uY2VwdHMgYmVoaW5kIHRoZQotQVBJLCBhbmQgaG93IHRoZXkgYXJlIG1hbmlmZXN0ZWQgaW4gdGhlIGNvZGUuCi0KLTxIMz48QSBOQU1FPSJITVIiPkhhbmRsZXJzLCBNb2R1bGVzLCBhbmQgUmVxdWVzdHM8L0E+PC9IMz4KLQotQXBhY2hlIGJyZWFrcyBkb3duIHJlcXVlc3QgaGFuZGxpbmcgaW50byBhIHNlcmllcyBvZiBzdGVwcywgbW9yZSBvcgotbGVzcyB0aGUgc2FtZSB3YXkgdGhlIE5ldHNjYXBlIHNlcnZlciBBUEkgZG9lcyAoYWx0aG91Z2ggdGhpcyBBUEkgaGFzCi1hIGZldyBtb3JlIHN0YWdlcyB0aGFuIE5ldFNpdGUgZG9lcywgYXMgaG9va3MgZm9yIHN0dWZmIEkgdGhvdWdodAotbWlnaHQgYmUgdXNlZnVsIGluIHRoZSBmdXR1cmUpLiAgVGhlc2UgYXJlOgotCi08VUw+Ci0gIDxMST4gVVJJIC0mZ3Q7IEZpbGVuYW1lIHRyYW5zbGF0aW9uCi0gIDxMST4gQXV0aCBJRCBjaGVja2luZyBbaXMgdGhlIHVzZXIgd2hvIHRoZXkgc2F5IHRoZXkgYXJlP10KLSAgPExJPiBBdXRoIGFjY2VzcyBjaGVja2luZyBbaXMgdGhlIHVzZXIgYXV0aG9yaXplZCA8RU0+aGVyZTwvRU0+P10KLSAgPExJPiBBY2Nlc3MgY2hlY2tpbmcgb3RoZXIgdGhhbiBhdXRoCi0gIDxMST4gRGV0ZXJtaW5pbmcgTUlNRSB0eXBlIG9mIHRoZSBvYmplY3QgcmVxdWVzdGVkCi0gIDxMST4gYEZpeHVwcycgLS0tIHRoZXJlIGFyZW4ndCBhbnkgb2YgdGhlc2UgeWV0LCBidXQgdGhlIHBoYXNlIGlzCi0gICAgICAgaW50ZW5kZWQgYXMgYSBob29rIGZvciBwb3NzaWJsZSBleHRlbnNpb25zIGxpa2UKLSAgICAgICA8Q09ERT5TZXRFbnY8L0NPREU+LCB3aGljaCBkb24ndCByZWFsbHkgZml0IHdlbGwgZWxzZXdoZXJlLgotICA8TEk+IEFjdHVhbGx5IHNlbmRpbmcgYSByZXNwb25zZSBiYWNrIHRvIHRoZSBjbGllbnQuCi0gIDxMST4gTG9nZ2luZyB0aGUgcmVxdWVzdAotPC9VTD4KLQotVGhlc2UgcGhhc2VzIGFyZSBoYW5kbGVkIGJ5IGxvb2tpbmcgYXQgZWFjaCBvZiBhIHN1Y2Nlc3Npb24gb2YKLTxFTT5tb2R1bGVzPC9FTT4sIGxvb2tpbmcgdG8gc2VlIGlmIGVhY2ggb2YgdGhlbSBoYXMgYSBoYW5kbGVyIGZvciB0aGUKLXBoYXNlLCBhbmQgYXR0ZW1wdGluZyBpbnZva2luZyBpdCBpZiBzby4gIFRoZSBoYW5kbGVyIGNhbiB0eXBpY2FsbHkgZG8KLW9uZSBvZiB0aHJlZSB0aGluZ3M6Ci0KLTxVTD4KLSAgPExJPiA8RU0+SGFuZGxlPC9FTT4gdGhlIHJlcXVlc3QsIGFuZCBpbmRpY2F0ZSB0aGF0IGl0IGhhcyBkb25lIHNvCi0gICAgICAgYnkgcmV0dXJuaW5nIHRoZSBtYWdpYyBjb25zdGFudCA8Q09ERT5PSzwvQ09ERT4uCi0gIDxMST4gPEVNPkRlY2xpbmU8L0VNPiB0byBoYW5kbGUgdGhlIHJlcXVlc3QsIGJ5IHJldHVybmluZyB0aGUgbWFnaWMKLSAgICAgICBpbnRlZ2VyIGNvbnN0YW50IDxDT0RFPkRFQ0xJTkVEPC9DT0RFPi4gIEluIHRoaXMgY2FzZSwgdGhlCi0gICAgICAgc2VydmVyIGJlaGF2ZXMgaW4gYWxsIHJlc3BlY3RzIGFzIGlmIHRoZSBoYW5kbGVyIHNpbXBseSBoYWRuJ3QKLSAgICAgICBiZWVuIHRoZXJlLgotICA8TEk+IFNpZ25hbCBhbiBlcnJvciwgYnkgcmV0dXJuaW5nIG9uZSBvZiB0aGUgSFRUUCBlcnJvciBjb2Rlcy4KLSAgICAgICBUaGlzIHRlcm1pbmF0ZXMgbm9ybWFsIGhhbmRsaW5nIG9mIHRoZSByZXF1ZXN0LCBhbHRob3VnaCBhbgotICAgICAgIEVycm9yRG9jdW1lbnQgbWF5IGJlIGludm9rZWQgdG8gdHJ5IHRvIG1vcCB1cCwgYW5kIGl0IHdpbGwgYmUKLSAgICAgICBsb2dnZWQgaW4gYW55IGNhc2UuCi08L1VMPgotCi1Nb3N0IHBoYXNlcyBhcmUgdGVybWluYXRlZCBieSB0aGUgZmlyc3QgbW9kdWxlIHRoYXQgaGFuZGxlcyB0aGVtOwotaG93ZXZlciwgZm9yIGxvZ2dpbmcsIGBmaXh1cHMnLCBhbmQgbm9uLWFjY2VzcyBhdXRoZW50aWNhdGlvbgotY2hlY2tpbmcsIGFsbCBoYW5kbGVycyBhbHdheXMgcnVuIChiYXJyaW5nIGFuIGVycm9yKS4gIEFsc28sIHRoZQotcmVzcG9uc2UgcGhhc2UgaXMgdW5pcXVlIGluIHRoYXQgbW9kdWxlcyBtYXkgZGVjbGFyZSBtdWx0aXBsZSBoYW5kbGVycwotZm9yIGl0LCB2aWEgYSBkaXNwYXRjaCB0YWJsZSBrZXllZCBvbiB0aGUgTUlNRSB0eXBlIG9mIHRoZSByZXF1ZXN0ZWQKLW9iamVjdC4gIE1vZHVsZXMgbWF5IGRlY2xhcmUgYSByZXNwb25zZS1waGFzZSBoYW5kbGVyIHdoaWNoIGNhbiBoYW5kbGUKLTxFTT5hbnk8L0VNPiByZXF1ZXN0LCBieSBnaXZpbmcgaXQgdGhlIGtleSA8Q09ERT4qLyo8L0NPREU+ICg8RU0+aS5lLjwvRU0+LCBhCi13aWxkY2FyZCBNSU1FIHR5cGUgc3BlY2lmaWNhdGlvbikuICBIb3dldmVyLCB3aWxkY2FyZCBoYW5kbGVycyBhcmUKLW9ubHkgaW52b2tlZCBpZiB0aGUgc2VydmVyIGhhcyBhbHJlYWR5IHRyaWVkIGFuZCBmYWlsZWQgdG8gZmluZCBhIG1vcmUKLXNwZWNpZmljIHJlc3BvbnNlIGhhbmRsZXIgZm9yIHRoZSBNSU1FIHR5cGUgb2YgdGhlIHJlcXVlc3RlZCBvYmplY3QKLShlaXRoZXIgbm9uZSBleGlzdGVkLCBvciB0aGV5IGFsbCBkZWNsaW5lZCkuPFA+Ci0KLVRoZSBoYW5kbGVycyB0aGVtc2VsdmVzIGFyZSBmdW5jdGlvbnMgb2Ygb25lIGFyZ3VtZW50IChhCi08Q09ERT5yZXF1ZXN0X3JlYzwvQ09ERT4gc3RydWN0dXJlLiB2aWRlIGluZnJhKSwgd2hpY2ggcmV0dXJucyBhbgotaW50ZWdlciwgYXMgYWJvdmUuPFA+Ci0KLTxIMz48QSBOQU1FPSJtb2R1bGV0b3VyIj5BIGJyaWVmIHRvdXIgb2YgYSBtb2R1bGU8L0E+PC9IMz4KLQotQXQgdGhpcyBwb2ludCwgd2UgbmVlZCB0byBleHBsYWluIHRoZSBzdHJ1Y3R1cmUgb2YgYSBtb2R1bGUuICBPdXIKLWNhbmRpZGF0ZSB3aWxsIGJlIG9uZSBvZiB0aGUgbWVzc2llciBvbmVzLCB0aGUgQ0dJIG1vZHVsZSAtLS0gdGhpcwotaGFuZGxlcyBib3RoIENHSSBzY3JpcHRzIGFuZCB0aGUgPENPREU+U2NyaXB0QWxpYXM8L0NPREU+IGNvbmZpZyBmaWxlCi1jb21tYW5kLiAgSXQncyBhY3R1YWxseSBhIGdyZWF0IGRlYWwgbW9yZSBjb21wbGljYXRlZCB0aGFuIG1vc3QKLW1vZHVsZXMsIGJ1dCBpZiB3ZSdyZSBnb2luZyB0byBoYXZlIG9ubHkgb25lIGV4YW1wbGUsIGl0IG1pZ2h0IGFzIHdlbGwKLWJlIHRoZSBvbmUgd2l0aCBpdHMgZmluZ2VycyBpbiBldmVyeSBwbGFjZS48UD4KLQotTGV0J3MgYmVnaW4gd2l0aCBoYW5kbGVycy4gIEluIG9yZGVyIHRvIGhhbmRsZSB0aGUgQ0dJIHNjcmlwdHMsIHRoZQotbW9kdWxlIGRlY2xhcmVzIGEgcmVzcG9uc2UgaGFuZGxlciBmb3IgdGhlbS4gQmVjYXVzZSBvZgotPENPREU+U2NyaXB0QWxpYXM8L0NPREU+LCBpdCBhbHNvIGhhcyBoYW5kbGVycyBmb3IgdGhlIG5hbWUKLXRyYW5zbGF0aW9uIHBoYXNlICh0byByZWNvZ25pemUgPENPREU+U2NyaXB0QWxpYXM8L0NPREU+ZWQgVVJJcyksIHRoZQotdHlwZS1jaGVja2luZyBwaGFzZSAoYW55IDxDT0RFPlNjcmlwdEFsaWFzPC9DT0RFPmVkIHJlcXVlc3QgaXMgdHlwZWQKLWFzIGEgQ0dJIHNjcmlwdCkuPFA+Ci0KLVRoZSBtb2R1bGUgbmVlZHMgdG8gbWFpbnRhaW4gc29tZSBwZXIgKHZpcnR1YWwpCi1zZXJ2ZXIgaW5mb3JtYXRpb24sIG5hbWVseSwgdGhlIDxDT0RFPlNjcmlwdEFsaWFzPC9DT0RFPmVzIGluIGVmZmVjdDsKLXRoZSBtb2R1bGUgc3RydWN0dXJlIHRoZXJlZm9yZSBjb250YWlucyBwb2ludGVycyB0byBhIGZ1bmN0aW9ucyB3aGljaAotYnVpbGRzIHRoZXNlIHN0cnVjdHVyZXMsIGFuZCB0byBhbm90aGVyIHdoaWNoIGNvbWJpbmVzIHR3byBvZiB0aGVtIChpbgotY2FzZSB0aGUgbWFpbiBzZXJ2ZXIgYW5kIGEgdmlydHVhbCBzZXJ2ZXIgYm90aCBoYXZlCi08Q09ERT5TY3JpcHRBbGlhczwvQ09ERT5lcyBkZWNsYXJlZCkuPFA+Ci0KLUZpbmFsbHksIHRoaXMgbW9kdWxlIGNvbnRhaW5zIGNvZGUgdG8gaGFuZGxlIHRoZQotPENPREU+U2NyaXB0QWxpYXM8L0NPREU+IGNvbW1hbmQgaXRzZWxmLiAgVGhpcyBwYXJ0aWN1bGFyIG1vZHVsZSBvbmx5Ci1kZWNsYXJlcyBvbmUgY29tbWFuZCwgYnV0IHRoZXJlIGNvdWxkIGJlIG1vcmUsIHNvIG1vZHVsZXMgaGF2ZQotPEVNPmNvbW1hbmQgdGFibGVzPC9FTT4gd2hpY2ggZGVjbGFyZSB0aGVpciBjb21tYW5kcywgYW5kIGRlc2NyaWJlCi13aGVyZSB0aGV5IGFyZSBwZXJtaXR0ZWQsIGFuZCBob3cgdGhleSBhcmUgdG8gYmUgaW52b2tlZC4gIDxQPgotCi1BIGZpbmFsIG5vdGUgb24gdGhlIGRlY2xhcmVkIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgb2Ygc29tZSBvZiB0aGVzZQotY29tbWFuZHM6IGEgPENPREU+cG9vbDwvQ09ERT4gaXMgYSBwb2ludGVyIHRvIGEgPEVNPnJlc291cmNlIHBvb2w8L0VNPgotc3RydWN0dXJlOyB0aGVzZSBhcmUgdXNlZCBieSB0aGUgc2VydmVyIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG1lbW9yeQotd2hpY2ggaGFzIGJlZW4gYWxsb2NhdGVkLCBmaWxlcyBvcGVuZWQsIDxFTT5ldGMuPC9FTT4sIGVpdGhlciB0byBzZXJ2aWNlIGEKLXBhcnRpY3VsYXIgcmVxdWVzdCwgb3IgdG8gaGFuZGxlIHRoZSBwcm9jZXNzIG9mIGNvbmZpZ3VyaW5nIGl0c2VsZi4KLVRoYXQgd2F5LCB3aGVuIHRoZSByZXF1ZXN0IGlzIG92ZXIgKG9yLCBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gcG9vbCwKLXdoZW4gdGhlIHNlcnZlciBpcyByZXN0YXJ0aW5nKSwgdGhlIG1lbW9yeSBjYW4gYmUgZnJlZWQsIGFuZCB0aGUgZmlsZXMKLWNsb3NlZCwgPEVNPmVuIG1hc3NlPC9FTT4sIHdpdGhvdXQgYW55b25lIGhhdmluZyB0byB3cml0ZSBleHBsaWNpdCBjb2RlIHRvCi10cmFjayB0aGVtIGFsbCBkb3duIGFuZCBkaXNwb3NlIG9mIHRoZW0uICBBbHNvLCBhCi08Q09ERT5jbWRfcGFybXM8L0NPREU+IHN0cnVjdHVyZSBjb250YWlucyB2YXJpb3VzIGluZm9ybWF0aW9uIGFib3V0Ci10aGUgY29uZmlnIGZpbGUgYmVpbmcgcmVhZCwgYW5kIG90aGVyIHN0YXR1cyBpbmZvcm1hdGlvbiwgd2hpY2ggaXMKLXNvbWV0aW1lcyBvZiB1c2UgdG8gdGhlIGZ1bmN0aW9uIHdoaWNoIHByb2Nlc3NlcyBhIGNvbmZpZy1maWxlIGNvbW1hbmQKLShzdWNoIGFzIDxDT0RFPlNjcmlwdEFsaWFzPC9DT0RFPikuCi0KLVdpdGggbm8gZnVydGhlciBhZG8sIHRoZSBtb2R1bGUgaXRzZWxmOgotCi08UFJFPgotLyogRGVjbGFyYXRpb25zIG9mIGhhbmRsZXJzLiAqLwotCi1pbnQgdHJhbnNsYXRlX3NjcmlwdGFsaWFzIChyZXF1ZXN0X3JlYyAqKTsKLWludCB0eXBlX3NjcmlwdGFsaWFzIChyZXF1ZXN0X3JlYyAqKTsKLWludCBjZ2lfaGFuZGxlciAocmVxdWVzdF9yZWMgKik7Ci0KLS8qIFN1YnNpZGlhcnkgZGlzcGF0Y2ggdGFibGUgZm9yIHJlc3BvbnNlLXBoYXNlIGhhbmRsZXJzLCBieSBNSU1FIHR5cGUgKi8KLQotaGFuZGxlcl9yZWMgY2dpX2hhbmRsZXJzW10gPSB7Ci17ICJhcHBsaWNhdGlvbi94LWh0dHBkLWNnaSIsIGNnaV9oYW5kbGVyIH0sCi17IE5VTEwgfQotfTsKLQotLyogRGVjbGFyYXRpb25zIG9mIHJvdXRpbmVzIHRvIG1hbmlwdWxhdGUgdGhlIG1vZHVsZSdzIGNvbmZpZ3VyYXRpb24KLSAqIGluZm8uICBOb3RlIHRoYXQgdGhlc2UgYXJlIHJldHVybmVkLCBhbmQgcGFzc2VkIGluLCBhcyB2b2lkIConczsKLSAqIHRoZSBzZXJ2ZXIgY29yZSBrZWVwcyB0cmFjayBvZiB0aGVtLCBidXQgaXQgZG9lc24ndCwgYW5kIGNhbid0LAotICoga25vdyB0aGVpciBpbnRlcm5hbCBzdHJ1Y3R1cmUuCi0gKi8KLQotdm9pZCAqbWFrZV9jZ2lfc2VydmVyX2NvbmZpZyAocG9vbCAqKTsKLXZvaWQgKm1lcmdlX2NnaV9zZXJ2ZXJfY29uZmlnIChwb29sICosIHZvaWQgKiwgdm9pZCAqKTsKLQotLyogRGVjbGFyYXRpb25zIG9mIHJvdXRpbmVzIHRvIGhhbmRsZSBjb25maWctZmlsZSBjb21tYW5kcyAqLwotCi1leHRlcm4gY2hhciAqc2NyaXB0X2FsaWFzKGNtZF9wYXJtcyAqLCB2b2lkICpwZXJfZGlyX2NvbmZpZywgY2hhciAqZmFrZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcmVhbCk7Ci0KLWNvbW1hbmRfcmVjIGNnaV9jbWRzW10gPSB7Ci17ICJTY3JpcHRBbGlhcyIsIHNjcmlwdF9hbGlhcywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMiwKLSAgICAiYSBmYWtlbmFtZSBhbmQgYSByZWFsbmFtZSJ9LAoteyBOVUxMIH0KLX07Ci0KLW1vZHVsZSBjZ2lfbW9kdWxlID0gewotICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGLAotICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplciAqLwotICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBkaXIgY29uZmlnIGNyZWF0b3IgKi8KLSAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogZGlyIG1lcmdlciAtLS0gZGVmYXVsdCBpcyB0byBvdmVycmlkZSAqLwotICAgbWFrZV9jZ2lfc2VydmVyX2NvbmZpZywgICAvKiBzZXJ2ZXIgY29uZmlnICovCi0gICBtZXJnZV9jZ2lfc2VydmVyX2NvbmZpZywgIC8qIG1lcmdlIHNlcnZlciBjb25maWcgKi8KLSAgIGNnaV9jbWRzLCAgICAgICAgICAgICAgICAgLyogY29tbWFuZCB0YWJsZSAqLwotICAgY2dpX2hhbmRsZXJzLCAgICAgICAgICAgICAvKiBoYW5kbGVycyAqLwotICAgdHJhbnNsYXRlX3NjcmlwdGFsaWFzLCAgICAvKiBmaWxlbmFtZSB0cmFuc2xhdGlvbiAqLwotICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBjaGVja191c2VyX2lkICovCi0gICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGF1dGggKi8KLSAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgYWNjZXNzICovCi0gICB0eXBlX3NjcmlwdGFsaWFzLCAgICAgICAgIC8qIHR5cGVfY2hlY2tlciAqLwotICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBmaXh1cHMgKi8KLSAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogbG9nZ2VyICovCi0gICBOVUxMICAgICAgICAgICAgICAgICAgICAgIC8qIGhlYWRlciBwYXJzZXIgKi8KLX07Ci08L1BSRT4KLQotPEgyPjxBIE5BTUU9ImhhbmRsZXJzIj5Ib3cgaGFuZGxlcnMgd29yazwvQT48L0gyPgotCi1UaGUgc29sZSBhcmd1bWVudCB0byBoYW5kbGVycyBpcyBhIDxDT0RFPnJlcXVlc3RfcmVjPC9DT0RFPiBzdHJ1Y3R1cmUuCi1UaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBwYXJ0aWN1bGFyIHJlcXVlc3Qgd2hpY2ggaGFzIGJlZW4gbWFkZSB0bwotdGhlIHNlcnZlciwgb24gYmVoYWxmIG9mIGEgY2xpZW50LiAgSW4gbW9zdCBjYXNlcywgZWFjaCBjb25uZWN0aW9uIHRvCi10aGUgY2xpZW50IGdlbmVyYXRlcyBvbmx5IG9uZSA8Q09ERT5yZXF1ZXN0X3JlYzwvQ09ERT4gc3RydWN0dXJlLjxQPgotCi08SDM+PEEgTkFNRT0icmVxX3RvdXIiPkEgYnJpZWYgdG91ciBvZiB0aGUgPENPREU+cmVxdWVzdF9yZWM8L0NPREU+PC9BPjwvSDM+Ci0KLVRoZSA8Q09ERT5yZXF1ZXN0X3JlYzwvQ09ERT4gY29udGFpbnMgcG9pbnRlcnMgdG8gYSByZXNvdXJjZSBwb29sCi13aGljaCB3aWxsIGJlIGNsZWFyZWQgd2hlbiB0aGUgc2VydmVyIGlzIGZpbmlzaGVkIGhhbmRsaW5nIHRoZQotcmVxdWVzdDsgdG8gc3RydWN0dXJlcyBjb250YWluaW5nIHBlci1zZXJ2ZXIgYW5kIHBlci1jb25uZWN0aW9uCi1pbmZvcm1hdGlvbiwgYW5kIG1vc3QgaW1wb3J0YW50bHksIGluZm9ybWF0aW9uIG9uIHRoZSByZXF1ZXN0IGl0c2VsZi48UD4KLQotVGhlIG1vc3QgaW1wb3J0YW50IHN1Y2ggaW5mb3JtYXRpb24gaXMgYSBzbWFsbCBzZXQgb2YgY2hhcmFjdGVyCi1zdHJpbmdzIGRlc2NyaWJpbmcgYXR0cmlidXRlcyBvZiB0aGUgb2JqZWN0IGJlaW5nIHJlcXVlc3RlZCwgaW5jbHVkaW5nCi1pdHMgVVJJLCBmaWxlbmFtZSwgY29udGVudC10eXBlIGFuZCBjb250ZW50LWVuY29kaW5nICh0aGVzZSBiZWluZyBmaWxsZWQKLWluIGJ5IHRoZSB0cmFuc2xhdGlvbiBhbmQgdHlwZS1jaGVjayBoYW5kbGVycyB3aGljaCBoYW5kbGUgdGhlCi1yZXF1ZXN0LCByZXNwZWN0aXZlbHkpLiA8UD4KLQotT3RoZXIgY29tbW9ubHkgdXNlZCBkYXRhIGl0ZW1zIGFyZSB0YWJsZXMgZ2l2aW5nIHRoZSBNSU1FIGhlYWRlcnMgb24KLXRoZSBjbGllbnQncyBvcmlnaW5hbCByZXF1ZXN0LCBNSU1FIGhlYWRlcnMgdG8gYmUgc2VudCBiYWNrIHdpdGggdGhlCi1yZXNwb25zZSAod2hpY2ggbW9kdWxlcyBjYW4gYWRkIHRvIGF0IHdpbGwpLCBhbmQgZW52aXJvbm1lbnQgdmFyaWFibGVzCi1mb3IgYW55IHN1YnByb2Nlc3NlcyB3aGljaCBhcmUgc3Bhd25lZCBvZmYgaW4gdGhlIGNvdXJzZSBvZiBzZXJ2aWNpbmcKLXRoZSByZXF1ZXN0LiAgVGhlc2UgdGFibGVzIGFyZSBtYW5pcHVsYXRlZCB1c2luZyB0aGUKLTxDT0RFPmFwX3RhYmxlX2dldDwvQ09ERT4gYW5kIDxDT0RFPmFwX3RhYmxlX3NldDwvQ09ERT4gcm91dGluZXMuIDxQPgotPEJMT0NLUVVPVEU+Ci0gTm90ZSB0aGF0IHRoZSA8U0FNUD5Db250ZW50LXR5cGU8L1NBTVA+IGhlYWRlciB2YWx1ZSA8RU0+Y2Fubm90PC9FTT4gYmUKLSBzZXQgYnkgbW9kdWxlIGNvbnRlbnQtaGFuZGxlcnMgdXNpbmcgdGhlIDxTQU1QPmFwX3RhYmxlXyooKTwvU0FNUD4KLSByb3V0aW5lcy4gIFJhdGhlciwgaXQgaXMgc2V0IGJ5IHBvaW50aW5nIHRoZSA8U0FNUD5jb250ZW50X3R5cGU8L1NBTVA+Ci0gZmllbGQgaW4gdGhlIDxTQU1QPnJlcXVlc3RfcmVjPC9TQU1QPiBzdHJ1Y3R1cmUgdG8gYW4gYXBwcm9wcmlhdGUKLSBzdHJpbmcuICA8RU0+RS5nLjwvRU0+LAotIDxQUkU+Ci0gIHItJmd0O2NvbnRlbnRfdHlwZSA9ICJ0ZXh0L2h0bWwiOwotIDwvUFJFPgotPC9CTE9DS1FVT1RFPgotRmluYWxseSwgdGhlcmUgYXJlIHBvaW50ZXJzIHRvIHR3byBkYXRhIHN0cnVjdHVyZXMgd2hpY2gsIGluIHR1cm4sCi1wb2ludCB0byBwZXItbW9kdWxlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlcy4gIFNwZWNpZmljYWxseSwgdGhlc2UKLWhvbGQgcG9pbnRlcnMgdG8gdGhlIGRhdGEgc3RydWN0dXJlcyB3aGljaCB0aGUgbW9kdWxlIGhhcyBidWlsdCB0bwotZGVzY3JpYmUgdGhlIHdheSBpdCBoYXMgYmVlbiBjb25maWd1cmVkIHRvIG9wZXJhdGUgaW4gYSBnaXZlbgotZGlyZWN0b3J5ICh2aWEgPENPREU+Lmh0YWNjZXNzPC9DT0RFPiBmaWxlcyBvcgotPENPREU+Jmx0O0RpcmVjdG9yeSZndDs8L0NPREU+IHNlY3Rpb25zKSwgZm9yIHByaXZhdGUgZGF0YSBpdCBoYXMKLWJ1aWx0IGluIHRoZSBjb3Vyc2Ugb2Ygc2VydmljaW5nIHRoZSByZXF1ZXN0IChzbyBtb2R1bGVzJyBoYW5kbGVycyBmb3IKLW9uZSBwaGFzZSBjYW4gcGFzcyBgbm90ZXMnIHRvIHRoZWlyIGhhbmRsZXJzIGZvciBvdGhlciBwaGFzZXMpLiAgVGhlcmUKLWlzIGFub3RoZXIgc3VjaCBjb25maWd1cmF0aW9uIHZlY3RvciBpbiB0aGUgPENPREU+c2VydmVyX3JlYzwvQ09ERT4KLWRhdGEgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgdGhlIDxDT0RFPnJlcXVlc3RfcmVjPC9DT0RFPiwgd2hpY2gKLWNvbnRhaW5zIHBlciAodmlydHVhbCkgc2VydmVyIGNvbmZpZ3VyYXRpb24gZGF0YS48UD4KLQotSGVyZSBpcyBhbiBhYnJpZGdlZCBkZWNsYXJhdGlvbiwgZ2l2aW5nIHRoZSBmaWVsZHMgbW9zdCBjb21tb25seSB1c2VkOjxQPgotCi08UFJFPgotc3RydWN0IHJlcXVlc3RfcmVjIHsKLQotICBwb29sICpwb29sOwotICBjb25uX3JlYyAqY29ubmVjdGlvbjsKLSAgc2VydmVyX3JlYyAqc2VydmVyOwotCi0gIC8qIFdoYXQgb2JqZWN0IGlzIGJlaW5nIHJlcXVlc3RlZCAqLwotCi0gIGNoYXIgKnVyaTsKLSAgY2hhciAqZmlsZW5hbWU7Ci0gIGNoYXIgKnBhdGhfaW5mbzsKLSAgY2hhciAqYXJnczsgICAgICAgICAgIC8qIFFVRVJZX0FSR1MsIGlmIGFueSAqLwotICBzdHJ1Y3Qgc3RhdCBmaW5mbzsgICAgLyogU2V0IGJ5IHNlcnZlciBjb3JlOwotICAgICAgICAgICAgICAgICAgICAgICAgICogc3RfbW9kZSBzZXQgdG8gemVybyBpZiBubyBzdWNoIGZpbGUgKi8KLQotICBjaGFyICpjb250ZW50X3R5cGU7Ci0gIGNoYXIgKmNvbnRlbnRfZW5jb2Rpbmc7Ci0KLSAgLyogTUlNRSBoZWFkZXIgZW52aXJvbm1lbnRzLCBpbiBhbmQgb3V0LiAgQWxzbywgYW4gYXJyYXkgY29udGFpbmluZwotICAgKiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYmUgcGFzc2VkIHRvIHN1YnByb2Nlc3Nlcywgc28gcGVvcGxlIGNhbgotICAgKiB3cml0ZSBtb2R1bGVzIHRvIGFkZCB0byB0aGF0IGVudmlyb25tZW50LgotICAgKgotICAgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGhlYWRlcnNfb3V0IGFuZCBlcnJfaGVhZGVyc19vdXQgaXMgdGhhdAotICAgKiB0aGUgbGF0dGVyIGFyZSBwcmludGVkIGV2ZW4gb24gZXJyb3IsIGFuZCBwZXJzaXN0IGFjcm9zcyBpbnRlcm5hbAotICAgKiByZWRpcmVjdHMgKHNvIHRoZSBoZWFkZXJzIHByaW50ZWQgZm9yIEVycm9yRG9jdW1lbnQgaGFuZGxlcnMgd2lsbAotICAgKiBoYXZlIHRoZW0pLgotICAgKi8KLQotICB0YWJsZSAqaGVhZGVyc19pbjsKLSAgdGFibGUgKmhlYWRlcnNfb3V0OwotICB0YWJsZSAqZXJyX2hlYWRlcnNfb3V0OwotICB0YWJsZSAqc3VicHJvY2Vzc19lbnY7Ci0KLSAgLyogSW5mbyBhYm91dCB0aGUgcmVxdWVzdCBpdHNlbGYuLi4gKi8KLQotICBpbnQgaGVhZGVyX29ubHk7ICAgICAvKiBIRUFEIHJlcXVlc3QsIGFzIG9wcG9zZWQgdG8gR0VUICovCi0gIGNoYXIgKnByb3RvY29sOyAgICAgIC8qIFByb3RvY29sLCBhcyBnaXZlbiB0byB1cywgb3IgSFRUUC8wLjkgKi8KLSAgY2hhciAqbWV0aG9kOyAgICAgICAgLyogR0VULCBIRUFELCBQT1NULCA8RU0+ZXRjLjwvRU0+ICovCi0gIGludCBtZXRob2RfbnVtYmVyOyAgIC8qIE1fR0VULCBNX1BPU1QsIDxFTT5ldGMuPC9FTT4gKi8KLQotICAvKiBJbmZvIGZvciBsb2dnaW5nICovCi0KLSAgY2hhciAqdGhlX3JlcXVlc3Q7Ci0gIGludCBieXRlc19zZW50OwotCi0gIC8qIEEgZmxhZyB3aGljaCBtb2R1bGVzIGNhbiBzZXQsIHRvIGluZGljYXRlIHRoYXQgdGhlIGRhdGEgYmVpbmcKLSAgICogcmV0dXJuZWQgaXMgdm9sYXRpbGUsIGFuZCBjbGllbnRzIHNob3VsZCBiZSB0b2xkIG5vdCB0byBjYWNoZSBpdC4KLSAgICovCi0KLSAgaW50IG5vX2NhY2hlOwotCi0gIC8qIFZhcmlvdXMgb3RoZXIgY29uZmlnIGluZm8gd2hpY2ggbWF5IGNoYW5nZSB3aXRoIC5odGFjY2VzcyBmaWxlcwotICAgKiBUaGVzZSBhcmUgY29uZmlnIHZlY3RvcnMsIHdpdGggb25lIHZvaWQqIHBvaW50ZXIgZm9yIGVhY2ggbW9kdWxlCi0gICAqICh0aGUgdGhpbmcgcG9pbnRlZCB0byBiZWluZyB0aGUgbW9kdWxlJ3MgYnVzaW5lc3MpLgotICAgKi8KLQotICB2b2lkICpwZXJfZGlyX2NvbmZpZzsgICAvKiBPcHRpb25zIHNldCBpbiBjb25maWcgZmlsZXMsIDxFTT5ldGMuPC9FTT4gKi8KLSAgdm9pZCAqcmVxdWVzdF9jb25maWc7ICAgLyogTm90ZXMgb24gKnRoaXMqIHJlcXVlc3QgKi8KLQotfTsKLQotPC9QUkU+Ci0KLTxIMz48QSBOQU1FPSJyZXFfb3JpZyI+V2hlcmUgcmVxdWVzdF9yZWMgc3RydWN0dXJlcyBjb21lIGZyb208L0E+PC9IMz4KLQotTW9zdCA8Q09ERT5yZXF1ZXN0X3JlYzwvQ09ERT4gc3RydWN0dXJlcyBhcmUgYnVpbHQgYnkgcmVhZGluZyBhbiBIVFRQCi1yZXF1ZXN0IGZyb20gYSBjbGllbnQsIGFuZCBmaWxsaW5nIGluIHRoZSBmaWVsZHMuICBIb3dldmVyLCB0aGVyZSBhcmUKLWEgZmV3IGV4Y2VwdGlvbnM6Ci0KLTxVTD4KLSAgPExJPiBJZiB0aGUgcmVxdWVzdCBpcyB0byBhbiBpbWFnZW1hcCwgYSB0eXBlIG1hcCAoPEVNPmkuZS48L0VNPiwgYQotICAgICAgIDxDT0RFPioudmFyPC9DT0RFPiBmaWxlKSwgb3IgYSBDR0kgc2NyaXB0IHdoaWNoIHJldHVybmVkIGEKLSAgICAgICBsb2NhbCBgTG9jYXRpb246JywgdGhlbiB0aGUgcmVzb3VyY2Ugd2hpY2ggdGhlIHVzZXIgcmVxdWVzdGVkCi0gICAgICAgaXMgZ29pbmcgdG8gYmUgdWx0aW1hdGVseSBsb2NhdGVkIGJ5IHNvbWUgVVJJIG90aGVyIHRoYW4gd2hhdAotICAgICAgIHRoZSBjbGllbnQgb3JpZ2luYWxseSBzdXBwbGllZC4gIEluIHRoaXMgY2FzZSwgdGhlIHNlcnZlciBkb2VzCi0gICAgICAgYW4gPEVNPmludGVybmFsIHJlZGlyZWN0PC9FTT4sIGNvbnN0cnVjdGluZyBhIG5ldwotICAgICAgIDxDT0RFPnJlcXVlc3RfcmVjPC9DT0RFPiBmb3IgdGhlIG5ldyBVUkksIGFuZCBwcm9jZXNzaW5nIGl0Ci0gICAgICAgYWxtb3N0IGV4YWN0bHkgYXMgaWYgdGhlIGNsaWVudCBoYWQgcmVxdWVzdGVkIHRoZSBuZXcgVVJJCi0gICAgICAgZGlyZWN0bHkuIDxQPgotCi0gIDxMST4gSWYgc29tZSBoYW5kbGVyIHNpZ25hbGVkIGFuIGVycm9yLCBhbmQgYW4KLSAgICAgICA8Q09ERT5FcnJvckRvY3VtZW50PC9DT0RFPiBpcyBpbiBzY29wZSwgdGhlIHNhbWUgaW50ZXJuYWwKLSAgICAgICByZWRpcmVjdCBtYWNoaW5lcnkgY29tZXMgaW50byBwbGF5LjxQPgotCi0gIDxMST4gRmluYWxseSwgYSBoYW5kbGVyIG9jY2FzaW9uYWxseSBuZWVkcyB0byBpbnZlc3RpZ2F0ZSBgd2hhdAotICAgICAgIHdvdWxkIGhhcHBlbiBpZicgc29tZSBvdGhlciByZXF1ZXN0IHdlcmUgcnVuLiAgRm9yIGluc3RhbmNlLAotICAgICAgIHRoZSBkaXJlY3RvcnkgaW5kZXhpbmcgbW9kdWxlIG5lZWRzIHRvIGtub3cgd2hhdCBNSU1FIHR5cGUKLSAgICAgICB3b3VsZCBiZSBhc3NpZ25lZCB0byBhIHJlcXVlc3QgZm9yIGVhY2ggZGlyZWN0b3J5IGVudHJ5LCBpbgotICAgICAgIG9yZGVyIHRvIGZpZ3VyZSBvdXQgd2hhdCBpY29uIHRvIHVzZS48UD4KLQotICAgICAgIFN1Y2ggaGFuZGxlcnMgY2FuIGNvbnN0cnVjdCBhIDxFTT5zdWItcmVxdWVzdDwvRU0+LCB1c2luZyB0aGUKLSAgICAgICBmdW5jdGlvbnMgPENPREU+YXBfc3ViX3JlcV9sb29rdXBfZmlsZTwvQ09ERT4sCi0gICAgICAgPENPREU+YXBfc3ViX3JlcV9sb29rdXBfdXJpPC9DT0RFPiwgYW5kCi0gICAgICAgPENPREU+YXBfc3ViX3JlcV9tZXRob2RfdXJpPC9DT0RFPjsgdGhlc2UgY29uc3RydWN0IGEgbmV3Ci0gICAgICAgPENPREU+cmVxdWVzdF9yZWM8L0NPREU+IHN0cnVjdHVyZSBhbmQgcHJvY2Vzc2VzIGl0IGFzIHlvdQotICAgICAgIHdvdWxkIGV4cGVjdCwgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgdGhlIHBvaW50IG9mIGFjdHVhbGx5Ci0gICAgICAgc2VuZGluZyBhIHJlc3BvbnNlLiAgKFRoZXNlIGZ1bmN0aW9ucyBza2lwIG92ZXIgdGhlIGFjY2VzcwotICAgICAgIGNoZWNrcyBpZiB0aGUgc3ViLXJlcXVlc3QgaXMgZm9yIGEgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkKLSAgICAgICBhcyB0aGUgb3JpZ2luYWwgcmVxdWVzdCkuPFA+Ci0KLSAgICAgICAoU2VydmVyLXNpZGUgaW5jbHVkZXMgd29yayBieSBidWlsZGluZyBzdWItcmVxdWVzdHMgYW5kIHRoZW4KLSAgICAgICBhY3R1YWxseSBpbnZva2luZyB0aGUgcmVzcG9uc2UgaGFuZGxlciBmb3IgdGhlbSwgdmlhIHRoZQotICAgICAgIGZ1bmN0aW9uIDxDT0RFPmFwX3J1bl9zdWJfcmVxPC9DT0RFPikuCi08L1VMPgotCi08SDM+PEEgTkFNRT0icmVxX3JldHVybiI+SGFuZGxpbmcgcmVxdWVzdHMsIGRlY2xpbmluZywgYW5kIHJldHVybmluZyBlcnJvcgotIGNvZGVzPC9BPjwvSDM+Ci0KLUFzIGRpc2N1c3NlZCBhYm92ZSwgZWFjaCBoYW5kbGVyLCB3aGVuIGludm9rZWQgdG8gaGFuZGxlIGEgcGFydGljdWxhcgotPENPREU+cmVxdWVzdF9yZWM8L0NPREU+LCBoYXMgdG8gcmV0dXJuIGFuIDxDT0RFPmludDwvQ09ERT4gdG8KLWluZGljYXRlIHdoYXQgaGFwcGVuZWQuICBUaGF0IGNhbiBlaXRoZXIgYmUKLQotPFVMPgotICA8TEk+IE9LIC0tLSB0aGUgcmVxdWVzdCB3YXMgaGFuZGxlZCBzdWNjZXNzZnVsbHkuICBUaGlzIG1heSBvciBtYXkKLSAgICAgICBub3QgdGVybWluYXRlIHRoZSBwaGFzZS4KLSAgPExJPiBERUNMSU5FRCAtLS0gbm8gZXJyb25lb3VzIGNvbmRpdGlvbiBleGlzdHMsIGJ1dCB0aGUgbW9kdWxlCi0gICAgICAgZGVjbGluZXMgdG8gaGFuZGxlIHRoZSBwaGFzZTsgdGhlIHNlcnZlciB0cmllcyB0byBmaW5kIGFub3RoZXIuCi0gIDxMST4gYW4gSFRUUCBlcnJvciBjb2RlLCB3aGljaCBhYm9ydHMgaGFuZGxpbmcgb2YgdGhlIHJlcXVlc3QuCi08L1VMPgotCi1Ob3RlIHRoYXQgaWYgdGhlIGVycm9yIGNvZGUgcmV0dXJuZWQgaXMgPENPREU+UkVESVJFQ1Q8L0NPREU+LCB0aGVuCi10aGUgbW9kdWxlIHNob3VsZCBwdXQgYSA8Q09ERT5Mb2NhdGlvbjwvQ09ERT4gaW4gdGhlIHJlcXVlc3QncwotPENPREU+aGVhZGVyc19vdXQ8L0NPREU+LCB0byBpbmRpY2F0ZSB3aGVyZSB0aGUgY2xpZW50IHNob3VsZCBiZQotcmVkaXJlY3RlZCA8RU0+dG88L0VNPi4gPFA+Ci0KLTxIMz48QSBOQU1FPSJyZXNwX2hhbmRsZXJzIj5TcGVjaWFsIGNvbnNpZGVyYXRpb25zIGZvciByZXNwb25zZQotIGhhbmRsZXJzPC9BPjwvSDM+Ci0KLUhhbmRsZXJzIGZvciBtb3N0IHBoYXNlcyBkbyB0aGVpciB3b3JrIGJ5IHNpbXBseSBzZXR0aW5nIGEgZmV3IGZpZWxkcwotaW4gdGhlIDxDT0RFPnJlcXVlc3RfcmVjPC9DT0RFPiBzdHJ1Y3R1cmUgKG9yLCBpbiB0aGUgY2FzZSBvZiBhY2Nlc3MKLWNoZWNrZXJzLCBzaW1wbHkgYnkgcmV0dXJuaW5nIHRoZSBjb3JyZWN0IGVycm9yIGNvZGUpLiAgSG93ZXZlciwKLXJlc3BvbnNlIGhhbmRsZXJzIGhhdmUgdG8gYWN0dWFsbHkgc2VuZCBhIHJlcXVlc3QgYmFjayB0byB0aGUgY2xpZW50LiA8UD4KLQotVGhleSBzaG91bGQgYmVnaW4gYnkgc2VuZGluZyBhbiBIVFRQIHJlc3BvbnNlIGhlYWRlciwgdXNpbmcgdGhlCi1mdW5jdGlvbiA8Q09ERT5hcF9zZW5kX2h0dHBfaGVhZGVyPC9DT0RFPi4gIChZb3UgZG9uJ3QgaGF2ZSB0byBkbwotYW55dGhpbmcgc3BlY2lhbCB0byBza2lwIHNlbmRpbmcgdGhlIGhlYWRlciBmb3IgSFRUUC8wLjkgcmVxdWVzdHM7IHRoZQotZnVuY3Rpb24gZmlndXJlcyBvdXQgb24gaXRzIG93biB0aGF0IGl0IHNob3VsZG4ndCBkbyBhbnl0aGluZykuICBJZgotdGhlIHJlcXVlc3QgaXMgbWFya2VkIDxDT0RFPmhlYWRlcl9vbmx5PC9DT0RFPiwgdGhhdCdzIGFsbCB0aGV5IHNob3VsZAotZG87IHRoZXkgc2hvdWxkIHJldHVybiBhZnRlciB0aGF0LCB3aXRob3V0IGF0dGVtcHRpbmcgYW55IGZ1cnRoZXIKLW91dHB1dC4gIDxQPgotCi1PdGhlcndpc2UsIHRoZXkgc2hvdWxkIHByb2R1Y2UgYSByZXF1ZXN0IGJvZHkgd2hpY2ggcmVzcG9uZHMgdG8gdGhlCi1jbGllbnQgYXMgYXBwcm9wcmlhdGUuICBUaGUgcHJpbWl0aXZlcyBmb3IgdGhpcyBhcmUgPENPREU+YXBfcnB1dGM8L0NPREU+Ci1hbmQgPENPREU+YXBfcnByaW50ZjwvQ09ERT4sIGZvciBpbnRlcm5hbGx5IGdlbmVyYXRlZCBvdXRwdXQsIGFuZAotPENPREU+YXBfc2VuZF9mZDwvQ09ERT4sIHRvIGNvcHkgdGhlIGNvbnRlbnRzIG9mIHNvbWUgPENPREU+RklMRSAqPC9DT0RFPgotc3RyYWlnaHQgdG8gdGhlIGNsaWVudC4gIDxQPgotCi1BdCB0aGlzIHBvaW50LCB5b3Ugc2hvdWxkIG1vcmUgb3IgbGVzcyB1bmRlcnN0YW5kIHRoZSBmb2xsb3dpbmcgcGllY2UKLW9mIGNvZGUsIHdoaWNoIGlzIHRoZSBoYW5kbGVyIHdoaWNoIGhhbmRsZXMgPENPREU+R0VUPC9DT0RFPiByZXF1ZXN0cwotd2hpY2ggaGF2ZSBubyBtb3JlIHNwZWNpZmljIGhhbmRsZXI7IGl0IGFsc28gc2hvd3MgaG93IGNvbmRpdGlvbmFsCi08Q09ERT5HRVQ8L0NPREU+cyBjYW4gYmUgaGFuZGxlZCwgaWYgaXQncyBkZXNpcmFibGUgdG8gZG8gc28gaW4gYQotcGFydGljdWxhciByZXNwb25zZSBoYW5kbGVyIC0tLSA8Q09ERT5hcF9zZXRfbGFzdF9tb2RpZmllZDwvQ09ERT4gY2hlY2tzCi1hZ2FpbnN0IHRoZSA8Q09ERT5JZi1tb2RpZmllZC1zaW5jZTwvQ09ERT4gdmFsdWUgc3VwcGxpZWQgYnkgdGhlCi1jbGllbnQsIGlmIGFueSwgYW5kIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgY29kZSAod2hpY2ggd2lsbCwgaWYKLW5vbnplcm8sIGJlIFVTRV9MT0NBTF9DT1BZKS4gICBObyBzaW1pbGFyIGNvbnNpZGVyYXRpb25zIGFwcGx5IGZvcgotPENPREU+YXBfc2V0X2NvbnRlbnRfbGVuZ3RoPC9DT0RFPiwgYnV0IGl0IHJldHVybnMgYW4gZXJyb3IgY29kZSBmb3IKLXN5bW1ldHJ5LjxQPgotCi08UFJFPgotaW50IGRlZmF1bHRfaGFuZGxlciAocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IGVycnN0YXR1czsKLSAgICBGSUxFICpmOwotCi0gICAgaWYgKHItJmd0O21ldGhvZF9udW1iZXIgIT0gTV9HRVQpIHJldHVybiBERUNMSU5FRDsKLSAgICBpZiAoci0mZ3Q7ZmluZm8uc3RfbW9kZSA9PSAwKSByZXR1cm4gTk9UX0ZPVU5EOwotCi0gICAgaWYgKChlcnJzdGF0dXMgPSBhcF9zZXRfY29udGVudF9sZW5ndGggKHIsIHItJmd0O2ZpbmZvLnN0X3NpemUpKQotCXx8IChlcnJzdGF0dXMgPSBhcF9zZXRfbGFzdF9tb2RpZmllZCAociwgci0mZ3Q7ZmluZm8uc3RfbXRpbWUpKSkKLSAgICAgICAgcmV0dXJuIGVycnN0YXR1czsKLQotICAgIGYgPSBmb3BlbiAoci0mZ3Q7ZmlsZW5hbWUsICJyIik7Ci0KLSAgICBpZiAoZiA9PSBOVUxMKSB7Ci0gICAgICAgIGxvZ19yZWFzb24oImZpbGUgcGVybWlzc2lvbnMgZGVueSBzZXJ2ZXIgYWNjZXNzIiwKLSAgICAgICAgICAgICAgICAgICByLSZndDtmaWxlbmFtZSwgcik7Ci0gICAgICAgIHJldHVybiBGT1JCSURERU47Ci0gICAgfQotCi0gICAgcmVnaXN0ZXJfdGltZW91dCAoInNlbmQiLCByKTsKLSAgICBhcF9zZW5kX2h0dHBfaGVhZGVyIChyKTsKLQotICAgIGlmICghci0mZ3Q7aGVhZGVyX29ubHkpIHNlbmRfZmQgKGYsIHIpOwotICAgIGFwX3BmY2xvc2UgKHItJmd0O3Bvb2wsIGYpOwotICAgIHJldHVybiBPSzsKLX0KLTwvUFJFPgotCi1GaW5hbGx5LCBpZiBhbGwgb2YgdGhpcyBpcyB0b28gbXVjaCBvZiBhIGNoYWxsZW5nZSwgdGhlcmUgYXJlIGEgZmV3Ci13YXlzIG91dCBvZiBpdC4gIEZpcnN0IG9mZiwgYXMgc2hvd24gYWJvdmUsIGEgcmVzcG9uc2UgaGFuZGxlciB3aGljaAotaGFzIG5vdCB5ZXQgcHJvZHVjZWQgYW55IG91dHB1dCBjYW4gc2ltcGx5IHJldHVybiBhbiBlcnJvciBjb2RlLCBpbgotd2hpY2ggY2FzZSB0aGUgc2VydmVyIHdpbGwgYXV0b21hdGljYWxseSBwcm9kdWNlIGFuIGVycm9yIHJlc3BvbnNlLgotU2Vjb25kbHksIGl0IGNhbiBwdW50IHRvIHNvbWUgb3RoZXIgaGFuZGxlciBieSBpbnZva2luZwotPENPREU+YXBfaW50ZXJuYWxfcmVkaXJlY3Q8L0NPREU+LCB3aGljaCBpcyBob3cgdGhlIGludGVybmFsIHJlZGlyZWN0aW9uCi1tYWNoaW5lcnkgZGlzY3Vzc2VkIGFib3ZlIGlzIGludm9rZWQuICBBIHJlc3BvbnNlIGhhbmRsZXIgd2hpY2ggaGFzCi1pbnRlcm5hbGx5IHJlZGlyZWN0ZWQgc2hvdWxkIGFsd2F5cyByZXR1cm4gPENPREU+T0s8L0NPREU+LiA8UD4KLQotKEludm9raW5nIDxDT0RFPmFwX2ludGVybmFsX3JlZGlyZWN0PC9DT0RFPiBmcm9tIGhhbmRsZXJzIHdoaWNoIGFyZQotPEVNPm5vdDwvRU0+IHJlc3BvbnNlIGhhbmRsZXJzIHdpbGwgbGVhZCB0byBzZXJpb3VzIGNvbmZ1c2lvbikuCi0KLTxIMz48QSBOQU1FPSJhdXRoX2hhbmRsZXJzIj5TcGVjaWFsIGNvbnNpZGVyYXRpb25zIGZvciBhdXRoZW50aWNhdGlvbgotIGhhbmRsZXJzPC9BPjwvSDM+Ci0KLVN0dWZmIHRoYXQgc2hvdWxkIGJlIGRpc2N1c3NlZCBoZXJlIGluIGRldGFpbDoKLQotPFVMPgotICA8TEk+IEF1dGhlbnRpY2F0aW9uLXBoYXNlIGhhbmRsZXJzIG5vdCBpbnZva2VkIHVubGVzcyBhdXRoIGlzCi0gICAgICAgY29uZmlndXJlZCBmb3IgdGhlIGRpcmVjdG9yeS4KLSAgPExJPiBDb21tb24gYXV0aCBjb25maWd1cmF0aW9uIHN0b3JlZCBpbiB0aGUgY29yZSBwZXItZGlyCi0gICAgICAgY29uZmlndXJhdGlvbjsgaXQgaGFzIGFjY2Vzc29ycyA8Q09ERT5hcF9hdXRoX3R5cGU8L0NPREU+LAotICAgICAgIDxDT0RFPmFwX2F1dGhfbmFtZTwvQ09ERT4sIGFuZCA8Q09ERT5hcF9yZXF1aXJlczwvQ09ERT4uCi0gIDxMST4gQ29tbW9uIHJvdXRpbmVzLCB0byBoYW5kbGUgdGhlIHByb3RvY29sIGVuZCBvZiB0aGluZ3MsIGF0IGxlYXN0Ci0gICAgICAgZm9yIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb24gKDxDT0RFPmFwX2dldF9iYXNpY19hdXRoX3B3PC9DT0RFPiwKLSAgICAgICB3aGljaCBzZXRzIHRoZSA8Q09ERT5jb25uZWN0aW9uLSZndDt1c2VyPC9DT0RFPiBzdHJ1Y3R1cmUgZmllbGQKLSAgICAgICBhdXRvbWF0aWNhbGx5LCBhbmQgPENPREU+YXBfbm90ZV9iYXNpY19hdXRoX2ZhaWx1cmU8L0NPREU+LCB3aGljaAotICAgICAgIGFycmFuZ2VzIGZvciB0aGUgcHJvcGVyIDxDT0RFPldXVy1BdXRoZW50aWNhdGU6PC9DT0RFPiBoZWFkZXIKLSAgICAgICB0byBiZSBzZW50IGJhY2spLgotPC9VTD4KLQotPEgzPjxBIE5BTUU9ImxvZ19oYW5kbGVycyI+U3BlY2lhbCBjb25zaWRlcmF0aW9ucyBmb3IgbG9nZ2luZyBoYW5kbGVyczwvQT48L0gzPgotCi1XaGVuIGEgcmVxdWVzdCBoYXMgaW50ZXJuYWxseSByZWRpcmVjdGVkLCB0aGVyZSBpcyB0aGUgcXVlc3Rpb24gb2YKLXdoYXQgdG8gbG9nLiAgQXBhY2hlIGhhbmRsZXMgdGhpcyBieSBidW5kbGluZyB0aGUgZW50aXJlIGNoYWluIG9mCi1yZWRpcmVjdHMgaW50byBhIGxpc3Qgb2YgPENPREU+cmVxdWVzdF9yZWM8L0NPREU+IHN0cnVjdHVyZXMgd2hpY2ggYXJlCi10aHJlYWRlZCB0aHJvdWdoIHRoZSA8Q09ERT5yLSZndDtwcmV2PC9DT0RFPiBhbmQgPENPREU+ci0mZ3Q7bmV4dDwvQ09ERT4KLXBvaW50ZXJzLiAgVGhlIDxDT0RFPnJlcXVlc3RfcmVjPC9DT0RFPiB3aGljaCBpcyBwYXNzZWQgdG8gdGhlIGxvZ2dpbmcKLWhhbmRsZXJzIGluIHN1Y2ggY2FzZXMgaXMgdGhlIG9uZSB3aGljaCB3YXMgb3JpZ2luYWxseSBidWlsdCBmb3IgdGhlCi1pbml0aWFsIHJlcXVlc3QgZnJvbSB0aGUgY2xpZW50OyBub3RlIHRoYXQgdGhlIGJ5dGVzX3NlbnQgZmllbGQgd2lsbAotb25seSBiZSBjb3JyZWN0IGluIHRoZSBsYXN0IHJlcXVlc3QgaW4gdGhlIGNoYWluICh0aGUgb25lIGZvciB3aGljaCBhCi1yZXNwb25zZSB3YXMgYWN0dWFsbHkgc2VudCkuCi0KLTxIMj48QSBOQU1FPSJwb29scyI+UmVzb3VyY2UgYWxsb2NhdGlvbiBhbmQgcmVzb3VyY2UgcG9vbHM8L0E+PC9IMj4KLTxQPgotT25lIG9mIHRoZSBwcm9ibGVtcyBvZiB3cml0aW5nIGFuZCBkZXNpZ25pbmcgYSBzZXJ2ZXItcG9vbCBzZXJ2ZXIgaXMKLXRoYXQgb2YgcHJldmVudGluZyBsZWFrYWdlLCB0aGF0IGlzLCBhbGxvY2F0aW5nIHJlc291cmNlcyAobWVtb3J5LAotb3BlbiBmaWxlcywgPEVNPmV0Yy48L0VNPiksIHdpdGhvdXQgc3Vic2VxdWVudGx5IHJlbGVhc2luZyB0aGVtLiAgVGhlIHJlc291cmNlCi1wb29sIG1hY2hpbmVyeSBpcyBkZXNpZ25lZCB0byBtYWtlIGl0IGVhc3kgdG8gcHJldmVudCB0aGlzIGZyb20KLWhhcHBlbmluZywgYnkgYWxsb3dpbmcgcmVzb3VyY2UgdG8gYmUgYWxsb2NhdGVkIGluIHN1Y2ggYSB3YXkgdGhhdAotdGhleSBhcmUgPEVNPmF1dG9tYXRpY2FsbHk8L0VNPiByZWxlYXNlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgZG9uZSB3aXRoCi10aGVtLgotPC9QPgotPFA+Ci1UaGUgd2F5IHRoaXMgd29ya3MgaXMgYXMgZm9sbG93czogIHRoZSBtZW1vcnkgd2hpY2ggaXMgYWxsb2NhdGVkLCBmaWxlCi1vcGVuZWQsIDxFTT5ldGMuPC9FTT4sIHRvIGRlYWwgd2l0aCBhIHBhcnRpY3VsYXIgcmVxdWVzdCBhcmUgdGllZCB0byBhCi08RU0+cmVzb3VyY2UgcG9vbDwvRU0+IHdoaWNoIGlzIGFsbG9jYXRlZCBmb3IgdGhlIHJlcXVlc3QuICBUaGUgcG9vbAotaXMgYSBkYXRhIHN0cnVjdHVyZSB3aGljaCBpdHNlbGYgdHJhY2tzIHRoZSByZXNvdXJjZXMgaW4gcXVlc3Rpb24uCi08L1A+Ci08UD4KLVdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLCB0aGUgcG9vbCBpcyA8RU0+Y2xlYXJlZDwvRU0+LiAgQXQKLXRoYXQgcG9pbnQsIGFsbCB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBpdCBpcyByZWxlYXNlZCBmb3IgcmV1c2UsCi1hbGwgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGl0IGFyZSBjbG9zZWQsIGFuZCBhbnkgb3RoZXIgY2xlYW4tdXAKLWZ1bmN0aW9ucyB3aGljaCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb29sIGFyZSBydW4uICBXaGVuIHRoaXMgaXMKLW92ZXIsIHdlIGNhbiBiZSBjb25maWRlbnQgdGhhdCBhbGwgdGhlIHJlc291cmNlIHRpZWQgdG8gdGhlIHBvb2wgaGF2ZQotYmVlbiByZWxlYXNlZCwgYW5kIHRoYXQgbm9uZSBvZiB0aGVtIGhhdmUgbGVha2VkLgotPC9QPgotPFA+Ci1TZXJ2ZXIgcmVzdGFydHMsIGFuZCBhbGxvY2F0aW9uIG9mIG1lbW9yeSBhbmQgcmVzb3VyY2VzIGZvciBwZXItc2VydmVyCi1jb25maWd1cmF0aW9uLCBhcmUgaGFuZGxlZCBpbiBhIHNpbWlsYXIgd2F5LiAgVGhlcmUgaXMgYQotPEVNPmNvbmZpZ3VyYXRpb24gcG9vbDwvRU0+LCB3aGljaCBrZWVwcyB0cmFjayBvZiByZXNvdXJjZXMgd2hpY2ggd2VyZQotYWxsb2NhdGVkIHdoaWxlIHJlYWRpbmcgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGVzLCBhbmQgaGFuZGxpbmcKLXRoZSBjb21tYW5kcyB0aGVyZWluIChmb3IgaW5zdGFuY2UsIHRoZSBtZW1vcnkgdGhhdCB3YXMgYWxsb2NhdGVkIGZvcgotcGVyLXNlcnZlciBtb2R1bGUgY29uZmlndXJhdGlvbiwgbG9nIGZpbGVzIGFuZCBvdGhlciBmaWxlcyB0aGF0IHdlcmUKLW9wZW5lZCwgYW5kIHNvIGZvcnRoKS4gIFdoZW4gdGhlIHNlcnZlciByZXN0YXJ0cywgYW5kIGhhcyB0byByZXJlYWQKLXRoZSBjb25maWd1cmF0aW9uIGZpbGVzLCB0aGUgY29uZmlndXJhdGlvbiBwb29sIGlzIGNsZWFyZWQsIGFuZCBzbyB0aGUKLW1lbW9yeSBhbmQgZmlsZSBkZXNjcmlwdG9ycyB3aGljaCB3ZXJlIHRha2VuIHVwIGJ5IHJlYWRpbmcgdGhlbSB0aGUKLWxhc3QgdGltZSBhcmUgbWFkZSBhdmFpbGFibGUgZm9yIHJldXNlLgotPC9QPgotPFA+Ci1JdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB1c2Ugb2YgdGhlIHBvb2wgbWFjaGluZXJ5IGlzbid0IGdlbmVyYWxseQotb2JsaWdhdG9yeSwgZXhjZXB0IGZvciBzaXR1YXRpb25zIGxpa2UgbG9nZ2luZyBoYW5kbGVycywgd2hlcmUgeW91Ci1yZWFsbHkgbmVlZCB0byByZWdpc3RlciBjbGVhbnVwcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbG9nIGZpbGUgZ2V0cwotY2xvc2VkIHdoZW4gdGhlIHNlcnZlciByZXN0YXJ0cyAodGhpcyBpcyBtb3N0IGVhc2lseSBkb25lIGJ5IHVzaW5nIHRoZQotZnVuY3Rpb24gPENPREU+PEEgSFJFRj0iI3Bvb2wtZmlsZXMiPmFwX3Bmb3BlbjwvQT48L0NPREU+LCB3aGljaCBhbHNvCi1hcnJhbmdlcyBmb3IgdGhlIHVuZGVybHlpbmcgZmlsZSBkZXNjcmlwdG9yIHRvIGJlIGNsb3NlZCBiZWZvcmUgYW55Ci1jaGlsZCBwcm9jZXNzZXMsIHN1Y2ggYXMgZm9yIENHSSBzY3JpcHRzLCBhcmUgPENPREU+ZXhlYzwvQ09ERT5lZCksIG9yCi1pbiBjYXNlIHlvdSBhcmUgdXNpbmcgdGhlIHRpbWVvdXQgbWFjaGluZXJ5ICh3aGljaCBpc24ndCB5ZXQgZXZlbgotZG9jdW1lbnRlZCBoZXJlKS4gIEhvd2V2ZXIsIHRoZXJlIGFyZSB0d28gYmVuZWZpdHMgdG8gdXNpbmcgaXQ6Ci1yZXNvdXJjZXMgYWxsb2NhdGVkIHRvIGEgcG9vbCBuZXZlciBsZWFrIChldmVuIGlmIHlvdSBhbGxvY2F0ZSBhCi1zY3JhdGNoIHN0cmluZywgYW5kIGp1c3QgZm9yZ2V0IGFib3V0IGl0KTsgYWxzbywgZm9yIG1lbW9yeQotYWxsb2NhdGlvbiwgPENPREU+YXBfcGFsbG9jPC9DT0RFPiBpcyBnZW5lcmFsbHkgZmFzdGVyIHRoYW4KLTxDT0RFPm1hbGxvYzwvQ09ERT4uCi08L1A+Ci08UD4KLVdlIGJlZ2luIGhlcmUgYnkgZGVzY3JpYmluZyBob3cgbWVtb3J5IGlzIGFsbG9jYXRlZCB0byBwb29scywgYW5kIHRoZW4KLWRpc2N1c3MgaG93IG90aGVyIHJlc291cmNlcyBhcmUgdHJhY2tlZCBieSB0aGUgcmVzb3VyY2UgcG9vbAotbWFjaGluZXJ5LgotPC9QPgotPEgzPkFsbG9jYXRpb24gb2YgbWVtb3J5IGluIHBvb2xzPC9IMz4KLTxQPgotTWVtb3J5IGlzIGFsbG9jYXRlZCB0byBwb29scyBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbgotPENPREU+YXBfcGFsbG9jPC9DT0RFPiwgd2hpY2ggdGFrZXMgdHdvIGFyZ3VtZW50cywgb25lIGJlaW5nIGEgcG9pbnRlciB0bwotYSByZXNvdXJjZSBwb29sIHN0cnVjdHVyZSwgYW5kIHRoZSBvdGhlciBiZWluZyB0aGUgYW1vdW50IG9mIG1lbW9yeSB0bwotYWxsb2NhdGUgKGluIDxDT0RFPmNoYXI8L0NPREU+cykuICBXaXRoaW4gaGFuZGxlcnMgZm9yIGhhbmRsaW5nCi1yZXF1ZXN0cywgdGhlIG1vc3QgY29tbW9uIHdheSBvZiBnZXR0aW5nIGEgcmVzb3VyY2UgcG9vbCBzdHJ1Y3R1cmUgaXMKLWJ5IGxvb2tpbmcgYXQgdGhlIDxDT0RFPnBvb2w8L0NPREU+IHNsb3Qgb2YgdGhlIHJlbGV2YW50Ci08Q09ERT5yZXF1ZXN0X3JlYzwvQ09ERT47IGhlbmNlIHRoZSByZXBlYXRlZCBhcHBlYXJhbmNlIG9mIHRoZQotZm9sbG93aW5nIGlkaW9tIGluIG1vZHVsZSBjb2RlOgotPC9QPgotPFBSRT4KLWludCBteV9oYW5kbGVyKHJlcXVlc3RfcmVjICpyKQotewotICAgIHN0cnVjdCBteV9zdHJ1Y3R1cmUgKmZvbzsKLSAgICAuLi4KLQotICAgIGZvbyA9IChmb28gKilhcF9wYWxsb2MgKHItJmd0O3Bvb2wsIHNpemVvZihteV9zdHJ1Y3R1cmUpKTsKLX0KLTwvUFJFPgotPFA+Ci1Ob3RlIHRoYXQgPEVNPnRoZXJlIGlzIG5vIDxDT0RFPmFwX3BmcmVlPC9DT0RFPjwvRU0+IC0tLQotPENPREU+YXBfcGFsbG9jPC9DT0RFPmVkIG1lbW9yeSBpcyBmcmVlZCBvbmx5IHdoZW4gdGhlIGFzc29jaWF0ZWQKLXJlc291cmNlIHBvb2wgaXMgY2xlYXJlZC4gIFRoaXMgbWVhbnMgdGhhdCA8Q09ERT5hcF9wYWxsb2M8L0NPREU+IGRvZXMgbm90Ci1oYXZlIHRvIGRvIGFzIG11Y2ggYWNjb3VudGluZyBhcyA8Q09ERT5tYWxsb2MoKTwvQ09ERT47IGFsbCBpdCBkb2VzIGluCi10aGUgdHlwaWNhbCBjYXNlIGlzIHRvIHJvdW5kIHVwIHRoZSBzaXplLCBidW1wIGEgcG9pbnRlciwgYW5kIGRvIGEKLXJhbmdlIGNoZWNrLgotPC9QPgotPFA+Ci0oSXQgYWxzbyByYWlzZXMgdGhlIHBvc3NpYmlsaXR5IHRoYXQgaGVhdnkgdXNlIG9mIDxDT0RFPmFwX3BhbGxvYzwvQ09ERT4KLWNvdWxkIGNhdXNlIGEgc2VydmVyIHByb2Nlc3MgdG8gZ3JvdyBleGNlc3NpdmVseSBsYXJnZS4gIFRoZXJlIGFyZQotdHdvIHdheXMgdG8gZGVhbCB3aXRoIHRoaXMsIHdoaWNoIGFyZSBkZWFsdCB3aXRoIGJlbG93OyBicmllZmx5LCB5b3UKLWNhbiB1c2UgPENPREU+bWFsbG9jPC9DT0RFPiwgYW5kIHRyeSB0byBiZSBzdXJlIHRoYXQgYWxsIG9mIHRoZSBtZW1vcnkKLWdldHMgZXhwbGljaXRseSA8Q09ERT5mcmVlPC9DT0RFPmQsIG9yIHlvdSBjYW4gYWxsb2NhdGUgYSBzdWItcG9vbCBvZgotdGhlIG1haW4gcG9vbCwgYWxsb2NhdGUgeW91ciBtZW1vcnkgaW4gdGhlIHN1Yi1wb29sLCBhbmQgY2xlYXIgaXQgb3V0Ci1wZXJpb2RpY2FsbHkuICBUaGUgbGF0dGVyIHRlY2huaXF1ZSBpcyBkaXNjdXNzZWQgaW4gdGhlIHNlY3Rpb24gb24KLXN1Yi1wb29scyBiZWxvdywgYW5kIGlzIHVzZWQgaW4gdGhlIGRpcmVjdG9yeS1pbmRleGluZyBjb2RlLCBpbiBvcmRlcgotdG8gYXZvaWQgZXhjZXNzaXZlIHN0b3JhZ2UgYWxsb2NhdGlvbiB3aGVuIGxpc3RpbmcgZGlyZWN0b3JpZXMgd2l0aAotdGhvdXNhbmRzIG9mIGZpbGVzKS4KLTwvUD4KLTxIMz5BbGxvY2F0aW5nIGluaXRpYWxpemVkIG1lbW9yeTwvSDM+Ci08UD4KLVRoZXJlIGFyZSBmdW5jdGlvbnMgd2hpY2ggYWxsb2NhdGUgaW5pdGlhbGl6ZWQgbWVtb3J5LCBhbmQgYXJlCi1mcmVxdWVudGx5IHVzZWZ1bC4gIFRoZSBmdW5jdGlvbiA8Q09ERT5hcF9wY2FsbG9jPC9DT0RFPiBoYXMgdGhlIHNhbWUKLWludGVyZmFjZSBhcyA8Q09ERT5hcF9wYWxsb2M8L0NPREU+LCBidXQgY2xlYXJzIG91dCB0aGUgbWVtb3J5IGl0Ci1hbGxvY2F0ZXMgYmVmb3JlIGl0IHJldHVybnMgaXQuICBUaGUgZnVuY3Rpb24gPENPREU+YXBfcHN0cmR1cDwvQ09ERT4KLXRha2VzIGEgcmVzb3VyY2UgcG9vbCBhbmQgYSA8Q09ERT5jaGFyICo8L0NPREU+IGFzIGFyZ3VtZW50cywgYW5kCi1hbGxvY2F0ZXMgbWVtb3J5IGZvciBhIGNvcHkgb2YgdGhlIHN0cmluZyB0aGUgcG9pbnRlciBwb2ludHMgdG8sCi1yZXR1cm5pbmcgYSBwb2ludGVyIHRvIHRoZSBjb3B5LiAgRmluYWxseSA8Q09ERT5hcF9wc3RyY2F0PC9DT0RFPiBpcyBhCi12YXJhcmdzLXN0eWxlIGZ1bmN0aW9uLCB3aGljaCB0YWtlcyBhIHBvaW50ZXIgdG8gYSByZXNvdXJjZSBwb29sLCBhbmQKLWF0IGxlYXN0IHR3byA8Q09ERT5jaGFyICo8L0NPREU+IGFyZ3VtZW50cywgdGhlIGxhc3Qgb2Ygd2hpY2ggbXVzdCBiZQotPENPREU+TlVMTDwvQ09ERT4uICBJdCBhbGxvY2F0ZXMgZW5vdWdoIG1lbW9yeSB0byBmaXQgY29waWVzIG9mIGVhY2gKLW9mIHRoZSBzdHJpbmdzLCBhcyBhIHVuaXQ7IGZvciBpbnN0YW5jZToKLTwvUD4KLTxQUkU+Ci0gICAgIGFwX3BzdHJjYXQgKHItJmd0O3Bvb2wsICJmb28iLCAiLyIsICJiYXIiLCBOVUxMKTsKLTwvUFJFPgotPFA+Ci1yZXR1cm5zIGEgcG9pbnRlciB0byA4IGJ5dGVzIHdvcnRoIG9mIG1lbW9yeSwgaW5pdGlhbGl6ZWQgdG8KLTxDT0RFPiJmb28vYmFyIjwvQ09ERT4uCi08L1A+Ci08SDM+PEEgTkFNRT0icG9vbHMtdXNlZCI+Q29tbW9ubHktdXNlZCBwb29scyBpbiB0aGUgQXBhY2hlIFdlYiBzZXJ2ZXI8L0E+PC9IMz4KLTxQPgotQSBwb29sIGlzIHJlYWxseSBkZWZpbmVkIGJ5IGl0cyBsaWZldGltZSBtb3JlIHRoYW4gYW55dGhpbmcgZWxzZS4gIFRoZXJlCi1hcmUgc29tZSBzdGF0aWMgcG9vbHMgaW4gaHR0cF9tYWluIHdoaWNoIGFyZSBwYXNzZWQgdG8gdmFyaW91cwotbm9uLWh0dHBfbWFpbiBmdW5jdGlvbnMgYXMgYXJndW1lbnRzIGF0IG9wcG9ydHVuZSB0aW1lcy4gIEhlcmUgdGhleSBhcmU6Ci08L1A+Ci08REwgQ09NUEFDVD4KLSA8RFQ+cGVybWFuZW50X3Bvb2wKLSA8L0RUPgotIDxERD4KLSAgPFVMPgotICAgPExJPm5ldmVyIHBhc3NlZCB0byBhbnl0aGluZyBlbHNlLCB0aGlzIGlzIHRoZSBhbmNlc3RvciBvZiBhbGwgcG9vbHMKLSAgIDwvTEk+Ci0gIDwvVUw+Ci0gPC9ERD4KLSA8RFQ+cGNvbmYKLSA8L0RUPgotIDxERD4KLSAgPFVMPgotICAgPExJPnN1YnBvb2wgb2YgcGVybWFuZW50X3Bvb2wKLSAgIDwvTEk+Ci0gICA8TEk+Y3JlYXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgY29uZmlnICJjeWNsZSI7IGV4aXN0cyB1bnRpbCB0aGUKLSAgICBzZXJ2ZXIgaXMgdGVybWluYXRlZCBvciByZXN0YXJ0czsgcGFzc2VkIHRvIGFsbCBjb25maWctdGltZQotICAgIHJvdXRpbmVzLCBlaXRoZXIgdmlhIGNtZC0mZ3Q7cG9vbCwgb3IgYXMgdGhlICJwb29sICpwIiBhcmd1bWVudCBvbgotICAgIHRob3NlIHdoaWNoIGRvbid0IHRha2UgcG9vbHMKLSAgIDwvTEk+Ci0gICA8TEk+cGFzc2VkIHRvIHRoZSBtb2R1bGUgaW5pdCgpIGZ1bmN0aW9ucwotICAgPC9MST4KLSAgPC9VTD4KLSA8L0REPgotIDxEVD5wdGVtcAotIDwvRFQ+Ci0gPEREPgotICA8VUw+Ci0gICA8TEk+c29ycnkgSSBsaWUsIHRoaXMgcG9vbCBpc24ndCBjYWxsZWQgdGhpcyBjdXJyZW50bHkgaW4gMS4zLCBJCi0gICAgcmVuYW1lZCBpdCB0aGlzIGluIG15IHB0aHJlYWRzIGRldmVsb3BtZW50LiAgSSdtIHJlZmVycmluZyB0bwotICAgIHRoZSB1c2Ugb2YgcHRyYW5zIGluIHRoZSBwYXJlbnQuLi4gY29udHJhc3QgdGhpcyB3aXRoIHRoZSBsYXRlcgotICAgIGRlZmluaXRpb24gb2YgcHRyYW5zIGluIHRoZSBjaGlsZC4KLSAgIDwvTEk+Ci0gICA8TEk+c3VicG9vbCBvZiBwZXJtYW5lbnRfcG9vbAotICAgPC9MST4KLSAgIDxMST5jcmVhdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBjb25maWcgImN5Y2xlIjsgZXhpc3RzIHVudGlsIHRoZQotICAgIGVuZCBvZiBjb25maWcgcGFyc2luZzsgcGFzc2VkIHRvIGNvbmZpZy10aW1lIHJvdXRpbmVzIDxFTT52aWE8L0VNPgotICAgIGNtZC0mZ3Q7dGVtcF9wb29sLiAgU29tZXdoYXQgb2YgYSAiYmFzdGFyZCBjaGlsZCIgYmVjYXVzZSBpdCBpc24ndAotICAgIGF2YWlsYWJsZSBldmVyeXdoZXJlLiAgVXNlZCBmb3IgdGVtcG9yYXJ5IHNjcmF0Y2ggc3BhY2Ugd2hpY2gKLSAgICBtYXkgYmUgbmVlZGVkIGJ5IHNvbWUgY29uZmlnIHJvdXRpbmVzIGJ1dCB3aGljaCBpcyBkZWxldGVkIGF0Ci0gICAgdGhlIGVuZCBvZiBjb25maWcuCi0gICA8L0xJPgotICA8L1VMPgotIDwvREQ+Ci0gPERUPnBjaGlsZAotIDwvRFQ+Ci0gPEREPgotICA8VUw+Ci0gICA8TEk+c3VicG9vbCBvZiBwZXJtYW5lbnRfcG9vbAotICAgPC9MST4KLSAgIDxMST5jcmVhdGVkIHdoZW4gYSBjaGlsZCBpcyBzcGF3bmVkIChvciBhIHRocmVhZCBpcyBjcmVhdGVkKTsgbGl2ZXMKLSAgICB1bnRpbCB0aGF0IGNoaWxkICh0aHJlYWQpIGlzIGRlc3Ryb3llZAotICAgPC9MST4KLSAgIDxMST5wYXNzZWQgdG8gdGhlIG1vZHVsZSBjaGlsZF9pbml0IGZ1bmN0aW9ucwotICAgPC9MST4KLSAgIDxMST5kZXN0cnVjdGlvbiBoYXBwZW5zIHJpZ2h0IGFmdGVyIHRoZSBjaGlsZF9leGl0IGZ1bmN0aW9ucyBhcmUKLSAgICBjYWxsZWQuLi4gKHdoaWNoIG1heSBleHBsYWluIHdoeSBJIHRoaW5rIGNoaWxkX2V4aXQgaXMgcmVkdW5kYW50Ci0gICAgYW5kIHVubmVlZGVkKQotICAgPC9MST4KLSAgPC9VTD4KLSA8L0REPgotIDxEVD5wdHJhbnMKLSA8RFQ+Ci0gPEREPgotICA8VUw+Ci0gICA8TEk+c2hvdWxkIGJlIGEgc3VicG9vbCBvZiBwY2hpbGQsIGJ1dCBjdXJyZW50bHkgaXMgYSBzdWJwb29sIG9mCi0gICAgcGVybWFuZW50X3Bvb2wsIHNlZSBhYm92ZQotICAgPC9MST4KLSAgIDxMST5jbGVhcmVkIGJ5IHRoZSBjaGlsZCBiZWZvcmUgZ29pbmcgaW50byB0aGUgYWNjZXB0KCkgbG9vcCB0byByZWNlaXZlCi0gICAgYSBjb25uZWN0aW9uCi0gICA8L0xJPgotICAgPExJPnVzZWQgYXMgY29ubmVjdGlvbi0mZ3Q7cG9vbAotICAgPC9MST4KLSAgPC9VTD4KLSA8L0REPgotIDxEVD5yLSZndDtwb29sCi0gPC9EVD4KLSA8REQ+Ci0gIDxVTD4KLSAgIDxMST5mb3IgdGhlIG1haW4gcmVxdWVzdCB0aGlzIGlzIGEgc3VicG9vbCBvZiBjb25uZWN0aW9uLSZndDtwb29sOyBmb3IKLSAgICBzdWJyZXF1ZXN0cyBpdCBpcyBhIHN1YnBvb2wgb2YgdGhlIHBhcmVudCByZXF1ZXN0J3MgcG9vbC4KLSAgIDwvTEk+Ci0gICA8TEk+ZXhpc3RzIHVudGlsIHRoZSBlbmQgb2YgdGhlIHJlcXVlc3QgKDxFTT5pLmUuPC9FTT4sCi0gICAgYXBfZGVzdHJveV9zdWJfcmVxLCBvcgotICAgIGluIGNoaWxkX21haW4gYWZ0ZXIgcHJvY2Vzc19yZXF1ZXN0IGhhcyBmaW5pc2hlZCkKLSAgIDwvTEk+Ci0gICA8TEk+bm90ZSB0aGF0IHIgaXRzZWxmIGlzIGFsbG9jYXRlZCBmcm9tIHItJmd0O3Bvb2w7IDxFTT5pLmUuPC9FTT4sCi0gICAgci0mZ3Q7cG9vbCBpcwotICAgIGZpcnN0IGNyZWF0ZWQgYW5kIHRoZW4gciBpcyB0aGUgZmlyc3QgdGhpbmcgcGFsbG9jKClkIGZyb20gaXQKLSAgIDwvTEk+Ci0gIDwvVUw+Ci0gPC9ERD4KLTwvREw+Ci08UD4KLUZvciBhbG1vc3QgZXZlcnl0aGluZyBmb2xrcyBkbywgci0mZ3Q7cG9vbCBpcyB0aGUgcG9vbCB0byB1c2UuICBCdXQgeW91Ci1jYW4gc2VlIGhvdyBvdGhlciBsaWZldGltZXMsIHN1Y2ggYXMgcGNoaWxkLCBhcmUgdXNlZnVsIHRvIHNvbWUKLW1vZHVsZXMuLi4gc3VjaCBhcyBtb2R1bGVzIHRoYXQgbmVlZCB0byBvcGVuIGEgZGF0YWJhc2UgY29ubmVjdGlvbiBvbmNlCi1wZXIgY2hpbGQsIGFuZCB3aXNoIHRvIGNsZWFuIGl0IHVwIHdoZW4gdGhlIGNoaWxkIGRpZXMuCi08L1A+Ci08UD4KLVlvdSBjYW4gYWxzbyBzZWUgaG93IHNvbWUgYnVncyBoYXZlIG1hbmlmZXN0ZWQgdGhlbXNlbGYsIHN1Y2ggYXMgc2V0dGluZwotY29ubmVjdGlvbi0mZ3Q7dXNlciB0byBhIHZhbHVlIGZyb20gci0mZ3Q7cG9vbCAtLSBpbiB0aGlzIGNhc2UKLWNvbm5lY3Rpb24gZXhpc3RzCi1mb3IgdGhlIGxpZmV0aW1lIG9mIHB0cmFucywgd2hpY2ggaXMgbG9uZ2VyIHRoYW4gci0mZ3Q7cG9vbCAoZXNwZWNpYWxseSBpZgotci0mZ3Q7cG9vbCBpcyBhIHN1YnJlcXVlc3QhKS4gIFNvIHRoZSBjb3JyZWN0IHRoaW5nIHRvIGRvIGlzIHRvIGFsbG9jYXRlCi1mcm9tIGNvbm5lY3Rpb24tJmd0O3Bvb2wuCi08L1A+Ci08UD4KLUFuZCB0aGVyZSB3YXMgYW5vdGhlciBpbnRlcmVzdGluZyBidWcgaW4gbW9kX2luY2x1ZGUvbW9kX2NnaS4gIFlvdSdsbCBzZWUKLWluIHRob3NlIHRoYXQgdGhleSBkbyB0aGlzIHRlc3QgdG8gZGVjaWRlIGlmIHRoZXkgc2hvdWxkIHVzZSByLSZndDtwb29sCi1vciByLSZndDttYWluLSZndDtwb29sLiAgSW4gdGhpcyBjYXNlIHRoZSByZXNvdXJjZSB0aGF0IHRoZXkgYXJlIHJlZ2lzdGVyaW5nCi1mb3IgY2xlYW51cCBpcyBhIGNoaWxkIHByb2Nlc3MuICBJZiBpdCB3ZXJlIHJlZ2lzdGVyZWQgaW4gci0mZ3Q7cG9vbCwKLXRoZW4gdGhlIGNvZGUgd291bGQgd2FpdCgpIGZvciB0aGUgY2hpbGQgd2hlbiB0aGUgc3VicmVxdWVzdCBmaW5pc2hlcy4KLVdpdGggbW9kX2luY2x1ZGUgdGhpcyBjb3VsZCBiZSBhbnkgb2xkICNpbmNsdWRlLCBhbmQgdGhlIGRlbGF5IGNhbiBiZSB1cAotdG8gMyBzZWNvbmRzLi4uIGFuZCBoYXBwZW5lZCBxdWl0ZSBmcmVxdWVudGx5LiAgSW5zdGVhZCB0aGUgc3VicHJvY2VzcwotaXMgcmVnaXN0ZXJlZCBpbiByLSZndDttYWluLSZndDtwb29sIHdoaWNoIGNhdXNlcyBpdCB0byBiZSBjbGVhbmVkIHVwIHdoZW4KLXRoZSBlbnRpcmUgcmVxdWVzdCBpcyBkb25lIC0tIDxFTT5pLmUuPC9FTT4sIGFmdGVyIHRoZSBvdXRwdXQgaGFzIGJlZW4gc2VudCB0bwotdGhlIGNsaWVudCBhbmQgbG9nZ2luZyBoYXMgaGFwcGVuZWQuCi08L1A+Ci08SDM+PEEgTkFNRT0icG9vbC1maWxlcyI+VHJhY2tpbmcgb3BlbiBmaWxlcywgZXRjLjwvQT48L0gzPgotPFA+Ci1BcyBpbmRpY2F0ZWQgYWJvdmUsIHJlc291cmNlIHBvb2xzIGFyZSBhbHNvIHVzZWQgdG8gdHJhY2sgb3RoZXIgc29ydHMKLW9mIHJlc291cmNlcyBiZXNpZGVzIG1lbW9yeS4gIFRoZSBtb3N0IGNvbW1vbiBhcmUgb3BlbiBmaWxlcy4gIFRoZQotcm91dGluZSB3aGljaCBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgdGhpcyBpcyA8Q09ERT5hcF9wZm9wZW48L0NPREU+LCB3aGljaAotdGFrZXMgYSByZXNvdXJjZSBwb29sIGFuZCB0d28gc3RyaW5ncyBhcyBhcmd1bWVudHM7IHRoZSBzdHJpbmdzIGFyZQotdGhlIHNhbWUgYXMgdGhlIHR5cGljYWwgYXJndW1lbnRzIHRvIDxDT0RFPmZvcGVuPC9DT0RFPiwgPEVNPmUuZy48L0VNPiwKLTwvUD4KLTxQUkU+Ci0gICAgIC4uLgotICAgICBGSUxFICpmID0gYXBfcGZvcGVuIChyLSZndDtwb29sLCByLSZndDtmaWxlbmFtZSwgInIiKTsKLQotICAgICBpZiAoZiA9PSBOVUxMKSB7IC4uLiB9IGVsc2UgeyAuLi4gfQotPC9QUkU+Ci08UD4KLVRoZXJlIGlzIGFsc28gYSA8Q09ERT5hcF9wb3BlbmY8L0NPREU+IHJvdXRpbmUsIHdoaWNoIHBhcmFsbGVscyB0aGUKLWxvd2VyLWxldmVsIDxDT0RFPm9wZW48L0NPREU+IHN5c3RlbSBjYWxsLiAgQm90aCBvZiB0aGVzZSByb3V0aW5lcwotYXJyYW5nZSBmb3IgdGhlIGZpbGUgdG8gYmUgY2xvc2VkIHdoZW4gdGhlIHJlc291cmNlIHBvb2wgaW4gcXVlc3Rpb24KLWlzIGNsZWFyZWQuCi08L1A+Ci08UD4KLVVubGlrZSB0aGUgY2FzZSBmb3IgbWVtb3J5LCB0aGVyZSA8RU0+YXJlPC9FTT4gZnVuY3Rpb25zIHRvIGNsb3NlCi1maWxlcyBhbGxvY2F0ZWQgd2l0aCA8Q09ERT5hcF9wZm9wZW48L0NPREU+LCBhbmQgPENPREU+YXBfcG9wZW5mPC9DT0RFPiwKLW5hbWVseSA8Q09ERT5hcF9wZmNsb3NlPC9DT0RFPiBhbmQgPENPREU+YXBfcGNsb3NlZjwvQ09ERT4uICAoVGhpcyBpcwotYmVjYXVzZSwgb24gbWFueSBzeXN0ZW1zLCB0aGUgbnVtYmVyIG9mIGZpbGVzIHdoaWNoIGEgc2luZ2xlIHByb2Nlc3MKLWNhbiBoYXZlIG9wZW4gaXMgcXVpdGUgbGltaXRlZCkuICBJdCBpcyBpbXBvcnRhbnQgdG8gdXNlIHRoZXNlCi1mdW5jdGlvbnMgdG8gY2xvc2UgZmlsZXMgYWxsb2NhdGVkIHdpdGggPENPREU+YXBfcGZvcGVuPC9DT0RFPiBhbmQKLTxDT0RFPmFwX3BvcGVuZjwvQ09ERT4sIHNpbmNlIHRvIGRvIG90aGVyd2lzZSBjb3VsZCBjYXVzZSBmYXRhbCBlcnJvcnMgb24KLXN5c3RlbXMgc3VjaCBhcyBMaW51eCwgd2hpY2ggcmVhY3QgYmFkbHkgaWYgdGhlIHNhbWUKLTxDT0RFPkZJTEUqPC9DT0RFPiBpcyBjbG9zZWQgbW9yZSB0aGFuIG9uY2UuCi08L1A+Ci08UD4KLShVc2luZyB0aGUgPENPREU+Y2xvc2U8L0NPREU+IGZ1bmN0aW9ucyBpcyBub3QgbWFuZGF0b3J5LCBzaW5jZSB0aGUKLWZpbGUgd2lsbCBldmVudHVhbGx5IGJlIGNsb3NlZCByZWdhcmRsZXNzLCBidXQgeW91IHNob3VsZCBjb25zaWRlciBpdAotaW4gY2FzZXMgd2hlcmUgeW91ciBtb2R1bGUgaXMgb3BlbmluZywgb3IgY291bGQgb3BlbiwgYSBsb3Qgb2YgZmlsZXMpLgotPC9QPgotPEgzPk90aGVyIHNvcnRzIG9mIHJlc291cmNlcyAtLS0gY2xlYW51cCBmdW5jdGlvbnM8L0gzPgotPEJMT0NLUVVPVEU+Ci1Nb3JlIHRleHQgZ29lcyBoZXJlLiAgRGVzY3JpYmUgdGhlIHRoZSBjbGVhbnVwIHByaW1pdGl2ZXMgaW4gdGVybXMgb2YKLXdoaWNoIHRoZSBmaWxlIHN0dWZmIGlzIGltcGxlbWVudGVkOyBhbHNvLCA8Q09ERT5zcGF3bl9wcm9jZXNzPC9DT0RFPi4KLTwvQkxPQ0tRVU9URT4KLTxQPgotUG9vbCBjbGVhbnVwcyBsaXZlIHVudGlsIGNsZWFyX3Bvb2woKSBpcyBjYWxsZWQ6ICBjbGVhcl9wb29sKGEpIHJlY3Vyc2l2ZWx5Ci1jYWxscyBkZXN0cm95X3Bvb2woKSBvbiBhbGwgc3VicG9vbHMgb2YgYTsgdGhlbiBjYWxscyBhbGwgdGhlIGNsZWFudXBzIGZvciBhOyAKLXRoZW4gcmVsZWFzZXMgYWxsIHRoZSBtZW1vcnkgZm9yIGEuICBkZXN0cm95X3Bvb2woYSkgY2FsbHMgY2xlYXJfcG9vbChhKSAKLWFuZCB0aGVuIHJlbGVhc2VzIHRoZSBwb29sIHN0cnVjdHVyZSBpdHNlbGYuICA8RU0+aS5lLjwvRU0+LCBjbGVhcl9wb29sKGEpIGRvZXNuJ3QKLWRlbGV0ZSBhLCBpdCBqdXN0IGZyZWVzIHVwIGFsbCB0aGUgcmVzb3VyY2VzIGFuZCB5b3UgY2FuIHN0YXJ0IHVzaW5nIGl0Ci1hZ2FpbiBpbW1lZGlhdGVseS4gCi08L1A+Ci08SDM+RmluZSBjb250cm9sIC0tLSBjcmVhdGluZyBhbmQgZGVhbGluZyB3aXRoIHN1Yi1wb29scywgd2l0aCBhIG5vdGUKLW9uIHN1Yi1yZXF1ZXN0czwvSDM+Ci0KLU9uIHJhcmUgb2NjYXNpb25zLCB0b28tZnJlZSB1c2Ugb2YgPENPREU+YXBfcGFsbG9jKCk8L0NPREU+IGFuZCB0aGUKLWFzc29jaWF0ZWQgcHJpbWl0aXZlcyBtYXkgcmVzdWx0IGluIHVuZGVzaXJhYmx5IHByb2ZsaWdhdGUgcmVzb3VyY2UKLWFsbG9jYXRpb24uICBZb3UgY2FuIGRlYWwgd2l0aCBzdWNoIGEgY2FzZSBieSBjcmVhdGluZyBhCi08RU0+c3ViLXBvb2w8L0VNPiwgYWxsb2NhdGluZyB3aXRoaW4gdGhlIHN1Yi1wb29sIHJhdGhlciB0aGFuIHRoZSBtYWluCi1wb29sLCBhbmQgY2xlYXJpbmcgb3IgZGVzdHJveWluZyB0aGUgc3ViLXBvb2wsIHdoaWNoIHJlbGVhc2VzIHRoZQotcmVzb3VyY2VzIHdoaWNoIHdlcmUgYXNzb2NpYXRlZCB3aXRoIGl0LiAgKFRoaXMgcmVhbGx5IDxFTT5pczwvRU0+IGEKLXJhcmUgc2l0dWF0aW9uOyB0aGUgb25seSBjYXNlIGluIHdoaWNoIGl0IGNvbWVzIHVwIGluIHRoZSBzdGFuZGFyZAotbW9kdWxlIHNldCBpcyBpbiBjYXNlIG9mIGxpc3RpbmcgZGlyZWN0b3JpZXMsIGFuZCB0aGVuIG9ubHkgd2l0aAotPEVNPnZlcnk8L0VNPiBsYXJnZSBkaXJlY3Rvcmllcy4gIFVubmVjZXNzYXJ5IHVzZSBvZiB0aGUgcHJpbWl0aXZlcwotZGlzY3Vzc2VkIGhlcmUgY2FuIGhhaXIgdXAgeW91ciBjb2RlIHF1aXRlIGEgYml0LCB3aXRoIHZlcnkgbGl0dGxlCi1nYWluKS4gPFA+Ci0KLVRoZSBwcmltaXRpdmUgZm9yIGNyZWF0aW5nIGEgc3ViLXBvb2wgaXMgPENPREU+YXBfbWFrZV9zdWJfcG9vbDwvQ09ERT4sCi13aGljaCB0YWtlcyBhbm90aGVyIHBvb2wgKHRoZSBwYXJlbnQgcG9vbCkgYXMgYW4gYXJndW1lbnQuICBXaGVuIHRoZQotbWFpbiBwb29sIGlzIGNsZWFyZWQsIHRoZSBzdWItcG9vbCB3aWxsIGJlIGRlc3Ryb3llZC4gIFRoZSBzdWItcG9vbAotbWF5IGFsc28gYmUgY2xlYXJlZCBvciBkZXN0cm95ZWQgYXQgYW55IHRpbWUsIGJ5IGNhbGxpbmcgdGhlIGZ1bmN0aW9ucwotPENPREU+YXBfY2xlYXJfcG9vbDwvQ09ERT4gYW5kIDxDT0RFPmFwX2Rlc3Ryb3lfcG9vbDwvQ09ERT4sIHJlc3BlY3RpdmVseS4KLShUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IDxDT0RFPmFwX2NsZWFyX3Bvb2w8L0NPREU+IGZyZWVzIHJlc291cmNlcwotYXNzb2NpYXRlZCB3aXRoIHRoZSBwb29sLCB3aGlsZSA8Q09ERT5hcF9kZXN0cm95X3Bvb2w8L0NPREU+IGFsc28KLWRlYWxsb2NhdGVzIHRoZSBwb29sIGl0c2VsZi4gIEluIHRoZSBmb3JtZXIgY2FzZSwgeW91IGNhbiBhbGxvY2F0ZSBuZXcKLXJlc291cmNlcyB3aXRoaW4gdGhlIHBvb2wsIGFuZCBjbGVhciBpdCBhZ2FpbiwgYW5kIHNvIGZvcnRoOyBpbiB0aGUKLWxhdHRlciBjYXNlLCBpdCBpcyBzaW1wbHkgZ29uZSkuIDxQPgotCi1PbmUgZmluYWwgbm90ZSAtLS0gc3ViLXJlcXVlc3RzIGhhdmUgdGhlaXIgb3duIHJlc291cmNlIHBvb2xzLCB3aGljaAotYXJlIHN1Yi1wb29scyBvZiB0aGUgcmVzb3VyY2UgcG9vbCBmb3IgdGhlIG1haW4gcmVxdWVzdC4gIFRoZSBwb2xpdGUKLXdheSB0byByZWNsYWltIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgc3ViIHJlcXVlc3Qgd2hpY2ggeW91Ci1oYXZlIGFsbG9jYXRlZCAodXNpbmcgdGhlIDxDT0RFPmFwX3N1Yl9yZXFfLi4uPC9DT0RFPiBmdW5jdGlvbnMpCi1pcyA8Q09ERT5hcF9kZXN0cm95X3N1Yl9yZXE8L0NPREU+LCB3aGljaCBmcmVlcyB0aGUgcmVzb3VyY2UgcG9vbC4KLUJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIGJlIHN1cmUgdG8gY29weSBhbnl0aGluZyB0aGF0IHlvdSBjYXJlCi1hYm91dCB3aGljaCBtaWdodCBiZSBhbGxvY2F0ZWQgaW4gdGhlIHN1Yi1yZXF1ZXN0J3MgcmVzb3VyY2UgcG9vbCBpbnRvCi1zb21lcGxhY2UgYSBsaXR0bGUgbGVzcyB2b2xhdGlsZSAoZm9yIGluc3RhbmNlLCB0aGUgZmlsZW5hbWUgaW4gaXRzCi08Q09ERT5yZXF1ZXN0X3JlYzwvQ09ERT4gc3RydWN0dXJlKS4gPFA+Ci0KLShBZ2FpbiwgdW5kZXIgbW9zdCBjaXJjdW1zdGFuY2VzLCB5b3Ugc2hvdWxkbid0IGZlZWwgb2JsaWdlZCB0byBjYWxsCi10aGlzIGZ1bmN0aW9uOyBvbmx5IDJLIG9mIG1lbW9yeSBvciBzbyBhcmUgYWxsb2NhdGVkIGZvciBhIHR5cGljYWwgc3ViCi1yZXF1ZXN0LCBhbmQgaXQgd2lsbCBiZSBmcmVlZCBhbnl3YXkgd2hlbiB0aGUgbWFpbiByZXF1ZXN0IHBvb2wgaXMKLWNsZWFyZWQuICBJdCBpcyBvbmx5IHdoZW4geW91IGFyZSBhbGxvY2F0aW5nIG1hbnksIG1hbnkgc3ViLXJlcXVlc3RzCi1mb3IgYSBzaW5nbGUgbWFpbiByZXF1ZXN0IHRoYXQgeW91IHNob3VsZCBzZXJpb3VzbHkgY29uc2lkZXIgdGhlCi08Q09ERT5hcF9kZXN0cm95Xy4uLjwvQ09ERT4gZnVuY3Rpb25zKS4KLQotPEgyPjxBIE5BTUU9ImNvbmZpZyI+Q29uZmlndXJhdGlvbiwgY29tbWFuZHMgYW5kIHRoZSBsaWtlPC9BPjwvSDI+Ci0KLU9uZSBvZiB0aGUgZGVzaWduIGdvYWxzIGZvciB0aGlzIHNlcnZlciB3YXMgdG8gbWFpbnRhaW4gZXh0ZXJuYWwKLWNvbXBhdGliaWxpdHkgd2l0aCB0aGUgTkNTQSAxLjMgc2VydmVyIC0tLSB0aGF0IGlzLCB0byByZWFkIHRoZSBzYW1lCi1jb25maWd1cmF0aW9uIGZpbGVzLCB0byBwcm9jZXNzIGFsbCB0aGUgZGlyZWN0aXZlcyB0aGVyZWluIGNvcnJlY3RseSwKLWFuZCBpbiBnZW5lcmFsIHRvIGJlIGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgTkNTQS4gIE9uIHRoZSBvdGhlcgotaGFuZCwgYW5vdGhlciBkZXNpZ24gZ29hbCB3YXMgdG8gbW92ZSBhcyBtdWNoIG9mIHRoZSBzZXJ2ZXIncwotZnVuY3Rpb25hbGl0eSBpbnRvIG1vZHVsZXMgd2hpY2ggaGF2ZSBhcyBsaXR0bGUgYXMgcG9zc2libGUgdG8gZG8gd2l0aAotdGhlIG1vbm9saXRoaWMgc2VydmVyIGNvcmUuICBUaGUgb25seSB3YXkgdG8gcmVjb25jaWxlIHRoZXNlIGdvYWxzIGlzCi10byBtb3ZlIHRoZSBoYW5kbGluZyBvZiBtb3N0IGNvbW1hbmRzIGZyb20gdGhlIGNlbnRyYWwgc2VydmVyIGludG8gdGhlCi1tb2R1bGVzLiAgPFA+Ci0KLUhvd2V2ZXIsIGp1c3QgZ2l2aW5nIHRoZSBtb2R1bGVzIGNvbW1hbmQgdGFibGVzIGlzIG5vdCBlbm91Z2ggdG8KLWRpdm9yY2UgdGhlbSBjb21wbGV0ZWx5IGZyb20gdGhlIHNlcnZlciBjb3JlLiAgVGhlIHNlcnZlciBoYXMgdG8KLXJlbWVtYmVyIHRoZSBjb21tYW5kcyBpbiBvcmRlciB0byBhY3Qgb24gdGhlbSBsYXRlci4gIFRoYXQgaW52b2x2ZXMKLW1haW50YWluaW5nIGRhdGEgd2hpY2ggaXMgcHJpdmF0ZSB0byB0aGUgbW9kdWxlcywgYW5kIHdoaWNoIGNhbiBiZQotZWl0aGVyIHBlci1zZXJ2ZXIsIG9yIHBlci1kaXJlY3RvcnkuICBNb3N0IHRoaW5ncyBhcmUgcGVyLWRpcmVjdG9yeSwKLWluY2x1ZGluZyBpbiBwYXJ0aWN1bGFyIGFjY2VzcyBjb250cm9sIGFuZCBhdXRob3JpemF0aW9uIGluZm9ybWF0aW9uLAotYnV0IGFsc28gaW5mb3JtYXRpb24gb24gaG93IHRvIGRldGVybWluZSBmaWxlIHR5cGVzIGZyb20gc3VmZml4ZXMsCi13aGljaCBjYW4gYmUgbW9kaWZpZWQgYnkgPENPREU+QWRkVHlwZTwvQ09ERT4gYW5kCi08Q09ERT5EZWZhdWx0VHlwZTwvQ09ERT4gZGlyZWN0aXZlcywgYW5kIHNvIGZvcnRoLiAgSW4gZ2VuZXJhbCwgdGhlCi1nb3Zlcm5pbmcgcGhpbG9zb3BoeSBpcyB0aGF0IGFueXRoaW5nIHdoaWNoIDxFTT5jYW48L0VNPiBiZSBtYWRlCi1jb25maWd1cmFibGUgYnkgZGlyZWN0b3J5IHNob3VsZCBiZTsgcGVyLXNlcnZlciBpbmZvcm1hdGlvbiBpcwotZ2VuZXJhbGx5IHVzZWQgaW4gdGhlIHN0YW5kYXJkIHNldCBvZiBtb2R1bGVzIGZvciBpbmZvcm1hdGlvbiBsaWtlCi08Q09ERT5BbGlhczwvQ09ERT5lcyBhbmQgPENPREU+UmVkaXJlY3Q8L0NPREU+cyB3aGljaCBjb21lIGludG8gcGxheQotYmVmb3JlIHRoZSByZXF1ZXN0IGlzIHRpZWQgdG8gYSBwYXJ0aWN1bGFyIHBsYWNlIGluIHRoZSB1bmRlcmx5aW5nCi1maWxlIHN5c3RlbS4gPFA+Ci0KLUFub3RoZXIgcmVxdWlyZW1lbnQgZm9yIGVtdWxhdGluZyB0aGUgTkNTQSBzZXJ2ZXIgaXMgYmVpbmcgYWJsZSB0bwotaGFuZGxlIHRoZSBwZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24gZmlsZXMsIGdlbmVyYWxseSBjYWxsZWQKLTxDT0RFPi5odGFjY2VzczwvQ09ERT4gZmlsZXMsIHRob3VnaCBldmVuIGluIHRoZSBOQ1NBIHNlcnZlciB0aGV5IGNhbgotY29udGFpbiBkaXJlY3RpdmVzIHdoaWNoIGhhdmUgbm90aGluZyBhdCBhbGwgdG8gZG8gd2l0aCBhY2Nlc3MKLWNvbnRyb2wuICBBY2NvcmRpbmdseSwgYWZ0ZXIgVVJJIC0mZ3Q7IGZpbGVuYW1lIHRyYW5zbGF0aW9uLCBidXQgYmVmb3JlCi1wZXJmb3JtaW5nIGFueSBvdGhlciBwaGFzZSwgdGhlIHNlcnZlciB3YWxrcyBkb3duIHRoZSBkaXJlY3RvcnkKLWhpZXJhcmNoeSBvZiB0aGUgdW5kZXJseWluZyBmaWxlc3lzdGVtLCBmb2xsb3dpbmcgdGhlIHRyYW5zbGF0ZWQKLXBhdGhuYW1lLCB0byByZWFkIGFueSA8Q09ERT4uaHRhY2Nlc3M8L0NPREU+IGZpbGVzIHdoaWNoIG1pZ2h0IGJlCi1wcmVzZW50LiAgVGhlIGluZm9ybWF0aW9uIHdoaWNoIGlzIHJlYWQgaW4gdGhlbiBoYXMgdG8gYmUKLTxFTT5tZXJnZWQ8L0VNPiB3aXRoIHRoZSBhcHBsaWNhYmxlIGluZm9ybWF0aW9uIGZyb20gdGhlIHNlcnZlcidzIG93bgotY29uZmlnIGZpbGVzIChlaXRoZXIgZnJvbSB0aGUgPENPREU+Jmx0O0RpcmVjdG9yeSZndDs8L0NPREU+IHNlY3Rpb25zCi1pbiA8Q09ERT5hY2Nlc3MuY29uZjwvQ09ERT4sIG9yIGZyb20gZGVmYXVsdHMgaW4KLTxDT0RFPnNybS5jb25mPC9DT0RFPiwgd2hpY2ggYWN0dWFsbHkgYmVoYXZlcyBmb3IgbW9zdCBwdXJwb3NlcyBhbG1vc3QKLWV4YWN0bHkgbGlrZSA8Q09ERT4mbHQ7RGlyZWN0b3J5IC8mZ3Q7PC9DT0RFPikuPFA+Ci0KLUZpbmFsbHksIGFmdGVyIGhhdmluZyBzZXJ2ZWQgYSByZXF1ZXN0IHdoaWNoIGludm9sdmVkIHJlYWRpbmcKLTxDT0RFPi5odGFjY2VzczwvQ09ERT4gZmlsZXMsIHdlIG5lZWQgdG8gZGlzY2FyZCB0aGUgc3RvcmFnZSBhbGxvY2F0ZWQKLWZvciBoYW5kbGluZyB0aGVtLiAgVGhhdCBpcyBzb2x2ZWQgdGhlIHNhbWUgd2F5IGl0IGlzIHNvbHZlZCB3aGVyZXZlcgotZWxzZSBzaW1pbGFyIHByb2JsZW1zIGNvbWUgdXAsIGJ5IHR5aW5nIHRob3NlIHN0cnVjdHVyZXMgdG8gdGhlCi1wZXItdHJhbnNhY3Rpb24gcmVzb3VyY2UgcG9vbC4gIDxQPgotCi08SDM+PEEgTkFNRT0icGVyLWRpciI+UGVyLWRpcmVjdG9yeSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZXM8L0E+PC9IMz4KLQotTGV0J3MgbG9vayBvdXQgaG93IGFsbCBvZiB0aGlzIHBsYXlzIG91dCBpbiA8Q09ERT5tb2RfbWltZS5jPC9DT0RFPiwKLXdoaWNoIGRlZmluZXMgdGhlIGZpbGUgdHlwaW5nIGhhbmRsZXIgd2hpY2ggZW11bGF0ZXMgdGhlIE5DU0Egc2VydmVyJ3MKLWJlaGF2aW9yIG9mIGRldGVybWluaW5nIGZpbGUgdHlwZXMgZnJvbSBzdWZmaXhlcy4gIFdoYXQgd2UnbGwgYmUKLWxvb2tpbmcgYXQsIGhlcmUsIGlzIHRoZSBjb2RlIHdoaWNoIGltcGxlbWVudHMgdGhlCi08Q09ERT5BZGRUeXBlPC9DT0RFPiBhbmQgPENPREU+QWRkRW5jb2Rpbmc8L0NPREU+IGNvbW1hbmRzLiAgVGhlc2UKLWNvbW1hbmRzIGNhbiBhcHBlYXIgaW4gPENPREU+Lmh0YWNjZXNzPC9DT0RFPiBmaWxlcywgc28gdGhleSBtdXN0IGJlCi1oYW5kbGVkIGluIHRoZSBtb2R1bGUncyBwcml2YXRlIHBlci1kaXJlY3RvcnkgZGF0YSwgd2hpY2ggaW4gZmFjdCwKLWNvbnNpc3RzIG9mIHR3byBzZXBhcmF0ZSA8Q09ERT50YWJsZTwvQ09ERT5zIGZvciBNSU1FIHR5cGVzIGFuZAotZW5jb2RpbmcgaW5mb3JtYXRpb24sIGFuZCBpcyBkZWNsYXJlZCBhcyBmb2xsb3dzOgotCi08UFJFPgotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHRhYmxlICpmb3JjZWRfdHlwZXM7ICAgICAgLyogQWRkaXRpb25hbCBBZGRUeXBlZCBzdHVmZiAqLwotICAgIHRhYmxlICplbmNvZGluZ190eXBlczsgICAgLyogQWRkZWQgd2l0aCBBZGRFbmNvZGluZy4uLiAqLwotfSBtaW1lX2Rpcl9jb25maWc7Ci08L1BSRT4KLQotV2hlbiB0aGUgc2VydmVyIGlzIHJlYWRpbmcgYSBjb25maWd1cmF0aW9uIGZpbGUsIG9yCi08Q09ERT4mbHQ7RGlyZWN0b3J5Jmd0OzwvQ09ERT4gc2VjdGlvbiwgd2hpY2ggaW5jbHVkZXMgb25lIG9mIHRoZSBNSU1FCi1tb2R1bGUncyBjb21tYW5kcywgaXQgbmVlZHMgdG8gY3JlYXRlIGEgPENPREU+bWltZV9kaXJfY29uZmlnPC9DT0RFPgotc3RydWN0dXJlLCBzbyB0aG9zZSBjb21tYW5kcyBoYXZlIHNvbWV0aGluZyB0byBhY3Qgb24uICBJdCBkb2VzIHRoaXMKLWJ5IGludm9raW5nIHRoZSBmdW5jdGlvbiBpdCBmaW5kcyBpbiB0aGUgbW9kdWxlJ3MgYGNyZWF0ZSBwZXItZGlyCi1jb25maWcgc2xvdCcsIHdpdGggdHdvIGFyZ3VtZW50czogdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0byB3aGljaAotdGhpcyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGFwcGxpZXMgKG9yIDxDT0RFPk5VTEw8L0NPREU+IGZvcgotPENPREU+c3JtLmNvbmY8L0NPREU+KSwgYW5kIGEgcG9pbnRlciB0byBhIHJlc291cmNlIHBvb2wgaW4gd2hpY2ggdGhlCi1hbGxvY2F0aW9uIHNob3VsZCBoYXBwZW4uIDxQPgotCi0oSWYgd2UgYXJlIHJlYWRpbmcgYSA8Q09ERT4uaHRhY2Nlc3M8L0NPREU+IGZpbGUsIHRoYXQgcmVzb3VyY2UgcG9vbAotaXMgdGhlIHBlci1yZXF1ZXN0IHJlc291cmNlIHBvb2wgZm9yIHRoZSByZXF1ZXN0OyBvdGhlcndpc2UgaXQgaXMgYQotcmVzb3VyY2UgcG9vbCB3aGljaCBpcyB1c2VkIGZvciBjb25maWd1cmF0aW9uIGRhdGEsIGFuZCBjbGVhcmVkIG9uCi1yZXN0YXJ0cy4gIEVpdGhlciB3YXksIGl0IGlzIGltcG9ydGFudCBmb3IgdGhlIHN0cnVjdHVyZSBiZWluZyBjcmVhdGVkCi10byB2YW5pc2ggd2hlbiB0aGUgcG9vbCBpcyBjbGVhcmVkLCBieSByZWdpc3RlcmluZyBhIGNsZWFudXAgb24gdGhlCi1wb29sIGlmIG5lY2Vzc2FyeSkuIDxQPgotCi1Gb3IgdGhlIE1JTUUgbW9kdWxlLCB0aGUgcGVyLWRpciBjb25maWcgY3JlYXRpb24gZnVuY3Rpb24ganVzdAotPENPREU+YXBfcGFsbG9jPC9DT0RFPnMgdGhlIHN0cnVjdHVyZSBhYm92ZSwgYW5kIGEgY3JlYXRlcyBhIGNvdXBsZSBvZgotPENPREU+dGFibGU8L0NPREU+cyB0byBmaWxsIGl0LiAgVGhhdCBsb29rcyBsaWtlIHRoaXM6Ci0KLTxQUkU+Ci12b2lkICpjcmVhdGVfbWltZV9kaXJfY29uZmlnIChwb29sICpwLCBjaGFyICpkdW1teSkKLXsKLSAgICBtaW1lX2Rpcl9jb25maWcgKm5ldyA9Ci0gICAgICAobWltZV9kaXJfY29uZmlnICopIGFwX3BhbGxvYyAocCwgc2l6ZW9mKG1pbWVfZGlyX2NvbmZpZykpOwotCi0gICAgbmV3LSZndDtmb3JjZWRfdHlwZXMgPSBhcF9tYWtlX3RhYmxlIChwLCA0KTsKLSAgICBuZXctJmd0O2VuY29kaW5nX3R5cGVzID0gYXBfbWFrZV90YWJsZSAocCwgNCk7Ci0KLSAgICByZXR1cm4gbmV3OwotfQotPC9QUkU+Ci0KLU5vdywgc3VwcG9zZSB3ZSd2ZSBqdXN0IHJlYWQgaW4gYSA8Q09ERT4uaHRhY2Nlc3M8L0NPREU+IGZpbGUuICBXZQotYWxyZWFkeSBoYXZlIHRoZSBwZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGZvciB0aGUgbmV4dAotZGlyZWN0b3J5IHVwIGluIHRoZSBoaWVyYXJjaHkuICBJZiB0aGUgPENPREU+Lmh0YWNjZXNzPC9DT0RFPiBmaWxlIHdlCi1qdXN0IHJlYWQgaW4gZGlkbid0IGhhdmUgYW55IDxDT0RFPkFkZFR5cGU8L0NPREU+IG9yCi08Q09ERT5BZGRFbmNvZGluZzwvQ09ERT4gY29tbWFuZHMsIGl0cyBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmUKLWZvciB0aGUgTUlNRSBtb2R1bGUgaXMgc3RpbGwgdmFsaWQsIGFuZCB3ZSBjYW4ganVzdCB1c2UgaXQuCi1PdGhlcndpc2UsIHdlIG5lZWQgdG8gbWVyZ2UgdGhlIHR3byBzdHJ1Y3R1cmVzIHNvbWVob3cuIDxQPgotCi1UbyBkbyB0aGF0LCB0aGUgc2VydmVyIGludm9rZXMgdGhlIG1vZHVsZSdzIHBlci1kaXJlY3RvcnkgY29uZmlnIG1lcmdlCi1mdW5jdGlvbiwgaWYgb25lIGlzIHByZXNlbnQuICBUaGF0IGZ1bmN0aW9uIHRha2VzIHRocmVlIGFyZ3VtZW50czoKLXRoZSB0d28gc3RydWN0dXJlcyBiZWluZyBtZXJnZWQsIGFuZCBhIHJlc291cmNlIHBvb2wgaW4gd2hpY2ggdG8KLWFsbG9jYXRlIHRoZSByZXN1bHQuICBGb3IgdGhlIE1JTUUgbW9kdWxlLCBhbGwgdGhhdCBuZWVkcyB0byBiZSBkb25lCi1pcyBvdmVybGF5IHRoZSB0YWJsZXMgZnJvbSB0aGUgbmV3IHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZSB3aXRoCi10aG9zZSBmcm9tIHRoZSBwYXJlbnQ6Ci0KLTxQUkU+Ci12b2lkICptZXJnZV9taW1lX2Rpcl9jb25maWdzIChwb29sICpwLCB2b2lkICpwYXJlbnRfZGlydiwgdm9pZCAqc3ViZGlydikKLXsKLSAgICBtaW1lX2Rpcl9jb25maWcgKnBhcmVudF9kaXIgPSAobWltZV9kaXJfY29uZmlnICopcGFyZW50X2RpcnY7Ci0gICAgbWltZV9kaXJfY29uZmlnICpzdWJkaXIgPSAobWltZV9kaXJfY29uZmlnICopc3ViZGlydjsKLSAgICBtaW1lX2Rpcl9jb25maWcgKm5ldyA9Ci0gICAgICAobWltZV9kaXJfY29uZmlnICopYXBfcGFsbG9jIChwLCBzaXplb2YobWltZV9kaXJfY29uZmlnKSk7Ci0KLSAgICBuZXctJmd0O2ZvcmNlZF90eXBlcyA9IGFwX292ZXJsYXlfdGFibGVzIChwLCBzdWJkaXItJmd0O2ZvcmNlZF90eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfZGlyLSZndDtmb3JjZWRfdHlwZXMpOwotICAgIG5ldy0mZ3Q7ZW5jb2RpbmdfdHlwZXMgPSBhcF9vdmVybGF5X3RhYmxlcyAocCwgc3ViZGlyLSZndDtlbmNvZGluZ190eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF9kaXItJmd0O2VuY29kaW5nX3R5cGVzKTsKLQotICAgIHJldHVybiBuZXc7Ci19Ci08L1BSRT4KLQotQXMgYSBub3RlIC0tLSBpZiB0aGVyZSBpcyBubyBwZXItZGlyZWN0b3J5IG1lcmdlIGZ1bmN0aW9uIHByZXNlbnQsIHRoZQotc2VydmVyIHdpbGwganVzdCB1c2UgdGhlIHN1YmRpcmVjdG9yeSdzIGNvbmZpZ3VyYXRpb24gaW5mbywgYW5kIGlnbm9yZQotdGhlIHBhcmVudCdzLiAgRm9yIHNvbWUgbW9kdWxlcywgdGhhdCB3b3JrcyBqdXN0IGZpbmUgKDxFTT5lLmcuPC9FTT4sIGZvciB0aGUKLWluY2x1ZGVzIG1vZHVsZSwgd2hvc2UgcGVyLWRpcmVjdG9yeSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCi1jb25zaXN0cyBzb2xlbHkgb2YgdGhlIHN0YXRlIG9mIHRoZSA8Q09ERT5YQklUSEFDSzwvQ09ERT4pLCBhbmQgZm9yCi10aG9zZSBtb2R1bGVzLCB5b3UgY2FuIGp1c3Qgbm90IGRlY2xhcmUgb25lLCBhbmQgbGVhdmUgdGhlCi1jb3JyZXNwb25kaW5nIHN0cnVjdHVyZSBzbG90IGluIHRoZSBtb2R1bGUgaXRzZWxmIDxDT0RFPk5VTEw8L0NPREU+LjxQPgotCi08SDM+PEEgTkFNRT0iY29tbWFuZHMiPkNvbW1hbmQgaGFuZGxpbmc8L0E+PC9IMz4KLQotTm93IHRoYXQgd2UgaGF2ZSB0aGVzZSBzdHJ1Y3R1cmVzLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gZmlndXJlIG91dAotaG93IHRvIGZpbGwgdGhlbS4gIFRoYXQgaW52b2x2ZXMgcHJvY2Vzc2luZyB0aGUgYWN0dWFsCi08Q09ERT5BZGRUeXBlPC9DT0RFPiBhbmQgPENPREU+QWRkRW5jb2Rpbmc8L0NPREU+IGNvbW1hbmRzLiAgVG8gZmluZAotY29tbWFuZHMsIHRoZSBzZXJ2ZXIgbG9va3MgaW4gdGhlIG1vZHVsZSdzIDxDT0RFPmNvbW1hbmQgdGFibGU8L0NPREU+LgotVGhhdCB0YWJsZSBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBob3cgbWFueSBhcmd1bWVudHMgdGhlIGNvbW1hbmRzCi10YWtlLCBhbmQgaW4gd2hhdCBmb3JtYXRzLCB3aGVyZSBpdCBpcyBwZXJtaXR0ZWQsIGFuZCBzbyBmb3J0aC4gIFRoYXQKLWluZm9ybWF0aW9uIGlzIHN1ZmZpY2llbnQgdG8gYWxsb3cgdGhlIHNlcnZlciB0byBpbnZva2UgbW9zdAotY29tbWFuZC1oYW5kbGluZyBmdW5jdGlvbnMgd2l0aCBwcmUtcGFyc2VkIGFyZ3VtZW50cy4gIFdpdGhvdXQgZnVydGhlcgotYWRvLCBsZXQncyBsb29rIGF0IHRoZSA8Q09ERT5BZGRUeXBlPC9DT0RFPiBjb21tYW5kIGhhbmRsZXIsIHdoaWNoCi1sb29rcyBsaWtlIHRoaXMgKHRoZSA8Q09ERT5BZGRFbmNvZGluZzwvQ09ERT4gY29tbWFuZCBsb29rcyBiYXNpY2FsbHkKLXRoZSBzYW1lLCBhbmQgd29uJ3QgYmUgc2hvd24gaGVyZSk6Ci0KLTxQUkU+Ci1jaGFyICphZGRfdHlwZShjbWRfcGFybXMgKmNtZCwgbWltZV9kaXJfY29uZmlnICptLCBjaGFyICpjdCwgY2hhciAqZXh0KQotewotICAgIGlmICgqZXh0ID09ICcuJykgKytleHQ7Ci0gICAgYXBfdGFibGVfc2V0IChtLSZndDtmb3JjZWRfdHlwZXMsIGV4dCwgY3QpOwotICAgIHJldHVybiBOVUxMOwotfQotPC9QUkU+Ci0KLVRoaXMgY29tbWFuZCBoYW5kbGVyIGlzIHVudXN1YWxseSBzaW1wbGUuICBBcyB5b3UgY2FuIHNlZSwgaXQgdGFrZXMKLWZvdXIgYXJndW1lbnRzLCB0d28gb2Ygd2hpY2ggYXJlIHByZS1wYXJzZWQgYXJndW1lbnRzLCB0aGUgdGhpcmQgYmVpbmcKLXRoZSBwZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGZvciB0aGUgbW9kdWxlIGluIHF1ZXN0aW9uLAotYW5kIHRoZSBmb3VydGggYmVpbmcgYSBwb2ludGVyIHRvIGEgPENPREU+Y21kX3Bhcm1zPC9DT0RFPiBzdHJ1Y3R1cmUuCi1UaGF0IHN0cnVjdHVyZSBjb250YWlucyBhIGJ1bmNoIG9mIGFyZ3VtZW50cyB3aGljaCBhcmUgZnJlcXVlbnRseSBvZgotdXNlIHRvIHNvbWUsIGJ1dCBub3QgYWxsLCBjb21tYW5kcywgaW5jbHVkaW5nIGEgcmVzb3VyY2UgcG9vbCAoZnJvbQotd2hpY2ggbWVtb3J5IGNhbiBiZSBhbGxvY2F0ZWQsIGFuZCB0byB3aGljaCBjbGVhbnVwcyBzaG91bGQgYmUgdGllZCksCi1hbmQgdGhlICh2aXJ0dWFsKSBzZXJ2ZXIgYmVpbmcgY29uZmlndXJlZCwgZnJvbSB3aGljaCB0aGUgbW9kdWxlJ3MKLXBlci1zZXJ2ZXIgY29uZmlndXJhdGlvbiBkYXRhIGNhbiBiZSBvYnRhaW5lZCBpZiByZXF1aXJlZC48UD4KLQotQW5vdGhlciB3YXkgaW4gd2hpY2ggdGhpcyBwYXJ0aWN1bGFyIGNvbW1hbmQgaGFuZGxlciBpcyB1bnVzdWFsbHkKLXNpbXBsZSBpcyB0aGF0IHRoZXJlIGFyZSBubyBlcnJvciBjb25kaXRpb25zIHdoaWNoIGl0IGNhbiBlbmNvdW50ZXIuCi1JZiB0aGVyZSB3ZXJlLCBpdCBjb3VsZCByZXR1cm4gYW4gZXJyb3IgbWVzc2FnZSBpbnN0ZWFkIG9mCi08Q09ERT5OVUxMPC9DT0RFPjsgdGhpcyBjYXVzZXMgYW4gZXJyb3IgdG8gYmUgcHJpbnRlZCBvdXQgb24gdGhlCi1zZXJ2ZXIncyA8Q09ERT5zdGRlcnI8L0NPREU+LCBmb2xsb3dlZCBieSBhIHF1aWNrIGV4aXQsIGlmIGl0IGlzIGluCi10aGUgbWFpbiBjb25maWcgZmlsZXM7IGZvciBhIDxDT0RFPi5odGFjY2VzczwvQ09ERT4gZmlsZSwgdGhlIHN5bnRheAotZXJyb3IgaXMgbG9nZ2VkIGluIHRoZSBzZXJ2ZXIgZXJyb3IgbG9nIChhbG9uZyB3aXRoIGFuIGluZGljYXRpb24gb2YKLXdoZXJlIGl0IGNhbWUgZnJvbSksIGFuZCB0aGUgcmVxdWVzdCBpcyBib3VuY2VkIHdpdGggYSBzZXJ2ZXIgZXJyb3IKLXJlc3BvbnNlIChIVFRQIGVycm9yIHN0YXR1cywgY29kZSA1MDApLiA8UD4KLQotVGhlIE1JTUUgbW9kdWxlJ3MgY29tbWFuZCB0YWJsZSBoYXMgZW50cmllcyBmb3IgdGhlc2UgY29tbWFuZHMsIHdoaWNoCi1sb29rIGxpa2UgdGhpczoKLQotPFBSRT4KLWNvbW1hbmRfcmVjIG1pbWVfY21kc1tdID0gewoteyAiQWRkVHlwZSIsIGFkZF90eXBlLCBOVUxMLCBPUl9GSUxFSU5GTywgVEFLRTIsCi0gICAgImEgbWltZSB0eXBlIGZvbGxvd2VkIGJ5IGEgZmlsZSBleHRlbnNpb24iIH0sCi17ICJBZGRFbmNvZGluZyIsIGFkZF9lbmNvZGluZywgTlVMTCwgT1JfRklMRUlORk8sIFRBS0UyLAotICAgICJhbiBlbmNvZGluZyAoPEVNPmUuZy48L0VNPiwgZ3ppcCksIGZvbGxvd2VkIGJ5IGEgZmlsZSBleHRlbnNpb24iIH0sCi17IE5VTEwgfQotfTsKLTwvUFJFPgotCi1UaGUgZW50cmllcyBpbiB0aGVzZSB0YWJsZXMgYXJlOgotCi08VUw+Ci0gIDxMST4gVGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQKLSAgPExJPiBUaGUgZnVuY3Rpb24gd2hpY2ggaGFuZGxlcyBpdAotICA8TEk+IGEgPENPREU+KHZvaWQgKik8L0NPREU+IHBvaW50ZXIsIHdoaWNoIGlzIHBhc3NlZCBpbiB0aGUKLSAgICAgICA8Q09ERT5jbWRfcGFybXM8L0NPREU+IHN0cnVjdHVyZSB0byB0aGUgY29tbWFuZCBoYW5kbGVyIC0tLQotICAgICAgIHRoaXMgaXMgdXNlZnVsIGluIGNhc2UgbWFueSBzaW1pbGFyIGNvbW1hbmRzIGFyZSBoYW5kbGVkIGJ5IHRoZQotICAgICAgIHNhbWUgZnVuY3Rpb24uCi0gIDxMST4gQSBiaXQgbWFzayBpbmRpY2F0aW5nIHdoZXJlIHRoZSBjb21tYW5kIG1heSBhcHBlYXIuICBUaGVyZSBhcmUKLSAgICAgICBtYXNrIGJpdHMgY29ycmVzcG9uZGluZyB0byBlYWNoIDxDT0RFPkFsbG93T3ZlcnJpZGU8L0NPREU+Ci0gICAgICAgb3B0aW9uLCBhbmQgYW4gYWRkaXRpb25hbCBtYXNrIGJpdCwgPENPREU+UlNSQ19DT05GPC9DT0RFPiwKLSAgICAgICBpbmRpY2F0aW5nIHRoYXQgdGhlIGNvbW1hbmQgbWF5IGFwcGVhciBpbiB0aGUgc2VydmVyJ3Mgb3duCi0gICAgICAgY29uZmlnIGZpbGVzLCBidXQgPEVNPm5vdDwvRU0+IGluIGFueSA8Q09ERT4uaHRhY2Nlc3M8L0NPREU+Ci0gICAgICAgZmlsZS4KLSAgPExJPiBBIGZsYWcgaW5kaWNhdGluZyBob3cgbWFueSBhcmd1bWVudHMgdGhlIGNvbW1hbmQgaGFuZGxlciB3YW50cwotICAgICAgIHByZS1wYXJzZWQsIGFuZCBob3cgdGhleSBzaG91bGQgYmUgcGFzc2VkIGluLgotICAgICAgIDxDT0RFPlRBS0UyPC9DT0RFPiBpbmRpY2F0ZXMgdHdvIHByZS1wYXJzZWQgYXJndW1lbnRzLiAgT3RoZXIKLSAgICAgICBvcHRpb25zIGFyZSA8Q09ERT5UQUtFMTwvQ09ERT4sIHdoaWNoIGluZGljYXRlcyBvbmUgcHJlLXBhcnNlZAotICAgICAgIGFyZ3VtZW50LCA8Q09ERT5GTEFHPC9DT0RFPiwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIGFyZ3VtZW50Ci0gICAgICAgc2hvdWxkIGJlIDxDT0RFPk9uPC9DT0RFPiBvciA8Q09ERT5PZmY8L0NPREU+LCBhbmQgaXMgcGFzc2VkIGluCi0gICAgICAgYXMgYSBib29sZWFuIGZsYWcsIDxDT0RFPlJBV19BUkdTPC9DT0RFPiwgd2hpY2ggY2F1c2VzIHRoZQotICAgICAgIHNlcnZlciB0byBnaXZlIHRoZSBjb21tYW5kIHRoZSByYXcsIHVucGFyc2VkIGFyZ3VtZW50cwotICAgICAgIChldmVyeXRoaW5nIGJ1dCB0aGUgY29tbWFuZCBuYW1lIGl0c2VsZikuICBUaGVyZSBpcyBhbHNvCi0gICAgICAgPENPREU+SVRFUkFURTwvQ09ERT4sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGhhbmRsZXIgbG9va3MgdGhlCi0gICAgICAgc2FtZSBhcyA8Q09ERT5UQUtFMTwvQ09ERT4sIGJ1dCB0aGF0IGlmIG11bHRpcGxlIGFyZ3VtZW50cyBhcmUKLSAgICAgICBwcmVzZW50LCBpdCBzaG91bGQgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLCBhbmQgZmluYWxseQotICAgICAgIDxDT0RFPklURVJBVEUyPC9DT0RFPiwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIGNvbW1hbmQgaGFuZGxlcgotICAgICAgIGxvb2tzIGxpa2UgYSA8Q09ERT5UQUtFMjwvQ09ERT4sIGJ1dCBpZiBtb3JlIGFyZ3VtZW50cyBhcmUKLSAgICAgICBwcmVzZW50LCB0aGVuIGl0IHNob3VsZCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIGhvbGRpbmcgdGhlCi0gICAgICAgZmlyc3QgYXJndW1lbnQgY29uc3RhbnQuCi0gIDxMST4gRmluYWxseSwgd2UgaGF2ZSBhIHN0cmluZyB3aGljaCBkZXNjcmliZXMgdGhlIGFyZ3VtZW50cyB0aGF0Ci0gICAgICAgc2hvdWxkIGJlIHByZXNlbnQuICBJZiB0aGUgYXJndW1lbnRzIGluIHRoZSBhY3R1YWwgY29uZmlnIGZpbGUKLSAgICAgICBhcmUgbm90IGFzIHJlcXVpcmVkLCB0aGlzIHN0cmluZyB3aWxsIGJlIHVzZWQgdG8gaGVscCBnaXZlIGEKLSAgICAgICBtb3JlIHNwZWNpZmljIGVycm9yIG1lc3NhZ2UuICAoWW91IGNhbiBzYWZlbHkgbGVhdmUgdGhpcwotICAgICAgIDxDT0RFPk5VTEw8L0NPREU+KS4KLTwvVUw+Ci0KLUZpbmFsbHksIGhhdmluZyBzZXQgdGhpcyBhbGwgdXAsIHdlIGhhdmUgdG8gdXNlIGl0LiAgVGhpcyBpcwotdWx0aW1hdGVseSBkb25lIGluIHRoZSBtb2R1bGUncyBoYW5kbGVycywgc3BlY2lmaWNhbGx5IGZvciBpdHMKLWZpbGUtdHlwaW5nIGhhbmRsZXIsIHdoaWNoIGxvb2tzIG1vcmUgb3IgbGVzcyBsaWtlIHRoaXM7IG5vdGUgdGhhdCB0aGUKLXBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgaXMgZXh0cmFjdGVkIGZyb20gdGhlCi08Q09ERT5yZXF1ZXN0X3JlYzwvQ09ERT4ncyBwZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24gdmVjdG9yIGJ5IHVzaW5nCi10aGUgPENPREU+YXBfZ2V0X21vZHVsZV9jb25maWc8L0NPREU+IGZ1bmN0aW9uLgotCi08UFJFPgotaW50IGZpbmRfY3QocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IGk7Ci0gICAgY2hhciAqZm4gPSBhcF9wc3RyZHVwIChyLSZndDtwb29sLCByLSZndDtmaWxlbmFtZSk7Ci0gICAgbWltZV9kaXJfY29uZmlnICpjb25mID0gKG1pbWVfZGlyX2NvbmZpZyAqKQotICAgICAgICAgICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKHItJmd0O3Blcl9kaXJfY29uZmlnLCAmYW1wO21pbWVfbW9kdWxlKTsKLSAgICBjaGFyICp0eXBlOwotCi0gICAgaWYgKFNfSVNESVIoci0mZ3Q7ZmluZm8uc3RfbW9kZSkpIHsKLSAgICAgICAgci0mZ3Q7Y29udGVudF90eXBlID0gRElSX01BR0lDX1RZUEU7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpZigoaT1hcF9yaW5kKGZuLCcuJykpICZsdDsgMCkgcmV0dXJuIERFQ0xJTkVEOwotICAgICsraTsKLQotICAgIGlmICgodHlwZSA9IGFwX3RhYmxlX2dldCAoY29uZi0mZ3Q7ZW5jb2RpbmdfdHlwZXMsICZhbXA7Zm5baV0pKSkKLSAgICB7Ci0gICAgICAgIHItJmd0O2NvbnRlbnRfZW5jb2RpbmcgPSB0eXBlOwotCi0gICAgICAgIC8qIGdvIGJhY2sgdG8gcHJldmlvdXMgZXh0ZW5zaW9uIHRvIHRyeSB0byB1c2UgaXQgYXMgYSB0eXBlICovCi0KLSAgICAgICAgZm5baS0xXSA9ICdcMCc7Ci0gICAgICAgIGlmKChpPWFwX3JpbmQoZm4sJy4nKSkgJmx0OyAwKSByZXR1cm4gT0s7Ci0gICAgICAgICsraTsKLSAgICB9Ci0KLSAgICBpZiAoKHR5cGUgPSBhcF90YWJsZV9nZXQgKGNvbmYtJmd0O2ZvcmNlZF90eXBlcywgJmFtcDtmbltpXSkpKQotICAgIHsKLSAgICAgICAgci0mZ3Q7Y29udGVudF90eXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLTwvUFJFPgotCi08SDM+PEEgTkFNRT0ic2VydmNvbmYiPlNpZGUgbm90ZXMgLS0tIHBlci1zZXJ2ZXIgY29uZmlndXJhdGlvbiwgdmlydHVhbAotIHNlcnZlcnMsIDxFTT5ldGM8L0VNPi48L0E+PC9IMz4KLQotVGhlIGJhc2ljIGlkZWFzIGJlaGluZCBwZXItc2VydmVyIG1vZHVsZSBjb25maWd1cmF0aW9uIGFyZSBiYXNpY2FsbHkKLXRoZSBzYW1lIGFzIHRob3NlIGZvciBwZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb247IHRoZXJlIGlzIGEgY3JlYXRpb24KLWZ1bmN0aW9uIGFuZCBhIG1lcmdlIGZ1bmN0aW9uLCB0aGUgbGF0dGVyIGJlaW5nIGludm9rZWQgd2hlcmUgYQotdmlydHVhbCBzZXJ2ZXIgaGFzIHBhcnRpYWxseSBvdmVycmlkZGVuIHRoZSBiYXNlIHNlcnZlciBjb25maWd1cmF0aW9uLAotYW5kIGEgY29tYmluZWQgc3RydWN0dXJlIG11c3QgYmUgY29tcHV0ZWQuICAoQXMgd2l0aCBwZXItZGlyZWN0b3J5Ci1jb25maWd1cmF0aW9uLCB0aGUgZGVmYXVsdCBpZiBubyBtZXJnZSBmdW5jdGlvbiBpcyBzcGVjaWZpZWQsIGFuZCBhCi1tb2R1bGUgaXMgY29uZmlndXJlZCBpbiBzb21lIHZpcnR1YWwgc2VydmVyLCBpcyB0aGF0IHRoZSBiYXNlCi1jb25maWd1cmF0aW9uIGlzIHNpbXBseSBpZ25vcmVkKS4gPFA+Ci0KLVRoZSBvbmx5IHN1YnN0YW50aWFsIGRpZmZlcmVuY2UgaXMgdGhhdCB3aGVuIGEgY29tbWFuZCBuZWVkcyB0bwotY29uZmlndXJlIHRoZSBwZXItc2VydmVyIHByaXZhdGUgbW9kdWxlIGRhdGEsIGl0IG5lZWRzIHRvIGdvIHRvIHRoZQotPENPREU+Y21kX3Bhcm1zPC9DT0RFPiBkYXRhIHRvIGdldCBhdCBpdC4gIEhlcmUncyBhbiBleGFtcGxlLCBmcm9tIHRoZQotYWxpYXMgbW9kdWxlLCB3aGljaCBhbHNvIGluZGljYXRlcyBob3cgYSBzeW50YXggZXJyb3IgY2FuIGJlIHJldHVybmVkCi0obm90ZSB0aGF0IHRoZSBwZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24gYXJndW1lbnQgdG8gdGhlIGNvbW1hbmQKLWhhbmRsZXIgaXMgZGVjbGFyZWQgYXMgYSBkdW1teSwgc2luY2UgdGhlIG1vZHVsZSBkb2Vzbid0IGFjdHVhbGx5IGhhdmUKLXBlci1kaXJlY3RvcnkgY29uZmlnIGRhdGEpOgotCi08UFJFPgotY2hhciAqYWRkX3JlZGlyZWN0KGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqZiwgY2hhciAqdXJsKQotewotICAgIHNlcnZlcl9yZWMgKnMgPSBjbWQtJmd0O3NlcnZlcjsKLSAgICBhbGlhc19zZXJ2ZXJfY29uZiAqY29uZiA9IChhbGlhc19zZXJ2ZXJfY29uZiAqKQotICAgICAgICAgICAgYXBfZ2V0X21vZHVsZV9jb25maWcocy0mZ3Q7bW9kdWxlX2NvbmZpZywmYW1wO2FsaWFzX21vZHVsZSk7Ci0gICAgYWxpYXNfZW50cnkgKm5ldyA9IGFwX3B1c2hfYXJyYXkgKGNvbmYtJmd0O3JlZGlyZWN0cyk7Ci0KLSAgICBpZiAoIWFwX2lzX3VybCAodXJsKSkgcmV0dXJuICJSZWRpcmVjdCB0byBub24tVVJMIjsKLQotICAgIG5ldy0mZ3Q7ZmFrZSA9IGY7IG5ldy0mZ3Q7cmVhbCA9IHVybDsKLSAgICByZXR1cm4gTlVMTDsKLX0KLTwvUFJFPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9kZXZlbG9wZXIvaG9va3MuaHRtbCBiL2RvY3MvbWFudWFsL2RldmVsb3Blci9ob29rcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWY0ZThiLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2RldmVsb3Blci9ob29rcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QXBhY2hlIDIuMCBIb29rIEZ1bmN0aW9uczwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci0KLTxIMSBhbGlnbj0iY2VudGVyIj5BcGFjaGUgSG9vayBGdW5jdGlvbnM8L0gxPgotCi08UD5JbiBnZW5lcmFsLCBhIGhvb2sgZnVuY3Rpb24gaXMgb25lIHRoYXQgQXBhY2hlIHdpbGwgY2FsbCBhdCBzb21lCi1wb2ludCBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YgYSByZXF1ZXN0LiBNb2R1bGVzIGNhbiBwcm92aWRlCi1mdW5jdGlvbnMgdGhhdCBhcmUgY2FsbGVkLCBhbmQgc3BlY2lmeSB3aGVuIHRoZXkgZ2V0IGNhbGxlZCBpbgotY29tcGFyaXNvbiB0byBvdGhlciBtb2R1bGVzLjwvUD4KLQotPEgyPkNyZWF0aW5nIGEgaG9vayBmdW5jdGlvbjwvSDI+Ci0KLTxQPkluIG9yZGVyIHRvIGNyZWF0ZSBhIG5ldyBob29rLCBmb3VyIHRoaW5ncyBuZWVkIHRvIGJlIGRvbmU6PC9QPgotCi08SDM+RGVjbGFyZSB0aGUgaG9vayBmdW5jdGlvbjwvSDM+Ci0KLTxQPlVzZSB0aGUgREVDTEFSRV9IT09LIG1hY3JvLCB3aGljaCBuZWVkcyB0byBiZSBnaXZlbiB0aGUgbmFtZSBvZiB0aGUKLWhvb2ssIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgaG9vayBmdW5jdGlvbiBhbmQgdGhlIGFyZ3VtZW50cy4gRm9yCi1leGFtcGxlLCBpZiB0aGUgaG9vayByZXR1cm5zIGFuIDxUVD5pbnQ8L1RUPiBhbmQgdGFrZXMgYQotPFRUPnJlcXVlc3RfcmVjICo8L1RUPiBhbmQgYW4gPFRUPmludDwvVFQ+IGFuZCBpcyBjYWxsZWQKLSJkb19zb21ldGhpbmciLCB0aGVuIGRlY2xhcmUgaXQgbGlrZSB0aGlzOjwvUD4KLQotPFRUPkRFQ0xBUkVfSE9PSyhpbnQsZG9fc29tZXRoaW5nLChyZXF1ZXN0X3JlYyAqcixpbnQgbikpPC9UVD4KLQotPFA+VGhpcyBzaG91bGQgZ28gaW4gYSBoZWFkZXIgd2hpY2ggbW9kdWxlcyB3aWxsIGluY2x1ZGUgaWYgdGhleSB3YW50Ci10byB1c2UgdGhlIGhvb2suPC9QPgotCi08SDM+Q3JlYXRlIHRoZSBob29rIHN0cnVjdHVyZTwvSDM+Ci0KLTxQPkVhY2ggc291cmNlIGZpbGUgdGhhdCBleHBvcnRzIGEgaG9vayBoYXMgYSBwcml2YXRlIHN0cnVjdHVyZSB3aGljaAotaXMgdXNlZCB0byByZWNvcmQgdGhlIG1vZHVsZSBmdW5jdGlvbnMgdGhhdCB1c2UgdGhlIGhvb2suIFRoaXMgaXMKLWRlY2xhcmVkIGFzIGZvbGxvd3M6PC9QPgotCi08UFJFPgotSE9PS19TVFJVQ1QoCi0gICAgICAgICAgICBIT09LX0xJTksoZG9fc29tZXRoaW5nKQotICAgICAgICAgICAgLi4uCi0gICAgICAgICAgICkKLTwvUFJFPgotCi08SDM+SW1wbGVtZW50IHRoZSBob29rIGNhbGxlcjwvSDM+Ci0KLTxQPlRoZSBzb3VyY2UgZmlsZSB0aGF0IGV4cG9ydHMgdGhlIGhvb2sgaGFzIHRvIGltcGxlbWVudCBhIGZ1bmN0aW9uCi10aGF0IHdpbGwgY2FsbCB0aGUgaG9vay4gVGhlcmUgYXJlIGN1cnJlbnRseSB0aHJlZSBwb3NzaWJsZSB3YXlzIHRvIGRvCi10aGlzLiBJbiBhbGwgY2FzZXMsIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGlzIGNhbGxlZAotPFRUPmFwX3J1bl88ST5ob29rbmFtZTwvST4oKTwvVFQ+LjwvUD4KLQotPEg0PlZvaWQgaG9va3M8L0g0PgotCi08UD5JZiB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgaG9vayBpcyA8VFQ+dm9pZDwvVFQ+LCB0aGVuIGFsbCB0aGUgaG9va3MgYXJlCi1jYWxsZWQsIGFuZCB0aGUgY2FsbGVyIGlzIGltcGxlbWVudGVkIGxpa2UgdGhpczo8L1A+Ci0KLTxUVD5JTVBMRU1FTlRfSE9PS19WT0lEKGRvX3NvbWV0aGluZywocmVxdWVzdF9yZWMgKnIsaW50Ci1uKSwocixuKSk8L1RUPgotCi08UD5UaGUgc2Vjb25kIGFuZCB0aGlyZCBhcmd1bWVudHMgYXJlIHRoZSBkdW1teSBhcmd1bWVudCBkZWNsYXJhdGlvbiBhbmQKLXRoZSBkdW1teSBhcmd1bWVudHMgYXMgdGhleSB3aWxsIGJlIHVzZWQgd2hlbiBjYWxsaW5nIHRoZSBob29rLiBJbgotb3RoZXIgd29yZHMsIHRoaXMgbWFjcm8gZXhwYW5kcyB0byBzb21ldGhpbmcgbGlrZSB0aGlzOjwvUD4KLQotPFBSRT4KLXZvaWQgYXBfcnVuX2RvX3NvbWV0aGluZyhyZXF1ZXN0X3JlYyAqcixpbnQgbikKLXsKLSAgICAuLi4KLSAgICBkb19zb21ldGhpbmcocixuKTsKLX0KLTwvUFJFPgotCi08SDQ+SG9va3MgdGhhdCByZXR1cm4gYSB2YWx1ZTwvSDQ+Ci0KLTxQPklmIHRoZSBob29rIHJldHVybnMgYSB2YWx1ZSwgdGhlbiBpdCBjYW4gZWl0aGVyIGJlIHJ1biB1bnRpbCB0aGUgZmlyc3QKLWhvb2sgdGhhdCBkb2VzIHNvbWV0aGluZyBpbnRlcmVzdGluZywgbGlrZSBzbzo8L1A+Ci0KLTxUVD5JTVBMRU1FTlRfSE9PS19SVU5fRklSU1QoaW50LGRvX3NvbWV0aGluZywocmVxdWVzdF9yZWMgKnIsaW50IG4pLChyLG4pLERFQ0xJTkVEKTwvVFQ+Ci0KLTxQPlRoZSBmaXJzdCBob29rIHRoYXQgPEk+ZG9lc24ndDwvST4gcmV0dXJuIDxUVD5ERUNMSU5FRDwvVFQ+IHN0b3BzCi10aGUgbG9vcCBhbmQgaXRzIHJldHVybiB2YWx1ZSBpcyByZXR1cm5lZCBmcm9tIHRoZSBob29rIGNhbGxlci4gTm90ZQotdGhhdCA8VFQ+REVDTElORUQ8L1RUPiBpcyB0aGUgdHJhZGl0aW9uIEFwYWNoZSBob29rIHJldHVybiBtZWFuaW5nICJJCi1kaWRuJ3QgZG8gYW55dGhpbmciLCBidXQgaXQgY2FuIGJlIHdoYXRldmVyIHN1aXRzIHlvdS48L1A+Ci0KLTxQPkFsdGVybmF0aXZlbHksIGFsbCBob29rcyBjYW4gYmUgcnVuIHVudGlsIGFuIGVycm9yIG9jY3Vycy4gVGhpcwotYm9pbHMgZG93biB0byBwZXJtaXR0aW5nIDxJPnR3bzwvST4gcmV0dXJuIHZhbHVlcywgb25lIG9mIHdoaWNoIG1lYW5zCi0iSSBkaWQgc29tZXRoaW5nLCBhbmQgaXQgd2FzIE9LIiBhbmQgdGhlIG90aGVyIG1lYW5pbmcgIkkgZGlkCi1ub3RoaW5nIi4gVGhlIGZpcnN0IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHZhbHVlIG90aGVyIHRoYW4gb25lIG9mCi10aG9zZSB0d28gc3RvcHMgdGhlIGxvb3AsIGFuZCBpdHMgcmV0dXJuIGlzIHRoZSByZXR1cm4gdmFsdWUuIERlY2xhcmUKLXRoZXNlIGxpa2Ugc286PC9QPgotCi08VFQ+SU1QTEVNRU5UX0hPT0tfUlVOX0FMTChpbnQsZG9fc29tZXRoaW5nLChyZXF1ZXN0X3JlYyAqcixpbnQKLW4pLChyLG4pLE9LLERFQ0xJTkVEKTwvVFQ+Ci0KLTxQPkFnYWluLCA8VFQ+T0s8L1RUPiBhbmQgPFRUPkRFQ0xJTkVEPC9UVD4gYXJlIHRoZSB0cmFkaXRpb25hbAotdmFsdWVzLiBZb3UgY2FuIHVzZSB3aGF0IHlvdSB3YW50LjwvUD4KLQotPEgzPkNhbGwgdGhlIGhvb2sgY2FsbGVyczwvSDM+Ci0KLTxQPkF0IGFwcHJvcHJpYXRlIG1vbWVudHMgaW4gdGhlIGNvZGUsIGNhbGwgdGhlIGhvb2sgY2FsbGVyLCBsaWtlCi1zbzo8L1A+Ci0KLTxQUkU+Ci0gICAgaW50IG4scmV0OwotICAgIHJlcXVlc3RfcmVjICpyOwotCi0gICAgcmV0PWFwX3J1bl9kb19zb21ldGhpbmcocixuKTsKLTwvUFJFPgotCi08SDI+SG9va2luZyB0aGUgaG9vazwvSDI+Ci0KLTxQPkEgbW9kdWxlIHRoYXQgd2FudHMgYSBob29rIHRvIGJlIGNhbGxlZCBuZWVkcyB0byBkbyB0d28KLXRoaW5ncy48L1A+Ci0KLTxIMz5JbXBsZW1lbnQgdGhlIGhvb2sgZnVuY3Rpb248L0gzPgotCi08UD5JbmNsdWRlIHRoZSBhcHByb3ByaWF0ZSBoZWFkZXIsIGFuZCBkZWZpbmUgYSBzdGF0aWMgZnVuY3Rpb24gb2YgdGhlCi1jb3JyZWN0IHR5cGU6PC9QPgotCi08UFJFPgotc3RhdGljIGludCBteV9zb21ldGhpbmdfZG9lcihyZXF1ZXN0X3JlYyAqcixpbnQgbikKLXsKLSAgICAuLi4KLSAgICByZXR1cm4gT0s7Ci19Ci08L1BSRT4KLQotPEgzPkFkZCBhIGhvb2sgcmVnaXN0ZXJpbmcgZnVuY3Rpb248L0gzPgotCi08UD5EdXJpbmcgaW5pdGlhbGlzYXRpb24sIEFwYWNoZSB3aWxsIGNhbGwgZWFjaCBtb2R1bGVzIGhvb2sKLXJlZ2lzdGVyaW5nIGZ1bmN0aW9uLCB3aGljaCBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kdWxlIHN0cnVjdHVyZTo8L1A+Ci0KLTxQUkU+Ci1zdGF0aWMgdm9pZCBteV9yZWdpc3Rlcl9ob29rcygpCi17Ci0gICAgYXBfaG9va19kb19zb21ldGhpbmcobXlfc29tZXRoaW5nX2RvZXIsTlVMTCxOVUxMLEhPT0tfTUlERExFKTsKLX0KLQotbW9kZSBNT0RVTEVfVkFSX0VYUE9SVCBteV9tb2R1bGUgPQotewotICAgIC4uLgotICAgIG15X3JlZ2lzdGVyX2hvb2tzICAgICAgIC8qIHJlZ2lzdGVyIGhvb2tzICovCi19OwotPC9QUkU+Ci0KLTxIMz5Db250cm9sbGluZyBob29rIGNhbGxpbmcgb3JkZXI8L0gzPgotCi08UD5JbiB0aGUgZXhhbXBsZSBhYm92ZSwgd2UgZGlkbid0IHVzZSB0aGUgdGhyZWUgYXJndW1lbnRzIGluIHRoZSBob29rCi1yZWdpc3RyYXRpb24gZnVuY3Rpb24gdGhhdCBjb250cm9sIGNhbGxpbmcgb3JkZXIuIFRoZXJlIGFyZSB0d28KLW1lY2hhbmlzbXMgZm9yIGRvaW5nIHRoaXMuIFRoZSBmaXJzdCwgcmF0aGVyIGNydWRlLCBtZXRob2QsIGFsbG93cyB1cwotdG8gc3BlY2lmeSByb3VnaGx5IHdoZXJlIHRoZSBob29rIGlzIHJ1biByZWxhdGl2ZSB0byBvdGhlcgotbW9kdWxlcy4gVGhlIGZpbmFsIGFyZ3VtZW50IGNvbnRyb2wgdGhpcy4gVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlCi12YWx1ZXM6PC9QPgotCi08UFJFPgotSE9PS19GSVJTVAotSE9PS19NSURETEUKLUhPT0tfTEFTVAotPC9QUkU+Ci0KLTxQPkFsbCBtb2R1bGVzIHVzaW5nIGFueSBwYXJ0aWN1bGFyIHZhbHVlIG1heSBiZSBydW4gaW4gYW55IG9yZGVyCi1yZWxhdGl2ZSB0byBlYWNoIG90aGVyLCBidXQsIG9mIGNvdXJzZSwgYWxsIG1vZHVsZXMgdXNpbmcKLTxUVD5IT09LX0ZJUlNUPC9UVD4gd2lsbCBiZSBydW4gYmVmb3JlIDxUVD5IT09LX01JRERMRTwvVFQ+IHdoaWNoIGFyZQotYmVmb3JlIDxUVD5IT09LX0xBU1Q8L1RUPi4gTW9kdWxlcyB0aGF0IGRvbid0IGNhcmUgd2hlbiB0aGV5IGFyZSBydW4KLXNob3VsZCB1c2UgPFRUPkhPT0tfTUlERExFPC9UVD4uIDxJPihJIHNwYWNlZCB0aGVzZSBvdXQgc28gcGVvcGxlCi1jb3VsZCBkbyBzdHVmZiBsaWtlIDxUVD5IT09LX0ZJUlNULTI8L1RUPiB0byBnZXQgaW4gc2xpZ2h0bHkgZWFybGllciwKLWJ1dCBpcyB0aGlzIHdpc2U/IC0gQmVuKTwvST48L1A+Ci0KLTxQPk5vdGUgdGhhdCB0aGVyZSBhcmUgdHdvIG1vcmUgdmFsdWVzLCA8VFQ+SE9PS19SRUFMTFlfRklSU1Q8L1RUPiBhbmQKLTxUVD5IT09LX1JFQUxMWV9MQVNUPC9UVD4uIFRoZXNlIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgdGhlIGhvb2sKLWV4cG9ydGVyLjwvUD4KLQotPFA+VGhlIG90aGVyIG1ldGhvZCBhbGxvd3MgZmluZXIgY29udHJvbC4gV2hlbiBhIG1vZHVsZSBrbm93cyB0aGF0IGl0Ci1tdXN0IGJlIHJ1biBiZWZvcmUgKG9yIGFmdGVyKSBzb21lIG90aGVyIG1vZHVsZXMsIGl0IGNhbiBzcGVjaWZ5IHRoZW0KLWJ5IG5hbWUuIFRoZSBzZWNvbmQgKHRoaXJkKSBhcmd1bWVudCBpcyBhIE5VTEwtdGVybWluYXRlZCBhcnJheSBvZgotc3RyaW5ncyBjb25zaXN0aW5nIG9mIHRoZSBuYW1lcyBvZiBtb2R1bGVzIHRoYXQgbXVzdCBiZSBydW4gYmVmb3JlCi0oYWZ0ZXIpIHRoZSBjdXJyZW50IG1vZHVsZS4gRm9yIGV4YW1wbGUsIHN1cHBvc2Ugd2Ugd2FudCAibW9kX3h5ei5jIgotYW5kICJtb2RfYWJjLmMiIHRvIHJ1biBiZWZvcmUgd2UgZG8sIHRoZW4gd2UnZCBob29rIGFzIGZvbGxvd3M6PC9QPgotCi08UFJFPgotc3RhdGljIHZvaWQgcmVnaXN0ZXJfaG9va3MoKQotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXN6UHJlW109eyAibW9kX3h5ei5jIiwgIm1vZF9hYmMuYyIsIE5VTEwgfTsKLQotICAgIGFwX2hvb2tfZG9fc29tZXRoaW5nKG15X3NvbWV0aGluZ19kb2VyLGFzelByZSxOVUxMLEhPT0tfTUlERExFKTsKLX0KLTwvUFJFPgotCi08UD5Ob3RlIHRoYXQgdGhlIHNvcnQgdXNlZCB0byBhY2hpZXZlIHRoaXMgaXMgc3RhYmxlLCBzbyBvcmRlcmluZyBzZXQKLWJ5IDxUVD5IT09LXzxJPk9SREVSPC9JPjwvVFQ+IGlzIHByZXNlcnZlZCwgYXMgZmFyIGFzIGlzCi1wb3NzaWJsZS48L1A+Ci0KLTxJPkJlbiBMYXVyaWUsIDE1dGggQXVndXN0IDE5OTk8L0k+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9kZXZlbG9wZXIvaW5kZXguaHRtbCBiL2RvY3MvbWFudWFsL2RldmVsb3Blci9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzJkZDQ0Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2RldmVsb3Blci9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BcGFjaGUtMi4wIERldmVsb3BlciBEb2N1bWVudGF0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08aDIgYWxpZ249ImNlbnRlciI+RGV2ZWxvcGVyIERvY3VtZW50YXRpb24gZm9yIEFwYWNoZS0yLjA8L2gyPgotPHA+PGEgaHJlZj0iaG9va3MuaHRtbCI+QXBhY2hlIEhvb2sgRnVuY3Rpb25zPC9hPjwvcD4KLTxwPjxhIGhyZWY9Im1vZHVsZXMuaHRtbCI+Q29udmVydGluZyBBcGFjaGUgMS4zIE1vZHVsZXMgdG8gQXBhY2hlIDIuMDwvYT48L3A+Ci08cD48YSBocmVmPSIuLi91c2VyL21wbS5odG1sIj5NUE0gbGlzdGluZzwvYT48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9kZXZlbG9wZXIvbW9kdWxlcy5odG1sIGIvZG9jcy9tYW51YWwvZGV2ZWxvcGVyL21vZHVsZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2NjIyMy4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9kZXZlbG9wZXIvbW9kdWxlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+Q29udmVydGluZyBNb2R1bGVzIGZyb20gQXBhY2hlIDEuMyB0byBBcGFjaGUgMi4wPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLQotPEgxIEFMSUdOPSJDRU5URVIiPkZyb20gQXBhY2hlIDEuMyB0byBBcGFjaGUgMi4wPGJyPk1vZHVsZXM8L0gxPgotCi08cD4KLVRoaXMgaXMgYSBmaXJzdCBhdHRlbXB0IGF0IHdyaXRpbmcgdGhlIGxlc3NvbnMgSSBsZWFybmVkIHdoZW4gdHJ5aW5nIHRvIGNvbnZlcnQgdGhlIG1vZF9tbWFwX3N0YXRpYyBtb2R1bGUgdG8gQXBhY2hlIDIuMC4gIEl0J3MgYnkgbm8gbWVhbnMgZGVmaW5pdGl2ZSBhbmQgcHJvYmFibHkgd29uJ3QgZXZlbiBiZSBjb3JyZWN0IGluIHNvbWUgd2F5cywgYnV0IGl0J3MgYSBzdGFydC4KLTwvcD4KLTxocj4KLTxoMj5UaGUgZWFzaWVyIGNoYW5nZXMuLi4KLTwvaDI+Ci0KLTxoMz5DbGVhbnVwIFJvdXRpbmVzPC9oMz4KLTxwPgotVGhlc2Ugbm93IG5lZWQgdG8gYmUgb2YgdHlwZSBhcF9zdGF0dXNfdCBhbmQgcmV0dXJuIGEgdmFsdWUgb2YgdGhhdCB0eXBlLiAgTm9ybWFsbHkgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIEFQUl9TVUNDRVNTIHVubGVzcyB0aGVyZSBpcyBzb21lIG5lZWQgdG8gc2lnbmFsIGFuIGVycm9yIGluIHRoZSBjbGVhbnVwLiAgQmUgYXdhcmUgdGhhdCBldmVuIHRob3VnaCB5b3Ugc2lnbmFsIGFuIGVycm9yIG5vdCBhbGwgY29kZSB5ZXQgY2hlY2tzIGFuZCBhY3RzIHVwb24gdGhlIGVycm9yLgotPC9wPgotCi08aDM+SW5pdGlhbGlzYXRpb24gUm91dGluZXM8L2gzPgotCi08cD4KLVRoZXNlIHNob3VsZCBub3cgYmUgcmVuYW1lZCB0byBiZXR0ZXIgc2lnbmlmeSB3aGVyZSB0aGV5IHNpdCBpbiB0aGUgb3ZlcmFsbCBwcm9jZXNzLiAgU28gdGhlIG5hbWUgZ2V0cyBhIHNtYWxsIGNoYW5nZSBmcm9tIG1tYXBfaW5pdCB0byBtbWFwX3Bvc3RfY29uZmlnLiAgVGhlIGFyZ3VtZW50cyBwYXNzZWQgaGF2ZSB1bmRlcmdvbmUgYSByYWRpY2FsIGNoYW5nZSBhbmQgbm93IGxvb2sgbGlrZQotPC9wPgotPHVsIHN0eWxlPSJsaXN0LXN0eWxlOm5vbmUiPgotPGxpPmFwX2NvbnRleHRfdCAqcCw8L2xpPgotPGxpPmFwX2NvbnRleHRfdCAqcGxvZyw8L2xpPgotPGxpPmFwX2NvbnRleHRfdCAqcHRlbXAsPC9saT4KLTxsaT5zZXJ2ZXJfcmVjICpzPC9saT4KLTwvdWw+Ci08cD4KLVRocm91Z2hvdXQgQXBhY2hlIHRoZSBvbGQgcG9vbHMgaGF2ZSBiZWVuIHJlcGxjZWQgYnkgdGhlIGFwX2NvbnRleHRfdCwgdGhvdWdoIHRoZWlyIHVzZSByZW1haW5zIHJlbWFya2FibHkgc2ltaWxhci4KLTwvcD4KLQotPGgzPkRhdGEgVHlwZXM8L2gzPgotPHA+Ci1BIGxvdCBvZiB0aGUgZGF0YSB0eXBlcyBoYXZlIGJlZW4gbW92ZWQgaW50byB0aGUgQVBSLiAgVGhpcyBtZWFucyB0aGF0IHNvbWUgaGF2ZSBoYWQgYSBuYW1lIGNoYW5nZSwgc3VjaCBhcyB0aGUgb25lIHNob3duIGFib3ZlLiAgVGhlIGZvbGxvd2luZyBpcyBhIGJyaWVmIGxpc3Qgb2Ygc29tZSBvZiB0aGUgY2hhbmdlcyB0aGF0IHlvdSBhcmUgbGlrZWx5IHRvIGhhdmUgdG8gbWFrZS4KLTx1bCBzdHlsZT0ibGlzdC1zdHlsZTpub25lIj4KLTxsaT5wb29sIGJlY29tZXMgYXBfY29udGV4dF90PC9saT4KLTxsaT50YWJsZSBiZWNvbWVzIGFwX3RhYmxlX3Q8L2xpPgotPC91bD4KLTxocj4KLQotPGgyPgotVGhlIDxlbT5tZXNzaWVyPC9lbT4gY2hhbmdlcy4uLgotPC9oMj4KLTxoMz5SZWdpc3RlciBIb29rczwvaDM+Ci08cD4KLVRoZSBuZXcgYXJjaGl0ZWN0dXJlIHVzZXMgYSBzZXJpZXMgb2YgaG9va3MgdG8gcHJvdmlkZSBmb3IgY2FsbGluZyB5b3VyIGZ1bmN0aW9ucy4gIFRoZXNlIHlvdSdsbCBuZWVkIHRvIGFkZCB0byB5b3VyIG1vZHVsZSBieSB3YXkgb2YgYSBuZXcgZnVuY3Rpb24sIHN0YXRpYyB2b2lkIHJlZ2lzdGVyX2hvb2tzKHZvaWQpLiAgVGhlIGZ1bmN0aW9uIGlzIHJlYWxseSByZWFzb25hYmx5IHN0cmFpZ2h0Zm9yd2FyZCBvbmNlIHlvdSB1bmRlcnN0YW5kIHdoYXQgbmVlZHMgdG8gYmUgZG9uZS4gIEVhY2ggZnVuY3Rpb24gdGhhdCBuZWVkcyBjYWxsaW5nIGF0IHNvbWUgc3RhZ2UgaW4gdGhlIHByb2Nlc3Npbmcgb2YgYSByZXF1ZXN0IG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQsIGhhbmRsZXJzIGRvIG5vdC4gIFRoZXJlIGFyZSBhIG51bWJlciBvZiBwaGFzZXMgd2hlcmUgZnVuY3Rpb25zIGNhbiBiZSBhZGRlZCwgYW5kIGZvciBlYWNoIHlvdSBjYW4gc3BlY2lmeSB3aXRoIGEgaGlnaCBkZWdyZWUgb2YgY29udHJvbCB0aGUgcmVsYXRpdmUgb3JkZXIgdGhhdCB0aGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgaW4uCi08L3A+Ci08cD4KLVRoaXMgaXMgdGhlIGNvZGUgdGhhdCB3YXMgYWRkZWQgdG8gbW9kX21tYXBfc3RhdGljCi08L3A+Ci08cHJlPgotc3RhdGljIHZvaWQgcmVnaXN0ZXJfaG9va3Modm9pZCkKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFzelByZVtdPXsgImh0dHBfY29yZS5jIixOVUxMIH07Ci0gICAgYXBfaG9va19wb3N0X2NvbmZpZyhtbWFwX3Bvc3RfY29uZmlnLE5VTEwsTlVMTCxIT09LX01JRERMRSk7Ci0gICAgYXBfaG9va190cmFuc2xhdGVfbmFtZShtbWFwX3N0YXRpY194bGF0LGFzelByZSxOVUxMLEhPT0tfTEFTVCk7Ci19OwotPC9wcmU+Ci08cD4KLVRoaXMgcmVnaXN0ZXJzIDIgZnVuY3Rpb25zIHRoYXQgbmVlZCB0byBiZSBjYWxsZWQsIG9uZSBpbiB0aGUgcG9zdF9jb25maWcgc3RhZ2UgKHZpcnR1YWxseSBldmVyeSBtb2R1bGUgd2lsbCBuZWVkIHRoaXMgb25lKSBhbmQgb25lIGZvciB0aGUgdHJhbnNsYXRlX25hbWUgcGhhc2UuICBub3RlIHRoYXQgd2hpbGUgdGhlcmUgYXJlIGRpZmZlcmVudCBmdW5jdGlvbiBuYW1lcyB0aGUgZm9ybWF0IG9mIGVhY2ggaXMgaWRlbnRpY2FsLiAgU28gd2hhdCBpcyB0aGUgZm9ybWF0PwotPC9wPgotPHA+PHN0cm9uZz4KLWFwX2hvb2tfW3BoYXNlX25hbWVdKGZ1bmN0aW9uX25hbWUsIHByZWRlY2Vzc29ycywgc3VjY2Vzc29ycywgcG9zaXRpb24pOwotPC9zdHJvbmc+PC9wPgotPHA+Ci1UaGVyZSBhcmUgMyBob29rIHBvc2l0aW9ucyBkZWZpbmVkLi4uCi08L3A+Ci08dWwgc3R5bGU9Imxpc3Qtc3R5bGU6bm9uZSI+Ci08bGk+SE9PS19GSVJTVDwvbGk+Ci08bGk+SE9PS19NSURETEU8L2xpPgotPGxpPkhPT0tfTEFTVDwvbGk+Ci08L3VsPgotPHA+Ci1UbyBkZWZpbmUgdGhlIHBvc2l0aW9uIHlvdSB1c2UgdGhlIHBvc2l0aW9uIGFuZCB0aGVuIG1vZGlmeSBpdCB3aXRoIHRoZSBwcmVkZWNlc3NvcnMgYW5kIHN1Y2Nlc3NvcnMuICBlYWNoIG9mIHRoZSBtb2RpZmllcnMgY2FuIGJlIGEgbGlzdCBvZiBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgY2FsbGVkLCBlaXRoZXIgYmVmb3JlIHRoZSBmdW5jdGlvbiBpcyBydW4gKHByZWRlY2Vzc29ycykgb3IgYWZ0ZXIgdGhlIGZ1bmN0aW9uIGhhcyBydW4gKHN1Y2Nlc3NvcnMpLgotPC9wPgotPHA+Ci1JbiB0aGUgbW9kX21tYXBfc3RhdGljIGNhc2UgSSBkaWRuJ3QgY2FyZSBhYm91dCB0aGUgcG9zdF9jb25maWcgc3RhZ2UsIGJ1dCB0aGUgbW1hcF9zdGF0aWNfeGxhdCBNVVNUIGJlIGNhbGxlZCBhZnRlciB0aGUgY29yZSBtb2R1bGUgaGFkIGRvbmUgaXQncyBuYW1lIHRyYW5zbGF0aW9uLCBoZW5jZSB0aGUgdXNlIG9mIHRoZSBhc3pQcmUgdG8gZGVmaW5lIGEgbW9kaWZpZXIgdG8gdGhlIHBvc2l0aW9uIEhPT0tfTEFTVC4KLTwvcD4KLTxoMz5Nb2R1bGUgRGVmaW5pdGlvbjwvaDM+Ci0KLTxwPgotVGhlcmUgYXJlIG5vdyBhIGxvdCBmZXdlciBzdGFnZXMgdG8gd29ycnkgYWJvdXQgd2hlbiBjcmVhdGluZyB5b3VyIG1vZHVsZSBkZWZpbml0aW9uLiAgVGhlIG9sZCBkZWZpbnRpb24gbG9va2VkIGxpa2UKLTwvcD4KLTxwcmU+Ci1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgW21vZHVsZV9uYW1lXV9tb2R1bGUgPQotewotICAgIFNUQU5EQVJEX01PRFVMRV9TVFVGRiwKLSAgICAvKiBpbml0aWFsaXplciAqLwotICAgIC8qIGRpciBjb25maWcgY3JlYXRlciAqLwotICAgIC8qIGRpciBtZXJnZXIgLS0tIGRlZmF1bHQgaXMgdG8gb3ZlcnJpZGUgKi8KLSAgICAvKiBzZXJ2ZXIgY29uZmlnICovCi0gICAgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLwotICAgIC8qIGNvbW1hbmQgaGFuZGxlcnMgKi8KLSAgICAvKiBoYW5kbGVycyAqLwotICAgIC8qIGZpbGVuYW1lIHRyYW5zbGF0aW9uICovCi0gICAgLyogY2hlY2tfdXNlcl9pZCAqLwotICAgIC8qIGNoZWNrIGF1dGggKi8KLSAgICAvKiBjaGVjayBhY2Nlc3MgKi8KLSAgICAvKiB0eXBlX2NoZWNrZXIgKi8KLSAgICAvKiBmaXh1cHMgKi8KLSAgICAvKiBsb2dnZXIgKi8KLSAgICAvKiBoZWFkZXIgcGFyc2VyICovCi0gICAgLyogY2hpbGRfaW5pdCAqLwotICAgIC8qIGNoaWxkX2V4aXQgKi8KLSAgICAvKiBwb3N0IHJlYWQtcmVxdWVzdCAqLwotfTsKLTwvcHJlPgotPHA+Ci1UaGUgbmV3IHN0cnVjdHVyZSBpcyBhIGdyZWF0IGRlYWwgc2ltcGxlci4uLgotPC9wPgotPHByZT4KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBbbW9kdWxlX25hbWVdX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCi0gICAgLyogY3JlYXRlIHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgICAvKiBtZXJnZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmVzICAqLwotICAgIC8qIGNyZWF0ZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmVzICAgICovCi0gICAgLyogbWVyZ2UgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlcyAgICAgKi8KLSAgICAvKiBjb21tYW5kIGhhbmRsZXJzICovCi0gICAgLyogaGFuZGxlcnMgKi8KLSAgICAvKiByZWdpc3RlciBob29rcyAqLwotIH07Ci08L3ByZT4KLTxwPgotU29tZSBvZiB0aGVzZSByZWFkIGRpcmVjdGx5IGFjcm9zcywgc29tZSBkb24ndC4gIEknbGwgdHJ5IHRvIHN1bW1hcmlzZSB3aGF0IHNob3VsZCBiZSBkb25lIGJlbG93LgotPC9wPgotPHA+Ci1UaGUgc3RhZ2VzIHRoYXQgcmVhZCBkaXJlY3RseSBhY3Jvc3MgOgotPC9wPgotPHVsIHN0eWxlPSJsaXN0LXN0eWxlOm5vbmUiPgotPGxpPgotLyogZGlyIGNvbmZpZyBjcmVhdGVyICovID09PiAvKiBjcmVhdGUgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlcyAqLwotPC9saT4KLTxsaT4KLS8qIHNlcnZlciBjb25maWcgKi8gPT0+IC8qIGNyZWF0ZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmVzICAgICovCi08L2xpPgotPGxpPgotLyogZGlyIG1lcmdlciAqLyA9PT4gLyogbWVyZ2UgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlcyAgKi8KLTwvbGk+Ci08bGk+Ci0vKiBtZXJnZSBzZXJ2ZXIgY29uZmlnICovID09PiAvKiBtZXJnZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmVzICAgICAqLwotPC9saT4KLTxsaT4KLS8qIGNvbW1hbmQgdGFibGUgKi8gPT0+IC8qIGNvbW1hbmQgYXBfdGFibGVfdCAqLwotPC9saT4KLTxsaT4KLS8qIGhhbmRsZXJzICovID09PiAvKiBoYW5kbGVycyAqLwotPC9saT4KLTwvdWw+Ci08UD4KLVRoZSByZW1haW5kZXIgb2YgdGhlIG9sZCBmdW5jdGlvbnMgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgYXMgaG9va3MuICBUaGVyZSBhcmUgdGhlIGZvbGxvd2luZyBob29rIHN0YWdlcyBkZWZpbmVkIHNvIGZhci4uLgotPC9QPgotCi08dWwgc3R5bGU9Imxpc3Qtc3R5bGU6bm9uZSI+Ci08bGk+Ci1hcF9ob29rX3Bvc3RfY29uZmlnICA8ZW0+KHRoaXMgaXMgd2hlcmUgdGhlIG9sZCBfaW5pdCByb3V0aW5lcyBnZXQgcmVnaXN0ZXJlZCk8L2VtPgotPC9saT4KLTxsaT4KLWFwX2hvb2tfaHR0cF9tZXRob2QKLTwvbGk+Ci08bGk+Ci1hcF9ob29rX29wZW5fbG9ncwotPC9saT4KLTxsaT4KLWFwX2hvb2tfYXV0aF9jaGVja2VyCi08L2xpPgotPGxpPgotYXBfaG9va19kZWZhdWx0X3BvcnQKLTwvbGk+Ci08bGk+Ci1hcF9ob29rX2FjY2Vzc19jaGVja2VyCi08L2xpPgotPGxpPgotYXBfaG9va19wcm9jZXNzX2Nvbm5lY3Rpb24KLTwvbGk+Ci08bGk+Ci1hcF9ob29rX2NoaWxkX2luaXRfaG9vawotPC9saT4KLQotCi08L2JvZHk+Ci08L2h0bWw+Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvZGV2ZWxvcGVyL21vZHVsZXMuaHRtbC5lbiBiL2RvY3MvbWFudWFsL2RldmVsb3Blci9tb2R1bGVzLmh0bWwuZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNjYyMjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvZGV2ZWxvcGVyL21vZHVsZXMuaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkNvbnZlcnRpbmcgTW9kdWxlcyBmcm9tIEFwYWNoZSAxLjMgdG8gQXBhY2hlIDIuMDwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci0KLTxIMSBBTElHTj0iQ0VOVEVSIj5Gcm9tIEFwYWNoZSAxLjMgdG8gQXBhY2hlIDIuMDxicj5Nb2R1bGVzPC9IMT4KLQotPHA+Ci1UaGlzIGlzIGEgZmlyc3QgYXR0ZW1wdCBhdCB3cml0aW5nIHRoZSBsZXNzb25zIEkgbGVhcm5lZCB3aGVuIHRyeWluZyB0byBjb252ZXJ0IHRoZSBtb2RfbW1hcF9zdGF0aWMgbW9kdWxlIHRvIEFwYWNoZSAyLjAuICBJdCdzIGJ5IG5vIG1lYW5zIGRlZmluaXRpdmUgYW5kIHByb2JhYmx5IHdvbid0IGV2ZW4gYmUgY29ycmVjdCBpbiBzb21lIHdheXMsIGJ1dCBpdCdzIGEgc3RhcnQuCi08L3A+Ci08aHI+Ci08aDI+VGhlIGVhc2llciBjaGFuZ2VzLi4uCi08L2gyPgotCi08aDM+Q2xlYW51cCBSb3V0aW5lczwvaDM+Ci08cD4KLVRoZXNlIG5vdyBuZWVkIHRvIGJlIG9mIHR5cGUgYXBfc3RhdHVzX3QgYW5kIHJldHVybiBhIHZhbHVlIG9mIHRoYXQgdHlwZS4gIE5vcm1hbGx5IHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBBUFJfU1VDQ0VTUyB1bmxlc3MgdGhlcmUgaXMgc29tZSBuZWVkIHRvIHNpZ25hbCBhbiBlcnJvciBpbiB0aGUgY2xlYW51cC4gIEJlIGF3YXJlIHRoYXQgZXZlbiB0aG91Z2ggeW91IHNpZ25hbCBhbiBlcnJvciBub3QgYWxsIGNvZGUgeWV0IGNoZWNrcyBhbmQgYWN0cyB1cG9uIHRoZSBlcnJvci4KLTwvcD4KLQotPGgzPkluaXRpYWxpc2F0aW9uIFJvdXRpbmVzPC9oMz4KLQotPHA+Ci1UaGVzZSBzaG91bGQgbm93IGJlIHJlbmFtZWQgdG8gYmV0dGVyIHNpZ25pZnkgd2hlcmUgdGhleSBzaXQgaW4gdGhlIG92ZXJhbGwgcHJvY2Vzcy4gIFNvIHRoZSBuYW1lIGdldHMgYSBzbWFsbCBjaGFuZ2UgZnJvbSBtbWFwX2luaXQgdG8gbW1hcF9wb3N0X2NvbmZpZy4gIFRoZSBhcmd1bWVudHMgcGFzc2VkIGhhdmUgdW5kZXJnb25lIGEgcmFkaWNhbCBjaGFuZ2UgYW5kIG5vdyBsb29rIGxpa2UKLTwvcD4KLTx1bCBzdHlsZT0ibGlzdC1zdHlsZTpub25lIj4KLTxsaT5hcF9jb250ZXh0X3QgKnAsPC9saT4KLTxsaT5hcF9jb250ZXh0X3QgKnBsb2csPC9saT4KLTxsaT5hcF9jb250ZXh0X3QgKnB0ZW1wLDwvbGk+Ci08bGk+c2VydmVyX3JlYyAqczwvbGk+Ci08L3VsPgotPHA+Ci1UaHJvdWdob3V0IEFwYWNoZSB0aGUgb2xkIHBvb2xzIGhhdmUgYmVlbiByZXBsY2VkIGJ5IHRoZSBhcF9jb250ZXh0X3QsIHRob3VnaCB0aGVpciB1c2UgcmVtYWlucyByZW1hcmthYmx5IHNpbWlsYXIuCi08L3A+Ci0KLTxoMz5EYXRhIFR5cGVzPC9oMz4KLTxwPgotQSBsb3Qgb2YgdGhlIGRhdGEgdHlwZXMgaGF2ZSBiZWVuIG1vdmVkIGludG8gdGhlIEFQUi4gIFRoaXMgbWVhbnMgdGhhdCBzb21lIGhhdmUgaGFkIGEgbmFtZSBjaGFuZ2UsIHN1Y2ggYXMgdGhlIG9uZSBzaG93biBhYm92ZS4gIFRoZSBmb2xsb3dpbmcgaXMgYSBicmllZiBsaXN0IG9mIHNvbWUgb2YgdGhlIGNoYW5nZXMgdGhhdCB5b3UgYXJlIGxpa2VseSB0byBoYXZlIHRvIG1ha2UuCi08dWwgc3R5bGU9Imxpc3Qtc3R5bGU6bm9uZSI+Ci08bGk+cG9vbCBiZWNvbWVzIGFwX2NvbnRleHRfdDwvbGk+Ci08bGk+dGFibGUgYmVjb21lcyBhcF90YWJsZV90PC9saT4KLTwvdWw+Ci08aHI+Ci0KLTxoMj4KLVRoZSA8ZW0+bWVzc2llcjwvZW0+IGNoYW5nZXMuLi4KLTwvaDI+Ci08aDM+UmVnaXN0ZXIgSG9va3M8L2gzPgotPHA+Ci1UaGUgbmV3IGFyY2hpdGVjdHVyZSB1c2VzIGEgc2VyaWVzIG9mIGhvb2tzIHRvIHByb3ZpZGUgZm9yIGNhbGxpbmcgeW91ciBmdW5jdGlvbnMuICBUaGVzZSB5b3UnbGwgbmVlZCB0byBhZGQgdG8geW91ciBtb2R1bGUgYnkgd2F5IG9mIGEgbmV3IGZ1bmN0aW9uLCBzdGF0aWMgdm9pZCByZWdpc3Rlcl9ob29rcyh2b2lkKS4gIFRoZSBmdW5jdGlvbiBpcyByZWFsbHkgcmVhc29uYWJseSBzdHJhaWdodGZvcndhcmQgb25jZSB5b3UgdW5kZXJzdGFuZCB3aGF0IG5lZWRzIHRvIGJlIGRvbmUuICBFYWNoIGZ1bmN0aW9uIHRoYXQgbmVlZHMgY2FsbGluZyBhdCBzb21lIHN0YWdlIGluIHRoZSBwcm9jZXNzaW5nIG9mIGEgcmVxdWVzdCBuZWVkcyB0byBiZSByZWdpc3RlcmVkLCBoYW5kbGVycyBkbyBub3QuICBUaGVyZSBhcmUgYSBudW1iZXIgb2YgcGhhc2VzIHdoZXJlIGZ1bmN0aW9ucyBjYW4gYmUgYWRkZWQsIGFuZCBmb3IgZWFjaCB5b3UgY2FuIHNwZWNpZnkgd2l0aCBhIGhpZ2ggZGVncmVlIG9mIGNvbnRyb2wgdGhlIHJlbGF0aXZlIG9yZGVyIHRoYXQgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGluLgotPC9wPgotPHA+Ci1UaGlzIGlzIHRoZSBjb2RlIHRoYXQgd2FzIGFkZGVkIHRvIG1vZF9tbWFwX3N0YXRpYwotPC9wPgotPHByZT4KLXN0YXRpYyB2b2lkIHJlZ2lzdGVyX2hvb2tzKHZvaWQpCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhc3pQcmVbXT17ICJodHRwX2NvcmUuYyIsTlVMTCB9OwotICAgIGFwX2hvb2tfcG9zdF9jb25maWcobW1hcF9wb3N0X2NvbmZpZyxOVUxMLE5VTEwsSE9PS19NSURETEUpOwotICAgIGFwX2hvb2tfdHJhbnNsYXRlX25hbWUobW1hcF9zdGF0aWNfeGxhdCxhc3pQcmUsTlVMTCxIT09LX0xBU1QpOwotfTsKLTwvcHJlPgotPHA+Ci1UaGlzIHJlZ2lzdGVycyAyIGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgY2FsbGVkLCBvbmUgaW4gdGhlIHBvc3RfY29uZmlnIHN0YWdlICh2aXJ0dWFsbHkgZXZlcnkgbW9kdWxlIHdpbGwgbmVlZCB0aGlzIG9uZSkgYW5kIG9uZSBmb3IgdGhlIHRyYW5zbGF0ZV9uYW1lIHBoYXNlLiAgbm90ZSB0aGF0IHdoaWxlIHRoZXJlIGFyZSBkaWZmZXJlbnQgZnVuY3Rpb24gbmFtZXMgdGhlIGZvcm1hdCBvZiBlYWNoIGlzIGlkZW50aWNhbC4gIFNvIHdoYXQgaXMgdGhlIGZvcm1hdD8KLTwvcD4KLTxwPjxzdHJvbmc+Ci1hcF9ob29rX1twaGFzZV9uYW1lXShmdW5jdGlvbl9uYW1lLCBwcmVkZWNlc3NvcnMsIHN1Y2Nlc3NvcnMsIHBvc2l0aW9uKTsKLTwvc3Ryb25nPjwvcD4KLTxwPgotVGhlcmUgYXJlIDMgaG9vayBwb3NpdGlvbnMgZGVmaW5lZC4uLgotPC9wPgotPHVsIHN0eWxlPSJsaXN0LXN0eWxlOm5vbmUiPgotPGxpPkhPT0tfRklSU1Q8L2xpPgotPGxpPkhPT0tfTUlERExFPC9saT4KLTxsaT5IT09LX0xBU1Q8L2xpPgotPC91bD4KLTxwPgotVG8gZGVmaW5lIHRoZSBwb3NpdGlvbiB5b3UgdXNlIHRoZSBwb3NpdGlvbiBhbmQgdGhlbiBtb2RpZnkgaXQgd2l0aCB0aGUgcHJlZGVjZXNzb3JzIGFuZCBzdWNjZXNzb3JzLiAgZWFjaCBvZiB0aGUgbW9kaWZpZXJzIGNhbiBiZSBhIGxpc3Qgb2YgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCwgZWl0aGVyIGJlZm9yZSB0aGUgZnVuY3Rpb24gaXMgcnVuIChwcmVkZWNlc3NvcnMpIG9yIGFmdGVyIHRoZSBmdW5jdGlvbiBoYXMgcnVuIChzdWNjZXNzb3JzKS4KLTwvcD4KLTxwPgotSW4gdGhlIG1vZF9tbWFwX3N0YXRpYyBjYXNlIEkgZGlkbid0IGNhcmUgYWJvdXQgdGhlIHBvc3RfY29uZmlnIHN0YWdlLCBidXQgdGhlIG1tYXBfc3RhdGljX3hsYXQgTVVTVCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGNvcmUgbW9kdWxlIGhhZCBkb25lIGl0J3MgbmFtZSB0cmFuc2xhdGlvbiwgaGVuY2UgdGhlIHVzZSBvZiB0aGUgYXN6UHJlIHRvIGRlZmluZSBhIG1vZGlmaWVyIHRvIHRoZSBwb3NpdGlvbiBIT09LX0xBU1QuCi08L3A+Ci08aDM+TW9kdWxlIERlZmluaXRpb248L2gzPgotCi08cD4KLVRoZXJlIGFyZSBub3cgYSBsb3QgZmV3ZXIgc3RhZ2VzIHRvIHdvcnJ5IGFib3V0IHdoZW4gY3JlYXRpbmcgeW91ciBtb2R1bGUgZGVmaW5pdGlvbi4gIFRoZSBvbGQgZGVmaW50aW9uIGxvb2tlZCBsaWtlCi08L3A+Ci08cHJlPgotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIFttb2R1bGVfbmFtZV1fbW9kdWxlID0KLXsKLSAgICBTVEFOREFSRF9NT0RVTEVfU1RVRkYsCi0gICAgLyogaW5pdGlhbGl6ZXIgKi8KLSAgICAvKiBkaXIgY29uZmlnIGNyZWF0ZXIgKi8KLSAgICAvKiBkaXIgbWVyZ2VyIC0tLSBkZWZhdWx0IGlzIHRvIG92ZXJyaWRlICovCi0gICAgLyogc2VydmVyIGNvbmZpZyAqLwotICAgIC8qIG1lcmdlIHNlcnZlciBjb25maWcgKi8KLSAgICAvKiBjb21tYW5kIGhhbmRsZXJzICovCi0gICAgLyogaGFuZGxlcnMgKi8KLSAgICAvKiBmaWxlbmFtZSB0cmFuc2xhdGlvbiAqLwotICAgIC8qIGNoZWNrX3VzZXJfaWQgKi8KLSAgICAvKiBjaGVjayBhdXRoICovCi0gICAgLyogY2hlY2sgYWNjZXNzICovCi0gICAgLyogdHlwZV9jaGVja2VyICovCi0gICAgLyogZml4dXBzICovCi0gICAgLyogbG9nZ2VyICovCi0gICAgLyogaGVhZGVyIHBhcnNlciAqLwotICAgIC8qIGNoaWxkX2luaXQgKi8KLSAgICAvKiBjaGlsZF9leGl0ICovCi0gICAgLyogcG9zdCByZWFkLXJlcXVlc3QgKi8KLX07Ci08L3ByZT4KLTxwPgotVGhlIG5ldyBzdHJ1Y3R1cmUgaXMgYSBncmVhdCBkZWFsIHNpbXBsZXIuLi4KLTwvcD4KLTxwcmU+Ci1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgW21vZHVsZV9uYW1lXV9tb2R1bGUgPQotewotICAgIFNUQU5EQVJEMjBfTU9EVUxFX1NUVUZGLAotICAgIC8qIGNyZWF0ZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgLyogbWVyZ2UgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlcyAgKi8KLSAgICAvKiBjcmVhdGUgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlcyAgICAqLwotICAgIC8qIG1lcmdlIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZXMgICAgICovCi0gICAgLyogY29tbWFuZCBoYW5kbGVycyAqLwotICAgIC8qIGhhbmRsZXJzICovCi0gICAgLyogcmVnaXN0ZXIgaG9va3MgKi8KLSB9OwotPC9wcmU+Ci08cD4KLVNvbWUgb2YgdGhlc2UgcmVhZCBkaXJlY3RseSBhY3Jvc3MsIHNvbWUgZG9uJ3QuICBJJ2xsIHRyeSB0byBzdW1tYXJpc2Ugd2hhdCBzaG91bGQgYmUgZG9uZSBiZWxvdy4KLTwvcD4KLTxwPgotVGhlIHN0YWdlcyB0aGF0IHJlYWQgZGlyZWN0bHkgYWNyb3NzIDoKLTwvcD4KLTx1bCBzdHlsZT0ibGlzdC1zdHlsZTpub25lIj4KLTxsaT4KLS8qIGRpciBjb25maWcgY3JlYXRlciAqLyA9PT4gLyogY3JlYXRlIHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZXMgKi8KLTwvbGk+Ci08bGk+Ci0vKiBzZXJ2ZXIgY29uZmlnICovID09PiAvKiBjcmVhdGUgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlcyAgICAqLwotPC9saT4KLTxsaT4KLS8qIGRpciBtZXJnZXIgKi8gPT0+IC8qIG1lcmdlIHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZXMgICovCi08L2xpPgotPGxpPgotLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLyA9PT4gLyogbWVyZ2UgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlcyAgICAgKi8KLTwvbGk+Ci08bGk+Ci0vKiBjb21tYW5kIHRhYmxlICovID09PiAvKiBjb21tYW5kIGFwX3RhYmxlX3QgKi8KLTwvbGk+Ci08bGk+Ci0vKiBoYW5kbGVycyAqLyA9PT4gLyogaGFuZGxlcnMgKi8KLTwvbGk+Ci08L3VsPgotPFA+Ci1UaGUgcmVtYWluZGVyIG9mIHRoZSBvbGQgZnVuY3Rpb25zIHNob3VsZCBiZSByZWdpc3RlcmVkIGFzIGhvb2tzLiAgVGhlcmUgYXJlIHRoZSBmb2xsb3dpbmcgaG9vayBzdGFnZXMgZGVmaW5lZCBzbyBmYXIuLi4KLTwvUD4KLQotPHVsIHN0eWxlPSJsaXN0LXN0eWxlOm5vbmUiPgotPGxpPgotYXBfaG9va19wb3N0X2NvbmZpZyAgPGVtPih0aGlzIGlzIHdoZXJlIHRoZSBvbGQgX2luaXQgcm91dGluZXMgZ2V0IHJlZ2lzdGVyZWQpPC9lbT4KLTwvbGk+Ci08bGk+Ci1hcF9ob29rX2h0dHBfbWV0aG9kCi08L2xpPgotPGxpPgotYXBfaG9va19vcGVuX2xvZ3MKLTwvbGk+Ci08bGk+Ci1hcF9ob29rX2F1dGhfY2hlY2tlcgotPC9saT4KLTxsaT4KLWFwX2hvb2tfZGVmYXVsdF9wb3J0Ci08L2xpPgotPGxpPgotYXBfaG9va19hY2Nlc3NfY2hlY2tlcgotPC9saT4KLTxsaT4KLWFwX2hvb2tfcHJvY2Vzc19jb25uZWN0aW9uCi08L2xpPgotPGxpPgotYXBfaG9va19jaGlsZF9pbml0X2hvb2sKLTwvbGk+Ci0KLQotPC9ib2R5PgotPC9odG1sPgotCi0KLQotCi0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2Rucy1jYXZlYXRzLmh0bWwgYi9kb2NzL21hbnVhbC9kbnMtY2F2ZWF0cy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmY4YTU3Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2Rucy1jYXZlYXRzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+PEhFQUQ+Ci08VElUTEU+SXNzdWVzIFJlZ2FyZGluZyBETlMgYW5kIEFwYWNoZTwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPklzc3VlcyBSZWdhcmRpbmcgRE5TIGFuZCBBcGFjaGU8L0gxPgotCi08UD5UaGlzIHBhZ2UgY291bGQgYmUgc3VtbWFyaXplZCB3aXRoIHRoZSBzdGF0ZW1lbnQ6IDxFTT5kb24ndCByZXF1aXJlCi1BcGFjaGUgdG8gdXNlIEROUyBmb3IgYW55IHBhcnNpbmcgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXM8L0VNPi4KLUlmIEFwYWNoZSBoYXMgdG8gdXNlIEROUyB0byBwYXJzZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyB0aGVuIHlvdXIKLXNlcnZlciBtYXkgYmUgc3ViamVjdCB0byByZWxpYWJpbGl0eSBwcm9ibGVtcyAoaXQgbWlnaHQgbm90IGJvb3QpLCBvcgotZGVuaWFsIGFuZCB0aGVmdCBvZiBzZXJ2aWNlIGF0dGFja3MgKGluY2x1ZGluZyB1c2VycyBhYmxlIHRvIHN0ZWFsIGhpdHMKLWZyb20gb3RoZXIgdXNlcnMpLgotCi08SDM+QSBTaW1wbGUgRXhhbXBsZTwvSDM+Ci0KLUNvbnNpZGVyIHRoaXMgY29uZmlndXJhdGlvbiBzbmlwcGV0OgotCi08QkxPQ0tRVU9URT48UFJFPgotICAgICZsdDtWaXJ0dWFsSG9zdCB3d3cuYWJjLmRvbSZndDsKLSAgICBTZXJ2ZXJBZG1pbiB3ZWJnaXJsQGFiYy5kb20KLSAgICBEb2N1bWVudFJvb3QgL3d3dy9hYmMKLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotPC9QUkU+PC9CTE9DS1FVT1RFPgotCi08UD5JbiBvcmRlciBmb3IgQXBhY2hlIHRvIGZ1bmN0aW9uIHByb3Blcmx5IGl0IGFic29sdXRlbHkgbmVlZHMKLXRvIGhhdmUgdHdvIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIHZpcnR1YWwgaG9zdDogdGhlCi08QSBIUkVGPSJtb2QvY29yZS5odG1sI3NlcnZlcm5hbWUiPjxDT0RFPlNlcnZlck5hbWU8L0NPREU+PC9BPgotYW5kIGF0IGxlYXN0IG9uZSBJUCBhZGRyZXNzIHRoYXQgdGhlIHNlcnZlcgotcmVzcG9uZHMgdG8uICBUaGlzIGV4YW1wbGUgZG9lcyBub3QgaW5jbHVkZSB0aGUgSVAgYWRkcmVzcywgc28gQXBhY2hlCi1tdXN0IHVzZSBETlMgdG8gZmluZCB0aGUgYWRkcmVzcyBvZiA8Q09ERT53d3cuYWJjLmRvbTwvQ09ERT4uICBJZiBmb3IKLXNvbWUgcmVhc29uIEROUyBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIHlvdXIgc2VydmVyIGlzIHBhcnNpbmcgaXRzCi1jb25maWcgZmlsZSwgdGhlbiB0aGlzIHZpcnR1YWwgaG9zdCA8U1RST05HPndpbGwgbm90IGJlIGNvbmZpZ3VyZWQ8L1NUUk9ORz4uICBJdAotd29uJ3QgYmUgYWJsZSB0byByZXNwb25kIHRvIGFueSBoaXRzIHRvIHRoaXMgdmlydHVhbCBob3N0IChwcmlvciB0bwotQXBhY2hlIHZlcnNpb24gMS4yIHRoZSBzZXJ2ZXIgd291bGQgbm90IGV2ZW4gYm9vdCkuCi0KLTxQPlN1cHBvc2UgdGhhdCA8Q09ERT53d3cuYWJjLmRvbTwvQ09ERT4gaGFzIGFkZHJlc3MgMTAuMC4wLjEuICBUaGVuCi1jb25zaWRlciB0aGlzIGNvbmZpZ3VyYXRpb24gc25pcHBldDoKLQotPEJMT0NLUVVPVEU+PFBSRT4KLSAgICAmbHQ7VmlydHVhbEhvc3QgMTAuMC4wLjEmZ3Q7Ci0gICAgU2VydmVyQWRtaW4gd2ViZ2lybEBhYmMuZG9tCi0gICAgRG9jdW1lbnRSb290IC93d3cvYWJjCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLTwvUFJFPjwvQkxPQ0tRVU9URT4KLQotPFA+Tm93IEFwYWNoZSBuZWVkcyB0byB1c2UgcmV2ZXJzZSBETlMgdG8gZmluZCB0aGUgPENPREU+U2VydmVyTmFtZTwvQ09ERT4KLWZvciB0aGlzIHZpcnR1YWxob3N0LiAgSWYgdGhhdCByZXZlcnNlIGxvb2t1cCBmYWlscyB0aGVuIGl0IHdpbGwgcGFydGlhbGx5Ci1kaXNhYmxlIHRoZSB2aXJ0dWFsaG9zdCAocHJpb3IgdG8gQXBhY2hlIHZlcnNpb24gMS4yIHRoZSBzZXJ2ZXIgd291bGQgbm90Ci1ldmVuIGJvb3QpLiAgSWYgdGhlIHZpcnR1YWwgaG9zdCBpcyBuYW1lLWJhc2VkIHRoZW4gaXQgd2lsbCBlZmZlY3RpdmVseQotYmUgdG90YWxseSBkaXNhYmxlZCwgYnV0IGlmIGl0IGlzIElQLWJhc2VkIHRoZW4gaXQgd2lsbCBtb3N0bHkgd29yay4KLUhvd2V2ZXIgaWYgQXBhY2hlIHNob3VsZCBldmVyIGhhdmUgdG8gZ2VuZXJhdGUgYSBmdWxsIFVSTCBmb3IgdGhlIHNlcnZlcgotd2hpY2ggaW5jbHVkZXMgdGhlIHNlcnZlciBuYW1lIHRoZW4gaXQgd2lsbCBmYWlsIHRvIGdlbmVyYXRlIGEgdmFsaWQgVVJMLgotCi08UD5IZXJlIGlzIGEgc25pcHBldCB0aGF0IGF2b2lkcyBib3RoIG9mIHRoZXNlIHByb2JsZW1zLgotCi08QkxPQ0tRVU9URT48UFJFPgotICAgICZsdDtWaXJ0dWFsSG9zdCAxMC4wLjAuMSZndDsKLSAgICBTZXJ2ZXJOYW1lIHd3dy5hYmMuZG9tCi0gICAgU2VydmVyQWRtaW4gd2ViZ2lybEBhYmMuZG9tCi0gICAgRG9jdW1lbnRSb290IC93d3cvYWJjCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLTwvUFJFPjwvQkxPQ0tRVU9URT4KLQotPEgzPkRlbmlhbCBvZiBTZXJ2aWNlPC9IMz4KLQotPFA+VGhlcmUgYXJlIChhdCBsZWFzdCkgdHdvIGZvcm1zIHRoYXQgZGVuaWFsIG9mIHNlcnZpY2UgY2FuIGNvbWUgaW4uCi1JZiB5b3UgYXJlIHJ1bm5pbmcgYSB2ZXJzaW9uIG9mIEFwYWNoZSBwcmlvciB0byB2ZXJzaW9uIDEuMiB0aGVuIHlvdXIKLXNlcnZlciB3aWxsIG5vdCBldmVuIGJvb3QgaWYgb25lIG9mIHRoZSB0d28gRE5TIGxvb2t1cHMgbWVudGlvbmVkIGFib3ZlCi1mYWlscyBmb3IgYW55IG9mIHlvdXIgdmlydHVhbCBob3N0cy4gIEluIHNvbWUgY2FzZXMgdGhpcyBETlMgbG9va3VwIG1heQotbm90IGV2ZW4gYmUgdW5kZXIgeW91ciBjb250cm9sLiAgRm9yIGV4YW1wbGUsIGlmIDxDT0RFPmFiYy5kb208L0NPREU+Ci1pcyBvbmUgb2YgeW91ciBjdXN0b21lcnMgYW5kIHRoZXkgY29udHJvbCB0aGVpciBvd24gRE5TIHRoZW4gdGhleQotY2FuIGZvcmNlIHlvdXIgKHByZS0xLjIpIHNlcnZlciB0byBmYWlsIHdoaWxlIGJvb3Rpbmcgc2ltcGx5IGJ5IGRlbGV0aW5nIHRoZQotPENPREU+d3d3LmFiYy5kb208L0NPREU+IHJlY29yZC4KLQotPFA+QW5vdGhlciBmb3JtIGlzIGZhciBtb3JlIGluc2lkaW91cy4gIENvbnNpZGVyIHRoaXMgY29uZmlndXJhdGlvbgotc25pcHBldDoKLQotPEJMT0NLUVVPVEU+PFBSRT4KLSAgICAmbHQ7VmlydHVhbEhvc3Qgd3d3LmFiYy5kb20mZ3Q7Ci0gICAgU2VydmVyQWRtaW4gd2ViZ2lybEBhYmMuZG9tCi0gICAgRG9jdW1lbnRSb290IC93d3cvYWJjCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLTwvUFJFPjwvQkxPQ0tRVU9URT4KLQotPEJMT0NLUVVPVEU+PFBSRT4KLSAgICAmbHQ7VmlydHVhbEhvc3Qgd3d3LmRlZi5kb20mZ3Q7Ci0gICAgU2VydmVyQWRtaW4gd2ViZ3V5QGRlZi5kb20KLSAgICBEb2N1bWVudFJvb3QgL3d3dy9kZWYKLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotPC9QUkU+PC9CTE9DS1FVT1RFPgotCi08UD5TdXBwb3NlIHRoYXQgeW91J3ZlIGFzc2lnbmVkIDEwLjAuMC4xIHRvIDxDT0RFPnd3dy5hYmMuZG9tPC9DT0RFPiBhbmQKLTEwLjAuMC4yIHRvIDxDT0RFPnd3dy5kZWYuZG9tPC9DT0RFPi4gIEZ1cnRoZXJtb3JlLCBzdXBwb3NlIHRoYXQKLTxDT0RFPmRlZi5jb208L0NPREU+IGhhcyBjb250cm9sIG9mIHRoZWlyIG93biBETlMuICBXaXRoIHRoaXMgY29uZmlnCi15b3UgaGF2ZSBwdXQgPENPREU+ZGVmLmNvbTwvQ09ERT4gaW50byBhIHBvc2l0aW9uIHdoZXJlIHRoZXkgY2FuIHN0ZWFsCi1hbGwgdHJhZmZpYyBkZXN0aW5lZCB0byA8Q09ERT5hYmMuY29tPC9DT0RFPi4gIFRvIGRvIHNvLCBhbGwgdGhleSBoYXZlIHRvCi1kbyBpcyBzZXQgPENPREU+d3d3LmRlZi5kb208L0NPREU+IHRvIDEwLjAuMC4xLgotU2luY2UgdGhleSBjb250cm9sIHRoZWlyIG93biBETlMgeW91IGNhbid0IHN0b3AgdGhlbSBmcm9tIHBvaW50aW5nIHRoZQotPENPREU+d3d3LmRlZi5jb208L0NPREU+IHJlY29yZCB3aGVyZXZlciB0aGV5IHdpc2guCi0KLTxQPlJlcXVlc3RzIGNvbWluZyBpbiB0byAxMC4wLjAuMSAoaW5jbHVkaW5nIGFsbCB0aG9zZSB3aGVyZSB1c2VycyB0eXBlZAotaW4gVVJMcyBvZiB0aGUgZm9ybSA8Q09ERT5odHRwOi8vd3d3LmFiYy5kb20vd2hhdGV2ZXI8L0NPREU+KSB3aWxsIGFsbCBiZQotc2VydmVkIGJ5IHRoZSA8Q09ERT5kZWYuY29tPC9DT0RFPiB2aXJ0dWFsIGhvc3QuICBUbyBiZXR0ZXIgdW5kZXJzdGFuZCB3aHkKLXRoaXMgaGFwcGVucyByZXF1aXJlcyBhIG1vcmUgaW4tZGVwdGggZGlzY3Vzc2lvbiBvZiBob3cgQXBhY2hlIG1hdGNoZXMKLXVwIGluY29taW5nIHJlcXVlc3RzIHdpdGggdGhlIHZpcnR1YWwgaG9zdCB0aGF0IHdpbGwgc2VydmUgaXQuICBBIHJvdWdoCi1kb2N1bWVudCBkZXNjcmliaW5nIHRoaXMgPEEgSFJFRj0idmhvc3RzL2RldGFpbHMuaHRtbCI+IGlzIGF2YWlsYWJsZTwvQT4uCi0KLTxIMz5UaGUgIm1haW4gc2VydmVyIiBBZGRyZXNzPC9IMz4KLQotPFA+VGhlIGFkZGl0aW9uIG9mIDxBIEhSRUY9InZob3N0cy9uYW1lLWJhc2VkLmh0bWwiPm5hbWUtYmFzZWQgdmlydHVhbCBob3N0Ci1zdXBwb3J0PC9BPiBpbiBBcGFjaGUgMS4xIHJlcXVpcmVzIEFwYWNoZSB0byBrbm93IHRoZSBJUCBhZGRyZXNzKGVzKSBvZgotdGhlIGhvc3QgdGhhdCBodHRwZCBpcyBydW5uaW5nIG9uLiAgVG8gZ2V0IHRoaXMgYWRkcmVzcyBpdCB1c2VzIGVpdGhlcgotdGhlIGdsb2JhbCA8Q09ERT5TZXJ2ZXJOYW1lPC9DT0RFPiAoaWYgcHJlc2VudCkgb3IgY2FsbHMgdGhlIEMgZnVuY3Rpb24KLTxDT0RFPmdldGhvc3RuYW1lPC9DT0RFPiAod2hpY2ggc2hvdWxkIHJldHVybiB0aGUgc2FtZSBhcyB0eXBpbmcKLSJob3N0bmFtZSIgYXQgdGhlIGNvbW1hbmQgcHJvbXB0KS4gIFRoZW4gaXQgcGVyZm9ybXMgYSBETlMgbG9va3VwIG9uCi10aGlzIGFkZHJlc3MuICBBdCBwcmVzZW50IHRoZXJlIGlzIG5vIHdheSB0byBhdm9pZCB0aGlzIGxvb2t1cC4KLQotPFA+SWYgeW91IGZlYXIgdGhhdCB0aGlzIGxvb2t1cCBtaWdodCBmYWlsIGJlY2F1c2UgeW91ciBETlMgc2VydmVyIGlzIGRvd24KLXRoZW4geW91IGNhbiBpbnNlcnQgdGhlIGhvc3RuYW1lIGluIDxDT0RFPi9ldGMvaG9zdHM8L0NPREU+ICh3aGVyZSB5b3UKLXByb2JhYmx5IGFscmVhZHkgaGF2ZSBpdCBzbyB0aGF0IHRoZSBtYWNoaW5lIGNhbiBib290IHByb3Blcmx5KS4gIFRoZW4KLWVuc3VyZSB0aGF0IHlvdXIgbWFjaGluZSBpcyBjb25maWd1cmVkIHRvIHVzZSA8Q09ERT4vZXRjL2hvc3RzPC9DT0RFPgotaW4gdGhlIGV2ZW50IHRoYXQgRE5TIGZhaWxzLiAgRGVwZW5kaW5nIG9uIHdoYXQgT1MgeW91IGFyZSB1c2luZyB0aGlzCi1taWdodCBiZSBhY2NvbXBsaXNoZWQgYnkgZWRpdGluZyA8Q09ERT4vZXRjL3Jlc29sdi5jb25mPC9DT0RFPiwgb3IgbWF5YmUKLTxDT0RFPi9ldGMvbnNzd2l0Y2guY29uZjwvQ09ERT4uCi0KLTxQPklmIHlvdXIgc2VydmVyIGRvZXNuJ3QgaGF2ZSB0byBwZXJmb3JtIEROUyBmb3IgYW55IG90aGVyIHJlYXNvbgotdGhlbiB5b3UgbWlnaHQgYmUgYWJsZSB0byBnZXQgYXdheSB3aXRoIHJ1bm5pbmcgQXBhY2hlIHdpdGggdGhlCi08Q09ERT5IT1NUUkVTT1JERVI8L0NPREU+IGVudmlyb25tZW50IHZhcmlhYmxlIHNldCB0byAibG9jYWwiLiAgVGhpcyBhbGwKLWRlcGVuZHMgb24gd2hhdCBPUyBhbmQgcmVzb2x2ZXIgbGlicmFyaWVzIHlvdSBhcmUgdXNpbmcuICBJdCBhbHNvIGFmZmVjdHMKLUNHSXMgdW5sZXNzIHlvdSB1c2UgPEEgSFJFRj0ibW9kL21vZF9lbnYuaHRtbCI+PENPREU+bW9kX2VudjwvQ09ERT48L0E+Ci10byBjb250cm9sIHRoZSBlbnZpcm9ubWVudC4gIEl0J3MgYmVzdCB0byBjb25zdWx0IHRoZSBtYW4gcGFnZXMgb3IgRkFRcwotZm9yIHlvdXIgT1MuCi0KLTxIMz48QSBOQU1FPSJ0aXBzIj5UaXBzIHRvIEF2b2lkIHRoZXNlIHByb2JsZW1zPC9BPjwvSDM+Ci0KLTxVTD4KLTxMST4gdXNlIElQIGFkZHJlc3NlcyBpbiA8Q09ERT4mbHQ7VmlydHVhbEhvc3QmZ3Q8L0NPREU+Ci08TEk+IHVzZSBJUCBhZGRyZXNzZXMgaW4gPENPREU+TGlzdGVuPC9DT0RFPgotPExJPiB1c2UgSVAgYWRkcmVzc2VzIGluIDxDT0RFPkJpbmRBZGRyZXNzPC9DT0RFPgotPExJPiBlbnN1cmUgYWxsIHZpcnR1YWwgaG9zdHMgaGF2ZSBhbiBleHBsaWNpdCA8Q09ERT5TZXJ2ZXJOYW1lPC9DT0RFPgotPExJPiBjcmVhdGUgYSA8Q09ERT4mbHQ7VmlydHVhbEhvc3QgX2RlZmF1bHRfOiomZ3Q7PC9DT0RFPiBzZXJ2ZXIgdGhhdAotICAgIGhhcyBubyBwYWdlcyB0byBzZXJ2ZQotPC9VTD4KLQotPEgzPkFwcGVuZGl4OiBGdXR1cmUgRGlyZWN0aW9uczwvSDM+Ci0KLTxQPlRoZSBzaXR1YXRpb24gcmVnYXJkaW5nIEROUyBpcyBoaWdobHkgdW5kZXNpcmFibGUuICBGb3IgQXBhY2hlCi0xLjIgd2UndmUgYXR0ZW1wdGVkIHRvIG1ha2UgdGhlIHNlcnZlciBhdCBsZWFzdCBjb250aW51ZSBib290aW5nCi1pbiB0aGUgZXZlbnQgb2YgZmFpbGVkIEROUywgYnV0IGl0IG1pZ2h0IG5vdCBiZSB0aGUgYmVzdCB3ZQotY2FuIGRvLiAgSW4gYW55IGV2ZW50IHJlcXVpcmluZyB0aGUgdXNlIG9mIGV4cGxpY2l0IElQIGFkZHJlc3NlcyBpbgotY29uZmlndXJhdGlvbiBmaWxlcyBpcyBoaWdobHkgdW5kZXNpcmFibGUgaW4gdG9kYXkncyBJbnRlcm5ldCB3aGVyZSA8QQotSFJFRj0iaHR0cDovL3d3dy5pZXRmLm9yZy9odG1sLmNoYXJ0ZXJzL3BpZXItY2hhcnRlci5odG1sIj5yZW51bWJlcmluZwotPC9BPiBpcyBhIG5lY2Vzc2l0eS4KLQotPFA+QSBwb3NzaWJsZSB3b3JrIGFyb3VuZCB0byB0aGUgdGhlZnQgb2Ygc2VydmljZSBhdHRhY2sgZGVzY3JpYmVkIGFib3ZlCi13b3VsZCBiZSB0byBwZXJmb3JtIGEgcmV2ZXJzZSBETlMgbG9va3VwIG9uIHRoZSBpcCBhZGRyZXNzIHJldHVybmVkIGJ5Ci10aGUgZm9yd2FyZCBsb29rdXAgYW5kIGNvbXBhcmUgdGhlIHR3byBuYW1lcy4gIEluIHRoZSBldmVudCBvZiBhIG1pc21hdGNoCi10aGUgdmlydHVhbGhvc3Qgd291bGQgYmUgZGlzYWJsZWQuICBUaGlzIHdvdWxkIHJlcXVpcmUgcmV2ZXJzZSBETlMgdG8gYmUKLWNvbmZpZ3VyZWQgcHJvcGVybHkgKHdoaWNoIGlzIHNvbWV0aGluZyB0aGF0IG1vc3QgYWRtaW5zIGFyZSBmYW1pbGlhciB3aXRoCi1iZWNhdXNlIG9mIHRoZSBjb21tb24gdXNlIG9mICJkb3VibGUtcmV2ZXJzZSIgRE5TIGxvb2t1cHMgYnkgRlRQIHNlcnZlcnMKLWFuZCBUQ1Agd3JhcHBlcnMpLgotCi08UD5JbiBhbnkgZXZlbnQgaXQgZG9lc24ndCBzZWVtIHBvc3NpYmxlIHRvIHJlbGlhYmx5IGJvb3QgYSB2aXJ0dWFsLWhvc3RlZAotd2ViIHNlcnZlciB3aGVuIEROUyBoYXMgZmFpbGVkIHVubGVzcyBJUCBhZGRyZXNzZXMgYXJlIHVzZWQuICBQYXJ0aWFsCi1zb2x1dGlvbnMgc3VjaCBhcyBkaXNhYmxpbmcgcG9ydGlvbnMgb2YgdGhlIGNvbmZpZ3VyYXRpb24gbWlnaHQgYmUgd29yc2UKLXRoYW4gbm90IGJvb3RpbmcgYXQgYWxsIGRlcGVuZGluZyBvbiB3aGF0IHRoZSB3ZWJzZXJ2ZXIgaXMgc3VwcG9zZWQKLXRvIGFjY29tcGxpc2guCi0KLTxQPkFzIEhUVFAvMS4xIGlzIGRlcGxveWVkIGFuZCBicm93c2VycyBhbmQgcHJveGllcyBzdGFydCBpc3N1aW5nIHRoZQotPENPREU+SG9zdDwvQ09ERT4gaGVhZGVyIGl0IHdpbGwgYmVjb21lIHBvc3NpYmxlIHRvIGF2b2lkIHRoZSB1c2Ugb2YKLUlQLWJhc2VkIHZpcnR1YWwgaG9zdHMgZW50aXJlbHkuICBJbiB0aGlzIGV2ZW50IGEgd2Vic2VydmVyIGhhcyBubyByZXF1aXJlbWVudAotdG8gZG8gRE5TIGxvb2t1cHMgZHVyaW5nIGNvbmZpZ3VyYXRpb24uICBCdXQgYXMgb2YgTWFyY2ggMTk5NyB0aGVzZQotZmVhdHVyZXMgaGF2ZSBub3QgYmVlbiBkZXBsb3llZCB3aWRlbHkgZW5vdWdoIHRvIGJlIHB1dCBpbnRvIHVzZSBvbgotY3JpdGljYWwgd2Vic2VydmVycy4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvZHNvLmh0bWwgYi9kb2NzL21hbnVhbC9kc28uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZlNmZjOS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9kc28uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD48SEVBRD4KLTxUSVRMRT5BcGFjaGUgMS4zIER5bmFtaWMgU2hhcmVkIE9iamVjdCAoRFNPKSBzdXBwb3J0PC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTxCTE9DS1FVT1RFPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLQotPERJViBBTElHTj1DRU5URVI+Ci0KLTxIMT4KLUFwYWNoZSAxLjM8QlI+Ci1EeW5hbWljIFNoYXJlZCBPYmplY3QgKERTTyk8QlI+Ci1TdXBwb3J0Ci08L0gxPgotCi08QUREUkVTUz5PcmlnaW5hbGx5IHdyaXR0ZW4gYnk8QlI+Ci1SYWxmIFMuIEVuZ2Vsc2NoYWxsICZsdDtyc2VAYXBhY2hlLm9yZyZndCwgQXByaWwgMTk5ODwvQUREUkVTUz4KLQotPC9ESVY+Ci0KLTxIMz5CYWNrZ3JvdW5kPC9IMz4KLQotPFA+T24gbW9kZXJuIFVuaXggZGVyaXZhdGl2ZXMgdGhlcmUgZXhpc3RzIGEgbmlmdHkgbWVjaGFuaXNtIHVzdWFsbHkgY2FsbGVkCi1keW5hbWljIGxpbmtpbmcvbG9hZGluZyBvZiA8RU0+RHluYW1pYyBTaGFyZWQgT2JqZWN0czwvRU0+IChEU08pIHdoaWNoCi1wcm92aWRlcyBhIHdheSB0byBidWlsZCBhIHBpZWNlIG9mIHByb2dyYW0gY29kZSBpbiBhIHNwZWNpYWwgZm9ybWF0IGZvcgotbG9hZGluZyBpdCBhdCBydW4tdGltZSBpbnRvIHRoZSBhZGRyZXNzIHNwYWNlIG9mIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbS4KLQotPFA+VGhpcyBsb2FkaW5nIGNhbiB1c3VhbGx5IGJlIGRvbmUgaW4gdHdvIHdheXM6IEF1dG9tYXRpY2FsbHkgYnkgYSBzeXN0ZW0KLXByb2dyYW0gY2FsbGVkIDxDT0RFPmxkLnNvPC9DT0RFPiB3aGVuIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbSBpcyBzdGFydGVkIG9yCi1tYW51YWxseSBmcm9tIHdpdGhpbiB0aGUgZXhlY3V0aW5nIHByb2dyYW0gdmlhIGEgcHJvZ3JhbW1hdGljIHN5c3RlbSBpbnRlcmZhY2UKLXRvIHRoZSBVbml4IGxvYWRlciB0aHJvdWdoIHRoZSBzeXN0ZW0gY2FsbHMgPENPREU+ZGxvcGVuKCkvZGxzeW0oKTwvQ09ERT4uCi0gCi08UD5JbiB0aGUgZmlyc3Qgd2F5IHRoZSBEU08ncyBhcmUgdXN1YWxseSBjYWxsZWQgPEVNPnNoYXJlZCBsaWJyYXJpZXM8L0VNPiBvcgotPEVNPkRTTyBsaWJyYXJpZXM8L0VNPiBhbmQgbmFtZWQgPENPREU+bGliZm9vLnNvPC9DT0RFPiBvcgotPENPREU+bGliZm9vLnNvLjEuMjwvQ09ERT4uICBUaGV5IHJlc2lkZSBpbiBhIHN5c3RlbSBkaXJlY3RvcnkgKHVzdWFsbHkKLTxDT0RFPi91c3IvbGliPC9DT0RFPikgYW5kIHRoZSBsaW5rIHRvIHRoZSBleGVjdXRhYmxlIHByb2dyYW0gaXMgZXN0YWJsaXNoZWQKLWF0IGJ1aWxkLXRpbWUgYnkgc3BlY2lmeWluZyA8Q09ERT4tbGZvbzwvQ09ERT4gdG8gdGhlIGxpbmtlciBjb21tYW5kLiBUaGlzCi1oYXJkLWNvZGVzIGxpYnJhcnkgcmVmZXJlbmNlcyBpbnRvIHRoZSBleGVjdXRhYmxlIHByb2dyYW0gZmlsZSBzbyB0aGF0IGF0Ci1zdGFydC10aW1lIHRoZSBVbml4IGxvYWRlciBpcyBhYmxlIHRvIGxvY2F0ZSA8Q09ERT5saWJmb28uc288L0NPREU+IGluCi08Q09ERT4vdXNyL2xpYjwvQ09ERT4sIGluIHBhdGhzIGhhcmQtY29kZWQgdmlhIGxpbmtlci1vcHRpb25zIGxpa2UKLTxDT0RFPi1SPC9DT0RFPiBvciBpbiBwYXRocyBjb25maWd1cmVkIHZpYSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLTxDT0RFPkxEX0xJQlJBUllfUEFUSDwvQ09ERT4uIEl0IHRoZW4gcmVzb2x2ZXMgYW55ICh5ZXQgdW5yZXNvbHZlZCkgc3ltYm9scyBpbgotdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSB3aGljaCBhcmUgYXZhaWxhYmxlIGluIHRoZSBEU08uCi0gCi08UD5TeW1ib2xzIGluIHRoZSBleGVjdXRhYmxlIHByb2dyYW0gYXJlIHVzdWFsbHkgbm90IHJlZmVyZW5jZWQgYnkgdGhlIERTTwotKGJlY2F1c2UgaXQncyBhIHJldXNhYmxlIGxpYnJhcnkgb2YgZ2VuZXJhbCBjb2RlKSBhbmQgaGVuY2Ugbm8gZnVydGhlcgotcmVzb2x2aW5nIGhhcyB0byBiZSBkb25lLiBUaGUgZXhlY3V0YWJsZSBwcm9ncmFtIGhhcyBubyBuZWVkIHRvIGRvIGFueXRoaW5nIG9uCi1pdHMgb3duIHRvIHVzZSB0aGUgc3ltYm9scyBmcm9tIHRoZSBEU08gYmVjYXVzZSB0aGUgY29tcGxldGUgcmVzb2x2aW5nIGlzIGRvbmUKLWJ5IHRoZSBVbml4IGxvYWRlci4gKEluIGZhY3QsIHRoZSBjb2RlIHRvIGludm9rZSA8Q09ERT5sZC5zbzwvQ09ERT4gaXMgcGFydCBvZgotdGhlIHJ1bi10aW1lIHN0YXJ0dXAgY29kZSB3aGljaCBpcyBsaW5rZWQgaW50byBldmVyeSBleGVjdXRhYmxlIHByb2dyYW0gd2hpY2gKLWhhcyBiZWVuIGJvdW5kIG5vbi1zdGF0aWMpLiBUaGUgYWR2YW50YWdlIG9mIGR5bmFtaWMgbG9hZGluZyBvZiBjb21tb24gbGlicmFyeQotY29kZSBpcyBvYnZpb3VzOiB0aGUgbGlicmFyeSBjb2RlIG5lZWRzIHRvIGJlIHN0b3JlZCBvbmx5IG9uY2UsIGluIGEgc3lzdGVtCi1saWJyYXJ5IGxpa2UgPENPREU+bGliYy5zbzwvQ09ERT4sIHNhdmluZyBkaXNrIHNwYWNlIGZvciBldmVyeSBwcm9ncmFtLgotCi08UD5JbiB0aGUgc2Vjb25kIHdheSB0aGUgRFNPJ3MgYXJlIHVzdWFsbHkgY2FsbGVkIDxFTT5zaGFyZWQgb2JqZWN0czwvRU0+IG9yCi08RU0+RFNPIGZpbGVzPC9FTT4gYW5kIGNhbiBiZSBuYW1lZCB3aXRoIGFuIGFyYml0cmFyeSBleHRlbnNpb24gKGFsdGhvdWdoIHRoZQotY2Fub25pY2FsIG5hbWUgaXMgPENPREU+Zm9vLnNvPC9DT0RFPikuIFRoZXNlIGZpbGVzIHVzdWFsbHkgc3RheSBpbnNpZGUgYQotcHJvZ3JhbS1zcGVjaWZpYyBkaXJlY3RvcnkgYW5kIHRoZXJlIGlzIG5vIGF1dG9tYXRpY2FsbHkgZXN0YWJsaXNoZWQgbGluayB0bwotdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSB3aGVyZSB0aGV5IGFyZSB1c2VkLiBJbnN0ZWFkIHRoZSBleGVjdXRhYmxlIHByb2dyYW0KLW1hbnVhbGx5IGxvYWRzIHRoZSBEU08gYXQgcnVuLXRpbWUgaW50byBpdHMgYWRkcmVzcyBzcGFjZSB2aWEKLTxDT0RFPmRsb3BlbigpPC9DT0RFPi4gQXQgdGhpcyB0aW1lIG5vIHJlc29sdmluZyBvZiBzeW1ib2xzIGZyb20gdGhlIERTTyBmb3IKLXRoZSBleGVjdXRhYmxlIHByb2dyYW0gaXMgZG9uZS4gQnV0IGluc3RlYWQgdGhlIFVuaXggbG9hZGVyIGF1dG9tYXRpY2FsbHkKLXJlc29sdmVzIGFueSAoeWV0IHVucmVzb2x2ZWQpIHN5bWJvbHMgaW4gdGhlIERTTyBmcm9tIHRoZSBzZXQgb2Ygc3ltYm9scwotZXhwb3J0ZWQgYnkgdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSBhbmQgaXRzIGFscmVhZHkgbG9hZGVkIERTTyBsaWJyYXJpZXMKLShlc3BlY2lhbGx5IGFsbCBzeW1ib2xzIGZyb20gdGhlIHViaXF1aXRvdXMgPENPREU+bGliYy5zbzwvQ09ERT4pLiAgVGhpcyB3YXkKLXRoZSBEU08gZ2V0cyBrbm93bGVkZ2Ugb2YgdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSdzIHN5bWJvbCBzZXQgYXMgaWYgaXQgaGFkCi1iZWVuIHN0YXRpY2FsbHkgbGlua2VkIHdpdGggaXQgaW4gdGhlIGZpcnN0IHBsYWNlLgotIAotPFA+RmluYWxseSwgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIERTTydzIEFQSSB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtIGhhcyB0bwotcmVzb2x2ZSBwYXJ0aWN1bGFyIHN5bWJvbHMgZnJvbSB0aGUgRFNPIHZpYSA8Q09ERT5kbHN5bSgpPC9DT0RFPiBmb3IgbGF0ZXIgdXNlCi1pbnNpZGUgZGlzcGF0Y2ggdGFibGVzIDxFTT5ldGMuPC9FTT4gSW4gb3RoZXIgd29yZHM6IFRoZSBleGVjdXRhYmxlIHByb2dyYW0gaGFzIHRvCi1tYW51YWxseSByZXNvbHZlIGV2ZXJ5IHN5bWJvbCBpdCBuZWVkcyB0byBiZSBhYmxlIHRvIHVzZSBpdC4gIFRoZSBhZHZhbnRhZ2Ugb2YKLXN1Y2ggYSBtZWNoYW5pc20gaXMgdGhhdCBvcHRpb25hbCBwcm9ncmFtIHBhcnRzIG5lZWQgbm90IGJlIGxvYWRlZCAoYW5kIHRodXMKLWRvIG5vdCBzcGVuZCBtZW1vcnkpIHVudGlsIHRoZXkgYXJlIG5lZWRlZCBieSB0aGUgcHJvZ3JhbSBpbiBxdWVzdGlvbi4gV2hlbgotcmVxdWlyZWQsIHRoZXNlIHByb2dyYW0gcGFydHMgY2FuIGJlIGxvYWRlZCBkeW5hbWljYWxseSB0byBleHRlbmQgdGhlIGJhc2UKLXByb2dyYW0ncyBmdW5jdGlvbmFsaXR5LgotCi08UD5BbHRob3VnaCB0aGlzIERTTyBtZWNoYW5pc20gc291bmRzIHN0cmFpZ2h0Zm9yd2FyZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUKLWRpZmZpY3VsdCBzdGVwIGhlcmU6IFRoZSByZXNvbHZpbmcgb2Ygc3ltYm9scyBmcm9tIHRoZSBleGVjdXRhYmxlIHByb2dyYW0gZm9yCi10aGUgRFNPIHdoZW4gdXNpbmcgYSBEU08gdG8gZXh0ZW5kIGEgcHJvZ3JhbSAodGhlIHNlY29uZCB3YXkpLiBXaHk/IEJlY2F1c2UKLSJyZXZlcnNlIHJlc29sdmluZyIgRFNPIHN5bWJvbHMgZnJvbSB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtJ3Mgc3ltYm9sIHNldCBpcwotYWdhaW5zdCB0aGUgbGlicmFyeSBkZXNpZ24gKHdoZXJlIHRoZSBsaWJyYXJ5IGhhcyBubyBrbm93bGVkZ2UgYWJvdXQgdGhlCi1wcm9ncmFtcyBpdCBpcyB1c2VkIGJ5KSBhbmQgaXMgbmVpdGhlciBhdmFpbGFibGUgdW5kZXIgYWxsIHBsYXRmb3JtcyBub3IKLXN0YW5kYXJkaXplZC4gSW4gcHJhY3RpY2UgdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSdzIGdsb2JhbCBzeW1ib2xzIGFyZSBvZnRlbgotbm90IHJlLWV4cG9ydGVkIGFuZCB0aHVzIG5vdCBhdmFpbGFibGUgZm9yIHVzZSBpbiBhIERTTy4gIEZpbmRpbmcgYSB3YXkgdG8KLWZvcmNlIHRoZSBsaW5rZXIgdG8gZXhwb3J0IGFsbCBnbG9iYWwgc3ltYm9scyBpcyB0aGUgbWFpbiBwcm9ibGVtIG9uZSBoYXMgdG8KLXNvbHZlIHdoZW4gdXNpbmcgRFNPIGZvciBleHRlbmRpbmcgYSBwcm9ncmFtIGF0IHJ1bi10aW1lLgotCi08SDM+UHJhY3RpY2FsIFVzYWdlPC9IMz4KLQotPFA+VGhlIHNoYXJlZCBsaWJyYXJ5IGFwcHJvYWNoIGlzIHRoZSB0eXBpY2FsIG9uZSwgYmVjYXVzZSBpdCBpcyB3aGF0IHRoZSBEU08KLW1lY2hhbmlzbSB3YXMgZGVzaWduZWQgZm9yLCBoZW5jZSBpdCBpcyB1c2VkIGZvciBuZWFybHkgYWxsIHR5cGVzIG9mIGxpYnJhcmllcwotdGhlIG9wZXJhdGluZyBzeXN0ZW0gcHJvdmlkZXMuIE9uIHRoZSBvdGhlciBoYW5kIHVzaW5nIHNoYXJlZCBvYmplY3RzIGZvcgotZXh0ZW5kaW5nIGEgcHJvZ3JhbSBpcyBub3QgdXNlZCBieSBhIGxvdCBvZiBwcm9ncmFtcy4KLQotPFA+QXMgb2YgMTk5OCB0aGVyZSBhcmUgb25seSBhIGZldyBzb2Z0d2FyZSBwYWNrYWdlcyBhdmFpbGFibGUgd2hpY2ggdXNlIHRoZQotRFNPIG1lY2hhbmlzbSB0byBhY3R1YWxseSBleHRlbmQgdGhlaXIgZnVuY3Rpb25hbGl0eSBhdCBydW4tdGltZTogUGVybCA1ICh2aWEKLWl0cyBYUyBtZWNoYW5pc20gYW5kIHRoZSBEeW5hTG9hZGVyIG1vZHVsZSksIE5ldHNjYXBlIFNlcnZlciwgPEVNPmV0Yy48L0VNPiAgU3RhcnRpbmcKLXdpdGggdmVyc2lvbiAxLjMsIEFwYWNoZSBqb2luZWQgdGhlIGNyZXcsIGJlY2F1c2UgQXBhY2hlIGFscmVhZHkgdXNlcyBhIG1vZHVsZQotY29uY2VwdCB0byBleHRlbmQgaXRzIGZ1bmN0aW9uYWxpdHkgYW5kIGludGVybmFsbHkgdXNlcyBhIGRpc3BhdGNoLWxpc3QtYmFzZWQKLWFwcHJvYWNoIHRvIGxpbmsgZXh0ZXJuYWwgbW9kdWxlcyBpbnRvIHRoZSBBcGFjaGUgY29yZSBmdW5jdGlvbmFsaXR5LiBTbywKLUFwYWNoZSBpcyByZWFsbHkgcHJlZGVzdGluZWQgZm9yIHVzaW5nIERTTyB0byBsb2FkIGl0cyBtb2R1bGVzIGF0IHJ1bi10aW1lLgotCi08UD5BcyBvZiBBcGFjaGUgMS4zLCB0aGUgY29uZmlndXJhdGlvbiBzeXN0ZW0gc3VwcG9ydHMgdHdvIG9wdGlvbmFsIGZlYXR1cmVzCi1mb3IgdGFraW5nIGFkdmFudGFnZSBvZiB0aGUgbW9kdWxhciBEU08gYXBwcm9hY2g6IGNvbXBpbGF0aW9uIG9mIHRoZSBBcGFjaGUKLWNvcmUgcHJvZ3JhbSBpbnRvIGEgRFNPIGxpYnJhcnkgZm9yIHNoYXJlZCB1c2FnZSBhbmQgY29tcGlsYXRpb24gb2YgdGhlCi1BcGFjaGUgbW9kdWxlcyBpbnRvIERTTyBmaWxlcyBmb3IgZXhwbGljaXQgbG9hZGluZyBhdCBydW4tdGltZS4KLQotPEgzPkltcGxlbWVudGF0aW9uPC9IMz4KLQotPFA+VGhlIERTTyBzdXBwb3J0IGZvciBsb2FkaW5nIGluZGl2aWR1YWwgQXBhY2hlIG1vZHVsZXMgaXMgYmFzZWQgb24gYSBtb2R1bGUKLW5hbWVkIDxBIEhSRUY9Im1vZC9tb2Rfc28uaHRtbCI+PENPREU+bW9kX3NvLmM8L0NPREU+PC9BPiB3aGljaCBoYXMgdG8gYmUKLXN0YXRpY2FsbHkgY29tcGlsZWQgaW50byB0aGUgQXBhY2hlIGNvcmUuIEl0IGlzIHRoZSBvbmx5IG1vZHVsZSBiZXNpZGVzCi08Q09ERT5odHRwX2NvcmUuYzwvQ09ERT4gd2hpY2ggY2Fubm90IGJlIHB1dCBpbnRvIGEgRFNPIGl0c2VsZgotKGJvb3RzdHJhcHBpbmchKS4gUHJhY3RpY2FsbHkgYWxsIG90aGVyIGRpc3RyaWJ1dGVkIEFwYWNoZSBtb2R1bGVzIHRoZW4gY2FuCi10aGVuIGJlIHBsYWNlZCBpbnRvIGEgRFNPIGJ5IGluZGl2aWR1YWxseSBlbmFibGluZyB0aGUgRFNPIGJ1aWxkIGZvciB0aGVtIHZpYQotPENPREU+Y29uZmlndXJlPC9DT0RFPidzIDxDT0RFPi0tZW5hYmxlLXNoYXJlZDwvQ09ERT4gb3B0aW9uIChzZWUgdG9wLWxldmVsCi08Q09ERT5JTlNUQUxMPC9DT0RFPiBmaWxlKSBvciBieSBjaGFuZ2luZyB0aGUgPENPREU+QWRkTW9kdWxlPC9DT0RFPiBjb21tYW5kCi1pbiB5b3VyIDxDT0RFPnNyYy9Db25maWd1cmF0aW9uPC9DT0RFPiBpbnRvIGEgPENPREU+U2hhcmVkTW9kdWxlPC9DT0RFPgotY29tbWFuZCAoc2VlIDxDT0RFPnNyYy9JTlNUQUxMPC9DT0RFPiBmaWxlKS4gIEFmdGVyIGEgbW9kdWxlIGlzIGNvbXBpbGVkIGludG8KLWEgRFNPIG5hbWVkIDxDT0RFPm1vZF9mb28uc288L0NPREU+IHlvdSBjYW4gdXNlIDxBCi1IUkVGPSJtb2QvbW9kX3NvLmh0bWwiPjxDT0RFPm1vZF9zbzwvQ09ERT48L0E+J3MgPEEKLUhSRUY9Im1vZC9tb2Rfc28uaHRtbCNsb2FkbW9kdWxlIj48Q09ERT5Mb2FkTW9kdWxlPC9DT0RFPjwvQT4gY29tbWFuZCBpbiB5b3VyCi08Q09ERT5odHRwZC5jb25mPC9DT0RFPiBmaWxlIHRvIGxvYWQgdGhpcyBtb2R1bGUgYXQgc2VydmVyIHN0YXJ0dXAgb3IgcmVzdGFydC4KLQotPFA+VG8gc2ltcGxpZnkgdGhpcyBjcmVhdGlvbiBvZiBEU08gZmlsZXMgZm9yIEFwYWNoZSBtb2R1bGVzIChlc3BlY2lhbGx5IGZvcgotdGhpcmQtcGFydHkgbW9kdWxlcykgYSBuZXcgc3VwcG9ydCBwcm9ncmFtIG5hbWVkIDxDT0RFPmFweHM8L0NPREU+ICg8RU0+QVBhY2hlCi1lWHRlblNpb248L0VNPikgaXMgYXZhaWxhYmxlLiBJdCBjYW4gYmUgdXNlZCB0byBidWlsZCBEU08gYmFzZWQgbW9kdWxlcwotPEVNPm91dHNpZGUgb2Y8L0VNPiB0aGUgQXBhY2hlIHNvdXJjZSB0cmVlLiBUaGUgaWRlYSBpcyBzaW1wbGU6IFdoZW4KLWluc3RhbGxpbmcgQXBhY2hlIHRoZSA8Q09ERT5jb25maWd1cmU8L0NPREU+J3MgPENPREU+bWFrZSBpbnN0YWxsPC9DT0RFPgotcHJvY2VkdXJlIGluc3RhbGxzIHRoZSBBcGFjaGUgQyBoZWFkZXIgZmlsZXMgYW5kIHB1dHMgdGhlIHBsYXRmb3JtLWRlcGVuZGVudAotY29tcGlsZXIgYW5kIGxpbmtlciBmbGFncyBmb3IgYnVpbGRpbmcgRFNPIGZpbGVzIGludG8gdGhlIDxDT0RFPmFweHM8L0NPREU+Ci1wcm9ncmFtLiAgVGhpcyB3YXkgdGhlIHVzZXIgY2FuIHVzZSA8Q09ERT5hcHhzPC9DT0RFPiB0byBjb21waWxlIGhpcyBBcGFjaGUKLW1vZHVsZSBzb3VyY2VzIHdpdGhvdXQgdGhlIEFwYWNoZSBkaXN0cmlidXRpb24gc291cmNlIHRyZWUgYW5kIHdpdGhvdXQgaGF2aW5nCi10byBmaWRkbGUgd2l0aCB0aGUgcGxhdGZvcm0tZGVwZW5kZW50IGNvbXBpbGVyIGFuZCBsaW5rZXIgZmxhZ3MgZm9yIERTTwotc3VwcG9ydC4KLQotPFA+VG8gcGxhY2UgdGhlIGNvbXBsZXRlIEFwYWNoZSBjb3JlIHByb2dyYW0gaW50byBhIERTTyBsaWJyYXJ5IChvbmx5IHJlcXVpcmVkCi1vbiBzb21lIG9mIHRoZSBzdXBwb3J0ZWQgcGxhdGZvcm1zIHRvIGZvcmNlIHRoZSBsaW5rZXIgdG8gZXhwb3J0IHRoZSBhcGFjaGUKLWNvcmUgc3ltYm9scyAtLSBhIHByZXJlcXVpc2l0ZSBmb3IgdGhlIERTTyBtb2R1bGFyaXphdGlvbikgdGhlIHJ1bGUKLTxDT0RFPlNIQVJFRF9DT1JFPC9DT0RFPiBoYXMgdG8gYmUgZW5hYmxlZCB2aWEgPENPREU+Y29uZmlndXJlPC9DT0RFPidzCi08Q09ERT4tLWVuYWJsZS1ydWxlPVNIQVJFRF9DT1JFPC9DT0RFPiBvcHRpb24gKHNlZSB0b3AtbGV2ZWwKLTxDT0RFPklOU1RBTEw8L0NPREU+IGZpbGUpIG9yIGJ5IGNoYW5naW5nIHRoZSA8Q09ERT5SdWxlPC9DT0RFPiBjb21tYW5kIGluCi15b3VyIDxDT0RFPkNvbmZpZ3VyYXRpb248L0NPREU+IGZpbGUgdG8gPENPREU+UnVsZSBTSEFSRURfQ09SRT15ZXM8L0NPREU+IChzZWUKLTxDT0RFPnNyYy9JTlNUQUxMPC9DT0RFPiBmaWxlKS4gVGhlIEFwYWNoZSBjb3JlIGNvZGUgaXMgdGhlbiBwbGFjZWQgaW50byBhIERTTwotbGlicmFyeSBuYW1lZCA8Q09ERT5saWJodHRwZC5zbzwvQ09ERT4uIEJlY2F1c2Ugb25lIGNhbm5vdCBsaW5rIGEgRFNPIGFnYWluc3QKLXN0YXRpYyBsaWJyYXJpZXMgb24gYWxsIHBsYXRmb3JtcywgYW4gYWRkaXRpb25hbCBleGVjdXRhYmxlIHByb2dyYW0gbmFtZWQKLTxDT0RFPmxpYmh0dHBkLmVwPC9DT0RFPiBpcyBjcmVhdGVkIHdoaWNoIGJvdGggYmluZHMgdGhpcyBzdGF0aWMgY29kZSBhbmQKLXByb3ZpZGVzIGEgc3R1YiBmb3IgdGhlIDxDT0RFPm1haW4oKTwvQ09ERT4gZnVuY3Rpb24uICBGaW5hbGx5IHRoZQotPENPREU+aHR0cGQ8L0NPREU+IGV4ZWN1dGFibGUgcHJvZ3JhbSBpdHNlbGYgaXMgcmVwbGFjZWQgYnkgYSBib290c3RyYXBwaW5nCi1jb2RlIHdoaWNoIGF1dG9tYXRpY2FsbHkgbWFrZXMgc3VyZSB0aGUgVW5peCBsb2FkZXIgaXMgYWJsZSB0byBsb2FkIGFuZCBzdGFydAotPENPREU+bGliaHR0cGQuZXA8L0NPREU+IGJ5IHByb3ZpZGluZyB0aGUgPENPREU+TERfTElCUkFSWV9QQVRIPC9DT0RFPiB0bwotPENPREU+bGliaHR0cGQuc288L0NPREU+LgotCi08SDM+U3VwcG9ydGVkIFBsYXRmb3JtczwvSDM+Ci0KLTxQPkFwYWNoZSdzIDxDT0RFPnNyYy9Db25maWd1cmU8L0NPREU+IHNjcmlwdCBjdXJyZW50bHkgaGFzIG9ubHkgbGltaXRlZCBidXQKLWFkZXF1YXRlIGJ1aWx0LWluIGtub3dsZWRnZSBvbiBob3cgdG8gY29tcGlsZSBEU08gZmlsZXMsIGJlY2F1c2UgYXMgYWxyZWFkeQotbWVudGlvbmVkIHRoaXMgaXMgaGVhdmlseSBwbGF0Zm9ybS1kZXBlbmRlbnQuIE5ldmVydGhlbGVzcyBhbGwgbWFqb3IgVW5peAotcGxhdGZvcm1zIGFyZSBzdXBwb3J0ZWQuICBUaGUgZGVmaW5pdGl2ZSBjdXJyZW50IHN0YXRlIChNYXkgMTk5OSkgaXMgdGhpczoKLQotPFA+Ci08VUw+Ci08TEk+T3V0LW9mLXRoZS1ib3ggc3VwcG9ydGVkIHBsYXRmb3Jtczo8QlI+Ci0oYWN0dWFsbHkgdGVzdGVkIHZlcnNpb25zIGluIHBhcmVudGhlc2lzKQotCi08UFJFPgotbyAgRnJlZUJTRCAgICAgICAgICAgICgyLjEuNSwgMi4yLngsIDMueCwgNC54KQotbyAgT3BlbkJTRCAgICAgICAgICAgICgyLngpCi1vICBOZXRCU0QgICAgICAgICAgICAgKDEuMy4xKQotbyAgQlNESSAgICAgICAgICAgICAgICgzLngsIDQueCkKLW8gIExpbnV4ICAgICAgICAgICAgICAoRGViaWFuLzEuMy4xLCBSZWRIYXQvNC4yKQotbyAgU29sYXJpcyAgICAgICAgICAgICgyLjQsIDIuNSwgMi42LCAyLjcpCi1vICBTdW5PUyAgICAgICAgICAgICAgKDQuMS4zKQotbyAgRGlnaXRhbCBVTklYICAgICAgICg0LjApCi1vICBJUklYICAgICAgICAgICAgICAgKDUuMywgNi4yKQotbyAgSFAvVVggICAgICAgICAgICAgICgxMC4yMCkKLW8gIFVuaXhXYXJlICAgICAgICAgICAoMi4wMSwgMi4xLjIpCi1vICBTQ08gICAgICAgICAgICAgICAgKDUuMC40KQotbyAgQUlYICAgICAgICAgICAgICAgICgzLjIsIDQuMS41LCA0LjIsIDQuMykKLW8gIFJlbGlhbnRVTklYL1NJTklYICAoNS40MykKLW8gIFNWUjQgICAgICAgICAgICAgICAoLSkKLW8gIE1hYyBPUyBYIFNlcnZlciAgICAoMS4wKQotbyAgTWFjIE9TICAgICAgICAgICAgICgxMC4wIHByZXZpZXcgMSkKLW8gIE9wZW5TdGVwL01hY2ggICAgICAoNC4yKQotbyAgREdVWCAgICAgICAgICAgICAgICg/PykKLW8gIE5ldFdhcmUgICAgICAgICAgICAoNS4xKQotPC9QUkU+Ci0KLTxQPgotPExJPiBFeHBsaWNpdGx5IHVuc3VwcG9ydGVkIHBsYXRmb3JtczoKLQotPFBSRT4KLW8gIFVsdHJpeCAgICAgICAgICAgICAobm8gZGxvcGVuLXN0eWxlIGludGVyZmFjZSB1bmRlciB0aGlzIHBsYXRmb3JtKQotPC9QUkU+Ci0KLTwvVUw+Ci0KLTxIMz5Vc2FnZSBTdW1tYXJ5PC9IMz4KLQotPFA+VG8gZ2l2ZSB5b3UgYW4gb3ZlcnZpZXcgb2YgdGhlIERTTyBmZWF0dXJlcyBvZiBBcGFjaGUgMS4zLCBoZXJlIGlzIGEgc2hvcnQKLWFuZCBjb25jaXNlIHN1bW1hcnk6Ci0KLTxPTD4KLQotPExJPlBsYWNpbmcgdGhlIEFwYWNoZSBjb3JlIGNvZGUgKGFsbCB0aGUgc3R1ZmYgd2hpY2ggdXN1YWxseSBmb3JtcyB0aGUKLTxDT0RFPmh0dHBkPC9DT0RFPiBiaW5hcnkpIGludG8gYSBEU08gPENPREU+bGliaHR0cGQuc288L0NPREU+LCBhbiBleGVjdXRhYmxlCi1wcm9ncmFtIDxDT0RFPmxpYmh0dHBkLmVwPC9DT0RFPiBhbmQgYSBib290c3RyYXBwaW5nIGV4ZWN1dGFibGUgcHJvZ3JhbQotPENPREU+aHR0cGQ8L0NPREU+IChOb3RpY2U6IHRoaXMgaXMgb25seSByZXF1aXJlZCBvbiBzb21lIG9mIHRoZSBzdXBwb3J0ZWQKLXBsYXRmb3JtcyB0byBmb3JjZSB0aGUgbGlua2VyIHRvIGV4cG9ydCB0aGUgQXBhY2hlIGNvcmUgc3ltYm9scywgd2hpY2ggaW4gdHVybgotaXMgYSBwcmVyZXF1aXNpdGUgZm9yIHRoZSBEU08gbW9kdWxhcml6YXRpb24pOgotCi08UD4KLTxVTD4KLTxMST5CdWlsZCBhbmQgaW5zdGFsbCB2aWEgPENPREU+Y29uZmlndXJlPC9DT0RFPiAocHJlZmVycmVkKToKLTxUQUJMRSBCR0NPTE9SPSIjZjBmMGYwIiBDRUxMUEFERElORz0xMD48VFI+PFREPgotPFBSRT4KLSQgLi9jb25maWd1cmUgLS1wcmVmaXg9L3BhdGgvdG8vaW5zdGFsbAotICAgICAgICAgICAgICAtLWVuYWJsZS1ydWxlPVNIQVJFRF9DT1JFIC4uLgotJCBtYWtlIGluc3RhbGwKLTwvUFJFPgotPC9URD48L1RSPjwvVEFCTEU+Ci0KLTxMST5CdWlsZCBhbmQgaW5zdGFsbCBtYW51YWxseTogCi08VEFCTEUgQkdDT0xPUj0iI2YwZjBmMCIgQ0VMTFBBRERJTkc9MTA+PFRSPjxURD4KLTxQUkU+Ci0tIEVkaXQgc3JjL0NvbmZpZ3VyYXRpb246Ci0gICZsdDsmbHQ7IFJ1bGUgU0hBUkVEX0NPUkU9ZGVmYXVsdAotICAmZ3Q7Jmd0OyBSdWxlIFNIQVJFRF9DT1JFPXllcwotICAmbHQ7Jmx0OyBFWFRSQV9DRkxBR1M9IAotICAmZ3Q7Jmd0OyBFWFRSQV9DRkxBR1M9IC1EU0hBUkVEX0NPUkVfRElSPVwiL3BhdGgvdG8vaW5zdGFsbC9saWJleGVjXCIKLSQgbWFrZSAKLSQgY3Agc3JjL2xpYmh0dHBkLnNvKiAvcGF0aC90by9pbnN0YWxsL2xpYmV4ZWMvCi0kIGNwIHNyYy9saWJodHRwZC5lcCAgL3BhdGgvdG8vaW5zdGFsbC9saWJleGVjLwotJCBjcCBzcmMvaHR0cGQgICAgICAgIC9wYXRoL3RvL2luc3RhbGwvYmluLwotPC9QUkU+ICAgIAotPC9URD48L1RSPjwvVEFCTEU+Ci08L1VMPgotCi08TEk+QnVpbGQgYW5kIGluc3RhbGwgYSA8RU0+ZGlzdHJpYnV0ZWQ8L0VNPiBBcGFjaGUgbW9kdWxlLCBzYXkKLTxDT0RFPm1vZF9mb28uYzwvQ09ERT4sIGludG8gaXRzIG93biBEU08gPENPREU+bW9kX2Zvby5zbzwvQ09ERT46Ci0KLTxQPgotPFVMPgotPExJPkJ1aWxkIGFuZCBpbnN0YWxsIHZpYSA8Q09ERT5jb25maWd1cmU8L0NPREU+IChwcmVmZXJyZWQpOgotPFRBQkxFIEJHQ09MT1I9IiNmMGYwZjAiIENFTExQQURESU5HPTEwPjxUUj48VEQ+Ci08UFJFPgotJCAuL2NvbmZpZ3VyZSAtLXByZWZpeD0vcGF0aC90by9pbnN0YWxsCi0gICAgICAgIC0tZW5hYmxlLXNoYXJlZD1mb28KLSQgbWFrZSBpbnN0YWxsCi08L1BSRT4KLTwvVEQ+PC9UUj48L1RBQkxFPgotCi08TEk+QnVpbGQgYW5kIGluc3RhbGwgbWFudWFsbHk6IAotPFRBQkxFIEJHQ09MT1I9IiNmMGYwZjAiIENFTExQQURESU5HPTEwPjxUUj48VEQ+Ci08UFJFPgotLSBFZGl0IHNyYy9Db25maWd1cmF0aW9uOgotICAmbHQ7Jmx0OyBBZGRNb2R1bGUgICAgbW9kdWxlcy94eHh4L21vZF9mb28ubwotICAmZ3Q7Jmd0OyBTaGFyZWRNb2R1bGUgbW9kdWxlcy94eHh4L21vZF9mb28uc28KLSQgbWFrZQotJCBjcCBzcmMveHh4eC9tb2RfZm9vLnNvIC9wYXRoL3RvL2luc3RhbGwvbGliZXhlYwotLSBFZGl0IC9wYXRoL3RvL2luc3RhbGwvZXRjL2h0dHBkLmNvbmYKLSAgJmd0OyZndDsgTG9hZE1vZHVsZSBmb29fbW9kdWxlIC9wYXRoL3RvL2luc3RhbGwvbGliZXhlYy9tb2RfZm9vLnNvCi08L1BSRT4KLTwvVEQ+PC9UUj48L1RBQkxFPgotPC9VTD4KLQotPExJPkJ1aWxkIGFuZCBpbnN0YWxsIGEgPEVNPnRoaXJkLXBhcnR5PC9FTT4gQXBhY2hlIG1vZHVsZSwgc2F5Ci08Q09ERT5tb2RfZm9vLmM8L0NPREU+LCBpbnRvIGl0cyBvd24gRFNPIDxDT0RFPm1vZF9mb28uc288L0NPREU+Ci0KLTxQPgotPFVMPgotPExJPkJ1aWxkIGFuZCBpbnN0YWxsIHZpYSA8Q09ERT5jb25maWd1cmU8L0NPREU+IChwcmVmZXJyZWQpOgotPFRBQkxFIEJHQ09MT1I9IiNmMGYwZjAiIENFTExQQURESU5HPTEwPjxUUj48VEQ+Ci08UFJFPgotJCAuL2NvbmZpZ3VyZSAtLWFkZC1tb2R1bGU9L3BhdGgvdG8vM3JkcGFydHkvbW9kX2Zvby5jIAotICAgICAgICAtLWVuYWJsZS1zaGFyZWQ9Zm9vCi0kIG1ha2UgaW5zdGFsbAotPC9QUkU+Ci08L1REPjwvVFI+PC9UQUJMRT4KLQotPExJPkJ1aWxkIGFuZCBpbnN0YWxsIG1hbnVhbGx5OiAKLTxUQUJMRSBCR0NPTE9SPSIjZjBmMGYwIiBDRUxMUEFERElORz0xMD48VFI+PFREPgotPFBSRT4KLSQgY3AgL3BhdGgvdG8vM3JkcGFydHkvbW9kX2Zvby5jIC9wYXRoL3RvL2FwYWNoZS0xLjMvc3JjL21vZHVsZXMvZXh0cmEvCi0tIEVkaXQgc3JjL0NvbmZpZ3VyYXRpb246Ci0gICZndDsmZ3Q7IFNoYXJlZE1vZHVsZSBtb2R1bGVzL2V4dHJhL21vZF9mb28uc28KLSQgbWFrZQotJCBjcCBzcmMveHh4eC9tb2RfZm9vLnNvIC9wYXRoL3RvL2luc3RhbGwvbGliZXhlYwotLSBFZGl0IC9wYXRoL3RvL2luc3RhbGwvZXRjL2h0dHBkLmNvbmYKLSAgJmd0OyZndDsgTG9hZE1vZHVsZSBmb29fbW9kdWxlIC9wYXRoL3RvL2luc3RhbGwvbGliZXhlYy9tb2RfZm9vLnNvCi08L1BSRT4KLTwvVEQ+PC9UUj48L1RBQkxFPgotPC9VTD4KLQotPFA+Ci08TEk+QnVpbGQgYW5kIGluc3RhbGwgYSA8RU0+dGhpcmQtcGFydHk8L0VNPiBBcGFjaGUgbW9kdWxlLCBzYXkKLTxDT0RFPm1vZF9mb28uYzwvQ09ERT4sIGludG8gaXRzIG93biBEU08gPENPREU+bW9kX2Zvby5zbzwvQ09ERT4gPEVNPm91dHNpZGUKLW9mPC9FTT4gdGhlIEFwYWNoZSBzb3VyY2UgdHJlZToKLQotPFA+Ci08VUw+Ci08TEk+QnVpbGQgYW5kIGluc3RhbGwgdmlhIDxDT0RFPmFweHM8L0NPREU+OiAKLTxUQUJMRSBCR0NPTE9SPSIjZjBmMGYwIiBDRUxMUEFERElORz0xMD48VFI+PFREPgotPFBSRT4KLSQgY2QgL3BhdGgvdG8vM3JkcGFydHkKLSQgYXB4cyAtYyBtb2RfZm9vLmMKLSQgYXB4cyAtaSAtYSAtbiBmb28gbW9kX2Zvby5zbwotPC9QUkU+Ci08L1REPjwvVFI+PC9UQUJMRT4KLTwvVUw+Ci0KLTwvT0w+Ci0KLTxIMz5BZHZhbnRhZ2VzICYgRGlzYWR2YW50YWdlczwvSDM+Ci0KLTxQPlRoZSBhYm92ZSBEU08gYmFzZWQgZmVhdHVyZXMgb2YgQXBhY2hlIDEuMyBoYXZlIHRoZSBmb2xsb3dpbmcgYWR2YW50YWdlczoKLQotPFVMPgotPExJPiBUaGUgc2VydmVyIHBhY2thZ2UgaXMgbW9yZSBmbGV4aWJsZSBhdCBydW4tdGltZSBiZWNhdXNlIHRoZSBhY3R1YWwgc2VydmVyCi0gICAgIHByb2Nlc3MgY2FuIGJlIGFzc2VtYmxlZCBhdCBydW4tdGltZSB2aWEgPEEKLSAgICAgSFJFRj0ibW9kL21vZF9zby5odG1sI2xvYWRtb2R1bGUiPjxDT0RFPkxvYWRNb2R1bGU8L0NPREU+PC9BPgotICAgICA8Q09ERT5odHRwZC5jb25mPC9DT0RFPiBjb25maWd1cmF0aW9uIGNvbW1hbmRzIGluc3RlYWQgb2YKLSAgICAgPENPREU+Q29uZmlndXJhdGlvbjwvQ09ERT4gPENPREU+QWRkTW9kdWxlPC9DT0RFPiBjb21tYW5kcyBhdCBidWlsZC10aW1lLgotICAgICBGb3IgaW5zdGFuY2UgdGhpcyB3YXkgb25lIGlzIGFibGUgdG8gcnVuIGRpZmZlcmVudCBzZXJ2ZXIgaW5zdGFuY2VzCi0gICAgIChzdGFuZGFyZCAmYW1wOyBTU0wgdmVyc2lvbiwgbWluaW1hbGlzdGljICZhbXA7IHBvd2VyZWQgdXAgdmVyc2lvbgotICAgICBbbW9kX3BlcmwsIFBIUDNdLCA8RU0+ZXRjLjwvRU0+KSB3aXRoIG9ubHkgb25lIEFwYWNoZSBpbnN0YWxsYXRpb24uCi08UD4KLTxMST4gVGhlIHNlcnZlciBwYWNrYWdlIGNhbiBiZSBlYXNpbHkgZXh0ZW5kZWQgd2l0aCB0aGlyZC1wYXJ0eSBtb2R1bGVzIGV2ZW4KLSAgICAgYWZ0ZXIgaW5zdGFsbGF0aW9uLiBUaGlzIGlzIGF0IGxlYXN0IGEgZ3JlYXQgYmVuZWZpdCBmb3IgdmVuZG9yIHBhY2thZ2UKLSAgICAgbWFpbnRhaW5lcnMgd2hvIGNhbiBjcmVhdGUgYSBBcGFjaGUgY29yZSBwYWNrYWdlIGFuZCBhZGRpdGlvbmFsIHBhY2thZ2VzCi0gICAgIGNvbnRhaW5pbmcgZXh0ZW5zaW9ucyBsaWtlIFBIUDMsIG1vZF9wZXJsLCBtb2RfZmFzdGNnaSwgPEVNPmV0Yy48L0VNPgotPFA+Ci08TEk+IEVhc2llciBBcGFjaGUgbW9kdWxlIHByb3RvdHlwaW5nIGJlY2F1c2Ugd2l0aCB0aGUgRFNPLzxDT0RFPmFweHM8L0NPREU+Ci0gICAgIHBhaXIgeW91IGNhbiBib3RoIHdvcmsgb3V0c2lkZSB0aGUgQXBhY2hlIHNvdXJjZSB0cmVlIGFuZCBvbmx5IG5lZWQgYW4KLSAgICAgPENPREU+YXB4cyAtaTwvQ09ERT4gY29tbWFuZCBmb2xsb3dlZCBieSBhbiA8Q09ERT5hcGFjaGVjdGwKLSAgICAgcmVzdGFydDwvQ09ERT4gdG8gYnJpbmcgYSBuZXcgdmVyc2lvbiBvZiB5b3VyIGN1cnJlbnRseSBkZXZlbG9wZWQgbW9kdWxlCi0gICAgIGludG8gdGhlIHJ1bm5pbmcgQXBhY2hlIHNlcnZlci4KLTwvVUw+Ci0KLTxQPkRTTyBoYXMgdGhlIGZvbGxvd2luZyBkaXNhZHZhbnRhZ2VzOgotCi08VUw+Ci08TEk+IFRoZSBEU08gbWVjaGFuaXNtIGNhbm5vdCBiZSB1c2VkIG9uIGV2ZXJ5IHBsYXRmb3JtIGJlY2F1c2Ugbm90IGFsbAotICAgICBvcGVyYXRpbmcgc3lzdGVtcyBzdXBwb3J0IGR5bmFtaWMgbG9hZGluZyBvZiBjb2RlIGludG8gdGhlIGFkZHJlc3Mgc3BhY2UKLSAgICAgb2YgYSBwcm9ncmFtLgotPFA+Ci08TEk+IFRoZSBzZXJ2ZXIgaXMgYXBwcm94aW1hdGVseSAyMCUgc2xvd2VyIGF0IHN0YXJ0dXAgdGltZSBiZWNhdXNlIG9mIHRoZQotICAgICBzeW1ib2wgcmVzb2x2aW5nIG92ZXJoZWFkIHRoZSBVbml4IGxvYWRlciBub3cgaGFzIHRvIGRvLgotPFA+Ci08TEk+IFRoZSBzZXJ2ZXIgaXMgYXBwcm94aW1hdGVseSA1JSBzbG93ZXIgYXQgZXhlY3V0aW9uIHRpbWUgdW5kZXIgc29tZQotICAgICBwbGF0Zm9ybXMgYmVjYXVzZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIChQSUMpIHNvbWV0aW1lcyBuZWVkcwotICAgICBjb21wbGljYXRlZCBhc3NlbWJsZXIgdHJpY2tzIGZvciByZWxhdGl2ZSBhZGRyZXNzaW5nIHdoaWNoIGFyZSBub3QKLSAgICAgbmVjZXNzYXJpbHkgYXMgZmFzdCBhcyBhYnNvbHV0ZSBhZGRyZXNzaW5nLgotPFA+Ci08TEk+IEJlY2F1c2UgRFNPIG1vZHVsZXMgY2Fubm90IGJlIGxpbmtlZCBhZ2FpbnN0IG90aGVyIERTTy1iYXNlZCBsaWJyYXJpZXMKLSAgICAgKDxDT0RFPmxkIC1sZm9vPC9DT0RFPikgb24gYWxsIHBsYXRmb3JtcyAoZm9yIGluc3RhbmNlIGEub3V0LWJhc2VkCi0gICAgIHBsYXRmb3JtcyB1c3VhbGx5IGRvbid0IHByb3ZpZGUgdGhpcyBmdW5jdGlvbmFsaXR5IHdoaWxlIEVMRi1iYXNlZAotICAgICBwbGF0Zm9ybXMgZG8pIHlvdSBjYW5ub3QgdXNlIHRoZSBEU08gbWVjaGFuaXNtIGZvciBhbGwgdHlwZXMgb2YgbW9kdWxlcy4KLSAgICAgT3IgaW4gb3RoZXIgd29yZHMsIG1vZHVsZXMgY29tcGlsZWQgYXMgRFNPIGZpbGVzIGFyZSByZXN0cmljdGVkIHRvIG9ubHkKLSAgICAgdXNlIHN5bWJvbHMgZnJvbSB0aGUgQXBhY2hlIGNvcmUsIGZyb20gdGhlIEMgbGlicmFyeSAoPENPREU+bGliYzwvQ09ERT4pCi0gICAgIGFuZCBhbGwgb3RoZXIgZHluYW1pYyBvciBzdGF0aWMgbGlicmFyaWVzIHVzZWQgYnkgdGhlIEFwYWNoZSBjb3JlLCBvcgotICAgICBmcm9tIHN0YXRpYyBsaWJyYXJ5IGFyY2hpdmVzICg8Q09ERT5saWJmb28uYTwvQ09ERT4pIGNvbnRhaW5pbmcgcG9zaXRpb24KLSAgICAgaW5kZXBlbmRlbnQgY29kZS4gVGhlIG9ubHkgY2hhbmNlcyB0byB1c2Ugb3RoZXIgY29kZSBpcyB0byBlaXRoZXIgbWFrZQotICAgICBzdXJlIHRoZSBBcGFjaGUgY29yZSBpdHNlbGYgYWxyZWFkeSBjb250YWlucyBhIHJlZmVyZW5jZSB0byBpdCwgbG9hZGluZwotICAgICB0aGUgY29kZSB5b3Vyc2VsZiB2aWEgPENPREU+ZGxvcGVuKCk8L0NPREU+IG9yIGVuYWJsaW5nIHRoZQotICAgICA8Q09ERT5TSEFSRURfQ0hBSU48L0NPREU+IHJ1bGUgd2hpbGUgYnVpbGRpbmcgQXBhY2hlIHdoZW4geW91ciBwbGF0Zm9ybQotICAgICBzdXBwb3J0cyBsaW5raW5nIERTTyBmaWxlcyBhZ2FpbnN0IERTTyBsaWJyYXJpZXMuCi08UD4KLTxMST4gVW5kZXIgc29tZSBwbGF0Zm9ybXMgKG1hbnkgU1ZSNCBzeXN0ZW1zKSB0aGVyZSBpcyBubyB3YXkgdG8gZm9yY2UgdGhlCi0gICAgIGxpbmtlciB0byBleHBvcnQgYWxsIGdsb2JhbCBzeW1ib2xzIGZvciB1c2UgaW4gRFNPJ3Mgd2hlbiBsaW5raW5nIHRoZQotICAgICBBcGFjaGUgaHR0cGQgZXhlY3V0YWJsZSBwcm9ncmFtLiBCdXQgd2l0aG91dCB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgQXBhY2hlCi0gICAgIGNvcmUgc3ltYm9scyBubyBzdGFuZGFyZCBBcGFjaGUgbW9kdWxlIGNvdWxkIGJlIHVzZWQgYXMgYSBEU08uIFRoZSBvbmx5Ci0gICAgIGNoYW5jZSBoZXJlIGlzIHRvIHVzZSB0aGUgPENPREU+U0hBUkVEX0NPUkU8L0NPREU+IGZlYXR1cmUgYmVjYXVzZSB0aGlzCi0gICAgIHdheSB0aGUgZ2xvYmFsIHN5bWJvbHMgYXJlIGZvcmNlZCB0byBiZSBleHBvcnRlZC4gQXMgYSBjb25zZXF1ZW5jZSB0aGUKLSAgICAgQXBhY2hlIDxDT0RFPnNyYy9Db25maWd1cmU8L0NPREU+IHNjcmlwdCBhdXRvbWF0aWNhbGx5IGVuZm9yY2VzCi0gICAgIDxDT0RFPlNIQVJFRF9DT1JFPC9DT0RFPiBvbiB0aGVzZSBwbGF0Zm9ybXMgd2hlbiBEU08gZmVhdHVyZXMgYXJlIHVzZWQgaW4KLSAgICAgdGhlIDxDT0RFPkNvbmZpZ3VyYXRpb248L0NPREU+IGZpbGUgb3Igb24gdGhlIGNvbmZpZ3VyZSBjb21tYW5kIGxpbmUuCi08L1VMPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CTE9DS1FVT1RFPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvZHNvLmh0bWwuZW4gYi9kb2NzL21hbnVhbC9kc28uaHRtbC5lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZlNmZjOS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9kc28uaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDM5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD48SEVBRD4KLTxUSVRMRT5BcGFjaGUgMS4zIER5bmFtaWMgU2hhcmVkIE9iamVjdCAoRFNPKSBzdXBwb3J0PC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTxCTE9DS1FVT1RFPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLQotPERJViBBTElHTj1DRU5URVI+Ci0KLTxIMT4KLUFwYWNoZSAxLjM8QlI+Ci1EeW5hbWljIFNoYXJlZCBPYmplY3QgKERTTyk8QlI+Ci1TdXBwb3J0Ci08L0gxPgotCi08QUREUkVTUz5PcmlnaW5hbGx5IHdyaXR0ZW4gYnk8QlI+Ci1SYWxmIFMuIEVuZ2Vsc2NoYWxsICZsdDtyc2VAYXBhY2hlLm9yZyZndCwgQXByaWwgMTk5ODwvQUREUkVTUz4KLQotPC9ESVY+Ci0KLTxIMz5CYWNrZ3JvdW5kPC9IMz4KLQotPFA+T24gbW9kZXJuIFVuaXggZGVyaXZhdGl2ZXMgdGhlcmUgZXhpc3RzIGEgbmlmdHkgbWVjaGFuaXNtIHVzdWFsbHkgY2FsbGVkCi1keW5hbWljIGxpbmtpbmcvbG9hZGluZyBvZiA8RU0+RHluYW1pYyBTaGFyZWQgT2JqZWN0czwvRU0+IChEU08pIHdoaWNoCi1wcm92aWRlcyBhIHdheSB0byBidWlsZCBhIHBpZWNlIG9mIHByb2dyYW0gY29kZSBpbiBhIHNwZWNpYWwgZm9ybWF0IGZvcgotbG9hZGluZyBpdCBhdCBydW4tdGltZSBpbnRvIHRoZSBhZGRyZXNzIHNwYWNlIG9mIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbS4KLQotPFA+VGhpcyBsb2FkaW5nIGNhbiB1c3VhbGx5IGJlIGRvbmUgaW4gdHdvIHdheXM6IEF1dG9tYXRpY2FsbHkgYnkgYSBzeXN0ZW0KLXByb2dyYW0gY2FsbGVkIDxDT0RFPmxkLnNvPC9DT0RFPiB3aGVuIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbSBpcyBzdGFydGVkIG9yCi1tYW51YWxseSBmcm9tIHdpdGhpbiB0aGUgZXhlY3V0aW5nIHByb2dyYW0gdmlhIGEgcHJvZ3JhbW1hdGljIHN5c3RlbSBpbnRlcmZhY2UKLXRvIHRoZSBVbml4IGxvYWRlciB0aHJvdWdoIHRoZSBzeXN0ZW0gY2FsbHMgPENPREU+ZGxvcGVuKCkvZGxzeW0oKTwvQ09ERT4uCi0gCi08UD5JbiB0aGUgZmlyc3Qgd2F5IHRoZSBEU08ncyBhcmUgdXN1YWxseSBjYWxsZWQgPEVNPnNoYXJlZCBsaWJyYXJpZXM8L0VNPiBvcgotPEVNPkRTTyBsaWJyYXJpZXM8L0VNPiBhbmQgbmFtZWQgPENPREU+bGliZm9vLnNvPC9DT0RFPiBvcgotPENPREU+bGliZm9vLnNvLjEuMjwvQ09ERT4uICBUaGV5IHJlc2lkZSBpbiBhIHN5c3RlbSBkaXJlY3RvcnkgKHVzdWFsbHkKLTxDT0RFPi91c3IvbGliPC9DT0RFPikgYW5kIHRoZSBsaW5rIHRvIHRoZSBleGVjdXRhYmxlIHByb2dyYW0gaXMgZXN0YWJsaXNoZWQKLWF0IGJ1aWxkLXRpbWUgYnkgc3BlY2lmeWluZyA8Q09ERT4tbGZvbzwvQ09ERT4gdG8gdGhlIGxpbmtlciBjb21tYW5kLiBUaGlzCi1oYXJkLWNvZGVzIGxpYnJhcnkgcmVmZXJlbmNlcyBpbnRvIHRoZSBleGVjdXRhYmxlIHByb2dyYW0gZmlsZSBzbyB0aGF0IGF0Ci1zdGFydC10aW1lIHRoZSBVbml4IGxvYWRlciBpcyBhYmxlIHRvIGxvY2F0ZSA8Q09ERT5saWJmb28uc288L0NPREU+IGluCi08Q09ERT4vdXNyL2xpYjwvQ09ERT4sIGluIHBhdGhzIGhhcmQtY29kZWQgdmlhIGxpbmtlci1vcHRpb25zIGxpa2UKLTxDT0RFPi1SPC9DT0RFPiBvciBpbiBwYXRocyBjb25maWd1cmVkIHZpYSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLTxDT0RFPkxEX0xJQlJBUllfUEFUSDwvQ09ERT4uIEl0IHRoZW4gcmVzb2x2ZXMgYW55ICh5ZXQgdW5yZXNvbHZlZCkgc3ltYm9scyBpbgotdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSB3aGljaCBhcmUgYXZhaWxhYmxlIGluIHRoZSBEU08uCi0gCi08UD5TeW1ib2xzIGluIHRoZSBleGVjdXRhYmxlIHByb2dyYW0gYXJlIHVzdWFsbHkgbm90IHJlZmVyZW5jZWQgYnkgdGhlIERTTwotKGJlY2F1c2UgaXQncyBhIHJldXNhYmxlIGxpYnJhcnkgb2YgZ2VuZXJhbCBjb2RlKSBhbmQgaGVuY2Ugbm8gZnVydGhlcgotcmVzb2x2aW5nIGhhcyB0byBiZSBkb25lLiBUaGUgZXhlY3V0YWJsZSBwcm9ncmFtIGhhcyBubyBuZWVkIHRvIGRvIGFueXRoaW5nIG9uCi1pdHMgb3duIHRvIHVzZSB0aGUgc3ltYm9scyBmcm9tIHRoZSBEU08gYmVjYXVzZSB0aGUgY29tcGxldGUgcmVzb2x2aW5nIGlzIGRvbmUKLWJ5IHRoZSBVbml4IGxvYWRlci4gKEluIGZhY3QsIHRoZSBjb2RlIHRvIGludm9rZSA8Q09ERT5sZC5zbzwvQ09ERT4gaXMgcGFydCBvZgotdGhlIHJ1bi10aW1lIHN0YXJ0dXAgY29kZSB3aGljaCBpcyBsaW5rZWQgaW50byBldmVyeSBleGVjdXRhYmxlIHByb2dyYW0gd2hpY2gKLWhhcyBiZWVuIGJvdW5kIG5vbi1zdGF0aWMpLiBUaGUgYWR2YW50YWdlIG9mIGR5bmFtaWMgbG9hZGluZyBvZiBjb21tb24gbGlicmFyeQotY29kZSBpcyBvYnZpb3VzOiB0aGUgbGlicmFyeSBjb2RlIG5lZWRzIHRvIGJlIHN0b3JlZCBvbmx5IG9uY2UsIGluIGEgc3lzdGVtCi1saWJyYXJ5IGxpa2UgPENPREU+bGliYy5zbzwvQ09ERT4sIHNhdmluZyBkaXNrIHNwYWNlIGZvciBldmVyeSBwcm9ncmFtLgotCi08UD5JbiB0aGUgc2Vjb25kIHdheSB0aGUgRFNPJ3MgYXJlIHVzdWFsbHkgY2FsbGVkIDxFTT5zaGFyZWQgb2JqZWN0czwvRU0+IG9yCi08RU0+RFNPIGZpbGVzPC9FTT4gYW5kIGNhbiBiZSBuYW1lZCB3aXRoIGFuIGFyYml0cmFyeSBleHRlbnNpb24gKGFsdGhvdWdoIHRoZQotY2Fub25pY2FsIG5hbWUgaXMgPENPREU+Zm9vLnNvPC9DT0RFPikuIFRoZXNlIGZpbGVzIHVzdWFsbHkgc3RheSBpbnNpZGUgYQotcHJvZ3JhbS1zcGVjaWZpYyBkaXJlY3RvcnkgYW5kIHRoZXJlIGlzIG5vIGF1dG9tYXRpY2FsbHkgZXN0YWJsaXNoZWQgbGluayB0bwotdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSB3aGVyZSB0aGV5IGFyZSB1c2VkLiBJbnN0ZWFkIHRoZSBleGVjdXRhYmxlIHByb2dyYW0KLW1hbnVhbGx5IGxvYWRzIHRoZSBEU08gYXQgcnVuLXRpbWUgaW50byBpdHMgYWRkcmVzcyBzcGFjZSB2aWEKLTxDT0RFPmRsb3BlbigpPC9DT0RFPi4gQXQgdGhpcyB0aW1lIG5vIHJlc29sdmluZyBvZiBzeW1ib2xzIGZyb20gdGhlIERTTyBmb3IKLXRoZSBleGVjdXRhYmxlIHByb2dyYW0gaXMgZG9uZS4gQnV0IGluc3RlYWQgdGhlIFVuaXggbG9hZGVyIGF1dG9tYXRpY2FsbHkKLXJlc29sdmVzIGFueSAoeWV0IHVucmVzb2x2ZWQpIHN5bWJvbHMgaW4gdGhlIERTTyBmcm9tIHRoZSBzZXQgb2Ygc3ltYm9scwotZXhwb3J0ZWQgYnkgdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSBhbmQgaXRzIGFscmVhZHkgbG9hZGVkIERTTyBsaWJyYXJpZXMKLShlc3BlY2lhbGx5IGFsbCBzeW1ib2xzIGZyb20gdGhlIHViaXF1aXRvdXMgPENPREU+bGliYy5zbzwvQ09ERT4pLiAgVGhpcyB3YXkKLXRoZSBEU08gZ2V0cyBrbm93bGVkZ2Ugb2YgdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSdzIHN5bWJvbCBzZXQgYXMgaWYgaXQgaGFkCi1iZWVuIHN0YXRpY2FsbHkgbGlua2VkIHdpdGggaXQgaW4gdGhlIGZpcnN0IHBsYWNlLgotIAotPFA+RmluYWxseSwgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIERTTydzIEFQSSB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtIGhhcyB0bwotcmVzb2x2ZSBwYXJ0aWN1bGFyIHN5bWJvbHMgZnJvbSB0aGUgRFNPIHZpYSA8Q09ERT5kbHN5bSgpPC9DT0RFPiBmb3IgbGF0ZXIgdXNlCi1pbnNpZGUgZGlzcGF0Y2ggdGFibGVzIDxFTT5ldGMuPC9FTT4gSW4gb3RoZXIgd29yZHM6IFRoZSBleGVjdXRhYmxlIHByb2dyYW0gaGFzIHRvCi1tYW51YWxseSByZXNvbHZlIGV2ZXJ5IHN5bWJvbCBpdCBuZWVkcyB0byBiZSBhYmxlIHRvIHVzZSBpdC4gIFRoZSBhZHZhbnRhZ2Ugb2YKLXN1Y2ggYSBtZWNoYW5pc20gaXMgdGhhdCBvcHRpb25hbCBwcm9ncmFtIHBhcnRzIG5lZWQgbm90IGJlIGxvYWRlZCAoYW5kIHRodXMKLWRvIG5vdCBzcGVuZCBtZW1vcnkpIHVudGlsIHRoZXkgYXJlIG5lZWRlZCBieSB0aGUgcHJvZ3JhbSBpbiBxdWVzdGlvbi4gV2hlbgotcmVxdWlyZWQsIHRoZXNlIHByb2dyYW0gcGFydHMgY2FuIGJlIGxvYWRlZCBkeW5hbWljYWxseSB0byBleHRlbmQgdGhlIGJhc2UKLXByb2dyYW0ncyBmdW5jdGlvbmFsaXR5LgotCi08UD5BbHRob3VnaCB0aGlzIERTTyBtZWNoYW5pc20gc291bmRzIHN0cmFpZ2h0Zm9yd2FyZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUKLWRpZmZpY3VsdCBzdGVwIGhlcmU6IFRoZSByZXNvbHZpbmcgb2Ygc3ltYm9scyBmcm9tIHRoZSBleGVjdXRhYmxlIHByb2dyYW0gZm9yCi10aGUgRFNPIHdoZW4gdXNpbmcgYSBEU08gdG8gZXh0ZW5kIGEgcHJvZ3JhbSAodGhlIHNlY29uZCB3YXkpLiBXaHk/IEJlY2F1c2UKLSJyZXZlcnNlIHJlc29sdmluZyIgRFNPIHN5bWJvbHMgZnJvbSB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtJ3Mgc3ltYm9sIHNldCBpcwotYWdhaW5zdCB0aGUgbGlicmFyeSBkZXNpZ24gKHdoZXJlIHRoZSBsaWJyYXJ5IGhhcyBubyBrbm93bGVkZ2UgYWJvdXQgdGhlCi1wcm9ncmFtcyBpdCBpcyB1c2VkIGJ5KSBhbmQgaXMgbmVpdGhlciBhdmFpbGFibGUgdW5kZXIgYWxsIHBsYXRmb3JtcyBub3IKLXN0YW5kYXJkaXplZC4gSW4gcHJhY3RpY2UgdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSdzIGdsb2JhbCBzeW1ib2xzIGFyZSBvZnRlbgotbm90IHJlLWV4cG9ydGVkIGFuZCB0aHVzIG5vdCBhdmFpbGFibGUgZm9yIHVzZSBpbiBhIERTTy4gIEZpbmRpbmcgYSB3YXkgdG8KLWZvcmNlIHRoZSBsaW5rZXIgdG8gZXhwb3J0IGFsbCBnbG9iYWwgc3ltYm9scyBpcyB0aGUgbWFpbiBwcm9ibGVtIG9uZSBoYXMgdG8KLXNvbHZlIHdoZW4gdXNpbmcgRFNPIGZvciBleHRlbmRpbmcgYSBwcm9ncmFtIGF0IHJ1bi10aW1lLgotCi08SDM+UHJhY3RpY2FsIFVzYWdlPC9IMz4KLQotPFA+VGhlIHNoYXJlZCBsaWJyYXJ5IGFwcHJvYWNoIGlzIHRoZSB0eXBpY2FsIG9uZSwgYmVjYXVzZSBpdCBpcyB3aGF0IHRoZSBEU08KLW1lY2hhbmlzbSB3YXMgZGVzaWduZWQgZm9yLCBoZW5jZSBpdCBpcyB1c2VkIGZvciBuZWFybHkgYWxsIHR5cGVzIG9mIGxpYnJhcmllcwotdGhlIG9wZXJhdGluZyBzeXN0ZW0gcHJvdmlkZXMuIE9uIHRoZSBvdGhlciBoYW5kIHVzaW5nIHNoYXJlZCBvYmplY3RzIGZvcgotZXh0ZW5kaW5nIGEgcHJvZ3JhbSBpcyBub3QgdXNlZCBieSBhIGxvdCBvZiBwcm9ncmFtcy4KLQotPFA+QXMgb2YgMTk5OCB0aGVyZSBhcmUgb25seSBhIGZldyBzb2Z0d2FyZSBwYWNrYWdlcyBhdmFpbGFibGUgd2hpY2ggdXNlIHRoZQotRFNPIG1lY2hhbmlzbSB0byBhY3R1YWxseSBleHRlbmQgdGhlaXIgZnVuY3Rpb25hbGl0eSBhdCBydW4tdGltZTogUGVybCA1ICh2aWEKLWl0cyBYUyBtZWNoYW5pc20gYW5kIHRoZSBEeW5hTG9hZGVyIG1vZHVsZSksIE5ldHNjYXBlIFNlcnZlciwgPEVNPmV0Yy48L0VNPiAgU3RhcnRpbmcKLXdpdGggdmVyc2lvbiAxLjMsIEFwYWNoZSBqb2luZWQgdGhlIGNyZXcsIGJlY2F1c2UgQXBhY2hlIGFscmVhZHkgdXNlcyBhIG1vZHVsZQotY29uY2VwdCB0byBleHRlbmQgaXRzIGZ1bmN0aW9uYWxpdHkgYW5kIGludGVybmFsbHkgdXNlcyBhIGRpc3BhdGNoLWxpc3QtYmFzZWQKLWFwcHJvYWNoIHRvIGxpbmsgZXh0ZXJuYWwgbW9kdWxlcyBpbnRvIHRoZSBBcGFjaGUgY29yZSBmdW5jdGlvbmFsaXR5LiBTbywKLUFwYWNoZSBpcyByZWFsbHkgcHJlZGVzdGluZWQgZm9yIHVzaW5nIERTTyB0byBsb2FkIGl0cyBtb2R1bGVzIGF0IHJ1bi10aW1lLgotCi08UD5BcyBvZiBBcGFjaGUgMS4zLCB0aGUgY29uZmlndXJhdGlvbiBzeXN0ZW0gc3VwcG9ydHMgdHdvIG9wdGlvbmFsIGZlYXR1cmVzCi1mb3IgdGFraW5nIGFkdmFudGFnZSBvZiB0aGUgbW9kdWxhciBEU08gYXBwcm9hY2g6IGNvbXBpbGF0aW9uIG9mIHRoZSBBcGFjaGUKLWNvcmUgcHJvZ3JhbSBpbnRvIGEgRFNPIGxpYnJhcnkgZm9yIHNoYXJlZCB1c2FnZSBhbmQgY29tcGlsYXRpb24gb2YgdGhlCi1BcGFjaGUgbW9kdWxlcyBpbnRvIERTTyBmaWxlcyBmb3IgZXhwbGljaXQgbG9hZGluZyBhdCBydW4tdGltZS4KLQotPEgzPkltcGxlbWVudGF0aW9uPC9IMz4KLQotPFA+VGhlIERTTyBzdXBwb3J0IGZvciBsb2FkaW5nIGluZGl2aWR1YWwgQXBhY2hlIG1vZHVsZXMgaXMgYmFzZWQgb24gYSBtb2R1bGUKLW5hbWVkIDxBIEhSRUY9Im1vZC9tb2Rfc28uaHRtbCI+PENPREU+bW9kX3NvLmM8L0NPREU+PC9BPiB3aGljaCBoYXMgdG8gYmUKLXN0YXRpY2FsbHkgY29tcGlsZWQgaW50byB0aGUgQXBhY2hlIGNvcmUuIEl0IGlzIHRoZSBvbmx5IG1vZHVsZSBiZXNpZGVzCi08Q09ERT5odHRwX2NvcmUuYzwvQ09ERT4gd2hpY2ggY2Fubm90IGJlIHB1dCBpbnRvIGEgRFNPIGl0c2VsZgotKGJvb3RzdHJhcHBpbmchKS4gUHJhY3RpY2FsbHkgYWxsIG90aGVyIGRpc3RyaWJ1dGVkIEFwYWNoZSBtb2R1bGVzIHRoZW4gY2FuCi10aGVuIGJlIHBsYWNlZCBpbnRvIGEgRFNPIGJ5IGluZGl2aWR1YWxseSBlbmFibGluZyB0aGUgRFNPIGJ1aWxkIGZvciB0aGVtIHZpYQotPENPREU+Y29uZmlndXJlPC9DT0RFPidzIDxDT0RFPi0tZW5hYmxlLXNoYXJlZDwvQ09ERT4gb3B0aW9uIChzZWUgdG9wLWxldmVsCi08Q09ERT5JTlNUQUxMPC9DT0RFPiBmaWxlKSBvciBieSBjaGFuZ2luZyB0aGUgPENPREU+QWRkTW9kdWxlPC9DT0RFPiBjb21tYW5kCi1pbiB5b3VyIDxDT0RFPnNyYy9Db25maWd1cmF0aW9uPC9DT0RFPiBpbnRvIGEgPENPREU+U2hhcmVkTW9kdWxlPC9DT0RFPgotY29tbWFuZCAoc2VlIDxDT0RFPnNyYy9JTlNUQUxMPC9DT0RFPiBmaWxlKS4gIEFmdGVyIGEgbW9kdWxlIGlzIGNvbXBpbGVkIGludG8KLWEgRFNPIG5hbWVkIDxDT0RFPm1vZF9mb28uc288L0NPREU+IHlvdSBjYW4gdXNlIDxBCi1IUkVGPSJtb2QvbW9kX3NvLmh0bWwiPjxDT0RFPm1vZF9zbzwvQ09ERT48L0E+J3MgPEEKLUhSRUY9Im1vZC9tb2Rfc28uaHRtbCNsb2FkbW9kdWxlIj48Q09ERT5Mb2FkTW9kdWxlPC9DT0RFPjwvQT4gY29tbWFuZCBpbiB5b3VyCi08Q09ERT5odHRwZC5jb25mPC9DT0RFPiBmaWxlIHRvIGxvYWQgdGhpcyBtb2R1bGUgYXQgc2VydmVyIHN0YXJ0dXAgb3IgcmVzdGFydC4KLQotPFA+VG8gc2ltcGxpZnkgdGhpcyBjcmVhdGlvbiBvZiBEU08gZmlsZXMgZm9yIEFwYWNoZSBtb2R1bGVzIChlc3BlY2lhbGx5IGZvcgotdGhpcmQtcGFydHkgbW9kdWxlcykgYSBuZXcgc3VwcG9ydCBwcm9ncmFtIG5hbWVkIDxDT0RFPmFweHM8L0NPREU+ICg8RU0+QVBhY2hlCi1lWHRlblNpb248L0VNPikgaXMgYXZhaWxhYmxlLiBJdCBjYW4gYmUgdXNlZCB0byBidWlsZCBEU08gYmFzZWQgbW9kdWxlcwotPEVNPm91dHNpZGUgb2Y8L0VNPiB0aGUgQXBhY2hlIHNvdXJjZSB0cmVlLiBUaGUgaWRlYSBpcyBzaW1wbGU6IFdoZW4KLWluc3RhbGxpbmcgQXBhY2hlIHRoZSA8Q09ERT5jb25maWd1cmU8L0NPREU+J3MgPENPREU+bWFrZSBpbnN0YWxsPC9DT0RFPgotcHJvY2VkdXJlIGluc3RhbGxzIHRoZSBBcGFjaGUgQyBoZWFkZXIgZmlsZXMgYW5kIHB1dHMgdGhlIHBsYXRmb3JtLWRlcGVuZGVudAotY29tcGlsZXIgYW5kIGxpbmtlciBmbGFncyBmb3IgYnVpbGRpbmcgRFNPIGZpbGVzIGludG8gdGhlIDxDT0RFPmFweHM8L0NPREU+Ci1wcm9ncmFtLiAgVGhpcyB3YXkgdGhlIHVzZXIgY2FuIHVzZSA8Q09ERT5hcHhzPC9DT0RFPiB0byBjb21waWxlIGhpcyBBcGFjaGUKLW1vZHVsZSBzb3VyY2VzIHdpdGhvdXQgdGhlIEFwYWNoZSBkaXN0cmlidXRpb24gc291cmNlIHRyZWUgYW5kIHdpdGhvdXQgaGF2aW5nCi10byBmaWRkbGUgd2l0aCB0aGUgcGxhdGZvcm0tZGVwZW5kZW50IGNvbXBpbGVyIGFuZCBsaW5rZXIgZmxhZ3MgZm9yIERTTwotc3VwcG9ydC4KLQotPFA+VG8gcGxhY2UgdGhlIGNvbXBsZXRlIEFwYWNoZSBjb3JlIHByb2dyYW0gaW50byBhIERTTyBsaWJyYXJ5IChvbmx5IHJlcXVpcmVkCi1vbiBzb21lIG9mIHRoZSBzdXBwb3J0ZWQgcGxhdGZvcm1zIHRvIGZvcmNlIHRoZSBsaW5rZXIgdG8gZXhwb3J0IHRoZSBhcGFjaGUKLWNvcmUgc3ltYm9scyAtLSBhIHByZXJlcXVpc2l0ZSBmb3IgdGhlIERTTyBtb2R1bGFyaXphdGlvbikgdGhlIHJ1bGUKLTxDT0RFPlNIQVJFRF9DT1JFPC9DT0RFPiBoYXMgdG8gYmUgZW5hYmxlZCB2aWEgPENPREU+Y29uZmlndXJlPC9DT0RFPidzCi08Q09ERT4tLWVuYWJsZS1ydWxlPVNIQVJFRF9DT1JFPC9DT0RFPiBvcHRpb24gKHNlZSB0b3AtbGV2ZWwKLTxDT0RFPklOU1RBTEw8L0NPREU+IGZpbGUpIG9yIGJ5IGNoYW5naW5nIHRoZSA8Q09ERT5SdWxlPC9DT0RFPiBjb21tYW5kIGluCi15b3VyIDxDT0RFPkNvbmZpZ3VyYXRpb248L0NPREU+IGZpbGUgdG8gPENPREU+UnVsZSBTSEFSRURfQ09SRT15ZXM8L0NPREU+IChzZWUKLTxDT0RFPnNyYy9JTlNUQUxMPC9DT0RFPiBmaWxlKS4gVGhlIEFwYWNoZSBjb3JlIGNvZGUgaXMgdGhlbiBwbGFjZWQgaW50byBhIERTTwotbGlicmFyeSBuYW1lZCA8Q09ERT5saWJodHRwZC5zbzwvQ09ERT4uIEJlY2F1c2Ugb25lIGNhbm5vdCBsaW5rIGEgRFNPIGFnYWluc3QKLXN0YXRpYyBsaWJyYXJpZXMgb24gYWxsIHBsYXRmb3JtcywgYW4gYWRkaXRpb25hbCBleGVjdXRhYmxlIHByb2dyYW0gbmFtZWQKLTxDT0RFPmxpYmh0dHBkLmVwPC9DT0RFPiBpcyBjcmVhdGVkIHdoaWNoIGJvdGggYmluZHMgdGhpcyBzdGF0aWMgY29kZSBhbmQKLXByb3ZpZGVzIGEgc3R1YiBmb3IgdGhlIDxDT0RFPm1haW4oKTwvQ09ERT4gZnVuY3Rpb24uICBGaW5hbGx5IHRoZQotPENPREU+aHR0cGQ8L0NPREU+IGV4ZWN1dGFibGUgcHJvZ3JhbSBpdHNlbGYgaXMgcmVwbGFjZWQgYnkgYSBib290c3RyYXBwaW5nCi1jb2RlIHdoaWNoIGF1dG9tYXRpY2FsbHkgbWFrZXMgc3VyZSB0aGUgVW5peCBsb2FkZXIgaXMgYWJsZSB0byBsb2FkIGFuZCBzdGFydAotPENPREU+bGliaHR0cGQuZXA8L0NPREU+IGJ5IHByb3ZpZGluZyB0aGUgPENPREU+TERfTElCUkFSWV9QQVRIPC9DT0RFPiB0bwotPENPREU+bGliaHR0cGQuc288L0NPREU+LgotCi08SDM+U3VwcG9ydGVkIFBsYXRmb3JtczwvSDM+Ci0KLTxQPkFwYWNoZSdzIDxDT0RFPnNyYy9Db25maWd1cmU8L0NPREU+IHNjcmlwdCBjdXJyZW50bHkgaGFzIG9ubHkgbGltaXRlZCBidXQKLWFkZXF1YXRlIGJ1aWx0LWluIGtub3dsZWRnZSBvbiBob3cgdG8gY29tcGlsZSBEU08gZmlsZXMsIGJlY2F1c2UgYXMgYWxyZWFkeQotbWVudGlvbmVkIHRoaXMgaXMgaGVhdmlseSBwbGF0Zm9ybS1kZXBlbmRlbnQuIE5ldmVydGhlbGVzcyBhbGwgbWFqb3IgVW5peAotcGxhdGZvcm1zIGFyZSBzdXBwb3J0ZWQuICBUaGUgZGVmaW5pdGl2ZSBjdXJyZW50IHN0YXRlIChNYXkgMTk5OSkgaXMgdGhpczoKLQotPFA+Ci08VUw+Ci08TEk+T3V0LW9mLXRoZS1ib3ggc3VwcG9ydGVkIHBsYXRmb3Jtczo8QlI+Ci0oYWN0dWFsbHkgdGVzdGVkIHZlcnNpb25zIGluIHBhcmVudGhlc2lzKQotCi08UFJFPgotbyAgRnJlZUJTRCAgICAgICAgICAgICgyLjEuNSwgMi4yLngsIDMueCwgNC54KQotbyAgT3BlbkJTRCAgICAgICAgICAgICgyLngpCi1vICBOZXRCU0QgICAgICAgICAgICAgKDEuMy4xKQotbyAgQlNESSAgICAgICAgICAgICAgICgzLngsIDQueCkKLW8gIExpbnV4ICAgICAgICAgICAgICAoRGViaWFuLzEuMy4xLCBSZWRIYXQvNC4yKQotbyAgU29sYXJpcyAgICAgICAgICAgICgyLjQsIDIuNSwgMi42LCAyLjcpCi1vICBTdW5PUyAgICAgICAgICAgICAgKDQuMS4zKQotbyAgRGlnaXRhbCBVTklYICAgICAgICg0LjApCi1vICBJUklYICAgICAgICAgICAgICAgKDUuMywgNi4yKQotbyAgSFAvVVggICAgICAgICAgICAgICgxMC4yMCkKLW8gIFVuaXhXYXJlICAgICAgICAgICAoMi4wMSwgMi4xLjIpCi1vICBTQ08gICAgICAgICAgICAgICAgKDUuMC40KQotbyAgQUlYICAgICAgICAgICAgICAgICgzLjIsIDQuMS41LCA0LjIsIDQuMykKLW8gIFJlbGlhbnRVTklYL1NJTklYICAoNS40MykKLW8gIFNWUjQgICAgICAgICAgICAgICAoLSkKLW8gIE1hYyBPUyBYIFNlcnZlciAgICAoMS4wKQotbyAgTWFjIE9TICAgICAgICAgICAgICgxMC4wIHByZXZpZXcgMSkKLW8gIE9wZW5TdGVwL01hY2ggICAgICAoNC4yKQotbyAgREdVWCAgICAgICAgICAgICAgICg/PykKLW8gIE5ldFdhcmUgICAgICAgICAgICAoNS4xKQotPC9QUkU+Ci0KLTxQPgotPExJPiBFeHBsaWNpdGx5IHVuc3VwcG9ydGVkIHBsYXRmb3JtczoKLQotPFBSRT4KLW8gIFVsdHJpeCAgICAgICAgICAgICAobm8gZGxvcGVuLXN0eWxlIGludGVyZmFjZSB1bmRlciB0aGlzIHBsYXRmb3JtKQotPC9QUkU+Ci0KLTwvVUw+Ci0KLTxIMz5Vc2FnZSBTdW1tYXJ5PC9IMz4KLQotPFA+VG8gZ2l2ZSB5b3UgYW4gb3ZlcnZpZXcgb2YgdGhlIERTTyBmZWF0dXJlcyBvZiBBcGFjaGUgMS4zLCBoZXJlIGlzIGEgc2hvcnQKLWFuZCBjb25jaXNlIHN1bW1hcnk6Ci0KLTxPTD4KLQotPExJPlBsYWNpbmcgdGhlIEFwYWNoZSBjb3JlIGNvZGUgKGFsbCB0aGUgc3R1ZmYgd2hpY2ggdXN1YWxseSBmb3JtcyB0aGUKLTxDT0RFPmh0dHBkPC9DT0RFPiBiaW5hcnkpIGludG8gYSBEU08gPENPREU+bGliaHR0cGQuc288L0NPREU+LCBhbiBleGVjdXRhYmxlCi1wcm9ncmFtIDxDT0RFPmxpYmh0dHBkLmVwPC9DT0RFPiBhbmQgYSBib290c3RyYXBwaW5nIGV4ZWN1dGFibGUgcHJvZ3JhbQotPENPREU+aHR0cGQ8L0NPREU+IChOb3RpY2U6IHRoaXMgaXMgb25seSByZXF1aXJlZCBvbiBzb21lIG9mIHRoZSBzdXBwb3J0ZWQKLXBsYXRmb3JtcyB0byBmb3JjZSB0aGUgbGlua2VyIHRvIGV4cG9ydCB0aGUgQXBhY2hlIGNvcmUgc3ltYm9scywgd2hpY2ggaW4gdHVybgotaXMgYSBwcmVyZXF1aXNpdGUgZm9yIHRoZSBEU08gbW9kdWxhcml6YXRpb24pOgotCi08UD4KLTxVTD4KLTxMST5CdWlsZCBhbmQgaW5zdGFsbCB2aWEgPENPREU+Y29uZmlndXJlPC9DT0RFPiAocHJlZmVycmVkKToKLTxUQUJMRSBCR0NPTE9SPSIjZjBmMGYwIiBDRUxMUEFERElORz0xMD48VFI+PFREPgotPFBSRT4KLSQgLi9jb25maWd1cmUgLS1wcmVmaXg9L3BhdGgvdG8vaW5zdGFsbAotICAgICAgICAgICAgICAtLWVuYWJsZS1ydWxlPVNIQVJFRF9DT1JFIC4uLgotJCBtYWtlIGluc3RhbGwKLTwvUFJFPgotPC9URD48L1RSPjwvVEFCTEU+Ci0KLTxMST5CdWlsZCBhbmQgaW5zdGFsbCBtYW51YWxseTogCi08VEFCTEUgQkdDT0xPUj0iI2YwZjBmMCIgQ0VMTFBBRERJTkc9MTA+PFRSPjxURD4KLTxQUkU+Ci0tIEVkaXQgc3JjL0NvbmZpZ3VyYXRpb246Ci0gICZsdDsmbHQ7IFJ1bGUgU0hBUkVEX0NPUkU9ZGVmYXVsdAotICAmZ3Q7Jmd0OyBSdWxlIFNIQVJFRF9DT1JFPXllcwotICAmbHQ7Jmx0OyBFWFRSQV9DRkxBR1M9IAotICAmZ3Q7Jmd0OyBFWFRSQV9DRkxBR1M9IC1EU0hBUkVEX0NPUkVfRElSPVwiL3BhdGgvdG8vaW5zdGFsbC9saWJleGVjXCIKLSQgbWFrZSAKLSQgY3Agc3JjL2xpYmh0dHBkLnNvKiAvcGF0aC90by9pbnN0YWxsL2xpYmV4ZWMvCi0kIGNwIHNyYy9saWJodHRwZC5lcCAgL3BhdGgvdG8vaW5zdGFsbC9saWJleGVjLwotJCBjcCBzcmMvaHR0cGQgICAgICAgIC9wYXRoL3RvL2luc3RhbGwvYmluLwotPC9QUkU+ICAgIAotPC9URD48L1RSPjwvVEFCTEU+Ci08L1VMPgotCi08TEk+QnVpbGQgYW5kIGluc3RhbGwgYSA8RU0+ZGlzdHJpYnV0ZWQ8L0VNPiBBcGFjaGUgbW9kdWxlLCBzYXkKLTxDT0RFPm1vZF9mb28uYzwvQ09ERT4sIGludG8gaXRzIG93biBEU08gPENPREU+bW9kX2Zvby5zbzwvQ09ERT46Ci0KLTxQPgotPFVMPgotPExJPkJ1aWxkIGFuZCBpbnN0YWxsIHZpYSA8Q09ERT5jb25maWd1cmU8L0NPREU+IChwcmVmZXJyZWQpOgotPFRBQkxFIEJHQ09MT1I9IiNmMGYwZjAiIENFTExQQURESU5HPTEwPjxUUj48VEQ+Ci08UFJFPgotJCAuL2NvbmZpZ3VyZSAtLXByZWZpeD0vcGF0aC90by9pbnN0YWxsCi0gICAgICAgIC0tZW5hYmxlLXNoYXJlZD1mb28KLSQgbWFrZSBpbnN0YWxsCi08L1BSRT4KLTwvVEQ+PC9UUj48L1RBQkxFPgotCi08TEk+QnVpbGQgYW5kIGluc3RhbGwgbWFudWFsbHk6IAotPFRBQkxFIEJHQ09MT1I9IiNmMGYwZjAiIENFTExQQURESU5HPTEwPjxUUj48VEQ+Ci08UFJFPgotLSBFZGl0IHNyYy9Db25maWd1cmF0aW9uOgotICAmbHQ7Jmx0OyBBZGRNb2R1bGUgICAgbW9kdWxlcy94eHh4L21vZF9mb28ubwotICAmZ3Q7Jmd0OyBTaGFyZWRNb2R1bGUgbW9kdWxlcy94eHh4L21vZF9mb28uc28KLSQgbWFrZQotJCBjcCBzcmMveHh4eC9tb2RfZm9vLnNvIC9wYXRoL3RvL2luc3RhbGwvbGliZXhlYwotLSBFZGl0IC9wYXRoL3RvL2luc3RhbGwvZXRjL2h0dHBkLmNvbmYKLSAgJmd0OyZndDsgTG9hZE1vZHVsZSBmb29fbW9kdWxlIC9wYXRoL3RvL2luc3RhbGwvbGliZXhlYy9tb2RfZm9vLnNvCi08L1BSRT4KLTwvVEQ+PC9UUj48L1RBQkxFPgotPC9VTD4KLQotPExJPkJ1aWxkIGFuZCBpbnN0YWxsIGEgPEVNPnRoaXJkLXBhcnR5PC9FTT4gQXBhY2hlIG1vZHVsZSwgc2F5Ci08Q09ERT5tb2RfZm9vLmM8L0NPREU+LCBpbnRvIGl0cyBvd24gRFNPIDxDT0RFPm1vZF9mb28uc288L0NPREU+Ci0KLTxQPgotPFVMPgotPExJPkJ1aWxkIGFuZCBpbnN0YWxsIHZpYSA8Q09ERT5jb25maWd1cmU8L0NPREU+IChwcmVmZXJyZWQpOgotPFRBQkxFIEJHQ09MT1I9IiNmMGYwZjAiIENFTExQQURESU5HPTEwPjxUUj48VEQ+Ci08UFJFPgotJCAuL2NvbmZpZ3VyZSAtLWFkZC1tb2R1bGU9L3BhdGgvdG8vM3JkcGFydHkvbW9kX2Zvby5jIAotICAgICAgICAtLWVuYWJsZS1zaGFyZWQ9Zm9vCi0kIG1ha2UgaW5zdGFsbAotPC9QUkU+Ci08L1REPjwvVFI+PC9UQUJMRT4KLQotPExJPkJ1aWxkIGFuZCBpbnN0YWxsIG1hbnVhbGx5OiAKLTxUQUJMRSBCR0NPTE9SPSIjZjBmMGYwIiBDRUxMUEFERElORz0xMD48VFI+PFREPgotPFBSRT4KLSQgY3AgL3BhdGgvdG8vM3JkcGFydHkvbW9kX2Zvby5jIC9wYXRoL3RvL2FwYWNoZS0xLjMvc3JjL21vZHVsZXMvZXh0cmEvCi0tIEVkaXQgc3JjL0NvbmZpZ3VyYXRpb246Ci0gICZndDsmZ3Q7IFNoYXJlZE1vZHVsZSBtb2R1bGVzL2V4dHJhL21vZF9mb28uc28KLSQgbWFrZQotJCBjcCBzcmMveHh4eC9tb2RfZm9vLnNvIC9wYXRoL3RvL2luc3RhbGwvbGliZXhlYwotLSBFZGl0IC9wYXRoL3RvL2luc3RhbGwvZXRjL2h0dHBkLmNvbmYKLSAgJmd0OyZndDsgTG9hZE1vZHVsZSBmb29fbW9kdWxlIC9wYXRoL3RvL2luc3RhbGwvbGliZXhlYy9tb2RfZm9vLnNvCi08L1BSRT4KLTwvVEQ+PC9UUj48L1RBQkxFPgotPC9VTD4KLQotPFA+Ci08TEk+QnVpbGQgYW5kIGluc3RhbGwgYSA8RU0+dGhpcmQtcGFydHk8L0VNPiBBcGFjaGUgbW9kdWxlLCBzYXkKLTxDT0RFPm1vZF9mb28uYzwvQ09ERT4sIGludG8gaXRzIG93biBEU08gPENPREU+bW9kX2Zvby5zbzwvQ09ERT4gPEVNPm91dHNpZGUKLW9mPC9FTT4gdGhlIEFwYWNoZSBzb3VyY2UgdHJlZToKLQotPFA+Ci08VUw+Ci08TEk+QnVpbGQgYW5kIGluc3RhbGwgdmlhIDxDT0RFPmFweHM8L0NPREU+OiAKLTxUQUJMRSBCR0NPTE9SPSIjZjBmMGYwIiBDRUxMUEFERElORz0xMD48VFI+PFREPgotPFBSRT4KLSQgY2QgL3BhdGgvdG8vM3JkcGFydHkKLSQgYXB4cyAtYyBtb2RfZm9vLmMKLSQgYXB4cyAtaSAtYSAtbiBmb28gbW9kX2Zvby5zbwotPC9QUkU+Ci08L1REPjwvVFI+PC9UQUJMRT4KLTwvVUw+Ci0KLTwvT0w+Ci0KLTxIMz5BZHZhbnRhZ2VzICYgRGlzYWR2YW50YWdlczwvSDM+Ci0KLTxQPlRoZSBhYm92ZSBEU08gYmFzZWQgZmVhdHVyZXMgb2YgQXBhY2hlIDEuMyBoYXZlIHRoZSBmb2xsb3dpbmcgYWR2YW50YWdlczoKLQotPFVMPgotPExJPiBUaGUgc2VydmVyIHBhY2thZ2UgaXMgbW9yZSBmbGV4aWJsZSBhdCBydW4tdGltZSBiZWNhdXNlIHRoZSBhY3R1YWwgc2VydmVyCi0gICAgIHByb2Nlc3MgY2FuIGJlIGFzc2VtYmxlZCBhdCBydW4tdGltZSB2aWEgPEEKLSAgICAgSFJFRj0ibW9kL21vZF9zby5odG1sI2xvYWRtb2R1bGUiPjxDT0RFPkxvYWRNb2R1bGU8L0NPREU+PC9BPgotICAgICA8Q09ERT5odHRwZC5jb25mPC9DT0RFPiBjb25maWd1cmF0aW9uIGNvbW1hbmRzIGluc3RlYWQgb2YKLSAgICAgPENPREU+Q29uZmlndXJhdGlvbjwvQ09ERT4gPENPREU+QWRkTW9kdWxlPC9DT0RFPiBjb21tYW5kcyBhdCBidWlsZC10aW1lLgotICAgICBGb3IgaW5zdGFuY2UgdGhpcyB3YXkgb25lIGlzIGFibGUgdG8gcnVuIGRpZmZlcmVudCBzZXJ2ZXIgaW5zdGFuY2VzCi0gICAgIChzdGFuZGFyZCAmYW1wOyBTU0wgdmVyc2lvbiwgbWluaW1hbGlzdGljICZhbXA7IHBvd2VyZWQgdXAgdmVyc2lvbgotICAgICBbbW9kX3BlcmwsIFBIUDNdLCA8RU0+ZXRjLjwvRU0+KSB3aXRoIG9ubHkgb25lIEFwYWNoZSBpbnN0YWxsYXRpb24uCi08UD4KLTxMST4gVGhlIHNlcnZlciBwYWNrYWdlIGNhbiBiZSBlYXNpbHkgZXh0ZW5kZWQgd2l0aCB0aGlyZC1wYXJ0eSBtb2R1bGVzIGV2ZW4KLSAgICAgYWZ0ZXIgaW5zdGFsbGF0aW9uLiBUaGlzIGlzIGF0IGxlYXN0IGEgZ3JlYXQgYmVuZWZpdCBmb3IgdmVuZG9yIHBhY2thZ2UKLSAgICAgbWFpbnRhaW5lcnMgd2hvIGNhbiBjcmVhdGUgYSBBcGFjaGUgY29yZSBwYWNrYWdlIGFuZCBhZGRpdGlvbmFsIHBhY2thZ2VzCi0gICAgIGNvbnRhaW5pbmcgZXh0ZW5zaW9ucyBsaWtlIFBIUDMsIG1vZF9wZXJsLCBtb2RfZmFzdGNnaSwgPEVNPmV0Yy48L0VNPgotPFA+Ci08TEk+IEVhc2llciBBcGFjaGUgbW9kdWxlIHByb3RvdHlwaW5nIGJlY2F1c2Ugd2l0aCB0aGUgRFNPLzxDT0RFPmFweHM8L0NPREU+Ci0gICAgIHBhaXIgeW91IGNhbiBib3RoIHdvcmsgb3V0c2lkZSB0aGUgQXBhY2hlIHNvdXJjZSB0cmVlIGFuZCBvbmx5IG5lZWQgYW4KLSAgICAgPENPREU+YXB4cyAtaTwvQ09ERT4gY29tbWFuZCBmb2xsb3dlZCBieSBhbiA8Q09ERT5hcGFjaGVjdGwKLSAgICAgcmVzdGFydDwvQ09ERT4gdG8gYnJpbmcgYSBuZXcgdmVyc2lvbiBvZiB5b3VyIGN1cnJlbnRseSBkZXZlbG9wZWQgbW9kdWxlCi0gICAgIGludG8gdGhlIHJ1bm5pbmcgQXBhY2hlIHNlcnZlci4KLTwvVUw+Ci0KLTxQPkRTTyBoYXMgdGhlIGZvbGxvd2luZyBkaXNhZHZhbnRhZ2VzOgotCi08VUw+Ci08TEk+IFRoZSBEU08gbWVjaGFuaXNtIGNhbm5vdCBiZSB1c2VkIG9uIGV2ZXJ5IHBsYXRmb3JtIGJlY2F1c2Ugbm90IGFsbAotICAgICBvcGVyYXRpbmcgc3lzdGVtcyBzdXBwb3J0IGR5bmFtaWMgbG9hZGluZyBvZiBjb2RlIGludG8gdGhlIGFkZHJlc3Mgc3BhY2UKLSAgICAgb2YgYSBwcm9ncmFtLgotPFA+Ci08TEk+IFRoZSBzZXJ2ZXIgaXMgYXBwcm94aW1hdGVseSAyMCUgc2xvd2VyIGF0IHN0YXJ0dXAgdGltZSBiZWNhdXNlIG9mIHRoZQotICAgICBzeW1ib2wgcmVzb2x2aW5nIG92ZXJoZWFkIHRoZSBVbml4IGxvYWRlciBub3cgaGFzIHRvIGRvLgotPFA+Ci08TEk+IFRoZSBzZXJ2ZXIgaXMgYXBwcm94aW1hdGVseSA1JSBzbG93ZXIgYXQgZXhlY3V0aW9uIHRpbWUgdW5kZXIgc29tZQotICAgICBwbGF0Zm9ybXMgYmVjYXVzZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIChQSUMpIHNvbWV0aW1lcyBuZWVkcwotICAgICBjb21wbGljYXRlZCBhc3NlbWJsZXIgdHJpY2tzIGZvciByZWxhdGl2ZSBhZGRyZXNzaW5nIHdoaWNoIGFyZSBub3QKLSAgICAgbmVjZXNzYXJpbHkgYXMgZmFzdCBhcyBhYnNvbHV0ZSBhZGRyZXNzaW5nLgotPFA+Ci08TEk+IEJlY2F1c2UgRFNPIG1vZHVsZXMgY2Fubm90IGJlIGxpbmtlZCBhZ2FpbnN0IG90aGVyIERTTy1iYXNlZCBsaWJyYXJpZXMKLSAgICAgKDxDT0RFPmxkIC1sZm9vPC9DT0RFPikgb24gYWxsIHBsYXRmb3JtcyAoZm9yIGluc3RhbmNlIGEub3V0LWJhc2VkCi0gICAgIHBsYXRmb3JtcyB1c3VhbGx5IGRvbid0IHByb3ZpZGUgdGhpcyBmdW5jdGlvbmFsaXR5IHdoaWxlIEVMRi1iYXNlZAotICAgICBwbGF0Zm9ybXMgZG8pIHlvdSBjYW5ub3QgdXNlIHRoZSBEU08gbWVjaGFuaXNtIGZvciBhbGwgdHlwZXMgb2YgbW9kdWxlcy4KLSAgICAgT3IgaW4gb3RoZXIgd29yZHMsIG1vZHVsZXMgY29tcGlsZWQgYXMgRFNPIGZpbGVzIGFyZSByZXN0cmljdGVkIHRvIG9ubHkKLSAgICAgdXNlIHN5bWJvbHMgZnJvbSB0aGUgQXBhY2hlIGNvcmUsIGZyb20gdGhlIEMgbGlicmFyeSAoPENPREU+bGliYzwvQ09ERT4pCi0gICAgIGFuZCBhbGwgb3RoZXIgZHluYW1pYyBvciBzdGF0aWMgbGlicmFyaWVzIHVzZWQgYnkgdGhlIEFwYWNoZSBjb3JlLCBvcgotICAgICBmcm9tIHN0YXRpYyBsaWJyYXJ5IGFyY2hpdmVzICg8Q09ERT5saWJmb28uYTwvQ09ERT4pIGNvbnRhaW5pbmcgcG9zaXRpb24KLSAgICAgaW5kZXBlbmRlbnQgY29kZS4gVGhlIG9ubHkgY2hhbmNlcyB0byB1c2Ugb3RoZXIgY29kZSBpcyB0byBlaXRoZXIgbWFrZQotICAgICBzdXJlIHRoZSBBcGFjaGUgY29yZSBpdHNlbGYgYWxyZWFkeSBjb250YWlucyBhIHJlZmVyZW5jZSB0byBpdCwgbG9hZGluZwotICAgICB0aGUgY29kZSB5b3Vyc2VsZiB2aWEgPENPREU+ZGxvcGVuKCk8L0NPREU+IG9yIGVuYWJsaW5nIHRoZQotICAgICA8Q09ERT5TSEFSRURfQ0hBSU48L0NPREU+IHJ1bGUgd2hpbGUgYnVpbGRpbmcgQXBhY2hlIHdoZW4geW91ciBwbGF0Zm9ybQotICAgICBzdXBwb3J0cyBsaW5raW5nIERTTyBmaWxlcyBhZ2FpbnN0IERTTyBsaWJyYXJpZXMuCi08UD4KLTxMST4gVW5kZXIgc29tZSBwbGF0Zm9ybXMgKG1hbnkgU1ZSNCBzeXN0ZW1zKSB0aGVyZSBpcyBubyB3YXkgdG8gZm9yY2UgdGhlCi0gICAgIGxpbmtlciB0byBleHBvcnQgYWxsIGdsb2JhbCBzeW1ib2xzIGZvciB1c2UgaW4gRFNPJ3Mgd2hlbiBsaW5raW5nIHRoZQotICAgICBBcGFjaGUgaHR0cGQgZXhlY3V0YWJsZSBwcm9ncmFtLiBCdXQgd2l0aG91dCB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgQXBhY2hlCi0gICAgIGNvcmUgc3ltYm9scyBubyBzdGFuZGFyZCBBcGFjaGUgbW9kdWxlIGNvdWxkIGJlIHVzZWQgYXMgYSBEU08uIFRoZSBvbmx5Ci0gICAgIGNoYW5jZSBoZXJlIGlzIHRvIHVzZSB0aGUgPENPREU+U0hBUkVEX0NPUkU8L0NPREU+IGZlYXR1cmUgYmVjYXVzZSB0aGlzCi0gICAgIHdheSB0aGUgZ2xvYmFsIHN5bWJvbHMgYXJlIGZvcmNlZCB0byBiZSBleHBvcnRlZC4gQXMgYSBjb25zZXF1ZW5jZSB0aGUKLSAgICAgQXBhY2hlIDxDT0RFPnNyYy9Db25maWd1cmU8L0NPREU+IHNjcmlwdCBhdXRvbWF0aWNhbGx5IGVuZm9yY2VzCi0gICAgIDxDT0RFPlNIQVJFRF9DT1JFPC9DT0RFPiBvbiB0aGVzZSBwbGF0Zm9ybXMgd2hlbiBEU08gZmVhdHVyZXMgYXJlIHVzZWQgaW4KLSAgICAgdGhlIDxDT0RFPkNvbmZpZ3VyYXRpb248L0NPREU+IGZpbGUgb3Igb24gdGhlIGNvbmZpZ3VyZSBjb21tYW5kIGxpbmUuCi08L1VMPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CTE9DS1FVT1RFPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvZWJjZGljLmh0bWwgYi9kb2NzL21hbnVhbC9lYmNkaWMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU5M2FhYS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9lYmNkaWMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPlRoZSBBcGFjaGUgRUJDRElDIFBvcnQ8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5PdmVydmlldyBvZiB0aGUgQXBhY2hlIEVCQ0RJQyBQb3J0PC9IMT4KLQotIDxQPgotICBWZXJzaW9uIDEuMyBvZiB0aGUgQXBhY2hlIEhUVFAgU2VydmVyIGlzIHRoZSBmaXJzdCB2ZXJzaW9uIHdoaWNoCi0gIGluY2x1ZGVzIGEgcG9ydCB0byBhIChub24tQVNDSUkpIG1haW5mcmFtZSBtYWNoaW5lIHdoaWNoIHVzZXMKLSAgdGhlIEVCQ0RJQyBjaGFyYWN0ZXIgc2V0IGFzIGl0cyBuYXRpdmUgY29kZXNldC48QlI+Ci0gIChJdCBpcyB0aGUgU0lFTUVOUyBmYW1pbHkgb2YgbWFpbmZyYW1lcyBydW5uaW5nIHRoZQotICA8QSBIUkVGPSJodHRwOi8vd3d3LnNpZW1lbnMuZGUvc2VydmVycy9iczJvc2Qvb3NkYmNfdXMuaHRtIj5CUzIwMDAvT1NECi0gIG9wZXJhdGluZyBzeXN0ZW08L0E+LiBUaGlzIG1haW5mcmFtZSBPUyBub3dhZGF5cyBmZWF0dXJlcyBhCi0gIFNWUjQtZGVyaXZlZCBQT1NJWCBzdWJzeXN0ZW0pLgotIDwvUD4KLQotIDxQPgotIFRoZSBwb3J0IHdhcyBzdGFydGVkIGluaXRpYWxseSB0bwotICA8VUw+Ci0gIDxMST4gcHJvdmUgdGhlIGZlYXNpYmlsaXR5IG9mIHBvcnRpbmcKLSAgICAgICA8QSBIUkVGPSJodHRwOi8vZGV2LmFwYWNoZS5vcmcvIj50aGUgQXBhY2hlIEhUVFAgc2VydmVyPC9BPgotICAgICAgIHRvIHRoaXMgcGxhdGZvcm0KLSAgPExJPiBmaW5kIGEgIndvcnRoeSBhbmQgY2FwYWJsZSIgc3VjY2Vzc29yIGZvciB0aGUgdmVuZXJhYmxlCi0gICAgICAgPEEgSFJFRj0iaHR0cDovL3d3dy53My5vcmcvRGFlbW9uLyI+Q0VSTi0zLjA8L0E+IGRhZW1vbgotICAgICAgICh3aGljaCB3YXMgcG9ydGVkIGEgY291cGxlIG9mIHllYXJzIGFnbyksIGFuZCB0bwotICA8TEk+IHByb3ZlIHRoYXQgQXBhY2hlJ3MgcHJlZm9ya2luZyBwcm9jZXNzIG1vZGVsIGNhbiBvbiB0aGlzIHBsYXRmb3JtCi0gICAgICAgZWFzaWx5IG91dHBlcmZvcm0gdGhlIGFjY2VwdC1mb3JrLXNlcnZlIG1vZGVsIHVzZWQgYnkgQ0VSTiBieSBhCi0gICAgICAgZmFjdG9yIG9mIDUgb3IgbW9yZS4KLSAgPC9VTD4KLSA8L1A+Ci0KLSA8UD4KLSAgVGhpcyBkb2N1bWVudCBzZXJ2ZXMgYXMgYSByYXRpb25hbGUgdG8gZGVzY3JpYmUgc29tZSBvZiB0aGUgZGVzaWduCi0gIGRlY2lzaW9ucyBvZiB0aGUgcG9ydCB0byB0aGlzIG1hY2hpbmUuCi0gPC9QPgotCi0gPEgyIEFMSUdOPUNFTlRFUj5EZXNpZ24gR29hbHM8L0gyPgotIDxQPgotICBPbmUgb2JqZWN0aXZlIG9mIHRoZSBFQkNESUMgcG9ydCB3YXMgdG8gbWFpbnRhaW4gZW5vdWdoIGJhY2t3YXJkcwotICBjb21wYXRpYmlsaXR5IHdpdGggdGhlIChFQkNESUMpIENFUk4gc2VydmVyIHRvIG1ha2UgdGhlIHRyYW5zaXRpb24gdG8KLSAgdGhlIG5ldyBzZXJ2ZXIgYXR0cmFjdGl2ZSBhbmQgZWFzeS4gVGhpcyByZXF1aXJlZCB0aGUgYWRkaXRpb24gb2YKLSAgYSBjb25maWd1cmFibGUgbWV0aG9kIHRvIGRlZmluZSB3aGV0aGVyIGEgSFRNTCBkb2N1bWVudCB3YXMgc3RvcmVkCi0gIGluIEFTQ0lJICh0aGUgb25seSBmb3JtYXQgYWNjZXB0ZWQgYnkgdGhlIG9sZCBzZXJ2ZXIpIG9yIGluIEVCQ0RJQwotICAodGhlIG5hdGl2ZSBkb2N1bWVudCBmb3JtYXQgaW4gdGhlIFBPU0lYIHN1YnN5c3RlbSwgYW5kIHRoZXJlZm9yZQotICB0aGUgb25seSByZWFsaXN0aWMgZm9ybWF0IGluIHdoaWNoIHRoZSBvdGhlciBQT1NJWCB0b29scyBsaWtlIGdyZXAKLSAgb3Igc2VkIGNvdWxkIG9wZXJhdGUgb24gdGhlIGRvY3VtZW50cykuIFRoZSBjdXJyZW50IHNvbHV0aW9uIHRvCi0gIHRoaXMgaXMgYSAicHNldWRvLU1JTUUtZm9ybWF0IiB3aGljaCBpcyBpbnRlcmNlcHRlZCBhbmQKLSAgaW50ZXJwcmV0ZWQgYnkgdGhlIEFwYWNoZSBzZXJ2ZXIgKHNlZSBiZWxvdykuIEZ1dHVyZSB2ZXJzaW9ucwotICBtaWdodCBzb2x2ZSB0aGUgcHJvYmxlbSBieSBkZWZpbmluZyBhbiAiZWJjZGljLWhhbmRsZXIiIGZvciBhbGwKLSAgZG9jdW1lbnRzIHdoaWNoIG11c3QgYmUgY29udmVydGVkLgotIDwvUD4KLQotIDxIMiBBTElHTj1DRU5URVI+VGVjaG5pY2FsIFNvbHV0aW9uPC9IMj4KLSA8UD4KLSAgU2luY2UgYWxsIEFwYWNoZSBpbnB1dCBhbmQgb3V0cHV0IGlzIGJhc2VkIHVwb24gdGhlIEJVRkYgZGF0YSB0eXBlCi0gIGFuZCBpdHMgbWV0aG9kcywgdGhlIGVhc2llc3Qgc29sdXRpb24gd2FzIHRvIGFkZCB0aGUgY29udmVyc2lvbiB0bwotICB0aGUgQlVGRiBoYW5kbGluZyByb3V0aW5lcy4gVGhlIGNvbnZlcnNpb24gbXVzdCBiZSBzZXR0YWJsZSBhdCBhbnkKLSAgdGltZSwgc28gYSBCVUZGIGZsYWcgd2FzIGFkZGVkIHdoaWNoIGRlZmluZXMgd2hldGhlciBhIEJVRkYgb2JqZWN0Ci0gIGhhcyBjdXJyZW50bHkgZW5hYmxlZCBjb252ZXJzaW9uIG9yIG5vdC4gVGhpcyBmbGFnIGlzIG1vZGlmaWVkIGF0Ci0gIHNldmVyYWwgcG9pbnRzIGluIHRoZSBIVFRQIHByb3RvY29sOgotICA8VUw+Ci0gICA8TEk+PFNUUk9ORz5zZXQ8L1NUUk9ORz4gYmVmb3JlIGEgcmVxdWVzdCBpcyByZWNlaXZlZCAoYmVjYXVzZSB0aGUKLSAgICAgICByZXF1ZXN0IGFuZCB0aGUgcmVxdWVzdCBoZWFkZXIgbGluZXMgYXJlIGFsd2F5cyBpbiBBU0NJSQotICAgICAgIGZvcm1hdCkKLQotICAgPExJPjxTVFJPTkc+c2V0L3Vuc2V0PC9TVFJPTkc+IHdoZW4gdGhlIHJlcXVlc3QgYm9keSBpcwotICAgICAgIHJlY2VpdmVkIC0gZGVwZW5kaW5nIG9uIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIHJlcXVlc3QgYm9keQotICAgICAgIChiZWNhdXNlIHRoZSByZXF1ZXN0IGJvZHkgbWF5IGNvbnRhaW4gQVNDSUkgdGV4dCBvciBhIGJpbmFyeSBmaWxlKQotCi0gICA8TEk+PFNUUk9ORz5zZXQ8L1NUUk9ORz4gYmVmb3JlIGEgcmVwbHkgaGVhZGVyIGlzIHNlbnQgKGJlY2F1c2UgdGhlCi0gICAgICAgcmVzcG9uc2UgaGVhZGVyIGxpbmVzIGFyZSBhbHdheXMgaW4gQVNDSUkgZm9ybWF0KQotCi0gICA8TEk+PFNUUk9ORz5zZXQvdW5zZXQ8L1NUUk9ORz4gd2hlbiB0aGUgcmVzcG9uc2UgYm9keSBpcwotICAgICAgIHNlbnQgLSBkZXBlbmRpbmcgb24gdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgcmVzcG9uc2UgYm9keQotICAgICAgIChiZWNhdXNlIHRoZSByZXNwb25zZSBib2R5IG1heSBjb250YWluIHRleHQgb3IgYSBiaW5hcnkgZmlsZSkKLSAgPC9VTD4KLSA8L1A+Ci0KLTxIMiBBTElHTj1DRU5URVI+UG9ydGluZyBOb3RlczwvSDI+Ci0gPFA+Ci0gIDxPTD4KLSAgIDxMST4KLSAgIFRoZSByZWxldmFudCBjaGFuZ2VzIGluIHRoZSBzb3VyY2UgYXJlICNpZmRlZidlZCBpbnRvIHR3bwotICAgY2F0ZWdvcmllczoKLSAgIDxETD4KLSAgICA8RFQ+PENPREU+PFNUUk9ORz4jaWZkZWYgQ0hBUlNFVF9FQkNESUM8L1NUUk9ORz48L0NPREU+Ci0gICAgPEREPkNvZGUgd2hpY2ggaXMgbmVlZGVkIGZvciBhbnkgRUJDRElDIGJhc2VkIG1hY2hpbmUuIFRoaXMKLQlpbmNsdWRlcyBjaGFyYWN0ZXIgdHJhbnNsYXRpb25zLCBkaWZmZXJlbmNlcyBpbgotCWNvbnRpZ3VpdHkgb2YgdGhlIHR3byBjaGFyYWN0ZXIgc2V0cywgZmxhZ3Mgd2hpY2gKLQlpbmRpY2F0ZSB3aGljaCBwYXJ0IG9mIHRoZSBIVFRQIHByb3RvY29sIGhhcyB0byBiZQotCWNvbnZlcnRlZCBhbmQgd2hpY2ggcGFydCBkb2Vzbid0IDxFTT5ldGMuPC9FTT4KLSAgICA8RFQ+PENPREU+PFNUUk9ORz4jaWZkZWYgX09TRF9QT1NJWDwvU1RST05HPjwvQ09ERT4KLSAgICA8REQ+Q29kZSB3aGljaCBpcyBuZWVkZWQgZm9yIHRoZSBTSUVNRU5TIEJTMjAwMC9PU0QKLQltYWluZnJhbWUgcGxhdGZvcm0gb25seS4gVGhpcyBkZWFscyB3aXRoIGluY2x1ZGUgZmlsZQotCWRpZmZlcmVuY2VzIGFuZCBzb2NrZXQgaW1wbGVtZW50YXRpb24gdG9waWNzIHdoaWNoIGFyZQotCW9ubHkgcmVxdWlyZWQgb24gdGhlIEJTMjAwMC9PU0QgcGxhdGZvcm0uCi0gICA8L0RMPgotICAgPC9MST48QlI+Ci0KLSAgIDxMST4KLSAgICBUaGUgcG9zc2liaWxpdHkgdG8gdHJhbnNsYXRlIGJldHdlZW4gQVNDSUkgYW5kIEVCQ0RJQyBhdCB0aGUKLSAgICBzb2NrZXQgbGV2ZWwgKG9uIEJTMjAwMCBQT1NJWCwgdGhlcmUgaXMgYSBzb2NrZXQgb3B0aW9uIHdoaWNoCi0gICAgc3VwcG9ydHMgdGhpcykgd2FzIGludGVudGlvbmFsbHkgPEVNPm5vdDwvRU0+IGNob3NlbiwgYmVjYXVzZQotICAgIHRoZSBieXRlIHN0cmVhbSBhdCB0aGUgSFRUUCBwcm90b2NvbCBsZXZlbCBjb25zaXN0cyBvZiBhCi0gICAgbWl4dHVyZSBvZiBwcm90b2NvbCByZWxhdGVkIHN0cmluZ3MgYW5kIG5vbi1wcm90b2NvbCByZWxhdGVkCi0gICAgcmF3IGZpbGUgZGF0YS4gSFRUUCBwcm90b2NvbCBzdHJpbmdzIGFyZSBhbHdheXMgZW5jb2RlZCBpbgotICAgIEFTQ0lJICh0aGUgR0VUIHJlcXVlc3QsIGFueSBIZWFkZXI6IGxpbmVzLCB0aGUgY2h1bmtpbmcKLSAgICBpbmZvcm1hdGlvbiA8RU0+ZXRjLjwvRU0+KSB3aGVyZWFzIHRoZSBmaWxlIHRyYW5zZmVyIHBhcnRzICg8RU0+aS5lLjwvRU0+LCBHSUYKLSAgICBpbWFnZXMsIENHSSBvdXRwdXQgPEVNPmV0Yy48L0VNPikgc2hvdWxkIHVzdWFsbHkgYmUganVzdCAicGFzc2VkIHRocm91Z2giCi0gICAgYnkgdGhlIHNlcnZlci4gVGhpcyBzZXBhcmF0aW9uIGJldHdlZW4gInByb3RvY29sIHN0cmluZyIgYW5kCi0gICAgInJhdyBkYXRhIiBpcyByZWZsZWN0ZWQgaW4gdGhlIHNlcnZlciBjb2RlIGJ5IGZ1bmN0aW9ucyBsaWtlCi0gICAgYmdldHMoKSBvciBydnB1dHMoKSBmb3Igc3RyaW5ncywgYW5kIGZ1bmN0aW9ucyBsaWtlIGJ3cml0ZSgpCi0gICAgZm9yIGJpbmFyeSBkYXRhLiBBIGdsb2JhbCB0cmFuc2xhdGlvbiBvZiBldmVyeXRoaW5nIHdvdWxkCi0gICAgdGhlcmVmb3JlIGJlIGluYWRlcXVhdGUuPEJSPgotICAgIChJbiB0aGUgY2FzZSBvZiB0ZXh0IGZpbGVzIG9mIGNvdXJzZSwgcHJvdmlzaW9ucyBtdXN0IGJlIG1hZGUgc28KLSAgICB0aGF0IEVCQ0RJQyBkb2N1bWVudHMgYXJlIGFsd2F5cyBzZXJ2ZWQgaW4gQVNDSUkpCi0gICA8L0xJPjxCUj4KLQotICAgPExJPgotICAgIFRoaXMgcG9ydCB0aGVyZWZvcmUgZmVhdHVyZXMgYSBidWlsdC1pbiBwcm90b2NvbCBsZXZlbCBjb252ZXJzaW9uCi0gICAgZm9yIHRoZSBzZXJ2ZXItaW50ZXJuYWwgc3RyaW5ncyAod2hpY2ggdGhlIGNvbXBpbGVyIHRyYW5zbGF0ZWQgdG8KLSAgICBFQkNESUMgc3RyaW5ncykgYW5kIHRodXMgZm9yIGFsbCBzZXJ2ZXItZ2VuZXJhdGVkIGRvY3VtZW50cy4KLSAgICBUaGUgaGFyZCBjb2RlZCBBU0NJSSBlc2NhcGVzIFwwMTIgYW5kIFwwMTUgd2hpY2ggYXJlCi0gICAgdWJpcXVpdG91cyBpbiB0aGUgc2VydmVyIGNvZGUgYXJlIGFuIGV4Y2VwdGlvbjogdGhleSBhcmUKLSAgICBhbHJlYWR5IHRoZSBiaW5hcnkgZW5jb2Rpbmcgb2YgdGhlIEFTQ0lJIFxuIGFuZCBcciBhbmQgbXVzdAotICAgIG5vdCBiZSBjb252ZXJ0ZWQgdG8gQVNDSUkgYSBzZWNvbmQgdGltZS4gVGhpcyBleGNlcHRpb24gaXMKLSAgICBvbmx5IHJlbGV2YW50IGZvciBzZXJ2ZXItZ2VuZXJhdGVkIHN0cmluZ3M7IGFuZCA8RU0+ZXh0ZXJuYWw8L0VNPgotICAgIEVCQ0RJQyBkb2N1bWVudHMgYXJlIG5vdCBleHBlY3RlZCB0byBjb250YWluIEFTQ0lJIG5ld2xpbmUgY2hhcmFjdGVycy4KLSAgIDwvTEk+PEJSPgotCi0gICA8TEk+Ci0gICAgQnkgZXhhbWluaW5nIHRoZSBjYWxsIGhpZXJhcmNoeSBmb3IgdGhlIEJVRkYgbWFuYWdlbWVudAotICAgIHJvdXRpbmVzLCBJIGFkZGVkIGFuICJlYmNkaWMvYXNjaWkgY29udmVyc2lvbiBsYXllciIgd2hpY2gKLSAgICB3b3VsZCBiZSBjcm9zc2VkIG9uIGV2ZXJ5IHB1dHMvd3JpdGUvZ2V0L2dldHMsIGFuZCBhCi0gICAgY29udmVyc2lvbiBmbGFnIHdoaWNoIGFsbG93ZWQgZW5hYmxpbmcvZGlzYWJsaW5nIHRoZQotICAgIGNvbnZlcnNpb25zIG9uLXRoZS1mbHkuIFVzdWFsbHksIGEgZG9jdW1lbnQgY3Jvc3NlcyB0aGlzCi0gICAgbGF5ZXIgdHdpY2UgZnJvbSBpdHMgb3JpZ2luIHNvdXJjZSAoYSBmaWxlIG9yIENHSSBvdXRwdXQpIHRvCi0gICAgaXRzIGRlc3RpbmF0aW9uICh0aGUgcmVxdWVzdGluZyBjbGllbnQpOiA8U0FNUD5maWxlIC0mZ3Q7Ci0gICAgQXBhY2hlPC9TQU1QPiwgYW5kIDxTQU1QPkFwYWNoZSAtJmd0OyBjbGllbnQ8L1NBTVA+LjxCUj4KLSAgICBUaGUgc2VydmVyIGNhbiBub3cgcmVhZCB0aGUgaGVhZGVyCi0gICAgbGluZXMgb2YgYSBDR0ktc2NyaXB0IG91dHB1dCBpbiBFQkNESUMgZm9ybWF0LCBhbmQgdGhlbiBmaW5kCi0gICAgb3V0IHRoYXQgdGhlIHJlbWFpbmRlciBvZiB0aGUgc2NyaXB0J3Mgb3V0cHV0IGlzIGluIEFTQ0lJCi0gICAgKGxpa2UgaW4gdGhlIGNhc2Ugb2YgdGhlIG91dHB1dCBvZiBhIFdXVyBDb3VudGVyIHByb2dyYW06IHRoZQotICAgIGRvY3VtZW50IGJvZHkgY29udGFpbnMgYSBHSUYgaW1hZ2UpLiBBbGwgaGVhZGVyIHByb2Nlc3NpbmcgaXMKLSAgICBkb25lIGluIHRoZSBuYXRpdmUgRUJDRElDIGZvcm1hdDsgdGhlIHNlcnZlciB0aGVuIGRldGVybWluZXMsCi0gICAgYmFzZWQgb24gdGhlIHR5cGUgb2YgZG9jdW1lbnQgYmVpbmcgc2VydmVkLCB3aGV0aGVyIHRoZQotICAgIGRvY3VtZW50IGJvZHkgKGV4Y2VwdCBmb3IgdGhlIGNodW5raW5nIGluZm9ybWF0aW9uLCBvZgotICAgIGNvdXJzZSkgaXMgaW4gQVNDSUkgYWxyZWFkeSBvciBtdXN0IGJlIGNvbnZlcnRlZCBmcm9tIEVCQ0RJQy4KLSAgIDwvTEk+PEJSPgotCi0gICA8TEk+Ci0gICAgRm9yIFRleHQgZG9jdW1lbnRzIChNSU1FIHR5cGVzIHRleHQvcGxhaW4sIHRleHQvaHRtbCA8RU0+ZXRjLjwvRU0+KSwKLSAgICBhbiBpbXBsaWNpdCB0cmFuc2xhdGlvbiB0byBBU0NJSSBjYW4gYmUgdXNlZCwgb3IgKGlmIHRoZQotICAgIHVzZXJzIHByZWZlciB0byBzdG9yZSBzb21lIGRvY3VtZW50cyBpbiByYXcgQVNDSUkgZm9ybSBmb3IKLSAgICBmYXN0ZXIgc2VydmluZywgb3IgYmVjYXVzZSB0aGUgZmlsZXMgcmVzaWRlIG9uIGEgTkZTLW1vdW50ZWQKLSAgICBkaXJlY3RvcnkgdHJlZSkgY2FuIGJlIHNlcnZlZCB3aXRob3V0IGNvbnZlcnNpb24uCi0gICAgPEJSPgotICAgIDxTVFJPTkc+RXhhbXBsZTo8L1NUUk9ORz48QkxPQ0tRVU9URT4KLQl0byBzZXJ2ZSBmaWxlcyB3aXRoIHRoZSBzdWZmaXggLmFodG1sIGFzIGEgcmF3IEFTQ0lJIHRleHQvaHRtbAotCWRvY3VtZW50IHdpdGhvdXQgaW1wbGljaXQgY29udmVyc2lvbiAoYW5kIHN1ZmZpeCAuYXNjaWkKLQlhcyBBU0NJSSB0ZXh0L3BsYWluKSwgdXNlIHRoZSBkaXJlY3RpdmVzOjxQUkU+Ci0gICAgICBBZGRUeXBlICB0ZXh0L3gtYXNjaWktaHRtbCAgLmFodG1sCi0gICAgICBBZGRUeXBlICB0ZXh0L3gtYXNjaWktcGxhaW4gLmFzY2lpCi0gICAgICA8L1BSRT48L0JMT0NLUVVPVEU+Ci0gICAgU2ltaWxhcmx5LCBhbnkgdGV4dC9YWFhYIE1JTUUgdHlwZSBjYW4gYmUgc2VydmVkIGFzICJyYXcgQVNDSUkiIGJ5Ci0gICAgY29uZmlndXJpbmcgYSBNSU1FIHR5cGUgInRleHQveC1hc2NpaS1YWFhYIiBmb3IgaXQgdXNpbmcgQWRkVHlwZS4KLSAgIDwvTEk+PEJSPgotCi0gICA8TEk+Ci0gICAgTm9uLXRleHQgZG9jdW1lbnRzIGFyZSBhbHdheXMgc2VydmVkICJiaW5hcnkiIHdpdGhvdXQgY29udmVyc2lvbi4KLSAgICBUaGlzIHNlZW1zIHRvIGJlIHRoZSBtb3N0IHNlbnNpYmxlIGNob2ljZSBmb3IsIC48RU0+ZS5nLjwvRU0+LCBHSUYvWklQL0FVCi0gICAgZmlsZSB0eXBlcy4gVGhpcyBvZiBjb3Vyc2UgcmVxdWlyZXMgdGhlIHVzZXIgdG8gY29weSB0aGVtIHRvIHRoZQotICAgIG1haW5mcmFtZSBob3N0IHVzaW5nIHRoZSAicmNwIC1iIiBiaW5hcnkgc3dpdGNoLgotICAgPC9MST48QlI+Ci0KLSAgIDxMST4KLSAgICBTZXJ2ZXIgcGFyc2VkIGZpbGVzIGFyZSBhbHdheXMgYXNzdW1lZCB0byBiZSBpbiBuYXRpdmUgKDxFTT5pLmUuPC9FTT4sCi0gICAgRUJDRElDKSBmb3JtYXQgYXMgdXNlZCBvbiB0aGUgbWFjaGluZSwgYW5kIGFyZSBjb252ZXJ0ZWQgYWZ0ZXIKLSAgICBwcm9jZXNzaW5nLgotICAgPC9MST48QlI+Ci0KLSAgIDxMST4KLSAgICBGb3IgQ0dJIG91dHB1dCwgdGhlIENHSSBzY3JpcHQgZGV0ZXJtaW5lcyB3aGV0aGVyIGEgY29udmVyc2lvbiBpcwotICAgIG5lZWRlZCBvciBub3Q6IGJ5IHNldHRpbmcgdGhlIGFwcHJvcHJpYXRlIENvbnRlbnQtVHlwZSwgdGV4dCBmaWxlcwotICAgIGNhbiBiZSBjb252ZXJ0ZWQsIG9yIEdJRiBvdXRwdXQgY2FuIGJlIHBhc3NlZCB0aHJvdWdoIHVubW9kaWZpZWQuCi0gICAgQW4gZXhhbXBsZSBmb3IgdGhlIGxhdHRlciBjYXNlIGlzIHRoZSB3d3djb3VudCBwcm9ncmFtIHdoaWNoIHdlIHBvcnRlZAotICAgIGFzIHdlbGwuCi0gICA8L0xJPjxCUj4KLSAgPC9PTD4KLSA8L1A+Ci0KLSA8SDIgQUxJR049Q0VOVEVSPkRvY3VtZW50IFN0b3JhZ2UgTm90ZXM8L0gyPgotICA8SDMgQUxJR049Q0VOVEVSPkJpbmFyeSBGaWxlczwvSDM+Ci0gICA8UD4KLSAgICBBbGwgZmlsZXMgd2l0aCBhIDxTQU1QPkNvbnRlbnQtVHlwZTo8L1NBTVA+IHdoaWNoIGRvZXMgbm90Ci0gICAgc3RhcnQgd2l0aCA8U0FNUD50ZXh0LzwvU0FNUD4gYXJlIHJlZ2FyZGVkIGFzIDxFTT5iaW5hcnkgZmlsZXM8L0VNPgotICAgIGJ5IHRoZSBzZXJ2ZXIgYW5kIGFyZSBub3Qgc3ViamVjdCB0byBhbnkgY29udmVyc2lvbi4KLSAgICBFeGFtcGxlcyBmb3IgYmluYXJ5IGZpbGVzIGFyZSBHSUYgaW1hZ2VzLCBnemlwLWNvbXByZXNzZWQKLSAgICBmaWxlcyBhbmQgdGhlIGxpa2UuCi0gICA8L1A+Ci0gICA8UD4KLSAgICBXaGVuIGV4Y2hhbmdpbmcgYmluYXJ5IGZpbGVzIGJldHdlZW4gdGhlIG1haW5mcmFtZSBob3N0IGFuZCBhCi0gICAgVW5peCBtYWNoaW5lIG9yIFdpbmRvd3MgUEMsIGJlIHN1cmUgdG8gdXNlIHRoZSBmdHAgImJpbmFyeSIKLSAgICAoPFNBTVA+VFlQRSBJPC9TQU1QPikgY29tbWFuZCwgb3IgdXNlIHRoZQotICAgIDxTQU1QPnJjcCZuYnNwOy1iPC9TQU1QPiBjb21tYW5kIGZyb20gdGhlIG1haW5mcmFtZSBob3N0Ci0gICAgKHRoZSAtYiBzd2l0Y2ggaXMgbm90IHN1cHBvcnRlZCBpbiB1bml4IHJjcCdzKS4KLSAgIDwvUD4KLQotICA8SDMgQUxJR049Q0VOVEVSPlRleHQgRG9jdW1lbnRzPC9IMz4KLSAgIDxQPgotICAgIFRoZSBkZWZhdWx0IGFzc3VtcHRpb24gb2YgdGhlIHNlcnZlciBpcyB0aGF0IFRleHQgRmlsZXMKLSAgICAoPEVNPmkuZS48L0VNPiwgYWxsIGZpbGVzIHdob3NlIDxTQU1QPkNvbnRlbnQtVHlwZTo8L1NBTVA+IHN0YXJ0cyB3aXRoCi0gICAgPFNBTVA+dGV4dC88L1NBTVA+KSBhcmUgc3RvcmVkIGluIHRoZSBuYXRpdmUgY2hhcmFjdGVyCi0gICAgc2V0IG9mIHRoZSBob3N0LCBFQkNESUMuCi0gICA8L1A+Ci0KLSAgPEgzIEFMSUdOPUNFTlRFUj5TZXJ2ZXIgU2lkZSBJbmNsdWRlZCBEb2N1bWVudHM8L0gzPgotICAgPFA+Ci0gICAgU1NJIGRvY3VtZW50cyBtdXN0IGN1cnJlbnRseSBiZSBzdG9yZWQgaW4gRUJDRElDIG9ubHkuIE5vCi0gICAgcHJvdmlzaW9uIGlzIG1hZGUgdG8gY29udmVydCBpdCBmcm9tIEFTQ0lJIGJlZm9yZSBwcm9jZXNzaW5nLgotICAgPC9QPgotCi0gPEgyIEFMSUdOPUNFTlRFUj5BcGFjaGUgTW9kdWxlcycgU3RhdHVzPC9IMj4KLSA8VEFCTEUgQk9SREVSIEFMSUdOPW1pZGRsZT4KLSAgPFRSPgotICAgPFRIPk1vZHVsZQotICAgPFRIPlN0YXR1cwotICAgPFRIPk5vdGVzCi0gIDwvVFI+Ci0KLSAgPFRSPgotICAgPFREIEFMSUdOPUxFRlQ+aHR0cF9jb3JlCi0gICA8VEQgQUxJR049Q0VOVEVSPisKLSAgIDxURD4KLSAgPC9UUj4KLQotICA8VFI+Ci0gICA8VEQgQUxJR049TEVGVD5tb2RfYWNjZXNzCi0gICA8VEQgQUxJR049Q0VOVEVSPisKLSAgIDxURD4KLSAgPC9UUj4KLQotICA8VFI+Ci0gICA8VEQgQUxJR049TEVGVD5tb2RfYWN0aW9ucwotICAgPFREIEFMSUdOPUNFTlRFUj4rCi0gICA8VEQ+Ci0gIDwvVFI+Ci0KLSAgPFRSPgotICAgPFREIEFMSUdOPUxFRlQ+bW9kX2FsaWFzCi0gICA8VEQgQUxJR049Q0VOVEVSPisKLSAgIDxURD4KLSAgPC9UUj4KLQotICA8VFI+Ci0gICA8VEQgQUxJR049TEVGVD5tb2RfYXNpcwotICAgPFREIEFMSUdOPUNFTlRFUj4rCi0gICA8VEQ+Ci0gIDwvVFI+Ci0KLSAgPFRSPgotICAgPFREIEFMSUdOPUxFRlQ+bW9kX2F1dGgKLSAgIDxURCBBTElHTj1DRU5URVI+KwotICAgPFREPgotICA8L1RSPgotCi0gIDxUUj4KLSAgIDxURCBBTElHTj1MRUZUPm1vZF9hdXRoX2Fub24KLSAgIDxURCBBTElHTj1DRU5URVI+KwotICAgPFREPgotICA8L1RSPgotCi0gIDxUUj4KLSAgIDxURCBBTElHTj1MRUZUPm1vZF9hdXRoX2RiCi0gICA8VEQgQUxJR049Q0VOVEVSPj8KLSAgIDxURD53aXRoIG93biBsaWJkYi5hCi0gIDwvVFI+Ci0KLSAgPFRSPgotICAgPFREIEFMSUdOPUxFRlQ+bW9kX2F1dGhfZGJtCi0gICA8VEQgQUxJR049Q0VOVEVSPj8KLSAgIDxURD53aXRoIG93biBsaWJkYi5hCi0gIDwvVFI+Ci0KLSAgPFRSPgotICAgPFREIEFMSUdOPUxFRlQ+bW9kX2F1dG9pbmRleAotICAgPFREIEFMSUdOPUNFTlRFUj4rCi0gICA8VEQ+Ci0gIDwvVFI+Ci0KLSAgPFRSPgotICAgPFREIEFMSUdOPUxFRlQ+bW9kX2Nlcm5fbWV0YQotICAgPFREIEFMSUdOPUNFTlRFUj4/Ci0gICA8VEQ+Ci0gIDwvVFI+Ci0KLSAgPFRSPgotICAgPFREIEFMSUdOPUxFRlQ+bW9kX2NnaQotICAgPFREIEFMSUdOPUNFTlRFUj4rCi0gICA8VEQ+Ci0gIDwvVFI+Ci0KLSAgPFRSPgotICAgPFREIEFMSUdOPUxFRlQ+bW9kX2RpZ2VzdAotICAgPFREIEFMSUdOPUNFTlRFUj4rCi0gICA8VEQ+Ci0gIDwvVFI+Ci0KLSAgPFRSPgotICAgPFREIEFMSUdOPUxFRlQ+bW9kX2RpcgotICAgPFREIEFMSUdOPUNFTlRFUj4rCi0gICA8VEQ+Ci0gIDwvVFI+Ci0KLSAgPFRSPgotICAgPFREIEFMSUdOPUxFRlQ+bW9kX3NvCi0gICA8VEQgQUxJR049Q0VOVEVSPi0KLSAgIDxURD5ubyBzaGFyZWQgbGlicwotICA8L1RSPgotCi0gIDxUUj4KLSAgIDxURCBBTElHTj1MRUZUPm1vZF9lbnYKLSAgIDxURCBBTElHTj1DRU5URVI+KwotICAgPFREPgotICA8L1RSPgotCi0gIDxUUj4KLSAgIDxURCBBTElHTj1MRUZUPm1vZF9leGFtcGxlCi0gICA8VEQgQUxJR049Q0VOVEVSPi0KLSAgIDxURD4odGVzdCBiZWQgb25seSkKLSAgPC9UUj4KLQotICA8VFI+Ci0gICA8VEQgQUxJR049TEVGVD5tb2RfZXhwaXJlcwotICAgPFREIEFMSUdOPUNFTlRFUj4rCi0gICA8VEQ+Ci0gIDwvVFI+Ci0KLSAgPFRSPgotICAgPFREIEFMSUdOPUxFRlQ+bW9kX2hlYWRlcnMKLSAgIDxURCBBTElHTj1DRU5URVI+KwotICAgPFREPgotICA8L1RSPgotCi0gIDxUUj4KLSAgIDxURCBBTElHTj1MRUZUPm1vZF9pbWFwCi0gICA8VEQgQUxJR049Q0VOVEVSPisKLSAgIDxURD4KLSAgPC9UUj4KLQotICA8VFI+Ci0gICA8VEQgQUxJR049TEVGVD5tb2RfaW5jbHVkZQotICAgPFREIEFMSUdOPUNFTlRFUj4rCi0gICA8VEQ+Ci0gIDwvVFI+Ci0KLSAgPFRSPgotICAgPFREIEFMSUdOPUxFRlQ+bW9kX2luZm8KLSAgIDxURCBBTElHTj1DRU5URVI+KwotICAgPFREPgotICA8L1RSPgotCi0gIDxUUj4KLSAgIDxURCBBTElHTj1MRUZUPm1vZF9sb2dfYWdlbnQKLSAgIDxURCBBTElHTj1DRU5URVI+KwotICAgPFREPgotICA8L1RSPgotCi0gIDxUUj4KLSAgIDxURCBBTElHTj1MRUZUPm1vZF9sb2dfY29uZmlnCi0gICA8VEQgQUxJR049Q0VOVEVSPisKLSAgIDxURD4KLSAgPC9UUj4KLQotICA8VFI+Ci0gICA8VEQgQUxJR049TEVGVD5tb2RfbG9nX3JlZmVyZXIKLSAgIDxURCBBTElHTj1DRU5URVI+KwotICAgPFREPgotICA8L1RSPgotCi0gIDxUUj4KLSAgIDxURCBBTElHTj1MRUZUPm1vZF9taW1lCi0gICA8VEQgQUxJR049Q0VOVEVSPisKLSAgIDxURD4KLSAgPC9UUj4KLQotICA8VFI+Ci0gICA8VEQgQUxJR049TEVGVD5tb2RfbWltZV9tYWdpYwotICAgPFREIEFMSUdOPUNFTlRFUj4/Ci0gICA8VEQ+bm90IHBvcnRlZCB5ZXQKLSAgPC9UUj4KLQotICA8VFI+Ci0gICA8VEQgQUxJR049TEVGVD5tb2RfbmVnb3RpYXRpb24KLSAgIDxURCBBTElHTj1DRU5URVI+KwotICAgPFREPgotICA8L1RSPgotCi0gIDxUUj4KLSAgIDxURCBBTElHTj1MRUZUPm1vZF9wcm94eQotICAgPFREIEFMSUdOPUNFTlRFUj4rCi0gICA8VEQ+Ci0gIDwvVFI+Ci0KLSAgPFRSPgotICAgPFREIEFMSUdOPUxFRlQ+bW9kX3Jld3JpdGUKLSAgIDxURCBBTElHTj1DRU5URVI+KwotICAgPFREPnVudGVzdGVkCi0gIDwvVFI+Ci0KLSAgPFRSPgotICAgPFREIEFMSUdOPUxFRlQ+bW9kX3NldGVudmlmCi0gICA8VEQgQUxJR049Q0VOVEVSPisKLSAgIDxURD4KLSAgPC9UUj4KLQotICA8VFI+Ci0gICA8VEQgQUxJR049TEVGVD5tb2Rfc3BlbGluZwotICAgPFREIEFMSUdOPUNFTlRFUj4rCi0gICA8VEQ+Ci0gIDwvVFI+Ci0KLSAgPFRSPgotICAgPFREIEFMSUdOPUxFRlQ+bW9kX3N0YXR1cwotICAgPFREIEFMSUdOPUNFTlRFUj4rCi0gICA8VEQ+Ci0gIDwvVFI+Ci0KLSAgPFRSPgotICAgPFREIEFMSUdOPUxFRlQ+bW9kX3VuaXF1ZV9pZAotICAgPFREIEFMSUdOPUNFTlRFUj4rCi0gICA8VEQ+Ci0gIDwvVFI+Ci0KLSAgPFRSPgotICAgPFREIEFMSUdOPUxFRlQ+bW9kX3VzZXJkaXIKLSAgIDxURCBBTElHTj1DRU5URVI+KwotICAgPFREPgotICA8L1RSPgotCi0gIDxUUj4KLSAgIDxURCBBTElHTj1MRUZUPm1vZF91c2VydHJhY2sKLSAgIDxURCBBTElHTj1DRU5URVI+PwotICAgPFREPnVudGVzdGVkCi0gIDwvVFI+Ci0gPC9UQUJMRT4KLQotIDxIMiBBTElHTj1DRU5URVI+VGhpcmQgUGFydHkgTW9kdWxlcycgU3RhdHVzPC9IMj4KLSA8VEFCTEUgQk9SREVSIEFMSUdOPW1pZGRsZT4KLSAgPFRSPgotICAgPFRIPk1vZHVsZQotICAgPFRIPlN0YXR1cwotICAgPFRIPk5vdGVzCi0gIDwvVFI+Ci0KLSAgPFRSPgotICAgPFREIEFMSUdOPUxFRlQ+PEEgSFJFRj0iaHR0cDovL2phdmEuYXBhY2hlLm9yZy8iPm1vZF9qc2VydjwvQT4KLSAgIDxURCBBTElHTj1DRU5URVI+LQotICAgPFREPkpBVkEgc3RpbGwgYmVpbmcgcG9ydGVkLgotICA8L1RSPgotCi0gIDxUUj4KLSAgIDxURCBBTElHTj1MRUZUPjxBIEhSRUY9Imh0dHA6Ly93d3cucGhwLm5ldC8iPm1vZF9waHAzPC9BPgotICAgPFREIEFMSUdOPUNFTlRFUj4rCi0gICA8VEQ+bW9kX3BocDMgcnVucyBmaW5lLCB3aXRoIExEQVAgYW5kIEdEIGFuZCBGcmVlVHlwZSBsaWJyYXJpZXMKLSAgPC9UUj4KLQotICA8VFI+Ci0gICA8VEQgQUxJR049TEVGVAotICAgPjxBIEhSRUY9Imh0dHA6Ly9ocHd3dy5lYy1seW9uLmZyL352aW5jZW50L2FwYWNoZS9tb2RfcHV0Lmh0bWwiPm1vZF9wdXQ8L0E+Ci0gICA8VEQgQUxJR049Q0VOVEVSPj8KLSAgIDxURD51bnRlc3RlZAotICA8L1RSPgotCi0gIDxUUj4KLSAgIDxURCBBTElHTj1MRUZUCi0gICA+PEEgSFJFRj0iZnRwOi8vaGFjaGltYW4udmlkeWEuY29tL3B1Yi9hcGFjaGUvIj5tb2Rfc2Vzc2lvbjwvQT4KLSAgIDxURCBBTElHTj1DRU5URVI+LQotICAgPFREPnVudGVzdGVkCi0gIDwvVFI+Ci0KLSA8L1RBQkxFPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvZW52Lmh0bWwgYi9kb2NzL21hbnVhbC9lbnYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYyZGJlOS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9lbnYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+U3BlY2lhbCBQdXJwb3NlIEVudmlyb25tZW50IFZhcmlhYmxlczwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPlNwZWNpYWwgUHVycG9zZSBFbnZpcm9ubWVudCBWYXJpYWJsZXM8L0gxPgotPFA+Ci1JbnRlcm9wZXJhYmlsaXR5IHByb2JsZW1zIGhhdmUgbGVkIHRvIHRoZSBpbnRyb2R1Y3Rpb24gb2YKLW1lY2hhbmlzbXMgdG8gbW9kaWZ5IHRoZSB3YXkgQXBhY2hlIGJlaGF2ZXMgd2hlbiB0YWxraW5nIHRvIHBhcnRpY3VsYXIKLWNsaWVudHMuIFRvIG1ha2UgdGhlc2UgbWVjaGFuaXNtcyBhcyBmbGV4aWJsZSBhcyBwb3NzaWJsZSwgdGhleQotYXJlIGludm9rZWQgYnkgZGVmaW5pbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzLCB0eXBpY2FsbHkgd2l0aAotPEEgSFJFRj0ibW9kL21vZF9icm93c2VyLmh0bWwjYnJvd3Nlcm1hdGNoIj5Ccm93c2VyTWF0Y2g8L0E+LCB0aG91Z2gKLTxBIEhSRUY9Im1vZC9tb2RfZW52Lmh0bWwjc2V0ZW52Ij5TZXRFbnY8L0E+IGFuZAotPEEgSFJFRj0ibW9kL21vZF9lbnYuaHRtbCNwYXNzZW52Ij5QYXNzRW52PC9BPiBjb3VsZCBhbHNvIGJlIHVzZWQsIGZvcgotZXhhbXBsZS4KLTwvUD4KLQotPEgyPmRvd25ncmFkZS0xLjA8L0gyPgotPFA+Ci1UaGlzIGZvcmNlcyB0aGUgcmVxdWVzdCB0byBiZSB0cmVhdGVkIGFzIGEgSFRUUC8xLjAgcmVxdWVzdCBldmVuIGlmIGl0Ci13YXMgaW4gYSBsYXRlciBkaWFsZWN0LgotPC9QPgotCi08SDI+Zm9yY2Utbm8tdmFyeTwvSDI+Ci08UD4KLVRoaXMgY2F1c2VzIGFueSA8Q09ERT5WYXJ5PC9DT0RFPiBmaWVsZHMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSByZXNwb25zZQotaGVhZGVyIGJlZm9yZSBpdCBpcyBzZW50IGJhY2sgdG8gdGhlIGNsaWVudC4gIFNvbWUgY2xpZW50cyBkb24ndAotaW50ZXJwcmV0IHRoaXMgZmllbGQgY29ycmVjdGx5IChzZWUgdGhlCi08QSBIUkVGPSJtaXNjL2tub3duX2NsaWVudF9wcm9ibGVtcy5odG1sIj5rbm93biBjbGllbnQgcHJvYmxlbXM8L0E+Ci1wYWdlKTsgc2V0dGluZyB0aGlzIHZhcmlhYmxlIGNhbiB3b3JrIGFyb3VuZCB0aGlzIHByb2JsZW0uICBTZXR0aW5nCi10aGlzIHZhcmlhYmxlIGFsc28gaW1wbGllcyA8U1RST05HPmZvcmNlLXJlc3BvbnNlLTEuMDwvU1RST05HPi4KLTwvUD4KLQotPEgyPmZvcmNlLXJlc3BvbnNlLTEuMDwvSDI+Ci08UD4KLVRoaXMgZm9yY2VzIGFuIEhUVFAvMS4wIHJlc3BvbnNlIHdoZW4gc2V0LiBJdCB3YXMgb3JpZ2luYWxseSBpbXBsZW1lbnRlZCBhcyBhCi1yZXN1bHQgb2YgYSBwcm9ibGVtIHdpdGggQU9MJ3MgcHJveGllcy4gIFNvbWUgY2xpZW50cyBtYXkgbm90IGJlaGF2ZSBjb3JyZWN0bHkKLXdoZW4gZ2l2ZW4gYW4gSFRUUC8xLjEgcmVzcG9uc2UsIGFuZCB0aGlzIGNhbiBiZSB1c2VkIHRvIGludGVyb3BlcmF0ZSB3aXRoCi10aGVtLgotPC9QPgotCi08SDI+bm9rZWVwYWxpdmU8L0gyPgotPFA+Ci1UaGlzIGRpc2FibGVzIDxBIEhSRUY9Im1vZC9jb3JlLmh0bWwja2VlcGFsaXZlIj5LZWVwQWxpdmU8L0E+IHdoZW4gc2V0LiBCZWNhdXNlCi1vZiBwcm9ibGVtcyB3aXRoIE5ldHNjYXBlIDIueCBhbmQgS2VlcEFsaXZlLCB3ZSByZWNvbW1lbmQgdGhlIGZvbGxvd2luZwotZGlyZWN0aXZlIGJlIHVzZWQ6Ci08L1A+Ci08UFJFPgotICAgIEJyb3dzZXJNYXRjaCBNb3ppbGxhLzIgbm9rZWVwYWxpdmUKLTwvUFJFPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvZW52Lmh0bWwuZW4gYi9kb2NzL21hbnVhbC9lbnYuaHRtbC5lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYyZGJlOS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9lbnYuaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+U3BlY2lhbCBQdXJwb3NlIEVudmlyb25tZW50IFZhcmlhYmxlczwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPlNwZWNpYWwgUHVycG9zZSBFbnZpcm9ubWVudCBWYXJpYWJsZXM8L0gxPgotPFA+Ci1JbnRlcm9wZXJhYmlsaXR5IHByb2JsZW1zIGhhdmUgbGVkIHRvIHRoZSBpbnRyb2R1Y3Rpb24gb2YKLW1lY2hhbmlzbXMgdG8gbW9kaWZ5IHRoZSB3YXkgQXBhY2hlIGJlaGF2ZXMgd2hlbiB0YWxraW5nIHRvIHBhcnRpY3VsYXIKLWNsaWVudHMuIFRvIG1ha2UgdGhlc2UgbWVjaGFuaXNtcyBhcyBmbGV4aWJsZSBhcyBwb3NzaWJsZSwgdGhleQotYXJlIGludm9rZWQgYnkgZGVmaW5pbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzLCB0eXBpY2FsbHkgd2l0aAotPEEgSFJFRj0ibW9kL21vZF9icm93c2VyLmh0bWwjYnJvd3Nlcm1hdGNoIj5Ccm93c2VyTWF0Y2g8L0E+LCB0aG91Z2gKLTxBIEhSRUY9Im1vZC9tb2RfZW52Lmh0bWwjc2V0ZW52Ij5TZXRFbnY8L0E+IGFuZAotPEEgSFJFRj0ibW9kL21vZF9lbnYuaHRtbCNwYXNzZW52Ij5QYXNzRW52PC9BPiBjb3VsZCBhbHNvIGJlIHVzZWQsIGZvcgotZXhhbXBsZS4KLTwvUD4KLQotPEgyPmRvd25ncmFkZS0xLjA8L0gyPgotPFA+Ci1UaGlzIGZvcmNlcyB0aGUgcmVxdWVzdCB0byBiZSB0cmVhdGVkIGFzIGEgSFRUUC8xLjAgcmVxdWVzdCBldmVuIGlmIGl0Ci13YXMgaW4gYSBsYXRlciBkaWFsZWN0LgotPC9QPgotCi08SDI+Zm9yY2Utbm8tdmFyeTwvSDI+Ci08UD4KLVRoaXMgY2F1c2VzIGFueSA8Q09ERT5WYXJ5PC9DT0RFPiBmaWVsZHMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSByZXNwb25zZQotaGVhZGVyIGJlZm9yZSBpdCBpcyBzZW50IGJhY2sgdG8gdGhlIGNsaWVudC4gIFNvbWUgY2xpZW50cyBkb24ndAotaW50ZXJwcmV0IHRoaXMgZmllbGQgY29ycmVjdGx5IChzZWUgdGhlCi08QSBIUkVGPSJtaXNjL2tub3duX2NsaWVudF9wcm9ibGVtcy5odG1sIj5rbm93biBjbGllbnQgcHJvYmxlbXM8L0E+Ci1wYWdlKTsgc2V0dGluZyB0aGlzIHZhcmlhYmxlIGNhbiB3b3JrIGFyb3VuZCB0aGlzIHByb2JsZW0uICBTZXR0aW5nCi10aGlzIHZhcmlhYmxlIGFsc28gaW1wbGllcyA8U1RST05HPmZvcmNlLXJlc3BvbnNlLTEuMDwvU1RST05HPi4KLTwvUD4KLQotPEgyPmZvcmNlLXJlc3BvbnNlLTEuMDwvSDI+Ci08UD4KLVRoaXMgZm9yY2VzIGFuIEhUVFAvMS4wIHJlc3BvbnNlIHdoZW4gc2V0LiBJdCB3YXMgb3JpZ2luYWxseSBpbXBsZW1lbnRlZCBhcyBhCi1yZXN1bHQgb2YgYSBwcm9ibGVtIHdpdGggQU9MJ3MgcHJveGllcy4gIFNvbWUgY2xpZW50cyBtYXkgbm90IGJlaGF2ZSBjb3JyZWN0bHkKLXdoZW4gZ2l2ZW4gYW4gSFRUUC8xLjEgcmVzcG9uc2UsIGFuZCB0aGlzIGNhbiBiZSB1c2VkIHRvIGludGVyb3BlcmF0ZSB3aXRoCi10aGVtLgotPC9QPgotCi08SDI+bm9rZWVwYWxpdmU8L0gyPgotPFA+Ci1UaGlzIGRpc2FibGVzIDxBIEhSRUY9Im1vZC9jb3JlLmh0bWwja2VlcGFsaXZlIj5LZWVwQWxpdmU8L0E+IHdoZW4gc2V0LiBCZWNhdXNlCi1vZiBwcm9ibGVtcyB3aXRoIE5ldHNjYXBlIDIueCBhbmQgS2VlcEFsaXZlLCB3ZSByZWNvbW1lbmQgdGhlIGZvbGxvd2luZwotZGlyZWN0aXZlIGJlIHVzZWQ6Ci08L1A+Ci08UFJFPgotICAgIEJyb3dzZXJNYXRjaCBNb3ppbGxhLzIgbm9rZWVwYWxpdmUKLTwvUFJFPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvZXhwYW5kLnBsIGIvZG9jcy9tYW51YWwvZXhwYW5kLnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjg2MTQ5Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2V4cGFuZC5wbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0jIS91c3IvbG9jYWwvYmluL3Blcmw1Ci0KLSMgVGhpcyBpcyBhIHZlcnkgc2ltcGxlIFBlcmwgc2NyaXB0IHRvIGV4cGFuZCBzZXJ2ZXItc2lkZSBpbmNsdWRlcwotIyBpbiB0aGUgZGlyZWN0b3J5IGl0IGlzIHJ1biwgYW5kIGRpcmVjdCBzdWJkaXJlY3Rvcmllcy4gSXQgd2lsbAotIyB3b3JrIG9ubHkgb24gU1NJIGRpcmVjdGl2ZXMgb2YgdGhlIGZvcm0KLSMKLSMgPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZpbGVuYW1lIiAtLT4KLSMKLSMgRmlsZW5hbWUgbXVzdCBiZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoZSBmaWxlIGFwcGVhcnMgaW4uCi0jCi0jIE5vdiAzMCwgMTk5NiAtIEFsZXhlaSBLb3N1dCA8YWtvc3V0QGFwYWNoZS5vcmc+Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgQ29weXJpZ2h0IChjKSAxOTk2LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSMgYXJlIG1ldDoKLSMKLSMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSMKLSMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0jICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgICAgZGlzdHJpYnV0aW9uLgotIwotIyAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSMgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0jICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSMgICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSMKLSMgNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotIyAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotIyAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0jICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotIyAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0jCi0jIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSMgICAgYWNrbm93bGVkZ21lbnQ6Ci0jICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSMgICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0jIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0jIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0jIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0jIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0jIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIyBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0jIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotIyBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSMgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0jIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotCi0jIFB1dCBhIGxpc3Qgb2YgZGlycyAoZXhjZXB0IC4uKSBpbnRvIEBkaXJzCi0KLW9wZW5kaXIgRElSLCAiLiIgb3IgZGllICJDb3VsZCBub3Qgb3BlbiBkaXJlY3Rvcnk6ICQhIjsKLUBkaXJzID0gZ3JlcCAhL15cLlwuJC8sIChncmVwIC1kLCByZWFkZGlyIERJUik7Ci1jbG9zZWRpciBESVI7Ci0KLWZvcmVhY2ggJGRpciAoQGRpcnMpIHsKLSAgICBwcmludCAiRW50ZXJpbmcgZGlyZWN0b3J5ICRkaXJcbiI7Ci0gICAgb3BlbmRpciBTVUJESVIsICIkZGlyIiBvciBkaWUgIkNvdWxkIG5vdCBvcGVuIHN1YmRpciAkZGlyOiAkISI7Ci0gICAgZm9yZWFjaCAkZmlsZSAoZ3JlcCAvXC5odG1sJC8sIHJlYWRkaXIgU1VCRElSKSB7Ci0JcHJpbnQgIkV4cGFuZGluZyBmaWxlICRkaXIvJGZpbGVcbiI7Ci0JcmVuYW1lICIkZGlyLyRmaWxlIiwgIiRkaXIvJHtmaWxlfS5vbGQiOwotCW9wZW4gUkVBRCwgIiRkaXIvJHtmaWxlfS5vbGQiIG9yIGRpZSAiQ291bGRuJ3QgcmVhZCAkZGlyLyRmaWxlOiAkISI7Ci0Jb3BlbiBXUklURSwgIj4kZGlyLyRmaWxlIiBvciBkaWUgIkNvdWxkbid0IHdyaXRlICRkaXIvJGZpbGU6ICQhIjsKLQl3aGlsZSAoJHIgPSA8UkVBRD4pIHsKLQkgICAgaWYgKCRyID1+IC88IS0tI2luY2x1ZGUgdmlydHVhbD0iKC4qKSIgLS0+LykgewotCQkoJHByZSwgJGluY2x1ZGUsICRwb3N0KSA9ICgkYCwgJDEsICQnKTsKLQkJcHJpbnQgV1JJVEUgJHByZTsKLQotCQlvcGVuIElOQywgIiRkaXIvJGluY2x1ZGUiIG9yCi0JCSAgICBwcmludCAiQ291bGQgbm90IGluY2x1ZGUgZmlsZSAkZGlyLyRpbmNsdWRlOiAkISI7Ci0JCXByaW50IFdSSVRFIHdoaWxlICg8SU5DPik7Ci0JCWNsb3NlIElOQzsKLQotCQlwcmludCBXUklURSAkcG9zdDsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJcHJpbnQgV1JJVEUgJHI7Ci0JICAgIH0KLQl9Ci0JY2xvc2UgUkVBRDsKLQljbG9zZSBXUklURTsKLQl1bmxpbmsgIiRkaXIvJGZpbGUub2xkIjsKLSAgICB9Ci0gICAgY2xvc2VkaXIgU1VCRElSOwotfQotCi0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2Zvb3Rlci5odG1sIGIvZG9jcy9tYW51YWwvZm9vdGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MmQyNGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvZm9vdGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTxIUj4KLSA8SDMgQUxJR049IkNFTlRFUiI+Ci0gIEFwYWNoZSBIVFRQIFNlcnZlciBWZXJzaW9uIDEuMwotIDwvSDM+Ci0KLTxBIEhSRUY9Ii4vIj48SU1HIFNSQz0iaW1hZ2VzL2luZGV4LmdpZiIgQUxUPSJJbmRleCI+PC9BPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvaGFuZGxlci5odG1sIGIvZG9jcy9tYW51YWwvaGFuZGxlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmYxNmZkLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2hhbmRsZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSdzIEhhbmRsZXIgVXNlPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+QXBhY2hlJ3MgSGFuZGxlciBVc2U8L0gxPgotCi08SDI+V2hhdCBpcyBhIEhhbmRsZXI8L0gyPgotCi08UD5BICJoYW5kbGVyIiBpcyBhbiBpbnRlcm5hbCBBcGFjaGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFjdGlvbiB0byBiZQotcGVyZm9ybWVkIHdoZW4gYSBmaWxlIGlzIGNhbGxlZC4gR2VuZXJhbGx5LCBmaWxlcyBoYXZlIGltcGxpY2l0Ci1oYW5kbGVycywgYmFzZWQgb24gdGhlIGZpbGUgdHlwZS4gTm9ybWFsbHksIGFsbCBmaWxlcyBhcmUgc2ltcGx5Ci1zZXJ2ZWQgYnkgdGhlIHNlcnZlciwgYnV0IGNlcnRhaW4gZmlsZSB0eXBlZCBhcmUgImhhbmRsZWQiCi1zZXBhcmF0ZWx5LiBGb3IgZXhhbXBsZSwgeW91IG1heSB1c2UgYSB0eXBlIG9mCi0iYXBwbGljYXRpb24veC1odHRwZC1jZ2kiIHRvIGludm9rZSBDR0kgc2NyaXB0cy48L1A+Ci0KLTxQPkFwYWNoZSAxLjEgYWRkcyB0aGUgYWRkaXRpb25hbCBhYmlsaXR5IHRvIHVzZSBoYW5kbGVycwotZXhwbGljaXRseS4gRWl0aGVyIGJhc2VkIG9uIGZpbGVuYW1lIGV4dGVuc2lvbnMgb3Igb24gbG9jYXRpb24sIHRoZXNlCi1oYW5kbGVycyBhcmUgdW5yZWxhdGVkIHRvIGZpbGUgdHlwZS4gVGhpcyBpcyBhZHZhbnRhZ2VvdXMgYm90aCBiZWNhdXNlCi1pdCBpcyBhIG1vcmUgZWxlZ2FudCBzb2x1dGlvbiwgYnV0IGl0IGFsc28gYWxsb3dzIGZvciBib3RoIGEgdHlwZQotPFNUUk9ORz5hbmQ8L1NUUk9ORz4gYSBoYW5kbGVyIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhIGZpbGUgKFNlZSBhbHNvCi08QSBIUkVGPSJtb2QvbW9kX21pbWUuaHRtbCNtdWx0aXBsZWV4dCI+RmlsZXMgd2l0aCBNdWx0aXBsZSBFeHRlbnNpb25zPC9BPikKLQotPC9QPgotCi08UD5IYW5kbGVycyBjYW4gZWl0aGVyIGJlIGJ1aWx0IGludG8gdGhlIHNlcnZlciBvciB0byBhIG1vZHVsZSwgb3IKLXRoZXkgY2FuIGJlIGFkZGVkIHdpdGggdGhlIDxBCi1IUkVGPSJtb2QvbW9kX2FjdGlvbnMuaHRtbCNhY3Rpb24iPkFjdGlvbjwvQT4gZGlyZWN0aXZlLiBUaGUgYnVpbHQtaW4KLWhhbmRsZXJzIGluIHRoZSBzdGFuZGFyZCBkaXN0cmlidXRpb24gYXJlIGFzIGZvbGxvd3M6PC9QPgotCi08VUw+Ci08TEk+PFNUUk9ORz5kZWZhdWx0LWhhbmRsZXI8L1NUUk9ORz46Ci0gICAgU2VuZCB0aGUgZmlsZSB1c2luZyB0aGUgPENPREU+ZGVmYXVsdF9oYW5kbGVyKCk8L0NPREU+LCB3aGljaCBpcyB0aGUgCi0gICAgaGFuZGxlciB1c2VkIGJ5IGRlZmF1bHQgdG8gaGFuZGxlIHN0YXRpYyBjb250ZW50LgotICAgIChjb3JlKQotPExJPjxTVFJPTkc+c2VuZC1hcy1pczwvU1RST05HPjoKLSAgICBTZW5kIGZpbGUgd2l0aCBIVFRQIGhlYWRlcnMgYXMgaXMuCi0gICAgKDxBIEhSRUY9Im1vZC9tb2RfYXNpcy5odG1sIj5tb2RfYXNpczwvQT4pCi08TEk+PFNUUk9ORz5jZ2ktc2NyaXB0PC9TVFJPTkc+OgotICAgIFRyZWF0IHRoZSBmaWxlIGFzIGEgQ0dJIHNjcmlwdC4KLSAgICAoPEEgSFJFRj0ibW9kL21vZF9jZ2kuaHRtbCI+bW9kX2NnaTwvQT4pCi08TEk+PFNUUk9ORz5pbWFwLWZpbGU8L1NUUk9ORz46Ci0gICAgSW1hZ2VtYXAgcnVsZSBmaWxlLgotICAgICg8QSBIUkVGPSJtb2QvbW9kX2ltYXAuaHRtbCI+bW9kX2ltYXA8L0E+KQotPExJPjxTVFJPTkc+c2VydmVyLWluZm88L1NUUk9ORz46Ci0gICAgR2V0IHRoZSBzZXJ2ZXIncyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCi0gICAgKDxBIEhSRUY9Im1vZC9tb2RfaW5mby5odG1sIj5tb2RfaW5mbzwvQT4pCi08TEk+PFNUUk9ORz5zZXJ2ZXItcGFyc2VkPC9TVFJPTkc+OgotICAgIFBhcnNlIGZvciBzZXJ2ZXItc2lkZSBpbmNsdWRlcwotICAgICg8QSBIUkVGPSJtb2QvbW9kX2luY2x1ZGUuaHRtbCI+bW9kX2luY2x1ZGU8L0E+KQotPExJPjxTVFJPTkc+c2VydmVyLXN0YXR1czwvU1RST05HPjoKLSAgICBHZXQgdGhlIHNlcnZlcidzIHN0YXR1cyByZXBvcnQKLSAgICAoPEEgSFJFRj0ibW9kL21vZF9zdGF0dXMuaHRtbCI+bW9kX3N0YXR1czwvQT4pCi08TEk+PFNUUk9ORz50eXBlLW1hcDwvU1RST05HPjoKLSAgICBQYXJzZSBhcyBhIHR5cGUgbWFwIGZpbGUgZm9yIGNvbnRlbnQgbmVnb3RpYXRpb24KLSAgICAoPEEgSFJFRj0ibW9kL21vZF9uZWdvdGlhdGlvbi5odG1sIj5tb2RfbmVnb3RpYXRpb248L0E+KQotPC9VTD4KLQotPFA+Ci0KLTxIMj5EaXJlY3RpdmVzPC9IMj4KLTxVTD4KLTxMST48QSBIUkVGPSIjYWRkaGFuZGxlciI+QWRkSGFuZGxlcjwvQT4KLTxMST48QSBIUkVGPSIjc2V0aGFuZGxlciI+U2V0SGFuZGxlcjwvQT4KLTwvVUw+Ci0KLTxIUj4KLQotPEgyPjxBIE5BTUU9ImFkZGhhbmRsZXIiPkFkZEhhbmRsZXI8L0E+PC9IMj4KLQotPEEKLSBIUkVGPSJtb2QvZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQWRkSGFuZGxlciA8RU0+aGFuZGxlci1uYW1lIGV4dGVuc2lvbiBleHRlbnNpb24uLi48L0VNPjxCUj4KLTxBCi0gSFJFRj0ibW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0ibW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBGaWxlSW5mbzxCUj4KLTxBCi0gSFJFRj0ibW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9Im1vZC9kaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfbWltZTxCUj4KLTxBCi0gSFJFRj0ibW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gQWRkSGFuZGxlciBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUKLTEuMSBhbmQgbGF0ZXI8UD4KLQotPFA+QWRkSGFuZGxlciBtYXBzIHRoZSBmaWxlbmFtZSBleHRlbnNpb25zIDxFTT5leHRlbnNpb248L0VNPiB0byB0aGUKLWhhbmRsZXIgPEVNPmhhbmRsZXItbmFtZTwvRU0+LiAgVGhpcyBtYXBwaW5nIGlzIGFkZGVkIHRvIGFueSBhbHJlYWR5Ci1pbiBmb3JjZSwgb3ZlcnJpZGluZyBhbnkgbWFwcGluZ3MgdGhhdCBhbHJlYWR5IGV4aXN0IGZvciB0aGUgc2FtZQotPEVNPmV4dGVuc2lvbjwvRU0+LgotCi1Gb3IgZXhhbXBsZSwgdG8gYWN0aXZhdGUgQ0dJIHNjcmlwdHMKLXdpdGggdGhlIGZpbGUgZXh0ZW5zaW9uICI8Q09ERT4uY2dpPC9DT0RFPiIsIHlvdSBtaWdodCB1c2U6Ci08UFJFPgotICAgIEFkZEhhbmRsZXIgY2dpLXNjcmlwdCBjZ2kKLTwvUFJFPgotCi08UD5PbmNlIHRoYXQgaGFzIGJlZW4gcHV0IGludG8geW91ciBzcm0uY29uZiBvciBodHRwZC5jb25mIGZpbGUsIGFueQotZmlsZSBjb250YWluaW5nIHRoZSAiPENPREU+LmNnaTwvQ09ERT4iIGV4dGVuc2lvbiB3aWxsIGJlIHRyZWF0ZWQgYXMgYQotQ0dJIHByb2dyYW0uPC9QPiAKLQotPFA+Ci0KLTxTVFJPTkc+U2VlIGFsc288L1NUUk9ORz46IDxBIEhSRUY9Im1vZC9tb2RfbWltZS5odG1sI211bHRpcGxlZXh0Ij5GaWxlcyB3aXRoCi1tdWx0aXBsZSBleHRlbnNpb25zPC9BPgotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJzZXRoYW5kbGVyIj5TZXRIYW5kbGVyPC9BPjwvSDI+Ci0KLTxBCi0gSFJFRj0ibW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFNldEhhbmRsZXIgPEVNPmhhbmRsZXItbmFtZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJtb2QvZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBkaXJlY3RvcnksIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0ibW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9Im1vZC9kaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfbWltZTxCUj4KLTxBCi0gSFJFRj0ibW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gU2V0SGFuZGxlciBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUKLTEuMSBhbmQgbGF0ZXIuPFA+Ci0KLTxQPldoZW4gcGxhY2VkIGludG8gYW4gPENPREU+Lmh0YWNjZXNzPC9DT0RFPiBmaWxlIG9yIGEKLTxDT0RFPiZsdDtEaXJlY3RvcnkmZ3Q7PC9DT0RFPiBvciA8Q09ERT4mbHQ7TG9jYXRpb24mZ3Q7PC9DT0RFPgotc2VjdGlvbiwgdGhpcyBkaXJlY3RpdmUgZm9yY2VzIGFsbCBtYXRjaGluZyBmaWxlcyB0byBiZSBwYXJzZWQgdGhyb3VnaAotdGhlIGhhbmRsZXIgZ2l2ZW4gYnkgPEVNPmhhbmRsZXItbmFtZTwvRU0+LiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhZCBhCi1kaXJlY3RvcnkgeW91IHdhbnRlZCB0byBiZSBwYXJzZWQgZW50aXJlbHkgYXMgaW1hZ2VtYXAgcnVsZSBmaWxlcywKLXJlZ2FyZGxlc3Mgb2YgZXh0ZW5zaW9uLCB5b3UgbWlnaHQgcHV0IHRoZSBmb2xsb3dpbmcgaW50byBhbgotPENPREU+Lmh0YWNjZXNzPC9DT0RFPiBmaWxlIGluIHRoYXQgZGlyZWN0b3J5OiAKLTxQUkU+Ci0gICAgU2V0SGFuZGxlciBpbWFwLWZpbGUKLTwvUFJFPgotCi08UD5Bbm90aGVyIGV4YW1wbGU6IGlmIHlvdSB3YW50ZWQgdG8gaGF2ZSB0aGUgc2VydmVyIGRpc3BsYXkgYSBzdGF0dXMKLXJlcG9ydCB3aGVuZXZlciBhIFVSTCBvZiA8Q09ERT5odHRwOi8vc2VydmVybmFtZS9zdGF0dXM8L0NPREU+IHdhcwotY2FsbGVkLCB5b3UgbWlnaHQgcHV0IHRoZSBmb2xsb3dpbmcgaW50byBhY2Nlc3MuY29uZjoKLTxQUkU+Ci0gICAgJmx0O0xvY2F0aW9uIC9zdGF0dXMmZ3Q7Ci0gICAgU2V0SGFuZGxlciBzZXJ2ZXItc3RhdHVzCi0gICAgJmx0Oy9Mb2NhdGlvbiZndDsKLTwvUFJFPgotPEhSPgotCi08SDI+UHJvZ3JhbW1lcidzIE5vdGU8L0gyPgotCi08UD5JbiBvcmRlciB0byBpbXBsZW1lbnQgdGhlIGhhbmRsZXIgZmVhdHVyZXMsIGFuIGFkZGl0aW9uIGhhcyBiZWVuCi1tYWRlIHRvIHRoZSA8QSBIUkVGPSJtaXNjL0FQSS5odG1sIj5BcGFjaGUgQVBJPC9BPiB0aGF0IHlvdSBtYXkgd2lzaCB0bwotbWFrZSB1c2Ugb2YuIFNwZWNpZmljYWxseSwgYSBuZXcgcmVjb3JkIGhhcyBiZWVuIGFkZGVkIHRvIHRoZQotPENPREU+cmVxdWVzdF9yZWM8L0NPREU+IHN0cnVjdHVyZTo8L1A+Ci08UFJFPgotICAgIGNoYXIgKmhhbmRsZXIKLTwvUFJFPgotPFA+SWYgeW91IHdpc2ggdG8gaGF2ZSB5b3VyIG1vZHVsZSBlbmdhZ2UgYSBoYW5kbGVyLCB5b3UgbmVlZCBvbmx5IHRvCi1zZXQgPENPREU+ci0mZ3Q7aGFuZGxlcjwvQ09ERT4gdG8gdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIgYXQgYW55IHRpbWUKLXByaW9yIHRvIHRoZSA8Q09ERT5pbnZva2VfaGFuZGxlcjwvQ09ERT4gc3RhZ2Ugb2YgdGhlCi1yZXF1ZXN0LiBIYW5kbGVycyBhcmUgaW1wbGVtZW50ZWQgYXMgdGhleSB3ZXJlIGJlZm9yZSwgYWxiZWl0IHVzaW5nCi10aGUgaGFuZGxlciBuYW1lIGluc3RlYWQgb2YgYSBjb250ZW50IHR5cGUuIFdoaWxlIGl0IGlzIG5vdAotbmVjZXNzYXJ5LCB0aGUgbmFtaW5nIGNvbnZlbnRpb24gZm9yIGhhbmRsZXJzIGlzIHRvIHVzZSBhCi1kYXNoLXNlcGFyYXRlZCB3b3JkLCB3aXRoIG5vIHNsYXNoZXMsIHNvIGFzIHRvIG5vdCBpbnZhZGUgdGhlIG1lZGlhCi10eXBlIG5hbWUtc3BhY2UuPC9QPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9oYW5kbGVyLmh0bWwuZW4gYi9kb2NzL21hbnVhbC9oYW5kbGVyLmh0bWwuZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZjE2ZmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvaGFuZGxlci5odG1sLmVuCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlJ3MgSGFuZGxlciBVc2U8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5BcGFjaGUncyBIYW5kbGVyIFVzZTwvSDE+Ci0KLTxIMj5XaGF0IGlzIGEgSGFuZGxlcjwvSDI+Ci0KLTxQPkEgImhhbmRsZXIiIGlzIGFuIGludGVybmFsIEFwYWNoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWN0aW9uIHRvIGJlCi1wZXJmb3JtZWQgd2hlbiBhIGZpbGUgaXMgY2FsbGVkLiBHZW5lcmFsbHksIGZpbGVzIGhhdmUgaW1wbGljaXQKLWhhbmRsZXJzLCBiYXNlZCBvbiB0aGUgZmlsZSB0eXBlLiBOb3JtYWxseSwgYWxsIGZpbGVzIGFyZSBzaW1wbHkKLXNlcnZlZCBieSB0aGUgc2VydmVyLCBidXQgY2VydGFpbiBmaWxlIHR5cGVkIGFyZSAiaGFuZGxlZCIKLXNlcGFyYXRlbHkuIEZvciBleGFtcGxlLCB5b3UgbWF5IHVzZSBhIHR5cGUgb2YKLSJhcHBsaWNhdGlvbi94LWh0dHBkLWNnaSIgdG8gaW52b2tlIENHSSBzY3JpcHRzLjwvUD4KLQotPFA+QXBhY2hlIDEuMSBhZGRzIHRoZSBhZGRpdGlvbmFsIGFiaWxpdHkgdG8gdXNlIGhhbmRsZXJzCi1leHBsaWNpdGx5LiBFaXRoZXIgYmFzZWQgb24gZmlsZW5hbWUgZXh0ZW5zaW9ucyBvciBvbiBsb2NhdGlvbiwgdGhlc2UKLWhhbmRsZXJzIGFyZSB1bnJlbGF0ZWQgdG8gZmlsZSB0eXBlLiBUaGlzIGlzIGFkdmFudGFnZW91cyBib3RoIGJlY2F1c2UKLWl0IGlzIGEgbW9yZSBlbGVnYW50IHNvbHV0aW9uLCBidXQgaXQgYWxzbyBhbGxvd3MgZm9yIGJvdGggYSB0eXBlCi08U1RST05HPmFuZDwvU1RST05HPiBhIGhhbmRsZXIgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGEgZmlsZSAoU2VlIGFsc28KLTxBIEhSRUY9Im1vZC9tb2RfbWltZS5odG1sI211bHRpcGxlZXh0Ij5GaWxlcyB3aXRoIE11bHRpcGxlIEV4dGVuc2lvbnM8L0E+KQotCi08L1A+Ci0KLTxQPkhhbmRsZXJzIGNhbiBlaXRoZXIgYmUgYnVpbHQgaW50byB0aGUgc2VydmVyIG9yIHRvIGEgbW9kdWxlLCBvcgotdGhleSBjYW4gYmUgYWRkZWQgd2l0aCB0aGUgPEEKLUhSRUY9Im1vZC9tb2RfYWN0aW9ucy5odG1sI2FjdGlvbiI+QWN0aW9uPC9BPiBkaXJlY3RpdmUuIFRoZSBidWlsdC1pbgotaGFuZGxlcnMgaW4gdGhlIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbiBhcmUgYXMgZm9sbG93czo8L1A+Ci0KLTxVTD4KLTxMST48U1RST05HPmRlZmF1bHQtaGFuZGxlcjwvU1RST05HPjoKLSAgICBTZW5kIHRoZSBmaWxlIHVzaW5nIHRoZSA8Q09ERT5kZWZhdWx0X2hhbmRsZXIoKTwvQ09ERT4sIHdoaWNoIGlzIHRoZSAKLSAgICBoYW5kbGVyIHVzZWQgYnkgZGVmYXVsdCB0byBoYW5kbGUgc3RhdGljIGNvbnRlbnQuCi0gICAgKGNvcmUpCi08TEk+PFNUUk9ORz5zZW5kLWFzLWlzPC9TVFJPTkc+OgotICAgIFNlbmQgZmlsZSB3aXRoIEhUVFAgaGVhZGVycyBhcyBpcy4KLSAgICAoPEEgSFJFRj0ibW9kL21vZF9hc2lzLmh0bWwiPm1vZF9hc2lzPC9BPikKLTxMST48U1RST05HPmNnaS1zY3JpcHQ8L1NUUk9ORz46Ci0gICAgVHJlYXQgdGhlIGZpbGUgYXMgYSBDR0kgc2NyaXB0LgotICAgICg8QSBIUkVGPSJtb2QvbW9kX2NnaS5odG1sIj5tb2RfY2dpPC9BPikKLTxMST48U1RST05HPmltYXAtZmlsZTwvU1RST05HPjoKLSAgICBJbWFnZW1hcCBydWxlIGZpbGUuCi0gICAgKDxBIEhSRUY9Im1vZC9tb2RfaW1hcC5odG1sIj5tb2RfaW1hcDwvQT4pCi08TEk+PFNUUk9ORz5zZXJ2ZXItaW5mbzwvU1RST05HPjoKLSAgICBHZXQgdGhlIHNlcnZlcidzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLSAgICAoPEEgSFJFRj0ibW9kL21vZF9pbmZvLmh0bWwiPm1vZF9pbmZvPC9BPikKLTxMST48U1RST05HPnNlcnZlci1wYXJzZWQ8L1NUUk9ORz46Ci0gICAgUGFyc2UgZm9yIHNlcnZlci1zaWRlIGluY2x1ZGVzCi0gICAgKDxBIEhSRUY9Im1vZC9tb2RfaW5jbHVkZS5odG1sIj5tb2RfaW5jbHVkZTwvQT4pCi08TEk+PFNUUk9ORz5zZXJ2ZXItc3RhdHVzPC9TVFJPTkc+OgotICAgIEdldCB0aGUgc2VydmVyJ3Mgc3RhdHVzIHJlcG9ydAotICAgICg8QSBIUkVGPSJtb2QvbW9kX3N0YXR1cy5odG1sIj5tb2Rfc3RhdHVzPC9BPikKLTxMST48U1RST05HPnR5cGUtbWFwPC9TVFJPTkc+OgotICAgIFBhcnNlIGFzIGEgdHlwZSBtYXAgZmlsZSBmb3IgY29udGVudCBuZWdvdGlhdGlvbgotICAgICg8QSBIUkVGPSJtb2QvbW9kX25lZ290aWF0aW9uLmh0bWwiPm1vZF9uZWdvdGlhdGlvbjwvQT4pCi08L1VMPgotCi08UD4KLQotPEgyPkRpcmVjdGl2ZXM8L0gyPgotPFVMPgotPExJPjxBIEhSRUY9IiNhZGRoYW5kbGVyIj5BZGRIYW5kbGVyPC9BPgotPExJPjxBIEhSRUY9IiNzZXRoYW5kbGVyIj5TZXRIYW5kbGVyPC9BPgotPC9VTD4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0iYWRkaGFuZGxlciI+QWRkSGFuZGxlcjwvQT48L0gyPgotCi08QQotIEhSRUY9Im1vZC9kaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBBZGRIYW5kbGVyIDxFTT5oYW5kbGVyLW5hbWUgZXh0ZW5zaW9uIGV4dGVuc2lvbi4uLjwvRU0+PEJSPgotPEEKLSBIUkVGPSJtb2QvZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJtb2QvZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IEZpbGVJbmZvPEJSPgotPEEKLSBIUkVGPSJtb2QvZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0ibW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9taW1lPEJSPgotPEEKLSBIUkVGPSJtb2QvZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBBZGRIYW5kbGVyIGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZQotMS4xIGFuZCBsYXRlcjxQPgotCi08UD5BZGRIYW5kbGVyIG1hcHMgdGhlIGZpbGVuYW1lIGV4dGVuc2lvbnMgPEVNPmV4dGVuc2lvbjwvRU0+IHRvIHRoZQotaGFuZGxlciA8RU0+aGFuZGxlci1uYW1lPC9FTT4uICBUaGlzIG1hcHBpbmcgaXMgYWRkZWQgdG8gYW55IGFscmVhZHkKLWluIGZvcmNlLCBvdmVycmlkaW5nIGFueSBtYXBwaW5ncyB0aGF0IGFscmVhZHkgZXhpc3QgZm9yIHRoZSBzYW1lCi08RU0+ZXh0ZW5zaW9uPC9FTT4uCi0KLUZvciBleGFtcGxlLCB0byBhY3RpdmF0ZSBDR0kgc2NyaXB0cwotd2l0aCB0aGUgZmlsZSBleHRlbnNpb24gIjxDT0RFPi5jZ2k8L0NPREU+IiwgeW91IG1pZ2h0IHVzZToKLTxQUkU+Ci0gICAgQWRkSGFuZGxlciBjZ2ktc2NyaXB0IGNnaQotPC9QUkU+Ci0KLTxQPk9uY2UgdGhhdCBoYXMgYmVlbiBwdXQgaW50byB5b3VyIHNybS5jb25mIG9yIGh0dHBkLmNvbmYgZmlsZSwgYW55Ci1maWxlIGNvbnRhaW5pbmcgdGhlICI8Q09ERT4uY2dpPC9DT0RFPiIgZXh0ZW5zaW9uIHdpbGwgYmUgdHJlYXRlZCBhcyBhCi1DR0kgcHJvZ3JhbS48L1A+IAotCi08UD4KLQotPFNUUk9ORz5TZWUgYWxzbzwvU1RST05HPjogPEEgSFJFRj0ibW9kL21vZF9taW1lLmh0bWwjbXVsdGlwbGVleHQiPkZpbGVzIHdpdGgKLW11bHRpcGxlIGV4dGVuc2lvbnM8L0E+Ci0KLTxIUj4KLQotPEgyPjxBIE5BTUU9InNldGhhbmRsZXIiPlNldEhhbmRsZXI8L0E+PC9IMj4KLQotPEEKLSBIUkVGPSJtb2QvZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gU2V0SGFuZGxlciA8RU0+aGFuZGxlci1uYW1lPC9FTT48QlI+Ci08QQotIEhSRUY9Im1vZC9kaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IGRpcmVjdG9yeSwgLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJtb2QvZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0ibW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9taW1lPEJSPgotPEEKLSBIUkVGPSJtb2QvZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBTZXRIYW5kbGVyIGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZQotMS4xIGFuZCBsYXRlci48UD4KLQotPFA+V2hlbiBwbGFjZWQgaW50byBhbiA8Q09ERT4uaHRhY2Nlc3M8L0NPREU+IGZpbGUgb3IgYQotPENPREU+Jmx0O0RpcmVjdG9yeSZndDs8L0NPREU+IG9yIDxDT0RFPiZsdDtMb2NhdGlvbiZndDs8L0NPREU+Ci1zZWN0aW9uLCB0aGlzIGRpcmVjdGl2ZSBmb3JjZXMgYWxsIG1hdGNoaW5nIGZpbGVzIHRvIGJlIHBhcnNlZCB0aHJvdWdoCi10aGUgaGFuZGxlciBnaXZlbiBieSA8RU0+aGFuZGxlci1uYW1lPC9FTT4uIEZvciBleGFtcGxlLCBpZiB5b3UgaGFkIGEKLWRpcmVjdG9yeSB5b3Ugd2FudGVkIHRvIGJlIHBhcnNlZCBlbnRpcmVseSBhcyBpbWFnZW1hcCBydWxlIGZpbGVzLAotcmVnYXJkbGVzcyBvZiBleHRlbnNpb24sIHlvdSBtaWdodCBwdXQgdGhlIGZvbGxvd2luZyBpbnRvIGFuCi08Q09ERT4uaHRhY2Nlc3M8L0NPREU+IGZpbGUgaW4gdGhhdCBkaXJlY3Rvcnk6IAotPFBSRT4KLSAgICBTZXRIYW5kbGVyIGltYXAtZmlsZQotPC9QUkU+Ci0KLTxQPkFub3RoZXIgZXhhbXBsZTogaWYgeW91IHdhbnRlZCB0byBoYXZlIHRoZSBzZXJ2ZXIgZGlzcGxheSBhIHN0YXR1cwotcmVwb3J0IHdoZW5ldmVyIGEgVVJMIG9mIDxDT0RFPmh0dHA6Ly9zZXJ2ZXJuYW1lL3N0YXR1czwvQ09ERT4gd2FzCi1jYWxsZWQsIHlvdSBtaWdodCBwdXQgdGhlIGZvbGxvd2luZyBpbnRvIGFjY2Vzcy5jb25mOgotPFBSRT4KLSAgICAmbHQ7TG9jYXRpb24gL3N0YXR1cyZndDsKLSAgICBTZXRIYW5kbGVyIHNlcnZlci1zdGF0dXMKLSAgICAmbHQ7L0xvY2F0aW9uJmd0OwotPC9QUkU+Ci08SFI+Ci0KLTxIMj5Qcm9ncmFtbWVyJ3MgTm90ZTwvSDI+Ci0KLTxQPkluIG9yZGVyIHRvIGltcGxlbWVudCB0aGUgaGFuZGxlciBmZWF0dXJlcywgYW4gYWRkaXRpb24gaGFzIGJlZW4KLW1hZGUgdG8gdGhlIDxBIEhSRUY9Im1pc2MvQVBJLmh0bWwiPkFwYWNoZSBBUEk8L0E+IHRoYXQgeW91IG1heSB3aXNoIHRvCi1tYWtlIHVzZSBvZi4gU3BlY2lmaWNhbGx5LCBhIG5ldyByZWNvcmQgaGFzIGJlZW4gYWRkZWQgdG8gdGhlCi08Q09ERT5yZXF1ZXN0X3JlYzwvQ09ERT4gc3RydWN0dXJlOjwvUD4KLTxQUkU+Ci0gICAgY2hhciAqaGFuZGxlcgotPC9QUkU+Ci08UD5JZiB5b3Ugd2lzaCB0byBoYXZlIHlvdXIgbW9kdWxlIGVuZ2FnZSBhIGhhbmRsZXIsIHlvdSBuZWVkIG9ubHkgdG8KLXNldCA8Q09ERT5yLSZndDtoYW5kbGVyPC9DT0RFPiB0byB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlciBhdCBhbnkgdGltZQotcHJpb3IgdG8gdGhlIDxDT0RFPmludm9rZV9oYW5kbGVyPC9DT0RFPiBzdGFnZSBvZiB0aGUKLXJlcXVlc3QuIEhhbmRsZXJzIGFyZSBpbXBsZW1lbnRlZCBhcyB0aGV5IHdlcmUgYmVmb3JlLCBhbGJlaXQgdXNpbmcKLXRoZSBoYW5kbGVyIG5hbWUgaW5zdGVhZCBvZiBhIGNvbnRlbnQgdHlwZS4gV2hpbGUgaXQgaXMgbm90Ci1uZWNlc3NhcnksIHRoZSBuYW1pbmcgY29udmVudGlvbiBmb3IgaGFuZGxlcnMgaXMgdG8gdXNlIGEKLWRhc2gtc2VwYXJhdGVkIHdvcmQsIHdpdGggbm8gc2xhc2hlcywgc28gYXMgdG8gbm90IGludmFkZSB0aGUgbWVkaWEKLXR5cGUgbmFtZS1zcGFjZS48L1A+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2hlYWRlci5odG1sIGIvZG9jcy9tYW51YWwvaGVhZGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOTU5ZGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvaGVhZGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTxESVYgQUxJR049IkNFTlRFUiI+Ci0gPElNRyBTUkM9ImltYWdlcy9zdWIuZ2lmIiBBTFQ9IltBUEFDSEUgRE9DVU1FTlRBVElPTl0iPgotIDxIMz4KLSAgQXBhY2hlIEhUVFAgU2VydmVyIFZlcnNpb24gMS4zCi0gPC9IMz4KLTwvRElWPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvaW1hZ2VzL2N1c3RvbV9lcnJvcmRvY3MuZ2lmIGIvZG9jcy9tYW51YWwvaW1hZ2VzL2N1c3RvbV9lcnJvcmRvY3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTY2YzVkLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2ltYWdlcy9jdXN0b21fZXJyb3Jkb2NzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2ltYWdlcy9ob21lLmdpZiBiL2RvY3MvbWFudWFsL2ltYWdlcy9ob21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEyOTljMS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9pbWFnZXMvaG9tZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9pbWFnZXMvaW5kZXguZ2lmIGIvZG9jcy9tYW51YWwvaW1hZ2VzL2luZGV4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxYzg5My4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9pbWFnZXMvaW5kZXguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvaW1hZ2VzL21vZF9yZXdyaXRlX2ZpZzEuZmlnIGIvZG9jcy9tYW51YWwvaW1hZ2VzL21vZF9yZXdyaXRlX2ZpZzEuZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzgwZmVhLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2ltYWdlcy9tb2RfcmV3cml0ZV9maWcxLmZpZworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSNGSUcgMy4yCi1MYW5kc2NhcGUKLUNlbnRlcgotSW5jaGVzCi1MZXR0ZXIgIAotMTAwLjAwCi1TaW5nbGUKLS0yCi0xMjAwIDIKLTAgMzIgI2VmZWZlZgotMCAzMyAjY2ZjZmVmCi0wIDM0ICNiZWJlYmUKLTIgMSAwIDQgNCA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDYKLQkxIDEgMi4wMCAxMjAuMDAgMjQwLjAwCi0JIDY2NzUgNTI1MCA2OTAwIDUyNTAgNjkwMCA0NjUwIDQ5NTAgNDY1MCA0OTUwIDQwNTAgNTQ3NSA0MDUwCi0yIDEgMCA0IDQgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDIuMDAgMTIwLjAwIDI0MC4wMAotCSA2OTAwIDQwNTAgNzY1MCA0MDUwCi0yIDEgMCA0IDQgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCA2Ci0JMSAxIDIuMDAgMTIwLjAwIDI0MC4wMAotCSA5Mzc1IDQwNTAgOTkwMCA0MDUwIDk5MDAgNDY1MCA3MjAwIDQ2NTAgNzIwMCA1MjUwIDc2NTAgNTI1MAotMiAxIDAgNCA5IDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgNAotCTEgMSAyLjAwIDEyMC4wMCAyNDAuMDAKLQkgOTMwMCA1MjUwIDk5MDAgNTI1MCA5OTAwIDYzMDAgNjk3NSA2MzAwCi0yIDEgMiA0IDAgNyAwIDAgLTEgNy41MDAgMSAxIC0xIDAgMCAyCi0JIDM5MDAgMjEwMCAzOTAwIDE1MDAKLTIgMSAyIDQgMCA3IDAgMCAtMSA3LjUwMCAxIDEgLTEgMCAwIDIKLQkgMzkwMCA3OTUwIDM5MDAgNzM1MAotMiAxIDEgNCA5IDcgMCAwIC0xIDEwLjAwMCAwIDAgLTEgMSAwIDQKLQkxIDEgMi4wMCAxMjAuMDAgMjQwLjAwCi0JIDU2MjUgNjMwMCAyNzAwIDYzMDAgMjcwMCA3MDUwIDMyMjUgNzA1MAotMiAxIDAgNCA5IDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgNAotCTEgMSAyLjAwIDEyMC4wMCAyNDAuMDAKLQkgNTU1MCAzMDAwIDI3MDAgMzAwMCAyNzAwIDUyNTAgMzIyNSA1MjUwCi0yIDEgMSA0IDkgNyAwIDAgLTEgMTAuMDAwIDAgMCAtMSAxIDAgNAotCTEgMSAyLjAwIDEyMC4wMCAyNDAuMDAKLQkgOTIyNSAyMzI1IDk5MDAgMjMyNSA5OTAwIDMwMDAgNjk3NSAzMDAwCi0yIDEgMCA0IDkgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDIuMDAgMTIwLjAwIDI0MC4wMAotCSA0ODAwIDUyNTAgNTU1MCA1MjUwCi0yIDQgMCAyIDkgNyAwIDAgLTEgMC4wMDAgMCAwIDcgMCAwIDUKLQkgNjkwMCAzMzAwIDU3MDAgMzMwMCA1NzAwIDI3MDAgNjkwMCAyNzAwIDY5MDAgMzMwMAotMiA0IDAgMiA5IDcgMCAwIC0xIDAuMDAwIDAgMCA3IDAgMCA1Ci0JIDY5MDAgNjYwMCA1NzAwIDY2MDAgNTcwMCA2MDAwIDY5MDAgNjAwMCA2OTAwIDY2MDAKLTQgMCAwIDAgMCAwIDIwIDAuMDAwMCA0IDE5NSAxNDU1IDMzMDAgNTQwMCBSZXdyaXRlUnVsZVwwMDEKLTQgMCAwIDAgMCAxIDIwIDAuMDAwMCA0IDIxMCAxNDQwIDc4MDAgNDIwMCBDb25kUGF0dGVyblwwMDEKLTQgMCAwIDAgMCAxIDIwIDAuMDAwMCA0IDI3MCAxMTEwIDU2MjUgNDIwMCBUZXN0U3RyaW5nXDAwMQotNCAwIDAgMCAwIDAgMjAgMC4wMDAwIDQgMTk1IDE5MDUgMzMwMCA0MjAwIFJld3JpdGVDb25kICAgICBcMDAxCi00IDAgMCAwIDAgMSAyMCAwLjAwMDAgNCAyMTAgMTMyMCA3ODAwIDU0MDAgU3Vic3RpdHV0aW9uXDAwMQotNCAwIDAgMCAwIDEgMjAgMC4wMDAwIDQgMTk1IDgyNSA1NzAwIDU0MDAgUGF0dGVyblwwMDEKLTQgMCAwIDAgMCAwIDIwIDAuMDAwMCA0IDE5NSAxNDU1IDMzMDAgNzIwMCBSZXdyaXRlUnVsZVwwMDEKLTQgMCAwIDAgMCAwIDIwIDAuMDAwMCA0IDE5NSAxNDU1IDMzMDAgMjQwMCBSZXdyaXRlUnVsZVwwMDEKLTQgMCAwIDAgMCAxIDIwIDAuMDAwMCA0IDE5NSA4MjUgNTcwMCA3MjAwIFBhdHRlcm5cMDAxCi00IDAgMCAwIDAgMSAyMCAwLjAwMDAgNCAyMTAgMTMyMCA3ODAwIDcyMDAgU3Vic3RpdHV0aW9uXDAwMQotNCAwIDAgMCAwIDEgMjAgMC4wMDAwIDQgMjEwIDEzMjAgNzgwMCAyNDAwIFN1YnN0aXR1dGlvblwwMDEKLTQgMCAwIDAgMCAxIDIwIDAuMDAwMCA0IDE5NSA4MjUgNTcwMCAyNDAwIFBhdHRlcm5cMDAxCi00IDAgOSAwIDAgMTggMTIgMC4wMDAwIDQgMTM1IDY0NSA2MDAwIDI5MjUgY3VycmVudFwwMDEKLTQgMCA5IDAgMCAxOCAxMiAwLjAwMDAgNCAxMzUgMzc1IDYwNzUgMzE1MCBVUkxcMDAxCi00IDAgOSAwIDAgMTggMTIgMC4wMDAwIDQgMTM1IDgyNSA1OTI1IDYyMjUgcmV3cml0dGVuXDAwMQotNCAwIDkgMCAwIDE4IDEyIDAuMDAwMCA0IDEzNSAzNzUgNjA3NSA2NDUwIFVSTFwwMDEKZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2ltYWdlcy9tb2RfcmV3cml0ZV9maWcxLmdpZiBiL2RvY3MvbWFudWFsL2ltYWdlcy9tb2RfcmV3cml0ZV9maWcxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY0YWMxZS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9pbWFnZXMvbW9kX3Jld3JpdGVfZmlnMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9pbWFnZXMvbW9kX3Jld3JpdGVfZmlnMi5maWcgYi9kb2NzL21hbnVhbC9pbWFnZXMvbW9kX3Jld3JpdGVfZmlnMi5maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhY2Y0MTAuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvaW1hZ2VzL21vZF9yZXdyaXRlX2ZpZzIuZmlnCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotI0ZJRyAzLjIKLUxhbmRzY2FwZQotQ2VudGVyCi1JbmNoZXMKLUxldHRlciAgCi0xMDAuMDAKLVNpbmdsZQotLTIKLTEyMDAgMgotMCAzMiAjZWZlZmVmCi0wIDMzICNjZmNmZWYKLTAgMzQgI2JlYmViZQotMiAxIDIgNCAwIDcgMCAwIC0xIDEwLjAwMCAxIDEgLTEgMCAwIDIKLQkgNDA1MCAzNzUwIDQwNTAgNDQyNQotMiAxIDAgMiA5IDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAyLjAwIDEyMC4wMCAyNDAuMDAKLQkgNDk1MCA0ODAwIDU1NTAgNDgwMAotMiAxIDAgMiA5IDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAyLjAwIDEyMC4wMCAyNDAuMDAKLQkgNDk1MCAzNjAwIDU1NTAgMzYwMAotMiAxIDAgMiA5IDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAyLjAwIDEyMC4wMCAyNDAuMDAKLQkgNjYwMCA1NzAwIDc3MjUgNTcwMAotMiAxIDAgMiA5IDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgNgotCTEgMSAyLjAwIDEyMC4wMCAyNDAuMDAKLQkgNjYwMCA1NTUwIDY5MDAgNTU1MCA2OTAwIDUxMDAgNDk1MCA1MTAwIDQ5NTAgMjg1MCA1NTUwIDI4NTAKLTIgMSAwIDIgNCA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDYKLQkxIDEgMi4wMCAxMjAuMDAgMjQwLjAwCi0JIDk1MjUgNDgwMCA5NzUwIDQ4MDAgOTc1MCA1MTAwIDcyMDAgNTEwMCA3MjAwIDU1NTAgNzcyNSA1NTUwCi0yIDEgMCAyIDQgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCA2Ci0JMSAxIDIuMDAgMTIwLjAwIDI0MC4wMAotCSA5NDUwIDMwMDAgOTc1MCAzMDAwIDk3NTAgMzIyNSA1MTAwIDMyMjUgNTEwMCAzNDUwIDU1NTAgMzQ1MAotMiAxIDAgMiA0IDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgNgotCTEgMSAyLjAwIDEyMC4wMCAyNDAuMDAKLQkgOTQ1MCAzNjAwIDk3NTAgMzYwMCA5NzUwIDM4MjUgNTEwMCAzODI1IDUxMDAgNDA1MCA1NTUwIDQwNTAKLTIgMSAwIDIgNCA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDYKLQkxIDEgMi4wMCAxMjAuMDAgMjQwLjAwCi0JIDk0NTAgNDIwMCA5NzUwIDQyMDAgOTc1MCA0NDI1IDUxMDAgNDQyNSA1MTAwIDQ2NTAgNTU1MCA0NjUwCi00IDAgMCAwIDAgMCAyMCAwLjAwMDAgNCAxOTUgMTkwNSAzMzAwIDQ4MDAgUmV3cml0ZUNvbmQgICAgIFwwMDEKLTQgMCAwIDAgMCAxIDIwIDAuMDAwMCA0IDIxMCAxNjIwIDc4MDAgNDgwMCBDb25kUGF0dGVybk5cMDAxCi00IDAgMCAwIDAgMCAyMCAwLjAwMDAgNCAxOTUgMTkwNSAzMzAwIDM2MDAgUmV3cml0ZUNvbmQgICAgIFwwMDEKLTQgMCAwIDAgMCAxIDIwIDAuMDAwMCA0IDIxMCAxNTc1IDc4MDAgMzYwMCBDb25kUGF0dGVybjJcMDAxCi00IDAgMCAwIDAgMSAyMCAwLjAwMDAgNCAyNzAgMTI5MCA1NjI1IDQ4MDAgVGVzdFN0cmluZ05cMDAxCi00IDAgMCAwIDAgMSAyMCAwLjAwMDAgNCAyNzAgMTI0NSA1NjI1IDM2MDAgVGVzdFN0cmluZzJcMDAxCi00IDAgMCAwIDAgMCAyMCAwLjAwMDAgNCAxOTUgMTkwNSAzMzAwIDMwMDAgUmV3cml0ZUNvbmQgICAgIFwwMDEKLTQgMCAwIDAgMCAxIDIwIDAuMDAwMCA0IDI3MCAxMjQ1IDU2MjUgMzAwMCBUZXN0U3RyaW5nMVwwMDEKLTQgMCAwIDAgMCAxIDIwIDAuMDAwMCA0IDIxMCAxNTc1IDc4MDAgMzAwMCBDb25kUGF0dGVybjFcMDAxCi00IDAgMCAwIDAgMSAyMCAwLjAwMDAgNCAyMTAgMTMyMCA3ODAwIDU3MDAgU3Vic3RpdHV0aW9uXDAwMQotNCAwIDAgMCAwIDEgMjAgMC4wMDAwIDQgMTk1IDgyNSA1NzAwIDU3MDAgUGF0dGVyblwwMDEKLTQgMCAwIDAgMCAwIDIwIDAuMDAwMCA0IDE5NSAxNDU1IDMzMDAgNTcwMCBSZXdyaXRlUnVsZVwwMDEKZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2ltYWdlcy9tb2RfcmV3cml0ZV9maWcyLmdpZiBiL2RvY3MvbWFudWFsL2ltYWdlcy9tb2RfcmV3cml0ZV9maWcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VhOGNiNi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9pbWFnZXMvbW9kX3Jld3JpdGVfZmlnMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9pbWFnZXMvc3ViLmdpZiBiL2RvY3MvbWFudWFsL2ltYWdlcy9zdWIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzA2MWM1Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2ltYWdlcy9zdWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvaW5kZXguaHRtbCBiL2RvY3MvbWFudWFsL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZmVmNzUuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QXBhY2hlLTIuMCBEb2N1bWVudGF0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08aDI+TWFudWFsIEluZGV4IGZvciBBcGFjaGUtMi4wPC9oMj4KLTxwPlRoZSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIHNwbGl0IGludG8gMiBzZWN0aW9ucy4gIE9uZSBpcyBmb3IgcGVvcGxlIGluc3RhbGxpbmcgYW5kIGNvbmZpZ3VyaW5nIGFuIEFwYWNoZSBzZXJ2ZXIsIHRoZSBvdGhlciBpcyBmb3IgdGhvc2Ugd2hvIGFyZSBkZXZlbG9waW5nIHRoZSBzZXJ2ZXIuPC9wPgotPGgzIGFsaWduPSJjZW50ZXIiPldoZXJlIGRvIHlvdSB3YW50IHRvIGdvIHRvZGF5PzwvaDM+Ci08dGFibGUgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIHdpZHRoPSI1MCUiIGFsaWduPSJjZW50ZXIiPgotPGEgaHJlZj0idXNlci9pbmRleC5odG1sIj5JJ20gY29uZmlndXJpbmcvaW5zdGFsbGluZyBhIHNlcnZlcjwvYT4KLTwvdGQ+Ci08dGQgd2lkdGg9IjUwJSIgYWxpZ249ImNlbnRlciI+Ci08YSBocmVmPSJkZXZlbG9wZXIvaW5kZXguaHRtbCI+SSdtIGEgZGV2ZWxvcGVyPC9hPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPGhyPgotPGk+RGF2aWQgUmVpZCwgMTU8c3VwPnRoPC9zdXA+IEphbnVhcnkgMjAwMDwvaT4KLTwvYm9keT4KLTwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvaW5kZXguaHRtbC5lbiBiL2RvY3MvbWFudWFsL2luZGV4Lmh0bWwuZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZmVmNzUuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvaW5kZXguaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QXBhY2hlLTIuMCBEb2N1bWVudGF0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08aDI+TWFudWFsIEluZGV4IGZvciBBcGFjaGUtMi4wPC9oMj4KLTxwPlRoZSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIHNwbGl0IGludG8gMiBzZWN0aW9ucy4gIE9uZSBpcyBmb3IgcGVvcGxlIGluc3RhbGxpbmcgYW5kIGNvbmZpZ3VyaW5nIGFuIEFwYWNoZSBzZXJ2ZXIsIHRoZSBvdGhlciBpcyBmb3IgdGhvc2Ugd2hvIGFyZSBkZXZlbG9waW5nIHRoZSBzZXJ2ZXIuPC9wPgotPGgzIGFsaWduPSJjZW50ZXIiPldoZXJlIGRvIHlvdSB3YW50IHRvIGdvIHRvZGF5PzwvaDM+Ci08dGFibGUgd2lkdGg9IjEwMCUiPgotPHRyPgotPHRkIHdpZHRoPSI1MCUiIGFsaWduPSJjZW50ZXIiPgotPGEgaHJlZj0idXNlci9pbmRleC5odG1sIj5JJ20gY29uZmlndXJpbmcvaW5zdGFsbGluZyBhIHNlcnZlcjwvYT4KLTwvdGQ+Ci08dGQgd2lkdGg9IjUwJSIgYWxpZ249ImNlbnRlciI+Ci08YSBocmVmPSJkZXZlbG9wZXIvaW5kZXguaHRtbCI+SSdtIGEgZGV2ZWxvcGVyPC9hPgotPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPGhyPgotPGk+RGF2aWQgUmVpZCwgMTU8c3VwPnRoPC9zdXA+IEphbnVhcnkgMjAwMDwvaT4KLTwvYm9keT4KLTwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvaW5zdGFsbC10cGYuaHRtbCBiL2RvY3MvbWFudWFsL2luc3RhbGwtdHBmLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MWVkYmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvaW5zdGFsbC10cGYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkluc3RhbGxpbmcgQXBhY2hlIG9uIFRQRjwvVElUTEU+Ci08L0hFQUQ+Ci0KLTxCT0RZPgotPEgxIEFMSUdOPSJjZW50ZXIiPgotIDxBIE5BTUU9InRvcCI+SW5zdGFsbGluZyB0aGUgQXBhY2hlIDEuMyBIVFRQIFNlcnZlciBvbiBUUEY8L0E+Ci08L0gxPgotPEhSPgotPENFTlRFUj5bJm5ic3A7PEEgSFJFRj0iI2Rvd25sb2FkIj5Eb3dubG9hZDwvQT4KLSAgICZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29tcGlsYXRpb24iPkNvbXBpbGF0aW9uPC9BPgotICAgJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNpbnN0YWxsYXRpb24iPkluc3RhbGxhdGlvbjwvQT4KLSAgICZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjdmlzdWFsYWdlIj5WaXN1YWxBZ2U8L0E+Jm5ic3A7XQotPC9DRU5URVI+Ci08SFI+Ci08QlI+Ci0KLTxQPgotVGhpcyBkb2N1bWVudCBvdXRsaW5lcyB0aGUgc3RlcHMgbmVlZGVkIHRvIGluc3RhbGwgQXBhY2hlIG9udG8gYSBUUEYgc3lzdGVtLgotPC9QPgotPFA+Ci1Zb3Ugc2hvdWxkIGZpcnN0IHJlYWQKLWh0ZG9jcy9tYW51YWwvPEEgSFJFRj0icmVhZG1lLXRwZi5odG1sIj5yZWFkbWUtdHBmLmh0bWw8L0E+Ci1mb3IgYmFzaWMgaW5mb3JtYXRpb24gb24gdGhlIHBvcnQgb2YgQXBhY2hlIHRvIFRQRiBpbmNsdWRpbmcgcmVxdWlyZWQgUFVUIGxldmVsCi1hbmQgc3VwcG9ydGVkIGZ1bmN0aW9ucyAmYW1wOyBtb2R1bGVzLgotPC9QPgotPEgyIGFsaWduPWNlbnRlcj48QSBOQU1FPSJkb3dubG9hZCI+RG93bmxvYWQ8L0E+PC9IMj4KLVJlbGVhc2VzIG9mIHRoZSBBcGFjaGUgc2VydmVyIGFyZSBjb21wcmVzc2VkIGludG8gYSAidGFyYmFsbCIgZmlsZSBhbmQgc3RvcmVkIG9uIHRoZSBBcGFjaGUgd2ViIHNpdGUuCi1Zb3Ugd2lsbCBuZWVkIHRvIGNob29zZSBhIHZlcnNpb24gYW5kIGRvd25sb2FkIHRoZSBjb3JyZXNwb25kaW5nIHRhcmJhbGwgdG8geW91ciBQQy4KLUFkZGl0aW9uYWxseSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgdGFyYmFsbCB3aWxsIG5lZWQgdG8gYmUgY29waWVkIG9udG8gYW4gTVZTIE9TLzM5MCBPcGVuIEVkaXRpb24gbWFjaGluZSAKLShsYXRlciByZWZlcnJlZCB0byBzaW1wbHkgYXMgIk9wZW4gRWRpdGlvbiIpIGZvciBjb21waWxpbmcuCi1TbyBoZXJlIGFyZSBhbGwgdGhlIGRldGFpbHMgb24gaG93IHRvIGdldCBBcGFjaGUgYW5kIGhvdyB0byBnZXQgaXQgd2hlcmUgaXQgbmVlZHMgdG8gYmU6Ci08b2w+Ci0gICA8bGk+PEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvIj5Eb3dubG9hZDwvQT4KLSAgICAgICB0aGUgZ3ppcHBlZCBBcGFjaGUgZmlsZXMgKHRoZSAidGFyYmFsbCIpIHRvIHlvdXIgUEMuCi0gICAgICAgVGhlIGZpbGUgbmFtZSBvbiB0aGUgd2ViIHNpdGUgd2lsbCBiZSBzb21ldGhpbmcgbGlrZSA8aT5hcGFjaGVfMS4zLngudGFyLmd6PC9pPi4KLSAgICAgICA8YnI+PGZvbnQgY29sb3I9cmVkIHNpemU9ND5USVA6IDwvZm9udD5CZSBzdXJlIHRvIGtlZXAgdGhlIDxpPi50YXIuZ3o8L2k+IGV4dGVuc2lvbgotICAgICAgICAgICB3aGVuIGNob29zaW5nIHRoZSBuYW1lIG9mIHRoZSBQQyBmaWxlLgotICAgICAgIDxicj48YnI+Ci0gICA8bGk+RGVjb21wcmVzcyB0aGUgdGFyYmFsbCBvbiB5b3VyIFBDIHVzaW5nIFdpblppcCBvciBzb21lIG90aGVyIFBDIGRlY29tcHJlc3Npb24gdG9vbC4KLSAgICAgICA8YnI+PGZvbnQgY29sb3I9cmVkIHNpemU9ND5USVA6IDwvZm9udD5JZiB5b3UgYXJlIHVzaW5nIFdpblppcCB2ZXJpZnkgdGhhdCB0aGUKLSAgICAgICAgICAgIDxFTT4iVEFSIEZpbGUgU21hcnQgQ1IvTEYgQ29udmVyc2lvbiI8L0VNPiBvcHRpb24gKHVuZGVyIE9wdGlvbnMsIENvbmZpZ3VyYXRpb24pIGlzIE5PVCBjaGVja2VkLjxicj4KLSAgICAgICAgICAgIFRoaXMgaXMgd2hhdCB5b3UgY2FuIGV4cGVjdCBpZiB5b3UgdXNlIFdpblppcDoKLSAgICAgICA8dWw+Ci0gICAgICAgICAgIDxsaT5vcGVuIHRoZSB0YXJiYWxsIHdpdGggV2luWmlwICh0aGlzIGNhbiB1c3VhbGx5IGJlIGRvbmUgc2ltcGx5IGJ5IGRvdWJsZS1jbGlja2luZwotICAgICAgICAgICAgICAgb24gdGhlIGRvd25sb2FkZWQgdGFyYmFsbCkKLSAgICAgICAgICAgPGxpPnlvdSB3aWxsIGJlIHRvbGQgdGhhdCB0aGUgYXJjaGl2ZSBjb250YWlucyBvbmUgZmlsZSAoc3VjaCBhcyA8aT5hcGFjaGVfMS4zLngudGFyPC9pPikgLQotICAgICAgICAgICAgICAgYWxsb3cgV2luWmlwIHRvIGRlY29tcHJlc3MgaXQgdG8gYSB0ZW1wb3JhcnkgZm9sZGVyCi0gICAgICAgICAgIDxsaT5leHRyYWN0IHRoZSBhcmNoaXZlZCBmaWxlcyBvbnRvIHlvdXIgUEMgLSAKLSAgICAgICAgICAgICAgIHlvdSdsbCBiZSB1c2luZyBmaWxlcyBmcm9tIHRoZSA8dHQ+Y29uZiwgaHRkb2NzLDwvdHQ+IGFuZCA8dHQ+aWNvbnM8L3R0PiBkaXJlY3RvcmllcyBsYXRlciBpbiB0aGUgaW5zdGFsbCBwaGFzZQotICAgICAgIDwvdWw+Ci0gICAgICAgPGJyPgotICAgPGxpPkZUUCB0aGUgdGFyYmFsbCB0byB5b3VyIE9wZW4gRWRpdGlvbiBtYWNoaW5lIHVzaW5nIGJpbmFyeSBtb2RlOgotICAgICAgIDx1bD4KLSAgICAgICAgICAgPGxpPmFjdGl2YXRlIEZUUCBpbiBhbiBNU0RPUyB3aW5kb3c6IDx0dD48Yj5mdHAgPGk+eW91ci5vcGVuLmVkaXRpb24ubWFjaGluZS5jb208L2k+PC9iPjwvdHQ+Ci0gICAgICAgICAgIDxsaT5zaWduIGluCi0gICAgICAgICAgIDxsaT5zZXQgbW9kZSB0byBiaW5hcnk6IDx0dD48Yj5iaW5hcnk8L2I+PC90dD4KLSAgICAgICAgICAgPGxpPnNlbmQgdGhlIGZpbGUgdG8gT3BlbiBFZGl0aW9uOjxicj4KLSAgICAgICAgICAgICAgIDx0dD48Yj4mbmJzcDsmbmJzcDsmbmJzcDtzZW5kIDxpPmM6XGRvd25sb2FkZWRfZmlsZW5hbWUudGFyLmd6IG9wZW5fZWRpdGlvbl9maWxlbmFtZS50YXIuZ3o8L2k+PC9iPjwvdHQ+Ci0gICAgICAgICAgIDxsaT5leGl0IEZUUDogPHR0PjxiPmJ5ZTwvYj48L3R0PgotICAgICAgIDwvdWw+Ci0gICAgICAgPGJyPjxmb250IGNvbG9yPXJlZCBzaXplPTQ+VElQOiA8L2ZvbnQ+Ci0gICAgICAgIE9wZW4gRWRpdGlvbiBhbmQgVU5JWCBmaWxlIG5hbWVzIGFyZSBjYXNlIHNlbnNpdGl2ZS4gIElmIHlvdSB1c2UgYW4gTkZTIGNsaWVudCB0byB0cmFuc2ZlciBmaWxlcwotICAgICAgICBmcm9tIHlvdXIgUEMgdG8gT3BlbiBFZGl0aW9uIChpbnN0ZWFkIG9mIHVzaW5nIEZUUCBhcyBkZXNjcmliZWQgYWJvdmUpIHZlcmlmeSB0aGF0IHRoZSBORlMgZHJpdmUgd2lsbCB0cmFuc2ZlciB0aGUKLSAgICAgICAgZmlsZSBuYW1lcyB3aXRoIHVwcGVyL2xvd2VyIGNhc2UgcHJlc2VydmVkLjxicj4KLSAgICAgICA8YnI+Ci0gICA8bGk+RGVjb21wcmVzcyB0aGUgZ3ppcHBlZCBmaWxlIG9uIE9wZW4gRWRpdGlvbjogPHR0PjxiPmd1bnppcCA8aT5vcGVuX2VkaXRpb25fZmlsZW5hbWUudGFyLmd6PC9pPjwvYj48L3R0PgotICAgICAgIDxicj5Ob3RlIHRoYXQgdGhlIDxpPi50YXIuZ3o8L2k+IGZpbGUgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZ3VuemlwcGVkIDxpPi50YXI8L2k+IGFyY2hpdmUgZmlsZS4KLSAgICAgICA8YnI+PGJyPgotICAgPGxpPkV4dHJhY3QgdGhlIGFyY2hpdmVkIGZpbGVzIG5lY2Vzc2FyeSBmb3IgY29tcGlsaW5nIEFwYWNoZTogIAotICAgICAgIDx1bD4KLSAgICAgICAgICAgPGxpPjx0dD48Yj5wYXggLXJ2a2YgPGk+b3Blbl9lZGl0aW9uX2ZpbGVuYW1lLnRhcjwvaT4gLW8gZnJvbT1JU084ODU5LTEsdG89SUJNLTEwNDcgIiovc3JjIjwvYj48L3R0PgotICAgICAgICAgICA8bGk+c3dpdGNoIHRvIHRoZSBzb3VyY2UgY29kZSBzdWJkaXJlY3Rvcnkgb2YgdGhlIG5ld2x5IGV4dHJhY3RlZCBhcGFjaGUgZGlyZWN0b3J5OiA8dHQ+PGI+Y2QgPGk+YXBhY2hlLTEuMzwvaT4vc3JjPC9iPjwvdHQ+Ci0gICAgICAgICAgIDxsaT5yZW1vdmUgdW5uZWNlc3Nhcnkgc3ViZGlyZWN0b3JpZXM6Ci0gICAgICAgICAgICAgICA8dHQ+PGI+cm0gLXIgb3MvYnMyMDAwIG9zL21wZWl4IG9zL25ldHdhcmUgb3Mvb3MyIG9zL29zMzkwIG9zL3dpbjMyPC9iPjwvdHQ+Ci0gICAgICAgPC91bD4KLTwvb2w+Ci08YnI+Ci08SDIgYWxpZ249Y2VudGVyPjxBIE5BTUU9ImNvbXBpbGF0aW9uIj5Db21waWxhdGlvbjwvQT48L0gyPgotPFA+Ci1BcGFjaGUgc3VwcG9ydHMgdGhlIG5vdGlvbiBvZiAib3B0aW9uYWwgbW9kdWxlcyIuICBIb3dldmVyLAotdGhlIHNlcnZlciBoYXMgdG8ga25vdyB3aGljaCBtb2R1bGVzIGFyZSBjb21waWxlZCBpbnRvIGl0LiAgSW4gb3JkZXIgZm9yCi10aG9zZSBtb2R1bGVzIHRvIGJlIGVmZmVjdGl2ZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIGdlbmVyYXRlIGEgc2hvcnQgYml0IG9mCi1jb2RlIChtb2R1bGVzLmMpIHdoaWNoIHNpbXBseSBoYXMgYSBsaXN0IG9mIHRoZW0uIElmIHlvdSBhcmUgdXNpbmcgdGhlIDx0dD5Db25maWd1cmU8L3R0PiB1dGlsaXR5Ci1hbmQgPHR0Pm1ha2U8L3R0PiwgbW9kdWxlcy5jIGFuZCBvdGhlciBuZWNlc3NhcnkgZmlsZXMgd2lsbCBiZSBjcmVhdGVkIGZvciB5b3UgYXV0b21hdGljYWxseS4KLTwvUD4KLTxQPgotVGhlIHByb3ZpZGVkIHNjcmlwdHMgYXNzdW1lIGEgYzg5IGNvbXBpbGVyIGFuZCBoYXZlIG9ubHkgYmVlbiB0ZXN0ZWQgb24gYW4KLU9wZW4gRWRpdGlvbiBlbnZpcm9ubWVudC4gIElmIHlvdSBhcmUgdXNpbmcgYSBwbGF0Zm9ybSBvdGhlciB0aGF0Ci1PcGVuIEVkaXRpb24geW91IG1heSBuZWVkIHRvIG1vZGlmeSBzcmMvb3MvdHBmL1RQRkV4cG9ydCBhbmQgc3JjL0NvbmZpZ3VyZQotdG8gbWF0Y2ggeW91ciBlbnZpcm9ubWVudC4KLTwvUD4KLTxmb250IGNvbG9yPXJlZCBzaXplPTQ+VElQOiA8L2ZvbnQ+Ci1FZGl0aW5nIGZpbGVzIG9uIHlvdXIgUEMgcHJpb3IgdG8gbW92aW5nIHRoZW0gdG8gT3BlbiBFZGl0aW9uIG1heSByZXN1bHQKLWluIHRoZSBsb3NzL2FkZGl0aW9uIG9mIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMuICBGaWxlcyBvZiBjb25jZXJuIGluY2x1ZGUgc2hlbGwKLXNjcmlwdHMgYW5kIHNyYy9Db25maWd1cmF0aW9uLiAgVGhlIG1vc3QgY29tbW9uIHByb2JsZW1zIGFyZSB3aXRoCi10YWIgY2hhcmFjdGVycyBhbmQgQ1IvTEYgY2hhcmFjdGVycy4gIE1vc3QgZWRpdG9ycyB3aWxsIGhhbmRsZSB0aGUgQ1IvTEYgcHJvYmxlbSBjb3JyZWN0bHkKLWJ1dCBub25lIHNlZW0gdG8gaGFuZGxlIHRhYiBjaGFyYWN0ZXJzLiAgSWYgeW91IG5lZWQgdG8gZWRpdCBmaWxlcyBwcmlvciB0byBtb3ZpbmcgdGhlbSB0byBPcGVuIEVkaXRpb24sCi1lZGl0IHRoZW0gaW4gYSBVTklYIGVkaXRvciBzdWNoIGFzIHZpIG9yIGVtYWNzLjxicj4KLTxQPgotTm90ZSB0aGF0IE9wZW4gRWRpdGlvbiBjb21tYW5kcyBpbiB0aGlzIHNlY3Rpb24gYXJlIHNob3duIGluCi08VFQ+PFNUUk9ORz5ib2xkPC9TVFJPTkc+PC9UVD4sCi1hcmUgY2FzZSBzZW5zaXRpdmUsIGFuZCBtdXN0IGJlIG1hZGUgZnJvbSB0aGUgInNyYyIgZGlyZWN0b3J5LgotPC9QPgotPE9MPgotPExJPk92ZXJsYXkgc3JjL0NvbmZpZ3VyYXRpb24gd2l0aCBzcmMvQ29uZmlndXJhdGlvbi50bXBsOiAgCi0gICAgPFRUPjxTVFJPTkc+Y3AmbmJzcDtDb25maWd1cmF0aW9uLnRtcGwmbmJzcDtDb25maWd1cmF0aW9uPC9TVFJPTkc+PC9UVD4KLSAgICA8QlI+PEJSPgotPExJPkVkaXQgc3JjL0NvbmZpZ3VyYXRpb24uICBJdCBjb250YWlucyB0aGUgbGlzdCBhbmQgc2V0dGluZ3MKLSAgICBvZiB2YXJpb3VzICJSdWxlcyIgYW5kIGFuIGFkZGl0aW9uYWwgc2VjdGlvbiBhdCB0aGUgYm90dG9tIHRoYXQgZGV0ZXJtaW5lcwotICAgIHdoaWNoIG1vZHVsZXMgdG8gY29tcGlsZToKLSAgICA8QlI+PEJSPgotICAgIDxVTD4KLSAgICA8TEk+QWRqdXN0IHRoZSBSdWxlcyBhbmQgPFRUPkVYVFJBX0NGTEFHU3xMSUJTfExERkxBR1N8SU5DTFVERVM8L1RUPgotICAgICAgICBpZiB5b3UgZmVlbCBzbyBpbmNsaW5lZC4KLSAgICA8QlI+PEJSPgotICAgIDxMST5Db21tZW50IG91dCAoYnkgcHJlY2VkaW5nIHRoZSBsaW5lIHdpdGggYSAiIyIpIGxpbmVzIGNvcnJlc3BvbmRpbmcKLSAgICAgICAgdG8gdGhvc2UgbW9kdWxlcyB5b3UgRE8mbmJzcDtOT1Qgd2lzaCB0byBpbmNsdWRlLgotICAgIDxCUj48QlI+Ci0gICAgPExJPlVuY29tbWVudCAoYnkgcmVtb3ZpbmcgdGhlIGluaXRpYWwgIiMiLCBpZiBwcmVzZW50KSBsaW5lcwotICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRob3NlIG9wdGlvbmFsIG1vZHVsZXMgeW91IHdpc2gKLSAgICAgICAgdG8gaW5jbHVkZSBvciBhZGQgbmV3IGxpbmVzIGNvcnJlc3BvbmRpbmcgdG8gYW55IGN1c3RvbSBtb2R1bGVzCi0gICAgICAgIHlvdSBoYXZlIHdyaXR0ZW4uCi0gICAgICAgIFRoZSBodGRvY3MvbWFudWFsLzxBIEhSRUY9InJlYWRtZS10cGYuaHRtbCI+cmVhZG1lLXRwZi5odG1sPC9BPgotICAgICAgICBkb2N1bWVudCBsaXN0cyB0aGUgbW9kdWxlcyB0aGF0IGhhdmUgYmVlbiB0ZXN0ZWQgb24gVFBGLgotICAgIDwvVUw+Ci0gICAgPGJyPlRoZSBtb2R1bGVzIHBsYWNlZCBpbiB0aGUgQXBhY2hlIGRpc3RyaWJ1dGlvbiBhcmUgdGhlIG9uZXMgdGhhdCBoYXZlIGJlZW4KLSAgICB0ZXN0ZWQgYW5kIGFyZSB1c2VkIHJlZ3VsYXJseSBieSB2YXJpb3VzIG1lbWJlcnMgb2YgdGhlIEFwYWNoZSBkZXZlbG9wbWVudAotICAgIGdyb3VwLiAgQWRkaXRpb25hbCBtb2R1bGVzIGNvbnRyaWJ1dGVkIGJ5IG1lbWJlcnMgb3IgdGhpcmQgcGFydGllcyB3aXRoIHNwZWNpZmljCi0gICAgbmVlZHMgb3IgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgYXQKLSAgICA8QSAKLUhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2NvbnRyaWIvbW9kdWxlcy8iPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2NvbnRyaWIvbW9kdWxlcy88L0E+LgotICAgIFRoZXJlIGFyZSBpbnN0cnVjdGlvbnMgb24gdGhhdCBwYWdlIGZvciBsaW5raW5nIHRoZXNlIG1vZHVsZXMgaW50byB0aGUgY29yZSBBcGFjaGUKLSAgICBjb2RlLgotICAgIDxCUj48QlI+Ci08TEk+U2V0IHRoZSBUUEYgZW52aXJvbm1lbnQgdmFyaWFibGVzOgotICAgIDxUVD48U1RST05HPi4mbmJzcDtvcy90cGYvVFBGRXhwb3J0PC9TVFJPTkc+PC9UVD4KLSAgICA8QlI+Ci0gICAgKFRoZSBpbml0aWFsIHBlcmlvZCBhbmQgYmxhbmsgb24gdGhlIGNvbW1hbmQgYXJlIHJlcXVpcmVkIHRvIGVuc3VyZQotICAgIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZXhpc3QgYmV5b25kIHRoZSBzY29wZSBvZiB0aGUgc2hlbGwgc2NyaXB0LikKLSAgICBUaGlzIHNjcmlwdCB3aWxsIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlcXVpcmVkIHRvIGNvbXBpbGUgdGhlCi0gICAgcHJvZ3JhbXMgZm9yIFRQRi4gIFZlcmlmeSB0aGF0IHRoZSBleHBvcnQgdmFyaWFibGVzIGFyZSB2YWxpZCBmb3IgeW91cgotICAgIGluc3RhbGxhdGlvbiwgaW4gcGFydGljdWxhciwgdGhlIHN5c3RlbSBpbmNsdWRlIGZpbGUgZGlyZWN0b3JpZXMuICBUaGUKLSAgICBzeXN0ZW0gaW5jbHVkZSBmaWxlcyBtdXN0IHJlc2lkZSBvbiB5b3VyIE9wZW4gRWRpdGlvbiBzeXN0ZW0gaW4gdGhlCi0gICAgYXBwcm9wcmlhdGUgZmlsZSBzdHJ1Y3R1cmUgc2ltaWxhciB0byAvdXNyL2luY2x1ZGUgYW5kIC91c3IvaW5jbHVkZS9zeXMuCi0gICAgRE8mbmJzcDtOT1QgbW9kaWZ5IHRoZSA8VFQ+VFBGPVlFUzwvVFQ+IGV4cG9ydCB2YXJpYWJsZS4gIElmIHRoaXMgaXMKLSAgICBjaGFuZ2VkLCB0aGUgIkNvbmZpZ3VyZSIgc2NyaXB0IHdpbGwgbm90IHJlY29nbml6ZSBUUEYuCi0gICAgPEJSPjxCUj4KLTxMST5SdW4gdGhlICJDb25maWd1cmUiIHNjcmlwdDoKLSAgICA8VFQ+PFNUUk9ORz5Db25maWd1cmU8L1NUUk9ORz48L1RUPgotICAgIDxCUj4KLSAgICBUaGlzIGdlbmVyYXRlcyBtb2R1bGVzLmMsIGluY2x1ZGUvYXBfY29uZmlnX2F1dG8uaCwgYW5kIG5lY2Vzc2FyeSBNYWtlZmlsZXM6Ci0gICAgICA8UFJFPgotICAgICAgVXNpbmcgY29uZmlnIGZpbGU6IENvbmZpZ3VyYXRpb24KLSAgICAgIENyZWF0aW5nIE1ha2VmaWxlCi0gICAgICAgKyBjb25maWd1cmVkIGZvciBUUEYgcGxhdGZvcm0KLSAgICAgICArIHNldHRpbmcgQyBjb21waWxlciB0byBjODkKLSAgICAgICArIHNldHRpbmcgQyBwcmUtcHJvY2Vzc29yIHRvIGM4OSAtRQotICAgICAgICsgY2hlY2tpbmcgZm9yIHN5c3RlbSBoZWFkZXIgZmlsZXMKLSAgICAgICArIGFkZGluZyBzZWxlY3RlZCBtb2R1bGVzCi0gICAgICAgKyBjaGVja2luZyBzaXplb2YgdmFyaW91cyBkYXRhIHR5cGVzCi0gICAgICBDcmVhdGluZyBNYWtlZmlsZSBpbiBzdXBwb3J0Ci0gICAgICBDcmVhdGluZyBNYWtlZmlsZSBpbiByZWdleAotICAgICAgQ3JlYXRpbmcgTWFrZWZpbGUgaW4gb3MvdHBmCi0gICAgICBDcmVhdGluZyBNYWtlZmlsZSBpbiBhcAotICAgICAgQ3JlYXRpbmcgTWFrZWZpbGUgaW4gbWFpbgotICAgICAgQ3JlYXRpbmcgTWFrZWZpbGUgaW4gbW9kdWxlcy9zdGFuZGFyZAotICAgICAgJCBfCi0gICAgICA8L1BSRT4KLSAgICBJZiB5b3Ugd2FudCB0byBtYWludGFpbiBtdWx0aXBsZSBjb25maWd1cmF0aW9ucywgeW91IGNhbgotICAgIHNheSwgPEVNPmUuZy48L0VNPiwKLSAgICA8QlI+Ci0gICAgPFRUPjxTVFJPTkc+Q29uZmlndXJlIC1maWxlIENvbmZpZ3VyYXRpb24uYWk8L1NUUk9ORz48L1RUPgotICAgIDxCUj4KLSAgICAgIDxQUkU+Ci0gICAgICBVc2luZyBjb25maWcgZmlsZTogQ29uZmlndXJhdGlvbi5haQotICAgICAgQ3JlYXRpbmcgTWFrZWZpbGUKLSAgICAgICArIGNvbmZpZ3VyZWQgZm9yICZsdDt3aGF0ZXZlciZndDsgcGxhdGZvcm0KLSAgICAgICArIHNldHRpbmcgQyBjb21waWxlciB0byAmbHQ7d2hhdGV2ZXImZ3Q7Ci0gICAgICBldCBjZXRlcmEKLSAgICAgIDwvUFJFPgotICAgIElmIHlvdSByZWNlaXZlIGFuIGVycm9yIHN1Y2ggYXMgIjxUVD5Db25maWd1cmUgMTQ2OiBGU1VNNzM1MSBub3QgZm91bmQ8L1RUPiIKLSAgICB0aGUgbW9zdCBsaWtlbHkgZXhwbGFuYXRpb24gaXMgdGhhdCBvbmUgb3IgbW9yZSBvZiB0aGUgPHR0Pm1ha2U8L3R0PiByZWxhdGVkCi0gICAgZmlsZXMgd2VyZSBlZGl0ZWQgb24gYSBub24tVU5JWCBwbGF0Zm9ybSwgY29ycnVwdGluZyB0aGUgZW5kLW9mLWxpbmUgbWFya3MuCi0gICAgVmVyaWZ5IHRoYXQgbGluZXMgZW5kaW5nIHdpdGggIlwiIGluIHRoZSBmbGFnZ2VkIGZpbGUgZG8mbmJzcDtub3QgaGF2ZSB0cmFpbGluZwotICAgIHNwYWNlcy4gIFVzaW5nIHRoZSB2aSBlZGl0b3IgYW5kIHRoZSBzYW1wbGUgZXJyb3IgYWJvdmUgYXMgYW4gZXhhbXBsZS4uLgotICAgIDxCUj48QlI+PFBSRT4KLSAgICAgICAgICAgIHB1bGwgdXAgdGhlIGZsYWdnZWQgZmlsZTogICAgICAgPFNUUk9ORz52aSZuYnNwO0NvbmZpZ3VyZTwvU1RST05HPgotICAgICAgICAgICAgdHVybiBvbiBwdW5jdHVhdGlvbjogICAgICAgICAgICA8U1RST05HPjpzZXQmbmJzcDtsaXN0PC9TVFJPTkc+Ci0gICAgICAgICAgICBnbyB0byB0aGUgbGluZSBpbiBxdWVzdGlvbjogICAgIDxTVFJPTkc+MTQ2RzwvU1RST05HPgotICAgICAgICAgICAgICAgb3IgZmluZCBhIGxpbmUgd2l0aCBhICJcIjogICA8U1RST05HPi9cXDwvU1RST05HPjwvUFJFPgotICAgIFRoZSBlbmQgb2YgbGluZSBzaG91bGQgZGlzcGxheSBhcyAiPFRUPlwkPC9UVD4iLiAgSWYgaXQgaXMgZGlzcGxheWVkIGFzCi0gICAgIjxUVD5cICQ8L1RUPiIgKHdpdGggYSBibGFuayBiZXR3ZWVuIFwgYW5kICQpIHRoZW4geW91IHNob3VsZCByZXZlcnQgdG8gdGhlCi0gICAgZGlzdHJpYnV0ZWQgdmVyc2lvbiBvZiB0aGUgZmlsZSBhbmQgbWFrZSB0aGUgc2l0ZS1zcGVjaWZpYwotICAgIGNoYW5nZXMgYWdhaW4gdXNpbmcgYSBVTklYIGNvbXBhdGlibGUgZWRpdG9yIHN1Y2ggYXMgdmkgb3IgZW1hY3MuCi0gICAgVGhlbiB0cnkgdGhlIENvbmZpZ3VyZSBjb21tYW5kIGFnYWluLgotICAgIDxCUj48UFJFPiAgICAgICAgICAgIGNsb3NlIHRoZSBmaWxlOiAgICAgICAgICAgICAgICAgPFNUUk9ORz46cSAgPC9TVFJPTkc+KG9yIDxTVFJPTkc+OnF1aXQhPC9TVFJPTkc+KTwvUFJFPgotCi08TEk+RWRpdCBpbmNsdWRlL2FwX2NvbmZpZy5oIGlmIHlvdSB3b3VsZCBsaWtlIHRoZSBzY29yZWJvYXJkIGtlcHQgaW4gc2hhcmVkCi0gICAgbWVtb3J5IGluc3RlYWQgb2YgZmlsZSBvciBzeXN0ZW0gaGVhcC48YnI+Ci0gICAgVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIEFwYWNoZSBvbiBhbGwgcGxhdGZvcm1zIDxpPmV4Y2VwdDwvaT4gVFBGIGlzIHRvIHVzZSB0aGUKLSAgICBmaWxlIHN5c3RlbSBmb3IgbWFpbnRhaW5pbmcgdGhlIHNjb3JlYm9hcmQgKHdoaWNoIGhvbGRzIGN1cnJlbnQgQXBhY2hlIGNoaWxkcmVuIHN0YXR1cykuCi0gICAgVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIEFwYWNoZSBvbiBUUEYgaXMgdG8gdXNlIHN5c3RlbSBoZWFwLiAgQXZhaWxhYmxlIHdpdGgKLSAgICBQVVQxMCBpcyB0aGUgdXNlIG9mIHNoYXJlZCBtZW1vcnkgZm9yIHRoZSBzY29yZWJvYXJkIGluIHBsYWNlIG9mIHRoZSBmaWxlIHN5c3RlbS4KLSAgICBUaGlzIHJlZHVjZXMgZmlsZSBhY3Rpdml0eSBmb3IgdGhlIHBhcmVudCBBcGFjaGUgRUNCIGFuZCBpbXByb3ZlcyBwZXJmb3JtYW5jZS4KLSAgICBUbyBhY3RpdmF0ZSBzaGFyZWQgbWVtb3J5LCB1bmNvbW1lbnQgb3IgPGVtPmFkZDwvZW0+IHRoZSBkaXJlY3RpdmUKLSAgICA8dHQ+PGI+I2RlZmluZSZuYnNwO1VTRV9TSE1HRVRfU0NPUkVCT0FSRDwvYj48L3R0PgotICAgIGFuZCBjb21tZW50IG91dCBvciA8ZW0+cmVtb3ZlPC9lbT4gdGhlIGRpcmVjdGl2ZSA8dHQ+PGI+I2RlZmluZSBVU0VfVFBGX1NDT1JFQk9BUkQ8L2I+PC90dD4KLSAgICBib3RoIG9mIHdoaWNoIGFyZSBpbiB0aGUgVFBGIHNlY3Rpb24gaW4gYXBfY29uZmlnLmguCi0gICAgVGhpcyBjaGFuZ2Ugd2lsbCBvbmx5IHRha2UgZWZmZWN0IGFmdGVyIEFwYWNoZSBpcyAocmUpY29tcGlsZWQuCi0gICAgPGJyPjxicj4KLSAgICBJZiB5b3UgcHJlZmVyIHRvIHVzZSB0aGUgZmlsZSBzeXN0ZW0gaW5zdGVhZCBvZiBzeXN0ZW0gaGVhcCBvciBzaGFyZWQgbWVtb3J5LCBlbnN1cmUgdGhhdCBib3RoCi0gICAgPHR0PlVTRV9UUEZfU0NPUkVCT0FSRDwvdHQ+IGFuZCA8dHQ+VVNFX1NITUdFVF9TQ09SRUJPQVJEPC90dD4gYXJlIGNvbW1lbnRlZCBvdXQgb3IgcmVtb3ZlZC4KLSAgICBUaGlzIGNoYW5nZSB3aWxsIG9ubHkgdGFrZSBlZmZlY3QgYWZ0ZXIgQXBhY2hlIGlzIChyZSljb21waWxlZC4KLQotPEEgTkFNRT0iZGFlbW9uIj48L0E+PGJyPiZuYnNwOzxicj4KLTxMST5FZGl0IGluY2x1ZGUvYXBfY29uZmlnLmggaWYgeW91IHBsYW4gb24gdXNpbmcgdGhlIFpJTkVUIERBRU1PTiBtb2RlbCBpbnN0ZWFkIG9mIHRoZSBOT0xJU1RFTiBtb2RlbC48YnI+Ci0gICAgVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gbGV0IEFwYWNoZSBjaGVjayB0aGUgc2VydmVyIHN0YXR1cyAoYWN0aXZlL2luYWN0aXZlKSB3aXRoIFpJTkVUCi0gICAgYW5kIHNodXQgaXRzZWxmIGRvd24gd2hlbiBhcHByb3ByaWF0ZS4gIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGFsc28gaW5jbHVkZXMgY2hlY2tpbmcgQXBhY2hlJ3MgYWN0aXZhdGlvbiBudW1iZXIuCi0gICAgQXZhaWxhYmxlIHdpdGggUFVUMTEgKFBKMjU3NjEpIFpJTkVUIGNhbiBwZXJmb3JtIHRoZXNlIGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIEFwYWNoZSBieSB1c2luZyB0aGUgREFFTU9OIG1vZGVsLgotICAgIFRoaXMgbW9kZWwgb2ZmZXJzIGluY3JlYXNlZCByZWxpYWJpbGl0eSBhbmQgaXMgcHJlZmVycmVkIG92ZXIgdGhlIE5PTElTVEVOIG1vZGVsLgotICAgIElmIEFwYWNoZSBnb2VzIGRvd24gd2hpbGUgcnVubmluZyB1bmRlciB0aGUgTk9MSVNURU4gbW9kZWwgWklORVQgd2lsbCBub3QgcmVhY3RpdmF0ZSBpdCBub3IgYWxlcnQgdGhlIG9wZXJhdG9yLgotICAgIFRvIHVzZSB0aGUgREFFTU9OIG1vZGVsIHlvdSBtdXN0IG1vZGlmeSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBBcGFjaGUgYnkgdW5jb21tZW50aW5nIG9yIGFkZGluZyB0aGUgZGlyZWN0aXZlCi0gICAgPHR0PjxiPiNkZWZpbmUmbmJzcDtVU0VfVFBGX0RBRU1PTjwvYj48L3R0PiB3aXRoaW4gdGhlIFRQRiBzZWN0aW9uIGluIGFwX2NvbmZpZy5oLgotICAgIFRoaXMgZGlyZWN0aXZlIGlzIGFsc28gcmVjb21tZW5kIHdoZW4gc3RhcnRpbmcgQXBhY2hlIGZyb20gdGhlIGNvbW1hbmQgbGluZSAoQVBBUiBQSjI2NTE1KS4KLSAgICBUaGlzIGNoYW5nZSB3aWxsIG9ubHkgdGFrZSBlZmZlY3QgYWZ0ZXIgQXBhY2hlIGlzIChyZSljb21waWxlZC4KLSAgICA8YnI+PGJyPgotCi0KLTxMST5Ob3cgY29tcGlsZSB0aGUgcHJvZ3JhbXM6IDxUVD48U1RST05HPm1ha2U8L1NUUk9ORz48L1RUPjxCUj4KLSAgICBCZXNpZGVzIGNvbXBpbGluZywgPHR0Pm1ha2U8L3R0PiBhbHNvIHJ1bnMgbWFpbi9nZW5fdGVzdF9jaGFyLmMgYW5kIG1haW4vZ2VuX3VyaV9kZWxpbXMuYwotICAgIGluIG9yZGVyIHRvIGNyZWF0ZSBtYWluL3Rlc3RfY2hhci5oIGFuZCBtYWluL3VyaV9kZWxpbXMuaCByZXNwZWN0aXZlbHk8QlI+PEJSPgotICAgIElmIGR1cmluZyBjb21waWxhdGlvbiB5b3UgZ2V0IGEgd2FybmluZyBhYm91dCBhIG1pc3NpbmcgJ3JlZ2V4LmgnLCBzZXQKLSAgICA8VFQ+V0FOVEhTUkVHRVg9eWVzPC9UVD4gaW4gdGhlIHNyYy9Db25maWd1cmF0aW9uIGZpbGUgYW5kIHN0YXJ0IGJhY2sgYXQgdGhlCi0gICAgPFRUPjxTVFJPTkc+Q29uZmlndXJlPC9TVFJPTkc+PC9UVD4gc3RlcC4KLTwvT0w+Ci0KLTxBIE5BTUU9Imluc3RhbGxhdGlvbiI+Jm5ic3A7PC9BPgotPEgyIGFsaWduPWNlbnRlcj5JbnN0YWxsYXRpb248L0gyPgotPE9MPgotPExJPkxpbmsgdGhlIGNvbXBpbGVkIG9iamVjdCBmaWxlcyBpbnRvIGEgRExMLgotICAgIFNhbXBsZSBsaW5rIEpDTCBoYXMgYmVlbiBpbmNsdWRlZCBhcyBzcmMvb3MvdHBmL3NhbXBsZXMvbGlua2RsbC5qY2wuCi0gICAgWW91IHdpbGwgbmVlZCB0byBtb2RpZnkgdGhpcyBKQ0w6Ci0gICAgPHVsPgotICAgICAgIDxsaT5DaGFuZ2UgdGhlIElEcywgZGF0YSBzZXQgbmFtZXMsIGFuZCBsaWJyYXJpZXMgZm9yIHlvdXIgcGFydGljdWxhciBzaXRlLgotICAgICAgIDxsaT5BZGQvcmVtb3ZlIDxUVD5tb2RfPEVNPnh4eDwvRU0+Lm88L1RUPiBmaWxlcyBzbyB0aGV5IGNvcnJlc3BvbmQgdG8gdGhlCi0gICAgICAgICAgIDxUVD5tb2RfPEVNPnh4eDwvRU0+Lm88L1RUPiBsaW5lcyBpbiB5b3VyIHNyYy9Db25maWd1cmF0aW9uIGZpbGUuCi0gICAgPC91bD4KLSAgPGJyPjxmb250IGNvbG9yPXJlZCBzaXplPTQ+VElQOiA8L2ZvbnQ+Ci0gIERvIE5PVCBpbmNsdWRlIGdlbl90ZXN0X2NoYXIubyBvciBnZW5fdXJpX2RlbGltcy5vIGluIHRoZSBsaW5rIEpDTCBzaW5jZSB0aGVzZSBmaWxlcyBhcmUgb25seQotICB1c2VkIGR1cmluZyB0aGUgPHR0Pm1ha2U8L3R0PiBzdGVwLgotICA8YnI+PGJyPgotPExJPkNyZWF0ZSBhIGxvYWRzZXQuICBTYW1wbGUgbG9hZHNldCBKQ0wgaGFzIGJlZW4gaW5jbHVkZWQgYXMgc3JjL29zL3RwZi9zYW1wbGVzL2xvYWRzZXQuamNsLgotICAgIFlvdSB3aWxsIG5lZWQgdG8gbW9kaWZ5IHRoaXMgSkNMIGZvciB5b3VyIHBhcnRpY3VsYXIgc2l0ZS4KLSAgPGJyPjxicj4KLTxMST5Mb2FkICg8dHQ+Wk9MRFIgTE9BRDwvdHQ+KSBhbmQgYWN0aXZhdGUgKDx0dD5aT0xEUiBBQ1Q8L3R0PikgdGhlIGxvYWRzZXQgb24geW91ciB0ZXN0IHN5c3RlbS4KLSAgPGJyPjxicj4KLTxMST5FbnN1cmUgdGhhdCB0aGUgcHJvZ3JhbSBuYW1lIHlvdSBhcmUgdXNpbmcgZm9yIEFwYWNoZSBoYXMgPHR0PlJFU1RSSUNUPC90dD4gYW5kIDx0dD5LRVkwPC90dD4gYXV0aG9yaXphdGlvbi4KLSAgICA8dHQ+PGI+emRwYXQgPGk+cHBwcDwvaT4mbmJzcDs8L2I+KDxiPmMtYzwvYj4pPC90dD4gd2lsbCBkaXNwbGF5IGFsbG9jYXRpb24gaW5mb3JtYXRpb24uCi0gICAgWW91IGNhbiB1c2UgPHR0PjxiPnphcGF0Jm5ic3A7PGk+cHBwcDwvaT4mbmJzcDtyZXN0cmljdCZuYnNwO2tleTAmbmJzcDs8L2I+KDxiPmMtYzwvYj4pPC90dD4gdG8gYWx0ZXIgdGhlCi0gICAgYXV0aG9yaXphdGlvbi4KLSAgICBOb3RlIHRoYXQgaWYgdGhlIHByb2dyYW0gbmFtZSBpcyB1bmFsbG9jYXRlZCwgeW91IG11c3QgaGF2ZSB0aGUgbG9hZHNldCBmb3IgaXQgYWN0aXZhdGVkIG9yIHlvdSB3aWxsIHJlY2VpdmUKLSAgICBJTlZBTElEIFBST0dSQU0gTkFNRSBmcm9tIHRoZSA8dHQ+emRwYXQvemFwYXQ8L3R0PiBlbnRyaWVzLgotICAgPGJyPjxicj4KLTxMST4KLSAgQXBhY2hlIHJlcXVpcmVzIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGluaXRpYWxpemUgaXRzZWxmIGR1cmluZyBhY3RpdmF0aW9uLgotICAoUHJldmlvdXNseSB0aHJlZSBjb25maWd1cmF0aW9uIGZpbGVzIHdlcmUgdXNlZC4pCi0gIENvcHkgdGhlIGRpc3RyaWJ1dGlvbiB2ZXJzaW9uLCAvY29uZi9odHRwZC5jb25mLWRpc3QsIHRvIC9jb25mL2h0dHBkLmNvbmYgYW5kIHRoZW4KLSAgZWRpdCB0aGUgL2NvbmYvaHR0cGQuY29uZiBjb3B5IHdpdGggeW91ciBzaXRlIHNwZWNpZmljIGluZm9ybWF0aW9uLgotICA8QlI+PEJSPgotICBHZW5lcmFsIGRvY3VtZW50YXRpb24gZm9yIEFwYWNoZSBpcyBsb2NhdGVkIGF0Ci0gIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzLyI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvPC9BPgotICBhbmQgaW4gdGhlIEhUTUwgcGFnZXMgaW5jbHVkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uICh0YXJiYWxsKSB1bmRlciB0aGUKLSAgL2h0ZG9jcy9tYW51YWwgZGlyZWN0b3J5LgotICA8QlI+PEJSPgotPExJPk9uIFRQRiBhY3RpdmF0ZSBaQ0xBVyBhbmQgdXBkYXRlIElORVREIHVzaW5nIFpJTkVUIGVudHJpZXMsIHRoZSBjb21tb24gY2FzZToKLSAgICA8QlI+PEJSPgotICAgIDxQUkU+Ci0gICAgWklORVQgQUREIFMtVEZUUCBQR00tQ1RGVCBQT1JULTY5IFBST1RPQ09MLVVEUCBNT0RFTC1OT1dBSVQKLQotICAgIFpJTkVUIEFERCBTLUFQQUNIRSBQR00tPEVNPnBwcHA8L0VNPiBNT0RFTC1OT0xJU1RFTgotICAgIG9yIFpJTkVUIEFERCBTLUFQQUNIRSBQR00tPEVNPnBwcHA8L0VNPiBNT0RFTC1EQUVNT04gVVNFUi1yb290IDxBIEhSRUY9IiNkYWVtb24iPihzZWUgbm90ZXMgYWJvdmUgcmVnYXJkaW5nIHRoZSBEQUVNT04gbW9kZWwpPC9BPjwvUFJFPgotICBQbGVhc2UgcmVmZXIgdG8gPEVNPklCTSBUcmFuc2FjdGlvbiBQcm9jZXNzaW5nIEZhY2lsaXR5IFRyYW5zbWlzc2lvbiBDb250cm9sCi0gIFByb3RvY29sL0ludGVybmV0IFByb3RvY29sIFZlcnNpb24gNCBSZWxlYXNlIDE8L0VNPiBmb3IgbW9yZSBpbmZvcm1hdGlvbgotICBvbiBaQ0xBVywgSU5FVEQsIGFuZCBURlRQLgotICA8QlI+PEJSPgotPExJPlByaW9yIHRvIHNlbmRpbmcgYSByZXF1ZXN0IHRvIHlvdXIgQXBhY2hlIHNlcnZlciBmcm9tIGEgYnJvd3NlciwKLSAgICBURlRQIHRoZSBjb25maWd1cmF0aW9uIGZpbGUsIGxvZywgaWNvbnMgYW5kIHdlYiBwYWdlcyB0byB5b3VyIFRQRiBzeXN0ZW0uCi0gICAgQSB0eXBpY2FsIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIEFwYWNoZSBpcyBhcyBmb2xsb3dzOgotPFBSRT4gICAgIC91c3IvbG9jYWwvYXBhY2hlL2NvbmYKLSAgICAgL3Vzci9sb2NhbC9hcGFjaGUvbG9ncwotICAgICAvdXNyL2xvY2FsL2FwYWNoZS9pY29ucwotICAgICAvdXNyL2xvY2FsL2FwYWNoZS9odGRvY3M8L1BSRT4KLSAgICBBbGwgZ2lmLCBqcGcsIGFuZCB6aXAgZmlsZXMgc2hvdWxkIGJlIFRGVFAnZCBhcyBiaW5hcnk7IGNvbmYgZmlsZXMgYW5kIGh0bWwgcGFnZXMgc2hvdWxkIGJlIFRGVFAnZCBhcyB0ZXh0LgotICAgIDxicj5UaGUgbG9ncyBkaXJlY3RvcnkgbXVzdCBleGlzdCBpbiBvcmRlciB0byBhdm9pZCBhbiA8Q09ERT5mb3BlbjwvQ09ERT4gZXJyb3Igd2hpbGUgcnVubmluZyBBcGFjaGUuCi0gICAgSWYgeW91J3JlIHJ1bm5pbmcgYSBQVVQxMCBvciBoaWdoZXIgdmVyc2lvbiBvZiBUUEYgbWFrZSB0aGUgZGlyZWN0b3J5IHVzaW5nIHRoZQotICAgIDx0dD48Yj56ZmlsZSBta2RpciAvdXNyL2xvY2FsL2FwYWNoZS9sb2dzPC9iPjwvdHQ+IGZ1bmN0aW9uYWwgZW50cnkuCi0gICAgSWYgeW91J3JlIHJ1bm5pbmcgVFBGIHZlcnNpb24gUFVUMDkgVEZUUCBhbiBlbXB0eSBmaWxlIGludG8gdGhlIGxvZ3Mgc3ViZGlyZWN0b3J5IHRvIGNyZWF0ZSBpdC4gIAotICAgIDxicj48YnI+Ci08TEk+U3RhcnQgdGhlIHNlcnZlciB1c2luZyB0aGUgPHR0PjxiPlpJTkVUIFNUQVJUIFMtQVBBQ0hFPC9iPjwvdHQ+IGNvbW1hbmQuCi08L09MPgotPEEgTkFNRT0idmlzdWFsYWdlIj4mbmJzcDs8L0E+Ci08SDIgYWxpZ249Y2VudGVyPkNvbXBpbGluZyB3aXRoIFZpc3VhbEFnZSBUUEY8L0gyPgotPFA+Ci0gIEl0IGlzIG5vdCByZXF1aXJlZCB0aGF0IDx0dD5tYWtlPC90dD4gYmUgdXNlZCB0byBjb21waWxlIEFwYWNoZSBmb3IgVFBGOgotICBJbmRpdmlkdWFsIHByb2dyYW1zIG1heSBiZSBjb21waWxlZCB1c2luZyBJQk0ncyBWaXN1YWxBZ2UgVFBGIHByb2R1Y3QuCi0gIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIGNvbXBpbGluZyBzZWxlY3RlZCBwcm9ncmFtcyBmb3IgdGhlIERlYnVnIFRvb2wuCi0gIDxCUj48QlI+Ci0gIFRoZSBmb2xsb3dpbmcgVmlzdWFsQWdlIGNvbXBpbGUgc2V0dGluZ3MgYXJlIHJlcXVpcmVkOgotPC9QPgotICA8VUw+Ci0gIDxMST48RU0+IkRFRklORSAtIERlZmluZSBwcmVwcm9jZXNzb3IgbWFjcm8gbmFtZShzKSI8L0VNPiBtdXN0IGluY2x1ZGUKLSAgICAgPFRUPjxTVFJPTkc+VFBGLCBDSEFSU0VUX0VCQ0RJQywgX1BPU0lYX1NPVVJDRSw8L1NUUk9ORz48L1RUPiBhbmQKLSAgICAgPFRUPjxTVFJPTkc+VVNFX0hTUkVHRVg8L1NUUk9ORz48L1RUPgotICA8QlI+PEJSPgotICA8TEk+PEVNPiJMU0VBUkNIIC0gUGF0aCBmb3IgdXNlciBpbmNsdWRlIGZpbGVzIjwvRU0+IG11c3QgaW5jbHVkZQotICAgICA8VFQ+PFNUUk9ORz4uLi9zcmMvaW5jbHVkZTwvU1RST05HPjwvVFQ+IGFuZCA8VFQ+PFNUUk9ORz4uLi9zcmMvb3MvdHBmPC9TVFJPTkc+PC9UVD4KLSAgPEJSPjxCUj4KLSAgPExJPjxFTT4iRExMIC0gR2VuZXJhdGUgRExMIGNvZGUiPC9FTT4gbXVzdCBiZSBjaGVja2VkCi0gIDxCUj48QlI+Ci0gIDxMST48RU0+IkxPTkdOQU1FIC0gU3VwcG9ydCBsb25nIG5hbWVzIjwvRU0+IG11c3QgYmUgY2hlY2tlZAotICA8L1VMPgotPEhSPgotPENFTlRFUj5bJm5ic3A7PEEgSFJFRj0iI3RvcCI+dG9wPC9BPgotICAgJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNkb3dubG9hZCI+RG93bmxvYWQ8L0E+Ci0gICAmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI2NvbXBpbGF0aW9uIj5Db21waWxhdGlvbjwvQT4KLSAgICZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjaW5zdGFsbGF0aW9uIj5JbnN0YWxsYXRpb248L0E+Ci0gICAmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI3Zpc3VhbGFnZSI+VmlzdWFsQWdlPC9BPiZuYnNwO10KLTwvQ0VOVEVSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9pbnN0YWxsLmh0bWwgYi9kb2NzL21hbnVhbC9pbnN0YWxsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZjUwNDcuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvaW5zdGFsbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+Q29tcGlsaW5nIGFuZCBJbnN0YWxsaW5nIEFwYWNoZTwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotCi08SDEgQUxJR049IkNFTlRFUiI+Q29tcGlsaW5nIGFuZCBJbnN0YWxsaW5nIEFwYWNoZSAxLjM8L0gxPgotCi1UaGlzIGRvY3VtZW50IGNvdmVycyBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIEFwYWNoZSBvbiBVbml4Ci1zeXN0ZW1zIG9ubHkuIEZvciBjb21waWxpbmcgYW5kIGluc3RhbGxhdGlvbiBvbiBXaW5kb3dzLCBzZWUgPEEKLUhSRUY9IndpbmRvd3MuaHRtbCI+VXNpbmcgQXBhY2hlIHdpdGggTWljcm9zb2Z0IFdpbmRvd3M8L0E+IGFuZCBmb3IKLVRQRiBzZWUgPEEgSFJFRj0iaW5zdGFsbC10cGYuaHRtbCI+SW5zdGFsbGluZyB0aGUgQXBhY2hlIDEuMyBIVFRQCi1TZXJ2ZXIgb24gVFBGPC9BPi4KLQotPFA+Ci0KLVVuaXhXYXJlIHVzZXJzIHdpbGwgd2FudCB0byBjb25zdWx0IDxBIEhSRUY9InVuaXh3YXJlLmh0bWwiPmJ1aWxkIG5vdGVzPC9BPgotZm9yIHZhcmlvdXMgVW5peFdhcmUgdmVyc2lvbnMgYmVmb3JlIGNvbXBpbGluZy4KLQotPEgyPkRvd25sb2FkaW5nIEFwYWNoZTwvSDI+Ci0KLUluZm9ybWF0aW9uIG9uIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBBcGFjaGUgY2FuIGJlIGZvdW5kIG9uIHRoZSBBcGFjaGUKLXdlYiBzZXJ2ZXIgYXQgPEEKLUhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L0E+LiAgVGhpcyB3aWxsCi1saXN0IHRoZSBjdXJyZW50IHJlbGVhc2UsIGFueSBtb3JlIHJlY2VudCBiZXRhLXRlc3QgcmVsZWFzZSwgdG9nZXRoZXIKLXdpdGggZGV0YWlscyBvZiBtaXJyb3Igd2ViIGFuZCBhbm9ueW1vdXMgZnRwIHNpdGVzLgotCi08UD4KLQotSWYgeW91IGRvd25sb2FkZWQgYSBiaW5hcnkgZGlzdHJpYnV0aW9uLCBza2lwIHRvIDxBCi1IUkVGPSIjaW5zdGFsbCI+SW5zdGFsbGluZyBBcGFjaGU8L0E+LiBPdGhlcndpc2UgcmVhZCB0aGUgbmV4dCBzZWN0aW9uCi1mb3IgaG93IHRvIGNvbXBpbGUgdGhlIHNlcnZlci4KLQotPEgyPkNvbXBpbGluZyBBcGFjaGU8L0gyPgotCi1Db21waWxpbmcgQXBhY2hlIGNvbnNpc3RzIG9mIHRocmVlIHN0ZXBzOiBGaXJzdGx5IHNlbGVjdCB3aGljaCBBcGFjaGUKLTxTVFJPTkc+bW9kdWxlczwvU1RST05HPiB5b3Ugd2FudCB0byBpbmNsdWRlIGludG8gdGhlIHNlcnZlci4gU2Vjb25kbHkgY3JlYXRlIGEKLWNvbmZpZ3VyYXRpb24gZm9yIHlvdXIgb3BlcmF0aW5nIHN5c3RlbS4gVGhpcmRseSBjb21waWxlIHRoZQotZXhlY3V0YWJsZS4KLTxQPgotCi1BbGwgY29uZmlndXJhdGlvbiBvZiBBcGFjaGUgaXMgcGVyZm9ybWVkIGluIHRoZSA8Q09ERT5zcmM8L0NPREU+Ci1kaXJlY3Rvcnkgb2YgdGhlIEFwYWNoZSBkaXN0cmlidXRpb24uIENoYW5nZSBpbnRvIHRoaXMgZGlyZWN0b3J5LgotCi08T0w+Ci0gPExJPgotICBTZWxlY3QgbW9kdWxlcyB0byBjb21waWxlIGludG8gQXBhY2hlIGluIHRoZQotICA8Q09ERT5Db25maWd1cmF0aW9uPC9DT0RFPiBmaWxlLiBVbmNvbW1lbnQgbGluZXMgY29ycmVzcG9uZGluZyB0bwotICB0aG9zZSBvcHRpb25hbCBtb2R1bGVzIHlvdSB3aXNoIHRvIGluY2x1ZGUgKGFtb25nIHRoZSBBZGRNb2R1bGUgbGluZXMKLSAgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZmlsZSksIG9yIGFkZCBuZXcgbGluZXMgY29ycmVzcG9uZGluZyB0bwotICBhZGRpdGlvbmFsIG1vZHVsZXMgeW91IGhhdmUgZG93bmxvYWRlZCBvciB3cml0dGVuLiAoU2VlIDxBCi0gIEhSRUY9Im1pc2MvQVBJLmh0bWwiPkFQSS5odG1sPC9BPiBmb3IgcHJlbGltaW5hcnkgZG9jcyBvbiBob3cgdG8KLSAgd3JpdGUgQXBhY2hlIG1vZHVsZXMpLiAgQWR2YW5jZWQgdXNlcnMgY2FuIGNvbW1lbnQgb3V0IHNvbWUgb2YgdGhlCi0gIGRlZmF1bHQgbW9kdWxlcyBpZiB0aGV5IGFyZSBzdXJlIHRoZXkgd2lsbCBub3QgbmVlZCB0aGVtIChiZSBjYXJlZnVsCi0gIHRob3VnaCwgc2luY2UgbWFueSBvZiB0aGUgZGVmYXVsdCBtb2R1bGVzIGFyZSB2aXRhbCBmb3IgdGhlIGNvcnJlY3QKLSAgb3BlcmF0aW9uIGFuZCBzZWN1cml0eSBvZiB0aGUgc2VydmVyKS4KLSAgPFA+Ci0KLSAgWW91IHNob3VsZCBhbHNvIHJlYWQgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgPENPREU+Q29uZmlndXJhdGlvbjwvQ09ERT4KLSAgZmlsZSB0byBzZWUgaWYgeW91IG5lZWQgdG8gc2V0IGFueSBvZiB0aGUgPENPREU+UnVsZTwvQ09ERT4gbGluZXMuCi0KLQotIDxMST4KLSAgQ29uZmlndXJlIEFwYWNoZSBmb3IgeW91ciBvcGVyYXRpbmcgc3lzdGVtLiBOb3JtYWxseSB5b3UgY2FuIGp1c3QKLSAgdHlwZSBydW4gdGhlIDxDT0RFPkNvbmZpZ3VyZTwvQ09ERT4gc2NyaXB0IGFzIGdpdmVuIGJlbG93LiBIb3dldmVyCi0gIGlmIHRoaXMgZmFpbHMgb3IgeW91IGhhdmUgYW55IHNwZWNpYWwgcmVxdWlyZW1lbnRzICg8RU0+ZS5nLjwvRU0+LCB0byBpbmNsdWRlCi0gIGFuIGFkZGl0aW9uYWwgbGlicmFyeSByZXF1aXJlZCBieSBhbiBvcHRpb25hbCBtb2R1bGUpIHlvdSBtaWdodCBuZWVkCi0gIHRvIGVkaXQgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zIGluIHRoZQotICA8Q09ERT5Db25maWd1cmF0aW9uPC9DT0RFPiBmaWxlOgotICAgIDxDT0RFPkVYVFJBX0NGTEFHUywgTElCUywgTERGTEFHUywgSU5DTFVERVM8L0NPREU+LgotICA8UD4KLQotICBSdW4gdGhlIDxDT0RFPkNvbmZpZ3VyZTwvQ09ERT4gc2NyaXB0OgotICA8QkxPQ0tRVU9URT4KLSAgIDxQUkU+Ci0gICAgJSBDb25maWd1cmUKLSAgICBVc2luZyAnQ29uZmlndXJhdGlvbicgYXMgY29uZmlnIGZpbGUKLSAgICAgKyBjb25maWd1cmVkIGZvciAmbHQ7d2hhdGV2ZXImZ3Q7IHBsYXRmb3JtCi0gICAgICsgc2V0dGluZyBDIGNvbXBpbGVyIHRvICZsdDt3aGF0ZXZlciZndDsgKgotICAgICArIHNldHRpbmcgQyBjb21waWxlciBvcHRpbWl6YXRpb24tbGV2ZWwgdG8gJmx0O3doYXRldmVyJmd0OyAqCi0gICAgICsgQWRkaW5nIHNlbGVjdGVkIG1vZHVsZXMKLSAgICAgKyBkb2luZyBzYW5pdHkgY2hlY2sgb24gY29tcGlsZXIgYW5kIG9wdGlvbnMKLSAgICBDcmVhdGluZyBNYWtlZmlsZSBpbiBzdXBwb3J0Ci0gICAgQ3JlYXRpbmcgTWFrZWZpbGUgaW4gbWFpbgotICAgIENyZWF0aW5nIE1ha2VmaWxlIGluIG9zL3VuaXgKLSAgICBDcmVhdGluZyBNYWtlZmlsZSBpbiBtb2R1bGVzL3N0YW5kYXJkCi0gICA8L1BSRT4KLSAgPC9CTE9DS1FVT1RFPgotCi0gICgqOiBEZXBlbmRpbmcgb24gQ29uZmlndXJhdGlvbiBhbmQgeW91ciBzeXN0ZW0sIENvbmZpZ3VyZQotICBtaWdodCBub3QgcHJpbnQgdGhlc2UgbGluZXMuIFRoYXQncyBPSykuPFA+Ci0KLSAgVGhpcyBnZW5lcmF0ZXMgYSBNYWtlZmlsZSBmb3IgdXNlIGluIHN0YWdlIDMuIEl0IGFsc28gY3JlYXRlcyBhCi0gIE1ha2VmaWxlIGluIHRoZSBzdXBwb3J0IGRpcmVjdG9yeSwgZm9yIGNvbXBpbGF0aW9uIG9mIHRoZSBvcHRpb25hbAotICBzdXBwb3J0IHByb2dyYW1zLgotICA8UD4KLQotICAoSWYgeW91IHdhbnQgdG8gbWFpbnRhaW4gbXVsdGlwbGUgY29uZmlndXJhdGlvbnMsIHlvdSBjYW4gZ2l2ZSBhCi0gIG9wdGlvbiB0byA8Q09ERT5Db25maWd1cmU8L0NPREU+IHRvIHRlbGwgaXQgdG8gcmVhZCBhbiBhbHRlcm5hdGl2ZQotICBDb25maWd1cmF0aW9uIGZpbGUsIHN1Y2ggYXMgPENPREU+Q29uZmlndXJlIC1maWxlCi0gIENvbmZpZ3VyYXRpb24uYWk8L0NPREU+KS4KLSAgPFA+Ci0KLSA8TEk+Ci0gIFR5cGUgPENPREU+bWFrZTwvQ09ERT4uCi08L09MPgotCi1UaGUgbW9kdWxlcyB3ZSBwbGFjZSBpbiB0aGUgQXBhY2hlIGRpc3RyaWJ1dGlvbiBhcmUgdGhlIG9uZXMgd2UgaGF2ZQotdGVzdGVkIGFuZCBhcmUgdXNlZCByZWd1bGFybHkgYnkgdmFyaW91cyBtZW1iZXJzIG9mIHRoZSBBcGFjaGUKLWRldmVsb3BtZW50IGdyb3VwLiAgQWRkaXRpb25hbCBtb2R1bGVzIGNvbnRyaWJ1dGVkIGJ5IG1lbWJlcnMgb3IgdGhpcmQKLXBhcnRpZXMgd2l0aCBzcGVjaWZpYyBuZWVkcyBvciBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBhdAotJmx0OzxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2NvbnRyaWIvbW9kdWxlcy8iCi0gICAgPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2NvbnRyaWIvbW9kdWxlcy88L0E+Jmd0Oy4KLVRoZXJlIGFyZSBpbnN0cnVjdGlvbnMgb24gdGhhdCBwYWdlIGZvciBsaW5raW5nIHRoZXNlIG1vZHVsZXMgaW50byB0aGUKLWNvcmUgQXBhY2hlIGNvZGUuCi0KLTxIMj48QSBOQU1FPSJpbnN0YWxsIj5JbnN0YWxsaW5nIEFwYWNoZTwvQT48L0gyPgotCi1Zb3Ugd2lsbCBoYXZlIGEgYmluYXJ5IGZpbGUgY2FsbGVkIDxDT0RFPmh0dHBkPC9DT0RFPiBpbiB0aGUKLTxDT0RFPnNyYzwvQ09ERT4gZGlyZWN0b3J5LiAgQSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIEFwYWNoZSB3aWxsCi1zdXBwbHkgdGhpcyBmaWxlLiAgPFA+Ci0KLVRoZSBuZXh0IHN0ZXAgaXMgdG8gaW5zdGFsbCB0aGUgcHJvZ3JhbSBhbmQgY29uZmlndXJlIGl0LiBBcGFjaGUgaXMKLWRlc2lnbmVkIHRvIGJlIGNvbmZpZ3VyZWQgYW5kIHJ1biBmcm9tIHRoZSBzYW1lIHNldCBvZiBkaXJlY3Rvcmllcwotd2hlcmUgaXQgaXMgY29tcGlsZWQuIElmIHlvdSB3YW50IHRvIHJ1biBpdCBmcm9tIHNvbWV3aGVyZSBlbHNlLCBtYWtlCi1hIGRpcmVjdG9yeSBhbmQgY29weSB0aGUgPENPREU+Y29uZjwvQ09ERT4sIDxDT0RFPmxvZ3M8L0NPREU+IGFuZAotPENPREU+aWNvbnM8L0NPREU+IGRpcmVjdG9yaWVzIGludG8gaXQuICBJbiBlaXRoZXIgY2FzZSB5b3Ugc2hvdWxkCi1yZWFkIHRoZSA8QSBIUkVGPSJtaXNjL3NlY3VyaXR5X3RpcHMuaHRtbCNzZXJ2ZXJyb290Ij5zZWN1cml0eSB0aXBzPC9BPgotZGVzY3JpYmluZyBob3cgdG8gc2V0IHRoZSBwZXJtaXNzaW9ucyBvbiB0aGUgc2VydmVyIHJvb3QgZGlyZWN0b3J5LjxQPgotCi1UaGUgbmV4dCBzdGVwIGlzIHRvIGVkaXQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIHRoZSBzZXJ2ZXIuIFRoaXMKLWNvbnNpc3RzIG9mIHNldHRpbmcgdXAgdmFyaW91cyA8U1RST05HPmRpcmVjdGl2ZXM8L1NUUk9ORz4gaW4gdXAgdG8gdGhyZWUKLWNlbnRyYWwgY29uZmlndXJhdGlvbiBmaWxlcy4gQnkgZGVmYXVsdCwgdGhlc2UgZmlsZXMgYXJlIGxvY2F0ZWQgaW4KLXRoZSA8Q09ERT5jb25mPC9DT0RFPiBkaXJlY3RvcnkgYW5kIGFyZSBjYWxsZWQgPENPREU+c3JtLmNvbmY8L0NPREU+LAotPENPREU+YWNjZXNzLmNvbmY8L0NPREU+IGFuZCA8Q09ERT5odHRwZC5jb25mPC9DT0RFPi4gIFRvIGhlbHAgeW91IGdldAotc3RhcnRlZCB0aGVyZSBhcmUgc2FtZSBmaWxlcyBpbiB0aGUgPENPREU+Y29uZjwvQ09ERT4gZGlyZWN0b3J5IG9mIHRoZQotZGlzdHJpYnV0aW9uLCBjYWxsZWQgPENPREU+c3JtLmNvbmYtZGlzdDwvQ09ERT4sCi08Q09ERT5hY2Nlc3MuY29uZi1kaXN0PC9DT0RFPiBhbmQgPENPREU+aHR0cGQuY29uZi1kaXN0PC9DT0RFPi4gQ29weQotb3IgcmVuYW1lIHRoZXNlIGZpbGVzIHRvIHRoZSBuYW1lcyB3aXRob3V0IHRoZSA8Q09ERT4tZGlzdDwvQ09ERT4uCi1UaGVuIGVkaXQgZWFjaCBvZiB0aGUgZmlsZXMuIFJlYWQgdGhlIGNvbW1lbnRzIGluIGVhY2ggZmlsZSBjYXJlZnVsbHkuCi1GYWlsdXJlIHRvIHNldHVwIHRoZXNlIGZpbGVzIGNvcnJlY3RseSBjb3VsZCBsZWFkIHRvIHlvdXIgc2VydmVyIG5vdAotd29ya2luZyBvciBiZWluZyBpbnNlY3VyZS4gWW91IHNob3VsZCBhbHNvIGhhdmUgYW4gYWRkaXRpb25hbCBmaWxlIGluCi10aGUgPENPREU+Y29uZjwvQ09ERT4gZGlyZWN0b3J5IGNhbGxlZCA8Q09ERT5taW1lLnR5cGVzPC9DT0RFPi4gVGhpcwotZmlsZSB1c3VhbGx5IGRvZXMgbm90IG5lZWQgZWRpdGluZy4KLQotPFA+Ci0KLUZpcnN0IGVkaXQgPENPREU+aHR0cGQuY29uZjwvQ09ERT4uICBUaGlzIHNldHMgdXAgZ2VuZXJhbCBhdHRyaWJ1dGVzCi1hYm91dCB0aGUgc2VydmVyOiB0aGUgcG9ydCBudW1iZXIsIHRoZSB1c2VyIGl0IHJ1bnMgYXMsIDxFTT5ldGMuPC9FTT4gIE5leHQKLWVkaXQgdGhlIDxDT0RFPnNybS5jb25mPC9DT0RFPiBmaWxlOyB0aGlzIHNldHMgdXAgdGhlIHJvb3Qgb2YgdGhlCi1kb2N1bWVudCB0cmVlLCBzcGVjaWFsIGZ1bmN0aW9ucyBsaWtlIHNlcnZlci1wYXJzZWQgSFRNTCBvciBpbnRlcm5hbAotaW1hZ2VtYXAgcGFyc2luZywgPEVNPmV0Yy48L0VNPiAgRmluYWxseSwgZWRpdCB0aGUgPENPREU+YWNjZXNzLmNvbmY8L0NPREU+Ci1maWxlIHRvIGF0IGxlYXN0IHNldCB0aGUgYmFzZSBjYXNlcyBvZiBhY2Nlc3MuCi0KLTxQPgotCi1JbiBhZGRpdGlvbiB0byB0aGVzZSB0aHJlZSBmaWxlcywgdGhlIHNlcnZlciBiZWhhdmlvciBjYW4gYmUgY29uZmlndXJlZAotb24gYSBkaXJlY3RvcnktYnktZGlyZWN0b3J5IGJhc2lzIGJ5IHVzaW5nIDxDT0RFPi5odGFjY2VzczwvQ09ERT4KLWZpbGVzIGluIGRpcmVjdG9yaWVzIGFjY2Vzc2VkIGJ5IHRoZSBzZXJ2ZXIuCi0KLTxIMz5TZXQgeW91ciBzeXN0ZW0gdGltZSBwcm9wZXJseSE8L0gzPgotCi1Qcm9wZXIgb3BlcmF0aW9uIG9mIGEgcHVibGljIHdlYiBzZXJ2ZXIgcmVxdWlyZXMgYWNjdXJhdGUgdGltZQota2VlcGluZywgc2luY2UgZWxlbWVudHMgb2YgdGhlIEhUVFAgcHJvdG9jb2wgYXJlIGV4cHJlc3NlZCBhcyB0aGUgdGltZQotb2YgZGF5LiAgU28sIGl0J3MgdGltZSB0byBpbnZlc3RpZ2F0ZSBzZXR0aW5nIHVwIE5UUCBvciBzb21lIG90aGVyCi10aW1lIHN5bmNocm9uaXphdGlvbiBzeXN0ZW0gb24geW91ciBVbml4IGJveCwgb3Igd2hhdGV2ZXIgdGhlCi1lcXVpdmFsZW50IG9uIE5UIHdvdWxkIGJlLgotCi08SDM+U3RhcnRpbmcgYW5kIFN0b3BwaW5nIHRoZSBTZXJ2ZXI8L0gzPgotCi1UbyBzdGFydCB0aGUgc2VydmVyLCBzaW1wbHkgcnVuIDxDT0RFPmh0dHBkPC9DT0RFPi4gVGhpcyB3aWxsIGxvb2sgZm9yCi08Q09ERT5odHRwZC5jb25mPC9DT0RFPiBpbiB0aGUgbG9jYXRpb24gY29tcGlsZWQgaW50byB0aGUgY29kZSAoYnkKLWRlZmF1bHQgPENPREU+L3Vzci9sb2NhbC9hcGFjaGUvY29uZi9odHRwZC5jb25mPC9DT0RFPikuIElmCi10aGlzIGZpbGUgaXMgc29tZXdoZXJlIGVsc2UsIHlvdSBjYW4gZ2l2ZSB0aGUgcmVhbAotbG9jYXRpb24gd2l0aCB0aGUgLWYgYXJndW1lbnQuIEZvciBleGFtcGxlOgotCi08UFJFPgotICAgIC91c3IvbG9jYWwvYXBhY2hlL2h0dHBkIC1mIC91c3IvbG9jYWwvYXBhY2hlL2NvbmYvaHR0cGQuY29uZgotPC9QUkU+Ci0KLUlmIGFsbCBnb2VzIHdlbGwgdGhpcyB3aWxsIHJldHVybiB0byB0aGUgY29tbWFuZCBwcm9tcHQgYWxtb3N0Ci1pbW1lZGlhdGVseS4gIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHNlcnZlciBpcyBub3cgdXAgYW5kIHJ1bm5pbmcuIElmCi1hbnl0aGluZyBnb2VzIHdyb25nIGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHNlcnZlciB5b3Ugd2lsbAotc2VlIGFuIGVycm9yIG1lc3NhZ2Ugb24gdGhlIHNjcmVlbi4KLQotSWYgdGhlIHNlcnZlciBzdGFydGVkIG9rLCB5b3UgY2FuIG5vdyB1c2UgeW91ciBicm93c2VyIHRvCi1jb25uZWN0IHRvIHRoZSBzZXJ2ZXIgYW5kIHJlYWQgdGhlIGRvY3VtZW50YXRpb24uIElmIHlvdSBhcmUgcnVubmluZwotdGhlIGJyb3dzZXIgb24gdGhlIHNhbWUgbWFjaGluZSBhcyB0aGUgc2VydmVyIGFuZCB1c2luZyB0aGUgZGVmYXVsdAotcG9ydCBvZiA4MCwgYSBzdWl0YWJsZSBVUkwgdG8gZW50ZXIgaW50byB5b3VyIGJyb3dzZXIgaXMKLQotPFBSRT4KLSAgICBodHRwOi8vbG9jYWxob3N0LwotPC9QUkU+Ci0KLTxQPgotCi1Ob3RlIHRoYXQgd2hlbiB0aGUgc2VydmVyIHN0YXJ0cyBpdCB3aWxsIGNyZWF0ZSBhIG51bWJlciBvZgotPEVNPmNoaWxkPC9FTT4gcHJvY2Vzc2VzIHRvIGhhbmRsZSB0aGUgcmVxdWVzdHMuIElmIHlvdSBzdGFydGVkIEFwYWNoZQotYXMgdGhlIHJvb3QgdXNlciwgdGhlIHBhcmVudCBwcm9jZXNzIHdpbGwgY29udGludWUgdG8gcnVuIGFzIHJvb3QKLXdoaWxlIHRoZSBjaGlsZHJlbiB3aWxsIGNoYW5nZSB0byB0aGUgdXNlciBhcyBnaXZlbiBpbiB0aGUgaHR0cGQuY29uZgotZmlsZS4KLQotPFA+Ci0KLUlmIHdoZW4geW91IHJ1biA8Q09ERT5odHRwZDwvQ09ERT4gaXQgY29tcGxhaW5lZCBhYm91dCBiZWluZyB1bmFibGUgdG8KLSJiaW5kIiB0byBhbiBhZGRyZXNzLCB0aGVuIGVpdGhlciBzb21lIG90aGVyIHByb2Nlc3MgaXMgYWxyZWFkeSB1c2luZwotdGhlIHBvcnQgeW91IGhhdmUgY29uZmlndXJlZCBBcGFjaGUgdG8gdXNlLCBvciB5b3UgYXJlIHJ1bm5pbmcgaHR0cGQKLWFzIGEgbm9ybWFsIHVzZXIgYnV0IHRyeWluZyB0byB1c2UgYSBwb3J0IGJlbG93IDEwMjQgKHN1Y2ggYXMgdGhlCi1kZWZhdWx0IHBvcnQgODApLgotCi08UD4KLQotSWYgdGhlIHNlcnZlciBpcyBub3QgcnVubmluZywgcmVhZCB0aGUgZXJyb3IgbWVzc2FnZSBkaXNwbGF5ZWQKLXdoZW4geW91IHJ1biBodHRwZC4gWW91IHNob3VsZCBhbHNvIGNoZWNrIHRoZSBzZXJ2ZXIKLWVycm9yX2xvZyBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAod2l0aCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLAotdGhpcyB3aWxsIGJlIGxvY2F0ZWQgaW4gdGhlIGZpbGUgPENPREU+ZXJyb3JfbG9nPC9DT0RFPiBpbiB0aGUKLTxDT0RFPmxvZ3M8L0NPREU+IGRpcmVjdG9yeSkuCi0KLTxQPgotCi1JZiB5b3Ugd2FudCB5b3VyIHNlcnZlciB0byBjb250aW51ZSBydW5uaW5nIGFmdGVyIGEgc3lzdGVtIHJlYm9vdCwgeW91Ci1zaG91bGQgYWRkIGEgY2FsbCB0byA8Q09ERT5odHRwZDwvQ09ERT4gdG8geW91ciBzeXN0ZW0gc3RhcnR1cCBmaWxlcwotKHR5cGljYWxseSA8Q09ERT5yYy5sb2NhbDwvQ09ERT4gb3IgYSBmaWxlIGluIGFuCi08Q09ERT5yYy48RU0+TjwvRU0+PC9DT0RFPiBkaXJlY3RvcnkpLiBUaGlzIHdpbGwgc3RhcnQgQXBhY2hlIGFzIHJvb3QuCi1CZWZvcmUgZG9pbmcgdGhpcyBlbnN1cmUgdGhhdCB5b3VyIHNlcnZlciBpcyBwcm9wZXJseSBjb25maWd1cmVkCi1mb3Igc2VjdXJpdHkgYW5kIGFjY2VzcyByZXN0cmljdGlvbnMuCi0KLTxQPgotCi1UbyBzdG9wIEFwYWNoZSBzZW5kIHRoZSBwYXJlbnQgcHJvY2VzcyBhIFRFUk0gc2lnbmFsLiBUaGUgUElEIG9mIHRoaXMKLXByb2Nlc3MgaXMgd3JpdHRlbiB0byB0aGUgZmlsZSA8Q09ERT5odHRwZC5waWQ8L0NPREU+IGluIHRoZQotPENPREU+bG9nczwvQ09ERT4gZGlyZWN0b3J5ICh1bmxlc3MgY29uZmlndXJlZCBvdGhlcndpc2UpLiAgRG8gbm90Ci1hdHRlbXB0IHRvIGtpbGwgdGhlIGNoaWxkIHByb2Nlc3NlcyBiZWNhdXNlIHRoZXkgd2lsbCBiZSByZW5ld2VkIGJ5Ci10aGUgcGFyZW50LiAgQSB0eXBpY2FsIGNvbW1hbmQgdG8gc3RvcCB0aGUgc2VydmVyIGlzOgotCi08UFJFPgotICAgIGtpbGwgLVRFUk0gYGNhdCAvdXNyL2xvY2FsL2FwYWNoZS9sb2dzL2h0dHBkLnBpZGAKLTwvUFJFPgotCi08UD4KLQotRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgQXBhY2hlIGNvbW1hbmQgbGluZSBvcHRpb25zLCBjb25maWd1cmF0aW9uCi1hbmQgbG9nIGZpbGVzLCBzZWUgPEEgSFJFRj0iaW52b2tpbmcuaHRtbCI+U3RhcnRpbmcgQXBhY2hlPC9BPi4gRm9yIGEKLXJlZmVyZW5jZSBndWlkZSB0byBhbGwgQXBhY2hlIGRpcmVjdGl2ZXMgc3VwcG9ydGVkIGJ5IHRoZSBkaXN0cmlidXRlZAotbW9kdWxlcywgc2VlIHRoZSA8QSBIUkVGPSJtb2QvZGlyZWN0aXZlcy5odG1sIj5BcGFjaGUgZGlyZWN0aXZlczwvQT4uCi0KLTxIMj5Db21waWxpbmcgU3VwcG9ydCBQcm9ncmFtczwvSDI+Ci0KLUluIGFkZGl0aW9uIHRvIHRoZSBtYWluIDxDT0RFPmh0dHBkPC9DT0RFPiBzZXJ2ZXIgd2hpY2ggaXMgY29tcGlsZWQKLWFuZCBjb25maWd1cmVkIGFzIGFib3ZlLCBBcGFjaGUgaW5jbHVkZXMgYSBudW1iZXIgb2Ygc3VwcG9ydCBwcm9ncmFtcy4KLVRoZXNlIGFyZSBub3QgY29tcGlsZWQgYnkgZGVmYXVsdC4gVGhlIHN1cHBvcnQgcHJvZ3JhbXMgYXJlIGluIHRoZQotPENPREU+c3VwcG9ydDwvQ09ERT4gZGlyZWN0b3J5IG9mIHRoZSBkaXN0cmlidXRpb24uIFRvIGNvbXBpbGUKLXRoZSBzdXBwb3J0IHByb2dyYW1zLCBjaGFuZ2UgaW50byB0aGlzIGRpcmVjdG9yeSBhbmQgdHlwZQotPFBSRT4KLSAgICBtYWtlCi08L1BSRT4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2luc3RhbGwuaHRtbC5lbiBiL2RvY3MvbWFudWFsL2luc3RhbGwuaHRtbC5lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhmNTA0Ny4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9pbnN0YWxsLmh0bWwuZW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5Db21waWxpbmcgYW5kIEluc3RhbGxpbmcgQXBhY2hlPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0KLTxIMSBBTElHTj0iQ0VOVEVSIj5Db21waWxpbmcgYW5kIEluc3RhbGxpbmcgQXBhY2hlIDEuMzwvSDE+Ci0KLVRoaXMgZG9jdW1lbnQgY292ZXJzIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgQXBhY2hlIG9uIFVuaXgKLXN5c3RlbXMgb25seS4gRm9yIGNvbXBpbGluZyBhbmQgaW5zdGFsbGF0aW9uIG9uIFdpbmRvd3MsIHNlZSA8QQotSFJFRj0id2luZG93cy5odG1sIj5Vc2luZyBBcGFjaGUgd2l0aCBNaWNyb3NvZnQgV2luZG93czwvQT4gYW5kIGZvcgotVFBGIHNlZSA8QSBIUkVGPSJpbnN0YWxsLXRwZi5odG1sIj5JbnN0YWxsaW5nIHRoZSBBcGFjaGUgMS4zIEhUVFAKLVNlcnZlciBvbiBUUEY8L0E+LgotCi08UD4KLQotVW5peFdhcmUgdXNlcnMgd2lsbCB3YW50IHRvIGNvbnN1bHQgPEEgSFJFRj0idW5peHdhcmUuaHRtbCI+YnVpbGQgbm90ZXM8L0E+Ci1mb3IgdmFyaW91cyBVbml4V2FyZSB2ZXJzaW9ucyBiZWZvcmUgY29tcGlsaW5nLgotCi08SDI+RG93bmxvYWRpbmcgQXBhY2hlPC9IMj4KLQotSW5mb3JtYXRpb24gb24gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIEFwYWNoZSBjYW4gYmUgZm91bmQgb24gdGhlIEFwYWNoZQotd2ViIHNlcnZlciBhdCA8QQotSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvQT4uICBUaGlzIHdpbGwKLWxpc3QgdGhlIGN1cnJlbnQgcmVsZWFzZSwgYW55IG1vcmUgcmVjZW50IGJldGEtdGVzdCByZWxlYXNlLCB0b2dldGhlcgotd2l0aCBkZXRhaWxzIG9mIG1pcnJvciB3ZWIgYW5kIGFub255bW91cyBmdHAgc2l0ZXMuCi0KLTxQPgotCi1JZiB5b3UgZG93bmxvYWRlZCBhIGJpbmFyeSBkaXN0cmlidXRpb24sIHNraXAgdG8gPEEKLUhSRUY9IiNpbnN0YWxsIj5JbnN0YWxsaW5nIEFwYWNoZTwvQT4uIE90aGVyd2lzZSByZWFkIHRoZSBuZXh0IHNlY3Rpb24KLWZvciBob3cgdG8gY29tcGlsZSB0aGUgc2VydmVyLgotCi08SDI+Q29tcGlsaW5nIEFwYWNoZTwvSDI+Ci0KLUNvbXBpbGluZyBBcGFjaGUgY29uc2lzdHMgb2YgdGhyZWUgc3RlcHM6IEZpcnN0bHkgc2VsZWN0IHdoaWNoIEFwYWNoZQotPFNUUk9ORz5tb2R1bGVzPC9TVFJPTkc+IHlvdSB3YW50IHRvIGluY2x1ZGUgaW50byB0aGUgc2VydmVyLiBTZWNvbmRseSBjcmVhdGUgYQotY29uZmlndXJhdGlvbiBmb3IgeW91ciBvcGVyYXRpbmcgc3lzdGVtLiBUaGlyZGx5IGNvbXBpbGUgdGhlCi1leGVjdXRhYmxlLgotPFA+Ci0KLUFsbCBjb25maWd1cmF0aW9uIG9mIEFwYWNoZSBpcyBwZXJmb3JtZWQgaW4gdGhlIDxDT0RFPnNyYzwvQ09ERT4KLWRpcmVjdG9yeSBvZiB0aGUgQXBhY2hlIGRpc3RyaWJ1dGlvbi4gQ2hhbmdlIGludG8gdGhpcyBkaXJlY3RvcnkuCi0KLTxPTD4KLSA8TEk+Ci0gIFNlbGVjdCBtb2R1bGVzIHRvIGNvbXBpbGUgaW50byBBcGFjaGUgaW4gdGhlCi0gIDxDT0RFPkNvbmZpZ3VyYXRpb248L0NPREU+IGZpbGUuIFVuY29tbWVudCBsaW5lcyBjb3JyZXNwb25kaW5nIHRvCi0gIHRob3NlIG9wdGlvbmFsIG1vZHVsZXMgeW91IHdpc2ggdG8gaW5jbHVkZSAoYW1vbmcgdGhlIEFkZE1vZHVsZSBsaW5lcwotICBhdCB0aGUgYm90dG9tIG9mIHRoZSBmaWxlKSwgb3IgYWRkIG5ldyBsaW5lcyBjb3JyZXNwb25kaW5nIHRvCi0gIGFkZGl0aW9uYWwgbW9kdWxlcyB5b3UgaGF2ZSBkb3dubG9hZGVkIG9yIHdyaXR0ZW4uIChTZWUgPEEKLSAgSFJFRj0ibWlzYy9BUEkuaHRtbCI+QVBJLmh0bWw8L0E+IGZvciBwcmVsaW1pbmFyeSBkb2NzIG9uIGhvdyB0bwotICB3cml0ZSBBcGFjaGUgbW9kdWxlcykuICBBZHZhbmNlZCB1c2VycyBjYW4gY29tbWVudCBvdXQgc29tZSBvZiB0aGUKLSAgZGVmYXVsdCBtb2R1bGVzIGlmIHRoZXkgYXJlIHN1cmUgdGhleSB3aWxsIG5vdCBuZWVkIHRoZW0gKGJlIGNhcmVmdWwKLSAgdGhvdWdoLCBzaW5jZSBtYW55IG9mIHRoZSBkZWZhdWx0IG1vZHVsZXMgYXJlIHZpdGFsIGZvciB0aGUgY29ycmVjdAotICBvcGVyYXRpb24gYW5kIHNlY3VyaXR5IG9mIHRoZSBzZXJ2ZXIpLgotICA8UD4KLQotICBZb3Ugc2hvdWxkIGFsc28gcmVhZCB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSA8Q09ERT5Db25maWd1cmF0aW9uPC9DT0RFPgotICBmaWxlIHRvIHNlZSBpZiB5b3UgbmVlZCB0byBzZXQgYW55IG9mIHRoZSA8Q09ERT5SdWxlPC9DT0RFPiBsaW5lcy4KLQotCi0gPExJPgotICBDb25maWd1cmUgQXBhY2hlIGZvciB5b3VyIG9wZXJhdGluZyBzeXN0ZW0uIE5vcm1hbGx5IHlvdSBjYW4ganVzdAotICB0eXBlIHJ1biB0aGUgPENPREU+Q29uZmlndXJlPC9DT0RFPiBzY3JpcHQgYXMgZ2l2ZW4gYmVsb3cuIEhvd2V2ZXIKLSAgaWYgdGhpcyBmYWlscyBvciB5b3UgaGF2ZSBhbnkgc3BlY2lhbCByZXF1aXJlbWVudHMgKDxFTT5lLmcuPC9FTT4sIHRvIGluY2x1ZGUKLSAgYW4gYWRkaXRpb25hbCBsaWJyYXJ5IHJlcXVpcmVkIGJ5IGFuIG9wdGlvbmFsIG1vZHVsZSkgeW91IG1pZ2h0IG5lZWQKLSAgdG8gZWRpdCBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnMgaW4gdGhlCi0gIDxDT0RFPkNvbmZpZ3VyYXRpb248L0NPREU+IGZpbGU6Ci0gICAgPENPREU+RVhUUkFfQ0ZMQUdTLCBMSUJTLCBMREZMQUdTLCBJTkNMVURFUzwvQ09ERT4uCi0gIDxQPgotCi0gIFJ1biB0aGUgPENPREU+Q29uZmlndXJlPC9DT0RFPiBzY3JpcHQ6Ci0gIDxCTE9DS1FVT1RFPgotICAgPFBSRT4KLSAgICAlIENvbmZpZ3VyZQotICAgIFVzaW5nICdDb25maWd1cmF0aW9uJyBhcyBjb25maWcgZmlsZQotICAgICArIGNvbmZpZ3VyZWQgZm9yICZsdDt3aGF0ZXZlciZndDsgcGxhdGZvcm0KLSAgICAgKyBzZXR0aW5nIEMgY29tcGlsZXIgdG8gJmx0O3doYXRldmVyJmd0OyAqCi0gICAgICsgc2V0dGluZyBDIGNvbXBpbGVyIG9wdGltaXphdGlvbi1sZXZlbCB0byAmbHQ7d2hhdGV2ZXImZ3Q7ICoKLSAgICAgKyBBZGRpbmcgc2VsZWN0ZWQgbW9kdWxlcwotICAgICArIGRvaW5nIHNhbml0eSBjaGVjayBvbiBjb21waWxlciBhbmQgb3B0aW9ucwotICAgIENyZWF0aW5nIE1ha2VmaWxlIGluIHN1cHBvcnQKLSAgICBDcmVhdGluZyBNYWtlZmlsZSBpbiBtYWluCi0gICAgQ3JlYXRpbmcgTWFrZWZpbGUgaW4gb3MvdW5peAotICAgIENyZWF0aW5nIE1ha2VmaWxlIGluIG1vZHVsZXMvc3RhbmRhcmQKLSAgIDwvUFJFPgotICA8L0JMT0NLUVVPVEU+Ci0KLSAgKCo6IERlcGVuZGluZyBvbiBDb25maWd1cmF0aW9uIGFuZCB5b3VyIHN5c3RlbSwgQ29uZmlndXJlCi0gIG1pZ2h0IG5vdCBwcmludCB0aGVzZSBsaW5lcy4gVGhhdCdzIE9LKS48UD4KLQotICBUaGlzIGdlbmVyYXRlcyBhIE1ha2VmaWxlIGZvciB1c2UgaW4gc3RhZ2UgMy4gSXQgYWxzbyBjcmVhdGVzIGEKLSAgTWFrZWZpbGUgaW4gdGhlIHN1cHBvcnQgZGlyZWN0b3J5LCBmb3IgY29tcGlsYXRpb24gb2YgdGhlIG9wdGlvbmFsCi0gIHN1cHBvcnQgcHJvZ3JhbXMuCi0gIDxQPgotCi0gIChJZiB5b3Ugd2FudCB0byBtYWludGFpbiBtdWx0aXBsZSBjb25maWd1cmF0aW9ucywgeW91IGNhbiBnaXZlIGEKLSAgb3B0aW9uIHRvIDxDT0RFPkNvbmZpZ3VyZTwvQ09ERT4gdG8gdGVsbCBpdCB0byByZWFkIGFuIGFsdGVybmF0aXZlCi0gIENvbmZpZ3VyYXRpb24gZmlsZSwgc3VjaCBhcyA8Q09ERT5Db25maWd1cmUgLWZpbGUKLSAgQ29uZmlndXJhdGlvbi5haTwvQ09ERT4pLgotICA8UD4KLQotIDxMST4KLSAgVHlwZSA8Q09ERT5tYWtlPC9DT0RFPi4KLTwvT0w+Ci0KLVRoZSBtb2R1bGVzIHdlIHBsYWNlIGluIHRoZSBBcGFjaGUgZGlzdHJpYnV0aW9uIGFyZSB0aGUgb25lcyB3ZSBoYXZlCi10ZXN0ZWQgYW5kIGFyZSB1c2VkIHJlZ3VsYXJseSBieSB2YXJpb3VzIG1lbWJlcnMgb2YgdGhlIEFwYWNoZQotZGV2ZWxvcG1lbnQgZ3JvdXAuICBBZGRpdGlvbmFsIG1vZHVsZXMgY29udHJpYnV0ZWQgYnkgbWVtYmVycyBvciB0aGlyZAotcGFydGllcyB3aXRoIHNwZWNpZmljIG5lZWRzIG9yIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIGF0Ci0mbHQ7PEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvY29udHJpYi9tb2R1bGVzLyIKLSAgICA+aHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvY29udHJpYi9tb2R1bGVzLzwvQT4mZ3Q7LgotVGhlcmUgYXJlIGluc3RydWN0aW9ucyBvbiB0aGF0IHBhZ2UgZm9yIGxpbmtpbmcgdGhlc2UgbW9kdWxlcyBpbnRvIHRoZQotY29yZSBBcGFjaGUgY29kZS4KLQotPEgyPjxBIE5BTUU9Imluc3RhbGwiPkluc3RhbGxpbmcgQXBhY2hlPC9BPjwvSDI+Ci0KLVlvdSB3aWxsIGhhdmUgYSBiaW5hcnkgZmlsZSBjYWxsZWQgPENPREU+aHR0cGQ8L0NPREU+IGluIHRoZQotPENPREU+c3JjPC9DT0RFPiBkaXJlY3RvcnkuICBBIGJpbmFyeSBkaXN0cmlidXRpb24gb2YgQXBhY2hlIHdpbGwKLXN1cHBseSB0aGlzIGZpbGUuICA8UD4KLQotVGhlIG5leHQgc3RlcCBpcyB0byBpbnN0YWxsIHRoZSBwcm9ncmFtIGFuZCBjb25maWd1cmUgaXQuIEFwYWNoZSBpcwotZGVzaWduZWQgdG8gYmUgY29uZmlndXJlZCBhbmQgcnVuIGZyb20gdGhlIHNhbWUgc2V0IG9mIGRpcmVjdG9yaWVzCi13aGVyZSBpdCBpcyBjb21waWxlZC4gSWYgeW91IHdhbnQgdG8gcnVuIGl0IGZyb20gc29tZXdoZXJlIGVsc2UsIG1ha2UKLWEgZGlyZWN0b3J5IGFuZCBjb3B5IHRoZSA8Q09ERT5jb25mPC9DT0RFPiwgPENPREU+bG9nczwvQ09ERT4gYW5kCi08Q09ERT5pY29uczwvQ09ERT4gZGlyZWN0b3JpZXMgaW50byBpdC4gIEluIGVpdGhlciBjYXNlIHlvdSBzaG91bGQKLXJlYWQgdGhlIDxBIEhSRUY9Im1pc2Mvc2VjdXJpdHlfdGlwcy5odG1sI3NlcnZlcnJvb3QiPnNlY3VyaXR5IHRpcHM8L0E+Ci1kZXNjcmliaW5nIGhvdyB0byBzZXQgdGhlIHBlcm1pc3Npb25zIG9uIHRoZSBzZXJ2ZXIgcm9vdCBkaXJlY3RvcnkuPFA+Ci0KLVRoZSBuZXh0IHN0ZXAgaXMgdG8gZWRpdCB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBmb3IgdGhlIHNlcnZlci4gVGhpcwotY29uc2lzdHMgb2Ygc2V0dGluZyB1cCB2YXJpb3VzIDxTVFJPTkc+ZGlyZWN0aXZlczwvU1RST05HPiBpbiB1cCB0byB0aHJlZQotY2VudHJhbCBjb25maWd1cmF0aW9uIGZpbGVzLiBCeSBkZWZhdWx0LCB0aGVzZSBmaWxlcyBhcmUgbG9jYXRlZCBpbgotdGhlIDxDT0RFPmNvbmY8L0NPREU+IGRpcmVjdG9yeSBhbmQgYXJlIGNhbGxlZCA8Q09ERT5zcm0uY29uZjwvQ09ERT4sCi08Q09ERT5hY2Nlc3MuY29uZjwvQ09ERT4gYW5kIDxDT0RFPmh0dHBkLmNvbmY8L0NPREU+LiAgVG8gaGVscCB5b3UgZ2V0Ci1zdGFydGVkIHRoZXJlIGFyZSBzYW1lIGZpbGVzIGluIHRoZSA8Q09ERT5jb25mPC9DT0RFPiBkaXJlY3Rvcnkgb2YgdGhlCi1kaXN0cmlidXRpb24sIGNhbGxlZCA8Q09ERT5zcm0uY29uZi1kaXN0PC9DT0RFPiwKLTxDT0RFPmFjY2Vzcy5jb25mLWRpc3Q8L0NPREU+IGFuZCA8Q09ERT5odHRwZC5jb25mLWRpc3Q8L0NPREU+LiBDb3B5Ci1vciByZW5hbWUgdGhlc2UgZmlsZXMgdG8gdGhlIG5hbWVzIHdpdGhvdXQgdGhlIDxDT0RFPi1kaXN0PC9DT0RFPi4KLVRoZW4gZWRpdCBlYWNoIG9mIHRoZSBmaWxlcy4gUmVhZCB0aGUgY29tbWVudHMgaW4gZWFjaCBmaWxlIGNhcmVmdWxseS4KLUZhaWx1cmUgdG8gc2V0dXAgdGhlc2UgZmlsZXMgY29ycmVjdGx5IGNvdWxkIGxlYWQgdG8geW91ciBzZXJ2ZXIgbm90Ci13b3JraW5nIG9yIGJlaW5nIGluc2VjdXJlLiBZb3Ugc2hvdWxkIGFsc28gaGF2ZSBhbiBhZGRpdGlvbmFsIGZpbGUgaW4KLXRoZSA8Q09ERT5jb25mPC9DT0RFPiBkaXJlY3RvcnkgY2FsbGVkIDxDT0RFPm1pbWUudHlwZXM8L0NPREU+LiBUaGlzCi1maWxlIHVzdWFsbHkgZG9lcyBub3QgbmVlZCBlZGl0aW5nLgotCi08UD4KLQotRmlyc3QgZWRpdCA8Q09ERT5odHRwZC5jb25mPC9DT0RFPi4gIFRoaXMgc2V0cyB1cCBnZW5lcmFsIGF0dHJpYnV0ZXMKLWFib3V0IHRoZSBzZXJ2ZXI6IHRoZSBwb3J0IG51bWJlciwgdGhlIHVzZXIgaXQgcnVucyBhcywgPEVNPmV0Yy48L0VNPiAgTmV4dAotZWRpdCB0aGUgPENPREU+c3JtLmNvbmY8L0NPREU+IGZpbGU7IHRoaXMgc2V0cyB1cCB0aGUgcm9vdCBvZiB0aGUKLWRvY3VtZW50IHRyZWUsIHNwZWNpYWwgZnVuY3Rpb25zIGxpa2Ugc2VydmVyLXBhcnNlZCBIVE1MIG9yIGludGVybmFsCi1pbWFnZW1hcCBwYXJzaW5nLCA8RU0+ZXRjLjwvRU0+ICBGaW5hbGx5LCBlZGl0IHRoZSA8Q09ERT5hY2Nlc3MuY29uZjwvQ09ERT4KLWZpbGUgdG8gYXQgbGVhc3Qgc2V0IHRoZSBiYXNlIGNhc2VzIG9mIGFjY2Vzcy4KLQotPFA+Ci0KLUluIGFkZGl0aW9uIHRvIHRoZXNlIHRocmVlIGZpbGVzLCB0aGUgc2VydmVyIGJlaGF2aW9yIGNhbiBiZSBjb25maWd1cmVkCi1vbiBhIGRpcmVjdG9yeS1ieS1kaXJlY3RvcnkgYmFzaXMgYnkgdXNpbmcgPENPREU+Lmh0YWNjZXNzPC9DT0RFPgotZmlsZXMgaW4gZGlyZWN0b3JpZXMgYWNjZXNzZWQgYnkgdGhlIHNlcnZlci4KLQotPEgzPlNldCB5b3VyIHN5c3RlbSB0aW1lIHByb3Blcmx5ITwvSDM+Ci0KLVByb3BlciBvcGVyYXRpb24gb2YgYSBwdWJsaWMgd2ViIHNlcnZlciByZXF1aXJlcyBhY2N1cmF0ZSB0aW1lCi1rZWVwaW5nLCBzaW5jZSBlbGVtZW50cyBvZiB0aGUgSFRUUCBwcm90b2NvbCBhcmUgZXhwcmVzc2VkIGFzIHRoZSB0aW1lCi1vZiBkYXkuICBTbywgaXQncyB0aW1lIHRvIGludmVzdGlnYXRlIHNldHRpbmcgdXAgTlRQIG9yIHNvbWUgb3RoZXIKLXRpbWUgc3luY2hyb25pemF0aW9uIHN5c3RlbSBvbiB5b3VyIFVuaXggYm94LCBvciB3aGF0ZXZlciB0aGUKLWVxdWl2YWxlbnQgb24gTlQgd291bGQgYmUuCi0KLTxIMz5TdGFydGluZyBhbmQgU3RvcHBpbmcgdGhlIFNlcnZlcjwvSDM+Ci0KLVRvIHN0YXJ0IHRoZSBzZXJ2ZXIsIHNpbXBseSBydW4gPENPREU+aHR0cGQ8L0NPREU+LiBUaGlzIHdpbGwgbG9vayBmb3IKLTxDT0RFPmh0dHBkLmNvbmY8L0NPREU+IGluIHRoZSBsb2NhdGlvbiBjb21waWxlZCBpbnRvIHRoZSBjb2RlIChieQotZGVmYXVsdCA8Q09ERT4vdXNyL2xvY2FsL2FwYWNoZS9jb25mL2h0dHBkLmNvbmY8L0NPREU+KS4gSWYKLXRoaXMgZmlsZSBpcyBzb21ld2hlcmUgZWxzZSwgeW91IGNhbiBnaXZlIHRoZSByZWFsCi1sb2NhdGlvbiB3aXRoIHRoZSAtZiBhcmd1bWVudC4gRm9yIGV4YW1wbGU6Ci0KLTxQUkU+Ci0gICAgL3Vzci9sb2NhbC9hcGFjaGUvaHR0cGQgLWYgL3Vzci9sb2NhbC9hcGFjaGUvY29uZi9odHRwZC5jb25mCi08L1BSRT4KLQotSWYgYWxsIGdvZXMgd2VsbCB0aGlzIHdpbGwgcmV0dXJuIHRvIHRoZSBjb21tYW5kIHByb21wdCBhbG1vc3QKLWltbWVkaWF0ZWx5LiAgVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgc2VydmVyIGlzIG5vdyB1cCBhbmQgcnVubmluZy4gSWYKLWFueXRoaW5nIGdvZXMgd3JvbmcgZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgc2VydmVyIHlvdSB3aWxsCi1zZWUgYW4gZXJyb3IgbWVzc2FnZSBvbiB0aGUgc2NyZWVuLgotCi1JZiB0aGUgc2VydmVyIHN0YXJ0ZWQgb2ssIHlvdSBjYW4gbm93IHVzZSB5b3VyIGJyb3dzZXIgdG8KLWNvbm5lY3QgdG8gdGhlIHNlcnZlciBhbmQgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgeW91IGFyZSBydW5uaW5nCi10aGUgYnJvd3NlciBvbiB0aGUgc2FtZSBtYWNoaW5lIGFzIHRoZSBzZXJ2ZXIgYW5kIHVzaW5nIHRoZSBkZWZhdWx0Ci1wb3J0IG9mIDgwLCBhIHN1aXRhYmxlIFVSTCB0byBlbnRlciBpbnRvIHlvdXIgYnJvd3NlciBpcwotCi08UFJFPgotICAgIGh0dHA6Ly9sb2NhbGhvc3QvCi08L1BSRT4KLQotPFA+Ci0KLU5vdGUgdGhhdCB3aGVuIHRoZSBzZXJ2ZXIgc3RhcnRzIGl0IHdpbGwgY3JlYXRlIGEgbnVtYmVyIG9mCi08RU0+Y2hpbGQ8L0VNPiBwcm9jZXNzZXMgdG8gaGFuZGxlIHRoZSByZXF1ZXN0cy4gSWYgeW91IHN0YXJ0ZWQgQXBhY2hlCi1hcyB0aGUgcm9vdCB1c2VyLCB0aGUgcGFyZW50IHByb2Nlc3Mgd2lsbCBjb250aW51ZSB0byBydW4gYXMgcm9vdAotd2hpbGUgdGhlIGNoaWxkcmVuIHdpbGwgY2hhbmdlIHRvIHRoZSB1c2VyIGFzIGdpdmVuIGluIHRoZSBodHRwZC5jb25mCi1maWxlLgotCi08UD4KLQotSWYgd2hlbiB5b3UgcnVuIDxDT0RFPmh0dHBkPC9DT0RFPiBpdCBjb21wbGFpbmVkIGFib3V0IGJlaW5nIHVuYWJsZSB0bwotImJpbmQiIHRvIGFuIGFkZHJlc3MsIHRoZW4gZWl0aGVyIHNvbWUgb3RoZXIgcHJvY2VzcyBpcyBhbHJlYWR5IHVzaW5nCi10aGUgcG9ydCB5b3UgaGF2ZSBjb25maWd1cmVkIEFwYWNoZSB0byB1c2UsIG9yIHlvdSBhcmUgcnVubmluZyBodHRwZAotYXMgYSBub3JtYWwgdXNlciBidXQgdHJ5aW5nIHRvIHVzZSBhIHBvcnQgYmVsb3cgMTAyNCAoc3VjaCBhcyB0aGUKLWRlZmF1bHQgcG9ydCA4MCkuCi0KLTxQPgotCi1JZiB0aGUgc2VydmVyIGlzIG5vdCBydW5uaW5nLCByZWFkIHRoZSBlcnJvciBtZXNzYWdlIGRpc3BsYXllZAotd2hlbiB5b3UgcnVuIGh0dHBkLiBZb3Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIHNlcnZlcgotZXJyb3JfbG9nIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICh3aXRoIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sCi10aGlzIHdpbGwgYmUgbG9jYXRlZCBpbiB0aGUgZmlsZSA8Q09ERT5lcnJvcl9sb2c8L0NPREU+IGluIHRoZQotPENPREU+bG9nczwvQ09ERT4gZGlyZWN0b3J5KS4KLQotPFA+Ci0KLUlmIHlvdSB3YW50IHlvdXIgc2VydmVyIHRvIGNvbnRpbnVlIHJ1bm5pbmcgYWZ0ZXIgYSBzeXN0ZW0gcmVib290LCB5b3UKLXNob3VsZCBhZGQgYSBjYWxsIHRvIDxDT0RFPmh0dHBkPC9DT0RFPiB0byB5b3VyIHN5c3RlbSBzdGFydHVwIGZpbGVzCi0odHlwaWNhbGx5IDxDT0RFPnJjLmxvY2FsPC9DT0RFPiBvciBhIGZpbGUgaW4gYW4KLTxDT0RFPnJjLjxFTT5OPC9FTT48L0NPREU+IGRpcmVjdG9yeSkuIFRoaXMgd2lsbCBzdGFydCBBcGFjaGUgYXMgcm9vdC4KLUJlZm9yZSBkb2luZyB0aGlzIGVuc3VyZSB0aGF0IHlvdXIgc2VydmVyIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQKLWZvciBzZWN1cml0eSBhbmQgYWNjZXNzIHJlc3RyaWN0aW9ucy4KLQotPFA+Ci0KLVRvIHN0b3AgQXBhY2hlIHNlbmQgdGhlIHBhcmVudCBwcm9jZXNzIGEgVEVSTSBzaWduYWwuIFRoZSBQSUQgb2YgdGhpcwotcHJvY2VzcyBpcyB3cml0dGVuIHRvIHRoZSBmaWxlIDxDT0RFPmh0dHBkLnBpZDwvQ09ERT4gaW4gdGhlCi08Q09ERT5sb2dzPC9DT0RFPiBkaXJlY3RvcnkgKHVubGVzcyBjb25maWd1cmVkIG90aGVyd2lzZSkuICBEbyBub3QKLWF0dGVtcHQgdG8ga2lsbCB0aGUgY2hpbGQgcHJvY2Vzc2VzIGJlY2F1c2UgdGhleSB3aWxsIGJlIHJlbmV3ZWQgYnkKLXRoZSBwYXJlbnQuICBBIHR5cGljYWwgY29tbWFuZCB0byBzdG9wIHRoZSBzZXJ2ZXIgaXM6Ci0KLTxQUkU+Ci0gICAga2lsbCAtVEVSTSBgY2F0IC91c3IvbG9jYWwvYXBhY2hlL2xvZ3MvaHR0cGQucGlkYAotPC9QUkU+Ci0KLTxQPgotCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBBcGFjaGUgY29tbWFuZCBsaW5lIG9wdGlvbnMsIGNvbmZpZ3VyYXRpb24KLWFuZCBsb2cgZmlsZXMsIHNlZSA8QSBIUkVGPSJpbnZva2luZy5odG1sIj5TdGFydGluZyBBcGFjaGU8L0E+LiBGb3IgYQotcmVmZXJlbmNlIGd1aWRlIHRvIGFsbCBBcGFjaGUgZGlyZWN0aXZlcyBzdXBwb3J0ZWQgYnkgdGhlIGRpc3RyaWJ1dGVkCi1tb2R1bGVzLCBzZWUgdGhlIDxBIEhSRUY9Im1vZC9kaXJlY3RpdmVzLmh0bWwiPkFwYWNoZSBkaXJlY3RpdmVzPC9BPi4KLQotPEgyPkNvbXBpbGluZyBTdXBwb3J0IFByb2dyYW1zPC9IMj4KLQotSW4gYWRkaXRpb24gdG8gdGhlIG1haW4gPENPREU+aHR0cGQ8L0NPREU+IHNlcnZlciB3aGljaCBpcyBjb21waWxlZAotYW5kIGNvbmZpZ3VyZWQgYXMgYWJvdmUsIEFwYWNoZSBpbmNsdWRlcyBhIG51bWJlciBvZiBzdXBwb3J0IHByb2dyYW1zLgotVGhlc2UgYXJlIG5vdCBjb21waWxlZCBieSBkZWZhdWx0LiBUaGUgc3VwcG9ydCBwcm9ncmFtcyBhcmUgaW4gdGhlCi08Q09ERT5zdXBwb3J0PC9DT0RFPiBkaXJlY3Rvcnkgb2YgdGhlIGRpc3RyaWJ1dGlvbi4gVG8gY29tcGlsZQotdGhlIHN1cHBvcnQgcHJvZ3JhbXMsIGNoYW5nZSBpbnRvIHRoaXMgZGlyZWN0b3J5IGFuZCB0eXBlCi08UFJFPgotICAgIG1ha2UKLTwvUFJFPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvaW52b2tpbmcuaHRtbCBiL2RvY3MvbWFudWFsL2ludm9raW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZWUwNzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvaW52b2tpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPlN0YXJ0aW5nIEFwYWNoZTwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPlN0YXJ0aW5nIEFwYWNoZTwvSDE+Ci0KLTxIMj5JbnZva2luZyBBcGFjaGU8L0gyPgotCi1PbiBVbml4LCB0aGUgPENPREU+aHR0cGQ8L0NPREU+IHByb2dyYW0gaXMgdXN1YWxseSBydW4gYXMgYSBkYWVtb24KLXdoaWNoIGV4ZWN1dGVzIGNvbnRpbnVvdXNseSwgaGFuZGxpbmcgcmVxdWVzdHMuICBJdCBpcyBwb3NzaWJsZSB0bwotaW52b2tlIEFwYWNoZSBieSB0aGUgSW50ZXJuZXQgZGFlbW9uIDxDT0RFPmluZXRkPC9DT0RFPiBlYWNoIHRpbWUgYQotY29ubmVjdGlvbiB0byB0aGUgSFRUUCBzZXJ2aWNlIGlzIG1hZGUgKHVzZSB0aGUgPEEKLUhSRUY9Im1vZC9jb3JlLmh0bWwjc2VydmVydHlwZSI+U2VydmVyVHlwZTwvQT4gZGlyZWN0aXZlKSBidXQgdGhpcyBpcwotbm90IHJlY29tbWVuZGVkLgotCi08UD4KLQotT24gV2luZG93cywgQXBhY2hlIGlzIG5vcm1hbGx5IHJ1biBhcyBhIHNlcnZpY2Ugb24gV2luZG93cyBOVCwgb3IgYXMgYQotY29uc29sZSBhcHBsaWNhdGlvbiBvbiBXaW5kb3dzIDk1LiBTZWUgYWxzbyA8QQotSFJFRj0id2luZG93cy5odG1sI3J1biI+cnVubmluZyBBcGFjaGUgZm9yIFdpbmRvd3M8L0E+LgotCi08SDI+Q29tbWFuZCBsaW5lIG9wdGlvbnM8L0gyPgotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSByZWNvZ25pemVkIG9uIHRoZSBodHRwZCBjb21tYW5kIGxpbmU6Ci08REw+Ci08RFQ+PENPREU+LWQ8L0NPREU+IDxFTT5zZXJ2ZXJyb290PC9FTT4KLTxERD5TZXQgdGhlIGluaXRpYWwgdmFsdWUgZm9yIHRoZQotPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNzZXJ2ZXJyb290Ij5TZXJ2ZXJSb290PC9BPiB2YXJpYWJsZSB0bwotPEVNPnNlcnZlcnJvb3Q8L0VNPi4gVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgU2VydmVyUm9vdCBjb21tYW5kCi1pbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiBUaGUgZGVmYXVsdCBpcwotPENPREU+L3Vzci9sb2NhbC9hcGFjaGU8L0NPREU+IG9uIFVuaXgsIDxDT0RFPi9hcGFjaGU8L0NPREU+IG9uCi1XaW5kb3dzIGFuZCA8Q09ERT4vb3MyaHR0cGQ8L0NPREU+IG9uIE9TLzIuCi0KLTxEVD48Q09ERT4tRDwvQ09ERT4gPEVNPm5hbWU8L0VNPgotPEREPkRlZmluZSBhIG5hbWUgZm9yIHVzZSBpbiBpbiAKLTxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjaWZkZWZpbmUiPklmRGVmaW5lPC9BPiBkaXJlY3RpdmVzLgotVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gb3B0aW9uYWxseSBlbmFibGUgY2VydGFpbiBmdW5jdGlvbmFsaXR5IGluIHRoZQotY29uZmlndXJhdGlvbiBmaWxlLCBvciB0byB1c2UgYSBjb21tb24gY29uZmlndXJhdGlvbiBmb3IKLXNldmVyYWwgaW5kZXBlbmRlbnQgaG9zdHMsIHdoZXJlIGhvc3Qgc3BlY2lmaWMgaW5mb3JtYXRpb24gaXMgZW5jbG9zZWQgaW4KLSZsdDtJZkRlZmluZSZndDsgc2VjdGlvbnMuCi0KLTxEVD48Q09ERT4tZjwvQ09ERT4gPEVNPmNvbmZpZzwvRU0+Ci08REQ+RXhlY3V0ZSB0aGUgY29tbWFuZHMgaW4gdGhlIGZpbGUgPEVNPmNvbmZpZzwvRU0+IG9uIHN0YXJ0dXAuIElmCi08RU0+Y29uZmlnPC9FTT4gZG9lcyBub3QgYmVnaW4gd2l0aCBhIDxDT0RFPi88L0NPREU+LCB0aGVuIGl0IGlzIHRha2VuIHRvIGJlIGEKLXBhdGggcmVsYXRpdmUgdG8gdGhlIDxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvQT4uIFRoZQotZGVmYXVsdCBpcyA8Q09ERT5jb25mL2h0dHBkLmNvbmY8L0NPREU+LgotCi08RFQ+PENPREU+LUM8L0NPREU+IDxFTT4iZGlyZWN0aXZlIjwvRU0+Ci08REQ+UHJvY2VzcyB0aGUgZ2l2ZW4gYXBhY2hlICJkaXJlY3RpdmUiIChqdXN0IGFzIGlmIGl0IGhhZCBiZWVuIHBhcnQgb2YgYQotY29uZmlndXJhdGlvbiBmaWxlKSA8U1RST05HPmJlZm9yZTwvU1RST05HPiBhY3R1YWxseSByZWFkaW5nIHRoZSByZWd1bGFyIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLTxEVD48Q09ERT4tYzwvQ09ERT4gPEVNPiJkaXJlY3RpdmUiPC9FTT4KLTxERD5Qcm9jZXNzIHRoZSBnaXZlbiBhcGFjaGUgImRpcmVjdGl2ZSIgPFNUUk9ORz5hZnRlcjwvU1RST05HPiByZWFkaW5nCi1hbGwgdGhlIHJlZ3VsYXIgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotPERUPjxDT0RFPi1YPC9DT0RFPgotPEREPlJ1biBpbiBzaW5nbGUtcHJvY2VzcyBtb2RlLCBmb3IgaW50ZXJuYWwgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHk7IHRoZQotZGFlbW9uIGRvZXMgbm90IGRldGFjaCBmcm9tIHRoZSB0ZXJtaW5hbCBvciBmb3JrIGFueSBjaGlsZHJlbi4gRG8gPEVNPk5PVDwvRU0+Ci11c2UgdGhpcyBtb2RlIHRvIHByb3ZpZGUgb3JkaW5hcnkgd2ViIHNlcnZpY2UuCi0KLTxEVD48Q09ERT4tdjwvQ09ERT4KLTxERD5QcmludCB0aGUgdmVyc2lvbiBvZiBodHRwZCBhbmQgaXRzIGJ1aWxkIGRhdGUsIGFuZCB0aGVuIGV4aXQuCi0KLTxEVD48QSBOQU1FPSJ2ZXJzaW9uIj48Q09ERT4tVjwvQ09ERT48L0E+Ci08REQ+UHJpbnQgdGhlIGJhc2UgdmVyc2lvbiBvZiBodHRwZCwgaXRzCi1idWlsZCBkYXRlLCBhbmQgYSBsaXN0IG9mIGNvbXBpbGUgdGltZSBzZXR0aW5ncyB3aGljaCBpbmZsdWVuY2UgdGhlCi1iZWhhdmlvciBhbmQgcGVyZm9ybWFuY2Ugb2YgdGhlIGFwYWNoZSBzZXJ2ZXIgKDxFTT5lLmcuPC9FTT4sCi08U0FNUD4tRFVTRV9NTUFQX0ZJTEVTPC9TQU1QPiksCi10aGVuIGV4aXQuCi0KLTxEVD48QSBOQU1FPSJoZWxwIj48Q09ERT4tTDwvQ09ERT48L0E+Ci08REQ+Ci0KLUdpdmUgYSBsaXN0IG9mIGRpcmVjdGl2ZXMgdG9nZXRoZXIgd2l0aCBleHBlY3RlZCBhcmd1bWVudHMgYW5kIHBsYWNlcwotd2hlcmUgdGhlIGRpcmVjdGl2ZSBpcyB2YWxpZCwgdGhlbiBleGl0LiAgKEFwYWNoZSAxLjMuNCBhbmQKLWxhdGVyLiBFYXJsaWVyIHZlcnNpb25zIHVzZWQgLWwgaW5zdGVhZCkuCi0KLQotPERUPjxDT0RFPi1sPC9DT0RFPjwvQT4KLTxERD4KLQotR2l2ZSBhIGxpc3Qgb2YgYWxsIG1vZHVsZXMgY29tcGlsZWQgaW50byB0aGUgc2VydmVyLCB0aGVuIGV4aXQuCi0oQXBhY2hlIDEuMy40IGFuZCBsYXRlci4gRWFybGllciB2ZXJzaW9ucyB1c2VkIC1oIGluc3RlYWQpLjxicj4KLQotR2l2ZSBhIGxpc3Qgb2YgZGlyZWN0aXZlcyB0b2dldGhlciB3aXRoIGV4cGVjdGVkIGFyZ3VtZW50cyBhbmQgcGxhY2VzCi13aGVyZSB0aGUgZGlyZWN0aXZlIGlzIHZhbGlkLCB0aGVuIGV4aXQuIChBcGFjaGUgMS4yIHRvIDEuMy4zLiBMYXRlcgotdmVyc2lvbnMgdXNlIC1MIGluc3RlYWQpLgotCi0KLQotPERUPjxDT0RFPi1oPC9DT0RFPgotPEREPgotCi1QcmludCBhIGxpc3Qgb2YgdGhlIGh0dHBkIG9wdGlvbnMsIHRoZW4gZXhpdC4gKEFwYWNoZSAxLjMuNCBhbmQKLWxhdGVyLiBFYXJsaWVyIHZlcnNpb25zIHVzZWQgLT8gaW5zdGVhZCkuPGJyPgotCi1HaXZlIGEgbGlzdCBvZiBhbGwgbW9kdWxlcyBjb21waWxlZCBpbnRvIHRoZSBzZXJ2ZXIsIHRoZW4gZXhpdC4gKFVwIHRvCi1BcGFjaGUgMS4zLjMuIExhdGVyIHZlcnNpb25zIHVzZSAtbCBpbnN0ZWFkKS48YnI+Ci0KLQotPERUPjxDT0RFPi1TPC9DT0RFPgotPEREPlNob3cgdGhlIHNldHRpbmdzIGFzIHBhcnNlZCBmcm9tIHRoZSBjb25maWcgZmlsZSAoY3VycmVudGx5IG9ubHkKLXNob3dzIGEgYnJlYWtkb3duIG9mIHRoZSB2aG9zdCBzZXR0aW5ncykgYnV0IGRvIG5vdCBzdGFydCB0aGUKLXNlcnZlci4gKFVwIHRvIEFwYWNoZSAxLjMuMywgdGhpcyBvcHRpb24gYWxzbyBzdGFydGVkIHRoZSBzZXJ2ZXIpLgotCi08RFQ+PENPREU+LXQ8L0NPREU+Ci08REQ+VGVzdCB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHN5bnRheCAoPEVNPmkuZS48L0VNPiwgcmVhZCBhbGwgY29uZmlndXJhdGlvbiBmaWxlcwotYW5kIGludGVycHJldCB0aGVtKSBidXQgZG8gbm90IHN0YXJ0IHRoZSBzZXJ2ZXIuIElmIHRoZSBjb25maWd1cmF0aW9uIGNvbnRhaW5zCi1lcnJvcnMsIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBhbmQgZXhpdCB3aXRoIGEgbm9uLXplcm8gZXhpdCBzdGF0dXMsCi1vdGhlcndpc2UgZGlzcGxheSAiU3ludGF4IE9LIiBhbmQgdGVybWluYXRlIHdpdGggYSB6ZXJvIGV4aXQgc3RhdHVzLiBUaGlzCi1jb21tYW5kIGNoZWNrcyB0byBzZWUgaWYgYWxsIERvY3VtZW50Um9vdCBlbnRyaWVzIGV4aXN0IGFuZCBhcmUgZGlyZWN0b3JpZXMuCi1Gb3Igc2l0ZXMgd2l0aCBtYW55IHZob3N0cywgdGhpcyBpcyBleHBlbnNpdmU7IGNvbnNpZGVyIHRoZSA8Q09ERT4tVDwvQ09ERT4KLWNvbW1hbmQgaW5zdGVhZC4KLQotPERUPjxDT0RFPi1UPC9DT0RFPgotPEREPlRlc3QgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBzeW50YXggKDxFTT5pLmUuPC9FTT4sIHJlYWQgYWxsIGNvbmZpZ3VyYXRpb24gZmlsZXMKLWFuZCBpbnRlcnByZXQgdGhlbSkgYnV0IGRvIG5vdCBzdGFydCB0aGUgc2VydmVyLiBJZiB0aGUgY29uZmlndXJhdGlvbiBjb250YWlucwotZXJyb3JzLCBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQgd2l0aCBhIG5vbi16ZXJvIGV4aXQgc3RhdHVzLAotb3RoZXJ3aXNlIGRpc3BsYXkgIlN5bnRheCBPSyIgYW5kIHRlcm1pbmF0ZSB3aXRoIGEgemVybyBleGl0IHN0YXR1cy4gVGhpcwotY29tbWFuZCBkb2VzIG5vdCBwZXJmb3JtIGFueSBjaGVja2luZyBvZiB0aGUgRG9jdW1lbnRSb290IGVudHJpZXMuCi0KLTxEVD48Q09ERT4tazwvQ09ERT4gPEVNPm9wdGlvbjwvRU0+Ci08REQ+V2luZG93cyBvbmx5OiBzaWduYWwgQXBhY2hlIHRvIHJlc3RhcnQgb3Igc2h1dGRvd24uIDxFTT5vcHRpb248L0VNPiAKLWlzIG9uZSBvZiAic2h1dGRvd24iIG9yICJyZXN0YXJ0Ii4gKEFwYWNoZSAxLjMuMyBhbmQgbGF0ZXIpLgotCi08RFQ+PENPREU+LT88L0NPREU+Ci08REQ+UHJpbnQgYSBsaXN0IG9mIHRoZSBodHRwZCBvcHRpb25zLCBhbmQgdGhlbiBleGl0ICh1cCB0byBBcGFjaGUKLTEuMy4zLiBMYXRlciB2ZXJzaW9uIHVzZSAtaCBpbnN0ZWFkKS4KLQotPC9ETD4KLQotPEgyPkNvbmZpZ3VyYXRpb24gZmlsZXM8L0gyPgotVGhlIHNlcnZlciB3aWxsIHJlYWQgdGhyZWUgZmlsZXMgZm9yIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcy4gQW55Ci1kaXJlY3RpdmUgbWF5IGFwcGVhciBpbiBhbnkgb2YgdGhlc2UgZmlsZXMuIFRoZSB0aGUgbmFtZXMgb2YgdGhlc2UKLWZpbGVzIGFyZSB0YWtlbiB0byBiZSByZWxhdGl2ZSB0byB0aGUgc2VydmVyIHJvb3Q7IHRoaXMgaXMgc2V0IGJ5IHRoZQotPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNzZXJ2ZXJyb290Ij5TZXJ2ZXJSb290PC9BPiBkaXJlY3RpdmUsIHRoZQotPENPREU+LWQ8L0NPREU+IGNvbW1hbmQgbGluZSBmbGFnLCBvciAob24gV2luZG93cyBvbmx5KSB0aGUgcmVnaXN0cnkKLShzZWUgPEEgSFJFRj0id2luZG93cy5odG1sI3J1biI+UnVubmluZyBBcGFjaGUgZm9yIFdpbmRvd3M8L0E+KS4KLQotQ29udmVudGlvbmFsbHksIHRoZSBmaWxlcyBhcmU6Ci08REw+Ci08RFQ+PENPREU+Y29uZi9odHRwZC5jb25mPC9DT0RFPgotPEREPkNvbnRhaW5zIGRpcmVjdGl2ZXMgdGhhdCBjb250cm9sIHRoZSBvcGVyYXRpb24gb2YgdGhlIHNlcnZlciBkYWVtb24uCi1UaGUgZmlsZW5hbWUgbWF5IGJlIG92ZXJyaWRkZW4gd2l0aCB0aGUgPENPREU+LWY8L0NPREU+IGNvbW1hbmQgbGluZSBmbGFnLgotCi08RFQ+PENPREU+Y29uZi9zcm0uY29uZjwvQ09ERT4KLTxERD5Db250YWlucyBkaXJlY3RpdmVzIHRoYXQgY29udHJvbCB0aGUgc3BlY2lmaWNhdGlvbiBvZiBkb2N1bWVudHMgdGhhdAotdGhlIHNlcnZlciBjYW4gcHJvdmlkZSB0byBjbGllbnRzLiBUaGUgZmlsZW5hbWUgbWF5IGJlIG92ZXJyaWRkZW4gd2l0aAotdGhlIDxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjcmVzb3VyY2Vjb25maWciPlJlc291cmNlQ29uZmlnPC9BPiBkaXJlY3RpdmUuCi0KLTxEVD48Q09ERT5jb25mL2FjY2Vzcy5jb25mPC9DT0RFPgotPEREPkNvbnRhaW5zIGRpcmVjdGl2ZXMgdGhhdCBjb250cm9sIGFjY2VzcyB0byBkb2N1bWVudHMuCi1UaGUgZmlsZW5hbWUgbWF5IGJlIG92ZXJyaWRkZW4gd2l0aCB0aGUKLTxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjYWNjZXNzY29uZmlnIj5BY2Nlc3NDb25maWc8L0E+IGRpcmVjdGl2ZS4KLTwvREw+Ci1Ib3dldmVyLCB0aGVzZSBjb252ZW50aW9ucyBuZWVkIG5vdCBiZSBhZGhlcmVkIHRvLgotPFA+Ci1UaGUgc2VydmVyIGFsc28gcmVhZHMgYSBmaWxlIGNvbnRhaW5pbmcgbWltZSBkb2N1bWVudCB0eXBlczsgdGhlIGZpbGVuYW1lCi1pcyBzZXQgYnkgdGhlIDxBIEhSRUY9Im1vZC9tb2RfbWltZS5odG1sI3R5cGVzY29uZmlnIj5UeXBlc0NvbmZpZzwvQT4KLWRpcmVjdGl2ZSwKLWFuZCBpcyA8Q09ERT5jb25mL21pbWUudHlwZXM8L0NPREU+IGJ5IGRlZmF1bHQuCi0KLTxIMj5Mb2cgZmlsZXM8L0gyPgotPEgzPnNlY3VyaXR5IHdhcm5pbmc8L0gzPgotQW55b25lIHdobyBjYW4gd3JpdGUgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBBcGFjaGUgaXMgd3JpdGluZyBhCi1sb2cgZmlsZSBjYW4gYWxtb3N0IGNlcnRhaW5seSBnYWluIGFjY2VzcyB0byB0aGUgdWlkIHRoYXQgdGhlIHNlcnZlciBpcwotc3RhcnRlZCBhcywgd2hpY2ggaXMgbm9ybWFsbHkgcm9vdC4gIERvIDxFTT5OT1Q8L0VNPiBnaXZlIHBlb3BsZSB3cml0ZQotYWNjZXNzIHRvIHRoZSBkaXJlY3RvcnkgdGhlIGxvZ3MgYXJlIHN0b3JlZCBpbiB3aXRob3V0IGJlaW5nIGF3YXJlIG9mCi10aGUgY29uc2VxdWVuY2VzOyBzZWUgdGhlIDxBIEhSRUY9Im1pc2Mvc2VjdXJpdHlfdGlwcy5odG1sIj5zZWN1cml0eSB0aXBzPC9BPgotZG9jdW1lbnQgZm9yIGRldGFpbHMuCi08SDM+cGlkIGZpbGU8L0gzPgotCi1PbiBzdGFydHVwLCBBcGFjaGUgc2F2ZXMgdGhlIHByb2Nlc3MgaWQgb2YgdGhlIHBhcmVudCBodHRwZCBwcm9jZXNzIHRvCi10aGUgZmlsZSA8Q09ERT5sb2dzL2h0dHBkLnBpZDwvQ09ERT4uIFRoaXMgZmlsZW5hbWUgY2FuIGJlIGNoYW5nZWQKLXdpdGggdGhlIDxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjcGlkZmlsZSI+UGlkRmlsZTwvQT4gZGlyZWN0aXZlLiBUaGUKLXByb2Nlc3MtaWQgaXMgZm9yIHVzZSBieSB0aGUgYWRtaW5pc3RyYXRvciBpbiByZXN0YXJ0aW5nIGFuZAotdGVybWluYXRpbmcgdGhlIGRhZW1vbjogb24gVW5peCwgYSBIVVAgb3IgVVNSMSBzaWduYWwgY2F1c2VzIHRoZQotZGFlbW9uIHRvIHJlLXJlYWQgaXRzIGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kIGEgVEVSTSBzaWduYWwgY2F1c2VzIGl0Ci10byBkaWUgZ3JhY2VmdWxseTsgb24gV2luZG93cywgdXNlIHRoZSAtayBjb21tYW5kIGxpbmUgb3B0aW9uIGluc3RlYWQuCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgdGhlIDxBIEhSRUY9InN0b3BwaW5nLmh0bWwiPlN0b3BwaW5nIGFuZAotUmVzdGFydGluZzwvQT4gcGFnZS4KLQotPFA+Ci1JZiB0aGUgcHJvY2VzcyBkaWVzIChvciBpcyBraWxsZWQpIGFibm9ybWFsbHksIHRoZW4gaXQgd2lsbCBiZSBuZWNlc3NhcnkgdG8KLWtpbGwgdGhlIGNoaWxkcmVuIGh0dHBkIHByb2Nlc3Nlcy4KLQotPEgzPkVycm9yIGxvZzwvSDM+Ci0KLVRoZSBzZXJ2ZXIgd2lsbCBsb2cgZXJyb3IgbWVzc2FnZXMgdG8gYSBsb2cgZmlsZSwgYnkgZGVmYXVsdAotPENPREU+bG9ncy9lcnJvcl9sb2c8L0NPREU+IG9uIFVuaXggb3IgPENPREU+bG9ncy9lcnJvci5sb2c8L0NPREU+IG9uCi1XaW5kb3dzIGFuZCBPUy8yLiBUaGUgZmlsZW5hbWUgY2FuIGJlIHNldCB1c2luZyB0aGUgPEEKLUhSRUY9Im1vZC9jb3JlLmh0bWwjZXJyb3Jsb2ciPkVycm9yTG9nPC9BPiBkaXJlY3RpdmU7IGRpZmZlcmVudCBlcnJvcgotbG9ncyBjYW4gYmUgc2V0IGZvciBkaWZmZXJlbnQgPEEKLUhSRUY9Im1vZC9jb3JlLmh0bWwjdmlydHVhbGhvc3QiPnZpcnR1YWwgaG9zdHM8L0E+LgotCi08SDM+VHJhbnNmZXIgbG9nPC9IMz4KLQotVGhlIHNlcnZlciB3aWxsIHR5cGljYWxseSBsb2cgZWFjaCByZXF1ZXN0IHRvIGEgdHJhbnNmZXIgZmlsZSwgYnkKLWRlZmF1bHQgPENPREU+bG9ncy9hY2Nlc3NfbG9nPC9DT0RFPiBvbiBVbml4IG9yCi08Q09ERT5sb2dzL2FjY2Vzcy5sb2c8L0NPREU+IG9uIFdpbmRvd3MgYW5kIE9TLzIuIFRoZSBmaWxlbmFtZSBjYW4gYmUKLXNldCB1c2luZyBhIDxBCi1IUkVGPSJtb2QvbW9kX2xvZ19jb25maWcuaHRtbCN0cmFuc2ZlcmxvZyI+VHJhbnNmZXJMb2c8L0E+IGRpcmVjdGl2ZQotb3IgYWRkaXRpb25hbCBsb2cgZmlsZXMgY3JlYXRlZCB3aXRoIHRoZSA8QQotSFJFRj0ibW9kL21vZF9sb2dfY29uZmlnLmh0bWwjY3VzdG9tbG9nIj5DdXN0b21Mb2c8L0E+IGRpcmVjdGl2ZTsKLWRpZmZlcmVudCB0cmFuc2ZlciBsb2dzIGNhbiBiZSBzZXQgZm9yIGRpZmZlcmVudCA8QQotSFJFRj0ibW9kL2NvcmUuaHRtbCN2aXJ0dWFsaG9zdCI+dmlydHVhbCBob3N0czwvQT4uCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9pbnZva2luZy5odG1sLmVuIGIvZG9jcy9tYW51YWwvaW52b2tpbmcuaHRtbC5lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJlZTA3Ni4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9pbnZva2luZy5odG1sLmVuCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+U3RhcnRpbmcgQXBhY2hlPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+U3RhcnRpbmcgQXBhY2hlPC9IMT4KLQotPEgyPkludm9raW5nIEFwYWNoZTwvSDI+Ci0KLU9uIFVuaXgsIHRoZSA8Q09ERT5odHRwZDwvQ09ERT4gcHJvZ3JhbSBpcyB1c3VhbGx5IHJ1biBhcyBhIGRhZW1vbgotd2hpY2ggZXhlY3V0ZXMgY29udGludW91c2x5LCBoYW5kbGluZyByZXF1ZXN0cy4gIEl0IGlzIHBvc3NpYmxlIHRvCi1pbnZva2UgQXBhY2hlIGJ5IHRoZSBJbnRlcm5ldCBkYWVtb24gPENPREU+aW5ldGQ8L0NPREU+IGVhY2ggdGltZSBhCi1jb25uZWN0aW9uIHRvIHRoZSBIVFRQIHNlcnZpY2UgaXMgbWFkZSAodXNlIHRoZSA8QQotSFJFRj0ibW9kL2NvcmUuaHRtbCNzZXJ2ZXJ0eXBlIj5TZXJ2ZXJUeXBlPC9BPiBkaXJlY3RpdmUpIGJ1dCB0aGlzIGlzCi1ub3QgcmVjb21tZW5kZWQuCi0KLTxQPgotCi1PbiBXaW5kb3dzLCBBcGFjaGUgaXMgbm9ybWFsbHkgcnVuIGFzIGEgc2VydmljZSBvbiBXaW5kb3dzIE5ULCBvciBhcyBhCi1jb25zb2xlIGFwcGxpY2F0aW9uIG9uIFdpbmRvd3MgOTUuIFNlZSBhbHNvIDxBCi1IUkVGPSJ3aW5kb3dzLmh0bWwjcnVuIj5ydW5uaW5nIEFwYWNoZSBmb3IgV2luZG93czwvQT4uCi0KLTxIMj5Db21tYW5kIGxpbmUgb3B0aW9uczwvSDI+Ci1UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQgb24gdGhlIGh0dHBkIGNvbW1hbmQgbGluZToKLTxETD4KLTxEVD48Q09ERT4tZDwvQ09ERT4gPEVNPnNlcnZlcnJvb3Q8L0VNPgotPEREPlNldCB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlCi08QSBIUkVGPSJtb2QvY29yZS5odG1sI3NlcnZlcnJvb3QiPlNlcnZlclJvb3Q8L0E+IHZhcmlhYmxlIHRvCi08RU0+c2VydmVycm9vdDwvRU0+LiBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBTZXJ2ZXJSb290IGNvbW1hbmQKLWluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuIFRoZSBkZWZhdWx0IGlzCi08Q09ERT4vdXNyL2xvY2FsL2FwYWNoZTwvQ09ERT4gb24gVW5peCwgPENPREU+L2FwYWNoZTwvQ09ERT4gb24KLVdpbmRvd3MgYW5kIDxDT0RFPi9vczJodHRwZDwvQ09ERT4gb24gT1MvMi4KLQotPERUPjxDT0RFPi1EPC9DT0RFPiA8RU0+bmFtZTwvRU0+Ci08REQ+RGVmaW5lIGEgbmFtZSBmb3IgdXNlIGluIGluIAotPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNpZmRlZmluZSI+SWZEZWZpbmU8L0E+IGRpcmVjdGl2ZXMuCi1UaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBvcHRpb25hbGx5IGVuYWJsZSBjZXJ0YWluIGZ1bmN0aW9uYWxpdHkgaW4gdGhlCi1jb25maWd1cmF0aW9uIGZpbGUsIG9yIHRvIHVzZSBhIGNvbW1vbiBjb25maWd1cmF0aW9uIGZvcgotc2V2ZXJhbCBpbmRlcGVuZGVudCBob3N0cywgd2hlcmUgaG9zdCBzcGVjaWZpYyBpbmZvcm1hdGlvbiBpcyBlbmNsb3NlZCBpbgotJmx0O0lmRGVmaW5lJmd0OyBzZWN0aW9ucy4KLQotPERUPjxDT0RFPi1mPC9DT0RFPiA8RU0+Y29uZmlnPC9FTT4KLTxERD5FeGVjdXRlIHRoZSBjb21tYW5kcyBpbiB0aGUgZmlsZSA8RU0+Y29uZmlnPC9FTT4gb24gc3RhcnR1cC4gSWYKLTxFTT5jb25maWc8L0VNPiBkb2VzIG5vdCBiZWdpbiB3aXRoIGEgPENPREU+LzwvQ09ERT4sIHRoZW4gaXQgaXMgdGFrZW4gdG8gYmUgYQotcGF0aCByZWxhdGl2ZSB0byB0aGUgPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNzZXJ2ZXJyb290Ij5TZXJ2ZXJSb290PC9BPi4gVGhlCi1kZWZhdWx0IGlzIDxDT0RFPmNvbmYvaHR0cGQuY29uZjwvQ09ERT4uCi0KLTxEVD48Q09ERT4tQzwvQ09ERT4gPEVNPiJkaXJlY3RpdmUiPC9FTT4KLTxERD5Qcm9jZXNzIHRoZSBnaXZlbiBhcGFjaGUgImRpcmVjdGl2ZSIgKGp1c3QgYXMgaWYgaXQgaGFkIGJlZW4gcGFydCBvZiBhCi1jb25maWd1cmF0aW9uIGZpbGUpIDxTVFJPTkc+YmVmb3JlPC9TVFJPTkc+IGFjdHVhbGx5IHJlYWRpbmcgdGhlIHJlZ3VsYXIgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotPERUPjxDT0RFPi1jPC9DT0RFPiA8RU0+ImRpcmVjdGl2ZSI8L0VNPgotPEREPlByb2Nlc3MgdGhlIGdpdmVuIGFwYWNoZSAiZGlyZWN0aXZlIiA8U1RST05HPmFmdGVyPC9TVFJPTkc+IHJlYWRpbmcKLWFsbCB0aGUgcmVndWxhciBjb25maWd1cmF0aW9uIGZpbGVzLgotCi08RFQ+PENPREU+LVg8L0NPREU+Ci08REQ+UnVuIGluIHNpbmdsZS1wcm9jZXNzIG1vZGUsIGZvciBpbnRlcm5hbCBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seTsgdGhlCi1kYWVtb24gZG9lcyBub3QgZGV0YWNoIGZyb20gdGhlIHRlcm1pbmFsIG9yIGZvcmsgYW55IGNoaWxkcmVuLiBEbyA8RU0+Tk9UPC9FTT4KLXVzZSB0aGlzIG1vZGUgdG8gcHJvdmlkZSBvcmRpbmFyeSB3ZWIgc2VydmljZS4KLQotPERUPjxDT0RFPi12PC9DT0RFPgotPEREPlByaW50IHRoZSB2ZXJzaW9uIG9mIGh0dHBkIGFuZCBpdHMgYnVpbGQgZGF0ZSwgYW5kIHRoZW4gZXhpdC4KLQotPERUPjxBIE5BTUU9InZlcnNpb24iPjxDT0RFPi1WPC9DT0RFPjwvQT4KLTxERD5QcmludCB0aGUgYmFzZSB2ZXJzaW9uIG9mIGh0dHBkLCBpdHMKLWJ1aWxkIGRhdGUsIGFuZCBhIGxpc3Qgb2YgY29tcGlsZSB0aW1lIHNldHRpbmdzIHdoaWNoIGluZmx1ZW5jZSB0aGUKLWJlaGF2aW9yIGFuZCBwZXJmb3JtYW5jZSBvZiB0aGUgYXBhY2hlIHNlcnZlciAoPEVNPmUuZy48L0VNPiwKLTxTQU1QPi1EVVNFX01NQVBfRklMRVM8L1NBTVA+KSwKLXRoZW4gZXhpdC4KLQotPERUPjxBIE5BTUU9ImhlbHAiPjxDT0RFPi1MPC9DT0RFPjwvQT4KLTxERD4KLQotR2l2ZSBhIGxpc3Qgb2YgZGlyZWN0aXZlcyB0b2dldGhlciB3aXRoIGV4cGVjdGVkIGFyZ3VtZW50cyBhbmQgcGxhY2VzCi13aGVyZSB0aGUgZGlyZWN0aXZlIGlzIHZhbGlkLCB0aGVuIGV4aXQuICAoQXBhY2hlIDEuMy40IGFuZAotbGF0ZXIuIEVhcmxpZXIgdmVyc2lvbnMgdXNlZCAtbCBpbnN0ZWFkKS4KLQotCi08RFQ+PENPREU+LWw8L0NPREU+PC9BPgotPEREPgotCi1HaXZlIGEgbGlzdCBvZiBhbGwgbW9kdWxlcyBjb21waWxlZCBpbnRvIHRoZSBzZXJ2ZXIsIHRoZW4gZXhpdC4KLShBcGFjaGUgMS4zLjQgYW5kIGxhdGVyLiBFYXJsaWVyIHZlcnNpb25zIHVzZWQgLWggaW5zdGVhZCkuPGJyPgotCi1HaXZlIGEgbGlzdCBvZiBkaXJlY3RpdmVzIHRvZ2V0aGVyIHdpdGggZXhwZWN0ZWQgYXJndW1lbnRzIGFuZCBwbGFjZXMKLXdoZXJlIHRoZSBkaXJlY3RpdmUgaXMgdmFsaWQsIHRoZW4gZXhpdC4gKEFwYWNoZSAxLjIgdG8gMS4zLjMuIExhdGVyCi12ZXJzaW9ucyB1c2UgLUwgaW5zdGVhZCkuCi0KLQotCi08RFQ+PENPREU+LWg8L0NPREU+Ci08REQ+Ci0KLVByaW50IGEgbGlzdCBvZiB0aGUgaHR0cGQgb3B0aW9ucywgdGhlbiBleGl0LiAoQXBhY2hlIDEuMy40IGFuZAotbGF0ZXIuIEVhcmxpZXIgdmVyc2lvbnMgdXNlZCAtPyBpbnN0ZWFkKS48YnI+Ci0KLUdpdmUgYSBsaXN0IG9mIGFsbCBtb2R1bGVzIGNvbXBpbGVkIGludG8gdGhlIHNlcnZlciwgdGhlbiBleGl0LiAoVXAgdG8KLUFwYWNoZSAxLjMuMy4gTGF0ZXIgdmVyc2lvbnMgdXNlIC1sIGluc3RlYWQpLjxicj4KLQotCi08RFQ+PENPREU+LVM8L0NPREU+Ci08REQ+U2hvdyB0aGUgc2V0dGluZ3MgYXMgcGFyc2VkIGZyb20gdGhlIGNvbmZpZyBmaWxlIChjdXJyZW50bHkgb25seQotc2hvd3MgYSBicmVha2Rvd24gb2YgdGhlIHZob3N0IHNldHRpbmdzKSBidXQgZG8gbm90IHN0YXJ0IHRoZQotc2VydmVyLiAoVXAgdG8gQXBhY2hlIDEuMy4zLCB0aGlzIG9wdGlvbiBhbHNvIHN0YXJ0ZWQgdGhlIHNlcnZlcikuCi0KLTxEVD48Q09ERT4tdDwvQ09ERT4KLTxERD5UZXN0IHRoZSBjb25maWd1cmF0aW9uIGZpbGUgc3ludGF4ICg8RU0+aS5lLjwvRU0+LCByZWFkIGFsbCBjb25maWd1cmF0aW9uIGZpbGVzCi1hbmQgaW50ZXJwcmV0IHRoZW0pIGJ1dCBkbyBub3Qgc3RhcnQgdGhlIHNlcnZlci4gSWYgdGhlIGNvbmZpZ3VyYXRpb24gY29udGFpbnMKLWVycm9ycywgZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIGFuZCBleGl0IHdpdGggYSBub24temVybyBleGl0IHN0YXR1cywKLW90aGVyd2lzZSBkaXNwbGF5ICJTeW50YXggT0siIGFuZCB0ZXJtaW5hdGUgd2l0aCBhIHplcm8gZXhpdCBzdGF0dXMuIFRoaXMKLWNvbW1hbmQgY2hlY2tzIHRvIHNlZSBpZiBhbGwgRG9jdW1lbnRSb290IGVudHJpZXMgZXhpc3QgYW5kIGFyZSBkaXJlY3Rvcmllcy4KLUZvciBzaXRlcyB3aXRoIG1hbnkgdmhvc3RzLCB0aGlzIGlzIGV4cGVuc2l2ZTsgY29uc2lkZXIgdGhlIDxDT0RFPi1UPC9DT0RFPgotY29tbWFuZCBpbnN0ZWFkLgotCi08RFQ+PENPREU+LVQ8L0NPREU+Ci08REQ+VGVzdCB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHN5bnRheCAoPEVNPmkuZS48L0VNPiwgcmVhZCBhbGwgY29uZmlndXJhdGlvbiBmaWxlcwotYW5kIGludGVycHJldCB0aGVtKSBidXQgZG8gbm90IHN0YXJ0IHRoZSBzZXJ2ZXIuIElmIHRoZSBjb25maWd1cmF0aW9uIGNvbnRhaW5zCi1lcnJvcnMsIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBhbmQgZXhpdCB3aXRoIGEgbm9uLXplcm8gZXhpdCBzdGF0dXMsCi1vdGhlcndpc2UgZGlzcGxheSAiU3ludGF4IE9LIiBhbmQgdGVybWluYXRlIHdpdGggYSB6ZXJvIGV4aXQgc3RhdHVzLiBUaGlzCi1jb21tYW5kIGRvZXMgbm90IHBlcmZvcm0gYW55IGNoZWNraW5nIG9mIHRoZSBEb2N1bWVudFJvb3QgZW50cmllcy4KLQotPERUPjxDT0RFPi1rPC9DT0RFPiA8RU0+b3B0aW9uPC9FTT4KLTxERD5XaW5kb3dzIG9ubHk6IHNpZ25hbCBBcGFjaGUgdG8gcmVzdGFydCBvciBzaHV0ZG93bi4gPEVNPm9wdGlvbjwvRU0+IAotaXMgb25lIG9mICJzaHV0ZG93biIgb3IgInJlc3RhcnQiLiAoQXBhY2hlIDEuMy4zIGFuZCBsYXRlcikuCi0KLTxEVD48Q09ERT4tPzwvQ09ERT4KLTxERD5QcmludCBhIGxpc3Qgb2YgdGhlIGh0dHBkIG9wdGlvbnMsIGFuZCB0aGVuIGV4aXQgKHVwIHRvIEFwYWNoZQotMS4zLjMuIExhdGVyIHZlcnNpb24gdXNlIC1oIGluc3RlYWQpLgotCi08L0RMPgotCi08SDI+Q29uZmlndXJhdGlvbiBmaWxlczwvSDI+Ci1UaGUgc2VydmVyIHdpbGwgcmVhZCB0aHJlZSBmaWxlcyBmb3IgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzLiBBbnkKLWRpcmVjdGl2ZSBtYXkgYXBwZWFyIGluIGFueSBvZiB0aGVzZSBmaWxlcy4gVGhlIHRoZSBuYW1lcyBvZiB0aGVzZQotZmlsZXMgYXJlIHRha2VuIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBzZXJ2ZXIgcm9vdDsgdGhpcyBpcyBzZXQgYnkgdGhlCi08QSBIUkVGPSJtb2QvY29yZS5odG1sI3NlcnZlcnJvb3QiPlNlcnZlclJvb3Q8L0E+IGRpcmVjdGl2ZSwgdGhlCi08Q09ERT4tZDwvQ09ERT4gY29tbWFuZCBsaW5lIGZsYWcsIG9yIChvbiBXaW5kb3dzIG9ubHkpIHRoZSByZWdpc3RyeQotKHNlZSA8QSBIUkVGPSJ3aW5kb3dzLmh0bWwjcnVuIj5SdW5uaW5nIEFwYWNoZSBmb3IgV2luZG93czwvQT4pLgotCi1Db252ZW50aW9uYWxseSwgdGhlIGZpbGVzIGFyZToKLTxETD4KLTxEVD48Q09ERT5jb25mL2h0dHBkLmNvbmY8L0NPREU+Ci08REQ+Q29udGFpbnMgZGlyZWN0aXZlcyB0aGF0IGNvbnRyb2wgdGhlIG9wZXJhdGlvbiBvZiB0aGUgc2VydmVyIGRhZW1vbi4KLVRoZSBmaWxlbmFtZSBtYXkgYmUgb3ZlcnJpZGRlbiB3aXRoIHRoZSA8Q09ERT4tZjwvQ09ERT4gY29tbWFuZCBsaW5lIGZsYWcuCi0KLTxEVD48Q09ERT5jb25mL3NybS5jb25mPC9DT0RFPgotPEREPkNvbnRhaW5zIGRpcmVjdGl2ZXMgdGhhdCBjb250cm9sIHRoZSBzcGVjaWZpY2F0aW9uIG9mIGRvY3VtZW50cyB0aGF0Ci10aGUgc2VydmVyIGNhbiBwcm92aWRlIHRvIGNsaWVudHMuIFRoZSBmaWxlbmFtZSBtYXkgYmUgb3ZlcnJpZGRlbiB3aXRoCi10aGUgPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNyZXNvdXJjZWNvbmZpZyI+UmVzb3VyY2VDb25maWc8L0E+IGRpcmVjdGl2ZS4KLQotPERUPjxDT0RFPmNvbmYvYWNjZXNzLmNvbmY8L0NPREU+Ci08REQ+Q29udGFpbnMgZGlyZWN0aXZlcyB0aGF0IGNvbnRyb2wgYWNjZXNzIHRvIGRvY3VtZW50cy4KLVRoZSBmaWxlbmFtZSBtYXkgYmUgb3ZlcnJpZGRlbiB3aXRoIHRoZQotPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNhY2Nlc3Njb25maWciPkFjY2Vzc0NvbmZpZzwvQT4gZGlyZWN0aXZlLgotPC9ETD4KLUhvd2V2ZXIsIHRoZXNlIGNvbnZlbnRpb25zIG5lZWQgbm90IGJlIGFkaGVyZWQgdG8uCi08UD4KLVRoZSBzZXJ2ZXIgYWxzbyByZWFkcyBhIGZpbGUgY29udGFpbmluZyBtaW1lIGRvY3VtZW50IHR5cGVzOyB0aGUgZmlsZW5hbWUKLWlzIHNldCBieSB0aGUgPEEgSFJFRj0ibW9kL21vZF9taW1lLmh0bWwjdHlwZXNjb25maWciPlR5cGVzQ29uZmlnPC9BPgotZGlyZWN0aXZlLAotYW5kIGlzIDxDT0RFPmNvbmYvbWltZS50eXBlczwvQ09ERT4gYnkgZGVmYXVsdC4KLQotPEgyPkxvZyBmaWxlczwvSDI+Ci08SDM+c2VjdXJpdHkgd2FybmluZzwvSDM+Ci1BbnlvbmUgd2hvIGNhbiB3cml0ZSB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIEFwYWNoZSBpcyB3cml0aW5nIGEKLWxvZyBmaWxlIGNhbiBhbG1vc3QgY2VydGFpbmx5IGdhaW4gYWNjZXNzIHRvIHRoZSB1aWQgdGhhdCB0aGUgc2VydmVyIGlzCi1zdGFydGVkIGFzLCB3aGljaCBpcyBub3JtYWxseSByb290LiAgRG8gPEVNPk5PVDwvRU0+IGdpdmUgcGVvcGxlIHdyaXRlCi1hY2Nlc3MgdG8gdGhlIGRpcmVjdG9yeSB0aGUgbG9ncyBhcmUgc3RvcmVkIGluIHdpdGhvdXQgYmVpbmcgYXdhcmUgb2YKLXRoZSBjb25zZXF1ZW5jZXM7IHNlZSB0aGUgPEEgSFJFRj0ibWlzYy9zZWN1cml0eV90aXBzLmh0bWwiPnNlY3VyaXR5IHRpcHM8L0E+Ci1kb2N1bWVudCBmb3IgZGV0YWlscy4KLTxIMz5waWQgZmlsZTwvSDM+Ci0KLU9uIHN0YXJ0dXAsIEFwYWNoZSBzYXZlcyB0aGUgcHJvY2VzcyBpZCBvZiB0aGUgcGFyZW50IGh0dHBkIHByb2Nlc3MgdG8KLXRoZSBmaWxlIDxDT0RFPmxvZ3MvaHR0cGQucGlkPC9DT0RFPi4gVGhpcyBmaWxlbmFtZSBjYW4gYmUgY2hhbmdlZAotd2l0aCB0aGUgPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNwaWRmaWxlIj5QaWRGaWxlPC9BPiBkaXJlY3RpdmUuIFRoZQotcHJvY2Vzcy1pZCBpcyBmb3IgdXNlIGJ5IHRoZSBhZG1pbmlzdHJhdG9yIGluIHJlc3RhcnRpbmcgYW5kCi10ZXJtaW5hdGluZyB0aGUgZGFlbW9uOiBvbiBVbml4LCBhIEhVUCBvciBVU1IxIHNpZ25hbCBjYXVzZXMgdGhlCi1kYWVtb24gdG8gcmUtcmVhZCBpdHMgY29uZmlndXJhdGlvbiBmaWxlcyBhbmQgYSBURVJNIHNpZ25hbCBjYXVzZXMgaXQKLXRvIGRpZSBncmFjZWZ1bGx5OyBvbiBXaW5kb3dzLCB1c2UgdGhlIC1rIGNvbW1hbmQgbGluZSBvcHRpb24gaW5zdGVhZC4KLUZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSB0aGUgPEEgSFJFRj0ic3RvcHBpbmcuaHRtbCI+U3RvcHBpbmcgYW5kCi1SZXN0YXJ0aW5nPC9BPiBwYWdlLgotCi08UD4KLUlmIHRoZSBwcm9jZXNzIGRpZXMgKG9yIGlzIGtpbGxlZCkgYWJub3JtYWxseSwgdGhlbiBpdCB3aWxsIGJlIG5lY2Vzc2FyeSB0bwota2lsbCB0aGUgY2hpbGRyZW4gaHR0cGQgcHJvY2Vzc2VzLgotCi08SDM+RXJyb3IgbG9nPC9IMz4KLQotVGhlIHNlcnZlciB3aWxsIGxvZyBlcnJvciBtZXNzYWdlcyB0byBhIGxvZyBmaWxlLCBieSBkZWZhdWx0Ci08Q09ERT5sb2dzL2Vycm9yX2xvZzwvQ09ERT4gb24gVW5peCBvciA8Q09ERT5sb2dzL2Vycm9yLmxvZzwvQ09ERT4gb24KLVdpbmRvd3MgYW5kIE9TLzIuIFRoZSBmaWxlbmFtZSBjYW4gYmUgc2V0IHVzaW5nIHRoZSA8QQotSFJFRj0ibW9kL2NvcmUuaHRtbCNlcnJvcmxvZyI+RXJyb3JMb2c8L0E+IGRpcmVjdGl2ZTsgZGlmZmVyZW50IGVycm9yCi1sb2dzIGNhbiBiZSBzZXQgZm9yIGRpZmZlcmVudCA8QQotSFJFRj0ibW9kL2NvcmUuaHRtbCN2aXJ0dWFsaG9zdCI+dmlydHVhbCBob3N0czwvQT4uCi0KLTxIMz5UcmFuc2ZlciBsb2c8L0gzPgotCi1UaGUgc2VydmVyIHdpbGwgdHlwaWNhbGx5IGxvZyBlYWNoIHJlcXVlc3QgdG8gYSB0cmFuc2ZlciBmaWxlLCBieQotZGVmYXVsdCA8Q09ERT5sb2dzL2FjY2Vzc19sb2c8L0NPREU+IG9uIFVuaXggb3IKLTxDT0RFPmxvZ3MvYWNjZXNzLmxvZzwvQ09ERT4gb24gV2luZG93cyBhbmQgT1MvMi4gVGhlIGZpbGVuYW1lIGNhbiBiZQotc2V0IHVzaW5nIGEgPEEKLUhSRUY9Im1vZC9tb2RfbG9nX2NvbmZpZy5odG1sI3RyYW5zZmVybG9nIj5UcmFuc2ZlckxvZzwvQT4gZGlyZWN0aXZlCi1vciBhZGRpdGlvbmFsIGxvZyBmaWxlcyBjcmVhdGVkIHdpdGggdGhlIDxBCi1IUkVGPSJtb2QvbW9kX2xvZ19jb25maWcuaHRtbCNjdXN0b21sb2ciPkN1c3RvbUxvZzwvQT4gZGlyZWN0aXZlOwotZGlmZmVyZW50IHRyYW5zZmVyIGxvZ3MgY2FuIGJlIHNldCBmb3IgZGlmZmVyZW50IDxBCi1IUkVGPSJtb2QvY29yZS5odG1sI3ZpcnR1YWxob3N0Ij52aXJ0dWFsIGhvc3RzPC9BPi4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL2xvY2F0aW9uLmh0bWwgYi9kb2NzL21hbnVhbC9sb2NhdGlvbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGRkZDJlLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL2xvY2F0aW9uLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFjY2VzcyBDb250cm9sIGJ5IFVSTDwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPkFjY2VzcyBDb250cm9sIGJ5IFVSTDwvSDE+Ci0KLTxIMj48QSBOQU1FPSJsb2NhdGlvbiI+VGhlIDxDT0RFPiZsdDtMb2NhdGlvbiZndDs8L0NPREU+IERpcmVjdGl2ZTwvQT48L0gyPgotCi08QQotIEhSRUY9Im1vZC9kaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiAmbHQ7TG9jYXRpb24gPEVNPlVSTCBwcmVmaXg8L0VNPiZndDs8QlI+Ci08QQotIEhSRUY9Im1vZC9kaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxCUj4KLTxBCi0gSFJFRj0ibW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmU8QlI+Ci0KLTxQPlRoZSAmbHQ7TG9jYXRpb24mZ3Q7IGRpcmVjdGl2ZSBwcm92aWRlcyBmb3IgYWNjZXNzIGNvbnRyb2wgYnkKLVVSTC4gSXQgaXMgY29tcGFyYWJsZSB0byB0aGUgPEEKLUhSRUY9Im1vZC9jb3JlLmh0bWwjZGlyZWN0b3J5Ij4mbHQ7RGlyZWN0b3J5Jmd0OzwvQT4gZGlyZWN0aXZlLCBhbmQKLXNob3VsZCBiZSBtYXRjaGVkIHdpdGggYSAmbHQ7L0xvY2F0aW9uJmd0OyBkaXJlY3RpdmUuIERpcmVjdGl2ZXMgdGhhdAotYXBwbHkgdG8gdGhlIFVSTCBnaXZlbiBzaG91bGQgYmUgbGlzdGVuCi13aXRoaW4uIDxDT0RFPiZsdDtMb2NhdGlvbiZndDs8L0NPREU+IHNlY3Rpb25zIGFyZSBwcm9jZXNzZWQgaW4gdGhlCi1vcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLCBhZnRlciB0aGUKLSZsdDtEaXJlY3RvcnkmZ3Q7IHNlY3Rpb25zIGFuZCA8Q09ERT4uaHRhY2Nlc3M8L0NPREU+IGZpbGVzIGFyZQotcmVhZC48L1A+Ci0KLTxQPk5vdGUgdGhhdCwgZHVlIHRvIHRoZSB3YXkgSFRUUCBmdW5jdGlvbnMsIDxFTT5VUkwgcHJlZml4PC9FTT4KLXNob3VsZCwgc2F2ZSBmb3IgcHJveHkgcmVxdWVzdHMsIGJlIG9mIHRoZSBmb3JtIDxDT0RFPi9wYXRoLzwvQ09ERT4sCi1hbmQgc2hvdWxkIG5vdCBpbmNsdWRlIHRoZSA8Q09ERT5odHRwOi8vc2VydmVybmFtZTwvQ09ERT4uIEl0IGRvZXNuJ3QKLW5lY2Vzc2FyaWx5IGhhdmUgdG8gcHJvdGVjdCBhIGRpcmVjdG9yeSAoaXQgY2FuIGJlIGFuIGluZGl2aWR1YWwKLWZpbGUsIG9yIGEgbnVtYmVyIG9mIGZpbGVzKSwgYW5kIGNhbiBpbmNsdWRlIHdpbGQtY2FyZHMuICBJbiBhIHdpbGQtY2FyZAotc3RyaW5nLCBgPycgbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciwgYW5kIGAqJyBtYXRjaGVzIGFueQotc2VxdWVuY2VzIG9mIGNoYXJhY3RlcnMuCi0KLTxQPlRoaXMgZnVuY3Rpb25hbGl0eSBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIGNvbWJpbmVkIHdpdGggdGhlCi08Q09ERT48QSBIUkVGPSJtb2QvbW9kX21pbWUuaHRtbCNzZXRoYW5kbGVyIj5TZXRIYW5kbGVyPC9BPjwvQ09ERT4KLWRpcmVjdGl2ZS4gRm9yIGV4YW1wbGUsIHRvIGVuYWJsZSBzdGF0dXMgcmVxdWVzdHMsIGJ1dCBhbGxvdyB0aGVtIG9ubHkKLWZyb20gYnJvd3NlcnMgYXQgZm9vLmNvbSwgeW91IG1pZ2h0IHVzZToKLQotPFBSRT4KLSAgICAmbHQ7TG9jYXRpb24gL3N0YXR1cyZndDsKLSAgICBTZXRIYW5kbGVyIHNlcnZlci1zdGF0dXMKLSAgICBvcmRlciBkZW55LGFsbG93Ci0gICAgZGVueSBmcm9tIGFsbAotICAgIGFsbG93IGZyb20gLmZvby5jb20KLSAgICAmbHQ7L0xvY2F0aW9uJmd0OwotPC9QUkU+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21pc2MvQVBJLmh0bWwgYi9kb2NzL21hbnVhbC9taXNjL0FQSS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjBmYjc3Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21pc2MvQVBJLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPjxIRUFEPgotPFRJVExFPkFwYWNoZSBBUEkgbm90ZXM8L1RJVExFPgotPC9IRUFEPgotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+QXBhY2hlIEFQSSBub3RlczwvSDE+Ci0KLVRoZXNlIGFyZSBzb21lIG5vdGVzIG9uIHRoZSBBcGFjaGUgQVBJIGFuZCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIHlvdQotaGF2ZSB0byBkZWFsIHdpdGgsIDxFTT5ldGMuPC9FTT4gIFRoZXkgYXJlIG5vdCB5ZXQgbmVhcmx5IGNvbXBsZXRlLCBidXQKLWhvcGVmdWxseSwgdGhleSB3aWxsIGhlbHAgeW91IGdldCB5b3VyIGJlYXJpbmdzLiAgS2VlcCBpbiBtaW5kIHRoYXQKLXRoZSBBUEkgaXMgc3RpbGwgc3ViamVjdCB0byBjaGFuZ2UgYXMgd2UgZ2FpbiBleHBlcmllbmNlIHdpdGggaXQuCi0oU2VlIHRoZSBUT0RPIGZpbGUgZm9yIHdoYXQgPEVNPm1pZ2h0PC9FTT4gYmUgY29taW5nKS4gIEhvd2V2ZXIsCi1pdCB3aWxsIGJlIGVhc3kgdG8gYWRhcHQgbW9kdWxlcyB0byBhbnkgY2hhbmdlcyB0aGF0IGFyZSBtYWRlLgotKFdlIGhhdmUgbW9yZSBtb2R1bGVzIHRvIGFkYXB0IHRoYW4geW91IGRvKS4KLTxQPgotCi1BIGZldyBub3RlcyBvbiBnZW5lcmFsIHBlZGFnb2dpY2FsIHN0eWxlIGhlcmUuICBJbiB0aGUgaW50ZXJlc3Qgb2YKLWNvbmNpc2VuZXNzLCBhbGwgc3RydWN0dXJlIGRlY2xhcmF0aW9ucyBoZXJlIGFyZSBpbmNvbXBsZXRlIC0tLSB0aGUKLXJlYWwgb25lcyBoYXZlIG1vcmUgc2xvdHMgdGhhdCBJJ20gbm90IHRlbGxpbmcgeW91IGFib3V0LiAgRm9yIHRoZQotbW9zdCBwYXJ0LCB0aGVzZSBhcmUgcmVzZXJ2ZWQgdG8gb25lIGNvbXBvbmVudCBvZiB0aGUgc2VydmVyIGNvcmUgb3IKLWFub3RoZXIsIGFuZCBzaG91bGQgYmUgYWx0ZXJlZCBieSBtb2R1bGVzIHdpdGggY2F1dGlvbi4gIEhvd2V2ZXIsIGluCi1zb21lIGNhc2VzLCB0aGV5IHJlYWxseSBhcmUgdGhpbmdzIEkganVzdCBoYXZlbid0IGdvdHRlbiBhcm91bmQgdG8KLXlldC4gIFdlbGNvbWUgdG8gdGhlIGJsZWVkaW5nIGVkZ2UuPFA+Ci0KLUZpbmFsbHksIGhlcmUncyBhbiBvdXRsaW5lLCB0byBnaXZlIHlvdSBzb21lIGJhcmUgaWRlYSBvZiB3aGF0J3MKLWNvbWluZyB1cCwgYW5kIGluIHdoYXQgb3JkZXI6Ci0KLTxVTD4KLTxMST4gPEEgSFJFRj0iI2Jhc2ljcyI+QmFzaWMgY29uY2VwdHMuPC9BPgotPE1FTlU+Ci0gPExJPiA8QSBIUkVGPSIjSE1SIj5IYW5kbGVycywgTW9kdWxlcywgYW5kIFJlcXVlc3RzPC9BPgotIDxMST4gPEEgSFJFRj0iI21vZHVsZXRvdXIiPkEgYnJpZWYgdG91ciBvZiBhIG1vZHVsZTwvQT4KLTwvTUVOVT4KLTxMST4gPEEgSFJFRj0iI2hhbmRsZXJzIj5Ib3cgaGFuZGxlcnMgd29yazwvQT4KLTxNRU5VPgotIDxMST4gPEEgSFJFRj0iI3JlcV90b3VyIj5BIGJyaWVmIHRvdXIgb2YgdGhlIDxDT0RFPnJlcXVlc3RfcmVjPC9DT0RFPjwvQT4KLSA8TEk+IDxBIEhSRUY9IiNyZXFfb3JpZyI+V2hlcmUgcmVxdWVzdF9yZWMgc3RydWN0dXJlcyBjb21lIGZyb208L0E+Ci0gPExJPiA8QSBIUkVGPSIjcmVxX3JldHVybiI+SGFuZGxpbmcgcmVxdWVzdHMsIGRlY2xpbmluZywgYW5kIHJldHVybmluZyBlcnJvcgotICBjb2RlczwvQT4KLSA8TEk+IDxBIEhSRUY9IiNyZXNwX2hhbmRsZXJzIj5TcGVjaWFsIGNvbnNpZGVyYXRpb25zIGZvciByZXNwb25zZSBoYW5kbGVyczwvQT4KLSA8TEk+IDxBIEhSRUY9IiNhdXRoX2hhbmRsZXJzIj5TcGVjaWFsIGNvbnNpZGVyYXRpb25zIGZvciBhdXRoZW50aWNhdGlvbgotICBoYW5kbGVyczwvQT4KLSA8TEk+IDxBIEhSRUY9IiNsb2dfaGFuZGxlcnMiPlNwZWNpYWwgY29uc2lkZXJhdGlvbnMgZm9yIGxvZ2dpbmcgaGFuZGxlcnM8L0E+Ci08L01FTlU+Ci08TEk+IDxBIEhSRUY9IiNwb29scyI+UmVzb3VyY2UgYWxsb2NhdGlvbiBhbmQgcmVzb3VyY2UgcG9vbHM8L0E+Ci08TEk+IDxBIEhSRUY9IiNjb25maWciPkNvbmZpZ3VyYXRpb24sIGNvbW1hbmRzIGFuZCB0aGUgbGlrZTwvQT4KLTxNRU5VPgotIDxMST4gPEEgSFJFRj0iI3Blci1kaXIiPlBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmVzPC9BPgotIDxMST4gPEEgSFJFRj0iI2NvbW1hbmRzIj5Db21tYW5kIGhhbmRsaW5nPC9BPgotIDxMST4gPEEgSFJFRj0iI3NlcnZjb25mIj5TaWRlIG5vdGVzIC0tLSBwZXItc2VydmVyIGNvbmZpZ3VyYXRpb24sCi0gIHZpcnR1YWwgc2VydmVycywgPEVNPmV0YzwvRU0+LjwvQT4KLTwvTUVOVT4KLTwvVUw+Ci0KLTxIMj48QSBOQU1FPSJiYXNpY3MiPkJhc2ljIGNvbmNlcHRzLjwvQT48L0gyPgotCi1XZSBiZWdpbiB3aXRoIGFuIG92ZXJ2aWV3IG9mIHRoZSBiYXNpYyBjb25jZXB0cyBiZWhpbmQgdGhlCi1BUEksIGFuZCBob3cgdGhleSBhcmUgbWFuaWZlc3RlZCBpbiB0aGUgY29kZS4KLQotPEgzPjxBIE5BTUU9IkhNUiI+SGFuZGxlcnMsIE1vZHVsZXMsIGFuZCBSZXF1ZXN0czwvQT48L0gzPgotCi1BcGFjaGUgYnJlYWtzIGRvd24gcmVxdWVzdCBoYW5kbGluZyBpbnRvIGEgc2VyaWVzIG9mIHN0ZXBzLCBtb3JlIG9yCi1sZXNzIHRoZSBzYW1lIHdheSB0aGUgTmV0c2NhcGUgc2VydmVyIEFQSSBkb2VzIChhbHRob3VnaCB0aGlzIEFQSSBoYXMKLWEgZmV3IG1vcmUgc3RhZ2VzIHRoYW4gTmV0U2l0ZSBkb2VzLCBhcyBob29rcyBmb3Igc3R1ZmYgSSB0aG91Z2h0Ci1taWdodCBiZSB1c2VmdWwgaW4gdGhlIGZ1dHVyZSkuICBUaGVzZSBhcmU6Ci0KLTxVTD4KLSAgPExJPiBVUkkgLSZndDsgRmlsZW5hbWUgdHJhbnNsYXRpb24KLSAgPExJPiBBdXRoIElEIGNoZWNraW5nIFtpcyB0aGUgdXNlciB3aG8gdGhleSBzYXkgdGhleSBhcmU/XQotICA8TEk+IEF1dGggYWNjZXNzIGNoZWNraW5nIFtpcyB0aGUgdXNlciBhdXRob3JpemVkIDxFTT5oZXJlPC9FTT4/XQotICA8TEk+IEFjY2VzcyBjaGVja2luZyBvdGhlciB0aGFuIGF1dGgKLSAgPExJPiBEZXRlcm1pbmluZyBNSU1FIHR5cGUgb2YgdGhlIG9iamVjdCByZXF1ZXN0ZWQKLSAgPExJPiBgRml4dXBzJyAtLS0gdGhlcmUgYXJlbid0IGFueSBvZiB0aGVzZSB5ZXQsIGJ1dCB0aGUgcGhhc2UgaXMKLSAgICAgICBpbnRlbmRlZCBhcyBhIGhvb2sgZm9yIHBvc3NpYmxlIGV4dGVuc2lvbnMgbGlrZQotICAgICAgIDxDT0RFPlNldEVudjwvQ09ERT4sIHdoaWNoIGRvbid0IHJlYWxseSBmaXQgd2VsbCBlbHNld2hlcmUuCi0gIDxMST4gQWN0dWFsbHkgc2VuZGluZyBhIHJlc3BvbnNlIGJhY2sgdG8gdGhlIGNsaWVudC4KLSAgPExJPiBMb2dnaW5nIHRoZSByZXF1ZXN0Ci08L1VMPgotCi1UaGVzZSBwaGFzZXMgYXJlIGhhbmRsZWQgYnkgbG9va2luZyBhdCBlYWNoIG9mIGEgc3VjY2Vzc2lvbiBvZgotPEVNPm1vZHVsZXM8L0VNPiwgbG9va2luZyB0byBzZWUgaWYgZWFjaCBvZiB0aGVtIGhhcyBhIGhhbmRsZXIgZm9yIHRoZQotcGhhc2UsIGFuZCBhdHRlbXB0aW5nIGludm9raW5nIGl0IGlmIHNvLiAgVGhlIGhhbmRsZXIgY2FuIHR5cGljYWxseSBkbwotb25lIG9mIHRocmVlIHRoaW5nczoKLQotPFVMPgotICA8TEk+IDxFTT5IYW5kbGU8L0VNPiB0aGUgcmVxdWVzdCwgYW5kIGluZGljYXRlIHRoYXQgaXQgaGFzIGRvbmUgc28KLSAgICAgICBieSByZXR1cm5pbmcgdGhlIG1hZ2ljIGNvbnN0YW50IDxDT0RFPk9LPC9DT0RFPi4KLSAgPExJPiA8RU0+RGVjbGluZTwvRU0+IHRvIGhhbmRsZSB0aGUgcmVxdWVzdCwgYnkgcmV0dXJuaW5nIHRoZSBtYWdpYwotICAgICAgIGludGVnZXIgY29uc3RhbnQgPENPREU+REVDTElORUQ8L0NPREU+LiAgSW4gdGhpcyBjYXNlLCB0aGUKLSAgICAgICBzZXJ2ZXIgYmVoYXZlcyBpbiBhbGwgcmVzcGVjdHMgYXMgaWYgdGhlIGhhbmRsZXIgc2ltcGx5IGhhZG4ndAotICAgICAgIGJlZW4gdGhlcmUuCi0gIDxMST4gU2lnbmFsIGFuIGVycm9yLCBieSByZXR1cm5pbmcgb25lIG9mIHRoZSBIVFRQIGVycm9yIGNvZGVzLgotICAgICAgIFRoaXMgdGVybWluYXRlcyBub3JtYWwgaGFuZGxpbmcgb2YgdGhlIHJlcXVlc3QsIGFsdGhvdWdoIGFuCi0gICAgICAgRXJyb3JEb2N1bWVudCBtYXkgYmUgaW52b2tlZCB0byB0cnkgdG8gbW9wIHVwLCBhbmQgaXQgd2lsbCBiZQotICAgICAgIGxvZ2dlZCBpbiBhbnkgY2FzZS4KLTwvVUw+Ci0KLU1vc3QgcGhhc2VzIGFyZSB0ZXJtaW5hdGVkIGJ5IHRoZSBmaXJzdCBtb2R1bGUgdGhhdCBoYW5kbGVzIHRoZW07Ci1ob3dldmVyLCBmb3IgbG9nZ2luZywgYGZpeHVwcycsIGFuZCBub24tYWNjZXNzIGF1dGhlbnRpY2F0aW9uCi1jaGVja2luZywgYWxsIGhhbmRsZXJzIGFsd2F5cyBydW4gKGJhcnJpbmcgYW4gZXJyb3IpLiAgQWxzbywgdGhlCi1yZXNwb25zZSBwaGFzZSBpcyB1bmlxdWUgaW4gdGhhdCBtb2R1bGVzIG1heSBkZWNsYXJlIG11bHRpcGxlIGhhbmRsZXJzCi1mb3IgaXQsIHZpYSBhIGRpc3BhdGNoIHRhYmxlIGtleWVkIG9uIHRoZSBNSU1FIHR5cGUgb2YgdGhlIHJlcXVlc3RlZAotb2JqZWN0LiAgTW9kdWxlcyBtYXkgZGVjbGFyZSBhIHJlc3BvbnNlLXBoYXNlIGhhbmRsZXIgd2hpY2ggY2FuIGhhbmRsZQotPEVNPmFueTwvRU0+IHJlcXVlc3QsIGJ5IGdpdmluZyBpdCB0aGUga2V5IDxDT0RFPiovKjwvQ09ERT4gKDxFTT5pLmUuPC9FTT4sIGEKLXdpbGRjYXJkIE1JTUUgdHlwZSBzcGVjaWZpY2F0aW9uKS4gIEhvd2V2ZXIsIHdpbGRjYXJkIGhhbmRsZXJzIGFyZQotb25seSBpbnZva2VkIGlmIHRoZSBzZXJ2ZXIgaGFzIGFscmVhZHkgdHJpZWQgYW5kIGZhaWxlZCB0byBmaW5kIGEgbW9yZQotc3BlY2lmaWMgcmVzcG9uc2UgaGFuZGxlciBmb3IgdGhlIE1JTUUgdHlwZSBvZiB0aGUgcmVxdWVzdGVkIG9iamVjdAotKGVpdGhlciBub25lIGV4aXN0ZWQsIG9yIHRoZXkgYWxsIGRlY2xpbmVkKS48UD4KLQotVGhlIGhhbmRsZXJzIHRoZW1zZWx2ZXMgYXJlIGZ1bmN0aW9ucyBvZiBvbmUgYXJndW1lbnQgKGEKLTxDT0RFPnJlcXVlc3RfcmVjPC9DT0RFPiBzdHJ1Y3R1cmUuIHZpZGUgaW5mcmEpLCB3aGljaCByZXR1cm5zIGFuCi1pbnRlZ2VyLCBhcyBhYm92ZS48UD4KLQotPEgzPjxBIE5BTUU9Im1vZHVsZXRvdXIiPkEgYnJpZWYgdG91ciBvZiBhIG1vZHVsZTwvQT48L0gzPgotCi1BdCB0aGlzIHBvaW50LCB3ZSBuZWVkIHRvIGV4cGxhaW4gdGhlIHN0cnVjdHVyZSBvZiBhIG1vZHVsZS4gIE91cgotY2FuZGlkYXRlIHdpbGwgYmUgb25lIG9mIHRoZSBtZXNzaWVyIG9uZXMsIHRoZSBDR0kgbW9kdWxlIC0tLSB0aGlzCi1oYW5kbGVzIGJvdGggQ0dJIHNjcmlwdHMgYW5kIHRoZSA8Q09ERT5TY3JpcHRBbGlhczwvQ09ERT4gY29uZmlnIGZpbGUKLWNvbW1hbmQuICBJdCdzIGFjdHVhbGx5IGEgZ3JlYXQgZGVhbCBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gbW9zdAotbW9kdWxlcywgYnV0IGlmIHdlJ3JlIGdvaW5nIHRvIGhhdmUgb25seSBvbmUgZXhhbXBsZSwgaXQgbWlnaHQgYXMgd2VsbAotYmUgdGhlIG9uZSB3aXRoIGl0cyBmaW5nZXJzIGluIGV2ZXJ5IHBsYWNlLjxQPgotCi1MZXQncyBiZWdpbiB3aXRoIGhhbmRsZXJzLiAgSW4gb3JkZXIgdG8gaGFuZGxlIHRoZSBDR0kgc2NyaXB0cywgdGhlCi1tb2R1bGUgZGVjbGFyZXMgYSByZXNwb25zZSBoYW5kbGVyIGZvciB0aGVtLiBCZWNhdXNlIG9mCi08Q09ERT5TY3JpcHRBbGlhczwvQ09ERT4sIGl0IGFsc28gaGFzIGhhbmRsZXJzIGZvciB0aGUgbmFtZQotdHJhbnNsYXRpb24gcGhhc2UgKHRvIHJlY29nbml6ZSA8Q09ERT5TY3JpcHRBbGlhczwvQ09ERT5lZCBVUklzKSwgdGhlCi10eXBlLWNoZWNraW5nIHBoYXNlIChhbnkgPENPREU+U2NyaXB0QWxpYXM8L0NPREU+ZWQgcmVxdWVzdCBpcyB0eXBlZAotYXMgYSBDR0kgc2NyaXB0KS48UD4KLQotVGhlIG1vZHVsZSBuZWVkcyB0byBtYWludGFpbiBzb21lIHBlciAodmlydHVhbCkKLXNlcnZlciBpbmZvcm1hdGlvbiwgbmFtZWx5LCB0aGUgPENPREU+U2NyaXB0QWxpYXM8L0NPREU+ZXMgaW4gZWZmZWN0OwotdGhlIG1vZHVsZSBzdHJ1Y3R1cmUgdGhlcmVmb3JlIGNvbnRhaW5zIHBvaW50ZXJzIHRvIGEgZnVuY3Rpb25zIHdoaWNoCi1idWlsZHMgdGhlc2Ugc3RydWN0dXJlcywgYW5kIHRvIGFub3RoZXIgd2hpY2ggY29tYmluZXMgdHdvIG9mIHRoZW0gKGluCi1jYXNlIHRoZSBtYWluIHNlcnZlciBhbmQgYSB2aXJ0dWFsIHNlcnZlciBib3RoIGhhdmUKLTxDT0RFPlNjcmlwdEFsaWFzPC9DT0RFPmVzIGRlY2xhcmVkKS48UD4KLQotRmluYWxseSwgdGhpcyBtb2R1bGUgY29udGFpbnMgY29kZSB0byBoYW5kbGUgdGhlCi08Q09ERT5TY3JpcHRBbGlhczwvQ09ERT4gY29tbWFuZCBpdHNlbGYuICBUaGlzIHBhcnRpY3VsYXIgbW9kdWxlIG9ubHkKLWRlY2xhcmVzIG9uZSBjb21tYW5kLCBidXQgdGhlcmUgY291bGQgYmUgbW9yZSwgc28gbW9kdWxlcyBoYXZlCi08RU0+Y29tbWFuZCB0YWJsZXM8L0VNPiB3aGljaCBkZWNsYXJlIHRoZWlyIGNvbW1hbmRzLCBhbmQgZGVzY3JpYmUKLXdoZXJlIHRoZXkgYXJlIHBlcm1pdHRlZCwgYW5kIGhvdyB0aGV5IGFyZSB0byBiZSBpbnZva2VkLiAgPFA+Ci0KLUEgZmluYWwgbm90ZSBvbiB0aGUgZGVjbGFyZWQgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyBvZiBzb21lIG9mIHRoZXNlCi1jb21tYW5kczogYSA8Q09ERT5wb29sPC9DT0RFPiBpcyBhIHBvaW50ZXIgdG8gYSA8RU0+cmVzb3VyY2UgcG9vbDwvRU0+Ci1zdHJ1Y3R1cmU7IHRoZXNlIGFyZSB1c2VkIGJ5IHRoZSBzZXJ2ZXIgdG8ga2VlcCB0cmFjayBvZiB0aGUgbWVtb3J5Ci13aGljaCBoYXMgYmVlbiBhbGxvY2F0ZWQsIGZpbGVzIG9wZW5lZCwgPEVNPmV0Yy48L0VNPiwgZWl0aGVyIHRvIHNlcnZpY2UgYQotcGFydGljdWxhciByZXF1ZXN0LCBvciB0byBoYW5kbGUgdGhlIHByb2Nlc3Mgb2YgY29uZmlndXJpbmcgaXRzZWxmLgotVGhhdCB3YXksIHdoZW4gdGhlIHJlcXVlc3QgaXMgb3ZlciAob3IsIGZvciB0aGUgY29uZmlndXJhdGlvbiBwb29sLAotd2hlbiB0aGUgc2VydmVyIGlzIHJlc3RhcnRpbmcpLCB0aGUgbWVtb3J5IGNhbiBiZSBmcmVlZCwgYW5kIHRoZSBmaWxlcwotY2xvc2VkLCA8RU0+ZW4gbWFzc2U8L0VNPiwgd2l0aG91dCBhbnlvbmUgaGF2aW5nIHRvIHdyaXRlIGV4cGxpY2l0IGNvZGUgdG8KLXRyYWNrIHRoZW0gYWxsIGRvd24gYW5kIGRpc3Bvc2Ugb2YgdGhlbS4gIEFsc28sIGEKLTxDT0RFPmNtZF9wYXJtczwvQ09ERT4gc3RydWN0dXJlIGNvbnRhaW5zIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQKLXRoZSBjb25maWcgZmlsZSBiZWluZyByZWFkLCBhbmQgb3RoZXIgc3RhdHVzIGluZm9ybWF0aW9uLCB3aGljaCBpcwotc29tZXRpbWVzIG9mIHVzZSB0byB0aGUgZnVuY3Rpb24gd2hpY2ggcHJvY2Vzc2VzIGEgY29uZmlnLWZpbGUgY29tbWFuZAotKHN1Y2ggYXMgPENPREU+U2NyaXB0QWxpYXM8L0NPREU+KS4KLQotV2l0aCBubyBmdXJ0aGVyIGFkbywgdGhlIG1vZHVsZSBpdHNlbGY6Ci0KLTxQUkU+Ci0vKiBEZWNsYXJhdGlvbnMgb2YgaGFuZGxlcnMuICovCi0KLWludCB0cmFuc2xhdGVfc2NyaXB0YWxpYXMgKHJlcXVlc3RfcmVjICopOwotaW50IHR5cGVfc2NyaXB0YWxpYXMgKHJlcXVlc3RfcmVjICopOwotaW50IGNnaV9oYW5kbGVyIChyZXF1ZXN0X3JlYyAqKTsKLQotLyogU3Vic2lkaWFyeSBkaXNwYXRjaCB0YWJsZSBmb3IgcmVzcG9uc2UtcGhhc2UgaGFuZGxlcnMsIGJ5IE1JTUUgdHlwZSAqLwotCi1oYW5kbGVyX3JlYyBjZ2lfaGFuZGxlcnNbXSA9IHsKLXsgImFwcGxpY2F0aW9uL3gtaHR0cGQtY2dpIiwgY2dpX2hhbmRsZXIgfSwKLXsgTlVMTCB9Ci19OwotCi0vKiBEZWNsYXJhdGlvbnMgb2Ygcm91dGluZXMgdG8gbWFuaXB1bGF0ZSB0aGUgbW9kdWxlJ3MgY29uZmlndXJhdGlvbgotICogaW5mby4gIE5vdGUgdGhhdCB0aGVzZSBhcmUgcmV0dXJuZWQsIGFuZCBwYXNzZWQgaW4sIGFzIHZvaWQgKidzOwotICogdGhlIHNlcnZlciBjb3JlIGtlZXBzIHRyYWNrIG9mIHRoZW0sIGJ1dCBpdCBkb2Vzbid0LCBhbmQgY2FuJ3QsCi0gKiBrbm93IHRoZWlyIGludGVybmFsIHN0cnVjdHVyZS4KLSAqLwotCi12b2lkICptYWtlX2NnaV9zZXJ2ZXJfY29uZmlnIChwb29sICopOwotdm9pZCAqbWVyZ2VfY2dpX3NlcnZlcl9jb25maWcgKHBvb2wgKiwgdm9pZCAqLCB2b2lkICopOwotCi0vKiBEZWNsYXJhdGlvbnMgb2Ygcm91dGluZXMgdG8gaGFuZGxlIGNvbmZpZy1maWxlIGNvbW1hbmRzICovCi0KLWV4dGVybiBjaGFyICpzY3JpcHRfYWxpYXMoY21kX3Bhcm1zICosIHZvaWQgKnBlcl9kaXJfY29uZmlnLCBjaGFyICpmYWtlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpyZWFsKTsKLQotY29tbWFuZF9yZWMgY2dpX2NtZHNbXSA9IHsKLXsgIlNjcmlwdEFsaWFzIiwgc2NyaXB0X2FsaWFzLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UyLAotICAgICJhIGZha2VuYW1lIGFuZCBhIHJlYWxuYW1lIn0sCi17IE5VTEwgfQotfTsKLQotbW9kdWxlIGNnaV9tb2R1bGUgPSB7Ci0gICBTVEFOREFSRF9NT0RVTEVfU1RVRkYsCi0gICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemVyICovCi0gICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIGRpciBjb25maWcgY3JlYXRvciAqLwotICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBkaXIgbWVyZ2VyIC0tLSBkZWZhdWx0IGlzIHRvIG92ZXJyaWRlICovCi0gICBtYWtlX2NnaV9zZXJ2ZXJfY29uZmlnLCAgIC8qIHNlcnZlciBjb25maWcgKi8KLSAgIG1lcmdlX2NnaV9zZXJ2ZXJfY29uZmlnLCAgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLwotICAgY2dpX2NtZHMsICAgICAgICAgICAgICAgICAvKiBjb21tYW5kIHRhYmxlICovCi0gICBjZ2lfaGFuZGxlcnMsICAgICAgICAgICAgIC8qIGhhbmRsZXJzICovCi0gICB0cmFuc2xhdGVfc2NyaXB0YWxpYXMsICAgIC8qIGZpbGVuYW1lIHRyYW5zbGF0aW9uICovCi0gICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrX3VzZXJfaWQgKi8KLSAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgYXV0aCAqLwotICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBhY2Nlc3MgKi8KLSAgIHR5cGVfc2NyaXB0YWxpYXMsICAgICAgICAgLyogdHlwZV9jaGVja2VyICovCi0gICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIGZpeHVwcyAqLwotICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBsb2dnZXIgKi8KLSAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgLyogaGVhZGVyIHBhcnNlciAqLwotfTsKLTwvUFJFPgotCi08SDI+PEEgTkFNRT0iaGFuZGxlcnMiPkhvdyBoYW5kbGVycyB3b3JrPC9BPjwvSDI+Ci0KLVRoZSBzb2xlIGFyZ3VtZW50IHRvIGhhbmRsZXJzIGlzIGEgPENPREU+cmVxdWVzdF9yZWM8L0NPREU+IHN0cnVjdHVyZS4KLVRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhIHBhcnRpY3VsYXIgcmVxdWVzdCB3aGljaCBoYXMgYmVlbiBtYWRlIHRvCi10aGUgc2VydmVyLCBvbiBiZWhhbGYgb2YgYSBjbGllbnQuICBJbiBtb3N0IGNhc2VzLCBlYWNoIGNvbm5lY3Rpb24gdG8KLXRoZSBjbGllbnQgZ2VuZXJhdGVzIG9ubHkgb25lIDxDT0RFPnJlcXVlc3RfcmVjPC9DT0RFPiBzdHJ1Y3R1cmUuPFA+Ci0KLTxIMz48QSBOQU1FPSJyZXFfdG91ciI+QSBicmllZiB0b3VyIG9mIHRoZSA8Q09ERT5yZXF1ZXN0X3JlYzwvQ09ERT48L0E+PC9IMz4KLQotVGhlIDxDT0RFPnJlcXVlc3RfcmVjPC9DT0RFPiBjb250YWlucyBwb2ludGVycyB0byBhIHJlc291cmNlIHBvb2wKLXdoaWNoIHdpbGwgYmUgY2xlYXJlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgZmluaXNoZWQgaGFuZGxpbmcgdGhlCi1yZXF1ZXN0OyB0byBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgcGVyLXNlcnZlciBhbmQgcGVyLWNvbm5lY3Rpb24KLWluZm9ybWF0aW9uLCBhbmQgbW9zdCBpbXBvcnRhbnRseSwgaW5mb3JtYXRpb24gb24gdGhlIHJlcXVlc3QgaXRzZWxmLjxQPgotCi1UaGUgbW9zdCBpbXBvcnRhbnQgc3VjaCBpbmZvcm1hdGlvbiBpcyBhIHNtYWxsIHNldCBvZiBjaGFyYWN0ZXIKLXN0cmluZ3MgZGVzY3JpYmluZyBhdHRyaWJ1dGVzIG9mIHRoZSBvYmplY3QgYmVpbmcgcmVxdWVzdGVkLCBpbmNsdWRpbmcKLWl0cyBVUkksIGZpbGVuYW1lLCBjb250ZW50LXR5cGUgYW5kIGNvbnRlbnQtZW5jb2RpbmcgKHRoZXNlIGJlaW5nIGZpbGxlZAotaW4gYnkgdGhlIHRyYW5zbGF0aW9uIGFuZCB0eXBlLWNoZWNrIGhhbmRsZXJzIHdoaWNoIGhhbmRsZSB0aGUKLXJlcXVlc3QsIHJlc3BlY3RpdmVseSkuIDxQPgotCi1PdGhlciBjb21tb25seSB1c2VkIGRhdGEgaXRlbXMgYXJlIHRhYmxlcyBnaXZpbmcgdGhlIE1JTUUgaGVhZGVycyBvbgotdGhlIGNsaWVudCdzIG9yaWdpbmFsIHJlcXVlc3QsIE1JTUUgaGVhZGVycyB0byBiZSBzZW50IGJhY2sgd2l0aCB0aGUKLXJlc3BvbnNlICh3aGljaCBtb2R1bGVzIGNhbiBhZGQgdG8gYXQgd2lsbCksIGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLWZvciBhbnkgc3VicHJvY2Vzc2VzIHdoaWNoIGFyZSBzcGF3bmVkIG9mZiBpbiB0aGUgY291cnNlIG9mIHNlcnZpY2luZwotdGhlIHJlcXVlc3QuICBUaGVzZSB0YWJsZXMgYXJlIG1hbmlwdWxhdGVkIHVzaW5nIHRoZQotPENPREU+YXBfdGFibGVfZ2V0PC9DT0RFPiBhbmQgPENPREU+YXBfdGFibGVfc2V0PC9DT0RFPiByb3V0aW5lcy4gPFA+Ci08QkxPQ0tRVU9URT4KLSBOb3RlIHRoYXQgdGhlIDxTQU1QPkNvbnRlbnQtdHlwZTwvU0FNUD4gaGVhZGVyIHZhbHVlIDxFTT5jYW5ub3Q8L0VNPiBiZQotIHNldCBieSBtb2R1bGUgY29udGVudC1oYW5kbGVycyB1c2luZyB0aGUgPFNBTVA+YXBfdGFibGVfKigpPC9TQU1QPgotIHJvdXRpbmVzLiAgUmF0aGVyLCBpdCBpcyBzZXQgYnkgcG9pbnRpbmcgdGhlIDxTQU1QPmNvbnRlbnRfdHlwZTwvU0FNUD4KLSBmaWVsZCBpbiB0aGUgPFNBTVA+cmVxdWVzdF9yZWM8L1NBTVA+IHN0cnVjdHVyZSB0byBhbiBhcHByb3ByaWF0ZQotIHN0cmluZy4gIDxFTT5FLmcuPC9FTT4sCi0gPFBSRT4KLSAgci0mZ3Q7Y29udGVudF90eXBlID0gInRleHQvaHRtbCI7Ci0gPC9QUkU+Ci08L0JMT0NLUVVPVEU+Ci1GaW5hbGx5LCB0aGVyZSBhcmUgcG9pbnRlcnMgdG8gdHdvIGRhdGEgc3RydWN0dXJlcyB3aGljaCwgaW4gdHVybiwKLXBvaW50IHRvIHBlci1tb2R1bGUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmVzLiAgU3BlY2lmaWNhbGx5LCB0aGVzZQotaG9sZCBwb2ludGVycyB0byB0aGUgZGF0YSBzdHJ1Y3R1cmVzIHdoaWNoIHRoZSBtb2R1bGUgaGFzIGJ1aWx0IHRvCi1kZXNjcmliZSB0aGUgd2F5IGl0IGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8gb3BlcmF0ZSBpbiBhIGdpdmVuCi1kaXJlY3RvcnkgKHZpYSA8Q09ERT4uaHRhY2Nlc3M8L0NPREU+IGZpbGVzIG9yCi08Q09ERT4mbHQ7RGlyZWN0b3J5Jmd0OzwvQ09ERT4gc2VjdGlvbnMpLCBmb3IgcHJpdmF0ZSBkYXRhIGl0IGhhcwotYnVpbHQgaW4gdGhlIGNvdXJzZSBvZiBzZXJ2aWNpbmcgdGhlIHJlcXVlc3QgKHNvIG1vZHVsZXMnIGhhbmRsZXJzIGZvcgotb25lIHBoYXNlIGNhbiBwYXNzIGBub3RlcycgdG8gdGhlaXIgaGFuZGxlcnMgZm9yIG90aGVyIHBoYXNlcykuICBUaGVyZQotaXMgYW5vdGhlciBzdWNoIGNvbmZpZ3VyYXRpb24gdmVjdG9yIGluIHRoZSA8Q09ERT5zZXJ2ZXJfcmVjPC9DT0RFPgotZGF0YSBzdHJ1Y3R1cmUgcG9pbnRlZCB0byBieSB0aGUgPENPREU+cmVxdWVzdF9yZWM8L0NPREU+LCB3aGljaAotY29udGFpbnMgcGVyICh2aXJ0dWFsKSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBkYXRhLjxQPgotCi1IZXJlIGlzIGFuIGFicmlkZ2VkIGRlY2xhcmF0aW9uLCBnaXZpbmcgdGhlIGZpZWxkcyBtb3N0IGNvbW1vbmx5IHVzZWQ6PFA+Ci0KLTxQUkU+Ci1zdHJ1Y3QgcmVxdWVzdF9yZWMgewotCi0gIHBvb2wgKnBvb2w7Ci0gIGNvbm5fcmVjICpjb25uZWN0aW9uOwotICBzZXJ2ZXJfcmVjICpzZXJ2ZXI7Ci0KLSAgLyogV2hhdCBvYmplY3QgaXMgYmVpbmcgcmVxdWVzdGVkICovCi0KLSAgY2hhciAqdXJpOwotICBjaGFyICpmaWxlbmFtZTsKLSAgY2hhciAqcGF0aF9pbmZvOwotICBjaGFyICphcmdzOyAgICAgICAgICAgLyogUVVFUllfQVJHUywgaWYgYW55ICovCi0gIHN0cnVjdCBzdGF0IGZpbmZvOyAgICAvKiBTZXQgYnkgc2VydmVyIGNvcmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiBzdF9tb2RlIHNldCB0byB6ZXJvIGlmIG5vIHN1Y2ggZmlsZSAqLwotCi0gIGNoYXIgKmNvbnRlbnRfdHlwZTsKLSAgY2hhciAqY29udGVudF9lbmNvZGluZzsKLQotICAvKiBNSU1FIGhlYWRlciBlbnZpcm9ubWVudHMsIGluIGFuZCBvdXQuICBBbHNvLCBhbiBhcnJheSBjb250YWluaW5nCi0gICAqIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBiZSBwYXNzZWQgdG8gc3VicHJvY2Vzc2VzLCBzbyBwZW9wbGUgY2FuCi0gICAqIHdyaXRlIG1vZHVsZXMgdG8gYWRkIHRvIHRoYXQgZW52aXJvbm1lbnQuCi0gICAqCi0gICAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gaGVhZGVyc19vdXQgYW5kIGVycl9oZWFkZXJzX291dCBpcyB0aGF0Ci0gICAqIHRoZSBsYXR0ZXIgYXJlIHByaW50ZWQgZXZlbiBvbiBlcnJvciwgYW5kIHBlcnNpc3QgYWNyb3NzIGludGVybmFsCi0gICAqIHJlZGlyZWN0cyAoc28gdGhlIGhlYWRlcnMgcHJpbnRlZCBmb3IgRXJyb3JEb2N1bWVudCBoYW5kbGVycyB3aWxsCi0gICAqIGhhdmUgdGhlbSkuCi0gICAqLwotCi0gIHRhYmxlICpoZWFkZXJzX2luOwotICB0YWJsZSAqaGVhZGVyc19vdXQ7Ci0gIHRhYmxlICplcnJfaGVhZGVyc19vdXQ7Ci0gIHRhYmxlICpzdWJwcm9jZXNzX2VudjsKLQotICAvKiBJbmZvIGFib3V0IHRoZSByZXF1ZXN0IGl0c2VsZi4uLiAqLwotCi0gIGludCBoZWFkZXJfb25seTsgICAgIC8qIEhFQUQgcmVxdWVzdCwgYXMgb3Bwb3NlZCB0byBHRVQgKi8KLSAgY2hhciAqcHJvdG9jb2w7ICAgICAgLyogUHJvdG9jb2wsIGFzIGdpdmVuIHRvIHVzLCBvciBIVFRQLzAuOSAqLwotICBjaGFyICptZXRob2Q7ICAgICAgICAvKiBHRVQsIEhFQUQsIFBPU1QsIDxFTT5ldGMuPC9FTT4gKi8KLSAgaW50IG1ldGhvZF9udW1iZXI7ICAgLyogTV9HRVQsIE1fUE9TVCwgPEVNPmV0Yy48L0VNPiAqLwotCi0gIC8qIEluZm8gZm9yIGxvZ2dpbmcgKi8KLQotICBjaGFyICp0aGVfcmVxdWVzdDsKLSAgaW50IGJ5dGVzX3NlbnQ7Ci0KLSAgLyogQSBmbGFnIHdoaWNoIG1vZHVsZXMgY2FuIHNldCwgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZGF0YSBiZWluZwotICAgKiByZXR1cm5lZCBpcyB2b2xhdGlsZSwgYW5kIGNsaWVudHMgc2hvdWxkIGJlIHRvbGQgbm90IHRvIGNhY2hlIGl0LgotICAgKi8KLQotICBpbnQgbm9fY2FjaGU7Ci0KLSAgLyogVmFyaW91cyBvdGhlciBjb25maWcgaW5mbyB3aGljaCBtYXkgY2hhbmdlIHdpdGggLmh0YWNjZXNzIGZpbGVzCi0gICAqIFRoZXNlIGFyZSBjb25maWcgdmVjdG9ycywgd2l0aCBvbmUgdm9pZCogcG9pbnRlciBmb3IgZWFjaCBtb2R1bGUKLSAgICogKHRoZSB0aGluZyBwb2ludGVkIHRvIGJlaW5nIHRoZSBtb2R1bGUncyBidXNpbmVzcykuCi0gICAqLwotCi0gIHZvaWQgKnBlcl9kaXJfY29uZmlnOyAgIC8qIE9wdGlvbnMgc2V0IGluIGNvbmZpZyBmaWxlcywgPEVNPmV0Yy48L0VNPiAqLwotICB2b2lkICpyZXF1ZXN0X2NvbmZpZzsgICAvKiBOb3RlcyBvbiAqdGhpcyogcmVxdWVzdCAqLwotCi19OwotCi08L1BSRT4KLQotPEgzPjxBIE5BTUU9InJlcV9vcmlnIj5XaGVyZSByZXF1ZXN0X3JlYyBzdHJ1Y3R1cmVzIGNvbWUgZnJvbTwvQT48L0gzPgotCi1Nb3N0IDxDT0RFPnJlcXVlc3RfcmVjPC9DT0RFPiBzdHJ1Y3R1cmVzIGFyZSBidWlsdCBieSByZWFkaW5nIGFuIEhUVFAKLXJlcXVlc3QgZnJvbSBhIGNsaWVudCwgYW5kIGZpbGxpbmcgaW4gdGhlIGZpZWxkcy4gIEhvd2V2ZXIsIHRoZXJlIGFyZQotYSBmZXcgZXhjZXB0aW9uczoKLQotPFVMPgotICA8TEk+IElmIHRoZSByZXF1ZXN0IGlzIHRvIGFuIGltYWdlbWFwLCBhIHR5cGUgbWFwICg8RU0+aS5lLjwvRU0+LCBhCi0gICAgICAgPENPREU+Ki52YXI8L0NPREU+IGZpbGUpLCBvciBhIENHSSBzY3JpcHQgd2hpY2ggcmV0dXJuZWQgYQotICAgICAgIGxvY2FsIGBMb2NhdGlvbjonLCB0aGVuIHRoZSByZXNvdXJjZSB3aGljaCB0aGUgdXNlciByZXF1ZXN0ZWQKLSAgICAgICBpcyBnb2luZyB0byBiZSB1bHRpbWF0ZWx5IGxvY2F0ZWQgYnkgc29tZSBVUkkgb3RoZXIgdGhhbiB3aGF0Ci0gICAgICAgdGhlIGNsaWVudCBvcmlnaW5hbGx5IHN1cHBsaWVkLiAgSW4gdGhpcyBjYXNlLCB0aGUgc2VydmVyIGRvZXMKLSAgICAgICBhbiA8RU0+aW50ZXJuYWwgcmVkaXJlY3Q8L0VNPiwgY29uc3RydWN0aW5nIGEgbmV3Ci0gICAgICAgPENPREU+cmVxdWVzdF9yZWM8L0NPREU+IGZvciB0aGUgbmV3IFVSSSwgYW5kIHByb2Nlc3NpbmcgaXQKLSAgICAgICBhbG1vc3QgZXhhY3RseSBhcyBpZiB0aGUgY2xpZW50IGhhZCByZXF1ZXN0ZWQgdGhlIG5ldyBVUkkKLSAgICAgICBkaXJlY3RseS4gPFA+Ci0KLSAgPExJPiBJZiBzb21lIGhhbmRsZXIgc2lnbmFsZWQgYW4gZXJyb3IsIGFuZCBhbgotICAgICAgIDxDT0RFPkVycm9yRG9jdW1lbnQ8L0NPREU+IGlzIGluIHNjb3BlLCB0aGUgc2FtZSBpbnRlcm5hbAotICAgICAgIHJlZGlyZWN0IG1hY2hpbmVyeSBjb21lcyBpbnRvIHBsYXkuPFA+Ci0KLSAgPExJPiBGaW5hbGx5LCBhIGhhbmRsZXIgb2NjYXNpb25hbGx5IG5lZWRzIHRvIGludmVzdGlnYXRlIGB3aGF0Ci0gICAgICAgd291bGQgaGFwcGVuIGlmJyBzb21lIG90aGVyIHJlcXVlc3Qgd2VyZSBydW4uICBGb3IgaW5zdGFuY2UsCi0gICAgICAgdGhlIGRpcmVjdG9yeSBpbmRleGluZyBtb2R1bGUgbmVlZHMgdG8ga25vdyB3aGF0IE1JTUUgdHlwZQotICAgICAgIHdvdWxkIGJlIGFzc2lnbmVkIHRvIGEgcmVxdWVzdCBmb3IgZWFjaCBkaXJlY3RvcnkgZW50cnksIGluCi0gICAgICAgb3JkZXIgdG8gZmlndXJlIG91dCB3aGF0IGljb24gdG8gdXNlLjxQPgotCi0gICAgICAgU3VjaCBoYW5kbGVycyBjYW4gY29uc3RydWN0IGEgPEVNPnN1Yi1yZXF1ZXN0PC9FTT4sIHVzaW5nIHRoZQotICAgICAgIGZ1bmN0aW9ucyA8Q09ERT5hcF9zdWJfcmVxX2xvb2t1cF9maWxlPC9DT0RFPiwKLSAgICAgICA8Q09ERT5hcF9zdWJfcmVxX2xvb2t1cF91cmk8L0NPREU+LCBhbmQKLSAgICAgICA8Q09ERT5hcF9zdWJfcmVxX21ldGhvZF91cmk8L0NPREU+OyB0aGVzZSBjb25zdHJ1Y3QgYSBuZXcKLSAgICAgICA8Q09ERT5yZXF1ZXN0X3JlYzwvQ09ERT4gc3RydWN0dXJlIGFuZCBwcm9jZXNzZXMgaXQgYXMgeW91Ci0gICAgICAgd291bGQgZXhwZWN0LCB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGUgcG9pbnQgb2YgYWN0dWFsbHkKLSAgICAgICBzZW5kaW5nIGEgcmVzcG9uc2UuICAoVGhlc2UgZnVuY3Rpb25zIHNraXAgb3ZlciB0aGUgYWNjZXNzCi0gICAgICAgY2hlY2tzIGlmIHRoZSBzdWItcmVxdWVzdCBpcyBmb3IgYSBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeQotICAgICAgIGFzIHRoZSBvcmlnaW5hbCByZXF1ZXN0KS48UD4KLQotICAgICAgIChTZXJ2ZXItc2lkZSBpbmNsdWRlcyB3b3JrIGJ5IGJ1aWxkaW5nIHN1Yi1yZXF1ZXN0cyBhbmQgdGhlbgotICAgICAgIGFjdHVhbGx5IGludm9raW5nIHRoZSByZXNwb25zZSBoYW5kbGVyIGZvciB0aGVtLCB2aWEgdGhlCi0gICAgICAgZnVuY3Rpb24gPENPREU+YXBfcnVuX3N1Yl9yZXE8L0NPREU+KS4KLTwvVUw+Ci0KLTxIMz48QSBOQU1FPSJyZXFfcmV0dXJuIj5IYW5kbGluZyByZXF1ZXN0cywgZGVjbGluaW5nLCBhbmQgcmV0dXJuaW5nIGVycm9yCi0gY29kZXM8L0E+PC9IMz4KLQotQXMgZGlzY3Vzc2VkIGFib3ZlLCBlYWNoIGhhbmRsZXIsIHdoZW4gaW52b2tlZCB0byBoYW5kbGUgYSBwYXJ0aWN1bGFyCi08Q09ERT5yZXF1ZXN0X3JlYzwvQ09ERT4sIGhhcyB0byByZXR1cm4gYW4gPENPREU+aW50PC9DT0RFPiB0bwotaW5kaWNhdGUgd2hhdCBoYXBwZW5lZC4gIFRoYXQgY2FuIGVpdGhlciBiZQotCi08VUw+Ci0gIDxMST4gT0sgLS0tIHRoZSByZXF1ZXN0IHdhcyBoYW5kbGVkIHN1Y2Nlc3NmdWxseS4gIFRoaXMgbWF5IG9yIG1heQotICAgICAgIG5vdCB0ZXJtaW5hdGUgdGhlIHBoYXNlLgotICA8TEk+IERFQ0xJTkVEIC0tLSBubyBlcnJvbmVvdXMgY29uZGl0aW9uIGV4aXN0cywgYnV0IHRoZSBtb2R1bGUKLSAgICAgICBkZWNsaW5lcyB0byBoYW5kbGUgdGhlIHBoYXNlOyB0aGUgc2VydmVyIHRyaWVzIHRvIGZpbmQgYW5vdGhlci4KLSAgPExJPiBhbiBIVFRQIGVycm9yIGNvZGUsIHdoaWNoIGFib3J0cyBoYW5kbGluZyBvZiB0aGUgcmVxdWVzdC4KLTwvVUw+Ci0KLU5vdGUgdGhhdCBpZiB0aGUgZXJyb3IgY29kZSByZXR1cm5lZCBpcyA8Q09ERT5SRURJUkVDVDwvQ09ERT4sIHRoZW4KLXRoZSBtb2R1bGUgc2hvdWxkIHB1dCBhIDxDT0RFPkxvY2F0aW9uPC9DT0RFPiBpbiB0aGUgcmVxdWVzdCdzCi08Q09ERT5oZWFkZXJzX291dDwvQ09ERT4sIHRvIGluZGljYXRlIHdoZXJlIHRoZSBjbGllbnQgc2hvdWxkIGJlCi1yZWRpcmVjdGVkIDxFTT50bzwvRU0+LiA8UD4KLQotPEgzPjxBIE5BTUU9InJlc3BfaGFuZGxlcnMiPlNwZWNpYWwgY29uc2lkZXJhdGlvbnMgZm9yIHJlc3BvbnNlCi0gaGFuZGxlcnM8L0E+PC9IMz4KLQotSGFuZGxlcnMgZm9yIG1vc3QgcGhhc2VzIGRvIHRoZWlyIHdvcmsgYnkgc2ltcGx5IHNldHRpbmcgYSBmZXcgZmllbGRzCi1pbiB0aGUgPENPREU+cmVxdWVzdF9yZWM8L0NPREU+IHN0cnVjdHVyZSAob3IsIGluIHRoZSBjYXNlIG9mIGFjY2VzcwotY2hlY2tlcnMsIHNpbXBseSBieSByZXR1cm5pbmcgdGhlIGNvcnJlY3QgZXJyb3IgY29kZSkuICBIb3dldmVyLAotcmVzcG9uc2UgaGFuZGxlcnMgaGF2ZSB0byBhY3R1YWxseSBzZW5kIGEgcmVxdWVzdCBiYWNrIHRvIHRoZSBjbGllbnQuIDxQPgotCi1UaGV5IHNob3VsZCBiZWdpbiBieSBzZW5kaW5nIGFuIEhUVFAgcmVzcG9uc2UgaGVhZGVyLCB1c2luZyB0aGUKLWZ1bmN0aW9uIDxDT0RFPmFwX3NlbmRfaHR0cF9oZWFkZXI8L0NPREU+LiAgKFlvdSBkb24ndCBoYXZlIHRvIGRvCi1hbnl0aGluZyBzcGVjaWFsIHRvIHNraXAgc2VuZGluZyB0aGUgaGVhZGVyIGZvciBIVFRQLzAuOSByZXF1ZXN0czsgdGhlCi1mdW5jdGlvbiBmaWd1cmVzIG91dCBvbiBpdHMgb3duIHRoYXQgaXQgc2hvdWxkbid0IGRvIGFueXRoaW5nKS4gIElmCi10aGUgcmVxdWVzdCBpcyBtYXJrZWQgPENPREU+aGVhZGVyX29ubHk8L0NPREU+LCB0aGF0J3MgYWxsIHRoZXkgc2hvdWxkCi1kbzsgdGhleSBzaG91bGQgcmV0dXJuIGFmdGVyIHRoYXQsIHdpdGhvdXQgYXR0ZW1wdGluZyBhbnkgZnVydGhlcgotb3V0cHV0LiAgPFA+Ci0KLU90aGVyd2lzZSwgdGhleSBzaG91bGQgcHJvZHVjZSBhIHJlcXVlc3QgYm9keSB3aGljaCByZXNwb25kcyB0byB0aGUKLWNsaWVudCBhcyBhcHByb3ByaWF0ZS4gIFRoZSBwcmltaXRpdmVzIGZvciB0aGlzIGFyZSA8Q09ERT5hcF9ycHV0YzwvQ09ERT4KLWFuZCA8Q09ERT5hcF9ycHJpbnRmPC9DT0RFPiwgZm9yIGludGVybmFsbHkgZ2VuZXJhdGVkIG91dHB1dCwgYW5kCi08Q09ERT5hcF9zZW5kX2ZkPC9DT0RFPiwgdG8gY29weSB0aGUgY29udGVudHMgb2Ygc29tZSA8Q09ERT5GSUxFICo8L0NPREU+Ci1zdHJhaWdodCB0byB0aGUgY2xpZW50LiAgPFA+Ci0KLUF0IHRoaXMgcG9pbnQsIHlvdSBzaG91bGQgbW9yZSBvciBsZXNzIHVuZGVyc3RhbmQgdGhlIGZvbGxvd2luZyBwaWVjZQotb2YgY29kZSwgd2hpY2ggaXMgdGhlIGhhbmRsZXIgd2hpY2ggaGFuZGxlcyA8Q09ERT5HRVQ8L0NPREU+IHJlcXVlc3RzCi13aGljaCBoYXZlIG5vIG1vcmUgc3BlY2lmaWMgaGFuZGxlcjsgaXQgYWxzbyBzaG93cyBob3cgY29uZGl0aW9uYWwKLTxDT0RFPkdFVDwvQ09ERT5zIGNhbiBiZSBoYW5kbGVkLCBpZiBpdCdzIGRlc2lyYWJsZSB0byBkbyBzbyBpbiBhCi1wYXJ0aWN1bGFyIHJlc3BvbnNlIGhhbmRsZXIgLS0tIDxDT0RFPmFwX3NldF9sYXN0X21vZGlmaWVkPC9DT0RFPiBjaGVja3MKLWFnYWluc3QgdGhlIDxDT0RFPklmLW1vZGlmaWVkLXNpbmNlPC9DT0RFPiB2YWx1ZSBzdXBwbGllZCBieSB0aGUKLWNsaWVudCwgaWYgYW55LCBhbmQgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBjb2RlICh3aGljaCB3aWxsLCBpZgotbm9uemVybywgYmUgVVNFX0xPQ0FMX0NPUFkpLiAgIE5vIHNpbWlsYXIgY29uc2lkZXJhdGlvbnMgYXBwbHkgZm9yCi08Q09ERT5hcF9zZXRfY29udGVudF9sZW5ndGg8L0NPREU+LCBidXQgaXQgcmV0dXJucyBhbiBlcnJvciBjb2RlIGZvcgotc3ltbWV0cnkuPFA+Ci0KLTxQUkU+Ci1pbnQgZGVmYXVsdF9oYW5kbGVyIChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpbnQgZXJyc3RhdHVzOwotICAgIEZJTEUgKmY7Ci0KLSAgICBpZiAoci0mZ3Q7bWV0aG9kX251bWJlciAhPSBNX0dFVCkgcmV0dXJuIERFQ0xJTkVEOwotICAgIGlmIChyLSZndDtmaW5mby5zdF9tb2RlID09IDApIHJldHVybiBOT1RfRk9VTkQ7Ci0KLSAgICBpZiAoKGVycnN0YXR1cyA9IGFwX3NldF9jb250ZW50X2xlbmd0aCAociwgci0mZ3Q7ZmluZm8uc3Rfc2l6ZSkpCi0JfHwgKGVycnN0YXR1cyA9IGFwX3NldF9sYXN0X21vZGlmaWVkIChyLCByLSZndDtmaW5mby5zdF9tdGltZSkpKQotICAgICAgICByZXR1cm4gZXJyc3RhdHVzOwotCi0gICAgZiA9IGZvcGVuIChyLSZndDtmaWxlbmFtZSwgInIiKTsKLQotICAgIGlmIChmID09IE5VTEwpIHsKLSAgICAgICAgbG9nX3JlYXNvbigiZmlsZSBwZXJtaXNzaW9ucyBkZW55IHNlcnZlciBhY2Nlc3MiLAotICAgICAgICAgICAgICAgICAgIHItJmd0O2ZpbGVuYW1lLCByKTsKLSAgICAgICAgcmV0dXJuIEZPUkJJRERFTjsKLSAgICB9Ci0KLSAgICByZWdpc3Rlcl90aW1lb3V0ICgic2VuZCIsIHIpOwotICAgIGFwX3NlbmRfaHR0cF9oZWFkZXIgKHIpOwotCi0gICAgaWYgKCFyLSZndDtoZWFkZXJfb25seSkgc2VuZF9mZCAoZiwgcik7Ci0gICAgYXBfcGZjbG9zZSAoci0mZ3Q7cG9vbCwgZik7Ci0gICAgcmV0dXJuIE9LOwotfQotPC9QUkU+Ci0KLUZpbmFsbHksIGlmIGFsbCBvZiB0aGlzIGlzIHRvbyBtdWNoIG9mIGEgY2hhbGxlbmdlLCB0aGVyZSBhcmUgYSBmZXcKLXdheXMgb3V0IG9mIGl0LiAgRmlyc3Qgb2ZmLCBhcyBzaG93biBhYm92ZSwgYSByZXNwb25zZSBoYW5kbGVyIHdoaWNoCi1oYXMgbm90IHlldCBwcm9kdWNlZCBhbnkgb3V0cHV0IGNhbiBzaW1wbHkgcmV0dXJuIGFuIGVycm9yIGNvZGUsIGluCi13aGljaCBjYXNlIHRoZSBzZXJ2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IHByb2R1Y2UgYW4gZXJyb3IgcmVzcG9uc2UuCi1TZWNvbmRseSwgaXQgY2FuIHB1bnQgdG8gc29tZSBvdGhlciBoYW5kbGVyIGJ5IGludm9raW5nCi08Q09ERT5hcF9pbnRlcm5hbF9yZWRpcmVjdDwvQ09ERT4sIHdoaWNoIGlzIGhvdyB0aGUgaW50ZXJuYWwgcmVkaXJlY3Rpb24KLW1hY2hpbmVyeSBkaXNjdXNzZWQgYWJvdmUgaXMgaW52b2tlZC4gIEEgcmVzcG9uc2UgaGFuZGxlciB3aGljaCBoYXMKLWludGVybmFsbHkgcmVkaXJlY3RlZCBzaG91bGQgYWx3YXlzIHJldHVybiA8Q09ERT5PSzwvQ09ERT4uIDxQPgotCi0oSW52b2tpbmcgPENPREU+YXBfaW50ZXJuYWxfcmVkaXJlY3Q8L0NPREU+IGZyb20gaGFuZGxlcnMgd2hpY2ggYXJlCi08RU0+bm90PC9FTT4gcmVzcG9uc2UgaGFuZGxlcnMgd2lsbCBsZWFkIHRvIHNlcmlvdXMgY29uZnVzaW9uKS4KLQotPEgzPjxBIE5BTUU9ImF1dGhfaGFuZGxlcnMiPlNwZWNpYWwgY29uc2lkZXJhdGlvbnMgZm9yIGF1dGhlbnRpY2F0aW9uCi0gaGFuZGxlcnM8L0E+PC9IMz4KLQotU3R1ZmYgdGhhdCBzaG91bGQgYmUgZGlzY3Vzc2VkIGhlcmUgaW4gZGV0YWlsOgotCi08VUw+Ci0gIDxMST4gQXV0aGVudGljYXRpb24tcGhhc2UgaGFuZGxlcnMgbm90IGludm9rZWQgdW5sZXNzIGF1dGggaXMKLSAgICAgICBjb25maWd1cmVkIGZvciB0aGUgZGlyZWN0b3J5LgotICA8TEk+IENvbW1vbiBhdXRoIGNvbmZpZ3VyYXRpb24gc3RvcmVkIGluIHRoZSBjb3JlIHBlci1kaXIKLSAgICAgICBjb25maWd1cmF0aW9uOyBpdCBoYXMgYWNjZXNzb3JzIDxDT0RFPmFwX2F1dGhfdHlwZTwvQ09ERT4sCi0gICAgICAgPENPREU+YXBfYXV0aF9uYW1lPC9DT0RFPiwgYW5kIDxDT0RFPmFwX3JlcXVpcmVzPC9DT0RFPi4KLSAgPExJPiBDb21tb24gcm91dGluZXMsIHRvIGhhbmRsZSB0aGUgcHJvdG9jb2wgZW5kIG9mIHRoaW5ncywgYXQgbGVhc3QKLSAgICAgICBmb3IgSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbiAoPENPREU+YXBfZ2V0X2Jhc2ljX2F1dGhfcHc8L0NPREU+LAotICAgICAgIHdoaWNoIHNldHMgdGhlIDxDT0RFPmNvbm5lY3Rpb24tJmd0O3VzZXI8L0NPREU+IHN0cnVjdHVyZSBmaWVsZAotICAgICAgIGF1dG9tYXRpY2FsbHksIGFuZCA8Q09ERT5hcF9ub3RlX2Jhc2ljX2F1dGhfZmFpbHVyZTwvQ09ERT4sIHdoaWNoCi0gICAgICAgYXJyYW5nZXMgZm9yIHRoZSBwcm9wZXIgPENPREU+V1dXLUF1dGhlbnRpY2F0ZTo8L0NPREU+IGhlYWRlcgotICAgICAgIHRvIGJlIHNlbnQgYmFjaykuCi08L1VMPgotCi08SDM+PEEgTkFNRT0ibG9nX2hhbmRsZXJzIj5TcGVjaWFsIGNvbnNpZGVyYXRpb25zIGZvciBsb2dnaW5nIGhhbmRsZXJzPC9BPjwvSDM+Ci0KLVdoZW4gYSByZXF1ZXN0IGhhcyBpbnRlcm5hbGx5IHJlZGlyZWN0ZWQsIHRoZXJlIGlzIHRoZSBxdWVzdGlvbiBvZgotd2hhdCB0byBsb2cuICBBcGFjaGUgaGFuZGxlcyB0aGlzIGJ5IGJ1bmRsaW5nIHRoZSBlbnRpcmUgY2hhaW4gb2YKLXJlZGlyZWN0cyBpbnRvIGEgbGlzdCBvZiA8Q09ERT5yZXF1ZXN0X3JlYzwvQ09ERT4gc3RydWN0dXJlcyB3aGljaCBhcmUKLXRocmVhZGVkIHRocm91Z2ggdGhlIDxDT0RFPnItJmd0O3ByZXY8L0NPREU+IGFuZCA8Q09ERT5yLSZndDtuZXh0PC9DT0RFPgotcG9pbnRlcnMuICBUaGUgPENPREU+cmVxdWVzdF9yZWM8L0NPREU+IHdoaWNoIGlzIHBhc3NlZCB0byB0aGUgbG9nZ2luZwotaGFuZGxlcnMgaW4gc3VjaCBjYXNlcyBpcyB0aGUgb25lIHdoaWNoIHdhcyBvcmlnaW5hbGx5IGJ1aWx0IGZvciB0aGUKLWluaXRpYWwgcmVxdWVzdCBmcm9tIHRoZSBjbGllbnQ7IG5vdGUgdGhhdCB0aGUgYnl0ZXNfc2VudCBmaWVsZCB3aWxsCi1vbmx5IGJlIGNvcnJlY3QgaW4gdGhlIGxhc3QgcmVxdWVzdCBpbiB0aGUgY2hhaW4gKHRoZSBvbmUgZm9yIHdoaWNoIGEKLXJlc3BvbnNlIHdhcyBhY3R1YWxseSBzZW50KS4KLQotPEgyPjxBIE5BTUU9InBvb2xzIj5SZXNvdXJjZSBhbGxvY2F0aW9uIGFuZCByZXNvdXJjZSBwb29sczwvQT48L0gyPgotPFA+Ci1PbmUgb2YgdGhlIHByb2JsZW1zIG9mIHdyaXRpbmcgYW5kIGRlc2lnbmluZyBhIHNlcnZlci1wb29sIHNlcnZlciBpcwotdGhhdCBvZiBwcmV2ZW50aW5nIGxlYWthZ2UsIHRoYXQgaXMsIGFsbG9jYXRpbmcgcmVzb3VyY2VzIChtZW1vcnksCi1vcGVuIGZpbGVzLCA8RU0+ZXRjLjwvRU0+KSwgd2l0aG91dCBzdWJzZXF1ZW50bHkgcmVsZWFzaW5nIHRoZW0uICBUaGUgcmVzb3VyY2UKLXBvb2wgbWFjaGluZXJ5IGlzIGRlc2lnbmVkIHRvIG1ha2UgaXQgZWFzeSB0byBwcmV2ZW50IHRoaXMgZnJvbQotaGFwcGVuaW5nLCBieSBhbGxvd2luZyByZXNvdXJjZSB0byBiZSBhbGxvY2F0ZWQgaW4gc3VjaCBhIHdheSB0aGF0Ci10aGV5IGFyZSA8RU0+YXV0b21hdGljYWxseTwvRU0+IHJlbGVhc2VkIHdoZW4gdGhlIHNlcnZlciBpcyBkb25lIHdpdGgKLXRoZW0uCi08L1A+Ci08UD4KLVRoZSB3YXkgdGhpcyB3b3JrcyBpcyBhcyBmb2xsb3dzOiAgdGhlIG1lbW9yeSB3aGljaCBpcyBhbGxvY2F0ZWQsIGZpbGUKLW9wZW5lZCwgPEVNPmV0Yy48L0VNPiwgdG8gZGVhbCB3aXRoIGEgcGFydGljdWxhciByZXF1ZXN0IGFyZSB0aWVkIHRvIGEKLTxFTT5yZXNvdXJjZSBwb29sPC9FTT4gd2hpY2ggaXMgYWxsb2NhdGVkIGZvciB0aGUgcmVxdWVzdC4gIFRoZSBwb29sCi1pcyBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIGl0c2VsZiB0cmFja3MgdGhlIHJlc291cmNlcyBpbiBxdWVzdGlvbi4KLTwvUD4KLTxQPgotV2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIHRoZSBwb29sIGlzIDxFTT5jbGVhcmVkPC9FTT4uICBBdAotdGhhdCBwb2ludCwgYWxsIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGl0IGlzIHJlbGVhc2VkIGZvciByZXVzZSwKLWFsbCBmaWxlcyBhc3NvY2lhdGVkIHdpdGggaXQgYXJlIGNsb3NlZCwgYW5kIGFueSBvdGhlciBjbGVhbi11cAotZnVuY3Rpb25zIHdoaWNoIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHBvb2wgYXJlIHJ1bi4gIFdoZW4gdGhpcyBpcwotb3Zlciwgd2UgY2FuIGJlIGNvbmZpZGVudCB0aGF0IGFsbCB0aGUgcmVzb3VyY2UgdGllZCB0byB0aGUgcG9vbCBoYXZlCi1iZWVuIHJlbGVhc2VkLCBhbmQgdGhhdCBub25lIG9mIHRoZW0gaGF2ZSBsZWFrZWQuCi08L1A+Ci08UD4KLVNlcnZlciByZXN0YXJ0cywgYW5kIGFsbG9jYXRpb24gb2YgbWVtb3J5IGFuZCByZXNvdXJjZXMgZm9yIHBlci1zZXJ2ZXIKLWNvbmZpZ3VyYXRpb24sIGFyZSBoYW5kbGVkIGluIGEgc2ltaWxhciB3YXkuICBUaGVyZSBpcyBhCi08RU0+Y29uZmlndXJhdGlvbiBwb29sPC9FTT4sIHdoaWNoIGtlZXBzIHRyYWNrIG9mIHJlc291cmNlcyB3aGljaCB3ZXJlCi1hbGxvY2F0ZWQgd2hpbGUgcmVhZGluZyB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gZmlsZXMsIGFuZCBoYW5kbGluZwotdGhlIGNvbW1hbmRzIHRoZXJlaW4gKGZvciBpbnN0YW5jZSwgdGhlIG1lbW9yeSB0aGF0IHdhcyBhbGxvY2F0ZWQgZm9yCi1wZXItc2VydmVyIG1vZHVsZSBjb25maWd1cmF0aW9uLCBsb2cgZmlsZXMgYW5kIG90aGVyIGZpbGVzIHRoYXQgd2VyZQotb3BlbmVkLCBhbmQgc28gZm9ydGgpLiAgV2hlbiB0aGUgc2VydmVyIHJlc3RhcnRzLCBhbmQgaGFzIHRvIHJlcmVhZAotdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMsIHRoZSBjb25maWd1cmF0aW9uIHBvb2wgaXMgY2xlYXJlZCwgYW5kIHNvIHRoZQotbWVtb3J5IGFuZCBmaWxlIGRlc2NyaXB0b3JzIHdoaWNoIHdlcmUgdGFrZW4gdXAgYnkgcmVhZGluZyB0aGVtIHRoZQotbGFzdCB0aW1lIGFyZSBtYWRlIGF2YWlsYWJsZSBmb3IgcmV1c2UuCi08L1A+Ci08UD4KLUl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHVzZSBvZiB0aGUgcG9vbCBtYWNoaW5lcnkgaXNuJ3QgZ2VuZXJhbGx5Ci1vYmxpZ2F0b3J5LCBleGNlcHQgZm9yIHNpdHVhdGlvbnMgbGlrZSBsb2dnaW5nIGhhbmRsZXJzLCB3aGVyZSB5b3UKLXJlYWxseSBuZWVkIHRvIHJlZ2lzdGVyIGNsZWFudXBzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBsb2cgZmlsZSBnZXRzCi1jbG9zZWQgd2hlbiB0aGUgc2VydmVyIHJlc3RhcnRzICh0aGlzIGlzIG1vc3QgZWFzaWx5IGRvbmUgYnkgdXNpbmcgdGhlCi1mdW5jdGlvbiA8Q09ERT48QSBIUkVGPSIjcG9vbC1maWxlcyI+YXBfcGZvcGVuPC9BPjwvQ09ERT4sIHdoaWNoIGFsc28KLWFycmFuZ2VzIGZvciB0aGUgdW5kZXJseWluZyBmaWxlIGRlc2NyaXB0b3IgdG8gYmUgY2xvc2VkIGJlZm9yZSBhbnkKLWNoaWxkIHByb2Nlc3Nlcywgc3VjaCBhcyBmb3IgQ0dJIHNjcmlwdHMsIGFyZSA8Q09ERT5leGVjPC9DT0RFPmVkKSwgb3IKLWluIGNhc2UgeW91IGFyZSB1c2luZyB0aGUgdGltZW91dCBtYWNoaW5lcnkgKHdoaWNoIGlzbid0IHlldCBldmVuCi1kb2N1bWVudGVkIGhlcmUpLiAgSG93ZXZlciwgdGhlcmUgYXJlIHR3byBiZW5lZml0cyB0byB1c2luZyBpdDoKLXJlc291cmNlcyBhbGxvY2F0ZWQgdG8gYSBwb29sIG5ldmVyIGxlYWsgKGV2ZW4gaWYgeW91IGFsbG9jYXRlIGEKLXNjcmF0Y2ggc3RyaW5nLCBhbmQganVzdCBmb3JnZXQgYWJvdXQgaXQpOyBhbHNvLCBmb3IgbWVtb3J5Ci1hbGxvY2F0aW9uLCA8Q09ERT5hcF9wYWxsb2M8L0NPREU+IGlzIGdlbmVyYWxseSBmYXN0ZXIgdGhhbgotPENPREU+bWFsbG9jPC9DT0RFPi4KLTwvUD4KLTxQPgotV2UgYmVnaW4gaGVyZSBieSBkZXNjcmliaW5nIGhvdyBtZW1vcnkgaXMgYWxsb2NhdGVkIHRvIHBvb2xzLCBhbmQgdGhlbgotZGlzY3VzcyBob3cgb3RoZXIgcmVzb3VyY2VzIGFyZSB0cmFja2VkIGJ5IHRoZSByZXNvdXJjZSBwb29sCi1tYWNoaW5lcnkuCi08L1A+Ci08SDM+QWxsb2NhdGlvbiBvZiBtZW1vcnkgaW4gcG9vbHM8L0gzPgotPFA+Ci1NZW1vcnkgaXMgYWxsb2NhdGVkIHRvIHBvb2xzIGJ5IGNhbGxpbmcgdGhlIGZ1bmN0aW9uCi08Q09ERT5hcF9wYWxsb2M8L0NPREU+LCB3aGljaCB0YWtlcyB0d28gYXJndW1lbnRzLCBvbmUgYmVpbmcgYSBwb2ludGVyIHRvCi1hIHJlc291cmNlIHBvb2wgc3RydWN0dXJlLCBhbmQgdGhlIG90aGVyIGJlaW5nIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvCi1hbGxvY2F0ZSAoaW4gPENPREU+Y2hhcjwvQ09ERT5zKS4gIFdpdGhpbiBoYW5kbGVycyBmb3IgaGFuZGxpbmcKLXJlcXVlc3RzLCB0aGUgbW9zdCBjb21tb24gd2F5IG9mIGdldHRpbmcgYSByZXNvdXJjZSBwb29sIHN0cnVjdHVyZSBpcwotYnkgbG9va2luZyBhdCB0aGUgPENPREU+cG9vbDwvQ09ERT4gc2xvdCBvZiB0aGUgcmVsZXZhbnQKLTxDT0RFPnJlcXVlc3RfcmVjPC9DT0RFPjsgaGVuY2UgdGhlIHJlcGVhdGVkIGFwcGVhcmFuY2Ugb2YgdGhlCi1mb2xsb3dpbmcgaWRpb20gaW4gbW9kdWxlIGNvZGU6Ci08L1A+Ci08UFJFPgotaW50IG15X2hhbmRsZXIocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgc3RydWN0IG15X3N0cnVjdHVyZSAqZm9vOwotICAgIC4uLgotCi0gICAgZm9vID0gKGZvbyAqKWFwX3BhbGxvYyAoci0mZ3Q7cG9vbCwgc2l6ZW9mKG15X3N0cnVjdHVyZSkpOwotfQotPC9QUkU+Ci08UD4KLU5vdGUgdGhhdCA8RU0+dGhlcmUgaXMgbm8gPENPREU+YXBfcGZyZWU8L0NPREU+PC9FTT4gLS0tCi08Q09ERT5hcF9wYWxsb2M8L0NPREU+ZWQgbWVtb3J5IGlzIGZyZWVkIG9ubHkgd2hlbiB0aGUgYXNzb2NpYXRlZAotcmVzb3VyY2UgcG9vbCBpcyBjbGVhcmVkLiAgVGhpcyBtZWFucyB0aGF0IDxDT0RFPmFwX3BhbGxvYzwvQ09ERT4gZG9lcyBub3QKLWhhdmUgdG8gZG8gYXMgbXVjaCBhY2NvdW50aW5nIGFzIDxDT0RFPm1hbGxvYygpPC9DT0RFPjsgYWxsIGl0IGRvZXMgaW4KLXRoZSB0eXBpY2FsIGNhc2UgaXMgdG8gcm91bmQgdXAgdGhlIHNpemUsIGJ1bXAgYSBwb2ludGVyLCBhbmQgZG8gYQotcmFuZ2UgY2hlY2suCi08L1A+Ci08UD4KLShJdCBhbHNvIHJhaXNlcyB0aGUgcG9zc2liaWxpdHkgdGhhdCBoZWF2eSB1c2Ugb2YgPENPREU+YXBfcGFsbG9jPC9DT0RFPgotY291bGQgY2F1c2UgYSBzZXJ2ZXIgcHJvY2VzcyB0byBncm93IGV4Y2Vzc2l2ZWx5IGxhcmdlLiAgVGhlcmUgYXJlCi10d28gd2F5cyB0byBkZWFsIHdpdGggdGhpcywgd2hpY2ggYXJlIGRlYWx0IHdpdGggYmVsb3c7IGJyaWVmbHksIHlvdQotY2FuIHVzZSA8Q09ERT5tYWxsb2M8L0NPREU+LCBhbmQgdHJ5IHRvIGJlIHN1cmUgdGhhdCBhbGwgb2YgdGhlIG1lbW9yeQotZ2V0cyBleHBsaWNpdGx5IDxDT0RFPmZyZWU8L0NPREU+ZCwgb3IgeW91IGNhbiBhbGxvY2F0ZSBhIHN1Yi1wb29sIG9mCi10aGUgbWFpbiBwb29sLCBhbGxvY2F0ZSB5b3VyIG1lbW9yeSBpbiB0aGUgc3ViLXBvb2wsIGFuZCBjbGVhciBpdCBvdXQKLXBlcmlvZGljYWxseS4gIFRoZSBsYXR0ZXIgdGVjaG5pcXVlIGlzIGRpc2N1c3NlZCBpbiB0aGUgc2VjdGlvbiBvbgotc3ViLXBvb2xzIGJlbG93LCBhbmQgaXMgdXNlZCBpbiB0aGUgZGlyZWN0b3J5LWluZGV4aW5nIGNvZGUsIGluIG9yZGVyCi10byBhdm9pZCBleGNlc3NpdmUgc3RvcmFnZSBhbGxvY2F0aW9uIHdoZW4gbGlzdGluZyBkaXJlY3RvcmllcyB3aXRoCi10aG91c2FuZHMgb2YgZmlsZXMpLgotPC9QPgotPEgzPkFsbG9jYXRpbmcgaW5pdGlhbGl6ZWQgbWVtb3J5PC9IMz4KLTxQPgotVGhlcmUgYXJlIGZ1bmN0aW9ucyB3aGljaCBhbGxvY2F0ZSBpbml0aWFsaXplZCBtZW1vcnksIGFuZCBhcmUKLWZyZXF1ZW50bHkgdXNlZnVsLiAgVGhlIGZ1bmN0aW9uIDxDT0RFPmFwX3BjYWxsb2M8L0NPREU+IGhhcyB0aGUgc2FtZQotaW50ZXJmYWNlIGFzIDxDT0RFPmFwX3BhbGxvYzwvQ09ERT4sIGJ1dCBjbGVhcnMgb3V0IHRoZSBtZW1vcnkgaXQKLWFsbG9jYXRlcyBiZWZvcmUgaXQgcmV0dXJucyBpdC4gIFRoZSBmdW5jdGlvbiA8Q09ERT5hcF9wc3RyZHVwPC9DT0RFPgotdGFrZXMgYSByZXNvdXJjZSBwb29sIGFuZCBhIDxDT0RFPmNoYXIgKjwvQ09ERT4gYXMgYXJndW1lbnRzLCBhbmQKLWFsbG9jYXRlcyBtZW1vcnkgZm9yIGEgY29weSBvZiB0aGUgc3RyaW5nIHRoZSBwb2ludGVyIHBvaW50cyB0bywKLXJldHVybmluZyBhIHBvaW50ZXIgdG8gdGhlIGNvcHkuICBGaW5hbGx5IDxDT0RFPmFwX3BzdHJjYXQ8L0NPREU+IGlzIGEKLXZhcmFyZ3Mtc3R5bGUgZnVuY3Rpb24sIHdoaWNoIHRha2VzIGEgcG9pbnRlciB0byBhIHJlc291cmNlIHBvb2wsIGFuZAotYXQgbGVhc3QgdHdvIDxDT0RFPmNoYXIgKjwvQ09ERT4gYXJndW1lbnRzLCB0aGUgbGFzdCBvZiB3aGljaCBtdXN0IGJlCi08Q09ERT5OVUxMPC9DT0RFPi4gIEl0IGFsbG9jYXRlcyBlbm91Z2ggbWVtb3J5IHRvIGZpdCBjb3BpZXMgb2YgZWFjaAotb2YgdGhlIHN0cmluZ3MsIGFzIGEgdW5pdDsgZm9yIGluc3RhbmNlOgotPC9QPgotPFBSRT4KLSAgICAgYXBfcHN0cmNhdCAoci0mZ3Q7cG9vbCwgImZvbyIsICIvIiwgImJhciIsIE5VTEwpOwotPC9QUkU+Ci08UD4KLXJldHVybnMgYSBwb2ludGVyIHRvIDggYnl0ZXMgd29ydGggb2YgbWVtb3J5LCBpbml0aWFsaXplZCB0bwotPENPREU+ImZvby9iYXIiPC9DT0RFPi4KLTwvUD4KLTxIMz48QSBOQU1FPSJwb29scy11c2VkIj5Db21tb25seS11c2VkIHBvb2xzIGluIHRoZSBBcGFjaGUgV2ViIHNlcnZlcjwvQT48L0gzPgotPFA+Ci1BIHBvb2wgaXMgcmVhbGx5IGRlZmluZWQgYnkgaXRzIGxpZmV0aW1lIG1vcmUgdGhhbiBhbnl0aGluZyBlbHNlLiAgVGhlcmUKLWFyZSBzb21lIHN0YXRpYyBwb29scyBpbiBodHRwX21haW4gd2hpY2ggYXJlIHBhc3NlZCB0byB2YXJpb3VzCi1ub24taHR0cF9tYWluIGZ1bmN0aW9ucyBhcyBhcmd1bWVudHMgYXQgb3Bwb3J0dW5lIHRpbWVzLiAgSGVyZSB0aGV5IGFyZToKLTwvUD4KLTxETCBDT01QQUNUPgotIDxEVD5wZXJtYW5lbnRfcG9vbAotIDwvRFQ+Ci0gPEREPgotICA8VUw+Ci0gICA8TEk+bmV2ZXIgcGFzc2VkIHRvIGFueXRoaW5nIGVsc2UsIHRoaXMgaXMgdGhlIGFuY2VzdG9yIG9mIGFsbCBwb29scwotICAgPC9MST4KLSAgPC9VTD4KLSA8L0REPgotIDxEVD5wY29uZgotIDwvRFQ+Ci0gPEREPgotICA8VUw+Ci0gICA8TEk+c3VicG9vbCBvZiBwZXJtYW5lbnRfcG9vbAotICAgPC9MST4KLSAgIDxMST5jcmVhdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBjb25maWcgImN5Y2xlIjsgZXhpc3RzIHVudGlsIHRoZQotICAgIHNlcnZlciBpcyB0ZXJtaW5hdGVkIG9yIHJlc3RhcnRzOyBwYXNzZWQgdG8gYWxsIGNvbmZpZy10aW1lCi0gICAgcm91dGluZXMsIGVpdGhlciB2aWEgY21kLSZndDtwb29sLCBvciBhcyB0aGUgInBvb2wgKnAiIGFyZ3VtZW50IG9uCi0gICAgdGhvc2Ugd2hpY2ggZG9uJ3QgdGFrZSBwb29scwotICAgPC9MST4KLSAgIDxMST5wYXNzZWQgdG8gdGhlIG1vZHVsZSBpbml0KCkgZnVuY3Rpb25zCi0gICA8L0xJPgotICA8L1VMPgotIDwvREQ+Ci0gPERUPnB0ZW1wCi0gPC9EVD4KLSA8REQ+Ci0gIDxVTD4KLSAgIDxMST5zb3JyeSBJIGxpZSwgdGhpcyBwb29sIGlzbid0IGNhbGxlZCB0aGlzIGN1cnJlbnRseSBpbiAxLjMsIEkKLSAgICByZW5hbWVkIGl0IHRoaXMgaW4gbXkgcHRocmVhZHMgZGV2ZWxvcG1lbnQuICBJJ20gcmVmZXJyaW5nIHRvCi0gICAgdGhlIHVzZSBvZiBwdHJhbnMgaW4gdGhlIHBhcmVudC4uLiBjb250cmFzdCB0aGlzIHdpdGggdGhlIGxhdGVyCi0gICAgZGVmaW5pdGlvbiBvZiBwdHJhbnMgaW4gdGhlIGNoaWxkLgotICAgPC9MST4KLSAgIDxMST5zdWJwb29sIG9mIHBlcm1hbmVudF9wb29sCi0gICA8L0xJPgotICAgPExJPmNyZWF0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGNvbmZpZyAiY3ljbGUiOyBleGlzdHMgdW50aWwgdGhlCi0gICAgZW5kIG9mIGNvbmZpZyBwYXJzaW5nOyBwYXNzZWQgdG8gY29uZmlnLXRpbWUgcm91dGluZXMgPEVNPnZpYTwvRU0+Ci0gICAgY21kLSZndDt0ZW1wX3Bvb2wuICBTb21ld2hhdCBvZiBhICJiYXN0YXJkIGNoaWxkIiBiZWNhdXNlIGl0IGlzbid0Ci0gICAgYXZhaWxhYmxlIGV2ZXJ5d2hlcmUuICBVc2VkIGZvciB0ZW1wb3Jhcnkgc2NyYXRjaCBzcGFjZSB3aGljaAotICAgIG1heSBiZSBuZWVkZWQgYnkgc29tZSBjb25maWcgcm91dGluZXMgYnV0IHdoaWNoIGlzIGRlbGV0ZWQgYXQKLSAgICB0aGUgZW5kIG9mIGNvbmZpZy4KLSAgIDwvTEk+Ci0gIDwvVUw+Ci0gPC9ERD4KLSA8RFQ+cGNoaWxkCi0gPC9EVD4KLSA8REQ+Ci0gIDxVTD4KLSAgIDxMST5zdWJwb29sIG9mIHBlcm1hbmVudF9wb29sCi0gICA8L0xJPgotICAgPExJPmNyZWF0ZWQgd2hlbiBhIGNoaWxkIGlzIHNwYXduZWQgKG9yIGEgdGhyZWFkIGlzIGNyZWF0ZWQpOyBsaXZlcwotICAgIHVudGlsIHRoYXQgY2hpbGQgKHRocmVhZCkgaXMgZGVzdHJveWVkCi0gICA8L0xJPgotICAgPExJPnBhc3NlZCB0byB0aGUgbW9kdWxlIGNoaWxkX2luaXQgZnVuY3Rpb25zCi0gICA8L0xJPgotICAgPExJPmRlc3RydWN0aW9uIGhhcHBlbnMgcmlnaHQgYWZ0ZXIgdGhlIGNoaWxkX2V4aXQgZnVuY3Rpb25zIGFyZQotICAgIGNhbGxlZC4uLiAod2hpY2ggbWF5IGV4cGxhaW4gd2h5IEkgdGhpbmsgY2hpbGRfZXhpdCBpcyByZWR1bmRhbnQKLSAgICBhbmQgdW5uZWVkZWQpCi0gICA8L0xJPgotICA8L1VMPgotIDwvREQ+Ci0gPERUPnB0cmFucwotIDxEVD4KLSA8REQ+Ci0gIDxVTD4KLSAgIDxMST5zaG91bGQgYmUgYSBzdWJwb29sIG9mIHBjaGlsZCwgYnV0IGN1cnJlbnRseSBpcyBhIHN1YnBvb2wgb2YKLSAgICBwZXJtYW5lbnRfcG9vbCwgc2VlIGFib3ZlCi0gICA8L0xJPgotICAgPExJPmNsZWFyZWQgYnkgdGhlIGNoaWxkIGJlZm9yZSBnb2luZyBpbnRvIHRoZSBhY2NlcHQoKSBsb29wIHRvIHJlY2VpdmUKLSAgICBhIGNvbm5lY3Rpb24KLSAgIDwvTEk+Ci0gICA8TEk+dXNlZCBhcyBjb25uZWN0aW9uLSZndDtwb29sCi0gICA8L0xJPgotICA8L1VMPgotIDwvREQ+Ci0gPERUPnItJmd0O3Bvb2wKLSA8L0RUPgotIDxERD4KLSAgPFVMPgotICAgPExJPmZvciB0aGUgbWFpbiByZXF1ZXN0IHRoaXMgaXMgYSBzdWJwb29sIG9mIGNvbm5lY3Rpb24tJmd0O3Bvb2w7IGZvcgotICAgIHN1YnJlcXVlc3RzIGl0IGlzIGEgc3VicG9vbCBvZiB0aGUgcGFyZW50IHJlcXVlc3QncyBwb29sLgotICAgPC9MST4KLSAgIDxMST5leGlzdHMgdW50aWwgdGhlIGVuZCBvZiB0aGUgcmVxdWVzdCAoPEVNPmkuZS48L0VNPiwKLSAgICBhcF9kZXN0cm95X3N1Yl9yZXEsIG9yCi0gICAgaW4gY2hpbGRfbWFpbiBhZnRlciBwcm9jZXNzX3JlcXVlc3QgaGFzIGZpbmlzaGVkKQotICAgPC9MST4KLSAgIDxMST5ub3RlIHRoYXQgciBpdHNlbGYgaXMgYWxsb2NhdGVkIGZyb20gci0mZ3Q7cG9vbDsgPEVNPmkuZS48L0VNPiwKLSAgICByLSZndDtwb29sIGlzCi0gICAgZmlyc3QgY3JlYXRlZCBhbmQgdGhlbiByIGlzIHRoZSBmaXJzdCB0aGluZyBwYWxsb2MoKWQgZnJvbSBpdAotICAgPC9MST4KLSAgPC9VTD4KLSA8L0REPgotPC9ETD4KLTxQPgotRm9yIGFsbW9zdCBldmVyeXRoaW5nIGZvbGtzIGRvLCByLSZndDtwb29sIGlzIHRoZSBwb29sIHRvIHVzZS4gIEJ1dCB5b3UKLWNhbiBzZWUgaG93IG90aGVyIGxpZmV0aW1lcywgc3VjaCBhcyBwY2hpbGQsIGFyZSB1c2VmdWwgdG8gc29tZQotbW9kdWxlcy4uLiBzdWNoIGFzIG1vZHVsZXMgdGhhdCBuZWVkIHRvIG9wZW4gYSBkYXRhYmFzZSBjb25uZWN0aW9uIG9uY2UKLXBlciBjaGlsZCwgYW5kIHdpc2ggdG8gY2xlYW4gaXQgdXAgd2hlbiB0aGUgY2hpbGQgZGllcy4KLTwvUD4KLTxQPgotWW91IGNhbiBhbHNvIHNlZSBob3cgc29tZSBidWdzIGhhdmUgbWFuaWZlc3RlZCB0aGVtc2VsZiwgc3VjaCBhcyBzZXR0aW5nCi1jb25uZWN0aW9uLSZndDt1c2VyIHRvIGEgdmFsdWUgZnJvbSByLSZndDtwb29sIC0tIGluIHRoaXMgY2FzZQotY29ubmVjdGlvbiBleGlzdHMKLWZvciB0aGUgbGlmZXRpbWUgb2YgcHRyYW5zLCB3aGljaCBpcyBsb25nZXIgdGhhbiByLSZndDtwb29sIChlc3BlY2lhbGx5IGlmCi1yLSZndDtwb29sIGlzIGEgc3VicmVxdWVzdCEpLiAgU28gdGhlIGNvcnJlY3QgdGhpbmcgdG8gZG8gaXMgdG8gYWxsb2NhdGUKLWZyb20gY29ubmVjdGlvbi0mZ3Q7cG9vbC4KLTwvUD4KLTxQPgotQW5kIHRoZXJlIHdhcyBhbm90aGVyIGludGVyZXN0aW5nIGJ1ZyBpbiBtb2RfaW5jbHVkZS9tb2RfY2dpLiAgWW91J2xsIHNlZQotaW4gdGhvc2UgdGhhdCB0aGV5IGRvIHRoaXMgdGVzdCB0byBkZWNpZGUgaWYgdGhleSBzaG91bGQgdXNlIHItJmd0O3Bvb2wKLW9yIHItJmd0O21haW4tJmd0O3Bvb2wuICBJbiB0aGlzIGNhc2UgdGhlIHJlc291cmNlIHRoYXQgdGhleSBhcmUgcmVnaXN0ZXJpbmcKLWZvciBjbGVhbnVwIGlzIGEgY2hpbGQgcHJvY2Vzcy4gIElmIGl0IHdlcmUgcmVnaXN0ZXJlZCBpbiByLSZndDtwb29sLAotdGhlbiB0aGUgY29kZSB3b3VsZCB3YWl0KCkgZm9yIHRoZSBjaGlsZCB3aGVuIHRoZSBzdWJyZXF1ZXN0IGZpbmlzaGVzLgotV2l0aCBtb2RfaW5jbHVkZSB0aGlzIGNvdWxkIGJlIGFueSBvbGQgI2luY2x1ZGUsIGFuZCB0aGUgZGVsYXkgY2FuIGJlIHVwCi10byAzIHNlY29uZHMuLi4gYW5kIGhhcHBlbmVkIHF1aXRlIGZyZXF1ZW50bHkuICBJbnN0ZWFkIHRoZSBzdWJwcm9jZXNzCi1pcyByZWdpc3RlcmVkIGluIHItJmd0O21haW4tJmd0O3Bvb2wgd2hpY2ggY2F1c2VzIGl0IHRvIGJlIGNsZWFuZWQgdXAgd2hlbgotdGhlIGVudGlyZSByZXF1ZXN0IGlzIGRvbmUgLS0gPEVNPmkuZS48L0VNPiwgYWZ0ZXIgdGhlIG91dHB1dCBoYXMgYmVlbiBzZW50IHRvCi10aGUgY2xpZW50IGFuZCBsb2dnaW5nIGhhcyBoYXBwZW5lZC4KLTwvUD4KLTxIMz48QSBOQU1FPSJwb29sLWZpbGVzIj5UcmFja2luZyBvcGVuIGZpbGVzLCBldGMuPC9BPjwvSDM+Ci08UD4KLUFzIGluZGljYXRlZCBhYm92ZSwgcmVzb3VyY2UgcG9vbHMgYXJlIGFsc28gdXNlZCB0byB0cmFjayBvdGhlciBzb3J0cwotb2YgcmVzb3VyY2VzIGJlc2lkZXMgbWVtb3J5LiAgVGhlIG1vc3QgY29tbW9uIGFyZSBvcGVuIGZpbGVzLiAgVGhlCi1yb3V0aW5lIHdoaWNoIGlzIHR5cGljYWxseSB1c2VkIGZvciB0aGlzIGlzIDxDT0RFPmFwX3Bmb3BlbjwvQ09ERT4sIHdoaWNoCi10YWtlcyBhIHJlc291cmNlIHBvb2wgYW5kIHR3byBzdHJpbmdzIGFzIGFyZ3VtZW50czsgdGhlIHN0cmluZ3MgYXJlCi10aGUgc2FtZSBhcyB0aGUgdHlwaWNhbCBhcmd1bWVudHMgdG8gPENPREU+Zm9wZW48L0NPREU+LCA8RU0+ZS5nLjwvRU0+LAotPC9QPgotPFBSRT4KLSAgICAgLi4uCi0gICAgIEZJTEUgKmYgPSBhcF9wZm9wZW4gKHItJmd0O3Bvb2wsIHItJmd0O2ZpbGVuYW1lLCAiciIpOwotCi0gICAgIGlmIChmID09IE5VTEwpIHsgLi4uIH0gZWxzZSB7IC4uLiB9Ci08L1BSRT4KLTxQPgotVGhlcmUgaXMgYWxzbyBhIDxDT0RFPmFwX3BvcGVuZjwvQ09ERT4gcm91dGluZSwgd2hpY2ggcGFyYWxsZWxzIHRoZQotbG93ZXItbGV2ZWwgPENPREU+b3BlbjwvQ09ERT4gc3lzdGVtIGNhbGwuICBCb3RoIG9mIHRoZXNlIHJvdXRpbmVzCi1hcnJhbmdlIGZvciB0aGUgZmlsZSB0byBiZSBjbG9zZWQgd2hlbiB0aGUgcmVzb3VyY2UgcG9vbCBpbiBxdWVzdGlvbgotaXMgY2xlYXJlZC4KLTwvUD4KLTxQPgotVW5saWtlIHRoZSBjYXNlIGZvciBtZW1vcnksIHRoZXJlIDxFTT5hcmU8L0VNPiBmdW5jdGlvbnMgdG8gY2xvc2UKLWZpbGVzIGFsbG9jYXRlZCB3aXRoIDxDT0RFPmFwX3Bmb3BlbjwvQ09ERT4sIGFuZCA8Q09ERT5hcF9wb3BlbmY8L0NPREU+LAotbmFtZWx5IDxDT0RFPmFwX3BmY2xvc2U8L0NPREU+IGFuZCA8Q09ERT5hcF9wY2xvc2VmPC9DT0RFPi4gIChUaGlzIGlzCi1iZWNhdXNlLCBvbiBtYW55IHN5c3RlbXMsIHRoZSBudW1iZXIgb2YgZmlsZXMgd2hpY2ggYSBzaW5nbGUgcHJvY2VzcwotY2FuIGhhdmUgb3BlbiBpcyBxdWl0ZSBsaW1pdGVkKS4gIEl0IGlzIGltcG9ydGFudCB0byB1c2UgdGhlc2UKLWZ1bmN0aW9ucyB0byBjbG9zZSBmaWxlcyBhbGxvY2F0ZWQgd2l0aCA8Q09ERT5hcF9wZm9wZW48L0NPREU+IGFuZAotPENPREU+YXBfcG9wZW5mPC9DT0RFPiwgc2luY2UgdG8gZG8gb3RoZXJ3aXNlIGNvdWxkIGNhdXNlIGZhdGFsIGVycm9ycyBvbgotc3lzdGVtcyBzdWNoIGFzIExpbnV4LCB3aGljaCByZWFjdCBiYWRseSBpZiB0aGUgc2FtZQotPENPREU+RklMRSo8L0NPREU+IGlzIGNsb3NlZCBtb3JlIHRoYW4gb25jZS4KLTwvUD4KLTxQPgotKFVzaW5nIHRoZSA8Q09ERT5jbG9zZTwvQ09ERT4gZnVuY3Rpb25zIGlzIG5vdCBtYW5kYXRvcnksIHNpbmNlIHRoZQotZmlsZSB3aWxsIGV2ZW50dWFsbHkgYmUgY2xvc2VkIHJlZ2FyZGxlc3MsIGJ1dCB5b3Ugc2hvdWxkIGNvbnNpZGVyIGl0Ci1pbiBjYXNlcyB3aGVyZSB5b3VyIG1vZHVsZSBpcyBvcGVuaW5nLCBvciBjb3VsZCBvcGVuLCBhIGxvdCBvZiBmaWxlcykuCi08L1A+Ci08SDM+T3RoZXIgc29ydHMgb2YgcmVzb3VyY2VzIC0tLSBjbGVhbnVwIGZ1bmN0aW9uczwvSDM+Ci08QkxPQ0tRVU9URT4KLU1vcmUgdGV4dCBnb2VzIGhlcmUuICBEZXNjcmliZSB0aGUgdGhlIGNsZWFudXAgcHJpbWl0aXZlcyBpbiB0ZXJtcyBvZgotd2hpY2ggdGhlIGZpbGUgc3R1ZmYgaXMgaW1wbGVtZW50ZWQ7IGFsc28sIDxDT0RFPnNwYXduX3Byb2Nlc3M8L0NPREU+LgotPC9CTE9DS1FVT1RFPgotPFA+Ci1Qb29sIGNsZWFudXBzIGxpdmUgdW50aWwgY2xlYXJfcG9vbCgpIGlzIGNhbGxlZDogIGNsZWFyX3Bvb2woYSkgcmVjdXJzaXZlbHkKLWNhbGxzIGRlc3Ryb3lfcG9vbCgpIG9uIGFsbCBzdWJwb29scyBvZiBhOyB0aGVuIGNhbGxzIGFsbCB0aGUgY2xlYW51cHMgZm9yIGE7IAotdGhlbiByZWxlYXNlcyBhbGwgdGhlIG1lbW9yeSBmb3IgYS4gIGRlc3Ryb3lfcG9vbChhKSBjYWxscyBjbGVhcl9wb29sKGEpIAotYW5kIHRoZW4gcmVsZWFzZXMgdGhlIHBvb2wgc3RydWN0dXJlIGl0c2VsZi4gIDxFTT5pLmUuPC9FTT4sIGNsZWFyX3Bvb2woYSkgZG9lc24ndAotZGVsZXRlIGEsIGl0IGp1c3QgZnJlZXMgdXAgYWxsIHRoZSByZXNvdXJjZXMgYW5kIHlvdSBjYW4gc3RhcnQgdXNpbmcgaXQKLWFnYWluIGltbWVkaWF0ZWx5LiAKLTwvUD4KLTxIMz5GaW5lIGNvbnRyb2wgLS0tIGNyZWF0aW5nIGFuZCBkZWFsaW5nIHdpdGggc3ViLXBvb2xzLCB3aXRoIGEgbm90ZQotb24gc3ViLXJlcXVlc3RzPC9IMz4KLQotT24gcmFyZSBvY2Nhc2lvbnMsIHRvby1mcmVlIHVzZSBvZiA8Q09ERT5hcF9wYWxsb2MoKTwvQ09ERT4gYW5kIHRoZQotYXNzb2NpYXRlZCBwcmltaXRpdmVzIG1heSByZXN1bHQgaW4gdW5kZXNpcmFibHkgcHJvZmxpZ2F0ZSByZXNvdXJjZQotYWxsb2NhdGlvbi4gIFlvdSBjYW4gZGVhbCB3aXRoIHN1Y2ggYSBjYXNlIGJ5IGNyZWF0aW5nIGEKLTxFTT5zdWItcG9vbDwvRU0+LCBhbGxvY2F0aW5nIHdpdGhpbiB0aGUgc3ViLXBvb2wgcmF0aGVyIHRoYW4gdGhlIG1haW4KLXBvb2wsIGFuZCBjbGVhcmluZyBvciBkZXN0cm95aW5nIHRoZSBzdWItcG9vbCwgd2hpY2ggcmVsZWFzZXMgdGhlCi1yZXNvdXJjZXMgd2hpY2ggd2VyZSBhc3NvY2lhdGVkIHdpdGggaXQuICAoVGhpcyByZWFsbHkgPEVNPmlzPC9FTT4gYQotcmFyZSBzaXR1YXRpb247IHRoZSBvbmx5IGNhc2UgaW4gd2hpY2ggaXQgY29tZXMgdXAgaW4gdGhlIHN0YW5kYXJkCi1tb2R1bGUgc2V0IGlzIGluIGNhc2Ugb2YgbGlzdGluZyBkaXJlY3RvcmllcywgYW5kIHRoZW4gb25seSB3aXRoCi08RU0+dmVyeTwvRU0+IGxhcmdlIGRpcmVjdG9yaWVzLiAgVW5uZWNlc3NhcnkgdXNlIG9mIHRoZSBwcmltaXRpdmVzCi1kaXNjdXNzZWQgaGVyZSBjYW4gaGFpciB1cCB5b3VyIGNvZGUgcXVpdGUgYSBiaXQsIHdpdGggdmVyeSBsaXR0bGUKLWdhaW4pLiA8UD4KLQotVGhlIHByaW1pdGl2ZSBmb3IgY3JlYXRpbmcgYSBzdWItcG9vbCBpcyA8Q09ERT5hcF9tYWtlX3N1Yl9wb29sPC9DT0RFPiwKLXdoaWNoIHRha2VzIGFub3RoZXIgcG9vbCAodGhlIHBhcmVudCBwb29sKSBhcyBhbiBhcmd1bWVudC4gIFdoZW4gdGhlCi1tYWluIHBvb2wgaXMgY2xlYXJlZCwgdGhlIHN1Yi1wb29sIHdpbGwgYmUgZGVzdHJveWVkLiAgVGhlIHN1Yi1wb29sCi1tYXkgYWxzbyBiZSBjbGVhcmVkIG9yIGRlc3Ryb3llZCBhdCBhbnkgdGltZSwgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb25zCi08Q09ERT5hcF9jbGVhcl9wb29sPC9DT0RFPiBhbmQgPENPREU+YXBfZGVzdHJveV9wb29sPC9DT0RFPiwgcmVzcGVjdGl2ZWx5LgotKFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgPENPREU+YXBfY2xlYXJfcG9vbDwvQ09ERT4gZnJlZXMgcmVzb3VyY2VzCi1hc3NvY2lhdGVkIHdpdGggdGhlIHBvb2wsIHdoaWxlIDxDT0RFPmFwX2Rlc3Ryb3lfcG9vbDwvQ09ERT4gYWxzbwotZGVhbGxvY2F0ZXMgdGhlIHBvb2wgaXRzZWxmLiAgSW4gdGhlIGZvcm1lciBjYXNlLCB5b3UgY2FuIGFsbG9jYXRlIG5ldwotcmVzb3VyY2VzIHdpdGhpbiB0aGUgcG9vbCwgYW5kIGNsZWFyIGl0IGFnYWluLCBhbmQgc28gZm9ydGg7IGluIHRoZQotbGF0dGVyIGNhc2UsIGl0IGlzIHNpbXBseSBnb25lKS4gPFA+Ci0KLU9uZSBmaW5hbCBub3RlIC0tLSBzdWItcmVxdWVzdHMgaGF2ZSB0aGVpciBvd24gcmVzb3VyY2UgcG9vbHMsIHdoaWNoCi1hcmUgc3ViLXBvb2xzIG9mIHRoZSByZXNvdXJjZSBwb29sIGZvciB0aGUgbWFpbiByZXF1ZXN0LiAgVGhlIHBvbGl0ZQotd2F5IHRvIHJlY2xhaW0gdGhlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBzdWIgcmVxdWVzdCB3aGljaCB5b3UKLWhhdmUgYWxsb2NhdGVkICh1c2luZyB0aGUgPENPREU+YXBfc3ViX3JlcV8uLi48L0NPREU+IGZ1bmN0aW9ucykKLWlzIDxDT0RFPmFwX2Rlc3Ryb3lfc3ViX3JlcTwvQ09ERT4sIHdoaWNoIGZyZWVzIHRoZSByZXNvdXJjZSBwb29sLgotQmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgYmUgc3VyZSB0byBjb3B5IGFueXRoaW5nIHRoYXQgeW91IGNhcmUKLWFib3V0IHdoaWNoIG1pZ2h0IGJlIGFsbG9jYXRlZCBpbiB0aGUgc3ViLXJlcXVlc3QncyByZXNvdXJjZSBwb29sIGludG8KLXNvbWVwbGFjZSBhIGxpdHRsZSBsZXNzIHZvbGF0aWxlIChmb3IgaW5zdGFuY2UsIHRoZSBmaWxlbmFtZSBpbiBpdHMKLTxDT0RFPnJlcXVlc3RfcmVjPC9DT0RFPiBzdHJ1Y3R1cmUpLiA8UD4KLQotKEFnYWluLCB1bmRlciBtb3N0IGNpcmN1bXN0YW5jZXMsIHlvdSBzaG91bGRuJ3QgZmVlbCBvYmxpZ2VkIHRvIGNhbGwKLXRoaXMgZnVuY3Rpb247IG9ubHkgMksgb2YgbWVtb3J5IG9yIHNvIGFyZSBhbGxvY2F0ZWQgZm9yIGEgdHlwaWNhbCBzdWIKLXJlcXVlc3QsIGFuZCBpdCB3aWxsIGJlIGZyZWVkIGFueXdheSB3aGVuIHRoZSBtYWluIHJlcXVlc3QgcG9vbCBpcwotY2xlYXJlZC4gIEl0IGlzIG9ubHkgd2hlbiB5b3UgYXJlIGFsbG9jYXRpbmcgbWFueSwgbWFueSBzdWItcmVxdWVzdHMKLWZvciBhIHNpbmdsZSBtYWluIHJlcXVlc3QgdGhhdCB5b3Ugc2hvdWxkIHNlcmlvdXNseSBjb25zaWRlciB0aGUKLTxDT0RFPmFwX2Rlc3Ryb3lfLi4uPC9DT0RFPiBmdW5jdGlvbnMpLgotCi08SDI+PEEgTkFNRT0iY29uZmlnIj5Db25maWd1cmF0aW9uLCBjb21tYW5kcyBhbmQgdGhlIGxpa2U8L0E+PC9IMj4KLQotT25lIG9mIHRoZSBkZXNpZ24gZ29hbHMgZm9yIHRoaXMgc2VydmVyIHdhcyB0byBtYWludGFpbiBleHRlcm5hbAotY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBOQ1NBIDEuMyBzZXJ2ZXIgLS0tIHRoYXQgaXMsIHRvIHJlYWQgdGhlIHNhbWUKLWNvbmZpZ3VyYXRpb24gZmlsZXMsIHRvIHByb2Nlc3MgYWxsIHRoZSBkaXJlY3RpdmVzIHRoZXJlaW4gY29ycmVjdGx5LAotYW5kIGluIGdlbmVyYWwgdG8gYmUgYSBkcm9wLWluIHJlcGxhY2VtZW50IGZvciBOQ1NBLiAgT24gdGhlIG90aGVyCi1oYW5kLCBhbm90aGVyIGRlc2lnbiBnb2FsIHdhcyB0byBtb3ZlIGFzIG11Y2ggb2YgdGhlIHNlcnZlcidzCi1mdW5jdGlvbmFsaXR5IGludG8gbW9kdWxlcyB3aGljaCBoYXZlIGFzIGxpdHRsZSBhcyBwb3NzaWJsZSB0byBkbyB3aXRoCi10aGUgbW9ub2xpdGhpYyBzZXJ2ZXIgY29yZS4gIFRoZSBvbmx5IHdheSB0byByZWNvbmNpbGUgdGhlc2UgZ29hbHMgaXMKLXRvIG1vdmUgdGhlIGhhbmRsaW5nIG9mIG1vc3QgY29tbWFuZHMgZnJvbSB0aGUgY2VudHJhbCBzZXJ2ZXIgaW50byB0aGUKLW1vZHVsZXMuICA8UD4KLQotSG93ZXZlciwganVzdCBnaXZpbmcgdGhlIG1vZHVsZXMgY29tbWFuZCB0YWJsZXMgaXMgbm90IGVub3VnaCB0bwotZGl2b3JjZSB0aGVtIGNvbXBsZXRlbHkgZnJvbSB0aGUgc2VydmVyIGNvcmUuICBUaGUgc2VydmVyIGhhcyB0bwotcmVtZW1iZXIgdGhlIGNvbW1hbmRzIGluIG9yZGVyIHRvIGFjdCBvbiB0aGVtIGxhdGVyLiAgVGhhdCBpbnZvbHZlcwotbWFpbnRhaW5pbmcgZGF0YSB3aGljaCBpcyBwcml2YXRlIHRvIHRoZSBtb2R1bGVzLCBhbmQgd2hpY2ggY2FuIGJlCi1laXRoZXIgcGVyLXNlcnZlciwgb3IgcGVyLWRpcmVjdG9yeS4gIE1vc3QgdGhpbmdzIGFyZSBwZXItZGlyZWN0b3J5LAotaW5jbHVkaW5nIGluIHBhcnRpY3VsYXIgYWNjZXNzIGNvbnRyb2wgYW5kIGF1dGhvcml6YXRpb24gaW5mb3JtYXRpb24sCi1idXQgYWxzbyBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZGV0ZXJtaW5lIGZpbGUgdHlwZXMgZnJvbSBzdWZmaXhlcywKLXdoaWNoIGNhbiBiZSBtb2RpZmllZCBieSA8Q09ERT5BZGRUeXBlPC9DT0RFPiBhbmQKLTxDT0RFPkRlZmF1bHRUeXBlPC9DT0RFPiBkaXJlY3RpdmVzLCBhbmQgc28gZm9ydGguICBJbiBnZW5lcmFsLCB0aGUKLWdvdmVybmluZyBwaGlsb3NvcGh5IGlzIHRoYXQgYW55dGhpbmcgd2hpY2ggPEVNPmNhbjwvRU0+IGJlIG1hZGUKLWNvbmZpZ3VyYWJsZSBieSBkaXJlY3Rvcnkgc2hvdWxkIGJlOyBwZXItc2VydmVyIGluZm9ybWF0aW9uIGlzCi1nZW5lcmFsbHkgdXNlZCBpbiB0aGUgc3RhbmRhcmQgc2V0IG9mIG1vZHVsZXMgZm9yIGluZm9ybWF0aW9uIGxpa2UKLTxDT0RFPkFsaWFzPC9DT0RFPmVzIGFuZCA8Q09ERT5SZWRpcmVjdDwvQ09ERT5zIHdoaWNoIGNvbWUgaW50byBwbGF5Ci1iZWZvcmUgdGhlIHJlcXVlc3QgaXMgdGllZCB0byBhIHBhcnRpY3VsYXIgcGxhY2UgaW4gdGhlIHVuZGVybHlpbmcKLWZpbGUgc3lzdGVtLiA8UD4KLQotQW5vdGhlciByZXF1aXJlbWVudCBmb3IgZW11bGF0aW5nIHRoZSBOQ1NBIHNlcnZlciBpcyBiZWluZyBhYmxlIHRvCi1oYW5kbGUgdGhlIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiBmaWxlcywgZ2VuZXJhbGx5IGNhbGxlZAotPENPREU+Lmh0YWNjZXNzPC9DT0RFPiBmaWxlcywgdGhvdWdoIGV2ZW4gaW4gdGhlIE5DU0Egc2VydmVyIHRoZXkgY2FuCi1jb250YWluIGRpcmVjdGl2ZXMgd2hpY2ggaGF2ZSBub3RoaW5nIGF0IGFsbCB0byBkbyB3aXRoIGFjY2VzcwotY29udHJvbC4gIEFjY29yZGluZ2x5LCBhZnRlciBVUkkgLSZndDsgZmlsZW5hbWUgdHJhbnNsYXRpb24sIGJ1dCBiZWZvcmUKLXBlcmZvcm1pbmcgYW55IG90aGVyIHBoYXNlLCB0aGUgc2VydmVyIHdhbGtzIGRvd24gdGhlIGRpcmVjdG9yeQotaGllcmFyY2h5IG9mIHRoZSB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0sIGZvbGxvd2luZyB0aGUgdHJhbnNsYXRlZAotcGF0aG5hbWUsIHRvIHJlYWQgYW55IDxDT0RFPi5odGFjY2VzczwvQ09ERT4gZmlsZXMgd2hpY2ggbWlnaHQgYmUKLXByZXNlbnQuICBUaGUgaW5mb3JtYXRpb24gd2hpY2ggaXMgcmVhZCBpbiB0aGVuIGhhcyB0byBiZQotPEVNPm1lcmdlZDwvRU0+IHdpdGggdGhlIGFwcGxpY2FibGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgc2VydmVyJ3Mgb3duCi1jb25maWcgZmlsZXMgKGVpdGhlciBmcm9tIHRoZSA8Q09ERT4mbHQ7RGlyZWN0b3J5Jmd0OzwvQ09ERT4gc2VjdGlvbnMKLWluIDxDT0RFPmFjY2Vzcy5jb25mPC9DT0RFPiwgb3IgZnJvbSBkZWZhdWx0cyBpbgotPENPREU+c3JtLmNvbmY8L0NPREU+LCB3aGljaCBhY3R1YWxseSBiZWhhdmVzIGZvciBtb3N0IHB1cnBvc2VzIGFsbW9zdAotZXhhY3RseSBsaWtlIDxDT0RFPiZsdDtEaXJlY3RvcnkgLyZndDs8L0NPREU+KS48UD4KLQotRmluYWxseSwgYWZ0ZXIgaGF2aW5nIHNlcnZlZCBhIHJlcXVlc3Qgd2hpY2ggaW52b2x2ZWQgcmVhZGluZwotPENPREU+Lmh0YWNjZXNzPC9DT0RFPiBmaWxlcywgd2UgbmVlZCB0byBkaXNjYXJkIHRoZSBzdG9yYWdlIGFsbG9jYXRlZAotZm9yIGhhbmRsaW5nIHRoZW0uICBUaGF0IGlzIHNvbHZlZCB0aGUgc2FtZSB3YXkgaXQgaXMgc29sdmVkIHdoZXJldmVyCi1lbHNlIHNpbWlsYXIgcHJvYmxlbXMgY29tZSB1cCwgYnkgdHlpbmcgdGhvc2Ugc3RydWN0dXJlcyB0byB0aGUKLXBlci10cmFuc2FjdGlvbiByZXNvdXJjZSBwb29sLiAgPFA+Ci0KLTxIMz48QSBOQU1FPSJwZXItZGlyIj5QZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlczwvQT48L0gzPgotCi1MZXQncyBsb29rIG91dCBob3cgYWxsIG9mIHRoaXMgcGxheXMgb3V0IGluIDxDT0RFPm1vZF9taW1lLmM8L0NPREU+LAotd2hpY2ggZGVmaW5lcyB0aGUgZmlsZSB0eXBpbmcgaGFuZGxlciB3aGljaCBlbXVsYXRlcyB0aGUgTkNTQSBzZXJ2ZXIncwotYmVoYXZpb3Igb2YgZGV0ZXJtaW5pbmcgZmlsZSB0eXBlcyBmcm9tIHN1ZmZpeGVzLiAgV2hhdCB3ZSdsbCBiZQotbG9va2luZyBhdCwgaGVyZSwgaXMgdGhlIGNvZGUgd2hpY2ggaW1wbGVtZW50cyB0aGUKLTxDT0RFPkFkZFR5cGU8L0NPREU+IGFuZCA8Q09ERT5BZGRFbmNvZGluZzwvQ09ERT4gY29tbWFuZHMuICBUaGVzZQotY29tbWFuZHMgY2FuIGFwcGVhciBpbiA8Q09ERT4uaHRhY2Nlc3M8L0NPREU+IGZpbGVzLCBzbyB0aGV5IG11c3QgYmUKLWhhbmRsZWQgaW4gdGhlIG1vZHVsZSdzIHByaXZhdGUgcGVyLWRpcmVjdG9yeSBkYXRhLCB3aGljaCBpbiBmYWN0LAotY29uc2lzdHMgb2YgdHdvIHNlcGFyYXRlIDxDT0RFPnRhYmxlPC9DT0RFPnMgZm9yIE1JTUUgdHlwZXMgYW5kCi1lbmNvZGluZyBpbmZvcm1hdGlvbiwgYW5kIGlzIGRlY2xhcmVkIGFzIGZvbGxvd3M6Ci0KLTxQUkU+Ci10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdGFibGUgKmZvcmNlZF90eXBlczsgICAgICAvKiBBZGRpdGlvbmFsIEFkZFR5cGVkIHN0dWZmICovCi0gICAgdGFibGUgKmVuY29kaW5nX3R5cGVzOyAgICAvKiBBZGRlZCB3aXRoIEFkZEVuY29kaW5nLi4uICovCi19IG1pbWVfZGlyX2NvbmZpZzsKLTwvUFJFPgotCi1XaGVuIHRoZSBzZXJ2ZXIgaXMgcmVhZGluZyBhIGNvbmZpZ3VyYXRpb24gZmlsZSwgb3IKLTxDT0RFPiZsdDtEaXJlY3RvcnkmZ3Q7PC9DT0RFPiBzZWN0aW9uLCB3aGljaCBpbmNsdWRlcyBvbmUgb2YgdGhlIE1JTUUKLW1vZHVsZSdzIGNvbW1hbmRzLCBpdCBuZWVkcyB0byBjcmVhdGUgYSA8Q09ERT5taW1lX2Rpcl9jb25maWc8L0NPREU+Ci1zdHJ1Y3R1cmUsIHNvIHRob3NlIGNvbW1hbmRzIGhhdmUgc29tZXRoaW5nIHRvIGFjdCBvbi4gIEl0IGRvZXMgdGhpcwotYnkgaW52b2tpbmcgdGhlIGZ1bmN0aW9uIGl0IGZpbmRzIGluIHRoZSBtb2R1bGUncyBgY3JlYXRlIHBlci1kaXIKLWNvbmZpZyBzbG90Jywgd2l0aCB0d28gYXJndW1lbnRzOiB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRvIHdoaWNoCi10aGlzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYXBwbGllcyAob3IgPENPREU+TlVMTDwvQ09ERT4gZm9yCi08Q09ERT5zcm0uY29uZjwvQ09ERT4pLCBhbmQgYSBwb2ludGVyIHRvIGEgcmVzb3VyY2UgcG9vbCBpbiB3aGljaCB0aGUKLWFsbG9jYXRpb24gc2hvdWxkIGhhcHBlbi4gPFA+Ci0KLShJZiB3ZSBhcmUgcmVhZGluZyBhIDxDT0RFPi5odGFjY2VzczwvQ09ERT4gZmlsZSwgdGhhdCByZXNvdXJjZSBwb29sCi1pcyB0aGUgcGVyLXJlcXVlc3QgcmVzb3VyY2UgcG9vbCBmb3IgdGhlIHJlcXVlc3Q7IG90aGVyd2lzZSBpdCBpcyBhCi1yZXNvdXJjZSBwb29sIHdoaWNoIGlzIHVzZWQgZm9yIGNvbmZpZ3VyYXRpb24gZGF0YSwgYW5kIGNsZWFyZWQgb24KLXJlc3RhcnRzLiAgRWl0aGVyIHdheSwgaXQgaXMgaW1wb3J0YW50IGZvciB0aGUgc3RydWN0dXJlIGJlaW5nIGNyZWF0ZWQKLXRvIHZhbmlzaCB3aGVuIHRoZSBwb29sIGlzIGNsZWFyZWQsIGJ5IHJlZ2lzdGVyaW5nIGEgY2xlYW51cCBvbiB0aGUKLXBvb2wgaWYgbmVjZXNzYXJ5KS4gPFA+Ci0KLUZvciB0aGUgTUlNRSBtb2R1bGUsIHRoZSBwZXItZGlyIGNvbmZpZyBjcmVhdGlvbiBmdW5jdGlvbiBqdXN0Ci08Q09ERT5hcF9wYWxsb2M8L0NPREU+cyB0aGUgc3RydWN0dXJlIGFib3ZlLCBhbmQgYSBjcmVhdGVzIGEgY291cGxlIG9mCi08Q09ERT50YWJsZTwvQ09ERT5zIHRvIGZpbGwgaXQuICBUaGF0IGxvb2tzIGxpa2UgdGhpczoKLQotPFBSRT4KLXZvaWQgKmNyZWF0ZV9taW1lX2Rpcl9jb25maWcgKHBvb2wgKnAsIGNoYXIgKmR1bW15KQotewotICAgIG1pbWVfZGlyX2NvbmZpZyAqbmV3ID0KLSAgICAgIChtaW1lX2Rpcl9jb25maWcgKikgYXBfcGFsbG9jIChwLCBzaXplb2YobWltZV9kaXJfY29uZmlnKSk7Ci0KLSAgICBuZXctJmd0O2ZvcmNlZF90eXBlcyA9IGFwX21ha2VfdGFibGUgKHAsIDQpOwotICAgIG5ldy0mZ3Q7ZW5jb2RpbmdfdHlwZXMgPSBhcF9tYWtlX3RhYmxlIChwLCA0KTsKLQotICAgIHJldHVybiBuZXc7Ci19Ci08L1BSRT4KLQotTm93LCBzdXBwb3NlIHdlJ3ZlIGp1c3QgcmVhZCBpbiBhIDxDT0RFPi5odGFjY2VzczwvQ09ERT4gZmlsZS4gIFdlCi1hbHJlYWR5IGhhdmUgdGhlIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBuZXh0Ci1kaXJlY3RvcnkgdXAgaW4gdGhlIGhpZXJhcmNoeS4gIElmIHRoZSA8Q09ERT4uaHRhY2Nlc3M8L0NPREU+IGZpbGUgd2UKLWp1c3QgcmVhZCBpbiBkaWRuJ3QgaGF2ZSBhbnkgPENPREU+QWRkVHlwZTwvQ09ERT4gb3IKLTxDT0RFPkFkZEVuY29kaW5nPC9DT0RFPiBjb21tYW5kcywgaXRzIHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZQotZm9yIHRoZSBNSU1FIG1vZHVsZSBpcyBzdGlsbCB2YWxpZCwgYW5kIHdlIGNhbiBqdXN0IHVzZSBpdC4KLU90aGVyd2lzZSwgd2UgbmVlZCB0byBtZXJnZSB0aGUgdHdvIHN0cnVjdHVyZXMgc29tZWhvdy4gPFA+Ci0KLVRvIGRvIHRoYXQsIHRoZSBzZXJ2ZXIgaW52b2tlcyB0aGUgbW9kdWxlJ3MgcGVyLWRpcmVjdG9yeSBjb25maWcgbWVyZ2UKLWZ1bmN0aW9uLCBpZiBvbmUgaXMgcHJlc2VudC4gIFRoYXQgZnVuY3Rpb24gdGFrZXMgdGhyZWUgYXJndW1lbnRzOgotdGhlIHR3byBzdHJ1Y3R1cmVzIGJlaW5nIG1lcmdlZCwgYW5kIGEgcmVzb3VyY2UgcG9vbCBpbiB3aGljaCB0bwotYWxsb2NhdGUgdGhlIHJlc3VsdC4gIEZvciB0aGUgTUlNRSBtb2R1bGUsIGFsbCB0aGF0IG5lZWRzIHRvIGJlIGRvbmUKLWlzIG92ZXJsYXkgdGhlIHRhYmxlcyBmcm9tIHRoZSBuZXcgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlIHdpdGgKLXRob3NlIGZyb20gdGhlIHBhcmVudDoKLQotPFBSRT4KLXZvaWQgKm1lcmdlX21pbWVfZGlyX2NvbmZpZ3MgKHBvb2wgKnAsIHZvaWQgKnBhcmVudF9kaXJ2LCB2b2lkICpzdWJkaXJ2KQotewotICAgIG1pbWVfZGlyX2NvbmZpZyAqcGFyZW50X2RpciA9IChtaW1lX2Rpcl9jb25maWcgKilwYXJlbnRfZGlydjsKLSAgICBtaW1lX2Rpcl9jb25maWcgKnN1YmRpciA9IChtaW1lX2Rpcl9jb25maWcgKilzdWJkaXJ2OwotICAgIG1pbWVfZGlyX2NvbmZpZyAqbmV3ID0KLSAgICAgIChtaW1lX2Rpcl9jb25maWcgKilhcF9wYWxsb2MgKHAsIHNpemVvZihtaW1lX2Rpcl9jb25maWcpKTsKLQotICAgIG5ldy0mZ3Q7Zm9yY2VkX3R5cGVzID0gYXBfb3ZlcmxheV90YWJsZXMgKHAsIHN1YmRpci0mZ3Q7Zm9yY2VkX3R5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF9kaXItJmd0O2ZvcmNlZF90eXBlcyk7Ci0gICAgbmV3LSZndDtlbmNvZGluZ190eXBlcyA9IGFwX292ZXJsYXlfdGFibGVzIChwLCBzdWJkaXItJmd0O2VuY29kaW5nX3R5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50X2Rpci0mZ3Q7ZW5jb2RpbmdfdHlwZXMpOwotCi0gICAgcmV0dXJuIG5ldzsKLX0KLTwvUFJFPgotCi1BcyBhIG5vdGUgLS0tIGlmIHRoZXJlIGlzIG5vIHBlci1kaXJlY3RvcnkgbWVyZ2UgZnVuY3Rpb24gcHJlc2VudCwgdGhlCi1zZXJ2ZXIgd2lsbCBqdXN0IHVzZSB0aGUgc3ViZGlyZWN0b3J5J3MgY29uZmlndXJhdGlvbiBpbmZvLCBhbmQgaWdub3JlCi10aGUgcGFyZW50J3MuICBGb3Igc29tZSBtb2R1bGVzLCB0aGF0IHdvcmtzIGp1c3QgZmluZSAoPEVNPmUuZy48L0VNPiwgZm9yIHRoZQotaW5jbHVkZXMgbW9kdWxlLCB3aG9zZSBwZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLWNvbnNpc3RzIHNvbGVseSBvZiB0aGUgc3RhdGUgb2YgdGhlIDxDT0RFPlhCSVRIQUNLPC9DT0RFPiksIGFuZCBmb3IKLXRob3NlIG1vZHVsZXMsIHlvdSBjYW4ganVzdCBub3QgZGVjbGFyZSBvbmUsIGFuZCBsZWF2ZSB0aGUKLWNvcnJlc3BvbmRpbmcgc3RydWN0dXJlIHNsb3QgaW4gdGhlIG1vZHVsZSBpdHNlbGYgPENPREU+TlVMTDwvQ09ERT4uPFA+Ci0KLTxIMz48QSBOQU1FPSJjb21tYW5kcyI+Q29tbWFuZCBoYW5kbGluZzwvQT48L0gzPgotCi1Ob3cgdGhhdCB3ZSBoYXZlIHRoZXNlIHN0cnVjdHVyZXMsIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBmaWd1cmUgb3V0Ci1ob3cgdG8gZmlsbCB0aGVtLiAgVGhhdCBpbnZvbHZlcyBwcm9jZXNzaW5nIHRoZSBhY3R1YWwKLTxDT0RFPkFkZFR5cGU8L0NPREU+IGFuZCA8Q09ERT5BZGRFbmNvZGluZzwvQ09ERT4gY29tbWFuZHMuICBUbyBmaW5kCi1jb21tYW5kcywgdGhlIHNlcnZlciBsb29rcyBpbiB0aGUgbW9kdWxlJ3MgPENPREU+Y29tbWFuZCB0YWJsZTwvQ09ERT4uCi1UaGF0IHRhYmxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGhvdyBtYW55IGFyZ3VtZW50cyB0aGUgY29tbWFuZHMKLXRha2UsIGFuZCBpbiB3aGF0IGZvcm1hdHMsIHdoZXJlIGl0IGlzIHBlcm1pdHRlZCwgYW5kIHNvIGZvcnRoLiAgVGhhdAotaW5mb3JtYXRpb24gaXMgc3VmZmljaWVudCB0byBhbGxvdyB0aGUgc2VydmVyIHRvIGludm9rZSBtb3N0Ci1jb21tYW5kLWhhbmRsaW5nIGZ1bmN0aW9ucyB3aXRoIHByZS1wYXJzZWQgYXJndW1lbnRzLiAgV2l0aG91dCBmdXJ0aGVyCi1hZG8sIGxldCdzIGxvb2sgYXQgdGhlIDxDT0RFPkFkZFR5cGU8L0NPREU+IGNvbW1hbmQgaGFuZGxlciwgd2hpY2gKLWxvb2tzIGxpa2UgdGhpcyAodGhlIDxDT0RFPkFkZEVuY29kaW5nPC9DT0RFPiBjb21tYW5kIGxvb2tzIGJhc2ljYWxseQotdGhlIHNhbWUsIGFuZCB3b24ndCBiZSBzaG93biBoZXJlKToKLQotPFBSRT4KLWNoYXIgKmFkZF90eXBlKGNtZF9wYXJtcyAqY21kLCBtaW1lX2Rpcl9jb25maWcgKm0sIGNoYXIgKmN0LCBjaGFyICpleHQpCi17Ci0gICAgaWYgKCpleHQgPT0gJy4nKSArK2V4dDsKLSAgICBhcF90YWJsZV9zZXQgKG0tJmd0O2ZvcmNlZF90eXBlcywgZXh0LCBjdCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci08L1BSRT4KLQotVGhpcyBjb21tYW5kIGhhbmRsZXIgaXMgdW51c3VhbGx5IHNpbXBsZS4gIEFzIHlvdSBjYW4gc2VlLCBpdCB0YWtlcwotZm91ciBhcmd1bWVudHMsIHR3byBvZiB3aGljaCBhcmUgcHJlLXBhcnNlZCBhcmd1bWVudHMsIHRoZSB0aGlyZCBiZWluZwotdGhlIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBtb2R1bGUgaW4gcXVlc3Rpb24sCi1hbmQgdGhlIGZvdXJ0aCBiZWluZyBhIHBvaW50ZXIgdG8gYSA8Q09ERT5jbWRfcGFybXM8L0NPREU+IHN0cnVjdHVyZS4KLVRoYXQgc3RydWN0dXJlIGNvbnRhaW5zIGEgYnVuY2ggb2YgYXJndW1lbnRzIHdoaWNoIGFyZSBmcmVxdWVudGx5IG9mCi11c2UgdG8gc29tZSwgYnV0IG5vdCBhbGwsIGNvbW1hbmRzLCBpbmNsdWRpbmcgYSByZXNvdXJjZSBwb29sIChmcm9tCi13aGljaCBtZW1vcnkgY2FuIGJlIGFsbG9jYXRlZCwgYW5kIHRvIHdoaWNoIGNsZWFudXBzIHNob3VsZCBiZSB0aWVkKSwKLWFuZCB0aGUgKHZpcnR1YWwpIHNlcnZlciBiZWluZyBjb25maWd1cmVkLCBmcm9tIHdoaWNoIHRoZSBtb2R1bGUncwotcGVyLXNlcnZlciBjb25maWd1cmF0aW9uIGRhdGEgY2FuIGJlIG9idGFpbmVkIGlmIHJlcXVpcmVkLjxQPgotCi1Bbm90aGVyIHdheSBpbiB3aGljaCB0aGlzIHBhcnRpY3VsYXIgY29tbWFuZCBoYW5kbGVyIGlzIHVudXN1YWxseQotc2ltcGxlIGlzIHRoYXQgdGhlcmUgYXJlIG5vIGVycm9yIGNvbmRpdGlvbnMgd2hpY2ggaXQgY2FuIGVuY291bnRlci4KLUlmIHRoZXJlIHdlcmUsIGl0IGNvdWxkIHJldHVybiBhbiBlcnJvciBtZXNzYWdlIGluc3RlYWQgb2YKLTxDT0RFPk5VTEw8L0NPREU+OyB0aGlzIGNhdXNlcyBhbiBlcnJvciB0byBiZSBwcmludGVkIG91dCBvbiB0aGUKLXNlcnZlcidzIDxDT0RFPnN0ZGVycjwvQ09ERT4sIGZvbGxvd2VkIGJ5IGEgcXVpY2sgZXhpdCwgaWYgaXQgaXMgaW4KLXRoZSBtYWluIGNvbmZpZyBmaWxlczsgZm9yIGEgPENPREU+Lmh0YWNjZXNzPC9DT0RFPiBmaWxlLCB0aGUgc3ludGF4Ci1lcnJvciBpcyBsb2dnZWQgaW4gdGhlIHNlcnZlciBlcnJvciBsb2cgKGFsb25nIHdpdGggYW4gaW5kaWNhdGlvbiBvZgotd2hlcmUgaXQgY2FtZSBmcm9tKSwgYW5kIHRoZSByZXF1ZXN0IGlzIGJvdW5jZWQgd2l0aCBhIHNlcnZlciBlcnJvcgotcmVzcG9uc2UgKEhUVFAgZXJyb3Igc3RhdHVzLCBjb2RlIDUwMCkuIDxQPgotCi1UaGUgTUlNRSBtb2R1bGUncyBjb21tYW5kIHRhYmxlIGhhcyBlbnRyaWVzIGZvciB0aGVzZSBjb21tYW5kcywgd2hpY2gKLWxvb2sgbGlrZSB0aGlzOgotCi08UFJFPgotY29tbWFuZF9yZWMgbWltZV9jbWRzW10gPSB7Ci17ICJBZGRUeXBlIiwgYWRkX3R5cGUsIE5VTEwsIE9SX0ZJTEVJTkZPLCBUQUtFMiwKLSAgICAiYSBtaW1lIHR5cGUgZm9sbG93ZWQgYnkgYSBmaWxlIGV4dGVuc2lvbiIgfSwKLXsgIkFkZEVuY29kaW5nIiwgYWRkX2VuY29kaW5nLCBOVUxMLCBPUl9GSUxFSU5GTywgVEFLRTIsCi0gICAgImFuIGVuY29kaW5nICg8RU0+ZS5nLjwvRU0+LCBnemlwKSwgZm9sbG93ZWQgYnkgYSBmaWxlIGV4dGVuc2lvbiIgfSwKLXsgTlVMTCB9Ci19OwotPC9QUkU+Ci0KLVRoZSBlbnRyaWVzIGluIHRoZXNlIHRhYmxlcyBhcmU6Ci0KLTxVTD4KLSAgPExJPiBUaGUgbmFtZSBvZiB0aGUgY29tbWFuZAotICA8TEk+IFRoZSBmdW5jdGlvbiB3aGljaCBoYW5kbGVzIGl0Ci0gIDxMST4gYSA8Q09ERT4odm9pZCAqKTwvQ09ERT4gcG9pbnRlciwgd2hpY2ggaXMgcGFzc2VkIGluIHRoZQotICAgICAgIDxDT0RFPmNtZF9wYXJtczwvQ09ERT4gc3RydWN0dXJlIHRvIHRoZSBjb21tYW5kIGhhbmRsZXIgLS0tCi0gICAgICAgdGhpcyBpcyB1c2VmdWwgaW4gY2FzZSBtYW55IHNpbWlsYXIgY29tbWFuZHMgYXJlIGhhbmRsZWQgYnkgdGhlCi0gICAgICAgc2FtZSBmdW5jdGlvbi4KLSAgPExJPiBBIGJpdCBtYXNrIGluZGljYXRpbmcgd2hlcmUgdGhlIGNvbW1hbmQgbWF5IGFwcGVhci4gIFRoZXJlIGFyZQotICAgICAgIG1hc2sgYml0cyBjb3JyZXNwb25kaW5nIHRvIGVhY2ggPENPREU+QWxsb3dPdmVycmlkZTwvQ09ERT4KLSAgICAgICBvcHRpb24sIGFuZCBhbiBhZGRpdGlvbmFsIG1hc2sgYml0LCA8Q09ERT5SU1JDX0NPTkY8L0NPREU+LAotICAgICAgIGluZGljYXRpbmcgdGhhdCB0aGUgY29tbWFuZCBtYXkgYXBwZWFyIGluIHRoZSBzZXJ2ZXIncyBvd24KLSAgICAgICBjb25maWcgZmlsZXMsIGJ1dCA8RU0+bm90PC9FTT4gaW4gYW55IDxDT0RFPi5odGFjY2VzczwvQ09ERT4KLSAgICAgICBmaWxlLgotICA8TEk+IEEgZmxhZyBpbmRpY2F0aW5nIGhvdyBtYW55IGFyZ3VtZW50cyB0aGUgY29tbWFuZCBoYW5kbGVyIHdhbnRzCi0gICAgICAgcHJlLXBhcnNlZCwgYW5kIGhvdyB0aGV5IHNob3VsZCBiZSBwYXNzZWQgaW4uCi0gICAgICAgPENPREU+VEFLRTI8L0NPREU+IGluZGljYXRlcyB0d28gcHJlLXBhcnNlZCBhcmd1bWVudHMuICBPdGhlcgotICAgICAgIG9wdGlvbnMgYXJlIDxDT0RFPlRBS0UxPC9DT0RFPiwgd2hpY2ggaW5kaWNhdGVzIG9uZSBwcmUtcGFyc2VkCi0gICAgICAgYXJndW1lbnQsIDxDT0RFPkZMQUc8L0NPREU+LCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgYXJndW1lbnQKLSAgICAgICBzaG91bGQgYmUgPENPREU+T248L0NPREU+IG9yIDxDT0RFPk9mZjwvQ09ERT4sIGFuZCBpcyBwYXNzZWQgaW4KLSAgICAgICBhcyBhIGJvb2xlYW4gZmxhZywgPENPREU+UkFXX0FSR1M8L0NPREU+LCB3aGljaCBjYXVzZXMgdGhlCi0gICAgICAgc2VydmVyIHRvIGdpdmUgdGhlIGNvbW1hbmQgdGhlIHJhdywgdW5wYXJzZWQgYXJndW1lbnRzCi0gICAgICAgKGV2ZXJ5dGhpbmcgYnV0IHRoZSBjb21tYW5kIG5hbWUgaXRzZWxmKS4gIFRoZXJlIGlzIGFsc28KLSAgICAgICA8Q09ERT5JVEVSQVRFPC9DT0RFPiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgaGFuZGxlciBsb29rcyB0aGUKLSAgICAgICBzYW1lIGFzIDxDT0RFPlRBS0UxPC9DT0RFPiwgYnV0IHRoYXQgaWYgbXVsdGlwbGUgYXJndW1lbnRzIGFyZQotICAgICAgIHByZXNlbnQsIGl0IHNob3VsZCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIGFuZCBmaW5hbGx5Ci0gICAgICAgPENPREU+SVRFUkFURTI8L0NPREU+LCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgY29tbWFuZCBoYW5kbGVyCi0gICAgICAgbG9va3MgbGlrZSBhIDxDT0RFPlRBS0UyPC9DT0RFPiwgYnV0IGlmIG1vcmUgYXJndW1lbnRzIGFyZQotICAgICAgIHByZXNlbnQsIHRoZW4gaXQgc2hvdWxkIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcywgaG9sZGluZyB0aGUKLSAgICAgICBmaXJzdCBhcmd1bWVudCBjb25zdGFudC4KLSAgPExJPiBGaW5hbGx5LCB3ZSBoYXZlIGEgc3RyaW5nIHdoaWNoIGRlc2NyaWJlcyB0aGUgYXJndW1lbnRzIHRoYXQKLSAgICAgICBzaG91bGQgYmUgcHJlc2VudC4gIElmIHRoZSBhcmd1bWVudHMgaW4gdGhlIGFjdHVhbCBjb25maWcgZmlsZQotICAgICAgIGFyZSBub3QgYXMgcmVxdWlyZWQsIHRoaXMgc3RyaW5nIHdpbGwgYmUgdXNlZCB0byBoZWxwIGdpdmUgYQotICAgICAgIG1vcmUgc3BlY2lmaWMgZXJyb3IgbWVzc2FnZS4gIChZb3UgY2FuIHNhZmVseSBsZWF2ZSB0aGlzCi0gICAgICAgPENPREU+TlVMTDwvQ09ERT4pLgotPC9VTD4KLQotRmluYWxseSwgaGF2aW5nIHNldCB0aGlzIGFsbCB1cCwgd2UgaGF2ZSB0byB1c2UgaXQuICBUaGlzIGlzCi11bHRpbWF0ZWx5IGRvbmUgaW4gdGhlIG1vZHVsZSdzIGhhbmRsZXJzLCBzcGVjaWZpY2FsbHkgZm9yIGl0cwotZmlsZS10eXBpbmcgaGFuZGxlciwgd2hpY2ggbG9va3MgbW9yZSBvciBsZXNzIGxpa2UgdGhpczsgbm90ZSB0aGF0IHRoZQotcGVyLWRpcmVjdG9yeSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBpcyBleHRyYWN0ZWQgZnJvbSB0aGUKLTxDT0RFPnJlcXVlc3RfcmVjPC9DT0RFPidzIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiB2ZWN0b3IgYnkgdXNpbmcKLXRoZSA8Q09ERT5hcF9nZXRfbW9kdWxlX2NvbmZpZzwvQ09ERT4gZnVuY3Rpb24uCi0KLTxQUkU+Ci1pbnQgZmluZF9jdChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpbnQgaTsKLSAgICBjaGFyICpmbiA9IGFwX3BzdHJkdXAgKHItJmd0O3Bvb2wsIHItJmd0O2ZpbGVuYW1lKTsKLSAgICBtaW1lX2Rpcl9jb25maWcgKmNvbmYgPSAobWltZV9kaXJfY29uZmlnICopCi0gICAgICAgICAgICAgYXBfZ2V0X21vZHVsZV9jb25maWcoci0mZ3Q7cGVyX2Rpcl9jb25maWcsICZhbXA7bWltZV9tb2R1bGUpOwotICAgIGNoYXIgKnR5cGU7Ci0KLSAgICBpZiAoU19JU0RJUihyLSZndDtmaW5mby5zdF9tb2RlKSkgewotICAgICAgICByLSZndDtjb250ZW50X3R5cGUgPSBESVJfTUFHSUNfVFlQRTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmKChpPWFwX3JpbmQoZm4sJy4nKSkgJmx0OyAwKSByZXR1cm4gREVDTElORUQ7Ci0gICAgKytpOwotCi0gICAgaWYgKCh0eXBlID0gYXBfdGFibGVfZ2V0IChjb25mLSZndDtlbmNvZGluZ190eXBlcywgJmFtcDtmbltpXSkpKQotICAgIHsKLSAgICAgICAgci0mZ3Q7Y29udGVudF9lbmNvZGluZyA9IHR5cGU7Ci0KLSAgICAgICAgLyogZ28gYmFjayB0byBwcmV2aW91cyBleHRlbnNpb24gdG8gdHJ5IHRvIHVzZSBpdCBhcyBhIHR5cGUgKi8KLQotICAgICAgICBmbltpLTFdID0gJ1wwJzsKLSAgICAgICAgaWYoKGk9YXBfcmluZChmbiwnLicpKSAmbHQ7IDApIHJldHVybiBPSzsKLSAgICAgICAgKytpOwotICAgIH0KLQotICAgIGlmICgodHlwZSA9IGFwX3RhYmxlX2dldCAoY29uZi0mZ3Q7Zm9yY2VkX3R5cGVzLCAmYW1wO2ZuW2ldKSkpCi0gICAgewotICAgICAgICByLSZndDtjb250ZW50X3R5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotPC9QUkU+Ci0KLTxIMz48QSBOQU1FPSJzZXJ2Y29uZiI+U2lkZSBub3RlcyAtLS0gcGVyLXNlcnZlciBjb25maWd1cmF0aW9uLCB2aXJ0dWFsCi0gc2VydmVycywgPEVNPmV0YzwvRU0+LjwvQT48L0gzPgotCi1UaGUgYmFzaWMgaWRlYXMgYmVoaW5kIHBlci1zZXJ2ZXIgbW9kdWxlIGNvbmZpZ3VyYXRpb24gYXJlIGJhc2ljYWxseQotdGhlIHNhbWUgYXMgdGhvc2UgZm9yIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbjsgdGhlcmUgaXMgYSBjcmVhdGlvbgotZnVuY3Rpb24gYW5kIGEgbWVyZ2UgZnVuY3Rpb24sIHRoZSBsYXR0ZXIgYmVpbmcgaW52b2tlZCB3aGVyZSBhCi12aXJ0dWFsIHNlcnZlciBoYXMgcGFydGlhbGx5IG92ZXJyaWRkZW4gdGhlIGJhc2Ugc2VydmVyIGNvbmZpZ3VyYXRpb24sCi1hbmQgYSBjb21iaW5lZCBzdHJ1Y3R1cmUgbXVzdCBiZSBjb21wdXRlZC4gIChBcyB3aXRoIHBlci1kaXJlY3RvcnkKLWNvbmZpZ3VyYXRpb24sIHRoZSBkZWZhdWx0IGlmIG5vIG1lcmdlIGZ1bmN0aW9uIGlzIHNwZWNpZmllZCwgYW5kIGEKLW1vZHVsZSBpcyBjb25maWd1cmVkIGluIHNvbWUgdmlydHVhbCBzZXJ2ZXIsIGlzIHRoYXQgdGhlIGJhc2UKLWNvbmZpZ3VyYXRpb24gaXMgc2ltcGx5IGlnbm9yZWQpLiA8UD4KLQotVGhlIG9ubHkgc3Vic3RhbnRpYWwgZGlmZmVyZW5jZSBpcyB0aGF0IHdoZW4gYSBjb21tYW5kIG5lZWRzIHRvCi1jb25maWd1cmUgdGhlIHBlci1zZXJ2ZXIgcHJpdmF0ZSBtb2R1bGUgZGF0YSwgaXQgbmVlZHMgdG8gZ28gdG8gdGhlCi08Q09ERT5jbWRfcGFybXM8L0NPREU+IGRhdGEgdG8gZ2V0IGF0IGl0LiAgSGVyZSdzIGFuIGV4YW1wbGUsIGZyb20gdGhlCi1hbGlhcyBtb2R1bGUsIHdoaWNoIGFsc28gaW5kaWNhdGVzIGhvdyBhIHN5bnRheCBlcnJvciBjYW4gYmUgcmV0dXJuZWQKLShub3RlIHRoYXQgdGhlIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiBhcmd1bWVudCB0byB0aGUgY29tbWFuZAotaGFuZGxlciBpcyBkZWNsYXJlZCBhcyBhIGR1bW15LCBzaW5jZSB0aGUgbW9kdWxlIGRvZXNuJ3QgYWN0dWFsbHkgaGF2ZQotcGVyLWRpcmVjdG9yeSBjb25maWcgZGF0YSk6Ci0KLTxQUkU+Ci1jaGFyICphZGRfcmVkaXJlY3QoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICpmLCBjaGFyICp1cmwpCi17Ci0gICAgc2VydmVyX3JlYyAqcyA9IGNtZC0mZ3Q7c2VydmVyOwotICAgIGFsaWFzX3NlcnZlcl9jb25mICpjb25mID0gKGFsaWFzX3NlcnZlcl9jb25mICopCi0gICAgICAgICAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLSZndDttb2R1bGVfY29uZmlnLCZhbXA7YWxpYXNfbW9kdWxlKTsKLSAgICBhbGlhc19lbnRyeSAqbmV3ID0gYXBfcHVzaF9hcnJheSAoY29uZi0mZ3Q7cmVkaXJlY3RzKTsKLQotICAgIGlmICghYXBfaXNfdXJsICh1cmwpKSByZXR1cm4gIlJlZGlyZWN0IHRvIG5vbi1VUkwiOwotCi0gICAgbmV3LSZndDtmYWtlID0gZjsgbmV3LSZndDtyZWFsID0gdXJsOwotICAgIHJldHVybiBOVUxMOwotfQotPC9QUkU+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21pc2MvRkFRLUEuaHRtbCBiL2RvY3MvbWFudWFsL21pc2MvRkFRLUEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNhYWQ0NS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9taXNjL0ZBUS1BLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotPCEtLSNpZiBleHByPSIkRkFRTUFTVEVSIiAtLT4KLSA8IS0tI3NldCB2YXI9IlNUQU5EQUxPTkUiIHZhbHVlPSIiIC0tPgotIDwhLS0jc2V0IHZhcj0iSU5DTFVERUQiIHZhbHVlPSJZRVMiIC0tPgotIDwhLS0jaWYgZXhwcj0iJFFVRVJZX1NUUklORyA9IFRPQyIgLS0+Ci0gIDwhLS0jc2V0IHZhcj0iVE9DIiB2YWx1ZT0iWUVTIiAtLT4KLSAgPCEtLSNzZXQgdmFyPSJDT05URU5UIiB2YWx1ZT0iIiAtLT4KLSA8IS0tI2Vsc2UgLS0+Ci0gIDwhLS0jc2V0IHZhcj0iVE9DIiB2YWx1ZT0iIiAtLT4KLSAgPCEtLSNzZXQgdmFyPSJDT05URU5UIiB2YWx1ZT0iWUVTIiAtLT4KLSA8IS0tI2VuZGlmIC0tPgotPCEtLSNlbHNlIC0tPgotIDwhLS0jc2V0IHZhcj0iU1RBTkRBTE9ORSIgdmFsdWU9IllFUyIgLS0+Ci0gPCEtLSNzZXQgdmFyPSJJTkNMVURFRCIgdmFsdWU9IiIgLS0+Ci0gPCEtLSNzZXQgdmFyPSJUT0MiIHZhbHVlPSIiIC0tPgotIDwhLS0jc2V0IHZhcj0iQ09OVEVOVCIgdmFsdWU9IiIgLS0+Ci08IS0tI2VuZGlmIC0tPgotPCEtLSNpZiBleHByPSIkU1RBTkRBTE9ORSIgLS0+Ci08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLSA8SEVBRD4KLSAgPFRJVExFPkFwYWNoZSBTZXJ2ZXIgRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L1RJVExFPgotIDwvSEVBRD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLSA8Qk9EWQotICBCR0NPTE9SPSIjRkZGRkZGIgotICBURVhUPSIjMDAwMDAwIgotICBMSU5LPSIjMDAwMEZGIgotICBWTElOSz0iIzAwMDA4MCIKLSAgQUxJTks9IiNGRjAwMDAiCi0gPgotICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotICA8SDEgQUxJR049IkNFTlRFUiI+QXBhY2hlIFNlcnZlciBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvSDE+Ci0gIDxQPgotICAkUmV2aXNpb246IDEuMyAkICgkRGF0ZTogMTk5OS8xMi8zMSAyMzoxMToxNyAkKQotICA8L1A+Ci0gIDxQPgotICBUaGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBGQVEgaXMgYWx3YXlzIGF2YWlsYWJsZSBmcm9tIHRoZSBtYWluCi0gIEFwYWNoZSB3ZWIgc2l0ZSwgYXQKLSAgJmx0OzxBCi0gICAgICAgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvbWlzYy9GQVEuaHRtbCIKLSAgICAgICBSRUw9IkhlbHAiCi0gICAgICA+PFNBTVA+aHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvbWlzYy9GQVEuaHRtbDwvU0FNUD48L0E+Jmd0Oy4KLSAgPC9QPgotPCEtLSBOb3RlcyBhYm91dCBjaGFuZ2VzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gIC0gSWYgYWRkaW5nIGEgcmVsYXRpdmUgbGluayB0byBhbm90aGVyIHBhcnQgb2YgdGhlICAgICAgICAgICAgLS0+Ci08IS0tICAgIGRvY3VtZW50YXRpb24sICpkbyogaW5jbHVkZSB0aGUgIi5odG1sIiBwb3J0aW9uLiAgVGhlcmUncyBhIC0tPgotPCEtLSAgICBnb29kIGNoYW5jZSB0aGF0IHRoZSB1c2VyIHdpbGwgYmUgcmVhZGluZyB0aGUgZG9jdW1lbnRhdGlvbiAtLT4KLTwhLS0gICAgb24gaGlzIG93biBzeXN0ZW0sIHdoaWNoIG1heSBub3QgYmUgY29uZmlndXJlZCBmb3IgICAgICAgICAgLS0+Ci08IS0tICAgIG11bHRpdmlld3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgLSBXaGVuIGFkZGluZyBpdGVtcywgbWFrZSBzdXJlIHRoZXkncmUgcHV0IGluIHRoZSByaWdodCBwbGFjZSAtLT4KLTwhLS0gICAgLSB2ZXJpZnkgdGhhdCB0aGUgbnVtYmVyaW5nIG1hdGNoZXMgdXAuICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAtICpEb24ndCogdXNlIDxQUkU+PC9QUkU+IGJsb2NrcyAtIHRoZXkgZG9uJ3QgYXBwZWFyICAgICAgICAgIC0tPgotPCEtLSAgICBjb3JyZWN0bHkgaW4gYSByZWxpYWJsZSB3YXkgd2hlbiB0aGlzIGlzIGNvbnZlcnRlZCB0byB0ZXh0ICAtLT4KLTwhLS0gICAgd2l0aCBMeW54LiAgVXNlIDxETD48REQ+PENPREU+eHh4PEJSPnh4PC9DT0RFPjwvREQ+PC9ETD4gICAgLS0+Ci08IS0tICAgIGJsb2NrcyBpbnNpZGUgYSA8UD48L1A+IGluc3RlYWQuICBUaGlzIGlzIG5lY2Vzc2FyeSB0byBnZXQgIC0tPgotPCEtLSAgICB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW5kZW50aW5nIHJpZ2h0LiAgICAgICAgICAgICAgICAtLT4KLTwhLS0gIC0gRG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGUgYW4gSFIgdGFnIGFmdGVyIHRoZSBsYXN0IC9QIHRhZyAgICAgLS0+Ci08IS0tICAgIGJ1dCBiZWZvcmUgdGhlIC9MSSBpbiBhbiBpdGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8UD4KLSAgSWYgeW91IGFyZSByZWFkaW5nIGEgdGV4dC1vbmx5IHZlcnNpb24gb2YgdGhpcyBGQVEsIHlvdSBtYXkgZmluZCBudW1iZXJzCi0gIGVuY2xvc2VkIGluIGJyYWNrZXRzIChzdWNoIGFzICZxdW90O1sxMl0mcXVvdDspLiAgVGhlc2UgcmVmZXIgdG8gdGhlIGxpc3Qgb2YKLSAgcmVmZXJlbmNlIFVSTHMgdG8gYmUgZm91bmQgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuICBUaGVzZSByZWZlcmVuY2VzCi0gIGRvIG5vdCBhcHBlYXIsIGFuZCBhcmUgbm90IG5lZWRlZCwgZm9yIHRoZSBoeXBlcnRleHQgdmVyc2lvbi4KLSAgPC9QPgotICA8SDI+VGhlIFF1ZXN0aW9uczwvSDI+Ci08T0wgVFlQRT0iQSI+Ci08IS0tI2VuZGlmIC0tPgotPCEtLSNpZiBleHByPSIkVE9DIHx8ICRTVEFOREFMT05FIiAtLT4KLSA8TEkgVkFMVUU9IjEiPjxTVFJPTkc+QmFja2dyb3VuZDwvU1RST05HPgotICA8T0w+Ci0gICA8TEk+PEEgSFJFRj0iI3doYXQiPldoYXQgaXMgQXBhY2hlPzwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI3doeSI+V2h5IHdhcyBBcGFjaGUgY3JlYXRlZD88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNyZWxhdGUiPkhvdyBkb2VzIFRoZSBBcGFjaGUgR3JvdXAncyB3b3JrIHJlbGF0ZSB0bwotICAgIG90aGVyIHNlcnZlcnM/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjbmFtZSI+V2h5IHRoZSBuYW1lICZxdW90O0FwYWNoZSZxdW90Oz88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNjb21wYXJlIj5PSywgc28gaG93IGRvZXMgQXBhY2hlIGNvbXBhcmUgdG8gb3RoZXIgc2VydmVycz88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiN0ZXN0ZWQiPkhvdyB0aG9yb3VnaGx5IHRlc3RlZCBpcyBBcGFjaGU/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjZnV0dXJlIj5XaGF0IGFyZSB0aGUgZnV0dXJlIHBsYW5zIGZvciBBcGFjaGU/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjc3VwcG9ydCI+V2hvbSBkbyBJIGNvbnRhY3QgZm9yIHN1cHBvcnQ/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjbW9yZSI+SXMgdGhlcmUgYW55IG1vcmUgaW5mb3JtYXRpb24gb24gQXBhY2hlPzwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI3doZXJlIj5XaGVyZSBjYW4gSSBnZXQgQXBhY2hlPzwvQT4KLSAgIDwvTEk+Ci0gIDwvT0w+Ci0gPC9MST4KLTwhLS0jZW5kaWYgLS0+Ci08IS0tI2lmIGV4cHI9IiRTVEFOREFMT05FIiAtLT4KLTwvT0w+Ci0KLTxIUj4KLQotICA8SDI+VGhlIEFuc3dlcnM8L0gyPgotPCEtLSNlbmRpZiAtLT4KLTwhLS0jaWYgZXhwcj0iISAkVE9DIiAtLT4KLSAgPEgzPkEuIEJhY2tncm91bmQ8L0gzPgotPE9MPgotIDxMST48QSBOQU1FPSJ3aGF0Ij4KLSAgICAgIDxTVFJPTkc+V2hhdCBpcyBBcGFjaGU/PC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+Ci0gIEFwYWNoZSB3YXMgb3JpZ2luYWxseSBiYXNlZCBvbiBjb2RlIGFuZCBpZGVhcyBmb3VuZCBpbiB0aGUgbW9zdAotICBwb3B1bGFyIEhUVFAgc2VydmVyIG9mIHRoZSB0aW1lLi4gTkNTQSBodHRwZCAxLjMgKGVhcmx5IDE5OTUpLiBJdCBoYXMKLSAgc2luY2UgZXZvbHZlZCBpbnRvIGEgZmFyIHN1cGVyaW9yIHN5c3RlbSB3aGljaCBjYW4gcml2YWwgKGFuZCBwcm9iYWJseQotICBzdXJwYXNzKSBhbG1vc3QgYW55IG90aGVyIFVOSVggYmFzZWQgSFRUUCBzZXJ2ZXIgaW4gdGVybXMgb2YgZnVuY3Rpb25hbGl0eSwKLSAgZWZmaWNpZW5jeSBhbmQgc3BlZWQuCi0gIDwvUD4KLSAgPFA+Ci0gIFNpbmNlIGl0IGJlZ2FuLCBpdCBoYXMgYmVlbiBjb21wbGV0ZWx5IHJld3JpdHRlbiwgYW5kIGluY2x1ZGVzIG1hbnkgbmV3Ci0gIGZlYXR1cmVzLiBBcGFjaGUgaXMsIGFzIG9mIEphbnVhcnkgMTk5NywgdGhlIG1vc3QgcG9wdWxhciBXV1cgc2VydmVyIG9uCi0gIHRoZSBJbnRlcm5ldCwgYWNjb3JkaW5nIHRvIHRoZQotICA8QSBIUkVGPSJodHRwOi8vd3d3Lm5ldGNyYWZ0LmNvbS9TdXJ2ZXkvIj5OZXRjcmFmdCBTdXJ2ZXk8L0E+LgotICA8L1A+Ci0gIDxIUj4KLSA8L0xJPgotCi0gPExJPjxBIE5BTUU9IndoeSI+Ci0gICAgICA8U1RST05HPldoeSB3YXMgQXBhY2hlIGNyZWF0ZWQ/PC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+Ci0gIFRvIGFkZHJlc3MgdGhlIGNvbmNlcm5zIG9mIGEgZ3JvdXAgb2YgV1dXIHByb3ZpZGVycyBhbmQgcGFydC10aW1lIGh0dHBkCi0gIHByb2dyYW1tZXJzIHRoYXQgaHR0cGQgZGlkbid0IGJlaGF2ZSBhcyB0aGV5IHdhbnRlZCBpdCB0byBiZWhhdmUuCi0gIEFwYWNoZSBpcyBhbiBlbnRpcmVseSB2b2x1bnRlZXIgZWZmb3J0LCBjb21wbGV0ZWx5IGZ1bmRlZCBieSBpdHMKLSAgbWVtYmVycywgbm90IGJ5IGNvbW1lcmNpYWwgc2FsZXMuCi0gIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0icmVsYXRlIj4KLSAgICAgIDxTVFJPTkc+SG93IGRvZXMgVGhlIEFwYWNoZSBHcm91cCdzIHdvcmsgcmVsYXRlIHRvIG90aGVyCi0gICAgICBzZXJ2ZXIgZWZmb3J0cywgc3VjaCBhcyBOQ1NBJ3M/PC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+Ci0gIFdlLCBvZiBjb3Vyc2UsIG93ZSBhIGdyZWF0IGRlYnQgdG8gTkNTQSBhbmQgdGhlaXIgcHJvZ3JhbW1lcnMgZm9yCi0gIG1ha2luZyB0aGUgc2VydmVyIEFwYWNoZSB3YXMgYmFzZWQgb24uIFdlIG5vdywgaG93ZXZlciwgaGF2ZSBvdXIgb3duCi0gIHNlcnZlciwgYW5kIG91ciBwcm9qZWN0IGlzIG1vc3RseSBvdXIgb3duLiBUaGUgQXBhY2hlIFByb2plY3QgaXMgYW4KLSAgZW50aXJlbHkgaW5kZXBlbmRlbnQgdmVudHVyZS4KLSAgPC9QPgotICA8SFI+Ci0gPC9MST4KLQotIDxMST48QSBOQU1FPSJuYW1lIj4KLSAgICAgIDxTVFJPTkc+V2h5IHRoZSBuYW1lICZxdW90O0FwYWNoZSZxdW90Oz88L1NUUk9ORz4KLSAgICAgIDwvQT4KLSAgPFA+Ci0gIEEgY3V0ZSBuYW1lIHdoaWNoIHN0dWNrLiBBcGFjaGUgaXMgJnF1b3Q7PFNUUk9ORz5BCi0gIFBBPC9TVFJPTkc+dDxTVFJPTkc+Q0g8L1NUUk9ORz55IHNlcnZlciZxdW90Oy4gIEl0IHdhcwotICBiYXNlZCBvbiBzb21lIGV4aXN0aW5nIGNvZGUgYW5kIGEgc2VyaWVzIG9mICZxdW90O3BhdGNoIGZpbGVzJnF1b3Q7LgotICA8L1A+Ci0KLSAgPFA+Ci0gIEZvciBtYW55IGRldmVsb3BlcnMgaXQgaXMgYWxzbyBhIHJldmVyYW50IGNvbm5vdGF0aW9uIHRvIHRoZSBOYXRpdmUKLSAgQW1lcmljYW4gSW5kaWFuIHRyaWJlIG9mIEFwYWNoZSwgPEEKLSAgSFJFRj0iaHR0cDovL3d3dy5pbmRpYW5zLm9yZy93ZWxrZXIvYXBhY2hlLmh0bSI+d2VsbC1rbm93biBmb3IgdGhlaXIKLSAgc3VwZXJpb3Igc2tpbGxzIGluIHdhcmZhcmUgc3RyYXRlZ3kgYW5kIGluZXhoYXVzdGlibGUgZW5kdXJhbmNlPC9BPi4KLSAgT25saW5lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBBcGFjaGUgTmF0aW9uIGlzIHRvdWdoIHRvIGxvY2F0ZTsgd2UgCi0gIHN1Z2dlc3Qgc2VhcmNoaW5nIAotICA8QSBIUkVGPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vc2VhcmNoP3E9QXBhY2hlK05hdGlvbiI+R29vZ2xlPC9BPiwgCi0gIDxBIEhSRUY9Imh0dHA6Ly93d3cubm9ydGhlcm5saWdodC5jb20vbmxxdWVyeS5mY2c/cXI9QXBhY2hlK05hdGlvbiI+Tm9ydGhlcm5saWdodDwvQT4sIAotICA8QSBIUkVGPSJodHRwOi8vaW5mb3NlZWsuZ28uY29tL1RpdGxlcz9xdD1BcGFjaGUrTmF0aW9uIj5JbmZvc2VlazwvQT4sIG9yIAotICA8QSBIUkVGPSJodHRwOi8vd3d3LmFsbHRoZXdlYi5jb20vY2dpLWJpbi9hc2VhcmNoP3F1ZXJ5PUFwYWNoZStOYXRpb24iPkFsbFRoZVdlYjwvQT4uCi0gIDwvUD4KLSAgPFA+Ci0gIEluIGFkZGl0aW9uLCA8QQotICBIUkVGPSJodHRwOi8vd3d3LmluZGlhbi5vcmcvIj5odHRwOi8vd3d3LmluZGlhbi5vcmcvPC9BPiBhbmQgPEEKLSAgSFJFRj0iaHR0cDovL3d3dy5uYXRpdmV3ZWIuY29tLyI+aHR0cDovL3d3dy5uYXRpdmV3ZWIuY29tLzwvQT4gYXJlCi0gIHR3byBleGNlbGxlbnQgcmVzb3VyY2VzIGZvciBOYXRpdmUgQW1lcmljYW4gaW5mb3JtYXRpb24uCi0gIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0iY29tcGFyZSI+Ci0gICAgICA8U1RST05HPk9LLCBzbyBob3cgZG9lcyBBcGFjaGUgY29tcGFyZSB0byBvdGhlciBzZXJ2ZXJzPzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBGb3IgYW4gaW5kZXBlbmRlbnQgYXNzZXNzbWVudCwgc2VlCi0gIDxBIEhSRUY9Imh0dHA6Ly93ZWJjb21wYXJlLmludGVybmV0LmNvbS9jaGFydC5odG1sIj5XZWIgQ29tcGFyZTwvQT4ncwotICBjb21wYXJpc29uIGNoYXJ0LgotICA8L1A+Ci0gIDxQPgotICBBcGFjaGUgaGFzIGJlZW4gc2hvd24gdG8gYmUgc3Vic3RhbnRpYWxseSBmYXN0ZXIgdGhhbiBtYW55IG90aGVyCi0gIGZyZWUgc2VydmVycy4gQWx0aG91Z2ggY2VydGFpbiBjb21tZXJjaWFsIHNlcnZlcnMgaGF2ZSBjbGFpbWVkIHRvCi0gIHN1cnBhc3MgQXBhY2hlJ3Mgc3BlZWQgKGl0IGhhcyBub3QgYmVlbiBkZW1vbnN0cmF0ZWQgdGhhdCBhbnkgb2YgdGhlc2UKLSAgJnF1b3Q7YmVuY2htYXJrcyZxdW90OyBhcmUgYSBnb29kIHdheSBvZiBtZWFzdXJpbmcgV1dXIHNlcnZlciBzcGVlZCBhdCBhbnkKLSAgcmF0ZSksIHdlIGZlZWwgdGhhdCBpdCBpcyBiZXR0ZXIgdG8gaGF2ZSBhIG1vc3RseS1mYXN0IGZyZWUgc2VydmVyCi0gIHRoYW4gYW4gZXh0cmVtZWx5LWZhc3Qgc2VydmVyIHRoYXQgY29zdHMgdGhvdXNhbmRzIG9mIGRvbGxhcnMuIEFwYWNoZQotICBpcyBydW4gb24gc2l0ZXMgdGhhdCBnZXQgbWlsbGlvbnMgb2YgaGl0cyBwZXIgZGF5LCBhbmQgdGhleSBoYXZlCi0gIGV4cGVyaWVuY2VkIG5vIHBlcmZvcm1hbmNlIGRpZmZpY3VsdGllcy4KLSAgPC9QPgotICA8SFI+Ci0gPC9MST4KLQotIDxMST48QSBOQU1FPSJ0ZXN0ZWQiPgotICAgICAgPFNUUk9ORz5Ib3cgdGhvcm91Z2hseSB0ZXN0ZWQgaXMgQXBhY2hlPzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBBcGFjaGUgaXMgcnVuIG9uIG92ZXIgMyBtaWxsaW9uIEludGVybmV0IHNlcnZlcnMgKGFzIG9mIEp1bmUgMTk5OSkuIEl0IGhhcwotICBiZWVuIHRlc3RlZCB0aG9yb3VnaGx5IGJ5IGJvdGggZGV2ZWxvcGVycyBhbmQgdXNlcnMuIFRoZSBBcGFjaGUgR3JvdXAKLSAgbWFpbnRhaW5zIHJpZ29yb3VzIHN0YW5kYXJkcyBiZWZvcmUgcmVsZWFzaW5nIG5ldyB2ZXJzaW9ucyBvZiB0aGVpcgotICBzZXJ2ZXIsIGFuZCBvdXIgc2VydmVyIHJ1bnMgd2l0aG91dCBhIGhpdGNoIG9uIG92ZXIgb25lIGhhbGYgb2YgYWxsCi0gIFdXVyBzZXJ2ZXJzIGF2YWlsYWJsZSBvbiB0aGUgSW50ZXJuZXQuICBXaGVuIGJ1Z3MgZG8gc2hvdyB1cCwgd2UKLSAgcmVsZWFzZSBwYXRjaGVzIGFuZCBuZXcgdmVyc2lvbnMgYXMgc29vbiBhcyB0aGV5IGFyZSBhdmFpbGFibGUuCi0gIDwvUD4KLSAgPFA+Ci0gIFRoZSBBcGFjaGUgcHJvamVjdCdzIHdlYiBzaXRlIGluY2x1ZGVzIGEgcGFnZSB3aXRoIGEgcGFydGlhbCBsaXN0IG9mCi0gIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9pbmZvL2FwYWNoZV91c2Vycy5odG1sIj5zaXRlcyBydW5uaW5nCi0gIEFwYWNoZTwvQT4uCi0gIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0iZnV0dXJlIj4KLSAgICAgIDxTVFJPTkc+V2hhdCBhcmUgdGhlIGZ1dHVyZSBwbGFucyBmb3IgQXBhY2hlPzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICA8VUw+Ci0gICA8TEk+dG8gY29udGludWUgdG8gYmUgYW4gIm9wZW4gc291cmNlIiBuby1jaGFyZ2UtZm9yLXVzZSBIVFRQIHNlcnZlciwKLSAgIDwvTEk+Ci0gICA8TEk+dG8ga2VlcCB1cCB3aXRoIGFkdmFuY2VzIGluIEhUVFAgcHJvdG9jb2wgYW5kIHdlYiBkZXZlbG9wbWVudHMgaW4KLSAgICBnZW5lcmFsLAotICAgPC9MST4KLSAgIDxMST50byBjb2xsZWN0IHN1Z2dlc3Rpb25zIGZvciBmaXhlcy9pbXByb3ZlbWVudHMgZnJvbSBpdHMgdXNlcnMsCi0gICA8L0xJPgotICAgPExJPnRvIHJlc3BvbmQgdG8gbmVlZHMgb2YgbGFyZ2Ugdm9sdW1lIHByb3ZpZGVycyBhcyB3ZWxsIGFzCi0gICAgb2NjYXNpb25hbCB1c2Vycy4KLSAgIDwvTEk+Ci0gIDwvVUw+Ci0gIDxQPjwvUD4KLSAgPEhSPgotIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0ic3VwcG9ydCI+Ci0gICAgICA8U1RST05HPldob20gZG8gSSBjb250YWN0IGZvciBzdXBwb3J0PzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBUaGVyZSBpcyBubyBvZmZpY2lhbCBzdXBwb3J0IGZvciBBcGFjaGUuIE5vbmUgb2YgdGhlIGRldmVsb3BlcnMgd2FudCB0bwotICBiZSBzd2FtcGVkIGJ5IGEgZmxvb2Qgb2YgdHJpdmlhbCBxdWVzdGlvbnMgdGhhdCBjYW4gYmUgcmVzb2x2ZWQgZWxzZXdoZXJlLgotICBCdWcgcmVwb3J0cyBhbmQgc3VnZ2VzdGlvbnMgc2hvdWxkIGJlIHNlbnQgPEVNPnZpYTwvRU0+Ci0gIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9idWdfcmVwb3J0Lmh0bWwiPnRoZSBidWcgcmVwb3J0IHBhZ2U8L0E+LgotICBPdGhlciBxdWVzdGlvbnMgc2hvdWxkIGJlIGRpcmVjdGVkIHRvIHRoZQotICA8QSBIUkVGPSJuZXdzOmNvbXAuaW5mb3N5c3RlbXMud3d3LnNlcnZlcnMudW5peCIKLSAgPmNvbXAuaW5mb3N5c3RlbXMud3d3LnNlcnZlcnMudW5peDwvQT4gb3IgPEEgSFJFRj0KLSAgIm5ld3M6Y29tcC5pbmZvc3lzdGVtcy53d3cuc2VydmVycy5tcy13aW5kb3dzIgotICA+Y29tcC5pbmZvc3lzdGVtcy53d3cuc2VydmVycy5tcy13aW5kb3dzPC9BPgotICBuZXdzZ3JvdXAgKGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgcGxhdGZvcm0geW91IHVzZSksIHdoZXJlIHNvbWUgb2YgdGhlIAotICBBcGFjaGUgdGVhbSBsdXJrLCBpbiB0aGUgY29tcGFueSBvZiBtYW55IG90aGVyIGh0dHBkIGd1cnVzIHdobyAKLSAgc2hvdWxkIGJlIGFibGUgdG8gaGVscC4KLSAgPC9QPgotICA8UD4KLSAgQ29tbWVyY2lhbCBzdXBwb3J0IGZvciBBcGFjaGUgaXMsIGhvd2V2ZXIsIGF2YWlsYWJsZSBmcm9tIGEgbnVtYmVyCi0gIG9mIHRoaXJkIHBhcnRpZXMuCi0gIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0ibW9yZSI+Ci0gICAgICA8U1RST05HPklzIHRoZXJlIGFueSBtb3JlIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBvbgotICAgICAgQXBhY2hlPzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBJbmRlZWQgdGhlcmUgaXMuICBTZWUgdGhlIG1haW4KLSAgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+QXBhY2hlIHdlYiBzaXRlPC9BPi4KLSAgVGhlcmUgaXMgYWxzbyBhIHJlZ3VsYXIgZWxlY3Ryb25pYyBwdWJsaWNhdGlvbiBjYWxsZWQKLSAgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGV3ZWVrLmNvbS8iIFJFTD0iSGVscCI+PENJVEU+QXBhY2hlIFdlZWs8L0NJVEU+PC9BPgotICBhdmFpbGFibGUuICBMaW5rcyB0byByZWxldmFudCA8Q0lURT5BcGFjaGUgV2VlazwvQ0lURT4gYXJ0aWNsZXMgYXJlCi0gIGluY2x1ZGVkIGJlbG93IHdoZXJlIGFwcHJvcHJpYXRlLiBUaGVyZSBhcmUgYWxzbyBzb21lIAotICA8QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvaW5mby9hcGFjaGVfYm9va3MuaHRtbCIKLSAgPkFwYWNoZS1zcGVjaWZpYyBib29rczwvQT4gYXZhaWxhYmxlLgotICA8L1A+Ci0gIDxIUj4KLSA8L0xJPgotCi0gPExJPjxBIE5BTUU9IndoZXJlIj4KLSAgICAgIDxTVFJPTkc+V2hlcmUgY2FuIEkgZ2V0IEFwYWNoZT88L1NUUk9ORz4KLSAgICAgPC9BPgotICA8UD4KLSAgWW91IGNhbiBmaW5kIG91dCBob3cgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSBmb3IgQXBhY2hlIGF0IHRoZQotICBwcm9qZWN0J3MKLSAgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+bWFpbiB3ZWIgcGFnZTwvQT4uCi0gIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci08L09MPgotPCEtLSNlbmRpZiAtLT4KLTwhLS0jaWYgZXhwcj0iJFNUQU5EQUxPTkUiIC0tPgotICA8IS0tIERvbid0IGZvcmdldCB0byBhZGQgSFIgdGFncyBhdCB0aGUgZW5kIG9mIGVhY2ggbGlzdCBpdGVtLi4gLS0+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+Ci08IS0tI2VuZGlmIC0tPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbWlzYy9GQVEtQi5odG1sIGIvZG9jcy9tYW51YWwvbWlzYy9GQVEtQi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGM0ZGIxLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21pc2MvRkFRLUIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwOCArMCwwIEBACi08IS0tI2lmIGV4cHI9IiRGQVFNQVNURVIiIC0tPgotIDwhLS0jc2V0IHZhcj0iU1RBTkRBTE9ORSIgdmFsdWU9IiIgLS0+Ci0gPCEtLSNzZXQgdmFyPSJJTkNMVURFRCIgdmFsdWU9IllFUyIgLS0+Ci0gPCEtLSNpZiBleHByPSIkUVVFUllfU1RSSU5HID0gVE9DIiAtLT4KLSAgPCEtLSNzZXQgdmFyPSJUT0MiIHZhbHVlPSJZRVMiIC0tPgotICA8IS0tI3NldCB2YXI9IkNPTlRFTlQiIHZhbHVlPSIiIC0tPgotIDwhLS0jZWxzZSAtLT4KLSAgPCEtLSNzZXQgdmFyPSJUT0MiIHZhbHVlPSIiIC0tPgotICA8IS0tI3NldCB2YXI9IkNPTlRFTlQiIHZhbHVlPSJZRVMiIC0tPgotIDwhLS0jZW5kaWYgLS0+Ci08IS0tI2Vsc2UgLS0+Ci0gPCEtLSNzZXQgdmFyPSJTVEFOREFMT05FIiB2YWx1ZT0iWUVTIiAtLT4KLSA8IS0tI3NldCB2YXI9IklOQ0xVREVEIiB2YWx1ZT0iIiAtLT4KLSA8IS0tI3NldCB2YXI9IlRPQyIgdmFsdWU9IiIgLS0+Ci0gPCEtLSNzZXQgdmFyPSJDT05URU5UIiB2YWx1ZT0iIiAtLT4KLTwhLS0jZW5kaWYgLS0+Ci08IS0tI2lmIGV4cHI9IiRTVEFOREFMT05FIiAtLT4KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotIDxIRUFEPgotICA8VElUTEU+QXBhY2hlIFNlcnZlciBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvVElUTEU+Ci0gPC9IRUFEPgotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotIDxCT0RZCi0gIEJHQ09MT1I9IiNGRkZGRkYiCi0gIFRFWFQ9IiMwMDAwMDAiCi0gIExJTks9IiMwMDAwRkYiCi0gIFZMSU5LPSIjMDAwMDgwIgotICBBTElOSz0iI0ZGMDAwMCIKLSA+Ci0gIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0gIDxIMSBBTElHTj0iQ0VOVEVSIj5BcGFjaGUgU2VydmVyIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC9IMT4KLSAgPFA+Ci0gICRSZXZpc2lvbjogMS4yICQgKCREYXRlOiAxOTk5LzA4LzE5IDIxOjUyOjAxICQpCi0gIDwvUD4KLSAgPFA+Ci0gIFRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIEZBUSBpcyBhbHdheXMgYXZhaWxhYmxlIGZyb20gdGhlIG1haW4KLSAgQXBhY2hlIHdlYiBzaXRlLCBhdAotICAmbHQ7PEEKLSAgICAgICBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZG9jcy9taXNjL0ZBUS5odG1sIgotICAgICAgIFJFTD0iSGVscCIKLSAgICAgID48U0FNUD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvZG9jcy9taXNjL0ZBUS5odG1sPC9TQU1QPjwvQT4mZ3Q7LgotICA8L1A+Ci08IS0tIE5vdGVzIGFib3V0IGNoYW5nZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgLSBJZiBhZGRpbmcgYSByZWxhdGl2ZSBsaW5rIHRvIGFub3RoZXIgcGFydCBvZiB0aGUgICAgICAgICAgICAtLT4KLTwhLS0gICAgZG9jdW1lbnRhdGlvbiwgKmRvKiBpbmNsdWRlIHRoZSAiLmh0bWwiIHBvcnRpb24uICBUaGVyZSdzIGEgLS0+Ci08IS0tICAgIGdvb2QgY2hhbmNlIHRoYXQgdGhlIHVzZXIgd2lsbCBiZSByZWFkaW5nIHRoZSBkb2N1bWVudGF0aW9uIC0tPgotPCEtLSAgICBvbiBoaXMgb3duIHN5c3RlbSwgd2hpY2ggbWF5IG5vdCBiZSBjb25maWd1cmVkIGZvciAgICAgICAgICAtLT4KLTwhLS0gICAgbXVsdGl2aWV3cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAtIFdoZW4gYWRkaW5nIGl0ZW1zLCBtYWtlIHN1cmUgdGhleSdyZSBwdXQgaW4gdGhlIHJpZ2h0IHBsYWNlIC0tPgotPCEtLSAgICAtIHZlcmlmeSB0aGF0IHRoZSBudW1iZXJpbmcgbWF0Y2hlcyB1cC4gICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gIC0gKkRvbid0KiB1c2UgPFBSRT48L1BSRT4gYmxvY2tzIC0gdGhleSBkb24ndCBhcHBlYXIgICAgICAgICAgLS0+Ci08IS0tICAgIGNvcnJlY3RseSBpbiBhIHJlbGlhYmxlIHdheSB3aGVuIHRoaXMgaXMgY29udmVydGVkIHRvIHRleHQgIC0tPgotPCEtLSAgICB3aXRoIEx5bnguICBVc2UgPERMPjxERD48Q09ERT54eHg8QlI+eHg8L0NPREU+PC9ERD48L0RMPiAgICAtLT4KLTwhLS0gICAgYmxvY2tzIGluc2lkZSBhIDxQPjwvUD4gaW5zdGVhZC4gIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGdldCAgLS0+Ci08IS0tICAgIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBpbmRlbnRpbmcgcmlnaHQuICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgLSBEb24ndCBmb3JnZXQgdG8gaW5jbHVkZSBhbiBIUiB0YWcgYWZ0ZXIgdGhlIGxhc3QgL1AgdGFnICAgICAtLT4KLTwhLS0gICAgYnV0IGJlZm9yZSB0aGUgL0xJIGluIGFuIGl0ZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDxQPgotICBJZiB5b3UgYXJlIHJlYWRpbmcgYSB0ZXh0LW9ubHkgdmVyc2lvbiBvZiB0aGlzIEZBUSwgeW91IG1heSBmaW5kIG51bWJlcnMKLSAgZW5jbG9zZWQgaW4gYnJhY2tldHMgKHN1Y2ggYXMgJnF1b3Q7WzEyXSZxdW90OykuICBUaGVzZSByZWZlciB0byB0aGUgbGlzdCBvZgotICByZWZlcmVuY2UgVVJMcyB0byBiZSBmb3VuZCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC4gIFRoZXNlIHJlZmVyZW5jZXMKLSAgZG8gbm90IGFwcGVhciwgYW5kIGFyZSBub3QgbmVlZGVkLCBmb3IgdGhlIGh5cGVydGV4dCB2ZXJzaW9uLgotICA8L1A+Ci0gIDxIMj5UaGUgUXVlc3Rpb25zPC9IMj4KLTxPTCBUWVBFPSJBIj4KLTwhLS0jZW5kaWYgLS0+Ci08IS0tI2lmIGV4cHI9IiRUT0MgfHwgJFNUQU5EQUxPTkUiIC0tPgotIDxMSSB2YWx1ZT0iMiI+PFNUUk9ORz5HZW5lcmFsIFRlY2huaWNhbCBRdWVzdGlvbnM8L1NUUk9ORz4KLSAgPE9MPgotICAgPExJPjxBIEhSRUY9IiN3aGF0MmRvIj4mcXVvdDtXaHkgY2FuJ3QgSSAuLi4/ICBXaHkgd29uJ3QgLi4uCi0gICAgICAgIHdvcms/JnF1b3Q7ICBXaGF0IHRvIGRvIGluIGNhc2Ugb2YgcHJvYmxlbXM8L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNjb21wYXRpYmxlIj5Ib3cgY29tcGF0aWJsZSBpcyBBcGFjaGUgd2l0aCBteSBleGlzdGluZwotICAgICAgICBOQ1NBIDEuMyBzZXR1cD88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiN5ZWFyMjAwMCI+SXMgQXBhY2hlIFllYXIgMjAwMCBjb21wbGlhbnQ/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjc3VibWl0X3BhdGNoIj5Ib3cgZG8gSSBzdWJtaXQgYSBwYXRjaCB0byB0aGUgQXBhY2hlIEdyb3VwPzwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI2RvbWluYXRpb24iPldoeSBoYXMgQXBhY2hlIHN0b2xlbiBteSBmYXZvdXJpdGUgc2l0ZSdzCi0gICAgICAgIEludGVybmV0IGFkZHJlc3M/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjYXBzcGFtIj5XaHkgYW0gSSBnZXR0aW5nIHNwYW0gbWFpbCBmcm9tIHRoZSBBcGFjaGUgc2l0ZT88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNyZWRpc3QiPk1heSBJIGluY2x1ZGUgdGhlIEFwYWNoZSBzb2Z0d2FyZSBvbiBhIENEIG9yIG90aGVyCi0gICAgICAgIHBhY2thZ2UgSSdtIGRpc3RyaWJ1dGluZz88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiN6b29tIj5XaGF0J3MgdGhlIGJlc3QgaGFyZHdhcmUvb3BlcmF0aW5nIHN5c3RlbS8uLi4gSG93IGRvCi0gICAgICAgIEkgZ2V0IHRoZSBtb3N0IG91dCBvZiBteSBBcGFjaGUgV2ViIHNlcnZlcj88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNyZWdleCI+V2hhdCBhcmUgInJlZ3VsYXIgZXhwcmVzc2lvbnMiPzwvQT4KLSAgIDwvTEk+Ci0gIDwvT0w+Ci0gPC9MST4KLTwhLS0jZW5kaWYgLS0+Ci08IS0tI2lmIGV4cHI9IiRTVEFOREFMT05FIiAtLT4KLTwvT0w+Ci0KLTxIUj4KLQotICA8SDI+VGhlIEFuc3dlcnM8L0gyPgotPCEtLSNlbmRpZiAtLT4KLTwhLS0jaWYgZXhwcj0iISAkVE9DIiAtLT4KLQotICA8SDM+Qi4gR2VuZXJhbCBUZWNobmljYWwgUXVlc3Rpb25zPC9IMz4KLTxPTD4KLQotIDxMST48QSBOQU1FPSJ3aGF0MmRvIj4KLSAgICAgIDxTVFJPTkc+JnF1b3Q7V2h5IGNhbid0IEkgLi4uPyAgV2h5IHdvbid0IC4uLiB3b3JrPyZxdW90OyAgV2hhdCB0bwotICAgICAgZG8gaW4gY2FzZSBvZiBwcm9ibGVtczwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBJZiB5b3UgYXJlIGhhdmluZyB0cm91YmxlIHdpdGggeW91ciBBcGFjaGUgc2VydmVyIHNvZnR3YXJlLCB5b3Ugc2hvdWxkCi0gIHRha2UgdGhlIGZvbGxvd2luZyBzdGVwczoKLSAgPC9QPgotICA8T0w+Ci0gICA8TEk+PFNUUk9ORz5DaGVjayB0aGUgZXJyb3Jsb2chPC9TVFJPTkc+Ci0gICAgPFA+Ci0gICAgQXBhY2hlIHRyaWVzIHRvIGJlIGhlbHBmdWwgd2hlbiBpdCBlbmNvdW50ZXJzIGEgcHJvYmxlbS4gIEluIG1hbnkKLSAgICBjYXNlcywgaXQgd2lsbCBwcm92aWRlIHNvbWUgZGV0YWlscyBieSB3cml0aW5nIG9uZSBvciBtZXNzYWdlcyB0bwotICAgIHRoZSBzZXJ2ZXIgZXJyb3IgbG9nLiAgU29tZXRpbWVzIHRoaXMgaXMgZW5vdWdoIGZvciB5b3UgdG8gZGlhZ25vc2UKLSAgICAmYW1wOyBmaXggdGhlIHByb2JsZW0geW91cnNlbGYgKHN1Y2ggYXMgZmlsZSBwZXJtaXNzaW9ucyBvciB0aGUgbGlrZSkuCi0gICAgVGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGVycm9yIGxvZyBpcwotICAgIDxTQU1QPi91c3IvbG9jYWwvYXBhY2hlL2xvZ3MvZXJyb3JfbG9nPC9TQU1QPiwgYnV0IHNlZSB0aGUKLSAgICA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI2Vycm9ybG9nIj48U0FNUD5FcnJvckxvZzwvU0FNUD48L0E+Ci0gICAgZGlyZWN0aXZlIGluIHlvdXIgY29uZmlnIGZpbGVzIGZvciB0aGUgbG9jYXRpb24gb24geW91ciBzZXJ2ZXIuCi0gICAgPC9QPgotICAgPC9MST4KLSAgIDxMST48U1RST05HPkNoZWNrIHRoZQotICAgIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL21pc2MvRkFRLmh0bWwiPkZBUTwvQT4hPC9TVFJPTkc+Ci0gICAgPFA+Ci0gICAgVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBBcGFjaGUgRnJlcXVlbnRseS1Bc2tlZCBRdWVzdGlvbnMgbGlzdCBjYW4KLSAgICBhbHdheXMgYmUgZm91bmQgYXQgdGhlIG1haW4gQXBhY2hlIHdlYiBzaXRlLgotICAgIDwvUD4KLSAgIDwvTEk+Ci0gICA8TEk+PFNUUk9ORz5DaGVjayB0aGUgQXBhY2hlIGJ1ZyBkYXRhYmFzZTwvU1RST05HPgotICAgIDxQPgotICAgIE1vc3QgcHJvYmxlbXMgdGhhdCBnZXQgcmVwb3J0ZWQgdG8gVGhlIEFwYWNoZSBHcm91cCBhcmUgcmVjb3JkZWQgaW4KLSAgICB0aGUKLSAgICA8QSBIUkVGPSJodHRwOi8vYnVncy5hcGFjaGUub3JnLyI+YnVnIGRhdGFiYXNlPC9BPi4KLSAgICA8RU0+PFNUUk9ORz5QbGVhc2U8L1NUUk9ORz4gY2hlY2sgdGhlIGV4aXN0aW5nIHJlcG9ydHMsIG9wZW4KLSAgICA8U1RST05HPmFuZDwvU1RST05HPiBjbG9zZWQsIGJlZm9yZSBhZGRpbmcgb25lLjwvRU0+ICBJZiB5b3UgZmluZAotICAgIHRoYXQgeW91ciBpc3N1ZSBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkLCBwbGVhc2UgPEVNPmRvbid0PC9FTT4gYWRkCi0gICAgYSAmcXVvdDttZSwgdG9vJnF1b3Q7IHJlcG9ydC4gIElmIHRoZSBvcmlnaW5hbCByZXBvcnQgaXNuJ3QgY2xvc2VkCi0gICAgeWV0LCB3ZSBzdWdnZXN0IHRoYXQgeW91IGNoZWNrIGl0IHBlcmlvZGljYWxseS4gIFlvdSBtaWdodCBhbHNvCi0gICAgY29uc2lkZXIgY29udGFjdGluZyB0aGUgb3JpZ2luYWwgc3VibWl0dGVyLCBiZWNhdXNlIHRoZXJlIG1heSBiZSBhbgotICAgIGVtYWlsIGV4Y2hhbmdlIGdvaW5nIG9uIGFib3V0IHRoZSBpc3N1ZSB0aGF0IGlzbid0IGdldHRpbmcgcmVjb3JkZWQKLSAgICBpbiB0aGUgZGF0YWJhc2UuCi0gICAgPC9QPgotICAgPC9MST4KLSAgIDxMST48U1RST05HPkFzayBpbiB0aGUgPFNBTVA+Y29tcC5pbmZvc3lzdGVtcy53d3cuc2VydmVycy51bml4PC9TQU1QPgotICAgIG9yIDxTQU1QPmNvbXAuaW5mb3N5c3RlbXMud3d3LnNlcnZlcnMubXMtd2luZG93czwvU0FNUD4gVVNFTkVUCi0gICAgbmV3c2dyb3VwIChhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIHBsYXRmb3JtIHlvdSB1c2UpLjwvU1RST05HPgotICAgIDxQPgotICAgIEEgbG90IG9mIGNvbW1vbiBwcm9ibGVtcyBuZXZlciBtYWtlIGl0IHRvIHRoZSBidWcgZGF0YWJhc2UgYmVjYXVzZQotICAgIHRoZXJlJ3MgYWxyZWFkeSBoaWdoIFEmYW1wO0EgdHJhZmZpYyBhYm91dCB0aGVtIGluIHRoZQotICAgIDxBIEhSRUY9Im5ld3M6Y29tcC5pbmZvc3lzdGVtcy53d3cuc2VydmVycy51bml4IgotICAgID48U0FNUD5jb21wLmluZm9zeXN0ZW1zLnd3dy5zZXJ2ZXJzLnVuaXg8L1NBTVA+PC9BPgotICAgIG5ld3Nncm91cC4gIE1hbnkgQXBhY2hlIHVzZXJzLCBhbmQgc29tZSBvZiB0aGUgZGV2ZWxvcGVycywgY2FuIGJlCi0gICAgZm91bmQgcm9hbWluZyBpdHMgdmlydHVhbCBoYWxscywgc28gaXQgaXMgc3VnZ2VzdGVkIHRoYXQgeW91IHNlZWsKLSAgICB3aXNkb20gdGhlcmUuICBUaGUgY2hhbmNlcyBhcmUgZ29vZCB0aGF0IHlvdSdsbCBnZXQgYSBmYXN0ZXIgYW5zd2VyCi0gICAgdGhlcmUgdGhhbiBmcm9tIHRoZSBidWcgZGF0YWJhc2UsIGV2ZW4gaWYgeW91IDxFTT5kb24ndDwvRU0+IHNlZQotICAgIHlvdXIgcXVlc3Rpb24gYWxyZWFkeSBwb3N0ZWQuCi0gICAgPC9QPgotICAgPC9MST4KLSAgIDxMST48U1RST05HPklmIGFsbCBlbHNlIGZhaWxzLCByZXBvcnQgdGhlIHByb2JsZW0gaW4gdGhlIGJ1ZwotICAgIGRhdGFiYXNlPC9TVFJPTkc+Ci0gICAgPFA+Ci0gICAgSWYgeW91J3ZlIGdvbmUgdGhyb3VnaCB0aG9zZSBzdGVwcyBhYm92ZSB0aGF0IGFyZSBhcHByb3ByaWF0ZSBhbmQKLSAgICBoYXZlIG9idGFpbmVkIG5vIHJlbGllZiwgdGhlbiBwbGVhc2UgPEVNPmRvPC9FTT4gbGV0IFRoZSBBcGFjaGUKLSAgICBHcm91cCBrbm93IGFib3V0IHRoZSBwcm9ibGVtIGJ5Ci0gICAgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2J1Z19yZXBvcnQuaHRtbCI+bG9nZ2luZyBhIGJ1ZyByZXBvcnQ8L0E+LgotICAgIDwvUD4KLSAgICA8UD4KLSAgICBJZiB5b3VyIHByb2JsZW0gaW52b2x2ZXMgdGhlIHNlcnZlciBjcmFzaGluZyBhbmQgZ2VuZXJhdGluZyBhIGNvcmUKLSAgICBkdW1wLCBwbGVhc2UgaW5jbHVkZSBhIGJhY2t0cmFjZSAoaWYgcG9zc2libGUpLiAgQXMgYW4gZXhhbXBsZSwKLSAgICA8L1A+Ci0gICAgPFA+Ci0gICAgPERMPgotICAgICA8REQ+PENPREU+IyBjZCA8RU0+U2VydmVyUm9vdDwvRU0+PEJSPgotICAgICAgIyBkYnggaHR0cGQgY29yZTxCUj4KLSAgICAgIChkYngpIHdoZXJlPC9DT0RFPgotICAgICA8L0REPgotICAgIDwvREw+Ci0gICAgPFA+PC9QPgotICAgIDxQPgotICAgIChTdWJzdGl0dXRlIHRoZSBhcHByb3ByaWF0ZSBsb2NhdGlvbnMgZm9yIHlvdXIKLSAgICA8U0FNUD5TZXJ2ZXJSb290PC9TQU1QPiBhbmQgeW91ciA8U0FNUD5odHRwZDwvU0FNUD4gYW5kCi0gICAgPFNBTVA+Y29yZTwvU0FNUD4gZmlsZXMuICBZb3UgbWF5IGhhdmUgdG8gdXNlIDxDT0RFPmdkYjwvQ09ERT4KLSAgICBpbnN0ZWFkIG9mIDxDT0RFPmRieDwvQ09ERT4uKQotICAgIDwvUD4KLSAgIDwvTEk+Ci0gIDwvT0w+Ci0gIDxIUj4KLSA8L0xJPgotCi0gPExJPjxBIE5BTUU9ImNvbXBhdGlibGUiPgotICAgICAgPFNUUk9ORz5Ib3cgY29tcGF0aWJsZSBpcyBBcGFjaGUgd2l0aCBteSBleGlzdGluZyBOQ1NBIDEuMwotICAgICAgc2V0dXA/PC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+Ci0gIEFwYWNoZSBhdHRlbXB0cyB0byBvZmZlciBhbGwgdGhlIGZlYXR1cmVzIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKLSAgb2YgTkNTQSBodHRwZCAxLjMsIGFzIHdlbGwgYXMgbWFueSBvZiB0aGUgYWRkaXRpb25hbCBmZWF0dXJlcyBmb3VuZCBpbgotICBOQ1NBIGh0dHBkIDEuNCBhbmQgTkNTQSBodHRwZCAxLjUuCi0gIDwvUD4KLSAgPFA+Ci0gIE5DU0EgaHR0cGQgYXBwZWFycyB0byBiZSBtb3ZpbmcgdG93YXJkIGFkZGluZyBleHBlcmltZW50YWwgZmVhdHVyZXMKLSAgd2hpY2ggYXJlIG5vdCBnZW5lcmFsbHkgcmVxdWlyZWQgYXQgdGhlIG1vbWVudC4gU29tZSBvZiB0aGUgZXhwZXJpbWVudHMKLSAgd2lsbCBzdWNjZWVkIHdoaWxlIG90aGVycyB3aWxsIGluZXZpdGFibHkgYmUgZHJvcHBlZC4gVGhlIEFwYWNoZQotICBwaGlsb3NvcGh5IGlzIHRvIGFkZCB3aGF0J3MgbmVlZGVkIGFzIGFuZCB3aGVuIGl0IGlzIG5lZWRlZC4KLSAgPC9QPgotICA8UD4KLSAgRnJpZW5kbHkgaW50ZXJhY3Rpb24gYmV0d2VlbiBBcGFjaGUgYW5kIE5DU0EgZGV2ZWxvcGVycyBzaG91bGQgZW5zdXJlCi0gIHRoYXQgZnVuZGFtZW50YWwgZmVhdHVyZSBlbmhhbmNlbWVudHMgc3RheSBjb25zaXN0ZW50IGJldHdlZW4gdGhlIHR3bwotICBzZXJ2ZXJzIGZvciB0aGUgZm9yZXNlZWFibGUgZnV0dXJlLgotICA8L1A+Ci0gIDxIUj4KLSA8L0xJPgotCi0gPExJPjxBIE5BTUU9InllYXIyMDAwIj4KLSAgICAgIDxTVFJPTkc+SXMgQXBhY2hlIFllYXIgMjAwMCBjb21wbGlhbnQ/PC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+Ci0gIFllcywgQXBhY2hlIGlzIFllYXIgMjAwMCBjb21wbGlhbnQuCi0gIDwvUD4KLSAgPFA+Ci0gIEFwYWNoZSBpbnRlcm5hbGx5IG5ldmVyIHN0b3JlcyB5ZWFycyBhcyB0d28gZGlnaXRzLgotICBPbiB0aGUgSFRUUCBwcm90b2NvbCBsZXZlbCBSRkMxMTIzLXN0eWxlIGFkZHJlc3NlcyBhcmUgZ2VuZXJhdGVkCi0gIHdoaWNoIGlzIHRoZSBvbmx5IGZvcm1hdCBhIEhUVFAvMS4xLWNvbXBsaWFudCBzZXJ2ZXIgc2hvdWxkCi0gIGdlbmVyYXRlLiBUbyBiZSBjb21wYXRpYmxlIHdpdGggb2xkZXIgYXBwbGljYXRpb25zIEFwYWNoZQotICByZWNvZ25pemVzIEFOU0kgQydzIDxDT0RFPmFzY3RpbWUoKTwvQ09ERT4gYW5kCi0gIFJGQzg1MC0vUkZDMTAzNi1zdHlsZSBkYXRlIGZvcm1hdHMsIHRvby4KLSAgVGhlIDxDT0RFPmFzY3RpbWUoKTwvQ09ERT4gZm9ybWF0IHVzZXMgZm91ci1kaWdpdCB5ZWFycywKLSAgYnV0IHRoZSBSRkM4NTAgYW5kIFJGQzEwMzYgZGF0ZSBmb3JtYXRzIG9ubHkgZGVmaW5lIGEgdHdvLWRpZ2l0IHllYXIuCi0gIElmIEFwYWNoZSBzZWVzIHN1Y2ggYSBkYXRlIHdpdGggYSB2YWx1ZSBsZXNzIHRoYW4gNzAgaXQgYXNzdW1lcyB0aGF0Ci0gIHRoZSBjZW50dXJ5IGlzIDxTQU1QPjIwPC9TQU1QPiByYXRoZXIgdGhhbiA8U0FNUD4xOTwvU0FNUD4uCi0gIDwvUD4KLSAgPFA+Ci0gIEFsdGhvdWdoIEFwYWNoZSBpcyBZZWFyIDIwMDAgY29tcGxpYW50LCB5b3UgbWF5IHN0aWxsIGdldCBwcm9ibGVtcwotICBpZiB0aGUgdW5kZXJseWluZyBPUyBoYXMgcHJvYmxlbXMgd2l0aCBkYXRlcyBwYXN0IHllYXIgMjAwMAotICAoPEVNPmUuZy48L0VNPiwgT1MgY2FsbHMgd2hpY2ggYWNjZXB0IG9yIHJldHVybiB5ZWFyIG51bWJlcnMpLgotICBNb3N0IChVTklYKSBzeXN0ZW1zIHN0b3JlIGRhdGVzIGludGVybmFsbHkgYXMgc2lnbmVkIDMyLWJpdCBpbnRlZ2VycwotICB3aGljaCBjb250YWluIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSAxPFNVUD5zdDwvU1VQPiBKYW51YXJ5IDE5NzAsIHNvCi0gIHRoZSBtYWdpYyBib3VuZGFyeSB0byB3b3JyeSBhYm91dCBpcyB0aGUgeWVhciAyMDM4IGFuZCBub3QgMjAwMC4KLSAgQnV0IG1vZGVybiBvcGVyYXRpbmcgc3lzdGVtcyBzaG91bGRuJ3QgY2F1c2UgYW55IHRyb3VibGUKLSAgYXQgYWxsLgotICA8L1A+Ci0gIDxQPgotICBVc2VycyBvZiBBcGFjaGUgMS4yLnggc2hvdWxkIHVwZ3JhZGUgdG8gYSBjdXJyZW50IHZlcnNpb24gb2YgQXBhY2hlIDEuMwotICAoc2VlIDxBIEhSRUY9Ii4uL25ld19mZWF0dXJlc18xXzMuaHRtbCNtaXNjIj55ZWFyLTIwMDAgaW1wcm92ZW1lbnRzIGluCi0gIEFwYWNoZSAxLjM8L0E+IGZvciBkZXRhaWxzKS4KLSAgPC9QPgotICA8cD4KLSAgVGhlIEFwYWNoZSBIVFRQIFNlcnZlciBwcm9qZWN0IGlzIGFuIG9wZW4tc291cmNlIHNvZnR3YXJlIHByb2R1Y3Qgb2YKLSAgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIHByb2plY3QgYW5kIHRoZSBGb3VuZGF0aW9uCi0gIDxiPmNhbm5vdDwvYj4gb2ZmZXIgbGVnYWwgYXNzdXJhbmNlcyByZWdhcmRpbmcgYW55IHN1aXRhYmlsaXR5Ci0gIG9mIHRoZSBzb2Z0d2FyZSBmb3IgeW91ciBhcHBsaWNhdGlvbi4gIFRoZXJlIGFyZSBzZXZlcmFsIGNvbW1lcmNpYWwKLSAgQXBhY2hlIHN1cHBvcnQgb3JnYW5pemF0aW9ucyBhbmQgZGVyaXZhdGl2ZSBzZXJ2ZXIgcHJvZHVjdHMgYXZhaWxhYmxlCi0gIHRoYXQgbWF5IGJlIGFibGUgdG8gc3RhbmQgYmVoaW5kIHRoZSBzb2Z0d2FyZSBhbmQgcHJvdmlkZSB5b3Ugd2l0aAotICBhbnkgYXNzdXJhbmNlcyB5b3UgbWF5IHJlcXVpcmUuICBZb3UgbWF5IGZpbmQgbGlua3MgdG8gc29tZSBvZiB0aGVzZQotICB2ZW5kb3JzIGF0Ci0gIDxzYW1wPiZsdDs8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvaW5mby9zdXBwb3J0LmNnaSIKLSAgICAgICAgICAgID5odHRwOi8vd3d3LmFwYWNoZS5vcmcvaW5mby9zdXBwb3J0LmNnaTwvYT4mZ3Q7PC9zYW1wPi4KLSAgPC9wPgotICA8cD4KLSAgVGhlIEFwYWNoZSBIVFRQIHNlcnZlciBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRoIHRoZSBmb2xsb3dpbmcKLSAgZGlzY2xhaW1lciwgZm91bmQgaW4gdGhlIHNvZnR3YXJlIGxpY2Vuc2U6Ci0gIDwvcD4KLSAgPHByZT4KLSAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICAgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICAgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gICBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICAgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICAgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gICBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAgIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gICBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gICBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gICBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gICBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gIDwvcHJlPgotICA8SFI+Ci0gPC9MST4KLQotICA8TEk+PEEgTkFNRT0ic3VibWl0X3BhdGNoIj4KLSAgICAgICA8U1RST05HPkhvdyBkbyBJIHN1Ym1pdCBhIHBhdGNoIHRvIHRoZSBBcGFjaGUgR3JvdXA/PC9TVFJPTkc+PC9BPgotICAgPFA+Ci0gICBUaGUgQXBhY2hlIEdyb3VwIGVuY291cmFnZXMgcGF0Y2hlcyBmcm9tIG91dHNpZGUgZGV2ZWxvcGVycy4gVGhlcmUKLSAgIGFyZSAyIG1haW4gInR5cGVzIiBvZiBwYXRjaGVzOiBzbWFsbCBidWdmaXhlcyBhbmQgZ2VuZXJhbAotICAgaW1wcm92ZW1lbnRzLiBCdWdmaXhlcyBzaG91bGQgYmUgc3VibWl0dGluZyB1c2luZyB0aGUgQXBhY2hlIDxBCi0gICBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvYnVnX3JlcG9ydC5odG1sIj5idWcgcmVwb3J0IHBhZ2U8L0E+LgotICAgSW1wcm92ZW1lbnRzLCBtb2RpZmljYXRpb25zLCBhbmQgYWRkaXRpb25zIHNob3VsZCBmb2xsb3cgdGhlCi0gICBpbnN0cnVjdGlvbnMgYmVsb3cuCi0gICA8L1A+Ci0gICA8UD4KLSAgIEluIGdlbmVyYWwsIHRoZSBmaXJzdCBjb3Vyc2Ugb2YgYWN0aW9uIGlzIHRvIGJlIGEgbWVtYmVyIG9mIHRoZQotICAgPFNBTVA+bmV3LWh0dHBkQGFwYWNoZS5vcmc8L1NBTVA+IG1haWxpbmcgbGlzdC4gVGhpcyBpbmRpY2F0ZXMgdG8KLSAgIHRoZSBHcm91cCB0aGF0IHlvdSBhcmUgY2xvc2VseSBmb2xsb3dpbmcgdGhlIGxhdGVzdCBBcGFjaGUKLSAgIGRldmVsb3BtZW50cy4gWW91ciBwYXRjaCBmaWxlIHNob3VsZCBiZSBnZW5lcmF0ZWQgdXNpbmcgZWl0aGVyCi0gICAnPENPREU+ZGlmZiZuYnNwOy1jPC9DT0RFPicgb3IgJzxDT0RFPmRpZmYmbmJzcDstdTwvQ09ERT4nIGFnYWluc3QKLSAgIHRoZSBsYXRlc3QgQ1ZTIHRyZWUuIFRvIHN1Ym1pdCB5b3VyIHBhdGNoLCBzZW5kIGVtYWlsIHRvCi0gICA8U0FNUD5uZXctaHR0cGRAYXBhY2hlLm9yZzwvU0FNUD4gd2l0aCBhIDxTQU1QPlN1YmplY3Q6PC9TQU1QPiBsaW5lCi0gICB0aGF0IHN0YXJ0cyB3aXRoIDxTQU1QPltQQVRDSF08L1NBTVA+IGFuZCBpbmNsdWRlcyBhIGdlbmVyYWwKLSAgIGRlc2NyaXB0aW9uIG9mIHRoZSBwYXRjaC4gSW4gdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UsIHRoZSBwYXRjaAotICAgc2hvdWxkIGJlIGNsZWFybHkgZGVzY3JpYmVkIGFuZCB0aGVuIGluY2x1ZGVkIGF0IHRoZSBlbmQgb2YgdGhlCi0gICBtZXNzYWdlLiAgSWYgdGhlIHBhdGNoLWZpbGUgaXMgbG9uZywgeW91IGNhbiBub3RlIGEgVVJMIHRvIHRoZSBmaWxlCi0gICBpbnN0ZWFkIG9mIHRoZSBmaWxlIGl0c2VsZi4gVXNlIG9mIE1JTUUgZW5jbG9zdXJlcy9hdHRhY2htZW50cwotICAgc2hvdWxkIGJlIGF2b2lkZWQuCi0gICA8L1A+Ci0gICA8UD4KLSAgIEJlIHByZXBhcmVkIHRvIHJlc3BvbmQgdG8gYW55IHF1ZXN0aW9ucyBhYm91dCB5b3VyIHBhdGNoZXMgYW5kCi0gICBwb3NzaWJseSBkZWZlbmQgeW91ciBjb2RlLiBJZiB5b3VyIHBhdGNoIHJlc3VsdHMgaW4gYSBsb3Qgb2YKLSAgIGRpc2N1c3Npb24sIHlvdSBtYXkgYmUgYXNrZWQgdG8gc3VibWl0IGFuIHVwZGF0ZWQgcGF0Y2ggdGhhdAotICAgaW5jb3Jwb3JhdGUgYWxsIGNoYW5nZXMgYW5kIHN1Z2dlc3Rpb25zLgotICAgPC9QPgotICAgPEhSPgotICA8L0xJPgotCi0gIDxMST48QSBOQU1FPSJkb21pbmF0aW9uIj48U1RST05HPldoeSBoYXMgQXBhY2hlIHN0b2xlbiBteSBmYXZvdXJpdGUgc2l0ZSdzCi0gICAgICAgSW50ZXJuZXQgYWRkcmVzcz88L1NUUk9ORz48L0E+Ci0gICA8UD4KLSAgIFRoZSBzaW1wbGUgYW5zd2VyIGlzOiAiSXQgaGFzbid0LiIgIFRoaXMgbWlzY29uY2VwdGlvbiBpcyB1c3VhbGx5Ci0gICBjYXVzZWQgYnkgdGhlIHNpdGUgaW4gcXVlc3Rpb24gaGF2aW5nIG1pZ3JhdGVkIHRvIHRoZSBBcGFjaGUgV2ViCi0gICBzZXJ2ZXIgc29mdHdhcmUsIGJ1dCBub3QgaGF2aW5nIG1pZ3JhdGVkIHRoZSBzaXRlJ3MgY29udGVudCB5ZXQuICBXaGVuCi0gICBBcGFjaGUgaXMgaW5zdGFsbGVkLCB0aGUgZGVmYXVsdCBwYWdlIHRoYXQgZ2V0cyBpbnN0YWxsZWQgdGVsbHMgdGhlCi0gICBXZWJtYXN0ZXIgdGhlIGluc3RhbGxhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0Ci0gICB0aGlzIGRlZmF1bHQgcGFnZSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHNpdGUncyByZWFsIGNvbnRlbnQuCi0gICBJZiBpdCBkb2Vzbid0LCBjb21wbGFpbiB0byB0aGUgV2VibWFzdGVyLCBub3QgdG8gdGhlIEFwYWNoZSBwcm9qZWN0IC0tCi0gICB3ZSBqdXN0IG1ha2UgdGhlIHNvZnR3YXJlIGFuZCBhcmVuJ3QgcmVzcG9uc2libGUgZm9yIHdoYXQgcGVvcGxlCi0gICBkbyAob3IgZG9uJ3QgZG8pIHdpdGggaXQuCi0gICA8L1A+Ci0gICA8SFI+Ci0gIDwvTEk+Ci0KLSAgPExJPjxBIE5BTUU9ImFwc3BhbSI+PFNUUk9ORz5XaHkgYW0gSSBnZXR0aW5nIHNwYW0gbWFpbCBmcm9tIHRoZQotICAgICAgIEFwYWNoZSBzaXRlPzwvU1RST05HPjwvQT4KLSAgIDxQPgotICAgVGhlIHNob3J0IGFuc3dlciBpczogIllvdSBhcmVuJ3QuIiAgVXN1YWxseSB3aGVuIHNvbWVvbmUgdGhpbmtzIHRoZQotICAgQXBhY2hlIHNpdGUgaXMgb3JpZ2luYXRpbmcgc3BhbSwgaXQncyBiZWNhdXNlIHRoZXkndmUgdHJhY2VkIHRoZQotICAgc3BhbSB0byBhIFdlYiBzaXRlLCBhbmQgdGhlIFdlYiBzaXRlIHNheXMgaXQncyB1c2luZyBBcGFjaGUuICBTZWUgdGhlCi0gICA8QSBIUkVGPSIjZG9taW5hdGlvbiI+cHJldmlvdXMgRkFRIGVudHJ5PC9BPiBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoaXMKLSAgIHBoZW5vbWVub24uCi0gICA8L1A+Ci0gICA8UD4KLSAgIE5vIG1hcmtldGluZyBzcGFtIG9yaWdpbmF0ZXMgZnJvbSB0aGUgQXBhY2hlIHNpdGUuICBUaGUgb25seSBtYWlsCi0gICB0aGF0IGNvbWVzIGZyb20gdGhlIHNpdGUgZ29lcyBvbmx5IHRvIGFkZHJlc3NlcyB0aGF0IGhhdmUgYmVlbgotICAgPEVNPnJlcXVlc3RlZDwvRU0+IHRvIHJlY2VpdmUgdGhlIG1haWwuCi0gICA8L1A+Ci0gICA8SFI+Ci0gIDwvTEk+Ci0KLSAgPExJPjxBIE5BTUU9InJlZGlzdCI+PFNUUk9ORz5NYXkgSSBpbmNsdWRlIHRoZSBBcGFjaGUgc29mdHdhcmUgb24gYQotICAgICAgIENEIG9yIG90aGVyIHBhY2thZ2UgSSdtIGRpc3RyaWJ1dGluZz88L1NUUk9ORz48L0E+Ci0gICA8UD4KLSAgIFRoZSBkZXRhaWxlZCBhbnN3ZXIgdG8gdGhpcyBxdWVzdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlCi0gICBBcGFjaGUgbGljZW5zZSwgd2hpY2ggaXMgaW5jbHVkZWQgaW4gdGhlIEFwYWNoZSBkaXN0cmlidXRpb24gaW4KLSAgIHRoZSBmaWxlIDxDT0RFPkxJQ0VOU0U8L0NPREU+LiAgWW91IGNhbiBhbHNvIGZpbmQgaXQgb24gdGhlIFdlYiBhdAotICAgPFNBTVA+Jmx0OzxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9MSUNFTlNFLnR4dCIKLSAgICAgICAgICAgICA+aHR0cDovL3d3dy5hcGFjaGUub3JnL0xJQ0VOU0UudHh0PC9BPiZndDs8L1NBTVA+LgotICAgPC9QPgotICAgPEhSPgotICA8L0xJPgotCi0gPExJPjxBIE5BTUU9Inpvb20iPgotICAgICAgPFNUUk9ORz5XaGF0J3MgdGhlIGJlc3QgaGFyZHdhcmUvb3BlcmF0aW5nIHN5c3RlbS8uLi4gSG93IGRvCi0gICAgICBJIGdldCB0aGUgbW9zdCBvdXQgb2YgbXkgQXBhY2hlIFdlYiBzZXJ2ZXI/PC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+Ci0gIENoZWNrIG91dCBEZWFuIEdhdWRldCdzCi0gIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL21pc2MvcGVyZi10dW5pbmcuaHRtbCIKLSAgPnBlcmZvcm1hbmNlIHR1bmluZyBwYWdlPC9BPi4KLSAgPC9QPgotICA8SFI+Ci0gPC9MST4KLQotIDxMST48QSBOQU1FPSJyZWdleCI+Ci0gICAgICA8U1RST05HPldoYXQgYXJlICJyZWd1bGFyIGV4cHJlc3Npb25zIj88L1NUUk9ORz48L0E+Ci0gICA8UD4KLSAgIFJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIGEgd2F5IG9mIGRlc2NyaWJpbmcgYSBwYXR0ZXJuIC0gZm9yIGV4YW1wbGUsICJhbGwgCi0gICB0aGUgd29yZHMgdGhhdCBiZWdpbiB3aXRoIHRoZSBsZXR0ZXIgQSIgb3IgImV2ZXJ5IDEwLWRpZ2l0IHBob25lIG51bWJlciIgCi0gICBvciBldmVuICJFdmVyeSBzZW50ZW5jZSB3aXRoIHR3byBjb21tYXMgaW4gaXQsIGFuZCBubyBjYXBpdGFsIGxldHRlciBRIi4gIAotICAgUmVndWxhciBleHByZXNzaW9ucyAoYWthICJyZWdleHAicykgYXJlIHVzZWZ1bCBpbiBBcGFjaGUgYmVjYXVzZSB0aGV5IAotICAgbGV0IHlvdSBhcHBseSBjZXJ0YWluIGF0dHJpYnV0ZXMgYWdhaW5zdCBjb2xsZWN0aW9ucyBvZiBmaWxlcyBvciByZXNvdXJjZXMgCi0gICBpbiB2ZXJ5IGZsZXhpYmxlIHdheXMgLSBmb3IgZXhhbXBsZSwgYWxsIC5naWYgYW5kIC5qcGcgZmlsZXMgdW5kZXIKLSAgIGFueSAiaW1hZ2VzIiBkaXJlY3RvcnkgY291bGQgYmUgd3JpdHRlbiBhcyAvLipcL2ltYWdlc1wvLipbanBnfGdpZl0vLgotICAgPC9QPgotICAgPFA+Ci0gICBUaGUgYmVzdCBvdmVydmlldyBhcm91bmQgaXMgcHJvYmFibHkgdGhlIG9uZSB3aGljaCBjb21lcyB3aXRoIFBlcmwuCi0gICBXZSBpbXBsZW1lbnQgYSBzaW1wbGUgc3Vic2V0IG9mIFBlcmwncyByZWdleHAgc3VwcG9ydCwgYnV0IGl0J3MKLSAgIHN0aWxsIGEgZ29vZCB3YXkgdG8gbGVhcm4gd2hhdCB0aGV5IG1lYW4uICBZb3UgY2FuIHN0YXJ0IGJ5IGdvaW5nCi0gICB0byB0aGUgPEEKLSAgIEhSRUY9Imh0dHA6Ly93d3cucGVybC5jb20vQ1BBTi1sb2NhbC9kb2MvbWFudWFsL2h0bWwvcG9kL3BlcmxyZS5odG1sI1ZlcnNpb25fOF9SZWd1bGFyX0V4cHJlc2lvbnMiCi0gICA+Q1BBTiBwYWdlIG9uIHJlZ3VsYXIgZXhwcmVzc2lvbnM8L0E+LCBhbmQgYnJhbmNoaW5nIG91dCBmcm9tCi0gICB0aGVyZS4KLSAgIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci08L09MPgotPCEtLSNlbmRpZiAtLT4KLTwhLS0jaWYgZXhwcj0iJFNUQU5EQUxPTkUiIC0tPgotICA8IS0tIERvbid0IGZvcmdldCB0byBhZGQgSFIgdGFncyBhdCB0aGUgZW5kIG9mIGVhY2ggbGlzdCBpdGVtLi4gLS0+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+Ci08IS0tI2VuZGlmIC0tPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbWlzYy9GQVEtQy5odG1sIGIvZG9jcy9tYW51YWwvbWlzYy9GQVEtQy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjIyNmMwLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21pc2MvRkFRLUMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi08IS0tI2lmIGV4cHI9IiRGQVFNQVNURVIiIC0tPgotIDwhLS0jc2V0IHZhcj0iU1RBTkRBTE9ORSIgdmFsdWU9IiIgLS0+Ci0gPCEtLSNzZXQgdmFyPSJJTkNMVURFRCIgdmFsdWU9IllFUyIgLS0+Ci0gPCEtLSNpZiBleHByPSIkUVVFUllfU1RSSU5HID0gVE9DIiAtLT4KLSAgPCEtLSNzZXQgdmFyPSJUT0MiIHZhbHVlPSJZRVMiIC0tPgotICA8IS0tI3NldCB2YXI9IkNPTlRFTlQiIHZhbHVlPSIiIC0tPgotIDwhLS0jZWxzZSAtLT4KLSAgPCEtLSNzZXQgdmFyPSJUT0MiIHZhbHVlPSIiIC0tPgotICA8IS0tI3NldCB2YXI9IkNPTlRFTlQiIHZhbHVlPSJZRVMiIC0tPgotIDwhLS0jZW5kaWYgLS0+Ci08IS0tI2Vsc2UgLS0+Ci0gPCEtLSNzZXQgdmFyPSJTVEFOREFMT05FIiB2YWx1ZT0iWUVTIiAtLT4KLSA8IS0tI3NldCB2YXI9IklOQ0xVREVEIiB2YWx1ZT0iIiAtLT4KLSA8IS0tI3NldCB2YXI9IlRPQyIgdmFsdWU9IiIgLS0+Ci0gPCEtLSNzZXQgdmFyPSJDT05URU5UIiB2YWx1ZT0iIiAtLT4KLTwhLS0jZW5kaWYgLS0+Ci08IS0tI2lmIGV4cHI9IiRTVEFOREFMT05FIiAtLT4KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotIDxIRUFEPgotICA8VElUTEU+QXBhY2hlIFNlcnZlciBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvVElUTEU+Ci0gPC9IRUFEPgotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotIDxCT0RZCi0gIEJHQ09MT1I9IiNGRkZGRkYiCi0gIFRFWFQ9IiMwMDAwMDAiCi0gIExJTks9IiMwMDAwRkYiCi0gIFZMSU5LPSIjMDAwMDgwIgotICBBTElOSz0iI0ZGMDAwMCIKLSA+Ci0gIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0gIDxIMSBBTElHTj0iQ0VOVEVSIj5BcGFjaGUgU2VydmVyIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC9IMT4KLSAgPFA+Ci0gICRSZXZpc2lvbjogMS4xICQgKCREYXRlOiAxOTk5LzA2LzI0IDE1OjAyOjUxICQpCi0gIDwvUD4KLSAgPFA+Ci0gIFRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIEZBUSBpcyBhbHdheXMgYXZhaWxhYmxlIGZyb20gdGhlIG1haW4KLSAgQXBhY2hlIHdlYiBzaXRlLCBhdAotICAmbHQ7PEEKLSAgICAgICBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZG9jcy9taXNjL0ZBUS5odG1sIgotICAgICAgIFJFTD0iSGVscCIKLSAgICAgID48U0FNUD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvZG9jcy9taXNjL0ZBUS5odG1sPC9TQU1QPjwvQT4mZ3Q7LgotICA8L1A+Ci08IS0tIE5vdGVzIGFib3V0IGNoYW5nZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgLSBJZiBhZGRpbmcgYSByZWxhdGl2ZSBsaW5rIHRvIGFub3RoZXIgcGFydCBvZiB0aGUgICAgICAgICAgICAtLT4KLTwhLS0gICAgZG9jdW1lbnRhdGlvbiwgKmRvKiBpbmNsdWRlIHRoZSAiLmh0bWwiIHBvcnRpb24uICBUaGVyZSdzIGEgLS0+Ci08IS0tICAgIGdvb2QgY2hhbmNlIHRoYXQgdGhlIHVzZXIgd2lsbCBiZSByZWFkaW5nIHRoZSBkb2N1bWVudGF0aW9uIC0tPgotPCEtLSAgICBvbiBoaXMgb3duIHN5c3RlbSwgd2hpY2ggbWF5IG5vdCBiZSBjb25maWd1cmVkIGZvciAgICAgICAgICAtLT4KLTwhLS0gICAgbXVsdGl2aWV3cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAtIFdoZW4gYWRkaW5nIGl0ZW1zLCBtYWtlIHN1cmUgdGhleSdyZSBwdXQgaW4gdGhlIHJpZ2h0IHBsYWNlIC0tPgotPCEtLSAgICAtIHZlcmlmeSB0aGF0IHRoZSBudW1iZXJpbmcgbWF0Y2hlcyB1cC4gICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gIC0gKkRvbid0KiB1c2UgPFBSRT48L1BSRT4gYmxvY2tzIC0gdGhleSBkb24ndCBhcHBlYXIgICAgICAgICAgLS0+Ci08IS0tICAgIGNvcnJlY3RseSBpbiBhIHJlbGlhYmxlIHdheSB3aGVuIHRoaXMgaXMgY29udmVydGVkIHRvIHRleHQgIC0tPgotPCEtLSAgICB3aXRoIEx5bnguICBVc2UgPERMPjxERD48Q09ERT54eHg8QlI+eHg8L0NPREU+PC9ERD48L0RMPiAgICAtLT4KLTwhLS0gICAgYmxvY2tzIGluc2lkZSBhIDxQPjwvUD4gaW5zdGVhZC4gIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGdldCAgLS0+Ci08IS0tICAgIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBpbmRlbnRpbmcgcmlnaHQuICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgLSBEb24ndCBmb3JnZXQgdG8gaW5jbHVkZSBhbiBIUiB0YWcgYWZ0ZXIgdGhlIGxhc3QgL1AgdGFnICAgICAtLT4KLTwhLS0gICAgYnV0IGJlZm9yZSB0aGUgL0xJIGluIGFuIGl0ZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDxQPgotICBJZiB5b3UgYXJlIHJlYWRpbmcgYSB0ZXh0LW9ubHkgdmVyc2lvbiBvZiB0aGlzIEZBUSwgeW91IG1heSBmaW5kIG51bWJlcnMKLSAgZW5jbG9zZWQgaW4gYnJhY2tldHMgKHN1Y2ggYXMgJnF1b3Q7WzEyXSZxdW90OykuICBUaGVzZSByZWZlciB0byB0aGUgbGlzdCBvZgotICByZWZlcmVuY2UgVVJMcyB0byBiZSBmb3VuZCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC4gIFRoZXNlIHJlZmVyZW5jZXMKLSAgZG8gbm90IGFwcGVhciwgYW5kIGFyZSBub3QgbmVlZGVkLCBmb3IgdGhlIGh5cGVydGV4dCB2ZXJzaW9uLgotICA8L1A+Ci0gIDxIMj5UaGUgUXVlc3Rpb25zPC9IMj4KLTxPTCBUWVBFPSJBIj4KLTwhLS0jZW5kaWYgLS0+Ci08IS0tI2lmIGV4cHI9IiRUT0MgfHwgJFNUQU5EQUxPTkUiIC0tPgotIDxMSSBWQUxVRT0iMyI+PFNUUk9ORz5CdWlsZGluZyBBcGFjaGU8L1NUUk9ORz4KLSAgPE9MPgotICAgPExJPjxBIEhSRUY9IiNiaW5kOC4xIj5XaHkgZG8gSSBnZXQgYW4gZXJyb3IgYWJvdXQgYW4gdW5kZWZpbmVkCi0gICAgICAgIHJlZmVyZW5jZSB0byAmcXVvdDs8U0FNUD5fX2luZXRfbnRvYTwvU0FNUD4mcXVvdDsgb3Igb3RoZXIKLSAgICAgICAgPFNBTVA+X19pbmV0Xyo8L1NBTVA+IHN5bWJvbHM/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjY2FudGJ1aWxkIj5XaHkgd29uJ3QgQXBhY2hlIGNvbXBpbGUgd2l0aCBteQotICAgICAgICBzeXN0ZW0ncyA8U0FNUD5jYzwvU0FNUD4/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjbGludXhpb3ZlYyI+V2h5IGRvIEkgZ2V0IGNvbXBsYWludHMgYWJvdXQgcmVkZWZpbml0aW9uCi0gICAgICAgIG9mICZxdW90OzxDT0RFPnN0cnVjdCBpb3ZlYzwvQ09ERT4mcXVvdDsgd2hlbiBjb21waWxpbmcgdW5kZXIgTGludXg/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjYnJva2VuLWdjYyI+SSdtIHVzaW5nIGdjYyBhbmQgSSBnZXQgc29tZSBjb21waWxhdGlvbiBlcnJvcnMsIAotCXdoYXQgaXMgd3Jvbmc/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjZ2xpYmMtY3J5cHQiPkknbSB1c2luZyBSZWRIYXQgTGludXggNS4wLCBvciBzb21lIG90aGVyCi0gICAgICAgIDxTQU1QPmdsaWJjPC9TQU1QPi1iYXNlZCBMaW51eCBzeXN0ZW0sIGFuZCBJIGdldCBlcnJvcnMgd2l0aCB0aGUKLSAgICAgICAgPENPREU+Y3J5cHQ8L0NPREU+IGZ1bmN0aW9uIHdoZW4gSSBhdHRlbXB0IHRvIGJ1aWxkIEFwYWNoZSAxLjIuPC9BPgotICAgPC9MST4KLSAgPC9PTD4KLSA8L0xJPgotPCEtLSNlbmRpZiAtLT4KLTwhLS0jaWYgZXhwcj0iJFNUQU5EQUxPTkUiIC0tPgotPC9PTD4KLQotPEhSPgotCi0gIDxIMj5UaGUgQW5zd2VyczwvSDI+Ci08IS0tI2VuZGlmIC0tPgotPCEtLSNpZiBleHByPSIhICRUT0MiIC0tPgotCi0gIDxIMz5DLiBCdWlsZGluZyBBcGFjaGU8L0gzPgotPE9MPgotCi0gPExJPjxBIE5BTUU9ImJpbmQ4LjEiPgotICAgICAgPFNUUk9ORz5XaHkgZG8gSSBnZXQgYW4gZXJyb3IgYWJvdXQgYW4gdW5kZWZpbmVkIHJlZmVyZW5jZSB0bwotICAgICAgJnF1b3Q7PFNBTVA+X19pbmV0X250b2E8L1NBTVA+JnF1b3Q7IG9yIG90aGVyCi0gICAgICA8U0FNUD5fX2luZXRfKjwvU0FNUD4gc3ltYm9scz88L1NUUk9ORz4KLSAgICAgPC9BPgotICA8UD4KLSAgSWYgeW91IGhhdmUgaW5zdGFsbGVkIDxBIEhSRUY9Imh0dHA6Ly93d3cuaXNjLm9yZy9iaW5kLmh0bWwiPkJJTkQtODwvQT4KLSAgdGhlbiB0aGlzIGlzIG5vcm1hbGx5IGR1ZSB0byBhIGNvbmZsaWN0IGJldHdlZW4geW91ciBpbmNsdWRlIGZpbGVzCi0gIGFuZCB5b3VyIGxpYnJhcmllcy4gIEJJTkQtOCBpbnN0YWxscyBpdHMgaW5jbHVkZSBmaWxlcyBhbmQgbGlicmFyaWVzCi0gIDxDT0RFPi91c3IvbG9jYWwvaW5jbHVkZS88L0NPREU+IGFuZCA8Q09ERT4vdXNyL2xvY2FsL2xpYi88L0NPREU+LCB3aGlsZQotICB0aGUgcmVzb2x2ZXIgdGhhdCBjb21lcyB3aXRoIHlvdXIgc3lzdGVtIGlzIHByb2JhYmx5IGluc3RhbGxlZCBpbgotICA8Q09ERT4vdXNyL2luY2x1ZGUvPC9DT0RFPiBhbmQgPENPREU+L3Vzci9saWIvPC9DT0RFPi4gIElmCi0gIHlvdXIgc3lzdGVtIHVzZXMgdGhlIGhlYWRlciBmaWxlcyBpbiA8Q09ERT4vdXNyL2xvY2FsL2luY2x1ZGUvPC9DT0RFPgotICBiZWZvcmUgdGhvc2UgaW4gPENPREU+L3Vzci9pbmNsdWRlLzwvQ09ERT4gYnV0IHlvdSBkbyBub3QgdXNlIHRoZSBuZXcKLSAgcmVzb2x2ZXIgbGlicmFyeSwgdGhlbiB0aGUgdHdvIHZlcnNpb25zIHdpbGwgY29uZmxpY3QuCi0gIDwvUD4KLSAgPFA+Ci0gIFRvIHJlc29sdmUgdGhpcywgeW91IGNhbiBlaXRoZXIgbWFrZSBzdXJlIHlvdSB1c2UgdGhlIGluY2x1ZGUgZmlsZXMKLSAgYW5kIGxpYnJhcmllcyB0aGF0IGNhbWUgd2l0aCB5b3VyIHN5c3RlbSBvciBtYWtlIHN1cmUgdG8gdXNlIHRoZQotICBuZXcgaW5jbHVkZSBmaWxlcyBhbmQgbGlicmFyaWVzLiAgQWRkaW5nIDxDT0RFPi1sYmluZDwvQ09ERT4gdG8gdGhlCi0gIDxDT0RFPkVYVFJBX0xERkxBR1M8L0NPREU+IGxpbmUgaW4geW91ciA8U0FNUD5Db25maWd1cmF0aW9uPC9TQU1QPgotICBmaWxlLCB0aGVuIHJlLXJ1bm5pbmcgPFNBTVA+Q29uZmlndXJlPC9TQU1QPiwgc2hvdWxkIHJlc29sdmUgdGhlCi0gIHByb2JsZW0uICAoQXBhY2hlIHZlcnNpb25zIDEuMi4qIGFuZCBlYXJsaWVyIHVzZQotICA8Q09ERT5FWFRSQV9MRkxBR1M8L0NPREU+IGluc3RlYWQuKQotICA8L1A+Ci0gIDxQPgotICA8U1RST05HPk5vdGU6PC9TVFJPTkc+QXMgb2YgQklORCA4LjEuMSwgdGhlIGJpbmQgbGlicmFyaWVzIGFuZCBmaWxlcyBhcmUKLSAgaW5zdGFsbGVkIHVuZGVyIDxTQU1QPi91c3IvbG9jYWwvYmluZDwvU0FNUD4gYnkgZGVmYXVsdCwgc28geW91Ci0gIHNob3VsZCBub3QgcnVuIGludG8gdGhpcyBwcm9ibGVtLiAgU2hvdWxkIHlvdSB3YW50IHRvIHVzZSB0aGUgYmluZAotICByZXNvbHZlcnMgeW91J2xsIGhhdmUgdG8gYWRkIHRoZSBmb2xsb3dpbmcgdG8gdGhlIHJlc3BlY3RpdmUgbGluZXM6Ci0gIDwvUD4KLSAgPFA+Ci0gIDxETD4KLSAgIDxERD48Q09ERT5FWFRSQV9DRkxBR1M9LUkvdXNyL2xvY2FsL2JpbmQvaW5jbHVkZQotICAgIDxCUj4KLSAgICBFWFRSQV9MREZMQUdTPS1ML3Vzci9sb2NhbC9iaW5kL2xpYgotICAgIDxCUj4KLSAgICBFWFRSQV9MSUJTPS1sYmluZDwvQ09ERT4KLSAgIDwvREQ+Ci0gIDwvREw+Ci0gIDxQPjwvUD4KLSAgPEhSPgotIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0iY2FudGJ1aWxkIj4KLSAgICAgIDxTVFJPTkc+V2h5IHdvbid0IEFwYWNoZSBjb21waWxlIHdpdGggbXkgc3lzdGVtJ3MKLSAgICAgIDxTQU1QPmNjPC9TQU1QPj88L1NUUk9ORz4KLSAgICAgPC9BPgotICA8UD4KLSAgSWYgdGhlIHNlcnZlciB3b24ndCBjb21waWxlIG9uIHlvdXIgc3lzdGVtLCBpdCBpcyBwcm9iYWJseSBkdWUgdG8gb25lCi0gIG9mIHRoZSBmb2xsb3dpbmcgY2F1c2VzOgotICA8L1A+Ci0gIDxVTD4KLSAgIDxMST48U1RST05HPlRoZSA8U0FNUD5Db25maWd1cmU8L1NBTVA+IHNjcmlwdCBkb2Vzbid0IHJlY29nbml6ZSB5b3VyIHN5c3RlbQotICAgIGVudmlyb25tZW50LjwvU1RST05HPgotICAgIDxCUj4KLSAgICBUaGlzIG1pZ2h0IGJlIGVpdGhlciBiZWNhdXNlIGl0J3MgY29tcGxldGVseSB1bmtub3duIG9yIGJlY2F1c2UKLSAgICB0aGUgc3BlY2lmaWMgZW52aXJvbm1lbnQgKGluY2x1ZGUgZmlsZXMsIE9TIHZlcnNpb24sIDxFTT5ldAotICAgIGNldGVyYTwvRU0+KSBpc24ndCBleHBsaWNpdGx5IGhhbmRsZWQuICBJZiB0aGlzIGhhcHBlbnMsIHlvdSBtYXkKLSAgICBuZWVkIHRvIHBvcnQgdGhlIHNlcnZlciB0byB5b3VyIE9TIHlvdXJzZWxmLgotICAgPC9MST4KLSAgIDxMST48U1RST05HPllvdXIgc3lzdGVtJ3MgQyBjb21waWxlciBpcyBnYXJiYWdlLjwvU1RST05HPgotICAgIDxCUj4KLSAgICBTb21lIG9wZXJhdGluZyBzeXN0ZW1zIGluY2x1ZGUgYSBkZWZhdWx0IEMgY29tcGlsZXIgdGhhdCBpcyBlaXRoZXIKLSAgICBub3QgQU5TSSBDLWNvbXBsaWFudCBvciBzdWZmZXJzIGZyb20gb3RoZXIgZGVmaWNpZW5jaWVzLiAgVGhlIHVzdWFsCi0gICAgcmVjb21tZW5kYXRpb24gaW4gY2FzZXMgbGlrZSB0aGlzIGlzIHRvIGFjcXVpcmUsIGluc3RhbGwsIGFuZCB1c2UKLSAgICA8U0FNUD5nY2M8L1NBTVA+LgotICAgPC9MST4KLSAgIDxMST48U1RST05HPllvdXIgPFNBTVA+aW5jbHVkZTwvU0FNUD4gZmlsZXMgbWF5IGJlIGNvbmZ1c2VkLjwvU1RST05HPgotICAgIDxCUj4KLSAgICBJbiBzb21lIGNhc2VzLCB3ZSBoYXZlIGZvdW5kIHRoYXQgYSBjb21waWxlciBpbnN0YWxsYXRpb24gb3Igc3lzdGVtCi0gICAgdXBncmFkZSBoYXMgbGVmdCB0aGUgQyBoZWFkZXIgZmlsZXMgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiAgTWFrZQotICAgIHN1cmUgdGhhdCB5b3VyIGluY2x1ZGUgZGlyZWN0b3J5IHRyZWUgaXMgaW4gc3luYyB3aXRoIHRoZSBjb21waWxlciBhbmQKLSAgICB0aGUgb3BlcmF0aW5nIHN5c3RlbS4KLSAgIDwvTEk+Ci0gICA8TEk+PFNUUk9ORz5Zb3VyIG9wZXJhdGluZyBzeXN0ZW0gb3IgY29tcGlsZXIgbWF5IGJlIG91dCBvZgotICAgIHJldmlzaW9uLjwvU1RST05HPgotICAgIDxCUj4KLSAgICBTb2Z0d2FyZSB2ZW5kb3JzIChpbmNsdWRpbmcgdGhvc2UgdGhhdCBkZXZlbG9wIG9wZXJhdGluZyBzeXN0ZW1zKQotICAgIGlzc3VlIG5ldyByZWxlYXNlcyBmb3IgYSByZWFzb247IHNvbWV0aW1lcyB0byBhZGQgZnVuY3Rpb25hbGl0eSwgYnV0Ci0gICAgbW9yZSBvZnRlbiB0byBmaXggYnVncyB0aGF0IGhhdmUgYmVlbiBkaXNjb3ZlcmVkLiAgVHJ5IHVwZ3JhZGluZwotICAgIHlvdXIgY29tcGlsZXIgYW5kL29yIHlvdXIgb3BlcmF0aW5nIHN5c3RlbS4KLSAgIDwvTEk+Ci0gIDwvVUw+Ci0gIDxQPgotICBUaGUgQXBhY2hlIEdyb3VwIHRlc3RzIHRoZSBhYmlsaXR5IHRvIGJ1aWxkIHRoZSBzZXJ2ZXIgb24gbWFueQotICBkaWZmZXJlbnQgcGxhdGZvcm1zLiAgVW5mb3J0dW5hdGVseSwgd2UgY2FuJ3QgdGVzdCBhbGwgb2YgdGhlIE9TCi0gIHBsYXRmb3JtcyB0aGVyZSBhcmUuICBJZiB5b3UgaGF2ZSB2ZXJpZmllZCB0aGF0IG5vbmUgb2YgdGhlIGFib3ZlCi0gIGlzc3VlcyBpcyB0aGUgY2F1c2Ugb2YgeW91ciBwcm9ibGVtLCBhbmQgaXQgaGFzbid0IGJlZW4gcmVwb3J0ZWQKLSAgYmVmb3JlLCBwbGVhc2Ugc3VibWl0IGEKLSAgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2J1Z19yZXBvcnQuaHRtbCI+cHJvYmxlbSByZXBvcnQ8L0E+LgotICBCZSBzdXJlIHRvIGluY2x1ZGUgPEVNPmNvbXBsZXRlPC9FTT4gZGV0YWlscywgc3VjaCBhcyB0aGUgY29tcGlsZXIKLSAgJmFtcDsgT1MgdmVyc2lvbnMgYW5kIGV4YWN0IGVycm9yIG1lc3NhZ2VzLgotICA8L1A+Ci0gIDxIUj4KLSA8L0xJPgotCi0gPExJPjxBIE5BTUU9ImxpbnV4aW92ZWMiPgotICAgICAgPFNUUk9ORz5XaHkgZG8gSSBnZXQgY29tcGxhaW50cyBhYm91dCByZWRlZmluaXRpb24KLSAgICAgIG9mICZxdW90OzxDT0RFPnN0cnVjdCBpb3ZlYzwvQ09ERT4mcXVvdDsgd2hlbgotICAgICAgY29tcGlsaW5nIHVuZGVyIExpbnV4PzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBUaGlzIGlzIGEgY29uZmxpY3QgYmV0d2VlbiB5b3VyIEMgbGlicmFyeSBpbmNsdWRlcyBhbmQgeW91ciBrZXJuZWwKLSAgaW5jbHVkZXMuICBZb3UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgdmVyc2lvbnMgb2YgYm90aCBhcmUgbWF0Y2hlZAotICBwcm9wZXJseS4gIFRoZXJlIGFyZSB0d28gd29ya2Fyb3VuZHMsIGVpdGhlciBvbmUgd2lsbCBzb2x2ZSB0aGUgcHJvYmxlbToKLSAgPC9QPgotICA8UD4KLSAgPFVMPgotICAgPExJPlJlbW92ZSB0aGUgZGVmaW5pdGlvbiBvZiA8Q09ERT5zdHJ1Y3QgaW92ZWM8L0NPREU+IGZyb20geW91ciBDCi0gICAgbGlicmFyeSBpbmNsdWRlcy4gIEl0IGlzIGxvY2F0ZWQgaW4gPENPREU+L3Vzci9pbmNsdWRlL3N5cy91aW8uaDwvQ09ERT4uCi0gICAgPFNUUk9ORz5Pciw8L1NUUk9ORz4KLSAgIDwvTEk+Ci0gICA8TEk+QWRkICA8Q09ERT4tRE5PX1dSSVRFVjwvQ09ERT4gdG8gdGhlIDxDT0RFPkVYVFJBX0NGTEFHUzwvQ09ERT4KLSAgICBsaW5lIGluIHlvdXIgPFNBTVA+Q29uZmlndXJhdGlvbjwvU0FNUD4gYW5kIHJlY29uZmlndXJlL3JlYnVpbGQuCi0gICAgVGhpcyBodXJ0cyBwZXJmb3JtYW5jZSBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBhcyBhIGxhc3QgcmVzb3J0LgotICAgPC9MST4KLSAgPC9VTD4KLSAgPFA+PC9QPgotICA8SFI+Ci0gPC9MST4KLQotIDxMST48QSBOQU1FPSJicm9rZW4tZ2NjIj48U1RST05HPkknbSB1c2luZyBnY2MgYW5kIEkgZ2V0IHNvbWUKLQljb21waWxhdGlvbiBlcnJvcnMsIHdoYXQgaXMgd3Jvbmc/PC9TVFJPTkc+PC9BPgotICAgIDxQPgotICAgIEdDQyBwYXJzZXMgeW91ciBzeXN0ZW0gaGVhZGVyIGZpbGVzIGFuZCBwcm9kdWNlcyBhIG1vZGlmaWVkIHN1YnNldCB3aGljaAotICAgIGl0IHVzZXMgZm9yIGNvbXBpbGluZy4gIFRoaXMgYmVoYXZpb3VyIHRpZXMgR0NDIHRpZ2h0bHkgdG8gdGhlIHZlcnNpb24KLSAgICBvZiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0uICBTbywgZm9yIGV4YW1wbGUsIGlmIHlvdSB3ZXJlIHJ1bm5pbmcgSVJJWCA1LjMKLSAgICB3aGVuIHlvdSBidWlsdCBHQ0MgYW5kIHRoZW4gdXBncmFkZSB0byBJUklYIDYuMiBsYXRlciwgeW91IHdpbGwgaGF2ZSB0bwotICAgIHJlYnVpbGQgR0NDLiAgU2ltaWxhcmx5IGZvciBTb2xhcmlzIDIuNCwgMi41LCBvciAyLjUuMSB3aGVuIHlvdSB1cGdyYWRlCi0gICAgdG8gMi42LiAgU29tZXRpbWVzIHlvdSBjYW4gdHlwZSAiZ2NjIC12IiBhbmQgaXQgd2lsbCB0ZWxsIHlvdSB0aGUgdmVyc2lvbgotICAgIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGl0IHdhcyBidWlsdCBhZ2FpbnN0LgotICAgIDwvUD4KLSAgICA8UD4KLSAgICBJZiB5b3UgZmFpbCB0byBkbyB0aGlzLCB0aGVuIGl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgQXBhY2hlIHdpbGwgZmFpbAotICAgIHRvIGJ1aWxkLiAgT25lIG9mIHRoZSBtb3N0IGNvbW1vbiBlcnJvcnMgaXMgd2l0aCA8Q09ERT5yZWFkdjwvQ09ERT4sCi0gICAgPENPREU+d3JpdGV2PC9DT0RFPiwgb3IgPENPREU+dWlvLmg8L0NPREU+LiAgVGhpcyBpcyA8U1RST05HPm5vdDwvU1RST05HPiBhCi0gICAgYnVnIHdpdGggQXBhY2hlLiAgWW91IHdpbGwgbmVlZCB0byByZS1pbnN0YWxsIEdDQy4KLSAgICA8L1A+Ci0gICA8SFI+Ci0gIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0iZ2xpYmMtY3J5cHQiPgotICAgICAgPFNUUk9ORz5JJ20gdXNpbmcgUmVkSGF0IExpbnV4IDUuMCwgb3Igc29tZSBvdGhlciAKLSAgICAgIDxTQU1QPmdsaWJjPC9TQU1QPi1iYXNlZCBMaW51eCBzeXN0ZW0sIGFuZCBJIGdldCBlcnJvcnMgd2l0aCB0aGUKLSAgICAgIDxDT0RFPmNyeXB0PC9DT0RFPiBmdW5jdGlvbiB3aGVuIEkgYXR0ZW1wdCB0byBidWlsZCBBcGFjaGUgMS4yLjwvU1RST05HPgotICAgICA8L0E+Ci0KLSAgPFA+Ci0gIDxTQU1QPmdsaWJjPC9TQU1QPiBwdXRzIHRoZSA8Q09ERT5jcnlwdDwvQ09ERT4gZnVuY3Rpb24gaW50byBhIHNlcGFyYXRlCi0gIGxpYnJhcnkuICBFZGl0IHlvdXIgPENPREU+c3JjL0NvbmZpZ3VyYXRpb248L0NPREU+IGZpbGUgYW5kIHNldCB0aGlzOgotICA8L1A+Ci0gIDxETD4KLSAgIDxERD48Q09ERT5FWFRSQV9MSUJTPS1sY3J5cHQ8L0NPREU+Ci0gICA8L0REPgotICA8L0RMPgotICA8UD4KLSAgVGhlbiByZS1ydW4gPFNBTVA+c3JjL0NvbmZpZ3VyZTwvU0FNUD4gYW5kIHJlLWV4ZWN1dGUgdGhlIG1ha2UuCi0gIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci0KLTwvT0w+Ci08IS0tI2VuZGlmIC0tPgotPCEtLSNpZiBleHByPSIkU1RBTkRBTE9ORSIgLS0+Ci0gIDwhLS0gRG9uJ3QgZm9yZ2V0IHRvIGFkZCBIUiB0YWdzIGF0IHRoZSBlbmQgb2YgZWFjaCBsaXN0IGl0ZW0uLiAtLT4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KLTwhLS0jZW5kaWYgLS0+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9taXNjL0ZBUS1ELmh0bWwgYi9kb2NzL21hbnVhbC9taXNjL0ZBUS1ELmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MDYyZTkuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbWlzYy9GQVEtRC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLTwhLS0jaWYgZXhwcj0iJEZBUU1BU1RFUiIgLS0+Ci0gPCEtLSNzZXQgdmFyPSJTVEFOREFMT05FIiB2YWx1ZT0iIiAtLT4KLSA8IS0tI3NldCB2YXI9IklOQ0xVREVEIiB2YWx1ZT0iWUVTIiAtLT4KLSA8IS0tI2lmIGV4cHI9IiRRVUVSWV9TVFJJTkcgPSBUT0MiIC0tPgotICA8IS0tI3NldCB2YXI9IlRPQyIgdmFsdWU9IllFUyIgLS0+Ci0gIDwhLS0jc2V0IHZhcj0iQ09OVEVOVCIgdmFsdWU9IiIgLS0+Ci0gPCEtLSNlbHNlIC0tPgotICA8IS0tI3NldCB2YXI9IlRPQyIgdmFsdWU9IiIgLS0+Ci0gIDwhLS0jc2V0IHZhcj0iQ09OVEVOVCIgdmFsdWU9IllFUyIgLS0+Ci0gPCEtLSNlbmRpZiAtLT4KLTwhLS0jZWxzZSAtLT4KLSA8IS0tI3NldCB2YXI9IlNUQU5EQUxPTkUiIHZhbHVlPSJZRVMiIC0tPgotIDwhLS0jc2V0IHZhcj0iSU5DTFVERUQiIHZhbHVlPSIiIC0tPgotIDwhLS0jc2V0IHZhcj0iVE9DIiB2YWx1ZT0iIiAtLT4KLSA8IS0tI3NldCB2YXI9IkNPTlRFTlQiIHZhbHVlPSIiIC0tPgotPCEtLSNlbmRpZiAtLT4KLTwhLS0jaWYgZXhwcj0iJFNUQU5EQUxPTkUiIC0tPgotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci0gPEhFQUQ+Ci0gIDxUSVRMRT5BcGFjaGUgU2VydmVyIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC9USVRMRT4KLSA8L0hFQUQ+Ci08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci0gPEJPRFkKLSAgQkdDT0xPUj0iI0ZGRkZGRiIKLSAgVEVYVD0iIzAwMDAwMCIKLSAgTElOSz0iIzAwMDBGRiIKLSAgVkxJTks9IiMwMDAwODAiCi0gIEFMSU5LPSIjRkYwMDAwIgotID4KLSAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLSAgPEgxIEFMSUdOPSJDRU5URVIiPkFwYWNoZSBTZXJ2ZXIgRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L0gxPgotICA8UD4KLSAgJFJldmlzaW9uOiAxLjUgJCAoJERhdGU6IDE5OTkvMTIvMTAgMTQ6NTY6MjYgJCkKLSAgPC9QPgotICA8UD4KLSAgVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgRkFRIGlzIGFsd2F5cyBhdmFpbGFibGUgZnJvbSB0aGUgbWFpbgotICBBcGFjaGUgd2ViIHNpdGUsIGF0Ci0gICZsdDs8QQotICAgICAgIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL21pc2MvRkFRLmh0bWwiCi0gICAgICAgUkVMPSJIZWxwIgotICAgICAgPjxTQU1QPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL21pc2MvRkFRLmh0bWw8L1NBTVA+PC9BPiZndDsuCi0gIDwvUD4KLTwhLS0gTm90ZXMgYWJvdXQgY2hhbmdlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAtIElmIGFkZGluZyBhIHJlbGF0aXZlIGxpbmsgdG8gYW5vdGhlciBwYXJ0IG9mIHRoZSAgICAgICAgICAgIC0tPgotPCEtLSAgICBkb2N1bWVudGF0aW9uLCAqZG8qIGluY2x1ZGUgdGhlICIuaHRtbCIgcG9ydGlvbi4gIFRoZXJlJ3MgYSAtLT4KLTwhLS0gICAgZ29vZCBjaGFuY2UgdGhhdCB0aGUgdXNlciB3aWxsIGJlIHJlYWRpbmcgdGhlIGRvY3VtZW50YXRpb24gLS0+Ci08IS0tICAgIG9uIGhpcyBvd24gc3lzdGVtLCB3aGljaCBtYXkgbm90IGJlIGNvbmZpZ3VyZWQgZm9yICAgICAgICAgIC0tPgotPCEtLSAgICBtdWx0aXZpZXdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gIC0gV2hlbiBhZGRpbmcgaXRlbXMsIG1ha2Ugc3VyZSB0aGV5J3JlIHB1dCBpbiB0aGUgcmlnaHQgcGxhY2UgLS0+Ci08IS0tICAgIC0gdmVyaWZ5IHRoYXQgdGhlIG51bWJlcmluZyBtYXRjaGVzIHVwLiAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgLSAqRG9uJ3QqIHVzZSA8UFJFPjwvUFJFPiBibG9ja3MgLSB0aGV5IGRvbid0IGFwcGVhciAgICAgICAgICAtLT4KLTwhLS0gICAgY29ycmVjdGx5IGluIGEgcmVsaWFibGUgd2F5IHdoZW4gdGhpcyBpcyBjb252ZXJ0ZWQgdG8gdGV4dCAgLS0+Ci08IS0tICAgIHdpdGggTHlueC4gIFVzZSA8REw+PEREPjxDT0RFPnh4eDxCUj54eDwvQ09ERT48L0REPjwvREw+ICAgIC0tPgotPCEtLSAgICBibG9ja3MgaW5zaWRlIGEgPFA+PC9QPiBpbnN0ZWFkLiAgVGhpcyBpcyBuZWNlc3NhcnkgdG8gZ2V0ICAtLT4KLTwhLS0gICAgdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGluZGVudGluZyByaWdodC4gICAgICAgICAgICAgICAgLS0+Ci08IS0tICAtIERvbid0IGZvcmdldCB0byBpbmNsdWRlIGFuIEhSIHRhZyBhZnRlciB0aGUgbGFzdCAvUCB0YWcgICAgIC0tPgotPCEtLSAgICBidXQgYmVmb3JlIHRoZSAvTEkgaW4gYW4gaXRlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPFA+Ci0gIElmIHlvdSBhcmUgcmVhZGluZyBhIHRleHQtb25seSB2ZXJzaW9uIG9mIHRoaXMgRkFRLCB5b3UgbWF5IGZpbmQgbnVtYmVycwotICBlbmNsb3NlZCBpbiBicmFja2V0cyAoc3VjaCBhcyAmcXVvdDtbMTJdJnF1b3Q7KS4gIFRoZXNlIHJlZmVyIHRvIHRoZSBsaXN0IG9mCi0gIHJlZmVyZW5jZSBVUkxzIHRvIGJlIGZvdW5kIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LiAgVGhlc2UgcmVmZXJlbmNlcwotICBkbyBub3QgYXBwZWFyLCBhbmQgYXJlIG5vdCBuZWVkZWQsIGZvciB0aGUgaHlwZXJ0ZXh0IHZlcnNpb24uCi0gIDwvUD4KLSAgPEgyPlRoZSBRdWVzdGlvbnM8L0gyPgotPE9MIFRZUEU9IkEiPgotPCEtLSNlbmRpZiAtLT4KLTwhLS0jaWYgZXhwcj0iJFRPQyB8fCAkU1RBTkRBTE9ORSIgLS0+Ci0gPExJIFZBTFVFPSI0Ij48U1RST05HPkVycm9yIExvZyBNZXNzYWdlcyBhbmQgUHJvYmxlbXMgU3RhcnRpbmcgQXBhY2hlPC9TVFJPTkc+Ci0gIDxPTD4KLSAgIDxMST48QSBIUkVGPSIjc2V0Z2lkIj5XaHkgZG8gSSBnZXQgJnF1b3Q7PFNBTVA+c2V0Z2lkOiBJbnZhbGlkCi0gICAgICAgIGFyZ3VtZW50PC9TQU1QPiZxdW90OyBhdCBzdGFydHVwPzwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI25vZGVsYXkiPldoeSBhbSBJIGdldHRpbmcgJnF1b3Q7PFNBTVA+aHR0cGQ6IGNvdWxkIG5vdAotICAgICAgICBzZXQgc29ja2V0IG9wdGlvbiBUQ1BfTk9ERUxBWTwvU0FNUD4mcXVvdDsgaW4gbXkgZXJyb3IgbG9nPzwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI3BlZXJyZXNldCI+V2h5IGFtIEkgZ2V0dGluZyAmcXVvdDs8U0FNUD5jb25uZWN0aW9uCi0gICAgICAgIHJlc2V0IGJ5IHBlZXI8L1NBTVA+JnF1b3Q7IGluIG15IGVycm9yIGxvZz88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiN3aGVyZXMtdGhlLWR1bXAiPlRoZSBlcnJvcmxvZyBzYXlzIEFwYWNoZSBkdW1wZWQgY29yZSwKLSAgICAgICAgYnV0IHdoZXJlJ3MgdGhlIGR1bXAgZmlsZT88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNsaW51eC1zaG1nZXQiPldoZW4gSSBydW4gaXQgdW5kZXIgTGludXggSSBnZXQgJnF1b3Q7c2htZ2V0OgotICAgICAgICBmdW5jdGlvbiBub3QgZm91bmQmcXVvdDssIHdoYXQgc2hvdWxkIEkgZG8/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjbmZzbG9ja2luZyI+U2VydmVyIGhhbmdzLCBvciBmYWlscyB0byBzdGFydCwgYW5kL29yIGVycm9yIGxvZwotICAgICAgICBmaWxscyB3aXRoICZxdW90OzxTQU1QPmZjbnRsOiBGX1NFVExLVzogTm8gcmVjb3JkIGxvY2tzCi0gICAgICAgIGF2YWlsYWJsZTwvU0FNUD4mcXVvdDsgb3Igc2ltaWxhciBtZXNzYWdlczwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI2FpeGNjYnVnIj5XaHkgYW0gSSBnZXR0aW5nICI8U0FNUD5FeHBlY3RlZCAmbHQvRGlyZWN0b3J5Jmd0OwotICAgICAgICBidXQgc2F3ICZsdDsvRGlyZWN0b3J5Jmd0OzwvU0FNUD4iIHdoZW4gSSB0cnkgdG8gc3RhcnQgQXBhY2hlPzwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI3JlZGhhdCI+SSdtIHVzaW5nIFJlZEhhdCBMaW51eCBhbmQgSSBoYXZlIHByb2JsZW1zIHdpdGggaHR0cGQKLSAgICAgICAgZHlpbmcgcmFuZG9tbHkgb3Igbm90IHJlc3RhcnRpbmcgcHJvcGVybHk8L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNzdG9wcGluZyI+SSB1cGdyYWRlZCBmcm9tIGFuIEFwYWNoZSB2ZXJzaW9uIGVhcmxpZXIKLSAgICAgICAgdGhhbiAxLjIuMCBhbmQgc3VkZGVubHkgSSBoYXZlIHByb2JsZW1zIHdpdGggQXBhY2hlIGR5aW5nIHJhbmRvbWx5Ci0gICAgICAgIG9yIG5vdCByZXN0YXJ0aW5nIHByb3Blcmx5PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjc2V0c2VydmVybmFtZSI+V2hlbiBJIHRyeSB0byBzdGFydCBBcGFjaGUgZnJvbSBhIERPUwotICAgICAgICB3aW5kb3csIEkgZ2V0IGEgbWVzc2FnZSBsaWtlICI8c2FtcD5DYW5ub3QgZGV0ZXJtaW5lIGhvc3QgbmFtZS4KLQlVc2UgU2VydmVyTmFtZSBkaXJlY3RpdmUgdG8gc2V0IGl0IG1hbnVhbGx5Ljwvc2FtcD4iICBXaGF0IGRvZXMKLQl0aGlzIG1lYW4/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjd3MyXzMyZGxsIj5XaGVuIEkgdHJ5IHRvIHN0YXJ0IEFwYWNoZSBmb3IgV2luZG93cywgSSBnZXQgYSBtZXNzYWdlCi0JbGlrZSAiPHNhbXA+VW5hYmxlIFRvIExvY2F0ZSBXUzJfMzIuRExMLi4uPC9zYW1wPiIuIFdoYXQgc2hvdWxkIEkgZG8/PC9BPgotICAgPC9MST4KLSAgPC9PTD4KLSA8L0xJPgotPCEtLSNlbmRpZiAtLT4KLTwhLS0jaWYgZXhwcj0iJFNUQU5EQUxPTkUiIC0tPgotPC9PTD4KLQotPEhSPgotCi0gIDxIMj5UaGUgQW5zd2VyczwvSDI+Ci08IS0tI2VuZGlmIC0tPgotPCEtLSNpZiBleHByPSIhICRUT0MiIC0tPgotCi0gIDxIMz5ELiBFcnJvciBMb2cgTWVzc2FnZXMgYW5kIFByb2JsZW1zIFN0YXJ0aW5nIEFwYWNoZTwvSDM+Ci08T0w+Ci0KLSA8TEk+PEEgTkFNRT0ic2V0Z2lkIj4KLSAgICAgIDxTVFJPTkc+V2h5IGRvIEkgZ2V0ICZxdW90OzxTQU1QPnNldGdpZDogSW52YWxpZAotICAgICAgYXJndW1lbnQ8L1NBTVA+JnF1b3Q7IGF0IHN0YXJ0dXA/PC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+Ci0gIFlvdXIKLSAgPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNncm91cCI+PFNBTVA+R3JvdXA8L1NBTVA+PC9BPgotICBkaXJlY3RpdmUgKHByb2JhYmx5IGluIDxTQU1QPmNvbmYvaHR0cGQuY29uZjwvU0FNUD4pIG5lZWRzIHRvIG5hbWUgYQotICBncm91cCB0aGF0IGFjdHVhbGx5IGV4aXN0cyBpbiB0aGUgPFNBTVA+L2V0Yy9ncm91cDwvU0FNUD4gZmlsZSAob3IKLSAgeW91ciBzeXN0ZW0ncyBlcXVpdmFsZW50KS4gIFRoaXMgcHJvYmxlbSBpcyBhbHNvIGZyZXF1ZW50bHkgc2VlbiB3aGVuCi0gIGEgbmVnYXRpdmUgbnVtYmVyIGlzIHVzZWQgaW4gdGhlIDxDT0RFPkdyb3VwPC9DT0RFPiBkaXJlY3RpdmUKLSAgKDxFTT5lLmcuPC9FTT4sICI8Q09ERT5Hcm91cCZuYnNwOyMtMTwvQ09ERT4iKS4gIFVzaW5nIGEgZ3JvdXAgbmFtZQotICAtLSBub3QgZ3JvdXAgbnVtYmVyIC0tIGZvdW5kIGluIHlvdXIgc3lzdGVtJ3MgZ3JvdXAgZGF0YWJhc2Ugc2hvdWxkCi0gIHNvbHZlIHRoaXMgcHJvYmxlbSBpbiBhbGwgY2FzZXMuCi0gIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0ibm9kZWxheSI+Ci0gICAgICA8U1RST05HPldoeSBhbSBJIGdldHRpbmcgJnF1b3Q7PFNBTVA+aHR0cGQ6IGNvdWxkIG5vdCBzZXQgc29ja2V0Ci0gICAgICBvcHRpb24gVENQX05PREVMQVk8L1NBTVA+JnF1b3Q7IGluIG15IGVycm9yIGxvZz88L1NUUk9ORz4KLSAgICAgPC9BPgotICA8UD4KLSAgVGhpcyBtZXNzYWdlIGFsbW9zdCBhbHdheXMgaW5kaWNhdGVzIHRoYXQgdGhlIGNsaWVudCBkaXNjb25uZWN0ZWQKLSAgYmVmb3JlIEFwYWNoZSByZWFjaGVkIHRoZSBwb2ludCBvZiBjYWxsaW5nIDxDT0RFPnNldHNvY2tvcHQoKTwvQ09ERT4KLSAgZm9yIHRoZSBjb25uZWN0aW9uLiAgSXQgc2hvdWxkbid0IG9jY3VyIGZvciBtb3JlIHRoYW4gYWJvdXQgMSUgb2YgdGhlCi0gIHJlcXVlc3RzIHlvdXIgc2VydmVyIGhhbmRsZXMsIGFuZCBpdCdzIGFkdmlzb3J5IG9ubHkgaW4gYW55IGNhc2UuCi0gIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0icGVlcnJlc2V0Ij4KLSAgICAgIDxTVFJPTkc+V2h5IGFtIEkgZ2V0dGluZyAmcXVvdDs8U0FNUD5jb25uZWN0aW9uIHJlc2V0IGJ5Ci0gICAgICBwZWVyPC9TQU1QPiZxdW90OyBpbiBteSBlcnJvciBsb2c/PC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+Ci0gIFRoaXMgaXMgYSBub3JtYWwgbWVzc2FnZSBhbmQgbm90aGluZyBhYm91dCB3aGljaCB0byBiZSBhbGFybWVkLiAgSXQgc2ltcGx5Ci0gIG1lYW5zIHRoYXQgdGhlIGNsaWVudCBjYW5jZWxlZCB0aGUgY29ubmVjdGlvbiBiZWZvcmUgaXQgaGFkIGJlZW4KLSAgY29tcGxldGVseSBzZXQgdXAgLSBzdWNoIGFzIGJ5IHRoZSBlbmQtdXNlciBwcmVzc2luZyB0aGUgJnF1b3Q7U3RvcCZxdW90OwotICBidXR0b24uICBQZW9wbGUncyBwYXRpZW5jZSBiZWluZyB3aGF0IGl0IGlzLCBzaXRlcyB3aXRoIHJlc3BvbnNlLXRpbWUKLSAgcHJvYmxlbXMgb3Igc2xvdyBuZXR3b3JrIGxpbmtzIG1heSBleHBlcmllbmNlcyB0aGlzIG1vcmUgdGhhbgotICBoaWdoLWNhcGFjaXR5IG9uZXMgb3IgdGhvc2Ugd2l0aCBsYXJnZSBwaXBlcyB0byB0aGUgbmV0d29yay4KLSAgPC9QPgotICA8SFI+Ci0gPC9MST4KLQotIDxMST48QSBOQU1FPSJ3aGVyZXMtdGhlLWR1bXAiPgotICAgICAgPFNUUk9ORz5UaGUgZXJyb3Jsb2cgc2F5cyBBcGFjaGUgZHVtcGVkIGNvcmUsIGJ1dCB3aGVyZSdzIHRoZSBkdW1wCi0gICAgICBmaWxlPzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBJbiBBcGFjaGUgdmVyc2lvbiAxLjIsIHRoZSBlcnJvciBsb2cgbWVzc2FnZQotICBhYm91dCBkdW1wZWQgY29yZSBpbmNsdWRlcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBkdW1wIGZpbGUgc2hvdWxkIGJlCi0gIGxvY2F0ZWQuICBIb3dldmVyLCBtYW55IFVuaXhlcyBkbyBub3QgYWxsb3cgYSBwcm9jZXNzIHRoYXQgaGFzCi0gIGNhbGxlZCA8Q09ERT5zZXR1aWQoKTwvQ09ERT4gdG8gZHVtcCBjb3JlIGZvciBzZWN1cml0eSByZWFzb25zOwotICB0aGUgdHlwaWNhbCBBcGFjaGUgc2V0dXAgaGFzIHRoZSBzZXJ2ZXIgc3RhcnRlZCBhcyByb290IHRvIGJpbmQgdG8KLSAgcG9ydCA4MCwgYWZ0ZXIgd2hpY2ggaXQgY2hhbmdlcyBVSURzIHRvIGEgbm9uLXByaXZpbGVnZWQgdXNlciB0bwotICBzZXJ2ZSByZXF1ZXN0cy4KLSAgPC9QPgotICA8UD4KLSAgRGVhbGluZyB3aXRoIHRoaXMgaXMgZXh0cmVtZWx5IG9wZXJhdGluZyBzeXN0ZW0tc3BlY2lmaWMsIGFuZCBtYXkKLSAgcmVxdWlyZSByZWJ1aWxkaW5nIHlvdXIgc3lzdGVtIGtlcm5lbC4gIENvbnN1bHQgeW91ciBvcGVyYXRpbmcgc3lzdGVtCi0gIGRvY3VtZW50YXRpb24gb3IgdmVuZG9yIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgeW91ciBzeXN0ZW0KLSAgZG9lcyB0aGlzIGFuZCBob3cgdG8gYnlwYXNzIGl0LiAgSWYgdGhlcmUgPEVNPmlzPC9FTT4gYSBkb2N1bWVudGVkIHdheQotICBvZiBieXBhc3NpbmcgaXQsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IGJ5cGFzcyBpdCBvbmx5IGZvciB0aGUKLSAgPFNBTVA+aHR0cGQ8L1NBTVA+IHNlcnZlciBwcm9jZXNzIGlmIHBvc3NpYmxlLgotICA8L1A+Ci0gIDxQPgotICBUaGUgY2Fub25pY2FsIGxvY2F0aW9uIGZvciBBcGFjaGUncyBjb3JlLWR1bXAgZmlsZXMgaXMgdGhlCi0gIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvQT4KLSAgZGlyZWN0b3J5LiBBcyBvZiBBcGFjaGUgdmVyc2lvbiAxLjMsIHRoZSBsb2NhdGlvbiBjYW4gYmUgc2V0IDxFTT52aWE8L0VNPgotICB0aGUKLSAgPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNjb3JlZHVtcGRpcmVjdG9yeSIKLSAgPjxTQU1QPkNvcmVEdW1wRGlyZWN0b3J5PC9TQU1QPjwvQT4KLSAgZGlyZWN0aXZlIHRvIGEgZGlmZmVyZW50IGRpcmVjdG9yeS4gTWFrZSBzdXJlIHRoYXQgdGhpcyBkaXJlY3RvcnkgaXMKLSAgd3JpdGFibGUgYnkgdGhlIHVzZXIgdGhlIHNlcnZlciBydW5zIGFzIChhcyBvcHBvc2VkIHRvIHRoZSB1c2VyIHRoZSBzZXJ2ZXIKLSAgaXMgPEVNPnN0YXJ0ZWQ8L0VNPiBhcykuCi0gIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0ibGludXgtc2htZ2V0Ij4KLSAgICAgIDxTVFJPTkc+V2hlbiBJIHJ1biBpdCB1bmRlciBMaW51eCBJIGdldCAmcXVvdDtzaG1nZXQ6Ci0gICAgICBmdW5jdGlvbiBub3QgZm91bmQmcXVvdDssIHdoYXQgc2hvdWxkIEkgZG8/PC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+Ci0gIFlvdXIga2VybmVsIGhhcyBiZWVuIGJ1aWx0IHdpdGhvdXQgU3lzViBJUEMgc3VwcG9ydC4gIFlvdSB3aWxsIGhhdmUKLSAgdG8gcmVidWlsZCB0aGUga2VybmVsIHdpdGggdGhhdCBzdXBwb3J0IGVuYWJsZWQgKGl0J3MgdW5kZXIgdGhlCi0gICZxdW90O0dlbmVyYWwgU2V0dXAmcXVvdDsgc3VibWVudSkuICBEb2N1bWVudGF0aW9uIGZvciBrZXJuZWwKLSAgYnVpbGRpbmcgaXMgYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzIEZBUTsgeW91IHNob3VsZCBjb25zdWx0IHRoZSA8QQotICBIUkVGPSJodHRwOi8vd3d3LmxpbnV4aHEuY29tL0hPV1RPL0tlcm5lbC1IT1dUTy5odG1sIiA+S2VybmVsCi0gIEhPV1RPPC9BPiwgb3IgdGhlIGRvY3VtZW50YXRpb24gcHJvdmlkZWQgd2l0aCB5b3VyIGRpc3RyaWJ1dGlvbiwgb3IKLSAgYSA8QSBIUkVGPSJodHRwOi8vd3d3LmxpbnV4aHEuY29tL0hPV1RPL01FVEEtRkFRLmh0bWwiID5MaW51eAotICBuZXdzZ3JvdXAvbWFpbGluZyBsaXN0PC9BPi4gIEFzIGEgbGFzdC1yZXNvcnQgd29ya2Fyb3VuZCwgeW91IGNhbgotICBjb21tZW50IG91dCB0aGUgPENPREU+I2RlZmluZSZuYnNwO1VTRV9TSE1HRVRfU0NPUkVCT0FSRDwvQ09ERT4KLSAgZGVmaW5pdGlvbiBpbiB0aGUgPFNBTVA+TElOVVg8L1NBTVA+IHNlY3Rpb24gb2YKLSAgPFNBTVA+c3JjL2NvbmYuaDwvU0FNUD4gYW5kIHJlYnVpbGQgdGhlIHNlcnZlciAocHJpb3IgdG8gMS4zYjQsCi0gIHNpbXBseSByZW1vdmluZyA8Q09ERT4jZGVmaW5lJm5ic3A7SEFWRV9TSE1HRVQ8L0NPREU+IHdvdWxkIGhhdmUKLSAgc3VmZmljZWQpLiAgVGhpcyB3aWxsIHByb2R1Y2UgYSBzZXJ2ZXIgd2hpY2ggaXMgc2xvd2VyIGFuZCBsZXNzCi0gIHJlbGlhYmxlLgotICA8L1A+Ci0gIDxIUj4KLSA8L0xJPgotCi0gPExJPjxBIE5BTUU9Im5mc2xvY2tpbmciPgotICAgICAgPFNUUk9ORz5TZXJ2ZXIgaGFuZ3MsIG9yIGZhaWxzIHRvIHN0YXJ0LCBhbmQvb3IgZXJyb3IgbG9nCi0gICAgICBmaWxscyB3aXRoICZxdW90OzxTQU1QPmZjbnRsOiBGX1NFVExLVzogTm8gcmVjb3JkIGxvY2tzCi0gICAgICBhdmFpbGFibGU8L1NBTVA+JnF1b3Q7IG9yIHNpbWlsYXIgbWVzc2FnZXM8L1NUUk9ORz4KLSAgICAgPC9BPgotCi0gIDxQPgotICBUaGVzZSBhcmUgc3ltcHRvbXMgb2YgYSBmaW5lIGxvY2tpbmcgcHJvYmxlbSwgd2hpY2ggdXN1YWxseSBtZWFucyB0aGF0Ci0gIHRoZSBzZXJ2ZXIgaXMgdHJ5aW5nIHRvIHVzZSBhIHN5bmNocm9uaXphdGlvbiBmaWxlIG9uIGFuIE5GUyBmaWxlc3lzdGVtLgotICA8L1A+Ci0gIDxQPgotICBCZWNhdXNlIG9mIGl0cyBwYXJhbGxlbC1vcGVyYXRpb24gbW9kZWwsIHRoZSBBcGFjaGUgV2ViIHNlcnZlciBuZWVkcyB0bwotICBwcm92aWRlIHNvbWUgZm9ybSBvZiBzeW5jaHJvbml6YXRpb24gd2hlbiBhY2Nlc3NpbmcgY2VydGFpbiByZXNvdXJjZXMuCi0gIE9uZSBvZiB0aGVzZSBzeW5jaHJvbml6YXRpb24gbWV0aG9kcyBpbnZvbHZlcyB0YWtpbmcgb3V0IGxvY2tzIG9uIGEgZmlsZSwKLSAgd2hpY2ggbWVhbnMgdGhhdCB0aGUgZmlsZXN5c3RlbSB3aGVyZW9uIHRoZSBsb2NrZmlsZSByZXNpZGVzIG11c3Qgc3VwcG9ydAotICBsb2NraW5nLiAgSW4gbWFueSBjYXNlcyB0aGlzIG1lYW5zIGl0IDxFTT5jYW4ndDwvRU0+IGJlIGtlcHQgb24gYW4KLSAgTkZTLW1vdW50ZWQgZmlsZXN5c3RlbS4KLSAgPC9QPgotICA8UD4KLSAgVG8gY2F1c2UgdGhlIFdlYiBzZXJ2ZXIgdG8gd29yayBhcm91bmQgdGhlIE5GUyBsb2NraW5nIGxpbWl0YXRpb25zLCBpbmNsdWRlCi0gIGEgbGluZSBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgaW4geW91ciBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlczoKLSAgPC9QPgotICA8REw+Ci0gICA8REQ+PENPREU+TG9ja0ZpbGUgL3Zhci9ydW4vYXBhY2hlLWxvY2s8L0NPREU+Ci0gICA8L0REPgotICA8L0RMPgotICA8UD4KLSAgVGhlIGRpcmVjdG9yeSBzaG91bGQgbm90IGJlIGdlbmVyYWxseSB3cml0YWJsZSAoPEVNPmUuZy48L0VNPiwgZG9uJ3QgdXNlCi0gIDxTQU1QPi92YXIvdG1wPC9TQU1QPikuCi0gIFNlZSB0aGUgPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNsb2NrZmlsZSI+PFNBTVA+TG9ja0ZpbGU8L1NBTVA+PC9BPgotICBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICA8L1A+Ci0gIDxIUj4KLSA8L0xJPgotCi0gPExJPjxBIE5BTUU9ImFpeGNjYnVnIj48U1RST05HPldoeSBhbSBJIGdldHRpbmcgIjxTQU1QPkV4cGVjdGVkCi0gICAgICAgJmx0L0RpcmVjdG9yeSZndDsgYnV0IHNhdyAmbHQ7L0RpcmVjdG9yeSZndDs8L1NBTVA+IiB3aGVuCi0gICAgICAgSSB0cnkgdG8gc3RhcnQgQXBhY2hlPzwvU1RST05HPjwvQT4KLSAgIDxQPgotICAgVGhpcyBpcyBhIGtub3duIHByb2JsZW0gd2l0aCBjZXJ0YWluIHZlcnNpb25zIG9mIHRoZSBBSVggQyBjb21waWxlci4KLSAgIElCTSBhcmUgd29ya2luZyBvbiBhIHNvbHV0aW9uLCBhbmQgdGhlIGlzc3VlIGlzIGJlaW5nIHRyYWNrZWQgYnkKLSAgIDxBIEhSRUY9Imh0dHA6Ly9idWdzLmFwYWNoZS5vcmcvaW5kZXgvZnVsbC8yMzEyIj5wcm9ibGVtIHJlcG9ydCAjMjMxMjwvQT4uCi0gICA8L1A+Ci0gICA8SFI+Ci0gPC9MST4KLQotIDxMST48QSBOQU1FPSJyZWRoYXQiPgotICAgICAgPFNUUk9ORz5JJ20gdXNpbmcgUmVkSGF0IExpbnV4IGFuZCBJIGhhdmUgcHJvYmxlbXMgd2l0aCBodHRwZAotICAgICAgZHlpbmcgcmFuZG9tbHkgb3Igbm90IHJlc3RhcnRpbmcgcHJvcGVybHk8L1NUUk9ORz4KLSAgICAgPC9BPgotCi0gIDxQPgotICBSZWRIYXQgTGludXggdmVyc2lvbnMgNC54IChhbmQgcG9zc2libHkgZWFybGllcikgUlBNcyBjb250YWluCi0gIHZhcmlvdXMgbmFzdHkgc2NyaXB0cyB3aGljaCBkbyBub3Qgc3RvcCBvciByZXN0YXJ0IEFwYWNoZSBwcm9wZXJseS4KLSAgVGhlc2UgY2FuIGFmZmVjdCB5b3UgZXZlbiBpZiB5b3UncmUgbm90IHJ1bm5pbmcgdGhlIFJlZEhhdCBzdXBwbGllZAotICBSUE1zLgotICA8L1A+Ci0gIDxQPgotICBJZiB5b3UncmUgdXNpbmcgdGhlIGRlZmF1bHQgaW5zdGFsbCB0aGVuIHlvdSdyZSBwcm9iYWJseSBydW5uaW5nCi0gIEFwYWNoZSAxLjEuMywgd2hpY2ggaXMgb3V0ZGF0ZWQuICBGcm9tIFJlZEhhdCdzIGZ0cCBzaXRlIHlvdSBjYW4KLSAgcGljayB1cCBhIG1vcmUgcmVjZW50IFJQTSBmb3IgQXBhY2hlIDEuMi54LiAgVGhpcyB3aWxsIHNvbHZlIG9uZSBvZgotICB0aGUgcHJvYmxlbXMuCi0gIDwvUD4KLSAgPFA+Ci0gIElmIHlvdSdyZSB1c2luZyBhIGN1c3RvbSBidWlsdCBBcGFjaGUgcmF0aGVyIHRoYW4gdGhlIFJlZEhhdCBSUE1zCi0gIHRoZW4geW91IHNob3VsZCA8Q09ERT5ycG0gLWUgYXBhY2hlPC9DT0RFPi4gIEluIHBhcnRpY3VsYXIgeW91IHdhbnQKLSAgdGhlIG1pbGRseSBicm9rZW4gPENPREU+L2V0Yy9sb2dyb3RhdGUuZC9hcGFjaGU8L0NPREU+IHNjcmlwdCB0byBiZQotICByZW1vdmVkLCBhbmQgeW91IHdhbnQgdGhlIGJyb2tlbiA8Q09ERT4vZXRjL3JjLmQvaW5pdC5kL2h0dHBkPC9DT0RFPgotICAob3IgPENPREU+aHR0cGQuaW5pdDwvQ09ERT4pIHNjcmlwdCB0byBiZSByZW1vdmVkLiAgVGhlIGxhdHRlciBpcwotICBhY3R1YWxseSBmaXhlZCBieSB0aGUgYXBhY2hlLTEuMi41IFJQTXMgYnV0IGlmIHlvdSdyZSBidWlsZGluZyB5b3VyCi0gIG93biBBcGFjaGUgdGhlbiB5b3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0aGUgUmVkSGF0IGZpbGVzLgotICA8L1A+Ci0gIDxQPgotICBXZSBjYW4ndCBzdHJlc3MgZW5vdWdoIGhvdyBpbXBvcnRhbnQgaXQgaXMgZm9yIGZvbGtzLCA8RU0+ZXNwZWNpYWxseQotICB2ZW5kb3JzPC9FTT4gdG8gZm9sbG93IHRoZSA8QSBIUkVGPSIuLi9zdG9wcGluZy5odG1sIj5zdG9wcGluZyBBcGFjaGUKLSAgZGlyZWN0aW9uczwvQT4gZ2l2ZW4gaW4gb3VyIGRvY3VtZW50YXRpb24uICBJbiBSZWRIYXQncyBkZWZlbnNlLAotICB0aGUgYnJva2VuIHNjcmlwdHMgd2VyZSBuZWNlc3Nhcnkgd2l0aCBBcGFjaGUgMS4xLnggYmVjYXVzZSB0aGUKLSAgTGludXggc3VwcG9ydCBpbiAxLjEueCB3YXMgdmVyeSBwb29yLCBhbmQgdGhlcmUgd2VyZSB2YXJpb3VzIHJhY2UKLSAgY29uZGl0aW9ucyBvbiBhbGwgcGxhdGZvcm1zLiAgTm9uZSBvZiB0aGlzIHNob3VsZCBiZSBuZWNlc3Nhcnkgd2l0aAotICBBcGFjaGUgMS4yIGFuZCBsYXRlci4KLSAgPC9QPgotICA8SFI+Ci0gPC9MST4KLQotIDxMST48QSBOQU1FPSJzdG9wcGluZyI+Ci0gICAgICA8U1RST05HPkkgdXBncmFkZWQgZnJvbSBhbiBBcGFjaGUgdmVyc2lvbiBlYXJsaWVyCi0gICAgICB0aGFuIDEuMi4wIGFuZCBzdWRkZW5seSBJIGhhdmUgcHJvYmxlbXMgd2l0aCBBcGFjaGUgZHlpbmcgcmFuZG9tbHkKLSAgICAgIG9yIG5vdCByZXN0YXJ0aW5nIHByb3Blcmx5PC9TVFJPTkc+Ci0gICAgIDwvQT4KLQotICA8UD4KLSAgWW91IHNob3VsZCByZWFkIDxBIEhSRUY9IiNyZWRoYXQiPnRoZSBwcmV2aW91cyBub3RlPC9BPiBhYm91dAotICBwcm9ibGVtcyB3aXRoIFJlZEhhdCBpbnN0YWxsYXRpb25zLiAgSXQgaXMgZW50aXJlbHkgbGlrZWx5IHRoYXQgeW91cgotICBpbnN0YWxsYXRpb24gaGFzIHN0YXJ0L3N0b3AvcmVzdGFydCBzY3JpcHRzIHdoaWNoIHdlcmUgYnVpbHQgZm9yCi0gIGFuIGVhcmxpZXIgdmVyc2lvbiBvZiBBcGFjaGUuICBWZXJzaW9ucyBlYXJsaWVyIHRoYW4gMS4yLjAgaGFkCi0gIHZhcmlvdXMgcmFjZSBjb25kaXRpb25zIHRoYXQgbWFkZSBpdCBuZWNlc3NhcnkgdG8gdXNlCi0gIDxDT0RFPmtpbGwgLTk8L0NPREU+IGF0IHRpbWVzIHRvIHRha2Ugb3V0IGFsbCB0aGUgaHR0cGQgc2VydmVycy4KLSAgQnV0IHRoYXQgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgYW55IGxvbmdlci4gIFlvdSBzaG91bGQgZm9sbG93Ci0gIHRoZSA8QSBIUkVGPSIuLi9zdG9wcGluZy5odG1sIj5kaXJlY3Rpb25zIG9uIGhvdyB0byBzdG9wCi0gIGFuZCByZXN0YXJ0IEFwYWNoZTwvQT4uCi0gIDwvUD4KLSAgPFA+QXMgb2YgQXBhY2hlIDEuMyB0aGVyZSBpcyBhIHNjcmlwdAotICA8Q09ERT5zcmMvc3VwcG9ydC9hcGFjaGVjdGw8L0NPREU+IHdoaWNoLCBhZnRlciBhIGJpdCBvZgotICBjdXN0b21pemF0aW9uLCBpcyBzdWl0YWJsZSBmb3Igc3RhcnRpbmcsIHN0b3BwaW5nLCBhbmQgcmVzdGFydGluZwotICB5b3VyIHNlcnZlci4KLSAgPC9QPgotICA8SFI+Ci0gPC9MST4KLQotIDxMST48QSBuYW1lPSJzZXRzZXJ2ZXJuYW1lIj4KLSAgICAgICA8Yj5XaGVuIEkgdHJ5IHRvIHN0YXJ0IEFwYWNoZSBmcm9tIGEgRE9TCi0gICAgICAgd2luZG93LCBJIGdldCBhIG1lc3NhZ2UgbGlrZSAiPHNhbXA+Q2Fubm90IGRldGVybWluZSBob3N0IG5hbWUuCi0gICAgICAgVXNlIFNlcnZlck5hbWUgZGlyZWN0aXZlIHRvIHNldCBpdCBtYW51YWxseS48L3NhbXA+IiAgV2hhdCBkb2VzCi0gICAgICAgdGhpcyBtZWFuPzwvYj48L0E+Ci0KLSAgPHA+Ci0gIEl0IG1lYW5zIHdoYXQgaXQgc2F5czsgdGhlIEFwYWNoZSBzb2Z0d2FyZSBjYW4ndCBkZXRlcm1pbmUgdGhlCi0gIGhvc3RuYW1lIG9mIHlvdXIgc3lzdGVtLiAgRWRpdCB5b3VyIDxzYW1wPmNvbmZcaHR0cGQuY29uZjwvc2FtcD4KLSAgZmlsZSwgbG9vayBmb3IgdGhlIHN0cmluZyAiU2VydmVyTmFtZSIsIGFuZCBtYWtlIHN1cmUgdGhlcmUncyBhbgotICB1bmNvbW1lbnRlZCBkaXJlY3RpdmUgc3VjaCBhcwotICA8L3A+Ci0gIDxkbD4KLSAgIDxkZD48Y29kZT5TZXJ2ZXJOYW1lIGxvY2FsaG9zdDwvY29kZT48L2RkPgotICA8L2RsPgotICA8cD4KLSAgb3IKLSAgPC9wPgotICA8ZGw+Ci0gICA8ZGQ+PGNvZGU+U2VydmVyTmFtZSB3d3cuZm9vLmNvbTwvY29kZT48L2RkPgotICA8L2RsPgotICA8cD4KLSAgaW4gdGhlIGZpbGUuICBDb3JyZWN0IGl0IGlmIHRoZXJlIG9uZSB0aGVyZSB3aXRoIHdyb25nIGluZm9ybWF0aW9uLCBvcgotICBhZGQgb25lIGlmIHlvdSBkb24ndCBhbHJlYWR5IGhhdmUgb25lLgotICA8L3A+Ci0gIDxwPgotICBBbHNvLCBtYWtlIHN1cmUgdGhhdCB5b3VyIFdpbmRvd3Mgc3lzdGVtIGhhcyBETlMgZW5hYmxlZC4gIFNlZSB0aGUgVENQL0lQCi0gIHNldHVwIGNvbXBvbmVudCBvZiB0aGUgTmV0d29ya2luZyBvciBJbnRlcm5ldCBPcHRpb25zIGNvbnRyb2wgcGFuZWwuCi0gIDwvcD4KLSAgPHA+Ci0gIEFmdGVyIHZlcmlmeWluZyB0aGF0IEROUyBpcyBlbmFibGVkIGFuZCB0aGF0IHlvdSBoYXZlIGEgdmFsaWQgaG9zdG5hbWUKLSAgaW4geW91ciA8c2FtcD5TZXJ2ZXJOYW1lPC9zYW1wPiBkaXJlY3RpdmUsIHRyeSB0byBzdGFydCB0aGUgc2VydmVyCi0gIGFnYWluLgotICA8L3A+Ci0gIDxocj4KLSA8L0xJPgotIDxMST48QSBuYW1lPSJ3czJfMzJkbGwiPgotICAgICAgIDxiPldoZW4gSSB0cnkgdG8gc3RhcnQgQXBhY2hlIGZvciBXaW5kb3dzLCBJIGdldCBhIG1lc3NhZ2UKLQlsaWtlICI8c2FtcD5VbmFibGUgVG8gTG9jYXRlIFdTMl8zMi5ETEwuLi48L3NhbXA+Ii4gV2hhdCBzaG91bGQgSSBkbz88L2I+PC9BPgotICA8cD4KLSAgU2hvcnQgYW5zd2VyOiBZb3UgbmVlZCB0byBpbnN0YWxsIFdpbnNvY2sgMiwgYXZhaWxhYmxlIGZyb20KLSAgPEEgSFJFRj0iaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3dpbmRvd3M5NS9kb3dubG9hZHMvIj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vd2luZG93czk1L2Rvd25sb2Fkcy88L0E+Ci0gIDwvcD4KLSAgPHA+Ci0gIERldGFpbGVkIGFuc3dlcjogUHJpb3IgdG8gdmVyc2lvbiAxLjMuOSwgQXBhY2hlIGZvciBXaW5kb3dzIHVzZWQgV2luc29jayAxLjEuIEJlZ2lubmluZyB3aXRoCi0gIHZlcnNpb24gMS4zLjksIEFwYWNoZSBiZWdhbiB1c2luZyBXaW5zb2NrIDIgZmVhdHVyZXMgKHNwZWNpZmljYWxseSwgV1NBRHVwbGljYXRlU29ja2V0KCkpLgotICBXUzJfMzIuRExMIGltcGxlbWVudHMgdGhlIFdpbnNvY2sgMiBBUEkuIFdpbnNvY2sgMiBzaGlwcyB3aXRoIFdpbmRvd3MgTlQgNC4wIGFuZCBXaW5kb3dzIDk4LgotICBTb21lIG9mIHRoZSBlYXJsaWVyIHJlbGVhc2VzIG9mIFdpbmRvd3MgOTUgZGlkIG5vdCBpbmNsdWRlIFdpbnNvY2sgMi4KLSAgPC9wPgotICA8aHI+Ci0gPC9MST4KLQotPC9PTD4KLTwhLS0jZW5kaWYgLS0+Ci08IS0tI2lmIGV4cHI9IiRTVEFOREFMT05FIiAtLT4KLSAgPCEtLSBEb24ndCBmb3JnZXQgdG8gYWRkIEhSIHRhZ3MgYXQgdGhlIGVuZCBvZiBlYWNoIGxpc3QgaXRlbS4uIC0tPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotPCEtLSNlbmRpZiAtLT4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21pc2MvRkFRLUUuaHRtbCBiL2RvY3MvbWFudWFsL21pc2MvRkFRLUUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBlZjU1Ni4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9taXNjL0ZBUS1FLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OTggKzAsMCBAQAotPCEtLSNpZiBleHByPSIkRkFRTUFTVEVSIiAtLT4KLSA8IS0tI3NldCB2YXI9IlNUQU5EQUxPTkUiIHZhbHVlPSIiIC0tPgotIDwhLS0jc2V0IHZhcj0iSU5DTFVERUQiIHZhbHVlPSJZRVMiIC0tPgotIDwhLS0jaWYgZXhwcj0iJFFVRVJZX1NUUklORyA9IFRPQyIgLS0+Ci0gIDwhLS0jc2V0IHZhcj0iVE9DIiB2YWx1ZT0iWUVTIiAtLT4KLSAgPCEtLSNzZXQgdmFyPSJDT05URU5UIiB2YWx1ZT0iIiAtLT4KLSA8IS0tI2Vsc2UgLS0+Ci0gIDwhLS0jc2V0IHZhcj0iVE9DIiB2YWx1ZT0iIiAtLT4KLSAgPCEtLSNzZXQgdmFyPSJDT05URU5UIiB2YWx1ZT0iWUVTIiAtLT4KLSA8IS0tI2VuZGlmIC0tPgotPCEtLSNlbHNlIC0tPgotIDwhLS0jc2V0IHZhcj0iU1RBTkRBTE9ORSIgdmFsdWU9IllFUyIgLS0+Ci0gPCEtLSNzZXQgdmFyPSJJTkNMVURFRCIgdmFsdWU9IiIgLS0+Ci0gPCEtLSNzZXQgdmFyPSJUT0MiIHZhbHVlPSIiIC0tPgotIDwhLS0jc2V0IHZhcj0iQ09OVEVOVCIgdmFsdWU9IiIgLS0+Ci08IS0tI2VuZGlmIC0tPgotPCEtLSNpZiBleHByPSIkU1RBTkRBTE9ORSIgLS0+Ci08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLSA8SEVBRD4KLSAgPFRJVExFPkFwYWNoZSBTZXJ2ZXIgRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L1RJVExFPgotIDwvSEVBRD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLSA8Qk9EWQotICBCR0NPTE9SPSIjRkZGRkZGIgotICBURVhUPSIjMDAwMDAwIgotICBMSU5LPSIjMDAwMEZGIgotICBWTElOSz0iIzAwMDA4MCIKLSAgQUxJTks9IiNGRjAwMDAiCi0gPgotICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotICA8SDEgQUxJR049IkNFTlRFUiI+QXBhY2hlIFNlcnZlciBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvSDE+Ci0gIDxQPgotICAkUmV2aXNpb246IDEuNCAkICgkRGF0ZTogMTk5OS8wNy8wNCAxNjozMzowMCAkKQotICA8L1A+Ci0gIDxQPgotICBUaGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBGQVEgaXMgYWx3YXlzIGF2YWlsYWJsZSBmcm9tIHRoZSBtYWluCi0gIEFwYWNoZSB3ZWIgc2l0ZSwgYXQKLSAgJmx0OzxBCi0gICAgICAgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvbWlzYy9GQVEuaHRtbCIKLSAgICAgICBSRUw9IkhlbHAiCi0gICAgICA+PFNBTVA+aHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvbWlzYy9GQVEuaHRtbDwvU0FNUD48L0E+Jmd0Oy4KLSAgPC9QPgotPCEtLSBOb3RlcyBhYm91dCBjaGFuZ2VzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gIC0gSWYgYWRkaW5nIGEgcmVsYXRpdmUgbGluayB0byBhbm90aGVyIHBhcnQgb2YgdGhlICAgICAgICAgICAgLS0+Ci08IS0tICAgIGRvY3VtZW50YXRpb24sICpkbyogaW5jbHVkZSB0aGUgIi5odG1sIiBwb3J0aW9uLiAgVGhlcmUncyBhIC0tPgotPCEtLSAgICBnb29kIGNoYW5jZSB0aGF0IHRoZSB1c2VyIHdpbGwgYmUgcmVhZGluZyB0aGUgZG9jdW1lbnRhdGlvbiAtLT4KLTwhLS0gICAgb24gaGlzIG93biBzeXN0ZW0sIHdoaWNoIG1heSBub3QgYmUgY29uZmlndXJlZCBmb3IgICAgICAgICAgLS0+Ci08IS0tICAgIG11bHRpdmlld3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgLSBXaGVuIGFkZGluZyBpdGVtcywgbWFrZSBzdXJlIHRoZXkncmUgcHV0IGluIHRoZSByaWdodCBwbGFjZSAtLT4KLTwhLS0gICAgLSB2ZXJpZnkgdGhhdCB0aGUgbnVtYmVyaW5nIG1hdGNoZXMgdXAuICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAtICpEb24ndCogdXNlIDxQUkU+PC9QUkU+IGJsb2NrcyAtIHRoZXkgZG9uJ3QgYXBwZWFyICAgICAgICAgIC0tPgotPCEtLSAgICBjb3JyZWN0bHkgaW4gYSByZWxpYWJsZSB3YXkgd2hlbiB0aGlzIGlzIGNvbnZlcnRlZCB0byB0ZXh0ICAtLT4KLTwhLS0gICAgd2l0aCBMeW54LiAgVXNlIDxETD48REQ+PENPREU+eHh4PEJSPnh4PC9DT0RFPjwvREQ+PC9ETD4gICAgLS0+Ci08IS0tICAgIGJsb2NrcyBpbnNpZGUgYSA8UD48L1A+IGluc3RlYWQuICBUaGlzIGlzIG5lY2Vzc2FyeSB0byBnZXQgIC0tPgotPCEtLSAgICB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW5kZW50aW5nIHJpZ2h0LiAgICAgICAgICAgICAgICAtLT4KLTwhLS0gIC0gRG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGUgYW4gSFIgdGFnIGFmdGVyIHRoZSBsYXN0IC9QIHRhZyAgICAgLS0+Ci08IS0tICAgIGJ1dCBiZWZvcmUgdGhlIC9MSSBpbiBhbiBpdGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8UD4KLSAgSWYgeW91IGFyZSByZWFkaW5nIGEgdGV4dC1vbmx5IHZlcnNpb24gb2YgdGhpcyBGQVEsIHlvdSBtYXkgZmluZCBudW1iZXJzCi0gIGVuY2xvc2VkIGluIGJyYWNrZXRzIChzdWNoIGFzICZxdW90O1sxMl0mcXVvdDspLiAgVGhlc2UgcmVmZXIgdG8gdGhlIGxpc3Qgb2YKLSAgcmVmZXJlbmNlIFVSTHMgdG8gYmUgZm91bmQgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuICBUaGVzZSByZWZlcmVuY2VzCi0gIGRvIG5vdCBhcHBlYXIsIGFuZCBhcmUgbm90IG5lZWRlZCwgZm9yIHRoZSBoeXBlcnRleHQgdmVyc2lvbi4KLSAgPC9QPgotICA8SDI+VGhlIFF1ZXN0aW9uczwvSDI+Ci08T0wgVFlQRT0iQSI+Ci08IS0tI2VuZGlmIC0tPgotPCEtLSNpZiBleHByPSIkVE9DIHx8ICRTVEFOREFMT05FIiAtLT4KLSA8TEkgVkFMVUU9IjUiPjxTVFJPTkc+Q29uZmlndXJhdGlvbiBRdWVzdGlvbnM8L1NUUk9ORz4KLSAgPE9MPgotICAgPExJPjxBIEhSRUY9IiNmZGxpbSI+V2h5IGNhbid0IEkgcnVuIG1vcmUgdGhhbiAmbHQ7PEVNPm48L0VNPiZndDsKLSAgICAgICAgdmlydHVhbCBob3N0cz88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNmcmVlYnNkLXNldHNpemUiPkNhbiBJIGluY3JlYXNlIDxTQU1QPkZEX1NFVFNJWkU8L1NBTVA+Ci0gICAgICAgIG9uIEZyZWVCU0Q/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjZXJyb3Jkb2M0MDEiPldoeSBkb2Vzbid0IG15IDxDT0RFPkVycm9yRG9jdW1lbnQKLSAgICAgICAgNDAxPC9DT0RFPiB3b3JrPzwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI2Nvb2tpZXMxIj5XaHkgZG9lcyBBcGFjaGUgc2VuZCBhIGNvb2tpZSBvbiBldmVyeSByZXNwb25zZT88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNjb29raWVzMiI+V2h5IGRvbid0IG15IGNvb2tpZXMgd29yaywgSSBldmVuIGNvbXBpbGVkIGluCi0gICAgICAgIDxTQU1QPm1vZF9jb29raWVzPC9TQU1QPj88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNqZGsxLWFuZC1odHRwMS4xIj5XaHkgZG8gbXkgSmF2YSBhcHBbbGV0XXMgZ2l2ZSBtZSBwbGFpbiB0ZXh0Ci0gICAgICAgIHdoZW4gSSByZXF1ZXN0IGFuIFVSTCBmcm9tIGFuIEFwYWNoZSBzZXJ2ZXI/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjbWlkaSI+SG93IGRvIEkgZ2V0IEFwYWNoZSB0byBzZW5kIGEgTUlESSBmaWxlIHNvIHRoZQotICAgICAgICBicm93c2VyIGNhbiBwbGF5IGl0PzwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI2FkZGxvZyI+SG93IGRvIEkgYWRkIGJyb3dzZXJzIGFuZCByZWZlcnJlcnMgdG8gbXkgbG9ncz88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNzZXQtc2VydmVybmFtZSI+V2h5IGRvZXMgYWNjZXNzaW5nIGRpcmVjdG9yaWVzIG9ubHkgd29yawotICAgICAgICB3aGVuIEkgaW5jbHVkZSB0aGUgdHJhaWxpbmcgJnF1b3Q7LyZxdW90OwotICAgICAgICAoPEVNPmUuZy48L0VNPiwmbmJzcDs8U0FNUD5odHRwOi8vZm9vLmRvbWFpbi5jb20vfnVzZXIvPC9TQU1QPikgYnV0Ci0gICAgICAgIG5vdCB3aGVuIEkgb21pdCBpdAotICAgICAgICAoPEVNPmUuZy48L0VNPiwmbmJzcDs8U0FNUD5odHRwOi8vZm9vLmRvbWFpbi5jb20vfnVzZXI8L1NBTVA+KT88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNuby1pbmZvLWRpcmVjdGl2ZXMiPldoeSBkb2Vzbid0IG1vZF9pbmZvIGxpc3QgYW55Ci0gICAgICAgIGRpcmVjdGl2ZXM/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjbmFtZXZob3N0Ij5JIHVwZ3JhZGVkIHRvIEFwYWNoZSAxLjMgYW5kIG5vdyBteQotICAgICAgICB2aXJ0dWFsIGhvc3RzIGRvbid0IHdvcmshPC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjcmVkaGF0LWh0bSI+SSdtIHVzaW5nIFJlZEhhdCBMaW51eCBhbmQgbXkgLmh0bSBmaWxlcyBhcmUKLSAgICAgICAgc2hvd2luZyB1cCBhcyBIVE1MIHNvdXJjZSByYXRoZXIgdGhhbiBiZWluZyBmb3JtYXR0ZWQhPC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjaHRhY2Nlc3Mtd29yayI+TXkgPENPREU+Lmh0YWNjZXNzPC9DT0RFPiBmaWxlcyBhcmUgYmVpbmcKLQlpZ25vcmVkLjwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI2ZvcmJpZGRlbiI+V2h5IGRvIEkgZ2V0IGEgCi0gICAgICAgICZxdW90OzxTQU1QPkZvcmJpZGRlbjwvU0FNUD4mcXVvdDsgbWVzc2FnZSB3aGVuZXZlciBJIHRyeSB0byAKLSAgICAgICAgYWNjZXNzIGEgcGFydGljdWxhciBkaXJlY3Rvcnk/PC9BPgotICA8L09MPgotIDwvTEk+Ci08IS0tI2VuZGlmIC0tPgotPCEtLSNpZiBleHByPSIkU1RBTkRBTE9ORSIgLS0+Ci08L09MPgotCi08SFI+Ci0KLSAgPEgyPlRoZSBBbnN3ZXJzPC9IMj4KLTwhLS0jZW5kaWYgLS0+Ci08IS0tI2lmIGV4cHI9IiEgJFRPQyIgLS0+Ci0KLSAgPEgzPkUuIENvbmZpZ3VyYXRpb24gUXVlc3Rpb25zPC9IMz4KLTxPTD4KLQotIDxMST48QSBOQU1FPSJmZGxpbSI+Ci0gICAgICA8U1RST05HPldoeSBjYW4ndCBJIHJ1biBtb3JlIHRoYW4gJmx0OzxFTT5uPC9FTT4mZ3Q7Ci0gICAgICB2aXJ0dWFsIGhvc3RzPzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBZb3UgYXJlIHByb2JhYmx5IHJ1bm5pbmcgaW50byByZXNvdXJjZSBsaW1pdGF0aW9ucyBpbiB5b3VyCi0gIG9wZXJhdGluZyBzeXN0ZW0uICBUaGUgbW9zdCBjb21tb24gbGltaXRhdGlvbiBpcyB0aGUKLSAgPEVNPnBlcjwvRU0+LXByb2Nlc3MgbGltaXQgb24gPFNUUk9ORz5maWxlIGRlc2NyaXB0b3JzPC9TVFJPTkc+LAotICB3aGljaCBpcyBhbG1vc3QgYWx3YXlzIHRoZSBjYXVzZSBvZiBwcm9ibGVtcyBzZWVuIHdoZW4gYWRkaW5nCi0gIHZpcnR1YWwgaG9zdHMuICBBcGFjaGUgb2Z0ZW4gZG9lcyBub3QgZ2l2ZSBhbiBpbnR1aXRpdmUgZXJyb3IKLSAgbWVzc2FnZSBiZWNhdXNlIGl0IGlzIG5vcm1hbGx5IHNvbWUgbGlicmFyeSByb3V0aW5lIChzdWNoIGFzCi0gIDxDT0RFPmdldGhvc3RieW5hbWUoKTwvQ09ERT4pIHdoaWNoIG5lZWRzIGZpbGUgZGVzY3JpcHRvcnMgYW5kCi0gIGRvZXNuJ3QgY29tcGxhaW4gaW50ZWxsaWdpYmx5IHdoZW4gaXQgY2FuJ3QgZ2V0IHRoZW0uCi0gIDwvUD4KLSAgPFA+Ci0gIEVhY2ggbG9nIGZpbGUgcmVxdWlyZXMgYSBmaWxlIGRlc2NyaXB0b3IsIHdoaWNoIG1lYW5zIHRoYXQgaWYgeW91IGFyZQotICB1c2luZyBzZXBhcmF0ZSBhY2Nlc3MgYW5kIGVycm9yIGxvZ3MgZm9yIGVhY2ggdmlydHVhbCBob3N0LCBlYWNoCi0gIHZpcnR1YWwgaG9zdCBuZWVkcyB0d28gZmlsZSBkZXNjcmlwdG9ycy4gIEVhY2gKLSAgPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNsaXN0ZW4iPjxTQU1QPkxpc3RlbjwvU0FNUD48L0E+Ci0gIGRpcmVjdGl2ZSBhbHNvIG5lZWRzIGEgZmlsZSBkZXNjcmlwdG9yLgotICA8L1A+Ci0gIDxQPgotICBUeXBpY2FsIHZhbHVlcyBmb3IgJmx0OzxFTT5uPC9FTT4mZ3Q7IHRoYXQgd2UndmUgc2VlbiBhcmUgaW4KLSAgdGhlIG5laWdoYm9yaG9vZCBvZiAxMjggb3IgMjUwLiAgV2hlbiB0aGUgc2VydmVyIGJ1bXBzIGludG8gdGhlIGZpbGUKLSAgZGVzY3JpcHRvciBsaW1pdCwgaXQgbWF5IGR1bXAgY29yZSB3aXRoIGEgU0lHU0VHViwgaXQgbWlnaHQganVzdAotICBoYW5nLCBvciBpdCBtYXkgbGltcCBhbG9uZyBhbmQgeW91J2xsIHNlZSAocG9zc2libHkgbWVhbmluZ2Z1bCkgZXJyb3JzCi0gIGluIHRoZSBlcnJvciBsb2cuICBPbmUgY29tbW9uIHByb2JsZW0gdGhhdCBvY2N1cnMgd2hlbiB5b3UgcnVuIGludG8KLSAgYSBmaWxlIGRlc2NyaXB0b3IgbGltaXQgaXMgdGhhdCBDR0kgc2NyaXB0cyBzdG9wIGJlaW5nIGV4ZWN1dGVkCi0gIHByb3Blcmx5LgotICA8L1A+Ci0gIDxQPgotICBBcyB0byB3aGF0IHlvdSBjYW4gZG8gYWJvdXQgdGhpczoKLSAgPC9QPgotICA8T0w+Ci0gICA8TEk+UmVkdWNlIHRoZSBudW1iZXIgb2YKLSAgICA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI2xpc3RlbiI+PFNBTVA+TGlzdGVuPC9TQU1QPjwvQT4KLSAgICBkaXJlY3RpdmVzLiAgSWYgdGhlcmUgYXJlIG5vIG90aGVyIHNlcnZlcnMgcnVubmluZyBvbiB0aGUgbWFjaGluZQotICAgIG9uIHRoZSBzYW1lIHBvcnQgdGhlbiB5b3Ugbm9ybWFsbHkgZG9uJ3QKLSAgICBuZWVkIGFueSBMaXN0ZW4gZGlyZWN0aXZlcyBhdCBhbGwuICBCeSBkZWZhdWx0IEFwYWNoZSBsaXN0ZW5zIHRvCi0gICAgYWxsIGFkZHJlc3NlcyBvbiBwb3J0IDgwLgotICAgPC9MST4KLSAgIDxMST5SZWR1Y2UgdGhlIG51bWJlciBvZiBsb2cgZmlsZXMuICBZb3UgY2FuIHVzZQotICAgIDxBIEhSRUY9Ii4uL21vZC9tb2RfbG9nX2NvbmZpZy5odG1sIj48U0FNUD5tb2RfbG9nX2NvbmZpZzwvU0FNUD48L0E+Ci0gICAgdG8gbG9nIGFsbCByZXF1ZXN0cyB0byBhIHNpbmdsZSBsb2cgZmlsZSB3aGlsZSBpbmNsdWRpbmcgdGhlIG5hbWUKLSAgICBvZiB0aGUgdmlydHVhbCBob3N0IGluIHRoZSBsb2cgZmlsZS4gIFlvdSBjYW4gdGhlbiB3cml0ZSBhCi0gICAgc2NyaXB0IHRvIHNwbGl0IHRoZSBsb2dmaWxlIGludG8gc2VwYXJhdGUgZmlsZXMgbGF0ZXIgaWYKLSAgICBuZWNlc3NhcnkuICBTdWNoIGEgc2NyaXB0IGlzIHByb3ZpZGVkIHdpdGggdGhlIEFwYWNoZSAxLjMgZGlzdHJpYnV0aW9uCi0gICAgaW4gdGhlIDxTQU1QPnNyYy9zdXBwb3J0L3NwbGl0LWxvZ2ZpbGU8L1NBTVA+IGZpbGUuCi0gICA8L0xJPgotICAgPExJPkluY3JlYXNlIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBhdmFpbGFibGUgdG8gdGhlIHNlcnZlcgotICAgIChzZWUgeW91ciBzeXN0ZW0ncyBkb2N1bWVudGF0aW9uIG9uIHRoZSA8Q09ERT5saW1pdDwvQ09ERT4gb3IKLSAgICA8Q09ERT51bGltaXQ8L0NPREU+IGNvbW1hbmRzKS4gIEZvciBzb21lIHN5c3RlbXMsIGluZm9ybWF0aW9uIG9uCi0gICAgaG93IHRvIGRvIHRoaXMgaXMgYXZhaWxhYmxlIGluIHRoZQotICAgIDxBIEhSRUY9InBlcmYuaHRtbCI+cGVyZm9ybWFuY2UgaGludHM8L0E+IHBhZ2UuICBUaGVyZSBpcyBhIHNwZWNpZmljCi0gICAgbm90ZSBmb3IgPEEgSFJFRj0iI2ZyZWVic2Qtc2V0c2l6ZSI+RnJlZUJTRDwvQT4gYmVsb3cuCi0gICAgPFA+Ci0gICAgRm9yIFdpbmRvd3MgOTUsIHRyeSBtb2RpZnlpbmcgeW91ciA8U0FNUD5DOlxDT05GSUcuU1lTPC9TQU1QPiBmaWxlIHRvCi0gICAgaW5jbHVkZSBhIGxpbmUgbGlrZQotICAgIDwvUD4KLSAgICA8REw+Ci0gICAgIDxERD48Q09ERT5GSUxFUz0zMDA8L0NPREU+Ci0gICAgIDwvREQ+Ci0gICAgPC9ETD4KLSAgICA8UD4KLSAgICBSZW1lbWJlciB0aGF0IHlvdSdsbCBuZWVkIHRvIHJlYm9vdCB5b3VyIFdpbmRvd3MgOTUgc3lzdGVtIGluIG9yZGVyCi0gICAgZm9yIHRoZSBuZXcgdmFsdWUgdG8gdGFrZSBlZmZlY3QuCi0gICAgPC9QPgotICAgPC9MST4KLSAgIDxMST4mcXVvdDtEb24ndCBkbyB0aGF0JnF1b3Q7IC0gdHJ5IHRvIHJ1biB3aXRoIGZld2VyIHZpcnR1YWwgaG9zdHMKLSAgIDwvTEk+Ci0gICA8TEk+U3ByZWFkIHlvdXIgb3BlcmF0aW9uIGFjcm9zcyBtdWx0aXBsZSBzZXJ2ZXIgcHJvY2Vzc2VzICh1c2luZwotICAgIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjbGlzdGVuIj48U0FNUD5MaXN0ZW48L1NBTVA+PC9BPgotICAgIGZvciBleGFtcGxlLCBidXQgc2VlIHRoZSBmaXJzdCBwb2ludCkgYW5kL29yIHBvcnRzLgotICAgPC9MST4KLSAgPC9PTD4KLSAgPFA+Ci0gIFNpbmNlIHRoaXMgaXMgYW4gb3BlcmF0aW5nLXN5c3RlbSBsaW1pdGF0aW9uLCB0aGVyZSdzIG5vdCBtdWNoIGVsc2UKLSAgYXZhaWxhYmxlIGluIHRoZSB3YXkgb2Ygc29sdXRpb25zLgotICA8L1A+Ci0gIDxQPgotICBBcyBvZiAxLjIuMSB3ZSBoYXZlIG1hZGUgYXR0ZW1wdHMgdG8gd29yayBhcm91bmQgdmFyaW91cyBsaW1pdGF0aW9ucwotICBpbnZvbHZpbmcgcnVubmluZyB3aXRoIG1hbnkgZGVzY3JpcHRvcnMuCi0gIDxBIEhSRUY9ImRlc2NyaXB0b3JzLmh0bWwiPk1vcmUgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLjwvQT4KLSAgPC9QPgotICA8SFI+Ci0gPC9MST4KLQotIDxMST48QSBOQU1FPSJmcmVlYnNkLXNldHNpemUiPgotICAgICAgPFNUUk9ORz5DYW4gSSBpbmNyZWFzZSA8U0FNUD5GRF9TRVRTSVpFPC9TQU1QPiBvbiBGcmVlQlNEPzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBPbiB2ZXJzaW9ucyBvZiBGcmVlQlNEIGJlZm9yZSAzLjAsIHRoZSA8U0FNUD5GRF9TRVRTSVpFPC9TQU1QPiBkZWZpbmUgCi0gIGRlZmF1bHRzIHRvIDI1Ni4gIFRoaXMgbWVhbnMgdGhhdCB5b3Ugd2lsbCBoYXZlIHRyb3VibGUgdXNlZnVsbHkgdXNpbmcKLSAgbW9yZSB0aGFuIDI1NiBmaWxlIGRlc2NyaXB0b3JzIGluIEFwYWNoZS4gIFRoaXMgY2FuIGJlIGluY3JlYXNlZCwgYnV0Ci0gIGRvaW5nIHNvIGNhbiBiZSB0cmlja3kuCi0gIDwvUD4KLSAgPFA+Ci0gIElmIHlvdSBhcmUgdXNpbmcgYSB2ZXJzaW9uIHByaW9yIHRvIDIuMiwgeW91IG5lZWQgdG8gcmVjb21waWxlIHlvdXIKLSAga2VybmVsIHdpdGggYSBsYXJnZXIgPFNBTVA+RkRfU0VUU0laRTwvU0FNUD4uICBUaGlzIGNhbiBiZSBkb25lIGJ5IGFkZGluZyBhIAotICBsaW5lIHN1Y2ggYXM6Ci0gIDwvUD4KLSAgPERMPgotICAgPEREPjxDT0RFPm9wdGlvbnMgRkRfU0VUU0laRSA8RU0+bm5uPC9FTT48L0NPREU+Ci0gICA8L0REPgotICA8L0RMPgotICA8UD4KLSAgdG8geW91ciBrZXJuZWwgY29uZmlnIGZpbGUuICBTdGFydGluZyBhdCB2ZXJzaW9uIDIuMiwgdGhpcyBpcyBubwotICBsb25nZXIgbmVjZXNzYXJ5LgotICA8L1A+Ci0gIDxQPgotICBJZiB5b3UgYXJlIHVzaW5nIGEgdmVyc2lvbiBvZiAyLjEtc3RhYmxlIGZyb20gYWZ0ZXIgMTk5Ny8wMy8xMCBvcgotICAyLjIgb3IgMy4wLWN1cnJlbnQgZnJvbSBiZWZvcmUgMTk5Ny8wNi8yOCwgdGhlcmUgaXMgYSBsaW1pdCBpbgotICB0aGUgcmVzb2x2ZXIgbGlicmFyeSB0aGF0IHByZXZlbnRzIGl0IGZyb20gdXNpbmcgbW9yZSBmaWxlIGRlc2NyaXB0b3JzCi0gIHRoYW4gd2hhdCA8U0FNUD5GRF9TRVRTSVpFPC9TQU1QPiBpcyBzZXQgdG8gd2hlbiBsaWJjIGlzIGNvbXBpbGVkLiAgVG8KLSAgaW5jcmVhc2UgdGhpcywgeW91IGhhdmUgdG8gcmVjb21waWxlIGxpYmMgd2l0aCBhIGhpZ2hlcgotICA8U0FNUD5GRF9TRVRTSVpFPC9TQU1QPi4KLSAgPC9QPgotICA8UD4KLSAgSW4gRnJlZUJTRCAzLjAsIHRoZSBkZWZhdWx0IDxTQU1QPkZEX1NFVFNJWkU8L1NBTVA+IGhhcyBiZWVuIGluY3JlYXNlZCB0bwotICAxMDI0IGFuZCB0aGUgYWJvdmUgbGltaXRhdGlvbiBpbiB0aGUgcmVzb2x2ZXIgbGlicmFyeQotICBoYXMgYmVlbiByZW1vdmVkLgotICA8L1A+Ci0gIDxQPgotICBBZnRlciB5b3UgZGVhbCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjaGFuZ2VzIGFib3ZlLCB5b3UgY2FuIGluY3JlYXNlIAotICB0aGUgc2V0dGluZyBvZiA8U0FNUD5GRF9TRVRTSVpFPC9TQU1QPiBhdCBBcGFjaGUgY29tcGlsYXRpb24gdGltZSAKLSAgYnkgYWRkaW5nICZxdW90OzxTQU1QPi1ERkRfU0VUU0laRT08RU0+bm5uPC9FTT48L1NBTVA+JnF1b3Q7IHRvIHRoZQotICA8U0FNUD5FWFRSQV9DRkxBR1M8L1NBTVA+IGxpbmUgaW4geW91ciA8U0FNUD5Db25maWd1cmF0aW9uPC9TQU1QPgotICBmaWxlLgotICA8L1A+Ci0gIDxIUj4KLSA8L0xJPgotCi0gPExJPjxBIE5BTUU9ImVycm9yZG9jNDAxIj4KLSAgICAgIDxTVFJPTkc+V2h5IGRvZXNuJ3QgbXkgPENPREU+RXJyb3JEb2N1bWVudCA0MDE8L0NPREU+IHdvcms/PC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+Ci0gIFlvdSBuZWVkIHRvIHVzZSBpdCB3aXRoIGEgVVJMIGluIHRoZSBmb3JtCi0gICZxdW90OzxTQU1QPi9mb28vYmFyPC9TQU1QPiZxdW90OyBhbmQgbm90IG9uZSB3aXRoIGEgbWV0aG9kIGFuZAotICBob3N0bmFtZSBzdWNoIGFzICZxdW90OzxTQU1QPmh0dHA6Ly9ob3N0L2Zvby9iYXI8L1NBTVA+JnF1b3Q7LiAgU2VlIHRoZQotICA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI2Vycm9yZG9jdW1lbnQiPjxTQU1QPkVycm9yRG9jdW1lbnQ8L1NBTVA+PC9BPgotICBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLiAgVGhpcyB3YXMgaW5jb3JyZWN0bHkgZG9jdW1lbnRlZCBpbiB0aGUgcGFzdC4KLSAgPC9QPgotICA8SFI+Ci0gPC9MST4KLQotIDxMST48QSBOQU1FPSJjb29raWVzMSI+Ci0gICAgICA8U1RST05HPldoeSBkb2VzIEFwYWNoZSBzZW5kIGEgY29va2llIG9uIGV2ZXJ5IHJlc3BvbnNlPzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBBcGFjaGUgZG9lcyA8RU0+bm90PC9FTT4gYXV0b21hdGljYWxseSBzZW5kIGEgY29va2llIG9uIGV2ZXJ5Ci0gIHJlc3BvbnNlLCB1bmxlc3MgeW91IGhhdmUgcmUtY29tcGlsZWQgaXQgd2l0aCB0aGUKLSAgPEEgSFJFRj0iLi4vbW9kL21vZF91c2VydHJhY2suaHRtbCI+PFNBTVA+bW9kX3VzZXJ0cmFjazwvU0FNUD48L0E+Ci0gIG1vZHVsZSwgYW5kIHNwZWNpZmljYWxseSBlbmFibGVkIGl0IHdpdGggdGhlCi0gIDxBIEhSRUY9Ii4uL21vZC9tb2RfdXNlcnRyYWNrLmh0bWwjY29va2lldHJhY2tpbmciCi0gID48U0FNUD5Db29raWVUcmFja2luZzwvU0FNUD48L0E+Ci0gIGRpcmVjdGl2ZS4KLSAgVGhpcyBtb2R1bGUgaGFzIGJlZW4gaW4gQXBhY2hlIHNpbmNlIHZlcnNpb24gMS4yLgotICBUaGlzIG1vZHVsZSBtYXkgaGVscCB0cmFjayB1c2VycywgYW5kIHVzZXMgY29va2llcyB0byBkbyB0aGlzLiBJZgotICB5b3UgYXJlIG5vdCB1c2luZyB0aGUgZGF0YSBnZW5lcmF0ZWQgYnkgPFNBTVA+bW9kX3VzZXJ0cmFjazwvU0FNUD4sIGRvCi0gIG5vdCBjb21waWxlIGl0IGludG8gQXBhY2hlLiAKLSAgPC9QPgotICA8SFI+Ci0gPC9MST4KLQotIDxMST48QSBOQU1FPSJjb29raWVzMiI+Ci0gICAgICA8U1RST05HPldoeSBkb24ndCBteSBjb29raWVzIHdvcmssIEkgZXZlbiBjb21waWxlZCBpbgotICAgICAgPFNBTVA+bW9kX2Nvb2tpZXM8L1NBTVA+PwotICAgICAgPC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+Ci0gIEZpcnN0bHksIHlvdSBkbyA8RU0+bm90PC9FTT4gbmVlZCB0byBjb21waWxlIGluCi0gIDxTQU1QPm1vZF9jb29raWVzPC9TQU1QPiBpbiBvcmRlciBmb3IgeW91ciBzY3JpcHRzIHRvIHdvcmsgKHNlZSB0aGUKLSAgPEEgSFJFRj0iI2Nvb2tpZXMxIj5wcmV2aW91cyBxdWVzdGlvbjwvQT4KLSAgZm9yIG1vcmUgYWJvdXQgPFNBTVA+bW9kX2Nvb2tpZXM8L1NBTVA+KS4gQXBhY2hlIHBhc3NlcyBvbiB5b3VyCi0gIDxTQU1QPlNldC1Db29raWU8L1NBTVA+IGhlYWRlciBmaW5lLCB3aXRoIG9yIHdpdGhvdXQgdGhpcyBtb2R1bGUuIElmCi0gIGNvb2tpZXMgZG8gbm90IHdvcmsgaXQgd2lsbCBiZSBiZWNhdXNlIHlvdXIgc2NyaXB0IGRvZXMgbm90IHdvcmsKLSAgcHJvcGVybHkgb3IgeW91ciBicm93c2VyIGRvZXMgbm90IHVzZSBjb29raWVzIG9yIGlzIG5vdCBzZXQtdXAgdG8KLSAgYWNjZXB0IHRoZW0uCi0gIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0iamRrMS1hbmQtaHR0cDEuMSI+Ci0gICAgICA8U1RST05HPldoeSBkbyBteSBKYXZhIGFwcFtsZXRdcyBnaXZlIG1lIHBsYWluIHRleHQgd2hlbiBJIHJlcXVlc3QKLSAgICAgIGFuIFVSTCBmcm9tIGFuIEFwYWNoZSBzZXJ2ZXI/PC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+Ci0gIEFzIG9mIHZlcnNpb24gMS4yLCBBcGFjaGUgaXMgYW4gSFRUUC8xLjEgKEh5cGVyVGV4dCBUcmFuc2ZlciBQcm90b2NvbAotICB2ZXJzaW9uIDEuMSkgc2VydmVyLiAgVGhpcyBmYWN0IGlzIHJlZmxlY3RlZCBpbiB0aGUgcHJvdG9jb2wgdmVyc2lvbgotICB0aGF0J3MgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIGhlYWRlcnMgc2VudCB0byBhIGNsaWVudCB3aGVuCi0gIHByb2Nlc3NpbmcgYSByZXF1ZXN0LiAgVW5mb3J0dW5hdGVseSwgbG93LWxldmVsIFdlYiBhY2Nlc3MgY2xhc3NlcwotICBpbmNsdWRlZCBpbiB0aGUgSmF2YSBEZXZlbG9wbWVudCBLaXQgKEpESykgdmVyc2lvbiAxLjAuMiBleHBlY3QgdG8gc2VlCi0gIHRoZSB2ZXJzaW9uIHN0cmluZyAmcXVvdDtIVFRQLzEuMCZxdW90OyBhbmQgZG8gbm90IGNvcnJlY3RseSBpbnRlcnByZXQKLSAgdGhlICZxdW90O0hUVFAvMS4xJnF1b3Q7IHZhbHVlIEFwYWNoZSBpcyBzZW5kaW5nICh0aGlzIHBhcnQgb2YgdGhlCi0gIHJlc3BvbnNlIGlzIGEgZGVjbGFyYXRpb24gb2Ygd2hhdCB0aGUgc2VydmVyIGNhbiBkbyByYXRoZXIgdGhhbiBhCi0gIGRlY2xhcmF0aW9uIG9mIHRoZSBkaWFsZWN0IG9mIHRoZSByZXNwb25zZSkuICBUaGUgcmVzdWx0Ci0gIGlzIHRoYXQgdGhlIEpESyBtZXRob2RzIGRvIG5vdCBjb3JyZWN0bHkgcGFyc2UgdGhlIGhlYWRlcnMsIGFuZAotICBpbmNsdWRlIHRoZW0gd2l0aCB0aGUgZG9jdW1lbnQgY29udGVudCBieSBtaXN0YWtlLgotICA8L1A+Ci0gIDxQPgotICBUaGlzIGlzIGRlZmluaXRlbHkgYSBidWcgaW4gdGhlIEpESyAxLjAuMiBmb3VuZGF0aW9uIGNsYXNzZXMgZnJvbSBTdW4sCi0gIGFuZCBpdCBoYXMgYmVlbiBmaXhlZCBpbiB2ZXJzaW9uIDEuMS4gIEhvd2V2ZXIsIHRoZSBjbGFzc2VzIGluCi0gIHF1ZXN0aW9uIGFyZSBwYXJ0IG9mIHRoZSB2aXJ0dWFsIG1hY2hpbmUgZW52aXJvbm1lbnQsIHdoaWNoIG1lYW5zCi0gIHRoZXkncmUgcGFydCBvZiB0aGUgV2ViIGJyb3dzZXIgKGlmIEphdmEtZW5hYmxlZCkgb3IgdGhlIEphdmEKLSAgZW52aXJvbm1lbnQgb24gdGhlIGNsaWVudCBzeXN0ZW0gLSBzbyBldmVuIGlmIHlvdSBkZXZlbG9wCi0gIDxFTT55b3VyPC9FTT4gY2xhc3NlcyB3aXRoIGEgcmVjZW50IEpESywgdGhlIGV2ZW50dWFsIHVzZXJzIG1pZ2h0Ci0gIGVuY291bnRlciB0aGUgcHJvYmxlbS4KLSAgVGhlIGNsYXNzZXMgaW52b2x2ZWQgYXJlIHJlcGxhY2VhYmxlIGJ5IHZlbmRvcnMgaW1wbGVtZW50aW5nIHRoZQotICBKYXZhIHZpcnR1YWwgbWFjaGluZSBlbnZpcm9ubWVudCwgYW5kIHNvIGV2ZW4gdGhvc2UgdGhhdCBhcmUgYmFzZWQKLSAgdXBvbiB0aGUgMS4wLjIgdmVyc2lvbiBtYXkgbm90IGhhdmUgdGhpcyBwcm9ibGVtLgotICA8L1A+Ci0gIDxQPgotICBJbiB0aGUgbWVhbnRpbWUsIGEgd29ya2Fyb3VuZCBpcyB0byB0ZWxsCi0gIEFwYWNoZSB0byAmcXVvdDtmYWtlJnF1b3Q7IGFuIEhUVFAvMS4wIHJlc3BvbnNlIHRvIHJlcXVlc3RzIHRoYXQgY29tZQotICBmcm9tIHRoZSBKREsgbWV0aG9kczsgdGhpcyBjYW4gYmUgZG9uZSBieSBpbmNsdWRpbmcgYSBsaW5lIHN1Y2ggYXMgdGhlCi0gIGZvbGxvd2luZyBpbiB5b3VyIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGVzOgotICA8L1A+Ci0gIDxQPgotICA8REw+Ci0gICA8REQ+PENPREU+QnJvd3Nlck1hdGNoIEphdmExLjAgZm9yY2UtcmVzcG9uc2UtMS4wCi0gICAgPEJSPgotICAgIEJyb3dzZXJNYXRjaCBKREsvMS4wIGZvcmNlLXJlc3BvbnNlLTEuMDwvQ09ERT4KLSAgIDwvREQ+Ci0gIDwvREw+Ci0gIDxQPjwvUD4KLSAgPFA+Ci0gIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpc3N1ZSBjYW4gYmUgZm91bmQgaW4gdGhlCi0gIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9pbmZvL2pkay0xMDIuaHRtbCIKLSAgPjxDSVRFPkphdmEgYW5kIEhUVFAvMS4xPC9DSVRFPjwvQT4KLSAgcGFnZSBhdCB0aGUgQXBhY2hlIHdlYiBzaXRlLgotICA8L1A+Ci0gIDxIUj4KLSA8L0xJPgotCi0gPExJPjxBIE5BTUU9Im1pZGkiPgotICAgICAgPFNUUk9ORz5Ib3cgZG8gSSBnZXQgQXBhY2hlIHRvIHNlbmQgYSBNSURJIGZpbGUgc28gdGhlIGJyb3dzZXIgY2FuCi0gICAgICBwbGF5IGl0PzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBFdmVuIHRob3VnaCB0aGUgcmVnaXN0ZXJlZCBNSU1FIHR5cGUgZm9yIE1JREkgZmlsZXMgaXMKLSAgPFNBTVA+YXVkaW8vbWlkaTwvU0FNUD4sIHNvbWUgYnJvd3NlcnMgYXJlIG5vdCBzZXQgdXAgdG8gcmVjb2duaXplIGl0Ci0gIGFzIHN1Y2g7IGluc3RlYWQsIHRoZXkgbG9vayBmb3IgPFNBTVA+YXVkaW8veC1taWRpPC9TQU1QPi4gIFRoZXJlIGFyZQotICB0d28gdGhpbmdzIHlvdSBjYW4gZG8gdG8gYWRkcmVzcyB0aGlzOgotICA8L1A+Ci0gIDxPTD4KLSAgIDxMST5Db25maWd1cmUgeW91ciBicm93c2VyIHRvIHRyZWF0IGRvY3VtZW50cyBvZiB0eXBlCi0gICAgPFNBTVA+YXVkaW8vbWlkaTwvU0FNUD4gY29ycmVjdGx5LiAgVGhpcyBpcyB0aGUgdHlwZSB0aGF0IEFwYWNoZQotICAgIHNlbmRzIGJ5IGRlZmF1bHQuICBUaGlzIG1heSBub3QgYmUgd29ya2FibGUsIGhvd2V2ZXIsIGlmIHlvdSBoYXZlCi0gICAgbWFueSBjbGllbnQgaW5zdGFsbGF0aW9ucyB0byBjaGFuZ2UsIG9yIGlmIHNvbWUgb3IgbWFueSBvZiB0aGUKLSAgICBjbGllbnRzIGFyZSBub3QgdW5kZXIgeW91ciBjb250cm9sLgotICAgPC9MST4KLSAgIDxMST5JbnN0cnVjdCBBcGFjaGUgdG8gc2VuZCBhIGRpZmZlcmVudCA8U0FNUD5Db250ZW50LXR5cGU8L1NBTVA+Ci0gICAgaGVhZGVyIGZvciB0aGVzZSBmaWxlcyBieSBhZGRpbmcgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHlvdXIgc2VydmVyJ3MKLSAgICBjb25maWd1cmF0aW9uIGZpbGVzOgotICAgIDxQPgotICAgIDxETD4KLSAgICAgPEREPjxDT0RFPkFkZFR5cGUgYXVkaW8veC1taWRpIC5taWQgLm1pZGkgLmthcjwvQ09ERT4KLSAgICAgPC9ERD4KLSAgICA8L0RMPgotICAgIDxQPjwvUD4KLSAgICA8UD4KLSAgICBOb3RlIHRoYXQgdGhpcyBtYXkgYnJlYWsgYnJvd3NlcnMgdGhhdCA8RU0+ZG88L0VNPiByZWNvZ25pemUgdGhlCi0gICAgPFNBTVA+YXVkaW8vbWlkaTwvU0FNUD4gTUlNRSB0eXBlIHVubGVzcyB0aGV5J3JlIHByZXBhcmVkIHRvIGFsc28KLSAgICBoYW5kbGUgPFNBTVA+YXVkaW8veC1taWRpPC9TQU1QPiB0aGUgc2FtZSB3YXkuCi0gICAgPC9QPgotICAgPC9MST4KLSAgPC9PTD4KLSAgPEhSPgotIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0iYWRkbG9nIj4KLSAgICAgIDxTVFJPTkc+SG93IGRvIEkgYWRkIGJyb3dzZXJzIGFuZCByZWZlcnJlcnMgdG8gbXkgbG9ncz88L1NUUk9ORz4KLSAgICAgPC9BPgotICA8UD4KLSAgQXBhY2hlIHByb3ZpZGVzIGEgY291cGxlIG9mIGRpZmZlcmVudCB3YXlzIG9mIGRvaW5nIHRoaXMuICBUaGUKLSAgcmVjb21tZW5kZWQgbWV0aG9kIGlzIHRvIGNvbXBpbGUgdGhlCi0gIDxBIEhSRUY9Ii4uL21vZC9tb2RfbG9nX2NvbmZpZy5odG1sIj48U0FNUD5tb2RfbG9nX2NvbmZpZzwvU0FNUD48L0E+Ci0gIG1vZHVsZSBpbnRvIHlvdXIgY29uZmlndXJhdGlvbiBhbmQgdXNlIHRoZQotICA8QSBIUkVGPSIuLi9tb2QvbW9kX2xvZ19jb25maWcuaHRtbCNjdXN0b21sb2ciPjxTQU1QPkN1c3RvbUxvZzwvU0FNUD48L0E+Ci0gIGRpcmVjdGl2ZS4KLSAgPC9QPgotICA8UD4KLSAgWW91IGNhbiBlaXRoZXIgbG9nIHRoZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIGZpbGVzIG90aGVyIHRoYW4geW91cgotICBub3JtYWwgdHJhbnNmZXIgbG9nLCBvciB5b3UgY2FuIGFkZCB0aGVtIHRvIHRoZSByZWNvcmRzIGFscmVhZHkgYmVpbmcKLSAgd3JpdHRlbi4gIEZvciBleGFtcGxlOgotICA8L1A+Ci0gIDxQPgotICA8Q09ERT4KLSAgIEN1c3RvbUxvZyZuYnNwO2xvZ3MvYWNjZXNzX2xvZyZuYnNwOyIlaCZuYnNwOyVsJm5ic3A7JXUmbmJzcDsldCZuYnNwO1wiJXJcIiZuYnNwOyVzJm5ic3A7JWImbmJzcDtcIiV7UmVmZXJlcn1pXCImbmJzcDtcIiV7VXNlci1BZ2VudH1pXCIiCi0gIDwvQ09ERT4KLSAgPC9QPgotICA8UD4KLSAgVGhpcyB3aWxsIGFkZCB0aGUgdmFsdWVzIG9mIHRoZSA8U0FNUD5Vc2VyLWFnZW50OjwvU0FNUD4gYW5kCi0gIDxTQU1QPlJlZmVyZXI6PC9TQU1QPiBoZWFkZXJzLCB3aGljaCBpbmRpY2F0ZSB0aGUgY2xpZW50IGFuZCB0aGUKLSAgcmVmZXJyaW5nIHBhZ2UsIHJlc3BlY3RpdmVseSwgdG8gdGhlIGVuZCBvZiBlYWNoIGxpbmUgaW4gdGhlIGFjY2VzcwotICBsb2cuCi0gIDwvUD4KLSAgPFA+Ci0gIFlvdSBtYXkgd2FudCB0byBjaGVjayBvdXQgdGhlIDxDSVRFPkFwYWNoZSBXZWVrPC9DSVRFPiBhcnRpY2xlCi0gIGVudGl0bGVkOgotICAmcXVvdDs8QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZXdlZWsuY29tL2ZlYXR1cmVzL2xvZ2ZpbGVzIiBSRUw9IkhlbHAiCi0gICAgICAgID48Q0lURT5HYXRoZXJpbmcgVmlzaXRvciBJbmZvcm1hdGlvbjogQ3VzdG9taXppbmcgWW91cgotICAgICAgICAgTG9nZmlsZXM8L0NJVEU+PC9BPiZxdW90Oy4KLSAgPC9QPgotICA8SFI+Ci0gPC9MST4KLQotIDxMST48QSBOQU1FPSJzZXQtc2VydmVybmFtZSI+Ci0gICAgICA8U1RST05HPldoeSBkb2VzIGFjY2Vzc2luZyBkaXJlY3RvcmllcyBvbmx5IHdvcmsgd2hlbiBJIGluY2x1ZGUKLSAgICAgIHRoZSB0cmFpbGluZyAmcXVvdDsvJnF1b3Q7Ci0gICAgICAoPEVNPmUuZy48L0VNPiwmbmJzcDs8U0FNUD5odHRwOi8vZm9vLmRvbWFpbi5jb20vfnVzZXIvPC9TQU1QPikKLSAgICAgIGJ1dCBub3Qgd2hlbiBJIG9taXQgaXQKLSAgICAgICg8RU0+ZS5nLjwvRU0+LCZuYnNwOzxTQU1QPmh0dHA6Ly9mb28uZG9tYWluLmNvbS9+dXNlcjwvU0FNUD4pPzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBXaGVuIHlvdSBhY2Nlc3MgYSBkaXJlY3Rvcnkgd2l0aG91dCBhIHRyYWlsaW5nICZxdW90Oy8mcXVvdDssIEFwYWNoZSBuZWVkcwotICB0byBzZW5kIHdoYXQgaXMgY2FsbGVkIGEgcmVkaXJlY3QgdG8gdGhlIGNsaWVudCB0byB0ZWxsIGl0IHRvCi0gIGFkZCB0aGUgdHJhaWxpbmcgc2xhc2guICBJZiBpdCBkaWQgbm90IGRvIHNvLCByZWxhdGl2ZSBVUkxzIHdvdWxkCi0gIG5vdCB3b3JrIHByb3Blcmx5LiAgV2hlbiBpdCBzZW5kcyB0aGUgcmVkaXJlY3QsIGl0IG5lZWRzIHRvIGtub3cKLSAgdGhlIG5hbWUgb2YgdGhlIHNlcnZlciBzbyB0aGF0IGl0IGNhbiBpbmNsdWRlIGl0IGluIHRoZSByZWRpcmVjdC4KLSAgVGhlcmUgYXJlIHR3byB3YXlzIGZvciBBcGFjaGUgdG8gZmluZCB0aGlzIG91dDsgZWl0aGVyIGl0IGNhbiBndWVzcywKLSAgb3IgeW91IGNhbiB0ZWxsIGl0LiAgSWYgeW91ciBETlMgaXMgY29uZmlndXJlZCBjb3JyZWN0bHksIGl0IGNhbgotICBub3JtYWxseSBndWVzcyB3aXRob3V0IGFueSBwcm9ibGVtcy4gIElmIGl0IGlzIG5vdCwgaG93ZXZlciwgdGhlbgotICB5b3UgbmVlZCB0byB0ZWxsIGl0LgotICA8L1A+Ci0gIDxQPgotICBBZGQgYSA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcm5hbWUiPlNlcnZlck5hbWU8L0E+IGRpcmVjdGl2ZQotICB0byB0aGUgY29uZmlnIGZpbGUgdG8gdGVsbCBpdCB3aGF0IHRoZSBkb21haW4gbmFtZSBvZiB0aGUgc2VydmVyIGlzLgotICA8L1A+Ci0gIDxIUj4KLSA8L0xJPgotCi0gPExJPjxBIE5BTUU9Im5vLWluZm8tZGlyZWN0aXZlcyI+Ci0gICAgICA8U1RST05HPldoeSBkb2Vzbid0IG1vZF9pbmZvIGxpc3QgYW55IGRpcmVjdGl2ZXM/PC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+Ci0gIFRoZSA8QSBIUkVGPSIuLi9tb2QvbW9kX2luZm8uaHRtbCI+PFNBTVA+bW9kX2luZm88L1NBTVA+PC9BPgotICBtb2R1bGUgYWxsb3dzIHlvdSB0byB1c2UgYSBXZWIgYnJvd3NlciB0byBzZWUgaG93IHlvdXIgc2VydmVyIGlzCi0gIGNvbmZpZ3VyZWQuICBBbW9uZyB0aGUgaW5mb3JtYXRpb24gaXQgZGlzcGxheXMgaXMgdGhlIGxpc3QgbW9kdWxlcyBhbmQKLSAgdGhlaXIgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzLiAgVGhlICZxdW90O2N1cnJlbnQmcXVvdDsgdmFsdWVzIGZvcgotICB0aGUgZGlyZWN0aXZlcyBhcmUgbm90IG5lY2Vzc2FyaWx5IHRob3NlIG9mIHRoZSBydW5uaW5nIHNlcnZlcjsgdGhleQotICBhcmUgZXh0cmFjdGVkIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgdGhlbXNlbHZlcyBhdCB0aGUgdGltZSBvZgotICB0aGUgcmVxdWVzdC4gIElmIHRoZSBmaWxlcyBoYXZlIGJlZW4gY2hhbmdlZCBzaW5jZSB0aGUgc2VydmVyIHdhcyBsYXN0Ci0gIHJlbG9hZGVkLCB0aGUgZGlzcGxheSB3aWxsIHdpbGwgbm90IG1hdGNoIHRoZSB2YWx1ZXMgYWN0aXZlbHkgaW4gdXNlLgotICBJZiB0aGUgZmlsZXMgYW5kIHRoZSBwYXRoIHRvIHRoZSBmaWxlcyBhcmUgbm90IHJlYWRhYmxlIGJ5IHRoZSB1c2VyIGFzCi0gIHdoaWNoIHRoZSBzZXJ2ZXIgaXMgcnVubmluZyAoc2VlIHRoZQotICA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3VzZXIiPjxTQU1QPlVzZXI8L1NBTVA+PC9BPgotICBkaXJlY3RpdmUpLCB0aGVuIDxTQU1QPm1vZF9pbmZvPC9TQU1QPiBjYW5ub3QgcmVhZCB0aGVtIGluIG9yZGVyIHRvCi0gIGxpc3QgdGhlaXIgdmFsdWVzLiAgQW4gZW50cnkgPEVNPndpbGw8L0VNPiBiZSBtYWRlIGluIHRoZSBlcnJvciBsb2cgaW4KLSAgdGhpcyBldmVudCwgaG93ZXZlci4KLSAgPC9QPgotICA8SFI+Ci0gPC9MST4KLQotIDxMST48QSBOQU1FPSJuYW1ldmhvc3QiPgotICAgICAgPFNUUk9ORz5JIHVwZ3JhZGVkIHRvIEFwYWNoZSAxLjMgYW5kIG5vdyBteSB2aXJ0dWFsIGhvc3RzIGRvbid0Ci0gICAgICB3b3JrITwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBJbiB2ZXJzaW9ucyBvZiBBcGFjaGUgcHJpb3IgdG8gMS4zYjIsIHRoZXJlIHdhcyBhIGxvdCBvZiBjb25mdXNpb24KLSAgcmVnYXJkaW5nIGFkZHJlc3MtYmFzZWQgdmlydHVhbCBob3N0cyBhbmQgKEhUVFAvMS4xKSBuYW1lLWJhc2VkCi0gIHZpcnR1YWwgaG9zdHMsIGFuZCB0aGUgcnVsZXMgY29uY2VybmluZyBob3cgdGhlIHNlcnZlciBwcm9jZXNzZWQKLSAgPFNBTVA+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvU0FNUD4gZGVmaW5pdGlvbnMgd2VyZSB2ZXJ5IGNvbXBsZXggYW5kIG5vdAotICB3ZWxsIGRvY3VtZW50ZWQuCi0gIDwvUD4KLSAgPFA+Ci0gIEFwYWNoZSAxLjNiMiBpbnRyb2R1Y2VkIGEgbmV3IGRpcmVjdGl2ZSwKLSAgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvbW9kL2NvcmUuaHRtbCNuYW1ldmlydHVhbGhvc3QiCi0gID48U0FNUD5OYW1lVmlydHVhbEhvc3Q8L1NBTVA+PC9BPiwKLSAgd2hpY2ggc2ltcGxpZmllcyB0aGUgcnVsZXMgcXVpdGUgYSBiaXQuICBIb3dldmVyLCBjaGFuZ2luZyB0aGUgcnVsZXMKLSAgbGlrZSB0aGlzIG1lYW5zIHRoYXQgeW91ciBleGlzdGluZyBuYW1lLWJhc2VkCi0gIDxTQU1QPiZsdDtWaXJ0dWFsSG9zdCZndDs8L1NBTVA+IGNvbnRhaW5lcnMgcHJvYmFibHkgd29uJ3Qgd29yawotICBjb3JyZWN0bHkgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSB1cGdyYWRlLgotICA8L1A+Ci0gIDxQPgotICBUbyBjb3JyZWN0IHRoaXMgcHJvYmxlbSwgYWRkIHRoZSBmb2xsb3dpbmcgbGluZSB0byB0aGUgYmVnaW5uaW5nIG9mCi0gIHlvdXIgc2VydmVyIGNvbmZpZ3VyYXRpb24gZmlsZSwgYmVmb3JlIGRlZmluaW5nIGFueSB2aXJ0dWFsIGhvc3RzOgotICA8L1A+Ci0gIDxETD4KLSAgIDxERD48Q09ERT5OYW1lVmlydHVhbEhvc3QgPEVNPm4ubi5uLm48L0VNPjwvQ09ERT4KLSAgIDwvREQ+Ci0gIDwvREw+Ci0gIDxQPgotICBSZXBsYWNlIHRoZSAmcXVvdDs8U0FNUD5uLm4ubi5uPC9TQU1QPiZxdW90OyB3aXRoIHRoZSBJUCBhZGRyZXNzIHRvCi0gIHdoaWNoIHRoZSBuYW1lLWJhc2VkIHZpcnR1YWwgaG9zdCBuYW1lcyByZXNvbHZlOyBpZiB5b3UgaGF2ZSBtdWx0aXBsZQotICBuYW1lLWJhc2VkIGhvc3RzIG9uIG11bHRpcGxlIGFkZHJlc3NlcywgcmVwZWF0IHRoZSBkaXJlY3RpdmUgZm9yIGVhY2gKLSAgYWRkcmVzcy4KLSAgPC9QPgotICA8UD4KLSAgTWFrZSBzdXJlIHRoYXQgeW91ciBuYW1lLWJhc2VkIDxTQU1QPiZsdDtWaXJ0dWFsSG9zdCZndDs8L1NBTVA+IGJsb2NrcwotICBjb250YWluIDxTQU1QPlNlcnZlck5hbWU8L1NBTVA+IGFuZCBwb3NzaWJseSA8U0FNUD5TZXJ2ZXJBbGlhczwvU0FNUD4KLSAgZGlyZWN0aXZlcyBzbyBBcGFjaGUgY2FuIGJlIHN1cmUgdG8gdGVsbCB0aGVtIGFwYXJ0IGNvcnJlY3RseS4KLSAgPC9QPgotICA8UD4KLSAgUGxlYXNlIHNlZSB0aGUKLSAgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3Mvdmhvc3RzLyI+QXBhY2hlCi0gIFZpcnR1YWwgSG9zdCBkb2N1bWVudGF0aW9uPC9BPiBmb3IgZnVydGhlciBkZXRhaWxzIGFib3V0IGNvbmZpZ3VyYXRpb24uCi0gIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0icmVkaGF0LWh0bSI+Ci0gICAgICA8U1RST05HPkknbSB1c2luZyBSZWRIYXQgTGludXggYW5kIG15IC5odG0gZmlsZXMgYXJlIHNob3dpbmcKLSAgICAgIHVwIGFzIEhUTUwgc291cmNlIHJhdGhlciB0aGFuIGJlaW5nIGZvcm1hdHRlZCE8L1NUUk9ORz4KLSAgICAgPC9BPgotCi0gIDxQPgotICBSZWRIYXQgbWVzc2VkIHVwIGFuZCBmb3Jnb3QgdG8gcHV0IGEgY29udGVudCB0eXBlIGZvciA8Q09ERT4uaHRtPC9DT0RFPgotICBmaWxlcyBpbnRvIDxDT0RFPi9ldGMvbWltZS50eXBlczwvQ09ERT4uICBFZGl0IDxDT0RFPi9ldGMvbWltZS50eXBlczwvQ09ERT4sCi0gIGZpbmQgdGhlIGxpbmUgY29udGFpbmluZyA8Q09ERT5odG1sPC9DT0RFPiBhbmQgYWRkIDxDT0RFPmh0bTwvQ09ERT4gdG8gaXQuCi0gIFRoZW4gcmVzdGFydCB5b3VyIGh0dHBkIHNlcnZlcjoKLSAgPC9QPgotICA8REw+Ci0gICA8REQ+PENPREU+a2lsbCAtSFVQIGBjYXQgL3Zhci9ydW4vaHR0cGQucGlkYDwvQ09ERT4KLSAgIDwvREQ+Ci0gIDwvREw+Ci0gIDxQPgotICBUaGVuIDxTVFJPTkc+Y2xlYXIgeW91ciBicm93c2VycycgY2FjaGVzPC9TVFJPTkc+LiAgKE1hbnkgYnJvd3NlcnMgd29uJ3QKLSAgcmUtZXhhbWluZSB0aGUgY29udGVudCB0eXBlIGFmdGVyIHRoZXkndmUgcmVsb2FkZWQgYSBwYWdlLikKLSAgPC9QPgotICA8SFI+Ci0gPC9MST4KLQotIDxMST48QSBOQU1FPSJodGFjY2Vzcy13b3JrIj4KLSAgICAgICA8U1RST05HPk15IDxDT0RFPi5odGFjY2VzczwvQ09ERT4gZmlsZXMgYXJlIGJlaW5nIGlnbm9yZWQuPC9TVFJPTkc+PC9BPgotICAgPFA+Ci0gICBUaGlzIGlzIGFsbW9zdCBhbHdheXMgZHVlIHRvIHlvdXIgPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNhbGxvd292ZXJyaWRlIj4KLSAgIEFsbG93T3ZlcnJpZGU8L0E+IGRpcmVjdGl2ZSBiZWluZyBzZXQgaW5jb3JyZWN0bHkgZm9yIHRoZSBkaXJlY3RvcnkgaW4gCi0gICBxdWVzdGlvbi4gIElmIGl0IGlzIHNldCB0byA8Q09ERT5Ob25lPC9DT0RFPiB0aGVuIC5odGFjY2VzcyBmaWxlcyB3aWxsIAotICAgbm90IGV2ZW4gYmUgbG9va2VkIGZvci4gIElmIHlvdSBkbyBoYXZlIG9uZSB0aGF0IGlzIHNldCwgdGhlbiBiZSBjZXJ0YWluIAotICAgaXQgY292ZXJzIHRoZSBkaXJlY3RvcnkgeW91IGFyZSB0cnlpbmcgdG8gdXNlIHRoZSAuaHRhY2Nlc3MgZmlsZSBpbi4gIAotICAgVGhpcyBpcyBub3JtYWxseSBhY2NvbXBsaXNoZWQgYnkgZW5zdXJpbmcgaXQgaXMgaW5zaWRlIHRoZSBwcm9wZXIgCi0gICA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI2RpcmVjdG9yeSI+RGlyZWN0b3J5PC9BPiBjb250YWluZXIuCi0gICA8L1A+Ci0gICA8SFI+Ci0gPC9MST4KLSA8TEk+PEEgTkFNRT0iZm9yYmlkZGVuIj4KLSAgICAgICA8U1RST05HPldoeSBkbyBJIGdldCBhICZxdW90OzxTQU1QPkZvcmJpZGRlbjwvU0FNUD4mcXVvdDsgbWVzc2FnZSAKLSAgICAgICB3aGVuZXZlciBJIHRyeSB0byBhY2Nlc3MgYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeT88L1NUUk9ORz48L0E+Ci0gICA8UD4KLSAgIFRoaXMgbWVzc2FnZSBpcyBnZW5lcmFsbHkgY2F1c2VkIGJlY2F1c2UgZWl0aGVyCi0gICA8L1A+Ci0gICA8VUw+Ci0gICAgPExJPlRoZSB1bmRlcmx5aW5nIGZpbGUgc3lzdGVtIHBlcm1pc3Npb25zIGRvIG5vdCBhbGxvdyB0aGUKLSAgICAgVXNlci9Hcm91cCB1bmRlciB3aGljaCBBcGFjaGUgaXMgcnVubmluZyB0byBhY2Nlc3MgdGhlIG5lY2Vzc2FyeQotICAgICBmaWxlczsgb3IKLSAgICA8TEk+VGhlIEFwYWNoZSBjb25maWd1cmF0aW9uIGhhcyBzb21lIGFjY2VzcyByZXN0cmljdGlvbnMgaW4gCi0gICAgIHBsYWNlIHdoaWNoIGZvcmJpZCBhY2Nlc3MgdG8gdGhlIGZpbGVzLgotICAgPC9VTD4KLSAgIDxQPgotICAgWW91IGNhbiBkZXRlcm1pbmUgd2hpY2ggY2FzZSBhcHBsaWVzIHRvIHlvdXIgc2l0dWF0aW9uIGJ5IGNoZWNraW5nIHRoZQotICAgZXJyb3IgbG9nLgotICAgPC9QPgotICAgPFA+Ci0gICBJbiB0aGUgY2FzZSB3aGVyZSBmaWxlIHN5c3RlbSBwZXJtaXNzaW9uIGFyZSBhdCBmYXVsdCwgcmVtZW1iZXIKLSAgIHRoYXQgbm90IG9ubHkgbXVzdCB0aGUgZGlyZWN0b3J5IGFuZCBmaWxlcyBpbiBxdWVzdGlvbiBiZSByZWFkYWJsZSwKLSAgIGJ1dCBhbHNvIGFsbCBwYXJlbnQgZGlyZWN0b3JpZXMgbXVzdCBiZSBhdCBsZWFzdCBzZWFyY2hhYmxlIGJ5IHRoZQotICAgd2ViIHNlcnZlciBpbiBvcmRlciBmb3IgdGhlIGNvbnRlbnQgdG8gYmUgYWNjZXNzaWJsZS4KLSAgIDwvUD4KLSAgIDxIUj4KLSAgPC9MST4KLTwvT0w+Ci08IS0tI2VuZGlmIC0tPgotPCEtLSNpZiBleHByPSIkU1RBTkRBTE9ORSIgLS0+Ci0gIDwhLS0gRG9uJ3QgZm9yZ2V0IHRvIGFkZCBIUiB0YWdzIGF0IHRoZSBlbmQgb2YgZWFjaCBsaXN0IGl0ZW0uLiAtLT4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KLTwhLS0jZW5kaWYgLS0+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9taXNjL0ZBUS1GLmh0bWwgYi9kb2NzL21hbnVhbC9taXNjL0ZBUS1GLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NDQyYTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbWlzYy9GQVEtRi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTI0ICswLDAgQEAKLTwhLS0jaWYgZXhwcj0iJEZBUU1BU1RFUiIgLS0+Ci0gPCEtLSNzZXQgdmFyPSJTVEFOREFMT05FIiB2YWx1ZT0iIiAtLT4KLSA8IS0tI3NldCB2YXI9IklOQ0xVREVEIiB2YWx1ZT0iWUVTIiAtLT4KLSA8IS0tI2lmIGV4cHI9IiRRVUVSWV9TVFJJTkcgPSBUT0MiIC0tPgotICA8IS0tI3NldCB2YXI9IlRPQyIgdmFsdWU9IllFUyIgLS0+Ci0gIDwhLS0jc2V0IHZhcj0iQ09OVEVOVCIgdmFsdWU9IiIgLS0+Ci0gPCEtLSNlbHNlIC0tPgotICA8IS0tI3NldCB2YXI9IlRPQyIgdmFsdWU9IiIgLS0+Ci0gIDwhLS0jc2V0IHZhcj0iQ09OVEVOVCIgdmFsdWU9IllFUyIgLS0+Ci0gPCEtLSNlbmRpZiAtLT4KLTwhLS0jZWxzZSAtLT4KLSA8IS0tI3NldCB2YXI9IlNUQU5EQUxPTkUiIHZhbHVlPSJZRVMiIC0tPgotIDwhLS0jc2V0IHZhcj0iSU5DTFVERUQiIHZhbHVlPSIiIC0tPgotIDwhLS0jc2V0IHZhcj0iVE9DIiB2YWx1ZT0iIiAtLT4KLSA8IS0tI3NldCB2YXI9IkNPTlRFTlQiIHZhbHVlPSIiIC0tPgotPCEtLSNlbmRpZiAtLT4KLTwhLS0jaWYgZXhwcj0iJFNUQU5EQUxPTkUiIC0tPgotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci0gPEhFQUQ+Ci0gIDxUSVRMRT5BcGFjaGUgU2VydmVyIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC9USVRMRT4KLSA8L0hFQUQ+Ci08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci0gPEJPRFkKLSAgQkdDT0xPUj0iI0ZGRkZGRiIKLSAgVEVYVD0iIzAwMDAwMCIKLSAgTElOSz0iIzAwMDBGRiIKLSAgVkxJTks9IiMwMDAwODAiCi0gIEFMSU5LPSIjRkYwMDAwIgotID4KLSAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLSAgPEgxIEFMSUdOPSJDRU5URVIiPkFwYWNoZSBTZXJ2ZXIgRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L0gxPgotICA8UD4KLSAgJFJldmlzaW9uOiAxLjIgJCAoJERhdGU6IDE5OTkvMDcvMDMgMjI6MTI6NTAgJCkKLSAgPC9QPgotICA8UD4KLSAgVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgRkFRIGlzIGFsd2F5cyBhdmFpbGFibGUgZnJvbSB0aGUgbWFpbgotICBBcGFjaGUgd2ViIHNpdGUsIGF0Ci0gICZsdDs8QQotICAgICAgIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL21pc2MvRkFRLmh0bWwiCi0gICAgICAgUkVMPSJIZWxwIgotICAgICAgPjxTQU1QPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL21pc2MvRkFRLmh0bWw8L1NBTVA+PC9BPiZndDsuCi0gIDwvUD4KLTwhLS0gTm90ZXMgYWJvdXQgY2hhbmdlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAtIElmIGFkZGluZyBhIHJlbGF0aXZlIGxpbmsgdG8gYW5vdGhlciBwYXJ0IG9mIHRoZSAgICAgICAgICAgIC0tPgotPCEtLSAgICBkb2N1bWVudGF0aW9uLCAqZG8qIGluY2x1ZGUgdGhlICIuaHRtbCIgcG9ydGlvbi4gIFRoZXJlJ3MgYSAtLT4KLTwhLS0gICAgZ29vZCBjaGFuY2UgdGhhdCB0aGUgdXNlciB3aWxsIGJlIHJlYWRpbmcgdGhlIGRvY3VtZW50YXRpb24gLS0+Ci08IS0tICAgIG9uIGhpcyBvd24gc3lzdGVtLCB3aGljaCBtYXkgbm90IGJlIGNvbmZpZ3VyZWQgZm9yICAgICAgICAgIC0tPgotPCEtLSAgICBtdWx0aXZpZXdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gIC0gV2hlbiBhZGRpbmcgaXRlbXMsIG1ha2Ugc3VyZSB0aGV5J3JlIHB1dCBpbiB0aGUgcmlnaHQgcGxhY2UgLS0+Ci08IS0tICAgIC0gdmVyaWZ5IHRoYXQgdGhlIG51bWJlcmluZyBtYXRjaGVzIHVwLiAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgLSAqRG9uJ3QqIHVzZSA8UFJFPjwvUFJFPiBibG9ja3MgLSB0aGV5IGRvbid0IGFwcGVhciAgICAgICAgICAtLT4KLTwhLS0gICAgY29ycmVjdGx5IGluIGEgcmVsaWFibGUgd2F5IHdoZW4gdGhpcyBpcyBjb252ZXJ0ZWQgdG8gdGV4dCAgLS0+Ci08IS0tICAgIHdpdGggTHlueC4gIFVzZSA8REw+PEREPjxDT0RFPnh4eDxCUj54eDwvQ09ERT48L0REPjwvREw+ICAgIC0tPgotPCEtLSAgICBibG9ja3MgaW5zaWRlIGEgPFA+PC9QPiBpbnN0ZWFkLiAgVGhpcyBpcyBuZWNlc3NhcnkgdG8gZ2V0ICAtLT4KLTwhLS0gICAgdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGluZGVudGluZyByaWdodC4gICAgICAgICAgICAgICAgLS0+Ci08IS0tICAtIERvbid0IGZvcmdldCB0byBpbmNsdWRlIGFuIEhSIHRhZyBhZnRlciB0aGUgbGFzdCAvUCB0YWcgICAgIC0tPgotPCEtLSAgICBidXQgYmVmb3JlIHRoZSAvTEkgaW4gYW4gaXRlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPFA+Ci0gIElmIHlvdSBhcmUgcmVhZGluZyBhIHRleHQtb25seSB2ZXJzaW9uIG9mIHRoaXMgRkFRLCB5b3UgbWF5IGZpbmQgbnVtYmVycwotICBlbmNsb3NlZCBpbiBicmFja2V0cyAoc3VjaCBhcyAmcXVvdDtbMTJdJnF1b3Q7KS4gIFRoZXNlIHJlZmVyIHRvIHRoZSBsaXN0IG9mCi0gIHJlZmVyZW5jZSBVUkxzIHRvIGJlIGZvdW5kIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LiAgVGhlc2UgcmVmZXJlbmNlcwotICBkbyBub3QgYXBwZWFyLCBhbmQgYXJlIG5vdCBuZWVkZWQsIGZvciB0aGUgaHlwZXJ0ZXh0IHZlcnNpb24uCi0gIDwvUD4KLSAgPEgyPlRoZSBRdWVzdGlvbnM8L0gyPgotPE9MIFRZUEU9IkEiPgotPCEtLSNlbmRpZiAtLT4KLTwhLS0jaWYgZXhwcj0iJFRPQyB8fCAkU1RBTkRBTE9ORSIgLS0+Ci0gPExJIFZBTFVFPSI2Ij48U1RST05HPkR5bmFtaWMgQ29udGVudCAoQ0dJIGFuZCBTU0kpPC9TVFJPTkc+Ci0gIDxPTD4KLSAgIDxMST48QSBIUkVGPSIjQ0dJb3V0c2lkZVNjcmlwdEFsaWFzIj5Ib3cgZG8gSSBlbmFibGUgQ0dJIGV4ZWN1dGlvbgotICAgICAgICBpbiBkaXJlY3RvcmllcyBvdGhlciB0aGFuIHRoZSBTY3JpcHRBbGlhcz88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNwcmVtYXR1cmUtc2NyaXB0LWhlYWRlcnMiPldoYXQgZG9lcyBpdCBtZWFuIHdoZW4gbXkKLSAgICAgICAgQ0dJcyBmYWlsIHdpdGggJnF1b3Q7PFNBTVA+UHJlbWF0dXJlIGVuZCBvZiBzY3JpcHQKLSAgICAgICAgaGVhZGVyczwvU0FNUD4mcXVvdDs/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjUE9TVG5vdGFsbG93ZWQiPldoeSBkbyBJIGtlZXAgZ2V0dGluZyAmcXVvdDtNZXRob2QgTm90IAotICAgICAgICBBbGxvd2VkJnF1b3Q7IGZvciBmb3JtIFBPU1QgcmVxdWVzdHM/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjbnBoLXNjcmlwdHMiPkhvdyBjYW4gSSBnZXQgbXkgc2NyaXB0J3Mgb3V0cHV0IHdpdGhvdXQKLSAgICAgICAgQXBhY2hlIGJ1ZmZlcmluZyBpdD8gIFdoeSBkb2Vzbid0IG15IHNlcnZlciBwdXNoIHdvcms/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjY2dpLXNwZWMiPldoZXJlIGNhbiBJIGZpbmQgdGhlICZxdW90O0NHSQotICAgICAgICBzcGVjaWZpY2F0aW9uJnF1b3Q7PzwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI2Zhc3RjZ2kiPldoeSBpc24ndCBGYXN0Q0dJIGluY2x1ZGVkIHdpdGggQXBhY2hlIGFueQotICAgICAgICBtb3JlPzwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI3NzaS1wYXJ0LWkiPkhvdyBkbyBJIGVuYWJsZSBTU0kgKHBhcnNlZCBIVE1MKT88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNzc2ktcGFydC1paSI+V2h5IGRvbid0IG15IHBhcnNlZCBmaWxlcyBnZXQgY2FjaGVkPzwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI3NzaS1wYXJ0LWlpaSI+SG93IGNhbiBJIGhhdmUgbXkgc2NyaXB0IG91dHB1dCBwYXJzZWQ/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjc3NpLXBhcnQtaXYiPlNTSXMgZG9uJ3Qgd29yayBmb3IgVmlydHVhbEhvc3RzIGFuZC9vciAKLSAgICAgICAgdXNlciBob21lIGRpcmVjdG9yaWVzPC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjZXJyb3Jkb2Nzc2kiPkhvdyBjYW4gSSB1c2UgPENPREU+RXJyb3JEb2N1bWVudDwvQ09ERT4KLSAgICAgICAgYW5kIFNTSSB0byBzaW1wbGlmeSBjdXN0b21pemVkIGVycm9yIG1lc3NhZ2VzPzwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI3JlbW90ZS11c2VyLXZhciI+V2h5IGlzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotICAgICAgICA8U0FNUD5SRU1PVEVfVVNFUjwvU0FNUD4gbm90IHNldD88L0E+Ci0gICA8L0xJPgotICA8L09MPgotIDwvTEk+Ci08IS0tI2VuZGlmIC0tPgotPCEtLSNpZiBleHByPSIkU1RBTkRBTE9ORSIgLS0+Ci08L09MPgotCi08SFI+Ci0KLSAgPEgyPlRoZSBBbnN3ZXJzPC9IMj4KLTwhLS0jZW5kaWYgLS0+Ci08IS0tI2lmIGV4cHI9IiEgJFRPQyIgLS0+Ci0KLSAgPEgzPkYuIER5bmFtaWMgQ29udGVudCAoQ0dJIGFuZCBTU0kpPC9IMz4KLTxPTD4KLQotIDxMST48QSBOQU1FPSJDR0lvdXRzaWRlU2NyaXB0QWxpYXMiPgotICAgICAgPFNUUk9ORz5Ib3cgZG8gSSBlbmFibGUgQ0dJIGV4ZWN1dGlvbiBpbiBkaXJlY3RvcmllcyBvdGhlciB0aGFuCi0gICAgICB0aGUgU2NyaXB0QWxpYXM/PC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+Ci0gIEFwYWNoZSByZWNvZ25pemVzIGFsbCBmaWxlcyBpbiBhIGRpcmVjdG9yeSBuYW1lZCBhcyBhCi0gIDxBIEhSRUY9Ii4uL21vZC9tb2RfYWxpYXMuaHRtbCNzY3JpcHRhbGlhcyI+PFNBTVA+U2NyaXB0QWxpYXM8L1NBTVA+PC9BPgotICBhcyBiZWluZyBlbGlnaWJsZSBmb3IgZXhlY3V0aW9uIHJhdGhlciB0aGFuIHByb2Nlc3NpbmcgYXMgbm9ybWFsCi0gIGRvY3VtZW50cy4gIFRoaXMgYXBwbGllcyByZWdhcmRsZXNzIG9mIHRoZSBmaWxlIG5hbWUsIHNvIHNjcmlwdHMgaW4gYQotICBTY3JpcHRBbGlhcyBkaXJlY3RvcnkgZG9uJ3QgbmVlZCB0byBiZSBuYW1lZAotICAmcXVvdDs8U0FNUD4qLmNnaTwvU0FNUD4mcXVvdDsgb3IgJnF1b3Q7PFNBTVA+Ki5wbDwvU0FNUD4mcXVvdDsgb3IKLSAgd2hhdGV2ZXIuICBJbiBvdGhlciB3b3JkcywgPEVNPmFsbDwvRU0+IGZpbGVzIGluIGEgU2NyaXB0QWxpYXMKLSAgZGlyZWN0b3J5IGFyZSBzY3JpcHRzLCBhcyBmYXIgYXMgQXBhY2hlIGlzIGNvbmNlcm5lZC4KLSAgPC9QPgotICA8UD4KLSAgVG8gcGVyc3VhZGUgQXBhY2hlIHRvIGV4ZWN1dGUgc2NyaXB0cyBpbiBvdGhlciBsb2NhdGlvbnMsIHN1Y2ggYXMgaW4KLSAgZGlyZWN0b3JpZXMgd2hlcmUgbm9ybWFsIGRvY3VtZW50cyBtYXkgYWxzbyBsaXZlLCB5b3UgbXVzdCB0ZWxsIGl0IGhvdwotICB0byByZWNvZ25pemUgdGhlbSAtIGFuZCBhbHNvIHRoYXQgaXQncyBva2F5IHRvIGV4ZWN1dGUgdGhlbS4gIEZvcgotICB0aGlzLCB5b3UgbmVlZCB0byB1c2Ugc29tZXRoaW5nIGxpa2UgdGhlCi0gIDxBIEhSRUY9Ii4uL21vZC9tb2RfbWltZS5odG1sI2FkZGhhbmRsZXIiPjxTQU1QPkFkZEhhbmRsZXI8L1NBTVA+PC9BPgotICBkaXJlY3RpdmUuCi0gIDwvUD4KLSAgPFA+Ci0gIDxPTD4KLSAgIDxMST5JbiBhbiBhcHByb3ByaWF0ZSBzZWN0aW9uIG9mIHlvdXIgc2VydmVyIGNvbmZpZ3VyYXRpb24gZmlsZXMsIGFkZAotICAgIGEgbGluZSBzdWNoIGFzCi0gICAgPFA+Ci0gICAgPERMPgotICAgICA8REQ+PENPREU+QWRkSGFuZGxlciBjZ2ktc2NyaXB0IC5jZ2k8L0NPREU+Ci0gICAgIDwvREQ+Ci0gICAgPC9ETD4KLSAgICA8UD48L1A+Ci0gICAgPFA+Ci0gICAgVGhlIHNlcnZlciB3aWxsIHRoZW4gcmVjb2duaXplIHRoYXQgYWxsIGZpbGVzIGluIHRoYXQgbG9jYXRpb24gKGFuZAotICAgIGl0cyBsb2dpY2FsIGRlc2NlbmRhbnRzKSB0aGF0IGVuZCBpbiAmcXVvdDs8U0FNUD4uY2dpPC9TQU1QPiZxdW90OwotICAgIGFyZSBzY3JpcHQgZmlsZXMsIG5vdCBkb2N1bWVudHMuCi0gICAgPC9QPgotICAgPC9MST4KLSAgIDxMST5NYWtlIHN1cmUgdGhhdCB0aGUgZGlyZWN0b3J5IGxvY2F0aW9uIGlzIGNvdmVyZWQgYnkgYW4KLSAgICA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI29wdGlvbnMiPjxTQU1QPk9wdGlvbnM8L1NBTVA+PC9BPgotICAgIGRlY2xhcmF0aW9uIHRoYXQgaW5jbHVkZXMgdGhlIDxTQU1QPkV4ZWNDR0k8L1NBTVA+IG9wdGlvbi4KLSAgIDwvTEk+Ci0gIDwvT0w+Ci0gIDxQPjwvUD4KLSAgPFA+Ci0gIEluIHNvbWUgc2l0dWF0aW9ucywgeW91IG1pZ2h0IG5vdCB3YW50IHRvIGFjdHVhbGx5Ci0gIGFsbG93IGFsbCBmaWxlcyBuYW1lZCAmcXVvdDs8U0FNUD4qLmNnaTwvU0FNUD4mcXVvdDsgdG8gYmUgZXhlY3V0YWJsZS4KLSAgUGVyaGFwcyBhbGwgeW91IHdhbnQgaXMgdG8gZW5hYmxlIGEgcGFydGljdWxhciBmaWxlIGluIGEgbm9ybWFsIGRpcmVjdG9yeSB0bwotICBiZSBleGVjdXRhYmxlLiBUaGlzIGNhbiBiZSBhbHRlcm5hdGl2ZWx5IGFjY29tcGxpc2hlZCAKLSAgPEVNPnZpYTwvRU0+IDxBIEhSRUY9Ii4uL21vZC9tb2RfcmV3cml0ZS5odG1sIj48U0FNUD5tb2RfcmV3cml0ZTwvU0FNUD48L0E+IAotICBhbmQgdGhlIGZvbGxvd2luZyBzdGVwczoKLSAgPC9QPgotICA8UD4KLSAgPE9MPgotICAgPExJPkxvY2FsbHkgYWRkIHRvIHRoZSBjb3JyZXNwb25kaW5nIDxTQU1QPi5odGFjY2VzczwvU0FNUD4gZmlsZSBhIHJ1bGVzZXQKLSAgICBzaW1pbGFyIHRvIHRoaXMgb25lOgotICAgIDxQPgotICAgIDxETD4KLSAgICAgPEREPjxDT0RFPlJld3JpdGVFbmdpbmUgb24KLSAgICAgIDxCUj4KLSAgICAgIFJld3JpdGVCYXNlICAgL35mb28vYmFyLwotICAgICAgPEJSPgotICAgICAgUmV3cml0ZVJ1bGUgICBecXV1eFwuY2dpJCAgLSAgW1Q9YXBwbGljYXRpb24veC1odHRwZC1jZ2ldPC9DT0RFPgotICAgICA8L0REPgotICAgIDwvREw+Ci0gICAgPFA+PC9QPgotICAgPC9MST4KLSAgIDxMST5NYWtlIHN1cmUgdGhhdCB0aGUgZGlyZWN0b3J5IGxvY2F0aW9uIGlzIGNvdmVyZWQgYnkgYW4KLSAgICA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI29wdGlvbnMiPjxTQU1QPk9wdGlvbnM8L1NBTVA+PC9BPgotICAgIGRlY2xhcmF0aW9uIHRoYXQgaW5jbHVkZXMgdGhlIDxTQU1QPkV4ZWNDR0k8L1NBTVA+IGFuZAotICAgIDxTQU1QPkZvbGxvd1N5bUxpbmtzPC9TQU1QPiBvcHRpb24uCi0gICA8L0xJPgotICA8L09MPgotICA8UD48L1A+Ci0gIDxIUj4KLSA8L0xJPgotCi0gPExJPjxBIE5BTUU9InByZW1hdHVyZS1zY3JpcHQtaGVhZGVycyI+Ci0gICAgICA8U1RST05HPldoYXQgZG9lcyBpdCBtZWFuIHdoZW4gbXkgQ0dJcyBmYWlsIHdpdGgKLSAgICAgICZxdW90OzxTQU1QPlByZW1hdHVyZSBlbmQgb2Ygc2NyaXB0IGhlYWRlcnM8L1NBTVA+JnF1b3Q7PzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBJdCBtZWFucyBqdXN0IHdoYXQgaXQgc2F5czogdGhlIHNlcnZlciB3YXMgZXhwZWN0aW5nIGEgY29tcGxldGUgc2V0IG9mCi0gIEhUVFAgaGVhZGVycyAob25lIG9yIG1vcmUgZm9sbG93ZWQgYnkgYSBibGFuayBsaW5lKSwgYW5kIGRpZG4ndCBnZXQKLSAgdGhlbS4KLSAgPC9QPgotICA8UD4KLSAgVGhlIG1vc3QgY29tbW9uIGNhdXNlIG9mIHRoaXMgcHJvYmxlbSBpcyB0aGUgc2NyaXB0IGR5aW5nIGJlZm9yZQotICBzZW5kaW5nIHRoZSBjb21wbGV0ZSBzZXQgb2YgaGVhZGVycywgb3IgcG9zc2libHkgYW55IGF0IGFsbCwgdG8gdGhlCi0gIHNlcnZlci4gIFRvIHNlZSBpZiB0aGlzIGlzIHRoZSBjYXNlLCB0cnkgcnVubmluZyB0aGUgc2NyaXB0IHN0YW5kYWxvbmUKLSAgZnJvbSBhbiBpbnRlcmFjdGl2ZSBzZXNzaW9uLCByYXRoZXIgdGhhbiBhcyBhIHNjcmlwdCB1bmRlciB0aGUgc2VydmVyLgotICBJZiB5b3UgZ2V0IGVycm9yIG1lc3NhZ2VzLCB0aGlzIGlzIGFsbW9zdCBjZXJ0YWlubHkgdGhlIGNhdXNlIG9mIHRoZQotICAmcXVvdDtwcmVtYXR1cmUgZW5kIG9mIHNjcmlwdCBoZWFkZXJzJnF1b3Q7IG1lc3NhZ2UuICBFdmVuIGlmIHRoZSBDR0kgCi0gIHJ1bnMgZmluZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHJlbWVtYmVyIHRoYXQgdGhlIGVudmlyb25tZW50IGFuZAotICBwZXJtaXNzaW9ucyBtYXkgYmUgZGlmZmVyZW50IHdoZW4gcnVubmluZyB1bmRlciB0aGUgd2ViIHNlcnZlci4gIFRoZQotICBDR0kgY2FuIG9ubHkgYWNjZXNzIHJlc291cmNlcyBhbGxvd2VkIGZvciB0aGUgPEEgCi0gIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjdXNlciI+PENPREU+VXNlcjwvQ09ERT48L0E+IGFuZCAKLSAgPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNncm91cCI+PENPREU+R3JvdXA8L0NPREU+PC9BPiBzcGVjaWZpZWQgaW4gCi0gIHlvdXIgQXBhY2hlIGNvbmZpZ3VyYXRpb24uICBJbiBhZGRpdGlvbiwgdGhlIGVudmlyb25tZW50IHdpbGwgbm90IGJlIAotICB0aGUgc2FtZSBhcyB0aGUgb25lIHByb3ZpZGVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIGJ1dCBpdCBjYW4gYmUgCi0gIGFkanVzdGVkIHVzaW5nIHRoZSBkaXJlY3RpdmVzIHByb3ZpZGVkIGJ5IDxBIAotICBIUkVGPSIuLi9tb2QvbW9kX2Vudi5odG1sIj5tb2RfZW52PC9BPi4KLSAgPC9QPgotICA8UD4KLSAgVGhlIHNlY29uZCBtb3N0IGNvbW1vbiBjYXVzZSBvZiB0aGlzIChhc2lkZSBmcm9tIHBlb3BsZSBub3QKLSAgb3V0cHV0dGluZyB0aGUgcmVxdWlyZWQgaGVhZGVycyBhdCBhbGwpIGlzIGEgcmVzdWx0IG9mIGFuIGludGVyYWN0aW9uCi0gIHdpdGggUGVybCdzIG91dHB1dCBidWZmZXJpbmcuICBUbyBtYWtlIFBlcmwgZmx1c2ggaXRzIGJ1ZmZlcnMKLSAgYWZ0ZXIgZWFjaCBvdXRwdXQgc3RhdGVtZW50LCBpbnNlcnQgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnRzIGFyb3VuZAotICB0aGUgPENPREU+cHJpbnQ8L0NPREU+IG9yIDxDT0RFPndyaXRlPC9DT0RFPiBzdGF0ZW1lbnRzIHRoYXQgc2VuZCB5b3VyCi0gIEhUVFAgaGVhZGVyczoKLSAgPC9QPgotICA8UD4KLSAgPERMPgotICAgPEREPjxDT0RFPns8QlI+Ci0gICAgJm5ic3A7bG9jYWwgKCRvbGRiYXIpID0gJHw7PEJSPgotICAgICZuYnNwOyRjZmggPSBzZWxlY3QgKFNURE9VVCk7PEJSPgotICAgICZuYnNwOyR8ID0gMTs8QlI+Ci0gICAgJm5ic3A7IzxCUj4KLSAgICAmbmJzcDsjIHByaW50IHlvdXIgSFRUUCBoZWFkZXJzIGhlcmU8QlI+Ci0gICAgJm5ic3A7IzxCUj4KLSAgICAmbmJzcDskfCA9ICRvbGRiYXI7PEJSPgotICAgICZuYnNwO3NlbGVjdCAoJGNmaCk7PEJSPgotICAgIH08L0NPREU+Ci0gICA8L0REPgotICA8L0RMPgotICA8UD48L1A+Ci0gIDxQPgotICBUaGlzIGlzIGdlbmVyYWxseSBvbmx5IG5lY2Vzc2FyeSB3aGVuIHlvdSBhcmUgY2FsbGluZyBleHRlcm5hbAotICBwcm9ncmFtcyBmcm9tIHlvdXIgc2NyaXB0IHRoYXQgc2VuZCBvdXRwdXQgdG8gc3Rkb3V0LCBvciBpZiB0aGVyZSB3aWxsCi0gIGJlIGEgbG9uZyBkZWxheSBiZXR3ZWVuIHRoZSB0aW1lIHRoZSBoZWFkZXJzIGFyZSBzZW50IGFuZCB0aGUgYWN0dWFsCi0gIGNvbnRlbnQgc3RhcnRzIGJlaW5nIGVtaXR0ZWQuICBUbyBtYXhpbWl6ZSBwZXJmb3JtYW5jZSwgeW91IHNob3VsZAotICB0dXJuIGJ1ZmZlci1mbHVzaGluZyBiYWNrIDxFTT5vZmY8L0VNPiAod2l0aCA8Q09ERT4kfCA9IDA8L0NPREU+IG9yIHRoZQotICBlcXVpdmFsZW50KSBhZnRlciB0aGUgc3RhdGVtZW50cyB0aGF0IHNlbmQgdGhlIGhlYWRlcnMsIGFzIGRpc3BsYXllZAotICBhYm92ZS4KLSAgPC9QPgotICA8UD4KLSAgSWYgeW91ciBzY3JpcHQgaXNuJ3Qgd3JpdHRlbiBpbiBQZXJsLCBkbyB0aGUgZXF1aXZhbGVudCB0aGluZyBmb3IKLSAgd2hhdGV2ZXIgbGFuZ3VhZ2UgeW91IDxFTT5hcmU8L0VNPiB1c2luZyAoPEVNPmUuZy48L0VNPiwgZm9yIEMsIGNhbGwKLSAgPENPREU+ZmZsdXNoKCk8L0NPREU+IGFmdGVyIHdyaXRpbmcgdGhlIGhlYWRlcnMpLgotICA8L1A+Ci0gIDxQPgotICBBbm90aGVyIGNhdXNlIGZvciB0aGUgJnF1b3Q7cHJlbWF0dXJlIGVuZCBvZiBzY3JpcHQgaGVhZGVycyZxdW90OwotICBtZXNzYWdlIGFyZSB0aGUgUkxpbWl0Q1BVIGFuZCBSTGltaXRNRU0gZGlyZWN0aXZlcy4gWW91IG1heQotICBnZXQgdGhlIG1lc3NhZ2UgaWYgdGhlIENHSSBzY3JpcHQgd2FzIGtpbGxlZCBkdWUgdG8gYQotICByZXNvdXJjZSBsaW1pdC4KLSAgPC9QPgotICA8UD4KLSAgSW4gYWRkaXRpb24sIGEgY29uZmlndXJhdGlvbiBwcm9ibGVtIGluIDxBCi0gIEhSRUY9Ii4uL3N1ZXhlYy5odG1sIj5zdUVYRUM8L0E+LCBtb2RfcGVybCwgb3IgYW5vdGhlciB0aGlyZCBwYXJ0eQotICBtb2R1bGUgY2FuIG9mdGVuIGludGVyZmVyZSB3aXRoIHRoZSBleGVjdXRpb24gb2YgeW91ciBDR0kgYW5kIGNhdXNlCi0gIHRoZSAmcXVvdDtwcmVtYXR1cmUgZW5kIG9mIHNjcmlwdCBoZWFkZXJzJnF1b3Q7IG1lc3NhZ2UuCi0gIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0iUE9TVG5vdGFsbG93ZWQiPgotICAgICAgPFNUUk9ORz5XaHkgZG8gSSBrZWVwIGdldHRpbmcgJnF1b3Q7TWV0aG9kIE5vdCBBbGxvd2VkJnF1b3Q7IGZvciAKLSAgICAgIGZvcm0gUE9TVCByZXF1ZXN0cz88L1NUUk9ORz4KLSAgICAgPC9BPgotICA8UD4KLSAgVGhpcyBpcyBhbG1vc3QgYWx3YXlzIGR1ZSB0byBBcGFjaGUgbm90IGJlaW5nIGNvbmZpZ3VyZWQgdG8gdHJlYXQgdGhlCi0gIGZpbGUgeW91IGFyZSB0cnlpbmcgdG8gUE9TVCB0byBhcyBhIENHSSBzY3JpcHQuICBZb3UgY2FuIG5vdCBQT1NUIAotICB0byBhIG5vcm1hbCBIVE1MIGZpbGU7IHRoZSBvcGVyYXRpb24gaGFzIG5vIG1lYW5pbmcuICBTZWUgdGhlIEZBUSAKLSAgZW50cnkgb24gPEEgSFJFRj0iI0NHSW91dHNpZGVTY3JpcHRBbGlhcyI+Q0dJcyBvdXRzaWRlIFNjcmlwdEFsaWFzZWQKLSAgZGlyZWN0b3JpZXM8L0E+IGZvciBkZXRhaWxzIG9uIGhvdyB0byBjb25maWd1cmUgQXBhY2hlIHRvIHRyZWF0IHRoZQotICBmaWxlIGluIHF1ZXN0aW9uIGFzIGEgQ0dJLgotICA8L1A+Ci0gIDxIUj4KLSA8L0xJPgotCi0gPExJPjxBIE5BTUU9Im5waC1zY3JpcHRzIj4KLSAgICAgIDxTVFJPTkc+SG93IGNhbiBJIGdldCBteSBzY3JpcHQncyBvdXRwdXQgd2l0aG91dCBBcGFjaGUgYnVmZmVyaW5nCi0gICAgICBpdD8gIFdoeSBkb2Vzbid0IG15IHNlcnZlciBwdXNoIHdvcms/PC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+Ci0gIEFzIG9mIEFwYWNoZSAxLjMsIENHSSBzY3JpcHRzIGFyZSBlc3NlbnRpYWxseSBub3QgYnVmZmVyZWQuICBFdmVyeSB0aW1lCi0gIHlvdXIgc2NyaXB0IGRvZXMgYSAiZmx1c2giIHRvIG91dHB1dCBkYXRhLCB0aGF0IGRhdGEgZ2V0cyByZWxheWVkIG9uIHRvCi0gIHRoZSBjbGllbnQuICBTb21lIHNjcmlwdGluZyBsYW5ndWFnZXMsIGZvciBleGFtcGxlIFBlcmwsIGhhdmUgdGhlaXIgb3duCi0gIGJ1ZmZlcmluZyBmb3Igb3V0cHV0IC0gdGhpcyBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUgPENPREU+JHw8L0NPREU+Ci0gIHNwZWNpYWwgdmFyaWFibGUgdG8gMS4gIE9mIGNvdXJzZSB0aGlzIGRvZXMgaW5jcmVhc2UgdGhlIG92ZXJhbGwgbnVtYmVyCi0gIG9mIHBhY2tldHMgYmVpbmcgdHJhbnNtaXR0ZWQsIHdoaWNoIGNhbiByZXN1bHQgaW4gYSBzZW5zZSBvZiBzbG93bmVzcyBmb3IgCi0gIHRoZSBlbmQgdXNlci4KLSAgPC9QPgotICA8UD5QcmlvciB0byAxLjMsIHlvdSBuZWVkZWQgdG8gdXNlICJucGgtIiBzY3JpcHRzIHRvIGFjY29tcGxpc2gKLSAgbm9uLWJ1ZmZlcmluZy4gIFRvZGF5LCB0aGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gbnBoIHNjcmlwdHMgYW5kCi0gIG5vcm1hbCBzY3JpcHRzIGlzIHRoYXQgbnBoIHNjcmlwdHMgcmVxdWlyZSB0aGUgZnVsbCBIVFRQIGhlYWRlcnMgdG8KLSAgYmUgc2VudC4KLSAgPC9QPgotICA8SFI+Ci0gPC9MST4KLQotIDxMST48QSBOQU1FPSJjZ2ktc3BlYyI+Ci0gICAgICA8U1RST05HPldoZXJlIGNhbiBJIGZpbmQgdGhlICZxdW90O0NHSSBzcGVjaWZpY2F0aW9uJnF1b3Q7PzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBUaGUgQ29tbW9uIEdhdGV3YXkgSW50ZXJmYWNlIChDR0kpIHNwZWNpZmljYXRpb24gY2FuIGJlIGZvdW5kIGF0Ci0gIHRoZSBvcmlnaW5hbCBOQ1NBIHNpdGUgCi0gICZsdDs8QSBIUkVGPSJodHRwOi8vaG9vaG9vLm5jc2EudWl1Yy5lZHUvY2dpL2ludGVyZmFjZS5odG1sIj4KLSAgPFNBTVA+aHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS9pbnRlcmZhY2UuaHRtbDwvU0FNUD48L0E+Jmd0Oy4KLSAgVGhpcyB2ZXJzaW9uIGhhc24ndCBiZWVuIHVwZGF0ZWQgc2luY2UgMTk5NSwgYW5kIHRoZXJlIGhhdmUgYmVlbgotICBzb21lIGVmZm9ydHMgdG8gdXBkYXRlIGl0LiAgCi0gIDwvUD4KLSAgPFA+Ci0gIEEgbmV3IGRyYWZ0IGlzIGJlaW5nIHdvcmtlZCBvbiB3aXRoIHRoZSBpbnRlbnQgb2YgbWFraW5nIGl0IGFuIGluZm9ybWF0aW9uYWwKLSAgUkZDOyB5b3UgY2FuIGZpbmQgb3V0IG1vcmUgYWJvdXQgdGhpcyBwcm9qZWN0IGF0Ci0gICZsdDs8QSBIUkVGPSJodHRwOi8vd2ViLmdvbHV4LmNvbS9jb2FyL2NnaS8iCi0gICAgICA+PFNBTVA+aHR0cDovL3dlYi5nb2x1eC5jb20vY29hci9jZ2kvPC9TQU1QPjwvQT4mZ3Q7LgotICA8L1A+Ci0gIDxIUj4KLSA8L0xJPgotCi0gPExJPjxBIE5BTUU9ImZhc3RjZ2kiPgotICAgICAgPFNUUk9ORz5XaHkgaXNuJ3QgRmFzdENHSSBpbmNsdWRlZCB3aXRoIEFwYWNoZSBhbnkgbW9yZT88L1NUUk9ORz4KLSAgICAgPC9BPgotICA8UD4KLSAgVGhlIHNpbXBsZSBhbnN3ZXIgaXMgdGhhdCBpdCB3YXMgYmVjb21pbmcgdG9vIGRpZmZpY3VsdCB0byBrZWVwIHRoZQotICB2ZXJzaW9uIGJlaW5nIGluY2x1ZGVkIHdpdGggQXBhY2hlIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtYXN0ZXIgY29weQotICBhdCB0aGUKLSAgPEEgSFJFRj0iaHR0cDovL3d3dy5mYXN0Y2dpLmNvbS8iCi0gID5GYXN0Q0dJIHdlYiBzaXRlPC9BPi4gIFdoZW4gYSBuZXcgdmVyc2lvbiBvZiBBcGFjaGUgd2FzIHJlbGVhc2VkLCB0aGUKLSAgdmVyc2lvbiBvZiB0aGUgRmFzdENHSSBtb2R1bGUgaW5jbHVkZWQgd2l0aCBpdCB3b3VsZCBzb29uIGJlIG91dCBvZiBkYXRlLgotICA8L1A+Ci0gIDxQPgotICBZb3UgY2FuIHN0aWxsIG9idGFpbiB0aGUgRmFzdENHSSBtb2R1bGUgZm9yIEFwYWNoZSBmcm9tIHRoZSBtYXN0ZXIKLSAgRmFzdENHSSB3ZWIgc2l0ZS4KLSAgPC9QPgotICA8SFI+Ci0gPC9MST4KLQotIDxMST48QSBOQU1FPSJzc2ktcGFydC1pIj4KLSAgICAgIDxTVFJPTkc+SG93IGRvIEkgZW5hYmxlIFNTSSAocGFyc2VkIEhUTUwpPzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBTU0kgKGFuIGFjcm9ueW0gZm9yIFNlcnZlci1TaWRlIEluY2x1ZGUpIGRpcmVjdGl2ZXMgYWxsb3cgc3RhdGljIEhUTUwKLSAgZG9jdW1lbnRzIHRvIGJlIGVuaGFuY2VkIGF0IHJ1bi10aW1lICg8RU0+ZS5nLjwvRU0+LCB3aGVuIGRlbGl2ZXJlZCB0bwotICBhIGNsaWVudCBieSBBcGFjaGUpLiAgVGhlIGZvcm1hdCBvZiBTU0kgZGlyZWN0aXZlcyBpcyBjb3ZlcmVkCi0gIGluIHRoZSA8QSBIUkVGPSIuLi9tb2QvbW9kX2luY2x1ZGUuaHRtbCI+bW9kX2luY2x1ZGUgbWFudWFsPC9BPjsKLSAgc3VmZmljZSBpdCB0byBzYXkgdGhhdCBBcGFjaGUgc3VwcG9ydHMgbm90IG9ubHkgU1NJIGJ1dAotICB4U1NJIChlWHRlbmRlZCBTU0kpIGRpcmVjdGl2ZXMuCi0gIDwvUD4KLSAgPFA+Ci0gIFByb2Nlc3NpbmcgYSBkb2N1bWVudCBhdCBydW4tdGltZSBpcyBjYWxsZWQgPEVNPnBhcnNpbmc8L0VNPiBpdDsgaGVuY2UKLSAgdGhlIHRlcm0gJnF1b3Q7cGFyc2VkIEhUTUwmcXVvdDsgc29tZXRpbWVzIHVzZWQgZm9yIGRvY3VtZW50cyB0aGF0Ci0gIGNvbnRhaW4gU1NJIGluc3RydWN0aW9ucy4gIFBhcnNpbmcgdGVuZHMgdG8gYmUgPEVNPmV4dHJlbWVseTwvRU0+Ci0gIHJlc291cmNlLWNvbnN1bXB0aXZlLCBhbmQgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdC4gIEl0IGNhbiBhbHNvCi0gIGludGVyZmVyZSB3aXRoIHRoZSBjYWNoYWJpbGl0eSBvZiB5b3VyIGRvY3VtZW50cywgd2hpY2ggY2FuIHB1dCBhCi0gIGZ1cnRoZXIgbG9hZCBvbiB5b3VyIHNlcnZlci4gIChzZWUgdGhlCi0gIDxBIEhSRUY9IiNzc2ktcGFydC1paSI+bmV4dCBxdWVzdGlvbjwvQT4gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcy4pCi0gIDwvUD4KLSAgPFA+Ci0gIFRvIGVuYWJsZSBTU0kgcHJvY2Vzc2luZywgeW91IG5lZWQgdG8KLSAgPC9QPgotICA8VUw+Ci0gICA8TEk+QnVpbGQgeW91ciBzZXJ2ZXIgd2l0aCB0aGUKLSAgICA8QSBIUkVGPSIuLi9tb2QvbW9kX2luY2x1ZGUuaHRtbCI+PFNBTVA+bW9kX2luY2x1ZGU8L1NBTVA+PC9BPgotICAgIG1vZHVsZS4gIFRoaXMgaXMgbm9ybWFsbHkgY29tcGlsZWQgaW4gYnkgZGVmYXVsdC4KLSAgIDwvTEk+Ci0gICA8TEk+TWFrZSBzdXJlIHlvdXIgc2VydmVyIGNvbmZpZ3VyYXRpb24gZmlsZXMgaGF2ZSBhbgotICAgIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjb3B0aW9ucyI+PFNBTVA+T3B0aW9uczwvU0FNUD48L0E+Ci0gICAgZGlyZWN0aXZlIHdoaWNoIHBlcm1pdHMgPFNBTVA+SW5jbHVkZXM8L1NBTVA+LgotICAgPC9MST4KLSAgIDxMST5NYWtlIHN1cmUgdGhhdCB0aGUgZGlyZWN0b3J5IHdoZXJlIHlvdSB3YW50IHRoZSBTU0kgZG9jdW1lbnRzIHRvCi0gICAgbGl2ZSBpcyBjb3ZlcmVkIGJ5IHRoZSAmcXVvdDtzZXJ2ZXItcGFyc2VkJnF1b3Q7IGNvbnRlbnQgaGFuZGxlciwKLSAgICBlaXRoZXIgZXhwbGljaXRseSBvciBpbiBzb21lIGFuY2VzdHJhbCBsb2NhdGlvbi4gIFRoYXQgY2FuIGJlIGRvbmUKLSAgICB3aXRoIHRoZSBmb2xsb3dpbmcKLSAgICA8QSBIUkVGPSIuLi9tb2QvbW9kX21pbWUuaHRtbCNhZGRoYW5kbGVyIj48U0FNUD5BZGRIYW5kbGVyPC9TQU1QPjwvQT4KLSAgICBkaXJlY3RpdmU6Ci0gICAgPFA+Ci0gICAgPERMPgotICAgICA8REQ+PENPREU+QWRkSGFuZGxlciBzZXJ2ZXItcGFyc2VkIC5zaHRtbDwvQ09ERT4KLSAgICAgPC9ERD4KLSAgICA8L0RMPgotICAgIDxQPjwvUD4KLSAgICA8UD4KLSAgICBUaGlzIGluZGljYXRlcyB0aGF0IGFsbCBmaWxlcyBlbmRpbmcgaW4gJnF1b3Q7LnNodG1sJnF1b3Q7IGluIHRoYXQKLSAgICBsb2NhdGlvbiAob3IgaXRzIGRlc2NlbmRhbnRzKSBzaG91bGQgYmUgcGFyc2VkLiAgTm90ZSB0aGF0IHVzaW5nCi0gICAgJnF1b3Q7Lmh0bWwmcXVvdDsgd2lsbCBjYXVzZSBhbGwgbm9ybWFsIEhUTUwgZmlsZXMgdG8gYmUgcGFyc2VkLAotICAgIHdoaWNoIG1heSBwdXQgYW4gaW5vcmRpbmF0ZSBsb2FkIG9uIHlvdXIgc2VydmVyLgotICAgIDwvUD4KLSAgIDwvTEk+Ci0gIDwvVUw+Ci0gIDxQPgotICBGb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgc2VlIHRoZSA8Q0lURT5BcGFjaGUgV2VlazwvQ0lURT4gYXJ0aWNsZSBvbgotICA8QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZXdlZWsuY29tL2ZlYXR1cmVzL3NzaSIgUkVMPSJIZWxwIgotICA+PENJVEU+VXNpbmcgU2VydmVyIFNpZGUgSW5jbHVkZXM8L0NJVEU+PC9BPi4KLSAgPC9QPgotICA8SFI+Ci0gPC9MST4KLQotIDxMST48QSBOQU1FPSJzc2ktcGFydC1paSI+Ci0gICAgICA8U1RST05HPldoeSBkb24ndCBteSBwYXJzZWQgZmlsZXMgZ2V0IGNhY2hlZD88L1NUUk9ORz4KLSAgICAgPC9BPgotICA8UD4KLSAgU2luY2UgdGhlIHNlcnZlciBpcyBwZXJmb3JtaW5nIHJ1bi10aW1lIHByb2Nlc3Npbmcgb2YgeW91ciBTU0kKLSAgZGlyZWN0aXZlcywgd2hpY2ggbWF5IGNoYW5nZSB0aGUgY29udGVudCBzaGlwcGVkIHRvIHRoZSBjbGllbnQsIGl0Ci0gIGNhbid0IGtub3cgYXQgdGhlIHRpbWUgaXQgc3RhcnRzIHBhcnNpbmcgd2hhdCB0aGUgZmluYWwgc2l6ZSBvZiB0aGUKLSAgcmVzdWx0IHdpbGwgYmUsIG9yIHdoZXRoZXIgdGhlIHBhcnNlZCByZXN1bHQgd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUuCi0gIFRoaXMgbWVhbnMgdGhhdCBpdCBjYW4ndCBnZW5lcmF0ZSA8U0FNUD5Db250ZW50LUxlbmd0aDwvU0FNUD4gb3IKLSAgPFNBTVA+TGFzdC1Nb2RpZmllZDwvU0FNUD4gaGVhZGVycy4gIENhY2hlcyBjb21tb25seSB3b3JrIGJ5IGNvbXBhcmluZwotICB0aGUgPFNBTVA+TGFzdC1Nb2RpZmllZDwvU0FNUD4gb2Ygd2hhdCdzIGluIHRoZSBjYWNoZSB3aXRoIHRoYXQgYmVpbmcKLSAgZGVsaXZlcmVkIGJ5IHRoZSBzZXJ2ZXIuICBTaW5jZSB0aGUgc2VydmVyIGlzbid0IHNlbmRpbmcgdGhhdCBoZWFkZXIKLSAgZm9yIGEgcGFyc2VkIGRvY3VtZW50LCB3aGF0ZXZlcidzIGRvaW5nIHRoZSBjYWNoaW5nIGNhbid0IHRlbGwgd2hldGhlcgotICB0aGUgZG9jdW1lbnQgaGFzIGNoYW5nZWQgb3Igbm90IC0gYW5kIHNvIGZldGNoZXMgaXQgYWdhaW4gdG8gYmUgb24gdGhlCi0gIHNhZmUgc2lkZS4KLSAgPC9QPgotICA8UD4KLSAgWW91IGNhbiB3b3JrIGFyb3VuZCB0aGlzIGluIHNvbWUgY2FzZXMgYnkgY2F1c2luZyBhbgotICA8U0FNUD5FeHBpcmVzPC9TQU1QPiBoZWFkZXIgdG8gYmUgZ2VuZXJhdGVkLiAgKFNlZSB0aGUKLSAgPEEgSFJFRj0iLi4vbW9kL21vZF9leHBpcmVzLmh0bWwiIFJFTD0iSGVscCI+PFNBTVA+bW9kX2V4cGlyZXM8L1NBTVA+PC9BPgotICBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuKSAgQW5vdGhlciBwb3NzaWJpbGl0eSBpcyB0byB1c2UgdGhlCi0gIDxBIEhSRUY9Ii4uL21vZC9tb2RfaW5jbHVkZS5odG1sI3hiaXRoYWNrIiBSRUw9IkhlbHAiCi0gID48U0FNUD5YQml0SGFjayBGdWxsPC9TQU1QPjwvQT4KLSAgbWVjaGFuaXNtLCB3aGljaCB0ZWxscyBBcGFjaGUgdG8gc2VuZCAodW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzCi0gIGRldGFpbGVkIGluIHRoZSBYQml0SGFjayBkaXJlY3RpdmUgZGVzY3JpcHRpb24pIGEKLSAgPFNBTVA+TGFzdC1Nb2RpZmllZDwvU0FNUD4gaGVhZGVyIGJhc2VkIHVwb24gdGhlIGxhc3QgbW9kaWZpY2F0aW9uCi0gIHRpbWUgb2YgdGhlIGZpbGUgYmVpbmcgcGFyc2VkLiAgTm90ZSB0aGF0IHRoaXMgbWF5IGFjdHVhbGx5IGJlIGx5aW5nCi0gIHRvIHRoZSBjbGllbnQgaWYgdGhlIHBhcnNlZCBmaWxlIGRvZXNuJ3QgY2hhbmdlIGJ1dCB0aGUgU1NJLWluc2VydGVkCi0gIGNvbnRlbnQgZG9lczsgaWYgdGhlIGluY2x1ZGVkIGNvbnRlbnQgY2hhbmdlcyBvZnRlbiwgdGhpcyBjYW4gcmVzdWx0Ci0gIGluIHN0YWxlIGNvcGllcyBiZWluZyBjYWNoZWQuCi0gIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0ic3NpLXBhcnQtaWlpIj4KLSAgICAgIDxTVFJPTkc+SG93IGNhbiBJIGhhdmUgbXkgc2NyaXB0IG91dHB1dCBwYXJzZWQ/PC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+Ci0gIFNvIHlvdSB3YW50IHRvIGluY2x1ZGUgU1NJIGRpcmVjdGl2ZXMgaW4gdGhlIG91dHB1dCBmcm9tIHlvdXIgQ0dJCi0gIHNjcmlwdCwgYnV0IGNhbid0IGZpZ3VyZSBvdXQgaG93IHRvIGRvIGl0PwotICBUaGUgc2hvcnQgYW5zd2VyIGlzICZxdW90O3lvdSBjYW4ndC4mcXVvdDsgIFRoaXMgaXMgcG90ZW50aWFsbHkKLSAgYSBzZWN1cml0eSBsaWFiaWxpdHkgYW5kLCBtb3JlIGltcG9ydGFudGx5LCBpdCBjYW4gbm90IGJlIGNsZWFubHkKLSAgaW1wbGVtZW50ZWQgdW5kZXIgdGhlIGN1cnJlbnQgc2VydmVyIEFQSS4gIFRoZSBiZXN0IHdvcmthcm91bmQKLSAgaXMgZm9yIHlvdXIgc2NyaXB0IGl0c2VsZiB0byBkbyB3aGF0IHRoZSBTU0lzIHdvdWxkIGJlIGRvaW5nLgotICBBZnRlciBhbGwsIGl0J3MgZ2VuZXJhdGluZyB0aGUgcmVzdCBvZiB0aGUgY29udGVudC4KLSAgPC9QPgotICA8UD4KLSAgVGhpcyBpcyBhIGZlYXR1cmUgVGhlIEFwYWNoZSBHcm91cCBob3BlcyB0byBhZGQgaW4gdGhlIG5leHQgbWFqb3IKLSAgcmVsZWFzZSBhZnRlciAxLjMuCi0gIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0ic3NpLXBhcnQtaXYiPgotICAgICAgPFNUUk9ORz5TU0lzIGRvbid0IHdvcmsgZm9yIFZpcnR1YWxIb3N0cyBhbmQvb3IgCi0gICAgICAgIHVzZXIgaG9tZSBkaXJlY3Rvcmllcy48L1NUUk9ORz4KLSAgICAgPC9BPgotICA8UD4KLSAgVGhpcyBpcyBhbG1vc3QgYWx3YXlzIGR1ZSB0byBoYXZpbmcgc29tZSBzZXR0aW5nIGluIHlvdXIgY29uZmlnIGZpbGUgdGhhdAotICBzZXRzICJPcHRpb25zIEluY2x1ZGVzIiBvciBzb21lIG90aGVyIHNldHRpbmcgZm9yIHlvdXIgRG9jdW1lbnRSb290Ci0gIGJ1dCBub3QgZm9yIG90aGVyIGRpcmVjdG9yaWVzLiAgSWYgeW91IHNldCBpdCBpbnNpZGUgYSBEaXJlY3RvcnkKLSAgc2VjdGlvbiwgdGhlbiB0aGF0IHNldHRpbmcgd2lsbCBvbmx5IGFwcGx5IHRvIHRoYXQgZGlyZWN0b3J5LiAgCi0gIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0iZXJyb3Jkb2Nzc2kiPgotICAgICAgPFNUUk9ORz5Ib3cgY2FuIEkgdXNlIDxDT0RFPkVycm9yRG9jdW1lbnQ8L0NPREU+Ci0gICAgICBhbmQgU1NJIHRvIHNpbXBsaWZ5IGN1c3RvbWl6ZWQgZXJyb3IgbWVzc2FnZXM/PC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+Ci0gIEhhdmUgYSBsb29rIGF0IDxBIEhSRUY9ImN1c3RvbV9lcnJvcmRvY3MuaHRtbCI+dGhpcyBkb2N1bWVudDwvQT4uCi0gIEl0IHNob3dzIGluIGV4YW1wbGUgZm9ybSBob3cgeW91IGNhbiBhIGNvbWJpbmF0aW9uIG9mIFhTU0kgYW5kCi0gIG5lZ290aWF0aW9uIHRvIHRhaWxvciBhIHNldCBvZiA8Q09ERT5FcnJvckRvY3VtZW50PC9DT0RFPnMgdG8geW91cgotICBwZXJzb25hbCB0YXN0ZSwgYW5kIHJldHVybmluZyBkaWZmZXJlbnQgaW50ZXJuYXRpb25hbGl6ZWQgZXJyb3IKLSAgcmVzcG9uc2VzIGJhc2VkIG9uIHRoZSBjbGllbnQncyBuYXRpdmUgbGFuZ3VhZ2UuCi0gIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0icmVtb3RlLXVzZXItdmFyIj4KLSAgICAgIDxTVFJPTkc+V2h5IGlzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAKLSAgICAgIDxTQU1QPlJFTU9URV9VU0VSPC9TQU1QPiBub3Qgc2V0PzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBUaGlzIHZhcmlhYmxlIGlzIHNldCBhbmQgdGh1cyBhdmFpbGFibGUgaW4gU1NJIG9yIENHSSBzY3JpcHRzIDxTVFJPTkc+aWYgYW5kCi0gIG9ubHkgaWY8L1NUUk9ORz4gdGhlIHJlcXVlc3RlZCBkb2N1bWVudCB3YXMgcHJvdGVjdGVkIGJ5IGFjY2VzcwotICBhdXRoZW50aWNhdGlvbi4gIEZvciBhbiBleHBsYW5hdGlvbiBvbiBob3cgdG8gaW1wbGVtZW50IHRoZXNlIHJlc3RyaWN0aW9ucywKLSAgc2VlCi0gIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hld2Vlay5jb20vIj48Q0lURT5BcGFjaGUgV2VlazwvQ0lURT48L0E+J3MKLSAgYXJ0aWNsZXMgb24KLSAgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGV3ZWVrLmNvbS9mZWF0dXJlcy91c2VyYXV0aCIKLSAgPjxDSVRFPlVzaW5nIFVzZXIgQXV0aGVudGljYXRpb248L0NJVEU+PC9BPgotICBvcgotICA8QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZXdlZWsuY29tL2ZlYXR1cmVzL2RibWF1dGgiCi0gID48Q0lURT5EQk0gVXNlciBBdXRoZW50aWNhdGlvbjwvQ0lURT48L0E+LgotICA8L1A+Ci0gIDxQPgotICBIaW50OiBXaGVuIHVzaW5nIGEgQ0dJIHNjcmlwdCB0byByZWNlaXZlIHRoZSBkYXRhIG9mIGEgSFRNTCA8U0FNUD5GT1JNPC9TQU1QPgotICBub3RpY2UgdGhhdCBwcm90ZWN0aW5nIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoZSA8U0FNUD5GT1JNPC9TQU1QPiBpcyBub3QKLSAgc3VmZmljaWVudCB0byBwcm92aWRlIDxTQU1QPlJFTU9URV9VU0VSPC9TQU1QPiB0byB0aGUgQ0dJIHNjcmlwdC4gIFlvdSBoYXZlCi0gIHRvIHByb3RlY3QgdGhlIENHSSBzY3JpcHQsIHRvby4gT3IgYWx0ZXJuYXRpdmVseSBvbmx5IHRoZSBDR0kgc2NyaXB0ICh0aGVuCi0gIGF1dGhlbnRpY2F0aW9uIGhhcHBlbnMgb25seSBhZnRlciBmaWxsaW5nIG91dCB0aGUgZm9ybSkuCi0gIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci0KLTwvT0w+Ci08IS0tI2VuZGlmIC0tPgotPCEtLSNpZiBleHByPSIkU1RBTkRBTE9ORSIgLS0+Ci0gIDwhLS0gRG9uJ3QgZm9yZ2V0IHRvIGFkZCBIUiB0YWdzIGF0IHRoZSBlbmQgb2YgZWFjaCBsaXN0IGl0ZW0uLiAtLT4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KLTwhLS0jZW5kaWYgLS0+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9taXNjL0ZBUS1HLmh0bWwgYi9kb2NzL21hbnVhbC9taXNjL0ZBUS1HLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NjFmZjQuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbWlzYy9GQVEtRy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcxICswLDAgQEAKLTwhLS0jaWYgZXhwcj0iJEZBUU1BU1RFUiIgLS0+Ci0gPCEtLSNzZXQgdmFyPSJTVEFOREFMT05FIiB2YWx1ZT0iIiAtLT4KLSA8IS0tI3NldCB2YXI9IklOQ0xVREVEIiB2YWx1ZT0iWUVTIiAtLT4KLSA8IS0tI2lmIGV4cHI9IiRRVUVSWV9TVFJJTkcgPSBUT0MiIC0tPgotICA8IS0tI3NldCB2YXI9IlRPQyIgdmFsdWU9IllFUyIgLS0+Ci0gIDwhLS0jc2V0IHZhcj0iQ09OVEVOVCIgdmFsdWU9IiIgLS0+Ci0gPCEtLSNlbHNlIC0tPgotICA8IS0tI3NldCB2YXI9IlRPQyIgdmFsdWU9IiIgLS0+Ci0gIDwhLS0jc2V0IHZhcj0iQ09OVEVOVCIgdmFsdWU9IllFUyIgLS0+Ci0gPCEtLSNlbmRpZiAtLT4KLTwhLS0jZWxzZSAtLT4KLSA8IS0tI3NldCB2YXI9IlNUQU5EQUxPTkUiIHZhbHVlPSJZRVMiIC0tPgotIDwhLS0jc2V0IHZhcj0iSU5DTFVERUQiIHZhbHVlPSIiIC0tPgotIDwhLS0jc2V0IHZhcj0iVE9DIiB2YWx1ZT0iIiAtLT4KLSA8IS0tI3NldCB2YXI9IkNPTlRFTlQiIHZhbHVlPSIiIC0tPgotPCEtLSNlbmRpZiAtLT4KLTwhLS0jaWYgZXhwcj0iJFNUQU5EQUxPTkUiIC0tPgotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci0gPEhFQUQ+Ci0gIDxUSVRMRT5BcGFjaGUgU2VydmVyIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC9USVRMRT4KLSA8L0hFQUQ+Ci08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci0gPEJPRFkKLSAgQkdDT0xPUj0iI0ZGRkZGRiIKLSAgVEVYVD0iIzAwMDAwMCIKLSAgTElOSz0iIzAwMDBGRiIKLSAgVkxJTks9IiMwMDAwODAiCi0gIEFMSU5LPSIjRkYwMDAwIgotID4KLSAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLSAgPEgxIEFMSUdOPSJDRU5URVIiPkFwYWNoZSBTZXJ2ZXIgRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L0gxPgotICA8UD4KLSAgJFJldmlzaW9uOiAxLjEgJCAoJERhdGU6IDE5OTkvMDYvMjQgMTU6MDI6NTIgJCkKLSAgPC9QPgotICA8UD4KLSAgVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgRkFRIGlzIGFsd2F5cyBhdmFpbGFibGUgZnJvbSB0aGUgbWFpbgotICBBcGFjaGUgd2ViIHNpdGUsIGF0Ci0gICZsdDs8QQotICAgICAgIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL21pc2MvRkFRLmh0bWwiCi0gICAgICAgUkVMPSJIZWxwIgotICAgICAgPjxTQU1QPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL21pc2MvRkFRLmh0bWw8L1NBTVA+PC9BPiZndDsuCi0gIDwvUD4KLTwhLS0gTm90ZXMgYWJvdXQgY2hhbmdlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAtIElmIGFkZGluZyBhIHJlbGF0aXZlIGxpbmsgdG8gYW5vdGhlciBwYXJ0IG9mIHRoZSAgICAgICAgICAgIC0tPgotPCEtLSAgICBkb2N1bWVudGF0aW9uLCAqZG8qIGluY2x1ZGUgdGhlICIuaHRtbCIgcG9ydGlvbi4gIFRoZXJlJ3MgYSAtLT4KLTwhLS0gICAgZ29vZCBjaGFuY2UgdGhhdCB0aGUgdXNlciB3aWxsIGJlIHJlYWRpbmcgdGhlIGRvY3VtZW50YXRpb24gLS0+Ci08IS0tICAgIG9uIGhpcyBvd24gc3lzdGVtLCB3aGljaCBtYXkgbm90IGJlIGNvbmZpZ3VyZWQgZm9yICAgICAgICAgIC0tPgotPCEtLSAgICBtdWx0aXZpZXdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gIC0gV2hlbiBhZGRpbmcgaXRlbXMsIG1ha2Ugc3VyZSB0aGV5J3JlIHB1dCBpbiB0aGUgcmlnaHQgcGxhY2UgLS0+Ci08IS0tICAgIC0gdmVyaWZ5IHRoYXQgdGhlIG51bWJlcmluZyBtYXRjaGVzIHVwLiAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgLSAqRG9uJ3QqIHVzZSA8UFJFPjwvUFJFPiBibG9ja3MgLSB0aGV5IGRvbid0IGFwcGVhciAgICAgICAgICAtLT4KLTwhLS0gICAgY29ycmVjdGx5IGluIGEgcmVsaWFibGUgd2F5IHdoZW4gdGhpcyBpcyBjb252ZXJ0ZWQgdG8gdGV4dCAgLS0+Ci08IS0tICAgIHdpdGggTHlueC4gIFVzZSA8REw+PEREPjxDT0RFPnh4eDxCUj54eDwvQ09ERT48L0REPjwvREw+ICAgIC0tPgotPCEtLSAgICBibG9ja3MgaW5zaWRlIGEgPFA+PC9QPiBpbnN0ZWFkLiAgVGhpcyBpcyBuZWNlc3NhcnkgdG8gZ2V0ICAtLT4KLTwhLS0gICAgdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGluZGVudGluZyByaWdodC4gICAgICAgICAgICAgICAgLS0+Ci08IS0tICAtIERvbid0IGZvcmdldCB0byBpbmNsdWRlIGFuIEhSIHRhZyBhZnRlciB0aGUgbGFzdCAvUCB0YWcgICAgIC0tPgotPCEtLSAgICBidXQgYmVmb3JlIHRoZSAvTEkgaW4gYW4gaXRlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPFA+Ci0gIElmIHlvdSBhcmUgcmVhZGluZyBhIHRleHQtb25seSB2ZXJzaW9uIG9mIHRoaXMgRkFRLCB5b3UgbWF5IGZpbmQgbnVtYmVycwotICBlbmNsb3NlZCBpbiBicmFja2V0cyAoc3VjaCBhcyAmcXVvdDtbMTJdJnF1b3Q7KS4gIFRoZXNlIHJlZmVyIHRvIHRoZSBsaXN0IG9mCi0gIHJlZmVyZW5jZSBVUkxzIHRvIGJlIGZvdW5kIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LiAgVGhlc2UgcmVmZXJlbmNlcwotICBkbyBub3QgYXBwZWFyLCBhbmQgYXJlIG5vdCBuZWVkZWQsIGZvciB0aGUgaHlwZXJ0ZXh0IHZlcnNpb24uCi0gIDwvUD4KLSAgPEgyPlRoZSBRdWVzdGlvbnM8L0gyPgotPE9MIFRZUEU9IkEiPgotPCEtLSNlbmRpZiAtLT4KLTwhLS0jaWYgZXhwcj0iJFRPQyB8fCAkU1RBTkRBTE9ORSIgLS0+Ci0gPExJIFZBTFVFPSI3Ij48U1RST05HPkF1dGhlbnRpY2F0aW9uIGFuZCBBY2Nlc3MgUmVzdHJpY3Rpb25zPC9TVFJPTkc+Ci0gIDxPTD4KLSAgIDxMST48QSBIUkVGPSIjZG5zYXV0aCI+V2h5IGlzbid0IHJlc3RyaWN0aW5nIGFjY2VzcyBieSBob3N0IG9yIGRvbWFpbiBuYW1lCi0gICAgICAgIHdvcmtpbmcgY29ycmVjdGx5PzwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI3VzZXItYXV0aGVudGljYXRpb24iPkhvdyBkbyBJIHNldCB1cCBBcGFjaGUgdG8gcmVxdWlyZQotICAgICAgICBhIHVzZXJuYW1lIGFuZCBwYXNzd29yZCB0byBhY2Nlc3MgY2VydGFpbiBkb2N1bWVudHM/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjcmVtb3RlLWF1dGgtb25seSI+SG93IGRvIEkgc2V0IHVwIEFwYWNoZSB0byBhbGxvdyBhY2Nlc3MKLSAgICAgICAgdG8gY2VydGFpbiBkb2N1bWVudHMgb25seSBpZiBhIHNpdGUgaXMgZWl0aGVyIGEgbG9jYWwgc2l0ZQotICAgICAgICA8RU0+b3I8L0VNPiB0aGUgdXNlciBzdXBwbGllcyBhIHBhc3N3b3JkIGFuZCB1c2VybmFtZT88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNhdXRoYXV0aG9yaXRhdGl2ZSI+V2h5IGRvZXMgbXkgYXV0aGVudGljYXRpb24gZ2l2ZQotICAgICAgICBtZSBhIHNlcnZlciBlcnJvcj88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNhdXRoLW9uLXNhbWUtbWFjaGluZSI+RG8gSSBoYXZlIHRvIGtlZXAgdGhlIChtU1FMKQotICAgICAgICBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBvbiB0aGUgc2FtZSBtYWNoaW5lPzwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI21zcWwtc2xvdyI+V2h5IGlzIG15IG1TUUwgYXV0aGVudGljYXRpb24gdGVycmlibHkgc2xvdz88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNwYXNzd2RhdXRoIj5DYW4gSSB1c2UgbXkgPFNBTVA+L2V0Yy9wYXNzd2Q8L1NBTVA+IGZpbGUKLSAgICAgICAgZm9yIFdlYiBwYWdlIGF1dGhlbnRpY2F0aW9uPzwvQT4KLSAgIDwvTEk+Ci0gIDwvT0w+Ci0gPC9MST4KLTwhLS0jZW5kaWYgLS0+Ci08IS0tI2lmIGV4cHI9IiRTVEFOREFMT05FIiAtLT4KLTwvT0w+Ci0KLTxIUj4KLQotICA8SDI+VGhlIEFuc3dlcnM8L0gyPgotPCEtLSNlbmRpZiAtLT4KLTwhLS0jaWYgZXhwcj0iISAkVE9DIiAtLT4KLSAgPEgzPkcuIEF1dGhlbnRpY2F0aW9uIGFuZCBBY2Nlc3MgUmVzdHJpY3Rpb25zPC9IMz4KLTxPTD4KLQotIDxMST48QSBOQU1FPSJkbnNhdXRoIj4KLSAgICAgIDxTVFJPTkc+V2h5IGlzbid0IHJlc3RyaWN0aW5nIGFjY2VzcyBieSBob3N0IG9yIGRvbWFpbiBuYW1lCi0gICAgICB3b3JraW5nIGNvcnJlY3RseT88L1NUUk9ORz4KLSAgICAgPC9BPgotICA8UD4KLSAgVHdvIG9mIHRoZSBtb3N0IGNvbW1vbiBjYXVzZXMgb2YgdGhpcyBhcmU6Ci0gIDwvUD4KLSAgPE9MPgotICAgPExJPjxTVFJPTkc+QW4gZXJyb3IsIGluY29uc2lzdGVuY3ksIG9yIHVuZXhwZWN0ZWQgbWFwcGluZyBpbiB0aGUgRE5TCi0gICAgcmVnaXN0cmF0aW9uPC9TVFJPTkc+Ci0gICAgPEJSPgotICAgIFRoaXMgaGFwcGVucyBmcmVxdWVudGx5OiB5b3VyIGNvbmZpZ3VyYXRpb24gcmVzdHJpY3RzIGFjY2VzcyB0bwotICAgIDxTQU1QPkhvc3QuRm9vQmFyLkNvbTwvU0FNUD4sIGJ1dCB5b3UgY2FuJ3QgZ2V0IGluIGZyb20gdGhhdCBob3N0LgotICAgIFRoZSB1c3VhbCByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCA8U0FNUD5Ib3N0LkZvb0Jhci5Db208L1NBTVA+IGlzCi0gICAgYWN0dWFsbHkgYW4gYWxpYXMgZm9yIGFub3RoZXIgbmFtZSwgYW5kIHdoZW4gQXBhY2hlIHBlcmZvcm1zIHRoZQotICAgIGFkZHJlc3MtdG8tbmFtZSBsb29rdXAgaXQncyBnZXR0aW5nIHRoZSA8RU0+cmVhbDwvRU0+IG5hbWUsIG5vdAotICAgIDxTQU1QPkhvc3QuRm9vQmFyLkNvbTwvU0FNUD4uICBZb3UgY2FuIHZlcmlmeSB0aGlzIGJ5IGNoZWNraW5nIHRoZQotICAgIHJldmVyc2UgbG9va3VwIHlvdXJzZWxmLiAgVGhlIGVhc2llc3Qgd2F5IHRvIHdvcmsgYXJvdW5kIGl0IGlzIHRvCi0gICAgc3BlY2lmeSB0aGUgY29ycmVjdCBob3N0IG5hbWUgaW4geW91ciBjb25maWd1cmF0aW9uLgotICAgPC9MST4KLSAgIDxMST48U1RST05HPkluYWRlcXVhdGUgY2hlY2tpbmcgYW5kIHZlcmlmaWNhdGlvbiBpbiB5b3VyCi0gICAgY29uZmlndXJhdGlvbiBvZiBBcGFjaGU8L1NUUk9ORz4KLSAgICA8QlI+Ci0gICAgSWYgeW91IGludGVuZCB0byBwZXJmb3JtIGFjY2VzcyBjaGVja2luZyBhbmQgcmVzdHJpY3Rpb24gYmFzZWQgdXBvbgotICAgIHRoZSBjbGllbnQncyBob3N0IG9yIGRvbWFpbiBuYW1lLCB5b3UgcmVhbGx5IG5lZWQgdG8gY29uZmlndXJlCi0gICAgQXBhY2hlIHRvIGRvdWJsZS1jaGVjayB0aGUgb3JpZ2luIGluZm9ybWF0aW9uIGl0J3Mgc3VwcGxpZWQuICBZb3UgZG8KLSAgICB0aGlzIGJ5IGFkZGluZyB0aGUgPFNBTVA+LURNQVhJTVVNX0ROUzwvU0FNUD4gY2xhdXNlIHRvIHRoZQotICAgIDxTQU1QPkVYVFJBX0NGTEFHUzwvU0FNUD4gZGVmaW5pdGlvbiBpbiB5b3VyCi0gICAgPFNBTVA+Q29uZmlndXJhdGlvbjwvU0FNUD4gZmlsZS4gIEZvciBleGFtcGxlOgotICAgIDxQPgotICAgIDxETD4KLSAgICAgPEREPjxDT0RFPkVYVFJBX0NGTEFHUz0tRE1BWElNVU1fRE5TPC9DT0RFPgotICAgICA8L0REPgotICAgIDwvREw+Ci0gICAgPFA+PC9QPgotICAgIDxQPgotICAgIFRoaXMgd2lsbCBjYXVzZSBBcGFjaGUgdG8gYmUgdmVyeSBwYXJhbm9pZCBhYm91dCBtYWtpbmcgc3VyZSBhCi0gICAgcGFydGljdWxhciBob3N0IGFkZHJlc3MgaXMgPEVNPnJlYWxseTwvRU0+IGFzc2lnbmVkIHRvIHRoZSBuYW1lIGl0Ci0gICAgY2xhaW1zIHRvIGJlLiAgTm90ZSB0aGF0IHRoaXMgPEVNPmNhbjwvRU0+IGluY3VyIGEgc2lnbmlmaWNhbnQKLSAgICBwZXJmb3JtYW5jZSBwZW5hbHR5LCBob3dldmVyLCBiZWNhdXNlIG9mIGFsbCB0aGUgbmFtZSByZXNvbHV0aW9uCi0gICAgcmVxdWVzdHMgYmVpbmcgc2VudCB0byBhIG5hbWVzZXJ2ZXIuCi0gICAgPC9QPgotICAgPC9MST4KLSAgPC9PTD4KLSAgPEhSPgotIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0idXNlci1hdXRoZW50aWNhdGlvbiI+Ci0gICAgICA8U1RST05HPkhvdyBkbyBJIHNldCB1cCBBcGFjaGUgdG8gcmVxdWlyZSBhIHVzZXJuYW1lIGFuZAotICAgICAgcGFzc3dvcmQgdG8gYWNjZXNzIGNlcnRhaW4gZG9jdW1lbnRzPzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBUaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIGRvIHRoaXM7IHNvbWUgb2YgdGhlIG1vcmUgcG9wdWxhcgotICBvbmVzIGFyZSB0byB1c2UgdGhlIDxBIEhSRUY9Ii4uL21vZC9tb2RfYXV0aC5odG1sIj5tb2RfYXV0aDwvQT4sCi0gIDxBIEhSRUY9Ii4uL21vZC9tb2RfYXV0aF9kYi5odG1sIj5tb2RfYXV0aF9kYjwvQT4sIG9yCi0gIDxBIEhSRUY9Ii4uL21vZC9tb2RfYXV0aF9kYm0uaHRtbCI+bW9kX2F1dGhfZGJtPC9BPiBtb2R1bGVzLgotICA8L1A+Ci0gIDxQPgotICBGb3IgYW4gZXhwbGFuYXRpb24gb24gaG93IHRvIGltcGxlbWVudCB0aGVzZSByZXN0cmljdGlvbnMsIHNlZQotICA8QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZXdlZWsuY29tLyI+PENJVEU+QXBhY2hlIFdlZWs8L0NJVEU+PC9BPidzCi0gIGFydGljbGVzIG9uCi0gIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hld2Vlay5jb20vZmVhdHVyZXMvdXNlcmF1dGgiCi0gID48Q0lURT5Vc2luZyBVc2VyIEF1dGhlbnRpY2F0aW9uPC9DSVRFPjwvQT4KLSAgb3IKLSAgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGV3ZWVrLmNvbS9mZWF0dXJlcy9kYm1hdXRoIgotICA+PENJVEU+REJNIFVzZXIgQXV0aGVudGljYXRpb248L0NJVEU+PC9BPi4KLSAgPC9QPgotICA8SFI+Ci0gPC9MST4KLQotIDxMST48QSBOQU1FPSJyZW1vdGUtYXV0aC1vbmx5Ij4KLSAgICAgIDxTVFJPTkc+SG93IGRvIEkgc2V0IHVwIEFwYWNoZSB0byBhbGxvdyBhY2Nlc3MgdG8gY2VydGFpbgotICAgICAgZG9jdW1lbnRzIG9ubHkgaWYgYSBzaXRlIGlzIGVpdGhlciBhIGxvY2FsIHNpdGUgPEVNPm9yPC9FTT4KLSAgICAgIHRoZSB1c2VyIHN1cHBsaWVzIGEgcGFzc3dvcmQgYW5kIHVzZXJuYW1lPzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBVc2UgdGhlIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjc2F0aXNmeSI+U2F0aXNmeTwvQT4gZGlyZWN0aXZlLAotICBpbiBwYXJ0aWN1bGFyIHRoZSA8Q09ERT5TYXRpc2Z5IEFueTwvQ09ERT4gZGlyZWN0aXZlLCB0byByZXF1aXJlCi0gIHRoYXQgb25seSBvbmUgb2YgdGhlIGFjY2VzcyByZXN0cmljdGlvbnMgYmUgbWV0LiAgRm9yIGV4YW1wbGUsCi0gIGFkZGluZyB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gdG8gYSA8U0FNUD4uaHRhY2Nlc3M8L1NBTVA+Ci0gIG9yIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGUgd291bGQgcmVzdHJpY3QgYWNjZXNzIHRvIHBlb3BsZSB3aG8KLSAgZWl0aGVyIGFyZSBhY2Nlc3NpbmcgdGhlIHNpdGUgZnJvbSBhIGhvc3QgdW5kZXIgZG9tYWluLmNvbSBvcgotICB3aG8gY2FuIHN1cHBseSBhIHZhbGlkIHVzZXJuYW1lIGFuZCBwYXNzd29yZDoKLSAgPC9QPgotICA8UD4KLSAgPERMPgotICAgPEREPjxDT0RFPmRlbnkgZnJvbSBhbGwKLSAgICA8QlI+Ci0gICAgYWxsb3cgZnJvbSAuZG9tYWluLmNvbQotICAgIDxCUj4KLSAgICBBdXRoVHlwZSBCYXNpYwotICAgIDxCUj4KLSAgICBBdXRoVXNlckZpbGUgL3Vzci9sb2NhbC9hcGFjaGUvY29uZi9odHBhc3N3ZC51c2VycwotICAgIDxCUj4KLSAgICBBdXRoTmFtZSAic3BlY2lhbCBkaXJlY3RvcnkiCi0gICAgPEJSPgotICAgIHJlcXVpcmUgdmFsaWQtdXNlcgotICAgIDxCUj4KLSAgICBzYXRpc2Z5IGFueTwvQ09ERT4KLSAgIDwvREQ+Ci0gIDwvREw+Ci0gIDxQPjwvUD4KLSAgPFA+Ci0gIFNlZSB0aGUgPEEgSFJFRj0iI3VzZXItYXV0aGVudGljYXRpb24iPnVzZXIgYXV0aGVudGljYXRpb248L0E+Ci0gIHF1ZXN0aW9uIGFuZCB0aGUgPEEgSFJFRj0iLi4vbW9kL21vZF9hY2Nlc3MuaHRtbCI+bW9kX2FjY2VzczwvQT4KLSAgbW9kdWxlIGZvciBkZXRhaWxzIG9uIGhvdyB0aGUgYWJvdmUgZGlyZWN0aXZlcyB3b3JrLgotICA8L1A+Ci0gIDxIUj4KLSA8L0xJPgotCi0gPExJPjxBIE5BTUU9ImF1dGhhdXRob3JpdGF0aXZlIj4KLSAgICAgIDxTVFJPTkc+V2h5IGRvZXMgbXkgYXV0aGVudGljYXRpb24gZ2l2ZSBtZSBhIHNlcnZlciBlcnJvcj88L1NUUk9ORz4KLSAgICAgPC9BPgotICA8UD4KLSAgVW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMsIHRoZSBBcGFjaGUgYWNjZXNzIGNvbnRyb2wgbW9kdWxlcyB3aWxsCi0gIHBhc3MgdW5yZWNvZ25pemVkIHVzZXIgSURzIG9uIHRvIHRoZSBuZXh0IGFjY2VzcyBjb250cm9sIG1vZHVsZSBpbgotICBsaW5lLiAgT25seSBpZiB0aGUgdXNlciBJRCBpcyByZWNvZ25pemVkIGFuZCB0aGUgcGFzc3dvcmQgaXMgdmFsaWRhdGVkCi0gIChvciBub3QpIHdpbGwgaXQgZ2l2ZSB0aGUgdXN1YWwgc3VjY2VzcyBvciAmcXVvdDthdXRoZW50aWNhdGlvbgotICBmYWlsZWQmcXVvdDsgbWVzc2FnZXMuCi0gIDwvUD4KLSAgPFA+Ci0gIEhvd2V2ZXIsIGlmIHRoZSBsYXN0IGFjY2VzcyBtb2R1bGUgaW4gbGluZSAnZGVjbGluZXMnIHRoZSB2YWxpZGF0aW9uCi0gIHJlcXVlc3QgKGJlY2F1c2UgaXQgaGFzIG5ldmVyIGhlYXJkIG9mIHRoZSB1c2VyIElEIG9yIGJlY2F1c2UgaXQgaXMgbm90Ci0gIGNvbmZpZ3VyZWQpLCB0aGUgPFNBTVA+aHR0cF9yZXF1ZXN0PC9TQU1QPiBoYW5kbGVyIHdpbGwgZ2l2ZSBvbmUgb2YKLSAgdGhlIGZvbGxvd2luZywgY29uZnVzaW5nLCBlcnJvcnM6Ci0gIDwvUD4KLSAgPFVMPgotICAgPExJPjxTQU1QPmNoZWNrIGFjY2VzczwvU0FNUD4KLSAgIDwvTEk+Ci0gICA8TEk+PFNBTVA+Y2hlY2sgdXNlci4gIE5vIHVzZXIgZmlsZT88L1NBTVA+Ci0gICA8L0xJPgotICAgPExJPjxTQU1QPmNoZWNrIGFjY2Vzcy4gIE5vIGdyb3VwcyBmaWxlPzwvU0FNUD4KLSAgIDwvTEk+Ci0gIDwvVUw+Ci0gIDxQPgotICBUaGlzIGRvZXMgPEVNPm5vdDwvRU0+IG1lYW4gdGhhdCB5b3UgaGF2ZSB0byBhZGQgYW4KLSAgJzxTQU1QPkF1dGhVc2VyRmlsZSZuYnNwOy9kZXYvbnVsbDwvU0FNUD4nIGxpbmUgYXMgc29tZSBtYWdhemluZXMgc3VnZ2VzdCEKLSAgPC9QPgotICA8UD4KLSAgVGhlIHNvbHV0aW9uIGlzIHRvIGVuc3VyZSB0aGF0IGF0IGxlYXN0IHRoZSBsYXN0IG1vZHVsZSBpcyBhdXRob3JpdGF0aXZlCi0gIGFuZCA8U1RST05HPkNPTkZJR1VSRUQ8L1NUUk9ORz4uIEJ5IGRlZmF1bHQsIDxTQU1QPm1vZF9hdXRoPC9TQU1QPiBpcwotICBhdXRob3JpdGF0aXZlIGFuZCB3aWxsIGdpdmUgYW4gT0svRGVuaWVkLCBidXQgb25seSBpZiBpdCBpcyBjb25maWd1cmVkCi0gIHdpdGggdGhlIHByb3BlciA8U0FNUD5BdXRoVXNlckZpbGU8L1NBTVA+LiAgTGlrZXdpc2UsIGlmIGEgdmFsaWQgZ3JvdXAKLSAgaXMgcmVxdWlyZWQuICAoUmVtZW1iZXIgdGhhdCB0aGUgbW9kdWxlcyBhcmUgcHJvY2Vzc2VkIGluIHRoZSByZXZlcnNlCi0gIG9yZGVyIGZyb20gdGhhdCBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB5b3VyIGNvbXBpbGUtdGltZQotICA8U0FNUD5Db25maWd1cmF0aW9uPC9TQU1QPiBmaWxlLikKLSAgPC9QPgotICA8UD4KLSAgQSB0eXBpY2FsIHNpdHVhdGlvbiBmb3IgdGhpcyBlcnJvciBpcyB3aGVuIHlvdSBhcmUgdXNpbmcgdGhlCi0gIDxTQU1QPm1vZF9hdXRoX2RibTwvU0FNUD4sIDxTQU1QPm1vZF9hdXRoX21zcWw8L1NBTVA+LAotICA8U0FNUD5tb2RfYXV0aF9teXNxbDwvU0FNUD4sIDxTQU1QPm1vZF9hdXRoX2Fub248L1NBTVA+IG9yCi0gIDxTQU1QPm1vZF9hdXRoX2Nvb2tpZTwvU0FNUD4gbW9kdWxlcyBvbiB0aGVpciBvd24uICBUaGVzZSBhcmUgYnkKLSAgZGVmYXVsdCA8U1RST05HPm5vdDwvU1RST05HPiBhdXRob3JpdGF0aXZlLCBhbmQgdGhpcyB3aWxsIHBhc3MgdGhlCi0gIGJ1Y2sgb24gdG8gdGhlIChub24tZXhpc3RlbnQpIG5leHQgYXV0aGVudGljYXRpb24gbW9kdWxlIHdoZW4gdGhlCi0gIHVzZXIgSUQgaXMgbm90IGluIHRoZWlyIHJlc3BlY3RpdmUgZGF0YWJhc2UuICBKdXN0IGFkZCB0aGUgYXBwcm9wcmlhdGUKLSAgJzxTQU1QPjxFTT5YWFg8L0VNPkF1dGhvcml0YXRpdmUgeWVzPC9TQU1QPicgbGluZSB0byB0aGUgY29uZmlndXJhdGlvbi4KLSAgPC9QPgotICA8UD4KLSAgSW4gZ2VuZXJhbCBpdCBpcyBhIGdvb2QgaWRlYSAodGhvdWdoIG5vdCB0ZXJyaWJseSBlZmZpY2llbnQpIHRvIGhhdmUgdGhlCi0gIGZpbGUtYmFzZWQgPFNBTVA+bW9kX2F1dGg8L1NBTVA+IGEgbW9kdWxlIG9mIGxhc3QgcmVzb3J0LiBUaGlzIGFsbG93cwotICB5b3UgdG8gYWNjZXNzIHRoZSB3ZWIgc2VydmVyIHdpdGggYSBmZXcgc3BlY2lhbCBwYXNzd29yZHMgZXZlbiBpZiB0aGUKLSAgZGF0YWJhc2VzIGFyZSBkb3duIG9yIGNvcnJ1cHRlZC4gIFRoaXMgZG9lcyBjb3N0IGEKLSAgZmlsZSBvcGVuL3NlZWsvY2xvc2UgZm9yIGVhY2ggcmVxdWVzdCBpbiBhIHByb3RlY3RlZCBhcmVhLgotICA8L1A+Ci0gIDxIUj4KLSA8L0xJPgotCi0gPExJPjxBIE5BTUU9ImF1dGgtb24tc2FtZS1tYWNoaW5lIj4KLSAgICAgIDxTVFJPTkc+RG8gSSBoYXZlIHRvIGtlZXAgdGhlIChtU1FMKSBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbgotICAgICAgb24gdGhlIHNhbWUgbWFjaGluZT88L1NUUk9ORz4KLSAgICAgPC9BPgotICA8UD4KLSAgU29tZSBvcmdhbml6YXRpb25zIGZlZWwgdmVyeSBzdHJvbmdseSBhYm91dCBrZWVwaW5nIHRoZSBhdXRoZW50aWNhdGlvbgotICBpbmZvcm1hdGlvbiBvbiBhIGRpZmZlcmVudCBtYWNoaW5lIHRoYW4gdGhlIHdlYnNlcnZlci4gV2l0aCB0aGUKLSAgPFNBTVA+bW9kX2F1dGhfbXNxbDwvU0FNUD4sIDxTQU1QPm1vZF9hdXRoX215c3FsPC9TQU1QPiwgYW5kIG90aGVyIFNRTAotICBtb2R1bGVzIGNvbm5lY3RpbmcgdG8gKFIpREJNc2VzIHRoaXMgaXMgcXVpdGUgcG9zc2libGUuIEp1c3QgY29uZmlndXJlCi0gIGFuIGV4cGxpY2l0IGhvc3QgdG8gY29udGFjdC4KLSAgPC9QPgotICA8UD4KLSAgQmUgYXdhcmUgdGhhdCB3aXRoIG1TUUwgYW5kIE9yYWNsZSwgb3BlbmluZyBhbmQgY2xvc2luZyB0aGVzZSBkYXRhYmFzZQotICBjb25uZWN0aW9ucyBpcyB2ZXJ5IGV4cGVuc2l2ZSBhbmQgdGltZSBjb25zdW1pbmcuIFlvdSBtaWdodCB3YW50IHRvCi0gIGxvb2sgYXQgdGhlIGNvZGUgaW4gdGhlIDxTQU1QPmF1dGhfKjwvU0FNUD4gbW9kdWxlcyBhbmQgcGxheSB3aXRoIHRoZQotICBjb21waWxlIHRpbWUgZmxhZ3MgdG8gYWxsZXZpYXRlIHRoaXMgc29tZXdoYXQsIGlmIHlvdXIgUkRCTVMgbGljZW5jZXMKLSAgYWxsb3cgZm9yIGl0LgotICA8L1A+Ci0gIDxIUj4KLSA8L0xJPgotCi0gPExJPjxBIE5BTUU9Im1zcWwtc2xvdyI+Ci0gICAgICA8U1RST05HPldoeSBpcyBteSBtU1FMIGF1dGhlbnRpY2F0aW9uIHRlcnJpYmx5IHNsb3c/PC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+Ci0gIFlvdSBoYXZlIHByb2JhYmx5IGNvbmZpZ3VyZWQgdGhlIEhvc3QgYnkgc3BlY2lmeWluZyBhIEZRSE4sCi0gIGFuZCB0aHVzIHRoZSA8U0FNUD5saWJtc3FsPC9TQU1QPiB3aWxsIHVzZSBhIGZ1bGwgYmxvd24gVENQL0lQIHNvY2tldAotICB0byB0YWxrIHRvIHRoZSBkYXRhYmFzZSwgcmF0aGVyIHRoYW4gYSBmYXN0IGludGVybmFsIGRldmljZS4gIFRoZQotICA8U0FNUD5saWJtc3FsPC9TQU1QPiwgdGhlIG1TUUwgRkFRLCBhbmQgdGhlIDxTQU1QPm1vZF9hdXRoX21zcWw8L1NBTVA+Ci0gIGRvY3VtZW50YXRpb24gd2FybiB5b3UgYWJvdXQgdGhpcy4gIElmIHlvdSBoYXZlIHRvIHVzZSBkaWZmZXJlbnQKLSAgaG9zdHMsIGNoZWNrIG91dCB0aGUgPFNBTVA+bW9kX2F1dGhfbXNxbDwvU0FNUD4gY29kZSBmb3IKLSAgc29tZSBjb21waWxlIHRpbWUgZmxhZ3Mgd2hpY2ggbWlnaHQgLSBvciBtaWdodCBub3QgLSBzdWl0IHlvdS4KLSAgPC9QPgotICA8SFI+Ci0gPC9MST4KLQotIDxMST48QSBOQU1FPSJwYXNzd2RhdXRoIj4KLSAgICAgIDxTVFJPTkc+Q2FuIEkgdXNlIG15IDxTQU1QPi9ldGMvcGFzc3dkPC9TQU1QPiBmaWxlCi0gICAgICBmb3IgV2ViIHBhZ2UgYXV0aGVudGljYXRpb24/PC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+Ci0gIFllcywgeW91IGNhbiAtIGJ1dCBpdCdzIGEgPFNUUk9ORz52ZXJ5IGJhZCBpZGVhPC9TVFJPTkc+LiAgSGVyZSBhcmUKLSAgc29tZSBvZiB0aGUgcmVhc29uczoKLSAgPC9QPgotICA8VUw+Ci0gICA8TEk+VGhlIFdlYiB0ZWNobm9sb2d5IHByb3ZpZGVzIG5vIGdvdmVybm9ycyBvbiBob3cgb2Z0ZW4gb3IgaG93Ci0gICAgcmFwaWRseSBwYXNzd29yZCAoYXV0aGVudGljYXRpb24gZmFpbHVyZSkgcmV0cmllcyBjYW4gYmUgbWFkZS4gIFRoYXQKLSAgICBtZWFucyB0aGF0IHNvbWVvbmUgY2FuIGhhbW1lciBhd2F5IGF0IHlvdXIgc3lzdGVtJ3MKLSAgICA8U0FNUD5yb290PC9TQU1QPiBwYXNzd29yZCB1c2luZyB0aGUgV2ViLCB1c2luZyBhIGRpY3Rpb25hcnkgb3IKLSAgICBzaW1pbGFyIG1hc3MgYXR0YWNrLCBqdXN0IGFzIGZhc3QgYXMgdGhlIHdpcmUgYW5kIHlvdXIgc2VydmVyIGNhbgotICAgIGhhbmRsZSB0aGUgcmVxdWVzdHMuICBNb3N0IG9wZXJhdGluZyBzeXN0ZW1zIHRoZXNlIGRheXMgaW5jbHVkZQotICAgIGF0dGFjayBkZXRlY3Rpb24gKHN1Y2ggYXMgPEVNPm48L0VNPiBmYWlsZWQgcGFzc3dvcmRzIGZvciB0aGUgc2FtZQotICAgIGFjY291bnQgd2l0aGluIDxFTT5tPC9FTT4gc2Vjb25kcykgYW5kIGV2YXNpb24gKGJyZWFraW5nIHRoZQotICAgIGNvbm5lY3Rpb24sIGRpc2FibGluZyB0aGUgYWNjb3VudCB1bmRlciBhdHRhY2ssIGRpc2FibGluZwotICAgIDxFTT5hbGw8L0VNPiBsb2dpbnMgZnJvbSB0aGF0IHNvdXJjZSwgPEVNPmV0IGNldGVyYTwvRU0+KSwgYnV0IHRoZQotICAgIFdlYiBkb2VzIG5vdC4KLSAgIDwvTEk+Ci0gICA8TEk+QW4gYWNjb3VudCB1bmRlciBhdHRhY2sgaXNuJ3Qgbm90aWZpZWQgKHVubGVzcyB0aGUgc2VydmVyIGlzCi0gICAgaGVhdmlseSBtb2RpZmllZCk7IHRoZXJlJ3Mgbm8gJnF1b3Q7WW91IGhhdmUgMTk0ODMgbG9naW4KLSAgICBmYWlsdXJlcyZxdW90OyBtZXNzYWdlIHdoZW4gdGhlIGxlZ2l0aW1hdGUgb3duZXIgbG9ncyBpbi4KLSAgIDwvTEk+Ci0gICA8TEk+V2l0aG91dCBhbiBleGhhdXN0aXZlIGFuZCBlcnJvci1wcm9uZSBleGFtaW5hdGlvbiBvZiB0aGUgc2VydmVyCi0gICAgbG9ncywgeW91IGNhbid0IHRlbGwgd2hldGhlciBhbiBhY2NvdW50IGhhcyBiZWVuIGNvbXByb21pc2VkLgotICAgIERldGVjdGluZyB0aGF0IGFuIGF0dGFjayBoYXMgb2NjdXJyZWQsIG9yIGlzIGluIHByb2dyZXNzLCBpcyBmYWlybHkKLSAgICBvYnZpb3VzLCB0aG91Z2ggLSA8RU0+aWY8L0VNPiB5b3UgbG9vayBhdCB0aGUgbG9ncy4KLSAgIDwvTEk+Ci0gICA8TEk+V2ViIGF1dGhlbnRpY2F0aW9uIHBhc3N3b3JkcyAoYXQgbGVhc3QgZm9yIEJhc2ljIGF1dGhlbnRpY2F0aW9uKQotICAgIGdlbmVyYWxseSBmbHkgYWNyb3NzIHRoZSB3aXJlLCBhbmQgdGhyb3VnaCBpbnRlcm1lZGlhdGUgcHJveHkKLSAgICBzeXN0ZW1zLCBpbiB3aGF0IGFtb3VudHMgdG8gcGxhaW4gdGV4dC4gICZxdW90O08nZXIgdGhlIG5ldCB3ZQotICAgIGdvL0NhY2hpbmcgYWxsIHRoZSB3YXk7L08gd2hhdCBmdW4gaXQgaXMgdG8gc3VyZi9HaXZpbmcgbXkgcGFzc3dvcmQKLSAgICBhd2F5ISZxdW90OwotICAgPC9MST4KLSAgIDxMST5TaW5jZSBIVFRQIGlzIHN0YXRlbGVzcywgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGF1dGhlbnRpY2F0aW9uIGlzCi0gICAgdHJhbnNtaXR0ZWQgPEVNPmVhY2ggYW5kIGV2ZXJ5IHRpbWU8L0VNPiBhIHJlcXVlc3QgaXMgbWFkZSB0byB0aGUKLSAgICBzZXJ2ZXIuICBFc3NlbnRpYWxseSwgdGhlIGNsaWVudCBjYWNoZXMgaXQgYWZ0ZXIgdGhlIGZpcnN0Ci0gICAgc3VjY2Vzc2Z1bCBhY2Nlc3MsIGFuZCB0cmFuc21pdHMgaXQgd2l0aG91dCBhc2tpbmcgZm9yIGFsbAotICAgIHN1YnNlcXVlbnQgcmVxdWVzdHMgdG8gdGhlIHNhbWUgc2VydmVyLgotICAgPC9MST4KLSAgIDxMST5JdCdzIHJlbGF0aXZlbHkgdHJpdmlhbCBmb3Igc29tZW9uZSBvbiB5b3VyIHN5c3RlbSB0byBwdXQgdXAgYQotICAgIHBhZ2UgdGhhdCB3aWxsIHN0ZWFsIHRoZSBjYWNoZWQgcGFzc3dvcmQgZnJvbSBhIGNsaWVudCdzIGNhY2hlCi0gICAgd2l0aG91dCB0aGVtIGtub3dpbmcuICBDYW4geW91IHNheSAmcXVvdDtwYXNzd29yZCBncmFiYmVyJnF1b3Q7PwotICAgPC9MST4KLSAgPC9VTD4KLSAgPFA+Ci0gIElmIHlvdSBzdGlsbCB3YW50IHRvIGRvIHRoaXMgaW4gbGlnaHQgb2YgdGhlIGFib3ZlIGRpc2FkdmFudGFnZXMsIHRoZQotICBtZXRob2QgaXMgbGVmdCBhcyBhbiBleGVyY2lzZSBmb3IgdGhlIHJlYWRlci4gIEl0J2xsIHZvaWQgeW91ciBBcGFjaGUKLSAgd2FycmFudHksIHRob3VnaCwgYW5kIHlvdSdsbCBsb3NlIGFsbCBhY2N1bXVsYXRlZCBVTklYIGd1cnUgcG9pbnRzLgotICA8L1A+Ci0gIDxIUj4KLSA8L0xJPgotPC9PTD4KLTwhLS0jZW5kaWYgLS0+Ci08IS0tI2lmIGV4cHI9IiRTVEFOREFMT05FIiAtLT4KLSAgPCEtLSBEb24ndCBmb3JnZXQgdG8gYWRkIEhSIHRhZ3MgYXQgdGhlIGVuZCBvZiBlYWNoIGxpc3QgaXRlbS4uIC0tPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotPCEtLSNlbmRpZiAtLT4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21pc2MvRkFRLUguaHRtbCBiL2RvY3MvbWFudWFsL21pc2MvRkFRLUguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM2OWVjOS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9taXNjL0ZBUS1ILmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotPCEtLSNpZiBleHByPSIkRkFRTUFTVEVSIiAtLT4KLSA8IS0tI3NldCB2YXI9IlNUQU5EQUxPTkUiIHZhbHVlPSIiIC0tPgotIDwhLS0jc2V0IHZhcj0iSU5DTFVERUQiIHZhbHVlPSJZRVMiIC0tPgotIDwhLS0jaWYgZXhwcj0iJFFVRVJZX1NUUklORyA9IFRPQyIgLS0+Ci0gIDwhLS0jc2V0IHZhcj0iVE9DIiB2YWx1ZT0iWUVTIiAtLT4KLSAgPCEtLSNzZXQgdmFyPSJDT05URU5UIiB2YWx1ZT0iIiAtLT4KLSA8IS0tI2Vsc2UgLS0+Ci0gIDwhLS0jc2V0IHZhcj0iVE9DIiB2YWx1ZT0iIiAtLT4KLSAgPCEtLSNzZXQgdmFyPSJDT05URU5UIiB2YWx1ZT0iWUVTIiAtLT4KLSA8IS0tI2VuZGlmIC0tPgotPCEtLSNlbHNlIC0tPgotIDwhLS0jc2V0IHZhcj0iU1RBTkRBTE9ORSIgdmFsdWU9IllFUyIgLS0+Ci0gPCEtLSNzZXQgdmFyPSJJTkNMVURFRCIgdmFsdWU9IiIgLS0+Ci0gPCEtLSNzZXQgdmFyPSJUT0MiIHZhbHVlPSIiIC0tPgotIDwhLS0jc2V0IHZhcj0iQ09OVEVOVCIgdmFsdWU9IiIgLS0+Ci08IS0tI2VuZGlmIC0tPgotPCEtLSNpZiBleHByPSIkU1RBTkRBTE9ORSIgLS0+Ci08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLSA8SEVBRD4KLSAgPFRJVExFPkFwYWNoZSBTZXJ2ZXIgRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L1RJVExFPgotIDwvSEVBRD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLSA8Qk9EWQotICBCR0NPTE9SPSIjRkZGRkZGIgotICBURVhUPSIjMDAwMDAwIgotICBMSU5LPSIjMDAwMEZGIgotICBWTElOSz0iIzAwMDA4MCIKLSAgQUxJTks9IiNGRjAwMDAiCi0gPgotICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotICA8SDEgQUxJR049IkNFTlRFUiI+QXBhY2hlIFNlcnZlciBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvSDE+Ci0gIDxQPgotICAkUmV2aXNpb246IDEuMSAkICgkRGF0ZTogMTk5OS8wNi8yNCAxNTowMjo1MiAkKQotICA8L1A+Ci0gIDxQPgotICBUaGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBGQVEgaXMgYWx3YXlzIGF2YWlsYWJsZSBmcm9tIHRoZSBtYWluCi0gIEFwYWNoZSB3ZWIgc2l0ZSwgYXQKLSAgJmx0OzxBCi0gICAgICAgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvbWlzYy9GQVEuaHRtbCIKLSAgICAgICBSRUw9IkhlbHAiCi0gICAgICA+PFNBTVA+aHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvbWlzYy9GQVEuaHRtbDwvU0FNUD48L0E+Jmd0Oy4KLSAgPC9QPgotPCEtLSBOb3RlcyBhYm91dCBjaGFuZ2VzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gIC0gSWYgYWRkaW5nIGEgcmVsYXRpdmUgbGluayB0byBhbm90aGVyIHBhcnQgb2YgdGhlICAgICAgICAgICAgLS0+Ci08IS0tICAgIGRvY3VtZW50YXRpb24sICpkbyogaW5jbHVkZSB0aGUgIi5odG1sIiBwb3J0aW9uLiAgVGhlcmUncyBhIC0tPgotPCEtLSAgICBnb29kIGNoYW5jZSB0aGF0IHRoZSB1c2VyIHdpbGwgYmUgcmVhZGluZyB0aGUgZG9jdW1lbnRhdGlvbiAtLT4KLTwhLS0gICAgb24gaGlzIG93biBzeXN0ZW0sIHdoaWNoIG1heSBub3QgYmUgY29uZmlndXJlZCBmb3IgICAgICAgICAgLS0+Ci08IS0tICAgIG11bHRpdmlld3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgLSBXaGVuIGFkZGluZyBpdGVtcywgbWFrZSBzdXJlIHRoZXkncmUgcHV0IGluIHRoZSByaWdodCBwbGFjZSAtLT4KLTwhLS0gICAgLSB2ZXJpZnkgdGhhdCB0aGUgbnVtYmVyaW5nIG1hdGNoZXMgdXAuICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAtICpEb24ndCogdXNlIDxQUkU+PC9QUkU+IGJsb2NrcyAtIHRoZXkgZG9uJ3QgYXBwZWFyICAgICAgICAgIC0tPgotPCEtLSAgICBjb3JyZWN0bHkgaW4gYSByZWxpYWJsZSB3YXkgd2hlbiB0aGlzIGlzIGNvbnZlcnRlZCB0byB0ZXh0ICAtLT4KLTwhLS0gICAgd2l0aCBMeW54LiAgVXNlIDxETD48REQ+PENPREU+eHh4PEJSPnh4PC9DT0RFPjwvREQ+PC9ETD4gICAgLS0+Ci08IS0tICAgIGJsb2NrcyBpbnNpZGUgYSA8UD48L1A+IGluc3RlYWQuICBUaGlzIGlzIG5lY2Vzc2FyeSB0byBnZXQgIC0tPgotPCEtLSAgICB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW5kZW50aW5nIHJpZ2h0LiAgICAgICAgICAgICAgICAtLT4KLTwhLS0gIC0gRG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGUgYW4gSFIgdGFnIGFmdGVyIHRoZSBsYXN0IC9QIHRhZyAgICAgLS0+Ci08IS0tICAgIGJ1dCBiZWZvcmUgdGhlIC9MSSBpbiBhbiBpdGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8UD4KLSAgSWYgeW91IGFyZSByZWFkaW5nIGEgdGV4dC1vbmx5IHZlcnNpb24gb2YgdGhpcyBGQVEsIHlvdSBtYXkgZmluZCBudW1iZXJzCi0gIGVuY2xvc2VkIGluIGJyYWNrZXRzIChzdWNoIGFzICZxdW90O1sxMl0mcXVvdDspLiAgVGhlc2UgcmVmZXIgdG8gdGhlIGxpc3Qgb2YKLSAgcmVmZXJlbmNlIFVSTHMgdG8gYmUgZm91bmQgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuICBUaGVzZSByZWZlcmVuY2VzCi0gIGRvIG5vdCBhcHBlYXIsIGFuZCBhcmUgbm90IG5lZWRlZCwgZm9yIHRoZSBoeXBlcnRleHQgdmVyc2lvbi4KLSAgPC9QPgotICA8SDI+VGhlIFF1ZXN0aW9uczwvSDI+Ci08T0wgVFlQRT0iQSI+Ci08IS0tI2VuZGlmIC0tPgotPCEtLSNpZiBleHByPSIkVE9DIHx8ICRTVEFOREFMT05FIiAtLT4KLSA8TEkgVkFMVUU9IjgiPjxTVFJPTkc+VVJMIFJld3JpdGluZzwvU1RST05HPgotICA8T0w+Ci0gICA8TEk+PEEgSFJFRj0iI3Jld3JpdGUtbW9yZS1jb25maWciPldoZXJlIGNhbiBJIGZpbmQgbW9kX3Jld3JpdGUgcnVsZXNldHMKLSAgICAgICAgd2hpY2ggYWxyZWFkeSBzb2x2ZSBwYXJ0aWN1bGFyIFVSTC1yZWxhdGVkIHByb2JsZW1zPzwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI3Jld3JpdGUtYXJ0aWNsZSI+V2hlcmUgY2FuIEkgZmluZCBhbnkgcHVibGlzaGVkIGluZm9ybWF0aW9uCi0gICAgICAgIGFib3V0IFVSTC1tYW5pcHVsYXRpb25zIGFuZCBtb2RfcmV3cml0ZT88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNyZXdyaXRlLWNvbXBsZXhpdHkiPldoeSBpcyBtb2RfcmV3cml0ZSBzbyBkaWZmaWN1bHQgdG8gbGVhcm4KLSAgICAgICAgYW5kIHNlZW1zIHNvIGNvbXBsaWNhdGVkPzwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI3Jld3JpdGUtZG9udHdvcmsiPldoYXQgY2FuIEkgZG8gaWYgbXkgUmV3cml0ZVJ1bGVzIGRvbid0IHdvcmsKLSAgICAgICAgYXMgZXhwZWN0ZWQ/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjcmV3cml0ZS1wcmVmaXhkb2Nyb290Ij5XaHkgZG9uJ3Qgc29tZSBvZiBteSBVUkxzIGdldAotICAgICAgICBwcmVmaXhlZCB3aXRoIERvY3VtZW50Um9vdCB3aGVuIHVzaW5nIG1vZF9yZXdyaXRlPzwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI3Jld3JpdGUtbm9jYXNlIj5Ib3cgY2FuIEkgbWFrZSBhbGwgbXkgVVJMcyBjYXNlLWluc2Vuc2l0aXZlCi0gICAgICAgIHdpdGggbW9kX3Jld3JpdGU/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjcmV3cml0ZS12aXJ0aG9zdCI+V2h5IGFyZSBSZXdyaXRlUnVsZXMgaW4gbXkgVmlydHVhbEhvc3QKLSAgICAgICAgcGFydHMgaWdub3JlZD88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNyZXdyaXRlLWVudndoaXRlc3BhY2UiPkhvdyBjYW4gSSB1c2Ugc3RyaW5ncyB3aXRoIHdoaXRlc3BhY2VzCi0gICAgICAgIGluIFJld3JpdGVSdWxlJ3MgRU5WIGZsYWc/PC9BPgotICAgPC9MST4KLSAgPC9PTD4KLSA8L0xJPgotPCEtLSNlbmRpZiAtLT4KLTwhLS0jaWYgZXhwcj0iJFNUQU5EQUxPTkUiIC0tPgotPC9PTD4KLQotPEhSPgotCi0gIDxIMj5UaGUgQW5zd2VyczwvSDI+Ci08IS0tI2VuZGlmIC0tPgotPCEtLSNpZiBleHByPSIhICRUT0MiIC0tPgotCi0gIDxIMz5ILiBVUkwgUmV3cml0aW5nPC9IMz4KLTxPTD4KLQotIDxMST48QSBOQU1FPSJyZXdyaXRlLW1vcmUtY29uZmlnIj4KLSAgICAgIDxTVFJPTkc+V2hlcmUgY2FuIEkgZmluZCBtb2RfcmV3cml0ZSBydWxlc2V0cyB3aGljaCBhbHJlYWR5IHNvbHZlCi0gICAgICBwYXJ0aWN1bGFyIFVSTC1yZWxhdGVkIHByb2JsZW1zPzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBUaGVyZSBpcyBhIGNvbGxlY3Rpb24gb2YgCi0gIDxBIEhSRUY9Imh0dHA6Ly93d3cuZW5nZWxzY2hhbGwuY29tL3B3L2FwYWNoZS9yZXdyaXRlZ3VpZGUvIgotICA+UHJhY3RpY2FsIFNvbHV0aW9ucyBmb3IgVVJMLU1hbmlwdWxhdGlvbjwvQT4KLSAgd2hlcmUgeW91IGNhbgotICBmaW5kIGFsbCB0eXBpY2FsIHNvbHV0aW9ucyB0aGUgYXV0aG9yIG9mIAotICA8QSBIUkVGPSIuLi9tb2QvbW9kX3Jld3JpdGUuaHRtbCI+PFNBTVA+bW9kX3Jld3JpdGU8L1NBTVA+PC9BPiAKLSAgY3VycmVudGx5IGtub3dzIG9mLiBJZiB5b3UgaGF2ZSBtb3JlCi0gIGludGVyZXN0aW5nIHJ1bGVzZXRzIHdoaWNoIHNvbHZlIHBhcnRpY3VsYXIgcHJvYmxlbXMgbm90IGN1cnJlbnRseSBjb3ZlcmVkIGluCi0gIHRoaXMgZG9jdW1lbnQsIHNlbmQgaXQgdG8gCi0gIDxBIEhSRUY9Im1haWx0bzpyc2VAYXBhY2hlLm9yZyI+UmFsZiBTLiBFbmdlbHNjaGFsbDwvQT4KLSAgZm9yIGluY2x1c2lvbi4gVGhlCi0gIG90aGVyIHdlYm1hc3RlcnMgd2lsbCB0aGFuayB5b3UgZm9yIGF2b2lkaW5nIHRoZSByZWludmVudGlvbiBvZiB0aGUgd2hlZWwuCi0gIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0icmV3cml0ZS1hcnRpY2xlIj4KLSAgICAgIDxTVFJPTkc+V2hlcmUgY2FuIEkgZmluZCBhbnkgcHVibGlzaGVkIGluZm9ybWF0aW9uIGFib3V0Ci0gICAgICBVUkwtbWFuaXB1bGF0aW9ucyBhbmQgbW9kX3Jld3JpdGU/PC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+Ci0gIFRoZXJlIGlzIGFuIGFydGljbGUgZnJvbSAKLSAgPEEgSFJFRj0ibWFpbHRvOnJzZUBhcGFjaGUub3JnIgotICA+UmFsZiBTLiBFbmdlbHNjaGFsbDwvQT4KLSAgYWJvdXQgVVJMLW1hbmlwdWxhdGlvbnMgYmFzZWQgb24KLSAgPEEgSFJFRj0iLi4vbW9kL21vZF9yZXdyaXRlLmh0bWwiPjxTQU1QPm1vZF9yZXdyaXRlPC9TQU1QPjwvQT4gCi0gIGluIHRoZSAmcXVvdDtpWCBNdWx0aXVzZXIgTXVsdGl0YXNraW5nIE1hZ2F6aW4mcXVvdDsgaXNzdWUgIzEyLzk2LiBUaGUKLSAgZ2VybWFuIChvcmlnaW5hbCkgdmVyc2lvbgotICBjYW4gYmUgcmVhZCBvbmxpbmUgYXQgCi0gICZsdDs8QSBIUkVGPSJodHRwOi8vd3d3LmhlaXNlLmRlL2l4L2FydGlrZWwvOTYxMjE0OS8iCi0gICAgICA+aHR0cDovL3d3dy5oZWlzZS5kZS9peC9hcnRpa2VsLzk2MTIxNDkvPC9BPiZndDssCi0gIHRoZSBFbmdsaXNoICh0cmFuc2xhdGVkKSB2ZXJzaW9uIGNhbiBiZSBmb3VuZCBhdCAKLSAgJmx0OzxBIEhSRUY9Imh0dHA6Ly93d3cuaGVpc2UuZGUvaXgvYXJ0aWtlbC9FLzk2MTIxNDkvIgotICAgICAgPmh0dHA6Ly93d3cuaGVpc2UuZGUvaXgvYXJ0aWtlbC9FLzk2MTIxNDkvPC9BPiZndDsuCi0gIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0icmV3cml0ZS1jb21wbGV4aXR5Ij4KLSAgICAgIDxTVFJPTkc+V2h5IGlzIG1vZF9yZXdyaXRlIHNvIGRpZmZpY3VsdCB0byBsZWFybiBhbmQgc2VlbXMgc28KLSAgICAgIGNvbXBsaWNhdGVkPzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBIbW1tLi4uIHRoZXJlIGFyZSBhIGxvdCBvZiByZWFzb25zLiBGaXJzdCwgbW9kX3Jld3JpdGUgaXRzZWxmIGlzIGEgcG93ZXJmdWwKLSAgbW9kdWxlIHdoaWNoIGNhbiBoZWxwIHlvdSBpbiByZWFsbHkgPFNUUk9ORz5hbGw8L1NUUk9ORz4gYXNwZWN0cyBvZiBVUkwKLSAgcmV3cml0aW5nLCBzbyBpdCBjYW4gYmUgbm8gdHJpdmlhbCBtb2R1bGUgcGVyIGRlZmluaXRpb24uIFRvIGFjY29tcGxpc2gKLSAgaXRzIGhhcmQgam9iIGl0IHVzZXMgc29mdHdhcmUgbGV2ZXJhZ2UgYW5kIG1ha2VzIHVzZSBvZiBhIHBvd2VyZnVsIHJlZ3VsYXIKLSAgZXhwcmVzc2lvbgotICBsaWJyYXJ5IGJ5IEhlbnJ5IFNwZW5jZXIgd2hpY2ggaXMgYW4gaW50ZWdyYWwgcGFydCBvZiBBcGFjaGUgc2luY2UgaXRzCi0gIHZlcnNpb24gMS4yLiAgQW5kIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaXRzZWxmIGNhbiBiZSBkaWZmaWN1bHQgdG8gbmV3YmllcywKLSAgd2hpbGUgcHJvdmlkaW5nIHRoZSBtb3N0IGZsZXhpYmxlIHBvd2VyIHRvIHRoZSBhZHZhbmNlZCBoYWNrZXIuIAotICA8L1A+Ci0gIDxQPgotICBPbiB0aGUgb3RoZXIgaGFuZCBtb2RfcmV3cml0ZSBoYXMgdG8gd29yayBpbnNpZGUgdGhlIEFwYWNoZSBBUEkgZW52aXJvbm1lbnQKLSAgYW5kIG5lZWRzIHRvIGRvIHNvbWUgdHJpY2tzIHRvIGZpdCB0aGVyZS4gRm9yIGluc3RhbmNlIHRoZSBBcGFjaGUgQVBJIGFzIG9mCi0gIDEueCByZWFsbHkgd2FzIG5vdCBkZXNpZ25lZCBmb3IgVVJMIHJld3JpdGluZyBhdCB0aGUgPFRUPi5odGFjY2VzczwvVFQ+Ci0gIGxldmVsIG9mIHByb2Nlc3NpbmcuIE9yIHRoZSBwcm9ibGVtIG9mIG11bHRpcGxlIHJld3JpdGVzIGluIHNlcXVlbmNlLCB3aGljaAotICBpcyBhbHNvIG5vdCBoYW5kbGVkIGJ5IHRoZSBBUEkgcGVyIGRlc2lnbi4gVG8gcHJvdmlkZSB0aGlzIGZlYXR1cmVzCi0gIG1vZF9yZXdyaXRlIGhhcyB0byBkbyBzb21lIHNwZWNpYWwgKGJ1dCBBUEkgY29tcGxpYW50ISkgaGFuZGxpbmcgd2hpY2ggbGVhZHMKLSAgdG8gZGlmZmljdWx0IHByb2Nlc3NpbmcgaW5zaWRlIHRoZSBBcGFjaGUga2VybmVsLiBXaGlsZSB0aGUgdXNlciB1c3VhbGx5Ci0gIGRvZXNuJ3Qgc2VlIGFueXRoaW5nIG9mIHRoaXMgcHJvY2Vzc2luZywgaXQgY2FuIGJlIGRpZmZpY3VsdCB0byBmaW5kCi0gIHByb2JsZW1zIHdoZW4gc29tZSBvZiB5b3VyIFJld3JpdGVSdWxlcyBzZWVtIG5vdCB0byB3b3JrLgotICA8L1A+Ci0gIDxIUj4KLSA8L0xJPgotCi0gPExJPjxBIE5BTUU9InJld3JpdGUtZG9udHdvcmsiPgotICAgICAgPFNUUk9ORz5XaGF0IGNhbiBJIGRvIGlmIG15IFJld3JpdGVSdWxlcyBkb24ndCB3b3JrIGFzIGV4cGVjdGVkPwotICAgICAgPC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+Ci0gIFVzZSAmcXVvdDs8U0FNUD5SZXdyaXRlTG9nIHNvbWVmaWxlPC9TQU1QPiZxdW90OyBhbmQKLSAgJnF1b3Q7PFNBTVA+UmV3cml0ZUxvZ0xldmVsIDk8L1NBTVA+JnF1b3Q7IGFuZCBoYXZlIGEgcHJlY2lzZSBsb29rIGF0IHRoZQotICBzdGVwcyB0aGUgcmV3cml0aW5nIGVuZ2luZSBwZXJmb3Jtcy4gVGhpcyBpcyByZWFsbHkgdGhlIG9ubHkgb25lIGFuZCBiZXN0Ci0gIHdheSB0byBkZWJ1ZyB5b3VyIHJld3JpdGluZyBjb25maWd1cmF0aW9uLgotICA8L1A+Ci0gIDxIUj4KLSA8L0xJPgotCi0gPExJPjxBIE5BTUU9InJld3JpdGUtcHJlZml4ZG9jcm9vdCI+PFNUUk9ORz5XaHkgZG9uJ3Qgc29tZSBvZiBteSBVUkxzCi0gICAgICBnZXQgcHJlZml4ZWQgd2l0aCBEb2N1bWVudFJvb3Qgd2hlbiB1c2luZyBtb2RfcmV3cml0ZT88L1NUUk9ORz4KLSAgICAgPC9BPgotICA8UD4KLSAgSWYgdGhlIHJ1bGUgc3RhcnRzIHdpdGggPFNBTVA+L3NvbWVkaXIvLi4uPC9TQU1QPiBtYWtlIHN1cmUgdGhhdAotICByZWFsbHkgbm8gPFNBTVA+L3NvbWVkaXI8L1NBTVA+IGV4aXN0cyBvbiB0aGUgZmlsZXN5c3RlbSBpZiB5b3UKLSAgZG9uJ3Qgd2FudCB0byBsZWFkIHRoZSBVUkwgdG8gbWF0Y2ggdGhpcyBkaXJlY3RvcnksIDxFTT5pLmUuPC9FTT4sCi0gIHRoZXJlIG11c3QgYmUgbm8gcm9vdCBkaXJlY3RvcnkgbmFtZWQgPFNBTVA+c29tZWRpcjwvU0FNUD4gb24gdGhlCi0gIGZpbGVzeXN0ZW0uIEJlY2F1c2UgaWYgdGhlcmUgaXMgc3VjaCBhIGRpcmVjdG9yeSwgdGhlIFVSTCB3aWxsIG5vdAotICBnZXQgcHJlZml4ZWQgd2l0aCBEb2N1bWVudFJvb3QuIFRoaXMgYmVoYXZpb3VyIGxvb2tzIHVnbHksIGJ1dCBpcwotICByZWFsbHkgaW1wb3J0YW50IGZvciBzb21lIG90aGVyIGFzcGVjdHMgb2YgVVJMIHJld3JpdGluZy4KLSAgPC9QPgotICA8SFI+Ci0gPC9MST4KLQotIDxMST48QSBOQU1FPSJyZXdyaXRlLW5vY2FzZSI+Ci0gICAgICA8U1RST05HPkhvdyBjYW4gSSBtYWtlIGFsbCBteSBVUkxzIGNhc2UtaW5zZW5zaXRpdmUgd2l0aCBtb2RfcmV3cml0ZT8KLSAgICAgIDwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBZb3UgY2FuJ3QhIFRoZSByZWFzb24gaXM6IEZpcnN0LCBjYXNlIHRyYW5zbGF0aW9ucyBmb3IgYXJiaXRyYXJ5Ci0gIGxlbmd0aCBVUkxzIGNhbm5vdCBiZSBkb25lIDxFTT52aWE8L0VNPiByZWdleCBwYXR0ZXJucyBhbmQKLSAgY29ycmVzcG9uZGluZyBzdWJzdGl0dXRpb25zLiAgT25lIG5lZWQgYSBwZXItY2hhcmFjdGVyIHBhdHRlcm4gbGlrZQotICBzZWQvUGVybCA8U0FNUD50cnwuLnwuLnw8L1NBTVA+IGZlYXR1cmUuICBTZWNvbmQsIGp1c3QgbWFraW5nIFVSTHMKLSAgYWx3YXlzIHVwcGVyIG9yIGxvd2VyIGNhc2Ugd2lsbCBub3QgcmVzb2x2ZSB0aGUgY29tcGxldGUgcHJvYmxlbSBvZgotICBjYXNlLUlOU0VOU0lUSVZFIFVSTHMsIGJlY2F1c2UgYWN0dWFsbHkgdGhlIFVSTHMgaGFkIHRvIGJlIHJld3JpdHRlbgotICB0byB0aGUgY29ycmVjdCBjYXNlLXZhcmlhbnQgcmVzaWRpbmcgb24gdGhlIGZpbGVzeXN0ZW0gYmVjYXVzZSBpbgotICBsYXRlciBwcm9jZXNzaW5nIEFwYWNoZSBuZWVkcyB0byBhY2Nlc3MgdGhlIGZpbGUuICBBbmQgVW5peAotICBmaWxlc3lzdGVtIGlzIGFsd2F5cyBjYXNlLVNFTlNJVElWRS4KLSAgPC9QPgotICA8UD4KLSAgQnV0IHRoZXJlIGlzIGEgbW9kdWxlIG5hbWVkIDxDT0RFPm1vZF9zcGVsaW5nLmM8L0NPREU+ICh5ZXMsIGl0IGlzIG5hbWVkCi0gIHRoaXMgd2F5ISkgb3V0IHRoZXJlIG9uIHRoZSBuZXQuIFRyeSB0aGlzIG9uZS4KLSAgPC9QPgotICA8SFI+Ci0gPC9MST4KLQotIDxMST48QSBOQU1FPSJyZXdyaXRlLXZpcnRob3N0Ij4KLSAgICAgIDxTVFJPTkc+IFdoeSBhcmUgUmV3cml0ZVJ1bGVzIGluIG15IFZpcnR1YWxIb3N0IHBhcnRzIGlnbm9yZWQ/PC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+Ci0gIEJlY2F1c2UgeW91IGhhdmUgdG8gZW5hYmxlIHRoZSBlbmdpbmUgZm9yIGV2ZXJ5IHZpcnR1YWwgaG9zdCBleHBsaWNpdGx5IGR1ZQotICB0byBzZWN1cml0eSBjb25jZXJucy4gSnVzdCBhZGQgYSAmcXVvdDtSZXdyaXRlRW5naW5lIG9uJnF1b3Q7IHRvIHlvdXIKLSAgdmlydHVhbCBob3N0IGNvbmZpZ3VyYXRpb24gcGFydHMuCi0gIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0icmV3cml0ZS1lbnZ3aGl0ZXNwYWNlIj4KLSAgICAgIDxTVFJPTkc+IEhvdyBjYW4gSSB1c2Ugc3RyaW5ncyB3aXRoIHdoaXRlc3BhY2VzIGluIFJld3JpdGVSdWxlJ3MgRU5WCi0gICAgICBmbGFnPzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBUaGVyZSBpcyBvbmx5IG9uZSB1Z2x5IHNvbHV0aW9uOiBZb3UgaGF2ZSB0byBzdXJyb3VuZCB0aGUgY29tcGxldGUKLSAgZmxhZyBhcmd1bWVudCBieSBxdW90YXRpb24gbWFya3MgKDxTQU1QPiJbRT0uLi5dIjwvU0FNUD4pLiBOb3RpY2U6Ci0gIFRoZSBhcmd1bWVudCB0byBxdW90ZSBoZXJlIGlzIG5vdCB0aGUgYXJndW1lbnQgdG8gdGhlIEUtZmxhZywgaXQgaXMKLSAgdGhlIGFyZ3VtZW50IG9mIHRoZSBBcGFjaGUgY29uZmlnIGZpbGUgcGFyc2VyLCA8RU0+aS5lLjwvRU0+LCB0aGUKLSAgdGhpcmQgYXJndW1lbnQgb2YgdGhlIFJld3JpdGVSdWxlIGhlcmUuICBTbyB5b3UgaGF2ZSB0byB3cml0ZQotICA8U0FNUD4iW0U9YW55IHRleHQgd2l0aCB3aGl0ZXNwYWNlc10iPC9TQU1QPi4KLSAgPC9QPgotICA8SFI+Ci0gPC9MST4KLQotPC9PTD4KLTwhLS0jZW5kaWYgLS0+Ci08IS0tI2lmIGV4cHI9IiRTVEFOREFMT05FIiAtLT4KLSAgPCEtLSBEb24ndCBmb3JnZXQgdG8gYWRkIEhSIHRhZ3MgYXQgdGhlIGVuZCBvZiBlYWNoIGxpc3QgaXRlbS4uIC0tPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotPCEtLSNlbmRpZiAtLT4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21pc2MvRkFRLUkuaHRtbCBiL2RvY3MvbWFudWFsL21pc2MvRkFRLUkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmOTJiYy4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9taXNjL0ZBUS1JLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotPCEtLSNpZiBleHByPSIkRkFRTUFTVEVSIiAtLT4KLSA8IS0tI3NldCB2YXI9IlNUQU5EQUxPTkUiIHZhbHVlPSIiIC0tPgotIDwhLS0jc2V0IHZhcj0iSU5DTFVERUQiIHZhbHVlPSJZRVMiIC0tPgotIDwhLS0jaWYgZXhwcj0iJFFVRVJZX1NUUklORyA9IFRPQyIgLS0+Ci0gIDwhLS0jc2V0IHZhcj0iVE9DIiB2YWx1ZT0iWUVTIiAtLT4KLSAgPCEtLSNzZXQgdmFyPSJDT05URU5UIiB2YWx1ZT0iIiAtLT4KLSA8IS0tI2Vsc2UgLS0+Ci0gIDwhLS0jc2V0IHZhcj0iVE9DIiB2YWx1ZT0iIiAtLT4KLSAgPCEtLSNzZXQgdmFyPSJDT05URU5UIiB2YWx1ZT0iWUVTIiAtLT4KLSA8IS0tI2VuZGlmIC0tPgotPCEtLSNlbHNlIC0tPgotIDwhLS0jc2V0IHZhcj0iU1RBTkRBTE9ORSIgdmFsdWU9IllFUyIgLS0+Ci0gPCEtLSNzZXQgdmFyPSJJTkNMVURFRCIgdmFsdWU9IiIgLS0+Ci0gPCEtLSNzZXQgdmFyPSJUT0MiIHZhbHVlPSIiIC0tPgotIDwhLS0jc2V0IHZhcj0iQ09OVEVOVCIgdmFsdWU9IiIgLS0+Ci08IS0tI2VuZGlmIC0tPgotPCEtLSNpZiBleHByPSIkU1RBTkRBTE9ORSIgLS0+Ci08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLSA8SEVBRD4KLSAgPFRJVExFPkFwYWNoZSBTZXJ2ZXIgRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L1RJVExFPgotIDwvSEVBRD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLSA8Qk9EWQotICBCR0NPTE9SPSIjRkZGRkZGIgotICBURVhUPSIjMDAwMDAwIgotICBMSU5LPSIjMDAwMEZGIgotICBWTElOSz0iIzAwMDA4MCIKLSAgQUxJTks9IiNGRjAwMDAiCi0gPgotICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotICA8SDEgQUxJR049IkNFTlRFUiI+QXBhY2hlIFNlcnZlciBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvSDE+Ci0gIDxQPgotICAkUmV2aXNpb246IDEuNCAkICgkRGF0ZTogMjAwMC8wMS8xNiAyMDo1MjozMCAkKQotICA8L1A+Ci0gIDxQPgotICBUaGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBGQVEgaXMgYWx3YXlzIGF2YWlsYWJsZSBmcm9tIHRoZSBtYWluCi0gIEFwYWNoZSB3ZWIgc2l0ZSwgYXQKLSAgJmx0OzxBCi0gICAgICAgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvbWlzYy9GQVEuaHRtbCIKLSAgICAgICBSRUw9IkhlbHAiCi0gICAgICA+PFNBTVA+aHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvbWlzYy9GQVEuaHRtbDwvU0FNUD48L0E+Jmd0Oy4KLSAgPC9QPgotPCEtLSBOb3RlcyBhYm91dCBjaGFuZ2VzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gIC0gSWYgYWRkaW5nIGEgcmVsYXRpdmUgbGluayB0byBhbm90aGVyIHBhcnQgb2YgdGhlICAgICAgICAgICAgLS0+Ci08IS0tICAgIGRvY3VtZW50YXRpb24sICpkbyogaW5jbHVkZSB0aGUgIi5odG1sIiBwb3J0aW9uLiAgVGhlcmUncyBhIC0tPgotPCEtLSAgICBnb29kIGNoYW5jZSB0aGF0IHRoZSB1c2VyIHdpbGwgYmUgcmVhZGluZyB0aGUgZG9jdW1lbnRhdGlvbiAtLT4KLTwhLS0gICAgb24gaGlzIG93biBzeXN0ZW0sIHdoaWNoIG1heSBub3QgYmUgY29uZmlndXJlZCBmb3IgICAgICAgICAgLS0+Ci08IS0tICAgIG11bHRpdmlld3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgLSBXaGVuIGFkZGluZyBpdGVtcywgbWFrZSBzdXJlIHRoZXkncmUgcHV0IGluIHRoZSByaWdodCBwbGFjZSAtLT4KLTwhLS0gICAgLSB2ZXJpZnkgdGhhdCB0aGUgbnVtYmVyaW5nIG1hdGNoZXMgdXAuICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAtICpEb24ndCogdXNlIDxQUkU+PC9QUkU+IGJsb2NrcyAtIHRoZXkgZG9uJ3QgYXBwZWFyICAgICAgICAgIC0tPgotPCEtLSAgICBjb3JyZWN0bHkgaW4gYSByZWxpYWJsZSB3YXkgd2hlbiB0aGlzIGlzIGNvbnZlcnRlZCB0byB0ZXh0ICAtLT4KLTwhLS0gICAgd2l0aCBMeW54LiAgVXNlIDxETD48REQ+PENPREU+eHh4PEJSPnh4PC9DT0RFPjwvREQ+PC9ETD4gICAgLS0+Ci08IS0tICAgIGJsb2NrcyBpbnNpZGUgYSA8UD48L1A+IGluc3RlYWQuICBUaGlzIGlzIG5lY2Vzc2FyeSB0byBnZXQgIC0tPgotPCEtLSAgICB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaW5kZW50aW5nIHJpZ2h0LiAgICAgICAgICAgICAgICAtLT4KLTwhLS0gIC0gRG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGUgYW4gSFIgdGFnIGFmdGVyIHRoZSBsYXN0IC9QIHRhZyAgICAgLS0+Ci08IS0tICAgIGJ1dCBiZWZvcmUgdGhlIC9MSSBpbiBhbiBpdGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8UD4KLSAgSWYgeW91IGFyZSByZWFkaW5nIGEgdGV4dC1vbmx5IHZlcnNpb24gb2YgdGhpcyBGQVEsIHlvdSBtYXkgZmluZCBudW1iZXJzCi0gIGVuY2xvc2VkIGluIGJyYWNrZXRzIChzdWNoIGFzICZxdW90O1sxMl0mcXVvdDspLiAgVGhlc2UgcmVmZXIgdG8gdGhlIGxpc3Qgb2YKLSAgcmVmZXJlbmNlIFVSTHMgdG8gYmUgZm91bmQgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuICBUaGVzZSByZWZlcmVuY2VzCi0gIGRvIG5vdCBhcHBlYXIsIGFuZCBhcmUgbm90IG5lZWRlZCwgZm9yIHRoZSBoeXBlcnRleHQgdmVyc2lvbi4KLSAgPC9QPgotICA8SDI+VGhlIFF1ZXN0aW9uczwvSDI+Ci08T0wgVFlQRT0iQSI+Ci08IS0tI2VuZGlmIC0tPgotPCEtLSNpZiBleHByPSIkVE9DIHx8ICRTVEFOREFMT05FIiAtLT4KLSA8TEkgVkFMVUU9IjkiPjxTVFJPTkc+RmVhdHVyZXM8L1NUUk9ORz4KLSAgPE9MPgotICAgPExJPjxBIEhSRUY9IiNwcm94eSI+RG9lcyBvciB3aWxsIEFwYWNoZSBhY3QgYXMgYSBQcm94eSBzZXJ2ZXI/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjbXVsdGl2aWV3cyI+V2hhdCBhcmUgJnF1b3Q7bXVsdGl2aWV3cyZxdW90Oz88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNwdXRzdXBwb3J0Ij5XaHkgY2FuJ3QgSSBwdWJsaXNoIHRvIG15IEFwYWNoZSBzZXJ2ZXIKLSAgICAgICAgdXNpbmcgUFVUIG9uIE5ldHNjYXBlIEdvbGQgYW5kIG90aGVyIHByb2dyYW1zPzwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI1NTTC1pIj5XaHkgZG9lc24ndCBBcGFjaGUgaW5jbHVkZSBTU0w/PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjZm9vdGVyIj5Ib3cgY2FuIEkgYXR0YWNoIGEgZm9vdGVyIHRvIG15IGRvY3VtZW50cwotICAgICAgICB3aXRob3V0IHVzaW5nIFNTST88L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNzZWFyY2giPkRvZXMgQXBhY2hlIGluY2x1ZGUgYSBzZWFyY2ggZW5naW5lPzwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI3JvdGF0ZSI+SG93IGNhbiBJIHJvdGF0ZSBteSBsb2cgZmlsZXM/PC9BPgotICAgPC9MST4KLSAgPC9PTD4KLSA8L0xJPgotPCEtLSNlbmRpZiAtLT4KLTwhLS0jaWYgZXhwcj0iJFNUQU5EQUxPTkUiIC0tPgotPC9PTD4KLQotPEhSPgotCi0gIDxIMj5UaGUgQW5zd2VyczwvSDI+Ci08IS0tI2VuZGlmIC0tPgotPCEtLSNpZiBleHByPSIhICRUT0MiIC0tPgotCi0gIDxIMz5JLiBGZWF0dXJlczwvSDM+Ci08T0w+Ci0KLSA8TEk+PEEgTkFNRT0icHJveHkiPgotICAgICAgPFNUUk9ORz5Eb2VzIG9yIHdpbGwgQXBhY2hlIGFjdCBhcyBhIFByb3h5IHNlcnZlcj88L1NUUk9ORz4KLSAgICAgPC9BPgotICA8UD4KLSAgQXBhY2hlIHZlcnNpb24gMS4xIGFuZCBhYm92ZSBjb21lcyB3aXRoIGEKLSAgPEEgSFJFRj0iLi4vbW9kL21vZF9wcm94eS5odG1sIj5wcm94eSBtb2R1bGU8L0E+LgotICBJZiBjb21waWxlZCBpbiwgdGhpcyB3aWxsIG1ha2UgQXBhY2hlIGFjdCBhcyBhIGNhY2hpbmctcHJveHkgc2VydmVyLgotICA8L1A+Ci0gIDxIUj4KLSA8L0xJPgotCi0gPExJPjxBIE5BTUU9Im11bHRpdmlld3MiPgotICAgICAgPFNUUk9ORz5XaGF0IGFyZSAmcXVvdDttdWx0aXZpZXdzJnF1b3Q7PzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICAmcXVvdDtNdWx0aXZpZXdzJnF1b3Q7IGlzIHRoZSBnZW5lcmFsIG5hbWUgZ2l2ZW4gdG8gdGhlIEFwYWNoZQotICBzZXJ2ZXIncyBhYmlsaXR5IHRvIHByb3ZpZGUgbGFuZ3VhZ2Utc3BlY2lmaWMgZG9jdW1lbnQgdmFyaWFudHMgaW4KLSAgcmVzcG9uc2UgdG8gYSByZXF1ZXN0LiAgVGhpcyBpcyBkb2N1bWVudGVkIHF1aXRlIHRob3JvdWdobHkgaW4gdGhlCi0gIDxBIEhSRUY9Ii4uL2NvbnRlbnQtbmVnb3RpYXRpb24uaHRtbCIgUkVMPSJIZWxwIj5jb250ZW50IG5lZ290aWF0aW9uPC9BPgotICBkZXNjcmlwdGlvbiBwYWdlLiAgSW4gYWRkaXRpb24sIDxDSVRFPkFwYWNoZSBXZWVrPC9DSVRFPiBjYXJyaWVkIGFuCi0gIGFydGljbGUgb24gdGhpcyBzdWJqZWN0IGVudGl0bGVkCi0gICZxdW90OzxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hld2Vlay5jb20vZmVhdHVyZXMvbmVnb3RpYXRpb24iIFJFTD0iSGVscCIKLSAgICAgICAgPjxDSVRFPkNvbnRlbnQgTmVnb3RpYXRpb24gRXhwbGFpbmVkPC9DSVRFPjwvQT4mcXVvdDsuCi0gIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci0KLSA8TEk+PEEgTkFNRT0icHV0c3VwcG9ydCI+Ci0gICAgICA8U1RST05HPldoeSBjYW4ndCBJIHB1Ymxpc2ggdG8gbXkgQXBhY2hlIHNlcnZlciB1c2luZyBQVVQgb24KLSAgICAgIE5ldHNjYXBlIEdvbGQgYW5kIG90aGVyIHByb2dyYW1zPzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPgotICBCZWNhdXNlIHlvdSBuZWVkIHRvIGluc3RhbGwgYW5kIGNvbmZpZ3VyZSBhIHNjcmlwdCB0byBoYW5kbGUKLSAgdGhlIHVwbG9hZGVkIGZpbGVzLiAgVGhpcyBzY3JpcHQgaXMgb2Z0ZW4gY2FsbGVkIGEgJnF1b3Q7UFVUJnF1b3Q7IGhhbmRsZXIuCi0gIFRoZXJlIGFyZSBzZXZlcmFsIGF2YWlsYWJsZSwgYnV0IHRoZXkgbWF5IGhhdmUgc2VjdXJpdHkgcHJvYmxlbXMuCi0gIFVzaW5nIEZUUCB1cGxvYWRzIG1heSBiZSBlYXNpZXIgYW5kIG1vcmUgc2VjdXJlLCBhdCBsZWFzdCBmb3Igbm93LgotICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSA8Q0lURT5BcGFjaGUgV2VlazwvQ0lURT4gYXJ0aWNsZQotICA8QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZXdlZWsuY29tL2ZlYXR1cmVzL3B1dCIKLSAgPjxDSVRFPlB1Ymxpc2hpbmcgUGFnZXMgd2l0aCBQVVQ8L0NJVEU+PC9BPi4KLSAgPC9QPgotICA8SFI+Ci0gPC9MST4KLQotIDxMST48QSBOQU1FPSJTU0wtaSI+Ci0gICAgICA8U1RST05HPldoeSBkb2Vzbid0IEFwYWNoZSBpbmNsdWRlIFNTTD88L1NUUk9ORz4KLSAgICAgPC9BPgotICA8UD4KLSAgU1NMIChTZWN1cmUgU29ja2V0IExheWVyKSBkYXRhIHRyYW5zcG9ydCByZXF1aXJlcyBlbmNyeXB0aW9uLCBhbmQgbWFueQotICBnb3Zlcm5tZW50cyBoYXZlIHJlc3RyaWN0aW9ucyB1cG9uIHRoZSBpbXBvcnQsIGV4cG9ydCwgYW5kIHVzZSBvZgotICBlbmNyeXB0aW9uIHRlY2hub2xvZ3kuICBJZiBBcGFjaGUgaW5jbHVkZWQgU1NMIGluIHRoZSBiYXNlIHBhY2thZ2UsCi0gIGl0cyBkaXN0cmlidXRpb24gd291bGQgaW52b2x2ZSBhbGwgc29ydHMgb2YgbGVnYWwgYW5kIGJ1cmVhdWNyYXRpYwotICBpc3N1ZXMsIGFuZCBpdCB3b3VsZCBubyBsb25nZXIgYmUgZnJlZWx5IGF2YWlsYWJsZS4gIEFsc28sIHNvbWUgb2YKLSAgdGhlIHRlY2hub2xvZ3kgcmVxdWlyZWQgdG8gdGFsayB0byBjdXJyZW50IGNsaWVudHMgdXNpbmcgU1NMIGlzCi0gIHBhdGVudGVkIGJ5IDxBIEhSRUY9Imh0dHA6Ly93d3cucnNhLmNvbS8iPlJTQSBEYXRhIFNlY3VyaXR5PC9BPiwKLSAgd2hvIHJlc3RyaWN0cyBpdHMgdXNlIHdpdGhvdXQgYSBsaWNlbnNlLgotICA8L1A+Ci0gIDxQPgotICBTb21lIFNTTCBpbXBsZW1lbnRhdGlvbnMgb2YgQXBhY2hlIGFyZSBhdmFpbGFibGUsIGhvd2V2ZXI7IHNlZSB0aGUKLSAgJnF1b3Q7PEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL3JlbGF0ZWRfcHJvamVjdHMuaHRtbCIKLSAgICAgICAgPnJlbGF0ZWQgcHJvamVjdHM8L0E+JnF1b3Q7Ci0gIHBhZ2UgYXQgdGhlIG1haW4gQXBhY2hlIHdlYiBzaXRlLgotICA8L1A+Ci0gIDxQPgotICBZb3UgY2FuIGZpbmQgb3V0IG1vcmUgYWJvdXQgdGhpcyB0b3BpYyBpbiB0aGUgPENJVEU+QXBhY2hlIFdlZWs8L0NJVEU+Ci0gIGFydGljbGUgYWJvdXQKLSAgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGV3ZWVrLmNvbS9mZWF0dXJlcy9zc2wiIFJFTD0iSGVscCIKLSAgPjxDSVRFPkFwYWNoZSBhbmQgU2VjdXJlIFRyYW5zYWN0aW9uczwvQ0lURT48L0E+LgotICA8L1A+Ci0gIDxIUj4KLSA8L0xJPgotIDxMST48QSBOQU1FPSJmb290ZXIiPgotICAgICAgPFNUUk9ORz5Ib3cgY2FuIEkgYXR0YWNoIGEgZm9vdGVyIHRvIG15IGRvY3VtZW50cwotICAgICAgICB3aXRob3V0IHVzaW5nIFNTST88L1NUUk9ORz4KLSAgICAgPC9BPgotICA8UD4KLSAgWW91IGNhbiBtYWtlIGFyYml0cmFyeSBjaGFuZ2VzIHRvIHN0YXRpYyBkb2N1bWVudHMgYnkgY29uZmlndXJpbmcgYW4KLSAgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvbW9kL21vZF9hY3Rpb25zLmh0bWwjYWN0aW9uIj4KLSAgQWN0aW9uPC9BPiB3aGljaCBsYXVuY2hlcyBhIENHSSBzY3JpcHQuICBUaGUgQ0dJIGlzIHRoZW4KLSAgcmVzcG9uc2libGUgZm9yIHNldHRpbmcgYSBjb250ZW50LXR5cGUgYW5kIGRlbGl2ZXJpbmcgdGhlIHJlcXVlc3RlZAotICBkb2N1bWVudCAodGhlIGxvY2F0aW9uIG9mIHdoaWNoIGlzIHBhc3NlZCBpbiB0aGUKLSAgPFNBTVA+UEFUSF9UUkFOU0xBVEVEPC9TQU1QPiBlbnZpcm9ubWVudCB2YXJpYWJsZSksIGFsb25nIHdpdGgKLSAgd2hhdGV2ZXIgZm9vdGVyIGlzIG5lZWRlZC4KLSAgPC9QPgotICA8UD4KLSAgQnVzeSBzaXRlcyBtYXkgbm90IHdhbnQgdG8gcnVuIGEgQ0dJIHNjcmlwdCBvbiBldmVyeSByZXF1ZXN0LCBhbmQKLSAgc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGFuIEFwYWNoZSBtb2R1bGUgdG8gYWRkIHRoZSBmb290ZXIuICBUaGVyZSBhcmUKLSAgc2V2ZXJhbCB0aGlyZCBwYXJ0eSBtb2R1bGVzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSA8QQotICBIUkVGPSJodHRwOi8vbW9kdWxlcy5hcGFjaGUub3JnLyI+QXBhY2hlIE1vZHVsZSBSZWdpc3RyeTwvQT4gd2hpY2gKLSAgd2lsbCBhZGQgZm9vdGVycyB0byBkb2N1bWVudHMuICBUaGVzZSBpbmNsdWRlIG1vZF90cmFpbGVyLCBQSFAKLSAgKDxTQU1QPnBocDNfYXV0b19hcHBlbmRfZmlsZTwvU0FNUD4pLCBhbmQgbW9kX3BlcmwKLSAgKDxTQU1QPkFwYWNoZTo6U2FuZHdpY2g8L1NBTVA+KS4KLSAgPC9QPgotICA8SFI+Ci0gPC9MST4KLSA8TEk+PEEgTkFNRT0ic2VhcmNoIj4KLSAgICAgIDxTVFJPTkc+RG9lcyBBcGFjaGUgaW5jbHVkZSBhIHNlYXJjaCBlbmdpbmU/PC9TVFJPTkc+Ci0gICAgIDwvQT4KLSAgPFA+QXBhY2hlIGRvZXMgbm90IGluY2x1ZGUgYSBzZWFyY2ggZW5naW5lLCBidXQgdGhlcmUgYXJlIG1hbnkgZ29vZAotICBjb21tZXJjaWFsIGFuZCBmcmVlIHNlYXJjaCBlbmdpbmVzIHdoaWNoIGNhbiBiZSB1c2VkIGVhc2lseSB3aXRoCi0gIEFwYWNoZS4gIFNvbWUgb2YgdGhlbSBhcmUgbGlzdGVkIG9uIHRoZSA8QQotICBIUkVGPSJodHRwOi8vd3d3LnNlYXJjaHRvb2xzLmNvbS90b29scy90b29scy5odG1sIj5XZWIgU2l0ZSBTZWFyY2gKLSAgVG9vbHM8L0E+IHBhZ2UuICBPcGVuIHNvdXJjZSBzZWFyY2ggZW5naW5lcyB0aGF0IGFyZSBvZnRlbiB1c2VkIHdpdGgKLSAgQXBhY2hlIGluY2x1ZGUgPEEgSFJFRj0iaHR0cDovL3d3dy5odGRpZy5vcmcvIj5odDovL0RpZzwvQT4gYW5kIDxBCi0gIEhSRUY9Imh0dHA6Ly9zdW5zaXRlLmJlcmtlbGV5LmVkdS9TV0lTSC1FLyI+U1dJU0gtRTwvQT4uCi0gIDwvUD4KLSAgPEhSPgotIDwvTEk+Ci0gPExJPjxBIE5BTUU9InJvdGF0ZSI+Ci0gICAgICA8U1RST05HPkhvdyBjYW4gSSByb3RhdGUgbXkgbG9nIGZpbGVzPzwvU1RST05HPgotICAgICA8L0E+Ci0gIDxQPlRoZSBzaW1wbGUgYW5zd2VyOiBieSBwaXBpbmcgdGhlIHRyYW5zZmVyIGxvZyBpbnRvIGFuIGFwcHJvcHJpYXRlCi0gIGxvZyBmaWxlIHJvdGF0aW9uIHV0aWxpdHkuPC9QPgotICA8UD5UaGUgbG9uZ2VyIGFuc3dlcjogSW4gdGhlIHNyYy9zdXBwb3J0LyBkaXJlY3RvcnksIHlvdSB3aWxsIGZpbmQgYQotICB1dGlsaXR5IGNhbGxlZCA8Q09ERT5yb3RhdGVsb2dzPC9DT0RFPiB3aGljaCBjYW4gYmUgdXNlZCBsaWtlIHRoaXM6PFBSRT4KLSAgIFRyYW5zZmVyTG9nICJ8L3BhdGgvdG8vcm90YXRlbG9ncyAvcGF0aC90by9sb2dzL2FjY2Vzc19sb2cgODY0MDAiCi0gIDwvUFJFPiB0byBlbmFibGUgZGFpbHkgcm90YXRpb24gb2YgdGhlIGxvZyBmaWxlcy48QlI+Ci0gIEEgbW9yZSBzb3BoaXN0aWNhdGVkIHNvbHV0aW9uIG9mIGEgbG9nZmlsZSByb3RhdGlvbiB1dGlsaXR5IGlzCi0gIGF2YWlsYWJsZSB1bmRlciB0aGUgbmFtZSA8Q09ERT5jcm9ub2xvZzwvQ09ERT4gZnJvbSBBbmRyZXcgRm9yZCdzIHNpdGUgYXQKLSAgPEEgSFJFRj0iaHR0cDovL3d3dy5mb3JkLW1hc29uLmNvLnVrL3Jlc291cmNlcy9jcm9ub2xvZy8iCi0gID5odHRwOi8vd3d3LmZvcmQtbWFzb24uY28udWsvcmVzb3VyY2VzL2Nyb25vbG9nLzwvQT4uIEl0IGNhbiBhdXRvbWF0aWNhbGx5Ci0gIGNyZWF0ZSBsb2dmaWxlIHN1YmRpcmVjdG9yaWVzIGJhc2VkIG9uIHRpbWUgYW5kIGRhdGUsIGFuZCBjYW4gaGF2ZSBhCi0gIGNvbnN0YW50IHN5bWxpbmsgcG9pbnQgdG8gdGhlIHJvdGF0aW5nIGxvZ2ZpbGVzLiAoQXMgb2YgdmVyc2lvbiAxLjYuMSwKLSAgY3Jvbm9sb2cgaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSA8QSBIUkVGPSIuLi9MSUNFTlNFIj5BcGFjaGUgTGljZW5zZTwvQT4pLgotICBVc2UgaXQgbGlrZSB0aGlzOjxQUkU+Ci0gICBDdXN0b21Mb2cgInwvcGF0aC90by9jcm9ub2xvZyAtLXN5bWxpbms9L3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9hY2Nlc3NfbG9nIC91c3IvbG9jYWwvYXBhY2hlL2xvZ3MvJVkvJW0vYWNjZXNzX2xvZyIgY29tYmluZWQKLSAgPC9QUkU+PC9QPgotICA8SFI+Ci0gPC9MST4KLTwvT0w+Ci08IS0tI2VuZGlmIC0tPgotPCEtLSNpZiBleHByPSIkU1RBTkRBTE9ORSIgLS0+Ci0gIDwhLS0gRG9uJ3QgZm9yZ2V0IHRvIGFkZCBIUiB0YWdzIGF0IHRoZSBlbmQgb2YgZWFjaCBsaXN0IGl0ZW0uLiAtLT4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KLTwhLS0jZW5kaWYgLS0+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9taXNjL0ZBUS5odG1sIGIvZG9jcy9tYW51YWwvbWlzYy9GQVEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlhOTI2Zi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9taXNjL0ZBUS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotIDxIRUFEPgotICA8VElUTEU+QXBhY2hlIFNlcnZlciBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvVElUTEU+Ci08IS0tI3NldCB2YXI9IkZBUU1BU1RFUiIgdmFsdWU9IllFUyIgLS0+Ci0gPC9IRUFEPgotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotIDxCT0RZCi0gIEJHQ09MT1I9IiNGRkZGRkYiCi0gIFRFWFQ9IiMwMDAwMDAiCi0gIExJTks9IiMwMDAwRkYiCi0gIFZMSU5LPSIjMDAwMDgwIgotICBBTElOSz0iI0ZGMDAwMCIKLSA+Ci0gIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0gIDxIMSBBTElHTj0iQ0VOVEVSIj5BcGFjaGUgU2VydmVyIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC9IMT4KLSAgPFA+Ci0gICRSZXZpc2lvbjogMS4xNDUgJCAoJERhdGU6IDE5OTkvMDYvMjQgMTU6MDI6NTMgJCkKLSAgPC9QPgotICA8UD4KLSAgVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgRkFRIGlzIGFsd2F5cyBhdmFpbGFibGUgZnJvbSB0aGUgbWFpbgotICBBcGFjaGUgd2ViIHNpdGUsIGF0Ci0gICZsdDs8QQotICAgICAgIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL21pc2MvRkFRLmh0bWwiCi0gICAgICAgUkVMPSJIZWxwIgotICAgICAgPjxTQU1QPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL21pc2MvRkFRLmh0bWw8L1NBTVA+PC9BPiZndDsuCi0gIDwvUD4KLTwhLS0gTm90ZXMgYWJvdXQgY2hhbmdlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAtIElmIGFkZGluZyBhIHJlbGF0aXZlIGxpbmsgdG8gYW5vdGhlciBwYXJ0IG9mIHRoZSAgICAgICAgICAgIC0tPgotPCEtLSAgICBkb2N1bWVudGF0aW9uLCAqZG8qIGluY2x1ZGUgdGhlICIuaHRtbCIgcG9ydGlvbi4gIFRoZXJlJ3MgYSAtLT4KLTwhLS0gICAgZ29vZCBjaGFuY2UgdGhhdCB0aGUgdXNlciB3aWxsIGJlIHJlYWRpbmcgdGhlIGRvY3VtZW50YXRpb24gLS0+Ci08IS0tICAgIG9uIGhpcyBvd24gc3lzdGVtLCB3aGljaCBtYXkgbm90IGJlIGNvbmZpZ3VyZWQgZm9yICAgICAgICAgIC0tPgotPCEtLSAgICBtdWx0aXZpZXdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gIC0gV2hlbiBhZGRpbmcgaXRlbXMsIG1ha2Ugc3VyZSB0aGV5J3JlIHB1dCBpbiB0aGUgcmlnaHQgcGxhY2UgLS0+Ci08IS0tICAgIC0gdmVyaWZ5IHRoYXQgdGhlIG51bWJlcmluZyBtYXRjaGVzIHVwLiAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgLSAqRG9uJ3QqIHVzZSA8UFJFPjwvUFJFPiBibG9ja3MgLSB0aGV5IGRvbid0IGFwcGVhciAgICAgICAgICAtLT4KLTwhLS0gICAgY29ycmVjdGx5IGluIGEgcmVsaWFibGUgd2F5IHdoZW4gdGhpcyBpcyBjb252ZXJ0ZWQgdG8gdGV4dCAgLS0+Ci08IS0tICAgIHdpdGggTHlueC4gIFVzZSA8REw+PEREPjxDT0RFPnh4eDxCUj54eDwvQ09ERT48L0REPjwvREw+ICAgIC0tPgotPCEtLSAgICBibG9ja3MgaW5zaWRlIGEgPFA+PC9QPiBpbnN0ZWFkLiAgVGhpcyBpcyBuZWNlc3NhcnkgdG8gZ2V0ICAtLT4KLTwhLS0gICAgdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGluZGVudGluZyByaWdodC4gICAgICAgICAgICAgICAgLS0+Ci08IS0tICAtIERvbid0IGZvcmdldCB0byBpbmNsdWRlIGFuIEhSIHRhZyBhZnRlciB0aGUgbGFzdCAvUCB0YWcgICAgIC0tPgotPCEtLSAgICBidXQgYmVmb3JlIHRoZSAvTEkgaW4gYW4gaXRlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPFA+Ci0gIElmIHlvdSBhcmUgcmVhZGluZyBhIHRleHQtb25seSB2ZXJzaW9uIG9mIHRoaXMgRkFRLCB5b3UgbWF5IGZpbmQgbnVtYmVycwotICBlbmNsb3NlZCBpbiBicmFja2V0cyAoc3VjaCBhcyAmcXVvdDtbMTJdJnF1b3Q7KS4gIFRoZXNlIHJlZmVyIHRvIHRoZSBsaXN0IG9mCi0gIHJlZmVyZW5jZSBVUkxzIHRvIGJlIGZvdW5kIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LiAgVGhlc2UgcmVmZXJlbmNlcwotICBkbyBub3QgYXBwZWFyLCBhbmQgYXJlIG5vdCBuZWVkZWQsIGZvciB0aGUgaHlwZXJ0ZXh0IHZlcnNpb24uCi0gIDwvUD4KLSAgPEgyPlRoZSBRdWVzdGlvbnM8L0gyPgotPCEtLSBTdHVmZiB0byBBZGQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gLSBjYW4ndCBiaW5kIHRvIHBvcnQgODAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAgLSBwZXJtaXNzaW9uIGRlbmllZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgIC0gYWRkcmVzcyBhbHJlYWR5IGluIHVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gLSBtb2RfYXV0aCAmIHBhc3N3ZCBsaW5lcyAidXNlcjpwdzouKiIgLSArKzFzdCBjb2xvbiBvbndhcmQgaXMgLS0+Ci08IS0tICAgdHJlYXRlZCBhcyBwdywgbm90IGp1c3QgKysxc3QgdG8gLS0ybmQuICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAtIFNTTDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAtIENhbiBJIHVzZSBBcGFjaGUtU1NMIGZvciBmcmVlIGluIENhbmFkYT8gICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAgLSBXaHkgY2FuJ3QgSSB1c2UgQXBhY2hlLVNTTCBpbiB0aGUgVS5TLj8gICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAtIEhvdyBjYW4gSSBmb3VuZCBvdXQgaG93IG1hbnkgdmlzaXRvcnMgbXkgc2l0ZSBnZXRzPyAgICAgICAgICAtLT4KLTwhLS0gLSBIb3cgZG8gSSBhZGQgYSBjb3VudGVyPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIC0gSG93IGRvIEkgY29uZmlndXJlIEFwYWNoZSBhcyBhIHByb3h5PyAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAtIFdoYXQgYnJvd3NlcnMgc3VwcG9ydCBIVFRQLzEuMT8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gLSBXaGF0J3MgdGhlIHBvaW50IG9mIHZob3N0cy1ieS1uYW1lIGlzIHRoZXJlIGFyZW4ndCBhbnkgICAgICAgLS0+Ci08IS0tICAgSFRUUC8xLjEgYnJvd3NlcnM/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAtIElzIHRoZXJlIGFuIEFwYWNoZSBmb3IgVzk1L1dOVD8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gLSBXaHkgZG9lcyBBcGFjaGUgZGllIHdoZW4gYSB2aG9zdCBjYW4ndCBiZSBETlMtcmVzb2x2ZWQ/ICAgICAgLS0+Ci08IS0tIC0gV2h5IGRvIEkgZ2V0ICJzZW5kIGxvc3QgY29ubmVjdGlvbiIgbWVzc2FnZXMgaW4gbXkgZXJyb3IgICAgIC0tPgotPCEtLSAgIGxvZz8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAtIHNwZWNpZmljYWxseSBjb25zaWRlciAucGRmIGZpbGVzIHdoaWNoIHNlZW0gdG8gY2F1c2UgdGhpcyAgLS0+Ci08IS0tICAgICBhIGxvdCB3aGVuIGFjY2Vzc2VkIHZpYSB0aGUgcGx1Z2luIC4uLiBhbmQgYWxzbyBtZW50aW9uICAgIC0tPgotPCEtLSAgICAgaG93IHJhbmdlLXJlcXVlc3RzIGNhbiBjYXVzZSBieXRlcyBzZXJ2ZWQgPCBmaWxlIHNpemUgICAgICAtLT4KLTwhLS0gLSBXaHkgZG8gZGlyZWN0b3J5IGluZGV4ZXMgYXBwZWFyIGFzIGdhcmJhZ2U/ICAoQTogLWx1Y2IpICAgICAgLS0+Ci08IS0tIC0gSG93IGRvIEkgYWRkIGEgZm9vdGVyIHRvIGFsbCBwYWdlcyBvZmZlcmVkIGJ5IG15IHNlcnZlcj8gICAgIC0tPgotPCEtLSAtIEZpeCBtaWRpIHF1ZXN0aW9uOyBhIGJpZ2dlciBwcm9ibGVtIHRoYW4gbWlkaSB2cy4geC1taWRpIGlzICAtLT4KLTwhLS0gICB0aGUgc2ltcGxlIGZhY3QgdGhhdCBvbGRlciB2ZXJzaW9ucyBvZiBBcGFjaGUgKGFuZCBuZXcgb25lcyAgLS0+Ci08IS0tICAgdGhhdCBoYXZlIGJlZW4gdXBncmFkZWQgd2l0aG91dCB1cGdyYWRpbmcgdGhlIG1pbWUudHlwZXMgICAgIC0tPgotPCEtLSAgIGZpbGUpIGRvbid0IGhhdmUgdGhlIHR5cGUgbGlzdGVkIGF0IGFsbC4gICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gLSBSZXdyaXRlUnVsZSAvfmZyYWdnbGUvKiAvY2dpLWJpbi9mcmFnZ2xlLnBsIGRvZXMgbm90IHdvcmsgICAgLS0+Ci08IS0tIC0gaG93IGRvIEkgZGlzYWJsZSBhdXRoZW50aWNhdGlvbiBmb3IgYSBzdWJkaXJlY3Rvcnk/ICAgICAgICAgIC0tPgotPCEtLSAgIChBOiB5b3UgY2FuJ3QgYnV0ICJzYXRpc2Z5IGFueTsgYWxsb3cgZnJvbSBhbGwiIGNhbiBiZSBjbG9zZSAtLT4KLTwhLS0gLSAnNDAwIG1hbGZvcm1lZCByZXF1ZXN0JyBvbiBXaW4zMiBtaWdodCBtZWFuIHN0YWxlIHByb3h5OyBzZWUgLS0+Ci08IS0tICAgUFIgIzIzMDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAtIGhvdyBkbyBJIHRlbGwgd2hhdCB2ZXJzaW9uIG9mIEFwYWNoZSBJIGFtIHJ1bm5pbmc/ICAgICAgICAgICAtLT4KLTxPTCBUWVBFPSJBIj4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJGQVEtQS5odG1sP1RPQyIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iRkFRLUIuaHRtbD9UT0MiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9IkZBUS1DLmh0bWw/VE9DIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJGQVEtRC5odG1sP1RPQyIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iRkFRLUUuaHRtbD9UT0MiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9IkZBUS1GLmh0bWw/VE9DIiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJGQVEtRy5odG1sP1RPQyIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iRkFRLUguaHRtbD9UT0MiIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9IkZBUS1JLmh0bWw/VE9DIiAtLT4KLTwvT0w+Ci0KLTxIUj4KLQotICA8SDI+VGhlIEFuc3dlcnM8L0gyPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9IkZBUS1BLmh0bWw/IiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJGQVEtQi5odG1sPyIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iRkFRLUMuaHRtbD8iIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9IkZBUS1ELmh0bWw/IiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJGQVEtRS5odG1sPyIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iRkFRLUYuaHRtbD8iIC0tPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9IkZBUS1HLmh0bWw/IiAtLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJGQVEtSC5odG1sPyIgLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iRkFRLUkuaHRtbD8iIC0tPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbWlzYy9jbGllbnRfYmxvY2tfYXBpLmh0bWwgYi9kb2NzL21hbnVhbC9taXNjL2NsaWVudF9ibG9ja19hcGkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ1MWQxOS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9taXNjL2NsaWVudF9ibG9ja19hcGkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+UmVhZGluZyBDbGllbnQgSW5wdXQgaW4gQXBhY2hlIDEuMjwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPlJlYWRpbmcgQ2xpZW50IElucHV0IGluIEFwYWNoZSAxLjI8L0gxPgotCi08SFI+Ci0KLTxQPkFwYWNoZSAxLjEgYW5kIGVhcmxpZXIgbGV0IG1vZHVsZXMgaGFuZGxlIFBPU1QgYW5kIFBVVCByZXF1ZXN0cyBieQotdGhlbXNlbHZlcy4gVGhlIG1vZHVsZSB3b3VsZCwgb24gaXRzIG93biwgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlCi1yZXF1ZXN0IGhhZCBhbiBlbnRpdHksIGhvdyBtYW55IGJ5dGVzIGl0IHdhcywgYW5kIHRoZW4gY2FsbGVkIGEKLWZ1bmN0aW9uICg8Q09ERT5yZWFkX2NsaWVudF9ibG9jazwvQ09ERT4pIHRvIGdldCB0aGUgZGF0YS4KLQotPFA+SG93ZXZlciwgSFRUUC8xLjEgcmVxdWlyZXMgc2V2ZXJhbCB0aGluZ3Mgb2YgUE9TVCBhbmQgUFVUIHJlcXVlc3QKLWhhbmRsZXJzIHRoYXQgZGlkIG5vdCBmaXQgaW50byB0aGlzIG1vZHVsZSwgYW5kIGFsbCBleGlzdGluZyBtb2R1bGVzCi1oYXZlIHRvIGJlIHJld3JpdHRlbi4gVGhlIEFQSSBjYWxscyBmb3IgaGFuZGxpbmcgdGhpcyBoYXZlIGJlZW4KLWZ1cnRoZXIgYWJzdHJhY3RlZCwgc28gdGhhdCBmdXR1cmUgSFRUUCBwcm90b2NvbCBjaGFuZ2VzIGNhbiBiZQotYWNjb21wbGlzaGVkIHdoaWxlIHJlbWFpbmluZyBiYWNrd2FyZHMtY29tcGF0aWJsZS48L1A+Ci0KLTxIUj4KLQotPEgzPlRoZSBOZXcgQVBJIEZ1bmN0aW9uczwvSDM+Ci0KLTxQUkU+Ci0gICBpbnQgYXBfc2V0dXBfY2xpZW50X2Jsb2NrIChyZXF1ZXN0X3JlYyAqLCBpbnQgcmVhZF9wb2xpY3kpOwotICAgaW50IGFwX3Nob3VsZF9jbGllbnRfYmxvY2sgKHJlcXVlc3RfcmVjICopOwotICAgbG9uZyBhcF9nZXRfY2xpZW50X2Jsb2NrIChyZXF1ZXN0X3JlYyAqLCBjaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSk7Ci08L1BSRT4KLQotPE9MPgotPExJPkNhbGwgPENPREU+YXBfc2V0dXBfY2xpZW50X2Jsb2NrKCk8L0NPREU+IG5lYXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVxdWVzdAotICAgIGhhbmRsZXIuIFRoaXMgd2lsbCBzZXQgdXAgYWxsIHRoZSBuZWNlc3NhcnkgcHJvcGVydGllcywgYW5kCi0gICAgd2lsbCByZXR1cm4gZWl0aGVyIE9LLCBvciBhbiBlcnJvciBjb2RlLiBJZiB0aGUgbGF0dGVyLAotICAgIHRoZSBtb2R1bGUgc2hvdWxkIHJldHVybiB0aGF0IGVycm9yIGNvZGUuIFRoZSBzZWNvbmQgcGFyYW1ldGVyCi0gICAgc2VsZWN0cyB0aGUgcG9saWN5IHRvIGFwcGx5IGlmIHRoZSByZXF1ZXN0IG1lc3NhZ2UgaW5kaWNhdGVzIGEKLSAgICBib2R5LCBhbmQgaG93IGEgY2h1bmtlZAotICAgIHRyYW5zZmVyLWNvZGluZyBzaG91bGQgYmUgaW50ZXJwcmV0ZWQuIENob29zZSBvbmUgb2YKLTxQUkU+Ci0gICAgUkVRVUVTVF9OT19CT0RZICAgICAgICAgIFNlbmQgNDEzIGVycm9yIGlmIG1lc3NhZ2UgaGFzIGFueSBib2R5Ci0gICAgUkVRVUVTVF9DSFVOS0VEX0VSUk9SICAgIFNlbmQgNDExIGVycm9yIGlmIGJvZHkgd2l0aG91dCBDb250ZW50LUxlbmd0aAotICAgIFJFUVVFU1RfQ0hVTktFRF9ERUNIVU5LICBJZiBjaHVua2VkLCByZW1vdmUgdGhlIGNodW5rcyBmb3IgbWUuCi0gICAgUkVRVUVTVF9DSFVOS0VEX1BBU1MgICAgIFBhc3MgdGhlIGNodW5rcyB0byBtZSB3aXRob3V0IHJlbW92YWwuCi08L1BSRT4KLSAgICBJbiBvcmRlciB0byB1c2UgdGhlIGxhc3QgdHdvIG9wdGlvbnMsIHRoZSBjYWxsZXIgTVVTVCBwcm92aWRlIGEgYnVmZmVyCi0gICAgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYSBjaHVuay1zaXplIGxpbmUsIGluY2x1ZGluZyBhbnkgZXh0ZW5zaW9ucy4KLQotCi0KLTxMST5XaGVuIHlvdSBhcmUgcmVhZHkgdG8gcG9zc2libHkgYWNjZXB0IGlucHV0LCBjYWxsCi0gICAgPENPREU+YXBfc2hvdWxkX2NsaWVudF9ibG9jaygpPC9DT0RFPi4KLSAgICBUaGlzIHdpbGwgdGVsbCB0aGUgbW9kdWxlIHdoZXRoZXIgb3Igbm90IHRvIHJlYWQgaW5wdXQuIElmIGl0IGlzIDAsCi0gICAgdGhlIG1vZHVsZSBzaG91bGQgYXNzdW1lIHRoYXQgdGhlIGlucHV0IGlzIG9mIGEgbm9uLWVudGl0eSB0eXBlCi0gICAgKDxFTT5lLmcuPC9FTT4sIGEgR0VUIHJlcXVlc3QpLiBBIG5vbnplcm8gcmVzcG9uc2UgaW5kaWNhdGVzIHRoYXQgdGhlIG1vZHVsZQotICAgIHNob3VsZCBwcm9jZWVkICh0byBzdGVwIDMpLgotICAgIFRoaXMgc3RlcCBhbHNvIHNlbmRzIGEgMTAwIENvbnRpbnVlIHJlc3BvbnNlCi0gICAgdG8gSFRUUC8xLjEgY2xpZW50cywgc28gc2hvdWxkIG5vdCBiZSBjYWxsZWQgdW50aWwgdGhlIG1vZHVsZQotICAgIGlzIDxTVFJPTkc+KmRlZmluaXRlbHkqPC9TVFJPTkc+IHJlYWR5IHRvIHJlYWQgY29udGVudC4gKG90aGVyd2lzZSwgdGhlCi0gICAgcG9pbnQgb2YgdGhlCi0gICAgMTAwIHJlc3BvbnNlIGlzIGRlZmVhdGVkKS4gTmV2ZXIgY2FsbCB0aGlzIGZ1bmN0aW9uIG1vcmUgdGhhbiBvbmNlLgotCi08TEk+RmluYWxseSwgY2FsbCA8Q09ERT5hcF9nZXRfY2xpZW50X2Jsb2NrPC9DT0RFPiBpbiBhIGxvb3AuIFBhc3MgaXQgYQotICAgIGJ1ZmZlciBhbmQgaXRzCi0gICAgc2l6ZS4gSXQgd2lsbCBwdXQgZGF0YSBpbnRvIHRoZSBidWZmZXIgKG5vdCBuZWNlc3NhcmlseSB0aGUgZnVsbAotICAgIGJ1ZmZlciwgaW4gdGhlIGNhc2Ugb2YgY2h1bmtlZCBpbnB1dHMpLCBhbmQgcmV0dXJuIHRoZSBsZW5ndGggb2YKLSAgICB0aGUgaW5wdXQgYmxvY2suIFdoZW4gaXQgaXMgZG9uZSByZWFkaW5nLCBpdCB3aWxsCi0gICAgcmV0dXJuIDAgaWYgRU9GLCBvciAtMSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuCi0KLTwvT0w+Ci0KLTxQPkFzIGFuIGV4YW1wbGUsIHBsZWFzZSBsb29rIGF0IHRoZSBjb2RlIGluCi08Q09ERT5tb2RfY2dpLmM8L0NPREU+LiBUaGlzIGlzIHByb3Blcmx5IHdyaXR0ZW4gdG8gdGhlIG5ldyBBUEkKLWd1aWRlbGluZXMuPC9QPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbWlzYy9jb21wYXRfbm90ZXMuaHRtbCBiL2RvY3MvbWFudWFsL21pc2MvY29tcGF0X25vdGVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxOWVlOTMuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbWlzYy9jb21wYXRfbm90ZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iCi0gImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvbG9vc2UuZHRkIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIEhUVFAgU2VydmVyOiBOb3RlcyBhYm91dCBDb21wYXRpYmlsaXR5IHdpdGggTkNTQSdzIFNlcnZlcjwvVElUTEU+Ci08L0hFQUQ+Ci08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5Db21wYXRpYmlsaXR5IE5vdGVzIHdpdGggTkNTQSdzIFNlcnZlcjwvSDE+Ci0KLTxIUj4KLQotV2hpbGUgQXBhY2hlIGlzIGZvciB0aGUgbW9zdCBwYXJ0IGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgTkNTQSdzCi1odHRwZCwgdGhlcmUgYXJlIGEgY291cGxlIGdvdGNoYSdzIHRvIHdhdGNoIG91dCBmb3IuICBUaGVzZSBhcmUgbW9zdGx5Ci1kdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGUgcGFyc2VyIGZvciBjb25maWcgYW5kIGFjY2VzcyBjb250cm9sIGZpbGVzCi13YXMgcmV3cml0dGVuIGZyb20gc2NyYXRjaCwgc28gY2VydGFpbiBsaWJlcnRpZXMgdGhlIGVhcmxpZXIgc2VydmVycwotdG9vayBtYXkgbm90IGJlIGF2YWlsYWJsZSBoZXJlLiAgVGhlc2UgYXJlIGFsbCBlYXNpbHkgZml4YWJsZS4gIElmIHlvdQota25vdyBvZiBvdGhlciBub24tZmF0YWwgcHJvYmxlbXMgdGhhdCBiZWxvbmcgaGVyZSwgPEEKLUhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9idWdfcmVwb3J0Lmh0bWwiPmxldCB1cyBrbm93LjwvQT4KLQotPFA+UGxlYXNlIGFsc28gY2hlY2sgdGhlIDxBIEhSRUY9Imtub3duX2NsaWVudF9wcm9ibGVtcy5odG1sIj5rbm93bgotY2xpZW50IHByb2JsZW1zPC9BPiBwYWdlLgotCi08T0w+Ci08TEk+QXMgb2YgQXBhY2hlIDEuMy4xLCBtZXRob2RzIG5hbWVkIGluIGEKLSAgICA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI2xpbWl0Ij48U0FNUD4mbHQ7TGltaXQmZ3Q7PC9TQU1QPjwvQT4KLSAgICBzZWN0aW9uIDxFTT5tdXN0PC9FTT4gYmUgbGlzdGVkIGluIHVwcGVyLWNhc2UuICBMb3dlci0gb3IgbWl4ZWQtY2FzZQotICAgIG1ldGhvZCBuYW1lcyB3aWxsIHJlc3VsdCBpbiBhIGNvbmZpZ3VyYXRpb24gZXJyb3IuCi0gICAgPFA+Ci0gICAgPC9QPgotPC9MST4KLQotPExJPlRoZSBiYXNpYyBtb2RfYXV0aCA8Q09ERT5BdXRoR3JvdXBGaWxlPC9DT0RFPi1zcGVjaWZpZWQgZ3JvdXAgZmlsZQotICAgIGZvcm1hdCBhbGxvd3MgY29tbWFzIGJldHdlZW4gdXNlciBuYW1lcyAtIEFwYWNoZSBkb2VzIG5vdC4KLQotPFA+Ci08TEk+SWYgeW91IGZvbGxvdyB0aGUgTkNTQSBndWlkZWxpbmVzIGZvciBzZXR0aW5nIHVwIGFjY2VzcwotICAgIHJlc3RyaWN0aW9ucyBiYXNlZCBvbiBjbGllbnQgZG9tYWluLCB5b3UgbWF5IHdlbGwgaGF2ZSBhZGRlZAotICAgIGVudHJpZXMgZm9yLCA8Q09ERT5BdXRoVHlwZSwgQXV0aE5hbWUsIEF1dGhVc2VyRmlsZTwvQ09ERT4gb3IKLSAgICA8Q09ERT5BdXRoR3JvdXBGaWxlPC9DT0RFPi4gIDxTVFJPTkc+Tm9uZTwvU1RST05HPiBvZiB0aGVzZSBhcmUKLSAgICBuZWVkZWQgKG9yIGFwcHJvcHJpYXRlKSBmb3IgcmVzdHJpY3RpbmcgYWNjZXNzIGJhc2VkIG9uIGNsaWVudAotICAgIGRvbWFpbi4gIFdoZW4gQXBhY2hlIHNlZXMgPENPREU+QXV0aFR5cGU8L0NPREU+IGl0IChyZWFzb25hYmx5KQotICAgIGFzc3VtZXMgeW91IGFyZSB1c2luZyBzb21lIGF1dGhvcml6YXRpb24gdHlwZSBiYXNlZCBvbiB1c2VybmFtZQotICAgIGFuZCBwYXNzd29yZC4gIFBsZWFzZSByZW1vdmUgPENPREU+QXV0aFR5cGU8L0NPREU+LCBpdCdzCi0gICAgdW5uZWNlc3NhcnkgZXZlbiBmb3IgTkNTQS4KLQotPFA+Ci08TEk+PENPREU+T2xkU2NyaXB0QWxpYXM8L0NPREU+IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuCi0KLTxQPgotPExJPjxDT0RFPmV4ZWMgY2dpPSIiPC9DT0RFPiBwcm9kdWNlcyByZWFzb25hYmxlIDxTVFJPTkc+bWFsZm9ybWVkCi0gIGhlYWRlcjwvU1RST05HPiByZXNwb25zZXMgd2hlbiB1c2VkIHRvIGludm9rZSBub24tQ0dJIHNjcmlwdHMuPEJSPgotICBUaGUgTkNTQSBjb2RlIGlnbm9yZXMgdGhlIG1pc3NpbmcgaGVhZGVyLiAoYmFkIGlkZWEpCi0gIDxCUj5Tb2x1dGlvbjogd3JpdGUgQ0dJIHRvIHRoZSBDR0kgc3BlYyBhbmQgdXNlCi0gIDxDT0RFPmluY2x1ZGUmbmJzcDt2aXJ0dWFsPC9DT0RFPiwgb3IgdXNlIDxDT0RFPmV4ZWMgY21kPSIiPC9DT0RFPiBpbnN0ZWFkLgotCi08UD4KLTxMST5JY29ucyBmb3IgRmFuY3lJbmRleGluZyBicm9rZW4gLSB3ZWxsLCBubywgdGhleSdyZSBub3QgYnJva2VuLAotICAgIHdlJ3ZlIGp1c3QgdXBncmFkZWQgdGhlIGljb25zIGZyb20gZmxhdCAueGJtIGZpbGVzIHRvIHByZXR0eSBhbmQKLSAgICBtdWNoIHNtYWxsZXIgLmdpZiBmaWxlcywgY291cnRlc3kgb2YgPEEKLSAgICBIUkVGPSJtYWlsdG86a2V2aW5oQGVpdC5jb20iPktldmluIEh1Z2hlczwvQT4gYXQgPEEKLSAgICBIUkVGPSJodHRwOi8vd3d3LmVpdC5jb20vIj5FSVQ8L0E+LiAgSWYgeW91IGFyZSB1c2luZyB0aGUgc2FtZQotICAgIHNybS5jb25mIGZyb20gYW4gb2xkIGRpc3RyaWJ1dGlvbiwgbWFrZSBzdXJlIHlvdSBhZGQgdGhlIG5ldyA8QQotICAgIEhSRUY9Ii4uL21vZC9tb2RfYXV0b2luZGV4Lmh0bWwjYWRkaWNvbiI+QWRkSWNvbjwvQT4sIDxBCi0gICAgSFJFRj0iLi4vbW9kL21vZF9hdXRvaW5kZXguaHRtbCNhZGRpY29uYnl0eXBlIj5BZGRJY29uQnlUeXBlPC9BPiwKLSAgICBhbmQgPEEKLSAgICBIUkVGPSIuLi9tb2QvbW9kX2F1dG9pbmRleC5odG1sI2RlZmF1bHRpY29uIj5EZWZhdWx0SWNvbjwvQT4KLSAgICBkaXJlY3RpdmVzLgotCi08UD4KLTxMST5BcGFjaGUgdmVyc2lvbnMgYmVmb3JlIDEuMmIxIHdpbGwgaWdub3JlIHRoZSBsYXN0IGxpbmUgb2YgY29uZmlndXJhdGlvbgotICAgIGZpbGVzIGlmIHRoZSBsYXN0IGxpbmUgZG9lcyBub3QgaGF2ZSBhIHRyYWlsaW5nIG5ld2xpbmUuIFRoaXMgYWZmZWN0cwotICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMgKGh0dHBkLmNvbmYsIGFjY2Vzcy5jb25mIGFuZCBzcm0uY29uZiksIGFuZAotICAgIGh0cGFzc3dkIGFuZCBodGdyb3VwIGZpbGVzLgotCi08UD4KLTxMST5BcGFjaGUgZG9lcyBub3QgcGVybWl0IGNvbW1hcyBkZWxpbWl0aW5nIHRoZSBtZXRob2RzIGluICZsdDtMaW1pdCZndDsuCi0KLTxQPgotPExJPkFwYWNoZSdzIDxDT0RFPiZsdDtWaXJ0dWFsSG9zdCZndDs8L0NPREU+IHRyZWF0cyBhbGwgYWRkcmVzc2VzIGFzCi0gICAgIm9wdGlvbmFsIiAoPEVNPmkuZS48L0VNPiwgdGhlIHNlcnZlciBzaG91bGQgY29udGludWUgYm9vdGluZyBpZiBpdCBjYW4ndAotICAgIHJlc29sdmUgdGhlIGFkZHJlc3MpLiAgV2hlcmVhcyBpbiBOQ1NBIHRoZSBkZWZhdWx0IGlzIHRvIGZhaWwKLSAgICBib290aW5nIHVubGVzcyBhbiBhZGRlZCA8Q09ERT5vcHRpb25hbDwvQ09ERT4ga2V5d29yZCBpcyBpbmNsdWRlZC4KLQotPFA+Ci08TEk+QXBhY2hlIGRvZXMgbm90IGltcGxlbWVudCA8Q09ERT5PbkRlbnk8L0NPREU+IHVzZQotICAgIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjZXJyb3Jkb2N1bWVudCI+PENPREU+RXJyb3JEb2N1bWVudDwvQ09ERT48L0E+Ci0gICAgaW5zdGVhZC4KLQotPFA+Ci08TEk+QXBhY2hlIChhcyBvZiAxLjMpIGFsd2F5cyBwZXJmb3JtcyB0aGUgZXF1aXZhbGVudCBvZgotICAgIDxDT0RFPkhvc3RuYW1lTG9va3VwcyBtaW5pbWFsPC9DT0RFPi4gIDxDT0RFPm1pbmltYWw8L0NPREU+IGlzIG5vdCBhbgotICAgIG9wdGlvbiB0byA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI2hvc3RuYW1lbG9va3VwcyI+PENPREU+Ci0gICAgSG9zdG5hbWVMb29rdXBzPC9DT0RFPjwvQT4uCi0KLTxQPgotPExJPlRvIGVtYmVkIHNwYWNlcyBpbiBkaXJlY3RpdmUgYXJndW1lbnRzIE5DU0EgdXNlZCBhIGJhY2tzbGFzaAotICAgIGJlZm9yZSB0aGUgc3BhY2UuIEFwYWNoZSB0cmVhdHMgYmFja3NsYXNoZXMgYXMgbm9ybWFsIGNoYXJhY3RlcnMuIFRvCi0gICAgZW1iZWQgc3BhY2VzIHN1cnJvdW5kIHRoZSBhcmd1bWVudCB3aXRoIGRvdWJsZS1xdW90ZXMgaW5zdGVhZC4KLQotPFA+Ci08TEk+QXBhY2hlIGRvZXMgbm90IGltcGxlbWVudCB0aGUgTkNTQSA8Q09ERT5yZWZlcmVyPC9DT0RFPgotICAgIGRpcmVjdGl2ZS4gIFNlZSA8QSBIUkVGPSJodHRwOi8vYnVncy5hcGFjaGUub3JnL2luZGV4L2Z1bGwvOTY4Ij4KLSAgICBQUiM5Njg8L0E+IGZvciBhIGZldyBicmllZiBzdWdnZXN0aW9ucyBvbiBhbHRlcm5hdGl2ZSB3YXlzIHRvIAotICAgIGltcGxlbWVudCB0aGUgc2FtZSB0aGluZyB1bmRlciBBcGFjaGUuCi0KLTxQPgotPExJPkFwYWNoZSBkb2VzIG5vdCBhbGxvdyBTZXJ2ZXJSb290IHNldHRpbmdzIGluc2lkZSBhIFZpcnR1YWxIb3N0Ci0gICAgY29udGFpbmVyLiAgVGhlcmUgaXMgb25seSBvbmUgZ2xvYmFsIFNlcnZlclJvb3QgaW4gQXBhY2hlOyBhbnkgZGVzaXJlZAotICAgIGNoYW5nZXMgaW4gcGF0aHMgZm9yIHZpcnR1YWwgaG9zdHMgbmVlZCB0byBiZSBtYWRlIHdpdGggdGhlIGV4cGxpY2l0Ci0gICAgZGlyZWN0aXZlcywgZWcuIERvY3VtZW50Um9vdCwgVHJhbnNmZXJMb2csIDxFTT5ldGMuPC9FTT4KLQotPC9PTD4KLQotTW9yZSB0byBjb21lIHdoZW4gd2Ugbm90aWNlIHRoZW0uLi4uCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9taXNjL2N1c3RvbV9lcnJvcmRvY3MuaHRtbCBiL2RvY3MvbWFudWFsL21pc2MvY3VzdG9tX2Vycm9yZG9jcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2Q1MGExLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21pc2MvY3VzdG9tX2Vycm9yZG9jcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+SW50ZXJuYXRpb25hbCBDdXN0b21pemVkIFNlcnZlciBFcnJvciBNZXNzYWdlczwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotCi08SDEgQUxJR049IkNFTlRFUiI+VXNpbmcgWFNTSSBhbmQgPFNBTVA+RXJyb3JEb2N1bWVudDwvU0FNUD4gdG8gY29uZmlndXJlCi1jdXN0b21pemVkIGludGVybmF0aW9uYWwgc2VydmVyIGVycm9yIHJlc3BvbnNlczwvSDE+Ci08UD4KLTxIMj5JbmRleDwvSDI+Ci08VUw+Ci0gPExJPjxBIEhSRUY9IiNpbnRybyI+SW50cm9kdWN0aW9uPC9BPgotIDxMST48QSBIUkVGPSIjY3JlYXRlZGlyIj5DcmVhdGluZyBhbiBFcnJvckRvY3VtZW50IGRpcmVjdG9yeTwvQT4KLSA8TEk+PEEgSFJFRj0iI2RvY25hbWVzIj5OYW1pbmcgdGhlIGluZGl2aWR1YWwgZXJyb3IgZG9jdW1lbnQgZmlsZXM8L0E+Ci0gPExJPjxBIEhSRUY9IiNoZWFkZm9vdCI+VGhlIGNvbW1vbiBoZWFkZXIgYW5kIGZvb3RlciBmaWxlczwvQT4KLSA8TEk+PEEgSFJFRj0iI2NyZWF0ZWRvY3MiPkNyZWF0aW5nIEVycm9yRG9jdW1lbnRzIGluIGRpZmZlcmVudCBsYW5ndWFnZXM8L0E+Ci0gPExJPjxBIEhSRUY9IiNmYWxsYmFjayI+VGhlIGZhbGxiYWNrIGxhbmd1YWdlPC9BPgotIDxMST48QSBIUkVGPSIjcHJveHkiPkN1c3RvbWl6aW5nIFByb3h5IEVycm9yIE1lc3NhZ2VzPC9BPgotIDxMST48QSBIUkVGPSIjbGlzdGluZ3MiPkhUTUwgbGlzdGluZyBvZiB0aGUgZGlzY3Vzc2VkIGV4YW1wbGU8L0E+Ci08L1VMPgotPEhSPgotPEgyPjxBIE5BTUU9ImludHJvIj5JbnRyb2R1Y3Rpb248L0E+PC9IMj4KLVRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGFuIGVhc3kgd2F5IHRvIHByb3ZpZGUgeW91ciBhcGFjaGUgV1dXIHNlcnZlcgotd2l0aCBhIHNldCBvZiBjdXN0b21pemVkIGVycm9yIG1lc3NhZ2VzIHdoaWNoIHRha2UgYWR2YW50YWdlIG9mCi08QSBIUkVGPSIuLi9jb250ZW50LW5lZ290aWF0aW9uLmh0bWwiPkNvbnRlbnQgTmVnb3RpYXRpb248L0E+Ci1hbmQgPEEgSFJFRj0iLi4vbW9kL21vZF9pbmNsdWRlLmh0bWwiPmVYdGVuZGVkIFNlcnZlciBTaWRlIEluY2x1ZGVzIChYU1NJKTwvQT4KLXRvIHJldHVybiBlcnJvciBtZXNzYWdlcyBnZW5lcmF0ZWQgYnkgdGhlIHNlcnZlciBpbiB0aGUgY2xpZW50J3MKLW5hdGl2ZSBsYW5ndWFnZS4KLTwvUD4KLTxQPgotQnkgdXNpbmcgWFNTSSwgYWxsCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI2Vycm9yZG9jdW1lbnQiPmN1c3RvbWl6ZWQgbWVzc2FnZXM8L0E+Ci1jYW4gc2hhcmUgYSBob21vZ2Vub3VzIGFuZCBjb25zaXN0ZW50IHN0eWxlIGFuZCBsYXlvdXQsIGFuZCBtYWludGVuYW5jZSB3b3JrCi0oY2hhbmdpbmcgaW1hZ2VzLCBjaGFuZ2luZyBsaW5rcykgaXMga2VwdCB0byBhIG1pbmltdW0gYmVjYXVzZSBhbGwgbGF5b3V0Ci1pbmZvcm1hdGlvbiBjYW4gYmUga2VwdCBpbiBhIHNpbmdsZSBmaWxlLjxCUj4KLUVycm9yIGRvY3VtZW50cyBjYW4gYmUgc2hhcmVkIGFjcm9zcyBkaWZmZXJlbnQgc2VydmVycywgb3IgZXZlbiBob3N0cywKLWJlY2F1c2UgYWxsIHZhcnlpbmcgaW5mb3JtYXRpb24gaXMgaW5zZXJ0ZWQgYXQgdGhlIHRpbWUgdGhlIGVycm9yIGRvY3VtZW50Ci1pcyByZXR1cm5lZCBvbiBiZWhhbGYgb2YgYSBmYWlsZWQgcmVxdWVzdC4KLTwvUD4KLTxQPgotQ29udGVudCBOZWdvdGlhdGlvbiB0aGVuIHNlbGVjdHMgdGhlIGFwcHJvcHJpYXRlIGxhbmd1YWdlIHZlcnNpb24gb2YgYQotcGFydGljdWxhciBlcnJvciBtZXNzYWdlIHRleHQsIGhvbm9yaW5nIHRoZSBsYW5ndWFnZSBwcmVmZXJlbmNlcyBwYXNzZWQKLWluIHRoZSBjbGllbnQncyByZXF1ZXN0LiAoVXNlcnMgdXN1YWxseSBzZWxlY3QgdGhlaXIgZmF2b3JpdGUgbGFuZ3VhZ2VzCi1pbiB0aGUgcHJlZmVyZW5jZXMgb3B0aW9ucyBtZW51IG9mIHRvZGF5J3MgYnJvd3NlcnMpLiBXaGVuIGFuIGVycm9yCi1kb2N1bWVudCBpbiB0aGUgY2xpZW50J3MgcHJpbWFyeSBsYW5ndWFnZSB2ZXJzaW9uIGlzIHVuYXZhaWxhYmxlLCB0aGUgCi1zZWNvbmRhcnkgbGFuZ3VhZ2VzIGFyZSB0cmllZCBvciBhIGRlZmF1bHQgKGZhbGxiYWNrKSB2ZXJzaW9uIGlzIHVzZWQuCi08L1A+Ci08UD4KLVlvdSBoYXZlIGZ1bGwgZmxleGliaWxpdHkgaW4gZGVzaWduaW5nIHlvdXIgZXJyb3IgZG9jdW1lbnRzIHRvCi15b3VyIHBlcnNvbmFsIHRhc3RlIChvciB5b3VyIGNvbXBhbnkncyBjb252ZW50aW9ucykuIEZvciBkZW1vbnN0cmF0aW9uCi1wdXJwb3Nlcywgd2UgcHJlc2VudCBhIHNpbXBsZSBnZW5lcmljIGVycm9yIGRvY3VtZW50IHNjaGVtZS4KLUZvciB0aGlzIGh5cG90aGV0aWMgc2VydmVyLCB3ZSBhc3N1bWUgdGhhdCBhbGwgZXJyb3IgbWVzc2FnZXMuLi4KLTxVTD4KLTxMST5wb3NzaWJseSBhcmUgc2VydmVkIGJ5IGRpZmZlcmVudCB2aXJ0dWFsIGhvc3RzIChkaWZmZXJlbnQgaG9zdCBuYW1lLAotICAgIGRpZmZlcmVudCBJUCBhZGRyZXNzLCBvciBkaWZmZXJlbnQgcG9ydCkgb24gdGhlIHNlcnZlciBtYWNoaW5lLAotPExJPnNob3cgYSBwcmVkZWZpbmVkIGNvbXBhbnkgbG9nbyBpbiB0aGUgcmlnaHQgdG9wIG9mIHRoZSBtZXNzYWdlCi0gICAgKHNlbGVjdGFibGUgYnkgdmlydHVhbCBob3N0KSwKLTxMST5wcmludCB0aGUgZXJyb3IgdGl0bGUgZmlyc3QsIGZvbGxvd2VkIGJ5IGFuIGV4cGxhbmF0b3J5IHRleHQgYW5kCi0gICAgKGRlcGVuZGluZyBvbiB0aGUgZXJyb3IgY29udGV4dCkgaGVscCBvbiBob3cgdG8gcmVzb2x2ZSB0aGUgZXJyb3IsCi08TEk+aGF2ZSBzb21lIGtpbmQgb2Ygc3RhbmRhcmRpemVkIGJhY2tncm91bmQgaW1hZ2UsCi08TEk+ZGlzcGxheSBhbiBhcGFjaGUgbG9nbyBhbmQgYSBmZWVkYmFjayBlbWFpbCBhZGRyZXNzIGF0IHRoZSBib3R0b20KLSAgICBvZiB0aGUgZXJyb3IgbWVzc2FnZS4KLTwvVUw+Ci08L1A+Ci0KLTxQPgotQW4gZXhhbXBsZSBvZiBhICJkb2N1bWVudCBub3QgZm91bmQiIG1lc3NhZ2UgZm9yIGEgZ2VybWFuIGNsaWVudCBtaWdodAotbG9vayBsaWtlIHRoaXM6PEJSPgotPElNRyBTUkM9Ii4uL2ltYWdlcy9jdXN0b21fZXJyb3Jkb2NzLmdpZiIKLSBBTFQ9IltOZWVkcyBncmFwaGljcyBjYXBhYmlsaXR5IHRvIGRpc3BsYXldIj48QlI+Ci1BbGwgbGlua3MgaW4gdGhlIGRvY3VtZW50IGFzIHdlbGwgYXMgbGlua3MgdG8gdGhlIHNlcnZlcidzIGFkbWluaXN0cmF0b3IKLW1haWwgYWRkcmVzcywgYW5kIGV2ZW4gdGhlIG5hbWUgYW5kIHBvcnQgb2YgdGhlIHNlcnZpbmcgdmlydHVhbCBob3N0Ci1hcmUgaW5zZXJ0ZWQgaW4gdGhlIGVycm9yIGRvY3VtZW50IGF0ICJydW4tdGltZSIsIDxFTT5pLmUuPC9FTT4sIHdoZW4gdGhlIGVycm9yCi1hY3R1YWxseSBvY2N1cnMuCi08L1A+Ci0KLTxIMj48QSBOQU1FPSJjcmVhdGVkaXIiPkNyZWF0aW5nIGFuIEVycm9yRG9jdW1lbnQgZGlyZWN0b3J5PC9BPjwvSDI+Ci0KLUZvciB0aGlzIGNvbmNlcHQgdG8gd29yayBhcyBlYXNpbHkgYXMgcG9zc2libGUsIHdlIG11c3QgdGFrZSBhZHZhbnRhZ2UKLW9mIGFzIG11Y2ggc2VydmVyIHN1cHBvcnQgYXMgd2UgY2FuIGdldDoKLTxPTD4KLSA8TEk+QnkgZGVmaW5pbmcgdGhlIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjb3B0aW9ucyI+TXVsdGlWaWV3cyBvcHRpb248L0E+LAotICAgICB3ZSBlbmFibGUgdGhlIGxhbmd1YWdlIHNlbGVjdGlvbiBvZiB0aGUgbW9zdCBhcHByb3ByaWF0ZSBsYW5ndWFnZQotICAgICBhbHRlcm5hdGl2ZSAoY29udGVudCBuZWdvdGlhdGlvbikuIAotIDxMST5CeSBzZXR0aW5nIHRoZQotICAgICA8QSBIUkVGPSIuLi9tb2QvbW9kX25lZ290aWF0aW9uLmh0bWwjbGFuZ3VhZ2Vwcmlvcml0eSIKLSAgICAgPkxhbmd1YWdlUHJpb3JpdHk8L0E+IAotICAgICBkaXJlY3RpdmUgd2UgZGVmaW5lIGEgc2V0IG9mIGRlZmF1bHQgZmFsbGJhY2sgbGFuZ3VhZ2VzIGluIHRoZSBzaXR1YXRpb24KLSAgICAgd2hlcmUgdGhlIGNsaWVudCdzIGJyb3dzZXIgZGlkIG5vdCBleHByZXNzIGFueSBwcmVmZXJlbmNlIGF0IGFsbC4KLSA8TEk+QnkgZW5hYmxpbmcgPEEgSFJFRj0iLi4vbW9kL21vZF9pbmNsdWRlLmh0bWwiPlNlcnZlciBTaWRlIEluY2x1ZGVzPC9BPgotICAgICAoYW5kIGRpc2FsbG93aW5nIGV4ZWN1dGlvbiBvZiBjZ2kgc2NyaXB0cyBmb3Igc2VjdXJpdHkgcmVhc29ucyksCi0gICAgIHdlIGFsbG93IHRoZSBzZXJ2ZXIgdG8gaW5jbHVkZSBidWlsZGluZyBibG9ja3Mgb2YgdGhlIGVycm9yIG1lc3NhZ2UsCi0gICAgIGFuZCB0byBzdWJzdGl0dXRlIHRoZSB2YWx1ZSBvZiBjZXJ0YWluIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbnRvIHRoZQotICAgICBnZW5lcmF0ZWQgZG9jdW1lbnQgKGR5bmFtaWMgSFRNTCkgb3IgZXZlbiB0byBjb25kaXRpb25hbGx5IGluY2x1ZGUKLSAgICAgb3Igb21pdCBwYXJ0cyBvZiB0aGUgdGV4dC4KLSA8TEk+VGhlIDxBIEhSRUY9Ii4uL21vZC9tb2RfbWltZS5odG1sI2FkZGhhbmRsZXIiPkFkZEhhbmRsZXI8L0E+IGFuZAotICAgICA8QSBIUkVGPSIuLi9tb2QvbW9kX21pbWUuaHRtbCNhZGR0eXBlIj5BZGRUeXBlPC9BPiBkaXJlY3RpdmVzIGFyZSB1c2VmdWwKLSAgICAgZm9yIGF1dG9tYXRpY2FsbHkgWFNTSS1leHBhbmRpbmcgYWxsIGZpbGVzIHdpdGggYSA8U0FNUD4uc2h0bWw8L1NBTVA+Ci0gICAgIHN1ZmZpeCB0byA8RU0+dGV4dC9odG1sPC9FTT4uCi0gPExJPkJ5IHVzaW5nIHRoZSA8QSBIUkVGPSIuLi9tb2QvbW9kX2FsaWFzLmh0bWwjYWxpYXMiPkFsaWFzPC9BPiBkaXJlY3RpdmUsCi0gICAgIHdlIGtlZXAgdGhlIGVycm9yIGRvY3VtZW50IGRpcmVjdG9yeSBvdXRzaWRlIG9mIHRoZSBkb2N1bWVudCB0cmVlCi0gICAgIGJlY2F1c2UgaXQgY2FuIGJlIHJlZ2FyZGVkIG1vcmUgYXMgYSBzZXJ2ZXIgcGFydCB0aGFuIHBhcnQgb2YKLSAgICAgdGhlIGRvY3VtZW50IHRyZWUuCi0gPExJPlRoZSA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI2RpcmVjdG9yeSI+Jmx0O0RpcmVjdG9yeSZndDs8L0E+LUJsb2NrCi0gICAgIHJlc3RyaWN0cyB0aGVzZSAic3BlY2lhbCIgc2V0dGluZ3MgdG8gdGhlIGVycm9yIGRvY3VtZW50IGRpcmVjdG9yeQotICAgICBhbmQgYXZvaWRzIGFuIGltcGFjdCBvbiBhbnkgb2YgdGhlIHNldHRpbmdzIGZvciB0aGUgcmVndWxhciBkb2N1bWVudCB0cmVlLgotIDxMST5Gb3IgZWFjaCBvZiB0aGUgZXJyb3IgY29kZXMgdG8gYmUgaGFuZGxlZCAoc2VlIFJGQzIwNjggZm9yIGFuIGV4YWN0Ci0gICAgIGRlc2NyaXB0aW9uIG9mIGVhY2ggZXJyb3IgY29kZSwgb3IgbG9vayBhdAotICAgICA8Q09ERT5zcmMvbWFpbi9odHRwX3Byb3RvY29sLmM8L0NPREU+Ci0gICAgIGlmIHlvdSB3aXNoIHRvIHNlZSBhcGFjaGUncyBzdGFuZGFyZCBtZXNzYWdlcyksIGFuCi0gICAgIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjZXJyb3Jkb2N1bWVudCI+RXJyb3JEb2N1bWVudDwvQT4KLSAgICAgaW4gdGhlIGFsaWFzZWQgPFNBTVA+L2Vycm9yZG9jczwvU0FNUD4gZGlyZWN0b3J5IGlzIGRlZmluZWQuCi0gICAgIE5vdGUgdGhhdCB3ZSBvbmx5IGRlZmluZSB0aGUgYmFzZW5hbWUgb2YgdGhlIGRvY3VtZW50IGhlcmUKLSAgICAgYmVjYXVzZSB0aGUgTXVsdGlWaWV3cyBvcHRpb24gd2lsbCBzZWxlY3QgdGhlIGJlc3QgY2FuZGlkYXRlCi0gICAgIGJhc2VkIG9uIHRoZSBsYW5ndWFnZSBzdWZmaXhlcyBhbmQgdGhlIGNsaWVudCdzIHByZWZlcmVuY2VzLgotICAgICBBbnkgZXJyb3Igc2l0dWF0aW9uIHdpdGggYW4gZXJyb3IgY29kZSA8RU0+bm90PC9FTT4gaGFuZGxlZCBieSBhCi0gICAgIGN1c3RvbSBkb2N1bWVudCB3aWxsIGJlIGRlYWx0IHdpdGggYnkgdGhlIHNlcnZlciBpbiB0aGUgc3RhbmRhcmQgd2F5Ci0gICAgICg8RU0+aS5lLjwvRU0+LCBhIHBsYWluIGVycm9yIG1lc3NhZ2UgaW4gZW5nbGlzaCkuCi0gPExJPkZpbmFsbHksIHRoZSA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI2FsbG93b3ZlcnJpZGUiPkFsbG93T3ZlcnJpZGU8L0E+Ci0gICAgIGRpcmVjdGl2ZSB0ZWxscyBhcGFjaGUgdGhhdCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGxvb2sgZm9yIAotICAgICBhIC5odGFjY2VzcyBmaWxlIGluIHRoZSAvZXJyb3Jkb2NzIGRpcmVjdG9yeTogYSBtaW5vciBzcGVlZCAKLSAgICAgb3B0aW1pemF0aW9uLgotPC9PTD4KLVRoZSByZXN1bHRpbmcgPFNBTVA+aHR0cGQuY29uZjwvU0FNUD4gY29uZmlndXJhdGlvbiB3b3VsZCB0aGVuIGxvb2sKLXNpbWlsYXIgdG8gdGhpczogPFNNQUxMPihOb3RlIHRoYXQgeW91IGNhbiBkZWZpbmUgeW91ciBvd24gZXJyb3IKLW1lc3NhZ2VzIHVzaW5nIHRoaXMgbWV0aG9kIGZvciBvbmx5IHBhcnQgb2YgdGhlIGRvY3VtZW50IHRyZWUsCi1lLmcuLCBhIC9+dXNlci8gc3VidHJlZS4gSW4gdGhpcyBjYXNlLCB0aGUgY29uZmlndXJhdGlvbiBjb3VsZCBhcyB3ZWxsCi1iZSBwdXQgaW50byB0aGUgLmh0YWNjZXNzIGZpbGUgYXQgdGhlIHJvb3Qgb2YgdGhlIHN1YnRyZWUsIGFuZAotdGhlICZsdDtEaXJlY3RvcnkmZ3Q7IGFuZCAmbHQ7L0RpcmVjdG9yeSZndDsgZGlyZWN0aXZlcyAtYnV0IG5vdAotdGhlIGNvbnRhaW5lZCBkaXJlY3RpdmVzLSBtdXN0IGJlIG9taXR0ZWQuKTwvU01BTEw+Ci08UFJFPgotICBMYW5ndWFnZVByaW9yaXR5IGVuIGZyIGRlIAotICBBbGlhcyAgL2Vycm9yZG9jcyAgL3Vzci9sb2NhbC9hcGFjaGUvZXJyb3Jkb2NzCi0gICZsdDtEaXJlY3RvcnkgL3Vzci9sb2NhbC9hcGFjaGUvZXJyb3Jkb2NzJmd0OwotICAgQWxsb3dPdmVycmlkZSBub25lCi0gICBPcHRpb25zIE11bHRpVmlld3MgSW5jbHVkZXNOb0V4ZWMgRm9sbG93U3ltTGlua3MKLSAgIEFkZFR5cGUgdGV4dC9odG1sIC5zaHRtbAotICAgQWRkSGFuZGxlciBzZXJ2ZXItcGFyc2VkIC5zaHRtbAotICAmbHQ7L0RpcmVjdG9yeSZndDsKLSAgIyAgICAiNDAwIEJhZCBSZXF1ZXN0IiwKLSAgRXJyb3JEb2N1bWVudCAgNDAwICAvZXJyb3Jkb2NzLzQwMAotICAjICAgICI0MDEgQXV0aG9yaXphdGlvbiBSZXF1aXJlZCIsCi0gIEVycm9yRG9jdW1lbnQgIDQwMSAgL2Vycm9yZG9jcy80MDEKLSAgIyAgICAiNDAzIEZvcmJpZGRlbiIsCi0gIEVycm9yRG9jdW1lbnQgIDQwMyAgL2Vycm9yZG9jcy80MDMKLSAgIyAgICAiNDA0IE5vdCBGb3VuZCIsCi0gIEVycm9yRG9jdW1lbnQgIDQwNCAgL2Vycm9yZG9jcy80MDQKLSAgIyAgICAiNTAwIEludGVybmFsIFNlcnZlciBFcnJvciIsCi0gIEVycm9yRG9jdW1lbnQgIDUwMCAgL2Vycm9yZG9jcy81MDAKLTwvUFJFPgotVGhlIGRpcmVjdG9yeSBmb3IgdGhlIGVycm9yIG1lc3NhZ2VzIChoZXJlOgotPFNBTVA+L3Vzci9sb2NhbC9hcGFjaGUvZXJyb3Jkb2NzLzwvU0FNUD4pIG11c3QgdGhlbiBiZSBjcmVhdGVkIHdpdGggdGhlCi1hcHByb3ByaWF0ZSBwZXJtaXNzaW9ucyAocmVhZGFibGUgYW5kIGV4ZWN1dGFibGUgYnkgdGhlIHNlcnZlciB1aWQgb3IgZ2lkLCAKLW9ubHkgd3JpdGFibGUgZm9yIHRoZSBhZG1pbmlzdHJhdG9yKS4KLQotPEgzPjxBIE5BTUU9ImRvY25hbWVzIj5OYW1pbmcgdGhlIGluZGl2aWR1YWwgZXJyb3IgZG9jdW1lbnQgZmlsZXM8L0E+PC9IMz4KLQotQnkgZGVmaW5pbmcgdGhlIDxTQU1QPk11bHRpVmlld3M8L1NBTVA+IG9wdGlvbiwgdGhlIHNlcnZlciB3YXMgdG9sZCB0bwotYXV0b21hdGljYWxseSBzY2FuIHRoZSBkaXJlY3RvcnkgZm9yIG1hdGNoaW5nIHZhcmlhbnRzIChsb29raW5nIGF0IGxhbmd1YWdlCi1hbmQgY29udGVudCB0eXBlIHN1ZmZpeGVzKSB3aGVuIGEgcmVxdWVzdGVkIGRvY3VtZW50IHdhcyBub3QgZm91bmQuCi1JbiB0aGUgY29uZmlndXJhdGlvbiwgd2UgZGVmaW5lZCB0aGUgbmFtZXMgZm9yIHRoZSBlcnJvciBkb2N1bWVudHMgdG8gYmUKLWp1c3QgdGhlaXIgZXJyb3IgbnVtYmVyICh3aXRob3V0IGFueSBzdWZmaXgpLgotPFA+Ci1UaGUgbmFtZXMgb2YgdGhlIGluZGl2aWR1YWwgZXJyb3IgZG9jdW1lbnRzIGFyZSBub3cgZGV0ZXJtaW5lZCBsaWtlIHRoaXMKLShJJ20gdXNpbmcgNDAzIGFzIGFuIGV4YW1wbGUsIHRoaW5rIG9mIGl0IGFzIGEgcGxhY2Vob2xkZXIgZm9yIGFueSBvZgotdGhlIGNvbmZpZ3VyZWQgZXJyb3IgZG9jdW1lbnRzKToKLTxVTD4KLSA8TEk+Tm8gZmlsZSBlcnJvcmRvY3MvNDAzIHNob3VsZCBleGlzdC4gT3RoZXJ3aXNlLCBpdCB3b3VsZCBiZSBmb3VuZCBhbmQKLSAgICAgc2VydmVkICh3aXRoIHRoZSBEZWZhdWx0VHlwZSwgdXN1YWxseSB0ZXh0L3BsYWluKSwgYWxsIG5lZ290aWF0aW9uCi0gICAgIHdvdWxkIGJlIGJ5cGFzc2VkLgotIDxMST5Gb3IgZWFjaCBsYW5ndWFnZSBmb3Igd2hpY2ggd2UgaGF2ZSBhbiBpbnRlcm5hdGlvbmFsaXplZCB2ZXJzaW9uCi0gICAgIChub3RlIHRoYXQgdGhpcyBuZWVkIG5vdCBiZSB0aGUgc2FtZSBzZXQgb2YgbGFuZ3VhZ2VzIGZvciBlYWNoCi0gICAgIGVycm9yIGNvZGUgLSB5b3UgY2FuIGdldCBieSB3aXRoIGEgc2luZ2xlIGxhbmd1YWdlIHZlcnNpb24gdW50aWwKLSAgICAgeW91IGFjdHVhbGx5IDxFTT5oYXZlPC9FTT4gdHJhbnNsYXRlZCB2ZXJzaW9ucyksIGEgZG9jdW1lbnQKLSAgICAgPFNBTVA+ZXJyb3Jkb2NzLzQwMy5zaHRtbC48RU0+bGFuZzwvRU0+PC9TQU1QPiBpcyBjcmVhdGVkIGFuZAotICAgICBmaWxsZWQgd2l0aCB0aGUgZXJyb3IgdGV4dCBpbiB0aGF0IGxhbmd1YWdlICg8QSBIUkVGPSIjY3JlYXRlZG9jcyI+c2VlCi0gICAgIGJlbG93PC9BPikuCi0gPExJPk9uZSBmYWxsYmFjayBkb2N1bWVudCBjYWxsZWQgPFNBTVA+ZXJyb3Jkb2NzLzQwMy5zaHRtbDwvU0FNUD4gaXMKLSAgICAgY3JlYXRlZCwgdXN1YWxseSBieSBjcmVhdGluZyBhIHN5bWxpbmsgdG8gdGhlIGRlZmF1bHQgbGFuZ3VhZ2UKLSAgICAgdmFyaWFudCAoPEEgSFJFRj0iI2ZhbGxiYWNrIj5zZWUgYmVsb3c8L0E+KS4KLTwvVUw+Ci0KLTxIMz48QSBOQU1FPSJoZWFkZm9vdCI+VGhlIGNvbW1vbiBoZWFkZXIgYW5kIGZvb3RlciBmaWxlczwvQT48L0gzPgotCi1CeSBwdXR0aW5nIGFzIG11Y2ggbGF5b3V0IGluZm9ybWF0aW9uIGluIHR3byBzcGVjaWFsICJpbmNsdWRlIGZpbGVzIiwgCi10aGUgZXJyb3IgZG9jdW1lbnRzIGNhbiBiZSByZWR1Y2VkIHRvIGEgYmFyZSBtaW5pbXVtLgotPFA+Ci1PbmUgb2YgdGhlc2UgbGF5b3V0IGZpbGVzIGRlZmluZXMgdGhlIEhUTUwgZG9jdW1lbnQgaGVhZGVyCi1hbmQgYSBjb25maWd1cmFibGUgbGlzdCBvZiBwYXRocyB0byB0aGUgaWNvbnMgdG8gYmUgc2hvd24gaW4gdGhlIHJlc3VsdGluZwotZXJyb3IgZG9jdW1lbnQuIFRoZXNlIHBhdGhzIGFyZSBleHBvcnRlZCBhcyBhIHNldCBvZiBYU1NJIGVudmlyb25tZW50Ci12YXJpYWJsZXMgYW5kIGFyZSBsYXRlciBldmFsdWF0ZWQgYnkgdGhlICJmb290ZXIiIHNwZWNpYWwgZmlsZS4KLVRoZSB0aXRsZSBvZiB0aGUgY3VycmVudCBlcnJvciAod2hpY2ggaXMKLXB1dCBpbnRvIHRoZSBUSVRMRSB0YWcgYW5kIGFuIEgxIGhlYWRlcikgaXMgc2ltcGx5IHBhc3NlZCBpbiBmcm9tIHRoZSBtYWluCi1lcnJvciBkb2N1bWVudCBpbiBhIHZhcmlhYmxlIGNhbGxlZCA8Q09ERT50aXRsZTwvQ09ERT4uPEJSPgotPFNUUk9ORz5CeSBjaGFuZ2luZyB0aGlzIGZpbGUsIHRoZSBsYXlvdXQgb2YgYWxsIGdlbmVyYXRlZCBlcnJvcgotbWVzc2FnZXMgY2FuIGJlIGNoYW5nZWQgaW4gYSBzZWNvbmQuPC9TVFJPTkc+Ci0oQnkgZXhwbG9pdGluZyB0aGUgZmVhdHVyZXMgb2YgWFNTSSwgeW91IGNhbiBlYXNpbHkgZGVmaW5lIGRpZmZlcmVudAotbGF5b3V0cyBiYXNlZCBvbiB0aGUgY3VycmVudCB2aXJ0dWFsIGhvc3QsIG9yIGV2ZW4gYmFzZWQgb24gdGhlCi1jbGllbnQncyBkb21haW4gbmFtZSkuCi08UD4KLVRoZSBzZWNvbmQgbGF5b3V0IGZpbGUgZGVzY3JpYmVzIHRoZSBmb290ZXIgdG8gYmUgZGlzcGxheWVkIGF0IHRoZSBib3R0b20KLW9mIGV2ZXJ5IGVycm9yIG1lc3NhZ2UuIEluIHRoaXMgZXhhbXBsZSwgaXQgc2hvd3MgYW4gYXBhY2hlIGxvZ28sIHRoZSBjdXJyZW50Ci1zZXJ2ZXIgdGltZSwgdGhlIHNlcnZlciB2ZXJzaW9uIHN0cmluZyBhbmQgYWRkcyBhIG1haWwgcmVmZXJlbmNlIHRvIHRoZQotc2l0ZSdzIHdlYm1hc3Rlci4KLTxQPgotRm9yIHNpbXBsaWNpdHksIHRoZSBoZWFkZXIgZmlsZSBpcyBzaW1wbHkgY2FsbGVkIDxDT0RFPmhlYWQuc2h0bWw8L0NPREU+Ci1iZWNhdXNlIGl0IGNvbnRhaW5zIHNlcnZlci1wYXJzZWQgY29udGVudCBidXQgbm8gbGFuZ3VhZ2Ugc3BlY2lmaWMKLWluZm9ybWF0aW9uLiBUaGUgZm9vdGVyIGZpbGUgZXhpc3RzIG9uY2UgZm9yIGVhY2ggbGFuZ3VhZ2UgdHJhbnNsYXRpb24sCi1wbHVzIGEgc3ltbGluayBmb3IgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UuPFA+Ci08U1RST05HPkV4YW1wbGU6PC9TVFJPTkc+IGZvciBFbmdsaXNoLCBGcmVuY2ggYW5kIEdlcm1hbiB2ZXJzaW9ucwotKGRlZmF1bHQgZW5nbGlzaCk8QlI+Ci08Q09ERT5mb290LnNodG1sLmVuPC9DT0RFPiw8QlI+Ci08Q09ERT5mb290LnNodG1sLmZyPC9DT0RFPiw8QlI+Ci08Q09ERT5mb290LnNodG1sLmRlPC9DT0RFPiw8QlI+Ci08Q09ERT5mb290LnNodG1sPC9DT0RFPiBzeW1saW5rIHRvIDxDT0RFPmZvb3Quc2h0bWwuZW48L0NPREU+PFA+Ci1Cb3RoIGZpbGVzIGFyZSBpbmNsdWRlZCBpbnRvIHRoZSBlcnJvciBkb2N1bWVudCBieSB1c2luZyB0aGUKLWRpcmVjdGl2ZXMgPENPREU+Jmx0OyEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWQiIC0tJmd0OzwvQ09ERT4KLWFuZCAgICAgICAgPENPREU+Jmx0OyEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3QiIC0tJmd0OzwvQ09ERT4KLXJlc3BlY3RpdmVseTogdGhlIHJlc3Qgb2YgdGhlIG1hZ2ljIG9jY3VycyBpbiBtb2RfbmVnb3RpYXRpb24gYW5kCi1pbiBtb2RfaW5jbHVkZS4KLTxQPgotCi1TZWUgPEEgSFJFRj0iI2xpc3RpbmdzIj50aGUgbGlzdGluZ3MgYmVsb3c8L0E+IHRvIHNlZSBhbiBhY3R1YWwgSFRNTAotaW1wbGVtZW50YXRpb24gb2YgdGhlIGRpc2N1c3NlZCBleGFtcGxlLgotCi0KLTxIMz48QSBOQU1FPSJjcmVhdGVkb2NzIj5DcmVhdGluZyBFcnJvckRvY3VtZW50cyBpbiBkaWZmZXJlbnQgbGFuZ3VhZ2VzPC9BPgotPC9IMz4KLQotQWZ0ZXIgYWxsIHRoaXMgcHJlcGFyYXRpb24gd29yaywgbGl0dGxlIHJlbWFpbnMgdG8gYmUgc2FpZCBhYm91dCB0aGUKLWFjdHVhbCBkb2N1bWVudHMuIFRoZXkgYWxsIHNoYXJlIGEgc2ltcGxlIGNvbW1vbiBzdHJ1Y3R1cmU6Ci08UFJFPgotJmx0OyEtLSNzZXQgdmFyPSJ0aXRsZSIgdmFsdWU9IjxFTT5lcnJvciBkZXNjcmlwdGlvbiB0aXRsZTwvRU0+IiAtLSZndDsKLSZsdDshLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkIiAtLSZndDsKLSAgIDxFTT5leHBsYW5hdG9yeSBlcnJvciB0ZXh0PC9FTT4KLSZsdDshLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290IiAtLSZndDsKLTwvUFJFPgotSW4gdGhlIDxBIEhSRUY9IiNsaXN0aW5ncyI+bGlzdGluZ3Mgc2VjdGlvbjwvQT4sIHlvdSBjYW4gc2VlIGFuIGV4YW1wbGUKLW9mIGEgWzQwMCBCYWQgUmVxdWVzdF0gZXJyb3IgZG9jdW1lbnQuIERvY3VtZW50cyBhcyBzaW1wbGUgYXMgdGhhdAotY2VydGFpbmx5IGNhdXNlIG5vIHByb2JsZW1zIHRvIHRyYW5zbGF0ZSBvciBleHBhbmQuCi0KLTxIMz48QSBOQU1FPSJmYWxsYmFjayI+VGhlIGZhbGxiYWNrIGxhbmd1YWdlPC9BPjwvSDM+Ci0KLURvIHdlIG5lZWQgYSBzcGVjaWFsIGhhbmRsaW5nIGZvciBsYW5ndWFnZXMgb3RoZXIgdGhhbiB0aG9zZSB3ZSBoYXZlCi10cmFuc2xhdGlvbnMgZm9yPyBXZSBkaWQgc2V0IHRoZSBMYW5ndWFnZVByaW9yaXR5LCBkaWRuJ3Qgd2U/IQotPFA+Ci1XZWxsLCB0aGUgTGFuZ3VhZ2VQcmlvcml0eSBkaXJlY3RpdmUgaXMgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSBjbGllbnQgZG9lcwotbm90IGV4cHJlc3MgYW55IGxhbmd1YWdlIHByaW9yaXR5IGF0IGFsbC4gQnV0IHdoYXQKLWhhcHBlbnMgaW4gdGhlIHNpdHVhdGlvbiB3aGVyZSB0aGUgY2xpZW50IHdhbnRzIG9uZQotb2YgdGhlIGxhbmd1YWdlcyB3ZSBkbyBub3QgaGF2ZSwgYW5kIG5vbmUgb2YgdGhvc2Ugd2UgZG8gaGF2ZT8KLTxQPgotV2l0aG91dCBkb2luZyBhbnl0aGluZywgdGhlIEFwYWNoZSBzZXJ2ZXIgd2lsbCB1c3VhbGx5IHJldHVybiBhCi1bNDA2IG5vIGFjY2VwdGFibGUgdmFyaWFudF0gZXJyb3IsIGxpc3RpbmcgdGhlIGNob2ljZXMgZnJvbSB3aGljaCB0aGUgY2xpZW50Ci1tYXkgc2VsZWN0LiBCdXQgd2UncmUgaW4gYW4gZXJyb3IgbWVzc2FnZSBhbHJlYWR5LCBhbmQgaW1wb3J0YW50IGVycm9yCi1pbmZvcm1hdGlvbiBtaWdodCBnZXQgbG9zdCB3aGVuIHRoZSBjbGllbnQgaGFkIHRvIGNob29zZSBhIGxhbmd1YWdlCi1yZXByZXNlbnRhdGlvbiBmaXJzdC4KLTxQPgotU28sIGluIHRoaXMgc2l0dWF0aW9uIGl0IGFwcGVhcnMgdG8gYmUgZWFzaWVyIHRvIGRlZmluZSBhIGZhbGxiYWNrIGxhbmd1YWdlCi0oYnkgY29weWluZyBvciBsaW5raW5nLCA8RU0+ZS5nLjwvRU0+LCB0aGUgZW5nbGlzaCB2ZXJzaW9uIHRvIGEgbGFuZ3VhZ2UtbGVzcyB2ZXJzaW9uKS4KLUJlY2F1c2UgdGhlIG5lZ290aWF0aW9uIGFsZ29yaXRobSBwcmVmZXJzICJtb3JlIHNwZWNpYWxpemVkIiB2YXJpYW50cyBvdmVyCi0ibW9yZSBnZW5lcmljIiB2YXJpYW50cywgdGhlc2UgZ2VuZXJpYyBhbHRlcm5hdGl2ZXMgd2lsbCBvbmx5IGJlIGNob3Nlbgotd2hlbiB0aGUgbm9ybWFsIG5lZ290aWF0aW9uIGRpZCBub3Qgc3VjY2VlZC4KLTxQPiAKLUEgc2ltcGxlIHNoZWxsIHNjcmlwdCB0byBkbyBpdCAoZXhlY3V0ZSB3aXRoaW4gdGhlIGVycm9yZG9jcy8gZGlyKToKLTxQUkU+Ci0gIGZvciBmIGluICouc2h0bWwuZW4KLSAgZG8KLSAgICAgbG4gLXMgJGYgYGJhc2VuYW1lICRmIC5lbmAKLSAgZG9uZQotPC9QUkU+Ci0KLTxQPgotPC9QPgotCi08SDI+PEEgTkFNRT0icHJveHkiPkN1c3RvbWl6aW5nIFByb3h5IEVycm9yIE1lc3NhZ2VzPC9BPjwvSDI+Ci0KLTxQPgotIEFzIG9mIEFwYWNoZS0xLjMsIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSB0aGUgPENPREU+RXJyb3JEb2N1bWVudDwvQ09ERT4KLSBtZWNoYW5pc20gZm9yIHByb3h5IGVycm9yIG1lc3NhZ2VzIGFzIHdlbGwgKHByZXZpb3VzIHZlcnNpb25zIGFsd2F5cwotIHJldHVybmVkIGZpeGVkIHByZWRlZmluZWQgZXJyb3IgbWVzc2FnZXMpLgotPC9QPgotPFA+Ci0gTW9zdCBwcm94eSBlcnJvcnMgcmV0dXJuIGFuIGVycm9yIGNvZGUgb2YgWzUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3JdLgotIFRvIGZpbmQgb3V0IHdoZXRoZXIgYSBwYXJ0aWN1bGFyIGVycm9yIGRvY3VtZW50IHdhcyBpbnZva2VkIG9uIGJlaGFsZgotIG9mIGEgcHJveHkgZXJyb3Igb3IgYmVjYXVzZSBvZiBzb21lIG90aGVyIHNlcnZlciBlcnJvciwgYW5kIHdoYXQgdGhlIHJlYXNvbgotIGZvciB0aGUgZmFpbHVyZSB3YXMsIHlvdSBjYW4gY2hlY2sgdGhlIGNvbnRlbnRzIG9mIHRoZSBuZXcKLSA8Q09ERT5FUlJPUl9OT1RFUzwvQ09ERT4gQ0dJIGVudmlyb25tZW50IHZhcmlhYmxlOgotIGlmIGludm9rZWQgZm9yIGEgcHJveHkgZXJyb3IsIHRoaXMgdmFyaWFibGUgd2lsbCBjb250YWluIHRoZSBhY3R1YWwgcHJveHkKLSBlcnJvciBtZXNzYWdlIHRleHQgaW4gSFRNTCBmb3JtLgotPC9QPgotPFA+Ci0gVGhlIGZvbGxvd2luZyBleGNlcnB0IGRlbW9uc3RyYXRlcyBob3cgdG8gZXhwbG9pdCB0aGUgPENPREU+RVJST1JfTk9URVM8L0NPREU+Ci0gdmFyaWFibGUgd2l0aGluIGFuIGVycm9yIGRvY3VtZW50OgotPC9QPgotPFBSRT4KLSAmbHQ7IS0tI2lmIGV4cHI9IlwiJFJFRElSRUNUX0VSUk9SX05PVEVTXCIgPSBcIlwiIiAtLSZndDsKLSAgJmx0O3AmZ3Q7Ci0gICBUaGUgc2VydmVyIGVuY291bnRlcmVkIGFuIHVuZXhwZWN0ZWQgY29uZGl0aW9uCi0gICB3aGljaCBwcmV2ZW50ZWQgaXQgZnJvbSBmdWxmaWxsaW5nIHRoZSByZXF1ZXN0LiAKLSAgJmx0Oy9wJmd0OwotICAmbHQ7cCZndDsKLSAgICZsdDtBIEhSRUY9Im1haWx0bzombHQ7IS0tI2VjaG8gdmFyPSJTRVJWRVJfQURNSU4iIC0tJmd0OyIKLSAgICBTVUJKRUNUPSJFcnJvciBtZXNzYWdlIFsmbHQ7IS0tI2VjaG8gdmFyPSJSRURJUkVDVF9TVEFUVVMiIC0tJmd0O10gJmx0OyEtLSNlY2hvIHZhcj0idGl0bGUiIC0tJmd0OyBmb3IgJmx0OyEtLSNlY2hvIHZhcj0iUkVRVUVTVF9VUkkiIC0tJmd0OyImZ3Q7Ci0gICBQbGVhc2UgZm9yd2FyZCB0aGlzIGVycm9yIHNjcmVlbiB0byAmbHQ7IS0tI2VjaG8gdmFyPSJTRVJWRVJfTkFNRSIgLS0mZ3Q7J3MKLSAgIFdlYk1hc3RlciZsdDsvQSZndDs7IGl0IGluY2x1ZGVzIHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYWJvdXQKLSAgIHRoZSBSZXF1ZXN0IHdoaWNoIGNhdXNlZCB0aGUgZXJyb3IuCi0gICAmbHQ7cHJlJmd0OyZsdDshLS0jcHJpbnRlbnYgLS0mZ3Q7Jmx0Oy9wcmUmZ3Q7Ci0gICZsdDsvcCZndDsKLSAmbHQ7IS0tI2Vsc2UgLS0mZ3Q7Ci0gICZsdDshLS0jZWNobyB2YXI9IlJFRElSRUNUX0VSUk9SX05PVEVTIiAtLSZndDsKLSAmbHQ7IS0tI2VuZGlmIC0tJmd0OwotPC9QUkU+Ci0KLTxIMj48QSBOQU1FPSJsaXN0aW5ncyI+SFRNTCBsaXN0aW5nIG9mIHRoZSBkaXNjdXNzZWQgZXhhbXBsZTwvQT48L0gyPgotCi1TbywgdG8gc3VtbWFyaXplIG91ciBleGFtcGxlLCBoZXJlJ3MgdGhlIGNvbXBsZXRlIGxpc3Rpbmcgb2YgdGhlCi08U0FNUD40MDAuc2h0bWwuZW48L1NBTVA+IGRvY3VtZW50LiBZb3Ugd2lsbCBub3RpY2UgdGhhdCBpdCBjb250YWlucwotYWxtb3N0IG5vdGhpbmcgYnV0IHRoZSBlcnJvciB0ZXh0ICh3aXRoIGNvbmRpdGlvbmFsIGFkZGl0aW9ucykuCi1TdGFydGluZyB3aXRoIHRoaXMgZXhhbXBsZSwgeW91IHdpbGwgZmluZCBpdCBlYXN5IHRvIGFkZCBtb3JlIGVycm9yCi1kb2N1bWVudHMsIG9yIHRvIHRyYW5zbGF0ZSB0aGUgZXJyb3IgZG9jdW1lbnRzIHRvIGRpZmZlcmVudCBsYW5ndWFnZXMuCi08SFI+PFBSRT4KLSZsdDshLS0jc2V0IHZhcj0idGl0bGUiIHZhbHVlPSJCYWQgUmVxdWVzdCIKLS0tJmd0OyZsdDshLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkIiAtLSZndDsmbHQ7UCZndDsKLSAgIFlvdXIgYnJvd3NlciBzZW50IGEgcmVxdWVzdCB0aGF0IHRoaXMgc2VydmVyIGNvdWxkIG5vdCB1bmRlcnN0YW5kOgotICAgJmx0O0JMT0NLUVVPVEUmZ3Q7Ci0gICAgICZsdDtTVFJPTkcmZ3Q7Jmx0OyEtLSNlY2hvIHZhcj0iUkVRVUVTVF9VUkkiIC0tJmd0OyZsdDsvU1RST05HJmd0OwotICAgJmx0Oy9CTE9DS1FVT1RFJmd0OwotICAgVGhlIHJlcXVlc3QgY291bGQgbm90IGJlIHVuZGVyc3Rvb2QgYnkgdGhlIHNlcnZlciBkdWUgdG8gbWFsZm9ybWVkCi0gICBzeW50YXguIFRoZSBjbGllbnQgc2hvdWxkIG5vdCByZXBlYXQgdGhlIHJlcXVlc3Qgd2l0aG91dAotICAgbW9kaWZpY2F0aW9ucy4KLSAgICZsdDsvUCZndDsKLSAgICZsdDtQJmd0OwotICAgJmx0OyEtLSNpZiBleHByPSJcIiRIVFRQX1JFRkVSRVJcIiAhPSBcIlwiIiAtLSZndDsKLSAgICBQbGVhc2UgaW5mb3JtIHRoZSBvd25lciBvZgotICAgICZsdDtBIEhSRUY9IiZsdDshLS0jZWNobyB2YXI9IkhUVFBfUkVGRVJFUiIgLS0mZ3Q7IiZndDt0aGUgcmVmZXJyaW5nIHBhZ2UmbHQ7L0EmZ3Q7IGFib3V0IAotICAgIHRoZSBtYWxmb3JtZWQgbGluay4KLSAgICZsdDshLS0jZWxzZSAtLSZndDsKLSAgICBQbGVhc2UgY2hlY2sgeW91ciByZXF1ZXN0IGZvciB0eXBpbmcgZXJyb3JzIGFuZCByZXRyeS4KLSAgICZsdDshLS0jZW5kaWYgLS0mZ3Q7Ci0gICAmbHQ7L1AmZ3Q7Ci0mbHQ7IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdCIgLS0mZ3Q7Ci08L1BSRT48SFI+Ci0KLUhlcmUgaXMgdGhlIGNvbXBsZXRlIDxTQU1QPmhlYWQuc2h0bWw8L1NBTVA+IGZpbGUgKHRoZSBmdW5ueSBsaW5lCi1icmVha3MgYXZvaWQgZW1wdHkgbGluZXMgaW4gdGhlIGRvY3VtZW50IGFmdGVyIFhTU0kgcHJvY2Vzc2luZykuIE5vdGUgdGhlIAotY29uZmlndXJhdGlvbiBzZWN0aW9uIGF0IHRvcC4gVGhhdCdzIHdoZXJlIHlvdSBjb25maWd1cmUgdGhlIGltYWdlcyBhbmQgbG9nb3MKLWFzIHdlbGwgYXMgdGhlIGFwYWNoZSBkb2N1bWVudGF0aW9uIGRpcmVjdG9yeS4gTG9vayBob3cgdGhpcyBmaWxlIGRpc3BsYXlzCi10d28gZGlmZmVyZW50IGxvZ29zIGRlcGVuZGluZyBvbiB0aGUgY29udGVudCBvZiB0aGUgdmlydHVhbCBob3N0IG5hbWUKLSgkU0VSVkVSX05BTUUpLCBhbmQgdGhhdCBhbiBhbmltYXRlZCBhcGFjaGUgbG9nbyBpcyBzaG93biBpZiB0aGUgYnJvd3NlcgotYXBwZWFycyB0byBzdXBwb3J0IGl0ICh0aGUgbGF0dGVyIHJlcXVpcmVzIHNlcnZlciBjb25maWd1cmF0aW9uIGxpbmVzCi1vZiB0aGUgZm9ybSA8QlI+PENPREU+QnJvd3Nlck1hdGNoICJeTW96aWxsYS9bMi00XSIgYW5pZ2lmPC9DT0RFPjxCUj4KLWZvciBicm93c2VyIHR5cGVzIHdoaWNoIHN1cHBvcnQgYW5pbWF0ZWQgR0lGcykuCi08SFI+PFBSRT4KLSZsdDshLS0jaWYgZXhwcj0iXCIkU0VSVkVSX05BTUVcIiA9IC8uKlwubXljb21wYW55XC5jb20vIiAKLS0tJmd0OyZsdDshLS0jc2V0IHZhcj0iSU1HX0NvcnBMb2dvIgotICAgICAgICAgICAgdmFsdWU9Imh0dHA6Ly8kU0VSVkVSX05BTUU6JFNFUlZFUl9QT1JUL2Vycm9yZG9jcy9Db3JwTG9nby5naWYiIAotLS0mZ3Q7Jmx0OyEtLSNzZXQgdmFyPSJBTFRfQ29ycExvZ28iIHZhbHVlPSJQb3dlcmVkIGJ5IExpbnV4ISIgCi0tLSZndDsmbHQ7IS0tI2Vsc2UKLS0tJmd0OyZsdDshLS0jc2V0IHZhcj0iSU1HX0NvcnBMb2dvIgotICAgICAgICAgICAgdmFsdWU9Imh0dHA6Ly8kU0VSVkVSX05BTUU6JFNFUlZFUl9QT1JUL2Vycm9yZG9jcy9Qcml2TG9nby5naWYiIAotLS0mZ3Q7Jmx0OyEtLSNzZXQgdmFyPSJBTFRfQ29ycExvZ28iIHZhbHVlPSJQb3dlcmVkIGJ5IExpbnV4ISIgCi0tLSZndDsmbHQ7IS0tI2VuZGlmCi0tLSZndDsmbHQ7IS0tI3NldCB2YXI9IklNR19CZ0ltYWdlIiB2YWx1ZT0iaHR0cDovLyRTRVJWRVJfTkFNRTokU0VSVkVSX1BPUlQvZXJyb3Jkb2NzL0JnSW1hZ2UuZ2lmIiAKLS0tJmd0OyZsdDshLS0jc2V0IHZhcj0iRE9DX0FwYWNoZSIgdmFsdWU9Imh0dHA6Ly8kU0VSVkVSX05BTUU6JFNFUlZFUl9QT1JUL0FwYWNoZS8iIAotLS0mZ3Q7Jmx0OyEtLSNpZiBleHByPSIkYW5pZ2lmIiAKLS0tJmd0OyZsdDshLS0jc2V0IHZhcj0iSU1HX0FwYWNoZSIgdmFsdWU9Imh0dHA6Ly8kU0VSVkVSX05BTUU6JFNFUlZFUl9QT1JUL2ljb25zL2FwYWNoZV9hbmltLmdpZiIgCi0tLSZndDsmbHQ7IS0tI2Vsc2UKLS0tJmd0OyZsdDshLS0jc2V0IHZhcj0iSU1HX0FwYWNoZSIgdmFsdWU9Imh0dHA6Ly8kU0VSVkVSX05BTUU6JFNFUlZFUl9QT1JUL2ljb25zL2FwYWNoZV9wYi5naWYiIAotLS0mZ3Q7Jmx0OyEtLSNlbmRpZgotLS0mZ3Q7Jmx0OyFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTC8vRU4iJmd0OwotJmx0O0hUTUwmZ3Q7Ci0gJmx0O0hFQUQmZ3Q7Ci0gICZsdDtUSVRMRSZndDsKLSAgIFsmbHQ7IS0tI2VjaG8gdmFyPSJSRURJUkVDVF9TVEFUVVMiIC0tJmd0O10gJmx0OyEtLSNlY2hvIHZhcj0idGl0bGUiIC0tJmd0OwotICAmbHQ7L1RJVExFJmd0OwotICZsdDsvSEVBRCZndDsKLSAmbHQ7Qk9EWSBCR0NPTE9SPSJ3aGl0ZSIgQkFDS0dST1VORD0iJmx0OyEtLSNlY2hvIHZhcj0iSU1HX0JnSW1hZ2UiIC0tJmd0OyImZ3Q7Jmx0O1VMJmd0OwotICAmbHQ7SDEgQUxJR049ImNlbnRlciImZ3Q7Ci0gICBbJmx0OyEtLSNlY2hvIHZhcj0iUkVESVJFQ1RfU1RBVFVTIiAtLSZndDtdICZsdDshLS0jZWNobyB2YXI9InRpdGxlIiAtLSZndDsKLSAgICZsdDtJTUcgU1JDPSImbHQ7IS0tI2VjaG8gdmFyPSJJTUdfQ29ycExvZ28iIC0tJmd0OyIKLSAgICAgICAgQUxUPSImbHQ7IS0tI2VjaG8gdmFyPSJBTFRfQ29ycExvZ28iIC0tJmd0OyIgQUxJR049cmlnaHQmZ3Q7Ci0gICZsdDsvSDEmZ3Q7Ci0gICZsdDtIUiZndDsmbHQ7IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tJmd0OwotICAmbHQ7RElWJmd0OwotPC9QUkU+PEhSPgotIGFuZCB0aGlzIGlzIHRoZSA8U0FNUD5mb290LnNodG1sLmVuPC9TQU1QPiBmaWxlOgotPEhSPjxQUkU+Ci0KLSAgJmx0Oy9ESVYmZ3Q7Ci0gICZsdDtIUiZndDsKLSAgJmx0O0RJViBBTElHTj0icmlnaHQiJmd0OyZsdDtTTUFMTCZndDsmbHQ7U1VQJmd0O0xvY2FsIFNlcnZlciB0aW1lOgotICAgICAgJmx0OyEtLSNlY2hvIHZhcj0iREFURV9MT0NBTCIgLS0mZ3Q7Ci0gICZsdDsvU1VQJmd0OyZsdDsvU01BTEwmZ3Q7Jmx0Oy9ESVYmZ3Q7Ci0gICZsdDtESVYgQUxJR049ImNlbnRlciImZ3Q7Ci0gICAgJmx0O0EgSFJFRj0iJmx0OyEtLSNlY2hvIHZhcj0iRE9DX0FwYWNoZSIgLS0mZ3Q7IiZndDsKLSAgICAmbHQ7SU1HIFNSQz0iJmx0OyEtLSNlY2hvIHZhcj0iSU1HX0FwYWNoZSIgLS0mZ3Q7IiBCT1JERVI9MCBBTElHTj0iYm90dG9tIgotICAgICAgICAgQUxUPSJQb3dlcmVkIGJ5ICZsdDshLS0jZWNobyB2YXI9IlNFUlZFUl9TT0ZUV0FSRSIgLS0mZ3Q7IiZndDsmbHQ7L0EmZ3Q7Jmx0O0JSJmd0OwotICAgICZsdDtTTUFMTCZndDsmbHQ7U1VQJmd0OyZsdDshLS0jc2V0IHZhcj0idmFyIgotICAgICB2YWx1ZT0iUG93ZXJlZCBieSAkU0VSVkVSX1NPRlRXQVJFIC0tIEZpbGUgbGFzdCBtb2RpZmllZCBvbiAkTEFTVF9NT0RJRklFRCIKLSAgICAtLSZndDsmbHQ7IS0tI2VjaG8gdmFyPSJ2YXIiIC0tJmd0OyZsdDsvU1VQJmd0OyZsdDsvU01BTEwmZ3Q7Ci0gICZsdDsvRElWJmd0OwotICAmbHQ7QUREUkVTUyZndDtJZiB0aGUgaW5kaWNhdGVkIGVycm9yIGxvb2tzIGxpa2UgYSBtaXNjb25maWd1cmF0aW9uLCBwbGVhc2UgaW5mb3JtCi0gICAmbHQ7QSBIUkVGPSJtYWlsdG86Jmx0OyEtLSNlY2hvIHZhcj0iU0VSVkVSX0FETUlOIiAtLSZndDsiCi0gICAgICBTVUJKRUNUPSJGZWVkYmFjayBhYm91dCBFcnJvciBtZXNzYWdlIFsmbHQ7IS0tI2VjaG8gdmFyPSJSRURJUkVDVF9TVEFUVVMiIAotICAgICAgICAtLSZndDtdICZsdDshLS0jZWNobyB2YXI9InRpdGxlIiAtLSZndDssIHJlcT0mbHQ7IS0tI2VjaG8gdmFyPSJSRVFVRVNUX1VSSSIgLS0mZ3Q7IiZndDsKLSAgICZsdDshLS0jZWNobyB2YXI9IlNFUlZFUl9OQU1FIiAtLSZndDsncyBXZWJNYXN0ZXImbHQ7L0EmZ3Q7LgotICAmbHQ7L0FERFJFU1MmZ3Q7Ci0gJmx0Oy9VTCZndDsmbHQ7L0JPRFkmZ3Q7Ci0mbHQ7L0hUTUwmZ3Q7Ci08L1BSRT48SFI+Ci0KLQotPEgzPk1vcmUgd2VsY29tZSE8L0gzPgotCi1JZiB5b3UgaGF2ZSB0aXBzIHRvIGNvbnRyaWJ1dGUsIHNlbmQgbWFpbCB0byA8QQotSFJFRj0ibWFpbHRvOm1hcnRpbkBhcGFjaGUub3JnIj5tYXJ0aW5AYXBhY2hlLm9yZzwvQT4KLQotICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9taXNjL2Rlc2NyaXB0b3JzLmh0bWwgYi9kb2NzL21hbnVhbC9taXNjL2Rlc2NyaXB0b3JzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZGI3Y2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbWlzYy9kZXNjcmlwdG9ycy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+RGVzY3JpcHRvcnMgYW5kIEFwYWNoZTwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPkRlc2NyaXB0b3JzIGFuZCBBcGFjaGU8L0gxPgotCi08UD5BIDxFTT5kZXNjcmlwdG9yPC9FTT4sIGFsc28gY29tbW9ubHkgY2FsbGVkIGEgPEVNPmZpbGUgaGFuZGxlPC9FTT4gaXMKLWFuIG9iamVjdCB0aGF0IGEgcHJvZ3JhbSB1c2VzIHRvIHJlYWQgb3Igd3JpdGUgYW4gb3BlbiBmaWxlLCBvciBvcGVuCi1uZXR3b3JrIHNvY2tldCwgb3IgYSB2YXJpZXR5IG9mIG90aGVyIGRldmljZXMuICBJdCBpcyByZXByZXNlbnRlZAotYnkgYW4gaW50ZWdlciwgYW5kIHlvdSBtYXkgYmUgZmFtaWxpYXIgd2l0aCA8Q09ERT5zdGRpbjwvQ09ERT4sCi08Q09ERT5zdGRvdXQ8L0NPREU+LCBhbmQgPENPREU+c3RkZXJyPC9DT0RFPiB3aGljaCBhcmUgZGVzY3JpcHRvcnMgMCwKLTEsIGFuZCAyIHJlc3BlY3RpdmVseS4KLUFwYWNoZSBuZWVkcyBhIGRlc2NyaXB0b3IgZm9yIGVhY2ggbG9nIGZpbGUsIHBsdXMgb25lIGZvciBlYWNoCi1uZXR3b3JrIHNvY2tldCB0aGF0IGl0IGxpc3RlbnMgb24sIHBsdXMgYSBoYW5kZnVsIG9mIG90aGVycy4gIExpYnJhcmllcwotdGhhdCBBcGFjaGUgdXNlcyBtYXkgYWxzbyByZXF1aXJlIGRlc2NyaXB0b3JzLiAgTm9ybWFsIHByb2dyYW1zIGRvbid0Ci1vcGVuIHVwIG1hbnkgZGVzY3JpcHRvcnMgYXQgYWxsLCBhbmQgc28gdGhlcmUgYXJlIHNvbWUgbGF0ZW50IHByb2JsZW1zCi10aGF0IHlvdSBtYXkgZXhwZXJpZW5jZSBzaG91bGQgeW91IHN0YXJ0IHJ1bm5pbmcgQXBhY2hlIHdpdGggbWFueQotZGVzY3JpcHRvcnMgKDxFTT5pLmUuPC9FTT4sIHdpdGggbWFueSB2aXJ0dWFsIGhvc3RzKS4KLQotPFA+VGhlIG9wZXJhdGluZyBzeXN0ZW0gZW5mb3JjZXMgYSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGRlc2NyaXB0b3JzCi10aGF0IGEgcHJvZ3JhbSBjYW4gaGF2ZSBvcGVuIGF0IGEgdGltZS4gIFRoZXJlIGFyZSB0eXBpY2FsbHkgdGhyZWUgbGltaXRzCi1pbnZvbHZlZCBoZXJlLiAgT25lIGlzIGEga2VybmVsIGxpbWl0YXRpb24sIGRlcGVuZGluZyBvbiB5b3VyIG9wZXJhdGluZwotc3lzdGVtIHlvdSB3aWxsIGVpdGhlciBiZSBhYmxlIHRvIHR1bmUgdGhlIG51bWJlciBvZiBkZXNjcmlwdG9ycyBhdmFpbGFibGUKLXRvIGhpZ2hlciBudW1iZXJzICh0aGlzIGlzIGZyZXF1ZW50bHkgY2FsbGVkIDxFTT5GRF9TRVRTSVpFPC9FTT4pLiAgT3IgeW91Ci1tYXkgYmUgc3R1Y2sgd2l0aCBhIChyZWxhdGl2ZWx5KSBsb3cgYW1vdW50LiAgVGhlIHNlY29uZCBsaW1pdCBpcyBjYWxsZWQKLXRoZSA8RU0+aGFyZCByZXNvdXJjZTwvRU0+IGxpbWl0LCBhbmQgaXQgaXMgc29tZXRpbWVzIHNldCBieSByb290IGluIGFuCi1vYnNjdXJlIG9wZXJhdGluZyBzeXN0ZW0gZmlsZSwgYnV0IGZyZXF1ZW50bHkgaXMgdGhlIHNhbWUgYXMgdGhlIGtlcm5lbAotbGltaXQuICBUaGUgdGhpcmQgbGltaXQgaXMgY2FsbGVkIHRoZSA8RU0+c29mdAotcmVzb3VyY2U8L0VNPiBsaW1pdC4gIFRoZSBzb2Z0IGxpbWl0IGlzIGFsd2F5cyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KLXRoZSBoYXJkIGxpbWl0LiAgRm9yIGV4YW1wbGUsIHRoZSBoYXJkIGxpbWl0IG1heSBiZSAxMDI0LCBidXQgdGhlIHNvZnQKLWxpbWl0IG9ubHkgNjQuICBBbnkgdXNlciBjYW4gcmFpc2UgdGhlaXIgc29mdCBsaW1pdCB1cCB0byB0aGUgaGFyZCBsaW1pdC4KLVJvb3QgY2FuIHJhaXNlIHRoZSBoYXJkIGxpbWl0IHVwIHRvIHRoZSBzeXN0ZW0gbWF4aW11bSBsaW1pdC4gIFRoZSBzb2Z0Ci1saW1pdCBpcyB0aGUgYWN0dWFsIGxpbWl0IHRoYXQgaXMgdXNlZCB3aGVuIGVuZm9yY2luZyB0aGUgbWF4aW11bSBudW1iZXIKLW9mIGZpbGVzIGEgcHJvY2VzcyBjYW4gaGF2ZSBvcGVuLgotCi08UD5UbyBzdW1tYXJpemU6Ci0KLTxDRU5URVI+PFBSRT4KLSAgI29wZW4gZmlsZXMgICZsdDs9ICBzb2Z0IGxpbWl0ICAmbHQ7PSAgaGFyZCBsaW1pdCAgJmx0Oz0gIGtlcm5lbCBsaW1pdAotPC9QUkU+PC9DRU5URVI+Ci0KLTxQPllvdSBjb250cm9sIHRoZSBoYXJkIGFuZCBzb2Z0IGxpbWl0cyB1c2luZyB0aGUgPENPREU+bGltaXQ8L0NPREU+IChjc2gpCi1vciA8Q09ERT51bGltaXQ8L0NPREU+IChzaCkgZGlyZWN0aXZlcy4gIFNlZSB0aGUgcmVzcGVjdGl2ZSBtYW4gcGFnZXMKLWZvciBtb3JlIGluZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUgeW91IGNhbiBwcm9iYWJseSB1c2UKLTxDT0RFPnVsaW1pdCAtbiB1bmxpbWl0ZWQ8L0NPREU+IHRvIHJhaXNlIHlvdXIgc29mdCBsaW1pdCB1cCB0byB0aGUKLWhhcmQgbGltaXQuICBZb3Ugc2hvdWxkIGluY2x1ZGUgdGhpcyBjb21tYW5kIGluIGEgc2hlbGwgc2NyaXB0IHdoaWNoCi1zdGFydHMgeW91ciB3ZWJzZXJ2ZXIuCi0KLTxQPlVuZm9ydHVuYXRlbHksIGl0J3Mgbm90IGFsd2F5cyB0aGlzIHNpbXBsZS4gIEFzIG1lbnRpb25lZCBhYm92ZSwKLXlvdSB3aWxsIHByb2JhYmx5IHJ1biBpbnRvIHNvbWUgc3lzdGVtIGxpbWl0YXRpb25zIHRoYXQgd2lsbCBuZWVkIHRvIGJlCi13b3JrZWQgYXJvdW5kIHNvbWVob3cuICBXb3JrIHdhcyBkb25lIGluIHZlcnNpb24gMS4yLjEgdG8gaW1wcm92ZSB0aGUKLXNpdHVhdGlvbiBzb21ld2hhdC4gIEhlcmUgaXMgYSBwYXJ0aWFsIGxpc3Qgb2Ygc3lzdGVtcyBhbmQgd29ya2Fyb3VuZHMKLShhc3N1bWluZyB5b3UgYXJlIHVzaW5nIDEuMi4xIG9yIGxhdGVyKToKLQotPERMPgotCi0gICAgPERUPjxTVFJPTkc+QlNESSAyLjA8L1NUUk9ORz4KLSAgICA8REQ+VW5kZXIgQlNESSAyLjAgeW91IGNhbiBidWlsZCBBcGFjaGUgdG8gc3VwcG9ydCBtb3JlIGRlc2NyaXB0b3JzCi0gICAgICAgIGJ5IGFkZGluZyA8Q09ERT4tREZEX1NFVFNJWkU9bm5uPC9DT0RFPiB0bwotICAgICAgICA8Q09ERT5FWFRSQV9DRkxBR1M8L0NPREU+ICh3aGVyZSBubm4gaXMgdGhlIG51bWJlciBvZiBkZXNjcmlwdG9ycwotICAgICAgICB5b3Ugd2lzaCB0byBzdXBwb3J0LCBrZWVwIGl0IGxlc3MgdGhhbiB0aGUgaGFyZCBsaW1pdCkuICBCdXQgaXQKLSAgICAgICAgd2lsbCBydW4gaW50byB0cm91YmxlIGlmIG1vcmUgdGhhbiBhcHByb3hpbWF0ZWx5IDI0MCBMaXN0ZW4KLSAgICAgICAgZGlyZWN0aXZlcyBhcmUgdXNlZC4gIFRoaXMgbWF5IGJlIGN1cmVkIGJ5IHJlYnVpbGRpbmcgeW91ciBrZXJuZWwKLSAgICAgICAgd2l0aCBhIGhpZ2hlciBGRF9TRVRTSVpFLgotICAgIDxQPgotCi0gICAgPERUPjxTVFJPTkc+RnJlZUJTRCAyLjIsIEJTREkgMi4xKzwvU1RST05HPgotICAgIDxERD5TaW1pbGFyIHRvIHRoZSBCU0RJIDIuMCBjYXNlLCB5b3Ugc2hvdWxkIGRlZmluZQotICAgICAgICA8Q09ERT5GRF9TRVRTSVpFPC9DT0RFPiBhbmQgcmVidWlsZC4gIEJ1dCB0aGUgZXh0cmEKLSAgICAgICAgTGlzdGVuIGxpbWl0YXRpb24gZG9lc24ndCBleGlzdC4KLSAgICA8UD4KLQotICAgIDxEVD48U1RST05HPkxpbnV4PC9TVFJPTkc+Ci0gICAgPEREPkJ5IGRlZmF1bHQgTGludXggaGFzIGEga2VybmVsIG1heGltdW0gb2YgMjU2IG9wZW4gZGVzY3JpcHRvcnMKLSAgICAgICAgcGVyIHByb2Nlc3MuICBUaGVyZSBhcmUgc2V2ZXJhbCBwYXRjaGVzIGF2YWlsYWJsZSBmb3IgdGhlCi0gICAgICAgIDIuMC54IHNlcmllcyB3aGljaCByYWlzZSB0aGlzIHRvIDEwMjQgYW5kIGJleW9uZCwgYW5kIHlvdQotICAgICAgICBjYW4gZmluZCB0aGVtIGluIHRoZSAidW5vZmZpY2lhbCBwYXRjaGVzIiBzZWN0aW9uIG9mIDxBCi0gICAgICAgIEhSRUY9Imh0dHA6Ly93d3cubGludXhocS5jb20vIj50aGUgTGludXggSW5mb3JtYXRpb24gSFE8L0E+LgotICAgICAgICBOb25lIG9mIHRoZXNlIHBhdGNoZXMgYXJlIHBlcmZlY3QsIGFuZCBhbiBlbnRpcmVseSBkaWZmZXJlbnQKLSAgICAgICAgYXBwcm9hY2ggaXMgbGlrZWx5IHRvIGJlIHRha2VuIGR1cmluZyB0aGUgMi4xLnggZGV2ZWxvcG1lbnQuCi0gICAgICAgIEFwcGx5aW5nIHRoZXNlIHBhdGNoZXMgd2lsbCByYWlzZSB0aGUgRkRfU0VUU0laRSB1c2VkIHRvIGNvbXBpbGUKLSAgICAgICAgYWxsIHByb2dyYW1zLCBhbmQgdW5sZXNzIHlvdSByZWJ1aWxkIGFsbCB5b3VyIGxpYnJhcmllcyB5b3Ugc2hvdWxkCi0gICAgICAgIGF2b2lkIHJ1bm5pbmcgYW55IG90aGVyIHByb2dyYW0gd2l0aCBhIHNvZnQgZGVzY3JpcHRvciBsaW1pdCBhYm92ZQotICAgICAgICAyNTYuICBBcyBvZiB0aGlzIHdyaXRpbmcgdGhlIHBhdGNoZXMgYXZhaWxhYmxlIGZvciBpbmNyZWFzaW5nCi0gICAgICAgIHRoZSBudW1iZXIgb2YgZGVzY3JpcHRvcnMgZG8gbm90IHRha2UgdGhpcyBpbnRvIGFjY291bnQuICBPbiBhCi0gICAgICAgIGRlZGljYXRlZCB3ZWJzZXJ2ZXIgeW91IHByb2JhYmx5IHdvbid0IHJ1biBpbnRvIHRyb3VibGUuCi0gICAgPFA+Ci0KLSAgICA8RFQ+PFNUUk9ORz5Tb2xhcmlzIHRocm91Z2ggMi41LjE8L1NUUk9ORz4KLSAgICA8REQ+U29sYXJpcyBoYXMgYSBrZXJuZWwgaGFyZCBsaW1pdCBvZiAxMDI0IChtYXkgYmUgbG93ZXIgaW4gZWFybGllcgotICAgICAgICB2ZXJzaW9ucykuICBCdXQgaXQgaGFzIGEgbGltaXRhdGlvbiB0aGF0IGZpbGVzIHVzaW5nCi0gICAgICAgIHRoZSBzdGRpbyBsaWJyYXJ5IGNhbm5vdCBoYXZlIGEgZGVzY3JpcHRvciBhYm92ZSAyNTUuCi0gICAgICAgIEFwYWNoZSB1c2VzIHRoZSBzdGRpbyBsaWJyYXJ5IGZvciB0aGUgRXJyb3JMb2cgZGlyZWN0aXZlLgotICAgICAgICBXaGVuIHlvdSBoYXZlIG1vcmUgdGhhbiBhcHByb3hpbWF0ZWx5IDExMCB2aXJ0dWFsIGhvc3RzCi0gICAgICAgICh3aXRoIGFuIGVycm9yIGxvZyBhbmQgYW4gYWNjZXNzIGxvZyBlYWNoKSB5b3Ugd2lsbCBuZWVkIHRvCi0gICAgICAgIGJ1aWxkIEFwYWNoZSB3aXRoIDxDT0RFPi1ESElHSF9TTEFDS19MSU5FPTI1NjwvQ09ERT4gYWRkZWQgdG8KLSAgICAgICAgPENPREU+RVhUUkFfQ0ZMQUdTPC9DT0RFPi4gIFlvdSB3aWxsIGJlIGxpbWl0ZWQgdG8gYXBwcm94aW1hdGVseQotICAgICAgICAyNDAgZXJyb3IgbG9ncyBpZiB5b3UgZG8gdGhpcy4KLSAgICA8UD4KLQotICAgIDxEVD48U1RST05HPkFJWDwvU1RST05HPgotICAgIDxERD5BSVggdmVyc2lvbiAzLjI/PyBhcHBlYXJzIHRvIGhhdmUgYSBoYXJkIGxpbWl0IG9mIDEyOCBkZXNjcmlwdG9ycy4KLQlFbmQgb2Ygc3RvcnkuICBWZXJzaW9uIDQuMS41IGhhcyBhIGhhcmQgbGltaXQgb2YgMjAwMC4KLSAgICA8UD4KLQotICAgIDxEVD48U1RST05HPk90aGVyczwvU1RST05HPgotICAgIDxERD5JZiB5b3UgaGF2ZSBkZXRhaWxzIG9uIGFub3RoZXIgb3BlcmF0aW5nIHN5c3RlbSwgcGxlYXNlIHN1Ym1pdAotICAgICAgICBpdCB0aHJvdWdoIG91ciA8QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvYnVnX3JlcG9ydC5odG1sIj5CdWcKLSAgICAgICAgUmVwb3J0IFBhZ2U8L0E+LgotICAgIDxQPgotCi08L0RMPgotCi08UD5JbiBhZGRpdGlvbiB0byB0aGUgcHJvYmxlbXMgZGVzY3JpYmVkIGFib3ZlIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoCi1tYW55IGxpYnJhcmllcyB0aGF0IEFwYWNoZSB1c2VzLiAgVGhlIG1vc3QgY29tbW9uIGV4YW1wbGUgaXMgdGhlIGJpbmQKLUROUyByZXNvbHZlciBsaWJyYXJ5IHRoYXQgaXMgdXNlZCBieSBwcmV0dHkgbXVjaCBldmVyeSB1bml4LCB3aGljaAotZmFpbHMgaWYgaXQgZW5kcyB1cCB3aXRoIGEgZGVzY3JpcHRvciBhYm92ZSAyNTYuICBXZSBzdXNwZWN0IHRoZXJlCi1hcmUgb3RoZXIgbGlicmFyaWVzIHRoYXQgc2ltaWxhciBsaW1pdGF0aW9ucy4gIFNvIHRoZSBjb2RlIGFzIG9mIDEuMi4xCi10YWtlcyBhIGRlZmVuc2l2ZSBzdGFuY2UgYW5kIHRyaWVzIHRvIHNhdmUgZGVzY3JpcHRvcnMgbGVzcyB0aGFuIDE2Ci1mb3IgdXNlIHdoaWxlIHByb2Nlc3NpbmcgZWFjaCByZXF1ZXN0LiAgVGhpcyBpcyBjYWxsZWQgdGhlIDxFTT5sb3cKLXNsYWNrIGxpbmU8L0VNPi4KLQotPFA+Tm90ZSB0aGF0IHRoaXMgc2hvdWxkbid0IHdhc3RlIGRlc2NyaXB0b3JzLiAgSWYgeW91IHJlYWxseSBhcmUgcHVzaGluZwotdGhlIGxpbWl0cyBhbmQgQXBhY2hlIGNhbid0IGdldCBhIGRlc2NyaXB0b3IgYWJvdmUgMTYgd2hlbiBpdCB3YW50cwotaXQsIGl0IHdpbGwgc2V0dGxlIGZvciBvbmUgYmVsb3cgMTYuCi0KLTxQPkluIGV4dHJlbWUgc2l0dWF0aW9ucyB5b3UgbWF5IHdhbnQgdG8gbG93ZXIgdGhlIGxvdyBzbGFjayBsaW5lLAotYnV0IHlvdSBzaG91bGRuJ3QgZXZlciBuZWVkIHRvLiAgRm9yIGV4YW1wbGUsIGxvd2VyaW5nIGl0IGNhbgotaW5jcmVhc2UgdGhlIGxpbWl0cyAyNDAgZGVzY3JpYmVkIGFib3ZlIHVuZGVyIFNvbGFyaXMgYW5kIEJTREkgMi4wLgotQnV0IHlvdSdsbCBwbGF5IGEgZGVsaWNhdGUgYmFsYW5jaW5nIGdhbWUgd2l0aCB0aGUgZGVzY3JpcHRvcnMgbmVlZGVkCi10byBzZXJ2ZSBhIHJlcXVlc3QuICBTaG91bGQgeW91IHdhbnQgdG8gcGxheSB0aGlzIGdhbWUsIHRoZSBjb21waWxlCi10aW1lIHBhcmFtZXRlciBpcyA8Q09ERT5MT1dfU0xBQ0tfTElORTwvQ09ERT4gYW5kIHRoZXJlJ3MgYSB0aW55Ci1iaXQgb2YgZG9jdW1lbnRhdGlvbiBpbiB0aGUgaGVhZGVyIGZpbGUgPENPREU+aHR0cGQuaDwvQ09ERT4uCi0KLTxQPkZpbmFsbHksIGlmIHlvdSBzdXNwZWN0IHRoYXQgYWxsIHRoaXMgc2xhY2sgc3R1ZmYgaXMgY2F1c2luZyB5b3UKLXByb2JsZW1zLCB5b3UgY2FuIGRpc2FibGUgaXQuICBBZGQgPENPREU+LUROT19TTEFDSzwvQ09ERT4gdG8KLTxDT0RFPkVYVFJBX0NGTEFHUzwvQ09ERT4gYW5kIHJlYnVpbGQuICBCdXQgcGxlYXNlIHJlcG9ydCBpdCB0bwotb3VyIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9idWdfcmVwb3J0Lmh0bWwiPkJ1ZwotUmVwb3J0IFBhZ2U8L0E+IHNvIHRoYXQKLXdlIGNhbiBpbnZlc3RpZ2F0ZS4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21pc2MvZmluX3dhaXRfMi5odG1sIGIvZG9jcy9tYW51YWwvbWlzYy9maW5fd2FpdF8yLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZTMxM2QuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbWlzYy9maW5fd2FpdF8yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5Db25uZWN0aW9ucyBpbiBGSU5fV0FJVF8yIGFuZCBBcGFjaGU8L1RJVExFPgotPExJTksgUkVWPSJtYWRlIiBIUkVGPSJtYWlsdG86bWFyY0BhcGFjaGUub3JnIj4KLQotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLQotPEgxIEFMSUdOPSJDRU5URVIiPkNvbm5lY3Rpb25zIGluIHRoZSBGSU5fV0FJVF8yIHN0YXRlIGFuZCBBcGFjaGU8L0gxPgotPE9MPgotPExJPjxIMj5XaGF0IGlzIHRoZSBGSU5fV0FJVF8yIHN0YXRlPzwvSDI+Ci1TdGFydGluZyB3aXRoIHRoZSBBcGFjaGUgMS4yIGJldGFzLCBwZW9wbGUgYXJlIHJlcG9ydGluZyBtYW55IG1vcmUKLWNvbm5lY3Rpb25zIGluIHRoZSBGSU5fV0FJVF8yIHN0YXRlIChhcyByZXBvcnRlZCBieQotPENPREU+bmV0c3RhdDwvQ09ERT4pIHRoYW4gdGhleSBzYXcgdXNpbmcgb2xkZXIgdmVyc2lvbnMuICBXaGVuIHRoZQotc2VydmVyIGNsb3NlcyBhIFRDUCBjb25uZWN0aW9uLCBpdCBzZW5kcyBhIHBhY2tldCB3aXRoIHRoZSBGSU4gYml0Ci1zZW50IHRvIHRoZSBjbGllbnQsIHdoaWNoIHRoZW4gcmVzcG9uZHMgd2l0aCBhIHBhY2tldCB3aXRoIHRoZSBBQ0sgYml0Ci1zZXQuICBUaGUgY2xpZW50IHRoZW4gc2VuZHMgYSBwYWNrZXQgd2l0aCB0aGUgRklOIGJpdCBzZXQgdG8gdGhlCi1zZXJ2ZXIsIHdoaWNoIHJlc3BvbmRzIHdpdGggYW4gQUNLIGFuZCB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQuICBUaGUKLXN0YXRlIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgaW4gZHVyaW5nIHRoZSBwZXJpb2QgYmV0d2VlbiB3aGVuIHRoZQotc2VydmVyIGdldHMgdGhlIEFDSyBmcm9tIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIgZ2V0cyB0aGUgRklOIGZyb20KLXRoZSBjbGllbnQgaXMga25vd24gYXMgRklOX1dBSVRfMi4gIFNlZSB0aGUgPEEKLUhSRUY9ImZ0cDovL2RzLmludGVybmljLm5ldC9yZmMvcmZjNzkzLnR4dCI+VENQIFJGQzwvQT4gZm9yIHRoZQotdGVjaG5pY2FsIGRldGFpbHMgb2YgdGhlIHN0YXRlIHRyYW5zaXRpb25zLjxQPgotCi1UaGUgRklOX1dBSVRfMiBzdGF0ZSBpcyBzb21ld2hhdCB1bnVzdWFsIGluIHRoYXQgdGhlcmUgaXMgbm8gdGltZW91dAotZGVmaW5lZCBpbiB0aGUgc3RhbmRhcmQgZm9yIGl0LiAgVGhpcyBtZWFucyB0aGF0IG9uIG1hbnkgb3BlcmF0aW5nCi1zeXN0ZW1zLCBhIGNvbm5lY3Rpb24gaW4gdGhlIEZJTl9XQUlUXzIgc3RhdGUgd2lsbCBzdGF5IGFyb3VuZCB1bnRpbAotdGhlIHN5c3RlbSBpcyByZWJvb3RlZC4gIElmIHRoZSBzeXN0ZW0gZG9lcyBub3QgaGF2ZSBhIHRpbWVvdXQgYW5kCi10b28gbWFueSBGSU5fV0FJVF8yIGNvbm5lY3Rpb25zIGJ1aWxkIHVwLCBpdCBjYW4gZmlsbCB1cCB0aGUgc3BhY2UKLWFsbG9jYXRlZCBmb3Igc3RvcmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29ubmVjdGlvbnMgYW5kIGNyYXNoCi10aGUga2VybmVsLiAgVGhlIGNvbm5lY3Rpb25zIGluIEZJTl9XQUlUXzIgZG8gbm90IHRpZSB1cCBhbiBodHRwZAotcHJvY2Vzcy48UD4KLQotPExJPjxIMj5CdXQgd2h5IGRvZXMgaXQgaGFwcGVuPzwvSDI+Ci0KLVRoZXJlIGFyZSBudW1lcm91cyByZWFzb25zIGZvciBpdCBoYXBwZW5pbmcsIHNvbWUgb2YgdGhlbSBtYXkgbm90Ci15ZXQgYmUgZnVsbHkgY2xlYXIuICBXaGF0IGlzIGtub3duIGZvbGxvd3MuPFA+Ci0KLTxIMz5CdWdneSBjbGllbnRzIGFuZCBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zPC9IMz4KLQotU2V2ZXJhbCBjbGllbnRzIGhhdmUgYSBidWcgd2hpY2ggcG9wcyB1cCB3aGVuIGRlYWxpbmcgd2l0aAotPEEgSFJFRj0iLi4va2VlcGFsaXZlLmh0bWwiPnBlcnNpc3RlbnQgY29ubmVjdGlvbnM8L0E+IChha2Ega2VlcGFsaXZlcykuCi1XaGVuIHRoZSBjb25uZWN0aW9uIGlzIGlkbGUgYW5kIHRoZSBzZXJ2ZXIgY2xvc2VzIHRoZSBjb25uZWN0aW9uCi0oYmFzZWQgb24gdGhlIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwja2VlcGFsaXZldGltZW91dCI+Ci1LZWVwQWxpdmVUaW1lb3V0PC9BPiksIHRoZSBjbGllbnQgaXMgcHJvZ3JhbW1lZCBzbyB0aGF0IHRoZSBjbGllbnQgZG9lcwotbm90IHNlbmQgYmFjayBhIEZJTiBhbmQgQUNLIHRvIHRoZSBzZXJ2ZXIuICBUaGlzIG1lYW5zIHRoYXQgdGhlCi1jb25uZWN0aW9uIHN0YXlzIGluIHRoZSBGSU5fV0FJVF8yIHN0YXRlIHVudGlsIG9uZSBvZiB0aGUgZm9sbG93aW5nCi1oYXBwZW5zOjxQPgotPFVMPgotICAgICAgICA8TEk+VGhlIGNsaWVudCBvcGVucyBhIG5ldyBjb25uZWN0aW9uIHRvIHRoZSBzYW1lIG9yIGEgZGlmZmVyZW50Ci0gICAgICAgICAgICBzaXRlLCB3aGljaCBjYXVzZXMgaXQgdG8gZnVsbHkgY2xvc2UgdGhlIG9sZGVyIGNvbm5lY3Rpb24gb24KLSAgICAgICAgICAgIHRoYXQgc29ja2V0LgotICAgICAgICA8TEk+VGhlIHVzZXIgZXhpdHMgdGhlIGNsaWVudCwgd2hpY2ggb24gc29tZSAobW9zdD8pIGNsaWVudHMKLSAgICAgICAgICAgIGNhdXNlcyB0aGUgT1MgdG8gZnVsbHkgc2h1dGRvd24gdGhlIGNvbm5lY3Rpb24uCi0gICAgICAgIDxMST5UaGUgRklOX1dBSVRfMiB0aW1lcyBvdXQsIG9uIHNlcnZlcnMgdGhhdCBoYXZlIGEgdGltZW91dAotICAgICAgICAgICAgZm9yIHRoaXMgc3RhdGUuCi08L1VMPjxQPgotSWYgeW91IGFyZSBsdWNreSwgdGhpcyBtZWFucyB0aGF0IHRoZSBidWdneSBjbGllbnQgd2lsbCBmdWxseSBjbG9zZSB0aGUKLWNvbm5lY3Rpb24gYW5kIHJlbGVhc2UgdGhlIHJlc291cmNlcyBvbiB5b3VyIHNlcnZlci4gIEhvd2V2ZXIsIHRoZXJlCi1hcmUgc29tZSBjYXNlcyB3aGVyZSB0aGUgc29ja2V0IGlzIG5ldmVyIGZ1bGx5IGNsb3NlZCwgc3VjaCBhcyBhIGRpYWx1cAotY2xpZW50IGRpc2Nvbm5lY3RpbmcgZnJvbSB0aGVpciBwcm92aWRlciBiZWZvcmUgY2xvc2luZyB0aGUgY2xpZW50LgotSW4gYWRkaXRpb24sIGEgY2xpZW50IG1pZ2h0IHNpdCBpZGxlIGZvciBkYXlzIHdpdGhvdXQgbWFraW5nIGFub3RoZXIKLWNvbm5lY3Rpb24sIGFuZCB0aHVzIG1heSBob2xkIGl0cyBlbmQgb2YgdGhlIHNvY2tldCBvcGVuIGZvciBkYXlzCi1ldmVuIHRob3VnaCBpdCBoYXMgbm8gZnVydGhlciB1c2UgZm9yIGl0LgotPFNUUk9ORz5UaGlzIGlzIGEgYnVnIGluIHRoZSBicm93c2VyIG9yIGluIGl0cyBvcGVyYXRpbmcgc3lzdGVtJ3MKLVRDUCBpbXBsZW1lbnRhdGlvbi48L1NUUk9ORz4gIDxQPgotCi1UaGUgY2xpZW50cyBvbiB3aGljaCB0aGlzIHByb2JsZW0gaGFzIGJlZW4gdmVyaWZpZWQgdG8gZXhpc3Q6PFA+Ci08VUw+Ci0gICAgICAgIDxMST5Nb3ppbGxhLzMuMDEgKFgxMTsgSTsgRnJlZUJTRCAyLjEuNS1SRUxFQVNFIGkzODYpCi0gICAgICAgIDxMST5Nb3ppbGxhLzIuMDIgKFgxMTsgSTsgRnJlZUJTRCAyLjEuNS1SRUxFQVNFIGkzODYpCi0gICAgICAgIDxMST5Nb3ppbGxhLzMuMDFHb2xkIChYMTE7IEk7IFN1bk9TIDUuNSBzdW40bSkKLSAgICAgICAgPExJPk1TSUUgMy4wMSBvbiB0aGUgTWFjaW50b3NoCi0gICAgICAgIDxMST5NU0lFIDMuMDEgb24gV2luZG93cyA5NQotPC9VTD48UD4KLQotVGhpcyBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSBwcm9ibGVtIG9uOgotPFVMPgotICAgICAgICA8TEk+TW96aWxsYS8zLjAxIChXaW45NTsgSSkKLTwvVUw+Ci08UD4KLQotSXQgaXMgZXhwZWN0ZWQgdGhhdCBtYW55IG90aGVyIGNsaWVudHMgaGF2ZSB0aGUgc2FtZSBwcm9ibGVtLiBXaGF0IGEKLWNsaWVudCA8U1RST05HPnNob3VsZCBkbzwvU1RST05HPiBpcyBwZXJpb2RpY2FsbHkgY2hlY2sgaXRzIG9wZW4KLXNvY2tldChzKSB0byBzZWUgaWYgdGhleSBoYXZlIGJlZW4gY2xvc2VkIGJ5IHRoZSBzZXJ2ZXIsIGFuZCBjbG9zZSB0aGVpcgotc2lkZSBvZiB0aGUgY29ubmVjdGlvbiBpZiB0aGUgc2VydmVyIGhhcyBjbG9zZWQuICBUaGlzIGNoZWNrIG5lZWQgb25seQotb2NjdXIgb25jZSBldmVyeSBmZXcgc2Vjb25kcywgYW5kIG1heSBldmVuIGJlIGRldGVjdGVkIGJ5IGEgT1Mgc2lnbmFsCi1vbiBzb21lIHN5c3RlbXMgKDxFTT5lLmcuPC9FTT4sIFdpbjk1IGFuZCBOVCBjbGllbnRzIGhhdmUgdGhpcyBjYXBhYmlsaXR5LCBidXQKLXRoZXkgc2VlbSB0byBiZSBpZ25vcmluZyBpdCkuPFA+Ci0KLUFwYWNoZSA8U1RST05HPmNhbm5vdDwvU1RST05HPiBhdm9pZCB0aGVzZSBGSU5fV0FJVF8yIHN0YXRlcyB1bmxlc3MgaXQKLWRpc2FibGVzIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgZm9yIHRoZSBidWdneSBjbGllbnRzLCBqdXN0Ci1saWtlIHdlIHJlY29tbWVuZCBkb2luZyBmb3IgTmF2aWdhdG9yIDIueCBjbGllbnRzIGR1ZSB0byBvdGhlciBidWdzLgotSG93ZXZlciwgbm9uLXBlcnNpc3RlbnQgY29ubmVjdGlvbnMgaW5jcmVhc2UgdGhlIHRvdGFsIG51bWJlciBvZgotY29ubmVjdGlvbnMgbmVlZGVkIHBlciBjbGllbnQgYW5kIHNsb3cgcmV0cmlldmFsIG9mIGFuIGltYWdlLWxhZGVuCi13ZWIgcGFnZS4gIFNpbmNlIG5vbi1wZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGhhdmUgdGhlaXIgb3duIHJlc291cmNlCi1jb25zdW1wdGlvbnMgYW5kIGEgc2hvcnQgd2FpdGluZyBwZXJpb2QgYWZ0ZXIgZWFjaCBjbG9zdXJlLCBhIGJ1c3kgc2VydmVyCi1tYXkgbmVlZCBwZXJzaXN0ZW5jZSBpbiBvcmRlciB0byBiZXN0IHNlcnZlIGl0cyBjbGllbnRzLjxQPgotCi1BcyBmYXIgYXMgd2Uga25vdywgdGhlIGNsaWVudC1jYXVzZWQgRklOX1dBSVRfMiBwcm9ibGVtIGlzIHByZXNlbnQgZm9yCi1hbGwgc2VydmVycyB0aGF0IHN1cHBvcnQgcGVyc2lzdGVudCBjb25uZWN0aW9ucywgaW5jbHVkaW5nIEFwYWNoZSAxLjEueAotYW5kIDEuMi48UD4KLQotPEgzPkEgbmVjZXNzYXJ5IGJpdCBvZiBjb2RlIGludHJvZHVjZWQgaW4gMS4yPC9IMz4KLQotV2hpbGUgdGhlIGFib3ZlIGJ1ZyBpcyBhIHByb2JsZW0sIGl0IGlzIG5vdCB0aGUgd2hvbGUgcHJvYmxlbS4KLVNvbWUgdXNlcnMgaGF2ZSBvYnNlcnZlZCBubyBGSU5fV0FJVF8yIHByb2JsZW1zIHdpdGggQXBhY2hlIDEuMS54LAotYnV0IHdpdGggMS4yYiBlbm91Z2ggY29ubmVjdGlvbnMgYnVpbGQgdXAgaW4gdGhlIEZJTl9XQUlUXzIgc3RhdGUgdG8KLWNyYXNoIHRoZWlyIHNlcnZlci4gIAotCi1UaGUgbW9zdCBsaWtlbHkgc291cmNlIGZvciBhZGRpdGlvbmFsIEZJTl9XQUlUXzIgc3RhdGVzCi1pcyBhIGZ1bmN0aW9uIGNhbGxlZCA8Q09ERT5saW5nZXJpbmdfY2xvc2UoKTwvQ09ERT4gd2hpY2ggd2FzIGFkZGVkCi1iZXR3ZWVuIDEuMSBhbmQgMS4yLiAgVGhpcyBmdW5jdGlvbiBpcyBuZWNlc3NhcnkgZm9yIHRoZSBwcm9wZXIKLWhhbmRsaW5nIG9mIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgYW5kIGFueSByZXF1ZXN0IHdoaWNoIGluY2x1ZGVzCi1jb250ZW50IGluIHRoZSBtZXNzYWdlIGJvZHkgKDxFTT5lLmcuPC9FTT4sIFBVVHMgYW5kIFBPU1RzKS4KLVdoYXQgaXQgZG9lcyBpcyByZWFkIGFueSBkYXRhIHNlbnQgYnkgdGhlIGNsaWVudCBmb3IKLWEgY2VydGFpbiB0aW1lIGFmdGVyIHRoZSBzZXJ2ZXIgY2xvc2VzIHRoZSBjb25uZWN0aW9uLiAgVGhlIGV4YWN0Ci1yZWFzb25zIGZvciBkb2luZyB0aGlzIGFyZSBzb21ld2hhdCBjb21wbGljYXRlZCwgYnV0IGludm9sdmUgd2hhdAotaGFwcGVucyBpZiB0aGUgY2xpZW50IGlzIG1ha2luZyBhIHJlcXVlc3QgYXQgdGhlIHNhbWUgdGltZSB0aGUKLXNlcnZlciBzZW5kcyBhIHJlc3BvbnNlIGFuZCBjbG9zZXMgdGhlIGNvbm5lY3Rpb24uIFdpdGhvdXQgbGluZ2VyaW5nLAotdGhlIGNsaWVudCBtaWdodCBiZSBmb3JjZWQgdG8gcmVzZXQgaXRzIFRDUCBpbnB1dCBidWZmZXIgYmVmb3JlIGl0Ci1oYXMgYSBjaGFuY2UgdG8gcmVhZCB0aGUgc2VydmVyJ3MgcmVzcG9uc2UsIGFuZCB0aHVzIHVuZGVyc3RhbmQgd2h5Ci10aGUgY29ubmVjdGlvbiBoYXMgY2xvc2VkLgotU2VlIHRoZSA8QSBIUkVGPSIjYXBwZW5kaXgiPmFwcGVuZGl4PC9BPiBmb3IgbW9yZSBkZXRhaWxzLjxQPgotCi1UaGUgY29kZSBpbiA8Q09ERT5saW5nZXJpbmdfY2xvc2UoKTwvQ09ERT4gYXBwZWFycyB0byBjYXVzZSBwcm9ibGVtcwotZm9yIGEgbnVtYmVyIG9mIGZhY3RvcnMsIGluY2x1ZGluZyB0aGUgY2hhbmdlIGluIHRyYWZmaWMgcGF0dGVybnMKLXRoYXQgaXQgY2F1c2VzLiAgVGhlIGNvZGUgaGFzIGJlZW4gdGhvcm91Z2hseSByZXZpZXdlZCBhbmQgd2UgYXJlCi1ub3QgYXdhcmUgb2YgYW55IGJ1Z3MgaW4gaXQuICBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZXJlIGlzIHNvbWUKLXByb2JsZW0gaW4gdGhlIEJTRCBUQ1Agc3RhY2ssIGFzaWRlIGZyb20gdGhlIGxhY2sgb2YgYSB0aW1lb3V0Ci1mb3IgdGhlIEZJTl9XQUlUXzIgc3RhdGUsIGV4cG9zZWQgYnkgdGhlIDxDT0RFPmxpbmdlcmluZ19jbG9zZTwvQ09ERT4KLWNvZGUgdGhhdCBjYXVzZXMgdGhlIG9ic2VydmVkIHByb2JsZW1zLjxQPgotCi08SDI+PExJPldoYXQgY2FuIEkgZG8gYWJvdXQgaXQ/PC9IMj4KLQotVGhlcmUgYXJlIHNldmVyYWwgcG9zc2libGUgd29ya2Fyb3VuZHMgdG8gdGhlIHByb2JsZW0sIHNvbWUgb2YKLXdoaWNoIHdvcmsgYmV0dGVyIHRoYW4gb3RoZXJzLjxQPgotCi08SDM+QWRkIGEgdGltZW91dCBmb3IgRklOX1dBSVRfMjwvSDM+Ci0KLVRoZSBvYnZpb3VzIHdvcmthcm91bmQgaXMgdG8gc2ltcGx5IGhhdmUgYSB0aW1lb3V0IGZvciB0aGUgRklOX1dBSVRfMiBzdGF0ZS4KLVRoaXMgaXMgbm90IHNwZWNpZmllZCBieSB0aGUgUkZDLCBhbmQgY291bGQgYmUgY2xhaW1lZCB0byBiZSBhCi12aW9sYXRpb24gb2YgdGhlIFJGQywgYnV0IGl0IGlzIHdpZGVseSByZWNvZ25pemVkIGFzIGJlaW5nIG5lY2Vzc2FyeS4KLVRoZSBmb2xsb3dpbmcgc3lzdGVtcyBhcmUga25vd24gdG8gaGF2ZSBhIHRpbWVvdXQ6Ci08UD4KLTxVTD4KLSAgICAgICAgPExJPjxBIEhSRUY9Imh0dHA6Ly93d3cuZnJlZWJzZC5vcmcvIj5GcmVlQlNEPC9BPiB2ZXJzaW9ucyBzdGFydGluZyBhdAotICAgICAgICAgICAgMi4wIG9yIHBvc3NpYmx5IGVhcmxpZXIuCi0gICAgICAgIDxMST48QSBIUkVGPSJodHRwOi8vd3d3Lm5ldGJzZC5vcmcvIj5OZXRCU0Q8L0E+IHZlcnNpb24gMS4yKD8pCi0gICAgICAgIDxMST48QSBIUkVGPSJodHRwOi8vd3d3Lm9wZW5ic2Qub3JnLyI+T3BlbkJTRDwvQT4gYWxsIHZlcnNpb25zKD8pCi0gICAgICAgIDxMST48QSBIUkVGPSJodHRwOi8vd3d3LmJzZGkuY29tLyI+QlNEL09TPC9BPiAyLjEsIHdpdGggdGhlCi0gICAgICAgICAgICA8QSBIUkVGPSJmdHA6Ly9mdHAuYnNkaS5jb20vYnNkaS9wYXRjaGVzL3BhdGNoZXMtMi4xL0syMTAtMDI3Ij4KLSAgICAgICAgICAgIEsyMTAtMDI3PC9BPiBwYXRjaCBpbnN0YWxsZWQuCi0gICAgICAgIDxMST48QSBIUkVGPSJodHRwOi8vd3d3LnN1bi5jb20vIj5Tb2xhcmlzPC9BPiBhcyBvZiBhcm91bmQgdmVyc2lvbgotICAgICAgICAgICAgMi4yLiAgVGhlIHRpbWVvdXQgY2FuIGJlIHR1bmVkIGJ5IHVzaW5nIDxDT0RFPm5kZDwvQ09ERT4gdG8KLSAgICAgICAgICAgIG1vZGlmeSA8Q09ERT50Y3BfZmluX3dhaXRfMl9mbHVzaF9pbnRlcnZhbDwvQ09ERT4sIGJ1dCB0aGUKLSAgICAgICAgICAgIGRlZmF1bHQgc2hvdWxkIGJlIGFwcHJvcHJpYXRlIGZvciBtb3N0IHNlcnZlcnMgYW5kIGltcHJvcGVyCi0gICAgICAgICAgICB0dW5pbmcgY2FuIGhhdmUgbmVnYXRpdmUgaW1wYWN0cy4KLSAgICAgICAgPExJPjxBIEhSRUY9Imh0dHA6Ly93d3cubGludXgub3JnLyI+TGludXg8L0E+IDIuMC54IGFuZAotICAgICAgICAgICAgZWFybGllcig/KQotICAgICAgICA8TEk+PEEgSFJFRj0iaHR0cDovL3d3dy5ocC5jb20vIj5IUC1VWDwvQT4gMTAueCBkZWZhdWx0cyB0bwotICAgICAgICAgICAgdGVybWluYXRpbmcgY29ubmVjdGlvbnMgaW4gdGhlIEZJTl9XQUlUXzIgc3RhdGUgYWZ0ZXIgdGhlCi0gICAgICAgICAgICBub3JtYWwga2VlcGFsaXZlIHRpbWVvdXRzLiAgVGhpcyBkb2VzIG5vdAotICAgICAgICAgICAgcmVmZXIgdG8gdGhlIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBvciBIVFRQIGtlZXBhbGl2ZQotICAgICAgICAgICAgdGltZW91dHMsIGJ1dCB0aGUgPENPREU+U09fTElOR0VSPC9DT0RFPiBzb2NrZXQgb3B0aW9uCi0gICAgICAgICAgICB3aGljaCBpcyBlbmFibGVkIGJ5IEFwYWNoZS4gIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhZGp1c3RlZAotICAgICAgICAgICAgYnkgdXNpbmcgPENPREU+bmV0dHVuZTwvQ09ERT4gdG8gbW9kaWZ5IHBhcmFtZXRlcnMgc3VjaCBhcwotICAgICAgICAgICAgPENPREU+dGNwX2tlZXBzdGFydDwvQ09ERT4gYW5kIDxDT0RFPnRjcF9rZWVwc3RvcDwvQ09ERT4uCi0gICAgICAgICAgICBJbiBsYXRlciByZXZpc2lvbnMsIHRoZXJlIGlzIGFuIGV4cGxpY2l0IHRpbWVyIGZvcgotICAgICAgICAgICAgY29ubmVjdGlvbnMgaW4gRklOX1dBSVRfMiB0aGF0IGNhbiBiZSBtb2RpZmllZDsgY29udGFjdCBIUAotICAgICAgICAgICAgc3VwcG9ydCBmb3IgZGV0YWlscy4KLSAgICAgICAgPExJPjxBIEhSRUY9Imh0dHA6Ly93d3cuc2dpLmNvbS8iPlNHSSBJUklYPC9BPiBjYW4gYmUgcGF0Y2hlZCB0bwotICAgICAgICAgICAgc3VwcG9ydCBhIHRpbWVvdXQuICBGb3IgSVJJWCA1LjMsIDYuMiwgYW5kIDYuMywKLSAgICAgICAgICAgIHVzZSBwYXRjaGVzIDE2NTQsIDE3MDMgYW5kIDE3NzggcmVzcGVjdGl2ZWx5LiAgSWYgeW91Ci0gICAgICAgICAgICBoYXZlIHRyb3VibGUgbG9jYXRpbmcgdGhlc2UgcGF0Y2hlcywgcGxlYXNlIGNvbnRhY3QgeW91cgotICAgICAgICAgICAgU0dJIHN1cHBvcnQgY2hhbm5lbCBmb3IgaGVscC4KLSAgICAgICAgPExJPjxBIEhSRUY9Imh0dHA6Ly93d3cubmNyLmNvbS8iPk5DUidzIE1QIFJBUyBVbml4PC9BPiAyLnh4IGFuZAotICAgICAgICAgICAgMy54eCBib3RoIGhhdmUgRklOX1dBSVRfMiB0aW1lb3V0cy4gIEluIDIueHggaXQgaXMgbm9uLXR1bmFibGUKLSAgICAgICAgICAgIGF0IDYwMCBzZWNvbmRzLCB3aGlsZSBpbiAzLnh4IGl0IGRlZmF1bHRzIHRvIDYwMCBzZWNvbmRzIGFuZAotICAgICAgICAgICAgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgdHVuYWJsZSAibWF4IGtlZXAgYWxpdmUgcHJvYmVzIgotICAgICAgICAgICAgKGRlZmF1bHQgb2YgOCkgbXVsdGlwbGllZCBieSB0aGUgImtlZXAgYWxpdmUgaW50ZXJ2YWwiIChkZWZhdWx0Ci0gICAgICAgICAgICA3NSBzZWNvbmRzKS4KLSAgICAgICAgPExJPjxBIEhSRUY9Imh0dHA6Ly93d3cuc2VxdWVudC5jb20iPlNlcXVlbnQncyBwdHgvVENQL0lQIGZvcgotICAgICAgICAgICAgRFlOSVgvcHR4PC9BPiBoYXMgaGFkIGEgRklOX1dBSVRfMiB0aW1lb3V0IHNpbmNlIGFyb3VuZAotICAgICAgICAgICAgcmVsZWFzZSA0LjEgaW4gbWlkLTE5OTQuCi08L1VMPgotPFA+Ci1UaGUgZm9sbG93aW5nIHN5c3RlbXMgYXJlIGtub3duIHRvIG5vdCBoYXZlIGEgdGltZW91dDoKLTxQPgotPFVMPgotICAgICAgICA8TEk+PEEgSFJFRj0iaHR0cDovL3d3dy5zdW4uY29tLyI+U3VuT1MgNC54PC9BPiBkb2VzIG5vdCBhbmQKLSAgICAgICAgICAgIGFsbW9zdCBjZXJ0YWlubHkgbmV2ZXIgd2lsbCBoYXZlIG9uZSBiZWNhdXNlIGl0IGFzIGF0IHRoZQotICAgICAgICAgICAgdmVyeSBlbmQgb2YgaXRzIGRldmVsb3BtZW50IGN5Y2xlIGZvciBTdW4uICBJZiB5b3UgaGF2ZSBrZXJuZWwKLSAgICAgICAgICAgIHNvdXJjZSBzaG91bGQgYmUgZWFzeSB0byBwYXRjaC4KLTwvVUw+Ci08UD4KLVRoZXJlIGlzIGEKLTxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2NvbnRyaWIvcGF0Y2hlcy8xLjIvZmluX3dhaXRfMi5wYXRjaCIKLT5wYXRjaCBhdmFpbGFibGU8L0E+IGZvciBhZGRpbmcgYSB0aW1lb3V0IHRvIHRoZSBGSU5fV0FJVF8yIHN0YXRlOyBpdAotd2FzIG9yaWdpbmFsbHkgaW50ZW5kZWQgZm9yIEJTRC9PUywgYnV0IHNob3VsZCBiZSBhZGFwdGFibGUgdG8gbW9zdAotc3lzdGVtcyB1c2luZyBCU0QgbmV0d29ya2luZyBjb2RlLiAgWW91IG5lZWQga2VybmVsIHNvdXJjZSBjb2RlIHRvIGJlCi1hYmxlIHRvIHVzZSBpdC4gIElmIHlvdSBkbyBhZGFwdCBpdCB0byB3b3JrIGZvciBhbnkgb3RoZXIgc3lzdGVtcywKLXBsZWFzZSBkcm9wIG1lIGEgbm90ZSBhdCA8QSBIUkVGPSJtYWlsdG86bWFyY0BhcGFjaGUub3JnIj5tYXJjQGFwYWNoZS5vcmc8L0E+LgotPFA+Ci08SDM+Q29tcGlsZSB3aXRob3V0IHVzaW5nIDxDT0RFPmxpbmdlcmluZ19jbG9zZSgpPC9DT0RFPjwvSDM+Ci0KLUl0IGlzIHBvc3NpYmxlIHRvIGNvbXBpbGUgQXBhY2hlIDEuMiB3aXRob3V0IHVzaW5nIHRoZQotPENPREU+bGluZ2VyaW5nX2Nsb3NlKCk8L0NPREU+IGZ1bmN0aW9uLiAgVGhpcyB3aWxsIHJlc3VsdCBpbiB0aGF0Ci1zZWN0aW9uIG9mIGNvZGUgYmVpbmcgc2ltaWxhciB0byB0aGF0IHdoaWNoIHdhcyBpbiAxLjEuICBJZiB5b3UgZG8KLXRoaXMsIGJlIGF3YXJlIHRoYXQgaXQgY2FuIGNhdXNlIHByb2JsZW1zIHdpdGggUFVUcywgUE9TVHMgYW5kCi1wZXJzaXN0ZW50IGNvbm5lY3Rpb25zLCBlc3BlY2lhbGx5IGlmIHRoZSBjbGllbnQgdXNlcyBwaXBlbGluaW5nLgotVGhhdCBzYWlkLCBpdCBpcyBubyB3b3JzZSB0aGFuIG9uIDEuMSwgYW5kIHdlIHVuZGVyc3RhbmQgdGhhdCBrZWVwaW5nIHlvdXIKLXNlcnZlciBydW5uaW5nIGlzIHF1aXRlIGltcG9ydGFudC48UD4KLQotVG8gY29tcGlsZSB3aXRob3V0IHRoZSA8Q09ERT5saW5nZXJpbmdfY2xvc2UoKTwvQ09ERT4gZnVuY3Rpb24sIGFkZAotPENPREU+LUROT19MSU5HQ0xPU0U8L0NPREU+IHRvIHRoZSBlbmQgb2YgdGhlCi08Q09ERT5FWFRSQV9DRkxBR1M8L0NPREU+IGxpbmUgaW4geW91ciA8Q09ERT5Db25maWd1cmF0aW9uPC9DT0RFPiBmaWxlLAotcmVydW4gPENPREU+Q29uZmlndXJlPC9DT0RFPiBhbmQgcmVidWlsZCB0aGUgc2VydmVyLgotPFA+Ci08SDM+VXNlIDxDT0RFPlNPX0xJTkdFUjwvQ09ERT4gYXMgYW4gYWx0ZXJuYXRpdmUgdG8KLTxDT0RFPmxpbmdlcmluZ19jbG9zZSgpPC9DT0RFPjwvSDM+Ci0KLU9uIG1vc3Qgc3lzdGVtcywgdGhlcmUgaXMgYW4gb3B0aW9uIGNhbGxlZCA8Q09ERT5TT19MSU5HRVI8L0NPREU+IHRoYXQKLWNhbiBiZSBzZXQgd2l0aCA8Q09ERT5zZXRzb2Nrb3B0KDIpPC9DT0RFPi4gIEl0IGRvZXMgc29tZXRoaW5nIHZlcnkKLXNpbWlsYXIgdG8gPENPREU+bGluZ2VyaW5nX2Nsb3NlKCk8L0NPREU+LCBleGNlcHQgdGhhdCBpdCBpcyBicm9rZW4KLW9uIG1hbnkgc3lzdGVtcyBzbyB0aGF0IGl0IGNhdXNlcyBmYXIgbW9yZSBwcm9ibGVtcyB0aGFuCi08Q09ERT5saW5nZXJpbmdfY2xvc2U8L0NPREU+LiAgT24gc29tZSBzeXN0ZW1zLCBpdCBjb3VsZCBwb3NzaWJseSB3b3JrCi1iZXR0ZXIgc28gaXQgbWF5IGJlIHdvcnRoIGEgdHJ5IGlmIHlvdSBoYXZlIG5vIG90aGVyIGFsdGVybmF0aXZlcy4gPFA+Ci0KLVRvIHRyeSBpdCwgYWRkIDxDT0RFPi1EVVNFX1NPX0xJTkdFUiAtRE5PX0xJTkdDTE9TRTwvQ09ERT4gIHRvIHRoZSBlbmQgb2YgdGhlCi08Q09ERT5FWFRSQV9DRkxBR1M8L0NPREU+IGxpbmUgaW4geW91ciA8Q09ERT5Db25maWd1cmF0aW9uPC9DT0RFPgotZmlsZSwgcmVydW4gPENPREU+Q29uZmlndXJlPC9DT0RFPiBhbmQgcmVidWlsZCB0aGUgc2VydmVyLiAgPFA+Ci0KLTxTVFJPTkc+Tk9URTo8L1NUUk9ORz4gQXR0ZW1wdGluZyB0byB1c2UgPENPREU+U09fTElOR0VSPC9DT0RFPiBhbmQKLTxDT0RFPmxpbmdlcmluZ19jbG9zZSgpPC9DT0RFPiBhdCB0aGUgc2FtZSB0aW1lIGlzIHZlcnkgbGlrZWx5IHRvIGRvCi12ZXJ5IGJhZCB0aGluZ3MsIHNvIGRvbid0LjxQPgotCi08SDM+SW5jcmVhc2UgdGhlIGFtb3VudCBvZiBtZW1vcnkgdXNlZCBmb3Igc3RvcmluZyBjb25uZWN0aW9uIHN0YXRlPC9IMz4KLTxETD4KLTxEVD5CU0QgYmFzZWQgbmV0d29ya2luZyBjb2RlOgotPEREPkJTRCBzdG9yZXMgbmV0d29yayBkYXRhLCBzdWNoIGFzIGNvbm5lY3Rpb24gc3RhdGVzLAotaW4gc29tZXRoaW5nIGNhbGxlZCBhbiBtYnVmLiAgV2hlbiB5b3UgZ2V0IHNvIG1hbnkgY29ubmVjdGlvbnMKLXRoYXQgdGhlIGtlcm5lbCBkb2VzIG5vdCBoYXZlIGVub3VnaCBtYnVmcyB0byBwdXQgdGhlbSBhbGwgaW4sIHlvdXIKLWtlcm5lbCB3aWxsIGxpa2VseSBjcmFzaC4gIFlvdSBjYW4gcmVkdWNlIHRoZSBlZmZlY3RzIG9mIHRoZSBwcm9ibGVtCi1ieSBpbmNyZWFzaW5nIHRoZSBudW1iZXIgb2YgbWJ1ZnMgdGhhdCBhcmUgYXZhaWxhYmxlOyB0aGlzIHdpbGwgbm90Ci1wcmV2ZW50IHRoZSBwcm9ibGVtLCBpdCB3aWxsIGp1c3QgbWFrZSB0aGUgc2VydmVyIGdvIGxvbmdlciBiZWZvcmUKLWNyYXNoaW5nLjxQPgotCi1UaGUgZXhhY3Qgd2F5IHRvIGluY3JlYXNlIHRoZW0gbWF5IGRlcGVuZCBvbiB5b3VyIE9TOyBsb29rCi1mb3Igc29tZSByZWZlcmVuY2UgdG8gdGhlIG51bWJlciBvZiAibWJ1ZnMiIG9yICJtYnVmIGNsdXN0ZXJzIi4gIE9uCi1tYW55IHN5c3RlbXMsIHRoaXMgY2FuIGJlIGRvbmUgYnkgYWRkaW5nIHRoZSBsaW5lCi08Q09ERT5OTUJDTFVTVEVSUz0ibiI8L0NPREU+LCB3aGVyZSA8Q09ERT5uPC9DT0RFPiBpcyB0aGUgbnVtYmVyIG9mCi1tYnVmIGNsdXN0ZXJzIHlvdSB3YW50IHRvIHlvdXIga2VybmVsIGNvbmZpZyBmaWxlIGFuZCByZWJ1aWxkaW5nIHlvdXIKLWtlcm5lbC48UD4KLTwvREw+Ci0KLTxIMz5EaXNhYmxlIEtlZXBBbGl2ZTwvSDM+Ci08UD5JZiB5b3UgYXJlIHVuYWJsZSB0byBkbyBhbnkgb2YgdGhlIGFib3ZlIHRoZW4geW91IHNob3VsZCwgYXMgYSBsYXN0Ci1yZXNvcnQsIGRpc2FibGUgS2VlcEFsaXZlLiAgRWRpdCB5b3VyIGh0dHBkLmNvbmYgYW5kIGNoYW5nZSAiS2VlcEFsaXZlIE9uIgotdG8gIktlZXBBbGl2ZSBPZmYiLgotCi08SDI+PExJPkZlZWRiYWNrPC9IMj4KLQotSWYgeW91IGhhdmUgYW55IGluZm9ybWF0aW9uIHRvIGFkZCB0byB0aGlzIHBhZ2UsIHBsZWFzZSBjb250YWN0IG1lIGF0Ci08QSBIUkVGPSJtYWlsdG86bWFyY0BhcGFjaGUub3JnIj5tYXJjQGFwYWNoZS5vcmc8L0E+LjxQPgotCi08SDI+PEEgTkFNRT0iYXBwZW5kaXgiPjxMST5BcHBlbmRpeDwvQT48L0gyPgotPFA+Ci1CZWxvdyBpcyBhIG1lc3NhZ2UgZnJvbSBSb3kgRmllbGRpbmcsIG9uZSBvZiB0aGUgYXV0aG9ycyBvZiBIVFRQLzEuMS4KLQotPEgzPldoeSB0aGUgbGluZ2VyaW5nIGNsb3NlIGZ1bmN0aW9uYWxpdHkgaXMgbmVjZXNzYXJ5IHdpdGggSFRUUDwvSDM+Ci0KLVRoZSBuZWVkIGZvciBhIHNlcnZlciB0byBsaW5nZXIgb24gYSBzb2NrZXQgYWZ0ZXIgYSBjbG9zZSBpcyBub3RlZCBhIGNvdXBsZQotdGltZXMgaW4gdGhlIEhUVFAgc3BlY3MsIGJ1dCBub3QgZXhwbGFpbmVkLiAgVGhpcyBleHBsYW5hdGlvbiBpcyBiYXNlZCBvbgotZGlzY3Vzc2lvbnMgYmV0d2VlbiBteXNlbGYsIEhlbnJpayBGcnlzdHlrLCBSb2JlcnQgUy4gVGhhdSwgRGF2ZSBSYWdnZXR0LAotYW5kIEpvaG4gQy4gTWFsbGVyeSBpbiB0aGUgaGFsbHdheXMgb2YgTUlUIHdoaWxlIEkgd2FzIGF0IFczQy48UD4KLQotSWYgYSBzZXJ2ZXIgY2xvc2VzIHRoZSBpbnB1dCBzaWRlIG9mIHRoZSBjb25uZWN0aW9uIHdoaWxlIHRoZSBjbGllbnQKLWlzIHNlbmRpbmcgZGF0YSAob3IgaXMgcGxhbm5pbmcgdG8gc2VuZCBkYXRhKSwgdGhlbiB0aGUgc2VydmVyJ3MgVENQCi1zdGFjayB3aWxsIHNpZ25hbCBhbiBSU1QgKHJlc2V0KSBiYWNrIHRvIHRoZSBjbGllbnQuICBVcG9uCi1yZWNlaXB0IG9mIHRoZSBSU1QsIHRoZSBjbGllbnQgd2lsbCBmbHVzaCBpdHMgb3duIGluY29taW5nIFRDUCBidWZmZXIKLWJhY2sgdG8gdGhlIHVuLUFDS2VkIHBhY2tldCBpbmRpY2F0ZWQgYnkgdGhlIFJTVCBwYWNrZXQgYXJndW1lbnQuCi1JZiB0aGUgc2VydmVyIGhhcyBzZW50IGEgbWVzc2FnZSwgdXN1YWxseSBhbiBlcnJvciByZXNwb25zZSwgdG8gdGhlCi1jbGllbnQganVzdCBiZWZvcmUgdGhlIGNsb3NlLCBhbmQgdGhlIGNsaWVudCByZWNlaXZlcyB0aGUgUlNUIHBhY2tldAotYmVmb3JlIGl0cyBhcHBsaWNhdGlvbiBjb2RlIGhhcyByZWFkIHRoZSBlcnJvciBtZXNzYWdlIGZyb20gaXRzIGluY29taW5nCi1UQ1AgYnVmZmVyIGFuZCBiZWZvcmUgdGhlIHNlcnZlciBoYXMgcmVjZWl2ZWQgdGhlIEFDSyBzZW50IGJ5IHRoZSBjbGllbnQKLXVwb24gcmVjZWlwdCBvZiB0aGF0IGJ1ZmZlciwgdGhlbiB0aGUgUlNUIHdpbGwgZmx1c2ggdGhlIGVycm9yIG1lc3NhZ2UKLWJlZm9yZSB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIGhhcyBhIGNoYW5jZSB0byBzZWUgaXQuIFRoZSByZXN1bHQgaXMKLXRoYXQgdGhlIGNsaWVudCBpcyBsZWZ0IHRoaW5raW5nIHRoYXQgdGhlIGNvbm5lY3Rpb24gZmFpbGVkIGZvciBubwotYXBwYXJlbnQgcmVhc29uLjxQPgotCi1UaGVyZSBhcmUgdHdvIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggdGhpcyBpcyBsaWtlbHkgdG8gb2NjdXI6Ci08T0w+Ci08TEk+c2VuZGluZyBQT1NUIG9yIFBVVCBkYXRhIHdpdGhvdXQgcHJvcGVyIGF1dGhvcml6YXRpb24KLTxMST5zZW5kaW5nIG11bHRpcGxlIHJlcXVlc3RzIGJlZm9yZSBlYWNoIHJlc3BvbnNlIChwaXBlbGluaW5nKQotICAgIGFuZCBvbmUgb2YgdGhlIG1pZGRsZSByZXF1ZXN0cyByZXN1bHRpbmcgaW4gYW4gZXJyb3Igb3IKLSAgICBvdGhlciBicmVhay10aGUtY29ubmVjdGlvbiByZXN1bHQuCi08L09MPgotPFA+Ci1UaGUgc29sdXRpb24gaW4gYWxsIGNhc2VzIGlzIHRvIHNlbmQgdGhlIHJlc3BvbnNlLCBjbG9zZSBvbmx5IHRoZQotd3JpdGUgaGFsZiBvZiB0aGUgY29ubmVjdGlvbiAod2hhdCBzaHV0ZG93biBpcyBzdXBwb3NlZCB0byBkbyksIGFuZAotY29udGludWUgcmVhZGluZyBvbiB0aGUgc29ja2V0IHVudGlsIGl0IGlzIGVpdGhlciBjbG9zZWQgYnkgdGhlCi1jbGllbnQgKHNpZ25pZnlpbmcgaXQgaGFzIGZpbmFsbHkgcmVhZCB0aGUgcmVzcG9uc2UpIG9yIGEgdGltZW91dCBvY2N1cnMuCi1UaGF0IGlzIHdoYXQgdGhlIGtlcm5lbCBpcyBzdXBwb3NlZCB0byBkbyBpZiBTT19MSU5HRVIgaXMgc2V0LgotVW5mb3J0dW5hdGVseSwgU09fTElOR0VSIGhhcyBubyBlZmZlY3Qgb24gc29tZSBzeXN0ZW1zOyBvbiBzb21lIG90aGVyCi1zeXN0ZW1zLCBpdCBkb2VzIG5vdCBoYXZlIGl0cyBvd24gdGltZW91dCBhbmQgdGh1cyB0aGUgVENQIG1lbW9yeQotc2VnbWVudHMganVzdCBwaWxlLXVwIHVudGlsIHRoZSBuZXh0IHJlYm9vdCAocGxhbm5lZCBvciBub3QpLjxQPgotCi1QbGVhc2Ugbm90ZSB0aGF0IHNpbXBseSByZW1vdmluZyB0aGUgbGluZ2VyIGNvZGUgd2lsbCBub3Qgc29sdmUgdGhlCi1wcm9ibGVtIC0tIGl0IG9ubHkgbW92ZXMgaXQgdG8gYSBkaWZmZXJlbnQgYW5kIG11Y2ggaGFyZGVyIG9uZSB0byBkZXRlY3QuCi08L09MPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21pc2MvZm9vdGVyLmh0bWwgYi9kb2NzL21hbnVhbC9taXNjL2Zvb3Rlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmU3NDVkLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21pc2MvZm9vdGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTxIUj4KLQotPEgzIEFMSUdOPSJDRU5URVIiPgotIEFwYWNoZSBIVFRQIFNlcnZlciBWZXJzaW9uIDEuMwotPC9IMz4KLQotPEEgSFJFRj0iLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvaW5kZXguZ2lmIiBBTFQ9IkluZGV4Ij48L0E+Ci08QSBIUkVGPSIuLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvaG9tZS5naWYiIEFMVD0iSG9tZSI+PC9BPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbWlzYy9oZWFkZXIuaHRtbCBiL2RvY3MvbWFudWFsL21pc2MvaGVhZGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NjIzMDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbWlzYy9oZWFkZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPERJViBBTElHTj0iQ0VOVEVSIj4KLSA8SU1HIFNSQz0iLi4vaW1hZ2VzL3N1Yi5naWYiIEFMVD0iW0FQQUNIRSBET0NVTUVOVEFUSU9OXSI+Ci0gPEgzPgotICBBcGFjaGUgSFRUUCBTZXJ2ZXIgVmVyc2lvbiAxLjMKLSA8L0gzPgotPC9ESVY+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9taXNjL2hvd3RvLmh0bWwgYi9kb2NzL21hbnVhbC9taXNjL2hvd3RvLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTkyYTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbWlzYy9ob3d0by5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08TUVUQSBOQU1FPSJkZXNjcmlwdGlvbiIKLSBDT05URU5UPSJTb21lICdob3cgdG8nIHRpcHMgZm9yIHRoZSBBcGFjaGUgaHR0cGQgc2VydmVyIj4KLTxNRVRBIE5BTUU9ImtleXdvcmRzIiBDT05URU5UPSJhcGFjaGUscmVkaXJlY3Qscm9ib3RzLHJvdGF0ZSxsb2dmaWxlcyI+Ci08VElUTEU+QXBhY2hlIEhPV1RPIGRvY3VtZW50YXRpb248L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5BcGFjaGUgSE9XVE8gZG9jdW1lbnRhdGlvbjwvSDE+Ci0KLUhvdyB0bzoKLTxVTD4KLTxMST48QSBIUkVGPSIjcmVkaXJlY3QiPnJlZGlyZWN0IGFuIGVudGlyZSBzZXJ2ZXIgb3IgZGlyZWN0b3J5IHRvIGEgc2luZ2xlCi0gICAgVVJMPC9BPgotPExJPjxBIEhSRUY9IiNsb2dyZXNldCI+cmVzZXQgeW91ciBsb2cgZmlsZXM8L0E+Ci08TEk+PEEgSFJFRj0iI3N0b3Byb2IiPnN0b3AvcmVzdHJpY3Qgcm9ib3RzPC9BPgotPExJPjxBIEhSRUY9IiNwcm94eXNzbCI+cHJveHkgU1NMIHJlcXVlc3RzIDxFTT50aHJvdWdoPC9FTT4geW91ciBub24tU1NMCi0gICAgc2VydmVyPC9BPgotPC9VTD4KLQotPEhSPgotPEgyPjxBIE5BTUU9InJlZGlyZWN0Ij5Ib3cgdG8gcmVkaXJlY3QgYW4gZW50aXJlIHNlcnZlciBvciBkaXJlY3RvcnkgdG8gYQotc2luZ2xlIFVSTDwvQT48L0gyPgotCi08UD5UaGVyZSBhcmUgdHdvIGNoaWVmIHdheXMgdG8gcmVkaXJlY3QgYWxsIHJlcXVlc3RzIGZvciBhbiBlbnRpcmUKLXNlcnZlciB0byBhIHNpbmdsZSBsb2NhdGlvbjogb25lIHdoaWNoIHJlcXVpcmVzIHRoZSB1c2Ugb2YKLTxDT0RFPm1vZF9yZXdyaXRlPC9DT0RFPiwgYW5kIGFub3RoZXIgd2hpY2ggdXNlcyBhIENHSSBzY3JpcHQuCi0KLTxQPkZpcnN0OiBpZiBhbGwgeW91IG5lZWQgdG8gZG8gaXMgbWlncmF0ZSBhIHNlcnZlciBmcm9tIG9uZSBuYW1lIHRvCi1hbm90aGVyLCBzaW1wbHkgdXNlIHRoZSA8Q09ERT5SZWRpcmVjdDwvQ09ERT4gZGlyZWN0aXZlLCBhcyBzdXBwbGllZAotYnkgPENPREU+bW9kX2FsaWFzPC9DT0RFPjoKLQotPEJMT0NLUVVPVEU+PFBSRT4KLSAgUmVkaXJlY3QgLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvCi08L1BSRT48L0JMT0NLUVVPVEU+Ci0KLTxQPlNpbmNlIDxDT0RFPlJlZGlyZWN0PC9DT0RFPiB3aWxsIGZvcndhcmQgYWxvbmcgdGhlIGNvbXBsZXRlIHBhdGgsCi1ob3dldmVyLCBpdCBtYXkgbm90IGJlIGFwcHJvcHJpYXRlIC0gZm9yIGV4YW1wbGUsIHdoZW4gdGhlIGRpcmVjdG9yeQotc3RydWN0dXJlIGhhcyBjaGFuZ2VkIGFmdGVyIHRoZSBtb3ZlLCBhbmQgeW91IHNpbXBseSB3YW50IHRvIGRpcmVjdCBwZW9wbGUKLXRvIHRoZSBob21lIHBhZ2UuCi0KLTxQPlRoZSBiZXN0IG9wdGlvbiBpcyB0byB1c2UgdGhlIHN0YW5kYXJkIEFwYWNoZSBtb2R1bGUKLTxDT0RFPm1vZF9yZXdyaXRlPC9DT0RFPi4KLUlmIHRoYXQgbW9kdWxlIGlzIGNvbXBpbGVkIGluLCB0aGUgZm9sbG93aW5nIGxpbmVzCi0KLTxCTE9DS1FVT1RFPjxQUkU+UmV3cml0ZUVuZ2luZSBPbgotUmV3cml0ZVJ1bGUgLy4qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8gW1JdCi08L1BSRT48L0JMT0NLUVVPVEU+Ci0KLVRoaXMgd2lsbCBzZW5kIGFuIEhUVFAgMzAyIFJlZGlyZWN0IGJhY2sgdG8gdGhlIGNsaWVudCwgYW5kIG5vIG1hdHRlcgotd2hhdCB0aGV5IGdhdmUgaW4gdGhlIG9yaWdpbmFsIFVSTCwgdGhleSdsbCBiZSBzZW50IHRvCi0iaHR0cDovL3d3dy5hcGFjaGUub3JnIi4KLQotVGhlIHNlY29uZCBvcHRpb24gaXMgdG8gc2V0IHVwIGEgPENPREU+U2NyaXB0QWxpYXM8L0NPREU+IHBvaW50aW5nIHRvCi1hIDxTVFJPTkc+Q0dJIHNjcmlwdDwvU1RST05HPiB3aGljaCBvdXRwdXRzIGEgMzAxIG9yIDMwMiBzdGF0dXMgYW5kIHRoZQotbG9jYXRpb24KLW9mIHRoZSBvdGhlciBzZXJ2ZXIuPC9QPgotCi08UD5CeSB1c2luZyBhIDxTVFJPTkc+Q0dJIHNjcmlwdDwvU1RST05HPiB5b3UgY2FuIGludGVyY2VwdCB2YXJpb3VzIHJlcXVlc3RzCi1hbmQKLXRyZWF0IHRoZW0gc3BlY2lhbGx5LCA8RU0+ZS5nLjwvRU0+LCB5b3UgbWlnaHQgd2FudCB0byBpbnRlcmNlcHQKLTxTVFJPTkc+UE9TVDwvU1RST05HPgotcmVxdWVzdHMsIHNvIHRoYXQgdGhlIGNsaWVudCBpc24ndCByZWRpcmVjdGVkIHRvIGEgc2NyaXB0IG9uIHRoZSBvdGhlcgotc2VydmVyIHdoaWNoIGV4cGVjdHMgUE9TVCBpbmZvcm1hdGlvbiAoYSByZWRpcmVjdCB3aWxsIGxvc2UgdGhlIFBPU1QKLWluZm9ybWF0aW9uLikgWW91IG1pZ2h0IGFsc28gd2FudCB0byB1c2UgYSBDR0kgc2NyaXB0IGlmIHlvdSBkb24ndAotd2FudCB0byBjb21waWxlIG1vZF9yZXdyaXRlIGludG8geW91ciBzZXJ2ZXIuCi0KLTxQPkhlcmUncyBob3cgdG8gcmVkaXJlY3QgYWxsIHJlcXVlc3RzIHRvIGEgc2NyaXB0Li4uIEluIHRoZSBzZXJ2ZXIKLWNvbmZpZ3VyYXRpb24gZmlsZSwKLTxCTE9DS1FVT1RFPjxQUkU+U2NyaXB0QWxpYXMgLyAvdXNyL2xvY2FsL2h0dHBkL2NnaS1iaW4vcmVkaXJlY3Rfc2NyaXB0LzwvUFJFPgotPC9CTE9DS1FVT1RFPgotCi1hbmQgaGVyZSdzIGEgc2ltcGxlIHBlcmwgc2NyaXB0IHRvIHJlZGlyZWN0IHJlcXVlc3RzOgotCi08QkxPQ0tRVU9URT48UFJFPgotIyEvdXNyL2xvY2FsL2Jpbi9wZXJsCi0KLXByaW50ICJTdGF0dXM6IDMwMiBNb3ZlZCBUZW1wb3JhcmlseVxyXG4iIC4KLSAgICAgICJMb2NhdGlvbjogaHR0cDovL3d3dy5zb21lLndoZXJlLmVsc2UuY29tL1xyXG4iIC4KLSAgICAgICJcclxuIjsKLQotPC9QUkU+PC9CTE9DS1FVT1RFPjwvUD4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0ibG9ncmVzZXQiPkhvdyB0byByZXNldCB5b3VyIGxvZyBmaWxlczwvQT48L0gyPgotCi08UD5Tb29uZXIgb3IgbGF0ZXIsIHlvdSdsbCB3YW50IHRvIHJlc2V0IHlvdXIgbG9nIGZpbGVzIChhY2Nlc3NfbG9nIGFuZAotZXJyb3JfbG9nKSBiZWNhdXNlIHRoZXkgYXJlIHRvbyBiaWcsIG9yIGZ1bGwgb2Ygb2xkIGluZm9ybWF0aW9uIHlvdSBkb24ndAotbmVlZC48L1A+Ci0KLTxQPjxDT0RFPmFjY2Vzcy5sb2c8L0NPREU+IHR5cGljYWxseSBncm93cyBieSAxTWIgZm9yIGVhY2ggMTAsMDAwIHJlcXVlc3RzLjwvUD4KLQotPFA+TW9zdCBwZW9wbGUncyBmaXJzdCBhdHRlbXB0IGF0IHJlcGxhY2luZyB0aGUgbG9nZmlsZSBpcyB0byBqdXN0IG1vdmUgdGhlCi1sb2dmaWxlIG9yIHJlbW92ZSB0aGUgbG9nZmlsZS4gVGhpcyBkb2Vzbid0IHdvcmsuPC9QPgotCi08UD5BcGFjaGUgd2lsbCBjb250aW51ZSB3cml0aW5nIHRvIHRoZSBsb2dmaWxlIGF0IHRoZSBzYW1lIG9mZnNldCBhcyBiZWZvcmUgdGhlCi1sb2dmaWxlIG1vdmVkLiBUaGlzIHJlc3VsdHMgaW4gYSBuZXcgbG9nZmlsZSBiZWluZyBjcmVhdGVkIHdoaWNoIGlzIGp1c3QKLWFzIGJpZyBhcyB0aGUgb2xkIG9uZSwgYnV0IGl0IG5vdyBjb250YWlucyB0aG91c2FuZHMgKG9yIG1pbGxpb25zKSBvZiBudWxsCi1jaGFyYWN0ZXJzLjwvUD4KLQotPFA+VGhlIGNvcnJlY3QgcHJvY2VkdXJlIGlzIHRvIG1vdmUgdGhlIGxvZ2ZpbGUsIHRoZW4gc2lnbmFsIEFwYWNoZSB0byB0ZWxsCi1pdCB0byByZW9wZW4gdGhlIGxvZ2ZpbGVzLjwvUD4KLQotPFA+QXBhY2hlIGlzIHNpZ25hbGVkIHVzaW5nIHRoZSA8U1RST05HPlNJR0hVUDwvU1RST05HPiAoLTEpIHNpZ25hbC4KLTxFTT5lLmcuPC9FTT4KLTxCTE9DS1FVT1RFPjxDT0RFPgotbXYgYWNjZXNzX2xvZyBhY2Nlc3NfbG9nLm9sZDxCUj4KLWtpbGwgLTEgYGNhdCBodHRwZC5waWRgCi08L0NPREU+PC9CTE9DS1FVT1RFPgotPC9QPgotCi08UD5Ob3RlOiA8Q09ERT5odHRwZC5waWQ8L0NPREU+IGlzIGEgZmlsZSBjb250YWluaW5nIHRoZQotPFNUUk9ORz5wPC9TVFJPTkc+cm9jZXNzIDxTVFJPTkc+aWQ8L1NUUk9ORz4KLW9mIHRoZSBBcGFjaGUgaHR0cGQgZGFlbW9uLCBBcGFjaGUgc2F2ZXMgdGhpcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGxvZwotZmlsZXMuPC9QPgotCi08UD5NYW55IHBlb3BsZSB1c2UgdGhpcyBtZXRob2QgdG8gcmVwbGFjZSAoYW5kIGJhY2t1cCkgdGhlaXIgbG9nZmlsZXMgb24gYQotbmlnaHRseSBvciB3ZWVrbHkgYmFzaXMuPC9QPgotPEhSPgotCi08SDI+PEEgTkFNRT0ic3RvcHJvYiI+SG93IHRvIHN0b3Agb3IgcmVzdHJpY3Qgcm9ib3RzPC9BPjwvSDI+Ci0KLTxQPkV2ZXIgd29uZGVyZWQgd2h5IHNvIG1hbnkgY2xpZW50cyBhcmUgaW50ZXJlc3RlZCBpbiBhIGZpbGUgY2FsbGVkCi08Q09ERT5yb2JvdHMudHh0PC9DT0RFPiB3aGljaCB5b3UgZG9uJ3QgaGF2ZSwgYW5kIG5ldmVyIGRpZCBoYXZlPzwvUD4KLQotPFA+VGhlc2UgY2xpZW50cyBhcmUgY2FsbGVkIDxTVFJPTkc+cm9ib3RzPC9TVFJPTkc+IChhbHNvIGtub3duIGFzIGNyYXdsZXJzLAotc3BpZGVycyBhbmQgb3RoZXIgY3V0ZSBuYW1lKSAtIHNwZWNpYWwgYXV0b21hdGVkIGNsaWVudHMgd2hpY2gKLXdhbmRlciBhcm91bmQgdGhlIHdlYiBsb29raW5nIGZvciBpbnRlcmVzdGluZyByZXNvdXJjZXMuPC9QPgotCi08UD5Nb3N0IHJvYm90cyBhcmUgdXNlZCB0byBnZW5lcmF0ZSBzb21lIGtpbmQgb2YgPEVNPndlYiBpbmRleDwvRU0+IHdoaWNoCi1pcyB0aGVuIHVzZWQgYnkgYSA8RU0+c2VhcmNoIGVuZ2luZTwvRU0+IHRvIGhlbHAgbG9jYXRlIGluZm9ybWF0aW9uLjwvUD4KLQotPFA+PENPREU+cm9ib3RzLnR4dDwvQ09ERT4gcHJvdmlkZXMgYSBtZWFucyB0byByZXF1ZXN0IHRoYXQgcm9ib3RzIGxpbWl0IHRoZWlyCi1hY3Rpdml0aWVzIGF0IHRoZSBzaXRlLCBvciBtb3JlIG9mdGVuIHRoYW4gbm90LCB0byBsZWF2ZSB0aGUgc2l0ZSBhbG9uZS48L1A+Ci0KLTxQPldoZW4gdGhlIGZpcnN0IHJvYm90cyB3ZXJlIGRldmVsb3BlZCwgdGhleSBoYWQgYSBiYWQgcmVwdXRhdGlvbiBmb3IKLXNlbmRpbmcgaHVuZHJlZHMvdGhvdXNhbmRzIG9mIHJlcXVlc3RzIHRvIGVhY2ggc2l0ZSwgb2Z0ZW4gcmVzdWx0aW5nCi1pbiB0aGUgc2l0ZSBiZWluZyBvdmVybG9hZGVkLiBUaGluZ3MgaGF2ZSBpbXByb3ZlZCBkcmFtYXRpY2FsbHkgc2luY2UKLXRoZW4sIHRoYW5rcyB0byA8QQotSFJFRj0iaHR0cDovL2luZm8ud2ViY3Jhd2xlci5jb20vbWFrL3Byb2plY3RzL3JvYm90cy9ndWlkZWxpbmVzLmh0bWwiPgotR3VpZGVsaW5lcyBmb3IgUm9ib3QgV3JpdGVyczwvQT4sIGJ1dCBldmVuIHNvLCBzb21lIHJvYm90cyBtYXkgZXhoaWJpdAotdW5mcmllbmRseSBiZWhhdmlvciB3aGljaCB0aGUgd2VibWFzdGVyIGlzbid0IHdpbGxpbmcgdG8gdG9sZXJhdGUsIGFuZAotd2lsbCB3YW50IHRvIHN0b3AuPC9QPgotCi08UD5Bbm90aGVyIHJlYXNvbiBzb21lIHdlYm1hc3RlcnMgd2FudCB0byBibG9jayBhY2Nlc3MgdG8gcm9ib3RzLCBpcyB0bwotc3RvcCB0aGVtIGluZGV4aW5nIGR5bmFtaWMgaW5mb3JtYXRpb24uIE1hbnkgc2VhcmNoIGVuZ2luZXMgd2lsbCB1c2UgdGhlCi1kYXRhIGNvbGxlY3RlZCBmcm9tIHlvdXIgcGFnZXMgZm9yIG1vbnRocyB0byBjb21lIC0gbm90IG11Y2ggdXNlIGlmIHlvdXIKLXNlcnZpbmcgc3RvY2sgcXVvdGVzLCBuZXdzLCB3ZWF0aGVyIHJlcG9ydHMgb3IgYW55dGhpbmcgZWxzZSB0aGF0IHdpbGwgYmUKLXN0YWxlIGJ5IHRoZSB0aW1lIHBlb3BsZSBmaW5kIGl0IGluIGEgc2VhcmNoIGVuZ2luZS48L1A+Ci0KLTxQPklmIHlvdSBkZWNpZGUgdG8gZXhjbHVkZSByb2JvdHMgY29tcGxldGVseSwgb3IganVzdCBsaW1pdCB0aGUgYXJlYXMKLWluIHdoaWNoIHRoZXkgY2FuIHJvYW0sIGNyZWF0ZSBhIDxDT0RFPnJvYm90cy50eHQ8L0NPREU+IGZpbGU7IHJlZmVyCi10byB0aGUgPEEgSFJFRj0iaHR0cDovL2luZm8ud2ViY3Jhd2xlci5jb20vbWFrL3Byb2plY3RzL3JvYm90cy9yb2JvdHMuaHRtbCIKLT5yb2JvdCBpbmZvcm1hdGlvbiBwYWdlczwvQT4gcHJvdmlkZWQgYnkgTWFydGlqbiBLb3N0ZXIgZm9yIHRoZSBzeW50YXguPC9QPgotCi08SFI+Ci08SDI+PEEgTkFNRT0icHJveHlzc2wiPkhvdyB0byBwcm94eSBTU0wgcmVxdWVzdHMgPEVNPnRocm91Z2g8L0VNPgotICAgIHlvdXIgbm9uLVNTTCBBcGFjaGUgc2VydmVyPC9BPgotICAgIDxCUj4KLSAgICA8U01BTEw+KDxFTT5zdWJtaXR0ZWQgYnkgRGF2aWQgU2VkbG9jazwvRU0+KTwvU01BTEw+Ci08L0gyPgotPFA+Ci1TU0wgdXNlcyBwb3J0IDQ0MyBmb3IgcmVxdWVzdHMgZm9yIHNlY3VyZSBwYWdlcy4gSWYgeW91ciBicm93c2VyIGp1c3QKLXNpdHMgdGhlcmUgZm9yIGEgbG9uZyB0aW1lIHdoZW4geW91IGF0dGVtcHQgdG8gYWNjZXNzIGEgc2VjdXJlIHBhZ2UKLW92ZXIgeW91ciBBcGFjaGUgcHJveHksIHRoZW4gdGhlIHByb3h5IG1heSBub3QgYmUgY29uZmlndXJlZCB0byBoYW5kbGUKLVNTTC4gWW91IG5lZWQgdG8gaW5zdHJ1Y3QgQXBhY2hlIHRvIGxpc3RlbiBvbiBwb3J0IDQ0MyBpbiBhZGRpdGlvbiB0bwotYW55IG9mIHRoZSBwb3J0cyBvbiB3aGljaCBpdCBpcyBhbHJlYWR5IGxpc3RlbmluZzoKLTwvUD4KLTxQUkU+Ci0gICAgTGlzdGVuIDgwCi0gICAgTGlzdGVuIDQ0MwotPC9QUkU+Ci08UD4KLVRoZW4gc2V0IHRoZSBzZWN1cml0eSBwcm94eSBpbiB5b3VyIGJyb3dzZXIgdG8gNDQzLiBUaGF0IG1pZ2h0IGJlIGl0IQotPC9QPgotPFA+Ci1JZiB5b3VyIHByb3h5IGlzIHNlbmRpbmcgcmVxdWVzdHMgdG8gYW5vdGhlciBwcm94eSwgdGhlbiB5b3UgbWF5IGhhdmUKLXRvIHNldCB0aGUgZGlyZWN0aXZlIFByb3h5UmVtb3RlIGRpZmZlcmVudGx5LiBIZXJlIGFyZSBteSBzZXR0aW5nczoKLTwvUD4KLTxQUkU+Ci0gICAgUHJveHlSZW1vdGUgaHR0cDovL25pY2tsYXM6ODAvIGh0dHA6Ly9wcm94eS5tYXluLmZyYW5rZW4uZGU6ODA4MAotICAgIFByb3h5UmVtb3RlIGh0dHA6Ly9uaWNrbGFzOjQ0My8gaHR0cDovL3Byb3h5Lm1heW4uZnJhbmtlbi5kZTo0NDMKLTwvUFJFPgotPFA+Ci1SZXF1ZXN0cyBvbiBwb3J0IDgwIG9mIG15IHByb3h5IDxTQU1QPm5pY2tsYXM8L1NBTVA+IGFyZSBmb3J3YXJkZWQgdG8KLXByb3h5PFNBTVA+Lm1heW4uZnJhbmtlbi5kZTo4MDgwPC9TQU1QPiwgd2hpbGUgcmVxdWVzdHMgb24gcG9ydCA0NDMgYXJlCi1mb3J3YXJkZWQgdG8gPFNBTVA+cHJveHkubWF5bi5mcmFua2VuLmRlOjQ0MzwvU0FNUD4uCi1JZiB0aGUgcmVtb3RlIHByb3h5IGlzIG5vdCBzZXQgdXAgdG8KLWhhbmRsZSBwb3J0IDQ0MywgdGhlbiB0aGUgbGFzdCBkaXJlY3RpdmUgY2FuIGJlIGxlZnQgb3V0LiBTU0wgcmVxdWVzdHMKLXdpbGwgb25seSBnbyBvdmVyIHRoZSBmaXJzdCBwcm94eS4KLTwvUD4KLTxQPgotTm90ZSB0aGF0IHlvdXIgQXBhY2hlIGRvZXMgTk9UIGhhdmUgdG8gYmUgc2V0IHVwIHRvIHNlcnZlIHNlY3VyZSBwYWdlcwotd2l0aCBTU0wuIFByb3h5aW5nIFNTTCBpcyBhIGRpZmZlcmVudCB0aGluZyBmcm9tIHVzaW5nIGl0LgotPC9QPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21pc2MvaW5kZXguaHRtbCBiL2RvY3MvbWFudWFsL21pc2MvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxMDEzYi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9taXNjL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci0gPEhFQUQ+Ci0gIDxUSVRMRT5BcGFjaGUgTWlzY2VsbGFuZW91cyBEb2N1bWVudGF0aW9uPC9USVRMRT4KLSA8L0hFQUQ+Ci0KLSA8IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci0gPEJPRFkKLSAgQkdDT0xPUj0iI0ZGRkZGRiIKLSAgVEVYVD0iIzAwMDAwMCIKLSAgTElOSz0iIzAwMDBGRiIKLSAgVkxJTks9IiMwMDAwODAiCi0gIEFMSU5LPSIjRkYwMDAwIgotID4KLSAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLSAgPEgxIEFMSUdOPSJDRU5URVIiPkFwYWNoZSBNaXNjZWxsYW5lb3VzIERvY3VtZW50YXRpb248L0gxPgotCi0gIDxQPgotICBCZWxvdyBpcyBhIGxpc3Qgb2YgYWRkaXRpb25hbCBkb2N1bWVudGF0aW9uIHBhZ2VzIHRoYXQgYXBwbHkgdG8gdGhlCi0gIEFwYWNoZSB3ZWIgc2VydmVyIGRldmVsb3BtZW50IHByb2plY3QuCi0gIDwvUD4KLSAgPERMPgotICAgPERUPjxBCi0gICAgICAgIEhSRUY9IkFQSS5odG1sIgotICAgICAgID5BUEk8L0E+Ci0gICA8L0RUPgotICAgPEREPkRlc2NyaXB0aW9uIG9mIEFwYWNoZSdzIEFwcGxpY2F0aW9uIFByb2dyYW1taW5nIEludGVyZmFjZS4KLSAgIDwvREQ+Ci0gICA8RFQ+PEEKLSAgICAgICAgSFJFRj0iRkFRLmh0bWwiCi0gICAgICAgPkZBUTwvQT4KLSAgIDwvRFQ+Ci0gICA8REQ+RnJlcXVlbnRseS1Bc2tlZCBRdWVzdGlvbnMgY29uY2VybmluZyB0aGUgQXBhY2hlIHByb2plY3QgYW5kIHNlcnZlci4KLSAgIDwvREQ+Ci0gICA8RFQ+PEEKLSAgICAgICAgSFJFRj0iY2xpZW50X2Jsb2NrX2FwaS5odG1sIgotICAgICAgID5SZWFkaW5nIENsaWVudCBJbnB1dCBpbiBBcGFjaGUgMS4yPC9BPgotICAgPC9EVD4KLSAgIDxERD5EZXNjcmliZXMgZGlmZmVyZW5jZXMgYmV0d2VlbiBBcGFjaGUgMS4xIGFuZCAxLjIgaW4gaG93IG1vZHVsZXMKLSAgICByZWFkIGluZm9ybWF0aW9uIGZyb20gdGhlIGNsaWVudC4KLSAgIDwvREQ+Ci0gICA8RFQ+PEEKLSAgICAgICAgSFJFRj0iY29tcGF0X25vdGVzLmh0bWwiCi0gICAgICAgPkNvbXBhdGliaWxpdHkgd2l0aCBOQ1NBPC9BPgotICAgPC9EVD4KLSAgIDxERD5Ob3RlcyBhYm91dCBBcGFjaGUncyBjb21wYXRpYmlsaXR5IHdpdGggdGhlIE5DU0Egc2VydmVyLgotICAgPC9ERD4KLSAgIDxEVD48QSBIUkVGPSJjdXN0b21fZXJyb3Jkb2NzLmh0bWwiPkhvdyB0byB1c2UgWFNTSSBhbmQgTmVnb3RpYXRpb24gCi0JZm9yIGN1c3RvbSBFcnJvckRvY3VtZW50czwvQT4KLSAgIDwvRFQ+Ci0gICA8REQ+RGVzY3JpYmVzIGEgc29sdXRpb24gd2hpY2ggdXNlcyBYU1NJIGFuZCBuZWdvdGlhdGlvbgotICAgIHRvIGN1c3RvbS10YWlsb3IgdGhlIEFwYWNoZSBFcnJvckRvY3VtZW50cyB0byB0YXN0ZSwgYWRkaW5nIHRoZQotICAgIGFkdmFudGFnZSBvZiByZXR1cm5pbmcgaW50ZXJuYXRpb25hbGl6ZWQgdmVyc2lvbnMgb2YgdGhlIGVycm9yCi0gICAgbWVzc2FnZXMgZGVwZW5kaW5nIG9uIHRoZSBjbGllbnQncyBsYW5ndWFnZSBwcmVmZXJlbmNlcy4KLSAgIDwvREQ+Ci0gICA8RFQ+PEEgSFJFRj0iZGVzY3JpcHRvcnMuaHRtbCI+RmlsZSBEZXNjcmlwdG9yIHVzZSBpbiBBcGFjaGU8L0E+Ci0gICA8REQ+RGVzY3JpYmVzIGhvdyBBcGFjaGUgdXNlcyBmaWxlIGRlc2NyaXB0b3JzIGFuZCB0YWxrcyBhYm91dCB2YXJpb3VzCi0gICAgbGltaXRzIGltcG9zZWQgb24gdGhlIG51bWJlciBvZiBkZXNjcmlwdG9ycyBhdmFpbGFibGUgYnkgdmFyaW91cyAKLSAgICBvcGVyYXRpbmcgc3lzdGVtcy4KLSAgIDwvREQ+Ci0gICA8RFQ+PEEKLSAgICAgICAgSFJFRj0iZmluX3dhaXRfMi5odG1sIgotICAgICAgID48U0FNUD5GSU5fV0FJVF8yPC9TQU1QPjwvQT4KLSAgIDwvRFQ+Ci0gICA8REQ+QSBkZXNjcmlwdGlvbiBvZiB0aGUgY2F1c2VzIG9mIEFwYWNoZSBwcm9jZXNzZXMgZ29pbmcgaW50byB0aGUKLSAgICA8U0FNUD5GSU5fV0FJVF8yPC9TQU1QPiBzdGF0ZSwgYW5kIHdoYXQgeW91IGNhbiBkbyBhYm91dCBpdC4KLSAgIDwvREQ+Ci0gICA8RFQ+PEEKLSAgICAgICAgSFJFRj0iaG93dG8uaHRtbCIKLSAgICAgICA+JnF1b3Q7SG93LVRvJnF1b3Q7PC9BPgotICAgPC9EVD4KLSAgIDxERD5JbnN0cnVjdGlvbnMgYWJvdXQgaG93IHRvIGFjY29tcGxpc2ggc29tZSBjb21tb25seS1kZXNpcmVkIHNlcnZlcgotICAgIGZ1bmN0aW9uYWxpdHkgY2hhbmdlcy4KLSAgIDwvREQ+Ci0gICA8RFQ+PEEgSFJFRj0iSFRUUF9GZWF0dXJlcy50c3YiPkhUVFAgRmVhdHVyZXMgbGlzdDwvQT48L0RUPgotICAgICA8REQ+QSB0YWItc2VwYXJhdGUgdGFibGUgb2YgSFRUUCBmZWF0dXJlcyBpbXBsZW1lbnRlZCBhbmQgdGVzdGVkIGluIEFwYWNoZS4KLSAgICAgPC9ERD4gCi0gICA8RFQ+PEEKLSAgICAgICAgSFJFRj0ia25vd25fY2xpZW50X3Byb2JsZW1zLmh0bWwiCi0gICAgICAgPktub3duIENsaWVudCBQcm9ibGVtczwvQT4KLSAgIDwvRFQ+Ci0gICA8REQ+QSBsaXN0IG9mIHByb2JsZW1zIGluIEhUVFAgY2xpZW50cyB3aGljaCBjYW4gYmUgbWl0aWdhdGVkIGJ5IEFwYWNoZS4KLSAgIDwvREQ+Ci0gICA8RFQ+PEEKLSAgICAgICAgSFJFRj0ibm9wZ3AuaHRtbCIKLSAgICAgICA+Tm8gUEdQPC9BPgotICAgPC9EVD4KLSAgIDxERD5XaHkgd2UgdG9vayBQRU0gYW5kIFBHUCBzdXBwb3J0IG91dCBvZiB0aGUgYmFzZSBBcGFjaGUgZGlzdHJpYnV0aW9uLgotICAgPC9ERD4KLSAgIDxEVD48QQotICAgICAgICBIUkVGPSJwZXJmLWJzZDQ0Lmh0bWwiCi0gICAgICAgPlBlcmZvcm1hbmNlIE5vdGVzIChCU0QgNC40KTwvQT4KLSAgIDwvRFQ+Ci0gICA8REQ+U29tZSBub3RlcyBhYm91dCB3YXlzIHRvIGltcHJvdmUvb3B0aW1pemUgQXBhY2hlIHBlcmZvcm1hbmNlIG9uCi0gICAgQlNEIDQuNCBzeXN0ZW1zLgotICAgPC9ERD4KLSAgIDxEVD48QQotICAgICAgICBIUkVGPSJwZXJmLWRlYy5odG1sIgotICAgICAgID5QZXJmb3JtYW5jZSBOb3RlcyAoRGlnaXRhbCBVTklYKTwvQT4KLSAgIDwvRFQ+Ci0gICA8REQ+RXh0cmFjdHMgb2YgVVNFTkVUIHBvc3RpbmdzIGRlc2NyaWJpbmcgaG93IHRvIG9wdGltaXplIEFwYWNoZQotICAgIHBlcmZvcm1hbmNlIG9uIERpZ2l0YWwgVU5JWCBzeXN0ZW1zLgotICAgPC9ERD4KLSAgIDxEVD48QQotICAgICAgICBIUkVGPSJwZXJmLWhwLmh0bWwiCi0gICAgICAgPlBlcmZvcm1hbmNlIE5vdGVzIChIUFVYKTwvQT4KLSAgIDwvRFQ+Ci0gICA8REQ+RW1haWwgZnJvbSBhbiBIUCBlbmdpbmVlciBvbiBob3cgdG8gb3B0aW1pemUgSFAtVVggMTAuMjAuCi0gICA8L0REPgotICAgPERUPjxBCi0gICAgICAgIEhSRUY9InBlcmYuaHRtbCIKLSAgICAgICA+UGVyZm9ybWFuY2UgTm90ZXMgKEdlbmVyYWwpPC9BPgotICAgPC9EVD4KLSAgIDxERD5Tb21lIGdlbmVyaWMgbm90ZXMgYWJvdXQgaG93IHRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHlvdXIKLSAgICAgICBtYWNoaW5lL09TLgotICAgPC9ERD4KLSAgIDxEVD48QQotICAgICAgICBIUkVGPSJwZXJmLXR1bmluZy5odG1sIgotICAgICAgID5QZXJmb3JtYW5jZSBOb3RlcyAtLSBBcGFjaGUgVHVuaW5nPC9BPgotICAgPC9EVD4KLSAgIDxERD5Ob3RlcyBhYm91dCBob3cgdG8gKHJ1bi10aW1lIGFuZCBjb21waWxlLXRpbWUpIGNvbmZpZ3VyZQotICAgICAgIEFwYWNoZSBmb3IgaGlnaGVzdCBwZXJmb3JtYW5jZS4gIE5vdGVzIGV4cGxhaW5pbmcgd2h5IEFwYWNoZSBkb2VzCi0gICAgICAgc29tZSB0aGluZ3MsIGFuZCB3aHkgaXQgZG9lc24ndCBkbyBvdGhlciB0aGluZ3MgKHdoaWNoIG1ha2UgaXQKLSAgICAgICBzbG93ZXIvZmFzdGVyKS4KLSAgIDwvREQ+Ci0gICA8RFQ+PEEKLSAgICAgICAgSFJFRj0ic2VjdXJpdHlfdGlwcy5odG1sIgotICAgICAgID5TZWN1cml0eSBUaXBzPC9BPgotICAgPC9EVD4KLSAgIDxERD5Tb21lICZxdW90O2RvJnF1b3Q7cyAgLSBhbmQgJnF1b3Q7ZG9uJ3QmcXVvdDtzIC0gZm9yIGtlZXBpbmcgeW91cgotICAgIEFwYWNoZSB3ZWIgc2l0ZSBzZWN1cmUuCi0gICA8L0REPgotICAgPERUPjxBCi0gICAgICAgIEhSRUY9InZpZi1pbmZvLmh0bWwiCi0gICAgICAgPlZpcnR1YWwgSG9zdHMgKElQLWJhc2VkKTwvQT4KLSAgIDwvRFQ+Ci0gICA8REQ+RXhjZXJwdHMgYW5kIG5vdGVzIGFib3V0IGNvbmZpZ3VyaW5nIGFuZCB1c2luZyBBcGFjaGUgSVAtYmFzZWQgdmlydHVhbAotICAgIGhvc3RzLgotICAgPC9ERD4KLSAgIDxEVD48QQotICAgICAgICBIUkVGPSJ3aW5kb3pfa2VlcGFsaXZlLmh0bWwiCi0gICAgICAgPldpbmRvd3MgQnVnIHdpdGggV2ViIEtlZXBhbGl2ZTwvQT4KLSAgIDwvRFQ+Ci0gICA8REQ+QSBicmllZiBkZXNjcmlwdGlvbiBvZiBhIGtub3duIHByb2JsZW0gd2l0aCBNaWNyb3NvZnQgV2luZG93cyBhbmQKLSAgICB3ZWIgc2l0ZXMgYWNjZXNzZWQgdXNpbmcga2VlcGFsaXZlIGNvbm5lY3Rpb25zLgotICAgPC9ERD4KLSAgPC9ETD4KLQotICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotIDwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21pc2Mva25vd25fY2xpZW50X3Byb2JsZW1zLmh0bWwgYi9kb2NzL21hbnVhbC9taXNjL2tub3duX2NsaWVudF9wcm9ibGVtcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDQxZmM3Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21pc2Mva25vd25fY2xpZW50X3Byb2JsZW1zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgSFRUUCBTZXJ2ZXIgUHJvamVjdDwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPktub3duIFByb2JsZW1zIGluIENsaWVudHM8L0gxPgotCi08UD5PdmVyIHRpbWUgdGhlIEFwYWNoZSBHcm91cCBoYXMgZGlzY292ZXJlZCBvciBiZWVuIG5vdGlmaWVkIG9mIHByb2JsZW1zCi13aXRoIHZhcmlvdXMgY2xpZW50cyB3aGljaCB3ZSBoYXZlIGhhZCB0byB3b3JrIGFyb3VuZCwgb3IgZXhwbGFpbi4KLVRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZXNlIHByb2JsZW1zIGFuZCB0aGUgd29ya2Fyb3VuZHMgYXZhaWxhYmxlLgotSXQncyBub3QgYXJyYW5nZWQgaW4gYW55IHBhcnRpY3VsYXIgb3JkZXIuICBTb21lIGZhbWlsaWFyaXR5IHdpdGggdGhlCi1zdGFuZGFyZHMgaXMgYXNzdW1lZCwgYnV0IG5vdCBuZWNlc3NhcnkuCi0KLTxQPkZvciBicmV2aXR5LCA8RU0+TmF2aWdhdG9yPC9FTT4gd2lsbCByZWZlciB0byBOZXRzY2FwZSdzIE5hdmlnYXRvcgotcHJvZHVjdCAod2hpY2ggaW4gbGF0ZXIgdmVyc2lvbnMgd2FzIHJlbmFtZWQgIkNvbW11bmljYXRvciIgYW5kCi12YXJpb3VzIG90aGVyIG5hbWVzKSwgYW5kIDxFTT5NU0lFPC9FTT4gd2lsbCByZWZlciB0byBNaWNyb3NvZnQncwotSW50ZXJuZXQgRXhwbG9yZXIgcHJvZHVjdC4gIEFsbCB0cmFkZW1hcmtzIGFuZCBjb3B5cmlnaHRzIGJlbG9uZyB0bwotdGhlaXIgcmVzcGVjdGl2ZSBjb21wYW5pZXMuICBXZSB3ZWxjb21lIGlucHV0IGZyb20gdGhlIHZhcmlvdXMgY2xpZW50Ci1hdXRob3JzIHRvIGNvcnJlY3QgaW5jb25zaXN0ZW5jaWVzIGluIHRoaXMgcGFwZXIsIG9yIHRvIHByb3ZpZGUgdXMgd2l0aAotZXhhY3QgdmVyc2lvbiBudW1iZXJzIHdoZXJlIHRoaW5ncyBhcmUgYnJva2VuL2ZpeGVkLgotCi08UD5Gb3IgcmVmZXJlbmNlLAotPEEgSFJFRj0iZnRwOi8vZHMuaW50ZXJuaWMubmV0L3JmYy9yZmMxOTQ1LnR4dCI+UkZDMTk0NTwvQT4KLWRlZmluZXMgSFRUUC8xLjAsIGFuZAotPEEgSFJFRj0iZnRwOi8vZHMuaW50ZXJuaWMubmV0L3JmYy9yZmMyMDY4LnR4dCI+UkZDMjA2ODwvQT4KLWRlZmluZXMgSFRUUC8xLjEuICBBcGFjaGUgYXMgb2YgdmVyc2lvbiAxLjIgaXMgYW4gSFRUUC8xLjEgc2VydmVyICh3aXRoIGFuIAotb3B0aW9uYWwgSFRUUC8xLjAgcHJveHkpLgotCi08UD5WYXJpb3VzIG9mIHRoZXNlIHdvcmthcm91bmRzIGFyZSB0cmlnZ2VyZWQgYnkgZW52aXJvbm1lbnQgdmFyaWFibGVzLgotVGhlIGFkbWluIHR5cGljYWxseSBjb250cm9scyB3aGljaCBhcmUgc2V0LCBhbmQgZm9yIHdoaWNoIGNsaWVudHMsIGJ5IHVzaW5nIAotPEEgSFJFRj0iLi4vbW9kL21vZF9icm93c2VyLmh0bWwiPm1vZF9icm93c2VyPC9BPi4gIFVubGVzcyBvdGhlcndpc2UKLW5vdGVkIGFsbCBvZiB0aGVzZSB3b3JrYXJvdW5kcyBleGlzdCBpbiB2ZXJzaW9ucyAxLjIgYW5kIGxhdGVyLgotCi08SDM+PEEgTkFNRT0idHJhaWxpbmctY3JsZiI+VHJhaWxpbmcgQ1JMRiBvbiBQT1NUczwvQT48L0gzPgotCi08UD5UaGlzIGlzIGEgbGVnYWN5IGlzc3VlLiAgVGhlIENFUk4gd2Vic2VydmVyIHJlcXVpcmVkIDxDT0RFPlBPU1Q8L0NPREU+Ci1kYXRhIHRvIGhhdmUgYW4gZXh0cmEgPENPREU+Q1JMRjwvQ09ERT4gZm9sbG93aW5nIGl0LiAgVGh1cyBtYW55Ci1jbGllbnRzIHNlbmQgYW4gZXh0cmEgPENPREU+Q1JMRjwvQ09ERT4gdGhhdAotaXMgbm90IGluY2x1ZGVkIGluIHRoZSA8Q09ERT5Db250ZW50LUxlbmd0aDwvQ09ERT4gb2YgdGhlIHJlcXVlc3QuCi1BcGFjaGUgd29ya3MgYXJvdW5kIHRoaXMgcHJvYmxlbSBieSBlYXRpbmcgYW55IGVtcHR5IGxpbmVzIHdoaWNoCi1hcHBlYXIgYmVmb3JlIGEgcmVxdWVzdC4KLQotPEgzPjxBIE5BTUU9ImJyb2tlbi1rZWVwYWxpdmUiPkJyb2tlbiBrZWVwYWxpdmU8L0E+PC9IMz4KLQotPFA+VmFyaW91cyBjbGllbnRzIGhhdmUgaGFkIGJyb2tlbiBpbXBsZW1lbnRhdGlvbnMgb2YgPEVNPmtlZXBhbGl2ZTwvRU0+Ci0ocGVyc2lzdGVudCBjb25uZWN0aW9ucykuICBJbiBwYXJ0aWN1bGFyIHRoZSBXaW5kb3dzIHZlcnNpb25zIG9mCi1OYXZpZ2F0b3IgMi4wIGdldCB2ZXJ5IGNvbmZ1c2VkIHdoZW4gdGhlIHNlcnZlciB0aW1lcyBvdXQgYW4KLWlkbGUgY29ubmVjdGlvbi4gIFRoZSB3b3JrYXJvdW5kIGlzIHByZXNlbnQgaW4gdGhlIGRlZmF1bHQgY29uZmlnIGZpbGVzOgotPEJMT0NLUVVPVEU+PENPREU+Ci1Ccm93c2VyTWF0Y2ggTW96aWxsYS8yIG5va2VlcGFsaXZlCi08L0NPREU+PC9CTE9DS1FVT1RFPgotTm90ZSB0aGF0IHRoaXMgbWF0Y2hlcyBzb21lIGVhcmxpZXIgdmVyc2lvbnMgb2YgTVNJRSwgd2hpY2ggYmVnYW4gdGhlCi1wcmFjdGljZSBvZiBjYWxsaW5nIHRoZW1zZWx2ZXMgPEVNPk1vemlsbGE8L0VNPiBpbiB0aGVpciB1c2VyLWFnZW50Ci1zdHJpbmdzIGp1c3QgbGlrZSBOYXZpZ2F0b3IuCi0KLTxQPk1TSUUgNC4wYjIsIHdoaWNoIGNsYWltcyB0byBzdXBwb3J0IEhUVFAvMS4xLCBkb2VzIG5vdCBwcm9wZXJseQotc3VwcG9ydCBrZWVwYWxpdmUgd2hlbiBpdCBpcyB1c2VkIG9uIDMwMSBvciAzMDIgKHJlZGlyZWN0KQotcmVzcG9uc2VzLiAgVW5mb3J0dW5hdGVseSBBcGFjaGUncyA8Q09ERT5ub2tlZXBhbGl2ZTwvQ09ERT4gY29kZQotcHJpb3IgdG8gMS4yLjIgd291bGQgbm90IHdvcmsgd2l0aCBIVFRQLzEuMSBjbGllbnRzLiAgWW91IG11c3QgYXBwbHkKLTxBCi1IUkVGPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9wYXRjaGVzL2FwcGx5X3RvXzEuMi4xL21zaWVfNF8wYjJfZml4ZXMucGF0Y2giCi0+dGhpcyBwYXRjaDwvQT4gdG8gdmVyc2lvbiAxLjIuMS4gIFRoZW4gYWRkIHRoaXMgdG8geW91ciBjb25maWc6Ci08QkxPQ0tRVU9URT48Q09ERT4KLUJyb3dzZXJNYXRjaCAiTVNJRSA0XC4wYjI7IiBub2tlZXBhbGl2ZQotPC9DT0RFPjwvQkxPQ0tRVU9URT4KLQotPEgzPjxBIE5BTUU9ImZvcmNlLXJlc3BvbnNlLTEuMCI+SW5jb3JyZWN0IGludGVycHJldGF0aW9uIG9mCi08Q09ERT5IVFRQLzEuMTwvQ09ERT4gaW4gcmVzcG9uc2U8L0E+PC9IMz4KLQotPFA+VG8gcXVvdGUgZnJvbSBzZWN0aW9uIDMuMSBvZiBSRkMxOTQ1OgotPEJMT0NLUVVPVEU+Ci1IVFRQIHVzZXMgYSAiJmx0O01BSk9SJmd0Oy4mbHQ7TUlOT1ImZ3Q7IiBudW1iZXJpbmcgc2NoZW1lIHRvIGluZGljYXRlIHZlcnNpb25zCi1vZiB0aGUgcHJvdG9jb2wuIFRoZSBwcm90b2NvbCB2ZXJzaW9uaW5nIHBvbGljeSBpcyBpbnRlbmRlZCB0byBhbGxvdwotdGhlIHNlbmRlciB0byBpbmRpY2F0ZSB0aGUgZm9ybWF0IG9mIGEgbWVzc2FnZSBhbmQgaXRzIGNhcGFjaXR5IGZvcgotdW5kZXJzdGFuZGluZyBmdXJ0aGVyIEhUVFAgY29tbXVuaWNhdGlvbiwgcmF0aGVyIHRoYW4gdGhlIGZlYXR1cmVzCi1vYnRhaW5lZCB2aWEgdGhhdCBjb21tdW5pY2F0aW9uLgotPC9CTE9DS1FVT1RFPgotU2luY2UgQXBhY2hlIGlzIGFuIEhUVFAvMS4xIHNlcnZlciwgaXQgaW5kaWNhdGVzIHNvIGFzIHBhcnQgb2YgaXRzCi1yZXNwb25zZS4gIE1hbnkgY2xpZW50IGF1dGhvcnMgbWlzdGFrZW5seSB0cmVhdCB0aGlzIHBhcnQgb2YgdGhlIHJlc3BvbnNlCi1hcyBhbiBpbmRpY2F0aW9uIG9mIHRoZSBwcm90b2NvbCB0aGF0IHRoZSByZXNwb25zZSBpcyBpbiwgYW5kIHRoZW4gcmVmdXNlCi10byBhY2NlcHQgdGhlIHJlc3BvbnNlLgotCi08UD5UaGUgZmlyc3QgbWFqb3IgaW5kaWNhdGlvbiBvZiB0aGlzIHByb2JsZW0gd2FzIHdpdGggQU9MJ3MgcHJveHkgc2VydmVycy4KLVdoZW4gQXBhY2hlIDEuMiB3ZW50IGludG8gYmV0YSBpdCB3YXMgdGhlIGZpcnN0IHdpZGUtc3ByZWFkIEhUVFAvMS4xCi1zZXJ2ZXIuICBBZnRlciBzb21lIGRpc2N1c3Npb24sIEFPTCBmaXhlZCB0aGVpciBwcm94aWVzLiAgSW4KLWFudGljaXBhdGlvbiBvZiBzaW1pbGFyIHByb2JsZW1zLCB0aGUgPENPREU+Zm9yY2UtcmVzcG9uc2UtMS4wPC9DT0RFPgotZW52aXJvbm1lbnQgdmFyaWFibGUgd2FzIGFkZGVkIHRvIEFwYWNoZS4gIFdoZW4gcHJlc2VudCBBcGFjaGUgd2lsbAotaW5kaWNhdGUgIkhUVFAvMS4wIiBpbiByZXNwb25zZSB0byBhbiBIVFRQLzEuMCBjbGllbnQsCi1idXQgd2lsbCBub3QgaW4gYW55IG90aGVyIHdheSBjaGFuZ2UgdGhlIHJlc3BvbnNlLgotCi08UD5UaGUgcHJlLTEuMSBKYXZhIERldmVsb3BtZW50IEtpdCAoSkRLKSB0aGF0IGlzIHVzZWQgaW4gbWFueSBjbGllbnRzCi0oaW5jbHVkaW5nIE5hdmlnYXRvciAzLnggYW5kIE1TSUUgMy54KSBleGhpYml0cyB0aGlzIHByb2JsZW0uICBBcyBkbyBzb21lCi1vZiB0aGUgZWFybHkgcHJlLXJlbGVhc2VzIG9mIHRoZSAxLjEgSkRLLiAgV2UgdGhpbmsgaXQgaXMgZml4ZWQgaW4gdGhlCi0xLjEgSkRLIHJlbGVhc2UuICBJbiBhbnkgZXZlbnQgdGhlIHdvcmthcm91bmQ6Ci08QkxPQ0tRVU9URT48Q09ERT4KLUJyb3dzZXJNYXRjaCBKYXZhLzEuMCBmb3JjZS1yZXNwb25zZS0xLjAgPEJSPgotQnJvd3Nlck1hdGNoIEpESy8xLjAgZm9yY2UtcmVzcG9uc2UtMS4wIAotPC9DT0RFPjwvQkxPQ0tRVU9URT4KLQotPFA+UmVhbFBsYXllciA0LjAgZnJvbSBQcm9ncmVzc2l2ZSBOZXR3b3JrcyBhbHNvIGV4aGliaXRzIHRoaXMgcHJvYmxlbS4KLUhvd2V2ZXIgdGhleSBoYXZlIGZpeGVkIGl0IGluIHZlcnNpb24gNC4wMSBvZiB0aGUgcGxheWVyLCBidXQgdmVyc2lvbgotNC4wMSB1c2VzIHRoZSBzYW1lIDxDT0RFPlVzZXItQWdlbnQ8L0NPREU+IGFzIHZlcnNpb24gNC4wLiAgVGhlCi13b3JrYXJvdW5kIGlzIHN0aWxsOgotPEJMT0NLUVVPVEU+PENPREU+Ci1Ccm93c2VyTWF0Y2ggIlJlYWxQbGF5ZXIgNC4wIiBmb3JjZS1yZXNwb25zZS0xLjAKLTwvQ09ERT48L0JMT0NLUVVPVEU+Ci0KLTxIMz48QSBOQU1FPSJtc2llNC4wYjIiPlJlcXVlc3RzIHVzZSBIVFRQLzEuMSBidXQgcmVzcG9uc2VzIG11c3QgYmUKLWluIEhUVFAvMS4wPC9BPjwvSDM+Ci0KLTxQPk1TSUUgNC4wYjIgaGFzIHRoaXMgcHJvYmxlbS4gIEl0cyBKYXZhIFZNIG1ha2VzIHJlcXVlc3RzIGluIEhUVFAvMS4xCi1mb3JtYXQgYnV0IHRoZSByZXNwb25zZXMgbXVzdCBiZSBpbiBIVFRQLzEuMCBmb3JtYXQgKGluIHBhcnRpY3VsYXIsIGl0Ci1kb2VzIG5vdCB1bmRlcnN0YW5kIDxFTT5jaHVua2VkPC9FTT4gcmVzcG9uc2VzKS4gIFRoZSB3b3JrYXJvdW5kCi1pcyB0byBmb29sIEFwYWNoZSBpbnRvIGJlbGlldmluZyB0aGUgcmVxdWVzdCBjYW1lIGluIEhUVFAvMS4wIGZvcm1hdC4KLTxCTE9DS1FVT1RFPjxDT0RFPgotQnJvd3Nlck1hdGNoICJNU0lFIDRcLjBiMjsiIGRvd25ncmFkZS0xLjAgZm9yY2UtcmVzcG9uc2UtMS4wCi08L0NPREU+PC9CTE9DS1FVT1RFPgotVGhpcyB3b3JrYXJvdW5kIGlzIGF2YWlsYWJsZSBpbiAxLjIuMiwgYW5kIGluIGEKLTxBCi1IUkVGPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9wYXRjaGVzL2FwcGx5X3RvXzEuMi4xL21zaWVfNF8wYjJfZml4ZXMucGF0Y2giCi0+cGF0Y2g8L0E+IGFnYWluc3QgMS4yLjEuCi0KLTxIMz48QSBOQU1FPSIyNTd0aC1ieXRlIj5Cb3VuZGFyeSBwcm9ibGVtcyB3aXRoIGhlYWRlciBwYXJzaW5nPC9BPjwvSDM+Ci0KLTxQPkFsbCB2ZXJzaW9ucyBvZiBOYXZpZ2F0b3IgZnJvbSAyLjAgdGhyb3VnaCA0LjBiMiAoYW5kIHBvc3NpYmx5IGxhdGVyKQotaGF2ZSBhIHByb2JsZW0gaWYgdGhlIHRyYWlsaW5nIENSTEYgb2YgdGhlIHJlc3BvbnNlIGhlYWRlciBzdGFydHMgYXQKLW9mZnNldCAyNTYsIDI1NyBvciAyNTggb2YgdGhlIHJlc3BvbnNlLiAgQSBCcm93c2VyTWF0Y2ggZm9yIHRoaXMgd291bGQKLW1hdGNoIG9uIG5lYXJseSBldmVyeSBoaXQsIHNvIHRoZSB3b3JrYXJvdW5kIGlzIGVuYWJsZWQgYXV0b21hdGljYWxseQotb24gYWxsIHJlc3BvbnNlcy4gIFRoZSB3b3JrYXJvdW5kIGltcGxlbWVudGVkIGRldGVjdHMgd2hlbiB0aGlzIGNvbmRpdGlvbiB3b3VsZAotb2NjdXIgaW4gYSByZXNwb25zZSBhbmQgYWRkcyBleHRyYSBwYWRkaW5nIHRvIHRoZSBoZWFkZXIgdG8gcHVzaCB0aGUKLXRyYWlsaW5nIENSTEYgcGFzdCBvZmZzZXQgMjU4IG9mIHRoZSByZXNwb25zZS4KLQotPEgzPjxBIE5BTUU9ImJvdW5kYXJ5LXN0cmluZyI+TXVsdGlwYXJ0IHJlc3BvbnNlcyBhbmQgUXVvdGVkIEJvdW5kYXJ5Ci1TdHJpbmdzPC9BPjwvSDM+Ci0KLTxQPk9uIG11bHRpcGFydCByZXNwb25zZXMgc29tZSBjbGllbnRzIHdpbGwgbm90IGFjY2VwdCBxdW90ZXMgKCIpCi1hcm91bmQgdGhlIGJvdW5kYXJ5IHN0cmluZy4gIFRoZSBNSU1FIHN0YW5kYXJkIHJlY29tbWVuZHMgdGhhdAotc3VjaCBxdW90ZXMgYmUgdXNlZC4gIEJ1dCB0aGUgY2xpZW50cyB3ZXJlIHByb2JhYmx5IHdyaXR0ZW4gYmFzZWQKLW9uIG9uZSBvZiB0aGUgZXhhbXBsZXMgaW4gUkZDMjA2OCwgd2hpY2ggZG9lcyBub3QgaW5jbHVkZSBxdW90ZXMuCi1BcGFjaGUgZG9lcyBub3QgaW5jbHVkZSBxdW90ZXMgb24gaXRzIGJvdW5kYXJ5IHN0cmluZ3MgdG8gd29ya2Fyb3VuZAotdGhpcyBwcm9ibGVtLgotCi08SDM+PEEgTkFNRT0iYnl0ZXJhbmdlLXJlcXVlc3RzIj5CeXRlcmFuZ2UgcmVxdWVzdHM8L0E+PC9IMz4KLQotPFA+QSBieXRlcmFuZ2UgcmVxdWVzdCBpcyB1c2VkIHdoZW4gdGhlIGNsaWVudCB3aXNoZXMgdG8gcmV0cmlldmUgYQotcG9ydGlvbiBvZiBhbiBvYmplY3QsIG5vdCBuZWNlc3NhcmlseSB0aGUgZW50aXJlIG9iamVjdC4gIFRoZXJlCi13YXMgYSB2ZXJ5IG9sZCBkcmFmdCB3aGljaCBpbmNsdWRlZCB0aGVzZSBieXRlcmFuZ2VzIGluIHRoZSBVUkwuCi1PbGQgY2xpZW50cyBzdWNoIGFzIE5hdmlnYXRvciAyLjBiMSBhbmQgTVNJRSAzLjAgZm9yIHRoZSBNQUMKLWV4aGliaXQgdGhpcyBiZWhhdmlvdXIsIGFuZAotaXQgd2lsbCBhcHBlYXIgaW4gdGhlIHNlcnZlcnMnIGFjY2VzcyBsb2dzIGFzIChmYWlsZWQpIGF0dGVtcHRzIHRvCi1yZXRyaWV2ZSBhIFVSTCB3aXRoIGEgdHJhaWxpbmcgIjt4eHgteXl5Ii4gIEFwYWNoZSBkb2VzIG5vdCBhdHRlbXB0Ci10byBpbXBsZW1lbnQgdGhpcyBhdCBhbGwuCi0KLTxQPkEgc3Vic2VxdWVudCBkcmFmdCBvZiB0aGlzIHN0YW5kYXJkIGRlZmluZXMgYSBoZWFkZXIKLTxDT0RFPlJlcXVlc3QtUmFuZ2U8L0NPREU+LCBhbmQgYSByZXNwb25zZSB0eXBlCi08Q09ERT5tdWx0aXBhcnQveC1ieXRlcmFuZ2VzPC9DT0RFPi4gIFRoZSBIVFRQLzEuMSBzdGFuZGFyZCBpbmNsdWRlcwotdGhpcyBkcmFmdCB3aXRoIGEgZmV3IGZpeGVzLCBhbmQgaXQgZGVmaW5lcyB0aGUgaGVhZGVyCi08Q09ERT5SYW5nZTwvQ09ERT4gYW5kIHR5cGUgPENPREU+bXVsdGlwYXJ0L2J5dGVyYW5nZXM8L0NPREU+LgotCi08UD5OYXZpZ2F0b3IgKHZlcnNpb25zIDIgYW5kIDMpIHNlbmRzIGJvdGggPENPREU+UmFuZ2U8L0NPREU+IGFuZAotPENPREU+UmVxdWVzdC1SYW5nZTwvQ09ERT4gaGVhZGVycyAod2l0aCB0aGUgc2FtZSB2YWx1ZSksIGJ1dCBkb2VzIG5vdAotYWNjZXB0IGEgPENPREU+bXVsdGlwYXJ0L2J5dGVyYW5nZXM8L0NPREU+IHJlc3BvbnNlLiAgVGhlIHJlc3BvbnNlIG11c3QKLWJlIDxDT0RFPm11bHRpcGFydC94LWJ5dGVyYW5nZXM8L0NPREU+LiAgQXMgYSB3b3JrYXJvdW5kLCBpZiBBcGFjaGUKLXJlY2VpdmVzIGEgPENPREU+UmVxdWVzdC1SYW5nZTwvQ09ERT4gaGVhZGVyIGl0IGNvbnNpZGVycyBpdCAiaGlnaGVyCi1wcmlvcml0eSIgdGhhbiBhIDxDT0RFPlJhbmdlPC9DT0RFPiBoZWFkZXIgYW5kIGluIHJlc3BvbnNlIHVzZXMKLTxDT0RFPm11bHRpcGFydC94LWJ5dGVyYW5nZXM8L0NPREU+LgotCi08UD5UaGUgQWRvYmUgQWNyb2JhdCBSZWFkZXIgcGx1Z2luIG1ha2VzIGV4dGVuc2l2ZSB1c2Ugb2YgYnl0ZXJhbmdlcyBhbmQKLXByaW9yIHRvIHZlcnNpb24gMy4wMSBzdXBwb3J0cyBvbmx5IHRoZSA8Q09ERT5tdWx0aXBhcnQveC1ieXRlcmFuZ2U8L0NPREU+Ci1yZXNwb25zZS4gIFVuZm9ydHVuYXRlbHkgdGhlcmUgaXMgbm8gY2x1ZSB0aGF0IGl0IGlzIHRoZSBwbHVnaW4KLW1ha2luZyB0aGUgcmVxdWVzdC4gIElmIHRoZSBwbHVnaW4gaXMgdXNlZCB3aXRoIE5hdmlnYXRvciwgdGhlIGFib3ZlCi13b3JrYXJvdW5kIHdvcmtzIGZpbmUuICBCdXQgaWYgdGhlIHBsdWdpbiBpcyB1c2VkIHdpdGggTVNJRSAzIChvbgotV2luZG93cykgdGhlIHdvcmthcm91bmQgd29uJ3Qgd29yayBiZWNhdXNlIE1TSUUgMyBkb2Vzbid0IGdpdmUgdGhlCi08Q09ERT5SYW5nZS1SZXF1ZXN0PC9DT0RFPiBjbHVlIHRoYXQgTmF2aWdhdG9yIGRvZXMuICBUbyB3b3JrYXJvdW5kIHRoaXMsCi1BcGFjaGUgc3BlY2lhbCBjYXNlcyAiTVNJRSAzIiBpbiB0aGUgPENPREU+VXNlci1BZ2VudDwvQ09ERT4gYW5kIHNlcnZlcwotPENPREU+bXVsdGlwYXJ0L3gtYnl0ZXJhbmdlczwvQ09ERT4uICBOb3RlIHRoYXQgdGhlIG5lY2Vzc2l0eSBmb3IgdGhpcwotd2l0aCBNU0lFIDMgaXMgYWN0dWFsbHkgZHVlIHRvIHRoZSBBY3JvYmF0IHBsdWdpbiwgbm90IGR1ZSB0byB0aGUgYnJvd3Nlci4KLQotPFA+TmV0c2NhcGUgQ29tbXVuaWNhdG9yIGFwcGVhcnMgdG8gbm90IGlzc3VlIHRoZSBub24tc3RhbmRhcmQKLTxDT0RFPlJlcXVlc3QtUmFuZ2U8L0NPREU+IGhlYWRlci4gIFdoZW4gYW4gQWNyb2JhdCBwbHVnaW4gcHJpb3IgdG8KLXZlcnNpb24gMy4wMSBpcyB1c2VkIHdpdGggaXQsIGl0IHdpbGwgbm90IHByb3Blcmx5IHVuZGVyc3RhbmQgYnl0ZXJhbmdlcy4KLVRoZSB1c2VyIG11c3QgdXBncmFkZSB0aGVpciBBY3JvYmF0IHJlYWRlciB0byAzLjAxLgotCi08SDM+PEEgTkFNRT0iY29va2llLW1lcmdlIj48Q09ERT5TZXQtQ29va2llPC9DT0RFPiBoZWFkZXIgaXMKLXVubWVyZ2VhYmxlPC9BPjwvSDM+Ci0KLTxQPlRoZSBIVFRQIHNwZWNpZmljYXRpb25zIHNheSB0aGF0IGl0IGlzIGxlZ2FsIHRvIG1lcmdlIGhlYWRlcnMgd2l0aAotZHVwbGljYXRlIG5hbWVzIGludG8gb25lIChzZXBhcmF0ZWQgYnkgY29tbWFzKS4gIFNvbWUgYnJvd3NlcnMKLXRoYXQgc3VwcG9ydCBDb29raWVzIGRvbid0IGxpa2UgbWVyZ2VkIGhlYWRlcnMgYW5kIHByZWZlciB0aGF0IGVhY2gKLTxDT0RFPlNldC1Db29raWU8L0NPREU+IGhlYWRlciBpcyBzZW50IHNlcGFyYXRlbHkuICBXaGVuIHBhcnNpbmcgdGhlCi1oZWFkZXJzIHJldHVybmVkIGJ5IGEgQ0dJLCBBcGFjaGUgd2lsbCBleHBsaWNpdGx5IGF2b2lkIG1lcmdpbmcgYW55Ci08Q09ERT5TZXQtQ29va2llPC9DT0RFPiBoZWFkZXJzLgotCi08SDM+PEEgTkFNRT0iZ2lmODktZXhwaXJlcyI+PENPREU+RXhwaXJlczwvQ09ERT4gaGVhZGVycyBhbmQgR0lGODlBCi1hbmltYXRpb25zPC9BPjwvSDM+Ci0KLTxQPk5hdmlnYXRvciB2ZXJzaW9ucyAyIHRocm91Z2ggNCB3aWxsIGVycm9uZW91c2x5IHJlLXJlcXVlc3QKLUdJRjg5QSBhbmltYXRpb25zIG9uIGVhY2ggbG9vcCBvZiB0aGUgYW5pbWF0aW9uIGlmIHRoZSBmaXJzdAotcmVzcG9uc2UgaW5jbHVkZWQgYW4gPENPREU+RXhwaXJlczwvQ09ERT4gaGVhZGVyLiAgVGhpcyBoYXBwZW5zCi1yZWdhcmRsZXNzIG9mIGhvdyBmYXIgaW4gdGhlIGZ1dHVyZSB0aGUgZXhwaXJ5IHRpbWUgaXMgc2V0LiAgVGhlcmUKLWlzIG5vIHdvcmthcm91bmQgc3VwcGxpZWQgd2l0aCBBcGFjaGUsIGhvd2V2ZXIgdGhlcmUgYXJlIGhhY2tzIGZvciA8QQotSFJFRj0iaHR0cDovL3d3dy5hcmN0aWMub3JnL35kZ2F1ZGV0L3BhdGNoZXMvYXBhY2hlLTEuMi1naWY4OS1leHBpcmVzLWhhY2sucGF0Y2giPjEuMjwvQT4KLWFuZCBmb3IgPEEKLUhSRUY9Imh0dHA6Ly93d3cuYXJjdGljLm9yZy9+ZGdhdWRldC9wYXRjaGVzL2FwYWNoZS0xLjMtZ2lmODktZXhwaXJlcy1oYWNrLnBhdGNoIj4xLjM8L0E+LgotCi08SDM+PEEgTkFNRT0ibm8tY29udGVudC1sZW5ndGgiPjxDT0RFPlBPU1Q8L0NPREU+IHdpdGhvdXQKLTxDT0RFPkNvbnRlbnQtTGVuZ3RoPC9DT0RFPjwvQT48L0gzPgotCi08UD5JbiBjZXJ0YWluIHNpdHVhdGlvbnMgTmF2aWdhdG9yIDMuMDEgdGhyb3VnaCAzLjAzIGFwcGVhciB0byBpbmNvcnJlY3RseQotaXNzdWUgYSBQT1NUIHdpdGhvdXQgdGhlIHJlcXVlc3QgYm9keS4gIFRoZXJlIGlzIG5vCi1rbm93biB3b3JrYXJvdW5kLiAgSXQgaGFzIGJlZW4gZml4ZWQgaW4gTmF2aWdhdG9yIDMuMDQsIE5ldHNjYXBlcwotcHJvdmlkZXMgc29tZQotPEEgSFJFRj0iaHR0cDovL2hlbHAubmV0c2NhcGUuY29tL2tiL2NsaWVudC85NzEwMTQtNDIuaHRtbCI+aW5mb3JtYXRpb248L0E+LgotVGhlcmUncyBhbHNvCi08QSBIUkVGPSJodHRwOi8vd3d3LmFyY3RpYy5vcmcvfmRnYXVkZXQvYXBhY2hlL25vLWNvbnRlbnQtbGVuZ3RoLyI+Ci1zb21lIGluZm9ybWF0aW9uPC9BPiBhYm91dCB0aGUgYWN0dWFsIHByb2JsZW0uCi0KLTxIMz48QSBOQU1FPSJqZGstMTItYnVncyI+SkRLIDEuMiBiZXRhcyBsb3NlIHBhcnRzIG9mIHJlc3BvbnNlcy48L0E+PC9IMz4KLQotPFA+VGhlIGh0dHAgY2xpZW50IGluIHRoZSBKREsxLjJiZXRhMiBhbmQgYmV0YTMgd2lsbCB0aHJvdyBhd2F5IHRoZSBmaXJzdCBwYXJ0IG9mCi10aGUgcmVzcG9uc2UgYm9keSB3aGVuIGJvdGggdGhlIGhlYWRlcnMgYW5kIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBib2R5IGFyZSBzZW50Ci1pbiB0aGUgc2FtZSBuZXR3b3JrIHBhY2tldCBBTkQga2VlcC1hbGl2ZSdzIGFyZSBiZWluZyB1c2VkLiBJZiBlaXRoZXIgY29uZGl0aW9uCi1pcyBub3QgbWV0IHRoZW4gaXQgd29ya3MgZmluZS4KLQotPFA+U2VlIGFsc28gQnVnLUlEJ3MgNDEyNDMyOSBhbmQgNDEyNTUzOCBhdCB0aGUgamF2YSBkZXZlbG9wZXIgY29ubmVjdGlvbi4KLQotPFA+SWYgeW91IGFyZSBzZWVpbmcgdGhpcyBidWcgeW91cnNlbGYsIHlvdSBjYW4gYWRkIHRoZSBmb2xsb3dpbmcgQnJvd3Nlck1hdGNoCi1kaXJlY3RpdmUgdG8gd29yayBhcm91bmQgaXQ6Ci0KLTxCTE9DS1FVT1RFPjxDT0RFPgotQnJvd3Nlck1hdGNoICJKYXZhMVwuMmJldGFbMjNdIiBub2tlZXBhbGl2ZQotPC9DT0RFPjwvQkxPQ0tRVU9URT4KLQotPFA+V2UgZG9uJ3QgYWR2b2NhdGUgdGhpcyB0aG91Z2ggc2luY2UgYmVuZGluZyBvdmVyIGJhY2t3YXJkcyBmb3IgYmV0YSBzb2Z0d2FyZQotaXMgdXN1YWxseSBub3QgYSBnb29kIGlkZWE7IGlkZWFsbHkgaXQgZ2V0cyBmaXhlZCwgbmV3IGJldGFzIG9yIGEgZmluYWwgcmVsZWFzZQotY29tZXMgb3V0LCBhbmQgbm8gb25lIHVzZXMgdGhlIGJyb2tlbiBvbGQgc29mdHdhcmUgYW55bW9yZS4gIEluIHRoZW9yeS4KLQotPEgzPjxBIE5BTUU9ImNvbnRlbnQtdHlwZS1wZXJzaXN0ZW5jZSI+PENPREU+Q29udGVudC1UeXBlPC9DT0RFPiBjaGFuZ2UKLWlzIG5vdCBub3RpY2VkIGFmdGVyIHJlbG9hZDwvQT48L0gzPgotCi08UD5OYXZpZ2F0b3IgKGFsbCB2ZXJzaW9ucz8pIHdpbGwgY2FjaGUgdGhlIDxDT0RFPmNvbnRlbnQtdHlwZTwvQ09ERT4KLWZvciBhbiBvYmplY3QgImZvcmV2ZXIiLiAgVXNpbmcgcmVsb2FkIG9yIHNoaWZ0LXJlbG9hZCB3aWxsIG5vdCBjYXVzZQotTmF2aWdhdG9yIHRvIG5vdGljZSBhIDxDT0RFPmNvbnRlbnQtdHlwZTwvQ09ERT4gY2hhbmdlLiAgVGhlIG9ubHkKLXdvcmstYXJvdW5kIGlzIGZvciB0aGUgdXNlciB0byBmbHVzaCB0aGVpciBjYWNoZXMgKG1lbW9yeSBhbmQgZGlzaykuICBCeQotd2F5IG9mIGFuIGV4YW1wbGUsIHNvbWUgZm9sa3MgbWF5IGJlIHVzaW5nIGFuIG9sZCA8Q09ERT5taW1lLnR5cGVzPC9DT0RFPgotZmlsZSB3aGljaCBkb2VzIG5vdCBtYXAgPENPREU+Lmh0bTwvQ09ERT4gdG8gPENPREU+dGV4dC9odG1sPC9DT0RFPiwKLWluIHRoaXMgY2FzZSBBcGFjaGUgd2lsbCBkZWZhdWx0IHRvIHNlbmRpbmcgPENPREU+dGV4dC9wbGFpbjwvQ09ERT4uCi1JZiB0aGUgdXNlciByZXF1ZXN0cyB0aGUgcGFnZSBhbmQgaXQgaXMgc2VydmVkIGFzIDxDT0RFPnRleHQvcGxhaW48L0NPREU+LgotQWZ0ZXIgdGhlIGFkbWluIGZpeGVzIHRoZSBzZXJ2ZXIsIHRoZSB1c2VyIHdpbGwgaGF2ZSB0byBmbHVzaCB0aGVpciBjYWNoZXMKLWJlZm9yZSB0aGUgb2JqZWN0IHdpbGwgYmUgc2hvd24gd2l0aCB0aGUgY29ycmVjdCA8Q09ERT50ZXh0L2h0bWw8L0NPREU+Ci10eXBlLgotCi08aDM+PGEgbmFtZT0ibXNpZS1jb29raWUteTJrIj5NU0lFIENvb2tpZSBwcm9ibGVtIHdpdGggZXhwaXJ5IGRhdGUgaW4KLXRoZSB5ZWFyIDIwMDA8L2E+PC9oMz4KLQotPHA+TVNJRSB2ZXJzaW9ucyAzLjAwIGFuZCAzLjAyICh3aXRob3V0IHRoZSBZMksgcGF0Y2gpIGRvIG5vdCBoYW5kbGUKLWNvb2tpZSBleHBpcnkgZGF0ZXMgaW4gdGhlIHllYXIgMjAwMCBwcm9wZXJseS4gIFllYXJzIGFmdGVyIDIwMDAgYW5kCi1iZWZvcmUgMjAwMCB3b3JrIGZpbmUuICBUaGlzIGlzIGZpeGVkIGluIElFNC4wMSBzZXJ2aWNlIHBhY2sgMSwgYW5kIGluCi10aGUgWTJLIHBhdGNoIGZvciBJRTMuMDIuICBVc2VycyBzaG91bGQgYXZvaWQgdXNpbmcgZXhwaXJ5IGRhdGVzIGluIHRoZQoteWVhciAyMDAwLgotCi08aDM+PGEgbmFtZT0ibHlueC1uZWdvdGlhdGUtdHJhbnMiPkx5bnggaW5jb3JyZWN0bHkgYXNraW5nIGZvciB0cmFuc3BhcmVudAotY29udGVudCBuZWdvdGlhdGlvbjwvYT48L2gzPgotCi08cD5UaGUgTHlueCBicm93c2VyIHZlcnNpb25zIDIuNyBhbmQgMi44IHNlbmQgYSAibmVnb3RpYXRlOiB0cmFucyIgaGVhZGVyCi1pbiB0aGVpciByZXF1ZXN0cywgd2hpY2ggaXMgYW4gaW5kaWNhdGlvbiB0aGUgYnJvd3NlciBzdXBwb3J0cyB0cmFuc3BhcmVudAotY29udGVudCBuZWdvdGlhdGlvbiAoVENOKS4gIEhvd2V2ZXIgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBUQ04uCi1BcyBvZiB2ZXJzaW9uIDEuMy40LCBBcGFjaGUgc3VwcG9ydHMgVENOLCBhbmQgdGhpcyBjYXVzZXMgcHJvYmxlbXMgd2l0aAotdGhlc2UgdmVyc2lvbnMgb2YgTHlueC4gIEFzIGEgd29ya2Fyb3VuZCBmdXR1cmUgdmVyc2lvbnMgb2YgQXBhY2hlIHdpbGwKLWlnbm9yZSB0aGlzIGhlYWRlciB3aGVuIHNlbnQgYnkgdGhlIEx5bnggY2xpZW50LgotCi08aDM+PGEgbmFtZT0iaWU0MC12YXJ5Ij5NU0lFIDQuMCBtaXNoYW5kbGVzIFZhcnkgcmVzcG9uc2UgaGVhZGVyPC9hPjwvaDM+Ci0KLTxwPk1TSUUgNC4wIGRvZXMgbm90IGhhbmRsZSBhIFZhcnkgaGVhZGVyIHByb3Blcmx5LiAgVGhlIFZhcnkgaGVhZGVyIGlzCi1nZW5lcmF0ZWQgYnkgbW9kX3Jld3JpdGUgaW4gYXBhY2hlIDEuMy4gIFRoZSByZXN1bHQgaXMgYW4gZXJyb3IgZnJvbSBNU0lFCi1zYXlpbmcgaXQgY2Fubm90IGRvd25sb2FkIHRoZSByZXF1ZXN0ZWQgZmlsZS4gIFRoZXJlIGFyZSBtb3JlIGRldGFpbHMKLWluIDxhIGhyZWY9Imh0dHA6Ly9idWdzLmFwYWNoZS5vcmcvaW5kZXgvZnVsbC80MTE4Ij5QUiM0MTE4PC9hPi4KLTwvUD4KLTxQPgotQSB3b3JrYXJvdW5kIGlzIHRvIGFkZCB0aGUgZm9sbG93aW5nIHRvIHlvdXIgc2VydmVyJ3MgY29uZmlndXJhdGlvbgotZmlsZXM6Ci08L1A+Ci08UFJFPgotICAgIEJyb3dzZXJNYXRjaCAiTVNJRSA0XC4wIiBmb3JjZS1uby12YXJ5Ci08L1BSRT4KLTxQPgotKFRoaXMgd29ya2Fyb3VuZCBpcyBvbmx5IGF2YWlsYWJsZSB3aXRoIHJlbGVhc2VzIDxTVFJPTkc+YWZ0ZXI8L1NUUk9ORz4KLTEuMy42IG9mIHRoZSBBcGFjaGUgV2ViIHNlcnZlci4pCi08L1A+Ci0KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbWlzYy9wZXJmLXR1bmluZy5odG1sIGIvZG9jcy9tYW51YWwvbWlzYy9wZXJmLXR1bmluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGNhNDg5Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21pc2MvcGVyZi10dW5pbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg3MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotIDxUSVRMRT5BcGFjaGUgUGVyZm9ybWFuY2UgTm90ZXM8L1RJVExFPgotPC9IRUFEPgotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTxIMT5BcGFjaGUgUGVyZm9ybWFuY2UgTm90ZXM8L0gxPgotCi08UD5BdXRob3I6IERlYW4gR2F1ZGV0Ci0KLTxIMz5JbnRyb2R1Y3Rpb248L0gzPgotPFA+QXBhY2hlIGlzIGEgZ2VuZXJhbCB3ZWJzZXJ2ZXIsIHdoaWNoIGlzIGRlc2lnbmVkIHRvIGJlIGNvcnJlY3QgZmlyc3QsIGFuZAotZmFzdCBzZWNvbmQuICBFdmVuIHNvLCBpdHMgcGVyZm9ybWFuY2UgaXMgcXVpdGUgc2F0aXNmYWN0b3J5LiAgTW9zdAotc2l0ZXMgaGF2ZSBsZXNzIHRoYW4gMTBNYml0cyBvZiBvdXRnb2luZyBiYW5kd2lkdGgsIHdoaWNoIEFwYWNoZSBjYW4KLWZpbGwgdXNpbmcgb25seSBhIGxvdyBlbmQgUGVudGl1bS1iYXNlZCB3ZWJzZXJ2ZXIuICBJbiBwcmFjdGljZSBzaXRlcwotd2l0aCBtb3JlIGJhbmR3aWR0aCByZXF1aXJlIG1vcmUgdGhhbiBvbmUgbWFjaGluZSB0byBmaWxsIHRoZSBiYW5kd2lkdGgKLWR1ZSB0byBvdGhlciBjb25zdHJhaW50cyAoc3VjaCBhcyBDR0kgb3IgZGF0YWJhc2UgdHJhbnNhY3Rpb24gb3ZlcmhlYWQpLgotRm9yIHRoZXNlIHJlYXNvbnMgdGhlIGRldmVsb3BtZW50IGZvY3VzIGhhcyBiZWVuIG1vc3RseSBvbiBjb3JyZWN0bmVzcwotYW5kIGNvbmZpZ3VyYWJpbGl0eS4KLQotPFA+VW5mb3J0dW5hdGVseSBtYW55IGZvbGtzIG92ZXJsb29rIHRoZXNlIGZhY3RzIGFuZCBjaXRlIHJhdyBwZXJmb3JtYW5jZQotbnVtYmVycyBhcyBpZiB0aGV5IGFyZSBzb21lIGluZGljYXRpb24gb2YgdGhlIHF1YWxpdHkgb2YgYSB3ZWIgc2VydmVyCi1wcm9kdWN0LiAgVGhlcmUgaXMgYSBiYXJlIG1pbmltdW0gcGVyZm9ybWFuY2UgdGhhdCBpcyBhY2NlcHRhYmxlLCBiZXlvbmQKLXRoYXQgZXh0cmEgc3BlZWQgb25seSBjYXRlcnMgdG8gYSBtdWNoIHNtYWxsZXIgc2VnbWVudCBvZiB0aGUgbWFya2V0LgotQnV0IGluIG9yZGVyIHRvIGF2b2lkIHRoaXMgaHVyZGxlIHRvIHRoZSBhY2NlcHRhbmNlIG9mIEFwYWNoZSBpbiBzb21lCi1tYXJrZXRzLCBlZmZvcnQgd2FzIHB1dCBpbnRvIEFwYWNoZSAxLjMgdG8gYnJpbmcgcGVyZm9ybWFuY2UgdXAgdG8gYQotcG9pbnQgd2hlcmUgdGhlIGRpZmZlcmVuY2Ugd2l0aCBvdGhlciBoaWdoLWVuZCB3ZWJzZXJ2ZXJzIGlzIG1pbmltYWwuCi0KLTxQPkZpbmFsbHkgdGhlcmUgYXJlIHRoZSBmb2xrcyB3aG8ganVzdCBwbGFpbiB3YW50IHRvIHNlZSBob3cgZmFzdCBzb21ldGhpbmcKLWNhbiBnby4gIFRoZSBhdXRob3IgZmFsbHMgaW50byB0aGlzIGNhdGVnb3J5LiAgVGhlIHJlc3Qgb2YgdGhpcyBkb2N1bWVudAotaXMgZGVkaWNhdGVkIHRvIHRoZXNlIGZvbGtzIHdobyB3YW50IHRvIHNxdWVlemUgZXZlcnkgbGFzdCBiaXQgb2YKLXBlcmZvcm1hbmNlIG91dCBvZiBBcGFjaGUncyBjdXJyZW50IG1vZGVsLCBhbmQgd2FudCB0byB1bmRlcnN0YW5kIHdoeQotaXQgZG9lcyBzb21lIHRoaW5ncyB3aGljaCBzbG93IGl0IGRvd24uCi0KLTxQPk5vdGUgdGhhdCB0aGlzIGlzIHRhaWxvcmVkIHRvd2FyZHMgQXBhY2hlIDEuMyBvbiBVbml4LiAgU29tZSBvZiBpdCBhcHBsaWVzCi10byBBcGFjaGUgb24gTlQuICBBcGFjaGUgb24gTlQgaGFzIG5vdCBiZWVuIHR1bmVkIGZvciBwZXJmb3JtYW5jZSB5ZXQsCi1pbiBmYWN0IGl0IHByb2JhYmx5IHBlcmZvcm1zIHZlcnkgcG9vcmx5IGJlY2F1c2UgTlQgcGVyZm9ybWFuY2UgcmVxdWlyZXMKLWEgZGlmZmVyZW50IHByb2dyYW1taW5nIG1vZGVsLgotCi08SDM+SGFyZHdhcmUgYW5kIE9wZXJhdGluZyBTeXN0ZW0gSXNzdWVzPC9IMz4KLQotPFA+VGhlIHNpbmdsZSBiaWdnZXN0IGhhcmR3YXJlIGlzc3VlIGFmZmVjdGluZyB3ZWJzZXJ2ZXIgcGVyZm9ybWFuY2UKLWlzIFJBTS4gIEEgd2Vic2VydmVyIHNob3VsZCBuZXZlciBldmVyIGhhdmUgdG8gc3dhcCwgc3dhcHBpbmcgaW5jcmVhc2VzCi10aGUgbGF0ZW5jeSBvZiBlYWNoIHJlcXVlc3QgYmV5b25kIGEgcG9pbnQgdGhhdCB1c2VycyBjb25zaWRlciAiZmFzdAotZW5vdWdoIi4gIFRoaXMgY2F1c2VzIHVzZXJzIHRvIGhpdCBzdG9wIGFuZCByZWxvYWQsIGZ1cnRoZXIgaW5jcmVhc2luZwotdGhlIGxvYWQuICBZb3UgY2FuLCBhbmQgc2hvdWxkLCBjb250cm9sIHRoZSA8Q09ERT5NYXhDbGllbnRzPC9DT0RFPgotc2V0dGluZyBzbyB0aGF0IHlvdXIgc2VydmVyIGRvZXMgbm90IHNwYXduIHNvIG1hbnkgY2hpbGRyZW4gaXQgc3RhcnRzCi1zd2FwcGluZy4KLQotPFA+QmV5b25kIHRoYXQgdGhlIHJlc3QgaXMgbXVuZGFuZTogIGdldCBhIGZhc3QgZW5vdWdoIENQVSwgYSBmYXN0IGVub3VnaAotbmV0d29yayBjYXJkLCBhbmQgZmFzdCBlbm91Z2ggZGlza3MsIHdoZXJlICJmYXN0IGVub3VnaCIgaXMgc29tZXRoaW5nCi10aGF0IG5lZWRzIHRvIGJlIGRldGVybWluZWQgYnkgZXhwZXJpbWVudGF0aW9uLgotCi08UD5PcGVyYXRpbmcgc3lzdGVtIGNob2ljZSBpcyBsYXJnZWx5IGEgbWF0dGVyIG9mIGxvY2FsIGNvbmNlcm5zLiAgQnV0Ci1hIGdlbmVyYWwgZ3VpZGVsaW5lIGlzIHRvIGFsd2F5cyBhcHBseSB0aGUgbGF0ZXN0IHZlbmRvciBUQ1AvSVAgcGF0Y2hlcy4KLUhUVFAgc2VydmluZyBjb21wbGV0ZWx5IGJyZWFrcyBtYW55IG9mIHRoZSBhc3N1bXB0aW9ucyBidWlsdCBpbnRvIFVuaXgKLWtlcm5lbHMgdXAgdGhyb3VnaCAxOTk0IGFuZCBldmVuIDE5OTUuICBHb29kIGNob2ljZXMgaW5jbHVkZQotcmVjZW50IEZyZWVCU0QsIGFuZCBMaW51eC4KLQotPEgzPlJ1bi1UaW1lIENvbmZpZ3VyYXRpb24gSXNzdWVzPC9IMz4KLQotPEg0Pkhvc3RuYW1lTG9va3VwczwvSDQ+Ci08UD5QcmlvciB0byBBcGFjaGUgMS4zLCA8Q09ERT5Ib3N0bmFtZUxvb2t1cHM8L0NPREU+IGRlZmF1bHRlZCB0byBPbi4KLVRoaXMgYWRkcyBsYXRlbmN5Ci10byBldmVyeSByZXF1ZXN0IGJlY2F1c2UgaXQgcmVxdWlyZXMgYSBETlMgbG9va3VwIHRvIGNvbXBsZXRlIGJlZm9yZQotdGhlIHJlcXVlc3QgaXMgZmluaXNoZWQuICBJbiBBcGFjaGUgMS4zIHRoaXMgc2V0dGluZyBkZWZhdWx0cyB0byBPZmYuCi1Ib3dldmVyICgxLjMgb3IgbGF0ZXIpLCBpZiB5b3UgdXNlIGFueSA8Q09ERT5hbGxvdyBmcm9tIGRvbWFpbjwvQ09ERT4gb3IKLTxDT0RFPmRlbnkgZnJvbSBkb21haW48L0NPREU+IGRpcmVjdGl2ZXMgdGhlbiB5b3Ugd2lsbCBwYXkgZm9yIGEKLWRvdWJsZSByZXZlcnNlIEROUyBsb29rdXAgKGEgcmV2ZXJzZSwgZm9sbG93ZWQgYnkgYSBmb3J3YXJkIHRvIG1ha2Ugc3VyZQotdGhhdCB0aGUgcmV2ZXJzZSBpcyBub3QgYmVpbmcgc3Bvb2ZlZCkuICBTbyBmb3IgdGhlIGhpZ2hlc3QgcGVyZm9ybWFuY2UKLWF2b2lkIHVzaW5nIHRoZXNlIGRpcmVjdGl2ZXMgKGl0J3MgZmluZSB0byB1c2UgSVAgYWRkcmVzc2VzIHJhdGhlciB0aGFuCi1kb21haW4gbmFtZXMpLgotCi08UD5Ob3RlIHRoYXQgaXQncyBwb3NzaWJsZSB0byBzY29wZSB0aGUgZGlyZWN0aXZlcywgc3VjaCBhcyB3aXRoaW4KLWEgPENPREU+Jmx0O0xvY2F0aW9uIC9zZXJ2ZXItc3RhdHVzJmd0OzwvQ09ERT4gc2VjdGlvbi4gIEluIHRoaXMKLWNhc2UgdGhlIEROUyBsb29rdXBzIGFyZSBvbmx5IHBlcmZvcm1lZCBvbiByZXF1ZXN0cyBtYXRjaGluZyB0aGUKLWNyaXRlcmlhLiAgSGVyZSdzIGFuIGV4YW1wbGUgd2hpY2ggZGlzYWJsZXMKLWxvb2t1cHMgZXhjZXB0IGZvciAuaHRtbCBhbmQgLmNnaSBmaWxlczoKLQotPEJMT0NLUVVPVEU+PFBSRT4KLUhvc3RuYW1lTG9va3VwcyBvZmYKLSZsdDtGaWxlcyB+ICJcLihodG1sfGNnaSkkJmd0OwotICAgIEhvc3RuYW1lTG9va3VwcyBvbgotJmx0Oy9GaWxlcyZndDsKLTwvUFJFPjwvQkxPQ0tRVU9URT4KLQotQnV0IGV2ZW4gc3RpbGwsIGlmIHlvdSBqdXN0IG5lZWQgRE5TIG5hbWVzCi1pbiBzb21lIENHSXMgeW91IGNvdWxkIGNvbnNpZGVyIGRvaW5nIHRoZQotPENPREU+Z2V0aG9zdGJ5bmFtZTwvQ09ERT4gY2FsbCBpbiB0aGUgc3BlY2lmaWMgQ0dJcyB0aGF0IG5lZWQgaXQuCi0KLTxIND5Gb2xsb3dTeW1MaW5rcyBhbmQgU3ltTGlua3NJZk93bmVyTWF0Y2g8L0g0PgotPFA+V2hlcmV2ZXIgaW4geW91ciBVUkwtc3BhY2UgeW91IGRvIG5vdCBoYXZlIGFuCi08Q09ERT5PcHRpb25zIEZvbGxvd1N5bUxpbmtzPC9DT0RFPiwgb3IgeW91IGRvIGhhdmUgYW4KLTxDT0RFPk9wdGlvbnMgU3ltTGlua3NJZk93bmVyTWF0Y2g8L0NPREU+IEFwYWNoZSB3aWxsIGhhdmUgdG8KLWlzc3VlIGV4dHJhIHN5c3RlbSBjYWxscyB0byBjaGVjayB1cCBvbiBzeW1saW5rcy4gIE9uZSBleHRyYSBjYWxsIHBlcgotZmlsZW5hbWUgY29tcG9uZW50LiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYWQ6Ci0KLTxCTE9DS1FVT1RFPjxQUkU+Ci1Eb2N1bWVudFJvb3QgL3d3dy9odGRvY3MKLSZsdDtEaXJlY3RvcnkgLyZndDsKLSAgICBPcHRpb25zIFN5bUxpbmtzSWZPd25lck1hdGNoCi0mbHQ7L0RpcmVjdG9yeSZndDsKLTwvUFJFPjwvQkxPQ0tRVU9URT4KLQotYW5kIGEgcmVxdWVzdCBpcyBtYWRlIGZvciB0aGUgVVJJIDxDT0RFPi9pbmRleC5odG1sPC9DT0RFPi4KLVRoZW4gQXBhY2hlIHdpbGwgcGVyZm9ybSA8Q09ERT5sc3RhdCgyKTwvQ09ERT4gb24gPENPREU+L3d3dzwvQ09ERT4sCi08Q09ERT4vd3d3L2h0ZG9jczwvQ09ERT4sIGFuZCA8Q09ERT4vd3d3L2h0ZG9jcy9pbmRleC5odG1sPC9DT0RFPi4gIFRoZQotcmVzdWx0cyBvZiB0aGVzZSA8Q09ERT5sc3RhdHM8L0NPREU+IGFyZSBuZXZlciBjYWNoZWQsCi1zbyB0aGV5IHdpbGwgb2NjdXIgb24gZXZlcnkgc2luZ2xlIHJlcXVlc3QuICBJZiB5b3UgcmVhbGx5IGRlc2lyZSB0aGUKLXN5bWxpbmtzIHNlY3VyaXR5IGNoZWNraW5nIHlvdSBjYW4gZG8gc29tZXRoaW5nIGxpa2UgdGhpczoKLQotPEJMT0NLUVVPVEU+PFBSRT4KLURvY3VtZW50Um9vdCAvd3d3L2h0ZG9jcwotJmx0O0RpcmVjdG9yeSAvJmd0OwotICAgIE9wdGlvbnMgRm9sbG93U3ltTGlua3MKLSZsdDsvRGlyZWN0b3J5Jmd0OwotJmx0O0RpcmVjdG9yeSAvd3d3L2h0ZG9jcyZndDsKLSAgICBPcHRpb25zIC1Gb2xsb3dTeW1MaW5rcyArU3ltTGlua3NJZk93bmVyTWF0Y2gKLSZsdDsvRGlyZWN0b3J5Jmd0OwotPC9QUkU+PC9CTE9DS1FVT1RFPgotCi1UaGlzIGF0IGxlYXN0IGF2b2lkcyB0aGUgZXh0cmEgY2hlY2tzIGZvciB0aGUgPENPREU+RG9jdW1lbnRSb290PC9DT0RFPgotcGF0aC4gIE5vdGUgdGhhdCB5b3UnbGwgbmVlZCB0byBhZGQgc2ltaWxhciBzZWN0aW9ucyBpZiB5b3UgaGF2ZSBhbnkKLTxDT0RFPkFsaWFzPC9DT0RFPiBvciA8Q09ERT5SZXdyaXRlUnVsZTwvQ09ERT4gcGF0aHMgb3V0c2lkZSBvZiB5b3VyCi1kb2N1bWVudCByb290LiAgRm9yIGhpZ2hlc3QgcGVyZm9ybWFuY2UsIGFuZCBubyBzeW1saW5rIHByb3RlY3Rpb24sCi1zZXQgPENPREU+Rm9sbG93U3ltTGlua3M8L0NPREU+IGV2ZXJ5d2hlcmUsIGFuZCBuZXZlciBzZXQKLTxDT0RFPlN5bUxpbmtzSWZPd25lck1hdGNoPC9DT0RFPi4KLQotPEg0PkFsbG93T3ZlcnJpZGU8L0g0PgotCi08UD5XaGVyZXZlciBpbiB5b3VyIFVSTC1zcGFjZSB5b3UgYWxsb3cgb3ZlcnJpZGVzICh0eXBpY2FsbHkKLTxDT0RFPi5odGFjY2VzczwvQ09ERT4gZmlsZXMpIEFwYWNoZSB3aWxsIGF0dGVtcHQgdG8gb3BlbgotPENPREU+Lmh0YWNjZXNzPC9DT0RFPiBmb3IgZWFjaCBmaWxlbmFtZSBjb21wb25lbnQuICBGb3IgZXhhbXBsZSwKLQotPEJMT0NLUVVPVEU+PFBSRT4KLURvY3VtZW50Um9vdCAvd3d3L2h0ZG9jcwotJmx0O0RpcmVjdG9yeSAvJmd0OwotICAgIEFsbG93T3ZlcnJpZGUgYWxsCi0mbHQ7L0RpcmVjdG9yeSZndDsKLTwvUFJFPjwvQkxPQ0tRVU9URT4KLQotYW5kIGEgcmVxdWVzdCBpcyBtYWRlIGZvciB0aGUgVVJJIDxDT0RFPi9pbmRleC5odG1sPC9DT0RFPi4gIFRoZW4KLUFwYWNoZSB3aWxsIGF0dGVtcHQgdG8gb3BlbiA8Q09ERT4vLmh0YWNjZXNzPC9DT0RFPiwKLTxDT0RFPi93d3cvLmh0YWNjZXNzPC9DT0RFPiwgYW5kIDxDT0RFPi93d3cvaHRkb2NzLy5odGFjY2VzczwvQ09ERT4uCi1UaGUgc29sdXRpb25zIGFyZSBzaW1pbGFyIHRvIHRoZSBwcmV2aW91cyBjYXNlIG9mIDxDT0RFPk9wdGlvbnMKLUZvbGxvd1N5bUxpbmtzPC9DT0RFPi4gIEZvciBoaWdoZXN0IHBlcmZvcm1hbmNlIHVzZQotPENPREU+QWxsb3dPdmVycmlkZSBOb25lPC9DT0RFPiBldmVyeXdoZXJlIGluIHlvdXIgZmlsZXN5c3RlbS4KLQotPEg0Pk5lZ290aWF0aW9uPC9IND4KLQotPFA+SWYgYXQgYWxsIHBvc3NpYmxlLCBhdm9pZCBjb250ZW50LW5lZ290aWF0aW9uIGlmIHlvdSdyZSByZWFsbHkKLWludGVyZXN0ZWQgaW4gZXZlcnkgbGFzdCBvdW5jZSBvZiBwZXJmb3JtYW5jZS4gIEluIHByYWN0aWNlIHRoZQotYmVuZWZpdHMgb2YgbmVnb3RpYXRpb24gb3V0d2VpZ2ggdGhlIHBlcmZvcm1hbmNlIHBlbmFsdGllcy4gIFRoZXJlJ3MKLW9uZSBjYXNlIHdoZXJlIHlvdSBjYW4gc3BlZWQgdXAgdGhlIHNlcnZlci4gIEluc3RlYWQgb2YgdXNpbmcKLWEgd2lsZGNhcmQgc3VjaCBhczoKLQotPEJMT0NLUVVPVEU+PFBSRT4KLURpcmVjdG9yeUluZGV4IGluZGV4Ci08L1BSRT48L0JMT0NLUVVPVEU+Ci0KLVVzZSBhIGNvbXBsZXRlIGxpc3Qgb2Ygb3B0aW9uczoKLQotPEJMT0NLUVVPVEU+PFBSRT4KLURpcmVjdG9yeUluZGV4IGluZGV4LmNnaSBpbmRleC5wbCBpbmRleC5zaHRtbCBpbmRleC5odG1sCi08L1BSRT48L0JMT0NLUVVPVEU+Ci0KLXdoZXJlIHlvdSBsaXN0IHRoZSBtb3N0IGNvbW1vbiBjaG9pY2UgZmlyc3QuCi0KLTxIND5Qcm9jZXNzIENyZWF0aW9uPC9IND4KLQotPFA+UHJpb3IgdG8gQXBhY2hlIDEuMyB0aGUgPENPREU+TWluU3BhcmVTZXJ2ZXJzPC9DT0RFPiwKLTxDT0RFPk1heFNwYXJlU2VydmVyczwvQ09ERT4sIGFuZCA8Q09ERT5TdGFydFNlcnZlcnM8L0NPREU+IHNldHRpbmdzCi1hbGwgaGFkIGRyYXN0aWMgZWZmZWN0cyBvbiBiZW5jaG1hcmsgcmVzdWx0cy4gIEluIHBhcnRpY3VsYXIsIEFwYWNoZQotcmVxdWlyZWQgYSAicmFtcC11cCIgcGVyaW9kIGluIG9yZGVyIHRvIHJlYWNoIGEgbnVtYmVyIG9mIGNoaWxkcmVuCi1zdWZmaWNpZW50IHRvIHNlcnZlIHRoZSBsb2FkIGJlaW5nIGFwcGxpZWQuICBBZnRlciB0aGUgaW5pdGlhbAotc3Bhd25pbmcgb2YgPENPREU+U3RhcnRTZXJ2ZXJzPC9DT0RFPiBjaGlsZHJlbiwgb25seSBvbmUgY2hpbGQgcGVyCi1zZWNvbmQgd291bGQgYmUgY3JlYXRlZCB0byBzYXRpc2Z5IHRoZSA8Q09ERT5NaW5TcGFyZVNlcnZlcnM8L0NPREU+Ci1zZXR0aW5nLiAgU28gYSBzZXJ2ZXIgYmVpbmcgYWNjZXNzZWQgYnkgMTAwIHNpbXVsdGFuZW91cyBjbGllbnRzLAotdXNpbmcgdGhlIGRlZmF1bHQgPENPREU+U3RhcnRTZXJ2ZXJzPC9DT0RFPiBvZiA1IHdvdWxkIHRha2Ugb24KLXRoZSBvcmRlciA5NSBzZWNvbmRzIHRvIHNwYXduIGVub3VnaCBjaGlsZHJlbiB0byBoYW5kbGUgdGhlIGxvYWQuICBUaGlzCi13b3JrcyBmaW5lIGluIHByYWN0aWNlIG9uIHJlYWwtbGlmZSBzZXJ2ZXJzLCBiZWNhdXNlIHRoZXkgYXJlbid0IHJlc3RhcnRlZAotZnJlcXVlbnRseS4gIEJ1dCBkb2VzIHJlYWxseSBwb29ybHkgb24gYmVuY2htYXJrcyB3aGljaCBtaWdodCBvbmx5IHJ1bgotZm9yIHRlbiBtaW51dGVzLgotCi08UD5UaGUgb25lLXBlci1zZWNvbmQgcnVsZSB3YXMgaW1wbGVtZW50ZWQgaW4gYW4gZWZmb3J0IHRvIGF2b2lkCi1zd2FtcGluZyB0aGUgbWFjaGluZSB3aXRoIHRoZSBzdGFydHVwIG9mIG5ldyBjaGlsZHJlbi4gIElmIHRoZSBtYWNoaW5lCi1pcyBidXN5IHNwYXduaW5nIGNoaWxkcmVuIGl0IGNhbid0IHNlcnZpY2UgcmVxdWVzdHMuICBCdXQgaXQgaGFzIHN1Y2gKLWEgZHJhc3RpYyBlZmZlY3Qgb24gdGhlIHBlcmNlaXZlZCBwZXJmb3JtYW5jZSBvZiBBcGFjaGUgdGhhdCBpdCBoYWQKLXRvIGJlIHJlcGxhY2VkLiAgQXMgb2YgQXBhY2hlIDEuMywKLXRoZSBjb2RlIHdpbGwgcmVsYXggdGhlIG9uZS1wZXItc2Vjb25kIHJ1bGUuICBJdAotd2lsbCBzcGF3biBvbmUsIHdhaXQgYSBzZWNvbmQsIHRoZW4gc3Bhd24gdHdvLCB3YWl0IGEgc2Vjb25kLCB0aGVuIHNwYXduCi1mb3VyLCBhbmQgaXQgd2lsbCBjb250aW51ZSBleHBvbmVudGlhbGx5IHVudGlsIGl0IGlzIHNwYXduaW5nIDMyIGNoaWxkcmVuCi1wZXIgc2Vjb25kLiAgSXQgd2lsbCBzdG9wIHdoZW5ldmVyIGl0IHNhdGlzZmllcyB0aGUKLTxDT0RFPk1pblNwYXJlU2VydmVyczwvQ09ERT4gc2V0dGluZy4KLQotPFA+VGhpcyBhcHBlYXJzIHRvIGJlIHJlc3BvbnNpdmUgZW5vdWdoIHRoYXQgaXQncwotYWxtb3N0IHVubmVjZXNzYXJ5IHRvIHR3aWRkbGUgdGhlIDxDT0RFPk1pblNwYXJlU2VydmVyczwvQ09ERT4sCi08Q09ERT5NYXhTcGFyZVNlcnZlcnM8L0NPREU+IGFuZCA8Q09ERT5TdGFydFNlcnZlcnM8L0NPREU+IGtub2JzLiAgV2hlbgotbW9yZSB0aGFuIDQgY2hpbGRyZW4gYXJlIHNwYXduZWQgcGVyIHNlY29uZCwgYSBtZXNzYWdlIHdpbGwgYmUgZW1pdHRlZAotdG8gdGhlIDxDT0RFPkVycm9yTG9nPC9DT0RFPi4gIElmIHlvdSBzZWUgYSBsb3Qgb2YgdGhlc2UgZXJyb3JzIHRoZW4KLWNvbnNpZGVyIHR1bmluZyB0aGVzZSBzZXR0aW5ncy4gIFVzZSB0aGUgPENPREU+bW9kX3N0YXR1czwvQ09ERT4gb3V0cHV0Ci1hcyBhIGd1aWRlLgotCi08UD5SZWxhdGVkIHRvIHByb2Nlc3MgY3JlYXRpb24gaXMgcHJvY2VzcyBkZWF0aCBpbmR1Y2VkIGJ5IHRoZQotPENPREU+TWF4UmVxdWVzdHNQZXJDaGlsZDwvQ09ERT4gc2V0dGluZy4gIEJ5IGRlZmF1bHQgdGhpcyBpcyAwLCB3aGljaAotbWVhbnMgdGhhdCB0aGVyZSBpcyBubyBsaW1pdCB0byB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzIGhhbmRsZWQKLXBlciBjaGlsZC4gSWYgeW91ciBjb25maWd1cmF0aW9uIGN1cnJlbnRseSBoYXMgdGhpcyBzZXQgdG8gc29tZQotdmVyeSBsb3cgbnVtYmVyLCBzdWNoIGFzIDMwLCB5b3UgbWF5IHdhbnQgdG8gYnVtcCB0aGlzIHVwIHNpZ25pZmljYW50bHkuCi1JZiB5b3UgYXJlIHJ1bm5pbmcgU3VuT1Mgb3IgYW4gb2xkIHZlcnNpb24gb2YgU29sYXJpcywgbGltaXQgdGhpcwotdG8gMTAwMDAgb3Igc28gYmVjYXVzZSBvZiBtZW1vcnkgbGVha3MuCi0KLTxQPldoZW4ga2VlcC1hbGl2ZXMgYXJlIGluIHVzZSwgY2hpbGRyZW4gd2lsbCBiZSBrZXB0IGJ1c3kKLWRvaW5nIG5vdGhpbmcgd2FpdGluZyBmb3IgbW9yZSByZXF1ZXN0cyBvbiB0aGUgYWxyZWFkeSBvcGVuCi1jb25uZWN0aW9uLiAgVGhlIGRlZmF1bHQgPENPREU+S2VlcEFsaXZlVGltZW91dDwvQ09ERT4gb2YKLTE1IHNlY29uZHMgYXR0ZW1wdHMgdG8gbWluaW1pemUgdGhpcyBlZmZlY3QuICBUaGUgdHJhZGVvZmYKLWhlcmUgaXMgYmV0d2VlbiBuZXR3b3JrIGJhbmR3aWR0aCBhbmQgc2VydmVyIHJlc291cmNlcy4KLUluIG5vIGV2ZW50IHNob3VsZCB5b3UgcmFpc2UgdGhpcyBhYm92ZSBhYm91dCA2MCBzZWNvbmRzLCBhcwotPEEgSFJFRj0iaHR0cDovL3d3dy5yZXNlYXJjaC5kaWdpdGFsLmNvbS93cmwvdGVjaHJlcG9ydHMvYWJzdHJhY3RzLzk1LjQuaHRtbCIKLT5tb3N0IG9mIHRoZSBiZW5lZml0cyBhcmUgbG9zdDwvQT4uCi0KLTxIMz5Db21waWxlLVRpbWUgQ29uZmlndXJhdGlvbiBJc3N1ZXM8L0gzPgotCi08SDQ+bW9kX3N0YXR1cyBhbmQgRXh0ZW5kZWRTdGF0dXMgT248L0g0PgotCi08UD5JZiB5b3UgaW5jbHVkZSA8Q09ERT5tb2Rfc3RhdHVzPC9DT0RFPgotYW5kIHlvdSBhbHNvIHNldCA8Q09ERT5FeHRlbmRlZFN0YXR1cyBPbjwvQ09ERT4gd2hlbiBidWlsZGluZyBhbmQgcnVubmluZwotQXBhY2hlLCB0aGVuIG9uIGV2ZXJ5IHJlcXVlc3QgQXBhY2hlIHdpbGwgcGVyZm9ybSB0d28gY2FsbHMgdG8KLTxDT0RFPmdldHRpbWVvZmRheSgyKTwvQ09ERT4gKG9yIDxDT0RFPnRpbWVzKDIpPC9DT0RFPiBkZXBlbmRpbmcKLW9uIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSksIGFuZCAocHJlLTEuMykgc2V2ZXJhbCBleHRyYSBjYWxscyB0bwotPENPREU+dGltZSgyKTwvQ09ERT4uICBUaGlzIGlzIGFsbCBkb25lIHNvIHRoYXQgdGhlIHN0YXR1cyByZXBvcnQKLWNvbnRhaW5zIHRpbWluZyBpbmRpY2F0aW9ucy4gIEZvciBoaWdoZXN0IHBlcmZvcm1hbmNlLCBzZXQKLTxDT0RFPkV4dGVuZGVkU3RhdHVzIG9mZjwvQ09ERT4gKHdoaWNoIGlzIHRoZSBkZWZhdWx0KS4KLQotPEg0PmFjY2VwdCBTZXJpYWxpemF0aW9uIC0gbXVsdGlwbGUgc29ja2V0czwvSDQ+Ci0KLTxQPlRoaXMgZGlzY3Vzc2VzIGEgc2hvcnRjb21pbmcgaW4gdGhlIFVuaXggc29ja2V0IEFQSS4KLVN1cHBvc2UgeW91cgotd2ViIHNlcnZlciB1c2VzIG11bHRpcGxlIDxDT0RFPkxpc3RlbjwvQ09ERT4gc3RhdGVtZW50cyB0byBsaXN0ZW4gb24KLWVpdGhlciBtdWx0aXBsZSBwb3J0cyBvciBtdWx0aXBsZSBhZGRyZXNzZXMuICBJbiBvcmRlciB0byB0ZXN0IGVhY2gKLXNvY2tldCB0byBzZWUgaWYgYSBjb25uZWN0aW9uIGlzIHJlYWR5IEFwYWNoZSB1c2VzIDxDT0RFPnNlbGVjdCgyKTwvQ09ERT4uCi08Q09ERT5zZWxlY3QoMik8L0NPREU+IGluZGljYXRlcyB0aGF0IGEgc29ja2V0IGhhcyA8RU0+emVybzwvRU0+IG9yCi08RU0+YXQgbGVhc3Qgb25lPC9FTT4gY29ubmVjdGlvbiB3YWl0aW5nIG9uIGl0LiAgQXBhY2hlJ3MgbW9kZWwgaW5jbHVkZXMKLW11bHRpcGxlIGNoaWxkcmVuLCBhbmQgYWxsIHRoZSBpZGxlIG9uZXMgdGVzdCBmb3IgbmV3IGNvbm5lY3Rpb25zIGF0IHRoZQotc2FtZSB0aW1lLiAgQSBuYWl2ZSBpbXBsZW1lbnRhdGlvbiBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzCi0odGhlc2UgZXhhbXBsZXMgZG8gbm90IG1hdGNoIHRoZSBjb2RlLCB0aGV5J3JlIGNvbnRyaXZlZCBmb3IKLXBlZGFnb2dpY2FsIHB1cnBvc2VzKToKLQotPEJMT0NLUVVPVEU+PFBSRT4KLSAgICBmb3IgKDs7KSB7Ci0JZm9yICg7OykgewotCSAgICBmZF9zZXQgYWNjZXB0X2ZkczsKLQotCSAgICBGRF9aRVJPICgmYWNjZXB0X2Zkcyk7Ci0JICAgIGZvciAoaSA9IGZpcnN0X3NvY2tldDsgaSAmbHQ7PSBsYXN0X3NvY2tldDsgKytpKSB7Ci0JCUZEX1NFVCAoaSwgJmFjY2VwdF9mZHMpOwotCSAgICB9Ci0JICAgIHJjID0gc2VsZWN0IChsYXN0X3NvY2tldCsxLCAmYWNjZXB0X2ZkcywgTlVMTCwgTlVMTCwgTlVMTCk7Ci0JICAgIGlmIChyYyAmbHQ7IDEpIGNvbnRpbnVlOwotCSAgICBuZXdfY29ubmVjdGlvbiA9IC0xOwotCSAgICBmb3IgKGkgPSBmaXJzdF9zb2NrZXQ7IGkgJmx0Oz0gbGFzdF9zb2NrZXQ7ICsraSkgewotCQlpZiAoRkRfSVNTRVQgKGksICZhY2NlcHRfZmRzKSkgewotCQkgICAgbmV3X2Nvbm5lY3Rpb24gPSBhY2NlcHQgKGksIE5VTEwsIE5VTEwpOwotCQkgICAgaWYgKG5ld19jb25uZWN0aW9uICE9IC0xKSBicmVhazsKLQkJfQotCSAgICB9Ci0JICAgIGlmIChuZXdfY29ubmVjdGlvbiAhPSAtMSkgYnJlYWs7Ci0JfQotCXByb2Nlc3MgdGhlIG5ld19jb25uZWN0aW9uOwotICAgIH0KLTwvUFJFPjwvQkxPQ0tRVU9URT4KLQotQnV0IHRoaXMgbmFpdmUgaW1wbGVtZW50YXRpb24gaGFzIGEgc2VyaW91cyBzdGFydmF0aW9uIHByb2JsZW0uICBSZWNhbGwKLXRoYXQgbXVsdGlwbGUgY2hpbGRyZW4gZXhlY3V0ZSB0aGlzIGxvb3AgYXQgdGhlIHNhbWUgdGltZSwgYW5kIHNvIG11bHRpcGxlCi1jaGlsZHJlbiB3aWxsIGJsb2NrIGF0IDxDT0RFPnNlbGVjdDwvQ09ERT4gd2hlbiB0aGV5IGFyZSBpbiBiZXR3ZWVuCi1yZXF1ZXN0cy4gIEFsbCB0aG9zZSBibG9ja2VkIGNoaWxkcmVuIHdpbGwgYXdha2VuIGFuZCByZXR1cm4gZnJvbQotPENPREU+c2VsZWN0PC9DT0RFPiB3aGVuIGEgc2luZ2xlIHJlcXVlc3QgYXBwZWFycyBvbiBhbnkgc29ja2V0Ci0odGhlIG51bWJlciBvZiBjaGlsZHJlbiB3aGljaCBhd2FrZW4gdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgb3BlcmF0aW5nCi1zeXN0ZW0gYW5kIHRpbWluZyBpc3N1ZXMpLgotVGhleSB3aWxsIGFsbCB0aGVuIGZhbGwgZG93biBpbnRvIHRoZSBsb29wIGFuZCB0cnkgdG8gPENPREU+YWNjZXB0PC9DT0RFPgotdGhlIGNvbm5lY3Rpb24uICBCdXQgb25seSBvbmUgd2lsbCBzdWNjZWVkIChhc3N1bWluZyB0aGVyZSdzIHN0aWxsIG9ubHkKLW9uZSBjb25uZWN0aW9uIHJlYWR5KSwgdGhlIHJlc3Qgd2lsbCBiZSA8RU0+YmxvY2tlZDwvRU0+IGluCi08Q09ERT5hY2NlcHQ8L0NPREU+LgotVGhpcyBlZmZlY3RpdmVseSBsb2NrcyB0aG9zZSBjaGlsZHJlbiBpbnRvIHNlcnZpbmcgcmVxdWVzdHMgZnJvbSB0aGF0Ci1vbmUgc29ja2V0IGFuZCBubyBvdGhlciBzb2NrZXRzLCBhbmQgdGhleSdsbCBiZSBzdHVjayB0aGVyZSB1bnRpbCBlbm91Z2gKLW5ldyByZXF1ZXN0cyBhcHBlYXIgb24gdGhhdCBzb2NrZXQgdG8gd2FrZSB0aGVtIGFsbCB1cC4KLVRoaXMgc3RhcnZhdGlvbiBwcm9ibGVtIHdhcyBmaXJzdCBkb2N1bWVudGVkIGluCi08QSBIUkVGPSJodHRwOi8vYnVncy5hcGFjaGUub3JnL2luZGV4L2Z1bGwvNDY3Ij5QUiM0Njc8L0E+LiAgVGhlcmUKLWFyZSBhdCBsZWFzdCB0d28gc29sdXRpb25zLgotCi08UD5PbmUgc29sdXRpb24gaXMgdG8gbWFrZSB0aGUgc29ja2V0cyBub24tYmxvY2tpbmcuICBJbiB0aGlzIGNhc2UgdGhlCi08Q09ERT5hY2NlcHQ8L0NPREU+IHdvbid0IGJsb2NrIHRoZSBjaGlsZHJlbiwgYW5kIHRoZXkgd2lsbCBiZSBhbGxvd2VkCi10byBjb250aW51ZSBpbW1lZGlhdGVseS4gIEJ1dCB0aGlzIHdhc3RlcyBDUFUgdGltZS4gIFN1cHBvc2UgeW91IGhhdmUKLXRlbiBpZGxlIGNoaWxkcmVuIGluIDxDT0RFPnNlbGVjdDwvQ09ERT4sIGFuZCBvbmUgY29ubmVjdGlvbiBhcnJpdmVzLgotVGhlbiBuaW5lIG9mIHRob3NlIGNoaWxkcmVuIHdpbGwgd2FrZSB1cCwgdHJ5IHRvIDxDT0RFPmFjY2VwdDwvQ09ERT4gdGhlCi1jb25uZWN0aW9uLCBmYWlsLCBhbmQgbG9vcCBiYWNrIGludG8gPENPREU+c2VsZWN0PC9DT0RFPiwgYWNjb21wbGlzaGluZwotbm90aGluZy4gIE1lYW53aGlsZSBub25lIG9mIHRob3NlIGNoaWxkcmVuIGFyZSBzZXJ2aWNpbmcgcmVxdWVzdHMgdGhhdAotb2NjdXJyZWQgb24gb3RoZXIgc29ja2V0cyB1bnRpbCB0aGV5IGdldCBiYWNrIHVwIHRvIHRoZSA8Q09ERT5zZWxlY3Q8L0NPREU+Ci1hZ2Fpbi4gIE92ZXJhbGwgdGhpcyBzb2x1dGlvbiBkb2VzIG5vdCBzZWVtIHZlcnkgZnJ1aXRmdWwgdW5sZXNzIHlvdQotaGF2ZSBhcyBtYW55IGlkbGUgQ1BVcyAoaW4gYSBtdWx0aXByb2Nlc3NvciBib3gpIGFzIHlvdSBoYXZlIGlkbGUgY2hpbGRyZW4sCi1ub3QgYSB2ZXJ5IGxpa2VseSBzaXR1YXRpb24uCi0KLTxQPkFub3RoZXIgc29sdXRpb24sIHRoZSBvbmUgdXNlZCBieSBBcGFjaGUsIGlzIHRvIHNlcmlhbGl6ZSBlbnRyeSBpbnRvCi10aGUgaW5uZXIgbG9vcC4gIFRoZSBsb29wIGxvb2tzIGxpa2UgdGhpcyAoZGlmZmVyZW5jZXMgaGlnaGxpZ2h0ZWQpOgotCi08QkxPQ0tRVU9URT48UFJFPgotICAgIGZvciAoOzspIHsKLQk8U1RST05HPmFjY2VwdF9tdXRleF9vbiAoKTs8L1NUUk9ORz4KLQlmb3IgKDs7KSB7Ci0JICAgIGZkX3NldCBhY2NlcHRfZmRzOwotCi0JICAgIEZEX1pFUk8gKCZhY2NlcHRfZmRzKTsKLQkgICAgZm9yIChpID0gZmlyc3Rfc29ja2V0OyBpICZsdDs9IGxhc3Rfc29ja2V0OyArK2kpIHsKLQkJRkRfU0VUIChpLCAmYWNjZXB0X2Zkcyk7Ci0JICAgIH0KLQkgICAgcmMgPSBzZWxlY3QgKGxhc3Rfc29ja2V0KzEsICZhY2NlcHRfZmRzLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQkgICAgaWYgKHJjICZsdDsgMSkgY29udGludWU7Ci0JICAgIG5ld19jb25uZWN0aW9uID0gLTE7Ci0JICAgIGZvciAoaSA9IGZpcnN0X3NvY2tldDsgaSAmbHQ7PSBsYXN0X3NvY2tldDsgKytpKSB7Ci0JCWlmIChGRF9JU1NFVCAoaSwgJmFjY2VwdF9mZHMpKSB7Ci0JCSAgICBuZXdfY29ubmVjdGlvbiA9IGFjY2VwdCAoaSwgTlVMTCwgTlVMTCk7Ci0JCSAgICBpZiAobmV3X2Nvbm5lY3Rpb24gIT0gLTEpIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgICAgaWYgKG5ld19jb25uZWN0aW9uICE9IC0xKSBicmVhazsKLQl9Ci0JPFNUUk9ORz5hY2NlcHRfbXV0ZXhfb2ZmICgpOzwvU1RST05HPgotCXByb2Nlc3MgdGhlIG5ld19jb25uZWN0aW9uOwotICAgIH0KLTwvUFJFPjwvQkxPQ0tRVU9URT4KLQotPEEgTkFNRT0ic2VyaWFsaXplIj5UaGUgZnVuY3Rpb25zPC9BPgotPENPREU+YWNjZXB0X211dGV4X29uPC9DT0RFPiBhbmQgPENPREU+YWNjZXB0X211dGV4X29mZjwvQ09ERT4KLWltcGxlbWVudCBhIG11dHVhbCBleGNsdXNpb24gc2VtYXBob3JlLiAgT25seSBvbmUgY2hpbGQgY2FuIGhhdmUgdGhlCi1tdXRleCBhdCBhbnkgdGltZS4gIFRoZXJlIGFyZSBzZXZlcmFsIGNob2ljZXMgZm9yIGltcGxlbWVudGluZyB0aGVzZQotbXV0ZXhlcy4gIFRoZSBjaG9pY2UgaXMgZGVmaW5lZCBpbiA8Q09ERT5zcmMvY29uZi5oPC9DT0RFPiAocHJlLTEuMykgb3IKLTxDT0RFPnNyYy9pbmNsdWRlL2FwX2NvbmZpZy5oPC9DT0RFPiAoMS4zIG9yIGxhdGVyKS4gIFNvbWUgYXJjaGl0ZWN0dXJlcwotZG8gbm90IGhhdmUgYW55IGxvY2tpbmcgY2hvaWNlIG1hZGUsIG9uIHRoZXNlIGFyY2hpdGVjdHVyZXMgaXQgaXMgdW5zYWZlCi10byB1c2UgbXVsdGlwbGUgPENPREU+TGlzdGVuPC9DT0RFPiBkaXJlY3RpdmVzLgotCi08REw+Ci08RFQ+PENPREU+VVNFX0ZMT0NLX1NFUklBTElaRURfQUNDRVBUPC9DT0RFPgotPEREPlRoaXMgbWV0aG9kIHVzZXMgdGhlIDxDT0RFPmZsb2NrKDIpPC9DT0RFPiBzeXN0ZW0gY2FsbCB0byBsb2NrIGEKLWxvY2sgZmlsZSAobG9jYXRlZCBieSB0aGUgPENPREU+TG9ja0ZpbGU8L0NPREU+IGRpcmVjdGl2ZSkuCi0KLTxEVD48Q09ERT5VU0VfRkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQ8L0NPREU+Ci08REQ+VGhpcyBtZXRob2QgdXNlcyB0aGUgPENPREU+ZmNudGwoMik8L0NPREU+IHN5c3RlbSBjYWxsIHRvIGxvY2sgYQotbG9jayBmaWxlIChsb2NhdGVkIGJ5IHRoZSA8Q09ERT5Mb2NrRmlsZTwvQ09ERT4gZGlyZWN0aXZlKS4KLQotPERUPjxDT0RFPlVTRV9TWVNWU0VNX1NFUklBTElaRURfQUNDRVBUPC9DT0RFPgotPEREPigxLjMgb3IgbGF0ZXIpIFRoaXMgbWV0aG9kIHVzZXMgU3lzVi1zdHlsZSBzZW1hcGhvcmVzIHRvIGltcGxlbWVudCB0aGUKLW11dGV4LiAgVW5mb3J0dW5hdGVseSBTeXNWLXN0eWxlIHNlbWFwaG9yZXMgaGF2ZSBzb21lIGJhZCBzaWRlLWVmZmVjdHMuCi1PbmUgaXMgdGhhdCBpdCdzIHBvc3NpYmxlIEFwYWNoZSB3aWxsIGRpZSB3aXRob3V0IGNsZWFuaW5nIHVwIHRoZSBzZW1hcGhvcmUKLShzZWUgdGhlIDxDT0RFPmlwY3MoOCk8L0NPREU+IG1hbiBwYWdlKS4gIFRoZSBvdGhlciBpcyB0aGF0IHRoZSBzZW1hcGhvcmUKLUFQSSBhbGxvd3MgZm9yIGEgZGVuaWFsIG9mIHNlcnZpY2UgYXR0YWNrIGJ5IGFueSBDR0lzIHJ1bm5pbmcgdW5kZXIgdGhlCi1zYW1lIHVpZCBhcyB0aGUgd2Vic2VydmVyICg8RU0+aS5lLjwvRU0+LCBhbGwgQ0dJcyB1bmxlc3MgeW91IHVzZSBzb21ldGhpbmcKLWxpa2Ugc3VleGVjIG9yIGNnaXdyYXBwZXIpLiAgRm9yIHRoZXNlIHJlYXNvbnMgdGhpcyBtZXRob2QgaXMgbm90IHVzZWQKLW9uIGFueSBhcmNoaXRlY3R1cmUgZXhjZXB0IElSSVggKHdoZXJlIHRoZSBwcmV2aW91cyB0d28gYXJlIHByb2hpYml0aXZlbHkKLWV4cGVuc2l2ZSBvbiBtb3N0IElSSVggYm94ZXMpLgotCi08RFQ+PENPREU+VVNFX1VTTE9DS19TRVJJQUxJWkVEX0FDQ0VQVDwvQ09ERT4KLTxERD4oMS4zIG9yIGxhdGVyKSBUaGlzIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBvbiBJUklYLCBhbmQgdXNlcwotPENPREU+dXNjb25maWcoMik8L0NPREU+IHRvIGNyZWF0ZSBhIG11dGV4LiAgV2hpbGUgdGhpcyBtZXRob2QgYXZvaWRzCi10aGUgaGFzc2xlcyBvZiBTeXNWLXN0eWxlIHNlbWFwaG9yZXMsIGl0IGlzIG5vdCB0aGUgZGVmYXVsdCBmb3IgSVJJWC4KLVRoaXMgaXMgYmVjYXVzZSBvbiBzaW5nbGUgcHJvY2Vzc29yIElSSVggYm94ZXMgKDUuMyBvciA2LjIpIHRoZQotdXNsb2NrIGNvZGUgaXMgdHdvIG9yZGVycyBvZiBtYWduaXR1ZGUgc2xvd2VyIHRoYW4gdGhlIFN5c1Ytc2VtYXBob3JlCi1jb2RlLiAgT24gbXVsdGktcHJvY2Vzc29yIElSSVggYm94ZXMgdGhlIHVzbG9jayBjb2RlIGlzIGFuIG9yZGVyIG9mIG1hZ25pdHVkZQotZmFzdGVyIHRoYW4gdGhlIFN5c1Ytc2VtYXBob3JlIGNvZGUuICBLaW5kIG9mIGEgbWVzc2VkIHVwIHNpdHVhdGlvbi4KLVNvIGlmIHlvdSdyZSB1c2luZyBhIG11bHRpcHJvY2Vzc29yIElSSVggYm94IHRoZW4geW91IHNob3VsZCByZWJ1aWxkIHlvdXIKLXdlYnNlcnZlciB3aXRoIDxDT0RFPi1EVVNFX1VTTE9DS19TRVJJQUxJWkVEX0FDQ0VQVDwvQ09ERT4gb24gdGhlCi08Q09ERT5FWFRSQV9DRkxBR1M8L0NPREU+LgotCi08RFQ+PENPREU+VVNFX1BUSFJFQURfU0VSSUFMSVpFRF9BQ0NFUFQ8L0NPREU+Ci08REQ+KDEuMyBvciBsYXRlcikgVGhpcyBtZXRob2QgdXNlcyBQT1NJWCBtdXRleGVzIGFuZCBzaG91bGQgd29yayBvbgotYW55IGFyY2hpdGVjdHVyZSBpbXBsZW1lbnRpbmcgdGhlIGZ1bGwgUE9TSVggdGhyZWFkcyBzcGVjaWZpY2F0aW9uLAotaG93ZXZlciBhcHBlYXJzIHRvIG9ubHkgd29yayBvbiBTb2xhcmlzICgyLjUgb3IgbGF0ZXIpLCBhbmQgZXZlbiB0aGVuCi1vbmx5IGluIGNlcnRhaW4gY29uZmlndXJhdGlvbnMuICBJZiB5b3UgZXhwZXJpbWVudCB3aXRoIHRoaXMgeW91IHNob3VsZAotd2F0Y2ggb3V0IGZvciB5b3VyIHNlcnZlciBoYW5naW5nIGFuZCBub3QgcmVzcG9uZGluZy4gIFN0YXRpYyBjb250ZW50Ci1vbmx5IHNlcnZlcnMgbWF5IHdvcmsganVzdCBmaW5lLgotPC9ETD4KLQotPFA+SWYgeW91ciBzeXN0ZW0gaGFzIGFub3RoZXIgbWV0aG9kIG9mIHNlcmlhbGl6YXRpb24gd2hpY2ggaXNuJ3QgaW4gdGhlCi1hYm92ZSBsaXN0IHRoZW4gaXQgbWF5IGJlIHdvcnRod2hpbGUgYWRkaW5nIGNvZGUgZm9yIGl0IChhbmQgc3VibWl0dGluZwotYSBwYXRjaCBiYWNrIHRvIEFwYWNoZSkuCi0KLTxQPkFub3RoZXIgc29sdXRpb24gdGhhdCBoYXMgYmVlbiBjb25zaWRlcmVkIGJ1dCBuZXZlciBpbXBsZW1lbnRlZCBpcwotdG8gcGFydGlhbGx5IHNlcmlhbGl6ZSB0aGUgbG9vcCAtLSB0aGF0IGlzLCBsZXQgaW4gYSBjZXJ0YWluIG51bWJlcgotb2YgcHJvY2Vzc2VzLiAgVGhpcyB3b3VsZCBvbmx5IGJlIG9mIGludGVyZXN0IG9uIG11bHRpcHJvY2Vzc29yIGJveGVzCi13aGVyZSBpdCdzIHBvc3NpYmxlIG11bHRpcGxlIGNoaWxkcmVuIGNvdWxkIHJ1biBzaW11bHRhbmVvdXNseSwgYW5kIHRoZQotc2VyaWFsaXphdGlvbiBhY3R1YWxseSBkb2Vzbid0IHRha2UgYWR2YW50YWdlIG9mIHRoZSBmdWxsIGJhbmR3aWR0aC4KLVRoaXMgaXMgYSBwb3NzaWJsZSBhcmVhIG9mIGZ1dHVyZSBpbnZlc3RpZ2F0aW9uLCBidXQgcHJpb3JpdHkgcmVtYWlucwotbG93IGJlY2F1c2UgaGlnaGx5IHBhcmFsbGVsIHdlYiBzZXJ2ZXJzIGFyZSBub3QgdGhlIG5vcm0uCi0KLTxQPklkZWFsbHkgeW91IHNob3VsZCBydW4gc2VydmVycyB3aXRob3V0IG11bHRpcGxlIDxDT0RFPkxpc3RlbjwvQ09ERT4KLXN0YXRlbWVudHMgaWYgeW91IHdhbnQgdGhlIGhpZ2hlc3QgcGVyZm9ybWFuY2UuICBCdXQgcmVhZCBvbi4KLQotPEg0PmFjY2VwdCBTZXJpYWxpemF0aW9uIC0gc2luZ2xlIHNvY2tldDwvSDQ+Ci0KLTxQPlRoZSBhYm92ZSBpcyBmaW5lIGFuZCBkYW5keSBmb3IgbXVsdGlwbGUgc29ja2V0IHNlcnZlcnMsIGJ1dCB3aGF0Ci1hYm91dCBzaW5nbGUgc29ja2V0IHNlcnZlcnM/ICBJbiB0aGVvcnkgdGhleSBzaG91bGRuJ3QgZXhwZXJpZW5jZQotYW55IG9mIHRoZXNlIHNhbWUgcHJvYmxlbXMgYmVjYXVzZSBhbGwgY2hpbGRyZW4gY2FuIGp1c3QgYmxvY2sgaW4KLTxDT0RFPmFjY2VwdCgyKTwvQ09ERT4gdW50aWwgYSBjb25uZWN0aW9uIGFycml2ZXMsIGFuZCBubyBzdGFydmF0aW9uCi1yZXN1bHRzLiAgSW4gcHJhY3RpY2UgdGhpcyBoaWRlcyBhbG1vc3QgdGhlIHNhbWUgInNwaW5uaW5nIiBiZWhhdmlvdXIKLWRpc2N1c3NlZCBhYm92ZSBpbiB0aGUgbm9uLWJsb2NraW5nIHNvbHV0aW9uLiAgVGhlIHdheSB0aGF0IG1vc3QgVENQCi1zdGFja3MgYXJlIGltcGxlbWVudGVkLCB0aGUga2VybmVsIGFjdHVhbGx5IHdha2VzIHVwIGFsbCBwcm9jZXNzZXMgYmxvY2tlZAotaW4gPENPREU+YWNjZXB0PC9DT0RFPiB3aGVuIGEgc2luZ2xlIGNvbm5lY3Rpb24gYXJyaXZlcy4gIE9uZSBvZiB0aG9zZQotcHJvY2Vzc2VzIGdldHMgdGhlIGNvbm5lY3Rpb24gYW5kIHJldHVybnMgdG8gdXNlci1zcGFjZSwgdGhlIHJlc3Qgc3BpbiBpbgotdGhlIGtlcm5lbCBhbmQgZ28gYmFjayB0byBzbGVlcCB3aGVuIHRoZXkgZGlzY292ZXIgdGhlcmUncyBubyBjb25uZWN0aW9uCi1mb3IgdGhlbS4gIFRoaXMgc3Bpbm5pbmcgaXMgaGlkZGVuIGZyb20gdGhlIHVzZXItbGFuZCBjb2RlLCBidXQgaXQncwotdGhlcmUgbm9uZXRoZWxlc3MuICBUaGlzIGNhbiByZXN1bHQgaW4gdGhlIHNhbWUgbG9hZC1zcGlraW5nIHdhc3RlZnVsCi1iZWhhdmlvdXIgdGhhdCBhIG5vbi1ibG9ja2luZyBzb2x1dGlvbiB0byB0aGUgbXVsdGlwbGUgc29ja2V0cyBjYXNlIGNhbi4KLQotPFA+Rm9yIHRoaXMgcmVhc29uIHdlIGhhdmUgZm91bmQgdGhhdCBtYW55IGFyY2hpdGVjdHVyZXMgYmVoYXZlIG1vcmUKLSJuaWNlbHkiIGlmIHdlIHNlcmlhbGl6ZSBldmVuIHRoZSBzaW5nbGUgc29ja2V0IGNhc2UuICBTbyB0aGlzIGlzCi1hY3R1YWxseSB0aGUgZGVmYXVsdCBpbiBhbG1vc3QgYWxsIGNhc2VzLiAgQ3J1ZGUgZXhwZXJpbWVudHMgdW5kZXIKLUxpbnV4ICgyLjAuMzAgb24gYSBkdWFsIFBlbnRpdW0gcHJvIDE2NiB3LzEyOE1iIFJBTSkgaGF2ZSBzaG93biB0aGF0Ci10aGUgc2VyaWFsaXphdGlvbiBvZiB0aGUgc2luZ2xlIHNvY2tldCBjYXNlIGNhdXNlcyBsZXNzIHRoYW4gYSAzJQotZGVjcmVhc2UgaW4gcmVxdWVzdHMgcGVyIHNlY29uZCBvdmVyIHVuc2VyaWFsaXplZCBzaW5nbGUtc29ja2V0LgotQnV0IHVuc2VyaWFsaXplZCBzaW5nbGUtc29ja2V0IHNob3dlZCBhbiBleHRyYSAxMDBtcyBsYXRlbmN5IG9uCi1lYWNoIHJlcXVlc3QuICBUaGlzIGxhdGVuY3kgaXMgcHJvYmFibHkgYSB3YXNoIG9uIGxvbmcgaGF1bCBsaW5lcywKLWFuZCBvbmx5IGFuIGlzc3VlIG9uIExBTnMuICBJZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgc2luZ2xlIHNvY2tldAotc2VyaWFsaXphdGlvbiB5b3UgY2FuIGRlZmluZSA8Q09ERT5TSU5HTEVfTElTVEVOX1VOU0VSSUFMSVpFRF9BQ0NFUFQ8L0NPREU+Ci1hbmQgdGhlbiBzaW5nbGUtc29ja2V0IHNlcnZlcnMgd2lsbCBub3Qgc2VyaWFsaXplIGF0IGFsbC4KLQotPEg0PkxpbmdlcmluZyBDbG9zZTwvSDQ+Ci0KLTxQPkFzIGRpc2N1c3NlZCBpbgotPEEKLSBIUkVGPSJodHRwOi8vd3d3Lmljcy51Y2kuZWR1L3B1Yi9pZXRmL2h0dHAvZHJhZnQtaWV0Zi1odHRwLWNvbm5lY3Rpb24tMDAudHh0IgotPmRyYWZ0LWlldGYtaHR0cC1jb25uZWN0aW9uLTAwLnR4dDwvQT4gc2VjdGlvbiA4LAotaW4gb3JkZXIgZm9yIGFuIEhUVFAgc2VydmVyIHRvIDxTVFJPTkc+cmVsaWFibHk8L1NUUk9ORz4gaW1wbGVtZW50IHRoZSBwcm90b2NvbAotaXQgbmVlZHMgdG8gc2h1dGRvd24gZWFjaCBkaXJlY3Rpb24gb2YgdGhlIGNvbW11bmljYXRpb24gaW5kZXBlbmRlbnRseQotKHJlY2FsbCB0aGF0IGEgVENQIGNvbm5lY3Rpb24gaXMgYmktZGlyZWN0aW9uYWwsIGVhY2ggaGFsZiBpcyBpbmRlcGVuZGVudAotb2YgdGhlIG90aGVyKS4gIFRoaXMgZmFjdCBpcyBvZnRlbiBvdmVybG9va2VkIGJ5IG90aGVyIHNlcnZlcnMsIGJ1dAotaXMgY29ycmVjdGx5IGltcGxlbWVudGVkIGluIEFwYWNoZSBhcyBvZiAxLjIuCi0KLTxQPldoZW4gdGhpcyBmZWF0dXJlIHdhcyBhZGRlZCB0byBBcGFjaGUgaXQgY2F1c2VkIGEgZmx1cnJ5IG9mCi1wcm9ibGVtcyBvbiB2YXJpb3VzIHZlcnNpb25zIG9mIFVuaXggYmVjYXVzZSBvZiBhIHNob3J0c2lnaHRlZG5lc3MuCi1UaGUgVENQIHNwZWNpZmljYXRpb24gZG9lcyBub3Qgc3RhdGUgdGhhdCB0aGUgRklOX1dBSVRfMiBzdGF0ZSBoYXMgYQotdGltZW91dCwgYnV0IGl0IGRvZXNuJ3QgcHJvaGliaXQgaXQuICBPbiBzeXN0ZW1zIHdpdGhvdXQgdGhlIHRpbWVvdXQsCi1BcGFjaGUgMS4yIGluZHVjZXMgbWFueSBzb2NrZXRzIHN0dWNrIGZvcmV2ZXIgaW4gdGhlIEZJTl9XQUlUXzIgc3RhdGUuCi1JbiBtYW55IGNhc2VzIHRoaXMgY2FuIGJlIGF2b2lkZWQgYnkgc2ltcGx5IHVwZ3JhZGluZyB0byB0aGUgbGF0ZXN0Ci1UQ1AvSVAgcGF0Y2hlcyBzdXBwbGllZCBieSB0aGUgdmVuZG9yLCBpbiBjYXNlcyB3aGVyZSB0aGUgdmVuZG9yIGhhcwotbmV2ZXIgcmVsZWFzZWQgcGF0Y2hlcyAoPEVNPmkuZS48L0VNPiwgIFN1bk9TNCAtLSBhbHRob3VnaCBmb2xrcyB3aXRoIGEgc291cmNlCi1saWNlbnNlIGNhbiBwYXRjaCBpdCB0aGVtc2VsdmVzKSB3ZSBoYXZlIGRlY2lkZWQgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0KLTxQPlRoZXJlIGFyZSB0d28gd2F5cyBvZiBhY2NvbXBsaXNoaW5nIHRoaXMuICBPbmUgaXMgdGhlCi1zb2NrZXQgb3B0aW9uIDxDT0RFPlNPX0xJTkdFUjwvQ09ERT4uICBCdXQgYXMgZmF0ZSB3b3VsZCBoYXZlIGl0LAotdGhpcyBoYXMgbmV2ZXIgYmVlbiBpbXBsZW1lbnRlZCBwcm9wZXJseSBpbiBtb3N0IFRDUC9JUCBzdGFja3MuICBFdmVuCi1vbiB0aG9zZSBzdGFja3Mgd2l0aCBhIHByb3BlciBpbXBsZW1lbnRhdGlvbiAoPEVNPmkuZS48L0VNPiwgTGludXggMi4wLjMxKSB0aGlzCi1tZXRob2QgcHJvdmVzIHRvIGJlIG1vcmUgZXhwZW5zaXZlIChjcHV0aW1lKSB0aGFuIHRoZSBuZXh0IHNvbHV0aW9uLgotCi08UD5Gb3IgdGhlIG1vc3QgcGFydCwgQXBhY2hlIGltcGxlbWVudHMgdGhpcyBpbiBhIGZ1bmN0aW9uIGNhbGxlZAotPENPREU+bGluZ2VyaW5nX2Nsb3NlPC9DT0RFPiAoaW4gPENPREU+aHR0cF9tYWluLmM8L0NPREU+KS4gIFRoZQotZnVuY3Rpb24gbG9va3Mgcm91Z2hseSBsaWtlIHRoaXM6Ci0KLTxCTE9DS1FVT1RFPjxQUkU+Ci0gICAgdm9pZCBsaW5nZXJpbmdfY2xvc2UgKGludCBzKQotICAgIHsKLQljaGFyIGp1bmtfYnVmZmVyWzIwNDhdOwotCi0JLyogc2h1dGRvd24gdGhlIHNlbmRpbmcgc2lkZSAqLwotCXNodXRkb3duIChzLCAxKTsKLQotCXNpZ25hbCAoU0lHQUxSTSwgbGluZ2VyaW5nX2RlYXRoKTsKLQlhbGFybSAoMzApOwotCi0JZm9yICg7OykgewotCSAgICBzZWxlY3QgKHMgZm9yIHJlYWRpbmcsIDIgc2Vjb25kIHRpbWVvdXQpOwotCSAgICBpZiAoZXJyb3IpIGJyZWFrOwotCSAgICBpZiAocyBpcyByZWFkeSBmb3IgcmVhZGluZykgewotCQlyZWFkIChzLCBqdW5rX2J1ZmZlciwgc2l6ZW9mIChqdW5rX2J1ZmZlcikpOwotCQkvKiBqdXN0IHRvc3MgYXdheSB3aGF0ZXZlciBpcyBoZXJlICovCi0JICAgIH0KLQl9Ci0KLQljbG9zZSAocyk7Ci0gICAgfQotPC9QUkU+PC9CTE9DS1FVT1RFPgotCi1UaGlzIG5hdHVyYWxseSBhZGRzIHNvbWUgZXhwZW5zZSBhdCB0aGUgZW5kIG9mIGEgY29ubmVjdGlvbiwgYnV0IGl0Ci1pcyByZXF1aXJlZCBmb3IgYSByZWxpYWJsZSBpbXBsZW1lbnRhdGlvbi4gIEFzIEhUVFAvMS4xIGJlY29tZXMgbW9yZQotcHJldmFsZW50LCBhbmQgYWxsIGNvbm5lY3Rpb25zIGFyZSBwZXJzaXN0ZW50LCB0aGlzIGV4cGVuc2Ugd2lsbCBiZQotYW1vcnRpemVkIG92ZXIgbW9yZSByZXF1ZXN0cy4gIElmIHlvdSB3YW50IHRvIHBsYXkgd2l0aCBmaXJlIGFuZAotZGlzYWJsZSB0aGlzIGZlYXR1cmUgeW91IGNhbiBkZWZpbmUgPENPREU+Tk9fTElOR0NMT1NFPC9DT0RFPiwgYnV0Ci10aGlzIGlzIG5vdCByZWNvbW1lbmRlZCBhdCBhbGwuICBJbiBwYXJ0aWN1bGFyLCBhcyBIVFRQLzEuMSBwaXBlbGluZWQKLXBlcnNpc3RlbnQgY29ubmVjdGlvbnMgY29tZSBpbnRvIHVzZSA8Q09ERT5saW5nZXJpbmdfY2xvc2U8L0NPREU+Ci1pcyBhbiBhYnNvbHV0ZSBuZWNlc3NpdHkgKGFuZAotPEEgSFJFRj0iaHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL0hUVFAvUGVyZm9ybWFuY2UvUGlwZWxpbmUuaHRtbCI+Ci1waXBlbGluZWQgY29ubmVjdGlvbnMgYXJlIGZhc3RlcjwvQT4sIHNvIHlvdQotd2FudCB0byBzdXBwb3J0IHRoZW0pLgotCi08SDQ+U2NvcmVib2FyZCBGaWxlPC9IND4KLQotPFA+QXBhY2hlJ3MgcGFyZW50IGFuZCBjaGlsZHJlbiBjb21tdW5pY2F0ZSB3aXRoIGVhY2ggb3RoZXIgdGhyb3VnaAotc29tZXRoaW5nIGNhbGxlZCB0aGUgc2NvcmVib2FyZC4gIElkZWFsbHkgdGhpcyBzaG91bGQgYmUgaW1wbGVtZW50ZWQKLWluIHNoYXJlZCBtZW1vcnkuICBGb3IgdGhvc2Ugb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCB3ZSBlaXRoZXIgaGF2ZQotYWNjZXNzIHRvLCBvciBoYXZlIGJlZW4gZ2l2ZW4gZGV0YWlsZWQgcG9ydHMgZm9yLCBpdCB0eXBpY2FsbHkgaXMKLWltcGxlbWVudGVkIHVzaW5nIHNoYXJlZCBtZW1vcnkuICBUaGUgcmVzdCBkZWZhdWx0IHRvIHVzaW5nIGFuCi1vbi1kaXNrIGZpbGUuICBUaGUgb24tZGlzayBmaWxlIGlzIG5vdCBvbmx5IHNsb3csIGJ1dCBpdCBpcyB1bnJlbGlhYmxlCi0oYW5kIGxlc3MgZmVhdHVyZWQpLiAgUGVydXNlIHRoZSA8Q09ERT5zcmMvbWFpbi9jb25mLmg8L0NPREU+IGZpbGUKLWZvciB5b3VyIGFyY2hpdGVjdHVyZSBhbmQgbG9vayBmb3IgZWl0aGVyIDxDT0RFPlVTRV9NTUFQX1NDT1JFQk9BUkQ8L0NPREU+IG9yCi08Q09ERT5VU0VfU0hNR0VUX1NDT1JFQk9BUkQ8L0NPREU+LiAgRGVmaW5pbmcgb25lIG9mIHRob3NlIHR3byAoYXMKLXdlbGwgYXMgdGhlaXIgY29tcGFuaW9ucyA8Q09ERT5IQVZFX01NQVA8L0NPREU+IGFuZCA8Q09ERT5IQVZFX1NITUdFVDwvQ09ERT4KLXJlc3BlY3RpdmVseSkgZW5hYmxlcyB0aGUgc3VwcGxpZWQgc2hhcmVkIG1lbW9yeSBjb2RlLiAgSWYgeW91ciBzeXN0ZW0gaGFzCi1hbm90aGVyIHR5cGUgb2Ygc2hhcmVkIG1lbW9yeSwgZWRpdCB0aGUgZmlsZSA8Q09ERT5zcmMvbWFpbi9odHRwX21haW4uYzwvQ09ERT4KLWFuZCBhZGQgdGhlIGhvb2tzIG5lY2Vzc2FyeSB0byB1c2UgaXQgaW4gQXBhY2hlLiAgKFNlbmQgdXMgYmFjayBhIHBhdGNoCi10b28gcGxlYXNlLikKLQotPFA+SGlzdG9yaWNhbCBub3RlOiAgVGhlIExpbnV4IHBvcnQgb2YgQXBhY2hlIGRpZG4ndCBzdGFydCB0byB1c2UKLXNoYXJlZCBtZW1vcnkgdW50aWwgdmVyc2lvbiAxLjIgb2YgQXBhY2hlLiAgVGhpcyBvdmVyc2lnaHQgcmVzdWx0ZWQKLWluIHJlYWxseSBwb29yIGFuZCB1bnJlbGlhYmxlIGJlaGF2aW91ciBvZiBlYXJsaWVyIHZlcnNpb25zIG9mIEFwYWNoZQotb24gTGludXguCi0KLTxIND48Q09ERT5EWU5BTUlDX01PRFVMRV9MSU1JVDwvQ09ERT48L0g0PgotCi08UD5JZiB5b3UgaGF2ZSBubyBpbnRlbnRpb24gb2YgdXNpbmcgZHluYW1pY2FsbHkgbG9hZGVkIG1vZHVsZXMKLSh5b3UgcHJvYmFibHkgZG9uJ3QgaWYgeW91J3JlIHJlYWRpbmcgdGhpcyBhbmQgdHVuaW5nIHlvdXIKLXNlcnZlciBmb3IgZXZlcnkgbGFzdCBvdW5jZSBvZiBwZXJmb3JtYW5jZSkgdGhlbiB5b3Ugc2hvdWxkIGFkZAotPENPREU+LUREWU5BTUlDX01PRFVMRV9MSU1JVD0wPC9DT0RFPiB3aGVuIGJ1aWxkaW5nIHlvdXIgc2VydmVyLgotVGhpcyB3aWxsIHNhdmUgUkFNIHRoYXQncyBhbGxvY2F0ZWQgb25seSBmb3Igc3VwcG9ydGluZyBkeW5hbWljYWxseQotbG9hZGVkIG1vZHVsZXMuCi0KLTxIMz5BcHBlbmRpeDogRGV0YWlsZWQgQW5hbHlzaXMgb2YgYSBUcmFjZTwvSDM+Ci0KLUhlcmUgaXMgYSBzeXN0ZW0gY2FsbCB0cmFjZSBvZiBBcGFjaGUgMS4zIHJ1bm5pbmcgb24gTGludXguICBUaGUgcnVuLXRpbWUKLWNvbmZpZ3VyYXRpb24gZmlsZSBpcyBlc3NlbnRpYWxseSB0aGUgZGVmYXVsdCBwbHVzOgotCi08QkxPQ0tRVU9URT48UFJFPgotJmx0O0RpcmVjdG9yeSAvJmd0OwotICAgIEFsbG93T3ZlcnJpZGUgbm9uZQotICAgIE9wdGlvbnMgRm9sbG93U3ltTGlua3MKLSZsdDsvRGlyZWN0b3J5Jmd0OwotPC9QUkU+PC9CTE9DS1FVT1RFPgotCi1UaGUgZmlsZSBiZWluZyByZXF1ZXN0ZWQgaXMgYSBzdGF0aWMgNksgZmlsZSBvZiBubyBwYXJ0aWN1bGFyIGNvbnRlbnQuCi1UcmFjZXMgb2Ygbm9uLXN0YXRpYyByZXF1ZXN0cyBvciByZXF1ZXN0cyB3aXRoIGNvbnRlbnQgbmVnb3RpYXRpb24KLWxvb2sgd2lsZGx5IGRpZmZlcmVudCAoYW5kIHF1aXRlIHVnbHkgaW4gc29tZSBjYXNlcykuICBGaXJzdCB0aGUKLWVudGlyZSB0cmFjZSwgdGhlbiB3ZSdsbCBleGFtaW5lIGRldGFpbHMuICAoVGhpcyB3YXMgZ2VuZXJhdGVkIGJ5Ci10aGUgPENPREU+c3RyYWNlPC9DT0RFPiBwcm9ncmFtLCBvdGhlciBzaW1pbGFyIHByb2dyYW1zIGluY2x1ZGUKLTxDT0RFPnRydXNzPC9DT0RFPiwgPENPREU+a3RyYWNlPC9DT0RFPiwgYW5kIDxDT0RFPnBhcjwvQ09ERT4uKQotCi08QkxPQ0tRVU9URT48UFJFPgotYWNjZXB0KDE1LCB7c2luX2ZhbWlseT1BRl9JTkVULCBzaW5fcG9ydD1odG9ucygyMjI4MyksIHNpbl9hZGRyPWluZXRfYWRkcigiMTI3LjAuMC4xIil9LCBbMTZdKSA9IDMKLWZsb2NrKDE4LCBMT0NLX1VOKSAgICAgICAgICAgICAgICAgICAgICA9IDAKLXNpZ2FjdGlvbihTSUdVU1IxLCB7U0lHX0lHTn0sIHsweDgwNTk5NTQsIFtdLCBTQV9JTlRFUlJVUFR9KSA9IDAKLWdldHNvY2tuYW1lKDMsIHtzaW5fZmFtaWx5PUFGX0lORVQsIHNpbl9wb3J0PWh0b25zKDgwODApLCBzaW5fYWRkcj1pbmV0X2FkZHIoIjEyNy4wLjAuMSIpfSwgWzE2XSkgPSAwCi1zZXRzb2Nrb3B0KDMsIElQUFJPVE9fVENQMSwgWzFdLCA0KSAgICAgPSAwCi1yZWFkKDMsICJHRVQgLzZrIEhUVFAvMS4wXHJcblVzZXItQWdlbnQ6ICIuLi4sIDQwOTYpID0gNjAKLXNpZ2FjdGlvbihTSUdVU1IxLCB7U0lHX0lHTn0sIHtTSUdfSUdOfSkgPSAwCi10aW1lKE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NzM5NTk5NjAKLWdldHRpbWVvZmRheSh7ODczOTU5OTYwLCA0MDQ5MzV9LCBOVUxMKSA9IDAKLXN0YXQoIi9ob21lL2RnYXVkZXQvYXAvYXBhY2hlbi9odGRvY3MvNmsiLCB7c3RfbW9kZT1TX0lGUkVHfDA2NDQsIHN0X3NpemU9NjE0NCwgLi4ufSkgPSAwCi1vcGVuKCIvaG9tZS9kZ2F1ZGV0L2FwL2FwYWNoZW4vaHRkb2NzLzZrIiwgT19SRE9OTFkpID0gNAotbW1hcCgwLCA2MTQ0LCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCA0LCAwKSA9IDB4NDAwZWUwMDAKLXdyaXRldigzLCBbeyJIVFRQLzEuMSAyMDAgT0tcclxuRGF0ZTogVGh1LCAxMSIuLi4sIDI0NX0sIHsiXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDAiLi4uLCA2MTQ0fV0sIDIpID0gNjM4OQotY2xvc2UoNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMAotdGltZShOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODczOTU5OTYwCi13cml0ZSgxNywgIjEyNy4wLjAuMSAtIC0gWzEwL1NlcC8xOTk3OjIzOjM5Ii4uLiwgNzEpID0gNzEKLWdldHRpbWVvZmRheSh7ODczOTU5OTYwLCA0MTc3NDJ9LCBOVUxMKSA9IDAKLXRpbWVzKHt0bXNfdXRpbWU9NSwgdG1zX3N0aW1lPTAsIHRtc19jdXRpbWU9MCwgdG1zX2NzdGltZT0wfSkgPSA0NDY3NDcKLXNodXRkb3duKDMsIDEgLyogc2VuZCAqLykgICAgICAgICAgICAgICA9IDAKLW9sZHNlbGVjdCg0LCBbM10sIE5VTEwsIFszXSwgezIsIDB9KSAgICA9IDEgKGluIFszXSwgbGVmdCB7MiwgMH0pCi1yZWFkKDMsICIiLCAyMDQ4KSAgICAgICAgICAgICAgICAgICAgICAgPSAwCi1jbG9zZSgzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwCi1zaWdhY3Rpb24oU0lHVVNSMSwgezB4ODA1OTk1NCwgW10sIFNBX0lOVEVSUlVQVH0sIHtTSUdfSUdOfSkgPSAwCi1tdW5tYXAoMHg0MDBlZTAwMCwgNjE0NCkgICAgICAgICAgICAgICAgPSAwCi1mbG9jaygxOCwgTE9DS19FWCkgICAgICAgICAgICAgICAgICAgICAgPSAwCi08L1BSRT48L0JMT0NLUVVPVEU+Ci0KLTxQPk5vdGljZSB0aGUgYWNjZXB0IHNlcmlhbGl6YXRpb246Ci0KLTxCTE9DS1FVT1RFPjxQUkU+Ci1mbG9jaygxOCwgTE9DS19VTikgICAgICAgICAgICAgICAgICAgICAgPSAwCi0uLi4KLWZsb2NrKDE4LCBMT0NLX0VYKSAgICAgICAgICAgICAgICAgICAgICA9IDAKLTwvUFJFPjwvQkxPQ0tRVU9URT4KLQotVGhlc2UgdHdvIGNhbGxzIGNhbiBiZSByZW1vdmVkIGJ5IGRlZmluaW5nCi08Q09ERT5TSU5HTEVfTElTVEVOX1VOU0VSSUFMSVpFRF9BQ0NFUFQ8L0NPREU+IGFzIGRlc2NyaWJlZCBlYXJsaWVyLgotCi08UD5Ob3RpY2UgdGhlIDxDT0RFPlNJR1VTUjE8L0NPREU+IG1hbmlwdWxhdGlvbjoKLQotPEJMT0NLUVVPVEU+PFBSRT4KLXNpZ2FjdGlvbihTSUdVU1IxLCB7U0lHX0lHTn0sIHsweDgwNTk5NTQsIFtdLCBTQV9JTlRFUlJVUFR9KSA9IDAKLS4uLgotc2lnYWN0aW9uKFNJR1VTUjEsIHtTSUdfSUdOfSwge1NJR19JR059KSA9IDAKLS4uLgotc2lnYWN0aW9uKFNJR1VTUjEsIHsweDgwNTk5NTQsIFtdLCBTQV9JTlRFUlJVUFR9LCB7U0lHX0lHTn0pID0gMAotPC9QUkU+PC9CTE9DS1FVT1RFPgotCi1UaGlzIGlzIGNhdXNlZCBieSB0aGUgaW1wbGVtZW50YXRpb24gb2YgZ3JhY2VmdWwgcmVzdGFydHMuICBXaGVuIHRoZQotcGFyZW50IHJlY2VpdmVzIGEgPENPREU+U0lHVVNSMTwvQ09ERT4gaXQgc2VuZHMgYSA8Q09ERT5TSUdVU1IxPC9DT0RFPgotdG8gYWxsIG9mIGl0cyBjaGlsZHJlbiAoYW5kIGl0IGFsc28gaW5jcmVtZW50cyBhICJnZW5lcmF0aW9uIGNvdW50ZXIiCi1pbiBzaGFyZWQgbWVtb3J5KS4gIEFueSBjaGlsZHJlbiB0aGF0IGFyZSBpZGxlIChiZXR3ZWVuIGNvbm5lY3Rpb25zKQotd2lsbCBpbW1lZGlhdGVseSBkaWUKLW9mZiB3aGVuIHRoZXkgcmVjZWl2ZSB0aGUgc2lnbmFsLiAgQW55IGNoaWxkcmVuIHRoYXQgYXJlIGluIGtlZXAtYWxpdmUKLWNvbm5lY3Rpb25zLCBidXQgYXJlIGluIGJldHdlZW4gcmVxdWVzdHMgd2lsbCBkaWUgb2ZmIGltbWVkaWF0ZWx5LiAgQnV0Ci1hbnkgY2hpbGRyZW4gdGhhdCBoYXZlIGEgY29ubmVjdGlvbiBhbmQgYXJlIHN0aWxsIHdhaXRpbmcgZm9yIHRoZSBmaXJzdAotcmVxdWVzdCB3aWxsIG5vdCBkaWUgb2ZmIGltbWVkaWF0ZWx5LgotCi08UD5UbyBzZWUgd2h5IHRoaXMgaXMgbmVjZXNzYXJ5LCBjb25zaWRlciBob3cgYSBicm93c2VyIHJlYWN0cyB0byBhIGNsb3NlZAotY29ubmVjdGlvbi4gIElmIHRoZSBjb25uZWN0aW9uIHdhcyBhIGtlZXAtYWxpdmUgY29ubmVjdGlvbiBhbmQgdGhlIHJlcXVlc3QKLWJlaW5nIHNlcnZpY2VkIHdhcyBub3QgdGhlIGZpcnN0IHJlcXVlc3QgdGhlbiB0aGUgYnJvd3NlciB3aWxsIHF1aWV0bHkKLXJlaXNzdWUgdGhlIHJlcXVlc3Qgb24gYSBuZXcgY29ubmVjdGlvbi4gIEl0IGhhcyB0byBkbyB0aGlzIGJlY2F1c2UgdGhlCi1zZXJ2ZXIgaXMgYWx3YXlzIGZyZWUgdG8gY2xvc2UgYSBrZWVwLWFsaXZlIGNvbm5lY3Rpb24gaW4gYmV0d2VlbiByZXF1ZXN0cwotKDxFTT5pLmUuPC9FTT4sIGR1ZSB0byBhIHRpbWVvdXQgb3IgYmVjYXVzZSBvZiBhIG1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzKS4KLUJ1dCwgaWYgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkIGJlZm9yZSB0aGUgZmlyc3QgcmVzcG9uc2UgaGFzIGJlZW4KLXJlY2VpdmVkIHRoZSB0eXBpY2FsIGJyb3dzZXIgd2lsbCBkaXNwbGF5IGEgImRvY3VtZW50IGNvbnRhaW5zIG5vIGRhdGEiCi1kaWFsb2d1ZSAob3IgYSBicm9rZW4gaW1hZ2UgaWNvbikuICBUaGlzIGlzIGRvbmUgb24gdGhlIGFzc3VtcHRpb24gdGhhdAotdGhlIHNlcnZlciBpcyBicm9rZW4gaW4gc29tZSB3YXkgKG9yIG1heWJlIHRvbyBvdmVybG9hZGVkIHRvIHJlc3BvbmQKLWF0IGFsbCkuICBTbyBBcGFjaGUgdHJpZXMgdG8gYXZvaWQgZXZlciBkZWxpYmVyYXRlbHkgY2xvc2luZyB0aGUgY29ubmVjdGlvbgotYmVmb3JlIGl0IGhhcyBzZW50IGEgc2luZ2xlIHJlc3BvbnNlLiAgVGhpcyBpcyB0aGUgY2F1c2Ugb2YgdGhvc2UKLTxDT0RFPlNJR1VTUjE8L0NPREU+IG1hbmlwdWxhdGlvbnMuCi0KLTxQPk5vdGUgdGhhdCBpdCBpcyB0aGVvcmV0aWNhbGx5IHBvc3NpYmxlIHRvIGVsaW1pbmF0ZSBhbGwgdGhyZWUgb2YKLXRoZXNlIGNhbGxzLiAgQnV0IGluIHJvdWdoIHRlc3RzIHRoZSBnYWluIHByb3ZlZCB0byBiZSBhbG1vc3QgdW5ub3RpY2VhYmxlLgotCi08UD5JbiBvcmRlciB0byBpbXBsZW1lbnQgdmlydHVhbCBob3N0cywgQXBhY2hlIG5lZWRzIHRvIGtub3cgdGhlCi1sb2NhbCBzb2NrZXQgYWRkcmVzcyB1c2VkIHRvIGFjY2VwdCB0aGUgY29ubmVjdGlvbjoKLQotPEJMT0NLUVVPVEU+PFBSRT4KLWdldHNvY2tuYW1lKDMsIHtzaW5fZmFtaWx5PUFGX0lORVQsIHNpbl9wb3J0PWh0b25zKDgwODApLCBzaW5fYWRkcj1pbmV0X2FkZHIoIjEyNy4wLjAuMSIpfSwgWzE2XSkgPSAwCi08L1BSRT48L0JMT0NLUVVPVEU+Ci0KLUl0IGlzIHBvc3NpYmxlIHRvIGVsaW1pbmF0ZSB0aGlzIGNhbGwgaW4gbWFueSBzaXR1YXRpb25zIChzdWNoIGFzIHdoZW4KLXRoZXJlIGFyZSBubyB2aXJ0dWFsIGhvc3RzLCBvciB3aGVuIDxDT0RFPkxpc3RlbjwvQ09ERT4gZGlyZWN0aXZlcyBhcmUKLXVzZWQgd2hpY2ggZG8gbm90IGhhdmUgd2lsZGNhcmQgYWRkcmVzc2VzKS4gIEJ1dCBubyBlZmZvcnQgaGFzIHlldCBiZWVuCi1tYWRlIHRvIGRvIHRoZXNlIG9wdGltaXphdGlvbnMuCi0KLTxQPkFwYWNoZSB0dXJucyBvZmYgdGhlIE5hZ2xlIGFsZ29yaXRobToKLQotPEJMT0NLUVVPVEU+PFBSRT4KLXNldHNvY2tvcHQoMywgSVBQUk9UT19UQ1AxLCBbMV0sIDQpICAgICA9IDAKLTwvUFJFPjwvQkxPQ0tRVU9URT4KLQotYmVjYXVzZSBvZiBwcm9ibGVtcyBkZXNjcmliZWQgaW4gCi08QSBIUkVGPSJodHRwOi8vd3d3LmlzaS5lZHUvfmpvaG5oL1BBUEVSUy9IZWlkZW1hbm45N2EuaHRtbCI+YQotcGFwZXIgYnkgSm9obiBIZWlkZW1hbm48L0E+LgotCi08UD5Ob3RpY2UgdGhlIHR3byA8Q09ERT50aW1lPC9DT0RFPiBjYWxsczoKLQotPEJMT0NLUVVPVEU+PFBSRT4KLXRpbWUoTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDg3Mzk1OTk2MAotLi4uCi10aW1lKE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4NzM5NTk5NjAKLTwvUFJFPjwvQkxPQ0tRVU9URT4KLQotT25lIG9mIHRoZXNlIG9jY3VycyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZXF1ZXN0LCBhbmQgdGhlIG90aGVyIG9jY3VycwotYXMgYSByZXN1bHQgb2Ygd3JpdGluZyB0aGUgbG9nLiAgQXQgbGVhc3Qgb25lIG9mIHRoZXNlIGlzIHJlcXVpcmVkIHRvCi1wcm9wZXJseSBpbXBsZW1lbnQgdGhlIEhUVFAgcHJvdG9jb2wuICBUaGUgc2Vjb25kIG9jY3VycyBiZWNhdXNlIHRoZQotQ29tbW9uIExvZyBGb3JtYXQgZGljdGF0ZXMgdGhhdCB0aGUgbG9nIHJlY29yZCBpbmNsdWRlIGEgdGltZXN0YW1wIG9mIHRoZQotZW5kIG9mIHRoZSByZXF1ZXN0LiAgQSBjdXN0b20gbG9nZ2luZyBtb2R1bGUgY291bGQgZWxpbWluYXRlIG9uZSBvZiB0aGUKLWNhbGxzLiAgT3IgeW91IGNhbiB1c2UgYSBtZXRob2Qgd2hpY2ggbW92ZXMgdGhlIHRpbWUgaW50byBzaGFyZWQgbWVtb3J5LAotc2VlIHRoZSA8QSBIUkVGPSIjcGF0Y2hlcyI+cGF0Y2hlcyBzZWN0aW9uIGJlbG93PC9BPi4KLQotPFA+QXMgZGVzY3JpYmVkIGVhcmxpZXIsIDxDT0RFPkV4dGVuZGVkU3RhdHVzIE9uPC9DT0RFPiBjYXVzZXMgdHdvCi08Q09ERT5nZXR0aW1lb2ZkYXk8L0NPREU+IGNhbGxzIGFuZCBhIGNhbGwgdG8gPENPREU+dGltZXM8L0NPREU+OgotCi08QkxPQ0tRVU9URT48UFJFPgotZ2V0dGltZW9mZGF5KHs4NzM5NTk5NjAsIDQwNDkzNX0sIE5VTEwpID0gMAotLi4uCi1nZXR0aW1lb2ZkYXkoezg3Mzk1OTk2MCwgNDE3NzQyfSwgTlVMTCkgPSAwCi10aW1lcyh7dG1zX3V0aW1lPTUsIHRtc19zdGltZT0wLCB0bXNfY3V0aW1lPTAsIHRtc19jc3RpbWU9MH0pID0gNDQ2NzQ3Ci08L1BSRT48L0JMT0NLUVVPVEU+Ci0KLVRoZXNlIGNhbiBiZSByZW1vdmVkIGJ5IHNldHRpbmcgPENPREU+RXh0ZW5kZWRTdGF0dXMgT2ZmPC9DT0RFPiAod2hpY2gKLWlzIHRoZSBkZWZhdWx0KS4KLQotPFA+SXQgbWlnaHQgc2VlbSBvZGQgdG8gY2FsbCA8Q09ERT5zdGF0PC9DT0RFPjoKLQotPEJMT0NLUVVPVEU+PFBSRT4KLXN0YXQoIi9ob21lL2RnYXVkZXQvYXAvYXBhY2hlbi9odGRvY3MvNmsiLCB7c3RfbW9kZT1TX0lGUkVHfDA2NDQsIHN0X3NpemU9NjE0NCwgLi4ufSkgPSAwCi08L1BSRT48L0JMT0NLUVVPVEU+Ci0KLVRoaXMgaXMgcGFydCBvZiB0aGUgYWxnb3JpdGhtIHdoaWNoIGNhbGN1bGF0ZXMgdGhlCi08Q09ERT5QQVRIX0lORk88L0NPREU+IGZvciB1c2UgYnkgQ0dJcy4gIEluIGZhY3QgaWYgdGhlIHJlcXVlc3QgaGFkIGJlZW4KLWZvciB0aGUgVVJJIDxDT0RFPi9jZ2ktYmluL3ByaW50ZW52L2Zvb2JhcjwvQ09ERT4gdGhlbiB0aGVyZSB3b3VsZCBiZQotdHdvIGNhbGxzIHRvIDxDT0RFPnN0YXQ8L0NPREU+LiAgVGhlIGZpcnN0IGZvcgotPENPREU+L2hvbWUvZGdhdWRldC9hcC9hcGFjaGVuL2NnaS1iaW4vcHJpbnRlbnYvZm9vYmFyPC9DT0RFPgotd2hpY2ggZG9lcyBub3QgZXhpc3QsIGFuZCB0aGUgc2Vjb25kIGZvcgotPENPREU+L2hvbWUvZGdhdWRldC9hcC9hcGFjaGVuL2NnaS1iaW4vcHJpbnRlbnY8L0NPREU+LCB3aGljaCBkb2VzIGV4aXN0LgotUmVnYXJkbGVzcywgYXQgbGVhc3Qgb25lIDxDT0RFPnN0YXQ8L0NPREU+IGNhbGwgaXMgbmVjZXNzYXJ5IHdoZW4KLXNlcnZpbmcgc3RhdGljIGZpbGVzIGJlY2F1c2UgdGhlIGZpbGUgc2l6ZSBhbmQgbW9kaWZpY2F0aW9uIHRpbWVzIGFyZQotdXNlZCB0byBnZW5lcmF0ZSBIVFRQIGhlYWRlcnMgKHN1Y2ggYXMgPENPREU+Q29udGVudC1MZW5ndGg8L0NPREU+LAotPENPREU+TGFzdC1Nb2RpZmllZDwvQ09ERT4pIGFuZCBpbXBsZW1lbnQgcHJvdG9jb2wgZmVhdHVyZXMgKHN1Y2gKLWFzIDxDT0RFPklmLU1vZGlmaWVkLVNpbmNlPC9DT0RFPikuICBBIHNvbWV3aGF0IG1vcmUgY2xldmVyIHNlcnZlcgotY291bGQgYXZvaWQgdGhlIDxDT0RFPnN0YXQ8L0NPREU+IHdoZW4gc2VydmluZyBub24tc3RhdGljIGZpbGVzLAotaG93ZXZlciBkb2luZyBzbyBpbiBBcGFjaGUgaXMgdmVyeSBkaWZmaWN1bHQgZ2l2ZW4gdGhlIG1vZHVsYXIgc3RydWN0dXJlLgotCi08UD5BbGwgc3RhdGljIGZpbGVzIGFyZSBzZXJ2ZWQgdXNpbmcgPENPREU+bW1hcDwvQ09ERT46Ci0KLTxCTE9DS1FVT1RFPjxQUkU+Ci1tbWFwKDAsIDYxNDQsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIDQsIDApID0gMHg0MDBlZTAwMAotLi4uCi1tdW5tYXAoMHg0MDBlZTAwMCwgNjE0NCkgICAgICAgICAgICAgICAgPSAwCi08L1BSRT48L0JMT0NLUVVPVEU+Ci0KLU9uIHNvbWUgYXJjaGl0ZWN0dXJlcyBpdCdzIHNsb3dlciB0byA8Q09ERT5tbWFwPC9DT0RFPiBzbWFsbAotZmlsZXMgdGhhbiBpdCBpcyB0byBzaW1wbHkgPENPREU+cmVhZDwvQ09ERT4gdGhlbS4gIFRoZSBkZWZpbmUKLTxDT0RFPk1NQVBfVEhSRVNIT0xEPC9DT0RFPiBjYW4gYmUgc2V0IHRvIHRoZSBtaW5pbXVtCi1zaXplIHJlcXVpcmVkIGJlZm9yZSB1c2luZyA8Q09ERT5tbWFwPC9DT0RFPi4gIEJ5IGRlZmF1bHQKLWl0J3Mgc2V0IHRvIDAgKGV4Y2VwdCBvbiBTdW5PUzQgd2hlcmUgZXhwZXJpbWVudGF0aW9uIGhhcwotc2hvd24gODE5MiB0byBiZSBhIGJldHRlciB2YWx1ZSkuICBVc2luZyBhIHRvb2wgc3VjaCBhcyA8QQotSFJFRj0iaHR0cDovL3d3dy5iaXRtb3Zlci5jb20vbG1iZW5jaC8iPmxtYmVuY2g8L0E+IHlvdQotY2FuIGRldGVybWluZSB0aGUgb3B0aW1hbCBzZXR0aW5nIGZvciB5b3VyIGVudmlyb25tZW50LgotCi08UD5Zb3UgbWF5IGFsc28gd2lzaCB0byBleHBlcmltZW50IHdpdGggPENPREU+TU1BUF9TRUdNRU5UX1NJWkU8L0NPREU+Ci0oZGVmYXVsdCAzMjc2OCkgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdAotd2lsbCBiZSB3cml0dGVuIGF0IGEgdGltZSBmcm9tIG1tYXAoKWQgZmlsZXMuICBBcGFjaGUgb25seSByZXNldHMgdGhlCi1jbGllbnQncyA8Q09ERT5UaW1lb3V0PC9DT0RFPiBpbiBiZXR3ZWVuIHdyaXRlKClzLiAgU28gc2V0dGluZyB0aGlzCi1sYXJnZSBtYXkgbG9jayBvdXQgbG93IGJhbmR3aWR0aCBjbGllbnRzIHVubGVzcyB5b3UgYWxzbyBpbmNyZWFzZSB0aGUKLTxDT0RFPlRpbWVvdXQ8L0NPREU+LgotCi08UD5JdCBtYXkgZXZlbiBiZSB0aGUgY2FzZSB0aGF0IDxDT0RFPm1tYXA8L0NPREU+IGlzbid0Ci11c2VkIG9uIHlvdXIgYXJjaGl0ZWN0dXJlLCBpZiBzbyB0aGVuIGRlZmluaW5nIDxDT0RFPlVTRV9NTUFQX0ZJTEVTPC9DT0RFPgotYW5kIDxDT0RFPkhBVkVfTU1BUDwvQ09ERT4gbWlnaHQgd29yayAoaWYgaXQgd29ya3MgdGhlbiByZXBvcnQgYmFjayB0byB1cykuCi0KLTxQPkFwYWNoZSBkb2VzIGl0cyBiZXN0IHRvIGF2b2lkIGNvcHlpbmcgYnl0ZXMgYXJvdW5kIGluIG1lbW9yeS4gIFRoZQotZmlyc3Qgd3JpdGUgb2YgYW55IHJlcXVlc3QgdHlwaWNhbGx5IGlzIHR1cm5lZCBpbnRvIGEgPENPREU+d3JpdGV2PC9DT0RFPgotd2hpY2ggY29tYmluZXMgYm90aCB0aGUgaGVhZGVycyBhbmQgdGhlIGZpcnN0IGh1bmsgb2YgZGF0YToKLQotPEJMT0NLUVVPVEU+PFBSRT4KLXdyaXRldigzLCBbeyJIVFRQLzEuMSAyMDAgT0tcclxuRGF0ZTogVGh1LCAxMSIuLi4sIDI0NX0sIHsiXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDAiLi4uLCA2MTQ0fV0sIDIpID0gNjM4OQotPC9QUkU+PC9CTE9DS1FVT1RFPgotCi1XaGVuIGRvaW5nIEhUVFAvMS4xIGNodW5rZWQgZW5jb2RpbmcgQXBhY2hlIHdpbGwgZ2VuZXJhdGUgdXAgdG8gZm91cgotZWxlbWVudCA8Q09ERT53cml0ZXY8L0NPREU+cy4gIFRoZSBnb2FsIGlzIHRvIHB1c2ggdGhlIGJ5dGUgY29weWluZwotaW50byB0aGUga2VybmVsLCB3aGVyZSBpdCB0eXBpY2FsbHkgaGFzIHRvIGhhcHBlbiBhbnlob3cgKHRvIGFzc2VtYmxlCi1uZXR3b3JrIHBhY2tldHMpLiAgT24gdGVzdGluZywgdmFyaW91cyBVbml4ZXMgKEJTREkgMi54LCBTb2xhcmlzIDIuNSwKLUxpbnV4IDIuMC4zMSspIHByb3Blcmx5IGNvbWJpbmUgdGhlIGVsZW1lbnRzIGludG8gbmV0d29yayBwYWNrZXRzLgotUHJlLTIuMC4zMSBMaW51eCB3aWxsIG5vdCBjb21iaW5lLCBhbmQgd2lsbCBjcmVhdGUgYSBwYWNrZXQgZm9yCi1lYWNoIGVsZW1lbnQsIHNvIHVwZ3JhZGluZyBpcyBhIGdvb2QgaWRlYS4gIERlZmluaW5nIDxDT0RFPk5PX1dSSVRFVjwvQ09ERT4KLXdpbGwgZGlzYWJsZSB0aGlzIGNvbWJpbmluZywgYnV0IHJlc3VsdCBpbiB2ZXJ5IHBvb3IgY2h1bmtlZCBlbmNvZGluZwotcGVyZm9ybWFuY2UuCi0KLTxQPlRoZSBsb2cgd3JpdGU6Ci0KLTxCTE9DS1FVT1RFPjxQUkU+Ci13cml0ZSgxNywgIjEyNy4wLjAuMSAtIC0gWzEwL1NlcC8xOTk3OjIzOjM5Ii4uLiwgNzEpID0gNzEKLTwvUFJFPjwvQkxPQ0tRVU9URT4KLQotY2FuIGJlIGRlZmVycmVkIGJ5IGRlZmluaW5nIDxDT0RFPkJVRkZFUkVEX0xPR1M8L0NPREU+LiAgSW4gdGhpcyBjYXNlCi11cCB0byA8Q09ERT5QSVBFX0JVRjwvQ09ERT4gYnl0ZXMgKGEgUE9TSVggZGVmaW5lZCBjb25zdGFudCkgb2YgbG9nIGVudHJpZXMKLWFyZSBidWZmZXJlZCBiZWZvcmUgd3JpdGluZy4gIEF0IG5vIHRpbWUgZG9lcyBpdCBzcGxpdCBhIGxvZyBlbnRyeQotYWNyb3NzIGEgPENPREU+UElQRV9CVUY8L0NPREU+IGJvdW5kYXJ5IGJlY2F1c2UgdGhvc2Ugd3JpdGVzIG1heSBub3QKLWJlIGF0b21pYy4gICg8RU0+aS5lLjwvRU0+LCBlbnRyaWVzIGZyb20gbXVsdGlwbGUgY2hpbGRyZW4gY291bGQgYmVjb21lIG1peGVkIHRvZ2V0aGVyKS4KLVRoZSBjb2RlIGRvZXMgaXQgYmVzdCB0byBmbHVzaCB0aGlzIGJ1ZmZlciB3aGVuIGEgY2hpbGQgZGllcy4KLQotPFA+VGhlIGxpbmdlcmluZyBjbG9zZSBjb2RlIGNhdXNlcyBmb3VyIHN5c3RlbSBjYWxsczoKLQotPEJMT0NLUVVPVEU+PFBSRT4KLXNodXRkb3duKDMsIDEgLyogc2VuZCAqLykgICAgICAgICAgICAgICA9IDAKLW9sZHNlbGVjdCg0LCBbM10sIE5VTEwsIFszXSwgezIsIDB9KSAgICA9IDEgKGluIFszXSwgbGVmdCB7MiwgMH0pCi1yZWFkKDMsICIiLCAyMDQ4KSAgICAgICAgICAgICAgICAgICAgICAgPSAwCi1jbG9zZSgzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwCi08L1BSRT48L0JMT0NLUVVPVEU+Ci0KLXdoaWNoIHdlcmUgZGVzY3JpYmVkIGVhcmxpZXIuCi0KLTxQPkxldCdzIGFwcGx5IHNvbWUgb2YgdGhlc2Ugb3B0aW1pemF0aW9uczoKLTxDT0RFPi1EU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBUIC1EQlVGRkVSRURfTE9HUzwvQ09ERT4gYW5kCi08Q09ERT5FeHRlbmRlZFN0YXR1cyBPZmY8L0NPREU+LiAgSGVyZSdzIHRoZSBmaW5hbCB0cmFjZToKLQotPEJMT0NLUVVPVEU+PFBSRT4KLWFjY2VwdCgxNSwge3Npbl9mYW1pbHk9QUZfSU5FVCwgc2luX3BvcnQ9aHRvbnMoMjIyODYpLCBzaW5fYWRkcj1pbmV0X2FkZHIoIjEyNy4wLjAuMSIpfSwgWzE2XSkgPSAzCi1zaWdhY3Rpb24oU0lHVVNSMSwge1NJR19JR059LCB7MHg4MDU4Yzk4LCBbXSwgU0FfSU5URVJSVVBUfSkgPSAwCi1nZXRzb2NrbmFtZSgzLCB7c2luX2ZhbWlseT1BRl9JTkVULCBzaW5fcG9ydD1odG9ucyg4MDgwKSwgc2luX2FkZHI9aW5ldF9hZGRyKCIxMjcuMC4wLjEiKX0sIFsxNl0pID0gMAotc2V0c29ja29wdCgzLCBJUFBST1RPX1RDUDEsIFsxXSwgNCkgICAgID0gMAotcmVhZCgzLCAiR0VUIC82ayBIVFRQLzEuMFxyXG5Vc2VyLUFnZW50OiAiLi4uLCA0MDk2KSA9IDYwCi1zaWdhY3Rpb24oU0lHVVNSMSwge1NJR19JR059LCB7U0lHX0lHTn0pID0gMAotdGltZShOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gODczOTYxOTE2Ci1zdGF0KCIvaG9tZS9kZ2F1ZGV0L2FwL2FwYWNoZW4vaHRkb2NzLzZrIiwge3N0X21vZGU9U19JRlJFR3wwNjQ0LCBzdF9zaXplPTYxNDQsIC4uLn0pID0gMAotb3BlbigiL2hvbWUvZGdhdWRldC9hcC9hcGFjaGVuL2h0ZG9jcy82ayIsIE9fUkRPTkxZKSA9IDQKLW1tYXAoMCwgNjE0NCwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgNCwgMCkgPSAweDQwMGUzMDAwCi13cml0ZXYoMywgW3siSFRUUC8xLjEgMjAwIE9LXHJcbkRhdGU6IFRodSwgMTEiLi4uLCAyNDV9LCB7IlwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwIi4uLiwgNjE0NH1dLCAyKSA9IDYzODkKLWNsb3NlKDQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAKLXRpbWUoTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDg3Mzk2MTkxNgotc2h1dGRvd24oMywgMSAvKiBzZW5kICovKSAgICAgICAgICAgICAgID0gMAotb2xkc2VsZWN0KDQsIFszXSwgTlVMTCwgWzNdLCB7MiwgMH0pICAgID0gMSAoaW4gWzNdLCBsZWZ0IHsyLCAwfSkKLXJlYWQoMywgIiIsIDIwNDgpICAgICAgICAgICAgICAgICAgICAgICA9IDAKLWNsb3NlKDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAKLXNpZ2FjdGlvbihTSUdVU1IxLCB7MHg4MDU4Yzk4LCBbXSwgU0FfSU5URVJSVVBUfSwge1NJR19JR059KSA9IDAKLW11bm1hcCgweDQwMGUzMDAwLCA2MTQ0KSAgICAgICAgICAgICAgICA9IDAKLTwvUFJFPjwvQkxPQ0tRVU9URT4KLQotVGhhdCdzIDE5IHN5c3RlbSBjYWxscywgb2Ygd2hpY2ggNCByZW1haW4gcmVsYXRpdmVseSBlYXN5IHRvIHJlbW92ZSwKLWJ1dCBkb24ndCBzZWVtIHdvcnRoIHRoZSBlZmZvcnQuCi0KLTxIMz48QSBOQU1FPSJwYXRjaGVzIj5BcHBlbmRpeDogUGF0Y2hlcyBBdmFpbGFibGU8L0E+PC9IMz4KLQotVGhlcmUgYXJlCi08QSBIUkVGPSJodHRwOi8vd3d3LmFyY3RpYy5vcmcvfmRnYXVkZXQvYXBhY2hlLzEuMy8iPgotc2V2ZXJhbCBwZXJmb3JtYW5jZSBwYXRjaGVzIGF2YWlsYWJsZSBmb3IgMS4zLjwvQT4gIEJ1dCB0aGV5IG1heQotYmUgc2xpZ2h0bHkgb3V0IG9mIGRhdGUgYnkgdGhlIHRpbWUgQXBhY2hlIDEuMy4wIGhhcyBiZWVuIHJlbGVhc2VkLAotaXQgc2hvdWxkbid0IGJlIGRpZmZpY3VsdCBmb3Igc29tZW9uZSB3aXRoIGEgbGl0dGxlIEMga25vd2xlZGdlIHRvCi11cGRhdGUgdGhlbS4gIEluIHBhcnRpY3VsYXI6Ci0KLTxVTD4KLTxMST5BIAotPEEgSFJFRj0iaHR0cDovL3d3dy5hcmN0aWMub3JnL35kZ2F1ZGV0L2FwYWNoZS8xLjMvc2hhcmVkX3RpbWUucGF0Y2giCi0+cGF0Y2g8L0E+IHRvIHJlbW92ZSBhbGwgPENPREU+dGltZSgyKTwvQ09ERT4gc3lzdGVtIGNhbGxzLgotPExJPkEKLTxBIEhSRUY9Imh0dHA6Ly93d3cuYXJjdGljLm9yZy9+ZGdhdWRldC9hcGFjaGUvMS4zL21vZF9pbmNsdWRlX3NwZWVkdXBzLnBhdGNoIgotPnBhdGNoPC9BPiB0byByZW1vdmUgdmFyaW91cyBzeXN0ZW0gY2FsbHMgZnJvbSA8Q09ERT5tb2RfaW5jbHVkZTwvQ09ERT4sCi10aGVzZSBjYWxscyBhcmUgdXNlZCBieSBmZXcgc2l0ZXMgYnV0IHJlcXVpcmVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KLTxMST5BCi08QSBIUkVGPSJodHRwOi8vd3d3LmFyY3RpYy5vcmcvfmRnYXVkZXQvYXBhY2hlLzEuMy90b3BfZnVlbC5wYXRjaCIKLT5wYXRjaDwvQT4gd2hpY2ggaW50ZWdyYXRlcyB0aGUgYWJvdmUgdHdvIHBsdXMgYSBmZXcgb3RoZXIgc3BlZWR1cHMgYXQgdGhlCi1jb3N0IG9mIHJlbW92aW5nIHNvbWUgZnVuY3Rpb25hbGl0eS4KLTwvVUw+Ci0KLTxIMz5BcHBlbmRpeDogVGhlIFByZS1Gb3JraW5nIE1vZGVsPC9IMz4KLQotPFA+QXBhY2hlIChvbiBVbml4KSBpcyBhIDxFTT5wcmUtZm9ya2luZzwvRU0+IG1vZGVsIHNlcnZlci4gIFRoZQotPEVNPnBhcmVudDwvRU0+IHByb2Nlc3MgaXMgcmVzcG9uc2libGUgb25seSBmb3IgZm9ya2luZyA8RU0+Y2hpbGQ8L0VNPgotcHJvY2Vzc2VzLCBpdCBkb2VzIG5vdCBzZXJ2ZSBhbnkgcmVxdWVzdHMgb3Igc2VydmljZSBhbnkgbmV0d29yawotc29ja2V0cy4gIFRoZSBjaGlsZCBwcm9jZXNzZXMgYWN0dWFsbHkgcHJvY2VzcyBjb25uZWN0aW9ucywgdGhleSBzZXJ2ZQotbXVsdGlwbGUgY29ubmVjdGlvbnMgKG9uZSBhdCBhIHRpbWUpIGJlZm9yZSBkeWluZy4KLVRoZSBwYXJlbnQgc3Bhd25zIG5ldyBvciBraWxscyBvZmYgb2xkCi1jaGlsZHJlbiBpbiByZXNwb25zZSB0byBjaGFuZ2VzIGluIHRoZSBsb2FkIG9uIHRoZSBzZXJ2ZXIgKGl0IGRvZXMgc28KLWJ5IG1vbml0b3JpbmcgYSBzY29yZWJvYXJkIHdoaWNoIHRoZSBjaGlsZHJlbiBrZWVwIHVwIHRvIGRhdGUpLgotCi08UD5UaGlzIG1vZGVsIGZvciBzZXJ2ZXJzIG9mZmVycyBhIHJvYnVzdG5lc3MgdGhhdCBvdGhlciBtb2RlbHMgZG8KLW5vdC4gIEluIHBhcnRpY3VsYXIsIHRoZSBwYXJlbnQgY29kZSBpcyB2ZXJ5IHNpbXBsZSwgYW5kIHdpdGggYSBoaWdoCi1kZWdyZWUgb2YgY29uZmlkZW5jZSB0aGUgcGFyZW50IHdpbGwgY29udGludWUgdG8gZG8gaXRzIGpvYiB3aXRob3V0Ci1lcnJvci4gIFRoZSBjaGlsZHJlbiBhcmUgY29tcGxleCwgYW5kIHdoZW4geW91IGFkZCBpbiB0aGlyZCBwYXJ0eQotY29kZSB2aWEgbW9kdWxlcywgeW91IHJpc2sgc2VnbWVudGF0aW9uIGZhdWx0cyBhbmQgb3RoZXIgZm9ybXMgb2YKLWNvcnJ1cHRpb24uICBFdmVuIHNob3VsZCBzdWNoIGEgdGhpbmcgaGFwcGVuLCBpdCBvbmx5IGFmZmVjdHMgb25lCi1jb25uZWN0aW9uIGFuZCB0aGUgc2VydmVyIGNvbnRpbnVlcyBzZXJ2aW5nIHJlcXVlc3RzLiAgVGhlIHBhcmVudAotcXVpY2tseSByZXBsYWNlcyB0aGUgZGVhZCBjaGlsZC4KLQotPFA+UHJlLWZvcmtpbmcgaXMgYWxzbyB2ZXJ5IHBvcnRhYmxlIGFjcm9zcyBkaWFsZWN0cyBvZiBVbml4LgotSGlzdG9yaWNhbGx5IHRoaXMgaGFzIGJlZW4gYW4gaW1wb3J0YW50IGdvYWwgZm9yIEFwYWNoZSwgYW5kIGl0IGNvbnRpbnVlcwotdG8gcmVtYWluIHNvLgotCi08UD5UaGUgcHJlLWZvcmtpbmcgbW9kZWwgY29tZXMgdW5kZXIgY3JpdGljaXNtIGZvciB2YXJpb3VzCi1wZXJmb3JtYW5jZSBhc3BlY3RzLiAgT2YgcGFydGljdWxhciBjb25jZXJuIGFyZSB0aGUgb3ZlcmhlYWQKLW9mIGZvcmtpbmcgYSBwcm9jZXNzLCB0aGUgb3ZlcmhlYWQgb2YgY29udGV4dCBzd2l0Y2hlcyBiZXR3ZWVuCi1wcm9jZXNzZXMsIGFuZCB0aGUgbWVtb3J5IG92ZXJoZWFkIG9mIGhhdmluZyBtdWx0aXBsZSBwcm9jZXNzZXMuCi1GdXJ0aGVybW9yZSBpdCBkb2VzIG5vdCBvZmZlciBhcyBtYW55IG9wcG9ydHVuaXRpZXMgZm9yIGRhdGEtY2FjaGluZwotYmV0d2VlbiByZXF1ZXN0cyAoc3VjaCBhcyBhIHBvb2wgb2YgPENPREU+bW1hcHBlZDwvQ09ERT4gZmlsZXMpLgotVmFyaW91cyBvdGhlciBtb2RlbHMgZXhpc3QgYW5kIGV4dGVuc2l2ZSBhbmFseXNpcyBjYW4gYmUgZm91bmQgaW4gdGhlCi08QSBIUkVGPSJodHRwOi8vd3d3LmNzLnd1c3RsLmVkdS9+anhoL3Jlc2VhcmNoL3Jlc2VhcmNoLmh0bWwiPiBwYXBlcnMKLW9mIHRoZSBKQVdTIHByb2plY3Q8L0E+LiAgSW4gcHJhY3RpY2UgYWxsIG9mIHRoZXNlIGNvc3RzIHZhcnkgZHJhc3RpY2FsbHkKLWRlcGVuZGluZyBvbiB0aGUgb3BlcmF0aW5nIHN5c3RlbS4KLQotPFA+QXBhY2hlJ3MgY29yZSBjb2RlIGlzIGFscmVhZHkgbXVsdGl0aHJlYWQgYXdhcmUsIGFuZCBBcGFjaGUgdmVyc2lvbgotMS4zIGlzIG11bHRpdGhyZWFkZWQgb24gTlQuICBUaGVyZSBoYXZlIGJlZW4gYXQgbGVhc3QgdHdvIG90aGVyIGV4cGVyaW1lbnRhbAotaW1wbGVtZW50YXRpb25zIG9mIHRocmVhZGVkIEFwYWNoZSwgb25lIHVzaW5nIHRoZSAxLjMgY29kZSBiYXNlIG9uIERDRSwKLWFuZCBvbmUgdXNpbmcgYSBjdXN0b20gdXNlci1sZXZlbCB0aHJlYWRzIHBhY2thZ2UgYW5kIHRoZSAxLjAgY29kZSBiYXNlLAotbmVpdGhlciBhcmUgYXZhaWxhYmxlIHB1YmxpY2FsbHkuICBUaGVyZSBpcyBhbHNvIGFuIGV4cGVyaW1lbnRhbCBwb3J0IG9mCi1BcGFjaGUgMS4zIHRvIDxBIEhSRUY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvZG9jcy9yZWZMaXN0L3JlZk5TUFIvIj4KLU5ldHNjYXBlJ3MgUG9ydGFibGUgUnVuIFRpbWU8L0E+LCB3aGljaAotPEEgSFJFRj0iaHR0cDovL3d3dy5hcmN0aWMub3JnL35kZ2F1ZGV0L2FwYWNoZS8yLjAvIj5pcyBhdmFpbGFibGU8L0E+Ci0oYnV0IHlvdSdyZSBlbmNvdXJhZ2VkIHRvIGpvaW4gdGhlCi08QSBIUkVGPSJodHRwOi8vZGV2LmFwYWNoZS5vcmcvbWFpbGluZy1saXN0cyI+bmV3LWh0dHBkIG1haWxpbmcgbGlzdDwvQT4KLWlmIHlvdSBpbnRlbmQgdG8gdXNlIGl0KS4KLVBhcnQgb2Ygb3VyIHJlZGVzaWduIGZvciB2ZXJzaW9uIDIuMAotb2YgQXBhY2hlIHdpbGwgaW5jbHVkZSBhYnN0cmFjdGlvbnMgb2YgdGhlIHNlcnZlciBtb2RlbCBzbyB0aGF0IHdlCi1jYW4gY29udGludWUgdG8gc3VwcG9ydCB0aGUgcHJlLWZvcmtpbmcgbW9kZWwsIGFuZCBhbHNvIHN1cHBvcnQgdmFyaW91cwotdGhyZWFkZWQgbW9kZWxzLgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9taXNjL3Jld3JpdGVndWlkZS5odG1sIGIvZG9jcy9tYW51YWwvbWlzYy9yZXdyaXRlZ3VpZGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjljMTBlMi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9taXNjL3Jld3JpdGVndWlkZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkwNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD48SEVBRD4KLTxUSVRMRT5BcGFjaGUgMS4zIFVSTCBSZXdyaXRpbmcgR3VpZGU8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPEJMT0NLUVVPVEU+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotCi08RElWIEFMSUdOPUNFTlRFUj4KLQotPEgxPgotQXBhY2hlIDEuMzxCUj4KLVVSTCBSZXdyaXRpbmcgR3VpZGU8QlI+Ci08L0gxPgotCi08QUREUkVTUz5PcmlnaW5hbGx5IHdyaXR0ZW4gYnk8QlI+Ci1SYWxmIFMuIEVuZ2Vsc2NoYWxsICZsdDtyc2VAYXBhY2hlLm9yZyZndDxCUj4KLURlY2VtYmVyIDE5OTc8L0FERFJFU1M+Ci0KLTwvRElWPgotCi08UD4KLVRoaXMgZG9jdW1lbnQgc3VwcGxlbWVudHMgdGhlIG1vZF9yZXdyaXRlIDxhCi1ocmVmPSIuLi9tb2QvbW9kX3Jld3JpdGUuaHRtbCI+cmVmZXJlbmNlIGRvY3VtZW50YXRpb248L2E+LiBJdCBkZXNjcmliZXMKLWhvdyBvbmUgY2FuIHVzZSBBcGFjaGUncyBtb2RfcmV3cml0ZSB0byBzb2x2ZSB0eXBpY2FsIFVSTC1iYXNlZCBwcm9ibGVtcwotd2VibWFzdGVycyBhcmUgdXN1YWxseSBjb25mcm9udGVkIHdpdGggaW4gcHJhY3RpY2UuIEkgZ2l2ZSBkZXRhaWxlZAotZGVzY3JpcHRpb25zIG9uIGhvdyB0byBzb2x2ZSBlYWNoIHByb2JsZW0gYnkgY29uZmlndXJpbmcgVVJMIHJld3JpdGluZwotcnVsZXNldHMuCi0KLTxIMj48YSBuYW1lPSJUb0MxIj5JbnRyb2R1Y3Rpb24gdG8gbW9kX3Jld3JpdGU8L2E+PC9IMj4KLQotVGhlIEFwYWNoZSBtb2R1bGUgbW9kX3Jld3JpdGUgaXMgYSBraWxsZXIgb25lLCBpLmUuIGl0IGlzIGEgcmVhbGx5Ci1zb3BoaXN0aWNhdGVkIG1vZHVsZSB3aGljaCBwcm92aWRlcyBhIHBvd2VyZnVsIHdheSB0byBkbyBVUkwgbWFuaXB1bGF0aW9ucy4KLVdpdGggaXQgeW91IGNhbiBuZWFybHkgZG8gYWxsIHR5cGVzIG9mIFVSTCBtYW5pcHVsYXRpb25zIHlvdSBldmVyIGRyZWFtZWQKLWFib3V0LiBUaGUgcHJpY2UgeW91IGhhdmUgdG8gcGF5IGlzIHRvIGFjY2VwdCBjb21wbGV4aXR5LCBiZWNhdXNlCi1tb2RfcmV3cml0ZSdzIG1ham9yIGRyYXdiYWNrIGlzIHRoYXQgaXQgaXMgbm90IGVhc3kgdG8gdW5kZXJzdGFuZCBhbmQgdXNlIGZvcgotdGhlIGJlZ2lubmVyLiBBbmQgZXZlbiBBcGFjaGUgZXhwZXJ0cyBzb21ldGltZXMgZGlzY292ZXIgbmV3IGFzcGVjdHMgd2hlcmUKLW1vZF9yZXdyaXRlIGNhbiBoZWxwLgotPFA+Ci1JbiBvdGhlciB3b3JkczogV2l0aCBtb2RfcmV3cml0ZSB5b3UgZWl0aGVyIHNob290IHlvdXJzZWxmIGluIHRoZSBmb290IHRoZQotZmlyc3QgdGltZSBhbmQgbmV2ZXIgdXNlIGl0IGFnYWluIG9yIGxvdmUgaXQgZm9yIHRoZSByZXN0IG9mIHlvdXIgbGlmZSBiZWNhdXNlCi1vZiBpdHMgcG93ZXIuIFRoaXMgcGFwZXIgdHJpZXMgdG8gZ2l2ZSB5b3UgYSBmZXcgaW5pdGlhbCBzdWNjZXNzIGV2ZW50cyB0bwotYXZvaWQgdGhlIGZpcnN0IGNhc2UgYnkgcHJlc2VudGluZyBhbHJlYWR5IGludmVudGVkIHNvbHV0aW9ucyB0byB5b3UuCi0KLTxIMj48YSBuYW1lPSJUb0MyIj5QcmFjdGljYWwgU29sdXRpb25zPC9hPjwvSDI+Ci0KLUhlcmUgY29tZSBhIGxvdCBvZiBwcmFjdGljYWwgc29sdXRpb25zIEkndmUgZWl0aGVyIGludmVudGVkIG15c2VsZiBvcgotY29sbGVjdGVkIGZyb20gb3RoZXIgcGVvcGxlcyBzb2x1dGlvbnMgaW4gdGhlIHBhc3QuIEZlZWwgZnJlZSB0byBsZWFybiB0aGUKLWJsYWNrIG1hZ2ljIG9mIFVSTCByZXdyaXRpbmcgZnJvbSB0aGVzZSBleGFtcGxlcy4KLQotPFA+Ci1BVFRFTlRJT046IERlcGVuZGluZyBvbiB5b3VyIHNlcnZlci1jb25maWd1cmF0aW9uIGl0IGNhbiBiZSBuZWNlc3NhcnkgdG8KLXNsaWdodGx5IGNoYW5nZSB0aGUgZXhhbXBsZXMgZm9yIHlvdXIgc2l0dWF0aW9uLCBlLmcuIGFkZGluZyB0aGUgW1BUXSBmbGFnCi13aGVuIGFkZGl0aW9uYWxseSB1c2luZyBtb2RfYWxpYXMgYW5kIG1vZF91c2VyZGlyLCBldGMuIE9yIHJld3JpdGluZyBhIHJ1bGVzZXQKLXRvIGZpdCBpbiA8dHQ+Lmh0YWNjZXNzPC90dD4gY29udGV4dCBpbnN0ZWFkIG9mIHBlci1zZXJ2ZXIgY29udGV4dC4gQWx3YXlzIHRyeQotdG8gdW5kZXJzdGFuZCB3aGF0IGEgcGFydGljdWxhciBydWxlc2V0IHJlYWxseSBkb2VzIGJlZm9yZSB5b3UgdXNlIGl0LiBJdAotYXZvaWQgcHJvYmxlbXMuCi0KLTxIMT5VUkwgTGF5b3V0PC9IMT4KLQotPFA+Ci08SDI+Q2Fub25pY2FsIFVSTHM8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotT24gc29tZSB3ZWJzZXJ2ZXJzIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIFVSTCBmb3IgYSByZXNvdXJjZS4gIFVzdWFsbHkgdGhlcmUKLWFyZSBjYW5vbmljYWwgVVJMcyAod2hpY2ggc2hvdWxkIGJlIGFjdHVhbGx5IHVzZWQgYW5kIGRpc3RyaWJ1dGVkKSBhbmQgdGhvc2UKLXdoaWNoIGFyZSBqdXN0IHNob3J0Y3V0cywgaW50ZXJuYWwgb25lcywgZXRjLiAgSW5kZXBlbmRlZCB3aGljaCBVUkwgdGhlIHVzZXIKLXN1cHBsaWVkIHdpdGggdGhlIHJlcXVlc3QgaGUgc2hvdWxkIGZpbmFsbHkgc2VlIHRoZSBjYW5vbmljYWwgb25lIG9ubHkuCi0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1XZSBkbyBhbiBleHRlcm5hbCBIVFRQIHJlZGlyZWN0IGZvciBhbGwgbm9uLWNhbm9uaWNhbCBVUkxzIHRvIGZpeCB0aGVtIGluIHRoZQotbG9jYXRpb24gdmlldyBvZiB0aGUgQnJvd3NlciBhbmQgZm9yIGFsbCBzdWJzZXF1ZW50IHJlcXVlc3RzLiBJbiB0aGUgZXhhbXBsZQotcnVsZXNldCBiZWxvdyB3ZSByZXBsYWNlIDx0dD4vfnVzZXI8L3R0PiBieSB0aGUgY2Fub25pY2FsIDx0dD4vdS91c2VyPC90dD4gYW5kCi1maXggYSBtaXNzaW5nIHRyYWlsaW5nIHNsYXNoIGZvciA8dHQ+L3UvdXNlcjwvdHQ+LgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVSdWxlICAgXi88Yj5+PC9iPihbXi9dKykvPyguKikgICAgLzxiPnU8L2I+LyQxLyQyICBbPGI+UjwvYj5dCi1SZXdyaXRlUnVsZSAgIF4vKFt1Z2VdKS8oPGI+W14vXSs8L2I+KSQgIC8kMS8kMjxiPi88L2I+ICAgWzxiPlI8L2I+XQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTwvREw+Ci0KLTxQPgotPEgyPkNhbm9uaWNhbCBIb3N0bmFtZXM8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotLi4uCi0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUNvbmQgJXtIVFRQX0hPU1R9ICAgIV5mdWxseVwucXVhbGlmaWVkXC5kb21haW5cLm5hbWUgW05DXQotUmV3cml0ZUNvbmQgJXtIVFRQX0hPU1R9ICAgIV4kCi1SZXdyaXRlQ29uZCAle1NFUlZFUl9QT1JUfSAhXjgwJAotUmV3cml0ZVJ1bGUgXi8oLiopICAgICAgICAgaHR0cDovL2Z1bGx5LnF1YWxpZmllZC5kb21haW4ubmFtZTole1NFUlZFUl9QT1JUfS8kMSBbTCxSXQotUmV3cml0ZUNvbmQgJXtIVFRQX0hPU1R9ICAgIV5mdWxseVwucXVhbGlmaWVkXC5kb21haW5cLm5hbWUgW05DXQotUmV3cml0ZUNvbmQgJXtIVFRQX0hPU1R9ICAgIV4kCi1SZXdyaXRlUnVsZSBeLyguKikgICAgICAgICBodHRwOi8vZnVsbHkucXVhbGlmaWVkLmRvbWFpbi5uYW1lLyQxIFtMLFJdCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPC9ETD4KLQotPFA+Ci08SDI+TW92ZWQgRG9jdW1lbnRSb290PC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLVVzdWFsbHkgdGhlIERvY3VtZW50Um9vdCBvZiB0aGUgd2Vic2VydmVyIGRpcmVjdGx5IHJlbGF0ZXMgdG8gdGhlIFVSTAotYGA8dHQ+LzwvdHQ+JycuIEJ1dCBvZnRlbiB0aGlzIGRhdGEgaXMgbm90IHJlYWxseSBvZiB0b3AtbGV2ZWwgcHJpb3JpdHksIGl0IGlzCi1wZXJoYXBzIGp1c3Qgb25lIGVudGl0eSBvZiBhIGxvdCBvZiBkYXRhIHBvb2xzLiBGb3IgaW5zdGFuY2UgYXQgb3VyIEludHJhbmV0Ci1zaXRlcyB0aGVyZSBhcmUgPHR0Pi9lL3d3dy88L3R0PiAodGhlIGhvbWVwYWdlIGZvciBXV1cpLCA8dHQ+L2Uvc3d3LzwvdHQ+ICh0aGUKLWhvbWVwYWdlIGZvciB0aGUgSW50cmFuZXQpIGV0Yy4gTm93IGJlY2F1c2UgdGhlIGRhdGEgb2YgdGhlIERvY3VtZW50Um9vdCBzdGF5cwotYXQgPHR0Pi9lL3d3dy88L3R0PiB3ZSBoYWQgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIGlubGluZWQgaW1hZ2VzIGFuZCBvdGhlcgotc3R1ZmYgaW5zaWRlIHRoaXMgZGF0YSBwb29sIHdvcmsgZm9yIHN1YnNlcXVlbnQgcmVxdWVzdHMuIAotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotV2UganVzdCByZWRpcmVjdCB0aGUgVVJMIDx0dD4vPC90dD4gdG8gPHR0Pi9lL3d3dy88L3R0Pi4gIFdoaWxlIGlzIHNlZW1zCi10cml2aWFsIGl0IGlzIGFjdHVhbGx5IHRyaXZpYWwgd2l0aCBtb2RfcmV3cml0ZSwgb25seS4gIEJlY2F1c2UgdGhlIHR5cGljYWwKLW9sZCBtZWNoYW5pc21zIG9mIFVSTCA8aT5BbGlhc2VzPC9pPiAoYXMgcHJvdmlkZXMgYnkgbW9kX2FsaWFzIGFuZCBmcmllbmRzKQotb25seSB1c2VkIDxpPnByZWZpeDwvaT4gbWF0Y2hpbmcuIFdpdGggdGhpcyB5b3UgY2Fubm90IGRvIHN1Y2ggYSByZWRpcmVjdGlvbgotYmVjYXVzZSB0aGUgRG9jdW1lbnRSb290IGlzIGEgcHJlZml4IG9mIGFsbCBVUkxzLiBXaXRoIG1vZF9yZXdyaXRlIGl0IGlzCi1yZWFsbHkgdHJpdmlhbDoKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlRW5naW5lIG9uCi1SZXdyaXRlUnVsZSAgIDxiPl4vJDwvYj4gIC9lL3d3dy8gIFs8Yj5SPC9iPl0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08L0RMPgotCi08UD4KLTxIMj5UcmFpbGluZyBTbGFzaCBQcm9ibGVtPC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLUV2ZXJ5IHdlYm1hc3RlciBjYW4gc2luZyBhIHNvbmcgYWJvdXQgdGhlIHByb2JsZW0gb2YgdGhlIHRyYWlsaW5nIHNsYXNoIG9uCi1VUkxzIHJlZmVyZW5jaW5nIGRpcmVjdG9yaWVzLiBJZiB0aGV5IGFyZSBtaXNzaW5nLCB0aGUgc2VydmVyIGR1bXBzIGFuIGVycm9yLAotYmVjYXVzZSBpZiB5b3Ugc2F5IDx0dD4vfnF1dXgvZm9vPC90dD4gaW5zdGVhZCBvZgotPHR0Pi9+cXV1eC9mb28vPC90dD4gdGhlbiB0aGUgc2VydmVyIHNlYXJjaGVzIGZvciBhIDxpPmZpbGU8L2k+IG5hbWVkCi08dHQ+Zm9vPC90dD4uIEFuZCBiZWNhdXNlIHRoaXMgZmlsZSBpcyBhIGRpcmVjdG9yeSBpdCBjb21wbGFpbnMuIEFjdHVhbGx5Ci1pcyB0cmllcyB0byBmaXggaXQgdGhlbXNlbGYgaW4gbW9zdCBvZiB0aGUgY2FzZXMsIGJ1dCBzb21ldGltZXMgdGhpcyBtZWNoYW5pc20KLW5lZWQgdG8gYmUgZW11bGF0ZWQgYnkgeW91LiBGb3IgaW5zdGFuY2UgYWZ0ZXIgeW91IGhhdmUgZG9uZSBhIGxvdCBvZgotY29tcGxpY2F0ZWQgVVJMIHJld3JpdGluZ3MgdG8gQ0dJIHNjcmlwdHMgZXRjLiAKLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLVRoZSBzb2x1dGlvbiB0byB0aGlzIHN1YnRsZSBwcm9ibGVtIGlzIHRvIGxldCB0aGUgc2VydmVyIGFkZCB0aGUgdHJhaWxpbmcKLXNsYXNoIGF1dG9tYXRpY2FsbHkuIFRvIGRvIHRoaXMgY29ycmVjdGx5IHdlIGhhdmUgdG8gdXNlIGFuIGV4dGVybmFsIHJlZGlyZWN0LAotc28gdGhlIGJyb3dzZXIgY29ycmVjdGx5IHJlcXVlc3RzIHN1YnNlcXVlbnQgaW1hZ2VzIGV0Yy4gSWYgd2Ugb25seSBkaWQgYQotaW50ZXJuYWwgcmV3cml0ZSwgdGhpcyB3b3VsZCBvbmx5IHdvcmsgZm9yIHRoZSBkaXJlY3RvcnkgcGFnZSwgYnV0IHdvdWxkIGdvCi13cm9uZyB3aGVuIGFueSBpbWFnZXMgYXJlIGluY2x1ZGVkIGludG8gdGhpcyBwYWdlIHdpdGggcmVsYXRpdmUgVVJMcywgYmVjYXVzZQotdGhlIGJyb3dzZXIgd291bGQgcmVxdWVzdCBhbiBpbi1saW5lZCBvYmplY3QuIEZvciBpbnN0YW5jZSwgYSByZXF1ZXN0IGZvcgotPHR0PmltYWdlLmdpZjwvdHQ+IGluIDx0dD4vfnF1dXgvZm9vL2luZGV4Lmh0bWw8L3R0PiB3b3VsZCBiZWNvbWUKLTx0dD4vfnF1dXgvaW1hZ2UuZ2lmPC90dD4gd2l0aG91dCB0aGUgZXh0ZXJuYWwgcmVkaXJlY3QhCi08UD4KLVNvLCB0byBkbyB0aGlzIHRyaWNrIHdlIHdyaXRlOgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVFbmdpbmUgIG9uCi1SZXdyaXRlQmFzZSAgICAvfnF1dXgvCi1SZXdyaXRlUnVsZSAgICBeZm9vPGI+JDwvYj4gIGZvbzxiPi88L2I+ICBbPGI+UjwvYj5dCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPFA+Ci1UaGUgY3JhenkgYW5kIGxhenkgY2FuIGV2ZW4gZG8gdGhlIGZvbGxvd2luZyBpbiB0aGUgdG9wLWxldmVsCi08dHQ+Lmh0YWNjZXNzPC90dD4gZmlsZSBvZiB0aGVpciBob21lZGlyLiBCdXQgbm90aWNlIHRoYXQgdGhpcyBjcmVhdGVzIHNvbWUKLXByb2Nlc3Npbmcgb3ZlcmhlYWQuCi0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUVuZ2luZSAgb24KLVJld3JpdGVCYXNlICAgIC9+cXV1eC8KLVJld3JpdGVDb25kICAgICV7UkVRVUVTVF9GSUxFTkFNRX0gIDxiPi1kPC9iPgotUmV3cml0ZVJ1bGUgICAgXiguKzxiPlteL108L2I+KSQgICAgICAgICAgICQxPGI+LzwvYj4gIFtSXQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTwvREw+Ci0KLTxQPgotPEgyPldlYmNsdXN0ZXIgdGhyb3VnaCBIb21vZ2VuZW91cyBVUkwgTGF5b3V0PC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLVdlIHdhbnQgdG8gY3JlYXRlIGEgaG9tb2dlbm91cyBhbmQgY29uc2lzdGVudCBVUkwgbGF5b3V0IG92ZXIgYWxsIFdXVyBzZXJ2ZXJzCi1vbiBhIEludHJhbmV0IHdlYmNsdXN0ZXIsIGkuZS4gYWxsIFVSTHMgKHBlciBkZWZpbml0aW9uIHNlcnZlciBsb2NhbCBhbmQgdGh1cwotc2VydmVyIGRlcGVuZGVudCEpIGJlY29tZSBhY3R1YWxseSBzZXJ2ZXIgPGk+aW5kZXBlbmRlZDwvaT4hICBXaGF0IHdlIHdhbnQgaXMKLXRvIGdpdmUgdGhlIFdXVyBuYW1lc3BhY2UgYSBjb25zaXN0ZW50IHNlcnZlci1pbmRlcGVuZGVuZCBsYXlvdXQ6IG5vIFVSTAotc2hvdWxkIGhhdmUgdG8gaW5jbHVkZSBhbnkgcGh5c2ljYWxseSBjb3JyZWN0IHRhcmdldCBzZXJ2ZXIuIFRoZSBjbHVzdGVyCi1pdHNlbGYgc2hvdWxkIGRyaXZlIHVzIGF1dG9tYXRpY2FsbHkgdG8gdGhlIHBoeXNpY2FsIHRhcmdldCBob3N0LgotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotRmlyc3QsIHRoZSBrbm93bGVkZ2Ugb2YgdGhlIHRhcmdldCBzZXJ2ZXJzIGNvbWUgZnJvbSAoZGlzdHJpYnV0ZWQpIGV4dGVybmFsCi1tYXBzIHdoaWNoIGNvbnRhaW4gaW5mb3JtYXRpb24gd2hlcmUgb3VyIHVzZXJzLCBncm91cHMgYW5kIGVudGl0aWVzIHN0YXkuICAKLVRoZSBoYXZlIHRoZSBmb3JtCi0KLTxQPjxQUkU+Ci11c2VyMSAgc2VydmVyX29mX3VzZXIxCi11c2VyMiAgc2VydmVyX29mX3VzZXIyCi06ICAgICAgOgotPC9QUkU+PFA+Ci0KLVdlIHB1dCB0aGVtIGludG8gZmlsZXMgPHR0Pm1hcC54eHgtdG8taG9zdDwvdHQ+LiAgU2Vjb25kIHdlIG5lZWQgdG8gaW5zdHJ1Y3QKLWFsbCBzZXJ2ZXJzIHRvIHJlZGlyZWN0IFVSTHMgb2YgdGhlIGZvcm1zCi0KLTxQPjxQUkU+Ci0vdS91c2VyL2FueXBhdGgKLS9nL2dyb3VwL2FueXBhdGgKLS9lL2VudGl0eS9hbnlwYXRoCi08L1BSRT48UD4KLQotdG8KLQotPFA+PFBSRT4KLWh0dHA6Ly9waHlzaWNhbC1ob3N0L3UvdXNlci9hbnlwYXRoCi1odHRwOi8vcGh5c2ljYWwtaG9zdC9nL2dyb3VwL2FueXBhdGgKLWh0dHA6Ly9waHlzaWNhbC1ob3N0L2UvZW50aXR5L2FueXBhdGgKLTwvUFJFPjxQPgotCi13aGVuIHRoZSBVUkwgaXMgbm90IGxvY2FsbHkgdmFsaWQgdG8gYSBzZXJ2ZXIuICBUaGUgZm9sbG93aW5nIHJ1bGVzZXQgZG9lcwotdGhpcyBmb3IgdXMgYnkgdGhlIGhlbHAgb2YgdGhlIG1hcCBmaWxlcyAoYXNzdW1pbmcgdGhhdCBzZXJ2ZXIwIGlzIGEgZGVmYXVsdAotc2VydmVyIHdoaWNoIHdpbGwgYmUgdXNlZCBpZiBhIHVzZXIgaGFzIG5vIGVudHJ5IGluIHRoZSBtYXApOgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVFbmdpbmUgb24KLQotUmV3cml0ZU1hcCAgICAgIHVzZXItdG8taG9zdCAgIHR4dDovcGF0aC90by9tYXAudXNlci10by1ob3N0Ci1SZXdyaXRlTWFwICAgICBncm91cC10by1ob3N0ICAgdHh0Oi9wYXRoL3RvL21hcC5ncm91cC10by1ob3N0Ci1SZXdyaXRlTWFwICAgIGVudGl0eS10by1ob3N0ICAgdHh0Oi9wYXRoL3RvL21hcC5lbnRpdHktdG8taG9zdAotCi1SZXdyaXRlUnVsZSAgIF4vdS88Yj4oW14vXSspPC9iPi8/KC4qKSAgIGh0dHA6Ly88Yj4ke3VzZXItdG8taG9zdDokMXxzZXJ2ZXIwfTwvYj4vdS8kMS8kMgotUmV3cml0ZVJ1bGUgICBeL2cvPGI+KFteL10rKTwvYj4vPyguKikgIGh0dHA6Ly88Yj4ke2dyb3VwLXRvLWhvc3Q6JDF8c2VydmVyMH08L2I+L2cvJDEvJDIKLVJld3JpdGVSdWxlICAgXi9lLzxiPihbXi9dKyk8L2I+Lz8oLiopIGh0dHA6Ly88Yj4ke2VudGl0eS10by1ob3N0OiQxfHNlcnZlcjB9PC9iPi9lLyQxLyQyCi0KLVJld3JpdGVSdWxlICAgXi8oW3VnZV0pLyhbXi9dKykvPyQgICAgICAgICAgLyQxLyQyLy53d3cvCi1SZXdyaXRlUnVsZSAgIF4vKFt1Z2VdKS8oW14vXSspLyhbXi5dKy4rKSAgIC8kMS8kMi8ud3d3LyQzXAotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTwvREw+Ci0KLTxQPgotPEgyPk1vdmUgSG9tZWRpcnMgdG8gRGlmZmVyZW50IFdlYnNlcnZlcjwvSDI+Ci08UD4KLQotPERMPgotPERUPjxTVFJPTkc+RGVzY3JpcHRpb246PC9TVFJPTkc+Ci08REQ+Ci1BIGxvdCBvZiB3ZWJtYXN0ZXIgYWtzZWQgZm9yIGEgc29sdXRpb24gdG8gdGhlIGZvbGxvd2luZyBzaXR1YXRpb246IFRoZXkKLXdhbnRlZCB0byByZWRpcmVjdCBqdXN0IGFsbCBob21lZGlycyBvbiBhIHdlYnNlcnZlciB0byBhbm90aGVyIHdlYnNlcnZlci4KLVRoZXkgdXN1YWxseSBuZWVkIHN1Y2ggdGhpbmdzIHdoZW4gZXN0YWJsaXNoaW5nIGEgbmV3ZXIgd2Vic2VydmVyIHdoaWNoIHdpbGwKLXJlcGxhY2UgdGhlIG9sZCBvbmUgb3ZlciB0aW1lLgotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotVGhlIHNvbHV0aW9uIGlzIHRyaXZpYWwgd2l0aCBtb2RfcmV3cml0ZS4gT24gdGhlIG9sZCB3ZWJzZXJ2ZXIgd2UganVzdAotcmVkaXJlY3QgYWxsIDx0dD4vfnVzZXIvYW55cGF0aDwvdHQ+IFVSTHMgdG8KLTx0dD5odHRwOi8vbmV3c2VydmVyL351c2VyL2FueXBhdGg8L3R0Pi4KLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlRW5naW5lIG9uCi1SZXdyaXRlUnVsZSAgIF4vfiguKykgIGh0dHA6Ly88Yj5uZXdzZXJ2ZXI8L2I+L34kMSAgW1IsTF0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08L0RMPgotCi08UD4KLTxIMj5TdHJ1Y3R1cmVkIEhvbWVkaXJzPC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLVNvbWUgc2l0ZXMgd2l0aCB0aG91c2VuZCBvZiB1c2VycyB1c3VhbGx5IHVzZSBhIHN0cnVjdHVyZWQgaG9tZWRpciBsYXlvdXQsCi1pLmUuICBlYWNoIGhvbWVkaXIgaXMgaW4gYSBzdWJkaXJlY3Rvcnkgd2hpY2ggYmVnaW5zIGZvciBpbnN0YW5jZSB3aXRoIHRoZQotZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSB1c2VybmFtZS4gU28sIDx0dD4vfmZvby9hbnlwYXRoPC90dD4gaXMKLTx0dD4vaG9tZS88Yj5mPC9iPi9mb28vLnd3dy9hbnlwYXRoPC90dD4gd2hpbGUgPHR0Pi9+YmFyL2FueXBhdGg8L3R0PiBpcwotPHR0Pi9ob21lLzxiPmI8L2I+L2Jhci8ud3d3L2FueXBhdGg8L3R0Pi4KLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLVdlIHVzZSB0aGUgZm9sbG93aW5nIHJ1bGVzZXQgdG8gZXhwYW5kIHRoZSB0aWxkZSBVUkxzIGludG8gZXhhY3RseSB0aGUgYWJvdmUKLWxheW91dC4KLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlRW5naW5lIG9uCi1SZXdyaXRlUnVsZSAgIF4vfig8Yj4oW2Etel0pPC9iPlthLXowLTldKykoLiopICAvaG9tZS88Yj4kMjwvYj4vJDEvLnd3dyQzCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPC9ETD4KLQotPFA+Ci08SDI+RmlsZXN5c3RlbSBSZW9yZ2FuaXNhdGlvbjwvSDI+Ci08UD4KLQotPERMPgotPERUPjxTVFJPTkc+RGVzY3JpcHRpb246PC9TVFJPTkc+Ci08REQ+Ci1UaGlzIHJlYWxseSBpcyBhIGhhcmRjb3JlIGV4YW1wbGU6IGEga2lsbGVyIGFwcGxpY2F0aW9uIHdoaWNoIGhlYXZpbHkgdXNlcwotcGVyLWRpcmVjdG9yeSA8dHQ+UmV3cml0ZVJ1bGVzPC90dD4gdG8gZ2V0IGEgc21vb3RoIGxvb2sgYW5kIGZlZWwgb24gdGhlIFdlYgotd2hpbGUgaXRzIGRhdGEgc3RydWN0dXJlIGlzIG5ldmVyIHRvdWNoZWQgb3IgYWRqdXN0ZWQuCi0KLUJhY2tncm91bmQ6IDxiPjxpPm5ldC5zdzwvaT48L2I+IGlzIG15IGFyY2hpdmUgb2YgZnJlZWx5IGF2YWlsYWJsZSBVbml4Ci1zb2Z0d2FyZSBwYWNrYWdlcywgd2hpY2ggSSBzdGFydGVkIHRvIGNvbGxlY3QgaW4gMTk5Mi4gSXQgaXMgYm90aCBteSBob2JieSBhbmQKLWpvYiB0byB0byB0aGlzLCBiZWNhdXNlIHdoaWxlIEknbSBzdHVkeWluZyBjb21wdXRlciBzY2llbmNlIEkgaGF2ZSBhbHNvIHdvcmtlZAotZm9yIG1hbnkgeWVhcnMgYXMgYSBzeXN0ZW0gYW5kIG5ldHdvcmsgYWRtaW5pc3RyYXRvciBpbiBteSBzcGFyZSB0aW1lLiBFdmVyeQotd2VlayBJIG5lZWQgc29tZSBzb3J0IG9mIHNvZnR3YXJlIHNvIEkgY3JlYXRlZCBhIGRlZXAgaGllcmFyY2h5IG9mCi1kaXJlY3RvcmllcyB3aGVyZSBJIHN0b3JlZCB0aGUgcGFja2FnZXM6IAotCi08UD48UFJFPgotZHJ3eHJ3eHIteCAgIDIgbmV0c3cgIHVzZXJzICAgIDUxMiBBdWcgIDMgMTg6MzkgQXVkaW8vCi1kcnd4cnd4ci14ICAgMiBuZXRzdyAgdXNlcnMgICAgNTEyIEp1bCAgOSAxNDozNyBCZW5jaG1hcmsvCi1kcnd4cnd4ci14ICAxMiBuZXRzdyAgdXNlcnMgICAgNTEyIEp1bCAgOSAwMDozNCBDcnlwdG8vCi1kcnd4cnd4ci14ICAgNSBuZXRzdyAgdXNlcnMgICAgNTEyIEp1bCAgOSAwMDo0MSBEYXRhYmFzZS8KLWRyd3hyd3hyLXggICA0IG5ldHN3ICB1c2VycyAgICA1MTIgSnVsIDMwIDE5OjI1IERpY3RzLwotZHJ3eHJ3eHIteCAgMTAgbmV0c3cgIHVzZXJzICAgIDUxMiBKdWwgIDkgMDE6NTQgR3JhcGhpYy8KLWRyd3hyd3hyLXggICA1IG5ldHN3ICB1c2VycyAgICA1MTIgSnVsICA5IDAxOjU4IEhhY2tlcnMvCi1kcnd4cnd4ci14ICAgOCBuZXRzdyAgdXNlcnMgICAgNTEyIEp1bCAgOSAwMzoxOSBJbmZvU3lzLwotZHJ3eHJ3eHIteCAgIDMgbmV0c3cgIHVzZXJzICAgIDUxMiBKdWwgIDkgMDM6MjEgTWF0aC8KLWRyd3hyd3hyLXggICAzIG5ldHN3ICB1c2VycyAgICA1MTIgSnVsICA5IDAzOjI0IE1pc2MvCi1kcnd4cnd4ci14ICAgOSBuZXRzdyAgdXNlcnMgICAgNTEyIEF1ZyAgMSAxNjozMyBOZXR3b3JrLwotZHJ3eHJ3eHIteCAgIDIgbmV0c3cgIHVzZXJzICAgIDUxMiBKdWwgIDkgMDU6NTMgT2ZmaWNlLwotZHJ3eHJ3eHIteCAgIDcgbmV0c3cgIHVzZXJzICAgIDUxMiBKdWwgIDkgMDk6MjQgU29mdEVuZy8KLWRyd3hyd3hyLXggICA3IG5ldHN3ICB1c2VycyAgICA1MTIgSnVsICA5IDEyOjE3IFN5c3RlbS8KLWRyd3hyd3hyLXggIDEyIG5ldHN3ICB1c2VycyAgICA1MTIgQXVnICAzIDIwOjE1IFR5cGVzZXR0aW5nLwotZHJ3eHJ3eHIteCAgMTAgbmV0c3cgIHVzZXJzICAgIDUxMiBKdWwgIDkgMTQ6MDggWDExLwotPC9QUkU+PFA+Ci0KLUluIEp1bHkgMTk5NiBJIGRlY2lkZWQgdG8gbWFrZSB0aGlzIDM1MCBNQiBhcmNoaXZlIHB1YmxpYyB0byB0aGUgd29ybGQgdmlhIGEKLW5pY2UgV2ViIGludGVyZmFjZSAoPGEgaHJlZj0iaHR0cDovL25ldC5zdy5lbmdlbHNjaGFsbC5jb20vbmV0LnN3LyI+PHR0PgotaHR0cDovL25ldC5zdy5lbmdlbHNjaGFsbC5jb20vbmV0LnN3LzwvdHQ+PC9hPikuICJOaWNlIiBtZWFucyB0aGF0IEkgd2FudGVkIHRvCi1vZmZlciBhIGludGVyZmFjZSB3aGVyZSB5b3UgY2FuIGJyb3dzZSBkaXJlY3RseSB0aHJvdWdoIHRoZSBhcmNoaXZlIGhpZXJhcmNoeS4KLUFuZCAibmljZSIgbWVhbnMgdGhhdCBJIGRpZG4ndCB3YW50ZWQgdG8gY2hhbmdlIGFueXRoaW5nIGluc2lkZSB0aGlzIGhpZXJhcmNoeQotLSBub3QgZXZlbiBieSBwdXR0aW5nIHNvbWUgQ0dJIHNjcmlwdHMgYXQgdGhlIHRvcCBvZiBpdC4gIFdoeT8gQmVjYXVzZSB0aGUKLWFib3ZlIHN0cnVjdHVyZSBzaG91bGQgYmUgbGF0ZXIgYWNjZXNzaWJsZSB2aWEgRlRQIGFzIHdlbGwsIGFuZCBJIGRpZG4ndAotd2FudCBhbnkgV2ViIG9yIENHSSBzdHV1ZiB0byBiZSB0aGVyZS4KLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLVRoZSBzb2x1dGlvbiBoYXMgdHdvIHBhcnRzOiBUaGUgZmlyc3QgaXMgYSBzZXQgb2YgQ0dJIHNjcmlwdHMgd2hpY2ggY3JlYXRlIGFsbAotdGhlIHBhZ2VzIGF0IGFsbCBkaXJlY3RvcnkgbGV2ZWxzIG9uLXRoZS1mbHkuIEkgcHV0IHRoZW0gdW5kZXIKLTx0dD4vZS9uZXRzdy8ud3d3LzwvdHQ+IGFzIGZvbGxvd3M6Ci0KLTxQPjxQUkU+Ci0tcnctci0tci0tICAgMSBuZXRzdyAgdXNlcnMgICAgMTMxOCBBdWcgIDEgMTg6MTAgLnd3d2FjbAotZHJ3eHIteHIteCAgMTggbmV0c3cgIHVzZXJzICAgICA1MTIgQXVnICA1IDE1OjUxIERBVEEvCi0tcnctcnctcnctICAgMSBuZXRzdyAgdXNlcnMgIDM3Mjk4MiBBdWcgIDUgMTY6MzUgTE9HRklMRQotLXJ3LXItLXItLSAgIDEgbmV0c3cgIHVzZXJzICAgICA2NTkgQXVnICA0IDA5OjI3IFRPRE8KLS1ydy1yLS1yLS0gICAxIG5ldHN3ICB1c2VycyAgICA1Njk3IEF1ZyAgMSAxODowMSBuZXRzdy1hYm91dC5odG1sCi0tcnd4ci14ci14ICAgMSBuZXRzdyAgdXNlcnMgICAgIDU3OSBBdWcgIDIgMTA6MzMgbmV0c3ctYWNjZXNzLnBsCi0tcnd4ci14ci14ICAgMSBuZXRzdyAgdXNlcnMgICAgMTUzMiBBdWcgIDEgMTc6MzUgbmV0c3ctY2hhbmdlcy5jZ2kKLS1yd3hyLXhyLXggICAxIG5ldHN3ICB1c2VycyAgICAyODY2IEF1ZyAgNSAxNDo0OSBuZXRzdy1ob21lLmNnaQotZHJ3eHIteHIteCAgIDIgbmV0c3cgIHVzZXJzICAgICA1MTIgSnVsICA4IDIzOjQ3IG5ldHN3LWltZy8KLS1yd3hyLXhyLXggICAxIG5ldHN3ICB1c2VycyAgIDI0MDUwIEF1ZyAgNSAxNTo0OSBuZXRzdy1sc2Rpci5jZ2kKLS1yd3hyLXhyLXggICAxIG5ldHN3ICB1c2VycyAgICAxNTg5IEF1ZyAgMyAxODo0MyBuZXRzdy1zZWFyY2guY2dpCi0tcnd4ci14ci14ICAgMSBuZXRzdyAgdXNlcnMgICAgMTg4NSBBdWcgIDEgMTc6NDEgbmV0c3ctdHJlZS5jZ2kKLS1ydy1yLS1yLS0gICAxIG5ldHN3ICB1c2VycyAgICAgMjM0IEp1bCAzMCAxNjozNSBuZXRzdy11bmxpbWl0LmxzdAotPC9QUkU+PFA+Ci0KLVRoZSA8dHQ+REFUQS88L3R0PiBzdWJkaXJlY3RvcnkgaG9sZHMgdGhlIGFib3ZlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUsIGkuZS4gIHRoZQotcmVhbCA8Yj48aT5uZXQuc3c8L2k+PC9iPiBzdHVmZiBhbmQgZ2V0cyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgdmlhCi08dHQ+cmRpc3Q8L3R0PiBmcm9tIHRpbWUgdG8gdGltZS4gCi0KLSBUaGUgc2Vjb25kIHBhcnQgb2YgdGhlIHByb2JsZW0gcmVtYWluczogaG93IHRvIGxpbmsgdGhlc2UgdHdvIHN0cnVjdHVyZXMKLXRvZ2V0aGVyIGludG8gb25lIHNtb290aC1sb29raW5nIFVSTCB0cmVlPyBXZSB3YW50IHRvIGhpZGUgdGhlIDx0dD5EQVRBLzwvdHQ+Ci1kaXJlY3RvcnkgZnJvbSB0aGUgdXNlciB3aGlsZSBydW5uaW5nIHRoZSBhcHByb3ByaWF0ZSBDR0kgc2NyaXB0cyBmb3IgdGhlCi12YXJpb3VzIFVSTHMuIAotCi1IZXJlIGlzIHRoZSBzb2x1dGlvbjogZmlyc3QgSSBwdXQgdGhlIGZvbGxvd2luZyBpbnRvIHRoZSBwZXItZGlyZWN0b3J5Ci1jb25maWd1cmF0aW9uIGZpbGUgaW4gdGhlIERvY3VtZW50IFJvb3Qgb2YgdGhlIHNlcnZlciB0byByZXdyaXRlIHRoZSBhbm5vdW5jZWQKLVVSTCA8dHQ+L25ldC5zdy88L3R0PiB0byB0aGUgaW50ZXJuYWwgcGF0aCA8dHQ+L2UvbmV0c3c8L3R0PjoKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlUnVsZSAgXm5ldC5zdyQgICAgICAgbmV0LnN3LyAgICAgICAgW1JdCi1SZXdyaXRlUnVsZSAgXm5ldC5zdy8oLiopJCAgZS9uZXRzdy8kMQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTxQPgotVGhlIGZpcnN0IHJ1bGUgaXMgZm9yIHJlcXVlc3RzIHdoaWNoIG1pc3MgdGhlIHRyYWlsaW5nIHNsYXNoISAgVGhlIHNlY29uZCBydWxlCi1kb2VzIHRoZSByZWFsIHRoaW5nLiBBbmQgdGhlbiBjb21lcyB0aGUga2lsbGVyIGNvbmZpZ3VyYXRpb24gd2hpY2ggc3RheXMgaW4KLXRoZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBmaWxlIDx0dD4vZS9uZXRzdy8ud3d3Ly53d3dhY2w8L3R0PjoKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1PcHRpb25zICAgICAgIEV4ZWNDR0kgRm9sbG93U3ltTGlua3MgSW5jbHVkZXMgTXVsdGlWaWV3cyAKLQotUmV3cml0ZUVuZ2luZSBvbgotCi0jICB3ZSBhcmUgcmVhY2hlZCB2aWEgL25ldC5zdy8gcHJlZml4Ci1SZXdyaXRlQmFzZSAgIC9uZXQuc3cvCi0KLSMgIGZpcnN0IHdlIHJld3JpdGUgdGhlIHJvb3QgZGlyIHRvIAotIyAgdGhlIGhhbmRsaW5nIGNnaSBzY3JpcHQKLVJld3JpdGVSdWxlICAgXiQgICAgICAgICAgICAgICAgICAgICAgIG5ldHN3LWhvbWUuY2dpICAgICBbTF0KLVJld3JpdGVSdWxlICAgXmluZGV4XC5odG1sJCAgICAgICAgICAgIG5ldHN3LWhvbWUuY2dpICAgICBbTF0KLQotIyAgc3RyaXAgb3V0IHRoZSBzdWJkaXJzIHdoZW4KLSMgIHRoZSBicm93c2VyIHJlcXVlc3RzIHVzIGZyb20gcGVyZGlyIHBhZ2VzCi1SZXdyaXRlUnVsZSAgIF4uKy8obmV0c3ctW14vXSsvLispJCAgICAkMSAgICAgICAgICAgICAgICAgW0xdCi0KLSMgIGFuZCBub3cgYnJlYWsgdGhlIHJld3JpdGluZyBmb3IgbG9jYWwgZmlsZXMKLVJld3JpdGVSdWxlICAgXm5ldHN3LWhvbWVcLmNnaS4qICAgICAgIC0gICAgICAgICAgICAgICAgICBbTF0KLVJld3JpdGVSdWxlICAgXm5ldHN3LWNoYW5nZXNcLmNnaS4qICAgIC0gICAgICAgICAgICAgICAgICBbTF0KLVJld3JpdGVSdWxlICAgXm5ldHN3LXNlYXJjaFwuY2dpLiogICAgIC0gICAgICAgICAgICAgICAgICBbTF0KLVJld3JpdGVSdWxlICAgXm5ldHN3LXRyZWVcLmNnaSQgICAgICAgIC0gICAgICAgICAgICAgICAgICBbTF0KLVJld3JpdGVSdWxlICAgXm5ldHN3LWFib3V0XC5odG1sJCAgICAgIC0gICAgICAgICAgICAgICAgICBbTF0KLVJld3JpdGVSdWxlICAgXm5ldHN3LWltZy8uKiQgICAgICAgICAgIC0gICAgICAgICAgICAgICAgICBbTF0KLQotIyAgYW55dGhpbmcgZWxzZSBpcyBhIHN1YmRpciB3aGljaCBnZXRzIGhhbmRsZWQKLSMgIGJ5IGFub3RoZXIgY2dpIHNjcmlwdAotUmV3cml0ZVJ1bGUgICAhXm5ldHN3LWxzZGlyXC5jZ2kuKiAgICAgLSAgICAgICAgICAgICAgICAgIFtDXQotUmV3cml0ZVJ1bGUgICAoLiopICAgICAgICAgICAgICAgICAgICAgbmV0c3ctbHNkaXIuY2dpLyQxCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPFA+Ci1Tb21lIGhpbnRzIGZvciBpbnRlcnByZXRhdGlvbjoKLSAgICA8b2w+Ci0gICAgPGxpPiBOb3RpY2UgdGhlIEwgKGxhc3QpIGZsYWcgYW5kIG5vIHN1YnN0aXR1dGlvbiBmaWVsZCAoJy0nKSBpbiB0aGUKLSAgICAgICAgIGZvcnRoIHBhcnQKLSAgICA8bGk+IE5vdGljZSB0aGUgISAobm90KSBjaGFyYWN0ZXIgYW5kIHRoZSBDIChjaGFpbikgZmxhZwotICAgICAgICAgYXQgdGhlIGZpcnN0IHJ1bGUgaW4gdGhlIGxhc3QgcGFydAotICAgIDxsaT4gTm90aWNlIHRoZSBjYXRjaC1hbGwgcGF0dGVybiBpbiB0aGUgbGFzdCBydWxlCi0gICAgPC9vbD4KLQotPC9ETD4KLQotPFA+Ci08SDI+TkNTQSBpbWFnZW1hcCB0byBBcGFjaGUgbW9kX2ltYXA8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotV2hlbiBzd2l0Y2hpbmcgZnJvbSB0aGUgTkNTQSB3ZWJzZXJ2ZXIgdG8gdGhlIG1vcmUgbW9kZXJuIEFwYWNoZSB3ZWJzZXJ2ZXIgYQotbG90IG9mIHBlb3BsZSB3YW50IGEgc21vb3RoIHRyYW5zaXRpb24uIFNvIHRoZXkgd2FudCBwYWdlcyB3aGljaCB1c2UgdGhlaXIgb2xkCi1OQ1NBIDx0dD5pbWFnZW1hcDwvdHQ+IHByb2dyYW0gdG8gd29yayB1bmRlciBBcGFjaGUgd2l0aCB0aGUgbW9kZXJuCi08dHQ+bW9kX2ltYXA8L3R0Pi4gVGhlIHByb2JsZW0gaXMgdGhhdCB0aGVyZSBhcmUgYSBsb3Qgb2YKLWh5cGVybGlua3MgYXJvdW5kIHdoaWNoIHJlZmVyZW5jZSB0aGUgPHR0PmltYWdlbWFwPC90dD4gcHJvZ3JhbSB2aWEKLTx0dD4vY2dpLWJpbi9pbWFnZW1hcC9wYXRoL3RvL3BhZ2UubWFwPC90dD4uIFVuZGVyIEFwYWNoZSB0aGlzCi1oYXMgdG8gcmVhZCBqdXN0IDx0dD4vcGF0aC90by9wYWdlLm1hcDwvdHQ+LgotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotV2UgdXNlIGEgZ2xvYmFsIHJ1bGUgdG8gcmVtb3ZlIHRoZSBwcmVmaXggb24tdGhlLWZseSBmb3IgYWxsIHJlcXVlc3RzOgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVFbmdpbmUgIG9uCi1SZXdyaXRlUnVsZSAgICBeL2NnaS1iaW4vaW1hZ2VtYXAoLiopICAkMSAgW1BUXQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTwvREw+Ci0KLTxQPgotPEgyPlNlYXJjaCBwYWdlcyBpbiBtb3JlIHRoYW4gb25lIGRpcmVjdG9yeTwvSDI+Ci08UD4KLQotPERMPgotPERUPjxTVFJPTkc+RGVzY3JpcHRpb246PC9TVFJPTkc+Ci08REQ+Ci1Tb21ldGltZXMgaXQgaXMgbmVjY2Vzc2FyeSB0byBsZXQgdGhlIHdlYnNlcnZlciBzZWFyY2ggZm9yIHBhZ2VzIGluIG1vcmUgdGhhbgotb25lIGRpcmVjdG9yeS4gSGVyZSBNdWx0aVZpZXdzIG9yIG90aGVyIHRlY2huaXF1ZXMgY2Fubm90IGhlbHAuCi0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1XZSBwcm9ncmFtIGEgZXhwbGljaXQgcnVsZXNldCB3aGljaCBzZWFyY2hlcyBmb3IgdGhlIGZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4KLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlRW5naW5lIG9uCi0KLSMgICBmaXJzdCB0cnkgdG8gZmluZCBpdCBpbiBjdXN0b20vLi4uCi0jICAgLi4uYW5kIGlmIGZvdW5kIHN0b3AgYW5kIGJlIGhhcHB5OgotUmV3cml0ZUNvbmQgICAgICAgICAveW91ci9kb2Nyb290LzxiPmRpcjE8L2I+LyV7UkVRVUVTVF9GSUxFTkFNRX0gIC1mCi1SZXdyaXRlUnVsZSAgXiguKykgIC95b3VyL2RvY3Jvb3QvPGI+ZGlyMTwvYj4vJDEgIFtMXQotCi0jICAgc2Vjb25kIHRyeSB0byBmaW5kIGl0IGluIHB1Yi8uLi4KLSMgICAuLi5hbmQgaWYgZm91bmQgc3RvcCBhbmQgYmUgaGFwcHk6Ci1SZXdyaXRlQ29uZCAgICAgICAgIC95b3VyL2RvY3Jvb3QvPGI+ZGlyMjwvYj4vJXtSRVFVRVNUX0ZJTEVOQU1FfSAgLWYKLVJld3JpdGVSdWxlICBeKC4rKSAgL3lvdXIvZG9jcm9vdC88Yj5kaXIyPC9iPi8kMSAgW0xdCi0KLSMgICBlbHNlIGdvIG9uIGZvciBvdGhlciBBbGlhcyBvciBTY3JpcHRBbGlhcyBkaXJlY3RpdmVzLAotIyAgIGV0Yy4KLVJld3JpdGVSdWxlICAgXiguKykgIC0gIFtQVF0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08L0RMPgotCi08UD4KLTxIMj5TZXQgRW52aXJvbm1lbnQgVmFyaWFibGVzIEFjY29yZGluZyBUbyBVUkwgUGFydHM8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotUGVyaGFwcyB5b3Ugd2FudCB0byBrZWVwIHN0YXR1cyBpbmZvcm1hdGlvbiBiZXR3ZWVuIHJlcXVlc3RzIGFuZCB1c2UgdGhlIFVSTAotdG8gZW5jb2RlIGl0LiBCdXQgeW91IGRvbid0IHdhbnQgdG8gdXNlIGEgQ0dJIHdyYXBwZXIgZm9yIGFsbCBwYWdlcyBqdXN0IHRvCi1zdHJpcCBvdXQgdGhpcyBpbmZvcm1hdGlvbi4KLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLVdlIHVzZSBhIHJld3JpdGUgcnVsZSB0byBzdHJpcCBvdXQgdGhlIHN0YXR1cyBpbmZvcm1hdGlvbiBhbmQgcmVtZW1iZXIgaXQgdmlhCi1hbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGljaCBjYW4gYmUgbGF0ZXIgZGVyZWZlcmVuY2VkIGZyb20gd2l0aGluIFhTU0kgb3IKLUNHSS4gVGhpcyB3YXkgYSBVUkwgPHR0Pi9mb28vUz1qYXZhL2Jhci88L3R0PiBnZXRzIHRyYW5zbGF0ZWQgdG8KLTx0dD4vZm9vL2Jhci88L3R0PiBhbmQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVkIDx0dD5TVEFUVVM8L3R0PiBpcyBzZXQKLXRvIHRoZSB2YWx1ZSAiamF2YSIuCi0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUVuZ2luZSBvbgotUmV3cml0ZVJ1bGUgICBeKC4qKS88Yj5TPShbXi9dKyk8L2I+LyguKikgICAgJDEvJDMgW0U9PGI+U1RBVFVTOiQyPC9iPl0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08L0RMPgotCi08UD4KLTxIMj5WaXJ0dWFsIFVzZXIgSG9zdHM8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotQXNzdW1lIHRoYXQgeW91IHdhbnQgdG8gcHJvdmlkZSA8dHQ+d3d3LjxiPnVzZXJuYW1lPC9iPi5ob3N0LmRvbWFpbi5jb208L3R0PgotZm9yIHRoZSBob21lcGFnZSBvZiB1c2VybmFtZSB2aWEganVzdCBETlMgQSByZWNvcmRzIHRvIHRoZSBzYW1lIG1hY2hpbmUgYW5kCi13aXRob3V0IGFueSB2aXJ0dWFsaG9zdHMgb24gdGhpcyBtYWNoaW5lLiAKLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLUZvciBIVFRQLzEuMCByZXF1ZXN0cyB0aGVyZSBpcyBubyBzb2x1dGlvbiwgYnV0IGZvciBIVFRQLzEuMSByZXF1ZXN0cyB3aGljaAotY29udGFpbiBhIEhvc3Q6IEhUVFAgaGVhZGVyIHdlIGNhbiB1c2UgdGhlIGZvbGxvd2luZyBydWxlc2V0IHRvIHJld3JpdGUKLTx0dD5odHRwOi8vd3d3LnVzZXJuYW1lLmhvc3QuY29tL2FueXBhdGg8L3R0PiBpbnRlcm5hbGx5IHRvCi08dHQ+L2hvbWUvdXNlcm5hbWUvYW55cGF0aDwvdHQ+OgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVFbmdpbmUgb24KLVJld3JpdGVDb25kICAgJXs8Yj5IVFRQX0hPU1Q8L2I+fSAgICAgICAgICAgICAgICAgXnd3d1wuPGI+W14uXSs8L2I+XC5ob3N0XC5jb20kCi1SZXdyaXRlUnVsZSAgIF4oLispICAgICAgICAgICAgICAgICAgICAgICAgJXtIVFRQX0hPU1R9JDEgICAgICAgICAgW0NdCi1SZXdyaXRlUnVsZSAgIF53d3dcLjxiPihbXi5dKyk8L2I+XC5ob3N0XC5jb20oLiopIC9ob21lLzxiPiQxPC9iPiQyCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPC9ETD4KLQotPFA+Ci08SDI+UmVkaXJlY3QgSG9tZWRpcnMgRm9yIEZvcmVpZ25lcnM8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotV2Ugd2FudCB0byByZWRpcmVjdCBob21lZGlyIFVSTHMgdG8gYW5vdGhlciB3ZWJzZXJ2ZXIKLTx0dD53d3cuc29tZXdoZXJlLmNvbTwvdHQ+IHdoZW4gdGhlIHJlcXVlc3RpbmcgdXNlciBkb2VzIG5vdCBzdGF5IGluIHRoZSBsb2NhbAotZG9tYWluIDx0dD5vdXJkb21haW4uY29tPC90dD4uIFRoaXMgaXMgc29tZXRpbWVzIHVzZWQgaW4gdmlydHVhbCBob3N0Ci1jb250ZXh0cy4KLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLUp1c3QgYSByZXdyaXRlIGNvbmRpdGlvbjoKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlRW5naW5lIG9uCi1SZXdyaXRlQ29uZCAgICV7UkVNT1RFX0hPU1R9ICA8Yj4hXi4rXC5vdXJkb21haW5cLmNvbSQ8L2I+Ci1SZXdyaXRlUnVsZSAgIF4oL34uKykgICAgICAgICBodHRwOi8vd3d3LnNvbWV3aGVyZS5jb20vJDEgW1IsTF0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08L0RMPgotCi08UD4KLTxIMj5SZWRpcmVjdCBGYWlsaW5nIFVSTHMgVG8gT3RoZXIgV2Vic2VydmVyPC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLUEgdHlwaWNhbCBGQVEgYWJvdXQgVVJMIHJld3JpdGluZyBpcyBob3cgdG8gcmVkaXJlY3QgZmFpbGluZyByZXF1ZXN0cyBvbgotd2Vic2VydmVyIEEgdG8gd2Vic2VydmVyIEIuICBVc3VhbGx5IHRoaXMgaXMgZG9uZSB2aWEgRXJyb3JEb2N1bWVudAotQ0dJLXNjcmlwdHMgaW4gUGVybCwgYnV0IHRoZXJlIGlzIGFsc28gYSBtb2RfcmV3cml0ZSBzb2x1dGlvbi4gQnV0IG5vdGljZSB0aGF0Ci10aGlzIGlzIGxlc3MgcGVyZm9ybWFudCB0aGFuIHVzaW5nIGEgRXJyb3JEb2N1bWVudCBDR0ktc2NyaXB0IQotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotVGhlIGZpcnN0IHNvbHV0aW9uIGhhcyB0aGUgYmVzdCBwZXJmb3JtYW5jZSBidXQgbGVzcyBmbGV4aWJpbGl0eSBhbmQgaXMgbGVzcwotZXJyb3Igc2FmZToKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlRW5naW5lIG9uCi1SZXdyaXRlQ29uZCAgIC95b3VyL2RvY3Jvb3QvJXtSRVFVRVNUX0ZJTEVOQU1FfSA8Yj4hLWY8L2I+Ci1SZXdyaXRlUnVsZSAgIF4oLispICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vPGI+d2Vic2VydmVyQjwvYj4uZG9tLyQxCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPFA+Ci1UaGUgcHJvYmxlbSBoZXJlIGlzIHRoYXQgdGhpcyB3aWxsIG9ubHkgd29yayBmb3IgcGFnZXMgaW5zaWRlIHRoZQotRG9jdW1lbnRSb290LiBXaGlsZSB5b3UgY2FuIGFkZCBtb3JlIENvbmRpdGlvbnMgKGZvciBpbnN0YW5jZSB0byBhbHNvIGhhbmRsZQotaG9tZWRpcnMsIGV0Yy4pIHRoZXJlIGlzIGJldHRlciB2YXJpYW50OgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVFbmdpbmUgb24KLVJld3JpdGVDb25kICAgJXtSRVFVRVNUX1VSSX0gPGI+IS1VPC9iPgotUmV3cml0ZVJ1bGUgICBeKC4rKSAgICAgICAgICBodHRwOi8vPGI+d2Vic2VydmVyQjwvYj4uZG9tLyQxCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPFA+Ci1UaGlzIHVzZXMgdGhlIFVSTCBsb29rLWFoZWFkIGZlYXR1cmUgb2YgbW9kX3Jld3JpdGUuIFRoZSByZXN1bHQgaXMgdGhhdCB0aGlzCi13aWxsIHdvcmsgZm9yIGFsbCB0eXBlcyBvZiBVUkxzIGFuZCBpcyBhIHNhZmUgd2F5LiAgQnV0IGl0IGRvZXMgYSBwZXJmb3JtYW5jZQotaW1wYWN0IG9uIHRoZSB3ZWJzZXJ2ZXIsIGJlY2F1c2UgZm9yIGV2ZXJ5IHJlcXVlc3QgdGhlcmUgaXMgb25lIG1vcmUgaW50ZXJuYWwKLXN1YnJlcXVlc3QuIFNvLCBpZiB5b3VyIHdlYnNlcnZlciBydW5zIG9uIGEgcG93ZXJmdWwgQ1BVLCB1c2UgdGhpcyBvbmUuIElmIGl0Ci1pcyBhIHNsb3cgbWFjaGluZSwgdXNlIHRoZSBmaXJzdCBhcHByb2FjaCBvciBiZXR0ZXIgYSBFcnJvckRvY3VtZW50Ci1DR0ktc2NyaXB0LgotCi08L0RMPgotCi08UD4KLTxIMj5FeHRlbmRlZCBSZWRpcmVjdGlvbjwvSDI+Ci08UD4KLQotPERMPgotPERUPjxTVFJPTkc+RGVzY3JpcHRpb246PC9TVFJPTkc+Ci08REQ+Ci1Tb21ldGltZXMgd2UgbmVlZCBtb3JlIGNvbnRyb2wgKGNvbmNlcm5pbmcgdGhlIGNoYXJhY3RlciBlc2NhcGluZyBtZWNoYW5pc20pCi1vZiBVUkxzIG9uIHJlZGlyZWN0cy4gVXN1YWxseSB0aGUgQXBhY2hlIGtlcm5lbHMgVVJMIGVzY2FwZSBmdW5jdGlvbiBhbHNvCi1lc2NhcGVzIGFuY2hvcnMsIGkuZS4gVVJMcyBsaWtlICJ1cmwjYW5jaG9yIi4gWW91IGNhbm5vdCB1c2UgdGhpcyBkaXJlY3RseSBvbgotcmVkaXJlY3RzIHdpdGggbW9kX3Jld3JpdGUgYmVjYXVzZSB0aGUgdXJpX2VzY2FwZSgpIGZ1bmN0aW9uIG9mIEFwYWNoZSB3b3VsZAotYWxzbyBlc2NhcGUgdGhlIGhhc2ggY2hhcmFjdGVyLiBIb3cgY2FuIHdlIHJlZGlyZWN0IHRvIHN1Y2ggYSBVUkw/Ci0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1XZSBoYXZlIHRvIHVzZSBhIGtsdWRnZSBieSB0aGUgdXNlIG9mIGEgTlBILUNHSSBzY3JpcHQgd2hpY2ggZG9lcyB0aGUgcmVkaXJlY3QKLWl0c2VsZi4gQmVjYXVzZSBoZXJlIG5vIGVzY2FwaW5nIGlzIGRvbmUgKE5QSD1ub24tcGFyc2VhYmxlIGhlYWRlcnMpLiAgRmlyc3QKLXdlIGludHJvZHVjZSBhIG5ldyBVUkwgc2NoZW1lIDx0dD54cmVkaXJlY3Q6PC90dD4gYnkgdGhlIGZvbGxvd2luZyBwZXItc2VydmVyCi1jb25maWctbGluZSAoc2hvdWxkIGJlIG9uZSBvZiB0aGUgbGFzdCByZXdyaXRlIHJ1bGVzKToKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlUnVsZSBeeHJlZGlyZWN0OiguKykgL3BhdGgvdG8vbnBoLXhyZWRpcmVjdC5jZ2kvJDEgXAotICAgICAgICAgICAgW1Q9YXBwbGljYXRpb24veC1odHRwZC1jZ2ksTF0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08UD4KLVRoaXMgZm9yY2VzIGFsbCBVUkxzIHByZWZpeGVkIHdpdGggPHR0PnhyZWRpcmVjdDo8L3R0PiB0byBiZSBwaXBlZCB0aHJvdWdoIHRoZQotPHR0Pm5waC14cmVkaXJlY3QuY2dpPC90dD4gcHJvZ3JhbS4gQW5kIHRoaXMgcHJvZ3JhbSBqdXN0IGxvb2tzIGxpa2U6Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotPFBSRT4KLSMhL3BhdGgvdG8vcGVybAotIyMKLSMjICBucGgteHJlZGlyZWN0LmNnaSAtLSBOUEgvQ0dJIHNjcmlwdCBmb3IgZXh0ZW5kZWQgcmVkaXJlY3RzCi0jIyAgQ29weXJpZ2h0IChjKSAxOTk3IFJhbGYgUy4gRW5nZWxzY2hhbGwsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotIyMKLQotJHwgPSAxOwotJHVybCA9ICRFTlZ7J1BBVEhfSU5GTyd9OwotCi1wcmludCAiSFRUUC8xLjAgMzAyIE1vdmVkIFRlbXBvcmFyaWx5XG4iOwotcHJpbnQgIlNlcnZlcjogJEVOVnsnU0VSVkVSX1NPRlRXQVJFJ31cbiI7Ci1wcmludCAiTG9jYXRpb246ICR1cmxcbiI7Ci1wcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcbiI7Ci1wcmludCAiXG4iOwotcHJpbnQgIiZsdDtodG1sJmd0O1xuIjsKLXByaW50ICImbHQ7aGVhZCZndDtcbiI7Ci1wcmludCAiJmx0O3RpdGxlJmd0OzMwMiBNb3ZlZCBUZW1wb3JhcmlseSAoRVhURU5ERUQpJmx0Oy90aXRsZSZndDtcbiI7Ci1wcmludCAiJmx0Oy9oZWFkJmd0O1xuIjsKLXByaW50ICImbHQ7Ym9keSZndDtcbiI7Ci1wcmludCAiJmx0O2gxJmd0O01vdmVkIFRlbXBvcmFyaWx5IChFWFRFTkRFRCkmbHQ7L2gxJmd0O1xuIjsKLXByaW50ICJUaGUgZG9jdW1lbnQgaGFzIG1vdmVkICZsdDthIGhyZWY9XCIkdXJsXCImZ3Q7aGVyZSZsdDsvYSZndDsuJmx0O3AmZ3Q7XG4iOwotcHJpbnQgIiZsdDsvYm9keSZndDtcbiI7Ci1wcmludCAiJmx0Oy9odG1sJmd0O1xuIjsKLQotIyNFT0YjIwotPC9QUkU+Ci08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPFA+Ci1UaGlzIHByb3ZpZGVzIHlvdSB3aXRoIHRoZSBmdW5jdGlvbmFsaXR5IHRvIGRvIHJlZGlyZWN0cyB0byBhbGwgVVJMIHNjaGVtZXMsCi1pLmUuIGluY2x1ZGluZyB0aGUgb25lIHdoaWNoIGFyZSBub3QgZGlyZWN0bHkgYWNjZXB0ZWQgYnkgbW9kX3Jld3JpdGUuIEZvcgotaW5zdGFuY2UgeW91IGNhbiBub3cgYWxzbyByZWRpcmVjdCB0byA8dHQ+bmV3czpuZXdzZ3JvdXA8L3R0PiB2aWEKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlUnVsZSBeYW55dXJsICB4cmVkaXJlY3Q6bmV3czpuZXdzZ3JvdXAKLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08UD4KLU5vdGljZTogWW91IGhhdmUgbm90IHRvIHB1dCBbUl0gb3IgW1IsTF0gdG8gdGhlIGFib3ZlIHJ1bGUgYmVjYXVzZSB0aGUKLTx0dD54cmVkaXJlY3Q6PC90dD4gbmVlZCB0byBiZSBleHBhbmRlZCBsYXRlciBieSBvdXIgc3BlY2lhbCAicGlwZSB0aHJvdWdoIgotcnVsZSBhYm92ZS4KLQotPC9ETD4KLQotPFA+Ci08SDI+QXJjaGl2ZSBBY2Nlc3MgTXVsdGlwbGV4ZXI8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotRG8geW91IGtub3cgdGhlIGdyZWF0IENQQU4gKENvbXByZWhlbnNpdmUgUGVybCBBcmNoaXZlIE5ldHdvcmspIHVuZGVyIDxhCi1ocmVmPSJodHRwOi8vd3d3LnBlcmwuY29tL0NQQU4iPmh0dHA6Ly93d3cucGVybC5jb20vQ1BBTjwvYT4/IFRoaXMgZG9lcyBhCi1yZWRpcmVjdCB0byBvbmUgb2Ygc2V2ZXJhbCBGVFAgc2VydmVycyBhcm91bmQgdGhlIHdvcmxkIHdoaWNoIGNhcnJ5IGEgQ1BBTgotbWlycm9yIGFuZCBpcyBhcHByb3hpbWF0ZWx5IG5lYXIgdGhlIGxvY2F0aW9uIG9mIHRoZSByZXF1ZXN0aW5nIGNsaWVudC4KLUFjdHVhbGx5IHRoaXMgY2FuIGJlIGNhbGxlZCBhbiBGVFAgYWNjZXNzIG11bHRpcGxleGluZyBzZXJ2aWNlLiBXaGlsZSBDUEFOCi1ydW5zIHZpYSBDR0kgc2NyaXB0cywgaG93IGNhbiBhIHNpbWlsYXIgYXBwcm9hY2ggaW1wbGVtZW50ZWQgdmlhIG1vZF9yZXdyaXRlPwotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotRmlyc3Qgd2Ugbm90aWNlIHRoYXQgZnJvbSB2ZXJzaW9uIDMuMC4wIG1vZF9yZXdyaXRlIGNhbiBhbHNvIHVzZSB0aGUgImZ0cDoiCi1zY2hlbWUgb24gcmVkaXJlY3RzLiBBbmQgc2Vjb25kLCB0aGUgbG9jYXRpb24gYXBwcm94aW1hdGlvbiBjYW4gYmUgZG9uZSBieSBhCi1yZXdyaXRlbWFwIG92ZXIgdGhlIHRvcC1sZXZlbCBkb21haW4gb2YgdGhlIGNsaWVudC4gV2l0aCBhIHRyaWNreSBjaGFpbmVkCi1ydWxlc2V0IHdlIGNhbiB1c2UgdGhpcyB0b3AtbGV2ZWwgZG9tYWluIGFzIGEga2V5IHRvIG91ciBtdWx0aXBsZXhpbmcgbWFwLgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVFbmdpbmUgb24KLVJld3JpdGVNYXAgICAgbXVsdGlwbGV4ICAgICAgICAgICAgICAgIHR4dDovcGF0aC90by9tYXAuY3hhbgotUmV3cml0ZVJ1bGUgICBeL0N4QU4vKC4qKSAgICAgICAgICAgICAgJXtSRU1PVEVfSE9TVH06OiQxICAgICAgICAgICAgICAgICBbQ10KLVJld3JpdGVSdWxlICAgXi4rXC48Yj4oW2EtekEtWl0rKTwvYj46OiguKikkICAke211bHRpcGxleDo8Yj4kMTwvYj58ZnRwLmRlZmF1bHQuZG9tfSQyICBbUixMXQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotIyMKLSMjICBtYXAuY3hhbiAtLSBNdWx0aXBsZXhpbmcgTWFwIGZvciBDeEFOCi0jIwotCi1kZSAgICAgICAgZnRwOi8vZnRwLmN4YW4uZGUvQ3hBTi8KLXVrICAgICAgICBmdHA6Ly9mdHAuY3hhbi51ay9DeEFOLwotY29tICAgICAgIGZ0cDovL2Z0cC5jeGFuLmNvbS9DeEFOLwotIDoKLSMjRU9GIyMKLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08L0RMPgotCi08UD4KLTxIMj5UaW1lLURlcGVuZGVuZCBSZXdyaXRpbmc8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotV2hlbiB0cmlja3MgbGlrZSB0aW1lLWRlcGVuZGVuZCBjb250ZW50IHNob3VsZCBoYXBwZW4gYSBsb3Qgb2Ygd2VibWFzdGVycwotc3RpbGwgdXNlIENHSSBzY3JpcHRzIHdoaWNoIGRvIGZvciBpbnN0YW5jZSByZWRpcmVjdHMgdG8gc3BlY2lhbGl6ZWQgcGFnZXMuCi1Ib3cgY2FuIGl0IGJlIGRvbmUgdmlhIG1vZF9yZXdyaXRlPwotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotVGhlcmUgYXJlIGEgbG90IG9mIHZhcmlhYmxlcyBuYW1lZCA8dHQ+VElNRV94eHg8L3R0PiBmb3IgcmV3cml0ZSBjb25kaXRpb25zLgotSW4gY29uanVuY3Rpb24gd2l0aCB0aGUgc3BlY2lhbCBsZXhpY29ncmFwaGljIGNvbXBhcmlzb24gcGF0dGVybnMgJmx0O1NUUklORywKLSZndDtTVFJJTkcgYW5kID1TVFJJTkcgd2UgY2FuIGRvIHRpbWUtZGVwZW5kZW5kIHJlZGlyZWN0czoKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlRW5naW5lIG9uCi1SZXdyaXRlQ29uZCAgICV7VElNRV9IT1VSfSV7VElNRV9NSU59ICZndDswNzAwCi1SZXdyaXRlQ29uZCAgICV7VElNRV9IT1VSfSV7VElNRV9NSU59ICZsdDsxOTAwCi1SZXdyaXRlUnVsZSAgIF5mb29cLmh0bWwkICAgICAgICAgICAgIGZvby5kYXkuaHRtbAotUmV3cml0ZVJ1bGUgICBeZm9vXC5odG1sJCAgICAgICAgICAgICBmb28ubmlnaHQuaHRtbAotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTxQPgotVGhpcyBwcm92aWRlcyB0aGUgY29udGVudCBvZiA8dHQ+Zm9vLmRheS5odG1sPC90dD4gdW5kZXIgdGhlIFVSTAotPHR0PmZvby5odG1sPC90dD4gZnJvbSAwNzowMC0xOTowMCBhbmQgYXQgdGhlIHJlbWFpbmluZyB0aW1lIHRoZSBjb250ZW50cyBvZgotPHR0PmZvby5uaWdodC5odG1sPC90dD4uIEp1c3QgYSBuaWNlIGZlYXR1cmUgZm9yIGEgaG9tZXBhZ2UuLi4KLQotPC9ETD4KLQotPFA+Ci08SDI+QmFja3dhcmQgQ29tcGF0aWJpbGl0eSBmb3IgWVlZWSB0byBYWFhYIG1pZ3JhdGlvbjwvSDI+Ci08UD4KLQotPERMPgotPERUPjxTVFJPTkc+RGVzY3JpcHRpb246PC9TVFJPTkc+Ci08REQ+Ci1Ib3cgY2FuIHdlIG1ha2UgVVJMcyBiYWNrd2FyZCBjb21wYXRpYmxlIChzdGlsbCBleGlzdGluZyB2aXJ0dWFsbHkpIGFmdGVyCi1taWdyYXRpbmcgZG9jdW1lbnQuWVlZWSB0byBkb2N1bWVudC5YWFhYLCBlLmcuIGFmdGVyIHRyYW5zbGF0aW5nIGEgYnVuY2ggb2YKLS5odG1sIGZpbGVzIHRvIC5waHRtbD8KLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLVdlIGp1c3QgcmV3cml0ZSB0aGUgbmFtZSB0byBpdHMgYmFzZW5hbWUgYW5kIHRlc3QgZm9yIGV4aXN0ZW5jZSBvZiB0aGUgbmV3Ci1leHRlbnNpb24uIElmIGl0IGV4aXN0cywgd2UgdGFrZSB0aGF0IG5hbWUsIGVsc2Ugd2UgcmV3cml0ZSB0aGUgVVJMIHRvIGl0cwotb3JpZ2luYWwgc3RhdGUuIAotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLSMgICBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHJ1bGVzZXQgZm9yIAotIyAgIHJld3JpdGluZyBkb2N1bWVudC5odG1sIHRvIGRvY3VtZW50LnBodG1sCi0jICAgd2hlbiBhbmQgb25seSB3aGVuIGRvY3VtZW50LnBodG1sIGV4aXN0cwotIyAgIGJ1dCBubyBsb25nZXIgZG9jdW1lbnQuaHRtbAotUmV3cml0ZUVuZ2luZSBvbgotUmV3cml0ZUJhc2UgICAvfnF1dXgvCi0jICAgcGFyc2Ugb3V0IGJhc2VuYW1lLCBidXQgcmVtZW1iZXIgdGhlIGZhY3QKLVJld3JpdGVSdWxlICAgXiguKilcLmh0bWwkICAgICAgICAgICAgICAkMSAgICAgIFtDLEU9V2FzSFRNTDp5ZXNdCi0jICAgcmV3cml0ZSB0byBkb2N1bWVudC5waHRtbCBpZiBleGlzdHMKLVJld3JpdGVDb25kICAgJXtSRVFVRVNUX0ZJTEVOQU1FfS5waHRtbCAtZgotUmV3cml0ZVJ1bGUgICBeKC4qKSQgJDEucGh0bWwgICAgICAgICAgICAgICAgICAgW1M9MV0KLSMgICBlbHNlIHJldmVyc2UgdGhlIHByZXZpb3VzIGJhc2VuYW1lIGN1dG91dAotUmV3cml0ZUNvbmQgICAle0VOVjpXYXNIVE1MfSAgICAgICAgICAgIF55ZXMkCi1SZXdyaXRlUnVsZSAgIF4oLiopJCAkMS5odG1sCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPC9ETD4KLQotPEgxPkNvbnRlbnQgSGFuZGxpbmc8L0gxPgotCi08UD4KLTxIMj5Gcm9tIE9sZCB0byBOZXcgKGludGVybik8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotQXNzdW1lIHdlIGhhdmUgcmVjZW50bHkgcmVuYW1lZCB0aGUgcGFnZSA8dHQ+YmFyLmh0bWw8L3R0PiB0bwotPHR0PmZvby5odG1sPC90dD4gYW5kIG5vdyB3YW50IHRvIHByb3ZpZGUgdGhlIG9sZCBVUkwgZm9yIGJhY2t3YXJkCi1jb21wYXRpYmlsaXR5LiBBY3R1YWxseSB3ZSB3YW50IHRoYXQgdXNlcnMgb2YgdGhlIG9sZCBVUkwgZXZlbiBub3QgcmVjb2duaXplCi10aGF0IHRoZSBwYWdlcyB3YXMgcmVuYW1lZC4KLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLVdlIHJld3JpdGUgdGhlIG9sZCBVUkwgdG8gdGhlIG5ldyBvbmUgaW50ZXJuYWxseSB2aWEgdGhlIGZvbGxvd2luZyBydWxlOgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVFbmdpbmUgIG9uCi1SZXdyaXRlQmFzZSAgICAvfnF1dXgvCi1SZXdyaXRlUnVsZSAgICBePGI+Zm9vPC9iPlwuaHRtbCQgIDxiPmJhcjwvYj4uaHRtbAotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTwvREw+Ci0KLTxQPgotPEgyPkZyb20gT2xkIHRvIE5ldyAoZXh0ZXJuKTwvSDI+Ci08UD4KLQotPERMPgotPERUPjxTVFJPTkc+RGVzY3JpcHRpb246PC9TVFJPTkc+Ci08REQ+Ci1Bc3N1bWUgYWdhaW4gdGhhdCB3ZSBoYXZlIHJlY2VudGx5IHJlbmFtZWQgdGhlIHBhZ2UgPHR0PmJhci5odG1sPC90dD4gdG8KLTx0dD5mb28uaHRtbDwvdHQ+IGFuZCBub3cgd2FudCB0byBwcm92aWRlIHRoZSBvbGQgVVJMIGZvciBiYWNrd2FyZAotY29tcGF0aWJpbGl0eS4gQnV0IHRoaXMgdGltZSB3ZSB3YW50IHRoYXQgdGhlIHVzZXJzIG9mIHRoZSBvbGQgVVJMIGdldCBoaW50ZWQKLXRvIHRoZSBuZXcgb25lLCBpLmUuIHRoZWlyIGJyb3dzZXJzIExvY2F0aW9uIGZpZWxkIHNob3VsZCBjaGFuZ2UsIHRvby4KLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLVdlIGZvcmNlIGEgSFRUUCByZWRpcmVjdCB0byB0aGUgbmV3IFVSTCB3aGljaCBsZWFkcyB0byBhIGNoYW5nZSBvZiB0aGUKLWJyb3dzZXJzIGFuZCB0aHVzIHRoZSB1c2VycyB2aWV3OgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVFbmdpbmUgIG9uCi1SZXdyaXRlQmFzZSAgICAvfnF1dXgvCi1SZXdyaXRlUnVsZSAgICBePGI+Zm9vPC9iPlwuaHRtbCQgIDxiPmJhcjwvYj4uaHRtbCAgWzxiPlI8L2I+XQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTwvREw+Ci0KLTxQPgotPEgyPkJyb3dzZXIgRGVwZW5kZW5kIENvbnRlbnQ8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotQXQgbGVhc3QgZm9yIGltcG9ydGFudCB0b3AtbGV2ZWwgcGFnZXMgaXQgaXMgc29tZXRpbWVzIG5lY2VzYXJyeSB0byBwcm92aWRlCi10aGUgb3B0aW11bSBvZiBicm93c2VyIGRlcGVuZGVuZCBjb250ZW50LCBpLmUuIG9uZSBoYXMgdG8gcHJvdmlkZSBhIG1heGltdW0KLXZlcnNpb24gZm9yIHRoZSBsYXRlc3QgTmV0c2NhcGUgdmFyaWFudHMsIGEgbWluaW11bSB2ZXJzaW9uIGZvciB0aGUgTHlueAotYnJvd3NlcnMgYW5kIGEgYXZlcmFnZSBmZWF0dXJlIHZlcnNpb24gZm9yIGFsbCBvdGhlcnMuCi0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1XZSBjYW5ub3QgdXNlIGNvbnRlbnQgbmVnb3RpYXRpb24gYmVjYXVzZSB0aGUgYnJvd3NlcnMgZG8gbm90IHByb3ZpZGUgdGhlaXIKLXR5cGUgaW4gdGhhdCBmb3JtLiBJbnN0ZWFkIHdlIGhhdmUgdG8gYWN0IG9uIHRoZSBIVFRQIGhlYWRlciAiVXNlci1BZ2VudCIuCi1UaGUgZm9sbG93aW5nIGNvbmRpZyBkb2VzIHRoZSBmb2xsb3dpbmc6IElmIHRoZSBIVFRQIGhlYWRlciAiVXNlci1BZ2VudCIKLWJlZ2lucyB3aXRoICJNb3ppbGxhLzMiLCB0aGUgcGFnZSA8dHQ+Zm9vLmh0bWw8L3R0PiBpcyByZXdyaXR0ZW4gdG8KLTx0dD5mb28uTlMuaHRtbDwvdHQ+IGFuZCBhbmQgdGhlIHJld3JpdGluZyBzdG9wcy4gIElmIHRoZSBicm93c2VyIGlzICJMeW54IiBvcgotIk1vemlsbGEiIG9mIHZlcnNpb24gMSBvciAyIHRoZSBVUkwgYmVjb21lcyA8dHQ+Zm9vLjIwLmh0bWw8L3R0Pi4gIEFsbCBvdGhlcgotYnJvd3NlcnMgcmVjZWl2ZSBwYWdlIDx0dD5mb28uMzIuaHRtbDwvdHQ+LiBUaGlzIGlzIGRvbmUgYnkgdGhlIGZvbGxvd2luZwotcnVsZXNldDoKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlQ29uZCAle0hUVFBfVVNFUl9BR0VOVH0gIF48Yj5Nb3ppbGxhLzM8L2I+LioKLVJld3JpdGVSdWxlIF5mb29cLmh0bWwkICAgICAgICAgZm9vLjxiPk5TPC9iPi5odG1sICAgICAgICAgIFs8Yj5MPC9iPl0KLQotUmV3cml0ZUNvbmQgJXtIVFRQX1VTRVJfQUdFTlR9ICBePGI+THlueC88L2I+LiogICAgICAgICBbT1JdCi1SZXdyaXRlQ29uZCAle0hUVFBfVVNFUl9BR0VOVH0gIF48Yj5Nb3ppbGxhL1sxMl08L2I+LioKLVJld3JpdGVSdWxlIF5mb29cLmh0bWwkICAgICAgICAgZm9vLjxiPjIwPC9iPi5odG1sICAgICAgICAgIFs8Yj5MPC9iPl0KLQotUmV3cml0ZVJ1bGUgXmZvb1wuaHRtbCQgICAgICAgICBmb28uPGI+MzI8L2I+Lmh0bWwgICAgICAgICAgWzxiPkw8L2I+XQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTwvREw+Ci0KLTxQPgotPEgyPkR5bmFtaWMgTWlycm9yPC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLUFzc3VtZSB0aGVyZSBhcmUgbmljZSB3ZWJwYWdlcyBvbiByZW1vdGUgaG9zdHMgd2Ugd2FudCB0byBicmluZyBpbnRvIG91cgotbmFtZXNwYWNlLiBGb3IgRlRQIHNlcnZlcnMgd2Ugd291bGQgdXNlIHRoZSA8dHQ+bWlycm9yPC90dD4gcHJvZ3JhbSB3aGljaAotYWN0dWFsbHkgbWFpbnRhaW5zIGFuIGV4cGxpY2l0IHVwLXRvLWRhdGUgY29weSBvZiB0aGUgcmVtb3RlIGRhdGEgb24gdGhlIGxvY2FsCi1tYWNoaW5lLiBGb3IgYSB3ZWJzZXJ2ZXIgd2UgY291bGQgdXNlIHRoZSBwcm9ncmFtIDx0dD53ZWJjb3B5PC90dD4gd2hpY2ggYWN0cwotc2ltaWxhciB2aWEgSFRUUC4gQnV0IGJvdGggdGVjaG5pcXVlcyBoYXZlIG9uZSBtYWpvciBkcmF3YmFjazogVGhlIGxvY2FsIGNvcHkKLWlzIGFsd2F5cyBqdXN0IGFzIHVwLXRvLWRhdGUgYXMgb2Z0ZW4gd2UgcnVuIHRoZSBwcm9ncmFtLiBJdCB3b3VsZCBiZSBtdWNoCi1iZXR0ZXIgaWYgdGhlIG1pcnJvciBpcyBub3QgYSBzdGF0aWMgb25lIHdlIGhhdmUgdG8gZXN0YWJsaXNoIGV4cGxpY2l0bHkuCi1JbnN0ZWFkIHdlIHdhbnQgYSBkeW5hbWljIG1pcnJvciB3aXRoIGRhdGEgd2hpY2ggZ2V0cyB1cGRhdGVkIGF1dG9tYXRpY2FsbHkKLXdoZW4gdGhlcmUgaXMgbmVlZCAodXBkYXRlZCBkYXRhIG9uIHRoZSByZW1vdGUgaG9zdCkuCi0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1UbyBwcm92aWRlIHRoaXMgZmVhdHVyZSB3ZSBtYXAgdGhlIHJlbW90ZSB3ZWJwYWdlIG9yIGV2ZW4gdGhlIGNvbXBsZXRlIHJlbW90ZQotd2ViYXJlYSB0byBvdXIgbmFtZXNwYWNlIGJ5IHRoZSB1c2Ugb2YgdGhlIDxJPlByb3h5IFRocm91Z2hwdXQ8L0k+IGZlYXR1cmUKLShmbGFnIFtQXSk6Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUVuZ2luZSAgb24KLVJld3JpdGVCYXNlICAgIC9+cXV1eC8KLVJld3JpdGVSdWxlICAgIF48Yj5ob3RzaGVldC88L2I+KC4qKSQgIDxiPmh0dHA6Ly93d3cudHN0aW1wcmVzby5jb20vaG90c2hlZXQvPC9iPiQxICBbPGI+UDwvYj5dCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlRW5naW5lICBvbgotUmV3cml0ZUJhc2UgICAgL35xdXV4LwotUmV3cml0ZVJ1bGUgICAgXjxiPnVzYS1uZXdzXC5odG1sPC9iPiQgICA8Yj5odHRwOi8vd3d3LnF1dXgtY29ycC5jb20vbmV3cy9pbmRleC5odG1sPC9iPiAgWzxiPlA8L2I+XQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTwvREw+Ci0KLTxQPgotPEgyPlJldmVyc2UgRHluYW1pYyBNaXJyb3I8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotLi4uCi0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUVuZ2luZSBvbgotUmV3cml0ZUNvbmQgICAvbWlycm9yL29mL3JlbW90ZXNpdGUvJDEgICAgICAgICAgIC1VIAotUmV3cml0ZVJ1bGUgICBeaHR0cDovL3d3d1wucmVtb3Rlc2l0ZVwuY29tLyguKikkIC9taXJyb3Ivb2YvcmVtb3Rlc2l0ZS8kMQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTwvREw+Ci0KLTxQPgotPEgyPlJldHJpZXZlIE1pc3NpbmcgRGF0YSBmcm9tIEludHJhbmV0PC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLVRoaXMgaXMgYSB0cmlja3kgd2F5IG9mIHZpcnR1YWxseSBydW5uaW5nIGEgY29ycG9yYXRlcyAoZXh0ZXJuYWwpIEludGVybmV0Ci13ZWJzZXJ2ZXIgKDx0dD53d3cucXV1eC1jb3JwLmRvbTwvdHQ+KSwgd2hpbGUgYWN0dWFsbHkga2VlcGluZyBhbmQgbWFpbnRhaW5pbmcKLWl0cyBkYXRhIG9uIGEgKGludGVybmFsKSBJbnRyYW5ldCB3ZWJzZXJ2ZXIKLSg8dHQ+d3d3Mi5xdXV4LWNvcnAuZG9tPC90dD4pIHdoaWNoIGlzIHByb3RlY3RlZCBieSBhIGZpcmV3YWxsLiAgVGhlCi10cmljayBpcyB0aGF0IG9uIHRoZSBleHRlcm5hbCB3ZWJzZXJ2ZXIgd2UgcmV0cmlldmUgdGhlIHJlcXVlc3RlZCBkYXRhCi1vbi10aGUtZmx5IGZyb20gdGhlIGludGVybmFsIG9uZS4KLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLUZpcnN0LCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IG91ciBmaXJld2FsbCBzdGlsbCBwcm90ZWN0cyB0aGUgaW50ZXJuYWwKLXdlYnNlcnZlciBhbmQgdGhhdCBvbmx5IHRoZSBleHRlcm5hbCB3ZWJzZXJ2ZXIgaXMgYWxsb3dlZCB0byByZXRyaWV2ZSBkYXRhCi1mcm9tIGl0LiBGb3IgYSBwYWNrZXQtZmlsdGVyaW5nIGZpcmV3YWxsIHdlIGNvdWxkIGZvciBpbnN0YW5jZSBjb25maWd1cmUgYQotZmlyZXdhbGwgcnVsZXNldCBsaWtlIHRoZSBmb2xsb3dpbmc6Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotPGI+QUxMT1c8L2I+IEhvc3Qgd3d3LnF1dXgtY29ycC5kb20gUG9ydCAmZ3Q7MTAyNCAtLSZndDsgSG9zdCB3d3cyLnF1dXgtY29ycC5kb20gUG9ydCA8Yj44MDwvYj4gIAotPGI+REVOWTwvYj4gIEhvc3QgKiAgICAgICAgICAgICAgICAgUG9ydCAqICAgICAtLSZndDsgSG9zdCB3d3cyLnF1dXgtY29ycC5kb20gUG9ydCA8Yj44MDwvYj4KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08UD4KLUp1c3QgYWRqdXN0IGl0IHRvIHlvdXIgYWN0dWFsIGNvbmZpZ3VyYXRpb24gc3ludGF4LiBOb3cgd2UgY2FuIGVzdGFibGlzaCB0aGUKLW1vZF9yZXdyaXRlIHJ1bGVzIHdoaWNoIHJlcXVlc3QgdGhlIG1pc3NpbmcgZGF0YSBpbiB0aGUgYmFja2dyb3VuZCB0aHJvdWdoIHRoZQotcHJveHkgdGhyb3VnaHB1dCBmZWF0dXJlOgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVSdWxlIF4vfihbXi9dKykvPyguKikgICAgICAgICAgL2hvbWUvJDEvLnd3dy8kMgotUmV3cml0ZUNvbmQgJXtSRVFVRVNUX0ZJTEVOQU1FfSAgICAgICA8Yj4hLWY8L2I+Ci1SZXdyaXRlQ29uZCAle1JFUVVFU1RfRklMRU5BTUV9ICAgICAgIDxiPiEtZDwvYj4KLVJld3JpdGVSdWxlIF4vaG9tZS8oW14vXSspLy53d3cvPyguKikgaHR0cDovLzxiPnd3dzI8L2I+LnF1dXgtY29ycC5kb20vfiQxL3B1Yi8kMiBbPGI+UDwvYj5dCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPC9ETD4KLQotPFA+Ci08SDI+TG9hZCBCYWxhbmNpbmc8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotU3VwcG9zZSB3ZSB3YW50IHRvIGxvYWQgYmFsYW5jZSB0aGUgdHJhZmZpYyB0byA8dHQ+d3d3LmZvby5jb208L3R0PiBvdmVyCi08dHQ+d3d3WzAtNV0uZm9vLmNvbTwvdHQ+IChhIHRvdGFsIG9mIDYgc2VydmVycykuIEhvdyBjYW4gdGhpcyBiZSBkb25lPwotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotVGhlcmUgYXJlIGEgbG90IG9mIHBvc3NpYmxlIHNvbHV0aW9ucyBmb3IgdGhpcyBwcm9ibGVtLiBXZSB3aWxsIGRpc2N1c3MgZmlyc3QKLWEgY29tbW9ubHkga25vd24gRE5TLWJhc2VkIHZhcmlhbnQgYW5kIHRoZW4gdGhlIHNwZWNpYWwgb25lIHdpdGggbW9kX3Jld3JpdGU6Ci0KLTxvbD4KLTxsaT48Yj5ETlMgUm91bmQtUm9iaW48L2I+Ci0KLTxQPgotVGhlIHNpbXBsZXN0IG1ldGhvZCBmb3IgbG9hZC1iYWxhbmNpbmcgaXMgdG8gdXNlIHRoZSBETlMgcm91bmQtcm9iaW4gZmVhdHVyZQotb2YgQklORC4gSGVyZSB5b3UganVzdCBjb25maWd1cmUgPHR0Pnd3d1swLTldLmZvby5jb208L3R0PiBhcyB1c3VhbCBpbiB5b3VyCi1ETlMgd2l0aCBBKGFkZHJlc3MpIHJlY29yZHMsIGUuZy4KLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci13d3cwICAgSU4gIEEgICAgICAgMS4yLjMuMQotd3d3MSAgIElOICBBICAgICAgIDEuMi4zLjIKLXd3dzIgICBJTiAgQSAgICAgICAxLjIuMy4zCi13d3czICAgSU4gIEEgICAgICAgMS4yLjMuNAotd3d3NCAgIElOICBBICAgICAgIDEuMi4zLjUKLXd3dzUgICBJTiAgQSAgICAgICAxLjIuMy42Ci08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPFA+Ci1UaGVuIHlvdSBhZGRpdGlvbmFsbHkgYWRkIHRoZSBmb2xsb3dpbmcgZW50cnk6Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotd3d3ICAgIElOICBDTkFNRSAgIHd3dzAuZm9vLmNvbS4KLSAgICAgICBJTiAgQ05BTUUgICB3d3cxLmZvby5jb20uCi0gICAgICAgSU4gIENOQU1FICAgd3d3Mi5mb28uY29tLgotICAgICAgIElOICBDTkFNRSAgIHd3dzMuZm9vLmNvbS4KLSAgICAgICBJTiAgQ05BTUUgICB3d3c0LmZvby5jb20uCi0gICAgICAgSU4gIENOQU1FICAgd3d3NS5mb28uY29tLgotICAgICAgIElOICBDTkFNRSAgIHd3dzYuZm9vLmNvbS4KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08UD4KLU5vdGljZSB0aGF0IHRoaXMgc2VlbXMgd3JvbmcsIGJ1dCBpcyBhY3R1YWxseSBhbiBpbnRlbmRlZCBmZWF0dXJlIG9mIEJJTkQgYW5kCi1jYW4gYmUgdXNlZCBpbiB0aGlzIHdheS4gSG93ZXZlciwgbm93IHdoZW4gPHR0Pnd3dy5mb28uY29tPC90dD4gZ2V0cyByZXNvbHZlZCwKLUJJTkQgZ2l2ZXMgb3V0IDx0dD53d3cwLXd3dzY8L3R0PiAtIGJ1dCBpbiBhIHNsaWdodGx5IHBlcm11dGF0ZWQvcm90YXRlZCBvcmRlcgotZXZlcnkgdGltZS4gIFRoaXMgd2F5IHRoZSBjbGllbnRzIGFyZSBzcHJlYWQgb3ZlciB0aGUgdmFyaW91cyBzZXJ2ZXJzLgotCi1CdXQgbm90aWNlIHRoYXQgdGhpcyBub3QgYSBwZXJmZWN0IGxvYWQgYmFsYW5jaW5nIHNjaGVtZSwgYmVjYXVzZSBETlMgcmVzb2x2ZQotaW5mb3JtYXRpb24gZ2V0cyBjYWNoZWQgYnkgdGhlIG90aGVyIG5hbWVzZXJ2ZXJzIG9uIHRoZSBuZXQsIHNvIG9uY2UgYSBjbGllbnQKLWhhcyByZXNvbHZlZCA8dHQ+d3d3LmZvby5jb208L3R0PiB0byBhIHBhcnRpY3VsYXIgPHR0Pnd3d04uZm9vLmNvbTwvdHQ+LCBhbGwKLXN1YnNlcXVlbnQgcmVxdWVzdHMgYWxzbyBnbyB0byB0aGlzIHBhcnRpY3VsYXIgbmFtZSA8dHQ+d3d3Ti5mb28uY29tPC90dD4uIEJ1dAotdGhlIGZpbmFsIHJlc3VsdCBpcyBvaywgYmVjYXVzZSB0aGUgdG90YWwgc3VtIG9mIHRoZSByZXF1ZXN0cyBhcmUgcmVhbGx5Ci1zcHJlYWQgb3ZlciB0aGUgdmFyaW91cyB3ZWJzZXJ2ZXJzLgotCi08UD4KLTxsaT48Yj5ETlMgTG9hZC1CYWxhbmNpbmc8L2I+Ci0KLTxQPgotQSBzb3BoaXN0aWNhdGVkIEROUy1iYXNlZCBtZXRob2QgZm9yIGxvYWQtYmFsYW5jaW5nIGlzIHRvIHVzZSB0aGUgcHJvZ3JhbQotPHR0PmxibmFtZWQ8L3R0PiB3aGljaCBjYW4gYmUgZm91bmQgYXQgPGEKLWhyZWY9Imh0dHA6Ly93d3cuc3RhbmZvcmQuZWR1L35zY2hlbWVycy9kb2NzL2xibmFtZWQvbGJuYW1lZC5odG1sIj5odHRwOi8vd3d3LnN0YW5mb3JkLmVkdS9+c2NoZW1lcnMvZG9jcy9sYm5hbWVkL2xibmFtZWQuaHRtbDwvYT4uCi1JdCBpcyBhIFBlcmwgNSBwcm9ncmFtIGluIGNvbmp1bmN0aW9uIHdpdGggYXV4aWxsaWFyeSB0b29scyB3aGljaCBwcm92aWRlcyBhCi1yZWFsIGxvYWQtYmFsYW5jaW5nIGZvciBETlMuCi0KLTxQPgotPGxpPjxiPlByb3h5IFRocm91Z2hwdXQgUm91bmQtUm9iaW48L2I+Ci0KLTxQPgotSW4gdGhpcyB2YXJpYW50IHdlIHVzZSBtb2RfcmV3cml0ZSBhbmQgaXRzIHByb3h5IHRocm91Z2hwdXQgZmVhdHVyZS4gIEZpcnN0IHdlCi1kZWRpY2F0ZSA8dHQ+d3d3MC5mb28uY29tPC90dD4gdG8gYmUgYWN0dWFsbHkgPHR0Pnd3dy5mb28uY29tPC90dD4gYnkgdXNpbmcgYQotc2luZ2xlCi0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotd3d3ICAgIElOICBDTkFNRSAgIHd3dzAuZm9vLmNvbS4KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08UD4KLWVudHJ5IGluIHRoZSBETlMuIFRoZW4gd2UgY29udmVydCA8dHQ+d3d3MC5mb28uY29tPC90dD4gdG8gYSBwcm94eS1vbmx5Ci1zZXJ2ZXIsIGkuZS4gd2UgY29uZmlndXJlIHRoaXMgbWFjaGluZSBzbyBhbGwgYXJyaXZpbmcgVVJMcyBhcmUganVzdCBwdXNoZWQKLXRocm91Z2ggdGhlIGludGVybmFsIHByb3h5IHRvIG9uZSBvZiB0aGUgNSBvdGhlciBzZXJ2ZXJzICg8dHQ+d3d3MS13d3c1PC90dD4pLgotVG8gYWNjb21wbGlzaCB0aGlzIHdlIGZpcnN0IGVzdGFibGlzaCBhIHJ1bGVzZXQgd2hpY2ggY29udGFjdHMgYSBsb2FkCi1iYWxhbmNpbmcgc2NyaXB0IDx0dD5sYi5wbDwvdHQ+IGZvciBhbGwgVVJMcy4KLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlRW5naW5lIG9uCi1SZXdyaXRlTWFwICAgIGxiICAgICAgcHJnOi9wYXRoL3RvL2xiLnBsCi1SZXdyaXRlUnVsZSAgIF4vKC4rKSQgJHtsYjokMX0gICAgICAgICAgIFtQLExdCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPFA+Ci1UaGVuIHdlIHdyaXRlIDx0dD5sYi5wbDwvdHQ+OgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLSMhL3BhdGgvdG8vcGVybAotIyMKLSMjICBsYi5wbCAtLSBsb2FkIGJhbGFuY2luZyBzY3JpcHQKLSMjCi0KLSR8ID0gMTsKLQotJG5hbWUgICA9ICJ3d3ciOyAgICAgIyB0aGUgaG9zdG5hbWUgYmFzZQotJGZpcnN0ICA9IDE7ICAgICAgICAgIyB0aGUgZmlyc3Qgc2VydmVyIChub3QgMCBoZXJlLCBiZWNhdXNlIDAgaXMgbXlzZWxmKSAKLSRsYXN0ICAgPSA1OyAgICAgICAgICMgdGhlIGxhc3Qgc2VydmVyIGluIHRoZSByb3VuZC1yb2JpbgotJGRvbWFpbiA9ICJmb28uZG9tIjsgIyB0aGUgZG9tYWlubmFtZQotCi0kY250ID0gMDsKLXdoaWxlICgmbHQ7U1RESU4mZ3Q7KSB7Ci0gICAgJGNudCA9ICgoJGNudCsxKSAlICgkbGFzdCsxLSRmaXJzdCkpOwotICAgICRzZXJ2ZXIgPSBzcHJpbnRmKCIlcyVkLiVzIiwgJG5hbWUsICRjbnQrJGZpcnN0LCAkZG9tYWluKTsKLSAgICBwcmludCAiaHR0cDovLyRzZXJ2ZXIvJF8iOwotfQotCi0jI0VPRiMjCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPFA+Ci1BIGxhc3Qgbm90aWNlOiBXaHkgaXMgdGhpcyB1c2VmdWw/IFNlZW1zIGxpa2UgPHR0Pnd3dzAuZm9vLmNvbTwvdHQ+IHN0aWxsIGlzCi1vdmVybG9hZGVkPyBUaGUgYW5zd2VyIGlzIHllcywgaXQgaXMgb3ZlcmxvYWRlZCwgYnV0IHdpdGggcGxhaW4gcHJveHkKLXRocm91Z2hwdXQgcmVxdWVzdHMsIG9ubHkhIEFsbCBTU0ksIENHSSwgZVBlcmwsIGV0Yy4gcHJvY2Vzc2luZyBpcyBjb21wbGV0ZWx5Ci1kb25lIG9uIHRoZSBvdGhlciBtYWNoaW5lcy4gVGhpcyBpcyB0aGUgZXNzZW50aWFsIHBvaW50LgotCi08UD4KLTxsaT48Yj5IYXJkd2FyZS9UQ1AgUm91bmQtUm9iaW48L2I+Ci0KLTxQPgotVGhlcmUgaXMgYSBoYXJkd2FyZSBzb2x1dGlvbiBhdmFpbGFibGUsIHRvby4gQ2lzY28gaGFzIGEgYmVhc3QgY2FsbGVkCi1Mb2NhbERpcmVjdG9yIHdoaWNoIGRvZXMgYSBsb2FkIGJhbGFuY2luZyBhdCB0aGUgVENQL0lQIGxldmVsLiBBY3R1YWxseSB0aGlzCi1pcyBzb21lIHNvcnQgb2YgYSBjaXJjdWl0IGxldmVsIGdhdGV3YXkgaW4gZnJvbnQgb2YgYSB3ZWJjbHVzdGVyLiAgSWYgeW91IGhhdmUKLWVub3VnaCBtb25leSBhbmQgcmVhbGx5IG5lZWQgYSBzb2x1dGlvbiB3aXRoIGhpZ2ggcGVyZm9ybWFuY2UsIHVzZSB0aGlzIG9uZS4KLQotPC9vbD4KLQotPC9ETD4KLQotPFA+Ci08SDI+UmV2ZXJzZSBQcm94eTwvSDI+Ci08UD4KLQotPERMPgotPERUPjxTVFJPTkc+RGVzY3JpcHRpb246PC9TVFJPTkc+Ci08REQ+Ci0uLi4KLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci0jIwotIyMgIGFwYWNoZS1ycHJveHkuY29uZiAtLSBBcGFjaGUgY29uZmlndXJhdGlvbiBmb3IgUmV2ZXJzZSBQcm94eSBVc2FnZQotIyMKLQotIyAgIHNlcnZlciB0eXBlCi1TZXJ2ZXJUeXBlICAgICAgICAgICBzdGFuZGFsb25lCi1Qb3J0ICAgICAgICAgICAgICAgICA4MDAwCi1NaW5TcGFyZVNlcnZlcnMgICAgICAxNgotU3RhcnRTZXJ2ZXJzICAgICAgICAgMTYKLU1heFNwYXJlU2VydmVycyAgICAgIDE2Ci1NYXhDbGllbnRzICAgICAgICAgICAxNgotTWF4UmVxdWVzdHNQZXJDaGlsZCAgMTAwCi0KLSMgICBzZXJ2ZXIgb3BlcmF0aW9uIHBhcmFtZXRlcnMKLUtlZXBBbGl2ZSAgICAgICAgICAgIG9uCi1NYXhLZWVwQWxpdmVSZXF1ZXN0cyAxMDAKLUtlZXBBbGl2ZVRpbWVvdXQgICAgIDE1Ci1UaW1lb3V0ICAgICAgICAgICAgICA0MDAKLUlkZW50aXR5Q2hlY2sgICAgICAgIG9mZgotSG9zdG5hbWVMb29rdXBzICAgICAgb2ZmCi0KLSMgICBwYXRocyB0byBydW50aW1lIGZpbGVzCi1QaWRGaWxlICAgICAgICAgICAgICAvcGF0aC90by9hcGFjaGUtcnByb3h5LnBpZAotTG9ja0ZpbGUgICAgICAgICAgICAgL3BhdGgvdG8vYXBhY2hlLXJwcm94eS5sb2NrCi1FcnJvckxvZyAgICAgICAgICAgICAvcGF0aC90by9hcGFjaGUtcnByb3h5LmVsb2cKLUN1c3RvbUxvZyAgICAgICAgICAgIC9wYXRoL3RvL2FwYWNoZS1ycHJveHkuZGxvZyAiJXsldi8lVH10ICVoIC0mZ3Q7ICV7U0VSVkVSfWUgVVJMOiAlVSIKLQotIyAgIHVudXNlZCBwYXRocwotU2VydmVyUm9vdCAgICAgICAgICAgL3RtcAotRG9jdW1lbnRSb290ICAgICAgICAgL3RtcAotQ2FjaGVSb290ICAgICAgICAgICAgL3RtcAotUmV3cml0ZUxvZyAgICAgICAgICAgL2Rldi9udWxsCi1UcmFuc2ZlckxvZyAgICAgICAgICAvZGV2L251bGwKLVR5cGVzQ29uZmlnICAgICAgICAgIC9kZXYvbnVsbAotQWNjZXNzQ29uZmlnICAgICAgICAgL2Rldi9udWxsCi1SZXNvdXJjZUNvbmZpZyAgICAgICAvZGV2L251bGwKLQotIyAgIHNwZWVkIHVwIGFuZCBzZWN1cmUgcHJvY2Vzc2luZwotJmx0O0RpcmVjdG9yeSAvJmd0OwotT3B0aW9ucyAtRm9sbG93U3ltTGlua3MgLVN5bUxpbmtzSWZPd25lck1hdGNoCi1BbGxvd092ZXJ3cml0ZSBOb25lCi0mbHQ7L0RpcmVjdG9yeSZndDsKLQotIyAgIHRoZSBzdGF0dXMgcGFnZSBmb3IgbW9uaXRvcmluZyB0aGUgcmV2ZXJzZSBwcm94eQotJmx0O0xvY2F0aW9uIC9ycHJveHktc3RhdHVzJmd0OwotU2V0SGFuZGxlciBzZXJ2ZXItc3RhdHVzCi0mbHQ7L0xvY2F0aW9uJmd0OwotCi0jICAgZW5hYmxlIHRoZSBVUkwgcmV3cml0aW5nIGVuZ2luZQotUmV3cml0ZUVuZ2luZSAgICAgICAgb24KLVJld3JpdGVMb2dMZXZlbCAgICAgIDAKLQotIyAgIGRlZmluZSBhIHJld3JpdGluZyBtYXAgd2l0aCB2YWx1ZS1saXN0cyB3aGVyZQotIyAgIG1vZF9yZXdyaXRlIHJhbmRvbWx5IGNob29zZXMgYSBwYXJ0aWN1bGFyIHZhbHVlCi1SZXdyaXRlTWFwICAgICBzZXJ2ZXIgIHJuZDovcGF0aC90by9hcGFjaGUtcnByb3h5LmNvbmYtc2VydmVycwotCi0jICAgbWFrZSBzdXJlIHRoZSBzdGF0dXMgcGFnZSBpcyBoYW5kbGVkIGxvY2FsbHkKLSMgICBhbmQgbWFrZSBzdXJlIG5vIG9uZSB1c2VzIG91ciBwcm94eSBleGNlcHQgb3Vyc2VsZgotUmV3cml0ZVJ1bGUgICAgXi9hcGFjaGUtcnByb3h5LXN0YXR1cy4qICAtICBbTF0KLVJld3JpdGVSdWxlICAgIF4oaHR0cHxmdHApOi8vLiogICAgICAgICAgLSAgW0ZdCi0KLSMgICBub3cgY2hvb3NlIHRoZSBwb3NzaWJsZSBzZXJ2ZXJzIGZvciBwYXJ0aWN1bGFyIFVSTCB0eXBlcwotUmV3cml0ZVJ1bGUgICAgXi8oLipcLihjZ2l8c2h0bWwpKSQgIHRvOi8vJHtzZXJ2ZXI6ZHluYW1pY30vJDEgIFtTPTFdCi1SZXdyaXRlUnVsZSAgICBeLyguKikkICAgICAgICAgICAgICAgdG86Ly8ke3NlcnZlcjpzdGF0aWN9LyQxICAKLQotIyAgIGFuZCBkZWxlZ2F0ZSB0aGUgZ2VuZXJhdGVkIFVSTCBieSBwYXNzaW5nIGl0IAotIyAgIHRocm91Z2ggdGhlIHByb3h5IG1vZHVsZQotUmV3cml0ZVJ1bGUgICAgXnRvOi8vKFteL10rKS8oLiopICAgIGh0dHA6Ly8kMS8kMiAgIFtFPVNFUlZFUjokMSxQLExdCi0KLSMgICBhbmQgbWFrZSByZWFsbHkgc3VyZSBhbGwgb3RoZXIgc3R1ZmYgaXMgZm9yYmlkZGVuIAotIyAgIHdoZW4gaXQgc2hvdWxkIHN1cnZpdmUgdGhlIGFib3ZlIHJ1bGVzLi4uCi1SZXdyaXRlUnVsZSAgICAuKiAgICAgICAgICAgICAgICAgICAgLSAgICAgICAgICAgICAgW0ZdCi0KLSMgICBlbmFibGUgdGhlIFByb3h5IG1vZHVsZSB3aXRob3V0IGNhY2hpbmcKLVByb3h5UmVxdWVzdHMgICAgICAgIG9uCi1Ob0NhY2hlICAgICAgICAgICAgICAqCi0KLSMgICBzZXR1cCBVUkwgcmV2ZXJzZSBtYXBwaW5nIGZvciByZWRpcmVjdCByZXBvbnNlcwotUHJveHlQYXNzUmV2ZXJzZSAgLyAgaHR0cDovL3d3dzEuZm9vLmRvbS8KLVByb3h5UGFzc1JldmVyc2UgIC8gIGh0dHA6Ly93d3cyLmZvby5kb20vCi1Qcm94eVBhc3NSZXZlcnNlICAvICBodHRwOi8vd3d3My5mb28uZG9tLwotUHJveHlQYXNzUmV2ZXJzZSAgLyAgaHR0cDovL3d3dzQuZm9vLmRvbS8KLVByb3h5UGFzc1JldmVyc2UgIC8gIGh0dHA6Ly93d3c1LmZvby5kb20vCi1Qcm94eVBhc3NSZXZlcnNlICAvICBodHRwOi8vd3d3Ni5mb28uZG9tLwotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotIyMKLSMjICBhcGFjaGUtcnByb3h5LmNvbmYtc2VydmVycyAtLSBBcGFjaGUvbW9kX3Jld3JpdGUgc2VsZWN0aW9uIHRhYmxlCi0jIwotCi0jICAgbGlzdCBvZiBiYWNrZW5kIHNlcnZlcnMgd2hpY2ggc2VydmUgc3RhdGljCi0jICAgcGFnZXMgKEhUTUwgZmlsZXMgYW5kIEltYWdlcywgZXRjLikKLXN0YXRpYyAgICB3d3cxLmZvby5kb218d3d3Mi5mb28uZG9tfHd3dzMuZm9vLmRvbXx3d3c0LmZvby5kb20KLQotIyAgIGxpc3Qgb2YgYmFja2VuZCBzZXJ2ZXJzIHdoaWNoIHNlcnZlIGR5bmFtaWNhbGx5IAotIyAgIGdlbmVyYXRlZCBwYWdlIChDR0kgcHJvZ3JhbXMgb3IgbW9kX3Blcmwgc2NyaXB0cykKLWR5bmFtaWMgICB3d3c1LmZvby5kb218d3d3Ni5mb28uZG9tCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPC9ETD4KLQotPFA+Ci08SDI+TmV3IE1JTUUtdHlwZSwgTmV3IFNlcnZpY2U8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotT24gdGhlIG5ldCB0aGVyZSBhcmUgYSBsb3Qgb2YgbmlmdHkgQ0dJIHByb2dyYW1zLiBCdXQgdGhlaXIgdXNhZ2UgaXMgdXN1YWxseQotYm9yaW5nLCBzbyBhIGxvdCBvZiB3ZWJtYXN0ZXIgZG9uJ3QgdXNlIHRoZW0uICBFdmVuIEFwYWNoZSdzIEFjdGlvbiBoYW5kbGVyCi1mZWF0dXJlIGZvciBNSU1FLXR5cGVzIGlzIG9ubHkgYXBwcm9wcmlhdGUgd2hlbiB0aGUgQ0dJIHByb2dyYW1zIGRvbid0IG5lZWQKLXNwZWNpYWwgVVJMcyAoYWN0dWFsbHkgUEFUSF9JTkZPIGFuZCBRVUVSWV9TVFJJTkdTKSBhcyB0aGVpciBpbnB1dC4gCi0KLUZpcnN0LCBsZXQgdXMgY29uZmlndXJlIGEgbmV3IGZpbGUgdHlwZSB3aXRoIGV4dGVuc2lvbiA8dHQ+LnNjZ2k8L3R0PgotKGZvciBzZWN1cmUgQ0dJKSB3aGljaCB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGUgcG9wdWxhciA8dHQ+Y2dpd3JhcDwvdHQ+Ci1wcm9ncmFtLiBUaGUgcHJvYmxlbSBoZXJlIGlzIHRoYXQgZm9yIGluc3RhbmNlIHdlIHVzZSBhIEhvbW9nZW5lb3VzIFVSTCBMYXlvdXQKLShzZWUgYWJvdmUpIGEgZmlsZSBpbnNpZGUgdGhlIHVzZXIgaG9tZWRpcnMgaGFzIHRoZSBVUkwKLTx0dD4vdS91c2VyL2Zvby9iYXIuc2NnaTwvdHQ+LiBCdXQgPHR0PmNnaXdyYXA8L3R0PiBuZWVkcyB0aGUgVVJMIGluIHRoZSBmb3JtCi08dHQ+L351c2VyL2Zvby9iYXIuc2NnaS88L3R0Pi4gVGhlIGZvbGxvd2luZyBydWxlIHNvbHZlcyB0aGUgcHJvYmxlbToKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlUnVsZSBeL1t1Z2VdLzxiPihbXi9dKyk8L2I+L1wud3d3LyguKylcLnNjZ2koLiopIC4uLgotLi4uIC9pbnRlcm5hbC9jZ2kvdXNlci9jZ2l3cmFwL348Yj4kMTwvYj4vJDIuc2NnaSQzICBbTlMsPGI+VD1hcHBsaWNhdGlvbi94LWh0dHAtY2dpPC9iPl0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08UD4KLU9yIGFzc3VtZSB3ZSBoYXZlIHNvbWUgbW9yZSBuaWZ0eSBwcm9ncmFtczoKLTx0dD53d3dsb2c8L3R0PiAod2hpY2ggZGlzcGxheXMgdGhlIDx0dD5hY2Nlc3MubG9nPC90dD4gZm9yIGEgVVJMIHN1YnRyZWUgYW5kCi08dHQ+d3d3aWR4PC90dD4gKHdoaWNoIHJ1bnMgR2xpbXBzZSBvbiBhIFVSTCBzdWJ0cmVlKS4gV2UgaGF2ZSB0bwotcHJvdmlkZSB0aGUgVVJMIGFyZWEgdG8gdGhlc2UgcHJvZ3JhbXMgc28gdGhleSBrbm93IG9uIHdoaWNoIGFyZWEKLXRoZXkgaGF2ZSB0byBhY3Qgb24uIEJ1dCB1c3VhbGx5IHRoaXMgdWdseSwgYmVjYXVzZSB0aGV5IGFyZSBhbGwgdGhlCi10aW1lcyBzdGlsbCByZXF1ZXN0ZWQgZnJvbSB0aGF0IGFyZWFzLCBpLmUuIHR5cGljYWxseSB3ZSB3b3VsZCBydW4KLXRoZSA8dHQ+c3d3aWR4PC90dD4gcHJvZ3JhbSBmcm9tIHdpdGhpbiA8dHQ+L3UvdXNlci9mb28vPC90dD4gdmlhCi1oeXBlcmxpbmsgdG8KLQotPFA+PFBSRT4KLS9pbnRlcm5hbC9jZ2kvdXNlci9zd3dpZHg/aT0vdS91c2VyL2Zvby8KLTwvUFJFPjxQPgotCi13aGljaCBpcyB1Z2x5LiBCZWNhdXNlIHdlIGhhdmUgdG8gaGFyZC1jb2RlIDxiPmJvdGg8L2I+IHRoZSBsb2NhdGlvbiBvZiB0aGUKLWFyZWEgPGI+YW5kPC9iPiB0aGUgbG9jYXRpb24gb2YgdGhlIENHSSBpbnNpZGUgdGhlIGh5cGVybGluay4gV2hlbiB3ZSBoYXZlIHRvCi1yZW9yZ2FuaXNlIG9yIGFyZWEsIHdlIHNwZW5kIGEgbG90IG9mIHRpbWUgY2hhbmdpbmcgdGhlIHZhcmlvdXMgaHlwZXJsaW5rcy4KLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLVRoZSBzb2x1dGlvbiBoZXJlIGlzIHRvIHByb3ZpZGUgYSBzcGVjaWFsIG5ldyBVUkwgZm9ybWF0IHdoaWNoIGF1dG9tYXRpY2FsbHkKLWxlYWRzIHRvIHRoZSBwcm9wZXIgQ0dJIGludm9jYXRpb24uIFdlIGNvbmZpZ3VyZSB0aGUgZm9sbG93aW5nOgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVSdWxlICAgXi8oW3VnZV0pLyhbXi9dKykoLz8uKikvXCogIC9pbnRlcm5hbC9jZ2kvdXNlci93d3dpZHg/aT0vJDEvJDIkMy8KLVJld3JpdGVSdWxlICAgXi8oW3VnZV0pLyhbXi9dKykoLz8uKik6bG9nIC9pbnRlcm5hbC9jZ2kvdXNlci93d3dsb2c/Zj0vJDEvJDIkMwotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTxQPgotTm93IHRoZSBoeXBlcmxpbmsgdG8gc2VhcmNoIGF0IDx0dD4vdS91c2VyL2Zvby88L3R0PiByZWFkcyBvbmx5Ci0KLTxQPjxQUkU+Ci1ocmVmPSIqIgotPC9QUkU+PFA+Ci0KLXdoaWNoIGludGVybmFsbHkgZ2V0cyBhdXRvbWF0aWNhbGx5IHRyYW5zZm9ybWVkIHRvIAotCi08UD48UFJFPgotL2ludGVybmFsL2NnaS91c2VyL3d3d2lkeD9pPS91L3VzZXIvZm9vLwotPC9QUkU+PFA+Ci0KLVRoZSBzYW1lIGFwcHJvYWNoIGxlYWRzIHRvIGFuIGludm9jYXRpb24gZm9yIHRoZSBhY2Nlc3MgbG9nIENHSQotcHJvZ3JhbSB3aGVuIHRoZSBoeXBlcmxpbmsgPHR0Pjpsb2c8L3R0PiBnZXRzIHVzZWQuCi0KLTwvREw+Ci0KLTxQPgotPEgyPkZyb20gU3RhdGljIHRvIER5bmFtaWM8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotSG93IGNhbiB3ZSB0cmFuc2Zvcm0gYSBzdGF0aWMgcGFnZSA8dHQ+Zm9vLmh0bWw8L3R0PiBpbnRvIGEgZHluYW1pYyB2YXJpYW50Ci08dHQ+Zm9vLmNnaTwvdHQ+IGluIGEgc2VlbWxlc3Mgd2F5LCBpLmUuICB3aXRob3V0IG5vdGljZSBieSB0aGUgYnJvd3Nlci91c2VyLgotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotV2UganVzdCByZXdyaXRlIHRoZSBVUkwgdG8gdGhlIENHSS1zY3JpcHQgYW5kIGZvcmNlIHRoZSBjb3JyZWN0IE1JTUUtdHlwZSBzbwotaXQgZ2V0cyByZWFsbHkgcnVuIGFzIGEgQ0dJLXNjcmlwdC4gVGhpcyB3YXkgYSByZXF1ZXN0IHRvCi08dHQ+L35xdXV4L2Zvby5odG1sPC90dD4gaW50ZXJuYWxseSBsZWFkcyB0byB0aGUgaW52b2thdGlvbiBvZgotPHR0Pi9+cXV1eC9mb28uY2dpPC90dD4uCi0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUVuZ2luZSAgb24KLVJld3JpdGVCYXNlICAgIC9+cXV1eC8KLVJld3JpdGVSdWxlICAgIF5mb29cLjxiPmh0bWw8L2I+JCAgZm9vLjxiPmNnaTwvYj4gIFtUPTxiPmFwcGxpY2F0aW9uL3gtaHR0cGQtY2dpPC9iPl0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08L0RMPgotCi08UD4KLTxIMj5Pbi10aGUtZmx5IENvbnRlbnQtUmVnZW5lcmF0aW9uPC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLUhlcmUgY29tZXMgYSByZWFsbHkgZXNvdGVyaWMgZmVhdHVyZTogRHluYW1pY2FsbHkgZ2VuZXJhdGVkIGJ1dCBzdGF0aWNhbGx5Ci1zZXJ2ZWQgcGFnZXMsIGkuZS4gcGFnZXMgc2hvdWxkIGJlIGRlbGl2ZXJlZCBhcyBwdXIgc3RhdGljIHBhZ2VzIChyZWFkIGZyb20KLXRoZSBmaWxlc3lzdGVtIGFuZCBqdXN0IHBhc3NlZCB0aHJvdWdoKSwgYnV0IHRoZXkgaGF2ZSB0byBiZSBnZW5lcmF0ZWQKLWR5bmFtaWNhbGx5IGJ5IHRoZSB3ZWJzZXJ2ZXIgaWYgbWlzc2luZy4gVGhpcyB3YXkgeW91IGNhbiBoYXZlIENHSS1nZW5lcmF0ZWQKLXBhZ2VzIHdoaWNoIGFyZSBzdGF0aWNhbGx5IHVubGVzcyBvbmUgKG9yIGEgY3JvbmpvYikgcmVtb3ZlcyB0aGUgc3RhdGljCi1jb250ZW50cy4gVGhlbiB0aGUgY29udGVudHMgZ2V0cyByZWZyZXNoZWQuCi0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1UaGlzIGlzIGRvbmUgdmlhIHRoZSBmb2xsb3dpbmcgcnVsZXNldDoKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlQ29uZCAle1JFUVVFU1RfRklMRU5BTUV9ICAgPGI+IS1zPC9iPgotUmV3cml0ZUNvbmQgXnBhZ2VcLjxiPmh0bWw8L2I+JCAgICAgICAgICBwYWdlLjxiPmNnaTwvYj4gICBbVD1hcHBsaWNhdGlvbi94LWh0dHBkLWNnaSxMXQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTxQPgotSGVyZSBhIHJlcXVlc3QgdG8gPHR0PnBhZ2UuaHRtbDwvdHQ+IGxlYWRzIHRvIGEgaW50ZXJuYWwgcnVuIG9mIGEKLWNvcnJlc3BvbmRpbmcgPHR0PnBhZ2UuY2dpPC90dD4gaWYgPHR0PnBhZ2UuaHRtbDwvdHQ+IGlzIHN0aWxsIG1pc3Npbmcgb3IgaGFzCi1maWxlc2l6ZSBudWxsLiBUaGUgdHJpY2sgaGVyZSBpcyB0aGF0IDx0dD5wYWdlLmNnaTwvdHQ+IGlzIGEgdXN1YWwgQ0dJIHNjcmlwdAotd2hpY2ggKGFkZGl0aW9uYWxseSB0byBpdHMgU1RET1VUKSB3cml0ZXMgaXRzIG91dHB1dCB0byB0aGUgZmlsZQotPHR0PnBhZ2UuaHRtbDwvdHQ+LiBPbmNlIGl0IHdhcyBydW4sIHRoZSBzZXJ2ZXIgc2VuZHMgb3V0IHRoZSBkYXRhIG9mCi08dHQ+cGFnZS5odG1sPC90dD4uIFdoZW4gdGhlIHdlYm1hc3RlciB3YW50cyB0byBmb3JjZSBhIHJlZnJlc2ggdGhlIGNvbnRlbnRzLAotaGUganVzdCByZW1vdmVzIDx0dD5wYWdlLmh0bWw8L3R0PiAodXN1YWxseSBkb25lIGJ5IGEgY3JvbmpvYikuCi0KLTwvREw+Ci0KLTxQPgotPEgyPkRvY3VtZW50IFdpdGggQXV0b3JlZnJlc2g8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotV291bGRuJ3QgaXQgYmUgbmljZSB3aGlsZSBjcmVhdGluZyBhIGNvbXBsZXggd2VicGFnZSBpZiB0aGUgd2ViYnJvd3NlciB3b3VsZAotYXV0b21hdGljYWxseSByZWZyZXNoIHRoZSBwYWdlIGV2ZXJ5IHRpbWUgd2Ugd3JpdGUgYSBuZXcgdmVyc2lvbiBmcm9tIHdpdGhpbgotb3VyIGVkaXRvcj8gSW1wb3NzaWJsZT8KLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLU5vISBXZSBqdXN0IGNvbWJpbmUgdGhlIE1JTUUgbXVsdGlwYXJ0IGZlYXR1cmUsIHRoZSB3ZWJzZXJ2ZXIgTlBIIGZlYXR1cmUgYW5kCi10aGUgVVJMIG1hbmlwdWxhdGlvbiBwb3dlciBvZiBtb2RfcmV3cml0ZS4gRmlyc3QsIHdlIGVzdGFibGlzaCBhIG5ldyBVUkwKLWZlYXR1cmU6IEFkZGluZyBqdXN0IDx0dD46cmVmcmVzaDwvdHQ+IHRvIGFueSBVUkwgY2F1c2VzIHRoaXMgdG8gYmUgcmVmcmVzaGVkCi1ldmVyeSB0aW1lIGl0IGdldHMgdXBkYXRlZCBvbiB0aGUgZmlsZXN5c3RlbS4KLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlUnVsZSAgIF4oL1t1Z2VdL1teL10rLz8uKik6cmVmcmVzaCAgL2ludGVybmFsL2NnaS9hcGFjaGUvbnBoLXJlZnJlc2g/Zj0kMQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTxQPgotTm93IHdoZW4gd2UgcmVmZXJlbmNlIHRoZSBVUkwKLQotPFA+PFBSRT4KLS91L2Zvby9iYXIvcGFnZS5odG1sOnJlZnJlc2gKLTwvUFJFPjxQPgotCi10aGlzIGxlYWRzIHRvIHRoZSBpbnRlcm5hbCBpbnZvY2F0aW9uIG9mIHRoZSBVUkwKLQotPFA+PFBSRT4KLS9pbnRlcm5hbC9jZ2kvYXBhY2hlL25waC1yZWZyZXNoP2Y9L3UvZm9vL2Jhci9wYWdlLmh0bWwKLTwvUFJFPjxQPgotCi1UaGUgb25seSBtaXNzaW5nIHBhcnQgaXMgdGhlIE5QSC1DR0kgc2NyaXB0LiBBbHRob3VnaCBvbmUgd291bGQgdXN1YWxseSBzYXkKLSJsZWZ0IGFzIGFuIGV4ZXJjaXNlIHRvIHRoZSByZWFkZXIiIDstKSBJIHdpbGwgcHJvdmlkZSB0aGlzLCB0b28uCi0KLTxQPjxQUkU+Ci0jIS9zdy9iaW4vcGVybAotIyMKLSMjICBucGgtcmVmcmVzaCAtLSBOUEgvQ0dJIHNjcmlwdCBmb3IgYXV0byByZWZyZXNoaW5nIHBhZ2VzCi0jIyAgQ29weXJpZ2h0IChjKSAxOTk3IFJhbGYgUy4gRW5nZWxzY2hhbGwsIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotIyMKLSR8ID0gMTsKLQotIyAgIHNwbGl0IHRoZSBRVUVSWV9TVFJJTkcgdmFyaWFibGUKLUBwYWlycyA9IHNwbGl0KC8mYW1wOy8sICRFTlZ7J1FVRVJZX1NUUklORyd9KTsKLWZvcmVhY2ggJHBhaXIgKEBwYWlycykgewotICAgICgkbmFtZSwgJHZhbHVlKSA9IHNwbGl0KC89LywgJHBhaXIpOwotICAgICRuYW1lID1+IHRyL0EtWi9hLXovOwotICAgICRuYW1lID0gJ1FTXycgLiAkbmFtZTsKLSAgICAkdmFsdWUgPX4gcy8lKFthLWZBLUYwLTldW2EtZkEtRjAtOV0pL3BhY2soIkMiLCBoZXgoJDEpKS9lZzsKLSAgICBldmFsICJcJCRuYW1lID0gXCIkdmFsdWVcIiI7Ci19Ci0kUVNfcyA9IDEgaWYgKCRRU19zIGVxICcnKTsKLSRRU19uID0gMzYwMCBpZiAoJFFTX24gZXEgJycpOwotaWYgKCRRU19mIGVxICcnKSB7Ci0gICAgcHJpbnQgIkhUVFAvMS4wIDIwMCBPS1xuIjsKLSAgICBwcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcblxuIjsKLSAgICBwcmludCAiJmFtcDtsdDtiJmFtcDtndDtFUlJPUiZhbXA7bHQ7L2ImYW1wO2d0OzogTm8gZmlsZSBnaXZlblxuIjsKLSAgICBleGl0KDApOwotfQotaWYgKCEgLWYgJFFTX2YpIHsKLSAgICBwcmludCAiSFRUUC8xLjAgMjAwIE9LXG4iOwotICAgIHByaW50ICJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxuXG4iOwotICAgIHByaW50ICImYW1wO2x0O2ImYW1wO2d0O0VSUk9SJmFtcDtsdDsvYiZhbXA7Z3Q7OiBGaWxlICRRU19mIG5vdCBmb3VuZFxuIjsKLSAgICBleGl0KDApOwotfQotCi1zdWIgcHJpbnRfaHR0cF9oZWFkZXJzX211bHRpcGFydF9iZWdpbiB7Ci0gICAgcHJpbnQgIkhUVFAvMS4wIDIwMCBPS1xuIjsKLSAgICAkYm91bmQgPSAiVGhpc1JhbmRvbVN0cmluZzEyMzQ1IjsKLSAgICBwcmludCAiQ29udGVudC10eXBlOiBtdWx0aXBhcnQveC1taXhlZC1yZXBsYWNlO2JvdW5kYXJ5PSRib3VuZFxuIjsKLSAgICAmYW1wO3ByaW50X2h0dHBfaGVhZGVyc19tdWx0aXBhcnRfbmV4dDsKLX0KLQotc3ViIHByaW50X2h0dHBfaGVhZGVyc19tdWx0aXBhcnRfbmV4dCB7Ci0gICAgcHJpbnQgIlxuLS0kYm91bmRcbiI7Ci19Ci0KLXN1YiBwcmludF9odHRwX2hlYWRlcnNfbXVsdGlwYXJ0X2VuZCB7Ci0gICAgcHJpbnQgIlxuLS0kYm91bmQtLVxuIjsKLX0KLQotc3ViIGRpc3BsYXlodG1sIHsKLSAgICBsb2NhbCgkYnVmZmVyKSA9IEBfOwotICAgICRsZW4gPSBsZW5ndGgoJGJ1ZmZlcik7Ci0gICAgcHJpbnQgIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sXG4iOwotICAgIHByaW50ICJDb250ZW50LWxlbmd0aDogJGxlblxuXG4iOwotICAgIHByaW50ICRidWZmZXI7Ci19Ci0KLXN1YiByZWFkZmlsZSB7Ci0gICAgbG9jYWwoJGZpbGUpID0gQF87Ci0gICAgbG9jYWwoKkZQLCAkc2l6ZSwgJGJ1ZmZlciwgJGJ5dGVzKTsKLSAgICAoJHgsICR4LCAkeCwgJHgsICR4LCAkeCwgJHgsICRzaXplKSA9IHN0YXQoJGZpbGUpOwotICAgICRzaXplID0gc3ByaW50ZigiJWQiLCAkc2l6ZSk7Ci0gICAgb3BlbihGUCwgIiZhbXA7bHQ7JGZpbGUiKTsKLSAgICAkYnl0ZXMgPSBzeXNyZWFkKEZQLCAkYnVmZmVyLCAkc2l6ZSk7Ci0gICAgY2xvc2UoRlApOwotICAgIHJldHVybiAkYnVmZmVyOwotfQotCi0kYnVmZmVyID0gJmFtcDtyZWFkZmlsZSgkUVNfZik7Ci0mYW1wO3ByaW50X2h0dHBfaGVhZGVyc19tdWx0aXBhcnRfYmVnaW47Ci0mYW1wO2Rpc3BsYXlodG1sKCRidWZmZXIpOwotCi1zdWIgbXlzdGF0IHsKLSAgICBsb2NhbCgkZmlsZSkgPSAkX1swXTsKLSAgICBsb2NhbCgkdGltZSk7Ci0KLSAgICAoJHgsICR4LCAkeCwgJHgsICR4LCAkeCwgJHgsICR4LCAkeCwgJG10aW1lKSA9IHN0YXQoJGZpbGUpOwotICAgIHJldHVybiAkbXRpbWU7Ci19Ci0KLSRtdGltZUwgPSAmYW1wO215c3RhdCgkUVNfZik7Ci0kbXRpbWUgPSAkbXRpbWU7Ci1mb3IgKCRuID0gMDsgJG4gJmFtcDtsdDsgJFFTX247ICRuKyspIHsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICAkbXRpbWUgPSAmYW1wO215c3RhdCgkUVNfZik7Ci0gICAgICAgIGlmICgkbXRpbWUgbmUgJG10aW1lTCkgewotICAgICAgICAgICAgJG10aW1lTCA9ICRtdGltZTsKLSAgICAgICAgICAgIHNsZWVwKDIpOwotICAgICAgICAgICAgJGJ1ZmZlciA9ICZhbXA7cmVhZGZpbGUoJFFTX2YpOwotICAgICAgICAgICAgJmFtcDtwcmludF9odHRwX2hlYWRlcnNfbXVsdGlwYXJ0X25leHQ7Ci0gICAgICAgICAgICAmYW1wO2Rpc3BsYXlodG1sKCRidWZmZXIpOwotICAgICAgICAgICAgc2xlZXAoNSk7Ci0gICAgICAgICAgICAkbXRpbWVMID0gJmFtcDtteXN0YXQoJFFTX2YpOwotICAgICAgICAgICAgbGFzdDsKLSAgICAgICAgfQotICAgICAgICBzbGVlcCgkUVNfcyk7Ci0gICAgfQotfQotCi0mYW1wO3ByaW50X2h0dHBfaGVhZGVyc19tdWx0aXBhcnRfZW5kOwotCi1leGl0KDApOwotCi0jI0VPRiMjCi08L1BSRT4KLQotPC9ETD4KLQotPFA+Ci08SDI+TWFzcyBWaXJ0dWFsIEhvc3Rpbmc8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotVGhlIDx0dD4mbHQ7VmlydHVhbEhvc3QmZ3Q7PC90dD4gZmVhdHVyZSBvZiBBcGFjaGUgaXMgbmljZSBhbmQgd29ya3MgZ3JlYXQKLXdoZW4geW91IGp1c3QgaGF2ZSBhIGZldyBkb3plbnMgdmlydHVhbCBob3N0cy4gQnV0IHdoZW4geW91IGFyZSBhbiBJU1AgYW5kCi1oYXZlIGh1bmRyZWRzIG9mIHZpcnR1YWwgaG9zdHMgdG8gcHJvdmlkZSB0aGlzIGZlYXR1cmUgaXMgbm90IHRoZSBiZXN0IGNob2ljZS4KLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLVRvIHByb3ZpZGUgdGhpcyBmZWF0dXJlIHdlIG1hcCB0aGUgcmVtb3RlIHdlYnBhZ2Ugb3IgZXZlbiB0aGUgY29tcGxldGUgcmVtb3RlCi13ZWJhcmVhIHRvIG91ciBuYW1lc3BhY2UgYnkgdGhlIHVzZSBvZiB0aGUgPEk+UHJveHkgVGhyb3VnaHB1dDwvST4gZmVhdHVyZQotKGZsYWcgW1BdKToKLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci0jIwotIyMgIHZob3N0Lm1hcCAKLSMjIAotd3d3LnZob3N0MS5kb206ODAgIC9wYXRoL3RvL2RvY3Jvb3Qvdmhvc3QxCi13d3cudmhvc3QyLmRvbTo4MCAgL3BhdGgvdG8vZG9jcm9vdC92aG9zdDIKLSAgICAgOgotd3d3LnZob3N0Ti5kb206ODAgIC9wYXRoL3RvL2RvY3Jvb3Qvdmhvc3ROCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci0jIwotIyMgIGh0dHBkLmNvbmYKLSMjCi0gICAgOgotIyAgIHVzZSB0aGUgY2Fub25pY2FsIGhvc3RuYW1lIG9uIHJlZGlyZWN0cywgZXRjLgotVXNlQ2Fub25pY2FsTmFtZSBvbgotCi0gICAgOgotIyAgIGFkZCB0aGUgdmlydHVhbCBob3N0IGluIGZyb250IG9mIHRoZSBDTEYtZm9ybWF0Ci1DdXN0b21Mb2cgIC9wYXRoL3RvL2FjY2Vzc19sb2cgICIle1ZIT1NUfWUgJWggJWwgJXUgJXQgXCIlclwiICUmZ3Q7cyAlYiIKLSAgICA6Ci0KLSMgICBlbmFibGUgdGhlIHJld3JpdGluZyBlbmdpbmUgaW4gdGhlIG1haW4gc2VydmVyCi1SZXdyaXRlRW5naW5lIG9uCi0KLSMgICBkZWZpbmUgdHdvIG1hcHM6IG9uZSBmb3IgZml4aW5nIHRoZSBVUkwgYW5kIG9uZSB3aGljaCBkZWZpbmVzCi0jICAgdGhlIGF2YWlsYWJsZSB2aXJ0dWFsIGhvc3RzIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZwotIyAgIERvY3VtZW50Um9vdC4KLVJld3JpdGVNYXAgICAgbG93ZXJjYXNlICAgIGludDp0b2xvd2VyCi1SZXdyaXRlTWFwICAgIHZob3N0ICAgICAgICB0eHQ6L3BhdGgvdG8vdmhvc3QubWFwCi0KLSMgICBOb3cgZG8gdGhlIGFjdHVhbCB2aXJ0dWFsIGhvc3QgbWFwcGluZwotIyAgIHZpYSBhIGh1Z2UgYW5kIGNvbXBsaWNhdGVkIHNpbmdsZSBydWxlOgotIwotIyAgIDEuIG1ha2Ugc3VyZSB3ZSBkb24ndCBtYXAgZm9yIGNvbW1vbiBsb2NhdGlvbnMKLVJld3JpdGVDb25kICAgJXtSRVFVRVNUX1VSTH0gICFeL2NvbW1vbnVybDEvLioKLVJld3JpdGVDb25kICAgJXtSRVFVRVNUX1VSTH0gICFeL2NvbW1vbnVybDIvLioKLSAgICA6Ci1SZXdyaXRlQ29uZCAgICV7UkVRVUVTVF9VUkx9ICAhXi9jb21tb251cmxOLy4qCi0jCi0jICAgMi4gbWFrZSBzdXJlIHdlIGhhdmUgYSBIb3N0IGhlYWRlciwgYmVjYXVzZQotIyAgICAgIGN1cnJlbnRseSBvdXIgYXBwcm9hY2ggb25seSBzdXBwb3J0cyAKLSMgICAgICB2aXJ0dWFsIGhvc3RpbmcgdGhyb3VnaCB0aGlzIGhlYWRlcgotUmV3cml0ZUNvbmQgICAle0hUVFBfSE9TVH0gICFeJAotIwotIyAgIDMuIGxvd2VyY2FzZSB0aGUgaG9zdG5hbWUKLVJld3JpdGVDb25kICAgJHtsb3dlcmNhc2U6JXtIVFRQX0hPU1R9fE5PTkV9ICBeKC4rKSQKLSMKLSMgICA0LiBsb29rdXAgdGhpcyBob3N0bmFtZSBpbiB2aG9zdC5tYXAgYW5kCi0jICAgICAgcmVtZW1iZXIgaXQgb25seSB3aGVuIGl0IGlzIGEgcGF0aCAKLSMgICAgICAoYW5kIG5vdCAiTk9ORSIgZnJvbSBhYm92ZSkKLVJld3JpdGVDb25kICAgJHt2aG9zdDolMX0gIF4oLy4qKSQKLSMKLSMgICA1LiBmaW5hbGx5IHdlIGNhbiBtYXAgdGhlIFVSTCB0byBpdHMgZG9jcm9vdCBsb2NhdGlvbiAKLSMgICAgICBhbmQgcmVtZW1iZXIgdGhlIHZpcnR1YWwgaG9zdCBmb3IgbG9nZ2luZyBwdXBvc2VzCi1SZXdyaXRlUnVsZSAgIF4vKC4qKSQgICAlMS8kMSAgW0U9VkhPU1Q6JHtsb3dlcmNhc2U6JXtIVFRQX0hPU1R9fV0KLSAgICA6IAotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTwvREw+Ci0KLTxIMT5BY2Nlc3MgUmVzdHJpY3Rpb248L0gxPgotCi08UD4KLTxIMj5CbG9ja2luZyBvZiBSb2JvdHM8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotSG93IGNhbiB3ZSBibG9jayBhIHJlYWxseSBhbm5veWluZyByb2JvdCBmcm9tIHJldHJpZXZpbmcgcGFnZXMgb2YgYSBzcGVjaWZpYwotd2ViYXJlYT8gQSA8dHQ+L3JvYm90cy50eHQ8L3R0PiBmaWxlIGNvbnRhaW5pbmcgZW50cmllcyBvZiB0aGUgIlJvYm90Ci1FeGNsdXNpb24gUHJvdG9jb2wiIGlzIHR5cGljYWxseSBub3QgZW5vdWdoIHRvIGdldCByaWQgb2Ygc3VjaCBhIHJvYm90LgotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotV2UgdXNlIGEgcnVsZXNldCB3aGljaCBmb3JiaWRzIHRoZSBVUkxzIG9mIHRoZSB3ZWJhcmVhCi08dHQ+L35xdXV4L2Zvby9hcmMvPC90dD4gKHBlcmhhcHMgYSB2ZXJ5IGRlZXAgZGlyZWN0b3J5IGluZGV4ZWQgYXJlYSB3aGVyZSB0aGUKLXJvYm90IHRyYXZlcnNhbCB3b3VsZCBjcmVhdGUgYmlnIHNlcnZlciBsb2FkKS4gICBXZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHdlCi1mb3JiaWQgYWNjZXNzIG9ubHkgdG8gdGhlIHBhcnRpY3VsYXIgcm9ib3QsIGkuZS4ganVzdCBmb3JiaWRkaW5nIHRoZSBob3N0Ci13aGVyZSB0aGUgcm9ib3QgcnVucyBpcyBub3QgZW5vdWdoLiBUaGlzIHdvdWxkIGJsb2NrIHVzZXJzIGZyb20gdGhpcyBob3N0LAotdG9vLiBXZSBhY2NvbXBsaXNoIHRoaXMgYnkgYWxzbyBtYXRjaGluZyB0aGUgVXNlci1BZ2VudCBIVFRQIGhlYWRlcgotaW5mb3JtYXRpb24uCi0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUNvbmQgJXtIVFRQX1VTRVJfQUdFTlR9ICAgXjxiPk5hbWVPZkJhZFJvYm90PC9iPi4qICAgICAgCi1SZXdyaXRlQ29uZCAle1JFTU9URV9BRERSfSAgICAgICBePGI+MTIzXC40NVwuNjdcLls4LTldPC9iPiQKLVJld3JpdGVSdWxlIF48Yj4vfnF1dXgvZm9vL2FyYy88L2I+LisgICAtICAgWzxiPkY8L2I+XQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTwvREw+Ci0KLTxQPgotPEgyPkJsb2NrZWQgSW5saW5lLUltYWdlczwvSDI+Ci08UD4KLQotPERMPgotPERUPjxTVFJPTkc+RGVzY3JpcHRpb246PC9TVFJPTkc+Ci08REQ+Ci1Bc3N1bWUgd2UgaGF2ZSB1bmRlciBodHRwOi8vd3d3LnF1dXgtY29ycC5kZS9+cXV1eC8gc29tZSBwYWdlcyB3aXRoIGlubGluZWQKLUdJRiBncmFwaGljcy4gVGhlc2UgZ3JhcGhpY3MgYXJlIG5pY2UsIHNvIG90aGVycyBkaXJlY3RseSBpbmNvcnBvcmF0ZSB0aGVtIHZpYQotaHlwZXJsaW5rcyB0byB0aGVpciBwYWdlcy4gV2UgZG9uJ3QgbGlrZSB0aGlzIHByYWN0aWNlIGJlY2F1c2UgaXQgYWRkcyB1c2VsZXNzCi10cmFmZmljIHRvIG91ciBzZXJ2ZXIuCi0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1XaGlsZSB3ZSBjYW5ub3QgMTAwJSBwcm90ZWN0IHRoZSBpbWFnZXMgZnJvbSBpbmNsdXNpb24sIHdlCi1jYW4gYXQgbGVhc3QgcmVzdHJpY3QgdGhlIGNhc2VzIHdoZXJlIHRoZSBicm93c2VyIHNlbmRzCi1hIEhUVFAgUmVmZXJlciBoZWFkZXIuCi0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUNvbmQgJXtIVFRQX1JFRkVSRVJ9IDxiPiFeJDwvYj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1SZXdyaXRlQ29uZCAle0hUVFBfUkVGRVJFUn0gIV5odHRwOi8vd3d3LnF1dXgtY29ycC5kZS9+cXV1eC8uKiQgW05DXQotUmV3cml0ZVJ1bGUgPGI+LipcLmdpZiQ8L2I+ICAgICAgICAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ZdCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci1SZXdyaXRlQ29uZCAle0hUVFBfUkVGRVJFUn0gICAgICAgICAhXiQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1SZXdyaXRlQ29uZCAle0hUVFBfUkVGRVJFUn0gICAgICAgICAhLiovZm9vLXdpdGgtZ2lmXC5odG1sJAotUmV3cml0ZVJ1bGUgPGI+XmlubGluZWQtaW4tZm9vXC5naWYkPC9iPiAgIC0gICAgICAgICAgICAgICAgICAgICAgICBbRl0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08L0RMPgotCi08UD4KLTxIMj5Ib3N0IERlbnk8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotSG93IGNhbiB3ZSBmb3JiaWQgYSBsaXN0IG9mIGV4dGVybmFsbHkgY29uZmlndXJlZCBob3N0cyBmcm9tIHVzaW5nIG91ciBzZXJ2ZXI/Ci0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci0KLUZvciBBcGFjaGUgJmd0Oz0gMS4zYjY6Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUVuZ2luZSBvbgotUmV3cml0ZU1hcCAgICBob3N0cy1kZW55ICB0eHQ6L3BhdGgvdG8vaG9zdHMuZGVueQotUmV3cml0ZUNvbmQgICAke2hvc3RzLWRlbnk6JXtSRU1PVEVfSE9TVH18Tk9ULUZPVU5EfSAhPU5PVC1GT1VORCBbT1JdCi1SZXdyaXRlQ29uZCAgICR7aG9zdHMtZGVueTole1JFTU9URV9BRERSfXxOT1QtRk9VTkR9ICE9Tk9ULUZPVU5ECi1SZXdyaXRlUnVsZSAgIF4vLiogIC0gIFtGXQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+PFA+Ci0KLUZvciBBcGFjaGUgJmx0Oz0gMS4zYjY6Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUVuZ2luZSBvbgotUmV3cml0ZU1hcCAgICBob3N0cy1kZW55ICB0eHQ6L3BhdGgvdG8vaG9zdHMuZGVueQotUmV3cml0ZVJ1bGUgICBeLyguKikkICR7aG9zdHMtZGVueTole1JFTU9URV9IT1NUfXxOT1QtRk9VTkR9LyQxCi1SZXdyaXRlUnVsZSAgICFeTk9ULUZPVU5ELy4qIC0gW0ZdCi1SZXdyaXRlUnVsZSAgIF5OT1QtRk9VTkQvKC4qKSQgJHtob3N0cy1kZW55OiV7UkVNT1RFX0FERFJ9fE5PVC1GT1VORH0vJDEgCi1SZXdyaXRlUnVsZSAgICFeTk9ULUZPVU5ELy4qIC0gW0ZdCi1SZXdyaXRlUnVsZSAgIF5OT1QtRk9VTkQvKC4qKSQgLyQxCi08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPFA+PFRBQkxFIEJHQ09MT1I9IiNFMEU1RjUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSI1Ij48VFI+PFREPjxQUkU+Ci0jIwotIyMgIGhvc3RzLmRlbnkgCi0jIwotIyMgIEFUVEVOVElPTiEgVGhpcyBpcyBhIG1hcCwgbm90IGEgbGlzdCwgZXZlbiB3aGVuIHdlIHRyZWF0IGl0IGFzIHN1Y2guCi0jIyAgICAgICAgICAgICBtb2RfcmV3cml0ZSBwYXJzZXMgaXQgZm9yIGtleS92YWx1ZSBwYWlycywgc28gYXQgbGVhc3QgYQotIyMgICAgICAgICAgICAgZHVtbXkgdmFsdWUgIi0iIG11c3QgYmUgcHJlc2VudCBmb3IgZWFjaCBlbnRyeS4KLSMjCi0KLTE5My4xMDIuMTgwLjQxIC0KLWJzZHRpMS5zZG0uZGUgIC0KLTE5Mi43Ni4xNjIuNDAgIC0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08L0RMPgotCi08UD4KLTxIMj5Qcm94eSBEZW55PC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLUhvdyBjYW4gd2UgZm9yYmlkIGEgY2VydGFpbiBob3N0IG9yIGV2ZW4gYSB1c2VyIG9mIGEgc3BlY2lhbCBob3N0IGZyb20gdXNpbmcKLXRoZSBBcGFjaGUgcHJveHk/Ci0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1XZSBmaXJzdCBoYXZlIHRvIG1ha2Ugc3VyZSBtb2RfcmV3cml0ZSBpcyBiZWxvdyghKSBtb2RfcHJveHkgaW4gdGhlCi08dHQ+Q29uZmlndXJhdGlvbjwvdHQ+IGZpbGUgd2hlbiBjb21waWxpbmcgdGhlIEFwYWNoZSB3ZWJzZXJ2ZXIuICBUaGlzIHdheSBpdAotZ2V0cyBjYWxsZWQgX2JlZm9yZV8gbW9kX3Byb3h5LiBUaGVuIHdlIGNvbmZpZ3VyZSB0aGUgZm9sbG93aW5nIGZvciBhCi1ob3N0LWRlcGVuZGVuZCBkZW55Li4uCi0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUNvbmQgJXtSRU1PVEVfSE9TVH0gPGI+XmJhZGhvc3RcLm15ZG9tYWluXC5jb20kPC9iPiAKLVJld3JpdGVSdWxlICFeaHR0cDovL1teLy5dXC5teWRvbWFpbi5jb20uKiAgLSBbRl0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08UD4uLi5hbmQgdGhpcyBvbmUgZm9yIGEgdXNlckBob3N0LWRlcGVuZGVuZCBkZW55OgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVDb25kICV7UkVNT1RFX0lERU5UfUAle1JFTU9URV9IT1NUfSAgPGI+XmJhZGd1eUBiYWRob3N0XC5teWRvbWFpblwuY29tJDwvYj4KLVJld3JpdGVSdWxlICFeaHR0cDovL1teLy5dXC5teWRvbWFpbi5jb20uKiAgLSBbRl0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08L0RMPgotCi08UD4KLTxIMj5TcGVjaWFsIEF1dGhlbnRpY2F0aW9uIFZhcmlhbnQ8L0gyPgotPFA+Ci0KLTxETD4KLTxEVD48U1RST05HPkRlc2NyaXB0aW9uOjwvU1RST05HPgotPEREPgotU29tZXRpbWVzIGEgdmVyeSBzcGVjaWFsIGF1dGhlbnRpY2F0aW9uIGlzIG5lZWRlZCwgZm9yIGluc3RhbmNlIGEKLWF1dGhlbnRpY2F0aW9uIHdoaWNoIGNoZWNrcyBmb3IgYSBzZXQgb2YgZXhwbGljaXRseSBjb25maWd1cmVkIHVzZXJzLiBPbmx5Ci10aGVzZSBzaG91bGQgcmVjZWl2ZSBhY2Nlc3MgYW5kIHdpdGhvdXQgZXhwbGljaXQgcHJvbXB0aW5nICh3aGljaCB3b3VsZCBvY2N1cgotd2hlbiB1c2luZyB0aGUgQmFzaWMgQXV0aCB2aWEgbW9kX2FjY2VzcykuCi0KLTxQPgotPERUPjxTVFJPTkc+U29sdXRpb246PC9TVFJPTkc+Ci08REQ+Ci1XZSB1c2UgYSBsaXN0IG9mIHJld3JpdGUgY29uZGl0aW9ucyB0byBleGNsdWRlIGFsbCBleGNlcHQgb3VyIGZyaWVuZHM6Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUNvbmQgJXtSRU1PVEVfSURFTlR9QCV7UkVNT1RFX0hPU1R9IDxiPiFeZnJpZW5kMUBjbGllbnQxLnF1dXgtY29ycFwuY29tJDwvYj4gCi1SZXdyaXRlQ29uZCAle1JFTU9URV9JREVOVH1AJXtSRU1PVEVfSE9TVH0gPGI+IV5mcmllbmQyPC9iPkBjbGllbnQyLnF1dXgtY29ycFwuY29tJCAKLVJld3JpdGVDb25kICV7UkVNT1RFX0lERU5UfUAle1JFTU9URV9IT1NUfSA8Yj4hXmZyaWVuZDM8L2I+QGNsaWVudDMucXV1eC1jb3JwXC5jb20kIAotUmV3cml0ZVJ1bGUgXi9+cXV1eC9vbmx5LWZvci1mcmllbmRzLyAgICAgIC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRl0KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08L0RMPgotCi08UD4KLTxIMj5SZWZlcmVyLWJhc2VkIERlZmxlY3RvcjwvSDI+Ci08UD4KLQotPERMPgotPERUPjxTVFJPTkc+RGVzY3JpcHRpb246PC9TVFJPTkc+Ci08REQ+Ci1Ib3cgY2FuIHdlIHByb2dyYW0gYSBmbGV4aWJsZSBVUkwgRGVmbGVjdG9yIHdoaWNoIGFjdHMgb24gdGhlICJSZWZlcmVyIiBIVFRQCi1oZWFkZXIgYW5kIGNhbiBiZSBjb25maWd1cmVkIHdpdGggYXMgbWFueSByZWZlcnJpbmcgcGFnZXMgYXMgd2UgbGlrZT8KLQotPFA+Ci08RFQ+PFNUUk9ORz5Tb2x1dGlvbjo8L1NUUk9ORz4KLTxERD4KLVVzZSB0aGUgZm9sbG93aW5nIHJlYWxseSB0cmlja3kgcnVsZXNldC4uLgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLVJld3JpdGVNYXAgIGRlZmxlY3RvciB0eHQ6L3BhdGgvdG8vZGVmbGVjdG9yLm1hcAotCi1SZXdyaXRlQ29uZCAle0hUVFBfUkVGRVJFUn0gIT0iIgotUmV3cml0ZUNvbmQgJHtkZWZsZWN0b3I6JXtIVFRQX1JFRkVSRVJ9fSBeLSQKLVJld3JpdGVSdWxlIF4uKiAle0hUVFBfUkVGRVJFUn0gW1IsTF0KLQotUmV3cml0ZUNvbmQgJXtIVFRQX1JFRkVSRVJ9ICE9IiIKLVJld3JpdGVDb25kICR7ZGVmbGVjdG9yOiV7SFRUUF9SRUZFUkVSfXxOT1QtRk9VTkR9ICE9Tk9ULUZPVU5ECi1SZXdyaXRlUnVsZSBeLiogJHtkZWZsZWN0b3I6JXtIVFRQX1JFRkVSRVJ9fSBbUixMXQotPC9QUkU+PC9URD48L1RSPjwvVEFCTEU+Ci0KLTxQPi4uLgotaW4gY29uanVuY3Rpb24gd2l0aCBhIGNvcnJlc3BvbmRpbmcgcmV3cml0ZSBtYXA6Ci0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotIyMKLSMjICBkZWZsZWN0b3IubWFwCi0jIwotCi1odHRwOi8vd3d3LmJhZGd1eXMuY29tL2JhZC9pbmRleC5odG1sICAgIC0KLWh0dHA6Ly93d3cuYmFkZ3V5cy5jb20vYmFkL2luZGV4Mi5odG1sICAgLQotaHR0cDovL3d3dy5iYWRndXlzLmNvbS9iYWQvaW5kZXgzLmh0bWwgICBodHRwOi8vc29tZXdoZXJlLmNvbS8KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08UD4KLVRoaXMgYXV0b21hdGljYWxseSByZWRpcmVjdHMgdGhlIHJlcXVlc3QgYmFjayB0byB0aGUgcmVmZXJyaW5nIHBhZ2UgKHdoZW4gIi0iCi1pcyB1c2VkIGFzIHRoZSB2YWx1ZSBpbiB0aGUgbWFwKSBvciB0byBhIHNwZWNpZmljIFVSTCAod2hlbiBhbiBVUkwgaXMKLXNwZWNpZmllZCBpbiB0aGUgbWFwIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQpLgotCi08L0RMPgotCi08SDE+T3RoZXI8L0gxPgotCi08UD4KLTxIMj5FeHRlcm5hbCBSZXdyaXRpbmcgRW5naW5lPC9IMj4KLTxQPgotCi08REw+Ci08RFQ+PFNUUk9ORz5EZXNjcmlwdGlvbjo8L1NUUk9ORz4KLTxERD4KLUEgRkFROiBIb3cgY2FuIHdlIHNvbHZlIHRoZSBGT08vQkFSL1FVVVgvZXRjLiBwcm9ibGVtPyBUaGVyZSBzZWVtcyBubyBzb2x1dGlvbgotYnkgdGhlIHVzZSBvZiBtb2RfcmV3cml0ZS4uLgotCi08UD4KLTxEVD48U1RST05HPlNvbHV0aW9uOjwvU1RST05HPgotPEREPgotVXNlIGFuIGV4dGVybmFsIHJld3JpdGUgbWFwLCBpLmUuIGEgcHJvZ3JhbSB3aGljaCBhY3RzIGxpa2UgYSByZXdyaXRlIG1hcC4gIEl0Ci1pcyBydW4gb25jZSBvbiBzdGFydHVwIG9mIEFwYWNoZSByZWNlaXZlcyB0aGUgcmVxdWVzdGVkIFVSTHMgb24gU1RESU4gYW5kIGhhcwotdG8gcHV0IHRoZSByZXN1bHRpbmcgKHVzdWFsbHkgcmV3cml0dGVuKSBVUkwgb24gU1RET1VUIChzYW1lIG9yZGVyISkuCi0KLTxQPjxUQUJMRSBCR0NPTE9SPSIjRTBFNUY1IiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iNSI+PFRSPjxURD48UFJFPgotUmV3cml0ZUVuZ2luZSBvbgotUmV3cml0ZU1hcCAgICBxdXV4LW1hcCAgICAgICA8Yj5wcmc6PC9iPi9wYXRoL3RvL21hcC5xdXV4LnBsCi1SZXdyaXRlUnVsZSAgIF4vfnF1dXgvKC4qKSQgIC9+cXV1eC88Yj4ke3F1dXgtbWFwOiQxfTwvYj4KLTwvUFJFPjwvVEQ+PC9UUj48L1RBQkxFPgotCi08UD48VEFCTEUgQkdDT0xPUj0iI0UwRTVGNSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjUiPjxUUj48VEQ+PFBSRT4KLSMhL3BhdGgvdG8vcGVybAotCi0jICAgZGlzYWJsZSBidWZmZXJlZCBJL08gd2hpY2ggd291bGQgbGVhZCAKLSMgICB0byBkZWFkbG9vcHMgZm9yIHRoZSBBcGFjaGUgc2VydmVyCi0kfCA9IDE7Ci0KLSMgICByZWFkIFVSTHMgb25lIHBlciBsaW5lIGZyb20gc3RkaW4gYW5kCi0jICAgZ2VuZXJhdGUgc3Vic3RpdHV0aW9uIFVSTCBvbiBzdGRvdXQKLXdoaWxlICgmbHQ7Jmd0OykgewotICAgIHN8XmZvby98YmFyL3w7Ci0gICAgcHJpbnQgJF87Ci19Ci08L1BSRT48L1REPjwvVFI+PC9UQUJMRT4KLQotPFA+Ci1UaGlzIGlzIGEgZGVtb25zdHJhdGlvbi1vbmx5IGV4YW1wbGUgYW5kIGp1c3QgcmV3cml0ZXMgYWxsIFVSTHMKLTx0dD4vfnF1dXgvZm9vLy4uLjwvdHQ+IHRvIDx0dD4vfnF1dXgvYmFyLy4uLjwvdHQ+LiBBY3R1YWxseSB5b3UgY2FuIHByb2dyYW0KLXdoYXRldmVyIHlvdSBsaWtlLiBCdXQgbm90aWNlIHRoYXQgd2hpbGUgc3VjaCBtYXBzIGNhbiBiZSA8Yj51c2VkPC9iPiBhbHNvIGJ5Ci1hbiBhdmVyYWdlIHVzZXIsIG9ubHkgdGhlIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGNhbiA8Yj5kZWZpbmU8L2I+IGl0LgotCi08L0RMPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CTE9DS1FVT1RFPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbWlzYy9zZWN1cml0eV90aXBzLmh0bWwgYi9kb2NzL21hbnVhbC9taXNjL3NlY3VyaXR5X3RpcHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA5NjFkOS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9taXNjL3NlY3VyaXR5X3RpcHMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSBIVFRQIFNlcnZlcjogU2VjdXJpdHkgVGlwczwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPlNlY3VyaXR5IFRpcHMgZm9yIFNlcnZlciBDb25maWd1cmF0aW9uPC9IMT4KLQotPEhSPgotCi08UD5Tb21lIGhpbnRzIGFuZCB0aXBzIG9uIHNlY3VyaXR5IGlzc3VlcyBpbiBzZXR0aW5nIHVwIGEgd2ViIHNlcnZlci4gU29tZSBvZgotdGhlIHN1Z2dlc3Rpb25zIHdpbGwgYmUgZ2VuZXJhbCwgb3RoZXJzIHNwZWNpZmljIHRvIEFwYWNoZS4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0ic2VydmVycm9vdCI+UGVybWlzc2lvbnMgb24gU2VydmVyUm9vdCBEaXJlY3RvcmllczwvQT48L0gyPgotPFA+SW4gdHlwaWNhbCBvcGVyYXRpb24sIEFwYWNoZSBpcyBzdGFydGVkIGJ5IHRoZSByb290Ci11c2VyLCBhbmQgaXQgc3dpdGNoZXMgdG8gdGhlIHVzZXIgZGVmaW5lZCBieSB0aGUgPEEKLUhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjdXNlciI+PFNUUk9ORz5Vc2VyPC9TVFJPTkc+PC9BPiBkaXJlY3RpdmUgdG8gc2VydmUgaGl0cy4KLUFzIGlzIHRoZSBjYXNlIHdpdGggYW55IGNvbW1hbmQgdGhhdCByb290IGV4ZWN1dGVzLCB5b3UgbXVzdCB0YWtlIGNhcmUKLXRoYXQgaXQgaXMgcHJvdGVjdGVkIGZyb20gbW9kaWZpY2F0aW9uIGJ5IG5vbi1yb290IHVzZXJzLiAgTm90IG9ubHkKLW11c3QgdGhlIGZpbGVzIHRoZW1zZWx2ZXMgYmUgd3JpdGVhYmxlIG9ubHkgYnkgcm9vdCwgYnV0IHNvIG11c3QgdGhlCi1kaXJlY3RvcmllcywgYW5kIHBhcmVudHMgb2YgYWxsIGRpcmVjdG9yaWVzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQotY2hvb3NlIHRvIHBsYWNlIFNlcnZlclJvb3QgaW4gPENPREU+L3Vzci9sb2NhbC9hcGFjaGU8L0NPREU+IHRoZW4gaXQgaXMKLXN1Z2dlc3RlZCB0aGF0IHlvdSBjcmVhdGUgdGhhdCBkaXJlY3RvcnkgYXMgcm9vdCwgd2l0aCBjb21tYW5kcwotbGlrZSB0aGVzZToKLQotPEJMT0NLUVVPVEU+PFBSRT4KLSAgICBta2RpciAvdXNyL2xvY2FsL2FwYWNoZQotICAgIGNkIC91c3IvbG9jYWwvYXBhY2hlCi0gICAgbWtkaXIgYmluIGNvbmYgbG9ncwotICAgIGNob3duIDAgLiBiaW4gY29uZiBsb2dzCi0gICAgY2hncnAgMCAuIGJpbiBjb25mIGxvZ3MKLSAgICBjaG1vZCA3NTUgLiBiaW4gY29uZiBsb2dzCi08L1BSRT48L0JMT0NLUVVPVEU+Ci0KLUl0IGlzIGFzc3VtZWQgdGhhdCAvLCAvdXNyLCBhbmQgL3Vzci9sb2NhbCBhcmUgb25seSBtb2RpZmlhYmxlIGJ5IHJvb3QuCi1XaGVuIHlvdSBpbnN0YWxsIHRoZSBodHRwZCBleGVjdXRhYmxlLCB5b3Ugc2hvdWxkIGVuc3VyZSB0aGF0IGl0IGlzCi1zaW1pbGFybHkgcHJvdGVjdGVkOgotCi08QkxPQ0tRVU9URT48UFJFPgotICAgIGNwIGh0dHBkIC91c3IvbG9jYWwvYXBhY2hlL2JpbgotICAgIGNob3duIDAgL3Vzci9sb2NhbC9hcGFjaGUvYmluL2h0dHBkCi0gICAgY2hncnAgMCAvdXNyL2xvY2FsL2FwYWNoZS9iaW4vaHR0cGQKLSAgICBjaG1vZCA1MTEgL3Vzci9sb2NhbC9hcGFjaGUvYmluL2h0dHBkCi08L1BSRT48L0JMT0NLUVVPVEU+Ci0KLTxQPllvdSBjYW4gY3JlYXRlIGFuIGh0ZG9jcyBzdWJkaXJlY3Rvcnkgd2hpY2ggaXMgbW9kaWZpYWJsZSBieSBvdGhlcgotdXNlcnMgLS0gc2luY2Ugcm9vdCBuZXZlciBleGVjdXRlcyBhbnkgZmlsZXMgb3V0IG9mIHRoZXJlLCBhbmQgc2hvdWxkbid0Ci1iZSBjcmVhdGluZyBmaWxlcyBpbiB0aGVyZS4KLQotPFA+SWYgeW91IGFsbG93IG5vbi1yb290IHVzZXJzIHRvIG1vZGlmeSBhbnkgZmlsZXMgdGhhdCByb290IGVpdGhlcgotZXhlY3V0ZXMgb3Igd3JpdGVzIG9uIHRoZW4geW91IG9wZW4geW91ciBzeXN0ZW0gdG8gcm9vdCBjb21wcm9taXNlcy4KLUZvciBleGFtcGxlLCBzb21lb25lIGNvdWxkIHJlcGxhY2UgdGhlIGh0dHBkIGJpbmFyeSBzbyB0aGF0IHRoZSBuZXh0Ci10aW1lIHlvdSBzdGFydCBpdCwgaXQgd2lsbCBleGVjdXRlIHNvbWUgYXJiaXRyYXJ5IGNvZGUuICBJZiB0aGUgbG9ncwotZGlyZWN0b3J5IGlzIHdyaXRlYWJsZSAoYnkgYSBub24tcm9vdCB1c2VyKSwgc29tZW9uZQotY291bGQgcmVwbGFjZSBhIGxvZyBmaWxlIHdpdGggYSBzeW1saW5rIHRvIHNvbWUgb3RoZXIgc3lzdGVtIGZpbGUsCi1hbmQgdGhlbiByb290IG1pZ2h0IG92ZXJ3cml0ZSB0aGF0IGZpbGUgd2l0aCBhcmJpdHJhcnkgZGF0YS4gIElmIHRoZQotbG9nIGZpbGVzIHRoZW1zZWx2ZXMgYXJlIHdyaXRlYWJsZSAoYnkgYSBub24tcm9vdCB1c2VyKSwgdGhlbiBzb21lb25lCi1tYXkgYmUgYWJsZSB0byBvdmVyd3JpdGUgdGhlIGxvZyBpdHNlbGYgd2l0aCBib2d1cyBkYXRhLgotPFA+Ci08SFI+Ci08SDI+U2VydmVyIFNpZGUgSW5jbHVkZXM8L0gyPgotPFA+U2VydmVyIHNpZGUgaW5jbHVkZXMgKFNTSSkgY2FuIGJlIGNvbmZpZ3VyZWQgc28gdGhhdCB1c2VycyBjYW4gZXhlY3V0ZQotYXJiaXRyYXJ5IHByb2dyYW1zIG9uIHRoZSBzZXJ2ZXIuIFRoYXQgdGhvdWdodCBhbG9uZSBzaG91bGQgc2VuZCBhIHNoaXZlcgotZG93biB0aGUgc3BpbmUgb2YgYW55IHN5cy1hZG1pbi48UD4KLQotT25lIHNvbHV0aW9uIGlzIHRvIGRpc2FibGUgdGhhdCBwYXJ0IG9mIFNTSS4gVG8gZG8gdGhhdCB5b3UgdXNlIHRoZQotSW5jbHVkZXNOT0VYRUMgb3B0aW9uIHRvIHRoZSA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI29wdGlvbnMiPk9wdGlvbnM8L0E+Ci1kaXJlY3RpdmUuPFA+Ci0KLTxIUj4KLQotPEgyPk5vbiBTY3JpcHQgQWxpYXNlZCBDR0k8L0gyPgotPFA+QWxsb3dpbmcgdXNlcnMgdG8gZXhlY3V0ZSA8U1RST05HPkNHSTwvU1RST05HPiBzY3JpcHRzIGluIGFueSBkaXJlY3RvcnkKLXNob3VsZCBvbmx5Ci1iZSBjb25zaWRlcmVkIGlmOwotPE9MPgotIDxMST5Zb3UgdHJ1c3QgeW91ciB1c2VycyBub3QgdG8gd3JpdGUgc2NyaXB0cyB3aGljaCB3aWxsIGRlbGliZXJhdGVseSBvcgotYWNjaWRlbnRhbGx5IGV4cG9zZSB5b3VyIHN5c3RlbSB0byBhbiBhdHRhY2suCi0gPExJPllvdSBjb25zaWRlciBzZWN1cml0eSBhdCB5b3VyIHNpdGUgdG8gYmUgc28gZmVlYmxlIGluIG90aGVyIGFyZWFzLCBhcyB0bwotbWFrZSBvbmUgbW9yZSBwb3RlbnRpYWwgaG9sZSBpcnJlbGV2YW50LgotIDxMST5Zb3UgaGF2ZSBubyB1c2VycywgYW5kIG5vYm9keSBldmVyIHZpc2l0cyB5b3VyIHNlcnZlci4KLTwvT0w+PFA+Ci08SFI+Ci0KLTxIMj5TY3JpcHQgQWxpYXMnZWQgQ0dJPC9IMj4KLTxQPkxpbWl0aW5nIDxTVFJPTkc+Q0dJPC9TVFJPTkc+IHRvIHNwZWNpYWwgZGlyZWN0b3JpZXMgZ2l2ZXMgdGhlIGFkbWluCi1jb250cm9sIG92ZXIKLXdoYXQgZ29lcyBpbnRvIHRob3NlIGRpcmVjdG9yaWVzLiBUaGlzIGlzIGluZXZpdGFibHkgbW9yZSBzZWN1cmUgdGhhbgotbm9uIHNjcmlwdCBhbGlhc2VkIENHSSwgYnV0IDxTVFJPTkc+b25seSBpZiB1c2VycyB3aXRoIHdyaXRlIGFjY2VzcyB0byB0aGUKLWRpcmVjdG9yaWVzIGFyZSB0cnVzdGVkPC9TVFJPTkc+IG9yIHRoZSBhZG1pbiBpcyB3aWxsaW5nIHRvIHRlc3QgZWFjaCBuZXcgQ0dJCi1zY3JpcHQvcHJvZ3JhbSBmb3IgcG90ZW50aWFsIHNlY3VyaXR5IGhvbGVzLjxQPgotCi1Nb3N0IHNpdGVzIGNob29zZSB0aGlzIG9wdGlvbiBvdmVyIHRoZSBub24gc2NyaXB0IGFsaWFzZWQgQ0dJIGFwcHJvYWNoLjxQPgotCi08SFI+Ci08SDI+Q0dJIGluIGdlbmVyYWw8L0gyPgotPFA+QWx3YXlzIHJlbWVtYmVyIHRoYXQgeW91IG11c3QgdHJ1c3QgdGhlIHdyaXRlcnMgb2YgdGhlIENHSSBzY3JpcHQvcHJvZ3JhbXMKLW9yIHlvdXIgYWJpbGl0eSB0byBzcG90IHBvdGVudGlhbCBzZWN1cml0eSBob2xlcyBpbiBDR0ksIHdoZXRoZXIgdGhleSB3ZXJlCi1kZWxpYmVyYXRlIG9yIGFjY2lkZW50YWwuPFA+Ci0KLUFsbCB0aGUgQ0dJIHNjcmlwdHMgd2lsbCBydW4gYXMgdGhlIHNhbWUgdXNlciwgc28gdGhleSBoYXZlIHBvdGVudGlhbCB0bwotY29uZmxpY3QgKGFjY2lkZW50YWxseSBvciBkZWxpYmVyYXRlbHkpIHdpdGggb3RoZXIgc2NyaXB0cyA8RU0+ZS5nLjwvRU0+Ci1Vc2VyIEEgaGF0ZXMgVXNlciBCLCBzbyBoZSB3cml0ZXMgYSBzY3JpcHQgdG8gdHJhc2ggVXNlciBCJ3MgQ0dJCi1kYXRhYmFzZS4gIE9uZSBwcm9ncmFtIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFsbG93IHNjcmlwdHMgdG8gcnVuCi1hcyBkaWZmZXJlbnQgdXNlcnMgaXMgPEEgSFJFRj0iLi4vc3VleGVjLmh0bWwiPnN1RVhFQzwvQT4gd2hpY2ggaXMKLWluY2x1ZGVkIHdpdGggQXBhY2hlIGFzIG9mIDEuMiBhbmQgaXMgY2FsbGVkIGZyb20gc3BlY2lhbCBob29rcyBpbgotdGhlIEFwYWNoZSBzZXJ2ZXIgY29kZS4gIEFub3RoZXIgcG9wdWxhciB3YXkgb2YgZG9pbmcgdGhpcyBpcyB3aXRoCi08QSBIUkVGPSJodHRwOi8vd3d3Y2dpLnVtci5lZHUvfmNnaXdyYXAvIj5DR0lXcmFwPC9BPi4gIDxQPgotCi08SFI+Ci0KLQotPEgyPlN0b3BwaW5nIHVzZXJzIG92ZXJyaWRpbmcgc3lzdGVtIHdpZGUgc2V0dGluZ3MuLi48L0gyPgotPFA+VG8gcnVuIGEgcmVhbGx5IHRpZ2h0IHNoaXAsIHlvdSdsbCB3YW50IHRvIHN0b3AgdXNlcnMgZnJvbSBzZXR0aW5nCi11cCA8Q09ERT4uaHRhY2Nlc3M8L0NPREU+IGZpbGVzIHdoaWNoIGNhbiBvdmVycmlkZSBzZWN1cml0eSBmZWF0dXJlcwoteW91J3ZlIGNvbmZpZ3VyZWQuIEhlcmUncyBvbmUgd2F5IHRvIGRvIGl0Li4uPFA+Ci0KLUluIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlLCBwdXQKLTxCTE9DS1FVT1RFPjxDT0RFPgotJmx0O0RpcmVjdG9yeSAvJmd0OyA8QlI+Ci1BbGxvd092ZXJyaWRlIE5vbmUgPEJSPgotT3B0aW9ucyBOb25lIDxCUj4KLWFsbG93IGZyb20gYWxsIDxCUj4KLSZsdDsvRGlyZWN0b3J5Jmd0OyA8QlI+Ci08L0NPREU+PC9CTE9DS1FVT1RFPgotCi1UaGVuIHNldHVwIGZvciBzcGVjaWZpYyBkaXJlY3RvcmllczxQPgotCi1UaGlzIHN0b3BzIGFsbCBvdmVycmlkZXMsIEluY2x1ZGVzIGFuZCBhY2Nlc3NlcyBpbiBhbGwgZGlyZWN0b3JpZXMgYXBhcnQKLWZyb20gdGhvc2UgbmFtZWQuPFA+Ci08SFI+Ci08SDI+Ci0gUHJvdGVjdCBzZXJ2ZXIgZmlsZXMgYnkgZGVmYXVsdAotPC9IMj4KLTxQPgotT25lIGFzcGVjdCBvZiBBcGFjaGUgd2hpY2ggaXMgb2NjYXNpb25hbGx5IG1pc3VuZGVyc3Rvb2QgaXMgdGhlIGZlYXR1cmUKLW9mIGRlZmF1bHQgYWNjZXNzLiAgVGhhdCBpcywgdW5sZXNzIHlvdSB0YWtlIHN0ZXBzIHRvIGNoYW5nZSBpdCwgaWYgdGhlCi1zZXJ2ZXIgY2FuIGZpbmQgaXRzIHdheSB0byBhIGZpbGUgdGhyb3VnaCBub3JtYWwgVVJMIG1hcHBpbmcgcnVsZXMsIGl0Ci1jYW4gc2VydmUgaXQgdG8gY2xpZW50cy4KLTwvUD4KLTxQPgotRm9yIGluc3RhbmNlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIGV4YW1wbGU6Ci08L1A+Ci08T0w+Ci0gPExJPjxTQU1QPiMgY2QgLzsgbG4gLXMgLyBwdWJsaWNfaHRtbDwvU0FNUD4KLSA8L0xJPgotIDxMST5BY2Nlc3NpbmcgPFNBTVA+aHR0cDovL2xvY2FsaG9zdC9+cm9vdC88L1NBTVA+Ci0gPC9MST4KLTwvT0w+Ci08UD4KLVRoaXMgd291bGQgYWxsb3cgY2xpZW50cyB0byB3YWxrIHRocm91Z2ggdGhlIGVudGlyZSBmaWxlc3lzdGVtLiAgVG8gd29yawotYXJvdW5kIHRoaXMsIGFkZCB0aGUgZm9sbG93aW5nIGJsb2NrIHRvIHlvdXIgc2VydmVyJ3MgY29uZmlndXJhdGlvbjoKLTwvUD4KLTxQUkU+Ci0gJmx0O0RpcmVjdG9yeSAvJmd0OwotICAgICBPcmRlciBkZW55LGFsbG93Ci0gICAgIERlbnkgZnJvbSBhbGwKLSAmbHQ7L0RpcmVjdG9yeSZndDsKLTwvUFJFPgotPFA+Ci1UaGlzIHdpbGwgZm9yYmlkIGRlZmF1bHQgYWNjZXNzIHRvIGZpbGVzeXN0ZW0gbG9jYXRpb25zLiAgQWRkCi1hcHByb3ByaWF0ZQotPEEKLSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI2RpcmVjdG9yeSIKLT48U0FNUD4mbHQ7RGlyZWN0b3J5Jmd0OzwvU0FNUD48L0E+Ci1ibG9ja3MgdG8gYWxsb3cgYWNjZXNzIG9ubHkKLWluIHRob3NlIGFyZWFzIHlvdSB3aXNoLiAgRm9yIGV4YW1wbGUsCi08L1A+Ci08UFJFPgotICZsdDtEaXJlY3RvcnkgL3Vzci91c2Vycy8qL3B1YmxpY19odG1sJmd0OwotICAgICBPcmRlciBkZW55LGFsbG93Ci0gICAgIEFsbG93IGZyb20gYWxsCi0gJmx0Oy9EaXJlY3RvcnkmZ3Q7Ci0gJmx0O0RpcmVjdG9yeSAvdXNyL2xvY2FsL2h0dHBkJmd0OwotICAgICBPcmRlciBkZW55LGFsbG93Ci0gICAgIEFsbG93IGZyb20gYWxsCi0gJmx0Oy9EaXJlY3RvcnkmZ3Q7Ci08L1BSRT4KLTxQPgotUGF5IHBhcnRpY3VsYXIgYXR0ZW50aW9uIHRvIHRoZSBpbnRlcmFjdGlvbnMgb2YKLTxBCi0gSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNsb2NhdGlvbiIKLT48U0FNUD4mbHQ7TG9jYXRpb24mZ3Q7PC9TQU1QPjwvQT4KLWFuZAotPEEKLSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI2RpcmVjdG9yeSIKLT48U0FNUD4mbHQ7RGlyZWN0b3J5Jmd0OzwvU0FNUD48L0E+Ci1kaXJlY3RpdmVzOyBmb3IgaW5zdGFuY2UsIGV2ZW4gaWYgPFNBTVA+Jmx0O0RpcmVjdG9yeSAvJmd0OzwvU0FNUD4KLWRlbmllcyBhY2Nlc3MsIGEgPFNBTVA+Jmx0O0xvY2F0aW9uIC8mZ3Q7PC9TQU1QPiBkaXJlY3RpdmUgbWlnaHQKLW92ZXJ0dXJuIGl0LgotPC9QPgotPFA+Ci1BbHNvIGJlIHdhcnkgb2YgcGxheWluZyBnYW1lcyB3aXRoIHRoZQotPEEKLSBIUkVGPSIuLi9tb2QvbW9kX3VzZXJkaXIuaHRtbCN1c2VyZGlyIgotPlVzZXJEaXI8L0E+Ci1kaXJlY3RpdmU7IHNldHRpbmcgaXQgdG8gc29tZXRoaW5nIGxpa2UgPFNBTVA+JnF1b3Q7Li8mcXVvdDs8L1NBTVA+Ci13b3VsZCBoYXZlIHRoZSBzYW1lIGVmZmVjdCwgZm9yIHJvb3QsIGFzIHRoZSBmaXJzdCBleGFtcGxlIGFib3ZlLgotSWYgeW91IGFyZSB1c2luZyBBcGFjaGUgMS4zIG9yIGFib3ZlLCB3ZSBzdHJvbmdseSByZWNvbW1lbmQgdGhhdCB5b3UKLWluY2x1ZGUgdGhlIGZvbGxvd2luZyBsaW5lIGluIHlvdXIgc2VydmVyIGNvbmZpZ3VyYXRpb24gZmlsZXM6Ci08L1A+Ci08REw+Ci0gPEREPjxTQU1QPlVzZXJEaXImbmJzcDtkaXNhYmxlZCZuYnNwO3Jvb3Q8L1NBTVA+Ci0gPC9ERD4KLTwvREw+Ci0KLTxIUj4KLTxQPlBsZWFzZSBzZW5kIGFueSBvdGhlciB1c2VmdWwgc2VjdXJpdHkgdGlwcyB0byBUaGUgQXBhY2hlIEdyb3VwCi1ieSBmaWxsaW5nIG91dCBhCi08QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvYnVnX3JlcG9ydC5odG1sIj5wcm9ibGVtIHJlcG9ydDwvQT4uICAKLUlmIHlvdSBhcmUgY29uZmlkZW50IHlvdSBoYXZlIGZvdW5kIGEgc2VjdXJpdHkgYnVnIGluIHRoZSBBcGFjaGUKLXNvdXJjZSBjb2RlIGl0c2VsZiwgPEEKLUhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9zZWN1cml0eV9yZXBvcnQuaHRtbCI+cGxlYXNlIGxldCB1cwota25vdzwvQT4uCi0KLTxQPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL2NvcmUuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9jb3JlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhODMxMDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL2NvcmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzNDIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgQ29yZSBGZWF0dXJlczwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotCi08SDEgQUxJR049IkNFTlRFUiI+QXBhY2hlIENvcmUgRmVhdHVyZXM8L0gxPgotPFA+Ci1UaGVzZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgY29udHJvbCB0aGUgY29yZSBBcGFjaGUgZmVhdHVyZXMsIGFuZCBhcmUKLWFsd2F5cyBhdmFpbGFibGUuCi08L1A+Ci08SDI+RGlyZWN0aXZlczwvSDI+Ci08VUw+Ci08TEk+PEEgSFJFRj0iI2FjY2Vzc2NvbmZpZyI+QWNjZXNzQ29uZmlnPC9BPgotPExJPjxBIEhSRUY9IiNhY2Nlc3NmaWxlbmFtZSI+QWNjZXNzRmlsZU5hbWU8L0E+Ci08TEk+PEEgSFJFRj0iI2FkZG1vZHVsZSI+QWRkTW9kdWxlPC9BPgotPExJPjxBIEhSRUY9IiNhbGxvd292ZXJyaWRlIj5BbGxvd092ZXJyaWRlPC9BPgotPExJPjxBIEhSRUY9IiNhdXRobmFtZSI+QXV0aE5hbWU8L0E+Ci08TEk+PEEgSFJFRj0iI2F1dGh0eXBlIj5BdXRoVHlwZTwvQT4KLTxMST48QSBIUkVGPSIjYmluZGFkZHJlc3MiPkJpbmRBZGRyZXNzPC9BPgotPExJPjxBIEhSRUY9IiNiczIwMDBhY2NvdW50Ij5CUzIwMDBBY2NvdW50PC9BPgotPExJPjxBIEhSRUY9IiNjbGVhcm1vZHVsZWxpc3QiPkNsZWFyTW9kdWxlTGlzdDwvQT4KLTxMST48QSBIUkVGPSIjY29udGVudGRpZ2VzdCI+Q29udGVudERpZ2VzdDwvQT4KLTxMST48QSBIUkVGPSIjY29yZWR1bXBkaXJlY3RvcnkiPkNvcmVEdW1wRGlyZWN0b3J5PC9BPgotPExJPjxBIEhSRUY9IiNkZWZhdWx0dHlwZSI+RGVmYXVsdFR5cGU8L0E+Ci08TEk+PEEgSFJFRj0iI2RpcmVjdG9yeSI+Jmx0O0RpcmVjdG9yeSZndDs8L0E+Ci08TEk+PEEgSFJFRj0iI2RpcmVjdG9yeW1hdGNoIj4mbHQ7RGlyZWN0b3J5TWF0Y2gmZ3Q7PC9BPgotPExJPjxBIEhSRUY9IiNkb2N1bWVudHJvb3QiPkRvY3VtZW50Um9vdDwvQT4KLTxMST48QSBIUkVGPSIjZXJyb3Jkb2N1bWVudCI+RXJyb3JEb2N1bWVudDwvQT4KLTxMST48QSBIUkVGPSIjZXJyb3Jsb2ciPkVycm9yTG9nPC9BPgotPExJPjxBIEhSRUY9IiNmaWxlcyI+Jmx0O0ZpbGVzJmd0OzwvQT4KLTxMST48QSBIUkVGPSIjZmlsZXNtYXRjaCI+Jmx0O0ZpbGVzTWF0Y2gmZ3Q7PC9BPgotPExJPjxBIEhSRUY9IiNncm91cCI+R3JvdXA8L0E+Ci08TEk+PEEgSFJFRj0iI2hvc3RuYW1lbG9va3VwcyI+SG9zdE5hbWVMb29rdXBzPC9BPgotPExJPjxBIEhSRUY9IiNpZGVudGl0eWNoZWNrIj5JZGVudGl0eUNoZWNrPC9BPgotPExJPjxBIEhSRUY9IiNpZmRlZmluZSI+Jmx0O0lmRGVmaW5lJmd0OzwvQT4KLTxMST48QSBIUkVGPSIjaWZtb2R1bGUiPiZsdDtJZk1vZHVsZSZndDs8L0E+Ci08TEk+PEEgSFJFRj0iI2luY2x1ZGUiPkluY2x1ZGU8L0E+Ci08TEk+PEEgSFJFRj0iI2tlZXBhbGl2ZSI+S2VlcEFsaXZlPC9BPgotPExJPjxBIEhSRUY9IiNrZWVwYWxpdmV0aW1lb3V0Ij5LZWVwQWxpdmVUaW1lb3V0PC9BPgotPExJPjxBIEhSRUY9IiNsaW1pdCI+Jmx0O0xpbWl0Jmd0OzwvQT4KLTxMST48QSBIUkVGPSIjbGltaXRleGNlcHQiPiZsdDtMaW1pdEV4Y2VwdCZndDs8L0E+Ci08TEk+PEEgSFJFRj0iI2xpbWl0cmVxdWVzdGJvZHkiPkxpbWl0UmVxdWVzdEJvZHk8L0E+Ci08TEk+PEEgSFJFRj0iI2xpbWl0cmVxdWVzdGZpZWxkcyI+TGltaXRSZXF1ZXN0RmllbGRzPC9BPgotPExJPjxBIEhSRUY9IiNsaW1pdHJlcXVlc3RmaWVsZHNpemUiPkxpbWl0UmVxdWVzdEZpZWxkc2l6ZTwvQT4KLTxMST48QSBIUkVGPSIjbGltaXRyZXF1ZXN0bGluZSI+TGltaXRSZXF1ZXN0TGluZTwvQT4KLTxMST48QSBIUkVGPSIjbGlzdGVuIj5MaXN0ZW48L0E+Ci08TEk+PEEgSFJFRj0iI2xpc3RlbmJhY2tsb2ciPkxpc3RlbkJhY2tsb2c8L0E+Ci08TEk+PEEgSFJFRj0iI2xvY2F0aW9uIj4mbHQ7TG9jYXRpb24mZ3Q7PC9BPgotPExJPjxBIEhSRUY9IiNsb2NhdGlvbm1hdGNoIj4mbHQ7TG9jYXRpb25NYXRjaCZndDs8L0E+Ci08TEk+PEEgSFJFRj0iI2xvY2tmaWxlIj5Mb2NrRmlsZTwvQT4KLTxMST48QSBIUkVGPSIjbG9nbGV2ZWwiPkxvZ0xldmVsPC9BPgotPExJPjxBIEhSRUY9IiNtYXhjbGllbnRzIj5NYXhDbGllbnRzPC9BPgotPExJPjxBIEhSRUY9IiNtYXhrZWVwYWxpdmVyZXF1ZXN0cyI+TWF4S2VlcEFsaXZlUmVxdWVzdHM8L0E+Ci08TEk+PEEgSFJFRj0iI21heHJlcXVlc3RzcGVyY2hpbGQiPk1heFJlcXVlc3RzUGVyQ2hpbGQ8L0E+Ci08TEk+PEEgSFJFRj0iI21heHNwYXJlc2VydmVycyI+TWF4U3BhcmVTZXJ2ZXJzPC9BPgotPExJPjxBIEhSRUY9IiNtaW5zcGFyZXNlcnZlcnMiPk1pblNwYXJlU2VydmVyczwvQT4KLTxMST48QSBIUkVGPSIjbmFtZXZpcnR1YWxob3N0Ij5OYW1lVmlydHVhbEhvc3Q8L0E+Ci08TEk+PEEgSFJFRj0iI29wdGlvbnMiPk9wdGlvbnM8L0E+Ci08TEk+PEEgSFJFRj0iI3BpZGZpbGUiPlBpZEZpbGU8L0E+Ci08TEk+PEEgSFJFRj0iI3BvcnQiPlBvcnQ8L0E+Ci08TEk+PEEgSFJFRj0iI3JlcXVpcmUiPnJlcXVpcmU8L0E+Ci08TEk+PEEgSFJFRj0iI3Jlc291cmNlY29uZmlnIj5SZXNvdXJjZUNvbmZpZzwvQT4KLTxMST48QSBIUkVGPSIjcmxpbWl0Y3B1Ij5STGltaXRDUFU8L0E+Ci08TEk+PEEgSFJFRj0iI3JsaW1pdG1lbSI+UkxpbWl0TUVNPC9BPgotPExJPjxBIEhSRUY9IiNybGltaXRucHJvYyI+UkxpbWl0TlBST0M8L0E+Ci08TEk+PEEgSFJFRj0iI3NhdGlzZnkiPlNhdGlzZnk8L0E+Ci08TEk+PEEgSFJFRj0iI3Njb3JlYm9hcmRmaWxlIj5TY29yZUJvYXJkRmlsZTwvQT4KLTxMST48QSBIUkVGPSIjc2NyaXB0aW50ZXJwcmV0ZXJzb3VyY2UiPlNjcmlwdEludGVycHJldGVyU291cmNlPC9BPgotPExJPjxBIEhSRUY9IiNzZW5kYnVmZmVyc2l6ZSI+U2VuZEJ1ZmZlclNpemU8L0E+Ci08TEk+PEEgSFJFRj0iI3NlcnZlcmFkbWluIj5TZXJ2ZXJBZG1pbjwvQT4KLTxMST48QSBIUkVGPSIjc2VydmVyYWxpYXMiPlNlcnZlckFsaWFzPC9BPgotPExJPjxBIEhSRUY9IiNzZXJ2ZXJuYW1lIj5TZXJ2ZXJOYW1lPC9BPgotPExJPjxBIEhSRUY9IiNzZXJ2ZXJwYXRoIj5TZXJ2ZXJQYXRoPC9BPgotPExJPjxBIEhSRUY9IiNzZXJ2ZXJyb290Ij5TZXJ2ZXJSb290PC9BPgotPExJPjxBIEhSRUY9IiNzZXJ2ZXJzaWduYXR1cmUiPlNlcnZlclNpZ25hdHVyZTwvQT4KLTxMST48QSBIUkVGPSIjc2VydmVydG9rZW5zIj5TZXJ2ZXJUb2tlbnM8L0E+Ci08TEk+PEEgSFJFRj0iI3NlcnZlcnR5cGUiPlNlcnZlclR5cGU8L0E+Ci08TEk+PEEgSFJFRj0iI3N0YXJ0c2VydmVycyI+U3RhcnRTZXJ2ZXJzPC9BPgotPExJPjxBIEhSRUY9IiN0aHJlYWRzcGVyY2hpbGQiPlRocmVhZHNQZXJDaGlsZDwvQT4KLTxMST48QSBIUkVGPSIjdGhyZWFkc3RhY2tzaXplIj5UaHJlYWRTdGFja1NpemU8L0E+Ci08TEk+PEEgSFJFRj0iI3RpbWVvdXQiPlRpbWVPdXQ8L0E+Ci08TEk+PEEgSFJFRj0iI3VzZWNhbm9uaWNhbG5hbWUiPlVzZUNhbm9uaWNhbE5hbWU8L0E+Ci08TEk+PEEgSFJFRj0iI3VzZXIiPlVzZXI8L0E+Ci08TEk+PEEgSFJFRj0iI3ZpcnR1YWxob3N0Ij4mbHQ7VmlydHVhbEhvc3QmZ3Q7PC9BPgotPC9VTD4KLTxIUj4KLQotPEgyPjxBIE5BTUU9ImFjY2Vzc2NvbmZpZyI+QWNjZXNzQ29uZmlnIGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEFjY2Vzc0NvbmZpZ30gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQWNjZXNzQ29uZmlnIDxFTT5maWxlbmFtZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPkFjY2Vzc0NvbmZpZyBjb25mL2FjY2Vzcy5jb25mPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmU8UD4KLQotVGhlIHNlcnZlciB3aWxsIHJlYWQgdGhpcyBmaWxlIGZvciBtb3JlIGRpcmVjdGl2ZXMgYWZ0ZXIgcmVhZGluZyB0aGUKLTxBIEhSRUY9IiNyZXNvdXJjZWNvbmZpZyI+UmVzb3VyY2VDb25maWc8L0E+IGZpbGUuIDxFTT5GaWxlbmFtZTwvRU0+IGlzCi1yZWxhdGl2ZSB0byB0aGUgPEEgSFJFRj0iI3NlcnZlcnJvb3QiPlNlcnZlclJvb3Q8L0E+LgotVGhpcyBmZWF0dXJlIGNhbiBiZSBkaXNhYmxlZCB1c2luZzoKLTxCTE9DS1FVT1RFPjxDT0RFPkFjY2Vzc0NvbmZpZyAvZGV2L251bGw8L0NPREU+PC9CTE9DS1FVT1RFPgotSGlzdG9yaWNhbGx5LCB0aGlzIGZpbGUgb25seSBjb250YWluZWQKLTxBIEhSRUY9IiNkaXJlY3RvcnkiPiZsdDtEaXJlY3RvcnkmZ3Q7PC9BPiBzZWN0aW9uczsgaW4gZmFjdCBpdCBjYW4gbm93Ci1jb250YWluIGFueSBzZXJ2ZXIgZGlyZWN0aXZlIGFsbG93ZWQgaW4gdGhlIDxFTT5zZXJ2ZXIgY29uZmlnPC9FTT4gY29udGV4dC4KLTxQPjxIUj4KLQotPEgyPjxBIE5BTUU9ImFjY2Vzc2ZpbGVuYW1lIj5BY2Nlc3NGaWxlTmFtZSBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBBY2Nlc3NGaWxlTmFtZX0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQWNjZXNzRmlsZU5hbWUgPEVNPmZpbGVuYW1lIGZpbGVuYW1lIC4uLjwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPkFjY2Vzc0ZpbGVOYW1lIC5odGFjY2VzczwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IEFjY2Vzc0ZpbGVOYW1lIGNhbiBhY2NlcHQgbW9yZSB0aGFuCi1vbmUgZmlsZW5hbWUgb25seSBpbiBBcGFjaGUgMS4zIGFuZCBsYXRlcjxQPgotCi1XaGVuIHJldHVybmluZyBhIGRvY3VtZW50IHRvIHRoZSBjbGllbnQgdGhlIHNlcnZlciBsb29rcyBmb3IgdGhlIGZpcnN0IGV4aXN0aW5nCi1hY2Nlc3MgY29udHJvbCBmaWxlIGZyb20gdGhpcyBsaXN0IG9mIG5hbWVzIGluIGV2ZXJ5IGRpcmVjdG9yeSBvZiB0aGUgcGF0aCB0bwotdGhlIGRvY3VtZW50LCBpZiBhY2Nlc3MgY29udHJvbCBmaWxlcyBhcmUgZW5hYmxlZCBmb3IgdGhhdCBkaXJlY3RvcnkuCi0KLUZvciBleGFtcGxlOgotPEJMT0NLUVVPVEU+PENPREU+QWNjZXNzRmlsZU5hbWUgLmFjbDwvQ09ERT48L0JMT0NLUVVPVEU+Ci1iZWZvcmUgcmV0dXJuaW5nIHRoZSBkb2N1bWVudCAvdXNyL2xvY2FsL3dlYi9pbmRleC5odG1sLCB0aGUKLXNlcnZlciB3aWxsIHJlYWQgLy5hY2wsIC91c3IvLmFjbCwgL3Vzci9sb2NhbC8uYWNsIGFuZCAvdXNyL2xvY2FsL3dlYi8uYWNsCi1mb3IgZGlyZWN0aXZlcywgdW5sZXNzIHRoZXkgaGF2ZSBiZWVuIGRpc2FibGVkIHdpdGgKLTxCTE9DS1FVT1RFPjxDT0RFPgotJmx0O0RpcmVjdG9yeSAvJmd0OzxCUj4KLUFsbG93T3ZlcnJpZGUgTm9uZTxCUj4KLSZsdDsvRGlyZWN0b3J5Jmd0OzwvQ09ERT48L0JMT0NLUVVPVEU+PFA+PEhSPgotCi08SDI+PEEgTkFNRT0iYWRkbW9kdWxlIj5BZGRNb2R1bGUgZGlyZWN0aXZlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgQWRkTW9kdWxlfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBBZGRNb2R1bGUgPEVNPm1vZHVsZSBtb2R1bGUgLi4uPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZyA8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gQWRkTW9kdWxlIGlzIG9ubHkgYXZhaWxhYmxlIGluCi1BcGFjaGUgMS4yIGFuZCBsYXRlcjxQPgotCi1UaGUgc2VydmVyIGNhbiBoYXZlIG1vZHVsZXMgY29tcGlsZWQgaW4gd2hpY2ggYXJlIG5vdCBhY3RpdmVseSBpbiB1c2UuCi1UaGlzIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBlbmFibGUgdGhlIHVzZSBvZiB0aG9zZSBtb2R1bGVzLiAgVGhlCi1zZXJ2ZXIgY29tZXMgd2l0aCBhIHByZS1sb2FkZWQgbGlzdCBvZiBhY3RpdmUgbW9kdWxlczsgdGhpcyBsaXN0IGNhbgotYmUgY2xlYXJlZCB3aXRoIHRoZSA8QSBIUkVGPSIjY2xlYXJtb2R1bGVsaXN0Ij5DbGVhck1vZHVsZUxpc3Q8L0E+Ci1kaXJlY3RpdmUuPFA+PEhSPgotCi08SDI+PEEgTkFNRT0iYWxsb3dvdmVycmlkZSI+QWxsb3dPdmVycmlkZSBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBBbGxvd092ZXJyaWRlfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBBbGxvd092ZXJyaWRlIDxFTT5vdmVycmlkZSBvdmVycmlkZSAuLi48L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5BbGxvd092ZXJyaWRlIEFsbDwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gZGlyZWN0b3J5PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlPFA+Ci0KLVdoZW4gdGhlIHNlcnZlciBmaW5kcyBhbiAuaHRhY2Nlc3MgZmlsZSAoYXMgc3BlY2lmaWVkIGJ5Ci08QSBIUkVGPSIjYWNjZXNzZmlsZW5hbWUiPkFjY2Vzc0ZpbGVOYW1lPC9BPikgaXQgbmVlZHMgdG8ga25vdyB3aGljaAotZGlyZWN0aXZlcyBkZWNsYXJlZCBpbiB0aGF0IGZpbGUgY2FuIG92ZXJyaWRlIGVhcmxpZXIgYWNjZXNzIGluZm9ybWF0aW9uLjxQPgotCi08RU0+T3ZlcnJpZGU8L0VNPiBjYW4gYmUgc2V0IHRvIDxDT0RFPk5vbmU8L0NPREU+LCBpbiB3aGljaCBjYXNlIHRoZSBzZXJ2ZXIKLXdpbGwgbm90IHJlYWQgdGhlIGZpbGUsIDxDT0RFPkFsbDwvQ09ERT4gaW4gd2hpY2ggY2FzZSB0aGUgc2VydmVyIHdpbGwKLWFsbG93IGFsbCB0aGUgZGlyZWN0aXZlcywgb3Igb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZzoKLTxETD4KLTxEVD5BdXRoQ29uZmlnCi08REQ+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgQXV0aENvbmZpZ30gb3ZlcnJpZGUmZ3Q7IC0tPgotQWxsb3cgdXNlIG9mIHRoZSBhdXRob3JpemF0aW9uIGRpcmVjdGl2ZXMKLSg8QSBIUkVGPSJtb2RfYXV0aF9kYm0uaHRtbCNhdXRoZGJtZ3JvdXBmaWxlIj5BdXRoREJNR3JvdXBGaWxlPC9BPiwKLTxBIEhSRUY9Im1vZF9hdXRoX2RibS5odG1sI2F1dGhkYm11c2VyZmlsZSI+QXV0aERCTVVzZXJGaWxlPC9BPiwKLTxBIEhSRUY9Im1vZF9hdXRoLmh0bWwjYXV0aGdyb3VwZmlsZSI+QXV0aEdyb3VwRmlsZTwvQT4sCi08QSBIUkVGPSIjYXV0aG5hbWUiPkF1dGhOYW1lPC9BPiwgPEEgSFJFRj0iI2F1dGh0eXBlIj5BdXRoVHlwZTwvQT4sCi08QSBIUkVGPSJtb2RfYXV0aC5odG1sI2F1dGh1c2VyZmlsZSI+QXV0aFVzZXJGaWxlPC9BPiwKLTxBIEhSRUY9IiNyZXF1aXJlIj5yZXF1aXJlPC9BPiwgPEVNPmV0Yy48L0VNPikuCi08RFQ+RmlsZUluZm8KLTxERD4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBGaWxlSW5mb30gb3ZlcnJpZGUmZ3Q7IC0tPgotQWxsb3cgdXNlIG9mIHRoZSBkaXJlY3RpdmVzIGNvbnRyb2xsaW5nIGRvY3VtZW50IHR5cGVzCi0oPEEgSFJFRj0ibW9kX21pbWUuaHRtbCNhZGRlbmNvZGluZyI+QWRkRW5jb2Rpbmc8L0E+LAotPEEgSFJFRj0ibW9kX21pbWUuaHRtbCNhZGRsYW5ndWFnZSI+QWRkTGFuZ3VhZ2U8L0E+LAotPEEgSFJFRj0ibW9kX21pbWUuaHRtbCNhZGR0eXBlIj5BZGRUeXBlPC9BPiwKLTxBIEhSRUY9IiNkZWZhdWx0dHlwZSI+RGVmYXVsdFR5cGU8L0E+LAotPEEgSFJFRj0iI2Vycm9yZG9jdW1lbnQiPkVycm9yRG9jdW1lbnQ8L0E+LAotPEEgSFJFRj0ibW9kX25lZ290aWF0aW9uLmh0bWwjbGFuZ3VhZ2Vwcmlvcml0eSI+TGFuZ3VhZ2VQcmlvcml0eTwvQT4sIDxFTT5ldGMuPC9FTT4pLgotPERUPkluZGV4ZXMKLTxERD4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBJbmRleGVzfSBvdmVycmlkZSZndDsgLS0+Ci1BbGxvdyB1c2Ugb2YgdGhlIGRpcmVjdGl2ZXMgY29udHJvbGxpbmcgZGlyZWN0b3J5IGluZGV4aW5nCi0oPEEgSFJFRj0ibW9kX2F1dG9pbmRleC5odG1sI2FkZGRlc2NyaXB0aW9uIj5BZGREZXNjcmlwdGlvbjwvQT4sCi08QSBIUkVGPSJtb2RfYXV0b2luZGV4Lmh0bWwjYWRkaWNvbiI+QWRkSWNvbjwvQT4sCi08QSBIUkVGPSJtb2RfYXV0b2luZGV4Lmh0bWwjYWRkaWNvbmJ5ZW5jb2RpbmciPkFkZEljb25CeUVuY29kaW5nPC9BPiwKLTxBIEhSRUY9Im1vZF9hdXRvaW5kZXguaHRtbCNhZGRpY29uYnl0eXBlIj5BZGRJY29uQnlUeXBlPC9BPiwKLTxBIEhSRUY9Im1vZF9hdXRvaW5kZXguaHRtbCNkZWZhdWx0aWNvbiI+RGVmYXVsdEljb248L0E+LAotPEEgSFJFRj0ibW9kX2Rpci5odG1sI2RpcmVjdG9yeWluZGV4Ij5EaXJlY3RvcnlJbmRleDwvQT4sCi08QSBIUkVGPSJtb2RfYXV0b2luZGV4Lmh0bWwjZmFuY3lpbmRleGluZyI+RmFuY3lJbmRleGluZzwvQT4sCi08QSBIUkVGPSJtb2RfYXV0b2luZGV4Lmh0bWwjaGVhZGVybmFtZSI+SGVhZGVyTmFtZTwvQT4sCi08QSBIUkVGPSJtb2RfYXV0b2luZGV4Lmh0bWwjaW5kZXhpZ25vcmUiPkluZGV4SWdub3JlPC9BPiwKLTxBIEhSRUY9Im1vZF9hdXRvaW5kZXguaHRtbCNpbmRleG9wdGlvbnMiPkluZGV4T3B0aW9uczwvQT4sCi08QSBIUkVGPSJtb2RfYXV0b2luZGV4Lmh0bWwjcmVhZG1lbmFtZSI+UmVhZG1lTmFtZTwvQT4sIDxFTT5ldGMuPC9FTT4pLgotPERUPkxpbWl0Ci08REQ+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgTGltaXR9IG92ZXJyaWRlJmd0OyAtLT4KLUFsbG93IHVzZSBvZiB0aGUgZGlyZWN0aXZlcyBjb250cm9sbGluZyBob3N0IGFjY2VzcyAoYWxsb3csIGRlbnkgYW5kIG9yZGVyKS4KLTxEVD5PcHRpb25zCi08REQ+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgT3B0aW9uc30gb3ZlcnJpZGUmZ3Q7IC0tPgotQWxsb3cgdXNlIG9mIHRoZSBkaXJlY3RpdmVzIGNvbnRyb2xsaW5nIHNwZWNpZmljIGRpcmVjdG9yeSBmZWF0dXJlcwotKDxBIEhSRUY9IiNvcHRpb25zIj5PcHRpb25zPC9BPiBhbmQKLTxBIEhSRUY9Im1vZF9pbmNsdWRlLmh0bWwjeGJpdGhhY2siPlhCaXRIYWNrPC9BPikuCi08L0RMPjxQPjxIUj4KLQotPEgyPjxBIE5BTUU9ImF1dGhuYW1lIj5BdXRoTmFtZSBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBBdXRoTmFtZX0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQXV0aE5hbWUgPEVNPmF1dGgtZG9tYWluPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gZGlyZWN0b3J5LCAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBBdXRoQ29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlPFA+Ci0KLVRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIG5hbWUgb2YgdGhlIGF1dGhvcml6YXRpb24gcmVhbG0gZm9yIGEgZGlyZWN0b3J5LgotVGhpcyByZWFsbSBpcyBnaXZlbiB0byB0aGUgY2xpZW50IHNvIHRoYXQgdGhlIHVzZXIga25vd3Mgd2hpY2ggdXNlcm5hbWUgYW5kCi1wYXNzd29yZCB0byBzZW5kLiAgPFNBTVA+QXV0aE5hbWU8L1NBTVA+IHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50OwotaWYgdGhlIHJlYWxtIG5hbWUgY29udGFpbnMgc3BhY2VzLCBpdCBtdXN0IGJlIGVuY2xvc2VkIGluIHF1b3RhdGlvbiBtYXJrcy4KLUl0IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgPEEgSFJFRj0iI2F1dGh0eXBlIj5BdXRoVHlwZTwvQT4gYW5kCi08QSBIUkVGPSIjcmVxdWlyZSI+cmVxdWlyZTwvQT4gZGlyZWN0aXZlcywgYW5kIGRpcmVjdGl2ZXMgc3VjaCBhcwotPEEgSFJFRj0ibW9kX2F1dGguaHRtbCNhdXRodXNlcmZpbGUiPkF1dGhVc2VyRmlsZTwvQT4gYW5kCi08QSBIUkVGPSJtb2RfYXV0aC5odG1sI2F1dGhncm91cGZpbGUiPkF1dGhHcm91cEZpbGU8L0E+IHRvIHdvcmsuPFA+PEhSPgotCi08SDI+PEEgTkFNRT0iYXV0aHR5cGUiPkF1dGhUeXBlIGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEF1dGhUeXBlfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBBdXRoVHlwZSA8RU0+dHlwZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IGRpcmVjdG9yeSwgLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gQXV0aENvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gY29yZTxQPgotCi1UaGlzIGRpcmVjdGl2ZSBzZWxlY3RzIHRoZSB0eXBlIG9mIHVzZXIgYXV0aGVudGljYXRpb24gZm9yIGEgZGlyZWN0b3J5LgotT25seSA8Q09ERT5CYXNpYzwvQ09ERT4gYW5kIDxDT0RFPkRpZ2VzdDwvQ09ERT4gYXJlIGN1cnJlbnRseSBpbXBsZW1lbnRlZC4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBCYXNpY30gYXV0aGVudGljYXRpb24gc2NoZW1lJmd0OyAtLT4KLUl0IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgPEEgSFJFRj0iI2F1dGhuYW1lIj5BdXRoTmFtZTwvQT4gYW5kCi08QSBIUkVGPSIjcmVxdWlyZSI+cmVxdWlyZTwvQT4gZGlyZWN0aXZlcywgYW5kIGRpcmVjdGl2ZXMgc3VjaCBhcwotPEEgSFJFRj0ibW9kX2F1dGguaHRtbCNhdXRodXNlcmZpbGUiPkF1dGhVc2VyRmlsZTwvQT4gYW5kCi08QSBIUkVGPSJtb2RfYXV0aC5odG1sI2F1dGhncm91cGZpbGUiPkF1dGhHcm91cEZpbGU8L0E+IHRvIHdvcmsuPFA+PEhSPgotCi08SDI+PEEgTkFNRT0iYmluZGFkZHJlc3MiPkJpbmRBZGRyZXNzIGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEJpbmRBZGRyZXNzfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBCaW5kQWRkcmVzcyA8RU0+c2FkZHI8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5CaW5kQWRkcmVzcyAqPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlPFA+Ci0KLUEgVW5peCYjMTc0OyBodHRwIHNlcnZlciBjYW4gZWl0aGVyIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMgdG8gZXZlcnkKLUlQIGFkZHJlc3Mgb2YgdGhlIHNlcnZlciBtYWNoaW5lLCBvciBqdXN0IG9uZSBJUCBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXIKLW1hY2hpbmUuIDxFTT5TYWRkcjwvRU0+IGNhbiBiZQotCi08TUVOVT4KLTxMST4qCi08TEk+QW4gSVAgYWRkcmVzcwotPExJPkEgZnVsbHktcXVhbGlmaWVkIEludGVybmV0IGRvbWFpbiBuYW1lCi08L01FTlU+Ci1JZiB0aGUgdmFsdWUgaXMgKiwgdGhlbiB0aGUgc2VydmVyIHdpbGwgbGlzdGVuIGZvciBjb25uZWN0aW9ucyBvbgotZXZlcnkgSVAgYWRkcmVzcywgb3RoZXJ3aXNlIGl0IHdpbGwgb25seSBsaXN0ZW4gb24gdGhlIElQIGFkZHJlc3MKLXNwZWNpZmllZC4gPFA+Ci0KLU9ubHkgb25lIDxDT0RFPkJpbmRBZGRyZXNzPC9DT0RFPiBkaXJlY3RpdmUgY2FuIGJlIHVzZWQuIEZvciBtb3JlCi1jb250cm9sIG92ZXIgd2hpY2ggYWRkcmVzcyBhbmQgcG9ydHMgQXBhY2hlIGxpc3RlbnMgdG8sIHVzZSB0aGUKLTxDT0RFPjxBIEhSRUY9IiNsaXN0ZW4iPkxpc3RlbjwvQT48L0NPREU+IGRpcmVjdGl2ZSBpbnN0ZWFkIG9mCi08Q09ERT5CaW5kQWRkcmVzczwvQ09ERT4uPFA+Ci0KLTxDT0RFPkJpbmRBZGRyZXNzPC9DT0RFPiBjYW4gYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSBtZXRob2QgZm9yCi1zdXBwb3J0aW5nIDxBIEhSRUY9Ii4uL3Zob3N0cy9pbmRleC5odG1sIj52aXJ0dWFsIGhvc3RzPC9BPiB1c2luZwotbXVsdGlwbGUgaW5kZXBlbmRlbnQgc2VydmVycywgaW5zdGVhZCBvZiB1c2luZyA8Q09ERT48QQotSFJFRj0iI3ZpcnR1YWxob3N0Ij4mbHQ7VmlydHVhbEhvc3QmZ3Q7PC9BPjwvQ09ERT4gc2VjdGlvbnMuCi0KLTxQPjxTVFJPTkc+U2VlIEFsc286PC9TVFJPTkc+Ci08QSBIUkVGPSIuLi9kbnMtY2F2ZWF0cy5odG1sIj5ETlMgSXNzdWVzPC9BPjxCUj4KLTxTVFJPTkc+U2VlIEFsc286PC9TVFJPTkc+Ci08QSBIUkVGPSIuLi9iaW5kLmh0bWwiPlNldHRpbmcgd2hpY2ggYWRkcmVzc2VzIGFuZCBwb3J0cyBBcGFjaGUgdXNlczwvQT48L1A+Ci0KLTxIUj4KLQotPEgyPjxBIE5BTUU9ImJzMjAwMGFjY291bnQiPkJTMjAwMEFjY291bnQgZGlyZWN0aXZlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgQlMyMDAwQWNjb3VudH0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQlMyMDAwQWNjb3VudCA8RU0+YWNjb3VudDwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxFTT5ub25lPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gY29yZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBCUzIwMDBBY2NvdW50IGlzIG9ubHkgYXZhaWxhYmxlIGZvcgotQlMyMDAwIG1hY2hpbmVzLCBhcyBvZiBBcGFjaGUgMS4zIGFuZCBsYXRlci48UD4KLQotVGhlIDxDT0RFPkJTMjAwMEFjY291bnQ8L0NPREU+IGRpcmVjdGl2ZSBpcyBhdmFpbGFibGUgZm9yIEJTMjAwMCBob3N0cwotb25seS4gSXQgbXVzdCBiZSB1c2VkIHRvIGRlZmluZSB0aGUgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBub24tcHJpdmlsZWdlZAotYXBhY2hlIHNlcnZlciB1c2VyICh3aGljaCB3YXMgY29uZmlndXJlZCB1c2luZyB0aGUKLTxBIEhSRUY9IiN1c2VyIj5Vc2VyPC9BPiBkaXJlY3RpdmUpLgotVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgQlMyMDAwIFBPU0lYIHN1YnN5c3RlbSAodG8gY2hhbmdlIHRoZSB1bmRlcmx5aW5nCi1CUzIwMDAgdGFzayBlbnZpcm9ubWVudCBieSBwZXJmb3JtaW5nIGEgc3ViLUxPR09OKSB0byBwcmV2ZW50IENHSSBzY3JpcHRzCi1mcm9tIGFjY2Vzc2luZyByZXNvdXJjZXMgb2YgdGhlIHByaXZpbGVnZWQgYWNjb3VudCB3aGljaCBzdGFydGVkIHRoZQotc2VydmVyLCB1c3VhbGx5IDxTQU1QPlNZU1JPT1Q8L1NBTVA+LjxCUj4KLU9ubHkgb25lIDxDT0RFPkJTMjAwMEFjY291bnQ8L0NPREU+IGRpcmVjdGl2ZSBjYW4gYmUgdXNlZC4gPFA+Ci0KLTxQPjxTVFJPTkc+U2VlIEFsc286PC9TVFJPTkc+Ci08QSBIUkVGPSIuLi9lYmNkaWMuaHRtbCI+QXBhY2hlIEVCQ0RJQyBwb3J0PC9BPjwvUD4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0iY2xlYXJtb2R1bGVsaXN0Ij5DbGVhck1vZHVsZUxpc3QgZGlyZWN0aXZlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgQ2xlYXJNb2R1bGVMaXN0fSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBDbGVhck1vZHVsZUxpc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gY29yZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBDbGVhck1vZHVsZUxpc3QgaXMgb25seSBhdmFpbGFibGUgaW4KLUFwYWNoZSAxLjIgYW5kIGxhdGVyPFA+Ci0KLVRoZSBzZXJ2ZXIgY29tZXMgd2l0aCBhIGJ1aWx0LWluIGxpc3Qgb2YgYWN0aXZlIG1vZHVsZXMuICBUaGlzCi1kaXJlY3RpdmUgY2xlYXJzIHRoZSBsaXN0LiAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBsaXN0IHdpbGwgdGhlbiBiZQotcmUtcG9wdWxhdGVkIHVzaW5nIHRoZSA8QSBIUkVGPSIjYWRkbW9kdWxlIj5BZGRNb2R1bGU8L0E+IGRpcmVjdGl2ZS48UD48SFI+Ci0KLTxIMj48QSBOQU1FPSJjb250ZW50ZGlnZXN0Ij5Db250ZW50RGlnZXN0IGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IENvbnRlbnREaWdlc3R9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IENvbnRlbnREaWdlc3QgPEVNPm9ufG9mZjwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPkNvbnRlbnREaWdlc3Qgb2ZmPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwKLS5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IE9wdGlvbnM8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGV4cGVyaW1lbnRhbDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBDb250ZW50RGlnZXN0IGlzIG9ubHkgYXZhaWxhYmxlIGluCi1BcGFjaGUgMS4xIGFuZCBsYXRlcjxQPgotCi1UaGlzIGRpcmVjdGl2ZSBlbmFibGVzIHRoZSBnZW5lcmF0aW9uIG9mIDxDT0RFPkNvbnRlbnQtTUQ1PC9DT0RFPiBoZWFkZXJzCi1hcyBkZWZpbmVkIGluIFJGQzE4NjQgcmVzcGVjdGl2ZWx5IFJGQzIwNjguPFA+Ci0KLU1ENSBpcyBhbiBhbGdvcml0aG0gZm9yIGNvbXB1dGluZyBhICJtZXNzYWdlIGRpZ2VzdCIgKHNvbWV0aW1lcyBjYWxsZWQKLSJmaW5nZXJwcmludCIpIG9mIGFyYml0cmFyeS1sZW5ndGggZGF0YSwgd2l0aCBhIGhpZ2ggZGVncmVlIG9mIGNvbmZpZGVuY2UKLXRoYXQgYW55IGFsdGVyYXRpb25zIGluIHRoZSBkYXRhIHdpbGwgYmUgcmVmbGVjdGVkIGluIGFsdGVyYXRpb25zIGluIHRoZQotbWVzc2FnZSBkaWdlc3QuPFA+Ci0KLVRoZSA8Q09ERT5Db250ZW50LU1ENTwvQ09ERT4gaGVhZGVyIHByb3ZpZGVzIGFuIGVuZC10by1lbmQgbWVzc2FnZQotaW50ZWdyaXR5IGNoZWNrIChNSUMpIG9mIHRoZSBlbnRpdHktYm9keS4gQSBwcm94eSBvciBjbGllbnQgbWF5IGNoZWNrIHRoaXMKLWhlYWRlciBmb3IgZGV0ZWN0aW5nIGFjY2lkZW50YWwgbW9kaWZpY2F0aW9uIG9mIHRoZSBlbnRpdHktYm9keQotaW4gdHJhbnNpdC4KLUV4YW1wbGUgaGVhZGVyOgotPFBSRT4gICBDb250ZW50LU1ENTogQXVMYjdEcDFycXRSdHh6Mm05a1JwQT09PC9QUkU+PFA+Ci0KLU5vdGUgdGhhdCB0aGlzIGNhbiBjYXVzZSBwZXJmb3JtYW5jZSBwcm9ibGVtcyBvbiB5b3VyIHNlcnZlcgotc2luY2UgdGhlIG1lc3NhZ2UgZGlnZXN0IGlzIGNvbXB1dGVkIG9uIGV2ZXJ5IHJlcXVlc3QKLSh0aGUgdmFsdWVzIGFyZSBub3QgY2FjaGVkKS48UD4KLQotPENPREU+Q29udGVudC1NRDU8L0NPREU+IGlzIG9ubHkgc2VudCBmb3IgZG9jdW1lbnRzIHNlcnZlZCBieSB0aGUKLWNvcmUsIGFuZCBub3QgYnkgYW55IG1vZHVsZS4gIEZvciBleGFtcGxlLCBTU0kgZG9jdW1lbnRzLCBvdXRwdXQgZnJvbQotQ0dJIHNjcmlwdHMsIGFuZCBieXRlIHJhbmdlIHJlc3BvbnNlcyBkbyBub3QgaGF2ZSB0aGlzIGhlYWRlci4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0iY29yZWR1bXBkaXJlY3RvcnkiPkNvcmVEdW1wRGlyZWN0b3J5IGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IENvcmVEdW1wRGlyZWN0b3J5fSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBDb3JlRHVtcERpcmVjdG9yeSA8RU0+ZGlyZWN0b3J5PC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gdGhlIHNhbWUgbG9jYXRpb24gYXMgU2VydmVyUm9vdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlPFA+Ci0KLVRoaXMgY29udHJvbHMgdGhlIGRpcmVjdG9yeSB0byB3aGljaCBBcGFjaGUgYXR0ZW1wdHMgdG8gc3dpdGNoIGJlZm9yZQotZHVtcGluZyBjb3JlLiAgVGhlIGRlZmF1bHQgaXMgaW4gdGhlIDxBIEhSRUY9IiNzZXJ2ZXJyb290Ij5TZXJ2ZXJSb290PC9BPgotZGlyZWN0b3J5LCBob3dldmVyIHNpbmNlIHRoaXMgc2hvdWxkIG5vdCBiZSB3cml0YWJsZSBieSB0aGUgdXNlcgotdGhlIHNlcnZlciBydW5zIGFzLCBjb3JlIGR1bXBzIHdvbid0IG5vcm1hbGx5IGdldCB3cml0dGVuLiAgSWYgeW91Ci13YW50IGEgY29yZSBkdW1wIGZvciBkZWJ1Z2dpbmcsIHlvdSBjYW4gdXNlIHRoaXMgZGlyZWN0aXZlIHRvIHBsYWNlCi1pdCBpbiBhIGRpZmZlcmVudCBsb2NhdGlvbi48UD48SFI+Ci0KLTxIMj48QSBOQU1FPSJkZWZhdWx0dHlwZSI+RGVmYXVsdFR5cGUgZGlyZWN0aXZlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgRGVmYXVsdFR5cGV9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IERlZmF1bHRUeXBlIDxFTT5NSU1FLXR5cGU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5EZWZhdWx0VHlwZSB0ZXh0L2h0bWw8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LAotLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gRmlsZUluZm88QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmU8UD4KLQotVGhlcmUgd2lsbCBiZSB0aW1lcyB3aGVuIHRoZSBzZXJ2ZXIgaXMgYXNrZWQgdG8gcHJvdmlkZSBhIGRvY3VtZW50Ci13aG9zZSB0eXBlIGNhbm5vdCBiZSBkZXRlcm1pbmVkIGJ5IGl0cyBNSU1FIHR5cGVzIG1hcHBpbmdzLjxQPgotCi1UaGUgc2VydmVyIG11c3QgaW5mb3JtIHRoZSBjbGllbnQgb2YgdGhlIGNvbnRlbnQtdHlwZSBvZiB0aGUgZG9jdW1lbnQsIHNvIGluCi10aGUgZXZlbnQgb2YgYW4gdW5rbm93biB0eXBlIGl0IHVzZXMgdGhlIDxDT0RFPkRlZmF1bHRUeXBlPC9DT0RFPi4gRm9yCi1leGFtcGxlOgotPEJMT0NLUVVPVEU+PENPREU+RGVmYXVsdFR5cGUgaW1hZ2UvZ2lmPC9DT0RFPjwvQkxPQ0tRVU9URT4KLXdvdWxkIGJlIGFwcHJvcHJpYXRlIGZvciBhIGRpcmVjdG9yeSB3aGljaCBjb250YWluZWQgbWFueSBnaWYgaW1hZ2VzCi13aXRoIGZpbGVuYW1lcyBtaXNzaW5nIHRoZSAuZ2lmIGV4dGVuc2lvbi48UD48SFI+Ci0KLTxIMj48QSBOQU1FPSJkaXJlY3RvcnkiPiZsdDtEaXJlY3RvcnkmZ3Q7IGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IERpcmVjdG9yeX0gc2VjdGlvbiBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiAmbHQ7RGlyZWN0b3J5IDxFTT5kaXJlY3Rvcnk8L0VNPiZndDsKLSAuLi4gJmx0Oy9EaXJlY3RvcnkmZ3Q7IDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IENvcmUuIDxQPgotCi0mbHQ7RGlyZWN0b3J5Jmd0OyBhbmQgJmx0Oy9EaXJlY3RvcnkmZ3Q7IGFyZSB1c2VkIHRvIGVuY2xvc2UgYSBncm91cCBvZgotZGlyZWN0aXZlcyB3aGljaCB3aWxsIGFwcGx5IG9ubHkgdG8gdGhlIG5hbWVkIGRpcmVjdG9yeSBhbmQgc3ViLWRpcmVjdG9yaWVzCi1vZiB0aGF0IGRpcmVjdG9yeS4gQW55IGRpcmVjdGl2ZSB3aGljaCBpcyBhbGxvd2VkIGluIGEgZGlyZWN0b3J5Ci1jb250ZXh0IG1heSBiZSB1c2VkLiA8RU0+RGlyZWN0b3J5PC9FTT4gaXMgZWl0aGVyIHRoZSBmdWxsIHBhdGggdG8gYSBkaXJlY3RvcnksCi1vciBhIHdpbGQtY2FyZCBzdHJpbmcuIEluIGEgd2lsZC1jYXJkIHN0cmluZywgYD8nIG1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIsCi1hbmQgYConIG1hdGNoZXMgYW55IHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXJzLiAgQXMgb2YgQXBhY2hlIDEuMywgeW91Ci1tYXkgYWxzbyB1c2UgYFtdJyBjaGFyYWN0ZXIgcmFuZ2VzIGxpa2UgaW4gdGhlIHNoZWxsLiAgQWxzbyBhcyBvZiBBcGFjaGUgMS4zCi1ub25lIG9mIHRoZSB3aWxkY2FyZHMgbWF0Y2ggYSBgLycgY2hhcmFjdGVyLCB3aGljaCBtb3JlIGNsb3NlbHkgbWltaWNzIHRoZQotYmVoYXZpb3VyIG9mIFVuaXggc2hlbGxzLgotRXhhbXBsZToKLTxQUkU+Ci0gICAmbHQ7RGlyZWN0b3J5IC91c3IvbG9jYWwvaHR0cGQvaHRkb2NzJmd0OwotICAgT3B0aW9ucyBJbmRleGVzIEZvbGxvd1N5bUxpbmtzCi0gICAmbHQ7L0RpcmVjdG9yeSZndDsKLTwvUFJFPgotCi08UD48U1RST05HPkFwYWNoZSAxLjIgYW5kIGFib3ZlOjwvU1RST05HPgotRXh0ZW5kZWQgcmVndWxhciBleHByZXNzaW9ucyBjYW4gYWxzbyBiZSB1c2VkLCB3aXRoIHRoZSBhZGRpdGlvbiBvZiB0aGUKLTxDT0RFPn48L0NPREU+IGNoYXJhY3Rlci4gRm9yIGV4YW1wbGU6PC9QPgotCi08UFJFPgotICAgJmx0O0RpcmVjdG9yeSB+ICZxdW90O14vd3d3Ly4qL1swLTldezN9JnF1b3Q7Jmd0OwotPC9QUkU+Ci0KLXdvdWxkIG1hdGNoIGRpcmVjdG9yaWVzIGluIC93d3cvIHRoYXQgY29uc2lzdGVkIG9mIHRocmVlIG51bWJlcnMuCi0KLTxQPklmIG11bHRpcGxlIChub24tcmVndWxhciBleHByZXNzaW9uKSBkaXJlY3Rvcnkgc2VjdGlvbnMgbWF0Y2ggdGhlCi1kaXJlY3RvcnkgKG9yIGl0cyBwYXJlbnRzKSBjb250YWluaW5nCi1hIGRvY3VtZW50LCB0aGVuIHRoZSBkaXJlY3RpdmVzIGFyZSBhcHBsaWVkIGluIHRoZSBvcmRlciBvZiBzaG9ydGVzdCBtYXRjaAotZmlyc3QsIGludGVyc3BlcnNlZCB3aXRoIHRoZSBkaXJlY3RpdmVzIGZyb20gdGhlCi08QSBIUkVGPSIjYWNjZXNzZmlsZW5hbWUiPi5odGFjY2VzczwvQT4gZmlsZXMuIEZvciBleGFtcGxlLCB3aXRoCi08QkxPQ0tRVU9URT48Q09ERT4KLSZsdDtEaXJlY3RvcnkgLyZndDs8QlI+Ci1BbGxvd092ZXJyaWRlIE5vbmU8QlI+Ci0mbHQ7L0RpcmVjdG9yeSZndDs8QlI+PEJSPgotJmx0O0RpcmVjdG9yeSAvaG9tZS8qJmd0OzxCUj4KLUFsbG93T3ZlcnJpZGUgRmlsZUluZm88QlI+Ci0mbHQ7L0RpcmVjdG9yeSZndDs8L0NPREU+PC9CTE9DS1FVT1RFPgotZm9yIGFjY2VzcyB0byB0aGUgZG9jdW1lbnQgPENPREU+L2hvbWUvd2ViL2Rpci9kb2MuaHRtbDwvQ09ERT4gdGhlCi1zdGVwcyBhcmU6Ci08TUVOVT4KLTxMST5BcHBseSBkaXJlY3RpdmUgPENPREU+QWxsb3dPdmVycmlkZSBOb25lPC9DT0RFPiAoZGlzYWJsaW5nCi08Q09ERT4uaHRhY2Nlc3M8L0NPREU+IGZpbGVzKS4KLTxMST5BcHBseSBkaXJlY3RpdmUgPENPREU+QWxsb3dPdmVycmlkZSBGaWxlSW5mbzwvQ09ERT4gKGZvciBkaXJlY3RvcnkKLTxDT0RFPi9ob21lL3dlYjwvQ09ERT4pLgotPExJPkFwcGx5IGFueSBGaWxlSW5mbyBkaXJlY3RpdmVzIGluIDxDT0RFPi9ob21lL3dlYi8uaHRhY2Nlc3M8L0NPREU+Ci08L01FTlU+Ci0KLTxQPgotUmVndWxhciBleHByZXNzaW9uIGRpcmVjdG9yeSBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzbGlnaHRseSBkaWZmZXJlbnRseQotYnkgQXBhY2hlIDEuMiBhbmQgMS4zLiAgSW4gQXBhY2hlIDEuMiB0aGV5IGFyZSBpbnRlcnNwZXJzZWQgd2l0aCB0aGUgbm9ybWFsCi1kaXJlY3Rvcnkgc2VjdGlvbnMgYW5kIGFwcGxpZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBjb25maWd1cmF0aW9uCi1maWxlLiAgVGhleSBhcmUgYXBwbGllZCBvbmx5IG9uY2UsIGFuZCBhcHBseSB3aGVuIHRoZSBzaG9ydGVzdCBtYXRjaAotcG9zc2libGUgb2NjdXJzLiAgSW4gQXBhY2hlIDEuMyByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBub3QgY29uc2lkZXJlZAotdW50aWwgYWZ0ZXIgYWxsIG9mIHRoZSBub3JtYWwgc2VjdGlvbnMgaGF2ZSBiZWVuIGFwcGxpZWQuICBUaGVuIGFsbCBvZgotdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIHRlc3RlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXJlZCBpbiB0aGUKLWNvbmZpZ3VyYXRpb24gZmlsZS4gIEZvciBleGFtcGxlLCB3aXRoCi08QkxPQ0tRVU9URT48Q09ERT4KLSZsdDtEaXJlY3RvcnkgfiBhYmMkJmd0OzxCUj4KLS4uLiBkaXJlY3RpdmVzIGhlcmUgLi4uPEJSPgotJmx0Oy9EaXJlY3RvcnkmZ3Q7PEJSPgotPC9DT0RFPjwvQkxPQ0tRVU9URT4KLVN1cHBvc2UgdGhhdCB0aGUgZmlsZW5hbWUgYmVpbmcgYWNjZXNzZWQgaXMKLTxDT0RFPi9ob21lL2FiYy9wdWJsaWNfaHRtbC9hYmMvaW5kZXguaHRtbDwvQ09ERT4uICBUaGUgc2VydmVyCi1jb25zaWRlcnMgZWFjaCBvZiA8Q09ERT4vPC9DT0RFPiwgPENPREU+L2hvbWU8L0NPREU+LCA8Q09ERT4vaG9tZS9hYmM8L0NPREU+LAotPENPREU+L2hvbWUvYWJjL3B1YmxpY19odG1sPC9DT0RFPiwgYW5kIDxDT0RFPi9ob21lL2FiYy9wdWJsaWNfaHRtbC9hYmM8L0NPREU+Ci1pbiB0aGF0IG9yZGVyLiAgIEluIEFwYWNoZSAxLjIsIHdoZW4KLTxDT0RFPi9ob21lL2FiYzwvQ09ERT4gaXMgY29uc2lkZXJlZCwgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aWxsIG1hdGNoCi1hbmQgYmUgYXBwbGllZC4gIEluIEFwYWNoZSAxLjMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpc24ndCBjb25zaWRlcmVkCi1hdCBhbGwgYXQgdGhhdCBwb2ludCBpbiB0aGUgdHJlZS4gIEl0IHdvbid0IGJlIGNvbnNpZGVyZWQgdW50aWwgYWZ0ZXIKLWFsbCBub3JtYWwgJmx0O0RpcmVjdG9yeSZndDtzIGFuZCA8Q09ERT4uaHRhY2Nlc3M8L0NPREU+IGZpbGVzIGhhdmUKLWJlZW4gYXBwbGllZC4gIFRoZW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aWxsCi1tYXRjaCBvbiA8Q09ERT4vaG9tZS9hYmMvcHVibGljX2h0bWwvYWJjPC9DT0RFPiBhbmQgYmUgYXBwbGllZC4KLQotPFA+Ci0KLTxTVFJPTkc+Ci1Ob3RlIHRoYXQgdGhlIGRlZmF1bHQgQXBhY2hlIGFjY2VzcyBmb3IgJmx0O0RpcmVjdG9yeSAvJmd0OyBpcwotPFNBTVA+QWxsb3cgZnJvbSBBbGw8L1NBTVA+LiAgVGhpcyBtZWFucyB0aGF0IEFwYWNoZSB3aWxsIHNlcnZlIGFueSBmaWxlCi1tYXBwZWQgZnJvbSBhbiBVUkwuICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBjaGFuZ2UgdGhpcyB3aXRoIGEgYmxvY2sKLXN1Y2ggYXMKLTwvU1RST05HPgotPFBSRT4KLSAmbHQ7RGlyZWN0b3J5IC8mZ3Q7Ci0gICAgIE9yZGVyIERlbnksQWxsb3cKLSAgICAgRGVueSBmcm9tIEFsbAotICZsdDsvRGlyZWN0b3J5Jmd0OwotPC9QUkU+Ci08UD4KLTxTVFJPTkc+Ci1hbmQgdGhlbiBvdmVycmlkZSB0aGlzIGZvciBkaXJlY3RvcmllcyB5b3UgPEVNPndhbnQ8L0VNPiBhY2Nlc3NpYmxlLgotU2VlIHRoZQotPEEKLSBIUkVGPSIuLi9taXNjL3NlY3VyaXR5X3RpcHMuaHRtbCIKLT5TZWN1cml0eSBUaXBzPC9BPgotcGFnZSBmb3IgbW9yZSBkZXRhaWxzLgotPC9TVFJPTkc+Ci08L1A+Ci0KLVRoZSBkaXJlY3Rvcnkgc2VjdGlvbnMgdHlwaWNhbGx5IG9jY3VyIGluIHRoZSBhY2Nlc3MuY29uZiBmaWxlLCBidXQgdGhleQotbWF5IGFwcGVhciBpbiBhbnkgY29uZmlndXJhdGlvbiBmaWxlLiAmbHQ7RGlyZWN0b3J5Jmd0OyBkaXJlY3RpdmVzIGNhbm5vdAotbmVzdCwgYW5kIGNhbm5vdCBhcHBlYXIgaW4gYSA8QSBIUkVGPSIjbGltaXQiPiZsdDtMaW1pdCZndDs8L0E+IG9yCi08QSBIUkVGPSIjbGltaXRleGNlcHQiPiZsdDtMaW1pdEV4Y2VwdCZndDs8L0E+IHNlY3Rpb24uCi08UD4KLQotPFNUUk9ORz5TZWUgYWxzbzwvU1RST05HPjogPEEgSFJFRj0iLi4vc2VjdGlvbnMuaHRtbCI+SG93IERpcmVjdG9yeSwKLUxvY2F0aW9uIGFuZCBGaWxlcyBzZWN0aW9ucyB3b3JrPC9BPiBmb3IgYW4gZXhwbGFuYXRpb24gb2YgaG93IHRoZXNlCi1kaWZmZXJlbnQgc2VjdGlvbnMgYXJlIGNvbWJpbmVkIHdoZW4gYSByZXF1ZXN0IGlzIHJlY2VpdmVkCi0KLTxIUj4KLQotPEgyPjxBIE5BTUU9ImRpcmVjdG9yeW1hdGNoIj4mbHQ7RGlyZWN0b3J5TWF0Y2gmZ3Q7PC9BPjwvSDI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+ICZsdDtEaXJlY3RvcnlNYXRjaCA8RU0+cmVnZXg8L0VNPiZndDsKLSAuLi4gJmx0Oy9EaXJlY3RvcnlNYXRjaCZndDsgPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQ29yZS48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gQXZhaWxhYmxlIGluIEFwYWNoZSAxLjMgYW5kIGxhdGVyCi0KLTxQPiZsdDtEaXJlY3RvcnlNYXRjaCZndDsgYW5kICZsdDsvRGlyZWN0b3J5TWF0Y2gmZ3Q7IGFyZSB1c2VkIHRvIGVuY2xvc2UgYQotZ3JvdXAgb2YKLWRpcmVjdGl2ZXMgd2hpY2ggd2lsbCBhcHBseSBvbmx5IHRvIHRoZSBuYW1lZCBkaXJlY3RvcnkgYW5kIHN1Yi1kaXJlY3Rvcmllcwotb2YgdGhhdCBkaXJlY3RvcnksIHRoZSBzYW1lIGFzIDxBCi1IUkVGPSIjZGlyZWN0b3J5Ij4mbHQ7RGlyZWN0b3J5Jmd0OzwvQT4uIEhvd2V2ZXIsIGl0IHRha2VzIGFzIGFuCi1hcmd1bWVudCBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gRm9yIGV4YW1wbGU6PC9QPgotCi08UFJFPgotICAgJmx0O0RpcmVjdG9yeU1hdGNoICZxdW90O14vd3d3Ly4qL1swLTldezN9JnF1b3Q7Jmd0OwotPC9QUkU+Ci0KLTxQPndvdWxkIG1hdGNoIGRpcmVjdG9yaWVzIGluIC93d3cvIHRoYXQgY29uc2lzdGVkIG9mIHRocmVlIG51bWJlcnMuPC9QPgotCi08UD48U1RST05HPlNlZSBBbHNvOjwvU1RST05HPgotPEEgSFJFRj0iI2RpcmVjdG9yeSI+Jmx0O0RpcmVjdG9yeSZndDs8L0E+IGZvciBhIGRlc2NyaXB0aW9uIG9mIGhvdwotcmVndWxhciBleHByZXNzaW9ucyBhcmUgbWl4ZWQgaW4gd2l0aCBub3JtYWwgJmx0O0RpcmVjdG9yeSZndDtzLgotPEJSPgotPFNUUk9ORz5TZWUgYWxzbzwvU1RST05HPjogPEEgSFJFRj0iLi4vc2VjdGlvbnMuaHRtbCI+SG93IERpcmVjdG9yeSwKLUxvY2F0aW9uIGFuZCBGaWxlcyBzZWN0aW9ucyB3b3JrPC9BPiBmb3IgYW4gZXhwbGFuYXRpb24gb2YgaG93IHRoZXNlCi1kaWZmZXJlbnQgc2VjdGlvbnMgYXJlIGNvbWJpbmVkIHdoZW4gYSByZXF1ZXN0IGlzIHJlY2VpdmVkCi0KLTxIUj4KLQotPEgyPjxBIE5BTUU9ImRvY3VtZW50cm9vdCI+RG9jdW1lbnRSb290IGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IERvY3VtZW50Um9vdH0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gRG9jdW1lbnRSb290IDxFTT5kaXJlY3RvcnktZmlsZW5hbWU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5Eb2N1bWVudFJvb3QKLS91c3IvbG9jYWwvYXBhY2hlL2h0ZG9jczwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlPFA+Ci0KLVRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGh0dHBkIHdpbGwgc2VydmUgZmlsZXMuCi1Vbmxlc3MgbWF0Y2hlZCBieSBhIGRpcmVjdGl2ZSBsaWtlIEFsaWFzLCB0aGUgc2VydmVyIGFwcGVuZHMgdGhlIHBhdGgKLWZyb20gdGhlIHJlcXVlc3RlZCBVUkwgdG8gdGhlIGRvY3VtZW50IHJvb3QgdG8gbWFrZSB0aGUgcGF0aCB0byB0aGUKLWRvY3VtZW50LiBFeGFtcGxlOgotPEJMT0NLUVVPVEU+PENPREU+RG9jdW1lbnRSb290IC91c3Ivd2ViPC9DT0RFPjwvQkxPQ0tRVU9URT4KLXRoZW4gYW4gYWNjZXNzIHRvIDxDT0RFPmh0dHA6Ly93d3cubXkuaG9zdC5jb20vaW5kZXguaHRtbDwvQ09ERT4gcmVmZXJzCi10byA8Q09ERT4vdXNyL3dlYi9pbmRleC5odG1sPC9DT0RFPi4KLQotPFA+VGhlcmUgYXBwZWFycyB0byBiZSBhIGJ1ZyBpbiBtb2RfZGlyIHdoaWNoIGNhdXNlcyBwcm9ibGVtcyB3aGVuIHRoZQotRG9jdW1lbnRSb290IGhhcyBhIHRyYWlsaW5nIHNsYXNoICg8RU0+aS5lLjwvRU0+LCAiRG9jdW1lbnRSb290IC91c3Ivd2ViLyIpIHNvCi1wbGVhc2UgYXZvaWQgdGhhdC4KLQotPFA+PEhSPgotCi08SDI+PEEgTkFNRT0iZXJyb3Jkb2N1bWVudCI+RXJyb3JEb2N1bWVudCBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBFcnJvckRvY3VtZW50fSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBFcnJvckRvY3VtZW50IDxFTT5lcnJvci1jb2RlIGRvY3VtZW50PC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksCi0uaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBGaWxlSW5mbzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBUaGUgZGlyZWN0b3J5IGFuZCAuaHRhY2Nlc3MgY29udGV4dHMKLWFyZSBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUgMS4xIGFuZCBsYXRlci48UD4KLQotSW4gdGhlIGV2ZW50IG9mIGEgcHJvYmxlbSBvciBlcnJvciwgQXBhY2hlIGNhbiBiZSBjb25maWd1cmVkIHRvIGRvCi1vbmUgb2YgZm91ciB0aGluZ3MsCi0KLTxPTD4KLTxMST5vdXRwdXQgYSBzaW1wbGUgaGFyZGNvZGVkIGVycm9yIG1lc3NhZ2UKLTxMST5vdXRwdXQgYSBjdXN0b21pemVkIG1lc3NhZ2UKLTxMST5yZWRpcmVjdCB0byBhIGxvY2FsIFVSTCB0byBoYW5kbGUgdGhlIHByb2JsZW0vZXJyb3IKLTxMST5yZWRpcmVjdCB0byBhbiBleHRlcm5hbCBVUkwgdG8gaGFuZGxlIHRoZSBwcm9ibGVtL2Vycm9yCi08L09MPgotCi08UD5UaGUgZmlyc3Qgb3B0aW9uIGlzIHRoZSBkZWZhdWx0LCB3aGlsZSBvcHRpb25zIDItNCBhcmUgY29uZmlndXJlZAotdXNpbmcgdGhlIDxDT0RFPkVycm9yRG9jdW1lbnQ8L0NPREU+IGRpcmVjdGl2ZSwgd2hpY2ggaXMgZm9sbG93ZWQgYnkKLXRoZSBIVFRQIHJlc3BvbnNlIGNvZGUgYW5kIGEgbWVzc2FnZSBvciBVUkwuCi0KLTxQPjxFTT5NZXNzYWdlczwvRU0+IGluIHRoaXMgY29udGV4dCBiZWdpbiB3aXRoIGEgc2luZ2xlIHF1b3RlCi0oPENPREU+IjwvQ09ERT4pLCB3aGljaCBkb2VzIG5vdCBmb3JtIHBhcnQgb2YgdGhlIG1lc3NhZ2UgaXRzZWxmLgotQXBhY2hlIHdpbGwgc29tZXRpbWVzIG9mZmVyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZQotcHJvYmxlbS9lcnJvci4KLQotPFA+VVJMcyBjYW4gYmVnaW4gd2l0aCBhIHNsYXNoICgvKSBmb3IgbG9jYWwgVVJMcywgb3IgYmUgYSBmdWxsCi1VUkwgd2hpY2ggdGhlIGNsaWVudCBjYW4gcmVzb2x2ZS4gRXhhbXBsZXM6Ci08QkxPQ0tRVU9URT48Q09ERT4KLUVycm9yRG9jdW1lbnQgNTAwIGh0dHA6Ly9mb28uZXhhbXBsZS5jb20vY2dpLWJpbi90ZXN0ZXI8QlI+Ci1FcnJvckRvY3VtZW50IDQwNCAvY2dpLWJpbi9iYWRfdXJscy5wbDxCUj4KLUVycm9yRG9jdW1lbnQgNDAxIC9zdWJzY3JpcHRpb25faW5mby5odG1sPEJSPgotRXJyb3JEb2N1bWVudCA0MDMgIlNvcnJ5IGNhbid0IGFsbG93IHlvdSBhY2Nlc3MgdG9kYXkKLTwvQ09ERT48L0JMT0NLUVVPVEU+Ci0KLTxQPk5vdGUgdGhhdCB3aGVuIHlvdSBzcGVjaWZ5IGFuIDxDT0RFPkVycm9yRG9jdW1lbnQ8L0NPREU+IHRoYXQKLXBvaW50cyB0byBhIHJlbW90ZSBVUkwgKGllLiBhbnl0aGluZyB3aXRoIGEgbWV0aG9kIHN1Y2ggYXMgImh0dHAiIGluCi1mcm9udCBvZiBpdCkgQXBhY2hlIHdpbGwgc2VuZCBhIHJlZGlyZWN0IHRvIHRoZSBjbGllbnQgdG8gdGVsbCBpdAotd2hlcmUgdG8gZmluZCB0aGUgZG9jdW1lbnQsIGV2ZW4gaWYgdGhlIGRvY3VtZW50IGVuZHMgdXAgYmVpbmcKLW9uIHRoZSBzYW1lIHNlcnZlci4uICBUaGlzIGhhcyBzZXZlcmFsIGltcGxpY2F0aW9ucywgdGhlCi1tb3N0IGltcG9ydGFudCBiZWluZyB0aGF0IDxTVFJPTkc+aWYgeW91IHVzZSBhbiAiRXJyb3JEb2N1bWVudCA0MDEiCi1kaXJlY3RpdmUgdGhlbiBpdCBtdXN0IHJlZmVyIHRvIGEgbG9jYWwgZG9jdW1lbnQuPC9TVFJPTkc+ICBUaGlzIHJlc3VsdHMKLWZyb20gdGhlIG5hdHVyZSBvZiB0aGUgSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvbiBzY2hlbWUuCi0KLTxQPlNlZSBBbHNvOiA8QSBIUkVGPSIuLi9jdXN0b20tZXJyb3IuaHRtbCI+ZG9jdW1lbnRhdGlvbiBvZiBjdXN0b21pemFibGUKLXJlc3BvbnNlcy48L0E+PFA+PEhSPgotCi08SDI+PEEgTkFNRT0iZXJyb3Jsb2ciPkVycm9yTG9nIGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEVycm9yTG9nfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBFcnJvckxvZyA8RU0+ZmlsZW5hbWU8L0VNPnw8Q09ERT5zeXNsb2dbOmZhY2lsaXR5XTwvQ09ERT4KLTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5FcnJvckxvZyBsb2dzL2Vycm9yX2xvZzwvQ09ERT4gKFVuaXgpPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPkVycm9yTG9nIGxvZ3MvZXJyb3IubG9nPC9DT0RFPiAKLSAoV2luZG93cyBhbmQgT1MvMik8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlPFA+Ci0KLVRoZSBlcnJvciBsb2cgZGlyZWN0aXZlIHNldHMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gd2hpY2ggdGhlIHNlcnZlciB3aWxsIGxvZwotYW55IGVycm9ycyBpdCBlbmNvdW50ZXJzLiBJZiB0aGUgZmlsZW5hbWUgZG9lcyBub3QgYmVnaW4gd2l0aCBhIHNsYXNoICgvKQotdGhlbiBpdCBpcyBhc3N1bWVkIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSA8QSBIUkVGPSIjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvQT4uCi1JZiB0aGUgZmlsZW5hbWUgYmVnaW5zIHdpdGggYSBwaXBlICh8KSB0aGVuIGl0IGlzIGFzc3VtZWQgdG8gYmUgYSBjb21tYW5kIHRvCi1zcGF3biB0byBoYW5kbGUgdGhlIGVycm9yIGxvZy4KLQotPFA+PFNUUk9ORz5BcGFjaGUgMS4zIGFuZCBhYm92ZTo8L1NUUk9ORz4KLVVzaW5nIDxDT0RFPnN5c2xvZzwvQ09ERT4gaW5zdGVhZCBvZiBhIGZpbGVuYW1lIGVuYWJsZXMgbG9nZ2luZyB2aWEgc3lzbG9nZCg4KQotaWYgdGhlIHN5c3RlbSBzdXBwb3J0cyBpdC4gVGhlIGRlZmF1bHQgaXMgdG8gdXNlIHN5c2xvZyBmYWNpbGl0eQotPENPREU+bG9jYWw3PC9DT0RFPiwgYnV0IHlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBieSB1c2luZyB0aGUKLTxDT0RFPnN5c2xvZzo8L0NPREU+PEVNPmZhY2lsaXR5PC9FTT4gc3ludGF4IHdoZXJlIDxFTT5mYWNpbGl0eTwvRU0+IGNhbiBiZQotb25lIG9mIHRoZSBuYW1lcyB1c3VhbGx5IGRvY3VtZW50ZWQgaW4gc3lzbG9nKDEpLgotCi08UD4KLVNFQ1VSSVRZOiBTZWUgdGhlCi08QSBIUkVGPSIuLi9taXNjL3NlY3VyaXR5X3RpcHMuaHRtbCNzZXJ2ZXJyb290Ij5zZWN1cml0eSB0aXBzPC9BPgotZG9jdW1lbnQgZm9yIGRldGFpbHMgb24gd2h5IHlvdXIgc2VjdXJpdHkgY291bGQgYmUgY29tcHJvbWlzZWQgaWYKLXRoZSBkaXJlY3Rvcnkgd2hlcmUgbG9nZmlsZXMgYXJlIHN0b3JlZCBpcyB3cml0YWJsZSBieSBhbnlvbmUgb3RoZXIKLXRoYW4gdGhlIHVzZXIgdGhhdCBzdGFydHMgdGhlIHNlcnZlci4KLQotPFA+PFNUUk9ORz5TZWUgYWxzbzo8L1NUUk9ORz4gPEEgSFJFRj0iI2xvZ2xldmVsIj5Mb2dMZXZlbDwvQT4KLTxQPjxIUj4KLQotPEgyPjxBIE5BTUU9ImZpbGVzIj4mbHQ7RmlsZXMmZ3Q7IGRpcmVjdGl2ZTwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiAmbHQ7RmlsZXMgPEVNPmZpbGVuYW1lPC9FTT4mZ3Q7Ci0uLi4gJmx0Oy9GaWxlcyZndDs8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gb25seSBhdmFpbGFibGUgaW4gQXBhY2hlCi0xLjIgYW5kIGFib3ZlLjxQPgotCi08UD5UaGUgJmx0O0ZpbGVzJmd0OyBkaXJlY3RpdmUgcHJvdmlkZXMgZm9yIGFjY2VzcyBjb250cm9sIGJ5Ci1maWxlbmFtZS4gSXQgaXMgY29tcGFyYWJsZSB0byB0aGUgPEEKLUhSRUY9IiNkaXJlY3RvcnkiPiZsdDtEaXJlY3RvcnkmZ3Q7PC9BPiBkaXJlY3RpdmUgYW5kCi08QSBIUkVGPSIjbG9jYXRpb24iPiZsdDtMb2NhdGlvbiZndDs8L0E+IGRpcmVjdGl2ZXMuIEl0Ci1zaG91bGQgYmUgbWF0Y2hlZCB3aXRoIGEgJmx0Oy9GaWxlcyZndDsgZGlyZWN0aXZlLiAgVGhlCi1kaXJlY3RpdmVzIGdpdmVuIHdpdGhpbiB0aGlzIHNlY3Rpb24gd2lsbCBiZSBhcHBsaWVkIHRvIGFueQotb2JqZWN0IHdpdGggYSBiYXNlbmFtZSAobGFzdCBjb21wb25lbnQgb2YgZmlsZW5hbWUpIG1hdGNoaW5nCi10aGUgc3BlY2lmaWVkIGZpbGVuYW1lLgotPENPREU+Jmx0O0ZpbGVzJmd0OzwvQ09ERT4gc2VjdGlvbnMgYXJlIHByb2Nlc3NlZCBpbiB0aGUKLW9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUsIGFmdGVyIHRoZQotJmx0O0RpcmVjdG9yeSZndDsgc2VjdGlvbnMgYW5kIDxDT0RFPi5odGFjY2VzczwvQ09ERT4gZmlsZXMgYXJlCi1yZWFkLCBidXQgYmVmb3JlICZsdDtMb2NhdGlvbiZndDsgc2VjdGlvbnMuICBOb3RlIHRoYXQKLSZsdDtGaWxlcyZndDsgY2FuIGJlIG5lc3RlZCBpbnNpZGUgJmx0O0RpcmVjdG9yeSZndDsKLXNlY3Rpb25zIHRvIHJlc3RyaWN0IHRoZSBwb3J0aW9uIG9mIHRoZSBmaWxlc3lzdGVtIHRoZXkKLWFwcGx5IHRvLjwvUD4KLQotPFA+VGhlIDxFTT5maWxlbmFtZTwvRU0+IGFyZ3VtZW50IHNob3VsZCBpbmNsdWRlIGEgZmlsZW5hbWUsIG9yIGEKLXdpbGQtY2FyZCBzdHJpbmcsIHdoZXJlIGA/JyBtYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyLCBhbmQgYConIG1hdGNoZXMgYW55Ci1zZXF1ZW5jZXMgb2YgY2hhcmFjdGVycy4gRXh0ZW5kZWQgcmVndWxhciBleHByZXNzaW9ucyBjYW4gYWxzbyBiZSB1c2VkLAotd2l0aCB0aGUgYWRkaXRpb24gb2YKLXRoZSA8Q09ERT5+PC9DT0RFPiBjaGFyYWN0ZXIuIEZvciBleGFtcGxlOjwvUD4KLQotPFBSRT4KLSAgICZsdDtGaWxlcyB+ICZxdW90O1wuKGdpZnxqcGU/Z3xwbmcpJCZxdW90OyZndDsKLTwvUFJFPgotCi13b3VsZCBtYXRjaCBtb3N0IGNvbW1vbiBJbnRlcm5ldCBncmFwaGljcyBmb3JtYXRzLiBJbiBBcGFjaGUgMS4zIGFuZAotbGF0ZXIsIDxBIEhSRUY9IiNmaWxlc21hdGNoIj4mbHQ7RmlsZXNNYXRjaCZndDs8L0E+IGlzIHByZWZlcnJlZCwKLWhvd2V2ZXIuCi0KLTxQPk5vdGUgdGhhdCB1bmxpa2UgPEEKLUhSRUY9IiNkaXJlY3RvcnkiPjxDT0RFPiZsdDtEaXJlY3RvcnkmZ3Q7PC9DT0RFPjwvQT4gYW5kIDxBCi1IUkVGPSIjbG9jYXRpb24iPjxDT0RFPiZsdDtMb2NhdGlvbiZndDs8L0NPREU+PC9BPiBzZWN0aW9ucywKLTxDT0RFPiZsdDtGaWxlcyZndDs8L0NPREU+IHNlY3Rpb25zIGNhbiBiZSB1c2VkIGluc2lkZSAuaHRhY2Nlc3MKLWZpbGVzLiBUaGlzIGFsbG93cyB1c2VycyB0byBjb250cm9sIGFjY2VzcyB0byB0aGVpciBvd24gZmlsZXMsIGF0IGEKLWZpbGUtYnktZmlsZSBsZXZlbC4KLQotPFA+Ci0KLTxTVFJPTkc+U2VlIGFsc288L1NUUk9ORz46IDxBIEhSRUY9Ii4uL3NlY3Rpb25zLmh0bWwiPkhvdyBEaXJlY3RvcnksCi1Mb2NhdGlvbiBhbmQgRmlsZXMgc2VjdGlvbnMgd29yazwvQT4gZm9yIGFuIGV4cGxhbmF0aW9uIG9mIGhvdyB0aGVzZQotZGlmZmVyZW50IHNlY3Rpb25zIGFyZSBjb21iaW5lZCB3aGVuIGEgcmVxdWVzdCBpcyByZWNlaXZlZAotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJmaWxlc21hdGNoIj4mbHQ7RmlsZXNNYXRjaCZndDs8L0E+PC9IMj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gJmx0O0ZpbGVzTWF0Y2ggPEVNPnJlZ2V4PC9FTT4mZ3Q7Ci0uLi4gJmx0Oy9GaWxlc01hdGNoJmd0OzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gY29yZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUKLTEuMyBhbmQgYWJvdmUuPFA+Ci0KLTxQPlRoZSAmbHQ7RmlsZXNNYXRjaCZndDsgZGlyZWN0aXZlIHByb3ZpZGVzIGZvciBhY2Nlc3MgY29udHJvbCBieQotZmlsZW5hbWUsIGp1c3QgYXMgdGhlIDxBIEhSRUY9IiNmaWxlcyI+Jmx0O0ZpbGVzJmd0OzwvQT4gZGlyZWN0aXZlCi1kb2VzLiBIb3dldmVyLCBpdCBhY2NlcHRzIGEgcmVndWxhciBleHByZXNzaW9uLiBGb3IgZXhhbXBsZTo8L1A+Ci0KLTxQUkU+Ci0gICAmbHQ7RmlsZXNNYXRjaCAmcXVvdDtcLihnaWZ8anBlP2d8cG5nKSQmcXVvdDsmZ3Q7Ci08L1BSRT4KLQotPFA+d291bGQgbWF0Y2ggbW9zdCBjb21tb24gSW50ZXJuZXQgZ3JhcGhpY3MgZm9ybWF0cy48L1A+Ci0KLTxTVFJPTkc+U2VlIGFsc288L1NUUk9ORz46IDxBIEhSRUY9Ii4uL3NlY3Rpb25zLmh0bWwiPkhvdyBEaXJlY3RvcnksCi1Mb2NhdGlvbiBhbmQgRmlsZXMgc2VjdGlvbnMgd29yazwvQT4gZm9yIGFuIGV4cGxhbmF0aW9uIG9mIGhvdyB0aGVzZQotZGlmZmVyZW50IHNlY3Rpb25zIGFyZSBjb21iaW5lZCB3aGVuIGEgcmVxdWVzdCBpcyByZWNlaXZlZAotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJncm91cCI+R3JvdXAgZGlyZWN0aXZlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgR3JvdXB9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEdyb3VwIDxFTT51bml4LWdyb3VwPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+R3JvdXAgIy0xPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmU8UD4KLQotVGhlIEdyb3VwIGRpcmVjdGl2ZSBzZXRzIHRoZSBncm91cCB1bmRlciB3aGljaCB0aGUgc2VydmVyIHdpbGwgYW5zd2VyIHJlcXVlc3RzLgotSW4gb3JkZXIgdG8gdXNlIHRoaXMgZGlyZWN0aXZlLCB0aGUgc3RhbmQtYWxvbmUgc2VydmVyIG11c3QgYmUgcnVuIGluaXRpYWxseQotYXMgcm9vdC4gPEVNPlVuaXgtZ3JvdXA8L0VNPiBpcyBvbmUgb2Y6Ci08REw+Ci08RFQ+QSBncm91cCBuYW1lCi08REQ+UmVmZXJzIHRvIHRoZSBnaXZlbiBncm91cCBieSBuYW1lLgotPERUPiMgZm9sbG93ZWQgYnkgYSBncm91cCBudW1iZXIuCi08REQ+UmVmZXJzIHRvIGEgZ3JvdXAgYnkgaXRzIG51bWJlci4KLTwvREw+Ci0KLUl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IHNldCB1cCBhIG5ldyBncm91cCBzcGVjaWZpY2FsbHkgZm9yIHJ1bm5pbmcgdGhlCi1zZXJ2ZXIuIFNvbWUgYWRtaW5zIHVzZSB1c2VyIDxDT0RFPm5vYm9keTwvQ09ERT4sIGJ1dCB0aGlzIGlzIG5vdCBhbHdheXMKLXBvc3NpYmxlIG9yIGRlc2lyYWJsZS48UD4KLQotTm90ZTogaWYgeW91IHN0YXJ0IHRoZSBzZXJ2ZXIgYXMgYSBub24tcm9vdCB1c2VyLCBpdCB3aWxsIGZhaWwgdG8gY2hhbmdlCi10byB0aGUgc3BlY2lmaWVkIGdyb3VwLCBhbmQgd2lsbCBpbnN0ZWFkIGNvbnRpbnVlIHRvIHJ1biBhcyB0aGUgZ3JvdXAgb2YgdGhlCi1vcmlnaW5hbCB1c2VyLiA8UD4KLQotU3BlY2lhbCBub3RlOiBVc2Ugb2YgdGhpcyBkaXJlY3RpdmUgaW4gJmx0O1ZpcnR1YWxIb3N0Jmd0OyByZXF1aXJlcyBhCi1wcm9wZXJseSBjb25maWd1cmVkIDxBIEhSRUY9Ii4uL3N1ZXhlYy5odG1sIj5zdUVYRUMgd3JhcHBlcjwvQT4uCi1XaGVuIHVzZWQgaW5zaWRlIGEgJmx0O1ZpcnR1YWxIb3N0Jmd0OyBpbiB0aGlzIG1hbm5lciwgb25seSB0aGUgZ3JvdXAKLXRoYXQgQ0dJcyBhcmUgcnVuIGFzIGlzIGFmZmVjdGVkLiAgTm9uLUNHSSByZXF1ZXN0cyBhcmUgc3RpbGwgcHJvY2Vzc2VkCi1hcyB0aGUgZ3JvdXAgc3BlY2lmaWVkIGluIHRoZSBtYWluIEdyb3VwIGRpcmVjdGl2ZS48UD4KLQotU0VDVVJJVFk6IFNlZSA8QSBIUkVGPSIjdXNlciI+VXNlcjwvQT4gZm9yIGEgZGlzY3Vzc2lvbiBvZiB0aGUgc2VjdXJpdHkKLWNvbnNpZGVyYXRpb25zLjxQPjxIUj4KLQotPEgyPjxBIE5BTUU9Imhvc3RuYW1lbG9va3VwcyI+SG9zdE5hbWVMb29rdXBzIGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEhvc3ROYW1lTG9va3Vwc30gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gSG9zdE5hbWVMb29rdXBzIDxFTT5vbiB8IG9mZiB8IGRvdWJsZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPkhvc3ROYW1lTG9va3VwcyBvZmY8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IDxDT0RFPmRvdWJsZTwvQ09ERT4gYXZhaWxhYmxlIG9ubHkgaW4KLUFwYWNoZQotMS4zIGFuZCBhYm92ZS48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gRGVmYXVsdCB3YXMgPENPREU+b248L0NPREU+IHByaW9yIHRvCi1BcGFjaGUgMS4zLjxQPgotCi1UaGlzIGRpcmVjdGl2ZSBlbmFibGVzIEROUyBsb29rdXBzIHNvIHRoYXQgaG9zdCBuYW1lcyBjYW4gYmUgbG9nZ2VkIChhbmQKLXBhc3NlZCB0byBDR0lzL1NTSXMgaW4gPENPREU+UkVNT1RFX0hPU1Q8L0NPREU+KS4KLVRoZSB2YWx1ZSA8Q09ERT5kb3VibGU8L0NPREU+IHJlZmVycyB0byBkb2luZyBkb3VibGUtcmV2ZXJzZSBETlMuCi1UaGF0IGlzLCBhZnRlciBhIHJldmVyc2UgbG9va3VwIGlzIHBlcmZvcm1lZCwgYSBmb3J3YXJkIGxvb2t1cCBpcyB0aGVuCi1wZXJmb3JtZWQgb24gdGhhdCByZXN1bHQuICBBdCBsZWFzdCBvbmUgb2YgdGhlIGlwIGFkZHJlc3NlcyBpbiB0aGUgZm9yd2FyZAotbG9va3VwIG11c3QgbWF0Y2ggdGhlIG9yaWdpbmFsIGFkZHJlc3MuICAoSW4gInRjcHdyYXBwZXJzIiB0ZXJtaW5vbG9neQotdGhpcyBpcyBjYWxsZWQgPENPREU+UEFSQU5PSUQ8L0NPREU+Lik8UD4KLQotUmVnYXJkbGVzcyBvZiB0aGUgc2V0dGluZywgd2hlbiA8QSBIUkVGPSJtb2RfYWNjZXNzLmh0bWwiPm1vZF9hY2Nlc3M8L0E+Ci1pcyB1c2VkIGZvciBjb250cm9sbGluZyBhY2Nlc3MgYnkgaG9zdG5hbWUsIGEgZG91YmxlIHJldmVyc2UgbG9va3VwCi13aWxsIGJlIHBlcmZvcm1lZC4gIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBzZWN1cml0eS4gIE5vdGUgdGhhdCB0aGUKLXJlc3VsdCBvZiB0aGlzIGRvdWJsZS1yZXZlcnNlIGlzbid0IGdlbmVyYWxseSBhdmFpbGFibGUgdW5sZXNzCi15b3Ugc2V0IDxDT0RFPkhvc3RuYW1lTG9va3VwcyBkb3VibGU8L0NPREU+LiAgRm9yIGV4YW1wbGUsIGlmIG9ubHkKLTxDT0RFPkhvc3RuYW1lTG9va3VwcyBvbjwvQ09ERT4gYW5kIGEgcmVxdWVzdCBpcyBtYWRlIHRvIGFuIG9iamVjdCB0aGF0Ci1pcyBwcm90ZWN0ZWQgYnkgaG9zdG5hbWUgcmVzdHJpY3Rpb25zLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlCi1kb3VibGUtcmV2ZXJzZSBmYWlscyBvciBub3QsIENHSXMgd2lsbCBzdGlsbCBiZSBwYXNzZWQgdGhlIHNpbmdsZS1yZXZlcnNlCi1yZXN1bHQgaW4gPENPREU+UkVNT1RFX0hPU1Q8L0NPREU+LjxQPgotCi1UaGUgZGVmYXVsdCBmb3IgdGhpcyBkaXJlY3RpdmUgd2FzIHByZXZpb3VzbHkgPENPREU+b248L0NPREU+IGluCi12ZXJzaW9ucyBvZiBBcGFjaGUgcHJpb3IgdG8gMS4zLiAgSXQgd2FzIGNoYW5nZWQgdG8gPENPREU+b2ZmPC9DT0RFPgotaW4gb3JkZXIgdG8gc2F2ZSB0aGUgbmV0d29yayB0cmFmZmljIGZvciB0aG9zZSBzaXRlcyB0aGF0IGRvbid0IHRydWx5Ci1uZWVkIHRoZSByZXZlcnNlIGxvb2t1cHMgZG9uZS4gIEl0IGlzIGFsc28gYmV0dGVyIGZvciB0aGUgZW5kIHVzZXJzCi1iZWNhdXNlIHRoZXkgZG9uJ3QgaGF2ZSB0byBzdWZmZXIgdGhlIGV4dHJhIGxhdGVuY3kgdGhhdCBhIGxvb2t1cAotZW50YWlscy4KLUhlYXZpbHkgbG9hZGVkIHNpdGVzIHNob3VsZCBsZWF2ZSB0aGlzIGRpcmVjdGl2ZSA8Q09ERT5vZmY8L0NPREU+LCBzaW5jZSBETlMKLWxvb2t1cHMgY2FuIHRha2UgY29uc2lkZXJhYmxlIGFtb3VudHMgb2YgdGltZS4gVGhlIHV0aWxpdHkgPEVNPmxvZ3Jlc29sdmU8L0VNPiwKLXByb3ZpZGVkIGluIHRoZSA8RU0+L3N1cHBvcnQ8L0VNPiBkaXJlY3RvcnksIGNhbiBiZSB1c2VkIHRvIGxvb2sgdXAgaG9zdCBuYW1lcwotZnJvbSBsb2dnZWQgSVAgYWRkcmVzc2VzIG9mZmxpbmUuPFA+PEhSPgotCi08SDI+PEEgTkFNRT0iaWRlbnRpdHljaGVjayI+SWRlbnRpdHlDaGVjayBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBJZGVudGl0eUNoZWNrfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBJZGVudGl0eUNoZWNrIDxFTT5ib29sZWFuPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+SWRlbnRpdHlDaGVjayBvZmY8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlPFA+Ci0KLVRoaXMgZGlyZWN0aXZlIGVuYWJsZXMgUkZDMTQxMy1jb21wbGlhbnQgbG9nZ2luZyBvZiB0aGUgcmVtb3RlIHVzZXIgbmFtZQotZm9yIGVhY2ggY29ubmVjdGlvbiwgd2hlcmUgdGhlIGNsaWVudCBtYWNoaW5lIHJ1bnMgaWRlbnRkIG9yIHNvbWV0aGluZyBzaW1pbGFyLgotVGhpcyBpbmZvcm1hdGlvbiBpcyBsb2dnZWQgaW4gdGhlIGFjY2VzcyBsb2cuIDxFTT5Cb29sZWFuPC9FTT4gaXMgZWl0aGVyCi08Q09ERT5vbjwvQ09ERT4gb3IgPENPREU+b2ZmPC9DT0RFPi48UD4KLQotVGhlIGluZm9ybWF0aW9uIHNob3VsZCBub3QgYmUgdHJ1c3RlZCBpbiBhbnkgd2F5IGV4Y2VwdCBmb3IgcnVkaW1lbnRhcnkgdXNhZ2UKLXRyYWNraW5nLjxQPgotCi1Ob3RlIHRoYXQgdGhpcyBjYW4gY2F1c2Ugc2VyaW91cyBsYXRlbmN5IHByb2JsZW1zIGFjY2Vzc2luZyB5b3VyIHNlcnZlcgotc2luY2UgZXZlcnkgcmVxdWVzdCByZXF1aXJlcyBvbmUgb2YgdGhlc2UgbG9va3VwcyB0byBiZSBwZXJmb3JtZWQuICBXaGVuCi1maXJld2FsbHMgYXJlIGludm9sdmVkIGVhY2ggbG9va3VwIG1pZ2h0IHBvc3NpYmx5IGZhaWwgYW5kIGFkZCAzMCBzZWNvbmRzCi1vZiBsYXRlbmN5IHRvIGVhY2ggaGl0LiAgU28gaW4gZ2VuZXJhbCB0aGlzIGlzIG5vdCB2ZXJ5IHVzZWZ1bCBvbiBwdWJsaWMKLXNlcnZlcnMgYWNjZXNzaWJsZSBmcm9tIHRoZSBJbnRlcm5ldC4KLTxQPjxIUj4KLQotPEgyPjxBIE5BTUU9ImlmZGVmaW5lIj4mbHQ7SWZEZWZpbmUmZ3Q7IGRpcmVjdGl2ZTwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiAmbHQ7SWZEZWZpbmUgWyFdPEVNPnBhcmFtZXRlci1uYW1lPC9FTT4mZ3Q7IDxFTT4uLi48L0VNPgotJmx0Oy9JZkRlZmluZSZndDs8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gTm9uZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBhbGw8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IENvcmU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gJmx0O0lmRGVmaW5lJmd0OyBpcyBvbmx5IGF2YWlsYWJsZSBpbiAKLTEuMy4xIGFuZCBsYXRlci48UD4KLQotPFA+Ci0KLVRoZSAmbHQ7SWZEZWZpbmUgPEVNPnRlc3Q8L0VNPiZndDsuLi4mbHQ7L0lmRGVmaW5lJmd0Owotc2VjdGlvbiBpcyB1c2VkIHRvIG1hcmsgZGlyZWN0aXZlcyB0aGF0IGFyZSBjb25kaXRpb25hbC4gVGhlCi1kaXJlY3RpdmVzIHdpdGhpbiBhbiBJZkRlZmluZSBzZWN0aW9uIGFyZSBvbmx5Ci1wcm9jZXNzZWQgaWYgdGhlIDxFTT50ZXN0PC9FTT4gaXMgdHJ1ZS4gSWYgPEVNPnRlc3Q8L0VNPgotaXMgZmFsc2UsIGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCBtYXJrZXJzCi1pcyBpZ25vcmVkLjxQPgotCi1UaGUgPEVNPnRlc3Q8L0VNPiBpbiB0aGUgJmx0O0lmRGVmaW5lJmd0OyBzZWN0aW9uIGRpcmVjdGl2ZQotY2FuIGJlIG9uZSBvZiB0d28gZm9ybXM6Ci0KLTxVTD4KLTxMST48RU0+cGFyYW1ldGVyLW5hbWU8L0VNPgotPExJPjxDT0RFPiE8L0NPREU+PEVNPnBhcmFtZXRlci1uYW1lPC9FTT4KLTwvVUw+Ci0KLTxQPkluIHRoZSBmb3JtZXIgY2FzZSwgdGhlIGRpcmVjdGl2ZXMgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCBtYXJrZXJzIGFyZQotb25seSBwcm9jZXNzZWQgaWYgdGhlIHBhcmFtZXRlciBuYW1lZCA8RU0+cGFyYW1ldGVyLW5hbWU8L0VNPiBpcyBkZWZpbmVkLgotVGhlIHNlY29uZCBmb3JtYXQgcmV2ZXJzZXMgdGhlIHRlc3QsIGFuZCBvbmx5IHByb2Nlc3NlcyB0aGUgZGlyZWN0aXZlcyBpZgotPEVNPnBhcmFtZXRlci1uYW1lPC9FTT4gaXMgPFNUUk9ORz5ub3Q8L1NUUk9ORz4gZGVmaW5lZC4KLQotPFA+VGhlIDxFTT5wYXJhbWV0ZXItbmFtZTwvRU0+IGFyZ3VtZW50IGlzIGEgZGVmaW5lIGFzIGdpdmVuIG9uIHRoZQotPENPREU+aHR0cGQ8L0NPREU+IGNvbW1hbmQgbGluZSB2aWEgPENPREU+LUQ8L0NPREU+PEVNPnBhcmFtZXRlci08L0VNPiwgYXQgdGhlCi10aW1lIHRoZSBzZXJ2ZXIgd2FzIHN0YXJ0ZWQuCi0KLTxQPiZsdDtJZkRlZmluZSZndDsgc2VjdGlvbnMgYXJlIG5lc3QtYWJsZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50Ci1zaW1wbGUgbXVsdGlwbGUtcGFyYW1ldGVyIHRlc3RzLgotCi1FeGFtcGxlOgotCi08UFJFPgotICAkIGh0dHBkIC1EUmV2ZXJzZVByb3h5IC4uLgotCi0gICMgaHR0cGQuY29uZgotICAmbHQ7SWZEZWZpbmUgUmV2ZXJzZVByb3h5Jmd0OwotICBMb2FkTW9kdWxlIHJld3JpdGVfbW9kdWxlIGxpYmV4ZWMvbW9kX3Jld3JpdGUuc28KLSAgTG9hZE1vZHVsZSBwcm94eV9tb2R1bGUgICBsaWJleGVjL2xpYnByb3h5LnNvCi0gICZsdDsvSWZEZWZpbmUmZ3Q7Ci08L1BSRT4KLQotPFA+IDxIUj4KLQotPEgyPjxBIE5BTUU9ImlmbW9kdWxlIj4mbHQ7SWZNb2R1bGUmZ3Q7IGRpcmVjdGl2ZTwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiAmbHQ7SWZNb2R1bGUgWyFdPEVNPm1vZHVsZS1uYW1lPC9FTT4mZ3Q7Ci0gPEVNPi4uLjwvRU0+Ci0mbHQ7L0lmTW9kdWxlJmd0OzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiBOb25lPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IGFsbDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQ29yZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBJZk1vZHVsZSBpcyBvbmx5IGF2YWlsYWJsZSBpbiAxLjIgYW5kCi1sYXRlci48UD4KLQotPFA+Ci0KLVRoZSAmbHQ7SWZNb2R1bGUgPEVNPnRlc3Q8L0VNPiZndDsuLi4mbHQ7L0lmTW9kdWxlJmd0Owotc2VjdGlvbiBpcyB1c2VkIHRvIG1hcmsgZGlyZWN0aXZlcyB0aGF0IGFyZSBjb25kaXRpb25hbC4gVGhlCi1kaXJlY3RpdmVzIHdpdGhpbiBhbiBJZk1vZHVsZSBzZWN0aW9uIGFyZSBvbmx5Ci1wcm9jZXNzZWQgaWYgdGhlIDxFTT50ZXN0PC9FTT4gaXMgdHJ1ZS4gSWYgPEVNPnRlc3Q8L0VNPgotaXMgZmFsc2UsIGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCBtYXJrZXJzCi1pcyBpZ25vcmVkLjxQPgotCi1UaGUgPEVNPnRlc3Q8L0VNPiBpbiB0aGUgJmx0O0lmTW9kdWxlJmd0OyBzZWN0aW9uIGRpcmVjdGl2ZQotY2FuIGJlIG9uZSBvZiB0d28gZm9ybXM6Ci0KLTxVTD4KLTxMST48RU0+bW9kdWxlIG5hbWU8L0VNPgotPExJPiE8RU0+bW9kdWxlIG5hbWU8L0VNPgotPC9VTD4KLQotPFA+SW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgZGlyZWN0aXZlcyBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIG1hcmtlcnMKLWFyZSBvbmx5IHByb2Nlc3NlZCBpZiB0aGUgbW9kdWxlIG5hbWVkIDxFTT5tb2R1bGUgbmFtZTwvRU0+IGlzIGNvbXBpbGVkCi1pbiB0byBBcGFjaGUuIFRoZSBzZWNvbmQgZm9ybWF0IHJldmVyc2VzIHRoZSB0ZXN0LCBhbmQgb25seSBwcm9jZXNzZXMKLXRoZSBkaXJlY3RpdmVzIGlmIDxFTT5tb2R1bGUgbmFtZTwvRU0+IGlzIDxTVFJPTkc+bm90PC9TVFJPTkc+IGNvbXBpbGVkIGluLgotCi08UD5UaGUgPEVNPm1vZHVsZSBuYW1lPC9FTT4gYXJndW1lbnQgaXMgYSBtb2R1bGUgbmFtZSBhcyBnaXZlbiBhcyB0aGUgZmlsZQotbmFtZSBvZiB0aGUgbW9kdWxlLCBhdCB0aGUgdGltZSBpdCB3YXMgY29tcGlsZWQuIEZvciBleGFtcGxlLAotPENPREU+bW9kX3Jld3JpdGUuYzwvQ09ERT4uCi0KLTxQPiZsdDtJZk1vZHVsZSZndDsgc2VjdGlvbnMgYXJlIG5lc3QtYWJsZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50Ci1zaW1wbGUgbXVsdGlwbGUtbW9kdWxlIHRlc3RzLgotCi08UD4gPEhSPgotCi08SDI+PEEgTkFNRT0iaW5jbHVkZSI+SW5jbHVkZSBkaXJlY3RpdmU8L0E+PC9IMj4KLTxTVFJPTkc+U3ludGF4OjwvU1RST05HPiBJbmNsdWRlIDxFTT5maWxlbmFtZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IENvcmU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gSW5jbHVkZSBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUgMS4zCi1hbmQgbGF0ZXIuCi08UD4KLVRoaXMgZGlyZWN0aXZlIGFsbG93cyBpbmNsdXNpb24gb2Ygb3RoZXIgY29uZmlndXJhdGlvbiBmaWxlcyBmcm9tIHdpdGhpbiB0aGUKLXNlcnZlciBjb25maWd1cmF0aW9uIGZpbGVzLgotCi08UD4gPEhSPgotCi08SDI+PEEgTkFNRT0ia2VlcGFsaXZlIj5LZWVwQWxpdmUgZGlyZWN0aXZlPC9BPjwvSDI+Ci08U1RST05HPlN5bnRheDogKEFwYWNoZSAxLjEpPC9TVFJPTkc+IEtlZXBBbGl2ZSA8RU0+bWF4LXJlcXVlc3RzPC9FTT48QlI+Ci08U1RST05HPkRlZmF1bHQ6IChBcGFjaGUgMS4xKTwvU1RST05HPiA8Q09ERT5LZWVwQWxpdmUgNTwvQ09ERT48QlI+Ci08U1RST05HPlN5bnRheDogKEFwYWNoZSAxLjIpPC9TVFJPTkc+IEtlZXBBbGl2ZSA8RU0+b24vb2ZmPC9FTT48QlI+Ci08U1RST05HPkRlZmF1bHQ6IChBcGFjaGUgMS4yKTwvU1RST05HPiA8Q09ERT5LZWVwQWxpdmUgT248L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IENvcmU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gS2VlcEFsaXZlIGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZQotMS4xIGFuZCBsYXRlci48UD4KLQotVGhpcyBkaXJlY3RpdmUgZW5hYmxlcwotPEEgSFJFRj0iLi4va2VlcGFsaXZlLmh0bWwiPktlZXAtQWxpdmU8L0E+Ci1zdXBwb3J0LgotCi08UD48U1RST05HPkFwYWNoZSAxLjE8L1NUUk9ORz46IFNldCA8RU0+bWF4LXJlcXVlc3RzPC9FTT4KLXRvIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyB5b3Ugd2FudCBBcGFjaGUgdG8gZW50ZXJ0YWluIHBlcgotcmVxdWVzdC4gQSBsaW1pdCBpcyBpbXBvc2VkIHRvIHByZXZlbnQgYSBjbGllbnQgZnJvbSBob2dnaW5nIHlvdXIKLXNlcnZlciByZXNvdXJjZXMuIFNldCB0aGlzIHRvIDxDT0RFPjA8L0NPREU+IHRvIGRpc2FibGUgc3VwcG9ydC4KLQotPFA+PFNUUk9ORz5BcGFjaGUgMS4yIGFuZCBsYXRlcjwvU1RST05HPjogU2V0IHRvICJPbiIgdG8gZW5hYmxlCi1wZXJzaXN0ZW50IGNvbm5lY3Rpb25zLCAiT2ZmIiB0byBkaXNhYmxlLiBTZWUgYWxzbyB0aGUgPEEKLUhSRUY9IiNtYXhrZWVwYWxpdmVyZXF1ZXN0cyI+TWF4S2VlcEFsaXZlUmVxdWVzdHM8L0E+IGRpcmVjdGl2ZS48L1A+PEhSPgotCi08SDI+PEEgTkFNRT0ia2VlcGFsaXZldGltZW91dCI+S2VlcEFsaXZlVGltZW91dCBkaXJlY3RpdmU8L0E+PC9IMj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gS2VlcEFsaXZlVGltZW91dCA8RU0+c2Vjb25kczwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPktlZXBBbGl2ZVRpbWVvdXQgMTU8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IENvcmU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gS2VlcEFsaXZlVGltZW91dCBpcyBvbmx5IGF2YWlsYWJsZSBpbgotQXBhY2hlIDEuMSBhbmQgbGF0ZXIuPFA+Ci0KLVRoZSBudW1iZXIgb2Ygc2Vjb25kcyBBcGFjaGUgd2lsbCB3YWl0IGZvciBhIHN1YnNlcXVlbnQgcmVxdWVzdCBiZWZvcmUKLWNsb3NpbmcgdGhlIGNvbm5lY3Rpb24uIE9uY2UgYSByZXF1ZXN0IGhhcyBiZWVuIHJlY2VpdmVkLCB0aGUgdGltZW91dAotdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZSA8QQotSFJFRj0iI3RpbWVvdXQiPjxDT0RFPlRpbWVvdXQ8L0NPREU+PC9BPiBkaXJlY3RpdmUKLWFwcGxpZXMuCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJsaW1pdCI+Jmx0O0xpbWl0Jmd0OyBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBMaW1pdH0gc2VjdGlvbiBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPgotICZsdDtMaW1pdCA8RU0+bWV0aG9kIG1ldGhvZDwvRU0+IC4uLiAmZ3Q7IC4uLiAmbHQ7L0xpbWl0Jmd0OzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBhbnk8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmU8UD4KLQotQWNjZXNzIGNvbnRyb2xzIGFyZSBub3JtYWxseSBlZmZlY3RpdmUgZm9yIDxTVFJPTkc+YWxsPC9TVFJPTkc+IGFjY2VzcwotbWV0aG9kcywgYW5kIHRoaXMgaXMgdGhlIHVzdWFsIGRlc2lyZWQgYmVoYXZpb3VyLiAgPFNUUk9ORz5JbiB0aGUKLWdlbmVyYWwgY2FzZSwgYWNjZXNzIGNvbnRyb2wgZGlyZWN0aXZlcyBzaG91bGQgbm90IGJlIHBsYWNlZCB3aXRoaW4gYQotPENPREU+Jmx0O2xpbWl0Jmd0OzwvQ09ERT4gc2VjdGlvbi48L1NUUk9ORz4gCi0KLTxQPlRoZSBwdXJwb3NlIG9mIHRoZSAmbHQ7TGltaXQmZ3Q7IGRpcmVjdGl2ZSBpcyB0byByZXN0cmljdCB0aGUgZWZmZWN0Ci1vZiB0aGUgYWNjZXNzIGNvbnRyb2xzIHRvIHRoZSBub21pbmF0ZWQgSFRUUCBtZXRob2RzLiAgRm9yIGFsbCBvdGhlcgotbWV0aG9kcywgdGhlIGFjY2VzcyByZXN0cmljdGlvbnMgdGhhdCBhcmUgZW5jbG9zZWQgaW4gdGhlCi0mbHQ7TGltaXQmZ3Q7IGJyYWNrZXQgPFNUUk9ORz53aWxsIGhhdmUgbm8gZWZmZWN0PC9TVFJPTkc+LiAgVGhlCi1mb2xsb3dpbmcgZXhhbXBsZSBhcHBsaWVzIHRoZSBhY2Nlc3MgY29udHJvbCBvbmx5IHRvIHRoZSBtZXRob2RzIFBPU1QsCi1QVVQsIGFuZCBERUxFVEUsIGxlYXZpbmcgYWxsIG90aGVyIG1ldGhvZHMgdW5wcm90ZWN0ZWQ6Ci0KLTxCTE9DS1FVT1RFPjxDT0RFPgotJmx0O0xpbWl0IFBPU1QgUFVUIERFTEVURSZndDs8QlI+Ci1yZXF1aXJlIHZhbGlkLXVzZXI8QlI+Ci0mbHQ7L0xpbWl0Jmd0OzwvQ09ERT48L0JMT0NLUVVPVEU+Ci0KLVRoZSBtZXRob2QgbmFtZXMgbGlzdGVkIGNhbiBiZSBvbmUgb3IgbW9yZSBvZjogR0VULCBQT1NULCBQVVQsIERFTEVURSwKLUNPTk5FQ1QsIE9QVElPTlMsIFRSQUNFLCBQQVRDSCwgUFJPUEZJTkQsIFBST1BQQVRDSCwgTUtDT0wsIENPUFksCi1NT1ZFLCBMT0NLLCBhbmQgVU5MT0NLLiA8U1RST05HPlRoZSBtZXRob2QgbmFtZSBpcwotY2FzZS1zZW5zaXRpdmUuPC9TVFJPTkc+IElmIEdFVCBpcyB1c2VkIGl0IHdpbGwgYWxzbyByZXN0cmljdCBIRUFECi1yZXF1ZXN0cy4gIAotCi08UD48SFI+Ci0KLTxIMj48QSBOQU1FPSJsaW1pdGV4Y2VwdCI+Jmx0O0xpbWl0RXhjZXB0Jmd0OyBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBMaW1pdEV4Y2VwdH0gc2VjdGlvbiBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPgotICZsdDtMaW1pdEV4Y2VwdCA8RU0+bWV0aG9kIG1ldGhvZDwvRU0+IC4uLiAmZ3Q7IC4uLiAmbHQ7L0xpbWl0RXhjZXB0Jmd0OzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBhbnk8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gQXZhaWxhYmxlIGluIEFwYWNoZSAxLjMuNSBhbmQgbGF0ZXI8UD4KLQotJmx0O0xpbWl0RXhjZXB0Jmd0OyBhbmQgJmx0Oy9MaW1pdEV4Y2VwdCZndDsgYXJlIHVzZWQgdG8gZW5jbG9zZSBhIGdyb3VwIG9mCi1hY2Nlc3MgY29udHJvbCBkaXJlY3RpdmVzIHdoaWNoIHdpbGwgdGhlbiBhcHBseSB0byBhbnkgSFRUUCBhY2Nlc3MgbWV0aG9kCi08U1RST05HPm5vdDwvU1RST05HPiBsaXN0ZWQgaW4gdGhlIGFyZ3VtZW50czsgaS5lLiwgaXQgaXMgdGhlIG9wcG9zaXRlIG9mIGEKLTxBIEhSRUY9IiNsaW1pdCI+Jmx0O0xpbWl0Jmd0OzwvQT4gc2VjdGlvbiBhbmQgY2FuIGJlIHVzZWQgdG8gY29udHJvbCBib3RoCi1zdGFuZGFyZCBhbmQgbm9uc3RhbmRhcmQvdW5yZWNvZ25pemVkIG1ldGhvZHMuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgCi08QSBIUkVGPSIjbGltaXQiPiZsdDtMaW1pdCZndDs8L0E+IGZvciBtb3JlIGRldGFpbHMuCi0KLTxQPjxIUj4KLQotPEgyPjxBIE5BTUU9ImxpbWl0cmVxdWVzdGJvZHkiPkxpbWl0UmVxdWVzdEJvZHkgZGlyZWN0aXZlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgTGltaXRSZXF1ZXN0Qm9keX0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gTGltaXRSZXF1ZXN0Qm9keSA8RU0+bnVtYmVyPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+TGltaXRSZXF1ZXN0Qm9keSAwPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwKLS5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gY29yZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBMaW1pdFJlcXVlc3RCb2R5IGlzIG9ubHkgYXZhaWxhYmxlIGluCi1BcGFjaGUgMS4zLjIgYW5kIGxhdGVyLgotPFA+Ci0KLTxFTT5OdW1iZXI8L0VNPiBpcyBhIGxvbmcgaW50ZWdlciBmcm9tIDAgKG1lYW5pbmcgdW5saW1pdGVkKSB0byAyMTQ3NDgzNjQ3Ci0oMkdCKS4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGRlZmluZWQgYnkgdGhlIGNvbXBpbGUtdGltZSBjb25zdGFudAotPENPREU+REVGQVVMVF9MSU1JVF9SRVFVRVNUX0JPRFk8L0NPREU+ICgwIGFzIGRpc3RyaWJ1dGVkKS4KLTxQPgotCi1UaGUgTGltaXRSZXF1ZXN0Qm9keSBkaXJlY3RpdmUgYWxsb3dzIHRoZSB1c2VyIHRvIHNldCBhCi1saW1pdCBvbiB0aGUgYWxsb3dlZCBzaXplIG9mIGFuIEhUVFAgcmVxdWVzdCBtZXNzYWdlIGJvZHkgd2l0aGluCi10aGUgY29udGV4dCBpbiB3aGljaCB0aGUgZGlyZWN0aXZlIGlzIGdpdmVuIChzZXJ2ZXIsIHBlci1kaXJlY3RvcnksCi1wZXItZmlsZSBvciBwZXItbG9jYXRpb24pLiAgSWYgdGhlIGNsaWVudCByZXF1ZXN0IGV4Y2VlZHMgdGhhdCBsaW1pdCwKLXRoZSBzZXJ2ZXIgd2lsbCByZXR1cm4gYW4gZXJyb3IgcmVzcG9uc2UgaW5zdGVhZCBvZiBzZXJ2aWNpbmcgdGhlIHJlcXVlc3QuCi1UaGUgc2l6ZSBvZiBhIG5vcm1hbCByZXF1ZXN0IG1lc3NhZ2UgYm9keSB3aWxsIHZhcnkgZ3JlYXRseSBkZXBlbmRpbmcKLW9uIHRoZSBuYXR1cmUgb2YgdGhlIHJlc291cmNlIGFuZCB0aGUgbWV0aG9kcyBhbGxvd2VkIG9uIHRoYXQgcmVzb3VyY2UuCi1DR0kgc2NyaXB0cyB0eXBpY2FsbHkgdXNlIHRoZSBtZXNzYWdlIGJvZHkgZm9yIHBhc3NpbmcgZm9ybSBpbmZvcm1hdGlvbgotdG8gdGhlIHNlcnZlci4gIEltcGxlbWVudGF0aW9ucyBvZiB0aGUgUFVUIG1ldGhvZCB3aWxsIHJlcXVpcmUgYSB2YWx1ZQotYXQgbGVhc3QgYXMgbGFyZ2UgYXMgYW55IHJlcHJlc2VudGF0aW9uIHRoYXQgdGhlIHNlcnZlciB3aXNoZXMKLXRvIGFjY2VwdCBmb3IgdGhhdCByZXNvdXJjZS4KLTxQPgotCi1UaGlzIGRpcmVjdGl2ZSBnaXZlcyB0aGUgc2VydmVyIGFkbWluaXN0cmF0b3IgZ3JlYXRlciBjb250cm9sIG92ZXIgYWJub3JtYWwKLWNsaWVudCByZXF1ZXN0IGJlaGF2aW9yLCB3aGljaCBtYXkgYmUgdXNlZnVsIGZvciBhdm9pZGluZyBzb21lIGZvcm1zCi1vZiBkZW5pYWwtb2Ytc2VydmljZSBhdHRhY2tzLgotPFA+Ci0KLTxQPjxIUj4KLQotPEgyPjxBIE5BTUU9ImxpbWl0cmVxdWVzdGZpZWxkcyI+TGltaXRSZXF1ZXN0RmllbGRzIGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IExpbWl0UmVxdWVzdEZpZWxkc30gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gTGltaXRSZXF1ZXN0RmllbGRzIDxFTT5udW1iZXI8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5MaW1pdFJlcXVlc3RGaWVsZHMgMTAwPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IExpbWl0UmVxdWVzdEZpZWxkcyBpcyBvbmx5IGF2YWlsYWJsZSBpbgotQXBhY2hlIDEuMy4yIGFuZCBsYXRlci4KLTxQPgotCi08RU0+TnVtYmVyPC9FTT4gaXMgYW4gaW50ZWdlciBmcm9tIDAgKG1lYW5pbmcgdW5saW1pdGVkKSB0byAzMjc2Ny4KLVRoZSBkZWZhdWx0IHZhbHVlIGlzIGRlZmluZWQgYnkgdGhlIGNvbXBpbGUtdGltZSBjb25zdGFudAotPENPREU+REVGQVVMVF9MSU1JVF9SRVFVRVNUX0ZJRUxEUzwvQ09ERT4gKDEwMCBhcyBkaXN0cmlidXRlZCkuCi08UD4KLQotVGhlIExpbWl0UmVxdWVzdEZpZWxkcyBkaXJlY3RpdmUgYWxsb3dzIHRoZSBzZXJ2ZXIgYWRtaW5pc3RyYXRvciB0byBtb2RpZnkKLXRoZSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHJlcXVlc3QgaGVhZGVyIGZpZWxkcyBhbGxvd2VkIGluIGFuIEhUVFAgcmVxdWVzdC4KLUEgc2VydmVyIG5lZWRzIHRoaXMgdmFsdWUgdG8gYmUgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBmaWVsZHMgdGhhdCBhCi1ub3JtYWwgY2xpZW50IHJlcXVlc3QgbWlnaHQgaW5jbHVkZS4gIFRoZSBudW1iZXIgb2YgcmVxdWVzdCBoZWFkZXIgZmllbGRzCi11c2VkIGJ5IGEgY2xpZW50IHJhcmVseSBleGNlZWRzIDIwLCBidXQgdGhpcyBtYXkgdmFyeSBhbW9uZyBkaWZmZXJlbnQKLWNsaWVudCBpbXBsZW1lbnRhdGlvbnMsIG9mdGVuIGRlcGVuZGluZyB1cG9uIHRoZSBleHRlbnQgdG8gd2hpY2ggYSB1c2VyCi1oYXMgY29uZmlndXJlZCB0aGVpciBicm93c2VyIHRvIHN1cHBvcnQgZGV0YWlsZWQgY29udGVudCBuZWdvdGlhdGlvbi4KLU9wdGlvbmFsIEhUVFAgZXh0ZW5zaW9ucyBhcmUgb2Z0ZW4gZXhwcmVzc2VkIHVzaW5nIHJlcXVlc3QgaGVhZGVyIGZpZWxkcy4KLTxQPgotCi1UaGlzIGRpcmVjdGl2ZSBnaXZlcyB0aGUgc2VydmVyIGFkbWluaXN0cmF0b3IgZ3JlYXRlciBjb250cm9sIG92ZXIgYWJub3JtYWwKLWNsaWVudCByZXF1ZXN0IGJlaGF2aW9yLCB3aGljaCBtYXkgYmUgdXNlZnVsIGZvciBhdm9pZGluZyBzb21lIGZvcm1zCi1vZiBkZW5pYWwtb2Ytc2VydmljZSBhdHRhY2tzLiAgVGhlIHZhbHVlIHNob3VsZCBiZSBpbmNyZWFzZWQgaWYgbm9ybWFsCi1jbGllbnRzIHNlZSBhbiBlcnJvciByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgdGhhdCBpbmRpY2F0ZXMgdG9vIG1hbnkKLWZpZWxkcyB3ZXJlIHNlbnQgaW4gdGhlIHJlcXVlc3QuPFA+Ci0KLTxQPjxIUj4KLQotPEgyPjxBIE5BTUU9ImxpbWl0cmVxdWVzdGZpZWxkc2l6ZSI+TGltaXRSZXF1ZXN0RmllbGRzaXplIGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IExpbWl0UmVxdWVzdEZpZWxkc2l6ZX0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gTGltaXRSZXF1ZXN0RmllbGRzaXplIDxFTT5udW1iZXI8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5MaW1pdFJlcXVlc3RGaWVsZHNpemUgODE5MDwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gY29yZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBMaW1pdFJlcXVlc3RGaWVsZHNpemUgaXMgb25seSBhdmFpbGFibGUgaW4KLUFwYWNoZSAxLjMuMiBhbmQgbGF0ZXIuCi08UD4KLQotPEVNPk51bWJlcjwvRU0+IGlzIGFuIGludGVnZXIgc2l6ZSBpbiBieXRlcyBmcm9tIDAgdG8gdGhlIHZhbHVlIG9mIHRoZQotY29tcGlsZS10aW1lIGNvbnN0YW50IDxDT0RFPkRFRkFVTFRfTElNSVRfUkVRVUVTVF9GSUVMRFNJWkU8L0NPREU+Ci0oODE5MCBhcyBkaXN0cmlidXRlZCkuCi08UD4KLQotVGhlIExpbWl0UmVxdWVzdEZpZWxkc2l6ZSBkaXJlY3RpdmUgYWxsb3dzIHRoZSBzZXJ2ZXIgYWRtaW5pc3RyYXRvciB0byByZWR1Y2UKLXRoZSBsaW1pdCBvbiB0aGUgYWxsb3dlZCBzaXplIG9mIGFuIEhUVFAgcmVxdWVzdCBoZWFkZXIgZmllbGQgYmVsb3cgdGhlCi1ub3JtYWwgaW5wdXQgYnVmZmVyIHNpemUgY29tcGlsZWQgd2l0aCB0aGUgc2VydmVyLiAgQSBzZXJ2ZXIgbmVlZHMgdGhpcwotdmFsdWUgdG8gYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYW55IG9uZSBoZWFkZXIgZmllbGQgZnJvbSBhIG5vcm1hbCBjbGllbnQKLXJlcXVlc3QuICBUaGUgc2l6ZSBvZiBhIG5vcm1hbCByZXF1ZXN0IGhlYWRlciBmaWVsZCB3aWxsIHZhcnkgZ3JlYXRseQotYW1vbmcgZGlmZmVyZW50IGNsaWVudCBpbXBsZW1lbnRhdGlvbnMsIG9mdGVuIGRlcGVuZGluZyB1cG9uIHRoZSBleHRlbnQKLXRvIHdoaWNoIGEgdXNlciBoYXMgY29uZmlndXJlZCB0aGVpciBicm93c2VyIHRvIHN1cHBvcnQgZGV0YWlsZWQKLWNvbnRlbnQgbmVnb3RpYXRpb24uCi08UD4KLQotVGhpcyBkaXJlY3RpdmUgZ2l2ZXMgdGhlIHNlcnZlciBhZG1pbmlzdHJhdG9yIGdyZWF0ZXIgY29udHJvbCBvdmVyIGFibm9ybWFsCi1jbGllbnQgcmVxdWVzdCBiZWhhdmlvciwgd2hpY2ggbWF5IGJlIHVzZWZ1bCBmb3IgYXZvaWRpbmcgc29tZSBmb3Jtcwotb2YgZGVuaWFsLW9mLXNlcnZpY2UgYXR0YWNrcy4gIFVuZGVyIG5vcm1hbCBjb25kaXRpb25zLCB0aGUgdmFsdWUgc2hvdWxkCi1ub3QgYmUgY2hhbmdlZCBmcm9tIHRoZSBkZWZhdWx0LjxQPgotCi08UD48SFI+Ci0KLTxIMj48QSBOQU1FPSJsaW1pdHJlcXVlc3RsaW5lIj5MaW1pdFJlcXVlc3RMaW5lIGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IExpbWl0UmVxdWVzdExpbmV9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IExpbWl0UmVxdWVzdExpbmUgPEVNPm51bWJlcjwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPkxpbWl0UmVxdWVzdExpbmUgODE5MDwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gY29yZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBMaW1pdFJlcXVlc3RMaW5lIGlzIG9ubHkgYXZhaWxhYmxlIGluCi1BcGFjaGUgMS4zLjIgYW5kIGxhdGVyLgotPFA+Ci0KLTxFTT5OdW1iZXI8L0VNPiBpcyBhbiBpbnRlZ2VyIHNpemUgaW4gYnl0ZXMgZnJvbSAwIHRvIHRoZSB2YWx1ZSBvZiB0aGUKLWNvbXBpbGUtdGltZSBjb25zdGFudCA8Q09ERT5ERUZBVUxUX0xJTUlUX1JFUVVFU1RfTElORTwvQ09ERT4KLSg4MTkwIGFzIGRpc3RyaWJ1dGVkKS4KLTxQPgotCi1UaGUgTGltaXRSZXF1ZXN0TGluZSBkaXJlY3RpdmUgYWxsb3dzIHRoZSBzZXJ2ZXIgYWRtaW5pc3RyYXRvciB0byByZWR1Y2UKLXRoZSBsaW1pdCBvbiB0aGUgYWxsb3dlZCBzaXplIG9mIGEgY2xpZW50J3MgSFRUUCByZXF1ZXN0LWxpbmUgYmVsb3cgdGhlCi1ub3JtYWwgaW5wdXQgYnVmZmVyIHNpemUgY29tcGlsZWQgd2l0aCB0aGUgc2VydmVyLiAgU2luY2UgdGhlIHJlcXVlc3QtbGluZQotY29uc2lzdHMgb2YgdGhlIEhUVFAgbWV0aG9kLCBVUkksIGFuZCBwcm90b2NvbCB2ZXJzaW9uLCB0aGUKLUxpbWl0UmVxdWVzdExpbmUgZGlyZWN0aXZlIHBsYWNlcyBhIHJlc3RyaWN0aW9uIG9uIHRoZSBsZW5ndGggb2YgYQotcmVxdWVzdC1VUkkgYWxsb3dlZCBmb3IgYSByZXF1ZXN0IG9uIHRoZSBzZXJ2ZXIuICBBIHNlcnZlciBuZWVkcyB0aGlzCi12YWx1ZSB0byBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbnkgb2YgaXRzIHJlc291cmNlIG5hbWVzLCBpbmNsdWRpbmcKLWFueSBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGJlIHBhc3NlZCBpbiB0aGUgcXVlcnkgcGFydCBvZiBhIEdFVCByZXF1ZXN0LgotPFA+Ci0KLVRoaXMgZGlyZWN0aXZlIGdpdmVzIHRoZSBzZXJ2ZXIgYWRtaW5pc3RyYXRvciBncmVhdGVyIGNvbnRyb2wgb3ZlciBhYm5vcm1hbAotY2xpZW50IHJlcXVlc3QgYmVoYXZpb3IsIHdoaWNoIG1heSBiZSB1c2VmdWwgZm9yIGF2b2lkaW5nIHNvbWUgZm9ybXMKLW9mIGRlbmlhbC1vZi1zZXJ2aWNlIGF0dGFja3MuICBVbmRlciBub3JtYWwgY29uZGl0aW9ucywgdGhlIHZhbHVlIHNob3VsZAotbm90IGJlIGNoYW5nZWQgZnJvbSB0aGUgZGVmYXVsdC48UD4KLQotPFA+PEhSPgotCi08SDI+PEEgTkFNRT0ibGlzdGVuIj5MaXN0ZW4gZGlyZWN0aXZlPC9BPjwvSDI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+Ci1MaXN0ZW4gWzxFTT5JUCBhZGRyZXNzPC9FTT46XTxFTT5wb3J0IG51bWJlcjwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gTGlzdGVuIGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZQotMS4xIGFuZCBsYXRlci48UD4KLQotPFA+VGhlIExpc3RlbiBkaXJlY3RpdmUgaW5zdHJ1Y3RzIEFwYWNoZSB0byBsaXN0ZW4gdG8gbW9yZSB0aGFuIG9uZSBJUAotYWRkcmVzcyBvciBwb3J0OyBieSBkZWZhdWx0IGl0IHJlc3BvbmRzIHRvIHJlcXVlc3RzIG9uIGFsbCBJUAotaW50ZXJmYWNlcywgYnV0IG9ubHkgb24gdGhlIHBvcnQgZ2l2ZW4gYnkgdGhlIDxDT0RFPjxBCi1IUkVGPSIjcG9ydCI+UG9ydDwvQT48L0NPREU+IGRpcmVjdGl2ZS48L1A+Ci0KLTxUVD5MaXN0ZW48L1RUPiBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIDxUVD48QQotSFJFRj0iI2JpbmRhZGRyZXNzIj5CaW5kQWRkcmVzczwvQT48L1RUPiBhbmQgPFRUPlBvcnQ8L1RUPi4gSXQgdGVsbHMKLXRoZSBzZXJ2ZXIgdG8gYWNjZXB0IGluY29taW5nIHJlcXVlc3RzIG9uIHRoZSBzcGVjaWZpZWQgcG9ydCBvcgotYWRkcmVzcy1hbmQtcG9ydCBjb21iaW5hdGlvbi4gSWYgdGhlIGZpcnN0IGZvcm1hdCBpcyB1c2VkLCB3aXRoIGEgcG9ydAotbnVtYmVyIG9ubHksIHRoZSBzZXJ2ZXIgbGlzdGVucyB0byB0aGUgZ2l2ZW4gcG9ydCBvbiBhbGwgaW50ZXJmYWNlcywKLWluc3RlYWQgb2YgdGhlIHBvcnQgZ2l2ZW4gYnkgdGhlIDxUVD5Qb3J0PC9UVD4gZGlyZWN0aXZlLiBJZiBhbiBJUAotYWRkcmVzcyBpcyBnaXZlbiBhcyB3ZWxsIGFzIGEgcG9ydCwgdGhlIHNlcnZlciB3aWxsIGxpc3RlbiBvbiB0aGUKLWdpdmVuIHBvcnQgYW5kIGludGVyZmFjZS4gIDxQPgotCi1Ob3RlIHRoYXQgeW91IG1heSBzdGlsbCByZXF1aXJlIGEgPFRUPlBvcnQ8L1RUPiBkaXJlY3RpdmUgc28KLXRoYXQgVVJMcyB0aGF0IEFwYWNoZSBnZW5lcmF0ZXMgdGhhdCBwb2ludCB0byB5b3VyIHNlcnZlciBzdGlsbAotd29yay48UD4KLQotTXVsdGlwbGUgTGlzdGVuIGRpcmVjdGl2ZXMgbWF5IGJlIHVzZWQKLXRvIHNwZWNpZnkgYSBudW1iZXIgb2YgYWRkcmVzc2VzIGFuZCBwb3J0cyB0byBsaXN0ZW4gdG8uIFRoZSBzZXJ2ZXIKLXdpbGwgcmVzcG9uZCB0byByZXF1ZXN0cyBmcm9tIGFueSBvZiB0aGUgbGlzdGVkIGFkZHJlc3NlcyBhbmQKLXBvcnRzLiAKLTxQPgotCi1Gb3IgZXhhbXBsZSwgdG8gbWFrZSB0aGUgc2VydmVyIGFjY2VwdCBjb25uZWN0aW9ucyBvbiBib3RoIHBvcnQKLTgwIGFuZCBwb3J0IDgwMDAsIHVzZToKLTxQUkU+Ci0gICBMaXN0ZW4gODAKLSAgIExpc3RlbiA4MDAwCi08L1BSRT4KLQotVG8gbWFrZSB0aGUgc2VydmVyIGFjY2VwdCBjb25uZWN0aW9ucyBvbiB0d28gc3BlY2lmaWVkCi1pbnRlcmZhY2VzIGFuZCBwb3J0IG51bWJlcnMsIHVzZQotPFBSRT4KLSAgIExpc3RlbiAxOTIuMTcwLjIuMTo4MAotICAgTGlzdGVuIDE5Mi4xNzAuMi41OjgwMDAKLTwvUFJFPgotCi08UD48U1RST05HPlNlZSBBbHNvOjwvU1RST05HPgotPEEgSFJFRj0iLi4vZG5zLWNhdmVhdHMuaHRtbCI+RE5TIElzc3VlczwvQT48QlI+Ci08U1RST05HPlNlZSBBbHNvOjwvU1RST05HPgotPEEgSFJFRj0iLi4vYmluZC5odG1sIj5TZXR0aW5nIHdoaWNoIGFkZHJlc3NlcyBhbmQgcG9ydHMgQXBhY2hlIHVzZXM8L0E+PEJSPgotPFNUUk9ORz5TZWUgQWxzbzo8L1NUUk9ORz4KLTxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9pbmZvL2tub3duX2J1Z3MuaHRtbCNsaXN0ZW5idWciPktub3duIEJ1Z3M8L0E+Ci08L1A+Ci08SFI+Ci0KLTxIMj48QSBOQU1FPSJsaXN0ZW5iYWNrbG9nIj5MaXN0ZW5CYWNrbG9nIGRpcmVjdGl2ZTwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBMaXN0ZW5CYWNrbG9nIDxFTT5iYWNrbG9nPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+TGlzdGVuQmFja2xvZyA1MTE8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IENvcmU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gTGlzdGVuQmFja2xvZyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUKLXZlcnNpb25zIGFmdGVyIDEuMi4wLgotCi08UD5UaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHF1ZXVlIG9mIHBlbmRpbmcgY29ubmVjdGlvbnMuICBHZW5lcmFsbHkgbm8KLXR1bmluZyBpcyBuZWVkZWQgb3IgZGVzaXJlZCwgaG93ZXZlciBvbiBzb21lIHN5c3RlbXMgaXQgaXMgZGVzaXJhYmxlCi10byBpbmNyZWFzZSB0aGlzIHdoZW4gdW5kZXIgYSBUQ1AgU1lOIGZsb29kIGF0dGFjay4gIFNlZQotdGhlIGJhY2tsb2cgcGFyYW1ldGVyIHRvIHRoZSA8Q09ERT5saXN0ZW4oMik8L0NPREU+IHN5c3RlbSBjYWxsLgotCi08UD5UaGlzIHdpbGwgb2Z0ZW4gYmUgbGltaXRlZCB0byBhIHNtYWxsZXIgbnVtYmVyIGJ5IHRoZSBvcGVyYXRpbmcKLXN5c3RlbS4gIFRoaXMgdmFyaWVzIGZyb20gT1MgdG8gT1MuICBBbHNvIG5vdGUgdGhhdCBtYW55IE9TZXMgZG8gbm90Ci11c2UgZXhhY3RseSB3aGF0IGlzIHNwZWNpZmllZCBhcyB0aGUgYmFja2xvZywgYnV0IHVzZSBhIG51bWJlciBiYXNlZCBvbgotKGJ1dCBub3JtYWxseSBsYXJnZXIgdGhhbikgd2hhdCBpcyBzZXQuCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJsb2NhdGlvbiI+Jmx0O0xvY2F0aW9uJmd0OyBkaXJlY3RpdmU8L0E+PC9IMj4KLQotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiAmbHQ7TG9jYXRpb24gPEVNPlVSTDwvRU0+Jmd0OwotLi4uICZsdDsvTG9jYXRpb24mZ3Q7PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gY29yZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBMb2NhdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUKLTEuMSBhbmQgbGF0ZXIuPFA+Ci0KLTxQPlRoZSAmbHQ7TG9jYXRpb24mZ3Q7IGRpcmVjdGl2ZSBwcm92aWRlcyBmb3IgYWNjZXNzIGNvbnRyb2wgYnkKLVVSTC4gSXQgaXMgc2ltaWxhciB0byB0aGUgPEEKLUhSRUY9IiNkaXJlY3RvcnkiPiZsdDtEaXJlY3RvcnkmZ3Q7PC9BPiBkaXJlY3RpdmUsIGFuZAotc3RhcnRzIGEgc3Vic2VjdGlvbiB3aGljaCBpcyB0ZXJtaW5hdGVkIHdpdGggYSAmbHQ7L0xvY2F0aW9uJmd0OwotZGlyZWN0aXZlLiAgPENPREU+Jmx0O0xvY2F0aW9uJmd0OzwvQ09ERT4gc2VjdGlvbnMgYXJlIHByb2Nlc3NlZCBpbiB0aGUKLW9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUsIGFmdGVyIHRoZQotJmx0O0RpcmVjdG9yeSZndDsgc2VjdGlvbnMgYW5kIDxDT0RFPi5odGFjY2VzczwvQ09ERT4gZmlsZXMgYXJlCi1yZWFkLCBhbmQgYWZ0ZXIgdGhlICZsdDtGaWxlcyZndDsgc2VjdGlvbnMuPC9QPgotCi08UD5Ob3RlIHRoYXQgVVJMcyBkbyBub3QgaGF2ZSB0byBsaW5lIHVwIHdpdGggdGhlIGZpbGVzeXN0ZW0gYXQgYWxsLAotaXQgc2hvdWxkIGJlIGVtcGhhc2l6ZWQgdGhhdCAmbHQ7TG9jYXRpb24mZ3Q7IG9wZXJhdGVzIGNvbXBsZXRlbHkgb3V0c2lkZQotdGhlIGZpbGVzeXN0ZW0uCi0KLTxQPkZvciBhbGwgb3JpZ2luIChub24tcHJveHkpIHJlcXVlc3RzLCB0aGUgVVJMIHRvIGJlIG1hdGNoZWQgaXMKLW9mIHRoZSBmb3JtIDxDT0RFPi9wYXRoLzwvQ09ERT4sIGFuZCB5b3Ugc2hvdWxkIG5vdCBpbmNsdWRlIGFueQotPENPREU+aHR0cDovL3NlcnZlcm5hbWU8L0NPREU+IHByZWZpeC4gIEZvciBwcm94eSByZXF1ZXN0cywgdGhlIFVSTAotdG8gYmUgbWF0Y2hlZCBpcyBvZiB0aGUgZm9ybSA8Q09ERT5zY2hlbWU6Ly9zZXJ2ZXJuYW1lL3BhdGg8L0NPREU+LAotYW5kIHlvdSBtdXN0IGluY2x1ZGUgdGhlIHByZWZpeC4KLQotPFA+VGhlIFVSTCBtYXkgdXNlIHdpbGRjYXJkcyBJbiBhIHdpbGQtY2FyZCBzdHJpbmcsIGA/JyBtYXRjaGVzIGFueQotc2luZ2xlIGNoYXJhY3RlciwgYW5kIGAqJyBtYXRjaGVzIGFueSBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycy4KLQotPFA+PFNUUk9ORz5BcGFjaGUgMS4yIGFuZCBhYm92ZTo8L1NUUk9ORz4KLUV4dGVuZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbnMgY2FuIGFsc28gYmUgdXNlZCwgd2l0aCB0aGUgYWRkaXRpb24gb2YKLXRoZSA8Q09ERT5+PC9DT0RFPiBjaGFyYWN0ZXIuCi0KLUZvciBleGFtcGxlOjwvUD4KLQotPFBSRT4KLSAgICZsdDtMb2NhdGlvbiB+ICZxdW90Oy8oZXh0cmF8c3BlY2lhbCkvZGF0YSZxdW90OyZndDsKLTwvUFJFPgotCi08UD53b3VsZCBtYXRjaCBVUkxzIHRoYXQgY29udGFpbmVkIHRoZSBzdWJzdHJpbmcgIi9leHRyYS9kYXRhIiBvcgotIi9zcGVjaWFsL2RhdGEiLiAgSW4gQXBhY2hlIDEuMyBhbmQgYWJvdmUsIGEgbmV3IGRpcmVjdGl2ZQotPEEgSFJFRj0iI2xvY2F0aW9ubWF0Y2giPiZsdDtMb2NhdGlvbk1hdGNoJmd0OzwvQT4gZXhpc3RzIHdoaWNoCi1iZWhhdmVzIGlkZW50aWNhbCB0byB0aGUgcmVnZXggdmVyc2lvbiBvZgotPENPREU+Jmx0O0xvY2F0aW9uJmd0OzwvQ09ERT4uCi0KLTxQPlRoZSA8Q09ERT5Mb2NhdGlvbjwvQ09ERT4gZnVuY3Rpb25hbGl0eSBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB3aGVuCi1jb21iaW5lZCB3aXRoIHRoZSA8Q09ERT48QQotSFJFRj0ibW9kX21pbWUuaHRtbCNzZXRoYW5kbGVyIj5TZXRIYW5kbGVyPC9BPjwvQ09ERT4gZGlyZWN0aXZlLiBGb3IgZXhhbXBsZSwKLXRvIGVuYWJsZSBzdGF0dXMgcmVxdWVzdHMsIGJ1dCBhbGxvdyB0aGVtIG9ubHkKLWZyb20gYnJvd3NlcnMgYXQgZm9vLmNvbSwgeW91IG1pZ2h0IHVzZToKLQotPFBSRT4KLSAgICAmbHQ7TG9jYXRpb24gL3N0YXR1cyZndDsKLSAgICBTZXRIYW5kbGVyIHNlcnZlci1zdGF0dXMKLSAgICBvcmRlciBkZW55LGFsbG93Ci0gICAgZGVueSBmcm9tIGFsbAotICAgIGFsbG93IGZyb20gLmZvby5jb20KLSAgICAmbHQ7L0xvY2F0aW9uJmd0OwotPC9QUkU+Ci0KLTxQPjxTVFJPTkc+QXBhY2hlIDEuMyBhbmQgYWJvdmUgbm90ZSBhYm91dCAvIChzbGFzaCk8L1NUUk9ORz46ICBUaGUgc2xhc2gKLWNoYXJhY3RlciBoYXMgc3BlY2lhbAotbWVhbmluZyBkZXBlbmRpbmcgb24gd2hlcmUgaW4gYSBVUkwgaXQgYXBwZWFycy4gIFBlb3BsZSBtYXkgYmUgdXNlZAotdG8gaXRzIGJlaGF2aW91ciBpbiB0aGUgZmlsZXN5c3RlbSB3aGVyZSBtdWx0aXBsZSBhZGphY2VudCBzbGFzaGVzIGFyZQotZnJlcXVlbnRseSBjb2xsYXBzZWQgdG8gYSBzaW5nbGUgc2xhc2ggKDxFTT5pLmUuPC9FTT4sIDxDT0RFPi9ob21lLy8vZm9vPC9DT0RFPgotaXMgdGhlIHNhbWUgYXMgPENPREU+L2hvbWUvZm9vPC9DT0RFPikuICBJbiBVUkwtc3BhY2UgdGhpcyBpcyBub3QKLW5lY2Vzc2FyaWx5IHRydWUuICBUaGUgPENPREU+Jmx0O0xvY2F0aW9uTWF0Y2gmZ3Q7PC9DT0RFPiBkaXJlY3RpdmUKLWFuZCB0aGUgcmVnZXggdmVyc2lvbiBvZiA8Q09ERT4mbHQ7TG9jYXRpb24mZ3Q7PC9DT0RFPiByZXF1aXJlIHlvdQotdG8gZXhwbGljaXRseSBzcGVjaWZ5IG11bHRpcGxlIHNsYXNoZXMgaWYgdGhhdCBpcyB5b3VyIGludGVudGlvbi4KLUZvciBleGFtcGxlLCA8Q09ERT4mbHQ7TG9jYXRpb25NYXRjaCBeL2FiYyZndDs8L0NPREU+IHdvdWxkIG1hdGNoIHRoZQotcmVxdWVzdCBVUkwgPENPREU+L2FiYzwvQ09ERT4gYnV0IG5vdCB0aGUgcmVxdWVzdCBVUkwgPENPREU+Ly9hYmM8L0NPREU+LgotVGhlIChub24tcmVnZXgpIDxDT0RFPiZsdDtMb2NhdGlvbiZndDs8L0NPREU+IGRpcmVjdGl2ZSBiZWhhdmVzCi1zaW1pbGFybHkgd2hlbiB1c2VkIGZvciBwcm94eSByZXF1ZXN0cy4gIEJ1dCB3aGVuIChub24tcmVnZXgpCi08Q09ERT4mbHQ7TG9jYXRpb24mZ3Q7PC9DT0RFPiBpcyB1c2VkIGZvciBub24tcHJveHkgcmVxdWVzdHMgaXQgd2lsbAotaW1wbGljaXRseSBtYXRjaCBtdWx0aXBsZSBzbGFzaGVzIHdpdGggYSBzaW5nbGUgc2xhc2guICBGb3IgZXhhbXBsZSwKLWlmIHlvdSBzcGVjaWZ5IDxDT0RFPiZsdDtMb2NhdGlvbiAvYWJjL2RlZiZndDs8L0NPREU+IGFuZCB0aGUgcmVxdWVzdAotaXMgdG8gPENPREU+L2FiYy8vZGVmPC9DT0RFPiB0aGVuIGl0IHdpbGwgbWF0Y2guCi0KLTxQPgotPFNUUk9ORz5TZWUgYWxzbzwvU1RST05HPjogPEEgSFJFRj0iLi4vc2VjdGlvbnMuaHRtbCI+SG93IERpcmVjdG9yeSwKLUxvY2F0aW9uIGFuZCBGaWxlcyBzZWN0aW9ucyB3b3JrPC9BPiBmb3IgYW4gZXhwbGFuYXRpb24gb2YgaG93IHRoZXNlCi1kaWZmZXJlbnQgc2VjdGlvbnMgYXJlIGNvbWJpbmVkIHdoZW4gYSByZXF1ZXN0IGlzIHJlY2VpdmVkCi0KLTxIUj4KLQotPEgyPjxBIE5BTUU9ImxvY2F0aW9ubWF0Y2giPiZsdDtMb2NhdGlvbk1hdGNoJmd0OzwvQT48L0gyPgotCi08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+ICZsdDtMb2NhdGlvbk1hdGNoIDxFTT5yZWdleDwvRU0+Jmd0OwotLi4uICZsdDsvTG9jYXRpb25NYXRjaCZndDs8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IExvY2F0aW9uTWF0Y2ggaXMgb25seSBhdmFpbGFibGUgaW4gCi1BcGFjaGUgMS4zIGFuZCBsYXRlci48UD4KLQotPFA+VGhlICZsdDtMb2NhdGlvbk1hdGNoJmd0OyBkaXJlY3RpdmUgcHJvdmlkZXMgZm9yIGFjY2VzcyBjb250cm9sIGJ5Ci1VUkwsIGluIGFuIGlkZW50aWNhbCBtYW5uZXIgdG8gPEEKLUhSRUY9IiNsb2NhdGlvbiI+Jmx0O0xvY2F0aW9uJmd0OzwvQT4uIEhvd2V2ZXIsIGl0IHRha2VzIGEgcmVndWxhcgotZXhwcmVzc2lvbiBhcyBhbiBhcmd1bWVudCBpbnN0ZWFkIG9mIGEgc2ltcGxlIHN0cmluZy4gRm9yIGV4YW1wbGU6PC9QPgotCi08UFJFPgotICAgJmx0O0xvY2F0aW9uTWF0Y2ggJnF1b3Q7LyhleHRyYXxzcGVjaWFsKS9kYXRhJnF1b3Q7Jmd0OwotPC9QUkU+Ci0KLTxQPndvdWxkIG1hdGNoIFVSTHMgdGhhdCBjb250YWluZWQgdGhlIHN1YnN0cmluZyAiL2V4dHJhL2RhdGEiIG9yCi0iL3NwZWNpYWwvZGF0YSIuPC9QPgotCi08U1RST05HPlNlZSBhbHNvPC9TVFJPTkc+OiA8QSBIUkVGPSIuLi9zZWN0aW9ucy5odG1sIj5Ib3cgRGlyZWN0b3J5LAotTG9jYXRpb24gYW5kIEZpbGVzIHNlY3Rpb25zIHdvcms8L0E+IGZvciBhbiBleHBsYW5hdGlvbiBvZiBob3cgdGhlc2UKLWRpZmZlcmVudCBzZWN0aW9ucyBhcmUgY29tYmluZWQgd2hlbiBhIHJlcXVlc3QgaXMgcmVjZWl2ZWQKLQotPEhSPgotCi08SDI+PEEgTkFNRT0ibG9ja2ZpbGUiPkxvY2tGaWxlIGRpcmVjdGl2ZTwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBMb2NrRmlsZSA8RU0+ZmlsZW5hbWU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5Mb2NrRmlsZSBsb2dzL2FjY2VwdC5sb2NrPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlPFA+Ci0KLVRoZSBMb2NrRmlsZSBkaXJlY3RpdmUgc2V0cyB0aGUgcGF0aCB0byB0aGUgbG9ja2ZpbGUgdXNlZCB3aGVuCi1BcGFjaGUgaXMgY29tcGlsZWQgd2l0aCBlaXRoZXIgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUIG9yCi1VU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQuICBUaGlzIGRpcmVjdGl2ZSBzaG91bGQgbm9ybWFsbHkgYmUKLWxlZnQgYXQgaXRzIGRlZmF1bHQgdmFsdWUuICBUaGUgbWFpbiByZWFzb24gZm9yIGNoYW5naW5nIGl0IGlzIGlmCi10aGUgPENPREU+bG9nczwvQ09ERT4gZGlyZWN0b3J5IGlzIE5GUyBtb3VudGVkLCBzaW5jZSA8U1RST05HPnRoZSBsb2NrZmlsZQotbXVzdCBiZSBzdG9yZWQgb24gYSBsb2NhbCBkaXNrPC9TVFJPTkc+LiAgVGhlIFBJRCBvZiB0aGUgbWFpbgotc2VydmVyIHByb2Nlc3MgaXMgYXV0b21hdGljYWxseSBhcHBlbmRlZCB0byB0aGUgZmlsZW5hbWUuIDxQPgotCi08U1RST05HPlNFQ1VSSVRZOjwvU1RST05HPiBJdCBpcyBiZXN0IHRvIGF2b2lkIHB1dHRpbmcgdGhpcyBmaWxlIGluIGEgCi13b3JsZCB3cml0YWJsZSBkaXJlY3Rvcnkgc3VjaCBhcyA8Q09ERT4vdmFyL3RtcDwvQ09ERT4gYmVjYXVzZSBzb21lb25lIAotY291bGQgY3JlYXRlIGEgZGVuaWFsIG9mIHNlcnZpY2UgYXR0YWNrIGFuZCBwcmV2ZW50IHRoZSBzZXJ2ZXIgZnJvbQotc3RhcnRpbmcgYnkgY3JlYXRpbmcgYSBsb2NrZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIG9uZSB0aGUgCi1zZXJ2ZXIgd2lsbCB0cnkgdG8gY3JlYXRlLjxQPgotCi08UD48SFI+Ci0KLTxIMj48QSBOQU1FPSJsb2dsZXZlbCI+TG9nTGV2ZWwgZGlyZWN0aXZlPC9BPjwvSDI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IExvZ0xldmVsIDxFTT5sZXZlbDwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPkxvZ0xldmVsIGVycm9yPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gTG9nTGV2ZWwgaXMgb25seSBhdmFpbGFibGUgaW4gMS4zIG9yCi1sYXRlci4KLQotPFA+TG9nTGV2ZWwgYWRqdXN0cyB0aGUgdmVyYm9zaXR5IG9mIHRoZSBtZXNzYWdlcyByZWNvcmRlZCBpbiB0aGUKLWVycm9yIGxvZ3MgKHNlZSA8QSBIUkVGPSIjZXJyb3Jsb2ciPkVycm9yTG9nPC9BPiBkaXJlY3RpdmUpLgotVGhlIGZvbGxvd2luZyA8RU0+bGV2ZWw8L0VNPnMgYXJlIGF2YWlsYWJsZSwgaW4gb3JkZXIgb2YKLWRlY3JlYXNpbmcgc2lnbmlmaWNhbmNlOgotCi08UD48VEFCTEU+Ci0gIDxUUj48VEggQUxJR049IkxFRlQiPjxTVFJPTkc+TGV2ZWw8L1NUUk9ORz4KLSAgICAgIDxUSCBBTElHTj0iTEVGVCI+PFNUUk9ORz5EZXNjcmlwdGlvbjwvU1RST05HPgotICA8VFI+PFRIPjxUSCBBTElHTj0iTEVGVCI+PFNUUk9ORz5FeGFtcGxlPC9TVFJPTkc+Ci0gIDxUUj48VEQ+PENPREU+ZW1lcmc8L0NPREU+Ci0gICAgICA8VEQ+RW1lcmdlbmNpZXMgLSBzeXN0ZW0gaXMgdW51c2FibGUuCi0gIDxUUj48VEQ+PFREPiJDaGlsZCBjYW5ub3Qgb3BlbiBsb2NrIGZpbGUuICBFeGl0aW5nIiAgICAKLSAgPFRSPjxURD48Q09ERT5hbGVydDwvQ09ERT4KLSAgICAgIDxURD5BY3Rpb24gbXVzdCBiZSB0YWtlbiBpbW1lZGlhdGVseS4KLSAgPFRSPjxURD48VEQ+ImdldHB3dWlkOiBjb3VsZG4ndCBkZXRlcm1pbmUgdXNlciBuYW1lIGZyb20gdWlkIgotICA8VFI+PFREPjxDT0RFPmNyaXQ8L0NPREU+Ci0gICAgICA8VEQ+Q3JpdGljYWwgQ29uZGl0aW9ucy4KLSAgPFRSPjxURD48VEQ+InNvY2tldDogRmFpbGVkIHRvIGdldCBhIHNvY2tldCwgZXhpdGluZyBjaGlsZCIKLSAgPFRSPjxURD48Q09ERT5lcnJvcjwvQ09ERT4KLSAgICAgIDxURD5FcnJvciBjb25kaXRpb25zLgotICA8VFI+PFREPjxURD4iUHJlbWF0dXJlIGVuZCBvZiBzY3JpcHQgaGVhZGVycyIKLSAgPFRSPjxURD48Q09ERT53YXJuPC9DT0RFPgotICAgICAgPFREPldhcm5pbmcgY29uZGl0aW9ucy4KLSAgPFRSPjxURD48VEQ+ImNoaWxkIHByb2Nlc3MgMTIzNCBkaWQgbm90IGV4aXQsIHNlbmRpbmcgYW5vdGhlciBTSUdIVVAiCi0gIDxUUj48VEQ+PENPREU+bm90aWNlPC9DT0RFPgotICAgICAgPFREPk5vcm1hbCBidXQgc2lnbmlmaWNhbnQgY29uZGl0aW9uLgotICA8VFI+PFREPjxURD4iaHR0cGQ6IGNhdWdodCBTSUdCVVMsIGF0dGVtcHRpbmcgdG8gZHVtcCBjb3JlIGluIC4uLiIKLSAgPFRSPjxURD48Q09ERT5pbmZvPC9DT0RFPgotICAgICAgPFREPkluZm9ybWF0aW9uYWwuCi0gIDxUUj48VEQ+PFREPiJTZXJ2ZXIgc2VlbXMgYnVzeSwgKHlvdSBtYXkgbmVlZCB0byBpbmNyZWFzZSBTdGFydFNlcnZlcnMsIG9yCi0gICAgICAgICAgICAgIE1pbi9NYXhTcGFyZVNlcnZlcnMpLi4uIgotICA8VFI+PFREPjxDT0RFPmRlYnVnPC9DT0RFPgotICAgICAgPFREPkRlYnVnLWxldmVsIG1lc3NhZ2VzCi0gIDxUUj48VEQ+PFREPiJPcGVuaW5nIGNvbmZpZyBmaWxlIC4uLiIKLTwvVEFCTEU+Ci0KLTxQPldoZW4gYSBwYXJ0aWN1bGFyIGxldmVsIGlzIHNwZWNpZmllZCwgbWVzc2FnZXMgZnJvbSBhbGwgb3RoZXIgbGV2ZWxzCi1vZiBoaWdoZXIgc2lnbmlmaWNhbmNlIHdpbGwgYmUgcmVwb3J0ZWQgYXMgd2VsbC4gIDxFTT5FLmcuPC9FTT4sIHdoZW4gCi08Q09ERT5Mb2dMZXZlbCBpbmZvPC9DT0RFPiBpcyBzcGVjaWZpZWQsIHRoZW4gbWVzc2FnZXMgd2l0aCBsb2cgbGV2ZWxzIG9mCi08Q09ERT5ub3RpY2U8L0NPREU+IGFuZCA8Q09ERT53YXJuPC9DT0RFPiB3aWxsIGFsc28gYmUgcG9zdGVkLgotPFA+Ci1Vc2luZyBhIGxldmVsIG9mIGF0IGxlYXN0IDxDT0RFPmNyaXQ8L0NPREU+IGlzIHJlY29tbWVuZGVkLgotPFA+PEhSPgotCi08SDI+PEEgTkFNRT0ibWF4Y2xpZW50cyI+TWF4Q2xpZW50cyBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBNYXhDbGllbnRzfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBNYXhDbGllbnRzIDxFTT5udW1iZXI8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5NYXhDbGllbnRzIDI1NjwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gY29yZTxQPgotCi08UD5UaGUgTWF4Q2xpZW50cyBkaXJlY3RpdmUgc2V0cyB0aGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBzaW11bHRhbmVvdXMKLXJlcXVlc3RzIHRoYXQgY2FuIGJlIHN1cHBvcnRlZDsgbm90IG1vcmUgdGhhbiB0aGlzIG51bWJlciBvZiBjaGlsZCBzZXJ2ZXIKLXByb2Nlc3NlcyB3aWxsIGJlIGNyZWF0ZWQuICBUbyBjb25maWd1cmUgbW9yZSB0aGFuIDI1NiBjbGllbnRzLCB5b3UgbXVzdAotZWRpdCB0aGUgSEFSRF9TRVJWRVJfTElNSVQgZW50cnkgaW4gaHR0cGQuaCBhbmQgcmVjb21waWxlLgotCi08UD5BbnkgY29ubmVjdGlvbiBhdHRlbXB0cyBvdmVyIHRoZSBNYXhDbGllbnRzIGxpbWl0IHdpbGwgbm9ybWFsbHkKLWJlIHF1ZXVlZCwgdXAgdG8gYSBudW1iZXIgYmFzZWQgb24gdGhlIDxBIEhSRUY9IiNsaXN0ZW5iYWNrbG9nIj4KLUxpc3RlbkJhY2tsb2c8L0E+IGRpcmVjdGl2ZS4gIE9uY2UgYSBjaGlsZCBwcm9jZXNzIGlzIGZyZWVkIGF0IHRoZQotZW5kIG9mIGEgZGlmZmVyZW50IHJlcXVlc3QsIHRoZSBjb25uZWN0aW9uIHdpbGwgdGhlbiBiZSBzZXJ2aWNlZC4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0ibWF4a2VlcGFsaXZlcmVxdWVzdHMiPk1heEtlZXBBbGl2ZVJlcXVlc3RzIGRpcmVjdGl2ZTwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBNYXhLZWVwQWxpdmVSZXF1ZXN0cyA8RU0+bnVtYmVyPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+TWF4S2VlcEFsaXZlUmVxdWVzdHMgMTAwPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IE9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZQotMS4yIGFuZCBsYXRlci4KLQotPFA+VGhlIE1heEtlZXBBbGl2ZVJlcXVlc3RzIGRpcmVjdGl2ZSBsaW1pdHMgdGhlIG51bWJlciBvZiByZXF1ZXN0cwotYWxsb3dlZCBwZXIgY29ubmVjdGlvbiB3aGVuIDxBIEhSRUY9IiNrZWVwYWxpdmUiPktlZXBBbGl2ZTwvQT4gaXMKLW9uLiBJZiBpdCBpcyBzZXQgdG8gIjxDT0RFPjA8L0NPREU+IiwgdW5saW1pdGVkIHJlcXVlc3RzIHdpbGwgYmUKLWFsbG93ZWQuIFdlIHJlY29tbWVuZCB0aGF0IHRoaXMgc2V0dGluZyBiZSBrZXB0IHRvIGEgaGlnaCB2YWx1ZSBmb3IKLW1heGltdW0gc2VydmVyIHBlcmZvcm1hbmNlLjwvUD48SFI+Ci0KLTxIMj48QSBOQU1FPSJtYXhyZXF1ZXN0c3BlcmNoaWxkIj5NYXhSZXF1ZXN0c1BlckNoaWxkIGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IE1heFJlcXVlc3RzUGVyQ2hpbGR9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IE1heFJlcXVlc3RzUGVyQ2hpbGQgPEVNPm51bWJlcjwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPk1heFJlcXVlc3RzUGVyQ2hpbGQgMDwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gY29yZTxQPgotCi1UaGUgTWF4UmVxdWVzdHNQZXJDaGlsZCBkaXJlY3RpdmUgc2V0cyB0aGUgbGltaXQgb24gdGhlIG51bWJlciBvZiByZXF1ZXN0cwotdGhhdCBhbiBpbmRpdmlkdWFsIGNoaWxkIHNlcnZlciBwcm9jZXNzIHdpbGwgaGFuZGxlLiBBZnRlciBNYXhSZXF1ZXN0c1BlckNoaWxkCi1yZXF1ZXN0cywgdGhlIGNoaWxkIHByb2Nlc3Mgd2lsbCBkaWUuIElmIE1heFJlcXVlc3RzUGVyQ2hpbGQgaXMgMCwgdGhlbgotdGhlIHByb2Nlc3Mgd2lsbCBuZXZlciBleHBpcmUuPFA+Ci0KLVNldHRpbmcgTWF4UmVxdWVzdHNQZXJDaGlsZCB0byBhIG5vbi16ZXJvIGxpbWl0IGhhcyB0d28gYmVuZWZpY2lhbCBlZmZlY3RzOgotPFVMPgotPExJPml0IGxpbWl0cyB0aGUgYW1vdW50IG9mIG1lbW9yeSB0aGF0IHByb2Nlc3MgY2FuIGNvbnN1bWUgYnkgKGFjY2lkZW50YWwpCi1tZW1vcnkgbGVha2FnZTsKLTxMST4gYnkgZ2l2aW5nIHByb2Nlc3NlcyBhIGZpbml0ZSBsaWZldGltZSwgaXQgaGVscHMgcmVkdWNlIHRoZQotbnVtYmVyIG9mIHByb2Nlc3NlcyB3aGVuIHRoZSBzZXJ2ZXIgbG9hZCByZWR1Y2VzLgotPC9VTD4KLQotPFA+VGhpcyBkaXJlY3RpdmUgaGFzIG5vIGVmZmVjdCBvbiBXaW4zMi4KLQotPFA+PFNUUk9ORz5OT1RFOjwvU1RST05HPiBGb3IgPEVNPktlZXBBbGl2ZTwvRU0+IHJlcXVlc3RzLCBvbmx5IHRoZSBmaXJzdAotcmVxdWVzdCBpcyBjb3VudGVkIHRvd2FyZHMgdGhpcyBsaW1pdC4gSW4gZWZmZWN0LCBpdCBjaGFuZ2VzIHRoZQotYmVoYXZpb3IgdG8gbGltaXQgdGhlIG51bWJlciBvZiA8RU0+Y29ubmVjdGlvbnM8L0VNPiBwZXIgY2hpbGQuCi0KLTxQPjxIUj4KLQotPEgyPjxBIE5BTUU9Im1heHNwYXJlc2VydmVycyI+TWF4U3BhcmVTZXJ2ZXJzIGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IE1heFNwYXJlU2VydmVyc30gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gTWF4U3BhcmVTZXJ2ZXJzIDxFTT5udW1iZXI8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5NYXhTcGFyZVNlcnZlcnMgMTA8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmU8UD4KLQotVGhlIE1heFNwYXJlU2VydmVycyBkaXJlY3RpdmUgc2V0cyB0aGUgZGVzaXJlZCBtYXhpbXVtIG51bWJlciBvZiA8RU0+aWRsZTwvRU0+Ci1jaGlsZCBzZXJ2ZXIgcHJvY2Vzc2VzLiBBbiBpZGxlIHByb2Nlc3MgaXMgb25lIHdoaWNoIGlzIG5vdCBoYW5kbGluZwotYSByZXF1ZXN0LiBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIE1heFNwYXJlU2VydmVycyBpZGxlLCB0aGVuIHRoZSBwYXJlbnQKLXByb2Nlc3Mgd2lsbCBraWxsIG9mZiB0aGUgZXhjZXNzIHByb2Nlc3Nlcy48UD4KLQotVHVuaW5nIG9mIHRoaXMgcGFyYW1ldGVyIHNob3VsZCBvbmx5IGJlIG5lY2Vzc2FyeSBvbiB2ZXJ5IGJ1c3kgc2l0ZXMuCi1TZXR0aW5nIHRoaXMgcGFyYW1ldGVyIHRvIGEgbGFyZ2UgbnVtYmVyIGlzIGFsbW9zdCBhbHdheXMgYSBiYWQgaWRlYS48UD4KLQotVGhpcyBkaXJlY3RpdmUgaGFzIG5vIGVmZmVjdCB3aGVuIHVzZWQgd2l0aCB0aGUgQXBhY2hlIFdlYiBzZXJ2ZXIgb24gYQotTWljcm9zb2Z0IFdpbmRvd3MgcGxhdGZvcm0uCi0KLTxQPgotCi1TZWUgYWxzbyA8QSBIUkVGPSIjbWluc3BhcmVzZXJ2ZXJzIj5NaW5TcGFyZVNlcnZlcnM8L0E+IGFuZAotPEEgSFJFRj0iI3N0YXJ0c2VydmVycyI+U3RhcnRTZXJ2ZXJzPC9BPi48UD48SFI+Ci0KLTxIMj48QSBOQU1FPSJtaW5zcGFyZXNlcnZlcnMiPk1pblNwYXJlU2VydmVycyBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBNaW5TcGFyZVNlcnZlcnN9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IE1pblNwYXJlU2VydmVycyA8RU0+bnVtYmVyPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+TWluU3BhcmVTZXJ2ZXJzIDU8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmU8UD4KLQotVGhlIE1pblNwYXJlU2VydmVycyBkaXJlY3RpdmUgc2V0cyB0aGUgZGVzaXJlZCBtaW5pbXVtIG51bWJlciBvZiA8RU0+aWRsZTwvRU0+Ci1jaGlsZCBzZXJ2ZXIgcHJvY2Vzc2VzLiBBbiBpZGxlIHByb2Nlc3MgaXMgb25lIHdoaWNoIGlzIG5vdCBoYW5kbGluZwotYSByZXF1ZXN0LiBJZiB0aGVyZSBhcmUgZmV3ZXIgdGhhbiBNaW5TcGFyZVNlcnZlcnMgaWRsZSwgdGhlbiB0aGUgcGFyZW50Ci1wcm9jZXNzIGNyZWF0ZXMgbmV3IGNoaWxkcmVuIGF0IGEgbWF4aW11bSByYXRlIG9mIDEgcGVyIHNlY29uZC48UD4KLQotVHVuaW5nIG9mIHRoaXMgcGFyYW1ldGVyIHNob3VsZCBvbmx5IGJlIG5lY2Vzc2FyeSBvbiB2ZXJ5IGJ1c3kgc2l0ZXMuCi1TZXR0aW5nIHRoaXMgcGFyYW1ldGVyIHRvIGEgbGFyZ2UgbnVtYmVyIGlzIGFsbW9zdCBhbHdheXMgYSBiYWQgaWRlYS48UD4KLQotVGhpcyBkaXJlY3RpdmUgaGFzIG5vIGVmZmVjdCBvbiBNaWNyb3NvZnQgV2luZG93cy4KLQotPFA+Ci0KLVNlZSBhbHNvIDxBIEhSRUY9IiNtYXhzcGFyZXNlcnZlcnMiPk1heFNwYXJlU2VydmVyczwvQT4gYW5kCi08QSBIUkVGPSIjc3RhcnRzZXJ2ZXJzIj5TdGFydFNlcnZlcnM8L0E+LjxQPjxIUj4KLQotPEgyPjxBIE5BTUU9Im5hbWV2aXJ0dWFsaG9zdCI+TmFtZVZpcnR1YWxIb3N0IGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IE5hbWVWaXJ0dWFsSG9zdH0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gTmFtZVZpcnR1YWxIb3N0IDxFTT5hZGRyPC9FTT5bOjxFTT5wb3J0PC9FTT5dPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gTmFtZVZpcnR1YWxIb3N0IGlzIG9ubHkgYXZhaWxhYmxlIGluCi1BcGFjaGUgMS4zIGFuZCBsYXRlcjxQPgotCi1UaGUgTmFtZVZpcnR1YWxIb3N0IGRpcmVjdGl2ZSBpcyBhIHJlcXVpcmVkIGRpcmVjdGl2ZSBpZiB5b3Ugd2FudCB0byBjb25maWd1cmUKLTxBIEhSRUY9Ii4uL3Zob3N0cy9pbmRleC5odG1sIj5uYW1lLWJhc2VkIHZpcnR1YWwgaG9zdHM8L0E+LjxQPgotCi1BbHRob3VnaCA8RU0+YWRkcjwvRU0+IGNhbiBiZSBob3N0bmFtZSBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBhbHdheXMgdXNlCi1hbiBJUCBhZGRyZXNzLCA8RU0+ZS5nLjwvRU0+Ci0KLTxCTE9DS1FVT1RFPjxDT0RFPk5hbWVWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQ8L0NPREU+PC9CTE9DS1FVT1RFPgotCi1XaXRoIHRoZSBOYW1lVmlydHVhbEhvc3QgZGlyZWN0aXZlIHlvdSBzcGVjaWZ5IHRoZSBhZGRyZXNzIHRvIHdoaWNoIHlvdXIKLW5hbWUtYmFzZWQgdmlydHVhbCBob3N0IG5hbWVzIHJlc29sdmUuICBJZiB5b3UgaGF2ZSBtdWx0aXBsZSBuYW1lLWJhc2VkCi1ob3N0cyBvbiBtdWx0aXBsZSBhZGRyZXNzZXMsIHJlcGVhdCB0aGUgZGlyZWN0aXZlIGZvciBlYWNoIGFkZHJlc3MuPFA+Ci0KLU5vdGU6IHRoZSAibWFpbiBzZXJ2ZXIiIGFuZCBhbnkgX2RlZmF1bHRfIHNlcnZlcnMgd2lsbCA8U1RST05HPm5ldmVyPC9TVFJPTkc+Ci1iZSBzZXJ2ZWQgZm9yIGEgcmVxdWVzdCB0byBhIE5hbWVWaXJ0dWFsSG9zdCBJUCBBZGRyZXNzICh1bmxlc3MgZm9yIHNvbWUKLXJlYXNvbiB5b3Ugc3BlY2lmeSBOYW1lVmlydHVhbEhvc3QgYnV0IHRoZW4gZG9uJ3QgZGVmaW5lIGFueSBWaXJ0dWFsSG9zdHMKLWZvciB0aGF0IGFkZHJlc3MpLjxQPgotCi1PcHRpb25hbGx5IHlvdSBjYW4gc3BlY2lmeSBhIHBvcnQgbnVtYmVyIG9uIHdoaWNoIHRoZSBuYW1lLWJhc2VkCi12aXJ0dWFsIGhvc3RzIHNob3VsZCBiZSB1c2VkLCA8RU0+ZS5nLjwvRU0+Ci0KLTxCTE9DS1FVT1RFPjxDT0RFPk5hbWVWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQ6ODA4MDwvQ09ERT48L0JMT0NLUVVPVEU+Ci0KLTxTVFJPTkc+U2VlIGFsc286PC9TVFJPTkc+Ci08QSBIUkVGPSIuLi92aG9zdHMvaW5kZXguaHRtbCI+QXBhY2hlIFZpcnR1YWwgSG9zdCBkb2N1bWVudGF0aW9uPC9BPgotPEhSPgotPEgyPjxBIE5BTUU9Im9wdGlvbnMiPk9wdGlvbnMgZGlyZWN0aXZlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgT3B0aW9uc30gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gT3B0aW9ucyA8RU0+Wyt8LV1vcHRpb24gWyt8LV1vcHRpb24gLi4uPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksCi0uaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBPcHRpb25zPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlPFA+Ci0KLVRoZSBPcHRpb25zIGRpcmVjdGl2ZSBjb250cm9scyB3aGljaCBzZXJ2ZXIgZmVhdHVyZXMgYXJlIGF2YWlsYWJsZSBpbgotYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeS4KLTxQPgotPEVNPm9wdGlvbjwvRU0+IGNhbiBiZSBzZXQgdG8gPENPREU+Tm9uZTwvQ09ERT4sIGluIHdoaWNoIGNhc2Ugbm9uZSBvZgotdGhlIGV4dHJhIGZlYXR1cmVzIGFyZSBlbmFibGVkLCBvciBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nOgotPERMPgotPERUPkFsbAotPEREPkFsbCBvcHRpb25zIGV4Y2VwdCBmb3IgTXVsdGlWaWV3cy4gVGhpcyBpcyB0aGUgZGVmYXVsdCBzZXR0aW5nLgotPERUPkV4ZWNDR0kKLTxERD4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBFeGVjQ0dJfSBvcHRpb24mZ3Q7IC0tPgotRXhlY3V0aW9uIG9mIENHSSBzY3JpcHRzIGlzIHBlcm1pdHRlZC4KLTxEVD5Gb2xsb3dTeW1MaW5rcwotPEREPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEZvbGxvd1N5bUxpbmtzfSBvcHRpb24mZ3Q7IC0tPgotVGhlIHNlcnZlciB3aWxsIGZvbGxvdyBzeW1ib2xpYyBsaW5rcyBpbiB0aGlzIGRpcmVjdG9yeS4KLTxCUj4KLTxTVFJPTkc+Tm90ZTwvU1RST05HPjogZXZlbiB0aG91Z2ggdGhlIHNlcnZlciBmb2xsb3dzIHRoZSBzeW1saW5rIGl0Ci1kb2VzIDxFTT5ub3Q8L0VNPgotY2hhbmdlIHRoZSBwYXRobmFtZSB1c2VkIHRvIG1hdGNoIGFnYWluc3QgPENPREU+Jmx0O0RpcmVjdG9yeSZndDs8L0NPREU+Ci1zZWN0aW9ucy4KLTxCUj4KLTxTVFJPTkc+Tm90ZTwvU1RST05HPjogdGhpcyBvcHRpb24gZ2V0cyBpZ25vcmVkIGlmIHNldCBpbnNpZGUgYQotJmx0O0xvY2F0aW9uJmd0OyBzZWN0aW9uLgotCi08RFQ+SW5jbHVkZXMKLTxERD4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBJbmNsdWRlc30gb3B0aW9uJmd0OyAtLT4KLVNlcnZlci1zaWRlIGluY2x1ZGVzIGFyZSBwZXJtaXR0ZWQuCi08RFQ+SW5jbHVkZXNOT0VYRUMKLTxERD4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBJbmNsdWRlc05PRVhFQ30gb3B0aW9uJmd0OyAtLT4KLVNlcnZlci1zaWRlIGluY2x1ZGVzIGFyZSBwZXJtaXR0ZWQsIGJ1dCB0aGUgI2V4ZWMgY29tbWFuZCBhbmQKLSNpbmNsdWRlIG9mIENHSSBzY3JpcHRzIGFyZSBkaXNhYmxlZC4KLTxEVD5JbmRleGVzCi08REQ+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgSW5kZXhlc30gb3B0aW9uJmd0OyAtLT4KLUlmIGEgVVJMIHdoaWNoIG1hcHMgdG8gYSBkaXJlY3RvcnkgaXMgcmVxdWVzdGVkLCBhbmQgdGhlIHRoZXJlIGlzIG5vCi1EaXJlY3RvcnlJbmRleCAoPEVNPmUuZy48L0VNPiwgaW5kZXguaHRtbCkgaW4gdGhhdCBkaXJlY3RvcnksIHRoZW4gdGhlIHNlcnZlciB3aWxsCi1yZXR1cm4gYSBmb3JtYXR0ZWQgbGlzdGluZyBvZiB0aGUgZGlyZWN0b3J5LgotPERUPk11bHRpVmlld3MKLTxERD4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBNdWx0aVZpZXdzfSBvcHRpb24mZ3Q7IC0tPgotPEEgSFJFRj0iLi4vY29udGVudC1uZWdvdGlhdGlvbi5odG1sIj5Db250ZW50IG5lZ290aWF0ZWQ8L0E+IE11bHRpVmlld3MgYXJlCi1hbGxvd2VkLgotPERUPlN5bUxpbmtzSWZPd25lck1hdGNoCi08REQ+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgU3ltTGlua3NJZk93bmVyTWF0Y2h9IG9wdGlvbiZndDsgLS0+Ci1UaGUgc2VydmVyIHdpbGwgb25seSBmb2xsb3cgc3ltYm9saWMgbGlua3MgZm9yIHdoaWNoIHRoZSB0YXJnZXQKLWZpbGUgb3IgZGlyZWN0b3J5IGlzIG93bmVkIGJ5IHRoZSBzYW1lIHVzZXIgaWQgYXMgdGhlIGxpbmsuCi08QlI+Ci08U1RST05HPk5vdGU8L1NUUk9ORz46IHRoaXMgb3B0aW9uIGdldHMgaWdub3JlZCBpZiBzZXQgaW5zaWRlIGEKLSZsdDtMb2NhdGlvbiZndDsgc2VjdGlvbi4KLTwvREw+Ci0KLU5vcm1hbGx5LCBpZiBtdWx0aXBsZSA8Q09ERT5PcHRpb25zPC9DT0RFPiBjb3VsZCBhcHBseSB0byBhIGRpcmVjdG9yeSwKLXRoZW4gdGhlIG1vc3Qgc3BlY2lmaWMgb25lIGlzIHRha2VuIGNvbXBsZXRlOyB0aGUgb3B0aW9ucyBhcmUgbm90Ci1tZXJnZWQuIEhvd2V2ZXIgaWYgPEVNPmFsbDwvRU0+IHRoZSBvcHRpb25zIG9uIHRoZSA8Q09ERT5PcHRpb25zPC9DT0RFPgotZGlyZWN0aXZlIGFyZSBwcmVjZWRlZCBieSBhICsgb3IgLSBzeW1ib2wsIHRoZSBvcHRpb25zIGFyZQotbWVyZ2VkLiBBbnkgb3B0aW9ucyBwcmVjZWRlZCBieSBhICsgYXJlIGFkZGVkIHRvIHRoZSBvcHRpb25zCi1jdXJyZW50bHkgaW4gZm9yY2UsIGFuZCBhbnkgb3B0aW9ucyBwcmVjZWRlZCBieSBhIC0gYXJlIHJlbW92ZWQgZnJvbQotdGhlIG9wdGlvbnMgY3VycmVudGx5IGluIGZvcmNlLiAgPFA+Ci0KLUZvciBleGFtcGxlLCB3aXRob3V0IGFueSArIGFuZCAtIHN5bWJvbHM6Ci0KLTxCTE9DS1FVT1RFPjxDT0RFPgotJmx0O0RpcmVjdG9yeSAvd2ViL2RvY3MmZ3Q7IDxCUj4KLU9wdGlvbnMgSW5kZXhlcyBGb2xsb3dTeW1MaW5rczxCUj4KLSZsdDsvRGlyZWN0b3J5Jmd0OzxCUj4KLSZsdDtEaXJlY3RvcnkgL3dlYi9kb2NzL3NwZWMmZ3Q7IDxCUj4KLU9wdGlvbnMgSW5jbHVkZXM8QlI+Ci0mbHQ7L0RpcmVjdG9yeSZndDsKLTwvQ09ERT48L0JMT0NLUVVPVEU+Ci10aGVuIG9ubHkgPENPREU+SW5jbHVkZXM8L0NPREU+IHdpbGwgYmUgc2V0IGZvciB0aGUgL3dlYi9kb2NzL3NwZWMKLWRpcmVjdG9yeS4gSG93ZXZlciBpZiB0aGUgc2Vjb25kIDxDT0RFPk9wdGlvbnM8L0NPREU+IGRpcmVjdGl2ZSB1c2VzIHRoZSArCi1hbmQgLSBzeW1ib2xzOjxQPgotCi08QkxPQ0tRVU9URT48Q09ERT4KLSZsdDtEaXJlY3RvcnkgL3dlYi9kb2NzJmd0OyA8QlI+Ci1PcHRpb25zIEluZGV4ZXMgRm9sbG93U3ltTGlua3M8QlI+Ci0mbHQ7L0RpcmVjdG9yeSZndDs8QlI+Ci0mbHQ7RGlyZWN0b3J5IC93ZWIvZG9jcy9zcGVjJmd0OyA8QlI+Ci1PcHRpb25zICtJbmNsdWRlcyAtSW5kZXhlczxCUj4KLSZsdDsvRGlyZWN0b3J5Jmd0OwotPC9DT0RFPjwvQkxPQ0tRVU9URT4KLXRoZW4gdGhlIG9wdGlvbnMgPENPREU+Rm9sbG93U3ltTGlua3M8L0NPREU+IGFuZCA8Q09ERT5JbmNsdWRlczwvQ09ERT4KLWFyZSBzZXQgZm9yIHRoZSAvd2ViL2RvY3Mvc3BlYyBkaXJlY3RvcnkuPFA+Ci0KLTxTVFJPTkc+Tm90ZTo8L1NUUk9ORz4gVXNpbmcgPENPREU+LUluY2x1ZGVzTk9FWEVDPC9DT0RFPiBvcgotPENPREU+LUluY2x1ZGVzPC9DT0RFPgotZGlzYWJsZXMgc2VydmVyLXNpZGUgaW5jbHVkZXMgY29tcGxldGVseSByZWdhcmRsZXNzIG9mIHRoZSBwcmV2aW91cyBzZXR0aW5nLjxQPgotCi1UaGUgZGVmYXVsdCBpbiB0aGUgYWJzZW5jZSBvZiBhbnkgb3RoZXIgc2V0dGluZ3MgaXMgPENPREU+QWxsPC9DT0RFPi48UD4KLTxIUj4KLQotPEgyPjxBIE5BTUU9InBpZGZpbGUiPlBpZEZpbGUgZGlyZWN0aXZlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgUGlkRmlsZX0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gUGlkRmlsZSA8RU0+ZmlsZW5hbWU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5QaWRGaWxlIGxvZ3MvaHR0cGQucGlkPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlPFA+Ci0KLVRoZSBQaWRGaWxlIGRpcmVjdGl2ZSBzZXRzIHRoZSBmaWxlIHRvIHdoaWNoIHRoZSBzZXJ2ZXIgcmVjb3JkcyB0aGUKLXByb2Nlc3MgaWQgb2YgdGhlIGRhZW1vbi4gSWYgdGhlIGZpbGVuYW1lIGRvZXMgbm90IGJlZ2luIHdpdGggYSBzbGFzaCAoLykKLXRoZW4gaXQgaXMgYXNzdW1lZCB0byBiZSByZWxhdGl2ZSB0byB0aGUgPEEgSFJFRj0iI3NlcnZlcnJvb3QiPlNlcnZlclJvb3Q8L0E+LgotVGhlIFBpZEZpbGUgaXMgb25seSB1c2VkIGluIDxBIEhSRUY9IiNzZXJ2ZXJ0eXBlIj5zdGFuZGFsb25lPC9BPiBtb2RlLjxQPgotCi1JdCBpcyBvZnRlbiB1c2VmdWwgdG8gYmUgYWJsZSB0byBzZW5kIHRoZSBzZXJ2ZXIgYSBzaWduYWwsIHNvIHRoYXQgaXQgY2xvc2VzCi1hbmQgdGhlbiByZW9wZW5zIGl0cyA8QSBIUkVGPSIjZXJyb3Jsb2ciPkVycm9yTG9nPC9BPiBhbmQgVHJhbnNmZXJMb2csIGFuZAotcmUtcmVhZHMgaXRzIGNvbmZpZ3VyYXRpb24gZmlsZXMuIFRoaXMgaXMgZG9uZSBieSBzZW5kaW5nIGEgU0lHSFVQIChraWxsIC0xKQotc2lnbmFsIHRvIHRoZSBwcm9jZXNzIGlkIGxpc3RlZCBpbiB0aGUgUGlkRmlsZS48UD4KLQotVGhlIFBpZEZpbGUgaXMgc3ViamVjdCB0byB0aGUgc2FtZSB3YXJuaW5ncyBhYm91dCBsb2cgZmlsZSBwbGFjZW1lbnQgYW5kCi08QSBIUkVGPSIuLi9taXNjL3NlY3VyaXR5X3RpcHMuaHRtbCNzZXJ2ZXJyb290Ij5zZWN1cml0eTwvQT4uCi0KLTxQPjxIUj4KLQotPEgyPjxBIE5BTUU9InBvcnQiPlBvcnQgZGlyZWN0aXZlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgUG9ydH0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gUG9ydCA8RU0+bnVtYmVyPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+UG9ydCA4MDwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gY29yZTxQPgotCi08RU0+TnVtYmVyPC9FTT4gaXMgYSBudW1iZXIgZnJvbSAwIHRvIDY1NTM1OyBzb21lIHBvcnQgbnVtYmVycwotKGVzcGVjaWFsbHkgYmVsb3cKLTEwMjQpIGFyZSByZXNlcnZlZCBmb3IgcGFydGljdWxhciBwcm90b2NvbHMuIFNlZSA8Q09ERT4vZXRjL3NlcnZpY2VzPC9DT0RFPgotZm9yIGEgbGlzdCBvZiBzb21lIGRlZmluZWQgcG9ydHM7IHRoZSBzdGFuZGFyZCBwb3J0IGZvciB0aGUgaHR0cCBwcm90b2NvbAotaXMgODAuPFA+Ci0KLVRoZSBQb3J0IGRpcmVjdGl2ZSBoYXMgdHdvIGJlaGF2aW9ycywgdGhlIGZpcnN0IG9mIHdoaWNoIGlzIG5lY2Vzc2FyeSBmb3IKLU5DU0EgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKGFuZCB3aGljaCBpcyBjb25mdXNpbmcgaW4gdGhlIGNvbnRleHQgb2YKLUFwYWNoZSkuPFA+Ci0KLTxVTD4KLTxMST4KLUluIHRoZSBhYnNlbmNlIG9mIGFueSA8QSBIUkVGPSIjbGlzdGVuIj5MaXN0ZW48L0E+IG9yCi08QSBIUkVGPSIjYmluZGFkZHJlc3MiPkJpbmRBZGRyZXNzPC9BPiBkaXJlY3RpdmVzIHNwZWNpZnlpbmcgYSBwb3J0IG51bWJlciwKLWEgUG9ydCBkaXJlY3RpdmUgZ2l2ZW4gaW4gdGhlICJtYWluIHNlcnZlciIKLSg8RU0+aS5lLjwvRU0+LCBvdXRzaWRlIGFueSA8QSBIUkVGPSIjdmlydHVhbGhvc3QiPiZsdDtWaXJ0dWFsSG9zdCZndDwvQT4gc2VjdGlvbikKLXNldHMgdGhlIG5ldHdvcmsgcG9ydCBvbiB3aGljaCB0aGUgc2VydmVyIGxpc3RlbnMuCi1JZiB0aGVyZSBhcmUgYW55IExpc3RlbiBvciBCaW5kQWRkcmVzcyBkaXJlY3RpdmVzIHNwZWNpZnlpbmcKLTxDT0RFPjpudW1iZXI8L0NPREU+IHRoZW4gUG9ydCBoYXMgbm8gZWZmZWN0IG9uIHdoYXQgYWRkcmVzcyB0aGUgc2VydmVyCi1saXN0ZW5zIGF0LgotCi08TEk+VGhlIFBvcnQgZGlyZWN0aXZlCi1zZXRzIHRoZSA8Q09ERT5TRVJWRVJfUE9SVDwvQ09ERT4gZW52aXJvbm1lbnQgdmFyaWFibGUgKGZvcgotPEEgSFJFRj0ibW9kX2NnaS5odG1sIj5DR0k8L0E+IGFuZCA8QSBIUkVGPSJtb2RfaW5jbHVkZS5odG1sIj5TU0k8L0E+KSwKLWFuZCBpcyB1c2VkIHdoZW4gdGhlIHNlcnZlciBtdXN0IGdlbmVyYXRlIGEgVVJMIHRoYXQgcmVmZXJzIHRvIGl0c2VsZgotKGZvciBleGFtcGxlIHdoZW4gY3JlYXRpbmcgYW4gZXh0ZXJuYWwgcmVkaXJlY3QgdG8gaXRzZWxmKS4gIFRoaXMKLWJlaGF2aW91ciBpcyBtb2RpZmllZCBieQotPEEgSFJFRj0iI3VzZWNhbm9uaWNhbG5hbWUiPlVzZUNhbm9uaWNhbE5hbWU8L0E+LgotPC9VTD4KLQotSW4gbm8gZXZlbnQgZG9lcyBhIFBvcnQgc2V0dGluZyBhZmZlY3QKLXdoYXQgcG9ydHMgYSA8QSBIUkVGPSIjdmlydHVhbGhvc3QiPlZpcnR1YWxIb3N0PC9BPiByZXNwb25kcyBvbiwgdGhlCi1WaXJ0dWFsSG9zdCBkaXJlY3RpdmUgaXRzZWxmIGlzIHVzZWQgZm9yIHRoYXQuPFA+Ci0KLVRoZSBwcmltYXJ5IGJlaGF2aW91ciBvZiBQb3J0IHNob3VsZCBiZSBjb25zaWRlcmVkIHRvIGJlIHNpbWlsYXIgdG8gdGhhdCBvZgotdGhlIDxBIEhSRUY9IiNzZXJ2ZXJuYW1lIj5TZXJ2ZXJOYW1lPC9BPiBkaXJlY3RpdmUuICBUaGUgU2VydmVyTmFtZQotYW5kIFBvcnQgdG9nZXRoZXIgc3BlY2lmeSB3aGF0IHlvdSBjb25zaWRlciB0byBiZSB0aGUgPEVNPmNhbm9uaWNhbDwvRU0+Ci1hZGRyZXNzIG9mIHRoZSBzZXJ2ZXIuCi0oU2VlIGFsc28gPEEgSFJFRj0iI3VzZWNhbm9uaWNhbG5hbWUiPlVzZUNhbm9uaWNhbE5hbWU8L0E+Lik8UD4KLQotUG9ydCA4MCBpcyBvbmUgb2YgVW5peCdzIHNwZWNpYWwgcG9ydHMuIEFsbCBwb3J0cyBudW1iZXJlZAotYmVsb3cgMTAyNCBhcmUgcmVzZXJ2ZWQgZm9yIHN5c3RlbSB1c2UsIDxFTT5pLmUuPC9FTT4sIHJlZ3VsYXIgKG5vbi1yb290KSB1c2VycyBjYW5ub3QKLW1ha2UgdXNlIG9mIHRoZW07IGluc3RlYWQgdGhleSBjYW4gb25seSB1c2UgaGlnaGVyIHBvcnQgbnVtYmVycy4KLVRvIHVzZSBwb3J0IDgwLCB5b3UgbXVzdCBzdGFydCB0aGUgc2VydmVyIGZyb20gdGhlIHJvb3QgYWNjb3VudC4KLUFmdGVyIGJpbmRpbmcgdG8gdGhlIHBvcnQgYW5kIGJlZm9yZSBhY2NlcHRpbmcgcmVxdWVzdHMsIEFwYWNoZSB3aWxsIGNoYW5nZQotdG8gYSBsb3cgcHJpdmlsZWdlZCB1c2VyIGFzIHNldCBieSB0aGUgPEEgSFJFRj0iI3VzZXIiPlVzZXIgZGlyZWN0aXZlPC9BPi48UD4KLQotSWYgeW91IGNhbm5vdCB1c2UgcG9ydCA4MCwgY2hvb3NlIGFueSBvdGhlciB1bnVzZWQgcG9ydC4gTm9uLXJvb3QgdXNlcnMKLXdpbGwgaGF2ZSB0byBjaG9vc2UgYSBwb3J0IG51bWJlciBoaWdoZXIgdGhhbiAxMDIzLCBzdWNoIGFzIDgwMDAuPFA+Ci0KLVNFQ1VSSVRZOiBpZiB5b3UgZG8gc3RhcnQgdGhlIHNlcnZlciBhcyByb290LCBiZSBzdXJlCi1ub3QgdG8gc2V0IDxBIEhSRUY9IiN1c2VyIj5Vc2VyPC9BPiB0byByb290LiBJZiB5b3UgcnVuIHRoZSBzZXJ2ZXIgYXMKLXJvb3Qgd2hpbHN0IGhhbmRsaW5nIGNvbm5lY3Rpb25zLCB5b3VyIHNpdGUgbWF5IGJlIG9wZW4gdG8gYSBtYWpvciBzZWN1cml0eQotYXR0YWNrLjxQPjxIUj4KLQotPEgyPjxBIE5BTUU9InJlcXVpcmUiPnJlcXVpcmUgZGlyZWN0aXZlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgcmVxdWlyZX0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gcmVxdWlyZSA8RU0+ZW50aXR5LW5hbWUgZW50aXR5IGVudGl0eS4uLjwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IGRpcmVjdG9yeSwgLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gQXV0aENvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gY29yZTxQPgotCi1UaGlzIGRpcmVjdGl2ZSBzZWxlY3RzIHdoaWNoIGF1dGhlbnRpY2F0ZWQgdXNlcnMgY2FuIGFjY2VzcyBhIGRpcmVjdG9yeS4KLVRoZSBhbGxvd2VkIHN5bnRheGVzIGFyZToKLTxVTD4KLTxMST5yZXF1aXJlIHVzZXIgPEVNPnVzZXJpZCB1c2VyaWQgLi4uPC9FTT48UD4KLU9ubHkgdGhlIG5hbWVkIHVzZXJzIGNhbiBhY2Nlc3MgdGhlIGRpcmVjdG9yeS48UD4KLTxMST5yZXF1aXJlIGdyb3VwIDxFTT5ncm91cC1uYW1lIGdyb3VwLW5hbWUgLi4uPC9FTT48UD4KLU9ubHkgdXNlcnMgaW4gdGhlIG5hbWVkIGdyb3VwcyBjYW4gYWNjZXNzIHRoZSBkaXJlY3RvcnkuPFA+Ci08TEk+cmVxdWlyZSB2YWxpZC11c2VyPFA+Ci1BbGwgdmFsaWQgdXNlcnMgY2FuIGFjY2VzcyB0aGUgZGlyZWN0b3J5LgotPC9VTD4KLTxQPgotUmVxdWlyZSBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IDxBIEhSRUY9IiNhdXRobmFtZSI+QXV0aE5hbWU8L0E+IGFuZAotPEEgSFJFRj0iI2F1dGh0eXBlIj5BdXRoVHlwZTwvQT4gZGlyZWN0aXZlcywgYW5kIGRpcmVjdGl2ZXMgc3VjaCBhcwotPEEgSFJFRj0ibW9kX2F1dGguaHRtbCNhdXRodXNlcmZpbGUiPkF1dGhVc2VyRmlsZTwvQT4gYW5kCi08QSBIUkVGPSJtb2RfYXV0aC5odG1sI2F1dGhncm91cGZpbGUiPkF1dGhHcm91cEZpbGU8L0E+ICh0byBkZWZpbmUgdXNlcnMgYW5kCi1ncm91cHMpIGluIG9yZGVyIHRvIHdvcmsgY29ycmVjdGx5LiAgRXhhbXBsZToKLTxCTE9DS1FVT1RFPjxDT0RFPgotQXV0aFR5cGUgQmFzaWM8QlI+Ci1BdXRoTmFtZSAiUmVzdHJpY3RlZCBEaXJlY3RvcnkiPEJSPgotQXV0aFVzZXJGaWxlIC93ZWIvdXNlcnM8QlI+Ci1BdXRoR3JvdXBGaWxlIC93ZWIvZ3JvdXBzPEJSPgotcmVxdWlyZSBncm91cCBhZG1pbjxCUj4KLTwvQ09ERT48L0JMT0NLUVVPVEU+Ci0KLUFjY2VzcyBjb250cm9scyB3aGljaCBhcmUgYXBwbGllZCBpbiB0aGlzIHdheSBhcmUgZWZmZWN0aXZlIGZvcgotPFNUUk9ORz5hbGw8L1NUUk9ORz4gbWV0aG9kcy4gPFNUUk9ORz5UaGlzIGlzIHdoYXQgaXMgbm9ybWFsbHkKLWRlc2lyZWQuPC9TVFJPTkc+IElmIHlvdSB3aXNoIHRvIGFwcGx5IGFjY2VzcyBjb250cm9scyBvbmx5IHRvCi1zcGVjaWZpYyBtZXRob2RzLCB3aGlsZSBsZWF2aW5nIG90aGVyIG1ldGhvZHMgdW5wcm90ZWN0ZWQsIHRoZW4gcGxhY2UKLXRoZSA8Q09ERT5yZXF1aXJlPC9DT0RFPiBzdGF0ZW1lbnQgaW50byBhIDxBCi1IUkVGPSIjbGltaXQiPiZsdDtMaW1pdCZndDs8L0E+IHNlY3Rpb248UD4KLTxQPlNlZSBhbHNvIDxBIEhSRUY9IiNzYXRpc2Z5Ij5TYXRpc2Z5PC9BPiBhbmQgPEEgSFJFRj0ibW9kX2FjY2Vzcy5odG1sIj5tb2RfYWNjZXNzPC9BPi4KLTxIUj4KLQotPEgyPjxBIE5BTUU9InJlc291cmNlY29uZmlnIj5SZXNvdXJjZUNvbmZpZyBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBSZXNvdXJjZUNvbmZpZ30gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gUmVzb3VyY2VDb25maWcgPEVNPmZpbGVuYW1lPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+UmVzb3VyY2VDb25maWcgY29uZi9zcm0uY29uZjwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlPFA+Ci0KLVRoZSBzZXJ2ZXIgd2lsbCByZWFkIHRoaXMgZmlsZSBmb3IgbW9yZSBkaXJlY3RpdmVzIGFmdGVyIHJlYWRpbmcgdGhlCi1odHRwZC5jb25mIGZpbGUuIDxFTT5GaWxlbmFtZTwvRU0+IGlzIHJlbGF0aXZlIHRvIHRoZQotPEEgSFJFRj0iI3NlcnZlcnJvb3QiPlNlcnZlclJvb3Q8L0E+LgotVGhpcyBmZWF0dXJlIGNhbiBiZSBkaXNhYmxlZCB1c2luZzoKLTxCTE9DS1FVT1RFPjxDT0RFPlJlc291cmNlQ29uZmlnIC9kZXYvbnVsbDwvQ09ERT48L0JMT0NLUVVPVEU+Ci1IaXN0b3JpY2FsbHksIHRoaXMgZmlsZSBjb250YWluZWQgbW9zdCBkaXJlY3RpdmVzIGV4Y2VwdCBmb3Igc2VydmVyCi1jb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMgYW5kIDxBIEhSRUY9IiNkaXJlY3RvcnkiPiZsdDtEaXJlY3RvcnkmZ3Q7PC9BPgotc2VjdGlvbnM7IGluIGZhY3QgaXQgY2FuIG5vdyBjb250YWluIGFueSBzZXJ2ZXIgZGlyZWN0aXZlIGFsbG93ZWQgaW4gdGhlCi08RU0+c2VydmVyIGNvbmZpZzwvRU0+IGNvbnRleHQuPFA+Ci0KLVNlZSBhbHNvIDxBIEhSRUY9IiNhY2Nlc3Njb25maWciPkFjY2Vzc0NvbmZpZzwvQT4uPFA+PEhSPgotCi08SDI+PEEgTkFNRT0icmxpbWl0Ij5STGltaXRDUFU8L0E+IDxBIE5BTUU9InJsaW1pdGNwdSI+ZGlyZWN0aXZlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgUkxpbWl0Q1BVfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBSTGltaXRDUFUgPEVNPiMgb3IgJ21heCc8L0VNPgotIDxFTT5bIyBvciAnbWF4J108L0VNPgotPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxFTT5VbnNldDsgdXNlcyBvcGVyYXRpbmcgc3lzdGVtIGRlZmF1bHRzPC9FTT4KLTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gUkxpbWl0Q1BVIGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZSAxLjIKLWFuZCBsYXRlcjxQPgotCi1UYWtlcyAxIG9yIDIgcGFyYW1ldGVycy4gVGhlIGZpcnN0IHBhcmFtZXRlciBzZXRzIHRoZSBzb2Z0IHJlc291cmNlIGxpbWl0Ci1mb3IgYWxsIHByb2Nlc3NlcyBhbmQgdGhlIHNlY29uZCBwYXJhbWV0ZXIgc2V0cyB0aGUgbWF4aW11bSByZXNvdXJjZSBsaW1pdC4KLUVpdGhlciBwYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyLCBvciA8RU0+bWF4PC9FTT4gdG8gaW5kaWNhdGUgdG8gdGhlIHNlcnZlcgotdGhhdCB0aGUgbGltaXQgc2hvdWxkIGJlIHNldCB0byB0aGUgbWF4aW11bSBhbGxvd2VkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtCi1jb25maWd1cmF0aW9uLiBSYWlzaW5nIHRoZSBtYXhpbXVtIHJlc291cmNlIGxpbWl0IHJlcXVpcmVzIHRoYXQgdGhlIHNlcnZlcgotaXMgcnVubmluZyBhcyByb290LCBvciBpbiB0aGUgaW5pdGlhbCBzdGFydHVwIHBoYXNlLjxQPgotCi1UaGlzIGFwcGxpZXMgdG8gcHJvY2Vzc2VzIGZvcmtlZCBvZmYgZnJvbSBBcGFjaGUgY2hpbGRyZW4gc2VydmljaW5nIHJlcXVlc3RzLAotbm90IHRoZSBBcGFjaGUgY2hpbGRyZW4gdGhlbXNlbHZlcy4gVGhpcyBpbmNsdWRlcyBDR0kgc2NyaXB0cyBhbmQgU1NJCi1leGVjIGNvbW1hbmRzLCBidXQgbm90IGFueSBwcm9jZXNzZXMgZm9ya2VkIG9mZiBmcm9tIHRoZSBBcGFjaGUgcGFyZW50Ci1zdWNoIGFzIHBpcGVkIGxvZ3MuPFA+Ci0KLUNQVSByZXNvdXJjZSBsaW1pdHMgYXJlIGV4cHJlc3NlZCBpbiBzZWNvbmRzIHBlciBwcm9jZXNzLjxQPgotCi1TZWUgYWxzbyA8QSBIUkVGPSIjcmxpbWl0bWVtIj5STGltaXRNRU08L0E+IG9yCi08QSBIUkVGPSIjcmxpbWl0bnByb2MiPlJMaW1pdE5QUk9DPC9BPi48UD48SFI+Ci0KLTxIMj48QSBOQU1FPSJybGltaXRtZW0iPlJMaW1pdE1FTSBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBSTGltaXRNRU19IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFJMaW1pdE1FTSA8RU0+IyBvciAnbWF4JzwvRU0+Ci0gPEVNPlsjIG9yICdtYXgnXTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxFTT5VbnNldDsgdXNlcyBvcGVyYXRpbmcgc3lzdGVtIGRlZmF1bHRzPC9FTT4KLTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gUkxpbWl0TUVNIGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZSAxLjIKLWFuZCBsYXRlcjxQPgotCi1UYWtlcyAxIG9yIDIgcGFyYW1ldGVycy4gVGhlIGZpcnN0IHBhcmFtZXRlciBzZXRzIHRoZSBzb2Z0IHJlc291cmNlIGxpbWl0IGZvcgotYWxsIHByb2Nlc3NlcyBhbmQgdGhlIHNlY29uZCBwYXJhbWV0ZXIgc2V0cyB0aGUgbWF4aW11bSByZXNvdXJjZSBsaW1pdC4gRWl0aGVyCi1wYXJhbWV0ZXIgY2FuIGJlIGEgbnVtYmVyLCBvciA8RU0+bWF4PC9FTT4gdG8gaW5kaWNhdGUgdG8gdGhlIHNlcnZlciB0aGF0IHRoZQotbGltaXQgc2hvdWxkIGJlIHNldCB0byB0aGUgbWF4aW11bSBhbGxvd2VkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtCi1jb25maWd1cmF0aW9uLiBSYWlzaW5nIHRoZSBtYXhpbXVtIHJlc291cmNlIGxpbWl0IHJlcXVpcmVzIHRoYXQgdGhlCi1zZXJ2ZXIgaXMgcnVubmluZyBhcyByb290LCBvciBpbiB0aGUgaW5pdGlhbCBzdGFydHVwIHBoYXNlLjxQPgotCi1UaGlzIGFwcGxpZXMgdG8gcHJvY2Vzc2VzIGZvcmtlZCBvZmYgZnJvbSBBcGFjaGUgY2hpbGRyZW4gc2VydmljaW5nIHJlcXVlc3RzLAotbm90IHRoZSBBcGFjaGUgY2hpbGRyZW4gdGhlbXNlbHZlcy4gVGhpcyBpbmNsdWRlcyBDR0kgc2NyaXB0cyBhbmQgU1NJCi1leGVjIGNvbW1hbmRzLCBidXQgbm90IGFueSBwcm9jZXNzZXMgZm9ya2VkIG9mZiBmcm9tIHRoZSBBcGFjaGUgcGFyZW50Ci1zdWNoIGFzIHBpcGVkIGxvZ3MuPFA+Ci0KLU1lbW9yeSByZXNvdXJjZSBsaW1pdHMgYXJlIGV4cHJlc3NlZCBpbiBieXRlcyBwZXIgcHJvY2Vzcy48UD4KLQotU2VlIGFsc28gPEEgSFJFRj0iI3JsaW1pdGNwdSI+UkxpbWl0Q1BVPC9BPiBvcgotPEEgSFJFRj0iI3JsaW1pdG5wcm9jIj5STGltaXROUFJPQzwvQT4uPFA+PEhSPgotCi08SDI+PEEgTkFNRT0icmxpbWl0bnByb2MiPlJMaW1pdE5QUk9DIGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IFJMaW1pdE5QUk9DfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBSTGltaXROUFJPQyA8RU0+IyBvciAnbWF4JzwvRU0+Ci0gPEVNPlsjIG9yICdtYXgnXTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxFTT5VbnNldDsgdXNlcyBvcGVyYXRpbmcgc3lzdGVtIGRlZmF1bHRzPC9FTT4KLTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gUkxpbWl0TlBST0MgaXMgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlCi0xLjIgYW5kIGxhdGVyPFA+Ci0KLVRha2VzIDEgb3IgMiBwYXJhbWV0ZXJzLiBUaGUgZmlyc3QgcGFyYW1ldGVyIHNldHMgdGhlIHNvZnQgcmVzb3VyY2UgbGltaXQKLWZvciBhbGwgcHJvY2Vzc2VzIGFuZCB0aGUgc2Vjb25kIHBhcmFtZXRlciBzZXRzIHRoZSBtYXhpbXVtIHJlc291cmNlIGxpbWl0LgotRWl0aGVyIHBhcmFtZXRlciBjYW4gYmUgYSBudW1iZXIsIG9yIDxFTT5tYXg8L0VNPiB0byBpbmRpY2F0ZSB0byB0aGUgc2VydmVyCi10aGF0IHRoZSBsaW1pdCBzaG91bGQgYmUgc2V0IHRvIHRoZSBtYXhpbXVtIGFsbG93ZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0KLWNvbmZpZ3VyYXRpb24uIFJhaXNpbmcgdGhlIG1heGltdW0gcmVzb3VyY2UgbGltaXQgcmVxdWlyZXMgdGhhdCB0aGUgc2VydmVyCi1pcyBydW5uaW5nIGFzIHJvb3QsIG9yIGluIHRoZSBpbml0aWFsIHN0YXJ0dXAgcGhhc2UuPFA+Ci0KLVRoaXMgYXBwbGllcyB0byBwcm9jZXNzZXMgZm9ya2VkIG9mZiBmcm9tIEFwYWNoZSBjaGlsZHJlbiBzZXJ2aWNpbmcgcmVxdWVzdHMsCi1ub3QgdGhlIEFwYWNoZSBjaGlsZHJlbiB0aGVtc2VsdmVzLiBUaGlzIGluY2x1ZGVzIENHSSBzY3JpcHRzIGFuZCBTU0kKLWV4ZWMgY29tbWFuZHMsIGJ1dCBub3QgYW55IHByb2Nlc3NlcyBmb3JrZWQgb2ZmIGZyb20gdGhlIEFwYWNoZSBwYXJlbnQKLXN1Y2ggYXMgcGlwZWQgbG9ncy48UD4KLQotUHJvY2VzcyBsaW1pdHMgY29udHJvbCB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlcyBwZXIgdXNlci48UD4KLQotTm90ZTogSWYgQ0dJIHByb2Nlc3NlcyBhcmUgPFNUUk9ORz5ub3Q8L1NUUk9ORz4gcnVubmluZyB1bmRlciB1c2VyaWRzIG90aGVyCi10aGFuIHRoZQotd2ViIHNlcnZlciB1c2VyaWQsIHRoaXMgZGlyZWN0aXZlIHdpbGwgbGltaXQgdGhlIG51bWJlciBvZiBwcm9jZXNzZXMgdGhhdCB0aGUKLXNlcnZlciBpdHNlbGYgY2FuIGNyZWF0ZS4gRXZpZGVuY2Ugb2YgdGhpcyBzaXR1YXRpb24gd2lsbCBiZSBpbmRpY2F0ZWQgYnkKLTxTVFJPTkc+PEVNPmNhbm5vdCBmb3JrPC9FTT48L1NUUk9ORz4gbWVzc2FnZXMgaW4gdGhlIGVycm9yX2xvZy48UD4KLQotU2VlIGFsc28gPEEgSFJFRj0iI3JsaW1pdG1lbSI+UkxpbWl0TUVNPC9BPiBvcgotPEEgSFJFRj0iI3JsaW1pdGNwdSI+UkxpbWl0Q1BVPC9BPi4KLQotPFA+PEhSPgotCi08SDI+PEEgTkFNRT0ic2F0aXNmeSI+U2F0aXNmeSBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBTYXRpc2Z5fSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBTYXRpc2Z5IDxFTT4nYW55JyBvciAnYWxsJzwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IFNhdGlzZnkgYWxsPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IGRpcmVjdG9yeSwgLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IFNhdGlzZnkgaXMgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDEuMgotYW5kIGxhdGVyPFA+Ci0KLUFjY2VzcyBwb2xpY3kgaWYgYm90aCBhbGxvdyBhbmQgcmVxdWlyZSB1c2VkLiBUaGUgcGFyYW1ldGVyIGNhbiBiZQotZWl0aGVyIDxFTT4nYWxsJzwvRU0+IG9yIDxFTT4nYW55JzwvRU0+LiBUaGlzIGRpcmVjdGl2ZSBpcyBvbmx5IHVzZWZ1bAotaWYgYWNjZXNzIHRvIGEgcGFydGljdWxhciBhcmVhIGlzIGJlaW5nIHJlc3RyaWN0ZWQgYnkgYm90aAotdXNlcm5hbWUvcGFzc3dvcmQgPEVNPmFuZDwvRU0+IGNsaWVudCBob3N0IGFkZHJlc3MuIEluIHRoaXMgY2FzZSB0aGUKLWRlZmF1bHQgYmVoYXZpb3IgKCJhbGwiKSBpcyB0byByZXF1aXJlIHRoYXQgdGhlIGNsaWVudCBwYXNzZXMgdGhlCi1hZGRyZXNzIGFjY2VzcyByZXN0cmljdGlvbiA8RU0+YW5kPC9FTT4gZW50ZXJzIGEgdmFsaWQgdXNlcm5hbWUgYW5kCi1wYXNzd29yZC4gV2l0aCB0aGUgImFueSIgb3B0aW9uIHRoZSBjbGllbnQgd2lsbCBiZSBncmFudGVkIGFjY2VzcyBpZgotdGhleSBlaXRoZXIgcGFzcyB0aGUgaG9zdCByZXN0cmljdGlvbiBvciBlbnRlciBhIHZhbGlkIHVzZXJuYW1lIGFuZAotcGFzc3dvcmQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gcGFzc3dvcmQgcmVzdHJpY3QgYW4gYXJlYSwgYnV0IHRvIGxldAotY2xpZW50cyBmcm9tIHBhcnRpY3VsYXIgYWRkcmVzc2VzIGluIHdpdGhvdXQgcHJvbXB0aW5nIGZvciBhIHBhc3N3b3JkLgotPFA+Ci1TZWUgYWxzbyA8QSBIUkVGPSIjcmVxdWlyZSI+cmVxdWlyZTwvQT4gYW5kIAotPEEgSFJFRj0ibW9kX2FjY2Vzcy5odG1sIj5tb2RfYWNjZXNzPC9BPi4KLQotPFA+PEhSPgotCi08SDI+PEEgTkFNRT0ic2NvcmVib2FyZGZpbGUiPlNjb3JlQm9hcmRGaWxlIGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IFNjb3JlQm9hcmRGaWxlfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBTY29yZUJvYXJkRmlsZSA8RU0+ZmlsZW5hbWU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5TY29yZUJvYXJkRmlsZSBsb2dzL2FwYWNoZV9zdGF0dXM8L0NPREU+Ci08QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gY29yZTxQPgotCi1UaGUgU2NvcmVCb2FyZEZpbGUgZGlyZWN0aXZlIGlzIHJlcXVpcmVkIG9uIHNvbWUgYXJjaGl0ZWN0dXJlcyB0byBwbGFjZQotYSBmaWxlIHRoYXQgdGhlIHNlcnZlciB3aWxsIHVzZSB0byBjb21tdW5pY2F0ZSBiZXR3ZWVuIGl0cyBjaGlsZHJlbiBhbmQKLXRoZSBwYXJlbnQuICBUaGUgZWFzaWVzdCB3YXkgdG8gZmluZCBvdXQgaWYgeW91ciBhcmNoaXRlY3R1cmUgcmVxdWlyZXMKLWEgc2NvcmVib2FyZCBmaWxlIGlzIHRvIHJ1biBBcGFjaGUgYW5kIHNlZSBpZiBpdCBjcmVhdGVzIHRoZSBmaWxlIG5hbWVkCi1ieSB0aGUgZGlyZWN0aXZlLiAgSWYgeW91ciBhcmNoaXRlY3R1cmUgcmVxdWlyZXMgaXQgdGhlbiB5b3UgbXVzdCBlbnN1cmUKLXRoYXQgdGhpcyBmaWxlIGlzIG5vdCB1c2VkIGF0IHRoZSBzYW1lIHRpbWUgYnkgbW9yZSB0aGFuIG9uZSBpbnZvY2F0aW9uCi1vZiBBcGFjaGUuPFA+Ci0KLUlmIHlvdSBoYXZlIHRvIHVzZSBhIFNjb3JlQm9hcmRGaWxlIHRoZW4geW91IG1heSBzZWUgaW1wcm92ZWQgc3BlZWQgYnkKLXBsYWNpbmcgaXQgb24gYSBSQU0gZGlzay4gIEJ1dCBiZSBjYXJlZnVsIHRoYXQgeW91IGhlZWQgdGhlIHNhbWUgd2FybmluZ3MKLWFib3V0IGxvZyBmaWxlIHBsYWNlbWVudCBhbmQKLTxBIEhSRUY9Ii4uL21pc2Mvc2VjdXJpdHlfdGlwcy5odG1sIj5zZWN1cml0eTwvQT4uPFA+Ci0KLUFwYWNoZSAxLjIgYW5kIGFib3ZlOjxQPgotCi1MaW51eCAxLnggdXNlcnMgbWlnaHQgYmUgYWJsZSB0byBhZGQKLTxDT0RFPi1ESEFWRV9TSE1HRVQgLURVU0VfU0hNR0VUX1NDT1JFQk9BUkQ8L0NPREU+IHRvCi10aGUgPENPREU+RVhUUkFfQ0ZMQUdTPC9DT0RFPiBpbiB5b3VyIDxDT0RFPkNvbmZpZ3VyYXRpb248L0NPREU+LiAgVGhpcwotbWlnaHQgd29yayB3aXRoIHNvbWUgMS54IGluc3RhbGxhdGlvbnMsIGJ1dCB3b24ndCB3b3JrIHdpdGggYWxsIG9mCi10aGVtLiAoUHJpb3IgdG8gMS4zYjQsIDxDT0RFPkhBVkVfU0hNR0VUPC9DT0RFPiB3b3VsZCBoYXZlIHN1ZmZpY2VkLik8UD4KLQotU1ZSNCB1c2VycyBzaG91bGQgY29uc2lkZXIgYWRkaW5nCi08Q09ERT4tREhBVkVfU0hNR0VUIC1EVVNFX1NITUdFVF9TQ09SRUJPQVJEPC9DT0RFPiB0byB0aGUKLTxDT0RFPkVYVFJBX0NGTEFHUzwvQ09ERT4gaW4geW91ciA8Q09ERT5Db25maWd1cmF0aW9uPC9DT0RFPi4gIFRoaXMKLWlzIGJlbGlldmVkIHRvIHdvcmssIGJ1dCB3ZSB3ZXJlIHVuYWJsZSB0byB0ZXN0IGl0IGluIHRpbWUgZm9yIDEuMgotcmVsZWFzZS4gKFByaW9yIHRvIDEuM2I0LCA8Q09ERT5IQVZFX1NITUdFVDwvQ09ERT4gd291bGQgaGF2ZSBzdWZmaWNlZC4pPFA+Ci0KLTxTVFJPTkc+U2VlIEFsc288L1NUUk9ORz46Ci08QSBIUkVGPSIuLi9zdG9wcGluZy5odG1sIj5TdG9wcGluZyBhbmQgUmVzdGFydGluZyBBcGFjaGU8L0E+PC9QPgotCi08UD48SFI+Ci0KLTxIMj48QSBOQU1FPSJzY3JpcHRpbnRlcnByZXRlcnNvdXJjZSI+U2NyaXB0SW50ZXJwcmV0ZXJTb3VyY2UgZGlyZWN0aXZlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgU2NyaXB0SW50ZXJwcmV0ZXJTb3VyY2V9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFNjcmlwdEludGVycHJldGVyU291cmNlIDxFTT4ncmVnaXN0cnknIG9yICdzY3JpcHQnPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+U2NyaXB0SW50ZXJwcmV0ZXJTb3VyY2Ugc2NyaXB0PC9DT0RFPgotPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IGRpcmVjdG9yeSwgLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlIChXaW5kb3dzIG9ubHkpPFA+Ci0KLVRoaXMgZGlyZWN0aXZlIGlzIHVzZWQgdG8gY29udHJvbCBob3cgQXBhY2hlIDEuMy41IGFuZCBsYXRlciBmaW5kcyB0aGUgaW50ZXJwcmV0ZXIKLXVzZWQgdG8gcnVuIENHSSBzY3JpcHRzLiBUaGUgZGVmYXVsdCB0ZWNobmlxdWUgaXMgdG8gdXNlIHRoZSBpbnRlcnByZXRlciBwb2ludGVkIHRvIGJ5Ci10aGUgIyEgbGluZSBpbiB0aGUgc2NyaXB0LiAgU2V0dGluZyBTY3JpcHRJbnRlcnByZXRlclNvdXJjZSByZWdpc3RyeSB3aWxsIGNhdXNlIHRoZQotV2luZG93cyBSZWdpc3RyeSB0byBiZSBzZWFyY2hlZCB1c2luZyB0aGUgc2NyaXB0IGZpbGUgZXh0ZW5zaW9uIChlLmcuLCAucGwpIGFzIGEgc2VhcmNoIGtleS4KLTxQPjxIUj4KLQotPEgyPjxBIE5BTUU9InNlbmRidWZmZXJzaXplIj5TZW5kQnVmZmVyU2l6ZSBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBTZW5kQnVmZmVyU2l6ZX0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gU2VuZEJ1ZmZlclNpemUgPEVNPmJ5dGVzPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gY29yZTxQPgotCi1UaGUgc2VydmVyIHdpbGwgc2V0IHRoZSBUQ1AgYnVmZmVyIHNpemUgdG8gdGhlIG51bWJlciBvZiBieXRlcwotc3BlY2lmaWVkLiBWZXJ5IHVzZWZ1bCB0byBpbmNyZWFzZSBwYXN0IHN0YW5kYXJkIE9TIGRlZmF1bHRzIG9uIGhpZ2gKLXNwZWVkIGhpZ2ggbGF0ZW5jeSAoPEVNPmkuZS48L0VNPiwgMTAwbXMgb3Igc28sIHN1Y2ggYXMgdHJhbnNjb250aW5lbnRhbAotZmFzdCBwaXBlcykKLTxQPjxIUj4KLQotPEgyPjxBIE5BTUU9InNlcnZlcmFkbWluIj5TZXJ2ZXJBZG1pbiBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBTZXJ2ZXJBZG1pbn0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gU2VydmVyQWRtaW4gPEVNPmVtYWlsLWFkZHJlc3M8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmU8UD4KLQotVGhlIFNlcnZlckFkbWluIHNldHMgdGhlIGUtbWFpbCBhZGRyZXNzIHRoYXQgdGhlIHNlcnZlciBpbmNsdWRlcyBpbiBhbnkKLWVycm9yIG1lc3NhZ2VzIGl0IHJldHVybnMgdG8gdGhlIGNsaWVudC48UD4KLQotSXQgbWF5IGJlIHdvcnRoIHNldHRpbmcgdXAgYSBkZWRpY2F0ZWQgYWRkcmVzcyBmb3IgdGhpcywgPEVNPmUuZy48L0VNPgotPEJMT0NLUVVPVEU+PENPREU+U2VydmVyQWRtaW4gd3d3LWFkbWluQGZvby5iYXIuY29tPC9DT0RFPjwvQkxPQ0tRVU9URT4KLWFzIHVzZXJzIGRvIG5vdCBhbHdheXMgbWVudGlvbiB0aGF0IHRoZXkgYXJlIHRhbGtpbmcgYWJvdXQgdGhlIHNlcnZlciE8UD48SFI+Ci0KLTxIMj48QSBOQU1FPSJzZXJ2ZXJhbGlhcyI+U2VydmVyQWxpYXMgZGlyZWN0aXZlPC9BPjwvSDI+Ci0KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gU2VydmVyQWxpYXMgPEVNPmhvc3QxIGhvc3QyIC4uLjwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHZpcnR1YWwgaG9zdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gY29yZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBTZXJ2ZXJBbGlhcyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUKLTEuMSBhbmQgbGF0ZXIuPFA+Ci0KLVRoZSBTZXJ2ZXJBbGlhcyBkaXJlY3RpdmUgc2V0cyB0aGUgYWx0ZXJuYXRlIG5hbWVzIGZvciBhIGhvc3QsIGZvciB1c2UKLXdpdGgKLTxBIEhSRUY9Ii4uL3Zob3N0cy9uYW1lLWJhc2VkLmh0bWwiPm5hbWUtYmFzZWQgdmlydHVhbCBob3N0czwvQT4uCi0KLTxQPjxTVFJPTkc+U2VlIGFsc286PC9TVFJPTkc+Ci08QSBIUkVGPSIuLi92aG9zdHMvaW5kZXguaHRtbCI+QXBhY2hlIFZpcnR1YWwgSG9zdCBkb2N1bWVudGF0aW9uPC9BPgotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJzZXJ2ZXJuYW1lIj5TZXJ2ZXJOYW1lIGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IFNlcnZlck5hbWV9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFNlcnZlck5hbWUgPEVNPmZ1bGx5LXF1YWxpZmllZCBkb21haW4gbmFtZTwvRU0+Ci08QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlPFA+Ci0KLVRoZSBTZXJ2ZXJOYW1lIGRpcmVjdGl2ZSBzZXRzIHRoZSBob3N0bmFtZSBvZiB0aGUgc2VydmVyOyB0aGlzIGlzCi11c2VkIHdoZW4gY3JlYXRpbmcgcmVkaXJlY3Rpb24gVVJMcy4gSWYgaXQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0aGUKLXNlcnZlciBhdHRlbXB0cyB0byBkZWR1Y2UgaXQgZnJvbSBpdHMgb3duIElQIGFkZHJlc3M7IGhvd2V2ZXIgdGhpcyBtYXkKLW5vdCB3b3JrIHJlbGlhYmx5LCBvciBtYXkgbm90IHJldHVybiB0aGUgcHJlZmVycmVkIGhvc3RuYW1lLiBGb3IgZXhhbXBsZToKLTxCTE9DS1FVT1RFPjxDT0RFPlNlcnZlck5hbWUgd3d3LmV4YW1wbGUuY29tPC9DT0RFPjwvQkxPQ0tRVU9URT4KLXdvdWxkIGJlIHVzZWQgaWYgdGhlIGNhbm9uaWNhbCAobWFpbikgbmFtZSBvZiB0aGUgYWN0dWFsIG1hY2hpbmUKLXdlcmUgPENPREU+c2ltcGxlLmV4YW1wbGUuY29tPC9DT0RFPi48UD4KLQotSWYgeW91IGFyZSB1c2luZyA8QSBIUkVGPSIuLi92aG9zdHMvbmFtZS1iYXNlZC5odG1sIj5uYW1lLWJhc2VkCi12aXJ0dWFsIGhvc3RzPC9BPiwgdGhlIDxDT0RFPlNlcnZlck5hbWU8L0NPREU+IGluc2lkZSBhCi08QSBIUkVGPSIjdmlydHVhbGhvc3QiPjxDT0RFPiZsdDtWaXJ0dWFsSG9zdCZndDs8L0NPREU+PC9BPgotc2VjdGlvbiBzcGVjaWZpZXMgd2hhdCBob3N0bmFtZSBtdXN0IGFwcGVhciBpbiB0aGUgcmVxdWVzdCdzCi08Q09ERT5Ib3N0OjwvQ09ERT4gaGVhZGVyIHRvIG1hdGNoIHRoaXMgdmlydHVhbCBob3N0LjxQPgotCi08UD48U1RST05HPlNlZSBBbHNvPC9TVFJPTkc+OjxCUj4KLTxBIEhSRUY9Ii4uL2Rucy1jYXZlYXRzLmh0bWwiPkROUyBJc3N1ZXM8L0E+PEJSPgotPEEgSFJFRj0iLi4vdmhvc3RzL2luZGV4Lmh0bWwiPkFwYWNoZSB2aXJ0dWFsIGhvc3QgZG9jdW1lbnRhdGlvbjwvQT48QlI+Ci08QSBIUkVGPSIjdXNlY2Fub25pY2FsbmFtZSI+VXNlQ2Fub25pY2FsTmFtZTwvQT48QlI+Ci08QSBIUkVGPSIjbmFtZXZpcnR1YWxob3N0Ij5OYW1lVmlydHVhbEhvc3Q8L0E+PEJSPgotPEEgSFJFRj0iI3NlcnZlcmFsaWFzIj5TZXJ2ZXJBbGlhczwvQT48QlI+Ci08L1A+Ci08SFI+Ci0KLTxIMj48QSBOQU1FPSJzZXJ2ZXJwYXRoIj5TZXJ2ZXJQYXRoIGRpcmVjdGl2ZTwvQT48L0gyPgotCi08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFNlcnZlclBhdGggPEVNPnBhdGhuYW1lPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gdmlydHVhbCBob3N0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IFNlcnZlclBhdGggaXMgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlCi0xLjEgYW5kIGxhdGVyLjxQPgotCi1UaGUgU2VydmVyUGF0aCBkaXJlY3RpdmUgc2V0cyB0aGUgbGVnYWN5IFVSTCBwYXRobmFtZSBmb3IgYSBob3N0LCBmb3IKLXVzZSB3aXRoIDxBIEhSRUY9Ii4uL3Zob3N0cy9pbmRleC5odG1sIj5uYW1lLWJhc2VkIHZpcnR1YWwgaG9zdHM8L0E+LgotCi08UD48U1RST05HPlNlZSBhbHNvOjwvU1RST05HPgotPEEgSFJFRj0iLi4vdmhvc3RzL2luZGV4Lmh0bWwiPkFwYWNoZSBWaXJ0dWFsIEhvc3QgZG9jdW1lbnRhdGlvbjwvQT4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0ic2VydmVycm9vdCI+U2VydmVyUm9vdCBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBTZXJ2ZXJSb290fSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBTZXJ2ZXJSb290IDxFTT5kaXJlY3RvcnktZmlsZW5hbWU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5TZXJ2ZXJSb290IC91c3IvbG9jYWwvYXBhY2hlPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlPFA+Ci0KLVRoZSBTZXJ2ZXJSb290IGRpcmVjdGl2ZSBzZXRzIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIHNlcnZlciBsaXZlcy4KLVR5cGljYWxseSBpdCB3aWxsIGNvbnRhaW4gdGhlIHN1YmRpcmVjdG9yaWVzIDxDT0RFPmNvbmYvPC9DT0RFPiBhbmQKLTxDT0RFPmxvZ3MvPC9DT0RFPi4gUmVsYXRpdmUgcGF0aHMgZm9yIG90aGVyIGNvbmZpZ3VyYXRpb24gZmlsZXMgYXJlIHRha2VuCi1hcyByZWxhdGl2ZSB0byB0aGlzIGRpcmVjdG9yeS48UD4KLQotU2VlIGFsc28gPEEgSFJFRj0iLi4vaW52b2tpbmcuaHRtbCI+dGhlIDxDT0RFPi1kPC9DT0RFPiBvcHRpb24gdG8gaHR0cGQ8L0E+LjxQPgotU2VlIGFsc28gPEEgSFJFRj0iLi4vbWlzYy9zZWN1cml0eV90aXBzLmh0bWwjc2VydmVycm9vdCI+dGhlIHNlY3VyaXR5IHRpcHM8L0E+Ci1mb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIHByb3Blcmx5IHNldCBwZXJtaXNzaW9ucyBvbiB0aGUgU2VydmVyUm9vdC48UD4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0ic2VydmVyc2lnbmF0dXJlIj5TZXJ2ZXJTaWduYXR1cmUgZGlyZWN0aXZlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgU2VydmVyU2lnbmF0dXJlfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBTZXJ2ZXJTaWduYXR1cmUgPEVNPk9mZiB8IE9uIHwgRU1haWw8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5TZXJ2ZXJTaWduYXR1cmUgT2ZmPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwKLS5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gY29yZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBTZXJ2ZXJTaWduYXR1cmUgaXMgb25seSBhdmFpbGFibGUgaW4KLUFwYWNoZQotMS4zIGFuZCBsYXRlci48UD4KLQotVGhlIFNlcnZlclNpZ25hdHVyZSBkaXJlY3RpdmUgYWxsb3dzIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgdHJhaWxpbmcKLWZvb3RlciBsaW5lIHVuZGVyIHNlcnZlci1nZW5lcmF0ZWQgZG9jdW1lbnRzIChlcnJvciBtZXNzYWdlcywKLW1vZF9wcm94eSBmdHAgZGlyZWN0b3J5IGxpc3RpbmdzLCBtb2RfaW5mbyBvdXRwdXQsIC4uLikuIFRoZSByZWFzb24KLXdoeSB5b3Ugd291bGQgd2FudCB0byBlbmFibGUgc3VjaCBhIGZvb3RlciBsaW5lIGlzIHRoYXQgaW4gYSBjaGFpbgotb2YgcHJveGllcywgdGhlIHVzZXIgb2Z0ZW4gaGFzIG5vIHBvc3NpYmlsaXR5IHRvIHRlbGwgd2hpY2ggb2YgdGhlCi1jaGFpbmVkIHNlcnZlcnMgYWN0dWFsbHkgcHJvZHVjZWQgYSByZXR1cm5lZCBlcnJvciBtZXNzYWdlLjxCUj4KLVRoZSA8U0FNUD5PZmY8L1NBTVA+IHNldHRpbmcsIHdoaWNoIGlzIHRoZSBkZWZhdWx0LCBzdXBwcmVzc2VzIHRoZQotZXJyb3IgbGluZSAoYW5kIGlzIHRoZXJlZm9yZSBjb21wYXRpYmxlIHdpdGggdGhlIGJlaGF2aW9yIG9mCi1BcGFjaGUtMS4yIGFuZCBiZWxvdykuIFRoZSA8U0FNUD5PbjwvU0FNUD4gc2V0dGluZyBzaW1wbHkgYWRkcyBhCi1saW5lIHdpdGggdGhlIHNlcnZlciB2ZXJzaW9uIG51bWJlciBhbmQgPEEKLUhSRUY9IiNzZXJ2ZXJuYW1lIj5TZXJ2ZXJOYW1lPC9BPiBvZiB0aGUgc2VydmluZyB2aXJ0dWFsIGhvc3QsIGFuZAotdGhlIDxTQU1QPkVNYWlsPC9TQU1QPiBzZXR0aW5nIGFkZGl0aW9uYWxseSBjcmVhdGVzIGEgIm1haWx0bzoiCi1yZWZlcmVuY2UgdG8gdGhlIDxBIEhSRUY9IiNzZXJ2ZXJhZG1pbiI+U2VydmVyQWRtaW48L0E+IG9mIHRoZQotcmVmZXJlbmNlZCBkb2N1bWVudC4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0ic2VydmVydG9rZW5zIj5TZXJ2ZXJUb2tlbnMgZGlyZWN0aXZlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgU2VydmVyVG9rZW5zfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBTZXJ2ZXJUb2tlbnMgPEVNPk1pbmltYWx8T1N8RnVsbDwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPlNlcnZlclRva2VucyBGdWxsPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnIDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gY29yZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBTZXJ2ZXJUb2tlbnMgaXMgb25seSBhdmFpbGFibGUKLSBpbiBBcGFjaGUgMS4zIGFuZCBsYXRlcgotCi08UD4KLVRoaXMgZGlyZWN0aXZlIGNvbnRyb2xzIHdoZXRoZXIgPFNBTVA+U2VydmVyPC9TQU1QPiByZXNwb25zZSBoZWFkZXIKLWZpZWxkIHdoaWNoIGlzIHNlbnQgYmFjayB0byBjbGllbnRzIGluY2x1ZGVzIGEgZGVzY3JpcHRpb24gb2YgdGhlIGdlbmVyaWMKLU9TLXR5cGUgb2YgdGhlIHNlcnZlciBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGFib3V0IGNvbXBpbGVkLWluIG1vZHVsZXMuCi08L1A+Ci08REw+Ci0gPERUPjxDT0RFPlNlcnZlclRva2VucyBNaW5baW1hbF08L0NPREU+Ci0gPC9EVD4KLSA8REQ+U2VydmVyIHNlbmRzICg8RU0+ZS5nLjwvRU0+KTogPFNBTVA+U2VydmVyOiBBcGFjaGUvMS4zLjA8L1NBTVA+Ci0gPC9ERD4KLSA8RFQ+PENPREU+U2VydmVyVG9rZW5zIE9TPC9DT0RFPgotIDwvRFQ+Ci0gPEREPlNlcnZlciBzZW5kcyAoPEVNPmUuZy48L0VNPik6IDxTQU1QPlNlcnZlcjogQXBhY2hlLzEuMy4wIChVbml4KTwvU0FNUD4KLSA8L0REPgotIDxEVD48Q09ERT5TZXJ2ZXJUb2tlbnMgRnVsbDwvQ09ERT4gKG9yIG5vdCBzcGVjaWZpZWQpCi0gPC9EVD4KLSA8REQ+U2VydmVyIHNlbmRzICg8RU0+ZS5nLjwvRU0+KTogPFNBTVA+U2VydmVyOiBBcGFjaGUvMS4zLjAgKFVuaXgpIFBIUC8zLjAKLSAgTXlNb2QvMS4yPC9TQU1QPgotIDwvREQ+Ci08L0RMPgotPFA+Ci1UaGlzIHNldHRpbmcgYXBwbGllcyB0byB0aGUgZW50aXJlIHNlcnZlciwgYW5kIGNhbm5vdCBiZSBlbmFibGVkIG9yCi1kaXNhYmxlZCBvbiBhIHZpcnR1YWxob3N0LWJ5LXZpcnR1YWxob3N0IGJhc2lzLgotPC9QPgotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJzZXJ2ZXJ0eXBlIj5TZXJ2ZXJUeXBlIGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IFNlcnZlclR5cGV9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFNlcnZlclR5cGUgPEVNPnR5cGU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5TZXJ2ZXJUeXBlIHN0YW5kYWxvbmU8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmU8UD4KLQotVGhlIFNlcnZlclR5cGUgZGlyZWN0aXZlIHNldHMgaG93IHRoZSBzZXJ2ZXIgaXMgZXhlY3V0ZWQgYnkgdGhlIHN5c3RlbS4KLTxFTT5UeXBlPC9FTT4gaXMgb25lIG9mCi08REw+Ci08RFQ+aW5ldGQKLTxERD5UaGUgc2VydmVyIHdpbGwgYmUgcnVuIGZyb20gdGhlIHN5c3RlbSBwcm9jZXNzIGluZXRkOyB0aGUgY29tbWFuZCB0byBzdGFydAotdGhlIHNlcnZlciBpcyBhZGRlZCB0byA8Q09ERT4vZXRjL2luZXRkLmNvbmY8L0NPREU+Ci08RFQ+c3RhbmRhbG9uZQotPEREPlRoZSBzZXJ2ZXIgd2lsbCBydW4gYXMgYSBkYWVtb24gcHJvY2VzczsgdGhlIGNvbW1hbmQgdG8gc3RhcnQgdGhlIHNlcnZlcgotaXMgYWRkZWQgdG8gdGhlIHN5c3RlbSBzdGFydHVwIHNjcmlwdHMuICg8Q09ERT4vZXRjL3JjLmxvY2FsPC9DT0RFPiBvcgotPENPREU+L2V0Yy9yYzMuZC8uLi48L0NPREU+LikKLTwvREw+Ci0KLUluZXRkIGlzIHRoZSBsZXNzZXIgdXNlZCBvZiB0aGUgdHdvIG9wdGlvbnMuIEZvciBlYWNoIGh0dHAKLWNvbm5lY3Rpb24gcmVjZWl2ZWQsIGEgbmV3IGNvcHkgb2YgdGhlIHNlcnZlciBpcyBzdGFydGVkIGZyb20gc2NyYXRjaDsKLWFmdGVyIHRoZSBjb25uZWN0aW9uIGlzIGNvbXBsZXRlLCB0aGlzIHByb2dyYW0gZXhpdHMuIFRoZXJlIGlzIGEgaGlnaCBwcmljZSB0bwotcGF5IHBlciBjb25uZWN0aW9uLCBidXQgZm9yIHNlY3VyaXR5IHJlYXNvbnMsIHNvbWUgYWRtaW5zIHByZWZlciB0aGlzIG9wdGlvbi4KLTxGT05UIENPTE9SPSJyZWQiPkluZXRkIG1vZGUgaXMgbm8gbG9uZ2VyIHJlY29tbWVuZGVkIGFuZCBkb2VzIG5vdCBhbHdheXMKLXdvcmsgcHJvcGVybHkuICBBdm9pZCBpdCBpZiBhdCBhbGwgcG9zc2libGUuPC9GT05UPgotPFA+Ci0KLVN0YW5kYWxvbmUgaXMgdGhlIG1vc3QgY29tbW9uIHNldHRpbmcgZm9yIFNlcnZlclR5cGUgc2luY2UKLWl0IGlzIGZhciBtb3JlIGVmZmljaWVudC4gVGhlIHNlcnZlciBpcyBzdGFydGVkIG9uY2UsIGFuZCBzZXJ2aWNlcyBhbGwKLXN1YnNlcXVlbnQgY29ubmVjdGlvbnMuIElmIHlvdSBpbnRlbmQgcnVubmluZyBBcGFjaGUgdG8gc2VydmUgYSBidXN5IHNpdGUsCi1zdGFuZGFsb25lIHdpbGwgcHJvYmFibHkgYmUgeW91ciBvbmx5IG9wdGlvbi48UD4KLTxIUj4KLTxIMj48QSBOQU1FPSJzdGFydHNlcnZlcnMiPlN0YXJ0U2VydmVycyBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBTdGFydFNlcnZlcnN9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFN0YXJ0U2VydmVycyA8RU0+bnVtYmVyPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+U3RhcnRTZXJ2ZXJzIDU8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmU8UD4KLQotVGhlIFN0YXJ0U2VydmVycyBkaXJlY3RpdmUgc2V0cyB0aGUgbnVtYmVyIG9mIGNoaWxkIHNlcnZlciBwcm9jZXNzZXMgY3JlYXRlZAotb24gc3RhcnR1cC4gQXMgdGhlIG51bWJlciBvZiBwcm9jZXNzZXMgaXMgZHluYW1pY2FsbHkgY29udHJvbGxlZCBkZXBlbmRpbmcKLW9uIHRoZSBsb2FkLCB0aGVyZSBpcyB1c3VhbGx5IGxpdHRsZSByZWFzb24gdG8gYWRqdXN0IHRoaXMgcGFyYW1ldGVyLjxQPgotCi08UD5XaGVuIHJ1bm5pbmcgdW5kZXIgTWljcm9zb2Z0IFdpbmRvd3MsIHRoaXMgZGlyZWN0aXZlIGhhcyBubyBlZmZlY3QuCi0gICBUaGVyZSBpcyBhbHdheXMgb25lIGNoaWxkIHdoaWNoIGhhbmRsZXMgYWxsIHJlcXVlc3RzLiBXaXRoaW4gdGhlCi0gICBjaGlsZCByZXF1ZXN0cyBhcmUgaGFuZGxlZCBieSBzZXBhcmF0ZSB0aHJlYWRzLiBUaGUKLSAgIDxBIEhSRUY9IiN0aHJlYWRzcGVyY2hpbGQiPlRocmVhZHNQZXJDaGlsZDwvQT4gZGlyZWN0aXZlIGNvbnRyb2xzIAotICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoaWxkIHRocmVhZHMgaGFuZGxpbmcgcmVxdWVzdHMsIHdoaWNoIHdpbGwKLSAgIGhhdmUgYSBzaW1pbGFyIGVmZmVjdCB0byB0aGUgc2V0dGluZyBvZiA8U0FNUD5TdGFydFNlcnZlcnM8L1NBTVA+Ci0gICBvbiBVbml4LgotCi08UD4KLQotU2VlIGFsc28gPEEgSFJFRj0iI21pbnNwYXJlc2VydmVycyI+TWluU3BhcmVTZXJ2ZXJzPC9BPiBhbmQKLTxBIEhSRUY9IiNtYXhzcGFyZXNlcnZlcnMiPk1heFNwYXJlU2VydmVyczwvQT4uPFA+PEhSPgotCi08SDI+PEEgTkFNRT0idGhyZWFkc3BlcmNoaWxkIj5UaHJlYWRzUGVyQ2hpbGQ8L0E+PC9IMj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gVGhyZWFkc1BlckNoaWxkIDxFTT5udW1iZXI8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5UaHJlYWRzUGVyQ2hpbGQgNTA8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGNvcmUgKFdpbmRvd3MsIE5ldFdhcmUpPEJSPgotPFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPiBBdmFpbGFibGUgb25seSB3aXRoIEFwYWNoZSAxLjMgYW5kIGxhdGVyCi13aXRoIFdpbmRvd3MKLQotPFA+VGhpcyBkaXJlY3RpdmUgdGVsbHMgdGhlIHNlcnZlciBob3cgbWFueSB0aHJlYWRzIGl0IHNob3VsZCB1c2UuIFRoaXMKLSAgIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyB0aGUgc2VydmVyIGNhbiBoYW5kbGUgYXQgb25jZTsgYmUKLSAgIHN1cmUgYW5kIHNldCB0aGlzIG51bWJlciBoaWdoIGVub3VnaCBmb3IgeW91ciBzaXRlIGlmIHlvdSBnZXQgYSBsb3Qgb2YKLSAgIGhpdHMuCi0KLTxQPlRoaXMgZGlyZWN0aXZlIGhhcyBubyBlZmZlY3Qgb24gVW5peCBzeXN0ZW1zLiAgVW5peCB1c2VycyBzaG91bGQgbG9vawotICAgYXQgPEEgSFJFRj0iI3N0YXJ0c2VydmVycyI+U3RhcnRTZXJ2ZXJzPC9BPiBhbmQgPEEKLSAgIEhSRUY9IiNtYXhyZXF1ZXN0c3BlcmNoaWxkIj5NYXhSZXF1ZXN0c1BlckNoaWxkPC9BPi48L1A+Ci0KLTxIUj4KLQotPEgyPjxBIE5BTUU9InRocmVhZHN0YWNrc2l6ZSI+VGhyZWFkU3RhY2tTaXplPC9BPjwvSDI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFRocmVhZFN0YWNrU2l6ZSA8RU0+bnVtYmVyPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+VGhyZWFkU3RhY2tTaXplIDY1NTM2PC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlIChOZXRXYXJlKTxCUj4KLTxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz4gQXZhaWxhYmxlIG9ubHkgd2l0aCBBcGFjaGUgMS4zIGFuZCBsYXRlcgotd2l0aCBOZXRXYXJlCi0KLTxQPlRoaXMgZGlyZWN0aXZlIHRlbGxzIHRoZSBzZXJ2ZXIgd2hhdCBzdGFjayBzaXplIHRvIHVzZSBmb3IgZWFjaCBvZiB0aGUKLSAgIHJ1bm5pbmcgdGhyZWFkcy4gSWYgeW91IGV2ZXIgZ2V0IGEgc3RhY2sgb3ZlcmZsb3cgeW91IHdpbGwgbmVlZCB0byBidW1wCi0gICB0aGlzIG51bWJlciB0byBhIGhpZ2hlciBzZXR0aW5nLgotICAgCi08UD5UaGlzIGRpcmVjdGl2ZSBoYXMgbm8gZWZmZWN0IG9uIG90aGVyIHN5c3RlbXMuCi08SFI+Ci0KLQotCi0KLQotCi08SDI+PEEgTkFNRT0idGltZW91dCI+VGltZU91dCBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBUaW1lT3V0fSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBUaW1lT3V0IDxFTT5udW1iZXI8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5UaW1lT3V0IDMwMDwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gY29yZTxQPgotCi1UaGUgVGltZU91dCBkaXJlY3RpdmUgY3VycmVudGx5IGRlZmluZXMgdGhlIGFtb3VudCBvZiB0aW1lIEFwYWNoZSB3aWxsCi13YWl0IGZvciB0aHJlZSB0aGluZ3M6Ci0KLTxPTD4KLSAgPExJPlRoZSB0b3RhbCBhbW91bnQgb2YgdGltZSBpdCB0YWtlcyB0byByZWNlaXZlIGEgR0VUIHJlcXVlc3QuCi0gIDxMST5UaGUgYW1vdW50IG9mIHRpbWUgYmV0d2VlbiByZWNlaXB0IG9mIFRDUCBwYWNrZXRzIG9uIGEgUE9TVCBvcgotICAgICAgUFVUIHJlcXVlc3QuCi0gIDxMST5UaGUgYW1vdW50IG9mIHRpbWUgYmV0d2VlbiBBQ0tzIG9uIHRyYW5zbWlzc2lvbnMgb2YgVENQIHBhY2tldHMKLSAgICAgIGluIHJlc3BvbnNlcy4KLTwvT0w+Ci0KLVdlIHBsYW4gb24gbWFraW5nIHRoZXNlIHNlcGFyYXRlbHkgY29uZmlndXJhYmxlIGF0IHNvbWUgcG9pbnQgZG93biB0aGUKLXJvYWQuICBUaGUgdGltZXIgdXNlZCB0byBkZWZhdWx0IHRvIDEyMDAgYmVmb3JlIDEuMiwgYnV0IGhhcyBiZWVuCi1sb3dlcmVkIHRvIDMwMCB3aGljaCBpcyBzdGlsbCBmYXIgbW9yZSB0aGFuIG5lY2Vzc2FyeSBpbiBtb3N0Ci1zaXR1YXRpb25zLiAgSXQgaXMgbm90IHNldCBhbnkgbG93ZXIgYnkgZGVmYXVsdCBiZWNhdXNlIHRoZXJlIG1heQotc3RpbGwgYmUgb2RkIHBsYWNlcyBpbiB0aGUgY29kZSB3aGVyZSB0aGUgdGltZXIgaXMgbm90IHJlc2V0IHdoZW4KLWEgcGFja2V0IGlzIHNlbnQuCi0KLTxQPjxIUj4KLQotPEgyPjxBIE5BTUU9InVzZWNhbm9uaWNhbG5hbWUiPlVzZUNhbm9uaWNhbE5hbWUgZGlyZWN0aXZlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgVXNlQ2Fub25pY2FsTmFtZX0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IiBSRUw9IkhlbHAiPgotPFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBVc2VDYW5vbmljYWxOYW1lIDxFTT5vbnxvZmZ8ZG5zPC9FTT48QlI+Ci08QSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiIFJFTD0iSGVscCI+Ci08U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5Vc2VDYW5vbmljYWxOYW1lIG9uPC9DT0RFPjxCUj4KLTxBIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIgUkVMPSJIZWxwIj4KLTxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5PEJSPgotPEEgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIgUkVMPSJIZWxwIj4KLTxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBPcHRpb25zPEJSPgotPEEgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IiBSRUw9IkhlbHAiPgotPFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gVXNlQ2Fub25pY2FsTmFtZSBpcyBvbmx5IGF2YWlsYWJsZSBpbgotQXBhY2hlIDEuMyBhbmQgbGF0ZXI8UD4KLQotSW4gbWFueSBzaXR1YXRpb25zIEFwYWNoZSBoYXMgdG8gY29uc3RydWN0IGEgPEVNPnNlbGYtcmVmZXJlbnRpYWw8L0VNPgotVVJMLiAgVGhhdCBpcywgYSBVUkwgd2hpY2ggcmVmZXJzIGJhY2sgdG8gdGhlIHNhbWUgc2VydmVyLgotV2l0aCA8Q09ERT5Vc2VDYW5vbmljYWxOYW1lIG9uPC9DT0RFPiAoYW5kIGluIGFsbCB2ZXJzaW9ucyBwcmlvciB0bwotMS4zKSBBcGFjaGUgd2lsbCB1c2UgdGhlIDxBIEhSRUY9IiNzZXJ2ZXJuYW1lIj5TZXJ2ZXJOYW1lPC9BPiBhbmQgPEEKLUhSRUY9IiNwb3J0Ij5Qb3J0PC9BPiBkaXJlY3RpdmVzIHRvIGNvbnN0cnVjdCBhIGNhbm9uaWNhbCBuYW1lIGZvciB0aGUKLXNlcnZlci4gIFRoaXMgbmFtZSBpcyB1c2VkIGluIGFsbCBzZWxmLXJlZmVyZW50aWFsIFVSTHMsIGFuZCBmb3IgdGhlCi12YWx1ZXMgb2YgPENPREU+U0VSVkVSX05BTUU8L0NPREU+IGFuZCA8Q09ERT5TRVJWRVJfUE9SVDwvQ09ERT4gaW4gQ0dJcy4KLQotPFA+V2l0aCA8Q09ERT5Vc2VDYW5vbmljYWxOYW1lIG9mZjwvQ09ERT4gQXBhY2hlIHdpbGwgZm9ybQotc2VsZi1yZWZlcmVudGlhbCBVUkxzIHVzaW5nIHRoZSBob3N0bmFtZSBhbmQgcG9ydCBzdXBwbGllZAotYnkgdGhlIGNsaWVudCBpZiBhbnkgYXJlIHN1cHBsaWVkIChvdGhlcndpc2UgaXQgd2lsbCB1c2UgdGhlCi1jYW5vbmljYWwgbmFtZSkuICBUaGVzZSB2YWx1ZXMgYXJlIHRoZSBzYW1lIHRoYXQgYXJlIHVzZWQgdG8KLWltcGxlbWVudCA8QSBIUkVGPSIuLi92aG9zdHMvbmFtZS1iYXNlZC5odG1sIj5uYW1lIGJhc2VkIHZpcnR1YWwKLWhvc3RzPC9BPiwgYW5kIGFyZSBhdmFpbGFibGUgd2l0aCB0aGUgc2FtZSBjbGllbnRzLiAgVGhlIENHSSB2YXJpYWJsZXMKLTxDT0RFPlNFUlZFUl9OQU1FPC9DT0RFPiBhbmQgPENPREU+U0VSVkVSX1BPUlQ8L0NPREU+IHdpbGwgYmUgY29uc3RydWN0ZWQKLWZyb20gdGhlIGNsaWVudCBzdXBwbGllZCB2YWx1ZXMgYXMgd2VsbC4KLQotPFA+QW4gZXhhbXBsZSB3aGVyZSB0aGlzIG1heSBiZSB1c2VmdWwgaXMgb24gYW4gaW50cmFuZXQgc2VydmVyIHdoZXJlCi15b3UgaGF2ZSB1c2VycyBjb25uZWN0aW5nIHRvIHRoZSBtYWNoaW5lIHVzaW5nIHNob3J0IG5hbWVzIHN1Y2ggYXMKLTxDT0RFPnd3dzwvQ09ERT4uICBZb3UnbGwgbm90aWNlIHRoYXQgaWYgdGhlIHVzZXJzIHR5cGUgYSBzaG9ydG5hbWUsCi1hbmQgYSBVUkwgd2hpY2ggaXMgYSBkaXJlY3RvcnksIHN1Y2ggYXMgPENPREU+aHR0cDovL3d3dy9zcGxhdDwvQ09ERT4sCi08RU0+d2l0aG91dCB0aGUgdHJhaWxpbmcgc2xhc2g8L0VNPiB0aGVuIEFwYWNoZSB3aWxsIHJlZGlyZWN0IHRoZW0gdG8KLTxDT0RFPmh0dHA6Ly93d3cuZG9tYWluLmNvbS9zcGxhdC88L0NPREU+LiAgSWYgeW91IGhhdmUgYXV0aGVudGljYXRpb24KLWVuYWJsZWQsIHRoaXMgd2lsbCBjYXVzZSB0aGUgdXNlciB0byBoYXZlIHRvIHJlYXV0aGVudGljYXRlIHR3aWNlIChvbmNlCi1mb3IgPENPREU+d3d3PC9DT0RFPiBhbmQgb25jZSBhZ2FpbiBmb3IgPENPREU+d3d3LmRvbWFpbi5jb208L0NPREU+KS4KLUJ1dCBpZiA8Q09ERT5Vc2VDYW5vbmljYWxOYW1lPC9DT0RFPiBpcyBzZXQgb2ZmLCB0aGVuIEFwYWNoZSB3aWxsIHJlZGlyZWN0Ci10byA8Q09ERT5odHRwOi8vd3d3L3NwbGF0LzwvQ09ERT4uCi0KLTxQPlRoZXJlIGlzIGEgdGhpcmQgb3B0aW9uLCA8Q09ERT5Vc2VDYW5vbmljYWxOYW1lIEROUzwvQ09ERT4sIHdoaWNoCi1pcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggbWFzcyBJUC1iYXNlZCB2aXJ0dWFsIGhvc3RpbmcgdG8gc3VwcG9ydAotYW5jaWVudCBjbGllbnRzIHRoYXQgZG8gbm90IHByb3ZpZGUgYSA8Q09ERT5Ib3N0OjwvQ09ERT4gaGVhZGVyLiBXaXRoCi10aGlzIG9wdGlvbiBBcGFjaGUgZG9lcyBhIHJldmVyc2UgRE5TIGxvb2t1cCBvbiB0aGUgc2VydmVyIElQIGFkZHJlc3MKLXRoYXQgdGhlIGNsaWVudCBjb25uZWN0ZWQgdG8gaW4gb3JkZXIgdG8gd29yayBvdXQgc2VsZi1yZWZlcmVudGlhbCBVUkxzLgotCi08UD48U1RST05HPldhcm5pbmc6PC9TVFJPTkc+IGlmIENHSXMgbWFrZSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgdmFsdWVzIG9mCi08Q09ERT5TRVJWRVJfTkFNRTwvQ09ERT4gdGhleSBtYXkgYmUgYnJva2VuIGJ5IHRoaXMgb3B0aW9uLiAgVGhlIGNsaWVudAotaXMgZXNzZW50aWFsbHkgZnJlZSB0byBnaXZlIHdoYXRldmVyIHZhbHVlIHRoZXkgd2FudCBhcyBhIGhvc3RuYW1lLgotQnV0IGlmIHRoZSBDR0kgaXMgb25seSB1c2luZyA8Q09ERT5TRVJWRVJfTkFNRTwvQ09ERT4gdG8gY29uc3RydWN0Ci1zZWxmLXJlZmVyZW50aWFsIFVSTHMgdGhlbiBpdCBzaG91bGQgYmUganVzdCBmaW5lLgotCi08UD48U1RST05HPlNlZSBhbHNvOjwvU1RST05HPgotPEEgSFJFRj0iI3NlcnZlcm5hbWUiPlNlcnZlck5hbWU8L0E+LAotPEEgSFJFRj0iI3BvcnQiPlBvcnQ8L0E+Ci0KLTxQPjxIUj4KLQotPEgyPjxBIE5BTUU9InVzZXIiPlVzZXIgZGlyZWN0aXZlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgVXNlcn0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gVXNlciA8RU0+dW5peC11c2VyaWQ8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5Vc2VyICMtMTwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBjb3JlPFA+Ci0KLVRoZSBVc2VyIGRpcmVjdGl2ZSBzZXRzIHRoZSB1c2VyaWQgYXMgd2hpY2ggdGhlIHNlcnZlciB3aWxsIGFuc3dlciByZXF1ZXN0cy4KLUluIG9yZGVyIHRvIHVzZSB0aGlzIGRpcmVjdGl2ZSwgdGhlIHN0YW5kYWxvbmUgc2VydmVyIG11c3QgYmUgcnVuIGluaXRpYWxseQotYXMgcm9vdC4gPEVNPlVuaXgtdXNlcmlkPC9FTT4gaXMgb25lIG9mOgotPERMPgotPERUPkEgdXNlcm5hbWUKLTxERD5SZWZlcnMgdG8gdGhlIGdpdmVuIHVzZXIgYnkgbmFtZS4KLTxEVD4jIGZvbGxvd2VkIGJ5IGEgdXNlciBudW1iZXIuCi08REQ+UmVmZXJzIHRvIGEgdXNlciBieSB0aGVpciBudW1iZXIuCi08L0RMPgotCi1UaGUgdXNlciBzaG91bGQgaGF2ZSBubyBwcml2aWxlZ2VzIHdoaWNoIHJlc3VsdCBpbiBpdCBiZWluZyBhYmxlIHRvIGFjY2VzcwotZmlsZXMgd2hpY2ggYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB2aXNpYmxlIHRvIHRoZSBvdXRzaWRlIHdvcmxkLCBhbmQKLXNpbWlsYXJseSwgdGhlIHVzZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGV4ZWN1dGUgY29kZSB3aGljaCBpcyBub3QKLW1lYW50IGZvciBodHRwZCByZXF1ZXN0cy4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3Ugc2V0IHVwIGEgbmV3IHVzZXIgYW5kCi1ncm91cCBzcGVjaWZpY2FsbHkgZm9yIHJ1bm5pbmcgdGhlIHNlcnZlci4gU29tZSBhZG1pbnMgdXNlIHVzZXIKLTxDT0RFPm5vYm9keTwvQ09ERT4sIGJ1dCB0aGlzIGlzIG5vdCBhbHdheXMgcG9zc2libGUgb3IgZGVzaXJhYmxlLgotRm9yIGV4YW1wbGUgbW9kX3Byb3h5J3MgY2FjaGUsIHdoZW4gZW5hYmxlZCwgbXVzdCBiZSBhY2Nlc3NpYmxlIHRvIHRoaXMgdXNlcgotKHNlZSB0aGUgPEEgSFJFRj0ibW9kX3Byb3h5Lmh0bWwjY2FjaGVyb290Ij48Q09ERT5DYWNoZVJvb3Q8L0NPREU+Ci1kaXJlY3RpdmU8L0E+KS48UD4KLQotTm90ZXM6IElmIHlvdSBzdGFydCB0aGUgc2VydmVyIGFzIGEgbm9uLXJvb3QgdXNlciwgaXQgd2lsbCBmYWlsIHRvIGNoYW5nZQotdG8gdGhlIGxlc3NlciBwcml2aWxlZ2VkIHVzZXIsIGFuZCB3aWxsIGluc3RlYWQgY29udGludWUgdG8gcnVuIGFzCi10aGF0IG9yaWdpbmFsIHVzZXIuIElmIHlvdSBkbyBzdGFydCB0aGUgc2VydmVyIGFzIHJvb3QsIHRoZW4gaXQgaXMgbm9ybWFsCi1mb3IgdGhlIHBhcmVudCBwcm9jZXNzIHRvIHJlbWFpbiBydW5uaW5nIGFzIHJvb3QuPFA+Ci0KLVNwZWNpYWwgbm90ZTogVXNlIG9mIHRoaXMgZGlyZWN0aXZlIGluICZsdDtWaXJ0dWFsSG9zdCZndDsgcmVxdWlyZXMgYQotcHJvcGVybHkgY29uZmlndXJlZCA8QSBIUkVGPSIuLi9zdWV4ZWMuaHRtbCI+c3VFWEVDIHdyYXBwZXI8L0E+LgotV2hlbiB1c2VkIGluc2lkZSBhICZsdDtWaXJ0dWFsSG9zdCZndDsgaW4gdGhpcyBtYW5uZXIsIG9ubHkgdGhlIHVzZXIKLXRoYXQgQ0dJcyBhcmUgcnVuIGFzIGlzIGFmZmVjdGVkLiAgTm9uLUNHSSByZXF1ZXN0cyBhcmUgc3RpbGwgcHJvY2Vzc2VkCi13aXRoIHRoZSB1c2VyIHNwZWNpZmllZCBpbiB0aGUgbWFpbiBVc2VyIGRpcmVjdGl2ZS48UD4KLQotU0VDVVJJVFk6IERvbid0IHNldCBVc2VyIChvciA8QSBIUkVGPSIjZ3JvdXAiPkdyb3VwPC9BPikgdG8KLTxDT0RFPnJvb3Q8L0NPREU+IHVubGVzcyB5b3Uga25vdyBleGFjdGx5IHdoYXQgeW91IGFyZSBkb2luZywgYW5kIHdoYXQgdGhlCi1kYW5nZXJzIGFyZS48UD48SFI+Ci0KLTxIMj48QSBOQU1FPSJ2aXJ0dWFsaG9zdCI+Jmx0O1ZpcnR1YWxIb3N0Jmd0OyBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBWaXJ0dWFsSG9zdH0gc2VjdGlvbiBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiAmbHQ7VmlydHVhbEhvc3QgPEVNPmFkZHI8L0VNPls6PEVNPnBvcnQ8L0VNPl0KLSAuLi4mZ3Q7IC4uLgotJmx0Oy9WaXJ0dWFsSG9zdCZndDsgPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IENvcmUuPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IE5vbi1JUCBhZGRyZXNzLWJhc2VkIFZpcnR1YWwgSG9zdGluZyBvbmx5Ci1hdmFpbGFibGUgaW4gQXBhY2hlIDEuMSBhbmQgbGF0ZXIuPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IE11bHRpcGxlIGFkZHJlc3Mgc3VwcG9ydCBvbmx5IGF2YWlsYWJsZSBpbgotQXBhY2hlIDEuMiBhbmQgbGF0ZXIuPFA+Ci0KLSZsdDtWaXJ0dWFsSG9zdCZndDsgYW5kICZsdDsvVmlydHVhbEhvc3QmZ3Q7IGFyZSB1c2VkIHRvIGVuY2xvc2UgYSBncm91cCBvZgotZGlyZWN0aXZlcyB3aGljaCB3aWxsIGFwcGx5IG9ubHkgdG8gYSBwYXJ0aWN1bGFyIHZpcnR1YWwgaG9zdC4KLUFueSBkaXJlY3RpdmUgd2hpY2ggaXMgYWxsb3dlZCBpbiBhIHZpcnR1YWwgaG9zdCBjb250ZXh0IG1heSBiZSB1c2VkLgotV2hlbiB0aGUgc2VydmVyIHJlY2VpdmVzIGEgcmVxdWVzdCBmb3IgYSBkb2N1bWVudCBvbiBhIHBhcnRpY3VsYXIgdmlydHVhbAotaG9zdCwgaXQgdXNlcyB0aGUgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzIGVuY2xvc2VkIGluIHRoZSAmbHQ7VmlydHVhbEhvc3QmZ3Q7Ci1zZWN0aW9uLiA8RU0+QWRkcjwvRU0+IGNhbiBiZQotPE1FTlU+Ci08TEk+VGhlIElQIGFkZHJlc3Mgb2YgdGhlIHZpcnR1YWwgaG9zdAotPExJPkEgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lIGZvciB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgdmlydHVhbCBob3N0LgotPC9NRU5VPiBFeGFtcGxlOgotPEJMT0NLUVVPVEU+Ci08Q09ERT4KLSZsdDtWaXJ0dWFsSG9zdCAxMC4xLjIuMyZndDsgPEJSPgotU2VydmVyQWRtaW4gd2VibWFzdGVyQGhvc3QuZm9vLmNvbSA8QlI+Ci1Eb2N1bWVudFJvb3QgL3d3dy9kb2NzL2hvc3QuZm9vLmNvbSA8QlI+Ci1TZXJ2ZXJOYW1lIGhvc3QuZm9vLmNvbSA8QlI+Ci1FcnJvckxvZyBsb2dzL2hvc3QuZm9vLmNvbS1lcnJvcl9sb2cgPEJSPgotVHJhbnNmZXJMb2cgbG9ncy9ob3N0LmZvby5jb20tYWNjZXNzX2xvZyA8QlI+Ci0mbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotPC9DT0RFPjwvQkxPQ0tRVU9URT4KLQotRWFjaCBWaXJ0dWFsSG9zdCBtdXN0IGNvcnJlc3BvbmQgdG8gYSBkaWZmZXJlbnQgSVAgYWRkcmVzcywgZGlmZmVyZW50IHBvcnQKLW51bWJlciBvciBhCi1kaWZmZXJlbnQgaG9zdCBuYW1lIGZvciB0aGUgc2VydmVyLCBpbiB0aGUgbGF0dGVyIGNhc2UgdGhlIHNlcnZlcgotbWFjaGluZSBtdXN0IGJlIGNvbmZpZ3VyZWQgdG8gYWNjZXB0IElQIHBhY2tldHMgZm9yIG11bHRpcGxlCi1hZGRyZXNzZXMuIChJZiB0aGUgbWFjaGluZSBkb2VzIG5vdCBoYXZlIG11bHRpcGxlIG5ldHdvcmsgaW50ZXJmYWNlcywKLXRoZW4gdGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIHdpdGggdGhlIDxDT0RFPmlmY29uZmlnIGFsaWFzPC9DT0RFPgotY29tbWFuZCAoaWYgeW91ciBPUyBzdXBwb3J0cyBpdCksIG9yIHdpdGgga2VybmVsIHBhdGNoZXMgbGlrZSA8QQotSFJFRj0iLi4vbWlzYy92aWYtaW5mby5odG1sIj5WSUY8L0E+IChmb3IgU3VuT1MoVE0pIDQuMS54KSkuPFA+Ci0KLVRoZSBzcGVjaWFsIG5hbWUgPENPREU+X2RlZmF1bHRfPC9DT0RFPiBjYW4gYmUgc3BlY2lmaWVkIGluIHdoaWNoIGNhc2UKLXRoaXMgdmlydHVhbCBob3N0IHdpbGwgbWF0Y2ggYW55IElQIGFkZHJlc3MgdGhhdCBpcyBub3QgZXhwbGljaXRseSBsaXN0ZWQKLWluIGFub3RoZXIgdmlydHVhbCBob3N0LiAgSW4gdGhlIGFic2VuY2Ugb2YgYW55IF9kZWZhdWx0XyB2aXJ0dWFsIGhvc3QKLXRoZSAibWFpbiIgc2VydmVyIGNvbmZpZywgY29uc2lzdGluZyBvZiBhbGwgdGhvc2UgZGVmaW5pdGlvbnMgb3V0c2lkZQotYW55IFZpcnR1YWxIb3N0IHNlY3Rpb24sIGlzIHVzZWQgd2hlbiBubyBtYXRjaCBvY2N1cnMuPFA+Ci0KLVlvdSBjYW4gc3BlY2lmeSBhIDxDT0RFPjpwb3J0PC9DT0RFPiB0byBjaGFuZ2UgdGhlIHBvcnQgdGhhdCBpcyBtYXRjaGVkLgotSWYgdW5zcGVjaWZpZWQgdGhlbiBpdCBkZWZhdWx0cyB0byB0aGUgc2FtZSBwb3J0IGFzIHRoZSBtb3N0IHJlY2VudAotPENPREU+PEEgSFJFRj0iI3BvcnQiPlBvcnQ8L0E+PC9DT0RFPiBzdGF0ZW1lbnQgb2YgdGhlIG1haW4gc2VydmVyLiAgWW91Ci1tYXkgYWxzbyBzcGVjaWZ5IDxDT0RFPjoqPC9DT0RFPiB0byBtYXRjaCBhbGwgcG9ydHMgb24gdGhhdCBhZGRyZXNzLgotKFRoaXMgaXMgcmVjb21tZW5kZWQgd2hlbiB1c2VkIHdpdGggPENPREU+X2RlZmF1bHRfPC9DT0RFPi4pPFA+Ci0KLTxTVFJPTkc+U0VDVVJJVFk8L1NUUk9ORz46IFNlZSB0aGUKLTxBIEhSRUY9Ii4uL21pc2Mvc2VjdXJpdHlfdGlwcy5odG1sIj5zZWN1cml0eSB0aXBzPC9BPgotZG9jdW1lbnQgZm9yIGRldGFpbHMgb24gd2h5IHlvdXIgc2VjdXJpdHkgY291bGQgYmUgY29tcHJvbWlzZWQgaWYKLXRoZSBkaXJlY3Rvcnkgd2hlcmUgbG9nZmlsZXMgYXJlIHN0b3JlZCBpcyB3cml0YWJsZSBieSBhbnlvbmUgb3RoZXIKLXRoYW4gdGhlIHVzZXIgdGhhdCBzdGFydHMgdGhlIHNlcnZlci4KLQotPFA+PFNUUk9ORz5OT1RFPC9TVFJPTkc+OiBUaGUgdXNlIG9mICZsdDtWaXJ0dWFsSG9zdCZndDsgZG9lcwotPFNUUk9ORz5ub3Q8L1NUUk9ORz4gYWZmZWN0IHdoYXQgYWRkcmVzc2VzIEFwYWNoZSBsaXN0ZW5zIG9uLiBZb3UgbWF5Ci1uZWVkIHRvIGVuc3VyZSB0aGF0IEFwYWNoZSBpcyBsaXN0ZW5pbmcgb24gdGhlIGNvcnJlY3QgYWRkcmVzc2VzIHVzaW5nCi1laXRoZXIgPEEgSFJFRj0iI2JpbmRhZGRyZXNzIj5CaW5kQWRkcmVzczwvQT4gb3IgPEEKLUhSRUY9IiNsaXN0ZW4iPkxpc3RlbjwvQT4uCi0KLTxQPjxTVFJPTkc+U2VlIGFsc286PC9TVFJPTkc+Ci08QSBIUkVGPSIuLi92aG9zdHMvaW5kZXguaHRtbCI+QXBhY2hlIFZpcnR1YWwgSG9zdCBkb2N1bWVudGF0aW9uPC9BPjxCUj4KLTxTVFJPTkc+U2VlIGFsc286PC9TVFJPTkc+Ci08QSBIUkVGPSIuLi9kbnMtY2F2ZWF0cy5odG1sIj5XYXJuaW5ncyBhYm91dCBETlMgYW5kIEFwYWNoZTwvQT48QlI+Ci08U1RST05HPlNlZSBhbHNvOjwvU1RST05HPgotPEEgSFJFRj0iLi4vYmluZC5odG1sIj5TZXR0aW5nIHdoaWNoIGFkZHJlc3NlcyBhbmQgcG9ydHMgQXBhY2hlIHVzZXM8L0E+PEJSPgotPFNUUk9ORz5TZWUgYWxzbzwvU1RST05HPjogPEEgSFJFRj0iLi4vc2VjdGlvbnMuaHRtbCI+SG93IERpcmVjdG9yeSwKLUxvY2F0aW9uIGFuZCBGaWxlcyBzZWN0aW9ucyB3b3JrPC9BPiBmb3IgYW4gZXhwbGFuYXRpb24gb2YgaG93IHRoZXNlCi1kaWZmZXJlbnQgc2VjdGlvbnMgYXJlIGNvbWJpbmVkIHdoZW4gYSByZXF1ZXN0IGlzIHJlY2VpdmVkCi08L1A+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9kaXJlY3RpdmUtZGljdC5odG1sIGIvZG9jcy9tYW51YWwvbW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYTljM2YuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci0gPEhFQUQ+Ci0gIDxUSVRMRT5EZWZpbml0aW9ucyBvZiB0ZXJtcyB1c2VkIHRvIGRlc2NyaWJlIEFwYWNoZSBkaXJlY3RpdmVzCi0gIDwvVElUTEU+Ci0gPC9IRUFEPgotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotIDxCT0RZCi0gIEJHQ09MT1I9IiNGRkZGRkYiCi0gIFRFWFQ9IiMwMDAwMDAiCi0gIExJTks9IiMwMDAwRkYiCi0gIFZMSU5LPSIjMDAwMDgwIgotICBBTElOSz0iI0ZGMDAwMCIKLSA+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotICA8SDEgQUxJR049IkNFTlRFUiI+VGVybXMgVXNlZCB0byBEZXNjcmliZSBBcGFjaGUgRGlyZWN0aXZlczwvSDE+Ci0KLSAgPFA+Ci0gIEVhY2ggQXBhY2hlIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlIGlzIGRlc2NyaWJlZCB1c2luZyBhIGNvbW1vbiBmb3JtYXQKLSAgdGhhdCBsb29rcyBsaWtlIHRoaXM6Ci0gIDwvUD4KLSAgPERMPgotICAgPEREPjxBCi0gICAgICAgIEhSRUY9IiNTeW50YXgiCi0gICAgICAgIFJFTD0iSGVscCIKLSAgICAgICA+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiA8RU0+ZGlyZWN0aXZlLW5hbWU8L0VNPiA8RU0+c29tZSBhcmdzPC9FTT4KLSAgICAgICA8QlI+Ci0gICAgICAgPEEKLSAgICAgICAgSFJFRj0iI0RlZmF1bHQiCi0gICAgICAgIFJFTD0iSGVscCIKLSAgICAgICA+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4KLQk8U0FNUD48RU0+ZGlyZWN0aXZlLW5hbWUgZGVmYXVsdC12YWx1ZTwvRU0+PC9TQU1QPgotICAgICAgIDxCUj4KLSAgICAgICA8QQotICAgICAgICBIUkVGPSIjQ29udGV4dCIKLSAgICAgICAgUkVMPSJIZWxwIgotICAgICAgID48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiA8RU0+Y29udGV4dC1saXN0PC9FTT4KLSAgICAgICA8QlI+Ci0gICAgICAgPEEKLSAgICAgICAgSFJFRj0iI092ZXJyaWRlIgotICAgICAgICBSRUw9IkhlbHAiCi0gICAgICAgPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiA8RU0+b3ZlcnJpZGU8L0VNPgotICAgICAgIDxCUj4KLSAgICAgICA8QQotICAgICAgICBIUkVGPSIjU3RhdHVzIgotICAgICAgICBSRUw9IkhlbHAiCi0gICAgICAgPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gPEVNPnN0YXR1czwvRU0+Ci0gICAgICAgPEJSPgotICAgICAgIDxBCi0gICAgICAgIEhSRUY9IiNNb2R1bGUiCi0gICAgICAgIFJFTD0iSGVscCIKLSAgICAgICA+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiA8RU0+bW9kdWxlLW5hbWU8L0VNPgotICAgICAgIDxCUj4KLSAgICAgICA8QQotICAgICAgICBIUkVGPSIjQ29tcGF0aWJpbGl0eSIKLSAgICAgICAgUkVMPSJIZWxwIgotICAgICAgID48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiA8RU0+Y29tcGF0aWJpbGl0eSBub3RlczwvRU0+Ci0gICA8L0REPgotICA8L0RMPgotICA8UD4KLSAgRWFjaCBvZiB0aGUgZGlyZWN0aXZlJ3MgYXR0cmlidXRlcywgY29tcGxldGUgd2l0aCBwb3NzaWJsZSB2YWx1ZXMKLSAgd2hlcmUgcG9zc2libGUsIGFyZSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4KLSAgPC9QPgotCi0gIDxIMj5EaXJlY3RpdmUgVGVybXM8L0gyPgotICA8VUw+Ci0gICA8TEk+PEEgSFJFRj0iI1N5bnRheCI+U3ludGF4PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjRGVmYXVsdCI+RGVmYXVsdDwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI0NvbnRleHQiPkNvbnRleHQ8L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNPdmVycmlkZSI+T3ZlcnJpZGU8L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNTdGF0dXMiPlN0YXR1czwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI01vZHVsZSI+TW9kdWxlPC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjQ29tcGF0aWJpbGl0eSI+Q29tcGF0aWJpbGl0eTwvQT4KLSAgIDwvTEk+Ci0gIDwvVUw+Ci0KLSAgPEhSPgotICA8SDI+PEEgTkFNRT0iU3ludGF4Ij5TeW50YXg8L0E+PC9IMj4KLSAgPFA+Ci0gIFRoaXMgaW5kaWNhdGVzIHRoZSBmb3JtYXQgb2YgdGhlIGRpcmVjdGl2ZSBhcyBpdCB3b3VsZCBhcHBlYXIgaW4gYQotICBjb25maWd1cmF0aW9uIGZpbGUuICBUaGlzIHN5bnRheCBpcyBleHRyZW1lbHkgZGlyZWN0aXZlLXNwZWNpZmljLCBzbwotICByZWZlciB0byB0aGUgdGV4dCBvZiB0aGUgZGlyZWN0aXZlJ3MgZGVzY3JpcHRpb24gZm9yIGRldGFpbHMuCi0gIDwvUD4KLQotICA8SFI+Ci0gIDxIMj48QSBOQU1FPSJEZWZhdWx0Ij5EZWZhdWx0PC9BPjwvSDI+Ci0gIDxQPgotICBJZiB0aGUgZGlyZWN0aXZlIGhhcyBhIGRlZmF1bHQgdmFsdWUgKDxFTT5pLmUuPC9FTT4sIGlmIHlvdSBvbWl0IGl0Ci0gIGZyb20geW91ciBjb25maWd1cmF0aW9uIGVudGlyZWx5LCB0aGUgQXBhY2hlIFdlYiBzZXJ2ZXIgd2lsbCBiZWhhdmUgYXMKLSAgdGhvdWdoIHlvdSBzZXQgaXQgdG8gYSBwYXJ0aWN1bGFyIHZhbHVlKSwgaXQgaXMgZGVzY3JpYmVkIGhlcmUuICBJZgotICB0aGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlLCB0aGlzIHNlY3Rpb24gc2hvdWxkIHNheQotICAmcXVvdDs8RU0+Tm9uZTwvRU0+JnF1b3Q7LgotICA8L1A+Ci0KLSAgPEhSPgotICA8SDI+PEEgTkFNRT0iQ29udGV4dCI+Q29udGV4dDwvQT48L0gyPgotICA8UD4KLSAgVGhpcyBpbmRpY2F0ZXMgd2hlcmUgaW4gdGhlIHNlcnZlcidzIGNvbmZpZ3VyYXRpb24gZmlsZXMgdGhlIGRpcmVjdGl2ZQotICBpcyBsZWdhbC4gIEl0J3MgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nCi0gIHZhbHVlczoKLSAgPC9QPgotICA8REw+Ci0gICA8RFQ+PFNUUk9ORz5zZXJ2ZXIgY29uZmlnPC9TVFJPTkc+Ci0gICA8L0RUPgotICAgPEREPlRoaXMgbWVhbnMgdGhhdCB0aGUgZGlyZWN0aXZlIG1heSBiZSB1c2VkIGluIHRoZSBzZXJ2ZXIKLSAgICBjb25maWd1cmF0aW9uIGZpbGVzICg8RU0+ZS5nLjwvRU0+LCA8U0FNUD5odHRwZC5jb25mPC9TQU1QPiwKLSAgICA8U0FNUD5zcm0uY29uZjwvU0FNUD4sIGFuZCA8U0FNUD5hY2Nlc3MuY29uZjwvU0FNUD4pLCBidXQKLSAgICA8U1RST05HPm5vdDwvU1RST05HPiB3aXRoaW4gYW55IDxTQU1QPiZsdDtWaXJ0dWFsSG9zdCZndDs8L1NBTVA+IG9yCi0gICAgJmx0O0RpcmVjdG9yeSZndDsgY29udGFpbmVycy4gIEl0IGlzIG5vdCBhbGxvd2VkIGluCi0gICAgPFNBTVA+Lmh0YWNjZXNzPC9TQU1QPiBmaWxlcyBhdCBhbGwuCi0gICAgPFA+Ci0gICAgPC9QPgotICAgPC9ERD4KLSAgIDxEVD48U1RST05HPnZpcnR1YWwgaG9zdDwvU1RST05HPgotICAgPC9EVD4KLSAgIDxERD5UaGlzIGNvbnRleHQgbWVhbnMgdGhhdCB0aGUgZGlyZWN0aXZlIG1heSBhcHBlYXIgaW5zaWRlCi0gICAgPFNBTVA+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvU0FNUD4gY29udGFpbmVycyBpbiB0aGUgc2VydmVyCi0gICAgY29uZmlndXJhdGlvbiBmaWxlcy4KLSAgICA8UD4KLSAgICA8L1A+Ci0gICA8L0REPgotICAgPERUPjxTVFJPTkc+ZGlyZWN0b3J5PC9TVFJPTkc+Ci0gICA8L0RUPgotICAgPEREPkEgZGlyZWN0aXZlIG1hcmtlZCBhcyBiZWluZyB2YWxpZCBpbiB0aGlzIGNvbnRleHQgbWF5IGJlIHVzZWQKLSAgICBpbnNpZGUgPFNBTVA+Jmx0O0RpcmVjdG9yeSZndDs8L1NBTVA+LAotICAgIDxTQU1QPiZsdDtMb2NhdGlvbiZndDs8L1NBTVA+LCBhbmQgPFNBTVA+Jmx0O0ZpbGVzJmd0OzwvU0FNUD4KLSAgICBjb250YWluZXJzIGluIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlcywgc3ViamVjdCB0byB0aGUKLSAgICByZXN0cmljdGlvbnMgb3V0bGluZWQgaW4gPEEgSFJFRj0iLi4vc2VjdGlvbnMuaHRtbCI+SG93IERpcmVjdG9yeSwKLSAgICBMb2NhdGlvbiBhbmQgRmlsZXMgc2VjdGlvbnMgd29yazwvQT4uCi0gICAgPFA+Ci0gICAgPC9QPgotICAgPC9ERD4KLSAgIDxEVD48U1RST05HPi5odGFjY2VzczwvU1RST05HPgotICAgPC9EVD4KLSAgIDxERD5JZiBhIGRpcmVjdGl2ZSBpcyB2YWxpZCBpbiB0aGlzIGNvbnRleHQsIGl0IG1lYW5zIHRoYXQgaXQgY2FuCi0gICAgYXBwZWFyIGluc2lkZSA8RU0+cGVyPC9FTT4tZGlyZWN0b3J5IDxTQU1QPi5odGFjY2VzczwvU0FNUD4gZmlsZXMuCi0gICAgSXQgbWF5IG5vdCBiZSBwcm9jZXNzZWQsIHRob3VnaCBkZXBlbmRpbmcgdXBvbiB0aGUKLSAgICA8QQotICAgICBIUkVGPSIjT3ZlcnJpZGUiCi0gICAgIFJFTD0iSGVscCIKLSAgICA+b3ZlcnJpZGVzPC9BPgotICAgIGN1cnJlbnRseSBhY3RpdmUuCi0gICAgPFA+Ci0gICAgPC9QPgotICAgPC9ERD4KLSAgPC9ETD4KLSAgPFA+Ci0gIFRoZSBkaXJlY3RpdmUgaXMgPEVNPm9ubHk8L0VNPiBhbGxvd2VkIHdpdGhpbiB0aGUgZGVzaWduYXRlZCBjb250ZXh0OwotICBpZiB5b3UgdHJ5IHRvIHVzZSBpdCBlbHNld2hlcmUsIHlvdSdsbCBnZXQgYSBjb25maWd1cmF0aW9uIGVycm9yIHRoYXQKLSAgd2lsbCBlaXRoZXIgcHJldmVudCB0aGUgc2VydmVyIGZyb20gaGFuZGxpbmcgcmVxdWVzdHMgaW4gdGhhdCBjb250ZXh0Ci0gIGNvcnJlY3RseSwgb3Igd2lsbCBrZWVwIHRoZSBzZXJ2ZXIgZnJvbSBvcGVyYXRpbmcgYXQgYWxsIC0tCi0gIDxFTT5pLmUuPC9FTT4sIHRoZSBzZXJ2ZXIgd29uJ3QgZXZlbiBzdGFydC4KLSAgPC9QPgotICA8UD4KLSAgVGhlIHZhbGlkIGxvY2F0aW9ucyBmb3IgdGhlIGRpcmVjdGl2ZSBhcmUgYWN0dWFsbHkgdGhlIHJlc3VsdCBvZiBhCi0gIEJvb2xlYW4gT1Igb2YgYWxsIG9mIHRoZSBsaXN0ZWQgY29udGV4dHMuICBJbiBvdGhlciB3b3JkcywgYSBkaXJlY3RpdmUKLSAgdGhhdCBpcyBtYXJrZWQgYXMgYmVpbmcgdmFsaWQgaW4gJnF1b3Q7PFNBTVA+c2VydmVyIGNvbmZpZywKLSAgLmh0YWNjZXNzPC9TQU1QPiZxdW90OyBjYW4gYmUgdXNlZCBpbiB0aGUgPFNBTVA+aHR0cGQuY29uZjwvU0FNUD4gZmlsZQotICBhbmQgaW4gPFNBTVA+Lmh0YWNjZXNzPC9TQU1QPiBmaWxlcywgYnV0IG5vdCB3aXRoaW4gYW55Ci0gICZsdDtEaXJlY3RvcnkmZ3Q7IG9yICZsdDtWaXJ0dWFsSG9zdCZndDsgY29udGFpbmVycy4KLSAgPC9QPgotCi0gIDxIUj4KLSAgPEgyPjxBIE5BTUU9Ik92ZXJyaWRlIj5PdmVycmlkZTwvQT48L0gyPgotICA8UD4KLSAgVGhpcyBkaXJlY3RpdmUgYXR0cmlidXRlIGluZGljYXRlcyB3aGljaCBjb25maWd1cmF0aW9uIG92ZXJyaWRlIG11c3QKLSAgYmUgYWN0aXZlIGluIG9yZGVyIGZvciB0aGUgZGlyZWN0aXZlIHRvIGJlIHByb2Nlc3NlZCB3aGVuIGl0IGFwcGVhcnMKLSAgaW4gYSA8U0FNUD4uaHRhY2Nlc3M8L1NBTVA+IGZpbGUuICBJZiB0aGUgZGlyZWN0aXZlJ3MKLSAgPEEKLSAgIEhSRUY9IiNDb250ZXh0IgotICAgUkVMPSJIZWxwIgotICA+Y29udGV4dDwvQT4KLSAgZG9lc24ndCBwZXJtaXQgaXQgdG8gYXBwZWFyIGluIDxTQU1QPi5odGFjY2VzczwvU0FNUD4gZmlsZXMsIHRoaXMKLSAgYXR0cmlidXRlIHNob3VsZCBzYXkgJnF1b3Q7PEVNPk5vdCBhcHBsaWNhYmxlPC9FTT4mcXVvdDsuCi0gIDwvUD4KLSAgPFA+Ci0gIE92ZXJyaWRlcyBhcmUgYWN0aXZhdGVkIGJ5IHRoZQotICA8QQotICAgSFJFRj0iY29yZS5odG1sI2FsbG93b3ZlcnJpZGUiCi0gICBSRUw9IkhlbHAiCi0gID48U0FNUD5BbGxvd092ZXJyaWRlPC9TQU1QPjwvQT4KLSAgZGlyZWN0aXZlLCBhbmQgYXBwbHkgdG8gYSBwYXJ0aWN1bGFyIHNjb3BlIChzdWNoIGFzIGEgZGlyZWN0b3J5KSBhbmQKLSAgYWxsIGRlc2NlbmRhbnRzLCB1bmxlc3MgZnVydGhlciBtb2RpZmllZCBieSBvdGhlcgotICA8U0FNUD5BbGxvd092ZXJyaWRlPC9TQU1QPiBkaXJlY3RpdmVzIGF0IGxvd2VyIGxldmVscy4gIFRoZQotICBkb2N1bWVudGF0aW9uIGZvciB0aGF0IGRpcmVjdGl2ZSBhbHNvIGxpc3RzIHRoZSBwb3NzaWJsZSBvdmVycmlkZQotICBuYW1lcyBhdmFpbGFibGUuCi0gIDwvUD4KLQotICA8SFI+Ci0gIDxIMj48QSBOQU1FPSJTdGF0dXMiPlN0YXR1czwvQT48L0gyPgotICA8UD4KLSAgVGhpcyBpbmRpY2F0ZXMgaG93IHRpZ2h0bHkgYm91bmQgaW50byB0aGUgQXBhY2hlIFdlYiBzZXJ2ZXIgdGhlCi0gIGRpcmVjdGl2ZSBpczsgaW4gb3RoZXIgd29yZHMsIHlvdSBtYXkgbmVlZCB0byByZWNvbXBpbGUgdGhlIHNlcnZlcgotICB3aXRoIGFuIGVuaGFuY2VkIHNldCBvZiBtb2R1bGVzIGluIG9yZGVyIHRvIGdhaW4gYWNjZXNzIHRvIHRoZQotICBkaXJlY3RpdmUgYW5kIGl0cyBmdW5jdGlvbmFsaXR5LiAgUG9zc2libGUgdmFsdWVzIGZvciB0aGlzIGF0dHJpYnV0ZQotICBhcmU6Ci0gIDwvUD4KLSAgPERMPgotICAgPERUPjxTVFJPTkc+Q29yZTwvU1RST05HPgotICAgPC9EVD4KLSAgIDxERD5JZiBhIGRpcmVjdGl2ZSBpcyBsaXN0ZWQgYXMgaGF2aW5nICZxdW90O0NvcmUmcXVvdDsgc3RhdHVzLCB0aGF0Ci0gICAgbWVhbnMgaXQgaXMgcGFydCBvZiB0aGUgaW5uZXJtb3N0IHBvcnRpb25zIG9mIHRoZSBBcGFjaGUgV2ViIHNlcnZlciwKLSAgICBhbmQgaXMgYWx3YXlzIGF2YWlsYWJsZS4KLSAgICA8UD4KLSAgICA8L1A+Ci0gICA8L0REPgotICAgPERUPjxTVFJPTkc+QmFzZTwvU1RST05HPgotICAgPC9EVD4KLSAgIDxERD5BIGRpcmVjdGl2ZSBsYWJlbGVkIGFzIGhhdmluZyAmcXVvdDtCYXNlJnF1b3Q7IHN0YXR1cyBpcwotICAgIHN1cHBvcnRlZCBieSBvbmUgb2YgdGhlIHN0YW5kYXJkIEFwYWNoZSBtb2R1bGVzIHdoaWNoIGlzIGNvbXBpbGVkCi0gICAgaW50byB0aGUgc2VydmVyIGJ5IGRlZmF1bHQsIGFuZCBpcyB0aGVyZWZvcmUgbm9ybWFsbHkgYXZhaWxhYmxlCi0gICAgdW5sZXNzIHlvdSd2ZSB0YWtlbiBzdGVwcyB0byByZW1vdmUgdGhlIG1vZHVsZSBmcm9tIHlvdXIgY29uZmlndXJhdGlvbi4KLSAgICA8UD4KLSAgICA8L1A+Ci0gICA8L0REPgotICAgPERUPjxTVFJPTkc+RXh0ZW5zaW9uPC9TVFJPTkc+Ci0gICA8L0RUPgotICAgPEREPkEgZGlyZWN0aXZlIHdpdGggJnF1b3Q7RXh0ZW5zaW9uJnF1b3Q7IHN0YXR1cyBpcyBwcm92aWRlZCBieSBvbmUKLSAgICBvZiB0aGUgbW9kdWxlcyBpbmNsdWRlZCB3aXRoIHRoZSBBcGFjaGUgc2VydmVyIGtpdCwgYnV0IHRoZSBtb2R1bGUKLSAgICBpc24ndCBub3JtYWxseSBjb21waWxlZCBpbnRvIHRoZSBzZXJ2ZXIuICBUbyBlbmFibGUgdGhlIGRpcmVjdGl2ZQotICAgIGFuZCBpdHMgZnVuY3Rpb25hbGl0eSwgeW91IHdpbGwgbmVlZCB0byBjaGFuZ2UgdGhlIHNlcnZlciBidWlsZAotICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kIHJlLWNvbXBpbGUgQXBhY2hlLgotICAgIDxQPgotICAgIDwvUD4KLSAgIDwvREQ+Ci0gICA8RFQ+PFNUUk9ORz5FeHBlcmltZW50YWw8L1NUUk9ORz4KLSAgIDwvRFQ+Ci0gICA8REQ+JnF1b3Q7RXhwZXJpbWVudGFsJnF1b3Q7IHN0YXR1cyBpbmRpY2F0ZXMgdGhhdCB0aGUgZGlyZWN0aXZlIGlzCi0gICAgYXZhaWxhYmxlIGFzIHBhcnQgb2YgdGhlIEFwYWNoZSBraXQsIGJ1dCB5b3UncmUgb24geW91ciBvd24gaWYgeW91Ci0gICAgdHJ5IHRvIHVzZSBpdC4gIFRoZSBkaXJlY3RpdmUgaXMgYmVpbmcgZG9jdW1lbnRlZCBmb3IgY29tcGxldGVuZXNzLAotICAgIGFuZCBpcyBub3QgbmVjZXNzYXJpbHkgc3VwcG9ydGVkLiAgVGhlIG1vZHVsZSB3aGljaCBwcm92aWRlcyB0aGUKLSAgICBkaXJlY3RpdmUgbWF5IG9yIG1heSBub3QgYmUgY29tcGlsZWQgaW4gYnkgZGVmYXVsdDsgY2hlY2sgdGhlIHRvcCBvZgotICAgIHRoZSBwYWdlIHdoaWNoIGRlc2NyaWJlcyB0aGUgZGlyZWN0aXZlIGFuZCBpdHMgbW9kdWxlIHRvIHNlZSBpZiBpdAotICAgIHJlbWFya3Mgb24gdGhlIGF2YWlsYWJpbGl0eS4KLSAgICA8UD4KLSAgICA8L1A+Ci0gICA8L0REPgotICA8L0RMPgotCi0gIDxIUj4KLSAgPEgyPjxBIE5BTUU9Ik1vZHVsZSI+TW9kdWxlPC9BPjwvSDI+Ci0gIDxQPgotICBUaGlzIHF1aXRlIHNpbXBseSBsaXN0cyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIG1vZHVsZSB3aGljaCBkZWZpbmVzCi0gIHRoZSBkaXJlY3RpdmUuCi0gIDwvUD4KLQotICA8SFI+Ci0gIDxIMj48QSBOQU1FPSJDb21wYXRpYmlsaXR5Ij5Db21wYXRpYmlsaXR5PC9BPjwvSDI+Ci0gIDxQPgotICBJZiB0aGUgZGlyZWN0aXZlIHdhc24ndCBwYXJ0IG9mIHRoZSBvcmlnaW5hbCBBcGFjaGUgdmVyc2lvbiAxCi0gIGRpc3RyaWJ1dGlvbiwgdGhlIHZlcnNpb24gaW4gd2hpY2ggaXQgd2FzIGludHJvZHVjZWQgc2hvdWxkIGJlIGxpc3RlZAotICBoZXJlLiAgSWYgdGhlIGRpcmVjdGl2ZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyBvbmUgZnJvbSB0aGUgTkNTQSBIVFRQZAotICBzZXJ2ZXIsIGFueSBpbmNvbnNpc3RlbmNpZXMgaW4gYmVoYXZpb3VyIGJldHdlZW4gdGhlIHR3byBzaG91bGQgYWxzbwotICBiZSBtZW50aW9uZWQuICBPdGhlcndpc2UsIHRoaXMgYXR0cmlidXRlIHNob3VsZCBzYXkgJnF1b3Q7PEVNPk5vCi0gIGNvbXBhdGliaWxpdHkgaXNzdWVzLjwvRU0+JnF1b3Q7Ci0gIDwvUD4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci0gPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL2RpcmVjdGl2ZS1kaWN0Lmh0bWwuZW4gYi9kb2NzL21hbnVhbC9tb2QvZGlyZWN0aXZlLWRpY3QuaHRtbC5lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNhOWMzZi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvZGlyZWN0aXZlLWRpY3QuaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLSA8SEVBRD4KLSAgPFRJVExFPkRlZmluaXRpb25zIG9mIHRlcm1zIHVzZWQgdG8gZGVzY3JpYmUgQXBhY2hlIGRpcmVjdGl2ZXMKLSAgPC9USVRMRT4KLSA8L0hFQUQ+Ci08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci0gPEJPRFkKLSAgQkdDT0xPUj0iI0ZGRkZGRiIKLSAgVEVYVD0iIzAwMDAwMCIKLSAgTElOSz0iIzAwMDBGRiIKLSAgVkxJTks9IiMwMDAwODAiCi0gIEFMSU5LPSIjRkYwMDAwIgotID4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0gIDxIMSBBTElHTj0iQ0VOVEVSIj5UZXJtcyBVc2VkIHRvIERlc2NyaWJlIEFwYWNoZSBEaXJlY3RpdmVzPC9IMT4KLQotICA8UD4KLSAgRWFjaCBBcGFjaGUgY29uZmlndXJhdGlvbiBkaXJlY3RpdmUgaXMgZGVzY3JpYmVkIHVzaW5nIGEgY29tbW9uIGZvcm1hdAotICB0aGF0IGxvb2tzIGxpa2UgdGhpczoKLSAgPC9QPgotICA8REw+Ci0gICA8REQ+PEEKLSAgICAgICAgSFJFRj0iI1N5bnRheCIKLSAgICAgICAgUkVMPSJIZWxwIgotICAgICAgID48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IDxFTT5kaXJlY3RpdmUtbmFtZTwvRU0+IDxFTT5zb21lIGFyZ3M8L0VNPgotICAgICAgIDxCUj4KLSAgICAgICA8QQotICAgICAgICBIUkVGPSIjRGVmYXVsdCIKLSAgICAgICAgUkVMPSJIZWxwIgotICAgICAgID48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPgotCTxTQU1QPjxFTT5kaXJlY3RpdmUtbmFtZSBkZWZhdWx0LXZhbHVlPC9FTT48L1NBTVA+Ci0gICAgICAgPEJSPgotICAgICAgIDxBCi0gICAgICAgIEhSRUY9IiNDb250ZXh0IgotICAgICAgICBSRUw9IkhlbHAiCi0gICAgICAgPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IDxFTT5jb250ZXh0LWxpc3Q8L0VNPgotICAgICAgIDxCUj4KLSAgICAgICA8QQotICAgICAgICBIUkVGPSIjT3ZlcnJpZGUiCi0gICAgICAgIFJFTD0iSGVscCIKLSAgICAgICA+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IDxFTT5vdmVycmlkZTwvRU0+Ci0gICAgICAgPEJSPgotICAgICAgIDxBCi0gICAgICAgIEhSRUY9IiNTdGF0dXMiCi0gICAgICAgIFJFTD0iSGVscCIKLSAgICAgICA+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiA8RU0+c3RhdHVzPC9FTT4KLSAgICAgICA8QlI+Ci0gICAgICAgPEEKLSAgICAgICAgSFJFRj0iI01vZHVsZSIKLSAgICAgICAgUkVMPSJIZWxwIgotICAgICAgID48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IDxFTT5tb2R1bGUtbmFtZTwvRU0+Ci0gICAgICAgPEJSPgotICAgICAgIDxBCi0gICAgICAgIEhSRUY9IiNDb21wYXRpYmlsaXR5IgotICAgICAgICBSRUw9IkhlbHAiCi0gICAgICAgPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IDxFTT5jb21wYXRpYmlsaXR5IG5vdGVzPC9FTT4KLSAgIDwvREQ+Ci0gIDwvREw+Ci0gIDxQPgotICBFYWNoIG9mIHRoZSBkaXJlY3RpdmUncyBhdHRyaWJ1dGVzLCBjb21wbGV0ZSB3aXRoIHBvc3NpYmxlIHZhbHVlcwotICB3aGVyZSBwb3NzaWJsZSwgYXJlIGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LgotICA8L1A+Ci0KLSAgPEgyPkRpcmVjdGl2ZSBUZXJtczwvSDI+Ci0gIDxVTD4KLSAgIDxMST48QSBIUkVGPSIjU3ludGF4Ij5TeW50YXg8L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNEZWZhdWx0Ij5EZWZhdWx0PC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjQ29udGV4dCI+Q29udGV4dDwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI092ZXJyaWRlIj5PdmVycmlkZTwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI1N0YXR1cyI+U3RhdHVzPC9BPgotICAgPC9MST4KLSAgIDxMST48QSBIUkVGPSIjTW9kdWxlIj5Nb2R1bGU8L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNDb21wYXRpYmlsaXR5Ij5Db21wYXRpYmlsaXR5PC9BPgotICAgPC9MST4KLSAgPC9VTD4KLQotICA8SFI+Ci0gIDxIMj48QSBOQU1FPSJTeW50YXgiPlN5bnRheDwvQT48L0gyPgotICA8UD4KLSAgVGhpcyBpbmRpY2F0ZXMgdGhlIGZvcm1hdCBvZiB0aGUgZGlyZWN0aXZlIGFzIGl0IHdvdWxkIGFwcGVhciBpbiBhCi0gIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFRoaXMgc3ludGF4IGlzIGV4dHJlbWVseSBkaXJlY3RpdmUtc3BlY2lmaWMsIHNvCi0gIHJlZmVyIHRvIHRoZSB0ZXh0IG9mIHRoZSBkaXJlY3RpdmUncyBkZXNjcmlwdGlvbiBmb3IgZGV0YWlscy4KLSAgPC9QPgotCi0gIDxIUj4KLSAgPEgyPjxBIE5BTUU9IkRlZmF1bHQiPkRlZmF1bHQ8L0E+PC9IMj4KLSAgPFA+Ci0gIElmIHRoZSBkaXJlY3RpdmUgaGFzIGEgZGVmYXVsdCB2YWx1ZSAoPEVNPmkuZS48L0VNPiwgaWYgeW91IG9taXQgaXQKLSAgZnJvbSB5b3VyIGNvbmZpZ3VyYXRpb24gZW50aXJlbHksIHRoZSBBcGFjaGUgV2ViIHNlcnZlciB3aWxsIGJlaGF2ZSBhcwotICB0aG91Z2ggeW91IHNldCBpdCB0byBhIHBhcnRpY3VsYXIgdmFsdWUpLCBpdCBpcyBkZXNjcmliZWQgaGVyZS4gIElmCi0gIHRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUsIHRoaXMgc2VjdGlvbiBzaG91bGQgc2F5Ci0gICZxdW90OzxFTT5Ob25lPC9FTT4mcXVvdDsuCi0gIDwvUD4KLQotICA8SFI+Ci0gIDxIMj48QSBOQU1FPSJDb250ZXh0Ij5Db250ZXh0PC9BPjwvSDI+Ci0gIDxQPgotICBUaGlzIGluZGljYXRlcyB3aGVyZSBpbiB0aGUgc2VydmVyJ3MgY29uZmlndXJhdGlvbiBmaWxlcyB0aGUgZGlyZWN0aXZlCi0gIGlzIGxlZ2FsLiAgSXQncyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcKLSAgdmFsdWVzOgotICA8L1A+Ci0gIDxETD4KLSAgIDxEVD48U1RST05HPnNlcnZlciBjb25maWc8L1NUUk9ORz4KLSAgIDwvRFQ+Ci0gICA8REQ+VGhpcyBtZWFucyB0aGF0IHRoZSBkaXJlY3RpdmUgbWF5IGJlIHVzZWQgaW4gdGhlIHNlcnZlcgotICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMgKDxFTT5lLmcuPC9FTT4sIDxTQU1QPmh0dHBkLmNvbmY8L1NBTVA+LAotICAgIDxTQU1QPnNybS5jb25mPC9TQU1QPiwgYW5kIDxTQU1QPmFjY2Vzcy5jb25mPC9TQU1QPiksIGJ1dAotICAgIDxTVFJPTkc+bm90PC9TVFJPTkc+IHdpdGhpbiBhbnkgPFNBTVA+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvU0FNUD4gb3IKLSAgICAmbHQ7RGlyZWN0b3J5Jmd0OyBjb250YWluZXJzLiAgSXQgaXMgbm90IGFsbG93ZWQgaW4KLSAgICA8U0FNUD4uaHRhY2Nlc3M8L1NBTVA+IGZpbGVzIGF0IGFsbC4KLSAgICA8UD4KLSAgICA8L1A+Ci0gICA8L0REPgotICAgPERUPjxTVFJPTkc+dmlydHVhbCBob3N0PC9TVFJPTkc+Ci0gICA8L0RUPgotICAgPEREPlRoaXMgY29udGV4dCBtZWFucyB0aGF0IHRoZSBkaXJlY3RpdmUgbWF5IGFwcGVhciBpbnNpZGUKLSAgICA8U0FNUD4mbHQ7VmlydHVhbEhvc3QmZ3Q7PC9TQU1QPiBjb250YWluZXJzIGluIHRoZSBzZXJ2ZXIKLSAgICBjb25maWd1cmF0aW9uIGZpbGVzLgotICAgIDxQPgotICAgIDwvUD4KLSAgIDwvREQ+Ci0gICA8RFQ+PFNUUk9ORz5kaXJlY3Rvcnk8L1NUUk9ORz4KLSAgIDwvRFQ+Ci0gICA8REQ+QSBkaXJlY3RpdmUgbWFya2VkIGFzIGJlaW5nIHZhbGlkIGluIHRoaXMgY29udGV4dCBtYXkgYmUgdXNlZAotICAgIGluc2lkZSA8U0FNUD4mbHQ7RGlyZWN0b3J5Jmd0OzwvU0FNUD4sCi0gICAgPFNBTVA+Jmx0O0xvY2F0aW9uJmd0OzwvU0FNUD4sIGFuZCA8U0FNUD4mbHQ7RmlsZXMmZ3Q7PC9TQU1QPgotICAgIGNvbnRhaW5lcnMgaW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGVzLCBzdWJqZWN0IHRvIHRoZQotICAgIHJlc3RyaWN0aW9ucyBvdXRsaW5lZCBpbiA8QSBIUkVGPSIuLi9zZWN0aW9ucy5odG1sIj5Ib3cgRGlyZWN0b3J5LAotICAgIExvY2F0aW9uIGFuZCBGaWxlcyBzZWN0aW9ucyB3b3JrPC9BPi4KLSAgICA8UD4KLSAgICA8L1A+Ci0gICA8L0REPgotICAgPERUPjxTVFJPTkc+Lmh0YWNjZXNzPC9TVFJPTkc+Ci0gICA8L0RUPgotICAgPEREPklmIGEgZGlyZWN0aXZlIGlzIHZhbGlkIGluIHRoaXMgY29udGV4dCwgaXQgbWVhbnMgdGhhdCBpdCBjYW4KLSAgICBhcHBlYXIgaW5zaWRlIDxFTT5wZXI8L0VNPi1kaXJlY3RvcnkgPFNBTVA+Lmh0YWNjZXNzPC9TQU1QPiBmaWxlcy4KLSAgICBJdCBtYXkgbm90IGJlIHByb2Nlc3NlZCwgdGhvdWdoIGRlcGVuZGluZyB1cG9uIHRoZQotICAgIDxBCi0gICAgIEhSRUY9IiNPdmVycmlkZSIKLSAgICAgUkVMPSJIZWxwIgotICAgID5vdmVycmlkZXM8L0E+Ci0gICAgY3VycmVudGx5IGFjdGl2ZS4KLSAgICA8UD4KLSAgICA8L1A+Ci0gICA8L0REPgotICA8L0RMPgotICA8UD4KLSAgVGhlIGRpcmVjdGl2ZSBpcyA8RU0+b25seTwvRU0+IGFsbG93ZWQgd2l0aGluIHRoZSBkZXNpZ25hdGVkIGNvbnRleHQ7Ci0gIGlmIHlvdSB0cnkgdG8gdXNlIGl0IGVsc2V3aGVyZSwgeW91J2xsIGdldCBhIGNvbmZpZ3VyYXRpb24gZXJyb3IgdGhhdAotICB3aWxsIGVpdGhlciBwcmV2ZW50IHRoZSBzZXJ2ZXIgZnJvbSBoYW5kbGluZyByZXF1ZXN0cyBpbiB0aGF0IGNvbnRleHQKLSAgY29ycmVjdGx5LCBvciB3aWxsIGtlZXAgdGhlIHNlcnZlciBmcm9tIG9wZXJhdGluZyBhdCBhbGwgLS0KLSAgPEVNPmkuZS48L0VNPiwgdGhlIHNlcnZlciB3b24ndCBldmVuIHN0YXJ0LgotICA8L1A+Ci0gIDxQPgotICBUaGUgdmFsaWQgbG9jYXRpb25zIGZvciB0aGUgZGlyZWN0aXZlIGFyZSBhY3R1YWxseSB0aGUgcmVzdWx0IG9mIGEKLSAgQm9vbGVhbiBPUiBvZiBhbGwgb2YgdGhlIGxpc3RlZCBjb250ZXh0cy4gIEluIG90aGVyIHdvcmRzLCBhIGRpcmVjdGl2ZQotICB0aGF0IGlzIG1hcmtlZCBhcyBiZWluZyB2YWxpZCBpbiAmcXVvdDs8U0FNUD5zZXJ2ZXIgY29uZmlnLAotICAuaHRhY2Nlc3M8L1NBTVA+JnF1b3Q7IGNhbiBiZSB1c2VkIGluIHRoZSA8U0FNUD5odHRwZC5jb25mPC9TQU1QPiBmaWxlCi0gIGFuZCBpbiA8U0FNUD4uaHRhY2Nlc3M8L1NBTVA+IGZpbGVzLCBidXQgbm90IHdpdGhpbiBhbnkKLSAgJmx0O0RpcmVjdG9yeSZndDsgb3IgJmx0O1ZpcnR1YWxIb3N0Jmd0OyBjb250YWluZXJzLgotICA8L1A+Ci0KLSAgPEhSPgotICA8SDI+PEEgTkFNRT0iT3ZlcnJpZGUiPk92ZXJyaWRlPC9BPjwvSDI+Ci0gIDxQPgotICBUaGlzIGRpcmVjdGl2ZSBhdHRyaWJ1dGUgaW5kaWNhdGVzIHdoaWNoIGNvbmZpZ3VyYXRpb24gb3ZlcnJpZGUgbXVzdAotICBiZSBhY3RpdmUgaW4gb3JkZXIgZm9yIHRoZSBkaXJlY3RpdmUgdG8gYmUgcHJvY2Vzc2VkIHdoZW4gaXQgYXBwZWFycwotICBpbiBhIDxTQU1QPi5odGFjY2VzczwvU0FNUD4gZmlsZS4gIElmIHRoZSBkaXJlY3RpdmUncwotICA8QQotICAgSFJFRj0iI0NvbnRleHQiCi0gICBSRUw9IkhlbHAiCi0gID5jb250ZXh0PC9BPgotICBkb2Vzbid0IHBlcm1pdCBpdCB0byBhcHBlYXIgaW4gPFNBTVA+Lmh0YWNjZXNzPC9TQU1QPiBmaWxlcywgdGhpcwotICBhdHRyaWJ1dGUgc2hvdWxkIHNheSAmcXVvdDs8RU0+Tm90IGFwcGxpY2FibGU8L0VNPiZxdW90Oy4KLSAgPC9QPgotICA8UD4KLSAgT3ZlcnJpZGVzIGFyZSBhY3RpdmF0ZWQgYnkgdGhlCi0gIDxBCi0gICBIUkVGPSJjb3JlLmh0bWwjYWxsb3dvdmVycmlkZSIKLSAgIFJFTD0iSGVscCIKLSAgPjxTQU1QPkFsbG93T3ZlcnJpZGU8L1NBTVA+PC9BPgotICBkaXJlY3RpdmUsIGFuZCBhcHBseSB0byBhIHBhcnRpY3VsYXIgc2NvcGUgKHN1Y2ggYXMgYSBkaXJlY3RvcnkpIGFuZAotICBhbGwgZGVzY2VuZGFudHMsIHVubGVzcyBmdXJ0aGVyIG1vZGlmaWVkIGJ5IG90aGVyCi0gIDxTQU1QPkFsbG93T3ZlcnJpZGU8L1NBTVA+IGRpcmVjdGl2ZXMgYXQgbG93ZXIgbGV2ZWxzLiAgVGhlCi0gIGRvY3VtZW50YXRpb24gZm9yIHRoYXQgZGlyZWN0aXZlIGFsc28gbGlzdHMgdGhlIHBvc3NpYmxlIG92ZXJyaWRlCi0gIG5hbWVzIGF2YWlsYWJsZS4KLSAgPC9QPgotCi0gIDxIUj4KLSAgPEgyPjxBIE5BTUU9IlN0YXR1cyI+U3RhdHVzPC9BPjwvSDI+Ci0gIDxQPgotICBUaGlzIGluZGljYXRlcyBob3cgdGlnaHRseSBib3VuZCBpbnRvIHRoZSBBcGFjaGUgV2ViIHNlcnZlciB0aGUKLSAgZGlyZWN0aXZlIGlzOyBpbiBvdGhlciB3b3JkcywgeW91IG1heSBuZWVkIHRvIHJlY29tcGlsZSB0aGUgc2VydmVyCi0gIHdpdGggYW4gZW5oYW5jZWQgc2V0IG9mIG1vZHVsZXMgaW4gb3JkZXIgdG8gZ2FpbiBhY2Nlc3MgdG8gdGhlCi0gIGRpcmVjdGl2ZSBhbmQgaXRzIGZ1bmN0aW9uYWxpdHkuICBQb3NzaWJsZSB2YWx1ZXMgZm9yIHRoaXMgYXR0cmlidXRlCi0gIGFyZToKLSAgPC9QPgotICA8REw+Ci0gICA8RFQ+PFNUUk9ORz5Db3JlPC9TVFJPTkc+Ci0gICA8L0RUPgotICAgPEREPklmIGEgZGlyZWN0aXZlIGlzIGxpc3RlZCBhcyBoYXZpbmcgJnF1b3Q7Q29yZSZxdW90OyBzdGF0dXMsIHRoYXQKLSAgICBtZWFucyBpdCBpcyBwYXJ0IG9mIHRoZSBpbm5lcm1vc3QgcG9ydGlvbnMgb2YgdGhlIEFwYWNoZSBXZWIgc2VydmVyLAotICAgIGFuZCBpcyBhbHdheXMgYXZhaWxhYmxlLgotICAgIDxQPgotICAgIDwvUD4KLSAgIDwvREQ+Ci0gICA8RFQ+PFNUUk9ORz5CYXNlPC9TVFJPTkc+Ci0gICA8L0RUPgotICAgPEREPkEgZGlyZWN0aXZlIGxhYmVsZWQgYXMgaGF2aW5nICZxdW90O0Jhc2UmcXVvdDsgc3RhdHVzIGlzCi0gICAgc3VwcG9ydGVkIGJ5IG9uZSBvZiB0aGUgc3RhbmRhcmQgQXBhY2hlIG1vZHVsZXMgd2hpY2ggaXMgY29tcGlsZWQKLSAgICBpbnRvIHRoZSBzZXJ2ZXIgYnkgZGVmYXVsdCwgYW5kIGlzIHRoZXJlZm9yZSBub3JtYWxseSBhdmFpbGFibGUKLSAgICB1bmxlc3MgeW91J3ZlIHRha2VuIHN0ZXBzIHRvIHJlbW92ZSB0aGUgbW9kdWxlIGZyb20geW91ciBjb25maWd1cmF0aW9uLgotICAgIDxQPgotICAgIDwvUD4KLSAgIDwvREQ+Ci0gICA8RFQ+PFNUUk9ORz5FeHRlbnNpb248L1NUUk9ORz4KLSAgIDwvRFQ+Ci0gICA8REQ+QSBkaXJlY3RpdmUgd2l0aCAmcXVvdDtFeHRlbnNpb24mcXVvdDsgc3RhdHVzIGlzIHByb3ZpZGVkIGJ5IG9uZQotICAgIG9mIHRoZSBtb2R1bGVzIGluY2x1ZGVkIHdpdGggdGhlIEFwYWNoZSBzZXJ2ZXIga2l0LCBidXQgdGhlIG1vZHVsZQotICAgIGlzbid0IG5vcm1hbGx5IGNvbXBpbGVkIGludG8gdGhlIHNlcnZlci4gIFRvIGVuYWJsZSB0aGUgZGlyZWN0aXZlCi0gICAgYW5kIGl0cyBmdW5jdGlvbmFsaXR5LCB5b3Ugd2lsbCBuZWVkIHRvIGNoYW5nZSB0aGUgc2VydmVyIGJ1aWxkCi0gICAgY29uZmlndXJhdGlvbiBmaWxlcyBhbmQgcmUtY29tcGlsZSBBcGFjaGUuCi0gICAgPFA+Ci0gICAgPC9QPgotICAgPC9ERD4KLSAgIDxEVD48U1RST05HPkV4cGVyaW1lbnRhbDwvU1RST05HPgotICAgPC9EVD4KLSAgIDxERD4mcXVvdDtFeHBlcmltZW50YWwmcXVvdDsgc3RhdHVzIGluZGljYXRlcyB0aGF0IHRoZSBkaXJlY3RpdmUgaXMKLSAgICBhdmFpbGFibGUgYXMgcGFydCBvZiB0aGUgQXBhY2hlIGtpdCwgYnV0IHlvdSdyZSBvbiB5b3VyIG93biBpZiB5b3UKLSAgICB0cnkgdG8gdXNlIGl0LiAgVGhlIGRpcmVjdGl2ZSBpcyBiZWluZyBkb2N1bWVudGVkIGZvciBjb21wbGV0ZW5lc3MsCi0gICAgYW5kIGlzIG5vdCBuZWNlc3NhcmlseSBzdXBwb3J0ZWQuICBUaGUgbW9kdWxlIHdoaWNoIHByb3ZpZGVzIHRoZQotICAgIGRpcmVjdGl2ZSBtYXkgb3IgbWF5IG5vdCBiZSBjb21waWxlZCBpbiBieSBkZWZhdWx0OyBjaGVjayB0aGUgdG9wIG9mCi0gICAgdGhlIHBhZ2Ugd2hpY2ggZGVzY3JpYmVzIHRoZSBkaXJlY3RpdmUgYW5kIGl0cyBtb2R1bGUgdG8gc2VlIGlmIGl0Ci0gICAgcmVtYXJrcyBvbiB0aGUgYXZhaWxhYmlsaXR5LgotICAgIDxQPgotICAgIDwvUD4KLSAgIDwvREQ+Ci0gIDwvREw+Ci0KLSAgPEhSPgotICA8SDI+PEEgTkFNRT0iTW9kdWxlIj5Nb2R1bGU8L0E+PC9IMj4KLSAgPFA+Ci0gIFRoaXMgcXVpdGUgc2ltcGx5IGxpc3RzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgbW9kdWxlIHdoaWNoIGRlZmluZXMKLSAgdGhlIGRpcmVjdGl2ZS4KLSAgPC9QPgotCi0gIDxIUj4KLSAgPEgyPjxBIE5BTUU9IkNvbXBhdGliaWxpdHkiPkNvbXBhdGliaWxpdHk8L0E+PC9IMj4KLSAgPFA+Ci0gIElmIHRoZSBkaXJlY3RpdmUgd2Fzbid0IHBhcnQgb2YgdGhlIG9yaWdpbmFsIEFwYWNoZSB2ZXJzaW9uIDEKLSAgZGlzdHJpYnV0aW9uLCB0aGUgdmVyc2lvbiBpbiB3aGljaCBpdCB3YXMgaW50cm9kdWNlZCBzaG91bGQgYmUgbGlzdGVkCi0gIGhlcmUuICBJZiB0aGUgZGlyZWN0aXZlIGhhcyB0aGUgc2FtZSBuYW1lIGFzIG9uZSBmcm9tIHRoZSBOQ1NBIEhUVFBkCi0gIHNlcnZlciwgYW55IGluY29uc2lzdGVuY2llcyBpbiBiZWhhdmlvdXIgYmV0d2VlbiB0aGUgdHdvIHNob3VsZCBhbHNvCi0gIGJlIG1lbnRpb25lZC4gIE90aGVyd2lzZSwgdGhpcyBhdHRyaWJ1dGUgc2hvdWxkIHNheSAmcXVvdDs8RU0+Tm8KLSAgY29tcGF0aWJpbGl0eSBpc3N1ZXMuPC9FTT4mcXVvdDsKLSAgPC9QPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLSA8L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvZGlyZWN0aXZlcy5odG1sIGIvZG9jcy9tYW51YWwvbW9kL2RpcmVjdGl2ZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJkMmU0Zi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvZGlyZWN0aXZlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIGRpcmVjdGl2ZXM8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5BcGFjaGUgRGlyZWN0aXZlczwvSDE+Ci08UD4KLUVhY2ggQXBhY2hlIGRpcmVjdGl2ZSBhdmFpbGFibGUgaW4gdGhlIHN0YW5kYXJkIEFwYWNoZSBkaXN0cmlidXRpb24gaXMKLWxpc3RlZCBoZXJlLiAgVGhleSBhcmUgZGVzY3JpYmVkIHVzaW5nIGEgY29uc2lzdGVudCBmb3JtYXQsIGFuZCB0aGVyZSBpcwotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sIgotIFJFTD0iR2xvc3NhcnkiCi0+YSBkaWN0aW9uYXJ5PC9BPgotb2YgdGhlIHRlcm1zIHVzZWQgaW4gdGhlaXIgZGVzY3JpcHRpb25zIGF2YWlsYWJsZS4KLTwvUD4KLTxVTD4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjYWNjZXNzY29uZmlnIj5BY2Nlc3NDb25maWc8L0E+Ci08TEk+PEEgSFJFRj0iY29yZS5odG1sI2FjY2Vzc2ZpbGVuYW1lIj5BY2Nlc3NGaWxlTmFtZTwvQT4KLTxMST48QSBIUkVGPSJtb2RfYWN0aW9ucy5odG1sI2FjdGlvbiI+QWN0aW9uPC9BPgotPExJPjxBIEhSRUY9Im1vZF9hdXRvaW5kZXguaHRtbCNhZGRhbHQiPkFkZEFsdDwvQT4KLTxMST48QSBIUkVGPSJtb2RfYXV0b2luZGV4Lmh0bWwjYWRkYWx0YnllbmNvZGluZyI+QWRkQWx0QnlFbmNvZGluZzwvQT4KLTxMST48QSBIUkVGPSJtb2RfYXV0b2luZGV4Lmh0bWwjYWRkYWx0Ynl0eXBlIj5BZGRBbHRCeVR5cGU8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2F1dG9pbmRleC5odG1sI2FkZGRlc2NyaXB0aW9uIj5BZGREZXNjcmlwdGlvbjwvQT4KLTxMST48QSBIUkVGPSJtb2RfbWltZS5odG1sI2FkZGVuY29kaW5nIj5BZGRFbmNvZGluZzwvQT4KLTxMST48QSBIUkVGPSJtb2RfbWltZS5odG1sI2FkZGhhbmRsZXIiPkFkZEhhbmRsZXI8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2F1dG9pbmRleC5odG1sI2FkZGljb24iPkFkZEljb248L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2F1dG9pbmRleC5odG1sI2FkZGljb25ieWVuY29kaW5nIj5BZGRJY29uQnlFbmNvZGluZzwvQT4KLTxMST48QSBIUkVGPSJtb2RfYXV0b2luZGV4Lmh0bWwjYWRkaWNvbmJ5dHlwZSI+QWRkSWNvbkJ5VHlwZTwvQT4KLTxMST48QSBIUkVGPSJtb2RfbWltZS5odG1sI2FkZGxhbmd1YWdlIj5BZGRMYW5ndWFnZTwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjYWRkbW9kdWxlIj5BZGRNb2R1bGU8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2luZm8uaHRtbCNhZGRtb2R1bGVpbmZvIj5BZGRNb2R1bGVJbmZvPC9BPgotPExJPjxBIEhSRUY9Im1vZF9taW1lLmh0bWwjYWRkdHlwZSI+QWRkVHlwZTwvQT4KLTxMST48QSBIUkVGPSJtb2RfbG9nX2FnZW50Lmh0bWwjYWdlbnRsb2ciPkFnZW50TG9nPC9BPgotPExJPjxBIEhSRUY9Im1vZF9hbGlhcy5odG1sI2FsaWFzIj5BbGlhczwvQT4KLTxMST48QSBIUkVGPSJtb2RfYWxpYXMuaHRtbCNhbGlhc21hdGNoIj5BbGlhc01hdGNoPC9BPgotPExJPjxBIEhSRUY9Im1vZF9hY2Nlc3MuaHRtbCNhbGxvdyI+YWxsb3c8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX3Byb3h5Lmh0bWwjYWxsb3djb25uZWN0Ij5BbGxvd0NPTk5FQ1Q8L0E+Ci08TEk+PEEgSFJFRj0iY29yZS5odG1sI2FsbG93b3ZlcnJpZGUiPkFsbG93T3ZlcnJpZGU8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2F1dGhfYW5vbi5odG1sI2Fub255bW91cyI+QW5vbnltb3VzPC9BPgotPExJPjxBIEhSRUY9Im1vZF9hdXRoX2Fub24uaHRtbCNBdXRob3JpdGF0aXZlIj5Bbm9ueW1vdXNfQXV0aG9yaXRhdGl2ZTwvQT4KLTxMST48QSBIUkVGPSJtb2RfYXV0aF9hbm9uLmh0bWwjTG9nRW1haWwiPkFub255bW91c19Mb2dFbWFpbDwvQT4KLTxMST48QSBIUkVGPSJtb2RfYXV0aF9hbm9uLmh0bWwjTXVzdEdpdmVFbWFpbCI+QW5vbnltb3VzX011c3RHaXZlRW1haWw8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2F1dGhfYW5vbi5odG1sI05vVXNlcklEIj5Bbm9ueW1vdXNfTm9Vc2VySUQ8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2F1dGhfYW5vbi5odG1sI1ZlcmlmeUVtYWlsIj5Bbm9ueW1vdXNfVmVyaWZ5RW1haWw8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2F1dGguaHRtbCNhdXRoYXV0aG9yaXRhdGl2ZSI+QXV0aEF1dGhvcml0YXRpdmU8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2F1dGhfZGIuaHRtbCNhdXRoZGJhdXRob3JpdGF0aXZlIj5BdXRoREJBdXRob3JpdGF0aXZlPC9BPgotPExJPjxBIEhSRUY9Im1vZF9hdXRoX2RiLmh0bWwjYXV0aGRiZ3JvdXBmaWxlIj5BdXRoREJHcm91cEZpbGU8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2F1dGhfZGJtLmh0bWwjYXV0aGRibWF1dGhvcml0YXRpdmUiPkF1dGhEQk1BdXRob3JpdGF0aXZlPC9BPgotPExJPjxBIEhSRUY9Im1vZF9hdXRoX2RibS5odG1sI2F1dGhkYm1ncm91cGZpbGUiPkF1dGhEQk1Hcm91cEZpbGU8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2F1dGhfZGJtLmh0bWwjYXV0aGRibWdyb3VwZmlsZSI+QXV0aERCTUdyb3VwRmlsZTwvQT4KLTxMST48QSBIUkVGPSJtb2RfYXV0aF9kYi5odG1sI2F1dGhkYnVzZXJmaWxlIj5BdXRoREJVc2VyRmlsZTwvQT4KLTxMST48QSBIUkVGPSJtb2RfYXV0aF9kYm0uaHRtbCNhdXRoZGJtdXNlcmZpbGUiPkF1dGhEQk1Vc2VyRmlsZTwvQT4KLTxMST48QSBIUkVGPSJtb2RfZGlnZXN0Lmh0bWwjYXV0aGRpZ2VzdGZpbGUiPkF1dGhEaWdlc3RGaWxlPC9BPgotPExJPjxBIEhSRUY9Im1vZF9hdXRoLmh0bWwjYXV0aGdyb3VwZmlsZSI+QXV0aEdyb3VwRmlsZTwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjYXV0aG5hbWUiPkF1dGhOYW1lPC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNhdXRodHlwZSI+QXV0aFR5cGU8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2F1dGguaHRtbCNhdXRodXNlcmZpbGUiPkF1dGhVc2VyRmlsZTwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjYmluZGFkZHJlc3MiPkJpbmRBZGRyZXNzPC9BPgotPExJPjxBIEhSRUY9Im1vZF9zZXRlbnZpZi5odG1sI0Jyb3dzZXJNYXRjaCI+QnJvd3Nlck1hdGNoPC9BPgotPExJPjxBIEhSRUY9Im1vZF9zZXRlbnZpZi5odG1sI0Jyb3dzZXJNYXRjaE5vQ2FzZSI+QnJvd3Nlck1hdGNoTm9DYXNlPC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNiczIwMDBhY2NvdW50Ij5CUzIwMDBBY2NvdW50PC9BPgotPExJPjxBIEhSRUY9Im1vZF9wcm94eS5odG1sI2NhY2hlZGVmYXVsdGV4cGlyZSI+Q2FjaGVEZWZhdWx0RXhwaXJlPC9BPgotPExJPjxBIEhSRUY9Im1vZF9wcm94eS5odG1sI2NhY2hlZGlybGVuZ3RoIj5DYWNoZURpckxlbmd0aDwvQT4KLTxMST48QSBIUkVGPSJtb2RfcHJveHkuaHRtbCNjYWNoZWRpcmxldmVscyI+Q2FjaGVEaXJMZXZlbHM8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX3Byb3h5Lmh0bWwjY2FjaGVmb3JjZWNvbXBsZXRpb24iPkNhY2hlRm9yY2VDb21wbGV0aW9uPC9BPgotPExJPjxBIEhSRUY9Im1vZF9wcm94eS5odG1sI2NhY2hlZ2NpbnRlcnZhbCI+Q2FjaGVHY0ludGVydmFsPC9BPgotPExJPjxBIEhSRUY9Im1vZF9wcm94eS5odG1sI2NhY2hlbGFzdG1vZGlmaWVkZmFjdG9yIj5DYWNoZUxhc3RNb2RpZmllZEZhY3RvcjwvQT4KLTxMST48QSBIUkVGPSJtb2RfcHJveHkuaHRtbCNjYWNoZW1heGV4cGlyZSI+Q2FjaGVNYXhFeHBpcmU8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX25lZ290aWF0aW9uLmh0bWwjY2FjaGVuZWdvdGlhdGVkZG9jcyI+Q2FjaGVOZWdvdGlhdGVkRG9jczwvQT4KLTxMST48QSBIUkVGPSJtb2RfcHJveHkuaHRtbCNjYWNoZXJvb3QiPkNhY2hlUm9vdDwvQT4KLTxMST48QSBIUkVGPSJtb2RfcHJveHkuaHRtbCNjYWNoZXNpemUiPkNhY2hlU2l6ZTwvQT4KLTxMST48QSBIUkVGPSJtb2Rfc3BlbGluZy5odG1sI2NoZWNrc3BlbGxpbmciPkNoZWNrU3BlbGxpbmc8L0E+Ci08TEk+PEEgSFJFRj0iY29yZS5odG1sI2NsZWFybW9kdWxlbGlzdCI+Q2xlYXJNb2R1bGVMaXN0PC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNjb250ZW50ZGlnZXN0Ij5Db250ZW50RGlnZXN0PC9BPgotPExJPjxBIEhSRUY9Im1vZF91c2VydHJhY2suaHRtbCNjb29raWVleHBpcmVzIj5Db29raWVFeHBpcmVzPC9BPgotPExJPjxBIEhSRUY9Im1vZF9jb29raWVzLmh0bWwjY29va2llbG9nIj5Db29raWVMb2c8L0E+IChtb2RfY29va2llcykKLTxMST48QSBIUkVGPSJtb2RfbG9nX2NvbmZpZy5odG1sI2Nvb2tpZWxvZyI+Q29va2llTG9nPC9BPiAobW9kX2xvZ19jb25maWcpCi08TEk+PEEgSFJFRj0ibW9kX3VzZXJ0cmFjay5odG1sI2Nvb2tpZXRyYWNraW5nIj5Db29raWVUcmFja2luZzwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjY29yZWR1bXBkaXJlY3RvcnkiPkNvcmVEdW1wRGlyZWN0b3J5PC9BPgotPExJPjxBIEhSRUY9Im1vZF9sb2dfY29uZmlnLmh0bWwjY3VzdG9tbG9nIj5DdXN0b21Mb2c8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2F1dG9pbmRleC5odG1sI2RlZmF1bHRpY29uIj5EZWZhdWx0SWNvbjwvQT4KLTxMST48QSBIUkVGPSJtb2RfbWltZS5odG1sI2RlZmF1bHRsYW5ndWFnZSI+RGVmYXVsdExhbmd1YWdlPC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNkZWZhdWx0dHlwZSI+RGVmYXVsdFR5cGU8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2FjY2Vzcy5odG1sI2RlbnkiPmRlbnk8L0E+Ci08TEk+PEEgSFJFRj0iY29yZS5odG1sI2RpcmVjdG9yeSI+Jmx0O0RpcmVjdG9yeSZndDs8L0E+Ci08TEk+PEEgSFJFRj0iY29yZS5odG1sI2RpcmVjdG9yeW1hdGNoIj4mbHQ7RGlyZWN0b3J5TWF0Y2gmZ3Q7PC9BPgotPExJPjxBIEhSRUY9Im1vZF9kaXIuaHRtbCNkaXJlY3RvcnlpbmRleCI+RGlyZWN0b3J5SW5kZXg8L0E+Ci08TEk+PEEgSFJFRj0iY29yZS5odG1sI2RvY3VtZW50cm9vdCI+RG9jdW1lbnRSb290PC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNlcnJvcmRvY3VtZW50Ij5FcnJvckRvY3VtZW50PC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNlcnJvcmxvZyI+RXJyb3JMb2c8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2V4YW1wbGUuaHRtbCNleGFtcGxlIj5FeGFtcGxlPC9BPgotPExJPjxBIEhSRUY9Im1vZF9leHBpcmVzLmh0bWwjZXhwaXJlc2FjdGl2ZSI+RXhwaXJlc0FjdGl2ZTwvQT4KLTxMST48QSBIUkVGPSJtb2RfZXhwaXJlcy5odG1sI2V4cGlyZXNieXR5cGUiPkV4cGlyZXNCeVR5cGU8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2V4cGlyZXMuaHRtbCNleHBpcmVzZGVmYXVsdCI+RXhwaXJlc0RlZmF1bHQ8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX3N0YXR1cy5odG1sI2V4dGVuZGVkc3RhdHVzIj5FeHRlbmRlZFN0YXR1czwvQT4KLTxMST48QSBIUkVGPSJtb2RfYXV0b2luZGV4Lmh0bWwjZmFuY3lpbmRleGluZyI+RmFuY3lJbmRleGluZzwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjZmlsZXMiPiZsdDtGaWxlcyZndDs8L0E+Ci08TEk+PEEgSFJFRj0iY29yZS5odG1sI2ZpbGVzbWF0Y2giPiZsdDtGaWxlc01hdGNoJmd0OzwvQT4KLTxMST48QSBIUkVGPSJtb2RfbWltZS5odG1sI2ZvcmNldHlwZSI+Rm9yY2VUeXBlPC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNncm91cCI+R3JvdXA8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2hlYWRlcnMuaHRtbCNoZWFkZXIiPkhlYWRlcjwvQT4KLTxMST48QSBIUkVGPSJtb2RfYXV0b2luZGV4Lmh0bWwjaGVhZGVybmFtZSI+SGVhZGVyTmFtZTwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjaG9zdG5hbWVsb29rdXBzIj5Ib3N0TmFtZUxvb2t1cHM8L0E+Ci08TEk+PEEgSFJFRj0iY29yZS5odG1sI2lkZW50aXR5Y2hlY2siPklkZW50aXR5Q2hlY2s8L0E+Ci08TEk+PEEgSFJFRj0iY29yZS5odG1sI2lmZGVmaW5lIj4mbHQ7SWZEZWZpbmUmZ3Q7PC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNpZm1vZHVsZSI+Jmx0O0lmTW9kdWxlJmd0OzwvQT4KLTxMST48QSBIUkVGPSJtb2RfaW1hcC5odG1sI2ltYXBiYXNlIj5JbWFwQmFzZTwvQT4KLTxMST48QSBIUkVGPSJtb2RfaW1hcC5odG1sI2ltYXBkZWZhdWx0Ij5JbWFwRGVmYXVsdDwvQT4KLTxMST48QSBIUkVGPSJtb2RfaW1hcC5odG1sI2ltYXBtZW51Ij5JbWFwTWVudTwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjaW5jbHVkZSI+SW5jbHVkZTwvQT4KLTxMST48QSBIUkVGPSJtb2RfYXV0b2luZGV4Lmh0bWwjaW5kZXhpZ25vcmUiPkluZGV4SWdub3JlPC9BPgotPExJPjxBIEhSRUY9Im1vZF9hdXRvaW5kZXguaHRtbCNpbmRleG9wdGlvbnMiPkluZGV4T3B0aW9uczwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwja2VlcGFsaXZlIj5LZWVwQWxpdmU8L0E+Ci08TEk+PEEgSFJFRj0iY29yZS5odG1sI2tlZXBhbGl2ZXRpbWVvdXQiPktlZXBBbGl2ZVRpbWVvdXQ8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX25lZ290aWF0aW9uLmh0bWwjbGFuZ3VhZ2Vwcmlvcml0eSI+TGFuZ3VhZ2VQcmlvcml0eTwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjbGltaXQiPiZsdDtMaW1pdCZndDs8L0E+Ci08TEk+PEEgSFJFRj0iY29yZS5odG1sI2xpbWl0ZXhjZXB0Ij4mbHQ7TGltaXRFeGNlcHQmZ3Q7PC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNsaW1pdHJlcXVlc3Rib2R5Ij5MaW1pdFJlcXVlc3RCb2R5PC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNsaW1pdHJlcXVlc3RmaWVsZHMiPkxpbWl0UmVxdWVzdEZpZWxkczwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjbGltaXRyZXF1ZXN0ZmllbGRzaXplIj5MaW1pdFJlcXVlc3RGaWVsZHNpemU8L0E+Ci08TEk+PEEgSFJFRj0iY29yZS5odG1sI2xpbWl0cmVxdWVzdGxpbmUiPkxpbWl0UmVxdWVzdExpbmU8L0E+Ci08TEk+PEEgSFJFRj0iY29yZS5odG1sI2xpc3RlbiI+TGlzdGVuPC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNsaXN0ZW5iYWNrbG9nIj5MaXN0ZW5CYWNrbG9nPC9BPgotPExJPjxBIEhSRUY9Im1vZF9zby5odG1sI2xvYWRmaWxlIj5Mb2FkRmlsZTwvQT4KLTxMST48QSBIUkVGPSJtb2Rfc28uaHRtbCNsb2FkbW9kdWxlIj5Mb2FkTW9kdWxlPC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNsb2NhdGlvbiI+Jmx0O0xvY2F0aW9uJmd0OzwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjbG9jYXRpb25tYXRjaCI+Jmx0O0xvY2F0aW9uTWF0Y2gmZ3Q7PC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNsb2NrZmlsZSI+TG9ja0ZpbGU8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2xvZ19jb25maWcuaHRtbCNsb2dmb3JtYXQiPkxvZ0Zvcm1hdDwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjbG9nbGV2ZWwiPkxvZ0xldmVsPC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNtYXhjbGllbnRzIj5NYXhDbGllbnRzPC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNtYXhrZWVwYWxpdmVyZXF1ZXN0cyI+TWF4S2VlcEFsaXZlUmVxdWVzdHM8L0E+Ci08TEk+PEEgSFJFRj0iY29yZS5odG1sI21heHJlcXVlc3RzcGVyY2hpbGQiPk1heFJlcXVlc3RzUGVyQ2hpbGQ8L0E+Ci08TEk+PEEgSFJFRj0iY29yZS5odG1sI21heHNwYXJlc2VydmVycyI+TWF4U3BhcmVTZXJ2ZXJzPC9BPgotPExJPjxBIEhSRUY9Im1vZF9jZXJuX21ldGEuaHRtbCNtZXRhZGlyIj5NZXRhRGlyPC9BPgotPExJPjxBIEhSRUY9Im1vZF9jZXJuX21ldGEuaHRtbCNtZXRhZmlsZXMiPk1ldGFGaWxlczwvQT4KLTxMST48QSBIUkVGPSJtb2RfY2Vybl9tZXRhLmh0bWwjbWV0YXN1ZmZpeCI+TWV0YVN1ZmZpeDwvQT4KLTxMST48QSBIUkVGPSJtb2RfbWltZV9tYWdpYy5odG1sI21pbWVtYWdpY2ZpbGUiPk1pbWVNYWdpY0ZpbGU8L0E+Ci08TEk+PEEgSFJFRj0iY29yZS5odG1sI21pbnNwYXJlc2VydmVycyI+TWluU3BhcmVTZXJ2ZXJzPC9BPgotPExJPjxBIEhSRUY9Im1vZF9tbWFwX3N0YXRpYy5odG1sI21tYXBmaWxlIj5NTWFwRmlsZTwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjbmFtZXZpcnR1YWxob3N0Ij5OYW1lVmlydHVhbEhvc3Q8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX3Byb3h5Lmh0bWwjbm9jYWNoZSI+Tm9DYWNoZTwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjb3B0aW9ucyI+T3B0aW9uczwvQT4KLTxMST48QSBIUkVGPSJtb2RfYWNjZXNzLmh0bWwjb3JkZXIiPm9yZGVyPC9BPgotPExJPjxBIEhSRUY9Im1vZF9lbnYuaHRtbCNwYXNzZW52Ij5QYXNzRW52PC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNwaWRmaWxlIj5QaWRGaWxlPC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNwb3J0Ij5Qb3J0PC9BPgotPExJPjxBIEhSRUY9Im1vZF9wcm94eS5odG1sI3Byb3h5YmxvY2siPlByb3h5QmxvY2s8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX3Byb3h5Lmh0bWwjcHJveHlkb21haW4iPlByb3h5RG9tYWluPC9BPgotPExJPjxBIEhSRUY9Im1vZF9wcm94eS5odG1sI3Byb3h5cGFzcyI+UHJveHlQYXNzPC9BPgotPExJPjxBIEhSRUY9Im1vZF9wcm94eS5odG1sI3Byb3h5cGFzc3JldmVyc2UiPlByb3h5UGFzc1JldmVyc2U8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX3Byb3h5Lmh0bWwjcHJveHlyZWNlaXZlYnVmZmVyc2l6ZSI+UHJveHlSZWNlaXZlQnVmZmVyU2l6ZTwvQT4KLTxMST48QSBIUkVGPSJtb2RfcHJveHkuaHRtbCNwcm94eXJlbW90ZSI+UHJveHlSZW1vdGU8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX3Byb3h5Lmh0bWwjcHJveHlyZXF1ZXN0cyI+UHJveHlSZXF1ZXN0czwvQT4KLTxMST48QSBIUkVGPSJtb2RfcHJveHkuaHRtbCNwcm94eXZpYSI+UHJveHlWaWE8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2F1dG9pbmRleC5odG1sI3JlYWRtZW5hbWUiPlJlYWRtZU5hbWU8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2FsaWFzLmh0bWwjcmVkaXJlY3QiPlJlZGlyZWN0PC9BPgotPExJPjxBIEhSRUY9Im1vZF9hbGlhcy5odG1sI3JlZGlyZWN0bWF0Y2giPlJlZGlyZWN0TWF0Y2g8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2FsaWFzLmh0bWwjcmVkaXJlY3RwZXJtIj5SZWRpcmVjdFBlcm1hbmVudDwvQT4KLTxMST48QSBIUkVGPSJtb2RfYWxpYXMuaHRtbCNyZWRpcmVjdHRlbXAiPlJlZGlyZWN0VGVtcDwvQT4KLTxMST48QSBIUkVGPSJtb2RfbG9nX3JlZmVyZXIuaHRtbCNyZWZlcmVyaWdub3JlIj5SZWZlcmVySWdub3JlPC9BPgotPExJPjxBIEhSRUY9Im1vZF9sb2dfcmVmZXJlci5odG1sI3JlZmVyZXJsb2ciPlJlZmVyZXJMb2c8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX21pbWUjcmVtb3ZlaGFuZGxlciI+UmVtb3ZlSGFuZGxlcjwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjcmVxdWlyZSI+cmVxdWlyZTwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjcmVzb3VyY2Vjb25maWciPlJlc291cmNlQ29uZmlnPC9BPgotPExJPjxBIEhSRUY9Im1vZF9yZXdyaXRlLmh0bWwjUmV3cml0ZUJhc2UiPlJld3JpdGVCYXNlPC9BPgotPExJPjxBIEhSRUY9Im1vZF9yZXdyaXRlLmh0bWwjUmV3cml0ZUNvbmQiPlJld3JpdGVDb25kPC9BPgotPExJPjxBIEhSRUY9Im1vZF9yZXdyaXRlLmh0bWwjUmV3cml0ZUVuZ2luZSI+UmV3cml0ZUVuZ2luZTwvQT4KLTxMST48QSBIUkVGPSJtb2RfcmV3cml0ZS5odG1sI1Jld3JpdGVMb2NrIj5SZXdyaXRlTG9jazwvQT4KLTxMST48QSBIUkVGPSJtb2RfcmV3cml0ZS5odG1sI1Jld3JpdGVMb2ciPlJld3JpdGVMb2c8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX3Jld3JpdGUuaHRtbCNSZXdyaXRlTG9nTGV2ZWwiPlJld3JpdGVMb2dMZXZlbDwvQT4KLTxMST48QSBIUkVGPSJtb2RfcmV3cml0ZS5odG1sI1Jld3JpdGVNYXAiPlJld3JpdGVNYXA8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX3Jld3JpdGUuaHRtbCNSZXdyaXRlT3B0aW9ucyI+UmV3cml0ZU9wdGlvbnM8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX3Jld3JpdGUuaHRtbCNSZXdyaXRlUnVsZSI+UmV3cml0ZVJ1bGU8L0E+Ci08TEk+PEEgSFJFRj0iY29yZS5odG1sI3JsaW1pdGNwdSI+UkxpbWl0Q1BVPC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNybGltaXRtZW0iPlJMaW1pdE1FTTwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjcmxpbWl0bnByb2MiPlJMaW1pdE5QUk9DPC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNzYXRpc2Z5Ij5TYXRpc2Z5PC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNzY29yZWJvYXJkZmlsZSI+U2NvcmVCb2FyZEZpbGU8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2FjdGlvbnMuaHRtbCNzY3JpcHQiPlNjcmlwdDwvQT4KLTxMST48QSBIUkVGPSJtb2RfYWxpYXMuaHRtbCNzY3JpcHRhbGlhcyI+U2NyaXB0QWxpYXM8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2FsaWFzLmh0bWwjc2NyaXB0YWxpYXNtYXRjaCI+U2NyaXB0QWxpYXNNYXRjaDwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjc2NyaXB0aW50ZXJwcmV0ZXJzb3VyY2UiPlNjcmlwdEludGVycHJldGVyU291cmNlPC9BPgotPExJPjxBIEhSRUY9Im1vZF9jZ2kuaHRtbCNzY3JpcHRsb2ciPlNjcmlwdExvZzwvQT4KLTxMST48QSBIUkVGPSJtb2RfY2dpLmh0bWwjc2NyaXB0bG9nYnVmZmVyIj5TY3JpcHRMb2dCdWZmZXI8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2NnaS5odG1sI3NjcmlwdGxvZ2xlbmd0aCI+U2NyaXB0TG9nTGVuZ3RoPC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNzZW5kYnVmZmVyc2l6ZSI+U2VuZEJ1ZmZlclNpemU8L0E+Ci08TEk+PEEgSFJFRj0iY29yZS5odG1sI3NlcnZlcmFkbWluIj5TZXJ2ZXJBZG1pbjwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjc2VydmVyYWxpYXMiPlNlcnZlckFsaWFzPC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNzZXJ2ZXJuYW1lIj5TZXJ2ZXJOYW1lPC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNzZXJ2ZXJwYXRoIj5TZXJ2ZXJQYXRoPC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNzZXJ2ZXJyb290Ij5TZXJ2ZXJSb290PC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNzZXJ2ZXJzaWduYXR1cmUiPlNlcnZlclNpZ25hdHVyZTwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjc2VydmVydG9rZW5zIj5TZXJ2ZXJUb2tlbnM8L0E+Ci08TEk+PEEgSFJFRj0iY29yZS5odG1sI3NlcnZlcnR5cGUiPlNlcnZlclR5cGU8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2Vudi5odG1sI3NldGVudiI+U2V0RW52PC9BPgotPExJPjxBIEhSRUY9Im1vZF9zZXRlbnZpZi5odG1sI3NldGVudmlmIj5TZXRFbnZJZjwvQT4KLTxMST48QSBIUkVGPSJtb2Rfc2V0ZW52aWYuaHRtbCNTZXRFbnZJZk5vQ2FzZSI+U2V0RW52SWZOb0Nhc2U8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX21pbWUuaHRtbCNzZXRoYW5kbGVyIj5TZXRIYW5kbGVyPC9BPgotPExJPjxBIEhSRUY9ImNvcmUuaHRtbCNzdGFydHNlcnZlcnMiPlN0YXJ0U2VydmVyczwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjdGhyZWFkc3BlcmNoaWxkIj5UaHJlYWRzUGVyQ2hpbGQ8L0E+Ci08TEk+PEEgSFJFRj0iY29yZS5odG1sI3RpbWVvdXQiPlRpbWVPdXQ8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2xvZ19jb25maWcuaHRtbCN0cmFuc2ZlcmxvZyI+VHJhbnNmZXJMb2c8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX21pbWUuaHRtbCN0eXBlc2NvbmZpZyI+VHlwZXNDb25maWc8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX2Vudi5odG1sI3Vuc2V0ZW52Ij5VbnNldEVudjwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjdXNlY2Fub25pY2FsbmFtZSI+VXNlQ2Fub25pY2FsTmFtZTwvQT4KLTxMST48QSBIUkVGPSJjb3JlLmh0bWwjdXNlciI+VXNlcjwvQT4KLTxMST48QSBIUkVGPSJtb2RfdXNlcmRpci5odG1sI3VzZXJkaXIiPlVzZXJEaXI8L0E+Ci08TEk+PEEgSFJFRj0iY29yZS5odG1sI3ZpcnR1YWxob3N0Ij4mbHQ7VmlydHVhbEhvc3QmZ3Q7PC9BPgotPExJPjxBIEhSRUY9Im1vZF92aG9zdF9hbGlhcy5odG1sI3ZpcnR1YWxkb2N1bWVudHJvb3QiPlZpcnR1YWxEb2N1bWVudFJvb3Q8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX3Zob3N0X2FsaWFzLmh0bWwjdmlydHVhbGRvY3VtZW50cm9vdGlwIj5WaXJ0dWFsRG9jdW1lbnRSb290SVA8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX3Zob3N0X2FsaWFzLmh0bWwjdmlydHVhbHNjcmlwdGFsaWFzIj5WaXJ0dWFsU2NyaXB0QWxpYXM8L0E+Ci08TEk+PEEgSFJFRj0ibW9kX3Zob3N0X2FsaWFzLmh0bWwjdmlydHVhbHNjcmlwdGFsaWFzaXAiPlZpcnR1YWxTY3JpcHRBbGlhc0lQPC9BPgotPExJPjxBIEhSRUY9Im1vZF9pbmNsdWRlLmh0bWwjeGJpdGhhY2siPlhCaXRIYWNrPC9BPgotPC9VTD4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9mb290ZXIuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9mb290ZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZlNzQ1ZC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvZm9vdGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTxIUj4KLQotPEgzIEFMSUdOPSJDRU5URVIiPgotIEFwYWNoZSBIVFRQIFNlcnZlciBWZXJzaW9uIDEuMwotPC9IMz4KLQotPEEgSFJFRj0iLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvaW5kZXguZ2lmIiBBTFQ9IkluZGV4Ij48L0E+Ci08QSBIUkVGPSIuLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvaG9tZS5naWYiIEFMVD0iSG9tZSI+PC9BPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL2hlYWRlci5odG1sIGIvZG9jcy9tYW51YWwvbW9kL2hlYWRlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjYyMzAwLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9oZWFkZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPERJViBBTElHTj0iQ0VOVEVSIj4KLSA8SU1HIFNSQz0iLi4vaW1hZ2VzL3N1Yi5naWYiIEFMVD0iW0FQQUNIRSBET0NVTUVOVEFUSU9OXSI+Ci0gPEgzPgotICBBcGFjaGUgSFRUUCBTZXJ2ZXIgVmVyc2lvbiAxLjMKLSA8L0gzPgotPC9ESVY+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvaW5kZXguaHRtbCBiL2RvY3MvbWFudWFsL21vZC9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjM0NGZkLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIG1vZHVsZXM8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5BcGFjaGUgbW9kdWxlczwvSDE+Ci0KLTxQPgotQmVsb3cgaXMgYSBsaXN0IG9mIGFsbCBvZiB0aGUgbW9kdWxlcyB0aGF0IGNvbWUgYXMgcGFydCBvZiB0aGUKLUFwYWNoZSBkaXN0cmlidXRpb24uICBTZWUgYWxzbyB0aGUgY29tcGxldGUgYWxwaGFiZXRpY2FsIGxpc3Qgb2YKLTxBCi0gSFJFRj0iZGlyZWN0aXZlcy5odG1sIgotPmFsbCBBcGFjaGUgZGlyZWN0aXZlczwvQT4uCi08L1A+Ci0KLTxETD4KLTxEVD48QSBIUkVGPSJjb3JlLmh0bWwiPkNvcmU8L0E+Ci08REQ+Q29yZSBBcGFjaGUgZmVhdHVyZXMuCi08RFQ+PEEgSFJFRj0ibW9kX2FjY2Vzcy5odG1sIj5tb2RfYWNjZXNzPC9BPgotPEREPkhvc3QgYmFzZWQgYWNjZXNzIGNvbnRyb2wuCi08RFQ+PEEgSFJFRj0ibW9kX2FjdGlvbnMuaHRtbCI+bW9kX2FjdGlvbnM8L0E+IEFwYWNoZSAxLjEgYW5kIGxhdGVyLgotPEREPkZpbGV0eXBlL21ldGhvZC1iYXNlZCBzY3JpcHQgZXhlY3V0aW9uCi08RFQ+PEEgSFJFRj0ibW9kX2FsaWFzLmh0bWwiPm1vZF9hbGlhczwvQT4KLTxERD5BbGlhc2VzIGFuZCByZWRpcmVjdHMuCi08RFQ+PEEgSFJFRj0ibW9kX2FzaXMuaHRtbCI+bW9kX2FzaXM8L0E+Ci08REQ+VGhlIC5hc2lzIGZpbGUgaGFuZGxlci4KLTxEVD48QSBIUkVGPSJtb2RfYXV0aC5odG1sIj5tb2RfYXV0aDwvQT4KLTxERD5Vc2VyIGF1dGhlbnRpY2F0aW9uIHVzaW5nIHRleHQgZmlsZXMuCi08RFQ+PEEgSFJFRj0ibW9kX2F1dGhfYW5vbi5odG1sIj5tb2RfYXV0aF9hbm9uPC9BPgotPEREPkFub255bW91cyB1c2VyIGF1dGhlbnRpY2F0aW9uLCBGVFAtc3R5bGUuCi08RFQ+PEEgSFJFRj0ibW9kX2F1dGhfZGIuaHRtbCI+bW9kX2F1dGhfZGI8L0E+Ci08REQ+VXNlciBhdXRoZW50aWNhdGlvbiB1c2luZyBCZXJrZWxleSBEQiBmaWxlcy4KLTxEVD48QSBIUkVGPSJtb2RfYXV0aF9kYm0uaHRtbCI+bW9kX2F1dGhfZGJtPC9BPgotPEREPlVzZXIgYXV0aGVudGljYXRpb24gdXNpbmcgREJNIGZpbGVzLgotPERUPjxBIEhSRUY9Im1vZF9hdXRoX2RpZ2VzdC5odG1sIj5tb2RfYXV0aF9kaWdlc3Q8L0E+Ci08REQ+TUQ1IGF1dGhlbnRpY2F0aW9uIChleHBlcmltZW50YWwpCi08RFQ+PEEgSFJFRj0ibW9kX2F1dG9pbmRleC5odG1sIj5tb2RfYXV0b2luZGV4PC9BPgotPEREPkF1dG9tYXRpYyBkaXJlY3RvcnkgbGlzdGluZ3MuCi08RFQ+PEEgSFJFRj0ibW9kX2Jyb3dzZXIuaHRtbCI+bW9kX2Jyb3dzZXI8L0E+IEFwYWNoZSAxLjIuKiBvbmx5Ci08REQ+U2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBiYXNlZCBvbiBVc2VyLUFnZW50IHN0cmluZ3MuIFJlcGxhY2VkIGJ5IAotIG1vZF9zZXRlbnZpZiBpbiBBcGFjaGUgMS4zIGFuZCB1cAotPERUPjxBIEhSRUY9Im1vZF9jZXJuX21ldGEuaHRtbCI+bW9kX2Nlcm5fbWV0YTwvQT4KLTxERD5TdXBwb3J0IGZvciBIVFRQIGhlYWRlciBtZXRhZmlsZXMuCi08RFQ+PEEgSFJFRj0ibW9kX2NnaS5odG1sIj5tb2RfY2dpPC9BPgotPEREPkludm9raW5nIENHSSBzY3JpcHRzLgotPERUPjxBIEhSRUY9Im1vZF9jb29raWVzLmh0bWwiPm1vZF9jb29raWVzPC9BPiB1cCB0byBBcGFjaGUgMS4xLjEKLTxERD5TdXBwb3J0IGZvciBOZXRzY2FwZS1saWtlIGNvb2tpZXMuICBSZXBsYWNlZCBpbiBBcGFjaGUgMS4yIGJ5Ci1tb2RfdXNlcnRyYWNrCi08RFQ+PEEgSFJFRj0ibW9kX2RpZ2VzdC5odG1sIj5tb2RfZGlnZXN0PC9BPgotPEREPk1ENSBhdXRoZW50aWNhdGlvbgotPERUPjxBIEhSRUY9Im1vZF9kaXIuaHRtbCI+bW9kX2RpcjwvQT4KLTxERD5CYXNpYyBkaXJlY3RvcnkgaGFuZGxpbmcuCi08RFQ+PEEgSFJFRj0ibW9kX2RsZC5odG1sIj5tb2RfZGxkPC9BPiBBcGFjaGUgMS4yLiogYW5kIGVhcmxpZXIKLTxERD5TdGFydC10aW1lIGxpbmtpbmcgd2l0aCB0aGUgR05VIGxpYmRsZC4gUmVwbGFjZWQgaW4gQXBhY2hlIDEuMyBieSBtb2Rfc28KLTxEVD48QSBIUkVGPSJtb2RfZGxsLmh0bWwiPm1vZF9kbGw8L0E+IEFwYWNoZSAxLjNiMSB0byAxLjNiNSBvbmx5Ci08REQ+UmVwbGFjZWQgaW4gMS4zYjYgYnkgbW9kX3NvCi08RFQ+PEEgSFJFRj0ibW9kX2Vudi5odG1sIj5tb2RfZW52PC9BPgotPEREPlBhc3Npbmcgb2YgZW52aXJvbm1lbnRzIHRvIENHSSBzY3JpcHRzCi08RFQ+PEEgSFJFRj0ibW9kX2V4YW1wbGUuaHRtbCI+bW9kX2V4YW1wbGU8L0E+IEFwYWNoZSAxLjIgYW5kIHVwCi08REQ+RGVtb25zdHJhdGVzIEFwYWNoZSBBUEkKLTxEVD48QSBIUkVGPSJtb2RfZXhwaXJlcy5odG1sIj5tb2RfZXhwaXJlczwvQT4gQXBhY2hlIDEuMiBhbmQgdXAKLTxERD5BcHBseSBFeHBpcmVzOiBoZWFkZXJzIHRvIHJlc291cmNlcwotPERUPjxBIEhSRUY9Im1vZF9oZWFkZXJzLmh0bWwiPm1vZF9oZWFkZXJzPC9BPiBBcGFjaGUgMS4yIGFuZCB1cAotPEREPkFkZCBhcmJpdHJhcnkgSFRUUCBoZWFkZXJzIHRvIHJlc291cmNlcwotPERUPjxBIEhSRUY9Im1vZF9pbWFwLmh0bWwiPm1vZF9pbWFwPC9BPgotPEREPlRoZSBpbWFnZW1hcCBmaWxlIGhhbmRsZXIuCi08RFQ+PEEgSFJFRj0ibW9kX2luY2x1ZGUuaHRtbCI+bW9kX2luY2x1ZGU8L0E+Ci08REQ+U2VydmVyLXBhcnNlZCBkb2N1bWVudHMuCi08RFQ+PEEgSFJFRj0ibW9kX2luZm8uaHRtbCI+bW9kX2luZm88L0E+Ci08REQ+U2VydmVyIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLTxEVD48QSBIUkVGPSJtb2RfaXNhcGkuaHRtbCI+bW9kX2lzYXBpPC9BPgotPEREPldpbmRvd3MgSVNBUEkgRXh0ZW5zaW9uIHN1cHBvcnQKLTxEVD48QSBIUkVGPSJtb2RfbG9nX2FnZW50Lmh0bWwiPm1vZF9sb2dfYWdlbnQ8L0E+Ci08REQ+TG9nZ2luZyBvZiBVc2VyIEFnZW50cy4KLTxEVD48QSBIUkVGPSJtb2RfbG9nX2NvbW1vbi5odG1sIj5tb2RfbG9nX2NvbW1vbjwvQT4gdXAgdG8gQXBhY2hlIDEuMS4xCi08REQ+U3RhbmRhcmQgbG9nZ2luZyBpbiB0aGUgQ29tbW9uIExvZ2ZpbGUgRm9ybWF0LiAgUmVwbGFjZWQgYnkgdGhlCi1tb2RfbG9nX2NvbmZpZyBtb2R1bGUgaW4gQXBhY2hlIDEuMiBhbmQgdXAKLTxEVD48QSBIUkVGPSJtb2RfbG9nX2NvbmZpZy5odG1sIj5tb2RfbG9nX2NvbmZpZzwvQT4KLTxERD5Vc2VyLWNvbmZpZ3VyYWJsZSBsb2dnaW5nIHJlcGxhY2VtZW50IGZvciBtb2RfbG9nX2NvbW1vbi4KLTxEVD48QSBIUkVGPSJtb2RfbG9nX3JlZmVyZXIuaHRtbCI+bW9kX2xvZ19yZWZlcmVyPC9BPgotPEREPkxvZ2dpbmcgb2YgZG9jdW1lbnQgcmVmZXJlbmNlcy4KLTxEVD48QSBIUkVGPSJtb2RfbWltZS5odG1sIj5tb2RfbWltZTwvQT4KLTxERD5EZXRlcm1pbmluZyBkb2N1bWVudCB0eXBlcyB1c2luZyBmaWxlIGV4dGVuc2lvbnMuCi08RFQ+PEEgSFJFRj0ibW9kX21pbWVfbWFnaWMuaHRtbCI+bW9kX21pbWVfbWFnaWM8L0E+Ci08REQ+RGV0ZXJtaW5pbmcgZG9jdW1lbnQgdHlwZXMgdXNpbmcgIm1hZ2ljIG51bWJlcnMiLgotPERUPjxBIEhSRUY9Im1vZF9tbWFwX3N0YXRpYy5odG1sIj5tb2RfbW1hcF9zdGF0aWM8L0E+Ci08REQ+TWFwcGluZyBmaWxlcyBpbnRvIG1lbW9yeSBmb3IgZmFzdGVyIHNlcnZpbmcuCi08RFQ+PEEgSFJFRj0ibW9kX25lZ290aWF0aW9uLmh0bWwiPm1vZF9uZWdvdGlhdGlvbjwvQT4KLTxERD5Db250ZW50IG5lZ290aWF0aW9uLgotPERUPjxBIEhSRUY9Im1vZF9wcm94eS5odG1sIj5tb2RfcHJveHk8L0E+Ci08REQ+Q2FjaGluZyBwcm94eSBhYmlsaXRpZXMKLTxEVD48QSBIUkVGPSJtb2RfcmV3cml0ZS5odG1sIj5tb2RfcmV3cml0ZTwvQT4gQXBhY2hlIDEuMiBhbmQgdXAKLTxERD5Qb3dlcmZ1bCBVUkktdG8tZmlsZW5hbWUgbWFwcGluZyB1c2luZyByZWd1bGFyIGV4cHJlc3Npb25zCi08RFQ+PEEgSFJFRj0ibW9kX3NldGVudmlmLmh0bWwiPm1vZF9zZXRlbnZpZjwvQT4gQXBhY2hlIDEuMyBhbmQgdXAKLTxERD5TZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJhc2VkIG9uIGNsaWVudCBpbmZvcm1hdGlvbgotPERUPjxBIEhSRUY9Im1vZF9zby5odG1sIj5tb2Rfc288L0E+IEFwYWNoZSAxLjMgYW5kIHVwCi08REQ+RXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIGxvYWRpbmcgbW9kdWxlcyAoRExMcyBvbiBXaW5kb3dzKSBhdCBydW50aW1lCi08RFQ+PEEgSFJFRj0ibW9kX3NwZWxpbmcuaHRtbCI+bW9kX3NwZWxpbmc8L0E+IEFwYWNoZSAxLjMgYW5kIHVwCi08REQ+QXV0b21hdGljYWxseSBjb3JyZWN0IG1pbm9yIHR5cG9zIGluIFVSTHMKLTxEVD48QSBIUkVGPSJtb2Rfc3RhdHVzLmh0bWwiPm1vZF9zdGF0dXM8L0E+Ci08REQ+U2VydmVyIHN0YXR1cyBkaXNwbGF5Ci08RFQ+PEEgSFJFRj0ibW9kX3VzZXJkaXIuaHRtbCI+bW9kX3VzZXJkaXI8L0E+Ci08REQ+VXNlciBob21lIGRpcmVjdG9yaWVzLgotPERUPjxBIEhSRUY9Im1vZF91bmlxdWVfaWQuaHRtbCI+bW9kX3VuaXF1ZV9pZDwvQT4gQXBhY2hlIDEuMyBhbmQgdXAKLTxERD5HZW5lcmF0ZSB1bmlxdWUgcmVxdWVzdCBpZGVudGlmaWVyIGZvciBldmVyeSByZXF1ZXN0Ci08RFQ+PEEgSFJFRj0ibW9kX3VzZXJ0cmFjay5odG1sIj5tb2RfdXNlcnRyYWNrPC9BPiBBcGFjaGUgMS4yIGFuZCB1cAotPEREPlVzZXIgdHJhY2tpbmcgdXNpbmcgQ29va2llcyAocmVwbGFjZW1lbnQgZm9yIG1vZF9jb29raWVzLmMpCi08RFQ+PEEgSFJFRj0ibW9kX3Zob3N0X2FsaWFzLmh0bWwiPm1vZF92aG9zdF9hbGlhczwvQT4gQXBhY2hlIDEuMy43IGFuZCB1cAotPEREPlN1cHBvcnQgZm9yIGR5bmFtaWNhbGx5IGNvbmZpZ3VyZWQgbWFzcyB2aXJ0dWFsIGhvc3RpbmcKLTwvREw+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2FjY2Vzcy5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9hY2Nlc3MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFjN2U4ZC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX2FjY2Vzcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIG1vZHVsZSBtb2RfYWNjZXNzPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0KLTxIMSBBTElHTj0iQ0VOVEVSIj5Nb2R1bGUgbW9kX2FjY2VzczwvSDE+Ci08UD4KLVRoaXMgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbiB0aGUgPENPREU+bW9kX2FjY2Vzcy5jPC9DT0RFPiBmaWxlLCBhbmQKLWlzIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuIEl0IHByb3ZpZGVzIGFjY2VzcyBjb250cm9sIGJhc2VkIG9uIGNsaWVudAotaG9zdG5hbWUgb3IgSVAgYWRkcmVzcy4KLTwvUD4KLQotPFVMPgotPExJPjxBIEhSRUY9IiNhbGxvdyI+YWxsb3c8L0E+Ci08TEk+PEEgSFJFRj0iI2FsbG93ZnJvbWVudiI+YWxsb3cgZnJvbSBlbnY9PC9BPgotPExJPjxBIEhSRUY9IiNkZW55Ij5kZW55PC9BPgotPExJPjxBIEhSRUY9IiNkZW55ZnJvbWVudiI+ZGVueSBmcm9tIGVudj08L0E+Ci08TEk+PEEgSFJFRj0iI29yZGVyIj5vcmRlcjwvQT4KLTwvVUw+Ci08REw+Ci08REQ+U2VlIGFsc28gPEEgSFJFRj0iY29yZS5odG1sI3NhdGlzZnkiPlNhdGlzZnk8L0E+Ci0gICAgYW5kIDxBIEhSRUY9ImNvcmUuaHRtbCNyZXF1aXJlIj5yZXF1aXJlPC9BPi4KLTwvREw+Ci08SFI+Ci0KLQotPEgyPjxBIE5BTUU9ImFsbG93Ij5hbGxvdyBkaXJlY3RpdmU8L0E+PC9IMj4KLTxQPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IGFsbG93fSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBhbGxvdyBmcm9tIDxFTT5ob3N0IGhvc3QgLi4uPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gZGlyZWN0b3J5LCAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBMaW1pdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2FjY2VzcwotPC9QPgotPFA+Ci1UaGUgYWxsb3cgZGlyZWN0aXZlIGFmZmVjdHMgd2hpY2ggaG9zdHMgY2FuIGFjY2VzcyBhIGdpdmVuIGRpcmVjdG9yeS4KLTxFTT5Ib3N0PC9FTT4gaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci08L1A+Ci08REw+Ci08RFQ+PENPREU+YWxsPC9DT0RFPgotPEREPkFsbCBob3N0cyBhcmUgYWxsb3dlZCBhY2Nlc3MKLTxEVD5BIChwYXJ0aWFsKSBkb21haW4tbmFtZQotPEREPkhvc3RzIHdob3NlIG5hbWVzIG1hdGNoLCBvciBlbmQgaW4sIHRoaXMgc3RyaW5nIGFyZSBhbGxvd2VkIGFjY2Vzcy4KLTxEVD5BIGZ1bGwgSVAgYWRkcmVzcwotPEREPkFuIElQIGFkZHJlc3Mgb2YgYSBob3N0IGFsbG93ZWQgYWNjZXNzCi08RFQ+QSBwYXJ0aWFsIElQIGFkZHJlc3MKLTxERD5UaGUgZmlyc3QgMSB0byAzIGJ5dGVzIG9mIGFuIElQIGFkZHJlc3MsIGZvciBzdWJuZXQgcmVzdHJpY3Rpb24uCi08RFQ+QSBuZXR3b3JrL25ldG1hc2sgcGFpciAoPFNUUk9ORz5BcGFjaGUgMS4zIGFuZCBsYXRlcjwvU1RST05HPikKLTxERD5BIG5ldHdvcmsgYS5iLmMuZCwgYW5kIGEgbmV0bWFzayB3LngueS56LiAgRm9yIG1vcmUgZmluZS1ncmFpbmVkIHN1Ym5ldAotICAgIHJlc3RyaWN0aW9uLiAgKDxFTT5pLmUuPC9FTT4sIDEwLjEuMC4wLzI1NS4yNTUuMC4wKQotPERUPkEgbmV0d29yay9ubm4gQ0lEUiBzcGVjaWZpY2F0aW9uICg8U1RST05HPkFwYWNoZSAxLjMgYW5kIGxhdGVyPC9TVFJPTkc+KQotPEREPlNpbWlsYXIgdG8gdGhlIHByZXZpb3VzIGNhc2UsIGV4Y2VwdCB0aGUgbmV0bWFzayBjb25zaXN0cyBvZiBubm4gCi0gICAgaGlnaC1vcmRlciAxIGJpdHMuICAoPEVNPmkuZS48L0VNPiwgMTAuMS4wLjAvMTYgaXMgdGhlIHNhbWUgYXMgMTAuMS4wLjAvMjU1LjI1NS4wLjApCi08L0RMPgotPFA+Ci1FeGFtcGxlOgotPC9QPgotPEJMT0NLUVVPVEU+PENPREU+YWxsb3cgZnJvbSAubmNzYS51aXVjLmVkdTwvQ09ERT48L0JMT0NLUVVPVEU+Ci08UD4KLUFsbCBob3N0cyBpbiB0aGUgc3BlY2lmaWVkIGRvbWFpbiBhcmUgYWxsb3dlZCBhY2Nlc3MuCi08L1A+Ci08UD4KLU5vdGUgdGhhdCB0aGlzIGNvbXBhcmVzIHdob2xlIGNvbXBvbmVudHM7IDxDT0RFPmJhci5lZHU8L0NPREU+Ci13b3VsZCBub3QgbWF0Y2ggPENPREU+Zm9vYmFyLmVkdTwvQ09ERT4uCi08L1A+Ci08UD4KLVNlZSBhbHNvIDxBIEhSRUY9IiNkZW55Ij5kZW55PC9BPiwgPEEgSFJFRj0iI29yZGVyIj5vcmRlcjwvQT4sIGFuZAotPEEgSFJFRj0ibW9kX2Jyb3dzZXIuaHRtbCNicm93c2VybWF0Y2giPkJyb3dzZXJNYXRjaDwvQT4uCi08L1A+Ci0KLTxQPgotPEEgTkFNRT0iYWxsb3dmcm9tZW52Ij48U1RST05HPlN5bnRheDo8L1NUUk9ORz4gYWxsb3cgZnJvbQotIGVudj08RU0+dmFyaWFibGVuYW1lPC9FTT48L0E+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IGRpcmVjdG9yeSwgLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gTGltaXQ8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9hY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gQXBhY2hlIDEuMiBhbmQgYWJvdmUKLTwvUD4KLTxQPgotVGhlIGFsbG93IGZyb20gZW52IGRpcmVjdGl2ZSBjb250cm9scyBhY2Nlc3MgdG8gYSBkaXJlY3RvcnkgYnkgdGhlCi1leGlzdGVuY2UgKG9yIG5vbi1leGlzdGVuY2UpIG9mIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLgotPC9QPgotPFA+Ci1FeGFtcGxlOgotPC9QPgotPEJMT0NLUVVPVEU+PFBSRT4KLUJyb3dzZXJNYXRjaCBeS25vY2tLbm9jay8yLjAgbGV0X21lX2luCi0mbHQ7RGlyZWN0b3J5IC9kb2Nyb290Jmd0OwotICAgIG9yZGVyIGRlbnksYWxsb3cKLSAgICBkZW55IGZyb20gYWxsCi0gICAgYWxsb3cgZnJvbSBlbnY9bGV0X21lX2luCi0mbHQ7L0RpcmVjdG9yeSZndDsKLTwvUFJFPjwvQkxPQ0tRVU9URT4KLUluIHRoaXMgY2FzZSBicm93c2VycyB3aXRoIHRoZSB1c2VyLWFnZW50IHN0cmluZyA8VFQ+S25vY2tLbm9jay8yLjA8L1RUPiB3aWxsCi1iZSBhbGxvd2VkIGFjY2VzcywgYW5kIGFsbCBvdGhlcnMgd2lsbCBiZSBkZW5pZWQuCi08UD4KLVNlZSBhbHNvIDxBIEhSRUY9IiNkZW55ZnJvbWVudiI+ZGVueSBmcm9tIGVudjwvQT4KLWFuZCA8QSBIUkVGPSIjb3JkZXIiPm9yZGVyPC9BPi4KLTwvUD4KLTxIUj4KLQotPEgyPjxBIE5BTUU9ImRlbnkiPmRlbnkgZGlyZWN0aXZlPC9BPjwvSDI+Ci08UD4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBkZW55fSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBkZW55IGZyb20gPEVNPmhvc3QgaG9zdCAuLi48L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBkaXJlY3RvcnksIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IExpbWl0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfYWNjZXNzCi08L1A+Ci08UD4KLVRoZSBkZW55IGRpcmVjdGl2ZSBhZmZlY3RzIHdoaWNoIGhvc3RzIGNhbiBhY2Nlc3MgYSBnaXZlbiBkaXJlY3RvcnkuCi08RU0+SG9zdDwvRU0+IGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotPC9QPgotPERMPgotPERUPjxDT0RFPmFsbDwvQ09ERT4KLTxERD5hbGwgaG9zdHMgYXJlIGRlbmllZCBhY2Nlc3MKLTxEVD5BIChwYXJ0aWFsKSBkb21haW4tbmFtZQotPEREPmhvc3Qgd2hvc2UgbmFtZSBpcywgb3IgZW5kcyBpbiwgdGhpcyBzdHJpbmcgYXJlIGRlbmllZCBhY2Nlc3MuCi08RFQ+QSBmdWxsIElQIGFkZHJlc3MKLTxERD5BbiBJUCBhZGRyZXNzIG9mIGEgaG9zdCBkZW5pZWQgYWNjZXNzCi08RFQ+QSBwYXJ0aWFsIElQIGFkZHJlc3MKLTxERD5UaGUgZmlyc3QgMSB0byAzIGJ5dGVzIG9mIGFuIElQIGFkZHJlc3MsIGZvciBzdWJuZXQgcmVzdHJpY3Rpb24uCi08RFQ+QSBuZXR3b3JrL25ldG1hc2sgcGFpciAoPFNUUk9ORz5BcGFjaGUgMS4zIGFuZCBsYXRlcjwvU1RST05HPikKLTxERD5BIG5ldHdvcmsgYS5iLmMuZCwgYW5kIGEgbmV0bWFzayB3LngueS56LiAgRm9yIG1vcmUgZmluZS1ncmFpbmVkIHN1Ym5ldAotICAgIHJlc3RyaWN0aW9uLiAgKDxFTT5pLmUuPC9FTT4sIDEwLjEuMC4wLzI1NS4yNTUuMC4wKQotPERUPkEgbmV0d29yay9ubm4gQ0lEUiBzcGVjaWZpY2F0aW9uICg8U1RST05HPkFwYWNoZSAxLjMgYW5kIGxhdGVyPC9TVFJPTkc+KQotPEREPlNpbWlsYXIgdG8gdGhlIHByZXZpb3VzIGNhc2UsIGV4Y2VwdCB0aGUgbmV0bWFzayBjb25zaXN0cyBvZiBubm4gCi0gICAgaGlnaC1vcmRlciAxIGJpdHMuICAoPEVNPmkuZS48L0VNPiwgMTAuMS4wLjAvMTYgaXMgdGhlIHNhbWUgYXMgMTAuMS4wLjAvMjU1LjI1NS4wLjApCi08L0RMPgotPFA+Ci1FeGFtcGxlOgotPC9QPgotPEJMT0NLUVVPVEU+PENPREU+ZGVueSBmcm9tIDE2PC9DT0RFPjwvQkxPQ0tRVU9URT4KLTxQPgotQWxsIGhvc3RzIGluIHRoZSBzcGVjaWZpZWQgbmV0d29yayBhcmUgZGVuaWVkIGFjY2Vzcy4KLTwvUD4KLTxQPgotTm90ZSB0aGF0IHRoaXMgY29tcGFyZXMgd2hvbGUgY29tcG9uZW50czsgPENPREU+YmFyLmVkdTwvQ09ERT4KLXdvdWxkIG5vdCBtYXRjaCA8Q09ERT5mb29iYXIuZWR1PC9DT0RFPi4KLTwvUD4KLTxQPgotU2VlIGFsc28gPEEgSFJFRj0iI2FsbG93Ij5hbGxvdzwvQT4gYW5kIDxBIEhSRUY9IiNvcmRlciI+b3JkZXI8L0E+LgotPC9QPgotCi08UD4KLTxBIE5BTUU9ImRlbnlmcm9tZW52Ij48U1RST05HPlN5bnRheDo8L1NUUk9ORz4gZGVueSBmcm9tCi0gZW52PTxFTT52YXJpYWJsZW5hbWU8L0VNPjwvQT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gZGlyZWN0b3J5LCAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBMaW1pdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2FjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBBcGFjaGUgMS4yIGFuZCBhYm92ZQotPC9QPgotPFA+Ci1UaGUgZGVueSBmcm9tIGVudiBkaXJlY3RpdmUgY29udHJvbHMgYWNjZXNzIHRvIGEgZGlyZWN0b3J5IGJ5IHRoZQotZXhpc3RlbmNlIChvciBub24tZXhpc3RlbmNlKSBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLTwvUD4KLTxQPgotRXhhbXBsZToKLTwvUD4KLTxCTE9DS1FVT1RFPjxQUkU+Ci1Ccm93c2VyTWF0Y2ggXkJhZFJvYm90LzAuOSBnb19hd2F5Ci0mbHQ7RGlyZWN0b3J5IC9kb2Nyb290Jmd0OwotICAgIG9yZGVyIGFsbG93LGRlbnkKLSAgICBhbGxvdyBmcm9tIGFsbAotICAgIGRlbnkgZnJvbSBlbnY9Z29fYXdheQotJmx0Oy9EaXJlY3RvcnkmZ3Q7Ci08L1BSRT48L0JMT0NLUVVPVEU+Ci1JbiB0aGlzIGNhc2UgYnJvd3NlcnMgd2l0aCB0aGUgdXNlci1hZ2VudCBzdHJpbmcgPFRUPkJhZFJvYm90LzAuOTwvVFQ+IHdpbGwKLWJlIGRlbmllZCBhY2Nlc3MsIGFuZCBhbGwgb3RoZXJzIHdpbGwgYmUgYWxsb3dlZC4KLQotPFA+Ci1TZWUgYWxzbyA8QSBIUkVGPSIjYWxsb3dmcm9tZW52Ij5hbGxvdyBmcm9tIGVudjwvQT4KLWFuZCA8QSBIUkVGPSIjb3JkZXIiPm9yZGVyPC9BPi4KLTwvUD4KLTxIUj4KLQotPEgyPjxBIE5BTUU9Im9yZGVyIj5vcmRlciBkaXJlY3RpdmU8L0E+PC9IMj4KLTxQPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IG9yZGVyfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBvcmRlciA8RU0+b3JkZXJpbmc8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5vcmRlciBkZW55LGFsbG93PC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBkaXJlY3RvcnksIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IExpbWl0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfYWNjZXNzCi08L1A+Ci08UD4KLVRoZSBvcmRlciBkaXJlY3RpdmUgY29udHJvbHMgdGhlIG9yZGVyIGluIHdoaWNoIDxBIEhSRUY9IiNhbGxvdyI+YWxsb3c8L0E+IGFuZAotPEEgSFJFRj0iI2RlbnkiPmRlbnk8L0E+IGRpcmVjdGl2ZXMgYXJlIGV2YWx1YXRlZC4gPEVNPk9yZGVyaW5nPC9FTT4gaXMgb25lCi1vZgotPC9QPgotPERMPgotPERUPmRlbnksYWxsb3cKLTxERD50aGUgZGVueSBkaXJlY3RpdmVzIGFyZSBldmFsdWF0ZWQgYmVmb3JlIHRoZSBhbGxvdyBkaXJlY3RpdmVzLiAgKFRoZQotaW5pdGlhbCBzdGF0ZSBpcyBPSy4pCi08RFQ+YWxsb3csZGVueQotPEREPnRoZSBhbGxvdyBkaXJlY3RpdmVzIGFyZSBldmFsdWF0ZWQgYmVmb3JlIHRoZSBkZW55IGRpcmVjdGl2ZXMuICAoVGhlCi1pbml0aWFsIHN0YXRlIGlzIEZPUkJJRERFTi4pCi08RFQ+bXV0dWFsLWZhaWx1cmUKLTxERD5Pbmx5IHRob3NlIGhvc3RzIHdoaWNoIGFwcGVhciBvbiB0aGUgYWxsb3cgbGlzdCBhbmQgZG8gbm90IGFwcGVhcgotb24gdGhlIGRlbnkgbGlzdCBhcmUgZ3JhbnRlZCBhY2Nlc3MuICAoVGhlIGluaXRpYWwgc3RhdGUgaXMgaXJyZWxldmFudC4pCi08L0RMPgotPFA+Ci1LZXl3b3JkcyBtYXkgb25seSBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYTsgbm8gd2hpdGVzcGFjZSBpcyBhbGxvd2VkIGJldHdlZW4KLXRoZW0uCi08U1RST05HPk5vdGUgdGhhdCBpbiBhbGwgY2FzZXMgZXZlcnkgPENPREU+YWxsb3c8L0NPREU+IGFuZCA8Q09ERT5kZW55PC9DT0RFPgotc3RhdGVtZW50IGlzIGV2YWx1YXRlZCwgdGhlcmUgaXMgbm8gJnF1b3Q7c2hvcnQtY2lyY3VpdGluZyZxdW90Oy48L1NUUk9ORz4KLTwvUD4KLTxQPgotRXhhbXBsZToKLTwvUD4KLTxCTE9DS1FVT1RFPjxDT0RFPgotICAgIG9yZGVyIGRlbnksYWxsb3c8QlI+Ci0gICAgZGVueSBmcm9tIGFsbDxCUj4KLSAgICBhbGxvdyBmcm9tIC5uY3NhLnVpdWMuZWR1PEJSPgotPC9DT0RFPjwvQkxPQ0tRVU9URT4KLTxQPgotSG9zdHMgaW4gdGhlIG5jc2EudWl1Yy5lZHUgZG9tYWluIGFyZSBhbGxvd2VkIGFjY2VzczsgYWxsIG90aGVyIGhvc3RzIGFyZQotZGVuaWVkIGFjY2Vzcy4KLTwvUD4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2FjdGlvbnMuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfYWN0aW9ucy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWQ3OTY5Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfYWN0aW9ucy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+TW9kdWxlIG1vZF9hY3Rpb25zPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+TW9kdWxlIG1vZF9hY3Rpb25zPC9IMT4KLTxQPgotVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Q09ERT5tb2RfYWN0aW9ucy5jPC9DT0RFPiBmaWxlLCBhbmQKLWlzIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuIEl0IHByb3ZpZGVzIGZvcgotZXhlY3V0aW5nIENHSSBzY3JpcHRzIGJhc2VkIG9uIG1lZGlhIHR5cGUgb3IgcmVxdWVzdCBtZXRob2QuIEl0IGlzIG5vdAotcHJlc2VudCBpbiB2ZXJzaW9ucyBwcmlvciB0byBBcGFjaGUgMS4xLgotPC9QPgotPEgyPlN1bW1hcnk8L0gyPgotPFA+Ci1UaGlzIG1vZHVsZSBsZXRzIHlvdSBydW4gQ0dJIHNjcmlwdHMgd2hlbmV2ZXIgYSBmaWxlIG9mIGEgY2VydGFpbiB0eXBlCi1pcyByZXF1ZXN0ZWQuIFRoaXMgbWFrZXMgaXQgbXVjaCBlYXNpZXIgdG8gZXhlY3V0ZSBzY3JpcHRzIHRoYXQKLXByb2Nlc3MgZmlsZXMuCi08L1A+Ci08SDI+RGlyZWN0aXZlczwvSDI+Ci08VUw+Ci08TEk+PEEgSFJFRj0iI2FjdGlvbiI+QWN0aW9uPC9BPgotPExJPjxBIEhSRUY9IiNzY3JpcHQiPlNjcmlwdDwvQT4KLTwvVUw+Ci0KLTxIUj4KLQotPEgyPjxBIE5BTUU9ImFjdGlvbiI+QWN0aW9uIGRpcmVjdGl2ZTwvQT48L0gyPgotPFA+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEFjdGlvbiA8RU0+YWN0aW9uLXR5cGUgY2dpLXNjcmlwdDwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LAotIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IEZpbGVJbmZvPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfYWN0aW9uczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBBY3Rpb24gaXMgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDEuMQotYW5kIGxhdGVyCi08L1A+Ci08UD4KLVRoaXMgZGlyZWN0aXZlIGFkZHMgYW4gYWN0aW9uLCB3aGljaCB3aWxsIGFjdGl2YXRlIDxFTT5jZ2ktc2NyaXB0PC9FTT4gd2hlbgotPEVNPmFjdGlvbi10eXBlPC9FTT4gaXMgdHJpZ2dlcmVkIGJ5IHRoZSByZXF1ZXN0LiBUaGUgPEVNPmFjdGlvbi10eXBlPC9FTT4gY2FuCi1iZSBlaXRoZXIgYSA8QSBIUkVGPSIuLi9oYW5kbGVyLmh0bWwiPmhhbmRsZXI8L0E+IG9yIGEgTUlNRSBjb250ZW50IHR5cGUuICBJdAotc2VuZHMgdGhlIFVSTCBhbmQgZmlsZSBwYXRoIG9mIHRoZSByZXF1ZXN0ZWQgZG9jdW1lbnQgdXNpbmcgdGhlIHN0YW5kYXJkIENHSQotUEFUSF9JTkZPIGFuZCBQQVRIX1RSQU5TTEFURUQgZW52aXJvbm1lbnQgdmFyaWFibGVzLgotPC9QPgotPEhSPgotCi08SDI+PEEgTkFNRT0ic2NyaXB0Ij5TY3JpcHQgZGlyZWN0aXZlPC9BPjwvSDI+Ci08UD4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gU2NyaXB0IDxFTT5tZXRob2QgY2dpLXNjcmlwdDwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfYWN0aW9uczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBTY3JpcHQgaXMgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDEuMQotYW5kIGxhdGVyOyBhcmJpdHJhcnkgbWV0aG9kIHVzZSBpcyBvbmx5IGF2YWlsYWJsZSB3aXRoIDEuMy4xMCBhbmQgbGF0ZXIKLTwvUD4KLQotPFA+Ci1UaGlzIGRpcmVjdGl2ZSBhZGRzIGFuIGFjdGlvbiwgd2hpY2ggd2lsbCBhY3RpdmF0ZSA8aT5jZ2ktc2NyaXB0PC9pPiB3aGVuCi1hIGZpbGUgaXMgcmVxdWVzdGVkIHVzaW5nIHRoZSBtZXRob2Qgb2YgPGk+bWV0aG9kPC9pPi4gIEl0IHNlbmRzIHRoZQotVVJMIGFuZCBmaWxlIHBhdGggb2YgdGhlIHJlcXVlc3RlZCBkb2N1bWVudCB1c2luZyB0aGUgc3RhbmRhcmQKLUNHSSBQQVRIX0lORk8gYW5kIFBBVEhfVFJBTlNMQVRFRCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCi08L1A+Ci08YmxvY2txdW90ZT4KLVByaW9yIHRvIEFwYWNoZSAxLjMuMTAsIDxpPm1ldGhvZDwvaT4gY2FuIG9ubHkgYmUKLW9uZSBvZiA8Y29kZT5HRVQ8L2NvZGU+LCA8Y29kZT5QT1NUPC9jb2RlPiwgPGNvZGU+UFVUPC9jb2RlPiwgb3IKLTxjb2RlPkRFTEVURTwvY29kZT4uICAgQXMgb2YgMS4zLjEwLCBhbnkgYXJiaXRyYXJ5IG1ldGhvZCBuYW1lCi1tYXkgYmUgdXNlZC4gIDxiPk1ldGhvZCBuYW1lcyBhcmUgY2FzZS1zZW5zaXRpdmU8L2I+LCBzbwotPGNvZGU+U2NyaXB0Jm5ic3A7UFVUPC9jb2RlPiBhbmQgPGNvZGU+U2NyaXB0Jm5ic3A7cHV0PC9jb2RlPgotaGF2ZSB0d28gZW50aXJlbHkgZGlmZmVyZW50IGVmZmVjdHMuCi08L2Jsb2NrcXVvdGU+Ci08UD4KLU5vdGUgdGhhdCB0aGUgU2NyaXB0IGNvbW1hbmQgZGVmaW5lcyBkZWZhdWx0IGFjdGlvbnMgb25seS4gSWYgYSBDR0kKLXNjcmlwdCBpcyBjYWxsZWQsIG9yIHNvbWUgb3RoZXIgcmVzb3VyY2UgdGhhdCBpcyBjYXBhYmxlIG9mIGhhbmRsaW5nCi10aGUgcmVxdWVzdGVkIG1ldGhvZCBpbnRlcm5hbGx5LCBpdCB3aWxsIGRvIHNvLiBBbHNvIG5vdGUgdGhhdCBTY3JpcHQKLXdpdGggYSBtZXRob2Qgb2YgPENPREU+R0VUPC9DT0RFPiB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIHRoZXJlIGFyZQotcXVlcnkgYXJndW1lbnRzIHByZXNlbnQgKDxFTT5lLmcuPC9FTT4sIGZvby5odG1sP2hpKS4gT3RoZXJ3aXNlLCB0aGUgcmVxdWVzdAotd2lsbCBwcm9jZWVkIG5vcm1hbGx5LgotPC9QPgotPFA+Ci1FeGFtcGxlczoKLTwvUD4KLTxQUkU+Ci0gICAgU2NyaXB0IEdFVCAvY2dpLWJpbi9zZWFyY2ggICAgICM8RU0+ZS5nLjwvRU0+IGZvciAmbHQ7SVNJTkRFWCZndDstc3R5bGUgc2VhcmNoaW5nCi0gICAgU2NyaXB0IFBVVCAvfmJvYi9wdXQuY2dpCi08L1BSRT4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfYWxpYXMuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfYWxpYXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgyNjg0Mi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX2FsaWFzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MDUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9hbGlhczwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotCi08SDEgQUxJR049IkNFTlRFUiI+TW9kdWxlIG1vZF9hbGlhczwvSDE+Ci08UD4KLVRoaXMgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbiB0aGUgPENPREU+bW9kX2FsaWFzLmM8L0NPREU+IGZpbGUsIGFuZAotaXMgY29tcGlsZWQgaW4gYnkgZGVmYXVsdC4gSXQgcHJvdmlkZXMgZm9yIG1hcHBpbmcgZGlmZmVyZW50IHBhcnRzIG9mIHRoZQotaG9zdCBmaWxlc3lzdGVtIGluIHRoZSB0aGUgZG9jdW1lbnQgdHJlZSwgYW5kIGZvciBVUkwgcmVkaXJlY3Rpb24uCi08L1A+Ci0KLTxIMj5EaXJlY3RpdmVzPC9IMj4KLTxVTD4KLTxMST48QSBIUkVGPSIjYWxpYXMiPkFsaWFzPC9BPgotPExJPjxBIEhSRUY9IiNhbGlhc21hdGNoIj5BbGlhc01hdGNoPC9BPgotPExJPjxBIEhSRUY9IiNyZWRpcmVjdCI+UmVkaXJlY3Q8L0E+Ci08TEk+PEEgSFJFRj0iI3JlZGlyZWN0bWF0Y2giPlJlZGlyZWN0TWF0Y2g8L0E+Ci08TEk+PEEgSFJFRj0iI3JlZGlyZWN0dGVtcCI+UmVkaXJlY3RUZW1wPC9BPgotPExJPjxBIEhSRUY9IiNyZWRpcmVjdHBlcm0iPlJlZGlyZWN0UGVybWFuZW50PC9BPgotPExJPjxBIEhSRUY9IiNzY3JpcHRhbGlhcyI+U2NyaXB0QWxpYXM8L0E+Ci08TEk+PEEgSFJFRj0iI3NjcmlwdGFsaWFzbWF0Y2giPlNjcmlwdEFsaWFzTWF0Y2g8L0E+Ci08L1VMPgotPEhSPgotCi0KLTxIMj48QSBOQU1FPSJhbGlhcyI+QWxpYXMgZGlyZWN0aXZlPC9BPjwvSDI+Ci08UD4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBBbGlhc30gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQWxpYXMgPEVNPnVybC1wYXRoIGRpcmVjdG9yeS1maWxlbmFtZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2FsaWFzCi08L1A+Ci08UD4KLVRoZSBBbGlhcyBkaXJlY3RpdmUgYWxsb3dzIGRvY3VtZW50cyB0byBiZSBzdG9yZWQgaW4gdGhlIGxvY2FsIGZpbGVzeXN0ZW0KLW90aGVyIHRoYW4gdW5kZXIgdGhlIDxBIEhSRUY9ImNvcmUuaHRtbCNkb2N1bWVudHJvb3QiPkRvY3VtZW50Um9vdDwvQT4uCi1VUkxzIHdpdGggYSAoJS1kZWNvZGVkKSBwYXRoIGJlZ2lubmluZyB3aXRoIDxFTT51cmwtcGF0aDwvRU0+IHdpbGwgYmUKLW1hcHBlZCB0byBsb2NhbCBmaWxlcyBiZWdpbm5pbmcgd2l0aCA8RU0+ZGlyZWN0b3J5LWZpbGVuYW1lPC9FTT4uCi08UD4KLUV4YW1wbGU6Ci08L1A+Ci08QkxPQ0tRVU9URT48Q09ERT5BbGlhcyAvaW1hZ2UgL2Z0cC9wdWIvaW1hZ2U8L0NPREU+PC9CTE9DS1FVT1RFPgotPFA+Ci1BIHJlcXVlc3QgZm9yIGh0dHA6Ly9teXNlcnZlci9pbWFnZS9mb28uZ2lmIHdvdWxkIGNhdXNlIHRoZSBzZXJ2ZXIgdG8KLXJldHVybiB0aGUgZmlsZSAvZnRwL3B1Yi9pbWFnZS9mb28uZ2lmLgotPC9QPgotPFA+Ci1Ob3RlIHRoYXQgaWYgeW91IGluY2x1ZGUgYSB0cmFpbGluZyAvIG9uIHRoZSA8RU0+dXJsLXBhdGg8L0VNPiB0aGVuIHRoZQotc2VydmVyIHdpbGwgcmVxdWlyZSBhIHRyYWlsaW5nIC8gaW4gb3JkZXIgdG8gZXhwYW5kIHRoZSBhbGlhcy4gIFRoYXQgaXMsCi1pZiB5b3UgdXNlIDxDT0RFPkFsaWFzIC9pY29ucy8gL3Vzci9sb2NhbC9hcGFjaGUvaWNvbnMvPC9DT0RFPiB0aGVuCi10aGUgdXJsIDxDT0RFPi9pY29uczwvQ09ERT4gd2lsbCBub3QgYmUgYWxpYXNlZC4KLTwvUD4KLTxQPgotTm90ZSB0aGF0IHlvdSBtYXkgbmVlZCB0byBzcGVjaWZ5IGFkZGl0aW9uYWwKLTxBIEhSRUY9ImNvcmUuaHRtbCNkaXJlY3RvcnkiPjxDT0RFPiZsdDtEaXJlY3RvcnkmZ3Q7PC9DT0RFPjwvQT4gc2VjdGlvbnMKLXdoaWNoIGNvdmVyIHRoZSA8RU0+ZGVzdGluYXRpb248L0VNPiBvZiBhbGlhc2VzLiAgQWxpYXNpbmcgb2NjdXJzCi1iZWZvcmUgPENPREU+Jmx0O0RpcmVjdG9yeSZndDs8L0NPREU+IHNlY3Rpb25zIGFyZSBjaGVja2VkLCBzbyBvbmx5Ci10aGUgZGVzdGluYXRpb24gb2YgYWxpYXNlcyBhcmUgYWZmZWN0ZWQuICAoTm90ZSBob3dldmVyCi08QSBIUkVGPSJjb3JlLmh0bWwjbG9jYXRpb24iPjxDT0RFPiZsdDtMb2NhdGlvbiZndDs8L0NPREU+PC9BPgotc2VjdGlvbnMgYXJlIHJ1biB0aHJvdWdoIG9uY2UgYmVmb3JlIGFsaWFzZXMgYXJlIHBlcmZvcm1lZCwgc28gdGhleQotd2lsbCBhcHBseS4pCi08UD4KLVNlZSBhbHNvIDxBIEhSRUY9IiNzY3JpcHRhbGlhcyI+U2NyaXB0QWxpYXM8L0E+LgotPC9QPgotPEhSPgotCi08SDI+PEEgTkFNRT0iYWxpYXNtYXRjaCI+QWxpYXNNYXRjaDwvQT48L0gyPgotPFA+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEFsaWFzTWF0Y2ggPEVNPnJlZ2V4IGRpcmVjdG9yeS1maWxlbmFtZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2FsaWFzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IEF2YWlsYWJsZSBpbiBBcGFjaGUgMS4zIGFuZCBsYXRlcgotPC9QPgotCi08UD5UaGlzIGRpcmVjdGl2ZSBpcyBlcXVpdmFsZW50IHRvIDxBIEhSRUY9IiNhbGlhcyI+QWxpYXM8L0E+LCBidXQKLW1ha2VzIHVzZSBvZiBzdGFuZGFyZCByZWd1bGFyIGV4cHJlc3Npb25zLCBpbnN0ZWFkIG9mIHNpbXBsZSBwcmVmaXgKLW1hdGNoaW5nLiBUaGUgc3VwcGxpZWQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgVVJMLAotYW5kIGlmIGl0IG1hdGNoZXMsIHRoZSBzZXJ2ZXIgd2lsbCBzdWJzdGl0dXRlIGFueSBwYXJlbnRoZXNpemVkCi1tYXRjaGVzIGludG8gdGhlIGdpdmVuIHN0cmluZyBhbmQgdXNlIGl0IGFzIGEgZmlsZW5hbWUuIEZvciBleGFtcGxlLAotdG8gYWN0aXZhdGUgdGhlIDxDT0RFPi9pY29uczwvQ09ERT4gZGlyZWN0b3J5LCBvbmUgbWlnaHQgdXNlOgotPFBSRT4KLSAgICBBbGlhc01hdGNoIF4vaWNvbnMoLiopIC91c3IvbG9jYWwvYXBhY2hlL2ljb25zJDEKLTwvUFJFPgotPC9QPgotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJyZWRpcmVjdCI+UmVkaXJlY3QgZGlyZWN0aXZlPC9BPjwvSDI+Ci08UD4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBSZWRpcmVjdH0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gUmVkaXJlY3QgWyA8RU0+c3RhdHVzPC9FTT4gXQotIDxFTT51cmwtcGF0aCB1cmw8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwKLSAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBGaWxlSW5mbzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2FsaWFzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IFRoZSBkaXJlY3RvcnkgYW5kIC5odGFjY2VzcyBjb250ZXh0J3MKLWFyZSBvbmx5IGF2YWlsYWJsZSBpbiB2ZXJzaW9ucyAxLjEgYW5kIGxhdGVyLiBUaGUgPEVNPnN0YXR1czwvRU0+Ci1hcmd1bWVudCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUgMS4yIG9yIGxhdGVyLgotPC9QPgotPFA+Ci1UaGUgUmVkaXJlY3QgZGlyZWN0aXZlIG1hcHMgYW4gb2xkIFVSTCBpbnRvIGEgbmV3IG9uZS4gVGhlIG5ldyBVUkwgaXMgcmV0dXJuZWQKLXRvIHRoZSBjbGllbnQgd2hpY2ggYXR0ZW1wdHMgdG8gZmV0Y2ggaXQgYWdhaW4gd2l0aCB0aGUgbmV3IGFkZHJlc3MuCi08RU0+VXJsLXBhdGg8L0VNPiBhICglLWRlY29kZWQpIHBhdGg7IGFueSByZXF1ZXN0cyBmb3IgZG9jdW1lbnRzIGJlZ2lubmluZyB3aXRoCi10aGlzIHBhdGggd2lsbCBiZSByZXR1cm5lZCBhIHJlZGlyZWN0IGVycm9yIHRvIGEgbmV3ICglLWVuY29kZWQpIHVybAotYmVnaW5uaW5nIHdpdGggPEVNPnVybDwvRU0+LgotPC9QPgotPFA+Ci1FeGFtcGxlOgotPC9QPgotPEJMT0NLUVVPVEU+PENPREU+UmVkaXJlY3QgL3NlcnZpY2UKLWh0dHA6Ly9mb28yLmJhci5jb20vc2VydmljZTwvQ09ERT48L0JMT0NLUVVPVEU+Ci08UD4KLUlmIHRoZSBjbGllbnQgcmVxdWVzdHMgaHR0cDovL215c2VydmVyL3NlcnZpY2UvZm9vLnR4dCwgaXQgd2lsbCBiZSB0b2xkIHRvCi1hY2Nlc3MgaHR0cDovL2ZvbzIuYmFyLmNvbS9zZXJ2aWNlL2Zvby50eHQgaW5zdGVhZC4KLTwvUD4KLTxQPgotPFNUUk9ORz5Ob3RlOjwvU1RST05HPiBSZWRpcmVjdCBkaXJlY3RpdmVzIHRha2UgcHJlY2VkZW5jZSBvdmVyIEFsaWFzCi1hbmQgU2NyaXB0QWxpYXMKLWRpcmVjdGl2ZXMsIGlycmVzcGVjdGl2ZSBvZiB0aGVpciBvcmRlcmluZyBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiAgQWxzbywKLTxFTT5VcmwtcGF0aDwvRU0+IG11c3QgYmUgYW4gYWJzb2x1dGUgcGF0aCwgbm90IGEgcmVsYXRpdmUgcGF0aCwgZXZlbgotd2hlbiB1c2VkIHdpdGggLmh0YWNjZXNzIGZpbGVzIG9yIGluc2lkZSBvZiAmbHQ7RGlyZWN0b3J5Jmd0OyBzZWN0aW9ucy4KLTwvUD4KLTxQPgotSWYgbm8gPEVNPnN0YXR1czwvRU0+IGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgcmVkaXJlY3Qgd2lsbCBiZQotJnF1b3Q7dGVtcG9yYXJ5JnF1b3Q7IChIVFRQIHN0YXR1cyAzMDIpLiBUaGlzIGluZGljYXRlcyB0byB0aGUgY2xpZW50IHRoYXQgdGhlCi1yZXNvdXJjZXMgaXMgaGFzIG1vdmVkIHRlbXBvcmFyaWx5LiBUaGUgPEVNPnN0YXR1czwvRU0+Ci1hcmd1bWVudCBjYW4gYmUgdXNlZCB0byByZXR1cm4gb3RoZXIgSFRUUCBzdGF0dXMgY29kZXM6Ci08UD4KLTxETD4KLTxEVD5wZXJtYW5lbnQKLTxERD5SZXR1cm5zIGEgcGVybWFuZW50IHJlZGlyZWN0IHN0YXR1cyAoMzAxKSBpbmRpY2F0aW5nIHRoYXQKLXRoZSByZXNvdXJjZSBoYXMgbW92ZWQgcGVybWFuZW50bHkuCi08RFQ+dGVtcAotPEREPlJldHVybnMgYSB0ZW1wb3JhcnkgcmVkaXJlY3Qgc3RhdHVzICgzMDIpLiBUaGlzIGlzIHRoZQotZGVmYXVsdC4KLTxEVD5zZWVvdGhlcgotPEREPlJldHVybnMgYSAiU2VlIE90aGVyIiBzdGF0dXMgKDMwMykgaW5kaWNhdGluZyB0aGF0Ci10aGUgcmVzb3VyY2UgaGFzIGJlZW4gcmVwbGFjZWQuCi08RFQ+Z29uZQotPEREPlJldHVybnMgYSAiR29uZSIgc3RhdHVzICg0MTApIGluZGljYXRpbmcgdGhhdCB0aGUgcmVzb3VyY2UKLWhhcyBiZWVuIHBlcm1hbmVudGx5IHJlbW92ZWQuIFdoZW4gdGhpcyBzdGF0dXMgaXMgdXNlZCB0aGUgPEVNPnVybDwvRU0+Ci1hcmd1bWVudCBzaG91bGQgYmUgb21pdHRlZC4KLTwvREw+Ci08UD4KLU90aGVyIHN0YXR1cyBjb2RlcyBjYW4gYmUgcmV0dXJuZWQgYnkgZ2l2aW5nIHRoZSBudW1lcmljIHN0YXR1cyBjb2RlCi1hcyB0aGUgdmFsdWUgb2YgPEVNPnN0YXR1czwvRU0+LiBJZiB0aGUgc3RhdHVzIGlzIGJldHdlZW4gMzAwIGFuZCAzOTksCi10aGUgPEVNPnVybDwvRU0+IGFyZ3VtZW50IG11c3QgYmUgcHJlc2VudCwgb3RoZXJ3aXNlIGl0IG11c3QgYmUKLW9taXR0ZWQuIE5vdGUgdGhhdCB0aGUgc3RhdHVzIG11c3QgYmUga25vd24gdG8gdGhlIEFwYWNoZSBjb2RlIChzZWUKLXRoZSBmdW5jdGlvbiA8Q09ERT5zZW5kX2Vycm9yX3Jlc3BvbnNlPC9DT0RFPiBpbiBodHRwX3Byb3RvY29sLmMpLgotPC9QPgotPEhSPgotCi08SDI+PEEgTkFNRT0icmVkaXJlY3RtYXRjaCI+UmVkaXJlY3RNYXRjaDwvQT48L0gyPgotPFA+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+Ci0gICAgUmVkaXJlY3RNYXRjaCBbPEVNPnN0YXR1czwvRU0+XSA8RU0+cmVnZXggdXJsPC9FTT4KLTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwKLSAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBGaWxlSW5mbzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2FsaWFzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IEF2YWlsYWJsZSBpbiBBcGFjaGUgMS4zIGFuZCBsYXRlcgotPC9QPgotCi08UD5UaGlzIGRpcmVjdGl2ZSBpcyBlcXVpdmFsZW50IHRvIDxBIEhSRUY9IiNhbGlhcyI+UmVkaXJlY3Q8L0E+LCBidXQKLW1ha2VzIHVzZSBvZiBzdGFuZGFyZCByZWd1bGFyIGV4cHJlc3Npb25zLCBpbnN0ZWFkIG9mIHNpbXBsZSBwcmVmaXgKLW1hdGNoaW5nLiBUaGUgc3VwcGxpZWQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgVVJMLAotYW5kIGlmIGl0IG1hdGNoZXMsIHRoZSBzZXJ2ZXIgd2lsbCBzdWJzdGl0dXRlIGFueSBwYXJlbnRoZXNpemVkCi1tYXRjaGVzIGludG8gdGhlIGdpdmVuIHN0cmluZyBhbmQgdXNlIGl0IGFzIGEgZmlsZW5hbWUuIEZvciBleGFtcGxlLAotdG8gcmVkaXJlY3QgYWxsIEdJRiBmaWxlcyB0byBsaWtlLW5hbWVkIEpQRUcgZmlsZXMgb24gYW5vdGhlciBzZXJ2ZXIsCi1vbmUgbWlnaHQgdXNlOgotPFBSRT4KLSAgICBSZWRpcmVjdE1hdGNoICguKilcLmdpZiQgaHR0cDovL3d3dy5hbm90aGVyc2VydmVyLmNvbSQxLmpwZwotPC9QUkU+Ci08L1A+Ci0KLTxIUj4KLQotPEgyPjxBIE5BTUU9InJlZGlyZWN0dGVtcCI+UmVkaXJlY3RUZW1wIGRpcmVjdGl2ZTwvQT48L0gyPgotPFA+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgUmVkaXJlY3R9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFJlZGlyZWN0VGVtcCA8RU0+dXJsLXBhdGggdXJsPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksCi0gLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gRmlsZUluZm88QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9hbGlhczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBUaGlzIGRpcmVjdGl2ZSBpcyBvbmx5IGF2YWlsYWJsZSBpbiAxLjIKLTwvUD4KLTxQPgotVGhpcyBkaXJlY3RpdmUgbWFrZXMgdGhlIGNsaWVudCBrbm93IHRoYXQgdGhlIFJlZGlyZWN0IGlzIG9ubHkKLXRlbXBvcmFyeSAoc3RhdHVzIDMwMikuIEV4YWN0bHkgZXF1aXZhbGVudCB0byA8Q09ERT5SZWRpcmVjdAotdGVtcDwvQ09ERT4uCi08L1A+Ci08SFI+Ci0KLTxIMj48QSBOQU1FPSJyZWRpcmVjdHBlcm0iPlJlZGlyZWN0UGVybWFuZW50IGRpcmVjdGl2ZTwvQT48L0gyPgotPFA+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgUmVkaXJlY3R9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFJlZGlyZWN0UGVybWFuZW50IDxFTT51cmwtcGF0aCB1cmw8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwKLSAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBGaWxlSW5mbzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2FsaWFzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IFRoaXMgZGlyZWN0aXZlIGlzIG9ubHkgYXZhaWxhYmxlIGluIDEuMgotPC9QPgotPFA+Ci1UaGlzIGRpcmVjdGl2ZSBtYWtlcyB0aGUgY2xpZW50IGtub3cgdGhhdCB0aGUgUmVkaXJlY3QgaXMgcGVybWFuZW50Ci0oc3RhdHVzIDMwMSkuIEV4YWN0bHkgZXF1aXZhbGVudCB0byA8Q09ERT5SZWRpcmVjdCBwZXJtYW5lbnQ8L0NPREU+LgotPC9QPgotPEhSPgotCi08SDI+PEEgTkFNRT0ic2NyaXB0YWxpYXMiPlNjcmlwdEFsaWFzIGRpcmVjdGl2ZTwvQT48L0gyPgotPFA+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgU2NyaXB0QWxpYXN9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFNjcmlwdEFsaWFzIDxFTT51cmwtcGF0aCBkaXJlY3RvcnktZmlsZW5hbWU8L0VNPgotPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2FsaWFzCi08L1A+Ci08UD4KLVRoZSBTY3JpcHRBbGlhcyBkaXJlY3RpdmUgaGFzIHRoZSBzYW1lIGJlaGF2aW9yIGFzIHRoZQotPEEgSFJFRj0iI2FsaWFzIj5BbGlhczwvQT4gZGlyZWN0aXZlLCBleGNlcHQgdGhhdCBpbiBhZGRpdGlvbiBpdAotbWFya3MgdGhlIHRhcmdldCBkaXJlY3RvcnkgYXMgY29udGFpbmluZyBDR0kgc2NyaXB0cy4KLVVSTHMgd2l0aCBhICglLWRlY29kZWQpIHBhdGggYmVnaW5uaW5nIHdpdGggPEVNPnVybC1wYXRoPC9FTT4gd2lsbCBiZQotbWFwcGVkIHRvIHNjcmlwdHMgYmVnaW5uaW5nIHdpdGggPEVNPmRpcmVjdG9yeS1maWxlbmFtZTwvRU0+LgotPFA+Ci1FeGFtcGxlOgotPC9QPgotPEJMT0NLUVVPVEU+PENPREU+U2NyaXB0QWxpYXMgL2NnaS1iaW4vIC93ZWIvY2dpLWJpbi88L0NPREU+PC9CTE9DS1FVT1RFPgotPFA+Ci1BIHJlcXVlc3QgZm9yIGh0dHA6Ly9teXNlcnZlci9jZ2ktYmluL2ZvbyB3b3VsZCBjYXVzZSB0aGUgc2VydmVyIHRvCi1ydW4gdGhlIHNjcmlwdCAvd2ViL2NnaS1iaW4vZm9vLgotPC9QPgotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJzY3JpcHRhbGlhc21hdGNoIj5TY3JpcHRBbGlhc01hdGNoPC9BPjwvSDI+Ci08UD4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gU2NyaXB0QWxpYXNNYXRjaAotIDxFTT5yZWdleCBkaXJlY3RvcnktZmlsZW5hbWU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9hbGlhczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBBdmFpbGFibGUgaW4gQXBhY2hlIDEuMyBhbmQgbGF0ZXIKLTwvUD4KLQotPFA+VGhpcyBkaXJlY3RpdmUgaXMgZXF1aXZhbGVudCB0byA8QSBIUkVGPSIjc2NyaXB0YWxpYXMiPlNjcmlwdEFsaWFzPC9BPiwgYnV0Ci1tYWtlcyB1c2Ugb2Ygc3RhbmRhcmQgcmVndWxhciBleHByZXNzaW9ucywgaW5zdGVhZCBvZiBzaW1wbGUgcHJlZml4Ci1tYXRjaGluZy4gVGhlIHN1cHBsaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIFVSTCwKLWFuZCBpZiBpdCBtYXRjaGVzLCB0aGUgc2VydmVyIHdpbGwgc3Vic3RpdHV0ZSBhbnkgcGFyZW50aGVzaXplZAotbWF0Y2hlcyBpbnRvIHRoZSBnaXZlbiBzdHJpbmcgYW5kIHVzZSBpdCBhcyBhIGZpbGVuYW1lLiBGb3IgZXhhbXBsZSwKLXRvIGFjdGl2YXRlIHRoZSBzdGFuZGFyZCA8Q09ERT4vY2dpLWJpbjwvQ09ERT4sIG9uZSBtaWdodCB1c2U6Ci08UFJFPgotICAgIFNjcmlwdEFsaWFzTWF0Y2ggXi9jZ2ktYmluKC4qKSAvdXNyL2xvY2FsL2FwYWNoZS9jZ2ktYmluJDEKLTwvUFJFPgotPC9QPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9hc2lzLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2FzaXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NhOGU3ZS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX2FzaXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIG1vZHVsZSBtb2RfYXNpczwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotCi08SDEgQUxJR049IkNFTlRFUiI+TW9kdWxlIG1vZF9hc2lzPC9IMT4KLQotVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Q09ERT5tb2RfYXNpcy5jPC9DT0RFPiBmaWxlLCBhbmQKLWlzIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuIEl0IHByb3ZpZGVzIGZvciA8Q09ERT4uYXNpczwvQ09ERT4gZmlsZXMuIEFueQotZG9jdW1lbnQgd2l0aCBtaW1lIHR5cGUgPENPREU+aHR0cGQvc2VuZC1hcy1pczwvQ09ERT4gd2lsbCBiZSBwcm9jZXNzZWQgYnkKLXRoaXMgbW9kdWxlLgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IGh0dHBkL3NlbmQtYXMtaXN9IG1pbWUgdHlwZSZndDsgLS0+Ci0KLTxIMj5QdXJwb3NlPC9IMj4KLVRvIGFsbG93IGZpbGUgdHlwZXMgdG8gYmUgZGVmaW5lZCBzdWNoIHRoYXQgQXBhY2hlIHNlbmRzIHRoZW0gd2l0aG91dAotYWRkaW5nIEhUVFAgaGVhZGVycy48UD4KLQotVGhpcyBjYW4gYmUgdXNlZCB0byBzZW5kIGFueSBraW5kIG9mIGRhdGEgZnJvbSB0aGUgc2VydmVyLCBpbmNsdWRpbmcgcmVkaXJlY3RzCi1hbmQgb3RoZXIgc3BlY2lhbCBIVFRQIHJlc3BvbnNlcywgd2l0aG91dCByZXF1aXJpbmcgYSBjZ2ktc2NyaXB0IG9yIGFuIG5waAotc2NyaXB0LgotPEgyPlVzYWdlPC9IMj4KLUluIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlLCBkZWZpbmUgYSBuZXcgbWltZSB0eXBlIGNhbGxlZAotPENPREU+aHR0cGQvc2VuZC1hcy1pczwvQ09ERT4gPEVNPmUuZy48L0VNPgotPEJMT0NLUVVPVEU+PENPREU+QWRkVHlwZSBodHRwZC9zZW5kLWFzLWlzIGFzaXM8L0NPREU+PC9CTE9DS1FVT1RFPgotdGhpcyBkZWZpbmVzIHRoZSA8Q09ERT4uYXNpczwvQ09ERT4gZmlsZSBleHRlbnNpb24gYXMgYmVpbmcgb2YgdGhlIG5ldwotPENPREU+aHR0cGQvc2VuZC1hcy1pczwvQ09ERT4gbWltZSB0eXBlLiBUaGUgY29udGVudHMgb2YgYW55IGZpbGUgd2l0aCBhCi08Q09ERT4uYXNpczwvQ09ERT4gZXh0ZW5zaW9uIHdpbGwgdGhlbiBiZSBzZW50IGJ5IEFwYWNoZSB0byB0aGUgY2xpZW50IHdpdGgKLWFsbW9zdCBubyBjaGFuZ2VzLiBDbGllbnRzIHdpbGwgbmVlZCBIVFRQIGhlYWRlcnMgdG8gYmUgYXR0YWNoZWQsIHNvIGRvIG5vdAotZm9yZ2V0IHRoZW0uIEEgU3RhdHVzOiBoZWFkZXIgaXMgYWxzbyByZXF1aXJlZDsgdGhlIGRhdGEgc2hvdWxkIGJlIHRoZQotMy1kaWdpdCBIVFRQIHJlc3BvbnNlIGNvZGUsIGZvbGxvd2VkIGJ5IGEgdGV4dHVhbCBtZXNzYWdlLjxQPgotCi1IZXJlJ3MgYW4gZXhhbXBsZSBvZiBhIGZpbGUgd2hvc2UgY29udGVudHMgYXJlIHNlbnQgPEVNPmFzIGlzPC9FTT4gc28gYXMgdG8KLXRlbGwgdGhlIGNsaWVudCB0aGF0IGEgZmlsZSBoYXMgcmVkaXJlY3RlZC4KLTxCTE9DS1FVT1RFPjxDT0RFPgotU3RhdHVzOiAzMDEgTm93IHdoZXJlIGRpZCBJIGxlYXZlIHRoYXQgVVJMIDxCUj4KLUxvY2F0aW9uOiBodHRwOi8veHl6LmFiYy5jb20vZm9vL2Jhci5odG1sIDxCUj4KLUNvbnRlbnQtdHlwZTogdGV4dC9odG1sIDxCUj4KLTxCUj4KLSZsdDtIVE1MJmd0OyA8QlI+Ci0mbHQ7SEVBRCZndDsgPEJSPgotJmx0O1RJVExFJmd0O0xhbWUgZXhjdXNlcydSJ3VzJmx0Oy9USVRMRSZndDsgPEJSPgotJmx0Oy9IRUFEJmd0OyA8QlI+Ci0mbHQ7Qk9EWSZndDsgPEJSPgotJmx0O0gxJmd0O0ZyZWQncyBleGNlcHRpb25hbGx5IHdvbmRlcmZ1bCBwYWdlIGhhcyBtb3ZlZCB0byA8QlI+Ci0mbHQ7QSBIUkVGPSJodHRwOi8veHl6LmFiYy5jb20vZm9vL2Jhci5odG1sIiZndDtKb2UncyZsdDsvQSZndDsgc2l0ZS4gIDxCUj4KLSZsdDsvSDEmZ3Q7IDxCUj4KLSZsdDsvQk9EWSZndDsgPEJSPgotJmx0Oy9IVE1MJmd0OwotPC9DT0RFPjwvQkxPQ0tRVU9URT4KLU5vdGVzOiB0aGUgc2VydmVyIGFsd2F5cyBhZGRzIGEgRGF0ZTogYW5kIFNlcnZlcjogaGVhZGVyIHRvIHRoZSBkYXRhIHJldHVybmVkCi10byB0aGUgY2xpZW50LCBzbyB0aGVzZSBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBmaWxlLgotVGhlIHNlcnZlciBkb2VzIDxFTT5ub3Q8L0VNPiBhZGQgYSBMYXN0LU1vZGlmaWVkIGhlYWRlcjsgaXQgcHJvYmFibHkgc2hvdWxkLgotPFA+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2F1dGguaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfYXV0aC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2Y4NWQ1Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfYXV0aC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIG1vZHVsZSBtb2RfYXV0aDwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotCi08SDEgQUxJR049IkNFTlRFUiI+TW9kdWxlIG1vZF9hdXRoPC9IMT4KLQotVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Q09ERT5tb2RfYXV0aC5jPC9DT0RFPiBmaWxlLCBhbmQKLWlzIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuIEl0IHByb3ZpZGVzIGZvciB1c2VyIGF1dGhlbnRpY2F0aW9uIHVzaW5nCi10ZXh0dWFsIGZpbGVzLgotCi0KLTxNRU5VPgotPExJPjxBIEhSRUY9IiNhdXRoZ3JvdXBmaWxlIj5BdXRoR3JvdXBGaWxlPC9BPgotPExJPjxBIEhSRUY9IiNhdXRodXNlcmZpbGUiPkF1dGhVc2VyRmlsZTwvQT4KLTxMST48QSBIUkVGPSIjYXV0aGF1dGhvcml0YXRpdmUiPkF1dGhBdXRob3JpdGF0aXZlPC9BPgotPC9NRU5VPgotPEhSPgotCi0KLTxIMj48QSBOQU1FPSJhdXRoZ3JvdXBmaWxlIj5BdXRoR3JvdXBGaWxlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgQXV0aEdyb3VwRmlsZX0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQXV0aEdyb3VwRmlsZSA8RU0+ZmlsZW5hbWU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBkaXJlY3RvcnksIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IEF1dGhDb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9hdXRoPFA+Ci0KLVRoZSBBdXRoR3JvdXBGaWxlIGRpcmVjdGl2ZSBzZXRzIHRoZSBuYW1lIG9mIGEgdGV4dHVhbCBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpc3QKLW9mIHVzZXIgZ3JvdXBzIGZvciB1c2VyIGF1dGhlbnRpY2F0aW9uLiA8RU0+RmlsZW5hbWU8L0VNPiBpcyB0aGUgcGF0aAotdG8gdGhlIGdyb3VwIGZpbGUuICBJZiBpdCBpcyBub3QgYWJzb2x1dGUgKDxFTT5pLmUuPC9FTT4sIGlmIGl0Ci1kb2Vzbid0IGJlZ2luIHdpdGggYSBzbGFzaCksIGl0IGlzIHRyZWF0ZWQgYXMgcmVsYXRpdmUgdG8gdGhlIFNlcnZlclJvb3QuCi08UD4KLUVhY2ggbGluZSBvZiB0aGUgZ3JvdXAgZmlsZSBjb250YWlucyBhIGdyb3VwbmFtZSBmb2xsb3dlZCBieSBhIGNvbG9uLCBmb2xsb3dlZAotYnkgdGhlIG1lbWJlciB1c2VybmFtZXMgc2VwYXJhdGVkIGJ5IHNwYWNlcy4gRXhhbXBsZToKLTxCTE9DS1FVT1RFPjxDT0RFPm15Z3JvdXA6IGJvYiBqb2UgYW5uZTwvQ09ERT48L0JMT0NLUVVPVEU+Ci1Ob3RlIHRoYXQgc2VhcmNoaW5nIGxhcmdlIHRleHQgZmlsZXMgaXMgPEVNPnZlcnk8L0VNPiBpbmVmZmljaWVudDsKLTxBIEhSRUY9Im1vZF9hdXRoX2RibS5odG1sI2F1dGhkYm1ncm91cGZpbGUiPkF1dGhEQk1Hcm91cEZpbGU8L0E+IHNob3VsZAotYmUgdXNlZCBpbnN0ZWFkLjxQPgotCi1TZWN1cml0eTogbWFrZSBzdXJlIHRoYXQgdGhlIEF1dGhHcm91cEZpbGUgaXMgc3RvcmVkIG91dHNpZGUgdGhlCi1kb2N1bWVudCB0cmVlIG9mIHRoZSB3ZWItc2VydmVyOyBkbyA8RU0+bm90PC9FTT4gcHV0IGl0IGluIHRoZSBkaXJlY3RvcnkgdGhhdAotaXQgcHJvdGVjdHMuIE90aGVyd2lzZSwgY2xpZW50cyB3aWxsIGJlIGFibGUgdG8gZG93bmxvYWQgdGhlIEF1dGhHcm91cEZpbGUuPFA+Ci0KLVNlZSBhbHNvIDxBIEhSRUY9ImNvcmUuaHRtbCNhdXRobmFtZSI+QXV0aE5hbWU8L0E+LAotPEEgSFJFRj0iY29yZS5odG1sI2F1dGh0eXBlIj5BdXRoVHlwZTwvQT4gYW5kCi08QSBIUkVGPSIjYXV0aHVzZXJmaWxlIj5BdXRoVXNlckZpbGU8L0E+LjxQPjxIUj4KLQotPEgyPjxBIE5BTUU9ImF1dGh1c2VyZmlsZSI+QXV0aFVzZXJGaWxlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgQXV0aFVzZXJGaWxlfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBBdXRoVXNlckZpbGUgPEVNPmZpbGVuYW1lPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gZGlyZWN0b3J5LCAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBBdXRoQ29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfYXV0aDxQPgotCi1UaGUgQXV0aFVzZXJGaWxlIGRpcmVjdGl2ZSBzZXRzIHRoZSBuYW1lIG9mIGEgdGV4dHVhbCBmaWxlIGNvbnRhaW5pbmcKLXRoZSBsaXN0IG9mIHVzZXJzIGFuZCBwYXNzd29yZHMgZm9yIHVzZXIKLWF1dGhlbnRpY2F0aW9uLiA8RU0+RmlsZW5hbWU8L0VNPiBpcyB0aGUgcGF0aCB0byB0aGUgdXNlcgotZmlsZS4gSWYgaXQgaXMgbm90IGFic29sdXRlICg8RU0+aS5lLjwvRU0+LCBpZiBpdCBkb2Vzbid0IGJlZ2luIHdpdGggYQotc2xhc2gpLCBpdCBpcyB0cmVhdGVkIGFzIHJlbGF0aXZlIHRvIHRoZSBTZXJ2ZXJSb290LgotPFA+IEVhY2ggbGluZSBvZiB0aGUgdXNlciBmaWxlIGZpbGUgY29udGFpbnMgYSB1c2VybmFtZSBmb2xsb3dlZAotYnkgYSBjb2xvbiwgZm9sbG93ZWQgYnkgdGhlIGNyeXB0KCkgZW5jcnlwdGVkIHBhc3N3b3JkLiBUaGUgYmVoYXZpb3IKLW9mIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mIHRoZSBzYW1lIHVzZXIgaXMgdW5kZWZpbmVkLgotPFA+Ci1UaGUgdXRpbGl0eSA8Y29kZT5odHBhc3N3ZDwvY29kZT4gd2hpY2ggaXMgaW5zdGFsbGVkIGFzIHBhcnQgb2YgdGhlCi1iaW5hcnkgZGlzdHJpYnV0aW9uLCBvciB3aGljaCBjYW4gYmUgZm91bmQgaW4gPGNvZGU+c3JjL3N1cHBvcnQ8L2NvZGU+LAotaXMgdXNlZCB0byBtYWludGFpbiB0aGlzIHBhc3N3b3JkIGZpbGUuIFNlZSB0aGUgPGNvZGU+bWFuPC9jb2RlPgotcGFnZSBmb3IgbW9yZSBkZXRhaWxzLiBJbiBzaG9ydAotPHA+Ci08YmxvY2txdW90ZT4KLQk8Y29kZT5odHBhc3N3ZCAtYyBGaWxlbmFtZSB1c2VybmFtZTwvY29kZT48YnI+Ci0JQ3JlYXRlIGEgcGFzc3dvcmQgZmlsZSAnRmlsZW5hbWUnIHdpdGggJ3VzZXJuYW1lJwotCWFzIHRoZSBpbml0aWFsIElELiBJdCB3aWxsIHByb21wdCBmb3IgdGhlIHBhc3N3b3JkLgotCTxjb2RlPmh0cGFzc3dkIEZpbGVuYW1lIHVzZXJuYW1lMjwvY29kZT48YnI+Ci0JQWRkcyBvciBtb2RpZmllcyBpbiBwYXNzd29yZCBmaWxlICdGaWxlbmFtZScgdGhlICd1c2VybmFtZScuCi08L2Jsb2NrcXVvdGU+Ci08UD4gTm90ZSB0aGF0Ci1zZWFyY2hpbmcgbGFyZ2UgdGV4dCBmaWxlcyBpcyA8RU0+dmVyeTwvRU0+IGluZWZmaWNpZW50OwotPEEgSFJFRj0ibW9kX2F1dGhfZGJtLmh0bWwjYXV0aGRibXVzZXJmaWxlIj5BdXRoREJNVXNlckZpbGU8L0E+IHNob3VsZCBiZQotdXNlZCBpbnN0ZWFkLgotPFA+Ci0KLVNlY3VyaXR5OiBtYWtlIHN1cmUgdGhhdCB0aGUgQXV0aFVzZXJGaWxlIGlzIHN0b3JlZCBvdXRzaWRlIHRoZQotZG9jdW1lbnQgdHJlZSBvZiB0aGUgd2ViLXNlcnZlcjsgZG8gPEVNPm5vdDwvRU0+IHB1dCBpdCBpbiB0aGUgZGlyZWN0b3J5IHRoYXQKLWl0IHByb3RlY3RzLiBPdGhlcndpc2UsIGNsaWVudHMgd2lsbCBiZSBhYmxlIHRvIGRvd25sb2FkIHRoZSBBdXRoVXNlckZpbGUuPFA+Ci0KLVNlZSBhbHNvIDxBIEhSRUY9ImNvcmUuaHRtbCNhdXRobmFtZSI+QXV0aE5hbWU8L0E+LAotPEEgSFJFRj0iY29yZS5odG1sI2F1dGh0eXBlIj5BdXRoVHlwZTwvQT4gYW5kCi08QSBIUkVGPSIjYXV0aGdyb3VwZmlsZSI+QXV0aEdyb3VwRmlsZTwvQT4uPFA+Ci08SFI+Ci08SDI+PEEgTkFNRT0iYXV0aGF1dGhvcml0YXRpdmUiPkF1dGhBdXRob3JpdGF0aXZlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgQXV0aEF1dGhvcml0YXRpdmV9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEF1dGhBdXRob3JpdGF0aXZlICZsdDsKLSA8U1RST05HPiBvbjwvU1RST05HPihkZWZhdWx0KSB8IG9mZiAmZ3Q7IDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBkaXJlY3RvcnksIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IEF1dGhDb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9hdXRoPFA+Ci0KLVNldHRpbmcgdGhlIEF1dGhBdXRob3JpdGF0aXZlIGRpcmVjdGl2ZSBleHBsaWNpdGx5IHRvIDxTVFJPTkc+J29mZic8L1NUUk9ORz4KLWFsbG93cyBmb3IgYm90aCBhdXRoZW50aWNhdGlvbiBhbmQgYXV0aG9yaXphdGlvbiB0byBiZSBwYXNzZWQgb24gdG8KLWxvd2VyIGxldmVsIG1vZHVsZXMgKGFzIGRlZmluZWQgaW4gdGhlIDxDT0RFPkNvbmZpZ3VyYXRpb248L0NPREU+IGFuZAotPENPREU+bW9kdWxlcy5jPC9DT0RFPiBmaWxlcykgaWYgdGhlcmUgaXMgPFNUUk9ORz5ubyB1c2VySUQ8L1NUUk9ORz4gb3IKLTxTVFJPTkc+cnVsZTwvU1RST05HPiBtYXRjaGluZyB0aGUgc3VwcGxpZWQgdXNlcklELiBJZiB0aGVyZSBpcyBhIHVzZXJJRCBhbmQvb3IKLXJ1bGUgc3BlY2lmaWVkOyB0aGUgdXN1YWwgcGFzc3dvcmQgYW5kIGFjY2VzcyBjaGVja3Mgd2lsbCBiZSBhcHBsaWVkCi1hbmQgYSBmYWlsdXJlIHdpbGwgZ2l2ZSBhbiBBdXRob3JpemF0aW9uIFJlcXVpcmVkIHJlcGx5LgotCi08UD4KLQotU28gaWYgYSB1c2VySUQgYXBwZWFycyBpbiB0aGUgZGF0YWJhc2Ugb2YgbW9yZSB0aGFuIG9uZSBtb2R1bGU7IG9yIGlmCi1hIHZhbGlkIHJlcXVpcmUgZGlyZWN0aXZlIGFwcGxpZXMgdG8gbW9yZSB0aGFuIG9uZSBtb2R1bGU7IHRoZW4gdGhlCi1maXJzdCBtb2R1bGUgd2lsbCB2ZXJpZnkgdGhlIGNyZWRlbnRpYWxzOyBhbmQgbm8gYWNjZXNzIGlzIHBhc3NlZCBvbjsKLXJlZ2FyZGxlc3Mgb2YgdGhlIEF1dGhBdXRob3JpdGF0aXZlIHNldHRpbmcuCi0KLTxQPgotCi1BIGNvbW1vbiB1c2UgZm9yIHRoaXMgaXMgaW4gY29uanVuY3Rpb24gd2l0aCBvbmUgb2YgdGhlIGRhdGFiYXNlCi1tb2R1bGVzOyBzdWNoIGFzIDxBCi1IUkVGPSJtb2RfYXV0aF9kYi5odG1sIj48Q09ERT5tb2RfYXV0aF9kYi5jPC9DT0RFPjwvQT4sIDxBCi1IUkVGPSJtb2RfYXV0aF9kYm0uaHRtbCI+PENPREU+bW9kX2F1dGhfZGJtLmM8L0NPREU+PC9BPiwgCi08Q09ERT5tb2RfYXV0aF9tc3FsLmM8L0NPREU+LCBhbmQgPEEKLUhSRUY9Im1vZF9hdXRoX2Fub24uaHRtbCI+PENPREU+bW9kX2F1dGhfYW5vbi5jPC9DT0RFPjwvQT4uIFRoZXNlIG1vZHVsZXMKLXN1cHBseSB0aGUgYnVsayBvZiB0aGUgdXNlciBjcmVkZW50aWFsIGNoZWNraW5nOyBidXQgYSBmZXcKLShhZG1pbmlzdHJhdG9yKSByZWxhdGVkIGFjY2Vzc2VzIGZhbGwgdGhyb3VnaCB0byBhIGxvd2VyIGxldmVsIHdpdGggYQotd2VsbCBwcm90ZWN0ZWQgQXV0aFVzZXJGaWxlLgotCi08UD4KLQotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IEJ5IGRlZmF1bHQ7IGNvbnRyb2wgaXMgbm90IHBhc3NlZCBvbjsgYW5kIGFuCi0gdW5rbm93bgotdXNlcklEIG9yIHJ1bGUgd2lsbCByZXN1bHQgaW4gYW4gQXV0aG9yaXphdGlvbiBSZXF1aXJlZCByZXBseS4gTm90Ci1zZXR0aW5nIGl0IHRodXMga2VlcHMgdGhlIHN5c3RlbSBzZWN1cmU7IGFuZCBmb3JjZXMgYW4gTkNTQSBjb21wbGlhbnQKLWJlaGF2aW91ci4KLQotPFA+Ci0KLVNlY3VyaXR5OiBEbyBjb25zaWRlciB0aGUgaW1wbGljYXRpb25zIG9mIGFsbG93aW5nIGEgdXNlciB0byBhbGxvdwotZmFsbC10aHJvdWdoIGluIGhpcyAuaHRhY2Nlc3MgZmlsZTsgYW5kIHZlcmlmeSB0aGF0IHRoaXMgaXMgcmVhbGx5Ci13aGF0IHlvdSB3YW50OyBHZW5lcmFsbHkgaXQgaXMgZWFzaWVyIHRvIGp1c3Qgc2VjdXJlIGEgc2luZ2xlCi0uaHRwYXNzd2QgZmlsZSwgdGhhbiBpdCBpcyB0byBzZWN1cmUgYSBkYXRhYmFzZSBzdWNoIGFzIG1TUUwuIE1ha2UKLXN1cmUgdGhhdCB0aGUgQXV0aFVzZXJGaWxlIGlzIHN0b3JlZCBvdXRzaWRlIHRoZSBkb2N1bWVudCB0cmVlIG9mIHRoZQotd2ViLXNlcnZlcjsgZG8gPEVNPm5vdDwvRU0+IHB1dCBpdCBpbiB0aGUgZGlyZWN0b3J5IHRoYXQgaXQKLXByb3RlY3RzLiBPdGhlcndpc2UsIGNsaWVudHMgd2lsbCBiZSBhYmxlIHRvIGRvd25sb2FkIHRoZQotQXV0aFVzZXJGaWxlLgotCi08UD4KLVNlZSBhbHNvIDxBIEhSRUY9ImNvcmUuaHRtbCNhdXRobmFtZSI+QXV0aE5hbWU8L0E+LAotPEEgSFJFRj0iY29yZS5odG1sI2F1dGh0eXBlIj5BdXRoVHlwZTwvQT4gYW5kCi08QSBIUkVGPSIjYXV0aGdyb3VwZmlsZSI+QXV0aEdyb3VwRmlsZTwvQT4uPFA+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfYXV0aF9hbm9uLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2F1dGhfYW5vbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDcwOGNiLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfYXV0aF9hbm9uLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMTcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9hdXRoX2Fub24uYzwvVElUTEU+Ci08L0hFQUQ+Ci08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5Nb2R1bGUgbW9kX2F1dGhfYW5vbjwvSDE+Ci0KLVRoaXMgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbiB0aGUgPENPREU+bW9kX2F1dGhfYW5vbi5jPC9DT0RFPiBmaWxlIGFuZAotaXMgbm90IGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuIEl0IGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZSAxLjEgYW5kCi1sYXRlci4gSXQgYWxsb3dzICJhbm9ueW1vdXMiIHVzZXIgYWNjZXNzIHRvIGF1dGhlbnRpY2F0ZWQgYXJlYXMuCi0KLTxIMj5TdW1tYXJ5PC9IMj4KLQotSXQgZG9lcyBhY2Nlc3MgY29udHJvbCBpbiBhIG1hbm5lciBzaW1pbGFyIHRvIGFub255bW91cy1mdHAgc2l0ZXM7IDxFTT5pLmUuPC9FTT4KLWhhdmUgYSAnbWFnaWMnIHVzZXIgaWQgJ2Fub255bW91cycgYW5kIHRoZSBlbWFpbCBhZGRyZXNzIGFzIGEgcGFzc3dvcmQuCi1UaGVzZSBlbWFpbCBhZGRyZXNzZXMgY2FuIGJlIGxvZ2dlZC4KLTxQPgotQ29tYmluZWQgd2l0aCBvdGhlciAoZGF0YWJhc2UpIGFjY2VzcyBjb250cm9sIG1ldGhvZHMsIHRoaXMgYWxsb3dzIGZvcgotZWZmZWN0aXZlIHVzZXIgdHJhY2tpbmcgYW5kIGN1c3RvbWl6YXRpb24gYWNjb3JkaW5nIHRvIGEgdXNlciBwcm9maWxlCi13aGlsZSBzdGlsbCBrZWVwaW5nIHRoZSBzaXRlIG9wZW4gZm9yICd1bnJlZ2lzdGVyZWQnIHVzZXJzLiBPbmUgYWR2YW50YWdlCi1vZiB1c2luZyBBdXRoLWJhc2VkIHVzZXIgdHJhY2tpbmcgaXMgdGhhdCwgdW5saWtlIG1hZ2ljLWNvb2tpZXMgYW5kCi1mdW5ueSBVUkwgcHJlL3Bvc3RmaXhlcywgaXQgaXMgY29tcGxldGVseSBicm93c2VyIGluZGVwZW5kZW50IGFuZCBpdAotYWxsb3dzIHVzZXJzIHRvIHNoYXJlIFVSTHMuCi08UD4KLQotPEEgSFJFRj0iI0RpcmVjdGl2ZXMiPkRpcmVjdGl2ZXM8L0E+IC8KLTxBIEhSRUY9IiNFeGFtcGxlIj5FeGFtcGxlPC9BPiAvCi08QSBIUkVGPSIjQ29tcGlsZVRpbWVPcHRpb25zIj5Db21waWxlIHRpbWUgb3B0aW9uczwvQT4gLwotPFA+Ci0KLTxIMj48QSBOQU1FPSJEaXJlY3RpdmVzIj5EaXJlY3RpdmVzPC9BPjwvSDI+Ci08VUw+Ci08TEk+PEEgSFJFRj0iI2Fub255bW91cyI+QW5vbnltb3VzPC9BPgotPExJPjxBIEhSRUY9IiNBdXRob3JpdGF0aXZlIj5Bbm9ueW1vdXNfQXV0aG9yaXRhdGl2ZTwvQT4KLTxMST48QSBIUkVGPSIjTG9nRW1haWwiPkFub255bW91c19Mb2dFbWFpbDwvQT4KLTxMST48QSBIUkVGPSIjTXVzdEdpdmVFbWFpbCI+QW5vbnltb3VzX011c3RHaXZlRW1haWw8L0E+Ci08TEk+PEEgSFJFRj0iI05vVXNlcklEIj5Bbm9ueW1vdXNfTm9Vc2VySUQ8L0E+Ci08TEk+PEEgSFJFRj0iI1ZlcmlmeUVtYWlsIj5Bbm9ueW1vdXNfVmVyaWZ5RW1haWw8L0E+Ci08L1VMPgotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJhbm9ueW1vdXMiPkFub255bW91cyBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBBbm9ueW1vdXN9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEFub255bW91cyA8RU0+dXNlciB1c2VyIC4uLjwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IG5vbmU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gZGlyZWN0b3J5LCAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBBdXRoQ29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBFeHRlbnNpb248QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9hdXRoX2Fub248UD4KLQotICAgICAgICBBIGxpc3Qgb2Ygb25lIG9yIG1vcmUgJ21hZ2ljJyB1c2VySURzIHdoaWNoIGFyZSBhbGxvd2VkIGFjY2VzcwotICAgICAgICB3aXRob3V0IHBhc3N3b3JkIHZlcmlmaWNhdGlvbi4gVGhlIHVzZXJJRHMgYXJlIHNwYWNlIHNlcGFyYXRlZC4KLSAgICAgICAgSXQgaXMgcG9zc2libGUgdG8gdXNlIHRoZSAnIGFuZCAiIHF1b3RlcyB0byBhbGxvdyBhIHNwYWNlIGluCi0gICAgICAgIGEgdXNlcklEIGFzIHdlbGwgYXMgdGhlIFwgZXNjYXBlIGNoYXJhY3Rlci4KLSAgICAgICAgPFA+Ci0gICAgICAgIFBsZWFzZSBub3RlIHRoYXQgdGhlIGNvbXBhcmlzb24gaXMgPFNUUk9ORz5jYXNlLUlOLXNlbnNpdGl2ZTwvU1RST05HPi4KLSAgICAgICAgPEJSPgotICAgICAgICBJIHN0cm9uZ2x5IHN1Z2dlc3QgdGhhdCB0aGUgbWFnaWMgdXNlcm5hbWUgJzxDT0RFPmFub255bW91czwvQ09ERT4nCi0gICAgICAgIGlzIGFsd2F5cyBvbmUgb2YgdGhlIGFsbG93ZWQgdXNlcklEcy4KLSAgICAgICAgPFA+Ci0gICAgICAgIEV4YW1wbGU6PEJSPgotICAgICAgICA8Q09ERT4KLSAgICAgICAgQW5vbnltb3VzIGFub255bW91cyAiTm90IFJlZ2lzdGVyZWQiICdJIGRvblwndCBrbm93JwotICAgICAgICA8L0NPREU+PFA+Ci0gICAgICAgIFRoaXMgd291bGQgYWxsb3cgdGhlIHVzZXIgdG8gZW50ZXIgd2l0aG91dCBwYXNzd29yZCB2ZXJpZmljYXRpb24KLSAgICAgICAgYnkgdXNpbmcgdGhlIHVzZXJJZCdzICdhbm9ueW1vdXMnLCAnQW5vbnlNb3VzJywnTm90IFJlZ2lzdGVyZWQnIGFuZAotICAgICAgICAnSSBEb24ndCBLbm93Jy4KLTxIUj4KLQotPEgyPjxBIE5BTUU9IkF1dGhvcml0YXRpdmUiPkFub255bW91c19BdXRob3JpdGF0aXZlIGRpcmVjdGl2ZTwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBBbm9ueW1vdXNfQXV0aG9yaXRhdGl2ZSA8RU0+b24gfCBvZmY8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5Bbm9ueW1vdXNfQXV0aG9yaXRhdGl2ZSBvZmY8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IGRpcmVjdG9yeSwgLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gQXV0aENvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gRXh0ZW5zaW9uPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfYXV0aF9hbm9uPFA+Ci0KLSAgICAgICAgV2hlbiBzZXQgJ29uJywgdGhlcmUgaXMgbm8KLSAgICAgICAgZmFsbC10aHJvdWdoIHRvIG90aGVyIGF1dGhvcml6YXRpb24gbWV0aG9kcy4gU28gaWYgYQotICAgICAgICB1c2VySUQgZG9lcyBub3QgbWF0Y2ggdGhlIHZhbHVlcyBzcGVjaWZpZWQgaW4gdGhlCi0gICAgICAgIDxDT0RFPkFub255bW91czwvQ09ERT4gZGlyZWN0aXZlLCBhY2Nlc3MgaXMgZGVuaWVkLgotICAgICAgICA8UD4KLSAgICAgICAgQmUgc3VyZSB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcgd2hlbiB5b3UgZGVjaWRlIHRvIHN3aXRjaAotICAgICAgICBpdCBvbi4gQW5kIHJlbWVtYmVyIHRoYXQgaXQgaXMgdGhlIGxpbmtpbmcgb3JkZXIgb2YgdGhlIG1vZHVsZXMKLSAgICAgICAgKGluIHRoZSBDb25maWd1cmF0aW9uIC8gTWFrZSBmaWxlKSB3aGljaCBkZXRhaWxzIHRoZSBvcmRlcgotICAgICAgICBpbiB3aGljaCB0aGUgQXV0aG9yaXphdGlvbiBtb2R1bGVzIGFyZSBxdWVyaWVkLgotPEhSPgotCi08SDI+PEEgTkFNRT0iTG9nRW1haWwiPkFub255bW91c19Mb2dFbWFpbCBkaXJlY3RpdmU8L0E+PC9IMj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQW5vbnltb3VzX0xvZ0VtYWlsIDxFTT5vbiB8IG9mZjwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPkFub255bW91c19Mb2dFbWFpbCBvbjwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gZGlyZWN0b3J5LCAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBBdXRoQ29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBFeHRlbnNpb248QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9hdXRoX2Fub248UD4KLQotICAgICAgICBXaGVuIHNldCAnb24nLCB0aGUgZGVmYXVsdCwgdGhlICdwYXNzd29yZCcgZW50ZXJlZCAod2hpY2ggaG9wZWZ1bGx5Ci0gICAgICAgIGNvbnRhaW5zIGEgc2Vuc2libGUgZW1haWwgYWRkcmVzcykgaXMgbG9nZ2VkIGluIHRoZSBlcnJvciBsb2cuCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJNdXN0R2l2ZUVtYWlsIj5Bbm9ueW1vdXNfTXVzdEdpdmVFbWFpbCBkaXJlY3RpdmU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBBbm9ueW1vdXNfTXVzdEdpdmVFbWFpbH0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQW5vbnltb3VzX011c3RHaXZlRW1haWwgPEVNPm9uPC9FTT4KLSB8IDxFTT5vZmY8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5Bbm9ueW1vdXNfTXVzdEdpdmVFbWFpbCBvbjwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gZGlyZWN0b3J5LCAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBBdXRoQ29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBFeHRlbnNpb248QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9hdXRoX2Fub248UD4KLQotICAgICAgICBTcGVjaWZpZXMgd2hldGhlciB0aGUgdXNlciBtdXN0IHNwZWNpZnkgYW4gZW1haWwKLSAgICAgICAgYWRkcmVzcyBhcyB0aGUgcGFzc3dvcmQuICBUaGlzIHByb2hpYml0cyBibGFuayBwYXNzd29yZHMuCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJOb1VzZXJJRCI+QW5vbnltb3VzX05vVXNlcklEIGRpcmVjdGl2ZTwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBBbm9ueW1vdXNfTm9Vc2VySUQgPEVNPm9uIHwgb2ZmPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+QW5vbnltb3VzX05vVXNlcklEIG9mZjwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gZGlyZWN0b3J5LCAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBBdXRoQ29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBFeHRlbnNpb248QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9hdXRoX2Fub248UD4KLQotICAgICAgICBXaGVuIHNldCAnb24nLCB1c2VycyBjYW4gbGVhdmUKLSAgICAgICAgdGhlIHVzZXJJRCAoYW5kIHBlcmhhcHMgdGhlIHBhc3N3b3JkIGZpZWxkKSBlbXB0eS4gVGhpcwotICAgICAgICBjYW4gYmUgdmVyeSBjb252ZW5pZW50IGZvciBNUy1FeHBsb3JlciB1c2VycyB3aG8gY2FuCi0gICAgICAgIGp1c3QgaGl0IHJldHVybiBvciBjbGljayBkaXJlY3RseSBvbiB0aGUgT0sgYnV0dG9uOyB3aGljaAotICAgICAgICBzZWVtcyBhIG5hdHVyYWwgcmVhY3Rpb24uCi0KLTxIUj4KLQotPEgyPjxBIE5BTUU9IlZlcmlmeUVtYWlsIj5Bbm9ueW1vdXNfVmVyaWZ5RW1haWwgZGlyZWN0aXZlPC9BPjwvSDI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEFub255bW91c19WZXJpZnlFbWFpbCA8RU0+b24gfCBvZmY8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5Bbm9ueW1vdXNfVmVyaWZ5RW1haWwgb2ZmPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBkaXJlY3RvcnksIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IEF1dGhDb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEV4dGVuc2lvbjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2F1dGhfYW5vbjxQPgotCi0gICAgICAgIFdoZW4gc2V0ICdvbicgdGhlICdwYXNzd29yZCcgZW50ZXJlZCBpcwotICAgICAgICBjaGVja2VkIGZvciBhdCBsZWFzdCBvbmUgJ0AnIGFuZCBhICcuJyB0byBlbmNvdXJhZ2UgdXNlcnMgdG8gZW50ZXIKLSAgICAgICAgdmFsaWQgZW1haWwgYWRkcmVzc2VzIChzZWUgdGhlIGFib3ZlIDxDT0RFPkF1dGhfTG9nRW1haWw8L0NPREU+KS4KLQotPEhSPgotPEgyPjxBIE5BTUU9IkV4YW1wbGUiPkV4YW1wbGU8L0E+PC9IMj4KLQotVGhlIGV4YW1wbGUgYmVsb3cgKHdoZW4gY29tYmluZWQgd2l0aCB0aGUgQXV0aCBkaXJlY3RpdmVzCi1vZiBhIGh0cGFzc3dkLWZpbGUgYmFzZWQgKG9yIEdETSwgbVNRTCA8RU0+ZXRjLjwvRU0+KSBiYXNlIGFjY2VzcwotY29udHJvbCBzeXN0ZW0gYWxsb3dzIHVzZXJzIGluIGFzICdndWVzdHMnIHdpdGggdGhlCi1mb2xsb3dpbmcgcHJvcGVydGllczoKLTxVTD4KLTxMST4KLUl0IGluc2lzdHMgdGhhdCB0aGUgdXNlciBlbnRlcnMgYSB1c2VySWQuICg8Q09ERT5Bbm9ueW1vdXNfTm9Vc2VySWQ8L0NPREU+KQotPExJPgotSXQgaW5zaXN0cyB0aGF0IHRoZSB1c2VyIGVudGVycyBhIHBhc3N3b3JkLgotKDxDT0RFPkFub255bW91c19NdXN0R2l2ZUVtYWlsPC9DT0RFPikKLTxMST4KLVRoZSBwYXNzd29yZCBlbnRlcmVkIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLCBpZS4gY29udGFpbiBhdCBsZWFzdCBvbmUKLSdAJyBhbmQgYSAnLicuICg8Q09ERT5Bbm9ueW1vdXNfVmVyaWZ5RW1haWw8L0NPREU+KQotPExJPgotVGhlIHVzZXJJRCBtdXN0IGJlIG9uZSBvZiA8Q09ERT5hbm9ueW1vdXMgZ3Vlc3Qgd3d3IHRlc3Qgd2VsY29tZTwvQ09ERT4KLWFuZCBjb21wYXJpc29uIGlzIDxTVFJPTkc+bm90PC9TVFJPTkc+IGNhc2Ugc2Vuc2l0aXZlLgotPExJPgotQW5kIHRoZSBFbWFpbCBhZGRyZXNzZXMgZW50ZXJlZCBpbiB0aGUgcGFzc3dkIGZpZWxkIGFyZSBsb2dnZWQgdG8KLXRoZSBlcnJvciBsb2cgZmlsZQotKDxDT0RFPkFub255bW91c19Mb2dFbWFpbDwvQ09ERT4pCi08L1VMPgotPFA+Ci1FeGNlcnB0IG9mIGFjY2Vzcy5jb25mOgotPEJMT0NLUVVPVEU+PENPREU+Ci1Bbm9ueW1vdXNfTm9Vc2VySWQgICAgICBvZmY8QlI+Ci1Bbm9ueW1vdXNfTXVzdEdpdmVFbWFpbCBvbjxCUj4KLUFub255bW91c19WZXJpZnlFbWFpbCAgICBvbjxCUj4KLUFub255bW91c19Mb2dFbWFpbCAgICAgIG9uPEJSPgotQW5vbnltb3VzICAgICAgICBhbm9ueW1vdXMgZ3Vlc3Qgd3d3IHRlc3Qgd2VsY29tZTxQPgotPFA+Ci1BdXRoTmFtZSAgICAgICAgICAgICAgICAiVXNlICdhbm9ueW1vdXMnICZhbXA7IEVtYWlsIGFkZHJlc3MgZm9yIGd1ZXN0IGVudHJ5IjxCUj4KLUF1dGhUeXBlICAgICAgICAgICAgICAgIGJhc2ljCi08UD4KLSMgQW4gQXV0aFVzZXJGaWxlL0F1dGhEQlVzZXJGaWxlL0F1dGhEQk1Vc2VyRmlsZTxCUj4KLSMgZGlyZWN0aXZlIG11c3QgYmUgc3BlY2lmaWVkLCBvciB1c2U8QlI+Ci0jIEFub255bW91c19BdXRob3JpdGF0aXZlIGZvciBwdWJsaWMgYWNjZXNzLjxCUj4KLSMgSW4gdGhlIC5odGFjY2VzcyBmb3IgdGhlIHB1YmxpYyBkaXJlY3RvcnksIGFkZDo8QlI+Ci0mbHQ7RmlsZXMgKiZndDs8QlI+Ci1vcmRlciBkZW55LGFsbG93ICAgICAgICAgIDxCUj4KLWFsbG93IGZyb20gYWxsICAgICAgICAgICAgPEJSPgotPFA+Ci1yZXF1aXJlIHZhbGlkLXVzZXIgICAgICAgIDxCUj4KLSZsdDsvRmlsZXMmZ3Q7PEJSPgotPC9DT0RFPjwvQkxPQ0tRVU9URT4KLQotPEhSPgotPEgyPjxBIE5BTUU9IkNvbXBpbGVUaW1lT3B0aW9ucyI+Q29tcGlsZSBUaW1lIE9wdGlvbnM8L0E+PC9IMj4KLQotQ3VycmVudGx5IHRoZXJlIGFyZSBubyBDb21waWxlIG9wdGlvbnMuCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfYXV0aF9kYi5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9hdXRoX2RiLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZjMxYmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9hdXRoX2RiLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9hdXRoX2RiPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+TW9kdWxlIG1vZF9hdXRoX2RiPC9IMT4KLQotVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Q09ERT5tb2RfYXV0aF9kYi5jPC9DT0RFPiBmaWxlLCBhbmQKLWlzIG5vdCBjb21waWxlZCBpbiBieSBkZWZhdWx0LiBJdCBwcm92aWRlcyBmb3IgdXNlciBhdXRoZW50aWNhdGlvbiB1c2luZwotQmVya2VsZXkgREIgZmlsZXMuIEl0IGlzIGFuIGFsdGVybmF0aXZlIHRvIDxBIEhSRUY9Im1vZF9hdXRoX2RibS5odG1sIj5EQk08L0E+Ci1maWxlcyBmb3IgdGhvc2Ugc3lzdGVtcyB3aGljaCBzdXBwb3J0IERCIGFuZCBub3QgREJNLiBJdCBpcyBvbmx5Ci1hdmFpbGFibGUgaW4gQXBhY2hlIDEuMSBhbmQgbGF0ZXIuCi0KLTxQPgotT24gc29tZSBCU0Qgc3lzdGVtcyAoPEVNPmUuZy48L0VNPiwgRnJlZUJTRCBhbmQgTmV0QlNEKSBkYm0gaXMgYXV0b21hdGljYWxseSBtYXBwZWQgdG8KLUJlcmtlbGV5IERCLiBZb3UgY2FuIHVzZSBlaXRoZXIgPEEgSFJFRj0ibW9kX2F1dGhfZGJtLmh0bWwiPm1vZF9hdXRoX2RibTwvQT4KLW9yIG1vZF9hdXRoX2RiLiBUaGUgbGF0dGVyIG1ha2VzIGl0IG1vcmUgb2J2aW91cyB0aGF0IGl0J3MgQmVya2VsZXkgREIuICBPbgotb3RoZXIgcGxhdGZvcm1zIHdoZXJlIHlvdSB3YW50IHRvIHVzZSB0aGUgREIgbGlicmFyeSB5b3UgdXN1YWxseSBoYXZlIHRvCi1pbnN0YWxsIGl0IGZpcnN0LiBTZWUgCi08QSBIUkVGPSJodHRwOi8vd3d3LnNsZWVweWNhdC5jb20vIj5odHRwOi8vd3d3LnNsZWVweWNhdC5jb20vPC9BPiBmb3IgdGhlCi1kaXN0cmlidXRpb24uIFRoZSBpbnRlcmZhY2UgdGhpcyBtb2R1bGUgdXNlcyBpcyB0aGUgb25lIGZyb20gREIgdmVyc2lvbiAxLjg1Ci1hbmQgMS44NiwgYnV0IERCIHZlcnNpb24gMi54IGNhbiBhbHNvIGJlIHVzZWQgd2hlbiBjb21wYXRpYmlsaXR5IG1vZGUgaXMKLWVuYWJsZWQuCi0KLTxNRU5VPgotPExJPjxBIEhSRUY9IiNhdXRoZGJncm91cGZpbGUiPkF1dGhEQkdyb3VwRmlsZTwvQT4KLTxMST48QSBIUkVGPSIjYXV0aGRidXNlcmZpbGUiPkF1dGhEQlVzZXJGaWxlPC9BPgotPExJPjxBIEhSRUY9IiNhdXRoZGJhdXRob3JpdGF0aXZlIj5BdXRoREJBdXRob3JpdGF0aXZlPC9BPgotPC9NRU5VPgotPEhSPgotCi0KLTxIMj48QSBOQU1FPSJhdXRoZGJncm91cGZpbGUiPkF1dGhEQkdyb3VwRmlsZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEF1dGhEQkdyb3VwRmlsZX0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQXV0aERCR3JvdXBGaWxlIDxFTT5maWxlbmFtZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IGRpcmVjdG9yeSwgLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gQXV0aENvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gRXh0ZW5zaW9uPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfYXV0aF9kYjxQPgotCi1UaGUgQXV0aERCR3JvdXBGaWxlIGRpcmVjdGl2ZSBzZXRzIHRoZSBuYW1lIG9mIGEgREIgZmlsZSBjb250YWluaW5nIHRoZSBsaXN0Ci1vZiB1c2VyIGdyb3VwcyBmb3IgdXNlciBhdXRoZW50aWNhdGlvbi4gPEVNPkZpbGVuYW1lPC9FTT4gaXMgdGhlIGFic29sdXRlIHBhdGgKLXRvIHRoZSBncm91cCBmaWxlLjxQPgotCi1UaGUgZ3JvdXAgZmlsZSBpcyBrZXllZCBvbiB0aGUgdXNlcm5hbWUuIFRoZSB2YWx1ZSBmb3IgYSB1c2VyIGlzIGEKLWNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBncm91cHMgdG8gd2hpY2ggdGhlIHVzZXJzIGJlbG9uZ3MuIFRoZXJlIG11c3QKLWJlIG5vIHdoaXRlc3BhY2Ugd2l0aGluIHRoZSB2YWx1ZSwgYW5kIGl0IG11c3QgbmV2ZXIgY29udGFpbiBhbnkgY29sb25zLjxQPgotCi1TZWN1cml0eTogbWFrZSBzdXJlIHRoYXQgdGhlIEF1dGhEQkdyb3VwRmlsZSBpcyBzdG9yZWQgb3V0c2lkZSB0aGUKLWRvY3VtZW50IHRyZWUgb2YgdGhlIHdlYi1zZXJ2ZXI7IGRvIDxFTT5ub3Q8L0VNPiBwdXQgaXQgaW4gdGhlIGRpcmVjdG9yeSB0aGF0Ci1pdCBwcm90ZWN0cy4gT3RoZXJ3aXNlLCBjbGllbnRzIHdpbGwgYmUgYWJsZSB0byBkb3dubG9hZCB0aGUKLUF1dGhEQkdyb3VwRmlsZSB1bmxlc3Mgb3RoZXJ3aXNlIHByb3RlY3RlZC48UD4KLQotQ29tYmluaW5nIEdyb3VwIGFuZCBQYXNzd29yZCBEQiBmaWxlczogSW4gc29tZSBjYXNlcyBpdCBpcyBlYXNpZXIgdG8KLW1hbmFnZSBhIHNpbmdsZSBkYXRhYmFzZSB3aGljaCBjb250YWlucyBib3RoIHRoZSBwYXNzd29yZCBhbmQgZ3JvdXAKLWRldGFpbHMgZm9yIGVhY2ggdXNlci4gVGhpcyBzaW1wbGlmaWVzIGFueSBzdXBwb3J0IHByb2dyYW1zIHRoYXQgbmVlZAotdG8gYmUgd3JpdHRlbjogdGhleSBub3cgb25seSBoYXZlIHRvIGRlYWwgd2l0aCB3cml0aW5nIHRvIGFuZCBsb2NraW5nCi1hIHNpbmdsZSBEQk0gZmlsZS4gVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IGZpcnN0IHNldHRpbmcgdGhlIGdyb3VwCi1hbmQgcGFzc3dvcmQgZmlsZXMgdG8gcG9pbnQgdG8gdGhlIHNhbWUgREIgZmlsZTo8UD4KLQotPEJMT0NLUVVPVEU+PENPREU+Ci1BdXRoREJHcm91cEZpbGUgL3d3dy91c2VyYmFzZTxCUj4KLUF1dGhEQlVzZXJGaWxlIC93d3cvdXNlcmJhc2UKLTwvQ09ERT48L0JMT0NLUVVPVEU+Ci0KLVRoZSBrZXkgZm9yIHRoZSBzaW5nbGUgREIgcmVjb3JkIGlzIHRoZSB1c2VybmFtZS4gVGhlIHZhbHVlIGNvbnNpc3RzIG9mIDxQPgotCi08QkxPQ0tRVU9URT48Q09ERT4KLVVuaXggQ3J5cHQtZWQgUGFzc3dvcmQgOiBMaXN0IG9mIEdyb3VwcyBbIDogKGlnbm9yZWQpIF0KLTwvQ09ERT48L0JMT0NLUVVPVEU+Ci0KLVRoZSBwYXNzd29yZCBzZWN0aW9uIGNvbnRhaW5zIHRoZSBVbml4IGNyeXB0KCkgcGFzc3dvcmQgYXMgYmVmb3JlLiBUaGlzIGlzCi1mb2xsb3dlZCBieSBhIGNvbG9uIGFuZCB0aGUgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZ3JvdXBzLiBPdGhlciBkYXRhIG1heQotb3B0aW9uYWxseSBiZSBsZWZ0IGluIHRoZSBEQiBmaWxlIGFmdGVyIGFub3RoZXIgY29sb247IGl0IGlzIGlnbm9yZWQgYnkgdGhlCi1hdXRoZW50aWNhdGlvbiBtb2R1bGUuIDxQPgotCi1TZWUgYWxzbyA8QSBIUkVGPSJjb3JlLmh0bWwjYXV0aG5hbWUiPkF1dGhOYW1lPC9BPiwKLTxBIEhSRUY9ImNvcmUuaHRtbCNhdXRodHlwZSI+QXV0aFR5cGU8L0E+IGFuZAotPEEgSFJFRj0iI2F1dGhkYnVzZXJmaWxlIj5BdXRoREJVc2VyRmlsZTwvQT4uPFA+PEhSPgotCi08SDI+PEEgTkFNRT0iYXV0aGRidXNlcmZpbGUiPkF1dGhEQlVzZXJGaWxlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgQXV0aERCVXNlckZpbGV9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEF1dGhEQlVzZXJGaWxlIDxFTT5maWxlbmFtZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IGRpcmVjdG9yeSwgLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gQXV0aENvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gRXh0ZW5zaW9uPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfYXV0aF9kYjxQPgotCi1UaGUgQXV0aERCVXNlckZpbGUgZGlyZWN0aXZlIHNldHMgdGhlIG5hbWUgb2YgYSBEQiBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpc3QKLW9mIHVzZXJzIGFuZCBwYXNzd29yZHMgZm9yIHVzZXIgYXV0aGVudGljYXRpb24uIDxFTT5GaWxlbmFtZTwvRU0+IGlzIHRoZQotYWJzb2x1dGUgcGF0aCB0byB0aGUgdXNlciBmaWxlLjxQPgotCi1UaGUgdXNlciBmaWxlIGlzIGtleWVkIG9uIHRoZSB1c2VybmFtZS4gVGhlIHZhbHVlIGZvciBhIHVzZXIgaXMgdGhlCi1jcnlwdCgpIGVuY3J5cHRlZCBwYXNzd29yZCwgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIGNvbG9uIGFuZAotYXJiaXRyYXJ5IGRhdGEuICBUaGUgY29sb24gYW5kIHRoZSBkYXRhIGZvbGxvd2luZyBpdCB3aWxsIGJlIGlnbm9yZWQKLWJ5IHRoZSBzZXJ2ZXIuPFA+Ci0KLVNlY3VyaXR5OiBtYWtlIHN1cmUgdGhhdCB0aGUgQXV0aERCVXNlckZpbGUgaXMgc3RvcmVkIG91dHNpZGUgdGhlCi1kb2N1bWVudCB0cmVlIG9mIHRoZSB3ZWItc2VydmVyOyBkbyA8RU0+bm90PC9FTT4gcHV0IGl0IGluIHRoZSBkaXJlY3RvcnkgdGhhdAotaXQgcHJvdGVjdHMuIE90aGVyd2lzZSwgY2xpZW50cyB3aWxsIGJlIGFibGUgdG8gZG93bmxvYWQgdGhlCi1BdXRoREJVc2VyRmlsZS48UD4KLQotSW1wb3J0YW50IGNvbXBhdGliaWxpdHkgbm90ZTogVGhlIGltcGxlbWVudGF0aW9uIG9mICJkYm1vcGVuIiBpbiB0aGUKLWFwYWNoZSBtb2R1bGVzIHJlYWRzIHRoZSBzdHJpbmcgbGVuZ3RoIG9mIHRoZSBoYXNoZWQgdmFsdWVzIGZyb20gdGhlCi1EQiBkYXRhIHN0cnVjdHVyZXMsIHJhdGhlciB0aGFuIHJlbHlpbmcgdXBvbiB0aGUgc3RyaW5nIGJlaW5nCi1OVUxMLWFwcGVuZGVkLiBTb21lIGFwcGxpY2F0aW9ucywgc3VjaCBhcyB0aGUgTmV0c2NhcGUgd2ViIHNlcnZlciwKLXJlbHkgdXBvbiB0aGUgc3RyaW5nIGJlaW5nIE5VTEwtYXBwZW5kZWQsIHNvIGlmIHlvdSBhcmUgaGF2aW5nIHRyb3VibGUKLXVzaW5nIERCIGZpbGVzIGludGVyY2hhbmdlYWJseSBiZXR3ZWVuIGFwcGxpY2F0aW9ucyB0aGlzIG1heSBiZSBhCi1wYXJ0IG9mIHRoZSBwcm9ibGVtLiA8UD4KLQotU2VlIGFsc28gPEEgSFJFRj0iY29yZS5odG1sI2F1dGhuYW1lIj5BdXRoTmFtZTwvQT4sCi08QSBIUkVGPSJjb3JlLmh0bWwjYXV0aHR5cGUiPkF1dGhUeXBlPC9BPiBhbmQKLTxBIEhSRUY9IiNhdXRoZGJncm91cGZpbGUiPkF1dGhEQkdyb3VwRmlsZTwvQT4uPFA+Ci08SFI+Ci08SDI+PEEgTkFNRT0iYXV0aGRiYXV0aG9yaXRhdGl2ZSI+QXV0aERCQXV0aG9yaXRhdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEF1dGhEQkF1dGhvcml0YXRpdmV9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEF1dGhEQkF1dGhvcml0YXRpdmUgJmx0OwotIDxTVFJPTkc+IG9uPC9TVFJPTkc+KGRlZmF1bHQpIHwgb2ZmICZndDsgPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IGRpcmVjdG9yeSwgLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gQXV0aENvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2F1dGg8UD4KLQotU2V0dGluZyB0aGUgQXV0aERCQXV0aG9yaXRhdGl2ZSBkaXJlY3RpdmUgZXhwbGljaXRseSB0byA8U1RST05HPidvZmYnPC9TVFJPTkc+Ci1hbGxvd3MgZm9yIGJvdGggYXV0aGVudGljYXRpb24gYW5kIGF1dGhvcml6YXRpb24gdG8gYmUgcGFzc2VkIG9uCi10byBsb3dlciBsZXZlbCBtb2R1bGVzIChhcyBkZWZpbmVkIGluIHRoZSA8Q09ERT5Db25maWd1cmF0aW9uPC9DT0RFPgotYW5kIDxDT0RFPm1vZHVsZXMuYzwvQ09ERT4gZmlsZSBpZiB0aGVyZSBpcyA8U1RST05HPm5vIHVzZXJJRDwvU1RST05HPiBvcgotPFNUUk9ORz5ydWxlPC9TVFJPTkc+IG1hdGNoaW5nIHRoZSBzdXBwbGllZCB1c2VySUQuIElmIHRoZXJlIGlzIGEgdXNlcklECi1hbmQvb3IgcnVsZSBzcGVjaWZpZWQ7IHRoZSB1c3VhbCBwYXNzd29yZCBhbmQgYWNjZXNzIGNoZWNrcyB3aWxsCi1iZSBhcHBsaWVkIGFuZCBhIGZhaWx1cmUgd2lsbCBnaXZlIGFuIEF1dGhvcml6YXRpb24gUmVxdWlyZWQgcmVwbHkuCi08UD4KLVNvIGlmIGEgdXNlcklEIGFwcGVhcnMgaW4gdGhlIGRhdGFiYXNlIG9mIG1vcmUgdGhhbiBvbmUgbW9kdWxlOyBvcgotaWYgYSB2YWxpZCByZXF1aXJlIGRpcmVjdGl2ZSBhcHBsaWVzIHRvIG1vcmUgdGhhbiBvbmUgbW9kdWxlOyB0aGVuCi10aGUgZmlyc3QgbW9kdWxlIHdpbGwgdmVyaWZ5IHRoZSBjcmVkZW50aWFsczsgYW5kIG5vIGFjY2VzcyBpcwotcGFzc2VkIG9uOyByZWdhcmRsZXNzIG9mIHRoZSBBdXRoQXV0aG9yaXRhdGl2ZSBzZXR0aW5nLiAgPFA+Ci0KLUEgY29tbW9uIHVzZSBmb3IgdGhpcyBpcyBpbiBjb25qdW5jdGlvbiB3aXRoIG9uZSBvZiB0aGUgYmFzaWMgYXV0aAotbW9kdWxlczsgc3VjaCBhcyA8QSBIUkVGPSJtb2RfYXV0aC5odG1sIj48Q09ERT5tb2RfYXV0aC5jPC9DT0RFPjwvQT4uCi1XaGVyZWFzIHRoaXMgREIgbW9kdWxlIHN1cHBsaWVzIHRoZSBidWxrIG9mIHRoZSB1c2VyIGNyZWRlbnRpYWwKLWNoZWNraW5nOyBhIGZldyAoYWRtaW5pc3RyYXRvcikgcmVsYXRlZCBhY2Nlc3NlcyBmYWxsIHRocm91Z2ggdG8KLWEgbG93ZXIgbGV2ZWwgd2l0aCBhIHdlbGwgcHJvdGVjdGVkIC5odHBhc3N3ZCBmaWxlLiAgPFA+Ci0KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiBCeSBkZWZhdWx0OyBjb250cm9sIGlzIG5vdCBwYXNzZWQgb247IGFuZCBhbgotdW5rbm93bgotdXNlcklEIG9yIHJ1bGUgd2lsbCByZXN1bHQgaW4gYW4gQXV0aG9yaXphdGlvbiBSZXF1aXJlZCByZXBseS4gTm90Ci1zZXR0aW5nIGl0IHRodXMga2VlcHMgdGhlIHN5c3RlbSBzZWN1cmU7IGFuZCBmb3JjZXMgYW4gTkNTQSBjb21wbGlhbnQKLWJlaGF2aW91ci4gIDxQPgotU2VjdXJpdHk6IERvIGNvbnNpZGVyIHRoZSBpbXBsaWNhdGlvbnMgb2YgYWxsb3dpbmcgYSB1c2VyIHRvIGFsbG93Ci1mYWxsLXRocm91Z2ggaW4gaGlzIC5odGFjY2VzcyBmaWxlOyBhbmQgdmVyaWZ5IHRoYXQgdGhpcyBpcyByZWFsbHkKLXdoYXQgeW91IHdhbnQ7IEdlbmVyYWxseSBpdCBpcyBlYXNpZXIgdG8ganVzdCBzZWN1cmUgYSBzaW5nbGUKLS5odHBhc3N3ZCBmaWxlLCB0aGFuIGl0IGlzIHRvIHNlY3VyZSBhIGRhdGFiYXNlIHdoaWNoIG1pZ2h0IGhhdmUKLW1vcmUgYWNjZXNzIGludGVyZmFjZXMuCi0KLTxQPgotU2VlIGFsc28gPEEgSFJFRj0iY29yZS5odG1sI2F1dGhuYW1lIj5BdXRoTmFtZTwvQT4sCi08QSBIUkVGPSJjb3JlLmh0bWwjYXV0aHR5cGUiPkF1dGhUeXBlPC9BPiBhbmQKLTxBIEhSRUY9IiNhdXRoZGJncm91cGZpbGUiPkF1dGhEQkdyb3VwRmlsZTwvQT4uPFA+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfYXV0aF9kYm0uaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfYXV0aF9kYm0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYyMThlZi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX2F1dGhfZGJtLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9hdXRoX2RibTwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotCi08SDEgQUxJR049IkNFTlRFUiI+TW9kdWxlIG1vZF9hdXRoX2RibTwvSDE+Ci0KLVRoaXMgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbiB0aGUgPENPREU+bW9kX2F1dGhfZGJtLmM8L0NPREU+IGZpbGUsIGFuZAotaXMgbm90IGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuIEl0IHByb3ZpZGVzIGZvciB1c2VyIGF1dGhlbnRpY2F0aW9uIHVzaW5nCi1EQk0gZmlsZXMuCi0KLQotPE1FTlU+Ci08TEk+PEEgSFJFRj0iI2F1dGhkYm1ncm91cGZpbGUiPkF1dGhEQk1Hcm91cEZpbGU8L0E+Ci08TEk+PEEgSFJFRj0iI2F1dGhkYm11c2VyZmlsZSI+QXV0aERCTVVzZXJGaWxlPC9BPgotPExJPjxBIEhSRUY9IiNhdXRoZGJtYXV0aG9yaXRhdGl2ZSI+QXV0aERCTUF1dGhvcml0YXRpdmU8L0E+Ci08L01FTlU+Ci08SFI+Ci0KLQotPEgyPjxBIE5BTUU9ImF1dGhkYm1ncm91cGZpbGUiPkF1dGhEQk1Hcm91cEZpbGU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBBdXRoREJNR3JvdXBGaWxlfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBBdXRoREJNR3JvdXBGaWxlIDxFTT5maWxlbmFtZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IGRpcmVjdG9yeSwgLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gQXV0aENvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gRXh0ZW5zaW9uPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfYXV0aF9kYm08UD4KLQotVGhlIEF1dGhEQk1Hcm91cEZpbGUgZGlyZWN0aXZlIHNldHMgdGhlIG5hbWUgb2YgYSBEQk0gZmlsZSBjb250YWluaW5nIHRoZSBsaXN0Ci1vZiB1c2VyIGdyb3VwcyBmb3IgdXNlciBhdXRoZW50aWNhdGlvbi4gPEVNPkZpbGVuYW1lPC9FTT4gaXMgdGhlIGFic29sdXRlIHBhdGgKLXRvIHRoZSBncm91cCBmaWxlLjxQPgotCi1UaGUgZ3JvdXAgZmlsZSBpcyBrZXllZCBvbiB0aGUgdXNlcm5hbWUuIFRoZSB2YWx1ZSBmb3IgYSB1c2VyIGlzIGEKLWNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBncm91cHMgdG8gd2hpY2ggdGhlIHVzZXJzIGJlbG9uZ3MuIFRoZXJlIG11c3QKLWJlIG5vIHdoaXRlc3BhY2Ugd2l0aGluIHRoZSB2YWx1ZSwgYW5kIGl0IG11c3QgbmV2ZXIgY29udGFpbiBhbnkgY29sb25zLjxQPgotCi1TZWN1cml0eTogbWFrZSBzdXJlIHRoYXQgdGhlIEF1dGhEQk1Hcm91cEZpbGUgaXMgc3RvcmVkIG91dHNpZGUgdGhlCi1kb2N1bWVudCB0cmVlIG9mIHRoZSB3ZWItc2VydmVyOyBkbyA8RU0+bm90PC9FTT4gcHV0IGl0IGluIHRoZSBkaXJlY3RvcnkgdGhhdAotaXQgcHJvdGVjdHMuIE90aGVyd2lzZSwgY2xpZW50cyB3aWxsIGJlIGFibGUgdG8gZG93bmxvYWQgdGhlCi1BdXRoREJNR3JvdXBGaWxlIHVubGVzcyBvdGhlcndpc2UgcHJvdGVjdGVkLjxQPgotCi1Db21iaW5pbmcgR3JvdXAgYW5kIFBhc3N3b3JkIERCTSBmaWxlczogSW4gc29tZSBjYXNlcyBpdCBpcyBlYXNpZXIgdG8KLW1hbmFnZSBhIHNpbmdsZSBkYXRhYmFzZSB3aGljaCBjb250YWlucyBib3RoIHRoZSBwYXNzd29yZCBhbmQgZ3JvdXAKLWRldGFpbHMgZm9yIGVhY2ggdXNlci4gVGhpcyBzaW1wbGlmaWVzIGFueSBzdXBwb3J0IHByb2dyYW1zIHRoYXQgbmVlZAotdG8gYmUgd3JpdHRlbjogdGhleSBub3cgb25seSBoYXZlIHRvIGRlYWwgd2l0aCB3cml0aW5nIHRvIGFuZCBsb2NraW5nCi1hIHNpbmdsZSBEQk0gZmlsZS4gVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IGZpcnN0IHNldHRpbmcgdGhlIGdyb3VwCi1hbmQgcGFzc3dvcmQgZmlsZXMgdG8gcG9pbnQgdG8gdGhlIHNhbWUgREJNOjxQPgotCi08QkxPQ0tRVU9URT48Q09ERT4KLUF1dGhEQk1Hcm91cEZpbGUgL3d3dy91c2VyYmFzZTxCUj4KLUF1dGhEQk1Vc2VyRmlsZSAvd3d3L3VzZXJiYXNlCi08L0NPREU+PC9CTE9DS1FVT1RFPgotCi1UaGUga2V5IGZvciB0aGUgc2luZ2xlIERCTSBpcyB0aGUgdXNlcm5hbWUuIFRoZSB2YWx1ZSBjb25zaXN0cyBvZiA8UD4KLQotPEJMT0NLUVVPVEU+PENPREU+Ci1Vbml4IENyeXB0LWVkIFBhc3N3b3JkIDogTGlzdCBvZiBHcm91cHMgWyA6IChpZ25vcmVkKSBdCi08L0NPREU+PC9CTE9DS1FVT1RFPgotCi1UaGUgcGFzc3dvcmQgc2VjdGlvbiBjb250YWlucyB0aGUgVW5peCBjcnlwdCgpIHBhc3N3b3JkIGFzIGJlZm9yZS4gVGhpcyBpcwotZm9sbG93ZWQgYnkgYSBjb2xvbiBhbmQgdGhlIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGdyb3Vwcy4gT3RoZXIgZGF0YSBtYXkKLW9wdGlvbmFsbHkgYmUgbGVmdCBpbiB0aGUgREJNIGZpbGUgYWZ0ZXIgYW5vdGhlciBjb2xvbjsgaXQgaXMgaWdub3JlZCBieSB0aGUKLWF1dGhlbnRpY2F0aW9uIG1vZHVsZS4gVGhpcyBpcyB3aGF0IHd3dy50ZWxlc2NvcGUub3JnIHVzZXMgZm9yIGl0cyBjb21iaW5lZAotcGFzc3dvcmQgYW5kIGdyb3VwIGRhdGFiYXNlLiA8UD4KLQotU2VlIGFsc28gPEEgSFJFRj0iY29yZS5odG1sI2F1dGhuYW1lIj5BdXRoTmFtZTwvQT4sCi08QSBIUkVGPSJjb3JlLmh0bWwjYXV0aHR5cGUiPkF1dGhUeXBlPC9BPiBhbmQKLTxBIEhSRUY9IiNhdXRoZGJtdXNlcmZpbGUiPkF1dGhEQk1Vc2VyRmlsZTwvQT4uPFA+PEhSPgotCi08SDI+PEEgTkFNRT0iYXV0aGRibXVzZXJmaWxlIj5BdXRoREJNVXNlckZpbGU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBBdXRoREJNVXNlckZpbGV9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEF1dGhEQk1Vc2VyRmlsZSA8RU0+ZmlsZW5hbWU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBkaXJlY3RvcnksIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IEF1dGhDb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEV4dGVuc2lvbjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2F1dGhfZGJtPFA+Ci0KLVRoZSBBdXRoREJNVXNlckZpbGUgZGlyZWN0aXZlIHNldHMgdGhlIG5hbWUgb2YgYSBEQk0gZmlsZSBjb250YWluaW5nIHRoZSBsaXN0Ci1vZiB1c2VycyBhbmQgcGFzc3dvcmRzIGZvciB1c2VyIGF1dGhlbnRpY2F0aW9uLiA8RU0+RmlsZW5hbWU8L0VNPiBpcyB0aGUKLWFic29sdXRlIHBhdGggdG8gdGhlIHVzZXIgZmlsZS48UD4KLQotVGhlIHVzZXIgZmlsZSBpcyBrZXllZCBvbiB0aGUgdXNlcm5hbWUuIFRoZSB2YWx1ZSBmb3IgYSB1c2VyIGlzIHRoZQotY3J5cHQoKSBlbmNyeXB0ZWQgcGFzc3dvcmQsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSBjb2xvbiBhbmQKLWFyYml0cmFyeSBkYXRhLiAgVGhlIGNvbG9uIGFuZCB0aGUgZGF0YSBmb2xsb3dpbmcgaXQgd2lsbCBiZSBpZ25vcmVkCi1ieSB0aGUgc2VydmVyLjxQPgotCi1TZWN1cml0eTogbWFrZSBzdXJlIHRoYXQgdGhlIEF1dGhEQk1Vc2VyRmlsZSBpcyBzdG9yZWQgb3V0c2lkZSB0aGUKLWRvY3VtZW50IHRyZWUgb2YgdGhlIHdlYi1zZXJ2ZXI7IGRvIDxFTT5ub3Q8L0VNPiBwdXQgaXQgaW4gdGhlIGRpcmVjdG9yeSB0aGF0Ci1pdCBwcm90ZWN0cy4gT3RoZXJ3aXNlLCBjbGllbnRzIHdpbGwgYmUgYWJsZSB0byBkb3dubG9hZCB0aGUKLUF1dGhEQk1Vc2VyRmlsZS48UD4KLQotSW1wb3J0YW50IGNvbXBhdGliaWxpdHkgbm90ZTogVGhlIGltcGxlbWVudGF0aW9uIG9mICJkYm1vcGVuIiBpbiB0aGUKLWFwYWNoZSBtb2R1bGVzIHJlYWRzIHRoZSBzdHJpbmcgbGVuZ3RoIG9mIHRoZSBoYXNoZWQgdmFsdWVzIGZyb20gdGhlCi1EQk0gZGF0YSBzdHJ1Y3R1cmVzLCByYXRoZXIgdGhhbiByZWx5aW5nIHVwb24gdGhlIHN0cmluZyBiZWluZwotTlVMTC1hcHBlbmRlZC4gU29tZSBhcHBsaWNhdGlvbnMsIHN1Y2ggYXMgdGhlIE5ldHNjYXBlIHdlYiBzZXJ2ZXIsCi1yZWx5IHVwb24gdGhlIHN0cmluZyBiZWluZyBOVUxMLWFwcGVuZGVkLCBzbyBpZiB5b3UgYXJlIGhhdmluZyB0cm91YmxlCi11c2luZyBEQk0gZmlsZXMgaW50ZXJjaGFuZ2VhYmx5IGJldHdlZW4gYXBwbGljYXRpb25zIHRoaXMgbWF5IGJlIGEKLXBhcnQgb2YgdGhlIHByb2JsZW0uIDxQPgotCi1TZWUgYWxzbyA8QSBIUkVGPSJjb3JlLmh0bWwjYXV0aG5hbWUiPkF1dGhOYW1lPC9BPiwKLTxBIEhSRUY9ImNvcmUuaHRtbCNhdXRodHlwZSI+QXV0aFR5cGU8L0E+IGFuZAotPEEgSFJFRj0iI2F1dGhkYm1ncm91cGZpbGUiPkF1dGhEQk1Hcm91cEZpbGU8L0E+LjxQPgotCi08SFI+Ci08SDI+PEEgTkFNRT0iYXV0aGRibWF1dGhvcml0YXRpdmUiPkF1dGhEQk1BdXRob3JpdGF0aXZlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgQXV0aERCTUF1dGhvcml0YXRpdmV9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEF1dGhEQk1BdXRob3JpdGF0aXZlICZsdDsgPFNUUk9ORz4gb248L1NUUk9ORz4oZGVmYXVsdCkgfCBvZmYgJmd0OyA8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gZGlyZWN0b3J5LCAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBBdXRoQ29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfYXV0aDxQPgotCi1TZXR0aW5nIHRoZSBBdXRoREJNQXV0aG9yaXRhdGl2ZSBkaXJlY3RpdmUgZXhwbGljaXRseSB0byA8U1RST05HPidvZmYnPC9TVFJPTkc+Ci1hbGxvd3MgZm9yIGJvdGggYXV0aGVudGljYXRpb24gYW5kIGF1dGhvcml6YXRpb24gdG8gYmUgcGFzc2VkIG9uCi10byBsb3dlciBsZXZlbCBtb2R1bGVzIChhcyBkZWZpbmVkIGluIHRoZSA8Q09ERT5Db25maWd1cmF0aW9uPC9DT0RFPgotYW5kIDxDT0RFPm1vZHVsZXMuYzwvQ09ERT4gZmlsZSBpZiB0aGVyZSBpcyA8U1RST05HPm5vIHVzZXJJRDwvU1RST05HPiBvcgotPFNUUk9ORz5ydWxlPC9TVFJPTkc+IG1hdGNoaW5nIHRoZSBzdXBwbGllZCB1c2VySUQuIElmIHRoZXJlIGlzIGEgdXNlcklECi1hbmQvb3IgcnVsZSBzcGVjaWZpZWQ7IHRoZSB1c3VhbCBwYXNzd29yZCBhbmQgYWNjZXNzIGNoZWNrcyB3aWxsCi1iZSBhcHBsaWVkIGFuZCBhIGZhaWx1cmUgd2lsbCBnaXZlIGFuIEF1dGhvcml6YXRpb24gUmVxdWlyZWQgcmVwbHkuCi08UD4KLVNvIGlmIGEgdXNlcklEIGFwcGVhcnMgaW4gdGhlIGRhdGFiYXNlIG9mIG1vcmUgdGhhbiBvbmUgbW9kdWxlOyBvcgotaWYgYSB2YWxpZCByZXF1aXJlIGRpcmVjdGl2ZSBhcHBsaWVzIHRvIG1vcmUgdGhhbiBvbmUgbW9kdWxlOyB0aGVuCi10aGUgZmlyc3QgbW9kdWxlIHdpbGwgdmVyaWZ5IHRoZSBjcmVkZW50aWFsczsgYW5kIG5vIGFjY2VzcyBpcwotcGFzc2VkIG9uOyByZWdhcmRsZXNzIG9mIHRoZSBBdXRoQXV0aG9yaXRhdGl2ZSBzZXR0aW5nLiAgPFA+Ci0KLUEgY29tbW9uIHVzZSBmb3IgdGhpcyBpcyBpbiBjb25qdW5jdGlvbiB3aXRoIG9uZSBvZiB0aGUgYmFzaWMgYXV0aAotbW9kdWxlczsgc3VjaCBhcyA8QSBIUkVGPSJtb2RfYXV0aC5odG1sIj48Q09ERT5tb2RfYXV0aC5jPC9DT0RFPjwvQT4uCi1XaGVyZWFzIHRoaXMgREJNIG1vZHVsZSBzdXBwbGllcyB0aGUgYnVsayBvZiB0aGUgdXNlciBjcmVkZW50aWFsCi1jaGVja2luZzsgYSBmZXcgKGFkbWluaXN0cmF0b3IpIHJlbGF0ZWQgYWNjZXNzZXMgZmFsbCB0aHJvdWdoIHRvCi1hIGxvd2VyIGxldmVsIHdpdGggYSB3ZWxsIHByb3RlY3RlZCAuaHRwYXNzd2QgZmlsZS4gIDxQPgotCi08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gQnkgZGVmYXVsdDsgY29udHJvbCBpcyBub3QgcGFzc2VkIG9uOyBhbmQgYW4gdW5rbm93bgotdXNlcklEIG9yIHJ1bGUgd2lsbCByZXN1bHQgaW4gYW4gQXV0aG9yaXphdGlvbiBSZXF1aXJlZCByZXBseS4gTm90Ci1zZXR0aW5nIGl0IHRodXMga2VlcHMgdGhlIHN5c3RlbSBzZWN1cmU7IGFuZCBmb3JjZXMgYW4gTkNTQSBjb21wbGlhbnQKLWJlaGF2aW91ci4gIDxQPgotCi1TZWN1cml0eTogRG8gY29uc2lkZXIgdGhlIGltcGxpY2F0aW9ucyBvZiBhbGxvd2luZyBhIHVzZXIgdG8gYWxsb3cKLWZhbGwtdGhyb3VnaCBpbiBoaXMgLmh0YWNjZXNzIGZpbGU7IGFuZCB2ZXJpZnkgdGhhdCB0aGlzIGlzIHJlYWxseQotd2hhdCB5b3Ugd2FudDsgR2VuZXJhbGx5IGl0IGlzIGVhc2llciB0byBqdXN0IHNlY3VyZSBhIHNpbmdsZQotLmh0cGFzc3dkIGZpbGUsIHRoYW4gaXQgaXMgdG8gc2VjdXJlIGEgZGF0YWJhc2Ugd2hpY2ggbWlnaHQgaGF2ZQotbW9yZSBhY2Nlc3MgaW50ZXJmYWNlcy4KLQotPFA+Ci1TZWUgYWxzbyA8QSBIUkVGPSJjb3JlLmh0bWwjYXV0aG5hbWUiPkF1dGhOYW1lPC9BPiwKLTxBIEhSRUY9ImNvcmUuaHRtbCNhdXRodHlwZSI+QXV0aFR5cGU8L0E+IGFuZAotPEEgSFJFRj0iI2F1dGhkYm1ncm91cGZpbGUiPkF1dGhEQk1Hcm91cEZpbGU8L0E+LjxQPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2F1dGhfZGlnZXN0Lmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2F1dGhfZGlnZXN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZmM5NmYuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9hdXRoX2RpZ2VzdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIG1vZHVsZSBtb2RfYXV0aF9kaWdlc3Q8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5Nb2R1bGUgbW9kX2F1dGhfZGlnZXN0PC9IMT4KLQotVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Q09ERT5tb2RfYXV0aF9kaWdlc3QuYzwvQ09ERT4gZmlsZSwgYW5kIGlzCi1ub3QgY29tcGlsZWQgaW4gYnkgZGVmYXVsdC4gSXQgaXMgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDEuMy44IGFuZAotbGF0ZXIuIEl0IHByb3ZpZGVzIGZvciB1c2VyIGF1dGhlbnRpY2F0aW9uIHVzaW5nIE1ENSBEaWdlc3QKLUF1dGhlbnRpY2F0aW9uLgotCi08UD5Ob3RlIHRoaXMgaXMgYW4gdXBkYXRlZCB2ZXJzaW9uIG9mIDxBCi1IUkVGPSJtb2RfZGlnZXN0Lmh0bWwiPm1vZF9kaWdlc3Q8L0E+LiBIb3dldmVyLCBpdCBoYXMgbm90IGJlZW4KLWV4dGVuc2l2ZWx5IHRlc3RlZCBhbmQgaXMgdGhlcmVmb3JlIG1hcmtlZCBleHBlcmltZW50YWwuIElmIHlvdSB1c2UgdGhpcwotbW9kdWxlLCB5b3UgbXVzdCBtYWtlIHN1cmUgdG8gPGVtPm5vdDwvZW0+IHVzZSBtb2RfZGlnZXN0IChiZWNhdXNlIHRoZXkKLXNoYXJlIHNvbWUgb2YgdGhlIHNhbWUgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzKS4KLQotCi08TUVOVT4KLTxMST48QSBIUkVGPSIjYXV0aGRpZ2VzdGZpbGUiPkF1dGhEaWdlc3RGaWxlPC9BPgotPExJPjxBIEhSRUY9IiNhdXRoZGlnZXN0Z3JvdXBmaWxlIj5BdXRoRGlnZXN0R3JvdXBGaWxlPC9BPgotPExJPjxBIEhSRUY9IiNhdXRoZGlnZXN0cW9wIj5BdXRoRGlnZXN0UW9wPC9BPgotPExJPjxBIEhSRUY9IiNhdXRoZGlnZXN0bm9uY2VsaWZldGltZSI+QXV0aERpZ2VzdE5vbmNlTGlmZXRpbWU8L0E+Ci08TEk+PEEgSFJFRj0iI2F1dGhkaWdlc3Rub25jZWZvcm1hdCI+QXV0aERpZ2VzdE5vbmNlRm9ybWF0PC9BPgotPExJPjxBIEhSRUY9IiNhdXRoZGlnZXN0bmNjaGVjayI+QXV0aERpZ2VzdE5jQ2hlY2s8L0E+Ci08TEk+PEEgSFJFRj0iI2F1dGhkaWdlc3RhbGdvcml0aG0iPkF1dGhEaWdlc3RBbGdvcml0aG08L0E+Ci08TEk+PEEgSFJFRj0iI2F1dGhkaWdlc3Rkb21haW4iPkF1dGhEaWdlc3REb21haW48L0E+Ci08TEk+PEEgSFJFRj0iI3VzaW5nZGlnZXN0Ij5Vc2luZyBEaWdlc3QgQXV0aGVudGljYXRpb248L0E+Ci08L01FTlU+Ci08SFI+Ci0KLQotPEgyPjxBIE5BTUU9ImF1dGhkaWdlc3RmaWxlIj5BdXRoRGlnZXN0RmlsZTwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBBdXRoRGlnZXN0RmlsZSA8RU0+ZmlsZW5hbWU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBkaXJlY3RvcnksIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IEF1dGhDb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9hdXRoX2RpZ2VzdDxCUj4KLQotPFA+VGhlIEF1dGhEaWdlc3RGaWxlIGRpcmVjdGl2ZSBzZXRzIHRoZSBuYW1lIG9mIGEgdGV4dHVhbCBmaWxlIGNvbnRhaW5pbmcKLXRoZSBsaXN0IG9mIHVzZXJzIGFuZCBlbmNvZGVkIHBhc3N3b3JkcyBmb3IgZGlnZXN0IGF1dGhlbnRpY2F0aW9uLgotPEVNPkZpbGVuYW1lPC9FTT4gaXMgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHVzZXIgZmlsZS4KLQotPFA+VGhlIGRpZ2VzdCBmaWxlIHVzZXMgYSBzcGVjaWFsIGZvcm1hdC4gRmlsZXMgaW4gdGhpcyBmb3JtYXQgY2FuIGJlCi1jcmVhdGVkIHVzaW5nIHRoZSAiaHRkaWdlc3QiIHV0aWxpdHkgZm91bmQgaW4gdGhlIHN1cHBvcnQvIHN1YmRpcmVjdG9yeSBvZgotdGhlIEFwYWNoZSBkaXN0cmlidXRpb24uCi0KLTxIUj4KLQotPEgyPjxBIE5BTUU9ImF1dGhkaWdlc3Rncm91cGZpbGUiPkF1dGhEaWdlc3RHcm91cEZpbGU8L0E+PC9IMj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQXV0aERpZ2VzdEdyb3VwRmlsZSA8RU0+ZmlsZW5hbWU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBkaXJlY3RvcnksIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IEF1dGhDb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9hdXRoX2RpZ2VzdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBBdmFpbGFibGUgaW4gQXBhY2hlIDEuMy44IGFuZCBsYXRlcgotCi08UD5UaGUgQXV0aERpZ2VzdEdyb3VwRmlsZSBkaXJlY3RpdmUgc2V0cyB0aGUgbmFtZSBvZiBhIHRleHR1YWwgZmlsZQotY29udGFpbmluZyB0aGUgbGlzdCBvZiBncm91cHMgYW5kIHRoZWlyIG1lbWJlcnMgKHVzZXIgbmFtZXMpLgotPEVNPkZpbGVuYW1lPC9FTT4gaXMgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGdyb3VwIGZpbGUuCi0KLTxQPkVhY2ggbGluZSBvZiB0aGUgZ3JvdXAgZmlsZSBjb250YWlucyBhIGdyb3VwbmFtZSBmb2xsb3dlZCBieSBhIGNvbG9uLAotZm9sbG93ZWQgYnkgdGhlIG1lbWJlciB1c2VybmFtZXMgc2VwYXJhdGVkIGJ5IHNwYWNlcy4gRXhhbXBsZToKLTxCTE9DS1FVT1RFPjxDT0RFPm15Z3JvdXA6IGJvYiBqb2UgYW5uZTwvQ09ERT48L0JMT0NLUVVPVEU+Ci1Ob3RlIHRoYXQgc2VhcmNoaW5nIGxhcmdlIHRleHQgZmlsZXMgaXMgPEVNPnZlcnk8L0VNPiBpbmVmZmljaWVudC4KLQotPFA+U2VjdXJpdHk6IG1ha2Ugc3VyZSB0aGF0IHRoZSBBdXRoR3JvdXBGaWxlIGlzIHN0b3JlZCBvdXRzaWRlIHRoZQotZG9jdW1lbnQgdHJlZSBvZiB0aGUgd2ViLXNlcnZlcjsgZG8gPEVNPm5vdDwvRU0+IHB1dCBpdCBpbiB0aGUgZGlyZWN0b3J5Ci10aGF0IGl0IHByb3RlY3RzLiBPdGhlcndpc2UsIGNsaWVudHMgd2lsbCBiZSBhYmxlIHRvIGRvd25sb2FkIHRoZQotQXV0aEdyb3VwRmlsZS4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0iYXV0aGRpZ2VzdHFvcCI+QXV0aERpZ2VzdFFvcDwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBBdXRoRGlnZXN0UW9wIDxFTT5ub25lIHwgMSp7IGF1dGggfCBhdXRoLWludCB9PC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+QXV0aERpZ2VzdFFvcCBhdXRoPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBkaXJlY3RvcnksIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IEF1dGhDb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9hdXRoX2RpZ2VzdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBBdmFpbGFibGUgaW4gQXBhY2hlIDEuMy44IGFuZCBsYXRlcgotCi08UD5UaGUgQXV0aERpZ2VzdFFvcCBkaXJlY3RpdmUgZGV0ZXJtaW5lcyB0aGUgcXVhbGl0eS1vZi1wcm90ZWN0aW9uIHRvIHVzZS4KLTxFTT5hdXRoPC9FTT4gd2lsbCBvbmx5IGRvIGF1dGhlbnRpY2F0aW9uICh1c2VybmFtZS9wYXNzd29yZCk7Ci08RU0+YXV0aC1pbnQ8L0VNPiBpcyBhdXRoZW50aWNhdGlvbiBwbHVzIGludGVncml0eSBjaGVja2luZyAoYW4gTUQ1IGhhc2gKLW9mIHRoZSBlbnRpdHkgaXMgYWxzbyBjb21wdXRlZCBhbmQgY2hlY2tlZCk7IDxFTT5ub25lPC9FTT4gd2lsbCBjYXVzZSB0aGUKLW1vZHVsZSB0byB1c2UgdGhlIG9sZCBSRkMtMjA2OSBkaWdlc3QgYWxnb3JpdGhtICh3aGljaCBkb2VzIG5vdCBpbmNsdWRlCi1pbnRlZ3JpdHkgY2hlY2tpbmcpLiBCb3RoIDxFTT5hdXRoPC9lbT4gYW5kIDxFTT5hdXRoLWludDwvRU0+IG1heSBiZQotc3BlY2lmaWVkLCBpbiB3aGljaCB0aGUgY2FzZSB0aGUgYnJvd3NlciB3aWxsIGNob29zZSB3aGljaCBvZiB0aGVzZSB0bwotdXNlLiA8RU0+bm9uZTwvRU0+IHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgdGhlIGJyb3dzZXIgZm9yIHNvbWUgcmVhc29uCi1kb2VzIG5vdCBsaWtlIHRoZSBjaGFsbGVuZ2UgaXQgcmVjZWl2ZXMgb3RoZXJ3aXNlLgotCi08UD48U1RST05HPjxFTT5hdXRoLWludDwvRU0+IGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQ8L1NUUk9ORz4uCi0KLTxIUj4KLQotPEgyPjxBIE5BTUU9ImF1dGhkaWdlc3Rub25jZWxpZmV0aW1lIj5BdXRoRGlnZXN0Tm9uY2VMaWZldGltZTwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBBdXRoRGlnZXN0Tm9uY2VMaWZldGltZSA8RU0+Jmx0O3RpbWUmZ3Q7PC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+QXV0aERpZ2VzdE5vbmNlTGlmZXRpbWUgMzAwPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBkaXJlY3RvcnksIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IEF1dGhDb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9hdXRoX2RpZ2VzdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBBdmFpbGFibGUgaW4gQXBhY2hlIDEuMy44IGFuZCBsYXRlcgotCi08UD5UaGUgQXV0aERpZ2VzdE5vbmNlTGlmZXRpbWUgZGlyZWN0aXZlIGNvbnRyb2xzIGhvdyBsb25nIHRoZSBzZXJ2ZXIKLW5vbmNlIGlzIHZhbGlkLiBXaGVuIHRoZSBjbGllbnQgY29udGFjdHMgdGhlIHNlcnZlciB1c2luZyBhbiBleHBpcmVkCi1ub25jZSB0aGUgc2VydmVyIHdpbGwgc2VuZCBiYWNrIGEgNDAxIHdpdGggPGNvZGU+c3RhbGU9dHJ1ZTwvY29kZT4uIElmCi08RU0+Jmx0O3RpbWUmZ3Q7PC9FTT4gaXMgZ3JlYXRlciB0aGFuIDAgdGhlbiBpdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZgotc2Vjb25kcyB0aGUgbm9uY2UgaXMgdmFsaWQ7IHRoaXMgc2hvdWxkIHByb2JhYmx5IG5ldmVyIGJlIHNldCB0byBsZXNzCi10aGFuIDEwIHNlY29uZHMuIElmIDxFTT4mbHQ7dGltZSZndDs8L0VNPiBpcyBsZXNzIHRoYW4gMCB0aGVuIHRoZSBub25jZQotbmV2ZXIgZXhwaXJlcy4KLQotPCEtLSBOb3QgaW1wbGVtZW50ZWQgeWV0Ci1JZiA8RU0+Jmx0O3RpbWUmZ3Q7PC9FTT4gaXMgMCB0aGVuIHRoZSBub25jZSBtYXkgYmUgdXNlZCBleGFjdGx5IG9uY2UKLWJ5IHRoZSBjbGllbnQuIE5vdGUgdGhhdCB3aGlsZSBvbmUtdGltZS1ub25jZXMgcHJvdmlkZSBoaWdoZXIgc2VjdXJpdHkKLWFnYWluc3QgcmVwbGF5IGF0dGFja3MsIHRoZXkgYWxzbyBoYXZlIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlCi1pbXBsaWNhdGlvbnMsIGFzIHRoZSBicm93c2VyIGNhbm5vdCBwaXBlbGluZSBvciBtdWx0aXBsZSBjb25uZWN0aW9ucwotZm9yIHRoZSByZXF1ZXN0cy4gQmVjYXVzZSBicm93c2VycyBjYW5ub3QgZWFzaWx5IGRldGVjdCB0aGF0Ci1vbmUtdGltZS1ub25jZXMgYXJlIGJlaW5nIHVzZWQsIHRoaXMgbWF5IGxlYWQgdG8gYnJvd3NlcnMgdHJ5aW5nIHRvCi1waXBlbGluZSByZXF1ZXN0cyBhbmQgcmVjZWl2aW5nIDQwMSByZXNwb25zZXMgZm9yIGFsbCBidXQgdGhlIGZpcnN0Ci1yZXF1ZXN0LCByZXF1aXJpbmcgdGhlIGJyb3dzZXIgdG8gcmVzZW5kIHRoZSByZXF1ZXN0cy4gTm90ZSBhbHNvIHRoYXQKLXRoZSBwcm90ZWN0aW9uIGFnYWluc3QgcmVwbHkgYXR0YWNrcyBvbmx5IG1ha2VzIHNlbnNlIGZvciBkeW5hbWljYWxseQotZ2VuZXJhdGVkIGNvbnRlbnQgYW5kIHRoaW5ncyBsaWtlIFBPU1QgcmVxdWVzdHM7IGZvciBzdGF0aWMgY29udGVudAotdGhlIGF0dGFja2VyIG1heSBhbHJlYWR5IGhhdmUgdGhlIGNvbXBsZXRlIHJlc3BvbnNlLCBzbyBvbmUtdGltZS1ub25jZXMKLWRvIG5vdCBtYWtlIHNlbnNlIGhlcmUuCi0tLT4KLQotPEhSPgotPEgyPjxBIE5BTUU9ImF1dGhkaWdlc3Rub25jZWZvcm1hdCI+QXV0aERpZ2VzdE5vbmNlRm9ybWF0PC9BPjwvSDI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEF1dGhEaWdlc3ROb25jZUZvcm1hdCA8RU0+Pz8/PC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+QXV0aERpZ2VzdE5vbmNlRm9ybWF0ID8/PzwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gZGlyZWN0b3J5LCAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBBdXRoQ29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfYXV0aF9kaWdlc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gQXZhaWxhYmxlIGluIEFwYWNoZSAxLjMuOCBhbmQgbGF0ZXIKLQotPFA+PFNUUk9ORz5Ob3QgaW1wbGVtZW50ZWQgeWV0LjwvU1RST05HPgotPCEtLQotPFA+VGhlIEF1dGhEaWdlc3ROb25jZUZvcm1hdCBkaXJlY3RpdmUgZGV0ZXJtaW5lcyBob3cgdGhlIG5vbmNlIGlzCi1nZW5lcmF0ZWQuCi0tLT4KLQotPEhSPgotPEgyPjxBIE5BTUU9ImF1dGhkaWdlc3RuY2NoZWNrIj5BdXRoRGlnZXN0TmNDaGVjazwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBBdXRoRGlnZXN0TmNDaGVjayA8RU0+T24vT2ZmPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+QXV0aERpZ2VzdE5jQ2hlY2sgT2ZmPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gPEVNPk5vdCBhcHBsaWNhYmxlPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9hdXRoX2RpZ2VzdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBBdmFpbGFibGUgaW4gQXBhY2hlIDEuMy44IGFuZCBsYXRlcgotCi08UD48U1RST05HPk5vdCBpbXBsZW1lbnRlZCB5ZXQuPC9TVFJPTkc+Ci08IS0tCi08UD5UaGUgQXV0aERpZ2VzdE5jQ2hlY2sgZGlyZWN0aXZlIGVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGNoZWNraW5nIG9mIHRoZQotbm9uY2UtY291bnQgc2VudCBieSB0aGUgc2VydmVyLgotCi08UD5XaGlsZSByZWNvbW1lbmRlZCBmcm9tIGEgc2VjdXJpdHkgc3RhbmRwb2ludCwgdHVybmluZyB0aGlzIGRpcmVjdGl2ZQotT24gaGFzIG9uZSBpbXBvcnRhbnQgcGVyZm9ybWFuY2UgaW1wbGljYXRpb24uIFRvIGNoZWNrIHRoZSBub25jZS1jb3VudAotKmFsbCogcmVxdWVzdHMgKHdoaWNoIGhhdmUgYW4gQXV0aG9yaXphdGlvbiBoZWFkZXIsIGlycmVzcGVjdGl2ZSBvZgotd2hldGhlciB0aGV5IHJlcXVpcmUgZGlnZXN0IGF1dGhlbnRpY2F0aW9uKSBtdXN0IGJlIHNlcmlhbGl6ZWQgdGhyb3VnaAotYSBjcml0aWNhbCBzZWN0aW9uLiBJZiB0aGUgc2VydmVyIGlzIGhhbmRsaW5nIGEgbGFyZ2UgbnVtYmVyIG9mCi1yZXF1ZXN0cyB3aGljaCBjb250YWluIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciB0aGVuIHRoaXMgbWF5IG5vdGljZWFibHkKLWltcGFjdCBwZXJmb3JtYW5jZS4KLS0tPgotCi08SFI+Ci08SDI+PEEgTkFNRT0iYXV0aGRpZ2VzdGFsZ29yaXRobSI+QXV0aERpZ2VzdEFsZ29yaXRobTwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBBdXRoRGlnZXN0QWxnb3JpdGhtIDxFTT5NRDUgfCBNRDUtc2VzczwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPkF1dGhEaWdlc3RBbGdvcml0aG0gTUQ1PC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBkaXJlY3RvcnksIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IEF1dGhDb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9hdXRoX2RpZ2VzdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBBdmFpbGFibGUgaW4gQXBhY2hlIDEuMy44IGFuZCBsYXRlcgotCi08UD5UaGUgQXV0aERpZ2VzdEFsZ29yaXRobSBkaXJlY3RpdmUgc2VsZWN0cyB0aGUgYWxnb3JpdGhtIHVzZWQgdG8gY2FsY3VsYXRlCi10aGUgY2hhbGxlbmdlIGFuZCByZXNwb25zZSBoYXNoZXMuCi0KLTxQPjxTVFJPTkc+PEVNPk1ENS1zZXNzPC9FTT4gaXMgbm90IGNvcnJlY3RseSBpbXBsZW1lbnRlZCB5ZXQ8L1NUUk9ORz4uCi08IS0tCi08UD5UbyB1c2UgPEVNPk1ENS1zZXNzPC9FTT4geW91IG11c3QgZmlyc3QgY29kZSB1cCB0aGUKLTxWQVI+Z2V0X3VzZXJwd19oYXNoKCk8L1ZBUj4gZnVuY3Rpb24gaW4gPFZBUj5tb2RfYXV0aF9kaWdlc3QuYzwvVkFSPiAuCi0tLT4KLQotPEhSPgotPEgyPjxBIE5BTUU9ImF1dGhkaWdlc3Rkb21haW4iPkF1dGhEaWdlc3REb21haW48L0E+PC9IMj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQXV0aERpZ2VzdERvbWFpbiA8RU0+VVJJIFVSSSAuLi48L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBkaXJlY3RvcnksIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IEF1dGhDb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9hdXRoX2RpZ2VzdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBBdmFpbGFibGUgaW4gQXBhY2hlIDEuMy44IGFuZCBsYXRlcgotCi08UD5UaGUgQXV0aERpZ2VzdERvbWFpbiBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIFVSSXMKLXdoaWNoIGFyZSBpbiB0aGUgc2FtZSBwcm90ZWN0aW9uIHNwYWNlIChpLmUuIHVzZSB0aGUgc2FtZSByZWFsbSBhbmQKLXVzZXJuYW1lL3Bhc3N3b3JkIGluZm8pLiBUaGUgc3BlY2lmaWVkIFVSSXMgYXJlIHByZWZpeGVzLCBpLmUuIHRoZSBjbGllbnQKLXdpbGwgYXNzdW1lIHRoYXQgYWxsIFVSSXMgImJlbG93IiB0aGVzZSBhcmUgYWxzbyBwcm90ZWN0ZWQgYnkgdGhlIHNhbWUKLXVzZXJuYW1lL3Bhc3N3b3JkLiBUaGUgVVJJcyBtYXkgYmUgZWl0aGVyIGFic29sdXRlIFVSSXMgKGkuZS4gaW5sdWRpbmcgYQotc2NoZW1lLCBob3N0LCBwb3J0LCBldGMpIG9yIHJlbGF0aXZlIFVSSXMuCi0KLTxQPlRoaXMgZGlyZWN0aXZlIDxlbT5zaG91bGQ8L2VtPiBhbHdheXMgYmUgc3BlY2lmaWVkIGFuZCBjb250YWluIGF0IGxlYXN0Ci10aGUgKHNldCBvZikgcm9vdCBVUkkocykgZm9yIHRoaXMgc3BhY2UuIE9taXR0aW5nIHRvIGRvIHNvIHdpbGwgY2F1c2UgdGhlCi1jbGllbnQgdG8gc2VuZCB0aGUgQXV0aG9yaXphdGlvbiBoZWFkZXIgZm9yIDxlbT5ldmVyeSByZXF1ZXN0PC9lbT4gc2VudCB0bwotdGhpcyBzZXJ2ZXIuIEFwYXJ0IGZyb20gaW5jcmVhc2luZyB0aGUgc2l6ZSBvZiB0aGUgcmVxdWVzdCwgaXQgbWF5IGFsc28KLWhhdmUgYSBkZXRyaW1lbnRhbCBlZmZlY3Qgb24gcGVyZm9ybWFuY2UgaWYgIkF1dGhEaWdlc3ROY0NoZWNrIiBpcyBvbi4KLQotPFA+VGhlIFVSSXMgc3BlY2lmaWVkIGNhbiBhbHNvIHBvaW50IHRvIGRpZmZlcmVudCBzZXJ2ZXJzLCBpbiB3aGljaCBjYXNlCi1jbGllbnRzICh3aGljaCB1bmRlcnN0YW5kIHRoaXMpIHdpbGwgdGhlbiBzaGFyZSB1c2VybmFtZS9wYXNzd29yZCBpbmZvCi1hY3Jvc3MgbXVsdGlwbGUgc2VydmVycyB3aXRob3V0IHByb21wdGluZyB0aGUgdXNlciBlYWNoIHRpbWUuCi0KLQotPEhSPgotCi08SDM+PEEgTkFNRT0idXNpbmdkaWdlc3QiPlVzaW5nIERpZ2VzdCBBdXRoZW50aWNhdGlvbjwvQT48L0gzPgotCi08UD5Vc2luZyBNRDUgRGlnZXN0IGF1dGhlbnRpY2F0aW9uIGlzIHZlcnkgc2ltcGxlLiBTaW1wbHkgc2V0IHVwCi1hdXRoZW50aWNhdGlvbiBub3JtYWxseSwgdXNpbmcgIkF1dGhUeXBlIERpZ2VzdCIgYW5kICJBdXRoRGlnZXN0RmlsZSIKLWluc3RlYWQgb2YgdGhlIG5vcm1hbCAiQXV0aFR5cGUgQmFzaWMiIGFuZCAiQXV0aFVzZXJGaWxlIjsgYWxzbywKLXJlcGxhY2UgYW55ICJBdXRoR3JvdXBGaWxlIiB3aXRoICJBdXRoRGlnZXN0R3JvdXBGaWxlIi4gVGhlbiBhZGQgYQotIkF1dGhEaWdlc3REb21haW4iIGRpcmVjdGl2ZSBjb250YWluaW5nIGF0IGxlYXN0IHRoZSByb290IFVSSShzKSBmb3IKLXRoaXMgcHJvdGVjdGlvbiBzcGFjZS4gRXhhbXBsZToKLQotPFBSRT4KLSAgJmx0O0xvY2F0aW9uIC9wcml2YXRlLyZndDsKLSAgQXV0aFR5cGUgRGlnZXN0Ci0gIEF1dGhOYW1lICJwcml2YXRlIGFyZWEiCi0gIEF1dGhEaWdlc3REb21haW4gL3ByaXZhdGUvIGh0dHA6Ly9taXJyb3IubXkuZG9tL3ByaXZhdGUyLwotICBBdXRoRGlnZXN0RmlsZSAvd2ViL2F1dGgvLmRpZ2VzdF9wdwotICByZXF1aXJlIHZhbGlkLXVzZXIKLSAgJmx0Oy9Mb2NhdGlvbiZndDsKLTwvUFJFPgotCi08UD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IE1ENSBhdXRoZW50aWNhdGlvbiBwcm92aWRlcyBhIG1vcmUgc2VjdXJlCi1wYXNzd29yZCBzeXN0ZW0gdGhhbiBCYXNpYyBhdXRoZW50aWNhdGlvbiwgYnV0IG9ubHkgd29ya3Mgd2l0aCBzdXBwb3J0aW5nCi1icm93c2Vycy4gQXMgb2YgdGhpcyB3cml0aW5nIChKdWx5IDE5OTkpLCB0aGUgb25seSBtYWpvciBicm93c2VycyB3aGljaAotc3VwcG9ydCBkaWdlc3QgYXV0aGVudGljYXRpb24gYXJlIDxBCi1IUkVGPSJodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vd2luZG93cy9pZS8iPkludGVybmV0IEV4cGxvcmVyIDUuMDwvQT4gYW5kCi08QSBIUkVGPSJodHRwOi8vd3d3LnczLm9yZy9BbWF5YS8iPkFtYXlhPC9BPi4gVGhlcmVmb3JlLCB3ZSBkbyBub3QKLXJlY29tbWVuZCB1c2luZyB0aGlzIGZlYXR1cmUgb24gYSBsYXJnZSBJbnRlcm5ldCBzaXRlLiBIb3dldmVyLCBmb3IKLXBlcnNvbmFsIGFuZCBpbnRyYS1uZXQgdXNlLCB3aGVyZSBicm93c2VyIHVzZXJzIGNhbiBiZSBjb250cm9sbGVkLCBpdCBpcwotaWRlYWwuCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfYXV0b2luZGV4Lmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2F1dG9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzllZDVjLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfYXV0b2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NTEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9hdXRvaW5kZXg8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5Nb2R1bGUgbW9kX2F1dG9pbmRleDwvSDE+Ci0KLVRoaXMgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbiB0aGUgPENPREU+bW9kX2F1dG9pbmRleC5jPC9DT0RFPiBmaWxlLCBhbmQKLWlzIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuIEl0IHByb3ZpZGVzIGZvciBhdXRvbWF0aWMgZGlyZWN0b3J5IGluZGV4aW5nLgotCi08SDI+U3VtbWFyeTwvSDI+Ci1UaGUgaW5kZXggb2YgYSBkaXJlY3RvcnkgY2FuIGNvbWUgZnJvbSBvbmUgb2YgdHdvIHNvdXJjZXM6Ci08VUw+Ci08TEk+QSBmaWxlIHdyaXR0ZW4gYnkgdGhlIHVzZXIsIHR5cGljYWxseSBjYWxsZWQgPENPREU+aW5kZXguaHRtbDwvQ09ERT4uCi1UaGUgPEEgSFJFRj0ibW9kX2Rpci5odG1sI2RpcmVjdG9yeWluZGV4Ij5EaXJlY3RvcnlJbmRleDwvQT4gZGlyZWN0aXZlIHNldHMKLXRoZSBuYW1lIG9mIHRoaXMgZmlsZS4KLVRoaXMgaXMgY29udHJvbGxlZCBieSA8QSBIUkVGPSJtb2RfZGlyLmh0bWwiPjxDT0RFPm1vZF9kaXI8L0NPREU+PC9BPi4KLTxMST5PdGhlcndpc2UsIGEgbGlzdGluZyBnZW5lcmF0ZWQgYnkgdGhlIHNlcnZlci4gVGhlIG90aGVyIGRpcmVjdGl2ZXMKLWNvbnRyb2wgdGhlIGZvcm1hdCBvZiB0aGlzIGxpc3RpbmcuIFRoZSA8QSBIUkVGPSIjYWRkaWNvbiI+QWRkSWNvbjwvQT4sCi08QSBIUkVGPSIjYWRkaWNvbmJ5ZW5jb2RpbmciPkFkZEljb25CeUVuY29kaW5nPC9BPiBhbmQKLTxBIEhSRUY9IiNhZGRpY29uYnl0eXBlIj5BZGRJY29uQnlUeXBlPC9BPiBhcmUgdXNlZCB0byBzZXQgYSBsaXN0IG9mCi1pY29ucyB0byBkaXNwbGF5IGZvciB2YXJpb3VzIGZpbGUgdHlwZXM7IGZvciBlYWNoIGZpbGUgbGlzdGVkLCB0aGUKLWZpcnN0IGljb24gbGlzdGVkIHRoYXQgbWF0Y2hlcyB0aGUgZmlsZSBpcyBkaXNwbGF5ZWQuICBUaGVzZQotYXJlIGNvbnRyb2xsZWQgYnkgPENPREU+bW9kX2F1dG9pbmRleDwvQ09ERT4uCi08L1VMPgotVGhlIHR3byBmdW5jdGlvbnMgYXJlIHNlcGFyYXRlZCBzbyB0aGF0IHlvdSBjYW4gY29tcGxldGVseSByZW1vdmUKLShvciByZXBsYWNlKSBhdXRvbWF0aWMgaW5kZXggZ2VuZXJhdGlvbiBzaG91bGQgeW91IHdhbnQgdG8uCi08UD4KLUlmCi08QQotIEhSRUY9IiNmYW5jeWluZGV4aW5nIgotPjxTQU1QPkZhbmN5SW5kZXhpbmc8L1NBTVA+PC9BPgotaXMgZW5hYmxlZCwgb3IgdGhlIDxTQU1QPkZhbmN5SW5kZXhpbmc8L1NBTVA+IGtleXdvcmQgaXMgcHJlc2VudCBvbiB0aGUKLTxBCi0gSFJFRj0iI2luZGV4b3B0aW9ucyIKLT48U0FNUD5JbmRleE9wdGlvbnM8L1NBTVA+PC9BPgotZGlyZWN0aXZlLCB0aGUgY29sdW1uIGhlYWRlcnMgYXJlIGxpbmtzIHRoYXQgY29udHJvbCB0aGUKLW9yZGVyIG9mIHRoZSBkaXNwbGF5LiAgSWYgeW91IHNlbGVjdCBhIGhlYWRlciBsaW5rLCB0aGUKLWxpc3Rpbmcgd2lsbCBiZSByZWdlbmVyYXRlZCwgc29ydGVkIGJ5IHRoZSB2YWx1ZXMgaW4gdGhhdAotY29sdW1uLiAgU2VsZWN0aW5nIHRoZSBzYW1lIGhlYWRlciByZXBlYXRlZGx5IHRvZ2dsZXMKLWJldHdlZW4gYXNjZW5kaW5nIGFuZCBkZXNjZW5kaW5nIG9yZGVyLgotPC9QPgotPFA+Ci1Ob3RlIHRoYXQgd2hlbiB0aGUgZGlzcGxheSBpcyBzb3J0ZWQgYnkgJnF1b3Q7U2l6ZSZxdW90OywKLWl0J3MgdGhlIDxFTT5hY3R1YWw8L0VNPiBzaXplIG9mIHRoZSBmaWxlcyB0aGF0J3MgdXNlZCwKLW5vdCB0aGUgZGlzcGxheWVkIHZhbHVlIC0gc28gYSAxMDEwLWJ5dGUgZmlsZSB3aWxsCi1hbHdheXMgYmUgZGlzcGxheWVkIGJlZm9yZSBhIDEwMTEtYnl0ZSBmaWxlIChpZiBpbiBhc2NlbmRpbmcKLW9yZGVyKSBldmVuIHRob3VnaCB0aGV5IGJvdGggYXJlIHNob3duIGFzICZxdW90OzFLJnF1b3Q7LgotPC9QPgotCi0KLTxIMj5EaXJlY3RpdmVzPC9IMj4KLQotPE1FTlU+Ci08TEk+PEEgSFJFRj0iI2FkZGFsdCI+QWRkQWx0PC9BPgotPExJPjxBIEhSRUY9IiNhZGRhbHRieWVuY29kaW5nIj5BZGRBbHRCeUVuY29kaW5nPC9BPgotPExJPjxBIEhSRUY9IiNhZGRhbHRieXR5cGUiPkFkZEFsdEJ5VHlwZTwvQT4KLTxMST48QSBIUkVGPSIjYWRkZGVzY3JpcHRpb24iPkFkZERlc2NyaXB0aW9uPC9BPgotPExJPjxBIEhSRUY9IiNhZGRpY29uIj5BZGRJY29uPC9BPgotPExJPjxBIEhSRUY9IiNhZGRpY29uYnllbmNvZGluZyI+QWRkSWNvbkJ5RW5jb2Rpbmc8L0E+Ci08TEk+PEEgSFJFRj0iI2FkZGljb25ieXR5cGUiPkFkZEljb25CeVR5cGU8L0E+Ci08TEk+PEEgSFJFRj0iI2RlZmF1bHRpY29uIj5EZWZhdWx0SWNvbjwvQT4KLTxMST48QSBIUkVGPSIjZmFuY3lpbmRleGluZyI+RmFuY3lJbmRleGluZzwvQT4KLTxMST48QSBIUkVGPSIjaGVhZGVybmFtZSI+SGVhZGVyTmFtZTwvQT4KLTxMST48QSBIUkVGPSIjaW5kZXhpZ25vcmUiPkluZGV4SWdub3JlPC9BPgotPExJPjxBIEhSRUY9IiNpbmRleG9wdGlvbnMiPkluZGV4T3B0aW9uczwvQT4KLTxMST48QSBIUkVGPSIjaW5kZXhvcmRlcmRlZmF1bHQiPkluZGV4T3JkZXJEZWZhdWx0PC9BPgotPExJPjxBIEhSRUY9IiNyZWFkbWVuYW1lIj5SZWFkbWVOYW1lPC9BPgotPC9NRU5VPgotPEhSPgotCi08SDI+PEEgTkFNRT0iYWRkYWx0Ij5BZGRBbHQ8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBBZGRBbHR9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEFkZEFsdCA8RU0+c3RyaW5nIGZpbGUgZmlsZS4uLjwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LAotICAgIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IEluZGV4ZXM8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9hdXRvaW5kZXg8UD4KLQotVGhpcyBzZXRzIHRoZSBhbHRlcm5hdGUgdGV4dCB0byBkaXNwbGF5IGZvciBhIGZpbGUsIGluc3RlYWQgb2YgYW4gaWNvbiwgZm9yCi08QSBIUkVGPSIjZmFuY3lpbmRleGluZyI+RmFuY3lJbmRleGluZzwvQT4uIDxFTT5GaWxlPC9FTT4gaXMgYSBmaWxlCi1leHRlbnNpb24sIHBhcnRpYWwgZmlsZW5hbWUsIHdpbGQtY2FyZCBleHByZXNzaW9uIG9yIGZ1bGwgZmlsZW5hbWUgZm9yIGZpbGVzCi10byBkZXNjcmliZS4gPEVNPlN0cmluZzwvRU0+IGlzIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMKLSg8Q09ERT4mcXVvdDs8L0NPREU+KS4gIFRoaXMgYWx0ZXJuYXRlIHRleHQgaXMgZGlzcGxheWVkIGlmIHRoZSBjbGllbnQgaXMKLWltYWdlLWluY2FwYWJsZSBvciBoYXMgaW1hZ2UgbG9hZGluZyBkaXNhYmxlZC4KLQotPEhSPgotPEgyPjxBIE5BTUU9ImFkZGFsdGJ5ZW5jb2RpbmciPkFkZEFsdEJ5RW5jb2Rpbmc8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBBZGRBbHRCeUVuY29kaW5nfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBBZGRBbHRCeUVuY29kaW5nIDxFTT5zdHJpbmcgTUlNRS1lbmNvZGluZwotICAgIE1JTUUtZW5jb2RpbmcuLi48L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwKLSAgICAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBJbmRleGVzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfYXV0b2luZGV4PFA+Ci0KLVRoaXMgc2V0cyB0aGUgYWx0ZXJuYXRlIHRleHQgdG8gZGlzcGxheSBmb3IgYSBmaWxlLCBpbnN0ZWFkIG9mIGFuIGljb24sIGZvcgotPEEgSFJFRj0iI2ZhbmN5aW5kZXhpbmciPkZhbmN5SW5kZXhpbmc8L0E+LiA8RU0+TUlNRS1lbmNvZGluZzwvRU0+IGlzIGEKLXZhbGlkIGNvbnRlbnQtZW5jb2RpbmcsIHN1Y2ggYXMgPFNBTVA+eC1jb21wcmVzczwvU0FNUD4uCi08RU0+U3RyaW5nPC9FTT4gaXMgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlcwotKDxDT0RFPiZxdW90OzwvQ09ERT4pLiAgVGhpcyBhbHRlcm5hdGUgdGV4dCBpcyBkaXNwbGF5ZWQgaWYgdGhlIGNsaWVudCBpcwotaW1hZ2UtaW5jYXBhYmxlIG9yIGhhcyBpbWFnZSBsb2FkaW5nIGRpc2FibGVkLgotCi08SFI+Ci08SDI+PEEgTkFNRT0iYWRkYWx0Ynl0eXBlIj5BZGRBbHRCeVR5cGU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBBZGRBbHRCeVR5cGV9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEFkZEFsdEJ5VHlwZSA8RU0+c3RyaW5nIE1JTUUtdHlwZSBNSU1FLXR5cGUKLSAgICAuLi48L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwKLSAgICAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBJbmRleGVzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfYXV0b2luZGV4PFA+Ci0KLVRoaXMgc2V0cyB0aGUgYWx0ZXJuYXRlIHRleHQgdG8gZGlzcGxheSBmb3IgYSBmaWxlLCBpbnN0ZWFkIG9mIGFuIGljb24sIGZvcgotPEEgSFJFRj0iI2ZhbmN5aW5kZXhpbmciPkZhbmN5SW5kZXhpbmc8L0E+LiA8RU0+TUlNRS10eXBlPC9FTT4gaXMgYQotdmFsaWQgY29udGVudC10eXBlLCBzdWNoIGFzIDxTQU1QPnRleHQvaHRtbDwvU0FNUD4uCi08RU0+U3RyaW5nPC9FTT4gaXMgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlcwotKDxDT0RFPiZxdW90OzwvQ09ERT4pLiAgVGhpcyBhbHRlcm5hdGUgdGV4dCBpcyBkaXNwbGF5ZWQgaWYgdGhlIGNsaWVudCBpcwotaW1hZ2UtaW5jYXBhYmxlIG9yIGhhcyBpbWFnZSBsb2FkaW5nIGRpc2FibGVkLgotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJhZGRkZXNjcmlwdGlvbiI+QWRkRGVzY3JpcHRpb248L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBBZGREZXNjcmlwdGlvbn0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQWRkRGVzY3JpcHRpb24gPEVNPnN0cmluZyBmaWxlIGZpbGUuLi48L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwKLSAgICAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBJbmRleGVzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfYXV0b2luZGV4PFA+Ci0KLVRoaXMgc2V0cyB0aGUgZGVzY3JpcHRpb24gdG8gZGlzcGxheSBmb3IgYSBmaWxlLCBmb3IKLTxBIEhSRUY9IiNmYW5jeWluZGV4aW5nIj5GYW5jeUluZGV4aW5nPC9BPi4gPEVNPkZpbGU8L0VNPiBpcyBhIGZpbGUKLWV4dGVuc2lvbiwgcGFydGlhbCBmaWxlbmFtZSwgd2lsZC1jYXJkIGV4cHJlc3Npb24gb3IgZnVsbCBmaWxlbmFtZSBmb3IgZmlsZXMKLXRvIGRlc2NyaWJlLiA8RU0+U3RyaW5nPC9FTT4gaXMgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlcwotKDxDT0RFPiZxdW90OzwvQ09ERT4pLiBFeGFtcGxlOgotPEJMT0NLUVVPVEU+PENPREU+QWRkRGVzY3JpcHRpb24gIlRoZSBwbGFuZXQgTWFycyIgL3dlYi9waWNzL21hcnMuZ2lmCi08L0NPREU+PC9CTE9DS1FVT1RFPgotPFA+Ci1UaGUgZGVzY3JpcHRpb24gZmllbGQgaXMgMjMgYnl0ZXMgd2lkZS4gIDcgbW9yZSBieXRlcyBtYXkgYmUKLWFkZGVkIGlmIHRoZSBkaXJlY3RvcnkgaXMgY292ZXJlZCBieSBhbgotPENPREU+SW5kZXhPcHRpb25zJm5ic3A7U3VwcHJlc3NTaXplPC9DT0RFPiwgYW5kIDE5IGJ5dGVzIG1heSBiZQotYWRkZWQgaWYgPENPREU+SW5kZXhPcHRpb25zJm5ic3A7U3VwcHJlc3NMYXN0TW9kaWZpZWQ8L0NPREU+IGlzCi1pbiBlZmZlY3QuICBUaGUgd2lkZXN0IHRoaXMgY29sdW1uIGNhbiBiZSBpcyB0aGVyZWZvcmUgNDkgYnl0ZXMuCi08YmxvY2txdW90ZT4KLUFzIG9mIEFwYWNoZSAxLjMuMTAsIHRoZQotPGEgaHJlZj0iI2luZGV4b3B0aW9uczpkZXNjcmlwdGlvbndpZHRoIj5EZXNjcmlwdGlvbldpZHRoPC9hPgotPHNhbXA+SW5kZXhPcHRpb25zPC9zYW1wPiBrZXl3b3JkIGFsbG93cyB5b3UgdG8gYWRqdXN0IHRoaXMgd2lkdGgKLXRvIGFueSBhcmJpdHJhcnkgc2l6ZS4KLTwvYmxvY2txdW90ZT4KLTxiPkNhdXRpb246PC9iPiBEZXNjcmlwdGl2ZSB0ZXh0IGRlZmluZWQgd2l0aCA8c2FtcD5BZGREZXNjcmlwdGlvbjwvc2FtcD4KLW1heSBjb250YWluIEhUTUwgbWFya3VwLCBzdWNoIGFzIHRhZ3MgYW5kIGNoYXJhY3RlciBlbnRpdGllcy4gIElmIHRoZQotd2lkdGggb2YgdGhlIGRlc2NyaXB0aW9uIGNvbHVtbiBzaG91bGQgaGFwcGVuIHRvIHRydW5jYXRlIGEgdGFnZ2VkCi1lbGVtZW50IChzdWNoIGFzIGN1dHRpbmcgb2ZmIHRoZSBlbmQgb2YgYSBib2xkZWQgcGhyYXNlKSwgdGhlIHJlc3VsdHMKLW1heSBhZmZlY3QgdGhlIHJlc3Qgb2YgdGhlIGRpcmVjdG9yeSBsaXN0aW5nLgotPC9QPgotPEhSPgotCi08SDI+PEEgTkFNRT0iYWRkaWNvbiI+QWRkSWNvbjwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEFkZEljb259IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEFkZEljb24gPEVNPmljb24gbmFtZSBuYW1lIC4uLjwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LAotICAgIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IEluZGV4ZXM8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9hdXRvaW5kZXg8UD4KLQotVGhpcyBzZXRzIHRoZSBpY29uIHRvIGRpc3BsYXkgbmV4dCB0byBhIGZpbGUgZW5kaW5nIGluIDxFTT5uYW1lPC9FTT4gZm9yCi08QSBIUkVGPSIjZmFuY3lpbmRleGluZyI+RmFuY3lJbmRleGluZzwvQT4uIDxFTT5JY29uPC9FTT4gaXMgZWl0aGVyIGEKLSglLWVzY2FwZWQpIHJlbGF0aXZlIFVSTCB0byB0aGUgaWNvbiwgb3Igb2YgdGhlIGZvcm1hdAotKDxFTT5hbHR0ZXh0PC9FTT4sPEVNPnVybDwvRU0+KSB3aGVyZSA8RU0+YWx0dGV4dDwvRU0+IGlzIHRoZSB0ZXh0IHRhZyBnaXZlbgotZm9yIGFuIGljb24gZm9yIG5vbi1ncmFwaGljYWwgYnJvd3NlcnMuPFA+Ci0KLTxFTT5OYW1lPC9FTT4gaXMgZWl0aGVyIF5eRElSRUNUT1JZXl4gZm9yIGRpcmVjdG9yaWVzLCBeXkJMQU5LSUNPTl5eIGZvcgotYmxhbmsgbGluZXMgKHRvIGZvcm1hdCB0aGUgbGlzdCBjb3JyZWN0bHkpLCBhIGZpbGUgZXh0ZW5zaW9uLCBhIHdpbGRjYXJkCi1leHByZXNzaW9uLCBhIHBhcnRpYWwgZmlsZW5hbWUgb3IgYSBjb21wbGV0ZSBmaWxlbmFtZS4gRXhhbXBsZXM6Ci08QkxPQ0tRVU9URT48Q09ERT4KLUFkZEljb24gKElNRywvaWNvbnMvaW1hZ2UueGJtKSAuZ2lmIC5qcGcgLnhibSA8QlI+Ci1BZGRJY29uIC9pY29ucy9kaXIueGJtIF5eRElSRUNUT1JZXl4gPEJSPgotQWRkSWNvbiAvaWNvbnMvYmFja3VwLnhibSAqfgotPC9DT0RFPjwvQkxPQ0tRVU9URT4KLTxBIEhSRUY9IiNhZGRpY29uYnl0eXBlIj5BZGRJY29uQnlUeXBlPC9BPiBzaG91bGQgYmUgdXNlZCBpbiBwcmVmZXJlbmNlIHRvCi1BZGRJY29uLCB3aGVuIHBvc3NpYmxlLjxQPjxIUj4KLQotPEgyPjxBIE5BTUU9ImFkZGljb25ieWVuY29kaW5nIj5BZGRJY29uQnlFbmNvZGluZzwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEFkZEljb25CeUVuY29kaW5nfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBBZGRJY29uQnlFbmNvZGluZyA8RU0+aWNvbiBNSU1FLWVuY29kaW5nCi0gICAgTUlNRS1lbmNvZGluZyAuLi48L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwKLSAgICAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBJbmRleGVzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfYXV0b2luZGV4PFA+Ci0KLVRoaXMgc2V0cyB0aGUgaWNvbiB0byBkaXNwbGF5IG5leHQgdG8gZmlsZXMgd2l0aAotPEVNPk1JTUUtZW5jb2Rpbmc8L0VNPiBmb3IgPEEgSFJFRj0iI2ZhbmN5aW5kZXhpbmciPkZhbmN5SW5kZXhpbmc8L0E+LgotPEVNPkljb248L0VNPiBpcyBlaXRoZXIgYSAoJS1lc2NhcGVkKSByZWxhdGl2ZSBVUkwgdG8gdGhlIGljb24sIG9yIG9mIHRoZQotZm9ybWF0ICg8RU0+YWx0dGV4dDwvRU0+LDxFTT51cmw8L0VNPikgd2hlcmUgPEVNPmFsdHRleHQ8L0VNPiBpcyB0aGUgdGV4dCB0YWcKLWdpdmVuIGZvciBhbiBpY29uIGZvciBub24tZ3JhcGhpY2FsIGJyb3dzZXJzLjxQPgotCi08RU0+TWltZS1lbmNvZGluZzwvRU0+IGlzIGEgd2lsZGNhcmQgZXhwcmVzc2lvbiBtYXRjaGluZyByZXF1aXJlZCB0aGUKLWNvbnRlbnQtZW5jb2RpbmcuIEV4YW1wbGVzOgotPEJMT0NLUVVPVEU+PENPREU+Ci1BZGRJY29uQnlFbmNvZGluZyAvaWNvbnMvY29tcHJlc3MueGJtIHgtY29tcHJlc3MKLTwvQ09ERT48L0JMT0NLUVVPVEU+PFA+PEhSPgotCi08SDI+PEEgTkFNRT0iYWRkaWNvbmJ5dHlwZSI+QWRkSWNvbkJ5VHlwZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEFkZEljb25CeVR5cGV9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEFkZEljb25CeVR5cGUgPEVNPmljb24gTUlNRS10eXBlIE1JTUUtdHlwZQotICAgIC4uLjwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LAotICAgIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IEluZGV4ZXM8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9hdXRvaW5kZXg8UD4KLQotVGhpcyBzZXRzIHRoZSBpY29uIHRvIGRpc3BsYXkgbmV4dCB0byBmaWxlcyBvZiB0eXBlIDxFTT5NSU1FLXR5cGU8L0VNPiBmb3IKLTxBIEhSRUY9IiNmYW5jeWluZGV4aW5nIj5GYW5jeUluZGV4aW5nPC9BPi4gPEVNPkljb248L0VNPiBpcyBlaXRoZXIgYQotKCUtZXNjYXBlZCkgcmVsYXRpdmUgVVJMIHRvIHRoZSBpY29uLCBvciBvZiB0aGUgZm9ybWF0Ci0oPEVNPmFsdHRleHQ8L0VNPiw8RU0+dXJsPC9FTT4pIHdoZXJlIDxFTT5hbHR0ZXh0PC9FTT4gaXMgdGhlIHRleHQgdGFnIGdpdmVuCi1mb3IgYW4gaWNvbiBmb3Igbm9uLWdyYXBoaWNhbCBicm93c2Vycy48UD4KLTxFTT5NaW1lLXR5cGU8L0VNPiBpcyBhIHdpbGRjYXJkIGV4cHJlc3Npb24gbWF0Y2hpbmcgcmVxdWlyZWQgdGhlIG1pbWUgdHlwZXMuCi1FeGFtcGxlczoKLTxCTE9DS1FVT1RFPjxDT0RFPgotQWRkSWNvbkJ5VHlwZSAoSU1HLC9pY29ucy9pbWFnZS54Ym0pIGltYWdlLyoKLTwvQ09ERT48L0JMT0NLUVVPVEU+PFA+PEhSPgotCi08SDI+PEEgTkFNRT0iZGVmYXVsdGljb24iPkRlZmF1bHRJY29uPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgRGVmYXVsdEljb259IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IERlZmF1bHRJY29uIDxFTT51cmw8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwKLSAgICAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBJbmRleGVzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfYXV0b2luZGV4PFA+Ci0KLVRoZSBEZWZhdWx0SWNvbiBkaXJlY3RpdmUgc2V0cyB0aGUgaWNvbiB0byBkaXNwbGF5IGZvciBmaWxlcyB3aGVuIG5vCi1zcGVjaWZpYyBpY29uIGlzIGtub3duLCBmb3IgPEEgSFJFRj0iI2ZhbmN5aW5kZXhpbmciPkZhbmN5SW5kZXhpbmc8L0E+LgotPEVNPlVybDwvRU0+IGlzIGEgKCUtZXNjYXBlZCkgcmVsYXRpdmUgVVJMIHRvIHRoZSBpY29uLiBFeGFtcGxlczoKLTxCTE9DS1FVT1RFPjxDT0RFPgotRGVmYXVsdEljb24gL2ljb24vdW5rbm93bi54Ym0KLTwvQ09ERT48L0JMT0NLUVVPVEU+PFA+PEhSPgotCi08SDI+PEEgTkFNRT0iZmFuY3lpbmRleGluZyI+RmFuY3lJbmRleGluZzwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEZhbmN5SW5kZXhpbmd9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEZhbmN5SW5kZXhpbmcgPEVNPmJvb2xlYW48L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwKLSAgICAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBJbmRleGVzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfYXV0b2luZGV4Ci08UD4KLVRoZSBGYW5jeUluZGV4aW5nIGRpcmVjdGl2ZSBzZXRzIHRoZSBGYW5jeUluZGV4aW5nIG9wdGlvbiBmb3IgYSBkaXJlY3RvcnkuCi08RU0+Qm9vbGVhbjwvRU0+IGNhbiBiZSA8Q09ERT5vbjwvQ09ERT4gb3IgPENPREU+b2ZmPC9DT0RFPi4gVGhlCi08QSBIUkVGPSIjaW5kZXhvcHRpb25zIj5JbmRleE9wdGlvbnM8L0E+IGRpcmVjdGl2ZSBzaG91bGQgYmUgdXNlZCBpbgotcHJlZmVyZW5jZS4KLTwvUD4KLTxCTE9DS1FVT1RFPgotIDxTVFJPTkc+Tm90ZSB0aGF0IGluIHZlcnNpb25zIG9mIEFwYWNoZSBwcmlvciB0byAxLjMuMiwgdGhlCi0gPFNBTVA+RmFuY3lJbmRleGluZzwvU0FNUD4gYW5kCi0gPFNBTVA+SW5kZXhPcHRpb25zPC9TQU1QPiBkaXJlY3RpdmVzIHdpbGwgb3ZlcnJpZGUgZWFjaCBvdGhlci4gWW91Ci0gc2hvdWxkIHVzZSA8U0FNUD5JbmRleE9wdGlvbnMmbmJzcDtGYW5jeUluZGV4aW5nPC9TQU1QPiBpbiBwcmVmZXJlbmNlCi0gdG8gdGhlIHN0YW5kYWxvbmUgPFNBTVA+RmFuY3lJbmRleGluZzwvU0FNUD4gZGlyZWN0aXZlLgotIEFzIG9mIEFwYWNoZSAxLjMuMiwgYSBzdGFuZGFsb25lIDxTQU1QPkZhbmN5SW5kZXhpbmc8L1NBTVA+IGRpcmVjdGl2ZQotIGlzIGNvbWJpbmVkIHdpdGggYW55IDxTQU1QPkluZGV4T3B0aW9uczwvU0FNUD4gZGlyZWN0aXZlIGFscmVhZHkKLSBzcGVjaWZpZWQgZm9yIHRoZSBjdXJyZW50IHNjb3BlLjwvU1RST05HPgotPC9CTE9DS1FVT1RFPgotPEhSPgotCi08SDI+PEEgTkFNRT0iaGVhZGVybmFtZSI+SGVhZGVyTmFtZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEhlYWRlck5hbWV9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEhlYWRlck5hbWUgPEVNPmZpbGVuYW1lPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksCi0gICAgLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gSW5kZXhlczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2F1dG9pbmRleAotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBzb21lIGZlYXR1cmVzIG9ubHkgYXZhaWxhYmxlIGFmdGVyCi0gMS4zLjY7IHNlZSB0ZXh0Ci0KLTxQPgotVGhlIEhlYWRlck5hbWUgZGlyZWN0aXZlIHNldHMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCB3aWxsIGJlIGluc2VydGVkCi1hdCB0aGUgdG9wIG9mIHRoZSBpbmRleCBsaXN0aW5nLiA8RU0+RmlsZW5hbWU8L0VNPiBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZQotdG8gaW5jbHVkZS4KLTwvUD4KLTxCTE9DS1FVT1RFPjxTVFJPTkc+QXBhY2hlIDEuMy42IGFuZCBlYXJsaWVyOjwvU1RST05HPgotVGhlIG1vZHVsZSBmaXJzdCBhdHRlbXB0cyB0byBpbmNsdWRlIDxFTT5maWxlbmFtZTwvRU0+PENPREU+Lmh0bWw8L0NPREU+Ci1hcyBhbiBIVE1MIGRvY3VtZW50LCBvdGhlcndpc2UgaXQgd2lsbCB0cnkgdG8gaW5jbHVkZSA8RU0+ZmlsZW5hbWU8L0VNPiBhcwotcGxhaW4gdGV4dC4gIDxFTT5GaWxlbmFtZTwvRU0+IGlzIHRyZWF0ZWQgYXMgYSBmaWxlc3lzdGVtIHBhdGggcmVsYXRpdmUKLXRvIHRoZSBkaXJlY3RvcnkgYmVpbmcgaW5kZXhlZC4gIEluIG5vIGNhc2UgaXMgU1NJIHByb2Nlc3NpbmcgZG9uZS4KLUV4YW1wbGU6Ci08QkxPQ0tRVU9URT48Q09ERT5IZWFkZXJOYW1lIEhFQURFUjwvQ09ERT48L0JMT0NLUVVPVEU+Ci13aGVuIGluZGV4aW5nIHRoZSBkaXJlY3RvcnkgPENPREU+L3dlYjwvQ09ERT4sIHRoZSBzZXJ2ZXIgd2lsbCBmaXJzdCBsb29rIGZvcgotdGhlIEhUTUwgZmlsZSA8Q09ERT4vd2ViL0hFQURFUi5odG1sPC9DT0RFPiBhbmQgaW5jbHVkZSBpdCBpZiBmb3VuZCwgb3RoZXJ3aXNlCi1pdCB3aWxsIGluY2x1ZGUgdGhlIHBsYWluIHRleHQgZmlsZSA8Q09ERT4vd2ViL0hFQURFUjwvQ09ERT4sIGlmIGl0IGV4aXN0cy4KLTwvQkxPQ0tRVU9URT4KLTxCTE9DS1FVT1RFPjxTVFJPTkc+QXBhY2hlIHZlcnNpb25zIGFmdGVyIDEuMy42OjwvU1RST05HPgotPEVNPkZpbGVuYW1lPC9FTT4gaXMgdHJlYXRlZCBhcyBhIFVSSSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBvbmUgdXNlZAotdG8gYWNjZXNzIHRoZSBkaXJlY3RvcnkgYmVpbmcgaW5kZXhlZCwgYW5kIG11c3QgcmVzb2x2ZSB0byBhIGRvY3VtZW50Ci13aXRoIGEgbWFqb3IgY29udGVudCB0eXBlIG9mICI8U0FNUD50ZXh0PC9TQU1QPiIgKDxFTT5lLmcuPC9FTT4sCi08U0FNUD50ZXh0L2h0bWw8L1NBTVA+LCA8U0FNUD50ZXh0L3BsYWluPC9TQU1QPiwgPEVNPmV0Yy48L0VNPikuCi1UaGlzIG1lYW5zIHRoYXQgPEVNPmZpbGVuYW1lPC9FTT4gbWF5IHJlZmVyIHRvIGEgQ0dJIHNjcmlwdCBpZiB0aGUKLXNjcmlwdCdzIGFjdHVhbCBmaWxlIHR5cGUgKGFzIG9wcG9zZWQgdG8gaXRzIG91dHB1dCkgaXMgbWFya2VkIGFzCi08U0FNUD50ZXh0L2h0bWw8L1NBTVA+IHN1Y2ggYXMgd2l0aCBhIGRpcmVjdGl2ZSBsaWtlOgotPFBSRT4KLSAgICBBZGRUeXBlIHRleHQvaHRtbCAuY2dpCi08L1BSRT4KLTxBIEhSRUY9Ii4uL2NvbnRlbnQtbmVnb3RpYXRpb24uaHRtbCI+Q29udGVudCBuZWdvdGlhdGlvbjwvQT4KLXdpbGwgYmUgcGVyZm9ybWVkIGlmIHRoZSA8U0FNUD5NdWx0aVZpZXdzPC9TQU1QPgotPEEgSFJFRj0iY29yZS5odG1sI29wdGlvbnMiPm9wdGlvbjwvQT4gaXMgZW5hYmxlZC4KLUlmIDxFTT5maWxlbmFtZTwvRU0+IHJlc29sdmVzIHRvIGEgc3RhdGljIDxTQU1QPnRleHQvaHRtbDwvU0FNUD4gZG9jdW1lbnQKLShub3QgYSBDR0kgc2NyaXB0KSBhbmQgdGhlCi08U0FNUD5JbmNsdWRlczwvU0FNUD4gPEEgSFJFRj0iY29yZS5odG1sI29wdGlvbnMiPm9wdGlvbjwvQT4gaXMgZW5hYmxlZCwKLXRoZSBmaWxlIHdpbGwgYmUgcHJvY2Vzc2VkIGZvciBzZXJ2ZXItc2lkZSBpbmNsdWRlcyAoc2VlIHRoZQotPEEgSFJFRj0ibW9kX2luY2x1ZGUuaHRtbCI+PFNBTVA+bW9kX2luY2x1ZGU8L1NBTVA+PC9BPiBkb2N1bWVudGF0aW9uKS4KLTwvQkxPQ0tRVU9URT4KLTxQPgotU2VlIGFsc28gPEEgSFJFRj0iI3JlYWRtZW5hbWUiPlJlYWRtZU5hbWU8L0E+LgotPFA+PEhSPgotCi08SDI+PEEgTkFNRT0iaW5kZXhpZ25vcmUiPkluZGV4SWdub3JlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgSW5kZXhJZ25vcmV9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEluZGV4SWdub3JlIDxFTT5maWxlIGZpbGUgLi4uPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksCi0gICAgLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gSW5kZXhlczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2F1dG9pbmRleDxQPgotCi1UaGUgSW5kZXhJZ25vcmUgZGlyZWN0aXZlIGFkZHMgdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gaGlkZSB3aGVuIGxpc3RpbmcKLWEgZGlyZWN0b3J5LiA8RU0+RmlsZTwvRU0+IGlzIGEgZmlsZSBleHRlbnNpb24sIHBhcnRpYWwgZmlsZW5hbWUsCi13aWxkY2FyZCBleHByZXNzaW9uIG9yIGZ1bGwgZmlsZW5hbWUgZm9yIGZpbGVzIHRvIGlnbm9yZS4gTXVsdGlwbGUKLUluZGV4SWdub3JlIGRpcmVjdGl2ZXMgYWRkIHRvIHRoZSBsaXN0LCByYXRoZXIgdGhhbiB0aGUgcmVwbGFjaW5nIHRoZSBsaXN0Ci1vZiBpZ25vcmVkIGZpbGVzLiBCeSBkZWZhdWx0LCB0aGUgbGlzdCBjb250YWlucyBgPENPREU+LjwvQ09ERT4nLiBFeGFtcGxlOgotPEJMT0NLUVVPVEU+PENPREU+Ci1JbmRleElnbm9yZSBSRUFETUUgLmh0YWNjZXNzICp+Ci08L0NPREU+PC9CTE9DS1FVT1RFPjxQPjxIUj4KLQotPEgyPjxBIE5BTUU9ImluZGV4b3B0aW9ucyI+SW5kZXhPcHRpb25zPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgSW5kZXhPcHRpb25zfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBJbmRleE9wdGlvbnMgPEVNPm9wdGlvbiBvcHRpb24gLi4uPC9FTT4KLSAoQXBhY2hlIDEuMy4yIGFuZCBlYXJsaWVyKQotPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBJbmRleE9wdGlvbnMgPEVNPlsrfC1db3B0aW9uIFsrfC1db3B0aW9uCi0gLi4uPC9FTT4KLSAoQXBhY2hlIDEuMy4zIGFuZCBsYXRlcikKLTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwKLSAgICAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBJbmRleGVzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfYXV0b2luZGV4Ci08QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gJysvLScgc3ludGF4IGFuZCBtZXJnaW5nIG9mIG11bHRpcGxlCi0gPFNBTVA+SW5kZXhPcHRpb25zPC9TQU1QPiBkaXJlY3RpdmVzIGlzIG9ubHkgYXZhaWxhYmxlIHdpdGgKLSBBcGFjaGUgMS4zLjMgYW5kIGxhdGVyOyB0aGUgPHNhbXA+Rm9sZGVyc0ZpcnN0PC9zYW1wPiBhbmQKLSA8c2FtcD5EZXNjcmlwdGlvbldpZHRoPC9zYW1wPiBvcHRpb25zIGFyZSBvbmx5Ci0gYXZhaWxhYmxlIHdpdGggQXBhY2hlIDEuMy4xMCBhbmQgbGF0ZXIKLTxQPgotCi1UaGUgSW5kZXhPcHRpb25zIGRpcmVjdGl2ZSBzcGVjaWZpZXMgdGhlIGJlaGF2aW9yIG9mIHRoZSBkaXJlY3RvcnkgaW5kZXhpbmcuCi08RU0+T3B0aW9uPC9FTT4gY2FuIGJlIG9uZSBvZgotPERMPgotPGR0PjxhIG5hbWU9ImluZGV4b3B0aW9uczpkZXNjcmlwdGlvbndpZHRoIj5EZXNjcmlwdGlvbldpZHRoPVs8ZW0+bjwvZW0+IHwgKl0KLSAoPGVtPkFwYWNoZSAxLjMuMTAgYW5kIGxhdGVyPC9lbT4pPC9hPgotPGRkPgotVGhlIDxzYW1wPkRlc2NyaXB0aW9uV2lkdGg8L3NhbXA+IGtleXdvcmQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQotd2lkdGggb2YgdGhlIGRlc2NyaXB0aW9uIGNvbHVtbiBpbiBjaGFyYWN0ZXJzLiAgSWYgdGhlIGtleXdvcmQgdmFsdWUKLWlzICc8c2FtcD4qPC9zYW1wPicsIHRoZW4gdGhlIGNvbHVtbiBpcyBhdXRvbWF0aWNhbGx5IHNpemVkIHRvIHRoZQotbGVuZ3RoIG9mIHRoZSBsb25nZXN0IGZpbGVuYW1lIGluIHRoZSBkaXNwbGF5LgotPGI+U2VlIHRoZSBzZWN0aW9uIG9uIDxhIGhyZWY9IiNhZGRkZXNjcmlwdGlvbiI+PHNhbXA+QWRkRGVzY3JpcHRpb248L3NhbXA+PC9hPgotZm9yIGRhbmdlcnMgaW5oZXJlbnQgaW4gdHJ1bmNhdGluZyBkZXNjcmlwdGlvbnMuPC9iPjwvZGQ+Ci08RFQ+PEEgTkFNRT0iaW5kZXhvcHRpb25zOmZhbmN5aW5kZXhpbmciPkZhbmN5SW5kZXhpbmc8L0E+Ci08REQ+PCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEZhbmN5SW5kZXhpbmd9IGluZGV4IG9wdGlvbiZndDsgLS0+Ci1UaGlzIHR1cm5zIG9uIGZhbmN5IGluZGV4aW5nIG9mIGRpcmVjdG9yaWVzLgotPEJMT0NLUVVPVEU+Ci0gPFNUUk9ORz5Ob3RlIHRoYXQgaW4gdmVyc2lvbnMgb2YgQXBhY2hlIHByaW9yIHRvIDEuMy4yLCB0aGUKLSA8U0FNUD5GYW5jeUluZGV4aW5nPC9TQU1QPiBhbmQKLSA8U0FNUD5JbmRleE9wdGlvbnM8L1NBTVA+IGRpcmVjdGl2ZXMgd2lsbCBvdmVycmlkZSBlYWNoIG90aGVyLiBZb3UKLSBzaG91bGQgdXNlIDxTQU1QPkluZGV4T3B0aW9ucyZuYnNwO0ZhbmN5SW5kZXhpbmc8L1NBTVA+IGluIHByZWZlcmVuY2UKLSB0byB0aGUgc3RhbmRhbG9uZSA8U0FNUD5GYW5jeUluZGV4aW5nPC9TQU1QPiBkaXJlY3RpdmUuCi0gQXMgb2YgQXBhY2hlIDEuMy4yLCBhIHN0YW5kYWxvbmUgPFNBTVA+RmFuY3lJbmRleGluZzwvU0FNUD4gZGlyZWN0aXZlCi0gaXMgY29tYmluZWQgd2l0aCBhbnkgPFNBTVA+SW5kZXhPcHRpb25zPC9TQU1QPiBkaXJlY3RpdmUgYWxyZWFkeQotIHNwZWNpZmllZCBmb3IgdGhlIGN1cnJlbnQgc2NvcGUuPC9TVFJPTkc+Ci08L0JMT0NLUVVPVEU+Ci08ZHQ+PGEgbmFtZT0iaW5kZXhvcHRpb25zOmZvbGRlcnNmaXJzdCI+Rm9sZGVyc0ZpcnN0Ci0gKDxpPkFwYWNoZSAxLjMuMTAgYW5kIGxhdGVyPC9pPik8L2E+PC9kdD4KLTxkZD4KLUlmIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsIHN1YmRpcmVjdG9yaWVzIGluIGEgRmFuY3lJbmRleGVkIGxpc3RpbmcKLXdpbGwgPGk+YWx3YXlzPC9pPiBhcHBlYXIgZmlyc3QsIGZvbGxvd2VkIGJ5IG5vcm1hbCBmaWxlcyBpbiB0aGUKLWRpcmVjdG9yeS4gIFRoZSBsaXN0aW5nIGlzIGJhc2ljYWxseSBicm9rZW4gaW50byB0d28gY29tcG9uZW50cywKLXRoZSBmaWxlcyBhbmQgdGhlIHN1YmRpcmVjdG9yaWVzLCBhbmQgZWFjaCBpcyBzb3J0ZWQgc2VwYXJhdGVseSBhbmQKLXRoZW4gZGlzcGxheWVkIHN1YmRpcmVjdG9yaWVzLWZpcnN0LiAgRm9yIGluc3RhbmNlLCBpZiB0aGUgc29ydCBvcmRlcgotaXMgZGVzY2VuZGluZyBieSBuYW1lLCBhbmQgPHNhbXA+Rm9sZGVyc0ZpcnN0PC9zYW1wPiBpcyBlbmFibGVkLAotc3ViZGlyZWN0b3J5IDxzYW1wPlplZDwvc2FtcD4gd2lsbCBiZSBsaXN0ZWQgYmVmb3JlIHN1YmRpcmVjdG9yeQotPHNhbXA+QmV0YTwvc2FtcD4sIHdoaWNoIHdpbGwgYmUgbGlzdGVkIGJlZm9yZSBub3JtYWwgZmlsZXMKLTxzYW1wPkdhbW1hPC9zYW1wPiBhbmQgPHNhbXA+QWxwaGE8L3NhbXA+LgotPGI+VGhpcyBvcHRpb24gb25seSBoYXMgYW4gZWZmZWN0IGlmCi08YSBocmVmPSIjaW5kZXhvcHRpb25zOmZhbmN5aW5kZXhpbmciPjxzYW1wPkZhbmN5SW5kZXhpbmc8L3NhbXA+PC9hPgotaXMgYWxzbyBlbmFibGVkLjwvYj48L2RkPgotPERUPjxBIE5BTUU9ImluZGV4b3B0aW9uczppY29uaGVpZ2h0Ij5JY29uSGVpZ2h0Wz1waXhlbHNdICg8RU0+QXBhY2hlIDEuMyBhbmQgbGF0ZXI8L0VNPik8L0E+Ci08REQ+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgSWNvbkhlaWdodH0gaW5kZXggb3B0aW9uJmd0OyAtLT4KLVByZXNlbmNlIG9mIHRoaXMgb3B0aW9uLCB3aGVuIHVzZWQgd2l0aCBJY29uV2lkdGgsIHdpbGwgY2F1c2UgdGhlIHNlcnZlcgotdG8gaW5jbHVkZSA8U0FNUD5IRUlHSFQ8L1NBTVA+IGFuZCA8U0FNUD5XSURUSDwvU0FNUD4gYXR0cmlidXRlcyBpbiB0aGUKLTxTQU1QPklNRzwvU0FNUD4gdGFnIGZvciB0aGUgZmlsZSBpY29uLiAgVGhpcyBhbGxvd3MgYnJvd3NlciB0bwotcHJlY2FsY3VsYXRlIHRoZSBwYWdlIGxheW91dCB3aXRob3V0IGhhdmluZyB0byB3YWl0IHVudGlsIGFsbCB0aGUKLWltYWdlcyBoYXZlIGJlZW4gbG9hZGVkLiAgSWYgbm8gdmFsdWUgaXMgZ2l2ZW4gZm9yIHRoZSBvcHRpb24sIGl0Ci1kZWZhdWx0cyB0byB0aGUgc3RhbmRhcmQgaGVpZ2h0IG9mIHRoZSBpY29ucyBzdXBwbGllZCB3aXRoIHRoZSBBcGFjaGUKLXNvZnR3YXJlLgotPERUPjxBIE5BTUU9ImluZGV4b3B0aW9uczppY29uc2FyZWxpbmtzIj5JY29uc0FyZUxpbmtzPC9BPgotPEREPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEljb25zQXJlTGlua3N9IGluZGV4IG9wdGlvbiZndDsgLS0+Ci1UaGlzIG1ha2VzIHRoZSBpY29ucyBwYXJ0IG9mIHRoZSBhbmNob3IgZm9yIHRoZSBmaWxlbmFtZSwgZm9yCi1mYW5jeSBpbmRleGluZy4KLTxEVD48QSBOQU1FPSJpbmRleG9wdGlvbnM6aWNvbndpZHRoIj5JY29uV2lkdGhbPXBpeGVsc10gKDxFTT5BcGFjaGUgMS4zIGFuZCBsYXRlcjwvRU0+KTwvQT4KLTxERD4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBJY29uV2lkdGh9IGluZGV4IG9wdGlvbiZndDsgLS0+Ci1QcmVzZW5jZSBvZiB0aGlzIG9wdGlvbiwgd2hlbiB1c2VkIHdpdGggSWNvbkhlaWdodCwgd2lsbCBjYXVzZSB0aGUgc2VydmVyCi10byBpbmNsdWRlIDxTQU1QPkhFSUdIVDwvU0FNUD4gYW5kIDxTQU1QPldJRFRIPC9TQU1QPiBhdHRyaWJ1dGVzIGluIHRoZQotPFNBTVA+SU1HPC9TQU1QPiB0YWcgZm9yIHRoZSBmaWxlIGljb24uICBUaGlzIGFsbG93cyBicm93c2VyIHRvCi1wcmVjYWxjdWxhdGUgdGhlIHBhZ2UgbGF5b3V0IHdpdGhvdXQgaGF2aW5nIHRvIHdhaXQgdW50aWwgYWxsIHRoZQotaW1hZ2VzIGhhdmUgYmVlbiBsb2FkZWQuICBJZiBubyB2YWx1ZSBpcyBnaXZlbiBmb3IgdGhlIG9wdGlvbiwgaXQKLWRlZmF1bHRzIHRvIHRoZSBzdGFuZGFyZCB3aWR0aCBvZiB0aGUgaWNvbnMgc3VwcGxpZWQgd2l0aCB0aGUgQXBhY2hlCi1zb2Z0d2FyZS4KLTxEVD48QSBOQU1FPSJpbmRleG9wdGlvbnM6bmFtZXdpZHRoIj5OYW1lV2lkdGg9WzxFTT5uPC9FTT4gfCAqXSAoPEVNPkFwYWNoZSAxLjMuMiBhbmQgbGF0ZXI8L0VNPik8L0E+Ci08REQ+Ci1UaGUgTmFtZVdpZHRoIGtleXdvcmQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSB3aWR0aCBvZiB0aGUKLWZpbGVuYW1lIGNvbHVtbiBpbiBieXRlcy4gIElmIHRoZSBrZXl3b3JkIHZhbHVlIGlzICc8U0FNUD4qPC9TQU1QPicsCi10aGVuIHRoZSBjb2x1bW4gaXMgYXV0b21hdGljYWxseSBzaXplZCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBsb25nZXN0Ci1maWxlbmFtZSBpbiB0aGUgZGlzcGxheS4KLTxEVD48QSBOQU1FPSJpbmRleG9wdGlvbnM6c2Nhbmh0bWx0aXRsZXMiPlNjYW5IVE1MVGl0bGVzPC9BPgotPEREPjwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBTY2FuSFRNTFRpdGxlc30gaW5kZXggb3B0aW9uJmd0OyAtLT4KLVRoaXMgZW5hYmxlcyB0aGUgZXh0cmFjdGlvbiBvZiB0aGUgdGl0bGUgZnJvbSBIVE1MIGRvY3VtZW50cyBmb3IgZmFuY3kKLWluZGV4aW5nLiBJZiB0aGUgZmlsZSBkb2VzIG5vdCBoYXZlIGEgZGVzY3JpcHRpb24gZ2l2ZW4gYnkKLTxBIEhSRUY9IiNhZGRkZXNjcmlwdGlvbiI+QWRkRGVzY3JpcHRpb248L0E+IHRoZW4gaHR0cGQgd2lsbCByZWFkIHRoZQotZG9jdW1lbnQgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgVElUTEUgdGFnLiAgVGhpcyBpcyBDUFUgYW5kIGRpc2sgaW50ZW5zaXZlLgotPERUPjxBIE5BTUU9ImluZGV4b3B0aW9uczpzdXBwcmVzc2NvbHVtbnNvcnRpbmciPlN1cHByZXNzQ29sdW1uU29ydGluZzwvQT4KLTxERD4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBTdXBwcmVzc0NvbHVtblNvcnRpbmd9IGluZGV4IG9wdGlvbiZndDsgLS0+Ci1JZiBzcGVjaWZpZWQsIEFwYWNoZSB3aWxsIG5vdCBtYWtlIHRoZSBjb2x1bW4gaGVhZGluZ3MgaW4gYSBGYW5jeUluZGV4ZWQKLWRpcmVjdG9yeSBsaXN0aW5nIGludG8gbGlua3MgZm9yIHNvcnRpbmcuICBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMKLWZvciB0aGVtIHRvIGJlIGxpbmtzOyBzZWxlY3RpbmcgdGhlIGNvbHVtbiBoZWFkaW5nIHdpbGwgc29ydCB0aGUgZGlyZWN0b3J5Ci1saXN0aW5nIGJ5IHRoZSB2YWx1ZXMgaW4gdGhhdCBjb2x1bW4uCi08U1RST05HPk9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZSAxLjMgYW5kIGxhdGVyLjwvU1RST05HPgotPERUPjxBIE5BTUU9ImluZGV4b3B0aW9uczpzdXBwcmVzc2Rlc2NyaXB0aW9uIj5TdXBwcmVzc0Rlc2NyaXB0aW9uPC9BPgotPEREPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IFN1cHByZXNzRGVzY3JpcHRpb259IGluZGV4IG9wdGlvbiZndDsgLS0+Ci1UaGlzIHdpbGwgc3VwcHJlc3MgdGhlIGZpbGUgZGVzY3JpcHRpb24gaW4gZmFuY3kgaW5kZXhpbmcgbGlzdGluZ3MuCi08RFQ+PEEgTkFNRT0iaW5kZXhvcHRpb25zOnN1cHByZXNzaHRtbHByZWFtYmxlIj5TdXBwcmVzc0hUTUxQcmVhbWJsZTwvQT4KLSAgICAoPEVNPkFwYWNoZSAxLjMgYW5kIGxhdGVyPC9FTT4pCi08REQ+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgU3VwcHJlc3NIVE1MUHJlYW1ibGV9IGluZGV4IG9wdGlvbiZndDsgLS0+Ci1JZiB0aGUgZGlyZWN0b3J5IGFjdHVhbGx5IGNvbnRhaW5zIGEgZmlsZSBzcGVjaWZpZWQgYnkgdGhlCi08QQotIEhSRUY9IiNoZWFkZXJuYW1lIgotPkhlYWRlck5hbWU8L0E+Ci1kaXJlY3RpdmUsIHRoZSBtb2R1bGUgdXN1YWxseSBpbmNsdWRlcyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUKLWFmdGVyIGEgc3RhbmRhcmQgSFRNTCBwcmVhbWJsZSAoJmx0O0hUTUwmZ3Q7LCAmbHQ7SEVBRCZndDssIDxFTT5ldAotY2V0ZXJhPC9FTT4pLiAgVGhlIFN1cHByZXNzSFRNTFByZWFtYmxlIG9wdGlvbiBkaXNhYmxlcyB0aGlzIGJlaGF2aW91ciwKLWNhdXNpbmcgdGhlIG1vZHVsZSB0byBzdGFydCB0aGUgZGlzcGxheSB3aXRoIHRoZSBoZWFkZXIgZmlsZSBjb250ZW50cy4KLVRoZSBoZWFkZXIgZmlsZSBtdXN0IGNvbnRhaW4gYXBwcm9wcmlhdGUgSFRNTCBpbnN0cnVjdGlvbnMgaW4gdGhpcyBjYXNlLgotSWYgdGhlcmUgaXMgbm8gaGVhZGVyIGZpbGUsIHRoZSBwcmVhbWJsZSBpcyBnZW5lcmF0ZWQgYXMgdXN1YWwuCi08RFQ+PEEgTkFNRT0iaW5kZXhvcHRpb25zOnN1cHByZXNzbGFzdG1vZGlmaWVkIj5TdXBwcmVzc0xhc3RNb2RpZmllZDwvQT4KLTxERD4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBTdXBwcmVzc0xhc3RNb2RpZmllZH0gaW5kZXggb3B0aW9uJmd0OyAtLT4KLVRoaXMgd2lsbCBzdXBwcmVzcyB0aGUgZGlzcGxheSBvZiB0aGUgbGFzdCBtb2RpZmljYXRpb24gZGF0ZSwgaW4gZmFuY3kKLWluZGV4aW5nIGxpc3RpbmdzLgotPERUPjxBIE5BTUU9ImluZGV4b3B0aW9uczpzdXBwcmVzc3NpemUiPlN1cHByZXNzU2l6ZTwvQT4KLTxERD4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBTdXBwcmVzc1NpemV9IGluZGV4IG9wdGlvbiZndDsgLS0+Ci1UaGlzIHdpbGwgc3VwcHJlc3MgdGhlIGZpbGUgc2l6ZSBpbiBmYW5jeSBpbmRleGluZyBsaXN0aW5ncy4KLTwvREw+Ci08UD4KLVRoZXJlIGFyZSBzb21lIG5vdGljZWFibGUgZGlmZmVyZW5jZXMgaW4gdGhlIGJlaGF2aW91ciBvZiB0aGlzCi1kaXJlY3RpdmUgaW4gcmVjZW50IChwb3N0LTEuMy4wKSB2ZXJzaW9ucyBvZiBBcGFjaGUuCi08L1A+Ci08REw+Ci08RFQ+QXBhY2hlIDEuMy4yIGFuZCBlYXJsaWVyOjwvRFQ+Ci08REQ+Ci08UD4KLVRoZSBkZWZhdWx0IGlzIHRoYXQgbm8gb3B0aW9ucyBhcmUgZW5hYmxlZC4gSWYgbXVsdGlwbGUgSW5kZXhPcHRpb25zCi1jb3VsZCBhcHBseSB0byBhIGRpcmVjdG9yeSwgdGhlbiB0aGUgbW9zdCBzcGVjaWZpYyBvbmUgaXMgdGFrZW4gY29tcGxldGU7Ci10aGUgb3B0aW9ucyBhcmUgbm90IG1lcmdlZC4gRm9yIGV4YW1wbGU6Ci08QkxPQ0tRVU9URT48cHJlPgotJmx0O0RpcmVjdG9yeSAvd2ViL2RvY3MmZ3Q7Ci0gICAgSW5kZXhPcHRpb25zIEZhbmN5SW5kZXhpbmcKLSZsdDsvRGlyZWN0b3J5Jmd0OwotJmx0O0RpcmVjdG9yeSAvd2ViL2RvY3Mvc3BlYyZndDsKLSAgICBJbmRleE9wdGlvbnMgU2NhbkhUTUxUaXRsZXMKLSZsdDsvRGlyZWN0b3J5Jmd0OwotPC9wcmU+PC9CTE9DS1FVT1RFPgotdGhlbiBvbmx5IDxDT0RFPlNjYW5IVE1MVGl0bGVzPC9DT0RFPiB3aWxsIGJlIHNldCBmb3IgdGhlIC93ZWIvZG9jcy9zcGVjCi1kaXJlY3RvcnkuCi08L1A+Ci08L0REPgotPERUPkFwYWNoZSAxLjMuMyBhbmQgbGF0ZXI6PC9EVD4KLTxERD4KLTxQPgotQXBhY2hlIDEuMy4zIGludHJvZHVjZWQgc29tZSBzaWduaWZpY2FudCBjaGFuZ2VzIGluIHRoZSBoYW5kbGluZyBvZgotPFNBTVA+SW5kZXhPcHRpb25zPC9TQU1QPiBkaXJlY3RpdmVzLiAgSW4gcGFydGljdWxhciwKLTwvUD4KLTxVTD4KLSA8TEk+TXVsdGlwbGUgPFNBTVA+SW5kZXhPcHRpb25zPC9TQU1QPiBkaXJlY3RpdmVzIGZvciBhIHNpbmdsZQotICBkaXJlY3RvcnkgYXJlIG5vdyBtZXJnZWQgdG9nZXRoZXIuICBUaGUgcmVzdWx0IG9mIHRoZSBleGFtcGxlIGFib3ZlCi0gIHdpbGwgbm93IGJlIHRoZSBlcXVpdmFsZW50IG9mCi0gIDxDT0RFPkluZGV4T3B0aW9ucyZuYnNwO0ZhbmN5SW5kZXhpbmcmbmJzcDtTY2FuSFRNTFRpdGxlczwvQ09ERT4uCi0gPC9MST4KLSA8TEk+VGhlIGFkZGl0aW9uIG9mIHRoZSBpbmNyZW1lbnRhbCBzeW50YXggKDxFTT5pLmUuPC9FTT4sIHByZWZpeGluZwotICBrZXl3b3JkcyB3aXRoICcrJyBvciAnLScpLgotIDwvTEk+Ci08L1VMPgotPFA+Ci1XaGVuZXZlciBhICcrJyBvciAnLScgcHJlZml4ZWQga2V5d29yZCBpcyBlbmNvdW50ZXJlZCwgaXQgaXMgYXBwbGllZAotdG8gdGhlIGN1cnJlbnQgPFNBTVA+SW5kZXhPcHRpb25zPC9TQU1QPiBzZXR0aW5ncyAod2hpY2ggbWF5IGhhdmUgYmVlbgotaW5oZXJpdGVkIGZyb20gYW4gdXBwZXItbGV2ZWwgZGlyZWN0b3J5KS4gIEhvd2V2ZXIsIHdoZW5ldmVyIGFuIHVucHJlZml4ZWQKLWtleXdvcmQgaXMgcHJvY2Vzc2VkLCBpdCBjbGVhcnMgYWxsIGluaGVyaXRlZCBvcHRpb25zIGFuZCBhbnkgaW5jcmVtZW50YWwKLXNldHRpbmdzIGVuY291bnRlcmVkIHNvIGZhci4gIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKLTwvUD4KLTxCTE9DS1FVT1RFPjxDT0RFPkluZGV4T3B0aW9ucyArU2NhbkhUTUxUaXRsZXMgLUljb25zQXJlTGlua3MgRmFuY3lJbmRleGluZwotPEJSPgotSW5kZXhPcHRpb25zICtTdXBwcmVzc1NpemUKLTxCUj4KLTwvQ09ERT48L0JMT0NLUVVPVEU+Ci08UD4KLVRoZSBuZXQgZWZmZWN0IGlzIGVxdWl2YWxlbnQgdG8KLTxDT0RFPkluZGV4T3B0aW9ucyZuYnNwO0ZhbmN5SW5kZXhpbmcmbmJzcDsrU3VwcHJlc3NTaXplPC9DT0RFPiwgYmVjYXVzZQotdGhlIHVucHJlZml4ZWQgPENPREU+RmFuY3lJbmRleGluZzwvQ09ERT4gZGlzY2FyZGVkIHRoZSBpbmNyZW1lbnRhbAota2V5d29yZHMgYmVmb3JlIGl0LCBidXQgYWxsb3dlZCB0aGVtIHRvIHN0YXJ0IGFjY3VtdWxhdGluZyBhZ2FpbgotYWZ0ZXJ3YXJkLgotPC9QPgotPFA+Ci1UbyB1bmNvbmRpdGlvbmFsbHkgc2V0IHRoZSA8Q09ERT5JbmRleE9wdGlvbnM8L0NPREU+IGZvciBhCi1wYXJ0aWN1bGFyIGRpcmVjdG9yeSwgY2xlYXJpbmcgdGhlIGluaGVyaXRlZCBzZXR0aW5ncywgc3BlY2lmeQota2V5d29yZHMgd2l0aG91dCBlaXRoZXIgJysnIG9yICctJyBwcmVmaXhlcy4KLTwvUD4KLTwvREQ+Ci08L0RMPgotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJpbmRleG9yZGVyZGVmYXVsdCI+SW5kZXhPcmRlckRlZmF1bHQ8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBJbmRleE9yZGVyRGVmYXVsdH0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gSW5kZXhPcmRlckRlZmF1bHQKLSAgICA8RU0+QXNjZW5kaW5nfERlc2NlbmRpbmc8L0VNPiA8RU0+TmFtZXxEYXRlfFNpemV8RGVzY3JpcHRpb248L0VNPgotPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LAotICAgIC5odGFjY2VzcwotPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gSW5kZXhlcwotPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlCi08QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9hdXRvaW5kZXgKLTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBJbmRleE9yZGVyRGVmYXVsdCBpcyBvbmx5IGF2YWlsYWJsZSBpbgotQXBhY2hlIDEuMy40IGFuZCBsYXRlci4KLQotPFA+Ci1UaGUgPFNBTVA+SW5kZXhPcmRlckRlZmF1bHQ8L1NBTVA+IGRpcmVjdGl2ZSBpcyB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGgKLXRoZSA8QSBIUkVGPSIjaW5kZXhvcHRpb25zOmZhbmN5aW5kZXhpbmciPjxTQU1QPkZhbmN5SW5kZXhpbmc8L1NBTVA+PC9BPgotaW5kZXggb3B0aW9uLiAgQnkgZGVmYXVsdCwgZmFuY3lpbmRleGVkIGRpcmVjdG9yeSBsaXN0aW5ncyBhcmUgZGlzcGxheWVkIGluIGFzY2VuZGluZyBvcmRlciBieSBmaWxlbmFtZTsgdGhlIDxTQU1QPkluZGV4T3JkZXJEZWZhdWx0PC9TQU1QPiBhbGxvd3MKLXlvdSB0byBjaGFuZ2UgdGhpcyBpbml0aWFsIGRpc3BsYXkgb3JkZXIuCi08L1A+Ci08UD4KLTxTQU1QPkluZGV4T3JkZXJEZWZhdWx0PC9TQU1QPiB0YWtlcyB0d28gYXJndW1lbnRzLiAgVGhlIGZpcnN0IG11c3QgYmUgZWl0aGVyCi08U0FNUD5Bc2NlbmRpbmc8L1NBTVA+IG9yIDxTQU1QPkRlc2NlbmRpbmc8L1NBTVA+LCBpbmRpY2F0aW5nIHRoZSBkaXJlY3Rpb24KLW9mIHRoZSBzb3J0LiAgVGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0aGUga2V5d29yZHMKLTxTQU1QPk5hbWU8L1NBTVA+LCA8U0FNUD5EYXRlPC9TQU1QPiwgPFNBTVA+U2l6ZTwvU0FNUD4sIG9yCi08U0FNUD5EZXNjcmlwdGlvbjwvU0FNUD4sIGFuZCBpZGVudGlmaWVzIHRoZSBwcmltYXJ5IGtleS4gIFRoZSBzZWNvbmRhcnkKLWtleSBpcyA8RU0+YWx3YXlzPC9FTT4gdGhlIGFzY2VuZGluZyBmaWxlbmFtZS4KLTwvUD4KLTxQPgotWW91IGNhbiBmb3JjZSBhIGRpcmVjdG9yeSBsaXN0aW5nIHRvIG9ubHkgYmUgZGlzcGxheWVkIGluIGEgcGFydGljdWxhcgotb3JkZXIgYnkgY29tYmluaW5nIHRoaXMgZGlyZWN0aXZlIHdpdGggdGhlCi08QSBIUkVGPSIjaW5kZXhvcHRpb25zOnN1cHByZXNzY29sdW1uc29ydGluZyIKLT48U0FNUD5TdXBwcmVzc0NvbHVtblNvcnRpbmc8L1NBTVA+PC9BPiBpbmRleCBvcHRpb247IHRoaXMgd2lsbCBwcmV2ZW50Ci10aGUgY2xpZW50IGZyb20gcmVxdWVzdGluZyB0aGUgZGlyZWN0b3J5IGxpc3RpbmcgaW4gYSBkaWZmZXJlbnQgb3JkZXIuCi08L1A+Ci0KLTxIUj4KLQotPEgyPjxBIE5BTUU9InJlYWRtZW5hbWUiPlJlYWRtZU5hbWU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBSZWFkbWVOYW1lfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBSZWFkbWVOYW1lIDxFTT5maWxlbmFtZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LAotICAgIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IEluZGV4ZXM8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9hdXRvaW5kZXgKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gc29tZSBmZWF0dXJlcyBvbmx5IGF2YWlsYWJsZSBhZnRlcgotIDEuMy42OyBzZWUgdGV4dAotCi08UD4KLVRoZSBSZWFkbWVOYW1lIGRpcmVjdGl2ZSBzZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgd2lsbCBiZSBhcHBlbmRlZAotdG8gdGhlIGVuZCBvZiB0aGUgaW5kZXggbGlzdGluZy4gPEVNPkZpbGVuYW1lPC9FTT4gaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUKLXRvIGluY2x1ZGUsIGFuZCBpcyB0YWtlbiB0byBiZSByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gYmVpbmcgaW5kZXhlZC4KLTwvUD4KLTxCTE9DS1FVT1RFPgotPFNUUk9ORz5UaGUgPEVNPmZpbGVuYW1lPC9FTT4gYXJndW1lbnQgaXMgdHJlYXRlZCBhcyBhIHN0dWIgZmlsZW5hbWUKLWluIEFwYWNoZSAxLjMuNiBhbmQgZWFybGllciwgYW5kIGFzIGEgcmVsYXRpdmUgVVJJIGluIGxhdGVyIHZlcnNpb25zLgotRGV0YWlscyBvZiBob3cgaXQgaXMgaGFuZGxlZCBtYXkgYmUgZm91bmQgdW5kZXIgdGhlIGRlc2NyaXB0aW9uIG9mCi10aGUgPEEgSFJFRj0iI2hlYWRlcm5hbWUiPkhlYWRlck5hbWU8L0E+IGRpcmVjdGl2ZSwgd2hpY2ggdXNlcyB0aGUKLXNhbWUgbWVjaGFuaXNtIGFuZCBjaGFuZ2VkIGF0IHRoZSBzYW1lIHRpbWUgYXMgUmVhZG1lTmFtZS48L1NUUk9ORz4KLTwvQkxPQ0tRVU9URT4KLTxQPlNlZSBhbHNvIDxBIEhSRUY9IiNoZWFkZXJuYW1lIj5IZWFkZXJOYW1lPC9BPi48UD4KLQotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9jZXJuX21ldGEuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfY2Vybl9tZXRhLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYzUyODIuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9jZXJuX21ldGEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPk1vZHVsZSBtb2RfY2Vybl9tZXRhPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+QXBhY2hlIG1vZHVsZSBtb2RfY2Vybl9tZXRhPC9IMT4KLQotVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Q09ERT5tb2RfY2Vybl9tZXRhLmM8L0NPREU+IGZpbGUsIGFuZAotaXMgbm90IGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuIEl0IHByb3ZpZGVzIGZvciBDRVJOIGh0dHBkIG1ldGFmaWxlCi1zZW1hbnRpY3MuIEl0IGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZSAxLjEgYW5kIGxhdGVyLgotCi08SDI+U3VtbWFyeTwvSDI+Ci0KLUVtdWxhdGUgdGhlIENFUk4gSFRUUEQgTWV0YSBmaWxlIHNlbWFudGljcy4gIE1ldGEgZmlsZXMgYXJlIEhUVFAKLWhlYWRlcnMgdGhhdCBjYW4gYmUgb3V0cHV0IGluIGFkZGl0aW9uIHRvIHRoZSBub3JtYWwgcmFuZ2Ugb2YgaGVhZGVycwotZm9yIGVhY2ggZmlsZSBhY2Nlc3NlZC4gIFRoZXkgYXBwZWFyIHJhdGhlciBsaWtlIHRoZSBBcGFjaGUKLS5hc2lzIGZpbGVzLCBhbmQgYXJlIGFibGUgdG8gcHJvdmlkZSBhIGNydWRlIHdheSBvZiBpbmZsdWVuY2luZwotdGhlIEV4cGlyZXM6IGhlYWRlciwgYXMgd2VsbCBhcyBwcm92aWRpbmcgb3RoZXIgY3VyaW9zaXRpZXMuCi1UaGVyZSBhcmUgbWFueSB3YXlzIHRvIG1hbmFnZSBtZXRhIGluZm9ybWF0aW9uLCB0aGlzIG9uZSB3YXMKLWNob3NlbiBiZWNhdXNlIHRoZXJlIGlzIGFscmVhZHkgYSBsYXJnZSBudW1iZXIgb2YgQ0VSTiB1c2Vycwotd2hvIGNhbiBleHBsb2l0IHRoaXMgbW9kdWxlLgotCi08UD5Nb3JlIGluZm9ybWF0aW9uIG9uIHRoZQotPEEgSFJFRj0iaHR0cDovL3d3dy53My5vcmcvcHViL1dXVy9EYWVtb24vVXNlci9Db25maWcvR2VuZXJhbC5odG1sI01ldGFEaXIiCi0+Q0VSTiBtZXRhZmlsZSBzZW1hbnRpY3M8L0E+IGlzIGF2YWlsYWJsZS4KLQotPEgyPkRpcmVjdGl2ZXM8L0gyPgotPFVMPgotPExJPjxBIEhSRUY9IiNtZXRhZmlsZXMiPk1ldGFGaWxlczwvQT4KLTxMST48QSBIUkVGPSIjbWV0YWRpciI+TWV0YURpcjwvQT4KLTxMST48QSBIUkVGPSIjbWV0YXN1ZmZpeCI+TWV0YVN1ZmZpeDwvQT4KLTwvVUw+Ci0KLTxIUj4KLQotPEgyPjxBIE5BTUU9Im1ldGFmaWxlcyI+TWV0YUZpbGVzPC9BPjwvSDI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IE1ldGFGaWxlcyA8RU0+b24vb2ZmPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+TWV0YUZpbGVzIG9mZjwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gcGVyLWRpcmVjdG9yeSBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9jZXJuX21ldGE8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gTWV0YUZpbGVzIGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZSAxLjMKLWFuZCBsYXRlci48UD4KLQotVHVybnMgb24vb2ZmIE1ldGEgZmlsZSBwcm9jZXNzaW5nIG9uIGEgcGVyLWRpcmVjdG9yeSBiYXNpcy4gVGhpcyBvcHRpb24gd2FzIGludHJvZHVjZWQgaW4gQXBhY2hlIDEuMy4KLQotPEgyPjxBIE5BTUU9Im1ldGFkaXIiPk1ldGFEaXI8L0E+PC9IMj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gTWV0YURpciA8RU0+ZGlyZWN0b3J5IG5hbWU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5NZXRhRGlyIC53ZWI8L0NPREU+PEJSPgotPFNUUk9ORz5Db250ZXh0OiAoQXBhY2hlIHByaW9yIHRvIDEuMyk8L1NUUk9ORz4gc2VydmVyIGNvbmZpZzxCUj4KLTxTVFJPTkc+Q29udGV4dDogKEFwYWNoZSAxLjMpPC9TVFJPTkc+IHBlci1kaXJlY3RvcnkgY29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfY2Vybl9tZXRhPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IE1ldGFEaXIgaXMgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDEuMQotYW5kIGxhdGVyLjxQPgotCi1TcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBBcGFjaGUgY2FuIGZpbmQKLW1ldGEgaW5mb3JtYXRpb24gZmlsZXMuICBUaGUgZGlyZWN0b3J5IGlzIHVzdWFsbHkgYSAnaGlkZGVuJwotc3ViZGlyZWN0b3J5IG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0aGUgZmlsZSBiZWluZwotYWNjZXNzZWQuIFNldCB0byAiPENPREU+LjwvQ09ERT4iIHRvIGxvb2sgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZQotZmlsZS4KLQotPEgyPjxBIE5BTUU9Im1ldGFzdWZmaXgiPk1ldGFTdWZmaXg8L0E+PC9IMj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gTWV0YVN1ZmZpeCA8RU0+c3VmZml4PC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+TWV0YVN1ZmZpeCAubWV0YTwvQ09ERT48QlI+Ci08U1RST05HPkNvbnRleHQ6IChBcGFjaGUgcHJpb3IgdG8gMS4zKTwvU1RST05HPiBzZXJ2ZXIgY29uZmlnPEJSPgotPFNUUk9ORz5Db250ZXh0OiAoQXBhY2hlIDEuMyk8L1NUUk9ORz4gcGVyLWRpcmVjdG9yeSBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9jZXJuX21ldGE8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gTWV0YVN1ZmZpeCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUgMS4xCi1hbmQgbGF0ZXIuPFA+Ci0KLVNwZWNpZmllcyB0aGUgZmlsZSBuYW1lIHN1ZmZpeCBmb3IgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLW1ldGEgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSB0d28KLWRpcmVjdGl2ZXMgd2lsbCBjYXVzZSBhIHJlcXVlc3QgdG8gPENPREU+Ci1ET0NVTUVOVF9ST09UL3NvbWVkaXIvaW5kZXguaHRtbDwvQ09ERT4gdG8gbG9vayBpbgotPENPREU+RE9DVU1FTlRfUk9PVC9zb21lZGlyLy53ZWIvaW5kZXguaHRtbC5tZXRhPC9DT0RFPiBhbmQgIHdpbGwgdXNlCi1pdHMgY29udGVudHMgdG8gZ2VuZXJhdGUgYWRkaXRpb25hbCBNSU1FIGhlYWRlciBpbmZvcm1hdGlvbi4KLQotPFA+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfY2dpLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2NnaS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDVkZjU4Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfY2dpLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9jZ2k8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLQotPEgxIEFMSUdOPSJDRU5URVIiPk1vZHVsZSBtb2RfY2dpPC9IMT4KLQotVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Q09ERT5tb2RfY2dpLmM8L0NPREU+IGZpbGUsIGFuZAotaXMgY29tcGlsZWQgaW4gYnkgZGVmYXVsdC4gSXQgcHJvdmlkZXMgZm9yIGV4ZWN1dGlvbiBvZiBDR0kgc2NyaXB0cy4KLUFueSBmaWxlIHdpdGggbWltZSB0eXBlIDxDT0RFPmFwcGxpY2F0aW9uL3gtaHR0cGQtY2dpPC9DT0RFPiB3aWxsIGJlCi1wcm9jZXNzZWQgYnkgdGhpcyBtb2R1bGUuCi08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgYXBwbGljYXRpb24veC1odHRwZC1jZ2l9IG1pbWUgdHlwZSZndDsgLS0+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIENHSSBzY3JpcHRzJmd0OyAtLT4KLQotPEgyPlN1bW1hcnk8L0gyPgotQW55IGZpbGUgdGhhdCBoYXMgdGhlIG1pbWUgdHlwZSA8Q09ERT5hcHBsaWNhdGlvbi94LWh0dHBkLWNnaTwvQ09ERT4KLW9yIGhhbmRsZXIgPENPREU+Y2dpLXNjcmlwdDwvQ09ERT4gKEFwYWNoZSAxLjEgb3IgbGF0ZXIpCi13aWxsIGJlIHRyZWF0ZWQgYXMgYSBDR0kgc2NyaXB0LCBhbmQgcnVuIGJ5IHRoZSBzZXJ2ZXIsIHdpdGggaXRzIG91dHB1dAotYmVpbmcgcmV0dXJuZWQgdG8gdGhlIGNsaWVudC4gRmlsZXMgYWNxdWlyZSB0aGlzIHR5cGUgZWl0aGVyIGJ5Ci1oYXZpbmcgYSBuYW1lIGNvbnRhaW5pbmcgYW4gZXh0ZW5zaW9uIGRlZmluZWQgYnkgdGhlCi08QSBIUkVGPSJtb2RfbWltZS5odG1sI2FkZHR5cGUiPkFkZFR5cGU8L0E+IGRpcmVjdGl2ZSwgb3IgYnkgYmVpbmcgaW4KLWEgPEEgSFJFRj0ibW9kX2FsaWFzLmh0bWwjc2NyaXB0YWxpYXMiPlNjcmlwdEFsaWFzPC9BPiBkaXJlY3RvcnkuIDxQPgotCi1XaGVuIHRoZSBzZXJ2ZXIgaW52b2tlcyBhIENHSSBzY3JpcHQsIGl0IHdpbGwgYWRkIGEgdmFyaWFibGUgY2FsbGVkCi08Q09ERT5ET0NVTUVOVF9ST09UPC9DT0RFPiB0byB0aGUgZW52aXJvbm1lbnQuIFRoaXMgdmFyaWFibGUgd2lsbCBjb250YWluIHRoZQotdmFsdWUgb2YgdGhlIDxBIEhSRUY9ImNvcmUuaHRtbCNkb2N1bWVudHJvb3QiPkRvY3VtZW50Um9vdDwvQT4KLWNvbmZpZ3VyYXRpb24gdmFyaWFibGUuCi0KLTxIMj5DR0kgRW52aXJvbm1lbnQgdmFyaWFibGVzPC9IMj4KLVRoZSBzZXJ2ZXIgd2lsbCBzZXQgdGhlIENHSSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgZGVzY3JpYmVkIGluIHRoZQotPEEgSFJFRj0iaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS8iPkNHSSBzcGVjaWZpY2F0aW9uPC9BPiwgd2l0aCB0aGUKLWZvbGxvd2luZyBwcm92aXNpb25zOgotPERMPgotPERUPlJFTU9URV9IT1NUCi08REQ+VGhpcyB3aWxsIG9ubHkgYmUgc2V0IGlmIDxBIEhSRUY9ImNvcmUuaHRtbCNob3N0bmFtZWxvb2t1cHMiPjxDT0RFPkhvc3RuYW1lTG9va3VwczwvQ09ERT48L0E+Ci1pcyBzZXQgdG8gPENPREU+b248L0NPREU+IChpdCBpcyBvZmYgYnkgZGVmYXVsdCksIGFuZCBpZiBhIHJldmVyc2UgRE5TCi1sb29rdXAgb2YgdGhlIGFjY2Vzc2luZyBob3N0J3MgYWRkcmVzcyBpbmRlZWQgZmluZHMgYSBob3N0IG5hbWUuCi08RFQ+UkVNT1RFX0lERU5UCi08REQ+VGhpcyB3aWxsIG9ubHkgYmUgc2V0IGlmCi08QSBIUkVGPSJjb3JlLmh0bWwjaWRlbnRpdHljaGVjayI+SWRlbnRpdHlDaGVjazwvQT4gaXMgc2V0IHRvIDxDT0RFPm9uPC9DT0RFPgotYW5kIHRoZSBhY2Nlc3NpbmcgaG9zdCBzdXBwb3J0cyB0aGUgaWRlbnQgcHJvdG9jb2wuIE5vdGUgdGhhdCB0aGUgY29udGVudHMKLW9mIHRoaXMgdmFyaWFibGUgY2Fubm90IGJlIHJlbGllZCB1cG9uIGJlY2F1c2UgaXQgY2FuIGVhc2lseSBiZSBmYWtlZCwgYW5kIGlmCi10aGVyZSBpcyBhIHByb3h5IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlciwgaXQgaXMgdXN1YWxseQotdG90YWxseSB1c2VsZXNzLgotPERUPlJFTU9URV9VU0VSCi08REQ+VGhpcyB3aWxsIG9ubHkgYmUgc2V0IGlmIHRoZSBDR0kgc2NyaXB0IGlzIHN1YmplY3QgdG8gYXV0aGVudGljYXRpb24uCi08L0RMPgotPFA+Ci0KLTxIUj4KLQotPEgyPjxBIE5BTUU9ImNnaV9kZWJ1ZyI+Q0dJIERlYnVnZ2luZzwvQT48L0gyPgotCi1EZWJ1Z2dpbmcgQ0dJIHNjcmlwdHMgaGFzIHRyYWRpdGlvbmFsbHkgYmVlbiBkaWZmaWN1bHQsIG1haW5seSBiZWNhdXNlCi1pdCBoYXMKLW5vdAotYmVlbiBwb3NzaWJsZSB0byBzdHVkeSB0aGUgb3V0cHV0IChzdGFuZGFyZCBvdXRwdXQgYW5kIGVycm9yKSBmb3IKLXNjcmlwdHMKLXdoaWNoIGFyZSBmYWlsaW5nIHRvIHJ1biBwcm9wZXJseS4gVGhlc2UgZGlyZWN0aXZlcywgaW5jbHVkZWQgaW4KLUFwYWNoZSAxLjIgYW5kIGxhdGVyLCBwcm92aWRlCi1tb3JlIGRldGFpbGVkIGxvZ2dpbmcgb2YgZXJyb3JzIHdoZW4gdGhleSBvY2N1ci4KLQotPEhSPgotCi08SDI+Q0dJIExvZ2ZpbGUgRm9ybWF0PC9IMj4KLQotV2hlbiBjb25maWd1cmVkLCB0aGUgQ0dJIGVycm9yIGxvZyBsb2dzIGFueSBDR0kgd2hpY2ggZG9lcyBub3QgZXhlY3V0ZQotcHJvcGVybHkuICBFYWNoIENHSSBzY3JpcHQgd2hpY2ggZmFpbHMgdG8gb3BlcmF0ZSBjYXVzZXMgc2V2ZXJhbCBsaW5lcwotb2YgaW5mb3JtYXRpb24gdG8gYmUgbG9nZ2VkLiBUaGUgZmlyc3QgdHdvIGxpbmVzIGFyZSBhbHdheXMgb2YgdGhlCi1mb3JtYXQ6Ci0KLTxQUkU+Ci0gICUlIFs8RU0+dGltZTwvRU0+XSA8RU0+cmVxdWVzdC1saW5lPC9FTT4KLSAgJSUgPEVNPkhUVFAtc3RhdHVzPC9FTT4gPEVNPkNHSS1zY3JpcHQtZmlsZW5hbWU8L0VNPgotPC9QUkU+Ci0KLUlmIHRoZSBlcnJvciBpcyB0aGF0IENHSSBzY3JpcHQgY2Fubm90IGJlIHJ1biwgdGhlIGxvZyBmaWxlIHdpbGwKLWNvbnRhaW4KLWFuIGV4dHJhIHR3byBsaW5lczoKLQotPFBSRT4KLSAgJSVlcnJvcgotICA8RU0+ZXJyb3ItbWVzc2FnZTwvRU0+Ci08L1BSRT4KLQotQWx0ZXJuYXRpdmVseSwgaWYgdGhlIGVycm9yIGlzIHRoZSByZXN1bHQgb2YgdGhlIHNjcmlwdCByZXR1cm5pbmcKLWluY29ycmVjdCBoZWFkZXIgaW5mb3JtYXRpb24gKG9mdGVuIGR1ZSB0byBhIGJ1ZyBpbiB0aGUgc2NyaXB0KSwgdGhlCi1mb2xsb3dpbmcgaW5mb3JtYXRpb24gaXMgbG9nZ2VkOgotCi08UFJFPgotICAlcmVxdWVzdAotICA8RU0+QWxsIEhUVFAgcmVxdWVzdCBoZWFkZXJzIHJlY2VpdmVkPC9FTT4KLSAgPEVNPlBPU1Qgb3IgUFVUIGVudGl0eSAoaWYgYW55KTwvRU0+Ci0gICVyZXNwb25zZQotICA8RU0+QWxsIGhlYWRlcnMgb3V0cHV0IGJ5IHRoZSBDR0kgc2NyaXB0PC9FTT4KLSAgJXN0ZG91dAotICA8RU0+Q0dJIHN0YW5kYXJkIG91dHB1dDwvRU0+Ci0gICVzdGRlcnIKLSAgPEVNPkNHSSBzdGFuZGFyZCBlcnJvcjwvRU0+Ci08L1BSRT4KLQotKFRoZSAlc3Rkb3V0IGFuZCAlc3RkZXJyIHBhcnRzIG1heSAgYmUgbWlzc2luZyBpZiB0aGUgc2NyaXB0IGRpZCBub3QKLW91dHB1dAotYW55dGhpbmcgb24gc3RhbmRhcmQgb3V0cHV0IG9yIHN0YW5kYXJkIGVycm9yKS4KLQotPEhSPgotCi08SDI+RGlyZWN0aXZlczwvSDI+Ci0KLTxIMz48QSBOQU1FPSJzY3JpcHRsb2ciPlNjcmlwdExvZzwvQT48L0gzPgotCi08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFNjcmlwdExvZyA8RU0+ZmlsZW5hbWU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiBub25lPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IG1vZF9jZ2kKLTxQPgotCi1UaGUgPFRUPlNjcmlwdExvZzwvVFQ+IGRpcmVjdGl2ZSBzZXRzIHRoZSBDR0kgc2NyaXB0IGVycm9yIGxvZ2ZpbGUuCi1JZiBubyBTY3JpcHRMb2cgaXMgZ2l2ZW4sIG5vIGVycm9yIGxvZyBpcyBjcmVhdGVkLiBJZiBnaXZlbiwgYW55Ci1DR0kgZXJyb3JzIGFyZSBsb2dnZWQgaW50byB0aGUgZmlsZW5hbWUgZ2l2ZW4gYXMgYXJndW1lbnQuIElmIHRoaXMKLWlzIGEgcmVsYXRpdmUgZmlsZSBvciBwYXRoIGl0IGlzIHRha2VuIHJlbGF0aXZlIHRvIHRoZSBzZXJ2ZXIgcm9vdC4KLQotPFA+VGhpcyBsb2cgd2lsbCBiZSBvcGVuZWQgYXMgdGhlIHVzZXIgdGhlIGNoaWxkIHByb2Nlc3NlcyBydW4gYXMsCi1pZS4gdGhlIHVzZXIgc3BlY2lmaWVkIGluIHRoZSBtYWluIDxBIEhSRUY9ImNvcmUuaHRtbCNVc2VyIj5Vc2VyPC9BPgotZGlyZWN0aXZlLiAgVGhpcyBtZWFucyB0aGF0IGVpdGhlciB0aGUgZGlyZWN0b3J5IHRoZSBzY3JpcHQgbG9nIGlzCi1pbiBuZWVkcyB0byBiZSB3cml0YWJsZSBieSB0aGF0IHVzZXIgb3IgdGhlIGZpbGUgbmVlZHMgdG8gYmUgbWFudWFsbHkKLWNyZWF0ZWQgYW5kIHNldCB0byBiZSB3cml0YWJsZSBieSB0aGF0IHVzZXIuICBJZiB5b3UgcGxhY2UgdGhlCi1zY3JpcHQgbG9nIGluIHlvdXIgbWFpbiBsb2dzIGRpcmVjdG9yeSwgZG8gPFNUUk9ORz5OT1Q8L1NUUk9ORz4KLWNoYW5nZSB0aGUgZGlyZWN0b3J5IHBlcm1pc3Npb25zIHRvIG1ha2UgaXQgd3JpdGFibGUgYnkgdGhlIHVzZXIKLXRoZSBjaGlsZCBwcm9jZXNzZXMgcnVuIGFzLjwvUD4KLQotPFA+Tm90ZSB0aGF0IHNjcmlwdCBsb2dnaW5nIGlzIG1lYW50IHRvIGJlIGEgZGVidWdnaW5nIGZlYXR1cmUgd2hlbgotd3JpdGluZyBDR0kgc2NyaXB0cywgYW5kIGlzIG5vdCBtZWFudCB0byBiZSBhY3RpdmF0ZWQgY29udGludW91c2x5IG9uCi1ydW5uaW5nIHNlcnZlcnMuIEl0IGlzIG5vdCBvcHRpbWl6ZWQgZm9yIHNwZWVkIG9yIGVmZmljaWVuY3ksIGFuZCBtYXkKLWhhdmUgc2VjdXJpdHkgcHJvYmxlbXMgaWYgdXNlZCBpbiBhIG1hbm5lciBvdGhlciB0aGFuIHRoYXQgZm9yIHdoaWNoCi1pdCB3YXMgZGVzaWduZWQuPC9QPgotCi08SDM+PEEgTkFNRT0ic2NyaXB0bG9nbGVuZ3RoIj5TY3JpcHRMb2dMZW5ndGg8L0E+PC9IMz4KLQotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBTY3JpcHRMb2dMZW5ndGggPEVNPnNpemU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiAxMDM4NTc2MDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBtb2RfY2dpCi08UD4KLQotPFRUPlNjcmlwdExvZ0xlbmd0aDwvVFQ+IGNhbiBiZSB1c2VkIHRvIGxpbWl0IHRoZSBzaXplIG9mIHRoZSBDR0kKLXNjcmlwdCBsb2dmaWxlLiAgU2luY2UgdGhlIGxvZ2ZpbGUgbG9ncyBhIGxvdCBvZiBpbmZvcm1hdGlvbiBwZXIgQ0dJCi1lcnJvciAoYWxsIHJlcXVlc3QgaGVhZGVycywgYWxsIHNjcmlwdCBvdXRwdXQpIGl0IGNhbiBncm93IHRvIGJlIGEgYmlnCi1maWxlLiBUbyBwcmV2ZW50IHByb2JsZW1zIGR1ZSB0byB1bmJvdW5kZWQgZ3Jvd3RoLCB0aGlzIGRpcmVjdGl2ZSBjYW4KLWJlIHVzZWQgdG8gc2V0IGFuIG1heGltdW0gZmlsZS1zaXplIGZvciB0aGUgQ0dJIGxvZ2ZpbGUuIElmIHRoZSBmaWxlCi1leGNlZWRzIHRoaXMgc2l6ZSwgbm8gbW9yZSBpbmZvcm1hdGlvbiB3aWxsIGJlIHdyaXR0ZW4gdG8gaXQuCi0KLTxIMz48QSBOQU1FPSJzY3JpcHRsb2didWZmZXIiPlNjcmlwdExvZ0J1ZmZlcjwvQT48L0gzPgotCi08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFNjcmlwdExvZ0J1ZmZlciA8RU0+c2l6ZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDEwMjQ8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gbW9kX2NnaQotPFA+Ci0KLVRoZSBzaXplIG9mIGFueSBQVVQgb3IgUE9TVCBlbnRpdHkgYm9keSB0aGF0IGlzIGxvZ2dlZCB0byB0aGUgZmlsZSBpcwotbGltaXRlZCwgdG8gcHJldmVudCB0aGUgbG9nIGZpbGUgZ3Jvd2luZyB0b28gYmlnIHRvbyBxdWlja2x5IGlmIGxhcmdlCi1ib2RpZXMgYXJlIGJlaW5nIHJlY2VpdmVkLiBCeSBkZWZhdWx0LCB1cCB0byAxMDI0IGJ5dGVzIGFyZSBsb2dnZWQsCi1idXQgdGhpcyBjYW4gYmUgY2hhbmdlZCB3aXRoIHRoaXMgZGlyZWN0aXZlLgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2Rpci5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9kaXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE1MGFhMi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX2Rpci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIG1vZHVsZSBtb2RfZGlyPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+TW9kdWxlIG1vZF9kaXI8L0gxPgotCi1UaGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4gdGhlIDxDT0RFPm1vZF9kaXIuYzwvQ09ERT4gZmlsZSwgYW5kCi1pcyBjb21waWxlZCBpbiBieSBkZWZhdWx0LiAgSXQgcHJvdmlkZXMgZm9yICJ0cmFpbGluZyBzbGFzaCIgcmVkaXJlY3RzIGFuZAotc2VydmluZyBkaXJlY3RvcnkgaW5kZXggZmlsZXMuCi0KLTxIMj5TdW1tYXJ5PC9IMj4KLVRoZSBpbmRleCBvZiBhIGRpcmVjdG9yeSBjYW4gY29tZSBmcm9tIG9uZSBvZiB0d28gc291cmNlczoKLTxVTD4KLTxMST5BIGZpbGUgd3JpdHRlbiBieSB0aGUgdXNlciwgdHlwaWNhbGx5IGNhbGxlZCA8Q09ERT5pbmRleC5odG1sPC9DT0RFPi4KLVRoZSA8QSBIUkVGPSIjZGlyZWN0b3J5aW5kZXgiPkRpcmVjdG9yeUluZGV4PC9BPiBkaXJlY3RpdmUgc2V0cwotdGhlIG5hbWUgb2YgdGhpcyBmaWxlLgotVGhpcyBpcyBjb250cm9sbGVkIGJ5IDxDT0RFPm1vZF9kaXI8L0NPREU+LgotPExJPk90aGVyd2lzZSwgYSBsaXN0aW5nIGdlbmVyYXRlZCBieSB0aGUgc2VydmVyLiAgVGhpcyBpcyBwcm92aWRlZCBieQotPEEgSFJFRj0ibW9kX2F1dG9pbmRleC5odG1sIj48Q09ERT5tb2RfYXV0b2luZGV4PC9DT0RFPjwvQT4uCi08L1VMPgotVGhlIHR3byBmdW5jdGlvbnMgYXJlIHNlcGFyYXRlZCBzbyB0aGF0IHlvdSBjYW4gY29tcGxldGVseSByZW1vdmUKLShvciByZXBsYWNlKSBhdXRvbWF0aWMgaW5kZXggZ2VuZXJhdGlvbiBzaG91bGQgeW91IHdhbnQgdG8uCi08UD5BICJ0cmFpbGluZyBzbGFzaCIgcmVkaXJlY3QgaXMgaXNzdWVkIHdoZW4gdGhlIHNlcnZlciByZWNlaXZlcyBhCi1yZXF1ZXN0IGZvciBhIFVSTCA8U0FNUD5odHRwOi8vc2VydmVybmFtZS9mb28vZGlybmFtZTwvU0FNUD4gd2hlcmUKLTxTQU1QPmRpcm5hbWU8L1NBTVA+IGlzIGEgZGlyZWN0b3J5LiAgRGlyZWN0b3JpZXMgcmVxdWlyZSBhIHRyYWlsaW5nCi1zbGFzaCwgc28gPENPREU+bW9kX2RpcjwvQ09ERT4gaXNzdWVzIGEgcmVkaXJlY3QgdG8KLTxTQU1QPmh0dHA6Ly9zZXJ2ZXJuYW1lL2Zvby9kaXJuYW1lLzwvU0FNUD4uCi0KLTxIMj5EaXJlY3RpdmVzPC9IMj4KLQotPE1FTlU+Ci08TEk+PEEgSFJFRj0iI2RpcmVjdG9yeWluZGV4Ij5EaXJlY3RvcnlJbmRleDwvQT4KLTwvTUVOVT4KLTxIUj4KLQotPEgyPjxBIE5BTUU9ImRpcmVjdG9yeWluZGV4Ij5EaXJlY3RvcnlJbmRleDwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IERpcmVjdG9yeUluZGV4fSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBEaXJlY3RvcnlJbmRleCA8RU0+bG9jYWwtdXJsIGxvY2FsLXVybCAuLi48L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5EaXJlY3RvcnlJbmRleCBpbmRleC5odG1sPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gSW5kZXhlczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2RpcjxQPgotCi1UaGUgRGlyZWN0b3J5SW5kZXggZGlyZWN0aXZlIHNldHMgdGhlIGxpc3Qgb2YgcmVzb3VyY2VzIHRvIGxvb2sgZm9yLAotd2hlbiB0aGUgY2xpZW50IHJlcXVlc3RzIGFuIGluZGV4IG9mIHRoZSBkaXJlY3RvcnkgYnkgc3BlY2lmeWluZyBhIC8KLWF0IHRoZSBlbmQgb2YgdGhlIGEgZGlyZWN0b3J5IG5hbWUuIDxFTT5Mb2NhbC11cmw8L0VNPiBpcyB0aGUKLSglLWVuY29kZWQpIFVSTCBvZiBhIGRvY3VtZW50IG9uIHRoZSBzZXJ2ZXIgcmVsYXRpdmUgdG8gdGhlIHJlcXVlc3RlZAotZGlyZWN0b3J5OyBpdCBpcyB1c3VhbGx5IHRoZSBuYW1lIG9mIGEgZmlsZSBpbiB0aGUgZGlyZWN0b3J5LiBTZXZlcmFsCi1VUkxzIG1heSBiZSBnaXZlbiwgaW4gd2hpY2ggY2FzZSB0aGUgc2VydmVyIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCBvbmUKLXRoYXQgaXQgZmluZHMuIElmIG5vbmUgb2YgdGhlIHJlc291cmNlcyBleGlzdCBhbmQgdGhlCi08Q09ERT5JbmRleGVzPC9DT0RFPiBvcHRpb24gaXMgc2V0LCB0aGUgc2VydmVyIHdpbGwgZ2VuZXJhdGUgaXRzIG93bgotbGlzdGluZyBvZiB0aGUgZGlyZWN0b3J5LgotPFA+Ci0KLUV4YW1wbGU6Ci08QkxPQ0tRVU9URT48Q09ERT4KLURpcmVjdG9yeUluZGV4IGluZGV4Lmh0bWwKLTwvQ09ERT48L0JMT0NLUVVPVEU+Ci10aGVuIGEgcmVxdWVzdCBmb3IgPENPREU+aHR0cDovL215c2VydmVyL2RvY3MvPC9DT0RFPiB3b3VsZCByZXR1cm4KLTxDT0RFPmh0dHA6Ly9teXNlcnZlci9kb2NzL2luZGV4Lmh0bWw8L0NPREU+IGlmIGl0IGV4aXN0cywgb3Igd291bGQgbGlzdAotdGhlIGRpcmVjdG9yeSBpZiBpdCBkaWQgbm90LiA8UD4KLQotTm90ZSB0aGF0IHRoZSBkb2N1bWVudHMgZG8gbm90IG5lZWQgdG8gYmUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeTsKLTxCTE9DS1FVT1RFPjxDT0RFPgotRGlyZWN0b3J5SW5kZXggaW5kZXguaHRtbCBpbmRleC50eHQgL2NnaS1iaW4vaW5kZXgucGw8L0NPREU+PC9CTE9DS1FVT1RFPgotd291bGQgY2F1c2UgdGhlIENHSSBzY3JpcHQgPENPREU+L2NnaS1iaW4vaW5kZXgucGw8L0NPREU+IHRvIGJlIGV4ZWN1dGVkCi1pZiBuZWl0aGVyIDxDT0RFPmluZGV4Lmh0bWw8L0NPREU+IG9yIDxDT0RFPmluZGV4LnR4dDwvQ09ERT4gZXhpc3RlZCBpbgotYSBkaXJlY3RvcnkuPFA+PEhSPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2Vudi5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9lbnYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJlMWZiZi4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX2Vudi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIG1vZHVsZSBtb2RfZW52PC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+QXBhY2hlIG1vZHVsZSBtb2RfZW52PC9IMT4KLQotVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Q09ERT5tb2RfZW52LmM8L0NPREU+IGZpbGUsIGFuZAotaXMgY29tcGlsZWQgaW4gYnkgZGVmYXVsdC4gSXQgcHJvdmlkZXMgZm9yCi1wYXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBDR0kvU1NJIHNjcmlwdHMuIElzIGlzIG9ubHkgYXZhaWxhYmxlCi1pbiBBcGFjaGUgMS4xIGFuZCBsYXRlci4KLQotPEgyPlN1bW1hcnk8L0gyPgotCi1UaGlzIG1vZHVsZSBhbGxvd3MgQXBhY2hlJ3MgQ0dJIGFuZCBTU0kgZW52aXJvbm1lbnQgdG8gaW5oZXJpdAotZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gdGhlIHNoZWxsIHdoaWNoIGludm9rZWQgdGhlIGh0dHBkIHByb2Nlc3MuCi1DRVJOIHdlYi1zZXJ2ZXJzIGFyZSBhYmxlIHRvIGRvIHRoaXMsIHNvIHRoaXMgbW9kdWxlIGlzIGVzcGVjaWFsbHkKLXVzZWZ1bCB0byB3ZWItYWRtaW5zIHdobyB3aXNoIHRvIG1pZ3JhdGUgZnJvbSBDRVJOIHRvIEFwYWNoZSB3aXRob3V0Ci1yZXdyaXRpbmcgYWxsIHRoZWlyIHNjcmlwdHMKLQotPEgyPkRpcmVjdGl2ZXM8L0gyPgotPFVMPgotPExJPjxBIEhSRUY9IiNwYXNzZW52Ij5QYXNzRW52PC9BPgotPExJPjxBIEhSRUY9IiNzZXRlbnYiPlNldEVudjwvQT4KLTxMST48QSBIUkVGPSIjdW5zZXRlbnYiPlVuc2V0RW52PC9BPgotPC9VTD4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0icGFzc2VudiI+UGFzc0VudjwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBQYXNzRW52IDxFTT52YXJpYWJsZSB2YXJpYWJsZSAuLi48L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9lbnY8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gUGFzc0VudiBpcyBvbmx5IGF2YWlsYWJsZSBpbgotQXBhY2hlIDEuMSBhbmQgbGF0ZXIuPFA+Ci0KLVNwZWNpZmllcyBvbmUgb3IgbW9yZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gcGFzcyB0byBDR0kgc2NyaXB0cwotZnJvbSB0aGUgc2VydmVyJ3Mgb3duIGVudmlyb25tZW50LiBFeGFtcGxlOgotPFBSRT4KLSAgICBQYXNzRW52IExEX0xJQlJBUllfUEFUSAotPC9QUkU+Ci0KLTxIUj4KLQotPEgyPjxBIE5BTUU9InNldGVudiI+U2V0RW52PC9BPjwvSDI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFNldEVudiA8RU0+dmFyaWFibGUgdmFsdWU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9lbnY8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gU2V0RW52IGlzIG9ubHkgYXZhaWxhYmxlIGluCi1BcGFjaGUgMS4xIGFuZCBsYXRlci48UD4KLQotU2V0cyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgd2hpY2ggaXMgdGhlbiBwYXNzZWQgb24gdG8gQ0dJCi1zY3JpcHRzLiBFeGFtcGxlOgotPFBSRT4KLSAgICBTZXRFbnYgU1BFQ0lBTF9QQVRIIC9mb28vYmluCi08L1BSRT4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0idW5zZXRlbnYiPlVuc2V0RW52PC9BPjwvSDI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFVuc2V0RW52IDxFTT52YXJpYWJsZSB2YXJpYWJsZSAuLi48L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9lbnY8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gVW5zZXRFbnYgaXMgb25seSBhdmFpbGFibGUgaW4KLUFwYWNoZSAxLjEgYW5kIGxhdGVyLjxQPgotCi1SZW1vdmVzIG9uZSBvciBtb3JlIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHRob3NlIHBhc3NlZCBvbiB0bwotQ0dJIHNjcmlwdHMuIEV4YW1wbGU6Ci08UFJFPgotICAgIFVuc2V0RW52IExEX0xJQlJBUllfUEFUSAotPC9QUkU+Ci0KLQotCi08UD4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfZXhhbXBsZS5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9leGFtcGxlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZWU0YjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9leGFtcGxlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci0gPEhFQUQ+Ci0gIDxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9leGFtcGxlPC9USVRMRT4KLSA8L0hFQUQ+Ci0gPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotIDxCT0RZCi0gIEJHQ09MT1I9IiNGRkZGRkYiCi0gIFRFWFQ9IiMwMDAwMDAiCi0gIExJTks9IiMwMDAwRkYiCi0gIFZMSU5LPSIjMDAwMDgwIgotICBBTElOSz0iI0ZGMDAwMCIKLSA+Ci0gIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0gIDxIMSBBTElHTj0iQ0VOVEVSIj5Nb2R1bGUgbW9kX2V4YW1wbGU8L0gxPgotICA8UD4KLSAgVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Q09ERT5tb2R1bGVzL21vZF9leGFtcGxlLmM8L0NPREU+IGZpbGUsIGFuZAotICA8U1RST05HPmlzIG5vdDwvU1RST05HPiBjb21waWxlZCBpbiBieSBkZWZhdWx0LiAgSXQgaWxsdXN0cmF0ZXMgbWFueSBvZgotICB0aGUgYXNwZWN0cyBvZiB0aGUKLSAgPEEKLSAgIEhSRUY9Ii4uL21pc2MvQVBJLmh0bWwiCi0gICBSRUw9IkhlbHAiCi0gID5BcGFjaGUgMS4yIEFQSTwvQT4KLSAgYW5kLCB3aGVuIHVzZWQsIGRlbW9uc3RyYXRlcyB0aGUgbWFubmVyIGluIHdoaWNoIG1vZHVsZSBjYWxsYmFja3MgYXJlCi0gIHRyaWdnZXJlZCBieSB0aGUgc2VydmVyLgotICA8L1A+Ci0gIDxIMj5TdW1tYXJ5PC9IMj4KLSAgPFA+Ci0gIFRoZSBmaWxlcyBpbiB0aGUgPENPREU+c3JjL21vZHVsZXMvZXhhbXBsZSBkaXJlY3Rvcnk8L0NPREU+IHVuZGVyIHRoZQotICBBcGFjaGUgZGlzdHJpYnV0aW9uIGRpcmVjdG9yeSB0cmVlIGFyZSBwcm92aWRlZCBhcyBhbiBleGFtcGxlIHRvIHRob3NlCi0gIHRoYXQgd2lzaCB0byB3cml0ZSBtb2R1bGVzIHRoYXQgdXNlIHRoZSBBcGFjaGUgQVBJLgotICA8L1A+Ci0gIDxQPgotICBUaGUgbWFpbiBmaWxlIGlzIDxDT0RFPm1vZF9leGFtcGxlLmM8L0NPREU+LCB3aGljaCBpbGx1c3RyYXRlcyBhbGwKLSAgdGhlIGRpZmZlcmVudCBjYWxsYmFjayBtZWNoYW5pc21zIGFuZCBjYWxsIHN5bnRheGVzLiAgQnkgbm8gbWVhbnMgZG9lcwotICBhbiBhZGQtb24gbW9kdWxlIG5lZWQgdG8gaW5jbHVkZSByb3V0aW5lcyBmb3IgYWxsIG9mIHRoZSBjYWxsYmFja3MgLQotICBxdWl0ZSB0aGUgY29udHJhcnkhCi0gIDwvUD4KLSAgPFA+Ci0gIFRoZSBleGFtcGxlIG1vZHVsZSBpcyBhbiBhY3R1YWwgd29ya2luZyBtb2R1bGUuICBJZiB5b3UgbGluayBpdCBpbnRvCi0gIHlvdXIgc2VydmVyLCBlbmFibGUgdGhlICJleGFtcGxlLWhhbmRsZXIiIGhhbmRsZXIgZm9yIGEgbG9jYXRpb24sIGFuZAotICB0aGVuIGJyb3dzZSB0byB0aGF0IGxvY2F0aW9uLCB5b3Ugd2lsbCBzZWUgYSBkaXNwbGF5IG9mCi0gIHNvbWUgb2YgdGhlIHRyYWNpbmcgdGhlIGV4YW1wbGUgbW9kdWxlIGRpZCBhcyB0aGUgdmFyaW91cyBjYWxsYmFja3MKLSAgd2VyZSBtYWRlLgotICA8L1A+Ci0gIDxQPgotICBUbyBpbmNsdWRlIHRoZSBleGFtcGxlIG1vZHVsZSBpbiB5b3VyIHNlcnZlciwgZm9sbG93IHRoZSBzdGVwcyBiZWxvdzoKLSAgPC9QPgotICA8T0w+Ci0gICA8TEk+VW5jb21tZW50IHRoZSAiQWRkTW9kdWxlIG1vZHVsZXMvZXhhbXBsZS9tb2RfZXhhbXBsZSIgbGluZSBuZWFyIAotICAgIHRoZSBib3R0b20gb2YKLSAgICB0aGUgPENPREU+c3JjL0NvbmZpZ3VyYXRpb248L0NPREU+IGZpbGUuICBJZiB0aGVyZSBpc24ndCBvbmUsIGFkZAotICAgIGl0OyBpdCBzaG91bGQgbG9vayBsaWtlIHRoaXM6Ci0gICAgPFBSRT4KLSAgICAgQWRkTW9kdWxlIG1vZHVsZXMvZXhhbXBsZS9tb2RfZXhhbXBsZS5vCi0gICAgPC9QUkU+Ci0gICA8L0xJPgotICAgPExJPlJ1biB0aGUgPENPREU+c3JjL0NvbmZpZ3VyZTwvQ09ERT4gc2NyaXB0Ci0gICAgKCI8U0FNUD5jZCZuYnNwO3NyYzsmbmJzcDsuL0NvbmZpZ3VyZTwvU0FNUD4iKS4gIFRoaXMgd2lsbAotICAgIGJ1aWxkIHRoZSBNYWtlZmlsZSBmb3IgdGhlIHNlcnZlciBpdHNlbGYsIGFuZCB1cGRhdGUgdGhlCi0gICAgPENPREU+c3JjL21vZHVsZXMvTWFrZWZpbGU8L0NPREU+IGZvciBhbnkgYWRkaXRpb25hbCBtb2R1bGVzIHlvdQotICAgIGhhdmUgcmVxdWVzdGVkIGZyb20gYmVuZWF0aCB0aGF0IHN1YmRpcmVjdG9yeS4KLSAgIDwvTEk+Ci0gICA8TEk+TWFrZSB0aGUgc2VydmVyIChydW4gIjxTQU1QPm1ha2U8L1NBTVA+IiBpbiB0aGUgPENPREU+c3JjPC9DT0RFPgotICAgIGRpcmVjdG9yeSkuCi0gICA8L0xJPgotICA8L09MPgotICA8UD4KLSAgVG8gYWRkIGFub3RoZXIgbW9kdWxlIG9mIHlvdXIgb3duOgotICA8L1A+Ci0gIDxPTCBUWVBFPSJBIj4KLSAgIDxMST48U0FNUD5ta2RpciBzcmMvbW9kdWxlcy88RU0+bXltb2R1bGU8L0VNPjwvU0FNUD4KLSAgIDwvTEk+Ci0gICA8TEk+PFNBTVA+Y3Agc3JjL21vZHVsZXMvZXhhbXBsZS8qIHNyYy9tb2R1bGVzLzxFTT5teW1vZHVsZTwvRU0+PC9TQU1QPgotICAgPC9MST4KLSAgIDxMST5Nb2RpZnkgdGhlIGZpbGVzIGluIHRoZSBuZXcgZGlyZWN0b3J5LgotICAgPC9MST4KLSAgIDxMST5Gb2xsb3cgc3RlcHMgWzFdIHRocm91Z2ggWzNdIGFib3ZlLCB3aXRoIGFwcHJvcHJpYXRlIGNoYW5nZXMuCi0gICA8L0xJPgotICA8L09MPgotICA8SDM+Ci0gICBVc2luZyB0aGUgPFNBTVA+bW9kX2V4YW1wbGU8L1NBTVA+IE1vZHVsZQotICA8L0gzPgotICA8UD4KLSAgVG8gYWN0aXZhdGUgdGhlIGV4YW1wbGUgbW9kdWxlLCBpbmNsdWRlIGEgYmxvY2sgc2ltaWxhciB0byB0aGUKLSAgZm9sbG93aW5nIGluIHlvdXIgPFNBTVA+c3JtLmNvbmY8L1NBTVA+IGZpbGU6Ci0gIDwvUD4KLSAgPFBSRT4KLSAgICZsdDtMb2NhdGlvbiAvZXhhbXBsZS1pbmZvJmd0OwotICAgICAgIFNldEhhbmRsZXIgZXhhbXBsZS1oYW5kbGVyCi0gICAmbHQ7L0xvY2F0aW9uJmd0OwotICA8L1BSRT4KLSAgPFA+Ci0gIEFzIGFuIGFsdGVybmF0aXZlLCB5b3UgY2FuIHB1dCB0aGUgZm9sbG93aW5nIGludG8gYQotICA8QQotICAgSFJFRj0iY29yZS5odG1sI2FjY2Vzc2ZpbGVuYW1lIgotICA+PFNBTVA+Lmh0YWNjZXNzPC9TQU1QPjwvQT4KLSAgZmlsZSBhbmQgdGhlbiByZXF1ZXN0IHRoZSBmaWxlICZxdW90O3Rlc3QuZXhhbXBsZSZxdW90OyBmcm9tIHRoYXQKLSAgbG9jYXRpb246Ci0gIDwvUD4KLSAgPFBSRT4KLSAgIEFkZEhhbmRsZXIgZXhhbXBsZS1oYW5kbGVyIC5leGFtcGxlCi0gIDwvUFJFPgotICA8UD4KLSAgQWZ0ZXIgcmVsb2FkaW5nL3Jlc3RhcnRpbmcgeW91ciBzZXJ2ZXIsIHlvdSBzaG91bGQgYmUgYWJsZSB0byBicm93c2UKLSAgdG8gdGhpcyBsb2NhdGlvbiBhbmQgc2VlIHRoZSBicmllZiBkaXNwbGF5IG1lbnRpb25lZCBlYXJsaWVyLgotICA8L1A+Ci0gIDxIMj5EaXJlY3RpdmVzPC9IMj4KLSAgPFA+Ci0gIDxVTD4KLSAgIDxMST48QSBIUkVGPSIjZXhhbXBsZSI+RXhhbXBsZTwvQT4KLSAgIDwvTEk+Ci0gIDwvVUw+Ci0gIDwvUD4KLSAgPEhSPgotICA8SDI+PEEgTkFNRT0iZXhhbXBsZSI+Ci0gICBFeGFtcGxlCi0gIDwvQT48L0gyPgotICA8UD4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotICAgUkVMPSJIZWxwIiAKLSAgPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gRXhhbXBsZQotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gICBSRUw9IkhlbHAiIAotICA+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gTm9uZQotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gICBSRUw9IkhlbHAiIAotICA+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksCi0gIC5odGFjY2VzcwotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotICAgUkVMPSJIZWxwIiAKLSAgPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBPcHRpb25zCi0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotICAgUkVMPSJIZWxwIiAKLSAgPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gRXh0ZW5zaW9uCi0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotICAgUkVMPSJIZWxwIiAKLSAgPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2V4YW1wbGUKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotICAgUkVMPSJIZWxwIiAKLSAgPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IDxTQU1QPkV4YW1wbGU8L1NBTVA+IGlzIG9ubHkKLSAgIGF2YWlsYWJsZSBpbiBBcGFjaGUgMS4yIGFuZCBsYXRlci4KLSAgPC9QPgotICA8UD4KLSAgVGhlIDxTQU1QPkV4YW1wbGU8L1NBTVA+IGRpcmVjdGl2ZSBqdXN0IHNldHMgYSBkZW1vbnN0cmF0aW9uIGZsYWcgd2hpY2ggdGhlCi0gIGV4YW1wbGUgbW9kdWxlJ3MgY29udGVudCBoYW5kbGVyIGRpc3BsYXlzLiAgSXQgdGFrZXMgbm8gYXJndW1lbnRzLiAgSWYgeW91Ci0gIGJyb3dzZSB0byBhbiBVUkwgdG8gd2hpY2ggdGhlIGV4YW1wbGUgY29udGVudC1oYW5kbGVyIGFwcGxpZXMsIHlvdSB3aWxsIGdldAotICBhIGRpc3BsYXkgb2YgdGhlIHJvdXRpbmVzIHdpdGhpbiB0aGUgbW9kdWxlIGFuZCBob3cgYW5kIGluIHdoYXQgb3JkZXIgdGhleQotICB3ZXJlIGNhbGxlZCB0byBzZXJ2aWNlIHRoZSBkb2N1bWVudCByZXF1ZXN0LiBUaGUgZWZmZWN0IG9mIHRoaXMgZGlyZWN0aXZlCi0gIG9uZSBjYW4gb2JzZXJ2ZSB1bmRlciB0aGUgcG9pbnQgIjxTQU1QPkV4YW1wbGUgZGlyZWN0aXZlIGRlY2xhcmVkCi0gIGhlcmU6IFlFUy9OTzwvU0FNUD4iLiAKLSAgPC9QPgotICA8IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotIDwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfZXhwaXJlcy5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9leHBpcmVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MWE5NjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9leHBpcmVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci0gPEhFQUQ+Ci0gIDxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9leHBpcmVzPC9USVRMRT4KLSA8L0hFQUQ+Ci08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci0gPEJPRFkKLSAgQkdDT0xPUj0iI0ZGRkZGRiIKLSAgVEVYVD0iIzAwMDAwMCIKLSAgTElOSz0iIzAwMDBGRiIKLSAgVkxJTks9IiMwMDAwODAiCi0gIEFMSU5LPSIjRkYwMDAwIgotID4KLSAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLSAgPEgxIEFMSUdOPSJDRU5URVIiPk1vZHVsZSBtb2RfZXhwaXJlczwvSDE+Ci0gIDxQPgotICBUaGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4gdGhlIDxDT0RFPm1vZF9leHBpcmVzLmM8L0NPREU+IGZpbGUsIGFuZAotICBpcyA8U1RST05HPm5vdDwvU1RST05HPiBjb21waWxlZCBpbiBieSBkZWZhdWx0LiAgSXQgcHJvdmlkZXMgZm9yIHRoZQotICBnZW5lcmF0aW9uIG9mIDxDT0RFPkV4cGlyZXM8L0NPREU+IGhlYWRlcnMgYWNjb3JkaW5nIHRvIHVzZXItc3BlY2lmaWVkCi0gIGNyaXRlcmlhLgotICA8L1A+Ci0gIDxIMj5TdW1tYXJ5PC9IMj4KLSAgPFA+Ci0gIFRoaXMgbW9kdWxlIGNvbnRyb2xzIHRoZSBzZXR0aW5nIG9mIHRoZSA8Q09ERT5FeHBpcmVzPC9DT0RFPiBIVFRQCi0gIGhlYWRlciBpbiBzZXJ2ZXIgcmVzcG9uc2VzLiAgVGhlIGV4cGlyYXRpb24gZGF0ZSBjYW4gc2V0IHRvIGJlCi0gIHJlbGF0aXZlIHRvIGVpdGhlciB0aGUgdGltZSB0aGUgc291cmNlIGZpbGUgd2FzIGxhc3QgbW9kaWZpZWQsIG9yIHRvCi0gIHRoZSB0aW1lIG9mIHRoZSBjbGllbnQgYWNjZXNzLgotICA8L1A+Ci0gIDxQPgotICBUaGUgPENPREU+RXhwaXJlczwvQ09ERT4gSFRUUCBoZWFkZXIgaXMgYW4gaW5zdHJ1Y3Rpb24gdG8gdGhlIGNsaWVudAotICBhYm91dCB0aGUgZG9jdW1lbnQncyB2YWxpZGl0eSBhbmQgcGVyc2lzdGVuY2UuICBJZiBjYWNoZWQsIHRoZSBkb2N1bWVudAotICBtYXkgYmUgZmV0Y2hlZCBmcm9tIHRoZSBjYWNoZSByYXRoZXIgdGhhbiBmcm9tIHRoZSBzb3VyY2UgdW50aWwgdGhpcwotICB0aW1lIGhhcyBwYXNzZWQuICBBZnRlciB0aGF0LCB0aGUgY2FjaGUgY29weSBpcyBjb25zaWRlcmVkCi0gICZxdW90O2V4cGlyZWQmcXVvdDsgYW5kIGludmFsaWQsIGFuZCBhIG5ldyBjb3B5IG11c3QgYmUgb2J0YWluZWQgZnJvbQotICB0aGUgc291cmNlLgotICA8L1A+Ci0gIDxIMj5EaXJlY3RpdmVzPC9IMj4KLSAgPFA+Ci0gIDxNRU5VPgotICAgPExJPjxBCi0gICAgICAgIEhSRUY9IiNleHBpcmVzYWN0aXZlIgotICAgICAgID5FeHBpcmVzQWN0aXZlPC9BPgotICAgPC9MST4KLSAgIDxMST48QQotICAgICAgICBIUkVGPSIjZXhwaXJlc2J5dHlwZSIKLSAgICAgICA+RXhwaXJlc0J5VHlwZTwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEKLSAgICAgICAgSFJFRj0iI2V4cGlyZXNkZWZhdWx0IgotICAgICAgID5FeHBpcmVzRGVmYXVsdDwvQT4KLSAgIDwvTEk+Ci0gIDwvTUVOVT4KLSAgPEhSPgotICA8SDI+PEEgTkFNRT0iZXhwaXJlc2FjdGl2ZSI+Ci0gICBFeHBpcmVzQWN0aXZlIGRpcmVjdGl2ZQotICA8L0E+PC9IMj4KLSAgPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEV4cGlyZXNBY3RpdmV9IGRpcmVjdGl2ZSZndDsgLS0+Ci0gIDxQPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEV4cGlyZXNBY3RpdmUgPEVNPmJvb2xlYW48L0VNPgotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwKLSAgLmh0YWNjZXNzCi0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gSW5kZXhlcwotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gRXh0ZW5zaW9uCi0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfZXhwaXJlcwotICA8L1A+Ci0gIDxQPgotICBUaGlzIGRpcmVjdGl2ZSBlbmFibGVzIG9yIGRpc2FibGVzIHRoZSBnZW5lcmF0aW9uIG9mIHRoZQotICA8Q09ERT5FeHBpcmVzPC9DT0RFPiBoZWFkZXIgZm9yIHRoZSBkb2N1bWVudCByZWFsbSBpbiBxdWVzdGlvbi4gIChUaGF0Ci0gIGlzLCBpZiBmb3VuZCBpbiBhbiA8Q09ERT4uaHRhY2Nlc3M8L0NPREU+IGZpbGUsIGZvciBpbnN0YW5jZSwgaXQKLSAgYXBwbGllcyBvbmx5IHRvIGRvY3VtZW50cyBnZW5lcmF0ZWQgZnJvbSB0aGF0IGRpcmVjdG9yeS4pICBJZiBzZXQgdG8KLSAgPEVNPjxDT0RFPk9mZjwvQ09ERT48L0VNPiwgbm8gPENPREU+RXhwaXJlczwvQ09ERT4gaGVhZGVyIHdpbGwgYmUKLSAgZ2VuZXJhdGVkIGZvciBhbnkgZG9jdW1lbnQgaW4gdGhlIHJlYWxtICh1bmxlc3Mgb3ZlcnJpZGRlbiBhdCBhIGxvd2VyCi0gIGxldmVsLCBzdWNoIGFzIGFuIDxDT0RFPi5odGFjY2VzczwvQ09ERT4gZmlsZSBvdmVycmlkaW5nIGEgc2VydmVyCi0gIGNvbmZpZyBmaWxlKS4gIElmIHNldCB0byA8RU0+PENPREU+T248L0NPREU+PC9FTT4sIHRoZSBoZWFkZXIgd2lsbCBiZQotICBhZGRlZCB0byBzZXJ2ZWQgZG9jdW1lbnRzIGFjY29yZGluZyB0byB0aGUgY3JpdGVyaWEgZGVmaW5lZCBieSB0aGUKLSAgPEEKLSAgIEhSRUY9IiNleHBpcmVzYnl0eXBlIgotICA+RXhwaXJlc0J5VHlwZTwvQT4KLSAgYW5kCi0gIDxBCi0gICBIUkVGPSIjZXhwaXJlc2RlZmF1bHQiCi0gID5FeHBpcmVzRGVmYXVsdDwvQT4KLSAgZGlyZWN0aXZlcyAoPEVNPnEudi48L0VNPikuCi0gIDwvUD4KLSAgPFA+Ci0gIE5vdGUgdGhhdCB0aGlzIGRpcmVjdGl2ZSBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCBhbgotICA8Q09ERT5FeHBpcmVzPC9DT0RFPiBoZWFkZXIgd2lsbCBiZSBnZW5lcmF0ZWQuICBJZiB0aGUgY3JpdGVyaWEgYXJlbid0Ci0gIG1ldCwgbm8gaGVhZGVyIHdpbGwgYmUgc2VudCwgYW5kIHRoZSBlZmZlY3Qgd2lsbCBiZSBhcyB0aG91Z2ggdGhpcwotICBkaXJlY3RpdmUgd2Fzbid0IGV2ZW4gc3BlY2lmaWVkLgotICA8L1A+Ci0gIDxIUj4KLSAgPEgyPjxBIE5BTUU9ImV4cGlyZXNieXR5cGUiPgotICAgRXhwaXJlc0J5VHlwZSBkaXJlY3RpdmUKLSAgPC9BPjwvSDI+Ci0gIDwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBFeHBpcmVzQnlUeXBlfSBkaXJlY3RpdmUmZ3Q7IC0tPgotICA8UD4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBFeHBpcmVzQnlUeXBlIDxFTT5NSU1FLXR5cGUKLSAgJmx0O2NvZGUmZ3Q7c2Vjb25kczwvRU0+Ci0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LAotICAuaHRhY2Nlc3MKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBJbmRleGVzCi0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBFeHRlbnNpb24KLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9leHBpcmVzCi0gIDwvUD4KLSAgPFA+Ci0gIFRoaXMgZGlyZWN0aXZlIGRlZmluZXMgdGhlIHZhbHVlIG9mIHRoZSA8Q09ERT5FeHBpcmVzPC9DT0RFPiBoZWFkZXIKLSAgZ2VuZXJhdGVkIGZvciBkb2N1bWVudHMgb2YgdGhlIHNwZWNpZmllZCB0eXBlICg8RU0+ZS5nLjwvRU0+LAotICA8Q09ERT50ZXh0L2h0bWw8L0NPREU+KS4gIFRoZSBzZWNvbmQgYXJndW1lbnQgc2V0cyB0aGUgbnVtYmVyIG9mCi0gIHNlY29uZHMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIGEgYmFzZSB0aW1lIHRvIGNvbnN0cnVjdCB0aGUgZXhwaXJhdGlvbgotICBkYXRlLgotICA8L1A+Ci0gIDxQPgotICBUaGUgYmFzZSB0aW1lIGlzIGVpdGhlciB0aGUgbGFzdCBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgZmlsZSwgb3IgdGhlCi0gIHRpbWUgb2YgdGhlIGNsaWVudCdzIGFjY2VzcyB0byB0aGUgZG9jdW1lbnQuICBXaGljaCBzaG91bGQgYmUgdXNlZCBpcwotICBzcGVjaWZpZWQgYnkgdGhlIDxDT0RFPjxFTT4mbHQ7Y29kZSZndDs8L0VNPjwvQ09ERT4gZmllbGQ7Ci0gIDxTVFJPTkc+TTwvU1RST05HPiBtZWFucyB0aGF0IHRoZSBmaWxlJ3MgbGFzdCBtb2RpZmljYXRpb24gdGltZSBzaG91bGQKLSAgYmUgdXNlZCBhcyB0aGUgYmFzZSB0aW1lLCBhbmQgPFNUUk9ORz5BPC9TVFJPTkc+IG1lYW5zIHRoZSBjbGllbnQncwotICBhY2Nlc3MgdGltZSBzaG91bGQgYmUgdXNlZC4KLSAgPC9QPgotICA8UD4KLSAgVGhlIGRpZmZlcmVuY2UgaW4gZWZmZWN0IGlzIHN1YnRsZS4gIElmIDxFTT5NPC9FTT4gaXMgdXNlZCwgYWxsIGN1cnJlbnQKLSAgY29waWVzIG9mIHRoZSBkb2N1bWVudCBpbiBhbGwgY2FjaGVzIHdpbGwgZXhwaXJlIGF0IHRoZSBzYW1lIHRpbWUsCi0gIHdoaWNoIGNhbiBiZSBnb29kIGZvciBzb21ldGhpbmcgbGlrZSBhIHdlZWtseSBub3RpY2UgdGhhdCdzIGFsd2F5cwotICBmb3VuZCBhdCB0aGUgc2FtZSBVUkwuICBJZiA8RU0+QTwvRU0+IGlzIHVzZWQsIHRoZSBkYXRlIG9mIGV4cGlyYXRpb24KLSAgaXMgZGlmZmVyZW50IGZvciBlYWNoIGNsaWVudDsgdGhpcyBjYW4gYmUgZ29vZCBmb3IgaW1hZ2UgZmlsZXMgdGhhdAotICBkb24ndCBjaGFuZ2UgdmVyeSBvZnRlbiwgcGFydGljdWxhcmx5IGZvciBhIHNldCBvZiByZWxhdGVkIGRvY3VtZW50cwotICB0aGF0IGFsbCByZWZlciB0byB0aGUgc2FtZSBpbWFnZXMgKDxFTT5pLmUuPC9FTT4sIHRoZSBpbWFnZXMgd2lsbCBiZQotICBhY2Nlc3NlZCByZXBlYXRlZGx5IHdpdGhpbiBhIHJlbGF0aXZlbHkgc2hvcnQgdGltZXNwYW4pLgotICA8L1A+Ci0gIDxQPgotICA8U1RST05HPkV4YW1wbGU6PC9TVFJPTkc+Ci0gIDwvUD4KLSAgPFA+Ci0gIDxQUkU+Ci0gICBFeHBpcmVzQWN0aXZlIE9uICAgICAgICAgICAgICAgICAgIyBlbmFibGUgZXhwaXJhdGlvbnMKLSAgIEV4cGlyZXNCeVR5cGUgaW1hZ2UvZ2lmIEEyNTkyMDAwICAjIGV4cGlyZSBHSUYgaW1hZ2VzIGFmdGVyIGEgbW9udGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBpbiB0aGUgY2xpZW50J3MgY2FjaGUKLSAgIEV4cGlyZXNCeVR5cGUgdGV4dC9odG1sIE02MDQ4MDAgICAjIEhUTUwgZG9jdW1lbnRzIGFyZSBnb29kIGZvciBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgd2VlayBmcm9tIHRoZSB0aW1lIHRoZXkgd2VyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIGNoYW5nZWQsIHBlcmlvZAotICA8L1BSRT4KLSAgPC9QPgotICA8UD4KLSAgTm90ZSB0aGF0IHRoaXMgZGlyZWN0aXZlIG9ubHkgaGFzIGVmZmVjdCBpZiA8Q09ERT5FeHBpcmVzQWN0aXZlCi0gIE9uPC9DT0RFPiBoYXMgYmVlbiBzcGVjaWZpZWQuICBJdCBvdmVycmlkZXMsIGZvciB0aGUgc3BlY2lmaWVkIE1JTUUKLSAgdHlwZSA8RU0+b25seTwvRU0+LCBhbnkgZXhwaXJhdGlvbiBkYXRlIHNldCBieSB0aGUKLSAgPEEKLSAgIEhSRUY9IiNleHBpcmVzZGVmYXVsdCIKLSAgPkV4cGlyZXNEZWZhdWx0PC9BPgotICBkaXJlY3RpdmUuCi0gIDwvUD4KLSAgPFA+Ci0gIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSBleHBpcmF0aW9uIHRpbWUgY2FsY3VsYXRpb24gdXNpbmcgYW4KLSAgPEEKLSAgIEhSRUY9IiNBbHRTeW4iCi0gID5hbHRlcm5hdGUgc3ludGF4PC9BPiwKLSAgZGVzY3JpYmVkIGxhdGVyIGluIHRoaXMgZG9jdW1lbnQuCi0gIDwvUD4KLSAgPEhSPgotICA8SDI+PEEgTkFNRT0iZXhwaXJlc2RlZmF1bHQiPgotICAgRXhwaXJlc0RlZmF1bHQgZGlyZWN0aXZlCi0gIDwvQT48L0gyPgotICA8IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgRXhwaXJlc0RlZmF1bHR9IGRpcmVjdGl2ZSZndDsgLS0+Ci0gIDxQPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEV4cGlyZXNEZWZhdWx0IDxFTT4mbHQ7Y29kZSZndDtzZWNvbmRzPC9FTT4KLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksCi0gIC5odGFjY2VzcwotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IEluZGV4ZXMKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEV4dGVuc2lvbgotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2V4cGlyZXMKLSAgPC9QPgotICA8UD4KLSAgVGhpcyBkaXJlY3RpdmUgc2V0cyB0aGUgZGVmYXVsdCBhbGdvcml0aG0gZm9yIGNhbGN1bGF0aW5nIHRoZQotICBleHBpcmF0aW9uIHRpbWUgZm9yIGFsbCBkb2N1bWVudHMgaW4gdGhlIGFmZmVjdGVkIHJlYWxtLiAgSXQgY2FuIGJlCi0gIG92ZXJyaWRkZW4gb24gYSB0eXBlLWJ5LXR5cGUgYmFzaXMgYnkgdGhlCi0gIDxBCi0gICBIUkVGPSIjZXhwaXJlc2J5dHlwZSIKLSAgPkV4cGlyZXNCeVR5cGU8L0E+Ci0gIGRpcmVjdGl2ZS4gIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhhdCBkaXJlY3RpdmUgZm9yIGRldGFpbHMgYWJvdXQKLSAgdGhlIHN5bnRheCBvZiB0aGUgYXJndW1lbnQsIGFuZCB0aGUKLSAgPEEKLSAgIEhSRUY9IiNBbHRTeW4iCi0gID5hbHRlcm5hdGUgc3ludGF4PC9BPgotICBkZXNjcmlwdGlvbiBhcyB3ZWxsLgotICA8L1A+Ci0gIDxIUj4KLSAgPEgyPgotICAgPEEgTkFNRT0iQWx0U3luIj5BbHRlcm5hdGUgSW50ZXJ2YWwgU3ludGF4PC9BPgotICA8L0gyPgotICA8UD4KLSAgVGhlIAotICA8QQotICAgSFJFRj0iI2V4cGlyZXNkZWZhdWx0IgotICA+PFNBTVA+RXhwaXJlc0RlZmF1bHQ8L1NBTVA+PC9BPgotICBhbmQKLSAgPEEKLSAgIEhSRUY9IiNleHBpcmVzYnl0eXBlIgotICA+PFNBTVA+RXhwaXJlc0J5VHlwZTwvU0FNUD48L0E+Ci0gIGRpcmVjdGl2ZXMgY2FuIGFsc28gYmUgZGVmaW5lZCBpbiBhIG1vcmUgcmVhZGFibGUgc3ludGF4IG9mIHRoZSBmb3JtOgotICA8L1A+Ci0gIDxETD4KLSAgIDxERD48Q09ERT5FeHBpcmVzRGVmYXVsdCAiJmx0O2Jhc2UmZ3Q7IFtwbHVzXSB7Jmx0O251bSZndDsgJmx0O3R5cGUmZ3Q7fSoiCi0gICAgPEJSPgotICAgIEV4cGlyZXNCeVR5cGUgdHlwZS9lbmNvZGluZyAiJmx0O2Jhc2UmZ3Q7IFtwbHVzXQotICAgICAgeyZsdDtudW0mZ3Q7ICZsdDt0eXBlJmd0O30qIjwvQ09ERT4KLSAgIDwvREQ+Ci0gIDwvREw+Ci0gIDxQPgotICB3aGVyZSAmbHQ7YmFzZSZndDsgaXMgb25lIG9mOgotICA8L1A+Ci0gIDxNRU5VPgotICAgPExJPjxTQU1QPmFjY2VzczwvU0FNUD4gIAotICAgPC9MST4KLSAgIDxMST48U0FNUD5ub3c8L1NBTVA+IChlcXVpdmFsZW50IHRvICc8U0FNUD5hY2Nlc3M8L1NBTVA+JykKLSAgIDwvTEk+Ci0gICA8TEk+PFNBTVA+bW9kaWZpY2F0aW9uPC9TQU1QPgotICAgPC9MST4KLSAgPC9NRU5VPgotICA8UD4KLSAgVGhlICc8U0FNUD5wbHVzPC9TQU1QPicga2V5d29yZCBpcyBvcHRpb25hbC4gICZsdDtudW0mZ3Q7IHNob3VsZCBiZSBhbgotICBpbnRlZ2VyIHZhbHVlIFthY2NlcHRhYmxlIHRvIDxTQU1QPmF0b2koKTwvU0FNUD5dLCBhbmQgJmx0O3R5cGUmZ3Q7Ci0gIGlzIG9uZSBvZjoKLSAgPC9QPgotICA8TUVOVT4KLSAgIDxMST48U0FNUD55ZWFyczwvU0FNUD4KLSAgIDwvTEk+Ci0gICA8TEk+PFNBTVA+bW9udGhzPC9TQU1QPgotICAgPC9MST4KLSAgIDxMST48U0FNUD53ZWVrczwvU0FNUD4KLSAgIDwvTEk+Ci0gICA8TEk+PFNBTVA+ZGF5czwvU0FNUD4KLSAgIDwvTEk+Ci0gICA8TEk+PFNBTVA+aG91cnM8L1NBTVA+Ci0gICA8L0xJPgotICAgPExJPjxTQU1QPm1pbnV0ZXM8L1NBTVA+Ci0gICA8L0xJPgotICAgPExJPjxTQU1QPnNlY29uZHM8L1NBTVA+Ci0gICA8L0xJPgotICA8L01FTlU+Ci0gIDxQPgotICBGb3IgZXhhbXBsZSwgYW55IG9mIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlcyBjYW4gYmUgdXNlZCB0byBtYWtlCi0gIGRvY3VtZW50cyBleHBpcmUgMSBtb250aCBhZnRlciBiZWluZyBhY2Nlc3NlZCwgYnkgZGVmYXVsdDoKLSAgPC9QPgotICA8REw+Ci0gICA8REQ+PENPREU+RXhwaXJlc0RlZmF1bHQgImFjY2VzcyBwbHVzIDEgbW9udGgiCi0gICAgPEJSPgotICAgIEV4cGlyZXNEZWZhdWx0ICJhY2Nlc3MgcGx1cyA0IHdlZWtzIgotICAgIDxCUj4KLSAgICBFeHBpcmVzRGVmYXVsdCAiYWNjZXNzIHBsdXMgMzAgZGF5cyI8L0NPREU+Ci0gICA8L0REPgotICA8L0RMPgotICA8UD4KLSAgVGhlIGV4cGlyeSB0aW1lIGNhbiBiZSBmaW5lLXR1bmVkIGJ5IGFkZGluZyBzZXZlcmFsICcmbHQ7bnVtJmd0OwotICAmbHQ7dHlwZSZndDsnIGNsYXVzZXM6Ci0gIDwvUD4KLSAgPERMPgotICAgPEREPjxDT0RFPkV4cGlyZXNCeVR5cGUgdGV4dC9odG1sICJhY2Nlc3MgcGx1cyAxIG1vbnRoIDE1IGRheXMgMiBob3VycyIKLSAgICA8QlI+Ci0gICAgRXhwaXJlc0J5VHlwZSBpbWFnZS9naWYgIm1vZGlmaWNhdGlvbiBwbHVzIDUgaG91cnMgMyBtaW51dGVzIjwvQ09ERT4KLSAgIDwvREQ+Ci0gIDwvREw+Ci0gIDxQPgotICBOb3RlIHRoYXQgaWYgeW91IHVzZSBhIG1vZGlmaWNhdGlvbiBkYXRlIGJhc2VkIHNldHRpbmcsIHRoZSBFeHBpcmVzCi0gIGhlYWRlciB3aWxsIDxTVFJPTkc+bm90PC9TVFJPTkc+IGJlIGFkZGVkIHRvIGNvbnRlbnQgdGhhdCBkb2VzCi0gIG5vdCBjb21lIGZyb20gYSBmaWxlIG9uIGRpc2suICBUaGlzIGlzIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZXJlIGlzCi0gIG5vIG1vZGlmaWNhdGlvbiB0aW1lIGZvciBzdWNoIGNvbnRlbnQuCi0KLSAgPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLSA8L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2hlYWRlcnMuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfaGVhZGVycy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDZlNGY2Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfaGVhZGVycy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIG1vZHVsZSBtb2RfaGVhZGVyczwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPk1vZHVsZSBtb2RfaGVhZGVyczwvSDE+Ci0KLVRoZSBvcHRpb25hbCBoZWFkZXJzIG1vZHVsZSBhbGxvd3MgZm9yIHRoZSBjdXN0b21pemF0aW9uIG9mIEhUVFAKLXJlc3BvbnNlIGhlYWRlcnMuIEhlYWRlcnMgY2FuIGJlIG1lcmdlZCwgcmVwbGFjZWQgb3IgcmVtb3ZlZC4gVGhlCi1kaXJlY3RpdmVzIGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50IGFyZSBvbmx5IGF2YWlsYWJsZSBpZiBBcGFjaGUgaXMKLWNvbXBpbGVkIHdpdGggPFNUUk9ORz5tb2RfaGVhZGVycy5jPC9TVFJPTkc+LgotCi08SFI+Ci0KLTxIMj5EaXJlY3RpdmU8L0gyPgotPFVMPgotPExJPjxBIEhSRUY9IiNoZWFkZXIiPkhlYWRlcjwvQT4KLTwvVUw+Ci0KLTxIUj4KLQotPEgyPjxBIE5BTUU9ImhlYWRlciI+SGVhZGVyPC9BPjwvSDI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEhlYWRlciBbIHNldCB8IGFwcGVuZCB8IGFkZCBdCi0gPEVNPmhlYWRlcjwvRU0+IDxFTT52YWx1ZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBIZWFkZXIgdW5zZXQgPEVNPmhlYWRlcjwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgYWNjZXNzLmNvbmYsCi0gLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBvcHRpb25hbDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2hlYWRlcjxQPgotCi1UaGlzIGRpcmVjdGl2ZSBjYW4gcmVwbGFjZSwgbWVyZ2Ugb3IgcmVtb3ZlIEhUVFAgcmVzcG9uc2UgaGVhZGVycy4gVGhlCi1hY3Rpb24gaXQgcGVyZm9ybXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJndW1lbnQuIFRoaXMgY2FuIGJlIG9uZQotb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0KLTxVTD4KLTxMST48U1RST05HPnNldDwvU1RST05HPjxCUj4KLSAgVGhlIHJlc3BvbnNlIGhlYWRlciBpcyBzZXQsIHJlcGxhY2luZyBhbnkgcHJldmlvdXMgaGVhZGVyIHdpdGggdGhpcyBuYW1lCi0KLTxMST48U1RST05HPmFwcGVuZDwvU1RST05HPjxCUj4KLSAgVGhlIHJlc3BvbnNlIGhlYWRlciBpcyBhcHBlbmRlZCB0byBhbnkgZXhpc3RpbmcgaGVhZGVyIG9mIHRoZSBzYW1lCi0gIG5hbWUuIFdoZW4gYSBuZXcgdmFsdWUgaXMgbWVyZ2VkIG9udG8gYW4gZXhpc3RpbmcgaGVhZGVyIGl0IGlzCi0gIHNlcGFyYXRlZCBmcm9tIHRoZSBleGlzdGluZyBoZWFkZXIgd2l0aCBhIGNvbW1hLiBUaGlzIGlzIHRoZSBIVFRQIHN0YW5kYXJkCi0gIHdheSBvZiBnaXZpbmcgYSBoZWFkZXIgbXVsdGlwbGUgdmFsdWVzLgotCi08TEk+PFNUUk9ORz5hZGQ8L1NUUk9ORz48QlI+Ci0gIFRoZSByZXNwb25zZSBoZWFkZXIgaXMgYWRkZWQgdG8gdGhlIGV4aXN0aW5nIHNldCBvZiBoZWFkZXJzLCBldmVuIGlmCi0gIHRoaXMgaGVhZGVyIGFscmVhZHkgZXhpc3RzLiBUaGlzIGNhbiByZXN1bHQgaW4gdHdvIChvciBtb3JlKSBoZWFkZXJzCi0gIGhhdmluZyB0aGUgc2FtZSBuYW1lLiBUaGlzIGNhbiBsZWFkIHRvIHVuZm9yZXNlZW4gY29uc2VxdWVuY2VzLCBhbmQgaW4KLSAgZ2VuZXJhbCAiYXBwZW5kIiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgotCi08TEk+PFNUUk9ORz51bnNldDwvU1RST05HPjxCUj4KLSAgVGhlIHJlc3BvbnNlIGhlYWRlciBvZiB0aGlzIG5hbWUgaXMgcmVtb3ZlZCwgaWYgaXQgZXhpc3RzLiBJZiB0aGVyZSBhcmUKLSAgbXVsdGlwbGUgaGVhZGVycyBvZiB0aGUgc2FtZSBuYW1lLCBhbGwgd2lsbCBiZSByZW1vdmVkLgotPC9VTD4KLQotVGhpcyBhcmd1bWVudCBpcyBmb2xsb3dlZCBieSBhIGhlYWRlciBuYW1lLCB3aGljaCBjYW4gaW5jbHVkZSB0aGUKLWZpbmFsIGNvbG9uLCBidXQgaXQgaXMgbm90IHJlcXVpcmVkLiBDYXNlIGlzIGlnbm9yZWQuIEZvcgotYWRkLCBhcHBlbmQgYW5kIHNldCBhIHZhbHVlIGlzIGdpdmVuIGFzIHRoZSB0aGlyZCBhcmd1bWVudC4gSWYgdGhpcwotdmFsdWUgY29udGFpbnMgc3BhY2VzLCBpdCBzaG91bGQgYmUgc3Vycm91bmRlZCBieSBkb3VibGUgcXVvdGVzLgotRm9yIHVuc2V0LCBubyB2YWx1ZSBzaG91bGQgYmUgZ2l2ZW4uCi0KLTxIMz5PcmRlciBvZiBQcm9jZXNzaW5nPC9IMz4KLQotVGhlIEhlYWRlciBkaXJlY3RpdmUgY2FuIG9jY3VyIGFsbW9zdCBhbnl3aGVyZSB3aXRoaW4gdGhlIHNlcnZlcgotY29uZmlndXJhdGlvbi4gSXQgaXMgdmFsaWQgaW4gdGhlIG1haW4gc2VydmVyIGNvbmZpZyBhbmQgdmlydHVhbCBob3N0Ci1zZWN0aW9ucywgaW5zaWRlICZsdDtEaXJlY3RvcnkmZ3Q7LCAmbHQ7TG9jYXRpb24mZ3Q7IGFuZCAmbHQ7RmlsZXMmZ3Q7Ci1zZWN0aW9ucywgYW5kIHdpdGhpbiAuaHRhY2Nlc3MgZmlsZXMuCi08UD4KLVRoZSBIZWFkZXIgZGlyZWN0aXZlcyBhcmUgcHJvY2Vzc2VkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci08T0w+Ci08TEk+bWFpbiBzZXJ2ZXIKLTxMST52aXJ0dWFsIGhvc3QKLTxMST4mbHQ7RGlyZWN0b3J5Jmd0OyBzZWN0aW9ucyBhbmQgLmh0YWNjZXNzCi08TEk+Jmx0O0xvY2F0aW9uJmd0OwotPExJPiZsdDtGaWxlcyZndDsKLTwvT0w+Ci0KLU9yZGVyIGlzIGltcG9ydGFudC4gVGhlc2UgdHdvIGhlYWRlcnMgaGF2ZSBhIGRpZmZlcmVudCBlZmZlY3QgaWYgcmV2ZXJzZWQ6Ci08UFJFPgotSGVhZGVyIGFwcGVuZCBBdXRob3IgIkpvaG4gUC4gRG9lIgotSGVhZGVyIHVuc2V0IEF1dGhvcgotPC9QUkU+Ci0KLVRoaXMgd2F5IHJvdW5kLCB0aGUgQXV0aG9yIGhlYWRlciBpcyBub3Qgc2V0LiBJZiByZXZlcnNlZCwgdGhlIEF1dGhvcgotaGVhZGVyIGlzIHNldCB0byAiSm9obiBQLiBEb2UiLgotPFA+Ci0KLVRoZSBIZWFkZXIgZGlyZWN0aXZlcyBhcmUgcHJvY2Vzc2VkIGp1c3QgYmVmb3JlIHRoZSByZXNwb25zZSBpcyBzZW50Ci1ieSBpdHMgaGFuZGxlci4gVGhlc2UgbWVhbnMgdGhhdCBzb21lIGhlYWRlcnMgdGhhdCBhcmUgYWRkZWQganVzdAotYmVmb3JlIHRoZSByZXNwb25zZSBpcyBzZW50IGNhbm5vdCBiZSB1bnNldCBvciBvdmVycmlkZGVuLiBUaGlzCi1pbmNsdWRlcyBoZWFkZXJzIHN1Y2ggYXMgIkRhdGUiIGFuZCAiU2VydmVyIi4KLTxQPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9pbWFwLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2ltYXAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY4ZDA2OS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX2ltYXAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSBtb2R1bGUgbW9kX2ltYXA8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5Nb2R1bGUgbW9kX2ltYXA8L0gxPgotCi1UaGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4gdGhlIDxDT0RFPm1vZF9pbWFwLmM8L0NPREU+IGZpbGUsIGFuZCBpcwotY29tcGlsZWQgaW4gYnkgZGVmYXVsdC4gSXQgcHJvdmlkZXMgZm9yIDxDT0RFPi5tYXA8L0NPREU+IGZpbGVzLAotcmVwbGFjaW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSA8Q09ERT5pbWFnZW1hcDwvQ09ERT4gQ0dJCi1wcm9ncmFtLiBBbnkgZGlyZWN0b3J5IG9yIGRvY3VtZW50IHR5cGUgY29uZmlndXJlZCB0byB1c2UgdGhlIGhhbmRsZXIKLTxDT0RFPmltYXAtZmlsZTwvQ09ERT4gKHVzaW5nIGVpdGhlciA8Q09ERT48QQotSFJFRj0ibW9kX21pbWUuaHRtbCNhZGRoYW5kbGVyIj5BZGRIYW5kbGVyPC9BPiA8L0NPREU+IG9yIDxDT0RFPjxBCi1IUkVGPSJtb2RfbWltZS5odG1sI3NldGhhbmRsZXIiPlNldEhhbmRsZXI8L0E+PC9DT0RFPikgd2lsbCBiZQotcHJvY2Vzc2VkIGJ5IHRoaXMgbW9kdWxlLgotCi08SDI+U3VtbWFyeTwvSDI+Ci0KLVRoaXMgbW9kdWxlIGlzIGluIHRoZSBkZWZhdWx0IEFwYWNoZSBkaXN0cmlidXRpb24uIFRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlIHdpbGwKLWFjdGl2YXRlIGZpbGVzIGVuZGluZyB3aXRoIDxDT0RFPi5tYXA8L0NPREU+IGFzIGltYWdlbWFwIGZpbGVzOgotCi08QkxPQ0tRVU9URT48Q09ERT5BZGRIYW5kbGVyIGltYXAtZmlsZSBtYXA8L0NPREU+PC9CTE9DS1FVT1RFPgotCi1Ob3RlIHRoYXQgdGhlIGZvbGxvd2luZyBpcyBzdGlsbCBzdXBwb3J0ZWQ6Ci0KLSA8QkxPQ0tRVU9URT48Q09ERT5BZGRUeXBlIGFwcGxpY2F0aW9uL3gtaHR0cGQtaW1hcCBtYXA8L0NPREU+PC9CTE9DS1FVT1RFPgotCi1Ib3dldmVyLCB3ZSBhcmUgdHJ5aW5nIHRvIHBoYXNlIG91dCAibWFnaWMgTUlNRSB0eXBlcyIgc28gd2UgYXJlIGRlcHJlY2F0aW5nCi10aGlzIG1ldGhvZC4KLQotPEgyPk5ldyBGZWF0dXJlczwvSDI+Ci1UaGUgaW1hZ2VtYXAgbW9kdWxlIGFkZHMgc29tZSBuZXcgZmVhdHVyZXMgdGhhdCB3ZXJlIG5vdAotcG9zc2libGUgd2l0aCBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIGltYWdlbWFwIHByb2dyYW1zLjxQPgotCi08VUw+Ci08TEk+VVJMIHJlZmVyZW5jZXMgcmVsYXRpdmUgdG8gdGhlIFJlZmVyZXI6IGluZm9ybWF0aW9uLgotPExJPkRlZmF1bHQgJmx0O0JBU0UmZ3Q7IGFzc2lnbm1lbnQgdGhyb3VnaCBhIG5ldyBtYXAgZGlyZWN0aXZlCi08Q09ERT5iYXNlPC9DT0RFPi4KLTxMST5ObyBuZWVkIGZvciA8Q09ERT5pbWFnZW1hcC5jb25mPC9DT0RFPiBmaWxlLgotPExJPlBvaW50IHJlZmVyZW5jZXMuCi08TEk+Q29uZmlndXJhYmxlIGdlbmVyYXRpb24gb2YgaW1hZ2VtYXAgbWVudXMuCi08L1VMPgotPFA+Ci0KLTxIMj5Db25maWd1cmF0aW9uIERpcmVjdGl2ZXM8L0gyPgotPFVMPgotPExJPjxBIEhSRUY9IiNpbWFwbWVudSI+SW1hcE1lbnU8L0E+Ci08TEk+PEEgSFJFRj0iI2ltYXBkZWZhdWx0Ij5JbWFwRGVmYXVsdDwvQT4KLTxMST48QSBIUkVGPSIjaW1hcGJhc2UiPkltYXBCYXNlPC9BPgotPC9VTD4KLQotCi08UD4KLQotPEgzPjxBIE5BTUU9ImltYXBtZW51Ij5JbWFwTWVudTwvQT48L0gzPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBJbWFwTWVudSA8Q09ERT57bm9uZSwgZm9ybWF0dGVkLCBzZW1pZm9ybWF0dGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5mb3JtYXR0ZWR9PC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gSW5kZXhlczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2ltYXAuYzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBJbWFwTWVudSBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUKLTEuMSBhbmQgbGF0ZXIuPFA+Ci0KLVRoZSBJbWFwTWVudSBkaXJlY3RpdmUgZGV0ZXJtaW5lcyB0aGUgYWN0aW9uIHRha2VuIGlmIGFuIGltYWdlbWFwIGZpbGUKLWlzIGNhbGxlZCB3aXRob3V0IHZhbGlkIGNvb3JkaW5hdGVzLgotPERMPgotICA8RFQ+PENPREU+bm9uZTwvQ09ERT4KLSAgPEREPklmIEltYXBNZW51IGlzCi0gICAgICAgPENPREU+bm9uZTwvQ09ERT4sIG5vIG1lbnUgaXMgZ2VuZXJhdGVkLCBhbmQgdGhlIDxDT0RFPmRlZmF1bHQ8L0NPREU+Ci0gICAgICAgYWN0aW9uIGlzIHBlcmZvcm1lZC4KLSAgPERUPjxDT0RFPmZvcm1hdHRlZDwvQ09ERT4KLSAgPEREPkEgPENPREU+Zm9ybWF0dGVkPC9DT0RFPiBtZW51IGlzIHRoZSBzaW1wbGVzdCBtZW51LiAgQ29tbWVudHMKLSAgICAgICBpbiB0aGUgaW1hZ2VtYXAgZmlsZSBhcmUgaWdub3JlZC4gIEEgbGV2ZWwgb25lIGhlYWRlciBpcwotICAgICAgIHByaW50ZWQsIHRoZW4gYW4gaHJ1bGUsIHRoZW4gdGhlIGxpbmtzIGVhY2ggb24gYSBzZXBhcmF0ZSBsaW5lLgotICAgICAgIFRoZSBtZW51IGhhcyBhIGNvbnNpc3RlbnQsIHBsYWluIGxvb2sgY2xvc2UgdG8gdGhhdCBvZgotICAgICAgIGEgZGlyZWN0b3J5IGxpc3RpbmcuCi0gIDxEVD48Q09ERT5zZW1pZm9ybWF0dGVkPC9DT0RFPgotICA8REQ+SW4gdGhlIDxDT0RFPnNlbWlmb3JtYXR0ZWQ8L0NPREU+IG1lbnUsIGNvbW1lbnRzIGFyZSBwcmludGVkCi0gICAgICAgd2hlcmUgdGhleSBvY2N1ciBpbiB0aGUgaW1hZ2VtYXAgZmlsZS4gIEJsYW5rIGxpbmVzIGFyZSB0dXJuZWQKLSAgICAgICBpbnRvIEhUTUwgYnJlYWtzLiAgTm8gaGVhZGVyIG9yIGhydWxlIGlzIHByaW50ZWQsIGJ1dCBvdGhlcndpc2UKLSAgICAgICB0aGUgbWVudSBpcyB0aGUgc2FtZSBhcyBhIDxDT0RFPmZvcm1hdHRlZDwvQ09ERT4gbWVudS4KLSAgPERUPjxDT0RFPnVuZm9ybWF0dGVkPC9DT0RFPgotICA8REQ+Q29tbWVudHMgYXJlIHByaW50ZWQsIGJsYW5rIGxpbmVzIGFyZSBpZ25vcmVkLiAgTm90aGluZyBpcwotICAgICAgIHByaW50ZWQgdGhhdCBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlIGltYWdlbWFwIGZpbGUuICBBbGwgYnJlYWtzCi0gICAgICAgYW5kIGhlYWRlcnMgbXVzdCBiZSBpbmNsdWRlZCBhcyBjb21tZW50cyBpbiB0aGUgaW1hZ2VtYXAgZmlsZS4KLSAgICAgICBUaGlzIGdpdmVzIHlvdSB0aGUgbW9zdCBmbGV4aWJpbGl0eSBvdmVyIHRoZSBhcHBlYXJhbmNlIG9mIHlvdXIKLSAgICAgICBtZW51cywgYnV0IHJlcXVpcmVzIHlvdSB0byB0cmVhdCB5b3VyIG1hcCBmaWxlcyBhcyBIVE1MIGluc3RlYWQKLSAgICAgICBvZiBwbGFpbnRleHQuCi08L0RMPgotCi08UD4KLQotPEgzPjxBIE5BTUU9ImltYXBkZWZhdWx0Ij5JbWFwRGVmYXVsdDwvQT48L0gzPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBJbWFwRGVmYXVsdCA8Q09ERT57ZXJyb3IsIG5vY29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAsIHJlZmVyZXIsIFVSTH08L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBJbmRleGVzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfaW1hcC5jPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IEltYXBEZWZhdWx0IGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZQotMS4xIGFuZCBsYXRlci48UD4KLQotCi1UaGUgSW1hcERlZmF1bHQgZGlyZWN0aXZlIHNldHMgdGhlIGRlZmF1bHQgPENPREU+ZGVmYXVsdDwvQ09ERT4gdXNlZCBpbgotdGhlIGltYWdlbWFwIGZpbGVzLiAgSXRzIHZhbHVlIGlzIG92ZXJyaWRkZW4gYnkgYSA8Q09ERT5kZWZhdWx0PC9DT0RFPgotZGlyZWN0aXZlIHdpdGhpbiB0aGUgaW1hZ2VtYXAgZmlsZS4gIElmIG5vdCBwcmVzZW50LCB0aGUKLTxDT0RFPmRlZmF1bHQ8L0NPREU+IGFjdGlvbiBpcyA8Q09ERT5ub2NvbnRlbnQ8L0NPREU+LCB3aGljaCBtZWFucwotdGhhdCBhIDxDT0RFPjIwNCBObyBDb250ZW50PC9DT0RFPiBpcyBzZW50IHRvIHRoZSBjbGllbnQuICBJbiB0aGlzCi1jYXNlLCB0aGUgY2xpZW50IHNob3VsZCBjb250aW51ZSB0byBkaXNwbGF5IHRoZSBvcmlnaW5hbCBwYWdlLgotCi08UD4KLQotPEgzPjxBIE5BTUU9ImltYXBiYXNlIj5JbWFwQmFzZTwvQT48L0gzPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBJbWFwQmFzZSA8Q09ERT57bWFwLCByZWZlcmVyLCBVUkx9PC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gSW5kZXhlczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2ltYXAuYzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBJbWFwQmFzZSBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUKLTEuMSBhbmQgbGF0ZXIuPFA+Ci0KLVRoZSBJbWFwQmFzZSBkaXJlY3RpdmUgc2V0cyB0aGUgZGVmYXVsdCA8Q09ERT5iYXNlPC9DT0RFPiB1c2VkIGluCi10aGUgaW1hZ2VtYXAgZmlsZXMuICBJdHMgdmFsdWUgaXMgb3ZlcnJpZGRlbiBieSBhIDxDT0RFPmJhc2U8L0NPREU+Ci1kaXJlY3RpdmUgd2l0aGluIHRoZSBpbWFnZW1hcCBmaWxlLiAgSWYgbm90IHByZXNlbnQsIHRoZQotPENPREU+YmFzZTwvQ09ERT4gZGVmYXVsdHMgdG8gPENPREU+aHR0cDovL3NlcnZlcm5hbWUvPC9DT0RFPi4KLQotPEhSPgotPFA+Ci0KLTxIMj5JbWFnZW1hcCBGaWxlPC9IMj4KLVRoZSBsaW5lcyBpbiB0aGUgaW1hZ2VtYXAgZmlsZXMgY2FuIGhhdmUgb25lIG9mIHNldmVyYWwgZm9ybWF0czoKLTxCTE9DS1FVT1RFPgotPENPREU+ZGlyZWN0aXZlIHZhbHVlIFt4LHkgLi4uXTwvQ09ERT48QlI+Ci08Q09ERT5kaXJlY3RpdmUgdmFsdWUgIk1lbnUgdGV4dCIgW3gseSAuLi5dPC9DT0RFPjxCUj4KLTxDT0RFPmRpcmVjdGl2ZSB2YWx1ZSB4LHkgLi4uICJNZW51IHRleHQiPC9DT0RFPjxCUj4KLTwvQkxPQ0tRVU9URT4KLVRoZSBkaXJlY3RpdmUgaXMgb25lIG9mIDxDT0RFPmJhc2U8L0NPREU+LCA8Q09ERT5kZWZhdWx0PC9DT0RFPiwKLTxDT0RFPnBvbHk8L0NPREU+LCA8Q09ERT5jaXJjbGU8L0NPREU+LCA8Q09ERT5yZWN0PC9DT0RFPiwgb3IKLTxDT0RFPnBvaW50PC9DT0RFPi4gIFRoZSB2YWx1ZSBpcyBhbiBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwsIG9yIG9uZQotb2YgdGhlIHNwZWNpYWwgdmFsdWVzIGxpc3RlZCBiZWxvdy4gIFRoZSBjb29yZGluYXRlcyBhcmUKLTxDT0RFPngseTwvQ09ERT4gcGFpcnMgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuICBUaGUgcXVvdGVkIHRleHQgaXMKLXVzZWQgYXMgdGhlIHRleHQgb2YgdGhlIGxpbmsgaWYgYSBpbWFnZW1hcCBtZW51IGlzIGdlbmVyYXRlZC4gIExpbmVzCi1iZWdpbm5pbmcgd2l0aCAnIycgYXJlIGNvbW1lbnRzLgotCi08SDM+SW1hZ2VtYXAgRmlsZSBEaXJlY3RpdmVzPC9IMz4KLVRoZXJlIGFyZSBzaXggZGlyZWN0aXZlcyBhbGxvd2VkIGluIHRoZSBpbWFnZW1hcCBmaWxlLiAgVGhlIGRpcmVjdGl2ZXMKLWNhbiBjb21lIGluIGFueSBvcmRlciwgYnV0IGFyZSBwcm9jZXNzZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGZvdW5kCi1pbiB0aGUgaW1hZ2VtYXAgZmlsZS4KLTxETD4KLTxEVD48Q09ERT5iYXNlPC9DT0RFPiBEaXJlY3RpdmUKLTxERD5IYXMgdGhlIGVmZmVjdCBvZiA8Q09ERT4mbHQ7QkFTRSBIUkVGPSJ2YWx1ZSImZ3Q7PC9DT0RFPi4gIFRoZQotICAgICBub24tYWJzb2x1dGUgVVJMcyBvZiB0aGUgbWFwLWZpbGUgYXJlIHRha2VuIHJlbGF0aXZlIHRvIHRoaXMgdmFsdWUuCi0gICAgIFRoZSA8Q09ERT5iYXNlPC9DT0RFPiBkaXJlY3RpdmUgb3ZlcnJpZGVzIEltYXBCYXNlIGFzIHNldCBpbiBhCi0gICAgIC5odGFjY2VzcyBmaWxlIG9yIGluIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlcy4gIEluIHRoZSBhYnNlbmNlCi0gICAgIG9mIGFuIEltYXBCYXNlIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlLCA8Q09ERT5iYXNlPC9DT0RFPiBkZWZhdWx0cyB0bwotICAgICA8Q09ERT5odHRwOi8vc2VydmVyX25hbWUvPC9DT0RFPi4gPEJSPgotICAgICA8Q09ERT5iYXNlX3VyaTwvQ09ERT4gaXMgc3lub255bW91cyB3aXRoIDxDT0RFPmJhc2U8L0NPREU+LiAgTm90ZSB0aGF0Ci0gICAgIGEgdHJhaWxpbmcgc2xhc2ggb24gdGhlIFVSTCBpcyBzaWduaWZpY2FudC4KLTxQPgotPERUPjxDT0RFPmRlZmF1bHQ8L0NPREU+IERpcmVjdGl2ZQotPEREPlRoZSBhY3Rpb24gdGFrZW4gaWYgdGhlIGNvb3JkaW5hdGVzIGdpdmVuIGRvIG5vdCBmaXQgYW55IG9mIHRoZQotICAgICA8Q09ERT5wb2x5PC9DT0RFPiwgPENPREU+Y2lyY2xlPC9DT0RFPiBvciA8Q09ERT5yZWN0PC9DT0RFPgotICAgICBkaXJlY3RpdmVzLCBhbmQgdGhlcmUgYXJlIG5vIDxDT0RFPnBvaW50PC9DT0RFPiBkaXJlY3RpdmVzLiAgRGVmYXVsdHMKLSAgICAgdG8gPENPREU+bm9jb250ZW50PC9DT0RFPiBpbiB0aGUgYWJzZW5jZSBvZiBhbiBJbWFwRGVmYXVsdAotICAgICBjb25maWd1cmF0aW9uIHNldHRpbmcsIGNhdXNpbmcgYSBzdGF0dXMgY29kZSBvZiA8Q09ERT4yMDQgTm8KLSAgICAgQ29udGVudDwvQ09ERT4gdG8gYmUgcmV0dXJuZWQuICBUaGUgY2xpZW50IHNob3VsZCBrZWVwIHRoZSBzYW1lCi0gICAgIHBhZ2UgZGlzcGxheWVkLgotPFA+Ci08RFQ+PENPREU+cG9seTwvQ09ERT4gRGlyZWN0aXZlCi08REQ+VGFrZXMgdGhyZWUgdG8gb25lLWh1bmRyZWQgcG9pbnRzLCBhbmQgaXMgb2JleWVkIGlmIHRoZSB1c2VyIHNlbGVjdGVkCi0gICAgIGNvb3JkaW5hdGVzIGZhbGwgd2l0aGluIHRoZSBwb2x5Z29uIGRlZmluZWQgYnkgdGhlc2UgcG9pbnRzLgotPFA+Ci08RFQ+PENPREU+Y2lyY2xlPC9DT0RFPgotPEREPlRha2VzIHRoZSBjZW50ZXIgY29vcmRpbmF0ZXMgb2YgYSBjaXJjbGUgYW5kIGEgcG9pbnQgb24gdGhlIGNpcmNsZS4gSXMKLSAgICAgb2JleWVkIGlmIHRoZSB1c2VyIHNlbGVjdGVkIHBvaW50IGlzIHdpdGggdGhlIGNpcmNsZS4KLTxQPgotPERUPjxDT0RFPnJlY3Q8L0NPREU+IERpcmVjdGl2ZQotPEREPlRha2VzIHRoZSBjb29yZGluYXRlcyBvZiB0d28gb3Bwb3NpbmcgY29ybmVycyBvZiBhIHJlY3RhbmdsZS4gIE9iZXllZAotICAgICBpZiB0aGUgcG9pbnQgc2VsZWN0ZWQgaXMgd2l0aGluIHRoaXMgcmVjdGFuZ2xlLgotPFA+Ci08RFQ+PENPREU+cG9pbnQ8L0NPREU+IERpcmVjdGl2ZQotPEREPlRha2VzIGEgc2luZ2xlIHBvaW50LiAgVGhlIHBvaW50IGRpcmVjdGl2ZSBjbG9zZXN0IHRvIHRoZSB1c2VyCi0gICAgIHNlbGVjdGVkIHBvaW50IGlzIG9iZXllZCBpZiBubyBvdGhlciBkaXJlY3RpdmVzIGFyZSBzYXRpc2ZpZWQuCi0gICAgIE5vdGUgdGhhdCA8Q09ERT5kZWZhdWx0PC9DT0RFPiB3aWxsIG5vdCBiZSBmb2xsb3dlZCBpZiBhCi0gICAgIDxDT0RFPnBvaW50PC9DT0RFPiBkaXJlY3RpdmUgaXMgcHJlc2VudCBhbmQgdmFsaWQgY29vcmRpbmF0ZXMgYXJlCi0gICAgIGdpdmVuLgotPC9ETD4KLQotCi0KLTxIMz5WYWx1ZXM8L0gzPgotVGhlIHZhbHVlcyBmb3IgZWFjaCBvZiB0aGUgZGlyZWN0aXZlcyBjYW4gYW55IG9mIHRoZSBmb2xsb3dpbmc6Ci08REw+Ci0gIDxEVD5hIFVSTAotICA8REQ+VGhlIFVSTCBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUgVVJMLiAgUmVsYXRpdmUgVVJMcyBjYW4KLSAgICAgICBjb250YWluICcuLicgc3ludGF4IGFuZCB3aWxsIGJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZQotICAgICAgIDxDT0RFPmJhc2U8L0NPREU+IHZhbHVlLiA8QlI+Ci0gICAgICAgPENPREU+YmFzZTwvQ09ERT4gaXRzZWxmIHdpbGwgbm90IHJlc29sdmVkIGFjY29yZGluZyB0byB0aGUgY3VycmVudAotICAgICAgIHZhbHVlLiBBIHN0YXRlbWVudCA8Q09ERT5iYXNlIG1haWx0bzo8L0NPREU+IHdpbGwgd29yayBwcm9wZXJseSwgdGhvdWdoLgotPFA+Ci0gIDxEVD48Q09ERT5tYXA8L0NPREU+Ci0gIDxERD5FcXVpdmFsZW50IHRvIHRoZSBVUkwgb2YgdGhlIGltYWdlbWFwIGZpbGUgaXRzZWxmLiAgTm8KLSAgICAgICBjb29yZGluYXRlcyBhcmUgc2VudCB3aXRoIHRoaXMsIHNvIGEgbWVudSB3aWxsIGJlIGdlbmVyYXRlZAotICAgICAgIHVubGVzcyBJbWFwTWVudSBpcyBzZXQgdG8gJ25vbmUnLgotPFA+Ci0gIDxEVD48Q09ERT5tZW51PC9DT0RFPgotICA8REQ+U3lub255bW91cyB3aXRoIDxDT0RFPm1hcDwvQ09ERT4uCi08UD4KLSAgPERUPjxDT0RFPnJlZmVyZXI8L0NPREU+Ci0gIDxERD5FcXVpdmFsZW50IHRvIHRoZSBVUkwgb2YgdGhlIHJlZmVycmluZyBkb2N1bWVudC4KLSAgICAgICBEZWZhdWx0cyB0byA8Q09ERT5odHRwOi8vc2VydmVybmFtZS88L0NPREU+IGlmIG5vIFJlZmVyZXI6Ci0gICAgICAgaGVhZGVyIHdhcyBwcmVzZW50LgotPFA+Ci0gIDxEVD48Q09ERT5ub2NvbnRlbnQ8L0NPREU+Ci0gIDxERD5TZW5kcyBhIHN0YXR1cyBjb2RlIG9mIDxDT0RFPjIwNCBObyBDb250ZW50PC9DT0RFPiwKLSAgICAgICB0ZWxsaW5nIHRoZSBjbGllbnQgdG8ga2VlcCB0aGUgc2FtZSBwYWdlIGRpc3BsYXllZC4gIFZhbGlkIGZvcgotICAgICAgIGFsbCBidXQgPENPREU+YmFzZTwvQ09ERT4uCi08UD4KLSAgPERUPjxDT0RFPmVycm9yPC9DT0RFPgotICA8REQ+RmFpbHMgd2l0aCBhIDxDT0RFPjUwMCBTZXJ2ZXIgRXJyb3I8L0NPREU+LiAgVmFsaWQgZm9yIGFsbCBidXQKLSAgICAgICA8Q09ERT5iYXNlPC9DT0RFPiwgYnV0IHNvcnQgb2Ygc2lsbHkgZm9yIGFueXRoaW5nIGJ1dAotICAgICAgIDxDT0RFPmRlZmF1bHQ8L0NPREU+LgotPC9ETD4KLQotPEgzPkNvb3JkaW5hdGVzPC9IMz4KLTxETD4KLSAgPERUPjxDT0RFPjAsMCAyMDAsMjAwPC9DT0RFPgotICA8REQ+QSBjb29yZGluYXRlIGNvbnNpc3RzIG9mIGFuIDxUVD54PC9UVD4gYW5kIGEgPFRUPnk8L1RUPiB2YWx1ZQotICAgICAgIHNlcGFyYXRlZCBieSBhIGNvbW1hLiAgVGhlIGNvb3JkaW5hdGVzIGFyZSBzZXBhcmF0ZWQgZnJvbSBlYWNoIG90aGVyCi0gICAgICAgYnkgd2hpdGVzcGFjZS4gIFRvIGFjY29tbW9kYXRlIHRoZSB3YXkgTHlueCBoYW5kbGVzIGltYWdlbWFwcywgc2hvdWxkIGEKLSAgICAgICB1c2VyIHNlbGVjdCB0aGUgY29vcmRpbmF0ZSA8Q09ERT4wLDA8L0NPREU+LCBpdCBpcyBhcyBpZgotICAgICAgIG5vIGNvb3JkaW5hdGUgaGFkIGJlZW4gc2VsZWN0ZWQuCi08L0RMPgotCi08SDM+UXVvdGVkIFRleHQ8L0gzPgotPERMPgotICA8RFQ+PENPREU+Ik1lbnUgVGV4dCI8L0NPREU+Ci0gIDxERD5BZnRlciB0aGUgdmFsdWUgb3IgYWZ0ZXIgdGhlIGNvb3JkaW5hdGVzLCB0aGUgbGluZSBvcHRpb25hbGx5IG1heQotICAgICAgIGNvbnRhaW4gdGV4dCB3aXRoaW4gZG91YmxlIHF1b3Rlcy4gIFRoaXMgc3RyaW5nIGlzIHVzZWQgYXMgdGhlCi0gICAgICAgdGV4dCBmb3IgdGhlIGxpbmsgaWYgYSBtZW51IGlzIGdlbmVyYXRlZDo8QlI+Ci0gICAgIDxDT0RFPiZsdDthIEhSRUY9Imh0dHA6Ly9mb28uY29tLyImZ3Q7TWVudSB0ZXh0Jmx0Oy9hJmd0OzwvQ09ERT48QlI+Ci0gICAgICAgSWYgbm8gcXVvdGVkIHRleHQgaXMgcHJlc2VudCwgdGhlIG5hbWUgb2YgdGhlIGxpbmsgd2lsbCBiZSB1c2VkCi0gICAgICAgYXMgdGhlIHRleHQ6PEJSPgotICAgICA8Q09ERT4mbHQ7YSBIUkVGPSJodHRwOi8vZm9vLmNvbS8iJmd0O2h0dHA6Ly9mb28uY29tJmx0Oy9hJmd0OzwvQ09ERT48QlI+Ci0gICAgICAgSXQgaXMgaW1wb3NzaWJsZSB0byBlc2NhcGUgZG91YmxlIHF1b3RlcyB3aXRoaW4gdGhpcyB0ZXh0LgotPC9ETD4KLQotPEhSPgotCi08SDI+RXhhbXBsZSBNYXBmaWxlPC9IMj4KLTxCTE9DS1FVT1RFPjxDT0RFPgotI0NvbW1lbnRzIGFyZSBwcmludGVkIGluIGEgJ2Zvcm1hdHRlZCcgb3IgJ3NlbWlmb3JtYXR0ZWQnIG1lbnUuIDxCUj4KLSNBbmQgY2FuIGNvbnRhaW4gaHRtbCB0YWdzLiAmbHQ7aHImZ3Q7IDxCUj4KLWJhc2UgcmVmZXJlciAgPEJSPgotcG9seSBtYXAgIkNvdWxkIEkgaGF2ZSBhIG1lbnUsIHBsZWFzZT8iICAwLDAgMCwxMCAxMCwxMCAxMCwwIDxCUj4KLXJlY3QgLi4gMCwwIDc3LDI3ICJ0aGUgZGlyZWN0b3J5IG9mIHRoZSByZWZlcmVyIjxCUj4KLWNpcmNsZSBodHRwOi8vd3d3LmluZXRuZWJyLmNvbS9saW5jb2xuL2ZlZWRiYWNrLyAxOTUsMCAzMDUsMjcgPEJSPgotcmVjdCBhbm90aGVyX2ZpbGUgImluIHNhbWUgZGlyZWN0b3J5IGFzIHJlZmVyZXIiIDMwNiwwIDQxOSwyNyAgPEJSPgotcG9pbnQgaHR0cDovL3d3dy56eXp6eXZhLmNvbS8gMTAwLDEwMCA8QlI+Ci1wb2ludCBodHRwOi8vd3d3LnRyaXBvZC5jb20vICAyMDAsMjAwIDxCUj4KLXJlY3QgbWFpbHRvOm5hdGVAdHJpcG9kLmNvbSAxMDAsMTUwIDIwMCwwICJCdWdzPyIgPEJSPgotPC9DT0RFPjwvQkxPQ0tRVU9URT4KLTxQPgotCi08SDI+UmVmZXJlbmNpbmcgeW91ciBtYXBmaWxlPC9IMj4KLTxCTE9DS1FVT1RFPjxDT0RFPgotJmx0O0EgSFJFRj0iL21hcHMvaW1hZ2VtYXAxLm1hcCImZ3Q7IDxCUj4KLSZsdDtJTUcgSVNNQVAgU1JDPSIvaW1hZ2VzL2ltYWdlbWFwMS5naWYiJmd0OyA8QlI+Ci0mbHQ7L0EmZ3Q7Ci08L0NPREU+PC9CTE9DS1FVT1RFPjxQPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotCi0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfaW5jbHVkZS5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9pbmNsdWRlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMThiODAuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9pbmNsdWRlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9pbmNsdWRlPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+TW9kdWxlIG1vZF9pbmNsdWRlPC9IMT4KLQotVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Q09ERT5tb2RfaW5jbHVkZS5jPC9DT0RFPiBmaWxlLCBhbmQKLWlzIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuIEl0IHByb3ZpZGVzIGZvciBzZXJ2ZXItcGFyc2VkIGh0bWwKLWRvY3VtZW50cy4gU2V2ZXJhbCBkaXJlY3RpdmVzIGJleW9uZCB0aGUgb3JpZ2luYWwgTkNTQSBkZWZpbml0aW9uIHdlcmUKLWludHJvZHVjZWQgaW4gQXBhY2hlIDEuMiAtIHRoZXNlIGFyZSBmbGFnZ2VkIGJlbG93IHdpdGggdGhlIHBocmFzZQotIkFwYWNoZSAxLjIgYW5kIGFib3ZlIi4gIE9mIHBhcnRpY3VsYXIgc2lnbmlmaWNhbmNlIGFyZSB0aGUgbmV3IGZsb3cKLWNvbnRyb2wgZGlyZWN0aXZlcyBkb2N1bWVudGVkIGF0IHRoZSBib3R0b20uCi0KLTxIMj5FbmFibGluZyBTZXJ2ZXItU2lkZSBJbmNsdWRlczwvSDI+Ci0KLUFueSBkb2N1bWVudCB3aXRoIGhhbmRsZXIgb2YgInNlcnZlci1wYXJzZWQiIHdpbGwgYmUgcGFyc2VkIGJ5IHRoaXMKLW1vZHVsZSwgaWYgdGhlIDxDT0RFPkluY2x1ZGVzPC9DT0RFPiBvcHRpb24gaXMgc2V0LiBJZiBkb2N1bWVudHMKLWNvbnRhaW5pbmcgc2VydmVyLXNpZGUgaW5jbHVkZSBkaXJlY3RpdmVzIGFyZSBnaXZlbiB0aGUgZXh0ZW5zaW9uCi0uc2h0bWwsIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlcyB3aWxsIG1ha2UgQXBhY2hlIHBhcnNlIHRoZW0gYW5kCi1hc3NpZ24gdGhlIHJlc3VsdGluZyBkb2N1bWVudCB0aGUgbWltZSB0eXBlIG9mIDxDT0RFPnRleHQvaHRtbDwvQ09ERT46Ci0KLTxQUkU+Ci1BZGRUeXBlIHRleHQvaHRtbCAuc2h0bWwKLUFkZEhhbmRsZXIgc2VydmVyLXBhcnNlZCAuc2h0bWwKLTwvUFJFPgotCi1UaGUgZm9sbG93aW5nIGRpcmVjdGl2ZSBtdXN0IGJlIGdpdmVuIGZvciB0aGUgZGlyZWN0b3JpZXMgY29udGFpbmluZwotdGhlIHNodG1sIGZpbGVzICh0eXBpY2FsbHkgaW4gYSA8Q09ERT4mbHQ7RGlyZWN0b3J5Jmd0OzwvQ09ERT4gc2VjdGlvbiwKLWJ1dCB0aGlzIGRpcmVjdGl2ZSBpcyBhbHNvIHZhbGlkIC5odGFjY2VzcyBmaWxlcyBpZiA8Q09ERT5BbGxvd092ZXJyaWRlCi1PcHRpb25zPC9DT0RFPiBpcyBzZXQpOgotCi08UFJFPgotT3B0aW9ucyArSW5jbHVkZXMKLTwvUFJFPgotCi1BbHRlcm5hdGl2ZWx5IHRoZSA8QSBIUkVGPSIjeGJpdGhhY2siPjxDT0RFPlhCaXRIYWNrPC9DT0RFPjwvQT4KLWRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBwYXJzZSBub3JtYWwgKDxDT0RFPnRleHQvaHRtbDwvQ09ERT4pIGZpbGVzLAotYmFzZWQgb24gZmlsZSBwZXJtaXNzaW9ucy4gIDxQPgotCi1Gb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGRvY3VtZW50cyB3aXRoIG1pbWUgdHlwZQotPENPREU+dGV4dC94LXNlcnZlci1wYXJzZWQtaHRtbDwvQ09ERT4gb3IKLTxDT0RFPnRleHQveC1zZXJ2ZXItcGFyc2VkLWh0bWwzPC9DT0RFPiB3aWxsIGFsc28gYmUgcGFyc2VkCi0oYW5kIHRoZSByZXN1bHRpbmcgb3V0cHV0IGdpdmVuIHRoZSBtaW1lIHR5cGUgPENPREU+dGV4dC9odG1sPC9DT0RFPikuCi0KLTxIMj5CYXNpYyBFbGVtZW50czwvSDI+Ci0KLVRoZSBkb2N1bWVudCBpcyBwYXJzZWQgYXMgYW4gSFRNTCBkb2N1bWVudCwgd2l0aCBzcGVjaWFsIGNvbW1hbmRzIGVtYmVkZGVkCi1hcyBTR01MIGNvbW1lbnRzLiBBIGNvbW1hbmQgaGFzIHRoZSBzeW50YXg6Ci0KLTxCTE9DS1FVT1RFPjxDT0RFPgotJmx0OyEtLSM8L0NPREU+PEVNPmVsZW1lbnQgYXR0cmlidXRlPXZhbHVlIGF0dHJpYnV0ZT12YWx1ZSAuLi48L0VNPgotPENPREU+IC0tJmd0OwotPC9DT0RFPjwvQkxPQ0tRVU9URT4KLQotVGhlIHZhbHVlIHdpbGwgb2Z0ZW4gYmUgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlczsgbWFueSBjb21tYW5kcyBvbmx5IGFsbG93Ci1hIHNpbmdsZSBhdHRyaWJ1dGUtdmFsdWUgcGFpci4gIE5vdGUgdGhhdCB0aGUgY29tbWVudCB0ZXJtaW5hdG9yCi0oPFNBTVA+LS0mZ3Q7PC9TQU1QPikgc2hvdWxkIGJlIHByZWNlZGVkIGJ5IHdoaXRlc3BhY2UgdG8gZW5zdXJlIHRoYXQgaXQKLWlzbid0IGNvbnNpZGVyZWQgcGFydCBvZiBhbiBTU0kgdG9rZW4uCi08UD4KLVRoZSBhbGxvd2VkIGVsZW1lbnRzIGFyZTo8UD4KLQotPERMPgotCi08RFQ+PFNUUk9ORz5jb25maWc8L1NUUk9ORz4KLTxERD4KLVRoaXMgY29tbWFuZCBjb250cm9scyB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIHBhcnNpbmcuIFRoZSB2YWxpZCBhdHRyaWJ1dGVzCi1hcmU6Ci08REw+Ci08RFQ+ZXJybXNnCi08REQ+VGhlIHZhbHVlIGlzIGEgbWVzc2FnZSB0aGF0IGlzIHNlbnQgYmFjayB0byB0aGUgY2xpZW50IGlmIGFuIGVycm9yIG9jY3Vycwotd2hpbHN0IHBhcnNpbmcgdGhlIGRvY3VtZW50LgotPERUPnNpemVmbXQKLTxERD5UaGUgdmFsdWUgc2V0cyB0aGUgZm9ybWF0IHRvIGJlIHVzZWQgd2hpY2ggZGlzcGxheWluZyB0aGUgc2l6ZSBvZiBhIGZpbGUuCi1WYWxpZCB2YWx1ZXMgYXJlIDxDT0RFPmJ5dGVzPC9DT0RFPiBmb3IgYSBjb3VudCBpbiBieXRlcywgb3IKLTxDT0RFPmFiYnJldjwvQ09ERT4gZm9yIGEgY291bnQgaW4gS2Igb3IgTWIgYXMgYXBwcm9wcmlhdGUuCi08RFQ+dGltZWZtdAotPEREPlRoZSB2YWx1ZSBpcyBhIHN0cmluZyB0byBiZSB1c2VkIGJ5IHRoZSA8Q09ERT5zdHJmdGltZSgzKTwvQ09ERT4gbGlicmFyeQotcm91dGluZSB3aGVuIHByaW50aW5nIGRhdGVzLgotPC9ETD4KLQotPERUPjxTVFJPTkc+ZWNobzwvU1RST05HPgotPEREPgotVGhpcyBjb21tYW5kIHByaW50cyBvbmUgb2YgdGhlIGluY2x1ZGUgdmFyaWFibGVzLCBkZWZpbmVkIGJlbG93LgotSWYgdGhlIHZhcmlhYmxlIGlzIHVuc2V0LCBpdCBpcyBwcmludGVkIGFzIDxDT0RFPihub25lKTwvQ09ERT4uCi1BbnkgZGF0ZXMgcHJpbnRlZCBhcmUgc3ViamVjdCB0byB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgPENPREU+dGltZWZtdDwvQ09ERT4uCi1BdHRyaWJ1dGVzOgotPERMPgotPERUPnZhcgotPEREPlRoZSB2YWx1ZSBpcyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gcHJpbnQuCi08L0RMPgotCi08RFQ+PFNUUk9ORz5leGVjPC9TVFJPTkc+Ci08REQ+Ci1UaGUgZXhlYyBjb21tYW5kIGV4ZWN1dGVzIGEgZ2l2ZW4gc2hlbGwgY29tbWFuZCBvciBDR0kgc2NyaXB0LgotVGhlIEluY2x1ZGVzTk9FWEVDIDxBIEhSRUY9ImNvcmUuaHRtbCNvcHRpb25zIj5PcHRpb248L0E+IGRpc2FibGVzIHRoaXMgY29tbWFuZAotY29tcGxldGVseS4gVGhlIHZhbGlkIGF0dHJpYnV0ZXMgYXJlOgotPERMPgotPERUPmNnaQotPEREPgotVGhlIHZhbHVlIHNwZWNpZmllcyBhICglLWVuY29kZWQpIFVSTCByZWxhdGl2ZSBwYXRoIHRvIHRoZSBDR0kgc2NyaXB0LgotSWYgdGhlIHBhdGggZG9lcyBub3QgYmVnaW4gd2l0aCBhICgvKSwgdGhlbiBpdCBpcyB0YWtlbiB0byBiZSByZWxhdGl2ZSB0bwotdGhlIGN1cnJlbnQgZG9jdW1lbnQuIFRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoaXMgcGF0aCBpcyBpbnZva2VkCi1hcyBhIENHSSBzY3JpcHQsIGV2ZW4gaWYgdGhlIHNlcnZlciB3b3VsZCBub3Qgbm9ybWFsbHkgcmVjb2duaXplIGl0IGFzCi1zdWNoLiBIb3dldmVyLCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNjcmlwdCBtdXN0IGJlIGVuYWJsZWQgZm9yCi1DR0kgc2NyaXB0cyAod2l0aCA8QSBIUkVGPSJtb2RfYWxpYXMuaHRtbCNzY3JpcHRhbGlhcyI+U2NyaXB0QWxpYXM8L0E+Ci1vciB0aGUgRXhlY0NHSSA8QSBIUkVGPSJjb3JlLmh0bWwjb3B0aW9ucyI+T3B0aW9uPC9BPikuPFA+Ci1UaGUgQ0dJIHNjcmlwdCBpcyBnaXZlbiB0aGUgUEFUSF9JTkZPIGFuZCBxdWVyeSBzdHJpbmcgKFFVRVJZX1NUUklORykgb2YgdGhlCi1vcmlnaW5hbCByZXF1ZXN0IGZyb20gdGhlIGNsaWVudDsgdGhlc2UgY2Fubm90IGJlIHNwZWNpZmllZCBpbiB0aGUgVVJMIHBhdGguCi1UaGUgaW5jbHVkZSB2YXJpYWJsZXMgd2lsbCBiZSBhdmFpbGFibGUgdG8gdGhlIHNjcmlwdCBpbiBhZGRpdGlvbiB0byB0aGUKLXN0YW5kYXJkIDxBIEhSRUY9Im1vZF9jZ2kuaHRtbCI+Q0dJPC9BPiBlbnZpcm9ubWVudC48UD4KLUlmIHRoZSBzY3JpcHQgcmV0dXJucyBhIExvY2F0aW9uOiBoZWFkZXIgaW5zdGVhZCBvZiBvdXRwdXQsIHRoZW4gdGhpcwotd2lsbCBiZSB0cmFuc2xhdGVkIGludG8gYW4gSFRNTCBhbmNob3IuPFA+Ci1UaGUgPENPREU+aW5jbHVkZSB2aXJ0dWFsPC9DT0RFPiBlbGVtZW50IHNob3VsZCBiZSB1c2VkIGluIHByZWZlcmVuY2UgdG8KLTxDT0RFPmV4ZWMgY2dpPC9DT0RFPi4KLTxEVD5jbWQKLTxERD5UaGUgc2VydmVyIHdpbGwgZXhlY3V0ZSB0aGUgZ2l2ZW4gc3RyaW5nIHVzaW5nIDxDT0RFPi9iaW4vc2g8L0NPREU+LgotVGhlIGluY2x1ZGUgdmFyaWFibGVzIGFyZSBhdmFpbGFibGUgdG8gdGhlIGNvbW1hbmQuCi08L0RMPgotCi08RFQ+PFNUUk9ORz5mc2l6ZTwvU1RST05HPgotPEREPgotVGhpcyBjb21tYW5kIHByaW50cyB0aGUgc2l6ZSBvZiB0aGUgc3BlY2lmaWVkIGZpbGUsIHN1YmplY3QgdG8gdGhlCi08Q09ERT5zaXplZm10PC9DT0RFPiBmb3JtYXQgc3BlY2lmaWNhdGlvbi4gQXR0cmlidXRlczoKLTxETD4KLTxEVD5maWxlCi08REQ+VGhlIHZhbHVlIGlzIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQKLWRvY3VtZW50IGJlaW5nIHBhcnNlZC4KLTxEVD52aXJ0dWFsCi08REQ+VGhlIHZhbHVlIGlzIGEgKCUtZW5jb2RlZCkgVVJMLXBhdGggcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZG9jdW1lbnQgYmVpbmcKLXBhcnNlZC4gSWYgaXQgZG9lcyBub3QgYmVnaW4gd2l0aCBhIHNsYXNoICgvKSB0aGVuIGl0IGlzIHRha2VuIHRvIGJlIHJlbGF0aXZlCi10byB0aGUgY3VycmVudCBkb2N1bWVudC4KLTwvREw+Ci0KLTxEVD48U1RST05HPmZsYXN0bW9kPC9TVFJPTkc+Ci08REQ+Ci1UaGlzIGNvbW1hbmQgcHJpbnRzIHRoZSBsYXN0IG1vZGlmaWNhdGlvbiBkYXRlIG9mIHRoZSBzcGVjaWZpZWQgZmlsZSwKLXN1YmplY3QgdG8gdGhlIDxDT0RFPnRpbWVmbXQ8L0NPREU+IGZvcm1hdCBzcGVjaWZpY2F0aW9uLiBUaGUgYXR0cmlidXRlcyBhcmUKLXRoZSBzYW1lIGFzIGZvciB0aGUgPENPREU+ZnNpemU8L0NPREU+IGNvbW1hbmQuCi0KLTxEVD48U1RST05HPmluY2x1ZGU8L1NUUk9ORz4KLTxERD4KLVRoaXMgY29tbWFuZCBpbnNlcnRzIHRoZSB0ZXh0IG9mIGFub3RoZXIgZG9jdW1lbnQgb3IgZmlsZSBpbnRvIHRoZSBwYXJzZWQKLWZpbGUuIEFueSBpbmNsdWRlZCBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHVzdWFsIGFjY2VzcyBjb250cm9sLiBJZiB0aGUKLWRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBwYXJzZWQgZmlsZSBoYXMgdGhlCi08QSBIUkVGPSJjb3JlLmh0bWwjb3B0aW9ucyI+T3B0aW9uPC9BPgotSW5jbHVkZXNOT0VYRUMgc2V0LCBhbmQgdGhlIGluY2x1ZGluZyB0aGUgZG9jdW1lbnQgd291bGQgY2F1c2UgYSBwcm9ncmFtCi10byBiZSBleGVjdXRlZCwgdGhlbiBpdCB3aWxsIG5vdCBiZSBpbmNsdWRlZDsgdGhpcyBwcmV2ZW50cyB0aGUgZXhlY3V0aW9uIG9mCi1DR0kgc2NyaXB0cy4gT3RoZXJ3aXNlIENHSSBzY3JpcHRzIGFyZSBpbnZva2VkIGFzIG5vcm1hbCB1c2luZyB0aGUgY29tcGxldGUKLVVSTCBnaXZlbiBpbiB0aGUgY29tbWFuZCwgaW5jbHVkaW5nIGFueSBxdWVyeSBzdHJpbmcuCi08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIENHSSBzY3JpcHRzLCB7XHR0IGluY2x1ZGV9IGVsZW1lbnQgYW5kJmd0OyAtLT4KLTxQPgotCi1BbiBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbG9jYXRpb24gb2YgdGhlIGRvY3VtZW50OyB0aGUgaW5jbHVzaW9uIGlzIGRvbmUgZm9yCi1lYWNoIGF0dHJpYnV0ZSBnaXZlbiB0byB0aGUgaW5jbHVkZSBjb21tYW5kLiBUaGUgdmFsaWQgYXR0cmlidXRlcyBhcmU6Ci08REw+Ci08RFQ+ZmlsZQotPEREPlRoZSB2YWx1ZSBpcyBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBjdXJyZW50Ci1kb2N1bWVudCBiZWluZyBwYXJzZWQuIEl0IGNhbm5vdCBjb250YWluIDxDT0RFPi4uLzwvQ09ERT4sIG5vciBjYW4gaXQgYmUgYW4KLWFic29sdXRlIHBhdGguIFRoZSA8Q09ERT52aXJ0dWFsPC9DT0RFPiBhdHRyaWJ1dGUgc2hvdWxkIGFsd2F5cyBiZSB1c2VkCi1pbiBwcmVmZXJlbmNlIHRvIHRoaXMgb25lLgotPERUPnZpcnR1YWwKLTxERD5UaGUgdmFsdWUgaXMgYSAoJS1lbmNvZGVkKSBVUkwgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZG9jdW1lbnQgYmVpbmcKLXBhcnNlZC4gVGhlIFVSTCBjYW5ub3QgY29udGFpbiBhIHNjaGVtZSBvciBob3N0bmFtZSwgb25seSBhIHBhdGggYW5kCi1hbiBvcHRpb25hbCBxdWVyeSBzdHJpbmcuIElmIGl0IGRvZXMgbm90IGJlZ2luIHdpdGggYSBzbGFzaCAoLykgdGhlbiBpdAotaXMgdGFrZW4gdG8gYmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZG9jdW1lbnQuCi08L0RMPgotQSBVUkwgaXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgYXR0cmlidXRlLCBhbmQgdGhlIG91dHB1dCB0aGUgc2VydmVyCi13b3VsZCByZXR1cm4gaWYgdGhlIFVSTCB3ZXJlIGFjY2Vzc2VkIGJ5IHRoZSBjbGllbnQgaXMgaW5jbHVkZWQgaW4gdGhlIHBhcnNlZAotb3V0cHV0LiBUaHVzIGluY2x1ZGVkIGZpbGVzIGNhbiBiZSBuZXN0ZWQuCi0KLTxEVD48U1RST05HPnByaW50ZW52PC9TVFJPTkc+Ci08REQ+VGhpcyBwcmludHMgb3V0IGEgbGlzdGluZyBvZiBhbGwgZXhpc3RpbmcgdmFyaWFibGVzIGFuZCB0aGVpciB2YWx1ZXMuCi0gICAgTm8gYXR0cmlidXRlcy4KLTxERD5Gb3IgZXhhbXBsZTogPENPREU+Jmx0OyEtLSNwcmludGVudiAtLSZndDs8L0NPREU+Ci08REQ+QXBhY2hlIDEuMiBhbmQgYWJvdmUuCi0KLTxEVD48U1RST05HPnNldDwvU1RST05HPgotPEREPlRoaXMgc2V0cyB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZS4gIEF0dHJpYnV0ZXM6Ci08REw+Ci08RFQ+dmFyCi08REQ+VGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHNldC4KLTxEVD52YWx1ZQotPEREPlRoZSB2YWx1ZSB0byBnaXZlIGEgdmFyaWFibGUuCi08L0RMPgotRm9yIGV4YW1wbGU6Ci0gIDxDT0RFPiZsdDshLS0jc2V0IHZhcj0iY2F0ZWdvcnkiIHZhbHVlPSJoZWxwIiAtLSZndDs8L0NPREU+Ci08REQ+QXBhY2hlIDEuMiBhbmQgYWJvdmUuCi0KLTwvREw+Ci0KLTxIMj5JbmNsdWRlIFZhcmlhYmxlczwvSDI+Ci0KLUluIGFkZGl0aW9uIHRvIHRoZSB2YXJpYWJsZXMgaW4gdGhlIHN0YW5kYXJkIENHSSBlbnZpcm9ubWVudCwgdGhlc2UgYXJlCi1hdmFpbGFibGUgZm9yIHRoZSA8Q09ERT5lY2hvPC9DT0RFPiBjb21tYW5kLCBmb3IgPENPREU+aWY8L0NPREU+IGFuZAotPENPREU+ZWxpZjwvQ09ERT4sIGFuZCB0byBhbnkgcHJvZ3JhbSBpbnZva2VkIGJ5IHRoZSBkb2N1bWVudC4KLQotPERMPgotPERUPkRBVEVfR01UCi08REQ+VGhlIGN1cnJlbnQgZGF0ZSBpbiBHcmVlbndpY2ggTWVhbiBUaW1lLgotPERUPkRBVEVfTE9DQUwKLTxERD5UaGUgY3VycmVudCBkYXRlIGluIHRoZSBsb2NhbCB0aW1lIHpvbmUuCi08RFQ+RE9DVU1FTlRfTkFNRQotPEREPlRoZSBmaWxlbmFtZSAoZXhjbHVkaW5nIGRpcmVjdG9yaWVzKSBvZiB0aGUgZG9jdW1lbnQgcmVxdWVzdGVkIGJ5IHRoZQotdXNlci4KLTxEVD5ET0NVTUVOVF9VUkkKLTxERD5UaGUgKCUtZGVjb2RlZCkgVVJMIHBhdGggb2YgdGhlIGRvY3VtZW50IHJlcXVlc3RlZCBieSB0aGUgdXNlci4gTm90ZSB0aGF0Ci1pbiB0aGUgY2FzZSBvZiBuZXN0ZWQgaW5jbHVkZSBmaWxlcywgdGhpcyBpcyA8RU0+bm90PC9FTT4gdGhlbiBVUkwgZm9yIHRoZQotY3VycmVudCBkb2N1bWVudC4KLTxEVD5MQVNUX01PRElGSUVECi08REQ+VGhlIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhlIGRvY3VtZW50IHJlcXVlc3RlZCBieSB0aGUgdXNlci4KLTwvREw+Ci08UD4KLQotPEgyPlZhcmlhYmxlIFN1YnN0aXR1dGlvbjwvSDI+Ci08UD4gVmFyaWFibGUgc3Vic3RpdHV0aW9uIGlzIGRvbmUgd2l0aGluIHF1b3RlZCBzdHJpbmdzIGluIG1vc3QgY2FzZXMKLSAgICB3aGVyZSB0aGV5IG1heSByZWFzb25hYmx5IG9jY3VyIGFzIGFuIGFyZ3VtZW50IHRvIGFuIFNTSSBkaXJlY3RpdmUuCi0gICAgVGhpcyBpbmNsdWRlcyB0aGUKLSAgICA8U0FNUD5jb25maWc8L1NBTVA+LAotICAgIDxTQU1QPmV4ZWM8L1NBTVA+LAotICAgIDxTQU1QPmZsYXN0bW9kPC9TQU1QPiwKLSAgICA8U0FNUD5mc2l6ZTwvU0FNUD4sCi0gICAgPFNBTVA+aW5jbHVkZTwvU0FNUD4sIGFuZAotICAgIDxTQU1QPnNldDwvU0FNUD4KLSAgICBkaXJlY3RpdmVzLCBhcyB3ZWxsIGFzIHRoZSBhcmd1bWVudHMgdG8gY29uZGl0aW9uYWwgb3BlcmF0b3JzLgotICAgIFlvdSBjYW4gaW5zZXJ0IGEgbGl0ZXJhbCBkb2xsYXIgc2lnbiBpbnRvIHRoZSBzdHJpbmcgdXNpbmcgYmFja3NsYXNoCi0gICAgcXVvdGluZzoKLQotPFBSRT4KLSAgICAmbHQ7IS0tI2lmIGV4cHI9IiRhID0gXCR0ZXN0IiAtLSZndDsKLTwvUFJFPgotCi08UD4gSWYgYSB2YXJpYWJsZSByZWZlcmVuY2UgbmVlZHMgdG8gYmUgc3Vic3RpdHV0ZWQgaW4gdGhlIG1pZGRsZSBvZiBhCi0gICAgY2hhcmFjdGVyIHNlcXVlbmNlIHRoYXQgbWlnaHQgb3RoZXJ3aXNlIGJlIGNvbnNpZGVyZWQgYSB2YWxpZAotICAgIGlkZW50aWZpZXIgaW4gaXRzIG93biByaWdodCwgaXQgY2FuIGJlIGRpc2FtYmlndWF0ZWQgYnkgZW5jbG9zaW5nCi0gICAgdGhlIHJlZmVyZW5jZSBpbiBicmFjZXMsIDxFTT4mYWdyYXZlOyBsYTwvRU0+IHNoZWxsIHN1YnN0aXR1dGlvbjoKLQotPFBSRT4KLSAgICAmbHQ7IS0tI3NldCB2YXI9IlplZCIgdmFsdWU9IiR7UkVNT1RFX0hPU1R9XyR7UkVRVUVTVF9NRVRIT0R9IiAtLSZndDsKLTwvUFJFPgotCi08UD4gVGhpcyB3aWxsIHJlc3VsdCBpbiB0aGUgPFNBTVA+WmVkPC9TQU1QPiB2YXJpYWJsZSBiZWluZyBzZXQgdG8KLSAgICAmcXVvdDs8U0FNUD5YX1k8L1NBTVA+JnF1b3Q7IGlmIDxTQU1QPlJFTU9URV9IT1NUPC9TQU1QPiBpcwotICAgICZxdW90OzxTQU1QPlg8L1NBTVA+JnF1b3Q7IGFuZCA8U0FNUD5SRVFVRVNUX01FVEhPRDwvU0FNUD4gaXMKLSAgICAmcXVvdDs8U0FNUD5ZPC9TQU1QPiZxdW90Oy4KLQotPFA+IEVYQU1QTEU6IHRoZSBiZWxvdyBleGFtcGxlIHdpbGwgcHJpbnQgImluIGZvbyIgaWYgdGhlIERPQ1VNRU5UX1VSSSBpcwotL2Zvby9maWxlLmh0bWwsICJpbiBiYXIiIGlmIGl0IGlzIC9iYXIvZmlsZS5odG1sIGFuZCAiaW4gbmVpdGhlciIKLW90aGVyd2lzZToKLTxQUkU+Ci0gICAgJmx0OyEtLSNpZiBleHByPSJcIiRET0NVTUVOVF9VUklcIiA9IFwiL2Zvby9maWxlLmh0bWxcIiIgLS0mZ3Q7Ci0gICAgaW4gZm9vCi0gICAgJmx0OyEtLSNlbGlmIGV4cHI9IlwiJERPQ1VNRU5UX1VSSVwiID0gXCIvYmFyL2ZpbGUuaHRtbFwiIiAtLSZndDsKLSAgICBpbiBiYXIKLSAgICAmbHQ7IS0tI2Vsc2UgLS0mZ3Q7Ci0gICAgaW4gbmVpdGhlcgotICAgICZsdDshLS0jZW5kaWYgLS0mZ3Q7Ci08L1BSRT4KLQotPEgyPjxBIE5BTUU9ImZsb3djdHJsIj5GbG93IENvbnRyb2wgRWxlbWVudHM8L0E+PC9IMj4KLQotVGhlc2UgYXJlIGF2YWlsYWJsZSBpbiBBcGFjaGUgMS4yIGFuZCBhYm92ZS4gIFRoZSBiYXNpYyBmbG93IGNvbnRyb2wKLWVsZW1lbnRzIGFyZToKLQotPFBSRT4KLSAgICAmbHQ7IS0tI2lmIGV4cHI9IjxFTT50ZXN0X2NvbmRpdGlvbjwvRU0+IiAtLSZndDsKLSAgICAmbHQ7IS0tI2VsaWYgZXhwcj0iPEVNPnRlc3RfY29uZGl0aW9uPC9FTT4iIC0tJmd0OwotICAgICZsdDshLS0jZWxzZSAtLSZndDsKLSAgICAmbHQ7IS0tI2VuZGlmIC0tJmd0OwotPC9QUkU+Ci0KLTxQPiBUaGUgPFNUUk9ORz48Q09ERT5pZjwvQ09ERT48L1NUUk9ORz4gZWxlbWVudCB3b3JrcyBsaWtlIGFuCi0gICAgaWYgc3RhdGVtZW50IGluIGEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuICBUaGUgdGVzdCBjb25kaXRpb24KLSAgICBpcyBldmFsdWF0ZWQgYW5kIGlmIHRoZSByZXN1bHQgaXMgdHJ1ZSwgdGhlbiB0aGUgdGV4dCB1bnRpbAotICAgIHRoZSBuZXh0IDxTVFJPTkc+PENPREU+ZWxpZjwvQ09ERT48L1NUUk9ORz4sIDxTVFJPTkc+PENPREU+ZWxzZTwvQ09ERT48L1NUUk9ORz4uCi0gICAgb3IgPFNUUk9ORz48Q09ERT5lbmRpZjwvQ09ERT48L1NUUk9ORz4gZWxlbWVudCBpcyBpbmNsdWRlZCBpbiB0aGUKLSAgICBvdXRwdXQgc3RyZWFtLgotCi08UD4gVGhlIDxTVFJPTkc+PENPREU+ZWxpZjwvQ09ERT48L1NUUk9ORz4gb3IgPFNUUk9ORz48Q09ERT5lbHNlPC9DT0RFPjwvU1RST05HPgotICAgIHN0YXRlbWVudHMgYXJlIGJlIHVzZWQgdGhlIHB1dCB0ZXh0IGludG8gdGhlIG91dHB1dCBzdHJlYW0KLSAgICBpZiB0aGUgb3JpZ2luYWwgdGVzdF9jb25kaXRpb24gd2FzIGZhbHNlLiAgVGhlc2UgZWxlbWVudHMKLSAgICBhcmUgb3B0aW9uYWwuCi0KLTxQPiBUaGUgPFNUUk9ORz48Q09ERT5lbmRpZjwvQ09ERT48L1NUUk9ORz4gZWxlbWVudCBlbmRzIHRoZQotICAgIDxTVFJPTkc+PENPREU+aWY8L0NPREU+PC9TVFJPTkc+IGVsZW1lbnQgYW5kIGlzIHJlcXVpcmVkLgotCi08UD4gPEVNPnRlc3RfY29uZGl0aW9uPC9FTT4gaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLTxETD4KLQotPERUPjxFTT5zdHJpbmc8L0VNPjxERD50cnVlIGlmIDxFTT5zdHJpbmc8L0VNPiBpcyBub3QgZW1wdHkKLQotPERUPjxFTT5zdHJpbmcxPC9FTT4gPSA8RU0+c3RyaW5nMjwvRU0+Ci0gICAgPEJSPgotICAgIDxFTT5zdHJpbmcxPC9FTT4gIT0gPEVNPnN0cmluZzI8L0VNPgotICAgIDxCUj4KLSAgICA8RU0+c3RyaW5nMTwvRU0+ICZsdDsgPEVNPnN0cmluZzI8L0VNPgotICAgIDxCUj4KLSAgICA8RU0+c3RyaW5nMTwvRU0+ICZsdDs9IDxFTT5zdHJpbmcyPC9FTT4KLSAgICA8QlI+Ci0gICAgPEVNPnN0cmluZzE8L0VNPiAmZ3Q7IDxFTT5zdHJpbmcyPC9FTT4KLSAgICA8QlI+Ci0gICAgPEVNPnN0cmluZzE8L0VNPiAmZ3Q7PSA8RU0+c3RyaW5nMjwvRU0+Ci0KLTxERD5Db21wYXJlIHN0cmluZzEgd2l0aCBzdHJpbmcgMi4gIElmIHN0cmluZzIgaGFzIHRoZSBmb3JtIDxFTT4vc3RyaW5nLzwvRU0+Ci0gICAgdGhlbiBpdCBpcyBjb21wYXJlZCBhcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICBSZWd1bGFyIGV4cHJlc3Npb25zIGhhdmUgdGhlIHNhbWUgc3ludGF4IGFzIHRob3NlIGZvdW5kIGluIHRoZQotICAgIFVuaXggPFNBTVA+ZWdyZXA8L1NBTVA+IGNvbW1hbmQuCi0KLTxEVD4oIDxFTT50ZXN0X2NvbmRpdGlvbjwvRU0+ICkKLSAgICAgICAgPEREPnRydWUgaWYgPEVNPnRlc3RfY29uZGl0aW9uPC9FTT4gaXMgdHJ1ZQotPERUPiEgPEVNPnRlc3RfY29uZGl0aW9uPC9FTT4KLSAgICAgICAgPEREPnRydWUgaWYgPEVNPnRlc3RfY29uZGl0aW9uPC9FTT4gaXMgZmFsc2UKLTxEVD48RU0+dGVzdF9jb25kaXRpb24xPC9FTT4gJiYgPEVNPnRlc3RfY29uZGl0aW9uMjwvRU0+Ci0gICAgICAgIDxERD50cnVlIGlmIGJvdGggPEVNPnRlc3RfY29uZGl0aW9uMTwvRU0+IGFuZAotICAgICAgICA8RU0+dGVzdF9jb25kaXRpb24yPC9FTT4gYXJlIHRydWUKLTxEVD48RU0+dGVzdF9jb25kaXRpb24xPC9FTT4gfHwgPEVNPnRlc3RfY29uZGl0aW9uMjwvRU0+Ci0gICAgICAgIDxERD50cnVlIGlmIGVpdGhlciA8RU0+dGVzdF9jb25kaXRpb24xPC9FTT4gb3IKLSAgICAgICAgPEVNPnRlc3RfY29uZGl0aW9uMjwvRU0+IGlzIHRydWUKLTwvREw+Ci0KLTxQPiAiPEVNPj08L0VNPiIgYW5kICI8RU0+IT08L0VNPiIgYmluZCBtb3JlIHRpZ2h0bHkgdGhhbiAiPEVNPiYmPC9FTT4iIGFuZAotICAgICI8RU0+fHw8L0VNPiIuCi0gICAgIjxFTT4hPC9FTT4iIGJpbmRzIG1vc3QgdGlnaHRseS4gIFRodXMsIHRoZSBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6Ci0KLTxQUkU+Ci0gICAgJmx0OyEtLSNpZiBleHByPSIkYSA9IHRlc3QxICYmICRiID0gdGVzdDIiIC0tJmd0OwotICAgICZsdDshLS0jaWYgZXhwcj0iKCRhID0gdGVzdDEpICYmICgkYiA9IHRlc3QyKSIgLS0mZ3Q7Ci08L1BSRT4KLQotPFA+IEFueXRoaW5nIHRoYXQncyBub3QgcmVjb2duaXplZCBhcyBhIHZhcmlhYmxlIG9yIGFuIG9wZXJhdG9yIGlzCi0gICAgdHJlYXRlZCBhcyBhIHN0cmluZy4gIFN0cmluZ3MgY2FuIGFsc28gYmUgcXVvdGVkOiA8RU0+J3N0cmluZyc8L0VNPi4KLSAgICBVbnF1b3RlZCBzdHJpbmdzIGNhbid0IGNvbnRhaW4gd2hpdGVzcGFjZSAoYmxhbmtzIGFuZCB0YWJzKQotICAgIGJlY2F1c2UgaXQgaXMgdXNlZCB0byBzZXBhcmF0ZSB0b2tlbnMgc3VjaCBhcyB2YXJpYWJsZXMuICBJZgotICAgIG11bHRpcGxlIHN0cmluZ3MgYXJlIGZvdW5kIGluIGEgcm93LCB0aGV5IGFyZSBjb25jYXRlbmF0ZWQgdXNpbmcKLSAgICBibGFua3MuICBTbywKLQotPFBSRT4KLSAgICAgPEVNPnN0cmluZzEgICAgc3RyaW5nMjwvRU0+ICByZXN1bHRzIGluIDxFTT5zdHJpbmcxIHN0cmluZzI8L0VNPgotICAgIDxFTT4nc3RyaW5nMSAgICBzdHJpbmcyJzwvRU0+IHJlc3VsdHMgaW4gPEVNPnN0cmluZzEgICAgc3RyaW5nMjwvRU0+Ci08L1BSRT4KLQotPEhSPgotPEgyPkRpcmVjdGl2ZXM8L0gyPgotPFVMPgotPExJPjxBIEhSRUY9IiN4Yml0aGFjayI+WEJpdEhhY2s8L0E+Ci08L1VMPgotPEhSPgotCi0KLTxIMj48QSBOQU1FPSJ4Yml0aGFjayI+WEJpdEhhY2s8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBYQml0SGFja30gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gWEJpdEhhY2sgPEVNPnN0YXR1czwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPlhCaXRIYWNrIG9mZjwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IE9wdGlvbnM8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9pbmNsdWRlPFA+Ci0KLVRoZSBYQml0SGFjayBkaXJlY3RpdmVzIGNvbnRyb2xzIHRoZSBwYXJzaW5nIG9mIG9yZGluYXJ5IGh0bWwgZG9jdW1lbnRzLgotVGhpcyBkaXJlY3RpdmUgb25seSBhZmZlY3RzIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgTUlNRSB0eXBlCi08Q09ERT50ZXh0L2h0bWw8L0NPREU+LgotPEVNPlN0YXR1czwvRU0+IGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotPERMPgotPERUPm9mZgotPEREPk5vIHNwZWNpYWwgdHJlYXRtZW50IG9mIGV4ZWN1dGFibGUgZmlsZXMuCi08RFQ+b24KLTxERD5BbnkgZmlsZSB0aGF0IGhhcyB0aGUgdXNlci1leGVjdXRlIGJpdCBzZXQgd2lsbCBiZSB0cmVhdGVkIGFzIGEKLXNlcnZlci1wYXJzZWQgaHRtbCBkb2N1bWVudC4KLTxEVD5mdWxsCi08REQ+QXMgZm9yIDxDT0RFPm9uPC9DT0RFPiBidXQgYWxzbyB0ZXN0IHRoZSBncm91cC1leGVjdXRlIGJpdC4gSWYgaXQKLWlzIHNldCwgdGhlbiBzZXQgdGhlIExhc3QtbW9kaWZpZWQgZGF0ZSBvZiB0aGUgcmV0dXJuZWQgZmlsZSB0byBiZSB0aGUKLWxhc3QgbW9kaWZpZWQgdGltZSBvZiB0aGUgZmlsZS4gSWYgaXQgaXMgbm90IHNldCwgdGhlbiBubyBsYXN0LW1vZGlmaWVkIGRhdGUKLWlzIHNlbnQuIFNldHRpbmcgdGhpcyBiaXQgYWxsb3dzIGNsaWVudHMgYW5kIHByb3hpZXMgdG8gY2FjaGUgdGhlIHJlc3VsdCBvZgotdGhlIHJlcXVlc3QuCi08UD48U1RST05HPk5vdGU6PC9TVFJPTkc+IHlvdSB3b3VsZCBub3Qgd2FudCB0byB1c2UgdGhpcywgZm9yIGV4YW1wbGUsIHdoZW4geW91Ci08Q09ERT4jaW5jbHVkZTwvQ09ERT4gYSBDR0kgdGhhdCBwcm9kdWNlcyBkaWZmZXJlbnQgb3V0cHV0IG9uIGVhY2ggaGl0Ci0ob3IgcG90ZW50aWFsbHkgZGVwZW5kcyBvbiB0aGUgaGl0KS4KLTwvREw+Ci08UD4KLQotPEhSPgotPEgyPlVzaW5nIFNlcnZlciBTaWRlIEluY2x1ZGVzIGZvciBFcnJvckRvY3VtZW50czwvSDI+Ci0KLVRoZXJlIGlzIDxBIEhSRUY9Ii4uL21pc2MvY3VzdG9tX2Vycm9yZG9jcy5odG1sIj5hIGRvY3VtZW50PC9BPiB3aGljaAotZGVzY3JpYmVzIGhvdyB0byB1c2UgdGhlIGZlYXR1cmVzIG9mIG1vZF9pbmNsdWRlIHRvIG9mZmVyIGludGVybmF0aW9uYWxpemVkCi1jdXN0b21pemVkIHNlcnZlciBlcnJvciBkb2N1bWVudHMuCi08UD4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfaW5mby5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9pbmZvLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZmE4NGQuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9pbmZvLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9pbmZvPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+TW9kdWxlIG1vZF9pbmZvPC9IMT4KLQotVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Q09ERT5tb2RfaW5mby5jPC9DT0RFPiBmaWxlLiAgSXQKLXByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSBvdmVydmlldyBvZiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24KLWluY2x1ZGluZyBhbGwgaW5zdGFsbGVkIG1vZHVsZXMgYW5kIGRpcmVjdGl2ZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLWZpbGVzLiAgVGhpcyBtb2R1bGUgaXMgbm90IGNvbXBpbGVkIGludG8gdGhlCi1zZXJ2ZXIgYnkgZGVmYXVsdC4gIEl0IGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZSAxLjEgYW5kIGxhdGVyLiBUbwotZW5hYmxlIGl0LCBhZGQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHRoZSBzZXJ2ZXIgYnVpbGQgQ29uZmlndXJhdGlvbgotZmlsZSwgYW5kIHJlYnVpbGQgdGhlIHNlcnZlcjoKLQotPFBSRT4KLUFkZE1vZHVsZSBtb2R1bGVzL3N0YW5kYXJkL21vZF9pbmZvLm8KLTwvUFJFPgotCi08SDI+RGlyZWN0aXZlczwvSDI+Ci08VUw+Ci08TEk+PEEgSFJFRj0iI2FkZG1vZHVsZWluZm8iPkFkZE1vZHVsZUluZm88L0E+Ci08L1VMPgotCi08SFI+Ci08UD4KLVRvIGNvbmZpZ3VyZSBpdCwgYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciA8Q09ERT5hY2Nlc3MuY29uZjwvQ09ERT4gZmlsZS4KLQotPFBSRT4KLSZsdDtMb2NhdGlvbiAvc2VydmVyLWluZm8mZ3Q7Ci1TZXRIYW5kbGVyIHNlcnZlci1pbmZvCi0mbHQ7L0xvY2F0aW9uJmd0OwotPC9QUkU+Ci0KLVlvdSBtYXkgd2lzaCB0byBhZGQgYQotPEEKLSBIUkVGPSJjb3JlLmh0bWwjbGltaXQiCi0+Jmx0O0xpbWl0Jmd0OzwvQT4KLWNsYXVzZSBpbnNpZGUgdGhlCi08QQotIEhSRUY9ImNvcmUuaHRtbCNsb2NhdGlvbiIKLT5sb2NhdGlvbjwvQT4KLWRpcmVjdGl2ZSB0byBsaW1pdCBhY2Nlc3MgdG8geW91ciBzZXJ2ZXIgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48UD4KLU9uY2UgY29uZmlndXJlZCwgdGhlIHNlcnZlciBpbmZvcm1hdGlvbiBpcyBvYnRhaW5lZCBieSBhY2Nlc3NpbmcKLTxUVD5odHRwOi8veW91ci5ob3N0LmRvbS9zZXJ2ZXItaW5mbzwvVFQ+PFA+Ci08QkxPQ0tRVU9URT4KLSA8U1RST05HPgotICBOb3RlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgYXJlIHJlYWQgYnkgdGhlIG1vZHVsZSBhdCBydW4tdGltZSwKLSAgYW5kIHRoZXJlZm9yZSB0aGUgZGlzcGxheSBtYXkgPEVNPm5vdDwvRU0+IHJlZmxlY3QgdGhlIHJ1bm5pbmcKLSAgc2VydmVyJ3MgYWN0aXZlIGNvbmZpZ3VyYXRpb24gaWYgdGhlIGZpbGVzIGhhdmUgYmVlbiBjaGFuZ2VkIHNpbmNlIHRoZQotICBzZXJ2ZXIgd2FzIGxhc3QgcmVsb2FkZWQuICBBbHNvLCB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBtdXN0IGJlCi0gIHJlYWRhYmxlIGJ5IHRoZSB1c2VyIGFzIHdoaWNoIHRoZSBzZXJ2ZXIgaXMgcnVubmluZyAoc2VlIHRoZQotICA8QQotICAgSFJFRj0iY29yZS5odG1sI3VzZXIiCi0gID48U0FNUD5Vc2VyPC9TQU1QPjwvQT4KLSAgZGlyZWN0aXZlKSwgb3IgZWxzZSB0aGUgZGlyZWN0aXZlIHNldHRpbmdzIHdpbGwgbm90IGJlIGxpc3RlZC4KLSAgPFA+Ci0gIEl0IHNob3VsZCBhbHNvIGJlIG5vdGVkIHRoYXQgaWYgPFNBTVA+bW9kX2luZm88L1NBTVA+IGlzIGNvbXBpbGVkIGludG8KLSAgdGhlIHNlcnZlciwgaXRzIGhhbmRsZXIgY2FwYWJpbGl0eSBpcyBhdmFpbGFibGUgaW4gPEVNPmFsbDwvRU0+Ci0gIGNvbmZpZ3VyYXRpb24gZmlsZXMsIGluY2x1ZGluZyA8RU0+cGVyPC9FTT4tZGlyZWN0b3J5IGZpbGVzCi0gICg8RU0+ZS5nLjwvRU0+LCA8U0FNUD4uaHRhY2Nlc3M8L1NBTVA+KS4gIFRoaXMgbWF5IGhhdmUKLSAgc2VjdXJpdHktcmVsYXRlZCByYW1pZmljYXRpb25zIGZvciB5b3VyIHNpdGUuCi0gIDwvUD4KLSA8L1NUUk9ORz4KLTwvQkxPQ0tRVU9URT4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0iYWRkbW9kdWxlaW5mbyI+QWRkTW9kdWxlSW5mbzwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBBZGRNb2R1bGVJbmZvIDxFTT5tb2R1bGUtbmFtZSBzdHJpbmc8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IGJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9icm93c2VyPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IEFwYWNoZSAxLjMgYW5kIGFib3ZlPFA+Ci0KLVRoaXMgYWxsb3dzIHRoZSBjb250ZW50IG9mIDxFTT5zdHJpbmc8L0VNPiB0byBiZSBzaG93biBhcwotSFRNTCBpbnRlcnByZXRlZCwKLTxTVFJPTkc+QWRkaXRpb25hbCBJbmZvcm1hdGlvbjwvU1RST05HPiBmb3IgdGhlIG1vZHVsZSA8RU0+bW9kdWxlLW5hbWU8L0VNPi4KLUV4YW1wbGU6Ci08QkxPQ0tRVU9URT4KLTxQUkU+Ci1BZGRNb2R1bGVJbmZvIG1vZF9hdXRoLmMgJ1NlZSAmbHQ7QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZG9jcy9tb2QvbW9kX2F1dGguaHRtbCImZ3Q7aHR0cDovL3d3dy5hcGFjaGUub3JnL2RvY3MvbW9kL21vZF9hdXRoLmh0bWwmbHQ7L0EmZ3Q7JwotPC9QUkU+Ci08L0JMT0NLUVVPVEU+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2lzYXBpLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2lzYXBpLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYzliYTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9pc2FwaS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9pc2FwaTwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotCi08SDEgQUxJR049IkNFTlRFUiI+TW9kdWxlIG1vZF9pc2FwaTwvSDE+Ci0KLTxQPlRoaXMgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbiB0aGUgPENPREU+bW9kX2lzYXBpLmM8L0NPREU+IGZpbGUsIGFuZCBpcwotICAgY29tcGlsZWQgaW4gYnkgZGVmYXVsdC4gSXQgcHJvdmlkZXMgc3VwcG9ydCBmb3IgSVNBUEkgRXh0ZW5zaW9ucyB3aGVuCi0gICBydW5uaW5nIHVuZGVyIE1pY3Jvc29mdCBXaW5kb3dzLiBBbnkgZG9jdW1lbnQgd2l0aCBhIGhhbmRsZXIgb2YKLSAgIDxDT0RFPmlzYXBpLWlzYTwvQ09ERT4gd2lsbCBiZSBwcm9jZXNzZWQgYnkgdGhpcyBtb2R1bGUuCi0KLTxIMj5QdXJwb3NlPC9IMj4KLQotPFA+VGhpcyBtb2R1bGUgaW1wbGVtZW50cyB0aGUgPEEKLSAgIEhSRUY9Imh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS93aW4zMmRldi9hcGlleHQvaXNhcGltcmcuaHRtIj5JU0FQSQotICAgRXh0ZW5zaW9uPC9BPiBBUEkuIEl0IGFsbG93cyBJbnRlcm5ldCBTZXJ2ZXIgQXBwbGljYXRpb25zICg8RU0+aS5lLjwvRU0+LCBJU0FQSQotICAgRXh0ZW5zaW9ucykgdG8gYmUgdXNlZCB3aXRoIEFwYWNoZSBmb3IgV2luZG93cy4KLQotPEgyPlVzYWdlPC9IMj4KLQotPFA+SW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGUsIGFkZCBhIGhhbmRsZXIgY2FsbGVkCi0gICA8Q09ERT5pc2FwaS1pc2E8L0NPREU+LCBhbmQgbWFwIGl0IHRvIGZpbGVzIHdpdGggYSA8Q09ERT4uRExMPC9DT0RFPgotICAgZXh0ZW5zaW9uLiBJbiBvdGhlciB3b3Jkczo8L1A+Ci08UFJFPgotICAgIEFkZEhhbmRsZXIgaXNhcGktaXNhIGRsbAotPC9QUkU+Ci08UD5Ob3cgc2ltcGx5IHBsYWNlIHRoZSBJU0EgRExMcyBpbnRvIHlvdXIgZG9jdW1lbnQgcm9vdCwgYW5kIHRoZXkgd2lsbAotICAgYmUgbG9hZGVkIHdoZW4gdGhlaXIgVVJMcyBhcmUgYWNjZXNzZWQuPC9QPgotCi08UD5JU0FQSSBFeHRlbnNpb25zIGFyZSBnb3Zlcm5lZCBieSB0aGUgc2FtZSByZXN0cmljdGlvbnMgYXMgQ0dJCi0gICBzY3JpcHRzLiBUaGF0IGlzLCA8Q09ERT5PcHRpb25zIEV4ZWNDR0k8L0NPREU+IG11c3QgYmUgYWN0aXZlIGluIHRoZQotICAgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlIElTQS48L1A+Ci0KLTxIMj5Ob3RlczwvSDI+Ci0KLTxQPkFwYWNoZSdzIElTQVBJIGltcGxlbWVudGF0aW9uIGNvbmZvcm1zIHRvIGFsbCBvZiB0aGUgSVNBUEkgMi4wCi0gICBzcGVjaWZpY2F0aW9uLCBleGNlcHQgZm9yIHRoZSAiTWljcm9zb2Z0LXNwZWNpZmljIiBleHRlbnNpb25zIGRlYWxpbmcKLSAgIHdpdGggYXN5bmNocm9ub3VzIEkvTy4gQXBhY2hlJ3MgSS9PIG1vZGVsIGRvZXMgbm90IGFsbG93IGFzeW5jaHJvbm91cwotICAgcmVhZGluZyBhbmQgd3JpdGluZyBpbiBhIG1hbm5lciB0aGF0IHRoZSBJU0FQSSBjb3VsZCBhY2Nlc3MuIElmIGFuIElTQQotICAgdHJpZXMgdG8gYWNjZXNzIGFzeW5jIEkvTywgYSBtZXNzYWdlIHdpbGwgYmUgcGxhY2UgaW4gdGhlIGVycm9yIGxvZywKLSAgIHRvIGhlbHAgd2l0aCBkZWJ1Z2dpbmcuCi0KLTxQPlNvbWUgc2VydmVycywgbGlrZSBNaWNyb3NvZnQgSUlTLCBsb2FkIHRoZSBJU0EgaW50byB0aGUgc2VydmVyLCBhbmQKLSAgIGtlZXAgaXQgbG9hZGVkIHVudGlsIG1lbW9yeSB1c2FnZSBpcyB0b28gaGlnaCwgYW5kIGl0IGlzCi0gICB1bmxvYWRlZC4gQXBhY2hlIGN1cnJlbnRseSBsb2FkcyBhbmQgdW5sb2FkcyB0aGUgSVNBIGZvciBlYWNoCi0gICByZXF1ZXN0LiBUaGlzIGlzIGluZWZmaWNpZW50LCBidXQgQXBhY2hlJ3MgcmVxdWVzdCBtb2RlbCBtYWtlcyB0aGlzCi0gICBtZXRob2QgdGhlIG9ubHkgbWV0aG9kIHRoYXQgY3VycmVudGx5IHdvcmtzLiBBIGZ1dHVyZSByZWxlYXNlIG1heSB1c2UKLSAgIGEgbW9yZSBlZmZlY3RpdmUgbG9hZGluZyBtZXRob2QuCi0KLTxQPkFwYWNoZSAxLjNhMSBjdXJyZW50bHkgbGltaXRzIFBPU1QgYW5kIFBVVCBpbnB1dCB0byA0OGsgcGVyCi0gICByZXF1ZXN0LiBUaGlzIGlzIHRvIHdvcmsgYXJvdW5kIGEgcHJvYmxlbSB3aXRoIHRoZSBJU0FQSSBpbXBsZW1lbnRhdGlvbgotICAgdGhhdCBjb3VsZCByZXN1bHQgaW4gYSBkZW5pYWwgb2Ygc2VydmljZSBhdHRhY2suIEl0IGlzIGV4cGVjdGVkIHRoYXQKLSAgIHN1cHBvcnQgZm9yIGxhcmdlciB1cGxvYWRzIHdpbGwgYmUgYWRkZWQgc29vbi4KLQotPFA+QWxzbywgcmVtZW1iZXIgdGhhdCB3aGlsZSBBcGFjaGUgc3VwcG9ydHMgSVNBUEkgRXh0ZW5zaW9ucywgaXQgZG9lcwotICAgbm90IHN1cHBvcnQgSVNBUEkgRmlsdGVycy4gU3VwcG9ydCBmb3IgZmlsdGVycyBtYXkgYmUgYWRkZWQgYXQgYSBsYXRlcgotICAgZGF0ZSwgYnV0IG5vIHN1cHBvcnQgaXMgcGxhbm5lZCBhdCB0aGlzIHRpbWUuPC9QPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9sb2dfYWdlbnQuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfbG9nX2FnZW50Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwODQ4ODkuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9sb2dfYWdlbnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+TW9kdWxlIG1vZF9sb2dfYWdlbnQ8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5Nb2R1bGUgbW9kX2xvZ19hZ2VudDwvSDE+Ci0KLVRoaXMgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbiB0aGUgPENPREU+bW9kX2xvZ19hZ2VudC5jPC9DT0RFPiBmaWxlLCBhbmQgaXMgbm90Ci1jb21waWxlZCBpbiBieSBkZWZhdWx0LiBJdCBwcm92aWRlcyBmb3IgbG9nZ2luZyBvZiB0aGUgY2xpZW50IHVzZXIgYWdlbnRzLgotbW9kX2xvZ19hZ2VudCBpcyBkZXByZWNhdGVkLiBVc2UgPEEgSFJFRj0ibW9kX2xvZ19jb25maWcuaHRtbCI+bW9kX2xvZ19jb25maWc8L0E+Ci1pbnN0ZWFkLgotCi08VUw+Ci08TEk+PEEgSFJFRj0iI2FnZW50bG9nIj5BZ2VudExvZzwvQT4KLTwvVUw+Ci08SFI+Ci0KLQotPEgyPjxBIE5BTUU9ImFnZW50bG9nIj5BZ2VudExvZzwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEFnZW50TG9nfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBBZ2VudExvZyA8RU0+ZmlsZS1waXBlPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+QWdlbnRMb2cgbG9ncy9hZ2VudF9sb2c8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gRXh0ZW5zaW9uPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfbG9nX2FnZW50PFA+Ci0KLVRoZSBBZ2VudExvZyBkaXJlY3RpdmUgc2V0cyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byB3aGljaCB0aGUgc2VydmVyIHdpbGwKLWxvZyB0aGUgVXNlckFnZW50IGhlYWRlciBvZiBpbmNvbWluZyByZXF1ZXN0cy4gPEVNPkZpbGUtcGlwZTwvRU0+IGlzIG9uZQotb2YKLTxETD48RFQ+QSBmaWxlbmFtZQotPEREPkEgZmlsZW5hbWUgcmVsYXRpdmUgdG8gdGhlIDxBIEhSRUY9ImNvcmUuaHRtbCNzZXJ2ZXJyb290Ij5TZXJ2ZXJSb290PC9BPi4KLTxEVD4gYHwnIGZvbGxvd2VkIGJ5IGEgY29tbWFuZAotPEREPkEgcHJvZ3JhbSB0byByZWNlaXZlIHRoZSBhZ2VudCBsb2cgaW5mb3JtYXRpb24gb24gaXRzIHN0YW5kYXJkIGlucHV0LgotTm90ZSB0aGUgYSBuZXcgcHJvZ3JhbSB3aWxsIG5vdCBiZSBzdGFydGVkIGZvciBhIFZpcnR1YWxIb3N0IGlmIGl0IGluaGVyaXRzCi10aGUgQWdlbnRMb2cgZnJvbSB0aGUgbWFpbiBzZXJ2ZXIuCi08L0RMPgotPFNUUk9ORz5TZWN1cml0eTo8L1NUUk9ORz4gaWYgYSBwcm9ncmFtIGlzIHVzZWQsIHRoZW4gaXQgd2lsbCBiZQotcnVuIHVuZGVyIHRoZSB1c2VyIHdobyBzdGFydGVkIGh0dHBkLiBUaGlzIHdpbGwgYmUgcm9vdCBpZiB0aGUgc2VydmVyCi13YXMgc3RhcnRlZCBieSByb290OyBiZSBzdXJlIHRoYXQgdGhlIHByb2dyYW0gaXMgc2VjdXJlLjxQPgotCi08U1RST05HPlNlY3VyaXR5OjwvU1RST05HPiBTZWUgdGhlIDxBCi1IUkVGPSIuLi9taXNjL3NlY3VyaXR5X3RpcHMuaHRtbCI+c2VjdXJpdHkgdGlwczwvQT4gZG9jdW1lbnQgZm9yCi1kZXRhaWxzIG9uIHdoeSB5b3VyIHNlY3VyaXR5IGNvdWxkIGJlIGNvbXByb21pc2VkIGlmIHRoZSBkaXJlY3RvcnkKLXdoZXJlIGxvZ2ZpbGVzIGFyZSBzdG9yZWQgaXMgd3JpdGFibGUgYnkgYW55b25lIG90aGVyIHRoYW4gdGhlIHVzZXIKLXRoYXQgc3RhcnRzIHRoZSBzZXJ2ZXIuPFA+Ci0KLVRoaXMgZGlyZWN0aXZlIGlzIHByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggTkNTQSAxLjQuPFA+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfbG9nX2NvbmZpZy5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9sb2dfY29uZmlnLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZDlkNTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9sb2dfY29uZmlnLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NTYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9sb2dfY29uZmlnPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+TW9kdWxlIG1vZF9sb2dfY29uZmlnPC9IMT4KLTxQPgotVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Q09ERT5tb2RfbG9nX2NvbmZpZy5jPC9DT0RFPiBmaWxlLAotYW5kIGlzIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQgaW4gQXBhY2hlIDEuMi4gbW9kX2xvZ19jb25maWcgcmVwbGFjZXMKLW1vZF9sb2dfY29tbW9uIGluIEFwYWNoZSAxLjIuIFByaW9yIHRvIHZlcnNpb24gMS4yLCBtb2RfbG9nX2NvbmZpZyB3YXMKLWFuIG9wdGlvbmFsIG1vZHVsZS4gSXQgcHJvdmlkZXMgZm9yIGxvZ2dpbmcgb2YgdGhlIHJlcXVlc3RzIG1hZGUgdG8KLXRoZSBzZXJ2ZXIsIHVzaW5nIHRoZSBDb21tb24gTG9nIEZvcm1hdCBvciBhIHVzZXItc3BlY2lmaWVkIGZvcm1hdC4KLTwvUD4KLQotPEgyPlN1bW1hcnk8L0gyPgotPFA+Ci1UaHJlZSBkaXJlY3RpdmVzIGFyZSBwcm92aWRlZCBieSB0aGlzIG1vZHVsZTogPENPREU+VHJhbnNmZXJMb2c8L0NPREU+Ci10byBjcmVhdGUgYSBsb2cgZmlsZSwgPENPREU+TG9nRm9ybWF0PC9DT0RFPiB0byBzZXQgYSBjdXN0b20gZm9ybWF0LAotYW5kIDxDT0RFPkN1c3RvbUxvZzwvQ09ERT4gdG8gZGVmaW5lIGEgbG9nIGZpbGUgYW5kIGZvcm1hdCBpbiBvbmUgZ28uCi1UaGUgPENPREU+VHJhbnNmZXJMb2c8L0NPREU+IGFuZCA8Q09ERT5DdXN0b21Mb2c8L0NPREU+IGRpcmVjdGl2ZXMgY2FuCi1iZSB1c2VkIG11bHRpcGxlIHRpbWVzIGluIGVhY2ggc2VydmVyIHRvIGNhdXNlIGVhY2ggcmVxdWVzdCB0byBiZQotbG9nZ2VkIHRvIG11bHRpcGxlIGZpbGVzLgotPC9QPgotCi08SDM+Q29tcGF0aWJpbGl0eSBub3RlczwvSDM+Ci0KLTxVTD4KLTxMST5UaGlzIG1vZHVsZSBpcyBiYXNlZCBvbiBtb2RfbG9nX2NvbmZpZyBkaXN0cmlidXRlZCB3aXRoCi1wcmV2aW91cyBBcGFjaGUgcmVsZWFzZXMsIG5vdyB1cGRhdGVkIHRvIGhhbmRsZSBtdWx0aXBsZSBsb2dzLgotVGhlcmUgaXMgbm93IG5vIG5lZWQgdG8gcmUtY29uZmlndXJlIEFwYWNoZSB0byB1c2UgY29uZmlndXJhdGlvbiBsb2cKLWZvcm1hdHMuCi0KLTxMST5UaGUgbW9kdWxlIGFsc28gaW1wbGVtZW50cyB0aGUgPENPREU+Q29va2llTG9nPC9DT0RFPiBkaXJlY3RpdmUsCi11c2VkIHRvIGxvZyB1c2VyLXRyYWNraW5nIGluZm9ybWF0aW9uIGNyZWF0ZWQgYnkgPEEKLUhSRUY9Im1vZF91c2VydHJhY2suaHRtbCI+bW9kX3VzZXJ0cmFjazwvQT4uIFRoZSB1c2Ugb2YKLTxDT0RFPkNvb2tpZUxvZzwvQ09ERT4gaXMgZGVwcmVjYXRlZCwgYW5kIGEgPENPREU+Q3VzdG9tTG9nPC9DT0RFPgotc2hvdWxkIGJlIGRlZmluZWQgdG8gbG9nIHVzZXItdHJhY2tpbmcgaW5mb3JtYXRpb24gaW5zdGVhZC4KLQotPExJPkFzIG9mIEFwYWNoZSAxLjMuNSwgdGhpcyBtb2R1bGUgYWxsb3dzIGNvbmRpdGlvbmFsIGxvZ2dpbmcKLWJhc2VkIHVwb24gdGhlIHNldHRpbmcgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgVGhhdCBpcywKLXlvdSBjYW4gY29udHJvbCB3aGV0aGVyIGEgcmVxdWVzdCBzaG91bGQgYmUgbG9nZ2VkIG9yIG5vdAotYmFzZWQgdXBvbiB3aGV0aGVyIGFuIGFyYml0cmFyeSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcwotZGVmaW5lZCBvciBub3QuICBUaGlzIGlzIHNldHRhYmxlIG9uIGEgPEVNPnBlcjwvRU0+LWxvZ2ZpbGUKLWJhc2lzLgotCi08TEk+QmVnaW5uaW5nIHdpdGggQXBhY2hlIDEuMy41LCB0aGUgbW9kX2xvZ19jb25maWcgbW9kdWxlIGhhcwotYWxzbyBzdWJzdW1lZCB0aGUgPENPREU+UmVmZXJlcklnbm9yZTwvQ09ERT4gZnVuY3Rpb25hbGl0eSBmcm9tCi08QSBIUkVGPSJtb2RfbG9nX3JlZmVyZXIuaHRtbCI+bW9kX2xvZ19yZWZlcmVyPC9BPi4gIFRoZSBlZmZlY3QKLW9mIDxDT0RFPlJlZmVyZXJJZ25vcmU8L0NPREU+IGNhbiBiZSBhY2hpZXZlZCBieSBjb21iaW5hdGlvbnMgb2YKLTxBIEhSRUY9Im1vZF9zZXRlbnZpZi5odG1sIj48Q09ERT5TZXRFbnZJZjwvQ09ERT48L0E+IGRpcmVjdGl2ZXMKLWFuZCBjb25kaXRpb25hbCA8Q09ERT5DdXN0b21Mb2c8L0NPREU+IGRlZmluaXRpb25zLgotCi08L1VMPgotCi08SDI+TG9nIEZpbGUgRm9ybWF0czwvSDI+Ci0KLVVubGVzcyB0b2xkIG90aGVyd2lzZSB3aXRoIDxUVD5Mb2dGb3JtYXQ8L1RUPiB0aGUgbG9nIGZpbGVzIGNyZWF0ZWQgYnkKLTxUVD5UcmFuc2ZlckxvZzwvVFQ+IHdpbGwgYmUgaW4gc3RhbmRhcmQgIkNvbW1vbiBMb2cgRm9ybWF0IgotKENMRikuIFRoZSBjb250ZW50cyBvZiBlYWNoIGxpbmUgaW4gYSBDTEYgZmlsZSBhcmUgZXhwbGFpbmVkCi1iZWxvdy4gQWx0ZXJuYXRpdmVseSwgdGhlIGxvZyBmaWxlIGNhbiBiZSBjdXN0b21pemVkIChhbmQgaWYgbXVsdGlwbGUKLWxvZyBmaWxlcyBhcmUgdXNlZCwgZWFjaCBjYW4gaGF2ZSBhIGRpZmZlcmVudCBmb3JtYXQpLiBDdXN0b20gZm9ybWF0cwotYXJlIHNldCB3aXRoIDxDT0RFPkxvZ0Zvcm1hdDwvQ09ERT4gYW5kIDxDT0RFPkN1c3RvbUxvZzwvQ09ERT4uCi0KLTxIMz5Db21tb24gTG9nIEZvcm1hdDwvSDM+Ci0KLVRoZSBDb21tb24gTG9nIEZvcm1hdCAoQ0xGKSBmaWxlIGNvbnRhaW5zIGEgc2VwYXJhdGUgbGluZSBmb3IgZWFjaAotcmVxdWVzdC4gQSBsaW5lIGlzIGNvbXBvc2VkIG9mIHNldmVyYWwgdG9rZW5zIHNlcGFyYXRlZCBieSBzcGFjZXM6Ci0KLTxCTE9DS1FVT1RFPgotaG9zdCBpZGVudCBhdXRodXNlciBkYXRlIHJlcXVlc3Qgc3RhdHVzIGJ5dGVzCi08L0JMT0NLUVVPVEU+Ci1JZiBhIHRva2VuIGRvZXMgbm90IGhhdmUgYSB2YWx1ZSB0aGVuIGl0IGlzIHJlcHJlc2VudGVkIGJ5IGEgaHlwaGVuICgtKS4KLVRoZSBtZWFuaW5ncyBhbmQgdmFsdWVzIG9mIHRoZXNlIHRva2VucyBhcmUgYXMgZm9sbG93czoKLTxETD4KLTxEVD5ob3N0Ci08REQ+VGhlIGZ1bGx5LXF1YWxpZmllZCBkb21haW4gbmFtZSBvZiB0aGUgY2xpZW50LCBvciBpdHMgSVAgbnVtYmVyIGlmIHRoZQotbmFtZSBpcyBub3QgYXZhaWxhYmxlLgotPERUPmlkZW50Ci08REQ+SWYgPEEgSFJFRj0iY29yZS5odG1sI2lkZW50aXR5Y2hlY2siPklkZW50aXR5Q2hlY2s8L0E+IGlzIGVuYWJsZWQgYW5kIHRoZQotY2xpZW50IG1hY2hpbmUgcnVucyBpZGVudGQsIHRoZW4gdGhpcyBpcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gcmVwb3J0ZWQKLWJ5IHRoZSBjbGllbnQuCi08RFQ+YXV0aHVzZXIKLTxERD5JZiB0aGUgcmVxdWVzdCB3YXMgZm9yIGFuIHBhc3N3b3JkIHByb3RlY3RlZCBkb2N1bWVudCwgdGhlbiB0aGlzIGlzCi10aGUgdXNlcmlkIHVzZWQgaW4gdGhlIHJlcXVlc3QuCi08RFQ+ZGF0ZQotPEREPlRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSByZXF1ZXN0LCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKLTxETD48REQ+PEJMT0NLUVVPVEU+PENPREU+IGRhdGUgPSBbZGF5L21vbnRoL3llYXI6aG91cjptaW51dGU6c2Vjb25kIHpvbmVdIDxCUj4KLWRheSA9IDIqZGlnaXQ8QlI+Ci1tb250aCA9IDMqbGV0dGVyPEJSPgoteWVhciA9IDQqZGlnaXQ8QlI+Ci1ob3VyID0gMipkaWdpdDxCUj4KLW1pbnV0ZSA9IDIqZGlnaXQ8QlI+Ci1zZWNvbmQgPSAyKmRpZ2l0PEJSPgotem9uZSA9IChgKycgfCBgLScpIDQqZGlnaXQ8L0NPREU+PC9CTE9DS1FVT1RFPjwvREw+Ci08RFQ+cmVxdWVzdAotPEREPlRoZSByZXF1ZXN0IGxpbmUgZnJvbSB0aGUgY2xpZW50LCBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzCi0oPENPREU+JnF1b3Q7PC9DT0RFPikuCi08RFQ+c3RhdHVzCi08REQ+VGhlIHRocmVlIGRpZ2l0IHN0YXR1cyBjb2RlIHJldHVybmVkIHRvIHRoZSBjbGllbnQuCi08RFQ+Ynl0ZXMKLTxERD5UaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBvYmplY3QgcmV0dXJuZWQgdG8gdGhlIGNsaWVudCwgbm90IGluY2x1ZGluZwotYW55IGhlYWRlcnMuCi08L0RMPgotCi08SDM+PEEgTkFNRT0iZm9ybWF0cyI+Q3VzdG9tIExvZyBGb3JtYXRzPC9BPjwvSDM+Ci0KLVRoZSBmb3JtYXQgYXJndW1lbnQgdG8gdGhlIDxDT0RFPkxvZ0Zvcm1hdDwvQ09ERT4gYW5kCi08Q09ERT5DdXN0b21Mb2c8L0NPREU+IGlzIGEgc3RyaW5nLiBUaGlzIHN0cmluZyBpcyBsb2dnZWQgdG8gdGhlIGxvZwotZmlsZSBmb3IgZWFjaCByZXF1ZXN0LiBJdCBjYW4gY29udGFpbiBsaXRlcmFsIGNoYXJhY3RlcnMgY29waWVkIGludG8KLXRoZSBsb2cgZmlsZXMsIGFuZCBgJScgZGlyZWN0aXZlcyB3aGljaCBhcmUgcmVwbGFjZWQgaW4gdGhlIGxvZyBmaWxlCi1ieSB0aGUgdmFsdWVzIGFzIGZvbGxvd3M6Ci0KLTxQUkU+Ci0lLi4uYTogICAgICAgICAgUmVtb3RlIElQLWFkZHJlc3MKLSUuLi5BOiAgICAgICAgICBMb2NhbCBJUC1hZGRyZXNzCi0lLi4uQjogICAgICAgICAgQnl0ZXMgc2VudCwgZXhjbHVkaW5nIEhUVFAgaGVhZGVycy4KLSUuLi5iOiAgICAgICAgICBCeXRlcyBzZW50LCBleGNsdWRpbmcgSFRUUCBoZWFkZXJzLiBJbiBDTEYgZm9ybWF0Ci0JCWkuZS4gYSAnLScgcmF0aGVyIHRoYW4gYSAwIHdoZW4gbm8gYnl0ZXMgYXJlIHNlbnQuCi0lLi4ue0ZPT0JBUn1lOiAgVGhlIGNvbnRlbnRzIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBGT09CQVIKLSUuLi5mOiAgICAgICAgICBGaWxlbmFtZQotJS4uLmg6ICAgICAgICAgIFJlbW90ZSBob3N0Ci0lLi4uSAkJVGhlIHJlcXVlc3QgcHJvdG9jb2wKLSUuLi57Rm9vYmFyfWk6ICBUaGUgY29udGVudHMgb2YgRm9vYmFyOiBoZWFkZXIgbGluZShzKSBpbiB0aGUgcmVxdWVzdAotICAgICAgICAgICAgICAgIHNlbnQgdG8gdGhlIHNlcnZlci4KLSUuLi5sOiAgICAgICAgICBSZW1vdGUgbG9nbmFtZSAoZnJvbSBpZGVudGQsIGlmIHN1cHBsaWVkKQotJS4uLm0JCVRoZSByZXF1ZXN0IG1ldGhvZAotJS4uLntGb29iYXJ9bjogIFRoZSBjb250ZW50cyBvZiBub3RlICJGb29iYXIiIGZyb20gYW5vdGhlciBtb2R1bGUuCi0lLi4ue0Zvb2Jhcn1vOiAgVGhlIGNvbnRlbnRzIG9mIEZvb2JhcjogaGVhZGVyIGxpbmUocykgaW4gdGhlIHJlcGx5LgotJS4uLnA6ICAgICAgICAgIFRoZSBjYW5vbmljYWwgUG9ydCBvZiB0aGUgc2VydmVyIHNlcnZpbmcgdGhlIHJlcXVlc3QKLSUuLi5QOiAgICAgICAgICBUaGUgcHJvY2VzcyBJRCBvZiB0aGUgY2hpbGQgdGhhdCBzZXJ2aWNlZCB0aGUgcmVxdWVzdC4KLSUuLi5xCQlUaGUgcXVlcnkgc3RyaW5nIChwcmVwZW5kZWQgd2l0aCBhID8gaWYgYSBxdWVyeSBzdHJpbmcgZXhpc3RzLAotCQlvdGhlcndpc2UgYW4gZW1wdHkgc3RyaW5nKQotJS4uLnI6ICAgICAgICAgIEZpcnN0IGxpbmUgb2YgcmVxdWVzdAotJS4uLnM6ICAgICAgICAgIFN0YXR1cy4gIEZvciByZXF1ZXN0cyB0aGF0IGdvdCBpbnRlcm5hbGx5IHJlZGlyZWN0ZWQsIHRoaXMgaXMKLSAgICAgICAgICAgICAgICB0aGUgc3RhdHVzIG9mIHRoZSAqb3JpZ2luYWwqIHJlcXVlc3QgLS0tICUuLi4mZ3Q7cyBmb3IgdGhlIGxhc3QuCi0lLi4udDogICAgICAgICAgVGltZSwgaW4gY29tbW9uIGxvZyBmb3JtYXQgdGltZSBmb3JtYXQgKHN0YW5kYXJkIGVuZ2xpc2ggZm9ybWF0KQotJS4uLntmb3JtYXR9dDogIFRoZSB0aW1lLCBpbiB0aGUgZm9ybSBnaXZlbiBieSBmb3JtYXQsIHdoaWNoIHNob3VsZAotICAgICAgICAgICAgICAgIGJlIGluIHN0cmZ0aW1lKDMpIGZvcm1hdC4gKHBvdGVudGlhbGx5IGxvY2FsaXNlZCkKLSUuLi5UOiAgICAgICAgICBUaGUgdGltZSB0YWtlbiB0byBzZXJ2ZSB0aGUgcmVxdWVzdCwgaW4gc2Vjb25kcy4KLSUuLi51OiAgICAgICAgICBSZW1vdGUgdXNlciAoZnJvbSBhdXRoOyBtYXkgYmUgYm9ndXMgaWYgcmV0dXJuIHN0YXR1cyAoJXMpIGlzIDQwMSkKLSUuLi5VOiAgICAgICAgICBUaGUgVVJMIHBhdGggcmVxdWVzdGVkLgotJS4uLnY6ICAgICAgICAgIFRoZSBjYW5vbmljYWwgU2VydmVyTmFtZSBvZiB0aGUgc2VydmVyIHNlcnZpbmcgdGhlIHJlcXVlc3QuCi0lLi4uVjogICAgICAgICAgVGhlIHNlcnZlciBuYW1lIGFjY29yZGluZyB0byB0aGUgVXNlQ2Fub25pY2FsTmFtZSBzZXR0aW5nLgotPC9QUkU+Ci0KLVRoZSBgLi4uJyBjYW4gYmUgbm90aGluZyBhdCBhbGwgKDxFTT5lLmcuPC9FTT4sIDxDT0RFPiIlaCAldSAlciAlcyAlYiI8L0NPREU+KSwgb3IgaXQgY2FuCi1pbmRpY2F0ZSBjb25kaXRpb25zIGZvciBpbmNsdXNpb24gb2YgdGhlIGl0ZW0gKHdoaWNoIHdpbGwgY2F1c2UgaXQKLXRvIGJlIHJlcGxhY2VkIHdpdGggYC0nIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldCkuICBOb3RlIHRoYXQKLXRoZXJlIGlzIG5vIGVzY2FwaW5nIHBlcmZvcm1lZCBvbiB0aGUgc3RyaW5ncyBmcm9tICVyLCAlLi4uaSBhbmQKLSUuLi5vOyBzb21lIHdpdGggbG9uZyBtZW1vcmllcyBtYXkgcmVtZW1iZXIgdGhhdCBJIHRob3VnaHQgdGhpcyB3YXMKLWEgYmFkIGlkZWEsIG9uY2UgdXBvbiBhIHRpbWUsIGFuZCBJJ20gc3RpbGwgbm90IGNvbWZvcnRhYmxlIHdpdGgKLWl0LCBidXQgaXQgaXMgZGlmZmljdWx0IHRvIHNlZSBob3cgdG8gYGRvIHRoZSByaWdodCB0aGluZycgd2l0aCBhbGwKLW9mIGAlLi5pJywgdW5sZXNzIHdlIFVSTC1lc2NhcGUgZXZlcnl0aGluZyBhbmQgYnJlYWsgd2l0aCBDTEYuCi0KLTxQPgotCi1UaGUgZm9ybXMgb2YgY29uZGl0aW9uIGFyZSBhIGxpc3Qgb2YgSFRUUCBzdGF0dXMgY29kZXMsIHdoaWNoIG1heQotb3IgbWF5IG5vdCBiZSBwcmVjZWRlZCBieSBgIScuICBUaHVzLCBgJTQwMCw1MDF7VXNlci1hZ2VudH1pJyBsb2dzCi1Vc2VyLWFnZW50OiBvbiA0MDAgZXJyb3JzIGFuZCA1MDEgZXJyb3JzIChCYWQgUmVxdWVzdCwgTm90Ci1JbXBsZW1lbnRlZCkgb25seTsgYCUhMjAwLDMwNCwzMDJ7UmVmZXJlcn1pJyBsb2dzIFJlZmVyZXI6IG9uIGFsbAotcmVxdWVzdHMgd2hpY2ggZGlkIDxTVFJPTkc+bm90PC9TVFJPTkc+IHJldHVybiBzb21lIHNvcnQgb2Ygbm9ybWFsIHN0YXR1cy4KLQotPFA+Ci0KLU5vdGUgdGhhdCB0aGUgY29tbW9uIGxvZyBmb3JtYXQgaXMgZGVmaW5lZCBieSB0aGUgc3RyaW5nIDxDT0RFPiIlaCAlbAotJXUgJXQgXCIlclwiICVzICViIjwvQ09ERT4sIHdoaWNoIGNhbiBiZSB1c2VkIGFzIHRoZSBiYXNpcyBmb3IKLWV4dGVuZGluZyBmb3IgZm9ybWF0IGlmIGRlc2lyZWQgKDxFTT5lLmcuPC9FTT4sIHRvIGFkZCBleHRyYSBmaWVsZHMgYXQgdGhlIGVuZCkuCi1OQ1NBJ3MgZXh0ZW5kZWQvY29tYmluZWQgbG9nIGZvcm1hdCB3b3VsZCBiZSA8Q09ERT4iJWggJWwgJXUgJXQgXCIlclwiICVzICViIFwiJXtSZWZlcmVyfWlcIiBcIiV7VXNlci1hZ2VudH1pXCIiPC9DT0RFPi4KLQotPFA+Ci0KLU5vdGUgdGhhdCB0aGUgY2Fub25pY2FsIDxBIEhSRUY9ImNvcmUuaHRtbCNzZXJ2ZXJuYW1lIj5TZXJ2ZXJOYW1lPC9BPgotYW5kIDxBIEhSRUY9ImNvcmUuaHRtbCNwb3J0Ij5Qb3J0PC9BPiBvZiB0aGUgc2VydmVyIHNlcnZpbmcgdGhlIHJlcXVlc3QKLWFyZSB1c2VkIGZvciA8Q09ERT4ldjwvQ09ERT4gYW5kIDxDT0RFPiVwPC9DT0RFPiByZXNwZWN0aXZlbHkuICBUaGlzCi1oYXBwZW5zIHJlZ2FyZGxlc3Mgb2YgdGhlCi08QSBIUkVGPSJjb3JlLmh0bWwjdXNlY2Fub25pY2FsbmFtZSI+VXNlQ2Fub25pY2FsTmFtZTwvQT4gc2V0dGluZyBiZWNhdXNlCi1vdGhlcndpc2UgbG9nIGFuYWx5c2lzIHByb2dyYW1zIHdvdWxkIGhhdmUgdG8gZHVwbGljYXRlIHRoZSBlbnRpcmUKLXZob3N0IG1hdGNoaW5nIGFsZ29yaXRobSBpbiBvcmRlciB0byBkZWNpZGUgd2hhdCBob3N0IHJlYWxseSBzZXJ2ZWQKLXRoZSByZXF1ZXN0LgotCi08SDI+VXNpbmcgTXVsdGlwbGUgTG9nIEZpbGVzPC9IMj4KLQotVGhlIDxDT0RFPlRyYW5zZmVyTG9nPC9DT0RFPiBhbmQgPENPREU+Q3VzdG9tTG9nPC9DT0RFPiBkaXJlY3RpdmVzIGNhbgotYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UgdG8gbG9nIHJlcXVlc3RzIHRvIG11bHRpcGxlIGxvZyBmaWxlcy4gRWFjaAotcmVxdWVzdCB3aWxsIGJlIGxvZ2dlZCB0byBhbGwgdGhlIGxvZyBmaWxlcyBkZWZpbmVkIGJ5IGVpdGhlciBvZiB0aGVzZQotZGlyZWN0aXZlcy4KLQotPEgzPlVzZSB3aXRoIFZpcnR1YWwgSG9zdHM8L0gzPgotCi1JZiBhICZsdDtWaXJ0dWFsSG9zdCZndDsgc2VjdGlvbiBkb2VzIG5vdCBjb250YWluIGFueQotPFRUPlRyYW5zZmVyTG9nPC9UVD4gb3IgPFRUPkN1c3RvbUxvZzwvVFQ+IGRpcmVjdGl2ZXMsIHRoZQotbG9ncyBkZWZpbmVkIGZvciB0aGUgbWFpbiBzZXJ2ZXIgd2lsbCBiZSB1c2VkLiBJZiBpdCBkb2VzCi1jb250YWluIG9uZSBvciBtb3JlIG9mIHRoZXNlIGRpcmVjdGl2ZXMsIHJlcXVlc3RzIHNlcnZpY2VkIGJ5Ci10aGlzIHZpcnR1YWwgaG9zdCB3aWxsIG9ubHkgYmUgbG9nZ2VkIGluIHRoZSBsb2cgZmlsZXMgZGVmaW5lZAotd2l0aGluIGl0cyBkZWZpbml0aW9uLCBub3QgaW4gYW55IG9mIHRoZSBtYWluIHNlcnZlcidzIGxvZyBmaWxlcy4KLVNlZSB0aGUgZXhhbXBsZXMgYmVsb3cuCi08UD4KLQotPEgyPlNlY3VyaXR5IENvbnNpZGVyYXRpb25zPC9IMj4KLQotU2VlIHRoZSA8QSBIUkVGPSIuLi9taXNjL3NlY3VyaXR5X3RpcHMuaHRtbCNzZWN1cml0eSI+c2VjdXJpdHkgdGlwczwvQT4KLWRvY3VtZW50IGZvciBkZXRhaWxzIG9uIHdoeSB5b3VyIHNlY3VyaXR5IGNvdWxkIGJlIGNvbXByb21pc2VkIGlmIHRoZQotZGlyZWN0b3J5IHdoZXJlIGxvZ2ZpbGVzIGFyZSBzdG9yZWQgaXMgd3JpdGFibGUgYnkgYW55b25lIG90aGVyIHRoYW4KLXRoZSB1c2VyIHRoYXQgc3RhcnRzIHRoZSBzZXJ2ZXIuCi08UD4KLTxIMj5EaXJlY3RpdmVzPC9IMj4KLQotPFVMPgotPExJPjxBIEhSRUY9IiNjb29raWVsb2ciPkNvb2tpZUxvZzwvQT4KLTxMST48QSBIUkVGPSIjY3VzdG9tbG9nIj5DdXN0b21Mb2c8L0E+Ci08TEk+PEEgSFJFRj0iI2N1c3RvbWxvZy1jb25kaXRpb25hbCI+Q3VzdG9tTG9nIChjb25kaXRpb25hbCk8L0E+Ci08TEk+PEEgSFJFRj0iI2xvZ2Zvcm1hdCI+TG9nRm9ybWF0PC9BPgotPExJPjxBIEhSRUY9IiN0cmFuc2ZlcmxvZyI+VHJhbnNmZXJMb2c8L0E+Ci08L1VMPgotPEhSPgotCi0KLTxIMj48QSBOQU1FPSJjb29raWVsb2ciPkNvb2tpZUxvZzwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IENvb2tpZUxvZ30gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQ29va2llTG9nIDxFTT5maWxlbmFtZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2Nvb2tpZXM8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gT25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDEuMiBhbmQgYWJvdmU8UD4KLQotVGhlIENvb2tpZUxvZyBkaXJlY3RpdmUgc2V0cyB0aGUgZmlsZW5hbWUgZm9yIGxvZ2dpbmcgb2YgY29va2llcy4KLVRoZSBmaWxlbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgPEEKLUhSRUY9ImNvcmUuaHRtbCNzZXJ2ZXJyb290Ij5TZXJ2ZXJSb290PC9BPi4gVGhpcyBkaXJlY3RpdmUgaXMgaW5jbHVkZWQKLW9ubHkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAotPEEgSFJFRj0ibW9kX2Nvb2tpZXMuaHRtbCI+bW9kX2Nvb2tpZXM8L0E+LCBhbmQgaXMgZGVwcmVjYXRlZC4KLTxQPgotCi08SFI+Ci08SDI+PEEgTkFNRT0iY3VzdG9tbG9nIj5DdXN0b21Mb2c8L0E+PC9IMj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQ3VzdG9tTG9nIDxFTT5maWxlLXBpcGU8L0VNPgotICAgIDxFTT5mb3JtYXQtb3Itbmlja25hbWU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gTmlja25hbWUgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDEuMwotICAgIG9yIGxhdGVyCi08QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9sb2dfY29uZmlnCi08UD4KLVRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgZmlsZW5hbWUgdG8gd2hpY2ggbG9nIHJlY29yZHMgc2hvdWxkIGJlCi13cml0dGVuLiBUaGlzIGlzIHVzZWQKLWV4YWN0bHkgbGlrZSB0aGUgYXJndW1lbnQgdG8KLTxBCi0gSFJFRj0iI3RyYW5zZmVybG9nIgotPjxTQU1QPlRyYW5zZmVyTG9nPC9TQU1QPjwvQT47Ci10aGF0IGlzLCBpdCBpcyBlaXRoZXIgYSBmdWxsIHBhdGggb3IgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQKLXNlcnZlciByb290LgotPC9QPgotPFA+Ci1UaGUgZm9ybWF0IGFyZ3VtZW50IHNwZWNpZmllcyBhIGZvcm1hdCBmb3IgZWFjaCBsaW5lIG9mIHRoZSBsb2cgZmlsZS4KLVRoZSBvcHRpb25zIGF2YWlsYWJsZSBmb3IgdGhlIGZvcm1hdCBhcmUgZXhhY3RseSB0aGUgc2FtZSBhcyBmb3IKLXRoZSBhcmd1bWVudCBvZiB0aGUgPFRUPkxvZ0Zvcm1hdDwvVFQ+IGRpcmVjdGl2ZS4gSWYgdGhlIGZvcm1hdAotaW5jbHVkZXMgYW55IHNwYWNlcyAod2hpY2ggaXQgd2lsbCBkbyBpbiBhbG1vc3QgYWxsIGNhc2VzKSBpdAotc2hvdWxkIGJlIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMuCi08L1A+Ci08UD4KLUluc3RlYWQgb2YgYW4gYWN0dWFsIGZvcm1hdCBzdHJpbmcsIHlvdSBjYW4gdXNlIGEgZm9ybWF0IG5pY2tuYW1lIGRlZmluZWQgd2l0aAotdGhlCi08QQotIEhSRUY9IiNsb2dmb3JtYXQiCi0+PFNBTVA+TG9nRm9ybWF0PC9TQU1QPjwvQT4KLWRpcmVjdGl2ZS4KLTwvUD4KLQotPEhSPgotPEgyPjxBIE5BTUU9ImN1c3RvbWxvZy1jb25kaXRpb25hbCI+Q3VzdG9tTG9nIChjb25kaXRpb25hbCk8L0E+PC9IMj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQ3VzdG9tTG9nIDxFTT5maWxlLXBpcGU8L0VNPgotICAgIDxFTT5mb3JtYXQtb3Itbmlja25hbWU8L0VNPgotICAgIGVudj1bIV08RU0+ZW52aXJvbm1lbnQtdmFyaWFibGU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gT25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDEuMy41Ci0gICAgb3IgbGF0ZXIKLTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2xvZ19jb25maWcKLTxQPgotCi1UaGUgYmVoYXZpb3VyIG9mIHRoaXMgZm9ybSBvZiB0aGUgPFNBTVA+Q3VzdG9tTG9nPC9TQU1QPiBkaXJlY3RpdmUgaXMgYWxtb3N0Ci1pZGVudGljYWwgdG8gdGhlIDxBIEhSRUY9IiNjdXN0b21sb2ciPnN0YW5kYXJkIDxDT0RFPkN1c3RvbUxvZzwvQ09ERT48L0E+Ci1kaXJlY3RpdmUuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSAnPENPREU+ZW52PTwvQ09ERT4nIGNsYXVzZSBjb250cm9scwotd2hldGhlciBhIHBhcnRpY3VsYXIgcmVxdWVzdCB3aWxsIGJlIGxvZ2dlZCBpbiB0aGUgc3BlY2lmaWVkIGZpbGUgb3IKLW5vdC4gIElmIHRoZSBzcGVjaWZpZWQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0IGZvciB0aGUKLXJlcXVlc3QgKG9yIGlzIG5vdCBzZXQsIGluIHRoZSBjYXNlIG9mIGEgJzxDT0RFPmVudj0hPEVNPm5hbWU8L0VNPjwvQ09ERT4nCi1jbGF1c2UpLCB0aGVuIHRoZSByZXF1ZXN0IHdpbGwgYmUgbG9nZ2VkLgotPC9QPgotPFA+Ci1FbnZpcm9ubWVudCB2YXJpYWJsZXMgY2FuIGJlIHNldCBvbiBhIDxFTT5wZXI8L0VNPi1yZXF1ZXN0IGJhc2lzCi11c2luZyB0aGUgPEEgSFJFRj0ibW9kX3NldGVudmlmLmh0bWwiPm1vZF9zZXRlbnZpZjwvQT4gYW5kL29yCi08QSBIUkVGPSJtb2RfcmV3cml0ZS5odG1sIj5tb2RfcmV3cml0ZTwvQT4gbW9kdWxlcy4gIEZvciBleGFtcGxlLAotaWYgeW91IGRvbid0IHdhbnQgdG8gcmVjb3JkIHJlcXVlc3RzIGZvciBhbGwgR0lGIGltYWdlcyBvbgoteW91ciBzZXJ2ZXIgaW4gYSBzZXBhcmF0ZSBsb2dmaWxlIGJ1dCBub3QgeW91ciBtYWluIGxvZywgeW91Ci1jYW4gdXNlOgotPC9QPgotPFBSRT4KLSAgICBTZXRFbnZJZiBSZXF1ZXN0X1VSSSBcLmdpZiQgZ2lmLWltYWdlCi0gICAgQ3VzdG9tTG9nIGdpZi1yZXF1ZXN0cy5sb2cgY29tbW9uIGVudj1naWYtaW1hZ2UKLSAgICBDdXN0b21Mb2cgbm9uZ2lmLXJlcXVlc3RzLmxvZyBjb21tb24gZW52PSFnaWYtaW1hZ2UKLTwvUFJFPgotCi08SFI+Ci08SDI+PEEgTkFNRT0ibG9nZm9ybWF0Ij5Mb2dGb3JtYXQ8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBMb2dGb3JtYXR9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IExvZ0Zvcm1hdCA8RU0+Zm9ybWF0PC9FTT4gWzxFTT5uaWNrbmFtZTwvRU0+XQotPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPkxvZ0Zvcm1hdCAmcXVvdDslaCAlbCAldSAldCBcJnF1b3Q7JXJcJnF1b3Q7Ci0lcyAlYiZxdW90OzwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IE5pY2tuYW1lIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZSAxLjMKLSAgICBvciBsYXRlcgotPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfbG9nX2NvbmZpZwotPFA+Ci1UaGlzIHNldHMgdGhlIGZvcm1hdCBvZiB0aGUgZGVmYXVsdCBsb2dmaWxlIG5hbWVkIGJ5IHRoZQotPEEKLSBIUkVGPSIjdHJhbnNmZXJsb2ciCi0+PFNBTVA+VHJhbnNmZXJMb2c8L1NBTVA+PC9BPgotZGlyZWN0aXZlIC4gIFNlZSB0aGUgc2VjdGlvbiBvbgotPEEgSFJFRj0iI2Zvcm1hdHMiPkN1c3RvbSBMb2cgRm9ybWF0czwvQT4gZm9yIGRldGFpbHMgb24gdGhlIGZvcm1hdAotYXJndW1lbnRzLgotPC9QPgotPFA+Ci1JZiB5b3UgaW5jbHVkZSBhIG5pY2tuYW1lIGZvciB0aGUgZm9ybWF0IG9uIHRoZSBkaXJlY3RpdmUgbGluZSwgeW91IGNhbgotdXNlIGl0IGluIG90aGVyIDxTQU1QPkxvZ0Zvcm1hdDwvU0FNUD4gYW5kCi08QSBIUkVGPSIjY3VzdG9tbG9nIj48U0FNUD5DdXN0b21Mb2c8L1NBTVA+PC9BPgotZGlyZWN0aXZlcyByYXRoZXIgdGhhbiByZXBlYXRpbmcgdGhlIGVudGlyZSBmb3JtYXQgc3RyaW5nLgotPC9QPgotPFA+Ci1BCi08U0FNUD5Mb2dGb3JtYXQ8L1NBTVA+IGRpcmVjdGl2ZSB3aGljaCBkZWZpbmVzIGEgbmlja25hbWUgPFNUUk9ORz5kb2VzCi1ub3RoaW5nIGVsc2U8L1NUUk9ORz4gLS0gdGhhdCBpcywgaXQgPEVNPm9ubHk8L0VNPiBkZWZpbmVzIHRoZSBuaWNrbmFtZSwKLWl0IGRvZXNuJ3QgYWN0dWFsbHkgYXBwbHkgdGhlIGZvcm1hdCBhbmQgbWFrZSBpdCB0aGUgZGVmYXVsdC4KLTwvUD4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0idHJhbnNmZXJsb2ciPlRyYW5zZmVyTG9nPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgVHJhbnNmZXJMb2d9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFRyYW5zZmVyTG9nIDxFTT5maWxlLXBpcGU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiBub25lPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2xvZ19jb25maWc8UD4KLQotVGhlIFRyYW5zZmVyTG9nIGRpcmVjdGl2ZSBhZGRzIGEgbG9nIGZpbGUgaW4gdGhlIGZvcm1hdCBkZWZpbmVkIGJ5IHRoZQotbW9zdCByZWNlbnQKLTxBCi0gSFJFRj0iI2xvZ2Zvcm1hdCIKLT48U0FNUD5Mb2dGb3JtYXQ8L1NBTVA+PC9BPgotZGlyZWN0aXZlLCBvciBDb21tb24gTG9nIEZvcm1hdCBpZiBubyBvdGhlciBkZWZhdWx0IGZvcm1hdCBoYXMgYmVlbgotc3BlY2lmaWVkLgotPEVNPkZpbGUtcGlwZTwvRU0+IGlzIG9uZQotb2YKLTxETD48RFQ+QSBmaWxlbmFtZQotPEREPkEgZmlsZW5hbWUgcmVsYXRpdmUgdG8gdGhlIDxBIEhSRUY9ImNvcmUuaHRtbCNzZXJ2ZXJyb290Ij5TZXJ2ZXJSb290PC9BPi4KLTxEVD4gYHwnIGZvbGxvd2VkIGJ5IGEgY29tbWFuZAotPEREPkEgcHJvZ3JhbSB0byByZWNlaXZlIHRoZSBhZ2VudCBsb2cgaW5mb3JtYXRpb24gb24gaXRzIHN0YW5kYXJkIGlucHV0LgotTm90ZSB0aGUgYSBuZXcgcHJvZ3JhbSB3aWxsIG5vdCBiZSBzdGFydGVkIGZvciBhIFZpcnR1YWxIb3N0IGlmIGl0IGluaGVyaXRzCi10aGUgVHJhbnNmZXJMb2cgZnJvbSB0aGUgbWFpbiBzZXJ2ZXIuCi08L0RMPgotPFNUUk9ORz5TZWN1cml0eTo8L1NUUk9ORz4gaWYgYSBwcm9ncmFtIGlzIHVzZWQsIHRoZW4gaXQgd2lsbCBiZQotcnVuIHVuZGVyIHRoZSB1c2VyIHdobyBzdGFydGVkIGh0dHBkLiBUaGlzIHdpbGwgYmUgcm9vdCBpZiB0aGUgc2VydmVyCi13YXMgc3RhcnRlZCBieSByb290OyBiZSBzdXJlIHRoYXQgdGhlIHByb2dyYW0gaXMgc2VjdXJlLjxQPgotCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX2xvZ19yZWZlcmVyLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX2xvZ19yZWZlcmVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxN2FlY2QuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9sb2dfcmVmZXJlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIG1vZHVsZSBtb2RfbG9nX3JlZmVyZXI8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5Nb2R1bGUgbW9kX2xvZ19yZWZlcmVyPC9IMT4KLQotVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Q09ERT5tb2RfbG9nX3JlZmVyZXIuYzwvQ09ERT4gZmlsZSwgYW5kIGlzIG5vdAotY29tcGlsZWQgaW4gYnkgZGVmYXVsdC4gSXQgcHJvdmlkZXMgZm9yIGxvZ2dpbmcgb2YgdGhlIGRvY3VtZW50cyB3aGljaAotcmVmZXJlbmNlIGRvY3VtZW50cyBvbiB0aGUgc2VydmVyLiBBcyBvZiBBcGFjaGUgMS4zLjUgaXQgaXMgZGVwcmVjYXRlZC4KLVVzZSA8QSBIUkVGPSJtb2RfbG9nX2NvbmZpZy5odG1sI2N1c3RvbWxvZy1jb25kaXRpb25hbCI+Q3VzdG9tTG9nCi0oY29uZGl0aW9uYWwpPC9BPiBpbnN0ZWFkLgotCi08SDI+TG9nIGZpbGUgZm9ybWF0PC9IMj4KLVRoZSBsb2cgZmlsZSBjb250YWlucyBhIHNlcGFyYXRlIGxpbmUgZm9yIGVhY2ggcmVmZXIuIEVhY2ggbGluZSBoYXMgdGhlCi1mb3JtYXQKLTxCTE9DS1FVT1RFPjxFTT51cmk8L0VNPiA8Q09ERT4tJmd0OzwvQ09ERT4gPEVNPmRvY3VtZW50PC9FTT48L0JMT0NLUVVPVEU+Ci13aGVyZSA8RU0+dXJpPC9FTT4gaXMgdGhlICglLWVzY2FwZWQpIFVSSSBmb3IgdGhlIGRvY3VtZW50IHRoYXQgcmVmZXJlbmNlcwotdGhlIG9uZSByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudCwgYW5kIDxFTT5kb2N1bWVudDwvRU0+IGlzIHRoZSAoJS1kZWNvZGVkKQotbG9jYWwgVVJMIHRvIHRoZSBkb2N1bWVudCBiZWluZyByZWZlcnJlZCB0by4KLQotCi08SDI+RGlyZWN0aXZlczwvSDI+Ci08VUw+Ci08TEk+PEEgSFJFRj0iI3JlZmVyZXJpZ25vcmUiPlJlZmVyZXJJZ25vcmU8L0E+Ci08TEk+PEEgSFJFRj0iI3JlZmVyZXJsb2ciPlJlZmVyZXJMb2c8L0E+Ci08L1VMPgotPEhSPgotCi0KLTxIMj48QSBOQU1FPSJyZWZlcmVyaWdub3JlIj5SZWZlcmVySWdub3JlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgUmVmZXJlcklnbm9yZX0gZGlyZWN0aXZlJmd0OyAtLT4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gUmVmZXJlcklnbm9yZSA8RU0+c3RyaW5nIHN0cmluZyAuLi48L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEV4dGVuc2lvbjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX2xvZ19yZWZlcmVyPFA+Ci0KLVRoZSBSZWZlcmVySWdub3JlIGRpcmVjdGl2ZSBhZGRzIHRvIHRoZSBsaXN0IG9mIHN0cmluZ3MgdG8gaWdub3JlIGluCi1SZWZlcmVyIGhlYWRlcnMuIElmIGFueSBvZiB0aGUgc3RyaW5ncyBpbiB0aGUgbGlzdCBpcyBjb250YWluZWQgaW4KLXRoZSBSZWZlcmVyIGhlYWRlciwgdGhlbiBubyByZWZlcnJlciBpbmZvcm1hdGlvbiB3aWxsIGJlIGxvZ2dlZCBmb3IgdGhlCi1yZXF1ZXN0LiBFeGFtcGxlOgotPEJMT0NLUVVPVEU+PENPREU+UmVmZXJlcklnbm9yZSB3d3cubmNzYS51aXVjLmVkdTwvQ09ERT48L0JMT0NLUVVPVEU+Ci1UaGlzIGF2b2lkcyBsb2dnaW5nIHJlZmVyZW5jZXMgZnJvbSB3d3cubmNzYS51aXVjLmVkdS4KLTxQPjxIUj4KLQotCi08SDI+PEEgTkFNRT0icmVmZXJlcmxvZyI+UmVmZXJlckxvZzwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IFJlZmVyZXJMb2d9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFJlZmVyZXJMb2cgPEVNPmZpbGUtcGlwZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPlJlZmVyZXJMb2cgbG9ncy9yZWZlcmVyX2xvZzwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBFeHRlbnNpb248QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9sb2dfcmVmZXJlcjxQPgotCi1UaGUgUmVmZXJlckxvZyBkaXJlY3RpdmUgc2V0cyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byB3aGljaCB0aGUgc2VydmVyIHdpbGwKLWxvZyB0aGUgUmVmZXJlciBoZWFkZXIgb2YgaW5jb21pbmcgcmVxdWVzdHMuIDxFTT5GaWxlLXBpcGU8L0VNPiBpcyBvbmUKLW9mCi08REw+PERUPkEgZmlsZW5hbWUKLTxERD5BIGZpbGVuYW1lIHJlbGF0aXZlIHRvIHRoZSA8QSBIUkVGPSJjb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvQT4uCi08RFQ+IGB8JyBmb2xsb3dlZCBieSBhIGNvbW1hbmQKLTxERD5BIHByb2dyYW0gdG8gcmVjZWl2ZSB0aGUgcmVmZXJyZXIgbG9nIGluZm9ybWF0aW9uIG9uIGl0cyBzdGFuZGFyZCBpbnB1dC4KLU5vdGUgdGhlIGEgbmV3IHByb2dyYW0gd2lsbCBub3QgYmUgc3RhcnRlZCBmb3IgYSBWaXJ0dWFsSG9zdCBpZiBpdCBpbmhlcml0cwotdGhlIFJlZmVyZXJMb2cgZnJvbSB0aGUgbWFpbiBzZXJ2ZXIuCi08L0RMPgotPFNUUk9ORz5TZWN1cml0eTo8L1NUUk9ORz4gaWYgYSBwcm9ncmFtIGlzIHVzZWQsIHRoZW4gaXQgd2lsbCBiZQotcnVuIHVuZGVyIHRoZSB1c2VyIHdobyBzdGFydGVkIGh0dHBkLiBUaGlzIHdpbGwgYmUgcm9vdCBpZiB0aGUgc2VydmVyCi13YXMgc3RhcnRlZCBieSByb290OyBiZSBzdXJlIHRoYXQgdGhlIHByb2dyYW0gaXMgc2VjdXJlLjxQPgotCi08U1RST05HPlNlY3VyaXR5OjwvU1RST05HPiBTZWUgdGhlIDxBCi1IUkVGPSIuLi9taXNjL3NlY3VyaXR5X3RpcHMuaHRtbCI+c2VjdXJpdHkgdGlwczwvQT4gZG9jdW1lbnQgZm9yCi1kZXRhaWxzIG9uIHdoeSB5b3VyIHNlY3VyaXR5IGNvdWxkIGJlIGNvbXByb21pc2VkIGlmIHRoZSBkaXJlY3RvcnkKLXdoZXJlIGxvZ2ZpbGVzIGFyZSBzdG9yZWQgaXMgd3JpdGFibGUgYnkgYW55b25lIG90aGVyIHRoYW4gdGhlIHVzZXIKLXRoYXQgc3RhcnRzIHRoZSBzZXJ2ZXIuPFA+Ci0KLVRoaXMgZGlyZWN0aXZlIGlzIHByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggTkNTQSAxLjQuPFA+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfbWltZS5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9taW1lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2OTNiZTAuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9taW1lLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9taW1lPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+TW9kdWxlIG1vZF9taW1lPC9IMT4KLQotVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Q09ERT5tb2RfbWltZS5jPC9DT0RFPiBmaWxlLCBhbmQgaXMKLWNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuIEl0IHByb3ZpZGVzIGZvciBkZXRlcm1pbmluZyB0aGUgdHlwZXMgb2YgZmlsZXMKLWZyb20gdGhlIGZpbGVuYW1lLgotCi08SDI+U3VtbWFyeTwvSDI+Ci0KLVRoaXMgbW9kdWxlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHZhcmlvdXMgYml0cyBvZiAibWV0YSBpbmZvcm1hdGlvbiIKLWFib3V0IGRvY3VtZW50cy4gVGhpcyBpbmZvcm1hdGlvbiByZWxhdGVzIHRvIHRoZSBjb250ZW50IG9mIHRoZQotZG9jdW1lbnQgYW5kIGlzIHJldHVybmVkIHRvIHRoZSBicm93c2VyIG9yIHVzZWQgaW4gY29udGVudC1uZWdvdGlhdGlvbgotd2l0aGluIHRoZSBzZXJ2ZXIuIEluIGFkZGl0aW9uLCBhICJoYW5kbGVyIiBjYW4gYmUgc2V0IGZvciBhIGRvY3VtZW50LAotd2hpY2ggZGV0ZXJtaW5lcyBob3cgdGhlIGRvY3VtZW50IHdpbGwgYmUgcHJvY2Vzc2VkIHdpdGhpbiB0aGUgc2VydmVyLgotCi08UD4KLQotVGhlIGRpcmVjdGl2ZXMgPGEgaHJlZj0iI2FkZGNoYXJzZXQiPkFkZENoYXJzZXQ8L2E+LAotPEEgSFJFRj0iI2FkZGVuY29kaW5nIj5BZGRFbmNvZGluZzwvQT4sIDxBIEhSRUY9IiNhZGRoYW5kbGVyIj5BZGRIYW5kbGVyPC9BPiwKLTxBIEhSRUY9IiNhZGRsYW5ndWFnZSI+QWRkTGFuZ3VhZ2U8L0E+IGFuZCA8QSBIUkVGPSIjYWRkdHlwZSI+QWRkVHlwZTwvQT4KLWFyZSBhbGwgdXNlZCB0byBtYXAgZmlsZSBleHRlbnNpb25zIG9udG8gdGhlIG1ldGEtaW5mb3JtYXRpb24gZm9yIHRoYXQKLWZpbGUuICBSZXNwZWN0aXZlbHkgdGhleSBzZXQgdGhlIGNoYXJhY3RlciBzZXQsIGNvbnRlbnQtZW5jb2RpbmcsIGhhbmRsZXIsCi1jb250ZW50LWxhbmd1YWdlLCBhbmQgTUlNRS10eXBlIChjb250ZW50LXR5cGUpIG9mIGRvY3VtZW50cy4gIFRoZQotZGlyZWN0aXZlIDxBIEhSRUY9IiN0eXBlc2NvbmZpZyI+VHlwZXNDb25maWc8L0E+IGlzIHVzZWQgdG8gc3BlY2lmeSBhCi1maWxlIHdoaWNoIGFsc28gbWFwcyBleHRlbnNpb25zIG9udG8gTUlNRSB0eXBlcy4gVGhlIGRpcmVjdGl2ZXMgPEEKLUhSRUY9IiNmb3JjZXR5cGUiPkZvcmNlVHlwZTwvQT4gYW5kIDxBCi1IUkVGPSIjc2V0aGFuZGxlciI+U2V0SGFuZGxlcjwvQT4gYXJlIHVzZWQgdG8gYXNzb2NpYXRlZCBhbGwgdGhlIGZpbGVzCi1pbiBhIGdpdmVuIGxvY2F0aW9uICg8RU0+ZS5nLjwvRU0+LCBhIHBhcnRpY3VsYXIgZGlyZWN0b3J5KSBvbnRvIGEgcGFydGljdWxhcgotTUlNRSB0eXBlIG9yIGhhbmRsZXIuCi0KLTxQPgotCi1Ob3RlIHRoYXQgY2hhbmdpbmcgdGhlIHR5cGUgb3IgZW5jb2Rpbmcgb2YgYSBmaWxlIGRvZXMgbm90IGNoYW5nZSB0aGUKLXZhbHVlIG9mIHRoZSA8Q09ERT5MYXN0LU1vZGlmaWVkPC9DT0RFPiBoZWFkZXIuIFRodXMsIHByZXZpb3VzbHkgY2FjaGVkCi1jb3BpZXMgbWF5IHN0aWxsIGJlIHVzZWQgYnkgYSBjbGllbnQgb3IgcHJveHksIHdpdGggdGhlIHByZXZpb3VzIGhlYWRlcnMuCi0KLTxIMj48QSBOQU1FPSJtdWx0aXBsZWV4dCI+RmlsZXMgd2l0aCBNdWx0aXBsZSBFeHRlbnNpb25zPC9BPjwvSDI+Ci0KLUZpbGVzIGNhbiBoYXZlIG1vcmUgdGhhbiBvbmUgZXh0ZW5zaW9uLCBhbmQgdGhlIG9yZGVyIG9mIHRoZQotZXh0ZW5zaW9ucyBpcyA8RU0+bm9ybWFsbHk8L0VNPiBpcnJlbGV2YW50LiBGb3IgZXhhbXBsZSwgaWYgdGhlIGZpbGUKLTxDT0RFPndlbGNvbWUuaHRtbC5mcjwvQ09ERT4gbWFwcyBvbnRvIGNvbnRlbnQgdHlwZSB0ZXh0L2h0bWwgYW5kCi1sYW5ndWFnZSBGcmVuY2ggdGhlbiB0aGUgZmlsZSA8Q09ERT53ZWxjb21lLmZyLmh0bWw8L0NPREU+IHdpbGwgbWFwCi1vbnRvIGV4YWN0bHkgdGhlIHNhbWUgaW5mb3JtYXRpb24uIFRoZSBvbmx5IGV4Y2VwdGlvbiB0byB0aGlzIGlzIGlmIGFuCi1leHRlbnNpb24gaXMgZ2l2ZW4gd2hpY2ggQXBhY2hlIGRvZXMgbm90IGtub3cgaG93IHRvIGhhbmRsZS4gSW4gdGhpcwotY2FzZSBpdCB3aWxsICJmb3JnZXQiIGFib3V0IGFueSBpbmZvcm1hdGlvbiBpdCBvYnRhaW5lZCBmcm9tCi1leHRlbnNpb25zIHRvIHRoZSBsZWZ0IG9mIHRoZSB1bmtub3duIGV4dGVuc2lvbi4gU28sIGZvciBleGFtcGxlLCBpZgotdGhlIGV4dGVuc2lvbnMgZnIgYW5kIGh0bWwgYXJlIG1hcHBlZCB0byB0aGUgYXBwcm9wcmlhdGUgbGFuZ3VhZ2UgYW5kCi10eXBlIGJ1dCBleHRlbnNpb24geHh4IGlzIG5vdCBhc3NpZ25lZCB0byBhbnl0aGluZywgdGhlbiB0aGUgZmlsZQotPENPREU+d2VsY29tZS5mci54eHguaHRtbDwvQ09ERT4gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggY29udGVudC10eXBlCi10ZXh0L2h0bWwgYnV0IDxFTT5ubzwvRU0+IGxhbmd1YWdlLgotCi08UD4KLQotSWYgbW9yZSB0aGFuIG9uZSBleHRlbnNpb24gaXMgZ2l2ZW4gd2hpY2ggbWFwcyBvbnRvIHRoZSBzYW1lIHR5cGUgb2YKLW1ldGEtaW5mb3JtYXRpb24sIHRoZW4gdGhlIG9uZSB0byB0aGUgcmlnaHQgd2lsbCBiZSB1c2VkLiBGb3IgZXhhbXBsZSwKLWlmICIuZ2lmIiBtYXBzIHRvIHRoZSBNSU1FLXR5cGUgaW1hZ2UvZ2lmIGFuZCAiLmh0bWwiIG1hcHMgdG8gdGhlCi1NSU1FLXR5cGUgdGV4dC9odG1sLCB0aGVuIHRoZSBmaWxlIDxDT0RFPndlbGNvbWUuZ2lmLmh0bWw8L0NPREU+IHdpbGwKLWJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgTUlNRS10eXBlICJ0ZXh0L2h0bWwiLgotCi08UD4KLQotQ2FyZSBzaG91bGQgYmUgdGFrZW4gd2hlbiBhIGZpbGUgd2l0aCBtdWx0aXBsZSBleHRlbnNpb25zIGdldHMKLWFzc29jaWF0ZWQgd2l0aCBib3RoIGEgTUlNRS10eXBlIGFuZCBhIGhhbmRsZXIuIFRoaXMgd2lsbCB1c3VhbGx5Ci1yZXN1bHQgaW4gdGhlIHJlcXVlc3QgYmVpbmcgYnkgdGhlIG1vZHVsZSBhc3NvY2lhdGVkIHdpdGggdGhlCi1oYW5kbGVyLiBGb3IgZXhhbXBsZSwgaWYgdGhlIDxDT0RFPi5pbWFwPC9DT0RFPiBleHRlbnNpb24gaXMgbWFwcGVkIHRvCi10aGUgaGFuZGxlciAiaW1hcC1maWxlIiAoZnJvbSBtb2RfaW1hcCkgYW5kIHRoZSA8Q09ERT4uaHRtbDwvQ09ERT4KLWV4dGVuc2lvbiBpcyBtYXBwZWQgdG8gdGhlIE1JTUUtdHlwZSAidGV4dC9odG1sIiwgdGhlbiB0aGUgZmlsZQotPENPREU+d29ybGQuaW1hcC5odG1sPC9DT0RFPiB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCBib3RoIHRoZQotImltYXAtZmlsZSIgaGFuZGxlciBhbmQgInRleHQvaHRtbCIgTUlNRS10eXBlLiBXaGVuIGl0IGlzIHByb2Nlc3NlZCwKLXRoZSAiaW1hcC1maWxlIiBoYW5kbGVyIHdpbGwgYmUgdXNlZCwgYW5kIHNvIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBhCi1tb2RfaW1hcCBpbWFnZW1hcCBmaWxlLgotCi08SDI+RGlyZWN0aXZlczwvSDI+Ci08VUw+Ci08bGk+PGEgaHJlZj0iI2FkZGNoYXJzZXQiPkFkZENoYXJzZXQ8L2E+PC9saT4KLTxMST48QSBIUkVGPSIjYWRkZW5jb2RpbmciPkFkZEVuY29kaW5nPC9BPgotPExJPjxBIEhSRUY9IiNhZGRoYW5kbGVyIj5BZGRIYW5kbGVyPC9BPgotPExJPjxBIEhSRUY9IiNhZGRsYW5ndWFnZSI+QWRkTGFuZ3VhZ2U8L0E+Ci08TEk+PEEgSFJFRj0iI2FkZHR5cGUiPkFkZFR5cGU8L0E+Ci08TEk+PEEgSFJFRj0iI2RlZmF1bHRsYW5ndWFnZSI+RGVmYXVsdExhbmd1YWdlPC9BPgotPExJPjxBIEhSRUY9IiNmb3JjZXR5cGUiPkZvcmNlVHlwZTwvQT4KLTxMST48QSBIUkVGPSIjcmVtb3ZlaGFuZGxlciI+UmVtb3ZlSGFuZGxlcjwvQT4KLTxMST48QSBIUkVGPSIjc2V0aGFuZGxlciI+U2V0SGFuZGxlcjwvQT4KLTxMST48QSBIUkVGPSIjdHlwZXNjb25maWciPlR5cGVzQ29uZmlnPC9BPgotPC9VTD4KLTxIUj4KLQotPEgyPjxBIE5BTUU9ImFkZGNoYXJzZXQiPkFkZENoYXJzZXQ8L0E+PC9IMj4KLTxBIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IiBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBBZGRDaGFyc2V0IDxpPmNoYXJzZXQgZXh0ZW5zaW9uCi0gW2V4dGVuc2lvbi4uLl08L2k+PGJyPgotPEEgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IiBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IEZpbGVJbmZvPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfbWltZQotPGJyPgotPEEgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IiBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gQWRkQ2hhcnNldCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUKLTEuMy4xMCBhbmQgbGF0ZXIKLQotPFA+Ci1UaGUgQWRkQ2hhcnNldCBkaXJlY3RpdmUgbWFwcyB0aGUgZ2l2ZW4gZmlsZW5hbWUgZXh0ZW5zaW9ucyB0byB0aGUKLXNwZWNpZmllZCBjb250ZW50IGNoYXJzZXQuIDxpPmNoYXJzZXQ8L2k+IGlzIHRoZSBNSU1FIGNoYXJzZXQKLXBhcmFtZXRlciBvZiBmaWxlbmFtZXMgY29udGFpbmluZyA8aT5leHRlbnNpb248L2k+LiAgVGhpcyBtYXBwaW5nIGlzCi1hZGRlZCB0byBhbnkgYWxyZWFkeSBpbiBmb3JjZSwgb3ZlcnJpZGluZyBhbnkgbWFwcGluZ3MgdGhhdCBhbHJlYWR5Ci1leGlzdCBmb3IgdGhlIHNhbWUgPGk+ZXh0ZW5zaW9uPC9pPi4KLTwvUD4KLTxQPgotRXhhbXBsZToKLTxwcmU+Ci0gICAgQWRkTGFuZ3VhZ2UgamEgLmphCi0gICAgQWRkQ2hhcnNldCBFVUMtSlAgLmV1YwotICAgIEFkZENoYXJzZXQgSVNPLTIwMjItSlAgLmppcwotICAgIEFkZENoYXJzZXQgU0hJRlRfSklTIC5zamlzCi08L3ByZT4KLQotPFA+Ci1UaGVuIHRoZSBkb2N1bWVudCA8c2FtcD54eHh4LmphLmppczwvc2FtcD4gd2lsbCBiZSB0cmVhdGVkIGFzIGJlaW5nIGEKLUphcGFuZXNlIGRvY3VtZW50IHdob3NlIGNoYXJzZXQgaXMgSVNPLTIwMjItSlAgKGFzIHdpbGwgdGhlIGRvY3VtZW50Ci08c2FtcD54eHh4Lmppcy5qYTwvc2FtcD4pLiBBbHRob3VnaCB0aGUgY29udGVudCBjaGFyc2V0IGlzIHJlcG9ydGVkIHRvCi10aGUgY2xpZW50LCB0aGUgYnJvd3NlciBpcyB1bmxpa2VseSB0byB1c2UgdGhpcyBpbmZvcm1hdGlvbi4gVGhlCi1BZGRDaGFyc2V0IGRpcmVjdGl2ZSBpcyBtb3JlIHVzZWZ1bCBmb3IKLTxBIEhSRUY9Ii4uL2NvbnRlbnQtbmVnb3RpYXRpb24uaHRtbCI+Y29udGVudCBuZWdvdGlhdGlvbjwvQT4sIHdoZXJlCi10aGUgc2VydmVyIHJldHVybnMgb25lIGZyb20gc2V2ZXJhbCBkb2N1bWVudHMgYmFzZWQgb24gdGhlIGNsaWVudCdzCi1jaGFyc2V0IHByZWZlcmVuY2UuCi08L1A+Ci08UD4KLTxTVFJPTkc+U2VlIGFsc288L1NUUk9ORz46IDxBIEhSRUY9Im1vZF9uZWdvdGlhdGlvbi5odG1sIj5tb2RfbmVnb3RpYXRpb248L0E+Ci08L1A+Ci0KLTxocj4KLQotPEgyPjxBIE5BTUU9ImFkZGVuY29kaW5nIj5BZGRFbmNvZGluZzwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEFkZEVuY29kaW5nfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBBZGRFbmNvZGluZyA8RU0+TUlNRS1lbmMgZXh0ZW5zaW9uIGV4dGVuc2lvbi4uLjwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBGaWxlSW5mbzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX21pbWU8UD4KLQotVGhlIEFkZEVuY29kaW5nIGRpcmVjdGl2ZSBtYXBzIHRoZSBnaXZlbiBmaWxlbmFtZSBleHRlbnNpb25zIHRvIHRoZQotc3BlY2lmaWVkIGVuY29kaW5nIHR5cGUuIDxFTT5NSU1FLWVuYzwvRU0+IGlzIHRoZSBNSU1FIGVuY29kaW5nIHRvIHVzZQotZm9yIGRvY3VtZW50cyBjb250YWluaW5nIHRoZSA8RU0+ZXh0ZW5zaW9uPC9FTT4uIFRoaXMgbWFwcGluZyBpcyBhZGRlZAotdG8gYW55IGFscmVhZHkgaW4gZm9yY2UsIG92ZXJyaWRpbmcgYW55IG1hcHBpbmdzIHRoYXQgYWxyZWFkeSBleGlzdAotZm9yIHRoZSBzYW1lIDxFTT5leHRlbnNpb248L0VNPi4KLQotRXhhbXBsZToKLTxCTE9DS1FVT1RFPjxDT0RFPiBBZGRFbmNvZGluZyB4LWd6aXAgZ3o8QlI+IEFkZEVuY29kaW5nIHgtY29tcHJlc3MgWgotPC9DT0RFPjwvQkxPQ0tRVU9URT4KLQotVGhpcyB3aWxsIGNhdXNlIGZpbGVuYW1lcyBjb250YWluaW5nIHRoZSAuZ3ogZXh0ZW5zaW9uIHRvIGJlIG1hcmtlZCBhcwotZW5jb2RlZCB1c2luZyB0aGUgeC1nemlwIGVuY29kaW5nLCBhbmQgZmlsZW5hbWVzIGNvbnRhaW5pbmcgdGhlIC5aCi1leHRlbnNpb24gdG8gYmUgbWFya2VkIGFzIGVuY29kZWQgd2l0aCB4LWNvbXByZXNzLjxQPgotCi1PbGQgY2xpZW50cyBleHBlY3QgPENPREU+eC1nemlwPC9DT0RFPiBhbmQgPENPREU+eC1jb21wcmVzczwvQ09ERT4sCi1ob3dldmVyIHRoZSBzdGFuZGFyZCBkaWN0YXRlcyB0aGF0IHRoZXkncmUgZXF1aXZhbGVudCB0byA8Q09ERT5nemlwPC9DT0RFPgotYW5kIDxDT0RFPmNvbXByZXNzPC9DT0RFPiByZXNwZWN0aXZlbHkuICBBcGFjaGUgZG9lcyBjb250ZW50IGVuY29kaW5nCi1jb21wYXJpc29ucyBieSBpZ25vcmluZyBhbnkgbGVhZGluZyA8Q09ERT54LTwvQ09ERT4uICBXaGVuIHJlc3BvbmRpbmcKLXdpdGggYW4gZW5jb2RpbmcgQXBhY2hlIHdpbGwgdXNlIHdoYXRldmVyIGZvcm0gKDxFTT5pLmUuPC9FTT4sIDxDT0RFPngtZm9vPC9DT0RFPgotb3IgPENPREU+Zm9vPC9DT0RFPikgdGhlIGNsaWVudCByZXF1ZXN0ZWQuICBJZiB0aGUgY2xpZW50IGRpZG4ndAotc3BlY2lmaWNhbGx5IHJlcXVlc3QgYSBwYXJ0aWN1bGFyIGZvcm0gQXBhY2hlIHdpbGwgdXNlIHRoZSBmb3JtIGdpdmVuIGJ5Ci10aGUgPENPREU+QWRkRW5jb2Rpbmc8L0NPREU+IGRpcmVjdGl2ZS4gIFRvIG1ha2UgdGhpcyBsb25nIHN0b3J5IHNob3J0LAoteW91IHNob3VsZCBhbHdheXMgdXNlIDxDT0RFPngtZ3ppcDwvQ09ERT4gYW5kIDxDT0RFPngtY29tcHJlc3M8L0NPREU+Ci1mb3IgdGhlc2UgdHdvIHNwZWNpZmljIGVuY29kaW5ncy4gIE1vcmUgcmVjZW50IGVuY29kaW5ncywgc3VjaCBhcwotPENPREU+ZGVmbGF0ZTwvQ09ERT4gc2hvdWxkIGJlIHNwZWNpZmllZCB3aXRob3V0IHRoZSA8Q09ERT54LTwvQ09ERT4uCi0KLTxQPgotCi08U1RST05HPlNlZSBhbHNvPC9TVFJPTkc+OiA8QSBIUkVGPSIjbXVsdGlwbGVleHQiPkZpbGVzIHdpdGgKLW11bHRpcGxlIGV4dGVuc2lvbnM8L0E+Ci0KLTxQPjxIUj4KLQotPEgyPjxBIE5BTUU9ImFkZGhhbmRsZXIiPkFkZEhhbmRsZXI8L0E+PC9IMj4KLQotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBBZGRIYW5kbGVyIDxFTT5oYW5kbGVyLW5hbWUgZXh0ZW5zaW9uIGV4dGVuc2lvbi4uLjwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBGaWxlSW5mbzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX21pbWU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gQWRkSGFuZGxlciBpcyBvbmx5IGF2YWlsYWJsZSBpbiBBcGFjaGUKLTEuMSBhbmQgbGF0ZXI8UD4KLQotPFA+QWRkSGFuZGxlciBtYXBzIHRoZSBmaWxlbmFtZSBleHRlbnNpb25zIDxFTT5leHRlbnNpb248L0VNPiB0byB0aGUKLTxBIEhSRUY9Ii4uL2hhbmRsZXIuaHRtbCI+aGFuZGxlcjwvQT4gPEVNPmhhbmRsZXItbmFtZTwvRU0+LiAgVGhpcwotbWFwcGluZyBpcyBhZGRlZCB0byBhbnkgYWxyZWFkeSBpbiBmb3JjZSwgb3ZlcnJpZGluZyBhbnkgbWFwcGluZ3MgdGhhdAotYWxyZWFkeSBleGlzdCBmb3IgdGhlIHNhbWUgPEVNPmV4dGVuc2lvbjwvRU0+LgotCi1Gb3IgZXhhbXBsZSwgdG8gYWN0aXZhdGUgQ0dJIHNjcmlwdHMKLXdpdGggdGhlIGZpbGUgZXh0ZW5zaW9uICI8Q09ERT4uY2dpPC9DT0RFPiIsIHlvdSBtaWdodCB1c2U6Ci08UFJFPgotICAgIEFkZEhhbmRsZXIgY2dpLXNjcmlwdCBjZ2kKLTwvUFJFPgotCi08UD5PbmNlIHRoYXQgaGFzIGJlZW4gcHV0IGludG8geW91ciBzcm0uY29uZiBvciBodHRwZC5jb25mIGZpbGUsIGFueQotZmlsZSBjb250YWluaW5nIHRoZSAiPENPREU+LmNnaTwvQ09ERT4iIGV4dGVuc2lvbiB3aWxsIGJlIHRyZWF0ZWQgYXMgYQotQ0dJIHByb2dyYW0uPC9QPiAKLQotPFA+Ci0KLTxTVFJPTkc+U2VlIGFsc288L1NUUk9ORz46IDxBIEhSRUY9IiNtdWx0aXBsZWV4dCI+RmlsZXMgd2l0aAotbXVsdGlwbGUgZXh0ZW5zaW9uczwvQT4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0iYWRkbGFuZ3VhZ2UiPkFkZExhbmd1YWdlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgQWRkTGFuZ3VhZ2V9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEFkZExhbmd1YWdlIDxFTT5NSU1FLWxhbmcgZXh0ZW5zaW9uIGV4dGVuc2lvbi4uLjwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBGaWxlSW5mbzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX21pbWUKLQotPFA+Ci1UaGUgQWRkTGFuZ3VhZ2UgZGlyZWN0aXZlIG1hcHMgdGhlIGdpdmVuIGZpbGVuYW1lIGV4dGVuc2lvbnMgdG8gdGhlCi1zcGVjaWZpZWQgY29udGVudCBsYW5ndWFnZS4gPEVNPk1JTUUtbGFuZzwvRU0+IGlzIHRoZSBNSU1FIGxhbmd1YWdlIG9mCi1maWxlbmFtZXMgY29udGFpbmluZyA8RU0+ZXh0ZW5zaW9uPC9FTT4uICBUaGlzIG1hcHBpbmcgaXMgYWRkZWQgdG8gYW55Ci1hbHJlYWR5IGluIGZvcmNlLCBvdmVycmlkaW5nIGFueSBtYXBwaW5ncyB0aGF0IGFscmVhZHkgZXhpc3QgZm9yIHRoZQotc2FtZSA8RU0+ZXh0ZW5zaW9uPC9FTT4uCi08L1A+Ci08UD4KLUV4YW1wbGU6IDxCTE9DS1FVT1RFPjxDT0RFPgotQWRkRW5jb2RpbmcgeC1jb21wcmVzcyBaPEJSPiBBZGRMYW5ndWFnZSBlbiAuZW48QlI+IEFkZExhbmd1YWdlIGZyCi0uZnI8QlI+IDwvQ09ERT48L0JMT0NLUVVPVEU+Ci08L1A+Ci08UD4KLVRoZW4gdGhlIGRvY3VtZW50IDxDT0RFPnh4eHguZW4uWjwvQ09ERT4gd2lsbCBiZSB0cmVhdGVkIGFzIGJlaW5nIGEKLWNvbXByZXNzZWQgRW5nbGlzaCBkb2N1bWVudCAoYXMgd2lsbCB0aGUgZG9jdW1lbnQKLTxDT0RFPnh4eHguWi5lbjwvQ09ERT4pLiBBbHRob3VnaCB0aGUgY29udGVudCBsYW5ndWFnZSBpcyByZXBvcnRlZCB0bwotdGhlIGNsaWVudCwgdGhlIGJyb3dzZXIgaXMgdW5saWtlbHkgdG8gdXNlIHRoaXMgaW5mb3JtYXRpb24uIFRoZQotQWRkTGFuZ3VhZ2UgZGlyZWN0aXZlIGlzIG1vcmUgdXNlZnVsIGZvcgotPEEgSFJFRj0iLi4vY29udGVudC1uZWdvdGlhdGlvbi5odG1sIj5jb250ZW50IG5lZ290aWF0aW9uPC9BPiwgd2hlcmUKLXRoZSBzZXJ2ZXIgcmV0dXJucyBvbmUgZnJvbSBzZXZlcmFsIGRvY3VtZW50cyBiYXNlZCBvbiB0aGUgY2xpZW50J3MKLWxhbmd1YWdlIHByZWZlcmVuY2UuCi08L1A+Ci08UD4KLUlmIG11bHRpcGxlIGxhbmd1YWdlIGFzc2lnbm1lbnRzIGFyZSBtYWRlIGZvciB0aGUgc2FtZSBleHRlbnNpb24sCi10aGUgbGFzdCBvbmUgZW5jb3VudGVyZWQgaXMgdGhlIG9uZSB0aGF0IGlzIHVzZWQuICBUaGF0IGlzLCBmb3IgdGhlCi1jYXNlIG9mOgotPC9QPgotPFBSRT4KLSAgICBBZGRMYW5ndWFnZSBlbiAuZW4KLSAgICBBZGRMYW5ndWFnZSBlbi11ayAuZW4KLSAgICBBZGRMYW5ndWFnZSBlbi11cyAuZW4KLTwvUFJFPgotPFA+Ci1kb2N1bWVudHMgd2l0aCB0aGUgZXh0ZW5zaW9uICI8Q09ERT4uZW48L0NPREU+IiB3b3VsZCBiZSB0cmVhdGVkIGFzCi1iZWluZyAiPENPREU+ZW4tdXM8L0NPREU+Ii4KLTwvUD4KLTxQPgotPFNUUk9ORz5TZWUgYWxzbzwvU1RST05HPjogPEEgSFJFRj0iI211bHRpcGxlZXh0Ij5GaWxlcyB3aXRoCi1tdWx0aXBsZSBleHRlbnNpb25zPC9BPgotPEJSPgotPFNUUk9ORz5TZWUgYWxzbzwvU1RST05HPjogPEEKLUhSRUY9Ii4vbW9kX25lZ290aWF0aW9uLmh0bWwiPm1vZF9uZWdvdGlhdGlvbjwvQT4KLTwvUD4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0iYWRkdHlwZSI+QWRkVHlwZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEFkZFR5cGV9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IEFkZFR5cGUgPEVNPk1JTUUtdHlwZSBleHRlbnNpb24gZXh0ZW5zaW9uLi4uPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IEZpbGVJbmZvPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfbWltZTxQPgotCi1UaGUgQWRkVHlwZSBkaXJlY3RpdmUgbWFwcyB0aGUgZ2l2ZW4gZmlsZW5hbWUgZXh0ZW5zaW9ucyBvbnRvIHRoZQotc3BlY2lmaWVkIGNvbnRlbnQgdHlwZS4gPEVNPk1JTUUtZW5jPC9FTT4gaXMgdGhlIE1JTUUgdHlwZSB0byB1c2UgZm9yCi1maWxlbmFtZXMgY29udGFpbmluZyA8RU0+ZXh0ZW5zaW9uPC9FTT4uICBUaGlzIG1hcHBpbmcgaXMgYWRkZWQgdG8gYW55Ci1hbHJlYWR5IGluIGZvcmNlLCBvdmVycmlkaW5nIGFueSBtYXBwaW5ncyB0aGF0IGFscmVhZHkgZXhpc3QgZm9yIHRoZQotc2FtZSA8RU0+ZXh0ZW5zaW9uPC9FTT4uIFRoaXMgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGFkZCBtYXBwaW5ncwotbm90IGxpc3RlZCBpbiB0aGUgTUlNRSB0eXBlcyBmaWxlIChzZWUgdGhlIDxDT0RFPjxBCi1IUkVGPSIjdHlwZXNjb25maWciPlR5cGVzQ29uZmlnPC9BPjwvQ09ERT4gZGlyZWN0aXZlKS4KLQotRXhhbXBsZToKLTxCTE9DS1FVT1RFPjxDT0RFPgotQWRkVHlwZSBpbWFnZS9naWYgR0lGCi08L0NPREU+PC9CTE9DS1FVT1RFPgotSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBuZXcgTUlNRSB0eXBlcyBiZSBhZGRlZCB1c2luZyB0aGUgQWRkVHlwZSBkaXJlY3RpdmUKLXJhdGhlciB0aGFuIGNoYW5naW5nIHRoZSA8QSBIUkVGPSIjdHlwZXNjb25maWciPlR5cGVzQ29uZmlnPC9BPiBmaWxlLjxQPgotTm90ZSB0aGF0LCB1bmxpa2UgdGhlIE5DU0EgaHR0cGQsIHRoaXMgZGlyZWN0aXZlIGNhbm5vdCBiZSB1c2VkIHRvIHNldCB0aGUKLXR5cGUgb2YgcGFydGljdWxhciBmaWxlcy48UD4KLQotPFA+Ci0KLTxTVFJPTkc+U2VlIGFsc288L1NUUk9ORz46IDxBIEhSRUY9IiNtdWx0aXBsZWV4dCI+RmlsZXMgd2l0aAotbXVsdGlwbGUgZXh0ZW5zaW9uczwvQT4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0iZGVmYXVsdGxhbmd1YWdlIj5EZWZhdWx0TGFuZ3VhZ2U8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBEZWZhdWx0TGFuZ3VhZ2V9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IERlZmF1bHRMYW5ndWFnZSA8RU0+TUlNRS1sYW5nPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IEZpbGVJbmZvPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfbWltZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBEZWZhdWx0TGFuZ3VhZ2UgaXMgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlCi0xLjMuNCBhbmQgbGF0ZXIuPFA+Ci0KLVRoZSBEZWZhdWx0TGFuZ3VhZ2UgZGlyZWN0aXZlIHRlbGxzIEFwYWNoZSB0aGF0IGFsbCBmaWxlcyBpbiB0aGUKLWRpcmVjdGl2ZSdzIHNjb3BlICg8RU0+ZS5nLjwvRU0+LCBhbGwgZmlsZXMgY292ZXJlZCBieSB0aGUgY3VycmVudAotPENPREU+Jmx0O0RpcmVjdG9yeSZndDs8L0NPREU+IGNvbnRhaW5lcikgdGhhdCBkb24ndCBoYXZlIGFuIGV4cGxpY2l0Ci1sYW5ndWFnZSBleHRlbnNpb24gKHN1Y2ggYXMgPFNBTVA+LmZyPC9TQU1QPiBvciA8U0FNUD4uZGU8L1NBTVA+IGFzCi1jb25maWd1cmVkIGJ5IDxTQU1QPkFkZExhbmd1YWdlPC9TQU1QPikgc2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYmUgaW4KLXRoZSBzcGVjaWZpZWQgPEVNPk1JTUUtbGFuZzwvRU0+IGxhbmd1YWdlLiAgVGhpcyBhbGxvd3MgZW50aXJlCi1kaXJlY3RvcmllcyB0byBiZSBtYXJrZWQgYXMgY29udGFpbmluZyBEdXRjaCBjb250ZW50LCBmb3IgaW5zdGFuY2UsCi13aXRob3V0IGhhdmluZyB0byByZW5hbWUgZWFjaCBmaWxlLiBOb3RlIHRoYXQgdW5saWtlIHVzaW5nIGV4dGVuc2lvbnMKLXRvIHNwZWNpZnkgbGFuZ3VhZ2VzLCA8U0FNUD5EZWZhdWx0TGFuZ3VhZ2U8L1NBTVA+IGNhbiBvbmx5IHNwZWNpZnkgYQotc2luZ2xlIGxhbmd1YWdlLgotCi08UD4KLQotSWYgbm8gPFNBTVA+RGVmYXVsdExhbmd1YWdlPC9TQU1QPiBkaXJlY3RpdmUgaXMgaW4gZm9yY2UsIGFuZCBhIGZpbGUKLWRvZXMgbm90IGhhdmUgYW55IGxhbmd1YWdlIGV4dGVuc2lvbnMgYXMgY29uZmlndXJlZCBieQotPFNBTVA+QWRkTGFuZ3VhZ2U8L1NBTVA+LCB0aGVuIHRoYXQgZmlsZSB3aWxsIGJlIGNvbnNpZGVyZWQgdG8gaGF2ZSBubwotbGFuZ3VhZ2UgYXR0cmlidXRlLgotCi08UD4KLQotPFNUUk9ORz5TZWUgYWxzbzwvU1RST05HPjogPEEKLUhSRUY9Ii4vbW9kX25lZ290aWF0aW9uLmh0bWwiPm1vZF9uZWdvdGlhdGlvbjwvQT4KLTxCUj4KLTxTVFJPTkc+U2VlIGFsc288L1NUUk9ORz46IDxBIEhSRUY9IiNtdWx0aXBsZWV4dCI+RmlsZXMgd2l0aAotbXVsdGlwbGUgZXh0ZW5zaW9uczwvQT4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0iZm9yY2V0eXBlIj5Gb3JjZVR5cGU8L0E+PC9IMj4KLQotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBGb3JjZVR5cGUgPEVNPm1lZGlhIHR5cGU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBkaXJlY3RvcnksIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX21pbWU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gRm9yY2VUeXBlIGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZQotMS4xIGFuZCBsYXRlci48UD4KLQotPFA+V2hlbiBwbGFjZWQgaW50byBhbiA8Q09ERT4uaHRhY2Nlc3M8L0NPREU+IGZpbGUgb3IgYQotPENPREU+Jmx0O0RpcmVjdG9yeSZndDs8L0NPREU+IG9yIDxDT0RFPiZsdDtMb2NhdGlvbiZndDs8L0NPREU+IHNlY3Rpb24sCi10aGlzIGRpcmVjdGl2ZSBmb3JjZXMgYWxsIG1hdGNoaW5nIGZpbGVzIHRvIGJlIHNlcnZlZAotYXMgdGhlIGNvbnRlbnQgdHlwZSBnaXZlbiBieSA8RU0+bWVkaWEgdHlwZTwvRU0+LiBGb3IgZXhhbXBsZSwgaWYgeW91Ci1oYWQgYSBkaXJlY3RvcnkgZnVsbCBvZiBHSUYgZmlsZXMsIGJ1dCBkaWQgbm90IHdhbnQgdG8gbGFiZWwgdGhlbSBhbGwgd2l0aAotIi5naWYiLCB5b3UgbWlnaHQgd2FudCB0byB1c2U6Ci08UFJFPgotICAgIEZvcmNlVHlwZSBpbWFnZS9naWYKLTwvUFJFPgotPFA+Tm90ZSB0aGF0IHRoaXMgd2lsbCBvdmVycmlkZSBhbnkgZmlsZW5hbWUgZXh0ZW5zaW9ucyB0aGF0IG1pZ2h0IGRldGVybWluZQotdGhlIG1lZGlhIHR5cGUuPC9QPjxIUj4KLQotPEgyPjxBIE5BTUU9InJlbW92ZWhhbmRsZXIiPlJlbW92ZUhhbmRsZXI8L0E+PC9IMj4KLQotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBSZW1vdmVIYW5kbGVyIDxFTT5leHRlbnNpb24gZXh0ZW5zaW9uLi4uPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gZGlyZWN0b3J5LCAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9taW1lPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IFJlbW92ZUhhbmRsZXIgaXMgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlCi0xLjMuNCBhbmQgbGF0ZXIuPFA+Ci0KLTxQPgotVGhlIDxTQU1QPlJlbW92ZUhhbmRsZXI8L1NBTVA+IGRpcmVjdGl2ZSByZW1vdmVzIGFueQotaGFuZGxlciBhc3NvY2lhdGlvbnMgZm9yIGZpbGVzIHdpdGggdGhlIGdpdmVuIGV4dGVuc2lvbnMuCi1UaGlzIGFsbG93cyA8Q09ERT4uaHRhY2Nlc3M8L0NPREU+IGZpbGVzIGluIHN1YmRpcmVjdG9yaWVzIHRvIHVuZG8KLWFueSBhc3NvY2lhdGlvbnMgaW5oZXJpdGVkIGZyb20gcGFyZW50IGRpcmVjdG9yaWVzIG9yIHRoZSBzZXJ2ZXIKLWNvbmZpZyBmaWxlcy4gIEFuIGV4YW1wbGUgb2YgaXRzIHVzZSBtaWdodCBiZToKLTwvUD4KLTxETD4KLSA8RFQ+PENPREU+L2Zvby8uaHRhY2Nlc3M6PC9DT0RFPjwvRFQ+Ci0gPEREPjxDT0RFPkFkZEhhbmRsZXIgc2VydmVyLXBhcnNlZCAuaHRtbDwvQ09ERT48L0REPgotIDxEVD48Q09ERT4vZm9vL2Jhci8uaHRhY2Nlc3M6PC9DT0RFPjwvRFQ+Ci0gPEREPjxDT0RFPlJlbW92ZUhhbmRsZXIgLmh0bWw8L0NPREU+PC9ERD4KLTwvREw+Ci08UD4KLVRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgcmV0dXJuaW5nIDxTQU1QPi5odG1sPC9TQU1QPiBmaWxlcyBpbiB0aGUKLTxTQU1QPi9mb28vYmFyPC9TQU1QPiBkaXJlY3RvcnkgdG8gYmVpbmcgdHJlYXRlZCBhcyBub3JtYWwKLWZpbGVzLCByYXRoZXIgdGhhbiBhcyBjYW5kaWRhdGVzIGZvciBwYXJzaW5nIChzZWUgdGhlCi08QSBIUkVGPSJtb2RfaW5jbHVkZS5odG1sIj48U0FNUD5tb2RfaW5jbHVkZTwvU0FNUD48L0E+IG1vZHVsZSkuCi08L1A+Ci08SFI+Ci0KLTxIMj48QSBOQU1FPSJzZXRoYW5kbGVyIj5TZXRIYW5kbGVyPC9BPjwvSDI+Ci0KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gU2V0SGFuZGxlciA8RU0+aGFuZGxlci1uYW1lPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gZGlyZWN0b3J5LCAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9taW1lPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IFNldEhhbmRsZXIgaXMgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlCi0xLjEgYW5kIGxhdGVyLjxQPgotCi08UD5XaGVuIHBsYWNlZCBpbnRvIGFuIDxDT0RFPi5odGFjY2VzczwvQ09ERT4gZmlsZSBvciBhCi08Q09ERT4mbHQ7RGlyZWN0b3J5Jmd0OzwvQ09ERT4gb3IgPENPREU+Jmx0O0xvY2F0aW9uJmd0OzwvQ09ERT4gc2VjdGlvbiwKLXRoaXMgZGlyZWN0aXZlIGZvcmNlcyBhbGwgbWF0Y2hpbmcgZmlsZXMgdG8gYmUgcGFyc2VkIHRocm91Z2ggdGhlCi08QSBIUkVGPSIuLi9oYW5kbGVyLmh0bWwiPmhhbmRsZXI8L0E+Ci1naXZlbiBieSA8RU0+aGFuZGxlci1uYW1lPC9FTT4uIEZvciBleGFtcGxlLCBpZiB5b3UgaGFkIGEKLWRpcmVjdG9yeSB5b3Ugd2FudGVkIHRvIGJlIHBhcnNlZCBlbnRpcmVseSBhcyBpbWFnZW1hcCBydWxlIGZpbGVzLAotcmVnYXJkbGVzcyBvZiBleHRlbnNpb24sIHlvdSBtaWdodCBwdXQgdGhlIGZvbGxvd2luZyBpbnRvIGFuCi08Q09ERT4uaHRhY2Nlc3M8L0NPREU+IGZpbGUgaW4gdGhhdCBkaXJlY3Rvcnk6Ci08UFJFPgotICAgIFNldEhhbmRsZXIgaW1hcC1maWxlCi08L1BSRT4KLQotPFA+QW5vdGhlciBleGFtcGxlOiBpZiB5b3Ugd2FudGVkIHRvIGhhdmUgdGhlIHNlcnZlciBkaXNwbGF5IGEgc3RhdHVzCi1yZXBvcnQgd2hlbmV2ZXIgYSBVUkwgb2YgPENPREU+aHR0cDovL3NlcnZlcm5hbWUvc3RhdHVzPC9DT0RFPiB3YXMKLWNhbGxlZCwgeW91IG1pZ2h0IHB1dCB0aGUgZm9sbG93aW5nIGludG8gYWNjZXNzLmNvbmY6Ci08UFJFPgotICAgICZsdDtMb2NhdGlvbiAvc3RhdHVzJmd0OwotICAgIFNldEhhbmRsZXIgc2VydmVyLXN0YXR1cwotICAgICZsdDsvTG9jYXRpb24mZ3Q7Ci08L1BSRT4KLTxIUj4KLQotPEgyPjxBIE5BTUU9InR5cGVzY29uZmlnIj5UeXBlc0NvbmZpZzwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IFR5cGVzQ29uZmlnfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBUeXBlc0NvbmZpZyA8RU0+ZmlsZW5hbWU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5UeXBlc0NvbmZpZyBjb25mL01JTUUudHlwZXM8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9taW1lPFA+Ci0KLVRoZSBUeXBlc0NvbmZpZyBkaXJlY3RpdmUgc2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIE1JTUUgdHlwZXMgY29uZmlndXJhdGlvbgotZmlsZS4gPEVNPkZpbGVuYW1lPC9FTT4gaXMgcmVsYXRpdmUgdG8gdGhlCi08QSBIUkVGPSJjb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvQT4uIFRoaXMgZmlsZSBzZXRzIHRoZSBkZWZhdWx0IGxpc3Qgb2YKLW1hcHBpbmdzIGZyb20gZmlsZW5hbWUgZXh0ZW5zaW9ucyB0byBjb250ZW50IHR5cGVzOyBjaGFuZ2luZyB0aGlzIGZpbGUgaXMgbm90Ci1yZWNvbW1lbmRlZC4gVXNlIHRoZSA8QSBIUkVGPSIjYWRkdHlwZSI+QWRkVHlwZTwvQT4gZGlyZWN0aXZlIGluc3RlYWQuIFRoZQotZmlsZSBjb250YWlucyBsaW5lcyBpbiB0aGUgZm9ybWF0IG9mIHRoZSBhcmd1bWVudHMgdG8gYW4gQWRkVHlwZSBjb21tYW5kOgotPEJMT0NLUVVPVEU+PEVNPk1JTUUtdHlwZSBleHRlbnNpb24gZXh0ZW5zaW9uIC4uLjwvRU0+PC9CTE9DS1FVT1RFPgotVGhlIGV4dGVuc2lvbnMgYXJlIGxvd2VyLWNhc2VkLiBCbGFuayBsaW5lcywgYW5kIGxpbmVzIGJlZ2lubmluZyB3aXRoIGEgaGFzaAotY2hhcmFjdGVyIChgIycpIGFyZSBpZ25vcmVkLjxQPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX21pbWVfbWFnaWMuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfbWltZV9tYWdpYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODVlNmI0Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfbWltZV9tYWdpYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotIDxIRUFEPgotICA8VElUTEU+QXBhY2hlIG1vZHVsZSBtb2RfbWltZV9tYWdpYzwvVElUTEU+Ci0gPC9IRUFEPgotIDwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLSA8Qk9EWQotICBCR0NPTE9SPSIjRkZGRkZGIgotICBURVhUPSIjMDAwMDAwIgotICBMSU5LPSIjMDAwMEZGIgotICBWTElOSz0iIzAwMDA4MCIKLSAgQUxJTks9IiNGRjAwMDAiCi0gPgotIDxESVYgQUxJR049IkNFTlRFUiI+Ci0gIDxJTUcgU1JDPSIuLi9pbWFnZXMvc3ViLmdpZiIgQUxUPSJbQVBBQ0hFIERPQ1VNRU5UQVRJT05dIj4KLSA8L0RJVj4KLQotIDxIMSBhbGlnbj0iQ0VOVEVSIj5Nb2R1bGUgbW9kX21pbWVfbWFnaWM8L0gxPgotCi0gIFRoaXMgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbiB0aGUgbW9kX21pbWVfbWFnaWMuYyBmaWxlLCBhbmQgaXMKLSAgYW4gb3B0aW9uYWwgZXh0ZW5zaW9uIHRvIHRoZSBBcGFjaGUgSFRUUEQgc2VydmVyLgotICBJdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIE1JTUUgdHlwZSBvZiBhIGZpbGUgYnkgbG9va2luZyBhdCBhCi0gIGZldyBieXRlcyBvZiBpdHMgY29udGVudHMsIHRoZSBzYW1lIHdheSB0aGUgVW5peCBmaWxlKDEpIGNvbW1hbmQgd29ya3MuCi0gIFRvIHVzZSBtb2RfbWltZV9tYWdpYyB5b3UgaGF2ZSB0byBlbmFibGUgdGhlIGZvbGxvd2luZyBsaW5lIGluIHRoZQotICBzZXJ2ZXIgYnVpbGQgPFRUPkNvbmZpZ3VyYXRpb248L1RUPiBmaWxlOiAKLQotICA8UFJFPgotICAgICAgQWRkTW9kdWxlIG1vZHVsZXMvc3RhbmRhcmQvbW9kX21pbWVfbWFnaWMubwotICA8L1BSRT4KLQotICBUaGlzIHNob3VsZCBiZSBsaXN0ZWQgPEVNPmJlZm9yZTwvRU0+IG1vZF9taW1lIGluIHRoZSBidWlsZAotICA8VFQ+Q29uZmlndXJhdGlvbjwvVFQ+IGZpbGUgc28gdGhhdCBpdCB3aWxsIGJlIHVzZWQgYWZ0ZXIgbW9kX21pbWUuCi0gIG1vZF9taW1lX21hZ2ljIGlzIGludGVuZGVkIGFzIGEgInNlY29uZCBsaW5lIG9mIGRlZmVuc2UiIGZvciBjYXNlcwotICBtb2RfbWltZSBjYW5ub3QgcmVzb2x2ZS4KLQotICA8SDI+U3VtbWFyeTwvSDI+Ci0KLSAgVGhpcyBtb2R1bGUgaXMgZGVyaXZlZCBmcm9tIGEgZnJlZSB2ZXJzaW9uIG9mIHRoZSA8Q09ERT5maWxlKDEpPC9DT0RFPgotICBjb21tYW5kIGZvciBVbml4LAotICB3aGljaCB1c2VzICJtYWdpYyBudW1iZXJzIiBhbmQgb3RoZXIgaGludHMgZnJvbSBhIGZpbGUncyBjb250ZW50cyB0bwotICBmaWd1cmUgb3V0IHdoYXQgdGhlIGNvbnRlbnRzIGFyZS4KLSAgSW4gdGhlIGNhc2Ugb2YgdGhpcyBtb2R1bGUsCi0gIGl0IHRyaWVzIHRvIGZpZ3VyZSBvdXQgdGhlIE1JTUUgdHlwZSBvZiB0aGUgZmlsZS4KLSAgPFA+Ci0gIFRoaXMgbW9kdWxlIGFjdGl2ZSBvbmx5IGlmIHRoZSBtYWdpYyBmaWxlIGlzIHNwZWNpZmllZCBieSB0aGUgCi0gIDxBIEhSRUY9IiNtaW1lbWFnaWNmaWxlIj48Q09ERT5NaW1lTWFnaWNGaWxlPC9DT0RFPjwvQT4gZGlyZWN0aXZlLgotICA8UD4KLSAgVGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGFyZSBwbGFpbiBBU0NJSSB0ZXh0IGluIDQtNSBjb2x1bW5zLgotICBCbGFuayBsaW5lcyBhcmUgYWxsb3dlZCBidXQgaWdub3JlZC4KLSAgQ29tbWVudGVkIGxpbmVzIHVzZSBhIGhhc2ggbWFyayAiIyIuCi0gIFRoZSByZW1haW5pbmcgbGluZXMgYXJlIHBhcnNlZCBmb3IgdGhlIGZvbGxvd2luZyBjb2x1bW5zOgotICA8dGFibGUgYm9yZGVyPTE+Ci0gIDx0ciB2YWxpZ249dG9wPgotICA8VEg+Q29sdW1uPC9USD4KLSAgPFRIPkRlc2NyaXB0aW9uPC9USD4KLSAgPC9UUj4KLSAgPHRyIHZhbGlnbj10b3A+Ci0gIDxURD4xPC9URD4KLSAgPFREPmJ5dGUgbnVtYmVyIHRvIGJlZ2luIGNoZWNraW5nIGZyb20KLSAgPEJSPgotICAiJmd0OyIgaW5kaWNhdGVzIGEgZGVwZW5kZW5jeSB1cG9uIHRoZSBwcmV2aW91cyBub24tIiZndDsiIGxpbmU8L1REPgotICA8L1RSPjx0ciB2YWxpZ249dG9wPgotICA8VEQ+MjwvVEQ+Ci0gIDxURD50eXBlIG9mIGRhdGEgdG8gbWF0Y2gKLSAgICA8dGFibGUgYm9yZGVyPTE+Ci0gICAgPFRSPjxURD5ieXRlPC9URD48VEQ+c2luZ2xlIGNoYXJhY3RlcjwvVEQ+PC9UUj4KLSAgICA8VFI+PFREPnNob3J0PC9URD48VEQ+bWFjaGluZS1vcmRlciAxNi1iaXQgaW50ZWdlcjwvVEQ+PC9UUj4KLSAgICA8VFI+PFREPmxvbmc8L1REPjxURD5tYWNoaW5lLW9yZGVyIDMyLWJpdCBpbnRlZ2VyPC9URD48L1RSPgotICAgIDxUUj48VEQ+c3RyaW5nPC9URD48VEQ+YXJiaXRyYXJ5LWxlbmd0aCBzdHJpbmc8L1REPjwvVFI+Ci0gICAgPFRSPjxURD5kYXRlPC9URD48VEQ+bG9uZyBpbnRlZ2VyIGRhdGUKLSAgICAgIChzZWNvbmRzIHNpbmNlIFVuaXggZXBvY2gvMTk3MCk8L1REPjwvVFI+Ci0gICAgPFRSPjxURD5iZXNob3J0PC9URD48VEQ+YmlnLWVuZGlhbiAxNi1iaXQgaW50ZWdlcjwvVEQ+PC9UUj4KLSAgICA8VFI+PFREPmJlbG9uZzwvVEQ+PFREPmJpZy1lbmRpYW4gMzItYml0IGludGVnZXI8L1REPjwvVFI+Ci0gICAgPFRSPjxURD5iZWRhdGU8L1REPjxURD5iaWctZW5kaWFuIDMyLWJpdCBpbnRlZ2VyIGRhdGU8L1REPjwvVFI+Ci0gICAgPFRSPjxURD5sZXNob3J0PC9URD48VEQ+bGl0dGxlLWVuZGlhbiAxNi1iaXQgaW50ZWdlcjwvVEQ+PC9UUj4KLSAgICA8VFI+PFREPmxlbG9uZzwvVEQ+PFREPmxpdHRsZS1lbmRpYW4gMzItYml0IGludGVnZXI8L1REPjwvVFI+Ci0gICAgPFRSPjxURD5sZWRhdGU8L1REPjxURD5saXR0bGUtZW5kaWFuIDMyLWJpdCBpbnRlZ2VyIGRhdGU8L1REPjwvVFI+Ci0gICAgPC9UQUJMRT4KLSAgPC9URD4KLSAgPC9UUj48dHIgdmFsaWduPXRvcD4KLSAgPFREPjM8L1REPgotICA8VEQ+Y29udGVudHMgb2YgZGF0YSB0byBtYXRjaDwvVEQ+Ci0gIDwvVFI+PHRyIHZhbGlnbj10b3A+Ci0gIDxURD40PC9URD4KLSAgPFREPk1JTUUgdHlwZSBpZiBtYXRjaGVkPC9URD4KLSAgPC9UUj48dHIgdmFsaWduPXRvcD4KLSAgPFREPjU8L1REPgotICA8VEQ+TUlNRSBlbmNvZGluZyBpZiBtYXRjaGVkIChvcHRpb25hbCk8L1REPgotICA8L1RSPgotICA8L1RBQkxFPgotCi0gIDxQPgotICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBtYWdpYyBmaWxlIGxpbmVzCi0gIHdvdWxkIHJlY29nbml6ZSBzb21lIGF1ZGlvIGZvcm1hdHMuCi0KLTxQUkU+Ci0jIFN1bi9OZVhUIGF1ZGlvIGRhdGEKLTAgICAgICAgc3RyaW5nICAgICAgICAgIC5zbmQKLSZndDsxMiAgICAgYmVsb25nICAgICAgICAgIDEgICAgICAgICAgICAgICBhdWRpby9iYXNpYwotJmd0OzEyICAgICBiZWxvbmcgICAgICAgICAgMiAgICAgICAgICAgICAgIGF1ZGlvL2Jhc2ljCi0mZ3Q7MTIgICAgIGJlbG9uZyAgICAgICAgICAzICAgICAgICAgICAgICAgYXVkaW8vYmFzaWMKLSZndDsxMiAgICAgYmVsb25nICAgICAgICAgIDQgICAgICAgICAgICAgICBhdWRpby9iYXNpYwotJmd0OzEyICAgICBiZWxvbmcgICAgICAgICAgNSAgICAgICAgICAgICAgIGF1ZGlvL2Jhc2ljCi0mZ3Q7MTIgICAgIGJlbG9uZyAgICAgICAgICA2ICAgICAgICAgICAgICAgYXVkaW8vYmFzaWMKLSZndDsxMiAgICAgYmVsb25nICAgICAgICAgIDcgICAgICAgICAgICAgICBhdWRpby9iYXNpYwotJmd0OzEyICAgICBiZWxvbmcgICAgICAgICAgMjMgICAgICAgICAgICAgIGF1ZGlvL3gtYWRwY20KLTwvUFJFPgotCi0gIE9yIHRoZXNlIHdvdWxkIHJlY29nbml6ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuICIqLmRvYyIgZmlsZXMgY29udGFpbmluZwotICBNaWNyb3NvZnQgV29yZCBvciBGcmFtZU1ha2VyIGRvY3VtZW50cy4gIChUaGVzZSBhcmUgaW5jb21wYXRpYmxlIGZpbGUKLSAgZm9ybWF0cyB3aGljaCB1c2UgdGhlIHNhbWUgZmlsZSBzdWZmaXguKQotCi08UFJFPgotIyBGcmFtZQotMCAgICAgICBzdHJpbmcgICAgICAgICAgXCZsdDtNYWtlckZpbGUgICAgIGFwcGxpY2F0aW9uL3gtZnJhbWUKLTAgICAgICAgc3RyaW5nICAgICAgICAgIFwmbHQ7TUlGRmlsZSAgICAgICBhcHBsaWNhdGlvbi94LWZyYW1lCi0wICAgICAgIHN0cmluZyAgICAgICAgICBcJmx0O01ha2VyRGljdGlvbmFyeSAgICAgICBhcHBsaWNhdGlvbi94LWZyYW1lCi0wICAgICAgIHN0cmluZyAgICAgICAgICBcJmx0O01ha2VyU2NyZWVuRm9uICAgICAgICBhcHBsaWNhdGlvbi94LWZyYW1lCi0wICAgICAgIHN0cmluZyAgICAgICAgICBcJmx0O01NTCAgICAgICAgICAgYXBwbGljYXRpb24veC1mcmFtZQotMCAgICAgICBzdHJpbmcgICAgICAgICAgXCZsdDtCb29rICAgICAgICAgIGFwcGxpY2F0aW9uL3gtZnJhbWUKLTAgICAgICAgc3RyaW5nICAgICAgICAgIFwmbHQ7TWFrZXIgICAgICAgICBhcHBsaWNhdGlvbi94LWZyYW1lCi0KLSMgTVMtV29yZAotMCAgICAgICBzdHJpbmcgICAgICAgICAgXDM3NlwwNjdcMFwwNDMgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbi9tc3dvcmQKLTAgICAgICAgc3RyaW5nICAgICAgICAgIFwzMjBcMzE3XDAyMVwzNDBcMjQxXDI2MSAgICAgICAgYXBwbGljYXRpb24vbXN3b3JkCi0wICAgICAgIHN0cmluZyAgICAgICAgICBcMzMzXDI0NS1cMFwwXDAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uL21zd29yZAotPC9QUkU+Ci0KLSAgQW4gb3B0aW9uYWwgTUlNRSBlbmNvZGluZyBjYW4gYmUgaW5jbHVkZWQgYXMgYSBmaWZ0aCBjb2x1bW4uCi0gIEZvciBleGFtcGxlLCB0aGlzIGNhbiByZWNvZ25pemUgZ3ppcHBlZCBmaWxlcyBhbmQgc2V0IHRoZSBlbmNvZGluZwotICBmb3IgdGhlbS4KLQotPFBSRT4KLSMgZ3ppcCAoR05VIHppcCwgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggW0luZm8tWklQL1BLV0FSRV0gemlwIGFyY2hpdmVyKQotMCAgICAgICBzdHJpbmcgICAgICAgICAgXDAzN1wyMTMgICAgICAgIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSAgICAgICAgeC1nemlwCi08L1BSRT4KLQotICA8SDM+UGVyZm9ybWFuY2UgSXNzdWVzPC9IMz4KLQotICBUaGlzIG1vZHVsZSBpcyBub3QgZm9yIGV2ZXJ5IHN5c3RlbS4gIElmIHlvdXIgc3lzdGVtIGlzIGJhcmVseSBrZWVwaW5nCi0gIHVwIHdpdGggaXRzIGxvYWQgb3IgaWYgeW91J3JlIHBlcmZvcm1pbmcgYSB3ZWIgc2VydmVyIGJlbmNobWFyaywKLSAgeW91IG1heSBub3Qgd2FudCB0byBlbmFibGUgdGhpcyBiZWNhdXNlIHRoZSBwcm9jZXNzaW5nIGlzIG5vdCBmcmVlLgotICA8UD4KLSAgSG93ZXZlciwgYW4gZWZmb3J0IHdhcyBtYWRlIHRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBvcmlnaW5hbAotICBmaWxlKDEpIGNvZGUgdG8gbWFrZSBpdCBmaXQgaW4gYSBidXN5IHdlYiBzZXJ2ZXIuCi0gIEl0IHdhcyBkZXNpZ25lZCBmb3IgYSBzZXJ2ZXIgd2hlcmUgdGhlcmUgYXJlIHRob3VzYW5kcyBvZiB1c2VycyB3aG8KLSAgcHVibGlzaCB0aGVpciBvd24gZG9jdW1lbnRzLgotICBUaGlzIGlzIHByb2JhYmx5IHZlcnkgY29tbW9uIG9uIGludHJhbmV0cy4KLSAgTWFueSB0aW1lcywgaXQncyBoZWxwZnVsCi0gIGlmIHRoZSBzZXJ2ZXIgY2FuIG1ha2UgbW9yZSBpbnRlbGxpZ2VudCBkZWNpc2lvbnMgYWJvdXQgYSBmaWxlJ3MKLSAgY29udGVudHMgdGhhbiB0aGUgZmlsZSBuYW1lIGFsbG93cwotICAuLi5ldmVuIGlmIGp1c3QgdG8gcmVkdWNlIHRoZSAid2h5IGRvZXNuJ3QgbXkgcGFnZSB3b3JrIiBjYWxscwotICB3aGVuIHVzZXJzIGltcHJvcGVybHkgbmFtZSB0aGVpciBvd24gZmlsZXMuCi0gIFlvdSBoYXZlIHRvIGRlY2lkZSBpZiB0aGUgZXh0cmEgd29yayBzdWl0cyB5b3VyIGVudmlyb25tZW50LgotICA8UD4KLSAgV2hlbiBjb21waWxpbmcgYW4gQXBhY2hlIHNlcnZlciwgdGhpcyBtb2R1bGUgc2hvdWxkIGJlIGF0IG9yIG5lYXIgdGhlCi0gIHRvcCBvZiB0aGUgbGlzdCBvZiBtb2R1bGVzIGluIHRoZSBDb25maWd1cmF0aW9uIGZpbGUuICBUaGUgbW9kdWxlcyBhcmUKLSAgbGlzdGVkIGluIGluY3JlYXNpbmcgcHJpb3JpdHkgc28gdGhhdCB3aWxsIG1lYW4gdGhpcyBvbmUgaXMgdXNlZCBvbmx5Ci0gIGFzIGEgbGFzdCByZXNvcnQsIGp1c3QgbGlrZSBpdCB3YXMgZGVzaWduZWQgdG8uCi0KLSAgPEgyPkRpcmVjdGl2ZXM8L0gyPgotICA8UD4KLSAgPFVMPgotICAgPExJPjxBIEhSRUY9IiNtaW1lbWFnaWNmaWxlIj5NaW1lTWFnaWNGaWxlPC9BPgotICAgPC9MST4KLSAgPC9VTD4KLSAgPC9QPgotICA8SFI+Ci0gIDxIMj48QSBOQU1FPSJtaW1lbWFnaWNmaWxlIj4KLSAgIE1pbWVNYWdpY0ZpbGUKLSAgPC9BPjwvSDI+Ci0gIDxQPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IE1pbWVNYWdpY0ZpbGUgPEVNPm1hZ2ljLWZpbGUtbmFtZTwvRU0+Ci0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IG5vbmUKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0Ci0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBFeHRlbnNpb24KLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9taW1lX21hZ2ljCi0gIDxQPgotCi0gIFRoZSA8Q09ERT5NaW1lTWFnaWNGaWxlPC9DT0RFPiBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIHRoaXMgbW9kdWxlLAotICB0aGUgZGVmYXVsdCBmaWxlIGlzIGRpc3RyaWJ1dGVkIGF0IDxDT0RFPmNvbmYvbWFnaWM8L0NPREU+LgotICBOb24tcm9vdGVkIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgU2VydmVyUm9vdC4gIFZpcnR1YWwgaG9zdHMKLSAgd2lsbCB1c2UgdGhlIHNhbWUgZmlsZSBhcyB0aGUgbWFpbiBzZXJ2ZXIgdW5sZXNzIGEgbW9yZSBzcGVjaWZpYyBzZXR0aW5nCi0gIGlzIHVzZWQsIGluIHdoaWNoIGNhc2UgdGhlIG1vcmUgc3BlY2lmaWMgc2V0dGluZyBvdmVycmlkZXMgdGhlIG1haW4gc2VydmVyJ3MKLSAgZmlsZS4KLSAgPFA+Ci0gIDxIUj4KLQotICA8SDI+PEEgTkFNRT0ibm90ZXMiPk5vdGVzPC9BPjwvSDI+Ci0KLSAgVGhlIGZvbGxvd2luZyBub3RlcyBhcHBseSB0byB0aGUgbW9kX21pbWVfbWFnaWMgbW9kdWxlIGFuZCBhcmUKLSAgaW5jbHVkZWQgaGVyZSBmb3IgY29tcGxpYW5jZSB3aXRoIGNvbnRyaWJ1dG9ycycgY29weXJpZ2h0IHJlc3RyaWN0aW9ucwotICB0aGF0IHJlcXVpcmUgdGhlaXIgYWNrbm93bGVkZ21lbnQuCi0KLTxQUkU+Ci0vKgotICogbW9kX21pbWVfbWFnaWM6IE1JTUUgdHlwZSBsb29rdXAgdmlhIGZpbGUgbWFnaWMgbnVtYmVycwotICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTcgQ2lzY28gU3lzdGVtcywgSW5jLgotICoKLSAqIFRoaXMgc29mdHdhcmUgd2FzIHN1Ym1pdHRlZCBieSBDaXNjbyBTeXN0ZW1zIHRvIHRoZSBBcGFjaGUgR3JvdXAgaW4gSnVseQotICogMTk5Ny4gIEZ1dHVyZSByZXZpc2lvbnMgYW5kIGRlcml2YXRpdmVzIG9mIHRoaXMgc291cmNlIGNvZGUgbXVzdAotICogYWNrbm93bGVkZ2UgQ2lzY28gU3lzdGVtcyBhcyB0aGUgb3JpZ2luYWwgY29udHJpYnV0b3Igb2YgdGhpcyBtb2R1bGUuCi0gKiBBbGwgb3RoZXIgbGljZW5zaW5nIGFuZCB1c2FnZSBjb25kaXRpb25zIGFyZSB0aG9zZSBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIFNvbWUgb2YgdGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgZnJlZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIGNvbW1hbmQKLSAqIG9yaWdpbmFsbHkgcG9zdGVkIHRvIGNvbXAuc291cmNlcy51bml4LiAgQ29weXJpZ2h0IGluZm8gZm9yIHRoYXQgcHJvZ3JhbQotICogaXMgaW5jbHVkZWQgYmVsb3cgYXMgcmVxdWlyZWQuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIC0gQ29weXJpZ2h0IChjKSBJYW4gRi4gRGFyd2luLCAxOTg3LiBXcml0dGVuIGJ5IElhbiBGLiBEYXJ3aW4uCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBub3Qgc3ViamVjdCB0byBhbnkgbGljZW5zZSBvZiB0aGUgQW1lcmljYW4gVGVsZXBob25lIGFuZAotICogVGVsZWdyYXBoIENvbXBhbnkgb3Igb2YgdGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSBvbiBhbnkKLSAqIGNvbXB1dGVyIHN5c3RlbSwgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQgZnJlZWx5LCBzdWJqZWN0IHRvCi0gKiB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLSAqCi0gKiAxLiBUaGUgYXV0aG9yIGlzIG5vdCByZXNwb25zaWJsZSBmb3IgdGhlIGNvbnNlcXVlbmNlcyBvZiB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUsIG5vIG1hdHRlciBob3cgYXdmdWwsIGV2ZW4gaWYgdGhleSBhcmlzZSBmcm9tIGZsYXdzIGluIGl0LgotICoKLSAqIDIuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZCwgZWl0aGVyIGJ5Ci0gKiBleHBsaWNpdCBjbGFpbSBvciBieSBvbWlzc2lvbi4gIFNpbmNlIGZldyB1c2VycyBldmVyIHJlYWQgc291cmNlcywgY3JlZGl0cwotICogbXVzdCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24uCi0gKgotICogMy4gQWx0ZXJlZCB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICogbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiAgU2luY2UgZmV3IHVzZXJzIGV2ZXIgcmVhZAotICogc291cmNlcywgY3JlZGl0cyBtdXN0IGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KLSAqCi0gKiA0LiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZC4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBGb3IgY29tcGxpYW5jZSB3aXRoIE1yIERhcndpbidzIHRlcm1zOiB0aGlzIGhhcyBiZWVuIHZlcnkgc2lnbmlmaWNhbnRseQotICogbW9kaWZpZWQgZnJvbSB0aGUgZnJlZSAiZmlsZSIgY29tbWFuZC4KLSAqIC0gYWxsLWluLW9uZSBmaWxlIGZvciBjb21waWxhdGlvbiBjb252ZW5pZW5jZSB3aGVuIG1vdmluZyBmcm9tIG9uZQotICogICB2ZXJzaW9uIG9mIEFwYWNoZSB0byB0aGUgbmV4dC4KLSAqIC0gTWVtb3J5IGFsbG9jYXRpb24gaXMgZG9uZSB0aHJvdWdoIHRoZSBBcGFjaGUgQVBJJ3MgcG9vbCBzdHJ1Y3R1cmUuCi0gKiAtIEFsbCBmdW5jdGlvbnMgaGF2ZSBoYWQgbmVjZXNzYXJ5IEFwYWNoZSBBUEkgcmVxdWVzdCBvciBzZXJ2ZXIKLSAqICAgc3RydWN0dXJlcyBwYXNzZWQgdG8gdGhlbSB3aGVyZSBuZWNlc3NhcnkgdG8gY2FsbCBvdGhlciBBcGFjaGUgQVBJCi0gKiAgIHJvdXRpbmVzLiAgKDxFTT5pLmUuPC9FTT4sIHVzdWFsbHkgZm9yIGxvZ2dpbmcsIGZpbGVzLCBvciBtZW1vcnkgYWxsb2NhdGlvbiBpbgotICogICBpdHNlbGYgb3IgYSBjYWxsZWQgZnVuY3Rpb24uKQotICogLSBzdHJ1Y3QgbWFnaWMgaGFzIGJlZW4gY29udmVydGVkIGZyb20gYW4gYXJyYXkgdG8gYSBzaW5nbGUtZW5kZWQgbGlua2VkCi0gKiAgIGxpc3QgYmVjYXVzZSBpdCBvbmx5IGdyb3dzIG9uZSByZWNvcmQgYXQgYSB0aW1lLCBpdCdzIG9ubHkgYWNjZXNzZWQKLSAqICAgc2VxdWVudGlhbGx5LCBhbmQgdGhlIEFwYWNoZSBBUEkgaGFzIG5vIGVxdWl2YWxlbnQgb2YgcmVhbGxvYygpLgotICogLSBGdW5jdGlvbnMgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gZ2V0IHRoZWlyIHBhcmFtZXRlcnMgZnJvbSB0aGUgc2VydmVyCi0gKiAgIGNvbmZpZ3VyYXRpb24gaW5zdGVhZCBvZiBnbG9iYWxzLiAgKEl0IHNob3VsZCBiZSByZWVudHJhbnQgbm93IGJ1dCBoYXMKLSAqICAgbm90IGJlZW4gdGVzdGVkIGluIGEgdGhyZWFkZWQgZW52aXJvbm1lbnQuKQotICogLSBQbGFjZXMgd2hlcmUgaXQgdXNlZCB0byBwcmludCByZXN1bHRzIHRvIHN0ZG91dCBub3cgc2F2ZXMgdGhlbSBpbiBhCi0gKiAgIGxpc3Qgd2hlcmUgdGhleSdyZSB1c2VkIHRvIHNldCB0aGUgTUlNRSB0eXBlIGluIHRoZSBBcGFjaGUgcmVxdWVzdAotICogICByZWNvcmQuCi0gKiAtIENvbW1hbmQtbGluZSBmbGFncyBoYXZlIGJlZW4gcmVtb3ZlZCBzaW5jZSB0aGV5IHdpbGwgbmV2ZXIgYmUgdXNlZCBoZXJlLgotICoKLSAqLwotPC9QUkU+Ci0KLSA8L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX21tYXBfc3RhdGljLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX21tYXBfc3RhdGljLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZWQ2YjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9tbWFwX3N0YXRpYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotIDxIRUFEPgotICA8VElUTEU+QXBhY2hlIG1vZHVsZSBtb2RfbW1hcF9zdGF0aWM8L1RJVExFPgotIDwvSEVBRD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLSA8Qk9EWQotICBCR0NPTE9SPSIjRkZGRkZGIgotICBURVhUPSIjMDAwMDAwIgotICBMSU5LPSIjMDAwMEZGIgotICBWTElOSz0iIzAwMDA4MCIKLSAgQUxJTks9IiNGRjAwMDAiCi0gPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLSAgPEgxIEFMSUdOPSJDRU5URVIiPk1vZHVsZSBtb2RfbW1hcF9zdGF0aWM8L0gxPgotCi0gIDxQPgotICBUaGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4gdGhlIDxDT0RFPm1vZF9tbWFwX3N0YXRpYy5jPC9DT0RFPiBmaWxlLCB3aXRoCi0gIEFwYWNoZSAxLjMgYW5kIGxhdGVyLiBJdCBwcm92aWRlcyBtbWFwKClpbmcgb2YgYSBzdGF0aWNhbGx5IGNvbmZpZ3VyZWQgbGlzdAotICBvZiBmcmVxdWVudGx5IHJlcXVlc3RlZCBidXQgbm90IGNoYW5nZWQgZmlsZXMuICBJdCBpcyBub3QgY29tcGlsZWQgaW50byB0aGUKLSAgc2VydmVyIGJ5IGRlZmF1bHQuIFRvIHVzZSA8Q09ERT5tb2RfbW1hcF9zdGF0aWM8L0NPREU+IHlvdSBoYXZlIHRvIGVuYWJsZQotICB0aGUgZm9sbG93aW5nIGxpbmUgaW4gdGhlIHNlcnZlciBidWlsZCA8Q09ERT5Db25maWd1cmF0aW9uPC9DT0RFPiBmaWxlOgotICA8UFJFPgotICAgIEFkZE1vZHVsZSAgbW9kdWxlcy9leHBlcmltZW50YWwvbW9kX21tYXBfc3RhdGljLm8KLSAgPC9QUkU+Ci0gIDwvUD4KLQotICA8SDI+U3VtbWFyeTwvSDI+Ci0gIDxQPgotICBUaGlzIGlzIGFuIDxTVFJPTkc+ZXhwZXJpbWVudGFsPC9TVFJPTkc+IG1vZHVsZSBhbmQgc2hvdWxkIGJlIHVzZWQgd2l0aAotICBjYXJlLiAgWW91IGNhbiBlYXNpbHkgY3JlYXRlIGEgYnJva2VuIHNpdGUgdXNpbmcgdGhpcyBtb2R1bGUsIHJlYWQgdGhpcwotICBkb2N1bWVudCBjYXJlZnVsbHkuCi0gIDxDT0RFPm1vZF9tbWFwX3N0YXRpYzwvQ09ERT4gbWFwcyBhIGxpc3Qgb2Ygc3RhdGljYWxseSBjb25maWd1cmVkIGZpbGVzICh2aWEKLSAgPENPREU+TU1hcEZpbGU8L0NPREU+IGRpcmVjdGl2ZXMgaW4gdGhlIG1haW4gc2VydmVyIGNvbmZpZ3VyYXRpb24pIGludG8KLSAgbWVtb3J5IHRocm91Z2ggdGhlIHN5c3RlbSBjYWxsIDxDT0RFPm1tYXAoKTwvQ09ERT4uICBUaGlzIHN5c3RlbQotICBjYWxsIGlzIGF2YWlsYWJsZSBvbiBtb3N0IG1vZGVybiBVbml4IGRlcml2YXRlcywgYnV0IG5vdCBvbiBhbGwuICBUaGVyZQotICBhcmUgc29tZXRpbWVzIHN5c3RlbS1zcGVjaWZpYyBsaW1pdHMgb24gdGhlIHNpemUgYW5kIG51bWJlciBvZiBmaWxlcyB0aGF0Ci0gIGNhbiBiZSBtbWFwKClkLCBleHBlcmltZW50YXRpb24gaXMgcHJvYmFibHkgdGhlIGVhc2llc3Qgd2F5IHRvIGZpbmQgb3V0LgotICA8L1A+Ci0gIDxQPgotICBUaGlzIG1tYXAoKWluZyBpcyBkb25lIG9uY2UgYXQgc2VydmVyIHN0YXJ0IG9yIHJlc3RhcnQsIG9ubHkuIFNvIHdoZW5ldmVyCi0gIG9uZSBvZiB0aGUgbWFwcGVkIGZpbGVzIGNoYW5nZXMgb24gdGhlIGZpbGVzeXN0ZW0geW91IDxFTT5oYXZlPC9FTT4gdG8KLSAgcmVzdGFydCB0aGUgc2VydmVyIGJ5IGF0IGxlYXN0IHNlbmRpbmcgaXQgYSBIVVAgb3IgVVNSMSBzaWduYWwgKHNlZSB0aGUKLSAgPEEgSFJFRj0iLi4vc3RvcHBpbmcuaHRtbCI+U3RvcHBpbmcgYW5kIFJlc3RhcnRpbmc8L0E+IGRvY3VtZW50YXRpb24pLiAgVG8KLSAgcmVpdGVyYXRlIHRoYXQgcG9pbnQ6ICBpZiB0aGUgZmlsZXMgYXJlIG1vZGlmaWVkIDxFTT5pbiBwbGFjZTwvRU0+IHdpdGhvdXQKLSAgcmVzdGFydGluZyB0aGUgc2VydmVyIHlvdSBtYXkgZW5kIHVwIHNlcnZpbmcgcmVxdWVzdHMgdGhhdCBhcmUgY29tcGxldGVseQotICBib2d1cy4gIFlvdSBzaG91bGQgdXBkYXRlIGZpbGVzIGJ5IHVubGlua2luZyB0aGUgb2xkIGNvcHkgYW5kIHB1dHRpbmcgYSBuZXcKLSAgY29weSBpbiBwbGFjZS4gTW9zdCB0b29scyBzdWNoIGFzIDxDT0RFPnJkaXN0PC9DT0RFPiBhbmQgPENPREU+bXY8L0NPREU+IGRvCi0gIHRoaXMuIFRoZSByZWFzb24gd2h5IHRoaXMgbW9kdWxlcyBkb2Vzbid0IHRha2UgY2FyZSBvZiBjaGFuZ2VzIHRvIHRoZSBmaWxlcwotICBpcyB0aGF0IHRoaXMgY2hlY2sgd291bGQgbmVlZCBhbiBleHRyYSA8Q09ERT5zdGF0KCk8L0NPREU+IGV2ZXJ5IHRpbWUgd2hpY2gKLSAgaXMgYSB3YXN0ZSBhbmQgYWdhaW5zdCB0aGUgaW50ZW50IG9mIEkvTyByZWR1Y3Rpb24uCi0gIDwvUD4KLQotICA8SDI+RGlyZWN0aXZlczwvSDI+Ci0gIDxVTD4KLSAgIDxMST48QSBIUkVGPSIjbW1hcGZpbGUiPk1NYXBGaWxlPC9BPgotICAgPC9MST4KLSAgPC9VTD4KLQotICA8SFI+Ci0KLSAgPEgyPjxBIE5BTUU9Im1tYXBmaWxlIj5NTWFwRmlsZTwvQT48L0gyPgotICA8UD4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBNTWFwRmlsZSA8RU0+ZmlsZW5hbWUgLi4uPC9FTT4KLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPEVNPk5vbmU8L0VNPgotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXItY29uZmlnCi0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gPEVNPk5vdCBhcHBsaWNhYmxlPC9FTT4KLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEV4cGVyaW1lbnRhbAotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX21tYXBfc3RhdGljCi0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IE9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZSAxLjMgb3IgbGF0ZXIKLQotICA8UD4KLSAgVGhlIDxDT0RFPk1NYXBGaWxlPC9DT0RFPiBkaXJlY3RpdmUgbWFwcyBvbmUgb3IgbW9yZSBmaWxlcyAoZ2l2ZW4gYXMKLSAgd2hpdGVzcGFjZSBzZXBhcmF0ZWQgYXJndW1lbnRzKSBpbnRvIG1lbW9yeSBhdCBzZXJ2ZXIgc3RhcnR1cCB0aW1lLiAgVGhleQotICBhcmUgYXV0b21hdGljYWxseSB1bm1hcHBlZCBvbiBhIHNlcnZlciBzaHV0ZG93bi4gV2hlbiB0aGUgZmlsZXMgaGF2ZSBjaGFuZ2VkCi0gIG9uIHRoZSBmaWxlc3lzdGVtIGF0IGxlYXN0IGEgSFVQIG9yIFVTUjEgc2lnbmFsIHNob3VsZCBiZSBzZW5kIHRvIHRoZSBzZXJ2ZXIKLSAgdG8gcmUtbW1hcCB0aGVtLgotICA8L1A+Ci0KLSAgPFA+Ci0gIEJlIGNhcmVmdWwgd2l0aCB0aGUgPEVNPmZpbGVuYW1lPC9FTT4gYXJndW1lbnRzOiBUaGV5IGhhdmUgdG8gbGl0ZXJhbGx5Ci0gIG1hdGNoIHRoZSBmaWxlc3lzdGVtIHBhdGggQXBhY2hlJ3MgVVJMLXRvLWZpbGVuYW1lIHRyYW5zbGF0aW9uIGhhbmRsZXJzCi0gIGNyZWF0ZS4gV2UgY2Fubm90IGNvbXBhcmUgaW5vZGVzIG9yIG90aGVyIHN0dWZmIHRvIG1hdGNoIHBhdGhzIHRocm91Z2gKLSAgc3ltYm9saWMgbGlua3MgPEVNPmV0Yy48L0VNPiBiZWNhdXNlIHRoYXQgYWdhaW4gd291bGQgY29zdCBleHRyYSA8Q09ERT5zdGF0KCk8L0NPREU+Ci0gIHN5c3RlbSBjYWxscyB3aGljaCBpcyBub3QgYWNjZXB0YWJsZS4gIFRoaXMgbW9kdWxlIG1heSBvciBtYXkgbm90IHdvcmsKLSAgd2l0aCBmaWxlbmFtZXMgcmV3cml0dGVuIGJ5IDxDT0RFPm1vZF9hbGlhczwvQ09ERT4gb3IKLSAgPENPREU+bW9kX3Jld3JpdGU8L0NPREU+Li4uIGl0IGlzIGFuIGV4cGVyaW1lbnQgYWZ0ZXIgYWxsLgotICA8L1A+Ci0KLSAgPFA+Ci0gIE5vdGljZTogWW91IGNhbm5vdCB1c2UgdGhpcyBmb3Igc3BlZWRpbmcgdXAgQ0dJIHByb2dyYW1zIG9yIG90aGVyIGZpbGVzCi0gIHdoaWNoIGFyZSBzZXJ2ZWQgYnkgc3BlY2lhbCBjb250ZW50IGhhbmRsZXJzLiBJdCBjYW4gb25seSBiZSB1c2VkIGZvcgotICByZWd1bGFyIGZpbGVzIHdoaWNoIGFyZSB1c3VhbGx5IHNlcnZlZCBieSB0aGUgQXBhY2hlIGNvcmUgY29udGVudCBoYW5kbGVyLgotICA8L1A+Ci0KLSAgRXhhbXBsZToKLQotICA8UFJFPgotICBNTWFwRmlsZSAvdXNyL2xvY2FsL2FwYWNoZS9odGRvY3MvaW5kZXguaHRtbAotICA8L1BSRT4KLQotICA8UD4KLSAgPFNUUk9ORz5Ob3RlPC9TVFJPTkc+OiBkb24ndCBib3RoZXIgYXNraW5nIGZvciBhIGZvciBhIDxDT0RFPk1NYXBEaXI8L0NPREU+Ci0gIGRpcmVjdGl2ZSB3aGljaAotICByZWN1cnNpdmVseSBtYXBzIGFsbCB0aGUgZmlsZXMgaW4gYSBkaXJlY3RvcnkuICBVc2UgVW5peCB0aGUgd2F5IGl0IHdhcwotICBtZWFudCB0byBiZSB1c2VkLiAgRm9yIGV4YW1wbGUsIHNlZSB0aGUKLSAgPEEgSFJFRj0iY29yZS5odG1sI2luY2x1ZGUiPkluY2x1ZGU8L0E+IGRpcmVjdGl2ZSwgYW5kIGNvbnNpZGVyIHRoaXMgY29tbWFuZDoKLSAgPFBSRT4KLSAgZmluZCAvd3d3L2h0ZG9jcyAtdHlwZSBmIC1wcmludCBcCi0gIHwgc2VkIC1lICdzLy4qL21tYXBmaWxlICZhbXA7LycgJmd0OyAvd3d3L2NvbmYvbW1hcC5jb25mCi0gIDwvUFJFPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotIDwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfbmVnb3RpYXRpb24uaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2RfbmVnb3RpYXRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYyMjJhYy4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX25lZ290aWF0aW9uLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9uZWdvdGlhdGlvbjwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPk1vZHVsZSBtb2RfbmVnb3RpYXRpb248L0gxPgotCi1UaGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4gdGhlIDxDT0RFPm1vZF9uZWdvdGlhdGlvbi5jPC9DT0RFPiBmaWxlLAotYW5kIGlzIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuIEl0IHByb3ZpZGVzIGZvciA8QQotSFJFRj0iLi4vY29udGVudC1uZWdvdGlhdGlvbi5odG1sIj5jb250ZW50IG5lZ290aWF0aW9uPC9BPi4KLQotPEgyPlN1bW1hcnk8L0gyPgotQ29udGVudCBuZWdvdGlhdGlvbiwgb3IgbW9yZSBhY2N1cmF0ZWx5IGNvbnRlbnQgc2VsZWN0aW9uLCBpcyB0aGUKLXNlbGVjdGlvbiBvZiB0aGUgZG9jdW1lbnQgdGhhdCBiZXN0IG1hdGNoZXMgdGhlIGNsaWVudHMKLWNhcGFiaWxpdGllcywgZnJvbSBvbmUgb2Ygc2V2ZXJhbCBhdmFpbGFibGUgZG9jdW1lbnRzLgotVGhlcmUgYXJlIHR3byBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcy4KLTxVTD4KLTxMST4gQSB0eXBlIG1hcCAoYSBmaWxlIHdpdGggdGhlIGhhbmRsZXIgPENPREU+dHlwZS1tYXA8L0NPREU+KQotd2hpY2ggZXhwbGljaXRseSBsaXN0cyB0aGUgZmlsZXMgY29udGFpbmluZyB0aGUgdmFyaWFudHMuCi08TEk+IEEgTXVsdGlWaWV3cyBzZWFyY2ggKGVuYWJsZWQgYnkgdGhlIE11bHRpVmlld3MKLTxBIEhSRUY9ImNvcmUuaHRtbCNvcHRpb25zIj5PcHRpb248L0E+LCB3aGVyZSB0aGUgc2VydmVyIGRvZXMgYW4gaW1wbGljaXQKLWZpbGVuYW1lIHBhdHRlcm4gbWF0Y2gsIGFuZCBjaG9vc2UgZnJvbSBhbW9uZ3N0IHRoZSByZXN1bHRzLgotPC9VTD4KLQotPEgzPlR5cGUgbWFwczwvSDM+Ci1BIHR5cGUgbWFwIGhhcyB0aGUgc2FtZSBmb3JtYXQgYXMgUkZDODIyIG1haWwgaGVhZGVycy4gSXQgY29udGFpbnMgZG9jdW1lbnQKLWRlc2NyaXB0aW9ucyBzZXBhcmF0ZWQgYnkgYmxhbmsgbGluZXMsIHdpdGggbGluZXMgYmVnaW5uaW5nIHdpdGggYSBoYXNoCi1jaGFyYWN0ZXIgKCcjJykgdHJlYXRlZCBhcyBjb21tZW50cy4gQSBkb2N1bWVudCBkZXNjcmlwdGlvbiBjb25zaXN0cyBvZgotc2V2ZXJhbCBoZWFkZXIgcmVjb3JkczsgcmVjb3JkcyBtYXkgYmUgY29udGludWVkIG9uIG11bHRpcGxlIGxpbmVzIGlmIHRoZQotY29udGludWF0aW9uIGxpbmVzIHN0YXJ0IHdpdGggc3BhY2VzLiBUaGUgbGVhZGluZyBzcGFjZSB3aWxsIGJlIGRlbGV0ZWQKLWFuZCB0aGUgbGluZXMgY29uY2F0ZW5hdGVkLiBBIGhlYWRlciByZWNvcmQgY29uc2lzdHMgb2YgYSBrZXl3b3JkCi1uYW1lLCB3aGljaCBhbHdheXMgZW5kcyBpbiBhIGNvbG9uLCBmb2xsb3dlZCBieSBhIHZhbHVlLiBXaGl0ZXNwYWNlIGlzIGFsbG93ZWQKLWJldHdlZW4gdGhlIGhlYWRlciBuYW1lIGFuZCB2YWx1ZSwgYW5kIGJldHdlZW4gdGhlIHRva2VucyBvZiB2YWx1ZS4KLQotVGhlIGhlYWRlcnMgYWxsb3dlZCBhcmU6Ci0KLTxETD4KLTxEVD5Db250ZW50LUVuY29kaW5nOgotPEREPlRoZSBlbmNvZGluZyBvZiB0aGUgZmlsZS4gQXBhY2hlIG9ubHkgcmVjb2duaXplcyBlbmNvZGluZ3MgdGhhdCBhcmUKLWRlZmluZWQgYnkgYW4gPEEgSFJFRj0ibW9kX21pbWUuaHRtbCNhZGRlbmNvZGluZyI+QWRkRW5jb2Rpbmc8L0E+IGRpcmVjdGl2ZS4KLVRoaXMgbm9ybWFsbHkgaW5jbHVkZXMgdGhlIGVuY29kaW5ncyA8Q09ERT54LWNvbXByZXNzPC9DT0RFPiBmb3IgY29tcHJlc3MnZAotZmlsZXMsIGFuZCA8Q09ERT54LWd6aXA8L0NPREU+IGZvciBnemlwJ2QgZmlsZXMuICBUaGUgPENPREU+eC08L0NPREU+IHByZWZpeAotaXMgaWdub3JlZCBmb3IgZW5jb2RpbmcgY29tcGFyaXNvbnMuCi08RFQ+Q29udGVudC1MYW5ndWFnZToKLTxERD5UaGUgbGFuZ3VhZ2Ugb2YgdGhlIHZhcmlhbnQsIGFzIGFuIEludGVybmV0IHN0YW5kYXJkIGxhbmd1YWdlIHRhZwotKFJGQyAxNzY2KS4gIEFuIGV4YW1wbGUgaXMgPENPREU+ZW48L0NPREU+LCBtZWFuaW5nIEVuZ2xpc2guCi08RFQ+Q29udGVudC1MZW5ndGg6Ci08REQ+VGhlIGxlbmd0aCBvZiB0aGUgZmlsZSwgaW4gYnl0ZXMuIElmIHRoaXMgaGVhZGVyIGlzIG5vdCBwcmVzZW50LCB0aGVuCi10aGUgYWN0dWFsIGxlbmd0aCBvZiB0aGUgZmlsZSBpcyB1c2VkLgotPERUPkNvbnRlbnQtVHlwZToKLTxERD5UaGUgTUlNRSBtZWRpYSB0eXBlIG9mIHRoZSBkb2N1bWVudCwgd2l0aCBvcHRpb25hbCBwYXJhbWV0ZXJzLgotUGFyYW1ldGVycyBhcmUgc2VwYXJhdGVkIGZyb20gdGhlIG1lZGlhIHR5cGUgYW5kIGZyb20gb25lIGFub3RoZXIgYnkgYQotc2VtaS1jb2xvbiwgd2l0aCBhIHN5bnRheCBvZiA8Q09ERT5uYW1lPXZhbHVlPC9DT0RFPi4gQ29tbW9uIHBhcmFtZXRlcnMKLWluY2x1ZGU6Ci08REw+Ci08RFQ+bGV2ZWwKLTxERD5hbiBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIHZlcnNpb24gb2YgdGhlIG1lZGlhIHR5cGUuCi1Gb3IgPENPREU+dGV4dC9odG1sPC9DT0RFPiB0aGlzIGRlZmF1bHRzIHRvIDIsIG90aGVyd2lzZSAwLgotPERUPnFzCi08REQ+YSBmbG9hdGluZy1wb2ludCBudW1iZXIgd2l0aCBhIHZhbHVlIGluIHRoZSByYW5nZSAwLjAgdG8gMS4wLAotICAgIGluZGljYXRpbmcgdGhlIHJlbGF0aXZlICdxdWFsaXR5JyBvZiB0aGlzIHZhcmlhbnQKLSAgICBjb21wYXJlZCB0byB0aGUgb3RoZXIgYXZhaWxhYmxlIHZhcmlhbnRzLCBpbmRlcGVuZGVudCBvZiB0aGUgY2xpZW50J3MKLSAgICBjYXBhYmlsaXRpZXMuICBGb3IgZXhhbXBsZSwgYSBqcGVnIGZpbGUgaXMgdXN1YWxseSBvZiBoaWdoZXIgc291cmNlCi0gICAgcXVhbGl0eSB0aGFuIGFuIGFzY2lpIGZpbGUgaWYgaXQgaXMgYXR0ZW1wdGluZyB0byByZXByZXNlbnQgYQotICAgIHBob3RvZ3JhcGguICBIb3dldmVyLCBpZiB0aGUgcmVzb3VyY2UgYmVpbmcgcmVwcmVzZW50ZWQgaXMgYXNjaWkgYXJ0LAotICAgIHRoZW4gYW4gYXNjaWkgZmlsZSB3b3VsZCBoYXZlIGEgaGlnaGVyIHNvdXJjZSBxdWFsaXR5IHRoYW4gYSBqcGVnIGZpbGUuCi0gICAgQWxsIHFzIHZhbHVlcyBhcmUgdGhlcmVmb3JlIHNwZWNpZmljIHRvIGEgZ2l2ZW4gcmVzb3VyY2UuCi08L0RMPgotRXhhbXBsZToKLTxCTE9DS1FVT1RFPjxDT0RFPkNvbnRlbnQtVHlwZTogaW1hZ2UvanBlZzsgcXM9MC44PC9DT0RFPjwvQkxPQ0tRVU9URT4KLTxEVD5VUkk6Ci08REQ+VGhlIHBhdGggdG8gdGhlIGZpbGUgY29udGFpbmluZyB0aGlzIHZhcmlhbnQsIHJlbGF0aXZlIHRvIHRoZSBtYXAgZmlsZS4KLTwvREw+Ci0KLTxIMz5NdWx0aVZpZXdzPC9IMz4KLUEgTXVsdGlWaWV3cyBzZWFyY2ggaXMgZW5hYmxlZCBieSB0aGUgTXVsdGlWaWV3cwotPEEgSFJFRj0iY29yZS5odG1sI29wdGlvbnMiPk9wdGlvbjwvQT4uCi1JZiB0aGUgc2VydmVyIHJlY2VpdmVzIGEgcmVxdWVzdCBmb3IgPENPREU+L3NvbWUvZGlyL2ZvbzwvQ09ERT4gYW5kCi08Q09ERT4vc29tZS9kaXIvZm9vPC9DT0RFPiBkb2VzIDxFTT5ub3Q8L0VNPiBleGlzdCwgdGhlbiB0aGUgc2VydmVyIHJlYWRzIHRoZQotZGlyZWN0b3J5IGxvb2tpbmcgZm9yIGFsbCBmaWxlcyBuYW1lZCA8Q09ERT5mb28uKjwvQ09ERT4sIGFuZCBlZmZlY3RpdmVseQotZmFrZXMgdXAgYSB0eXBlIG1hcCB3aGljaCBuYW1lcyBhbGwgdGhvc2UgZmlsZXMsIGFzc2lnbmluZyB0aGVtIHRoZSBzYW1lIG1lZGlhCi10eXBlcyBhbmQgY29udGVudC1lbmNvZGluZ3MgaXQgd291bGQgaGF2ZSBpZiB0aGUgY2xpZW50IGhhZCBhc2tlZCBmb3IKLW9uZSBvZiB0aGVtIGJ5IG5hbWUuICBJdCB0aGVuIGNob29zZXMgdGhlIGJlc3QgbWF0Y2ggdG8gdGhlIGNsaWVudCdzCi1yZXF1aXJlbWVudHMsIGFuZCByZXR1cm5zIHRoYXQgZG9jdW1lbnQuPFA+Ci0KLQotCi08SDI+RGlyZWN0aXZlczwvSDI+Ci08VUw+Ci08TEk+PEEgSFJFRj0iI2NhY2hlbmVnb3RpYXRlZGRvY3MiPkNhY2hlTmVnb3RpYXRlZERvY3M8L0E+Ci08TEk+PEEgSFJFRj0iI2xhbmd1YWdlcHJpb3JpdHkiPkxhbmd1YWdlUHJpb3JpdHk8L0E+Ci08L1VMPgotCi08U1RST05HPlNlZSBhbHNvPC9TVFJPTkc+OgotPEEgSFJFRj0iLi9tb2RfbWltZS5odG1sI2RlZmF1bHRsYW5ndWFnZSI+RGVmYXVsdExhbmd1YWdlPC9BPiwKLTxBIEhSRUY9Ii4vbW9kX21pbWUuaHRtbCNhZGRlbmNvZGluZyI+QWRkRW5jb2Rpbmc8L0E+LAotPEEgSFJFRj0iLi9tb2RfbWltZS5odG1sI2FkZGxhbmd1YWdlIj5BZGRMYW5ndWFnZTwvQT4sCi08QSBIUkVGPSIuL21vZF9taW1lLmh0bWwjYWRkdHlwZSI+QWRkVHlwZTwvQT4sIGFuZAotPEEgSFJFRj0iY29yZS5odG1sI29wdGlvbnMiPk9wdGlvbjwvQT4uCi0KLTxIUj4KLQotCi08SDI+PEEgTkFNRT0iY2FjaGVuZWdvdGlhdGVkZG9jcyI+Q2FjaGVOZWdvdGlhdGVkRG9jczwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBDYWNoZU5lZ290aWF0ZWREb2NzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9uZWdvdGlhdGlvbjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBDYWNoZU5lZ290aWF0ZWREb2NzIGlzIG9ubHkgYXZhaWxhYmxlCi1pbiBBcGFjaGUgMS4xIGFuZCBsYXRlci48UD4KLQotPFA+SWYgc2V0LCB0aGlzIGRpcmVjdGl2ZSBhbGxvd3MgY29udGVudC1uZWdvdGlhdGVkIGRvY3VtZW50cyB0byBiZQotY2FjaGVkIGJ5IHByb3h5IHNlcnZlcnMuIFRoaXMgY291bGQgbWVhbiB0aGF0IGNsaWVudHMgYmVoaW5kIHRob3NlCi1wcm94eXMgY291bGQgcmV0cmlldmUgdmVyc2lvbnMgb2YgdGhlIGRvY3VtZW50cyB0aGF0IGFyZSBub3QgdGhlIGJlc3QKLW1hdGNoIGZvciB0aGVpciBhYmlsaXRpZXMsIGJ1dCBpdCB3aWxsIG1ha2UgY2FjaGluZyBtb3JlCi1lZmZpY2llbnQuCi08UD4KLQotVGhpcyBkaXJlY3RpdmUgb25seSBhcHBsaWVzIHRvIHJlcXVlc3RzIHdoaWNoIGNvbWUgZnJvbSBIVFRQLzEuMCBicm93c2Vycy4KLUhUVFAvMS4xIHByb3ZpZGVzIG11Y2ggYmV0dGVyIGNvbnRyb2wgb3ZlciB0aGUgY2FjaGluZyBvZiBuZWdvdGlhdGVkCi1kb2N1bWVudHMsIGFuZCB0aGlzIGRpcmVjdGl2ZSBoYXMgbm8gZWZmZWN0IGluIHJlc3BvbnNlcyB0bwotSFRUUC8xLjEgcmVxdWVzdHMuCi0KLQotCi08SDI+PEEgTkFNRT0ibGFuZ3VhZ2Vwcmlvcml0eSI+TGFuZ3VhZ2VQcmlvcml0eTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IExhbmd1YWdlUHJpb3JpdHl9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IExhbmd1YWdlUHJpb3JpdHkgPEVNPk1JTUUtbGFuZyBNSU1FLWxhbmcuLi48L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gRmlsZUluZm88QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9uZWdvdGlhdGlvbjxQPgotCi1UaGUgTGFuZ3VhZ2VQcmlvcml0eSBzZXRzIHRoZSBwcmVjZWRlbmNlIG9mIGxhbmd1YWdlIHZhcmlhbnRzIGZvciB0aGUgY2FzZQotd2hlcmUgdGhlIGNsaWVudCBkb2VzIG5vdCBleHByZXNzIGEgcHJlZmVyZW5jZSwgd2hlbiBoYW5kbGluZyBhCi1NdWx0aVZpZXdzIHJlcXVlc3QuIFRoZSBsaXN0IG9mIDxFTT5NSU1FLWxhbmc8L0VNPiBhcmUgaW4gb3JkZXIgb2YgZGVjcmVhc2luZwotcHJlZmVyZW5jZS4gRXhhbXBsZToKLQotPEJMT0NLUVVPVEU+PENPREU+TGFuZ3VhZ2VQcmlvcml0eSBlbiBmciBkZTwvQ09ERT48L0JMT0NLUVVPVEU+Ci0KLUZvciBhIHJlcXVlc3QgZm9yIDxDT0RFPmZvby5odG1sPC9DT0RFPiwgd2hlcmUgPENPREU+Zm9vLmh0bWwuZnI8L0NPREU+Ci1hbmQgPENPREU+Zm9vLmh0bWwuZGU8L0NPREU+IGJvdGggZXhpc3RlZCwgYnV0IHRoZSBicm93c2VyIGRpZCBub3QgZXhwcmVzcwotYSBsYW5ndWFnZSBwcmVmZXJlbmNlLCB0aGVuIDxDT0RFPmZvby5odG1sLmZyPC9DT0RFPiB3b3VsZCBiZSByZXR1cm5lZC48UD4KLQotPFA+Ci0KLU5vdGUgdGhhdCB0aGlzIGRpcmVjdGl2ZSBvbmx5IGhhcyBhbiBlZmZlY3QgaWYgYSAnYmVzdCcgbGFuZ3VhZ2UKLWNhbm5vdCBiZSBkZXRlcm1pbmVkIGJ5IGFueSBvdGhlciBtZWFucy4gQ29ycmVjdGx5IGltcGxlbWVudGVkCi1IVFRQLzEuMSByZXF1ZXN0cyB3aWxsIG1lYW4gdGhpcyBkaXJlY3RpdmUgaGFzIG5vIGVmZmVjdC4KLQotPFA+Ci0KLTxTVFJPTkc+U2VlIGFsc288L1NUUk9ORz46Ci08QSBIUkVGPSIuL21vZF9taW1lLmh0bWwjZGVmYXVsdGxhbmd1YWdlIj5EZWZhdWx0TGFuZ3VhZ2U8L0E+IGFuZAotPEEgSFJFRj0iLi9tb2RfbWltZS5odG1sI2FkZGxhbmd1YWdlIj5BZGRMYW5ndWFnZTwvQT4KLQotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX3Byb3h5Lmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX3Byb3h5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOWRiNGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9wcm94eS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE2MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSBtb2R1bGUgbW9kX3Byb3h5PC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+QXBhY2hlIG1vZHVsZSBtb2RfcHJveHk8L0gxPgotCi1UaGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4gdGhlIDxDT0RFPm1vZF9wcm94eS5jPC9DT0RFPiBmaWxlIGZvciBBcGFjaGUgMS4xLngsCi1vciB0aGUgPENPREU+bW9kdWxlcy9wcm94eTwvQ09ERT4gc3ViZGlyZWN0b3J5IGZvciBBcGFjaGUgMS4yLCBhbmQKLWlzIG5vdCBjb21waWxlZCBpbiBieSBkZWZhdWx0LiBJdCBwcm92aWRlcyBmb3IgYW4gPFNUUk9ORz5IVFRQCi0xLjA8L1NUUk9ORz4gY2FjaGluZyBwcm94eSAKLXNlcnZlci4gSXQgaXMgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDEuMSBhbmQgbGF0ZXIuIENvbW1vbiBjb25maWd1cmF0aW9uCi1xdWVzdGlvbnMgYXJlIGFkZHJlc3NlZCA8QSBIUkVGPSIjY29uZmlncyI+YWZ0ZXIgdGhlIGRpcmVjdGl2ZQotZGVzY3JpcHRpb25zPC9BPi4KLQotPEgzPk5vdGU6PC9IMz4KLTxQPlRoaXMgbW9kdWxlIHdhcyBleHBlcmltZW50YWwgaW4gQXBhY2hlIDEuMS54LiBBcyBvZiBBcGFjaGUgMS4yLCBtb2RfcHJveHkKLXN0YWJpbGl0eSBpcyA8RU0+Z3JlYXRseTwvRU0+IGltcHJvdmVkLjxQPgotCi08SDI+U3VtbWFyeTwvSDI+Ci0KLVRoaXMgbW9kdWxlIGltcGxlbWVudHMgYSBwcm94eS9jYWNoZSBmb3IgQXBhY2hlLiBJdCBpbXBsZW1lbnRzCi1wcm94eWluZyBjYXBhYmlsaXR5IGZvcgotPENPREU+RlRQPC9DT0RFPiwKLTxDT0RFPkNPTk5FQ1Q8L0NPREU+IChmb3IgU1NMKSwKLTxDT0RFPkhUVFAvMC45PC9DT0RFPiwgYW5kCi08Q09ERT5IVFRQLzEuMDwvQ09ERT4uCi1UaGUgbW9kdWxlIGNhbiBiZSBjb25maWd1cmVkIHRvIGNvbm5lY3QgdG8gb3RoZXIgcHJveHkgbW9kdWxlcyBmb3IgdGhlc2UKLWFuZCBvdGhlciBwcm90b2NvbHMuCi0KLTxIMj5EaXJlY3RpdmVzPC9IMj4KLTxVTD4KLTxMST48QSBIUkVGPSIjcHJveHlyZXF1ZXN0cyI+UHJveHlSZXF1ZXN0czwvQT4KLTxMST48QSBIUkVGPSIjcHJveHlyZW1vdGUiPlByb3h5UmVtb3RlPC9BPgotPExJPjxBIEhSRUY9IiNwcm94eXBhc3MiPlByb3h5UGFzczwvQT4KLTxMST48QSBIUkVGPSIjcHJveHlwYXNzcmV2ZXJzZSI+UHJveHlQYXNzUmV2ZXJzZTwvQT4KLTxMST48QSBIUkVGPSIjcHJveHlibG9jayI+UHJveHlCbG9jazwvQT4KLTxMST48QSBIUkVGPSIjYWxsb3djb25uZWN0Ij5BbGxvd0NPTk5FQ1Q8L0E+Ci08TEk+PEEgSFJFRj0iI3Byb3h5cmVjZWl2ZWJ1ZmZlcnNpemUiPlByb3h5UmVjZWl2ZUJ1ZmZlclNpemU8L0E+Ci08TEk+PEEgSFJFRj0iI25vcHJveHkiPk5vUHJveHk8L0E+Ci08TEk+PEEgSFJFRj0iI3Byb3h5ZG9tYWluIj5Qcm94eURvbWFpbjwvQT4KLTxMST48QSBIUkVGPSIjcHJveHl2aWEiPlByb3h5VmlhPC9BPgotPExJPjxBIEhSRUY9IiNjYWNoZXJvb3QiPkNhY2hlUm9vdDwvQT4KLTxMST48QSBIUkVGPSIjY2FjaGVzaXplIj5DYWNoZVNpemU8L0E+Ci08TEk+PEEgSFJFRj0iI2NhY2hlbWF4ZXhwaXJlIj5DYWNoZU1heEV4cGlyZTwvQT4KLTxMST48QSBIUkVGPSIjY2FjaGVkZWZhdWx0ZXhwaXJlIj5DYWNoZURlZmF1bHRFeHBpcmU8L0E+Ci08TEk+PEEgSFJFRj0iI2NhY2hlbGFzdG1vZGlmaWVkZmFjdG9yIj5DYWNoZUxhc3RNb2RpZmllZEZhY3RvcjwvQT4KLTxMST48QSBIUkVGPSIjY2FjaGVnY2ludGVydmFsIj5DYWNoZUdjSW50ZXJ2YWw8L0E+Ci08TEk+PEEgSFJFRj0iI2NhY2hlZGlybGV2ZWxzIj5DYWNoZURpckxldmVsczwvQT4KLTxMST48QSBIUkVGPSIjY2FjaGVkaXJsZW5ndGgiPkNhY2hlRGlyTGVuZ3RoPC9BPgotPExJPjxBIEhSRUY9IiNjYWNoZWZvcmNlY29tcGxldGlvbiI+Q2FjaGVGb3JjZUNvbXBsZXRpb248L0E+Ci08TEk+PEEgSFJFRj0iI25vY2FjaGUiPk5vQ2FjaGU8L0E+Ci08L1VMPgotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJwcm94eXJlcXVlc3RzIj5Qcm94eVJlcXVlc3RzPC9BPjwvSDI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFByb3h5UmVxdWVzdHMgPEVNPm9uL29mZjwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPlByb3h5UmVxdWVzdHMgT2ZmPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiA8RU0+Tm90IGFwcGxpY2FibGU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX3Byb3h5PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IFByb3h5UmVxdWVzdHMgaXMgb25seSBhdmFpbGFibGUgaW4KLUFwYWNoZSAxLjEgYW5kIGxhdGVyLjxQPgotCi1UaGlzIGFsbG93cyBvciBwcmV2ZW50cyBBcGFjaGUgZnJvbSBmdW5jdGlvbmluZyBhcyBhIHByb3h5Ci1zZXJ2ZXIuIFNldHRpbmcgUHJveHlSZXF1ZXN0cyB0byAnb2ZmJyBkb2VzIG5vdCBkaXNhYmxlIHVzZSBvZiB0aGUgPEEKLUhSRUY9IiNwcm94eXBhc3MiPlByb3h5UGFzczwvQT4gZGlyZWN0aXZlLgotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJwcm94eXJlbW90ZSI+UHJveHlSZW1vdGU8L0E+PC9IMj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gUHJveHlSZW1vdGUgPEVNPiZsdDttYXRjaCZndDsgJmx0O3JlbW90ZS1zZXJ2ZXImZ3Q7PC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPEVNPk5vbmU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiA8RU0+Tm90IGFwcGxpY2FibGU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX3Byb3h5PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IFByb3h5UmVtb3RlIGlzIG9ubHkgYXZhaWxhYmxlIGluCi1BcGFjaGUgMS4xIGFuZCBsYXRlci48UD4KLQotVGhpcyBkZWZpbmVzIHJlbW90ZSBwcm94aWVzIHRvIHRoaXMgcHJveHkuICZsdDttYXRjaCZndDsgaXMgZWl0aGVyIHRoZQotbmFtZSBvZiBhIFVSTC1zY2hlbWUgdGhhdCB0aGUgcmVtb3RlIHNlcnZlciBzdXBwb3J0cywgb3IgYSBwYXJ0aWFsIFVSTAotZm9yIHdoaWNoIHRoZSByZW1vdGUgc2VydmVyIHNob3VsZCBiZSB1c2VkLCBvciAnKicgdG8gaW5kaWNhdGUgdGhlCi1zZXJ2ZXIgc2hvdWxkIGJlIGNvbnRhY3RlZCBmb3IgYWxsIHJlcXVlc3RzLiAmbHQ7cmVtb3RlLXNlcnZlciZndDsgaXMgYQotcGFydGlhbCBVUkwgZm9yIHRoZSByZW1vdGUgc2VydmVyLiBTeW50YXg6Ci0KLTxQUkU+Ci0gICZsdDtyZW1vdGUtc2VydmVyJmd0OyA9ICZsdDtwcm90b2NvbCZndDs6Ly8mbHQ7aG9zdG5hbWUmZ3Q7Wzpwb3J0XQotPC9QUkU+Ci0KLSZsdDtwcm90b2NvbCZndDsgaXMgdGhlIHByb3RvY29sIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUKLXdpdGggdGhlIHJlbW90ZSBzZXJ2ZXI7IG9ubHkgImh0dHAiIGlzIHN1cHBvcnRlZCBieSB0aGlzIG1vZHVsZS4KLTxQPgotRXhhbXBsZToKLTxQUkU+Ci0gIFByb3h5UmVtb3RlIGh0dHA6Ly9nb29kZ3V5cy5jb20vIGh0dHA6Ly9taXJyb3JndXlzLmNvbTo4MDAwCi0gIFByb3h5UmVtb3RlICogaHR0cDovL2NsZXZlcnNpdGUuY29tCi0gIFByb3h5UmVtb3RlIGZ0cCBodHRwOi8vZnRwcHJveHkubXlkb21haW4uY29tOjgwODAKLTwvUFJFPgotCi1JbiB0aGUgbGFzdCBleGFtcGxlLCB0aGUgcHJveHkgd2lsbCBmb3J3YXJkIEZUUCByZXF1ZXN0cywgZW5jYXBzdWxhdGVkCi1hcyB5ZXQgYW5vdGhlciBIVFRQIHByb3h5IHJlcXVlc3QsIHRvIGFub3RoZXIgcHJveHkgd2hpY2ggY2FuIGhhbmRsZQotdGhlbS4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0icHJveHlwYXNzIj5Qcm94eVBhc3M8L0E+PC9IMj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gUHJveHlQYXNzIDxFTT4mbHQ7cGF0aCZndDsgJmx0O3VybCZndDs8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8RU0+Tm9uZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IDxFTT5Ob3QgYXBwbGljYWJsZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfcHJveHk8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gUHJveHlQYXNzIGlzIG9ubHkgYXZhaWxhYmxlIGluCi1BcGFjaGUgMS4xIGFuZCBsYXRlci48UD4KLQotVGhpcyBkaXJlY3RpdmUgYWxsb3dzIHJlbW90ZSBzZXJ2ZXJzIHRvIGJlIG1hcHBlZCBpbnRvIHRoZSBzcGFjZSBvZiB0aGUgbG9jYWwKLXNlcnZlcjsgdGhlIGxvY2FsIHNlcnZlciBkb2VzIG5vdCBhY3QgYXMgYSBwcm94eSBpbiB0aGUgY29udmVudGlvbmFsIHNlbnNlLAotYnV0IGFwcGVhcnMgdG8gYmUgYSBtaXJyb3Igb2YgdGhlIHJlbW90ZSBzZXJ2ZXIuICZsdDtwYXRoJmd0OyBpcyB0aGUgbmFtZSBvZgotYSBsb2NhbCB2aXJ0dWFsIHBhdGg7ICZsdDt1cmwmZ3Q7IGlzIGEgcGFydGlhbCBVUkwgZm9yIHRoZSByZW1vdGUgc2VydmVyLgotPFA+Ci1TdXBwb3NlIHRoZSBsb2NhbCBzZXJ2ZXIgaGFzIGFkZHJlc3MgPFNBTVA+aHR0cDovL3dpYmJsZS5vcmcvPC9TQU1QPjsgdGhlbgotPFBSRT4KLSAgIFByb3h5UGFzcyAvbWlycm9yL2Zvby8gaHR0cDovL2Zvby5jb20vCi08L1BSRT4KLXdpbGwgY2F1c2UgYSBsb2NhbCByZXF1ZXN0IGZvciB0aGUKLSZsdDs8U0FNUD5odHRwOi8vd2liYmxlLm9yZy9taXJyb3IvZm9vL2JhcjwvU0FNUD4mZ3Q7IHRvIGJlCi1pbnRlcm5hbGx5IGNvbnZlcnRlZCBpbnRvIGEgcHJveHkgcmVxdWVzdCB0bwotJmx0OzxTQU1QPmh0dHA6Ly9mb28uY29tL2JhcjwvU0FNUD4mZ3Q7LgotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJwcm94eXBhc3NyZXZlcnNlIj5Qcm94eVBhc3NSZXZlcnNlPC9BPjwvSDI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFByb3h5UGFzc1JldmVyc2UgPEVNPiZsdDtwYXRoJmd0OyAmbHQ7dXJsJmd0OzwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxFTT5Ob25lPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gPEVNPk5vdCBhcHBsaWNhYmxlPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9wcm94eTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBQcm94eVBhc3NSZXZlcnNlIGlzIG9ubHkgYXZhaWxhYmxlIGluCi1BcGFjaGUgMS4zYjYgYW5kIGxhdGVyLjxQPgotCi1UaGlzIGRpcmVjdGl2ZSBsZXRzIEFwYWNoZSBhZGp1c3QgdGhlIFVSTCBpbiB0aGUgPFRUPkxvY2F0aW9uPC9UVD4gaGVhZGVyIG9uCi1IVFRQIHJlZGlyZWN0IHJlc3BvbnNlcy4gRm9yIGluc3RhbmNlIHRoaXMgaXMgZXNzZW50aWFsIHdoZW4gQXBhY2hlIGlzIHVzZWQgYXMKLWEgcmV2ZXJzZSBwcm94eSB0byBhdm9pZCBieS1wYXNzaW5nIHRoZSByZXZlcnNlIHByb3h5IGJlY2F1c2Ugb2YgSFRUUAotcmVkaXJlY3RzIG9uIHRoZSBiYWNrZW5kIHNlcnZlcnMgd2hpY2ggc3RheSBiZWhpbmQgdGhlIHJldmVyc2UgcHJveHkuCi08UD4KLSZsdDtwYXRoJmd0OyBpcyB0aGUgbmFtZSBvZiBhIGxvY2FsIHZpcnR1YWwgcGF0aC48QlI+Ci0mbHQ7dXJsJmd0OyBpcyBhIHBhcnRpYWwgVVJMIGZvciB0aGUgcmVtb3RlIHNlcnZlciAtIHRoZSBzYW1lIHdheSB0aGV5IGFyZQotdXNlZCBmb3IgdGhlIDxUVD5Qcm94eVBhc3M8L1RUPiBkaXJlY3RpdmUuCi08UD4KLUV4YW1wbGU6PEJSPgotU3VwcG9zZSB0aGUgbG9jYWwgc2VydmVyIGhhcyBhZGRyZXNzIDxTQU1QPmh0dHA6Ly93aWJibGUub3JnLzwvU0FNUD47IHRoZW4KLTxQUkU+Ci0gICBQcm94eVBhc3MgICAgICAgICAvbWlycm9yL2Zvby8gaHR0cDovL2Zvby5jb20vCi0gICBQcm94eVBhc3NSZXZlcnNlICAvbWlycm9yL2Zvby8gaHR0cDovL2Zvby5jb20vCi08L1BSRT4KLXdpbGwgbm90IG9ubHkgY2F1c2UgYSBsb2NhbCByZXF1ZXN0IGZvciB0aGUKLSZsdDs8U0FNUD5odHRwOi8vd2liYmxlLm9yZy9taXJyb3IvZm9vL2JhcjwvU0FNUD4mZ3Q7IHRvIGJlIGludGVybmFsbHkKLWNvbnZlcnRlZCBpbnRvIGEgcHJveHkgcmVxdWVzdCB0byAmbHQ7PFNBTVA+aHR0cDovL2Zvby5jb20vYmFyPC9TQU1QPiZndDsgKHRoZQotZnVuY3Rpb25hbGl0eSA8U0FNUD5Qcm94eVBhc3M8L1NBTVA+IHByb3ZpZGVzIGhlcmUpLiBJdCBhbHNvIHRha2VzIGNhcmUgb2YKLXJlZGlyZWN0cyB0aGUgc2VydmVyIGZvby5jb20gc2VuZHM6IHdoZW4gPFNBTVA+aHR0cDovL2Zvby5jb20vYmFyPC9TQU1QPiBpcwotcmVkaXJlY3RlZCBieSBoaW0gdG8gPFNBTVA+aHR0cDovL2Zvby5jb20vcXV1eDwvU0FNUD4gQXBhY2hlIGFkanVzdHMgdGhpcyB0bwotPFNBTVA+aHR0cDovL3dpYmJsZS5vcmcvbWlycm9yL2Zvby9xdXV4PC9TQU1QPiBiZWZvcmUgZm9yd2FyZGluZyB0aGUgSFRUUAotcmVkaXJlY3QgcmVzcG9uc2UgdG8gdGhlIGNsaWVudC4gCi08UD4KLU5vdGUgdGhhdCB0aGlzIDxTQU1QPlByb3h5UGFzc1JldmVyc2U8L1NBTVA+IGRpcmVjdGl2ZSBjYW4gYWxzbyBiZSB1c2VkIGluCi1jb25qdW5jdGlvbiB3aXRoIHRoZSBwcm94eSBwYXNzLXRocm91Z2ggZmVhdHVyZSAoIjxTQU1QPlJld3JpdGVSdWxlIC4uLgotW1BdPC9TQU1QPiIpIGZyb20KLTxBCi0gSFJFRj0ibW9kX3Jld3JpdGUuaHRtbCNSZXdyaXRlUnVsZSIKLT48VFQ+bW9kX3Jld3JpdGU8L1RUPjwvQT4gYmVjYXVzZSBpdHMgZG9lc24ndCBkZXBlbmQgb24gYSBjb3JyZXNwb25kaW5nCi08U0FNUD5Qcm94eVBhc3M8L1NBTVA+IGRpcmVjdGl2ZS4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0iYWxsb3djb25uZWN0Ij5BbGxvd0NPTk5FQ1Q8L0E+PC9IMj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQWxsb3dDT05ORUNUIDxFTT4mbHQ7cG9ydCBsaXN0Jmd0OzwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxFTT48U0FNUD5BbGxvd0NPTk5FQ1Q8L1NBTVA+IDQ0MyA1NjM8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiA8RU0+Tm90IGFwcGxpY2FibGU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX3Byb3h5PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IDxTQU1QPkFsbG93Q09OTkVDVDwvU0FNUD4gaXMgb25seQotYXZhaWxhYmxlIGluIEFwYWNoZSAxLjMuMiBhbmQgbGF0ZXIuPFA+Ci0KLVRoZSA8U0FNUD5BbGxvd0NPTk5FQ1Q8L1NBTVA+IGRpcmVjdGl2ZSBzcGVjaWZpZXMgYSBsaXN0IG9mIHBvcnQgbnVtYmVycwotdG8gd2hpY2ggdGhlIHByb3h5IDxTQU1QPkNPTk5FQ1Q8L1NBTVA+IG1ldGhvZCBtYXkgY29ubmVjdC4KLVRvZGF5J3MgYnJvd3NlcnMgdXNlIHRoaXMgbWV0aG9kIHdoZW4gYSA8RU0+aHR0cHM8L0VNPiBjb25uZWN0aW9uCi1pcyByZXF1ZXN0ZWQgYW5kIHByb3h5IHR1bm5lbGluZyBvdmVyIDxFTT5odHRwPC9FTT4gaXMgaW4gZWZmZWN0LjxCUj4KLUJ5IGRlZmF1bHQsIG9ubHkgdGhlIGRlZmF1bHQgaHR0cHMgcG9ydCAoNDQzKSBhbmQgdGhlIGRlZmF1bHQKLXNuZXdzIHBvcnQgKDU2MykgYXJlIGVuYWJsZWQuIFVzZSB0aGUgPFNBTVA+QWxsb3dDT05ORUNUPC9TQU1QPgotZGlyZWN0aXZlIHRvIG92ZXJycmlkZSB0aGlzIGRlZmF1bHQgYW5kIGFsbG93IGNvbm5lY3Rpb25zIHRvIHRoZQotbGlzdGVkIHBvcnRzIG9ubHkuCi0KLTxIUj4KLQotPEgyPjxBIE5BTUU9InByb3h5YmxvY2siPlByb3h5QmxvY2s8L0E+PC9IMj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gUHJveHlCbG9jayA8RU0+Jmx0O3dvcmQvaG9zdC9kb21haW4gbGlzdCZndDs8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8RU0+Tm9uZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IDxFTT5Ob3QgYXBwbGljYWJsZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfcHJveHk8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gUHJveHlCbG9jayBpcyBvbmx5IGF2YWlsYWJsZSBpbgotQXBhY2hlIDEuMiBhbmQgbGF0ZXIuPFA+Ci0KLVRoZSBQcm94eUJsb2NrIGRpcmVjdGl2ZSBzcGVjaWZpZXMgYSBsaXN0IG9mIHdvcmRzLCBob3N0cyBhbmQvb3IgZG9tYWlucywKLXNlcGFyYXRlZCBieSBzcGFjZXMuICBIVFRQLCBIVFRQUywgYW5kIEZUUCBkb2N1bWVudCByZXF1ZXN0cyB0byBzaXRlcyB3aG9zZQotbmFtZXMgY29udGFpbiBtYXRjaGVkIHdvcmRzLCBob3N0cyBvciBkb21haW5zIGFyZSA8RU0+YmxvY2tlZDwvRU0+IGJ5IHRoZQotcHJveHkgc2VydmVyLiBUaGUgcHJveHkgbW9kdWxlIHdpbGwgYWxzbyBhdHRlbXB0IHRvIGRldGVybWluZSBJUCBhZGRyZXNzZXMgb2YKLWxpc3QgaXRlbXMgd2hpY2ggbWF5IGJlIGhvc3RuYW1lcyBkdXJpbmcgc3RhcnR1cCwgYW5kIGNhY2hlIHRoZW0gZm9yIG1hdGNoCi10ZXN0IGFzIHdlbGwuIEV4YW1wbGU6Ci0KLTxQUkU+Ci0gIFByb3h5QmxvY2sgam9lcy1nYXJhZ2UuY29tIHNvbWUtaG9zdC5jby51ayByb2NreS53b3RzYW1hdHRhdS5lZHUKLTwvUFJFPgotCi0ncm9ja3kud290c2FtYXR0YXUuZWR1JyB3b3VsZCBhbHNvIGJlIG1hdGNoZWQgaWYgcmVmZXJlbmNlZCBieSBJUCBhZGRyZXNzLjxQPgotCi1Ob3RlIHRoYXQgJ3dvdHNhbWF0dGF1JyB3b3VsZCBhbHNvIGJlIHN1ZmZpY2llbnQgdG8gbWF0Y2ggJ3dvdHNhbWF0dGF1LmVkdScuPFA+Ci0KLU5vdGUgYWxzbyB0aGF0Ci0KLTxQUkU+Ci1Qcm94eUJsb2NrICoKLTwvUFJFPgotCi1ibG9ja3MgY29ubmVjdGlvbnMgdG8gYWxsIHNpdGVzLgotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJwcm94eXJlY2VpdmVidWZmZXJzaXplIj5Qcm94eVJlY2VpdmVCdWZmZXJTaXplPC9BPjwvSDI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFByb3h5UmVjZWl2ZUJ1ZmZlclNpemUgPEVNPiZsdDtieXRlcyZndDs8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8RU0+Tm9uZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IDxFTT5Ob3QgYXBwbGljYWJsZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfcHJveHk8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gUHJveHlSZWNlaXZlQnVmZmVyU2l6ZSBpcyBvbmx5IGF2YWlsYWJsZSBpbgotQXBhY2hlIDEuMyBhbmQgbGF0ZXIuPFA+Ci0KLVRoZSBQcm94eVJlY2VpdmVCdWZmZXJTaXplIGRpcmVjdGl2ZSBzcGVjaWZpZXMgYW4gZXhwbGljaXQgbmV0d29yayBidWZmZXIgc2l6ZQotZm9yIG91dGdvaW5nIEhUVFAgYW5kIEZUUCBjb25uZWN0aW9ucywgZm9yIGluY3JlYXNlZCB0aHJvdWdocHV0LiAgSXQgaGFzIHRvIGJlCi1ncmVhdGVyIHRoYW4gNTEyIG9yIHNldCB0byAwIHRvIGluZGljYXRlIHRoYXQgdGhlIHN5c3RlbSdzIGRlZmF1bHQgYnVmZmVyIHNpemUKLXNob3VsZCBiZSB1c2VkLiAKLQotPFA+Ci1FeGFtcGxlOgotCi08UFJFPgotICBQcm94eVJlY2VpdmVCdWZmZXJTaXplIDIwNDgKLTwvUFJFPgotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJub3Byb3h5Ij5Ob1Byb3h5PC9BPjwvSDI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IE5vUHJveHkgeyA8QSBIUkVGPSIjZG9tYWluIj48RU0+Jmx0O0RvbWFpbiZndDs8L0VNPjwvQT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgPEEgSFJFRj0iI3N1Ym5ldCI+PEVNPiZsdDtTdWJOZXQmZ3Q7PC9FTT48L0E+Ci0JCQkJIHwgPEEgSFJFRj0iI2lwYWRkciI+PEVNPiZsdDtJcEFkZHImZ3Q7PC9FTT48L0E+Ci0JCQkJIHwgPEEgSFJFRj0iI2hvc3RuYW1lIj48RU0+Jmx0O0hvc3RuYW1lJmd0OzwvRU0+PC9BPgotCQkJCSB9IDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8RU0+Tm9uZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IDxFTT5Ob3QgYXBwbGljYWJsZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfcHJveHk8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gTm9Qcm94eSBpcyBvbmx5IGF2YWlsYWJsZSBpbgotQXBhY2hlIDEuMyBhbmQgbGF0ZXIuPFA+Ci0KLVRoaXMgZGlyZWN0aXZlIGlzIG9ubHkgdXNlZnVsIGZvciBBcGFjaGUgcHJveHkgc2VydmVycyB3aXRoaW4gaW50cmFuZXRzLgotVGhlIE5vUHJveHkgZGlyZWN0aXZlIHNwZWNpZmllcyBhIGxpc3Qgb2Ygc3VibmV0cywgSVAgYWRkcmVzc2VzLCBob3N0cwotYW5kL29yIGRvbWFpbnMsIHNlcGFyYXRlZCBieSBzcGFjZXMuIEEgcmVxdWVzdCB0byBhIGhvc3Qgd2hpY2ggbWF0Y2hlcwotb25lIG9yIG1vcmUgb2YgdGhlc2UgaXMgYWx3YXlzIHNlcnZlZCBkaXJlY3RseSwgd2l0aG91dCBmb3J3YXJkaW5nIHRvCi10aGUgY29uZmlndXJlZCBQcm94eVJlbW90ZSBwcm94eSBzZXJ2ZXIocykuCi08UD4KLUV4YW1wbGU6Ci0KLTxQUkU+Ci0gIFByb3h5UmVtb3RlICAqICBodHRwOi8vZmlyZXdhbGwubXljb21wYW55LmNvbTo4MQotICBOb1Byb3h5ICAgICAgICAgLm15Y29tcGFueS5jb20gMTkyLjE2OC4xMTIuMC8yMSAKLTwvUFJFPgotVGhlIGFyZ3VtZW50cyB0byB0aGUgTm9Qcm94eSBkaXJlY3RpdmUgYXJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGUgbGlzdDoKLSAgIDxETD4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PSBEb21haW4gPT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPEEgTkFNRT0iZG9tYWluIj4KLSAgICA8RFQ+PEVNPkRvbWFpbjwvRU0+PC9BPgotICAgIDxERD5BIDxFTT5Eb21haW48L0VNPiBpcyBhIHBhcnRpYWxseSBxdWFsaWZpZWQgRE5TIGRvbWFpbiBuYW1lLCBwcmVjZWRlZAotICAgICAgICBieSBhIHBlcmlvZC4KLSAgICAgICAgSXQgcmVwcmVzZW50cyBhIGxpc3Qgb2YgaG9zdHMgd2hpY2ggbG9naWNhbGx5IGJlbG9uZyB0byB0aGUgc2FtZSBETlMKLSAgICAgICAgZG9tYWluIG9yIHpvbmUgKDxFTT5pLmUuPC9FTT4sIHRoZSBzdWZmaXhlcyBvZiB0aGUgaG9zdG5hbWVzIGFyZSBhbGwgZW5kaW5nIGluIAotICAgICAgICA8RU0+RG9tYWluPC9FTT4pLjxCUj4KLQkJRXhhbXBsZXM6IDxTQU1QPi5jb208L1NBTVA+ICAgPFNBTVA+LmFwYWNoZS5vcmcuPC9TQU1QPjxCUj4KLSAgICAgICAgVG8gZGlzdGluZ3Vpc2ggPEVNPkRvbWFpbjwvRU0+cyBmcm9tIDxBIEhSRUY9IiNob3N0bmFtZSI+PEVNPkhvc3RuYW1lPC9FTT48L0E+cyAoYm90aAotICAgICAgICBzeW50YWN0aWNhbGx5IGFuZCBzZW1hbnRpY2FsbHk7IGEgRE5TIGRvbWFpbiBjYW4gaGF2ZSBhIEROUyBBIHJlY29yZCwKLSAgICAgICAgdG9vISksIDxFTT5Eb21haW48L0VNPnMgYXJlIGFsd2F5cyB3cml0dGVuCi0gICAgICAgIHdpdGggYSBsZWFkaW5nIHBlcmlvZC48QlI+Ci0gICAgICAgIE5vdGU6IERvbWFpbiBuYW1lIGNvbXBhcmlzb25zIGFyZSBkb25lIHdpdGhvdXQgcmVnYXJkIHRvIHRoZSBjYXNlLAotICAgICAgICBhbmQgPEVNPkRvbWFpbjwvRU0+cyBhcmUgYWx3YXlzIGFzc3VtZWQgdG8gYmUgYW5jaG9yZWQgaW4gdGhlIHJvb3QgCi0gICAgICAgIG9mIHRoZSBETlMgdHJlZSwgdGhlcmVmb3JlIHR3byBkb21haW5zIDxTQU1QPi5NeURvbWFpbi5jb208L1NBTVA+IGFuZAotICAgICAgICA8U0FNUD4ubXlkb21haW4uY29tLjwvU0FNUD4gKG5vdGUgdGhlIHRyYWlsaW5nIHBlcmlvZCkgYXJlCi0gICAgICAgIGNvbnNpZGVyZWQgZXF1YWwuIFNpbmNlIGEgZG9tYWluIGNvbXBhcmlzb24gZG9lcyBub3QgaW52b2x2ZSBhIEROUwotCWxvb2t1cCwgaXQgaXMgbXVjaCBtb3JlIGVmZmljaWVudCB0aGFuIHN1Ym5ldCBjb21wYXJpc29uLgotCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT0gU3ViTmV0ID09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxBIE5BTUU9InN1Ym5ldCI+Ci0gICAgPERUPjxFTT5TdWJOZXQ8L0VNPjwvQT4KLSAgICA8REQ+QSA8RU0+U3ViTmV0PC9FTT4gaXMgYSBwYXJ0aWFsbHkgcXVhbGlmaWVkIGludGVybmV0IGFkZHJlc3MgaW4KLSAgICAgICAgbnVtZXJpYyAoZG90dGVkIHF1YWQpIGZvcm0sIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSBzbGFzaCBhbmQgdGhlCi0gICAgICAgIG5ldG1hc2ssIHNwZWNpZmllZCBhcyB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGJpdHMgaW4gdGhlCi0gICAgICAgIDxFTT5TdWJOZXQ8L0VNPi4gSXQgaXMgdXNlZCB0byByZXByZXNlbnQgYSBzdWJuZXQgb2YgaG9zdHMgd2hpY2ggY2FuCi0gICAgICAgIGJlIHJlYWNoZWQgb3ZlciBhIGNvbW1vbiBuZXR3b3JrIGludGVyZmFjZS4gSW4gdGhlIGFic2VuY2Ugb2YgdGhlCi0gICAgICAgIGV4cGxpY2l0IG5ldCBtYXNrIGl0IGlzIGFzc3VtZWQgdGhhdCBvbWl0dGVkIChvciB6ZXJvIHZhbHVlZCkKLSAgICAgICAgdHJhaWxpbmcgZGlnaXRzIHNwZWNpZnkgdGhlIG1hc2suIChJbiB0aGlzIGNhc2UsIHRoZSBuZXRtYXNrIGNhbgotICAgICAgICBvbmx5IGJlIG11bHRpcGxlcyBvZiA4IGJpdHMgd2lkZS4pPEJSPgotICAgICAgICBFeGFtcGxlczoKLSAgICAgICAgPERMPgotICAgICAgICAgPERUPjxTQU1QPjE5Mi4xNjg8L1NBTVA+IG9yIDxTQU1QPjE5Mi4xNjguMC4wPC9TQU1QPgotICAgICAgICAgPEREPnRoZSBzdWJuZXQgMTkyLjE2OC4wLjAgd2l0aCBhbiBpbXBsaWVkIG5ldG1hc2sgb2YgMTYgdmFsaWQgYml0cwotICAgICAgICAgICAgIChzb21ldGltZXMgdXNlZCBpbiB0aGUgbmV0bWFzayBmb3JtIDxTQU1QPjI1NS4yNTUuMC4wPC9TQU1QPikKLSAgICAgICAgIDxEVD48U0FNUD4xOTIuMTY4LjExMi4wLzIxPC9TQU1QPgotICAgICAgICAgPEREPnRoZSBzdWJuZXQgPFNBTVA+MTkyLjE2OC4xMTIuMC8yMTwvU0FNUD4gd2l0aCBhIG5ldG1hc2sgb2YgMjEKLSAgICAgICAgICAgICB2YWxpZCBiaXRzIChhbHNvIHVzZWQgaW4gdGhlIGZvcm0gMjU1LjI1NS4yNDguMCkKLSAgICAgICAgPC9ETD4KLQkJQXMgYSBkZWdlbmVyYXRlIGNhc2UsIGEgPEVNPlN1Yk5ldDwvRU0+IHdpdGggMzIgdmFsaWQgYml0cyBpcyB0aGUKLSAgICAgICAgZXF1aXZhbGVudCB0byBhbiA8RU0+SVBBZGRyPC9FTT4sIHdoaWxlIGEgPEVNPlN1Yk5ldDwvRU0+IHdpdGggemVybwotICAgICAgICB2YWxpZCBiaXRzICg8RU0+ZS5nLjwvRU0+LCAwLjAuMC4wLzApIGlzIHRoZSBzYW1lIGFzIHRoZSBjb25zdGFudAotICAgICAgICA8RU0+X0RlZmF1bHRfPC9FTT4sIG1hdGNoaW5nIGFueSBJUCBhZGRyZXNzLiAKLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IElQQWRkciA9PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8QSBOQU1FPSJpcGFkZHIiPgotICAgIDxEVD48RU0+SVBBZGRyPC9FTT48L0E+Ci0gICAgPEREPkEgPEVNPklQQWRkcjwvRU0+IHJlcHJlc2VudHMgYSBmdWxseSBxdWFsaWZpZWQgaW50ZXJuZXQgYWRkcmVzcyBpbgotICAgICAgICBudW1lcmljIChkb3R0ZWQgcXVhZCkgZm9ybS4gVXN1YWxseSwgdGhpcyBhZGRyZXNzIHJlcHJlc2VudHMgYQotICAgICAgICBob3N0LCBidXQgdGhlcmUgbmVlZCBub3QgbmVjZXNzYXJpbHkgYmUgYSBETlMgZG9tYWluIG5hbWUKLSAgICAgICAgY29ubmVjdGVkIHdpdGggdGhlIGFkZHJlc3MuPEJSPgotCQlFeGFtcGxlOiAxOTIuMTY4LjEyMy43PEJSPgotICAgICAgICBOb3RlOiBBbiA8RU0+SVBBZGRyPC9FTT4gZG9lcyBub3QgbmVlZCB0byBiZSByZXNvbHZlZCBieSB0aGUgRE5TCi0Jc3lzdGVtLCBzbyBpdCBjYW4gcmVzdWx0IGluIG1vcmUgZWZmZWN0aXZlIGFwYWNoZSBwZXJmb3JtYW5jZS4KLSAgICAgICAgPFA+PFNUUk9ORz5TZWUgQWxzbzo8L1NUUk9ORz4KLQk8QSBIUkVGPSIuLi9kbnMtY2F2ZWF0cy5odG1sIj5ETlMgSXNzdWVzPC9BPjwvUD4KLQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09IEhvc3RuYW1lID09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxBIE5BTUU9Imhvc3RuYW1lIj4KLSAgICA8RFQ+PEVNPkhvc3RuYW1lPC9FTT48L0E+Ci0gICAgPEREPkEgPEVNPkhvc3RuYW1lPC9FTT4gaXMgYSBmdWxseSBxdWFsaWZpZWQgRE5TIGRvbWFpbiBuYW1lIHdoaWNoIGNhbgotICAgICAgICBiZSByZXNvbHZlZCB0byBvbmUgb3IgbW9yZSA8QQotCUhSRUY9IiNpcGFkZHIiPjxFTT5JUEFkZHJzPC9FTT48L0E+IHZpYSB0aGUgRE5TIGRvbWFpbiBuYW1lIHNlcnZpY2UuIAotICAgICAgICBJdCByZXByZXNlbnRzIGEgbG9naWNhbCBob3N0IChpbiBjb250cmFzdCB0bwotCTxBIEhSRUY9IiNkb21haW4iPjxFTT5Eb21haW48L0VNPjwvQT5zLCBzZWUgCi0gICAgICAgIGFib3ZlKSBhbmQgbXVzdCBiZSByZXNvbHZhYmxlIHRvIGF0IGxlYXN0IG9uZSA8QQotCUhSRUY9IiNpcGFkZHIiPjxFTT5JUEFkZHI8L0VNPjwvQT4gKG9yIG9mdGVuIHRvIGEgbGlzdCBvZiBob3N0cwotCXdpdGggZGlmZmVyZW50IDxBIEhSRUY9IiNpcGFkZHIiPjxFTT5JUEFkZHI8L0VNPjwvQT4ncykuPEJSPiAKLQkJRXhhbXBsZXM6IDxTQU1QPnByZXAuYWkubWl0LmVkdTwvU0FNUD4KLSAgICAgICAgICAgICAgICAgIDxTQU1QPnd3dy5hcGFjaGUub3JnLjwvU0FNUD48QlI+Ci0gICAgICAgIE5vdGU6IEluIG1hbnkgc2l0dWF0aW9ucywgaXQgaXMgbW9yZSBlZmZlY3RpdmUgdG8gc3BlY2lmeSBhbgotICAgICAgICA8QSBIUkVGPSIjaXBhZGRyIj48RU0+SVBBZGRyPC9FTT48L0E+IGluIHBsYWNlIG9mIGEKLQk8RU0+SG9zdG5hbWU8L0VNPiBzaW5jZSBhIEROUyBsb29rdXAgCi0gICAgICAgIGNhbiBiZSBhdm9pZGVkLiBOYW1lIHJlc29sdXRpb24gaW4gQXBhY2hlIGNhbiB0YWtlIGEgcmVtYXJrYWJsZSBkZWFsCi0gICAgICAgIG9mIHRpbWUgd2hlbiB0aGUgY29ubmVjdGlvbiB0byB0aGUgbmFtZSBzZXJ2ZXIgdXNlcyBhIHNsb3cgUFBQCi0gICAgICAgIGxpbmsuPEJSPgotICAgICAgICBOb3RlOiA8RU0+SG9zdG5hbWU8L0VNPiBjb21wYXJpc29ucyBhcmUgZG9uZSB3aXRob3V0IHJlZ2FyZCB0byB0aGUgY2FzZSwKLSAgICAgICAgYW5kIDxFTT5Ib3N0bmFtZTwvRU0+cyBhcmUgYWx3YXlzIGFzc3VtZWQgdG8gYmUgYW5jaG9yZWQgaW4gdGhlIHJvb3QKLSAgICAgICAgb2YgdGhlIEROUyB0cmVlLCB0aGVyZWZvcmUgdHdvIGhvc3RzIDxTQU1QPldXVy5NeURvbWFpbi5jb208L1NBTVA+Ci0gICAgICAgIGFuZCA8U0FNUD53d3cubXlkb21haW4uY29tLjwvU0FNUD4gKG5vdGUgdGhlIHRyYWlsaW5nIHBlcmlvZCkgYXJlCi0gICAgICAgIGNvbnNpZGVyZWQgZXF1YWwuPEJSPgotPFA+PFNUUk9ORz5TZWUgQWxzbzo8L1NUUk9ORz4KLTxBIEhSRUY9Ii4uL2Rucy1jYXZlYXRzLmh0bWwiPkROUyBJc3N1ZXM8L0E+PC9QPgotICAgPC9ETD4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0icHJveHlkb21haW4iPlByb3h5RG9tYWluPC9BPjwvSDI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFByb3h5RG9tYWluIDxFTT4mbHQ7RG9tYWluJmd0OzwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxFTT5Ob25lPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gPEVNPk5vdCBhcHBsaWNhYmxlPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9wcm94eTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBQcm94eURvbWFpbiBpcyBvbmx5IGF2YWlsYWJsZSBpbgotQXBhY2hlIDEuMyBhbmQgbGF0ZXIuPFA+Ci0KLVRoaXMgZGlyZWN0aXZlIGlzIG9ubHkgdXNlZnVsIGZvciBBcGFjaGUgcHJveHkgc2VydmVycyB3aXRoaW4gaW50cmFuZXRzLgotVGhlIFByb3h5RG9tYWluIGRpcmVjdGl2ZSBzcGVjaWZpZXMgdGhlIGRlZmF1bHQgZG9tYWluIHdoaWNoIHRoZSBhcGFjaGUKLXByb3h5IHNlcnZlciB3aWxsIGJlbG9uZyB0by4gSWYgYSByZXF1ZXN0IHRvIGEgaG9zdCB3aXRob3V0IGEgZG9tYWluIG5hbWUKLWlzIGVuY291bnRlcmVkLCBhIHJlZGlyZWN0aW9uIHJlc3BvbnNlIHRvIHRoZSBzYW1lIGhvc3QKLXdpdGggdGhlIGNvbmZpZ3VyZWQgPEVNPkRvbWFpbjwvRU0+IGFwcGVuZGVkIHdpbGwgYmUgZ2VuZXJhdGVkLiAKLTxQPgotRXhhbXBsZToKLQotPFBSRT4KLSAgUHJveHlSZW1vdGUgICogIGh0dHA6Ly9maXJld2FsbC5teWNvbXBhbnkuY29tOjgxCi0gIE5vUHJveHkgICAgICAgICAubXljb21wYW55LmNvbSAxOTIuMTY4LjExMi4wLzIxIAotICBQcm94eURvbWFpbiAgICAgLm15Y29tcGFueS5jb20KLTwvUFJFPgotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJwcm94eXZpYSI+UHJveHlWaWE8L0E+PC9IMj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gUHJveHlWaWEgeyA8RU0+b2ZmPC9FTT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgPEVNPm9uPC9FTT4KLQkJCQkgICAgICAgfCA8RU0+ZnVsbDwvRU0+Ci0JCQkJICAgICAgIHwgPEVNPmJsb2NrPC9FTT4KLQkJCQkgICAgICAgfTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8RU0+UHJveHlWaWEgb2ZmPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gPEVNPk5vdCBhcHBsaWNhYmxlPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9wcm94eTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBQcm94eVZpYSBpcyBvbmx5IGF2YWlsYWJsZSBpbgotQXBhY2hlIDEuMy4yIGFuZCBsYXRlci48UD4KLQotVGhpcyBkaXJlY3RpdmUgY29udHJvbHMgdGhlIHVzZSBvZiB0aGUgPFNBTVA+VmlhOjwvU0FNUD4gSFRUUCBoZWFkZXIKLWJ5IHRoZSBwcm94eS4gSXRzIGludGVuZGVkIHVzZSBpcyB0byBjb250cm9sIHRoZSBmbG93IG9mIG9mIHByb3h5Ci1yZXF1ZXN0cyBhbG9uZyBhIGNoYWluIG9mIHByb3h5IHNlcnZlcnMuCi1TZWUgUkZDMjA2OCAoSFRUUC8xLjEpIGZvciBhbiBleHBsYW5hdGlvbiBvZiA8U0FNUD5WaWE6PC9TQU1QPiBoZWFkZXIgbGluZXMuPFVMPgotPExJPklmIHNldCB0byA8RU0+b2ZmPC9FTT4sIHdoaWNoIGlzIHRoZSBkZWZhdWx0LCBubyBzcGVjaWFsCi1wcm9jZXNzaW5nIGlzIHBlcmZvcm1lZC4gSWYgYSByZXF1ZXN0IG9yIHJlcGx5IGNvbnRhaW5zIGEgPFNBTVA+VmlhOjwvU0FNUD4gaGVhZGVyLAotaXQgaXMgcGFzc2VkIHRocm91Z2ggdW5jaGFuZ2VkLgotPExJPklmIHNldCB0byA8RU0+b248L0VNPiwgZWFjaCByZXF1ZXN0IGFuZCByZXBseSB3aWxsIGdldCBhIDxTQU1QPlZpYTo8L1NBTVA+IGhlYWRlcgotbGluZSBhZGRlZCBmb3IgdGhlIGN1cnJlbnQgaG9zdC4KLTxMST5JZiBzZXQgdG8gPEVNPmZ1bGw8L0VNPiwgZWFjaCBnZW5lcmF0ZWQgPFNBTVA+VmlhOjwvU0FNUD4gaGVhZGVyIGxpbmUgd2lsbAotYWRkaXRpb25hbGx5IGhhdmUgdGhlIEFwYWNoZSBzZXJ2ZXIgdmVyc2lvbiBzaG93biBhcyBhIDxTQU1QPlZpYTo8L1NBTVA+IGNvbW1lbnQgZmllbGQuCi08TEk+SWYgc2V0IHRvIDxFTT5ibG9jazwvRU0+LCBldmVyeSBwcm94eSByZXF1ZXN0IHdpbGwgaGF2ZSBhbGwgaXRzCi08U0FNUD5WaWE6PC9TQU1QPiBoZWFkZXIgbGluZXMgcmVtb3ZlZC4gTm8gbmV3IDxTQU1QPlZpYTo8L1NBTVA+IGhlYWRlciB3aWxsIGJlIGdlbmVyYXRlZC4KLTwvVUw+Ci0KLTxIUj4KLQotPEgyPjxBIE5BTUU9ImNhY2hlZm9yY2Vjb21wbGV0aW9uIj5DYWNoZUZvcmNlQ29tcGxldGlvbjwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBDYWNoZUZvcmNlQ29tcGxldGlvbiA8RU0+Jmx0O3BlcmNlbnRhZ2UmZ3Q7PC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPEVNPjkwPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gPEVNPk5vdCBhcHBsaWNhYmxlPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9wcm94eTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBDYWNoZUZvcmNlQ29tcGxldGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBpbgotQXBhY2hlIDEuMy4xIGFuZCBsYXRlci48UD4KLQotSWYgYW4gaHR0cCB0cmFuc2ZlciB0aGF0IGlzIGJlaW5nIGNhY2hlZCBpcyBjYW5jZWxsZWQsIHRoZSBwcm94eSBtb2R1bGUgd2lsbAotY29tcGxldGUgdGhlIHRyYW5zZmVyIHRvIGNhY2hlIGlmIG1vcmUgdGhhbiB0aGUgcGVyY2VudGFnZSBzcGVjaWZpZWQgaGFzCi1hbHJlYWR5IGJlZW4gdHJhbnNmZXJyZWQuPFA+Ci0KLVRoaXMgaXMgYSBwZXJjZW50YWdlLCBhbmQgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDEgYW5kIDEwMCwgb3IgMCB0byB1c2UKLXRoZSBkZWZhdWx0LiAgMTAwIHdpbGwgY2F1c2UgYSBkb2N1bWVudCB0byBiZSBjYWNoZWQgb25seSBpZiB0aGUgdHJhbnNmZXIKLXdhcyBhbGxvd2VkIHRvIGNvbXBsZXRlLiAgQSBudW1iZXIgYmV0d2VlbiA2MCBhbmQgOTAgaXMgcmVjb21tZW5kZWQuCi0KLTxIUj4KLQotPEgyPjxBIE5BTUU9ImNhY2hlcm9vdCI+Q2FjaGVSb290PC9BPjwvSDI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IENhY2hlUm9vdCA8RU0+Jmx0O2RpcmVjdG9yeSZndDs8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8RU0+Tm9uZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IDxFTT5Ob3QgYXBwbGljYWJsZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfcHJveHk8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gQ2FjaGVSb290IGlzIG9ubHkgYXZhaWxhYmxlIGluCi1BcGFjaGUgMS4xIGFuZCBsYXRlci48UD4KLQotU2V0cyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRvIGNvbnRhaW4gY2FjaGUgZmlsZXM7IHRoaXMgbXVzdCBiZQotd3JpdGFibGUgYnkgdGhlIGh0dHBkIHNlcnZlci4KLShzZWUgdGhlIDxBIEhSRUY9ImNvcmUuaHRtbCN1c2VyIj48Q09ERT5Vc2VyPC9DT0RFPjwvQT4gZGlyZWN0aXZlKS48QlI+Ci1TZXR0aW5nIDxDT0RFPkNhY2hlUm9vdDwvQ09ERT4gZW5hYmxlcyBwcm94eSBjYWNoZWluZzsgd2l0aG91dCBkZWZpbmluZwotYSA8Q09ERT5DYWNoZVJvb3Q8L0NPREU+LCBwcm94eSBmdW5jdGlvbmFsaXR5IHdpbGwgYmUgYXZhaWxhYmxlCi1pZiA8Q09ERT5Qcm94eVJlcXVlc3RzPC9DT0RFPiBhcmUgc2V0IHRvIDxDT0RFPk9uPC9DT0RFPiwgYnV0IG5vCi1jYWNoZWluZyB3aWxsIGJlIGF2YWlsYWJsZS4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0iY2FjaGVzaXplIj5DYWNoZVNpemU8L0E+PC9IMj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQ2FjaGVTaXplIDxFTT4mbHQ7c2l6ZSZndDs8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5DYWNoZVNpemUgNTwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gPEVNPk5vdCBhcHBsaWNhYmxlPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9wcm94eTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBDYWNoZVNpemUgaXMgb25seSBhdmFpbGFibGUgaW4KLUFwYWNoZSAxLjEgYW5kIGxhdGVyLjxQPgotCi1TZXRzIHRoZSBkZXNpcmVkIHNwYWNlIHVzYWdlIG9mIHRoZSBjYWNoZSwgaW4gS0IgKDEwMjQtYnl0ZSB1bml0cykuIEFsdGhvdWdoCi11c2FnZSBtYXkgZ3JvdyBhYm92ZSB0aGlzIHNldHRpbmcsIHRoZSBnYXJiYWdlIGNvbGxlY3Rpb24gd2lsbCBkZWxldGUgZmlsZXMKLXVudGlsIHRoZSB1c2FnZSBpcyBhdCBvciBiZWxvdyB0aGlzIHNldHRpbmcuPEJSPgotRGVwZW5kaW5nIG9uIHRoZSBleHBlY3RlZCBwcm94eSB0cmFmZmljIHZvbHVtZSBhbmQgPENPREU+Q2FjaGVHY0ludGVydmFsPC9DT0RFPiwKLXVzZSBhIHZhbHVlIHdoaWNoIGlzIGF0IGxlYXN0IDIwIHRvIDQwICUgbG93ZXIgdGhhbiB0aGUgYXZhaWxhYmxlIHNwYWNlLgotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJjYWNoZWdjaW50ZXJ2YWwiPkNhY2hlR2NJbnRlcnZhbDwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBDYWNoZUdjSW50ZXJ2YWwgPEVNPiZsdDt0aW1lJmd0OzwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxFTT5Ob25lPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gPEVNPk5vdCBhcHBsaWNhYmxlPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9wcm94eTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBDYWNoZUdjaW50ZXJ2YWwgaXMgb25seSBhdmFpbGFibGUgaW4KLUFwYWNoZSAxLjEgYW5kIGxhdGVyLjxQPgotCi1DaGVjayB0aGUgY2FjaGUgZXZlcnkgJmx0O3RpbWUmZ3Q7IGhvdXJzLCBhbmQgZGVsZXRlIGZpbGVzIGlmIHRoZSBzcGFjZQotdXNhZ2UgaXMgZ3JlYXRlciB0aGFuIHRoYXQgc2V0IGJ5IENhY2hlU2l6ZS4gTm90ZSB0aGF0ICZsdDt0aW1lJmd0OyBhY2NlcHRzIGEKLWZsb2F0IHZhbHVlLCB5b3UgY291bGQgZm9yIGV4YW1wbGUgdXNlIDxDT0RFPkNhY2hlR2NJbnRlcnZhbCAxLjU8L0NPREU+IHRvCi1jaGVjayB0aGUgY2FjaGUgZXZlcnkgOTAgbWludXRlcy4gKElmIHVuc2V0LCBubyBnYXJiYWdlIGNvbGxlY3Rpb24gd2lsbAotYmUgcGVyZm9ybWVkLCBhbmQgdGhlIGNhY2hlIHdpbGwgZ3JvdyBpbmRlZmluaXRlbHkuKQotTm90ZSBhbHNvIHRoYXQgdGhlIGxhcmdlciB0aGUgPENPREU+Q2FjaGVHY0ludGVydmFsPC9DT0RFPiwgdGhlIG1vcmUKLWV4dHJhIHNwYWNlIGJleW9uZCB0aGUgY29uZmlndXJlZCA8Q09ERT5DYWNoZVNpemU8L0NPREU+IHdpbGwgYmUKLW5lZWRlZCBmb3IgdGhlIGNhY2hlIGJldHdlZW4gZ2FyYmFnZSBjb2xsZWN0aW9ucy48QlI+IDwhLS0KLU5vdGUgdGhhdCBkdWUgdG8gYSBkZXNpZ24gZmxhdywgQXBhY2hlIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgZm9yY2UgYQotZ2FyYmFnZSBjb2xsZWN0aW9uIHdoZW4gdGhlIGF2YWlsYWJsZSBzcGFjZSBvbiB0aGUgZmlsZSBzeXN0ZW0gd2hlcmUKLXRoZSBjYWNoZSByZXNpZGVzIGlzIGV4aGF1c3RlZC4gLS0+Ci0KLTxIUj4KLQotPEgyPjxBIE5BTUU9ImNhY2hlbWF4ZXhwaXJlIj5DYWNoZU1heEV4cGlyZTwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBDYWNoZU1heEV4cGlyZSA8RU0+Jmx0O3RpbWUmZ3Q7PC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+Q2FjaGVNYXhFeHBpcmUgMjQ8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IDxFTT5Ob3QgYXBwbGljYWJsZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfcHJveHk8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gQ2FjaGVNYXhFeHBpcmUgaXMgb25seSBhdmFpbGFibGUgaW4KLUFwYWNoZSAxLjEgYW5kIGxhdGVyLjxQPgotCi1DYWNoYWJsZSBIVFRQIGRvY3VtZW50cyB3aWxsIGJlIHJldGFpbmVkIGZvciBhdCBtb3N0ICZsdDt0aW1lJmd0OyBob3VycyB3aXRob3V0Ci1jaGVja2luZyB0aGUgb3JpZ2luIHNlcnZlci4gVGh1cyBkb2N1bWVudHMgY2FuIGJlIGF0IG1vc3QgJmx0O3RpbWUmZ3Q7Ci1ob3VycyBvdXQgb2YgZGF0ZS4gVGhpcyByZXN0cmljdGlvbiBpcyBlbmZvcmNlZCBldmVuIGlmIGFuIGV4cGlyeSBkYXRlCi13YXMgc3VwcGxpZWQgd2l0aCB0aGUgZG9jdW1lbnQuCi0KLTxIUj4KLQotPEgyPjxBIE5BTUU9ImNhY2hlbGFzdG1vZGlmaWVkZmFjdG9yIj5DYWNoZUxhc3RNb2RpZmllZEZhY3RvcjwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBDYWNoZUxhc3RNb2RpZmllZEZhY3RvciA8RU0+Jmx0O2ZhY3RvciZndDs8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5DYWNoZUxhc3RNb2RpZmllZEZhY3RvciAwLjE8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IDxFTT5Ob3QgYXBwbGljYWJsZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfcHJveHk8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gQ2FjaGVMYXN0TW9kaWZpZWRGYWN0b3IgaXMgb25seSBhdmFpbGFibGUgaW4KLUFwYWNoZSAxLjEgYW5kIGxhdGVyLjxQPgotCi1JZiB0aGUgb3JpZ2luIEhUVFAgc2VydmVyIGRpZCBub3Qgc3VwcGx5IGFuIGV4cGlyeSBkYXRlIGZvciB0aGUKLWRvY3VtZW50LCB0aGVuIGVzdGltYXRlIG9uZSB1c2luZyB0aGUgZm9ybXVsYQotPFBSRT4KLSAgZXhwaXJ5LXBlcmlvZCA9IHRpbWUtc2luY2UtbGFzdC1tb2RpZmljYXRpb24gKiAmbHQ7ZmFjdG9yJmd0OwotPC9QUkU+Ci1Gb3IgZXhhbXBsZSwgaWYgdGhlIGRvY3VtZW50IHdhcyBsYXN0IG1vZGlmaWVkIDEwIGhvdXJzIGFnbywgYW5kCi0mbHQ7ZmFjdG9yJmd0OyBpcyAwLjEsIHRoZW4gdGhlIGV4cGlyeSBwZXJpb2Qgd2lsbCBiZSBzZXQgdG8gMTAqMC4xID0gMSBob3VyLgotCi08UD5JZiB0aGUgZXhwaXJ5LXBlcmlvZCB3b3VsZCBiZSBsb25nZXIgdGhhbiB0aGF0IHNldCBieSBDYWNoZU1heEV4cGlyZSwKLXRoZW4gdGhlIGxhdHRlciB0YWtlcyBwcmVjZWRlbmNlLgotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJjYWNoZWRpcmxldmVscyI+Q2FjaGVEaXJMZXZlbHM8L0E+PC9IMj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQ2FjaGVEaXJMZXZlbHMgPEVNPiZsdDtsZXZlbHMmZ3Q7PC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+Q2FjaGVEaXJMZXZlbHMgMzwvQ09ERT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gPEVNPk5vdCBhcHBsaWNhYmxlPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9wcm94eTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBDYWNoZURpckxldmVscyBpcyBvbmx5IGF2YWlsYWJsZSBpbgotQXBhY2hlIDEuMSBhbmQgbGF0ZXIuPFA+Ci0KLUNhY2hlRGlyTGV2ZWxzIHNldHMgdGhlIG51bWJlciBvZiBsZXZlbHMgb2Ygc3ViZGlyZWN0b3JpZXMgaW4gdGhlIGNhY2hlLgotQ2FjaGVkIGRhdGEgd2lsbCBiZSBzYXZlZCB0aGlzIG1hbnkgZGlyZWN0b3J5IGxldmVscyBiZWxvdyBDYWNoZVJvb3QuCi0KLTxIUj4KLQotPEgyPjxBIE5BTUU9ImNhY2hlZGlybGVuZ3RoIj5DYWNoZURpckxlbmd0aDwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBDYWNoZURpckxlbmd0aCA8RU0+Jmx0O2xlbmd0aCZndDs8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5DYWNoZURpckxlbmd0aCAxPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiA8RU0+Tm90IGFwcGxpY2FibGU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX3Byb3h5PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IENhY2hlRGlyTGVuZ3RoIGlzIG9ubHkgYXZhaWxhYmxlIGluCi1BcGFjaGUgMS4xIGFuZCBsYXRlci48UD4KLQotQ2FjaGVEaXJMZW5ndGggc2V0cyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gcHJveHkgY2FjaGUgc3ViZGlyZWN0b3J5IG5hbWVzLgotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJjYWNoZWRlZmF1bHRleHBpcmUiPkNhY2hlRGVmYXVsdEV4cGlyZTwvQT48L0gyPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBDYWNoZURlZmF1bHRFeHBpcmUgPEVNPiZsdDt0aW1lJmd0OzwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPkNhY2hlRGVmYXVsdEV4cGlyZSAxPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiA8RU0+Tm90IGFwcGxpY2FibGU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX3Byb3h5PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IENhY2hlRGVmYXVsdEV4cGlyZSBpcyBvbmx5IGF2YWlsYWJsZSBpbgotQXBhY2hlIDEuMSBhbmQgbGF0ZXIuPFA+Ci0KLUlmIHRoZSBkb2N1bWVudCBpcyBmZXRjaGVkIHZpYSBhIHByb3RvY29sIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBleHBpcnkgdGltZXMsCi10aGVuIHVzZSAmbHQ7dGltZSZndDsgaG91cnMgYXMgdGhlIGV4cGlyeSB0aW1lLgotPEEgSFJFRj0iI2NhY2hlbWF4ZXhwaXJlIj5DYWNoZU1heEV4cGlyZTwvQT4gZG9lcyA8U1RST05HPm5vdDwvU1RST05HPgotb3ZlcnJpZGUgdGhpcyBzZXR0aW5nLgotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJub2NhY2hlIj5Ob0NhY2hlPC9BPjwvSDI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IE5vQ2FjaGUgPEVNPiZsdDt3b3JkL2hvc3QvZG9tYWluIGxpc3QmZ3Q7PC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPEVNPk5vbmU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiA8RU0+Tm90IGFwcGxpY2FibGU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX3Byb3h5PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IE5vQ2FjaGUgaXMgb25seSBhdmFpbGFibGUgaW4KLUFwYWNoZSAxLjEgYW5kIGxhdGVyLjxQPgotCi1UaGUgTm9DYWNoZSBkaXJlY3RpdmUgc3BlY2lmaWVzIGEgbGlzdCBvZiB3b3JkcywgaG9zdHMgYW5kL29yIGRvbWFpbnMsIHNlcGFyYXRlZAotYnkgc3BhY2VzLiBIVFRQIGFuZCBub24tcGFzc3dvcmRlZCBGVFAgZG9jdW1lbnRzIGZyb20gbWF0Y2hlZCB3b3JkcywgaG9zdHMgb3IKLWRvbWFpbnMgYXJlIDxFTT5ub3Q8L0VNPiBjYWNoZWQgYnkgdGhlIHByb3h5IHNlcnZlci4gVGhlIHByb3h5IG1vZHVsZSB3aWxsCi1hbHNvIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIElQIGFkZHJlc3NlcyBvZiBsaXN0IGl0ZW1zIHdoaWNoIG1heSBiZSBob3N0bmFtZXMKLWR1cmluZyBzdGFydHVwLCBhbmQgY2FjaGUgdGhlbSBmb3IgbWF0Y2ggdGVzdCBhcyB3ZWxsLiBFeGFtcGxlOgotCi08UFJFPgotICBOb0NhY2hlIGpvZXMtZ2FyYWdlLmNvbSBzb21lLWhvc3QuY28udWsgYnVsbHdpbmtsZS53b3RzYW1hdHRhdS5lZHUKLTwvUFJFPgotCi0nYnVsbHdpbmtsZS53b3RzYW1hdHRhdS5lZHUnIHdvdWxkIGFsc28gYmUgbWF0Y2hlZCBpZiByZWZlcmVuY2VkIGJ5IElQCi1hZGRyZXNzLjxQPgotCi1Ob3RlIHRoYXQgJ3dvdHNhbWF0dGF1JyB3b3VsZCBhbHNvIGJlIHN1ZmZpY2llbnQgdG8gbWF0Y2ggJ3dvdHNhbWF0dGF1LmVkdScuPFA+Ci0KLU5vdGUgYWxzbyB0aGF0Ci0KLTxQUkU+Ci1Ob0NhY2hlICoKLTwvUFJFPgotCi1kaXNhYmxlcyBjYWNoaW5nIGNvbXBsZXRlbHkuPFA+Ci0KLTxIUj4KLQotPEgyPjxBIE5BTUU9ImNvbmZpZ3MiPkNvbW1vbiBjb25maWd1cmF0aW9uIHRvcGljczwvQT48L0gyPgotCi08VUw+Ci08TEk+PEEgSFJFRj0iI2FjY2VzcyI+Q29udHJvbGxpbmcgYWNjZXNzIHRvIHlvdXIgcHJveHk8L0E+Ci08TEk+PEEgSFJFRj0iI3Nob3J0bmFtZSI+VXNpbmcgTmV0c2NhcGUgaG9zdG5hbWUgc2hvcnRjdXRzPC9BPgotPExJPjxBIEhSRUY9IiNtaW1ldHlwZXMiPldoeSBkb2Vzbid0IGZpbGUgdHlwZSA8RU0+eHh4PC9FTT4gZG93bmxvYWQgdmlhIEZUUD88L0E+Ci08TEk+PEEgSFJFRj0iI3N0YXJ0dXAiPldoeSBkb2VzIEFwYWNoZSBzdGFydCBtb3JlIHNsb3dseSB3aGVuIHVzaW5nIHRoZQotICAgICAgICBwcm94eSBtb2R1bGU/PC9BPgotPExJPjxBIEhSRUY9IiNzb2NrcyI+Q2FuIEkgdXNlIHRoZSBBcGFjaGUgcHJveHkgbW9kdWxlIHdpdGggbXkgU09DS1MgcHJveHk/PC9BPgotPExJPjxBIEhSRUY9IiNpbnRyYW5ldCI+V2hhdCBvdGhlciBmdW5jdGlvbnMgYXJlIHVzZWZ1bCBmb3IgYW4gaW50cmFuZXQgcHJveHkgc2VydmVyPzwvQT4KLTwvVUw+Ci0KLTxIMj48QSBOQU1FPSJhY2Nlc3MiPkNvbnRyb2xsaW5nIGFjY2VzcyB0byB5b3VyIHByb3h5PC9BPjwvSDI+Ci0KLVlvdSBjYW4gY29udHJvbCB3aG8gY2FuIGFjY2VzcyB5b3VyIHByb3h5IHZpYSB0aGUgbm9ybWFsICZsdDtEaXJlY3RvcnkmZ3Q7Ci1jb250cm9sIGJsb2NrIHVzaW5nIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTo8UD4KLQotPFBSRT4KLSZsdDtEaXJlY3RvcnkgcHJveHk6KiZndDsKLW9yZGVyIGRlbnksYWxsb3cKLWRlbnkgZnJvbSBbbWFjaGluZXMgeW91J2QgbGlrZSAqbm90KiB0byBhbGxvdyBieSBJUCBhZGRyZXNzIG9yIG5hbWVdCi1hbGxvdyBmcm9tIFttYWNoaW5lcyB5b3UnZCBsaWtlIHRvIGFsbG93IGJ5IElQIGFkZHJlc3Mgb3IgbmFtZV0KLSZsdDsvRGlyZWN0b3J5Jmd0OwotPC9QUkU+PFA+Ci0KLUEgJmx0O0ZpbGVzJmd0OyBibG9jayB3aWxsIGFsc28gd29yaywgYW5kIGlzIHRoZSBvbmx5IG1ldGhvZCBrbm93biB0byB3b3JrCi1mb3IgYWxsIHBvc3NpYmxlIFVSTHMgaW4gQXBhY2hlIHZlcnNpb25zIGVhcmxpZXIgdGhhbiAxLjJiMTAuPFA+Ci0KLTxIMj48QSBOQU1FPSJzaG9ydG5hbWUiPlVzaW5nIE5ldHNjYXBlIGhvc3RuYW1lIHNob3J0Y3V0czwvQT48L0gyPgotCi1UaGVyZSBpcyBhbiBvcHRpb25hbCBwYXRjaCB0byB0aGUgcHJveHkgbW9kdWxlIHRvIGFsbG93IE5ldHNjYXBlLWxpa2UKLWhvc3RuYW1lIHNob3J0Y3V0cyB0byBiZSB1c2VkLiBJdCdzIGF2YWlsYWJsZSBmcm9tIHRoZQotPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvY29udHJpYi9wYXRjaGVzLzEuMi9uZXRzY2FwZWhvc3QucGF0Y2giCi0+PFNBTVA+Y29udHJpYi9wYXRjaGVzLzEuMjwvU0FNUD48L0E+IGRpcmVjdG9yeSBvbiB0aGUgQXBhY2hlIFdlYiBzaXRlLjxQPgotCi08SDI+PEEgTkFNRT0ibWltZXR5cGVzIj5XaHkgZG9lc24ndCBmaWxlIHR5cGUgPEVNPnh4eDwvRU0+IGRvd25sb2FkIHZpYSBGVFA/PC9BPjwvSDI+Ci0KLVlvdSBwcm9iYWJseSBkb24ndCBoYXZlIHRoYXQgcGFydGljdWxhciBmaWxlIHR5cGUgZGVmaW5lZCBhcwotPEVNPmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTwvRU0+IGluIHlvdXIgcHJveHkncyBtaW1lLnR5cGVzIGNvbmZpZ3VyYXRpb24KLWZpbGUuIEEgdXNlZnVsIGxpbmUgY2FuIGJlPFA+Ci0KLTxQUkU+Ci1hcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0gICAgICAgIGJpbiBkbXMgbGhhIGx6aCBleGUgY2xhc3MgdGd6IHRhegotPC9QUkU+Ci0KLTxIMj48QSBOQU1FPSJ0eXBlIj5Ib3cgY2FuIEkgZm9yY2UgYW4gRlRQIEFTQ0lJIGRvd25sb2FkIG9mIEZpbGUgPEVNPnh4eDwvRU0+PzwvQT48L0gyPgotCi1JbiB0aGUgcmFyZSBzaXR1YXRpb24gd2hlcmUgeW91IG11c3QgZG93bmxvYWQgYSBzcGVjaWZpYyBmaWxlIHVzaW5nIHRoZSBGVFAKLTxTVFJPTkc+QVNDSUk8L1NUUk9ORz4gdHJhbnNmZXIgbWV0aG9kICh3aGlsZSB0aGUgZGVmYXVsdCB0cmFuc2ZlciBpcyBpbgotPFNUUk9ORz5iaW5hcnk8L1NUUk9ORz4gbW9kZSksIHlvdSBjYW4gb3ZlcnJpZGUgbW9kX3Byb3h5J3MgZGVmYXVsdCBieQotc3VmZml4aW5nIHRoZSByZXF1ZXN0IHdpdGggPFNBTVA+O3R5cGU9YTwvU0FNUD4gdG8gZm9yY2UgYW4gQVNDSUkgdHJhbnNmZXIuPFA+Ci0KLTxIMj48QSBOQU1FPSJzdGFydHVwIj5XaHkgZG9lcyBBcGFjaGUgc3RhcnQgbW9yZSBzbG93bHkgd2hlbiB1c2luZyB0aGUKLSAgICAgICAgcHJveHkgbW9kdWxlPzwvQT48L0gyPgotCi1JZiB5b3UncmUgdXNpbmcgdGhlIDxDT0RFPlByb3h5QmxvY2s8L0NPREU+IG9yIDxDT0RFPk5vQ2FjaGU8L0NPREU+Ci1kaXJlY3RpdmVzLCBob3N0bmFtZXMnIElQIGFkZHJlc3NlcyBhcmUgbG9va2VkIHVwIGFuZCBjYWNoZWQgZHVyaW5nCi1zdGFydHVwIGZvciBsYXRlciBtYXRjaCB0ZXN0LiBUaGlzIG1heSB0YWtlIGEgZmV3IHNlY29uZHMgKG9yIG1vcmUpCi1kZXBlbmRpbmcgb24gdGhlIHNwZWVkIHdpdGggd2hpY2ggdGhlIGhvc3RuYW1lIGxvb2t1cHMgb2NjdXIuPFA+Ci0KLTxIMj48QSBOQU1FPSJzb2NrcyI+Q2FuIEkgdXNlIHRoZSBBcGFjaGUgcHJveHkgbW9kdWxlIHdpdGggbXkgU09DS1MgcHJveHk/PC9BPjwvSDI+Ci0KLVllcy4gSnVzdCBidWlsZCBBcGFjaGUgd2l0aCB0aGUgcnVsZSA8Q09ERT5TT0NLUzQ9eWVzPC9DT0RFPiBpbiB5b3VyCi08RU0+Q29uZmlndXJhdGlvbjwvRU0+IGZpbGUsIGFuZCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyB0aGVyZS4gU09DS1M1Ci1jYXBhYmlsaXR5IGNhbiBiZSBhZGRlZCBpbiBhIHNpbWlsYXIgd2F5ICh0aGVyZSdzIG5vIDxDT0RFPlNPQ0tTNTwvQ09ERT4KLXJ1bGUgeWV0KSwgc28gdXNlIHRoZSA8Q09ERT5FWFRSQV9MREZMQUdTPC9DT0RFPiBkZWZpbml0aW9uLCBvciBidWlsZCBBcGFjaGUKLW5vcm1hbGx5IGFuZCBydW4gaXQgd2l0aCB0aGUgPEVNPnJ1bnNvY2tzPC9FTT4gd3JhcHBlciBwcm92aWRlZCB3aXRoIFNPQ0tTNSwKLWlmIHlvdXIgT1Mgc3VwcG9ydHMgZHluYW1pY2FsbHkgbGlua2VkIGxpYnJhcmllcy48UD4KLQotU29tZSB1c2VycyBoYXZlIHJlcG9ydGVkIHByb2JsZW1zIHdoZW4gdXNpbmcgU09DS1MgdmVyc2lvbiA0LjIgb24gU29sYXJpcy4KLVRoZSBwcm9ibGVtIHdhcyBzb2x2ZWQgYnkgdXBncmFkaW5nIHRvIFNPQ0tTIDQuMy48UD4KLQotUmVtZW1iZXIgdGhhdCB5b3UnbGwgYWxzbyBoYXZlIHRvIGdyYW50IGFjY2VzcyB0byB5b3VyIEFwYWNoZSBwcm94eSBtYWNoaW5lIGJ5Ci1wZXJtaXR0aW5nIGNvbm5lY3Rpb25zIG9uIHRoZSBhcHByb3ByaWF0ZSBwb3J0cyBpbiB5b3VyIFNPQ0tTIGRhZW1vbidzCi1jb25maWd1cmF0aW9uLjxQPgotCi08SDI+PEEgTkFNRT0iaW50cmFuZXQiPldoYXQgb3RoZXIgZnVuY3Rpb25zIGFyZSB1c2VmdWwgZm9yIGFuIGludHJhbmV0IHByb3h5IHNlcnZlcj88L0E+PC9IMj4KLQotPFA+QW4gQXBhY2hlIHByb3h5IHNlcnZlciBzaXR1YXRlZCBpbiBhbiBpbnRyYW5ldCBuZWVkcyB0byBmb3J3YXJkIGV4dGVybmFsCi1yZXF1ZXN0cyB0aHJvdWdoIHRoZSBjb21wYW55J3MgZmlyZXdhbGwuIEhvd2V2ZXIsIHdoZW4gaXQgaGFzIHRvIGFjY2VzcwotcmVzb3VyY2VzIHdpdGhpbiB0aGUgaW50cmFuZXQsIGl0IGNhbiBieXBhc3MgdGhlIGZpcmV3YWxsIHdoZW4gYWNjZXNzaW5nCi1ob3N0cy4gVGhlIDxBIEhSRUY9IiNub3Byb3h5Ij5Ob1Byb3h5PC9BPiBkaXJlY3RpdmUgaXMgdXNlZnVsIGZvciBzcGVjaWZ5aW5nCi13aGljaCBob3N0cyBiZWxvbmcgdG8gdGhlIGludHJhbmV0IGFuZCBzaG91bGQgYmUgYWNjZXNzZWQgZGlyZWN0bHkuPC9QPgotCi08UD5Vc2VycyB3aXRoaW4gYW4gaW50cmFuZXQgdGVuZCB0byBvbWl0IHRoZSBsb2NhbCBkb21haW4gbmFtZSBmcm9tIHRoZWlyCi1XV1cgcmVxdWVzdHMsIHRodXMgcmVxdWVzdGluZyAiaHR0cDovL3NvbWVob3N0LyIgaW5zdGVhZCBvZgotImh0dHA6Ly9zb21laG9zdC5teS5kb20uYWluLyIuIFNvbWUgY29tbWVyY2lhbCBwcm94eSBzZXJ2ZXJzIGxldCB0aGVtIGdldAotYXdheSB3aXRoIHRoaXMgYW5kIHNpbXBseSBzZXJ2ZSB0aGUgcmVxdWVzdCwgaW1wbHlpbmcgYSBjb25maWd1cmVkCi1sb2NhbCBkb21haW4uIFdoZW4gdGhlIDxBIEhSRUY9IiNwcm94eWRvbWFpbiI+UHJveHlEb21haW48L0E+IGRpcmVjdGl2ZQotaXMgdXNlZCBhbmQgdGhlIHNlcnZlciBpcyA8QSBIUkVGPSIjcHJveHlyZXF1ZXN0cyI+Y29uZmlndXJlZCBmb3IKLXByb3h5IHNlcnZpY2U8L0E+LCBBcGFjaGUgY2FuIHJldHVybiBhIHJlZGlyZWN0IHJlc3BvbnNlIGFuZCBzZW5kIHRoZSBjbGllbnQKLXRvIHRoZSBjb3JyZWN0LCBmdWxseSBxdWFsaWZpZWQsIHNlcnZlciBhZGRyZXNzLiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgbWV0aG9kCi1zaW5jZSB0aGUgdXNlcidzIGJvb2ttYXJrIGZpbGVzIHdpbGwgdGhlbiBjb250YWluIGZ1bGx5IHF1YWxpZmllZCBob3N0cy48L1A+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfcmV3cml0ZS5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9yZXdyaXRlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZDUwMDkuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9yZXdyaXRlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODY4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTwhLS0laHlwZXJ0ZXh0IC0tPgotPCEtLSBtb2RfcmV3cml0ZS5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIERvY3VtZW50YXRpb24gZm9yIHRoZSBtb2RfcmV3cml0ZSBBcGFjaGUgbW9kdWxlICAtLT4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIG1vZHVsZSBtb2RfcmV3cml0ZTwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08QkxPQ0tRVU9URT48IS0tIHBhZ2UgaW5kZW50YXRpb24gLS0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotCi08QlI+Ci08SDEgQUxJR049IkNFTlRFUiI+TW9kdWxlIG1vZF9yZXdyaXRlPEJSPlVSTCBSZXdyaXRpbmcgRW5naW5lPC9IMT4KLQotVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Q09ERT5tb2RfcmV3cml0ZS5jPC9DT0RFPiBmaWxlLCB3aXRoIEFwYWNoZQotMS4yIGFuZCBsYXRlci4gSXQgcHJvdmlkZXMgYSBydWxlLWJhc2VkIHJld3JpdGluZyBlbmdpbmUgdG8gcmV3cml0ZSByZXF1ZXN0ZWQKLVVSTHMgb24gdGhlIGZseS4gSXQgaXMgbm90IGNvbXBpbGVkIGludG8gdGhlIHNlcnZlciBieSBkZWZhdWx0LiBUbyB1c2UKLTxDT0RFPm1vZF9yZXdyaXRlPC9DT0RFPiB5b3UgaGF2ZSB0byBlbmFibGUgdGhlIGZvbGxvd2luZyBsaW5lIGluIHRoZSBzZXJ2ZXIKLWJ1aWxkIDxDT0RFPkNvbmZpZ3VyYXRpb248L0NPREU+IGZpbGU6Ci08UFJFPgotICAgIEFkZE1vZHVsZSAgbW9kdWxlcy9zdGFuZGFyZC9tb2RfcmV3cml0ZS5vCi08L1BSRT4KLQotPFA+Ci08SFIgTk9TSEFERSBTSVpFPTE+Ci0KLTxCUj4KLTxIMj5TdW1tYXJ5PC9IMj4KLQotPEJMT0NLUVVPVEU+Ci08QkxPQ0tRVU9URT4KLTxCTE9DS1FVT1RFPgotPEVNPmBgVGhlIGdyZWF0IHRoaW5nIGFib3V0IG1vZF9yZXdyaXRlIGlzIGl0IGdpdmVzIHlvdSBhbGwgdGhlCi1jb25maWd1cmFiaWxpdHkgYW5kIGZsZXhpYmlsaXR5IG9mIFNlbmRtYWlsLiBUaGUgZG93bnNpZGUgdG8KLW1vZF9yZXdyaXRlIGlzIHRoYXQgaXQgZ2l2ZXMgeW91IGFsbCB0aGUgY29uZmlndXJhYmlsaXR5IGFuZAotZmxleGliaWxpdHkgb2YgU2VuZG1haWwuJyc8L0VNPgotPERJViBBTElHTj1SSUdIVD4KLS0tIEJyaWFuIEJlaGxlbmRvcmY8QlI+Ci1BcGFjaGUgR3JvdXAKLTwvRElWPgotPC9CTE9DS1FVT1RFPgotPC9CTE9DS1FVT1RFPgotPC9CTE9DS1FVT1RFPgotCi08QkxPQ0tRVU9URT4KLTxCTE9DS1FVT1RFPgotPEJMT0NLUVVPVEU+Ci08RU0+YGAKLURlc3BpdGUgdGhlIHRvbnMgb2YgZXhhbXBsZXMgYW5kIGRvY3MsIG1vZF9yZXdyaXRlCi1pcyB2b29kb28uIERhbW5lZCBjb29sIHZvb2RvbywgYnV0IHN0aWxsIHZvb2Rvby4KLScnPC9FTT4KLTxESVYgQUxJR049UklHSFQ+Ci0tLSBCcmlhbiBNb29yZTxCUj4KLWJlbUBuZXdzLmNtYy5uZXQKLTwvRElWPgotPC9CTE9DS1FVT1RFPgotPC9CTE9DS1FVT1RFPgotPC9CTE9DS1FVT1RFPgotCi1XZWxjb21lIHRvIG1vZF9yZXdyaXRlLCB0aGUgU3dpc3MgQXJteSBLbmlmZSBvZiBVUkwgbWFuaXB1bGF0aW9uIQotCi08UD4KLVRoaXMgbW9kdWxlIHVzZXMgYSBydWxlLWJhc2VkIHJld3JpdGluZyBlbmdpbmUgKGJhc2VkIG9uIGEgcmVndWxhci1leHByZXNzaW9uCi1wYXJzZXIpIHRvIHJld3JpdGUgcmVxdWVzdGVkIFVSTHMgb24gdGhlIGZseS4gSXQgc3VwcG9ydHMgYW4gdW5saW1pdGVkIG51bWJlcgotb2YgcnVsZXMgYW5kIGFuIHVubGltaXRlZCBudW1iZXIgb2YgYXR0YWNoZWQgcnVsZSBjb25kaXRpb25zIGZvciBlYWNoIHJ1bGUgdG8KLXByb3ZpZGUgYSByZWFsbHkgZmxleGlibGUgYW5kIHBvd2VyZnVsIFVSTCBtYW5pcHVsYXRpb24gbWVjaGFuaXNtLiAgVGhlIFVSTAotbWFuaXB1bGF0aW9ucyBjYW4gZGVwZW5kIG9uIHZhcmlvdXMgdGVzdHMsIGZvciBpbnN0YW5jZSBzZXJ2ZXIgdmFyaWFibGVzLAotZW52aXJvbm1lbnQgdmFyaWFibGVzLCBIVFRQIGhlYWRlcnMsIHRpbWUgc3RhbXBzIGFuZCBldmVuIGV4dGVybmFsIGRhdGFiYXNlCi1sb29rdXBzIGluIHZhcmlvdXMgZm9ybWF0cyBjYW4gYmUgdXNlZCB0byBhY2hpZXZlIGEgcmVhbGx5IGdyYW51bGFyIFVSTAotbWF0Y2hpbmcuIAotCi08UD4KLVRoaXMgbW9kdWxlIG9wZXJhdGVzIG9uIHRoZSBmdWxsIFVSTHMgKGluY2x1ZGluZyB0aGUgcGF0aC1pbmZvIHBhcnQpIGJvdGggaW4KLXBlci1zZXJ2ZXIgY29udGV4dCAoPENPREU+aHR0cGQuY29uZjwvQ09ERT4pIGFuZCBwZXItZGlyZWN0b3J5IGNvbnRleHQKLSg8Q09ERT4uaHRhY2Nlc3M8L0NPREU+KSBhbmQgZXZlbiBjYW4gZ2VuZXJhdGUgcXVlcnktc3RyaW5nIHBhcnRzIG9uIHJlc3VsdC4KLVRoZSByZXdyaXR0ZW4gcmVzdWx0IGNhbiBsZWFkIHRvIGludGVybmFsIHN1Yi1wcm9jZXNzaW5nLCBleHRlcm5hbCByZXF1ZXN0Ci1yZWRpcmVjdGlvbiBvciBldmVuIHRvIGFuIGludGVybmFsIHByb3h5IHRocm91Z2hwdXQuCi0KLTxQPgotQnV0IGFsbCB0aGlzIGZ1bmN0aW9uYWxpdHkgYW5kIGZsZXhpYmlsaXR5IGhhcyBpdHMgZHJhd2JhY2s6IGNvbXBsZXhpdHkuIFNvCi1kb24ndCBleHBlY3QgdG8gdW5kZXJzdGFuZCB0aGlzIG1vZHVsZSBpbiBpdHMgd2hvbGUgaW4ganVzdCBvbmUgZGF5LgotCi08UD4KLVRoaXMgbW9kdWxlIHdhcyBpbnZlbnRlZCBhbmQgb3JpZ2luYWxseSB3cml0dGVuIGluIEFwcmlsIDE5OTY8QlI+Ci1hbmQgZ2lmdGVkIGV4Y2x1c2l2ZWx5IHRvIHRoZSBUaGUgQXBhY2hlIEdyb3VwIGluIEp1bHkgMTk5NyBieQotCi08UD4KLTxCTE9DS1FVT1RFPgotPEEgSFJFRj0iaHR0cDovL3d3dy5lbmdlbHNjaGFsbC5jb20vIj48Q09ERT5SYWxmIFMuIEVuZ2Vsc2NoYWxsPC9DT0RFPjwvQT48QlI+Ci08QSBIUkVGPSJtYWlsdG86cnNlQGVuZ2Vsc2NoYWxsLmNvbSI+PENPREU+cnNlQGVuZ2Vsc2NoYWxsLmNvbTwvQ09ERT48L0E+PEJSPgotPEEgSFJFRj0iaHR0cDovL3d3dy5lbmdlbHNjaGFsbC5jb20vIj48Q09ERT53d3cuZW5nZWxzY2hhbGwuY29tPC9DT0RFPjwvQT4KLTwvQkxPQ0tRVU9URT4KLQotPFA+Ci08SFIgTk9TSEFERSBTSVpFPTE+Ci0KLTxIMj5UYWJsZSBPZiBDb250ZW50czwvSDI+Ci0KLTxQPgotPFNUUk9ORz5JbnRlcm5hbCBQcm9jZXNzaW5nPC9TVFJPTkc+Ci08VUw+Ci0gICAgPExJPjxBIEhSRUY9IiNJbnRlcm5hbEFQSSI+QVBJIFBoYXNlczwvQT4KLSAgICA8TEk+PEEgSFJFRj0iI0ludGVybmFsUnVsZXNldCI+UnVsZXNldCBQcm9jZXNzaW5nPC9BPgotICAgIDxMST48QSBIUkVGPSIjSW50ZXJuYWxCYWNrUmVmcyI+UmVnZXggQmFjay1SZWZlcmVuY2UgQXZhaWxhYmlsaXR5PC9BPgotPC9VTD4KLTxQPgotPFNUUk9ORz5Db25maWd1cmF0aW9uIERpcmVjdGl2ZXM8L1NUUk9ORz4KLTxVTD4KLSAgICA8TEk+PEEgSFJFRj0iI1Jld3JpdGVFbmdpbmUiPlJld3JpdGVFbmdpbmU8L0E+Ci0gICAgPExJPjxBIEhSRUY9IiNSZXdyaXRlT3B0aW9ucyI+UmV3cml0ZU9wdGlvbnM8L0E+Ci0gICAgPExJPjxBIEhSRUY9IiNSZXdyaXRlTG9nIj5SZXdyaXRlTG9nPC9BPgotICAgIDxMST48QSBIUkVGPSIjUmV3cml0ZUxvZ0xldmVsIj5SZXdyaXRlTG9nTGV2ZWw8L0E+Ci0gICAgPExJPjxBIEhSRUY9IiNSZXdyaXRlTG9jayI+UmV3cml0ZUxvY2s8L0E+Ci0gICAgPExJPjxBIEhSRUY9IiNSZXdyaXRlTWFwIj5SZXdyaXRlTWFwPC9BPgotICAgIDxMST48QSBIUkVGPSIjUmV3cml0ZUJhc2UiPlJld3JpdGVCYXNlPC9BPgotICAgIDxMST48QSBIUkVGPSIjUmV3cml0ZUNvbmQiPlJld3JpdGVDb25kPC9BPgotICAgIDxMST48QSBIUkVGPSIjUmV3cml0ZVJ1bGUiPlJld3JpdGVSdWxlPC9BPgotPC9VTD4KLTxTVFJPTkc+TWlzY2VsbGFuZW91czwvU1RST05HPgotPFVMPgotICAgIDxMST48QSBIUkVGPSIjRW52VmFyIj5FbnZpcm9ubWVudCBWYXJpYWJsZXM8L0E+Ci0gICAgPExJPjxBIEhSRUY9IiNTb2x1dGlvbnMiPlByYWN0aWNhbCBTb2x1dGlvbnM8L0E+Ci08L1VMPgotCi08UD4KLTxIUiBOT1NIQURFIFNJWkU9MT4KLQotPENFTlRFUj4KLTxIMT48QSBOQU1FPSJJbnRlcm5hbCI+SW50ZXJuYWwgUHJvY2Vzc2luZzwvQT48L0gxPgotPC9DRU5URVI+Ci0KLTxQPgotPEhSIE5PU0hBREUgU0laRT0xPgotCi08UD4KLVRoZSBpbnRlcm5hbCBwcm9jZXNzaW5nIG9mIHRoaXMgbW9kdWxlIGlzIHZlcnkgY29tcGxleCBidXQgbmVlZHMgdG8gYmUKLWV4cGxhaW5lZCBvbmNlIGV2ZW4gdG8gdGhlIGF2ZXJhZ2UgdXNlciB0byBhdm9pZCBjb21tb24gbWlzdGFrZXMgYW5kIHRvIGxldAoteW91IGV4cGxvaXQgaXRzIGZ1bGwgZnVuY3Rpb25hbGl0eS4gCi0KLTxIMj48QSBOQU1FPSJJbnRlcm5hbEFQSSI+QVBJIFBoYXNlczwvQT48L0gyPgotCi08UD4KLUZpcnN0IHlvdSBoYXZlIHRvIHVuZGVyc3RhbmQgdGhhdCB3aGVuIEFwYWNoZSBwcm9jZXNzZXMgYSBIVFRQIHJlcXVlc3QgaXQgZG9lcwotdGhpcyBpbiBwaGFzZXMuIEEgaG9vayBmb3IgZWFjaCBvZiB0aGVzZSBwaGFzZXMgaXMgcHJvdmlkZWQgYnkgdGhlIEFwYWNoZSBBUEkuCi1Nb2RfcmV3cml0ZSB1c2VzIHR3byBvZiB0aGVzZSBob29rczogdGhlIFVSTC10by1maWxlbmFtZSB0cmFuc2xhdGlvbiBob29rCi13aGljaCBpcyB1c2VkIGFmdGVyIHRoZSBIVFRQIHJlcXVlc3Qgd2FzIHJlYWQgYW5kIGJlZm9yZSBhbnkgYXV0aG9yaXphdGlvbgotc3RhcnRzIGFuZCB0aGUgRml4dXAgaG9vayB3aGljaCBpcyB0cmlnZ2VyZWQgYWZ0ZXIgdGhlIGF1dGhvcml6YXRpb24gcGhhc2VzCi1hbmQgYWZ0ZXIgdGhlIHBlci1kaXJlY3RvcnkgY29uZmlnIGZpbGVzICg8Q09ERT4uaHRhY2Nlc3M8L0NPREU+KSB3aGVyZSByZWFkLAotYnV0IGJlZm9yZSB0aGUgY29udGVudCBoYW5kbGVyIGlzIGFjdGl2YXRlZC4KLQotPFA+Ci1TbywgYWZ0ZXIgYSByZXF1ZXN0IGNvbWVzIGluIGFuZCBBcGFjaGUgaGFzIGRldGVybWluZWQgdGhlIGNvcnJlc3BvbmRpbmcKLXNlcnZlciAob3IgdmlydHVhbCBzZXJ2ZXIpIHRoZSByZXdyaXRpbmcgZW5naW5lIHN0YXJ0IHByb2Nlc3Npbmcgb2YgYWxsCi1tb2RfcmV3cml0ZSBkaXJlY3RpdmVzIGZyb20gdGhlIHBlci1zZXJ2ZXIgY29uZmlndXJhdGlvbiBpbiB0aGUKLVVSTC10by1maWxlbmFtZSBwaGFzZS4gQSBmZXcgc3RlcHMgbGF0ZXIgd2hlbiB0aGUgZmluYWwgZGF0YSBkaXJlY3RvcmllcyBhcmUKLWZvdW5kLCB0aGUgcGVyLWRpcmVjdG9yeSBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMgb2YgbW9kX3Jld3JpdGUgYXJlIHRyaWdnZXJlZAotaW4gdGhlIEZpeHVwIHBoYXNlLiBJbiBib3RoIHNpdHVhdGlvbnMgbW9kX3Jld3JpdGUgZWl0aGVyIHJld3JpdGVzIFVSTHMgdG8gbmV3Ci1VUkxzIG9yIHRvIGZpbGVuYW1lcywgYWx0aG91Z2ggdGhlcmUgaXMgbm8gb2J2aW91cyBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRoZW0uCi1UaGlzIGlzIGEgdXNhZ2Ugb2YgdGhlIEFQSSB3aGljaCB3YXMgbm90IGludGVuZGVkIHRoaXMgd2F5IHdoZW4gdGhlIEFQSQotd2FzIGRlc2lnbmVkLCBidXQgYXMgb2YgQXBhY2hlIDEueCB0aGlzIGlzIHRoZSBvbmx5IHdheSBtb2RfcmV3cml0ZSBjYW4KLW9wZXJhdGUuIFRvIG1ha2UgdGhpcyBwb2ludCBtb3JlIGNsZWFyIHJlbWVtYmVyIHRoZSBmb2xsb3dpbmcgdHdvIHBvaW50czoKLQotPE9MPgotPExJPlRoZSBBUEkgY3VycmVudGx5IHByb3ZpZGVzIG9ubHkgYSBVUkwtdG8tZmlsZW5hbWUgaG9vay4gQWx0aG91Z2gKLSAgICBtb2RfcmV3cml0ZSByZXdyaXRlcyBVUkxzIHRvIFVSTHMsIFVSTHMgdG8gZmlsZW5hbWVzIGFuZCBldmVuCi0gICAgZmlsZW5hbWVzIHRvIGZpbGVuYW1lcy4gSW4gQXBhY2hlIDIuMCB0aGUgdHdvIG1pc3NpbmcgaG9va3MgCi0gICAgd2lsbCBiZSBhZGRlZCB0byBtYWtlIHRoZSBwcm9jZXNzaW5nIG1vcmUgY2xlYXIuIEJ1dCB0aGlzCi0gICAgcG9pbnQgaGFzIG5vIGRyYXdiYWNrcyBmb3IgdGhlIHVzZXIsIGl0IGlzIGp1c3QgYSBmYWN0IHdoaWNoCi0gICAgc2hvdWxkIGJlIHJlbWVtYmVyZWQ6IEFwYWNoZSBkb2VzIG1vcmUgaW4gdGhlIFVSTC10by1maWxlbmFtZSBob29rCi0gICAgdGhlbiB0aGUgQVBJIGludGVuZHMgZm9yIGl0LgotPFA+Ci08TEk+VW5iZWxpZXZhYmx5IG1vZF9yZXdyaXRlIHByb3ZpZGVzIFVSTCBtYW5pcHVsYXRpb25zIGluIHBlci1kaXJlY3RvcnkKLSAgICBjb250ZXh0LCA8RU0+aS5lLjwvRU0+LCB3aXRoaW4gPENPREU+Lmh0YWNjZXNzPC9DT0RFPiBmaWxlcywgYWx0aG91Z2gKLSAgICB0aGVzZSBhcmUKLSAgICByZWFjaGVkIGEgdmVyeSBsb25nIHRpbWUgYWZ0ZXIgdGhlIFVSTHMgd2VyZSB0cmFuc2xhdGVkIHRvIGZpbGVuYW1lcyAodGhpcwotICAgIGhhcyB0byBiZSB0aGlzIHdheSwgYmVjYXVzZSA8Q09ERT4uaHRhY2Nlc3M8L0NPREU+IGZpbGVzIHN0YXkgaW4gdGhlCi0gICAgZmlsZXN5c3RlbSwgc28gcHJvY2Vzc2luZyBoYXMgYWxyZWFkeSBiZWVuIHJlYWNoZWQgdGhpcyBzdGFnZSBvZgotICAgIHByb2Nlc3NpbmcpLiBJbiBvdGhlciB3b3JkczogQWNjb3JkaW5nIHRvIHRoZSBBUEkgcGhhc2VzIGF0IHRoaXMgdGltZSBpdAotICAgIGlzIHRvbyBsYXRlIGZvciBhbnkgVVJMIG1hbmlwdWxhdGlvbnMuICBUbyBvdmVyY29tZSB0aGlzIGNoaWNrZW4gYW5kIGVnZwotICAgIHByb2JsZW0gbW9kX3Jld3JpdGUgdXNlcyBhIHRyaWNrOiBXaGVuIHlvdSBtYW5pcHVsYXRlIGEgVVJML2ZpbGVuYW1lIGluCi0gICAgcGVyLWRpcmVjdG9yeSBjb250ZXh0IG1vZF9yZXdyaXRlIGZpcnN0IHJld3JpdGVzIHRoZSBmaWxlbmFtZSBiYWNrIHRvIGl0cwotICAgIGNvcnJlc3BvbmRpbmcgVVJMICh3aGljaCBpdCB1c3VhbGx5IGltcG9zc2libGUsIGJ1dCBzZWUgdGhlCi0gICAgPENPREU+UmV3cml0ZUJhc2U8L0NPREU+IGRpcmVjdGl2ZSBiZWxvdyBmb3IgdGhlIHRyaWNrIHRvIGFjaGlldmUgdGhpcykKLSAgICBhbmQgdGhlbiBpbml0aWF0ZXMgYSBuZXcgaW50ZXJuYWwgc3ViLXJlcXVlc3Qgd2l0aCB0aGUgbmV3IFVSTC4gVGhpcyBsZWFkcwotICAgIHRvIGEgbmV3IHByb2Nlc3Npbmcgb2YgdGhlIEFQSSBwaGFzZXMgZnJvbSB0aGUgYmVnaW5uaW5nLiAKLSAgICA8UD4KLSAgICBBZ2FpbiBtb2RfcmV3cml0ZSB0cmllcyBoYXJkIHRvIG1ha2UgdGhpcyBjb21wbGljYXRlZCBzdGVwIHRvdGFsbHkKLSAgICB0cmFuc3BhcmVudCB0byB0aGUgdXNlciwgYnV0IHlvdSBzaG91bGQgcmVtZW1iZXIgaGVyZTogV2hpbGUgVVJMCi0gICAgbWFuaXB1bGF0aW9ucyBpbiBwZXItc2VydmVyIGNvbnRleHQgYXJlIHJlYWxseSBmYXN0IGFuZCBlZmZpY2llbnQsCi0gICAgcGVyLWRpcmVjdG9yeSByZXdyaXRlcyBhcmUgc2xvdyBhbmQgaW5lZmZpY2llbnQgZHVlIHRvIHRoaXMgY2hpY2tlbiBhbmQKLSAgICBlZ2cgcHJvYmxlbS4gQnV0IG9uIHRoZSBvdGhlciBoYW5kIHRoaXMgaXMgdGhlIG9ubHkgd2F5IG1vZF9yZXdyaXRlIGNhbgotICAgIHByb3ZpZGUgKGxvY2FsbHkgcmVzdHJpY3RlZCkgVVJMIG1hbmlwdWxhdGlvbnMgdG8gdGhlIGF2ZXJhZ2UgdXNlci4KLTwvT0w+Ci0KLTxQPgotRG9uJ3QgZm9yZ2V0IHRoZXNlIHR3byBwb2ludHMhCi0KLTxIMj48QSBOQU1FPSJJbnRlcm5hbFJ1bGVzZXQiPlJ1bGVzZXQgUHJvY2Vzc2luZzwvQT48L0gyPgotCi1Ob3cgd2hlbiBtb2RfcmV3cml0ZSBpcyB0cmlnZ2VyZWQgaW4gdGhlc2UgdHdvIEFQSSBwaGFzZXMsIGl0IHJlYWRzIHRoZQotY29uZmlndXJlZCBydWxlc2V0cyBmcm9tIGl0cyBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAod2hpY2ggaXRzZWxmIHdhcyBlaXRoZXIKLWNyZWF0ZWQgb24gc3RhcnR1cCBmb3IgcGVyLXNlcnZlciBjb250ZXh0IG9yIHdoaWxlIHRoZSBkaXJlY3Rvcnkgd2FsayBvZiB0aGUKLUFwYWNoZSBrZXJuZWwgZm9yIHBlci1kaXJlY3RvcnkgY29udGV4dCkuICBUaGVuIHRoZSBVUkwgcmV3cml0aW5nIGVuZ2luZSBpcwotc3RhcnRlZCB3aXRoIHRoZSBjb250YWluZWQgcnVsZXNldCAob25lIG9yIG1vcmUgcnVsZXMgdG9nZXRoZXIgd2l0aCB0aGVpcgotY29uZGl0aW9ucykuIFRoZSBvcGVyYXRpb24gb2YgdGhlIFVSTCByZXdyaXRpbmcgZW5naW5lIGl0c2VsZiBpcyBleGFjdGx5IHRoZQotc2FtZSBmb3IgYm90aCBjb25maWd1cmF0aW9uIGNvbnRleHRzLiBKdXN0IHRoZSBmaW5hbCByZXN1bHQgcHJvY2Vzc2luZyBpcwotZGlmZmVyZW50LgotCi08UD4KLVRoZSBvcmRlciBvZiBydWxlcyBpbiB0aGUgcnVsZXNldCBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGUgcmV3cml0aW5nIGVuZ2luZQotcHJvY2Vzc2VzIHRoZW0gaW4gYSBzcGVjaWFsIG9yZGVyLiBBbmQgdGhpcyBvcmRlciBpcyBub3QgdmVyeSBvYnZpb3VzLiBUaGUKLXJ1bGUgaXMgdGhpczogVGhlIHJld3JpdGluZyBlbmdpbmUgbG9vcHMgdGhyb3VnaCB0aGUgcnVsZXNldCBydWxlIGJ5IHJ1bGUKLSg8Q09ERT5SZXdyaXRlUnVsZTwvQ09ERT4gZGlyZWN0aXZlcyEpIGFuZCB3aGVuIGEgcGFydGljdWxhciBydWxlIG1hdGNoZWQgaXQKLW9wdGlvbmFsbHkgbG9vcHMgdGhyb3VnaCBleGlzdGluZyBjb3JyZXNwb25kaW5nIGNvbmRpdGlvbnMKLSg8Q09ERT5SZXdyaXRlQ29uZDwvQ09ERT4gZGlyZWN0aXZlcykuIEJlY2F1c2Ugb2YgaGlzdG9yaWNhbCByZWFzb25zIHRoZSAKLWNvbmRpdGlvbnMgYXJlIGdpdmVuIGZpcnN0LCB0aGUgY29udHJvbCBmbG93IGlzIGEgbGl0dGxlIGJpdCB3aW5kZWQuIFNlZQotRmlndXJlIDEgZm9yIG1vcmUgZGV0YWlscy4KLQotPFA+Ci08RElWIEFMSUdOPUNFTlRFUj4KLTxUQUJMRSBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTIgQk9SREVSPTA+Ci08VFI+Ci08VEQgQkdDT0xPUj0iI0NDQ0NDQyI+PElNRyAKLSAgICBTUkM9Ii4uL2ltYWdlcy9tb2RfcmV3cml0ZV9maWcxLmdpZiIKLSAgICBXSURUSD0iNDI4IiBIRUlHSFQ9IjM4NSIKLSAgICBBTFQ9IltOZWVkcyBncmFwaGljcyBjYXBhYmlsaXR5IHRvIGRpc3BsYXldIj48L1REPgotPC9UUj4KLTxUUj4KLTxURCBBTElHTj1DRU5URVI+Ci08U1RST05HPkZpZ3VyZSAxOjwvU1RST05HPiBUaGUgY29udHJvbCBmbG93IHRocm91Z2ggdGhlIHJld3JpdGluZyBydWxlc2V0Ci08L1REPgotPC9UUj4KLTwvVEFCTEU+Ci08L0RJVj4KLQotPFA+Ci1BcyB5b3UgY2FuIHNlZSwgZmlyc3QgdGhlIFVSTCBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIDxFTT5QYXR0ZXJuPC9FTT4gb2YgZWFjaAotcnVsZS4gV2hlbiBpdCBmYWlscyBtb2RfcmV3cml0ZSBpbW1lZGlhdGVseSBzdG9wcyBwcm9jZXNzaW5nIHRoaXMgcnVsZSBhbmQKLWNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0IHJ1bGUuIElmIHRoZSA8RU0+UGF0dGVybjwvRU0+IG1hdGNoZWQsIG1vZF9yZXdyaXRlCi1sb29rcyBmb3IgY29ycmVzcG9uZGluZyBydWxlIGNvbmRpdGlvbnMuIElmIG5vbmUgYXJlIHByZXNlbnQsIGl0IGp1c3QKLXN1YnN0aXR1dGVzIHRoZSBVUkwgd2l0aCBhIG5ldyB2YWx1ZSB3aGljaCBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBzdHJpbmcKLTxFTT5TdWJzdGl0dXRpb248L0VNPiBhbmQgZ29lcyBvbiB3aXRoIGl0cyBydWxlLWxvb3BpbmcuIEJ1dAotaWYgY29uZGl0aW9ucyBleGlzdHMsIGl0IHN0YXJ0cyBhbiBpbm5lciBsb29wIGZvciBwcm9jZXNzaW5nIHRoZW0gaW4gb3JkZXIKLXRoZXkgYXJlIGxpc3RlZC4gRm9yIGNvbmRpdGlvbnMgdGhlIGxvZ2ljIGlzIGRpZmZlcmVudDogV2UgZG9uJ3QgbWF0Y2ggYQotcGF0dGVybiBhZ2FpbnN0IHRoZSBjdXJyZW50IFVSTC4gSW5zdGVhZCB3ZSBmaXJzdCBjcmVhdGUgYSBzdHJpbmcKLTxFTT5UZXN0U3RyaW5nPC9FTT4gYnkgZXhwYW5kaW5nIHZhcmlhYmxlcywgYmFjay1yZWZlcmVuY2VzLCBtYXAgbG9va3VwcywKLTxFTT5ldGMuPC9FTT4gYW5kIHRoZW4gd2UgdHJ5IHRvIG1hdGNoIDxFTT5Db25kUGF0dGVybjwvRU0+IGFnYWluc3QgaXQuIElmIHRoZQotcGF0dGVybiBkb2Vzbid0IG1hdGNoLCB0aGUgY29tcGxldGUgc2V0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBjb3JyZXNwb25kaW5nCi1ydWxlIGZhaWxzLiAgSWYgdGhlIHBhdHRlcm4gbWF0Y2hlcywgdGhlbiB0aGUgbmV4dCBjb25kaXRpb24gaXMgcHJvY2Vzc2VkCi11bnRpbCBubyBtb3JlIGNvbmRpdGlvbiBpcyBhdmFpbGFibGUuIElmIGFsbCBjb25kaXRpb25zIG1hdGNoZWQgcHJvY2Vzc2luZyBpcwotY29udGludWVkIHdpdGggdGhlIHN1YnN0aXR1dGlvbiBvZiB0aGUgVVJMIHdpdGggPEVNPlN1YnN0aXR1dGlvbjwvRU0+LgotCi08SDI+PEEgTkFNRT0iSW50ZXJuYWxCYWNrUmVmcyI+UmVnZXggQmFjay1SZWZlcmVuY2UgQXZhaWxhYmlsaXR5PC9BPjwvSDI+Ci0KLU9uZSBpbXBvcnRhbnQgdGhpbmcgaGVyZSBoYXMgdG8gYmUgcmVtZW1iZXJlZDogV2hlbmV2ZXIgeW91Ci11c2UgcGFyZW50aGVzaXMgaW4gPEVNPlBhdHRlcm48L0VNPiBvciBpbiBvbmUgb2YgdGhlIDxFTT5Db25kUGF0dGVybjwvRU0+Ci1iYWNrLXJlZmVyZW5jZSBhcmUgaW50ZXJuYWxseSBjcmVhdGVkIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggdGhlCi1zdHJpbmdzIDxDT0RFPiROPC9DT0RFPiBhbmQgPENPREU+JU48L0NPREU+IChzZWUgYmVsb3cpLiBBbmQgdGhlc2UKLWFyZSBhdmFpbGFibGUgZm9yIGNyZWF0aW5nIHRoZSBzdHJpbmdzIDxFTT5TdWJzdGl0dXRpb248L0VNPiBhbmQKLTxFTT5UZXN0Q29uZDwvRU0+LiBGaWd1cmUgMiBzaG93cyBhdCB3aGljaCBsb2NhdGlvbnMgdGhlIGJhY2stcmVmZXJlbmNlcyBhcmUKLXRyYW5zZmVyZWQgdG8gZm9yIGV4cGFuc2lvbi4KLQotPFA+Ci08RElWIEFMSUdOPUNFTlRFUj4KLTxUQUJMRSAgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0yIEJPUkRFUj0wPgotPFRSPgotPFREIEJHQ09MT1I9IiNDQ0NDQ0MiPjxJTUcgCi0gICAgU1JDPSIuLi9pbWFnZXMvbW9kX3Jld3JpdGVfZmlnMi5naWYiCi0gICAgV0lEVEg9IjM4MSIgSEVJR0hUPSIxNzkiCi0gICAgQUxUPSJbTmVlZHMgZ3JhcGhpY3MgY2FwYWJpbGl0eSB0byBkaXNwbGF5XSI+PC9URD4KLTwvVFI+Ci08VFI+Ci08VEQgQUxJR049Q0VOVEVSPgotPFNUUk9ORz5GaWd1cmUgMjo8L1NUUk9ORz4gVGhlIGJhY2stcmVmZXJlbmNlIGZsb3cgdGhyb3VnaCBhIHJ1bGUKLTwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLTwvRElWPgotCi08UD4KLVdlIGtub3csIHRoaXMgd2FzIGEgY3Jhc2ggY291cnNlIG9mIG1vZF9yZXdyaXRlJ3MgaW50ZXJuYWwgcHJvY2Vzc2luZy4gIEJ1dAoteW91IHdpbGwgYmVuZWZpdCBmcm9tIHRoaXMga25vd2xlZGdlIHdoZW4gcmVhZGluZyB0aGUgZm9sbG93aW5nIGRvY3VtZW50YXRpb24KLW9mIHRoZSBhdmFpbGFibGUgZGlyZWN0aXZlcy4KLQotPFA+Ci08SFIgTk9TSEFERSBTSVpFPTE+Ci0KLTxDRU5URVI+Ci08SDE+PEEgTkFNRT0iQ29uZmlndXJhdGlvbiI+Q29uZmlndXJhdGlvbiBEaXJlY3RpdmVzPC9BPjwvSDE+Ci08L0NFTlRFUj4KLQotPFA+Ci08SFIgTk9TSEFERSBTSVpFPTE+Ci0KLTxIMz48QSBOQU1FPSJSZXdyaXRlRW5naW5lIj5SZXdyaXRlRW5naW5lPC9BPjwvSDM+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+Ci0gICAgPENPREU+UmV3cml0ZUVuZ2luZTwvQ09ERT4gezxDT0RFPm9uLG9mZjwvQ09ERT59PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+Ci0gICAgPFNUUk9ORz48Q09ERT5SZXdyaXRlRW5naW5lIG9mZjwvQ09ERT48L1NUUk9ORz48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4KLSAgICBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwgLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gRmlsZUluZm88QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEV4dGVuc2lvbjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX3Jld3JpdGUuYzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBBcGFjaGUgMS4yPEJSPgotCi08UD4KLVRoZSA8Q09ERT5SZXdyaXRlRW5naW5lPC9DT0RFPiBkaXJlY3RpdmUgZW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgcnVudGltZQotcmV3cml0aW5nIGVuZ2luZS4gSWYgaXQgaXMgc2V0IHRvIDxDT0RFPm9mZjwvQ09ERT4gdGhpcyBtb2R1bGUgZG9lcyBubyBydW50aW1lCi1wcm9jZXNzaW5nIGF0IGFsbC4gSXQgZG9lcyBub3QgZXZlbiB1cGRhdGUgdGhlIDxDT0RFPlNDUklQVF9VUng8L0NPREU+Ci1lbnZpcm9ubWVudCB2YXJpYWJsZXMuCi0KLTxQPgotVXNlIHRoaXMgZGlyZWN0aXZlIHRvIGRpc2FibGUgdGhlIG1vZHVsZSBpbnN0ZWFkIG9mIGNvbW1lbnRpbmcgb3V0Ci1hbGwgPENPREU+UmV3cml0ZVJ1bGU8L0NPREU+IGRpcmVjdGl2ZXMhCi0KLTxQPgotTm90ZSB0aGF0LCBieSBkZWZhdWx0LCByZXdyaXRlIGNvbmZpZ3VyYXRpb25zIGFyZSBub3QgaW5oZXJpdGVkLgotVGhpcyBtZWFucyB0aGF0IHlvdSBuZWVkIHRvIGhhdmUgYSA8Q09ERT5SZXdyaXRlRW5naW5lIG9uPC9DT0RFPgotZGlyZWN0aXZlIGZvciBlYWNoIHZpcnR1YWwgaG9zdCB5b3Ugd2lzaCB0byB1c2UgaXQgaW4uCi0KLTxQPgotPEhSIE5PU0hBREUgU0laRT0xPgotPFA+Ci0KLTxIMz48QSBOQU1FPSJSZXdyaXRlT3B0aW9ucyI+UmV3cml0ZU9wdGlvbnM8L0E+PC9IMz4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gPENPREU+UmV3cml0ZU9wdGlvbnM8L0NPREU+IDxFTT5PcHRpb248L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8RU0+Tm9uZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LAotICAgIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IEZpbGVJbmZvPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBFeHRlbnNpb248QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9yZXdyaXRlLmM8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gQXBhY2hlIDEuMjxCUj4KLQotPFA+Ci1UaGUgPENPREU+UmV3cml0ZU9wdGlvbnM8L0NPREU+IGRpcmVjdGl2ZSBzZXRzIHNvbWUgc3BlY2lhbCBvcHRpb25zIGZvciB0aGUKLWN1cnJlbnQgcGVyLXNlcnZlciBvciBwZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24uIFRoZSA8RU0+T3B0aW9uPC9FTT4KLXN0cmluZ3MgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi08VUw+Ci08TEk+JzxTVFJPTkc+PENPREU+aW5oZXJpdDwvQ09ERT48L1NUUk9ORz4nPEJSPgotICAgIFRoaXMgZm9yY2VzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gdG8gaW5oZXJpdCB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUKLSAgICBwYXJlbnQuIEluIHBlci12aXJ0dWFsLXNlcnZlciBjb250ZXh0IHRoaXMgbWVhbnMgdGhhdCB0aGUgbWFwcywKLSAgICBjb25kaXRpb25zIGFuZCBydWxlcyBvZiB0aGUgbWFpbiBzZXJ2ZXIgZ2V0cyBpbmhlcml0ZWQuIEluIHBlci1kaXJlY3RvcnkKLSAgICBjb250ZXh0IHRoaXMgbWVhbnMgdGhhdCBjb25kaXRpb25zIGFuZCBydWxlcyBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeSdzCi0gICAgPENPREU+Lmh0YWNjZXNzPC9DT0RFPiBjb25maWd1cmF0aW9uIGdldHMgaW5oZXJpdGVkLgotPC9VTD4KLQotPFA+Ci08SFIgTk9TSEFERSBTSVpFPTE+Ci08UD4KLQotPEgzPjxBIE5BTUU9IlJld3JpdGVMb2ciPlJld3JpdGVMb2c8L0E+PC9IMz4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gPENPREU+UmV3cml0ZUxvZzwvQ09ERT4gPEVNPkZpbGVuYW1lPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPEVNPk5vbmU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiA8RU0+Tm90IGFwcGxpY2FibGU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gRXh0ZW5zaW9uPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfcmV3cml0ZS5jPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IEFwYWNoZSAxLjI8QlI+Ci0KLTxQPgotVGhlIDxDT0RFPlJld3JpdGVMb2c8L0NPREU+IGRpcmVjdGl2ZSBzZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHdoaWNoIHRoZQotc2VydmVyIGxvZ3MgYW55IHJld3JpdGluZyBhY3Rpb25zIGl0IHBlcmZvcm1zLiBJZiB0aGUgbmFtZSBkb2VzIG5vdCBiZWdpbgotd2l0aCBhIHNsYXNoICgnPENPREU+LzwvQ09ERT4nKSB0aGVuIGl0IGlzIGFzc3VtZWQgdG8gYmUgcmVsYXRpdmUgdG8gdGhlCi08RU0+U2VydmVyIFJvb3Q8L0VNPi4gIFRoZSBkaXJlY3RpdmUgc2hvdWxkIG9jY3VyIG9ubHkgb25jZSBwZXIgc2VydmVyCi1jb25maWcuCi0KLTxQPgotPFRBQkxFIFdJRFRIPSI3MCUiIEJPUkRFUj0wIEJHQ09MT1I9IiNFMEUwRjAiIENFTExTUEFDSU5HPTAgQ0VMTFBBRERJTkc9MTA+Ci08VFI+PFREPgotPFNUUk9ORz5Ob3RpY2U8L1NUUk9ORz46IFRvIGRpc2FibGUgdGhlIGxvZ2dpbmcgb2YgcmV3cml0aW5nIGFjdGlvbnMgaXQgaXMKLW5vdCByZWNvbW1lbmRlZCB0byBzZXQgPEVNPkZpbGVuYW1lPC9FTT4KLXRvIDxDT0RFPi9kZXYvbnVsbDwvQ09ERT4sIGJlY2F1c2UgYWx0aG91Z2ggdGhlIHJld3JpdGluZyBlbmdpbmUgZG9lcwotbm90IGNyZWF0ZSBvdXRwdXQgdG8gYSBsb2dmaWxlIGl0IHN0aWxsIGNyZWF0ZXMgdGhlIGxvZ2ZpbGUKLW91dHB1dCBpbnRlcm5hbGx5LiA8U1RST05HPlRoaXMgd2lsbCBzbG93IGRvd24gdGhlIHNlcnZlciB3aXRoIG5vIGFkdmFudGFnZQotdG8gdGhlIGFkbWluaXN0cmF0b3IhPC9TVFJPTkc+Ci1UbyBkaXNhYmxlIGxvZ2dpbmcgZWl0aGVyIHJlbW92ZSBvciBjb21tZW50IG91dCB0aGUKLTxDT0RFPlJld3JpdGVMb2c8L0NPREU+IGRpcmVjdGl2ZSBvciB1c2UgPENPREU+UmV3cml0ZUxvZ0xldmVsIDA8L0NPREU+IQotPC9URD48L1RSPgotPC9UQUJMRT4KLQotPFA+Ci08VEFCTEUgV0lEVEg9IjcwJSIgQk9SREVSPTAgQkdDT0xPUj0iI0UwRTBGMCIgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0xMD4KLTxUUj48VEQ+Ci08U1RST05HPlNlY3VyaXR5PC9TVFJPTkc+OiBTZWUgdGhlIDxBCi1IUkVGPSIuLi9taXNjL3NlY3VyaXR5X3RpcHMuaHRtbCI+QXBhY2hlIFNlY3VyaXR5Ci1UaXBzPC9BPiBkb2N1bWVudCBmb3IgZGV0YWlscyBvbiB3aHkgeW91ciBzZWN1cml0eSBjb3VsZCBiZSBjb21wcm9taXNlZCBpZiB0aGUKLWRpcmVjdG9yeSB3aGVyZSBsb2dmaWxlcyBhcmUgc3RvcmVkIGlzIHdyaXRhYmxlIGJ5IGFueW9uZSBvdGhlciB0aGFuIHRoZSB1c2VyCi10aGF0IHN0YXJ0cyB0aGUgc2VydmVyLgotPC9URD48L1RSPgotPC9UQUJMRT4KLQotPFA+Ci08U1RST05HPkV4YW1wbGU6PC9TVFJPTkc+Ci08QkxPQ0tRVU9URT4KLTxQUkU+Ci1SZXdyaXRlTG9nICIvdXNyL2xvY2FsL3Zhci9hcGFjaGUvbG9ncy9yZXdyaXRlLmxvZyIKLTwvUFJFPgotPC9CTE9DS1FVT1RFPgotCi08UD4KLTxIUiBOT1NIQURFIFNJWkU9MT4KLTxQPgotCi08SDM+PEEgTkFNRT0iUmV3cml0ZUxvZ0xldmVsIj5SZXdyaXRlTG9nTGV2ZWw8L0E+PC9IMz4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gPENPREU+UmV3cml0ZUxvZ0xldmVsPC9DT0RFPiA8RU0+TGV2ZWw8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8U1RST05HPjxDT0RFPlJld3JpdGVMb2dMZXZlbCAwPC9DT0RFPjwvU1RST05HPgotPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IDxFTT5Ob3QgYXBwbGljYWJsZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBFeHRlbnNpb248QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9yZXdyaXRlLmM8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gQXBhY2hlIDEuMjxCUj4KLQotPFA+Ci1UaGUgPENPREU+UmV3cml0ZUxvZ0xldmVsPC9DT0RFPiBkaXJlY3RpdmUgc2V0IHRoZSB2ZXJib3NpdHkgbGV2ZWwgb2YgdGhlCi1yZXdyaXRpbmcKLWxvZ2ZpbGUuICBUaGUgZGVmYXVsdCBsZXZlbCAwIG1lYW5zIG5vIGxvZ2dpbmcsIHdoaWxlIDkgb3IgbW9yZSBtZWFucwotdGhhdCBwcmFjdGljYWxseSBhbGwgYWN0aW9ucyBhcmUgbG9nZ2VkLgotCi08UD4KLVRvIGRpc2FibGUgdGhlIGxvZ2dpbmcgb2YgcmV3cml0aW5nIGFjdGlvbnMgc2ltcGx5IHNldCA8RU0+TGV2ZWw8L0VNPiB0byAwLgotVGhpcyBkaXNhYmxlcyBhbGwgcmV3cml0ZSBhY3Rpb24gbG9ncy4KLQotPFA+Ci08VEFCTEUgV0lEVEg9IjcwJSIgQk9SREVSPTAgQkdDT0xPUj0iI0UwRTBGMCIgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0xMD4KLTxUUj48VEQ+Ci08U1RST05HPk5vdGljZTo8L1NUUk9ORz4gVXNpbmcgYSBoaWdoIHZhbHVlIGZvciA8RU0+TGV2ZWw8L0VNPiB3aWxsIHNsb3cgZG93bgoteW91ciBBcGFjaGUKLXNlcnZlciBkcmFtYXRpY2FsbHkhIFVzZSB0aGUgcmV3cml0aW5nIGxvZ2ZpbGUgb25seSBmb3IgZGVidWdnaW5nIG9yIGF0IGxlYXN0Ci1hdCA8RU0+TGV2ZWw8L0VNPiBub3QgZ3JlYXRlciB0aGFuIDIhCi08L1REPjwvVFI+Ci08L1RBQkxFPgotCi0KLTxQPgotPFNUUk9ORz5FeGFtcGxlOjwvU1RST05HPgotPEJMT0NLUVVPVEU+Ci08UFJFPgotUmV3cml0ZUxvZ0xldmVsIDMKLTwvUFJFPgotPC9CTE9DS1FVT1RFPgotCi08UD4KLTxIUiBOT1NIQURFIFNJWkU9MT4KLTxQPgotCi08SDM+PEEgTkFNRT0iUmV3cml0ZUxvY2siPlJld3JpdGVMb2NrPC9BPjwvSDM+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IDxDT0RFPlJld3JpdGVMb2NrPC9DT0RFPiA8RU0+RmlsZW5hbWU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8RU0+Tm9uZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWc8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiA8RU0+Tm90IGFwcGxpY2FibGU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gRXh0ZW5zaW9uPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfcmV3cml0ZS5jPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IEFwYWNoZSAxLjM8QlI+Ci0KLTxQPgotVGhpcyBkaXJlY3RpdmUgc2V0cyB0aGUgZmlsZW5hbWUgZm9yIGEgc3luY2hyb25pemF0aW9uIGxvY2tmaWxlIHdoaWNoCi1tb2RfcmV3cml0ZSBuZWVkcyB0byBjb21tdW5pY2F0ZSB3aXRoIDxTQU1QPlJld3JpdGVNYXA8L1NBTVA+Ci08RU0+cHJvZ3JhbXM8L0VNPi4gU2V0IHRoaXMgbG9ja2ZpbGUgdG8gYSBsb2NhbCBwYXRoIChub3Qgb24gYSBORlMtbW91bnRlZAotZGV2aWNlKSB3aGVuIHlvdSB3YW50IHRvIHVzZSBhIHJld3JpdGluZyBtYXAtcHJvZ3JhbS4gSXQgaXMgbm90IHJlcXVpcmVkIGZvcgotYWxsIG90aGVyIHR5cGVzIG9mIHJld3JpdGluZyBtYXBzLgotCi08UD4KLTxIUiBOT1NIQURFIFNJWkU9MT4KLTxQPgotCi08SDM+PEEgTkFNRT0iUmV3cml0ZU1hcCI+UmV3cml0ZU1hcDwvQT48L0gzPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiA8Q09ERT5SZXdyaXRlTWFwPC9DT0RFPiA8RU0+TWFwTmFtZSA8L0VNPgotICAgIDxFTT5NYXBUeXBlPC9FTT48Q09ERT46PC9DT0RFPjxFTT5NYXBTb3VyY2U8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiBub3QgdXNlZCBwZXIgZGVmYXVsdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiA8RU0+Tm90IGFwcGxpY2FibGU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gRXh0ZW5zaW9uPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfcmV3cml0ZS5jPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IEFwYWNoZSAxLjIgKHBhcnRpYWxseSksIEFwYWNoZSAxLjM8QlI+Ci0KLTxQPgotVGhlIDxDT0RFPlJld3JpdGVNYXA8L0NPREU+IGRpcmVjdGl2ZSBkZWZpbmVzIGEgPEVNPlJld3JpdGluZyBNYXA8L0VNPgotd2hpY2ggY2FuIGJlIHVzZWQgaW5zaWRlIHJ1bGUgc3Vic3RpdHV0aW9uIHN0cmluZ3MgYnkgdGhlIG1hcHBpbmctZnVuY3Rpb25zCi10byBpbnNlcnQvc3Vic3RpdHV0ZSBmaWVsZHMgdGhyb3VnaCBhIGtleSBsb29rdXAuIFRoZSBzb3VyY2Ugb2YgdGhpcwotbG9va3VwIGNhbiBiZSBvZiB2YXJpb3VzIHR5cGVzLgotPFA+Ci0KLVRoZSA8QSBOQU1FPSJtYXBmdW5jIj48RU0+TWFwTmFtZTwvRU0+PC9BPiBpcyB0aGUgbmFtZSBvZiB0aGUgbWFwIGFuZCB3aWxsCi1iZSB1c2VkIHRvIHNwZWNpZnkgYSBtYXBwaW5nLWZ1bmN0aW9uIGZvciB0aGUgc3Vic3RpdHV0aW9uIHN0cmluZ3Mgb2YgYQotcmV3cml0aW5nIHJ1bGUgdmlhIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbnN0cnVjdHM6Ci0KLTxCTE9DS1FVT1RFPjxTVFJPTkc+Ci08Q09ERT4kezwvQ09ERT4gPEVNPk1hcE5hbWU8L0VNPiA8Q09ERT46PC9DT0RFPiA8RU0+TG9va3VwS2V5PC9FTT4KLTxDT0RFPn08L0NPREU+PEJSPgotPENPREU+JHs8L0NPREU+IDxFTT5NYXBOYW1lPC9FTT4gPENPREU+OjwvQ09ERT4gPEVNPkxvb2t1cEtleTwvRU0+Ci08Q09ERT58PC9DT0RFPiA8RU0+RGVmYXVsdFZhbHVlPC9FTT4gPENPREU+fTwvQ09ERT4KLTwvU1RST05HPjwvQkxPQ0tRVU9URT4KLQotV2hlbiBzdWNoIGEgY29uc3RydWN0IG9jY3VycyB0aGUgbWFwIDxFTT5NYXBOYW1lPC9FTT4KLWlzIGNvbnN1bHRlZCBhbmQgdGhlIGtleSA8RU0+TG9va3VwS2V5PC9FTT4gaXMgbG9va2VkLXVwLiBJZiB0aGUga2V5IGlzCi1mb3VuZCwgdGhlIG1hcC1mdW5jdGlvbiBjb25zdHJ1Y3QgaXMgc3Vic3RpdHV0ZWQgYnkgPEVNPlN1YnN0VmFsdWU8L0VNPi4gSWYKLXRoZSBrZXkgaXMgbm90IGZvdW5kIHRoZW4gaXQgaXMgc3Vic3RpdHV0ZWQgYnkgPEVNPkRlZmF1bHRWYWx1ZTwvRU0+IG9yCi10aGUgZW1wdHkgc3RyaW5nIGlmIG5vIDxFTT5EZWZhdWx0VmFsdWU8L0VNPiB3YXMgc3BlY2lmaWVkLgotCi08UD4KLVRoZSBmb2xsb3dpbmcgY29tYmluYXRpb25zIGZvciA8RU0+TWFwVHlwZTwvRU0+IGFuZCA8RU0+TWFwU291cmNlPC9FTT4KLWNhbiBiZSB1c2VkOgotCi08VUw+Ci08TEk+PFNUUk9ORz5TdGFuZGFyZCBQbGFpbiBUZXh0PC9TVFJPTkc+PEJSPgotICAgIE1hcFR5cGU6IDxDT0RFPnR4dDwvQ09ERT4sIE1hcFNvdXJjZTogVW5peCBmaWxlc3lzdGVtIHBhdGggdG8gdmFsaWQgcmVndWxhcgotICAgIGZpbGUKLSAgICA8UD4KLSAgICBUaGlzIGlzIHRoZSBzdGFuZGFyZCByZXdyaXRpbmcgbWFwIGZlYXR1cmUgd2hlcmUgdGhlIDxFTT5NYXBTb3VyY2U8L0VNPiBpcwotICAgIGEgcGxhaW4gQVNDSUkgZmlsZSBjb250YWluaW5nIGVpdGhlciBibGFuayBsaW5lcywgY29tbWVudCBsaW5lcyAoc3RhcnRpbmcKLSAgICB3aXRoIGEgJyMnIGNoYXJhY3Rlcikgb3IgcGFpcnMgbGlrZSB0aGUgZm9sbG93aW5nIC0gb25lIHBlciBsaW5lLgotCi0gICAgPEJMT0NLUVVPVEU+PFNUUk9ORz4KLSAgICA8RU0+TWF0Y2hpbmdLZXk8L0VNPiAgPEVNPlN1YnN0VmFsdWU8L0VNPgotICAgIDwvU1RST05HPjwvQkxPQ0tRVU9URT4KLQotICAgIDxQPgotICAgIEV4YW1wbGU6Ci08UD4KLTxUQUJMRSBCT1JERVI9MCBDRUxMU1BBQ0lORz0xIENFTExQQURESU5HPTUgQkdDT0xPUj0iI0YwRjBGMCI+Ci08VFI+PFREPjxQUkU+Ci0jIwotIyMgIG1hcC50eHQgLS0gcmV3cml0aW5nIG1hcAotIyMKLQotUmFsZi5TLkVuZ2Vsc2NoYWxsICAgIHJzZSAgICMgQmFzdGFyZCBPcGVyYXRvciBGcm9tIEhlbGwKLU1yLkpvZS5BdmVyYWdlICAgICAgICBqb2UgICAjIE1yLiBBdmVyYWdlCi08L1BSRT48L1REPjwvVFI+Ci08L1RBQkxFPgotCi08UD4KLTxUQUJMRSBCT1JERVI9MCBDRUxMU1BBQ0lORz0xIENFTExQQURESU5HPTUgQkdDT0xPUj0iI0YwRjBGMCI+Ci08VFI+PFREPjxQUkU+Ci1SZXdyaXRlTWFwIHJlYWwtdG8tdXNlciB0eHQ6L3BhdGgvdG8vZmlsZS9tYXAudHh0Ci08L1BSRT48L1REPjwvVFI+Ci08L1RBQkxFPgotCi08UD4KLTxMST48U1RST05HPlJhbmRvbWl6ZWQgUGxhaW4gVGV4dDwvU1RST05HPjxCUj4KLSAgICBNYXBUeXBlOiA8Q09ERT5ybmQ8L0NPREU+LCBNYXBTb3VyY2U6IFVuaXggZmlsZXN5c3RlbSBwYXRoIHRvIHZhbGlkIHJlZ3VsYXIKLSAgICBmaWxlCi0gICAgPFA+Ci0gICAgVGhpcyBpcyBpZGVudGljYWwgdG8gdGhlIFN0YW5kYXJkIFBsYWluIFRleHQgdmFyaWFudCBhYm92ZSBidXQgd2l0aCBhCi0gICAgc3BlY2lhbAotICAgIHBvc3QtcHJvY2Vzc2luZyBmZWF0dXJlOiBBZnRlciBsb29raW5nIHVwIGEgdmFsdWUgaXQgaXMgcGFyc2VkIGFjY29yZGluZwotICAgIHRvIGNvbnRhaW5lZCBgYDxDT0RFPnw8L0NPREU+JycgY2hhcmFjdGVycyB3aGljaCBoYXZlIHRoZSBtZWFuaW5nIG9mCi0gICAgYGBvcicnLiAgT3IKLSAgICBpbiBvdGhlciB3b3JkczogdGhleSBpbmRpY2F0ZSBhIHNldCBvZiBhbHRlcm5hdGl2ZXMgZnJvbSB3aGljaCB0aGUgYWN0dWFsCi0gICAgcmV0dXJuZWQgdmFsdWUgaXMgY2hvc2VuIHJhbmRvbWx5LiBBbHRob3VnaCB0aGlzIHNvdW5kcyBjcmF6eSBhbmQgdXNlbGVzcywKLSAgICBpdAotICAgIHdhcyBhY3R1YWxseSBkZXNpZ25lZCBmb3IgbG9hZCBiYWxhbmNpbmcgaW4gYSByZXZlcnNlIHByb3h5IHNpdHVhdGlvbiB3aGVyZQotICAgIHRoZSBsb29rZWQgdXAgdmFsdWVzIGFyZSBzZXJ2ZXIgbmFtZXMuCi0gICAgRXhhbXBsZToKLTxQPgotPFRBQkxFIEJPUkRFUj0wIENFTExTUEFDSU5HPTEgQ0VMTFBBRERJTkc9NSBCR0NPTE9SPSIjRjBGMEYwIj4KLTxUUj48VEQ+PFBSRT4KLSMjCi0jIyAgbWFwLnR4dCAtLSByZXdyaXRpbmcgbWFwCi0jIwotCi1zdGF0aWMgICB3d3cxfHd3dzJ8d3d3M3x3d3c0Ci1keW5hbWljICB3d3c1fHd3dzYKLTwvUFJFPjwvVEQ+PC9UUj4KLTwvVEFCTEU+Ci0KLTxQPgotPFRBQkxFIEJPUkRFUj0wIENFTExTUEFDSU5HPTEgQ0VMTFBBRERJTkc9NSBCR0NPTE9SPSIjRjBGMEYwIj4KLTxUUj48VEQ+PFBSRT4KLVJld3JpdGVNYXAgc2VydmVycyBybmQ6L3BhdGgvdG8vZmlsZS9tYXAudHh0Ci08L1BSRT48L1REPjwvVFI+Ci08L1RBQkxFPgotCi08UD4KLTxMST48U1RST05HPkhhc2ggRmlsZTwvU1RST05HPjxCUj4KLSAgICBNYXBUeXBlOiA8Q09ERT5kYm08L0NPREU+LCBNYXBTb3VyY2U6IFVuaXggZmlsZXN5c3RlbSBwYXRoIHRvIHZhbGlkCi0gICAgcmVndWxhciBmaWxlCi0gICAgPFA+Ci0gICAgSGVyZSB0aGUgc291cmNlIGlzIGEgYmluYXJ5IE5EQk0gZm9ybWF0IGZpbGUgY29udGFpbmluZyB0aGUgc2FtZSBjb250ZW50cwotICAgIGFzIGEgPEVNPlBsYWluIFRleHQ8L0VNPiBmb3JtYXQgZmlsZSwgYnV0IGluIGEgc3BlY2lhbCByZXByZXNlbnRhdGlvbgotICAgIHdoaWNoIGlzIG9wdGltaXplZCBmb3IgcmVhbGx5IGZhc3QgbG9va3Vwcy4gWW91IGNhbiBjcmVhdGUgc3VjaCBhIGZpbGUgd2l0aAotICAgIGFueSBOREJNIHRvb2wgb3Igd2l0aCB0aGUgZm9sbG93aW5nIFBlcmwgc2NyaXB0OgotICAgIDxQPgotICAgIDxUQUJMRSBCT1JERVI9MCBDRUxMU1BBQ0lORz0xIENFTExQQURESU5HPTUgQkdDT0xPUj0iI0YwRjBGMCI+Ci0gICAgPFRSPjxURD48UFJFPgotIyEvcGF0aC90by9iaW4vcGVybAotIyMKLSMjICB0eHQyZGJtIC0tIGNvbnZlcnQgdHh0IG1hcCB0byBkYm0gZm9ybWF0Ci0jIwotCi0oJHR4dG1hcCwgJGRibW1hcCkgPSBAQVJHVjsKLW9wZW4oVFhULCAiJmx0OyR0eHRtYXAiKTsKLWRibW9wZW4oJURCLCAkZGJtbWFwLCAwNjQ0KTsKLXdoaWxlICgmbHQ7VFhUJmd0OykgewotICAgIG5leHQgaWYgKG18XnMqIy4qfCBvciBtfF5zKiR8KTsKLSAgICAkREJ7JDF9ID0gJDIgaWYgKG18XlxzKihcUyspXHMrKFxTKykkfCk7Ci19Ci1kYm1jbG9zZSglREIpOwotY2xvc2UoVFhUKTwvUFJFPjwvVEQ+PC9UUj4KLSAgICA8L1RBQkxFPgotICAgIDxQPgotICAgIDxUQUJMRSBCT1JERVI9MCBDRUxMU1BBQ0lORz0xIENFTExQQURESU5HPTUgQkdDT0xPUj0iI0YwRjBGMCI+Ci0gICAgPFRSPjxURD48UFJFPiQgdHh0MmRibSBtYXAudHh0IG1hcC5kYiA8L1BSRT48L1REPjwvVFI+Ci0gICAgPC9UQUJMRT4KLTxQPgotPExJPjxTVFJPTkc+SW50ZXJuYWwgRnVuY3Rpb248L1NUUk9ORz48QlI+Ci0gICAgTWFwVHlwZTogPENPREU+aW50PC9DT0RFPiwgTWFwU291cmNlOiBJbnRlcm5hbCBBcGFjaGUgZnVuY3Rpb24KLSAgICA8UD4KLSAgICBIZXJlIHRoZSBzb3VyY2UgaXMgYW4gaW50ZXJuYWwgQXBhY2hlIGZ1bmN0aW9uLiBDdXJyZW50bHkgeW91IGNhbm5vdAotICAgIGNyZWF0ZSB5b3VyIG93biwgYnV0IHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFscmVhZHkgZXhpc3RzOgotICAgIDxVTD4gCi0gICAgPExJPjxTVFJPTkc+dG91cHBlcjwvU1RST05HPjo8QlI+Ci0gICAgICAgIENvbnZlcnRzIHRoZSBsb29rZWQgdXAga2V5IHRvIGFsbCB1cHBlciBjYXNlLgotICAgIDxMST48U1RST05HPnRvbG93ZXI8L1NUUk9ORz46PEJSPgotICAgICAgICBDb252ZXJ0cyB0aGUgbG9va2VkIHVwIGtleSB0byBhbGwgbG93ZXIgY2FzZS4KLSAgICA8TEk+PFNUUk9ORz5lc2NhcGU8L1NUUk9ORz46PEJSPgotICAgICAgICBUcmFuc2xhdGVzIHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgbG9va2VkIHVwIGtleSB0byBoZXgtZW5jb2RpbmdzLgotICAgIDxMST48U1RST05HPnVuZXNjYXBlPC9TVFJPTkc+OjxCUj4KLSAgICAgICAgVHJhbnNsYXRlcyBoZXgtZW5jb2RpbmdzIGluIHRoZSBsb29rZWQgdXAga2V5IGJhY2sgdG8gc3BlY2lhbCBjaGFyYWN0ZXJzLgotICAgIDwvVUw+Ci08UD4KLTxMST48U1RST05HPkV4dGVybmFsIFJld3JpdGluZyBQcm9ncmFtPC9TVFJPTkc+PEJSPgotICAgIE1hcFR5cGU6IDxDT0RFPnByZzwvQ09ERT4sIE1hcFNvdXJjZTogVW5peCBmaWxlc3lzdGVtIHBhdGggdG8gdmFsaWQKLSAgICByZWd1bGFyIGZpbGUKLSAgICA8UD4KLSAgICBIZXJlIHRoZSBzb3VyY2UgaXMgYSBVbml4IHByb2dyYW0sIG5vdCBhIG1hcCBmaWxlLiBUbyBjcmVhdGUgaXQgeW91IGNhbiB1c2UKLSAgICB0aGUgbGFuZ3VhZ2Ugb2YgeW91ciBjaG9pY2UsIGJ1dCB0aGUgcmVzdWx0IGhhcyB0byBiZSBhIHJ1bi1hYmxlIFVuaXgKLSAgICBleGVjdXRhYmxlICg8RU0+aS5lLjwvRU0+LCBlaXRoZXIgb2JqZWN0LWNvZGUgb3IgYSBzY3JpcHQgd2l0aCB0aGUKLSAgICBtYWdpYyBjb29raWUgdHJpY2sgJzxDT0RFPiMhL3BhdGgvdG8vaW50ZXJwcmV0ZXI8L0NPREU+JyBhcyB0aGUgZmlyc3QKLSAgICBsaW5lKS4KLSAgICA8UD4KLSAgICBUaGlzIHByb2dyYW0gZ2V0cyBzdGFydGVkIG9uY2UgYXQgc3RhcnR1cCBvZiB0aGUgQXBhY2hlIHNlcnZlcnMgYW5kIHRoZW4KLSAgICBjb21tdW5pY2F0ZXMgd2l0aCB0aGUgcmV3cml0aW5nIGVuZ2luZSBvdmVyIGl0cyA8Q09ERT5zdGRpbjwvQ09ERT4gYW5kCi0gICAgPENPREU+c3Rkb3V0PC9DT0RFPiBmaWxlLWhhbmRsZXMuICBGb3IgZWFjaCBtYXAtZnVuY3Rpb24gbG9va3VwIGl0IHdpbGwKLSAgICByZWNlaXZlIHRoZSBrZXkgdG8gbG9va3VwIGFzIGEgbmV3bGluZS10ZXJtaW5hdGVkIHN0cmluZyBvbgotICAgIDxDT0RFPnN0ZGluPC9DT0RFPi4gSXQgdGhlbiBoYXMgdG8gZ2l2ZSBiYWNrIHRoZSBsb29rZWQtdXAgdmFsdWUgYXMgYQotICAgIG5ld2xpbmUtdGVybWluYXRlZCBzdHJpbmcgb24gPENPREU+c3Rkb3V0PC9DT0RFPiBvciB0aGUgZm91ci1jaGFyYWN0ZXIKLSAgICBzdHJpbmcgYGA8Q09ERT5OVUxMPC9DT0RFPicnIGlmIGl0IGZhaWxzICg8RU0+aS5lLjwvRU0+LCB0aGVyZSBpcyBubwotICAgIGNvcnJlc3BvbmRpbmcgdmFsdWUKLSAgICBmb3IgdGhlIGdpdmVuIGtleSkuIEEgdHJpdmlhbCBwcm9ncmFtIHdoaWNoIHdpbGwgaW1wbGVtZW50IGEgMToxIG1hcAotICAgICg8RU0+aS5lLjwvRU0+LCBrZXkgPT0gdmFsdWUpIGNvdWxkIGJlOgotICAgIDxQPgotPFRBQkxFIEJPUkRFUj0wIENFTExTUEFDSU5HPTEgQ0VMTFBBRERJTkc9NSBCR0NPTE9SPSIjRjBGMEYwIj4KLTxUUj48VEQ+PFBSRT4KLSMhL3Vzci9iaW4vcGVybAotJHwgPSAxOwotd2hpbGUgKCZsdDtTVERJTiZndDspIHsKLSAgICAjIC4uLmhlcmUgYW55IHRyYW5zZm9ybWF0aW9ucwotICAgICMgb3IgbG9va3VwcyBzaG91bGQgb2NjdXIuLi4KLSAgICBwcmludCAkXzsKLX0KLTwvUFJFPjwvVEQ+PC9UUj4KLTwvVEFCTEU+Ci0gICAgPFA+Ci0gICAgQnV0IGJlIHZlcnkgY2FyZWZ1bDo8QlI+Ci0gICAgPE9MPgotICAgIDxMST5gYDxFTT5LZWVwIHRoZSBwcm9ncmFtIHNpbXBsZSwgc3R1cGlkPC9FTT4nJyAoS0lTUyksIGJlY2F1c2UKLSAgICAgICAgaWYgdGhpcyBwcm9ncmFtIGhhbmdzIGl0IHdpbGwgbGVhZCB0byBhIGhhbmcgb2YgdGhlIEFwYWNoZSBzZXJ2ZXIKLSAgICAgICAgd2hlbiB0aGUgcnVsZSBvY2N1cnMuCi0gICAgPExJPkF2b2lkIG9uZSBjb21tb24gbWlzdGFrZTogbmV2ZXIgZG8gYnVmZmVyZWQgSS9PIG9uIDxDT0RFPnN0ZG91dDwvQ09ERT4hCi0gICAgICAgIFRoaXMgd2lsbCBjYXVzZSBhIGRlYWRsb29wISBIZW5jZSB0aGUgYGA8Q09ERT4kfD0xPC9DT0RFPicnIGluIHRoZQotICAgICAgICBhYm92ZSBleGFtcGxlLi4uCi0gICAgPExJPlVzZSB0aGUgPFNBTVA+UmV3cml0ZUxvY2s8L1NBTVA+IGRpcmVjdGl2ZSB0byBkZWZpbmUgYSBsb2NrZmlsZQotICAgICAgICBtb2RfcmV3cml0ZSBjYW4gdXNlIHRvIHN5bmNocm9uaXplIHRoZSBjb21tdW5pY2F0aW9uIHRvIHRoZSBwcm9ncmFtLgotICAgICAgICBQZXIgZGVmYXVsdCBubyBzdWNoIHN5bmNocm9uaXphdGlvbiB0YWtlcyBwbGFjZS4KLSAgICA8L09MPgotPC9VTD4KLQotVGhlIDxDT0RFPlJld3JpdGVNYXA8L0NPREU+IGRpcmVjdGl2ZSBjYW4gb2NjdXIgbW9yZSB0aGFuIG9uY2UuIEZvciBlYWNoCi1tYXBwaW5nLWZ1bmN0aW9uIHVzZSBvbmUgPENPREU+UmV3cml0ZU1hcDwvQ09ERT4gZGlyZWN0aXZlIHRvIGRlY2xhcmUgaXRzCi1yZXdyaXRpbmcgbWFwZmlsZS4gV2hpbGUgeW91IGNhbm5vdCA8U1RST05HPmRlY2xhcmU8L1NUUk9ORz4gYSBtYXAgaW4KLXBlci1kaXJlY3RvcnkgY29udGV4dCBpdCBpcyBvZiBjb3Vyc2UgcG9zc2libGUgdG8gPFNUUk9ORz51c2U8L1NUUk9ORz4KLXRoaXMgbWFwIGluIHBlci1kaXJlY3RvcnkgY29udGV4dC4KLQotPFA+Ci08VEFCTEUgV0lEVEg9IjcwJSIgQk9SREVSPTAgQkdDT0xPUj0iI0UwRTBGMCIgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0xMD4KLTxUUj48VEQ+Ci08U1RST05HPk5vdGljZTo8L1NUUk9ORz4gRm9yIHBsYWluIHRleHQgYW5kIERCTSBmb3JtYXQgZmlsZXMgdGhlIGxvb2tlZC11cAota2V5cyBhcmUgY2FjaGVkIGluLWNvcmUKLXVudGlsIHRoZSA8Q09ERT5tdGltZTwvQ09ERT4gb2YgdGhlIG1hcGZpbGUgY2hhbmdlcyBvciB0aGUgc2VydmVyIGRvZXMgYQotcmVzdGFydC4gVGhpcyB3YXkgeW91IGNhbiBoYXZlIG1hcC1mdW5jdGlvbnMgaW4gcnVsZXMgd2hpY2ggYXJlIHVzZWQKLWZvciA8U1RST05HPmV2ZXJ5PC9TVFJPTkc+IHJlcXVlc3QuIFRoaXMgaXMgbm8gcHJvYmxlbSwgYmVjYXVzZSB0aGUKLWV4dGVybmFsIGxvb2t1cCBvbmx5IGhhcHBlbnMgb25jZSEKLTwvVEQ+PC9UUj4KLTwvVEFCTEU+Ci0KLTxQPgotPEhSIE5PU0hBREUgU0laRT0xPgotPFA+Ci0KLTxIMz48QSBOQU1FPSJSZXdyaXRlQmFzZSI+UmV3cml0ZUJhc2U8L0E+PC9IMz4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gPENPREU+UmV3cml0ZUJhc2U8L0NPREU+IDxFTT5CYXNlVVJMPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPEVNPmRlZmF1bHQgaXMgdGhlIHBoeXNpY2FsIGRpcmVjdG9yeSBwYXRoPC9FTT4KLTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBkaXJlY3RvcnksIC5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IDxFTT5GaWxlSW5mbzwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBFeHRlbnNpb248QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9yZXdyaXRlLmM8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gQXBhY2hlIDEuMjxCUj4KLQotPFA+Ci1UaGUgPENPREU+UmV3cml0ZUJhc2U8L0NPREU+IGRpcmVjdGl2ZSBleHBsaWNpdGx5IHNldHMgdGhlIGJhc2UgVVJMIGZvcgotcGVyLWRpcmVjdG9yeSByZXdyaXRlcy4gQXMgeW91IHdpbGwgc2VlIGJlbG93LCA8Q09ERT5SZXdyaXRlUnVsZTwvQ09ERT4gY2FuIGJlCi11c2VkIGluIHBlci1kaXJlY3RvcnkgY29uZmlnIGZpbGVzICg8Q09ERT4uaHRhY2Nlc3M8L0NPREU+KS4gVGhlcmUgaXQgd2lsbCBhY3QKLWxvY2FsbHksIDxFTT5pLmUuPC9FTT4sIHRoZSBsb2NhbCBkaXJlY3RvcnkgcHJlZml4IGlzIHN0cmlwcGVkIGF0IHRoaXMgc3RhZ2Ugb2YKLXByb2Nlc3NpbmcgYW5kIHlvdXIgcmV3cml0aW5nIHJ1bGVzIGFjdCBvbmx5IG9uIHRoZSByZW1haW5kZXIuIEF0IHRoZSBlbmQKLWl0IGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQuCi0KLTxQPgotV2hlbiBhIHN1YnN0aXR1dGlvbiBvY2N1cnMgZm9yIGEgbmV3IFVSTCwgdGhpcyBtb2R1bGUgaGFzIHRvIHJlLWluamVjdCB0aGUgVVJMCi1pbnRvIHRoZSBzZXJ2ZXIgcHJvY2Vzc2luZy4gVG8gYmUgYWJsZSB0byBkbyB0aGlzIGl0IG5lZWRzIHRvIGtub3cgd2hhdCB0aGUKLWNvcnJlc3BvbmRpbmcgVVJMLXByZWZpeCBvciBVUkwtYmFzZSBpcy4gQnkgZGVmYXVsdCB0aGlzIHByZWZpeCBpcyB0aGUKLWNvcnJlc3BvbmRpbmcgZmlsZXBhdGggaXRzZWxmLiA8U1RST05HPkJ1dCBhdCBtb3N0IHdlYnNpdGVzIFVSTHMgYXJlCi08U1RST05HPk5PVDwvU1RST05HPiBkaXJlY3RseSByZWxhdGVkIHRvIHBoeXNpY2FsIGZpbGVuYW1lIHBhdGhzLCBzbyB0aGlzCi1hc3N1bXB0aW9uIHdpbGwgYmUgdXN1YWxseSBiZSB3cm9uZyE8L1NUUk9ORz4gVGhlcmUgeW91IGhhdmUgdG8gdXNlIHRoZQotPENPREU+UmV3cml0ZUJhc2U8L0NPREU+IGRpcmVjdGl2ZSB0byBzcGVjaWZ5IHRoZSBjb3JyZWN0IFVSTC1wcmVmaXguCi0KLTxQPgotPFRBQkxFIFdJRFRIPSI3MCUiIEJPUkRFUj0wIEJHQ09MT1I9IiNFMEUwRjAiIENFTExTUEFDSU5HPTAgQ0VMTFBBRERJTkc9MTA+Ci08VFI+PFREPgotPFNUUk9ORz5Ob3RpY2U6PC9TVFJPTkc+IElmIHlvdXIgd2Vic2VydmVyJ3MgVVJMcyBhcmUgPFNUUk9ORz5ub3Q8L1NUUk9ORz4KLWRpcmVjdGx5IHJlbGF0ZWQgdG8gcGh5c2ljYWwgZmlsZSBwYXRocywgeW91IGhhdmUgdG8gdXNlCi08Q09ERT5SZXdyaXRlQmFzZTwvQ09ERT4gaW4gZXZlcnkKLTxDT0RFPi5odGFjY2VzczwvQ09ERT4gZmlsZXMgd2hlcmUgeW91IHdhbnQgdG8gdXNlIDxDT0RFPlJld3JpdGVSdWxlPC9DT0RFPgotZGlyZWN0aXZlcy4KLTwvVEQ+PC9UUj4KLTwvVEFCTEU+Ci0KLTxQPgotPFNUUk9ORz5FeGFtcGxlOjwvU1RST05HPgotCi08QkxPQ0tRVU9URT4KLSAgIEFzc3VtZSB0aGUgZm9sbG93aW5nIHBlci1kaXJlY3RvcnkgY29uZmlnIGZpbGU6Ci0KLTxQPgotPFRBQkxFIEJPUkRFUj0wIENFTExTUEFDSU5HPTEgQ0VMTFBBRERJTkc9NSBCR0NPTE9SPSIjRjBGMEYwIj4KLTxUUj48VEQ+PFBSRT4KLSMKLSMgIC9hYmMvZGVmLy5odGFjY2VzcyAtLSBwZXItZGlyIGNvbmZpZyBmaWxlIGZvciBkaXJlY3RvcnkgL2FiYy9kZWYKLSMgIFJlbWVtYmVyOiAvYWJjL2RlZiBpcyB0aGUgcGh5c2ljYWwgcGF0aCBvZiAveHl6LCA8RU0+aS5lLjwvRU0+LCB0aGUgc2VydmVyCi0jICAgICAgICAgICAgaGFzIGEgJ0FsaWFzIC94eXogL2FiYy9kZWYnIGRpcmVjdGl2ZSA8RU0+ZS5nLjwvRU0+Ci0jCi0KLVJld3JpdGVFbmdpbmUgT24KLQotIyAgbGV0IHRoZSBzZXJ2ZXIga25vdyB0aGF0IHdlIGFyZSByZWFjaGVkIHZpYSAveHl6IGFuZCBub3QKLSMgIHZpYSB0aGUgcGh5c2ljYWwgcGF0aCBwcmVmaXggL2FiYy9kZWYKLVJld3JpdGVCYXNlICAgL3h5egotCi0jICBub3cgdGhlIHJld3JpdGluZyBydWxlcwotUmV3cml0ZVJ1bGUgICBeb2xkc3R1ZmZcLmh0bWwkICBuZXdzdHVmZi5odG1sCi08L1BSRT48L1REPjwvVFI+Ci08L1RBQkxFPgotCi08UD4KLUluIHRoZSBhYm92ZSBleGFtcGxlLCBhIHJlcXVlc3QgdG8gPENPREU+L3h5ei9vbGRzdHVmZi5odG1sPC9DT0RFPgotZ2V0cyBjb3JyZWN0bHkKLXJld3JpdHRlbiB0byB0aGUgcGh5c2ljYWwgZmlsZSA8Q09ERT4vYWJjL2RlZi9uZXdzdHVmZi5odG1sPC9DT0RFPi4KLQotPFA+Ci08VEFCTEUgV0lEVEg9IjcwJSIgQk9SREVSPTAgQkdDT0xPUj0iI0UwRTBGMCIgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0xMD4KLTxUUj48VEQ+Ci08Rk9OVCBTSVpFPS0xPgotPFNUUk9ORz5Ob3RpY2UgLSBGb3IgdGhlIEFwYWNoZSBoYWNrZXJzOjwvU1RST05HPjxCUj4KLVRoZSBmb2xsb3dpbmcgbGlzdCBnaXZlcyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50ZXJuYWwKLXByb2Nlc3Npbmcgc3RlcHM6Ci0KLTxQPgotPFBSRT4KLVJlcXVlc3Q6Ci0gIC94eXovb2xkc3R1ZmYuaHRtbAotCi1JbnRlcm5hbCBQcm9jZXNzaW5nOgotICAveHl6L29sZHN0dWZmLmh0bWwgICAgIC0mZ3Q7IC9hYmMvZGVmL29sZHN0dWZmLmh0bWwgIChwZXItc2VydmVyIEFsaWFzKQotICAvYWJjL2RlZi9vbGRzdHVmZi5odG1sIC0mZ3Q7IC9hYmMvZGVmL25ld3N0dWZmLmh0bWwgIChwZXItZGlyICAgIFJld3JpdGVSdWxlKQotICAvYWJjL2RlZi9uZXdzdHVmZi5odG1sIC0mZ3Q7IC94eXovbmV3c3R1ZmYuaHRtbCAgICAgIChwZXItZGlyICAgIFJld3JpdGVCYXNlKQotICAveHl6L25ld3N0dWZmLmh0bWwgICAgIC0mZ3Q7IC9hYmMvZGVmL25ld3N0dWZmLmh0bWwgIChwZXItc2VydmVyIEFsaWFzKQotCi1SZXN1bHQ6Ci0gIC9hYmMvZGVmL25ld3N0dWZmLmh0bWwKLTwvUFJFPgotCi1UaGlzIHNlZW1zIHZlcnkgY29tcGxpY2F0ZWQgYnV0IGlzIHRoZSBjb3JyZWN0IEFwYWNoZSBpbnRlcm5hbCBwcm9jZXNzaW5nLAotYmVjYXVzZSB0aGUgcGVyLWRpcmVjdG9yeSByZXdyaXRpbmcgY29tZXMgdG9vIGxhdGUgaW4gdGhlIHByb2Nlc3MuICBTbywKLXdoZW4gaXQgb2NjdXJzIHRoZSAocmV3cml0dGVuKSByZXF1ZXN0IGhhcyB0byBiZSByZS1pbmplY3RlZCBpbnRvIHRoZSBBcGFjaGUKLWtlcm5lbCEgQlVUOiBXaGlsZSB0aGlzIHNlZW1zIGxpa2UgYSBzZXJpb3VzIG92ZXJoZWFkLCBpdCByZWFsbHkgaXNuJ3QsIGJlY2F1c2UKLXRoaXMgcmUtaW5qZWN0aW9uIGhhcHBlbnMgZnVsbHkgaW50ZXJuYWwgdG8gdGhlIEFwYWNoZSBzZXJ2ZXIgYW5kIHRoZSBzYW1lCi1wcm9jZWR1cmUgaXMgdXNlZCBieSBtYW55IG90aGVyIG9wZXJhdGlvbnMgaW5zaWRlIEFwYWNoZS4gU28sIHlvdSBjYW4gYmUKLXN1cmUgdGhlIGRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gaXMgY29ycmVjdC4KLTwvRk9OVD4KLTwvVEQ+PC9UUj4KLTwvVEFCTEU+Ci0KLTwvQkxPQ0tRVU9URT4KLQotCi08UD4KLTxIUiBOT1NIQURFIFNJWkU9MT4KLTxQPgotCi08SDM+PEEgTkFNRT0iUmV3cml0ZUNvbmQiPlJld3JpdGVDb25kPC9BPjwvSDM+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IDxDT0RFPlJld3JpdGVDb25kPC9DT0RFPiA8RU0+VGVzdFN0cmluZzwvRU0+Ci0gICAgPEVNPkNvbmRQYXR0ZXJuPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPEVNPk5vbmU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwKLSAgICAgLmh0YWNjZXNzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk92ZXJyaWRlOjwvU1RST05HPjwvQT4gPEVNPkZpbGVJbmZvPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEV4dGVuc2lvbjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX3Jld3JpdGUuYzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBBcGFjaGUgMS4yIChwYXJ0aWFsbHkpLCBBcGFjaGUgMS4zPEJSPgotCi08UD4KLVRoZSA8Q09ERT5SZXdyaXRlQ29uZDwvQ09ERT4gZGlyZWN0aXZlIGRlZmluZXMgYSBydWxlIGNvbmRpdGlvbi4gUHJlY2VkZSBhCi08Q09ERT5SZXdyaXRlUnVsZTwvQ09ERT4gZGlyZWN0aXZlIHdpdGggb25lIG9yIG1vcmUgPENPREU+UmV3cml0ZUNvbmQ8L0NPREU+Ci1kaXJlY3RpdmVzLgotCi1UaGUgZm9sbG93aW5nIHJld3JpdGluZyBydWxlIGlzIG9ubHkgdXNlZCBpZiBpdHMgcGF0dGVybiBtYXRjaGVzIHRoZSBjdXJyZW50Ci1zdGF0ZSBvZiB0aGUgVVJJIDxTVFJPTkc+YW5kPC9TVFJPTkc+IGlmIHRoZXNlIGFkZGl0aW9uYWwgY29uZGl0aW9ucyBhcHBseQotdG9vLgotCi08UD4KLTxFTT5UZXN0U3RyaW5nPC9FTT4gaXMgYSBzdHJpbmcgd2hpY2ggY2FuIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcKLWV4cGFuZGVkIGNvbnN0cnVjdHMgaW4gYWRkaXRpb24gdG8gcGxhaW4gdGV4dDoKLQotPFVMPgotPExJPjxTVFJPTkc+UmV3cml0ZVJ1bGUgYmFja3JlZmVyZW5jZXM8L1NUUk9ORz46IFRoZXNlIGFyZSBiYWNrcmVmZXJlbmNlcyBvZgotICAgIHRoZSBmb3JtCi0KLTxCTE9DS1FVT1RFPjxTVFJPTkc+Ci08Q09ERT4kTjwvQ09ERT4KLTwvU1RST05HPjwvQkxPQ0tRVU9URT4KLQotKDAgJmx0Oz0gTiAmbHQ7PSA5KSB3aGljaCBwcm92aWRlIGFjY2VzcyB0byB0aGUgZ3JvdXBlZCBwYXJ0cyAocGFyZW50aGVzaXMhKQotb2YgdGhlIHBhdHRlcm4gZnJvbSB0aGUgY29ycmVzcG9uZGluZyA8Q09ERT5SZXdyaXRlUnVsZTwvQ09ERT4gZGlyZWN0aXZlICh0aGUKLW9uZSBmb2xsb3dpbmcgdGhlIGN1cnJlbnQgYnVuY2ggb2YgPENPREU+UmV3cml0ZUNvbmQ8L0NPREU+IGRpcmVjdGl2ZXMpLgotCi08UD4KLTxMST48U1RST05HPlJld3JpdGVDb25kIGJhY2tyZWZlcmVuY2VzPC9TVFJPTkc+OiBUaGVzZSBhcmUgYmFja3JlZmVyZW5jZXMgb2YKLXRoZSBmb3JtCi0KLTxCTE9DS1FVT1RFPjxTVFJPTkc+Ci08Q09ERT4lTjwvQ09ERT4KLTwvU1RST05HPjwvQkxPQ0tRVU9URT4KLQotKDEgJmx0Oz0gTiAmbHQ7PSA5KSB3aGljaCBwcm92aWRlIGFjY2VzcyB0byB0aGUgZ3JvdXBlZCBwYXJ0cyAocGFyZW50aGVzaXMhKSBvZgotdGhlIHBhdHRlcm4gZnJvbSB0aGUgbGFzdCBtYXRjaGVkIDxDT0RFPlJld3JpdGVDb25kPC9DT0RFPiBkaXJlY3RpdmUgaW4gdGhlCi1jdXJyZW50IGJ1bmNoIG9mIGNvbmRpdGlvbnMuCi0KLTxQPgotPExJPjxTVFJPTkc+U2VydmVyLVZhcmlhYmxlczwvU1RST05HPjogVGhlc2UgYXJlIHZhcmlhYmxlcwotICAgIG9mIHRoZSBmb3JtCi0KLTxCTE9DS1FVT1RFPjxTVFJPTkc+Ci08Q09ERT4lezwvQ09ERT4gPEVNPk5BTUVfT0ZfVkFSSUFCTEU8L0VNPiA8Q09ERT59PC9DT0RFPgotPC9TVFJPTkc+PC9CTE9DS1FVT1RFPgotCi13aGVyZSA8RU0+TkFNRV9PRl9WQVJJQUJMRTwvRU0+IGNhbiBiZSBhIHN0cmluZwotb2YgdGhlIGZvbGxvd2luZyBsaXN0OgotCi08UD4KLTxUQUJMRSBCR0NPTE9SPSIjRjBGMEYwIiBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTU+Ci08VFI+Ci08VEQgVkFMSUdOPVRPUD4KLTxTVFJPTkc+SFRUUCBoZWFkZXJzOjwvU1RST05HPjxQPgotPEZPTlQgU0laRT0tMT4KLUhUVFBfVVNFUl9BR0VOVDxCUj4KLUhUVFBfUkVGRVJFUjxCUj4KLUhUVFBfQ09PS0lFPEJSPgotSFRUUF9GT1JXQVJERUQ8QlI+Ci1IVFRQX0hPU1Q8QlI+Ci1IVFRQX1BST1hZX0NPTk5FQ1RJT048QlI+Ci1IVFRQX0FDQ0VQVDxCUj4KLTwvRk9OVD4KLTwvVEQ+Ci0KLTxURCBWQUxJR049VE9QPgotPFNUUk9ORz5jb25uZWN0aW9uICZhbXA7IHJlcXVlc3Q6PC9TVFJPTkc+PFA+Ci08Rk9OVCBTSVpFPS0xPgotUkVNT1RFX0FERFI8QlI+Ci1SRU1PVEVfSE9TVDxCUj4KLVJFTU9URV9VU0VSPEJSPgotUkVNT1RFX0lERU5UPEJSPgotUkVRVUVTVF9NRVRIT0Q8QlI+Ci1TQ1JJUFRfRklMRU5BTUU8QlI+Ci1QQVRIX0lORk88QlI+Ci1RVUVSWV9TVFJJTkc8QlI+Ci1BVVRIX1RZUEU8QlI+Ci08L0ZPTlQ+Ci08L1REPgotCi08L1RSPgotPFRSPgotCi08VEQgVkFMSUdOPVRPUD4KLTxTVFJPTkc+c2VydmVyIGludGVybmFsczo8L1NUUk9ORz48UD4KLTxGT05UIFNJWkU9LTE+Ci1ET0NVTUVOVF9ST09UPEJSPgotU0VSVkVSX0FETUlOPEJSPgotU0VSVkVSX05BTUU8QlI+Ci1TRVJWRVJfQUREUjxCUj4KLVNFUlZFUl9QT1JUPEJSPgotU0VSVkVSX1BST1RPQ09MPEJSPgotU0VSVkVSX1NPRlRXQVJFPEJSPgotPC9GT05UPgotPC9URD4KLQotPFREIFZBTElHTj1UT1A+Ci08U1RST05HPnN5c3RlbSBzdHVmZjo8L1NUUk9ORz48UD4KLTxGT05UIFNJWkU9LTE+Ci1USU1FX1lFQVI8QlI+Ci1USU1FX01PTjxCUj4KLVRJTUVfREFZPEJSPgotVElNRV9IT1VSPEJSPgotVElNRV9NSU48QlI+Ci1USU1FX1NFQzxCUj4KLVRJTUVfV0RBWTxCUj4KLVRJTUU8QlI+Ci08L0ZPTlQ+Ci08L1REPgotCi08VEQgVkFMSUdOPVRPUD4KLTxTVFJPTkc+c3BlY2lhbHM6PC9TVFJPTkc+PFA+Ci08Rk9OVCBTSVpFPS0xPgotQVBJX1ZFUlNJT048QlI+Ci1USEVfUkVRVUVTVDxCUj4KLVJFUVVFU1RfVVJJPEJSPgotUkVRVUVTVF9GSUxFTkFNRTxCUj4KLUlTX1NVQlJFUTxCUj4KLTwvRk9OVD4KLTwvVEQ+Ci08L1RSPgotPC9UQUJMRT4KLQotPFA+Ci08VEFCTEUgV0lEVEg9IjcwJSIgQk9SREVSPTAgQkdDT0xPUj0iI0UwRTBGMCIgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0xMD4KLTxUUj48VEQ+Ci08U1RST05HPk5vdGljZTo8L1NUUk9ORz4gVGhlc2UgdmFyaWFibGVzIGFsbCBjb3JyZXNwb25kIHRvIHRoZSBzaW1pbGFyIG5hbWVkCi1IVFRQIE1JTUUtaGVhZGVycywgQyB2YXJpYWJsZXMgb2YgdGhlIEFwYWNoZSBzZXJ2ZXIgb3IgPENPREU+c3RydWN0IHRtPC9DT0RFPgotZmllbGRzIG9mIHRoZSBVbml4IHN5c3RlbS4KLTwvVEQ+PC9UUj4KLTwvVEFCTEU+Ci0KLTwvVUw+Ci0KLTxQPgotU3BlY2lhbCBOb3RlczoKLQotPE9MPgotPExJPlRoZSB2YXJpYWJsZXMgU0NSSVBUX0ZJTEVOQU1FIGFuZCBSRVFVRVNUX0ZJTEVOQU1FIGNvbnRhaW4gdGhlIHNhbWUKLXZhbHVlLCA8RU0+aS5lLjwvRU0+LCB0aGUgdmFsdWUgb2YgdGhlIDxDT0RFPmZpbGVuYW1lPC9DT0RFPiBmaWVsZCBvZgotdGhlIGludGVybmFsCi08Q09ERT5yZXF1ZXN0X3JlYzwvQ09ERT4gc3RydWN0dXJlIG9mIHRoZSBBcGFjaGUgc2VydmVyLiBUaGUgZmlyc3QgbmFtZSBpcwotanVzdCB0aGUKLWNvbW1vbmx5IGtub3duIENHSSB2YXJpYWJsZSBuYW1lIHdoaWxlIHRoZSBzZWNvbmQgaXMgdGhlIGNvbnNpc3RlbnQKLWNvdW50ZXJwYXJ0IHRvIFJFUVVFU1RfVVJJICh3aGljaCBjb250YWlucyB0aGUgdmFsdWUgb2YgdGhlIDxDT0RFPnVyaTwvQ09ERT4KLWZpZWxkIG9mIDxDT0RFPnJlcXVlc3RfcmVjPC9DT0RFPikuCi0KLTxQPgotPExJPlRoZXJlIGlzIHRoZSBzcGVjaWFsIGZvcm1hdDogPENPREU+JXtFTlY6dmFyaWFibGV9PC9DT0RFPiB3aGVyZQotPEVNPnZhcmlhYmxlPC9FTT4gY2FuIGJlIGFueSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gVGhpcyBpcyBsb29rZWQtdXAgdmlhCi1pbnRlcm5hbCBBcGFjaGUgc3RydWN0dXJlcyBhbmQgKGlmIG5vdCBmb3VuZCB0aGVyZSkgdmlhIDxDT0RFPmdldGVudigpPC9DT0RFPgotZnJvbSB0aGUgQXBhY2hlIHNlcnZlciBwcm9jZXNzLgotCi08UD4KLTxMST5UaGVyZSBpcyB0aGUgc3BlY2lhbCBmb3JtYXQ6IDxDT0RFPiV7SFRUUDpoZWFkZXJ9PC9DT0RFPiB3aGVyZQotPEVNPmhlYWRlcjwvRU0+IGNhbiBiZSBhbnkgSFRUUCBNSU1FLWhlYWRlciBuYW1lLiBUaGlzIGlzIGxvb2tlZC11cAotZnJvbSB0aGUgSFRUUCByZXF1ZXN0LiBFeGFtcGxlOiA8Q09ERT4le0hUVFA6UHJveHktQ29ubmVjdGlvbn08L0NPREU+Ci1pcyB0aGUgdmFsdWUgb2YgdGhlIEhUVFAgaGVhZGVyIGBgPENPREU+UHJveHktQ29ubmVjdGlvbjo8L0NPREU+JycuCi0KLTxQPgotPExJPlRoZXJlIGlzIHRoZSBzcGVjaWFsIGZvcm1hdCA8Q09ERT4le0xBLVU6dmFyaWFibGV9PC9DT0RFPiBmb3IgbG9vay1haGVhZHMKLXdoaWNoIHBlcmZvcm0gYW4gaW50ZXJuYWwgKFVSTC1iYXNlZCkgc3ViLXJlcXVlc3QgdG8gZGV0ZXJtaW5lIHRoZSBmaW5hbCB2YWx1ZQotb2YgPEVNPnZhcmlhYmxlPC9FTT4uIFVzZSB0aGlzIHdoZW4geW91IHdhbnQgdG8gdXNlIGEgdmFyaWFibGUgZm9yIHJld3JpdGluZwotd2hpY2ggYWN0dWFsbHkgaXMgc2V0IGxhdGVyIGluIGFuIEFQSSBwaGFzZSBhbmQgdGh1cyBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZQotY3VycmVudCBzdGFnZS4gRm9yIGluc3RhbmNlIHdoZW4geW91IHdhbnQgdG8gcmV3cml0ZSBhY2NvcmRpbmcgdG8gdGhlCi08Q09ERT5SRU1PVEVfVVNFUjwvQ09ERT4gdmFyaWFibGUgZnJvbSB3aXRoaW4gdGhlIHBlci1zZXJ2ZXIgY29udGV4dAotKDxDT0RFPmh0dHBkLmNvbmY8L0NPREU+IGZpbGUpIHlvdSBoYXZlIHRvIHVzZSA8Q09ERT4le0xBLVU6UkVNT1RFX1VTRVJ9PC9DT0RFPgotYmVjYXVzZSB0aGlzIHZhcmlhYmxlIGlzIHNldCBieSB0aGUgYXV0aG9yaXphdGlvbiBwaGFzZXMgd2hpY2ggY29tZQotPEVNPmFmdGVyPC9FTT4gdGhlIFVSTCB0cmFuc2xhdGlvbiBwaGFzZSB3aGVyZSBtb2RfcmV3cml0ZSBvcGVyYXRlcy4gT24gdGhlCi1vdGhlciBoYW5kLCBiZWNhdXNlIG1vZF9yZXdyaXRlIGltcGxlbWVudHMgaXRzIHBlci1kaXJlY3RvcnkgY29udGV4dAotKDxDT0RFPi5odGFjY2VzczwvQ09ERT4gZmlsZSkgdmlhIHRoZSBGaXh1cCBwaGFzZSBvZiB0aGUgQVBJIGFuZCBiZWNhdXNlIHRoZQotYXV0aG9yaXphdGlvbiBwaGFzZXMgY29tZSA8RU0+YmVmb3JlPC9FTT4gdGhpcyBwaGFzZSwgeW91IGp1c3QgY2FuIHVzZQotPENPREU+JXtSRU1PVEVfVVNFUn08L0NPREU+IHRoZXJlLgotCi08UD4KLTxMST5UaGVyZSBpcyB0aGUgc3BlY2lhbCBmb3JtYXQ6IDxDT0RFPiV7TEEtRjp2YXJpYWJsZX08L0NPREU+IHdoaWNoIHBlcmZvcm0gYW4KLWludGVybmFsIChmaWxlbmFtZS1iYXNlZCkgc3ViLXJlcXVlc3QgdG8gZGV0ZXJtaW5lIHRoZSBmaW5hbCB2YWx1ZSBvZgotPEVNPnZhcmlhYmxlPC9FTT4uIFRoaXMgaXMgdGhlIG1vc3Qgb2YgdGhlIHRpbWUgdGhlIHNhbWUgYXMgTEEtVSBhYm92ZS4KLTwvT0w+Ci0KLTxQPgotPEVNPkNvbmRQYXR0ZXJuPC9FTT4gaXMgdGhlIGNvbmRpdGlvbiBwYXR0ZXJuLCA8RU0+aS5lLjwvRU0+LCBhIHJlZ3VsYXIKLWV4cHJlc3Npb24KLXdoaWNoIGdldHMgYXBwbGllZCB0byB0aGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUgPEVNPlRlc3RTdHJpbmc8L0VNPiwKLTxFTT5pLmUuPC9FTT4sIDxFTT5UZXN0U3RyaW5nPC9FTT4gZ2V0cyBldmFsdWF0ZWQgYW5kIHRoZW4gbWF0Y2hlZCBhZ2FpbnN0Ci08RU0+Q29uZFBhdHRlcm48L0VNPi4KLQotPFA+Ci08U1RST05HPlJlbWVtYmVyOjwvU1RST05HPiA8RU0+Q29uZFBhdHRlcm48L0VNPiBpcyBhIHN0YW5kYXJkCi08RU0+RXh0ZW5kZWQgUmVndWxhciBFeHByZXNzaW9uPC9FTT4gd2l0aCBzb21lIGFkZGl0aW9uczoKLQotPE9MPgotPExJPllvdSBjYW4gcHJlY2VkZSB0aGUgcGF0dGVybiBzdHJpbmcgd2l0aCBhICc8Q09ERT4hPC9DT0RFPicgY2hhcmFjdGVyCi0oZXhjbGFtYXRpb24gbWFyaykgdG8gc3BlY2lmeSBhIDxTVFJPTkc+bm9uPC9TVFJPTkc+LW1hdGNoaW5nIHBhdHRlcm4uCi0KLTxQPgotPExJPgotVGhlcmUgYXJlIHNvbWUgc3BlY2lhbCB2YXJpYW50cyBvZiA8RU0+Q29uZFBhdHRlcm5zPC9FTT4uIEluc3RlYWQgb2YgcmVhbAotcmVndWxhciBleHByZXNzaW9uIHN0cmluZ3MgeW91IGNhbiBhbHNvIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLTxQPgotPFVMPgotPExJPic8U1RST05HPiZsdDtDb25kUGF0dGVybjwvU1RST05HPicgKGlzIGxleGljb2dyYXBoaWNhbGx5IGxvd2VyKTxCUj4KLVRyZWF0cyB0aGUgPEVNPkNvbmRQYXR0ZXJuPC9FTT4gYXMgYSBwbGFpbiBzdHJpbmcgYW5kIGNvbXBhcmVzIGl0Ci1sZXhpY29ncmFwaGljYWxseSB0byA8RU0+VGVzdFN0cmluZzwvRU0+IGFuZCByZXN1bHRzIGluIGEgdHJ1ZSBleHByZXNzaW9uIGlmCi08RU0+VGVzdFN0cmluZzwvRU0+IGlzIGxleGljb2dyYXBoaWNhbGx5IGxvd2VyIHRoYW4gPEVNPkNvbmRQYXR0ZXJuPC9FTT4uCi08UD4KLTxMST4nPFNUUk9ORz4mZ3Q7Q29uZFBhdHRlcm48L1NUUk9ORz4nIChpcyBsZXhpY29ncmFwaGljYWxseSBncmVhdGVyKTxCUj4KLVRyZWF0cyB0aGUgPEVNPkNvbmRQYXR0ZXJuPC9FTT4gYXMgYSBwbGFpbiBzdHJpbmcgYW5kIGNvbXBhcmVzIGl0Ci1sZXhpY29ncmFwaGljYWxseSB0byA8RU0+VGVzdFN0cmluZzwvRU0+IGFuZCByZXN1bHRzIGluIGEgdHJ1ZSBleHByZXNzaW9uIGlmCi08RU0+VGVzdFN0cmluZzwvRU0+IGlzIGxleGljb2dyYXBoaWNhbGx5IGdyZWF0ZXIgdGhhbiA8RU0+Q29uZFBhdHRlcm48L0VNPi4KLTxQPgotPExJPic8U1RST05HPj1Db25kUGF0dGVybjwvU1RST05HPicgKGlzIGxleGljb2dyYXBoaWNhbGx5IGVxdWFsKTxCUj4KLVRyZWF0cyB0aGUgPEVNPkNvbmRQYXR0ZXJuPC9FTT4gYXMgYSBwbGFpbiBzdHJpbmcgYW5kIGNvbXBhcmVzIGl0Ci1sZXhpY29ncmFwaGljYWxseSB0byA8RU0+VGVzdFN0cmluZzwvRU0+IGFuZCByZXN1bHRzIGluIGEgdHJ1ZSBleHByZXNzaW9uIGlmCi08RU0+VGVzdFN0cmluZzwvRU0+IGlzIGxleGljb2dyYXBoaWNhbGx5IGVxdWFsIHRvIDxFTT5Db25kUGF0dGVybjwvRU0+LCBpLmUgdGhlCi10d28gc3RyaW5ncyBhcmUgZXhhY3RseSBlcXVhbCAoY2hhcmFjdGVyIGJ5IGNoYXJhY3RlcikuCi1JZiA8RU0+Q29uZFBhdHRlcm48L0VNPiBpcyBqdXN0IDxTQU1QPiIiPC9TQU1QPiAodHdvIHF1b3RhdGlvbiBtYXJrcykgdGhpcwotY29tcGFyZXMgPEVNPlRlc3RTdHJpbmc8L0VNPiBhZ2FpbnN0IHRoZSBlbXB0eSBzdHJpbmcuCi08UD4KLTxMST4nPFNUUk9ORz4tZDwvU1RST05HPicgKGlzIDxTVFJPTkc+ZDwvU1RST05HPmlyZWN0b3J5KTxCUj4KLVRyZWF0cyB0aGUgPEVNPlRlc3RTdHJpbmc8L0VNPiBhcyBhIHBhdGhuYW1lIGFuZAotdGVzdHMgaWYgaXQgZXhpc3RzIGFuZCBpcyBhIGRpcmVjdG9yeS4KLTxQPgotPExJPic8U1RST05HPi1mPC9TVFJPTkc+JyAoaXMgcmVndWxhciA8U1RST05HPmY8L1NUUk9ORz5pbGUpPEJSPgotVHJlYXRzIHRoZSA8RU0+VGVzdFN0cmluZzwvRU0+IGFzIGEgcGF0aG5hbWUgYW5kCi10ZXN0cyBpZiBpdCBleGlzdHMgYW5kIGlzIGEgcmVndWxhciBmaWxlLgotPFA+Ci08TEk+JzxTVFJPTkc+LXM8L1NUUk9ORz4nIChpcyByZWd1bGFyIGZpbGUgd2l0aCA8U1RST05HPnM8L1NUUk9ORz5pemUpPEJSPgotVHJlYXRzIHRoZSA8RU0+VGVzdFN0cmluZzwvRU0+IGFzIGEgcGF0aG5hbWUgYW5kCi10ZXN0cyBpZiBpdCBleGlzdHMgYW5kIGlzIGEgcmVndWxhciBmaWxlIHdpdGggc2l6ZSBncmVhdGVyIHRoYW4gemVyby4KLTxQPgotPExJPic8U1RST05HPi1sPC9TVFJPTkc+JyAoaXMgc3ltYm9saWMgPFNUUk9ORz5sPC9TVFJPTkc+aW5rKTxCUj4KLVRyZWF0cyB0aGUgPEVNPlRlc3RTdHJpbmc8L0VNPiBhcyBhIHBhdGhuYW1lIGFuZAotdGVzdHMgaWYgaXQgZXhpc3RzIGFuZCBpcyBhIHN5bWJvbGljIGxpbmsuCi08UD4KLTxMST4nPFNUUk9ORz4tRjwvU1RST05HPicgKGlzIGV4aXN0aW5nIGZpbGUgdmlhIHN1YnJlcXVlc3QpPEJSPgotQ2hlY2tzIGlmIDxFTT5UZXN0U3RyaW5nPC9FTT4gaXMgYSB2YWxpZCBmaWxlIGFuZCBhY2Nlc3NpYmxlIHZpYSBhbGwgdGhlCi1zZXJ2ZXIncyBjdXJyZW50bHktY29uZmlndXJlZCBhY2Nlc3MgY29udHJvbHMgZm9yIHRoYXQgcGF0aC4gIFRoaXMgdXNlcyBhbgotaW50ZXJuYWwgc3VicmVxdWVzdCB0byBkZXRlcm1pbmUgdGhlIGNoZWNrLCBzbyB1c2UgaXQgd2l0aCBjYXJlIGJlY2F1c2UgaXQKLWRlY3JlYXNlcyB5b3VyIHNlcnZlcnMgcGVyZm9ybWFuY2UhCi08UD4KLTxMST4nPFNUUk9ORz4tVTwvU1RST05HPicgKGlzIGV4aXN0aW5nIFVSTCB2aWEgc3VicmVxdWVzdCk8QlI+Ci1DaGVja3MgaWYgPEVNPlRlc3RTdHJpbmc8L0VNPiBpcyBhIHZhbGlkIFVSTCBhbmQgYWNjZXNzaWJsZSB2aWEgYWxsIHRoZQotc2VydmVyJ3MKLWN1cnJlbnRseS1jb25maWd1cmVkIGFjY2VzcyBjb250cm9scyBmb3IgdGhhdCBwYXRoLiAgVGhpcyB1c2VzIGFuIGludGVybmFsCi1zdWJyZXF1ZXN0IHRvIGRldGVybWluZSB0aGUgY2hlY2ssIHNvIHVzZSBpdCB3aXRoIGNhcmUgYmVjYXVzZSBpdCBkZWNyZWFzZXMKLXlvdXIgc2VydmVyJ3MgcGVyZm9ybWFuY2UhCi08L1VMPgotPFA+Ci08VEFCTEUgV0lEVEg9IjcwJSIgQk9SREVSPTAgQkdDT0xPUj0iI0UwRTBGMCIgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0xMD4KLTxUUj48VEQ+Ci08U1RST05HPk5vdGljZTo8L1NUUk9ORz4KLUFsbCBvZiB0aGVzZSB0ZXN0cyBjYW4gYWxzbyBiZSBwcmVmaXhlZCBieSBhIG5vdCAoJyEnKSBjaGFyYWN0ZXIKLXRvIG5lZ2F0ZSB0aGVpciBtZWFuaW5nLgotPC9URD48L1RSPgotPC9UQUJMRT4KLTwvT0w+Ci0KLTxQPgotQWRkaXRpb25hbGx5IHlvdSBjYW4gc2V0IHNwZWNpYWwgZmxhZ3MgZm9yIDxFTT5Db25kUGF0dGVybjwvRU0+IGJ5IGFwcGVuZGluZwotCi08QkxPQ0tRVU9URT48U1RST05HPgotPENPREU+WzwvQ09ERT48RU0+ZmxhZ3M8L0VNPjxDT0RFPl08L0NPREU+Ci08L1NUUk9ORz48L0JMT0NLUVVPVEU+Ci0KLWFzIHRoZSB0aGlyZCBhcmd1bWVudCB0byB0aGUgPENPREU+UmV3cml0ZUNvbmQ8L0NPREU+IGRpcmVjdGl2ZS4gPEVNPkZsYWdzPC9FTT4KLWlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKLQotPFVMPgotPExJPic8U1RST05HPjxDT0RFPm5vY2FzZXxOQzwvQ09ERT48L1NUUk9ORz4nICg8U1RST05HPm48L1NUUk9ORz5vIDxTVFJPTkc+YzwvU1RST05HPmFzZSk8QlI+Ci0gICAgVGhpcyBtYWtlcyB0aGUgY29uZGl0aW9uIHRlc3QgY2FzZS1pbnNlbnNpdGl2ZSwgPEVNPmkuZS48L0VNPiwgdGhlcmUgaXMKLSAgICBubyBkaWZmZXJlbmNlIGJldHdlZW4gJ0EtWicgYW5kICdhLXonIGJvdGggaW4gdGhlIGV4cGFuZGVkCi0gICAgPEVNPlRlc3RTdHJpbmc8L0VNPiBhbmQgdGhlIDxFTT5Db25kUGF0dGVybjwvRU0+LgotPFA+Ci08TEk+JzxTVFJPTkc+PENPREU+b3JuZXh0fE9SPC9DT0RFPjwvU1RST05HPicgKDxTVFJPTkc+b3I8L1NUUk9ORz4gbmV4dCBjb25kaXRpb24pPEJSPgotICAgIFVzZSB0aGlzIHRvIGNvbWJpbmUgcnVsZSBjb25kaXRpb25zIHdpdGggYSBsb2NhbCBPUiBpbnN0ZWFkIG9mIHRoZQotICAgIGltcGxpY2l0IEFORC4gVHlwaWNhbCBleGFtcGxlOgotICAgIDxQPgotPEJMT0NLUVVPVEU+PFBSRT4KLVJld3JpdGVDb25kICV7UkVNT1RFX0hPU1R9ICBeaG9zdDEuKiAgW09SXQotUmV3cml0ZUNvbmQgJXtSRU1PVEVfSE9TVH0gIF5ob3N0Mi4qICBbT1JdCi1SZXdyaXRlQ29uZCAle1JFTU9URV9IT1NUfSAgXmhvc3QzLioKLVJld3JpdGVSdWxlIC4uLnNvbWUgc3BlY2lhbCBzdHVmZiBmb3IgYW55IG9mIHRoZXNlIGhvc3RzLi4uCi08L1BSRT48L0JMT0NLUVVPVEU+Ci0gICAgV2l0aG91dCB0aGlzIGZsYWcgeW91IGhhZCB0byB3cml0ZSBkb3duIHRoZSBjb25kL3J1bGUgdGhyZWUgdGltZXMuCi08L1VMPgotCi08UD4KLTxTVFJPTkc+RXhhbXBsZTo8L1NUUk9ORz4KLTxCTE9DS1FVT1RFPgotCi1UbyByZXdyaXRlIHRoZSBIb21lcGFnZSBvZiBhIHNpdGUgYWNjb3JkaW5nIHRvIHRoZSBgYDxDT0RFPlVzZXItQWdlbnQ6PC9DT0RFPicnCi1oZWFkZXIgb2YgdGhlIHJlcXVlc3QsIHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmc6Ci0KLTxCTE9DS1FVT1RFPjxQUkU+Ci1SZXdyaXRlQ29uZCAgJXtIVFRQX1VTRVJfQUdFTlR9ICBeTW96aWxsYS4qCi1SZXdyaXRlUnVsZSAgXi8kICAgICAgICAgICAgICAgICAvaG9tZXBhZ2UubWF4Lmh0bWwgIFtMXQotCi1SZXdyaXRlQ29uZCAgJXtIVFRQX1VTRVJfQUdFTlR9ICBeTHlueC4qCi1SZXdyaXRlUnVsZSAgXi8kICAgICAgICAgICAgICAgICAvaG9tZXBhZ2UubWluLmh0bWwgIFtMXQotCi1SZXdyaXRlUnVsZSAgXi8kICAgICAgICAgICAgICAgICAvaG9tZXBhZ2Uuc3RkLmh0bWwgIFtMXQotPC9QUkU+PC9CTE9DS1FVT1RFPgotCi1JbnRlcnByZXRhdGlvbjogSWYgeW91IHVzZSBOZXRzY2FwZSBOYXZpZ2F0b3IgYXMgeW91ciBicm93c2VyICh3aGljaCBpZGVudGlmaWVzCi1pdHNlbGYgYXMgJ01vemlsbGEnKSwgdGhlbiB5b3UgZ2V0IHRoZSBtYXggaG9tZXBhZ2UsIHdoaWNoIGluY2x1ZGVzCi1GcmFtZXMsIDxFTT5ldGMuPC9FTT4gSWYgeW91IHVzZSB0aGUgTHlueCBicm93c2VyICh3aGljaCBpcyBUZXJtaW5hbC1iYXNlZCksIHRoZW4geW91Ci1nZXQgdGhlIG1pbiBob21lcGFnZSwgd2hpY2ggY29udGFpbnMgbm8gaW1hZ2VzLCBubyB0YWJsZXMsIDxFTT5ldGMuPC9FTT4gIElmIHlvdQotdXNlIGFueSBvdGhlciBicm93c2VyIHlvdSBnZXQgdGhlIHN0YW5kYXJkIGhvbWVwYWdlLgotPC9CTE9DS1FVT1RFPgotCi08UD4KLTxIUiBOT1NIQURFIFNJWkU9MT4KLTxQPgotCi08SDM+PEEgTkFNRT0iUmV3cml0ZVJ1bGUiPlJld3JpdGVSdWxlPC9BPjwvSDM+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IDxDT0RFPlJld3JpdGVSdWxlPC9DT0RFPiA8RU0+UGF0dGVybjwvRU0+IDxFTT5TdWJzdGl0dXRpb248L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8RU0+Tm9uZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiA8RU0+RmlsZUluZm88L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gRXh0ZW5zaW9uPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2RfcmV3cml0ZS5jPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IEFwYWNoZSAxLjIgKHBhcnRpYWxseSksIEFwYWNoZSAxLjM8QlI+Ci0KLTxQPgotVGhlIDxDT0RFPlJld3JpdGVSdWxlPC9DT0RFPiBkaXJlY3RpdmUgaXMgdGhlIHJlYWwgcmV3cml0aW5nIHdvcmtob3JzZS4gIFRoZQotZGlyZWN0aXZlIGNhbiBvY2N1ciBtb3JlIHRoYW4gb25jZS4gRWFjaCBkaXJlY3RpdmUgdGhlbiBkZWZpbmVzIG9uZSBzaW5nbGUKLXJld3JpdGluZyBydWxlLiAgVGhlIDxTVFJPTkc+ZGVmaW5pdGlvbiBvcmRlcjwvU1RST05HPiBvZiB0aGVzZSBydWxlcyBpcwotPFNUUk9ORz5pbXBvcnRhbnQ8L1NUUk9ORz4sIGJlY2F1c2UgdGhpcyBvcmRlciBpcyB1c2VkIHdoZW4gYXBwbHlpbmcgdGhlIHJ1bGVzIGF0Ci1ydW4tdGltZS4KLQotPFA+Ci08QSBOQU1FPSJwYXR0ZXJucyI+PEVNPlBhdHRlcm48L0VNPjwvQT4gY2FuIGJlIChmb3IgQXBhY2hlIDEuMS54IGEgU3lzdGVtCi1WOCBhbmQgZm9yIEFwYWNoZSAxLjIueCBhIFBPU0lYKSA8QSBOQU1FPSJyZWdleHAiPnJlZ3VsYXIgZXhwcmVzc2lvbjwvQT4KLXdoaWNoIGdldHMgYXBwbGllZCB0byB0aGUgY3VycmVudCBVUkwuIEhlcmUgYGBjdXJyZW50JycgbWVhbnMgdGhlIHZhbHVlIG9mIHRoZQotVVJMIHdoZW4gdGhpcyBydWxlIGdldHMgYXBwbGllZC4gVGhpcyBtYXkgbm90IGJlIHRoZSBvcmlnaW5hbCByZXF1ZXN0ZWQKLVVSTCwgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBhbnkgbnVtYmVyIG9mIHJ1bGVzIGJlZm9yZSB3aGljaCBhbHJlYWR5IG1hdGNoZWQKLWFuZCBtYWRlIGFsdGVyYXRpb25zIHRvIGl0LgotCi08UD4KLVNvbWUgaGludHMgYWJvdXQgdGhlIHN5bnRheCBvZiByZWd1bGFyIGV4cHJlc3Npb25zOgotCi08UD4KLTxUQUJMRSBCR0NPTE9SPSIjRjBGMEYwIiBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTU+Ci08VFI+Ci08VEQgVkFMSUdOPVRPUD4KLTxQUkU+Ci08U1RST05HPlRleHQ6PC9TVFJPTkc+Ci0gIDxTVFJPTkc+PENPREU+LjwvQ09ERT48L1NUUk9ORz4gICAgICAgICAgIEFueSBzaW5nbGUgY2hhcmFjdGVyCi0gIDxTVFJPTkc+PENPREU+WzwvQ09ERT48L1NUUk9ORz5jaGFyczxTVFJPTkc+PENPREU+XTwvQ09ERT48L1NUUk9ORz4gICAgIENoYXJhY3RlciBjbGFzczogT25lICBvZiBjaGFycwotICA8U1RST05HPjxDT0RFPltePC9DT0RFPjwvU1RST05HPmNoYXJzPFNUUk9ORz48Q09ERT5dPC9DT0RFPjwvU1RST05HPiAgICBDaGFyYWN0ZXIgY2xhc3M6IE5vbmUgb2YgY2hhcnMKLSAgdGV4dDE8U1RST05HPjxDT0RFPnw8L0NPREU+PC9TVFJPTkc+dGV4dDIgQWx0ZXJuYXRpdmU6IHRleHQxIG9yIHRleHQyCi0KLTxTVFJPTkc+UXVhbnRpZmllcnM6PC9TVFJPTkc+Ci0gIDxTVFJPTkc+PENPREU+PzwvQ09ERT48L1NUUk9ORz4gICAgICAgICAgIDAgb3IgMSBvZiB0aGUgcHJlY2VkaW5nIHRleHQKLSAgPFNUUk9ORz48Q09ERT4qPC9DT0RFPjwvU1RST05HPiAgICAgICAgICAgMCBvciBOIG9mIHRoZSBwcmVjZWRpbmcgdGV4dCAoTiAmZ3Q7IDEpCi0gIDxTVFJPTkc+PENPREU+KzwvQ09ERT48L1NUUk9ORz4gICAgICAgICAgIDEgb3IgTiBvZiB0aGUgcHJlY2VkaW5nIHRleHQgKE4gJmd0OyAxKQotCi08U1RST05HPkdyb3VwaW5nOjwvU1RST05HPgotICA8U1RST05HPjxDT0RFPig8L0NPREU+PC9TVFJPTkc+dGV4dDxTVFJPTkc+PENPREU+KTwvQ09ERT48L1NUUk9ORz4gICAgICBHcm91cGluZyBvZiB0ZXh0Ci0gICAgICAgICAgICAgIChlaXRoZXIgdG8gc2V0IHRoZSBib3JkZXJzIG9mIGFuIGFsdGVybmF0aXZlIG9yCi0gICAgICAgICAgICAgIGZvciBtYWtpbmcgYmFja3JlZmVyZW5jZXMgd2hlcmUgdGhlIDxTVFJPTkc+TjwvU1RST05HPnRoIGdyb3VwIGNhbiAKLSAgICAgICAgICAgICAgYmUgdXNlZCBvbiB0aGUgUkhTIG9mIGEgUmV3cml0ZVJ1bGUgd2l0aCA8Q09ERT4kPC9DT0RFPjxTVFJPTkc+TjwvU1RST05HPikKLQotPFNUUk9ORz5BbmNob3JzOjwvU1RST05HPgotICA8U1RST05HPjxDT0RFPl48L0NPREU+PC9TVFJPTkc+ICAgICAgICAgICBTdGFydCBvZiBsaW5lIGFuY2hvcgotICA8U1RST05HPjxDT0RFPiQ8L0NPREU+PC9TVFJPTkc+ICAgICAgICAgICBFbmQgICBvZiBsaW5lIGFuY2hvcgotCi08U1RST05HPkVzY2FwaW5nOjwvU1RST05HPgotICA8U1RST05HPjxDT0RFPlw8L0NPREU+PC9TVFJPTkc+Y2hhciAgICAgICBlc2NhcGUgdGhhdCBwYXJ0aWN1bGFyIGNoYXIKLSAgICAgICAgICAgICAgKGZvciBpbnN0YW5jZSB0byBzcGVjaWZ5IHRoZSBjaGFycyAiPENPREU+LltdKCk8L0NPREU+IiA8RU0+ZXRjLjwvRU0+KQotPC9QUkU+Ci08L1REPgotPC9UUj4KLTwvVEFCTEU+Ci0KLTxQPgotRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcmVndWxhciBleHByZXNzaW9ucyBlaXRoZXIgaGF2ZSBhIGxvb2sgYXQgeW91cgotbG9jYWwgcmVnZXgoMykgbWFucGFnZSBvciBpdHMgPENPREU+c3JjL3JlZ2V4L3JlZ2V4LjM8L0NPREU+IGNvcHkgaW4gdGhlCi1BcGFjaGUgMS4zIGRpc3RyaWJ1dGlvbi4gIFdoZW4geW91IGFyZSBpbnRlcmVzdGVkIGluIG1vcmUgZGV0YWlsZWQgYW5kIGRlZXBlcgotaW5mb3JtYXRpb24gYWJvdXQgcmVndWxhciBleHByZXNzaW9ucyBhbmQgaXRzIHZhcmlhbnRzIChQT1NJWCByZWdleCwgUGVybAotcmVnZXgsIDxFTT5ldGMuPC9FTT4pIGhhdmUgYSBsb29rIGF0IHRoZSBmb2xsb3dpbmcgZGVkaWNhdGVkIGJvb2sgb24gdGhpcyB0b3BpYzogCi0KLTxCTE9DS1FVT1RFPgotPEVNPk1hc3RlcmluZyBSZWd1bGFyIEV4cHJlc3Npb25zPC9FTT48QlI+Ci1KZWZmcmV5IEUuRi4gRnJpZWRsPEJSPgotTnV0c2hlbGwgSGFuZGJvb2sgU2VyaWVzPEJSPgotTydSZWlsbHkgJmFtcDsgQXNzb2NpYXRlcywgSW5jLiAxOTk3PEJSPgotSVNCTiAxLTU2NTkyLTI1Ny0zPEJSPgotPC9CTE9DS1FVT1RFPgotCi08UD4KLUFkZGl0aW9uYWxseSBpbiBtb2RfcmV3cml0ZSB0aGUgTk9UIGNoYXJhY3RlciAoJzxDT0RFPiE8L0NPREU+JykgaXMgYSBwb3NzaWJsZQotcGF0dGVybiBwcmVmaXguIFRoaXMgZ2l2ZXMgeW91IHRoZSBhYmlsaXR5IHRvIG5lZ2F0ZSBhIHBhdHRlcm47IHRvIHNheSwgZm9yCi1pbnN0YW5jZTogYGA8RU0+aWYgdGhlIGN1cnJlbnQgVVJMIGRvZXMgPFNUUk9ORz5OT1Q8L1NUUk9ORz4gbWF0Y2ggdG8gdGhpcwotcGF0dGVybjwvRU0+JycuIFRoaXMgY2FuIGJlIHVzZWQgZm9yIHNwZWNpYWwgY2FzZXMgd2hlcmUgaXQgaXMgYmV0dGVyIHRvIG1hdGNoCi10aGUgbmVnYXRpdmUgcGF0dGVybiBvciBhcyBhIGxhc3QgZGVmYXVsdCBydWxlLgotCi08UD4KLTxUQUJMRSBXSURUSD0iNzAlIiBCT1JERVI9MCBCR0NPTE9SPSIjRTBFMEYwIiBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTEwPgotPFRSPjxURD4KLTxTVFJPTkc+Tm90aWNlOjwvU1RST05HPiBXaGVuIHVzaW5nIHRoZSBOT1QgY2hhcmFjdGVyIHRvIG5lZ2F0ZSBhIHBhdHRlcm4geW91IGNhbm5vdAotaGF2ZSBncm91cGVkIHdpbGRjYXJkIHBhcnRzIGluIHRoZSBwYXR0ZXJuLiBUaGlzIGlzIGltcG9zc2libGUgYmVjYXVzZSB3aGVuCi10aGUgcGF0dGVybiBkb2VzIE5PVCBtYXRjaCwgdGhlcmUgYXJlIG5vIGNvbnRlbnRzIGZvciB0aGUgZ3JvdXBzLiBJbgotY29uc2VxdWVuY2UsIGlmIG5lZ2F0ZWQgcGF0dGVybnMgYXJlIHVzZWQsIHlvdSBjYW5ub3QgdXNlIDxDT0RFPiROPC9DT0RFPiBpbiB0aGUKLXN1YnN0aXR1dGlvbiBzdHJpbmchCi08L1REPjwvVFI+Ci08L1RBQkxFPgotCi08UD4KLTxBIE5BTUU9InJocyI+PEVNPlN1YnN0aXR1dGlvbjwvRU0+PC9BPiBvZiBhIHJld3JpdGluZyBydWxlIGlzIHRoZSBzdHJpbmcKLXdoaWNoIGlzIHN1YnN0aXR1dGVkIGZvciAob3IgcmVwbGFjZXMpIHRoZSBvcmlnaW5hbCBVUkwgZm9yIHdoaWNoCi08RU0+UGF0dGVybjwvRU0+IG1hdGNoZWQuICBCZXNpZGUgcGxhaW4gdGV4dCB5b3UgY2FuIHVzZQotCi08T0w+Ci08TEk+YmFjay1yZWZlcmVuY2VzIDxDT0RFPiROPC9DT0RFPiB0byB0aGUgUmV3cml0ZVJ1bGUgcGF0dGVybgotPExJPmJhY2stcmVmZXJlbmNlcyA8Q09ERT4lTjwvQ09ERT4gdG8gdGhlIGxhc3QgbWF0Y2hlZCBSZXdyaXRlQ29uZCBwYXR0ZXJuCi08TEk+c2VydmVyLXZhcmlhYmxlcyBhcyBpbiBydWxlIGNvbmRpdGlvbiB0ZXN0LXN0cmluZ3MgKDxDT0RFPiV7VkFSTkFNRX08L0NPREU+KQotPExJPjxBIEhSRUY9IiNtYXBmdW5jIj5tYXBwaW5nLWZ1bmN0aW9uPC9BPiBjYWxscyAoPENPREU+JHttYXBuYW1lOmtleXxkZWZhdWx0fTwvQ09ERT4pCi08L09MPgotCi1CYWNrLXJlZmVyZW5jZXMgYXJlIDxDT0RFPiQ8L0NPREU+PFNUUk9ORz5OPC9TVFJPTkc+ICg8U1RST05HPk48L1NUUk9ORz49MC4uOSkgaWRlbnRpZmllcnMgd2hpY2gKLXdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGNvbnRlbnRzIG9mIHRoZSA8U1RST05HPk48L1NUUk9ORz50aCBncm91cCBvZiB0aGUgbWF0Y2hlZAotPEVNPlBhdHRlcm48L0VNPi4gVGhlIHNlcnZlci12YXJpYWJsZXMgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUKLTxFTT5UZXN0U3RyaW5nPC9FTT4gb2YgYSA8Q09ERT5SZXdyaXRlQ29uZDwvQ09ERT4gZGlyZWN0aXZlLiBUaGUKLW1hcHBpbmctZnVuY3Rpb25zIGNvbWUgZnJvbSB0aGUgPENPREU+UmV3cml0ZU1hcDwvQ09ERT4gZGlyZWN0aXZlIGFuZCBhcmUKLWV4cGxhaW5lZCB0aGVyZS4gVGhlc2UgdGhyZWUgdHlwZXMgb2YgdmFyaWFibGVzIGFyZSBleHBhbmRlZCBpbiB0aGUgb3JkZXIgb2YKLXRoZSBhYm92ZSBsaXN0LgotCi08UD4KLUFzIGFscmVhZHkgbWVudGlvbmVkIGFib3ZlLCBhbGwgdGhlIHJld3JpdGluZyBydWxlcyBhcmUgYXBwbGllZCB0byB0aGUKLTxFTT5TdWJzdGl0dXRpb248L0VNPiAoaW4gdGhlIG9yZGVyIG9mIGRlZmluaXRpb24gaW4gdGhlIGNvbmZpZyBmaWxlKS4gIFRoZQotVVJMIGlzIDxTVFJPTkc+Y29tcGxldGVseSByZXBsYWNlZDwvU1RST05HPiBieSB0aGUgPEVNPlN1YnN0aXR1dGlvbjwvRU0+IGFuZCB0aGUKLXJld3JpdGluZyBwcm9jZXNzIGdvZXMgb24gdW50aWwgdGhlcmUgYXJlIG5vIG1vcmUgcnVsZXMgKHVubGVzcyBleHBsaWNpdGx5Ci10ZXJtaW5hdGVkIGJ5IGEgPENPREU+PFNUUk9ORz5MPC9TVFJPTkc+PC9DT0RFPiBmbGFnIC0gc2VlIGJlbG93KS4KLQotPFA+Ci1UaGVyZSBpcyBhIHNwZWNpYWwgc3Vic3RpdHV0aW9uIHN0cmluZyBuYW1lZCAnPENPREU+LTwvQ09ERT4nIHdoaWNoIG1lYW5zOgotPFNUUk9ORz5OTyBzdWJzdGl0dXRpb248L1NUUk9ORz4hIFNvdW5kcyBzaWxseT8gTm8sIGl0IGlzIHVzZWZ1bCB0byBwcm92aWRlIHJld3JpdGluZwotcnVsZXMgd2hpY2ggPFNUUk9ORz5vbmx5PC9TVFJPTkc+IG1hdGNoIHNvbWUgVVJMcyBidXQgZG8gbm8gc3Vic3RpdHV0aW9uLCA8RU0+ZS5nLjwvRU0+LCBpbgotY29uanVuY3Rpb24gd2l0aCB0aGUgPFNUUk9ORz5DPC9TVFJPTkc+IChjaGFpbikgZmxhZyB0byBiZSBhYmxlIHRvIGhhdmUgbW9yZSB0aGFuIG9uZQotcGF0dGVybiB0byBiZSBhcHBsaWVkIGJlZm9yZSBhIHN1YnN0aXR1dGlvbiBvY2N1cnMuCi0KLTxQPgotT25lIG1vcmUgbm90ZTogWW91IGNhbiBldmVuIGNyZWF0ZSBVUkxzIGluIHRoZSBzdWJzdGl0dXRpb24gc3RyaW5nIGNvbnRhaW5pbmcKLWEgcXVlcnkgc3RyaW5nIHBhcnQuIEp1c3QgdXNlIGEgcXVlc3Rpb24gbWFyayBpbnNpZGUgdGhlIHN1YnN0aXR1dGlvbiBzdHJpbmcKLXRvIGluZGljYXRlIHRoYXQgdGhlIGZvbGxvd2luZyBzdHVmZiBzaG91bGQgYmUgcmUtaW5qZWN0ZWQgaW50byB0aGUKLVFVRVJZX1NUUklORy4gIFdoZW4geW91IHdhbnQgdG8gZXJhc2UgYW4gZXhpc3RpbmcgcXVlcnkgc3RyaW5nLCBlbmQgdGhlCi1zdWJzdGl0dXRpb24gc3RyaW5nIHdpdGgganVzdCB0aGUgcXVlc3Rpb24gbWFyay4KLQotPFA+Ci08VEFCTEUgV0lEVEg9IjcwJSIgQk9SREVSPTAgQkdDT0xPUj0iI0UwRTBGMCIgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0xMD4KLTxUUj48VEQ+Ci08U1RST05HPk5vdGljZTwvU1RST05HPjogVGhlcmUgaXMgYSBzcGVjaWFsIGZlYXR1cmUuIFdoZW4geW91IHByZWZpeCBhIHN1YnN0aXR1dGlvbgotZmllbGQgd2l0aCA8Q09ERT5odHRwOi8vPC9DT0RFPjxFTT50aGlzaG9zdDwvRU0+WzxFTT46dGhpc3BvcnQ8L0VNPl0gdGhlbgotPFNUUk9ORz5tb2RfcmV3cml0ZTwvU1RST05HPiBhdXRvbWF0aWNhbGx5IHN0cmlwcyBpdCBvdXQuICAgVGhpcyBhdXRvLXJlZHVjdGlvbiBvbgotaW1wbGljaXQgZXh0ZXJuYWwgcmVkaXJlY3QgVVJMcyBpcyBhIHVzZWZ1bCBhbmQgaW1wb3J0YW50IGZlYXR1cmUgd2hlbgotdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIGEgbWFwcGluZy1mdW5jdGlvbiB3aGljaCBnZW5lcmF0ZXMgdGhlIGhvc3RuYW1lCi1wYXJ0LiAgSGF2ZSBhIGxvb2sgYXQgdGhlIGZpcnN0IGV4YW1wbGUgaW4gdGhlIGV4YW1wbGUgc2VjdGlvbiBiZWxvdyB0bwotdW5kZXJzdGFuZCB0aGlzLgotPC9URD48L1RSPgotPC9UQUJMRT4KLQotPFA+Ci08VEFCTEUgV0lEVEg9IjcwJSIgQk9SREVSPTAgQkdDT0xPUj0iI0UwRTBGMCIgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0xMD4KLTxUUj48VEQ+Ci08U1RST05HPlJlbWVtYmVyOjwvU1RST05HPiBBbiB1bmNvbmRpdGlvbmFsIGV4dGVybmFsIHJlZGlyZWN0IHRvIHlvdXIgb3duIHNlcnZlciB3aWxsCi1ub3Qgd29yayB3aXRoIHRoZSBwcmVmaXggPENPREU+aHR0cDovL3RoaXNob3N0PC9DT0RFPiBiZWNhdXNlIG9mIHRoaXMgZmVhdHVyZS4KLVRvIGFjaGlldmUgc3VjaCBhIHNlbGYtcmVkaXJlY3QsIHlvdSBoYXZlIHRvIHVzZSB0aGUgPFNUUk9ORz5SPC9TVFJPTkc+LWZsYWcgKHNlZQotYmVsb3cpLgotPC9URD48L1RSPgotPC9UQUJMRT4KLQotPFA+Ci1BZGRpdGlvbmFsbHkgeW91IGNhbiBzZXQgc3BlY2lhbCBmbGFncyBmb3IgPEVNPlN1YnN0aXR1dGlvbjwvRU0+IGJ5IGFwcGVuZGluZwotCi08QkxPQ0tRVU9URT48U1RST05HPgotPENPREU+WzwvQ09ERT48RU0+ZmxhZ3M8L0VNPjxDT0RFPl08L0NPREU+Ci08L1NUUk9ORz48L0JMT0NLUVVPVEU+Ci0KLWFzIHRoZSB0aGlyZCBhcmd1bWVudCB0byB0aGUgPENPREU+UmV3cml0ZVJ1bGU8L0NPREU+IGRpcmVjdGl2ZS4gPEVNPkZsYWdzPC9FTT4gaXMgYQotY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIGZvbGxvd2luZyBmbGFnczoKLQotPFVMPgotPExJPic8U1RST05HPjxDT0RFPnJlZGlyZWN0fFI8L0NPREU+IFs9PEVNPmNvZGU8L0VNPl08L1NUUk9ORz4nIChmb3JjZSA8QSBOQU1FPSJyZWRpcmVjdCI+PFNUUk9ORz5yPC9TVFJPTkc+ZWRpcmVjdDwvQT4pPEJSPgotICAgIFByZWZpeCA8RU0+U3Vic3RpdHV0aW9uPC9FTT4KLSAgICB3aXRoIDxDT0RFPmh0dHA6Ly90aGlzaG9zdFs6dGhpc3BvcnRdLzwvQ09ERT4gKHdoaWNoIG1ha2VzIHRoZSBuZXcgVVJMIGEgVVJJKSB0bwotICAgIGZvcmNlIGEgZXh0ZXJuYWwgcmVkaXJlY3Rpb24uIElmIG5vIDxFTT5jb2RlPC9FTT4gaXMgZ2l2ZW4gYSBIVFRQIHJlc3BvbnNlCi0gICAgb2YgMzAyIChNT1ZFRCBURU1QT1JBUklMWSkgaXMgdXNlZC4gSWYgeW91IHdhbnQgdG8gdXNlIG90aGVyIHJlc3BvbnNlCi0gICAgY29kZXMgaW4gdGhlIHJhbmdlIDMwMC00MDAganVzdCBzcGVjaWZ5IHRoZW0gYXMgYSBudW1iZXIgb3IgdXNlCi0gICAgb25lIG9mIHRoZSBmb2xsb3dpbmcgc3ltYm9saWMgbmFtZXM6IDxDT0RFPnRlbXA8L0NPREU+IChkZWZhdWx0KSwgPENPREU+cGVybWFuZW50PC9DT0RFPiwKLSAgICA8Q09ERT5zZWVvdGhlcjwvQ09ERT4uCi0gICAgVXNlIGl0IGZvciBydWxlcyB3aGljaCBzaG91bGQKLSAgICBjYW5vbmljYWxpemUgdGhlIFVSTCBhbmQgZ2l2ZXMgaXQgYmFjayB0byB0aGUgY2xpZW50LCA8RU0+ZS5nLjwvRU0+LCB0cmFuc2xhdGUKLSAgICBgYDxDT0RFPi9+PC9DT0RFPicnIGludG8gYGA8Q09ERT4vdS88L0NPREU+Jycgb3IgYWx3YXlzIGFwcGVuZCBhIHNsYXNoIHRvCi0gICAgPENPREU+L3UvPC9DT0RFPjxFTT51c2VyPC9FTT4sIGV0Yy48QlI+Ci0gICAgPFA+Ci0gICAgPFNUUk9ORz5Ob3RpY2U6PC9TVFJPTkc+IFdoZW4geW91IHVzZSB0aGlzIGZsYWcsIG1ha2Ugc3VyZSB0aGF0IHRoZQotICAgIHN1YnN0aXR1dGlvbiBmaWVsZCBpcyBhIHZhbGlkIFVSTCEgSWYgbm90LCB5b3UgYXJlIHJlZGlyZWN0aW5nIHRvIGFuCi0gICAgaW52YWxpZCBsb2NhdGlvbiEgIEFuZCByZW1lbWJlciB0aGF0IHRoaXMgZmxhZyBpdHNlbGYgb25seSBwcmVmaXhlcyB0aGUKLSAgICBVUkwgd2l0aCA8Q09ERT5odHRwOi8vdGhpc2hvc3RbOnRoaXNwb3J0XS88L0NPREU+LCBidXQgcmV3cml0aW5nIGdvZXMgb24uCi0gICAgVXN1YWxseSB5b3UgYWxzbyB3YW50IHRvIHN0b3AgYW5kIGRvIHRoZSByZWRpcmVjdGlvbiBpbW1lZGlhdGVseS4gIFRvIHN0b3AKLSAgICB0aGUgcmV3cml0aW5nIHlvdSBhbHNvIGhhdmUgdG8gcHJvdmlkZSB0aGUgJ0wnIGZsYWcuCi08UD4KLTxMST4nPFNUUk9ORz48Q09ERT5mb3JiaWRkZW58RjwvQ09ERT48L1NUUk9ORz4nIChmb3JjZSBVUkwgdG8gYmUgPFNUUk9ORz5mPC9TVFJPTkc+b3JiaWRkZW4pPEJSPgotICAgIFRoaXMgZm9yY2VzIHRoZSBjdXJyZW50IFVSTCB0byBiZSBmb3JiaWRkZW4sIDxFTT5pLmUuPC9FTT4sIGl0IGltbWVkaWF0ZWx5IHNlbmRzCi0gICAgYmFjayBhIEhUVFAgcmVzcG9uc2Ugb2YgNDAzIChGT1JCSURERU4pLiBVc2UgdGhpcyBmbGFnIGluIGNvbmp1bmN0aW9uIHdpdGgKLSAgICBhcHByb3ByaWF0ZSBSZXdyaXRlQ29uZHMgdG8gY29uZGl0aW9uYWxseSBibG9jayBzb21lIFVSTHMuCi08UD4KLTxMST4nPFNUUk9ORz48Q09ERT5nb25lfEc8L0NPREU+PC9TVFJPTkc+JyAoZm9yY2UgVVJMIHRvIGJlIDxTVFJPTkc+ZzwvU1RST05HPm9uZSk8QlI+Ci0gICAgVGhpcyBmb3JjZXMgdGhlIGN1cnJlbnQgVVJMIHRvIGJlIGdvbmUsIDxFTT5pLmUuPC9FTT4sIGl0IGltbWVkaWF0ZWx5IHNlbmRzIGJhY2sgYQotICAgIEhUVFAgcmVzcG9uc2Ugb2YgNDEwIChHT05FKS4gVXNlIHRoaXMgZmxhZyB0byBtYXJrIG5vIGxvbmdlciBleGlzdGluZwotICAgIHBhZ2VzIGFzIGdvbmUuCi08UD4KLTxMST4nPFNUUk9ORz48Q09ERT5wcm94eXxQPC9DT0RFPjwvU1RST05HPicgKGZvcmNlIDxTVFJPTkc+cDwvU1RST05HPnJveHkpPEJSPgotICAgIFRoaXMgZmxhZyBmb3JjZXMgdGhlIHN1YnN0aXR1dGlvbiBwYXJ0IHRvIGJlIGludGVybmFsbHkgZm9yY2VkIGFzIGEgcHJveHkKLSAgICByZXF1ZXN0IGFuZCBpbW1lZGlhdGVseSAoPEVNPmkuZS48L0VNPiwgcmV3cml0aW5nIHJ1bGUgcHJvY2Vzc2luZyBzdG9wcyBoZXJlKSBwdXQKLSAgICB0aHJvdWdoIHRoZSA8QSBIUkVGPSJtb2RfcHJveHkuaHRtbCI+cHJveHkgbW9kdWxlPC9BPi4gWW91IGhhdmUgdG8gbWFrZQotICAgIHN1cmUgdGhhdCB0aGUgc3Vic3RpdHV0aW9uIHN0cmluZyBpcyBhIHZhbGlkIFVSSSAoPEVNPmUuZy48L0VNPiwgIHR5cGljYWxseSBzdGFydGluZwotICAgIHdpdGggPENPREU+aHR0cDovLzwvQ09ERT48RU0+aG9zdG5hbWU8L0VNPikgd2hpY2ggY2FuIGJlIGhhbmRsZWQgYnkgdGhlCi0gICAgQXBhY2hlIHByb3h5IG1vZHVsZS4gSWYgbm90IHlvdSBnZXQgYW4gZXJyb3IgZnJvbSB0aGUgcHJveHkgbW9kdWxlLiBVc2UKLSAgICB0aGlzIGZsYWcgdG8gYWNoaWV2ZSBhIG1vcmUgcG93ZXJmdWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxBCi0gICAgSFJFRj0ibW9kX3Byb3h5Lmh0bWwjcHJveHlwYXNzIj5Qcm94eVBhc3M8L0E+IGRpcmVjdGl2ZSwgdG8gbWFwIHNvbWUKLSAgICByZW1vdGUgc3R1ZmYgaW50byB0aGUgbmFtZXNwYWNlIG9mIHRoZSBsb2NhbCBzZXJ2ZXIuCi0gICAgPFA+Ci0gICAgTm90aWNlOiBUbyB1c2UgdGhpcyBmdW5jdGlvbmFsaXR5IG1ha2Ugc3VyZSB5b3UgaGF2ZSB0aGUgcHJveHkgbW9kdWxlCi0gICAgY29tcGlsZWQgaW50byB5b3VyIEFwYWNoZSBzZXJ2ZXIgcHJvZ3JhbS4gIElmIHlvdSBkb24ndCBrbm93IHBsZWFzZSBjaGVjawotICAgIHdoZXRoZXIgPENPREU+bW9kX3Byb3h5LmM8L0NPREU+IGlzIHBhcnQgb2YgdGhlIGBgPENPREU+aHR0cGQgLWw8L0NPREU+JycKLSAgICBvdXRwdXQuIElmIHllcywgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIGF2YWlsYWJsZSB0byBtb2RfcmV3cml0ZS4gSWYgbm90LAotICAgIHRoZW4geW91IGZpcnN0IGhhdmUgdG8gcmVidWlsZCB0aGUgYGA8Q09ERT5odHRwZDwvQ09ERT4nJyBwcm9ncmFtIHdpdGgKLSAgICBtb2RfcHJveHkgZW5hYmxlZC4KLTxQPgotPExJPic8U1RST05HPjxDT0RFPmxhc3R8TDwvQ09ERT48L1NUUk9ORz4nICg8U1RST05HPmw8L1NUUk9ORz5hc3QgcnVsZSk8QlI+Ci0gICAgU3RvcCB0aGUgcmV3cml0aW5nIHByb2Nlc3MgaGVyZSBhbmQKLSAgICBkb24ndCBhcHBseSBhbnkgbW9yZSByZXdyaXRpbmcgcnVsZXMuIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIFBlcmwKLSAgICA8Q09ERT5sYXN0PC9DT0RFPiBjb21tYW5kIG9yIHRoZSA8Q09ERT5icmVhazwvQ09ERT4gY29tbWFuZCBmcm9tIHRoZSBDCi0gICAgbGFuZ3VhZ2UuIFVzZSB0aGlzIGZsYWcgdG8gcHJldmVudCB0aGUgY3VycmVudGx5IHJld3JpdHRlbiBVUkwgZnJvbSBiZWluZwotICAgIHJld3JpdHRlbiBmdXJ0aGVyIGJ5IGZvbGxvd2luZyBydWxlcyB3aGljaCBtYXkgYmUgd3JvbmcuIEZvcgotICAgIGV4YW1wbGUsIHVzZSBpdCB0byByZXdyaXRlIHRoZSByb290LXBhdGggVVJMICgnPENPREU+LzwvQ09ERT4nKSB0byBhIHJlYWwKLSAgICBvbmUsIDxFTT5lLmcuPC9FTT4sICc8Q09ERT4vZS93d3cvPC9DT0RFPicuCi08UD4KLTxMST4nPFNUUk9ORz48Q09ERT5uZXh0fE48L0NPREU+PC9TVFJPTkc+JyAoPFNUUk9ORz5uPC9TVFJPTkc+ZXh0IHJvdW5kKTxCUj4KLSAgICBSZS1ydW4gdGhlIHJld3JpdGluZyBwcm9jZXNzIChzdGFydGluZyBhZ2FpbiB3aXRoIHRoZSBmaXJzdCByZXdyaXRpbmcKLSAgICBydWxlKS4gSGVyZSB0aGUgVVJMIHRvIG1hdGNoIGlzIGFnYWluIG5vdCB0aGUgb3JpZ2luYWwgVVJMIGJ1dCB0aGUgVVJMCi0gICAgZnJvbSB0aGUgbGFzdCByZXdyaXRpbmcgcnVsZS4gIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIFBlcmwKLSAgICA8Q09ERT5uZXh0PC9DT0RFPiBjb21tYW5kIG9yIHRoZSA8Q09ERT5jb250aW51ZTwvQ09ERT4gY29tbWFuZCBmcm9tIHRoZSBDCi0gICAgbGFuZ3VhZ2UuIFVzZSB0aGlzIGZsYWcgdG8gcmVzdGFydCB0aGUgcmV3cml0aW5nIHByb2Nlc3MsIDxFTT5pLmUuPC9FTT4sICB0bwotICAgIGltbWVkaWF0ZWx5IGdvIHRvIHRoZSB0b3Agb2YgdGhlIGxvb3AuIDxCUj4KLSAgICA8U1RST05HPkJ1dCBiZSBjYXJlZnVsIG5vdCB0byBjcmVhdGUgYSBkZWFkbG9vcCE8L1NUUk9ORz4KLTxQPgotPExJPic8U1RST05HPjxDT0RFPmNoYWlufEM8L0NPREU+PC9TVFJPTkc+JyAoPFNUUk9ORz5jPC9TVFJPTkc+aGFpbmVkIHdpdGggbmV4dCBydWxlKTxCUj4KLSAgICBUaGlzIGZsYWcgY2hhaW5zIHRoZSBjdXJyZW50IHJ1bGUgd2l0aCB0aGUgbmV4dCBydWxlICh3aGljaCBpdHNlbGYgY2FuCi0gICAgYWxzbyBiZSBjaGFpbmVkIHdpdGggaXRzIGZvbGxvd2luZyBydWxlLCA8RU0+ZXRjLjwvRU0+KS4gVGhpcyBoYXMgdGhlIGZvbGxvd2luZwotICAgIGVmZmVjdDogaWYgYSBydWxlIG1hdGNoZXMsIHRoZW4gcHJvY2Vzc2luZyBjb250aW51ZXMgYXMgdXN1YWwsIDxFTT5pLmUuPC9FTT4sIHRoZQotICAgIGZsYWcgaGFzIG5vIGVmZmVjdC4gSWYgdGhlIHJ1bGUgZG9lcyA8U1RST05HPm5vdDwvU1RST05HPiBtYXRjaCwgdGhlbiBhbGwgZm9sbG93aW5nCi0gICAgY2hhaW5lZCBydWxlcyBhcmUgc2tpcHBlZC4gICBGb3IgaW5zdGFuY2UsIHVzZSBpdCB0byByZW1vdmUgdGhlCi0gICAgYGA8Q09ERT4ud3d3PC9DT0RFPicnIHBhcnQgaW5zaWRlIGEgcGVyLWRpcmVjdG9yeSBydWxlIHNldCB3aGVuIHlvdSBsZXQgYW4KLSAgICBleHRlcm5hbCByZWRpcmVjdCBoYXBwZW4gKHdoZXJlIHRoZSBgYDxDT0RFPi53d3c8L0NPREU+JycgcGFydCBzaG91bGQgbm90IHRvCi0gICAgb2NjdXIhKS4KLTxQPgotPExJPic8U1RST05HPjxDT0RFPnR5cGV8VDwvQ09ERT48L1NUUk9ORz49PEVNPk1JTUUtdHlwZTwvRU0+JyAoZm9yY2UgTUlNRSA8U1RST05HPnQ8L1NUUk9ORz55cGUpPEJSPgotICAgIEZvcmNlIHRoZSBNSU1FLXR5cGUgb2YgdGhlIHRhcmdldCBmaWxlIHRvIGJlIDxFTT5NSU1FLXR5cGU8L0VNPi4gRm9yCi0gICAgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIHVzZWQgdG8gc2ltdWxhdGUgdGhlIDxDT0RFPm1vZF9hbGlhczwvQ09ERT4KLSAgICBkaXJlY3RpdmUgPENPREU+U2NyaXB0QWxpYXM8L0NPREU+IHdoaWNoIGludGVybmFsbHkgZm9yY2VzIGFsbCBmaWxlcyBpbnNpZGUKLSAgICB0aGUgbWFwcGVkIGRpcmVjdG9yeSB0byBoYXZlIGEgTUlNRSB0eXBlIG9mCi0gICAgYGA8Q09ERT5hcHBsaWNhdGlvbi94LWh0dHBkLWNnaTwvQ09ERT4nJy4KLTxQPgotPExJPic8U1RST05HPjxDT0RFPm5vc3VicmVxfE5TPC9DT0RFPjwvU1RST05HPicgKHVzZWQgb25seSBpZiA8U1RST05HPm48L1NUUk9ORz5vIGludGVybmFsIDxTVFJPTkc+czwvU1RST05HPnViLXJlcXVlc3QpPEJSPgotICAgIFRoaXMgZmxhZyBmb3JjZXMgdGhlIHJld3JpdGluZyBlbmdpbmUgdG8gc2tpcCBhIHJld3JpdGluZyBydWxlIGlmIHRoZQotICAgIGN1cnJlbnQgcmVxdWVzdCBpcyBhbiBpbnRlcm5hbCBzdWItcmVxdWVzdC4gRm9yIGluc3RhbmNlLCBzdWItcmVxdWVzdHMKLSAgICBvY2N1ciBpbnRlcm5hbGx5IGluIEFwYWNoZSB3aGVuIDxDT0RFPm1vZF9pbmNsdWRlPC9DT0RFPiB0cmllcyB0byBmaW5kIG91dAotICAgIGluZm9ybWF0aW9uIGFib3V0IHBvc3NpYmxlIGRpcmVjdG9yeSBkZWZhdWx0IGZpbGVzICg8Q09ERT5pbmRleC54eHg8L0NPREU+KS4KLSAgICBPbiBzdWItcmVxdWVzdHMgaXQgaXMgbm90IGFsd2F5cyB1c2VmdWwgYW5kIGV2ZW4gc29tZXRpbWVzIGNhdXNlcyBhIGZhaWx1cmUgdG8KLSAgICBpZiB0aGUgY29tcGxldGUgc2V0IG9mIHJ1bGVzIGFyZSBhcHBsaWVkLiBVc2UgdGhpcyBmbGFnIHRvIGV4Y2x1ZGUgc29tZSBydWxlcy48QlI+Ci0gICAgPFA+Ci0gICAgVXNlIHRoZSBmb2xsb3dpbmcgcnVsZSBmb3IgeW91ciBkZWNpc2lvbjogd2hlbmV2ZXIgeW91IHByZWZpeCBzb21lIFVSTHMKLSAgICB3aXRoIENHSS1zY3JpcHRzIHRvIGZvcmNlIHRoZW0gdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSBDR0ktc2NyaXB0LCB0aGUKLSAgICBjaGFuY2UgaXMgaGlnaCB0aGF0IHlvdSB3aWxsIHJ1biBpbnRvIHByb2JsZW1zIChvciBldmVuIG92ZXJoZWFkKSBvbiBzdWItcmVxdWVzdHMuCi0gICAgSW4gdGhlc2UgY2FzZXMsIHVzZSB0aGlzIGZsYWcuCi08UD4KLTxMST4nPFNUUk9ORz48Q09ERT5ub2Nhc2V8TkM8L0NPREU+PC9TVFJPTkc+JyAoPFNUUk9ORz5uPC9TVFJPTkc+byA8U1RST05HPmM8L1NUUk9ORz5hc2UpPEJSPgotCVRoaXMgbWFrZXMgdGhlIDxFTT5QYXR0ZXJuPC9FTT4gY2FzZS1pbnNlbnNpdGl2ZSwgPEVNPmkuZS48L0VNPiwgdGhlcmUgaXMKLQlubyBkaWZmZXJlbmNlIGJldHdlZW4gJ0EtWicgYW5kICdhLXonIHdoZW4gPEVNPlBhdHRlcm48L0VNPiBpcyBtYXRjaGVkCi0JYWdhaW5zdCB0aGUgY3VycmVudCBVUkwuCi08UD4KLTxMST4nPFNUUk9ORz48Q09ERT5xc2FwcGVuZHxRU0E8L0NPREU+PC9TVFJPTkc+JyAoPFNUUk9ORz5xPC9TVFJPTkc+dWVyeSA8U1RST05HPnM8L1NUUk9ORz50cmluZwotICAgIDxTVFJPTkc+YTwvU1RST05HPnBwZW5kKTxCUj4gCi0gICAgVGhpcyBmbGFnIGZvcmNlcyB0aGUgcmV3cml0aW5nIGVuZ2luZSB0byBhcHBlbmQgYSBxdWVyeQotICAgIHN0cmluZyBwYXJ0IGluIHRoZSBzdWJzdGl0dXRpb24gc3RyaW5nIHRvIHRoZSBleGlzdGluZyBvbmUgaW5zdGVhZCBvZgotICAgIHJlcGxhY2luZyBpdC4gIFVzZSB0aGlzIHdoZW4geW91IHdhbnQgdG8gYWRkIG1vcmUgZGF0YSB0byB0aGUgcXVlcnkgc3RyaW5nCi0gICAgdmlhIGEgcmV3cml0ZSBydWxlLgotPFA+Ci08TEk+JzxTVFJPTkc+PENPREU+cGFzc3Rocm91Z2h8UFQ8L0NPREU+PC9TVFJPTkc+JyAoPFNUUk9ORz5wPC9TVFJPTkc+YXNzIDxTVFJPTkc+dDwvU1RST05HPmhyb3VnaCB0byBuZXh0IGhhbmRsZXIpPEJSPgotICAgIFRoaXMgZmxhZyBmb3JjZXMgdGhlIHJld3JpdGluZyBlbmdpbmUgdG8gc2V0IHRoZSA8Q09ERT51cmk8L0NPREU+IGZpZWxkCi0gICAgb2YgdGhlIGludGVybmFsIDxDT0RFPnJlcXVlc3RfcmVjPC9DT0RFPiBzdHJ1Y3R1cmUgdG8gdGhlIHZhbHVlCi0gICAgb2YgdGhlIDxDT0RFPmZpbGVuYW1lPC9DT0RFPiBmaWVsZC4gIFRoaXMgZmxhZyBpcyBqdXN0IGEgaGFjayB0byBiZSBhYmxlCi0gICAgdG8gcG9zdC1wcm9jZXNzIHRoZSBvdXRwdXQgb2YgPENPREU+UmV3cml0ZVJ1bGU8L0NPREU+IGRpcmVjdGl2ZXMgYnkKLSAgICA8Q09ERT5BbGlhczwvQ09ERT4sIDxDT0RFPlNjcmlwdEFsaWFzPC9DT0RFPiwgPENPREU+UmVkaXJlY3Q8L0NPREU+LCA8RU0+ZXRjLjwvRU0+IGRpcmVjdGl2ZXMKLSAgICBmcm9tIG90aGVyIFVSSS10by1maWxlbmFtZSB0cmFuc2xhdG9ycy4gQSB0cml2aWFsIGV4YW1wbGUgdG8gc2hvdyB0aGUKLSAgICBzZW1hbnRpY3M6Ci0gICAgSWYgeW91IHdhbnQgdG8gcmV3cml0ZSA8Q09ERT4vYWJjPC9DT0RFPiB0byA8Q09ERT4vZGVmPC9DT0RFPiB2aWEgdGhlIHJld3JpdGluZwotICAgIGVuZ2luZSBvZiA8Q09ERT5tb2RfcmV3cml0ZTwvQ09ERT4gYW5kIHRoZW4gPENPREU+L2RlZjwvQ09ERT4gdG8gPENPREU+L2doaTwvQ09ERT4KLSAgICB3aXRoIDxDT0RFPm1vZF9hbGlhczwvQ09ERT46Ci0gICAgPFBSRT4KLSAgICBSZXdyaXRlUnVsZSBeL2FiYyguKikgIC9kZWYkMSBbUFRdCi0gICAgQWxpYXMgICAgICAgL2RlZiAgICAgICAvZ2hpCi0gICAgPC9QUkU+Ci0gICAgSWYgeW91IG9taXQgdGhlIDxDT0RFPlBUPC9DT0RFPiBmbGFnIHRoZW4gPENPREU+bW9kX3Jld3JpdGU8L0NPREU+Ci0gICAgd2lsbCBkbyBpdHMgam9iIGZpbmUsIDxFTT5pLmUuPC9FTT4sIGl0IHJld3JpdGVzIDxDT0RFPnVyaT0vYWJjLy4uLjwvQ09ERT4gdG8KLSAgICA8Q09ERT5maWxlbmFtZT0vZGVmLy4uLjwvQ09ERT4gYXMgYSBmdWxsIEFQSS1jb21wbGlhbnQgVVJJLXRvLWZpbGVuYW1lCi0gICAgdHJhbnNsYXRvciBzaG91bGQgZG8uIFRoZW4gPENPREU+bW9kX2FsaWFzPC9DT0RFPiBjb21lcyBhbmQgdHJpZXMgdG8gZG8gYQotICAgIFVSSS10by1maWxlbmFtZSB0cmFuc2l0aW9uIHdoaWNoIHdpbGwgbm90IHdvcmsuCi0gICAgPFA+Ci0gICAgTm90aWNlOiA8U1RST05HPllvdSBoYXZlIHRvIHVzZSB0aGlzIGZsYWcgaWYgeW91IHdhbnQgdG8gaW50ZXJtaXggZGlyZWN0aXZlcwotICAgIG9mIGRpZmZlcmVudCBtb2R1bGVzIHdoaWNoIGNvbnRhaW4gVVJMLXRvLWZpbGVuYW1lIHRyYW5zbGF0b3JzPC9TVFJPTkc+LiBUaGUKLSAgICB0eXBpY2FsIGV4YW1wbGUgaXMgdGhlIHVzZSBvZiA8Q09ERT5tb2RfYWxpYXM8L0NPREU+IGFuZAotICAgIDxDT0RFPm1vZF9yZXdyaXRlPC9DT0RFPi4uCi08UD4KLTxUQUJMRSBXSURUSD0iNzAlIiBCT1JERVI9MCBCR0NPTE9SPSIjRTBFMEYwIiBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTEwPgotPFRSPjxURD4KLTxmb250IHNpemU9LTE+Ci0gICAgPFNUUk9ORz5Ob3RpY2UgLSBGb3IgdGhlIEFwYWNoZSBoYWNrZXJzOjwvU1RST05HPjxCUj4KLSAgICBJZiB0aGUgY3VycmVudCBBcGFjaGUgQVBJIGhhZCBhCi0gICAgZmlsZW5hbWUtdG8tZmlsZW5hbWUgaG9vayBhZGRpdGlvbmFsbHkgdG8gdGhlIFVSSS10by1maWxlbmFtZSBob29rIHRoZW4KLSAgICB3ZSB3b3VsZG4ndCBuZWVkIHRoaXMgZmxhZyEgIEJ1dCB3aXRob3V0ICBzdWNoIGEgaG9vayB0aGlzIGZsYWcgaXMgdGhlCi0gICAgb25seSBzb2x1dGlvbi4gVGhlIEFwYWNoZSBHcm91cCBoYXMgZGlzY3Vzc2VkIHRoaXMgcHJvYmxlbSBhbmQgd2lsbAotICAgIGFkZCBzdWNoIGhvb2tzIGludG8gQXBhY2hlIHZlcnNpb24gMi4wLgotPC9GT05UPgotPC9URD48L1RSPgotPC9UQUJMRT4KLTxQPgotPExJPic8U1RST05HPjxDT0RFPnNraXB8UzwvQ09ERT48L1NUUk9ORz49PEVNPm51bTwvRU0+JyAoPFNUUk9ORz5zPC9TVFJPTkc+a2lwIG5leHQgcnVsZShzKSk8QlI+Ci0gICAgVGhpcyBmbGFnIGZvcmNlcyB0aGUgcmV3cml0aW5nIGVuZ2luZSB0byBza2lwIHRoZSBuZXh0IDxFTT5udW08L0VNPiBydWxlcwotICAgIGluIHNlcXVlbmNlIHdoZW4gdGhlIGN1cnJlbnQgcnVsZSBtYXRjaGVzLiBVc2UgdGhpcyB0byBtYWtlIHBzZXVkbwotICAgIGlmLXRoZW4tZWxzZSBjb25zdHJ1Y3RzOiBUaGUgbGFzdCBydWxlIG9mIHRoZSB0aGVuLWNsYXVzZSBiZWNvbWVzCi0gICAgYSA8Q09ERT5za2lwPU48L0NPREU+IHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBydWxlcyBpbiB0aGUgZWxzZS1jbGF1c2UuCi0gICAgKFRoaXMgaXMgPFNUUk9ORz5ub3Q8L1NUUk9ORz4gdGhlIHNhbWUgYXMgdGhlICdjaGFpbnxDJyBmbGFnISkKLTxQPgotPExJPic8U1RST05HPjxDT0RFPmVudnxFPTwvQ09ERT48L1NUUk9ORz48RU0+VkFSPC9FTT46PEVNPlZBTDwvRU0+JyAoc2V0IDxTVFJPTkc+ZTwvU1RST05HPm52aXJvbm1lbnQgdmFyaWFibGUpPEJSPgotICAgIFRoaXMgZm9yY2VzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVkIDxFTT5WQVI8L0VNPiB0byBiZSBzZXQgdG8gdGhlCi0gICAgdmFsdWUgPEVNPlZBTDwvRU0+LCB3aGVyZSA8RU0+VkFMPC9FTT4gY2FuIGNvbnRhaW4gcmVnZXhwIGJhY2tyZWZlcmVuY2VzCi0gICAgPENPREU+JE48L0NPREU+IGFuZCA8Q09ERT4lTjwvQ09ERT4gd2hpY2ggd2lsbCBiZSBleHBhbmRlZC4gWW91IGNhbiB1c2UgdGhpcyBmbGFnCi0gICAgbW9yZSB0aGFuIG9uY2UgdG8gc2V0IG1vcmUgdGhhbiBvbmUgdmFyaWFibGUuIFRoZSB2YXJpYWJsZXMgY2FuIGJlIGxhdGVyCi0gICAgZGVyZWZlcmVuY2VkIGF0IGEgbG90IG9mIHNpdHVhdGlvbnMsIGJ1dCB0aGUgdXN1YWwgbG9jYXRpb24gd2lsbCBiZSBmcm9tCi0gICAgd2l0aGluIFhTU0kgKHZpYSA8Q09ERT4mbHQ7IS0tI2VjaG8gdmFyPSJWQVIiLS0mZ3Q7PC9DT0RFPikgb3IgQ0dJICg8RU0+ZS5nLjwvRU0+Ci0gICAgPENPREU+JEVOVnsnVkFSJ308L0NPREU+KS4gIEJ1dCBhZGRpdGlvbmFsbHkgeW91IGNhbiBhbHNvIGRlcmVmZXJlbmNlIGl0IGluIGEKLSAgICBmb2xsb3dpbmcgUmV3cml0ZUNvbmQgcGF0dGVybiB2aWEgPENPREU+JXtFTlY6VkFSfTwvQ09ERT4uIFVzZSB0aGlzIHRvIHN0cmlwCi0gICAgYnV0IHJlbWVtYmVyIGluZm9ybWF0aW9uIGZyb20gVVJMcy4KLTwvVUw+Ci0KLTxQPgotPFRBQkxFIFdJRFRIPSI3MCUiIEJPUkRFUj0wIEJHQ09MT1I9IiNFMEUwRjAiIENFTExTUEFDSU5HPTAgQ0VMTFBBRERJTkc9MTA+Ci08VFI+PFREPgotPFNUUk9ORz5Ob3RpY2U6PC9TVFJPTkc+IE5ldmVyIGZvcmdldCB0aGF0IDxFTT5QYXR0ZXJuPC9FTT4gZ2V0cyBhcHBsaWVkIHRvIGEgY29tcGxldGUgVVJMCi1pbiBwZXItc2VydmVyIGNvbmZpZ3VyYXRpb24gZmlsZXMuIDxTVFJPTkc+QnV0IGluIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbgotZmlsZXMsIHRoZSBwZXItZGlyZWN0b3J5IHByZWZpeCAod2hpY2ggYWx3YXlzIGlzIHRoZSBzYW1lIGZvciBhIHNwZWNpZmljCi1kaXJlY3RvcnkhKSBnZXRzIGF1dG9tYXRpY2FsbHkgPEVNPnJlbW92ZWQ8L0VNPiBmb3IgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgYW5kCi1hdXRvbWF0aWNhbGx5IDxFTT5hZGRlZDwvRU0+IGFmdGVyIHRoZSBzdWJzdGl0dXRpb24gaGFzIGJlZW4gZG9uZS48L1NUUk9ORz4gVGhpcyBmZWF0dXJlIGlzCi1lc3NlbnRpYWwgZm9yIG1hbnkgc29ydHMgb2YgcmV3cml0aW5nLCBiZWNhdXNlIHdpdGhvdXQgdGhpcyBwcmVmaXggc3RyaXBwaW5nCi15b3UgaGF2ZSB0byBtYXRjaCB0aGUgcGFyZW50IGRpcmVjdG9yeSB3aGljaCBpcyBub3QgYWx3YXlzIHBvc3NpYmxlLgotPFA+Ci1UaGVyZSBpcyBvbmUgZXhjZXB0aW9uOiBJZiBhIHN1YnN0aXR1dGlvbiBzdHJpbmcgc3RhcnRzIHdpdGgKLWBgPENPREU+aHR0cDovLzwvQ09ERT4nJyB0aGVuIHRoZSBkaXJlY3RvcnkgcHJlZml4IHdpbGwgYmUgPFNUUk9ORz5ub3Q8L1NUUk9ORz4gYWRkZWQgYW5kIGEKLWV4dGVybmFsIHJlZGlyZWN0IG9yIHByb3h5IHRocm91Z2hwdXQgKGlmIGZsYWcgPFNUUk9ORz5QPC9TVFJPTkc+IGlzIHVzZWQhKSBpcyBmb3JjZWQhCi08L1REPjwvVFI+Ci08L1RBQkxFPgotCi08UD4KLTxUQUJMRSBXSURUSD0iNzAlIiBCT1JERVI9MCBCR0NPTE9SPSIjRTBFMEYwIiBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTEwPgotPFRSPjxURD4KLTxTVFJPTkc+Tm90aWNlOjwvU1RST05HPiBUbyBlbmFibGUgdGhlIHJld3JpdGluZyBlbmdpbmUgZm9yIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiBmaWxlcwoteW91IG5lZWQgdG8gc2V0IGBgPENPREU+UmV3cml0ZUVuZ2luZSBPbjwvQ09ERT4nJyBpbiB0aGVzZSBmaWxlcyA8U1RST05HPmFuZDwvU1RST05HPgotYGA8Q09ERT5PcHRpb24gRm9sbG93U3ltTGlua3M8L0NPREU+JycgZW5hYmxlZC4gSWYgeW91ciBhZG1pbmlzdHJhdG9yIGhhcwotZGlzYWJsZWQgb3ZlcnJpZGUgb2YgPENPREU+Rm9sbG93U3ltTGlua3M8L0NPREU+IGZvciBhIHVzZXIncyBkaXJlY3RvcnksIHRoZW4KLXlvdSBjYW5ub3QgdXNlIHRoZSByZXdyaXRpbmcgZW5naW5lLiAgVGhpcyByZXN0cmljdGlvbiBpcyBuZWVkZWQgZm9yCi1zZWN1cml0eSByZWFzb25zLgotPC9URD48L1RSPgotPC9UQUJMRT4KLQotPFA+Ci1IZXJlIGFyZSBhbGwgcG9zc2libGUgc3Vic3RpdHV0aW9uIGNvbWJpbmF0aW9ucyBhbmQgdGhlaXIgbWVhbmluZ3M6Ci0KLTxQPgotPFNUUk9ORz5JbnNpZGUgcGVyLXNlcnZlciBjb25maWd1cmF0aW9uICg8Q09ERT5odHRwZC5jb25mPC9DT0RFPik8QlI+Ci1mb3IgcmVxdWVzdCBgYDxDT0RFPkdFVCAvc29tZXBhdGgvcGF0aGluZm88L0NPREU+Jyc6PC9TVFJPTkc+PEJSPgotCi08UD4KLTxUQUJMRSBCR0NPTE9SPSIjRjBGMEYwIiBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTU+Ci08VFI+Ci08VEQ+Ci08UFJFPgotPFNUUk9ORz5HaXZlbiBSdWxlPC9TVFJPTkc+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U1RST05HPlJlc3VsdGluZyBTdWJzdGl0dXRpb248L1NUUk9ORz4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLV4vc29tZXBhdGgoLiopIG90aGVycGF0aCQxICAgICAgICAgICAgICAgICAgICAgIG5vdCBzdXBwb3J0ZWQsIGJlY2F1c2UgaW52YWxpZCEKLQotXi9zb21lcGF0aCguKikgb3RoZXJwYXRoJDEgIFtSXSAgICAgICAgICAgICAgICAgbm90IHN1cHBvcnRlZCwgYmVjYXVzZSBpbnZhbGlkIQotCi1eL3NvbWVwYXRoKC4qKSBvdGhlcnBhdGgkMSAgW1BdICAgICAgICAgICAgICAgICBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIGludmFsaWQhCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1eL3NvbWVwYXRoKC4qKSAvb3RoZXJwYXRoJDEgICAgICAgICAgICAgICAgICAgICAvb3RoZXJwYXRoL3BhdGhpbmZvCi0KLV4vc29tZXBhdGgoLiopIC9vdGhlcnBhdGgkMSBbUl0gICAgICAgICAgICAgICAgIGh0dHA6Ly90aGlzaG9zdC9vdGhlcnBhdGgvcGF0aGluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYSBleHRlcm5hbCByZWRpcmVjdGlvbgotCi1eL3NvbWVwYXRoKC4qKSAvb3RoZXJwYXRoJDEgW1BdICAgICAgICAgICAgICAgICBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIHNpbGx5IQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotXi9zb21lcGF0aCguKikgaHR0cDovL3RoaXNob3N0L290aGVycGF0aCQxICAgICAgL290aGVycGF0aC9wYXRoaW5mbwotCi1eL3NvbWVwYXRoKC4qKSBodHRwOi8vdGhpc2hvc3Qvb3RoZXJwYXRoJDEgW1JdICBodHRwOi8vdGhpc2hvc3Qvb3RoZXJwYXRoL3BhdGhpbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWEgZXh0ZXJuYWwgcmVkaXJlY3Rpb24KLQotXi9zb21lcGF0aCguKikgaHR0cDovL3RoaXNob3N0L290aGVycGF0aCQxIFtQXSAgbm90IHN1cHBvcnRlZCwgYmVjYXVzZSBzaWxseSEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLV4vc29tZXBhdGgoLiopIGh0dHA6Ly9vdGhlcmhvc3Qvb3RoZXJwYXRoJDEgICAgIGh0dHA6Ly9vdGhlcmhvc3Qvb3RoZXJwYXRoL3BhdGhpbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWEgZXh0ZXJuYWwgcmVkaXJlY3Rpb24KLQotXi9zb21lcGF0aCguKikgaHR0cDovL290aGVyaG9zdC9vdGhlcnBhdGgkMSBbUl0gaHR0cDovL290aGVyaG9zdC9vdGhlcnBhdGgvcGF0aGluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYSBleHRlcm5hbCByZWRpcmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoZSBbUl0gZmxhZyBpcyByZWR1bmRhbnQpCi0KLV4vc29tZXBhdGgoLiopIGh0dHA6Ly9vdGhlcmhvc3Qvb3RoZXJwYXRoJDEgW1BdIGh0dHA6Ly9vdGhlcmhvc3Qvb3RoZXJwYXRoL3BhdGhpbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWEgaW50ZXJuYWwgcHJveHkKLTwvUFJFPgotPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08UD4KLTxTVFJPTkc+SW5zaWRlIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiBmb3IgPENPREU+L3NvbWVwYXRoPC9DT0RFPjxCUj4KLSg8RU0+aS5lLjwvRU0+LCBmaWxlIDxDT0RFPi5odGFjY2VzczwvQ09ERT4gaW4gZGlyIDxDT0RFPi9waHlzaWNhbC9wYXRoL3RvL3NvbWVwYXRoPC9DT0RFPiBjb250YWluaW5nCi08Q09ERT5SZXdyaXRlQmFzZSAvc29tZXBhdGg8L0NPREU+KTxCUj4gZm9yCi1yZXF1ZXN0IGBgPENPREU+R0VUIC9zb21lcGF0aC9sb2NhbHBhdGgvcGF0aGluZm88L0NPREU+Jyc6PC9TVFJPTkc+PEJSPgotCi08UD4KLTxUQUJMRSBCR0NPTE9SPSIjRjBGMEYwIiBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTU+Ci08VFI+Ci08VEQ+Ci08UFJFPgotPFNUUk9ORz5HaXZlbiBSdWxlPC9TVFJPTkc+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U1RST05HPlJlc3VsdGluZyBTdWJzdGl0dXRpb248L1NUUk9ORz4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLV5sb2NhbHBhdGgoLiopIG90aGVycGF0aCQxICAgICAgICAgICAgICAgICAgICAgIC9zb21lcGF0aC9vdGhlcnBhdGgvcGF0aGluZm8KLQotXmxvY2FscGF0aCguKikgb3RoZXJwYXRoJDEgIFtSXSAgICAgICAgICAgICAgICAgaHR0cDovL3RoaXNob3N0L3NvbWVwYXRoL290aGVycGF0aC9wYXRoaW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlhIGV4dGVybmFsIHJlZGlyZWN0aW9uCi0KLV5sb2NhbHBhdGgoLiopIG90aGVycGF0aCQxICBbUF0gICAgICAgICAgICAgICAgIG5vdCBzdXBwb3J0ZWQsIGJlY2F1c2Ugc2lsbHkhCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1ebG9jYWxwYXRoKC4qKSAvb3RoZXJwYXRoJDEgICAgICAgICAgICAgICAgICAgICAvb3RoZXJwYXRoL3BhdGhpbmZvCi0KLV5sb2NhbHBhdGgoLiopIC9vdGhlcnBhdGgkMSBbUl0gICAgICAgICAgICAgICAgIGh0dHA6Ly90aGlzaG9zdC9vdGhlcnBhdGgvcGF0aGluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYSBleHRlcm5hbCByZWRpcmVjdGlvbgotCi1ebG9jYWxwYXRoKC4qKSAvb3RoZXJwYXRoJDEgW1BdICAgICAgICAgICAgICAgICBub3Qgc3VwcG9ydGVkLCBiZWNhdXNlIHNpbGx5IQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotXmxvY2FscGF0aCguKikgaHR0cDovL3RoaXNob3N0L290aGVycGF0aCQxICAgICAgL290aGVycGF0aC9wYXRoaW5mbwotCi1ebG9jYWxwYXRoKC4qKSBodHRwOi8vdGhpc2hvc3Qvb3RoZXJwYXRoJDEgW1JdICBodHRwOi8vdGhpc2hvc3Qvb3RoZXJwYXRoL3BhdGhpbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWEgZXh0ZXJuYWwgcmVkaXJlY3Rpb24KLQotXmxvY2FscGF0aCguKikgaHR0cDovL3RoaXNob3N0L290aGVycGF0aCQxIFtQXSAgbm90IHN1cHBvcnRlZCwgYmVjYXVzZSBzaWxseSEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLV5sb2NhbHBhdGgoLiopIGh0dHA6Ly9vdGhlcmhvc3Qvb3RoZXJwYXRoJDEgICAgIGh0dHA6Ly9vdGhlcmhvc3Qvb3RoZXJwYXRoL3BhdGhpbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWEgZXh0ZXJuYWwgcmVkaXJlY3Rpb24KLQotXmxvY2FscGF0aCguKikgaHR0cDovL290aGVyaG9zdC9vdGhlcnBhdGgkMSBbUl0gaHR0cDovL290aGVyaG9zdC9vdGhlcnBhdGgvcGF0aGluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYSBleHRlcm5hbCByZWRpcmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoZSBbUl0gZmxhZyBpcyByZWR1bmRhbnQpCi0KLV5sb2NhbHBhdGgoLiopIGh0dHA6Ly9vdGhlcmhvc3Qvb3RoZXJwYXRoJDEgW1BdIGh0dHA6Ly9vdGhlcmhvc3Qvb3RoZXJwYXRoL3BhdGhpbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWEgaW50ZXJuYWwgcHJveHkKLTwvUFJFPgotPC9URD4KLTwvVFI+Ci08L1RBQkxFPgotCi08UD4KLTxTVFJPTkc+RXhhbXBsZTo8L1NUUk9ORz4KLTxQPgotPEJMT0NLUVVPVEU+Ci1XZSB3YW50IHRvIHJld3JpdGUgVVJMcyBvZiB0aGUgZm9ybQotPEJMT0NLUVVPVEU+Ci08Q09ERT4vPC9DT0RFPiA8RU0+TGFuZ3VhZ2U8L0VNPgotPENPREU+L348L0NPREU+IDxFTT5SZWFsbmFtZTwvRU0+Ci08Q09ERT4vLi4uLzwvQ09ERT4gPEVNPkZpbGU8L0VNPgotPC9CTE9DS1FVT1RFPgotaW50bwotPEJMT0NLUVVPVEU+Ci08Q09ERT4vdS88L0NPREU+IDxFTT5Vc2VybmFtZTwvRU0+Ci08Q09ERT4vLi4uLzwvQ09ERT4gPEVNPkZpbGU8L0VNPgotPENPREU+LjwvQ09ERT4gPEVNPkxhbmd1YWdlPC9FTT4KLTwvQkxPQ0tRVU9URT4KLTxQPgotV2UgdGFrZSB0aGUgcmV3cml0ZSBtYXBmaWxlIGZyb20gYWJvdmUgYW5kIHNhdmUgaXQgdW5kZXIKLTxDT0RFPi9wYXRoL3RvL2ZpbGUvbWFwLnR4dDwvQ09ERT4uIFRoZW4gd2Ugb25seSBoYXZlIHRvIGFkZCB0aGUKLWZvbGxvd2luZyBsaW5lcyB0byB0aGUgQXBhY2hlIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGU6Ci0KLTxCTE9DS1FVT1RFPgotPFBSRT4KLVJld3JpdGVMb2cgICAvcGF0aC90by9maWxlL3Jld3JpdGUubG9nCi1SZXdyaXRlTWFwICAgcmVhbC10by11c2VyICAgICAgICAgICAgICAgdHh0Oi9wYXRoL3RvL2ZpbGUvbWFwLnR4dAotUmV3cml0ZVJ1bGUgIF4vKFteL10rKS9+KFteL10rKS8oLiopJCAgIC91LyR7cmVhbC10by11c2VyOiQyfG5vYm9keX0vJDMuJDEKLTwvUFJFPgotPC9CTE9DS1FVT1RFPgotCi08L0JMT0NLUVVPVEU+Ci0KLTxQPgotPEhSIE5PU0hBREUgU0laRT0xPgotCi08Q0VOVEVSPgotPEgxPjxBIE5BTUU9Ik1pc2NlbGxlbmVvdXMiPk1pc2NlbGxhbmVvdXM8L0E+PC9IMT4KLTwvQ0VOVEVSPgotCi08UD4KLTxIUiBOT1NIQURFIFNJWkU9MT4KLQotPEgyPjxBIE5BTUU9IkVudlZhciI+RW52aXJvbm1lbnQgVmFyaWFibGVzPC9BPjwvSDI+Ci0KLVRoaXMgbW9kdWxlIGtlZXBzIHRyYWNrIG9mIHR3byBhZGRpdGlvbmFsIChub24tc3RhbmRhcmQpIENHSS9TU0kgZW52aXJvbm1lbnQKLXZhcmlhYmxlcyBuYW1lZCA8Q09ERT5TQ1JJUFRfVVJMPC9DT0RFPiBhbmQgPENPREU+U0NSSVBUX1VSSTwvQ09ERT4uIFRoZXNlIGNvbnRhaW4KLXRoZSA8RU0+bG9naWNhbDwvRU0+IFdlYi12aWV3IHRvIHRoZSBjdXJyZW50IHJlc291cmNlLCB3aGlsZSB0aGUgc3RhbmRhcmQgQ0dJL1NTSQotdmFyaWFibGVzIDxDT0RFPlNDUklQVF9OQU1FPC9DT0RFPiBhbmQgPENPREU+U0NSSVBUX0ZJTEVOQU1FPC9DT0RFPiBjb250YWluIHRoZQotPEVNPnBoeXNpY2FsPC9FTT4gU3lzdGVtLXZpZXcuIAotCi08UD4KLU5vdGljZTogVGhlc2UgdmFyaWFibGVzIGhvbGQgdGhlIFVSSS9VUkwgPEVNPmFzIHRoZXkgd2VyZSBpbml0aWFsbHkKLXJlcXVlc3RlZDwvRU0+LCA8RU0+aS5lLjwvRU0+LCBpbiBhIHN0YXRlIDxFTT5iZWZvcmU8L0VNPiBhbnkgcmV3cml0aW5nLiBUaGlzIGlzCi1pbXBvcnRhbnQgYmVjYXVzZSB0aGUgcmV3cml0aW5nIHByb2Nlc3MgaXMgcHJpbWFyaWx5IHVzZWQgdG8gcmV3cml0ZSBsb2dpY2FsCi1VUkxzIHRvIHBoeXNpY2FsIHBhdGhuYW1lcy4KLQotPFA+Ci08U1RST05HPkV4YW1wbGU6PC9TVFJPTkc+Ci0KLTxCTE9DS1FVT1RFPgotPFBSRT4KLVNDUklQVF9OQU1FPS9zdy9saWIvdzNzL3RyZWUvZ2xvYmFsL3UvcnNlLy53d3cvaW5kZXguaHRtbAotU0NSSVBUX0ZJTEVOQU1FPS91L3JzZS8ud3d3L2luZGV4Lmh0bWwKLVNDUklQVF9VUkw9L3UvcnNlLwotU0NSSVBUX1VSST1odHRwOi8vZW4xLmVuZ2Vsc2NoYWxsLmNvbS91L3JzZS8KLTwvUFJFPgotPC9CTE9DS1FVT1RFPgotCi08UD4KLTxIUiBOT1NIQURFIFNJWkU9MT4KLQotPEgyPjxBIE5BTUU9IlNvbHV0aW9ucyI+UHJhY3RpY2FsIFNvbHV0aW9uczwvQT48L0gyPgotCi1XZSBhbHNvIGhhdmUgYW4gPGEgaHJlZj0iLi4vbWlzYy9yZXdyaXRlZ3VpZGUuaHRtbCI+VVJMIFJld3JpdGluZwotR3VpZGU8L2E+IGF2YWlsYWJsZSwgd2hpY2ggcHJvdmlkZXMgYSBjb2xsZWN0aW9uIG9mIHByYWN0aWNhbCBzb2x1dGlvbnMKLWZvciBVUkwtYmFzZWQgcHJvYmxlbXMuIFRoZXJlIHlvdSBjYW4gZmluZCByZWFsLWxpZmUgcnVsZXNldHMgYW5kCi1hZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IG1vZF9yZXdyaXRlLgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CTE9DS1FVT1RFPjwhLS0gcGFnZSBpbmRlbnRhdGlvbiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KLTwhLS0vJWh5cGVydGV4dCAtLT4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2Rfc2V0ZW52aWYuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2Rfc2V0ZW52aWYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY4YTExMC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX3NldGVudmlmLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci0gPEhFQUQ+Ci0gIDxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9zZXRlbnZpZjwvVElUTEU+Ci0gPC9IRUFEPgotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotIDxCT0RZCi0gIEJHQ09MT1I9IiNGRkZGRkYiCi0gIFRFWFQ9IiMwMDAwMDAiCi0gIExJTks9IiMwMDAwRkYiCi0gIFZMSU5LPSIjMDAwMDgwIgotICBBTElOSz0iI0ZGMDAwMCIKLSA+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotICA8SDEgQUxJR049IkNFTlRFUiI+TW9kdWxlIG1vZF9zZXRlbnZpZjwvSDE+Ci0gIDxQPgotICBUaGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4gdGhlIDxTQU1QPm1vZF9zZXRlbnZpZi5jPC9TQU1QPiBmaWxlLCBhbmQKLSAgPFNUUk9ORz5pczwvU1RST05HPiBjb21waWxlZCBpbiBieSBkZWZhdWx0LiBJdCBwcm92aWRlcyBmb3IKLSAgdGhlIGFiaWxpdHkgdG8gc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBiYXNlZCB1cG9uIGF0dHJpYnV0ZXMgb2YgdGhlCi0gIHJlcXVlc3QuCi0gIDwvUD4KLSAgPEgyPlN1bW1hcnk8L0gyPgotICA8UD4KLSAgVGhlIDxTQU1QPm1vZF9zZXRlbnZpZjwvU0FNUD4gbW9kdWxlIGFsbG93cyB5b3UgdG8gc2V0IGVudmlyb25tZW50Ci0gIHZhcmlhYmxlcyBhY2NvcmRpbmcgdG8gd2hldGhlciBkaWZmZXJlbnQgYXNwZWN0cyBvZiB0aGUgcmVxdWVzdCBtYXRjaAotICByZWd1bGFyIGV4cHJlc3Npb25zIHlvdSBzcGVjaWZ5LiAgVGhlc2UgZW52YXJpYWJsZXMgY2FuIGJlIHVzZWQgYnkKLSAgb3RoZXIgcGFydHMgb2YgdGhlIHNlcnZlciB0byBtYWtlIGRlY2lzaW9ucyBhYm91dCBhY3Rpb25zIHRvIGJlIHRha2VuLgotICA8L1A+Ci0gIDxQPlRoZSBkaXJlY3RpdmVzIGFyZSBjb25zaWRlcmVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUKLSAgY29uZmlndXJhdGlvbiBmaWxlcy4gIFNvIG1vcmUgY29tcGxleCBzZXF1ZW5jZXMgY2FuIGJlIHVzZWQsIHN1Y2gKLSAgYXMgdGhpcyBleGFtcGxlLCB3aGljaCBzZXRzIDxDT0RFPm5ldHNjYXBlPC9DT0RFPiBpZiB0aGUgYnJvd3NlcgotICBpcyBtb3ppbGxhIGJ1dCBub3QgTVNJRS4KLSAgPEJMT0NLUVVPVEU+PFBSRT4KLSAgQnJvd3Nlck1hdGNoIF5Nb3ppbGxhIG5ldHNjYXBlCi0gIEJyb3dzZXJNYXRjaCBNU0lFICFuZXRzY2FwZQotICA8L1BSRT48L0JMT0NLUVVPVEU+Ci0gIDwvUD4KLQotICA8SDI+RGlyZWN0aXZlczwvSDI+Ci0gIDxVTD4KLSAgIDxMST48QSBIUkVGPSIjQnJvd3Nlck1hdGNoIj5Ccm93c2VyTWF0Y2g8L0E+Ci0gICA8L0xJPgotICAgPExJPjxBIEhSRUY9IiNCcm93c2VyTWF0Y2hOb0Nhc2UiPkJyb3dzZXJNYXRjaE5vQ2FzZTwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI1NldEVudklmIj5TZXRFbnZJZjwvQT4KLSAgIDwvTEk+Ci0gICA8TEk+PEEgSFJFRj0iI1NldEVudklmTm9DYXNlIj5TZXRFbnZJZk5vQ2FzZTwvQT4KLSAgIDwvTEk+Ci0gIDwvVUw+Ci0KLSAgPEhSPiA8IS0tIHRoZSBIUiBpcyBwYXJ0IG9mIHRoZSBkaXJlY3RpdmUgZGVzY3JpcHRpb24gLS0+Ci0gIDxIMj48QSBOQU1FPSJCcm93c2VyTWF0Y2giPlRoZSA8U0FNUD5Ccm93c2VyTWF0Y2g8L1NBTVA+IERpcmVjdGl2ZTwvQT48L0gyPgotICA8UD4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBCcm93c2VyTWF0Y2ggPEVNPnJlZ2V4IGVudmFyWz12YWx1ZV0gWy4uLl08L0VNPgotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8RU0+bm9uZTwvRU0+Ci0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiA8RU0+bm9uZTwvRU0+Ci0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlCi0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2Rfc2V0ZW52aWYKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gQXBhY2hlIDEuMiBhbmQgYWJvdmUgKGluIEFwYWNoZSAxLjIKLSAgdGhpcyBkaXJlY3RpdmUgd2FzIGZvdW5kIGluIHRoZSBub3ctb2Jzb2xldGUgbW9kX2Jyb3dzZXIgbW9kdWxlKQotICA8L1A+Ci0gIDxQPgotICBUaGUgQnJvd3Nlck1hdGNoIGRpcmVjdGl2ZSBkZWZpbmVzIGVudmlyb25tZW50IHZhcmlhYmxlcyBiYXNlZCBvbiB0aGUKLSAgPFNBTVA+VXNlci1BZ2VudDwvU0FNUD4gSFRUUCByZXF1ZXN0IGhlYWRlciBmaWVsZC4gVGhlIGZpcnN0IGFyZ3VtZW50Ci0gIHNob3VsZCBiZSBhIFBPU0lYLjIgZXh0ZW5kZWQgcmVndWxhciBleHByZXNzaW9uIChzaW1pbGFyIHRvIGFuCi0gIDxTQU1QPmVncmVwPC9TQU1QPi1zdHlsZSByZWdleCkuICBUaGUgcmVzdCBvZiB0aGUgYXJndW1lbnRzIGdpdmUgdGhlCi0gIG5hbWVzIG9mIHZhcmlhYmxlcyB0byBzZXQsIGFuZCBvcHRpb25hbGx5IHZhbHVlcyB0byB3aGljaCB0aGV5IHNob3VsZAotICBiZSBzZXQuIFRoZXNlIHRha2UgdGhlIGZvcm0gb2YKLSAgPC9QPgotICA8T0w+Ci0gICA8TEk+PFNBTVA+PEVNPnZhcm5hbWU8L0VNPjwvU0FNUD4sIG9yCi0gICA8L0xJPgotICAgPExJPjxTQU1QPiE8RU0+dmFybmFtZTwvRU0+PC9TQU1QPiwgb3IKLSAgIDwvTEk+Ci0gICA8TEk+PFNBTVA+PEVNPnZhcm5hbWU8L0VNPj08RU0+dmFsdWU8L0VNPjwvU0FNUD4KLSAgIDwvTEk+Ci0gIDwvT0w+Ci0gIDxQPgotICBJbiB0aGUgZmlyc3QgZm9ybSwgdGhlIHZhbHVlIHdpbGwgYmUgc2V0IHRvICZxdW90OzEmcXVvdDsuIFRoZSBzZWNvbmQKLSAgd2lsbCByZW1vdmUgdGhlIGdpdmVuIHZhcmlhYmxlIGlmIGFscmVhZHkgZGVmaW5lZCwgYW5kIHRoZSB0aGlyZCB3aWxsCi0gIHNldCB0aGUgdmFyaWFibGUgdG8gdGhlIHZhbHVlIGdpdmVuIGJ5IDxTQU1QPjxFTT52YWx1ZTwvRU0+PC9TQU1QPi4gSWYgYQotICA8U0FNUD5Vc2VyLUFnZW50PC9TQU1QPiBzdHJpbmcgbWF0Y2hlcyBtb3JlIHRoYW4gb25lIGVudHJ5LCB0aGV5IHdpbGwKLSAgYmUgbWVyZ2VkLiAgRW50cmllcyBhcmUgcHJvY2Vzc2VkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciwKLSAgYW5kIGxhdGVyIGVudHJpZXMgY2FuIG92ZXJyaWRlIGVhcmxpZXIgb25lcy4KLSAgPC9QPgotICA8UD4KLSAgRm9yIGV4YW1wbGU6Ci0gIDwvUD4KLSAgPFBSRT4KLSAgICBCcm93c2VyTWF0Y2ggXk1vemlsbGEgZm9ybXMganBlZz15ZXMgYnJvd3Nlcj1uZXRzY2FwZQotICAgIEJyb3dzZXJNYXRjaCAiXk1vemlsbGEvWzItM10iIHRhYmxlcyBhZ2lmIGZyYW1lcyBqYXZhc2NyaXB0Ci0gICAgQnJvd3Nlck1hdGNoIE1TSUUgIWphdmFzY3JpcHQKLSAgPC9QUkU+Ci0gIDxQPgotICBOb3RlIHRoYXQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdHJpbmcgaXMKLSAgPFNUUk9ORz5jYXNlLXNlbnNpdGl2ZTwvU1RST05HPi4gIEZvciBjYW5lLUlOc2Vuc2l0aXZlIG1hdGNoaW5nLCBzZWUKLSAgdGhlCi0gIDxBCi0gICBIUkVGPSIjQnJvd3Nlck1hdGNoTm9DYXNlIgotICA+PFNBTVA+QnJvd3Nlck1hdGNoTm9DYXNlPC9TQU1QPjwvQT4KLSAgZGlyZWN0aXZlLgotICA8L1A+Ci0gIDxQPgotICBUaGUgPFNBTVA+QnJvd3Nlck1hdGNoPC9TQU1QPiBhbmQgPFNBTVA+QnJvd3Nlck1hdGNoTm9DYXNlPC9TQU1QPgotICBkaXJlY3RpdmVzIGFyZSBzcGVjaWFsIGNhc2VzIG9mIHRoZQotICA8QQotICAgSFJFRj0iI1NldEVudklmIgotICA+PFNBTVA+U2V0RW52SWY8L1NBTVA+PC9BPgotICBhbmQKLSAgPEEKLSAgIEhSRUY9IiNTZXRFbnZJZk5vQ2FzZSIKLSAgPjxTQU1QPlNldEVudklmTm9DYXNlPC9TQU1QPjwvQT4KLSAgZGlyZWN0aXZlcy4gIFRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzIGhhdmUgdGhlIHNhbWUgZWZmZWN0OgotICA8L1A+Ci0gIDxQUkU+Ci0gICBCcm93c2VyTWF0Y2hOb0Nhc2UgUm9ib3QgaXNfYV9yb2JvdAotICAgU2V0RW52SWZOb0Nhc2UgVXNlci1BZ2VudCBSb2JvdCBpc19hX3JvYm90Ci0gIDwvUFJFPgotCi0gIDxIUj4gPCEtLSB0aGUgSFIgaXMgcGFydCBvZiB0aGUgZGlyZWN0aXZlIGRlc2NyaXB0aW9uIC0tPgotICA8SDI+Ci0gICA8QSBOQU1FPSJCcm93c2VyTWF0Y2hOb0Nhc2UiPgotICAgIFRoZSA8U0FNUD5Ccm93c2VyTWF0Y2hOb0Nhc2U8L1NBTVA+IERpcmVjdGl2ZQotICAgPC9BPgotICA8L0gyPgotICA8UD4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBCcm93c2VyTWF0Y2hOb0Nhc2UgPEVNPnJlZ2V4IGVudmFyWz12YWx1ZV0KLSAgWy4uLl08L0VNPgotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8RU0+bm9uZTwvRU0+Ci0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiA8RU0+bm9uZTwvRU0+Ci0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlCi0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2Rfc2V0ZW52aWYKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gQXBhY2hlIDEuMiBhbmQgYWJvdmUgKGluIEFwYWNoZSAxLjIKLSAgdGhpcyBkaXJlY3RpdmUgd2FzIGZvdW5kIGluIHRoZSBub3ctb2Jzb2xldGUgbW9kX2Jyb3dzZXIgbW9kdWxlKQotICA8L1A+Ci0gIDxQPgotICBUaGUgPFNBTVA+QnJvd3Nlck1hdGNoTm9DYXNlPC9TQU1QPiBkaXJlY3RpdmUgaXMgc2VtYW50aWNhbGx5IGlkZW50aWNhbCB0bwotICB0aGUKLSAgPEEKLSAgIEhSRUY9IiNCcm93c2VyTWF0Y2giCi0gID48U0FNUD5Ccm93c2VyTWF0Y2g8L1NBTVA+PC9BPgotICBkaXJlY3RpdmUuIEhvd2V2ZXIsIGl0IHByb3ZpZGVzIGZvciBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLiBGb3IKLSAgZXhhbXBsZToKLSAgPC9QPgotICA8UFJFPgotICAgIEJyb3dzZXJNYXRjaE5vQ2FzZSBtYWMgcGxhdGZvcm09bWFjaW50b3NoCi0gICAgQnJvd3Nlck1hdGNoTm9DYXNlIHdpbiBwbGF0Zm9ybT13aW5kb3dzCi0gIDwvUFJFPgotICA8UD4KLSAgVGhlIDxTQU1QPkJyb3dzZXJNYXRjaDwvU0FNUD4gYW5kIDxTQU1QPkJyb3dzZXJNYXRjaE5vQ2FzZTwvU0FNUD4KLSAgZGlyZWN0aXZlcyBhcmUgc3BlY2lhbCBjYXNlcyBvZiB0aGUKLSAgPEEKLSAgIEhSRUY9IiNTZXRFbnZJZiIKLSAgPjxTQU1QPlNldEVudklmPC9TQU1QPjwvQT4KLSAgYW5kCi0gIDxBCi0gICBIUkVGPSIjU2V0RW52SWZOb0Nhc2UiCi0gID48U0FNUD5TZXRFbnZJZk5vQ2FzZTwvU0FNUD48L0E+Ci0gIGRpcmVjdGl2ZXMuICBUaGUgZm9sbG93aW5nIHR3byBsaW5lcyBoYXZlIHRoZSBzYW1lIGVmZmVjdDoKLSAgPC9QPgotICA8UFJFPgotICAgQnJvd3Nlck1hdGNoTm9DYXNlIFJvYm90IGlzX2Ffcm9ib3QKLSAgIFNldEVudklmTm9DYXNlIFVzZXItQWdlbnQgUm9ib3QgaXNfYV9yb2JvdAotICA8L1BSRT4KLQotICA8SFI+IDwhLS0gdGhlIEhSIGlzIHBhcnQgb2YgdGhlIGRpcmVjdGl2ZSBkZXNjcmlwdGlvbiAtLT4KLSAgPEgyPgotICAgPEEgTkFNRT0iU2V0RW52SWYiPgotICAgIFRoZSA8U0FNUD5TZXRFbnZJZjwvU0FNUD4gRGlyZWN0aXZlCi0gICA8L0E+Ci0gIDwvSDI+Ci0gIDxQPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFNldEVudklmIDxFTT4gYXR0cmlidXRlIHJlZ2V4IGVudmFyWz12YWx1ZV0KLSAgWy4uLl08L0VNPgotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8RU0+bm9uZTwvRU0+Ci0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiA8RU0+bm9uZTwvRU0+Ci0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlCi0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2Rfc2V0ZW52aWYKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gQXBhY2hlIDEuMyBhbmQgYWJvdmU7IHRoZQotICBSZXF1ZXN0X1Byb3RvY29sIGtleXdvcmQgYW5kIGVudmlyb25tZW50LXZhcmlhYmxlIG1hdGNoaW5nIGFyZSBvbmx5Ci0gIGF2YWlsYWJsZSB3aXRoIDEuMy43IGFuZCBsYXRlcgotICA8L1A+Ci0gIDxQPgotICBUaGUgPFNBTVA+U2V0RW52SWY8L1NBTVA+IGRpcmVjdGl2ZSBkZWZpbmVzIGVudmlyb25tZW50IHZhcmlhYmxlcwotICBiYXNlZCBvbiBhdHRyaWJ1dGVzIG9mIHRoZSByZXF1ZXN0LiAgVGhlc2UgYXR0cmlidXRlcyBjYW4gYmUgdGhlCi0gIHZhbHVlcyBvZiB2YXJpb3VzIEhUVFAgcmVxdWVzdCBoZWFkZXIgZmllbGRzIChzZWUKLSAgPEEKLSAgIEhSRUY9Imh0dHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzIwNjgudHh0IgotICA+UkZDMjA2ODwvQT4KLSAgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2UpLCBvciBvZiBvdGhlciBhc3BlY3RzIG9mIHRoZSByZXF1ZXN0LAotICBpbmNsdWRpbmcgdGhlIGZvbGxvd2luZzoKLSAgPC9QPgotICA8VUw+Ci0gICA8TEk+PFNBTVA+UmVtb3RlX0hvc3Q8L1NBTVA+IC0gdGhlIGhvc3RuYW1lIChpZiBhdmFpbGFibGUpIG9mIHRoZQotICAgIGNsaWVudCBtYWtpbmcgdGhlIHJlcXVlc3QKLSAgIDwvTEk+Ci0gICA8TEk+PFNBTVA+UmVtb3RlX0FkZHI8L1NBTVA+IC0gdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGNsaWVudCBtYWtpbmcKLSAgICB0aGUgcmVxdWVzdAotICAgPC9MST4KLSAgIDxMST48U0FNUD5SZW1vdGVfVXNlcjwvU0FNUD4gLSB0aGUgYXV0aGVudGljYXRlZCB1c2VybmFtZSAoaWYKLSAgICBhdmFpbGFibGUpCi0gICA8L0xJPgotICAgPExJPjxTQU1QPlJlcXVlc3RfTWV0aG9kPC9TQU1QPiAtIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgYmVpbmcgdXNlZAotICAgICg8U0FNUD5HRVQ8L1NBTVA+LCA8U0FNUD5QT1NUPC9TQU1QPiwgPEVNPmV0IGNldGVyYTwvRU0+KQotICAgPC9MST4KLSAgIDxMST48U0FNUD5SZXF1ZXN0X1Byb3RvY29sPC9TQU1QPiAtIHRoZSBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoZSBwcm90b2NvbAotICAgIHdpdGggd2hpY2ggdGhlIHJlcXVlc3Qgd2FzIG1hZGUgKDxFTT5lLmcuPC9FTT4sICJIVFRQLzAuOSIsICJIVFRQLzEuMSIsCi0gICAgPEVNPmV0Yy48L0VNPikKLSAgIDwvTEk+Ci0gICA8TEk+PFNBTVA+UmVxdWVzdF9VUkk8L1NBTVA+IC0gdGhlIHBvcnRpb24gb2YgdGhlIFVSTCBmb2xsb3dpbmcgdGhlCi0gICAgc2NoZW1lIGFuZCBob3N0IHBvcnRpb24KLSAgIDwvTEk+Ci0gIDwvVUw+Ci0gIDxQPgotICBTb21lIG9mIHRoZSBtb3JlIGNvbW1vbmx5IHVzZWQgcmVxdWVzdCBoZWFkZXIgZmllbGQgbmFtZXMgaW5jbHVkZQotICA8U0FNUD5Ib3N0PC9TQU1QPiwgPFNBTVA+VXNlci1BZ2VudDwvU0FNUD4sIGFuZCA8U0FNUD5SZWZlcmVyPC9TQU1QPi4KLSAgPC9QPgotICA8UD4KLSAgSWYgdGhlIDxFTT5hdHRyaWJ1dGU8L0VNPiBuYW1lIGRvZXNuJ3QgbWF0Y2ggYW55IG9mIHRoZSBzcGVjaWFsIGtleXdvcmRzLAotICBub3IgYW55IG9mIHRoZSByZXF1ZXN0J3MgaGVhZGVyIGZpZWxkIG5hbWVzLCBpdCBpcyB0ZXN0ZWQgYXMgdGhlIG5hbWUKLSAgb2YgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgaW4gdGhlIGxpc3Qgb2YgdGhvc2UgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0LgotICBUaGlzIGFsbG93cyA8Q09ERT5TZXRFbnZJZjwvQ09ERT4gZGlyZWN0aXZlcyB0byB0ZXN0IGFnYWluc3QgdGhlIHJlc3VsdAotICBvZiBwcmlvciBtYXRjaGVzLgotICA8L1A+Ci0gIDxCTE9DS1FVT1RFPgotICAgPFNUUk9ORz5Pbmx5IHRob3NlIGVudmlyb25tZW50IHZhcmlhYmxlcyBkZWZpbmVkIGJ5IGVhcmxpZXIKLSAgIDxDT0RFPlNldEVudklmW05vQ2FzZV08L0NPREU+IGRpcmVjdGl2ZXMgYXJlIGF2YWlsYWJsZSBmb3IgdGVzdGluZyBpbgotICAgdGhpcyBtYW5uZXIuICAnRWFybGllcicgbWVhbnMgdGhhdCB0aGV5IHdlcmUgZGVmaW5lZCBhdCBhIGJyb2FkZXIgc2NvcGUKLSAgIChzdWNoIGFzIHNlcnZlci13aWRlKSBvciBwcmV2aW91c2x5IGluIHRoZSBjdXJyZW50IGRpcmVjdGl2ZSdzCi0gICBzY29wZS48L1NUUk9ORz4KLSAgPC9CTE9DS1FVT1RFPgotICA8UD4KLSAgRXhhbXBsZToKLSAgPC9QPgotICA8UFJFPgotICAgU2V0RW52SWYgUmVxdWVzdF9VUkkgIlwuZ2lmJCIgb2JqZWN0X2lzX2ltYWdlPWdpZgotICAgU2V0RW52SWYgUmVxdWVzdF9VUkkgIlwuanBnJCIgb2JqZWN0X2lzX2ltYWdlPWpwZwotICAgU2V0RW52SWYgUmVxdWVzdF9VUkkgIlwueGJtJCIgb2JqZWN0X2lzX2ltYWdlPXhibQotICAgICAgICA6Ci0gICBTZXRFbnZJZiBSZWZlcmVyIHd3d1wubXlkb21haW5cLmNvbSBpbnRyYV9zaXRlX3JlZmVycmFsCi0gICAgICAgIDoKLSAgIFNldEVudklmIG9iamVjdF9pc19pbWFnZSB4Ym0gWEJJVF9QUk9DRVNTSU5HPTEKLSAgPC9QUkU+Ci0gIDxQPgotICBUaGUgZmlyc3QgdGhyZWUgd2lsbCBzZXQgdGhlIGVudmFyaWFibGUgPFNBTVA+b2JqZWN0X2lzX2ltYWdlPC9TQU1QPiBpZiB0aGUKLSAgcmVxdWVzdCB3YXMgZm9yIGFuIGltYWdlIGZpbGUsIGFuZCB0aGUgZm91cnRoIHNldHMKLSAgPFNBTVA+aW50cmFfc2l0ZV9yZWZlcnJhbDwvU0FNUD4gaWYgdGhlIHJlZmVycmluZyBwYWdlIHdhcyBzb21ld2hlcmUKLSAgb24gdGhlIDxTQU1QPnd3dy5teWRvbWFpbi5jb208L1NBTVA+IFdlYiBzaXRlLgotICA8L1A+Ci0KLSAgPEhSPiA8IS0tIHRoZSBIUiBpcyBwYXJ0IG9mIHRoZSBkaXJlY3RpdmUgZGVzY3JpcHRpb24gLS0+Ci0gIDxIMj4KLSAgIDxBIE5BTUU9IlNldEVudklmTm9DYXNlIj4KLSAgICBUaGUgPFNBTVA+U2V0RW52SWZOb0Nhc2U8L1NBTVA+IERpcmVjdGl2ZQotICAgPC9BPgotICA8L0gyPgotICA8UD4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBTZXRFbnZJZk5vQ2FzZQotICAgPEVNPiBhdHRyaWJ1dGUgcmVnZXggZW52YXJbPXZhbHVlXSBbLi4uXTwvRU0+Ci0gIDxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxFTT5ub25lPC9FTT4KLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZwotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIgotICAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IDxFTT5ub25lPC9FTT4KLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2UKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF9zZXRlbnZpZgotICA8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBBcGFjaGUgMS4zIGFuZCBhYm92ZQotICA8L1A+Ci0gIDxQPgotICBUaGUgPFNBTVA+U2V0RW52SWZOb0Nhc2U8L1NBTVA+IGlzIHNlbWFudGljYWxseSBpZGVudGljYWwgdG8gdGhlCi0gIDxBCi0gICBIUkVGPSIjU2V0RW52SWYiCi0gID48U0FNUD5TZXRFbnZJZjwvU0FNUD48L0E+Ci0gIGRpcmVjdGl2ZSwgYW5kIGRpZmZlcnMgb25seSBpbiB0aGF0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgaXMKLSAgcGVyZm9ybWVkIGluIGEgY2FzZS1pbnNlbnNpdGl2ZSBtYW5uZXIuIEZvciBleGFtcGxlOgotICA8L1A+Ci0gIDxQUkU+Ci0gICBTZXRFbnZJZk5vQ2FzZSBIb3N0IEFwYWNoZVwuT3JnIHNpdGU9YXBhY2hlCi0gIDwvUFJFPgotICA8UD4KLSAgVGhpcyB3aWxsIGNhdXNlIHRoZSA8U0FNUD5zaXRlPC9TQU1QPiBlbnZhcmlhYmxlIHRvIGJlIHNldCB0bwotICAmcXVvdDs8U0FNUD5hcGFjaGU8L1NBTVA+JnF1b3Q7IGlmIHRoZSBIVFRQIHJlcXVlc3QgaGVhZGVyIGZpZWxkCi0gIDxTQU1QPkhvc3Q6PC9TQU1QPiB3YXMgaW5jbHVkZWQgYW5kIGNvbnRhaW5lZCA8U0FNUD5BcGFjaGUuT3JnPC9TQU1QPiwKLSAgPFNBTVA+YXBhY2hlLm9yZzwvU0FNUD4sIG9yIGFueSBvdGhlciBjb21iaW5hdGlvbi4KLSAgPC9QPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotIDwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2Rfc28uaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2Rfc28uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVkZDFhNC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX3NvLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9zbzwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPk1vZHVsZSBtb2Rfc288L0gxPgotCi1UaGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4gdGhlIDxDT0RFPm1vZF9zby5jPC9DT0RFPiBmaWxlLiBJdCBpcwotY29tcGlsZWQgaW4gYnkgZGVmYXVsdCBvbiBXaW5kb3dzIGFuZCBpcyBub3QgY29tcGlsZWQgaW4gYnkgZGVmYXVsdCBvbgotVW5peC4gSXQgcHJvdmlkZXMgZm9yIGxvYWRpbmcgb2YgZXhlY3V0YWJsZSBjb2RlIGFuZCBtb2R1bGVzIGludG8gdGhlCi1zZXJ2ZXIgYXQgc3RhcnQtdXAgb3IgcmVzdGFydCB0aW1lLiBPbiBVbml4LCB0aGUgbG9hZGVkIGNvZGUgdHlwaWNhbGx5Ci1jb21lcyBmcm9tIHNoYXJlZCBvYmplY3QgZmlsZXMgKHVzdWFsbHkgd2l0aCA8U0FNUD4uc288L1NBTVA+Ci1leHRlbnNpb24pLCB3aGlsc3Qgb24gV2luZG93cyB0aGlzIG1vZHVsZSBsb2FkcyA8U0FNUD5ETEw8L1NBTVA+Ci1maWxlcy4gVGhpcyBtb2R1bGUgaXMgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDEuMyBhbmQgdXAuCi0KLTxQPgotCi1JbiBwcmV2aW91cyByZWxlYXNlcywgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhpcyBtb2R1bGUgd2FzIHByb3ZpZGVkCi1mb3IgVW5peCBieSBtb2RfZGxkLCBhbmQgZm9yIFdpbmRvd3MgYnkgbW9kX2RsbC4gT24gV2luZG93cywgbW9kX2RsbAotd2FzIHVzZWQgaW4gYmV0YSByZWxlYXNlIDEuM2IxIHRocm91Z2ggMS4zYjUuIG1vZF9zbyBjb21iaW5lcyB0aGVzZQotdHdvIG1vZHVsZXMgaW50byBhIHNpbmdsZSBtb2R1bGUgZm9yIGFsbCBvcGVyYXRpbmcgc3lzdGVtcy4KLQotPEgyPlN1bW1hcnk8L0gyPgotCi1UaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBtb2R1bGUuIE9uIHNlbGVjdGVkIG9wZXJhdGluZyBzeXN0ZW1zIGl0IGNhbiBiZSB1c2VkCi10byBsb2FkIG1vZHVsZXMgaW50byBBcGFjaGUgYXQgcnVudGltZSB2aWEgdGhlIDxBIEhSRUY9Ii4uL2Rzby5odG1sIj5EeW5hbWljCi1TaGFyZWQgT2JqZWN0PC9BPiAoRFNPKSBtZWNoYW5pc20sIHJhdGhlciB0aGFuIHJlcXVpcmluZyBhIHJlY29tcGlsYXRpb24uCi0KLTxIMj5EaXJlY3RpdmVzPC9IMj4KLTxVTD4KLTxMST48QSBIUkVGPSIjbG9hZGZpbGUiPkxvYWRGaWxlPC9BPgotPExJPjxBIEhSRUY9IiNsb2FkbW9kdWxlIj5Mb2FkTW9kdWxlPC9BPgotPC9VTD4KLTxIUj4KLQotCi08SDI+PEEgTkFNRT0ibG9hZGZpbGUiPkxvYWRGaWxlPC9BPjwvSDI+Ci08IS0tJXBsYWludGV4dCAmbHQ7P0lOREVYIHtcdHQgTG9hZEZpbGV9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IExvYWRGaWxlIDxFTT5maWxlbmFtZSBmaWxlbmFtZSAuLi48L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2Rfc288UD4KLQotVGhlIExvYWRGaWxlIGRpcmVjdGl2ZSBsaW5rcyBpbiB0aGUgbmFtZWQgb2JqZWN0IGZpbGVzIG9yIGxpYnJhcmllcwotd2hlbiB0aGUgc2VydmVyIGlzIHN0YXJ0ZWQgb3IgcmVzdGFydGVkOyB0aGlzIGlzIHVzZWQgdG8gbG9hZAotYWRkaXRpb25hbCBjb2RlIHdoaWNoIG1heSBiZSByZXF1aXJlZCBmb3Igc29tZSBtb2R1bGUgdG8KLXdvcmsuIDxFTT5GaWxlbmFtZTwvRU0+IGlzIGVpdGhlciBhbmQgYWJzb2x1dGUgcGF0aCBvciByZWxhdGl2ZSB0byA8QQotSFJFRj0iY29yZS5odG1sI3NlcnZlcnJvb3QiPlNlcnZlclJvb3Q8L0E+LjxQPjxIUj4KLQotPEgyPjxBIE5BTUU9ImxvYWRtb2R1bGUiPkxvYWRNb2R1bGU8L0E+PC9IMj4KLTwhLS0lcGxhaW50ZXh0ICZsdDs/SU5ERVgge1x0dCBMb2FkTW9kdWxlfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBMb2FkTW9kdWxlIDxFTT5tb2R1bGUgZmlsZW5hbWU8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBCYXNlPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2Rfc288UD4KLQotVGhlIExvYWRNb2R1bGUgZGlyZWN0aXZlIGxpbmtzIGluIHRoZSBvYmplY3QgZmlsZSBvciBsaWJyYXJ5IDxFTT5maWxlbmFtZTwvRU0+Ci1hbmQgYWRkcyB0aGUgbW9kdWxlIHN0cnVjdHVyZSBuYW1lZCA8RU0+bW9kdWxlPC9FTT4gdG8gdGhlIGxpc3Qgb2YgYWN0aXZlCi1tb2R1bGVzLiA8RU0+TW9kdWxlPC9FTT4gaXMgdGhlIG5hbWUgb2YgdGhlIGV4dGVybmFsIHZhcmlhYmxlIG9mIHR5cGUKLTxDT0RFPm1vZHVsZTwvQ09ERT4gaW4gdGhlIGZpbGUuIEV4YW1wbGUgKFVuaXgpOgotPEJMT0NLUVVPVEU+PENPREU+Ci1Mb2FkTW9kdWxlIHN0YXR1c19tb2R1bGUgbW9kdWxlcy9tb2Rfc3RhdHVzLnNvCi08L0NPREU+PC9CTE9DS1FVT1RFPgotCi08UD4KLQotRXhhbXBsZSAoV2luZG93cyk6Ci08QkxPQ0tRVU9URT48Q09ERT4KLUxvYWRNb2R1bGUgc3RhdHVzX21vZHVsZSBtb2R1bGVzL0FwYWNoZU1vZHVsZVN0YXR1cy5kbGw8QlI+Ci08L0NPREU+PC9CTE9DS1FVT1RFPgotCi1sb2FkcyB0aGUgbmFtZWQgbW9kdWxlIGZyb20gdGhlIG1vZHVsZXMgc3ViZGlyZWN0b3J5IG9mIHRoZQotU2VydmVyUm9vdC48UD4KLQotPEhSPgotCi08SDI+PEEgTkFNRT0iY3JlYXRpbmciPkNyZWF0aW5nIERMTCBNb2R1bGVzIGZvciBXaW5kb3dzPC9BPjwvSDI+Ci0KLTxQPlRoZSBBcGFjaGUgbW9kdWxlIEFQSSBpcyB1bmNoYW5nZWQgYmV0d2VlbiB0aGUgVW5peCBhbmQgV2luZG93cwotICAgdmVyc2lvbnMuIE1hbnkgbW9kdWxlcyB3aWxsIHJ1biBvbiBXaW5kb3dzIHdpdGggbm8gb3IgbGl0dGxlIGNoYW5nZQotICAgZnJvbSBVbml4LCBhbHRob3VnaCBvdGhlcnMgcmVseSBvbiBhc3BlY3RzIG9mIHRoZSBVbml4IGFyY2hpdGVjdHVyZQotICAgd2hpY2ggYXJlIG5vdCBwcmVzZW50IGluIFdpbmRvd3MsIGFuZCB3aWxsIG5vdCB3b3JrLjwvUD4KLQotPFA+V2hlbiBhIG1vZHVsZSBkb2VzIHdvcmssIGl0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VydmVyIGluIG9uZSBvZiB0d28KLSAgIHdheXMuIEFzIHdpdGggVW5peCwgaXQgY2FuIGJlIGNvbXBpbGVkIGludG8gdGhlIHNlcnZlci4gQmVjYXVzZSBBcGFjaGUKLSAgIGZvciBXaW5kb3dzIGRvZXMgbm90IGhhdmUgdGhlIDxDT0RFPkNvbmZpZ3VyZTwvQ09ERT4gcHJvZ3JhbSBvZiBBcGFjaGUKLSAgIGZvciBVbml4LCB0aGUgbW9kdWxlJ3Mgc291cmNlIGZpbGUgbXVzdCBiZSBhZGRlZCB0byB0aGUgQXBhY2hlQ29yZQotICAgcHJvamVjdCBmaWxlLCBhbmQgaXRzIHN5bWJvbHMgbXVzdCBiZSBhZGRlZCB0byB0aGUKLSAgIDxDT0RFPm9zXHdpbjMyXG1vZHVsZXMuYzwvQ09ERT4gZmlsZS48L1A+Ci0KLTxQPlRoZSBzZWNvbmQgd2F5IGlzIHRvIGNvbXBpbGUgdGhlIG1vZHVsZSBhcyBhIERMTCwgYSBzaGFyZWQgbGlicmFyeQotICAgdGhhdCBjYW4gYmUgbG9hZGVkIGludG8gdGhlIHNlcnZlciBhdCBydW50aW1lLCB1c2luZyB0aGUKLSAgIDxDT0RFPjxBIEhSRUY9IiNsb2FkbW9kdWxlIj5Mb2FkTW9kdWxlPC9BPjwvQ09ERT4KLSAgIGRpcmVjdGl2ZS4gVGhlc2UgbW9kdWxlIERMTHMgY2FuIGJlIGRpc3RyaWJ1dGVkIGFuZCBydW4gb24gYW55IEFwYWNoZQotICAgZm9yIFdpbmRvd3MgaW5zdGFsbGF0aW9uLCB3aXRob3V0IHJlY29tcGlsYXRpb24gb2YgdGhlIHNlcnZlci48L1A+Ci0KLTxQPlRvIGNyZWF0ZSBhIG1vZHVsZSBETEwsIGEgc21hbGwgY2hhbmdlIGlzIG5lY2Vzc2FyeSB0byB0aGUgbW9kdWxlJ3MKLSAgIHNvdXJjZSBmaWxlOiBUaGUgbW9kdWxlIHJlY29yZCBtdXN0IGJlIGV4cG9ydGVkIGZyb20gdGhlIERMTCAod2hpY2gKLSAgIHdpbGwgYmUgY3JlYXRlZCBsYXRlcjsgc2VlIGJlbG93KS4gVG8gZG8gdGhpcywgYWRkIHRoZQotICAgPENPREU+TU9EVUxFX1ZBUl9FWFBPUlQ8L0NPREU+IChkZWZpbmVkIGluIHRoZSBBcGFjaGUgaGVhZGVyIGZpbGVzKSB0bwotICAgeW91ciBtb2R1bGUncyBtb2R1bGUgcmVjb3JkIGRlZmluaXRpb24uIEZvciBleGFtcGxlLCBpZiB5b3VyIG1vZHVsZQotICAgaGFzOjwvUD4KLTxQUkU+Ci0gICAgbW9kdWxlIGZvb19tb2R1bGU7Ci08L1BSRT4KLTxQPlJlcGxhY2UgdGhlIGFib3ZlIHdpdGg6PC9QPgotPFBSRT4KLSAgICBtb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgZm9vX21vZHVsZTsKLTwvUFJFPgotPFA+Tm90ZSB0aGF0IHRoaXMgd2lsbCBvbmx5IGJlIGFjdGl2YXRlZCBvbiBXaW5kb3dzLCBzbyB0aGUgbW9kdWxlIGNhbgotICAgY29udGludWUgdG8gYmUgdXNlZCwgdW5jaGFuZ2VkLCB3aXRoIFVuaXggaWYgbmVlZGVkLiBBbHNvLCBpZiB5b3UgYXJlCi0gICBmYW1pbGlhciB3aXRoIDxDT0RFPi5ERUY8L0NPREU+IGZpbGVzLCB5b3UgY2FuIGV4cG9ydCB0aGUgbW9kdWxlCi0gICByZWNvcmQgd2l0aCB0aGF0IG1ldGhvZCBpbnN0ZWFkLjwvUD4KLQotPFA+Tm93LCBjcmVhdGUgYSBETEwgY29udGFpbmluZyB5b3VyIG1vZHVsZS4gWW91IHdpbGwgbmVlZCB0byBsaW5rIHRoaXMKLSAgIGFnYWluc3QgdGhlIEFwYWNoZUNvcmUubGliIGV4cG9ydCBsaWJyYXJ5IHRoYXQgaXMgY3JlYXRlZCB3aGVuIHRoZQotICAgQXBhY2hlQ29yZS5kbGwgc2hhcmVkIGxpYnJhcnkgaXMgY29tcGlsZWQuIFlvdSBtYXkgYWxzbyBoYXZlIHRvIGNoYW5nZQotICAgdGhlIGNvbXBpbGVyIHNldHRpbmdzIHRvIGVuc3VyZSB0aGF0IHRoZSBBcGFjaGUgaGVhZGVyIGZpbGVzIGFyZQotICAgY29ycmVjdGx5IGxvY2F0ZWQuPC9QPgotCi08UD5UaGlzIHNob3VsZCBjcmVhdGUgYSBETEwgdmVyc2lvbiBvZiB5b3VyIG1vZHVsZS4gTm93IHNpbXBseSBwbGFjZSBpdAotICAgaW4gdGhlIDxTQU1QPm1vZHVsZXM8L1NBTVA+IGRpcmVjdG9yeSBvZiB5b3VyIHNlcnZlciByb290LCBhbmQgdXNlCi0gICB0aGUgPENPREU+PEEgSFJFRj0iI2xvYWRtb2R1bGUiPkxvYWRNb2R1bGU8L0E+PC9DT0RFPiBkaXJlY3RpdmUgdG8KLSAgIGxvYWQgaXQuPC9QPgotCi0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2Rfc3BlbGluZy5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF9zcGVsaW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZTlmODAuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9zcGVsaW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci0gPEhFQUQ+Ci0gIDxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF9zcGVsaW5nPC9USVRMRT4KLSA8L0hFQUQ+Ci08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci0gPEJPRFkKLSAgQkdDT0xPUj0iI0ZGRkZGRiIKLSAgVEVYVD0iIzAwMDAwMCIKLSAgTElOSz0iIzAwMDBGRiIKLSAgVkxJTks9IiMwMDAwODAiCi0gIEFMSU5LPSIjRkYwMDAwIgotID4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0gIDxIMSBBTElHTj0iQ0VOVEVSIj5Nb2R1bGUgbW9kX3NwZWxpbmc8L0gxPgotICA8UD4KLSAgVGhpcyBtb2R1bGUgaXMgY29udGFpbmVkIGluIHRoZSA8Q09ERT5tb2Rfc3BlbGluZy5jPC9DT0RFPiBmaWxlLAotICBhbmQgaXMgPFNUUk9ORz5ub3Q8L1NUUk9ORz4gY29tcGlsZWQgaW4gYnkgZGVmYXVsdC4KLSAgSXQgYXR0ZW1wdHMgdG8gY29ycmVjdCBtaXNzcGVsbGluZ3Mgb2YKLSAgVVJMcyB0aGF0IHVzZXJzIG1pZ2h0IGhhdmUgZW50ZXJlZCwgYnkgaWdub3JpbmcgY2FwaXRhbGl6YXRpb24KLSAgYW5kIGJ5IGFsbG93aW5nIHVwIHRvIG9uZSBtaXNzcGVsbGluZy48QlI+Ci0gIFRoaXMgY2F0Y2hlcyB0aGUgbWFqb3JpdHkgb2YgbWlzc3BlbGxlZCByZXF1ZXN0cy4gQW4gYXV0b21hdGljCi0gICJzcGVsbGluZyBjb3JyZWN0ZWQiIHJlZGlyZWN0aW9uIGlzIHJldHVybmVkIGlmIG9ubHkgb25lIG1hdGNoaW5nCi0gIGRvY3VtZW50IHdhcyBmb3VuZCwgYW5kIGEgbGlzdCBvZiBtYXRjaGVzIGlzIHJldHVybmVkIGlmIG1vcmUgdGhhbgotICBvbmUgZG9jdW1lbnQgd2l0aCBhIHN1ZmZpY2llbnRseSBzaW1pbGFyIG5hbWUgaXMgZm91bmQuCi0gIDwvUD4KLQotICA8SDI+U3VtbWFyeTwvSDI+Ci0gIDxQPgotICBSZXF1ZXN0cyB0byBkb2N1bWVudHMgc29tZXRpbWVzIGNhbm5vdCBiZSBzZXJ2ZWQgYnkgdGhlIGNvcmUgYXBhY2hlCi0gIHNlcnZlciBiZWNhdXNlIHRoZSByZXF1ZXN0IHdhcyBtaXNzcGVsbGVkIG9yIG1pc2NhcGl0YWxpemVkLiBUaGlzCi0gIG1vZHVsZSBhZGRyZXNzZXMgdGhpcyBwcm9ibGVtIGJ5IHRyeWluZyB0byBmaW5kIGEgbWF0Y2hpbmcgZG9jdW1lbnQsCi0gIGV2ZW4gYWZ0ZXIgYWxsIG90aGVyIG1vZHVsZXMgZ2F2ZSB1cC4gSXQgZG9lcyBpdHMgd29yayBieSBjb21wYXJpbmcKLSAgZWFjaCBkb2N1bWVudCBuYW1lIGluIHRoZSByZXF1ZXN0ZWQgZGlyZWN0b3J5IGFnYWluc3QgdGhlIHJlcXVlc3RlZAotICBkb2N1bWVudCBuYW1lIDxTVFJPTkc+d2l0aG91dCByZWdhcmQgdG8gY2FzZTwvU1RST05HPiwgYW5kIGFsbG93aW5nCi0gIDxTVFJPTkc+dXAgdG8gb25lIG1pc3NwZWxsaW5nPC9TVFJPTkc+IChjaGFyYWN0ZXIgaW5zZXJ0aW9uIC8gb21pc3Npb24KLSAgLyB0cmFuc3Bvc2l0aW9uIG9yIHdyb25nIGNoYXJhY3RlcikuIEEgbGlzdCBpcyBidWlsdCB3aXRoIGFsbCBkb2N1bWVudAotICBuYW1lcyB3aGljaCB3ZXJlIG1hdGNoZWQgdXNpbmcgdGhpcyBzdHJhdGVneS4KLSAgPC9QPgotICA8UD4KLSAgSWYsIGFmdGVyIHNjYW5uaW5nIHRoZSBkaXJlY3RvcnksCi0gIDxVTD4KLSAgIDxMST5ubyBtYXRjaGluZyBkb2N1bWVudCB3YXMgZm91bmQsIEFwYWNoZSB3aWxsIHByb2NlZWQgYXMgdXN1YWwKLSAgICAgICBhbmQgcmV0dXJuIGEgImRvY3VtZW50IG5vdCBmb3VuZCIgZXJyb3IuCi0gICA8TEk+b25seSBvbmUgZG9jdW1lbnQgaXMgZm91bmQgdGhhdCAiYWxtb3N0IiBtYXRjaGVzIHRoZSByZXF1ZXN0LAotICAgICAgIHRoZW4gaXQgaXMgcmV0dXJuZWQgaW4gdGhlIGZvcm0gb2YgYSByZWRpcmVjdGlvbiByZXNwb25zZS4KLSAgIDxMST5tb3JlIHRoYW4gb25lIGRvY3VtZW50IHdpdGggYSBjbG9zZSBtYXRjaCB3YXMgZm91bmQsIHRoZW4KLSAgICAgICB0aGUgbGlzdCBvZiB0aGUgbWF0Y2hlcyBpcyByZXR1cm5lZCB0byB0aGUgY2xpZW50LCBhbmQgdGhlIGNsaWVudAotICAgICAgIGNhbiBzZWxlY3QgdGhlIGNvcnJlY3QgY2FuZGlkYXRlLgotICA8L1VMPgotICA8L1A+Ci0KLSAgPEgyPkRpcmVjdGl2ZXM8L0gyPgotCi0gIDxNRU5VPgotICA8TEk+PEEgSFJFRj0iI2NoZWNrc3BlbGxpbmciPkNoZWNrU3BlbGxpbmc8L0E+Ci0gIDwvTUVOVT4KLQotICA8SFI+IDwhLS0gdGhlIEhSIGlzIHBhcnQgb2YgdGhlIGRpcmVjdGl2ZSBkZXNjcmlwdGlvbiAtLT4KLSAgPEgyPjxBIE5BTUU9ImNoZWNrc3BlbGxpbmciPkNoZWNrU3BlbGxpbmc8L0E+PC9IMj4KLSAgPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IENoZWNrU3BlbGxpbmd9IGRpcmVjdGl2ZSZndDsgLS0+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQ2hlY2tTcGVsbGluZyA8RU0+b24vb2ZmPC9FTT48QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8Q09ERT5DaGVja1NwZWxsaW5nIE9mZjwvQ09ERT48QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsCi0gICBkaXJlY3RvcnksIC5odGFjY2VzczxCUj4KLSAgPEEKLSAgIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gICBSRUw9IkhlbHAiIAotICA+PFNUUk9ORz5PdmVycmlkZTo8L1NUUk9ORz48L0E+IE9wdGlvbnMKLSAgPEJSPgotICA8QQotICAgSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEJhc2U8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSAgIFJFTD0iSGVscCIKLSAgPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX3NwZWxpbmc8QlI+Ci0gIDxBCi0gICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gICBSRUw9IkhlbHAiCi0gID48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBDaGVja1NwZWxsaW5nIHdhcyBhdmFpbGFibGUgYXMgYQotICBzZXBhcmF0ZWx5Ci0gIGF2YWlsYWJsZSBtb2R1bGUgZm9yIEFwYWNoZSAxLjEsIGJ1dCB3YXMgbGltaXRlZCB0byBtaXNjYXBpdGFsaXphdGlvbnMuCi0gIEFzIG9mIEFwYWNoZSAxLjMsIGl0IGlzIHBhcnQgb2YgdGhlIEFwYWNoZSBkaXN0cmlidXRpb24uICBQcmlvciB0bwotICBBcGFjaGUgMS4zLjIsIHRoZSA8U0FNUD5DaGVja1NwZWxsaW5nPC9TQU1QPiBkaXJlY3RpdmUgd2FzIG9ubHkgYXZhaWxhYmxlCi0gIGluIHRoZSAic2VydmVyIiBhbmQgInZpcnR1YWwgaG9zdCIgY29udGV4dHMuCi0gIDxQPgotICBUaGlzIGRpcmVjdGl2ZSBlbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVsbGluZyBtb2R1bGUuIFdoZW4gZW5hYmxlZCwKLSAga2VlcCBpbiBtaW5kIHRoYXQKLSAgPC9QPgotICA8VUw+Ci0gICA8TEk+dGhlIGRpcmVjdG9yeSBzY2FuIHdoaWNoIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIHNwZWxsaW5nCi0gICAgICAgY29ycmVjdGlvbiB3aWxsIGhhdmUgYW4gaW1wYWN0IG9uIHRoZSBzZXJ2ZXIncyBwZXJmb3JtYW5jZQotICAgICAgIHdoZW4gbWFueSBzcGVsbGluZyBjb3JyZWN0aW9ucyBoYXZlIHRvIGJlIHBlcmZvcm1lZCBhdCB0aGUgc2FtZSB0aW1lLgotICAgPC9MST4KLSAgIDxMST50aGUgZG9jdW1lbnQgdHJlZXMgc2hvdWxkIG5vdCBjb250YWluIHNlbnNpdGl2ZSBmaWxlcyB3aGljaCBjb3VsZAotICAgICAgIGJlIG1hdGNoZWQgaW5hZHZlcnRlbnRseSBieSBhIHNwZWxsaW5nICJjb3JyZWN0aW9uIi4KLSAgIDwvTEk+Ci0gICA8TEk+dGhlIG1vZHVsZSBpcyB1bmFibGUgdG8gY29ycmVjdCBtaXNzcGVsbGVkIHVzZXIgbmFtZXMKLSAgICAgICAoYXMgaW4gPENPREU+aHR0cDovL215Lmhvc3QvfmFwYWhjZS88L0NPREU+KSwganVzdCBmaWxlIG5hbWVzIG9yCi0gICAgICAgZGlyZWN0b3J5IG5hbWVzLgotICAgPC9MST4KLSAgIDxMST5zcGVsbGluZyBjb3JyZWN0aW9ucyBhcHBseSBzdHJpY3RseSB0byBleGlzdGluZyBmaWxlcywgc28gYSByZXF1ZXN0IGZvcgotICAgICAgIHRoZSA8U0FNUD4mbHQ7TG9jYXRpb24gL3N0YXR1cyZndDs8L1NBTVA+IG1heSBnZXQgaW5jb3JyZWN0bHkgdHJlYXRlZAotICAgICAgIGFzIHRoZSBuZWdvdGlhdGVkIGZpbGUgIjxTQU1QPi9zdGF0cy5odG1sPC9TQU1QPiIuCi0gICA8L0xJPgotICA8L1VMPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotIDwvQk9EWT4KLTwvSFRNTD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF9zdGF0dXMuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2Rfc3RhdHVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZmFiZTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbW9kL21vZF9zdGF0dXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLSA8SEVBRD4KLSAgPFRJVExFPkFwYWNoZSBtb2R1bGUgbW9kX3N0YXR1czwvVElUTEU+Ci0gPC9IRUFEPgotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5Nb2R1bGUgbW9kX3N0YXR1czwvSDE+Ci0KLVRoZSBTdGF0dXMgTW9kdWxlIGlzIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZSAxLjEgYW5kIGxhdGVyLjxQPgotCi08SDI+RnVuY3Rpb248L0gyPgotCi1UaGUgU3RhdHVzIG1vZHVsZSBhbGxvd3MgYSBzZXJ2ZXIgYWRtaW5pc3RyYXRvciB0byBmaW5kIG91dCBob3cgd2VsbAotdGhlaXIgc2VydmVyIGlzIHBlcmZvcm1pbmcuICBBIEhUTUwgcGFnZSBpcyBwcmVzZW50ZWQgdGhhdCBnaXZlcwotdGhlIGN1cnJlbnQgc2VydmVyIHN0YXRpc3RpY3MgaW4gYW4gZWFzaWx5IHJlYWRhYmxlIGZvcm0uICBJZiByZXF1aXJlZAotdGhpcyBwYWdlIGNhbiBiZSBtYWRlIHRvIGF1dG9tYXRpY2FsbHkgcmVmcmVzaCAoZ2l2ZW4gYSBjb21wYXRpYmxlCi1icm93c2VyKS4gIEFub3RoZXIgcGFnZSBnaXZlcyBhIHNpbXBsZSBtYWNoaW5lLXJlYWRhYmxlIGxpc3Qgb2YgdGhlIGN1cnJlbnQKLXNlcnZlciBzdGF0ZS4KLTxQPgotVGhlIGRldGFpbHMgZ2l2ZW4gYXJlOgotPFVMPgotPExJPlRoZSBudW1iZXIgb2YgY2hpbGRyZW4gc2VydmluZyByZXF1ZXN0cwotPExJPlRoZSBudW1iZXIgb2YgaWRsZSBjaGlsZHJlbgotPExJPlRoZSBzdGF0dXMgb2YgZWFjaCBjaGlsZCwgdGhlIG51bWJlciBvZiByZXF1ZXN0cyB0aGF0IGNoaWxkIGhhcwotcGVyZm9ybWVkIGFuZCB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHNlcnZlZCBieSB0aGUgY2hpbGQgKCopCi08TEk+QSB0b3RhbCBudW1iZXIgb2YgYWNjZXNzZXMgYW5kIGJ5dGUgY291bnQgc2VydmVkICgqKQotPExJPlRoZSB0aW1lIHRoZSBzZXJ2ZXIgd2FzIHN0YXJ0ZWQvcmVzdGFydGVkIGFuZCB0aGUKLXRpbWUgaXQgaGFzIGJlZW4gcnVubmluZyBmb3IKLTxMST5BdmVyYWdlcyBnaXZpbmcgdGhlIG51bWJlciBvZiByZXF1ZXN0cyBwZXIgc2Vjb25kLAotdGhlIG51bWJlciBvZiBieXRlcyBzZXJ2ZWQgcGVyIHNlY29uZCBhbmQgdGhlIGF2ZXJhZ2UgbnVtYmVyCi1vZiBieXRlcyBwZXIgcmVxdWVzdCAoKikKLTxMST5UaGUgY3VycmVudCBwZXJjZW50YWdlIENQVSB1c2VkIGJ5IGVhY2ggY2hpbGQgYW5kIGluIHRvdGFsIGJ5Ci1BcGFjaGUgKCopCi08TEk+VGhlIGN1cnJlbnQgaG9zdHMgYW5kIHJlcXVlc3RzIGJlaW5nIHByb2Nlc3NlZCAoKikKLTwvVUw+Ci0KLUEgY29tcGlsZS10aW1lIG9wdGlvbiBtdXN0IGJlIHVzZWQgdG8gZGlzcGxheSB0aGUgZGV0YWlscyBtYXJrZWQgIigqKSIgYXMKLXRoZSBpbnN0cnVtZW50YXRpb24gcmVxdWlyZWQgZm9yIG9idGFpbmluZyB0aGVzZSBzdGF0aXN0aWNzIGRvZXMgbm90Ci1leGlzdCB3aXRoaW4gc3RhbmRhcmQgQXBhY2hlLgotCi08SDI+PEEgTkFNRT0iZXh0ZW5kZWRzdGF0dXMiPkV4dGVuZGVkU3RhdHVzIGRpcmVjdGl2ZTwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IEV4dGVuZGVkU3RhdHVzfSBkaXJlY3RpdmUmZ3Q7IC0tPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBFeHRlbmRlZFN0YXR1cyA8RU0+T258T2ZmPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gPENPREU+RXh0ZW5kZWRTdGF0dXMgT2ZmPC9DT0RFPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnIDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLSA8QQotICBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSAgUkVMPSJIZWxwIgotICA+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2Rfc3RhdHVzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IEV4dGVuZGVkU3RhdHVzIGlzIG9ubHkgYXZhaWxhYmxlCi0gaW4gQXBhY2hlIDEuMy4yIGFuZCBsYXRlci4KLQotPFA+Ci1UaGlzIGRpcmVjdGl2ZSBjb250cm9scyB3aGV0aGVyIHRoZSBzZXJ2ZXIga2VlcHMgdHJhY2sgb2YgZXh0ZW5kZWQKLXN0YXR1cyBpbmZvcm1hdGlvbiBmb3IgZWFjaCByZXF1ZXN0LiBUaGlzIGlzIG9ubHkgdXNlZnVsIGlmIHRoZSBzdGF0dXMgbW9kdWxlCi1pcyBlbmFibGVkIG9uIHRoZSBzZXJ2ZXIuCi08L1A+Ci08UD4KLVRoaXMgc2V0dGluZyBhcHBsaWVzIHRvIHRoZSBlbnRpcmUgc2VydmVyLCBhbmQgY2Fubm90IGJlIGVuYWJsZWQgb3IKLWRpc2FibGVkIG9uIGEgdmlydHVhbGhvc3QtYnktdmlydHVhbGhvc3QgYmFzaXMuCi08L1A+Ci0KLTxIMj5FbmFibGluZyBTdGF0dXMgU3VwcG9ydDwvSDI+Ci0KLVRvIGVuYWJsZSBzdGF0dXMgcmVwb3J0cyBvbmx5IGZvciBicm93c2VycyBmcm9tIHRoZSBmb28uY29tCi1kb21haW4gYWRkIHRoaXMgY29kZSB0byB5b3VyIDxDT0RFPmFjY2Vzcy5jb25mPC9DT0RFPiBjb25maWd1cmF0aW9uIGZpbGUKLTxQUkU+Ci0gICAgJmx0O0xvY2F0aW9uIC9zZXJ2ZXItc3RhdHVzJmd0OwotICAgIFNldEhhbmRsZXIgc2VydmVyLXN0YXR1cwotCi0gICAgb3JkZXIgZGVueSxhbGxvdwotICAgIGRlbnkgZnJvbSBhbGwKLSAgICBhbGxvdyBmcm9tIC5mb28uY29tCi0gICAgJmx0Oy9Mb2NhdGlvbiZndDsKLTwvUFJFPgotPFA+Ci1Zb3UgY2FuIG5vdyBhY2Nlc3Mgc2VydmVyIHN0YXRpc3RpY3MgYnkgdXNpbmcgYSBXZWIgYnJvd3NlciB0byBhY2Nlc3MgdGhlCi1wYWdlIDxDT0RFPmh0dHA6Ly95b3VyLnNlcnZlci5uYW1lL3NlcnZlci1zdGF0dXM8L0NPREU+Ci08UD4KLU5vdGUgdGhhdCBtb2Rfc3RhdHVzIHdpbGwgb25seSB3b3JrIHdoZW4geW91IGFyZSBydW5uaW5nIEFwYWNoZSBpbgotPEEgSFJFRj0iY29yZS5odG1sI3NlcnZlcnR5cGUiPnN0YW5kYWxvbmU8L0E+IG1vZGUgYW5kIG5vdAotPEEgSFJFRj0iY29yZS5odG1sI3NlcnZlcnR5cGUiPmluZXRkPC9BPiBtb2RlLgotCi08SDM+QXV0b21hdGljIFVwZGF0ZXM8L0gzPgotWW91IGNhbiBnZXQgdGhlIHN0YXR1cyBwYWdlIHRvIHVwZGF0ZSBpdHNlbGYgYXV0b21hdGljYWxseSBpZiB5b3UgaGF2ZQotYSBicm93c2VyIHRoYXQgc3VwcG9ydHMgInJlZnJlc2giLiAgQWNjZXNzIHRoZSBwYWdlCi08Q09ERT5odHRwOi8veW91ci5zZXJ2ZXIubmFtZS9zZXJ2ZXItc3RhdHVzP3JlZnJlc2g9TjwvQ09ERT4gdG8gcmVmcmVzaCB0aGUKLXBhZ2UgZXZlcnkgTiBzZWNvbmRzLgotPEgzPk1hY2hpbmUgUmVhZGFibGUgU3RhdHVzIEZpbGU8L0gzPgotQSBtYWNoaW5lLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIHN0YXR1cyBmaWxlIGlzIGF2YWlsYWJsZSBieSBhY2Nlc3NpbmcgdGhlCi1wYWdlIDxDT0RFPmh0dHA6Ly95b3VyLnNlcnZlci5uYW1lL3NlcnZlci1zdGF0dXM/YXV0bzwvQ09ERT4uICBUaGlzIGlzIHVzZWZ1bAotd2hlbiBhdXRvbWF0aWNhbGx5IHJ1biwgc2VlIHRoZSBQZXJsIHByb2dyYW0gaW4gdGhlIDxDT0RFPi9zdXBwb3J0PC9DT0RFPgotZGlyZWN0b3J5IG9mIEFwYWNoZSwgPENPREU+bG9nX3NlcnZlcl9zdGF0dXM8L0NPREU+LgotCi08QkxPQ0tRVU9URT4KLSA8U1RST05HPgotICBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBpZiA8U0FNUD5tb2Rfc3RhdHVzPC9TQU1QPiBpcyBjb21waWxlZCBpbnRvCi0gIHRoZSBzZXJ2ZXIsIGl0cyBoYW5kbGVyIGNhcGFiaWxpdHkgaXMgYXZhaWxhYmxlIGluIDxFTT5hbGw8L0VNPgotICBjb25maWd1cmF0aW9uIGZpbGVzLCBpbmNsdWRpbmcgPEVNPnBlcjwvRU0+LWRpcmVjdG9yeSBmaWxlcwotICAoPEVNPmUuZy48L0VNPiwgPFNBTVA+Lmh0YWNjZXNzPC9TQU1QPikuICBUaGlzIG1heSBoYXZlCi0gIHNlY3VyaXR5LXJlbGF0ZWQgcmFtaWZpY2F0aW9ucyBmb3IgeW91ciBzaXRlLgotIDwvU1RST05HPgotPC9CTE9DS1FVT1RFPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2RfdW5pcXVlX2lkLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX3VuaXF1ZV9pZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWM0ZDNhLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21vZC9tb2RfdW5pcXVlX2lkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF91bmlxdWVfaWQ8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5Nb2R1bGUgbW9kX3VuaXF1ZV9pZDwvSDE+Ci0KLVRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgbWFnaWMgdG9rZW4gZm9yIGVhY2ggcmVxdWVzdCB3aGljaCBpcyBndWFyYW50ZWVkCi10byBiZSB1bmlxdWUgYWNyb3NzICJhbGwiIHJlcXVlc3RzIHVuZGVyIHZlcnkgc3BlY2lmaWMgY29uZGl0aW9ucy4KLVRoZSB1bmlxdWUgaWRlbnRpZmllciBpcyBldmVuIHVuaXF1ZSBhY3Jvc3MgbXVsdGlwbGUgbWFjaGluZXMgaW4gYQotcHJvcGVybHkgY29uZmlndXJlZCBjbHVzdGVyIG9mIG1hY2hpbmVzLiAgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi08Q09ERT5VTklRVUVfSUQ8L0NPREU+IGlzIHNldCB0byB0aGUgaWRlbnRpZmllciBmb3IgZWFjaCByZXF1ZXN0LgotVW5pcXVlIGlkZW50aWZpZXJzIGFyZSB1c2VmdWwgZm9yIHZhcmlvdXMgcmVhc29ucyB3aGljaCBhcmUgYmV5b25kIHRoZQotc2NvcGUgb2YgdGhpcyBkb2N1bWVudC4KLQotPEgyPlRoZW9yeTwvSDI+Ci0KLTxQPgotRmlyc3QgYSBicmllZiByZWNhcCBvZiBob3cgdGhlIEFwYWNoZSBzZXJ2ZXIgd29ya3Mgb24gVW5peCBtYWNoaW5lcy4KLVRoaXMgZmVhdHVyZSBjdXJyZW50bHkgaXNuJ3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MgTlQuICBPbiBVbml4IG1hY2hpbmVzLAotQXBhY2hlIGNyZWF0ZXMgc2V2ZXJhbCBjaGlsZHJlbiwgdGhlIGNoaWxkcmVuIHByb2Nlc3MgcmVxdWVzdHMgb25lIGF0Ci1hIHRpbWUuICBFYWNoIGNoaWxkIGNhbiBzZXJ2ZSBtdWx0aXBsZSByZXF1ZXN0cyBpbiBpdHMgbGlmZXRpbWUuICBGb3IgdGhlCi1wdXJwb3NlIG9mIHRoaXMgZGlzY3Vzc2lvbiwgdGhlIGNoaWxkcmVuIGRvbid0IHNoYXJlIGFueSBkYXRhCi13aXRoIGVhY2ggb3RoZXIuICBXZSdsbCByZWZlciB0byB0aGUgY2hpbGRyZW4gYXMgaHR0cGQgcHJvY2Vzc2VzLgotCi08UD4KLVlvdXIgd2Vic2l0ZSBoYXMgb25lIG9yIG1vcmUgbWFjaGluZXMgdW5kZXIgeW91ciBhZG1pbmlzdHJhdGl2ZSBjb250cm9sLAotdG9nZXRoZXIgd2UnbGwgY2FsbCB0aGVtIGEgY2x1c3RlciBvZiBtYWNoaW5lcy4gIEVhY2ggbWFjaGluZSBjYW4KLXBvc3NpYmx5IHJ1biBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgQXBhY2hlLiAgQWxsIG9mIHRoZXNlIGNvbGxlY3RpdmVseQotYXJlIGNvbnNpZGVyZWQgInRoZSB1bml2ZXJzZSIsIGFuZCB3aXRoIGNlcnRhaW4gYXNzdW1wdGlvbnMgd2UnbGwKLXNob3cgdGhhdCBpbiB0aGlzIHVuaXZlcnNlIHdlIGNhbiBnZW5lcmF0ZSB1bmlxdWUgaWRlbnRpZmllcnMgZm9yIGVhY2gKLXJlcXVlc3QsIHdpdGhvdXQgZXh0ZW5zaXZlIGNvbW11bmljYXRpb24gYmV0d2VlbiBtYWNoaW5lcyBpbiB0aGUgY2x1c3Rlci4KLQotPFA+Ci1UaGUgbWFjaGluZXMgaW4geW91ciBjbHVzdGVyIHNob3VsZCBzYXRpc2Z5IHRoZXNlIHJlcXVpcmVtZW50cy4KLShFdmVuIGlmIHlvdSBoYXZlIG9ubHkgb25lIG1hY2hpbmUgeW91IHNob3VsZCBzeW5jaHJvbml6ZSBpdHMgY2xvY2sKLXdpdGggTlRQLikKLQotPFVMPgotPExJPlRoZSBtYWNoaW5lcycgdGltZXMgYXJlIHN5bmNocm9uaXplZCB2aWEgTlRQIG9yIG90aGVyIG5ldHdvcmsgdGltZQotICAgIHByb3RvY29sLgotCi08TEk+VGhlIG1hY2hpbmVzJyBob3N0bmFtZXMgYWxsIGRpZmZlciwgc3VjaCB0aGF0IHRoZSBtb2R1bGUgY2FuIGRvIGEKLSAgICBob3N0bmFtZSBsb29rdXAgb24gdGhlIGhvc3RuYW1lIGFuZCByZWNlaXZlIGEgZGlmZmVyZW50IElQIGFkZHJlc3MKLSAgICBmb3IgZWFjaCBtYWNoaW5lIGluIHRoZSBjbHVzdGVyLgotPC9VTD4KLQotPFA+Ci1BcyBmYXIgYXMgb3BlcmF0aW5nIHN5c3RlbSBhc3N1bXB0aW9ucyBnbywgd2UgYXNzdW1lIHRoYXQgcGlkcyAocHJvY2VzcwotaWRzKSBmaXQgaW4gMzItYml0cy4gIElmIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHVzZXMgbW9yZSB0aGFuIDMyLWJpdHMKLWZvciBhIHBpZCwgdGhlIGZpeCBpcyB0cml2aWFsIGJ1dCBtdXN0IGJlIHBlcmZvcm1lZCBpbiB0aGUgY29kZS4KLQotPFA+Ci1HaXZlbiB0aG9zZSBhc3N1bXB0aW9ucywgYXQgYSBzaW5nbGUgcG9pbnQgaW4gdGltZSB3ZSBjYW4gaWRlbnRpZnkKLWFueSBodHRwZCBwcm9jZXNzIG9uIGFueSBtYWNoaW5lIGluIHRoZSBjbHVzdGVyIGZyb20gYWxsIG90aGVyIGh0dHBkCi1wcm9jZXNzZXMuICBUaGUgbWFjaGluZSdzIElQIGFkZHJlc3MgYW5kIHRoZSBwaWQgb2YgdGhlIGh0dHBkIHByb2Nlc3MKLWFyZSBzdWZmaWNpZW50IHRvIGRvIHRoaXMuICBTbyBpbiBvcmRlciB0byBnZW5lcmF0ZSB1bmlxdWUgaWRlbnRpZmllcnMKLWZvciByZXF1ZXN0cyB3ZSBuZWVkIG9ubHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUuCi0KLTxQPgotVG8gZGlzdGluZ3Vpc2ggdGltZSB3ZSB3aWxsIHVzZSBhIFVuaXggdGltZXN0YW1wIChzZWNvbmRzIHNpbmNlIEphbnVhcnkKLTEsIDE5NzAgVVRDKSwgYW5kIGEgMTYtYml0IGNvdW50ZXIuICBUaGUgdGltZXN0YW1wIGhhcyBvbmx5IG9uZSBzZWNvbmQKLWdyYW51bGFyaXR5LCBzbyB0aGUgY291bnRlciBpcyB1c2VkIHRvIHJlcHJlc2VudCB1cCB0byA2NTUzNiB2YWx1ZXMKLWR1cmluZyBhIHNpbmdsZSBzZWNvbmQuICBUaGUgcXVhZHJ1cGxlIDxFTT4oIGlwX2FkZHIsIHBpZCwgdGltZV9zdGFtcCwKLWNvdW50ZXIgKTwvRU0+IGlzIHN1ZmZpY2llbnQgdG8gZW51bWVyYXRlIDY1NTM2IHJlcXVlc3RzIHBlciBzZWNvbmQgcGVyCi1odHRwZCBwcm9jZXNzLiAgVGhlcmUgYXJlIGlzc3VlcyBob3dldmVyIHdpdGggcGlkIHJldXNlIG92ZXIKLXRpbWUsIGFuZCB0aGUgY291bnRlciBpcyB1c2VkIHRvIGFsbGV2aWF0ZSB0aGlzIGlzc3VlLgotCi08UD4KLVdoZW4gYW4gaHR0cGQgY2hpbGQgaXMgY3JlYXRlZCwgdGhlIGNvdW50ZXIgaXMgaW5pdGlhbGl6ZWQgd2l0aCAoCi1jdXJyZW50IG1pY3Jvc2Vjb25kcyBkaXZpZGVkIGJ5IDEwICkgbW9kdWxvIDY1NTM2ICh0aGlzIGZvcm11bGEgd2FzCi1jaG9zZW4gdG8gZWxpbWluYXRlIHNvbWUgdmFyaWFuY2UgcHJvYmxlbXMgd2l0aCB0aGUgbG93IG9yZGVyIGJpdHMgb2YKLXRoZSBtaWNyb3NlY29uZCB0aW1lcnMgb24gc29tZSBzeXN0ZW1zKS4gIFdoZW4gYSB1bmlxdWUgaWRlbnRpZmllciBpcwotZ2VuZXJhdGVkLCB0aGUgdGltZSBzdGFtcCB1c2VkIGlzIHRoZSB0aW1lIHRoZSByZXF1ZXN0IGFycml2ZWQgYXQgdGhlCi13ZWIgc2VydmVyLiAgVGhlIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgZXZlcnkgdGltZSBhbiBpZGVudGlmaWVyIGlzCi1nZW5lcmF0ZWQgKGFuZCBhbGxvd2VkIHRvIHJvbGwgb3ZlcikuCi0KLTxQPgotVGhlIGtlcm5lbCBnZW5lcmF0ZXMgYSBwaWQgZm9yIGVhY2ggcHJvY2VzcyBhcyBpdCBmb3JrcyB0aGUgcHJvY2VzcywgYW5kCi1waWRzIGFyZSBhbGxvd2VkIHRvIHJvbGwgb3ZlciAodGhleSdyZSAxNi1iaXRzIG9uIG1hbnkgVW5peGVzLCBidXQgbmV3ZXIKLXN5c3RlbXMgaGF2ZSBleHBhbmRlZCB0byAzMi1iaXRzKS4gIFNvIG92ZXIgdGltZSB0aGUgc2FtZSBwaWQgd2lsbCBiZQotcmV1c2VkLiAgSG93ZXZlciB1bmxlc3MgaXQgaXMgcmV1c2VkIHdpdGhpbiB0aGUgc2FtZSBzZWNvbmQsIGl0IGRvZXMgbm90Ci1kZXN0cm95IHRoZSB1bmlxdWVuZXNzIG9mIG91ciBxdWFkcnVwbGUuICBUaGF0IGlzLCB3ZSBhc3N1bWUgdGhlIHN5c3RlbQotZG9lcyBub3Qgc3Bhd24gNjU1MzYgcHJvY2Vzc2VzIGluIGEgb25lIHNlY29uZCBpbnRlcnZhbCAoaXQgbWF5IGV2ZW4gYmUKLTMyNzY4IHByb2Nlc3NlcyBvbiBzb21lIFVuaXhlcywgYnV0IGV2ZW4gdGhpcyBpc24ndCBsaWtlbHkgdG8gaGFwcGVuKS4KLQotPFA+Ci1TdXBwb3NlIHRoYXQgdGltZSByZXBlYXRzIGl0c2VsZiBmb3Igc29tZSByZWFzb24uICBUaGF0IGlzLCBzdXBwb3NlIHRoYXQKLXRoZSBzeXN0ZW0ncyBjbG9jayBpcyBzY3Jld2VkIHVwIGFuZCBpdCByZXZpc2l0cyBhIHBhc3QgdGltZSAob3IgaXQgaXMKLXRvbyBmYXIgZm9yd2FyZCwgaXMgcmVzZXQgY29ycmVjdGx5LCBhbmQgdGhlbiByZXZpc2l0cyB0aGUgZnV0dXJlIHRpbWUpLgotSW4gdGhpcyBjYXNlIHdlIGNhbiBlYXNpbHkgc2hvdyB0aGF0IHdlIGNhbiBnZXQgcGlkIGFuZCB0aW1lIHN0YW1wIHJldXNlLgotVGhlIGNob2ljZSBvZiBpbml0aWFsaXplciBmb3IgdGhlIGNvdW50ZXIgaXMgaW50ZW5kZWQgdG8gaGVscCBkZWZlYXQgdGhpcy4KLU5vdGUgdGhhdCB3ZSByZWFsbHkgd2FudCBhIHJhbmRvbSBudW1iZXIgdG8gaW5pdGlhbGl6ZSB0aGUgY291bnRlciwKLWJ1dCB0aGVyZSBhcmVuJ3QgYW55IHJlYWRpbHkgYXZhaWxhYmxlIG51bWJlcnMgb24gbW9zdCBzeXN0ZW1zICg8RU0+aS5lLjwvRU0+LCB5b3UKLWNhbid0IHVzZSByYW5kKCkgYmVjYXVzZSB5b3UgbmVlZCB0byBzZWVkIHRoZSBnZW5lcmF0b3IsIGFuZCBjYW4ndCBzZWVkCi1pdCB3aXRoIHRoZSB0aW1lIGJlY2F1c2UgdGltZSwgYXQgbGVhc3QgYXQgb25lIHNlY29uZCByZXNvbHV0aW9uLCBoYXMKLXJlcGVhdGVkIGl0c2VsZikuICBUaGlzIGlzIG5vdCBhIHBlcmZlY3QgZGVmZW5zZS4KLQotPFA+Ci1Ib3cgZ29vZCBhIGRlZmVuc2UgaXMgaXQ/ICBXZWxsIHN1cHBvc2UgdGhhdCBvbmUgb2YgeW91ciBtYWNoaW5lcyBzZXJ2ZXMKLWF0IG1vc3QgNTAwIHJlcXVlc3RzIHBlciBzZWNvbmQgKHdoaWNoIGlzIGEgdmVyeSByZWFzb25hYmxlIHVwcGVyIGJvdW5kCi1hdCB0aGlzIHdyaXRpbmcsIGJlY2F1c2Ugc3lzdGVtcyBnZW5lcmFsbHkgZG8gbW9yZSB0aGFuIGp1c3Qgc2hvdmVsIG91dAotc3RhdGljIGZpbGVzKS4gIFRvIGRvIHRoYXQgaXQgd2lsbCByZXF1aXJlIGEgbnVtYmVyIG9mIGNoaWxkcmVuIHdoaWNoCi1kZXBlbmRzIG9uIGhvdyBtYW55IGNvbmN1cnJlbnQgY2xpZW50cyB5b3UgaGF2ZS4gIEJ1dCB3ZSdsbCBiZSBwZXNzaW1pc3RpYwotYW5kIHN1cHBvc2UgdGhhdCBhIHNpbmdsZSBjaGlsZCBpcyBhYmxlIHRvIHNlcnZlIDUwMCByZXF1ZXN0cyBwZXIgc2Vjb25kLgotVGhlcmUgYXJlIDEwMDAgcG9zc2libGUgc3RhcnRpbmcgY291bnRlciB2YWx1ZXMgc3VjaCB0aGF0IHR3byBzZXF1ZW5jZXMKLW9mIDUwMCByZXF1ZXN0cyBvdmVybGFwLiAgU28gdGhlcmUgaXMgYSAxLjUlIGNoYW5jZSB0aGF0IGlmIHRpbWUgKGF0IG9uZQotc2Vjb25kIHJlc29sdXRpb24pIHJlcGVhdHMgaXRzZWxmIHRoaXMgY2hpbGQgd2lsbCByZXBlYXQgYSBjb3VudGVyIHZhbHVlLAotYW5kIHVuaXF1ZW5lc3Mgd2lsbCBiZSBicm9rZW4uICBUaGlzIHdhcyBhIHZlcnkgcGVzc2ltaXN0aWMgZXhhbXBsZSwKLWFuZCB3aXRoIHJlYWwgd29ybGQgdmFsdWVzIGl0J3MgZXZlbiBsZXNzIGxpa2VseSB0byBvY2N1ci4gIElmIHlvdXIKLXN5c3RlbSBpcyBzdWNoIHRoYXQgaXQncyBzdGlsbCBsaWtlbHkgdG8gb2NjdXIsIHRoZW4gcGVyaGFwcyB5b3Ugc2hvdWxkCi1tYWtlIHRoZSBjb3VudGVyIDMyIGJpdHMgKGJ5IGVkaXRpbmcgdGhlIGNvZGUpLgotCi08UD4KLVlvdSBtYXkgYmUgY29uY2VybmVkIGFib3V0IHRoZSBjbG9jayBiZWluZyAic2V0IGJhY2siIGR1cmluZyBzdW1tZXIKLWRheWxpZ2h0IHNhdmluZ3MuICBIb3dldmVyIHRoaXMgaXNuJ3QgYW4gaXNzdWUgYmVjYXVzZSB0aGUgdGltZXMgdXNlZCBoZXJlCi1hcmUgVVRDLCB3aGljaCAiYWx3YXlzIiBnbyBmb3J3YXJkLiAgTm90ZSB0aGF0IHg4NiBiYXNlZCBVbml4ZXMgbWF5IG5lZWQKLXByb3BlciBjb25maWd1cmF0aW9uIGZvciB0aGlzIHRvIGJlIHRydWUgLS0gdGhleSBzaG91bGQgYmUgY29uZmlndXJlZCB0bwotYXNzdW1lIHRoYXQgdGhlIG1vdGhlcmJvYXJkIGNsb2NrIGlzIG9uIFVUQyBhbmQgY29tcGVuc2F0ZSBhcHByb3ByaWF0ZWx5LgotQnV0IGV2ZW4gc3RpbGwsIGlmIHlvdSdyZSBydW5uaW5nIE5UUCB0aGVuIHlvdXIgVVRDIHRpbWUgd2lsbCBiZSBjb3JyZWN0Ci12ZXJ5IHNob3J0bHkgYWZ0ZXIgcmVib290LgotCi08UD4KLVRoZSA8Q09ERT5VTklRVUVfSUQ8L0NPREU+IGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGNvbnN0cnVjdGVkIGJ5Ci1lbmNvZGluZyB0aGUgMTEyLWJpdCAoMzItYml0IElQIGFkZHJlc3MsIDMyIGJpdCBwaWQsIDMyIGJpdCB0aW1lIHN0YW1wLAotMTYgYml0IGNvdW50ZXIpIHF1YWRydXBsZSB1c2luZyB0aGUgYWxwaGFiZXQgPENPREU+W0EtWmEtejAtOUAtXTwvQ09ERT4KLWluIGEgbWFubmVyIHNpbWlsYXIgdG8gTUlNRSBiYXNlNjQgZW5jb2RpbmcsIHByb2R1Y2luZyAxOSBjaGFyYWN0ZXJzLgotVGhlIE1JTUUgYmFzZTY0IGFscGhhYmV0IGlzIGFjdHVhbGx5IDxDT0RFPltBLVphLXowLTkrL108L0NPREU+IGhvd2V2ZXIKLTxDT0RFPis8L0NPREU+IGFuZCA8Q09ERT4vPC9DT0RFPiBuZWVkIHRvIGJlIHNwZWNpYWxseSBlbmNvZGVkIGluIFVSTHMsCi13aGljaCBtYWtlcyB0aGVtIGxlc3MgZGVzaXJhYmxlLiAgQWxsIHZhbHVlcyBhcmUgZW5jb2RlZCBpbiBuZXR3b3JrCi1ieXRlIG9yZGVyaW5nIHNvIHRoYXQgdGhlIGVuY29kaW5nIGlzIGNvbXBhcmFibGUgYWNyb3NzIGFyY2hpdGVjdHVyZXMgb2YKLWRpZmZlcmVudCBieXRlIG9yZGVyaW5nLiAgVGhlIGFjdHVhbCBvcmRlcmluZyBvZiB0aGUgZW5jb2RpbmcgaXM6IHRpbWUKLXN0YW1wLCBJUCBhZGRyZXNzLCBwaWQsIGNvdW50ZXIuICBUaGlzIG9yZGVyaW5nIGhhcyBhIHB1cnBvc2UsIGJ1dCBpdAotc2hvdWxkIGJlIGVtcGhhc2l6ZWQgdGhhdCBhcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCBkaXNzZWN0IHRoZSBlbmNvZGluZy4KLUFwcGxpY2F0aW9ucyBzaG91bGQgdHJlYXQgdGhlIGVudGlyZSBlbmNvZGVkIDxDT0RFPlVOSVFVRV9JRDwvQ09ERT4gYXMgYW4KLW9wYXF1ZSB0b2tlbiwgd2hpY2ggY2FuIGJlIGNvbXBhcmVkIGFnYWluc3Qgb3RoZXIgPENPREU+VU5JUVVFX0lEPC9DT0RFPnMKLWZvciBlcXVhbGl0eSBvbmx5LgotCi08UD4KLVRoZSBvcmRlcmluZyB3YXMgY2hvc2VuIHN1Y2ggdGhhdCBpdCdzIHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgZW5jb2RpbmcKLWluIHRoZSBmdXR1cmUgd2l0aG91dCB3b3JyeWluZyBhYm91dCBjb2xsaXNpb24gd2l0aCBhbiBleGlzdGluZyBkYXRhYmFzZQotb2YgPENPREU+VU5JUVVFX0lEPC9DT0RFPnMuICBUaGUgbmV3IGVuY29kaW5ncyBzaG91bGQgYWxzbyBrZWVwIHRoZSB0aW1lCi1zdGFtcCBhcyB0aGUgZmlyc3QgZWxlbWVudCwgYW5kIGNhbiBvdGhlcndpc2UgdXNlIHRoZSBzYW1lIGFscGhhYmV0IGFuZAotYml0IGxlbmd0aC4gIFNpbmNlIHRoZSB0aW1lIHN0YW1wcyBhcmUgZXNzZW50aWFsbHkgYW4gaW5jcmVhc2luZyBzZXF1ZW5jZSwKLWl0J3Mgc3VmZmljaWVudCB0byBoYXZlIGEgPEVNPmZsYWcgc2Vjb25kPC9FTT4gaW4gd2hpY2ggYWxsIG1hY2hpbmVzIGluIHRoZQotY2x1c3RlciBzdG9wIHNlcnZpbmcgYW5kIHJlcXVlc3QsIGFuZCBzdG9wIHVzaW5nIHRoZSBvbGQgZW5jb2RpbmcgZm9ybWF0LgotQWZ0ZXJ3YXJkcyB0aGV5IGNhbiByZXN1bWUgcmVxdWVzdHMgYW5kIGJlZ2luIGlzc3VpbmcgdGhlIG5ldyBlbmNvZGluZ3MuCi0KLTxQPgotVGhpcyB3ZSBiZWxpZXZlIGlzIGEgcmVsYXRpdmVseSBwb3J0YWJsZSBzb2x1dGlvbiB0byB0aGlzIHByb2JsZW0uICBJdCBjYW4KLWJlIGV4dGVuZGVkIHRvIG11bHRpdGhyZWFkZWQgc3lzdGVtcyBsaWtlIFdpbmRvd3MgTlQsIGFuZCBjYW4gZ3JvdyB3aXRoCi1mdXR1cmUgbmVlZHMuICBUaGUgaWRlbnRpZmllcnMgZ2VuZXJhdGVkIGhhdmUgZXNzZW50aWFsbHkgYW4gaW5maW5pdGUKLWxpZmUtdGltZSBiZWNhdXNlIGZ1dHVyZSBpZGVudGlmaWVycyBjYW4gYmUgbWFkZSBsb25nZXIgYXMgcmVxdWlyZWQuCi1Fc3NlbnRpYWxseSBubyBjb21tdW5pY2F0aW9uIGlzIHJlcXVpcmVkIGJldHdlZW4gbWFjaGluZXMgaW4gdGhlIGNsdXN0ZXIKLShvbmx5IE5UUCBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQsIHdoaWNoIGlzIGxvdyBvdmVyaGVhZCksIGFuZCBubwotY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGh0dHBkIHByb2Nlc3NlcyBpcyByZXF1aXJlZCAodGhlIGNvbW11bmljYXRpb24gaXMKLWltcGxpY2l0IGluIHRoZSBwaWQgdmFsdWUgYXNzaWduZWQgYnkgdGhlIGtlcm5lbCkuICBJbiB2ZXJ5IHNwZWNpZmljCi1zaXR1YXRpb25zIHRoZSBpZGVudGlmaWVyIGNhbiBiZSBzaG9ydGVuZWQsIGJ1dCBtb3JlIGluZm9ybWF0aW9uIG5lZWRzCi10byBiZSBhc3N1bWVkIChmb3IgZXhhbXBsZSB0aGUgMzItYml0IElQIGFkZHJlc3MgaXMgb3ZlcmtpbGwgZm9yIGFueQotc2l0ZSwgYnV0IHRoZXJlIGlzIG5vIHBvcnRhYmxlIHNob3J0ZXIgcmVwbGFjZW1lbnQgZm9yIGl0KS4KLQotPEhSPgotCi08SDI+RGlyZWN0aXZlczwvSDI+Ci0KLTxDT0RFPm1vZF91bmlxdWVfaWQ8L0NPREU+IGhhcyBubyBkaXJlY3RpdmVzLgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvbW9kL21vZF91c2VyZGlyLmh0bWwgYi9kb2NzL21hbnVhbC9tb2QvbW9kX3VzZXJkaXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcwYjFiMC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX3VzZXJkaXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSBtb2R1bGUgbW9kX3VzZXJkaXI8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5Nb2R1bGUgbW9kX3VzZXJkaXI8L0gxPgotCi1UaGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4gdGhlIDxDT0RFPm1vZF91c2VyZGlyLmM8L0NPREU+IGZpbGUsIGFuZAotaXMgY29tcGlsZWQgaW4gYnkgZGVmYXVsdC4gSXQgcHJvdmlkZXMgZm9yIHVzZXItc3BlY2lmaWMgZGlyZWN0b3JpZXMuCi0KLQotPFVMPgotPExJPjxBIEhSRUY9IiN1c2VyZGlyIj5Vc2VyRGlyPC9BPgotPC9VTD4KLTxIUj4KLQotCi08SDI+PEEgTkFNRT0idXNlcmRpciI+VXNlckRpcjwvQT48L0gyPgotPCEtLSVwbGFpbnRleHQgJmx0Oz9JTkRFWCB7XHR0IFVzZXJEaXJ9IGRpcmVjdGl2ZSZndDsgLS0+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFVzZXJEaXIgPEVNPmRpcmVjdG9yeS9maWxlbmFtZTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IDxDT0RFPlVzZXJEaXIgcHVibGljX2h0bWw8L0NPREU+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gQmFzZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX3VzZXJkaXI8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gQWxsIGZvcm1zIGV4Y2VwdCB0aGUgPENPREU+VXNlckRpcgotcHVibGljX2h0bWw8L0NPREU+IGZvcm0gYXJlIG9ubHkgYXZhaWxhYmxlIGluIEFwYWNoZSAxLjEgb3IgYWJvdmUuICBVc2UKLW9mIHRoZSA8U0FNUD5lbmFibGVkPC9TQU1QPiBrZXl3b3JkLCBvciA8U0FNUD5kaXNhYmxlZDwvU0FNUD4gd2l0aCBhCi1saXN0IG9mIHVzZXJuYW1lcywgaXMgb25seSBhdmFpbGFibGUgaW4gQXBhY2hlIDEuMyBhbmQgYWJvdmUuPFA+Ci0KLVRoZSBVc2VyRGlyIGRpcmVjdGl2ZSBzZXRzIHRoZSByZWFsIGRpcmVjdG9yeSBpbiBhIHVzZXIncyBob21lIGRpcmVjdG9yeQotdG8gdXNlIHdoZW4gYSByZXF1ZXN0IGZvciBhIGRvY3VtZW50IGZvciBhIHVzZXIgaXMgcmVjZWl2ZWQuCi08RU0+RGlyZWN0b3J5L2ZpbGVuYW1lPC9FTT4gaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci08L1A+Ci08VUw+Ci0gPExJPlRoZSBuYW1lIG9mIGEgZGlyZWN0b3J5IG9yIGEgcGF0dGVybiBzdWNoIGFzIHRob3NlIHNob3duIGJlbG93LgotIDwvTEk+Ci0gPExJPlRoZSBrZXl3b3JkIDxTQU1QPmRpc2FibGVkPC9TQU1QPi4gIFRoaXMgdHVybnMgb2ZmIDxFTT5hbGw8L0VNPgotICB1c2VybmFtZS10by1kaXJlY3RvcnkgdHJhbnNsYXRpb25zIGV4Y2VwdCB0aG9zZSBleHBsaWNpdGx5IG5hbWVkIHdpdGgKLSAgdGhlIDxTQU1QPmVuYWJsZWQ8L1NBTVA+IGtleXdvcmQgKHNlZSBiZWxvdykuCi0gPC9MST4KLSA8TEk+VGhlIGtleXdvcmQgPFNBTVA+ZGlzYWJsZWQ8L1NBTVA+IGZvbGxvd2VkIGJ5IGEgc3BhY2UtZGVsaW1pdGVkCi0gIGxpc3Qgb2YgdXNlcm5hbWVzLiAgVXNlcm5hbWVzIHRoYXQgYXBwZWFyIGluIHN1Y2ggYSBsaXN0IHdpbGwKLSAgPEVNPm5ldmVyPC9FTT4gaGF2ZSBkaXJlY3RvcnkgdHJhbnNsYXRpb24gcGVyZm9ybWVkLCBldmVuIGlmIHRoZXkKLSAgYXBwZWFyIGluIGFuIDxTQU1QPmVuYWJsZWQ8L1NBTVA+IGNsYXVzZS4KLSA8L0xJPgotIDxMST5UaGUga2V5d29yZCA8U0FNUD5lbmFibGVkPC9TQU1QPiBmb2xsb3dlZCBieSBhIHNwYWNlLWRlbGltaXRlZCBsaXN0Ci0gIG9mIHVzZXJuYW1lcy4gIFRoZXNlIHVzZXJuYW1lcyB3aWxsIGhhdmUgZGlyZWN0b3J5IHRyYW5zbGF0aW9uCi0gIHBlcmZvcm1lZCBldmVuIGlmIGEgZ2xvYmFsIGRpc2FibGUgaXMgaW4gZWZmZWN0LCBidXQgbm90IGlmIHRoZXkgYWxzbwotICBhcHBlYXIgaW4gYSA8U0FNUD5kaXNhYmxlZDwvU0FNUD4gY2xhdXNlLgotIDwvTEk+Ci08L1VMPgotPFA+Ci1JZiBuZWl0aGVyIHRoZSA8U0FNUD5lbmFibGVkPC9TQU1QPiBub3IgdGhlIDxTQU1QPmRpc2FibGVkPC9TQU1QPgota2V5d29yZHMgYXBwZWFyIGluIHRoZSA8U0FNUD5Vc2VyZGlyPC9TQU1QPiBkaXJlY3RpdmUsIHRoZSBhcmd1bWVudCBpcwotdHJlYXRlZCBhcyBhIGZpbGVuYW1lIHBhdHRlcm4sIGFuZCBpcyB1c2VkIHRvIHR1cm4gdGhlIG5hbWUgaW50byBhCi1kaXJlY3Rvcnkgc3BlY2lmaWNhdGlvbi4gIEEgcmVxdWVzdCBmb3IKLTxDT0RFPmh0dHA6Ly93d3cuZm9vLmNvbS9+Ym9iL29uZS90d28uaHRtbDwvQ09ERT4gd2lsbCBiZSB0cmFuc2xhdGVkIHRvOgotPFBSRT4KLVVzZXJEaXIgcHVibGljX2h0bWwgICAgIC0mZ3Q7IH5ib2IvcHVibGljX2h0bWwvb25lL3R3by5odG1sCi1Vc2VyRGlyIC91c3Ivd2ViICAgICAgICAtJmd0OyAvdXNyL3dlYi9ib2Ivb25lL3R3by5odG1sCi1Vc2VyRGlyIC9ob21lLyovd3d3ICAgICAtJmd0OyAvaG9tZS9ib2Ivd3d3L29uZS90d28uaHRtbAotPC9QUkU+Ci1UaGUgZm9sbG93aW5nIGRpcmVjdGl2ZXMgd2lsbCBzZW5kIHJlZGlyZWN0cyB0byB0aGUgY2xpZW50OgotPFBSRT4KLVVzZXJEaXIgaHR0cDovL3d3dy5mb28uY29tL3VzZXJzIC0mZ3Q7IGh0dHA6Ly93d3cuZm9vLmNvbS91c2Vycy9ib2Ivb25lL3R3by5odG1sCi1Vc2VyRGlyIGh0dHA6Ly93d3cuZm9vLmNvbS8qL3VzciAtJmd0OyBodHRwOi8vd3d3LmZvby5jb20vYm9iL3Vzci9vbmUvdHdvLmh0bWwKLVVzZXJEaXIgaHR0cDovL3d3dy5mb28uY29tL34qLyAgIC0mZ3Q7IGh0dHA6Ly93d3cuZm9vLmNvbS9+Ym9iL29uZS90d28uaHRtbAotPC9QUkU+Ci08L1A+Ci08QkxPQ0tRVU9URT4KLSA8U1RST05HPgotIEJlIGNhcmVmdWwgd2hlbiB1c2luZyB0aGlzIGRpcmVjdGl2ZTsgZm9yIGluc3RhbmNlLAotIDxTQU1QPiZxdW90O1VzZXJEaXImbmJzcDsuLyZxdW90OzwvU0FNUD4gd291bGQgbWFwCi0gPFNBTVA+JnF1b3Q7L35yb290JnF1b3Q7PC9TQU1QPiB0bwotIDxTQU1QPiZxdW90Oy8mcXVvdDs8L1NBTVA+IC0gd2hpY2ggaXMgcHJvYmFibHkgdW5kZXNpcmFibGUuICBJZiB5b3UgYXJlCi0gcnVubmluZyBBcGFjaGUgMS4zIG9yIGFib3ZlLCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IHlvdXIKLSBjb25maWd1cmF0aW9uIGluY2x1ZGUgYQotICZxdW90OzxTQU1QPlVzZXJEaXImbmJzcDtkaXNhYmxlZCZuYnNwO3Jvb3Q8L1NBTVA+JnF1b3Q7IGRlY2xhcmF0aW9uLgotIFNlZSBhbHNvCi0gdGhlCi0gPEEKLSAgSFJFRj0iY29yZS5odG1sI2RpcmVjdG9yeSIKLSA+Jmx0O0RpcmVjdG9yeSZndDs8L0E+Ci0gZGlyZWN0aXZlIGFuZCB0aGUKLSA8QQotICBIUkVGPSIuLi9taXNjL3NlY3VyaXR5X3RpcHMuaHRtbCIKLSA+U2VjdXJpdHkgVGlwczwvQT4KLSBwYWdlIGZvciBtb3JlIGluZm9ybWF0aW9uLgotIDwvU1RST05HPgotPC9CTE9DS1FVT1RFPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tb2QvbW9kX3VzZXJ0cmFjay5odG1sIGIvZG9jcy9tYW51YWwvbW9kL21vZF91c2VydHJhY2suaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdkODFhYy4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX3VzZXJ0cmFjay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIG1vZHVsZSBtb2RfdXNlcnRyYWNrPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+TW9kdWxlIG1vZF91c2VydHJhY2s8L0gxPgotCi1QcmV2aW91cyByZWxlYXNlcyBvZiBBcGFjaGUgaGF2ZSBpbmNsdWRlZCBhIG1vZHVsZSB3aGljaCBnZW5lcmF0ZXMgYQotJ2NsaWNrc3RyZWFtJyBsb2cgb2YgdXNlciBhY3Rpdml0eSBvbiBhIHNpdGUgdXNpbmcgY29va2llcy4gVGhpcyB3YXMKLWNhbGxlZCB0aGUgImNvb2tpZXMiIG1vZHVsZSwgbW9kX2Nvb2tpZXMuIEluIEFwYWNoZSAxLjIgYW5kIGxhdGVyIHRoaXMKLW1vZHVsZSBoYXMgYmVlbiByZW5hbWVkIHRoZSAidXNlciB0cmFja2luZyIgbW9kdWxlLAotbW9kX3VzZXJ0cmFjay4gVGhpcyBtb2R1bGUgaGFzIGJlZW4gc2ltcGxpZmllZCBhbmQgbmV3IGRpcmVjdGl2ZXMKLWFkZGVkLgotCi08SFI+Ci0KLTxIMj5Mb2dnaW5nPC9IMj4KLQotUHJldmlvdXNseSwgdGhlIGNvb2tpZXMgbW9kdWxlIChub3cgdGhlIHVzZXIgdHJhY2tpbmcgbW9kdWxlKSBkaWQgaXRzCi1vd24gbG9nZ2luZywgdXNpbmcgdGhlIDxUVD5Db29raWVMb2c8L1RUPiBkaXJlY3RpdmUuIEluIHRoaXMgcmVsZWFzZSwKLXRoaXMgbW9kdWxlIGRvZXMgbm8gbG9nZ2luZyBhdCBhbGwuIEluc3RlYWQsIGEgY29uZmlndXJhYmxlIGxvZwotZm9ybWF0IGZpbGUgc2hvdWxkIGJlIHVzZWQgdG8gbG9nIHVzZXIgY2xpY2stc3RyZWFtcy4gVGhpcyBpcyBwb3NzaWJsZQotYmVjYXVzZSB0aGUgbG9nZ2luZyBtb2R1bGUgbm93IGFsbG93cyA8QQotSFJFRj0iLi4vbXVsdGlsb2dzLmh0bWwiPm11bHRpcGxlIGxvZyBmaWxlczwvQT4uIFRoZSBjb29raWUgaXRzZWxmIGlzCi1sb2dnZWQgYnkgdXNpbmcgdGhlIHRleHQgPFRUPiV7Y29va2llfW4gPC9UVD4KLQotaW4gdGhlIGxvZyBmaWxlIGZvcm1hdC4gRm9yIGV4YW1wbGU6Ci08UFJFPgotQ3VzdG9tTG9nIGxvZ3MvY2xpY2tzdHJlYW0gIiV7Y29va2llfW4gJXIgJXQiCi08L1BSRT4KLQotRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgdGhlIGNvbmZpZ3VyYWJsZSBsb2cgbW9kdWxlIGltcGxlbWVudHMgdGhlCi1vbGQgPFRUPkNvb2tpZUxvZzwvVFQ+IGRpcmVjdGl2ZSwgYnV0IHRoaXMgc2hvdWxkIGJlIHVwZ3JhZGVkIHRvIHRoZQotYWJvdmUgPFRUPkN1c3RvbUxvZzwvVFQ+IGRpcmVjdGl2ZS4KLQotPEgyPkRpcmVjdGl2ZXM8L0gyPgotCi08VUw+Ci08TEk+PEEgSFJFRj0iI2Nvb2tpZWV4cGlyZXMiPkNvb2tpZUV4cGlyZXM8L0E+Ci08TEk+PEEgSFJFRj0iI2Nvb2tpZW5hbWUiPkNvb2tpZU5hbWU8L0E+Ci08TEk+PEEgSFJFRj0iI2Nvb2tpZXRyYWNraW5nIj5Db29raWVUcmFja2luZzwvQT4KLTwvVUw+Ci0KLTxIUj4KLQotPEgyPjxBIE5BTUU9ImNvb2tpZWV4cGlyZXMiPkNvb2tpZUV4cGlyZXM8L0E+PC9IMj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQ29va2llRXhwaXJlcyA8RU0+ZXhwaXJ5LXBlcmlvZDwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gb3B0aW9uYWw8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF91c2VydHJhY2s8UD4KLQotV2hlbiB1c2VkLCB0aGlzIGRpcmVjdGl2ZSBzZXRzIGFuIGV4cGlyeSB0aW1lIG9uIHRoZSBjb29raWUgZ2VuZXJhdGVkCi1ieSB0aGUgdXNlcnRyYWNrIG1vZHVsZS4gVGhlIDxFTT5leHBpcnktcGVyaW9kPC9FTT4gY2FuIGJlIGdpdmVuIGVpdGhlcgotYXMgYSBudW1iZXIgb2Ygc2Vjb25kcywgb3IgaW4gdGhlIGZvcm1hdCBzdWNoIGFzICIyIHdlZWtzIDMgZGF5cyA3Ci1ob3VycyIuICBWYWxpZCBkZW5vbWluYXRpb25zIGFyZTogeWVhcnMsIG1vbnRocywgd2Vla3MsIGhvdXJzLCBtaW51dGVzCi1hbmQgc2Vjb25kcy4gIElmIHRoZSBleHBpcnkgdGltZSBpcyBpbiBhbnkgZm9ybWF0IG90aGVyIHRoYW4gb25lCi1udW1iZXIgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIHNlY29uZHMsIGl0IG11c3QgYmUgZW5jbG9zZWQgYnkKLWRvdWJsZSBxdW90ZXMuCi0KLTxQPklmIHRoaXMgZGlyZWN0aXZlIGlzIG5vdCB1c2VkLCBjb29raWVzIGxhc3Qgb25seSBmb3IgdGhlIGN1cnJlbnQKLWJyb3dzZXIgc2Vzc2lvbi48L1A+Ci0KLTxIMj48QSBOQU1FPSJjb29raWVuYW1lIj5Db29raWVOYW1lPC9BPjwvSDI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IENvb2tpZU5hbWUgPEVNPnRva2VuPC9FTT4KLTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiA8RU0+QXBhY2hlPC9FTT4KLTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3QsIGRpcmVjdG9yeSwKLS5odGFjY2VzczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gb3B0aW9uYWw8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF91c2VydHJhY2sKLTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBBcGFjaGUgMS4zLjcgYW5kIGxhdGVyCi08UD4KLVRoaXMgZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBjb29raWUgdGhpcyBtb2R1bGUKLXVzZXMgZm9yIGl0cyB0cmFja2luZyBwdXJwb3Nlcy4gIEJ5IGRlZmF1bHQgdGhlIGNvb2tpZSBpcyBuYW1lZAotIjxDT0RFPkFwYWNoZTwvQ09ERT4iLgotPC9QPgotPFA+Ci1Zb3UgbXVzdCBzcGVjaWZ5IGEgdmFsaWQgY29va2llIG5hbWU7IHJlc3VsdHMgYXJlIHVucHJlZGljdGFibGUgaWYKLXlvdSB1c2UgYSBuYW1lIGNvbnRhaW5pbmcgdW51c3VhbCBjaGFyYWN0ZXJzLiAgVmFsaWQgY2hhcmFjdGVycwotaW5jbHVkZSBBLVosIGEteiwgMC05LCAiXyIsIGFuZCAiLSIuCi08L1A+Ci0KLTxIMj48QSBOQU1FPSJjb29raWV0cmFja2luZyI+Q29va2llVHJhY2tpbmc8L0E+PC9IMj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gQ29va2llVHJhY2tpbmcgPEVNPm9uIHwgb2ZmPC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksCi0uaHRhY2Nlc3M8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+T3ZlcnJpZGU6PC9TVFJPTkc+PC9BPiBGaWxlSW5mbzxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gb3B0aW9uYWw8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF91c2VydHJhY2s8UD4KLQotV2hlbiB0aGUgdXNlciB0cmFjayBtb2R1bGUgaXMgY29tcGlsZWQgaW4sIGFuZCAiQ29va2llVHJhY2tpbmcgb24iIGlzCi1zZXQsIEFwYWNoZSB3aWxsIHN0YXJ0IHNlbmRpbmcgYSB1c2VyLXRyYWNraW5nIGNvb2tpZSBmb3IgYWxsIG5ldwotcmVxdWVzdHMuIFRoaXMgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIHR1cm4gdGhpcyBiZWhhdmlvciBvbiBvciBvZmYKLW9uIGEgcGVyLXNlcnZlciBvciBwZXItZGlyZWN0b3J5IGJhc2lzLiAgQnkgZGVmYXVsdCwgY29tcGlsaW5nCi1tb2RfdXNlcnRyYWNrIHdpbGwgbm90IGFjdGl2YXRlIGNvb2tpZXMuCi0KLTxIUj4KLQotPEgyPjItZGlnaXQgb3IgNC1kaWdpdCBkYXRlcyBmb3IgY29va2llcz88L0gyPgotCi0odGhlIGZvbGxvd2luZyBpcyBmcm9tIG1lc3NhZ2UKLSZsdDswMjI3MDFiZGE0M2QkOWQzMmJiYjAkMTIwMWE4YzBAY2hyaXN0aWFuLm9mZmljZS5zYW5lLmNvbSZndDsgaW4KLXRoZSBuZXctaHR0cGQgYXJjaGl2ZXMpCi0KLTxQPgotCi08UFJFPgotRnJvbTogIkNocmlzdGlhbiBBbGxlbiIgJmx0O2NocmlzdGlhbkBzYW5lLmNvbSZndDsKLVN1YmplY3Q6IFJlOiBBcGFjaGUgWTJLIGJ1ZyBpbiBtb2RfdXNlcnRyYWNrLmMKLURhdGU6IFR1ZSwgMzAgSnVuIDE5OTggMTE6NDE6NTYgLTA0MDAKLQotRGlkIHNvbWUgd29yayB3aXRoIGNvb2tpZXMgYW5kIGR1ZyB1cCBzb21lIGluZm8gdGhhdCBtaWdodCBiZSB1c2VmdWwuCi0KLVRydWUsIE5ldHNjYXBlIGNsYWltcyB0aGF0IHRoZSBjb3JyZWN0IGZvcm1hdCBOT1cgaXMgZm91ciBkaWdpdCBkYXRlcywgYW5kCi1mb3VyIGRpZ2l0IGRhdGVzIGRvIGluIGZhY3Qgd29yay4uLiBmb3IgTmV0c2NhcGUgNC54IChDb21tdW5pY2F0b3IpLCB0aGF0Ci1pcy4gIEhvd2V2ZXIsIDMueCBhbmQgYmVsb3cgZG8gTk9UIGFjY2VwdCB0aGVtLiAgSXQgc2VlbXMgdGhhdCBOZXRzY2FwZQotb3JpZ2luYWxseSBoYWQgYSAyLWRpZ2l0IHN0YW5kYXJkLCBhbmQgdGhlbiB3aXRoIGFsbCBvZiB0aGUgWTJLIGh5cGUgYW5kCi1wcm9iYWJseSBhIGZldyBjb21wbGFpbnRzLCBjaGFuZ2VkIHRvIGEgZm91ciBkaWdpdCBkYXRlIGZvciBDb21tdW5pY2F0b3IuCi1Gb3J0dW5hdGVseSwgNC54IGFsc28gdW5kZXJzdGFuZHMgdGhlIDItZGlnaXQgZm9ybWF0LCBhbmQgc28gdGhlIGJlc3Qgd2F5IHRvCi1lbnN1cmUgdGhhdCB5b3VyIGV4cGlyYXRpb24gZGF0ZSBpcyBsZWdpYmxlIHRvIHRoZSBjbGllbnQncyBicm93c2VyIGlzIHRvCi11c2UgMi1kaWdpdCBkYXRlcy4KLQotSG93ZXZlciwgdGhpcyBkb2VzIG5vdCBsaW1pdCBleHBpcmF0aW9uIGRhdGVzIHRvIHRoZSB5ZWFyIDIwMDA7IGlmIHlvdSB1c2UKLWFuIGV4cGlyYXRpb24geWVhciBvZiAiMTMiLCBmb3IgZXhhbXBsZSwgaXQgaXMgaW50ZXJwcmV0ZWQgYXMgMjAxMywgTk9UCi0xOTEzISAgSW4gZmFjdCwgeW91IGNhbiB1c2UgYW4gZXhwaXJhdGlvbiB5ZWFyIG9mIHVwIHRvICIzNyIsIGFuZCBpdCB3aWxsIGJlCi11bmRlcnN0b29kIGFzICIyMDM3IiBieSBib3RoIE1TSUUgYW5kIE5ldHNjYXBlIHZlcnNpb25zIDMueCBhbmQgdXAgKG5vdCBzdXJlCi1hYm91dCB2ZXJzaW9ucyBwcmV2aW91cyB0byB0aG9zZSkuICBOb3Qgc3VyZSB3aHkgTmV0c2NhcGUgdXNlZCB0aGF0Ci1wYXJ0aWN1bGFyIHllYXIgYXMgaXRzIGN1dC1vZmYgcG9pbnQsIGJ1dCBteSBndWVzcyBpcyB0aGF0IGl0IHdhcyBpbiByZXNwZWN0Ci10byBVTklYJ3MgMjAzOCBwcm9ibGVtLiAgTmV0c2NhcGUvTVNJRSA0Lnggc2VlbSB0byBiZSBhYmxlIHRvIHVuZGVyc3RhbmQKLTItZGlnaXQgeWVhcnMgYmV5b25kIHRoYXQsIGF0IGxlYXN0IHVudGlsICI1MCIgZm9yIHN1cmUgKEkgdGhpbmsgdGhleQotdW5kZXJzdGFuZCB1cCB1bnRpbCBhYm91dCAiNzAiLCBidXQgbm90IGZvciBzdXJlKS4KLQotU3VtbWFyeTogIE1vemlsbGEgMy54IGFuZCB1cCB1bmRlcnN0YW5kcyB0d28gZGlnaXQgZGF0ZXMgdXAgdW50aWwgIjM3IgotKDIwMzcpLiAgTW96aWxsYSA0LnggdW5kZXJzdGFuZHMgdXAgdW50aWwgYXQgbGVhc3QgIjUwIiAoMjA1MCkgaW4gMi1kaWdpdAotZm9ybSwgYnV0IGFsc28gdW5kZXJzdGFuZHMgNC1kaWdpdCB5ZWFycywgd2hpY2ggY2FuIHByb2JhYmx5IHJlYWNoIHVwIHVudGlsCi05OTk5LiAgWW91ciBiZXN0IGJldCBmb3Igc2VuZGluZyBhIGxvbmctbGlmZSBjb29raWUgaXMgdG8gc2VuZCBpdCBmb3Igc29tZQotdGltZSBsYXRlIGluIHRoZSB5ZWFyICIzNyIuCi08L1BSRT4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL21vZC9tb2Rfdmhvc3RfYWxpYXMuaHRtbCBiL2RvY3MvbWFudWFsL21vZC9tb2Rfdmhvc3RfYWxpYXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkzMzFhNS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9tb2QvbW9kX3Zob3N0X2FsaWFzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgbW9kdWxlIG1vZF92aG9zdF9hbGlhczwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08RElWIEFMSUdOPSJDRU5URVIiPgotIDxJTUcgU1JDPSIuLi9pbWFnZXMvc3ViLmdpZiIgQUxUPSJbQVBBQ0hFIERPQ1VNRU5UQVRJT05dIj4KLSA8SDM+Ci0gIEFwYWNoZSBIVFRQIFNlcnZlciBWZXJzaW9uIDEuMwotIDwvSDM+Ci08L0RJVj4KLQotPEgxIEFMSUdOPSJDRU5URVIiPk1vZHVsZSBtb2Rfdmhvc3RfYWxpYXM8L0gxPgotCi08UD4KLVRoaXMgbW9kdWxlIGlzIGNvbnRhaW5lZCBpbiB0aGUgPENPREU+bW9kX3Zob3N0X2FsaWFzLmM8L0NPREU+IGZpbGUKLWFuZCBpcyBub3QgY29tcGlsZWQgaW4gYnkgZGVmYXVsdC4gSXQgcHJvdmlkZXMgc3VwcG9ydCBmb3IKLTxBIEhSRUY9Ii4uL3Zob3N0cy9tYXNzLmh0bWwiPmR5bmFtaWNhbGx5IGNvbmZpZ3VyZWQgbWFzcyB2aXJ0dWFsCi1ob3N0aW5nPC9BPi4KLTwvUD4KLQotPEgyPkRpcmVjdG9yeSBOYW1lIEludGVycG9sYXRpb248L0gyPgotCi08UD4KLUFsbCB0aGUgZGlyZWN0aXZlcyBpbiB0aGlzIG1vZHVsZSBpbnRlcnBvbGF0ZSBhIHN0cmluZyBpbnRvIGEKLXBhdGhuYW1lLiBUaGUgaW50ZXJwb2xhdGVkIHN0cmluZyAoaGVuY2Vmb3J0aCBjYWxsZWQgdGhlICJuYW1lIikgbWF5Ci1iZSBlaXRoZXIgdGhlIHNlcnZlciBuYW1lIChzZWUgdGhlCi08QSBIUkVGPSJjb3JlLmh0bWwjdXNlY2Fub25pY2FsbmFtZSI+PENPREU+VXNlQ2Fub25pY2FsTmFtZTwvQ09ERT48L0E+Ci1kaXJlY3RpdmUgZm9yIGRldGFpbHMgb24gaG93IHRoaXMgaXMgZGV0ZXJtaW5lZCkgb3IgdGhlIElQIGFkZHJlc3Mgb2YKLXRoZSB2aXJ0dWFsIGhvc3Qgb24gdGhlIHNlcnZlciBpbiBkb3R0ZWQtcXVhZCBmb3JtYXQuIFRoZQotaW50ZXJwb2xhdGlvbiBpcyBjb250cm9sbGVkIGJ5IHNwZWNpZmllcnMgaW5zcGlyZWQgYnkKLTxDT0RFPnByaW50ZjwvQ09ERT4gd2hpY2ggaGF2ZSBhIG51bWJlciBvZiBmb3JtYXRzOgotPERMPgotICA8RFQ+PENPREU+JSU8L0NPREU+Ci0gICAgPEREPmluc2VydCBhIDxDT0RFPiU8L0NPREU+Ci0gIDxEVD48Q09ERT4lcDwvQ09ERT4KLSAgICA8REQ+aW5zZXJ0IHRoZSBwb3J0IG51bWJlciBvZiB0aGUgdmlydHVhbCBob3N0Ci0gIDxEVD48Q09ERT4lTi5NPC9DT0RFPgotICAgIDxERD5pbnNlcnQgKHBhcnQgb2YpIHRoZSBuYW1lCi08L0RMPgotPC9QPgotCi08UD4KLTxDT0RFPk48L0NPREU+IGFuZCA8Q09ERT5NPC9DT0RFPiBhcmUgdXNlZCB0byBzcGVjaWZ5IHN1YnN0cmluZ3Mgb2YKLXRoZSBuYW1lLiA8Q09ERT5OPC9DT0RFPiBzZWxlY3RzIGZyb20gdGhlIGRvdC1zZXBhcmF0ZWQgY29tcG9uZW50cyBvZgotdGhlIG5hbWUsIGFuZCA8Q09ERT5NPC9DT0RFPiBzZWxlY3RzIGNoYXJhY3RlcnMgd2l0aGluIHdoYXRldmVyCi08Q09ERT5OPC9DT0RFPiBoYXMgc2VsZWN0ZWQuIDxDT0RFPk08L0NPREU+IGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cwotdG8gemVybyBpZiBpdCBpc24ndCBwcmVzZW50OyB0aGUgZG90IG11c3QgYmUgcHJlc2VudCBpZiBhbmQgb25seSBpZgotPENPREU+TTwvQ09ERT4gaXMgcHJlc2VudC4gVGhlIGludGVycHJldGF0aW9uIGlzIGFzIGZvbGxvd3M6Ci08REw+Ci0gIDxEVD48Q09ERT4wPC9DT0RFPgotICAgIDxERD50aGUgd2hvbGUgbmFtZQotICA8RFQ+PENPREU+MTwvQ09ERT4KLSAgICA8REQ+dGhlIGZpcnN0IHBhcnQKLSAgPERUPjxDT0RFPjI8L0NPREU+Ci0gICAgPEREPnRoZSBzZWNvbmQgcGFydAotICA8RFQ+PENPREU+LTE8L0NPREU+Ci0gICAgPEREPnRoZSBsYXN0IHBhcnQKLSAgPERUPjxDT0RFPi0yPC9DT0RFPgotICAgIDxERD50aGUgcGVudWx0aW1hdGUgcGFydAotICA8RFQ+PENPREU+Mis8L0NPREU+Ci0gICAgPEREPnRoZSBzZWNvbmQgYW5kIGFsbCBzdWJzZXF1ZW50IHBhcnRzCi0gIDxEVD48Q09ERT4tMis8L0NPREU+Ci0gICAgPEREPnRoZSBwZW51bHRpbWF0ZSBhbmQgYWxsIHByZWNlZGluZyBwYXJ0cwotICA8RFQ+PENPREU+MSs8L0NPREU+IGFuZCA8Q09ERT4tMSs8L0NPREU+Ci0gICAgPEREPnRoZSBzYW1lIGFzIDxDT0RFPjA8L0NPREU+Ci08L0RMPgotSWYgPENPREU+TjwvQ09ERT4gb3IgPENPREU+TTwvQ09ERT4gaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YKLXBhcnRzIGF2YWlsYWJsZSBhIHNpbmdsZSB1bmRlcnNjb3JlIGlzIGludGVycG9sYXRlZC4KLTwvUD4KLQotPEgzPkV4YW1wbGVzPC9IMz4KLQotPFA+Ci1Gb3Igc2ltcGxlIG5hbWUtYmFzZWQgdmlydHVhbCBob3N0cyB5b3UgbWlnaHQgdXNlIHRoZSBmb2xsb3dpbmcKLWRpcmVjdGl2ZXMgaW4geW91ciBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlOgotPFBSRT4KLQlVc2VDYW5vbmljYWxOYW1lCU9mZgotCVZpcnR1YWxEb2N1bWVudFJvb3QJL3Vzci9sb2NhbC9hcGFjaGUvdmhvc3RzLyUwCi08L1BSRT4KLUEgcmVxdWVzdCBmb3IgPENPREU+aHR0cDovL3d3dy5leGFtcGxlLmNvbS9kaXJlY3RvcnkvZmlsZS5odG1sPC9DT0RFPgotd2lsbCBiZSBzYXRpc2ZpZWQgYnkgdGhlIGZpbGUKLTxDT0RFPi91c3IvbG9jYWwvYXBhY2hlL3Zob3N0cy93d3cuZXhhbXBsZS5jb20vZGlyZWN0b3J5L2ZpbGUuaHRtbDwvQ09ERT4uCi08L1A+Ci0KLTxQPgotRm9yIGEgdmVyeSBsYXJnZSBudW1iZXIgb2YgdmlydHVhbCBob3N0cyBpdCBpcyBhIGdvb2QgaWRlYSB0byBhcnJhbmdlCi10aGUgZmlsZXMgdG8gcmVkdWNlIHRoZSBzaXplIG9mIHRoZSA8Q09ERT52aG9zdHM8L0NPREU+IGRpcmVjdG9yeS4gVG8KLWRvIHRoaXMgeW91IG1pZ2h0IHVzZSB0aGUgZm9sbG93aW5nIGluIHlvdXIgY29uZmlndXJhdGlvbiBmaWxlOgotPFBSRT4KLQlVc2VDYW5vbmljYWxOYW1lCU9mZgotCVZpcnR1YWxEb2N1bWVudFJvb3QJL3Vzci9sb2NhbC9hcGFjaGUvdmhvc3RzLyUzKy8lMi4xLyUyLjIvJTIuMy8lMgotPC9QUkU+Ci1BIHJlcXVlc3QgZm9yIDxDT0RFPmh0dHA6Ly93d3cuZXhhbXBsZS5pc3AuY29tL2RpcmVjdG9yeS9maWxlLmh0bWw8L0NPREU+Ci13aWxsIGJlIHNhdGlzZmllZCBieSB0aGUgZmlsZQotPENPREU+L3Vzci9sb2NhbC9hcGFjaGUvaXNwLmNvbS9lL3gvYS9leGFtcGxlL2RpcmVjdG9yeS9maWxlLmh0bWw8L0NPREU+LgotQSBtb3JlIGV2ZW4gc3ByZWFkIG9mIGZpbGVzIGNhbiBiZSBhY2hpZXZlZCBieSBoYXNoaW5nIGZyb20gdGhlIGVuZCBvZgotdGhlIG5hbWUsIGZvciBleGFtcGxlOgotPFBSRT4KLQlWaXJ0dWFsRG9jdW1lbnRSb290CS91c3IvbG9jYWwvYXBhY2hlL3Zob3N0cy8lMysvJTIuLTEvJTIuLTIvJTIuLTMvJTIKLTwvUFJFPgotVGhlIGV4YW1wbGUgcmVxdWVzdCB3b3VsZCBjb21lIGZyb20KLTxDT0RFPi91c3IvbG9jYWwvYXBhY2hlL3Zob3N0cy9pc3AuY29tL2UvbC9wL2V4YW1wbGUvZGlyZWN0b3J5L2ZpbGUuaHRtbDwvQ09ERT4uCi1BbHRlcm5hdGl2ZWx5IHlvdSBtaWdodCB1c2U6Ci08UFJFPgotCVZpcnR1YWxEb2N1bWVudFJvb3QJL3Vzci9sb2NhbC9hcGFjaGUvdmhvc3RzLyUzKy8lMi4xLyUyLjIvJTIuMy8lMi40KwotPC9QUkU+Ci1UaGUgZXhhbXBsZSByZXF1ZXN0IHdvdWxkIGNvbWUgZnJvbQotPENPREU+L3Vzci9sb2NhbC9hcGFjaGUvdmhvc3RzL2lzcC5jb20vZS94L2EvbXBsZS9kaXJlY3RvcnkvZmlsZS5odG1sPC9DT0RFPi4KLTwvUD4KLQotPFA+Ci1Gb3IgSVAtYmFzZWQgdmlydHVhbCBob3N0aW5nIHlvdSBtaWdodCB1c2UgdGhlIGZvbGxvd2luZyBpbiB5b3VyCi1jb25maWd1cmF0aW9uIGZpbGU6Ci08UFJFPgotCVVzZUNhbm9uaWNhbE5hbWUgRE5TCi0JVmlydHVhbERvY3VtZW50Um9vdElQCS91c3IvbG9jYWwvYXBhY2hlL3Zob3N0LyUxLyUyLyUzLyU0L2RvY3MKLQlWaXJ0dWFsU2NyaXB0QWxpYXNJUAkvdXNyL2xvY2FsL2FwYWNoZS92aG9zdC8lMS8lMi8lMy8lNC9jZ2ktYmluCi08L1BSRT4KLUEgcmVxdWVzdCBmb3IgPENPREU+aHR0cDovL3d3dy5leGFtcGxlLmlzcC5jb20vZGlyZWN0b3J5L2ZpbGUuaHRtbDwvQ09ERT4KLXdvdWxkIGJlIHNhdGlzZmllZCBieSB0aGUgZmlsZQotPENPREU+L3Vzci9sb2NhbC9hcGFjaGUvMTAvMjAvMzAvNDAvZG9jcy9kaXJlY3RvcnkvZmlsZS5odG1sPC9DT0RFPiBpZgotdGhlIElQIGFkZHJlc3Mgb2YgPENPREU+d3d3LmV4YW1wbGUuY29tPC9DT0RFPiB3ZXJlIDEwLjIwLjMwLjQwLgotQSByZXF1ZXN0IGZvciA8Q09ERT5odHRwOi8vd3d3LmV4YW1wbGUuaXNwLmNvbS9jZ2ktYmluL3NjcmlwdC5wbDwvQ09ERT4KLXdvdWxkIGJlIHNhdGlzZmllZCBieSBleGVjdXRpbmcgdGhlIHByb2dyYW0KLTxDT0RFPi91c3IvbG9jYWwvYXBhY2hlLzEwLzIwLzMwLzQwL2NnaS1iaW4vc2NyaXB0LnBsPC9DT0RFPi4KLTwvUD4KLQotPFA+Ci1UaGUgPEEgSFJFRj0ibW9kX2xvZ19jb25maWcuaHRtbCNmb3JtYXRzIj5Mb2dGb3JtYXQgZGlyZWN0aXZlczwvQT4KLTxDT0RFPiVWPC9DT0RFPiBhbmQgPENPREU+JUE8L0NPREU+IGFyZSB1c2VmdWwgaW4gY29uanVuY3Rpb24gd2l0aAotdGhpcyBtb2R1bGUuCi08L1A+Ci0KLTxIUj4KLQotPEgyPkRpcmVjdGl2ZXM8L0gyPgotPFVMPgotICA8TEk+PEEgSFJFRj0iI3ZpcnR1YWxkb2N1bWVudHJvb3QiPlZpcnR1YWxEb2N1bWVudFJvb3Q8L0E+Ci0gIDxMST48QSBIUkVGPSIjdmlydHVhbGRvY3VtZW50cm9vdGlwIj5WaXJ0dWFsRG9jdW1lbnRSb290SVA8L0E+Ci0gIDxMST48QSBIUkVGPSIjdmlydHVhbHNjcmlwdGFsaWFzIj5WaXJ0dWFsU2NyaXB0QWxpYXM8L0E+Ci0gIDxMST48QSBIUkVGPSIjdmlydHVhbHNjcmlwdGFsaWFzaXAiPlZpcnR1YWxTY3JpcHRBbGlhc0lQPC9BPgotPC9VTD4KLTxIUj4KLQotPEgyPjxBIE5BTUU9InZpcnR1YWxkb2N1bWVudHJvb3QiPlZpcnR1YWxEb2N1bWVudFJvb3QgZGlyZWN0aXZlPC9BPjwvSDI+Ci08UD4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3ludGF4OjwvU1RST05HPjwvQT4gVmlydHVhbERvY3VtZW50Um9vdCA8RU0+aW50ZXJwb2xhdGVkLWRpcmVjdG9yeTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IE5vbmU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBFeHRlbnNpb248QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF92aG9zdF9hbGlhczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBWaXJ0dWFsRG9jdW1lbnRSb290IGlzIG9ubHkgYXZhaWxhYmxlIGluIDEuMy43IGFuZCBsYXRlci48L1A+Ci08UD4KLVRoZSA8Q09ERT5WaXJ0dWFsRG9jdW1lbnRSb290PC9DT0RFPiBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBkZXRlcm1pbmUKLXdoZXJlIEFwYWNoZSB3aWxsIGZpbmQgeW91ciBkb2N1bWVudHMgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBzZXJ2ZXIKLW5hbWUuIFRoZSByZXN1bHQgb2YgZXhwYW5kaW5nIDxFTT5pbnRlcnBvbGF0ZWQtZGlyZWN0b3J5PC9FTT4gaXMgdXNlZAotYXMgdGhlIHJvb3Qgb2YgdGhlIGRvY3VtZW50IHRyZWUgaW4gYSBzaW1pbGFyIG1hbm5lciB0byB0aGUKLTxBIEhSRUY9ImNvcmUuaHRtbCNkb2N1bWVudHJvb3QiPjxDT0RFPkRvY3VtZW50Um9vdDwvQ09ERT48L0E+Ci1kaXJlY3RpdmUncyBhcmd1bWVudC4gSWYgPEVNPmludGVycG9sYXRlZC1kaXJlY3Rvcnk8L0VNPiBpcwotPENPREU+bm9uZTwvQ09ERT4gdGhlbiA8Q09ERT5WaXJ0YXVsRG9jdW1lbnRSb290PC9DT0RFPiBpcyB0dXJuZWQgb2ZmLgotVGhpcyBkaXJlY3RpdmUgY2Fubm90IGJlIHVzZWQgaW4gdGhlIHNhbWUgY29udGV4dCBhcwotPEEgSFJFRj0iI3ZpcnR1YWxkb2N1bWVudHJvb3RpcCI+PENPREU+VmlydHVhbERvY3VtZW50Um9vdElQPC9DT0RFPjwvQT4uCi08L1A+Ci08SFI+Ci0KLTxIMj48QSBOQU1FPSJ2aXJ0dWFsZG9jdW1lbnRyb290aXAiPlZpcnR1YWxEb2N1bWVudFJvb3RJUCBkaXJlY3RpdmU8L0E+PC9IMj4KLTxQPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TeW50YXg6PC9TVFJPTkc+PC9BPiBWaXJ0dWFsRG9jdW1lbnRSb290SVAgPEVNPmludGVycG9sYXRlZC1kaXJlY3Rvcnk8L0VNPjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkRlZmF1bHQ6PC9TVFJPTkc+PC9BPiBOb25lPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29udGV4dDo8L1NUUk9ORz48L0E+IHNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+U3RhdHVzOjwvU1RST05HPjwvQT4gRXh0ZW5zaW9uPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Nb2R1bGU6PC9TVFJPTkc+PC9BPiBtb2Rfdmhvc3RfYWxpYXM8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29tcGF0aWJpbGl0eSIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db21wYXRpYmlsaXR5OjwvU1RST05HPjwvQT4gVmlydHVhbERvY3VtZW50Um9vdElQIGlzIG9ubHkgYXZhaWxhYmxlIGluIDEuMy43IGFuZCBsYXRlci48L1A+Ci08UD4KLVRoZSA8Q09ERT5WaXJ0dWFsRG9jdW1lbnRSb290SVA8L0NPREU+IGRpcmVjdGl2ZSBpcyBsaWtlIHRoZQotPEEgSFJFRj0iI3ZpcnR1YWxkb2N1bWVudHJvb3QiPjxDT0RFPlZpcnR1YWxEb2N1bWVudFJvb3Q8L0NPREU+PC9BPiBkaXJlY3RpdmUsCi1leGNlcHQgdGhhdCBpdCB1c2VzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXIgZW5kIG9mIHRoZSBjb25uZWN0aW9uCi1pbnN0ZWFkIG9mIHRoZSBzZXJ2ZXIgbmFtZS4KLTwvUD4KLTxIUj4KLQotPEgyPjxBIE5BTUU9InZpcnR1YWxzY3JpcHRhbGlhcyI+VmlydHVhbFNjcmlwdEFsaWFzIGRpcmVjdGl2ZTwvQT48L0gyPgotPFA+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFZpcnR1YWxTY3JpcHRBbGlhcyA8RU0+aW50ZXJwb2xhdGVkLWRpcmVjdG9yeTwvRU0+PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+RGVmYXVsdDo8L1NUUk9ORz48L0E+IE5vbmU8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5Db250ZXh0OjwvU1RST05HPjwvQT4gc2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0PEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5TdGF0dXM6PC9TVFJPTkc+PC9BPiBFeHRlbnNpb248QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIgotIFJFTD0iSGVscCIKLT48U1RST05HPk1vZHVsZTo8L1NUUk9ORz48L0E+IG1vZF92aG9zdF9hbGlhczxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb21wYXRpYmlsaXR5IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbXBhdGliaWxpdHk6PC9TVFJPTkc+PC9BPiBWaXJ0dWFsU2NyaXB0QWxpYXMgaXMgb25seSBhdmFpbGFibGUgaW4gMS4zLjcgYW5kIGxhdGVyLjwvUD4KLTxQPgotVGhlIDxDT0RFPlZpcnR1YWxTY3JpcHRBbGlhczwvQ09ERT4gZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gZGV0ZXJtaW5lCi13aGVyZSBBcGFjaGUgd2lsbCBmaW5kIENHSSBzY3JpcHRzIGluIGEgc2ltaWxhciBtYW5uZXIgdG8KLTxBIEhSRUY9IiN2aXJ0dWFsZG9jdW1lbnRyb290Ij48Q09ERT5WaXJ0dWFsRG9jdW1lbnRSb290PC9DT0RFPjwvQT4KLWRvZXMgZm9yIG90aGVyIGRvY3VtZW50cy4gSXQgbWF0Y2hlcyByZXF1ZXN0cyBmb3IgVVJJcyBzdGFydGluZwotPENPREU+L2NnaS1iaW4vPC9DT0RFPiwgbXVjaCBsaWtlCi08Q09ERT48QSBIUkVGPSJtb2RfYWxpYXMuaHRtbCNzY3JpcHRhbGlhcyI+U2NyaXB0QWxpYXM8L0E+IC9jZ2ktYmluLzwvQ09ERT4KLXdvdWxkLgotPC9QPgotPEhSPgotCi08SDI+PEEgTkFNRT0idmlydHVhbHNjcmlwdGFsaWFzaXAiPlZpcnR1YWxTY3JpcHRBbGlhc0lQIGRpcmVjdGl2ZTwvQT48L0gyPgotPFA+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4IgotIFJFTD0iSGVscCIKLT48U1RST05HPlN5bnRheDo8L1NUUk9ORz48L0E+IFZpcnR1YWxTY3JpcHRBbGlhc0lQIDxFTT5pbnRlcnBvbGF0ZWQtZGlyZWN0b3J5PC9FTT48QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVmYXVsdCIKLSBSRUw9IkhlbHAiCi0+PFNUUk9ORz5EZWZhdWx0OjwvU1RST05HPjwvQT4gTm9uZTxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNDb250ZXh0IgotIFJFTD0iSGVscCIKLT48U1RST05HPkNvbnRleHQ6PC9TVFJPTkc+PC9BPiBzZXJ2ZXIgY29uZmlnLCB2aXJ0dWFsIGhvc3Q8QlI+Ci08QQotIEhSRUY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIgotIFJFTD0iSGVscCIKLT48U1RST05HPlN0YXR1czo8L1NUUk9ORz48L0E+IEV4dGVuc2lvbjxCUj4KLTxBCi0gSFJFRj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+TW9kdWxlOjwvU1RST05HPjwvQT4gbW9kX3Zob3N0X2FsaWFzPEJSPgotPEEKLSBIUkVGPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbXBhdGliaWxpdHkiCi0gUkVMPSJIZWxwIgotPjxTVFJPTkc+Q29tcGF0aWJpbGl0eTo8L1NUUk9ORz48L0E+IFZpcnR1YWxTY3JpcHRBbGlhc0lQIGlzIG9ubHkgYXZhaWxhYmxlIGluIDEuMy43IGFuZCBsYXRlci48L1A+Ci08UD4KLVRoZSA8Q09ERT5WaXJ0dWFsU2NyaXB0QWxpYXNJUDwvQ09ERT4gZGlyZWN0aXZlIGlzIGxpa2UgdGhlCi08QSBIUkVGPSIjdmlydHVhbHNjcmlwdGFsaWFzIj48Q09ERT5WaXJ0dWFsU2NyaXB0QWxpYXM8L0NPREU+PC9BPiBkaXJlY3RpdmUsCi1leGNlcHQgdGhhdCBpdCB1c2VzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXIgZW5kIG9mIHRoZSBjb25uZWN0aW9uCi1pbnN0ZWFkIG9mIHRoZSBzZXJ2ZXIgbmFtZS4KLTwvUD4KLTxIUj4KLQotPEgzIEFMSUdOPSJDRU5URVIiPgotIEFwYWNoZSBIVFRQIFNlcnZlciBWZXJzaW9uIDEuMwotPC9IMz4KLQotPEEgSFJFRj0iLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvaW5kZXguZ2lmIiBBTFQ9IkluZGV4Ij48L0E+Ci08QSBIUkVGPSIuLi8iPjxJTUcgU1JDPSIuLi9pbWFnZXMvaG9tZS5naWYiIEFMVD0iSG9tZSI+PC9BPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tcG0uaHRtbCBiL2RvY3MvbWFudWFsL21wbS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTIxNzUxLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21wbS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BdmFpbGFibGUgTVBNJ3MgZm9yIEFwYWNoZSAyLjA8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPGgxIGFsaWduPSJjZW50ZXIiPkFwYWNoZSAyLjAgLSBBdmFpbGFibGUgTVBNJ3M8L2gxPgotPHAgYWxpZ249ImNlbnRlciI+PGVtPkRhdGVkIDE1PHN1cD50aDwvc3VwPiBKYW51YXJ5IDIwMDA8L2VtPjwvcD4KLTxwPkFwYWNoZSAyLjAgaGFzIGEgbmV3IGFyY2hpdGVjdHVyZSB0aGF0IG1vdmVzIHRoZSBwcm9jZXNzaW5nIG9mIHJlcXVlc3RzIGZyb20gdGhlIGNvZGUgc2VydmVyIGludG8gYSBNdWx0aVByb2Nlc3NpbmcgTW9kdWxlIChNUE0pLiAgQnkgc2VsZWN0aW5nIHRoZSBNUE0gdG8gdXNlIHlvdSBjYW4gYWx0ZXIgdGhlIHdheSB0aGUgc2VydmVyIGJlaGF2ZXMuICBBZGRpdGlvbmFsbHkgdGhlIGludHJvZHVjdGlvbiBvZiB0aGUgTVBNJ3MgaGFzIGxlZCB0byBwbGF0Zm9ybXMgZGV2ZWxvcGluZyB0aGVpciBvd24gb3B0aW1pc2VkIG1vZHVsZXMuICBPbiBzb21lIHBsYXRmb3JtcyB0aGVyZSBpcyBubyBjaG9pY2UsIHdoaWxzdCBvbiBvdGhlcnMgdGhlcmUgYXJlIGRpZmZlcmVudCBvcHRpb25zLCBlYWNoIHdpdGggZGlmZmVyaW5nIHByb2Nlc3NpbmcgbW9kZWxzLiAgVGhpcyBsaXN0IGFpbXMgdG8gaGVscCB5b3Ugc2VsZWN0IGEgc3VpdGFibGUgTVBNIGZvciB5b3VyIHN5c3RlbS48L3A+Ci08aHI+Ci08aDM+UGxhdGZvcm1zPC9oMz4KLTx1bD4KLTxsaT48QSBocmVmPSIjdW5peCI+VW5peDwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiN3aW5kb3dzIj5XaW5kb3dzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI29zMiI+T1MvMjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNiZW9zIj5CZU9TPC9hPjwvbGk+Ci08L3VsPgotPGEgbmFtZT0idW5peCI+PGgzPlVuaXg8L2gzPgotPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPgotPHRyPgotPHRoIHdpZHRoPSIyMCUiPk1QTTwvdGg+Ci08dGggd2lkdGg9IjYwJSI+RGVzY3JpcHRpb248L3RoPgotPHRoIHdpZHRoPSIyMCUiPk1haW50YWluZXI8L3RoPgotPC90cj4KLTx0cj4KLTx0ZD5wcmVmb3JrPC90ZD4KLTx0ZD5UaGUgcHJlZm9yayBNUE0gcmVwcm9kdWNlcyB0aGUgYmVoYXZpb3VyIG9mIEFwYWNoZSAxLjMuPC90ZD4KLTx0ZD4/PzwvdGQ+Ci08L3RyPgotPHRyPgotPHRkPm1wbXRfcHRocmVhZDwvdGQ+Ci08dGQ+VGhpcyBNUE0gdXNlcyBhIG11bHRpLXByb2Nlc3MsIG11bHRpLXRocmVhZGVkIG1vZGVsIHRvIHByb3ZpZGUgZ29vZCBzY2FiaWxpdHkgYW5kIHN0YWJpbGl0eS48L3RkPgotPHRkPk1hbm9qPzwvdGQ+Ci08L3RyPgotPHRyPgotPHRkPmRleHRlcjwvdGQ+Ci08dGQ+VGhpcyBpcyBNYW5vaidzIHBsYXl0aGluZy4gIEl0IGhhcyBhIG51bWJlciBvZiBoeWJyaWQgZmVhdHVyZXMgdGhhdCBNYW5vaiBoYXMgYmVlbiBsb29raW5nIGF0IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuPC90ZD4KLTx0ZD48YSBocmVmPSJtYWlsdG86bWFub2prQGlvLmNvbSI+TWFub2o8L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotCi08YSBuYW1lPSJ3aW5kb3dzIj48aDM+V2luZG93czwvaDM+Ci08dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+Ci08dHI+Ci08dGggd2lkdGg9IjIwJSI+TVBNPC90aD4KLTx0aCB3aWR0aD0iNjAlIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggd2lkdGg9IjIwJSI+TWFpbnRhaW5lcjwvdGg+Ci08L3RyPgotPHRyPgotPHRkPndpbm50PC90ZD4KLTx0ZD5UaGUgV2luZG93cyBNUE0uICBUaGlzIGlzIG1haW5seSBhaW1lZCBhdCBXaW5kb3dzIE5ULjwvdGQ+Ci08dGQ+PGEgaHJlZj0ibWFpbHRvOnN0b2RkYXJkQHJhbGVpZ2guaWJtLmNvbSI+QmlsbCBTdG9kZGFyZDwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci0KLTxhIG5hbWU9Im9zMiI+PGgzPk9TLzI8L2gzPgotPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPgotPHRyPgotPHRoIHdpZHRoPSIyMCUiPk1QTTwvdGg+Ci08dGggd2lkdGg9IjYwJSI+RGVzY3JpcHRpb248L3RoPgotPHRoIHdpZHRoPSIyMCUiPk1haW50YWluZXI8L3RoPgotPC90cj4KLTx0cj4KLTx0ZD5zcG10X29zMjwvdGQ+Ci08dGQ+U2luZ2xlIHByb2Nlc3MsIG11bHRpcGxlIHRocmVhZCBNUE0gZm9yIE9TMi48L3RkPgotPHRkPjxhIGhyZWY9Im1haWx0bzpicmlhbmhAa2hlbGRhci5hcGFuYS5vcmcuYXUiPkJyaWFuIEhhdmFyZDwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci0KLTxhIG5hbWU9ImJlb3MiPjxoMz5CZU9TPC9oMz4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj4KLTx0cj4KLTx0aCB3aWR0aD0iMjAlIj5NUE08L3RoPgotPHRoIHdpZHRoPSI2MCUiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCB3aWR0aD0iMjAlIj5NYWludGFpbmVyPC90aD4KLTwvdHI+Ci08dHI+Ci08dGQ+bXBtdF9iZW9zPC90ZD4KLTx0ZD5NdWx0aS10aHJlYWRlZCBNUE0gZm9yIEJlT1MuICBUaGlzIGZvbGxvd3MgdGhlIG1wbXRfcHRocmVhZCBtb2RlbC48L3RkPgotPHRkPjxhIGhyZWY9Im1haWx0bzpkcmVpZEBqZXRuZXQuY28udWsiPkRhdmlkIFJlaWQ8L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotCi08aHI+Ci08ST5EYXZpZCBSZWlkLCAxNTxzdXA+dGg8L3N1cD4gSmFudWFyeSAyMDAwPC9JPgotPC9ib2R5PgotPC9odG1sPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9tcG0uaHRtbC5lbiBiL2RvY3MvbWFudWFsL21wbS5odG1sLmVuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTIxNzUxLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL21wbS5odG1sLmVuCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BdmFpbGFibGUgTVBNJ3MgZm9yIEFwYWNoZSAyLjA8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPGgxIGFsaWduPSJjZW50ZXIiPkFwYWNoZSAyLjAgLSBBdmFpbGFibGUgTVBNJ3M8L2gxPgotPHAgYWxpZ249ImNlbnRlciI+PGVtPkRhdGVkIDE1PHN1cD50aDwvc3VwPiBKYW51YXJ5IDIwMDA8L2VtPjwvcD4KLTxwPkFwYWNoZSAyLjAgaGFzIGEgbmV3IGFyY2hpdGVjdHVyZSB0aGF0IG1vdmVzIHRoZSBwcm9jZXNzaW5nIG9mIHJlcXVlc3RzIGZyb20gdGhlIGNvZGUgc2VydmVyIGludG8gYSBNdWx0aVByb2Nlc3NpbmcgTW9kdWxlIChNUE0pLiAgQnkgc2VsZWN0aW5nIHRoZSBNUE0gdG8gdXNlIHlvdSBjYW4gYWx0ZXIgdGhlIHdheSB0aGUgc2VydmVyIGJlaGF2ZXMuICBBZGRpdGlvbmFsbHkgdGhlIGludHJvZHVjdGlvbiBvZiB0aGUgTVBNJ3MgaGFzIGxlZCB0byBwbGF0Zm9ybXMgZGV2ZWxvcGluZyB0aGVpciBvd24gb3B0aW1pc2VkIG1vZHVsZXMuICBPbiBzb21lIHBsYXRmb3JtcyB0aGVyZSBpcyBubyBjaG9pY2UsIHdoaWxzdCBvbiBvdGhlcnMgdGhlcmUgYXJlIGRpZmZlcmVudCBvcHRpb25zLCBlYWNoIHdpdGggZGlmZmVyaW5nIHByb2Nlc3NpbmcgbW9kZWxzLiAgVGhpcyBsaXN0IGFpbXMgdG8gaGVscCB5b3Ugc2VsZWN0IGEgc3VpdGFibGUgTVBNIGZvciB5b3VyIHN5c3RlbS48L3A+Ci08aHI+Ci08aDM+UGxhdGZvcm1zPC9oMz4KLTx1bD4KLTxsaT48QSBocmVmPSIjdW5peCI+VW5peDwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiN3aW5kb3dzIj5XaW5kb3dzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI29zMiI+T1MvMjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNiZW9zIj5CZU9TPC9hPjwvbGk+Ci08L3VsPgotPGEgbmFtZT0idW5peCI+PGgzPlVuaXg8L2gzPgotPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPgotPHRyPgotPHRoIHdpZHRoPSIyMCUiPk1QTTwvdGg+Ci08dGggd2lkdGg9IjYwJSI+RGVzY3JpcHRpb248L3RoPgotPHRoIHdpZHRoPSIyMCUiPk1haW50YWluZXI8L3RoPgotPC90cj4KLTx0cj4KLTx0ZD5wcmVmb3JrPC90ZD4KLTx0ZD5UaGUgcHJlZm9yayBNUE0gcmVwcm9kdWNlcyB0aGUgYmVoYXZpb3VyIG9mIEFwYWNoZSAxLjMuPC90ZD4KLTx0ZD4/PzwvdGQ+Ci08L3RyPgotPHRyPgotPHRkPm1wbXRfcHRocmVhZDwvdGQ+Ci08dGQ+VGhpcyBNUE0gdXNlcyBhIG11bHRpLXByb2Nlc3MsIG11bHRpLXRocmVhZGVkIG1vZGVsIHRvIHByb3ZpZGUgZ29vZCBzY2FiaWxpdHkgYW5kIHN0YWJpbGl0eS48L3RkPgotPHRkPk1hbm9qPzwvdGQ+Ci08L3RyPgotPHRyPgotPHRkPmRleHRlcjwvdGQ+Ci08dGQ+VGhpcyBpcyBNYW5vaidzIHBsYXl0aGluZy4gIEl0IGhhcyBhIG51bWJlciBvZiBoeWJyaWQgZmVhdHVyZXMgdGhhdCBNYW5vaiBoYXMgYmVlbiBsb29raW5nIGF0IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuPC90ZD4KLTx0ZD48YSBocmVmPSJtYWlsdG86bWFub2prQGlvLmNvbSI+TWFub2o8L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotCi08YSBuYW1lPSJ3aW5kb3dzIj48aDM+V2luZG93czwvaDM+Ci08dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSI+Ci08dHI+Ci08dGggd2lkdGg9IjIwJSI+TVBNPC90aD4KLTx0aCB3aWR0aD0iNjAlIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggd2lkdGg9IjIwJSI+TWFpbnRhaW5lcjwvdGg+Ci08L3RyPgotPHRyPgotPHRkPndpbm50PC90ZD4KLTx0ZD5UaGUgV2luZG93cyBNUE0uICBUaGlzIGlzIG1haW5seSBhaW1lZCBhdCBXaW5kb3dzIE5ULjwvdGQ+Ci08dGQ+PGEgaHJlZj0ibWFpbHRvOnN0b2RkYXJkQHJhbGVpZ2guaWJtLmNvbSI+QmlsbCBTdG9kZGFyZDwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci0KLTxhIG5hbWU9Im9zMiI+PGgzPk9TLzI8L2gzPgotPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiPgotPHRyPgotPHRoIHdpZHRoPSIyMCUiPk1QTTwvdGg+Ci08dGggd2lkdGg9IjYwJSI+RGVzY3JpcHRpb248L3RoPgotPHRoIHdpZHRoPSIyMCUiPk1haW50YWluZXI8L3RoPgotPC90cj4KLTx0cj4KLTx0ZD5zcG10X29zMjwvdGQ+Ci08dGQ+U2luZ2xlIHByb2Nlc3MsIG11bHRpcGxlIHRocmVhZCBNUE0gZm9yIE9TMi48L3RkPgotPHRkPjxhIGhyZWY9Im1haWx0bzpicmlhbmhAa2hlbGRhci5hcGFuYS5vcmcuYXUiPkJyaWFuIEhhdmFyZDwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci0KLTxhIG5hbWU9ImJlb3MiPjxoMz5CZU9TPC9oMz4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIj4KLTx0cj4KLTx0aCB3aWR0aD0iMjAlIj5NUE08L3RoPgotPHRoIHdpZHRoPSI2MCUiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCB3aWR0aD0iMjAlIj5NYWludGFpbmVyPC90aD4KLTwvdHI+Ci08dHI+Ci08dGQ+bXBtdF9iZW9zPC90ZD4KLTx0ZD5NdWx0aS10aHJlYWRlZCBNUE0gZm9yIEJlT1MuICBUaGlzIGZvbGxvd3MgdGhlIG1wbXRfcHRocmVhZCBtb2RlbC48L3RkPgotPHRkPjxhIGhyZWY9Im1haWx0bzpkcmVpZEBqZXRuZXQuY28udWsiPkRhdmlkIFJlaWQ8L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotCi08aHI+Ci08ST5EYXZpZCBSZWlkLCAxNTxzdXA+dGg8L3N1cD4gSmFudWFyeSAyMDAwPC9JPgotPC9ib2R5PgotPC9odG1sPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9uZXdfZmVhdHVyZXNfMl8wLmh0bWwgYi9kb2NzL21hbnVhbC9uZXdfZmVhdHVyZXNfMl8wLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNDFjYzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbmV3X2ZlYXR1cmVzXzJfMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+PEhFQUQ+Ci08VElUTEU+TmV3IGZlYXR1cmVzIHdpdGggQXBhY2hlIDIuMDwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFRFWFQ9IiMwMDAwMDAiIExJTks9IiMwMDAwRkYiIAotICAgICAgVkxJTks9IiMwMDAwODAiIEFMSU5LPSIjRkYwMDAwIj4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+T3ZlcnZpZXcgb2YgTmV3IEZlYXR1cmVzIGluIEFwYWNoZSAyLjA8L0gxPgotCi08UD5FbmhhbmNlbWVudHM6IDxBIEhSRUY9IiNjb3JlIj5Db3JlPC9BPiB8Ci0KLTxQPjxIUj4KLQotPEgyPjxBIE5BTUU9ImNvcmUiPkNvcmUgRW5oYW5jZW1lbnRzOjwvQT48L0gyPgotCi08REw+Ci08RFQ+PFNUUk9ORz5Vbml4IFRocmVhZGluZzwvU1RST05HPgotPEREPk9uIFVuaXggc3lzdGVtcyB3aXRoIFBPU0lYIHRocmVhZHMgc3VwcG9ydCwgQXBhY2hlIGNhbiBub3cgcnVuIGluIGEKLSAgICBoeWJyaWQgbXVsdGlwcm9jZXNzLCBtdWx0aXRocmVhZGVkIG1vZGUuIFRoaXMgc2hvdWxkIGltcHJvdmUKLSAgICBzY2FsYWJpbGl0eS4gCi0KLTxEVD48U1RST05HPk5ldyBCdWlsZCBTeXN0ZW08L1NUUk9ORz4KLTxERD5UaGUgYnVpbGQgc3lzdGVtIGhhcyBiZWVuIHJld3JpdHRlbiBmcm9tIHNjcmF0Y2ggdG8gYmUgYmFzZWQgb24KLSAgICBhdXRvY29uZiBhbmQgbGlidG9vbC4gVGhpcyBtYWtlcyBBcGFjaGUncyBjb25maWd1cmF0aW9uIHN5c3RlbSBtb3JlCi0gICAgc2ltaWxhciB0byB0aGF0IG9mIG90aGVyIHBhY2thZ2VzLgotCi08RFQ+PFNUUk9ORz5NdWx0aXByb3RvY29sIFN1cHBvcnQ8L1NUUk9ORz4KLTxERD5BcGFjaGUgbm93IGhhcyBzb21lIG9mIHRoZSBpbmZyYXN0cnVjdHVyZSBpbiBwbGFjZSB0byBzdXBwb3J0IHNlcnZpbmcKLSAgICBtdWx0aXBsZSBwcm90b2NvbHMuIG1vZF9lY2hvIGhhcyBiZWVuIHdyaXR0ZW4gYXMgYW4gZXhhbXBsZS4KLQotPERUPjxTVFJPTkc+QmV0dGVyIHN1cHBvcnQgZm9yIG5vbi1Vbml4IHBsYXRmb3JtczwvU1RST05HPgotPEREPkFwYWNoZSAyLjAgc2hvdWxkIGJlIGZhc3RlciBhbmQgbW9yZSBzdGFibGUgb24gbm9uLVVuaXggcGxhdGZvcm1zIHN1Y2gKLSAgICBhcyBCZU9TLCBPUy8yLCBhbmQgV2luZG93cy4gV2l0aCB0aGUgaW50cm9kdWN0aW9uIG9mIHBsYXRmb3JtLXNwZWNpZmljCi0gICAgbXVsdGlwcm9jZXNzaW5nIG1vZHVsZXMgYW5kIHRoZSBBcGFjaGUgUG9ydGFibGUgUnVudGltZSwgdGhlc2UKLSAgICBwbGF0Zm9ybXMgY2FuIG5vdyBhdm9pZCB1c2luZyBQT1NJWC1lbXVsYXRpb24gZnVuY3Rpb25zIHRoYXQgYXJlCi0gICAgc29tZXRpbWVzIGJ1Z2d5IGFuZCBhbHdheXMgaHVydCBwZXJmb3JtYW5jZS4KLQotPERUPjxTVFJPTkc+TmV3IEFQSTwvU1RST05HPgotPEREPlRoZSBBUEkgZm9yIG1vZHVsZXMgaGFzIGNoYW5nZWQgc2lnbmlmaWNhbnRseSBmb3IgMi4wLiBNYW55IG9mIHRoZQotICAgIG1vZHVsZS1vcmRlcmluZyBwcm9ibGVtcyBmcm9tIDEuMyBzaG91bGQgYmUgZ29uZS4gMi4wIGRvZXMgbXVjaCBvZgotICAgIHRoaXMgYXV0b21hdGljYWxseSwgYW5kIG1vZHVsZSBvcmRlcmluZyBpcyBub3cgZG9uZSBwZXItaG9vayB0bwotICAgIGFsbG93IG1vcmUgZmxleGliaWxpdHkuIEFsc28sIG5ldyBjYWxscyBoYXZlIGJlZW4gYWRkZWQgdGhhdCBzaG91bGQKLSAgICBhbGxvdyBtb2R1bGVzIHRvIGRvIG1vcmUgd2l0aG91dCByZXF1aXJpbmcgcGF0Y2hpbmcgb2YgdGhlIGNvcmUKLSAgICBBcGFjaGUgc2VydmVyLgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9uZXdfZmVhdHVyZXNfMl8wLmh0bWwuZW4gYi9kb2NzL21hbnVhbC9uZXdfZmVhdHVyZXNfMl8wLmh0bWwuZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNDFjYzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvbmV3X2ZlYXR1cmVzXzJfMC5odG1sLmVuCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+PEhFQUQ+Ci08VElUTEU+TmV3IGZlYXR1cmVzIHdpdGggQXBhY2hlIDIuMDwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFRFWFQ9IiMwMDAwMDAiIExJTks9IiMwMDAwRkYiIAotICAgICAgVkxJTks9IiMwMDAwODAiIEFMSU5LPSIjRkYwMDAwIj4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+T3ZlcnZpZXcgb2YgTmV3IEZlYXR1cmVzIGluIEFwYWNoZSAyLjA8L0gxPgotCi08UD5FbmhhbmNlbWVudHM6IDxBIEhSRUY9IiNjb3JlIj5Db3JlPC9BPiB8Ci0KLTxQPjxIUj4KLQotPEgyPjxBIE5BTUU9ImNvcmUiPkNvcmUgRW5oYW5jZW1lbnRzOjwvQT48L0gyPgotCi08REw+Ci08RFQ+PFNUUk9ORz5Vbml4IFRocmVhZGluZzwvU1RST05HPgotPEREPk9uIFVuaXggc3lzdGVtcyB3aXRoIFBPU0lYIHRocmVhZHMgc3VwcG9ydCwgQXBhY2hlIGNhbiBub3cgcnVuIGluIGEKLSAgICBoeWJyaWQgbXVsdGlwcm9jZXNzLCBtdWx0aXRocmVhZGVkIG1vZGUuIFRoaXMgc2hvdWxkIGltcHJvdmUKLSAgICBzY2FsYWJpbGl0eS4gCi0KLTxEVD48U1RST05HPk5ldyBCdWlsZCBTeXN0ZW08L1NUUk9ORz4KLTxERD5UaGUgYnVpbGQgc3lzdGVtIGhhcyBiZWVuIHJld3JpdHRlbiBmcm9tIHNjcmF0Y2ggdG8gYmUgYmFzZWQgb24KLSAgICBhdXRvY29uZiBhbmQgbGlidG9vbC4gVGhpcyBtYWtlcyBBcGFjaGUncyBjb25maWd1cmF0aW9uIHN5c3RlbSBtb3JlCi0gICAgc2ltaWxhciB0byB0aGF0IG9mIG90aGVyIHBhY2thZ2VzLgotCi08RFQ+PFNUUk9ORz5NdWx0aXByb3RvY29sIFN1cHBvcnQ8L1NUUk9ORz4KLTxERD5BcGFjaGUgbm93IGhhcyBzb21lIG9mIHRoZSBpbmZyYXN0cnVjdHVyZSBpbiBwbGFjZSB0byBzdXBwb3J0IHNlcnZpbmcKLSAgICBtdWx0aXBsZSBwcm90b2NvbHMuIG1vZF9lY2hvIGhhcyBiZWVuIHdyaXR0ZW4gYXMgYW4gZXhhbXBsZS4KLQotPERUPjxTVFJPTkc+QmV0dGVyIHN1cHBvcnQgZm9yIG5vbi1Vbml4IHBsYXRmb3JtczwvU1RST05HPgotPEREPkFwYWNoZSAyLjAgc2hvdWxkIGJlIGZhc3RlciBhbmQgbW9yZSBzdGFibGUgb24gbm9uLVVuaXggcGxhdGZvcm1zIHN1Y2gKLSAgICBhcyBCZU9TLCBPUy8yLCBhbmQgV2luZG93cy4gV2l0aCB0aGUgaW50cm9kdWN0aW9uIG9mIHBsYXRmb3JtLXNwZWNpZmljCi0gICAgbXVsdGlwcm9jZXNzaW5nIG1vZHVsZXMgYW5kIHRoZSBBcGFjaGUgUG9ydGFibGUgUnVudGltZSwgdGhlc2UKLSAgICBwbGF0Zm9ybXMgY2FuIG5vdyBhdm9pZCB1c2luZyBQT1NJWC1lbXVsYXRpb24gZnVuY3Rpb25zIHRoYXQgYXJlCi0gICAgc29tZXRpbWVzIGJ1Z2d5IGFuZCBhbHdheXMgaHVydCBwZXJmb3JtYW5jZS4KLQotPERUPjxTVFJPTkc+TmV3IEFQSTwvU1RST05HPgotPEREPlRoZSBBUEkgZm9yIG1vZHVsZXMgaGFzIGNoYW5nZWQgc2lnbmlmaWNhbnRseSBmb3IgMi4wLiBNYW55IG9mIHRoZQotICAgIG1vZHVsZS1vcmRlcmluZyBwcm9ibGVtcyBmcm9tIDEuMyBzaG91bGQgYmUgZ29uZS4gMi4wIGRvZXMgbXVjaCBvZgotICAgIHRoaXMgYXV0b21hdGljYWxseSwgYW5kIG1vZHVsZSBvcmRlcmluZyBpcyBub3cgZG9uZSBwZXItaG9vayB0bwotICAgIGFsbG93IG1vcmUgZmxleGliaWxpdHkuIEFsc28sIG5ldyBjYWxscyBoYXZlIGJlZW4gYWRkZWQgdGhhdCBzaG91bGQKLSAgICBhbGxvdyBtb2R1bGVzIHRvIGRvIG1vcmUgd2l0aG91dCByZXF1aXJpbmcgcGF0Y2hpbmcgb2YgdGhlIGNvcmUKLSAgICBBcGFjaGUgc2VydmVyLgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9wbGF0Zm9ybS9uZXR3YXJlLmh0bWwgYi9kb2NzL21hbnVhbC9wbGF0Zm9ybS9uZXR3YXJlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZGQ3NzguLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvcGxhdGZvcm0vbmV0d2FyZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+VXNpbmcgQXBhY2hlIHdpdGggTm92ZWxsIE5ldFdhcmUgNTwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotCi08SDEgQUxJR049IkNFTlRFUiI+VXNpbmcgQXBhY2hlIFdpdGggTm92ZWxsIE5ldFdhcmUgNTwvSDE+Ci0KLTxQPlRoaXMgZG9jdW1lbnQgZXhwbGFpbnMgaG93IHRvIGluc3RhbGwsIGNvbmZpZ3VyZSBhbmQgcnVuCi0gICBBcGFjaGUgMS4zIHVuZGVyIE5vdmVsbCBOZXRXYXJlIDUuIFBsZWFzZSBub3RlIHRoYXQgYXQKLSAgIHRoaXMgdGltZSwgTmV0V2FyZSBzdXBwb3J0IGlzIGVudGlyZWx5IGV4cGVyaW1lbnRhbCwgYW5kIGlzCi0gICByZWNvbW1lbmRlZCBvbmx5IGZvciBleHBlcmllbmNlZCB1c2Vycy4gVGhlIEFwYWNoZSBHcm91cCBkb2VzIG5vdAotICAgZ3VhcmFudGVlIHRoYXQgdGhpcyBzb2Z0d2FyZSB3aWxsIHdvcmsgYXMgZG9jdW1lbnRlZCwgb3IgZXZlbiBhdAotICAgYWxsLiBJZiB5b3UgZmluZCBhbnkgYnVncywgb3Igd2lzaCB0byBjb250cmlidXRlIGluIG90aGVyIHdheXMsIHBsZWFzZQotICAgdXNlIG91ciA8QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvYnVnX3JlcG9ydC5odG1sIj5idWcgcmVwb3J0aW5nCi0gICBwYWdlLjwvQT48L1A+Ci0KLTxQPjxTVFJPTkc+V2FybmluZzogQXBhY2hlIG9uIE5ldFdhcmUgaGFzIG5vdCB5ZXQgYmVlbiBvcHRpbWl6ZWQgZm9yIHBlcmZvcm1hbmNlLgotQXBhY2hlIHN0aWxsIHBlcmZvcm1zIGJlc3QsIGFuZCBpcyBtb3N0IHJlbGlhYmxlIG9uIFVuaXggcGxhdGZvcm1zLiAgT3ZlcgotdGltZSB3ZSB3aWxsIGltcHJvdmUgTmV0V2FyZSBwZXJmb3JtYW5jZS4gRm9sa3MgZG9pbmcgY29tcGFyYXRpdmUgcmV2aWV3cwotb2Ygd2Vic2VydmVyIHBlcmZvcm1hbmNlIGFyZSBhc2tlZCB0byBjb21wYXJlIGFnYWluc3QgQXBhY2hlCi1vbiBhIFVuaXggcGxhdGZvcm0gc3VjaCBhcyBTb2xhcmlzLCBGcmVlQlNELCBvciBMaW51eC48L1NUUk9ORz48L1A+Ci0KLTxQPgotCi1Nb3N0IG9mIHRoaXMgZG9jdW1lbnQgYXNzdW1lcyB0aGF0IHlvdSBhcmUgaW5zdGFsbGluZyBBcGFjaGUgZnJvbSBhCi1iaW5hcnkgZGlzdHJpYnV0aW9uLiBJZiB5b3Ugd2FudCB0byBjb21waWxlIEFwYWNoZSB5b3Vyc2VsZiAocG9zc2libHkKLXRvIGhlbHAgd2l0aCBkZXZlbG9wbWVudCwgb3IgdG8gdHJhY2sgZG93biBidWdzKSwgc2VlIHRoZSBzZWN0aW9uIG9uCi08QSBIUkVGPSIjY29tcCI+Q29tcGlsaW5nIEFwYWNoZSBmb3IgTmV0V2FyZTwvQT4gYmVsb3cuCi0KLTxIUj4KLQotPFVMPgotICA8TEk+PEEgSFJFRj0iI3JlcSI+UmVxdWlyZW1lbnRzPC9BPgotICA8TEk+PEEgSFJFRj0iI2Rvd24iPkRvd25sb2FkaW5nIEFwYWNoZSBmb3IgTmV0V2FyZTwvQT4KLSAgPExJPjxBIEhSRUY9IiNpbnN0Ij5JbnN0YWxsaW5nIEFwYWNoZSBmb3IgTmV0V2FyZTwvQT4KLSAgPExJPjxBIEhSRUY9IiNydW4iPlJ1bm5pbmcgQXBhY2hlIGZvciBOZXRXYXJlPC9BPgotICA8TEk+PEEgSFJFRj0iI3VzZSI+VXNpbmcgQXBhY2hlIGZvciBOZXRXYXJlPC9BPgotICA8TEk+PEEgSFJFRj0iI2NvbXAiPkNvbXBpbGluZyBBcGFjaGUgZm9yIE5ldFdhcmU8L0E+Ci08L1VMPgotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJyZXEiPlJlcXVpcmVtZW50czwvQT48L0gyPgotCi1BcGFjaGUgMS4zIGlzIGRlc2lnbmVkIHRvIHJ1biBvbiBOZXRXYXJlIDUuMCBhbmQgNS4xLgotPFA+Ci0KLTxTVFJPTkc+SWYgcnVubmluZyBvbiBOZXRXYXJlIDUuMCB5b3UgbXVzdCBpbnN0YWxsIFNlcnZpY2UgUGFjayA0LjwvU1RST05HPgotCi08UD4KLTxQPgotCi1TZXJ2aWNlIHBhY2sgNCBpcyBhdmFpbGFibGUgPEEgSFJFRj0iaHR0cDovL3N1cHBvcnQubm92ZWxsLmNvbS9taXNjL3BhdGxzdC5odG0jbnciPmhlcmUuPC9BPgotCi08SDI+PEEgTkFNRT0iZG93biI+RG93bmxvYWRpbmcgQXBhY2hlIGZvciBOZXRXYXJlIDU8L0E+PC9IMj4KLQotPFA+SW5mb3JtYXRpb24gb24gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIEFwYWNoZSBjYW4gYmUgZm91bmQgb24gdGhlCi1BcGFjaGUgd2ViIHNlcnZlciBhdCA8QQotSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvQT4uICBUaGlzIHdpbGwKLWxpc3QgdGhlIGN1cnJlbnQgcmVsZWFzZSwgYW55IG1vcmUgcmVjZW50IGFscGhhIG9yIGJldGEtdGVzdCByZWxlYXNlcywKLXRvZ2V0aGVyIHdpdGggZGV0YWlscyBvZiBtaXJyb3Igd2ViIGFuZCBhbm9ueW1vdXMgZnRwIHNpdGVzLjwvUD4KLQotPFA+Ci08SDI+PEEgTkFNRT0iaW5zdCI+SW5zdGFsbGluZyBBcGFjaGUgZm9yIE5ldFdhcmU8L0E+PC9IMj4KLQotVGhlcmUgaXMgbm8gQXBhY2hlIGluc3RhbGwgcHJvZ3JhbSBmb3IgTmV0V2FyZSBjdXJyZW50bHkuICBZb3Ugd2lsbCBuZWVkCi10byBjb21waWxlIGFwYWNoZSBhbmQgY29weSB0aGUgZmlsZXMgb3ZlciB0byB0aGUgc2VydmVyIG1hbnVhbGx5LiAgQW4KLWluc3RhbGwgcHJvZ3JhbSB3aWxsIGJlIHBvc3RlZCBhdCBhIGxhdGVyIGRhdGUuCi08UD4KLUZvbGxvdyB0aGVzZSBzdGVwcyB0byBpbnN0YWxsIEFwYWNoZSBvbiBOZXRXYXJlIChhc3N1bWluZyB5b3Ugd2lsbCBpbnN0YWxsIHRvIHN5czovYXBhY2hlKToKLQotPFVMPgotICA8TEk+Q3JlYXRlIGEgZGlyZWN0b3J5IGNhbGxlZCA8Q09ERT5BcGFjaGU8L0NPREU+IG9uIGEgTmV0V2FyZSB2b2x1bWUKLSAgPExJPkNvcHkgQXBhY2hlLm5sbSwgQXBhY2hlYy5ubG0sIGh0ZGlnZXN0Lm5sbSwgYW5kIGh0cGFzc3dkLm5sbSB0byBzeXM6L2FwYWNoZQotICA8TEk+Q3JlYXRlIGEgZGlyZWN0b3J5IHVuZGVyIDxDT0RFPnN5czovQXBhY2hlPC9DT0RFPiBjYWxsZWQgPENPREU+Y29uZjwvQ09ERT4KLSAgPExJPkNvcHkgYWxsIHRoZSAqLmNvbmYtZGlzdC1udyBmaWxlcyB0byB0aGUgPENPREU+c3lzOi9hcGFjaGUvY29uZjwvQ09ERT4gZGlyZWN0b3J5Ci0gICAgICBhbmQgcmVuYW1lIHRoZW0gYWxsIGFzICouY29uZiBmaWxlcwotICA8TEk+Q29weSB0aGUgbWltZS50eXBlcyBhbmQgbWFnaWMgZmlsZXMgdG8gc3lzOi9hcGFjaGUvY29uZiBkaXJlY3RvcnkKLSAgPExJPkNvcHkgYWxsIGZpbGVzIGFuZCBzdWJkaXJlY3RvcmllcyBvZiBcYXBhY2hlLTEuM1xodGRvY3MgdG8gc3lzOi9hcGFjaGUvaHRkb2NzIGFuZAotICAgICAgcmVuYW1lIHRoZSBwcm9wZXIgaW5kZXggZmlsZSAoaW5kZXguaHRtbC5lbikgdG8gaW5kZXguaHRtbAotICA8TEk+Q29weSBhbGwgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzIGluIFxhcGFjaGUtMS4zXGljb25zIHRvIHN5czovYXBhY2hlL2ljb25zCi0gIDxMST5DcmVhdGUgdGhlIGRpcmVjdG9yeSBzeXM6L2FwYWNoZS9sb2dzIG9uIHRoZSBzZXJ2ZXIKLSAgPExJPkNyZWF0ZSB0aGUgZGlyZWN0b3J5IHN5czovYXBhY2hlL2NnaS1iaW4gb24gdGhlIHNlcnZlcgotICA8TEk+Q3JlYXRlIHRoZSBkaXJlY3Rvcnkgc3lzOi9hcGFjaGUvbW9kdWxlcyBhbmQgY29weSBhbGwgbmxtIG1vZHVsZXMgYnVpbHQgaW50byB0aGUKLSAgICAgIG1vZHVsZXMgZGlyZWN0b3J5Ci0gIDxMST5FZGl0IHRoZSBodHRwZC5jb25mIGZpbGUgc2V0dGluZyBTZXJ2ZXJSb290IGFuZCBTZXJ2ZXJOYW1lIHRvIHJlZmxlY3QgeW91ciBjb3JyZWN0Ci0gICAgICBzZXJ2ZXIgc2V0dGluZ3MKLSAgPExJPkFkZCA8Q09ERT5zeXM6L2FwYWNoZTwvQ09ERT4gdG8gdGhlIHNlYXJjaCBwYXRoLiAgRVhBTVBMRTogc2VhcmNoIGFkZCBzeXM6XGFwYWNoZQotPC9VTD4KLQotPFA+QXBhY2hlIG1heSBiZSBpbnN0YWxsZWQgdG8gb3RoZXIgdm9sdW1lcyBiZXNpZGVzIHRoZSBkZWZhdWx0IDxDT0RFPnN5czwvQ09ERT4gdm9sdW1lLgotCi08SDI+PEEgTkFNRT0icnVuIj5SdW5uaW5nIEFwYWNoZSBmb3IgTmV0V2FyZTwvQT48L0gyPgotCi1UbyBzdGFydCBBcGFjaGUganVzdCB0eXBlIDxTVFJPTkc+YXBhY2hlPC9TVFJPTkc+IGF0IHRoZSBjb25zb2xlLiAgVGhpcwotd2lsbCBsb2FkIGFwYWNoZSBpbiB0aGUgT1MgYWRkcmVzcyBzcGFjZS4gIElmIHlvdSBwcmVmZXIgdG8gbG9hZAotQXBhY2hlIGluIGEgcHJvdGVjdGVkIGFkZHJlc3Mgc3BhY2UgeW91IG1heSBzcGVjaWZ5IHRoZSBhZGRyZXNzIHNwYWNlCi13aXRoIHRoZSBsb2FkIHN0YXRlbWVudCBhcyBmb2xsb3dzOgotPFA+Ci08UFJFPgotICAgIGxvYWQgYWRkcmVzcyBzcGFjZSA9IGFwYWNoZSBhcGFjaGUKLTwvUFJFPgotPFA+Ci1UaGlzIHdpbGwgbG9hZCBBcGFjaGUgaW50byBhbiBhZGRyZXNzIHNwYWNlIGNhbGxlZCBhcGFjaGUuIFJ1bm5pbmcgbXVsdGlwbGUgaW5zdGFuY2VzCi1vZiBBcGFjaGUgY29uY3VycmVudGx5IG9uIE5ldFdhcmUgaXMgcG9zc2libGUgYnkgbG9hZGluZyBlYWNoIGluc3RhbmNlIGludG8gaXRzIG93bgotcHJvdGVjdGVkIGFkZHJlc3Mgc3BhY2UuCi0KLTxQPgotQWZ0ZXIgc3RhcnRpbmcgQXBhY2hlIGl0IHdpbGwgYmUgbGlzdGVuaW5nIHRvIHBvcnQgODAgKHVubGVzcyB5b3UKLWNoYW5nZWQgdGhlIDxTQU1QPlBvcnQ8L1NBTVA+LCA8U0FNUD5MaXN0ZW48L1NBTVA+IG9yCi08U0FNUD5CaW5kQWRkcmVzczwvU0FNUD4gZGlyZWN0aXZlcyBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcykuCi1UbyBjb25uZWN0IHRvIHRoZSBzZXJ2ZXIgYW5kIGFjY2VzcyB0aGUgZGVmYXVsdCBwYWdlLCBsYXVuY2ggYSBicm93c2VyCi1hbmQgZW50ZXIgdGhlIHNlcnZlcidzIG5hbWUgb3IgYWRkcmVzcy4KLQotVGhpcyBzaG91bGQgcmVzcG9uZCB3aXRoIGEgd2VsY29tZSBwYWdlLCBhbmQgYSBsaW5rIHRvIHRoZSBBcGFjaGUKLW1hbnVhbC4gSWYgbm90aGluZyBoYXBwZW5zIG9yIHlvdSBnZXQgYW4gZXJyb3IsIGxvb2sgaW4gdGhlCi08U0FNUD5lcnJvcl9sb2c8L1NBTVA+IGZpbGUgaW4gdGhlIDxTQU1QPmxvZ3M8L1NBTVA+IGRpcmVjdG9yeS4KLQotPFA+Ci0KLU9uY2UgeW91ciBiYXNpYyBpbnN0YWxsYXRpb24gaXMgd29ya2luZywgeW91IHNob3VsZCBjb25maWd1cmUgaXQKLXByb3Blcmx5IGJ5IGVkaXRpbmcgdGhlIGZpbGVzIGluIHRoZSA8U0FNUD5jb25mPC9TQU1QPiBkaXJlY3RvcnkuCi0KLTxQPgotVG8gdW5sb2FkIEFwYWNoZSBydW5uaW5nIGluIHRoZSBPUyBhZGRyZXNzIHNwYWNlIGp1c3QgdHlwZSB0aGUKLWZvbGxvd2luZyBhdCB0aGUgY29uc29sZToKLTxQUkU+Ci0gICAgdW5sb2FkIGFwYWNoZQotPC9QUkU+Ci1JZiBhcGFjaGUgaXMgcnVubmluZyBpbiBhIHByb3RlY3RlZCBhZGRyZXNzIHNwYWNlIHNwZWNpZnkgdGhlIAotYWRkcmVzcyBzcGFjZSBpbiB0aGUgdW5sb2FkIHN0YXRlbWVudDoKLTxQUkU+Ci0gICAgdW5sb2FkIGFkZHJlc3Mgc3BhY2UgPSBhcGFjaGUgYXBhY2hlCi08L1BSRT4KLQotPFA+Ci1XaGVuIHdvcmtpbmcgd2l0aCBBcGFjaGUgaXQgaXMgaW1wb3J0YW50IHRvIGtub3cgaG93IGl0IHdpbGwgZmluZCB0aGUKLWNvbmZpZ3VyYXRpb24gZmlsZXMuICBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIGZpbGUgb24gdGhlIGNvbW1hbmQgbGluZQotaW4gdHdvIHdheXM6Ci0KLTxVTD4KLTxMST4tZiBzcGVjaWZpZXMgYSBwYXRoIHRvIGEgcGFydGljdWxhciBjb25maWd1cmF0aW9uIGZpbGUKLTwvVUw+Ci08UFJFPiAgICBhcGFjaGUgLWYgInZvbDovbXkgc2VydmVyL2NvbmYvbXkuY29uZiI8L1BSRT4KLTxQUkU+ICAgIGFwYWNoZSAtZiB0ZXN0L3Rlc3QuY29uZjwvUFJFPgotCi1JbiB0aGVzZSBjYXNlcywgdGhlIHByb3BlciBTZXJ2ZXJSb290IHNob3VsZCBiZSBzZXQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLQotPFA+Ci0KLUlmIHlvdSBkb24ndCBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiBmaWxlIG5hbWUgd2l0aCAtZiwgQXBhY2hlIHdpbGwKLXVzZSB0aGUgZmlsZSBuYW1lIGNvbXBpbGVkIGludG8gdGhlIHNlcnZlciwgdXN1YWxseSAiY29uZi9odHRwZC5jb25mIi4gIEludm9raW5nCi1BcGFjaGUgd2l0aCB0aGUgLVYgc3dpdGNoIHdpbGwgZGlzcGxheSB0aGlzIHZhbHVlIGxhYmVsZWQgYXMgU0VSVkVSX0NPTkZJR19GSUxFLgotQXBhY2hlIHdpbGwgdGhlbiBkZXRlcm1pbmUgaXRzIFNlcnZlclJvb3QgYnkgdHJ5aW5nIHRoZSBmb2xsb3dpbmcsIGluIHRoaXMgb3JkZXI6Ci0KLTxVTD4KLTxMST5BIFNlcnZlclJvb3QgZGlyZWN0aXZlIHZpYSBhIC1DIHN3aXRjaC4KLTxMST5UaGUgLWQgc3dpdGNoIG9uIHRoZSBjb21tYW5kIGxpbmUuCi08TEk+Q3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQotPExJPlRoZSBzZXJ2ZXIgcm9vdCBjb21waWxlZCBpbnRvIHRoZSBzZXJ2ZXIuCi08L1VMPgotCi08UD4KLVRoZSBzZXJ2ZXIgcm9vdCBjb21waWxlZCBpbnRvIHRoZSBzZXJ2ZXIgaXMgdXN1YWxseSAic3lzOi9hcGFjaGUiLgotaW52b2tpbmcgYXBhY2hlIHdpdGggdGhlIC1WIHN3aXRjaCB3aWxsIGRpc3BsYXkgdGhpcyB2YWx1ZQotbGFiZWxlZCBhcyBIVFRQRF9ST09ULgotCi08SDI+PEEgTkFNRT0idXNlIj5Db25maWd1cmluZyBBcGFjaGUgZm9yIE5ldFdhcmU8L0E+PC9IMj4KLQotQXBhY2hlIGlzIGNvbmZpZ3VyZWQgYnkgZmlsZXMgaW4gdGhlIDxTQU1QPmNvbmY8L1NBTVA+Ci1kaXJlY3RvcnkuIFRoZXNlIGFyZSB0aGUgc2FtZSBhcyBmaWxlcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgVW5peAotdmVyc2lvbiwgYnV0IHRoZXJlIGFyZSBhIGZldyBkaWZmZXJlbnQgZGlyZWN0aXZlcyBmb3IgQXBhY2hlIG9uCi1OZXRXYXJlLiBTZWUgdGhlIDxBIEhSRUY9Ii4vIj5BcGFjaGUgZG9jdW1lbnRhdGlvbjwvQT4gZm9yIGFsbCB0aGUKLWF2YWlsYWJsZSBkaXJlY3RpdmVzLgotCi08UD4KLQotVGhlIG1haW4gZGlmZmVyZW5jZXMgaW4gQXBhY2hlIGZvciBOZXRXYXJlIGFyZToKLQotPFVMPgotICA8TEk+PFA+QmVjYXVzZSBBcGFjaGUgZm9yIE5ldFdhcmUgaXMgbXVsdGl0aHJlYWRlZCwgaXQgZG9lcyBub3QgdXNlIGEKLSAgICAgIHNlcGFyYXRlIHByb2Nlc3MgZm9yIGVhY2ggcmVxdWVzdCwgYXMgQXBhY2hlIGRvZXMgd2l0aAotICAgICAgVW5peC4gSW5zdGVhZCB0aGVyZSBhcmUgb25seSB0aHJlYWRzIHJ1bm5pbmc6IGEgcGFyZW50IHRocmVhZCwgYW5kCi0gICAgICBhIGNoaWxkIHdoaWNoIGhhbmRsZXMgdGhlIHJlcXVlc3RzLiBXaXRoaW4gdGhlIGNoaWxkIGVhY2ggcmVxdWVzdCBpcwotICAgICAgaGFuZGxlZCBieSBhIHNlcGFyYXRlIHRocmVhZC4KLSAgICAgIDxQPgotCi0gICAgICBTbyB0aGUgInByb2Nlc3MiLW1hbmFnZW1lbnQgZGlyZWN0aXZlcyBhcmUgZGlmZmVyZW50OgotICAgICAgPFA+PEEKLSAgICAgICAgIEhSRUY9Im1vZC9jb3JlLmh0bWwjbWF4cmVxdWVzdHNwZXJjaGlsZCI+TWF4UmVxdWVzdHNQZXJDaGlsZDwvQT4KLSAgICAgICAgIC0gTGlrZSB0aGUgVW5peCBkaXJlY3RpdmUsIHRoaXMgY29udHJvbHMgaG93IG1hbnkgcmVxdWVzdHMgYQotICAgICAgICAgICBwcm9jZXNzIHdpbGwgc2VydmUgYmVmb3JlIGV4aXRpbmcuIEhvd2V2ZXIsIHVubGlrZSBVbml4LCBhCi0gICAgICAgICAgIHByb2Nlc3Mgc2VydmVzIGFsbCB0aGUgcmVxdWVzdHMgYXQgb25jZSwgbm90IGp1c3Qgb25lLCBzbyBpZgotICAgICAgICAgICB0aGlzIGlzIHNldCwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCBhIHZlcnkgaGlnaCBudW1iZXIgaXMKLSAgICAgICAgICAgdXNlZC4gVGhlIHJlY29tbWVuZGVkIGRlZmF1bHQsIDxDT0RFPk1heFJlcXVlc3RzUGVyQ2hpbGQKLSAgICAgICAgICAgMDwvQ09ERT4sIGRvZXMgbm90IGNhdXNlIHRoZSBwcm9jZXNzIHRvIGV2ZXIgZXhpdC4KLSAgICAgIDxQPjxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjdGhyZWFkc3BlcmNoaWxkIj5UaHJlYWRzUGVyQ2hpbGQ8L0E+IC0KLSAgICAgICAgIFRoaXMgZGlyZWN0aXZlIGlzIG5ldywgYW5kIHRlbGxzIHRoZSBzZXJ2ZXIgaG93IG1hbnkgdGhyZWFkcyBpdAotICAgICAgICAgc2hvdWxkIHVzZS4gVGhpcyBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhlIHNlcnZlcgotICAgICAgICAgY2FuIGhhbmRsZSBhdCBvbmNlOyBiZSBzdXJlIGFuZCBzZXQgdGhpcyBudW1iZXIgaGlnaCBlbm91Z2ggZm9yCi0gICAgICAgICB5b3VyIHNpdGUgaWYgeW91IGdldCBhIGxvdCBvZiBoaXRzLiBUaGUgcmVjb21tZW5kZWQgZGVmYXVsdCBpcwotICAgICAgICAgPENPREU+VGhyZWFkc1BlckNoaWxkIDUwPC9DT0RFPi4KLSAgICAgIDwvUD48QSBIUkVGPSJtb2QvY29yZS5odG1sI3RocmVhZHN0YWNrc2l6ZSI+VGhyZWFkU3RhY2tTaXplPC9BPiAtCi0gICAgICAgICBUaGlzIGRpcmVjdGl2ZSB0ZWxscyB0aGUgc2VydmVyIHdoYXQgc2l6ZSBvZiBzdGFjayB0byB1c2UgZm9yCi0gICAgICAgICB0aGUgaW5kaXZpZHVhbCB0aHJlYWRzLiAgVGhlIHJlY29tbWVuZGVkIGRlZmF1bHQgaXMKLSAgICAgICAgIDxDT0RFPlRocmVhZFN0YWNrU2l6ZSA2NTUzNjwvQ09ERT4uCi0gICAgICA8UD4KLSAgPExJPjxQPlRoZSBkaXJlY3RpdmVzIHRoYXQgYWNjZXB0IGZpbGVuYW1lcyBhcyBhcmd1bWVudHMgbm93IG11c3QgdXNlCi0gICAgICBOZXRXYXJlIGZpbGVuYW1lcyBpbnN0ZWFkIG9mIFVuaXggb25lcy4gSG93ZXZlciwgYmVjYXVzZSBBcGFjaGUKLSAgICAgIHVzZXMgVW5peC1zdHlsZSBuYW1lcyBpbnRlcm5hbGx5LCB5b3UgbXVzdCB1c2UgZm9yd2FyZCBzbGFzaGVzLCBub3QKLSAgICAgIGJhY2tzbGFzaGVzLiBWb2x1bWVzIGNhbiBiZSB1c2VkOyBpZiBvbWl0dGVkLCB0aGUgZHJpdmUgd2l0aCB0aGUKLSAgICAgIEFwYWNoZSBleGVjdXRhYmxlIHdpbGwgYmUgYXNzdW1lZC48L1A+Ci0gIDxMST48UD5BcGFjaGUgZm9yIE5ldFdhcmUgY29udGFpbnMgdGhlIGFiaWxpdHkgdG8gbG9hZCBtb2R1bGVzIGF0IHJ1bnRpbWUsCi0gICAgICB3aXRob3V0IHJlY29tcGlsaW5nIHRoZSBzZXJ2ZXIuIElmIEFwYWNoZSBpcyBjb21waWxlZCBub3JtYWxseSwgaXQKLSAgICAgIHdpbGwgaW5zdGFsbCBhIG51bWJlciBvZiBvcHRpb25hbCBtb2R1bGVzIGluIHRoZQotICAgICAgPENPREU+XEFwYWNoZVxtb2R1bGVzPC9DT0RFPiBkaXJlY3RvcnkuIFRvIGFjdGl2YXRlIHRoZXNlLCBvciBvdGhlcgotICAgICAgbW9kdWxlcywgdGhlIG5ldyA8QSBIUkVGPSJtb2QvbW9kX3NvLmh0bWwjbG9hZG1vZHVsZSI+TG9hZE1vZHVsZTwvQT4KLSAgICAgIGRpcmVjdGl2ZSBtdXN0IGJlIHVzZWQuIEZvciBleGFtcGxlLCB0byBhY3RpdmUgdGhlIHN0YXR1cyBtb2R1bGUsCi0gICAgICB1c2UgdGhlIGZvbGxvd2luZyAoaW4gYWRkaXRpb24gdG8gdGhlIHN0YXR1cy1hY3RpdmF0aW5nIGRpcmVjdGl2ZXMKLSAgICAgIGluIDxDT0RFPmFjY2Vzcy5jb25mPC9DT0RFPik6PC9QPgotPFBSRT4KLSAgICBMb2FkTW9kdWxlIHN0YXR1c19tb2R1bGUgbW9kdWxlcy9zdGF0dXMKLTwvUFJFPgotICAgICAgPFA+SW5mb3JtYXRpb24gb24gPEEgSFJFRj0ibW9kL21vZF9zby5odG1sI2NyZWF0aW5nIj5jcmVhdGluZyBsb2FkYWJsZQotICAgICAgICAgbW9kdWxlczwvQT4gaXMgYWxzbyBhdmFpbGFibGUuPC9QPgotPC9VTD4KLQotPEgyPjxBIE5BTUU9ImNvbXAiPkNvbXBpbGluZyBBcGFjaGUgZm9yIE5ldFdhcmU8L0E+PC9IMj4KLQotPFA+Q29tcGlsaW5nIEFwYWNoZSByZXF1aXJlcyBNZXRyb1dlcmtzIENvZGVXYXJyaW9yIDUgdG8gYmUgcHJvcGVybHkKLSAgIGluc3RhbGxlZC4gCi0gICAKLTxQPkZpcnN0LCB1bnBhY2sgdGhlIEFwYWNoZSBkaXN0cmlidXRpb24gaW50byBhbiBhcHByb3ByaWF0ZQotICAgZGlyZWN0b3J5LiAgVGhlbiBnbyB0byB0aGUgPENPREU+c3JjPC9DT0RFPiBzdWJkaXJlY3Rvcnkgb2YgdGhlIEFwYWNoZQotICAgZGlzdHJpYnV0aW9uIGFuZCB1bnppcCA8Q09ERT5BcGFjaGVOVy5tY3AuZ3o8L0NPREU+LiBZb3UgbWF5IHVzZSBhCi0gICByZWNlbnQgdmVyc2lvbiBvZiBXaW5aaXAgdG8gYWNjb21wbGlzaCB0aGlzIG9yIGd6aXAgZm9yIFdpbmRvd3MuIFRoZSBtYWluCi0gICBNZXRyb3dlcmtzIHByb2plY3QgZmlsZSBmb3IgQXBhY2hlIDxDT0RFPihBcGFjaGVOVy5tY3ApPC9DT0RFPiBpcyBub3cgcmVhZHkKLSAgIHRvIHVzZS4gSnVzdCBkb3VibGUgY2xpY2sgb24gaXQgZnJvbSB3aXRoaW4gZXhwbG9yZXIgYW5kIGl0IHNob3VsZAotICAgYXV0b21hdGljYWxseSBsYXVuY2ggTWV0cm9XZXJrcyBDb2RlV2Fycmlvci4KLTwvUD4KLQotPFA+QWxsIG1ham9yIHBpZWNlcyBvZiBBcGFjaGUgbWF5IGJlIGJ1aWx0IHVzaW5nIHRoZSBBcGFjaGVOVy5tY3AgcHJvamVjdAotICAgZmlsZS4gVGhpcyBpbmNsdWRlcyBtb2R1bGVzIHN1Y2ggYXMgc3RhdHVzLCBpbmZvLCBhbmQgcHJveHkuIEluIGFkZGl0aW9uLAotICAgdGhlIGZvbGxvd2luZyBwcm9qZWN0IGZpbGVzIGhhdmUgYmVlbiBwcm92aWRlZCBhcyB3ZWxsOgotPFBSRT4gICAKLSAgICAgICAvYXBhY2hlLTEuMy9zcmMvc3VwcG9ydC9odHBhc3N3ZC5tY3AuZ3oKLSAgICAgICAvYXBhY2hlLTEuMy9zcmMvc3VwcG9ydC9odGRpZ2VzdC5tY3AuZ3oKLTwvUFJFPgotCi08L1A+Ci08Q09ERT5odHBhc3N3ZC5tY3AuZ3o8L0NPREU+IGFuZCA8Q09ERT5odGRpZ2VzdC5tY3AuZ3o8L0NPREU+IHdpbGwgYWxzbyBuZWVkCi10byBiZSB1bnppcHBlZCBiZWZvcmUgdGhleSBjYW4gYmUgdXNlZCB3aXRoIE1ldHJvV2Vya3MgQ29kZVdhcnJpb3IuCi0KLTxQPk9uY2UgQXBhY2hlIGhhcyBiZWVuIGNvbXBpbGVkLCBpdCBuZWVkcyB0byBiZSBpbnN0YWxsZWQgaW4gaXRzIHNlcnZlcgotICAgcm9vdCBkaXJlY3RvcnkuIFRoZSBkZWZhdWx0IGlzIHRoZSA8Q09ERT5zeXM6L0FwYWNoZTwvQ09ERT4KLSAgIGRpcmVjdG9yeS4gPC9QPgotPFA+Ci1CZWZvcmUgcnVubmluZyB0aGUgc2VydmVyIHlvdSBtdXN0IGZpbGwgb3V0IHRoZSBjb25mIGRpcmVjdG9yeS4KLUNvcHkgdGhlICouY29uZi1kaXN0LW53IGZyb20gdGhlIGRpc3RyaWJ1dGlvbiBjb25mIGRpcmVjdG9yeQotYW5kIHJlbmFtZSAqLmNvbmYuICBFZGl0IHRoZSBTZXJ2ZXJSb290IGVudHJpZXMgdG8geW91cgotYWN0dWFsIHNlcnZlciByb290IChmb3IgZXhhbXBsZSAic3lzOi9hcGFjaGUiKS4gIENvcHkgb3ZlcgotdGhlIGNvbmYvbWFnaWMgYW5kIGNvbmYvbWltZS50eXBlcyBmaWxlcyBhcyB3ZWxsLgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9wbGF0Zm9ybS9wZXJmLWJzZDQ0Lmh0bWwgYi9kb2NzL21hbnVhbC9wbGF0Zm9ybS9wZXJmLWJzZDQ0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTk3OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvcGxhdGZvcm0vcGVyZi1ic2Q0NC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+UnVubmluZyBhIEhpZ2gtUGVyZm9ybWFuY2UgV2ViIFNlcnZlciBmb3IgQlNEPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTxBIE5BTUU9ImluaXRpYWwiPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTwvQT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5SdW5uaW5nIGEgSGlnaC1QZXJmb3JtYW5jZSBXZWIgU2VydmVyIGZvciBCU0Q8L0gxPgotCi1MaWtlIG90aGVyIE9TJ3MsIHRoZSBsaXN0ZW4gcXVldWUgaXMgb2Z0ZW4gdGhlIDxTVFJPTkc+Zmlyc3QgbGltaXQKLWhpdDwvU1RST05HPi4gIFRoZQotZm9sbG93aW5nIGFyZSBjb21tZW50cyBmcm9tICJBYXJvbiBHaWZmb3JkICZsdDthZ2lmZm9yZEBJbmZvV2VzdC5DT00mZ3Q7Igotb24gaG93IHRvIGZpeCB0aGlzIG9uIEJTREkgMS54LCAyLngsICBhbmQgRnJlZUJTRCAyLjAgKGFuZCBlYXJsaWVyKToKLQotPFA+Ci0KLUVkaXQgdGhlIGZvbGxvd2luZyB0d28gZmlsZXM6Ci08QkxPQ0tRVU9URT48Q09ERT4gIC91c3IvaW5jbHVkZS9zeXMvc29ja2V0LmggPEJSPgotICAvdXNyL3NyYy9zeXMvc3lzL3NvY2tldC5oIDwvQ09ERT48L0JMT0NLUVVPVEU+Ci1JbiBlYWNoIGZpbGUsIGxvb2sgZm9yIHRoZSBmb2xsb3dpbmc6Ci08UFJFPgotICAgIC8qCi0gICAgICogTWF4aW11bSBxdWV1ZSBsZW5ndGggc3BlY2lmaWFibGUgYnkgbGlzdGVuLgotICAgICAqLwotICAgICNkZWZpbmUgU09NQVhDT05OICAgICAgIDUKLTwvUFJFPgotCi1KdXN0IGNoYW5nZSB0aGUgIjUiIHRvIHdoYXRldmVyIGFwcGVhcnMgdG8gd29yay4gIEkgYnVtcGVkIHRoZSB0d28KLW1hY2hpbmVzIEkgd2FzIGhhdmluZyBwcm9ibGVtcyB3aXRoIHVwIHRvIDMyIGFuZCBoYXZlbid0IG5vdGljZWQgdGhlCi1wcm9ibGVtIHNpbmNlLgotCi08UD4KLQotQWZ0ZXIgdGhlIGVkaXQsIHJlY29tcGlsZSB0aGUga2VybmVsIGFuZCByZWNvbXBpbGUgdGhlIEFwYWNoZSBzZXJ2ZXIKLXRoZW4gcmVib290LgotCi08UD4KLQotRnJlZUJTRCAyLjEgc2VlbXMgdG8gYmUgcGVyZmVjdGx5IGhhcHB5LCB3aXRoIFNPTUFYQ09OTgotc2V0IHRvIDMyIGFscmVhZHkuCi0KLTxQPgotCi08QSBOQU1FPSJkZXRhaWwiPgotPFNUUk9ORz5BZGRlbmR1bSBmb3IgPEVNPnZlcnk8L0VNPiBoZWF2aWx5IGxvYWRlZCBCU0Qgc2VydmVyczwvU1RST05HPjxCUj4KLTwvQT4KLWZyb20gQ2h1Y2sgTXVyY2tvICZsdDtjaHVja0B0ZWxlYmFzZS5jb20mZ3Q7Ci0KLTxQPgotCi1JZiB5b3UncmUgcnVubmluZyBhIHJlYWxseSBidXN5IEJTRCBBcGFjaGUgc2VydmVyLCB0aGUgZm9sbG93aW5nIGFyZSB1c2VmdWwKLXRoaW5ncyB0byBkbyBpZiB0aGUgc3lzdGVtIGlzIGFjdGluZyBzbHVnZ2lzaDo8UD4KLQotPFVMPgotCi08TEk+IFJ1biB2bXN0YXQgdG8gY2hlY2sgbWVtb3J5IHVzYWdlLCBwYWdlL3N3YXAgcmF0ZXMsIDxFTT5ldGMuPC9FTT4KLQotPExJPiBSdW4gbmV0c3RhdCAtbSB0byBjaGVjayBtYnVmIHVzYWdlCi0KLTxMST4gUnVuIGZzdGF0IHRvIGNoZWNrIGZpbGUgZGVzY3JpcHRvciB1c2FnZQotCi08L1VMPgotCi1UaGVzZSB1dGlsaXRpZXMgZ2l2ZSB5b3UgYW4gaWRlYSB3aGF0IHlvdSdsbCBuZWVkIHRvIHR1bmUgaW4geW91ciBrZXJuZWwsCi1hbmQgd2hldGhlciBpdCdsbCBoZWxwIHRvIGJ1eSBtb3JlIFJBTS4KLQotSGVyZSBhcmUgc29tZSBCU0Qga2VybmVsIGNvbmZpZyBwYXJhbWV0ZXJzIChhY3R1YWxseSBCU0RJLCBidXQgcGVydGluZW50IHRvCi1GcmVlQlNEIGFuZCBvdGhlciA0LjQtbGl0ZSBkZXJpdmF0aXZlcykgZnJvbSBhIHN5c3RlbSBnZXR0aW5nIGhlYXZ5IHVzYWdlLgotVGhlIHRvb2xzIG1lbnRpb25lZCBhYm92ZSB3ZXJlIHVzZWQsIGFuZCB0aGUgc3lzdGVtIG1lbW9yeSB3YXMgaW5jcmVhc2VkIHRvCi00OCBNQiBiZWZvcmUgdGhlc2UgdHVuZXVwcy4gT3RoZXIgc3lzdGVtIHBhcmFtZXRlcnMgcmVtYWluZWQgdW5jaGFuZ2VkLgotCi08UD4KLQotPFBSRT4KLW1heHVzZXJzICAgICAgICAyNTYKLTwvUFJFPgotCi1NYXh1c2VycyBkcml2ZXMgYSA8RU0+bG90PC9FTT4gb2Ygb3RoZXIga2VybmVsIHBhcmFtZXRlcnM6Ci0KLTxVTD4KLQotPExJPiBNYXhpbXVtICMgb2YgcHJvY2Vzc2VzCi0KLTxMST4gTWF4aW11bSAjIG9mIHByb2Nlc3NlcyBwZXIgdXNlcgotCi08TEk+IFN5c3RlbSB3aWRlIG9wZW4gZmlsZXMgbGltaXQKLQotPExJPiBQZXItcHJvY2VzcyBvcGVuIGZpbGVzIGxpbWl0Ci0KLTxMST4gTWF4aW11bSAjIG9mIG1idWYgY2x1c3RlcnMKLQotPExJPiBQcm9jL3BncnAgaGFzaCB0YWJsZSBzaXplCi0KLTwvVUw+Ci0KLVRoZSBhY3R1YWwgZm9ybXVsYWUgZm9yIHRoZXNlIGRlcml2ZWQgcGFyYW1ldGVycyBhcmUgaW4KLTxFTT4vdXNyL3NyYy9zeXMvY29uZi9wYXJhbS5jPC9FTT4uCi1UaGVzZSBjYWxjdWxhdGVkIHBhcmFtZXRlcnMgY2FuIGFsc28gYmUgb3ZlcnJpZGRlbiAoaW4gcGFydCkgYnkgc3BlY2lmeWluZwoteW91ciBvd24gdmFsdWVzIGluIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbiBmaWxlOgotCi08UFJFPgotIyBOZXR3b3JrIG9wdGlvbnMuIE5NQkNMVVNURVJTIGRlZmluZXMgdGhlIG51bWJlciBvZiBtYnVmIGNsdXN0ZXJzIGFuZAotIyBkZWZhdWx0cyB0byAyNTYuIFRoaXMgbWFjaGluZSBpcyBhIHNlcnZlciB0aGF0IGhhbmRsZXMgbG90cyBvZiB0cmFmZmljLAotIyBzbyB3ZSBjcmFuayB0aGF0IHZhbHVlLgotb3B0aW9ucyAgICAgICAgIE5NQkNMVVNURVJTPTQwOTYgICAgICAgICMgbWJ1ZiBjbHVzdGVycyBhdCA0MDk2Ci0KLSMKLSMgTWlzYy4gb3B0aW9ucwotIwotb3B0aW9ucyAgICAgICAgIENISUxEX01BWD01MTIgICAgICAgICAgICMgbWF4aW11bSBudW1iZXIgb2YgY2hpbGQgcHJvY2Vzc2VzCi1vcHRpb25zICAgICAgICAgT1BFTl9NQVg9NTEyICAgICAgICAgICAgIyBtYXhpbXVtIGZkcyAoYnJlYWtzIFJQQyBzdmNzKQotPC9QUkU+Ci0KLTxQPgotCi1JbiBtYW55IGNhc2VzLCBOTUJDTFVTVEVSUyBtdXN0IGJlIHNldCBtdWNoIGxhcmdlciB0aGFuIHdvdWxkIGFwcGVhcgotbmVjZXNzYXJ5IGF0IGZpcnN0IGdsYW5jZS4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IGlmIHRoZSBicm93c2VyCi1kaXNjb25uZWN0cyBpbiBtaWQtdHJhbnNmZXIsIHRoZSBzb2NrZXQgZmQgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcGFydGljdWxhcgotY29ubmVjdGlvbiBlbmRzIHVwIGluIHRoZSBUSU1FX1dBSVQgc3RhdGUgZm9yIHNldmVyYWwgbWludXRlcywgZHVyaW5nCi13aGljaCB0aW1lIGl0cyBtYnVmcyBhcmUgbm90IHlldCBmcmVlZC4gQW5vdGhlciByZWFzb24gaXMgdGhhdCwgb24gc2VydmVyCi10aW1lb3V0cywgc29tZSBjb25uZWN0aW9ucyBlbmQgdXAgaW4gRklOX1dBSVRfMiBzdGF0ZSBmb3JldmVyLCBiZWNhdXNlCi10aGlzIHN0YXRlIGRvZXNuJ3QgdGltZSBvdXQgb24gdGhlIHNlcnZlciwgYW5kIHRoZSBicm93c2VyIG5ldmVyIHNlbnQKLWEgZmluYWwgRklOLiAgRm9yIG1vcmUgZGV0YWlscyBzZWUgdGhlCi08QSBIUkVGPSJmaW5fd2FpdF8yLmh0bWwiPkZJTl9XQUlUXzI8L0E+IHBhZ2UuCi0KLTxQPgotCi1Tb21lIG1vcmUgaW5mbyBvbiBtYnVmIGNsdXN0ZXJzIChmcm9tIHN5cy9tYnVmLmgpOgotPFBSRT4KLS8qCi0gKiBNYnVmcyBhcmUgb2YgYSBzaW5nbGUgc2l6ZSwgTVNJWkUgKG1hY2hpbmUvbWFjaHBhcmFtLmgpLCB3aGljaAotICogaW5jbHVkZXMgb3ZlcmhlYWQuICBBbiBtYnVmIG1heSBhZGQgYSBzaW5nbGUgIm1idWYgY2x1c3RlciIgb2Ygc2l6ZQotICogTUNMQllURVMgKGFsc28gaW4gbWFjaGluZS9tYWNocGFyYW0uaCksIHdoaWNoIGhhcyBubyBhZGRpdGlvbmFsIG92ZXJoZWFkCi0gKiBhbmQgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBpbnRlcm5hbCBkYXRhIGFyZWE7IHRoaXMgaXMgZG9uZSB3aGVuCi0gKiBhdCBsZWFzdCBNSU5DTFNJWkUgb2YgZGF0YSBtdXN0IGJlIHN0b3JlZC4KLSAqLwotPC9QUkU+Ci0KLTxQPgotCi1DSElMRF9NQVggYW5kIE9QRU5fTUFYIGFyZSBzZXQgdG8gYWxsb3cgdXAgdG8gNTEyIGNoaWxkIHByb2Nlc3NlcyAoZGlmZmVyZW50Ci10aGFuIHRoZSBtYXhpbXVtIHZhbHVlIGZvciBwcm9jZXNzZXMgcGVyIHVzZXIgSUQpIGFuZCBmaWxlIGRlc2NyaXB0b3JzLgotVGhlc2UgdmFsdWVzIG1heSBjaGFuZ2UgZm9yIHlvdXIgcGFydGljdWxhciBjb25maWd1cmF0aW9uIChhIGhpZ2hlciBPUEVOX01BWAotdmFsdWUgaWYgeW91J3ZlIGdvdCBtb2R1bGVzIG9yIENHSSBzY3JpcHRzIG9wZW5pbmcgbG90cyBvZiBjb25uZWN0aW9ucyBvcgotZmlsZXMpLiBJZiB5b3UndmUgZ290IGEgbG90IG9mIG90aGVyIGFjdGl2aXR5IGJlc2lkZXMgaHR0cGQgb24gdGhlIHNhbWUKLW1hY2hpbmUsIHlvdSdsbCBoYXZlIHRvIHNldCBOUFJPQyBoaWdoZXIgc3RpbGwuIEluIHRoaXMgZXhhbXBsZSwgdGhlIE5QUk9DCi12YWx1ZSBkZXJpdmVkIGZyb20gbWF4dXNlcnMgcHJvdmVkIHN1ZmZpY2llbnQgZm9yIG91ciBsb2FkLgotCi08UD4KLQotVG8gaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIDxDT0RFPmxpc3RlbigpPC9DT0RFPiBxdWV1ZSwgeW91IG5lZWQgdG8KLWFkanVzdCB0aGUgdmFsdWUgb2YgU09NQVhDT05OLiBTT01BWENPTk4gaXMgbm90IGRlcml2ZWQgZnJvbSBtYXh1c2VycywKLXNvIHlvdSdsbCBhbHdheXMgbmVlZCB0byBpbmNyZWFzZSB0aGF0IHlvdXJzZWxmLiBXZSB1c2UgYSB2YWx1ZSBndWFyYW50ZWVkCi10byBiZSBsYXJnZXIgdGhhbiBBcGFjaGUncyBkZWZhdWx0IGZvciB0aGUgbGlzdGVuKCkgb2YgMTI4LCBjdXJyZW50bHkuCi1UaGUgYWN0dWFsIHZhbHVlIGZvciBTT01BWENPTk4gaXMgc2V0IGluIDxDT0RFPnN5cy9zb2NrZXQuaDwvQ09ERT4uCi1UaGUgYmVzdCB3YXkgdG8gYWRqdXN0IHRoaXMgcGFyYW1ldGVyIGlzIHJ1bi10aW1lLCByYXRoZXIgdGhhbiBjaGFuZ2luZwotaXQgaW4gdGhpcyBoZWFkZXIgZmlsZSBhbmQgdGh1cyBoYXJkY29kaW5nIGEgdmFsdWUgaW4gdGhlIGtlcm5lbCBhbmQKLWVsc2V3aGVyZS4gIFRvIGRvIHRoaXMsIGVkaXQgPENPREU+L2V0Yy9yYy5sb2NhbDwvQ09ERT4gYW5kIGFkZCB0aGUKLWZvbGxvd2luZyBsaW5lOgotPFBSRT4KLSAgICAvdXNyL3NiaW4vc3lzY3RsIC13IGtlcm4uc29tYXhjb25uPTI1NgotPC9QUkU+Ci0KLTxQPgotCi1XZSB1c2VkIDxDT0RFPjI1NjwvQ09ERT4gYnV0IHlvdSBjYW4gdHVuZSBpdCBmb3IgeW91ciBvd24gc2V0dXAuIEluCi1tYW55IGNhc2VzLCBob3dldmVyLCBldmVuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIDxDT0RFPjEyODwvQ09ERT4gKGZvcgotbGF0ZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCkgaXMgT0suCi0KLTxQPgotCi08U1RST05HPkNhdmVhdHM8L1NUUk9ORz4KLQotPFA+Ci0KLUJlIGF3YXJlIHRoYXQgeW91ciBzeXN0ZW0gbWF5IG5vdCBib290IHdpdGggYSBrZXJuZWwgdGhhdCBpcyBjb25maWd1cmVkCi10byB1c2UgbW9yZSByZXNvdXJjZXMgdGhhbiB5b3UgaGF2ZSBhdmFpbGFibGUgc3lzdGVtIFJBTS4KLTxTVFJPTkc+QUxXQVlTPC9TVFJPTkc+Ci1oYXZlIGEga25vd24gYm9vdGFibGUga2VybmVsIGF2YWlsYWJsZSB3aGVuIHR1bmluZyB5b3VyIHN5c3RlbSB0aGlzIHdheSwKLWFuZCB1c2UgdGhlIHN5c3RlbSB0b29scyBiZWZvcmVoYW5kIHRvIGxlYXJuIGlmIHlvdSBuZWVkIHRvIGJ1eSBtb3JlCi1tZW1vcnkgYmVmb3JlIHR1bmluZy4KLQotPFA+Ci0KLVJQQyBzZXJ2aWNlcyB3aWxsIGZhaWwgd2hlbiB0aGUgdmFsdWUgb2YgT1BFTl9NQVggaXMgbGFyZ2VyIHRoYW4gMjU2LgotVGhpcyBpcyBhIGZ1bmN0aW9uIG9mIHRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIFJQQyBsaWJyYXJ5LAotd2hpY2ggdXNlZCBhIGJ5dGUgdmFsdWUgZm9yIGhvbGRpbmcgZmlsZSBkZXNjcmlwdG9ycy4gQlNESSBoYXMgcGFydGlhbGx5Ci1hZGRyZXNzZWQgdGhpcyBsaW1pdCBpbiBpdHMgMi4xIHJlbGVhc2UsIGJ1dCBhIHJlYWwgZml4IG1heSB3ZWxsIGF3YWl0Ci10aGUgcmVkZXNpZ24gb2YgUlBDIGl0c2VsZi4KLQotPFA+Ci0KLUZpbmFsbHksIHRoZXJlJ3MgdGhlIGhhcmQgbGltaXQgb2YgY2hpbGQgcHJvY2Vzc2VzIGNvbmZpZ3VyZWQgaW4gQXBhY2hlLgotCi08UD4KLQotRm9yIHZlcnNpb25zIG9mIEFwYWNoZSBsYXRlciB0aGFuIDEuMC41IHlvdSdsbCBuZWVkIHRvIGNoYW5nZSB0aGUKLWRlZmluaXRpb24gZm9yIDxTVFJPTkc+SEFSRF9TRVJWRVJfTElNSVQ8L1NUUk9ORz4gaW4gPEVNPmh0dHBkLmg8L0VNPiBhbmQKLXJlY29tcGlsZSBpZiB5b3UgbmVlZCB0byBydW4gbW9yZSB0aGFuIHRoZSBkZWZhdWx0IDE1MCBpbnN0YW5jZXMgb2YgaHR0cGQuCi0KLTxQPgotCi1Gcm9tIGNvbmYvaHR0cGQuY29uZi1kaXN0OgotCi08UFJFPgotIyBMaW1pdCBvbiB0b3RhbCBudW1iZXIgb2Ygc2VydmVycyBydW5uaW5nLCA8RU0+aS5lLjwvRU0+LCBsaW1pdCBvbiB0aGUgbnVtYmVyCi0jIG9mIGNsaWVudHMgd2hvIGNhbiBzaW11bHRhbmVvdXNseSBjb25uZWN0IC0tLSBpZiB0aGlzIGxpbWl0IGlzIGV2ZXIKLSMgcmVhY2hlZCwgY2xpZW50cyB3aWxsIGJlIExPQ0tFRCBPVVQsIHNvIGl0IHNob3VsZCBOT1QgQkUgU0VUIFRPTyBMT1cuCi0jIEl0IGlzIGludGVuZGVkIG1haW5seSBhcyBhIGJyYWtlIHRvIGtlZXAgYSBydW5hd2F5IHNlcnZlciBmcm9tIHRha2luZwotIyBVbml4IHdpdGggaXQgYXMgaXQgc3BpcmFscyBkb3duLi4uCi0KLU1heENsaWVudHMgMTUwCi08L1BSRT4KLQotS25vdyB3aGF0IHlvdSdyZSBkb2luZyBpZiB5b3UgYnVtcCB0aGlzIHZhbHVlIHVwLCBhbmQgbWFrZSBzdXJlIHlvdSd2ZQotZG9uZSB5b3VyIHN5c3RlbSBtb25pdG9yaW5nLCBSQU0gZXhwYW5zaW9uLCBhbmQga2VybmVsIHR1bmluZyBiZWZvcmVoYW5kLgotVGhlbiB5b3UncmUgcmVhZHkgdG8gc2VydmljZSBzb21lIHNlcmlvdXMgaGl0cyEKLQotPFA+Ci0KLVRoYW5rcyB0byA8RU0+VG9ueSBTYW5kZXJzPC9FTT4gYW5kIDxFTT5DaHJpcyBUb3JlazwvRU0+IGF0IEJTREkgZm9yIHRoZWlyCi1oZWxwZnVsIHN1Z2dlc3Rpb25zIGFuZCBpbmZvcm1hdGlvbi4KLQotPFA+Ci0KLSJNLiBUZXRlcmluIiAmbHQ7bWlAQUxEQU4uemlwbGluay5uZXQmZ3Q7IHdyaXRlczo8UD4KLTxCTE9DS1FVT1RFPkl0IHJlYWxseSBkb2VzIGhlbHAgaWYgeW91ciBrZXJuZWwgYW5kIGZyZXF1ZW50bHkgdXNlZCB1dGlsaXRpZXMKLWFyZSBmdWxseSBvcHRpbWl6ZWQuIFJlYnVpbGRpbmcgdGhlIEZyZWVCU0Qga2VybmVsIG9uIGFuIEFNRC0xMzMKLSg0ODYtY2xhc3MgQ1BVKSB3ZWItc2VydmVyIHdpdGg8QlI+Ci08Q09ERT4gICAgLW00ODYgLWZleHBlbnNpdmUtb3B0aW1pemF0aW9ucyAtZm9taXQtZnJhbWUtcG9pbnRlciAtTzI8L0NPREU+PEJSPgotaGVscGVkIHJlZHVjZSB0aGUgbnVtYmVyIG9mICJ1bmFibGUiIGVycm9ycywgYmVjYXVzZSB0aGUgQ1BVIHdhcwotb2Z0ZW4gbWF4ZWQgb3V0LjwvQkxPQ0tRVU9URT4KLTxQPgotCi08SFI+Ci0KLTxIMz5Nb3JlIHdlbGNvbWUhPC9IMz4KLQotSWYgeW91IGhhdmUgdGlwcyB0byBjb250cmlidXRlLCBzZW5kIG1haWwgdG8KLTxBIEhSRUY9Im1haWx0bzphcGFjaGVAYXBhY2hlLm9yZyI+YXBhY2hlQGFwYWNoZS5vcmc8L0E+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+PC9IVE1MPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9wbGF0Zm9ybS9wZXJmLWRlYy5odG1sIGIvZG9jcy9tYW51YWwvcGxhdGZvcm0vcGVyZi1kZWMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI5Y2M5Yy4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9wbGF0Zm9ybS9wZXJmLWRlYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+UGVyZm9ybWFuY2UgVHVuaW5nIFRpcHMgZm9yIERpZ2l0YWwgVW5peDwvVElUTEU+Ci08L0hFQUQ+Ci08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5QZXJmb3JtYW5jZSBUdW5pbmcgVGlwcyBmb3IgRGlnaXRhbCBVbml4PC9IMT4KLQotQmVsb3cgaXMgYSBzZXQgb2YgbmV3c2dyb3VwIHBvc3RzIG1hZGUgYnkgYW4gZW5naW5lZXIgZnJvbSBERUMgaW4KLXJlc3BvbnNlIHRvIHF1ZXJpZXMgYWJvdXQgaG93IHRvIG1vZGlmeSBERUMncyBEaWdpdGFsIFVuaXggT1MgZm9yIG1vcmUKLWhlYXZpbHkgbG9hZGVkIHdlYiBzaXRlcy4gIENvcGllZCB3aXRoIHBlcm1pc3Npb24uCi0KLTxIUj4KLQotPEgyPlVwZGF0ZTwvSDI+Ci1Gcm9tOiBKZWZmcmV5IE1vZ3VsICZsdDttb2d1bEBwYS5kZWMuY29tJmd0OzxCUj4KLURhdGU6IEZyaSwgMjggSnVuIDk2IDE2OjA3OjU2IE1EVDxCUj4KLQotPE9MPgotPExJPiBUaGUgYWR2aWNlIGdpdmVuIGluIHRoZSBSRUFETUUgZmlsZSByZWdhcmRpbmcgdGhlCi0gICAgICAgICJ0Y2JoYXNoc2l6ZSIgdmFyaWFibGUgaXMgaW5jb3JyZWN0LiAgVGhlIGxhcmdlc3QgdmFsdWUKLSAgICAgICAgdGhpcyBzaG91bGQgYmUgc2V0IHRvIGlzIDEwMjQuICBTZXR0aW5nIGl0IGFueSBoaWdoZXIKLSAgICAgICAgd2lsbCBoYXZlIHRoZSBwZXJ2ZXJzZSByZXN1bHQgb2YgZGlzYWJsaW5nIHRoZSBoYXNoaW5nCi0gICAgICAgIG1lY2hhbmlzbS4KLQotPExJPlBhdGNoIElEIE9TRjM1MC0xNDYgaGFzIGJlZW4gc3VwZXJzZWRlZCBieQotPEJMT0NLUVVPVEU+Ci0gICAgICAgICAgICAgICAgUGF0Y2ggSUQgT1NGMzUwLTE5NSBmb3IgVjMuMkM8QlI+Ci0gICAgICAgICAgICAgICAgUGF0Y2ggSUQgT1NGMzYwLTM1MDE5NSBmb3IgVjMuMkQKLTwvQkxPQ0tRVU9URT4KLSAgICAgICAgUGF0Y2ggSURzIGZvciBWMy4yRSBhbmQgVjMuMkYgc2hvdWxkIGJlIGF2YWlsYWJsZSBzb29uLgotICAgICAgICBUaGVyZSBpcyBubyBrbm93biByZWFzb24gd2h5IHRoZSBQYXRjaCBJRCBPU0YzNjAtMzUwMTk1Ci0gICAgICAgIHdvbid0IHdvcmsgb24gdGhlc2UgcmVsZWFzZXMsIGJ1dCBzdWNoIHVzZSBpcyBub3Qgb2ZmaWNpYWxseQotICAgICAgICBzdXBwb3J0ZWQgYnkgRGlnaXRhbC4gIFRoaXMgcGF0Y2gga2l0IHdpbGwgbm90IGJlIG5lZWRlZCBmb3IKLSAgICAgICAgVjMuMkcgd2hlbiBpdCBpcyByZWxlYXNlZC4KLTwvT0w+Ci08SFI+Ci0KLQotPFBSRT4KLUZyb20gICAgICAgICAgIG1vZ3VsQHBhLmRlYy5jb20gKEplZmZyZXkgTW9ndWwpCi1Pcmdhbml6YXRpb24gICBERUMgV2VzdGVybiBSZXNlYXJjaAotRGF0ZSAgICAgICAgICAgMzAgTWF5IDE5OTYgMDA6NTA6MjUgR01UCi1OZXdzZ3JvdXBzICAgICA8QSBIUkVGPSJuZXdzOmNvbXAudW5peC5vc2Yub3NmMSI+Y29tcC51bml4Lm9zZi5vc2YxPC9BPgotTWVzc2FnZS1JRCAgICAgJmx0OzRvaXJjaCRiYzhAdXNlbmV0LnBhLmRlYy5jb20mZ3Q7Ci1TdWJqZWN0ICAgICAgICBSZTogV2ViIFNpdGUgUGVyZm9ybWFuY2UKLVJlZmVyZW5jZXMgICAgIDEKLQotCi0KLUluIGFydGljbGUgJmx0O3Nrb29nRHM1NEJILjlwRkBuZXRjb20uY29tJmd0OyBza29vZ0BuZXRjb20uY29tIChKaW0gU2tvb2cpIHdyaXRlczoKLSZndDtXaGVyZSBhcmUgdGhlIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzIGZvciBBbHBoYSBBWFAgcnVubmluZyB0aGUKLSZndDtOZXRzY2FwZSBDb21tZXJjZSBTZXJ2ZXIgMS4xMiB3aXRoIGhpZ2ggdm9sdW1lIGludGVybmV0IHRyYWZmaWM/Ci0mZ3Q7V2UgYXJlIGV2YWx1YXRpbmcgbmV0d29yayBwZXJmb3JtYW5jZSBmb3IgYSB2YXJpZXR5IG9mIEFscGhhIEFYUAotJmd0O3J1bmluZyBERUMgVU5JWCAzLjJDLCB3aGljaCBydW4gREVDJ3Mgc2VhbCBmaXJld2FsbCBhbmQgYmVoaW5kCi0mZ3Q7dGhhdCBBbHBoYSAxMDAwIGFuZCAyMTAwIHdlYnNlcnZlcnMuCi0KLU91ciBleHBlcmllbmNlIChydW5uaW5nIHN1Y2ggV2ViIHNlcnZlcnMgYXMgPEEKLSBIUkVGPSJodHRwOi8vYWx0YXZpc3RhLmRpZ2l0YWwuY29tIj5hbHRhdmlzdGEuZGlnaXRhbC5jb208L0E+Ci1hbmQgPEEgSFJFRj0iaHR0cDovL3d3dy5kaWdpdGFsLmNvbSIKLSAgICA+d3d3LmRpZ2l0YWwuY29tPC9BPikgaXMgdGhhdCB0aGVyZSBpcyBvbmUgaW1wb3J0YW50IGtlcm5lbCB0dW5pbmcKLWtub2IgdG8gYWRqdXN0IGluIG9yZGVyIHRvIGdldCBnb29kIHBlcmZvcm1hbmNlIG9uIFYzLjJDLiAgWW91Ci1uZWVkIHRvIHBhdGNoIHRoZSBrZXJuZWwgZ2xvYmFsIHZhcmlhYmxlICJzb21heGNvbm4iICh1c2UgZGJ4IC1rCi10byBkbyB0aGlzKSBmcm9tIGl0cyBkZWZhdWx0IHZhbHVlIG9mIDggdG8gc29tZXRoaW5nIG11Y2ggbGFyZ2VyLgotCi1Ib3cgbXVjaCBsYXJnZXI/ICBXZWxsLCBubyBsYXJnZXIgdGhhbiAzMjc2NyAoZGVjaW1hbCkuICBBbmQKLXByb2JhYmx5IG5vIGxlc3MgdGhhbiBhYm91dCAyMDQ4LCBpZiB5b3UgaGF2ZSBhIHJlYWxseSBoaWdoIHZvbHVtZQotKG1pbGxpb25zIG9mIGhpdHMgcGVyIGRheSksIGxpa2UgQWx0YVZpc3RhIGRvZXMuCi0KLVRoaXMgY2hhbmdlIGFsbG93cyB0aGUgc3lzdGVtIHRvIG1haW50YWluIG1vcmUgdGhhbiA4IFRDUAotY29ubmVjdGlvbnMgaW4gdGhlIFNZTl9SQ1ZEIHN0YXRlIGZvciB0aGUgSFRUUCBzZXJ2ZXIuICAoWW91Ci1jYW4gdXNlICJuZXRzdGF0IC1BbiB8Z3JlcCBTWU5fUkNWRCIgdG8gc2VlIGhvdyBtYW55IHN1Y2gKLWNvbm5lY3Rpb25zIGV4aXN0IGF0IGFueSBnaXZlbiBpbnN0YW50KS4KLQotSWYgeW91IGRvbid0IG1ha2UgdGhpcyBjaGFuZ2UsIHlvdSBtaWdodCBmaW5kIHRoYXQgYXMgdGhlIGxvYWQgZ2V0cwotaGlnaCwgc29tZSBjb25uZWN0aW9uIGF0dGVtcHRzIHRha2UgYSB2ZXJ5IGxvbmcgdGltZS4gIEFuZCBpZiBhIGxvdAotb2YgeW91ciBjbGllbnRzIGRpc2Nvbm5lY3QgZnJvbSB0aGUgSW50ZXJuZXQgZHVyaW5nIHRoZSBwcm9jZXNzIG9mCi1UQ1AgY29ubmVjdGlvbiBlc3RhYmxpc2htZW50ICh0aGlzIGhhcHBlbnMgYSBsb3Qgd2l0aCBkaWFsdXAKLXVzZXJzKSwgdGhlc2UgImVtYnJ5b25pYyIgY29ubmVjdGlvbnMgbWlnaHQgdGllIHVwIHlvdXIgc29tYXhjb25uCi1xdW90YSBvZiBTWU5fUkNWRC1zdGF0ZSBjb25uZWN0aW9ucy4gIFVudGlsIHRoZSBrZXJuZWwgdGltZXMgb3V0Ci10aGVzZSBlbWJyeW9uaWMgY29ubmVjdGlvbnMsIG5vIG90aGVyIGNvbm5lY3Rpb25zIHdpbGwgYmUgYWNjZXB0ZWQsCi1hbmQgaXQgd2lsbCBhcHBlYXIgYXMgaWYgdGhlIHNlcnZlciBoYXMgZGllZC4KLQotVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHNvbWF4Y29ubiBpbiBEaWdpdGFsIFVOSVggVjQuMCB3aWxsIGJlIHF1aXRlCi1hIGJpdCBsYXJnZXIgdGhhbiBpdCBoYXMgYmVlbiBpbiBwcmV2aW91cyB2ZXJzaW9ucyAod2UgaW5oZXJpdGVkCi10aGlzIGRlZmF1bHQgZnJvbSA0LjNCU0QpLgotCi1EaWdpdGFsIFVOSVggVjQuMCBpbmNsdWRlcyBzb21lIG90aGVyIHBlcmZvcm1hbmNlLXJlbGF0ZWQgY2hhbmdlcwotdGhhdCBzaWduaWZpY2FudGx5IGltcHJvdmUgaXRzIG1heGltdW0gSFRUUCBjb25uZWN0aW9uIHJhdGUuICBIb3dldmVyLAotd2UndmUgYmVlbiB1c2luZyBWMy4yQyBzeXN0ZW1zIHRvIGZyb250LWVuZCBmb3IgYWx0YXZpc3RhLmRpZ2l0YWwuY29tCi13aXRoIG5vIG9idmlvdXMgcGVyZm9ybWFuY2UgYm90dGxlbmVja3MgYXQgdGhlIG1pbGxpb25zLW9mLWhpdHMtcGVyLWRheQotbGV2ZWwuCi0KLVdlIGhhdmUgc29tZSBXZWJzdG9uZSBwZXJmb3JtYW5jZSByZXN1bHRzIGF2YWlsYWJsZSBhdAotICAgICAgICBodHRwOi8vd3d3LmRpZ2l0YWwuY29tL2luZm8vYWxwaGFzZXJ2ZXIvbmV3cy93ZWJmZi5odG1sCi0KLTxFTT5bVGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYWJvdmUgaXMgbm8gbG9uZ2VyIGF0IHRoYXQgVVJMIC0tIEVkLl08L0VNPgotCi1JJ20gbm90IHN1cmUgaWYgdGhlc2Ugd2VyZSBkb25lIHVzaW5nIFY0LjAgb3IgYW4gZWFybGllciB2ZXJzaW9uCi1vZiBEaWdpdGFsIFVOSVgsIGFsdGhvdWdoIEkgc3VzcGVjdCB0aGV5IHdlcmUgZG9uZSB1c2luZyBhIHRlc3QKLXZlcnNpb24gb2YgVjQuMC4KLQotLUplZmYKLQotPEhSPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUZyb20gICAgICAgICAgIG1vZ3VsQHBhLmRlYy5jb20gKEplZmZyZXkgTW9ndWwpCi1Pcmdhbml6YXRpb24gICBERUMgV2VzdGVybiBSZXNlYXJjaAotRGF0ZSAgICAgICAgICAgMzEgTWF5IDE5OTYgMjE6MDE6MDEgR01UCi1OZXdzZ3JvdXBzICAgICA8QSBIUkVGPSJuZXdzOmNvbXAudW5peC5vc2Yub3NmMSI+Y29tcC51bml4Lm9zZi5vc2YxPC9BPgotTWVzc2FnZS1JRCAgICAgJmx0OzRvbm1tZCRtbWRAdXNlbmV0LnBhLmRlYy5jb20mZ3Q7Ci1TdWJqZWN0ICAgICAgICBEaWdpdGFsIFVOSVggVjMuMkMgSW50ZXJuZXQgdHVuaW5nIHBhdGNoIGluZm8KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Tb21ldGhpbmcgdGhhdCBwcm9iYWJseSBmZXcgcGVvcGxlIGFyZSBhd2FyZSBvZiBpcyB0aGF0IERpZ2l0YWwKLWhhcyBhIHBhdGNoIGtpdCBhdmFpbGFibGUgZm9yIERpZ2l0YWwgVU5JWCBWMy4yQyB0aGF0IG1heSBpbXByb3ZlCi1JbnRlcm5ldCBwZXJmb3JtYW5jZSwgZXNwZWNpYWxseSBmb3IgYnVzeSB3ZWIgc2VydmVycy4KLQotVGhpcyBwYXRjaCBraXQgaXMgb25lIHdheSB0byBpbmNyZWFzZSB0aGUgdmFsdWUgb2Ygc29tYXhjb25uLAotd2hpY2ggSSBkaXNjdXNzZWQgaW4gYSBtZXNzYWdlIGhlcmUgYSBkYXkgb3IgdHdvIGFnby4KLQotSSd2ZSBpbmNsdWRlZCBpbiB0aGlzIG1lc3NhZ2UgdGhlIHJldmlzZWQgUkVBRE1FIGZpbGUgZm9yIHRoaXMKLXBhdGNoIGtpdCBiZWxvdy4gIE5vdGUgdGhhdCB0aGUgb3JpZ2luYWwgUkVBRE1FIGZpbGUgaW4gdGhlIHBhdGNoCi1raXQgaXRzZWxmIG1heSBiZSBhbiBlYXJsaWVyIHZlcnNpb247IEknbSB0b2xkIHRoYXQgdGhlIHZlcnNpb24KLWJlbG93IGlzIHRoZSByaWdodCBvbmUuCi0KLVNvcnJ5LCB0aGlzIHBhdGNoIGtpdCBpcyBOT1QgYXZhaWxhYmxlIGZvciBvdGhlciB2ZXJzaW9ucyBvZiBEaWdpdGFsCi1VTklYLiAgTW9zdCAoYnV0IG5vdCBxdWl0ZSBhbGwpIG9mIHRoZXNlIGNoYW5nZXMgYWxzbyBtYWRlIGl0IGludG8gVjQuMCwKLXNvIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdmFyaW91cyB0dW5pbmcgcGFyYW1ldGVycyBpbiB0aGlzIFJFQURNRQotZmlsZSBtaWdodCBiZSB1c2VmdWwgdG8gcGVvcGxlIHJ1bm5pbmcgVjQuMCBzeXN0ZW1zLgotCi1UaGlzIHBhdGNoIGtpdCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYXZhaWxhYmxlICh5ZXQ/KSBmcm9tCi0gICAgICAgIDxBIEhSRUY9Imh0dHA6Ly93d3cuc2VydmljZS5kaWdpdGFsLmNvbS9odG1sL3BhdGNoX3NlcnZpY2UuaHRtbCIKLSAgICAgICAgPmh0dHA6Ly93d3cuc2VydmljZS5kaWdpdGFsLmNvbS9odG1sL3BhdGNoX3NlcnZpY2UuaHRtbDwvQT4KLXNvIEkgZ3Vlc3MgeW91J2xsIGhhdmUgdG8gY2FsbCBEaWdpdGFsJ3MgQ3VzdG9tZXIgU3VwcG9ydCB0byBnZXQgaXQuCi0KLS1KZWZmCi0KLURFU0NSSVBUSU9OOiBEaWdpdGFsIFVOSVggTmV0d29yayB0dW5pbmcgcGF0Y2gKLQotICAgICAgICAgICAgIFBhdGNoIElEOiBPU0YzNTAtMTQ2Ci0KLSAgICAgICAgICAgICBTVVBFUlNFREVEIFBBVENIRVM6IE9TRjM1MC0xNTEsIE9TRjM1MC0xNTgKLQotICAgICAgICBUaGlzIHNldCBvZiBmaWxlcyBpbXByb3ZlcyB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIG5ldHdvcmsKLSAgICAgICAgc3Vic3lzdGVtIG9uIGEgc3lzdGVtIGJlaW5nIHVzZWQgYXMgYSB3ZWIgc2VydmVyLiAgVGhlcmUgYXJlCi0gICAgICAgIGFkZGl0aW9uYWwgdHVuYWJsZSBwYXJhbWV0ZXJzIGluY2x1ZGVkIGhlcmUsIHRvIGJlIHVzZWQKLSAgICAgICAgY2F1dGlvdXNseSBieSBhbiBpbmZvcm1lZCBzeXN0ZW0gYWRtaW5pc3RyYXRvci4KLQotVFVOSU5HCi0KLSAgICAgICAgVG8gdHVuZSB0aGUgd2ViIHNlcnZlciwgdGhlIG51bWJlciBvZiBzaW11bHRhbmVvdXMgc29ja2V0Ci0gICAgICAgIGNvbm5lY3Rpb24gcmVxdWVzdHMgYXJlIGxpbWl0ZWQgYnk6Ci0KLSAgICAgICAgc29tYXhjb25uICAgICAgICAgICAgICAgU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcGVuZGluZyByZXF1ZXN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkIHRvIHdhaXQgb24gYSBsaXN0ZW5pbmcgc29ja2V0LiAgVGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgdmFsdWUgaW4gRGlnaXRhbCBVTklYIFYzLjIgaXMgOC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXRjaCBraXQgaW5jcmVhc2VzIHRoZSBkZWZhdWx0IHRvIDEwMjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIG1hdGNoZXMgdGhlIHZhbHVlIGluIERpZ2l0YWwgVU5JWCBWNC4wLgotCi0gICAgICAgIHNvbWluY29ubiAgICAgICAgICAgICAgIFNldHMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHBlbmRpbmcgY29ubmVjdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCBvbiBhIGxpc3RlbmluZyBzb2NrZXQuICBXaGVuIGEgdXNlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzIGNhbGxzIGxpc3RlbiB3aXRoIGEgYmFja2xvZyBsZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gc29taW5jb25uLCB0aGUgYmFja2xvZyB3aWxsIGJlIHNldCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21pbmNvbm4uICBzb21pbmNvbm4gb3ZlcnJpZGVzIHNvbWF4Y29ubi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgMS4KLQotICAgICAgICBUaGUgZWZmZWN0aXZlbmVzcyBvZiB0dW5pbmcgdGhlc2UgcGFyYW1ldGVycyBjYW4gYmUgbW9uaXRvcmVkIGJ5Ci0gICAgICAgIHRoZSBzb2JhY2tsb2cgdmFyaWFibGVzIGF2YWlsYWJsZSBpbiB0aGUga2VybmVsOgotCi0gICAgICAgIHNvYmFja2xvZ19oaXdhdCAgICAgICAgIFRyYWNrcyB0aGUgbWF4aW11bSBwZW5kaW5nIHJlcXVlc3RzIHRvIGFueQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuICBUaGUgaW5pdGlhbCB2YWx1ZSBpcyAwLgotCi0gICAgICAgIHNvYmFja2xvZ19kcm9wcyAgICAgICAgIFRyYWNrcyB0aGUgbnVtYmVyIG9mIGRyb3BzIGV4Y2VlZGluZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0IHNldCBiYWNrbG9nIGxpbWl0LiAgVGhlIGluaXRpYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaXMgMC4KLQotICAgICAgICBzb21heGNvbm5fZHJvcHMgICAgICAgICBUcmFja3MgdGhlIG51bWJlciBvZiBkcm9wcyBleGNlZWRpbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWF4Y29ubiBsaW1pdC4gIFdoZW4gc29taW5jb25uIGlzIGxhcmdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGFuIHNvbWF4Y29ubiwgdHJhY2tzIHRoZSBudW1iZXIgb2YgZHJvcHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZWVkaW5nIHNvbWluY29ubi4gIFRoZSBpbml0aWFsIHZhbHVlIGlzIDAuCi0KLSAgICAgICAgVENQIHRpbWVyIHBhcmFtZXRlcnMgYWxzbyBhZmZlY3QgcGVyZm9ybWFuY2UuIFR1bmluZyB0aGUgZm9sbG93aW5nCi0gICAgICAgIHJlcXVpcmUgc29tZSBrbm93bGVkZ2Ugb2YgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgbmV0d29yay4KLQotICAgICAgICB0Y3BfbXNsICAgICAgICAgICAgICAgICBTZXRzIHRoZSB0Y3AgbWF4aW11bSBzZWdtZW50IGxpZmV0aW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBtYXhpbXVtIGxpZmV0aW1lIGluIGhhbGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyB0aGF0IGEgcGFja2V0IGNhbiBiZSBpbiB0cmFuc2l0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBuZXR3b3JrLiAgVGhpcyB2YWx1ZSwgd2hlbiBkb3VibGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0aGUgbGVuZ3RoIG9mIHRpbWUgYSBjb25uZWN0aW9uIHJlbWFpbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIFRJTUVfV0FJVCBzdGF0ZSBhZnRlciBhIGluY29taW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlIHJlcXVlc3QgaXMgcHJvY2Vzc2VkLiAgVGhlIHVuaXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGluIDEvMiBzZWNvbmRzLCB0aGUgaW5pdGlhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpcyA2MC4KLQotICAgICAgICB0Y3BfcmV4bWl0X2ludGVydmFsX21pbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRzIHRoZSBtaW5pbXVtIFRDUCByZXRyYW5zbWl0IGludGVydmFsLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3Igc29tZSBXQU4gbmV0d29ya3MgdGhlIGRlZmF1bHQgdmFsdWUgbWF5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHRvbyBzaG9ydCwgY2F1c2luZyB1bm5lY2Vzc2FyeSBkdXBsaWNhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0cyB0byBiZSBzZW50LiAgVGhlIHVuaXQgaXMgc3BlY2lmaWVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIDEvMiBzZWNvbmRzLCB0aGUgaW5pdGlhbCB2YWx1ZSBpcyAxLgotCi0gICAgICAgIHRjcF9rZWVwaW5pdCAgICAgICAgICAgIFRoaXMgaXMgdGhlIGFtb3VudCBvZiB0aW1lIGEgcGFydGlhbGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzdGFibGlzaGVkIGNvbm5lY3Rpb24gd2lsbCBzaXQgb24gdGhlIGxpc3RlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSBiZWZvcmUgdGltaW5nIG91dCAoPEVNPmUuZy48L0VNPiwgaWYgYSBjbGllbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZHMgYSBTWU4gYnV0IG5ldmVyIGFuc3dlcnMgb3VyIFNZTi9BQ0spLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aWFsbHkgZXN0YWJsaXNoZWQgY29ubmVjdGlvbnMgdGllIHVwIHNsb3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBsaXN0ZW4gcXVldWUuICBJZiB0aGUgcXVldWUgc3RhcnRzIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgd2l0aCBjb25uZWN0aW9ucyBpbiBTWU5fUkNWRCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwX2tlZXBpbml0IGNhbiBiZSBkZWNyZWFzZWQgdG8gbWFrZSB0aG9zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsIGNvbm5lY3RzIHRpbWUgb3V0IHNvb25lci4gIFRoaXMgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgd2l0aCBjYXV0aW9uLCBzaW5jZSB0aGVyZSBtaWdodCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdpdGltYXRlIGNsaWVudHMgdGhhdCBhcmUgdGFraW5nIGEgd2hpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVzcG9uZCB0byBTWU4vQUNLLiAgVGhlIHVuaXQgaXMgc3BlY2lmaWVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIDEvMiBzZWNvbmRzLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAxNTAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGllLiA3NSBzZWNvbmRzKS4KLQotICAgICAgICBUaGUgaGFzaGxpc3Qgc2l6ZSBmb3IgdGhlIFRDUCBpbnBjYiBsb29rdXAgdGFibGUgaXMgcmVndWxhdGVkIGJ5OgotCi0gICAgICAgIHRjYmhhc2hzaXplICAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgaGFzaCBidWNrZXRzIHVzZWQgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ1AgY29ubmVjdGlvbiB0YWJsZSB1c2VkIGluIHRoZSBrZXJuZWwuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBpbml0aWFsIHZhbHVlIGlzIDMyLiAgRm9yIGJlc3QgcmVzdWx0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIHNwZWNpZmllZCBhcyBhIHBvd2VyIG9mIDIuICBGb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzeSBXZWIgc2VydmVycywgc2V0IHRoaXMgdG8gMjA0OCBvciBtb3JlLgotCi0gICAgICAgIFRoZSBoYXNobGlzdCBzaXplIGZvciB0aGUgaW50ZXJmYWNlIGFsaWFzIHRhYmxlIGlzIHJlZ3VsYXRlZCBieToKLQotICAgICAgICBpbmlmYWRkcl9oc2l6ZSAgICAgICAgICBUaGUgbnVtYmVyIG9mIGhhc2ggYnVja2V0cyB1c2VkIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIGFsaWFzIHRhYmxlIHVzZWQgaW4gdGhlIGtlcm5lbC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGluaXRpYWwgdmFsdWUgaXMgMzIuICBGb3IgYmVzdCByZXN1bHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgc3BlY2lmaWVkIGFzIGEgcG93ZXIgb2YgMi4KLQotICAgICAgICBpcHBvcnRfdXNlcnJlc2VydmVkICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudCBub24tcmVzZXJ2ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBwb3J0cy4gIERlZmF1bHQgcmFuZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgMTAyNS01MDAwLiAgVGhlIG1heGltdW0gdmFsdWUgaXMgNjU1MzUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbGltaXRzIHRoZSBudW1lciBvZiB0aW1lcyB5b3UgY2FuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXVsdGFuZW91c2x5IHRlbG5ldCBvciBmdHAgb3V0IHRvIGNvbm5lY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gb3RoZXIgc3lzdGVtcy4KLQotICAgICAgICB0Y3Bub2RlbGFjayAgICAgICAgICAgICBEb24ndCBkZWxheSBhY2tub3dsZWRnaW5nIFRDUCBkYXRhOyB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBzb21ldGltZXMgaW1wcm92ZSBwZXJmb3JtYW5jZSBvZiBsb2NhbGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBDQUQgcGFja2FnZXMuICBEZWZhdWx0IGlzIHZhbHVlIGlzIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbmFibGVkIHZhbHVlIGlzIDEuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERpZ2l0YWwgVU5JWCB2ZXJzaW9uOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjMuMkMKLUZlYXR1cmUgICAgICAgICAgICAgICAgICAgIFYzLjJDICBwYXRjaCAgVjQuMAotPT09PT09PSAgICAgICAgICAgICAgICAgICAgPT09PT0gID09PT09ICA9PT09Ci1zb21heGNvbm4gICAgICAgICAgICAgICAgICAgWCAgICAgIFggICAgICBYCi1zb21pbmNvbm4gICAgICAgICAgICAgICAgICAgLSAgICAgIFggICAgICBYCi1zb2JhY2tsb2dfaGl3YXQgICAgICAgICAgICAgLSAgICAgIFggICAgICAtCi1zb2JhY2tsb2dfZHJvcHMgICAgICAgICAgICAgLSAgICAgIFggICAgICAtCi1zb21heGNvbm5fZHJvcHMgICAgICAgICAgICAgLSAgICAgIFggICAgICAtCi10Y3Bub2RlbGFjayAgICAgICAgICAgICAgICAgWCAgICAgIFggICAgICBYCi10Y3Bfa2VlcGlkbGUgICAgICAgICAgICAgICAgWCAgICAgIFggICAgICBYCi10Y3Bfa2VlcGludHZsICAgICAgICAgICAgICAgWCAgICAgIFggICAgICBYCi10Y3Bfa2VlcGNudCAgICAgICAgICAgICAgICAgLSAgICAgIFggICAgICBYCi10Y3Bfa2VlcGluaXQgICAgICAgICAgICAgICAgLSAgICAgIFggICAgICBYCi1UQ1Aga2VlcGFsaXZlIHBlci1zb2NrZXQgICAgLSAgICAgIC0gICAgICBYCi10Y3BfbXNsICAgICAgICAgICAgICAgICAgICAgLSAgICAgIFggICAgICAtCi10Y3BfcmV4bWl0X2ludGVydmFsX21pbiAgICAgLSAgICAgIFggICAgICAtCi1UQ1AgaW5wY2IgaGFzaGluZyAgICAgICAgICAgLSAgICAgIFggICAgICBYCi10Y2JoYXNoc2l6ZSAgICAgICAgICAgICAgICAgLSAgICAgIFggICAgICBYCi1pbnRlcmZhY2UgYWxpYXMgaGFzaGluZyAgICAgLSAgICAgIFggICAgICBYCi1pbmlmYWRkcl9oc2l6ZSAgICAgICAgICAgICAgLSAgICAgIFggICAgICBYCi1pcHBvcnRfdXNlcnJlc2VydmVkICAgICAgICAgLSAgICAgIFggICAgICAtCi1zeXNjb25maWcgLXEgaW5ldCAgICAgICAgICAgLSAgICAgIC0gICAgICBYCi1zeXNjb25maWcgLXEgc29ja2V0ICAgICAgICAgLSAgICAgIC0gICAgICBYCi0KLTwvUFJFPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3BsYXRmb3JtL3BlcmYtaHAuaHRtbCBiL2RvY3MvbWFudWFsL3BsYXRmb3JtL3BlcmYtaHAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5MDJhMC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9wbGF0Zm9ybS9wZXJmLWhwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5SdW5uaW5nIGEgSGlnaC1QZXJmb3JtYW5jZSBXZWIgU2VydmVyIG9uIEhQVVg8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPEEgTkFNRT0iaW5pdGlhbCI+Jm5ic3A7PC9BPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLQotPEgxIEFMSUdOPSJDRU5URVIiPlJ1bm5pbmcgYSBIaWdoLVBlcmZvcm1hbmNlIFdlYiBTZXJ2ZXIgZm9yIEhQVVg8L0gxPgotCi08UFJFPgotRGF0ZTogV2VkLCAwNSBOb3YgMTk5NyAxNjo1OTozNCAtMDgwMAotRnJvbTogUmljayBKb25lcyAmbHQ7PEEgSFJFRj0ibWFpbHRvOnJhakBjdXAuaHAuY29tIj5yYWpAY3VwLmhwLmNvbTwvQT4mZ3Q7Ci1SZXBseS1UbzogcmFqQGN1cC5ocC5jb20KLU9yZ2FuaXphdGlvbjogTmV0d29yayBQZXJmb3JtYW5jZQotU3ViamVjdDogSFAtVVggdHVuaW5nIHRpcHMKLTwvUFJFPgotCi1IZXJlIGFyZSBzb21lIHR1bmluZyB0aXBzIGZvciBIUC1VWCB0byBhZGQgdG8gdGhlIHR1bmluZyBwYWdlLgotCi08UD4KLQotRm9yIEhQLVVYIDkuWDogVXBncmFkZSB0byAxMC4yMDxCUj4KLUZvciBIUC1VWCAxMC5bMDB8MDF8MTBdOiBVcGdyYWRlIHRvIDEwLjIwCi0KLTxQPgotCi1Gb3IgSFAtVVggMTAuMjA6IAotCi08UD4KLQotSW5zdGFsbCB0aGUgbGF0ZXN0IGN1bXVsYXRpdmUgQVJQQSBUcmFuc3BvcnQgUGF0Y2guIFRoaXMgd2lsbCBhbGxvdyB5b3UKLXRvIGNvbmZpZ3VyZSB0aGUgc2l6ZSBvZiB0aGUgVENQIGNvbm5lY3Rpb24gbG9va3VwIGhhc2ggdGFibGUuIFRoZQotZGVmYXVsdCBpcyAyNTYgYnVja2V0cyBhbmQgbXVzdCBiZSBzZXQgdG8gYSBwb3dlciBvZiB0d28uIFRoaXMgaXMKLWFjY29tcGxpc2hlZCB3aXRoIGFkYiBhZ2FpbnN0IHRoZSAqZGlzYyogaW1hZ2Ugb2YgdGhlIGtlcm5lbC4gVGhlCi12YXJpYWJsZSBuYW1lIGlzIHRjcF9oYXNoX3NpemUuCi0KLU5vdGljZSB0aGF0IGl0J3MgY3JpdGljYWxseSBpbXBvcnRhbnQgdGhhdCB5b3UgdXNlICJXIiB0byB3cml0ZSBhIDMyIGJpdAotcXVhbnRpdHksIG5vdCAidyIgdG8gd3JpdGUgYSAxNiBiaXQgdmFsdWUgd2hlbiBwYXRjaGluZyB0aGUgZGlzYyBpbWFnZSBiZWNhdXNlCi10aGUgdGNwX2hhc2hfc2l6ZSB2YXJpYWJsZSBpcyBhIDMyIGJpdCBxdWFudGl0eS4KLQotPFA+Ci0KLUhvdyB0byBwaWNrIHRoZSB2YWx1ZT8gRXhhbWluZSB0aGUgb3V0cHV0IG9mCi08QSBIUkVGPSJmdHA6Ly9mdHAuY3VwLmhwLmNvbS9kaXN0L25ldHdvcmtpbmcvdG9vbHMvY29ubmhpc3QiPgotZnRwOi8vZnRwLmN1cC5ocC5jb20vZGlzdC9uZXR3b3JraW5nL3Rvb2xzL2Nvbm5oaXN0PC9BPiBhbmQgc2VlIGhvdyBtYW55Ci10b3RhbCBUQ1AgY29ubmVjdGlvbnMgZXhpc3Qgb24gdGhlIHN5c3RlbS4gWW91IHByb2JhYmx5IHdhbnQgdGhhdCBudW1iZXIKLWRpdmlkZWQgYnkgdGhlIGhhc2ggdGFibGUgc2l6ZSB0byBiZSByZWFzb25hYmx5IHNtYWxsLCBzYXkgbGVzcyB0aGFuIDEwLgotRm9sa3MgY2FuIGxvb2sgYXQgSFAncyBTUEVDd2ViOTYgZGlzY2xvc3VyZXMgZm9yIHNvbWUgY29tbW9uIHNldHRpbmdzLgotVGhlc2UgY2FuIGJlIGZvdW5kIGF0IDxBIEhSRUY9Imh0dHA6Ly93d3cuc3BlY2JlbmNoLm9yZy8iPgotaHR0cDovL3d3dy5zcGVjYmVuY2gub3JnLzwvQT4uIElmIGFuIEhQLVVYIHN5c3RlbSB3YXMKLXBlcmZvcm1pbmcgYXQgMTAwMCBTUEVDd2ViOTYgY29ubmVjdGlvbnMgcGVyIHNlY29uZCwgdGhlIFRJTUVfV0FJVCB0aW1lCi1vZiA2MCBzZWNvbmRzIHdvdWxkIG1lYW4gNjAsMDAwIFRDUCAiY29ubmVjdGlvbnMiIGJlaW5nIHRyYWNrZWQuIAotCi08UD4KLQotRm9sa3MgY2FuIGNoZWNrIHRoZWlyIGxpc3RlbiBxdWV1ZSBkZXB0aHMgd2l0aAotPEEgSFJFRj0iZnRwOi8vZnRwLmN1cC5ocC5jb20vZGlzdC9uZXR3b3JraW5nL21pc2MvbGlzdGVucSI+Ci1mdHA6Ly9mdHAuY3VwLmhwLmNvbS9kaXN0L25ldHdvcmtpbmcvbWlzYy9saXN0ZW5xPC9BPi4KLQotPFA+Ci0KLUlmIGZvbGtzIGFyZSBydW5uaW5nIEFwYWNoZSBvbiBhIFBBLTgwMDAgYmFzZWQgc3lzdGVtLCB0aGV5IHNob3VsZAotY29uc2lkZXIgImNoYXRyJ2luZyIgdGhlIEFwYWNoZSBleGVjdXRhYmxlIHRvIGhhdmUgYSBsYXJnZSBwYWdlIHNpemUuCi1UaGlzIHdvdWxkIGJlICJjaGF0ciArcGkgTCAmbHQ7QklOQVJZJmd0Oy4iIFRoZSBHSUQgb2YgdGhlIHJ1bm5pbmcgZXhlY3V0YWJsZQotbXVzdCBoYXZlIE1MT0NLIHByaXZpbGVnZXMuIFNldHByaXZncnAoMW0pIHNob3VsZCBiZSBjb25zdWx0ZWQgZm9yCi1hc3NpZ25pbmcgTUxPQ0suIFRoZSBjaGFuZ2UgY2FuIGJlIHZhbGlkYXRlZCBieSBydW5uaW5nIEdsYW5jZSBhbmQKLWV4YW1pbmluZyB0aGUgbWVtb3J5IHJlZ2lvbnMgb2YgdGhlIHNlcnZlcihzKSB0byBtYWtlIHN1cmUgdGhhdCB0aGV5Ci1zaG93IGEgbm9uLXRyaXZpYWwgZnJhY3Rpb24gb2YgdGhlIHRleHQgc2VnbWVudCBiZWluZyBsb2NrZWQuCi0KLTxQPgotCi1JZiBmb2xrcyBhcmUgcnVubmluZyBBcGFjaGUgb24gTVAgc3lzdGVtcywgdGhleSBtaWdodCBjb25zaWRlciB3cml0aW5nIGEKLXNtYWxsIHByb2dyYW0gdGhhdCB1c2VzIG1wY3RsKCkgdG8gYmluZCBwcm9jZXNzZXMgdG8gcHJvY2Vzc29ycy4gQQotc2ltcGxlIHBpZCAlIG51bWNwdSBhbGdvcml0aG0gaXMgcHJvYmFibHkgc3VmZmljaWVudC4gVGhpcyBtaWdodCBldmVuIGdvCi1pbnRvIHRoZSBzb3VyY2UgY29kZS4KLQotPFA+Ci0KLUlmIGZvbGtzIGFyZSBjb25jZXJuZWQgYWJvdXQgdGhlIG51bWJlciBvZiBGSU5fV0FJVF8yIGNvbm5lY3Rpb25zLCB0aGV5Ci1jYW4gdXNlIG5ldHR1bmUgdG8gc2hyaW5rIHRoZSB2YWx1ZSBvZiB0Y3Bfa2VlcHN0YXJ0LiBIb3dldmVyLCB0aGV5Ci1zaG91bGQgYmUgY2FyZWZ1bCB0aGVyZSAtIGNlcnRhaW5seSBkbyBub3QgbWFrZSBpdCBsZXNzIHRoYW4gb2ggdHdvIHRvCi1mb3VyIG1pbnV0ZXMuIElmIHRjcF9oYXNoX3NpemUgaGFzIGJlZW4gc2V0IHdlbGwsIGl0IGlzIHByb2JhYmx5IE9LIHRvCi1sZXQgdGhlIEZJTl9XQUlUXzIncyB0YWtlIGxvbmdlciB0byB0aW1lb3V0IChwZXJoYXBzIGV2ZW4gdGhlIGRlZmF1bHQKLXR3byBob3VycykgLSB0aGV5IHdpbGwgbm90IG9uIGF2ZXJhZ2UgaGF2ZSBhIGJpZyBpbXBhY3Qgb24gcGVyZm9ybWFuY2UuCi0KLTxQPgotCi1UaGVyZSBhcmUgb3RoZXIgdGhpbmdzIHRoYXQgY291bGQgZ28gaW50byB0aGUgY29kZSBiYXNlLCBidXQgdGhhdCBtaWdodAotYmUgbGVmdCBmb3IgYW5vdGhlciBlbWFpbC4gRmVlbCBmcmVlIHRvIGRyb3AgbWUgYSBtZXNzYWdlIGlmIHlvdSBvcgotb3RoZXJzIGFyZSBpbnRlcmVzdGVkLgotCi08UD4KLQotc2luY2VyZWx5LAotCi08UD4KLQotcmljayBqb25lczxCUj4KLTxBIEhSRUY9Imh0dHA6Ly93d3cuY3VwLmhwLmNvbS9uZXRwZXJmL05ldHBlcmZQYWdlLmh0bWwiPgotaHR0cDovL3d3dy5jdXAuaHAuY29tL25ldHBlcmYvTmV0cGVyZlBhZ2UuaHRtbDwvQT4KLQotPEhSPgotCi08SDMgQUxJR049IkNFTlRFUiI+Ci0gQXBhY2hlIEhUVFAgU2VydmVyIFZlcnNpb24gMS4zCi08L0gzPgotCi08QSBIUkVGPSIuLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9pbmRleC5naWYiIEFMVD0iSW5kZXgiPjwvQT4KLTxBIEhSRUY9Ii4uLyI+PElNRyBTUkM9Ii4uL2ltYWdlcy9ob21lLmdpZiIgQUxUPSJIb21lIj48L0E+Ci0KLTwvQk9EWT48L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3BsYXRmb3JtL3BlcmYuaHRtbCBiL2RvY3MvbWFudWFsL3BsYXRmb3JtL3BlcmYuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNiZDViNS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9wbGF0Zm9ybS9wZXJmLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5IaW50cyBvbiBSdW5uaW5nIGEgSGlnaC1QZXJmb3JtYW5jZSBXZWIgU2VydmVyPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+SGludHMgb24gUnVubmluZyBhIEhpZ2gtUGVyZm9ybWFuY2UgV2ViIFNlcnZlcjwvSDE+Ci0KLVJ1bm5pbmcgQXBhY2hlIG9uIGEgaGVhdmlseSBsb2FkZWQgd2ViIHNlcnZlciwgb25lIG9mdGVuIGVuY291bnRlcnMKLXByb2JsZW1zIHJlbGF0ZWQgdG8gdGhlIG1hY2hpbmUgYW5kIE9TIGNvbmZpZ3VyYXRpb24uICAiSGVhdnkiIGlzCi1yZWxhdGl2ZSwgb2YgY291cnNlIC0gYnV0IGlmIHlvdSBhcmUgc2VlaW5nIG1vcmUgdGhhbiBhIGNvdXBsZSBoaXRzCi1wZXIgc2Vjb25kIG9uIGEgc3VzdGFpbmVkIGJhc2lzIHlvdSBzaG91bGQgY29uc3VsdCB0aGUgcG9pbnRlcnMgb24KLXRoaXMgcGFnZS4gIEluIGdlbmVyYWwgdGhlIHN1Z2dlc3Rpb25zIGludm9sdmUgaG93IHRvIHR1bmUgeW91ciBrZXJuZWwKLWZvciB0aGUgaGVhdmllciBUQ1AgbG9hZCwgaGFyZHdhcmUvc29mdHdhcmUgY29uZmxpY3RzIHRoYXQgYXJpc2UsIDxFTT5ldGMuPC9FTT4KLQotPFVMPgotPExJPjxBIEhSRUY9IiNBVVgiPkEvVVggKEFwcGxlJ3MgVU5JWCk8L0E+Ci08TEk+PEEgSFJFRj0iI0JTRCI+QlNELWJhc2VkIChCU0RJLCBGcmVlQlNELCBldGMpPC9BPgotPExJPjxBIEhSRUY9IiNERUMiPkRpZ2l0YWwgVU5JWDwvQT4KLTxMST48QSBIUkVGPSJwZXJmLWhwLmh0bWwiPkhQVVg8L0E+Ci08TEk+PEEgSFJFRj0iI0xpbnV4Ij5MaW51eDwvQT4KLTxMST48QSBIUkVGPSIjU29sYXJpcyI+U29sYXJpczwvQT4KLTxMST48QSBIUkVGPSIjU3VuT1MiPlN1bk9TIDQueDwvQT4KLTxMST48QSBIUkVGPSIjU1ZSNCI+U1ZSNDwvQT4KLTwvVUw+Ci0KLTxIUj4KLQotPEgzPjxBIE5BTUU9IkFVWCI+Ci1BL1VYIChBcHBsZSdzIFVOSVgpCi08L0E+PC9IMz4KLQotSWYgeW91IGFyZSBydW5uaW5nIEFwYWNoZSBvbiBBL1VYLCBhIHBhZ2UgdGhhdCBnaXZlcyBzb21lIGhlbHBmdWwKLXBlcmZvcm1hbmNlIGhpbnRzIChjb25jZXJuaW5nIHRoZSA8RU0+bGlzdGVuKCk8L0VNPiBxdWV1ZSBhbmQgdXNpbmcKLXZpcnR1YWwgaG9zdHMpCi08QSBIUkVGPSJodHRwOi8vd3d3LmphZ3VORVQuY29tL2FwYWNoZS5odG1sIj5jYW4gYmUgZm91bmQgaGVyZTwvQT4KLQotPFA+PEhSPgotCi08SDM+PEEgTkFNRT0iQlNEIj4KLUJTRC1iYXNlZCAoQlNESSwgRnJlZUJTRCwgZXRjKQotPC9BPjwvSDM+Ci0KLTxBIEhSRUY9InBlcmYtYnNkNDQuaHRtbCNpbml0aWFsIj5RdWljazwvQT4gYW5kCi08QSBIUkVGPSJwZXJmLWJzZDQ0Lmh0bWwjZGV0YWlsIj5kZXRhaWxlZDwvQT4KLXBlcmZvcm1hbmNlIHR1bmluZyBoaW50cyBmb3IgQlNELWRlcml2ZWQgc3lzdGVtcy4KLQotPFA+PEhSPgotCi08SDM+PEEgTkFNRT0iREVDIj4KLURpZ2l0YWwgVU5JWAotPC9BPjwvSDM+Ci0KLTxVTD4KLSAgPExJPjxBCi0gICAgICAgSFJFRj0iaHR0cDovL3d3dy5kaWdpdGFsLmNvbS9pbmZvL2ludGVybmV0L2RvY3VtZW50L2lhcy90dW5pbmcuaHRtbCIKLSAgICAgID5ESUdJVEFMIFVOSVggVHVuaW5nIFBhcmFtZXRlcnMgZm9yIFdlYiBTZXJ2ZXJzPC9BPgotICA8TEk+V2UgaGF2ZSBzb21lIDxBIEhSRUY9InBlcmYtZGVjLmh0bWwiPm5ld3Nncm91cCBwb3N0aW5nczwvQT4gb24gaG93Ci0gICAgICB0byB0dW5lIERpZ2l0YWwgVU5JWCAzLjIgYW5kIDQuMC4KLTwvVUw+Ci0KLTxQPjxIUj4KLQotPEgzPjxBIE5BTUU9IkxpbnV4Ij4KLUxpbnV4Ci08L0E+PC9IMz4KLQotVGhlcmUgYXJlIG5vIGtub3duIHByb2JsZW1zIHdpdGggaGVhdmlseSBsb2FkZWQgc3lzdGVtcyBydW5uaW5nIExpbnV4Ci1rZXJuZWxzIDIuMC4zMiBvciBsYXRlci4gIEVhcmxpZXIga2VybmVscyBoYXZlIHNvbWUgcHJvYmxlbXMsIGFuZCBhbgotdXBncmFkZSB0byB0aGUgbGF0ZXN0IDIuMC54IGlzIGEgZ29vZCBpZGVhIHRvIGVsaW1pbmF0ZSB2YXJpb3VzIHNlY3VyaXR5Ci1hbmQgZGVuaWFsIG9mIHNlcnZpY2UgYXR0YWNrcy4KLQotPFA+PEhSPgotCi08SDM+PEEgTkFNRT0iU29sYXJpcyI+Ci1Tb2xhcmlzIDIuNAotPC9BPjwvSDM+Ci0KLVRoZSBTb2xhcmlzIDIuNCBUQ1AgaW1wbGVtZW50YXRpb24gaGFzIGEgZmV3IGluaGVyZW50IGxpbWl0YXRpb25zIHRoYXQKLW9ubHkgYmVjYW1lIGFwcGFyZW50IHVuZGVyIGhlYXZ5IGxvYWRzLiAgVGhpcyBoYXMgYmVlbiBmaXhlZCB0byBzb21lCi1leHRlbnQgaW4gMi41IChhbmQgY29tcGxldGVseSByZXZhbXBlZCBpbiAyLjYpLCBidXQgZm9yIG5vdyBjb25zdWx0Ci10aGUgZm9sbG93aW5nIFVSTCBmb3IgdGlwcyBvbiBob3cgdG8gZXhwYW5kIHRoZSBjYXBhYmlsaXRpZXMgaWYgeW91Ci1hcmUgZmluZGluZyBzbG93ZG93bnMgYW5kIGxhZ3MgYXJlIGh1cnRpbmcgcGVyZm9ybWFuY2UuCi0KLTxQPgotCi1PdGhlciBsaW5rczoKLQotPFVMPgotCi08TEk+PEEgSFJFRj0iaHR0cDovL3d3dy5zdW4uY29tL3N1bi1vbi1uZXQvcGVyZm9ybWFuY2UuaHRtbCI+Ci1Xb3JsZCBXaWRlIFdlYiBTZXJ2ZXIgUGVyZm9ybWFuY2UsCi0mbHQ7aHR0cDovL3d3dy5zdW4uY29tL3N1bi1vbi1uZXQvcGVyZm9ybWFuY2UuaHRtbCZndDs8L0E+Ci08TEk+PEEgSFJFRj0iaHR0cDovL3d3dy5ydnMudW5pLWhhbm5vdmVyLmRlL3Blb3BsZS92b2Vja2xlci90dW5lL0VOL3R1bmUuaHRtbCI+Ci1Tb2xhcmlzIDIueCAtIHR1bmluZyB5b3VyIFRDUC9JUCBzdGFjazwvQT4gY29udGFpbnMgc29tZSBnb29kIHRlY2huaWNhbAotaW5mb3JtYXRpb24gYWJvdXQgdHVuaW5nIHZhcmlvdXMgU29sYXJpcyBUQ1AvSVAgcGFyYW1ldGVycy4KLTwvVUw+Ci0KLTxQPjxIUj4KLQotPEgzPjxBIE5BTUU9IlN1bk9TIj4KLVN1bk9TIDQueAotPC9BPjwvSDM+Ci0KLU1vcmUgaW5mb3JtYXRpb24gb24gdHVuaW5nIFNPTUFYQ09OTiBvbiBTdW5PUyBjYW4gYmUgZm91bmQgYXQKLTxBIEhSRUY9Imh0dHA6Ly93d3cuaXNsYW5kbmV0LmNvbS9+bWFyay9zb21heGNvbm4uaHRtbCI+Ci1odHRwOi8vd3d3LmlzbGFuZG5ldC5jb20vfm1hcmsvc29tYXhjb25uLmh0bWw8L0E+LgotCi08UD48SFI+Ci0KLTxIMz48QSBOQU1FPSJTVlI0Ij4KLVNWUjQKLTwvQT48L0gzPgotCi1Tb21lIFNWUjQgdmVyc2lvbnMgd2FzdGUgdGhyZWUgc3lzdGVtIGNhbGxzIG9uIGV2ZXJ5Ci08U0FNUD5nZXR0aW1lb2ZkYXkoKTwvU0FNUD4gY2FsbC4gRGVwZW5kaW5nIG9uIHRoZSBzeW50YWN0aWMKLWZvcm0gb2YgdGhlIDxTQU1QPlRaPC9TQU1QPiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlc2UKLXN5c3RlbXMgaGF2ZSBzZXZlcmFsIGRpZmZlcmVudCBhbGdvcml0aG1zIHRvIGRldGVybWluZSB0aGUKLWxvY2FsIHRpbWUgem9uZSAocHJlc3VtYWJseSA8RU0+Y29tcGF0aWJsZTwvRU0+IHdpdGgKLXNvbWV0aGluZykuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSB1c2VzIHRoZSBjZW50cmFsIGV1cm9wZWFuCi10aW1lIHpvbmUgdG8gZGVtb25zdHJhdGUgdGhpczoKLTxETD4KLSA8RFQ+PFNUUk9ORz5UWj06TUVUPC9TVFJPTkc+Ci0gPEREPlRoaXMgZm9ybSBkZWxlZ2F0ZXMgdGhlIGtub3dsZWRnZSBvZiB0aGUgdGltZSB6b25lCi0gICAgIGluZm9ybWF0aW9uIHRvIGFuIGV4dGVybmFsIGNvbXBpbGVkIHpvbmVpbmZvIGZpbGUKLSAgICAgKCZhZ3JhdmU7IGxhIEJTRCkuPEJSPgotICAgICA8U1RST05HPkNhdmVhdDo8L1NUUk9ORz4gRWFjaCB0aW1lIHRoZSBnZXR0aW1lb2ZkYXkoKQotICAgICBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSBleHRlcm5hbCB6b25lIGluZm8gaXMgcmVhZCBpbgotICAgICBhZ2FpbiAoYXQgbGVhc3Qgb24gc29tZSBTVlI0IHN5c3RlbXMpLiBUaGF0IHJlc3VsdHMgaW4KLSAgICAgdGhyZWUgd2FzdGVkIHN5c3RlbSBjYWxscyB3aXRoIGV2ZXJ5IGFwYWNoZSByZXF1ZXN0Ci0gICAgIHNlcnZlZC48UFJFPgotICAgICBvcGVuKCIvdXNyL2xpYi9sb2NhbGUvVFovTUVUIiwgT19SRE9OTFkpID0gMwotICAgICByZWFkKDMsICJcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMCIuLi4sIDc5NDQpID0gNzc4Ci0gICAgIGNsb3NlKDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA8L1BSRT4KLQotIDxEVD48U1RST05HPlRaPU1FVC0xTURULE0zLjUuMC8wMjowMDowMCxNMTAuNS4wLzAzOjAwOjAwPC9TVFJPTkc+Ci0gPEREPlRoaXMgc3ludGF4IGZvcm0gKCZhZ3JhdmU7IGxhIFNZU1YpIGNvbnRhaW5zIGFsbCB0aGUKLSAgICAga25vd2xlZGdlIGFib3V0IHRpbWUgem9uZSBiZWdpbm5pbmcgYW5kIGVuZGluZyB0aW1lcyBpbgotICAgICBpdHMgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24uIEl0IGhhcyB0byBiZSBwYXJzZWQgZWFjaAotICAgICB0aW1lIGl0IGlzIGV2YWx1YXRlZCwgcmVzdWx0aW5nIGluIGEgc2xpZ2h0IGNvbXB1dGluZwotICAgICBvdmVyaGVhZCwgYnV0IGl0IHJlcXVpcmVzIG5vIHN5c3RlbSBjYWxsLiBUaG91Z2ggdGhlCi0gICAgIHRhYmxlIGxvb2t1cCAmYWdyYXZlOyBsYSBCU0QgaXMgdGhlIG1vcmUgc29waGlzdGljYXRlZAotICAgICB0ZWNobmljYWwgc29sdXRpb24sIHRoZSBiYWQgU1ZSNCBpbXBsZW1lbnRhdGlvbiBtYWtlcwotICAgICB0aGlzIHRoZSBwcmVmZXJyZWQgc3ludGF4IG9uIHN5c3RlbXMgd2hpY2ggb3RoZXJ3aXNlCi0gICAgIGFjY2VzcyB0aGUgZXh0ZXJuYWwgem9uZSBpbmZvIGZpbGUgcmVwZWF0ZWRseS4KLTwvREw+Ci1Zb3Ugc2hvdWxkIHVzZSB0aGUgPFNBTVA+dHJ1c3M8L1NBTVA+IHV0aWxpdHkgb24gYQotc2luZ2xlLXByb2Nlc3MgYXBhY2hlIHNlcnZlciAoc3RhcnRlZCB3aXRoIHRoZSA8U0FNUD4tWDwvU0FNUD4KLWRlYnVnZ2luZyBzd2l0Y2gpIHRvIGRldGVybWluZSB3aGV0aGVyIHlvdXIgc3lzdGVtIGNhbiBwcm9maXQKLWZyb20gdGhlIHNlY29uZCBmb3JtIG9mIHRoZSA8U0FNUD5UWjwvU0FNUD4gZW52aXJvbm1lbnQKLXZhcmlhYmxlLiBJZiBpdCBkb2VzLCB5b3UgY291bGQgaW50ZWdyYXRlIHRoZSBzZXR0aW5nIG9mIHRoZQotcHJlZmVycmVkIDxTQU1QPlRaPC9TQU1QPiBzeW50YXggaW50byB0aGUgaHR0cGQgc3RhcnR1cAotc2NyaXB0LCB3aGljaCBpcyB1c3VhbGx5IHNpbXBseSBhIGNvcHkgb2YgKG9yIHN5bWJvbGljIGxpbmsKLXRvKSB0aGUgPFNBTVA+YXBhY2hlY3RsPC9TQU1QPiB1dGlsaXR5IHNjcmlwdCwgb3IgaW50byB0aGUKLXN5c3RlbSdzIDxTQU1QPi9ldGMvVElNRVpPTkU8L1NBTVA+IHNjcmlwdC4KLQotPFA+PEhSPgotCi08SDM+TW9yZSB3ZWxjb21lITwvSDM+Ci0KLUlmIHlvdSBoYXZlIHRpcHMgdG8gY29udHJpYnV0ZSwgc2VuZCBtYWlsIHRvIDxBCi1IUkVGPSJtYWlsdG86YXBhY2hlQGFwYWNoZS5vcmciPmFwYWNoZUBhcGFjaGUub3JnPC9BPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPjwvSFRNTD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvcGxhdGZvcm0vcmVhZG1lLXRwZi5odG1sIGIvZG9jcy9tYW51YWwvcGxhdGZvcm0vcmVhZG1lLXRwZi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDFhODJhLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL3BsYXRmb3JtL3JlYWRtZS10cGYuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPlRoZSBBcGFjaGUgVFBGIFBvcnQ8L1RJVExFPgotPC9IRUFEPgotPEJPRFk+Ci08QSBOQU1FPSJ0b3AiPjwvQT4KLTxIMSBhbGlnbj0iY2VudGVyIj5PdmVydmlldyBvZiB0aGUgQXBhY2hlIFRQRiBQb3J0PC9IMT4KLTxIUj4KLTxDRU5URVI+WyZuYnNwOzxBIEhSRUY9IiNjb25maWd1cmF0aW9uX2ZpbGVzIj5Db25maWd1cmF0aW9uIEZpbGVzPC9BPgotICAgJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiN3aGF0c19hdmFpbGFibGUiPldoYXQncyBBdmFpbGFibGU8L0E+Ci0gICAmbmJzcDt8Jm5ic3A7PEEgSFJFRj0iI3BvcnRpbmdfbm90ZXMiPlBvcnRpbmcgTm90ZXM8L0E+Jm5ic3A7XQotPC9DRU5URVI+Ci08SFI+Ci08QlI+Ci0KLTxQPgotICAgVGhpcyB2ZXJzaW9uIG9mIEFwYWNoZSBpbmNsdWRlcyBjaGFuZ2VzIGFsbG93aW5nIGl0IHRvIHJ1biBvbgotICAgSUJNJ3MgRUJDRElDLWJhc2VkCi0gICA8QSBIUkVGPSJodHRwOi8vd3d3LnMzOTAuaWJtLmNvbS9wcm9kdWN0cy90cGYvdHBmaHAuaHRtbCI+VFBGPC9BPgotICAgKFRyYW5zYWN0aW9uIFByb2Nlc3NpbmcgRmFjaWxpdHkpIG9wZXJhdGluZyBzeXN0ZW0uCi0gICBVbmxlc3Mgb3RoZXJ3aXNlIG5vdGVkIFRQRiB2ZXJzaW9uIDQuMSBQVVQwOSBpcyByZXF1aXJlZC4KLSAgIDxCUj48QlI+Ci0gICBSZWZlciB0byBodGRvY3MvbWFudWFsLzxBIEhSRUY9Imluc3RhbGwtdHBmLmh0bWwiPmluc3RhbGwtdHBmLmh0bWw8L0E+Ci0gICBmb3Igc3RlcC1ieS1zdGVwIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuCi0gICA8QlI+PEJSPgotICAgQXMgdGhpcyBpcyB0aGUgZmlyc3QgY3V0IGF0IG1ha2luZyBBcGFjaGUgcnVuIG9uIFRQRiwKLSAgIHBlcmZvcm1hbmNlIHR1bmluZyBoYXMgbm90IGJlZW4gZG9uZS4KLSAgIDxCUj48QlI+Ci0gICBUaGlzIHBvcnQgYnVpbGRzIHVwb24gdGhlIDxBIEhSRUY9ImViY2RpYy5odG1sIj5FQkNESUMgY2hhbmdlczwvQT4KLSAgIHByZXZpb3VzbHkgbWFkZSB0byBBcGFjaGUuCi0gICA8QlI+Ci08L1A+Ci0KLTxBIE5BTUU9ImNvbmZpZ3VyYXRpb25fZmlsZXMiPiZuYnNwOzwvQT4KLTxIMiBhbGlnbj1jZW50ZXI+QXBhY2hlIENvbmZpZ3VyYXRpb24gRmlsZXM8L0gyPgotPFA+Ci0gICBUaGUgZGlzdHJpYnV0ZWQgY29uZmlndXJhdGlvbiBmaWxlcyAoaHR0cGQuY29uZi1kaXN0IGFuZAotICAgbWltZS50eXBlcywgYm90aCBsb2NhdGVkIGluIHRoZSBjb25mIHN1YmRpcmVjdG9yeSkKLSAgIHdvcmsgb24gVFBGLiAgUGVyZm9ybWFuY2UgY29uc2lkZXJhdGlvbnMgbWF5IGRpY3RhdGUgc2V0dGluZyBLZWVwQWxpdmUgdG8gIk9mZiIKLSAgICh0aGUgZGVmYXVsdCBpcyAiT24iKSBvciBsb3dlcmluZyB0aGUgVGltZW91dCB2YWx1ZSBmcm9tIHRoZSBkZWZhdWx0Ci0gICAzMDAgc2Vjb25kcyAoNSBtaW51dGVzKSBpbiBvcmRlciB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBhY3RpdmUgRUNCcyBvbiB5b3VyIHN5c3RlbS4KLTwvUD4KLQotPEEgTkFNRT0id2hhdHNfYXZhaWxhYmxlIj4mbmJzcDs8L0E+Ci08SDIgYWxpZ249Y2VudGVyPldoYXQncyBBdmFpbGFibGUgaW4gdGhpcyBWZXJzaW9uPC9IMj4KLQotICAgKFRoZSBBcGFjaGUgb3JnYW5pemF0aW9uIHByb3ZpZGVzCi0gICA8QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZG9jcy8iPm9ubGluZSBkb2N1bWVudGF0aW9uPC9BPgotICAgZGVzY3JpYmluZyB0aGUgdmFyaW91cyBtb2R1bGVzIGFuZCBjb21wb25lbnRzIG9mIHRoZSBzZXJ2ZXIuKQotCi08SDM+Q29tcG9uZW50cy9tb2R1bGVzIHRlc3RlZCBvbiBUUEY6PC9IMz4KLQotICAgPG11bHRpY29sIENPTFM9Mz48VUw+Ci0gICA8TEk+YWxsb2MuYwotICAgPExJPmFwX2Jhc2U2NC5jCi0gICA8TEk+YXBfY2hlY2twYXNzLmMKLSAgIDxMST5hcF9jcHlzdHJuLmMKLSAgIDxMST5hcF9mbm1hdGNoLmMKLSAgIDxMST5hcF9tZDVjLmMKLSAgIDxMST5hcF9zaGExLmMKLSAgIDxMST5hcF9zaWduYWwuYwotICAgPExJPmFwX3NsYWNrLmMKLSAgIDxMST5hcF9zbnByaW50Zi5jCi0gICA8TEk+YnVmZi5jCi0gICA8TEk+YnVpbGRtYXJrLmMKLSAgIDxMST5lYmNkaWMuYwotICAgPExJPmdlbl90ZXN0LmNoYXIuYwotICAgPExJPmdlbl91cmlfZGVsaW1zLmMKLSAgIDxMST5odHBhc3N3ZC5jIDxpPjxzbWFsbD4ocmVxdWlyZXMgUFVUMTApPC9zbWFsbD48L2k+Ci0gICA8TEk+aHR0cF9jb25maWcuYwotICAgPExJPmh0dHBfY29yZS5jCi0gICA8TEk+aHR0cF9sb2cuYwotICAgPExJPmh0dHBfbWFpbi5jCi0gICA8TEk+aHR0cF9wcm90b2NvbC5jCi0gICA8TEk+aHR0cF9yZXF1ZXN0LmMKLSAgIDxMST5odHRwX3Zob3N0LmMKLSAgIDxMST5sb2dyZXNvbHZlLmMgPGk+PHNtYWxsPihyZXF1aXJlcyBQVVQxMCk8L3NtYWxsPjwvaT4KLSAgIDxMST5tb2RfYWNjZXNzLmMgPEEgSFJFRj0iI25vdGVzIj4gPGk+PHNtYWxsPihzZWUgbm90ZSAxKTwvc21hbGw+PC9pPjwvQT4KLSAgIDxMST5tb2RfYWN0aW9ucy5jCi0gICA8TEk+bW9kX2FsaWFzLmMKLSAgIDxMST5tb2RfYXNpcy5jCi0gICA8TEk+bW9kX2F1dGguYwotICAgPExJPm1vZF9hdXRoX2Fub24uYwotICAgPExJPm1vZF9hdXRvaW5kZXguYwotICAgPExJPm1vZF9jZXJuX21ldGEuYwotICAgPExJPm1vZF9jZ2kuYyA8aT48c21hbGw+KHJlcXVpcmVzIFBVVDEwKTwvc21hbGw+PC9pPgotICAgPExJPm1vZF9kaWdlc3QuYwotICAgPExJPm1vZF9kaXIuYwotICAgPExJPm1vZF9lbnYuYwotICAgPExJPm1vZF9leGFtcGxlLmMKLSAgIDxMST5tb2RfZXhwaXJlcy5jCi0gICA8TEk+bW9kX2hlYWRlcnMuYwotICAgPExJPm1vZF9pbWFwLmMKLSAgIDxMST5tb2RfaW5jbHVkZS5jIDxBIEhSRUY9IiNub3RlcyI+IDxpPjxzbWFsbD4oc2VlIG5vdGUgMik8L3NtYWxsPjwvaT48L0E+Ci0gICA8TEk+bW9kX2luZm8uYwotICAgPExJPm1vZF9sb2dfYWdlbnQuYwotICAgPExJPm1vZF9sb2dfY29uZmlnLmMKLSAgIDxMST5tb2RfbG9nX3JlZmVyZXIuYwotICAgPExJPm1vZF9taW1lLmMKLSAgIDxMST5tb2RfbWltZV9tYWdpYy5jCi0gICA8TEk+bW9kX25lZ290aWF0aW9uLmMKLSAgIDxMST48QSBIUkVGPSJodHRwOi8vaHB3d3cuZWMtbHlvbi5mci9+dmluY2VudC9hcGFjaGUvbW9kX3B1dC5odG1sIj5tb2RfcHV0LmM8L0E+Ci0gICAgICAgICAgPGk+IDxzbWFsbD4odGhpcmQgcGFydHkgbW9kdWxlKTwvc21hbGw+PC9pPgotICAgPExJPm1vZF9wcm94eS5jCi0gICA8TEk+bW9kX3NldGVudmlmLmMKLSAgIDxMST5tb2Rfc3BlbGluZy5jCi0gICA8TEk+bW9kX3N0YXR1cy5jCi0gICA8TEk+bW9kX3RwZl9zaG1fc3RhdGljLmMgPGk+PHNtYWxsPih0aGlyZCBwYXJ0eSBtb2R1bGUsIHJlcXVpcmVzIFBVVDEwKTwvc21hbGw+PC9pPgotICAgPExJPm1vZF91bmlxdWVfaWQuYyA8aT48c21hbGw+KHJlcXVpcmVzIFBVVDEwKTwvc21hbGw+PC9pPgotICAgPExJPm1vZF91c2VyZGlyLmMKLSAgIDxMST5tb2RfdXNlcnRyYWNrLmMKLSAgIDxMST5vcy5jCi0gICA8TEk+b3MtaW5saW5lLmMKLSAgIDxMST5wcm94eV9jYWNoZS5jCi0gICA8TEk+cHJveHlfY29ubmVjdC5jCi0gICA8TEk+cHJveHlfZnRwLmMKLSAgIDxMST5wcm94eV9odHRwLmMKLSAgIDxMST5wcm94eV91dGlsLmMKLSAgIDxMST5yZWd1bGFyIGV4cHJlc3Npb24gcGFyc2VyCi0gICA8TEk+cmVndWxhciBleHByZXNzaW9uIHRlc3QgdG9vbCA8aT48c21hbGw+KHJlcXVpcmVzIFBVVDEwKTwvc21hbGw+PC9pPgotICAgPExJPnJmYzE0MTMuYwotICAgPExJPnJvdGF0ZWxvZ3MuYyA8aT48c21hbGw+KHJlcXVpcmVzIFBVVDEwKTwvc21hbGw+PC9pPgotICAgPExJPnV0aWwuYwotICAgPExJPnV0aWxfZGF0ZS5jCi0gICA8TEk+dXRpbF9tZDUuYwotICAgPExJPnV0aWxfc2NyaXB0LmMKLSAgIDxMST51dGlsX3VyaS5jCi0gICA8L1VMPjwvTVVMVElDT0w+Ci0gICA8QSBOQU1FPSJub3RlcyI+PC9BPjxiPk5vdGVzOjwvYj4KLSAgIDxvbD4KLSAgICAgIDxsaT5Vc2Ugb2YgbW9kX2FjY2VzcyBkaXJlY3RpdmVzICZxdW90Ozx0dD5hbGxvdyBmcm9tPC90dD4mcXVvdDsgJmFtcDsgJnF1b3Q7PHR0PmRlbnkgZnJvbTwvdHQ+JnF1b3Q7Ci0gICAgICAgICAgd2l0aCBob3N0IDxpPm5hbWVzPC9pPiAodmVyc2VzIGlwIGFkZHJlc3NlcykgcmVxdWlyZXMgVFBGIHZlcnNpb24gNC4xIFBVVDEwCi0gICAgICA8bGk+Q0dJIGV4ZWN1dGlvbiByZXF1aXJlcyBUUEYgdmVyc2lvbiA0LjEgUFVUMTAKLSAgIDwvb2w+Ci0KLTxIMz5Db21wb25lbnRzL21vZHVsZXMgbm90IHlldCBzdXBwb3J0ZWQgb24gVFBGOjwvSDM+Ci0KLSAgIDxtdWx0aWNvbCBDT0xTPTM+PFVMPgotICAgPExJPmh0ZGlnZXN0LmMKLSAgIDxMST5saWIvZXhwYXQtbGl0ZQotICAgPExJPm1vZF9hdXRoX2RpZ2VzdC5jCi0gICA8TEk+bW9kX3Jld3JpdGUuYwotICAgPExJPm1vZF92aG9zdF9hbGlhcy5jCi0gICA8L1VMPjwvTVVMVElDT0w+Ci0KLTxIMz5Db21wb25lbnRzL21vZHVsZXMgdGhhdCBkb24ndCBhcHBseSBvciB0aGF0IHByb2JhYmx5IHdvbid0IGV2ZXIgYmUgYXZhaWxhYmxlIG9uIFRQRjo8L0gzPgotCi0gICA8bXVsdGljb2wgQ09MUz0zPjxVTD4KLSAgIDxMST5hYi5jCi0gICA8TEk+YXBfZ2V0cGFzcy5jCi0gICA8TEk+bW9kX2F1dGhfZGIuYwotICAgPExJPm1vZF9hdXRoX2RibS5jCi0gICA8TEk+bW9kX2F1dGhfZGIubW9kdWxlCi0gICA8TEk+bW9kX21tYXBfc3RhdGljLmMKLSAgIDxMST5tb2Rfc28uYwotICAgPExJPnN1ZXhlYy5jCi0gICA8L1VMPjwvTVVMVElDT0w+Ci0KLTxBIE5BTUU9InBvcnRpbmdfbm90ZXMiPiZuYnNwOzwvQT4KLTxIMiBhbGlnbj1jZW50ZXI+UG9ydGluZyBOb3RlczwvSDI+Ci08UD4KLSAgIDxIMz5DaGFuZ2VzIG1hZGUgZHVlIHRvIGRpZmZlcmVuY2VzIGJldHdlZW4gVU5JWCBhbmQKLSAgIFRQRidzIHByb2Nlc3MgbW9kZWxzOjwvSDM+Ci0gICA8VUw+Ci0gICA8TEk+PFNUUk9ORz5TaWduYWxzPC9TVFJPTkc+OiBPbiBUUEYgYSBzaWduYWwgdGhhdCBpcyBzZW50IHRvIGEgcHJvY2VzcwotICAgICAgcmVtYWlucyB1bmhhbmRsZWQgdW50aWwgdGhlIHByb2Nlc3MgZXhwbGljaXRseSByZXF1ZXN0cyB0aGF0IHNpZ25hbHMKLSAgICAgIGJlIGhhbmRsZWQgdXNpbmcgdGhlIDxDT0RFPnRwZl9wcm9jZXNzX3NpZ25hbHMoKTwvQ09ERT4gZnVuY3Rpb24uCi0gICAgICBBZGRpdGlvbmFsbHksIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgYW4gYWxhcm0gb24gVFBGIGlzIHRvIHRha2UKLSAgICAgIGFuIE9QUi03Nzc3IGR1bXAgYW5kIGV4aXQuICAoT24gVU5JWCB0aGUgZGVmYXVsdCBpcyB0aGUgZXF1aXZhbGVudAotICAgICAgb2YgPENPREU+ZXhpdCgpPC9DT0RFPiB3aXRoIG5vIGR1bXAgdGFrZW4uKQotICAgICAgVGhlc2UgZGlmZmVyZW5jZXMgbmVjZXNzaXRhdGVkIGEgZmV3IG1vZGlmaWNhdGlvbnM6Ci0gICAgICA8QlI+PEJSPgotICAgICAgPFVMPgotICAgICAgPExJPmJ5cGFzcyB0aGUgdXNlIG9mIDxDT0RFPmFwX2Jsb2NrX2FsYXJtcygpPC9DT0RFPiAmYW1wOwotICAgICAgICAgPENPREU+YXBfdW5ibG9ja19hbGFybXMoKTwvQ09ERT4KLSAgICAgIDxMST5hZGQgPENPREU+dHBmX3Byb2Nlc3Nfc2lnbmFscygpPC9DT0RFPiBjYWxscwotICAgICAgPExJPmFkZCA8Q09ERT5zZWxlY3QoKTwvQ09ERT4gY2FsbHMgdG8gcHJldmVudCBibG9ja2luZy4KLSAgICAgIDwvVUw+Ci0gICA8QlI+Ci0gICA8L1VMPgotCi0gICA8SDM+RmluZCB0aGF0IGZ1bmN0aW9uLi4uPC9IMz4KLSAgIDxQPlNvbWUgc2ltcGxlIGZ1bmN0aW9ucyAmYW1wOyBkZWZpbml0aW9ucyBpbml0aWFsbHkgbmVlZGVkIHRvIGJlIGFkZGVkCi0gICAgICBvbiBUUEYsIHN1Y2ggYXMgPENPREU+RkRfU0VUKCk8L0NPREU+LgotICAgICAgV2UndmUgcHV0IHRoZXNlIGluIHNyYy9vcy90cGYvb3MuaCBmb3Igbm93LgotICAgPC9QPgotCi0gICA8SDM+RUJDRElDIGNoYW5nZXM6PC9IMz4KLSAgIDxQPlRQRi1zcGVjaWZpYyBjb252ZXJzaW9uIHRhYmxlcyBiZXR3ZWVuIFVTLUFTQ0lJIGFuZAotICAgICAgRUJDRElDIChjaGFyYWN0ZXIgc2V0IElCTS0xMDQ3IHRvIGJlIGV4YWN0KSB3ZXJlIGNyZWF0ZWQKLSAgICAgIGFuZCBwdXQgaW50byBlYmNkaWMuYyBpbiB0aGUgc3JjL29zL3RwZiBkaXJlY3RvcnkuCi0gICA8L1A+Ci0KLSAgIDxIMz5NaXNjZWxsYW5lb3VzLCBtaW5vciBjaGFuZ2VzOjwvSDM+Ci0gICA8UD5WYXJpb3VzIG1pbm9yIGNoYW5nZXMgKHN1Y2ggYXMgY2FzdGluZykgd2VyZSBtYWRlIGR1ZSB0bwotICAgICAgZGlmZmVyZW5jZXMgaW4gaG93IHNvbWUgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiBUUEYuCi0gICA8L1A+Ci0KLTxIUj4KLTxDRU5URVI+WyZuYnNwOzxBIEhSRUY9IiN0b3AiPnRvcDwvQT4KLSAgICZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjY29uZmlndXJhdGlvbl9maWxlcyI+Q29uZmlndXJhdGlvbiBGaWxlczwvQT4KLSAgICZuYnNwO3wmbmJzcDs8QSBIUkVGPSIjd2hhdHNfYXZhaWxhYmxlIj5XaGF0J3MgQXZhaWxhYmxlPC9BPgotICAgJm5ic3A7fCZuYnNwOzxBIEhSRUY9IiNwb3J0aW5nX25vdGVzIj5Qb3J0aW5nIE5vdGVzPC9BPiZuYnNwO10KLTwvQ0VOVEVSPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9wbGF0Zm9ybS91bml4d2FyZS5odG1sIGIvZG9jcy9tYW51YWwvcGxhdGZvcm0vdW5peHdhcmUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc3YTNiNS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9wbGF0Zm9ybS91bml4d2FyZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5Db21waWxpbmcgQXBhY2hlIHVuZGVyIFVuaXhXYXJlPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0KLTxIMSBBTElHTj0iQ0VOVEVSIj5Db21waWxpbmcgQXBhY2hlIHVuZGVyIFVuaXhXYXJlPC9IMT4KLQotVG8gY29tcGlsZSBhIHdvcmtpbmcgY29weSBvZiBBcGFjaGUgdW5kZXIgVW5peFdhcmUsIHRoZXJlIGFyZSBzZXZlcmFsIG90aGVyCi1zdGVwcyB5b3UgbWF5IG5lZWQgdG8gdGFrZS4gVGhlc2UgcHJldmVudCBzdWNoIHByb2JsZW1zIGFzIHpvbWJpZSBwcm9jZXNzZXMsCi1iaW5kIGVycm9ycywgYW5kIGFjY2VwdCBlcnJvcnMsIHRvIG5hbWUgYSBmZXcuCi0KLTxIMj5Vbml4V2FyZSAxLng8L0gyPgotCi1NYWtlIHN1cmUgdGhhdCBVU0VfRkNOVExfU0VSSUFMSVpFX0FDQ0VQVCBpcyBkZWZpbmVkIChpZiBub3QKLWRlZmluZWQgYnkgQXBhY2hlIGF1dG9jb25maWd1cmF0aW9uKS4gSWYgdXNpbmcgdGhlIFVuaXhXYXJlIDxFTT5jYzwvRU0+Ci1jb21waWxlciwgYW5kIHlvdSBzdGlsbCBzZWUgYWNjZXB0KCkgZXJyb3JzLCBkb24ndCB1c2UgY29tcGlsZXIgb3B0aW1pemF0aW9uLAotb3IgZ2V0IDxFTT5nY2M8L0VNPi4KLQotPEgyPlVuaXhXYXJlIDIuMC54PC9IMj4KLQotU0NPIHBhdGNoIDxBIEhSRUY9ImZ0cDovL2Z0cC5zY28uY29tL1VXMjAvdGYyMTYzLnR4dCI+dGYyMTYzPC9BPiBpcyByZXF1aXJlZAotaW4gb3JkZXIgZm9yIEFwYWNoZSB0byB3b3JrIGNvcnJlY3RseSBvbiBVbml4V2FyZSAyLjAueC4gU2VlCi08QSBIUkVGPSJodHRwOi8vd3d3LnNjby5jb20iPmh0dHA6Ly93d3cuc2NvLmNvbTwvQT4KLWZvciBVbml4V2FyZSBwYXRjaCBpbmZvcm1hdGlvbi48UD4KLQotSW4gYWRkaXRpb24sIG1ha2Ugc3VyZSB0aGF0IFVTRV9GQ05UTF9TRVJJQUxJWkVfQUNDRVBUIGlzIGRlZmluZWQgKGlmIG5vdAotZGVmaW5lZCBieSBBcGFjaGUgYXV0b2NvbmZpZ3VyYXRpb24pLiBUbyByZWR1Y2UgaW5zdGFuY2VzIG9mIGNvbm5lY3Rpb25zCi1pbiBGSU5fV0FJVF8yIHN0YXRlLCB5b3UgbWF5IGFsc28gd2FudCB0byBkZWZpbmUgTk9fTElOR0NMT1NFIChBcGFjaGUgMS4yCi1vbmx5KS4KLQotPEgyPlVuaXhXYXJlIDIuMS54PC9IMj4KLQotU0NPIHBhdGNoIDxBIEhSRUY9ImZ0cDovL2Z0cC5zY28uY29tL1VXMjEvcHRmMzEyM2IudHh0Ij5wdGYzMTIzPC9BPiBpcyByZXF1aXJlZAotaW4gb3JkZXIgZm9yIEFwYWNoZSB0byB3b3JrIGNvcnJlY3RseSBvbiBVbml4V2FyZSAyLjEueC4gU2VlCi08QSBIUkVGPSJodHRwOi8vd3d3LnNjby5jb20iPmh0dHA6Ly93d3cuc2NvLmNvbTwvQT4KLWZvciBVbml4V2FyZSBwYXRjaCBpbmZvcm1hdGlvbi48UD4KLQotPFNUUk9ORz5OT1RFOjwvU1RST05HPiBVbml4d2FyZSAyLjEuMiBhbmQgbGF0ZXIgYWxyZWFkeSBoYXZlIHBhdGNoIHB0ZjMxMjMKLWluY2x1ZGVkPFA+Ci0KLUluIGFkZGl0aW9uLCBtYWtlIHN1cmUgdGhhdCBVU0VfRkNOVExfU0VSSUFMSVpFX0FDQ0VQVCBpcyBkZWZpbmVkIChpZiBub3QKLWRlZmluZWQgYnkgQXBhY2hlIGF1dG9jb25maWd1cmF0aW9uKS4gVG8gcmVkdWNlIGluc3RhbmNlcyBvZiBjb25uZWN0aW9ucwotaW4gRklOX1dBSVRfMiBzdGF0ZSwgeW91IG1heSBhbHNvIHdhbnQgdG8gZGVmaW5lIE5PX0xJTkdDTE9TRSAoQXBhY2hlIDEuMgotb25seSkuPFA+Ci0KLVRoYW5rcyB0byBKb2UgRG91cG5payAmbHQ7SlJEQGNjLnVzdS5lZHUmZ3Q7IGFuZCBSaWNoIFZhdWdobgotJmx0O3J2YXVnaG5AYWFkLmNvbSZndDsgZm9yIGFkZGl0aW9uYWwgaW5mbyBmb3IgVW5peFdhcmUgYnVpbGRzLjxQPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvcGxhdGZvcm0vd2luZG93cy5odG1sIGIvZG9jcy9tYW51YWwvcGxhdGZvcm0vd2luZG93cy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTk4OWIwLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL3BsYXRmb3JtL3dpbmRvd3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPlVzaW5nIEFwYWNoZSB3aXRoIE1pY3Jvc29mdCBXaW5kb3dzPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0KLTxIMSBBTElHTj0iQ0VOVEVSIj5Vc2luZyBBcGFjaGUgV2l0aCBNaWNyb3NvZnQgV2luZG93czwvSDE+Ci0KLTxQPlRoaXMgZG9jdW1lbnQgZXhwbGFpbnMgaG93IHRvIGluc3RhbGwsIGNvbmZpZ3VyZSBhbmQgcnVuCi0gICBBcGFjaGUgMS4zIHVuZGVyIE1pY3Jvc29mdCBXaW5kb3dzLiBQbGVhc2Ugbm90ZSB0aGF0IGF0Ci0gICB0aGlzIHRpbWUsIFdpbmRvd3Mgc3VwcG9ydCBpcyBlbnRpcmVseSBleHBlcmltZW50YWwsIGFuZCBpcwotICAgcmVjb21tZW5kZWQgb25seSBmb3IgZXhwZXJpZW5jZWQgdXNlcnMuIFRoZSBBcGFjaGUgR3JvdXAgZG9lcyBub3QKLSAgIGd1YXJhbnRlZSB0aGF0IHRoaXMgc29mdHdhcmUgd2lsbCB3b3JrIGFzIGRvY3VtZW50ZWQsIG9yIGV2ZW4gYXQKLSAgIGFsbC4gSWYgeW91IGZpbmQgYW55IGJ1Z3MsIG9yIHdpc2ggdG8gY29udHJpYnV0ZSBpbiBvdGhlciB3YXlzLCBwbGVhc2UKLSAgIHVzZSBvdXIgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2J1Z19yZXBvcnQuaHRtbCI+YnVnIHJlcG9ydGluZwotICAgcGFnZS48L0E+PC9QPgotCi08UD48U1RST05HPldhcm5pbmc6IEFwYWNoZSBvbiBOVCBoYXMgbm90IHlldCBiZWVuIG9wdGltaXplZCBmb3IgcGVyZm9ybWFuY2UuCi1BcGFjaGUgc3RpbGwgcGVyZm9ybXMgYmVzdCwgYW5kIGlzIG1vc3QgcmVsaWFibGUgb24gVW5peCBwbGF0Zm9ybXMuICBPdmVyCi10aW1lIHdlIHdpbGwgaW1wcm92ZSBOVCBwZXJmb3JtYW5jZS4gRm9sa3MgZG9pbmcgY29tcGFyYXRpdmUgcmV2aWV3cwotb2Ygd2Vic2VydmVyIHBlcmZvcm1hbmNlIGFyZSBhc2tlZCB0byBjb21wYXJlIGFnYWluc3QgQXBhY2hlCi1vbiBhIFVuaXggcGxhdGZvcm0gc3VjaCBhcyBTb2xhcmlzLCBGcmVlQlNELCBvciBMaW51eC48L1NUUk9ORz48L1A+Ci0KLTxQPgotCi1Nb3N0IG9mIHRoaXMgZG9jdW1lbnQgYXNzdW1lcyB0aGF0IHlvdSBhcmUgaW5zdGFsbGluZyBXaW5kb3dzIGZyb20gYQotYmluYXJ5IGRpc3RyaWJ1dGlvbi4gSWYgeW91IHdhbnQgdG8gY29tcGlsZSBBcGFjaGUgeW91cnNlbGYgKHBvc3NpYmx5Ci10byBoZWxwIHdpdGggZGV2ZWxvcG1lbnQsIG9yIHRvIHRyYWNrIGRvd24gYnVncyksIHNlZSB0aGUgc2VjdGlvbiBvbgotPEEgSFJFRj0iI2NvbXAiPkNvbXBpbGluZyBBcGFjaGUgZm9yIFdpbmRvd3M8L0E+IGJlbG93LgotCi08SFI+Ci0KLTxVTD4KLSAgPExJPjxBIEhSRUY9IiNyZXEiPlJlcXVpcmVtZW50czwvQT4KLSAgPExJPjxBIEhSRUY9IiNkb3duIj5Eb3dubG9hZGluZyBBcGFjaGUgZm9yIFdpbmRvd3M8L0E+Ci0gIDxMST48QSBIUkVGPSIjaW5zdCI+SW5zdGFsbGluZyBBcGFjaGUgZm9yIFdpbmRvd3MgKGJpbmFyeSBpbnN0YWxsKTwvQT4KLSAgPExJPjxBIEhSRUY9IiNydW4iPlJ1bm5pbmcgQXBhY2hlIGZvciBXaW5kb3dzPC9BPgotICA8TEk+PEEgSFJFRj0iI3VzZSI+VXNpbmcgQXBhY2hlIGZvciBXaW5kb3dzPC9BPgotICA8TEk+PEEgSFJFRj0iI2NtZGxpbmUiPlJ1bm5pbmcgQXBhY2hlIGZvciBXaW5kb3dzIGZyb20gdGhlIENvbW1hbmQgTGluZTwvQT4KLSAgPExJPjxBIEhSRUY9IiNzZXJ2aWNlIj5SdW5uaW5nIEFwYWNoZSBmb3IgV2luZG93cyBhcyBhIFNlcnZpY2U8L0E+Ci0gIDxMST48QSBIUkVGPSIjc2lnbmFsIj5TaWduYWxsaW5nIENvbnNvbGUgQXBhY2hlIHdoZW4gcnVubmluZzwvQT4KLSAgPExJPjxBIEhSRUY9IiNzaWduYWxzcnYiPlNpZ25hbGxpbmcgU2VydmljZSBBcGFjaGUgd2hlbiBydW5uaW5nPC9BPgotICA8TEk+PEEgSFJFRj0iI2NvbXAiPkNvbXBpbGluZyBBcGFjaGUgZm9yIFdpbmRvd3M8L0E+Ci08L1VMPgotCi08SFI+Ci0KLTxIMj48QSBOQU1FPSJyZXEiPlJlcXVpcmVtZW50czwvQT48L0gyPgotCi1BcGFjaGUgMS4zIGlzIGRlc2lnbmVkIHRvIHJ1biBvbiBXaW5kb3dzIE5UIDQuMC4gVGhlIGJpbmFyeSBpbnN0YWxsZXIKLXdpbGwgb25seSB3b3JrIGluIEludGVsIHByb2Nlc3NvcnMuIEFwYWNoZSBtYXkgYWxzbyBydW4gb24gV2luZG93cyA5NSwKLVdpbmRvd3MgOTggYW5kIFdpbmRvd3MgTlQgMy41LjEsIGJ1dCB0aGVzZSBoYXZlIG5vdCBiZWVuIHRlc3RlZC4gSW4KLWFsbCBjYXNlcyBUQ1AvSVAgbmV0d29ya2luZyBtdXN0IGJlIGluc3RhbGxlZC4KLQotPFA+Ci0KLUlmIHJ1bm5pbmcgb24gV2luZG93cyA5NSwgdXNpbmcgdGhlICJXaW5zb2NrMiIgdXBncmFkZSBpcyByZWNvbW1lbmRlZAotYnV0IG1heSBub3QgYmUgbmVjZXNzYXJ5LiAgSWYgcnVubmluZyBvbiBOVCA0LjAsIGluc3RhbGxpbmcgU2VydmljZSBQYWNrIDIKLWlzIHJlY29tbWVuZGVkLgotCi08UD4KLQotPFNUUk9ORz5Ob3RlOiAiV2luc29jayAyIiBpcyByZXF1aXJlZCBmb3IgQXBhY2hlIDEuMy43IGFuZCBsYXRlci48L1NUUk9ORz4KLQotPFA+Ci0KLSJXaW5zb2NrIDIiIGZvciBXaW5kb3dzIDk1IGlzIGF2YWlsYWJsZSA8QSBIUkVGPSJodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vd2luZG93czk1L2Rvd25sb2Fkcy8iPmhlcmUuPC9BPgotCi08SDI+PEEgTkFNRT0iZG93biI+RG93bmxvYWRpbmcgQXBhY2hlIGZvciBXaW5kb3dzPC9BPjwvSDI+Ci0KLTxQPkluZm9ybWF0aW9uIG9uIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBBcGFjaGUgY2FuIGJlIGZvdW5kIG9uIHRoZQotQXBhY2hlIHdlYiBzZXJ2ZXIgYXQgPEEKLUhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L0E+LiAgVGhpcyB3aWxsCi1saXN0IHRoZSBjdXJyZW50IHJlbGVhc2UsIGFueSBtb3JlIHJlY2VudCBhbHBoYSBvciBiZXRhLXRlc3QgcmVsZWFzZXMsCi10b2dldGhlciB3aXRoIGRldGFpbHMgb2YgbWlycm9yIHdlYiBhbmQgYW5vbnltb3VzIGZ0cCBzaXRlcy48L1A+Ci0KLTxQPgotCi1Zb3Ugc2hvdWxkIGRvd25sb2FkIHRoZSB2ZXJzaW9uIG9mIEFwYWNoZSBmb3IgV2luZG93cyB3aXRoIHRoZQotPENPREU+LmV4ZTwvQ09ERT4gZXh0ZW5zaW9uLiBUaGlzIGlzIGEgc2luZ2xlIGZpbGUgY29udGFpbmluZyBBcGFjaGUsCi1yZWFkeSB0byBpbnN0YWxsIGFuZCBydW4uIFRoZXJlIG1heSBhbHNvIGJlIGEgPENPREU+LnppcDwvQ09ERT4gZmlsZQotY29udGFpbmluZyB0aGUgc291cmNlIGNvZGUsIHRvIGNvbXBpbGUgQXBhY2hlIHlvdXJzZWxmLiAgKElmIHRoZXJlIGlzCi1ubyA8U0FNUD4uemlwPC9TQU1QPiBmaWxlLCB0aGUgc291cmNlIHdpbGwgYmUgYXZhaWxhYmxlIGluIGEKLTxTQU1QPi50YXIuZ3o8L1NBTVA+IGZpbGUgYnV0IHRoaXMgd2lsbCBjb250YWluIFVuaXggbGluZSBlbmRpbmdzLiBZb3UKLXdpbGwgaGF2ZSB0byBjb252ZXJ0IGF0IGxlYXN0IHRoZSA8U0FNUD4ubWFrPC9TQU1QPiBhbmQKLTxTQU1QPi5kc3A8L1NBTVA+IGZpbGVzIHRvIGhhdmUgRE9TIGxpbmUgZW5kaW5ncyBiZWZvcmUgTVNWQyB3aWxsCi11bmRlcnN0YW5kIHRoZW0pLgotCi08SDI+PEEgTkFNRT0iaW5zdCI+SW5zdGFsbGluZyBBcGFjaGUgZm9yIFdpbmRvd3M8L0E+PC9IMj4KLQotUnVuIHRoZSBBcGFjaGUgPFNBTVA+LmV4ZTwvU0FNUD4gZmlsZSB5b3UgZG93bmxvYWRlZCBhYm92ZS4gVGhpcyB3aWxsCi1hc2sgZm9yOgotCi08VUw+Ci0KLSA8TEk+dGhlIGRpcmVjdG9yeSB0byBpbnN0YWxsIEFwYWNoZSBpbnRvICh0aGUgZGVmYXVsdCBpcyAKLSAgICA8Q09ERT5cUHJvZ3JhbSBGaWxlc1xBcGFjaGUgR3JvdXBcQXBhY2hlPC9DT0RFPiBhbHRob3VnaCB5b3UgY2FuCi0gICAgY2hhbmdlIHRoaXMgdG8gYW55IG90aGVyIGRpcmVjdG9yeSkKLQotIDxMST50aGUgc3RhcnQgbWVudSBuYW1lIChkZWZhdWx0IGlzICJBcGFjaGUgV2ViIFNlcnZlciIpCi0KLSA8TEk+dGhlIGluc3RhbGxhdGlvbiB0eXBlLiBUaGUgIlR5cGljYWwiIG9wdGlvbiBpbnN0YWxscwotICAgIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBzb3VyY2UgY29kZS4gVGhlICJNaW5pbXVtIiBvcHRpb24gZG9lcyBub3QKLSAgICBpbnN0YWxsIHRoZSBtYW51YWxzIG9yIHNvdXJjZSBjb2RlLiBDaG9vc2UgdGhlICJDdXN0b20iIGluc3RhbGwgaWYKLSAgICB5b3Ugd2FudCB0byBpbnN0YWxsIHRoZSBzb3VyY2UgY29kZS4KLQotPC9VTD4KLQotPFA+Ci0KLUR1cmluZyB0aGUgaW5zdGFsbGF0aW9uLCBBcGFjaGUgd2lsbCBjb25maWd1cmUgdGhlIGZpbGVzIGluIHRoZQotPFNBTVA+Y29uZjwvU0FNUD4gZGlyZWN0b3J5IGZvciB5b3VyIGNob3NlbiBpbnN0YWxsYXRpb24KLWRpcmVjdG9yeS4gSG93ZXZlciBpZiBhbnkgb2YgdGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3QKLXRoZXkgd2lsbCA8U1RST05HPm5vdDwvU1RST05HPiBiZSBvdmVyd3JpdHRlbi4gSW5zdGVhZCB0aGUgbmV3IGNvcHkgb2YKLXRoZSBjb3JyZXNwb25kaW5nIGZpbGUgd2lsbCBiZSBsZWZ0IHdpdGggdGhlIGV4dGVuc2lvbgotPFNBTVA+LmRlZmF1bHQ8L1NBTVA+LiBTbywgZm9yIGV4YW1wbGUsIGlmCi08U0FNUD5jb25mXGh0dHBkLmNvbmY8L1NBTVA+IGFscmVhZHkgZXhpc3RzIGl0IHdpbGwgbm90IGJlIGFsdGVyZWQsCi1idXQgdGhlIHZlcnNpb24gd2hpY2ggd291bGQgaGF2ZSBiZWVuIGluc3RhbGxlZCB3aWxsIGJlIGxlZnQgaW4KLTxTQU1QPmNvbmZcaHR0cGQuY29uZi5kZWZhdWx0PC9TQU1QPi4gQWZ0ZXIgdGhlIGluc3RhbGxhdGlvbiBoYXMKLWZpbmlzaGVkIHlvdSBzaG91bGQgbWFudWFsbHkgY2hlY2sgdG8gc2VlIHdoYXQgaW4gbmV3IGluIHRoZQotPFNBTVA+LmRlZmF1bHQ8L1NBTVA+IGZpbGUsIGFuZCBpZiBuZWNlc3NhcnkgdXBkYXRlIHlvdXIgZXhpc3RpbmcKLWNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLTxQPgotCi1BbHNvLCBpZiB5b3UgYWxyZWFkeSBoYXZlIGEgZmlsZSBjYWxsZWQgPFNBTVA+aHRkb2NzXGluZGV4Lmh0bWw8L1NBTVA+Ci10aGVuIGl0IHdpbGwgbm90IGJlIG92ZXJ3cml0dGVuIChubyA8U0FNUD5pbmRleC5odG1sLmRlZmF1bHQ8L1NBTVA+Ci1maWxlIHdpbGwgYmUgaW5zdGFsbGVkIGVpdGhlcikuIFRoaXMgc2hvdWxkIG1lYW4gaXQgYSBzYWZlIHRvIGluc3RhbGwKLUFwYWNoZSBvdmVyIGFuIGV4aXN0aW5nIGluc3RhbGxhdGlvbiAoYnV0IHlvdSB3aWxsIGhhdmUgdG8gc3RvcCB0aGUKLWV4aXN0aW5nIHNlcnZlciBydW5uaW5nIGJlZm9yZSBkb2luZyB0aGUgaW5zdGFsbGF0aW9uLCB0aGVuIHN0YXJ0IHRoZQotbmV3IG9uZSBhZnRlciB0aGUgaW5zdGFsbGF0aW9uIGlzIGZpbmlzaGVkKS4KLQotPFA+Ci0KLUFmdGVyIGluc3RhbGxpbmcgQXBhY2hlLCB5b3Ugc2hvdWxkIGVkaXQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgaW4KLXRoZSA8U0FNUD5jb25mPC9TQU1QPiBkaXJlY3RvcnkgYXMgcmVxdWlyZWQuIFRoZXNlIGZpbGVzIHdpbGwgYmUKLWNvbmZpZ3VyZWQgZHVyaW5nIHRoZSBpbnN0YWxsIHJlYWR5IGZvciBBcGFjaGUgdG8gYmUgcnVuIGZyb20gdGhlCi1kaXJlY3Rvcnkgd2hlcmUgaXQgd2FzIGluc3RhbGxlZCwgd2l0aCB0aGUgZG9jdW1lbnRzIHNlcnZlZCBmcm9tIHRoZQotc3ViZGlyZWN0b3J5IDxTQU1QPmh0ZG9jczwvU0FNUD4uIFRoZXJlIGFyZSBsb3RzIG9mIG90aGVyIG9wdGlvbnMKLXdoaWNoIHNob3VsZCBiZSBzZXQgYmVmb3JlIHlvdSBzdGFydCByZWFsbHkgdXNpbmcgQXBhY2hlLiBIb3dldmVyIHRvCi1nZXQgc3RhcnRlZCBxdWlja2x5IHRoZSBmaWxlcyBzaG91bGQgd29yayBhcyBpbnN0YWxsZWQuCi0KLTxIMj48QSBOQU1FPSJydW4iPlJ1bm5pbmcgQXBhY2hlIGZvciBXaW5kb3dzPC9BPjwvSDI+Ci0KLVRoZXJlIGFyZSB0d28gd2F5cyB5b3UgY2FuIHJ1biBBcGFjaGU6Ci0KLTxVTD4KLSA8TEk+QXMgYSA8QSBIUkVGPSIjc2VydmljZSI+InNlcnZpY2UiPC9BPiAoYXZhaWxhYmxlIG9uIE5UIG9ubHkpLiBUaGlzIGlzIHRoZSBiZXN0IG9wdGlvbiBpZgotICAgIHlvdSB3YW50IEFwYWNoZSB0byBhdXRvbWF0aWNhbGx5IHN0YXJ0IHdoZW4geW91IG1hY2hpbmUgYm9vdHMsIGFuZCB0bwotICAgIGtlZXAgQXBhY2hlIHJ1bm5pbmcgd2hlbiB5b3UgbG9nLW9mZi4KLQotIDxMST5Gcm9tIGEgPEEgSFJFRj0iI2NtZGxpbmUiPmNvbnNvbGUgd2luZG93PC9BPi4gVGhpcyBpcyB0aGUgb25seSBvcHRpb24KLSAgICBhdmFpbGFibGUgZm9yCi0gICAgV2luZG93cyA5NSB1c2Vycy4KLTwvVUw+Ci0KLVRvIHN0YXJ0IEFwYWNoZSBhcyBhIHNlcnZpY2UsIHlvdSBmaXJzdCBuZWVkIHRvIGluc3RhbGwgaXQgYXMgYQotc2VydmljZS4gTXVsdGlwbGUgQXBhY2hlIHNlcnZpY2VzIGNhbiBiZSBpbnN0YWxsZWQsIGVhY2ggd2l0aCBhCi1kaWZmZXJlbnQgbmFtZSBhbmQgY29uZmlndXJhdGlvbi4gIFRvIGluc3RhbGwgdGhlIGRlZmF1bHQgQXBhY2hlCi1zZXJ2aWNlIG5hbWVkICJBcGFjaGUiLCBydW4gdGhlICJJbnN0YWxsIEFwYWNoZSBhcyBTZXJ2aWNlIChOVCBvbmx5KSIKLW9wdGlvbiBmcm9tIHRoZSBTdGFydCBtZW51LiBPbmNlIHRoaXMgaXMgZG9uZSB5b3UgY2FuIHN0YXJ0IHRoZSAiQXBhY2hlIgotc2VydmljZSBieSBvcGVuaW5nIHRoZSBTZXJ2aWNlcyB3aW5kb3cgKGluIHRoZSBDb250cm9sIFBhbmVsKSwgc2VsZWN0aW5nIEFwYWNoZSwKLXRoZW4gY2xpY2tpbmcgb24gU3RhcnQuIEFwYWNoZSB3aWxsIG5vdyBiZSBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kLiBZb3UKLWNhbiBsYXRlciBzdG9wIEFwYWNoZSBieSBjbGlja2luZyBvbiBTdG9wLiBBcyBhbiBhbHRlcm5hdGl2ZSB0byB1c2luZwotdGhlIFNlcnZpY2VzIHdpbmRvdywgeW91IGNhbiBzdGFydCBhbmQgc3RvcCB0aGUgIkFwYWNoZSIgc2VydmljZSBmcm9tIHRoZSBjb250cm9sCi1saW5lIHdpdGgKLQotPFBSRT4KLSAgTkVUIFNUQVJUIEFQQUNIRQotICBORVQgU1RPUCBBUEFDSEUKLTwvUFJFPgotCi1TZWUgPEEgSFJFRj0iI3NpZ25hbHNydiI+U2lnbmFsbGluZyBTZXJ2aWNlIEFwYWNoZSB3aGVuIFJ1bm5pbmc8L0E+Ci1mb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBpbnN0YWxsaW5nIGFuZCBjb250cm9sbGluZyBBcGFjaGUgc2VydmljZXMuCi0KLTxQPgotCi1UbyBydW4gQXBhY2hlIGZyb20gYSBjb25zb2xlIHdpbmRvdywgc2VsZWN0IHRoZSAiU3RhcnQgQXBhY2hlIGFzCi1jb25zb2xlIGFwcCIgb3B0aW9uIGZyb20gdGhlIFN0YXJ0IG1lbnUgKGluIEFwYWNoZSAxLjMuNCBhbmQgZWFybGllciwKLXRoaXMgb3B0aW9uIHdhcyBjYWxsZWQgIkFwYWNoZSBTZXJ2ZXIiKS4gVGhpcyB3aWxsIG9wZW4gYSBjb25zb2xlCi13aW5kb3cgYW5kIHN0YXJ0IEFwYWNoZSBydW5uaW5nIGluc2lkZSBpdC4gVGhlIHdpbmRvdyB3aWxsIHJlbWFpbgotYWN0aXZlIHVudGlsIHlvdSBzdG9wIEFwYWNoZS4gVG8gc3RvcCBBcGFjaGUgcnVubmluZywgZWl0aGVyIHNlbGVjdAotdGhlICJTaHV0ZG93biBBcGFjaGUgY29uc29sZSBhcHAiIGljb24gb3B0aW9uIGZyb20gdGhlIFN0YXJ0IG1lbnUKLSh0aGlzIGlzIG5vdCBhdmFpbGFibGUgaW4gQXBhY2hlIDEuMy40IG9yIGVhcmxpZXIpLCBvciBzZWUgPEEKLUhSRUY9IiNzaWduYWwiPlNpZ25hbGxpbmcgQ29uc29sZSBBcGFjaGUgd2hlbiBSdW5uaW5nPC9BPiBmb3IgaG93Ci10byBjb250cm9sIEFwYWNoZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCi0KLTxQPgotCi1BZnRlciBzdGFydGluZyBBcGFjaGUgcnVubmluZyAoZWl0aGVyIGluIGEgY29uc29sZSB3aW5kb3cgb3IgYXMgYQotc2VydmljZSkgaWYgd2lsbCBiZSBsaXN0ZW5pbmcgdG8gcG9ydCA4MCAodW5sZXNzIHlvdSBjaGFuZ2VkIHRoZQotPFNBTVA+UG9ydDwvU0FNUD4sIDxTQU1QPkxpc3RlbjwvU0FNUD4gb3IgPFNBTVA+QmluZEFkZHJlc3M8L1NBTVA+Ci1kaXJlY3RpdmVzIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzKS4gVG8gY29ubmVjdCB0byB0aGUgc2VydmVyIGFuZAotYWNjZXNzIHRoZSBkZWZhdWx0IHBhZ2UsIGxhdW5jaCBhIGJyb3dzZXIgYW5kIGVudGVyIHRoaXMgVVJMOgotCi08UFJFPgotICBodHRwOi8vbG9jYWxob3N0LwotPC9QUkU+Ci0KLVRoaXMgc2hvdWxkIHJlc3BvbmQgd2l0aCBhIHdlbGNvbWUgcGFnZSwgYW5kIGEgbGluayB0byB0aGUgQXBhY2hlCi1tYW51YWwuIElmIG5vdGhpbmcgaGFwcGVucyBvciB5b3UgZ2V0IGFuIGVycm9yLCBsb29rIGluIHRoZQotPFNBTVA+ZXJyb3JfbG9nPC9TQU1QPiBmaWxlIGluIHRoZSA8U0FNUD5sb2dzPC9TQU1QPiBkaXJlY3RvcnkuCi1JZiB5b3VyIGhvc3QgaXNuJ3QgY29ubmVjdGVkIHRvIHRoZSBuZXQsIHlvdSBtYXkgaGF2ZSB0byB1c2UKLXRoaXMgVVJMOgotCi08UFJFPgotICBodHRwOi8vMTI3LjAuMC4xLwotPC9QUkU+Ci0KLTxQPgotCi1PbmNlIHlvdXIgYmFzaWMgaW5zdGFsbGF0aW9uIGlzIHdvcmtpbmcsIHlvdSBzaG91bGQgY29uZmlndXJlIGl0Ci1wcm9wZXJseSBieSBlZGl0aW5nIHRoZSBmaWxlcyBpbiB0aGUgPFNBTVA+Y29uZjwvU0FNUD4gZGlyZWN0b3J5LgotCi08SDI+PEEgTkFNRT0idXNlIj5Db25maWd1cmluZyBBcGFjaGUgZm9yIFdpbmRvd3M8L0E+PC9IMj4KLQotQXBhY2hlIGlzIGNvbmZpZ3VyZWQgYnkgZmlsZXMgaW4gdGhlIDxTQU1QPmNvbmY8L1NBTVA+Ci1kaXJlY3RvcnkuIFRoZXNlIGFyZSB0aGUgc2FtZSBhcyBmaWxlcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgVW5peAotdmVyc2lvbiwgYnV0IHRoZXJlIGFyZSBhIGZldyBkaWZmZXJlbnQgZGlyZWN0aXZlcyBmb3IgQXBhY2hlIG9uCi1XaW5kb3dzLiBTZWUgdGhlIDxBIEhSRUY9Ii4vIj5BcGFjaGUgZG9jdW1lbnRhdGlvbjwvQT4gZm9yIGFsbCB0aGUKLWF2YWlsYWJsZSBkaXJlY3RpdmVzLgotCi08UD4KLQotVGhlIG1haW4gZGlmZmVyZW5jZXMgaW4gQXBhY2hlIGZvciBXaW5kb3dzIGFyZToKLQotPFVMPgotICA8TEk+PFA+QmVjYXVzZSBBcGFjaGUgZm9yIFdpbmRvd3MgaXMgbXVsdGl0aHJlYWRlZCwgaXQgZG9lcyBub3QgdXNlIGEKLSAgICAgIHNlcGFyYXRlIHByb2Nlc3MgZm9yIGVhY2ggcmVxdWVzdCwgYXMgQXBhY2hlIGRvZXMgd2l0aAotICAgICAgVW5peC4gSW5zdGVhZCB0aGVyZSBhcmUgdXN1YWxseSBvbmx5IHR3byBBcGFjaGUgcHJvY2Vzc2VzIHJ1bm5pbmc6Ci0gICAgICBhIHBhcmVudCBwcm9jZXNzLCBhbmQgYSBjaGlsZCB3aGljaCBoYW5kbGVzIHRoZSByZXF1ZXN0cy4gV2l0aGluCi0gICAgICB0aGUgY2hpbGQgZWFjaCByZXF1ZXN0IGlzIGhhbmRsZWQgYnkgYSBzZXBhcmF0ZSB0aHJlYWQuCi0gICAgICA8UD4KLQotICAgICAgU28gdGhlICJwcm9jZXNzIi1tYW5hZ2VtZW50IGRpcmVjdGl2ZXMgYXJlIGRpZmZlcmVudDoKLSAgICAgIDxQPjxBCi0gICAgICAgICBIUkVGPSJtb2QvY29yZS5odG1sI21heHJlcXVlc3RzcGVyY2hpbGQiPk1heFJlcXVlc3RzUGVyQ2hpbGQ8L0E+Ci0gICAgICAgICAtIExpa2UgdGhlIFVuaXggZGlyZWN0aXZlLCB0aGlzIGNvbnRyb2xzIGhvdyBtYW55IHJlcXVlc3RzIGEKLSAgICAgICAgICAgcHJvY2VzcyB3aWxsIHNlcnZlIGJlZm9yZSBleGl0aW5nLiBIb3dldmVyLCB1bmxpa2UgVW5peCwgYQotICAgICAgICAgICBwcm9jZXNzIHNlcnZlcyBhbGwgdGhlIHJlcXVlc3RzIGF0IG9uY2UsIG5vdCBqdXN0IG9uZSwgc28gaWYKLSAgICAgICAgICAgdGhpcyBpcyBzZXQsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYSB2ZXJ5IGhpZ2ggbnVtYmVyIGlzCi0gICAgICAgICAgIHVzZWQuIFRoZSByZWNvbW1lbmRlZCBkZWZhdWx0LCA8Q09ERT5NYXhSZXF1ZXN0c1BlckNoaWxkCi0gICAgICAgICAgIDA8L0NPREU+LCBkb2VzIG5vdCBjYXVzZSB0aGUgcHJvY2VzcyB0byBldmVyIGV4aXQuCi0gICAgICA8UD48QSBIUkVGPSJtb2QvY29yZS5odG1sI3RocmVhZHNwZXJjaGlsZCI+VGhyZWFkc1BlckNoaWxkPC9BPiAtCi0gICAgICAgICBUaGlzIGRpcmVjdGl2ZSBpcyBuZXcsIGFuZCB0ZWxscyB0aGUgc2VydmVyIGhvdyBtYW55IHRocmVhZHMgaXQKLSAgICAgICAgIHNob3VsZCB1c2UuIFRoaXMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoZSBzZXJ2ZXIKLSAgICAgICAgIGNhbiBoYW5kbGUgYXQgb25jZTsgYmUgc3VyZSBhbmQgc2V0IHRoaXMgbnVtYmVyIGhpZ2ggZW5vdWdoIGZvcgotICAgICAgICAgeW91ciBzaXRlIGlmIHlvdSBnZXQgYSBsb3Qgb2YgaGl0cy4gVGhlIHJlY29tbWVuZGVkIGRlZmF1bHQgaXMKLSAgICAgICAgIDxDT0RFPlRocmVhZHNQZXJDaGlsZCA1MDwvQ09ERT4uPC9QPgotICA8TEk+PFA+VGhlIGRpcmVjdGl2ZXMgdGhhdCBhY2NlcHQgZmlsZW5hbWVzIGFzIGFyZ3VtZW50cyBub3cgbXVzdCB1c2UKLSAgICAgIFdpbmRvd3MgZmlsZW5hbWVzIGluc3RlYWQgb2YgVW5peCBvbmVzLiBIb3dldmVyLCBiZWNhdXNlIEFwYWNoZQotICAgICAgdXNlcyBVbml4LXN0eWxlIG5hbWVzIGludGVybmFsbHksIHlvdSBtdXN0IHVzZSBmb3J3YXJkIHNsYXNoZXMsIG5vdAotICAgICAgYmFja3NsYXNoZXMuIERyaXZlIGxldHRlcnMgY2FuIGJlIHVzZWQ7IGlmIG9taXR0ZWQsIHRoZSBkcml2ZSB3aXRoCi0gICAgICB0aGUgQXBhY2hlIGV4ZWN1dGFibGUgd2lsbCBiZSBhc3N1bWVkLjwvUD4KLSAgPExJPjxQPkFwYWNoZSBmb3IgV2luZG93cyBjb250YWlucyB0aGUgYWJpbGl0eSB0byBsb2FkIG1vZHVsZXMgYXQgcnVudGltZSwKLSAgICAgIHdpdGhvdXQgcmVjb21waWxpbmcgdGhlIHNlcnZlci4gSWYgQXBhY2hlIGlzIGNvbXBpbGVkIG5vcm1hbGx5LCBpdAotICAgICAgd2lsbCBpbnN0YWxsIGEgbnVtYmVyIG9mIG9wdGlvbmFsIG1vZHVsZXMgaW4gdGhlCi0gICAgICA8Q09ERT5cQXBhY2hlXG1vZHVsZXM8L0NPREU+IGRpcmVjdG9yeS4gVG8gYWN0aXZhdGUgdGhlc2UsIG9yIG90aGVyCi0gICAgICBtb2R1bGVzLCB0aGUgbmV3IDxBIEhSRUY9Im1vZC9tb2Rfc28uaHRtbCNsb2FkbW9kdWxlIj5Mb2FkTW9kdWxlPC9BPgotICAgICAgZGlyZWN0aXZlIG11c3QgYmUgdXNlZC4gRm9yIGV4YW1wbGUsIHRvIGFjdGl2ZSB0aGUgc3RhdHVzIG1vZHVsZSwKLSAgICAgIHVzZSB0aGUgZm9sbG93aW5nIChpbiBhZGRpdGlvbiB0byB0aGUgc3RhdHVzLWFjdGl2YXRpbmcgZGlyZWN0aXZlcwotICAgICAgaW4gPENPREU+YWNjZXNzLmNvbmY8L0NPREU+KTo8L1A+Ci08UFJFPgotICAgIExvYWRNb2R1bGUgc3RhdHVzX21vZHVsZSBtb2R1bGVzL0FwYWNoZU1vZHVsZVN0YXR1cy5kbGwKLTwvUFJFPgotICAgICAgPFA+SW5mb3JtYXRpb24gb24gPEEgSFJFRj0ibW9kL21vZF9zby5odG1sI2NyZWF0aW5nIj5jcmVhdGluZyBsb2FkYWJsZQotICAgICAgICAgbW9kdWxlczwvQT4gaXMgYWxzbyBhdmFpbGFibGUuPC9QPgotICA8TEk+PFA+QXBhY2hlIGNhbiBhbHNvIGxvYWQgSVNBUEkgRXh0ZW5zaW9ucyAoPEVNPmkuZS48L0VNPiwgSW50ZXJuZXQgU2VydmVyCi0gICAgICAgICBBcHBsaWNhdGlvbnMpLCBzdWNoIGFzIHRob3NlIHVzZWQgYnkgTWljcm9zb2Z0J3MgSUlTLCBhbmQgb3RoZXIKLSAgICAgICAgIFdpbmRvd3Mgc2VydmVycy4gPEEgSFJFRj0ibW9kL21vZF9pc2FwaS5odG1sIj5Nb3JlIGluZm9ybWF0aW9uCi0gICAgICAgICBpcyBhdmFpbGFibGUuPC9BPgotPC9VTD4KLQotPEgyPjxBIE5BTUU9InNlcnZpY2UiPlJ1bm5pbmcgQXBhY2hlIGZvciBXaW5kb3dzIGFzIGEgU2VydmljZTwvQT48L0gyPgotIDxTVFJPTkc+Tm90ZTogVGhlIC1uIG9wdGlvbiB0byBzcGVjaWZ5IGEgc2VydmljZSBuYW1lIGlzIG9ubHkgYXZhaWxhYmxlCi0gd2l0aCBBcGFjaGUgMS4zLjcgYW5kIGxhdGVyLiAgRWFybGllciB2ZXJzaW9ucyBvZiBBcGFjaGUgb25seSBzdXBwb3J0Ci0gdGhlIGRlZmF1bHQgc2VydmljZSBuYW1lICdBcGFjaGUnLjwvU1RST05HPgotCi08UD4KLQotWW91IGNhbiBpbnN0YWxsIEFwYWNoZSBhcyBhIFdpbmRvd3MgTlQgc2VydmljZSBhcyBmb2xsb3dzOgotCi08UFJFPgotICAgIGFwYWNoZSAtaSAtbiAic2VydmljZSBuYW1lIgotPC9QUkU+Ci0KLVRvIGluc3RhbGwgYSBzZXJ2aWNlIHRvIHVzZSBhIHBhcnRpY3VsYXIgY29uZmlndXJhdGlvbiwgc3BlY2lmeSB0aGUKLWNvbmZpZ3VyYXRpb24gZmlsZSB3aGVuIHRoZSBzZXJ2aWNlIGlzIGluc3RhbGxlZDoKLQotPFBSRT4KLSAgICBhcGFjaGUgLWkgLW4gInNlcnZpY2UgbmFtZSIgLWYgIlxteSBzZXJ2ZXJcY29uZlxteS5jb25mIgotPC9QUkU+Ci0KLVRvIHJlbW92ZSBhbiBBcGFjaGUgc2VydmljZSwgdXNlCi0KLTxQUkU+Ci0gICAgYXBhY2hlIC11IC1uICJzZXJ2aWNlIG5hbWUiCi08L1BSRT4KLQotVGhlIGRlZmF1bHQgInNlcnZpY2UgbmFtZSIsIGlmIG9uZSBpcyBub3Qgc3BlY2lmaWVkLCBpcyAiQXBhY2hlIi4KLQotPFA+Ci0KLU9uY2UgYSBzZXJ2aWNlIGlzIGluc3RhbGxlZCwgeW91IGNhbiB1c2UgdGhlIDxTQU1QPi1uPC9TQU1QPiBvcHRpb24sIGluIGNvbmp1bmN0aW9uCi13aXRoIG90aGVyIG9wdGlvbnMsIHRvIHJlZmVyIHRvIGEgc2VydmljZSdzIGNvbmZpZ3VyYXRpb24gZmlsZS4gIEZvciBleGFtcGxlOjxicj4KLQotVG8gdGVzdCBhIHNlcnZpY2UncyBjb25maWd1cmF0aW9uIGZpbGU6Ci08UFJFPgotICAgIGFwYWNoZSAtbiAic2VydmljZSBuYW1lIiAtdAotPC9QUkU+Ci0KLVRvIHN0YXJ0IGEgY29uc29sZSBBcGFjaGUgdXNpbmcgYSBzZXJ2aWNlJ3MgY29uZmlndXJhdGlvbiBmaWxlOgotPFBSRT4KLSAgICBhcGFjaGUgLW4gInNlcnZpY2UgbmFtZSIKLTwvUFJFPgotCi08SDI+PEEgTkFNRT0iY21kbGluZSI+UnVubmluZyBBcGFjaGUgZm9yIFdpbmRvd3MgZnJvbSB0aGUgQ29tbWFuZCBMaW5lPC9BPjwvSDI+Ci0KLVRoZSBTdGFydCBtZW51IGljb25zIGFuZCB0aGUgTlQgU2VydmljZSBtYW5hZ2VyIGNhbiBwcm92aWRlIGEgc2ltcGxlCi1pbnRlcmZhY2UgZm9yIGFkbWluaXN0ZXJpbmcgQXBhY2hlLiBCdXQgaW4gc29tZSBjYXNlcyBpdCBpcyBlYXNpZXIgdG8KLXdvcmsgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgotCi08UD4KLVdoZW4gd29ya2luZyB3aXRoIEFwYWNoZSBpdCBpcyBpbXBvcnRhbnQgdG8ga25vdyBob3cgaXQgd2lsbCBmaW5kIHRoZQotY29uZmlndXJhdGlvbiBmaWxlcy4gIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gZmlsZSBvbiB0aGUgY29tbWFuZCBsaW5lCi1pbiB0d28gd2F5czoKLQotPFVMPgotPExJPi1mIHNwZWNpZmllcyBhIHBhdGggdG8gYSBwYXJ0aWN1bGFyIGNvbmZpZ3VyYXRpb24gZmlsZQotPC9VTD4KLTxQUkU+ICAgIGFwYWNoZSAtZiAiYzpcbXkgc2VydmVyXGNvbmZcbXkuY29uZiI8L1BSRT4KLTxQUkU+ICAgIGFwYWNoZSAtZiB0ZXN0XHRlc3QuY29uZjwvUFJFPgotPFVMPgotPExJPi1uIHNwZWNpZmllcyB0aGUgY29uZmlndXJhdGlvbiBmaWxlIG9mIGFuIGluc3RhbGxlZCBBcGFjaGUgc2VydmljZSAoQXBhY2hlIDEuMy43IGFuZCBsYXRlcikKLTwvVUw+Ci08UFJFPiAgICBhcGFjaGUgLW4gInNlcnZpY2UgbmFtZSI8L1BSRT4KLQotSW4gdGhlc2UgY2FzZXMsIHRoZSBwcm9wZXIgU2VydmVyUm9vdCBzaG91bGQgYmUgc2V0IGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0KLTxQPgotCi1JZiB5b3UgZG9uJ3Qgc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gZmlsZSBuYW1lIHdpdGggLWYgb3IgLW4sIEFwYWNoZSB3aWxsCi11c2UgdGhlIGZpbGUgbmFtZSBjb21waWxlZCBpbnRvIHRoZSBzZXJ2ZXIsIHVzdWFsbHkgImNvbmYvaHR0cGQuY29uZiIuICBJbnZva2luZwotQXBhY2hlIHdpdGggdGhlIC1WIHN3aXRjaCB3aWxsIGRpc3BsYXkgdGhpcyB2YWx1ZSBsYWJlbGVkIGFzIFNFUlZFUl9DT05GSUdfRklMRS4KLUFwYWNoZSB3aWxsIHRoZW4gZGV0ZXJtaW5lIGl0cyBTZXJ2ZXJSb290IGJ5IHRyeWluZyB0aGUgZm9sbG93aW5nLCBpbiB0aGlzIG9yZGVyOgotCi08VUw+Ci08TEk+QSBTZXJ2ZXJSb290IGRpcmVjdGl2ZSB2aWEgYSAtQyBzd2l0Y2guCi08TEk+VGhlIC1kIHN3aXRjaCBvbiB0aGUgY29tbWFuZCBsaW5lLgotPExJPkN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkKLTxMST5BIHJlZ2lzdHJ5IGVudHJ5LCBjcmVhdGVkIGlmIHlvdSBkaWQgYSBiaW5hcnkgaW5zdGFsbC4KLTxMST5UaGUgc2VydmVyIHJvb3QgY29tcGlsZWQgaW50byB0aGUgc2VydmVyLgotPC9VTD4KLQotPFA+Ci1UaGUgc2VydmVyIHJvb3QgY29tcGlsZWQgaW50byB0aGUgc2VydmVyIGlzIHVzdWFsbHkgIi9hcGFjaGUiLgotaW52b2tpbmcgYXBhY2hlIHdpdGggdGhlIC1WIHN3aXRjaCB3aWxsIGRpc3BsYXkgdGhpcyB2YWx1ZQotbGFiZWxlZCBhcyBIVFRQRF9ST09ULgotCi08UD4KLVdoZW4gaW52b2tlZCBmcm9tIHRoZSBzdGFydCBtZW51LCBBcGFjaGUgaXMgdXN1YWxseSBwYXNzZWQgbm8gYXJndW1lbnRzLAotc28gdXNpbmcgdGhlIHJlZ2lzdHJ5IGVudHJ5IGlzIHRoZSBwcmVmZXJyZWQgdGVjaG5pcXVlIGZvciBjb25zb2xlIEFwYWNoZS4KLQotPFA+Ci1EdXJpbmcgYSBiaW5hcnkgaW5zdGFsbGF0aW9uLCBhIHJlZ2lzdHJ5IGtleSB3aWxsIGhhdmUKLWJlZW4gaW5zdGFsbGVkLCBmb3IgZXhhbXBsZToKLTxQUkU+Ci0gIEhLRVlfTE9DQUxfTUFDSElORVxTb2Z0d2FyZVxBcGFjaGUgR3JvdXBcQXBhY2hlXDEuMy40XFNlcnZlclJvb3QKLTwvUFJFPgotCi08UD4KLVRoaXMga2V5IGlzIGNvbXBpbGVkIGludG8gdGhlIHNlcnZlciBhbmQgY2FuIGVuYWJsZSB5b3UgdG8gdGVzdCAKLW5ldyB2ZXJzaW9ucyB3aXRob3V0IGFmZmVjdGluZyB0aGUgY3VycmVudCB2ZXJzaW9uLiAgT2YgY291cnNlCi15b3UgbXVzdCB0YWtlIGNhcmUgbm90IHRvIGluc3RhbGwgdGhlIG5ldyB2ZXJzaW9uIG9uIHRvcCBvZiB0aGUKLW9sZCB2ZXJzaW9uIGluIHRoZSBmaWxlIHN5c3RlbS4KLQotPFA+Ci1JZiB5b3UgZGlkIG5vdCBkbyBhIGJpbmFyeSBpbnN0YWxsIHRoZW4gQXBhY2hlIHdpbGwgaW4gc29tZQotc2NlbmFyaW9zIGNvbXBsYWluIHRoYXQgYWJvdXQgdGhlIG1pc3NpbmcgcmVnaXN0cnkga2V5LiAgVGhpcwotd2FybmluZyBjYW4gYmUgaWdub3JlZCBpZiBpdCBvdGhlcndpc2Ugd2FzIGFibGUgdG8gZmluZCBpdHMKLWNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLTxQPgotVGhlIHZhbHVlIG9mIHRoaXMga2V5IGlzIHRoZSAiU2VydmVyUm9vdCIgZGlyZWN0b3J5LCBjb250YWluaW5nIHRoZQotPFNBTVA+Y29uZjwvU0FNUD4gZGlyZWN0b3J5LiBXaGVuIEFwYWNoZSBzdGFydHMgaXQgd2lsbCByZWFkIHRoZQotPFNBTVA+aHR0cGQuY29uZjwvU0FNUD4gZmlsZSBmcm9tIHRoaXMgZGlyZWN0b3J5LiBJZiB0aGlzIGZpbGUKLWNvbnRhaW5zIGEgPFNBTVA+U2VydmVyUm9vdDwvU0FNUD4gZGlyZWN0aXZlIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tCi10aGUgZGlyZWN0b3J5IG9idGFpbmVkIGZyb20gdGhlIHJlZ2lzdHJ5IGtleSBhYm92ZSwgQXBhY2hlIHdpbGwgZm9yZ2V0Ci10aGUgcmVnaXN0cnkga2V5IGFuZCB1c2UgdGhlIGRpcmVjdG9yeSBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi1JZiB5b3UgY29weSB0aGUgQXBhY2hlIGRpcmVjdG9yeSBvciBjb25maWd1cmF0aW9uIGZpbGVzIHRvIGEgbmV3Ci1sb2NhdGlvbiBpdCBpcyB2aXRhbCB0aGF0IHlvdSB1cGRhdGUgdGhlIDxTQU1QPlNlcnZlclJvb3Q8L1NBTVA+Ci1kaXJlY3RvcnkgaW4gdGhlIDxTQU1QPmh0dHBkLmNvbmY8L1NBTVA+IGZpbGUgdG8gdGhlIG5ldyBsb2NhdGlvbi4KLQotPFA+Ci1UbyBydW4gQXBhY2hlIGZyb20gdGhlIGNvbW1hbmQgbGluZSBhcyBhIGNvbnNvbGUgYXBwbGljYXRpb24sIHVzZSB0aGUKLWZvbGxvd2luZyBjb21tYW5kOgotCi08UFJFPgotICAgIGFwYWNoZSAKLTwvUFJFPgotCi1BcGFjaGUgd2lsbCBleGVjdXRlLCBhbmQgd2lsbCByZW1haW4gcnVubmluZyB1bnRpbCBpdCBpcyBzdG9wcGVkIGJ5IHByZXNzaW5nCi1jb250cm9sLUMuCi0KLTxIMj48QSBOQU1FPSJzaWduYWxzcnYiPlNpZ25hbGxpbmcgU2VydmljZSBBcGFjaGUgd2hlbiBydW5uaW5nPC9BPjwvSDI+Ci0KLU9uIFdpbmRvd3MgTlQsIG11bHRpcGxlIGluc3RhbmNlcyBvZiBBcGFjaGUgY2FuIGJlIHJ1biBhcyBzZXJ2aWNlcy4KLVNpZ25hbCBhbiBBcGFjaGUgc2VydmljZSB0byBzdGFydCwgcmVzdGFydCwgb3Igc2h1dGRvd24gYXMgZm9sbG93czoKLQotPFBSRT4KLSAgICBhcGFjaGUgLW4gInNlcnZpY2UgbmFtZSIgLWsgc3RhcnQKLSAgICBhcGFjaGUgLW4gInNlcnZpY2UgbmFtZSIgLWsgcmVzdGFydAotICAgIGFwYWNoZSAtbiAic2VydmljZSBuYW1lIiAtayBzaHV0ZG93bgotPC9QUkU+Ci0KLUluIGFkZGl0aW9uLCB5b3UgY2FuIHVzZSB0aGUgbmF0aXZlIE5UIE5FVCBjb21tYW5kIHRvCi1zdGFydCBhbmQgc3RvcCBBcGFjaGUgc2VydmljZXMgYXMgZm9sbG93czoKLQotPFBSRT4KLSAgICBORVQgU1RBUlQgInNlcnZpY2UgbmFtZSIKLSAgICBORVQgU1RPUCAic2VydmljZSBuYW1lIgotPC9QUkU+Ci0KLTxIMj48QSBOQU1FPSJzaWduYWwiPlNpZ25hbGxpbmcgQ29uc29sZSBBcGFjaGUgd2hlbiBydW5uaW5nPC9BPjwvSDI+Ci0KLU9uIFdpbmRvd3MgOTUsIEFwYWNoZSBydW5zIGFzIGEgY29uc29sZSBhcHBsaWNhdGlvbi4gWW91IGNhbiB0ZWxsIGEKLXJ1bm5pbmcgQXBhY2hlIHRvIHN0b3AgYnkgb3BlbmluZyBhbm90aGVyIGNvbnNvbGUgd2luZG93IGFuZCBydW5uaW5nCi0KLTxQUkU+Ci0gICAgYXBhY2hlIC1rIHNodXRkb3duCi08L1BSRT4KLTxCTE9DS1FVT1RFPgotIDxTVFJPTkc+Tm90ZTogVGhpcyBvcHRpb24gaXMgb25seSBhdmFpbGFibGUgd2l0aCBBcGFjaGUgMS4zLjMgYW5kCi0gbGF0ZXIuICBGb3IgZWFybGllciB2ZXJzaW9ucywgeW91IG5lZWQgdG8gdXNlIENvbnRyb2wtQyBpbiB0aGUKLSBBcGFjaGUgY29uc29sZSB3aW5kb3cgdG8gc2h1dCBkb3duIHRoZSBzZXJ2ZXIuPC9TVFJPTkc+Ci08L0JMT0NLUVVPVEU+Ci0KLTxQPgotVGhpcyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHByZXNzaW5nIENvbnRyb2wtQyBpbiB0aGUgcnVubmluZwotQXBhY2hlIGNvbnNvbGUgd2luZG93LCBiZWNhdXNlIGl0IGxldHMgQXBhY2hlIGVuZCBhbnkgY3VycmVudAotdHJhbnNhY3Rpb25zIGFuZCBjbGVhbnVwIGdyYWNlZnVsbHkuCi0KLTxQPgotCi1Zb3UgY2FuIGFsc28gdGVsbCBBcGFjaGUgdG8gcmVzdGFydC4gVGhpcyBtYWtlcyBpdCByZS1yZWFkIHRoZQotY29uZmlndXJhdGlvbiBmaWxlcy4gQW55IHRyYW5zYWN0aW9ucyBpbiBwcm9ncmVzcyBhcmUgYWxsb3dlZCB0bwotY29tcGxldGUgd2l0aG91dCBpbnRlcnJ1cHRpb24uIFRvIHJlc3RhcnQgQXBhY2hlLCBydW4KLQotPFBSRT4KLSAgICBhcGFjaGUgLWsgcmVzdGFydAotPC9QUkU+Ci08QkxPQ0tRVU9URT4KLSA8U1RST05HPk5vdGU6IFRoaXMgb3B0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHdpdGggQXBhY2hlIDEuMy4zIGFuZAotIGxhdGVyLiAgRm9yIGVhcmxpZXIgdmVyc2lvbnMsIHlvdSBuZWVkIHRvIHVzZSBDb250cm9sLUMgaW4gdGhlCi0gQXBhY2hlIGNvbnNvbGUgd2luZG93IHRvIHNodXQgZG93biB0aGUgc2VydmVyLjwvU1RST05HPgotPC9CTE9DS1FVT1RFPgotCi08UD4KLU5vdGUgZm9yIHBlb3BsZSBmYW1pbGlhciB3aXRoIHRoZSBVbml4IHZlcnNpb24gb2YgQXBhY2hlOiB0aGVzZQotY29tbWFuZHMgcHJvdmlkZSBhIFdpbmRvd3MgZXF1aXZhbGVudCB0byA8Q09ERT5raWxsIC1URVJNCi08RU0+cGlkPC9FTT48L0NPREU+IGFuZCA8Q09ERT5raWxsIC1VU1IxIDxFTT5waWQ8L0VNPjwvQ09ERT4uIFRoZSBjb21tYW5kCi1saW5lIG9wdGlvbiB1c2VkLCA8Q09ERT4tazwvQ09ERT4sIHdhcyBjaG9zZW4gYXMgYSByZW1pbmRlciBvZiB0aGUKLSJraWxsIiBjb21tYW5kIHVzZWQgb24gVW5peC4KLQotPEgyPjxBIE5BTUU9ImNvbXAiPkNvbXBpbGluZyBBcGFjaGUgZm9yIFdpbmRvd3M8L0E+PC9IMj4KLQotPFA+Q29tcGlsaW5nIEFwYWNoZSByZXF1aXJlcyBNaWNyb3NvZnQgVmlzdWFsIEMrKyA1LjAgdG8gYmUgcHJvcGVybHkKLSAgIGluc3RhbGxlZC4gSXQgaXMgZWFzaWVzdCB0byBjb21waWxlIHdpdGggdGhlIGNvbW1hbmQtbGluZSB0b29scwotICAgKG5tYWtlLCA8RU0+ZXRjLjwvRU0+Li4pLiBDb25zdWx0IHRoZSBWQysrIG1hbnVhbCB0byBkZXRlcm1pbmUgaG93IHRvIGluc3RhbGwKLSAgIHRoZW0uPC9QPgotCi08UD5GaXJzdCwgdW5wYWNrIHRoZSBBcGFjaGUgZGlzdHJpYnV0aW9uIGludG8gYW4gYXBwcm9wcmlhdGUKLSAgIGRpcmVjdG9yeS4gT3BlbiBhIGNvbW1hbmQtbGluZSBwcm9tcHQsIGFuZCBjaGFuZ2UgdG8gdGhlCi0gICA8Q09ERT5zcmM8L0NPREU+IHN1YmRpcmVjdG9yeSBvZiB0aGUgQXBhY2hlIGRpc3RyaWJ1dGlvbi48L1A+Ci0KLTxQPlRoZSBtYXN0ZXIgQXBhY2hlIG1ha2VmaWxlIGluc3RydWN0aW9ucyBhcmUgY29udGFpbmVkIGluIHRoZQotICAgPENPREU+TWFrZWZpbGUubnQ8L0NPREU+IGZpbGUuIFRvIGNvbXBpbGUgQXBhY2hlIG9uIFdpbmRvd3MgTlQsIHNpbXBseQotICAgdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgotPFVMPgotPExJPjxDT0RFPm5tYWtlIC9mIE1ha2VmaWxlLm50IF9hcGFjaGVyPC9DT0RFPiAocmVsZWFzZSBidWlsZCkKLTxMST48Q09ERT5ubWFrZSAvZiBNYWtlZmlsZS5udCBfYXBhY2hlZDwvQ09ERT4gKGRlYnVnIGJ1aWxkKQotPC9VTD4KLQotPFA+PGVtPigxLjMuNCBhbmQgbGF0ZXIpPC9lbT4gVG8gY29tcGlsZSBBcGFjaGUgb24gV2luZG93cyA5NSwgdXNlIG9uZSBvZgotPFVMPgotPExJPjxDT0RFPm5tYWtlIC9mIE1ha2VmaWxlX3dpbjMyLnR4dDwvQ09ERT4gKHJlbGVhc2UgYnVpbGQpCi08TEk+PENPREU+bm1ha2UgL2YgTWFrZWZpbGVfd2luMzJfZGVidWcudHh0PC9DT0RFPiAoZGVidWcgYnVpbGQpCi08L1VMPgotCi08UD5UaGVzZSB3aWxsIGJvdGggY29tcGlsZSBBcGFjaGUuIFRoZSBsYXR0ZXIgd2lsbCBpbmNsdWRlIGRlYnVnZ2luZwotICAgaW5mb3JtYXRpb24gaW4gdGhlIHJlc3VsdGluZyBmaWxlcywgbWFraW5nIGl0IGVhc2llciB0byBmaW5kIGJ1Z3MgYW5kCi0gICB0cmFjayBkb3duIHByb2JsZW1zLjwvUD4KLQotPFA+QXBhY2hlIGNhbiBhbHNvIGJlIGNvbXBpbGVkIHVzaW5nIFZDKysncyBWaXN1YWwgU3R1ZGlvIGRldmVsb3BtZW50Ci0gICBlbnZpcm9ubWVudC4gQWx0aG91Z2ggY29tcGlsaW5nIEFwYWNoZSBpbiB0aGlzIG1hbm5lciBpcyBub3QgYXMKLSAgIHNpbXBsZSwgaXQgbWFrZXMgaXQgcG9zc2libGUgdG8gZWFzaWx5IG1vZGlmeSB0aGUgQXBhY2hlIHNvdXJjZSwgb3IKLSAgIHRvIGNvbXBpbGUgQXBhY2hlIGlmIHRoZSBjb21tYW5kLWxpbmUgdG9vbHMgYXJlIG5vdCBpbnN0YWxsZWQuCi0gICBQcm9qZWN0IGZpbGVzICg8Q09ERT4uRFNQPC9DT0RFPikgYXJlIGluY2x1ZGVkIGZvciBlYWNoIG9mIHRoZQotICAgcG9ydGlvbnMgb2YgQXBhY2hlLiBUbyBidWlsZCBBcGFjaGUgZnJvbSB0aGUgdGhlc2UgcHJvamVjdHMgZmlsZXMKLSAgIHlvdSB3aWxsIG5lZWQgdG8gYnVpbGQgdGhlIGZvbGxvd2luZyBwcm9qZWN0cyA8RU0+aW4gdGhpcyBvcmRlcjwvRU0+OgotCi0gPE9MPgotICAgPExJPjxDT0RFPm9zXHdpbjMyXEFwYWNoZU9TLmRzcDwvQ09ERT4KLSAgIDxMST48Q09ERT5yZWdleFxyZWdleC5kc3A8L0NPREU+Ci0gICA8TEk+PENPREU+YXBcYXAuZHNwPC9DT0RFPgotICAgPExJPjxDT0RFPm1haW5cZ2VuX3VyaV9kZWxpbXMuZHNwPC9DT0RFPgotICAgPExJPjxDT0RFPm1haW5cZ2VuX3Rlc3RfY2hhci5kc3A8L0NPREU+Ci0gICA8TEk+PENPREU+QXBhY2hlQ29yZS5kc3A8L0NPREU+Ci0gICA8TEk+PENPREU+QXBhY2hlLmRzcDwvQ09ERT4KLSA8L09MPgotCi0gICBJbiBhZGRpdGlvbiwgdGhlIDxDT0RFPnNyY1xvc1x3aW4zMjwvQ09ERT4gc3ViZGlyZWN0b3J5IGNvbnRhaW5zCi0gICBwcm9qZWN0IGZpbGVzIGZvciB0aGUgb3B0aW9uYWwgbW9kdWxlcyAoc2VlIGJlbG93KS48L1A+Ci0KLTxQPk9uY2UgQXBhY2hlIGhhcyBiZWVuIGNvbXBpbGVkLCBpdCBuZWVkcyB0byBiZSBpbnN0YWxsZWQgaW4gaXRzIHNlcnZlcgotICAgcm9vdCBkaXJlY3RvcnkuIFRoZSBkZWZhdWx0IGlzIHRoZSA8Q09ERT5cQXBhY2hlPC9DT0RFPgotICAgZGlyZWN0b3J5LCBvbiB0aGUgY3VycmVudCBoYXJkIGRyaXZlLiA8L1A+Ci0KLTxQPlRvIGluc3RhbGwgdGhlIGZpbGVzIGludG8gdGhlIDxDT0RFPlxBcGFjaGU8L0NPREU+IGRpcmVjdG9yeQotICAgYXV0b21hdGljYWxseSwgdXNlIG9uZSB0aGUgZm9sbG93aW5nIG5tYWtlIGNvbW1hbmRzIChzZWUgYWJvdmUpOjwvUD4KLTxVTD4KLTxMST48Q09ERT5ubWFrZSAvZiBNYWtlZmlsZS5udCBpbnN0YWxsciBJTlNURElSPTxFTT5kaXI8L0VNPjwvQ09ERT4KLSAoZm9yIHJlbGVhc2UgYnVpbGQpCi08TEk+PENPREU+bm1ha2UgL2YgTWFrZWZpbGUubnQgaW5zdGFsbGQgSU5TVERJUj08RU0+ZGlyPC9FTT48L0NPREU+Ci0gKGZvciBkZWJ1ZyBidWlsZCkKLTwvVUw+Ci1vciwgZm9yIFdpbmRvd3MgOTUgKDEuMy40IGFuZCBsYXRlciksIHVzZSBvbmUgb2Y6Ci08VUw+Ci08TEk+PENPREU+bm1ha2UgL2YgTWFrZWZpbGVfd2luMzIudHh0IGluc3RhbGwgSU5TVERJUj08RU0+ZGlyPC9FTT48L0NPREU+Ci0gKGZvciByZWxlYXNlIGJ1aWxkKQotPExJPjxDT0RFPm5tYWtlIC9mIE1ha2VmaWxlX3dpbjMyX2RlYnVnLnR4dCBpbnN0YWxsIElOU1RESVI9PEVNPmRpcjwvRU0+PC9DT0RFPgotIChmb3IgZGVidWcgYnVpbGQpCi08L1VMPgotCi1UaGUgZGlyIGFyZ3VtZW50IHRvIElOU1RESVIgZ2l2ZXMgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnk7IGl0IGNhbgotYmUgb21pdHRlZCBpZiBBcGFjaGUgaXMgdG8gYmUgaW5zdGFsbGVkIGludG8gPFNBTVA+XEFwYWNoZTwvU0FNUD4uCi0KLTxQPlRoaXMgd2lsbCBpbnN0YWxsIHRoZSBmb2xsb3dpbmc6PC9QPgotCi08VUw+Ci0gIDxMST48Q09ERT48RU0+ZGlyPC9FTT5cQXBhY2hlLmV4ZTwvQ09ERT4gLSBBcGFjaGUgZXhlY3V0YWJsZQotICA8TEk+PENPREU+PEVNPmRpcjwvRU0+XEFwYWNoZUNvcmUuZGxsPC9DT0RFPiAtIE1haW4gQXBhY2hlIHNoYXJlZCBsaWJyYXJ5Ci0gIDxMST48Q09ERT48RU0+ZGlyPC9FTT5cbW9kdWxlc1xBcGFjaGVNb2R1bGUqLmRsbDwvQ09ERT4gLSBPcHRpb25hbCBBcGFjaGUKLSAgICAgIG1vZHVsZXMgKDcgZmlsZXMpCi0gIDxMST48Q09ERT48RU0+ZGlyPC9FTT5cY29uZjwvQ09ERT4gLSBFbXB0eSBjb25maWd1cmF0aW9uIGRpcmVjdG9yeQotICA8TEk+PENPREU+PEVNPmRpcjwvRU0+XGxvZ3M8L0NPREU+IC0gRW1wdHkgbG9nZ2luZyBkaXJlY3RvcnkKLTwvVUw+Ci0KLTxQPklmIHlvdSBkbyBub3QgaGF2ZSBubWFrZSwgb3Igd2lzaCB0byBpbnN0YWxsIGluIGEgZGlmZmVyZW50IGRpcmVjdG9yeSwKLSAgIGJlIHN1cmUgdG8gdXNlIGEgc2ltaWxhciBuYW1pbmcgc2NoZW1lLjwvUD4KLQotPFA+Ci1CZWZvcmUgcnVubmluZyB0aGUgc2VydmVyIHlvdSBtdXN0IGZpbGwgb3V0IHRoZSBjb25mIGRpcmVjdG9yeS4KLUNvcHkgdGhlICouY29uZi1kaXN0LXdpbiBmcm9tIHRoZSBkaXN0cmlidXRpb24gY29uZiBkaXJlY3RvcnkKLWFuZCByZW5hbWUgKi5jb25mLiAgRWRpdCB0aGUgQEBTZXJ2ZXJSb290QEAgZW50cmllcyB0byB5b3VyCi1hY3R1YWwgc2VydmVyIHJvb3QgKGZvciBleGFtcGxlICJDOlxhcGFjaGUiKS4gIENvcHkgb3ZlcgotdGhlIGNvbmYvbWFnaWMgYW5kIGNvbmYvbWltZS50eXBlcyBmaWxlcyBhcyB3ZWxsLgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9wcm9jZXNzLW1vZGVsLmh0bWwgYi9kb2NzL21hbnVhbC9wcm9jZXNzLW1vZGVsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZjdkNGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvcHJvY2Vzcy1tb2RlbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+PEhFQUQ+Ci08VElUTEU+U2VydmVyIFBvb2wgTWFuYWdlbWVudDwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPlNlcnZlciBQb29sIE1hbmFnZW1lbnQ8L0gxPgotCi08SFI+Ci08UD4KLVdlIGZvdW5kIHRoYXQgbWFueSBwZW9wbGUgd2VyZSB1c2luZyB2YWx1ZXMgZm9yICJNYXhTZXJ2ZXJzIiBlaXRoZXIKLXRvbyBoaWdoIG9yIHRvbyBsb3csIGFuZCB3ZXJlIGhhbmdpbmcgdGhlbXNlbHZlcyBvbiBpdC4gIFRoZSBtb2RlbCB3ZQotYWRvcHRlZCBpcyBzdGlsbCBiYXNlZCBvbiBsb25nLWxpdmVkIG1pbmltYWwtZm9ya2luZyBwcm9jZXNzZXMsIGJ1dAotaW5zdGVhZCBvZiBzcGVjaWZ5aW5nIG9uZSBudW1iZXIgb2YgcGVyc2lzdGVudCBwcm9jZXNzZXMsIHRoZQotd2ViLW1hc3RlciBzcGVjaWZpZXMgYSBtYXhpbXVtIGFuZCBtaW5pbXVtIG51bWJlciBvZiBwcm9jZXNzZXMgdG8gYmUKLSJzcGFyZSIgLSBldmVyeSBjb3VwbGUgb2Ygc2Vjb25kcyB0aGUgcGFyZW50IGNoZWNrcyB0aGUgYWN0dWFsIG51bWJlcgotb2Ygc3BhcmUgc2VydmVycyBhbmQgYWRqdXN0cyBhY2NvcmRpbmdseS4gIFRoaXMgc2hvdWxkIGtlZXAgdGhlIG51bWJlcgotb2Ygc2VydmVycyBjb25jdXJyZW50bHkgcnVubmluZyByZWxhdGl2ZWx5IGxvdyB3aGlsZSBzdGlsbCBlbnN1cmluZwotbWluaW1hbCBmb3JraW5nLgotCi08UD4KLQotV2UgcmVuYW1lZCB0aGUgY3VycmVudCBTdGFydFNlcnZlcnMgdG8gTWluU3BhcmVTZXJ2ZXJzLCBjcmVhdGVkCi1zZXBhcmF0ZSBTdGFydFNlcnZlcnMgcGFyYW1ldGVyIHdoaWNoIG1lYW5zIHdoYXQgaXQgc2F5cywgYW5kIHJlbmFtZWQKLU1heFNlcnZlcnMgdG8gTWF4U3BhcmVTZXJ2ZXJzICh0aG91Z2ggdGhlIG9sZCBuYW1lIHN0aWxsIHdvcmtzLCBmb3IKLU5DU0EgMS40IGJhY2stY29tcGF0aWJpbGl0eSkuICBUaGUgb2xkIG5hbWVzIHdlcmUgZ2VuZXJhbGx5IHJlZ2FyZGVkCi1hcyB0b28gY29uZnVzaW5nLgotCi08UD4KLQotVGhlIGRlZmF1bHRzIGZvciBlYWNoIHZhcmlhYmxlIGFyZToKLQotPFBSRT4KLU1pblNwYXJlU2VydmVycyAgICAgICAgIDUKLU1heFNwYXJlU2VydmVycyAgICAgICAgIDEwCi1TdGFydFNlcnZlcnMgICAgICAgICAgICA1Ci08L1BSRT4KLQotVGhlcmUgaXMgYW4gYWJzb2x1dGUgbWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIGNoaWxkcmVuIGRlZmluZWQKLWJ5IGEgY29tcGlsZS10aW1lIGxpbWl0IHdoaWNoIGRlZmF1bHRzIHRvIDI1NiBhbmQgYSAiTWF4Q2xpZW50cyIKLWRpcmVjdGl2ZSB3aGljaCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzaW11bHRhbmVvdXMgY2hpbGRyZW4gdGhhdAotd2lsbCBiZSBhbGxvd2VkLiAgTWF4Q2xpZW50cyBjYW4gYmUgYWRqdXN0ZWQgdXAgdG8gdGhlIGNvbXBpbGUtdGltZQotbGltaXQgKEhBUkRfU0VSVkVSX0xJTUlULCBkZWZpbmVkIGluIGh0dHBkLmgpLiAgSWYgeW91IG5lZWQgbW9yZQotdGhhbiAyNTYgc2ltdWx0YW5lb3VzIGNoaWxkcmVuLCB5b3UgbmVlZCB0byBtb2RpZnkgYm90aCBIQVJEX1NFUlZFUl9MSU1JVAotYW5kIE1heENsaWVudHMuPFA+Ci0KLUluIHZlcnNpb25zIGJlZm9yZSAxLjIsIEhBUkRfU0VSVkVSX0xJTUlUIGRlZmF1bHRlZCB0byAxNTAuPFA+Ci0KLVdlIGRvIG5vdCByZWNvbW1lbmQgY2hhbmdpbmcgZWl0aGVyIG9mIHRoZXNlIHZhbHVlcyB1bmxlc3M6Ci0KLTxPTD4KLTxMST5Zb3Uga25vdyB5b3UgaGF2ZSB0aGUgc2VydmVyIHJlc291cmNlcyB0byBoYW5kbGUgbW9yZQotPExJPllvdSB1c2UgdGhlIG1hY2hpbmUgZm9yIG90aGVyIHB1cnBvc2VzIGFuZCBtdXN0IGxpbWl0IHRoZSBhbW91bnQgb2YgbWVtb3J5Ci1BcGFjaGUgdXNlcwotPC9PTD4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT48L0hUTUw+Ci0KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvc2VhcmNoL21hbnVhbC1pbmRleC5jZ2kgYi9kb2NzL21hbnVhbC9zZWFyY2gvbWFudWFsLWluZGV4LmNnaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMzNTI5OS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9zZWFyY2gvbWFudWFsLWluZGV4LmNnaQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0jIS91c3IvbG9jYWwvYmluL3Blcmw1IC13Ci0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIENvcHlyaWdodCAoYykgMTk5NS0xOTk3IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0jIGFyZSBtZXQ6Ci0jCi0jIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0jCi0jIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotIyAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jICAgIGRpc3RyaWJ1dGlvbi4KLSMKLSMgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0jICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotIyAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0jICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0jCi0jIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSMgICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSMgICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyA1LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0jICAgIGFja25vd2xlZGdtZW50OgotIyAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0jICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotIyBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0jIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotIyBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotIyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0jIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSMgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBtYW51YWwtaW5kZXguY2dpIHNjcmlwdAotIyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgS2VuIENvYXIgPENvYXJAREVDVVMuT3JnPiBpbiBNYXkgMTk5NwotIwotIyBUaGlzIHNjcmlwdCBlaXRoZXIgZGlzcGxheXMgYSBmb3JtIGluIG9yZGVyIHRvIGZpbmQgZG9jdW1lbnRzIGluIHdoaWNoCi0jIGEgd29yZCBhcHBlYXJzLCBvciBkaXNwbGF5cyB0aGUgcmVzdWx0cyBvZiBzdWNoIGEgc2VhcmNoLiAgSXQgaXMKLSMgY2FsbGVkIGFzIGEgQ0dJIHNjcmlwdC4KLSMKLSMgW0ZJTEVdUEFUSF9JTkZPIGlzIHRoZSBwcmVmaXggdG8gYWRkIHRvIHRvIHRoZSBmaWxlcyBuYW1lcyBmb3VuZCBpbgotIyB0aGUgaW5kZXggKFVSTCBwcmVmaXgsIG5vdCBmaWxlc3lzdGVtIHByZWZpeCksIGFuZCBRVUVSWV9TVFJJTkcgaXMgdGhlCi0jIHdvcmQgdG8gYmUgZm91bmQuCi0jCi0jKioqCi0jKioqCi0jIFlvdSBtYXkgbmVlZCB0byB0d2VhayB0aGUgZm9sbG93aW5nIGxpbmUgdG8gcG9pbnQgdG8gdGhlIGNvcnJlY3QKLSMgbG9jYXRpb24gb2YgdGhlIGluZGV4IGZpbGUgb24geW91ciBzeXN0ZW0gKGl0J3MgaW4gdGhlCi0jIGFwYWNoZS9odGRvY3MvbWFudWFsIGRpcmVjdG9yeSBvZiB0aGUgQXBhY2hlIGRpc3RyaWJ1dGlvbiB0cmVlKS4KLSMqKioKLSMqKioKLSRJTkRFWCA9ICIvd3d3L2FwYWNoZS5vcmcvbWFudWFsLWluZGV4LWRhdGEiOwotCi0jKioqCi0jKioqCi0jIFlvdSBzaG91bGRuJ3QgaGF2ZSB0byBtb2RpZnkgYW55dGhpbmcgZWxzZS4KLSMqKioKLSMqKioKLQotJEhUTUwgPSAiIjsKLQotIwotIyBJZiB3ZSBoYXZlIGEgRklMRVBBVEhfSU5GTyBvciBQQVRIX0lORk8sIGl0J3MgdGhlcmUgdG8gcmVtYXAgdGhlCi0jIGRvY3VtZW50cyB0byB0aGUgbWFudWFsIHJvb3QgZGlyZWN0b3J5LiAgSWYgdGhpcyBzY3JpcHQgaXMgYWxyZWFkeSBpbgotIyB0aGF0IGRpcmVjdG9yeSwgdGhpcyBpc24ndCBuZWVkZWQuCi0jCi0kcHJlZml4ID0gJEVOVnsnRklMRVBBVEhfSU5GTyd9IHx8ICRFTlZ7J1BBVEhfSU5GTyd9OwotJHByZWZpeCAuPSAiLyIgaWYgKCRwcmVmaXggJiYgKCRwcmVmaXggIX4gbTovJDopKTsKLQotIwotIyBRVUVSWV9TVFJJTkcsIGlmIHByZXNlbnQsIGNvbnRhaW5zIHRoZSB3b3JkIGZvciB3aGljaCB3ZSBhcmUgdG8KLSMgc2VhcmNoLiAgV2UgYWxzbyAgdXNlIGl0cyBbbm9uXXByZXNlbmNlIHRvIGRldGVybWluZSB3aGEgd2UgZGlzcGxheS4KLSMKLSR3b3JkID0gJEVOVnsnUVVFUllfU1RSSU5HJ307Ci0KLSMKLSMgTWFrZSBzdXJlIG91ciBIVFRQIGhlYWRlciBtYWtlcyBpdCB0byB0aGUgc2VydmVyIGJ5IGNhdXNpbmcgUGVybCB0byBkbwotIyBhIGZmbHVzaCgpIGFmdGVyIGV2ZXJ5IHdyaXRlIHRvIFNURE9VVC4KLSMKLXNlbGVjdCAoU1RET1VUKTsKLSR8ID0gMTsKLXByaW50ZiAoIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sXG5cbiIpOwotCi0jCi0jIEZpbmUsIG5vdyBidWZmZXJpbmcgY2FuIGdvIGJhY2sgdG8gbm9ybWFsLgotIwotJHwgPSAwOwotCi0jCi0jIFNldCB1cCB0aGUgSFRNTCBwYWdlIHRpdGxlCi0kdGl0bGUgPSAiQXBhY2hlIERvY3VtZW50YXRpb24gU2VhcmNoIjsKLSR0aXRsZSAuPSAiOiBSZXN1bHRzIGZvciBcIiR3b3JkXCIiIGlmICgkd29yZCk7Ci0KLSMKLSMgV2UnbGwgcmUtdXNlIHRoZSBIVE1MIHNjYWxhciBzZXZlcmFsIHRpbWVzOyB3ZSB1c2UgaXQgd2l0aCBoZXJlCi0jIGRvY3VtZW50cyBmb3IgbXVsdGktbGluZSBzdGF0aWMgSFRNTCBjb2RlLiAgTGV0cycgZG8gdGhlIHN0YW5kYXJkIHBhZ2UKLSMgaGVhZGVyLgotIwotJEhUTUwgPSA8PEVPSFQ7Ci08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLSA8SEVBRD4KLSAgPFRJVExFPiR0aXRsZQotICA8L1RJVExFPgotIDwvSEVBRD4KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLSA8Qk9EWQotICBCR0NPTE9SPSIjRkZGRkZGIgotICBURVhUPSIjMDAwMDAwIgotICBMSU5LPSIjMDAwMEZGIgotICBWTElOSz0iIzAwMDA4MCIKLSAgQUxJTks9IiNGRjAwMDAiCi0gPgotICA8RElWIEFMSUdOPSJDRU5URVIiPgotICAgPElNRwotICAgIFNSQz0iJHtwcmVmaXh9aW1hZ2VzL3N1Yi5naWYiCi0gICAgQUxUPSIiCi0gICA+Ci0gIDwvRElWPgotICA8SDEgQUxJR049IkNFTlRFUiI+Ci0gICBBcGFjaGUgRG9jdW1lbnRhdGlvbiBTZWFyY2gKLSAgPC9IMT4KLSAgPFA+Ci0gIFRoaXMgc2NyaXB0IHBlcmZvcm1zIGEgdmVyeSBzaW1wbGUgc2VhcmNoIGFjcm9zcyB0aGUgQXBhY2hlCi0gIGRvY3VtZW50YXRpb24gZm9yIGFueSBzaW5nbGUgY2FzZS1pbnNlbnNpdGl2ZSB3b3JkLiAgTm8gY29tYmluYXRpb25zLAotICB3aWxkY2FyZHMsIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIHdvcmQtc3R1YmJpbmcsIG9yIG90aGVyIGZhbmN5IG9wdGlvbnMKLSAgYXJlIHN1cHBvcnRlZDsgdGhpcyBpcyBqdXN0IHRvIGhlbHAgeW91IGZpbmQgdG9waWNzIHF1aWNrbHkuICBPbmx5Ci0gIHRob3NlIHBhZ2VzIHdoaWNoIGluY2x1ZGUgdGhlIDxFTT5leGFjdDwvRU0+IHdvcmQgeW91IHR5cGUgd2lsbCBiZQotICBsaXN0ZWQuCi0gIDwvUD4KLSAgPFA+Ci0gIERvY3VtZW50cyBjb250YWluaW5nIHRoZSBzZWFyY2ggd29yZCBhcmUgPEVNPm5vdDwvRU0+IGxpc3RlZCBpbiBhbnkKLSAgc29ydCBvZiBwcmlvcml0eSBvcmRlci4KLSAgPC9QPgotICA8SVNJTkRFWCBQUk9NUFQ9IkVudGVyIHdvcmQgdG8gZmluZCBhbmQgcHJlc3MgRU5URVI6ICI+Ci1FT0hUCi0KLXByaW50ZiAoJEhUTUwpOwotCi0jCi0jIE5vdyBzZXQgdXAgdGhlIG5leHQgc2VjdGlvbiwgd2hpY2ggaXMgb25seSBkaXNwbGF5ZWQgaWYgd2UndmUgYmVlbgotIyBnaXZlbiBhIHdvcmQgdG8gZmluZC4KLSMKLSRIVE1MID0gPDxFT0hUOwotICA8SFI+Ci0gIDxIMj4KLSAgIFJlc3VsdHMgb2YgU2VhcmNoIGZvciA8U0FNUD4kd29yZDwvU0FNUD4KLSAgPC9IMj4KLUVPSFQKLQotIwotIyBXZSBlbmJsb2NrIHRoZSBuZXh0IHNlY3Rpb24gc28gcHJvYmxlbXMgY2FuIGRyb3Agb3V0IHRvIHRoZSBjb21tb24KLSMgY2xvc3VyZSBjb2RlLgotIwotUVVFUlk6Ci0gICAgewotCWlmICgkd29yZCkgewotCSAgICAjCi0JICAgICMgVHJ5IGFuZCBvcGVuIHRoZSBpbmRleCBmaWxlOyBjb21wbGFpbiBiaXR0ZXJseSBpZiB3ZSBjYW4ndC4KLQkgICAgIwotCSAgICBpZiAoISBvcGVuIChJTkRFWCwgIjwkSU5ERVgiKSkgewotCQlwcmludGYgKCJDYW4ndCBmaW5kIGRvY3VtZW50YXRpb24gaW5kZXghIik7Ci0JCWxhc3QgUVVFUlk7Ci0JICAgIH0KLQkgICAgIwotCSAgICAjIEdvdCBpdDsgZGlzcGxheSB0aGUgc2VhcmNoLXJlc3VsdHMgaGVhZGVyLgotCSAgICAjCi0JICAgIHByaW50ZiAoJEhUTUwpOwotCSAgICAjCi0JICAgICMgUmVhZCB0aGUgZW50aXJlIGluZGV4IGluIGFuZCB0dXJuIGl0IGludG8gYW4gaGFzaCBmb3IgdGhlCi0JICAgICMgbG9va3VwLgotCSAgICAjCi0JICAgIEBpbmRleCA9IDxJTkRFWD47Ci0JICAgIGNsb3NlIChJTkRFWCk7Ci0JICAgIGNob21wIChAaW5kZXgpOwotCSAgICBmb3JlYWNoIChAaW5kZXgpIHsKLQkJKCRrZXksICRmaWxlcykgPSBzcGxpdCAoLzovLCAkXyk7Ci0JCSRJbmRleHska2V5fSA9ICRmaWxlczsKLQkgICAgfQotCSAgICAjCi0JICAgICMgVGhlIGRpY3Rpb25hcnkgaXMgYWxsIGxvd2VyY2FzZSB3b3Jkcy4gIFNtYXNoIG91ciBxdWVyeSB2YWx1ZQotCSAgICAjIGFuZCB0cnkgdG8gZmluZCBpdC4KLQkgICAgIwotCSAgICAkd29yZCA9IGxjICgkd29yZCk7Ci0JICAgIGlmICghIGV4aXN0cyAoJEluZGV4eyR3b3JkfSkpIHsKLQkJcHJpbnRmICgiICA8UD5cbiAgPEVNPlNvcnJ5LCBubyBtYXRjaGVzIGZvdW5kLjwvRU0+XG4gIDwvUD5cbiIpOwotCQlsYXN0IFFVRVJZOwotCSAgICB9Ci0JICAgICMKLQkgICAgIyBGb3VuZCBhbiBlbnRyeSwgc28gdHVybiB0aGUgaGFzaCB2YWx1ZSAoYSBjb21tYS1zZXBhcmF0ZWQgbGlzdAotCSAgICAjIG9mIHJlbGF0aXZlIGZpbGUgbmFtZXMpIGludG8gYW4gYXJyYXkgZm9yIGRpc3BsYXkuCi0JICAgICMgSW5jaWRlbnRhbGx5LCB0ZWxsIHRoZSB1c2VyIGhvdyBtYW55IHRoZXJlIGFyZS4KLQkgICAgIwotCSAgICBAZmlsZXMgPSBzcGxpdCAoLywvLCAkSW5kZXh7JHdvcmR9KTsKLQkgICAgcHJpbnRmICgiICA8UD5Ub3RhbCBvZiAlZCBtYXRjaCIsIHNjYWxhciAoQGZpbGVzKSk7Ci0JICAgICMKLQkgICAgIyBCZSBzbWFydCBhYm91dCBwbHVyYWxzLgotCSAgICAjCi0JICAgIGlmIChzY2FsYXIgKEBmaWxlcykgIT0gMSkgewotCQlwcmludGYgKCJlcyIpIDsKLQkgICAgfQotCSAgICBwcmludGYgKCIgZm91bmQuXG4gIDwvUD5cbiIpOwotCSAgICAjCi0JICAgICMgUmlnaHQuICBOb3cgZGlzcGxheSB0aGUgZmlsZXMgYXMgdGhleSdyZSBsaXN0ZWQuCi0JICAgICMKLQkgICAgcHJpbnRmICgiICA8T0w+XG4iKTsKLQkgICAgZm9yZWFjaCAoQGZpbGVzKSB7Ci0JCXByaW50ZiAoIiAgIDxMST48QSBIUkVGPVwiJHtwcmVmaXh9JF9cIj4iKTsKLQkJcHJpbnRmICgiPFNBTVA+JF88L1NBTVA+PC9BPlxuIik7Ci0JCXByaW50ZiAoIiAgIDwvTEk+XG4iKTsKLQkgICAgfQotCSAgICBwcmludGYgKCIgIDwvT0w+XG4iKTsKLQkgICAgIwotCSAgICAjIEMnZXN0IHRvdXQhCi0JICAgICMKLQl9Ci0gICAgfQotCi0jCi0jIEJhY2sgdG8gY29tbW9uIGNvZGUgLSB0aGUgZXhpdCBwYXRoLiAgRGlzcGxheSB0aGUgcGFnZSB0cmFpbGVyLgotIwotJEhUTUwgPSA8PEVPSFQ7Ci0gIDxBCi0gICBIUkVGPSIvIgotICA+PElNRwotICAgIFNSQz0iL2ltYWdlcy9hcGFjaGVfaG9tZS5naWYiCi0gICAgQUxUPSJIb21lIgotICAgPjwvQT4KLSAgPEhSPgotIDwvQk9EWT4KLTwvSFRNTD4KLUVPSFQKLQotcHJpbnRmICgkSFRNTCk7Ci1leGl0ICgwKTsKZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3NlY3Rpb25zLmh0bWwgYi9kb2NzL21hbnVhbC9zZWN0aW9ucy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGYzMzI5Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL3NlY3Rpb25zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+PEhFQUQ+Ci08VElUTEU+SG93IERpcmVjdG9yeSwgTG9jYXRpb24gYW5kIEZpbGVzIHNlY3Rpb25zIHdvcms8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5Ib3cgRGlyZWN0b3J5LCBMb2NhdGlvbiBhbmQgRmlsZXMgc2VjdGlvbnMgd29yazwvSDE+Ci0KLVRoZSBzZWN0aW9ucyA8QQotSFJFRj0ibW9kL2NvcmUuaHRtbCNkaXJlY3RvcnkiPjxDT0RFPiZsdDtEaXJlY3RvcnkmZ3Q7PC9DT0RFPjwvQT4sIDxBCi1IUkVGPSJtb2QvY29yZS5odG1sI2xvY2F0aW9uIj48Q09ERT4mbHQ7TG9jYXRpb24mZ3Q7PC9DT0RFPjwvQT4gYW5kIDxBCi1IUkVGPSJtb2QvY29yZS5odG1sI2ZpbGVzIj48Q09ERT4mbHQ7RmlsZXMmZ3Q7PC9DT0RFPjwvQT4gY2FuIGNvbnRhaW4KLWRpcmVjdGl2ZXMgd2hpY2ggb25seSBhcHBseSB0byBzcGVjaWZpZWQgZGlyZWN0b3JpZXMsIFVSTHMgb3IgZmlsZXMKLXJlc3BlY3RpdmVseS4gQWxzbyBodGFjY2VzcyBmaWxlcyBjYW4gYmUgdXNlZCBpbnNpZGUgYSBkaXJlY3RvcnkgdG8KLWFwcGx5IGRpcmVjdGl2ZXMgdG8gdGhhdCBkaXJlY3RvcnkuIFRoaXMgZG9jdW1lbnQgZXhwbGFpbnMgaG93IHRoZXNlCi1kaWZmZXJlbnQgc2VjdGlvbnMgZGlmZmVyIGFuZCBob3cgdGhleSByZWxhdGUgdG8gZWFjaCBvdGhlciB3aGVuCi1BcGFjaGUgZGVjaWRlcyB3aGljaCBkaXJlY3RpdmVzIGFwcGx5IGZvciBhIHBhcnRpY3VsYXIgZGlyZWN0b3J5IG9yCi1yZXF1ZXN0IFVSTC4KLQotPEgyPkRpcmVjdGl2ZXMgYWxsb3dlZCBpbiB0aGUgc2VjdGlvbnM8L0gyPgotCi1FdmVyeXRoaW5nIHRoYXQgaXMgc3ludGFjdGljYWxseSBhbGxvd2VkIGluCi08Q09ERT4mbHQ7RGlyZWN0b3J5Jmd0OzwvQ09ERT4gaXMgYWxzbyBhbGxvd2VkIGluCi08Q09ERT4mbHQ7TG9jYXRpb24mZ3Q7PC9DT0RFPiAoZXhjZXB0IGEgc3ViLTxDT0RFPiZsdDtGaWxlcyZndDs8L0NPREU+Ci1zZWN0aW9uKS4gIFNlbWFudGljYWxseSBob3dldmVyIHNvbWUgdGhpbmdzLCBhbmQgdGhlIG1vc3QKLW5vdGFibGUgYXJlIDxDT0RFPkFsbG93T3ZlcnJpZGU8L0NPREU+IGFuZCB0aGUgdHdvIG9wdGlvbnMKLTxDT0RFPkZvbGxvd1N5bUxpbmtzPC9DT0RFPiBhbmQgPENPREU+U3ltTGlua3NJZk93bmVyTWF0Y2g8L0NPREU+LAotbWFrZSBubyBzZW5zZSBpbiA8Q09ERT4mbHQ7TG9jYXRpb24mZ3Q7PC9DT0RFPiwKLTxDT0RFPiZsdDtMb2NhdGlvbk1hdGNoJmd0OzwvQ09ERT4gb3IgPENPREU+Jmx0O0RpcmVjdG9yeU1hdGNoJmd0OzwvQ09ERT4uCi1UaGUgc2FtZSBmb3IgPENPREU+Jmx0O0ZpbGVzJmd0OzwvQ09ERT4gLS0gc3ludGFjdGljYWxseSBldmVyeXRoaW5nCi1pcyBmaW5lLCBidXQgc2VtYW50aWNhbGx5IHNvbWUgdGhpbmdzIGFyZSBkaWZmZXJlbnQuCi0KLTxIMj5Ib3cgdGhlIHNlY3Rpb25zIGFyZSBtZXJnZWQ8L0gyPgotCi1UaGUgb3JkZXIgb2YgbWVyZ2luZyBpczoKLQotPE9MPgotCi08TEk+Ci0KLSA8Q09ERT4mbHQ7RGlyZWN0b3J5Jmd0OzwvQ09ERT4gKGV4Y2VwdCByZWd1bGFyIGV4cHJlc3Npb25zKSBhbmQKLSAuaHRhY2Nlc3MgZG9uZSBzaW11bHRhbmVvdXNseSAod2l0aCAuaHRhY2Nlc3Mgb3ZlcnJpZGluZwotIDxDT0RFPiZsdDtEaXJlY3RvcnkmZ3Q7PC9DT0RFPikKLQotPC9MST4KLQotPExJPgotIDxDT0RFPiZsdDtEaXJlY3RvcnlNYXRjaCZndDs8L0NPREU+LCBhbmQKLSA8Q09ERT4mbHQ7RGlyZWN0b3J5Jmd0OzwvQ09ERT4gd2l0aCByZWd1bGFyIGV4cHJlc3Npb25zCi0KLTwvTEk+Ci0KLSA8TEk+PENPREU+Jmx0O0ZpbGVzJmd0OzwvQ09ERT4gYW5kIDxDT0RFPiZsdDtGaWxlc01hdGNoJmd0OzwvQ09ERT4gZG9uZQotICBzaW11bHRhbmVvdXNseQotIDwvTEk+Ci0KLSA8TEk+PENPREU+Jmx0O0xvY2F0aW9uJmd0OzwvQ09ERT4gYW5kIDxDT0RFPiZsdDtMb2NhdGlvbk1hdGNoJmd0OzwvQ09ERT4gZG9uZQotICBzaW11bHRhbmVvdXNseQotIDwvTEk+Ci0KLTwvT0w+Ci0KLUFwYXJ0IGZyb20gPENPREU+Jmx0O0RpcmVjdG9yeSZndDs8L0NPREU+LCBlYWNoIGdyb3VwIGlzIHByb2Nlc3NlZCBpbgotdGhlIG9yZGVyIHRoYXQgdGhleSBhcHBlYXIgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLWZpbGVzLiA8Q09ERT4mbHQ7RGlyZWN0b3J5Jmd0OzwvQ09ERT4gKGdyb3VwIDEgYWJvdmUpIGlzIHByb2Nlc3NlZCBpbgotdGhlIG9yZGVyIHNob3J0ZXN0IGRpcmVjdG9yeSBjb21wb25lbnQgdG8gbG9uZ2VzdC4gSWYgbXVsdGlwbGUKLTxDT0RFPiZsdDtEaXJlY3RvcnkmZ3Q7PC9DT0RFPiBzZWN0aW9ucyBhcHBseSB0byB0aGUgc2FtZSBkaXJlY3RvcnkKLXRoZXkgdGhleSBhcmUgcHJvY2Vzc2VkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgb3JkZXIuICBUaGUKLWNvbmZpZ3VyYXRpb24gZmlsZXMgYXJlIHJlYWQgaW4gdGhlIG9yZGVyIGh0dHBkLmNvbmYsIHNybS5jb25mIGFuZAotYWNjZXNzLmNvbmYuIENvbmZpZ3VyYXRpb25zIGluY2x1ZGVkIHZpYSB0aGUgPENPREU+SW5jbHVkZTwvQ09ERT4KLWRpcmVjdGl2ZSB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgdGhleSB3aGVyZSBpbnNpZGUgdGhlIGluY2x1ZGluZyBmaWxlCi1hdCB0aGUgbG9jYXRpb24gb2YgdGhlIDxDT0RFPkluY2x1ZGU8L0NPREU+IGRpcmVjdGl2ZS4KLQotPFA+Ci0KLVNlY3Rpb25zIGluc2lkZSA8Q09ERT4mbHQ7VmlydHVhbEhvc3QmZ3Q7PC9DT0RFPiBzZWN0aW9ucyBhcmUgYXBwbGllZAotPEVNPmFmdGVyPC9FTT4gdGhlIGNvcnJlc3BvbmRpbmcgc2VjdGlvbnMgb3V0c2lkZSB0aGUgdmlydHVhbCBob3N0Ci1kZWZpbml0aW9uLiBUaGlzIGFsbG93cyB2aXJ0dWFsIGhvc3RzIHRvIG92ZXJyaWRlIHRoZSBtYWluIHNlcnZlcgotY29uZmlndXJhdGlvbi4gKE5vdGU6IHRoaXMgb25seSB3b3JrcyBjb3JyZWN0bHkgZnJvbSAxLjIuMiBhbmQgMS4zYTIKLW9ud2FyZHMuIEJlZm9yZSB0aG9zZSByZWxlYXNlcyBzZWN0aW9ucyBpbnNpZGUgdmlydHVhbCBob3N0cyB3ZXJlCi1hcHBsaWVkIDxFTT5iZWZvcmU8L0VNPiB0aGUgbWFpbiBzZXJ2ZXIpLgotCi08SDI+Tm90ZXMgYWJvdXQgdXNpbmcgc2VjdGlvbnM8L0gyPgotCi1UaGUgZ2VuZXJhbCBndWlkZWxpbmVzIGFyZToKLQotPFA+Ci0KLTxVTD4KLTxMST4KLSAgICBJZiB5b3UgYXJlIGF0dGVtcHRpbmcgdG8gbWF0Y2ggb2JqZWN0cyBhdCB0aGUgZmlsZXN5c3RlbSBsZXZlbAotICAgIHRoZW4geW91IG11c3QgdXNlIDxDT0RFPiZsdDtEaXJlY3RvcnkmZ3Q7PC9DT0RFPiBhbmQvb3IKLSAgICA8Q09ERT4mbHQ7RmlsZXMmZ3Q7PC9DT0RFPi4KLTwvTEk+Ci0KLTxMST4KLSAgICBJZiB5b3UgYXJlIGF0dGVtcHRpbmcgdG8gbWF0Y2ggb2JqZWN0cyBhdCB0aGUgVVJMIGxldmVsIHRoZW4geW91Ci0gICAgbXVzdCB1c2UgPENPREU+Jmx0O0xvY2F0aW9uJmd0OzwvQ09ERT4KLTwvTEk+Ci08L1VMPgotCi1CdXQgYSBub3RhYmxlIGV4Y2VwdGlvbiBpczoKLQotPFVMPgotPExJPgotICAgIHByb3h5IGNvbnRyb2wgaXMgZG9uZSB2aWEgPENPREU+Jmx0O0RpcmVjdG9yeSZndDs8L0NPREU+LiAgVGhpcyBpcwotICAgIGEgbGVnYWN5IG1pc3Rha2UgYmVjYXVzZSB0aGUgcHJveHkgZXhpc3RlZCBwcmlvciB0bwotICAgIDxDT0RFPiZsdDtMb2NhdGlvbiZndDs8L0NPREU+LiAgQSBmdXR1cmUgdmVyc2lvbiBvZiB0aGUgY29uZmlnCi0gICAgbGFuZ3VhZ2Ugc2hvdWxkIHByb2JhYmx5IHN3aXRjaCB0aGlzIHRvCi0gICAgPENPREU+Jmx0O0xvY2F0aW9uJmd0OzwvQ09ERT4uCi08L0xJPgotPC9VTD4KLQotPFA+Ci1Ob3RlIGFib3V0IC5odGFjY2VzcyBwYXJzaW5nOgotPC9QPgotPFVMPgotPExJPgotICAgIE1vZGlmeWluZyAuaHRhY2Nlc3MgcGFyc2luZyBkdXJpbmcgTG9jYXRpb24gZG9lc24ndCBkbwotICAgIGFueXRoaW5nIGJlY2F1c2UgLmh0YWNjZXNzIHBhcnNpbmcgaGFzIGFscmVhZHkgb2NjdXJyZWQuCi08L1VMPgotCi08UD4KLTxDT0RFPiZsdDtMb2NhdGlvbiZndDs8L0NPREU+IGFuZCBzeW1ib2xpYyBsaW5rczoKLTwvUD4KLTxVTD4KLTxMST4KLSAgICBJdCBpcyBub3QgcG9zc2libGUgdG8gdXNlICI8Q09ERT5PcHRpb25zIEZvbGxvd1N5bUxpbmtzPC9DT0RFPiIKLSAgICBvciAiPENPREU+T3B0aW9ucyBTeW1MaW5rc0lmT3duZXJNYXRjaDwvQ09ERT4iIGluc2lkZSBhCi0gICAgPENPREU+Jmx0O0xvY2F0aW9uJmd0OzwvQ09ERT4sIDxDT0RFPiZsdDtMb2NhdGlvbk1hdGNoJmd0OzwvQ09ERT4KLSAgICBvciA8Q09ERT4mbHQ7RGlyZWN0b3J5TWF0Y2gmZ3Q7PC9DT0RFPiBzZWN0aW9uCi0gICAgKHRoZSBvcHRpb25zIGFyZSBzaW1wbHkgaWdub3JlZCkuCi0gICAgVXNpbmcgdGhlIG9wdGlvbnMgaW4gcXVlc3Rpb24gaXMgb25seSBwb3NzaWJsZSBpbnNpZGUgYQotICAgIDxDT0RFPiZsdDtEaXJlY3RvcnkmZ3Q7PC9DT0RFPiBzZWN0aW9uIChvciBhIDxDT0RFPi5odGFjY2VzczwvQ09ERT4gZmlsZSkuCi08L1VMPgotCi08UD4KLTxDT0RFPiZsdDtGaWxlcyZndDs8L0NPREU+IGFuZCA8Q09ERT5PcHRpb25zPC9DT0RFPjoKLTwvUD4KLTxVTD4KLTxMST4KLSAgICBBcGFjaGUgd29uJ3QgY2hlY2sgZm9yIGl0LCBidXQgdXNpbmcgYW4gPENPREU+T3B0aW9uczwvQ09ERT4KLSAgICBkaXJlY3RpdmUgaW5zaWRlIGEgPENPREU+Jmx0O0ZpbGVzJmd0OzwvQ09ERT4gc2VjdGlvbiBoYXMgbm8gZWZmZWN0LgotPC9VTD4KLQotPFA+Ci1Bbm90aGVyIG5vdGU6Ci08L1A+Ci0KLTxVTD4KLTxMST4KLSAgICBUaGVyZSBpcyBhY3R1YWxseSBhCi0gICAgPENPREU+Jmx0O0xvY2F0aW9uJmd0OzwvQ09ERT4vPENPREU+Jmx0O0xvY2F0aW9uTWF0Y2gmZ3Q7PC9DT0RFPgotICAgIHNlcXVlbmNlIHBlcmZvcm1lZCBqdXN0IGJlZm9yZSB0aGUgbmFtZSB0cmFuc2xhdGlvbiBwaGFzZSAod2hlcmUKLSAgICA8Q09ERT5BbGlhc2VzPC9DT0RFPiBhbmQgPENPREU+RG9jdW1lbnRSb290czwvQ09ERT4gYXJlIHVzZWQgdG8KLSAgICBtYXAgVVJMcyB0byBmaWxlbmFtZXMpLiAgVGhlIHJlc3VsdHMgb2YgdGhpcyBzZXF1ZW5jZSBhcmUKLSAgICBjb21wbGV0ZWx5IHRocm93biBhd2F5IGFmdGVyIHRoZSB0cmFuc2xhdGlvbiBoYXMgY29tcGxldGVkLgotPC9MST4KLTwvVUw+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvc2VjdGlvbnMuaHRtbC5lbiBiL2RvY3MvbWFudWFsL3NlY3Rpb25zLmh0bWwuZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZjMzMjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvc2VjdGlvbnMuaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD48SEVBRD4KLTxUSVRMRT5Ib3cgRGlyZWN0b3J5LCBMb2NhdGlvbiBhbmQgRmlsZXMgc2VjdGlvbnMgd29yazwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPkhvdyBEaXJlY3RvcnksIExvY2F0aW9uIGFuZCBGaWxlcyBzZWN0aW9ucyB3b3JrPC9IMT4KLQotVGhlIHNlY3Rpb25zIDxBCi1IUkVGPSJtb2QvY29yZS5odG1sI2RpcmVjdG9yeSI+PENPREU+Jmx0O0RpcmVjdG9yeSZndDs8L0NPREU+PC9BPiwgPEEKLUhSRUY9Im1vZC9jb3JlLmh0bWwjbG9jYXRpb24iPjxDT0RFPiZsdDtMb2NhdGlvbiZndDs8L0NPREU+PC9BPiBhbmQgPEEKLUhSRUY9Im1vZC9jb3JlLmh0bWwjZmlsZXMiPjxDT0RFPiZsdDtGaWxlcyZndDs8L0NPREU+PC9BPiBjYW4gY29udGFpbgotZGlyZWN0aXZlcyB3aGljaCBvbmx5IGFwcGx5IHRvIHNwZWNpZmllZCBkaXJlY3RvcmllcywgVVJMcyBvciBmaWxlcwotcmVzcGVjdGl2ZWx5LiBBbHNvIGh0YWNjZXNzIGZpbGVzIGNhbiBiZSB1c2VkIGluc2lkZSBhIGRpcmVjdG9yeSB0bwotYXBwbHkgZGlyZWN0aXZlcyB0byB0aGF0IGRpcmVjdG9yeS4gVGhpcyBkb2N1bWVudCBleHBsYWlucyBob3cgdGhlc2UKLWRpZmZlcmVudCBzZWN0aW9ucyBkaWZmZXIgYW5kIGhvdyB0aGV5IHJlbGF0ZSB0byBlYWNoIG90aGVyIHdoZW4KLUFwYWNoZSBkZWNpZGVzIHdoaWNoIGRpcmVjdGl2ZXMgYXBwbHkgZm9yIGEgcGFydGljdWxhciBkaXJlY3Rvcnkgb3IKLXJlcXVlc3QgVVJMLgotCi08SDI+RGlyZWN0aXZlcyBhbGxvd2VkIGluIHRoZSBzZWN0aW9uczwvSDI+Ci0KLUV2ZXJ5dGhpbmcgdGhhdCBpcyBzeW50YWN0aWNhbGx5IGFsbG93ZWQgaW4KLTxDT0RFPiZsdDtEaXJlY3RvcnkmZ3Q7PC9DT0RFPiBpcyBhbHNvIGFsbG93ZWQgaW4KLTxDT0RFPiZsdDtMb2NhdGlvbiZndDs8L0NPREU+IChleGNlcHQgYSBzdWItPENPREU+Jmx0O0ZpbGVzJmd0OzwvQ09ERT4KLXNlY3Rpb24pLiAgU2VtYW50aWNhbGx5IGhvd2V2ZXIgc29tZSB0aGluZ3MsIGFuZCB0aGUgbW9zdAotbm90YWJsZSBhcmUgPENPREU+QWxsb3dPdmVycmlkZTwvQ09ERT4gYW5kIHRoZSB0d28gb3B0aW9ucwotPENPREU+Rm9sbG93U3ltTGlua3M8L0NPREU+IGFuZCA8Q09ERT5TeW1MaW5rc0lmT3duZXJNYXRjaDwvQ09ERT4sCi1tYWtlIG5vIHNlbnNlIGluIDxDT0RFPiZsdDtMb2NhdGlvbiZndDs8L0NPREU+LAotPENPREU+Jmx0O0xvY2F0aW9uTWF0Y2gmZ3Q7PC9DT0RFPiBvciA8Q09ERT4mbHQ7RGlyZWN0b3J5TWF0Y2gmZ3Q7PC9DT0RFPi4KLVRoZSBzYW1lIGZvciA8Q09ERT4mbHQ7RmlsZXMmZ3Q7PC9DT0RFPiAtLSBzeW50YWN0aWNhbGx5IGV2ZXJ5dGhpbmcKLWlzIGZpbmUsIGJ1dCBzZW1hbnRpY2FsbHkgc29tZSB0aGluZ3MgYXJlIGRpZmZlcmVudC4KLQotPEgyPkhvdyB0aGUgc2VjdGlvbnMgYXJlIG1lcmdlZDwvSDI+Ci0KLVRoZSBvcmRlciBvZiBtZXJnaW5nIGlzOgotCi08T0w+Ci0KLTxMST4KLQotIDxDT0RFPiZsdDtEaXJlY3RvcnkmZ3Q7PC9DT0RFPiAoZXhjZXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnMpIGFuZAotIC5odGFjY2VzcyBkb25lIHNpbXVsdGFuZW91c2x5ICh3aXRoIC5odGFjY2VzcyBvdmVycmlkaW5nCi0gPENPREU+Jmx0O0RpcmVjdG9yeSZndDs8L0NPREU+KQotCi08L0xJPgotCi08TEk+Ci0gPENPREU+Jmx0O0RpcmVjdG9yeU1hdGNoJmd0OzwvQ09ERT4sIGFuZAotIDxDT0RFPiZsdDtEaXJlY3RvcnkmZ3Q7PC9DT0RFPiB3aXRoIHJlZ3VsYXIgZXhwcmVzc2lvbnMKLQotPC9MST4KLQotIDxMST48Q09ERT4mbHQ7RmlsZXMmZ3Q7PC9DT0RFPiBhbmQgPENPREU+Jmx0O0ZpbGVzTWF0Y2gmZ3Q7PC9DT0RFPiBkb25lCi0gIHNpbXVsdGFuZW91c2x5Ci0gPC9MST4KLQotIDxMST48Q09ERT4mbHQ7TG9jYXRpb24mZ3Q7PC9DT0RFPiBhbmQgPENPREU+Jmx0O0xvY2F0aW9uTWF0Y2gmZ3Q7PC9DT0RFPiBkb25lCi0gIHNpbXVsdGFuZW91c2x5Ci0gPC9MST4KLQotPC9PTD4KLQotQXBhcnQgZnJvbSA8Q09ERT4mbHQ7RGlyZWN0b3J5Jmd0OzwvQ09ERT4sIGVhY2ggZ3JvdXAgaXMgcHJvY2Vzc2VkIGluCi10aGUgb3JkZXIgdGhhdCB0aGV5IGFwcGVhciBpbiB0aGUgY29uZmlndXJhdGlvbgotZmlsZXMuIDxDT0RFPiZsdDtEaXJlY3RvcnkmZ3Q7PC9DT0RFPiAoZ3JvdXAgMSBhYm92ZSkgaXMgcHJvY2Vzc2VkIGluCi10aGUgb3JkZXIgc2hvcnRlc3QgZGlyZWN0b3J5IGNvbXBvbmVudCB0byBsb25nZXN0LiBJZiBtdWx0aXBsZQotPENPREU+Jmx0O0RpcmVjdG9yeSZndDs8L0NPREU+IHNlY3Rpb25zIGFwcGx5IHRvIHRoZSBzYW1lIGRpcmVjdG9yeQotdGhleSB0aGV5IGFyZSBwcm9jZXNzZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBvcmRlci4gIFRoZQotY29uZmlndXJhdGlvbiBmaWxlcyBhcmUgcmVhZCBpbiB0aGUgb3JkZXIgaHR0cGQuY29uZiwgc3JtLmNvbmYgYW5kCi1hY2Nlc3MuY29uZi4gQ29uZmlndXJhdGlvbnMgaW5jbHVkZWQgdmlhIHRoZSA8Q09ERT5JbmNsdWRlPC9DT0RFPgotZGlyZWN0aXZlIHdpbGwgYmUgdHJlYXRlZCBhcyBpZiB0aGV5IHdoZXJlIGluc2lkZSB0aGUgaW5jbHVkaW5nIGZpbGUKLWF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgPENPREU+SW5jbHVkZTwvQ09ERT4gZGlyZWN0aXZlLgotCi08UD4KLQotU2VjdGlvbnMgaW5zaWRlIDxDT0RFPiZsdDtWaXJ0dWFsSG9zdCZndDs8L0NPREU+IHNlY3Rpb25zIGFyZSBhcHBsaWVkCi08RU0+YWZ0ZXI8L0VNPiB0aGUgY29ycmVzcG9uZGluZyBzZWN0aW9ucyBvdXRzaWRlIHRoZSB2aXJ0dWFsIGhvc3QKLWRlZmluaXRpb24uIFRoaXMgYWxsb3dzIHZpcnR1YWwgaG9zdHMgdG8gb3ZlcnJpZGUgdGhlIG1haW4gc2VydmVyCi1jb25maWd1cmF0aW9uLiAoTm90ZTogdGhpcyBvbmx5IHdvcmtzIGNvcnJlY3RseSBmcm9tIDEuMi4yIGFuZCAxLjNhMgotb253YXJkcy4gQmVmb3JlIHRob3NlIHJlbGVhc2VzIHNlY3Rpb25zIGluc2lkZSB2aXJ0dWFsIGhvc3RzIHdlcmUKLWFwcGxpZWQgPEVNPmJlZm9yZTwvRU0+IHRoZSBtYWluIHNlcnZlcikuCi0KLTxIMj5Ob3RlcyBhYm91dCB1c2luZyBzZWN0aW9uczwvSDI+Ci0KLVRoZSBnZW5lcmFsIGd1aWRlbGluZXMgYXJlOgotCi08UD4KLQotPFVMPgotPExJPgotICAgIElmIHlvdSBhcmUgYXR0ZW1wdGluZyB0byBtYXRjaCBvYmplY3RzIGF0IHRoZSBmaWxlc3lzdGVtIGxldmVsCi0gICAgdGhlbiB5b3UgbXVzdCB1c2UgPENPREU+Jmx0O0RpcmVjdG9yeSZndDs8L0NPREU+IGFuZC9vcgotICAgIDxDT0RFPiZsdDtGaWxlcyZndDs8L0NPREU+LgotPC9MST4KLQotPExJPgotICAgIElmIHlvdSBhcmUgYXR0ZW1wdGluZyB0byBtYXRjaCBvYmplY3RzIGF0IHRoZSBVUkwgbGV2ZWwgdGhlbiB5b3UKLSAgICBtdXN0IHVzZSA8Q09ERT4mbHQ7TG9jYXRpb24mZ3Q7PC9DT0RFPgotPC9MST4KLTwvVUw+Ci0KLUJ1dCBhIG5vdGFibGUgZXhjZXB0aW9uIGlzOgotCi08VUw+Ci08TEk+Ci0gICAgcHJveHkgY29udHJvbCBpcyBkb25lIHZpYSA8Q09ERT4mbHQ7RGlyZWN0b3J5Jmd0OzwvQ09ERT4uICBUaGlzIGlzCi0gICAgYSBsZWdhY3kgbWlzdGFrZSBiZWNhdXNlIHRoZSBwcm94eSBleGlzdGVkIHByaW9yIHRvCi0gICAgPENPREU+Jmx0O0xvY2F0aW9uJmd0OzwvQ09ERT4uICBBIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoZSBjb25maWcKLSAgICBsYW5ndWFnZSBzaG91bGQgcHJvYmFibHkgc3dpdGNoIHRoaXMgdG8KLSAgICA8Q09ERT4mbHQ7TG9jYXRpb24mZ3Q7PC9DT0RFPi4KLTwvTEk+Ci08L1VMPgotCi08UD4KLU5vdGUgYWJvdXQgLmh0YWNjZXNzIHBhcnNpbmc6Ci08L1A+Ci08VUw+Ci08TEk+Ci0gICAgTW9kaWZ5aW5nIC5odGFjY2VzcyBwYXJzaW5nIGR1cmluZyBMb2NhdGlvbiBkb2Vzbid0IGRvCi0gICAgYW55dGhpbmcgYmVjYXVzZSAuaHRhY2Nlc3MgcGFyc2luZyBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KLTwvVUw+Ci0KLTxQPgotPENPREU+Jmx0O0xvY2F0aW9uJmd0OzwvQ09ERT4gYW5kIHN5bWJvbGljIGxpbmtzOgotPC9QPgotPFVMPgotPExJPgotICAgIEl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgIjxDT0RFPk9wdGlvbnMgRm9sbG93U3ltTGlua3M8L0NPREU+IgotICAgIG9yICI8Q09ERT5PcHRpb25zIFN5bUxpbmtzSWZPd25lck1hdGNoPC9DT0RFPiIgaW5zaWRlIGEKLSAgICA8Q09ERT4mbHQ7TG9jYXRpb24mZ3Q7PC9DT0RFPiwgPENPREU+Jmx0O0xvY2F0aW9uTWF0Y2gmZ3Q7PC9DT0RFPgotICAgIG9yIDxDT0RFPiZsdDtEaXJlY3RvcnlNYXRjaCZndDs8L0NPREU+IHNlY3Rpb24KLSAgICAodGhlIG9wdGlvbnMgYXJlIHNpbXBseSBpZ25vcmVkKS4KLSAgICBVc2luZyB0aGUgb3B0aW9ucyBpbiBxdWVzdGlvbiBpcyBvbmx5IHBvc3NpYmxlIGluc2lkZSBhCi0gICAgPENPREU+Jmx0O0RpcmVjdG9yeSZndDs8L0NPREU+IHNlY3Rpb24gKG9yIGEgPENPREU+Lmh0YWNjZXNzPC9DT0RFPiBmaWxlKS4KLTwvVUw+Ci0KLTxQPgotPENPREU+Jmx0O0ZpbGVzJmd0OzwvQ09ERT4gYW5kIDxDT0RFPk9wdGlvbnM8L0NPREU+OgotPC9QPgotPFVMPgotPExJPgotICAgIEFwYWNoZSB3b24ndCBjaGVjayBmb3IgaXQsIGJ1dCB1c2luZyBhbiA8Q09ERT5PcHRpb25zPC9DT0RFPgotICAgIGRpcmVjdGl2ZSBpbnNpZGUgYSA8Q09ERT4mbHQ7RmlsZXMmZ3Q7PC9DT0RFPiBzZWN0aW9uIGhhcyBubyBlZmZlY3QuCi08L1VMPgotCi08UD4KLUFub3RoZXIgbm90ZToKLTwvUD4KLQotPFVMPgotPExJPgotICAgIFRoZXJlIGlzIGFjdHVhbGx5IGEKLSAgICA8Q09ERT4mbHQ7TG9jYXRpb24mZ3Q7PC9DT0RFPi88Q09ERT4mbHQ7TG9jYXRpb25NYXRjaCZndDs8L0NPREU+Ci0gICAgc2VxdWVuY2UgcGVyZm9ybWVkIGp1c3QgYmVmb3JlIHRoZSBuYW1lIHRyYW5zbGF0aW9uIHBoYXNlICh3aGVyZQotICAgIDxDT0RFPkFsaWFzZXM8L0NPREU+IGFuZCA8Q09ERT5Eb2N1bWVudFJvb3RzPC9DT0RFPiBhcmUgdXNlZCB0bwotICAgIG1hcCBVUkxzIHRvIGZpbGVuYW1lcykuICBUaGUgcmVzdWx0cyBvZiB0aGlzIHNlcXVlbmNlIGFyZQotICAgIGNvbXBsZXRlbHkgdGhyb3duIGF3YXkgYWZ0ZXIgdGhlIHRyYW5zbGF0aW9uIGhhcyBjb21wbGV0ZWQuCi08L0xJPgotPC9VTD4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC9zdG9wcGluZy5odG1sIGIvZG9jcy9tYW51YWwvc3RvcHBpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgzZDFjMC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9zdG9wcGluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+U3RvcHBpbmcgYW5kIFJlc3RhcnRpbmcgQXBhY2hlPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+U3RvcHBpbmcgYW5kIFJlc3RhcnRpbmcgQXBhY2hlPC9IMT4KLQotPFA+VGhpcyBkb2N1bWVudCBjb3ZlcnMgc3RvcHBpbmcgYW5kIHJlc3RhcnRpbmcgQXBhY2hlIG9uIFVuaXgKLW9ubHkuIFdpbmRvd3MgdXNlcnMgc2hvdWxkIHNlZSA8QSBIUkVGPSJ3aW5kb3dzLmh0bWwjc2lnbmFsIj5TaWduYWxsaW5nCi1BcGFjaGUgd2hlbiBydW5uaW5nPC9BPi48L1A+Ci0KLTxQPllvdSB3aWxsIG5vdGljZSBtYW55IDxDT0RFPmh0dHBkPC9DT0RFPiBleGVjdXRhYmxlcyBydW5uaW5nIG9uIHlvdXIgc3lzdGVtLAotYnV0IHlvdSBzaG91bGQgbm90IHNlbmQgc2lnbmFscyB0byBhbnkgb2YgdGhlbSBleGNlcHQgdGhlIHBhcmVudCwgd2hvc2UKLXBpZCBpcyBpbiB0aGUgPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNwaWRmaWxlIj5QaWRGaWxlPC9BPi4gIFRoYXQgaXMgdG8KLXNheSB5b3Ugc2hvdWxkbid0IGV2ZXIgbmVlZCB0byBzZW5kIHNpZ25hbHMgdG8gYW55IHByb2Nlc3MgZXhjZXB0IHRoZQotcGFyZW50LiAgVGhlcmUgYXJlIHRocmVlIHNpZ25hbHMgdGhhdCB5b3UgY2FuIHNlbmQgdGhlIHBhcmVudDoKLTxDT0RFPlRFUk08L0NPREU+LCA8Q09ERT5IVVA8L0NPREU+LCBhbmQgPENPREU+VVNSMTwvQ09ERT4sIHdoaWNoIHdpbGwKLWJlIGRlc2NyaWJlZCBpbiBhIG1vbWVudC4KLQotPFA+VG8gc2VuZCBhIHNpZ25hbCB0byB0aGUgcGFyZW50IHlvdSBzaG91bGQgaXNzdWUgYSBjb21tYW5kIHN1Y2ggYXM6Ci08QkxPQ0tRVU9URT48UFJFPgotICAgIGtpbGwgLVRFUk0gYGNhdCAvdXNyL2xvY2FsL2FwYWNoZS9sb2dzL2h0dHBkLnBpZGAKLTwvUFJFPjwvQkxPQ0tRVU9URT4KLQotWW91IGNhbiByZWFkIGFib3V0IGl0cyBwcm9ncmVzcyBieSBpc3N1aW5nOgotCi08QkxPQ0tRVU9URT48UFJFPgotICAgIHRhaWwgLWYgL3Vzci9sb2NhbC9hcGFjaGUvbG9ncy9lcnJvcl9sb2cKLTwvUFJFPjwvQkxPQ0tRVU9URT4KLQotTW9kaWZ5IHRob3NlIGV4YW1wbGVzIHRvIG1hdGNoIHlvdXIKLTxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvQT4gYW5kCi08QSBIUkVGPSJtb2QvY29yZS5odG1sI3BpZGZpbGUiPlBpZEZpbGU8L0E+IHNldHRpbmdzLgotCi08UD5BcyBvZiBBcGFjaGUgMS4zIHdlIHByb3ZpZGUgYSBzY3JpcHQgPENPREU+c3JjL3N1cHBvcnQvYXBhY2hlY3RsPC9DT0RFPgotd2hpY2ggY2FuIGJlIHVzZWQgdG8gc3RhcnQsIHN0b3AsIGFuZCByZXN0YXJ0IEFwYWNoZS4gIEl0IG1heSBuZWVkIGEKLWxpdHRsZSBjdXN0b21pemF0aW9uIGZvciB5b3VyIHN5c3RlbSwgc2VlIHRoZSBjb21tZW50cyBhdCB0aGUgdG9wIG9mCi10aGUgc2NyaXB0LgotCi08SDM+VEVSTSBTaWduYWw6IHN0b3Agbm93PC9IMz4KLQotPFA+U2VuZGluZyB0aGUgPENPREU+VEVSTTwvQ09ERT4gc2lnbmFsIHRvIHRoZSBwYXJlbnQgY2F1c2VzIGl0IHRvCi1pbW1lZGlhdGVseSBhdHRlbXB0IHRvIGtpbGwgb2ZmIGFsbCBvZiBpdHMgY2hpbGRyZW4uICBJdCBtYXkgdGFrZSBpdAotc2V2ZXJhbCBzZWNvbmRzIHRvIGNvbXBsZXRlIGtpbGxpbmcgb2ZmIGl0cyBjaGlsZHJlbi4gIFRoZW4gdGhlCi1wYXJlbnQgaXRzZWxmIGV4aXRzLiAgQW55IHJlcXVlc3RzIGluIHByb2dyZXNzIGFyZSB0ZXJtaW5hdGVkLCBhbmQgbm8KLWZ1cnRoZXIgcmVxdWVzdHMgYXJlIHNlcnZlZC4KLQotPEgzPkhVUCBTaWduYWw6IHJlc3RhcnQgbm93PC9IMz4KLQotPFA+U2VuZGluZyB0aGUgPENPREU+SFVQPC9DT0RFPiBzaWduYWwgdG8gdGhlIHBhcmVudCBjYXVzZXMgaXQgdG8ga2lsbCBvZmYKLWl0cyBjaGlsZHJlbiBsaWtlIGluIDxDT0RFPlRFUk08L0NPREU+IGJ1dCB0aGUgcGFyZW50IGRvZXNuJ3QgZXhpdC4gIEl0Ci1yZS1yZWFkcyBpdHMgY29uZmlndXJhdGlvbiBmaWxlcywgYW5kIHJlLW9wZW5zIGFueSBsb2cgZmlsZXMuCi1UaGVuIGl0IHNwYXducyBhIG5ldyBzZXQgb2YgY2hpbGRyZW4gYW5kIGNvbnRpbnVlcwotc2VydmluZyBoaXRzLgotCi08UD5Vc2VycyBvZiB0aGUKLTxBIEhSRUY9Im1vZC9tb2Rfc3RhdHVzLmh0bWwiPnN0YXR1cyBtb2R1bGU8L0E+Ci13aWxsIG5vdGljZSB0aGF0IHRoZSBzZXJ2ZXIgc3RhdGlzdGljcyBhcmUKLXNldCB0byB6ZXJvIHdoZW4gYSA8Q09ERT5IVVA8L0NPREU+IGlzIHNlbnQuCi0KLTxQPjxTVFJPTkc+Tm90ZTo8L1NUUk9ORz4gSWYgeW91ciBjb25maWd1cmF0aW9uIGZpbGUgaGFzIGVycm9ycyBpbiBpdCB3aGVuCi15b3UgaXNzdWUgYQotcmVzdGFydCB0aGVuIHlvdXIgcGFyZW50IHdpbGwgbm90IHJlc3RhcnQsIGl0IHdpbGwgZXhpdCB3aXRoIGFuIGVycm9yLgotU2VlIGJlbG93IGZvciBhIG1ldGhvZCBvZiBhdm9pZGluZyB0aGlzLgotCi08SDM+VVNSMSBTaWduYWw6IGdyYWNlZnVsIHJlc3RhcnQ8L0gzPgotCi08UD48U1RST05HPk5vdGU6PC9TVFJPTkc+IHByaW9yIHRvIHJlbGVhc2UgMS4yYjkgdGhpcyBjb2RlIGlzIHF1aXRlIHVuc3RhYmxlCi1hbmQgc2hvdWxkbid0IGJlIHVzZWQgYXQgYWxsLgotCi08UD5UaGUgPENPREU+VVNSMTwvQ09ERT4gc2lnbmFsIGNhdXNlcyB0aGUgcGFyZW50IHByb2Nlc3MgdG8gPEVNPmFkdmlzZTwvRU0+Ci10aGUgY2hpbGRyZW4gdG8gZXhpdCBhZnRlciB0aGVpciBjdXJyZW50IHJlcXVlc3QgKG9yIHRvIGV4aXQgaW1tZWRpYXRlbHkKLWlmIHRoZXkncmUgbm90IHNlcnZpbmcgYW55dGhpbmcpLiAgVGhlIHBhcmVudCByZS1yZWFkcyBpdHMgY29uZmlndXJhdGlvbgotZmlsZXMgYW5kIHJlLW9wZW5zIGl0cyBsb2cgZmlsZXMuICBBcyBlYWNoIGNoaWxkIGRpZXMgb2ZmIHRoZSBwYXJlbnQKLXJlcGxhY2VzIGl0IHdpdGggYSBjaGlsZCBmcm9tIHRoZSBuZXcgPEVNPmdlbmVyYXRpb248L0VNPiBvZiB0aGUKLWNvbmZpZ3VyYXRpb24sIHdoaWNoIGJlZ2lucyBzZXJ2aW5nIG5ldyByZXF1ZXN0cyBpbW1lZGlhdGVseS4KLQotPFA+VGhpcyBjb2RlIGlzIGRlc2lnbmVkIHRvIGFsd2F5cyByZXNwZWN0IHRoZQotPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNtYXhjbGllbnRzIj5NYXhDbGllbnRzPC9BPiwKLTxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjbWluc3BhcmVzZXJ2ZXJzIj5NaW5TcGFyZVNlcnZlcnM8L0E+LAotYW5kIDxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjbWF4c3BhcmVzZXJ2ZXJzIj5NYXhTcGFyZVNlcnZlcnM8L0E+IHNldHRpbmdzLgotRnVydGhlcm1vcmUsIGl0IHJlc3BlY3RzIDxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjc3RhcnRzZXJ2ZXJzIj5TdGFydFNlcnZlcnM8L0E+Ci1pbiB0aGUgZm9sbG93aW5nIG1hbm5lcjogIGlmIGFmdGVyIG9uZSBzZWNvbmQgYXQgbGVhc3QgU3RhcnRTZXJ2ZXJzIG5ldwotY2hpbGRyZW4gaGF2ZSBub3QgYmVlbiBjcmVhdGVkLCB0aGVuIGNyZWF0ZSBlbm91Z2ggdG8gcGljayB1cCB0aGUgc2xhY2suCi1UaGlzIGlzIHRvIHNheSB0aGF0IHRoZSBjb2RlIHRyaWVzIHRvIG1haW50YWluIGJvdGggdGhlIG51bWJlciBvZiBjaGlsZHJlbgotYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvYWQgb24gdGhlIHNlcnZlciwgYW5kIHJlc3BlY3QgeW91ciB3aXNoZXMKLXdpdGggdGhlIFN0YXJ0U2VydmVycyBwYXJhbWV0ZXIuCi0KLTxQPlVzZXJzIG9mIHRoZQotPEEgSFJFRj0ibW9kL21vZF9zdGF0dXMuaHRtbCI+c3RhdHVzIG1vZHVsZTwvQT4KLXdpbGwgbm90aWNlIHRoYXQgdGhlIHNlcnZlciBzdGF0aXN0aWNzCi1hcmUgPFNUUk9ORz5ub3Q8L1NUUk9ORz4gc2V0IHRvIHplcm8gd2hlbiBhIDxDT0RFPlVTUjE8L0NPREU+IGlzIHNlbnQuICBUaGUKLWNvZGUKLXdhcyB3cml0dGVuIHRvIGJvdGggbWluaW1pemUgdGhlIHRpbWUgaW4gd2hpY2ggdGhlIHNlcnZlciBpcyB1bmFibGUgdG8gc2VydmUKLW5ldyByZXF1ZXN0cyAodGhleSB3aWxsIGJlIHF1ZXVlZCB1cCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSwgc28gdGhleSdyZQotbm90IGxvc3QgaW4gYW55IGV2ZW50KSBhbmQgdG8gcmVzcGVjdCB5b3VyIHR1bmluZyBwYXJhbWV0ZXJzLiAgSW4gb3JkZXIKLXRvIGRvIHRoaXMgaXQgaGFzIHRvIGtlZXAgdGhlIDxFTT5zY29yZWJvYXJkPC9FTT4gdXNlZCB0byBrZWVwIHRyYWNrCi1vZiBhbGwgY2hpbGRyZW4gYWNyb3NzIGdlbmVyYXRpb25zLgotCi08UD5UaGUgc3RhdHVzIG1vZHVsZSB3aWxsIGFsc28gdXNlIGEgPENPREU+RzwvQ09ERT4gdG8gaW5kaWNhdGUgdGhvc2UKLWNoaWxkcmVuIHdoaWNoIGFyZSBzdGlsbCBzZXJ2aW5nIHJlcXVlc3RzIHN0YXJ0ZWQgYmVmb3JlIHRoZSBncmFjZWZ1bAotcmVzdGFydCB3YXMgZ2l2ZW4uCi0KLTxQPkF0IHByZXNlbnQgdGhlcmUgaXMgbm8gd2F5IGZvciBhIGxvZyByb3RhdGlvbiBzY3JpcHQgdXNpbmcKLTxDT0RFPlVTUjE8L0NPREU+IHRvIGtub3cgZm9yIGNlcnRhaW4gdGhhdCBhbGwgY2hpbGRyZW4gd3JpdGluZyB0aGUKLXByZS1yZXN0YXJ0IGxvZyBoYXZlIGZpbmlzaGVkLiAgV2Ugc3VnZ2VzdCB0aGF0IHlvdSB1c2UgYSBzdWl0YWJsZSBkZWxheQotYWZ0ZXIgc2VuZGluZyB0aGUgPENPREU+VVNSMTwvQ09ERT4gc2lnbmFsIGJlZm9yZSB5b3UgZG8gYW55dGhpbmcgd2l0aCB0aGUKLW9sZCBsb2cuICBGb3IgZXhhbXBsZSBpZiBtb3N0IG9mIHlvdXIgaGl0cyB0YWtlIGxlc3MgdGhhbiAxMCBtaW51dGVzIHRvCi1jb21wbGV0ZSBmb3IgdXNlcnMgb24gbG93IGJhbmR3aWR0aCBsaW5rcyB0aGVuIHlvdSBjb3VsZCB3YWl0IDE1IG1pbnV0ZXMKLWJlZm9yZSBkb2luZyBhbnl0aGluZyB3aXRoIHRoZSBvbGQgbG9nLgotCi08UD48U1RST05HPk5vdGU6PC9TVFJPTkc+IElmIHlvdXIgY29uZmlndXJhdGlvbiBmaWxlIGhhcyBlcnJvcnMgaW4gaXQgd2hlbgoteW91IGlzc3VlIGEKLXJlc3RhcnQgdGhlbiB5b3VyIHBhcmVudCB3aWxsIG5vdCByZXN0YXJ0LCBpdCB3aWxsIGV4aXQgd2l0aCBhbiBlcnJvci4KLUluIHRoZSBjYXNlIG9mIGdyYWNlZnVsCi1yZXN0YXJ0cyBpdCB3aWxsIGFsc28gbGVhdmUgY2hpbGRyZW4gcnVubmluZyB3aGVuIGl0IGV4aXRzLiAgKFRoZXNlIGFyZQotdGhlIGNoaWxkcmVuIHdoaWNoIGFyZSAiZ3JhY2VmdWxseSBleGl0aW5nIiBieSBoYW5kbGluZyB0aGVpciBsYXN0IHJlcXVlc3QuKQotVGhpcyB3aWxsIGNhdXNlIHByb2JsZW1zIGlmIHlvdSBhdHRlbXB0IHRvIHJlc3RhcnQgdGhlIHNlcnZlciAtLSBpdCB3aWxsCi1ub3QgYmUgYWJsZSB0byBiaW5kIHRvIGl0cyBsaXN0ZW5pbmcgcG9ydHMuICBCZWZvcmUgZG9pbmcgYSByZXN0YXJ0LCB5b3UKLWNhbiBjaGVjayB0aGUgc3ludGF4IG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIHdpdGggdGhlIDxDT0RFPi10PC9DT0RFPgotY29tbWFuZCBsaW5lIGFyZ3VtZW50IChzZWUgPEEgSFJFRj0iaW52b2tpbmcuaHRtbCI+U3RhcnRpbmcKLUFwYWNoZTwvQT4pLiBUaGlzIHN0aWxsIHdpbGwgbm90IGd1YXJhbnRlZSB0aGF0IHRoZSBzZXJ2ZXIgd2lsbCByZXN0YXJ0Ci1jb3JyZWN0bHkuIFRvIGNoZWNrIHRoZSBzZW1hbnRpY3Mgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgYXMgd2VsbAotYXMgdGhlIHN5bnRheCwgeW91IGNhbiB0cnkgc3RhcnRpbmcgaHR0cGQgYXMgYSBub24tcm9vdCB1c2VyLiAgSWYKLXRoZXJlIGFyZSBubyBlcnJvcnMgaXQgd2lsbCBhdHRlbXB0IHRvIG9wZW4gaXRzIHNvY2tldHMgYW5kIGxvZ3MgYW5kCi1mYWlsIGJlY2F1c2UgaXQncyBub3Qgcm9vdCAob3IgYmVjYXVzZSB0aGUgY3VycmVudGx5IHJ1bm5pbmcgaHR0cGQKLWFscmVhZHkgaGFzIHRob3NlIHBvcnRzIGJvdW5kKS4gIElmIGl0IGZhaWxzIGZvciBhbnkgb3RoZXIgcmVhc29uIHRoZW4KLWl0J3MgcHJvYmFibHkgYSBjb25maWcgZmlsZSBlcnJvciBhbmQgdGhlIGVycm9yIHNob3VsZCBiZSBmaXhlZCBiZWZvcmUKLWlzc3VpbmcgdGhlIGdyYWNlZnVsIHJlc3RhcnQuCi0KLQotPEgzPkFwcGVuZGl4OiBzaWduYWxzIGFuZCByYWNlIGNvbmRpdGlvbnM8L0gzPgotCi08UD5QcmlvciB0byBBcGFjaGUgMS4yYjkgdGhlcmUgd2VyZSBzZXZlcmFsIDxFTT5yYWNlIGNvbmRpdGlvbnM8L0VNPgotaW52b2x2aW5nIHRoZSByZXN0YXJ0IGFuZCBkaWUgc2lnbmFscyAoYSBzaW1wbGUgZGVzY3JpcHRpb24gb2YgcmFjZQotY29uZGl0aW9uIGlzOiBhIHRpbWUtc2Vuc2l0aXZlIHByb2JsZW0sIGFzIGluIGlmIHNvbWV0aGluZyBoYXBwZW5zIGF0IGp1c3QKLXRoZSB3cm9uZyB0aW1lIGl0IHdvbid0IGJlaGF2ZSBhcyBleHBlY3RlZCkuICBGb3IgdGhvc2UgYXJjaGl0ZWN0dXJlcyB0aGF0Ci1oYXZlIHRoZSAicmlnaHQiIGZlYXR1cmUgc2V0IHdlIGhhdmUgZWxpbWluYXRlZCBhcyBtYW55IGFzIHdlIGNhbi4KLUJ1dCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGVyZSBzdGlsbCBkbyBleGlzdCByYWNlIGNvbmRpdGlvbnMgb24KLWNlcnRhaW4gYXJjaGl0ZWN0dXJlcy4KLQotPFA+QXJjaGl0ZWN0dXJlcyB0aGF0IHVzZSBhbiBvbiBkaXNrCi08QSBIUkVGPSJtb2QvY29yZS5odG1sI3Njb3JlYm9hcmRmaWxlIj5TY29yZUJvYXJkRmlsZTwvQT4KLWhhdmUgdGhlIHBvdGVudGlhbCB0byBjb3JydXB0IHRoZWlyIHNjb3JlYm9hcmRzLiAgVGhpcyBjYW4gcmVzdWx0IGluCi10aGUgImJpbmQ6IEFkZHJlc3MgYWxyZWFkeSBpbiB1c2UiIChhZnRlciA8Q09ERT5IVVA8L0NPREU+KSBvcgotImxvbmcgbG9zdCBjaGlsZCBjYW1lIGhvbWUhIiAoYWZ0ZXIgPENPREU+VVNSMTwvQ09ERT4pLiAgVGhlIGZvcm1lciBpcwotYSBmYXRhbCBlcnJvciwgd2hpbGUgdGhlIGxhdHRlciBqdXN0IGNhdXNlcyB0aGUgc2VydmVyIHRvIGxvc2UgYSBzY29yZWJvYXJkCi1zbG90LiAgU28gaXQgbWlnaHQgYmUgYWR2aXNhYmxlIHRvIHVzZSBncmFjZWZ1bCByZXN0YXJ0cywgd2l0aAotYW4gb2NjYXNpb25hbCBoYXJkIHJlc3RhcnQuICBUaGVzZSBwcm9ibGVtcyBhcmUgdmVyeSBkaWZmaWN1bHQgdG8gd29yawotYXJvdW5kLCBidXQgZm9ydHVuYXRlbHkgbW9zdCBhcmNoaXRlY3R1cmVzIGRvIG5vdCByZXF1aXJlIGEgc2NvcmVib2FyZCBmaWxlLgotU2VlIHRoZSBTY29yZUJvYXJkRmlsZSBkb2N1bWVudGF0aW9uIGZvciBhIG1ldGhvZCB0byBkZXRlcm1pbmUgaWYgeW91cgotYXJjaGl0ZWN0dXJlIHVzZXMgaXQuCi0KLTxQPjxDT0RFPk5FWFQ8L0NPREU+IGFuZCA8Q09ERT5NQUNIVEVOPC9DT0RFPiAoNjhrIG9ubHkpIGhhdmUgc21hbGwgcmFjZQotY29uZGl0aW9ucwotd2hpY2ggY2FuIGNhdXNlIGEgcmVzdGFydC9kaWUgc2lnbmFsIHRvIGJlIGxvc3QsIGJ1dCBzaG91bGQgbm90IGNhdXNlIHRoZQotc2VydmVyIHRvIGRvIGFueXRoaW5nIG90aGVyd2lzZSBwcm9ibGVtYXRpYy4KLTwhLS0gdGhleSBkb24ndCBoYXZlIHNpZ2FjdGlvbiwgb3Igd2UncmUgbm90IHVzaW5nIGl0IC1kamcgLS0+Ci0KLTxQPkFsbCBhcmNoaXRlY3R1cmVzIGhhdmUgYSBzbWFsbCByYWNlIGNvbmRpdGlvbiBpbiBlYWNoIGNoaWxkIGludm9sdmluZwotdGhlIHNlY29uZCBhbmQgc3Vic2VxdWVudCByZXF1ZXN0cyBvbiBhIHBlcnNpc3RlbnQgSFRUUCBjb25uZWN0aW9uCi0oS2VlcEFsaXZlKS4gIEl0IG1heSBleGl0IGFmdGVyIHJlYWRpbmcgdGhlIHJlcXVlc3QgbGluZSBidXQgYmVmb3JlCi1yZWFkaW5nIGFueSBvZiB0aGUgcmVxdWVzdCBoZWFkZXJzLiAgVGhlcmUgaXMgYSBmaXggdGhhdCB3YXMgZGlzY292ZXJlZAotdG9vIGxhdGUgdG8gbWFrZSAxLjIuICBJbiB0aGVvcnkgdGhpcyBpc24ndCBhbiBpc3N1ZSBiZWNhdXNlIHRoZSBLZWVwQWxpdmUKLWNsaWVudCBoYXMgdG8gZXhwZWN0IHRoZXNlIGV2ZW50cyBiZWNhdXNlIG9mIG5ldHdvcmsgbGF0ZW5jaWVzIGFuZAotc2VydmVyIHRpbWVvdXRzLiAgSW4gcHJhY3RpY2UgaXQgZG9lc24ndCBzZWVtIHRvIGFmZmVjdCBhbnl0aGluZyBlaXRoZXIKLS0tIGluIGEgdGVzdCBjYXNlIHRoZSBzZXJ2ZXIgd2FzIHJlc3RhcnRlZCB0d2VudHkgdGltZXMgcGVyIHNlY29uZCBhbmQKLWNsaWVudHMgc3VjY2Vzc2Z1bGx5IGJyb3dzZWQgdGhlIHNpdGUgd2l0aG91dCBnZXR0aW5nIGJyb2tlbiBpbWFnZXMgb3IKLWVtcHR5IGRvY3VtZW50cy4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3N0b3BwaW5nLmh0bWwuZW4gYi9kb2NzL21hbnVhbC9zdG9wcGluZy5odG1sLmVuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODNkMWMwLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL3N0b3BwaW5nLmh0bWwuZW4KKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5TdG9wcGluZyBhbmQgUmVzdGFydGluZyBBcGFjaGU8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5TdG9wcGluZyBhbmQgUmVzdGFydGluZyBBcGFjaGU8L0gxPgotCi08UD5UaGlzIGRvY3VtZW50IGNvdmVycyBzdG9wcGluZyBhbmQgcmVzdGFydGluZyBBcGFjaGUgb24gVW5peAotb25seS4gV2luZG93cyB1c2VycyBzaG91bGQgc2VlIDxBIEhSRUY9IndpbmRvd3MuaHRtbCNzaWduYWwiPlNpZ25hbGxpbmcKLUFwYWNoZSB3aGVuIHJ1bm5pbmc8L0E+LjwvUD4KLQotPFA+WW91IHdpbGwgbm90aWNlIG1hbnkgPENPREU+aHR0cGQ8L0NPREU+IGV4ZWN1dGFibGVzIHJ1bm5pbmcgb24geW91ciBzeXN0ZW0sCi1idXQgeW91IHNob3VsZCBub3Qgc2VuZCBzaWduYWxzIHRvIGFueSBvZiB0aGVtIGV4Y2VwdCB0aGUgcGFyZW50LCB3aG9zZQotcGlkIGlzIGluIHRoZSA8QSBIUkVGPSJtb2QvY29yZS5odG1sI3BpZGZpbGUiPlBpZEZpbGU8L0E+LiAgVGhhdCBpcyB0bwotc2F5IHlvdSBzaG91bGRuJ3QgZXZlciBuZWVkIHRvIHNlbmQgc2lnbmFscyB0byBhbnkgcHJvY2VzcyBleGNlcHQgdGhlCi1wYXJlbnQuICBUaGVyZSBhcmUgdGhyZWUgc2lnbmFscyB0aGF0IHlvdSBjYW4gc2VuZCB0aGUgcGFyZW50OgotPENPREU+VEVSTTwvQ09ERT4sIDxDT0RFPkhVUDwvQ09ERT4sIGFuZCA8Q09ERT5VU1IxPC9DT0RFPiwgd2hpY2ggd2lsbAotYmUgZGVzY3JpYmVkIGluIGEgbW9tZW50LgotCi08UD5UbyBzZW5kIGEgc2lnbmFsIHRvIHRoZSBwYXJlbnQgeW91IHNob3VsZCBpc3N1ZSBhIGNvbW1hbmQgc3VjaCBhczoKLTxCTE9DS1FVT1RFPjxQUkU+Ci0gICAga2lsbCAtVEVSTSBgY2F0IC91c3IvbG9jYWwvYXBhY2hlL2xvZ3MvaHR0cGQucGlkYAotPC9QUkU+PC9CTE9DS1FVT1RFPgotCi1Zb3UgY2FuIHJlYWQgYWJvdXQgaXRzIHByb2dyZXNzIGJ5IGlzc3Vpbmc6Ci0KLTxCTE9DS1FVT1RFPjxQUkU+Ci0gICAgdGFpbCAtZiAvdXNyL2xvY2FsL2FwYWNoZS9sb2dzL2Vycm9yX2xvZwotPC9QUkU+PC9CTE9DS1FVT1RFPgotCi1Nb2RpZnkgdGhvc2UgZXhhbXBsZXMgdG8gbWF0Y2ggeW91cgotPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNzZXJ2ZXJyb290Ij5TZXJ2ZXJSb290PC9BPiBhbmQKLTxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjcGlkZmlsZSI+UGlkRmlsZTwvQT4gc2V0dGluZ3MuCi0KLTxQPkFzIG9mIEFwYWNoZSAxLjMgd2UgcHJvdmlkZSBhIHNjcmlwdCA8Q09ERT5zcmMvc3VwcG9ydC9hcGFjaGVjdGw8L0NPREU+Ci13aGljaCBjYW4gYmUgdXNlZCB0byBzdGFydCwgc3RvcCwgYW5kIHJlc3RhcnQgQXBhY2hlLiAgSXQgbWF5IG5lZWQgYQotbGl0dGxlIGN1c3RvbWl6YXRpb24gZm9yIHlvdXIgc3lzdGVtLCBzZWUgdGhlIGNvbW1lbnRzIGF0IHRoZSB0b3Agb2YKLXRoZSBzY3JpcHQuCi0KLTxIMz5URVJNIFNpZ25hbDogc3RvcCBub3c8L0gzPgotCi08UD5TZW5kaW5nIHRoZSA8Q09ERT5URVJNPC9DT0RFPiBzaWduYWwgdG8gdGhlIHBhcmVudCBjYXVzZXMgaXQgdG8KLWltbWVkaWF0ZWx5IGF0dGVtcHQgdG8ga2lsbCBvZmYgYWxsIG9mIGl0cyBjaGlsZHJlbi4gIEl0IG1heSB0YWtlIGl0Ci1zZXZlcmFsIHNlY29uZHMgdG8gY29tcGxldGUga2lsbGluZyBvZmYgaXRzIGNoaWxkcmVuLiAgVGhlbiB0aGUKLXBhcmVudCBpdHNlbGYgZXhpdHMuICBBbnkgcmVxdWVzdHMgaW4gcHJvZ3Jlc3MgYXJlIHRlcm1pbmF0ZWQsIGFuZCBubwotZnVydGhlciByZXF1ZXN0cyBhcmUgc2VydmVkLgotCi08SDM+SFVQIFNpZ25hbDogcmVzdGFydCBub3c8L0gzPgotCi08UD5TZW5kaW5nIHRoZSA8Q09ERT5IVVA8L0NPREU+IHNpZ25hbCB0byB0aGUgcGFyZW50IGNhdXNlcyBpdCB0byBraWxsIG9mZgotaXRzIGNoaWxkcmVuIGxpa2UgaW4gPENPREU+VEVSTTwvQ09ERT4gYnV0IHRoZSBwYXJlbnQgZG9lc24ndCBleGl0LiAgSXQKLXJlLXJlYWRzIGl0cyBjb25maWd1cmF0aW9uIGZpbGVzLCBhbmQgcmUtb3BlbnMgYW55IGxvZyBmaWxlcy4KLVRoZW4gaXQgc3Bhd25zIGEgbmV3IHNldCBvZiBjaGlsZHJlbiBhbmQgY29udGludWVzCi1zZXJ2aW5nIGhpdHMuCi0KLTxQPlVzZXJzIG9mIHRoZQotPEEgSFJFRj0ibW9kL21vZF9zdGF0dXMuaHRtbCI+c3RhdHVzIG1vZHVsZTwvQT4KLXdpbGwgbm90aWNlIHRoYXQgdGhlIHNlcnZlciBzdGF0aXN0aWNzIGFyZQotc2V0IHRvIHplcm8gd2hlbiBhIDxDT0RFPkhVUDwvQ09ERT4gaXMgc2VudC4KLQotPFA+PFNUUk9ORz5Ob3RlOjwvU1RST05HPiBJZiB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZSBoYXMgZXJyb3JzIGluIGl0IHdoZW4KLXlvdSBpc3N1ZSBhCi1yZXN0YXJ0IHRoZW4geW91ciBwYXJlbnQgd2lsbCBub3QgcmVzdGFydCwgaXQgd2lsbCBleGl0IHdpdGggYW4gZXJyb3IuCi1TZWUgYmVsb3cgZm9yIGEgbWV0aG9kIG9mIGF2b2lkaW5nIHRoaXMuCi0KLTxIMz5VU1IxIFNpZ25hbDogZ3JhY2VmdWwgcmVzdGFydDwvSDM+Ci0KLTxQPjxTVFJPTkc+Tm90ZTo8L1NUUk9ORz4gcHJpb3IgdG8gcmVsZWFzZSAxLjJiOSB0aGlzIGNvZGUgaXMgcXVpdGUgdW5zdGFibGUKLWFuZCBzaG91bGRuJ3QgYmUgdXNlZCBhdCBhbGwuCi0KLTxQPlRoZSA8Q09ERT5VU1IxPC9DT0RFPiBzaWduYWwgY2F1c2VzIHRoZSBwYXJlbnQgcHJvY2VzcyB0byA8RU0+YWR2aXNlPC9FTT4KLXRoZSBjaGlsZHJlbiB0byBleGl0IGFmdGVyIHRoZWlyIGN1cnJlbnQgcmVxdWVzdCAob3IgdG8gZXhpdCBpbW1lZGlhdGVseQotaWYgdGhleSdyZSBub3Qgc2VydmluZyBhbnl0aGluZykuICBUaGUgcGFyZW50IHJlLXJlYWRzIGl0cyBjb25maWd1cmF0aW9uCi1maWxlcyBhbmQgcmUtb3BlbnMgaXRzIGxvZyBmaWxlcy4gIEFzIGVhY2ggY2hpbGQgZGllcyBvZmYgdGhlIHBhcmVudAotcmVwbGFjZXMgaXQgd2l0aCBhIGNoaWxkIGZyb20gdGhlIG5ldyA8RU0+Z2VuZXJhdGlvbjwvRU0+IG9mIHRoZQotY29uZmlndXJhdGlvbiwgd2hpY2ggYmVnaW5zIHNlcnZpbmcgbmV3IHJlcXVlc3RzIGltbWVkaWF0ZWx5LgotCi08UD5UaGlzIGNvZGUgaXMgZGVzaWduZWQgdG8gYWx3YXlzIHJlc3BlY3QgdGhlCi08QSBIUkVGPSJtb2QvY29yZS5odG1sI21heGNsaWVudHMiPk1heENsaWVudHM8L0E+LAotPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNtaW5zcGFyZXNlcnZlcnMiPk1pblNwYXJlU2VydmVyczwvQT4sCi1hbmQgPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNtYXhzcGFyZXNlcnZlcnMiPk1heFNwYXJlU2VydmVyczwvQT4gc2V0dGluZ3MuCi1GdXJ0aGVybW9yZSwgaXQgcmVzcGVjdHMgPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCNzdGFydHNlcnZlcnMiPlN0YXJ0U2VydmVyczwvQT4KLWluIHRoZSBmb2xsb3dpbmcgbWFubmVyOiAgaWYgYWZ0ZXIgb25lIHNlY29uZCBhdCBsZWFzdCBTdGFydFNlcnZlcnMgbmV3Ci1jaGlsZHJlbiBoYXZlIG5vdCBiZWVuIGNyZWF0ZWQsIHRoZW4gY3JlYXRlIGVub3VnaCB0byBwaWNrIHVwIHRoZSBzbGFjay4KLVRoaXMgaXMgdG8gc2F5IHRoYXQgdGhlIGNvZGUgdHJpZXMgdG8gbWFpbnRhaW4gYm90aCB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuCi1hcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQgbG9hZCBvbiB0aGUgc2VydmVyLCBhbmQgcmVzcGVjdCB5b3VyIHdpc2hlcwotd2l0aCB0aGUgU3RhcnRTZXJ2ZXJzIHBhcmFtZXRlci4KLQotPFA+VXNlcnMgb2YgdGhlCi08QSBIUkVGPSJtb2QvbW9kX3N0YXR1cy5odG1sIj5zdGF0dXMgbW9kdWxlPC9BPgotd2lsbCBub3RpY2UgdGhhdCB0aGUgc2VydmVyIHN0YXRpc3RpY3MKLWFyZSA8U1RST05HPm5vdDwvU1RST05HPiBzZXQgdG8gemVybyB3aGVuIGEgPENPREU+VVNSMTwvQ09ERT4gaXMgc2VudC4gIFRoZQotY29kZQotd2FzIHdyaXR0ZW4gdG8gYm90aCBtaW5pbWl6ZSB0aGUgdGltZSBpbiB3aGljaCB0aGUgc2VydmVyIGlzIHVuYWJsZSB0byBzZXJ2ZQotbmV3IHJlcXVlc3RzICh0aGV5IHdpbGwgYmUgcXVldWVkIHVwIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLCBzbyB0aGV5J3JlCi1ub3QgbG9zdCBpbiBhbnkgZXZlbnQpIGFuZCB0byByZXNwZWN0IHlvdXIgdHVuaW5nIHBhcmFtZXRlcnMuICBJbiBvcmRlcgotdG8gZG8gdGhpcyBpdCBoYXMgdG8ga2VlcCB0aGUgPEVNPnNjb3JlYm9hcmQ8L0VNPiB1c2VkIHRvIGtlZXAgdHJhY2sKLW9mIGFsbCBjaGlsZHJlbiBhY3Jvc3MgZ2VuZXJhdGlvbnMuCi0KLTxQPlRoZSBzdGF0dXMgbW9kdWxlIHdpbGwgYWxzbyB1c2UgYSA8Q09ERT5HPC9DT0RFPiB0byBpbmRpY2F0ZSB0aG9zZQotY2hpbGRyZW4gd2hpY2ggYXJlIHN0aWxsIHNlcnZpbmcgcmVxdWVzdHMgc3RhcnRlZCBiZWZvcmUgdGhlIGdyYWNlZnVsCi1yZXN0YXJ0IHdhcyBnaXZlbi4KLQotPFA+QXQgcHJlc2VudCB0aGVyZSBpcyBubyB3YXkgZm9yIGEgbG9nIHJvdGF0aW9uIHNjcmlwdCB1c2luZwotPENPREU+VVNSMTwvQ09ERT4gdG8ga25vdyBmb3IgY2VydGFpbiB0aGF0IGFsbCBjaGlsZHJlbiB3cml0aW5nIHRoZQotcHJlLXJlc3RhcnQgbG9nIGhhdmUgZmluaXNoZWQuICBXZSBzdWdnZXN0IHRoYXQgeW91IHVzZSBhIHN1aXRhYmxlIGRlbGF5Ci1hZnRlciBzZW5kaW5nIHRoZSA8Q09ERT5VU1IxPC9DT0RFPiBzaWduYWwgYmVmb3JlIHlvdSBkbyBhbnl0aGluZyB3aXRoIHRoZQotb2xkIGxvZy4gIEZvciBleGFtcGxlIGlmIG1vc3Qgb2YgeW91ciBoaXRzIHRha2UgbGVzcyB0aGFuIDEwIG1pbnV0ZXMgdG8KLWNvbXBsZXRlIGZvciB1c2VycyBvbiBsb3cgYmFuZHdpZHRoIGxpbmtzIHRoZW4geW91IGNvdWxkIHdhaXQgMTUgbWludXRlcwotYmVmb3JlIGRvaW5nIGFueXRoaW5nIHdpdGggdGhlIG9sZCBsb2cuCi0KLTxQPjxTVFJPTkc+Tm90ZTo8L1NUUk9ORz4gSWYgeW91ciBjb25maWd1cmF0aW9uIGZpbGUgaGFzIGVycm9ycyBpbiBpdCB3aGVuCi15b3UgaXNzdWUgYQotcmVzdGFydCB0aGVuIHlvdXIgcGFyZW50IHdpbGwgbm90IHJlc3RhcnQsIGl0IHdpbGwgZXhpdCB3aXRoIGFuIGVycm9yLgotSW4gdGhlIGNhc2Ugb2YgZ3JhY2VmdWwKLXJlc3RhcnRzIGl0IHdpbGwgYWxzbyBsZWF2ZSBjaGlsZHJlbiBydW5uaW5nIHdoZW4gaXQgZXhpdHMuICAoVGhlc2UgYXJlCi10aGUgY2hpbGRyZW4gd2hpY2ggYXJlICJncmFjZWZ1bGx5IGV4aXRpbmciIGJ5IGhhbmRsaW5nIHRoZWlyIGxhc3QgcmVxdWVzdC4pCi1UaGlzIHdpbGwgY2F1c2UgcHJvYmxlbXMgaWYgeW91IGF0dGVtcHQgdG8gcmVzdGFydCB0aGUgc2VydmVyIC0tIGl0IHdpbGwKLW5vdCBiZSBhYmxlIHRvIGJpbmQgdG8gaXRzIGxpc3RlbmluZyBwb3J0cy4gIEJlZm9yZSBkb2luZyBhIHJlc3RhcnQsIHlvdQotY2FuIGNoZWNrIHRoZSBzeW50YXggb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgd2l0aCB0aGUgPENPREU+LXQ8L0NPREU+Ci1jb21tYW5kIGxpbmUgYXJndW1lbnQgKHNlZSA8QSBIUkVGPSJpbnZva2luZy5odG1sIj5TdGFydGluZwotQXBhY2hlPC9BPikuIFRoaXMgc3RpbGwgd2lsbCBub3QgZ3VhcmFudGVlIHRoYXQgdGhlIHNlcnZlciB3aWxsIHJlc3RhcnQKLWNvcnJlY3RseS4gVG8gY2hlY2sgdGhlIHNlbWFudGljcyBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBhcyB3ZWxsCi1hcyB0aGUgc3ludGF4LCB5b3UgY2FuIHRyeSBzdGFydGluZyBodHRwZCBhcyBhIG5vbi1yb290IHVzZXIuICBJZgotdGhlcmUgYXJlIG5vIGVycm9ycyBpdCB3aWxsIGF0dGVtcHQgdG8gb3BlbiBpdHMgc29ja2V0cyBhbmQgbG9ncyBhbmQKLWZhaWwgYmVjYXVzZSBpdCdzIG5vdCByb290IChvciBiZWNhdXNlIHRoZSBjdXJyZW50bHkgcnVubmluZyBodHRwZAotYWxyZWFkeSBoYXMgdGhvc2UgcG9ydHMgYm91bmQpLiAgSWYgaXQgZmFpbHMgZm9yIGFueSBvdGhlciByZWFzb24gdGhlbgotaXQncyBwcm9iYWJseSBhIGNvbmZpZyBmaWxlIGVycm9yIGFuZCB0aGUgZXJyb3Igc2hvdWxkIGJlIGZpeGVkIGJlZm9yZQotaXNzdWluZyB0aGUgZ3JhY2VmdWwgcmVzdGFydC4KLQotCi08SDM+QXBwZW5kaXg6IHNpZ25hbHMgYW5kIHJhY2UgY29uZGl0aW9uczwvSDM+Ci0KLTxQPlByaW9yIHRvIEFwYWNoZSAxLjJiOSB0aGVyZSB3ZXJlIHNldmVyYWwgPEVNPnJhY2UgY29uZGl0aW9uczwvRU0+Ci1pbnZvbHZpbmcgdGhlIHJlc3RhcnQgYW5kIGRpZSBzaWduYWxzIChhIHNpbXBsZSBkZXNjcmlwdGlvbiBvZiByYWNlCi1jb25kaXRpb24gaXM6IGEgdGltZS1zZW5zaXRpdmUgcHJvYmxlbSwgYXMgaW4gaWYgc29tZXRoaW5nIGhhcHBlbnMgYXQganVzdAotdGhlIHdyb25nIHRpbWUgaXQgd29uJ3QgYmVoYXZlIGFzIGV4cGVjdGVkKS4gIEZvciB0aG9zZSBhcmNoaXRlY3R1cmVzIHRoYXQKLWhhdmUgdGhlICJyaWdodCIgZmVhdHVyZSBzZXQgd2UgaGF2ZSBlbGltaW5hdGVkIGFzIG1hbnkgYXMgd2UgY2FuLgotQnV0IGl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoZXJlIHN0aWxsIGRvIGV4aXN0IHJhY2UgY29uZGl0aW9ucyBvbgotY2VydGFpbiBhcmNoaXRlY3R1cmVzLgotCi08UD5BcmNoaXRlY3R1cmVzIHRoYXQgdXNlIGFuIG9uIGRpc2sKLTxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjc2NvcmVib2FyZGZpbGUiPlNjb3JlQm9hcmRGaWxlPC9BPgotaGF2ZSB0aGUgcG90ZW50aWFsIHRvIGNvcnJ1cHQgdGhlaXIgc2NvcmVib2FyZHMuICBUaGlzIGNhbiByZXN1bHQgaW4KLXRoZSAiYmluZDogQWRkcmVzcyBhbHJlYWR5IGluIHVzZSIgKGFmdGVyIDxDT0RFPkhVUDwvQ09ERT4pIG9yCi0ibG9uZyBsb3N0IGNoaWxkIGNhbWUgaG9tZSEiIChhZnRlciA8Q09ERT5VU1IxPC9DT0RFPikuICBUaGUgZm9ybWVyIGlzCi1hIGZhdGFsIGVycm9yLCB3aGlsZSB0aGUgbGF0dGVyIGp1c3QgY2F1c2VzIHRoZSBzZXJ2ZXIgdG8gbG9zZSBhIHNjb3JlYm9hcmQKLXNsb3QuICBTbyBpdCBtaWdodCBiZSBhZHZpc2FibGUgdG8gdXNlIGdyYWNlZnVsIHJlc3RhcnRzLCB3aXRoCi1hbiBvY2Nhc2lvbmFsIGhhcmQgcmVzdGFydC4gIFRoZXNlIHByb2JsZW1zIGFyZSB2ZXJ5IGRpZmZpY3VsdCB0byB3b3JrCi1hcm91bmQsIGJ1dCBmb3J0dW5hdGVseSBtb3N0IGFyY2hpdGVjdHVyZXMgZG8gbm90IHJlcXVpcmUgYSBzY29yZWJvYXJkIGZpbGUuCi1TZWUgdGhlIFNjb3JlQm9hcmRGaWxlIGRvY3VtZW50YXRpb24gZm9yIGEgbWV0aG9kIHRvIGRldGVybWluZSBpZiB5b3VyCi1hcmNoaXRlY3R1cmUgdXNlcyBpdC4KLQotPFA+PENPREU+TkVYVDwvQ09ERT4gYW5kIDxDT0RFPk1BQ0hURU48L0NPREU+ICg2OGsgb25seSkgaGF2ZSBzbWFsbCByYWNlCi1jb25kaXRpb25zCi13aGljaCBjYW4gY2F1c2UgYSByZXN0YXJ0L2RpZSBzaWduYWwgdG8gYmUgbG9zdCwgYnV0IHNob3VsZCBub3QgY2F1c2UgdGhlCi1zZXJ2ZXIgdG8gZG8gYW55dGhpbmcgb3RoZXJ3aXNlIHByb2JsZW1hdGljLgotPCEtLSB0aGV5IGRvbid0IGhhdmUgc2lnYWN0aW9uLCBvciB3ZSdyZSBub3QgdXNpbmcgaXQgLWRqZyAtLT4KLQotPFA+QWxsIGFyY2hpdGVjdHVyZXMgaGF2ZSBhIHNtYWxsIHJhY2UgY29uZGl0aW9uIGluIGVhY2ggY2hpbGQgaW52b2x2aW5nCi10aGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IHJlcXVlc3RzIG9uIGEgcGVyc2lzdGVudCBIVFRQIGNvbm5lY3Rpb24KLShLZWVwQWxpdmUpLiAgSXQgbWF5IGV4aXQgYWZ0ZXIgcmVhZGluZyB0aGUgcmVxdWVzdCBsaW5lIGJ1dCBiZWZvcmUKLXJlYWRpbmcgYW55IG9mIHRoZSByZXF1ZXN0IGhlYWRlcnMuICBUaGVyZSBpcyBhIGZpeCB0aGF0IHdhcyBkaXNjb3ZlcmVkCi10b28gbGF0ZSB0byBtYWtlIDEuMi4gIEluIHRoZW9yeSB0aGlzIGlzbid0IGFuIGlzc3VlIGJlY2F1c2UgdGhlIEtlZXBBbGl2ZQotY2xpZW50IGhhcyB0byBleHBlY3QgdGhlc2UgZXZlbnRzIGJlY2F1c2Ugb2YgbmV0d29yayBsYXRlbmNpZXMgYW5kCi1zZXJ2ZXIgdGltZW91dHMuICBJbiBwcmFjdGljZSBpdCBkb2Vzbid0IHNlZW0gdG8gYWZmZWN0IGFueXRoaW5nIGVpdGhlcgotLS0gaW4gYSB0ZXN0IGNhc2UgdGhlIHNlcnZlciB3YXMgcmVzdGFydGVkIHR3ZW50eSB0aW1lcyBwZXIgc2Vjb25kIGFuZAotY2xpZW50cyBzdWNjZXNzZnVsbHkgYnJvd3NlZCB0aGUgc2l0ZSB3aXRob3V0IGdldHRpbmcgYnJva2VuIGltYWdlcyBvcgotZW1wdHkgZG9jdW1lbnRzLgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvc3VleGVjLmh0bWwgYi9kb2NzL21hbnVhbC9zdWV4ZWMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q4NjIzZC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC9zdWV4ZWMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxOCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSBzdUVYRUMgU3VwcG9ydDwvVElUTEU+Ci08L0hFQUQ+Ci08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLQotPEgxIEFMSUdOPSJDRU5URVIiPkFwYWNoZSBzdUVYRUMgU3VwcG9ydDwvSDE+Ci0KLTxQIEFMSUdOPSJMRUZUIj4KLTxPTD4KLSAgICAgICAgPExJPjxCSUc+PFNUUk9ORz5DT05URU5UUzwvU1RST05HPjwvQklHPjwvTEk+Ci0gICAgICAgIDxMST48QSBIUkVGPSIjd2hhdCI+V2hhdCBpcyBzdUVYRUM/PC9BPjwvTEk+Ci0gICAgICAgIDxMST48QSBIUkVGPSIjYmVmb3JlIj5CZWZvcmUgd2UgYmVnaW4uPC9BPjwvTEk+Ci0gICAgICAgIDxMST48QSBIUkVGPSIjbW9kZWwiPnN1RVhFQyBTZWN1cml0eSBNb2RlbC48L0E+PC9MST4KLSAgICAgICAgPExJPjxBIEhSRUY9IiNpbnN0YWxsIj5Db25maWd1cmluZyAmYW1wOyBJbnN0YWxsaW5nIHN1RVhFQzwvQT48L0xJPgotICAgICAgICA8TEk+PEEgSFJFRj0iI2VuYWJsZSI+RW5hYmxpbmcgJmFtcDsgRGlzYWJsaW5nIHN1RVhFQzwvQT48L0xJPgotICAgICAgICA8TEk+PEEgSFJFRj0iI3VzYWdlIj5Vc2luZyBzdUVYRUM8L0E+PC9MST4KLSAgICAgICAgPExJPjxBIEhSRUY9IiNkZWJ1ZyI+RGVidWdnaW5nIHN1RVhFQzwvQT48L0xJPgotICAgICAgICA8TEk+PEEgSFJFRj0iI2phYmJlcndvY2siPkJld2FyZSB0aGUgSmFiYmVyd29jazogV2FybmluZ3MgJmFtcDsKLSAgICAgICAgIEV4YW1wbGVzPC9BPjwvTEk+Ci08L09MPgotPC9QPgotCi08SDM+PEEgTkFNRT0id2hhdCI+V2hhdCBpcyBzdUVYRUM/PC9BPjwvSDM+Ci08UCBBTElHTj0iTEVGVCI+Ci1UaGUgPFNUUk9ORz5zdUVYRUM8L1NUUk9ORz4gZmVhdHVyZSAtLSBpbnRyb2R1Y2VkIGluIEFwYWNoZSAxLjIgLS0gcHJvdmlkZXMKLUFwYWNoZSB1c2VycyB0aGUgYWJpbGl0eSB0byBydW4gPFNUUk9ORz5DR0k8L1NUUk9ORz4gYW5kIDxTVFJPTkc+U1NJPC9TVFJPTkc+Ci1wcm9ncmFtcyB1bmRlciB1c2VyIElEcyBkaWZmZXJlbnQgZnJvbSB0aGUgdXNlciBJRCBvZiB0aGUgY2FsbGluZyB3ZWItc2VydmVyLgotTm9ybWFsbHksIHdoZW4gYSBDR0kgb3IgU1NJIHByb2dyYW0gZXhlY3V0ZXMsIGl0IHJ1bnMgYXMgdGhlIHNhbWUgdXNlciB3aG8gaXMKLXJ1bm5pbmcgdGhlIHdlYiBzZXJ2ZXIuCi08L1A+Ci0KLTxQIEFMSUdOPSJMRUZUIj4KLVVzZWQgcHJvcGVybHksIHRoaXMgZmVhdHVyZSBjYW4gcmVkdWNlIGNvbnNpZGVyYWJseSB0aGUgc2VjdXJpdHkgcmlza3MgaW52b2x2ZWQKLXdpdGggYWxsb3dpbmcgdXNlcnMgdG8gZGV2ZWxvcCBhbmQgcnVuIHByaXZhdGUgQ0dJIG9yIFNTSSBwcm9ncmFtcy4gIEhvd2V2ZXIsCi1pZiBzdUVYRUMgaXMgaW1wcm9wZXJseSBjb25maWd1cmVkLCBpdCBjYW4gY2F1c2UgYW55IG51bWJlciBvZiBwcm9ibGVtcyBhbmQKLXBvc3NpYmx5IGNyZWF0ZSBuZXcgaG9sZXMgaW4geW91ciBjb21wdXRlcidzIHNlY3VyaXR5LiAgSWYgeW91IGFyZW4ndCBmYW1pbGlhcgotd2l0aCBtYW5hZ2luZyBzZXR1aWQgcm9vdCBwcm9ncmFtcyBhbmQgdGhlIHNlY3VyaXR5IGlzc3VlcyB0aGV5IHByZXNlbnQsIHdlCi1oaWdobHkgcmVjb21tZW5kIHRoYXQgeW91IG5vdCBjb25zaWRlciB1c2luZyBzdUVYRUMuCi08L1A+Ci0KLTxQIEFMSUdOPSJDRU5URVIiPgotPFNUUk9ORz48QSBIUkVGPSJzdWV4ZWMuaHRtbCI+QkFDSyBUTyBDT05URU5UUzwvQT48L1NUUk9ORz4KLTwvUD4KLQotPEgzPjxBIE5BTUU9ImJlZm9yZSI+QmVmb3JlIHdlIGJlZ2luLjwvQT48L0gzPgotPFAgQUxJR049IkxFRlQiPgotQmVmb3JlIGp1bXBpbmcgaGVhZC1maXJzdCBpbnRvIHRoaXMgZG9jdW1lbnQsIHlvdSBzaG91bGQgYmUgYXdhcmUgb2YgdGhlCi1hc3N1bXB0aW9ucyBtYWRlIG9uIHRoZSBwYXJ0IG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoaXMgZG9jdW1lbnQuCi08L1A+Ci0KLTxQIEFMSUdOPSJMRUZUIj4KLUZpcnN0LCBpdCBpcyBhc3N1bWVkIHRoYXQgeW91IGFyZSB1c2luZyBhIFVOSVggZGVyaXZhdGUgb3BlcmF0aW5nIHN5c3RlbSB0aGF0Ci1pcyBjYXBhYmxlIG9mIDxTVFJPTkc+c2V0dWlkPC9TVFJPTkc+IGFuZCA8U1RST05HPnNldGdpZDwvU1RST05HPiBvcGVyYXRpb25zLgotQWxsIGNvbW1hbmQgZXhhbXBsZXMgYXJlIGdpdmVuIGluIHRoaXMgcmVnYXJkLiAgT3RoZXIgcGxhdGZvcm1zLCBpZiB0aGV5IGFyZQotY2FwYWJsZSBvZiBzdXBwb3J0aW5nIHN1RVhFQywgbWF5IGRpZmZlciBpbiB0aGVpciBjb25maWd1cmF0aW9uLgotPC9QPgotCi08UCBBTElHTj0iTEVGVCI+Ci1TZWNvbmQsIGl0IGlzIGFzc3VtZWQgeW91IGFyZSBmYW1pbGlhciB3aXRoIHNvbWUgYmFzaWMgY29uY2VwdHMgb2YgeW91cgotY29tcHV0ZXIncyBzZWN1cml0eSBhbmQgaXRzIGFkbWluaXN0cmF0aW9uLiAgVGhpcyBpbnZvbHZlcyBhbiB1bmRlcnN0YW5kaW5nCi1vZiA8U1RST05HPnNldHVpZC9zZXRnaWQ8L1NUUk9ORz4gb3BlcmF0aW9ucyBhbmQgdGhlIHZhcmlvdXMgZWZmZWN0cyB0aGV5Ci1tYXkgaGF2ZSBvbiB5b3VyIHN5c3RlbSBhbmQgaXRzIGxldmVsIG9mIHNlY3VyaXR5LgotPC9QPgotCi08UCBBTElHTj0iTEVGVCI+Ci1UaGlyZCwgaXQgaXMgYXNzdW1lZCB0aGF0IHlvdSBhcmUgdXNpbmcgYW4gPFNUUk9ORz51bm1vZGlmaWVkPC9TVFJPTkc+Ci12ZXJzaW9uIG9mIHN1RVhFQyBjb2RlLiAgQWxsIGNvZGUgZm9yIHN1RVhFQyBoYXMgYmVlbiBjYXJlZnVsbHkgc2NydXRpbml6ZWQgYW5kCi10ZXN0ZWQgYnkgdGhlIGRldmVsb3BlcnMgYXMgd2VsbCBhcyBudW1lcm91cyBiZXRhIHRlc3RlcnMuICBFdmVyeSBwcmVjYXV0aW9uCi1oYXMgYmVlbiB0YWtlbiB0byBlbnN1cmUgYSBzaW1wbGUgeWV0IHNvbGlkbHkgc2FmZSBiYXNlIG9mIGNvZGUuICBBbHRlcmluZyB0aGlzCi1jb2RlIGNhbiBjYXVzZSB1bmV4cGVjdGVkIHByb2JsZW1zIGFuZCBuZXcgc2VjdXJpdHkgcmlza3MuICBJdCBpcwotPFNUUk9ORz5oaWdobHk8L1NUUk9ORz4gcmVjb21tZW5kZWQgeW91IG5vdCBhbHRlciB0aGUgc3VFWEVDIGNvZGUgdW5sZXNzIHlvdQotYXJlIHdlbGwgdmVyc2VkIGluIHRoZSBwYXJ0aWN1bGFycyBvZiBzZWN1cml0eSBwcm9ncmFtbWluZyBhbmQgYXJlIHdpbGxpbmcgdG8KLXNoYXJlIHlvdXIgd29yayB3aXRoIHRoZSBBcGFjaGUgR3JvdXAgZm9yIGNvbnNpZGVyYXRpb24uCi08L1A+Ci0KLTxQIEFMSUdOPSJMRUZUIj4KLUZvdXJ0aCwgYW5kIGxhc3QsIGl0IGhhcyBiZWVuIHRoZSBkZWNpc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwIHRvCi08U1RST05HPk5PVDwvU1RST05HPiBtYWtlIHN1RVhFQyBwYXJ0IG9mIHRoZSBkZWZhdWx0IGluc3RhbGxhdGlvbiBvZiBBcGFjaGUuCi1UbyB0aGlzIGVuZCwgc3VFWEVDIGNvbmZpZ3VyYXRpb24gcmVxdWlyZXMgb2YgdGhlIGFkbWluaXN0cmF0b3IgY2FyZWZ1bAotYXR0ZW50aW9uIHRvIGRldGFpbHMuICBBZnRlciBkdWUgY29uc2lkZXJhdGlvbiBoYXMgYmVlbiBnaXZlbiB0byB0aGUgdmFyaW91cwotc2V0dGluZ3MgZm9yIHN1RVhFQywgdGhlIGFkbWluaXN0cmF0b3IgbWF5IGluc3RhbGwgc3VFWEVDIHRocm91Z2ggbm9ybWFsCi1pbnN0YWxsYXRpb24gbWV0aG9kcy4gVGhlIHZhbHVlcyBmb3IgdGhlc2Ugc2V0dGluZ3MgbmVlZCB0byBiZSBjYXJlZnVsbHkKLWRldGVybWluZWQgYW5kIHNwZWNpZmllZCBieSB0aGUgYWRtaW5pc3RyYXRvciB0byBwcm9wZXJseSBtYWludGFpbiBzeXN0ZW0KLXNlY3VyaXR5IGR1cmluZyB0aGUgdXNlIG9mIHN1RVhFQyBmdW5jdGlvbmFsaXR5LiAgSXQgaXMgdGhyb3VnaCB0aGlzIGRldGFpbGVkCi1wcm9jZXNzIHRoYXQgdGhlIEFwYWNoZSBHcm91cCBob3BlcyB0byBsaW1pdCBzdUVYRUMgaW5zdGFsbGF0aW9uIG9ubHkgdG8gdGhvc2UKLXdobyBhcmUgY2FyZWZ1bCBhbmQgZGV0ZXJtaW5lZCBlbm91Z2ggdG8gdXNlIGl0LgotPC9QPgotCi08UCBBTElHTj0iTEVGVCI+Ci1TdGlsbCB3aXRoIHVzPyAgWWVzPyAgR29vZC4gIExldCdzIG1vdmUgb24hCi08L1A+Ci0KLTxQIEFMSUdOPSJDRU5URVIiPgotPFNUUk9ORz48QSBIUkVGPSJzdWV4ZWMuaHRtbCI+QkFDSyBUTyBDT05URU5UUzwvQT48L1NUUk9ORz4KLTwvUD4KLQotPEgzPjxBIE5BTUU9Im1vZGVsIj5zdUVYRUMgU2VjdXJpdHkgTW9kZWw8L0E+PC9IMz4KLTxQIEFMSUdOPSJMRUZUIj4KLUJlZm9yZSB3ZSBiZWdpbiBjb25maWd1cmluZyBhbmQgaW5zdGFsbGluZyBzdUVYRUMsIHdlIHdpbGwgZmlyc3QgZGlzY3VzcwotdGhlIHNlY3VyaXR5IG1vZGVsIHlvdSBhcmUgYWJvdXQgdG8gaW1wbGVtZW50LiAgQnkgZG9pbmcgc28sIHlvdSBtYXkKLWJldHRlciB1bmRlcnN0YW5kIHdoYXQgZXhhY3RseSBpcyBnb2luZyBvbiBpbnNpZGUgc3VFWEVDIGFuZCB3aGF0IHByZWNhdXRpb25zCi1hcmUgdGFrZW4gdG8gZW5zdXJlIHlvdXIgc3lzdGVtJ3Mgc2VjdXJpdHkuCi08L1A+Ci0KLTxQIEFMSUdOPSJMRUZUIj4KLTxTVFJPTkc+c3VFWEVDPC9TVFJPTkc+IGlzIGJhc2VkIG9uIGEgc2V0dWlkICJ3cmFwcGVyIiBwcm9ncmFtIHRoYXQgaXMKLWNhbGxlZCBieSB0aGUgbWFpbiBBcGFjaGUgd2ViIHNlcnZlci4gIFRoaXMgd3JhcHBlciBpcyBjYWxsZWQgd2hlbiBhbiBIVFRQCi1yZXF1ZXN0IGlzIG1hZGUgZm9yIGEgQ0dJIG9yIFNTSSBwcm9ncmFtIHRoYXQgdGhlIGFkbWluaXN0cmF0b3IgaGFzIGRlc2lnbmF0ZWQKLXRvIHJ1biBhcyBhIHVzZXJpZCBvdGhlciB0aGFuIHRoYXQgb2YgdGhlIG1haW4gc2VydmVyLiAgV2hlbiBzdWNoIGEgcmVxdWVzdAotaXMgbWFkZSwgQXBhY2hlIHByb3ZpZGVzIHRoZSBzdUVYRUMgd3JhcHBlciB3aXRoIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgdGhlCi11c2VyIGFuZCBncm91cCBJRHMgdW5kZXIgd2hpY2ggdGhlIHByb2dyYW0gaXMgdG8gZXhlY3V0ZS4KLTwvUD4KLQotPFAgQUxJR049IkxFRlQiPgotVGhlIHdyYXBwZXIgdGhlbiBlbXBsb3lzIHRoZSBmb2xsb3dpbmcgcHJvY2VzcyB0byBkZXRlcm1pbmUgc3VjY2VzcyBvcgotZmFpbHVyZSAtLSBpZiBhbnkgb25lIG9mIHRoZXNlIGNvbmRpdGlvbnMgZmFpbCwgdGhlIHByb2dyYW0gbG9ncyB0aGUgZmFpbHVyZQotYW5kIGV4aXRzIHdpdGggYW4gZXJyb3IsIG90aGVyd2lzZSBpdCB3aWxsIGNvbnRpbnVlOgotPE9MPgotIDxMST48U1RST05HPldhcyB0aGUgd3JhcHBlciBjYWxsZWQgd2l0aCB0aGUgcHJvcGVyIG51bWJlciBvZgotICBhcmd1bWVudHM/PC9TVFJPTkc+Ci0gIDxCTE9DS1FVT1RFPgotICAgVGhlIHdyYXBwZXIgd2lsbCBvbmx5IGV4ZWN1dGUgaWYgaXQgaXMgZ2l2ZW4gdGhlIHByb3BlciBudW1iZXIgb2YgYXJndW1lbnRzLgotICAgVGhlIHByb3BlciBhcmd1bWVudCBmb3JtYXQgaXMga25vd24gdG8gdGhlIEFwYWNoZSB3ZWIgc2VydmVyLiAgSWYgdGhlCi0gICB3cmFwcGVyCi0gICBpcyBub3QgcmVjZWl2aW5nIHRoZSBwcm9wZXIgbnVtYmVyIG9mIGFyZ3VtZW50cywgaXQgaXMgZWl0aGVyIGJlaW5nIGhhY2tlZCwKLSAgIG9yCi0gICB0aGVyZSBpcyBzb21ldGhpbmcgd3Jvbmcgd2l0aCB0aGUgc3VFWEVDIHBvcnRpb24gb2YgeW91ciBBcGFjaGUgYmluYXJ5LgotICA8L0JMT0NLUVVPVEU+Ci0gPC9MST4KLSA8TEk+PFNUUk9ORz5JcyB0aGUgdXNlciBleGVjdXRpbmcgdGhpcyB3cmFwcGVyIGEgdmFsaWQgdXNlciBvZiB0aGlzCi0gIHN5c3RlbT88L1NUUk9ORz4KLSAgPEJMT0NLUVVPVEU+Ci0gICBUaGlzIGlzIHRvIGVuc3VyZSB0aGF0IHRoZSB1c2VyIGV4ZWN1dGluZyB0aGUgd3JhcHBlciBpcyB0cnVseSBhIHVzZXIgb2YgdGhlCi0gICBzeXN0ZW0uCi0gIDwvQkxPQ0tRVU9URT4KLSA8L0xJPgotIDxMST48U1RST05HPklzIHRoaXMgdmFsaWQgdXNlciBhbGxvd2VkIHRvIHJ1biB0aGUgd3JhcHBlcj88L1NUUk9ORz4KLSAgPEJMT0NLUVVPVEU+Ci0gICBJcyB0aGlzIHVzZXIgdGhlIHVzZXIgYWxsb3dlZCB0byBydW4gdGhpcyB3cmFwcGVyPyAgT25seSBvbmUgdXNlciAodGhlCi0gICBBcGFjaGUgdXNlcikgaXMgYWxsb3dlZCB0byBleGVjdXRlIHRoaXMgcHJvZ3JhbS4KLSAgPC9CTE9DS1FVT1RFPgotIDwvTEk+Ci0gPExJPjxTVFJPTkc+RG9lcyB0aGUgdGFyZ2V0IHByb2dyYW0gaGF2ZSBhbiB1bnNhZmUgaGllcmFyY2hpY2FsCi0gIHJlZmVyZW5jZT88L1NUUk9ORz4KLSAgPEJMT0NLUVVPVEU+Ci0gICBEb2VzIHRoZSB0YXJnZXQgcHJvZ3JhbSBjb250YWluIGEgbGVhZGluZyAnLycgb3IgaGF2ZSBhICcuLicgYmFja3JlZmVyZW5jZT8gCi0gICBUaGVzZSBhcmUgbm90IGFsbG93ZWQ7IHRoZSB0YXJnZXQgcHJvZ3JhbSBtdXN0IHJlc2lkZSB3aXRoaW4gdGhlIEFwYWNoZQotICAgd2Vic3BhY2UuCi0gIDwvQkxPQ0tRVU9URT4KLSA8L0xJPgotIDxMST48U1RST05HPklzIHRoZSB0YXJnZXQgdXNlciBuYW1lIHZhbGlkPzwvU1RST05HPgotICA8QkxPQ0tRVU9URT4KLSAgIERvZXMgdGhlIHRhcmdldCB1c2VyIGV4aXN0PwotICA8L0JMT0NLUVVPVEU+Ci0gPC9MST4KLSA8TEk+PFNUUk9ORz5JcyB0aGUgdGFyZ2V0IGdyb3VwIG5hbWUgdmFsaWQ/PC9TVFJPTkc+Ci0gIDxCTE9DS1FVT1RFPgotICAgRG9lcyB0aGUgdGFyZ2V0IGdyb3VwIGV4aXN0PwotICA8L0JMT0NLUVVPVEU+Ci0gPC9MST4KLSA8TEk+PFNUUk9ORz5JcyB0aGUgdGFyZ2V0IHVzZXIgPEVNPk5PVDwvRU0+IHN1cGVydXNlcj88L1NUUk9ORz4KLSAgPEJMT0NLUVVPVEU+Ci0gICBQcmVzZW50bHksIHN1RVhFQyBkb2VzIG5vdCBhbGxvdyAncm9vdCcgdG8gZXhlY3V0ZSBDR0kvU1NJIHByb2dyYW1zLgotICA8L0JMT0NLUVVPVEU+Ci0gPC9MST4KLSA8TEk+PFNUUk9ORz5JcyB0aGUgdGFyZ2V0IHVzZXJpZCA8RU0+QUJPVkU8L0VNPiB0aGUgbWluaW11bSBJRAotICBudW1iZXI/PC9TVFJPTkc+Ci0gIDxCTE9DS1FVT1RFPgotICAgVGhlIG1pbmltdW0gdXNlciBJRCBudW1iZXIgaXMgc3BlY2lmaWVkIGR1cmluZyBjb25maWd1cmF0aW9uLiAgVGhpcyBhbGxvd3MKLSAgIHlvdQotICAgdG8gc2V0IHRoZSBsb3dlc3QgcG9zc2libGUgdXNlcmlkIHRoYXQgd2lsbCBiZSBhbGxvd2VkIHRvIGV4ZWN1dGUgQ0dJL1NTSQotICAgcHJvZ3JhbXMuICBUaGlzIGlzIHVzZWZ1bCB0byBibG9jayBvdXQgInN5c3RlbSIgYWNjb3VudHMuCi0gIDwvQkxPQ0tRVU9URT4KLSA8L0xJPgotIDxMST48U1RST05HPklzIHRoZSB0YXJnZXQgZ3JvdXAgPEVNPk5PVDwvRU0+IHRoZSBzdXBlcnVzZXIgZ3JvdXA/PC9TVFJPTkc+Ci0gIDxCTE9DS1FVT1RFPgotICAgUHJlc2VudGx5LCBzdUVYRUMgZG9lcyBub3QgYWxsb3cgdGhlICdyb290JyBncm91cCB0byBleGVjdXRlIENHSS9TU0kKLSAgIHByb2dyYW1zLgotICA8L0JMT0NLUVVPVEU+Ci0gPC9MST4KLSA8TEk+PFNUUk9ORz5JcyB0aGUgdGFyZ2V0IGdyb3VwaWQgPEVNPkFCT1ZFPC9FTT4gdGhlIG1pbmltdW0gSUQKLSAgbnVtYmVyPzwvU1RST05HPgotICA8QkxPQ0tRVU9URT4KLSAgIFRoZSBtaW5pbXVtIGdyb3VwIElEIG51bWJlciBpcyBzcGVjaWZpZWQgZHVyaW5nIGNvbmZpZ3VyYXRpb24uICBUaGlzIGFsbG93cwotICAgeW91Ci0gICB0byBzZXQgdGhlIGxvd2VzdCBwb3NzaWJsZSBncm91cGlkIHRoYXQgd2lsbCBiZSBhbGxvd2VkIHRvIGV4ZWN1dGUgQ0dJL1NTSQotICAgcHJvZ3JhbXMuICBUaGlzIGlzIHVzZWZ1bCB0byBibG9jayBvdXQgInN5c3RlbSIgZ3JvdXBzLgotICA8L0JMT0NLUVVPVEU+Ci0gPC9MST4KLSA8TEk+PFNUUk9ORz5DYW4gdGhlIHdyYXBwZXIgc3VjY2Vzc2Z1bGx5IGJlY29tZSB0aGUgdGFyZ2V0IHVzZXIgYW5kCi0gIGdyb3VwPzwvU1RST05HPgotICA8QkxPQ0tRVU9URT4KLSAgIEhlcmUgaXMgd2hlcmUgdGhlIHByb2dyYW0gYmVjb21lcyB0aGUgdGFyZ2V0IHVzZXIgYW5kIGdyb3VwIHZpYSBzZXR1aWQgYW5kCi0gICBzZXRnaWQKLSAgIGNhbGxzLiAgVGhlIGdyb3VwIGFjY2VzcyBsaXN0IGlzIGFsc28gaW5pdGlhbGl6ZWQgd2l0aCBhbGwgb2YgdGhlIGdyb3VwcwotICAgb2Ygd2hpY2gKLSAgIHRoZSB1c2VyIGlzIGEgbWVtYmVyLgotICA8L0JMT0NLUVVPVEU+Ci0gPC9MST4KLSA8TEk+PFNUUk9ORz5Eb2VzIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIHByb2dyYW0gcmVzaWRlcyBleGlzdD88L1NUUk9ORz4KLSAgPEJMT0NLUVVPVEU+Ci0gICBJZiBpdCBkb2Vzbid0IGV4aXN0LCBpdCBjYW4ndCB2ZXJ5IHdlbGwgY29udGFpbiBmaWxlcy4KLSAgPC9CTE9DS1FVT1RFPgotIDwvTEk+Ci0gPExJPjxTVFJPTkc+SXMgdGhlIGRpcmVjdG9yeSB3aXRoaW4gdGhlIEFwYWNoZSB3ZWJzcGFjZT88L1NUUk9ORz4KLSAgPEJMT0NLUVVPVEU+Ci0gICBJZiB0aGUgcmVxdWVzdCBpcyBmb3IgYSByZWd1bGFyIHBvcnRpb24gb2YgdGhlIHNlcnZlciwgaXMgdGhlIHJlcXVlc3RlZAotICAgZGlyZWN0b3J5Ci0gICB3aXRoaW4gdGhlIHNlcnZlcidzIGRvY3VtZW50IHJvb3Q/ICBJZiB0aGUgcmVxdWVzdCBpcyBmb3IgYSBVc2VyRGlyLCBpcwotICAgdGhlIHJlcXVlc3RlZAotICAgZGlyZWN0b3J5IHdpdGhpbiB0aGUgdXNlcidzIGRvY3VtZW50IHJvb3Q/Ci0gIDwvQkxPQ0tRVU9URT4KLSA8L0xJPgotIDxMST48U1RST05HPklzIHRoZSBkaXJlY3RvcnkgPEVNPk5PVDwvRU0+IHdyaXRhYmxlIGJ5IGFueW9uZSBlbHNlPzwvU1RST05HPgotICA8QkxPQ0tRVU9URT4KLSAgIFdlIGRvbid0IHdhbnQgdG8gb3BlbiB1cCB0aGUgZGlyZWN0b3J5IHRvIG90aGVyczsgb25seSB0aGUgb3duZXIgdXNlcgotICAgbWF5IGJlIGFibGUKLSAgIHRvIGFsdGVyIHRoaXMgZGlyZWN0b3JpZXMgY29udGVudHMuCi0gIDwvQkxPQ0tRVU9URT4KLSA8L0xJPgotIDxMST48U1RST05HPkRvZXMgdGhlIHRhcmdldCBwcm9ncmFtIGV4aXN0PzwvU1RST05HPgotICA8QkxPQ0tRVU9URT4KLSAgIElmIGl0IGRvZXNuJ3QgZXhpc3RzLCBpdCBjYW4ndCB2ZXJ5IHdlbGwgYmUgZXhlY3V0ZWQuCi0gIDwvQkxPQ0tRVU9URT4KLSA8L0xJPgotIDxMST48U1RST05HPklzIHRoZSB0YXJnZXQgcHJvZ3JhbSA8RU0+Tk9UPC9FTT4gd3JpdGFibGUgYnkgYW55b25lCi0gIGVsc2U/PC9TVFJPTkc+Ci0gIDxCTE9DS1FVT1RFPgotICAgV2UgZG9uJ3Qgd2FudCB0byBnaXZlIGFueW9uZSBvdGhlciB0aGFuIHRoZSBvd25lciB0aGUgYWJpbGl0eSB0bwotICAgY2hhbmdlIHRoZSBwcm9ncmFtLgotICA8L0JMT0NLUVVPVEU+Ci0gPC9MST4KLSA8TEk+PFNUUk9ORz5JcyB0aGUgdGFyZ2V0IHByb2dyYW0gPEVNPk5PVDwvRU0+IHNldHVpZCBvciBzZXRnaWQ/PC9TVFJPTkc+Ci0gIDxCTE9DS1FVT1RFPgotICAgV2UgZG8gbm90IHdhbnQgdG8gZXhlY3V0ZSBwcm9ncmFtcyB0aGF0IHdpbGwgdGhlbiBjaGFuZ2Ugb3VyIFVJRC9HSUQgYWdhaW4uCi0gIDwvQkxPQ0tRVU9URT4KLSA8L0xJPgotIDxMST48U1RST05HPklzIHRoZSB0YXJnZXQgdXNlci9ncm91cCB0aGUgc2FtZSBhcyB0aGUgcHJvZ3JhbSdzCi0gIHVzZXIvZ3JvdXA/PC9TVFJPTkc+Ci0gIDxCTE9DS1FVT1RFPgotICAgSXMgdGhlIHVzZXIgdGhlIG93bmVyIG9mIHRoZSBmaWxlPwotICA8L0JMT0NLUVVPVEU+Ci0gPC9MST4KLSA8TEk+PFNUUk9ORz5DYW4gd2Ugc3VjY2Vzc2Z1bGx5IGNsZWFuIHRoZSBwcm9jZXNzIGVudmlyb25tZW50IHRvCi0gIGVuc3VyZSBzYWZlIG9wZXJhdGlvbnM/PC9TVFJPTkc+Ci0gIDxCTE9DS1FVT1RFPgotICAgc3VFWEVDIGNsZWFucyB0aGUgcHJvY2VzcycgZW52aXJvbm1lbnQgYnkgZXN0YWJsaXNoaW5nIGEgc2FmZQotICAgZXhlY3V0aW9uIFBBVEggKGRlZmluZWQKLSAgIGR1cmluZyBjb25maWd1cmF0aW9uKSwgYXMgd2VsbCBhcyBvbmx5IHBhc3NpbmcgdGhyb3VnaCB0aG9zZQotICAgdmFyaWFibGVzIHdob3NlIG5hbWVzCi0gICBhcmUgbGlzdGVkIGluIHRoZSBzYWZlIGVudmlyb25tZW50IGxpc3QgKGFsc28gY3JlYXRlZCBkdXJpbmcKLSAgIGNvbmZpZ3VyYXRpb24pLgotICA8L0JMT0NLUVVPVEU+Ci0gPC9MST4KLSA8TEk+PFNUUk9ORz5DYW4gd2Ugc3VjY2Vzc2Z1bGx5IGJlY29tZSB0aGUgdGFyZ2V0IHByb2dyYW0gYW5kCi0gIGV4ZWN1dGU/PC9TVFJPTkc+Ci0gIDxCTE9DS1FVT1RFPgotICAgSGVyZSBpcyB3aGVyZSBzdUVYRUMgZW5kcyBhbmQgdGhlIHRhcmdldCBwcm9ncmFtIGJlZ2lucy4KLSAgPC9CTE9DS1FVT1RFPgotIDwvTEk+Ci08L09MPgotPC9QPgotCi08UCBBTElHTj0iTEVGVCI+Ci1UaGlzIGlzIHRoZSBzdGFuZGFyZCBvcGVyYXRpb24gb2YgdGhlIHRoZSBzdUVYRUMgd3JhcHBlcidzIHNlY3VyaXR5IG1vZGVsLgotSXQgaXMgc29tZXdoYXQgc3RyaW5nZW50IGFuZCBjYW4gaW1wb3NlIG5ldyBsaW1pdGF0aW9ucyBhbmQgZ3VpZGVsaW5lcyBmb3IKLUNHSS9TU0kgZGVzaWduLCBidXQgaXQgd2FzIGRldmVsb3BlZCBjYXJlZnVsbHkgc3RlcC1ieS1zdGVwIHdpdGggc2VjdXJpdHkKLWluIG1pbmQuCi08L1A+Ci0KLTxQIEFMSUdOPSJMRUZUIj4KLUZvciBtb3JlIGluZm9ybWF0aW9uIGFzIHRvIGhvdyB0aGlzIHNlY3VyaXR5IG1vZGVsIGNhbiBsaW1pdCB5b3VyIHBvc3NpYmlsaXRpZXMKLWluIHJlZ2FyZHMgdG8gc2VydmVyIGNvbmZpZ3VyYXRpb24sIGFzIHdlbGwgYXMgd2hhdCBzZWN1cml0eSByaXNrcyBjYW4gYmUKLWF2b2lkZWQgd2l0aCBhIHByb3BlciBzdUVYRUMgc2V0dXAsIHNlZSB0aGUgCi08QSBIUkVGPSIjamFiYmVyd29jayI+IkJld2FyZSB0aGUgSmFiYmVyd29jayI8L0E+Ci1zZWN0aW9uIG9mIHRoaXMgZG9jdW1lbnQuCi08L1A+Ci0KLTxQIEFMSUdOPSJDRU5URVIiPgotPFNUUk9ORz48QSBIUkVGPSJzdWV4ZWMuaHRtbCI+QkFDSyBUTyBDT05URU5UUzwvQT48L1NUUk9ORz4KLTwvUD4KLQotPEgzPjxBIE5BTUU9Imluc3RhbGwiPkNvbmZpZ3VyaW5nICZhbXA7IEluc3RhbGxpbmcgc3VFWEVDPC9BPjwvSDM+Ci08UCBBTElHTj0iTEVGVCI+Ci1IZXJlJ3Mgd2hlcmUgd2UgYmVnaW4gdGhlIGZ1bi4gSWYgeW91IHVzZSBBcGFjaGUgMS4yIG9yIHByZWZlciB0byBjb25maWd1cmUKLUFwYWNoZSAxLjMgd2l0aCB0aGUgIjxDT0RFPnNyYy9Db25maWd1cmU8L0NPREU+IiBzY3JpcHQgeW91IGhhdmUgdG8gZWRpdAotdGhlIHN1RVhFQyBoZWFkZXIgZmlsZSBhbmQgaW5zdGFsbCB0aGUgYmluYXJ5IGluIGl0cyBwcm9wZXIgbG9jYXRpb24KLW1hbnVhbGx5LiBUaGlzIHByb2NlZHVyZSBpcyBkZXNjcmliZWQgaW4gYW4KLTxBIEhSRUY9InN1ZXhlY18xXzIuaHRtbCI+ZXh0cmEgZG9jdW1lbnQ8L0E+LgotVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBkZXNjcmliZSB0aGUgY29uZmlndXJhdGlvbiBhbmQgaW5zdGFsbGF0aW9uCi1mb3IgQXBhY2hlIDEuMyB3aXRoIHRoZSBBdXRvQ29uZi1zdHlsZSBpbnRlcmZhY2UgKEFQQUNJKS4KLTwvUD4KLQotPFAgQUxJR049IkxFRlQiPgotPFNUUk9ORz5BUEFDSSdzIHN1RVhFQyBjb25maWd1cmF0aW9uIG9wdGlvbnM8L1NUUk9ORz48QlI+Ci08REw+Ci08RFQ+PENPREU+LS1lbmFibGUtc3VleGVjPC9DT0RFPgotPEREPlRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIHN1RVhFQyBmZWF0dXJlIHdoaWNoIGlzIG5ldmVyIGluc3RhbGxlZCBvcgotICAgIGFjdGl2YXRlZCBieSBkZWZhdWx0LiBBdCBsZWFzdCBvbmUgLS1zdWV4ZWMteHh4eHggb3B0aW9uIGhhcyB0byBiZQotICAgIHByb3ZpZGVkIHRvZ2V0aGVyIHdpdGggdGhlIC0tZW5hYmxlLXN1ZXhlYyBvcHRpb24gdG8gbGV0IEFQQUNJCi0gICAgYWNjZXB0IHlvdXIgcmVxdWVzdCBmb3IgdXNpbmcgdGhlIHN1RVhFQyBmZWF0dXJlLgotPERUPjxDT0RFPi0tc3VleGVjLWNhbGxlcj08RU0+VUlEPC9FTT48L0NPREU+Ci08REQ+VGhlIDxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjdXNlciI+dXNlcm5hbWU8L0E+IHVuZGVyIHdoaWNoCi0gICAgQXBhY2hlIG5vcm1hbGx5IHJ1bnMuCi0gICAgVGhpcyBpcyB0aGUgb25seSB1c2VyIGFsbG93ZWQgdG8gZXhlY3V0ZSB0aGlzIHByb2dyYW0uCi08RFQ+PENPREU+LS1zdWV4ZWMtZG9jcm9vdD08RU0+RElSPC9FTT48L0NPREU+Ci08REQ+RGVmaW5lIGFzIHRoZSBEb2N1bWVudFJvb3Qgc2V0IGZvciBBcGFjaGUuCi0gICAgVGhpcyB3aWxsIGJlIHRoZSBvbmx5IGhpZXJhcmNoeSAoYXNpZGUgZnJvbSBVc2VyRGlycykKLSAgICB0aGF0IGNhbiBiZSB1c2VkIGZvciBzdUVYRUMgYmVoYXZpb3IuCi0gICAgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzIHRoZSAtLWRhdGFkaXIgdmFsdWUgd2l0aCAKLSAgICB0aGUgc3VmZml4ICIvaHRkb2NzIiwgPEVNPmUuZy48L0VNPiBpZiB5b3UgY29uZmlndXJlIHdpdGgKLSAgICAiPENPREU+LS1kYXRhZGlyPS9ob21lL2FwYWNoZTwvQ09ERT4iIHRoZSBkaXJlY3RvcnkKLSAgICAiL2hvbWUvYXBhY2hlL2h0ZG9jcyIgaXMgdXNlZCBhcyBkb2N1bWVudCByb290IGZvcgotICAgIHRoZSBzdUVYRUMgd3JhcHBlci4KLTxEVD48Q09ERT4tLXN1ZXhlYy1sb2dmaWxlPTxFTT5GSUxFPC9FTT48L0NPREU+Ci08REQ+VGhpcyBkZWZpbmVzIHRoZSBmaWxlbmFtZSB0byB3aGljaCBhbGwgc3VFWEVDIHRyYW5zYWN0aW9ucyBhbmQKLSAgICBlcnJvcnMgYXJlIGxvZ2dlZCAodXNlZnVsIGZvciBhdWRpdGluZyBhbmQgZGVidWdnaW5nIHB1cnBvc2VzKS4KLSAgICBCeSBkZWZhdWx0IHRoZSBsb2dmaWxlIGlzIG5hbWVkICJzdWV4ZWNfbG9nIiBhbmQgbG9jYXRlZCBpbiB5b3VyCi0gICAgc3RhbmRhcmQgbG9nZmlsZSBkaXJlY3RvcnkgKC0tbG9nZmlsZWRpcikuCi08RFQ+PENPREU+LS1zdWV4ZWMtdXNlcmRpcj08RU0+RElSPC9FTT48L0NPREU+Ci08REQ+RGVmaW5lIHRvIGJlIHRoZSBzdWJkaXJlY3RvcnkgdW5kZXIgdXNlcnMnCi0gICAgaG9tZSBkaXJlY3RvcmllcyB3aGVyZSBzdUVYRUMgYWNjZXNzIHNob3VsZAotICAgIGJlIGFsbG93ZWQuICBBbGwgZXhlY3V0YWJsZXMgdW5kZXIgdGhpcyBkaXJlY3RvcnkKLSAgICB3aWxsIGJlIGV4ZWN1dGFibGUgYnkgc3VFWEVDIGFzIHRoZSB1c2VyIHNvCi0gICAgdGhleSBzaG91bGQgYmUgInNhZmUiIHByb2dyYW1zLiAgSWYgeW91IGFyZQotICAgIHVzaW5nIGEgInNpbXBsZSIgVXNlckRpciBkaXJlY3RpdmUgKGllLiBvbmUKLSAgICB3aXRob3V0IGEgIioiIGluIGl0KSB0aGlzIHNob3VsZCBiZSBzZXQgdG8KLSAgICB0aGUgc2FtZSB2YWx1ZS4gIHN1RVhFQyB3aWxsIG5vdCB3b3JrIHByb3Blcmx5Ci0gICAgaW4gY2FzZXMgd2hlcmUgdGhlIFVzZXJEaXIgZGlyZWN0aXZlIHBvaW50cyB0bwotICAgIGEgbG9jYXRpb24gdGhhdCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHVzZXIncwotICAgIGhvbWUgZGlyZWN0b3J5IGFzIHJlZmVyZW5jZWQgaW4gdGhlIHBhc3N3ZCBmaWxlLgotICAgIERlZmF1bHQgdmFsdWUgaXMgInB1YmxpY19odG1sIi4KLSAgICA8QlI+Ci0gICAgSWYgeW91IGhhdmUgdmlydHVhbCBob3N0cyB3aXRoIGEgZGlmZmVyZW50Ci0gICAgVXNlckRpciBmb3IgZWFjaCwgeW91IHdpbGwgbmVlZCB0byBkZWZpbmUgdGhlbSB0bwotICAgIGFsbCByZXNpZGUgaW4gb25lIHBhcmVudCBkaXJlY3Rvcnk7IHRoZW4gbmFtZSB0aGF0Ci0gICAgcGFyZW50IGRpcmVjdG9yeSBoZXJlLiAgPFNUUk9ORz5JZiB0aGlzIGlzIG5vdCBkZWZpbmVkCi0gICAgcHJvcGVybHksICJ+dXNlcmRpciIgY2dpIHJlcXVlc3RzIHdpbGwgbm90IHdvcmshPC9TVFJPTkc+Ci08RFQ+PENPREU+LS1zdWV4ZWMtdWlkbWluPTxFTT5VSUQ8L0VNPjwvQ09ERT4KLTxERD5EZWZpbmUgdGhpcyBhcyB0aGUgbG93ZXN0IFVJRCBhbGxvd2VkIHRvIGJlIGEgdGFyZ2V0IHVzZXIKLSAgICBmb3Igc3VFWEVDLiAgRm9yIG1vc3Qgc3lzdGVtcywgNTAwIG9yIDEwMCBpcyBjb21tb24uCi0gICAgRGVmYXVsdCB2YWx1ZSBpcyAxMDAuCi08RFQ+PENPREU+LS1zdWV4ZWMtZ2lkbWluPTxFTT5HSUQ8L0VNPjwvQ09ERT4KLTxERD5EZWZpbmUgdGhpcyBhcyB0aGUgbG93ZXN0IEdJRCBhbGxvd2VkIHRvIGJlIGEgdGFyZ2V0IGdyb3VwCi0gICAgZm9yIHN1RVhFQy4gRm9yIG1vc3Qgc3lzdGVtcywgMTAwIGlzIGNvbW1vbiBhbmQgdGhlcmVmb3JlCi0gICAgdXNlZCBhcyBkZWZhdWx0IHZhbHVlLgotPERUPjxDT0RFPi0tc3VleGVjLXNhZmVwYXRoPTxFTT5QQVRIPC9FTT48L0NPREU+Ci08REQ+RGVmaW5lIGEgc2FmZSBQQVRIIGVudmlyb25tZW50IHRvIHBhc3MgdG8gQ0dJIGV4ZWN1dGFibGVzLgotICAgIERlZmF1bHQgdmFsdWUgaXMgIi91c3IvbG9jYWwvYmluOi91c3IvYmluOi9iaW4iLgotPC9ETD4KLTwvUD4KLQotPFAgQUxJR049IkxFRlQiPgotPFNUUk9ORz5DaGVja2luZyB5b3VyIHN1RVhFQyBzZXR1cDwvU1RST05HPjxCUj4KLUJlZm9yZSB5b3UgY29tcGlsZSBhbmQgaW5zdGFsbCB0aGUgc3VFWEVDIHdyYXBwZXIgeW91IGNhbiBjaGVjawotdGhlIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgLS1sYXlvdXQgb3B0aW9uLgotPEJSPgotRXhhbXBsZSBvdXRwdXQ6Ci08UFJFPgotICAgIHN1RVhFQyBzZXR1cDoKLSAgICAgICAgICAgIHN1ZXhlYyBiaW5hcnk6IC91c3IvbG9jYWwvYXBhY2hlL3NiaW4vc3VleGVjCi0gICAgICAgICAgICBkb2N1bWVudCByb290OiAvdXNyL2xvY2FsL2FwYWNoZS9zaGFyZS9odGRvY3MKLSAgICAgICAgICAgdXNlcmRpciBzdWZmaXg6IHB1YmxpY19odG1sCi0gICAgICAgICAgICAgICAgICBsb2dmaWxlOiAvdXNyL2xvY2FsL2FwYWNoZS92YXIvbG9nL3N1ZXhlY19sb2cKLSAgICAgICAgICAgICAgICBzYWZlIHBhdGg6IC91c3IvbG9jYWwvYmluOi91c3IvYmluOi9iaW4KLSAgICAgICAgICAgICAgICBjYWxsZXIgSUQ6IHd3dwotICAgICAgICAgIG1pbmltdW0gdXNlciBJRDogMTAwCi0gICAgICAgICBtaW5pbXVtIGdyb3VwIElEOiAxMDAKLTwvUFJFPgotPC9QPgotCi08UCBBTElHTj0iTEVGVCI+Ci08U1RST05HPkNvbXBpbGluZyBhbmQgaW5zdGFsbGluZyB0aGUgc3VFWEVDIHdyYXBwZXI8L1NUUk9ORz48QlI+Ci1JZiB5b3UgaGF2ZSBlbmFibGVkIHRoZSBzdUVYRUMgZmVhdHVyZSB3aXRoIHRoZSAtLWVuYWJsZS1zdWV4ZWMgb3B0aW9uCi10aGUgc3VleGVjIGJpbmFyeSAodG9nZXRoZXIgd2l0aCBBcGFjaGUgaXRzZWxmKSBpcyBhdXRvbWF0aWNhbGx5IGJ1aWx0Ci1pZiB5b3UgZXhlY3V0ZSB0aGUgY29tbWFuZCAibWFrZSIuCi08QlI+Ci1BZnRlciBhbGwgY29tcG9uZW50cyBoYXZlIGJlZW4gYnVpbHQgeW91IGNhbiBleGVjdXRlIHRoZSBjb21tYW5kCi0ibWFrZSBpbnN0YWxsIiB0byBpbnN0YWxsIHRoZW0uCi1UaGUgYmluYXJ5IGltYWdlICJzdWV4ZWMiIGlzIGluc3RhbGxlZCBpbiB0aGUgZGlyZWN0b3J5IGRlZmluZWQgYnkKLXRoZSAtLXNiaW5kaXIgb3B0aW9uLiBEZWZhdWx0IGxvY2F0aW9uIGlzICIvdXNyL2xvY2FsL2FwYWNoZS9zYmluL3N1ZXhlYyIuCi08QlI+Ci1QbGVhc2Ugbm90ZSB0aGF0IHlvdSBuZWVkIDxTVFJPTkc+PEVNPnJvb3QgcHJpdmlsZWdlczwvRU0+PC9TVFJPTkc+IGZvcgotdGhlIGluc3RhbGxhdGlvbiBzdGVwLiBJbiBvcmRlciBmb3IgdGhlIHdyYXBwZXIgdG8gc2V0IHRoZSB1c2VyIElELCBpdAotbXVzdCBiZSBpbnN0YWxsZWQgYXMgb3duZXIgPENPREU+PEVNPnJvb3Q8L0VNPjwvQ09ERT4gYW5kIG11c3QgaGF2ZSB0aGUKLXNldHVzZXJpZCBleGVjdXRpb24gYml0IHNldCBmb3IgZmlsZSBtb2Rlcy4KLTwvUD4KLQotPFAgQUxJR049IkNFTlRFUiI+Ci08U1RST05HPjxBIEhSRUY9InN1ZXhlYy5odG1sIj5CQUNLIFRPIENPTlRFTlRTPC9BPjwvU1RST05HPgotPC9QPgotCi08SDM+PEEgTkFNRT0iZW5hYmxlIj5FbmFibGluZyAmYW1wOyBEaXNhYmxpbmcgc3VFWEVDPC9BPjwvSDM+Ci08UCBBTElHTj0iTEVGVCI+Ci1VcG9uIHN0YXJ0dXAgb2YgQXBhY2hlLCBpdCBsb29rcyBmb3IgdGhlIGZpbGUgInN1ZXhlYyIgaW4gdGhlICJzYmluIgotZGlyZWN0b3J5IChkZWZhdWx0IGlzICIvdXNyL2xvY2FsL2FwYWNoZS9zYmluL3N1ZXhlYyIpLgotSWYgQXBhY2hlIGZpbmRzIGEgcHJvcGVybHkgY29uZmlndXJlZCBzdUVYRUMgd3JhcHBlciwgaXQgd2lsbCBwcmludAotdGhlIGZvbGxvd2luZyBtZXNzYWdlIHRvIHRoZSBlcnJvciBsb2c6Ci08UFJFPgotICAgIFtub3RpY2VdIHN1RVhFQyBtZWNoYW5pc20gZW5hYmxlZCAod3JhcHBlcjogPEVNPi9wYXRoL3RvL3N1ZXhlYzwvRU0+KQotPC9QUkU+Ci1JZiB5b3UgZG9uJ3Qgc2VlIHRoaXMgbWVzc2FnZSBhdCBzZXJ2ZXIgc3RhcnR1cCwgdGhlIHNlcnZlciBpcyBtb3N0Ci1saWtlbHkgbm90IGZpbmRpbmcgdGhlIHdyYXBwZXIgcHJvZ3JhbSB3aGVyZSBpdCBleHBlY3RzIGl0LCBvciB0aGUKLWV4ZWN1dGFibGUgaXMgbm90IGluc3RhbGxlZCA8RU0+c2V0dWlkIHJvb3Q8L0VNPi4KLTxCUj4KLUlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGUgc3VFWEVDIG1lY2hhbmlzbSBmb3IgdGhlIGZpcnN0IHRpbWUKLWFuZCBhbiBBcGFjaGUgc2VydmVyIGlzIGFscmVhZHkgcnVubmluZyB5b3UgbXVzdCBraWxsIGFuZCByZXN0YXJ0IEFwYWNoZS4KLVJlc3RhcnRpbmcgaXQgd2l0aCBhIHNpbXBsZSBIVVAgb3IgVVNSMSBzaWduYWwgd2lsbCBub3QgYmUgZW5vdWdoLgotPEJSPgotSWYgeW91IHdhbnQgdG8gZGlzYWJsZSBzdUVYRUMgeW91IHNob3VsZCBraWxsIGFuZCByZXN0YXJ0IEFwYWNoZSBhZnRlcgoteW91IGhhdmUgcmVtb3ZlZCB0aGUgInN1ZXhlYyIgZmlsZS4KLTwvUD4KLQotPFAgQUxJR049IkNFTlRFUiI+Ci08U1RST05HPjxBIEhSRUY9InN1ZXhlYy5odG1sIj5CQUNLIFRPIENPTlRFTlRTPC9BPjwvU1RST05HPgotPC9QPgotCi08SDM+PEEgTkFNRT0idXNhZ2UiPlVzaW5nIHN1RVhFQzwvQT48L0gzPgotPFAgQUxJR049IkxFRlQiPgotPFNUUk9ORz5WaXJ0dWFsIEhvc3RzOjwvU1RST05HPjxCUj4KLU9uZSB3YXkgdG8gdXNlIHRoZSBzdUVYRUMgd3JhcHBlciBpcyB0aHJvdWdoIHRoZQotPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCN1c2VyIj5Vc2VyPC9BPiBhbmQKLTxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjZ3JvdXAiPkdyb3VwPC9BPiBkaXJlY3RpdmVzIGluCi08QSBIUkVGPSJtb2QvY29yZS5odG1sI3ZpcnR1YWxob3N0Ij5WaXJ0dWFsSG9zdDwvQT4KLWRlZmluaXRpb25zLiBCeSBzZXR0aW5nIHRoZXNlIGRpcmVjdGl2ZXMgdG8gdmFsdWVzIGRpZmZlcmVudCBmcm9tIHRoZQotbWFpbiBzZXJ2ZXIgdXNlciBJRCwgYWxsIHJlcXVlc3RzIGZvciBDR0kgcmVzb3VyY2VzIHdpbGwgYmUgZXhlY3V0ZWQgYXMKLXRoZSA8RU0+VXNlcjwvRU0+IGFuZCA8RU0+R3JvdXA8L0VNPiBkZWZpbmVkIGZvciB0aGF0Ci08Q09ERT4mbHQ7VmlydHVhbEhvc3QmZ3Q7PC9DT0RFPi4gSWYgb25seSBvbmUgb3IKLW5laXRoZXIgb2YgdGhlc2UgZGlyZWN0aXZlcyBhcmUgc3BlY2lmaWVkIGZvciBhCi08Q09ERT4mbHQ7VmlydHVhbEhvc3QmZ3Q7PC9DT0RFPiB0aGVuIHRoZSBtYWluCi1zZXJ2ZXIgdXNlcmlkIGlzIGFzc3VtZWQuCi08UD4KLTxTVFJPTkc+VXNlciBkaXJlY3Rvcmllczo8L1NUUk9ORz48QlI+Ci1UaGUgc3VFWEVDIHdyYXBwZXIgY2FuIGFsc28gYmUgdXNlZCB0byBleGVjdXRlIENHSSBwcm9ncmFtcyBhcwotdGhlIHVzZXIgdG8gd2hpY2ggdGhlIHJlcXVlc3QgaXMgYmVpbmcgZGlyZWN0ZWQuIFRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5Ci11c2luZyB0aGUgIjxTVFJPTkc+PENPREU+fjwvQ09ERT48L1NUUk9ORz4iIGNoYXJhY3RlciBwcmVmaXhpbmcgdGhlIHVzZXIKLUlEIGZvciB3aG9tIGV4ZWN1dGlvbiBpcyBkZXNpcmVkLgotVGhlIG9ubHkgcmVxdWlyZW1lbnQgbmVlZGVkIGZvciB0aGlzIGZlYXR1cmUgdG8gd29yayBpcyBmb3IgQ0dJCi1leGVjdXRpb24gdG8gYmUgZW5hYmxlZCBmb3IgdGhlIHVzZXIgYW5kIHRoYXQgdGhlIHNjcmlwdCBtdXN0IG1lZXQgdGhlCi1zY3J1dGlueSBvZiB0aGUgPEEgSFJFRj0iI21vZGVsIj5zZWN1cml0eSBjaGVja3M8L0E+IGFib3ZlLgotCi08UCBBTElHTj0iQ0VOVEVSIj4KLTxTVFJPTkc+PEEgSFJFRj0ic3VleGVjLmh0bWwiPkJBQ0sgVE8gQ09OVEVOVFM8L0E+PC9TVFJPTkc+Ci08L1A+Ci0KLTxIMz48QSBOQU1FPSJkZWJ1ZyI+RGVidWdnaW5nIHN1RVhFQzwvQT48L0gzPgotPFAgQUxJR049IkxFRlQiPgotVGhlIHN1RVhFQyB3cmFwcGVyIHdpbGwgd3JpdGUgbG9nIGluZm9ybWF0aW9uIHRvIHRoZSBmaWxlIGRlZmluZWQKLXdpdGggdGhlIC0tc3VleGVjLWxvZ2ZpbGUgb3B0aW9uIGFzIGluZGljYXRlZCBhYm92ZS4gSWYgeW91IGZlZWwgeW91IGhhdmUKLWNvbmZpZ3VyZWQgYW5kIGluc3RhbGxlZCB0aGUgd3JhcHBlciBwcm9wZXJseSwgaGF2ZSBhIGxvb2sgYXQgdGhpcyBsb2cKLWFuZCB0aGUgZXJyb3JfbG9nIGZvciB0aGUgc2VydmVyIHRvIHNlZSB3aGVyZSB5b3UgbWF5IGhhdmUgZ29uZSBhc3RyYXkuCi08L1A+Ci0KLTxQIEFMSUdOPSJDRU5URVIiPgotPFNUUk9ORz48QSBIUkVGPSJzdWV4ZWMuaHRtbCI+QkFDSyBUTyBDT05URU5UUzwvQT48L1NUUk9ORz4KLTwvUD4KLQotPEgzPgotPEEgTkFNRT0iamFiYmVyd29jayI+QmV3YXJlIHRoZSBKYWJiZXJ3b2NrOiBXYXJuaW5ncyAmYW1wOyBFeGFtcGxlczwvQT4KLTwvSDM+Ci08UCBBTElHTj0iTEVGVCI+Ci08U1RST05HPk5PVEUhPC9TVFJPTkc+ICBUaGlzIHNlY3Rpb24gbWF5IG5vdCBiZSBjb21wbGV0ZS4gIEZvciB0aGUgbGF0ZXN0Ci1yZXZpc2lvbiBvZiB0aGlzIHNlY3Rpb24gb2YgdGhlIGRvY3VtZW50YXRpb24sIHNlZSB0aGUgQXBhY2hlIEdyb3VwJ3MKLTxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL3N1ZXhlYy5odG1sIj5PbmxpbmUgRG9jdW1lbnRhdGlvbjwvQT4KLXZlcnNpb24uCi08L1A+Ci0KLTxQIEFMSUdOPSJMRUZUIj4KLVRoZXJlIGFyZSBhIGZldyBwb2ludHMgb2YgaW50ZXJlc3QgcmVnYXJkaW5nIHRoZSB3cmFwcGVyIHRoYXQgY2FuIGNhdXNlCi1saW1pdGF0aW9ucyBvbiBzZXJ2ZXIgc2V0dXAuICBQbGVhc2UgcmV2aWV3IHRoZXNlIGJlZm9yZSBzdWJtaXR0aW5nIGFueQotImJ1Z3MiIHJlZ2FyZGluZyBzdUVYRUMuCi08VUw+Ci0gICAgICAgIDxMST48U1RST05HPnN1RVhFQyBQb2ludHMgT2YgSW50ZXJlc3Q8L1NUUk9ORz48L0xJPgotICAgICAgICA8TEk+SGllcmFyY2h5IGxpbWl0YXRpb25zCi0gICAgICAgIDxCTE9DS1FVT1RFPgotICAgICAgICBGb3Igc2VjdXJpdHkgYW5kIGVmZmljaWVuY3kgcmVhc29ucywgYWxsIHN1ZXhlYyByZXF1ZXN0cyBtdXN0Ci0gICAgICAgIHJlbWFpbiB3aXRoaW4gZWl0aGVyIGEgdG9wLWxldmVsIGRvY3VtZW50IHJvb3QgZm9yIHZpcnR1YWwKLSAgICAgICAgaG9zdCByZXF1ZXN0cywgb3Igb25lIHRvcC1sZXZlbCBwZXJzb25hbCBkb2N1bWVudCByb290IGZvcgotICAgICAgICB1c2VyZGlyIHJlcXVlc3RzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGZvdXIgVmlydHVhbEhvc3RzCi0gICAgICAgIGNvbmZpZ3VyZWQsIHlvdSB3b3VsZCBuZWVkIHRvIHN0cnVjdHVyZSBhbGwgb2YgeW91ciBWSG9zdHMnCi0gICAgICAgIGRvY3VtZW50IHJvb3RzIG9mZiBvZiBvbmUgbWFpbiBBcGFjaGUgZG9jdW1lbnQgaGllcmFyY2h5IHRvCi0gICAgICAgIHRha2UgYWR2YW50YWdlIG9mIHN1RVhFQyBmb3IgVmlydHVhbEhvc3RzLiAoRXhhbXBsZSBmb3J0aGNvbWluZy4pCi0gICAgICAgIDwvQkxPQ0tRVU9URT4KLSAgICAgICAgPC9MST4KLSAgICAgICAgPExJPnN1RVhFQydzIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUKLSAgICAgICAgPEJMT0NLUVVPVEU+Ci0gICAgICAgIFRoaXMgY2FuIGJlIGEgZGFuZ2Vyb3VzIHRoaW5nIHRvIGNoYW5nZS4gIE1ha2UgY2VydGFpbiBldmVyeQotICAgICAgICBwYXRoIHlvdSBpbmNsdWRlIGluIHRoaXMgZGVmaW5lIGlzIGEgPFNUUk9ORz50cnVzdGVkPC9TVFJPTkc+Ci0gICAgICAgIGRpcmVjdG9yeS4gIFlvdSBkb24ndCB3YW50IHRvIG9wZW4gcGVvcGxlIHVwIHRvIGhhdmluZyBzb21lb25lCi0gICAgICAgIGZyb20gYWNyb3NzIHRoZSB3b3JsZCBydW5uaW5nIGEgdHJvamFuIGhvcnNlIG9uIHRoZW0uCi0gICAgICAgIDwvQkxPQ0tRVU9URT4KLSAgICAgICAgPC9MST4KLSAgICAgICAgPExJPkFsdGVyaW5nIHRoZSBzdUVYRUMgY29kZQotICAgICAgICA8QkxPQ0tRVU9URT4KLSAgICAgICAgQWdhaW4sIHRoaXMgY2FuIGNhdXNlIDxTVFJPTkc+QmlnIFRyb3VibGU8L1NUUk9ORz4gaWYgeW91IHRyeQotICAgICAgICB0aGlzIHdpdGhvdXQga25vd2luZyB3aGF0IHlvdSBhcmUgZG9pbmcuICBTdGF5IGF3YXkgZnJvbSBpdAotICAgICAgICBpZiBhdCBhbGwgcG9zc2libGUuCi0gICAgICAgIDwvQkxPQ0tRVU9URT4KLSAgICAgICAgPC9MST4KLTwvVUw+Ci0KLTxQIEFMSUdOPSJDRU5URVIiPgotPFNUUk9ORz48QSBIUkVGPSJzdWV4ZWMuaHRtbCI+QkFDSyBUTyBDT05URU5UUzwvQT48L1NUUk9ORz4KLTwvUD4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3N1ZXhlYy5odG1sLmVuIGIvZG9jcy9tYW51YWwvc3VleGVjLmh0bWwuZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkODYyM2QuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvc3VleGVjLmh0bWwuZW4KKysrIC9kZXYvbnVsbApAQCAtMSw1MTggKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5BcGFjaGUgc3VFWEVDIFN1cHBvcnQ8L1RJVExFPgotPC9IRUFEPgotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci0KLTxIMSBBTElHTj0iQ0VOVEVSIj5BcGFjaGUgc3VFWEVDIFN1cHBvcnQ8L0gxPgotCi08UCBBTElHTj0iTEVGVCI+Ci08T0w+Ci0gICAgICAgIDxMST48QklHPjxTVFJPTkc+Q09OVEVOVFM8L1NUUk9ORz48L0JJRz48L0xJPgotICAgICAgICA8TEk+PEEgSFJFRj0iI3doYXQiPldoYXQgaXMgc3VFWEVDPzwvQT48L0xJPgotICAgICAgICA8TEk+PEEgSFJFRj0iI2JlZm9yZSI+QmVmb3JlIHdlIGJlZ2luLjwvQT48L0xJPgotICAgICAgICA8TEk+PEEgSFJFRj0iI21vZGVsIj5zdUVYRUMgU2VjdXJpdHkgTW9kZWwuPC9BPjwvTEk+Ci0gICAgICAgIDxMST48QSBIUkVGPSIjaW5zdGFsbCI+Q29uZmlndXJpbmcgJmFtcDsgSW5zdGFsbGluZyBzdUVYRUM8L0E+PC9MST4KLSAgICAgICAgPExJPjxBIEhSRUY9IiNlbmFibGUiPkVuYWJsaW5nICZhbXA7IERpc2FibGluZyBzdUVYRUM8L0E+PC9MST4KLSAgICAgICAgPExJPjxBIEhSRUY9IiN1c2FnZSI+VXNpbmcgc3VFWEVDPC9BPjwvTEk+Ci0gICAgICAgIDxMST48QSBIUkVGPSIjZGVidWciPkRlYnVnZ2luZyBzdUVYRUM8L0E+PC9MST4KLSAgICAgICAgPExJPjxBIEhSRUY9IiNqYWJiZXJ3b2NrIj5CZXdhcmUgdGhlIEphYmJlcndvY2s6IFdhcm5pbmdzICZhbXA7Ci0gICAgICAgICBFeGFtcGxlczwvQT48L0xJPgotPC9PTD4KLTwvUD4KLQotPEgzPjxBIE5BTUU9IndoYXQiPldoYXQgaXMgc3VFWEVDPzwvQT48L0gzPgotPFAgQUxJR049IkxFRlQiPgotVGhlIDxTVFJPTkc+c3VFWEVDPC9TVFJPTkc+IGZlYXR1cmUgLS0gaW50cm9kdWNlZCBpbiBBcGFjaGUgMS4yIC0tIHByb3ZpZGVzCi1BcGFjaGUgdXNlcnMgdGhlIGFiaWxpdHkgdG8gcnVuIDxTVFJPTkc+Q0dJPC9TVFJPTkc+IGFuZCA8U1RST05HPlNTSTwvU1RST05HPgotcHJvZ3JhbXMgdW5kZXIgdXNlciBJRHMgZGlmZmVyZW50IGZyb20gdGhlIHVzZXIgSUQgb2YgdGhlIGNhbGxpbmcgd2ViLXNlcnZlci4KLU5vcm1hbGx5LCB3aGVuIGEgQ0dJIG9yIFNTSSBwcm9ncmFtIGV4ZWN1dGVzLCBpdCBydW5zIGFzIHRoZSBzYW1lIHVzZXIgd2hvIGlzCi1ydW5uaW5nIHRoZSB3ZWIgc2VydmVyLgotPC9QPgotCi08UCBBTElHTj0iTEVGVCI+Ci1Vc2VkIHByb3Blcmx5LCB0aGlzIGZlYXR1cmUgY2FuIHJlZHVjZSBjb25zaWRlcmFibHkgdGhlIHNlY3VyaXR5IHJpc2tzIGludm9sdmVkCi13aXRoIGFsbG93aW5nIHVzZXJzIHRvIGRldmVsb3AgYW5kIHJ1biBwcml2YXRlIENHSSBvciBTU0kgcHJvZ3JhbXMuICBIb3dldmVyLAotaWYgc3VFWEVDIGlzIGltcHJvcGVybHkgY29uZmlndXJlZCwgaXQgY2FuIGNhdXNlIGFueSBudW1iZXIgb2YgcHJvYmxlbXMgYW5kCi1wb3NzaWJseSBjcmVhdGUgbmV3IGhvbGVzIGluIHlvdXIgY29tcHV0ZXIncyBzZWN1cml0eS4gIElmIHlvdSBhcmVuJ3QgZmFtaWxpYXIKLXdpdGggbWFuYWdpbmcgc2V0dWlkIHJvb3QgcHJvZ3JhbXMgYW5kIHRoZSBzZWN1cml0eSBpc3N1ZXMgdGhleSBwcmVzZW50LCB3ZQotaGlnaGx5IHJlY29tbWVuZCB0aGF0IHlvdSBub3QgY29uc2lkZXIgdXNpbmcgc3VFWEVDLgotPC9QPgotCi08UCBBTElHTj0iQ0VOVEVSIj4KLTxTVFJPTkc+PEEgSFJFRj0ic3VleGVjLmh0bWwiPkJBQ0sgVE8gQ09OVEVOVFM8L0E+PC9TVFJPTkc+Ci08L1A+Ci0KLTxIMz48QSBOQU1FPSJiZWZvcmUiPkJlZm9yZSB3ZSBiZWdpbi48L0E+PC9IMz4KLTxQIEFMSUdOPSJMRUZUIj4KLUJlZm9yZSBqdW1waW5nIGhlYWQtZmlyc3QgaW50byB0aGlzIGRvY3VtZW50LCB5b3Ugc2hvdWxkIGJlIGF3YXJlIG9mIHRoZQotYXNzdW1wdGlvbnMgbWFkZSBvbiB0aGUgcGFydCBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGlzIGRvY3VtZW50LgotPC9QPgotCi08UCBBTElHTj0iTEVGVCI+Ci1GaXJzdCwgaXQgaXMgYXNzdW1lZCB0aGF0IHlvdSBhcmUgdXNpbmcgYSBVTklYIGRlcml2YXRlIG9wZXJhdGluZyBzeXN0ZW0gdGhhdAotaXMgY2FwYWJsZSBvZiA8U1RST05HPnNldHVpZDwvU1RST05HPiBhbmQgPFNUUk9ORz5zZXRnaWQ8L1NUUk9ORz4gb3BlcmF0aW9ucy4KLUFsbCBjb21tYW5kIGV4YW1wbGVzIGFyZSBnaXZlbiBpbiB0aGlzIHJlZ2FyZC4gIE90aGVyIHBsYXRmb3JtcywgaWYgdGhleSBhcmUKLWNhcGFibGUgb2Ygc3VwcG9ydGluZyBzdUVYRUMsIG1heSBkaWZmZXIgaW4gdGhlaXIgY29uZmlndXJhdGlvbi4KLTwvUD4KLQotPFAgQUxJR049IkxFRlQiPgotU2Vjb25kLCBpdCBpcyBhc3N1bWVkIHlvdSBhcmUgZmFtaWxpYXIgd2l0aCBzb21lIGJhc2ljIGNvbmNlcHRzIG9mIHlvdXIKLWNvbXB1dGVyJ3Mgc2VjdXJpdHkgYW5kIGl0cyBhZG1pbmlzdHJhdGlvbi4gIFRoaXMgaW52b2x2ZXMgYW4gdW5kZXJzdGFuZGluZwotb2YgPFNUUk9ORz5zZXR1aWQvc2V0Z2lkPC9TVFJPTkc+IG9wZXJhdGlvbnMgYW5kIHRoZSB2YXJpb3VzIGVmZmVjdHMgdGhleQotbWF5IGhhdmUgb24geW91ciBzeXN0ZW0gYW5kIGl0cyBsZXZlbCBvZiBzZWN1cml0eS4KLTwvUD4KLQotPFAgQUxJR049IkxFRlQiPgotVGhpcmQsIGl0IGlzIGFzc3VtZWQgdGhhdCB5b3UgYXJlIHVzaW5nIGFuIDxTVFJPTkc+dW5tb2RpZmllZDwvU1RST05HPgotdmVyc2lvbiBvZiBzdUVYRUMgY29kZS4gIEFsbCBjb2RlIGZvciBzdUVYRUMgaGFzIGJlZW4gY2FyZWZ1bGx5IHNjcnV0aW5pemVkIGFuZAotdGVzdGVkIGJ5IHRoZSBkZXZlbG9wZXJzIGFzIHdlbGwgYXMgbnVtZXJvdXMgYmV0YSB0ZXN0ZXJzLiAgRXZlcnkgcHJlY2F1dGlvbgotaGFzIGJlZW4gdGFrZW4gdG8gZW5zdXJlIGEgc2ltcGxlIHlldCBzb2xpZGx5IHNhZmUgYmFzZSBvZiBjb2RlLiAgQWx0ZXJpbmcgdGhpcwotY29kZSBjYW4gY2F1c2UgdW5leHBlY3RlZCBwcm9ibGVtcyBhbmQgbmV3IHNlY3VyaXR5IHJpc2tzLiAgSXQgaXMKLTxTVFJPTkc+aGlnaGx5PC9TVFJPTkc+IHJlY29tbWVuZGVkIHlvdSBub3QgYWx0ZXIgdGhlIHN1RVhFQyBjb2RlIHVubGVzcyB5b3UKLWFyZSB3ZWxsIHZlcnNlZCBpbiB0aGUgcGFydGljdWxhcnMgb2Ygc2VjdXJpdHkgcHJvZ3JhbW1pbmcgYW5kIGFyZSB3aWxsaW5nIHRvCi1zaGFyZSB5b3VyIHdvcmsgd2l0aCB0aGUgQXBhY2hlIEdyb3VwIGZvciBjb25zaWRlcmF0aW9uLgotPC9QPgotCi08UCBBTElHTj0iTEVGVCI+Ci1Gb3VydGgsIGFuZCBsYXN0LCBpdCBoYXMgYmVlbiB0aGUgZGVjaXNpb24gb2YgdGhlIEFwYWNoZSBHcm91cCB0bwotPFNUUk9ORz5OT1Q8L1NUUk9ORz4gbWFrZSBzdUVYRUMgcGFydCBvZiB0aGUgZGVmYXVsdCBpbnN0YWxsYXRpb24gb2YgQXBhY2hlLgotVG8gdGhpcyBlbmQsIHN1RVhFQyBjb25maWd1cmF0aW9uIHJlcXVpcmVzIG9mIHRoZSBhZG1pbmlzdHJhdG9yIGNhcmVmdWwKLWF0dGVudGlvbiB0byBkZXRhaWxzLiAgQWZ0ZXIgZHVlIGNvbnNpZGVyYXRpb24gaGFzIGJlZW4gZ2l2ZW4gdG8gdGhlIHZhcmlvdXMKLXNldHRpbmdzIGZvciBzdUVYRUMsIHRoZSBhZG1pbmlzdHJhdG9yIG1heSBpbnN0YWxsIHN1RVhFQyB0aHJvdWdoIG5vcm1hbAotaW5zdGFsbGF0aW9uIG1ldGhvZHMuIFRoZSB2YWx1ZXMgZm9yIHRoZXNlIHNldHRpbmdzIG5lZWQgdG8gYmUgY2FyZWZ1bGx5Ci1kZXRlcm1pbmVkIGFuZCBzcGVjaWZpZWQgYnkgdGhlIGFkbWluaXN0cmF0b3IgdG8gcHJvcGVybHkgbWFpbnRhaW4gc3lzdGVtCi1zZWN1cml0eSBkdXJpbmcgdGhlIHVzZSBvZiBzdUVYRUMgZnVuY3Rpb25hbGl0eS4gIEl0IGlzIHRocm91Z2ggdGhpcyBkZXRhaWxlZAotcHJvY2VzcyB0aGF0IHRoZSBBcGFjaGUgR3JvdXAgaG9wZXMgdG8gbGltaXQgc3VFWEVDIGluc3RhbGxhdGlvbiBvbmx5IHRvIHRob3NlCi13aG8gYXJlIGNhcmVmdWwgYW5kIGRldGVybWluZWQgZW5vdWdoIHRvIHVzZSBpdC4KLTwvUD4KLQotPFAgQUxJR049IkxFRlQiPgotU3RpbGwgd2l0aCB1cz8gIFllcz8gIEdvb2QuICBMZXQncyBtb3ZlIG9uIQotPC9QPgotCi08UCBBTElHTj0iQ0VOVEVSIj4KLTxTVFJPTkc+PEEgSFJFRj0ic3VleGVjLmh0bWwiPkJBQ0sgVE8gQ09OVEVOVFM8L0E+PC9TVFJPTkc+Ci08L1A+Ci0KLTxIMz48QSBOQU1FPSJtb2RlbCI+c3VFWEVDIFNlY3VyaXR5IE1vZGVsPC9BPjwvSDM+Ci08UCBBTElHTj0iTEVGVCI+Ci1CZWZvcmUgd2UgYmVnaW4gY29uZmlndXJpbmcgYW5kIGluc3RhbGxpbmcgc3VFWEVDLCB3ZSB3aWxsIGZpcnN0IGRpc2N1c3MKLXRoZSBzZWN1cml0eSBtb2RlbCB5b3UgYXJlIGFib3V0IHRvIGltcGxlbWVudC4gIEJ5IGRvaW5nIHNvLCB5b3UgbWF5Ci1iZXR0ZXIgdW5kZXJzdGFuZCB3aGF0IGV4YWN0bHkgaXMgZ29pbmcgb24gaW5zaWRlIHN1RVhFQyBhbmQgd2hhdCBwcmVjYXV0aW9ucwotYXJlIHRha2VuIHRvIGVuc3VyZSB5b3VyIHN5c3RlbSdzIHNlY3VyaXR5LgotPC9QPgotCi08UCBBTElHTj0iTEVGVCI+Ci08U1RST05HPnN1RVhFQzwvU1RST05HPiBpcyBiYXNlZCBvbiBhIHNldHVpZCAid3JhcHBlciIgcHJvZ3JhbSB0aGF0IGlzCi1jYWxsZWQgYnkgdGhlIG1haW4gQXBhY2hlIHdlYiBzZXJ2ZXIuICBUaGlzIHdyYXBwZXIgaXMgY2FsbGVkIHdoZW4gYW4gSFRUUAotcmVxdWVzdCBpcyBtYWRlIGZvciBhIENHSSBvciBTU0kgcHJvZ3JhbSB0aGF0IHRoZSBhZG1pbmlzdHJhdG9yIGhhcyBkZXNpZ25hdGVkCi10byBydW4gYXMgYSB1c2VyaWQgb3RoZXIgdGhhbiB0aGF0IG9mIHRoZSBtYWluIHNlcnZlci4gIFdoZW4gc3VjaCBhIHJlcXVlc3QKLWlzIG1hZGUsIEFwYWNoZSBwcm92aWRlcyB0aGUgc3VFWEVDIHdyYXBwZXIgd2l0aCB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIHRoZQotdXNlciBhbmQgZ3JvdXAgSURzIHVuZGVyIHdoaWNoIHRoZSBwcm9ncmFtIGlzIHRvIGV4ZWN1dGUuCi08L1A+Ci0KLTxQIEFMSUdOPSJMRUZUIj4KLVRoZSB3cmFwcGVyIHRoZW4gZW1wbG95cyB0aGUgZm9sbG93aW5nIHByb2Nlc3MgdG8gZGV0ZXJtaW5lIHN1Y2Nlc3Mgb3IKLWZhaWx1cmUgLS0gaWYgYW55IG9uZSBvZiB0aGVzZSBjb25kaXRpb25zIGZhaWwsIHRoZSBwcm9ncmFtIGxvZ3MgdGhlIGZhaWx1cmUKLWFuZCBleGl0cyB3aXRoIGFuIGVycm9yLCBvdGhlcndpc2UgaXQgd2lsbCBjb250aW51ZToKLTxPTD4KLSA8TEk+PFNUUk9ORz5XYXMgdGhlIHdyYXBwZXIgY2FsbGVkIHdpdGggdGhlIHByb3BlciBudW1iZXIgb2YKLSAgYXJndW1lbnRzPzwvU1RST05HPgotICA8QkxPQ0tRVU9URT4KLSAgIFRoZSB3cmFwcGVyIHdpbGwgb25seSBleGVjdXRlIGlmIGl0IGlzIGdpdmVuIHRoZSBwcm9wZXIgbnVtYmVyIG9mIGFyZ3VtZW50cy4KLSAgIFRoZSBwcm9wZXIgYXJndW1lbnQgZm9ybWF0IGlzIGtub3duIHRvIHRoZSBBcGFjaGUgd2ViIHNlcnZlci4gIElmIHRoZQotICAgd3JhcHBlcgotICAgaXMgbm90IHJlY2VpdmluZyB0aGUgcHJvcGVyIG51bWJlciBvZiBhcmd1bWVudHMsIGl0IGlzIGVpdGhlciBiZWluZyBoYWNrZWQsCi0gICBvcgotICAgdGhlcmUgaXMgc29tZXRoaW5nIHdyb25nIHdpdGggdGhlIHN1RVhFQyBwb3J0aW9uIG9mIHlvdXIgQXBhY2hlIGJpbmFyeS4KLSAgPC9CTE9DS1FVT1RFPgotIDwvTEk+Ci0gPExJPjxTVFJPTkc+SXMgdGhlIHVzZXIgZXhlY3V0aW5nIHRoaXMgd3JhcHBlciBhIHZhbGlkIHVzZXIgb2YgdGhpcwotICBzeXN0ZW0/PC9TVFJPTkc+Ci0gIDxCTE9DS1FVT1RFPgotICAgVGhpcyBpcyB0byBlbnN1cmUgdGhhdCB0aGUgdXNlciBleGVjdXRpbmcgdGhlIHdyYXBwZXIgaXMgdHJ1bHkgYSB1c2VyIG9mIHRoZQotICAgc3lzdGVtLgotICA8L0JMT0NLUVVPVEU+Ci0gPC9MST4KLSA8TEk+PFNUUk9ORz5JcyB0aGlzIHZhbGlkIHVzZXIgYWxsb3dlZCB0byBydW4gdGhlIHdyYXBwZXI/PC9TVFJPTkc+Ci0gIDxCTE9DS1FVT1RFPgotICAgSXMgdGhpcyB1c2VyIHRoZSB1c2VyIGFsbG93ZWQgdG8gcnVuIHRoaXMgd3JhcHBlcj8gIE9ubHkgb25lIHVzZXIgKHRoZQotICAgQXBhY2hlIHVzZXIpIGlzIGFsbG93ZWQgdG8gZXhlY3V0ZSB0aGlzIHByb2dyYW0uCi0gIDwvQkxPQ0tRVU9URT4KLSA8L0xJPgotIDxMST48U1RST05HPkRvZXMgdGhlIHRhcmdldCBwcm9ncmFtIGhhdmUgYW4gdW5zYWZlIGhpZXJhcmNoaWNhbAotICByZWZlcmVuY2U/PC9TVFJPTkc+Ci0gIDxCTE9DS1FVT1RFPgotICAgRG9lcyB0aGUgdGFyZ2V0IHByb2dyYW0gY29udGFpbiBhIGxlYWRpbmcgJy8nIG9yIGhhdmUgYSAnLi4nIGJhY2tyZWZlcmVuY2U/IAotICAgVGhlc2UgYXJlIG5vdCBhbGxvd2VkOyB0aGUgdGFyZ2V0IHByb2dyYW0gbXVzdCByZXNpZGUgd2l0aGluIHRoZSBBcGFjaGUKLSAgIHdlYnNwYWNlLgotICA8L0JMT0NLUVVPVEU+Ci0gPC9MST4KLSA8TEk+PFNUUk9ORz5JcyB0aGUgdGFyZ2V0IHVzZXIgbmFtZSB2YWxpZD88L1NUUk9ORz4KLSAgPEJMT0NLUVVPVEU+Ci0gICBEb2VzIHRoZSB0YXJnZXQgdXNlciBleGlzdD8KLSAgPC9CTE9DS1FVT1RFPgotIDwvTEk+Ci0gPExJPjxTVFJPTkc+SXMgdGhlIHRhcmdldCBncm91cCBuYW1lIHZhbGlkPzwvU1RST05HPgotICA8QkxPQ0tRVU9URT4KLSAgIERvZXMgdGhlIHRhcmdldCBncm91cCBleGlzdD8KLSAgPC9CTE9DS1FVT1RFPgotIDwvTEk+Ci0gPExJPjxTVFJPTkc+SXMgdGhlIHRhcmdldCB1c2VyIDxFTT5OT1Q8L0VNPiBzdXBlcnVzZXI/PC9TVFJPTkc+Ci0gIDxCTE9DS1FVT1RFPgotICAgUHJlc2VudGx5LCBzdUVYRUMgZG9lcyBub3QgYWxsb3cgJ3Jvb3QnIHRvIGV4ZWN1dGUgQ0dJL1NTSSBwcm9ncmFtcy4KLSAgPC9CTE9DS1FVT1RFPgotIDwvTEk+Ci0gPExJPjxTVFJPTkc+SXMgdGhlIHRhcmdldCB1c2VyaWQgPEVNPkFCT1ZFPC9FTT4gdGhlIG1pbmltdW0gSUQKLSAgbnVtYmVyPzwvU1RST05HPgotICA8QkxPQ0tRVU9URT4KLSAgIFRoZSBtaW5pbXVtIHVzZXIgSUQgbnVtYmVyIGlzIHNwZWNpZmllZCBkdXJpbmcgY29uZmlndXJhdGlvbi4gIFRoaXMgYWxsb3dzCi0gICB5b3UKLSAgIHRvIHNldCB0aGUgbG93ZXN0IHBvc3NpYmxlIHVzZXJpZCB0aGF0IHdpbGwgYmUgYWxsb3dlZCB0byBleGVjdXRlIENHSS9TU0kKLSAgIHByb2dyYW1zLiAgVGhpcyBpcyB1c2VmdWwgdG8gYmxvY2sgb3V0ICJzeXN0ZW0iIGFjY291bnRzLgotICA8L0JMT0NLUVVPVEU+Ci0gPC9MST4KLSA8TEk+PFNUUk9ORz5JcyB0aGUgdGFyZ2V0IGdyb3VwIDxFTT5OT1Q8L0VNPiB0aGUgc3VwZXJ1c2VyIGdyb3VwPzwvU1RST05HPgotICA8QkxPQ0tRVU9URT4KLSAgIFByZXNlbnRseSwgc3VFWEVDIGRvZXMgbm90IGFsbG93IHRoZSAncm9vdCcgZ3JvdXAgdG8gZXhlY3V0ZSBDR0kvU1NJCi0gICBwcm9ncmFtcy4KLSAgPC9CTE9DS1FVT1RFPgotIDwvTEk+Ci0gPExJPjxTVFJPTkc+SXMgdGhlIHRhcmdldCBncm91cGlkIDxFTT5BQk9WRTwvRU0+IHRoZSBtaW5pbXVtIElECi0gIG51bWJlcj88L1NUUk9ORz4KLSAgPEJMT0NLUVVPVEU+Ci0gICBUaGUgbWluaW11bSBncm91cCBJRCBudW1iZXIgaXMgc3BlY2lmaWVkIGR1cmluZyBjb25maWd1cmF0aW9uLiAgVGhpcyBhbGxvd3MKLSAgIHlvdQotICAgdG8gc2V0IHRoZSBsb3dlc3QgcG9zc2libGUgZ3JvdXBpZCB0aGF0IHdpbGwgYmUgYWxsb3dlZCB0byBleGVjdXRlIENHSS9TU0kKLSAgIHByb2dyYW1zLiAgVGhpcyBpcyB1c2VmdWwgdG8gYmxvY2sgb3V0ICJzeXN0ZW0iIGdyb3Vwcy4KLSAgPC9CTE9DS1FVT1RFPgotIDwvTEk+Ci0gPExJPjxTVFJPTkc+Q2FuIHRoZSB3cmFwcGVyIHN1Y2Nlc3NmdWxseSBiZWNvbWUgdGhlIHRhcmdldCB1c2VyIGFuZAotICBncm91cD88L1NUUk9ORz4KLSAgPEJMT0NLUVVPVEU+Ci0gICBIZXJlIGlzIHdoZXJlIHRoZSBwcm9ncmFtIGJlY29tZXMgdGhlIHRhcmdldCB1c2VyIGFuZCBncm91cCB2aWEgc2V0dWlkIGFuZAotICAgc2V0Z2lkCi0gICBjYWxscy4gIFRoZSBncm91cCBhY2Nlc3MgbGlzdCBpcyBhbHNvIGluaXRpYWxpemVkIHdpdGggYWxsIG9mIHRoZSBncm91cHMKLSAgIG9mIHdoaWNoCi0gICB0aGUgdXNlciBpcyBhIG1lbWJlci4KLSAgPC9CTE9DS1FVT1RFPgotIDwvTEk+Ci0gPExJPjxTVFJPTkc+RG9lcyB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBwcm9ncmFtIHJlc2lkZXMgZXhpc3Q/PC9TVFJPTkc+Ci0gIDxCTE9DS1FVT1RFPgotICAgSWYgaXQgZG9lc24ndCBleGlzdCwgaXQgY2FuJ3QgdmVyeSB3ZWxsIGNvbnRhaW4gZmlsZXMuCi0gIDwvQkxPQ0tRVU9URT4KLSA8L0xJPgotIDxMST48U1RST05HPklzIHRoZSBkaXJlY3Rvcnkgd2l0aGluIHRoZSBBcGFjaGUgd2Vic3BhY2U/PC9TVFJPTkc+Ci0gIDxCTE9DS1FVT1RFPgotICAgSWYgdGhlIHJlcXVlc3QgaXMgZm9yIGEgcmVndWxhciBwb3J0aW9uIG9mIHRoZSBzZXJ2ZXIsIGlzIHRoZSByZXF1ZXN0ZWQKLSAgIGRpcmVjdG9yeQotICAgd2l0aGluIHRoZSBzZXJ2ZXIncyBkb2N1bWVudCByb290PyAgSWYgdGhlIHJlcXVlc3QgaXMgZm9yIGEgVXNlckRpciwgaXMKLSAgIHRoZSByZXF1ZXN0ZWQKLSAgIGRpcmVjdG9yeSB3aXRoaW4gdGhlIHVzZXIncyBkb2N1bWVudCByb290PwotICA8L0JMT0NLUVVPVEU+Ci0gPC9MST4KLSA8TEk+PFNUUk9ORz5JcyB0aGUgZGlyZWN0b3J5IDxFTT5OT1Q8L0VNPiB3cml0YWJsZSBieSBhbnlvbmUgZWxzZT88L1NUUk9ORz4KLSAgPEJMT0NLUVVPVEU+Ci0gICBXZSBkb24ndCB3YW50IHRvIG9wZW4gdXAgdGhlIGRpcmVjdG9yeSB0byBvdGhlcnM7IG9ubHkgdGhlIG93bmVyIHVzZXIKLSAgIG1heSBiZSBhYmxlCi0gICB0byBhbHRlciB0aGlzIGRpcmVjdG9yaWVzIGNvbnRlbnRzLgotICA8L0JMT0NLUVVPVEU+Ci0gPC9MST4KLSA8TEk+PFNUUk9ORz5Eb2VzIHRoZSB0YXJnZXQgcHJvZ3JhbSBleGlzdD88L1NUUk9ORz4KLSAgPEJMT0NLUVVPVEU+Ci0gICBJZiBpdCBkb2Vzbid0IGV4aXN0cywgaXQgY2FuJ3QgdmVyeSB3ZWxsIGJlIGV4ZWN1dGVkLgotICA8L0JMT0NLUVVPVEU+Ci0gPC9MST4KLSA8TEk+PFNUUk9ORz5JcyB0aGUgdGFyZ2V0IHByb2dyYW0gPEVNPk5PVDwvRU0+IHdyaXRhYmxlIGJ5IGFueW9uZQotICBlbHNlPzwvU1RST05HPgotICA8QkxPQ0tRVU9URT4KLSAgIFdlIGRvbid0IHdhbnQgdG8gZ2l2ZSBhbnlvbmUgb3RoZXIgdGhhbiB0aGUgb3duZXIgdGhlIGFiaWxpdHkgdG8KLSAgIGNoYW5nZSB0aGUgcHJvZ3JhbS4KLSAgPC9CTE9DS1FVT1RFPgotIDwvTEk+Ci0gPExJPjxTVFJPTkc+SXMgdGhlIHRhcmdldCBwcm9ncmFtIDxFTT5OT1Q8L0VNPiBzZXR1aWQgb3Igc2V0Z2lkPzwvU1RST05HPgotICA8QkxPQ0tRVU9URT4KLSAgIFdlIGRvIG5vdCB3YW50IHRvIGV4ZWN1dGUgcHJvZ3JhbXMgdGhhdCB3aWxsIHRoZW4gY2hhbmdlIG91ciBVSUQvR0lEIGFnYWluLgotICA8L0JMT0NLUVVPVEU+Ci0gPC9MST4KLSA8TEk+PFNUUk9ORz5JcyB0aGUgdGFyZ2V0IHVzZXIvZ3JvdXAgdGhlIHNhbWUgYXMgdGhlIHByb2dyYW0ncwotICB1c2VyL2dyb3VwPzwvU1RST05HPgotICA8QkxPQ0tRVU9URT4KLSAgIElzIHRoZSB1c2VyIHRoZSBvd25lciBvZiB0aGUgZmlsZT8KLSAgPC9CTE9DS1FVT1RFPgotIDwvTEk+Ci0gPExJPjxTVFJPTkc+Q2FuIHdlIHN1Y2Nlc3NmdWxseSBjbGVhbiB0aGUgcHJvY2VzcyBlbnZpcm9ubWVudCB0bwotICBlbnN1cmUgc2FmZSBvcGVyYXRpb25zPzwvU1RST05HPgotICA8QkxPQ0tRVU9URT4KLSAgIHN1RVhFQyBjbGVhbnMgdGhlIHByb2Nlc3MnIGVudmlyb25tZW50IGJ5IGVzdGFibGlzaGluZyBhIHNhZmUKLSAgIGV4ZWN1dGlvbiBQQVRIIChkZWZpbmVkCi0gICBkdXJpbmcgY29uZmlndXJhdGlvbiksIGFzIHdlbGwgYXMgb25seSBwYXNzaW5nIHRocm91Z2ggdGhvc2UKLSAgIHZhcmlhYmxlcyB3aG9zZSBuYW1lcwotICAgYXJlIGxpc3RlZCBpbiB0aGUgc2FmZSBlbnZpcm9ubWVudCBsaXN0IChhbHNvIGNyZWF0ZWQgZHVyaW5nCi0gICBjb25maWd1cmF0aW9uKS4KLSAgPC9CTE9DS1FVT1RFPgotIDwvTEk+Ci0gPExJPjxTVFJPTkc+Q2FuIHdlIHN1Y2Nlc3NmdWxseSBiZWNvbWUgdGhlIHRhcmdldCBwcm9ncmFtIGFuZAotICBleGVjdXRlPzwvU1RST05HPgotICA8QkxPQ0tRVU9URT4KLSAgIEhlcmUgaXMgd2hlcmUgc3VFWEVDIGVuZHMgYW5kIHRoZSB0YXJnZXQgcHJvZ3JhbSBiZWdpbnMuCi0gIDwvQkxPQ0tRVU9URT4KLSA8L0xJPgotPC9PTD4KLTwvUD4KLQotPFAgQUxJR049IkxFRlQiPgotVGhpcyBpcyB0aGUgc3RhbmRhcmQgb3BlcmF0aW9uIG9mIHRoZSB0aGUgc3VFWEVDIHdyYXBwZXIncyBzZWN1cml0eSBtb2RlbC4KLUl0IGlzIHNvbWV3aGF0IHN0cmluZ2VudCBhbmQgY2FuIGltcG9zZSBuZXcgbGltaXRhdGlvbnMgYW5kIGd1aWRlbGluZXMgZm9yCi1DR0kvU1NJIGRlc2lnbiwgYnV0IGl0IHdhcyBkZXZlbG9wZWQgY2FyZWZ1bGx5IHN0ZXAtYnktc3RlcCB3aXRoIHNlY3VyaXR5Ci1pbiBtaW5kLgotPC9QPgotCi08UCBBTElHTj0iTEVGVCI+Ci1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhcyB0byBob3cgdGhpcyBzZWN1cml0eSBtb2RlbCBjYW4gbGltaXQgeW91ciBwb3NzaWJpbGl0aWVzCi1pbiByZWdhcmRzIHRvIHNlcnZlciBjb25maWd1cmF0aW9uLCBhcyB3ZWxsIGFzIHdoYXQgc2VjdXJpdHkgcmlza3MgY2FuIGJlCi1hdm9pZGVkIHdpdGggYSBwcm9wZXIgc3VFWEVDIHNldHVwLCBzZWUgdGhlIAotPEEgSFJFRj0iI2phYmJlcndvY2siPiJCZXdhcmUgdGhlIEphYmJlcndvY2siPC9BPgotc2VjdGlvbiBvZiB0aGlzIGRvY3VtZW50LgotPC9QPgotCi08UCBBTElHTj0iQ0VOVEVSIj4KLTxTVFJPTkc+PEEgSFJFRj0ic3VleGVjLmh0bWwiPkJBQ0sgVE8gQ09OVEVOVFM8L0E+PC9TVFJPTkc+Ci08L1A+Ci0KLTxIMz48QSBOQU1FPSJpbnN0YWxsIj5Db25maWd1cmluZyAmYW1wOyBJbnN0YWxsaW5nIHN1RVhFQzwvQT48L0gzPgotPFAgQUxJR049IkxFRlQiPgotSGVyZSdzIHdoZXJlIHdlIGJlZ2luIHRoZSBmdW4uIElmIHlvdSB1c2UgQXBhY2hlIDEuMiBvciBwcmVmZXIgdG8gY29uZmlndXJlCi1BcGFjaGUgMS4zIHdpdGggdGhlICI8Q09ERT5zcmMvQ29uZmlndXJlPC9DT0RFPiIgc2NyaXB0IHlvdSBoYXZlIHRvIGVkaXQKLXRoZSBzdUVYRUMgaGVhZGVyIGZpbGUgYW5kIGluc3RhbGwgdGhlIGJpbmFyeSBpbiBpdHMgcHJvcGVyIGxvY2F0aW9uCi1tYW51YWxseS4gVGhpcyBwcm9jZWR1cmUgaXMgZGVzY3JpYmVkIGluIGFuCi08QSBIUkVGPSJzdWV4ZWNfMV8yLmh0bWwiPmV4dHJhIGRvY3VtZW50PC9BPi4KLVRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgZGVzY3JpYmUgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIGluc3RhbGxhdGlvbgotZm9yIEFwYWNoZSAxLjMgd2l0aCB0aGUgQXV0b0NvbmYtc3R5bGUgaW50ZXJmYWNlIChBUEFDSSkuCi08L1A+Ci0KLTxQIEFMSUdOPSJMRUZUIj4KLTxTVFJPTkc+QVBBQ0kncyBzdUVYRUMgY29uZmlndXJhdGlvbiBvcHRpb25zPC9TVFJPTkc+PEJSPgotPERMPgotPERUPjxDT0RFPi0tZW5hYmxlLXN1ZXhlYzwvQ09ERT4KLTxERD5UaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBzdUVYRUMgZmVhdHVyZSB3aGljaCBpcyBuZXZlciBpbnN0YWxsZWQgb3IKLSAgICBhY3RpdmF0ZWQgYnkgZGVmYXVsdC4gQXQgbGVhc3Qgb25lIC0tc3VleGVjLXh4eHh4IG9wdGlvbiBoYXMgdG8gYmUKLSAgICBwcm92aWRlZCB0b2dldGhlciB3aXRoIHRoZSAtLWVuYWJsZS1zdWV4ZWMgb3B0aW9uIHRvIGxldCBBUEFDSQotICAgIGFjY2VwdCB5b3VyIHJlcXVlc3QgZm9yIHVzaW5nIHRoZSBzdUVYRUMgZmVhdHVyZS4KLTxEVD48Q09ERT4tLXN1ZXhlYy1jYWxsZXI9PEVNPlVJRDwvRU0+PC9DT0RFPgotPEREPlRoZSA8QSBIUkVGPSJtb2QvY29yZS5odG1sI3VzZXIiPnVzZXJuYW1lPC9BPiB1bmRlciB3aGljaAotICAgIEFwYWNoZSBub3JtYWxseSBydW5zLgotICAgIFRoaXMgaXMgdGhlIG9ubHkgdXNlciBhbGxvd2VkIHRvIGV4ZWN1dGUgdGhpcyBwcm9ncmFtLgotPERUPjxDT0RFPi0tc3VleGVjLWRvY3Jvb3Q9PEVNPkRJUjwvRU0+PC9DT0RFPgotPEREPkRlZmluZSBhcyB0aGUgRG9jdW1lbnRSb290IHNldCBmb3IgQXBhY2hlLgotICAgIFRoaXMgd2lsbCBiZSB0aGUgb25seSBoaWVyYXJjaHkgKGFzaWRlIGZyb20gVXNlckRpcnMpCi0gICAgdGhhdCBjYW4gYmUgdXNlZCBmb3Igc3VFWEVDIGJlaGF2aW9yLgotICAgIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpcyB0aGUgLS1kYXRhZGlyIHZhbHVlIHdpdGggCi0gICAgdGhlIHN1ZmZpeCAiL2h0ZG9jcyIsIDxFTT5lLmcuPC9FTT4gaWYgeW91IGNvbmZpZ3VyZSB3aXRoCi0gICAgIjxDT0RFPi0tZGF0YWRpcj0vaG9tZS9hcGFjaGU8L0NPREU+IiB0aGUgZGlyZWN0b3J5Ci0gICAgIi9ob21lL2FwYWNoZS9odGRvY3MiIGlzIHVzZWQgYXMgZG9jdW1lbnQgcm9vdCBmb3IKLSAgICB0aGUgc3VFWEVDIHdyYXBwZXIuCi08RFQ+PENPREU+LS1zdWV4ZWMtbG9nZmlsZT08RU0+RklMRTwvRU0+PC9DT0RFPgotPEREPlRoaXMgZGVmaW5lcyB0aGUgZmlsZW5hbWUgdG8gd2hpY2ggYWxsIHN1RVhFQyB0cmFuc2FjdGlvbnMgYW5kCi0gICAgZXJyb3JzIGFyZSBsb2dnZWQgKHVzZWZ1bCBmb3IgYXVkaXRpbmcgYW5kIGRlYnVnZ2luZyBwdXJwb3NlcykuCi0gICAgQnkgZGVmYXVsdCB0aGUgbG9nZmlsZSBpcyBuYW1lZCAic3VleGVjX2xvZyIgYW5kIGxvY2F0ZWQgaW4geW91cgotICAgIHN0YW5kYXJkIGxvZ2ZpbGUgZGlyZWN0b3J5ICgtLWxvZ2ZpbGVkaXIpLgotPERUPjxDT0RFPi0tc3VleGVjLXVzZXJkaXI9PEVNPkRJUjwvRU0+PC9DT0RFPgotPEREPkRlZmluZSB0byBiZSB0aGUgc3ViZGlyZWN0b3J5IHVuZGVyIHVzZXJzJwotICAgIGhvbWUgZGlyZWN0b3JpZXMgd2hlcmUgc3VFWEVDIGFjY2VzcyBzaG91bGQKLSAgICBiZSBhbGxvd2VkLiAgQWxsIGV4ZWN1dGFibGVzIHVuZGVyIHRoaXMgZGlyZWN0b3J5Ci0gICAgd2lsbCBiZSBleGVjdXRhYmxlIGJ5IHN1RVhFQyBhcyB0aGUgdXNlciBzbwotICAgIHRoZXkgc2hvdWxkIGJlICJzYWZlIiBwcm9ncmFtcy4gIElmIHlvdSBhcmUKLSAgICB1c2luZyBhICJzaW1wbGUiIFVzZXJEaXIgZGlyZWN0aXZlIChpZS4gb25lCi0gICAgd2l0aG91dCBhICIqIiBpbiBpdCkgdGhpcyBzaG91bGQgYmUgc2V0IHRvCi0gICAgdGhlIHNhbWUgdmFsdWUuICBzdUVYRUMgd2lsbCBub3Qgd29yayBwcm9wZXJseQotICAgIGluIGNhc2VzIHdoZXJlIHRoZSBVc2VyRGlyIGRpcmVjdGl2ZSBwb2ludHMgdG8KLSAgICBhIGxvY2F0aW9uIHRoYXQgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSB1c2VyJ3MKLSAgICBob21lIGRpcmVjdG9yeSBhcyByZWZlcmVuY2VkIGluIHRoZSBwYXNzd2QgZmlsZS4KLSAgICBEZWZhdWx0IHZhbHVlIGlzICJwdWJsaWNfaHRtbCIuCi0gICAgPEJSPgotICAgIElmIHlvdSBoYXZlIHZpcnR1YWwgaG9zdHMgd2l0aCBhIGRpZmZlcmVudAotICAgIFVzZXJEaXIgZm9yIGVhY2gsIHlvdSB3aWxsIG5lZWQgdG8gZGVmaW5lIHRoZW0gdG8KLSAgICBhbGwgcmVzaWRlIGluIG9uZSBwYXJlbnQgZGlyZWN0b3J5OyB0aGVuIG5hbWUgdGhhdAotICAgIHBhcmVudCBkaXJlY3RvcnkgaGVyZS4gIDxTVFJPTkc+SWYgdGhpcyBpcyBub3QgZGVmaW5lZAotICAgIHByb3Blcmx5LCAifnVzZXJkaXIiIGNnaSByZXF1ZXN0cyB3aWxsIG5vdCB3b3JrITwvU1RST05HPgotPERUPjxDT0RFPi0tc3VleGVjLXVpZG1pbj08RU0+VUlEPC9FTT48L0NPREU+Ci08REQ+RGVmaW5lIHRoaXMgYXMgdGhlIGxvd2VzdCBVSUQgYWxsb3dlZCB0byBiZSBhIHRhcmdldCB1c2VyCi0gICAgZm9yIHN1RVhFQy4gIEZvciBtb3N0IHN5c3RlbXMsIDUwMCBvciAxMDAgaXMgY29tbW9uLgotICAgIERlZmF1bHQgdmFsdWUgaXMgMTAwLgotPERUPjxDT0RFPi0tc3VleGVjLWdpZG1pbj08RU0+R0lEPC9FTT48L0NPREU+Ci08REQ+RGVmaW5lIHRoaXMgYXMgdGhlIGxvd2VzdCBHSUQgYWxsb3dlZCB0byBiZSBhIHRhcmdldCBncm91cAotICAgIGZvciBzdUVYRUMuIEZvciBtb3N0IHN5c3RlbXMsIDEwMCBpcyBjb21tb24gYW5kIHRoZXJlZm9yZQotICAgIHVzZWQgYXMgZGVmYXVsdCB2YWx1ZS4KLTxEVD48Q09ERT4tLXN1ZXhlYy1zYWZlcGF0aD08RU0+UEFUSDwvRU0+PC9DT0RFPgotPEREPkRlZmluZSBhIHNhZmUgUEFUSCBlbnZpcm9ubWVudCB0byBwYXNzIHRvIENHSSBleGVjdXRhYmxlcy4KLSAgICBEZWZhdWx0IHZhbHVlIGlzICIvdXNyL2xvY2FsL2JpbjovdXNyL2JpbjovYmluIi4KLTwvREw+Ci08L1A+Ci0KLTxQIEFMSUdOPSJMRUZUIj4KLTxTVFJPTkc+Q2hlY2tpbmcgeW91ciBzdUVYRUMgc2V0dXA8L1NUUk9ORz48QlI+Ci1CZWZvcmUgeW91IGNvbXBpbGUgYW5kIGluc3RhbGwgdGhlIHN1RVhFQyB3cmFwcGVyIHlvdSBjYW4gY2hlY2sKLXRoZSBjb25maWd1cmF0aW9uIHdpdGggdGhlIC0tbGF5b3V0IG9wdGlvbi4KLTxCUj4KLUV4YW1wbGUgb3V0cHV0OgotPFBSRT4KLSAgICBzdUVYRUMgc2V0dXA6Ci0gICAgICAgICAgICBzdWV4ZWMgYmluYXJ5OiAvdXNyL2xvY2FsL2FwYWNoZS9zYmluL3N1ZXhlYwotICAgICAgICAgICAgZG9jdW1lbnQgcm9vdDogL3Vzci9sb2NhbC9hcGFjaGUvc2hhcmUvaHRkb2NzCi0gICAgICAgICAgIHVzZXJkaXIgc3VmZml4OiBwdWJsaWNfaHRtbAotICAgICAgICAgICAgICAgICAgbG9nZmlsZTogL3Vzci9sb2NhbC9hcGFjaGUvdmFyL2xvZy9zdWV4ZWNfbG9nCi0gICAgICAgICAgICAgICAgc2FmZSBwYXRoOiAvdXNyL2xvY2FsL2JpbjovdXNyL2JpbjovYmluCi0gICAgICAgICAgICAgICAgY2FsbGVyIElEOiB3d3cKLSAgICAgICAgICBtaW5pbXVtIHVzZXIgSUQ6IDEwMAotICAgICAgICAgbWluaW11bSBncm91cCBJRDogMTAwCi08L1BSRT4KLTwvUD4KLQotPFAgQUxJR049IkxFRlQiPgotPFNUUk9ORz5Db21waWxpbmcgYW5kIGluc3RhbGxpbmcgdGhlIHN1RVhFQyB3cmFwcGVyPC9TVFJPTkc+PEJSPgotSWYgeW91IGhhdmUgZW5hYmxlZCB0aGUgc3VFWEVDIGZlYXR1cmUgd2l0aCB0aGUgLS1lbmFibGUtc3VleGVjIG9wdGlvbgotdGhlIHN1ZXhlYyBiaW5hcnkgKHRvZ2V0aGVyIHdpdGggQXBhY2hlIGl0c2VsZikgaXMgYXV0b21hdGljYWxseSBidWlsdAotaWYgeW91IGV4ZWN1dGUgdGhlIGNvbW1hbmQgIm1ha2UiLgotPEJSPgotQWZ0ZXIgYWxsIGNvbXBvbmVudHMgaGF2ZSBiZWVuIGJ1aWx0IHlvdSBjYW4gZXhlY3V0ZSB0aGUgY29tbWFuZAotIm1ha2UgaW5zdGFsbCIgdG8gaW5zdGFsbCB0aGVtLgotVGhlIGJpbmFyeSBpbWFnZSAic3VleGVjIiBpcyBpbnN0YWxsZWQgaW4gdGhlIGRpcmVjdG9yeSBkZWZpbmVkIGJ5Ci10aGUgLS1zYmluZGlyIG9wdGlvbi4gRGVmYXVsdCBsb2NhdGlvbiBpcyAiL3Vzci9sb2NhbC9hcGFjaGUvc2Jpbi9zdWV4ZWMiLgotPEJSPgotUGxlYXNlIG5vdGUgdGhhdCB5b3UgbmVlZCA8U1RST05HPjxFTT5yb290IHByaXZpbGVnZXM8L0VNPjwvU1RST05HPiBmb3IKLXRoZSBpbnN0YWxsYXRpb24gc3RlcC4gSW4gb3JkZXIgZm9yIHRoZSB3cmFwcGVyIHRvIHNldCB0aGUgdXNlciBJRCwgaXQKLW11c3QgYmUgaW5zdGFsbGVkIGFzIG93bmVyIDxDT0RFPjxFTT5yb290PC9FTT48L0NPREU+IGFuZCBtdXN0IGhhdmUgdGhlCi1zZXR1c2VyaWQgZXhlY3V0aW9uIGJpdCBzZXQgZm9yIGZpbGUgbW9kZXMuCi08L1A+Ci0KLTxQIEFMSUdOPSJDRU5URVIiPgotPFNUUk9ORz48QSBIUkVGPSJzdWV4ZWMuaHRtbCI+QkFDSyBUTyBDT05URU5UUzwvQT48L1NUUk9ORz4KLTwvUD4KLQotPEgzPjxBIE5BTUU9ImVuYWJsZSI+RW5hYmxpbmcgJmFtcDsgRGlzYWJsaW5nIHN1RVhFQzwvQT48L0gzPgotPFAgQUxJR049IkxFRlQiPgotVXBvbiBzdGFydHVwIG9mIEFwYWNoZSwgaXQgbG9va3MgZm9yIHRoZSBmaWxlICJzdWV4ZWMiIGluIHRoZSAic2JpbiIKLWRpcmVjdG9yeSAoZGVmYXVsdCBpcyAiL3Vzci9sb2NhbC9hcGFjaGUvc2Jpbi9zdWV4ZWMiKS4KLUlmIEFwYWNoZSBmaW5kcyBhIHByb3Blcmx5IGNvbmZpZ3VyZWQgc3VFWEVDIHdyYXBwZXIsIGl0IHdpbGwgcHJpbnQKLXRoZSBmb2xsb3dpbmcgbWVzc2FnZSB0byB0aGUgZXJyb3IgbG9nOgotPFBSRT4KLSAgICBbbm90aWNlXSBzdUVYRUMgbWVjaGFuaXNtIGVuYWJsZWQgKHdyYXBwZXI6IDxFTT4vcGF0aC90by9zdWV4ZWM8L0VNPikKLTwvUFJFPgotSWYgeW91IGRvbid0IHNlZSB0aGlzIG1lc3NhZ2UgYXQgc2VydmVyIHN0YXJ0dXAsIHRoZSBzZXJ2ZXIgaXMgbW9zdAotbGlrZWx5IG5vdCBmaW5kaW5nIHRoZSB3cmFwcGVyIHByb2dyYW0gd2hlcmUgaXQgZXhwZWN0cyBpdCwgb3IgdGhlCi1leGVjdXRhYmxlIGlzIG5vdCBpbnN0YWxsZWQgPEVNPnNldHVpZCByb290PC9FTT4uCi08QlI+Ci1JZiB5b3Ugd2FudCB0byBlbmFibGUgdGhlIHN1RVhFQyBtZWNoYW5pc20gZm9yIHRoZSBmaXJzdCB0aW1lCi1hbmQgYW4gQXBhY2hlIHNlcnZlciBpcyBhbHJlYWR5IHJ1bm5pbmcgeW91IG11c3Qga2lsbCBhbmQgcmVzdGFydCBBcGFjaGUuCi1SZXN0YXJ0aW5nIGl0IHdpdGggYSBzaW1wbGUgSFVQIG9yIFVTUjEgc2lnbmFsIHdpbGwgbm90IGJlIGVub3VnaC4KLTxCUj4KLUlmIHlvdSB3YW50IHRvIGRpc2FibGUgc3VFWEVDIHlvdSBzaG91bGQga2lsbCBhbmQgcmVzdGFydCBBcGFjaGUgYWZ0ZXIKLXlvdSBoYXZlIHJlbW92ZWQgdGhlICJzdWV4ZWMiIGZpbGUuCi08L1A+Ci0KLTxQIEFMSUdOPSJDRU5URVIiPgotPFNUUk9ORz48QSBIUkVGPSJzdWV4ZWMuaHRtbCI+QkFDSyBUTyBDT05URU5UUzwvQT48L1NUUk9ORz4KLTwvUD4KLQotPEgzPjxBIE5BTUU9InVzYWdlIj5Vc2luZyBzdUVYRUM8L0E+PC9IMz4KLTxQIEFMSUdOPSJMRUZUIj4KLTxTVFJPTkc+VmlydHVhbCBIb3N0czo8L1NUUk9ORz48QlI+Ci1PbmUgd2F5IHRvIHVzZSB0aGUgc3VFWEVDIHdyYXBwZXIgaXMgdGhyb3VnaCB0aGUKLTxBIEhSRUY9Im1vZC9jb3JlLmh0bWwjdXNlciI+VXNlcjwvQT4gYW5kCi08QSBIUkVGPSJtb2QvY29yZS5odG1sI2dyb3VwIj5Hcm91cDwvQT4gZGlyZWN0aXZlcyBpbgotPEEgSFJFRj0ibW9kL2NvcmUuaHRtbCN2aXJ0dWFsaG9zdCI+VmlydHVhbEhvc3Q8L0E+Ci1kZWZpbml0aW9ucy4gQnkgc2V0dGluZyB0aGVzZSBkaXJlY3RpdmVzIHRvIHZhbHVlcyBkaWZmZXJlbnQgZnJvbSB0aGUKLW1haW4gc2VydmVyIHVzZXIgSUQsIGFsbCByZXF1ZXN0cyBmb3IgQ0dJIHJlc291cmNlcyB3aWxsIGJlIGV4ZWN1dGVkIGFzCi10aGUgPEVNPlVzZXI8L0VNPiBhbmQgPEVNPkdyb3VwPC9FTT4gZGVmaW5lZCBmb3IgdGhhdAotPENPREU+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvQ09ERT4uIElmIG9ubHkgb25lIG9yCi1uZWl0aGVyIG9mIHRoZXNlIGRpcmVjdGl2ZXMgYXJlIHNwZWNpZmllZCBmb3IgYQotPENPREU+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvQ09ERT4gdGhlbiB0aGUgbWFpbgotc2VydmVyIHVzZXJpZCBpcyBhc3N1bWVkLgotPFA+Ci08U1RST05HPlVzZXIgZGlyZWN0b3JpZXM6PC9TVFJPTkc+PEJSPgotVGhlIHN1RVhFQyB3cmFwcGVyIGNhbiBhbHNvIGJlIHVzZWQgdG8gZXhlY3V0ZSBDR0kgcHJvZ3JhbXMgYXMKLXRoZSB1c2VyIHRvIHdoaWNoIHRoZSByZXF1ZXN0IGlzIGJlaW5nIGRpcmVjdGVkLiBUaGlzIGlzIGFjY29tcGxpc2hlZCBieQotdXNpbmcgdGhlICI8U1RST05HPjxDT0RFPn48L0NPREU+PC9TVFJPTkc+IiBjaGFyYWN0ZXIgcHJlZml4aW5nIHRoZSB1c2VyCi1JRCBmb3Igd2hvbSBleGVjdXRpb24gaXMgZGVzaXJlZC4KLVRoZSBvbmx5IHJlcXVpcmVtZW50IG5lZWRlZCBmb3IgdGhpcyBmZWF0dXJlIHRvIHdvcmsgaXMgZm9yIENHSQotZXhlY3V0aW9uIHRvIGJlIGVuYWJsZWQgZm9yIHRoZSB1c2VyIGFuZCB0aGF0IHRoZSBzY3JpcHQgbXVzdCBtZWV0IHRoZQotc2NydXRpbnkgb2YgdGhlIDxBIEhSRUY9IiNtb2RlbCI+c2VjdXJpdHkgY2hlY2tzPC9BPiBhYm92ZS4KLQotPFAgQUxJR049IkNFTlRFUiI+Ci08U1RST05HPjxBIEhSRUY9InN1ZXhlYy5odG1sIj5CQUNLIFRPIENPTlRFTlRTPC9BPjwvU1RST05HPgotPC9QPgotCi08SDM+PEEgTkFNRT0iZGVidWciPkRlYnVnZ2luZyBzdUVYRUM8L0E+PC9IMz4KLTxQIEFMSUdOPSJMRUZUIj4KLVRoZSBzdUVYRUMgd3JhcHBlciB3aWxsIHdyaXRlIGxvZyBpbmZvcm1hdGlvbiB0byB0aGUgZmlsZSBkZWZpbmVkCi13aXRoIHRoZSAtLXN1ZXhlYy1sb2dmaWxlIG9wdGlvbiBhcyBpbmRpY2F0ZWQgYWJvdmUuIElmIHlvdSBmZWVsIHlvdSBoYXZlCi1jb25maWd1cmVkIGFuZCBpbnN0YWxsZWQgdGhlIHdyYXBwZXIgcHJvcGVybHksIGhhdmUgYSBsb29rIGF0IHRoaXMgbG9nCi1hbmQgdGhlIGVycm9yX2xvZyBmb3IgdGhlIHNlcnZlciB0byBzZWUgd2hlcmUgeW91IG1heSBoYXZlIGdvbmUgYXN0cmF5LgotPC9QPgotCi08UCBBTElHTj0iQ0VOVEVSIj4KLTxTVFJPTkc+PEEgSFJFRj0ic3VleGVjLmh0bWwiPkJBQ0sgVE8gQ09OVEVOVFM8L0E+PC9TVFJPTkc+Ci08L1A+Ci0KLTxIMz4KLTxBIE5BTUU9ImphYmJlcndvY2siPkJld2FyZSB0aGUgSmFiYmVyd29jazogV2FybmluZ3MgJmFtcDsgRXhhbXBsZXM8L0E+Ci08L0gzPgotPFAgQUxJR049IkxFRlQiPgotPFNUUk9ORz5OT1RFITwvU1RST05HPiAgVGhpcyBzZWN0aW9uIG1heSBub3QgYmUgY29tcGxldGUuICBGb3IgdGhlIGxhdGVzdAotcmV2aXNpb24gb2YgdGhpcyBzZWN0aW9uIG9mIHRoZSBkb2N1bWVudGF0aW9uLCBzZWUgdGhlIEFwYWNoZSBHcm91cCdzCi08QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZG9jcy9zdWV4ZWMuaHRtbCI+T25saW5lIERvY3VtZW50YXRpb248L0E+Ci12ZXJzaW9uLgotPC9QPgotCi08UCBBTElHTj0iTEVGVCI+Ci1UaGVyZSBhcmUgYSBmZXcgcG9pbnRzIG9mIGludGVyZXN0IHJlZ2FyZGluZyB0aGUgd3JhcHBlciB0aGF0IGNhbiBjYXVzZQotbGltaXRhdGlvbnMgb24gc2VydmVyIHNldHVwLiAgUGxlYXNlIHJldmlldyB0aGVzZSBiZWZvcmUgc3VibWl0dGluZyBhbnkKLSJidWdzIiByZWdhcmRpbmcgc3VFWEVDLgotPFVMPgotICAgICAgICA8TEk+PFNUUk9ORz5zdUVYRUMgUG9pbnRzIE9mIEludGVyZXN0PC9TVFJPTkc+PC9MST4KLSAgICAgICAgPExJPkhpZXJhcmNoeSBsaW1pdGF0aW9ucwotICAgICAgICA8QkxPQ0tRVU9URT4KLSAgICAgICAgRm9yIHNlY3VyaXR5IGFuZCBlZmZpY2llbmN5IHJlYXNvbnMsIGFsbCBzdWV4ZWMgcmVxdWVzdHMgbXVzdAotICAgICAgICByZW1haW4gd2l0aGluIGVpdGhlciBhIHRvcC1sZXZlbCBkb2N1bWVudCByb290IGZvciB2aXJ0dWFsCi0gICAgICAgIGhvc3QgcmVxdWVzdHMsIG9yIG9uZSB0b3AtbGV2ZWwgcGVyc29uYWwgZG9jdW1lbnQgcm9vdCBmb3IKLSAgICAgICAgdXNlcmRpciByZXF1ZXN0cy4gIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBmb3VyIFZpcnR1YWxIb3N0cwotICAgICAgICBjb25maWd1cmVkLCB5b3Ugd291bGQgbmVlZCB0byBzdHJ1Y3R1cmUgYWxsIG9mIHlvdXIgVkhvc3RzJwotICAgICAgICBkb2N1bWVudCByb290cyBvZmYgb2Ygb25lIG1haW4gQXBhY2hlIGRvY3VtZW50IGhpZXJhcmNoeSB0bwotICAgICAgICB0YWtlIGFkdmFudGFnZSBvZiBzdUVYRUMgZm9yIFZpcnR1YWxIb3N0cy4gKEV4YW1wbGUgZm9ydGhjb21pbmcuKQotICAgICAgICA8L0JMT0NLUVVPVEU+Ci0gICAgICAgIDwvTEk+Ci0gICAgICAgIDxMST5zdUVYRUMncyBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlCi0gICAgICAgIDxCTE9DS1FVT1RFPgotICAgICAgICBUaGlzIGNhbiBiZSBhIGRhbmdlcm91cyB0aGluZyB0byBjaGFuZ2UuICBNYWtlIGNlcnRhaW4gZXZlcnkKLSAgICAgICAgcGF0aCB5b3UgaW5jbHVkZSBpbiB0aGlzIGRlZmluZSBpcyBhIDxTVFJPTkc+dHJ1c3RlZDwvU1RST05HPgotICAgICAgICBkaXJlY3RvcnkuICBZb3UgZG9uJ3Qgd2FudCB0byBvcGVuIHBlb3BsZSB1cCB0byBoYXZpbmcgc29tZW9uZQotICAgICAgICBmcm9tIGFjcm9zcyB0aGUgd29ybGQgcnVubmluZyBhIHRyb2phbiBob3JzZSBvbiB0aGVtLgotICAgICAgICA8L0JMT0NLUVVPVEU+Ci0gICAgICAgIDwvTEk+Ci0gICAgICAgIDxMST5BbHRlcmluZyB0aGUgc3VFWEVDIGNvZGUKLSAgICAgICAgPEJMT0NLUVVPVEU+Ci0gICAgICAgIEFnYWluLCB0aGlzIGNhbiBjYXVzZSA8U1RST05HPkJpZyBUcm91YmxlPC9TVFJPTkc+IGlmIHlvdSB0cnkKLSAgICAgICAgdGhpcyB3aXRob3V0IGtub3dpbmcgd2hhdCB5b3UgYXJlIGRvaW5nLiAgU3RheSBhd2F5IGZyb20gaXQKLSAgICAgICAgaWYgYXQgYWxsIHBvc3NpYmxlLgotICAgICAgICA8L0JMT0NLUVVPVEU+Ci0gICAgICAgIDwvTEk+Ci08L1VMPgotCi08UCBBTElHTj0iQ0VOVEVSIj4KLTxTVFJPTkc+PEEgSFJFRj0ic3VleGVjLmh0bWwiPkJBQ0sgVE8gQ09OVEVOVFM8L0E+PC9TVFJPTkc+Ci08L1A+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC92aG9zdHMvZGV0YWlscy5odG1sIGIvZG9jcy9tYW51YWwvdmhvc3RzL2RldGFpbHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE0YmQwOC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC92aG9zdHMvZGV0YWlscy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPjxIRUFEPgotPFRJVExFPkFuIEluLURlcHRoIERpc2N1c3Npb24gb2YgVmlydHVhbCBIb3N0IE1hdGNoaW5nPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+QW4gSW4tRGVwdGggRGlzY3Vzc2lvbiBvZiBWaXJ0dWFsIEhvc3QgTWF0Y2hpbmc8L0gxPgotCi08UD5UaGUgdmlydHVhbCBob3N0IGNvZGUgd2FzIGNvbXBsZXRlbHkgcmV3cml0dGVuIGluCi08U1RST05HPkFwYWNoZSAxLjM8L1NUUk9ORz4uCi1UaGlzIGRvY3VtZW50IGF0dGVtcHRzIHRvIGV4cGxhaW4gZXhhY3RseSB3aGF0IEFwYWNoZSBkb2VzIHdoZW4KLWRlY2lkaW5nIHdoYXQgdmlydHVhbCBob3N0IHRvIHNlcnZlIGEgaGl0IGZyb20uIFdpdGggdGhlIGhlbHAgb2YgdGhlCi1uZXcgPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNuYW1ldmlydHVhbGhvc3QiPjxTQU1QPk5hbWVWaXJ0dWFsSG9zdDwvU0FNUD48L0E+Ci1kaXJlY3RpdmUgIHZpcnR1YWwgaG9zdCBjb25maWd1cmF0aW9uIHNob3VsZCBiZSBhIGxvdCBlYXNpZXIgYW5kIHNhZmVyCi10aGFuIHdpdGggdmVyc2lvbnMgcHJpb3IgdG8gMS4zLgotCi08UD5JZiB5b3UganVzdCB3YW50IHRvIDxDSVRFPm1ha2UgaXQgd29yazwvQ0lURT4gd2l0aG91dCB1bmRlcnN0YW5kaW5nCi1ob3csIGhlcmUgYXJlIDxBIEhSRUY9ImV4YW1wbGVzLmh0bWwiPnNvbWUgZXhhbXBsZXM8L0E+LgotCi08SDM+Q29uZmlnIEZpbGUgUGFyc2luZzwvSDM+Ci0KLTxQPlRoZXJlIGlzIGEgPEVNPm1haW5fc2VydmVyPC9FTT4gd2hpY2ggY29uc2lzdHMgb2YgYWxsCi10aGUgZGVmaW5pdGlvbnMgYXBwZWFyaW5nIG91dHNpZGUgb2YgPENPREU+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvQ09ERT4gc2VjdGlvbnMuCi1UaGVyZSBhcmUgdmlydHVhbCBzZXJ2ZXJzLCBjYWxsZWQgPEVNPnZob3N0czwvRU0+LCB3aGljaCBhcmUgZGVmaW5lZCBieQotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCN2aXJ0dWFsaG9zdCI+PFNBTVA+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvU0FNUD48L0E+Ci1zZWN0aW9ucy4KLQotPFA+VGhlIGRpcmVjdGl2ZXMKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjcG9ydCI+PFNBTVA+UG9ydDwvU0FNUD48L0E+LAotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNzZXJ2ZXJuYW1lIj48U0FNUD5TZXJ2ZXJOYW1lPC9TQU1QPjwvQT4sCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcnBhdGgiPjxTQU1QPlNlcnZlclBhdGg8L1NBTVA+PC9BPiwKLWFuZAotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNzZXJ2ZXJhbGlhcyI+PFNBTVA+U2VydmVyQWxpYXM8L1NBTVA+PC9BPgotY2FuIGFwcGVhciBhbnl3aGVyZSB3aXRoaW4gdGhlIGRlZmluaXRpb24gb2YKLWEgc2VydmVyLiAgSG93ZXZlciwgZWFjaCBhcHBlYXJhbmNlIG92ZXJyaWRlcyB0aGUgcHJldmlvdXMgYXBwZWFyYW5jZQotKHdpdGhpbiB0aGF0IHNlcnZlcikuCi0KLTxQPlRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSA8Q09ERT5Qb3J0PC9DT0RFPiBmaWVsZCBmb3IgbWFpbl9zZXJ2ZXIKLWlzIDgwLiAgVGhlIG1haW5fc2VydmVyIGhhcyBubyBkZWZhdWx0IDxDT0RFPlNlcnZlclBhdGg8L0NPREU+LCBvcgotPENPREU+U2VydmVyQWxpYXM8L0NPREU+LiBUaGUgZGVmYXVsdCA8Q09ERT5TZXJ2ZXJOYW1lPC9DT0RFPiBpcwotZGVkdWNlZCBmcm9tIHRoZSBzZXJ2ZXJzIElQIGFkZHJlc3MuCi0KLTxQPlRoZSBtYWluX3NlcnZlciBQb3J0IGRpcmVjdGl2ZSBoYXMgdHdvIGZ1bmN0aW9ucyBkdWUgdG8gbGVnYWN5Ci1jb21wYXRpYmlsaXR5IHdpdGggTkNTQSBjb25maWd1cmF0aW9uIGZpbGVzLiAgT25lIGZ1bmN0aW9uIGlzCi10byBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgbmV0d29yayBwb3J0IEFwYWNoZSB3aWxsIGJpbmQgdG8uICBUaGlzCi1kZWZhdWx0IGlzIG92ZXJyaWRkZW4gYnkgdGhlIGV4aXN0ZW5jZSBvZiBhbnkKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjbGlzdGVuIj48Q09ERT5MaXN0ZW48L0NPREU+PC9BPiBkaXJlY3RpdmVzLgotVGhlIHNlY29uZCBmdW5jdGlvbiBpcyB0byBzcGVjaWZ5IHRoZSBwb3J0IG51bWJlciB3aGljaCBpcyB1c2VkCi1pbiBhYnNvbHV0ZSBVUklzIGR1cmluZyByZWRpcmVjdHMuCi0KLTxQPlVubGlrZSB0aGUgbWFpbl9zZXJ2ZXIsIHZob3N0IHBvcnRzIDxFTT5kbyBub3Q8L0VNPiBhZmZlY3Qgd2hhdAotcG9ydHMgQXBhY2hlIGxpc3RlbnMgZm9yIGNvbm5lY3Rpb25zIG9uLgotCi08UD5FYWNoIGFkZHJlc3MgYXBwZWFyaW5nIGluIHRoZSA8Q09ERT5WaXJ0dWFsSG9zdDwvQ09ERT4gZGlyZWN0aXZlCi1jYW4gaGF2ZSBhbiBvcHRpb25hbCBwb3J0LiAgSWYgdGhlIHBvcnQgaXMgdW5zcGVjaWZpZWQgaXQgZGVmYXVsdHMgdG8KLXRoZSB2YWx1ZSBvZiB0aGUgbWFpbl9zZXJ2ZXIncyBtb3N0IHJlY2VudCA8Q09ERT5Qb3J0PC9DT0RFPiBzdGF0ZW1lbnQuCi1UaGUgc3BlY2lhbCBwb3J0IDxTQU1QPio8L1NBTVA+IGluZGljYXRlcyBhIHdpbGRjYXJkIHRoYXQgbWF0Y2hlcyBhbnkgcG9ydC4KLUNvbGxlY3RpdmVseSB0aGUgZW50aXJlIHNldCBvZiBhZGRyZXNzZXMgKGluY2x1ZGluZyBtdWx0aXBsZQotPFNBTVA+QTwvU0FNUD4gcmVjb3JkCi1yZXN1bHRzIGZyb20gRE5TIGxvb2t1cHMpIGFyZSBjYWxsZWQgdGhlIHZob3N0J3MgPEVNPmFkZHJlc3Mgc2V0PC9FTT4uCi0KLTxQPlVubGVzcyBhIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjbmFtZXZpcnR1YWxob3N0Ij5OYW1lVmlydHVhbEhvc3Q8L0E+Ci1kaXJlY3RpdmUgaXMgdXNlZCBmb3IgYSBzcGVjaWZpYyBJUCBhZGRyZXNzIHRoZSBmaXJzdCB2aG9zdCB3aXRoCi10aGF0IGFkZHJlc3MgaXMgdHJlYXRlZCBhcyBhbiBJUC1iYXNlZCB2aG9zdC4KLQotPFA+SWYgbmFtZS1iYXNlZCB2aG9zdHMgc2hvdWxkIGJlIHVzZWQgYSA8Q09ERT5OYW1lVmlydHVhbEhvc3Q8L0NPREU+Ci1kaXJlY3RpdmUgPEVNPm11c3Q8L0VNPiBhcHBlYXIgd2l0aCB0aGUgSVAgYWRkcmVzcyBzZXQgdG8gYmUgdXNlZCBmb3IgdGhlCi1uYW1lLWJhc2VkIHZob3N0cy4gSW4gb3RoZXIgd29yZHMsIHlvdSBtdXN0IHNwZWNpZnkgdGhlIElQIGFkZHJlc3MgdGhhdAotaG9sZHMgdGhlIGhvc3RuYW1lIGFsaWFzZXMgKENOQU1FcykgZm9yIHlvdXIgbmFtZS1iYXNlZCB2aG9zdHMgdmlhIGEKLTxDT0RFPk5hbWVWaXJ0dWFsSG9zdDwvQ09ERT4gZGlyZWN0aXZlIGluIHlvdXIgY29uZmlndXJhdGlvbiBmaWxlLgotCi08UD5NdWx0aXBsZSA8Q09ERT5OYW1lVmlydHVhbEhvc3Q8L0NPREU+IGRpcmVjdGl2ZXMgY2FuIGJlIHVzZWQgZWFjaAotd2l0aCBhIHNldCBvZiA8Q09ERT5WaXJ0dWFsSG9zdDwvQ09ERT4gZGlyZWN0aXZlcyBidXQgb25seSBvbmUKLTxDT0RFPk5hbWVWaXJ0dWFsSG9zdDwvQ09ERT4gZGlyZWN0aXZlIHNob3VsZCBiZSB1c2VkIGZvciBlYWNoCi1zcGVjaWZpYyBJUDpwb3J0IHBhaXIuCi0KLTxQPlRoZSBvcmRlcmluZyBvZiA8Q09ERT5OYW1lVmlydHVhbEhvc3Q8L0NPREU+IGFuZCAKLTxDT0RFPlZpcnR1YWxIb3N0PC9DT0RFPiBkaXJlY3RpdmVzIGlzIG5vdCBpbXBvcnRhbnQgd2hpY2ggbWFrZXMgdGhlCi1mb2xsb3dpbmcgdHdvIGV4YW1wbGVzIGlkZW50aWNhbCAob25seSB0aGUgb3JkZXIgb2YgdGhlCi08Q09ERT5WaXJ0dWFsSG9zdDwvQ09ERT4gZGlyZWN0aXZlcyBmb3IgPEVNPm9uZTwvRU0+IGFkZHJlc3Mgc2V0Ci1pcyBpbXBvcnRhbnQsIHNlZSBiZWxvdyk6Ci0KLTxQUkU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgTmFtZVZpcnR1YWxIb3N0IDExMS4yMi4zMy40NCAgfCAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0Jmd0OwotICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0Jmd0OyAgICB8ICMgc2VydmVyIEEKLSAgIyBzZXJ2ZXIgQSAgCQkgICAgICAgIHwgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLSAgLi4uIAkJCSAgICAgICAgfCAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjU1Jmd0OwotICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwkgICAgICAgIHwgIyBzZXJ2ZXIgQwotICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0Jmd0OyAgICB8IC4uLgotICAjIHNlcnZlciBCICAJCSAgICAgICAgfCAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotICAuLi4gCQkJICAgICAgICB8ICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQmZ3Q7Ci0gICZsdDsvVmlydHVhbEhvc3QmZ3Q7CSAgICAgICAgfCAjIHNlcnZlciBCCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgLi4uCi0gIE5hbWVWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNTUgIHwgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLSAgJmx0O1ZpcnR1YWxIb3N0IDExMS4yMi4zMy41NSZndDsgICAgfCAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjU1Jmd0OwotICAjIHNlcnZlciBDICAJCSAgICAgICAgfCAjIHNlcnZlciBECi0gIC4uLiAJCQkgICAgICAgIHwgLi4uCi0gICZsdDsvVmlydHVhbEhvc3QmZ3Q7CSAgICAgICAgfCAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjU1Jmd0OyAgICB8Ci0gICMgc2VydmVyIEQgIAkJICAgICAgICB8IE5hbWVWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQKLSAgLi4uIAkJCSAgICAgICAgfCBOYW1lVmlydHVhbEhvc3QgMTExLjIyLjMzLjU1Ci0gICZsdDsvVmlydHVhbEhvc3QmZ3Q7CSAgICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci08L1BSRT4KLQotPFA+KFRvIGFpZCB0aGUgcmVhZGFiaWxpdHkgb2YgeW91ciBjb25maWd1cmF0aW9uIHlvdSBzaG91bGQgcHJlZmVyIHRoZQotbGVmdCB2YXJpYW50LikKLQotPFA+IEFmdGVyIHBhcnNpbmcgdGhlIDxDT0RFPlZpcnR1YWxIb3N0PC9DT0RFPiBkaXJlY3RpdmUsIHRoZSB2aG9zdCBzZXJ2ZXIKLWlzIGdpdmVuIGEgZGVmYXVsdCA8Q09ERT5Qb3J0PC9DT0RFPiBlcXVhbCB0byB0aGUgcG9ydCBhc3NpZ25lZCB0byB0aGUKLWZpcnN0IG5hbWUgaW4gaXRzIDxDT0RFPlZpcnR1YWxIb3N0PC9DT0RFPiBkaXJlY3RpdmUuCi0KLTxQPlRoZSBjb21wbGV0ZSBsaXN0IG9mIG5hbWVzIGluIHRoZSA8Q09ERT5WaXJ0dWFsSG9zdDwvQ09ERT4gZGlyZWN0aXZlCi1hcmUgdHJlYXRlZCBqdXN0IGxpa2UgYSA8Q09ERT5TZXJ2ZXJBbGlhczwvQ09ERT4gKGJ1dCBhcmUgbm90IG92ZXJyaWRkZW4gYnkgYW55Ci08Q09ERT5TZXJ2ZXJBbGlhczwvQ09ERT4gc3RhdGVtZW50KSBpZiBhbGwgbmFtZXMgcmVzb2x2ZSB0byB0aGUgc2FtZSBhZGRyZXNzCi1zZXQuICBOb3RlIHRoYXQgc3Vic2VxdWVudCA8Q09ERT5Qb3J0PC9DT0RFPiBzdGF0ZW1lbnRzIGZvciB0aGlzIHZob3N0IHdpbGwgbm90Ci1hZmZlY3QgdGhlIHBvcnRzIGFzc2lnbmVkIGluIHRoZSBhZGRyZXNzIHNldC4KLQotPFA+RHVyaW5nIGluaXRpYWxpemF0aW9uIGEgbGlzdCBmb3IgZWFjaCBJUCBhZGRyZXNzCi1pcyBnZW5lcmF0ZWQgYW5kIGluc2VydGVkIGludG8gYW4gaGFzaCB0YWJsZS4gSWYgdGhlIElQIGFkZHJlc3MgaXMKLXVzZWQgaW4gYSA8Q09ERT5OYW1lVmlydHVhbEhvc3Q8L0NPREU+IGRpcmVjdGl2ZSB0aGUgbGlzdCBjb250YWlucwotYWxsIG5hbWUtYmFzZWQgdmhvc3RzIGZvciB0aGUgZ2l2ZW4gSVAgYWRkcmVzcy4gSWYgdGhlcmUgYXJlIG5vCi12aG9zdHMgZGVmaW5lZCBmb3IgdGhhdCBhZGRyZXNzIHRoZSA8Q09ERT5OYW1lVmlydHVhbEhvc3Q8L0NPREU+IGRpcmVjdGl2ZQotaXMgaWdub3JlZCBhbmQgYW4gZXJyb3IgaXMgbG9nZ2VkLiBGb3IgYW4gSVAtYmFzZWQgdmhvc3QgdGhlIGxpc3QgaW4gdGhlCi1oYXNoIHRhYmxlIGlzIGVtcHR5LgotCi08UD5EdWUgdG8gYSBmYXN0IGhhc2hpbmcgZnVuY3Rpb24gdGhlIG92ZXJoZWFkIG9mIGhhc2hpbmcgYW4gSVAgYWRkcmVzcwotZHVyaW5nIGEgcmVxdWVzdCBpcyBtaW5pbWFsIGFuZCBhbG1vc3Qgbm90IGV4aXN0ZW50LiBBZGRpdGlvbmFsbHkKLXRoZSB0YWJsZSBpcyBvcHRpbWl6ZWQgZm9yIElQIGFkZHJlc3NlcyB3aGljaCB2YXJ5IGluIHRoZSBsYXN0IG9jdGV0LgotCi08UD5Gb3IgZXZlcnkgdmhvc3QgdmFyaW91cyBkZWZhdWx0IHZhbHVlcyBhcmUgc2V0LiBJbiBwYXJ0aWN1bGFyOgotCi08T0w+Ci08TEk+SWYgYSB2aG9zdCBoYXMgbm8KLSAgICA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcmFkbWluIj48Q09ERT5TZXJ2ZXJBZG1pbjwvQ09ERT48L0E+LAotICAgIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjcmVzb3VyY2Vjb25maWciPjxDT0RFPlJlc291cmNlQ29uZmlnPC9DT0RFPjwvQT4sCi0gICAgPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNhY2Nlc3Njb25maWciPjxDT0RFPkFjY2Vzc0NvbmZpZzwvQ09ERT48L0E+LAotICAgIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjdGltZW91dCI+PENPREU+VGltZW91dDwvQ09ERT48L0E+LAotICAgIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwja2VlcGFsaXZldGltZW91dCIKLSAgICA+PENPREU+S2VlcEFsaXZlVGltZW91dDwvQ09ERT48L0E+LAotICAgIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwja2VlcGFsaXZlIj48Q09ERT5LZWVwQWxpdmU8L0NPREU+PC9BPiwKLSAgICA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI21heGtlZXBhbGl2ZXJlcXVlc3RzIgotICAgID48Q09ERT5NYXhLZWVwQWxpdmVSZXF1ZXN0czwvQ09ERT48L0E+LAotICAgIG9yCi0gICAgPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNzZW5kYnVmZmVyc2l6ZSI+PENPREU+U2VuZEJ1ZmZlclNpemU8L0NPREU+PC9BPgotICAgIGRpcmVjdGl2ZSB0aGVuIHRoZSByZXNwZWN0aXZlIHZhbHVlIGlzCi0gICAgaW5oZXJpdGVkIGZyb20gdGhlIG1haW5fc2VydmVyLiAgKFRoYXQgaXMsIGluaGVyaXRlZCBmcm9tIHdoYXRldmVyCi0gICAgdGhlIGZpbmFsIHNldHRpbmcgb2YgdGhhdCB2YWx1ZSBpcyBpbiB0aGUgbWFpbl9zZXJ2ZXIuKQotCi08TEk+VGhlICZxdW90O2xvb2t1cCBkZWZhdWx0cyZxdW90OyB0aGF0IGRlZmluZSB0aGUgZGVmYXVsdCBkaXJlY3RvcnkKLSAgICBwZXJtaXNzaW9ucwotICAgIGZvciBhIHZob3N0IGFyZSBtZXJnZWQgd2l0aCB0aG9zZSBvZiB0aGUgbWFpbl9zZXJ2ZXIuICBUaGlzIGluY2x1ZGVzCi0gICAgYW55IHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYW55IG1vZHVsZS4KLQotPExJPlRoZSBwZXItc2VydmVyIGNvbmZpZ3MgZm9yIGVhY2ggbW9kdWxlIGZyb20gdGhlIG1haW5fc2VydmVyIGFyZQotICAgIG1lcmdlZCBpbnRvIHRoZSB2aG9zdCBzZXJ2ZXIuCi08L09MPgotCi1Fc3NlbnRpYWxseSwgdGhlIG1haW5fc2VydmVyIGlzIHRyZWF0ZWQgYXMgJnF1b3Q7ZGVmYXVsdHMmcXVvdDsgb3IgYQotJnF1b3Q7YmFzZSZxdW90OyBvbiB3aGljaCB0byBidWlsZCBlYWNoIHZob3N0LgotQnV0IHRoZSBwb3NpdGlvbmluZyBvZiB0aGVzZSBtYWluX3NlcnZlcgotZGVmaW5pdGlvbnMgaW4gdGhlIGNvbmZpZyBmaWxlIGlzIGxhcmdlbHkgaXJyZWxldmFudCAtLSB0aGUgZW50aXJlCi1jb25maWcgb2YgdGhlIG1haW5fc2VydmVyIGhhcyBiZWVuIHBhcnNlZCB3aGVuIHRoaXMgZmluYWwgbWVyZ2luZyBvY2N1cnMuCi1TbyBldmVuIGlmIGEgbWFpbl9zZXJ2ZXIgZGVmaW5pdGlvbiBhcHBlYXJzIGFmdGVyIGEgdmhvc3QgZGVmaW5pdGlvbgotaXQgbWlnaHQgYWZmZWN0IHRoZSB2aG9zdCBkZWZpbml0aW9uLgotCi08UD4gSWYgdGhlIG1haW5fc2VydmVyIGhhcyBubyA8Q09ERT5TZXJ2ZXJOYW1lPC9DT0RFPiBhdCB0aGlzIHBvaW50LAotdGhlbiB0aGUgaG9zdG5hbWUgb2YgdGhlIG1hY2hpbmUgdGhhdCBodHRwZCBpcyBydW5uaW5nIG9uIGlzIHVzZWQKLWluc3RlYWQuICBXZSB3aWxsIGNhbGwgdGhlIDxFTT5tYWluX3NlcnZlciBhZGRyZXNzIHNldDwvRU0+IHRob3NlIElQCi1hZGRyZXNzZXMgcmV0dXJuZWQgYnkgYSBETlMgbG9va3VwIG9uIHRoZSA8Q09ERT5TZXJ2ZXJOYW1lPC9DT0RFPiBvZgotdGhlIG1haW5fc2VydmVyLgotCi08UD4gRm9yIGFueSB1bmRlZmluZWQgPENPREU+U2VydmVyTmFtZTwvQ09ERT4gZmllbGRzLCBhIG5hbWUtYmFzZWQgdmhvc3QKLWRlZmF1bHRzIHRvIHRoZSBhZGRyZXNzIGdpdmVuIGZpcnN0IGluIHRoZSA8Q09ERT5WaXJ0dWFsSG9zdDwvQ09ERT4KLXN0YXRlbWVudCBkZWZpbmluZyB0aGUgdmhvc3QuCi0KLTxQPkFueSB2aG9zdCB0aGF0IGluY2x1ZGVzIHRoZSBtYWdpYyA8U0FNUD5fZGVmYXVsdF88L1NBTVA+IHdpbGRjYXJkCi1pcyBnaXZlbiB0aGUgc2FtZSA8Q09ERT5TZXJ2ZXJOYW1lPC9DT0RFPiBhcyB0aGUgbWFpbl9zZXJ2ZXIuCi0KLQotPEgzPlZpcnR1YWwgSG9zdCBNYXRjaGluZzwvSDM+Ci0KLTxQPlRoZSBzZXJ2ZXIgZGV0ZXJtaW5lcyB3aGljaCB2aG9zdCB0byB1c2UgZm9yIGEgcmVxdWVzdCBhcyBmb2xsb3dzOgotCi08SDQ+SGFzaCB0YWJsZSBsb29rdXA8L0g0PgotCi08UD5XaGVuIHRoZSBjb25uZWN0aW9uIGlzIGZpcnN0IG1hZGUgYnkgYSBjbGllbnQsIHRoZSBJUCBhZGRyZXNzIHRvCi13aGljaCB0aGUgY2xpZW50IGNvbm5lY3RlZCBpcyBsb29rZWQgdXAgaW4gdGhlIGludGVybmFsIElQIGhhc2ggdGFibGUuCi0KLTxQPklmIHRoZSBsb29rdXAgZmFpbHMgKHRoZSBJUCBhZGRyZXNzIHdhc24ndCBmb3VuZCkgdGhlIHJlcXVlc3QgaXMKLXNlcnZlZCBmcm9tIHRoZSA8U0FNUD5fZGVmYXVsdF88L1NBTVA+IHZob3N0IGlmIHRoZXJlIGlzIHN1Y2ggYSB2aG9zdAotZm9yIHRoZSBwb3J0IHRvIHdoaWNoIHRoZSBjbGllbnQgc2VudCB0aGUgcmVxdWVzdC4gSWYgdGhlcmUgaXMgbm8KLW1hdGNoaW5nIDxTQU1QPl9kZWZhdWx0XzwvU0FNUD4gdmhvc3QgdGhlIHJlcXVlc3QgaXMgc2VydmVkIGZyb20gdGhlCi1tYWluX3NlcnZlci4KLQotPFA+SWYgdGhlIGxvb2t1cCBzdWNjZWVkZWQgKGEgY29ycmVzcG9uZGluZyBsaXN0IGZvciB0aGUgSVAgYWRkcmVzcyB3YXMKLWZvdW5kKSB0aGUgbmV4dCBzdGVwIGlzIHRvIGRlY2lkZSBpZiB3ZSBoYXZlIHRvIGRlYWwgd2l0aCBhbiBJUC1iYXNlZAotb3IgYSBuYW1lLWJhc2Ugdmhvc3QuCi0KLTxIND5JUC1iYXNlZCB2aG9zdDwvSDQ+Ci0KLTxQPklmIHRoZSBlbnRyeSB3ZSBmb3VuZCBoYXMgYW4gZW1wdHkgbmFtZSBsaXN0IHRoZW4gd2UgaGF2ZSBmb3VuZCBhbgotSVAtYmFzZWQgdmhvc3QsIG5vIGZ1cnRoZXIgYWN0aW9ucyBhcmUgcGVyZm9ybWVkIGFuZCB0aGUgcmVxdWVzdCBpcwotc2VydmVkIGZyb20gdGhhdCB2aG9zdC4KLQotPEg0Pk5hbWUtYmFzZWQgdmhvc3Q8L0g0PgotCi08UD5JZiB0aGUgZW50cnkgY29ycmVzcG9uZHMgdG8gYSBuYW1lLWJhc2VkIHZob3N0IHRoZSBuYW1lIGxpc3QgY29udGFpbnMKLW9uZSBvciBtb3JlIHZob3N0IHN0cnVjdHVyZXMuIFRoaXMgbGlzdCBjb250YWlucyB0aGUgdmhvc3RzIGluIHRoZSBzYW1lCi1vcmRlciBhcyB0aGUgPENPREU+VmlydHVhbEhvc3Q8L0NPREU+IGRpcmVjdGl2ZXMgYXBwZWFyIGluIHRoZSBjb25maWcKLWZpbGUuCi0KLTxQPlRoZSBmaXJzdCB2aG9zdCBvbiB0aGlzIGxpc3QgKHRoZSBmaXJzdCB2aG9zdCBpbiB0aGUgY29uZmlnIGZpbGUgd2l0aAotdGhlIHNwZWNpZmllZCBJUCBhZGRyZXNzKSBoYXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgYW5kIGNhdGNoZXMgYW55IHJlcXVlc3QKLXRvIGFuIHVua25vd24gc2VydmVyIG5hbWUgb3IgYSByZXF1ZXN0IHdpdGhvdXQgYSA8Q09ERT5Ib3N0OjwvQ09ERT4KLWhlYWRlciBmaWVsZC4KLQotPFA+SWYgdGhlIGNsaWVudCBwcm92aWRlZCBhIDxDT0RFPkhvc3Q6PC9DT0RFPiBoZWFkZXIgZmllbGQgdGhlIGxpc3QgaXMKLXNlYXJjaGVkIGZvciBhIG1hdGNoaW5nIHZob3N0IGFuZCB0aGUgZmlyc3QgaGl0IG9uIGEgPENPREU+U2VydmVyTmFtZTwvQ09ERT4KLW9yIDxDT0RFPlNlcnZlckFsaWFzPC9DT0RFPiBpcyB0YWtlbiBhbmQgdGhlIHJlcXVlc3QgaXMgc2VydmVkIGZyb20KLXRoYXQgdmhvc3QuIEEgPENPREU+SG9zdDo8L0NPREU+IGhlYWRlciBmaWVsZCBjYW4gY29udGFpbiBhIHBvcnQgbnVtYmVyLCBidXQKLUFwYWNoZSBhbHdheXMgbWF0Y2hlcyBhZ2FpbnN0IHRoZSByZWFsIHBvcnQgdG8gd2hpY2ggdGhlIGNsaWVudCBzZW50Ci10aGUgcmVxdWVzdC4KLQotPFA+SWYgdGhlIGNsaWVudCBzdWJtaXR0ZWQgYSBIVFRQLzEuMCByZXF1ZXN0IHdpdGhvdXQgPENPREU+SG9zdDo8L0NPREU+Ci1oZWFkZXIgZmllbGQgd2UgZG9uJ3Qga25vdyB0byB3aGF0IHNlcnZlciB0aGUgY2xpZW50IHRyaWVkIHRvIGNvbm5lY3QgYW5kCi1hbnkgZXhpc3RpbmcgPENPREU+U2VydmVyUGF0aDwvQ09ERT4gaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBVUkkKLWZyb20gdGhlIHJlcXVlc3QuIFRoZSBmaXJzdCBtYXRjaGluZyBwYXRoIG9uIHRoZSBsaXN0IGlzIHVzZWQgYW5kIHRoZQotcmVxdWVzdCBpcyBzZXJ2ZWQgZnJvbSB0aGF0IHZob3N0LgotCi08UD5JZiBubyBtYXRjaGluZyB2aG9zdCBjb3VsZCBiZSBmb3VuZCB0aGUgcmVxdWVzdCBpcyBzZXJ2ZWQgZnJvbSB0aGUKLWZpcnN0IHZob3N0IHdpdGggYSBtYXRjaGluZyBwb3J0IG51bWJlciB0aGF0IGlzIG9uIHRoZSBsaXN0IGZvciB0aGUgSVAKLXRvIHdoaWNoIHRoZSBjbGllbnQgY29ubmVjdGVkIChhcyBhbHJlYWR5IG1lbnRpb25lZCBiZWZvcmUpLgotCi08SDQ+UGVyc2lzdGVudCBjb25uZWN0aW9uczwvSDQ+Ci1UaGUgSVAgbG9va3VwIGRlc2NyaWJlZCBhYm92ZSBpcyBvbmx5IGRvbmUgPEVNPm9uY2U8L0VNPiBmb3IgYSBwYXJ0aWN1bGFyCi1UQ1AvSVAgc2Vzc2lvbiB3aGlsZSB0aGUgbmFtZSBsb29rdXAgaXMgZG9uZSBvbiA8RU0+ZXZlcnk8L0VNPiByZXF1ZXN0Ci1kdXJpbmcgYSBLZWVwQWxpdmUvcGVyc2lzdGVudCBjb25uZWN0aW9uLiBJbiBvdGhlciB3b3JkcyBhIGNsaWVudCBtYXkKLXJlcXVlc3QgcGFnZXMgZnJvbSBkaWZmZXJlbnQgbmFtZS1iYXNlZCB2aG9zdHMgZHVyaW5nIGEgc2luZ2xlCi1wZXJzaXN0ZW50IGNvbm5lY3Rpb24uCi0KLQotPEg0PkFic29sdXRlIFVSSTwvSDQ+Ci0KLTxQPklmIHRoZSBVUkkgZnJvbSB0aGUgcmVxdWVzdCBpcyBhbiBhYnNvbHV0ZSBVUkksIGFuZCBpdHMgaG9zdG5hbWUgYW5kCi1wb3J0IG1hdGNoIHRoZSBtYWluIHNlcnZlciBvciBvbmUgb2YgdGhlIGNvbmZpZ3VyZWQgdmlydHVhbCBob3N0cwotPEVNPmFuZDwvRU0+IG1hdGNoIHRoZSBhZGRyZXNzIGFuZCBwb3J0IHRvIHdoaWNoIHRoZSBjbGllbnQgc2VudCB0aGUgcmVxdWVzdCwKLXRoZW4gdGhlIHNjaGVtZS9ob3N0bmFtZS9wb3J0IHByZWZpeCBpcyBzdHJpcHBlZCBvZmYgYW5kIHRoZSByZW1haW5pbmcKLXJlbGF0aXZlIFVSSSBpcyBzZXJ2ZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgbWFpbiBzZXJ2ZXIgb3IgdmlydHVhbCBob3N0LgotSWYgaXQgZG9lcyBub3QgbWF0Y2gsIHRoZW4gdGhlIFVSSSByZW1haW5zIHVudG91Y2hlZCBhbmQgdGhlIHJlcXVlc3QgaXMKLXRha2VuIHRvIGJlIGEgcHJveHkgcmVxdWVzdC4KLQotCi08SDM+T2JzZXJ2YXRpb25zPC9IMz4KLQotPFVMPgotCi08TEk+QSBuYW1lLWJhc2VkIHZob3N0IGNhbiBuZXZlciBpbnRlcmZlcmUgd2l0aCBhbiBJUC1iYXNlIHZob3N0IGFuZAotICAgIHZpY2UgdmVyc2EuIElQLWJhc2VkIHZob3N0cyBjYW4gb25seSBiZSByZWFjaGVkIHRocm91Z2ggYW4gSVAgYWRkcmVzcwotICAgIG9mIGl0cyBvd24gYWRkcmVzcyBzZXQgYW5kIG5ldmVyIHRocm91Z2ggYW55IG90aGVyIGFkZHJlc3MuCi0gICAgVGhlIHNhbWUgYXBwbGllcyB0byBuYW1lLWJhc2VkIHZob3N0cywgdGhleSBjYW4gb25seSBiZSByZWFjaGVkCi0gICAgdGhyb3VnaCBhbiBJUCBhZGRyZXNzIG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkZHJlc3Mgc2V0IHdoaWNoIG11c3QKLSAgICBiZSBkZWZpbmVkIHdpdGggYSA8Q09ERT5OYW1lVmlydHVhbEhvc3Q8L0NPREU+IGRpcmVjdGl2ZS4KLSAgICA8UD4KLQotPExJPjxDT0RFPlNlcnZlckFsaWFzPC9DT0RFPiBhbmQgPENPREU+U2VydmVyUGF0aDwvQ09ERT4gY2hlY2tzIGFyZSBuZXZlcgotICAgIHBlcmZvcm1lZCBmb3IgYW4gSVAtYmFzZWQgdmhvc3QuCi0gICAgPFA+Ci0gICAgCi08TEk+VGhlIG9yZGVyIG9mIG5hbWUtL0lQLWJhc2VkLCB0aGUgPFNBTVA+X2RlZmF1bHRfPC9TQU1QPgotICAgIHZob3N0IGFuZCB0aGUgPENPREU+TmFtZVZpcnR1YWxIb3N0PC9DT0RFPiBkaXJlY3RpdmUgd2l0aGluIHRoZSBjb25maWcKLSAgICBmaWxlIGlzIG5vdCBpbXBvcnRhbnQuIE9ubHkgdGhlIG9yZGVyaW5nCi0gICAgb2YgbmFtZS1iYXNlZCB2aG9zdHMgZm9yIGEgc3BlY2lmaWMgYWRkcmVzcyBzZXQgaXMgc2lnbmlmaWNhbnQuIFRoZSBvbmUKLSAgICBuYW1lLWJhc2VkIHZob3N0cyB0aGF0IGNvbWVzIGZpcnN0IGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaGFzCi0gICAgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgZm9yIGl0cyBjb3JyZXNwb25kaW5nIGFkZHJlc3Mgc2V0LgotICAgIDxQPgotCi08TEk+Rm9yIHNlY3VyaXR5IHJlYXNvbnMgdGhlIHBvcnQgbnVtYmVyIGdpdmVuIGluIGEgPENPREU+SG9zdDo8L0NPREU+Ci0gICAgaGVhZGVyIGZpZWxkIGlzIG5ldmVyIHVzZWQgZHVyaW5nIHRoZSBtYXRjaGluZyBwcm9jZXNzLiBBcGFjaGUgYWx3YXlzCi0gICAgdXNlcyB0aGUgcmVhbCBwb3J0IHRvIHdoaWNoIHRoZSBjbGllbnQgc2VudCB0aGUgcmVxdWVzdC4KLSAgICA8UD4KLQotPExJPklmIGEgPENPREU+U2VydmVyUGF0aDwvQ09ERT4gZGlyZWN0aXZlIGV4aXN0cyB3aGljaCBpcyBhIHByZWZpeCBvZgotICAgIGFub3RoZXIgPENPREU+U2VydmVyUGF0aDwvQ09ERT4gZGlyZWN0aXZlIHRoYXQgYXBwZWFycyBsYXRlciBpbgotICAgIHRoZSBjb25maWd1cmF0aW9uIGZpbGUsIHRoZW4gdGhlIGZvcm1lciB3aWxsIGFsd2F5cyBiZSBtYXRjaGVkCi0gICAgYW5kIHRoZSBsYXR0ZXIgd2lsbCBuZXZlciBiZSBtYXRjaGVkLiAgKFRoYXQgaXMgYXNzdW1pbmcgdGhhdCBubwotICAgIDxDT0RFPkhvc3Q6PC9DT0RFPiBoZWFkZXIgZmllbGQgd2FzIGF2YWlsYWJsZSB0byBkaXNhbWJpZ3VhdGUgdGhlIHR3by4pCi0gICAgPFA+Ci0KLTxMST5JZiB0d28gSVAtYmFzZWQgdmhvc3RzIGhhdmUgYW4gYWRkcmVzcyBpbiBjb21tb24sIHRoZSB2aG9zdCBhcHBlYXJpbmcKLSAgICBmaXJzdCBpbiB0aGUgY29uZmlnIGZpbGUgaXMgYWx3YXlzIG1hdGNoZWQuICBTdWNoIGEgdGhpbmcgbWlnaHQgaGFwcGVuCi0gICAgaW5hZHZlcnRlbnRseS4gVGhlIHNlcnZlciB3aWxsIGdpdmUgYSB3YXJuaW5nIGluIHRoZSBlcnJvcgotICAgIGxvZ2ZpbGUgd2hlbiBpdCBkZXRlY3RzIHRoaXMuCi0gICAgPFA+Ci0gICAgCi08TEk+QSA8Q09ERT5fZGVmYXVsdF88L0NPREU+IHZob3N0IGNhdGNoZXMgYSByZXF1ZXN0IG9ubHkgaWYgdGhlcmUgaXMgbm8KLSAgICBvdGhlciB2aG9zdCB3aXRoIGEgbWF0Y2hpbmcgSVAgYWRkcmVzcyA8RU0+YW5kPC9FTT4gYSBtYXRjaGluZyBwb3J0Ci0gICAgbnVtYmVyIGZvciB0aGUgcmVxdWVzdC4gVGhlIHJlcXVlc3QgaXMgb25seSBjYXVnaHQgaWYgdGhlIHBvcnQgbnVtYmVyCi0gICAgdG8gd2hpY2ggdGhlIGNsaWVudCBzZW50IHRoZSByZXF1ZXN0IG1hdGNoZXMgdGhlIHBvcnQgbnVtYmVyIG9mIHlvdXIKLSAgICA8Q09ERT5fZGVmYXVsdF88L0NPREU+IHZob3N0IHdoaWNoIGlzIHlvdXIgc3RhbmRhcmQgPENPREU+UG9ydDwvQ09ERT4KLSAgICBieSBkZWZhdWx0LiBBIHdpbGRjYXJkIHBvcnQgY2FuIGJlIHNwZWNpZmllZCAoPEVNPmkuZS48L0VNPiwKLSAgICA8Q09ERT5fZGVmYXVsdF86KjwvQ09ERT4pIHRvIGNhdGNoIHJlcXVlc3RzIHRvIGFueSBhdmFpbGFibGUgcG9ydC4KLSAgICA8UD4KLSAgICAKLTxMST5UaGUgbWFpbl9zZXJ2ZXIgaXMgb25seSB1c2VkIHRvIHNlcnZlIGEgcmVxdWVzdCBpZiB0aGUgSVAgYWRkcmVzcwotICAgIGFuZCBwb3J0IG51bWJlciB0byB3aGljaCB0aGUgY2xpZW50IGNvbm5lY3RlZCBpcyB1bnNwZWNpZmllZAotICAgIGFuZCBkb2VzIG5vdCBtYXRjaCBhbnkgb3RoZXIgdmhvc3QgKGluY2x1ZGluZyBhIDxDT0RFPl9kZWZhdWx0XzwvQ09ERT4KLSAgICB2aG9zdCkuIEluIG90aGVyIHdvcmRzIHRoZSBtYWluX3NlcnZlciBvbmx5IGNhdGNoZXMgYSByZXF1ZXN0IGZvciBhbgotICAgIHVuc3BlY2lmaWVkIGFkZHJlc3MvcG9ydCBjb21iaW5hdGlvbiAodW5sZXNzIHRoZXJlIGlzIGEKLSAgICA8Q09ERT5fZGVmYXVsdF88L0NPREU+IHZob3N0IHdoaWNoIG1hdGNoZXMgdGhhdCBwb3J0KS4KLSAgICA8UD4KLSAgICAKLTxMST5BIDxDT0RFPl9kZWZhdWx0XzwvQ09ERT4gdmhvc3Qgb3IgdGhlIG1haW5fc2VydmVyIGlzIDxFTT5uZXZlcjwvRU0+Ci0gICAgbWF0Y2hlZCBmb3IgYSByZXF1ZXN0IHdpdGggYW4gdW5rbm93biBvciBtaXNzaW5nIDxDT0RFPkhvc3Q6PC9DT0RFPiBoZWFkZXIKLSAgICBmaWVsZCBpZiB0aGUgY2xpZW50IGNvbm5lY3RlZCB0byBhbiBhZGRyZXNzIChhbmQgcG9ydCkgd2hpY2ggaXMgdXNlZAotICAgIGZvciBuYW1lLWJhc2VkIHZob3N0cywgPEVNPmUuZy48L0VNPiwgaW4gYSA8Q09ERT5OYW1lVmlydHVhbEhvc3Q8L0NPREU+Ci0gICAgZGlyZWN0aXZlLgotICAgIDxQPgotICAgIAotPExJPllvdSBzaG91bGQgbmV2ZXIgc3BlY2lmeSBETlMgbmFtZXMgaW4gPENPREU+VmlydHVhbEhvc3Q8L0NPREU+Ci0gICAgZGlyZWN0aXZlcyBiZWNhdXNlIGl0IHdpbGwgZm9yY2UgeW91ciBzZXJ2ZXIgdG8gcmVseSBvbiBETlMgdG8gYm9vdC4KLSAgICBGdXJ0aGVybW9yZSBpdCBwb3NlcyBhIHNlY3VyaXR5IHRocmVhdCBpZiB5b3UgZG8gbm90IGNvbnRyb2wgdGhlCi0gICAgRE5TIGZvciBhbGwgdGhlIGRvbWFpbnMgbGlzdGVkLgotICAgIFRoZXJlJ3MgPEEgSFJFRj0iLi4vZG5zLWNhdmVhdHMuaHRtbCI+bW9yZSBpbmZvcm1hdGlvbjwvQT4KLSAgICBhdmFpbGFibGUgb24gdGhpcyBhbmQgdGhlIG5leHQgdHdvIHRvcGljcy4KLSAgICA8UD4KLQotPExJPjxDT0RFPlNlcnZlck5hbWU8L0NPREU+IHNob3VsZCBhbHdheXMgYmUgc2V0IGZvciBlYWNoIHZob3N0LiAgT3RoZXJ3aXNlCi0gICAgQSBETlMgbG9va3VwIGlzIHJlcXVpcmVkIGZvciBlYWNoIHZob3N0LgotICAgIDxQPgotCi08L1VMPgotCi08SDM+VGlwczwvSDM+Ci0KLTxQPkluIGFkZGl0aW9uIHRvIHRoZSB0aXBzIG9uIHRoZSA8QSBIUkVGPSIuLi9kbnMtY2F2ZWF0cy5odG1sI3RpcHMiPkROUwotSXNzdWVzPC9BPiBwYWdlLCBoZXJlIGFyZSBzb21lIGZ1cnRoZXIgdGlwczoKLQotPFVMPgotCi08TEk+UGxhY2UgYWxsIG1haW5fc2VydmVyIGRlZmluaXRpb25zIGJlZm9yZSBhbnkgPENPREU+VmlydHVhbEhvc3Q8L0NPREU+Ci0gICAgZGVmaW5pdGlvbnMuIChUaGlzIGlzIHRvIGFpZCB0aGUgcmVhZGFiaWxpdHkgb2YgdGhlIGNvbmZpZ3VyYXRpb24gLS0KLSAgICB0aGUgcG9zdC1jb25maWcgbWVyZ2luZyBwcm9jZXNzIG1ha2VzIGl0IG5vbi1vYnZpb3VzIHRoYXQgZGVmaW5pdGlvbnMgCi0gICAgbWl4ZWQgaW4gYXJvdW5kIHZpcnR1YWwgaG9zdHMgbWlnaHQgYWZmZWN0IGFsbCB2aXJ0dWFsIGhvc3RzLikKLSAgICA8UD4KLQotPExJPkdyb3VwIGNvcnJlc3BvbmRpbmcgPENPREU+TmFtZVZpcnR1YWxIb3N0PC9DT0RFPiBhbmQKLSAgICA8Q09ERT5WaXJ0dWFsSG9zdDwvQ09ERT4gZGVmaW5pdGlvbnMgaW4geW91ciBjb25maWd1cmF0aW9uIHRvIGVuc3VyZQotICAgIGJldHRlciByZWFkYWJpbGl0eS4KLSAgICA8UD4KLQotPExJPkF2b2lkIDxDT0RFPlNlcnZlclBhdGhzPC9DT0RFPiB3aGljaCBhcmUgcHJlZml4ZXMgb2Ygb3RoZXIKLSAgICA8Q09ERT5TZXJ2ZXJQYXRoczwvQ09ERT4uICBJZiB5b3UgY2Fubm90IGF2b2lkIHRoaXMgdGhlbiB5b3UgaGF2ZSB0bwotICAgIGVuc3VyZSB0aGF0IHRoZSBsb25nZXIgKG1vcmUgc3BlY2lmaWMpIHByZWZpeCB2aG9zdCBhcHBlYXJzIGVhcmxpZXIgaW4KLSAgICB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHRoYW4gdGhlIHNob3J0ZXIgKGxlc3Mgc3BlY2lmaWMpIHByZWZpeAotICAgICg8RU0+aS5lLjwvRU0+LCAmcXVvdDtTZXJ2ZXJQYXRoIC9hYmMmcXVvdDsgc2hvdWxkIGFwcGVhciBhZnRlcgotICAgICZxdW90O1NlcnZlclBhdGggL2FiYy9kZWYmcXVvdDspLgotICAgIDxQPgotCi08L1VMPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvdmhvc3RzL2RldGFpbHNfMV8yLmh0bWwgYi9kb2NzL21hbnVhbC92aG9zdHMvZGV0YWlsc18xXzIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNkOGU5MS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC92aG9zdHMvZGV0YWlsc18xXzIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD48SEVBRD4KLTxUSVRMRT5BbiBJbi1EZXB0aCBEaXNjdXNzaW9uIG9mIFZpcnR1YWxIb3N0IE1hdGNoaW5nPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+QW4gSW4tRGVwdGggRGlzY3Vzc2lvbiBvZiBWaXJ0dWFsSG9zdCBNYXRjaGluZzwvSDE+Ci0KLTxQPlRoaXMgaXMgYSB2ZXJ5IHJvdWdoIGRvY3VtZW50IHRoYXQgd2FzIHByb2JhYmx5IG91dCBvZiBkYXRlIHRoZSBtb21lbnQKLWl0IHdhcyB3cml0dGVuLiAgSXQgYXR0ZW1wdHMgdG8gZXhwbGFpbiBleGFjdGx5IHdoYXQgdGhlIGNvZGUgZG9lcyB3aGVuCi1kZWNpZGluZyB3aGF0IHZpcnR1YWwgaG9zdCB0byBzZXJ2ZSBhIGhpdCBmcm9tLiAgSXQncyBwcm92aWRlZCBvbiB0aGUKLWFzc3VtcHRpb24gdGhhdCBzb21ldGhpbmcgaXMgYmV0dGVyIHRoYW4gbm90aGluZy4gIFRoZSBzZXJ2ZXIgdmVyc2lvbgotdW5kZXIgZGlzY3Vzc2lvbiBpcyBBcGFjaGUgMS4yLgotCi08UD5JZiB5b3UganVzdCB3YW50IHRvICZxdW90O21ha2UgaXQgd29yayZxdW90OyB3aXRob3V0IHVuZGVyc3RhbmRpbmcKLWhvdywgdGhlcmUncyBhIDxBIEhSRUY9IiN3aGF0d29ya3MiPldoYXQgV29ya3M8L0E+IHNlY3Rpb24gYXQgdGhlIGJvdHRvbS4KLQotPEgzPkNvbmZpZyBGaWxlIFBhcnNpbmc8L0gzPgotCi08UD5UaGVyZSBpcyBhIG1haW5fc2VydmVyIHdoaWNoIGNvbnNpc3RzIG9mIGFsbCB0aGUgZGVmaW5pdGlvbnMgYXBwZWFyaW5nCi1vdXRzaWRlIG9mIDxDT0RFPlZpcnR1YWxIb3N0PC9DT0RFPiBzZWN0aW9ucy4gIFRoZXJlIGFyZSB2aXJ0dWFsIHNlcnZlcnMsCi1jYWxsZWQgPEVNPnZob3N0czwvRU0+LCB3aGljaCBhcmUgZGVmaW5lZCBieQotPEEKLSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3ZpcnR1YWxob3N0IgotPjxTQU1QPlZpcnR1YWxIb3N0PC9TQU1QPjwvQT4KLXNlY3Rpb25zLgotCi08UD5UaGUgZGlyZWN0aXZlcwotPEEKLSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3BvcnQiCi0+PFNBTVA+UG9ydDwvU0FNUD48L0E+LAotPEEKLSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcm5hbWUiCi0+PFNBTVA+U2VydmVyTmFtZTwvU0FNUD48L0E+LAotPEEKLSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcnBhdGgiCi0+PFNBTVA+U2VydmVyUGF0aDwvU0FNUD48L0E+LAotYW5kCi08QQotIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjc2VydmVyYWxpYXMiCi0+PFNBTVA+U2VydmVyQWxpYXM8L1NBTVA+PC9BPgotY2FuIGFwcGVhciBhbnl3aGVyZSB3aXRoaW4gdGhlIGRlZmluaXRpb24gb2YKLWEgc2VydmVyLiAgSG93ZXZlciwgZWFjaCBhcHBlYXJhbmNlIG92ZXJyaWRlcyB0aGUgcHJldmlvdXMgYXBwZWFyYW5jZQotKHdpdGhpbiB0aGF0IHNlcnZlcikuCi0KLTxQPlRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSA8Q09ERT5Qb3J0PC9DT0RFPiBmaWVsZCBmb3IgbWFpbl9zZXJ2ZXIKLWlzIDgwLiAgVGhlIG1haW5fc2VydmVyIGhhcyBubyBkZWZhdWx0IDxDT0RFPlNlcnZlck5hbWU8L0NPREU+LAotPENPREU+U2VydmVyUGF0aDwvQ09ERT4sIG9yIDxDT0RFPlNlcnZlckFsaWFzPC9DT0RFPi4KLQotPFA+SW4gdGhlIGFic2VuY2Ugb2YgYW55Ci08QQotIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjbGlzdGVuIgotPjxTQU1QPkxpc3RlbjwvU0FNUD48L0E+Ci1kaXJlY3RpdmVzLCB0aGUgKGZpbmFsIGlmIHRoZXJlCi1hcmUgbXVsdGlwbGUpIDxDT0RFPlBvcnQ8L0NPREU+IGRpcmVjdGl2ZSBpbiB0aGUgbWFpbl9zZXJ2ZXIgaW5kaWNhdGVzCi13aGljaCBwb3J0IGh0dHBkIHdpbGwgbGlzdGVuIG9uLgotCi08UD4gVGhlIDxDT0RFPlBvcnQ8L0NPREU+IGFuZCA8Q09ERT5TZXJ2ZXJOYW1lPC9DT0RFPiBkaXJlY3RpdmVzIGZvcgotYW55IHNlcnZlciBtYWluIG9yIHZpcnR1YWwgYXJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIFVSTHMgc3VjaCBhcyBkdXJpbmcKLXJlZGlyZWN0cy4KLQotPFA+IEVhY2ggYWRkcmVzcyBhcHBlYXJpbmcgaW4gdGhlIDxDT0RFPlZpcnR1YWxIb3N0PC9DT0RFPiBkaXJlY3RpdmUKLWNhbiBoYXZlIGFuIG9wdGlvbmFsIHBvcnQuICBJZiB0aGUgcG9ydCBpcyB1bnNwZWNpZmllZCBpdCBkZWZhdWx0cyB0bwotdGhlIHZhbHVlIG9mIHRoZSBtYWluX3NlcnZlcidzIG1vc3QgcmVjZW50IDxDT0RFPlBvcnQ8L0NPREU+IHN0YXRlbWVudC4KLVRoZSBzcGVjaWFsIHBvcnQgPFNBTVA+KjwvU0FNUD4gaW5kaWNhdGVzIGEgd2lsZGNhcmQgdGhhdCBtYXRjaGVzIGFueSBwb3J0LgotQ29sbGVjdGl2ZWx5IHRoZSBlbnRpcmUgc2V0IG9mIGFkZHJlc3NlcyAoaW5jbHVkaW5nIG11bHRpcGxlCi08U0FNUD5BPC9TQU1QPiByZWNvcmQKLXJlc3VsdHMgZnJvbSBETlMgbG9va3VwcykgYXJlIGNhbGxlZCB0aGUgdmhvc3QncyA8RU0+YWRkcmVzcyBzZXQ8L0VNPi4KLQotPFA+IFRoZSBtYWdpYyA8Q09ERT5fZGVmYXVsdF88L0NPREU+IGFkZHJlc3MgaGFzIHNpZ25pZmljYW5jZSBkdXJpbmcKLXRoZSBtYXRjaGluZyBhbGdvcml0aG0uICBJdCBlc3NlbnRpYWxseSBtYXRjaGVzIGFueSB1bnNwZWNpZmllZCBhZGRyZXNzLgotCi08UD4gQWZ0ZXIgcGFyc2luZyB0aGUgPENPREU+VmlydHVhbEhvc3Q8L0NPREU+IGRpcmVjdGl2ZSwgdGhlIHZob3N0IHNlcnZlcgotaXMgZ2l2ZW4gYSBkZWZhdWx0IDxDT0RFPlBvcnQ8L0NPREU+IGVxdWFsIHRvIHRoZSBwb3J0IGFzc2lnbmVkIHRvIHRoZQotZmlyc3QgbmFtZSBpbiBpdHMgPENPREU+VmlydHVhbEhvc3Q8L0NPREU+IGRpcmVjdGl2ZS4gIFRoZSBjb21wbGV0ZQotbGlzdCBvZiBuYW1lcyBpbiB0aGUgPENPREU+VmlydHVhbEhvc3Q8L0NPREU+IGRpcmVjdGl2ZSBhcmUgdHJlYXRlZAotanVzdCBsaWtlIGEgPENPREU+U2VydmVyQWxpYXM8L0NPREU+IChidXQgYXJlIG5vdCBvdmVycmlkZGVuIGJ5IGFueQotPENPREU+U2VydmVyQWxpYXM8L0NPREU+IHN0YXRlbWVudCkuICBOb3RlIHRoYXQgc3Vic2VxdWVudCA8Q09ERT5Qb3J0PC9DT0RFPgotc3RhdGVtZW50cyBmb3IgdGhpcyB2aG9zdCB3aWxsIG5vdCBhZmZlY3QgdGhlIHBvcnRzIGFzc2lnbmVkIGluIHRoZQotYWRkcmVzcyBzZXQuCi0KLTxQPgotQWxsIHZob3N0cyBhcmUgc3RvcmVkIGluIGEgbGlzdCB3aGljaCBpcyBpbiB0aGUgcmV2ZXJzZSBvcmRlciB0aGF0Ci10aGV5IGFwcGVhcmVkIGluIHRoZSBjb25maWcgZmlsZS4gIEZvciBleGFtcGxlLCBpZiB0aGUgY29uZmlnIGZpbGUgaXM6Ci0KLTxCTE9DS1FVT1RFPjxQUkU+Ci0gICAgJmx0O1ZpcnR1YWxIb3N0IEEmZ3Q7Ci0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLQotICAgICZsdDtWaXJ0dWFsSG9zdCBCJmd0OwotICAgIC4uLgotICAgICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci0KLSAgICAmbHQ7VmlydHVhbEhvc3QgQyZndDsKLSAgICAuLi4KLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotPC9QUkU+PC9CTE9DS1FVT1RFPgotCi1UaGVuIHRoZSBsaXN0IHdpbGwgYmUgb3JkZXJlZDogbWFpbl9zZXJ2ZXIsIEMsIEIsIEEuICBLZWVwIHRoaXMgaW4gbWluZC4KLQotPFA+Ci1BZnRlciBwYXJzaW5nIGhhcyBjb21wbGV0ZWQsIHRoZSBsaXN0IG9mIHNlcnZlcnMgaXMgc2Nhbm5lZCwgYW5kIHZhcmlvdXMKLW1lcmdlcyBhbmQgZGVmYXVsdCB2YWx1ZXMgYXJlIHNldC4gIEluIHBhcnRpY3VsYXI6Ci0KLTxPTD4KLTxMST5JZiBhIHZob3N0IGhhcyBubwotICAgIDxBCi0gICAgIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjc2VydmVyYWRtaW4iCi0gICAgPjxDT0RFPlNlcnZlckFkbWluPC9DT0RFPjwvQT4sCi0gICAgPEEKLSAgICAgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNyZXNvdXJjZWNvbmZpZyIKLSAgICA+PENPREU+UmVzb3VyY2VDb25maWc8L0NPREU+PC9BPiwKLSAgICA8QQotICAgICBIUkVGPSIuLi9tb2QvY29yZS5odG1sI2FjY2Vzc2NvbmZpZyIKLSAgICA+PENPREU+QWNjZXNzQ29uZmlnPC9DT0RFPjwvQT4sCi0gICAgPEEKLSAgICAgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCN0aW1lb3V0IgotICAgID48Q09ERT5UaW1lb3V0PC9DT0RFPjwvQT4sCi0gICAgPEEKLSAgICAgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNrZWVwYWxpdmV0aW1lb3V0IgotICAgID48Q09ERT5LZWVwQWxpdmVUaW1lb3V0PC9DT0RFPjwvQT4sCi0gICAgPEEKLSAgICAgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNrZWVwYWxpdmUiCi0gICAgPjxDT0RFPktlZXBBbGl2ZTwvQ09ERT48L0E+LAotICAgIDxBCi0gICAgIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjbWF4a2VlcGFsaXZlcmVxdWVzdHMiCi0gICAgPjxDT0RFPk1heEtlZXBBbGl2ZVJlcXVlc3RzPC9DT0RFPjwvQT4sCi0gICAgb3IKLSAgICA8QQotICAgICBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlbmRidWZmZXJzaXplIgotICAgID48Q09ERT5TZW5kQnVmZmVyU2l6ZTwvQ09ERT48L0E+Ci0gICAgZGlyZWN0aXZlIHRoZW4gdGhlIHJlc3BlY3RpdmUgdmFsdWUgaXMKLSAgICBpbmhlcml0ZWQgZnJvbSB0aGUgbWFpbl9zZXJ2ZXIuICAoVGhhdCBpcywgaW5oZXJpdGVkIGZyb20gd2hhdGV2ZXIKLSAgICB0aGUgZmluYWwgc2V0dGluZyBvZiB0aGF0IHZhbHVlIGlzIGluIHRoZSBtYWluX3NlcnZlci4pCi0KLTxMST5UaGUgJnF1b3Q7bG9va3VwIGRlZmF1bHRzJnF1b3Q7IHRoYXQgZGVmaW5lIHRoZSBkZWZhdWx0IGRpcmVjdG9yeQotICAgIHBlcm1pc3Npb25zCi0gICAgZm9yIGEgdmhvc3QgYXJlIG1lcmdlZCB3aXRoIHRob3NlIG9mIHRoZSBtYWluIHNlcnZlci4gIFRoaXMgaW5jbHVkZXMKLSAgICBhbnkgcGVyLWRpcmVjdG9yeSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhbnkgbW9kdWxlLgotCi08TEk+VGhlIHBlci1zZXJ2ZXIgY29uZmlncyBmb3IgZWFjaCBtb2R1bGUgZnJvbSB0aGUgbWFpbl9zZXJ2ZXIgYXJlCi0gICAgbWVyZ2VkIGludG8gdGhlIHZob3N0IHNlcnZlci4KLTwvT0w+Ci0KLUVzc2VudGlhbGx5LCB0aGUgbWFpbl9zZXJ2ZXIgaXMgdHJlYXRlZCBhcyAmcXVvdDtkZWZhdWx0cyZxdW90OyBvciBhCi0mcXVvdDtiYXNlJnF1b3Q7IG9uCi13aGljaCB0byBidWlsZCBlYWNoIHZob3N0LiAgQnV0IHRoZSBwb3NpdGlvbmluZyBvZiB0aGVzZSBtYWluX3NlcnZlcgotZGVmaW5pdGlvbnMgaW4gdGhlIGNvbmZpZyBmaWxlIGlzIGxhcmdlbHkgaXJyZWxldmFudCAtLSB0aGUgZW50aXJlCi1jb25maWcgb2YgdGhlIG1haW5fc2VydmVyIGhhcyBiZWVuIHBhcnNlZCB3aGVuIHRoaXMgZmluYWwgbWVyZ2luZyBvY2N1cnMuCi1TbyBldmVuIGlmIGEgbWFpbl9zZXJ2ZXIgZGVmaW5pdGlvbiBhcHBlYXJzIGFmdGVyIGEgdmhvc3QgZGVmaW5pdGlvbgotaXQgbWlnaHQgYWZmZWN0IHRoZSB2aG9zdCBkZWZpbml0aW9uLgotCi08UD4gSWYgdGhlIG1haW5fc2VydmVyIGhhcyBubyA8Q09ERT5TZXJ2ZXJOYW1lPC9DT0RFPiBhdCB0aGlzIHBvaW50LAotdGhlbiB0aGUgaG9zdG5hbWUgb2YgdGhlIG1hY2hpbmUgdGhhdCBodHRwZCBpcyBydW5uaW5nIG9uIGlzIHVzZWQKLWluc3RlYWQuICBXZSB3aWxsIGNhbGwgdGhlIDxFTT5tYWluX3NlcnZlciBhZGRyZXNzIHNldDwvRU0+IHRob3NlIElQCi1hZGRyZXNzZXMgcmV0dXJuZWQgYnkgYSBETlMgbG9va3VwIG9uIHRoZSA8Q09ERT5TZXJ2ZXJOYW1lPC9DT0RFPiBvZgotdGhlIG1haW5fc2VydmVyLgotCi08UD4gTm93IGEgcGFzcyBpcyBtYWRlIHRocm91Z2ggdGhlIHZob3N0cyB0byBmaWxsIGluIGFueSBtaXNzaW5nCi08Q09ERT5TZXJ2ZXJOYW1lPC9DT0RFPiBmaWVsZHMgYW5kIHRvIGNsYXNzaWZ5IHRoZSB2aG9zdCBhcyBlaXRoZXIKLWFuIDxFTT5JUC1iYXNlZDwvRU0+IHZob3N0IG9yIGEgPEVNPm5hbWUtYmFzZWQ8L0VNPiB2aG9zdC4gIEEgdmhvc3QgaXMKLWNvbnNpZGVyZWQgYSBuYW1lLWJhc2VkIHZob3N0IGlmIGFueSBvZiBpdHMgYWRkcmVzcyBzZXQgb3ZlcmxhcHMgdGhlCi1tYWluX3NlcnZlciAodGhlIHBvcnQgYXNzb2NpYXRlZCB3aXRoIGVhY2ggYWRkcmVzcyBtdXN0IG1hdGNoIHRoZQotbWFpbl9zZXJ2ZXIncyA8Q09ERT5Qb3J0PC9DT0RFPikuICBPdGhlcndpc2UgaXQgaXMgY29uc2lkZXJlZCBhbiBJUC1iYXNlZAotdmhvc3QuCi0KLTxQPiBGb3IgYW55IHVuZGVmaW5lZCA8Q09ERT5TZXJ2ZXJOYW1lPC9DT0RFPiBmaWVsZHMsIGEgbmFtZS1iYXNlZCB2aG9zdAotZGVmYXVsdHMgdG8gdGhlIGFkZHJlc3MgZ2l2ZW4gZmlyc3QgaW4gdGhlIDxDT0RFPlZpcnR1YWxIb3N0PC9DT0RFPgotc3RhdGVtZW50IGRlZmluaW5nIHRoZSB2aG9zdC4gIEFueSB2aG9zdCB0aGF0IGluY2x1ZGVzIHRoZSBtYWdpYwotPFNBTVA+X2RlZmF1bHRfPC9TQU1QPiB3aWxkY2FyZCBpcyBnaXZlbiB0aGUgc2FtZSA8Q09ERT5TZXJ2ZXJOYW1lPC9DT0RFPiBhcwotdGhlIG1haW5fc2VydmVyLiAgT3RoZXJ3aXNlIHRoZSB2aG9zdCAod2hpY2ggaXMgbmVjZXNzYXJpbHkgYW4gSVAtYmFzZWQKLXZob3N0KSBpcyBnaXZlbiBhIDxDT0RFPlNlcnZlck5hbWU8L0NPREU+IGJhc2VkIG9uIHRoZSByZXN1bHQgb2YgYSByZXZlcnNlCi1ETlMgbG9va3VwIG9uIHRoZSBmaXJzdCBhZGRyZXNzIGdpdmVuIGluIHRoZSA8Q09ERT5WaXJ0dWFsSG9zdDwvQ09ERT4KLXN0YXRlbWVudC4KLQotPFA+Ci0KLTxIMz5WaG9zdCBNYXRjaGluZzwvSDM+Ci0KLQotPFA+PFNUUk9ORz5BcGFjaGUgMS4zIGRpZmZlcnMgZnJvbSB3aGF0IGlzIGRvY3VtZW50ZWQKLWhlcmUsIGFuZCBkb2N1bWVudGF0aW9uIHN0aWxsIGhhcyB0byBiZSB3cml0dGVuLjwvU1RST05HPgotCi08UD4KLVRoZSBzZXJ2ZXIgZGV0ZXJtaW5lcyB3aGljaCB2aG9zdCB0byB1c2UgZm9yIGEgcmVxdWVzdCBhcyBmb2xsb3dzOgotCi08UD4gPENPREU+ZmluZF92aXJ0dWFsX3NlcnZlcjwvQ09ERT46IFdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgZmlyc3QgbWFkZQotYnkgdGhlIGNsaWVudCwgdGhlIGxvY2FsIElQIGFkZHJlc3MgKHRoZSBJUCBhZGRyZXNzIHRvIHdoaWNoIHRoZSBjbGllbnQKLWNvbm5lY3RlZCkgaXMgbG9va2VkIHVwIGluIHRoZSBzZXJ2ZXIgbGlzdC4gIEEgdmhvc3QgaXMgbWF0Y2hlZCBpZiBpdAotaXMgYW4gSVAtYmFzZWQgdmhvc3QsIHRoZSBJUCBhZGRyZXNzIG1hdGNoZXMgYW5kIHRoZSBwb3J0IG1hdGNoZXMKLSh0YWtpbmcgaW50byBhY2NvdW50IHdpbGRjYXJkcykuCi0KLTxQPiBJZiBubyB2aG9zdHMgYXJlIG1hdGNoZWQgdGhlbiB0aGUgbGFzdCBvY2N1cnJlbmNlLCBpZiBpdCBhcHBlYXJzLAotb2YgYSA8U0FNUD5fZGVmYXVsdF88L1NBTVA+IGFkZHJlc3MgKHdoaWNoIGlmIHlvdSByZWNhbGwgdGhlIG9yZGVyaW5nIG9mIHRoZQotc2VydmVyIGxpc3QgbWVudGlvbmVkIGFib3ZlIG1lYW5zIHRoYXQgdGhpcyB3b3VsZCBiZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZQotb2YgPFNBTVA+X2RlZmF1bHRfPC9TQU1QPiBpbiB0aGUgY29uZmlnIGZpbGUpIGlzIG1hdGNoZWQuCi0KLTxQPiBJbiBhbnkgZXZlbnQsIGlmIG5vdGhpbmcgYWJvdmUgaGFzIG1hdGNoZWQsIHRoZW4gdGhlIG1haW5fc2VydmVyIGlzCi1tYXRjaGVkLgotCi08UD4gVGhlIHZob3N0IHJlc3VsdGluZyBmcm9tIHRoZSBhYm92ZSBzZWFyY2ggaXMgc3RvcmVkIHdpdGggZGF0YQotYWJvdXQgdGhlIGNvbm5lY3Rpb24uICBXZSdsbCBjYWxsIHRoaXMgdGhlIDxFTT5jb25uZWN0aW9uIHZob3N0PC9FTT4uCi1UaGUgY29ubmVjdGlvbiB2aG9zdCBpcyBjb25zdGFudCBvdmVyIGFsbCByZXF1ZXN0cyBpbiBhIHBhcnRpY3VsYXIgVENQL0lQCi1zZXNzaW9uIC0tIHRoYXQgaXMsIG92ZXIgYWxsIHJlcXVlc3RzIGluIGEgS2VlcEFsaXZlL3BlcnNpc3RlbnQgc2Vzc2lvbi4KLQotPFA+IEZvciBlYWNoIHJlcXVlc3QgbWFkZSBvbiB0aGUgY29ubmVjdGlvbiB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIG9mCi1ldmVudHMgZnVydGhlciBkZXRlcm1pbmVzIHRoZSBhY3R1YWwgdmhvc3QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gc2VydmUKLXRoZSByZXF1ZXN0LgotCi08UD4gPENPREU+Y2hlY2tfZnVsbHVyaTwvQ09ERT46IElmIHRoZSByZXF1ZXN0VVJJIGlzIGFuIGFic29sdXRlVVJJLCB0aGF0Ci1pcyBpdCBpbmNsdWRlcyA8Q09ERT5odHRwOi8vaG9zdG5hbWUvPC9DT0RFPiwgdGhlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8KLWRldGVybWluZSBpZiB0aGUgaG9zdG5hbWUncyBhZGRyZXNzIChhbmQgb3B0aW9uYWwgcG9ydCkgbWF0Y2ggdGhhdCBvZgotdGhlIGNvbm5lY3Rpb24gdmhvc3QuICBJZiBpdCBkb2VzIHRoZW4gdGhlIGhvc3RuYW1lIHBvcnRpb24gb2YgdGhlIFVSSQotaXMgc2F2ZWQgYXMgdGhlIDxFTT5yZXF1ZXN0X2hvc3RuYW1lPC9FTT4uICBJZiBpdCBkb2VzIG5vdCBtYXRjaCwgdGhlbiB0aGUKLVVSSSByZW1haW5zIHVudG91Y2hlZC4gIDxTVFJPTkc+Tm90ZTwvU1RST05HPjogdG8gYWNoaWV2ZSB0aGlzIGFkZHJlc3MKLWNvbXBhcmlzb24sCi10aGUgaG9zdG5hbWUgc3VwcGxpZWQgZ29lcyB0aHJvdWdoIGEgRE5TIGxvb2t1cCB1bmxlc3MgaXQgbWF0Y2hlcyB0aGUKLTxDT0RFPlNlcnZlck5hbWU8L0NPREU+IG9yIHRoZSBsb2NhbCBJUCBhZGRyZXNzIG9mIHRoZSBjbGllbnQncyBzb2NrZXQuCi0KLTxQPiA8Q09ERT5wYXJzZV91cmk8L0NPREU+OiBJZiB0aGUgVVJJIGJlZ2lucyB3aXRoIGEgcHJvdG9jb2wKLSg8RU0+aS5lLjwvRU0+LCA8Q09ERT5odHRwOjwvQ09ERT4sIDxDT0RFPmZ0cDo8L0NPREU+KSB0aGVuIHRoZSByZXF1ZXN0IGlzCi1jb25zaWRlcmVkIGEgcHJveHkgcmVxdWVzdC4gIE5vdGUgdGhhdCBldmVuIHRob3VnaCB3ZSBtYXkgaGF2ZSBzdHJpcHBlZAotYW4gPENPREU+aHR0cDovL2hvc3RuYW1lLzwvQ09ERT4gaW4gdGhlIHByZXZpb3VzIHN0ZXAsIHRoaXMgY291bGQgc3RpbGwKLWJlIGEgcHJveHkgcmVxdWVzdC4KLQotPFA+IDxDT0RFPnJlYWRfcmVxdWVzdDwvQ09ERT46IElmIHRoZSByZXF1ZXN0IGRvZXMgbm90IGhhdmUgYSBob3N0bmFtZQotZnJvbSB0aGUgZWFybGllciBzdGVwLCB0aGVuIGFueSA8Q09ERT5Ib3N0OjwvQ09ERT4gaGVhZGVyIHNlbnQgYnkgdGhlCi1jbGllbnQgaXMgdXNlZCBhcyB0aGUgcmVxdWVzdCBob3N0bmFtZS4KLQotPFA+IDxDT0RFPmNoZWNrX2hvc3RhbGlhczwvQ09ERT46IElmIHRoZSByZXF1ZXN0IG5vdyBoYXMgYSBob3N0bmFtZSwKLXRoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIG1hdGNoIGZvciB0aGlzIGhvc3RuYW1lLiAgVGhlIGZpcnN0IHN0ZXAKLW9mIHRoaXMgbWF0Y2ggaXMgdG8gY29tcGFyZSBhbnkgcG9ydCwgaWYgb25lIHdhcyBnaXZlbiBpbiB0aGUgcmVxdWVzdCwKLWFnYWluc3QgdGhlIDxDT0RFPlBvcnQ8L0NPREU+IGZpZWxkIG9mIHRoZSBjb25uZWN0aW9uIHZob3N0LiAgSWYgdGhlcmUncwotYSBtaXNtYXRjaCB0aGVuIHRoZSB2aG9zdCB1c2VkIGZvciB0aGUgcmVxdWVzdCBpcyB0aGUgY29ubmVjdGlvbiB2aG9zdC4KLShUaGlzIGlzIGEgYnVnLCBzZWUgb2JzZXJ2YXRpb25zLikKLQotPFA+Ci1JZiB0aGUgcG9ydCBtYXRjaGVzLCB0aGVuIGh0dHBkIHNjYW5zIHRoZSBsaXN0IG9mIHZob3N0cyBzdGFydGluZyB3aXRoCi10aGUgbmV4dCBzZXJ2ZXIgPFNUUk9ORz5hZnRlcjwvU1RST05HPiB0aGUgY29ubmVjdGlvbiB2aG9zdC4gIFRoaXMgc2NhbiBkb2VzIG5vdAotc3RvcCBpZiB0aGVyZSBhcmUgYW55IG1hdGNoZXMsIGl0IGdvZXMgdGhyb3VnaCBhbGwgcG9zc2libGUgdmhvc3RzLAotYW5kIGluIHRoZSBlbmQgdXNlcyB0aGUgbGFzdCBtYXRjaCBpdCBmb3VuZC4gIFRoZSBjb21wYXJpc29ucyBwZXJmb3JtZWQKLWFyZSBhcyBmb2xsb3dzOgotCi08VUw+Ci08TEk+Q29tcGFyZSB0aGUgcmVxdWVzdCBob3N0bmFtZTpwb3J0IHdpdGggdGhlIHZob3N0Ci0gICAgPENPREU+U2VydmVyTmFtZTwvQ09ERT4gYW5kIDxDT0RFPlBvcnQ8L0NPREU+LgotCi08TEk+Q29tcGFyZSB0aGUgcmVxdWVzdCBob3N0bmFtZSBhZ2FpbnN0IGFueSBhbmQgYWxsIGFkZHJlc3NlcyBnaXZlbiBpbgotICAgIHRoZSA8Q09ERT5WaXJ0dWFsSG9zdDwvQ09ERT4gZGlyZWN0aXZlIGZvciB0aGlzIHZob3N0LgotCi08TEk+Q29tcGFyZSB0aGUgcmVxdWVzdCBob3N0bmFtZSBhZ2FpbnN0IHRoZSA8Q09ERT5TZXJ2ZXJBbGlhczwvQ09ERT4KLSAgICBnaXZlbiBmb3IgdGhlIHZob3N0LgotPC9VTD4KLQotPFA+Ci08Q09ERT5jaGVja19zZXJ2ZXJwYXRoPC9DT0RFPjogSWYgdGhlIHJlcXVlc3QgaGFzIG5vIGhvc3RuYW1lCi0oYmFjayB1cCBhIGZldyBwYXJhZ3JhcGhzKSB0aGVuIGEgc2NhbiBzaW1pbGFyIHRvIHRoZSBvbmUKLWluIDxDT0RFPmNoZWNrX2hvc3RhbGlhczwvQ09ERT4gaXMgcGVyZm9ybWVkIHRvIG1hdGNoIGFueQotPENPREU+U2VydmVyUGF0aDwvQ09ERT4gZGlyZWN0aXZlcyBnaXZlbiBpbiB0aGUgdmhvc3RzLiAgTm90ZSB0aGF0IHRoZQotPFNUUk9ORz5sYXN0IG1hdGNoPC9TVFJPTkc+IGlzIHVzZWQgcmVnYXJkbGVzcyAoYWdhaW4gY29uc2lkZXIgdGhlIG9yZGVyaW5nIG9mCi10aGUgdmlydHVhbCBob3N0cykuCi0KLTxIMz5PYnNlcnZhdGlvbnM8L0gzPgotCi08VUw+Ci0KLTxMST5JdCBpcyBkaWZmaWN1bHQgdG8gZGVmaW5lIGFuIElQLWJhc2VkIHZob3N0IGZvciB0aGUgbWFjaGluZSdzCi0gICAgJnF1b3Q7bWFpbiBJUCBhZGRyZXNzJnF1b3Q7LiAgWW91IGVzc2VudGlhbGx5IGhhdmUgdG8gY3JlYXRlIGEgYm9ndXMKLSAgICA8Q09ERT5TZXJ2ZXJOYW1lPC9DT0RFPiBmb3IgdGhlIG1haW5fc2VydmVyIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlCi0gICAgbWFjaGluZSdzIElQcy4KLSAgICA8UD4KLQotPExJPkR1cmluZyB0aGUgc2NhbnMgaW4gYm90aCA8Q09ERT5jaGVja19ob3N0YWxpYXM8L0NPREU+IGFuZAotICAgIDxDT0RFPmNoZWNrX3NlcnZlcnBhdGg8L0NPREU+IG5vIGNoZWNrIGlzIG1hZGUgdGhhdCB0aGUgdmhvc3QgYmVpbmcKLSAgICBzY2FubmVkIGlzIGFjdHVhbGx5IGEgbmFtZS1iYXNlZCB2aG9zdC4gIFRoaXMgbWVhbnMsIGZvciBleGFtcGxlLCB0aGF0Ci0gICAgaXQncyBwb3NzaWJsZSB0byBtYXRjaCBhbiBJUC1iYXNlZCB2aG9zdCB0aHJvdWdoIGFub3RoZXIgYWRkcmVzcy4gIEJ1dAotICAgIGJlY2F1c2UgdGhlIHNjYW4gc3RhcnRzIGluIHRoZSB2aG9zdCBsaXN0IGF0IHRoZSBmaXJzdCB2aG9zdCB0aGF0Ci0gICAgbWF0Y2hlZCB0aGUgbG9jYWwgSVAgYWRkcmVzcyBvZiB0aGUgY29ubmVjdGlvbiwgbm90IGFsbCBJUC1iYXNlZCB2aG9zdHMKLSAgICBjYW4gYmUgbWF0Y2hlZC4KLSAgICA8UD4KLSAgICBDb25zaWRlciB0aGUgY29uZmlnIGZpbGUgYWJvdmUgd2l0aCB0aHJlZSB2aG9zdHMgQSwgQiwgQy4gIFN1cHBvc2UKLSAgICB0aGF0IEIgaXMgYSBuYW1lZC1iYXNlZCB2aG9zdCwgYW5kIEEgYW5kIEMgYXJlIElQLWJhc2VkIHZob3N0cy4gIElmCi0gICAgYSByZXF1ZXN0IGNvbWVzIGluIG9uIEIgb3IgQydzIGFkZHJlc3MgY29udGFpbmluZyBhIGhlYWRlcgotICAgICZxdW90OzxTQU1QPkhvc3Q6IEE8L1NBTVA+JnF1b3Q7IHRoZW4KLSAgICBpdCB3aWxsIGJlIHNlcnZlZCBmcm9tIEEncyBjb25maWcuICBJZiBhIHJlcXVlc3QgY29tZXMgaW4gb24gQSdzCi0gICAgYWRkcmVzcyB0aGVuIGl0IHdpbGwgYWx3YXlzIGJlIHNlcnZlZCBmcm9tIEEncyBjb25maWcgcmVnYXJkbGVzcyBvZgotICAgIGFueSBIb3N0OiBoZWFkZXIuCi0gICAgPC9QPgotCi08TEk+VW5sZXNzIHlvdSBoYXZlIGEgPFNBTVA+X2RlZmF1bHRfPC9TQU1QPiB2aG9zdCwKLSAgICBpdCBkb2Vzbid0IG1hdHRlciBpZiB5b3UgbWl4IG5hbWUtYmFzZWQgdmhvc3RzIGluIGFtb25nc3QgSVAtYmFzZWQKLSAgICB2aG9zdHMuICBEdXJpbmcgdGhlIDxDT0RFPmZpbmRfdmlydHVhbF9zZXJ2ZXI8L0NPREU+IHBoYXNlIGFib3ZlIG5vCi0gICAgbmFtZWQtYmFzZWQgdmhvc3Qgd2lsbCBiZSBtYXRjaGVkLCBzbyB0aGUgbWFpbl9zZXJ2ZXIgd2lsbCByZW1haW4gdGhlCi0gICAgY29ubmVjdGlvbiB2aG9zdC4gIFRoZW4gc2NhbnMgd2lsbCBjb3ZlciBhbGwgdmhvc3RzIGluIHRoZSB2aG9zdCBsaXN0LgotICAgIDxQPgotICAgIElmIHlvdSBkbyBoYXZlIGEgPFNBTVA+X2RlZmF1bHRfPC9TQU1QPiB2aG9zdCwgdGhlbiB5b3UgY2Fubm90IHBsYWNlCi0gICAgbmFtZWQtYmFzZWQgdmhvc3RzIGFmdGVyIGl0IGluIHRoZSBjb25maWcuICBUaGlzIGlzIGJlY2F1c2Ugb24gYW55Ci0gICAgY29ubmVjdGlvbiB0byB0aGUgbWFpbiBzZXJ2ZXIgSVBzIHRoZSBjb25uZWN0aW9uIHZob3N0IHdpbGwgYWx3YXlzIGJlCi0gICAgdGhlIDxTQU1QPl9kZWZhdWx0XzwvU0FNUD4gdmhvc3Qgc2luY2Ugbm9uZSBvZiB0aGUgbmFtZS1iYXNlZCBhcmUKLSAgICBjb25zaWRlcmVkIGR1cmluZyA8Q09ERT5maW5kX3ZpcnR1YWxfc2VydmVyPC9DT0RFPi4KLSAgICA8L1A+Ci0KLTxMST5Zb3Ugc2hvdWxkIG5ldmVyIHNwZWNpZnkgRE5TIG5hbWVzIGluIDxDT0RFPlZpcnR1YWxIb3N0PC9DT0RFPgotICAgIGRpcmVjdGl2ZXMgYmVjYXVzZSBpdCB3aWxsIGZvcmNlIHlvdXIgc2VydmVyIHRvIHJlbHkgb24gRE5TIHRvIGJvb3QuCi0gICAgRnVydGhlcm1vcmUgaXQgcG9zZXMgYSBzZWN1cml0eSB0aHJlYXQgaWYgeW91IGRvIG5vdCBjb250cm9sIHRoZQotICAgIEROUyBmb3IgYWxsIHRoZSBkb21haW5zIGxpc3RlZC4KLSAgICA8QSBIUkVGPSJkbnMtY2F2ZWF0cy5odG1sIj5UaGVyZSdzIG1vcmUgaW5mb3JtYXRpb24KLSAgICBhdmFpbGFibGUgb24gdGhpcyBhbmQgdGhlIG5leHQgdHdvIHRvcGljczwvQT4uCi0gICAgPFA+Ci0KLTxMST48Q09ERT5TZXJ2ZXJOYW1lPC9DT0RFPiBzaG91bGQgYWx3YXlzIGJlIHNldCBmb3IgZWFjaCB2aG9zdC4gIE90aGVyd2lzZQotICAgIEEgRE5TIGxvb2t1cCBpcyByZXF1aXJlZCBmb3IgZWFjaCB2aG9zdC4KLSAgICA8UD4KLQotPExJPkEgRE5TIGxvb2t1cCBpcyBhbHdheXMgcmVxdWlyZWQgZm9yIHRoZSBtYWluX3NlcnZlcidzCi0gICAgPENPREU+U2VydmVyTmFtZTwvQ09ERT4gKG9yIHRvIGdlbmVyYXRlIHRoYXQgaWYgaXQgaXNuJ3Qgc3BlY2lmaWVkCi0gICAgaW4gdGhlIGNvbmZpZykuCi0gICAgPFA+Ci0KLTxMST5JZiBhIDxDT0RFPlNlcnZlclBhdGg8L0NPREU+IGRpcmVjdGl2ZSBleGlzdHMgd2hpY2ggaXMgYSBwcmVmaXggb2YKLSAgICBhbm90aGVyIDxDT0RFPlNlcnZlclBhdGg8L0NPREU+IGRpcmVjdGl2ZSB0aGF0IGFwcGVhcnMgbGF0ZXIgaW4KLSAgICB0aGUgY29uZmlndXJhdGlvbiBmaWxlLCB0aGVuIHRoZSBmb3JtZXIgd2lsbCBhbHdheXMgYmUgbWF0Y2hlZAotICAgIGFuZCB0aGUgbGF0dGVyIHdpbGwgbmV2ZXIgYmUgbWF0Y2hlZC4gIChUaGF0IGlzIGFzc3VtaW5nIHRoYXQgbm8KLSAgICBIb3N0IGhlYWRlciB3YXMgYXZhaWxhYmxlIHRvIGRpc2FtYmlndWF0ZSB0aGUgdHdvLikKLSAgICA8UD4KLQotPExJPklmIGEgdmhvc3QgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgYSBuYW1lLXZob3N0IGluY2x1ZGVzIGEKLSAgICA8Q09ERT5Qb3J0PC9DT0RFPiBzdGF0ZW1lbnQgdGhhdCBkb2Vzbid0IG1hdGNoIHRoZSBtYWluX3NlcnZlcgotICAgIDxDT0RFPlBvcnQ8L0NPREU+IHRoZW4gaXQgd2lsbCBiZSBjb25zaWRlcmVkIGFuIElQLWJhc2VkIHZob3N0LgotICAgIFRoZW4gPENPREU+ZmluZF92aXJ0dWFsX3NlcnZlcjwvQ09ERT4gd2lsbCBtYXRjaCBpdCAoYmVjYXVzZQotICAgIHRoZSBwb3J0cyBhc3NvY2lhdGVkIHdpdGggZWFjaCBhZGRyZXNzIGluIHRoZSBhZGRyZXNzIHNldCBkZWZhdWx0Ci0gICAgdG8gdGhlIHBvcnQgb2YgdGhlIG1haW5fc2VydmVyKSBhcyB0aGUgY29ubmVjdGlvbiB2aG9zdC4gIFRoZW4KLSAgICA8Q09ERT5jaGVja19ob3N0YWxpYXM8L0NPREU+IHdpbGwgcmVmdXNlIHRvIGNoZWNrIGFueSBvdGhlciBuYW1lLWJhc2VkCi0gICAgdmhvc3QgYmVjYXVzZSBvZiB0aGUgcG9ydCBtaXNtYXRjaC4gIFRoZSByZXN1bHQgaXMgdGhhdCB0aGUgdmhvc3QKLSAgICB3aWxsIHN0ZWFsIGFsbCBoaXRzIGdvaW5nIHRvIHRoZSBtYWluX3NlcnZlciBhZGRyZXNzLgotICAgIDxQPgotCi08TEk+SWYgdHdvIElQLWJhc2VkIHZob3N0cyBoYXZlIGFuIGFkZHJlc3MgaW4gY29tbW9uLCB0aGUgdmhvc3QgYXBwZWFyaW5nCi0gICAgbGF0ZXIgaW4gdGhlIGZpbGUgaXMgYWx3YXlzIG1hdGNoZWQuICBTdWNoIGEgdGhpbmcgbWlnaHQgaGFwcGVuCi0gICAgaW5hZHZlcnRlbnRseS4gIElmIHRoZSBjb25maWcgaGFzIG5hbWUtYmFzZWQgdmhvc3RzIGFuZCBmb3Igc29tZSByZWFzb24KLSAgICB0aGUgbWFpbl9zZXJ2ZXIgPENPREU+U2VydmVyTmFtZTwvQ09ERT4gcmVzb2x2ZXMgdG8gdGhlIHdyb25nIGFkZHJlc3MKLSAgICB0aGVuIGFsbCB0aGUgbmFtZS1iYXNlZCB2aG9zdHMgd2lsbCBiZSBwYXJzZWQgYXMgaXAtYmFzZWQgdmhvc3RzLgotICAgIFRoZW4gdGhlIGxhc3Qgb2YgdGhlbSB3aWxsIHN0ZWFsIGFsbCB0aGUgaGl0cy4KLSAgICA8UD4KLQotPExJPlRoZSBsYXN0IG5hbWUtYmFzZWQgdmhvc3QgaW4gdGhlIGNvbmZpZyBpcyBhbHdheXMgbWF0Y2hlZCBmb3IgYW55IGhpdAotICAgIHdoaWNoIGRvZXNuJ3QgbWF0Y2ggb25lIG9mIHRoZSBvdGhlciBuYW1lLWJhc2VkIHZob3N0cy4KLQotPC9VTD4KLQotPEgzPjxBIE5BTUU9IndoYXR3b3JrcyI+V2hhdCBXb3JrczwvQT48L0gzPgotCi08UD5JbiBhZGRpdGlvbiB0byB0aGUgdGlwcyBvbiB0aGUgPEEgSFJFRj0iZG5zLWNhdmVhdHMuaHRtbCN0aXBzIj5ETlMKLUlzc3VlczwvQT4gcGFnZSwgaGVyZSBhcmUgc29tZSBmdXJ0aGVyIHRpcHM6Ci0KLTxVTD4KLQotPExJPlBsYWNlIGFsbCBtYWluX3NlcnZlciBkZWZpbml0aW9ucyBiZWZvcmUgYW55IFZpcnR1YWxIb3N0IGRlZmluaXRpb25zLgotKFRoaXMgaXMgdG8gYWlkIHRoZSByZWFkYWJpbGl0eSBvZiB0aGUgY29uZmlndXJhdGlvbiAtLSB0aGUgcG9zdC1jb25maWcKLW1lcmdpbmcgcHJvY2VzcyBtYWtlcyBpdCBub24tb2J2aW91cyB0aGF0IGRlZmluaXRpb25zIG1peGVkIGluIGFyb3VuZAotdmlydHVhbGhvc3RzIG1pZ2h0IGFmZmVjdCBhbGwgdmlydHVhbGhvc3RzLikKLTxQPgotCi08TEk+QXJyYW5nZSB5b3VyIFZpcnR1YWxIb3N0cyBzdWNoCi10aGF0IGFsbCBuYW1lLWJhc2VkIHZpcnR1YWwgaG9zdHMgY29tZSBmaXJzdCwgZm9sbG93ZWQgYnkgSVAtYmFzZWQKLXZpcnR1YWwgaG9zdHMsIGZvbGxvd2VkIGJ5IGFueSA8U0FNUD5fZGVmYXVsdF88L1NBTVA+IHZpcnR1YWwgaG9zdAotPFA+Ci0KLTxMST5Bdm9pZCA8Q09ERT5TZXJ2ZXJQYXRoczwvQ09ERT4gd2hpY2ggYXJlIHByZWZpeGVzIG9mIG90aGVyCi08Q09ERT5TZXJ2ZXJQYXRoczwvQ09ERT4uICBJZiB5b3UgY2Fubm90IGF2b2lkIHRoaXMgdGhlbiB5b3UgaGF2ZSB0bwotZW5zdXJlIHRoYXQgdGhlIGxvbmdlciAobW9yZSBzcGVjaWZpYykgcHJlZml4IHZob3N0IGFwcGVhcnMgZWFybGllciBpbgotdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB0aGFuIHRoZSBzaG9ydGVyIChsZXNzIHNwZWNpZmljKSBwcmVmaXgKLSg8RU0+aS5lLjwvRU0+LCAmcXVvdDtTZXJ2ZXJQYXRoIC9hYmMmcXVvdDsgc2hvdWxkIGFwcGVhciBhZnRlcgotJnF1b3Q7U2VydmVyUGF0aCAvYWJjZGVmJnF1b3Q7KS4KLTxQPgotCi08TEk+RG8gbm90IHVzZSA8RU0+cG9ydC1iYXNlZDwvRU0+IHZob3N0cyBpbiB0aGUgc2FtZSBzZXJ2ZXIgYXMKLW5hbWUtYmFzZWQgdmhvc3RzLiAgQSBsb29zZSBkZWZpbml0aW9uIGZvciBwb3J0LWJhc2VkIGlzIGEgdmhvc3Qgd2hpY2gKLWlzIGRldGVybWluZWQgYnkgdGhlIHBvcnQgb24gdGhlIHNlcnZlciAoPEVNPmkuZS48L0VNPiwgb25lIHNlcnZlciB3aXRoCi1wb3J0cyA4MDAwLCA4MDgwLCBhbmQgODAgLSBhbGwgb2Ygd2hpY2ggaGF2ZSBkaWZmZXJlbnQgY29uZmlndXJhdGlvbnMpLgotPFA+Ci0KLTwvVUw+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC92aG9zdHMvZXhhbXBsZXMuaHRtbCBiL2RvY3MvbWFudWFsL3Zob3N0cy9leGFtcGxlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjY5N2JjLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL3Zob3N0cy9leGFtcGxlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPjxIRUFEPgotPFRJVExFPlZpcnR1YWxIb3N0IEV4YW1wbGVzPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+VmlydHVhbCBIb3N0IGV4YW1wbGVzIGZvciBjb21tb24gc2V0dXBzPC9IMT4KLQotCi08SDI+QmFzZSBjb25maWd1cmF0aW9uPC9IMj4KLQotPFVMPgotPExJPjxBIEhSRUY9IiNpcCI+SVAtYmFzZWQgdmhvc3RzIG9ubHk8L0E+Ci08TEk+PEEgSFJFRj0iI25hbWUiPk5hbWUtYmFzZWQgdmhvc3RzIG9ubHk8L0E+Ci08TEk+PEEgSFJFRj0iI21peGVkIj5NaXhlZCBuYW1lLS9JUC1iYXNlZCB2aG9zdHM8L0E+Ci08TEk+PEEgSFJFRj0iI3BvcnQiPlBvcnQtYmFzZWQgdmhvc3RzPC9BPgotPC9VTD4KLQotPEgyPkFkZGl0aW9uYWwgZmVhdHVyZXM8L0gyPgotCi08VUw+Ci08TEk+PEEgSFJFRj0iI2RlZmF1bHQiPlVzaW5nIDxDT0RFPl9kZWZhdWx0XzwvQ09ERT4gdmhvc3RzPC9BPgotPExJPjxBIEhSRUY9IiNtaWdyYXRlIj5NaWdyYXRpbmcgYSBuYW1lZC1iYXNlZCB2aG9zdCB0byBhbiBJUC1iYXNlZCB2aG9zdDwvQT4KLTxMST48QSBIUkVGPSIjc2VydmVycGF0aCI+VXNpbmcgdGhlIDxDT0RFPlNlcnZlclBhdGg8L0NPREU+IGRpcmVjdGl2ZTwvQT4KLTwvVUw+Ci0KLTxIUj4KLQotPEgzPjxBIE5BTUU9ImlwIj5JUC1iYXNlZCB2aG9zdHMgb25seTwvQT48L0gzPgotCi08VUw+Ci0KLTxMST48U1RST05HPlNldHVwIDE6PC9TVFJPTkc+Ci0gICAgVGhlIHNlcnZlciBtYWNoaW5lIGhhcyB0d28gSVAgYWRkcmVzc2VzICg8U0FNUD4xMTEuMjIuMzMuNDQ8L1NBTVA+Ci0gICAgYW5kIDxTQU1QPjExMS4yMi4zMy41NTwvU0FNUD4pCi0gICAgd2hpY2ggcmVzb2x2ZSB0byB0aGUgbmFtZXMgPFNBTVA+c2VydmVyLmRvbWFpbi50bGQ8L1NBTVA+IGFuZAotICAgIDxTQU1QPnd3dy5vdGhlcmRvbWFpbi50bGQ8L1NBTVA+IHJlc3BlY3RpdmVseS4KLSAgICBUaGUgaG9zdG5hbWUgPFNBTVA+d3d3LmRvbWFpbi50bGQ8L1NBTVA+IGlzIGFuIGFsaWFzIChDTkFNRSkKLSAgICBmb3IgPFNBTVA+c2VydmVyLmRvbWFpbi50bGQ8L1NBTVA+IGFuZCB3aWxsIHJlcHJlc2VudCB0aGUKLSAgICBtYWluIHNlcnZlci4KLSAgICA8UD4KLSAgICA8U1RST05HPlNlcnZlciBjb25maWd1cmF0aW9uOjwvU1RST05HPgotCi0KLSAgICA8QkxPQ0tRVU9URT48UFJFPgotICAgIC4uLgotICAgIFBvcnQgODAKLSAgICBEb2N1bWVudFJvb3QgL3d3dy9kb21haW4KLSAgICBTZXJ2ZXJOYW1lIHd3dy5kb21haW4udGxkCi0KLSAgICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjU1Jmd0OwotICAgIERvY3VtZW50Um9vdCAvd3d3L290aGVyZG9tYWluCi0gICAgU2VydmVyTmFtZSB3d3cub3RoZXJkb21haW4udGxkCi0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLSAgICA8L1BSRT4KLSAgICA8U0FNUD53d3cub3RoZXJkb21haW4udGxkPC9TQU1QPiBjYW4gb25seSBiZSByZWFjaGVkIHRocm91Z2ggdGhlCi0gICAgYWRkcmVzcyA8U0FNUD4xMTEuMjIuMzMuNTU8L1NBTVA+LCB3aGlsZSA8U0FNUD53d3cuZG9tYWluLnRsZDwvU0FNUD4KLSAgICBjYW4gb25seSBiZSByZWFjaGVkIHRocm91Z2ggPFNBTVA+MTExLjIyLjMzLjQ0PC9TQU1QPgotICAgICh3aGljaCByZXByZXNlbnRzIG91ciBtYWluIHNlcnZlcikuCi0gICAgPC9CTE9DS1FVT1RFPgotICAgIDxQPgotCi08TEk+PFNUUk9ORz5TZXR1cCAyOjwvU1RST05HPgotICAgIFNhbWUgYXMgc2V0dXAgMSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gaGF2ZSBhIGRlZGljYXRlZCBtYWluIHNlcnZlci4KLSAgICA8UD4KLSAgICA8U1RST05HPlNlcnZlciBjb25maWd1cmF0aW9uOjwvU1RST05HPgotCi0gICAgPEJMT0NLUVVPVEU+PFBSRT4KLSAgICAuLi4KLSAgICBQb3J0IDgwCi0gICAgU2VydmVyTmFtZSBzZXJ2ZXIuZG9tYWluLnRsZAotICAgIAotICAgICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQmZ3Q7Ci0gICAgRG9jdW1lbnRSb290IC93d3cvZG9tYWluCi0gICAgU2VydmVyTmFtZSB3d3cuZG9tYWluLnRsZAotICAgIC4uLgotICAgICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci0KLSAgICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjU1Jmd0OwotICAgIERvY3VtZW50Um9vdCAvd3d3L290aGVyZG9tYWluCi0gICAgU2VydmVyTmFtZSB3d3cub3RoZXJkb21haW4udGxkCi0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLSAgICA8L1BSRT4KLSAgICBUaGUgbWFpbiBzZXJ2ZXIgY2FuIG5ldmVyIGNhdGNoIGEgcmVxdWVzdCwgYmVjYXVzZSBhbGwgSVAgYWRkcmVzc2VzCi0gICAgb2Ygb3VyIG1hY2hpbmUgYXJlIGluIHVzZSBmb3IgSVAtYmFzZWQgdmlydHVhbCBob3N0cwotICAgIChvbmx5IDxTQU1QPmxvY2FsaG9zdDwvU0FNUD4gcmVxdWVzdHMgY2FuIGhpdCB0aGUgbWFpbiBzZXJ2ZXIpLgotICAgIDwvQkxPQ0tRVU9URT4KLSAgICA8UD4KLSAgICAKLTxMST48U1RST05HPlNldHVwIDM6PC9TVFJPTkc+Ci0gICAgVGhlIHNlcnZlciBtYWNoaW5lIGhhcyB0d28gSVAgYWRkcmVzc2VzICg8U0FNUD4xMTEuMjIuMzMuNDQ8L1NBTVA+Ci0gICAgYW5kIDxTQU1QPjExMS4yMi4zMy41NTwvU0FNUD4pCi0gICAgd2hpY2ggcmVzb2x2ZSB0byB0aGUgbmFtZXMgPFNBTVA+c2VydmVyLmRvbWFpbi50bGQ8L1NBTVA+IGFuZAotICAgIDxTQU1QPnd3dy1jYWNoZS5kb21haW4udGxkPC9TQU1QPiByZXNwZWN0aXZlbHkuCi0gICAgVGhlIGhvc3RuYW1lIDxTQU1QPnd3dy5kb21haW4udGxkPC9TQU1QPiBpcyBhbiBhbGlhcyAoQ05BTUUpCi0gICAgZm9yIDxTQU1QPnNlcnZlci5kb21haW4udGxkPC9TQU1QPiBhbmQgd2lsbCByZXByZXNlbnQgdGhlCi0gICAgbWFpbiBzZXJ2ZXIuCi0gICAgPFNBTVA+d3d3LWNhY2hlLmRvbWFpbi50bGQ8L1NBTVA+IHdpbGwgYmVjb21lIG91ciBwcm94eS1jYWNoZSAKLSAgICBsaXN0ZW5pbmcgb24gcG9ydCA4MDgwLCB3aGlsZSB0aGUgd2ViIHNlcnZlciBpdHNlbGYgdXNlcyB0aGUgZGVmYXVsdAotICAgIHBvcnQgODAuCi0gICAgPFA+Ci0gICAgPFNUUk9ORz5TZXJ2ZXIgY29uZmlndXJhdGlvbjo8L1NUUk9ORz4KLQotICAgIDxCTE9DS1FVT1RFPjxQUkU+Ci0gICAgLi4uCi0gICAgUG9ydCA4MAotICAgIExpc3RlbiAxMTEuMjIuMzMuNDQ6ODAKLSAgICBMaXN0ZW4gMTExLjIyLjMzLjU1OjgwODAKLSAgICBTZXJ2ZXJOYW1lIHNlcnZlci5kb21haW4udGxkCi0gICAgCi0gICAgJmx0O1ZpcnR1YWxIb3N0IDExMS4yMi4zMy40NDo4MCZndDsKLSAgICBEb2N1bWVudFJvb3QgL3d3dy9kb21haW4KLSAgICBTZXJ2ZXJOYW1lIHd3dy5kb21haW4udGxkCi0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLQotICAgICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNTU6ODA4MCZndDsKLSAgICBTZXJ2ZXJOYW1lIHd3dy1jYWNoZS5kb21haW4udGxkCi0gICAgLi4uCi0gICAgICAmbHQ7RGlyZWN0b3J5IHByb3h5OiZndDsKLSAgICAgIG9yZGVyIGRlbnksYWxsb3cKLSAgICAgIGRlbnkgZnJvbSBhbGwKLSAgICAgIGFsbG93IGZyb20gMTExLjIyLjMzCi0gICAgICAmbHQ7L0RpcmVjdG9yeSZndDsKLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotICAgIDwvUFJFPgotICAgIFRoZSBtYWluIHNlcnZlciBjYW4gbmV2ZXIgY2F0Y2ggYSByZXF1ZXN0LCBiZWNhdXNlIGFsbCBJUCBhZGRyZXNzZXMKLSAgICAoYXBhcnQgZnJvbSA8U0FNUD5sb2NhbGhvc3Q8L1NBTVA+KSBvZiBvdXIgbWFjaGluZSBhcmUgaW4gdXNlIGZvciBJUC1iYXNlZAotICAgIHZpcnR1YWwgaG9zdHMuIFRoZSB3ZWIgc2VydmVyIGNhbiBvbmx5IGJlIHJlYWNoZWQgb24gdGhlIGZpcnN0IGFkZHJlc3MKLSAgICB0aHJvdWdoIHBvcnQgODAgYW5kIHRoZSBwcm94eSBvbmx5IG9uIHRoZSBzZWNvbmQgYWRkcmVzcyB0aHJvdWdoIHBvcnQgODA4MC4KLSAgICA8L0JMT0NLUVVPVEU+Ci08L1VMPgotPEhSPgotCi08SDM+PEEgTkFNRT0ibmFtZSI+TmFtZS1iYXNlZCB2aG9zdHMgb25seTwvQT48L0gzPgotCi08VUw+Ci0KLTxMST48U1RST05HPlNldHVwIDE6PC9TVFJPTkc+Ci0gICAgVGhlIHNlcnZlciBtYWNoaW5lIGhhcyBvbmUgSVAgYWRkcmVzcyAoPFNBTVA+MTExLjIyLjMzLjQ0PC9TQU1QPikKLSAgICB3aGljaCByZXNvbHZlcyB0byB0aGUgbmFtZSA8U0FNUD5zZXJ2ZXIuZG9tYWluLnRsZDwvU0FNUD4uCi0gICAgVGhlcmUgYXJlIHR3byBhbGlhc2VzIChDTkFNRXMpIDxTQU1QPnd3dy5kb21haW4udGxkPC9TQU1QPiBhbmQKLSAgICA8U0FNUD53d3cuc3ViLmRvbWFpbi50bGQ8L1NBTVA+IGZvciB0aGUgYWRkcmVzcyA8U0FNUD4xMTEuMjIuMzMuNDQ8L1NBTVA+LgotICAgIDxQPgotICAgIDxTVFJPTkc+U2VydmVyIGNvbmZpZ3VyYXRpb246PC9TVFJPTkc+Ci0KLSAgICA8QkxPQ0tRVU9URT48UFJFPgotICAgIC4uLgotICAgIFBvcnQgODAKLSAgICBTZXJ2ZXJOYW1lIHNlcnZlci5kb21haW4udGxkCi0KLSAgICBOYW1lVmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0IAotCi0gICAgJmx0O1ZpcnR1YWxIb3N0IDExMS4yMi4zMy40NCZndDsKLSAgICBEb2N1bWVudFJvb3QgL3d3dy9kb21haW4KLSAgICBTZXJ2ZXJOYW1lIHd3dy5kb21haW4udGxkCi0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLSAgICAKLSAgICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0Jmd0OwotICAgIERvY3VtZW50Um9vdCAvd3d3L3N1YmRvbWFpbgotICAgIFNlcnZlck5hbWUgd3d3LnN1Yi5kb21haW4udGxkCi0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsgCi0gICAgPC9QUkU+Ci0gICAgQXBhcnQgZnJvbSA8U0FNUD5sb2NhbGhvc3Q8L1NBTVA+IHRoZXJlIGFyZSBubyB1bnNwZWNpZmllZAotICAgIGFkZHJlc3Nlcy9wb3J0cywgdGhlcmVmb3JlIHRoZSBtYWluIHNlcnZlciBvbmx5IHNlcnZlcwotICAgIDxTQU1QPmxvY2FsaG9zdDwvU0FNUD4gcmVxdWVzdHMuIER1ZSB0byB0aGUgZmFjdAotICAgIHRoYXQgPFNBTVA+d3d3LmRvbWFpbi50bGQ8L1NBTVA+IGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eQotICAgIGl0IGNhbiBiZSBzZWVuIGFzIHRoZSA8Q0lURT5kZWZhdWx0PC9DSVRFPiBvcgotICAgIDxDSVRFPnByaW1hcnk8L0NJVEU+IHNlcnZlci4KLSAgICA8L0JMT0NLUVVPVEU+Ci0gICAgPFA+Ci0gICAKLTxMST48U1RST05HPlNldHVwIDI6PC9TVFJPTkc+Ci0gICAgVGhlIHNlcnZlciBtYWNoaW5lIGhhcyB0d28gSVAgYWRkcmVzc2VzICg8U0FNUD4xMTEuMjIuMzMuNDQ8L1NBTVA+Ci0gICAgYW5kIDxTQU1QPjExMS4yMi4zMy41NTwvU0FNUD4pCi0gICAgd2hpY2ggcmVzb2x2ZSB0byB0aGUgbmFtZXMgPFNBTVA+c2VydmVyMS5kb21haW4udGxkPC9TQU1QPiBhbmQKLSAgICA8U0FNUD5zZXJ2ZXIyLmRvbWFpbi50bGQ8L1NBTVA+IHJlc3BlY3RpdmVseS4KLSAgICBUaGUgYWxpYXMgPFNBTVA+d3d3LmRvbWFpbi50bGQ8L1NBTVA+IHNob3VsZCBiZSB1c2VkIGZvciB0aGUKLSAgICBtYWluIHNlcnZlciB3aGljaCBzaG91bGQgYWxzbyBjYXRjaCBhbnkgdW5zcGVjaWZpZWQgYWRkcmVzc2VzLiAKLSAgICBXZSB3YW50IHRvIHVzZSBhIHZpcnR1YWwgaG9zdCBmb3IgdGhlIGFsaWFzCi0gICAgPFNBTVA+d3d3Lm90aGVyZG9tYWluLnRsZDwvU0FNUD4gYW5kIG9uZSB2aXJ0dWFsIGhvc3Qgc2hvdWxkCi0gICAgY2F0Y2ggYW55IHJlcXVlc3QgdG8gaG9zdG5hbWVzIG9mIHRoZSBmb3JtCi0gICAgPFNBTVA+Ki5zdWIuZG9tYWluLnRsZDwvU0FNUD4gd2l0aCA8U0FNUD53d3cuc3ViLmRvbWFpbi50bGQ8L1NBTVA+Ci0gICAgYXMgaXRzIHNlcnZlciBuYW1lLiBUaGUgYWRkcmVzcyA8U0FNUD4xMTEuMjIuMzMuNTU8L1NBTVA+IHNob3VsZCBiZQotICAgIHVzZWQgZm9yIHRoZSB2aXJ0dWFsIGhvc3RzLgotICAgIDxQPgotICAgIDxTVFJPTkc+U2VydmVyIGNvbmZpZ3VyYXRpb246PC9TVFJPTkc+Ci0KLSAgICA8QkxPQ0tRVU9URT48UFJFPgotICAgIC4uLgotICAgIFBvcnQgODAKLSAgICBTZXJ2ZXJOYW1lIHd3dy5kb21haW4udGxkCi0gICAgRG9jdW1lbnRSb290IC93d3cvZG9tYWluCi0KLSAgICBOYW1lVmlydHVhbEhvc3QgMTExLjIyLjMzLjU1Ci0KLSAgICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjU1Jmd0OwotICAgIERvY3VtZW50Um9vdCAvd3d3L290aGVyZG9tYWluCi0gICAgU2VydmVyTmFtZSB3d3cub3RoZXJkb21haW4udGxkCi0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLSAgIAotICAgICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNTUmZ3Q7Ci0gICAgRG9jdW1lbnRSb290IC93d3cvc3ViZG9tYWluCi0gICAgU2VydmVyTmFtZSB3d3cuc3ViLmRvbWFpbi50bGQKLSAgICBTZXJ2ZXJBbGlhcyAqLnN1Yi5kb21haW4udGxkCi0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsgCi0gICAgPC9QUkU+Ci0gICAgQW55IHJlcXVlc3QgdG8gYW4gYWRkcmVzcyBvdGhlciB0aGFuIDxTQU1QPjExMS4yMi4zMy41NTwvU0FNUD4KLSAgICB3aWxsIGJlIHNlcnZlZCBmcm9tIHRoZSBtYWluIHNlcnZlci4gQSByZXF1ZXN0IHRvCi0gICAgPFNBTVA+MTExLjIyLjMzLjU1PC9TQU1QPiB3aXRoIGFuIHVua25vd24gb3Igbm8gPENPREU+SG9zdDo8L0NPREU+Ci0gICAgaGVhZGVyIHdpbGwgYmUgc2VydmVkIGZyb20gPFNBTVA+d3d3Lm90aGVyZG9tYWluLnRsZDwvU0FNUD4uCi0gICAgPC9CTE9DS1FVT1RFPgotPC9VTD4KLQotPEhSPgotCi08SDM+PEEgTkFNRT0ibWl4ZWQiPk1peGVkIG5hbWUtL0lQLWJhc2VkIHZob3N0czwvQT48L0gzPgotCi08VUw+Ci0KLTxMST48U1RST05HPlNldHVwOjwvU1RST05HPgotICAgIFRoZSBzZXJ2ZXIgbWFjaGluZSBoYXMgdGhyZWUgSVAgYWRkcmVzc2VzICg8U0FNUD4xMTEuMjIuMzMuNDQ8L1NBTVA+LAotICAgIDxTQU1QPjExMS4yMi4zMy41NTwvU0FNUD4gYW5kIDxTQU1QPjExMS4yMi4zMy42NjwvU0FNUD4pCi0gICAgd2hpY2ggcmVzb2x2ZSB0byB0aGUgbmFtZXMgPFNBTVA+c2VydmVyLmRvbWFpbi50bGQ8L1NBTVA+LAotICAgIDxTQU1QPnd3dy5vdGhlcmRvbWFpbjEudGxkPC9TQU1QPiBhbmQgPFNBTVA+d3d3Lm90aGVyZG9tYWluMi50bGQ8L1NBTVA+Ci0gICAgcmVzcGVjdGl2ZWx5LgotICAgIFRoZSBhZGRyZXNzIDxTQU1QPjExMS4yMi4zMy40NDwvU0FNUD4gc2hvdWxkIHdlIHVzZWQgZm9yIGEgY291cGxlCi0gICAgb2YgbmFtZS1iYXNlZCB2aG9zdHMgYW5kIHRoZSBvdGhlciBhZGRyZXNzZXMgZm9yIElQLWJhc2VkIHZob3N0cy4gCi0gICAgPFA+Ci0gICAgPFNUUk9ORz5TZXJ2ZXIgY29uZmlndXJhdGlvbjo8L1NUUk9ORz4KLQotICAgIDxCTE9DS1FVT1RFPjxQUkU+Ci0gICAgLi4uCi0gICAgUG9ydCA4MAotICAgIFNlcnZlck5hbWUgc2VydmVyLmRvbWFpbi50bGQKLQotICAgIE5hbWVWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQKLQotICAgICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQmZ3Q7Ci0gICAgRG9jdW1lbnRSb290IC93d3cvZG9tYWluCi0gICAgU2VydmVyTmFtZSB3d3cuZG9tYWluLnRsZAotICAgIC4uLgotICAgICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci0gICAKLSAgICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0Jmd0OwotICAgIERvY3VtZW50Um9vdCAvd3d3L3N1YmRvbWFpbjEKLSAgICBTZXJ2ZXJOYW1lIHd3dy5zdWIxLmRvbWFpbi50bGQKLSAgICAuLi4KLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OyAKLSAgICAKLSAgICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0Jmd0OwotICAgIERvY3VtZW50Um9vdCAvd3d3L3N1YmRvbWFpbjIKLSAgICBTZXJ2ZXJOYW1lIHd3dy5zdWIyLmRvbWFpbi50bGQKLSAgICAuLi4KLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OyAKLSAKLSAgICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjU1Jmd0OwotICAgIERvY3VtZW50Um9vdCAvd3d3L290aGVyZG9tYWluMQotICAgIFNlcnZlck5hbWUgd3d3Lm90aGVyZG9tYWluMS50bGQKLSAgICAuLi4KLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OyAKLSAgICAKLSAgICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjY2Jmd0OwotICAgIERvY3VtZW50Um9vdCAvd3d3L290aGVyZG9tYWluMgotICAgIFNlcnZlck5hbWUgd3d3Lm90aGVyZG9tYWluMi50bGQKLSAgICAuLi4KLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OyAgICAgCi0gICAgPC9QUkU+PC9CTE9DS1FVT1RFPgotCi08L1VMPgotCi08SFI+Ci0KLTxIMz48QSBOQU1FPSJwb3J0Ij5Qb3J0LWJhc2VkIHZob3N0czwvQT48L0gzPgotCi08VUw+Ci0KLTxMST48U1RST05HPlNldHVwOjwvU1RST05HPgotICAgIFRoZSBzZXJ2ZXIgbWFjaGluZSBoYXMgb25lIElQIGFkZHJlc3MgKDxTQU1QPjExMS4yMi4zMy40NDwvU0FNUD4pCi0gICAgd2hpY2ggcmVzb2x2ZXMgdG8gdGhlIG5hbWUgPFNBTVA+d3d3LmRvbWFpbi50bGQ8L1NBTVA+LgotICAgIElmIHdlIGRvbid0IGhhdmUgdGhlIG9wdGlvbiB0byBnZXQgYW5vdGhlciBhZGRyZXNzIG9yIGFsaWFzCi0gICAgZm9yIG91ciBzZXJ2ZXIgd2UgY2FuIHVzZSBwb3J0LWJhc2VkIHZob3N0cyBpZiB3ZSBuZWVkCi0gICAgYSB2aXJ0dWFsIGhvc3Qgd2l0aCBhIGRpZmZlcmVudCBjb25maWd1cmF0aW9uLgotICAgIDxQPgotICAgIDxTVFJPTkc+U2VydmVyIGNvbmZpZ3VyYXRpb246PC9TVFJPTkc+Ci0KLSAgICA8QkxPQ0tRVU9URT48UFJFPgotICAgIC4uLgotICAgIExpc3RlbiA4MAotICAgIExpc3RlbiA4MDgwCi0gICAgU2VydmVyTmFtZSB3d3cuZG9tYWluLnRsZAotICAgIERvY3VtZW50Um9vdCAvd3d3L2RvbWFpbgotCi0gICAgJmx0O1ZpcnR1YWxIb3N0IDExMS4yMi4zMy40NDo4MDgwJmd0OwotICAgIERvY3VtZW50Um9vdCAvd3d3L2RvbWFpbjIKLSAgICAuLi4KLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotICAgIDwvUFJFPgotICAgIEEgcmVxdWVzdCB0byA8U0FNUD53d3cuZG9tYWluLnRsZDwvU0FNUD4gb24gcG9ydCA4MCBpcyBzZXJ2ZWQKLSAgICBmcm9tIHRoZSBtYWluIHNlcnZlciBhbmQgYSByZXF1ZXN0IHRvIHBvcnQgODA4MCBpcyBzZXJ2ZWQgZnJvbQotICAgIHRoZSB2aXJ0dWFsIGhvc3QuCi0gICAgPC9CTE9DS1FVT1RFPgotPC9VTD4gCi0gICAKLTxIUj4KLQotPEgzPjxBIE5BTUU9ImRlZmF1bHQiPlVzaW5nIDxDT0RFPl9kZWZhdWx0XzwvQ09ERT4gdmhvc3RzPC9BPjwvSDM+Ci0KLTxVTD4KLQotPExJPjxTVFJPTkc+U2V0dXAgMTo8L1NUUk9ORz4gCi0gICAgQ2F0Y2hpbmcgPEVNPmV2ZXJ5PC9FTT4gcmVxdWVzdCB0byBhbnkgdW5zcGVjaWZpZWQgSVAgYWRkcmVzcyBhbmQgcG9ydCwKLSAgICA8RU0+aS5lLjwvRU0+LCBhbiBhZGRyZXNzL3BvcnQgY29tYmluYXRpb24gdGhhdCBpcyBub3QgdXNlZCBmb3IgYW55IG90aGVyCi0gICAgdmlydHVhbCBob3N0LgotICAgIDxQPgotICAgIDxTVFJPTkc+U2VydmVyIGNvbmZpZ3VyYXRpb246PC9TVFJPTkc+Ci0KLSAgICA8QkxPQ0tRVU9URT48UFJFPgotICAgIC4uLgotICAgICZsdDtWaXJ0dWFsSG9zdCBfZGVmYXVsdF86KiZndDsKLSAgICBEb2N1bWVudFJvb3QgL3d3dy9kZWZhdWx0Ci0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLSAgICA8L1BSRT4KLSAgICBVc2luZyBzdWNoIGEgZGVmYXVsdCB2aG9zdCB3aXRoIGEgd2lsZGNhcmQgcG9ydCBlZmZlY3RpdmVseQotICAgIHByZXZlbnRzIGFueSByZXF1ZXN0IGdvaW5nIHRvIHRoZSBtYWluIHNlcnZlci48QlI+Ci0gICAgQSBkZWZhdWx0IHZob3N0IG5ldmVyIHNlcnZlcyBhIHJlcXVlc3QgdGhhdCB3YXMgc2VudCB0byBhbgotICAgIGFkZHJlc3MvcG9ydCB0aGF0IGlzIHVzZWQgZm9yIG5hbWUtYmFzZWQgdmhvc3RzLiBJZiB0aGUgcmVxdWVzdAotICAgIGNvbnRhaW5lZCBhbiB1bmtub3duIG9yIG5vIDxDT0RFPkhvc3Q6PC9DT0RFPiBoZWFkZXIgaXQgaXMKLSAgICBhbHdheXMgc2VydmVkIGZyb20gdGhlIHByaW1hcnkgbmFtZS1iYXNlZCB2aG9zdCAodGhlCi0gICAgdmhvc3QgZm9yIHRoYXQgYWRkcmVzcy9wb3J0IGFwcGVhcmluZyBmaXJzdCBpbiB0aGUgY29uZmlndXJhdGlvbgotICAgIGZpbGUpLjxCUj4KLSAgICBZb3UgY2FuIHVzZQotICAgIDxBIEhSRUY9Ii4uL21vZC9tb2RfYWxpYXMuaHRtbCNhbGlhc21hdGNoIj48Q09ERT5BbGlhc01hdGNoPC9DT0RFPjwvQT4KLSAgICBvcgotICAgIDxBIEhSRUY9Ii4uL21vZC9tb2RfcmV3cml0ZS5odG1sI1Jld3JpdGVSdWxlIj48Q09ERT5SZXdyaXRlUnVsZTwvQ09ERT48L0E+Ci0gICAgdG8gcmV3cml0ZSBhbnkgcmVxdWVzdCB0byBhIHNpbmdsZSBpbmZvcm1hdGlvbiBwYWdlIChvciBzY3JpcHQpLgotICAgIDwvQkxPQ0tRVU9URT4KLSAgICA8UD4KLSAgICAKLTxMST48U1RST05HPlNldHVwIDI6PC9TVFJPTkc+IAotICAgIFNhbWUgYXMgc2V0dXAgMSwgYnV0IHRoZSBzZXJ2ZXIgbGlzdGVucyBvbiBzZXZlcmFsIHBvcnRzIGFuZAotICAgIHdlIHdhbnQgdG8gdXNlIGEgc2Vjb25kIDxDT0RFPl9kZWZhdWx0XzwvQ09ERT4gdmhvc3QgZm9yIHBvcnQgODAuCi0gICAgPFA+Ci0gICAgPFNUUk9ORz5TZXJ2ZXIgY29uZmlndXJhdGlvbjo8L1NUUk9ORz4KLQotICAgIDxCTE9DS1FVT1RFPjxQUkU+Ci0gICAgLi4uCi0gICAgJmx0O1ZpcnR1YWxIb3N0IF9kZWZhdWx0Xzo4MCZndDsKLSAgICBEb2N1bWVudFJvb3QgL3d3dy9kZWZhdWx0ODAKLSAgICAuLi4KLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotICAgIAotICAgICZsdDtWaXJ0dWFsSG9zdCBfZGVmYXVsdF86KiZndDsKLSAgICBEb2N1bWVudFJvb3QgL3d3dy9kZWZhdWx0Ci0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsgICAgCi0gICAgPC9QUkU+Ci0gICAgVGhlIGRlZmF1bHQgdmhvc3QgZm9yIHBvcnQgODAgKHdoaWNoIDxFTT5tdXN0PC9FTT4gYXBwZWFyIGJlZm9yZQotICAgIGFueSBkZWZhdWx0IHZob3N0IHdpdGggYSB3aWxkY2FyZCBwb3J0KSBjYXRjaGVzIGFsbCByZXF1ZXN0cyB0aGF0Ci0gICAgd2VyZSBzZW50IHRvIGFuIHVuc3BlY2lmaWVkIElQIGFkZHJlc3MuIFRoZSBtYWluIHNlcnZlciBpcwotICAgIG5ldmVyIHVzZWQgdG8gc2VydmUgYSByZXF1ZXN0LgotICAgIDwvQkxPQ0tRVU9URT4gICAgCi0gICAgPFA+Ci0gICAgCi08TEk+PFNUUk9ORz5TZXR1cCAzOjwvU1RST05HPiAKLSAgICBXZSB3YW50IHRvIGhhdmUgYSBkZWZhdWx0IHZob3N0IGZvciBwb3J0IDgwLCBidXQgbm8gb3RoZXIgZGVmYXVsdCB2aG9zdHMuCi0gICAgPFA+Ci0gICAgPFNUUk9ORz5TZXJ2ZXIgY29uZmlndXJhdGlvbjo8L1NUUk9ORz4KLQotICAgIDxCTE9DS1FVT1RFPjxQUkU+Ci0gICAgLi4uCi0gICAgJmx0O1ZpcnR1YWxIb3N0IF9kZWZhdWx0Xzo4MCZndDsKLSAgICBEb2N1bWVudFJvb3QgL3d3dy9kZWZhdWx0Ci0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLSAgICA8L1BSRT4KLSAgICBBIHJlcXVlc3QgdG8gYW4gdW5zcGVjaWZpZWQgYWRkcmVzcyBvbiBwb3J0IDgwIGlzIHNlcnZlZCBmcm9tIHRoZQotICAgIGRlZmF1bHQgdmhvc3QgYW55IG90aGVyIHJlcXVlc3QgdG8gYW4gdW5zcGVjaWZpZWQgYWRkcmVzcyBhbmQgcG9ydAotICAgIGlzIHNlcnZlZCBmcm9tIHRoZSBtYWluIHNlcnZlci4KLSAgICA8L0JMT0NLUVVPVEU+Ci0KLTwvVUw+Ci0KLTxIUj4KLQotPEgzPjxBIE5BTUU9Im1pZ3JhdGUiPk1pZ3JhdGluZyBhIG5hbWUtYmFzZWQgdmhvc3QgdG8gYW4gSVAtYmFzZWQgdmhvc3Q8L0E+PC9IMz4KLQotPFVMPgotCi08TEk+PFNUUk9ORz5TZXR1cDo8L1NUUk9ORz4KLSAgICBUaGUgbmFtZS1iYXNlZCB2aG9zdCB3aXRoIHRoZSBob3N0bmFtZQotICAgIDxTQU1QPnd3dy5vdGhlcmRvbWFpbi50bGQ8L1NBTVA+IChmcm9tIG91ciA8QSBIUkVGPSIjbmFtZSI+bmFtZS1iYXNlZDwvQT4KLSAgICBleGFtcGxlLCBzZXR1cCAyKSBzaG91bGQgZ2V0IGl0cyBvd24gSVAgYWRkcmVzcy4KLSAgICBUbyBhdm9pZCBwcm9ibGVtcyB3aXRoIG5hbWUgc2VydmVycyBvciBwcm94aWVzIHdobyBjYWNoZWQgdGhlIG9sZAotICAgIElQIGFkZHJlc3MgZm9yIHRoZSBuYW1lLWJhc2VkIHZob3N0IHdlIHdhbnQgdG8gcHJvdmlkZSBib3RoIHZhcmlhbnRzCi0gICAgZHVyaW5nIGEgbWlncmF0aW9uIHBoYXNlLjxCUj4KLSAgICBUaGUgc29sdXRpb24gaXMgZWFzeSwgYmVjYXVzZSB3ZSBjYW4gc2ltcGx5IGFkZCB0aGUgbmV3IElQIGFkZHJlc3MKLSAgICAoPFNBTVA+MTExLjIyLjMzLjY2PC9TQU1QPikgdG8gdGhlIDxDT0RFPlZpcnR1YWxIb3N0PC9DT0RFPiBkaXJlY3RpdmUuCi0gICAgPFA+Ci0gICAgPFNUUk9ORz5TZXJ2ZXIgY29uZmlndXJhdGlvbjo8L1NUUk9ORz4KLQotICAgIDxCTE9DS1FVT1RFPjxQUkU+Ci0gICAgLi4uCi0gICAgUG9ydCA4MAotICAgIFNlcnZlck5hbWUgd3d3LmRvbWFpbi50bGQKLSAgICBEb2N1bWVudFJvb3QgL3d3dy9kb21haW4KLQotICAgIE5hbWVWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNTUKLQotICAgICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNTUgMTExLjIyLjMzLjY2Jmd0OwotICAgIERvY3VtZW50Um9vdCAvd3d3L290aGVyZG9tYWluCi0gICAgU2VydmVyTmFtZSB3d3cub3RoZXJkb21haW4udGxkCi0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLSAgIAotICAgICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNTUmZ3Q7Ci0gICAgRG9jdW1lbnRSb290IC93d3cvc3ViZG9tYWluCi0gICAgU2VydmVyTmFtZSB3d3cuc3ViLmRvbWFpbi50bGQKLSAgICBTZXJ2ZXJBbGlhcyAqLnN1Yi5kb21haW4udGxkCi0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLSAgICA8L1BSRT4KLSAgICBUaGUgdmhvc3QgY2FuIG5vdyBiZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBuZXcgYWRkcmVzcyAoYXMgYW4gSVAtYmFzZWQKLSAgICB2aG9zdCkgYW5kIHRocm91Z2ggdGhlIG9sZCBhZGRyZXNzIChhcyBhIG5hbWUtYmFzZWQgdmhvc3QpLgotICAgIDwvQkxPQ0tRVU9URT4KLQotPC9VTD4KLQotPEhSPgotCi08SDM+PEEgTkFNRT0ic2VydmVycGF0aCI+VXNpbmcgdGhlIDxDT0RFPlNlcnZlclBhdGg8L0NPREU+IGRpcmVjdGl2ZTwvQT48L0gzPgotCi08VUw+Ci0KLTxMST48U1RST05HPlNldHVwOjwvU1RST05HPgotICAgIFdlIGhhdmUgYSBzZXJ2ZXIgd2l0aCB0d28gbmFtZS1iYXNlZCB2aG9zdHMuIEluIG9yZGVyIHRvIG1hdGNoIHRoZSBjb3JyZWN0Ci0gICAgdmlydHVhbCBob3N0IGEgY2xpZW50IG11c3Qgc2VuZCB0aGUgY29ycmVjdCA8Q09ERT5Ib3N0OjwvQ09ERT4gaGVhZGVyLgotICAgIE9sZCBIVFRQLzEuMCBjbGllbnRzIGRvIG5vdCBzZW5kIHN1Y2ggYSBoZWFkZXIgYW5kIEFwYWNoZSBoYXMgbm8gY2x1ZQotICAgIHdoYXQgdmhvc3QgdGhlIGNsaWVudCB0cmllZCB0byByZWFjaCAoYW5kIHNlcnZlcyB0aGUgcmVxdWVzdCBmcm9tCi0gICAgdGhlIHByaW1hcnkgdmhvc3QpLiBUbyBwcm92aWRlIGFzIG11Y2ggYmFja3dhcmQgY29tcGF0aWJpbGl0eQotICAgIGFzIHBvc3NpYmxlIHdlIGNyZWF0ZSBhIHByaW1hcnkgdmhvc3Qgd2hpY2ggcmV0dXJucyBhIHNpbmdsZSBwYWdlCi0gICAgY29udGFpbmluZyBsaW5rcyB3aXRoIGFuIFVSTCBwcmVmaXggdG8gdGhlIG5hbWUtYmFzZWQgdmlydHVhbCBob3N0cy4KLSAgICA8UD4KLSAgICA8U1RST05HPlNlcnZlciBjb25maWd1cmF0aW9uOjwvU1RST05HPgotCi0gICAgPEJMT0NLUVVPVEU+PFBSRT4KLSAgICAuLi4KLSAgICBOYW1lVmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0Ci0KLSAgICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0Jmd0OwotICAgICMgcHJpbWFyeSB2aG9zdAotICAgIERvY3VtZW50Um9vdCAvd3d3L3N1YmRvbWFpbgotICAgIFJld3JpdGVFbmdpbmUgT24KLSAgICBSZXdyaXRlUnVsZSBeLy4qIC93d3cvc3ViZG9tYWluL2luZGV4Lmh0bWwKLSAgICAuLi4KLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotCi0gICAgJmx0O1ZpcnR1YWxIb3N0IDExMS4yMi4zMy40NCZndDsKLSAgICBEb2N1bWVudFJvb3QgL3d3dy9zdWJkb21haW4vc3ViMQotICAgIFNlcnZlck5hbWUgd3d3LnN1YjEuZG9tYWluLnRsZAotICAgIFNlcnZlclBhdGggL3N1YjEvCi0gICAgUmV3cml0ZUVuZ2luZSBPbgotICAgIFJld3JpdGVSdWxlIF4oL3N1YjEvLiopIC93d3cvc3ViZG9tYWluJDEgCi0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLQotICAgICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQmZ3Q7Ci0gICAgRG9jdW1lbnRSb290IC93d3cvc3ViZG9tYWluL3N1YjIKLSAgICBTZXJ2ZXJOYW1lIHd3dy5zdWIyLmRvbWFpbi50bGQKLSAgICBTZXJ2ZXJQYXRoIC9zdWIyLwotICAgIFJld3JpdGVFbmdpbmUgT24KLSAgICBSZXdyaXRlUnVsZSBeKC9zdWIyLy4qKSAvd3d3L3N1YmRvbWFpbiQxIAotICAgIC4uLgotICAgICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci0gICAgPC9QUkU+Ci0gICAgRHVlIHRvIHRoZSA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcnBhdGgiPjxDT0RFPlNlcnZlclBhdGg8L0NPREU+PC9BPgotICAgIGRpcmVjdGl2ZSBhIHJlcXVlc3QgdG8gdGhlCi0gICAgVVJMIDxTQU1QPmh0dHA6Ly93d3cuc3ViMS5kb21haW4udGxkL3N1YjEvPC9TQU1QPiBpcyA8RU0+YWx3YXlzPC9FTT4KLSAgICBzZXJ2ZWQgZnJvbSB0aGUgc3ViMS12aG9zdC4gPEJSPgotICAgIEEgcmVxdWVzdCB0byB0aGUgVVJMIDxTQU1QPmh0dHA6Ly93d3cuc3ViMS5kb21haW4udGxkLzwvU0FNUD4KLSAgICBpcyBvbmx5IHNlcnZlZCBmcm9tIHRoZSBzdWIxLXZob3N0IGlmIHRoZSBjbGllbnQgc2VudCBhIGNvcnJlY3QKLSAgICA8Q09ERT5Ib3N0OjwvQ09ERT4gaGVhZGVyLgotICAgIElmIG5vIDxDT0RFPkhvc3Q6PC9DT0RFPiBoZWFkZXIgaXMgc2VudCB0aGUgY2xpZW50IGdldHMgdGhlCi0gICAgaW5mb3JtYXRpb24gcGFnZSBmcm9tIHRoZSBwcmltYXJ5IGhvc3QuPEJSPgotICAgIFBsZWFzZSBub3RlIHRoYXQgdGhlcmUgaXMgb25lIG9kZGl0eTogQSByZXF1ZXN0IHRvCi0gICAgPFNBTVA+aHR0cDovL3d3dy5zdWIyLmRvbWFpbi50bGQvc3ViMS88L1NBTVA+IGlzIGFsc28gc2VydmVkIGZyb20KLSAgICB0aGUgc3ViMS12aG9zdCBpZiB0aGUgY2xpZW50IHNlbnQgbm8gPENPREU+SG9zdDo8L0NPREU+IGhlYWRlci4gPEJSPgotICAgIFRoZSA8Q09ERT5SZXdyaXRlUnVsZTwvQ09ERT4gZGlyZWN0aXZlcyBhcmUgdXNlZCB0byBtYWtlIHN1cmUgdGhhdAotICAgIGEgY2xpZW50IHdoaWNoIHNlbnQgYSBjb3JyZWN0IDxDT0RFPkhvc3Q6PC9DT0RFPiBoZWFkZXIgY2FuIHVzZQotICAgIGJvdGggVVJMIHZhcmlhbnRzLCA8RU0+aS5lLjwvRU0+LCB3aXRoIG9yIHdpdGhvdXQgVVJMIHByZWZpeC4KLSAgICA8L0JMT0NLUVVPVEU+Ci0KLTwvVUw+IAotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvdmhvc3RzL2ZkLWxpbWl0cy5odG1sIGIvZG9jcy9tYW51YWwvdmhvc3RzL2ZkLWxpbWl0cy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjlkMGY5Li4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL3Zob3N0cy9mZC1saW1pdHMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIFNlcnZlciBWaXJ0dWFsIEhvc3QgU3VwcG9ydDwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPkZpbGUgRGVzY3JpcHRvciBMaW1pdHM8L0gxPgotCi08UD4KLVdoZW4gdXNpbmcgYSBsYXJnZSBudW1iZXIgb2YgVmlydHVhbCBIb3N0cywgQXBhY2hlIG1heSBydW4gb3V0IG9mIGF2YWlsYWJsZQotZmlsZSBkZXNjcmlwdG9ycyAoc29tZXRpbWVzIGNhbGxlZCA8Q0lURT5maWxlIGhhbmRsZXM8L0NJVEU+IGlmIGVhY2ggVmlydHVhbAotSG9zdCBzcGVjaWZpZXMgZGlmZmVyZW50IGxvZyBmaWxlcy4KLVRoZSB0b3RhbCBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyB1c2VkIGJ5IEFwYWNoZSBpcyBvbmUgZm9yIGVhY2ggZGlzdGluY3QKLWVycm9yIGxvZyBmaWxlLCBvbmUgZm9yIGV2ZXJ5IG90aGVyIGxvZyBmaWxlIGRpcmVjdGl2ZSwgcGx1cyAxMC0yMCBmb3IKLWludGVybmFsIHVzZS4gVW5peCBvcGVyYXRpbmcgc3lzdGVtcyBsaW1pdCB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgdGhhdAotbWF5IGJlIHVzZWQgYnkgYSBwcm9jZXNzOyB0aGUgbGltaXQgaXMgdHlwaWNhbGx5IDY0LCBhbmQgbWF5IHVzdWFsbHkgYmUKLWluY3JlYXNlZCB1cCB0byBhIGxhcmdlIGhhcmQtbGltaXQuCi08UD4KLUFsdGhvdWdoIEFwYWNoZSBhdHRlbXB0cyB0byBpbmNyZWFzZSB0aGUgbGltaXQgYXMgcmVxdWlyZWQsIHRoaXMKLW1heSBub3Qgd29yayBpZjoKLTxPTD4KLTxMST5Zb3VyIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBzZXRybGltaXQoKSBzeXN0ZW0gY2FsbC4KLTxMST5UaGUgc2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUpIGNhbGwgZG9lcyBub3QgZnVuY3Rpb24gb24geW91ciBzeXN0ZW0KLSAoc3VjaCBhcyBTb2xhcmlzIDIuMykKLTxMST5UaGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgcmVxdWlyZWQgZXhjZWVkcyB0aGUgaGFyZCBsaW1pdC4KLTxMST5Zb3VyIHN5c3RlbSBpbXBvc2VzIG90aGVyIGxpbWl0cyBvbiBmaWxlIGRlc2NyaXB0b3JzLCBzdWNoIGFzIGEgbGltaXQKLW9uIHN0ZGlvIHN0cmVhbXMgb25seSB1c2luZyBmaWxlIGRlc2NyaXB0b3JzIGJlbG93IDI1Ni4gKFNvbGFyaXMgMikKLTwvT0w+Ci0KLUluIHRoZSBldmVudCBvZiBwcm9ibGVtcyB5b3UgY2FuOgotPFVMPgotPExJPlJlZHVjZSB0aGUgbnVtYmVyIG9mIGxvZyBmaWxlczsgZG9uJ3Qgc3BlY2lmeSBsb2cgZmlsZXMgaW4gdGhlIFZpcnR1YWxIb3N0Ci1zZWN0aW9ucywgYnV0IG9ubHkgbG9nIHRvIHRoZSBtYWluIGxvZyBmaWxlcy4KLTxMST5JZiB5b3Ugc3lzdGVtIGZhbGxzIGludG8gMSBvciAyIChhYm92ZSksIHRoZW4gaW5jcmVhc2UgdGhlIGZpbGUgZGVzY3JpcHRvcgotbGltaXQgYmVmb3JlIHN0YXJ0aW5nIEFwYWNoZSwgdXNpbmcgYSBzY3JpcHQgbGlrZQotPEJMT0NLUVVPVEU+PENPREU+Ci0jIS9iaW4vc2ggPEJSPgotdWxpbWl0IC1TIC1uIDEwMCA8QlI+Ci1leGVjIGh0dHBkPC9DT0RFPjwvQkxPQ0tRVU9URT4KLTwvVUw+Ci08UD4KLVBsZWFzZSBzZWUgdGhlCi08QSBIUkVGPSIuLi9taXNjL2Rlc2NyaXB0b3JzLmh0bWwiPkRlc2NyaXB0b3JzIGFuZCBBcGFjaGU8L0E+Ci1kb2N1bWVudCBjb250YWluaW5nIGZ1cnRoZXIgZGV0YWlscyBhYm91dCBmaWxlIGRlc2NyaXB0b3IgcHJvYmxlbXMgYW5kIGhvdwotdGhleSBjYW4gYmUgc29sdmVkIG9uIHlvdXIgb3BlcmF0aW5nIHN5c3RlbS4KLTwvUD4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT48L0hUTUw+Ci0KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3Zob3N0cy9mZC1saW1pdHMuaHRtbC5lbiBiL2RvY3MvbWFudWFsL3Zob3N0cy9mZC1saW1pdHMuaHRtbC5lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI5ZDBmOS4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC92aG9zdHMvZmQtbGltaXRzLmh0bWwuZW4KKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSBTZXJ2ZXIgVmlydHVhbCBIb3N0IFN1cHBvcnQ8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5GaWxlIERlc2NyaXB0b3IgTGltaXRzPC9IMT4KLQotPFA+Ci1XaGVuIHVzaW5nIGEgbGFyZ2UgbnVtYmVyIG9mIFZpcnR1YWwgSG9zdHMsIEFwYWNoZSBtYXkgcnVuIG91dCBvZiBhdmFpbGFibGUKLWZpbGUgZGVzY3JpcHRvcnMgKHNvbWV0aW1lcyBjYWxsZWQgPENJVEU+ZmlsZSBoYW5kbGVzPC9DSVRFPiBpZiBlYWNoIFZpcnR1YWwKLUhvc3Qgc3BlY2lmaWVzIGRpZmZlcmVudCBsb2cgZmlsZXMuCi1UaGUgdG90YWwgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgdXNlZCBieSBBcGFjaGUgaXMgb25lIGZvciBlYWNoIGRpc3RpbmN0Ci1lcnJvciBsb2cgZmlsZSwgb25lIGZvciBldmVyeSBvdGhlciBsb2cgZmlsZSBkaXJlY3RpdmUsIHBsdXMgMTAtMjAgZm9yCi1pbnRlcm5hbCB1c2UuIFVuaXggb3BlcmF0aW5nIHN5c3RlbXMgbGltaXQgdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIHRoYXQKLW1heSBiZSB1c2VkIGJ5IGEgcHJvY2VzczsgdGhlIGxpbWl0IGlzIHR5cGljYWxseSA2NCwgYW5kIG1heSB1c3VhbGx5IGJlCi1pbmNyZWFzZWQgdXAgdG8gYSBsYXJnZSBoYXJkLWxpbWl0LgotPFA+Ci1BbHRob3VnaCBBcGFjaGUgYXR0ZW1wdHMgdG8gaW5jcmVhc2UgdGhlIGxpbWl0IGFzIHJlcXVpcmVkLCB0aGlzCi1tYXkgbm90IHdvcmsgaWY6Ci08T0w+Ci08TEk+WW91ciBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgc2V0cmxpbWl0KCkgc3lzdGVtIGNhbGwuCi08TEk+VGhlIHNldHJsaW1pdChSTElNSVRfTk9GSUxFKSBjYWxsIGRvZXMgbm90IGZ1bmN0aW9uIG9uIHlvdXIgc3lzdGVtCi0gKHN1Y2ggYXMgU29sYXJpcyAyLjMpCi08TEk+VGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIHJlcXVpcmVkIGV4Y2VlZHMgdGhlIGhhcmQgbGltaXQuCi08TEk+WW91ciBzeXN0ZW0gaW1wb3NlcyBvdGhlciBsaW1pdHMgb24gZmlsZSBkZXNjcmlwdG9ycywgc3VjaCBhcyBhIGxpbWl0Ci1vbiBzdGRpbyBzdHJlYW1zIG9ubHkgdXNpbmcgZmlsZSBkZXNjcmlwdG9ycyBiZWxvdyAyNTYuIChTb2xhcmlzIDIpCi08L09MPgotCi1JbiB0aGUgZXZlbnQgb2YgcHJvYmxlbXMgeW91IGNhbjoKLTxVTD4KLTxMST5SZWR1Y2UgdGhlIG51bWJlciBvZiBsb2cgZmlsZXM7IGRvbid0IHNwZWNpZnkgbG9nIGZpbGVzIGluIHRoZSBWaXJ0dWFsSG9zdAotc2VjdGlvbnMsIGJ1dCBvbmx5IGxvZyB0byB0aGUgbWFpbiBsb2cgZmlsZXMuCi08TEk+SWYgeW91IHN5c3RlbSBmYWxscyBpbnRvIDEgb3IgMiAoYWJvdmUpLCB0aGVuIGluY3JlYXNlIHRoZSBmaWxlIGRlc2NyaXB0b3IKLWxpbWl0IGJlZm9yZSBzdGFydGluZyBBcGFjaGUsIHVzaW5nIGEgc2NyaXB0IGxpa2UKLTxCTE9DS1FVT1RFPjxDT0RFPgotIyEvYmluL3NoIDxCUj4KLXVsaW1pdCAtUyAtbiAxMDAgPEJSPgotZXhlYyBodHRwZDwvQ09ERT48L0JMT0NLUVVPVEU+Ci08L1VMPgotPFA+Ci1QbGVhc2Ugc2VlIHRoZQotPEEgSFJFRj0iLi4vbWlzYy9kZXNjcmlwdG9ycy5odG1sIj5EZXNjcmlwdG9ycyBhbmQgQXBhY2hlPC9BPgotZG9jdW1lbnQgY29udGFpbmluZyBmdXJ0aGVyIGRldGFpbHMgYWJvdXQgZmlsZSBkZXNjcmlwdG9yIHByb2JsZW1zIGFuZCBob3cKLXRoZXkgY2FuIGJlIHNvbHZlZCBvbiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0uCi08L1A+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+PC9IVE1MPgotCmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC92aG9zdHMvZm9vdGVyLmh0bWwgYi9kb2NzL21hbnVhbC92aG9zdHMvZm9vdGVyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZTc0NWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvdmhvc3RzL2Zvb3Rlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08SFI+Ci0KLTxIMyBBTElHTj0iQ0VOVEVSIj4KLSBBcGFjaGUgSFRUUCBTZXJ2ZXIgVmVyc2lvbiAxLjMKLTwvSDM+Ci0KLTxBIEhSRUY9Ii4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2luZGV4LmdpZiIgQUxUPSJJbmRleCI+PC9BPgotPEEgSFJFRj0iLi4vIj48SU1HIFNSQz0iLi4vaW1hZ2VzL2hvbWUuZ2lmIiBBTFQ9IkhvbWUiPjwvQT4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3Zob3N0cy9oZWFkZXIuaHRtbCBiL2RvY3MvbWFudWFsL3Zob3N0cy9oZWFkZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2MjMwMC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC92aG9zdHMvaGVhZGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTxESVYgQUxJR049IkNFTlRFUiI+Ci0gPElNRyBTUkM9Ii4uL2ltYWdlcy9zdWIuZ2lmIiBBTFQ9IltBUEFDSEUgRE9DVU1FTlRBVElPTl0iPgotIDxIMz4KLSAgQXBhY2hlIEhUVFAgU2VydmVyIFZlcnNpb24gMS4zCi0gPC9IMz4KLTwvRElWPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvdmhvc3RzL2hvc3QuaHRtbCBiL2RvY3MvbWFudWFsL3Zob3N0cy9ob3N0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ODg2NzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvdmhvc3RzL2hvc3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD48SEVBRD4KLTxUSVRMRT5BcGFjaGUgbm9uLUlQIFZpcnR1YWwgSG9zdHM8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5BcGFjaGUgbm9uLUlQIFZpcnR1YWwgSG9zdHM8L0gxPgotCi08U1RST05HPlNlZSBBbHNvOjwvU1RST05HPgotPEEgSFJFRj0idmlydHVhbC1ob3N0Lmh0bWwiPlZpcnR1YWwgSG9zdCBTdXBwb3J0PC9BPgotCi08SFI+Ci0KLTxIMj5XaGF0IGlzIGEgVmlydHVhbCBIb3N0PC9IMj4KLQotPFA+VGhlICJWaXJ0dWFsIEhvc3QiIHJlZmVycyB0byB0aGUgcHJhY3RpY2Ugb2YgbWFpbnRhaW5pbmcgbW9yZSB0aGFuCi1vbmUgc2VydmVyIG9uIG9uZSBtYWNoaW5lLCBhcyBkaWZmZXJlbnRpYXRlZCBieSB0aGVpciBhcHBhcmVudAotaG9zdG5hbWUuIEZvciBleGFtcGxlLCBpdCBpcyBvZnRlbiBkZXNpcmFibGUgZm9yIGNvbXBhbmllcyBzaGFyaW5nIGEKLXdlYiBzZXJ2ZXIgdG8gaGF2ZSB0aGVpciBvd24gZG9tYWlucywgd2l0aCB3ZWIgc2VydmVycyBhY2Nlc3NpYmxlIGFzCi08Q09ERT53d3cuY29tcGFueTEuY29tPC9DT0RFPiBhbmQgPENPREU+d3d3LmNvbXBhbnkyLmNvbTwvQ09ERT4sCi13aXRob3V0IHJlcXVpcmluZyB0aGUgdXNlciB0byBrbm93IGFueSBleHRyYSBwYXRoIGluZm9ybWF0aW9uLjwvUD4KLQotPFA+QXBhY2hlIHdhcyBvbmUgb2YgdGhlIGZpcnN0IHNlcnZlcnMgdG8gc3VwcG9ydCB2aXJ0dWFsIGhvc3RzIHJpZ2h0Ci1vdXQgb2YgdGhlIGJveCwgYnV0IHNpbmNlIHRoZSBiYXNlIDxDT0RFPkhUVFA8L0NPREU+IChIeXBlclRleHQKLVRyYW5zcG9ydCBQcm90b2NvbCkgc3RhbmRhcmQgZG9lcyBub3QgYWxsb3cgYW55IG1ldGhvZCBmb3IgdGhlIHNlcnZlcgotdG8gZGV0ZXJtaW5lIHRoZSBob3N0bmFtZSBpdCBpcyBiZWluZyBhZGRyZXNzZWQgYXMsIEFwYWNoZSdzIHZpcnR1YWwKLWhvc3Qgc3VwcG9ydCBoYXMgcmVxdWlyZWQgYSBzZXBhcmF0ZSBJUCBhZGRyZXNzIGZvciBlYWNoCi1zZXJ2ZXIuIERvY3VtZW50YXRpb24gb24gdXNpbmcgdGhpcyBhcHByb2FjaCAod2hpY2ggc3RpbGwgd29ya3MgdmVyeQotd2VsbCkgPEEgSFJFRj0idmlydHVhbC1ob3N0Lmh0bWwiPmlzIGF2YWlsYWJsZTwvQT4uCi0KLTxQPldoaWxlIHRoZSBhcHByb2FjaCBkZXNjcmliZWQgYWJvdmUgd29ya3MsIHdpdGggdGhlIGF2YWlsYWJsZSBJUAotYWRkcmVzcyBzcGFjZSBncm93aW5nIHNtYWxsZXIsIGFuZCB0aGUgbnVtYmVyIG9mIGRvbWFpbnMgaW5jcmVhc2luZywKLWl0IGlzIG5vdCB0aGUgbW9zdCBlbGVnYW50IHNvbHV0aW9uLCBhbmQgaXMgaGFyZCB0byBpbXBsZW1lbnQgb24gc29tZQotbWFjaGluZXMuIFRoZSA8Q09ERT5IVFRQLzEuMTwvQ09ERT4gcHJvdG9jb2wgY29udGFpbnMgYSBtZXRob2QgZm9yIHRoZQotc2VydmVyIHRvIGlkZW50aWZ5IHdoYXQgbmFtZSBpdCBpcyBiZWluZyBhZGRyZXNzZWQgYXMuIEFwYWNoZSAxLjEgYW5kCi1sYXRlciBzdXBwb3J0IHRoaXMgYXBwcm9hY2ggYXMgd2VsbCBhcyB0aGUgdHJhZGl0aW9uYWwKLUlQLWFkZHJlc3MtcGVyLWhvc3RuYW1lIG1ldGhvZC48L1A+Ci0KLTxQPlRoZSBiZW5lZml0cyBvZiB1c2luZyB0aGUgbmV3IHZpcnR1YWwgaG9zdCBzdXBwb3J0IGlzIGEgcHJhY3RpY2FsbHkKLXVubGltaXRlZCBudW1iZXIgb2Ygc2VydmVycywgZWFzZSBvZiBjb25maWd1cmF0aW9uIGFuZCB1c2UsIGFuZAotcmVxdWlyZXMgbm8gYWRkaXRpb25hbCBoYXJkd2FyZSBvciBzb2Z0d2FyZS4gVGhlIG1haW4gZGlzYWR2YW50YWdlIGlzCi10aGF0IHRoZSB1c2VyJ3MgYnJvd3NlciBtdXN0IHN1cHBvcnQgdGhpcyBwYXJ0IG9mIHRoZSBwcm90b2NvbC4gVGhlCi1sYXRlc3QgdmVyc2lvbnMgb2YgbWFueSBicm93c2VycyAoaW5jbHVkaW5nIE5ldHNjYXBlIE5hdmlnYXRvciAyLjAgYW5kCi1sYXRlcikgZG8sIGJ1dCBtYW55IGJyb3dzZXJzLCBlc3BlY2lhbGx5IG9sZGVyIG9uZXMsIGRvIG5vdC4gVGhpcyBjYW4KLWNhdXNlIHByb2JsZW1zLCBhbHRob3VnaCBhIHBvc3NpYmxlIHNvbHV0aW9uIGlzIGFkZHJlc3NlZCBiZWxvdy48L1A+Ci0KLTxIMj5Vc2luZyBub24tSVAgVmlydHVhbCBIb3N0czwvSDI+Ci0KLTxQPlVzaW5nIHRoZSBuZXcgdmlydHVhbCBob3N0cyBpcyBxdWl0ZSBlYXN5LCBhbmQgc3VwZXJmaWNpYWxseSBsb29rcwotbGlrZSB0aGUgb2xkIG1ldGhvZC4gWW91IHNpbXBseSBhZGQgdG8gb25lIG9mIHRoZSBBcGFjaGUgY29uZmlndXJhdGlvbgotZmlsZXMgKG1vc3QgbGlrZWx5IDxDT0RFPmh0dHBkLmNvbmY8L0NPREU+IG9yIDxDT0RFPnNybS5jb25mPC9DT0RFPikKLWNvZGUgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nOjwvUD4KLTxQUkU+Ci0gICAgJmx0O1ZpcnR1YWxIb3N0IHd3dy5hcGFjaGUub3JnJmd0OwotICAgIFNlcnZlck5hbWUgd3d3LmFwYWNoZS5vcmcKLSAgICBEb2N1bWVudFJvb3QgL3Vzci93ZWIvYXBhY2hlCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLTwvUFJFPgotCi08UD5PZiBjb3Vyc2UsIGFueSBhZGRpdGlvbmFsIGRpcmVjdGl2ZXMgY2FuIChhbmQgc2hvdWxkKSBiZSBwbGFjZWQKLWludG8gdGhlIDxDT0RFPiZsdDtWaXJ0dWFsSG9zdCZndDs8L0NPREU+IHNlY3Rpb24uIFRvIG1ha2UgdGhpcyB3b3JrLAotYWxsIHRoYXQgaXMgbmVlZGVkIGlzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSA8Q09ERT53d3cuYXBhY2hlLm9yZzwvQ09ERT4KLUROUyBlbnRyeSBwb2ludHMgdG8gdGhlIHNhbWUgSVAgYWRkcmVzcyBhcyB0aGUgbWFpbgotc2VydmVyLiBPcHRpb25hbGx5LCB5b3UgY291bGQgc2ltcGx5IHVzZSB0aGF0IElQIGFkZHJlc3MgaW4gdGhlCi0mbHQ7VmlydHVhbEhvc3QmZ3Q7IGVudHJ5LjwvUD4KLQotPFA+QWRkaXRpb25hbGx5LCBtYW55IHNlcnZlcnMgbWF5IHdpc2ggdG8gYmUgYWNjZXNzaWJsZSBieSBtb3JlIHRoYW4KLW9uZSBuYW1lLiBGb3IgZXhhbXBsZSwgdGhlIEFwYWNoZSBzZXJ2ZXIgbWlnaHQgd2FudCB0byBiZSBhY2Nlc3NpYmxlCi1hcyA8Q09ERT5hcGFjaGUub3JnPC9DT0RFPiwgb3IgPENPREU+ZnRwLmFwYWNoZS5vcmc8L0NPREU+LCBhc3N1bWluZwotdGhlIElQIGFkZHJlc3NlcyBwb2ludGVkIHRvIHRoZSBzYW1lIHNlcnZlci4gSW4gZmFjdCwgb25lIG1pZ2h0IHdhbnQgaXQKLXNvIHRoYXQgYWxsIGFkZHJlc3NlcyBhdCA8Q09ERT5hcGFjaGUub3JnPC9DT0RFPiB3ZXJlIHBpY2tlZCB1cCBieSB0aGUKLXNlcnZlci4gVGhpcyBpcyBwb3NzaWJsZSB3aXRoIHRoZSA8Q09ERT5TZXJ2ZXJBbGlhczwvQ09ERT4KLWRpcmVjdGl2ZSwgcGxhY2VkIGluc2lkZSB0aGUgJmx0O1ZpcnR1YWxIb3N0Jmd0OyBzZWN0aW9uLiBGb3IKLWV4YW1wbGU6PC9QPgotCi08UFJFPgotICAgIFNlcnZlckFsaWFzIGFwYWNoZS5vcmcgKi5hcGFjaGUub3JnCi08L1BSRT4KLQotPFA+Tm90ZSB0aGF0IHlvdSBjYW4gdXNlIDxDT0RFPio8L0NPREU+IGFuZCA8Q09ERT4/PC9DT0RFPiBhcyB3aWxkLWNhcmQKLWNoYXJhY3RlcnMuPC9QPgotCi08UD5Zb3UgYWxzbyBtaWdodCBuZWVkIFNlcnZlckFsaWFzIGlmIHlvdSBhcmUgc2VydmluZyBsb2NhbCB1c2VycyB3aG8KLWRvIG5vdCBhbHdheXMgaW5jbHVkZSB0aGUgZG9tYWluIG5hbWUuICBGb3IgZXhhbXBsZSwgaWYgbG9jYWwgdXNlcnMgYXJlCi1mYW1pbGlhciB3aXRoIHR5cGluZyAid3d3IiBvciAid3d3LnBoeXNpY3MiIHRoZW4geW91IHdpbGwgbmVlZCB0byBhZGQKLTxDT0RFPlNlcnZlckFsaWFzIHd3dyB3d3cucGh5c2ljczwvQ09ERT4uICBJdCBpc24ndCBwb3NzaWJsZSBmb3IgdGhlCi1zZXJ2ZXIgdG8ga25vdyB3aGF0IGRvbWFpbiB0aGUgY2xpZW50IHVzZXMgZm9yIHRoZWlyIG5hbWUgcmVzb2x1dGlvbgotYmVjYXVzZSB0aGUgY2xpZW50IGRvZXNuJ3QgcHJvdmlkZSB0aGF0IGluZm9ybWF0aW9uIGluIHRoZSByZXF1ZXN0LjwvUD4KLQotPEgyPlNlY3VyaXR5IENvbnNpZGVyYXRpb25zPC9IMj4KLQotQXBhY2hlIGFsbG93cyBhbGwgdmlydHVhbCBob3N0cyB0byBiZSBtYWRlIGFjY2Vzc2libGUgdmlhIHRoZQotPENPREU+SG9zdDo8L0NPREU+IGhlYWRlciB0aHJvdWdoIGFsbCBJUCBpbnRlcmZhY2VzLCBldmVuIHRob3NlIHdoaWNoCi1hcmUgY29uZmlndXJlZCB0byB1c2UgZGlmZmVyZW50IElQIGludGVyZmFjZXMuICBGb3IgZXhhbXBsZSwgaWYgdGhlCi1jb25maWd1cmF0aW9uIGZvciA8Q09ERT53d3cuZm9vLmNvbTwvQ09ERT4gY29udGFpbmVkIGEgdmlydHVhbCBob3N0Ci1zZWN0aW9uIGZvciA8Q09ERT53d3cuYmFyLmNvbTwvQ09ERT4sIGFuZCA8Q09ERT53d3cuYmFyLmNvbTwvQ09ERT4gd2FzCi1hIHNlcGFyYXRlIElQIGludGVyZmFjZSwgc3VjaCB0aGF0Ci1ub24tPENPREU+SG9zdDo8L0NPREU+LWhlYWRlci1zdXBwb3J0aW5nIGJyb3dzZXJzIGNhbiB1c2UgaXQsIGFzCi1iZWZvcmUgd2l0aCBBcGFjaGUgMS4wLiAgSWYgYSByZXF1ZXN0IGlzIG1hZGUgdG8KLTxDT0RFPnd3dy5mb28uY29tPC9DT0RFPiBhbmQgdGhlIHJlcXVlc3QgaW5jbHVkZXMgdGhlIGhlYWRlcgotPENPREU+SG9zdDogd3d3LmJhci5jb208L0NPREU+LCBhIHBhZ2UgZnJvbSA8Q09ERT53d3cuYmFyLmNvbTwvQ09ERT4KLXdpbGwgYmUgc2VudC4KLQotPFA+Ci0KLVRoaXMgaXMgYSBzZWN1cml0eSBjb25jZXJuIGlmIHlvdSBhcmUgY29udHJvbGxpbmcgYWNjZXNzIHRvIGEKLXBhcnRpY3VsYXIgc2VydmVyIGJhc2VkIG9uIElQLWxheWVyIGNvbnRyb2xzLCBzdWNoIGFzIGZyb20gd2l0aGluIGEKLWZpcmV3YWxsIG9yIHJvdXRlci4gIExldCdzIHNheSA8Q09ERT53d3cuYmFyLmNvbTwvQ09ERT4gaW4gdGhlIGFib3ZlCi1leGFtcGxlIHdhcyBpbnN0ZWFkIGFuIGludHJhLW5ldCBzZXJ2ZXIgY2FsbGVkCi08Q09ERT5wcml2YXRlLmZvby5jb208L0NPREU+LCBhbmQgdGhlIHJvdXRlciB1c2VkIGJ5IGZvby5jb20gb25seSBsZXQKLWludGVybmFsIHVzZXJzIGFjY2VzcyA8Q09ERT5wcml2YXRlLmZvby5jb208L0NPREU+LiAgT2J2aW91c2x5LAotPENPREU+SG9zdDo8L0NPREU+IGhlYWRlciBmdW5jdGlvbmFsaXR5IG5vdyBhbGxvd3Mgc29tZW9uZSB3aG8gaGFzCi1hY2Nlc3MgdG8gPENPREU+d3d3LmZvby5jb208L0NPREU+IHRvIGdldAotPENPREU+cHJpdmF0ZS5mb28uY29tPC9DT0RFPiwgaWYgdGhleSBzZW5kIGEgPENPREU+SG9zdDoKLXByaXZhdGUuZm9vLmNvbTwvQ09ERT4gaGVhZGVyLiAgSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGlzCi1jb25kaXRpb24gZXhpc3RzIG9ubHkgaWYgeW91IG9ubHkgaW1wbGVtZW50IHRoaXMgcG9saWN5IGF0IHRoZSBJUAotbGF5ZXIgLSBhbGwgc2VjdXJpdHkgY29udHJvbHMgdXNlZCBieSBBcGFjaGUgKDxFTT5pLmUuPC9FTT4sIDxBCi1IUkVGPSIuLi9tb2QvbW9kX2FjY2Vzcy5odG1sIj5hbGxvdywgZGVueSBmcm9tLDwvQT4gPEVNPmV0Yy48L0VNPikgYXJlCi1jb25zaXN0ZW50bHkgcmVzcGVjdGVkLgotCi08SDI+Q29tcGF0aWJpbGl0eSB3aXRoIE9sZGVyIEJyb3dzZXJzPC9IMj4KLQotPFA+QXMgbWVudGlvbmVkIGVhcmxpZXIsIGEgbWFqb3JpdHkgb2YgYnJvd3NlcnMgZG8gbm90IHNlbmQgdGhlCi1yZXF1aXJlZCBkYXRhIGZvciB0aGUgbmV3IHZpcnR1YWwgaG9zdHMgdG8gd29yayBwcm9wZXJseS4gVGhlc2UKLWJyb3dzZXJzIHdpbGwgYWx3YXlzIGJlIHNlbnQgdG8gdGhlIG1haW4gc2VydmVyJ3MgcGFnZXMuIFRoZXJlIGlzIGEKLXdvcmthcm91bmQsIGFsYmVpdCBhIHNsaWdodGx5IGN1bWJlcnNvbWUgb25lOjwvUD4KLQotPFA+VG8gY29udGludWUgdGhlIDxDT0RFPnd3dy5hcGFjaGUub3JnPC9DT0RFPiBleGFtcGxlIChOb3RlOiBBcGFjaGUncwotd2ViIHNlcnZlciBkb2VzIG5vdCBhY3R1YWxseSBmdW5jdGlvbiBpbiB0aGlzIG1hbm5lciksIHdlIG1pZ2h0IHVzZSB0aGUKLW5ldyA8Q09ERT5TZXJ2ZXJQYXRoPC9DT0RFPiBkaXJlY3RpdmUgaW4gdGhlIDxDT0RFPnd3dy5hcGFjaGUub3JnPC9DT0RFPgotdmlydHVhbCBob3N0LCBmb3IgZXhhbXBsZToKLQotPFBSRT4KLSAgICBTZXJ2ZXJQYXRoIC9hcGFjaGUKLTwvUFJFPgotPFA+V2hhdCBkb2VzIHRoaXMgbWVhbj8gSXQgbWVhbnMgdGhhdCBhIHJlcXVlc3QgZm9yIGFueSBmaWxlIGJlZ2lubmluZwotd2l0aCAiPENPREU+L2FwYWNoZTwvQ09ERT4iIHdpbGwgYmUgbG9va2VkIGZvciBpbiB0aGUgQXBhY2hlCi1kb2NzLiBUaGlzIG1lYW5zIHRoYXQgdGhlIHBhZ2VzIGNhbiBiZSBhY2Nlc3NlZCBhcwotPENPREU+aHR0cDovL3d3dy5hcGFjaGUub3JnL2FwYWNoZS88L0NPREU+IGZvciBhbGwgYnJvd3NlcnMsIGFsdGhvdWdoCi1uZXcgYnJvd3NlcnMgY2FuIGFsc28gYWNjZXNzIGl0IGFzCi08Q09ERT5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC9DT0RFPi48L1A+Ci0KLTxQPkluIG9yZGVyIHRvIG1ha2UgdGhpcyB3b3JrLCBwdXQgYSBsaW5rIG9uIHlvdXIgbWFpbiBzZXJ2ZXIncyBwYWdlCi10byA8Q09ERT5odHRwOi8vd3d3LmFwYWNoZS5vcmcvYXBhY2hlLzwvQ09ERT4gKE5vdGU6IERvIG5vdCB1c2UKLTxDT0RFPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L0NPREU+IC0gdGhpcyB3b3VsZCBjcmVhdGUgYW4gZW5kbGVzcwotbG9vcCkuIFRoZW4sIGluIHRoZSB2aXJ0dWFsIGhvc3QncyBwYWdlcywgYmUgc3VyZSB0byB1c2UgZWl0aGVyIHB1cmVseQotcmVsYXRpdmUgbGlua3MgKDxFTT5lLmcuPC9FTT4sICI8Q09ERT5maWxlLmh0bWw8L0NPREU+IiBvcgotIjxDT0RFPi4uL2ljb25zL2ltYWdlLmdpZjwvQ09ERT4iIG9yIGxpbmtzIGNvbnRhaW5pbmcgdGhlIHByZWZhY2luZwotPENPREU+L2FwYWNoZS88L0NPREU+Ci0oPEVNPmUuZy48L0VNPiwgIjxDT0RFPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9hcGFjaGUvZmlsZS5odG1sPC9DT0RFPiIgb3IKLSI8Q09ERT4vYXBhY2hlL2RvY3MvMS4xL2luZGV4Lmh0bWw8L0NPREU+IikuPC9QPgotCi08UD5UaGlzIHJlcXVpcmVzIGEgYml0IG9mCi1kaXNjaXBsaW5lLCBidXQgYWRoZXJlbmNlIHRvIHRoZXNlIGd1aWRlbGluZXMgd2lsbCwgZm9yIHRoZSBtb3N0IHBhcnQsCi1lbnN1cmUgdGhhdCB5b3VyIHBhZ2VzIHdpbGwgd29yayB3aXRoIGFsbCBicm93c2VycywgbmV3IGFuZCBvbGQuIFdoZW4KLWEgbmV3IGJyb3dzZXIgY29udGFjdHMgPENPREU+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvQ09ERT4sIHRoZXkgd2lsbAotYmUgZGlyZWN0bHkgdGFrZW4gdG8gdGhlIEFwYWNoZSBwYWdlcy4gT2xkZXIgYnJvd3NlcnMgd2lsbCBiZSBhYmxlIHRvCi1jbGljayBvbiB0aGUgbGluayBmcm9tIHRoZSBtYWluIHNlcnZlciwgZ28gdG8KLTxDT0RFPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9hcGFjaGUvPC9DT0RFPiwgYW5kIHRoZW4gYWNjZXNzIHRoZQotcGFnZXMuPC9QPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvdmhvc3RzL2luZGV4Lmh0bWwgYi9kb2NzL21hbnVhbC92aG9zdHMvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZmY2YxZC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC92aG9zdHMvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIFZpcnR1YWwgSG9zdCBkb2N1bWVudGF0aW9uPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+QXBhY2hlIFZpcnR1YWwgSG9zdCBkb2N1bWVudGF0aW9uPC9IMT4KLQotPFA+VGhlIHRlcm0gPENJVEU+VmlydHVhbCBIb3N0PC9DSVRFPiByZWZlcnMgdG8gdGhlIHByYWN0aWNlIG9mIG1haW50YWluaW5nCi1tb3JlIHRoYW4gb25lIHNlcnZlciBvbiBvbmUgbWFjaGluZSwgYXMgZGlmZmVyZW50aWF0ZWQgYnkgdGhlaXIgYXBwYXJlbnQKLWhvc3RuYW1lLiBGb3IgZXhhbXBsZSwgaXQgaXMgb2Z0ZW4gZGVzaXJhYmxlIGZvciBjb21wYW5pZXMgc2hhcmluZyBhCi13ZWIgc2VydmVyIHRvIGhhdmUgdGhlaXIgb3duIGRvbWFpbnMsIHdpdGggd2ViIHNlcnZlcnMgYWNjZXNzaWJsZSBhcwotPFNBTVA+d3d3LmNvbXBhbnkxLmNvbTwvU0FNUD4gYW5kIDxTQU1QPnd3dy5jb21wYW55Mi5jb208L1NBTVA+LAotd2l0aG91dCByZXF1aXJpbmcgdGhlIHVzZXIgdG8ga25vdyBhbnkgZXh0cmEgcGF0aCBpbmZvcm1hdGlvbi48L1A+Ci0KLTxQPkFwYWNoZSB3YXMgb25lIG9mIHRoZSBmaXJzdCBzZXJ2ZXJzIHRvIHN1cHBvcnQgSVAtYmFzZWQKLXZpcnR1YWwgaG9zdHMgcmlnaHQgb3V0IG9mIHRoZSBib3guIFZlcnNpb25zIDEuMSBhbmQgbGF0ZXIgb2YKLUFwYWNoZSBzdXBwb3J0IGJvdGgsIElQLWJhc2VkIGFuZCBuYW1lLWJhc2VkIHZpcnR1YWwgaG9zdHMgKHZob3N0cykuCi1UaGUgbGF0dGVyIHZhcmlhbnQgb2YgdmlydHVhbCBob3N0cyBpcyBzb21ldGltZXMgYWxzbyBjYWxsZWQgaG9zdC1iYXNlZCBvcgotbm9uLUlQIHZpcnR1YWwgaG9zdHMuPC9QPgotCi08UD5CZWxvdyBpcyBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBwYWdlcyB3aGljaCBleHBsYWluIGFsbCBkZXRhaWxzCi1vZiB2aXJ0dWFsIGhvc3Qgc3VwcG9ydCBpbiBBcGFjaGUgdmVyc2lvbiAxLjMgYW5kIGxhdGVyLjwvUD4KLQotPEhSPgotCi08SDI+VmlydHVhbCBIb3N0IFN1cHBvcnQ8L0gyPgotCi08VUw+Ci08TEk+PEEgSFJFRj0iaXAtYmFzZWQuaHRtbCI+SVAtYmFzZWQgVmlydHVhbCBIb3N0czwvQT4KLTxMST48QSBIUkVGPSJuYW1lLWJhc2VkLmh0bWwiPk5hbWUtYmFzZWQgVmlydHVhbCBIb3N0czwvQT4KLTxMST48QSBIUkVGPSJleGFtcGxlcy5odG1sIj5WaXJ0dWFsIEhvc3QgZXhhbXBsZXMgZm9yIGNvbW1vbiBzZXR1cHM8L0E+Ci08TEk+PEEgSFJFRj0iZGV0YWlscy5odG1sIj5Jbi1EZXB0aCBEaXNjdXNzaW9uIG9mIFZpcnR1YWwgSG9zdCBNYXRjaGluZzwvQT4KLTxMST48QSBIUkVGPSJmZC1saW1pdHMuaHRtbCI+RmlsZSBEZXNjcmlwdG9yIExpbWl0czwvQT4KLTxMST48QSBIUkVGPSJtYXNzLmh0bWwiPkR5bmFtaWNhbGx5IENvbmZpZ3VyZWQgTWFzcyBWaXJ0dWFsIEhvc3Rpbmc8L0E+Ci08L1VMPgotCi08SDI+Q29uZmlndXJhdGlvbiBkaXJlY3RpdmVzPC9IMj4KLQotPFVMPgotPExJPjxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjdmlydHVhbGhvc3QiPiZsdDtWaXJ0dWFsSG9zdCZndDs8L0E+Ci08TEk+PEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNuYW1ldmlydHVhbGhvc3QiPk5hbWVWaXJ0dWFsSG9zdDwvQT4KLTxMST48QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcm5hbWUiPlNlcnZlck5hbWU8L0E+Ci08TEk+PEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNzZXJ2ZXJhbGlhcyI+U2VydmVyQWxpYXM8L0E+Ci08TEk+PEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNzZXJ2ZXJwYXRoIj5TZXJ2ZXJQYXRoPC9BPgotPC9VTD4KLQotPFA+Rm9sa3MgdHJ5aW5nIHRvIGRlYnVnIHRoZWlyIHZpcnR1YWwgaG9zdCBjb25maWd1cmF0aW9uIG1heSBmaW5kIHRoZQotQXBhY2hlIDxDT0RFPi1TPC9DT0RFPiBjb21tYW5kIGxpbmUgc3dpdGNoIHVzZWZ1bC4gIEl0IHdpbGwgZHVtcCBvdXQgYQotZGVzY3JpcHRpb24gb2YgaG93IEFwYWNoZSBwYXJzZWQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIENhcmVmdWwKLWV4YW1pbmF0aW9uIG9mIHRoZSBJUCBhZGRyZXNzZXMgYW5kIHNlcnZlciBuYW1lcyBtYXkgaGVscCB1bmNvdmVyCi1jb25maWd1cmF0aW9uIG1pc3Rha2VzLgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvdmhvc3RzL2luZGV4Lmh0bWwuZW4gYi9kb2NzL21hbnVhbC92aG9zdHMvaW5kZXguaHRtbC5lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZmY2YxZC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC92aG9zdHMvaW5kZXguaHRtbC5lbgorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIFZpcnR1YWwgSG9zdCBkb2N1bWVudGF0aW9uPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+QXBhY2hlIFZpcnR1YWwgSG9zdCBkb2N1bWVudGF0aW9uPC9IMT4KLQotPFA+VGhlIHRlcm0gPENJVEU+VmlydHVhbCBIb3N0PC9DSVRFPiByZWZlcnMgdG8gdGhlIHByYWN0aWNlIG9mIG1haW50YWluaW5nCi1tb3JlIHRoYW4gb25lIHNlcnZlciBvbiBvbmUgbWFjaGluZSwgYXMgZGlmZmVyZW50aWF0ZWQgYnkgdGhlaXIgYXBwYXJlbnQKLWhvc3RuYW1lLiBGb3IgZXhhbXBsZSwgaXQgaXMgb2Z0ZW4gZGVzaXJhYmxlIGZvciBjb21wYW5pZXMgc2hhcmluZyBhCi13ZWIgc2VydmVyIHRvIGhhdmUgdGhlaXIgb3duIGRvbWFpbnMsIHdpdGggd2ViIHNlcnZlcnMgYWNjZXNzaWJsZSBhcwotPFNBTVA+d3d3LmNvbXBhbnkxLmNvbTwvU0FNUD4gYW5kIDxTQU1QPnd3dy5jb21wYW55Mi5jb208L1NBTVA+LAotd2l0aG91dCByZXF1aXJpbmcgdGhlIHVzZXIgdG8ga25vdyBhbnkgZXh0cmEgcGF0aCBpbmZvcm1hdGlvbi48L1A+Ci0KLTxQPkFwYWNoZSB3YXMgb25lIG9mIHRoZSBmaXJzdCBzZXJ2ZXJzIHRvIHN1cHBvcnQgSVAtYmFzZWQKLXZpcnR1YWwgaG9zdHMgcmlnaHQgb3V0IG9mIHRoZSBib3guIFZlcnNpb25zIDEuMSBhbmQgbGF0ZXIgb2YKLUFwYWNoZSBzdXBwb3J0IGJvdGgsIElQLWJhc2VkIGFuZCBuYW1lLWJhc2VkIHZpcnR1YWwgaG9zdHMgKHZob3N0cykuCi1UaGUgbGF0dGVyIHZhcmlhbnQgb2YgdmlydHVhbCBob3N0cyBpcyBzb21ldGltZXMgYWxzbyBjYWxsZWQgaG9zdC1iYXNlZCBvcgotbm9uLUlQIHZpcnR1YWwgaG9zdHMuPC9QPgotCi08UD5CZWxvdyBpcyBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBwYWdlcyB3aGljaCBleHBsYWluIGFsbCBkZXRhaWxzCi1vZiB2aXJ0dWFsIGhvc3Qgc3VwcG9ydCBpbiBBcGFjaGUgdmVyc2lvbiAxLjMgYW5kIGxhdGVyLjwvUD4KLQotPEhSPgotCi08SDI+VmlydHVhbCBIb3N0IFN1cHBvcnQ8L0gyPgotCi08VUw+Ci08TEk+PEEgSFJFRj0iaXAtYmFzZWQuaHRtbCI+SVAtYmFzZWQgVmlydHVhbCBIb3N0czwvQT4KLTxMST48QSBIUkVGPSJuYW1lLWJhc2VkLmh0bWwiPk5hbWUtYmFzZWQgVmlydHVhbCBIb3N0czwvQT4KLTxMST48QSBIUkVGPSJleGFtcGxlcy5odG1sIj5WaXJ0dWFsIEhvc3QgZXhhbXBsZXMgZm9yIGNvbW1vbiBzZXR1cHM8L0E+Ci08TEk+PEEgSFJFRj0iZGV0YWlscy5odG1sIj5Jbi1EZXB0aCBEaXNjdXNzaW9uIG9mIFZpcnR1YWwgSG9zdCBNYXRjaGluZzwvQT4KLTxMST48QSBIUkVGPSJmZC1saW1pdHMuaHRtbCI+RmlsZSBEZXNjcmlwdG9yIExpbWl0czwvQT4KLTxMST48QSBIUkVGPSJtYXNzLmh0bWwiPkR5bmFtaWNhbGx5IENvbmZpZ3VyZWQgTWFzcyBWaXJ0dWFsIEhvc3Rpbmc8L0E+Ci08L1VMPgotCi08SDI+Q29uZmlndXJhdGlvbiBkaXJlY3RpdmVzPC9IMj4KLQotPFVMPgotPExJPjxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjdmlydHVhbGhvc3QiPiZsdDtWaXJ0dWFsSG9zdCZndDs8L0E+Ci08TEk+PEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNuYW1ldmlydHVhbGhvc3QiPk5hbWVWaXJ0dWFsSG9zdDwvQT4KLTxMST48QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcm5hbWUiPlNlcnZlck5hbWU8L0E+Ci08TEk+PEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNzZXJ2ZXJhbGlhcyI+U2VydmVyQWxpYXM8L0E+Ci08TEk+PEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNzZXJ2ZXJwYXRoIj5TZXJ2ZXJQYXRoPC9BPgotPC9VTD4KLQotPFA+Rm9sa3MgdHJ5aW5nIHRvIGRlYnVnIHRoZWlyIHZpcnR1YWwgaG9zdCBjb25maWd1cmF0aW9uIG1heSBmaW5kIHRoZQotQXBhY2hlIDxDT0RFPi1TPC9DT0RFPiBjb21tYW5kIGxpbmUgc3dpdGNoIHVzZWZ1bC4gIEl0IHdpbGwgZHVtcCBvdXQgYQotZGVzY3JpcHRpb24gb2YgaG93IEFwYWNoZSBwYXJzZWQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIENhcmVmdWwKLWV4YW1pbmF0aW9uIG9mIHRoZSBJUCBhZGRyZXNzZXMgYW5kIHNlcnZlciBuYW1lcyBtYXkgaGVscCB1bmNvdmVyCi1jb25maWd1cmF0aW9uIG1pc3Rha2VzLgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvdmhvc3RzL2lwLWJhc2VkLmh0bWwgYi9kb2NzL21hbnVhbC92aG9zdHMvaXAtYmFzZWQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRlNTI5ZC4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC92aG9zdHMvaXAtYmFzZWQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkFwYWNoZSBJUC1iYXNlZCBWaXJ0dWFsIEhvc3QgU3VwcG9ydDwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPkFwYWNoZSBJUC1iYXNlZCBWaXJ0dWFsIEhvc3QgU3VwcG9ydDwvSDE+Ci0KLTxTVFJPTkc+U2VlIGFsc286PC9TVFJPTkc+Ci08QSBIUkVGPSJuYW1lLWJhc2VkLmh0bWwiPk5hbWUtYmFzZWQgVmlydHVhbCBIb3N0cyBTdXBwb3J0PC9BPgotCi08SFI+Ci0KLTxIMj5TeXN0ZW0gcmVxdWlyZW1lbnRzPC9IMj4KLUFzIHRoZSB0ZXJtIDxDSVRFPklQLWJhc2VkPC9DSVRFPiBpbmRpY2F0ZXMsIHRoZSBzZXJ2ZXIgPFNUUk9ORz5tdXN0IGhhdmUgYQotZGlmZmVyZW50IElQIGFkZHJlc3MgZm9yIGVhY2ggSVAtYmFzZWQgdmlydHVhbCBob3N0PC9TVFJPTkc+LgotVGhpcyBjYW4gYmUgYWNoaWV2ZWQgYnkgdGhlIG1hY2hpbmUgaGF2aW5nIHNldmVyYWwgcGh5c2ljYWwgbmV0d29yayBjb25uZWN0aW9ucywKLW9yIGJ5IHVzZSBvZiB2aXJ0dWFsIGludGVyZmFjZXMgd2hpY2ggYXJlIHN1cHBvcnRlZCBieSBtb3N0IG1vZGVybgotb3BlcmF0aW5nIHN5c3RlbXMgKHNlZSBzeXN0ZW0gZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscywgdGhlc2UgYXJlCi1mcmVxdWVudGx5IGNhbGxlZCAiaXAgYWxpYXNlcyIsIGFuZCB0aGUgImlmY29uZmlnIiBjb21tYW5kCi1pcyBtb3N0IGNvbW1vbmx5IHVzZWQgdG8gc2V0IHRoZW0gdXApLgotCi08SDI+SG93IHRvIHNldCB1cCBBcGFjaGU8L0gyPgotVGhlcmUgYXJlIHR3byB3YXlzIG9mIGNvbmZpZ3VyaW5nIGFwYWNoZSB0byBzdXBwb3J0IG11bHRpcGxlIGhvc3RzLgotRWl0aGVyIGJ5IHJ1bm5pbmcgYSBzZXBhcmF0ZSBodHRwZCBkYWVtb24gZm9yIGVhY2ggaG9zdG5hbWUsIG9yIGJ5IHJ1bm5pbmcgYQotc2luZ2xlIGRhZW1vbiB3aGljaCBzdXBwb3J0cyBhbGwgdGhlIHZpcnR1YWwgaG9zdHMuCi08UD4KLVVzZSBtdWx0aXBsZSBkYWVtb25zIHdoZW46Ci08VUw+Ci08TEk+VGhlcmUgYXJlIHNlY3VyaXR5IHBhcnRpdGlvbmluZyBpc3N1ZXMsIHN1Y2ggYXMgY29tcGFueTEgZG9lcyBub3Qgd2FudAotICAgIGFueW9uZSBhdCBjb21wYW55MiB0byBiZSBhYmxlIHRvIHJlYWQgdGhlaXIgZGF0YSBleGNlcHQgdmlhIHRoZSB3ZWIuCi0gICAgSW4gdGhpcyBjYXNlIHlvdSB3b3VsZCBuZWVkIHR3byBkYWVtb25zLCBlYWNoIHJ1bm5pbmcgd2l0aCBkaWZmZXJlbnQKLSAgICA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3VzZXIiPlVzZXI8L0E+LAotICAgIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjZ3JvdXAiPkdyb3VwPC9BPiwKLSAgICA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI2xpc3RlbiI+TGlzdGVuPC9BPiwgYW5kCi0gICAgPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNzZXJ2ZXJyb290Ij5TZXJ2ZXJSb290PC9BPiBzZXR0aW5ncy4KLTxMST5Zb3UgY2FuIGFmZm9yZCB0aGUgbWVtb3J5IGFuZAotICAgIDxBIEhSRUY9Ii4uL21pc2MvZGVzY3JpcHRvcnMuaHRtbCI+ZmlsZSBkZXNjcmlwdG9yIHJlcXVpcmVtZW50czwvQT4gb2YKLSAgICBsaXN0ZW5pbmcgdG8gZXZlcnkgSVAgYWxpYXMgb24gdGhlIG1hY2hpbmUuICBJdCdzIG9ubHkgcG9zc2libGUgdG8KLSAgICA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI2xpc3RlbiI+TGlzdGVuPC9BPgotICAgIHRvIHRoZSAid2lsZGNhcmQiIGFkZHJlc3MsIG9yIHRvIHNwZWNpZmljIGFkZHJlc3Nlcy4gIFNvIGlmIHlvdSBoYXZlCi0gICAgYSBuZWVkIHRvIGxpc3RlbiB0byBhIHNwZWNpZmljIGFkZHJlc3MgZm9yIHdoYXRldmVyIHJlYXNvbiwgdGhlbiB5b3UKLSAgICB3aWxsIG5lZWQgdG8gbGlzdGVuIHRvIGFsbCBzcGVjaWZpYyBhZGRyZXNzZXMuICAoQWx0aG91Z2ggb25lIGh0dHBkCi0gICAgY291bGQgbGlzdGVuIHRvIE4tMSBvZiB0aGUgYWRkcmVzc2VzLCBhbmQgYW5vdGhlciBjb3VsZCBsaXN0ZW4gdG8KLSAgICB0aGUgcmVtYWluaW5nIGFkZHJlc3MuKQotPC9VTD4KLVVzZSBhIHNpbmdsZSBkYWVtb24gd2hlbjoKLTxVTD4KLTxMST5TaGFyaW5nIG9mIHRoZSBodHRwZCBjb25maWd1cmF0aW9uIGJldHdlZW4gdmlydHVhbCBob3N0cyBpcyBhY2NlcHRhYmxlLgotPExJPlRoZSBtYWNoaW5lIHNlcnZpY2VzIGEgbGFyZ2UgbnVtYmVyIG9mIHJlcXVlc3RzLCBhbmQgc28gdGhlIHBlcmZvcm1hbmNlCi0gICBsb3NzIGluIHJ1bm5pbmcgc2VwYXJhdGUgZGFlbW9ucyBtYXkgYmUgc2lnbmlmaWNhbnQuCi08L1VMPgotCi08SDI+U2V0dGluZyB1cCBtdWx0aXBsZSBkYWVtb25zPC9IMj4KLUNyZWF0ZSBhIHNlcGFyYXRlIGh0dHBkIGluc3RhbGxhdGlvbiBmb3IgZWFjaCB2aXJ0dWFsIGhvc3QuCi1Gb3IgZWFjaCBpbnN0YWxsYXRpb24sIHVzZSB0aGUKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjbGlzdGVuIj5MaXN0ZW48L0E+IGRpcmVjdGl2ZSBpbiB0aGUgY29uZmlndXJhdGlvbgotZmlsZSB0byBzZWxlY3Qgd2hpY2ggSVAgYWRkcmVzcyAob3IgdmlydHVhbCBob3N0KSB0aGF0IGRhZW1vbiBzZXJ2aWNlcy4KLWUuZy4KLTxQUkU+Ci0gICAgTGlzdGVuIHd3dy5zbWFsbGNvLmNvbTo4MAotPC9QUkU+Ci1JdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UgYW4gSVAgYWRkcmVzcyBpbnN0ZWFkIG9mIGEgaG9zdG5hbWUKLShzZWUgPEEgSFJFRj0iLi4vZG5zLWNhdmVhdHMuaHRtbCI+RE5TIGNhdmVhdHM8L0E+KS4KLQotPEgyPlNldHRpbmcgdXAgYSBzaW5nbGUgZGFlbW9uIHdpdGggdmlydHVhbCBob3N0czwvSDI+Ci1Gb3IgdGhpcyBjYXNlLCBhIHNpbmdsZSBodHRwZCB3aWxsIHNlcnZpY2UgcmVxdWVzdHMgZm9yIHRoZSBtYWluIHNlcnZlcgotYW5kIGFsbCB0aGUgdmlydHVhbCBob3N0cy4KLVRoZSA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3ZpcnR1YWxob3N0Ij5WaXJ0dWFsSG9zdDwvQT4gZGlyZWN0aXZlIGluIHRoZQotIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyB1c2VkIHRvIHNldCB0aGUgdmFsdWVzIG9mCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcmFkbWluIj5TZXJ2ZXJBZG1pbjwvQT4sCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcm5hbWUiPlNlcnZlck5hbWU8L0E+LAotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNkb2N1bWVudHJvb3QiPkRvY3VtZW50Um9vdDwvQT4sCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI2Vycm9ybG9nIj5FcnJvckxvZzwvQT4gYW5kCi08QSBIUkVGPSIuLi9tb2QvbW9kX2xvZ19jb25maWcuaHRtbCN0cmFuc2ZlcmxvZyI+VHJhbnNmZXJMb2c8L0E+IG9yCi08QSBIUkVGPSIuLi9tb2QvbW9kX2xvZ19jb25maWcuaHRtbCNjdXN0b21sb2ciPkN1c3RvbUxvZzwvQT4KLWNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcyB0byBkaWZmZXJlbnQgdmFsdWVzIGZvciBlYWNoIHZpcnR1YWwgaG9zdC4KLWUuZy4KLTxQUkU+Ci0gICAgJmx0O1ZpcnR1YWxIb3N0IHd3dy5zbWFsbGNvLmNvbSZndDsKLSAgICBTZXJ2ZXJBZG1pbiB3ZWJtYXN0ZXJAbWFpbC5zbWFsbGNvLmNvbQotICAgIERvY3VtZW50Um9vdCAvZ3JvdXBzL3NtYWxsY28vd3d3Ci0gICAgU2VydmVyTmFtZSB3d3cuc21hbGxjby5jb20KLSAgICBFcnJvckxvZyAvZ3JvdXBzL3NtYWxsY28vbG9ncy9lcnJvcl9sb2cKLSAgICBUcmFuc2ZlckxvZyAvZ3JvdXBzL3NtYWxsY28vbG9ncy9hY2Nlc3NfbG9nCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLQotICAgICZsdDtWaXJ0dWFsSG9zdCB3d3cuYmF5Z3JvdXAub3JnJmd0OwotICAgIFNlcnZlckFkbWluIHdlYm1hc3RlckBtYWlsLmJheWdyb3VwLm9yZwotICAgIERvY3VtZW50Um9vdCAvZ3JvdXBzL2JheWdyb3VwL3d3dwotICAgIFNlcnZlck5hbWUgd3d3LmJheWdyb3VwLm9yZwotICAgIEVycm9yTG9nIC9ncm91cHMvYmF5Z3JvdXAvbG9ncy9lcnJvcl9sb2cKLSAgICBUcmFuc2ZlckxvZyAvZ3JvdXBzL2JheWdyb3VwL2xvZ3MvYWNjZXNzX2xvZwotICAgICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci08L1BSRT4KLQotSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgdXNlIGFuIElQIGFkZHJlc3MgaW5zdGVhZCBvZiBhIGhvc3RuYW1lCi0oc2VlIDxBIEhSRUY9Ii4uL2Rucy1jYXZlYXRzLmh0bWwiPkROUyBjYXZlYXRzPC9BPikuCi0KLTxQPgotCi1BbG1vc3QgPFNUUk9ORz5hbnk8L1NUUk9ORz4gY29uZmlndXJhdGlvbiBkaXJlY3RpdmUgY2FuIGJlIHB1dAotaW4gdGhlIFZpcnR1YWxIb3N0IGRpcmVjdGl2ZSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcnR5cGUiPlNlcnZlclR5cGU8L0E+LAotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNzdGFydHNlcnZlcnMiPlN0YXJ0U2VydmVyczwvQT4sCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI21heHNwYXJlc2VydmVycyI+TWF4U3BhcmVTZXJ2ZXJzPC9BPiwKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjbWluc3BhcmVzZXJ2ZXJzIj5NaW5TcGFyZVNlcnZlcnM8L0E+LAotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNtYXhyZXF1ZXN0c3BlcmNoaWxkIj5NYXhSZXF1ZXN0c1BlckNoaWxkPC9BPiwKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjYmluZGFkZHJlc3MiPkJpbmRBZGRyZXNzPC9BPiwKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjbGlzdGVuIj5MaXN0ZW48L0E+LAotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNwaWRmaWxlIj5QaWRGaWxlPC9BPiwKLTxBIEhSRUY9Ii4uL21vZC9tb2RfbWltZS5odG1sI3R5cGVzY29uZmlnIj5UeXBlc0NvbmZpZzwvQT4sCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcnJvb3QiPlNlcnZlclJvb3Q8L0E+IGFuZAotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNuYW1ldmlydHVhbGhvc3QiPk5hbWVWaXJ0dWFsSG9zdDwvQT4uCi08UD4KLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjdXNlciI+VXNlcjwvQT4gYW5kCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI2dyb3VwIj5Hcm91cDwvQT4gbWF5IGJlIHVzZWQgaW5zaWRlIGEgVmlydHVhbEhvc3QKLWRpcmVjdGl2ZSBpZiB0aGUgPEEgSFJFRj0iLi4vc3VleGVjLmh0bWwiPnN1RVhFQyB3cmFwcGVyPC9BPiBpcyB1c2VkLgotPFA+Ci0KLTxFTT5TRUNVUklUWTo8L0VNPiBXaGVuIHNwZWNpZnlpbmcgd2hlcmUgdG8gd3JpdGUgbG9nIGZpbGVzLCBiZSBhd2FyZQotb2Ygc29tZSBzZWN1cml0eSByaXNrcyB3aGljaCBhcmUgcHJlc2VudCBpZiBhbnlvbmUgb3RoZXIgdGhhbiB0aGUKLXVzZXIgdGhhdCBzdGFydHMgQXBhY2hlIGhhcyB3cml0ZSBhY2Nlc3MgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGV5Ci1hcmUgd3JpdHRlbi4gIFNlZSB0aGUgPEEgSFJFRj0iLi4vbWlzYy9zZWN1cml0eV90aXBzLmh0bWwiPnNlY3VyaXR5Ci10aXBzPC9BPiBkb2N1bWVudCBmb3IgZGV0YWlscy4KLTwvUD4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KLQpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvdmhvc3RzL21hc3MuaHRtbCBiL2RvY3MvbWFudWFsL3Zob3N0cy9tYXNzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNTYwOTMuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvdmhvc3RzL21hc3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD48SEVBRD4KLTxUSVRMRT5EeW5hbWljYWxseSBjb25maWd1cmVkIG1hc3MgdmlydHVhbCBob3N0aW5nPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+RHluYW1pY2FsbHkgY29uZmlndXJlZCBtYXNzIHZpcnR1YWwgaG9zdGluZzwvSDE+Ci0KLTxQPlRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGhvdyB0byBlZmZpY2llbnRseSBzZXJ2ZSBhbiBhcmJpdHJhcnkgbnVtYmVyCi1vZiB2aXJ0dWFsIGhvc3RzIHdpdGggQXBhY2hlIDEuMy4gCi0KLTwhLS0KLQotV3JpdHRlbiBieSBUb255IEZpbmNoIChmYW5mQGRlbW9uLm5ldCkgKGRvdEBkb3RhdC5hdCkuCi0KLVNvbWUgZXhhbXBsZXMgd2VyZSBkZXJpdmVkIGZyb20gUmFsZiBTLiBFbmdsZXNjaGFsbCdzIGRvY3VtZW50Ci0JaHR0cDovL3d3dy5lbmdlbHNjaGFsbC5jb20vcHcvYXBhY2hlL3Jld3JpdGVndWlkZS8KLQotU29tZSBzdWdnZXN0aW9ucyB3ZXJlIG1hZGUgYnkgQnJpYW4gQmVobGVuZG9yZi4KLQotLS0+Ci0KLTxIMj48QSBOQU1FPSJjb250ZW50cyI+Q29udGVudHM6PC9BPjwvSDI+Ci0KLTxVTD4KLTxMST48QSBIUkVGPSIjbW90aXZhdGlvbiI+TW90aXZhdGlvbjwvQT4KLTxMST48QSBIUkVGPSIjb3ZlcnZpZXciPk92ZXJ2aWV3PC9BPgotPExJPjxBIEhSRUY9IiNzaW1wbGUiPlNpbXBsZSBkeW5hbWljIHZpcnR1YWwgaG9zdHM8L0E+Ci08TEk+PEEgSFJFRj0iI2hvbWVwYWdlcyI+QSB2aXJ0dWFsbHkgaG9zdGVkIGhvbWVwYWdlcyBzeXN0ZW08L0E+Ci08TEk+PEEgSFJFRj0iI2NvbWJpbmF0aW9ucyI+VXNpbmcgbW9yZSB0aGFuIG9uZSB2aXJ0dWFsIGhvc3Rpbmcgc3lzdGVtIG9uIHRoZSBzYW1lIHNlcnZlcjwvQT4KLTxMST48QSBIUkVGPSIjaXBiYXNlZCI+TW9yZSBlZmZpY2llbnQgSVAtYmFzZWQgdmlydHVhbCBob3N0aW5nPC9BPgotPExJPjxBIEhSRUY9IiNvbGR2ZXJzaW9uIj5Vc2luZyBvbGRlciB2ZXJzaW9ucyBvZiBBcGFjaGU8L0E+Ci08TEk+PEEgSFJFRj0iI3NpbXBsZS5yZXdyaXRlIj5TaW1wbGUgZHluYW1pYyB2aXJ0dWFsIGhvc3RzIHVzaW5nIDxDT0RFPm1vZF9yZXdyaXRlPC9DT0RFPjwvQT4KLTxMST48QSBIUkVGPSIjaG9tZXBhZ2VzLnJld3JpdGUiPkEgaG9tZXBhZ2VzIHN5c3RlbSB1c2luZyA8Q09ERT5tb2RfcmV3cml0ZTwvQ09ERT48L0E+Ci08TEk+PEEgSFJFRj0iI3h0cmEtY29uZiI+VXNpbmcgYSBzZXBhcmF0ZSB2aXJ0dWFsIGhvc3QgY29uZmlndXJhdGlvbiBmaWxlPC9BPgotPC9VTD4KLQotPEhSPjxIMj48QSBOQU1FPSJtb3RpdmF0aW9uIj5Nb3RpdmF0aW9uPC9BPjwvSDI+Ci0KLTxQPlRoZSB0ZWNobmlxdWVzIGRlc2NyaWJlZCBoZXJlIGFyZSBvZiBpbnRlcmVzdCBpZiB5b3VyCi08Q09ERT5odHRwZC5jb25mPC9DT0RFPiBjb250YWlucyBtYW55Ci08Q09ERT4mbHQ7VmlydHVhbEhvc3QmZ3Q7PC9DT0RFPiBzZWN0aW9ucyB0aGF0IGFyZSBzdWJzdGFudGlhbGx5IHRoZQotc2FtZSwgZm9yIGV4YW1wbGU6Ci08UFJFPgotTmFtZVZpcnR1YWxIb3N0IDExMS4yMi4zMy40NAotJmx0O1ZpcnR1YWxIb3N0IDExMS4yMi4zMy40NCZndDsKLQlTZXJ2ZXJOYW1lCQkgICAgICAgICAgIHd3dy5jdXN0b21lci0xLmNvbQotCURvY3VtZW50Um9vdAkJL3d3dy9ob3N0cy93d3cuY3VzdG9tZXItMS5jb20vZG9jcwotCVNjcmlwdEFsaWFzICAvY2dpLWJpbi8gIC93d3cvaG9zdHMvd3d3LmN1c3RvbWVyLTEuY29tL2NnaS1iaW4KLSZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci0mbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0Jmd0OwotCVNlcnZlck5hbWUJCSAgICAgICAgICAgd3d3LmN1c3RvbWVyLTIuY29tCi0JRG9jdW1lbnRSb290CQkvd3d3L2hvc3RzL3d3dy5jdXN0b21lci0yLmNvbS9kb2NzCi0JU2NyaXB0QWxpYXMgIC9jZ2ktYmluLyAgL3d3dy9ob3N0cy93d3cuY3VzdG9tZXItMi5jb20vY2dpLWJpbgotJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLSMgYmxhaCBibGFoIGJsYWgKLSZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQmZ3Q7Ci0JU2VydmVyTmFtZQkJICAgICAgICAgICB3d3cuY3VzdG9tZXItTi5jb20KLQlEb2N1bWVudFJvb3QJCS93d3cvaG9zdHMvd3d3LmN1c3RvbWVyLU4uY29tL2RvY3MKLQlTY3JpcHRBbGlhcyAgL2NnaS1iaW4vICAvd3d3L2hvc3RzL3d3dy5jdXN0b21lci1OLmNvbS9jZ2ktYmluCi0mbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotPC9QUkU+Ci08L1A+Ci0KLTxQPlRoZSBiYXNpYyBpZGVhIGlzIHRvIHJlcGxhY2UgYWxsIG9mIHRoZSBzdGF0aWMKLTxDT0RFPiZsdDtWaXJ0dWFsSG9zdCZndDs8L0NPREU+IGNvbmZpZ3VyYXRpb24gd2l0aCBhIG1lY2hhbmlzbSB0aGF0Ci13b3JrcyBpdCBvdXQgZHluYW1pY2FsbHkuIFRoaXMgaGFzIGEgbnVtYmVyIG9mIGFkdmFudGFnZXM6Ci08T0w+Ci0gICAgPExJPllvdXIgY29uZmlndXJhdGlvbiBmaWxlIGlzIHNtYWxsZXIgc28gQXBhY2hlIHN0YXJ0cyBmYXN0ZXIgYW5kCi0JdXNlcyBsZXNzIG1lbW9yeS4KLSAgICA8TEk+QWRkaW5nIHZpcnR1YWwgaG9zdHMgaXMgc2ltcGx5IGEgbWF0dGVyIG9mIGNyZWF0aW5nIHRoZQotCWFwcHJvcHJpYXRlIGRpcmVjdG9yaWVzIGluIHRoZSBmaWxlc3lzdGVtIGFuZCBlbnRyaWVzIGluIHRoZSBETlMgLQotCXlvdSBkb24ndCBuZWVkIHRvIHJlY29uZmlndXJlIG9yIHJlc3RhcnQgQXBhY2hlLgotPC9PTD4KLTwvUD4KLQotPFA+VGhlIG1haW4gZGlzYWR2YW50YWdlIGlzIHRoYXQgeW91IGNhbm5vdCBoYXZlIGEgZGlmZmVyZW50IGxvZyBmaWxlCi1mb3IgZWFjaCB2aXJ0dWFsIGhvc3Q7IGhvd2V2ZXIgaWYgeW91IGhhdmUgdmVyeSBtYW55IHZpcnR1YWwgaG9zdHMKLXRoZW4gZG9pbmcgdGhpcyBpcyBkdWJpb3VzIGFueXdheSBiZWNhdXNlIGl0IGVhdHMgZmlsZSBkZXNjcmlwdG9ycy4gSXQKLWlzIGJldHRlciB0byBsb2cgdG8gYSBwaXBlIG9yIGEgZmlmbyBhbmQgYXJyYW5nZSBmb3IgdGhlIHByb2Nlc3MgYXQKLXRoZSBvdGhlciBlbmQgdG8gZGlzdHJpYnV0ZSB0aGUgbG9ncyB0byB0aGUgY3VzdG9tZXJzIChpdCBjYW4gYWxzbwotYWNjdW11bGF0ZSBzdGF0aXN0aWNzLCBldGMuKS48L1A+Ci0KLQotPEhSPjxIMj48QSBOQU1FPSJvdmVydmlldyI+T3ZlcnZpZXc8L0E+PC9IMj4KLQotPFA+QSB2aXJ0dWFsIGhvc3QgaXMgZGVmaW5lZCBieSB0d28gcGllY2VzIG9mIGluZm9ybWF0aW9uOiBpdHMgSVAKLWFkZHJlc3MsIGFuZCB0aGUgY29udGVudHMgb2YgdGhlIDxDT0RFPkhvc3Q6PC9DT0RFPiBoZWFkZXIgaW4gdGhlIEhUVFAKLXJlcXVlc3QuIFRoZSBkeW5hbWljIG1hc3MgdmlydHVhbCBob3N0aW5nIHRlY2huaXF1ZSBpcyBiYXNlZCBvbgotYXV0b21hdGljYWxseSBpbnNlcnRpbmcgdGhpcyBpbmZvcm1hdGlvbiBpbnRvIHRoZSBwYXRobmFtZSBvZiB0aGUgZmlsZQotdGhhdCBpcyB1c2VkIHRvIHNhdGlzZnkgdGhlIHJlcXVlc3QuIFRoaXMgaXMgZG9uZSBtb3N0IGVhc2lseSB1c2luZwotPEEgSFJFRj0iLi4vbW9kL21vZF92aG9zdF9hbGlhcy5odG1sIj48Q09ERT5tb2Rfdmhvc3RfYWxpYXM8L0NPREU+PC9BPiwKLWJ1dCBpZiB5b3UgYXJlIHVzaW5nIGEgdmVyc2lvbiBvZiBBcGFjaGUgdXAgdG8gMS4zLjYgdGhlbiB5b3UgbXVzdCB1c2UKLTxBIEhSRUY9Ii4uL21vZC9tb2RfcmV3cml0ZS5odG1sIj48Q09ERT5tb2RfcmV3cml0ZTwvQ09ERT48L0E+LiBCb3RoCi1vZiB0aGVzZSBtb2R1bGVzIGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0OyB5b3UgbXVzdCBlbmFibGUgb25lIG9mIHRoZW0KLXdoZW4gY29uZmlndXJpbmcgYW5kIGJ1aWxkaW5nIEFwYWNoZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhpcyB0ZWNobmlxdWUuPC9QPgotCi08UD5BIGNvdXBsZSBvZiB0aGluZ3MgbmVlZCB0byBiZSBgZmFrZWQnIHRvIG1ha2UgdGhlIGR5bmFtaWMgdmlydHVhbAotaG9zdCBsb29rIGxpa2UgYSBub3JtYWwgb25lLiBUaGUgbW9zdCBpbXBvcnRhbnQgaXMgdGhlIHNlcnZlciBuYW1lCi13aGljaCBpcyB1c2VkIGJ5IEFwYWNoZSB0byBnZW5lcmF0ZSBzZWxmLXJlZmVyZW50aWFsIFVSTHMsIGV0Yy4gSXQKLWlzIGNvbmZpZ3VyZWQgd2l0aCB0aGUgPENPREU+U2VydmVyTmFtZTwvQ09ERT4gZGlyZWN0aXZlLCBhbmQgaXQgaXMKLWF2YWlsYWJsZSB0byBDR0lzIHZpYSB0aGUgPENPREU+U0VSVkVSX05BTUU8L0NPREU+IGVudmlyb25tZW50Ci12YXJpYWJsZS4gVGhlIGFjdHVhbCB2YWx1ZSB1c2VkIGF0IHJ1biB0aW1lIGlzIGNvbnRyb2xsZWQgYnkgdGhlCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3VzZWNhbm9uaWNhbG5hbWUiPjxDT0RFPlVzZUNhbm9uaWNhbE5hbWU8L0NPREU+PC9BPgotc2V0dGluZy4gV2l0aCA8Q09ERT5Vc2VDYW5vbmljYWxOYW1lIE9mZjwvQ09ERT4gdGhlIHNlcnZlciBuYW1lCi1jb21lcyBmcm9tIHRoZSBjb250ZW50cyBvZiB0aGUgPENPREU+SG9zdDo8L0NPREU+IGhlYWRlciBpbiB0aGUKLXJlcXVlc3QuIFdpdGggPENPREU+VXNlQ2Fub25pY2FsTmFtZSBETlM8L0NPREU+IGl0IGNvbWVzIGZyb20gYQotcmV2ZXJzZSBETlMgbG9va3VwIG9mIHRoZSB2aXJ0dWFsIGhvc3QncyBJUCBhZGRyZXNzLiBUaGUgZm9ybWVyCi1zZXR0aW5nIGlzIHVzZWQgZm9yIG5hbWUtYmFzZWQgZHluYW1pYyB2aXJ0dWFsIGhvc3RpbmcsIGFuZCB0aGUgbGF0dGVyCi1pcyB1c2VkIGZvciBJUC1iYXNlZCBob3N0aW5nLiBJZiBBcGFjaGUgY2Fubm90IHdvcmsgb3V0IHRoZSBzZXJ2ZXIKLW5hbWUgYmVjYXVzZSB0aGVyZSBpcyBubyA8Q09ERT5Ib3N0OjwvQ09ERT4gaGVhZGVyIG9yIHRoZSBETlMgbG9va3VwCi1mYWlscyB0aGVuIHRoZSB2YWx1ZSBjb25maWd1cmVkIHdpdGggPENPREU+U2VydmVyTmFtZTwvQ09ERT4gaXMgdXNlZAotaW5zdGVhZC48L1A+Ci0KLTxQPlRoZSBvdGhlciB0aGluZyB0byBgZmFrZScgaXMgdGhlIGRvY3VtZW50IHJvb3QgKGNvbmZpZ3VyZWQKLXdpdGggPENPREU+RG9jdW1lbnRSb290PC9DT0RFPiBhbmQgYXZhaWxhYmxlIHRvIENHSXMgdmlhIHRoZQotPENPREU+RE9DVU1FTlRfUk9PVDwvQ09ERT4gZW52aXJvbm1lbnQgdmFyaWFibGUpLiBUaGlzIHNldHRpbmcKLWlzIHVzZWQgYnkgdGhlIGNvcmUgbW9kdWxlIHdoZW4gbWFwcGluZyBVUklzIHRvIGZpbGVuYW1lcywgYnV0Ci13aGVuIHRoZSBzZXJ2ZXIgaXMgY29uZmlndXJlZCB0byBkbyBkeW5hbWljIHZpcnR1YWwgaG9zdGluZyB0aGF0Ci1qb2IgaXMgdGFrZW4gb3ZlciBieSBhbm90aGVyIG1vZHVsZS4gSWYgYW55IENHSXMgb3IgU1NJIGRvY3VtZW50cwotbWFrZSB1c2Ugb2YgdGhlIDxDT0RFPkRPQ1VNRU5UX1JPT1Q8L0NPREU+IGVudmlyb25tZW50IHZhcmlhYmxlCi10aGV5IHdpbGwgdGhlcmVmb3JlIGdldCBhIG1pc2xlYWRpbmcgdmFsdWU7IHRoZXJlIGlzbid0IGFueSB3YXkgdG8KLWNoYW5nZSA8Q09ERT5ET0NVTUVOVF9ST09UPC9DT0RFPiBkeW5hbWljYWxseS48L1A+Ci0KLQotPEhSPjxIMj48QSBOQU1FPSJzaW1wbGUiPlNpbXBsZSBkeW5hbWljIHZpcnR1YWwgaG9zdHM8L0E+PC9IMj4KLQotPFA+VGhpcyBleHRyYWN0IGZyb20gPENPREU+aHR0cGQuY29uZjwvQ09ERT4gaW1wbGVtZW50cyB0aGUgdmlydHVhbAotaG9zdCBhcnJhbmdlbWVudCBvdXRsaW5lZCBpbiB0aGUgPEEgSFJFRj0iI21vdGl2YXRpb24iPk1vdGl2YXRpb248L0E+Ci1zZWN0aW9uIGFib3ZlLCBidXQgaW4gYSBnZW5lcmljIGZhc2hpb24gdXNpbmcKLTxDT0RFPm1vZF92aG9zdF9hbGlhczwvQ09ERT4uPC9QPgotCi08UFJFPgotIyBnZXQgdGhlIHNlcnZlciBuYW1lIGZyb20gdGhlIEhvc3Q6IGhlYWRlcgotVXNlQ2Fub25pY2FsTmFtZSBPZmYKLQotIyB0aGlzIGxvZyBmb3JtYXQgY2FuIGJlIHNwbGl0IHBlci12aXJ0dWFsLWhvc3QgYmFzZWQgb24gdGhlIGZpcnN0IGZpZWxkCi1Mb2dGb3JtYXQgIiVWICVoICVsICV1ICV0IFwiJXJcIiAlcyAlYiIgdmNvbW1vbgotQ3VzdG9tTG9nIGxvZ3MvYWNjZXNzX2xvZyB2Y29tbW9uCi0KLSMgaW5jbHVkZSB0aGUgc2VydmVyIG5hbWUgaW4gdGhlIGZpbGVuYW1lcyB1c2VkIHRvIHNhdGlzZnkgcmVxdWVzdHMKLVZpcnR1YWxEb2N1bWVudFJvb3QgL3d3dy9ob3N0cy8lMC9kb2NzCi1WaXJ0dWFsU2NyaXB0QWxpYXMgIC93d3cvaG9zdHMvJTAvY2dpLWJpbgotPC9QUkU+Ci0KLTxQPlRoaXMgY29uZmlndXJhdGlvbiBjYW4gYmUgY2hhbmdlZCBpbnRvIGFuIElQLWJhc2VkIHZpcnR1YWwgaG9zdGluZwotc29sdXRpb24gYnkganVzdCB0dXJuaW5nIDxDT0RFPlVzZUNhbm9uaWNhbE5hbWUgT2ZmPC9DT0RFPiBpbnRvCi08Q09ERT5Vc2VDYW5vbmljYWxOYW1lIEROUzwvQ09ERT4uIFRoZSBzZXJ2ZXIgbmFtZSB0aGF0IGlzIGluc2VydGVkCi1pbnRvIHRoZSBmaWxlbmFtZSBpcyB0aGVuIGRlcml2ZWQgZnJvbSB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgdmlydHVhbAotaG9zdC48L1A+Ci0KLQotPEhSPjxIMj48QSBOQU1FPSJob21lcGFnZXMiPkEgdmlydHVhbGx5IGhvc3RlZCBob21lcGFnZXMgc3lzdGVtPC9BPjwvSDI+Ci0KLTxQPlRoaXMgaXMgYW4gYWRqdXN0bWVudCBvZiB0aGUgYWJvdmUgc3lzdGVtIHRhaWxvcmVkIGZvciBhbiBJU1AncwotaG9tZXBhZ2VzIHNlcnZlci4gVXNpbmcgYSBzbGlnaHRseSBtb3JlIGNvbXBsaWNhdGVkIGNvbmZpZ3VyYXRpb24gd2UKLWNhbiBzZWxlY3Qgc3Vic3RyaW5ncyBvZiB0aGUgc2VydmVyIG5hbWUgdG8gdXNlIGluIHRoZSBmaWxlbmFtZSBzbwotdGhhdCBlLmcuIHRoZSBkb2N1bWVudHMgZm9yIDxTQU1QPnd3dy51c2VyLmlzcC5jb208L1NBTVA+IGFyZSBmb3VuZCBpbgotPENPREU+L2hvbWUvdXNlci88L0NPREU+LiBJdCB1c2VzIGEgc2luZ2xlIDxDT0RFPmNnaS1iaW48L0NPREU+Ci1kaXJlY3RvcnkgaW5zdGVhZCBvZiBvbmUgcGVyIHZpcnR1YWwgaG9zdC48L1A+Ci0KLTxQUkU+Ci0jIGFsbCB0aGUgcHJlbGltaW5hcnkgc3R1ZmYgaXMgdGhlIHNhbWUgYXMgYWJvdmUsIHRoZW4KLQotIyBpbmNsdWRlIHBhcnQgb2YgdGhlIHNlcnZlciBuYW1lIGluIHRoZSBmaWxlbmFtZXMKLVZpcnR1YWxEb2N1bWVudFJvb3QgL3d3dy9ob3N0cy8lMi9kb2NzCi0KLSMgc2luZ2xlIGNnaS1iaW4gZGlyZWN0b3J5Ci1TY3JpcHRBbGlhcyAgL2NnaS1iaW4vICAvd3d3L3N0ZC1jZ2kvCi08L1BSRT4KLQotPFA+VGhlcmUgYXJlIGV4YW1wbGVzIG9mIG1vcmUgY29tcGxpY2F0ZWQKLTxDT0RFPlZpcnR1YWxEb2N1bWVudFJvb3Q8L0NPREU+IHNldHRpbmdzIGluCi08QSBIUkVGPSIuLi9tb2QvbW9kX3Zob3N0X2FsaWFzLmh0bWwiPnRoZQotPENPREU+bW9kX3Zob3N0X2FsaWFzPC9DT0RFPiBkb2N1bWVudGF0aW9uPC9BPi48L1A+Ci0KLQotPEhSPjxIMj48QSBOQU1FPSJjb21iaW5hdGlvbnMiPlVzaW5nIG1vcmUgdGhhbiBvbmUgdmlydHVhbCBob3N0aW5nCi1zeXN0ZW0gb24gdGhlIHNhbWUgc2VydmVyPC9BPjwvSDI+Ci0KLTxQPldpdGggbW9yZSBjb21wbGljYXRlZCBzZXR1cHMgeW91IGNhbiB1c2UgQXBhY2hlJ3Mgbm9ybWFsCi08Q09ERT4mbHQ7VmlydHVhbEhvc3QmZ3Q7PC9DT0RFPiBkaXJlY3RpdmVzIHRvIGNvbnRyb2wgdGhlIHNjb3BlIG9mCi10aGUgdmFyaW91cyB2aXJ0dWFsIGhvc3RpbmcgY29uZmlndXJhdGlvbnMuIEZvciBleGFtcGxlLCB5b3UgY291bGQKLWhhdmUgb25lIElQIGFkZHJlc3MgZm9yIGhvbWVwYWdlcyBjdXN0b21lcnMgYW5kIGFub3RoZXIgZm9yIGNvbW1lcmNpYWwKLWN1c3RvbWVycyB3aXRoIHRoZSBmb2xsb3dpbmcgc2V0dXAuIFRoaXMgY2FuIG9mIGNvdXJzZSBiZSBjb21iaW5lZAotd2l0aCBjb252ZW50aW9uYWwgPENPREU+Jmx0O1ZpcnR1YWxIb3N0Jmd0OzwvQ09ERT4gY29uZmlndXJhdGlvbgotc2VjdGlvbnMuPC9QPgotCi08UFJFPgotVXNlQ2Fub25pY2FsTmFtZSBPZmYKLQotTG9nRm9ybWF0ICIlViAlaCAlbCAldSAldCBcIiVyXCIgJXMgJWIiIHZjb21tb24KLQotJmx0O0RpcmVjdG9yeSAvd3d3L2NvbW1lcmNpYWwmZ3Q7Ci0JT3B0aW9ucyBGb2xsb3dTeW1MaW5rcwotCUFsbG93T3ZlcnJpZGUgQWxsCi0mbHQ7L0RpcmVjdG9yeSZndDsKLQotJmx0O0RpcmVjdG9yeSAvd3d3L2hvbWVwYWdlcyZndDsKLQlPcHRpb25zIEZvbGxvd1N5bUxpbmtzCi0JQWxsb3dPdmVycmlkZSBOb25lCi0mbHQ7L0RpcmVjdG9yeSZndDsKLQotJmx0O1ZpcnR1YWxIb3N0IDExMS4yMi4zMy40NCZndDsKLQlTZXJ2ZXJOYW1lIHd3dy5jb21tZXJjaWFsLmlzcC5jb20KLQotCUN1c3RvbUxvZyBsb2dzL2FjY2Vzc19sb2cuY29tbWVyY2lhbCB2Y29tbW9uCi0KLQlWaXJ0dWFsRG9jdW1lbnRSb290IC93d3cvY29tbWVyY2lhbC8lMC9kb2NzCi0JVmlydHVhbFNjcmlwdEFsaWFzICAvd3d3L2NvbW1lcmNpYWwvJTAvY2dpLWJpbgotJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLQotJmx0O1ZpcnR1YWxIb3N0IDExMS4yMi4zMy40NSZndDsKLQlTZXJ2ZXJOYW1lIHd3dy5ob21lcGFnZXMuaXNwLmNvbQotCi0JQ3VzdG9tTG9nIGxvZ3MvYWNjZXNzX2xvZy5ob21lcGFnZXMgdmNvbW1vbgotCi0JVmlydHVhbERvY3VtZW50Um9vdCAvd3d3L2hvbWVwYWdlcy8lMC9kb2NzCi0JU2NyaXB0QWxpYXMgICAgICAgICAvY2dpLWJpbi8gL3d3dy9zdGQtY2dpLwotJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLTwvUFJFPgotCi0KLTxIUj48SDI+PEEgTkFNRT0iaXBiYXNlZCI+TW9yZSBlZmZpY2llbnQgSVAtYmFzZWQgdmlydHVhbCBob3N0aW5nPC9BPjwvSDI+Ci0KLTxQPkFmdGVyIDxBIEhSRUY9IiNzaW1wbGUiPnRoZSBmaXJzdCBleGFtcGxlPC9BPiBJIG5vdGVkIHRoYXQgaXQgaXMKLWVhc3kgdG8gdHVybiBpdCBpbnRvIGFuIElQLWJhc2VkIHZpcnR1YWwgaG9zdGluZyBzZXR1cC4gVW5mb3J0dW5hdGVseQotdGhhdCBjb25maWd1cmF0aW9uIGlzIG5vdCB2ZXJ5IGVmZmljaWVudCBiZWNhdXNlIGl0IHJlcXVpcmVzIGEgRE5TCi1sb29rdXAgZm9yIGV2ZXJ5IHJlcXVlc3QuIFRoaXMgY2FuIGJlIGF2b2lkZWQgYnkgbGF5aW5nIG91dCB0aGUKLWZpbGVzeXN0ZW0gYWNjb3JkaW5nIHRvIHRoZSBJUCBhZGRyZXNzZXMgdGhlbXNlbHZlcyByYXRoZXIgdGhhbiB0aGUKLWNvcnJlc3BvbmRpbmcgbmFtZXMgYW5kIGNoYW5naW5nIHRoZSBsb2dnaW5nIHNpbWlsYXJseS4gQXBhY2hlIHdpbGwKLXRoZW4gdXN1YWxseSBub3QgbmVlZCB0byB3b3JrIG91dCB0aGUgc2VydmVyIG5hbWUgYW5kIHNvIGluY3VyIGEgRE5TCi1sb29rdXAuPC9QPgotCi08UFJFPgotIyBnZXQgdGhlIHNlcnZlciBuYW1lIGZyb20gdGhlIHJldmVyc2UgRE5TIG9mIHRoZSBJUCBhZGRyZXNzCi1Vc2VDYW5vbmljYWxOYW1lIEROUwotCi0jIGluY2x1ZGUgdGhlIElQIGFkZHJlc3MgaW4gdGhlIGxvZ3Mgc28gdGhleSBtYXkgYmUgc3BsaXQKLUxvZ0Zvcm1hdCAiJUEgJWggJWwgJXUgJXQgXCIlclwiICVzICViIiB2Y29tbW9uCi1DdXN0b21Mb2cgbG9ncy9hY2Nlc3NfbG9nIHZjb21tb24KLQotIyBpbmNsdWRlIHRoZSBJUCBhZGRyZXNzIGluIHRoZSBmaWxlbmFtZXMKLVZpcnR1YWxEb2N1bWVudFJvb3RJUCAvd3d3L2hvc3RzLyUwL2RvY3MKLVZpcnR1YWxTY3JpcHRBbGlhc0lQICAvd3d3L2hvc3RzLyUwL2NnaS1iaW4KLTwvUFJFPgotCi0KLTxIUj48SDI+PEEgTkFNRT0ib2xkdmVyc2lvbiI+VXNpbmcgb2xkZXIgdmVyc2lvbnMgb2YgQXBhY2hlPC9BPjwvSDI+Ci0KLTxQPlRoZSBleGFtcGxlcyBhYm92ZSByZWx5IG9uIDxDT0RFPm1vZF92aG9zdF9hbGlhczwvQ09ERT4gd2hpY2gKLWFwcGVhcmVkIGFmdGVyIHZlcnNpb24gMS4zLjYuIElmIHlvdSBhcmUgdXNpbmcgYSB2ZXJzaW9uIG9mIEFwYWNoZQotd2l0aG91dCA8Q09ERT5tb2Rfdmhvc3RfYWxpYXM8L0NPREU+IHRoZW4geW91IGNhbiBpbXBsZW1lbnQgdGhpcwotdGVjaG5pcXVlIHdpdGggPENPREU+bW9kX3Jld3JpdGU8L0NPREU+IGFzIGlsbHVzdHJhdGVkIGJlbG93LCBidXQKLW9ubHkgZm9yIEhvc3Q6LWhlYWRlci1iYXNlZCB2aXJ0dWFsIGhvc3RzLjwvUD4KLQotPFA+SW4gYWRkaXRpb24gdGhlcmUgYXJlIHNvbWUgdGhpbmdzIHRvIGJld2FyZSBvZiB3aXRoIGxvZ2dpbmcuIEFwYWNoZQotMS4zLjYgaXMgdGhlIGZpcnN0IHZlcnNpb24gdG8gaW5jbHVkZSB0aGUgPENPREU+JVY8L0NPREU+IGxvZyBmb3JtYXQKLWRpcmVjdGl2ZTsgaW4gdmVyc2lvbnMgMS4zLjAgLSAxLjMuMyB0aGUgPENPREU+JXY8L0NPREU+IG9wdGlvbiBkaWQKLXdoYXQgPENPREU+JVY8L0NPREU+IGRvZXM7IHZlcnNpb24gMS4zLjQgaGFzIG5vIGVxdWl2YWxlbnQuIEluCi1hbGwgdGhlc2UgdmVyc2lvbnMgb2YgQXBhY2hlIHRoZSA8Q09ERT5Vc2VDYW5vbmljYWxOYW1lPC9DT0RFPgotZGlyZWN0aXZlIGNhbiBhcHBlYXIgaW4gPENPREU+Lmh0YWNjZXNzPC9DT0RFPiBmaWxlcyB3aGljaCBtZWFucyB0aGF0Ci1jdXN0b21lcnMgY2FuIGNhdXNlIHRoZSB3cm9uZyB0aGluZyB0byBiZSBsb2dnZWQuIFRoZXJlZm9yZSB0aGUgYmVzdAotdGhpbmcgdG8gZG8gaXMgdXNlIHRoZSA8Q09ERT4le0hvc3R9aTwvQ09ERT4gZGlyZWN0aXZlIHdoaWNoIGxvZ3MgdGhlCi08Q09ERT5Ib3N0OjwvQ09ERT4gaGVhZGVyIGRpcmVjdGx5OyBub3RlIHRoYXQgdGhpcyBtYXkgaW5jbHVkZQotPENPREU+OnBvcnQ8L0NPREU+IG9uIHRoZSBlbmQgd2hpY2ggaXMgbm90IHRoZSBjYXNlIGZvcgotPENPREU+JVY8L0NPREU+LjwvUD4KLQotCi08SFI+PEgyPjxBIE5BTUU9InNpbXBsZS5yZXdyaXRlIj5TaW1wbGUgZHluYW1pYyB2aXJ0dWFsIGhvc3RzCi11c2luZyA8Q09ERT5tb2RfcmV3cml0ZTwvQ09ERT48L0E+PC9IMj4KLQotPFA+VGhpcyBleHRyYWN0IGZyb20gPENPREU+aHR0cGQuY29uZjwvQ09ERT4gZG9lcyB0aGUgc2FtZSB0aGluZyBhcwotPEEgSFJFRj0iI3NpbXBsZSI+dGhlIGZpcnN0IGV4YW1wbGU8L0E+LiBUaGUgZmlyc3QgaGFsZiBpcyB2ZXJ5Ci1zaW1pbGFyIHRvIHRoZSBjb3JyZXNwb25kaW5nIHBhcnQgYWJvdmUgYnV0IHdpdGggc29tZSBjaGFuZ2VzIGZvcgotYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhbmQgdG8gbWFrZSB0aGUgPENPREU+bW9kX3Jld3JpdGU8L0NPREU+IHBhcnQKLXdvcmsgcHJvcGVybHk7IHRoZSBzZWNvbmQgaGFsZiBjb25maWd1cmVzIDxDT0RFPm1vZF9yZXdyaXRlPC9DT0RFPiB0bwotZG8gdGhlIGFjdHVhbCB3b3JrLjwvUD4KLQotPFA+VGhlcmUgYXJlIGEgY291cGxlIG9mIGVzcGVjaWFsbHkgdHJpY2t5IGJpdHM6IEJ5IGRlZmF1bHQsCi08Q09ERT5tb2RfcmV3cml0ZTwvQ09ERT4gcnVucyBiZWZvcmUgdGhlIG90aGVyIFVSSSB0cmFuc2xhdGlvbiBtb2R1bGVzCi0oPENPREU+bW9kX2FsaWFzPC9DT0RFPiBldGMuKSBzbyBpZiB0aGV5IGFyZSB1c2VkIHRoZW4KLTxDT0RFPm1vZF9yZXdyaXRlPC9DT0RFPiBtdXN0IGJlIGNvbmZpZ3VyZWQgdG8gYWNjb21tb2RhdGUgdGhlbS4KLUFsc28sIG1vbWUgbWFnaWMgbXVzdCBiZSBwZXJmb3JtZWQgdG8gZG8gYSBwZXItZHluYW1pYy12aXJ0dWFsLWhvc3QKLWVxdWl2YWxlbnQgb2YgPENPREU+U2NyaXB0QWxpYXM8L0NPREU+LjwvUD4KLQotPFBSRT4KLSMgZ2V0IHRoZSBzZXJ2ZXIgbmFtZSBmcm9tIHRoZSBIb3N0OiBoZWFkZXIKLVVzZUNhbm9uaWNhbE5hbWUgT2ZmCi0KLSMgc3BsaXR0YWJsZSBsb2dzCi1Mb2dGb3JtYXQgIiV7SG9zdH1pICVoICVsICV1ICV0IFwiJXJcIiAlcyAlYiIgdmNvbW1vbgotQ3VzdG9tTG9nIGxvZ3MvYWNjZXNzX2xvZyB2Y29tbW9uCi0KLSZsdDtEaXJlY3RvcnkgL3d3dy9ob3N0cyZndDsKLQkjIEV4ZWNDR0kgaXMgbmVlZGVkIGhlcmUgYmVjYXVzZSB3ZSBjYW4ndCBmb3JjZQotCSMgQ0dJIGV4ZWN1dGlvbiBpbiB0aGUgd2F5IHRoYXQgU2NyaXB0QWxpYXMgZG9lcwotCU9wdGlvbnMgRm9sbG93U3ltTGlua3MgRXhlY0NHSQotJmx0Oy9EaXJlY3RvcnkmZ3Q7Ci0KLSMgbm93IGZvciB0aGUgaGFyZCBiaXQKLQotUmV3cml0ZUVuZ2luZSBPbgotCi0jIGEgU2VydmVyTmFtZSBkZXJpdmVkIGZyb20gYSBIb3N0OiBoZWFkZXIgbWF5IGJlIGFueSBjYXNlIGF0IGFsbAotUmV3cml0ZU1hcCAgbG93ZXJjYXNlICBpbnQ6dG9sb3dlcgotCi0jIyBkZWFsIHdpdGggbm9ybWFsIGRvY3VtZW50cyBmaXJzdDoKLSMgYWxsb3cgQWxpYXMgL2ljb25zLyB0byB3b3JrIC0gcmVwZWF0IGZvciBvdGhlciBhbGlhc2VzCi1SZXdyaXRlQ29uZCAgJXtSRVFVRVNUX1VSSX0gICFeL2ljb25zLwotIyBhbGxvdyBDR0lzIHRvIHdvcmsKLVJld3JpdGVDb25kICAle1JFUVVFU1RfVVJJfSAgIV4vY2dpLWJpbi8KLSMgZG8gdGhlIG1hZ2ljCi1SZXdyaXRlUnVsZSAgXi8oLiopJCAgL3d3dy9ob3N0cy8ke2xvd2VyY2FzZTole1NFUlZFUl9OQU1FfX0vZG9jcy8kMQotCi0jIyBhbmQgbm93IGRlYWwgd2l0aCBDR0lzIC0gd2UgaGF2ZSB0byBmb3JjZSBhIE1JTUUgdHlwZQotUmV3cml0ZUNvbmQgICV7UkVRVUVTVF9VUkl9ICBeL2NnaS1iaW4vCi1SZXdyaXRlUnVsZSAgXi8oLiopJCAgL3d3dy9ob3N0cy8ke2xvd2VyY2FzZTole1NFUlZFUl9OQU1FfX0vY2dpLWJpbi8kMSAgW1Q9YXBwbGljYXRpb24veC1odHRwZC1jZ2ldCi0KLSMgdGhhdCdzIGl0IQotPC9QUkU+Ci0KLQotPEhSPjxIMj48QSBOQU1FPSJob21lcGFnZXMucmV3cml0ZSI+QSBob21lcGFnZXMgc3lzdGVtCi11c2luZyA8Q09ERT5tb2RfcmV3cml0ZTwvQ09ERT48L0E+PC9IMj4KLQotPFA+VGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIDxBIEhSRUY9IiNob21lcGFnZXMiPnRoZQotc2Vjb25kIGV4YW1wbGU8L0E+LjwvUD4KLQotPFBSRT4KLVJld3JpdGVFbmdpbmUgb24KLQotUmV3cml0ZU1hcCAgIGxvd2VyY2FzZSAgaW50OnRvbG93ZXIKLQotIyBhbGxvdyBDR0lzIHRvIHdvcmsKLVJld3JpdGVDb25kICAle1JFUVVFU1RfVVJJfSAgIV4vY2dpLWJpbi8KLQotIyBjaGVjayB0aGUgaG9zdG5hbWUgaXMgcmlnaHQgc28gdGhhdCB0aGUgUmV3cml0ZVJ1bGUgd29ya3MKLVJld3JpdGVDb25kICAke2xvd2VyY2FzZTole1NFUlZFUl9OQU1FfX0gIF53d3dcLlthLXotXStcLmlzcFwuY29tJAotCi0jIGNvbmNhdGVuYXRlIHRoZSB2aXJ0dWFsIGhvc3QgbmFtZSBvbnRvIHRoZSBzdGFydCBvZiB0aGUgVVJJCi0jIHRoZSBbQ10gbWVhbnMgZG8gdGhlIG5leHQgcmV3cml0ZSBvbiB0aGUgcmVzdWx0IG9mIHRoaXMgb25lCi1SZXdyaXRlUnVsZSAgXiguKykgICR7bG93ZXJjYXNlOiV7U0VSVkVSX05BTUV9fSQxICBbQ10KLQotIyBub3cgY3JlYXRlIHRoZSByZWFsIGZpbGUgbmFtZQotUmV3cml0ZVJ1bGUgIF53d3dcLihbYS16LV0rKVwuaXNwXC5jb20vKC4qKSAvaG9tZS8kMS8kMgotCi0jIGRlZmluZSB0aGUgZ2xvYmFsIENHSSBkaXJlY3RvcnkKLVNjcmlwdEFsaWFzICAvY2dpLWJpbi8gIC93d3cvc3RkLWNnaS8KLTwvUFJFPgotCi0KLTxIUj48SDI+PEEgTkFNRT0ieHRyYS1jb25mIj5Vc2luZyBhIHNlcGFyYXRlIHZpcnR1YWwgaG9zdCBjb25maWd1cmF0aW9uIGZpbGU8L0E+PC9IMj4KLQotPFA+VGhpcyBhcnJhbmdlbWVudCB1c2VzIG1vcmUgYWR2YW5jZWQgPENPREU+bW9kX3Jld3JpdGU8L0NPREU+Ci1mZWF0dXJlcyB0byBnZXQgdGhlIHRyYW5zbGF0aW9uIGZyb20gdmlydHVhbCBob3N0IHRvIGRvY3VtZW50IHJvb3QKLWZyb20gYSBzZXBhcmF0ZSBjb25maWd1cmF0aW9uIGZpbGUuIFRoaXMgcHJvdmlkZXMgbW9yZSBmbGV4aWJpbGl0eSBidXQKLXJlcXVpcmVzIG1vcmUgY29tcGxpY2F0ZWQgY29uZmlndXJhdGlvbi48L1A+Ci0KLTxQPlRoZSA8Q09ERT52aG9zdC5tYXA8L0NPREU+IGZpbGUgY29udGFpbnMgc29tZXRoaW5nIGxpa2UgdGhpczoKLTxQUkU+Ci13d3cuY3VzdG9tZXItMS5jb20gIC93d3cvY3VzdG9tZXJzLzEKLXd3dy5jdXN0b21lci0yLmNvbSAgL3d3dy9jdXN0b21lcnMvMgotIyAuLi4KLXd3dy5jdXN0b21lci1OLmNvbSAgL3d3dy9jdXN0b21lcnMvTgotPC9QUkU+Ci08L1A+Ci0KLTxQPlRoZSA8Q09ERT5odHRwLmNvbmY8L0NPREU+IGNvbnRhaW5zIHRoaXM6Ci08UFJFPgotUmV3cml0ZUVuZ2luZSBvbgotCi1SZXdyaXRlTWFwICAgbG93ZXJjYXNlICBpbnQ6dG9sb3dlcgotCi0jIGRlZmluZSB0aGUgbWFwIGZpbGUKLVJld3JpdGVNYXAgICB2aG9zdCAgICAgIHR4dDovd3d3L2NvbmYvdmhvc3QubWFwCi0KLSMgZGVhbCB3aXRoIGFsaWFzZXMgYXMgYWJvdmUKLVJld3JpdGVDb25kICAle1JFUVVFU1RfVVJJfSAgICAgICAgICAgICAgICFeL2ljb25zLwotUmV3cml0ZUNvbmQgICV7UkVRVUVTVF9VUkl9ICAgICAgICAgICAgICAgIV4vY2dpLWJpbi8KLVJld3JpdGVDb25kICAke2xvd2VyY2FzZTole1NFUlZFUl9OQU1FfX0gIF4oLispJAotIyB0aGlzIGRvZXMgdGhlIGZpbGUtYmFzZWQgcmVtYXAKLVJld3JpdGVDb25kICAke3Zob3N0OiUxfSAgICAgICAgICAgICAgICAgIF4oLy4qKSQKLVJld3JpdGVSdWxlICBeLyguKikkICAgICAgICAgICAgICAgICAgICAgICUxL2RvY3MvJDEKLQotUmV3cml0ZUNvbmQgICV7UkVRVUVTVF9VUkl9ICAgICAgICAgICAgICAgXi9jZ2ktYmluLwotUmV3cml0ZUNvbmQgICR7bG93ZXJjYXNlOiV7U0VSVkVSX05BTUV9fSAgXiguKykkCi1SZXdyaXRlQ29uZCAgJHt2aG9zdDolMX0gICAgICAgICAgICAgICAgICBeKC8uKikkCi1SZXdyaXRlUnVsZSAgXi8oLiopJCAgICAgICAgICAgICAgICAgICAgICAlMS9jZ2ktYmluLyQxCi08L1BSRT4KLTwvUD4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3MvbWFudWFsL3Zob3N0cy9uYW1lLWJhc2VkLmh0bWwgYi9kb2NzL21hbnVhbC92aG9zdHMvbmFtZS1iYXNlZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzhjZjVjLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL3Zob3N0cy9uYW1lLWJhc2VkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgotPEhUTUw+PEhFQUQ+Ci08VElUTEU+QXBhY2hlIG5hbWUtYmFzZWQgVmlydHVhbCBIb3N0czwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPkFwYWNoZSBuYW1lLWJhc2VkIFZpcnR1YWwgSG9zdCBTdXBwb3J0PC9IMT4KLQotPFNUUk9ORz5TZWUgQWxzbzo8L1NUUk9ORz4KLTxBIEhSRUY9ImlwLWJhc2VkLmh0bWwiPklQLWJhc2VkIFZpcnR1YWwgSG9zdCBTdXBwb3J0PC9BPgotCi08SFI+Ci0KLTxIMj5OYW1lLWJhc2VkIHZzLiBJUC1iYXNlZCB2aXJ0dWFsIGhvc3RzPC9IMj4KLQotPFA+V2hpbGUgdGhlIGFwcHJvYWNoIHdpdGggSVAtYmFzZWQgdmlydHVhbCBob3N0cyB3b3JrcyB2ZXJ5IHdlbGwsCi1pdCBpcyBub3QgdGhlIG1vc3QgZWxlZ2FudCBzb2x1dGlvbiwgYmVjYXVzZSBhIGRlZGljYXRlZCBJUCBhZGRyZXNzCi1pcyBuZWVkZWQgZm9yIGV2ZXJ5IHZpcnR1YWwgaG9zdCBhbmQgaXQgaXMgaGFyZCB0byBpbXBsZW1lbnQgb24gc29tZQotbWFjaGluZXMuIFRoZSA8Q09ERT5IVFRQLzEuMTwvQ09ERT4gcHJvdG9jb2wgY29udGFpbnMgYSBtZXRob2QgZm9yIHRoZQotc2VydmVyIHRvIGlkZW50aWZ5IHdoYXQgbmFtZSBpdCBpcyBiZWluZyBhZGRyZXNzZWQgYXMuIEFwYWNoZSAxLjEgYW5kCi1sYXRlciBzdXBwb3J0IHRoaXMgYXBwcm9hY2ggYXMgd2VsbCBhcyB0aGUgdHJhZGl0aW9uYWwKLUlQLWFkZHJlc3MtcGVyLWhvc3RuYW1lIG1ldGhvZC48L1A+Ci0KLTxQPlRoZSBiZW5lZml0cyBvZiB1c2luZyB0aGUgbmV3IG5hbWUtYmFzZWQgdmlydHVhbCBob3N0IHN1cHBvcnQgaXMgYQotcHJhY3RpY2FsbHkgdW5saW1pdGVkIG51bWJlciBvZiBzZXJ2ZXJzLCBlYXNlIG9mIGNvbmZpZ3VyYXRpb24gYW5kIHVzZSwgYW5kCi1yZXF1aXJlcyBubyBhZGRpdGlvbmFsIGhhcmR3YXJlIG9yIHNvZnR3YXJlLiAKLVRoZSBtYWluIGRpc2FkdmFudGFnZSBpcyB0aGF0IHRoZSBjbGllbnQgbXVzdCBzdXBwb3J0IHRoaXMgcGFydCBvZiB0aGUKLXByb3RvY29sLiBUaGUgbGF0ZXN0IHZlcnNpb25zIG9mIG1vc3QgYnJvd3NlcnMgZG8sIGJ1dCB0aGVyZSBhcmUgc3RpbGwKLW9sZCBicm93c2VycyBpbiB1c2Ugd2hvIGRvIG5vdC4gVGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMsIGFsdGhvdWdoIGEgcG9zc2libGUKLXNvbHV0aW9uIGlzIGFkZHJlc3NlZCBiZWxvdy48L1A+Ci0KLTxIMj5Vc2luZyBub24tSVAgVmlydHVhbCBIb3N0czwvSDI+Ci0KLTxQPlVzaW5nIHRoZSBuZXcgdmlydHVhbCBob3N0cyBpcyBxdWl0ZSBlYXN5LCBhbmQgc3VwZXJmaWNpYWxseSBsb29rcwotbGlrZSB0aGUgb2xkIG1ldGhvZC4gVGhlIG5vdGFibGUgZGlmZmVyZW5jZSBiZXR3ZWVuIElQLWJhc2VkIGFuZAotbmFtZS1iYXNlZCB2aXJ0dWFsIGhvc3QgY29uZmlndXJhdGlvbiBpcyB0aGUKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjbmFtZXZpcnR1YWxob3N0Ij48Q09ERT5OYW1lVmlydHVhbEhvc3Q8L0NPREU+PC9BPgotZGlyZWN0aXZlIHdoaWNoIHNwZWNpZmllcyBhbiBJUCBhZGRyZXNzIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgYQotdGFyZ2V0IGZvciBuYW1lLWJhc2VkIHZpcnR1YWwgaG9zdHMuPC9QPgotCi08UD5Gb3IgZXhhbXBsZSwgc3VwcG9zZSB0aGF0IGJvdGggPFNBTVA+d3d3LmRvbWFpbi50bGQ8L1NBTVA+IGFuZAotPFNBTVA+d3d3Lm90aGVyZG9tYWluLnRsZDwvU0FNUD4gcG9pbnQgYXQgdGhlIElQIGFkZHJlc3MKLTxTQU1QPjExMS4yMi4zMy40NDwvU0FNUD4uICBUaGVuIHlvdSBzaW1wbHkgYWRkIHRvIG9uZSBvZiB0aGUgQXBhY2hlCi1jb25maWd1cmF0aW9uIGZpbGVzIChtb3N0IGxpa2VseSA8Q09ERT5odHRwZC5jb25mPC9DT0RFPiBvcgotPENPREU+c3JtLmNvbmY8L0NPREU+KSBjb2RlIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZzo8L1A+Ci0KLQotCi08UFJFPgotICAgIE5hbWVWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQKLQotICAgICZsdDtWaXJ0dWFsSG9zdCAxMTEuMjIuMzMuNDQmZ3Q7Ci0gICAgU2VydmVyTmFtZSB3d3cuZG9tYWluLnRsZAotICAgIERvY3VtZW50Um9vdCAvd3d3L2RvbWFpbgotICAgICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci0KLSAgICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0Jmd0OwotICAgIFNlcnZlck5hbWUgd3d3Lm90aGVyZG9tYWluLnRsZAotICAgIERvY3VtZW50Um9vdCAvd3d3L290aGVyZG9tYWluCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLTwvUFJFPgotCi08UD5PZiBjb3Vyc2UsIGFueSBhZGRpdGlvbmFsIGRpcmVjdGl2ZXMgY2FuIChhbmQgc2hvdWxkKSBiZSBwbGFjZWQKLWludG8gdGhlIDxDT0RFPiZsdDtWaXJ0dWFsSG9zdCZndDs8L0NPREU+IHNlY3Rpb24uIFRvIG1ha2UgdGhpcyB3b3JrLAotYWxsIHRoYXQgaXMgbmVlZGVkIGlzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBuYW1lcwotPFNBTVA+d3d3LmRvbWFpbi50bGQ8L1NBTVA+IGFuZCA8U0FNUD53d3cub3RoZXJkb21haW4udGxkPC9TQU1QPgotYXJlIHBvaW50aW5nIHRvIHRoZSBJUCBhZGRyZXNzIDxTQU1QPjExMS4yMi4zMy40NDwvU0FNUD48L1A+Ci0KLTxQPk5vdGU6IFdoZW4geW91IHNwZWNpZnkgYW4gSVAgYWRkcmVzcyBpbiBhIDxDT0RFPk5hbWVWaXJ0dWFsSG9zdDwvQ09ERT4KLWRpcmVjdGl2ZSB0aGVuIHJlcXVlc3RzIHRvIHRoYXQgSVAgYWRkcmVzcyB3aWxsIG9ubHkgZXZlciBiZSBzZXJ2ZWQKLWJ5IG1hdGNoaW5nICZsdDtWaXJ0dWFsSG9zdCZndDtzLiAgVGhlICJtYWluIHNlcnZlciIgd2lsbAotPFNUUk9ORz5uZXZlcjwvU1RST05HPiBiZSBzZXJ2ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIElQIGFkZHJlc3MuCi1JZiB5b3Ugc3RhcnQgdG8gdXNlIHZpcnR1YWwgaG9zdHMgeW91IHNob3VsZCBzdG9wIHRvIHVzZSB0aGUgIm1haW4gc2VydmVyIgotYXMgYW4gaW5kZXBlbmRlbnQgc2VydmVyIGFuZCByYXRoZXIgdXNlIGl0IGFzIGEgcGxhY2UgZm9yCi1jb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMgdGhhdCBhcmUgY29tbW9uIGZvciBhbGwgeW91ciB2aXJ0dWFsIGhvc3RzLgotSW4gb3RoZXIgd29yZHMsIHlvdSBzaG91bGQgYWRkIGEgJmx0O1ZpcnR1YWxIb3N0Jmd0OyBzZWN0aW9uIGZvcgotPEVNPmV2ZXJ5PC9FTT4gc2VydmVyIChob3N0bmFtZSkgeW91IHdhbnQgdG8gbWFpbnRhaW4gb24geW91ciBzZXJ2ZXIuCi0KLTxQPkFkZGl0aW9uYWxseSwgbWFueSBzZXJ2ZXJzIG1heSB3aXNoIHRvIGJlIGFjY2Vzc2libGUgYnkgbW9yZSB0aGFuCi1vbmUgbmFtZS4gRm9yIGV4YW1wbGUsIHRoZSBleGFtcGxlIHNlcnZlciBtaWdodCB3YW50IHRvIGJlIGFjY2Vzc2libGUKLWFzIDxDT0RFPmRvbWFpbi50bGQ8L0NPREU+LCBvciA8Q09ERT53d3cyLmRvbWFpbi50bGQ8L0NPREU+LCBhc3N1bWluZwotdGhlIElQIGFkZHJlc3NlcyBwb2ludGVkIHRvIHRoZSBzYW1lIHNlcnZlci4gSW4gZmFjdCwgb25lIG1pZ2h0IHdhbnQgaXQKLXNvIHRoYXQgYWxsIGFkZHJlc3NlcyBhdCA8Q09ERT5kb21haW4udGxkPC9DT0RFPiB3ZXJlIHBpY2tlZCB1cCBieSB0aGUKLXNlcnZlci4gVGhpcyBpcyBwb3NzaWJsZSB3aXRoIHRoZQotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNzZXJ2ZXJhbGlhcyI+PENPREU+U2VydmVyQWxpYXM8L0NPREU+PC9BPgotZGlyZWN0aXZlLCBwbGFjZWQgaW5zaWRlIHRoZSAmbHQ7VmlydHVhbEhvc3QmZ3Q7IHNlY3Rpb24uIEZvcgotZXhhbXBsZTo8L1A+Ci0KLTxQUkU+Ci0gICAgU2VydmVyQWxpYXMgZG9tYWluLnRsZCAqLmRvbWFpbi50bGQKLTwvUFJFPgotCi08UD5Ob3RlIHRoYXQgeW91IGNhbiB1c2UgPENPREU+KjwvQ09ERT4gYW5kIDxDT0RFPj88L0NPREU+IGFzIHdpbGQtY2FyZAotY2hhcmFjdGVycy48L1A+Ci0KLTxQPllvdSBhbHNvIG1pZ2h0IG5lZWQgPENPREU+U2VydmVyQWxpYXM8L0NPREU+IGlmIHlvdSBhcmUKLXNlcnZpbmcgbG9jYWwgdXNlcnMgd2hvIGRvIG5vdCBhbHdheXMgaW5jbHVkZSB0aGUgZG9tYWluIG5hbWUuCi1Gb3IgZXhhbXBsZSwgaWYgbG9jYWwgdXNlcnMgYXJlCi1mYW1pbGlhciB3aXRoIHR5cGluZyAid3d3IiBvciAid3d3LmZvb2JhciIgdGhlbiB5b3Ugd2lsbCBuZWVkIHRvIGFkZAotPENPREU+U2VydmVyQWxpYXMgd3d3IHd3dy5mb29iYXI8L0NPREU+LiAgSXQgaXNuJ3QgcG9zc2libGUgZm9yIHRoZQotc2VydmVyIHRvIGtub3cgd2hhdCBkb21haW4gdGhlIGNsaWVudCB1c2VzIGZvciB0aGVpciBuYW1lIHJlc29sdXRpb24KLWJlY2F1c2UgdGhlIGNsaWVudCBkb2Vzbid0IHByb3ZpZGUgdGhhdCBpbmZvcm1hdGlvbiBpbiB0aGUgcmVxdWVzdC4KLVRoZSA8Q09ERT5TZXJ2ZXJBbGlhczwvQ09ERT4gZGlyZWN0aXZlIGlzIGdlbmVyYWxseSBhIHdheSB0byBoYXZlIGRpZmZlcmVudAotaG9zdG5hbWVzIHBvaW50aW5nIHRvIHRoZSBzYW1lIHZpcnR1YWwgaG9zdC4KLTwvUD4KLQotPEgyPkNvbXBhdGliaWxpdHkgd2l0aCBPbGRlciBCcm93c2VyczwvSDI+Ci0KLTxQPkFzIG1lbnRpb25lZCBlYXJsaWVyLCB0aGVyZSBhcmUgc3RpbGwgc29tZSBjbGllbnRzIGluIHVzZSB3aG8KLWRvIG5vdCBzZW5kIHRoZSByZXF1aXJlZCBkYXRhIGZvciB0aGUgbmFtZS1iYXNlZCB2aXJ0dWFsIGhvc3RzIHRvIHdvcmsKLXByb3Blcmx5LiBUaGVzZSBjbGllbnRzIHdpbGwgYWx3YXlzIGJlIHNlbnQgdGhlIHBhZ2VzIGZyb20gdGhlCi1maXJzdCB2aXJ0dWFsIGhvc3QgbGlzdGVkIGZvciB0aGF0IElQIGFkZHJlc3MgKHRoZQotPENJVEU+cHJpbWFyeTwvQ0lURT4gbmFtZS1iYXNlZCB2aXJ0dWFsIGhvc3QpLjwvUD4KLQotPFA+VGhlcmUgaXMgYSBwb3NzaWJsZSB3b3JrYXJvdW5kIHdpdGggdGhlCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcnBhdGgiPjxDT0RFPlNlcnZlclBhdGg8L0NPREU+PC9BPgotZGlyZWN0aXZlLCBhbGJlaXQgYSBzbGlnaHRseSBjdW1iZXJzb21lIG9uZTo8L1A+Ci0KLTxQPkV4YW1wbGUgY29uZmlndXJhdGlvbjoKLQotPFBSRT4KLSAgICBOYW1lVmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0Ci0KLSAgICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0Jmd0OwotICAgIFNlcnZlck5hbWUgd3d3LmRvbWFpbi50bGQKLSAgICBTZXJ2ZXJQYXRoIC9kb21haW4KLSAgICBEb2N1bWVudFJvb3QgL3dlYi9kb21haW4KLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotPC9QUkU+Ci0KLTxQPldoYXQgZG9lcyB0aGlzIG1lYW4/IEl0IG1lYW5zIHRoYXQgYSByZXF1ZXN0IGZvciBhbnkgVVJJIGJlZ2lubmluZwotd2l0aCAiPFNBTVA+L2RvbWFpbjwvU0FNUD4iIHdpbGwgYmUgc2VydmVkIGZyb20gdGhlIHZpcnR1YWwgaG9zdAotPFNBTVA+d3d3LmRvbWFpbi50bGQ8L1NBTVA+IFRoaXMgbWVhbnMgdGhhdCB0aGUgcGFnZXMgY2FuIGJlIGFjY2Vzc2VkIGFzCi08Q09ERT5odHRwOi8vd3d3LmRvbWFpbi50bGQvZG9tYWluLzwvQ09ERT4gZm9yIGFsbCBjbGllbnRzLCBhbHRob3VnaAotY2xpZW50cyBzZW5kaW5nIGEgPFNBTVA+SG9zdDo8L1NBTVA+IGhlYWRlciBjYW4gYWxzbyBhY2Nlc3MgaXQgYXMKLTxDT0RFPmh0dHA6Ly93d3cuZG9tYWluLnRsZC88L0NPREU+LjwvUD4KLQotPFA+SW4gb3JkZXIgdG8gbWFrZSB0aGlzIHdvcmssIHB1dCBhIGxpbmsgb24geW91ciBwcmltYXJ5IHZpcnR1YWwgaG9zdCdzIHBhZ2UKLXRvIDxTQU1QPmh0dHA6Ly93d3cuZG9tYWluLnRsZC9kb21haW4vPC9TQU1QPgotVGhlbiwgaW4gdGhlIHZpcnR1YWwgaG9zdCdzIHBhZ2VzLCBiZSBzdXJlIHRvIHVzZSBlaXRoZXIgcHVyZWx5Ci1yZWxhdGl2ZSBsaW5rcyAoPEVNPmUuZy48L0VNPiwgIjxTQU1QPmZpbGUuaHRtbDwvU0FNUD4iIG9yCi0iPFNBTVA+Li4vaWNvbnMvaW1hZ2UuZ2lmPC9TQU1QPiIgb3IgbGlua3MgY29udGFpbmluZyB0aGUgcHJlZmFjaW5nCi08U0FNUD4vZG9tYWluLzwvU0FNUD4KLSg8RU0+ZS5nLjwvRU0+LCAiPFNBTVA+aHR0cDovL3d3dy5kb21haW4udGxkL2RvbWFpbi9taXNjL2ZpbGUuaHRtbDwvU0FNUD4iIG9yCi0iPFNBTVA+L2RvbWFpbi9taXNjL2ZpbGUuaHRtbDwvU0FNUD4iKS48L1A+Ci0KLTxQPlRoaXMgcmVxdWlyZXMgYSBiaXQgb2YKLWRpc2NpcGxpbmUsIGJ1dCBhZGhlcmVuY2UgdG8gdGhlc2UgZ3VpZGVsaW5lcyB3aWxsLCBmb3IgdGhlIG1vc3QgcGFydCwKLWVuc3VyZSB0aGF0IHlvdXIgcGFnZXMgd2lsbCB3b3JrIHdpdGggYWxsIGJyb3dzZXJzLCBuZXcgYW5kIG9sZC48L1A+Ci0KLTxQPlNlZSBhbHNvOiA8QSBIUkVGPSJleGFtcGxlcy5odG1sI3NlcnZlcnBhdGgiPlNlcnZlclBhdGggY29uZmlndXJhdGlvbgotZXhhbXBsZTwvQT48L1A+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC92aG9zdHMvbmFtZS1iYXNlZC5odG1sLmVuIGIvZG9jcy9tYW51YWwvdmhvc3RzL25hbWUtYmFzZWQuaHRtbC5lbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4Y2Y1Yy4uMDAwMDAwMAotLS0gYS9kb2NzL21hbnVhbC92aG9zdHMvbmFtZS1iYXNlZC5odG1sLmVuCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPjxIRUFEPgotPFRJVExFPkFwYWNoZSBuYW1lLWJhc2VkIFZpcnR1YWwgSG9zdHM8L1RJVExFPgotPC9IRUFEPgotCi08IS0tIEJhY2tncm91bmQgd2hpdGUsIGxpbmtzIGJsdWUgKHVudmlzaXRlZCksIG5hdnkgKHZpc2l0ZWQpLCByZWQgKGFjdGl2ZSkgLS0+Ci08Qk9EWQotIEJHQ09MT1I9IiNGRkZGRkYiCi0gVEVYVD0iIzAwMDAwMCIKLSBMSU5LPSIjMDAwMEZGIgotIFZMSU5LPSIjMDAwMDgwIgotIEFMSU5LPSIjRkYwMDAwIgotPgotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImhlYWRlci5odG1sIiAtLT4KLTxIMSBBTElHTj0iQ0VOVEVSIj5BcGFjaGUgbmFtZS1iYXNlZCBWaXJ0dWFsIEhvc3QgU3VwcG9ydDwvSDE+Ci0KLTxTVFJPTkc+U2VlIEFsc286PC9TVFJPTkc+Ci08QSBIUkVGPSJpcC1iYXNlZC5odG1sIj5JUC1iYXNlZCBWaXJ0dWFsIEhvc3QgU3VwcG9ydDwvQT4KLQotPEhSPgotCi08SDI+TmFtZS1iYXNlZCB2cy4gSVAtYmFzZWQgdmlydHVhbCBob3N0czwvSDI+Ci0KLTxQPldoaWxlIHRoZSBhcHByb2FjaCB3aXRoIElQLWJhc2VkIHZpcnR1YWwgaG9zdHMgd29ya3MgdmVyeSB3ZWxsLAotaXQgaXMgbm90IHRoZSBtb3N0IGVsZWdhbnQgc29sdXRpb24sIGJlY2F1c2UgYSBkZWRpY2F0ZWQgSVAgYWRkcmVzcwotaXMgbmVlZGVkIGZvciBldmVyeSB2aXJ0dWFsIGhvc3QgYW5kIGl0IGlzIGhhcmQgdG8gaW1wbGVtZW50IG9uIHNvbWUKLW1hY2hpbmVzLiBUaGUgPENPREU+SFRUUC8xLjE8L0NPREU+IHByb3RvY29sIGNvbnRhaW5zIGEgbWV0aG9kIGZvciB0aGUKLXNlcnZlciB0byBpZGVudGlmeSB3aGF0IG5hbWUgaXQgaXMgYmVpbmcgYWRkcmVzc2VkIGFzLiBBcGFjaGUgMS4xIGFuZAotbGF0ZXIgc3VwcG9ydCB0aGlzIGFwcHJvYWNoIGFzIHdlbGwgYXMgdGhlIHRyYWRpdGlvbmFsCi1JUC1hZGRyZXNzLXBlci1ob3N0bmFtZSBtZXRob2QuPC9QPgotCi08UD5UaGUgYmVuZWZpdHMgb2YgdXNpbmcgdGhlIG5ldyBuYW1lLWJhc2VkIHZpcnR1YWwgaG9zdCBzdXBwb3J0IGlzIGEKLXByYWN0aWNhbGx5IHVubGltaXRlZCBudW1iZXIgb2Ygc2VydmVycywgZWFzZSBvZiBjb25maWd1cmF0aW9uIGFuZCB1c2UsIGFuZAotcmVxdWlyZXMgbm8gYWRkaXRpb25hbCBoYXJkd2FyZSBvciBzb2Z0d2FyZS4gCi1UaGUgbWFpbiBkaXNhZHZhbnRhZ2UgaXMgdGhhdCB0aGUgY2xpZW50IG11c3Qgc3VwcG9ydCB0aGlzIHBhcnQgb2YgdGhlCi1wcm90b2NvbC4gVGhlIGxhdGVzdCB2ZXJzaW9ucyBvZiBtb3N0IGJyb3dzZXJzIGRvLCBidXQgdGhlcmUgYXJlIHN0aWxsCi1vbGQgYnJvd3NlcnMgaW4gdXNlIHdobyBkbyBub3QuIFRoaXMgY2FuIGNhdXNlIHByb2JsZW1zLCBhbHRob3VnaCBhIHBvc3NpYmxlCi1zb2x1dGlvbiBpcyBhZGRyZXNzZWQgYmVsb3cuPC9QPgotCi08SDI+VXNpbmcgbm9uLUlQIFZpcnR1YWwgSG9zdHM8L0gyPgotCi08UD5Vc2luZyB0aGUgbmV3IHZpcnR1YWwgaG9zdHMgaXMgcXVpdGUgZWFzeSwgYW5kIHN1cGVyZmljaWFsbHkgbG9va3MKLWxpa2UgdGhlIG9sZCBtZXRob2QuIFRoZSBub3RhYmxlIGRpZmZlcmVuY2UgYmV0d2VlbiBJUC1iYXNlZCBhbmQKLW5hbWUtYmFzZWQgdmlydHVhbCBob3N0IGNvbmZpZ3VyYXRpb24gaXMgdGhlCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI25hbWV2aXJ0dWFsaG9zdCI+PENPREU+TmFtZVZpcnR1YWxIb3N0PC9DT0RFPjwvQT4KLWRpcmVjdGl2ZSB3aGljaCBzcGVjaWZpZXMgYW4gSVAgYWRkcmVzcyB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIGEKLXRhcmdldCBmb3IgbmFtZS1iYXNlZCB2aXJ0dWFsIGhvc3RzLjwvUD4KLQotPFA+Rm9yIGV4YW1wbGUsIHN1cHBvc2UgdGhhdCBib3RoIDxTQU1QPnd3dy5kb21haW4udGxkPC9TQU1QPiBhbmQKLTxTQU1QPnd3dy5vdGhlcmRvbWFpbi50bGQ8L1NBTVA+IHBvaW50IGF0IHRoZSBJUCBhZGRyZXNzCi08U0FNUD4xMTEuMjIuMzMuNDQ8L1NBTVA+LiAgVGhlbiB5b3Ugc2ltcGx5IGFkZCB0byBvbmUgb2YgdGhlIEFwYWNoZQotY29uZmlndXJhdGlvbiBmaWxlcyAobW9zdCBsaWtlbHkgPENPREU+aHR0cGQuY29uZjwvQ09ERT4gb3IKLTxDT0RFPnNybS5jb25mPC9DT0RFPikgY29kZSBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmc6PC9QPgotCi0KLQotPFBSRT4KLSAgICBOYW1lVmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0Ci0KLSAgICAmbHQ7VmlydHVhbEhvc3QgMTExLjIyLjMzLjQ0Jmd0OwotICAgIFNlcnZlck5hbWUgd3d3LmRvbWFpbi50bGQKLSAgICBEb2N1bWVudFJvb3QgL3d3dy9kb21haW4KLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotCi0gICAgJmx0O1ZpcnR1YWxIb3N0IDExMS4yMi4zMy40NCZndDsKLSAgICBTZXJ2ZXJOYW1lIHd3dy5vdGhlcmRvbWFpbi50bGQKLSAgICBEb2N1bWVudFJvb3QgL3d3dy9vdGhlcmRvbWFpbgotICAgICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci08L1BSRT4KLQotPFA+T2YgY291cnNlLCBhbnkgYWRkaXRpb25hbCBkaXJlY3RpdmVzIGNhbiAoYW5kIHNob3VsZCkgYmUgcGxhY2VkCi1pbnRvIHRoZSA8Q09ERT4mbHQ7VmlydHVhbEhvc3QmZ3Q7PC9DT0RFPiBzZWN0aW9uLiBUbyBtYWtlIHRoaXMgd29yaywKLWFsbCB0aGF0IGlzIG5lZWRlZCBpcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbmFtZXMKLTxTQU1QPnd3dy5kb21haW4udGxkPC9TQU1QPiBhbmQgPFNBTVA+d3d3Lm90aGVyZG9tYWluLnRsZDwvU0FNUD4KLWFyZSBwb2ludGluZyB0byB0aGUgSVAgYWRkcmVzcyA8U0FNUD4xMTEuMjIuMzMuNDQ8L1NBTVA+PC9QPgotCi08UD5Ob3RlOiBXaGVuIHlvdSBzcGVjaWZ5IGFuIElQIGFkZHJlc3MgaW4gYSA8Q09ERT5OYW1lVmlydHVhbEhvc3Q8L0NPREU+Ci1kaXJlY3RpdmUgdGhlbiByZXF1ZXN0cyB0byB0aGF0IElQIGFkZHJlc3Mgd2lsbCBvbmx5IGV2ZXIgYmUgc2VydmVkCi1ieSBtYXRjaGluZyAmbHQ7VmlydHVhbEhvc3QmZ3Q7cy4gIFRoZSAibWFpbiBzZXJ2ZXIiIHdpbGwKLTxTVFJPTkc+bmV2ZXI8L1NUUk9ORz4gYmUgc2VydmVkIGZyb20gdGhlIHNwZWNpZmllZCBJUCBhZGRyZXNzLgotSWYgeW91IHN0YXJ0IHRvIHVzZSB2aXJ0dWFsIGhvc3RzIHlvdSBzaG91bGQgc3RvcCB0byB1c2UgdGhlICJtYWluIHNlcnZlciIKLWFzIGFuIGluZGVwZW5kZW50IHNlcnZlciBhbmQgcmF0aGVyIHVzZSBpdCBhcyBhIHBsYWNlIGZvcgotY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzIHRoYXQgYXJlIGNvbW1vbiBmb3IgYWxsIHlvdXIgdmlydHVhbCBob3N0cy4KLUluIG90aGVyIHdvcmRzLCB5b3Ugc2hvdWxkIGFkZCBhICZsdDtWaXJ0dWFsSG9zdCZndDsgc2VjdGlvbiBmb3IKLTxFTT5ldmVyeTwvRU0+IHNlcnZlciAoaG9zdG5hbWUpIHlvdSB3YW50IHRvIG1haW50YWluIG9uIHlvdXIgc2VydmVyLgotCi08UD5BZGRpdGlvbmFsbHksIG1hbnkgc2VydmVycyBtYXkgd2lzaCB0byBiZSBhY2Nlc3NpYmxlIGJ5IG1vcmUgdGhhbgotb25lIG5hbWUuIEZvciBleGFtcGxlLCB0aGUgZXhhbXBsZSBzZXJ2ZXIgbWlnaHQgd2FudCB0byBiZSBhY2Nlc3NpYmxlCi1hcyA8Q09ERT5kb21haW4udGxkPC9DT0RFPiwgb3IgPENPREU+d3d3Mi5kb21haW4udGxkPC9DT0RFPiwgYXNzdW1pbmcKLXRoZSBJUCBhZGRyZXNzZXMgcG9pbnRlZCB0byB0aGUgc2FtZSBzZXJ2ZXIuIEluIGZhY3QsIG9uZSBtaWdodCB3YW50IGl0Ci1zbyB0aGF0IGFsbCBhZGRyZXNzZXMgYXQgPENPREU+ZG9tYWluLnRsZDwvQ09ERT4gd2VyZSBwaWNrZWQgdXAgYnkgdGhlCi1zZXJ2ZXIuIFRoaXMgaXMgcG9zc2libGUgd2l0aCB0aGUKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjc2VydmVyYWxpYXMiPjxDT0RFPlNlcnZlckFsaWFzPC9DT0RFPjwvQT4KLWRpcmVjdGl2ZSwgcGxhY2VkIGluc2lkZSB0aGUgJmx0O1ZpcnR1YWxIb3N0Jmd0OyBzZWN0aW9uLiBGb3IKLWV4YW1wbGU6PC9QPgotCi08UFJFPgotICAgIFNlcnZlckFsaWFzIGRvbWFpbi50bGQgKi5kb21haW4udGxkCi08L1BSRT4KLQotPFA+Tm90ZSB0aGF0IHlvdSBjYW4gdXNlIDxDT0RFPio8L0NPREU+IGFuZCA8Q09ERT4/PC9DT0RFPiBhcyB3aWxkLWNhcmQKLWNoYXJhY3RlcnMuPC9QPgotCi08UD5Zb3UgYWxzbyBtaWdodCBuZWVkIDxDT0RFPlNlcnZlckFsaWFzPC9DT0RFPiBpZiB5b3UgYXJlCi1zZXJ2aW5nIGxvY2FsIHVzZXJzIHdobyBkbyBub3QgYWx3YXlzIGluY2x1ZGUgdGhlIGRvbWFpbiBuYW1lLgotRm9yIGV4YW1wbGUsIGlmIGxvY2FsIHVzZXJzIGFyZQotZmFtaWxpYXIgd2l0aCB0eXBpbmcgInd3dyIgb3IgInd3dy5mb29iYXIiIHRoZW4geW91IHdpbGwgbmVlZCB0byBhZGQKLTxDT0RFPlNlcnZlckFsaWFzIHd3dyB3d3cuZm9vYmFyPC9DT0RFPi4gIEl0IGlzbid0IHBvc3NpYmxlIGZvciB0aGUKLXNlcnZlciB0byBrbm93IHdoYXQgZG9tYWluIHRoZSBjbGllbnQgdXNlcyBmb3IgdGhlaXIgbmFtZSByZXNvbHV0aW9uCi1iZWNhdXNlIHRoZSBjbGllbnQgZG9lc24ndCBwcm92aWRlIHRoYXQgaW5mb3JtYXRpb24gaW4gdGhlIHJlcXVlc3QuCi1UaGUgPENPREU+U2VydmVyQWxpYXM8L0NPREU+IGRpcmVjdGl2ZSBpcyBnZW5lcmFsbHkgYSB3YXkgdG8gaGF2ZSBkaWZmZXJlbnQKLWhvc3RuYW1lcyBwb2ludGluZyB0byB0aGUgc2FtZSB2aXJ0dWFsIGhvc3QuCi08L1A+Ci0KLTxIMj5Db21wYXRpYmlsaXR5IHdpdGggT2xkZXIgQnJvd3NlcnM8L0gyPgotCi08UD5BcyBtZW50aW9uZWQgZWFybGllciwgdGhlcmUgYXJlIHN0aWxsIHNvbWUgY2xpZW50cyBpbiB1c2Ugd2hvCi1kbyBub3Qgc2VuZCB0aGUgcmVxdWlyZWQgZGF0YSBmb3IgdGhlIG5hbWUtYmFzZWQgdmlydHVhbCBob3N0cyB0byB3b3JrCi1wcm9wZXJseS4gVGhlc2UgY2xpZW50cyB3aWxsIGFsd2F5cyBiZSBzZW50IHRoZSBwYWdlcyBmcm9tIHRoZQotZmlyc3QgdmlydHVhbCBob3N0IGxpc3RlZCBmb3IgdGhhdCBJUCBhZGRyZXNzICh0aGUKLTxDSVRFPnByaW1hcnk8L0NJVEU+IG5hbWUtYmFzZWQgdmlydHVhbCBob3N0KS48L1A+Ci0KLTxQPlRoZXJlIGlzIGEgcG9zc2libGUgd29ya2Fyb3VuZCB3aXRoIHRoZQotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNzZXJ2ZXJwYXRoIj48Q09ERT5TZXJ2ZXJQYXRoPC9DT0RFPjwvQT4KLWRpcmVjdGl2ZSwgYWxiZWl0IGEgc2xpZ2h0bHkgY3VtYmVyc29tZSBvbmU6PC9QPgotCi08UD5FeGFtcGxlIGNvbmZpZ3VyYXRpb246Ci0KLTxQUkU+Ci0gICAgTmFtZVZpcnR1YWxIb3N0IDExMS4yMi4zMy40NAotCi0gICAgJmx0O1ZpcnR1YWxIb3N0IDExMS4yMi4zMy40NCZndDsKLSAgICBTZXJ2ZXJOYW1lIHd3dy5kb21haW4udGxkCi0gICAgU2VydmVyUGF0aCAvZG9tYWluCi0gICAgRG9jdW1lbnRSb290IC93ZWIvZG9tYWluCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLTwvUFJFPgotCi08UD5XaGF0IGRvZXMgdGhpcyBtZWFuPyBJdCBtZWFucyB0aGF0IGEgcmVxdWVzdCBmb3IgYW55IFVSSSBiZWdpbm5pbmcKLXdpdGggIjxTQU1QPi9kb21haW48L1NBTVA+IiB3aWxsIGJlIHNlcnZlZCBmcm9tIHRoZSB2aXJ0dWFsIGhvc3QKLTxTQU1QPnd3dy5kb21haW4udGxkPC9TQU1QPiBUaGlzIG1lYW5zIHRoYXQgdGhlIHBhZ2VzIGNhbiBiZSBhY2Nlc3NlZCBhcwotPENPREU+aHR0cDovL3d3dy5kb21haW4udGxkL2RvbWFpbi88L0NPREU+IGZvciBhbGwgY2xpZW50cywgYWx0aG91Z2gKLWNsaWVudHMgc2VuZGluZyBhIDxTQU1QPkhvc3Q6PC9TQU1QPiBoZWFkZXIgY2FuIGFsc28gYWNjZXNzIGl0IGFzCi08Q09ERT5odHRwOi8vd3d3LmRvbWFpbi50bGQvPC9DT0RFPi48L1A+Ci0KLTxQPkluIG9yZGVyIHRvIG1ha2UgdGhpcyB3b3JrLCBwdXQgYSBsaW5rIG9uIHlvdXIgcHJpbWFyeSB2aXJ0dWFsIGhvc3QncyBwYWdlCi10byA8U0FNUD5odHRwOi8vd3d3LmRvbWFpbi50bGQvZG9tYWluLzwvU0FNUD4KLVRoZW4sIGluIHRoZSB2aXJ0dWFsIGhvc3QncyBwYWdlcywgYmUgc3VyZSB0byB1c2UgZWl0aGVyIHB1cmVseQotcmVsYXRpdmUgbGlua3MgKDxFTT5lLmcuPC9FTT4sICI8U0FNUD5maWxlLmh0bWw8L1NBTVA+IiBvcgotIjxTQU1QPi4uL2ljb25zL2ltYWdlLmdpZjwvU0FNUD4iIG9yIGxpbmtzIGNvbnRhaW5pbmcgdGhlIHByZWZhY2luZwotPFNBTVA+L2RvbWFpbi88L1NBTVA+Ci0oPEVNPmUuZy48L0VNPiwgIjxTQU1QPmh0dHA6Ly93d3cuZG9tYWluLnRsZC9kb21haW4vbWlzYy9maWxlLmh0bWw8L1NBTVA+IiBvcgotIjxTQU1QPi9kb21haW4vbWlzYy9maWxlLmh0bWw8L1NBTVA+IikuPC9QPgotCi08UD5UaGlzIHJlcXVpcmVzIGEgYml0IG9mCi1kaXNjaXBsaW5lLCBidXQgYWRoZXJlbmNlIHRvIHRoZXNlIGd1aWRlbGluZXMgd2lsbCwgZm9yIHRoZSBtb3N0IHBhcnQsCi1lbnN1cmUgdGhhdCB5b3VyIHBhZ2VzIHdpbGwgd29yayB3aXRoIGFsbCBicm93c2VycywgbmV3IGFuZCBvbGQuPC9QPgotCi08UD5TZWUgYWxzbzogPEEgSFJFRj0iZXhhbXBsZXMuaHRtbCNzZXJ2ZXJwYXRoIj5TZXJ2ZXJQYXRoIGNvbmZpZ3VyYXRpb24KLWV4YW1wbGU8L0E+PC9QPgotCi08IS0tI2luY2x1ZGUgdmlydHVhbD0iZm9vdGVyLmh0bWwiIC0tPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9tYW51YWwvdmhvc3RzL3Zob3N0cy1pbi1kZXB0aC5odG1sIGIvZG9jcy9tYW51YWwvdmhvc3RzL3Zob3N0cy1pbi1kZXB0aC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2Q4ZTkxLi4wMDAwMDAwCi0tLSBhL2RvY3MvbWFudWFsL3Zob3N0cy92aG9zdHMtaW4tZGVwdGguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+Ci08SFRNTD48SEVBRD4KLTxUSVRMRT5BbiBJbi1EZXB0aCBEaXNjdXNzaW9uIG9mIFZpcnR1YWxIb3N0IE1hdGNoaW5nPC9USVRMRT4KLTwvSEVBRD4KLQotPCEtLSBCYWNrZ3JvdW5kIHdoaXRlLCBsaW5rcyBibHVlICh1bnZpc2l0ZWQpLCBuYXZ5ICh2aXNpdGVkKSwgcmVkIChhY3RpdmUpIC0tPgotPEJPRFkKLSBCR0NPTE9SPSIjRkZGRkZGIgotIFRFWFQ9IiMwMDAwMDAiCi0gTElOSz0iIzAwMDBGRiIKLSBWTElOSz0iIzAwMDA4MCIKLSBBTElOSz0iI0ZGMDAwMCIKLT4KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJoZWFkZXIuaHRtbCIgLS0+Ci08SDEgQUxJR049IkNFTlRFUiI+QW4gSW4tRGVwdGggRGlzY3Vzc2lvbiBvZiBWaXJ0dWFsSG9zdCBNYXRjaGluZzwvSDE+Ci0KLTxQPlRoaXMgaXMgYSB2ZXJ5IHJvdWdoIGRvY3VtZW50IHRoYXQgd2FzIHByb2JhYmx5IG91dCBvZiBkYXRlIHRoZSBtb21lbnQKLWl0IHdhcyB3cml0dGVuLiAgSXQgYXR0ZW1wdHMgdG8gZXhwbGFpbiBleGFjdGx5IHdoYXQgdGhlIGNvZGUgZG9lcyB3aGVuCi1kZWNpZGluZyB3aGF0IHZpcnR1YWwgaG9zdCB0byBzZXJ2ZSBhIGhpdCBmcm9tLiAgSXQncyBwcm92aWRlZCBvbiB0aGUKLWFzc3VtcHRpb24gdGhhdCBzb21ldGhpbmcgaXMgYmV0dGVyIHRoYW4gbm90aGluZy4gIFRoZSBzZXJ2ZXIgdmVyc2lvbgotdW5kZXIgZGlzY3Vzc2lvbiBpcyBBcGFjaGUgMS4yLgotCi08UD5JZiB5b3UganVzdCB3YW50IHRvICZxdW90O21ha2UgaXQgd29yayZxdW90OyB3aXRob3V0IHVuZGVyc3RhbmRpbmcKLWhvdywgdGhlcmUncyBhIDxBIEhSRUY9IiN3aGF0d29ya3MiPldoYXQgV29ya3M8L0E+IHNlY3Rpb24gYXQgdGhlIGJvdHRvbS4KLQotPEgzPkNvbmZpZyBGaWxlIFBhcnNpbmc8L0gzPgotCi08UD5UaGVyZSBpcyBhIG1haW5fc2VydmVyIHdoaWNoIGNvbnNpc3RzIG9mIGFsbCB0aGUgZGVmaW5pdGlvbnMgYXBwZWFyaW5nCi1vdXRzaWRlIG9mIDxDT0RFPlZpcnR1YWxIb3N0PC9DT0RFPiBzZWN0aW9ucy4gIFRoZXJlIGFyZSB2aXJ0dWFsIHNlcnZlcnMsCi1jYWxsZWQgPEVNPnZob3N0czwvRU0+LCB3aGljaCBhcmUgZGVmaW5lZCBieQotPEEKLSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3ZpcnR1YWxob3N0IgotPjxTQU1QPlZpcnR1YWxIb3N0PC9TQU1QPjwvQT4KLXNlY3Rpb25zLgotCi08UD5UaGUgZGlyZWN0aXZlcwotPEEKLSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3BvcnQiCi0+PFNBTVA+UG9ydDwvU0FNUD48L0E+LAotPEEKLSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcm5hbWUiCi0+PFNBTVA+U2VydmVyTmFtZTwvU0FNUD48L0E+LAotPEEKLSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcnBhdGgiCi0+PFNBTVA+U2VydmVyUGF0aDwvU0FNUD48L0E+LAotYW5kCi08QQotIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjc2VydmVyYWxpYXMiCi0+PFNBTVA+U2VydmVyQWxpYXM8L1NBTVA+PC9BPgotY2FuIGFwcGVhciBhbnl3aGVyZSB3aXRoaW4gdGhlIGRlZmluaXRpb24gb2YKLWEgc2VydmVyLiAgSG93ZXZlciwgZWFjaCBhcHBlYXJhbmNlIG92ZXJyaWRlcyB0aGUgcHJldmlvdXMgYXBwZWFyYW5jZQotKHdpdGhpbiB0aGF0IHNlcnZlcikuCi0KLTxQPlRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSA8Q09ERT5Qb3J0PC9DT0RFPiBmaWVsZCBmb3IgbWFpbl9zZXJ2ZXIKLWlzIDgwLiAgVGhlIG1haW5fc2VydmVyIGhhcyBubyBkZWZhdWx0IDxDT0RFPlNlcnZlck5hbWU8L0NPREU+LAotPENPREU+U2VydmVyUGF0aDwvQ09ERT4sIG9yIDxDT0RFPlNlcnZlckFsaWFzPC9DT0RFPi4KLQotPFA+SW4gdGhlIGFic2VuY2Ugb2YgYW55Ci08QQotIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjbGlzdGVuIgotPjxTQU1QPkxpc3RlbjwvU0FNUD48L0E+Ci1kaXJlY3RpdmVzLCB0aGUgKGZpbmFsIGlmIHRoZXJlCi1hcmUgbXVsdGlwbGUpIDxDT0RFPlBvcnQ8L0NPREU+IGRpcmVjdGl2ZSBpbiB0aGUgbWFpbl9zZXJ2ZXIgaW5kaWNhdGVzCi13aGljaCBwb3J0IGh0dHBkIHdpbGwgbGlzdGVuIG9uLgotCi08UD4gVGhlIDxDT0RFPlBvcnQ8L0NPREU+IGFuZCA8Q09ERT5TZXJ2ZXJOYW1lPC9DT0RFPiBkaXJlY3RpdmVzIGZvcgotYW55IHNlcnZlciBtYWluIG9yIHZpcnR1YWwgYXJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIFVSTHMgc3VjaCBhcyBkdXJpbmcKLXJlZGlyZWN0cy4KLQotPFA+IEVhY2ggYWRkcmVzcyBhcHBlYXJpbmcgaW4gdGhlIDxDT0RFPlZpcnR1YWxIb3N0PC9DT0RFPiBkaXJlY3RpdmUKLWNhbiBoYXZlIGFuIG9wdGlvbmFsIHBvcnQuICBJZiB0aGUgcG9ydCBpcyB1bnNwZWNpZmllZCBpdCBkZWZhdWx0cyB0bwotdGhlIHZhbHVlIG9mIHRoZSBtYWluX3NlcnZlcidzIG1vc3QgcmVjZW50IDxDT0RFPlBvcnQ8L0NPREU+IHN0YXRlbWVudC4KLVRoZSBzcGVjaWFsIHBvcnQgPFNBTVA+KjwvU0FNUD4gaW5kaWNhdGVzIGEgd2lsZGNhcmQgdGhhdCBtYXRjaGVzIGFueSBwb3J0LgotQ29sbGVjdGl2ZWx5IHRoZSBlbnRpcmUgc2V0IG9mIGFkZHJlc3NlcyAoaW5jbHVkaW5nIG11bHRpcGxlCi08U0FNUD5BPC9TQU1QPiByZWNvcmQKLXJlc3VsdHMgZnJvbSBETlMgbG9va3VwcykgYXJlIGNhbGxlZCB0aGUgdmhvc3QncyA8RU0+YWRkcmVzcyBzZXQ8L0VNPi4KLQotPFA+IFRoZSBtYWdpYyA8Q09ERT5fZGVmYXVsdF88L0NPREU+IGFkZHJlc3MgaGFzIHNpZ25pZmljYW5jZSBkdXJpbmcKLXRoZSBtYXRjaGluZyBhbGdvcml0aG0uICBJdCBlc3NlbnRpYWxseSBtYXRjaGVzIGFueSB1bnNwZWNpZmllZCBhZGRyZXNzLgotCi08UD4gQWZ0ZXIgcGFyc2luZyB0aGUgPENPREU+VmlydHVhbEhvc3Q8L0NPREU+IGRpcmVjdGl2ZSwgdGhlIHZob3N0IHNlcnZlcgotaXMgZ2l2ZW4gYSBkZWZhdWx0IDxDT0RFPlBvcnQ8L0NPREU+IGVxdWFsIHRvIHRoZSBwb3J0IGFzc2lnbmVkIHRvIHRoZQotZmlyc3QgbmFtZSBpbiBpdHMgPENPREU+VmlydHVhbEhvc3Q8L0NPREU+IGRpcmVjdGl2ZS4gIFRoZSBjb21wbGV0ZQotbGlzdCBvZiBuYW1lcyBpbiB0aGUgPENPREU+VmlydHVhbEhvc3Q8L0NPREU+IGRpcmVjdGl2ZSBhcmUgdHJlYXRlZAotanVzdCBsaWtlIGEgPENPREU+U2VydmVyQWxpYXM8L0NPREU+IChidXQgYXJlIG5vdCBvdmVycmlkZGVuIGJ5IGFueQotPENPREU+U2VydmVyQWxpYXM8L0NPREU+IHN0YXRlbWVudCkuICBOb3RlIHRoYXQgc3Vic2VxdWVudCA8Q09ERT5Qb3J0PC9DT0RFPgotc3RhdGVtZW50cyBmb3IgdGhpcyB2aG9zdCB3aWxsIG5vdCBhZmZlY3QgdGhlIHBvcnRzIGFzc2lnbmVkIGluIHRoZQotYWRkcmVzcyBzZXQuCi0KLTxQPgotQWxsIHZob3N0cyBhcmUgc3RvcmVkIGluIGEgbGlzdCB3aGljaCBpcyBpbiB0aGUgcmV2ZXJzZSBvcmRlciB0aGF0Ci10aGV5IGFwcGVhcmVkIGluIHRoZSBjb25maWcgZmlsZS4gIEZvciBleGFtcGxlLCBpZiB0aGUgY29uZmlnIGZpbGUgaXM6Ci0KLTxCTE9DS1FVT1RFPjxQUkU+Ci0gICAgJmx0O1ZpcnR1YWxIb3N0IEEmZ3Q7Ci0gICAgLi4uCi0gICAgJmx0Oy9WaXJ0dWFsSG9zdCZndDsKLQotICAgICZsdDtWaXJ0dWFsSG9zdCBCJmd0OwotICAgIC4uLgotICAgICZsdDsvVmlydHVhbEhvc3QmZ3Q7Ci0KLSAgICAmbHQ7VmlydHVhbEhvc3QgQyZndDsKLSAgICAuLi4KLSAgICAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwotPC9QUkU+PC9CTE9DS1FVT1RFPgotCi1UaGVuIHRoZSBsaXN0IHdpbGwgYmUgb3JkZXJlZDogbWFpbl9zZXJ2ZXIsIEMsIEIsIEEuICBLZWVwIHRoaXMgaW4gbWluZC4KLQotPFA+Ci1BZnRlciBwYXJzaW5nIGhhcyBjb21wbGV0ZWQsIHRoZSBsaXN0IG9mIHNlcnZlcnMgaXMgc2Nhbm5lZCwgYW5kIHZhcmlvdXMKLW1lcmdlcyBhbmQgZGVmYXVsdCB2YWx1ZXMgYXJlIHNldC4gIEluIHBhcnRpY3VsYXI6Ci0KLTxPTD4KLTxMST5JZiBhIHZob3N0IGhhcyBubwotICAgIDxBCi0gICAgIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjc2VydmVyYWRtaW4iCi0gICAgPjxDT0RFPlNlcnZlckFkbWluPC9DT0RFPjwvQT4sCi0gICAgPEEKLSAgICAgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNyZXNvdXJjZWNvbmZpZyIKLSAgICA+PENPREU+UmVzb3VyY2VDb25maWc8L0NPREU+PC9BPiwKLSAgICA8QQotICAgICBIUkVGPSIuLi9tb2QvY29yZS5odG1sI2FjY2Vzc2NvbmZpZyIKLSAgICA+PENPREU+QWNjZXNzQ29uZmlnPC9DT0RFPjwvQT4sCi0gICAgPEEKLSAgICAgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCN0aW1lb3V0IgotICAgID48Q09ERT5UaW1lb3V0PC9DT0RFPjwvQT4sCi0gICAgPEEKLSAgICAgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNrZWVwYWxpdmV0aW1lb3V0IgotICAgID48Q09ERT5LZWVwQWxpdmVUaW1lb3V0PC9DT0RFPjwvQT4sCi0gICAgPEEKLSAgICAgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNrZWVwYWxpdmUiCi0gICAgPjxDT0RFPktlZXBBbGl2ZTwvQ09ERT48L0E+LAotICAgIDxBCi0gICAgIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjbWF4a2VlcGFsaXZlcmVxdWVzdHMiCi0gICAgPjxDT0RFPk1heEtlZXBBbGl2ZVJlcXVlc3RzPC9DT0RFPjwvQT4sCi0gICAgb3IKLSAgICA8QQotICAgICBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlbmRidWZmZXJzaXplIgotICAgID48Q09ERT5TZW5kQnVmZmVyU2l6ZTwvQ09ERT48L0E+Ci0gICAgZGlyZWN0aXZlIHRoZW4gdGhlIHJlc3BlY3RpdmUgdmFsdWUgaXMKLSAgICBpbmhlcml0ZWQgZnJvbSB0aGUgbWFpbl9zZXJ2ZXIuICAoVGhhdCBpcywgaW5oZXJpdGVkIGZyb20gd2hhdGV2ZXIKLSAgICB0aGUgZmluYWwgc2V0dGluZyBvZiB0aGF0IHZhbHVlIGlzIGluIHRoZSBtYWluX3NlcnZlci4pCi0KLTxMST5UaGUgJnF1b3Q7bG9va3VwIGRlZmF1bHRzJnF1b3Q7IHRoYXQgZGVmaW5lIHRoZSBkZWZhdWx0IGRpcmVjdG9yeQotICAgIHBlcm1pc3Npb25zCi0gICAgZm9yIGEgdmhvc3QgYXJlIG1lcmdlZCB3aXRoIHRob3NlIG9mIHRoZSBtYWluIHNlcnZlci4gIFRoaXMgaW5jbHVkZXMKLSAgICBhbnkgcGVyLWRpcmVjdG9yeSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhbnkgbW9kdWxlLgotCi08TEk+VGhlIHBlci1zZXJ2ZXIgY29uZmlncyBmb3IgZWFjaCBtb2R1bGUgZnJvbSB0aGUgbWFpbl9zZXJ2ZXIgYXJlCi0gICAgbWVyZ2VkIGludG8gdGhlIHZob3N0IHNlcnZlci4KLTwvT0w+Ci0KLUVzc2VudGlhbGx5LCB0aGUgbWFpbl9zZXJ2ZXIgaXMgdHJlYXRlZCBhcyAmcXVvdDtkZWZhdWx0cyZxdW90OyBvciBhCi0mcXVvdDtiYXNlJnF1b3Q7IG9uCi13aGljaCB0byBidWlsZCBlYWNoIHZob3N0LiAgQnV0IHRoZSBwb3NpdGlvbmluZyBvZiB0aGVzZSBtYWluX3NlcnZlcgotZGVmaW5pdGlvbnMgaW4gdGhlIGNvbmZpZyBmaWxlIGlzIGxhcmdlbHkgaXJyZWxldmFudCAtLSB0aGUgZW50aXJlCi1jb25maWcgb2YgdGhlIG1haW5fc2VydmVyIGhhcyBiZWVuIHBhcnNlZCB3aGVuIHRoaXMgZmluYWwgbWVyZ2luZyBvY2N1cnMuCi1TbyBldmVuIGlmIGEgbWFpbl9zZXJ2ZXIgZGVmaW5pdGlvbiBhcHBlYXJzIGFmdGVyIGEgdmhvc3QgZGVmaW5pdGlvbgotaXQgbWlnaHQgYWZmZWN0IHRoZSB2aG9zdCBkZWZpbml0aW9uLgotCi08UD4gSWYgdGhlIG1haW5fc2VydmVyIGhhcyBubyA8Q09ERT5TZXJ2ZXJOYW1lPC9DT0RFPiBhdCB0aGlzIHBvaW50LAotdGhlbiB0aGUgaG9zdG5hbWUgb2YgdGhlIG1hY2hpbmUgdGhhdCBodHRwZCBpcyBydW5uaW5nIG9uIGlzIHVzZWQKLWluc3RlYWQuICBXZSB3aWxsIGNhbGwgdGhlIDxFTT5tYWluX3NlcnZlciBhZGRyZXNzIHNldDwvRU0+IHRob3NlIElQCi1hZGRyZXNzZXMgcmV0dXJuZWQgYnkgYSBETlMgbG9va3VwIG9uIHRoZSA8Q09ERT5TZXJ2ZXJOYW1lPC9DT0RFPiBvZgotdGhlIG1haW5fc2VydmVyLgotCi08UD4gTm93IGEgcGFzcyBpcyBtYWRlIHRocm91Z2ggdGhlIHZob3N0cyB0byBmaWxsIGluIGFueSBtaXNzaW5nCi08Q09ERT5TZXJ2ZXJOYW1lPC9DT0RFPiBmaWVsZHMgYW5kIHRvIGNsYXNzaWZ5IHRoZSB2aG9zdCBhcyBlaXRoZXIKLWFuIDxFTT5JUC1iYXNlZDwvRU0+IHZob3N0IG9yIGEgPEVNPm5hbWUtYmFzZWQ8L0VNPiB2aG9zdC4gIEEgdmhvc3QgaXMKLWNvbnNpZGVyZWQgYSBuYW1lLWJhc2VkIHZob3N0IGlmIGFueSBvZiBpdHMgYWRkcmVzcyBzZXQgb3ZlcmxhcHMgdGhlCi1tYWluX3NlcnZlciAodGhlIHBvcnQgYXNzb2NpYXRlZCB3aXRoIGVhY2ggYWRkcmVzcyBtdXN0IG1hdGNoIHRoZQotbWFpbl9zZXJ2ZXIncyA8Q09ERT5Qb3J0PC9DT0RFPikuICBPdGhlcndpc2UgaXQgaXMgY29uc2lkZXJlZCBhbiBJUC1iYXNlZAotdmhvc3QuCi0KLTxQPiBGb3IgYW55IHVuZGVmaW5lZCA8Q09ERT5TZXJ2ZXJOYW1lPC9DT0RFPiBmaWVsZHMsIGEgbmFtZS1iYXNlZCB2aG9zdAotZGVmYXVsdHMgdG8gdGhlIGFkZHJlc3MgZ2l2ZW4gZmlyc3QgaW4gdGhlIDxDT0RFPlZpcnR1YWxIb3N0PC9DT0RFPgotc3RhdGVtZW50IGRlZmluaW5nIHRoZSB2aG9zdC4gIEFueSB2aG9zdCB0aGF0IGluY2x1ZGVzIHRoZSBtYWdpYwotPFNBTVA+X2RlZmF1bHRfPC9TQU1QPiB3aWxkY2FyZCBpcyBnaXZlbiB0aGUgc2FtZSA8Q09ERT5TZXJ2ZXJOYW1lPC9DT0RFPiBhcwotdGhlIG1haW5fc2VydmVyLiAgT3RoZXJ3aXNlIHRoZSB2aG9zdCAod2hpY2ggaXMgbmVjZXNzYXJpbHkgYW4gSVAtYmFzZWQKLXZob3N0KSBpcyBnaXZlbiBhIDxDT0RFPlNlcnZlck5hbWU8L0NPREU+IGJhc2VkIG9uIHRoZSByZXN1bHQgb2YgYSByZXZlcnNlCi1ETlMgbG9va3VwIG9uIHRoZSBmaXJzdCBhZGRyZXNzIGdpdmVuIGluIHRoZSA8Q09ERT5WaXJ0dWFsSG9zdDwvQ09ERT4KLXN0YXRlbWVudC4KLQotPFA+Ci0KLTxIMz5WaG9zdCBNYXRjaGluZzwvSDM+Ci0KLQotPFA+PFNUUk9ORz5BcGFjaGUgMS4zIGRpZmZlcnMgZnJvbSB3aGF0IGlzIGRvY3VtZW50ZWQKLWhlcmUsIGFuZCBkb2N1bWVudGF0aW9uIHN0aWxsIGhhcyB0byBiZSB3cml0dGVuLjwvU1RST05HPgotCi08UD4KLVRoZSBzZXJ2ZXIgZGV0ZXJtaW5lcyB3aGljaCB2aG9zdCB0byB1c2UgZm9yIGEgcmVxdWVzdCBhcyBmb2xsb3dzOgotCi08UD4gPENPREU+ZmluZF92aXJ0dWFsX3NlcnZlcjwvQ09ERT46IFdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgZmlyc3QgbWFkZQotYnkgdGhlIGNsaWVudCwgdGhlIGxvY2FsIElQIGFkZHJlc3MgKHRoZSBJUCBhZGRyZXNzIHRvIHdoaWNoIHRoZSBjbGllbnQKLWNvbm5lY3RlZCkgaXMgbG9va2VkIHVwIGluIHRoZSBzZXJ2ZXIgbGlzdC4gIEEgdmhvc3QgaXMgbWF0Y2hlZCBpZiBpdAotaXMgYW4gSVAtYmFzZWQgdmhvc3QsIHRoZSBJUCBhZGRyZXNzIG1hdGNoZXMgYW5kIHRoZSBwb3J0IG1hdGNoZXMKLSh0YWtpbmcgaW50byBhY2NvdW50IHdpbGRjYXJkcykuCi0KLTxQPiBJZiBubyB2aG9zdHMgYXJlIG1hdGNoZWQgdGhlbiB0aGUgbGFzdCBvY2N1cnJlbmNlLCBpZiBpdCBhcHBlYXJzLAotb2YgYSA8U0FNUD5fZGVmYXVsdF88L1NBTVA+IGFkZHJlc3MgKHdoaWNoIGlmIHlvdSByZWNhbGwgdGhlIG9yZGVyaW5nIG9mIHRoZQotc2VydmVyIGxpc3QgbWVudGlvbmVkIGFib3ZlIG1lYW5zIHRoYXQgdGhpcyB3b3VsZCBiZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZQotb2YgPFNBTVA+X2RlZmF1bHRfPC9TQU1QPiBpbiB0aGUgY29uZmlnIGZpbGUpIGlzIG1hdGNoZWQuCi0KLTxQPiBJbiBhbnkgZXZlbnQsIGlmIG5vdGhpbmcgYWJvdmUgaGFzIG1hdGNoZWQsIHRoZW4gdGhlIG1haW5fc2VydmVyIGlzCi1tYXRjaGVkLgotCi08UD4gVGhlIHZob3N0IHJlc3VsdGluZyBmcm9tIHRoZSBhYm92ZSBzZWFyY2ggaXMgc3RvcmVkIHdpdGggZGF0YQotYWJvdXQgdGhlIGNvbm5lY3Rpb24uICBXZSdsbCBjYWxsIHRoaXMgdGhlIDxFTT5jb25uZWN0aW9uIHZob3N0PC9FTT4uCi1UaGUgY29ubmVjdGlvbiB2aG9zdCBpcyBjb25zdGFudCBvdmVyIGFsbCByZXF1ZXN0cyBpbiBhIHBhcnRpY3VsYXIgVENQL0lQCi1zZXNzaW9uIC0tIHRoYXQgaXMsIG92ZXIgYWxsIHJlcXVlc3RzIGluIGEgS2VlcEFsaXZlL3BlcnNpc3RlbnQgc2Vzc2lvbi4KLQotPFA+IEZvciBlYWNoIHJlcXVlc3QgbWFkZSBvbiB0aGUgY29ubmVjdGlvbiB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIG9mCi1ldmVudHMgZnVydGhlciBkZXRlcm1pbmVzIHRoZSBhY3R1YWwgdmhvc3QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gc2VydmUKLXRoZSByZXF1ZXN0LgotCi08UD4gPENPREU+Y2hlY2tfZnVsbHVyaTwvQ09ERT46IElmIHRoZSByZXF1ZXN0VVJJIGlzIGFuIGFic29sdXRlVVJJLCB0aGF0Ci1pcyBpdCBpbmNsdWRlcyA8Q09ERT5odHRwOi8vaG9zdG5hbWUvPC9DT0RFPiwgdGhlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8KLWRldGVybWluZSBpZiB0aGUgaG9zdG5hbWUncyBhZGRyZXNzIChhbmQgb3B0aW9uYWwgcG9ydCkgbWF0Y2ggdGhhdCBvZgotdGhlIGNvbm5lY3Rpb24gdmhvc3QuICBJZiBpdCBkb2VzIHRoZW4gdGhlIGhvc3RuYW1lIHBvcnRpb24gb2YgdGhlIFVSSQotaXMgc2F2ZWQgYXMgdGhlIDxFTT5yZXF1ZXN0X2hvc3RuYW1lPC9FTT4uICBJZiBpdCBkb2VzIG5vdCBtYXRjaCwgdGhlbiB0aGUKLVVSSSByZW1haW5zIHVudG91Y2hlZC4gIDxTVFJPTkc+Tm90ZTwvU1RST05HPjogdG8gYWNoaWV2ZSB0aGlzIGFkZHJlc3MKLWNvbXBhcmlzb24sCi10aGUgaG9zdG5hbWUgc3VwcGxpZWQgZ29lcyB0aHJvdWdoIGEgRE5TIGxvb2t1cCB1bmxlc3MgaXQgbWF0Y2hlcyB0aGUKLTxDT0RFPlNlcnZlck5hbWU8L0NPREU+IG9yIHRoZSBsb2NhbCBJUCBhZGRyZXNzIG9mIHRoZSBjbGllbnQncyBzb2NrZXQuCi0KLTxQPiA8Q09ERT5wYXJzZV91cmk8L0NPREU+OiBJZiB0aGUgVVJJIGJlZ2lucyB3aXRoIGEgcHJvdG9jb2wKLSg8RU0+aS5lLjwvRU0+LCA8Q09ERT5odHRwOjwvQ09ERT4sIDxDT0RFPmZ0cDo8L0NPREU+KSB0aGVuIHRoZSByZXF1ZXN0IGlzCi1jb25zaWRlcmVkIGEgcHJveHkgcmVxdWVzdC4gIE5vdGUgdGhhdCBldmVuIHRob3VnaCB3ZSBtYXkgaGF2ZSBzdHJpcHBlZAotYW4gPENPREU+aHR0cDovL2hvc3RuYW1lLzwvQ09ERT4gaW4gdGhlIHByZXZpb3VzIHN0ZXAsIHRoaXMgY291bGQgc3RpbGwKLWJlIGEgcHJveHkgcmVxdWVzdC4KLQotPFA+IDxDT0RFPnJlYWRfcmVxdWVzdDwvQ09ERT46IElmIHRoZSByZXF1ZXN0IGRvZXMgbm90IGhhdmUgYSBob3N0bmFtZQotZnJvbSB0aGUgZWFybGllciBzdGVwLCB0aGVuIGFueSA8Q09ERT5Ib3N0OjwvQ09ERT4gaGVhZGVyIHNlbnQgYnkgdGhlCi1jbGllbnQgaXMgdXNlZCBhcyB0aGUgcmVxdWVzdCBob3N0bmFtZS4KLQotPFA+IDxDT0RFPmNoZWNrX2hvc3RhbGlhczwvQ09ERT46IElmIHRoZSByZXF1ZXN0IG5vdyBoYXMgYSBob3N0bmFtZSwKLXRoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIG1hdGNoIGZvciB0aGlzIGhvc3RuYW1lLiAgVGhlIGZpcnN0IHN0ZXAKLW9mIHRoaXMgbWF0Y2ggaXMgdG8gY29tcGFyZSBhbnkgcG9ydCwgaWYgb25lIHdhcyBnaXZlbiBpbiB0aGUgcmVxdWVzdCwKLWFnYWluc3QgdGhlIDxDT0RFPlBvcnQ8L0NPREU+IGZpZWxkIG9mIHRoZSBjb25uZWN0aW9uIHZob3N0LiAgSWYgdGhlcmUncwotYSBtaXNtYXRjaCB0aGVuIHRoZSB2aG9zdCB1c2VkIGZvciB0aGUgcmVxdWVzdCBpcyB0aGUgY29ubmVjdGlvbiB2aG9zdC4KLShUaGlzIGlzIGEgYnVnLCBzZWUgb2JzZXJ2YXRpb25zLikKLQotPFA+Ci1JZiB0aGUgcG9ydCBtYXRjaGVzLCB0aGVuIGh0dHBkIHNjYW5zIHRoZSBsaXN0IG9mIHZob3N0cyBzdGFydGluZyB3aXRoCi10aGUgbmV4dCBzZXJ2ZXIgPFNUUk9ORz5hZnRlcjwvU1RST05HPiB0aGUgY29ubmVjdGlvbiB2aG9zdC4gIFRoaXMgc2NhbiBkb2VzIG5vdAotc3RvcCBpZiB0aGVyZSBhcmUgYW55IG1hdGNoZXMsIGl0IGdvZXMgdGhyb3VnaCBhbGwgcG9zc2libGUgdmhvc3RzLAotYW5kIGluIHRoZSBlbmQgdXNlcyB0aGUgbGFzdCBtYXRjaCBpdCBmb3VuZC4gIFRoZSBjb21wYXJpc29ucyBwZXJmb3JtZWQKLWFyZSBhcyBmb2xsb3dzOgotCi08VUw+Ci08TEk+Q29tcGFyZSB0aGUgcmVxdWVzdCBob3N0bmFtZTpwb3J0IHdpdGggdGhlIHZob3N0Ci0gICAgPENPREU+U2VydmVyTmFtZTwvQ09ERT4gYW5kIDxDT0RFPlBvcnQ8L0NPREU+LgotCi08TEk+Q29tcGFyZSB0aGUgcmVxdWVzdCBob3N0bmFtZSBhZ2FpbnN0IGFueSBhbmQgYWxsIGFkZHJlc3NlcyBnaXZlbiBpbgotICAgIHRoZSA8Q09ERT5WaXJ0dWFsSG9zdDwvQ09ERT4gZGlyZWN0aXZlIGZvciB0aGlzIHZob3N0LgotCi08TEk+Q29tcGFyZSB0aGUgcmVxdWVzdCBob3N0bmFtZSBhZ2FpbnN0IHRoZSA8Q09ERT5TZXJ2ZXJBbGlhczwvQ09ERT4KLSAgICBnaXZlbiBmb3IgdGhlIHZob3N0LgotPC9VTD4KLQotPFA+Ci08Q09ERT5jaGVja19zZXJ2ZXJwYXRoPC9DT0RFPjogSWYgdGhlIHJlcXVlc3QgaGFzIG5vIGhvc3RuYW1lCi0oYmFjayB1cCBhIGZldyBwYXJhZ3JhcGhzKSB0aGVuIGEgc2NhbiBzaW1pbGFyIHRvIHRoZSBvbmUKLWluIDxDT0RFPmNoZWNrX2hvc3RhbGlhczwvQ09ERT4gaXMgcGVyZm9ybWVkIHRvIG1hdGNoIGFueQotPENPREU+U2VydmVyUGF0aDwvQ09ERT4gZGlyZWN0aXZlcyBnaXZlbiBpbiB0aGUgdmhvc3RzLiAgTm90ZSB0aGF0IHRoZQotPFNUUk9ORz5sYXN0IG1hdGNoPC9TVFJPTkc+IGlzIHVzZWQgcmVnYXJkbGVzcyAoYWdhaW4gY29uc2lkZXIgdGhlIG9yZGVyaW5nIG9mCi10aGUgdmlydHVhbCBob3N0cykuCi0KLTxIMz5PYnNlcnZhdGlvbnM8L0gzPgotCi08VUw+Ci0KLTxMST5JdCBpcyBkaWZmaWN1bHQgdG8gZGVmaW5lIGFuIElQLWJhc2VkIHZob3N0IGZvciB0aGUgbWFjaGluZSdzCi0gICAgJnF1b3Q7bWFpbiBJUCBhZGRyZXNzJnF1b3Q7LiAgWW91IGVzc2VudGlhbGx5IGhhdmUgdG8gY3JlYXRlIGEgYm9ndXMKLSAgICA8Q09ERT5TZXJ2ZXJOYW1lPC9DT0RFPiBmb3IgdGhlIG1haW5fc2VydmVyIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlCi0gICAgbWFjaGluZSdzIElQcy4KLSAgICA8UD4KLQotPExJPkR1cmluZyB0aGUgc2NhbnMgaW4gYm90aCA8Q09ERT5jaGVja19ob3N0YWxpYXM8L0NPREU+IGFuZAotICAgIDxDT0RFPmNoZWNrX3NlcnZlcnBhdGg8L0NPREU+IG5vIGNoZWNrIGlzIG1hZGUgdGhhdCB0aGUgdmhvc3QgYmVpbmcKLSAgICBzY2FubmVkIGlzIGFjdHVhbGx5IGEgbmFtZS1iYXNlZCB2aG9zdC4gIFRoaXMgbWVhbnMsIGZvciBleGFtcGxlLCB0aGF0Ci0gICAgaXQncyBwb3NzaWJsZSB0byBtYXRjaCBhbiBJUC1iYXNlZCB2aG9zdCB0aHJvdWdoIGFub3RoZXIgYWRkcmVzcy4gIEJ1dAotICAgIGJlY2F1c2UgdGhlIHNjYW4gc3RhcnRzIGluIHRoZSB2aG9zdCBsaXN0IGF0IHRoZSBmaXJzdCB2aG9zdCB0aGF0Ci0gICAgbWF0Y2hlZCB0aGUgbG9jYWwgSVAgYWRkcmVzcyBvZiB0aGUgY29ubmVjdGlvbiwgbm90IGFsbCBJUC1iYXNlZCB2aG9zdHMKLSAgICBjYW4gYmUgbWF0Y2hlZC4KLSAgICA8UD4KLSAgICBDb25zaWRlciB0aGUgY29uZmlnIGZpbGUgYWJvdmUgd2l0aCB0aHJlZSB2aG9zdHMgQSwgQiwgQy4gIFN1cHBvc2UKLSAgICB0aGF0IEIgaXMgYSBuYW1lZC1iYXNlZCB2aG9zdCwgYW5kIEEgYW5kIEMgYXJlIElQLWJhc2VkIHZob3N0cy4gIElmCi0gICAgYSByZXF1ZXN0IGNvbWVzIGluIG9uIEIgb3IgQydzIGFkZHJlc3MgY29udGFpbmluZyBhIGhlYWRlcgotICAgICZxdW90OzxTQU1QPkhvc3Q6IEE8L1NBTVA+JnF1b3Q7IHRoZW4KLSAgICBpdCB3aWxsIGJlIHNlcnZlZCBmcm9tIEEncyBjb25maWcuICBJZiBhIHJlcXVlc3QgY29tZXMgaW4gb24gQSdzCi0gICAgYWRkcmVzcyB0aGVuIGl0IHdpbGwgYWx3YXlzIGJlIHNlcnZlZCBmcm9tIEEncyBjb25maWcgcmVnYXJkbGVzcyBvZgotICAgIGFueSBIb3N0OiBoZWFkZXIuCi0gICAgPC9QPgotCi08TEk+VW5sZXNzIHlvdSBoYXZlIGEgPFNBTVA+X2RlZmF1bHRfPC9TQU1QPiB2aG9zdCwKLSAgICBpdCBkb2Vzbid0IG1hdHRlciBpZiB5b3UgbWl4IG5hbWUtYmFzZWQgdmhvc3RzIGluIGFtb25nc3QgSVAtYmFzZWQKLSAgICB2aG9zdHMuICBEdXJpbmcgdGhlIDxDT0RFPmZpbmRfdmlydHVhbF9zZXJ2ZXI8L0NPREU+IHBoYXNlIGFib3ZlIG5vCi0gICAgbmFtZWQtYmFzZWQgdmhvc3Qgd2lsbCBiZSBtYXRjaGVkLCBzbyB0aGUgbWFpbl9zZXJ2ZXIgd2lsbCByZW1haW4gdGhlCi0gICAgY29ubmVjdGlvbiB2aG9zdC4gIFRoZW4gc2NhbnMgd2lsbCBjb3ZlciBhbGwgdmhvc3RzIGluIHRoZSB2aG9zdCBsaXN0LgotICAgIDxQPgotICAgIElmIHlvdSBkbyBoYXZlIGEgPFNBTVA+X2RlZmF1bHRfPC9TQU1QPiB2aG9zdCwgdGhlbiB5b3UgY2Fubm90IHBsYWNlCi0gICAgbmFtZWQtYmFzZWQgdmhvc3RzIGFmdGVyIGl0IGluIHRoZSBjb25maWcuICBUaGlzIGlzIGJlY2F1c2Ugb24gYW55Ci0gICAgY29ubmVjdGlvbiB0byB0aGUgbWFpbiBzZXJ2ZXIgSVBzIHRoZSBjb25uZWN0aW9uIHZob3N0IHdpbGwgYWx3YXlzIGJlCi0gICAgdGhlIDxTQU1QPl9kZWZhdWx0XzwvU0FNUD4gdmhvc3Qgc2luY2Ugbm9uZSBvZiB0aGUgbmFtZS1iYXNlZCBhcmUKLSAgICBjb25zaWRlcmVkIGR1cmluZyA8Q09ERT5maW5kX3ZpcnR1YWxfc2VydmVyPC9DT0RFPi4KLSAgICA8L1A+Ci0KLTxMST5Zb3Ugc2hvdWxkIG5ldmVyIHNwZWNpZnkgRE5TIG5hbWVzIGluIDxDT0RFPlZpcnR1YWxIb3N0PC9DT0RFPgotICAgIGRpcmVjdGl2ZXMgYmVjYXVzZSBpdCB3aWxsIGZvcmNlIHlvdXIgc2VydmVyIHRvIHJlbHkgb24gRE5TIHRvIGJvb3QuCi0gICAgRnVydGhlcm1vcmUgaXQgcG9zZXMgYSBzZWN1cml0eSB0aHJlYXQgaWYgeW91IGRvIG5vdCBjb250cm9sIHRoZQotICAgIEROUyBmb3IgYWxsIHRoZSBkb21haW5zIGxpc3RlZC4KLSAgICA8QSBIUkVGPSJkbnMtY2F2ZWF0cy5odG1sIj5UaGVyZSdzIG1vcmUgaW5mb3JtYXRpb24KLSAgICBhdmFpbGFibGUgb24gdGhpcyBhbmQgdGhlIG5leHQgdHdvIHRvcGljczwvQT4uCi0gICAgPFA+Ci0KLTxMST48Q09ERT5TZXJ2ZXJOYW1lPC9DT0RFPiBzaG91bGQgYWx3YXlzIGJlIHNldCBmb3IgZWFjaCB2aG9zdC4gIE90aGVyd2lzZQotICAgIEEgRE5TIGxvb2t1cCBpcyByZXF1aXJlZCBmb3IgZWFjaCB2aG9zdC4KLSAgICA8UD4KLQotPExJPkEgRE5TIGxvb2t1cCBpcyBhbHdheXMgcmVxdWlyZWQgZm9yIHRoZSBtYWluX3NlcnZlcidzCi0gICAgPENPREU+U2VydmVyTmFtZTwvQ09ERT4gKG9yIHRvIGdlbmVyYXRlIHRoYXQgaWYgaXQgaXNuJ3Qgc3BlY2lmaWVkCi0gICAgaW4gdGhlIGNvbmZpZykuCi0gICAgPFA+Ci0KLTxMST5JZiBhIDxDT0RFPlNlcnZlclBhdGg8L0NPREU+IGRpcmVjdGl2ZSBleGlzdHMgd2hpY2ggaXMgYSBwcmVmaXggb2YKLSAgICBhbm90aGVyIDxDT0RFPlNlcnZlclBhdGg8L0NPREU+IGRpcmVjdGl2ZSB0aGF0IGFwcGVhcnMgbGF0ZXIgaW4KLSAgICB0aGUgY29uZmlndXJhdGlvbiBmaWxlLCB0aGVuIHRoZSBmb3JtZXIgd2lsbCBhbHdheXMgYmUgbWF0Y2hlZAotICAgIGFuZCB0aGUgbGF0dGVyIHdpbGwgbmV2ZXIgYmUgbWF0Y2hlZC4gIChUaGF0IGlzIGFzc3VtaW5nIHRoYXQgbm8KLSAgICBIb3N0IGhlYWRlciB3YXMgYXZhaWxhYmxlIHRvIGRpc2FtYmlndWF0ZSB0aGUgdHdvLikKLSAgICA8UD4KLQotPExJPklmIGEgdmhvc3QgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgYSBuYW1lLXZob3N0IGluY2x1ZGVzIGEKLSAgICA8Q09ERT5Qb3J0PC9DT0RFPiBzdGF0ZW1lbnQgdGhhdCBkb2Vzbid0IG1hdGNoIHRoZSBtYWluX3NlcnZlcgotICAgIDxDT0RFPlBvcnQ8L0NPREU+IHRoZW4gaXQgd2lsbCBiZSBjb25zaWRlcmVkIGFuIElQLWJhc2VkIHZob3N0LgotICAgIFRoZW4gPENPREU+ZmluZF92aXJ0dWFsX3NlcnZlcjwvQ09ERT4gd2lsbCBtYXRjaCBpdCAoYmVjYXVzZQotICAgIHRoZSBwb3J0cyBhc3NvY2lhdGVkIHdpdGggZWFjaCBhZGRyZXNzIGluIHRoZSBhZGRyZXNzIHNldCBkZWZhdWx0Ci0gICAgdG8gdGhlIHBvcnQgb2YgdGhlIG1haW5fc2VydmVyKSBhcyB0aGUgY29ubmVjdGlvbiB2aG9zdC4gIFRoZW4KLSAgICA8Q09ERT5jaGVja19ob3N0YWxpYXM8L0NPREU+IHdpbGwgcmVmdXNlIHRvIGNoZWNrIGFueSBvdGhlciBuYW1lLWJhc2VkCi0gICAgdmhvc3QgYmVjYXVzZSBvZiB0aGUgcG9ydCBtaXNtYXRjaC4gIFRoZSByZXN1bHQgaXMgdGhhdCB0aGUgdmhvc3QKLSAgICB3aWxsIHN0ZWFsIGFsbCBoaXRzIGdvaW5nIHRvIHRoZSBtYWluX3NlcnZlciBhZGRyZXNzLgotICAgIDxQPgotCi08TEk+SWYgdHdvIElQLWJhc2VkIHZob3N0cyBoYXZlIGFuIGFkZHJlc3MgaW4gY29tbW9uLCB0aGUgdmhvc3QgYXBwZWFyaW5nCi0gICAgbGF0ZXIgaW4gdGhlIGZpbGUgaXMgYWx3YXlzIG1hdGNoZWQuICBTdWNoIGEgdGhpbmcgbWlnaHQgaGFwcGVuCi0gICAgaW5hZHZlcnRlbnRseS4gIElmIHRoZSBjb25maWcgaGFzIG5hbWUtYmFzZWQgdmhvc3RzIGFuZCBmb3Igc29tZSByZWFzb24KLSAgICB0aGUgbWFpbl9zZXJ2ZXIgPENPREU+U2VydmVyTmFtZTwvQ09ERT4gcmVzb2x2ZXMgdG8gdGhlIHdyb25nIGFkZHJlc3MKLSAgICB0aGVuIGFsbCB0aGUgbmFtZS1iYXNlZCB2aG9zdHMgd2lsbCBiZSBwYXJzZWQgYXMgaXAtYmFzZWQgdmhvc3RzLgotICAgIFRoZW4gdGhlIGxhc3Qgb2YgdGhlbSB3aWxsIHN0ZWFsIGFsbCB0aGUgaGl0cy4KLSAgICA8UD4KLQotPExJPlRoZSBsYXN0IG5hbWUtYmFzZWQgdmhvc3QgaW4gdGhlIGNvbmZpZyBpcyBhbHdheXMgbWF0Y2hlZCBmb3IgYW55IGhpdAotICAgIHdoaWNoIGRvZXNuJ3QgbWF0Y2ggb25lIG9mIHRoZSBvdGhlciBuYW1lLWJhc2VkIHZob3N0cy4KLQotPC9VTD4KLQotPEgzPjxBIE5BTUU9IndoYXR3b3JrcyI+V2hhdCBXb3JrczwvQT48L0gzPgotCi08UD5JbiBhZGRpdGlvbiB0byB0aGUgdGlwcyBvbiB0aGUgPEEgSFJFRj0iZG5zLWNhdmVhdHMuaHRtbCN0aXBzIj5ETlMKLUlzc3VlczwvQT4gcGFnZSwgaGVyZSBhcmUgc29tZSBmdXJ0aGVyIHRpcHM6Ci0KLTxVTD4KLQotPExJPlBsYWNlIGFsbCBtYWluX3NlcnZlciBkZWZpbml0aW9ucyBiZWZvcmUgYW55IFZpcnR1YWxIb3N0IGRlZmluaXRpb25zLgotKFRoaXMgaXMgdG8gYWlkIHRoZSByZWFkYWJpbGl0eSBvZiB0aGUgY29uZmlndXJhdGlvbiAtLSB0aGUgcG9zdC1jb25maWcKLW1lcmdpbmcgcHJvY2VzcyBtYWtlcyBpdCBub24tb2J2aW91cyB0aGF0IGRlZmluaXRpb25zIG1peGVkIGluIGFyb3VuZAotdmlydHVhbGhvc3RzIG1pZ2h0IGFmZmVjdCBhbGwgdmlydHVhbGhvc3RzLikKLTxQPgotCi08TEk+QXJyYW5nZSB5b3VyIFZpcnR1YWxIb3N0cyBzdWNoCi10aGF0IGFsbCBuYW1lLWJhc2VkIHZpcnR1YWwgaG9zdHMgY29tZSBmaXJzdCwgZm9sbG93ZWQgYnkgSVAtYmFzZWQKLXZpcnR1YWwgaG9zdHMsIGZvbGxvd2VkIGJ5IGFueSA8U0FNUD5fZGVmYXVsdF88L1NBTVA+IHZpcnR1YWwgaG9zdAotPFA+Ci0KLTxMST5Bdm9pZCA8Q09ERT5TZXJ2ZXJQYXRoczwvQ09ERT4gd2hpY2ggYXJlIHByZWZpeGVzIG9mIG90aGVyCi08Q09ERT5TZXJ2ZXJQYXRoczwvQ09ERT4uICBJZiB5b3UgY2Fubm90IGF2b2lkIHRoaXMgdGhlbiB5b3UgaGF2ZSB0bwotZW5zdXJlIHRoYXQgdGhlIGxvbmdlciAobW9yZSBzcGVjaWZpYykgcHJlZml4IHZob3N0IGFwcGVhcnMgZWFybGllciBpbgotdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB0aGFuIHRoZSBzaG9ydGVyIChsZXNzIHNwZWNpZmljKSBwcmVmaXgKLSg8RU0+aS5lLjwvRU0+LCAmcXVvdDtTZXJ2ZXJQYXRoIC9hYmMmcXVvdDsgc2hvdWxkIGFwcGVhciBhZnRlcgotJnF1b3Q7U2VydmVyUGF0aCAvYWJjZGVmJnF1b3Q7KS4KLTxQPgotCi08TEk+RG8gbm90IHVzZSA8RU0+cG9ydC1iYXNlZDwvRU0+IHZob3N0cyBpbiB0aGUgc2FtZSBzZXJ2ZXIgYXMKLW5hbWUtYmFzZWQgdmhvc3RzLiAgQSBsb29zZSBkZWZpbml0aW9uIGZvciBwb3J0LWJhc2VkIGlzIGEgdmhvc3Qgd2hpY2gKLWlzIGRldGVybWluZWQgYnkgdGhlIHBvcnQgb24gdGhlIHNlcnZlciAoPEVNPmkuZS48L0VNPiwgb25lIHNlcnZlciB3aXRoCi1wb3J0cyA4MDAwLCA4MDgwLCBhbmQgODAgLSBhbGwgb2Ygd2hpY2ggaGF2ZSBkaWZmZXJlbnQgY29uZmlndXJhdGlvbnMpLgotPFA+Ci0KLTwvVUw+Ci0KLTwhLS0jaW5jbHVkZSB2aXJ0dWFsPSJmb290ZXIuaHRtbCIgLS0+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL21hbnVhbC92aG9zdHMvdmlydHVhbC1ob3N0Lmh0bWwgYi9kb2NzL21hbnVhbC92aG9zdHMvdmlydHVhbC1ob3N0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODFmYWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9tYW51YWwvdmhvc3RzL3ZpcnR1YWwtaG9zdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+QXBhY2hlIFNlcnZlciBWaXJ0dWFsIEhvc3QgU3VwcG9ydDwvVElUTEU+Ci08L0hFQUQ+Ci0KLTwhLS0gQmFja2dyb3VuZCB3aGl0ZSwgbGlua3MgYmx1ZSAodW52aXNpdGVkKSwgbmF2eSAodmlzaXRlZCksIHJlZCAoYWN0aXZlKSAtLT4KLTxCT0RZCi0gQkdDT0xPUj0iI0ZGRkZGRiIKLSBURVhUPSIjMDAwMDAwIgotIExJTks9IiMwMDAwRkYiCi0gVkxJTks9IiMwMDAwODAiCi0gQUxJTks9IiNGRjAwMDAiCi0+Ci08IS0tI2luY2x1ZGUgdmlydHVhbD0iaGVhZGVyLmh0bWwiIC0tPgotPEgxIEFMSUdOPSJDRU5URVIiPlZpcnR1YWwgSG9zdCBTdXBwb3J0PC9IMT4KLQotPFNUUk9ORz5TZWUgQWxzbzo8L1NUUk9ORz4KLTxBIEhSRUY9Imhvc3QuaHRtbCI+Tm9uLUlQIGJhc2VkIHZpcnR1YWwgaG9zdHM8L0E+Ci0KLTxIMj5XaGF0IGFyZSB2aXJ0dWFsIGhvc3RzPzwvSDI+Ci1UaGlzIGlzIHRoZSBhYmlsaXR5IG9mIGEgc2luZ2xlIG1hY2hpbmUgdG8gYmUgYSB3ZWIgc2VydmVyIGZvciBtdWx0aXBsZQotZG9tYWlucy4gRm9yIGV4YW1wbGUsIGFuIEludGVybmV0IHNlcnZpY2UgcHJvdmlkZXIgbWlnaHQgaGF2ZSBhIG1hY2hpbmUKLWNhbGxlZCA8Q09ERT53d3cuc2VydmUuY29tPC9DT0RFPiB3aGljaCBwcm92aWRlcyBXZWIgc3BhY2UgZm9yIHNldmVyYWwKLW9yZ2FuaXphdGlvbnMgaW5jbHVkaW5nLCBzYXksIDxFTT5zbWFsbGNvPC9FTT4gYW5kIDxFTT5iYXlncm91cDwvRU0+LgotT3JkaW5hcmlseSwgdGhlc2UgZ3JvdXBzIHdvdWxkIGJlIGdpdmVuIHBhcnRzIG9mIHRoZSBXZWIgdHJlZSBvbiB3d3cuc2VydmUuY29tLgotU28gc21hbGxjbydzIGhvbWUgcGFnZSB3b3VsZCBoYXZlIHRoZSBVUkwKLTxCTE9DS1FVT1RFPgotaHR0cDovL3d3dy5zZXJ2ZS5jb20vc21hbGxjby8KLTwvQkxPQ0tRVU9URT4KLWFuZCBiYXlncm91cCdzIGhvbWUgcGFnZSB3b3VsZCBoYXZlIHRoZSBVUkwKLTxCTE9DS1FVT1RFPgotaHR0cDovL3d3dy5zZXJ2ZS5jb20vYmF5Z3JvdXAvCi08L0JMT0NLUVVPVEU+Ci08UD4KLUZvciBlc3RoZXRpYyByZWFzb25zLCBob3dldmVyLCBib3RoIG9yZ2FuaXphdGlvbnMgd291bGQgcmF0aGVyIHRoZWlyIGhvbWUKLXBhZ2VzIGFwcGVhcmVkIHVuZGVyIHRoZWlyIG93biBuYW1lcyByYXRoZXIgdGhhbiB0aGF0IG9mIHRoZSBzZXJ2aWNlCi1wcm92aWRlcidzOyBidXQgdGhleSBkbyBub3Qgd2FudCB0byBzZXQgdXAgdGhlaXIgb3duIEludGVybmV0IGxpbmtzIGFuZAotc2VydmVycy4KLTxQPgotVmlydHVhbCBob3N0cyBhcmUgdGhlIHNvbHV0aW9uIHRvIHRoaXMgcHJvYmxlbS4gc21hbGxjbyBhbmQgYmF5Z3JvdXAgd291bGQKLWhhdmUgdGhlaXIgb3duIEludGVybmV0IG5hbWUgcmVnaXN0cmF0aW9ucywgPENPREU+d3d3LnNtYWxsY28uY29tPC9DT0RFPiBhbmQKLTxDT0RFPnd3dy5iYXlncm91cC5vcmc8L0NPREU+IHJlc3BlY3RpdmVseS4gVGhlc2UgaG9zdG5hbWVzIHdvdWxkIGJvdGgKLWNvcnJlc3BvbmQgdG8gdGhlIHNlcnZpY2UgcHJvdmlkZXIncyBtYWNoaW5lICh3d3cuc2VydmUuY29tKS4gVGh1cwotc21hbGxjbydzIGhvbWUgcGFnZSB3b3VsZCBub3cgaGF2ZSB0aGUgVVJMCi08QkxPQ0tRVU9URT4KLWh0dHA6Ly93d3cuc21hbGxjby5jb20vCi08L0JMT0NLUVVPVEU+Ci1hbmQgYmF5Z3JvdXAncyBob21lIHBhZ2Ugd291bGQgd291bGQgaGF2ZSB0aGUgVVJMCi08QkxPQ0tRVU9URT4KLWh0dHA6Ly93d3cuYmF5Z3JvdXAub3JnLwotPC9CTE9DS1FVT1RFPgotCi08SDI+U3lzdGVtIHJlcXVpcmVtZW50czwvSDI+Ci1EdWUgdG8gbGltaXRhdGlvbnMgaW4gdGhlIEhUVFAvMS4wIHByb3RvY29sLCB0aGUgd2ViIHNlcnZlciA8U1RST05HPm11c3QgaGF2ZSBhCi1kaWZmZXJlbnQgSVAgYWRkcmVzcyBmb3IgZWFjaCB2aXJ0dWFsIGhvc3Q8L1NUUk9ORz4uIFRoaXMgY2FuIGJlIGFjaGlldmVkCi1ieSB0aGUgbWFjaGluZSBoYXZpbmcgc2V2ZXJhbCBwaHlzaWNhbCBuZXR3b3JrIGNvbm5lY3Rpb25zLCBvciBieSB1c2UKLW9mIGEgPEEgSFJFRj0iLi4vbWlzYy92aWYtaW5mby5odG1sIj52aXJ0dWFsIGludGVyZmFjZTwvQT4gb24gc29tZSBvcGVyYXRpbmcKLXN5c3RlbXMuCi0KLTxIMj5Ib3cgdG8gc2V0IHVwIEFwYWNoZTwvSDI+Ci1UaGVyZSBhcmUgdHdvIHdheXMgb2YgY29uZmlndXJpbmcgYXBhY2hlIHRvIHN1cHBvcnQgbXVsdGlwbGUgaG9zdHMuCi1FaXRoZXIgYnkgcnVubmluZyBhIHNlcGFyYXRlIGh0dHBkIGRhZW1vbiBmb3IgZWFjaCBob3N0bmFtZSwgb3IgYnkgcnVubmluZyBhCi1zaW5nbGUgZGFlbW9uIHdoaWNoIHN1cHBvcnRzIGFsbCB0aGUgdmlydHVhbCBob3N0cy4KLTxQPgotVXNlIG11bHRpcGxlIGRhZW1vbnMgd2hlbjoKLTxVTD4KLTxMST5UaGUgZGlmZmVyZW50IHZpcnR1YWwgaG9zdHMgbmVlZCB2ZXJ5IGRpZmZlcmVudCBodHRwZCBjb25maWd1cmF0aW9ucywgc3VjaAotICAgYXMgZGlmZmVyZW50IHZhbHVlcyBmb3I6Ci0gICA8QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcnR5cGUiPlNlcnZlclR5cGU8L0E+LAotICAgPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCN1c2VyIj5Vc2VyPC9BPiwKLSAgIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjZ3JvdXAiPkdyb3VwPC9BPiwKLSAgIDxBIEhSRUY9Ii4uL21vZC9tb2RfbWltZS5odG1sI3R5cGVzY29uZmlnIj5UeXBlc0NvbmZpZzwvQT4gb3IKLSAgIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjc2VydmVycm9vdCI+U2VydmVyUm9vdDwvQT4uCi08TEk+VGhlIG1hY2hpbmUgZG9lcyBub3QgcHJvY2VzcyBhIHZlcnkgaGlnaCByZXF1ZXN0IHJhdGUuCi08L1VMPgotVXNlIGEgc2luZ2xlIGRhZW1vbiB3aGVuOgotPFVMPgotPExJPlNoYXJpbmcgb2YgdGhlIGh0dHBkIGNvbmZpZ3VyYXRpb24gYmV0d2VlbiB2aXJ0dWFsIGhvc3RzIGlzIGFjY2VwdGFibGUuCi08TEk+VGhlIG1hY2hpbmUgc2VydmljZXMgYSBsYXJnZSBudW1iZXIgb2YgcmVxdWVzdHMsIGFuZCBzbyB0aGUgcGVyZm9ybWFuY2UKLSAgIGxvc3MgaW4gcnVubmluZyBzZXBhcmF0ZSBkYWVtb25zIG1heSBiZSBzaWduaWZpY2FudC4KLTwvVUw+Ci0KLTxIMj5TZXR0aW5nIHVwIG11bHRpcGxlIGRhZW1vbnM8L0gyPgotQ3JlYXRlIGEgc2VwYXJhdGUgaHR0cGQgaW5zdGFsbGF0aW9uIGZvciBlYWNoIHZpcnR1YWwgaG9zdC4KLUZvciBlYWNoIGluc3RhbGxhdGlvbiwgdXNlIHRoZQotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNiaW5kYWRkcmVzcyI+QmluZEFkZHJlc3M8L0E+IGRpcmVjdGl2ZSBpbiB0aGUKLWNvbmZpZ3VyYXRpb24KLWZpbGUgdG8gc2VsZWN0IHdoaWNoIElQIGFkZHJlc3MgKG9yIHZpcnR1YWwgaG9zdCkgdGhhdCBkYWVtb24gc2VydmljZXMuCi08RU0+RS5nLjwvRU0+LAotPEJMT0NLUVVPVEU+PENPREU+QmluZEFkZHJlc3Mgd3d3LnNtYWxsY28uY29tPC9DT0RFPjwvQkxPQ0tRVU9URT4KLVRoaXMgaG9zdG5hbWUgY2FuIGFsc28gYmUgZ2l2ZW4gYXMgYW4gSVAgYWRkcmVzcy4KLQotPEgyPlNldHRpbmcgdXAgYSBzaW5nbGUgZGFlbW9uPC9IMj4KLUZvciB0aGlzIGNhc2UsIGEgc2luZ2xlIGh0dHBkIHdpbGwgc2VydmljZSByZXF1ZXN0cyBmb3IgYWxsIHRoZSB2aXJ0dWFsIGhvc3RzLgotVGhlIDxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjdmlydHVhbGhvc3QiPlZpcnR1YWxIb3N0PC9BPiBkaXJlY3RpdmUgaW4gdGhlCi0gY29uZmlndXJhdGlvbiBmaWxlIGlzIHVzZWQgdG8gc2V0IHRoZSB2YWx1ZXMgb2YKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjc2VydmVyYWRtaW4iPlNlcnZlckFkbWluPC9BPiwKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjc2VydmVybmFtZSI+U2VydmVyTmFtZTwvQT4sCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI2RvY3VtZW50cm9vdCI+RG9jdW1lbnRSb290PC9BPiwKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjZXJyb3Jsb2ciPkVycm9yTG9nPC9BPiBhbmQKLTxBIEhSRUY9Ii4uL21vZC9tb2RfbG9nX2NvbmZpZy5odG1sI3RyYW5zZmVybG9nIj5UcmFuc2ZlckxvZzwvQT4gY29uZmlndXJhdGlvbgotZGlyZWN0aXZlcyB0byBkaWZmZXJlbnQgdmFsdWVzIGZvciBlYWNoIHZpcnR1YWwgaG9zdC4KLTxFTT5FLmcuPC9FTT4sCi08QkxPQ0tRVU9URT48Q09ERT4KLSZsdDtWaXJ0dWFsSG9zdCB3d3cuc21hbGxjby5jb20mZ3Q7PEJSPgotU2VydmVyQWRtaW4gd2VibWFzdGVyQG1haWwuc21hbGxjby5jb208QlI+Ci1Eb2N1bWVudFJvb3QgL2dyb3Vwcy9zbWFsbGNvL3d3dzxCUj4KLVNlcnZlck5hbWUgd3d3LnNtYWxsY28uY29tPEJSPgotRXJyb3JMb2cgL2dyb3Vwcy9zbWFsbGNvL2xvZ3MvZXJyb3JfbG9nPEJSPgotVHJhbnNmZXJMb2cgL2dyb3Vwcy9zbWFsbGNvL2xvZ3MvYWNjZXNzX2xvZzxCUj4KLSZsdDsvVmlydHVhbEhvc3QmZ3Q7PEJSPgotPEJSPgotJmx0O1ZpcnR1YWxIb3N0IHd3dy5iYXlncm91cC5vcmcmZ3Q7PEJSPgotU2VydmVyQWRtaW4gd2VibWFzdGVyQG1haWwuYmF5Z3JvdXAub3JnPEJSPgotRG9jdW1lbnRSb290IC9ncm91cHMvYmF5Z3JvdXAvd3d3PEJSPgotU2VydmVyTmFtZSB3d3cuYmF5Z3JvdXAub3JnPEJSPgotRXJyb3JMb2cgL2dyb3Vwcy9iYXlncm91cC9sb2dzL2Vycm9yX2xvZzxCUj4KLVRyYW5zZmVyTG9nIC9ncm91cHMvYmF5Z3JvdXAvbG9ncy9hY2Nlc3NfbG9nPEJSPgotJmx0Oy9WaXJ0dWFsSG9zdCZndDs8QlI+Ci08L0NPREU+PC9CTE9DS1FVT1RFPgotCi1UaGlzIFZpcnR1YWxIb3N0IGhvc3RuYW1lcyBjYW4gYWxzbyBiZSBnaXZlbiBhcyBJUCBhZGRyZXNzZXMuCi0KLTxQPgotCi1BbG1vc3QgPFNUUk9ORz5BTlk8L1NUUk9ORz4gY29uZmlndXJhdGlvbiBkaXJlY3RpdmUgY2FuIGJlIHB1dAotaW4gdGhlIFZpcnR1YWxIb3N0IGRpcmVjdGl2ZSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcnR5cGUiPlNlcnZlclR5cGU8L0E+LAotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCN1c2VyIj5Vc2VyPC9BPiwKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjZ3JvdXAiPkdyb3VwPC9BPiwKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjc3RhcnRzZXJ2ZXJzIj5TdGFydFNlcnZlcnM8L0E+LAotPEEgSFJFRj0iLi4vbW9kL2NvcmUuaHRtbCNtYXhzcGFyZXNlcnZlcnMiPk1heFNwYXJlU2VydmVyczwvQT4sCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI21pbnNwYXJlc2VydmVycyI+TWluU3BhcmVTZXJ2ZXJzPC9BPiwKLTxBIEhSRUY9Ii4uL21vZC9jb3JlLmh0bWwjbWF4cmVxdWVzdHNwZXJjaGlsZCI+TWF4UmVxdWVzdHNQZXJDaGlsZDwvQT4sCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI2JpbmRhZGRyZXNzIj5CaW5kQWRkcmVzczwvQT4sCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3BpZGZpbGUiPlBpZEZpbGU8L0E+LAotPEEgSFJFRj0iLi4vbW9kL21vZF9taW1lLmh0bWwjdHlwZXNjb25maWciPlR5cGVzQ29uZmlnPC9BPiwgYW5kCi08QSBIUkVGPSIuLi9tb2QvY29yZS5odG1sI3NlcnZlcnJvb3QiPlNlcnZlclJvb3Q8L0E+LgotCi08UD4KLQotPEVNPlNFQ1VSSVRZOjwvRU0+IFdoZW4gc3BlY2lmeWluZyB3aGVyZSB0byB3cml0ZSBsb2cgZmlsZXMsIGJlIGF3YXJlCi1vZiBzb21lIHNlY3VyaXR5IHJpc2tzIHdoaWNoIGFyZSBwcmVzZW50IGlmIGFueW9uZSBvdGhlciB0aGFuIHRoZQotdXNlciB0aGF0IHN0YXJ0cyBBcGFjaGUgaGFzIHdyaXRlIGFjY2VzcyB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZXkKLWFyZSB3cml0dGVuLiAgU2VlIHRoZSA8QSBIUkVGPSIuLi9taXNjL3NlY3VyaXR5X3RpcHMuaHRtbCI+c2VjdXJpdHkKLXRpcHM8L0E+IGRvY3VtZW50IGZvciBkZXRhaWxzLgotCi08UD4KLQotPEgyPkZpbGUgSGFuZGxlL1Jlc291cmNlIExpbWl0czo8L0gyPgotV2hlbiB1c2luZyBhIGxhcmdlIG51bWJlciBvZiBWaXJ0dWFsIEhvc3RzLCBBcGFjaGUgbWF5IHJ1biBvdXQgb2YgYXZhaWxhYmxlCi1maWxlIGRlc2NyaXB0b3JzIGlmIGVhY2ggVmlydHVhbCBIb3N0IHNwZWNpZmllcyBkaWZmZXJlbnQgbG9nIGZpbGVzLgotVGhlIHRvdGFsIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIHVzZWQgYnkgQXBhY2hlIGlzIG9uZSBmb3IgZWFjaCBkaXN0aW5jdAotZXJyb3IgbG9nIGZpbGUsIG9uZSBmb3IgZXZlcnkgb3RoZXIgbG9nIGZpbGUgZGlyZWN0aXZlLCBwbHVzIDEwLTIwIGZvcgotaW50ZXJuYWwgdXNlLiBVbml4IG9wZXJhdGluZyBzeXN0ZW1zIGxpbWl0IHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyB0aGF0Ci1tYXkgYmUgdXNlZCBieSBhIHByb2Nlc3M7IHRoZSBsaW1pdCBpcyB0eXBpY2FsbHkgNjQsIGFuZCBtYXkgdXN1YWxseSBiZQotaW5jcmVhc2VkIHVwIHRvIGEgbGFyZ2UgaGFyZC1saW1pdC4KLTxQPgotQWx0aG91Z2ggQXBhY2hlIGF0dGVtcHRzIHRvIGluY3JlYXNlIHRoZSBsaW1pdCBhcyByZXF1aXJlZCwgdGhpcwotbWF5IG5vdCB3b3JrIGlmOgotPE9MPgotPExJPllvdXIgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIHNldHJsaW1pdCgpIHN5c3RlbSBjYWxsLgotPExJPlRoZSBzZXRybGltaXQoUkxJTUlUX05PRklMRSkgY2FsbCBkb2VzIG5vdCBmdW5jdGlvbiBvbiB5b3VyIHN5c3RlbQotIChzdWNoIGFzIFNvbGFyaXMgMi4zKQotPExJPlRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyByZXF1aXJlZCBleGNlZWRzIHRoZSBoYXJkIGxpbWl0LgotPExJPllvdXIgc3lzdGVtIGltcG9zZXMgb3RoZXIgbGltaXRzIG9uIGZpbGUgZGVzY3JpcHRvcnMsIHN1Y2ggYXMgYSBsaW1pdAotb24gc3RkaW8gc3RyZWFtcyBvbmx5IHVzaW5nIGZpbGUgZGVzY3JpcHRvcnMgYmVsb3cgMjU2LiAoU29sYXJpcyAyKQotPC9PTD4KLQotSW4gdGhlIGV2ZW50IG9mIHByb2JsZW1zIHlvdSBjYW46Ci08VUw+Ci08TEk+UmVkdWNlIHRoZSBudW1iZXIgb2YgbG9nIGZpbGVzOyBkb24ndCBzcGVjaWZ5IGxvZyBmaWxlcyBpbiB0aGUgVmlydHVhbEhvc3QKLXNlY3Rpb25zLCBidXQgb25seSBsb2cgdG8gdGhlIG1haW4gbG9nIGZpbGVzLgotPExJPklmIHlvdSBzeXN0ZW0gZmFsbHMgaW50byAxIG9yIDIgKGFib3ZlKSwgdGhlbiBpbmNyZWFzZSB0aGUgZmlsZSBkZXNjcmlwdG9yCi1saW1pdCBiZWZvcmUgc3RhcnRpbmcgQXBhY2hlLCB1c2luZyBhIHNjcmlwdCBsaWtlCi08QkxPQ0tRVU9URT48Q09ERT4KLSMhL2Jpbi9zaCA8QlI+Ci11bGltaXQgLVMgLW4gMTAwIDxCUj4KLWV4ZWMgaHR0cGQ8L0NPREU+PC9CTE9DS1FVT1RFPgotPC9VTD4KLQotVGhlIGhhdmUgYmVlbiByZXBvcnRzIHRoYXQgQXBhY2hlIG1heSBzdGFydCBydW5uaW5nIG91dCBvZiByZXNvdXJjZXMgYWxsb2NhdGVkCi1mb3IgdGhlIHJvb3QgcHJvY2Vzcy4gVGhpcyB3aWxsIGV4aGliaXQgaXRzZWxmIGFzIGVycm9ycyBpbiB0aGUgZXJyb3IgbG9nIGxpa2UKLSJ1bmFibGUgdG8gZm9yayIuIFRoZXJlIGFyZSB0d28gd2F5cyB5b3UgY2FuIGJ1bXAgdGhpcyB1cDoKLQotPE9MPgotPExJPkhhdmUgYSA8Q09ERT5jc2g8L0NPREU+IHNjcmlwdCB3cmFwcGVyIGFyb3VuZCBodHRwZCB3aGljaCBzZXRzIHRoZQotInJsaW1pdCIgdG8gc29tZSBsYXJnZSBudW1iZXIsIGxpa2UgNTEyLgotPExJPkVkaXQgaHR0cF9tYWluLmMgdG8gYWRkIGNhbGxzIHRvIHNldHJsaW1pdCgpIGZyb20gbWFpbigpLCBhbG9uZyB0aGUgbGluZXMKLW9mCi08UFJFPgotICAgICAgICBzdHJ1Y3QgcmxpbWl0IHJscDsKLQotICAgICAgICBybHAucmxpbV9jdXIgPSBybHAucmxpbV9tYXggPSA1MTI7Ci0gICAgICAgIGlmIChzZXRybGltaXQoUkxJTUlUX05QUk9DLCAmcmxwKSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzZXRybGltaXQoUkxJTUlUX05QUk9DKSBmYWlsZWQuXG4iKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLTwvUFJFPgotKHRoYW5rcyB0byAiQWFyb24gR2lmZm9yZCAmbHQ7YWdpZmZvcmRASW5mb1dlc3QuQ09NJmd0OyIgZm9yIHRoZSBwYXRjaCkKLTwvT0w+Ci0KLVRoZSBsYXR0ZXIgd2lsbCBwcm9iYWJseSBtYW5pZmVzdCBpdHNlbGYgaW4gYSBsYXRlciB2ZXJzaW9uIG9mIEFwYWNoZS4KLQotPCEtLSNpbmNsdWRlIHZpcnR1YWw9ImZvb3Rlci5odG1sIiAtLT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2VtYWNzLXN0eWxlIGIvZW1hY3Mtc3R5bGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4M2I2ZjAuLjAwMDAwMDAKLS0tIGEvZW1hY3Mtc3R5bGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0oYWRkLWhvb2sgJ2MtbW9kZS1ob29rCi0gICAgICAgICAgKGZ1bmN0aW9uIChsYW1iZGEgKCkKLQkJCShjLXNldC1vZmZzZXQgJ2luY2xhc3MnICsrKQotCQkJKGMtc2V0LW9mZnNldCAnZGVmdW4tYmxvY2staW50cm8nICsrKQotCQkJKGMtc2V0LW9mZnNldCAnc3RhdGVtZW50LWJsb2NrLWludHJvJyArKykKLQkJCShjLXNldC1vZmZzZXQgJ3N1YnN0YXRlbWVudCcgKyspCi0JCQkoYy1zZXQtb2Zmc2V0ICdicmFjZS1saXN0LWludHJvJyArKykKLQkJCShjLXNldC1vZmZzZXQgJ3N0YXRlbWVudC1jYXNlLWludHJvJyArKykKLQkJCSkpKQotKHNldHEgYysrLW1vZGUtaG9vayBjLW1vZGUtaG9vaykKZGlmZiAtLWdpdCBhL2h0dHBkLmRzcCBiL2h0dHBkLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0N2VlYi4uMDAwMDAwMAotLS0gYS9odHRwZC5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJBcGFjaGVDb3JlIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDIKLQotQ0ZHPUFwYWNoZUNvcmUgLSBXaW4zMiBSZWxlYXNlCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIkFwYWNoZUNvcmUubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJBcGFjaGVDb3JlLm1hayIgQ0ZHPSJBcGFjaGVDb3JlIC0gV2luMzIgUmVsZWFzZSIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJBcGFjaGVDb3JlIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAiQXBhY2hlQ29yZSAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1NVEw9bWlkbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAiQXBhY2hlQ29yZSAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXEFwYWNoZUNvIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVDbyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICIuXENvcmVSIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi5cQ29yZVIiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dYIC9PMiAvSSAiLlxpbmNsdWRlIiAvSSAiLlxsaWJcYXByXGluY2x1ZGUiIC9JICIuXG9zXHdpbjMyIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIldJTjMyX0xFQU5fQU5EX01FQU4iIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIGxpYlxhcHJcUmVsZWFzZVxhcHJsaWIubGliIG9zXHdpbjMyXEFwYWNoZU9TUlxBcGFjaGVPUy5saWIgcmVnZXhccmVsZWFzZVxyZWdleC5saWIgYXBcUmVsZWFzZVxhcC5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIHdzMl8zMi5saWIgbXN3c29jay5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFjaGluZTpJMzg2Ci0KLSFFTFNFSUYgICIkKENGRykiID09ICJBcGFjaGVDb3JlIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXEFwYWNoZUMwIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVDMCIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICIuXENvcmVEIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi5cQ29yZUQiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvSSAiLlxpbmNsdWRlIiAvSSAiLlxsaWJcYXByXGluY2x1ZGUiIC9JICIuXG9zXHdpbjMyIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIldJTjMyX0xFQU5fQU5EX01FQU4iIC9GUiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgbGliXGFwclxkZWJ1Z1xhcHJsaWIubGliIHJlZ2V4XGRlYnVnXHJlZ2V4LmxpYiBvc1x3aW4zMlxBcGFjaGVPU0RcQXBhY2hlT1MubGliIGFwXERlYnVnXGFwLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgd3MyXzMyLmxpYiBtc3dzb2NrLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2Ci0jIFNVQlRSQUNUIExJTkszMiAvbWFwCi0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJBcGFjaGVDb3JlIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAiQXBhY2hlQ29yZSAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aHBqO2JhdDtmb3I7ZjkwIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxBcGFjaGVDb3JlLmRlZgotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbWFpblxidWZmLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGJ1aWxkbWFyay5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxtYWluXGh0dHBfY29uZmlnLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1haW5caHR0cF9jb25uZWN0aW9uLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1haW5caHR0cF9jb3JlLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1haW5caHR0cF9sb2cuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbWFpblxodHRwX21haW4uYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbWFpblxodHRwX3Byb3RvY29sLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1haW5caHR0cF9yZXF1ZXN0LmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1haW5caHR0cF92aG9zdC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxtYWluXGlvbF9maWxlLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG9zXHdpbjMyXGlvbF9zb2NrZXQuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbWFpblxsaXN0ZW4uYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kdWxlc1xzdGFuZGFyZFxtb2RfYWNjZXNzLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX2FjdGlvbnMuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kdWxlc1xzdGFuZGFyZFxtb2RfYWxpYXMuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kdWxlc1xzdGFuZGFyZFxtb2RfYXNpcy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2R1bGVzXHN0YW5kYXJkXG1vZF9hdXRoLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX2F1dG9pbmRleC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2R1bGVzXHN0YW5kYXJkXG1vZF9jZ2kuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kdWxlc1xzdGFuZGFyZFxtb2RfZGlyLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX2Vudi5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2R1bGVzXHN0YW5kYXJkXG1vZF9pbWFwLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX2luY2x1ZGUuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kdWxlc1xzdGFuZGFyZFxtb2RfbG9nX2NvbmZpZy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2R1bGVzXHN0YW5kYXJkXG1vZF9taW1lLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX25lZ290aWF0aW9uLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX3NldGVudmlmLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX3NvLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX3VzZXJkaXIuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cb3Ncd2luMzJcbW9kdWxlcy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxvc1x3aW4zMlxyZWdpc3RyeS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxtYWluXHJmYzE0MTMuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cb3Ncd2luMzJcc2VydmljZS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxtYWluXHV0aWwuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbWFpblx1dGlsX2RhdGUuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbWFpblx1dGlsX21kNS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxtYWluXHV0aWxfc2NyaXB0LmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1haW5cdXRpbF91cmkuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cb3Ncd2luMzJcdXRpbF93aW4zMi5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2R1bGVzXG1wbVx3aW5udFx3aW5udC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sO2ZpO2ZkIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxpbmNsdWRlXGFwLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGluY2x1ZGVcYXBfaG9va3MuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5jbHVkZVxhcF9pb2wuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5jbHVkZVxhcF9saXN0ZW4uaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5jbHVkZVxhcF9tZDUuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5jbHVkZVxidWZmLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGluY2x1ZGVcY29uZi5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxpbmNsdWRlXGV4cGxhaW4uaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5jbHVkZVxmbm1hdGNoLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGluY2x1ZGVcaHNyZWdleC5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxpbmNsdWRlXGh0dHBfY29uZl9nbG9iYWxzLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGluY2x1ZGVcaHR0cF9jb25maWcuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5jbHVkZVxodHRwX2Nvbm5lY3Rpb24uaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5jbHVkZVxodHRwX2NvcmUuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5jbHVkZVxodHRwX2xvZy5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxpbmNsdWRlXGh0dHBfbWFpbi5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxpbmNsdWRlXGh0dHBfcHJvdG9jb2wuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5jbHVkZVxodHRwX3JlcXVlc3QuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5jbHVkZVxodHRwX3Zob3N0LmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGluY2x1ZGVcaHR0cGQuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cb3Ncd2luMzJcaW9sX3NvY2tldC5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxtb2R1bGVzXHN0YW5kYXJkXG1vZF9taW1lLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZHVsZXNcbXBtXHdpbm50XG1wbV9kZWZhdWx0LmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG9zXHdpbjMyXG9zLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG9zXHdpbjMyXHJlZ2lzdHJ5LmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGluY2x1ZGVccmZjMTQxMy5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxvc1x3aW4zMlxzZXJ2aWNlLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGluY2x1ZGVcdXRpbF9kYXRlLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGluY2x1ZGVcdXRpbF9tZDUuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5caW5jbHVkZVx1dGlsX3NjcmlwdC5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxpbmNsdWRlXHV0aWxfdXJpLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZHVsZXNcbXBtXHdpbm50XHdpbm50LmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO2NudDtydGY7Z2lmO2pwZztqcGVnO2pwZSIKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJHZW5lcmF0ZWQgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxtYWluXHRlc3RfY2hhci5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxtYWluXHVyaV9kZWxpbXMuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL2luY2x1ZGUvLmN2c2lnbm9yZSBiL2luY2x1ZGUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEzMmM0Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXN0YW1wLWgqCi1hcF9jb25maWdfYXV0by5oKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS8uaW5kZW50LnBybyBiL2luY2x1ZGUvLmluZGVudC5wcm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZmJlOWYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS8uaW5kZW50LnBybworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS1pNCAtbnBzbCAtZGkwIC1iciAtbmNlIC1kMCAtY2xpMCAtbnBjcyAtbmZjMQotLVRCVUZGCi0tVEZJTEUKLS1UVFJBTlMKLS1UVUlOVDQKLS1UX3RyYW5zCi0tVGFsbG93X29wdGlvbnNfdAotLVRhcGFjaGVfc2ZpbwotLVRhcnJheV9oZWFkZXIKLS1UYm9vbF9pbnQKLS1UYnVmX2FyZWEKLS1UYnVmZl9zdHJ1Y3QKLS1UYnVmZnkKLS1UY21kX2hvdwotLVRjbWRfcGFybXMKLS1UY29tbWFuZF9yZWMKLS1UY29tbWFuZF9zdHJ1Y3QKLS1UY29ubl9yZWMKLS1UY29yZV9kaXJfY29uZmlnCi0tVGNvcmVfc2VydmVyX2NvbmZpZwotLVRkaXJfbWFrZXJfZnVuYwotLVRldmVudAotLVRnbG9iYWxzX3MKLS1UaGFuZGxlcl9mdW5jCi0tVGhhbmRsZXJfcmVjCi0tVGpvYmxpc3RfcwotLVRsaXN0ZW5fcmVjCi0tVG1lcmdlcl9mdW5jCi0tVG1vZGVfdAotLVRtb2R1bGUKLS1UbW9kdWxlX3N0cnVjdAotLVRtdXRleAotLVRuX2xvbmcKLS1Ub3RoZXJfY2hpbGRfcmVjCi0tVG92ZXJyaWRlc190Ci0tVHBhcmVudF9zY29yZQotLVRwaWRfdAotLVRwaXBlZF9sb2cKLS1UcG9vbAotLVRyZXF1ZXN0X3JlYwotLVRyZXF1aXJlX2xpbmUKLS1UcmxpbV90Ci0tVHNjb3JlYm9hcmQKLS1Uc2VtYXBob3JlCi0tVHNlcnZlcl9hZGRyX3JlYwotLVRzZXJ2ZXJfcmVjCi0tVHNlcnZlcl9yZWNfY2hhaW4KLS1Uc2hvcnRfc2NvcmUKLS1UdGFibGUKLS1UdGFibGVfZW50cnkKLS1UdGhyZWFkCi0tVHVfd2lkZV9pbnQKLS1UdnRpbWVfdAotLVR3aWRlX2ludApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hcF9jb25maWcuaCBiL2luY2x1ZGUvYXBfY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NjlhNmIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hcF9jb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ODAgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaWZuZGVmIEFQX0NPTkZJR19ICi0jZGVmaW5lIEFQX0NPTkZJR19ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJhcF9hY19jb25maWcuaCIgICAgICAgLyogSWYgd2UncmUgdXNpbmcgYXV0b2NvbmYsIGdvIHRvIHRoZSBuZXcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfY29uZmlnLmggcmVwbGFjZW1lbnQgKi8KLSNlbHNlIC8qIEhBVkVfQ09ORklHX0ggKi8KLQotLyoKLSAqIGFwX2NvbmZpZy5oOiBzeXN0ZW0tZGVwZW5kYW50ICNkZWZpbmVzIGFuZCBpbmNsdWRlcy4uLgotICogU2VlIFBPUlRJTkcgZm9yIGEgbGlzdGluZyBvZiB3aGF0IHRoZXkgbWVhbgotICovCi0KLSNpbmNsdWRlICJhcF9tbW4uaCIJCS8qIE1PRFVMRV9NQUdJQ19OVU1CRVJfICovCi0KLS8qCi0gKiBTdXBwb3J0IGZvciBwbGF0Zm9ybSBkZXBlbmRlbnQgYXV0b2dlbmVyYXRlZCBkZWZpbmVzCi0gKi8KLSNpZm5kZWYgV0lOMzIKLSNpbmNsdWRlICJhcF9jb25maWdfYXV0by5oIgotI2Vsc2UKLS8qIG5vdCBhdmFpbGFibGUgdW5kZXIgV0lOMzIsIHNvIHByb3ZpZGUgaW1wb3J0YW50IGVudHJpZXMgbWFudWFsbHkgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0jZW5kaWYKLQotLyogSGF2ZSB0byBpbmNsdWRlIHN5cy9zdGF0LmggYmVmb3JlIC4uL29zL3dpbjMyL29zLmggc28gd2UgY2FuIG92ZXJyaWRlCi1zdGF0KCkgcHJvcGVybHkgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLS8qIFNvIHRoYXQgd2UgY2FuIHVzZSBpbmxpbmUgb24gc29tZSBjcml0aWNhbCBmdW5jdGlvbnMsIGFuZCB1c2UKLSAqIEdOVUMgYXR0cmlidXRlcyAoc3VjaCBhcyB0byBnZXQgLVdhbGwgd2FybmluZ3MgZm9yIHByaW50Zi1saWtlCi0gKiBmdW5jdGlvbnMpLiAgT25seSBkbyB0aGlzIGluIGdjYyAyLjcgb3IgbGF0ZXIgLi4uIGl0IG1heSB3b3JrCi0gKiBvbiBlYXJsaWVyIHN0dWZmLCBidXQgd2h5IGNoYW5jZSBpdC4KLSAqCi0gKiBXZSd2ZSBzaW5jZSBkaXNjb3ZlcmVkIHRoYXQgdGhlIGdjYyBzaGlwcGVkIHdpdGggTmVYVCBzeXN0ZW1zCi0gKiBhcyAiY2MiIGlzIGNvbXBsZXRlbHkgYnJva2VuLiAgSXQgY2xhaW1zIHRvIGJlIF9fR05VQ19fIGFuZCBzbwotICogb24sIGJ1dCBpdCBkb2Vzbid0IGltcGxlbWVudCBoYWxmIG9mIHRoZSB0aGluZ3MgdGhhdCBfX0dOVUNfXwotICogbWVhbnMuICBJbiBwYXJ0aWN1bGFyIGl0J3MgbWlzc2luZyBpbmxpbmUgYW5kIHRoZSBfX2F0dHJpYnV0ZV9fCi0gKiBzdHVmZi4gIFNvIHdlIGhhY2sgYXJvdW5kIGl0LiAgUFIjMTYxMy4gLWRqZwotICovCi0jaWYgIWRlZmluZWQoX19HTlVDX18pIHx8IF9fR05VQ19fIDwgMiB8fCBcCi0gICAgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA3KSB8fFwKLSAgICBkZWZpbmVkKE5FWFQpCi0jZGVmaW5lIGFwX2lubGluZQotI2RlZmluZSBfX2F0dHJpYnV0ZV9fKF9feCkKLSNkZWZpbmUgRU5VTV9CSVRGSUVMRChlLG4sdykgIHNpZ25lZCBpbnQgbiA6IHcKLSNlbHNlCi0jZGVmaW5lIGFwX2lubGluZSBfX2lubGluZV9fCi0jZGVmaW5lIFVTRV9HTlVfSU5MSU5FCi0jZGVmaW5lIEVOVU1fQklURklFTEQoZSxuLHcpICBlIG4gOiB3Ci0jZW5kaWYKLQotI2lmZGVmIFdJTjMyCi0jaW5jbHVkZSAiLi4vb3Mvd2luMzIvb3MuaCIKLSNlbHNlCi0jaW5jbHVkZSAib3MuaCIKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoUU5YKSAmJiAhZGVmaW5lZChNUEUpICYmICFkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChUUEYpCi0vKiAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+ICovCi0jZW5kaWYKLQotLyogRGVmaW5lIG9uZSBvZiB0aGVzZSBhY2NvcmRpbmcgdG8geW91ciBzeXN0ZW0uICovCi0jaWYgZGVmaW5lZChNSU5UKQotdHlwZWRlZiBpbnQgcmxpbV90OwotI2RlZmluZSBKTVBfQlVGIHNpZ2ptcF9idWYKLSNkZWZpbmUgTk9fTE9OR19ET1VCTEUKLSNkZWZpbmUgVVNFX0ZMT0NLX1NFUklBTElaRURfQUNDRVBUCi0jZGVmaW5lIF9CU0RfU09VUkNFCi0jZGVmaW5lIEVBR0FJTiBFV09VTERCTE9DSwotaW50IGluaXRncm91cHMgKGNoYXIgKiwgaW50KTsgICAgIAotY2hhciAqY3J5cHQgKGNvbnN0IGNoYXIgKnB3LCBjb25zdCBjaGFyICpzYWx0KTsKLWludCBnZXRob3N0bmFtZSAoY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pOwotCi0jZWxpZiBkZWZpbmVkKE1QRSkKLSNpbmNsdWRlIDxzeXMvdGltZXMuaD4KLSNkZWZpbmUgTk9fU0VUU0lECi0jZGVmaW5lIE5PX0tJTExQRwotI2RlZmluZSBOT19XUklURVYKLSNkZWZpbmUgSEFWRV9TSE1HRVQgMQotI2RlZmluZSBVU0VfU0hNR0VUX1NDT1JFQk9BUkQKLSNkZWZpbmUgU0hNX1IgMDQwMCAgLyogUmVhZCBwZXJtaXNzaW9uICovCi0jZGVmaW5lIFNITV9XIDAyMDAgIC8qIFdyaXRlIHBlcm1pc3Npb24gKi8KLSNkZWZpbmUgTkVFRF9JTklUR1JPVVBTCi0jZGVmaW5lIE5FRURfU1RSQ0FTRUNNUAotI2RlZmluZSBORUVEX1NUUkRVUAotI2RlZmluZSBORUVEX1NUUk5DQVNFQ01QCi1leHRlcm4gdm9pZCBHRVRQUklWTU9ERSgpOwotZXh0ZXJuIHZvaWQgR0VUVVNFUk1PREUoKTsKLWV4dGVybiBjaGFyICppbmV0X250b2EoKTsKLSNkZWZpbmUgTk9fU0xBQ0sKLSNkZWZpbmUgTk9fR0VUVElNRU9GREFZCi0jZGVmaW5lIFNfSUVYRUMgIFNfSVhVU1IKLSNkZWZpbmUgU19JUkVBRCAgU19JUlVTUgotI2RlZmluZSBTX0lXUklURSBTX0lXVVNSCi0jZGVmaW5lIFBGX0lORVQgIEFGX0lORVQKLQotI2VsaWYgZGVmaW5lZChTVU5PUzQpCi0jZGVmaW5lIEhBVkVfR01UT0ZGIDEKLSN1bmRlZiBOT19LSUxMUEcKLSN1bmRlZiBOT19TRVRTSUQKLWNoYXIgKmNyeXB0KGNvbnN0IGNoYXIgKnB3LCBjb25zdCBjaGFyICpzYWx0KTsKLWNoYXIgKm1rdGVtcChjaGFyICp0ZW1wbGF0ZSk7Ci0jZGVmaW5lIEhBVkVfTU1BUCAxCi0jZGVmaW5lIFVTRV9NTUFQX1NDT1JFQk9BUkQKLSNkZWZpbmUgVVNFX01NQVBfRklMRVMKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2RlZmluZSBORUVEX1NUUkVSUk9SCi10eXBlZGVmIGludCBybGltX3Q7Ci0jZGVmaW5lIG1lbW1vdmUoYSxiLGMpIGJjb3B5KGIsYSxjKQotI2RlZmluZSBOT19MSU5HQ0xPU0UKLSNkZWZpbmUgVVNFX0ZMT0NLX1NFUklBTElaRURfQUNDRVBUCi0jZGVmaW5lIE5FRURfRElGRlRJTUUKLSNkZWZpbmUgSEFWRV9TWVNMT0cgMQotCi0jZWxpZiBkZWZpbmVkKFNPTEFSSVMyKQotI3VuZGVmIEhBVkVfR01UT0ZGCi0jZGVmaW5lIE5PX0tJTExQRwotI3VuZGVmIE5PX1NFVFNJRAotI2RlZmluZSBiemVybyhhLGIpIG1lbXNldChhLDAsYikKLSNpZiAhZGVmaW5lZChVU0VfU1lTVlNFTV9TRVJJQUxJWkVEX0FDQ0VQVCkgJiYgXAotICAgICFkZWZpbmVkKFVTRV9QVEhSRUFEX1NFUklBTElaRURfQUNDRVBUKQotI2RlZmluZSBVU0VfRkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQKLSNlbmRpZgotI2RlZmluZSBORUVEX1VOSU9OX1NFTVVOCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi0jZGVmaW5lIFVTRV9NTUFQX1NDT1JFQk9BUkQKLSNkZWZpbmUgVVNFX01NQVBfRklMRVMKLWludCBnZXRob3N0bmFtZShjaGFyICpuYW1lLCBpbnQgbmFtZWxlbik7Ci0jZGVmaW5lIEhBVkVfU1lTTE9HIDEKLSNkZWZpbmUgU1lTX1NJR0xJU1QgX3N5c19zaWdsaXN0Ci0jaWZuZGVmIElOQUREUl9OT05FCi0jZGVmaW5lIElOQUREUl9OT05FICgodW5zaWduZWQgaW50KSAweGZmZmZmZmZmKQotI2VuZGlmCi0KLSNlbGlmIGRlZmluZWQoSVJJWCkKLSN1bmRlZiBIQVZFX0dNVE9GRgotLyogSVJJWCBoYXMga2lsbHBnLCBidXQgaXQncyBvbmx5IGluIF9CU0RfQ09NUEFULCBzbyBkb24ndCB1c2UgaXQgaW4gY2FzZQotICogdGhlcmUncyBzb21lIHdlaXJkIGNvbmZsaWN0IHdpdGggbm9uLUJTRCBzaWduYWxzICovCi0jZGVmaW5lIE5PX0tJTExQRwotI3VuZGVmIE5PX1NFVFNJRAotI2lmICFkZWZpbmVkKFVTRV9GTE9DS19TRVJJQUxJWkVEX0FDQ0VQVCkgJiYgXAotICAgICFkZWZpbmVkKFVTRV9VU0xPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQpICYmIFwKLSAgICAhZGVmaW5lZChVU0VfU1lTVlNFTV9TRVJJQUxJWkVEX0FDQ0VQVCkKLSNkZWZpbmUgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUCi0jZW5kaWYKLSNkZWZpbmUgSEFWRV9TSE1HRVQgMQotI2RlZmluZSBVU0VfU0hNR0VUX1NDT1JFQk9BUkQKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLSNkZWZpbmUgVVNFX01NQVBfRklMRVMKLSNkZWZpbmUgTk9fTE9OR19ET1VCTEUKLSNkZWZpbmUgTk9fTElOR0NMT1NFCi0jZGVmaW5lIEhBVkVfU1lTTE9HIDEKLQotI2VsaWYgZGVmaW5lZChISVVYKQotI3VuZGVmIEhBVkVfR01UT0ZGCi0jZGVmaW5lIE5PX0tJTExQRwotI3VuZGVmIE5PX1NFVFNJRAotI2lmbmRlZiBfSElVWF9TT1VSQ0UKLSNkZWZpbmUgX0hJVVhfU09VUkNFCi0jZW5kaWYKLSNkZWZpbmUgSEFWRV9TSE1HRVQgMQotI2RlZmluZSBVU0VfU0hNR0VUX1NDT1JFQk9BUkQKLSNkZWZpbmUgU0VMRUNUX05FRURTX0NBU1QKLSNkZWZpbmUgSEFWRV9TWVNMT0cgMQotCi0jZWxpZiBkZWZpbmVkKEhQVVgpIHx8IGRlZmluZWQoSFBVWDEwKQotI3VuZGVmIEhBVkVfR01UT0ZGCi0jZGVmaW5lIE5PX0tJTExQRwotI3VuZGVmIE5PX1NFVFNJRAotI2RlZmluZSBVU0VfRkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQKLSNpZm5kZWYgX0hQVVhfU09VUkNFCi0jZGVmaW5lIF9IUFVYX1NPVVJDRQotI2VuZGlmCi0jZGVmaW5lIEhBVkVfU0hNR0VUIDEKLSNkZWZpbmUgVVNFX1NITUdFVF9TQ09SRUJPQVJECi0jZGVmaW5lIEhBVkVfU1lTTE9HIDEKLSNpZm5kZWYgSFBVWDEwCi0jZGVmaW5lIFNFTEVDVF9ORUVEU19DQVNUCi10eXBlZGVmIGludCBybGltX3Q7Ci0jZW5kaWYKLQotI2VsaWYgZGVmaW5lZChIUFVYMTEpCi0jaWZuZGVmIF9IUFVYX1NPVVJDRQotI2RlZmluZSBfSFBVWF9TT1VSQ0UKLSNlbmRpZgotI2RlZmluZSBIQVZFX1NITUdFVAotI2RlZmluZSBVU0VfU0hNR0VUX1NDT1JFQk9BUkQKLSN1bmRlZiAgSEFWRV9HTVRPRkYKLSNkZWZpbmUgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUCi0vKiBmZWVsaW5nIGJyYXZlPyAgd2FudCB0byB0cnkgdXNpbmcgUE9TSVggbXV0ZXhlcz8gKi8KLS8qICNkZWZpbmUgSEFWRV9NTUFQICovCi0vKiAjZGVmaW5lIFVTRV9NTUFQX1NDT1JFQk9BUkQgKi8KLS8qICNkZWZpbmUgVVNFX01NQVBfRklMRVMgKi8KLS8qICNkZWZpbmUgVVNFX1BUSFJFQURfU0VSSUFMSVpFRF9BQ0NFUFQgKi8KLSNkZWZpbmUgTk9fS0lMTFBHCi0jdW5kZWYgIE5PX1NFVFNJRAotI2RlZmluZSBIQVZFX1NZU0xPRwotCi0jZWxpZiBkZWZpbmVkKEFJWCkKLSN1bmRlZiBIQVZFX0dNVE9GRgotI3VuZGVmIE5PX0tJTExQRwotI3VuZGVmIE5PX1NFVFNJRAotI2lmbmRlZiBfX3BzMl9fCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi0jZGVmaW5lIFVTRV9NTUFQX1NDT1JFQk9BUkQKLSNkZWZpbmUgVVNFX01NQVBfRklMRVMKLSNkZWZpbmUgSEFWRV9TWVNMT0cgMQotI2lmbmRlZiBERUZBVUxUX0dST1VQCi0jZGVmaW5lIERFRkFVTFRfR1JPVVAgIm5vYm9keSIKLSNlbmRpZgotI2VuZGlmCi0jaWZuZGVmIERFRkFVTFRfVVNFUgotI2RlZmluZSBERUZBVUxUX1VTRVIgIm5vYm9keSIKLSNlbmRpZgotI2lmZGVmIE5FRURfUkxJTV9UCi10eXBlZGVmIGludCBybGltX3Q7Ci0jZW5kaWYKLS8qIFNvbWUgdmVyc2lvbnMgb2YgQUlYIHN1cHBvcnQgY3Jvc3MtcHJvY2VzcyBwdGhyZWFkIG11dGV4ZXM7IHNvbWUgZG9uJ3QuICovCi0jaWZkZWYgX1BPU0lYX1RIUkVBRF9QUk9DRVNTX1NIQVJFRAotI2RlZmluZSBVU0VfUFRIUkVBRF9TRVJJQUxJWkVEX0FDQ0VQVAotI2Vsc2UKLSNkZWZpbmUgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUCi0jZW5kaWYKLSNpZmRlZiBVU0VCQ09QWQotI2RlZmluZSBtZW1tb3ZlKGEsYixjKSBiY29weShiLGEsYykKLSNlbmRpZgotI2lmIEFJWCA+PSA0MgotI2RlZmluZSBORVRfU0laRV9UIHNpemVfdAotI2VuZGlmCi0KLSNlbGlmIGRlZmluZWQoVUxUUklYKQotLyogd2UgZG9uJ3Qgd2FudCB0byB1c2Ugc3lzL3Jlc291cmNlLmggdW5kZXIKLSAgIFVsdHJpeCBhbHRob3VnaCB0aGlzIGhlYWRlciBleGlzdHMuICovCi0jdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAotI2RlZmluZSBIQVZFX0dNVE9GRiAxCi0jdW5kZWYgTk9fS0lMTFBHCi0jdW5kZWYgTk9fU0VUU0lECi0jZGVmaW5lIFVMVFJJWF9CUkFJTl9ERUFUSAotI2RlZmluZSBORUVEX1NUUkRVUAotLyogSWYgeW91IGhhdmUgVWx0cml4IDQuMywgYW5kIGFyZSB1c2luZyBjYywgY29uc3QgaXMgYnJva2VuICovCi0jaWZuZGVmIF9fdWx0cml4X18JCS8qIEhhY2sgdG8gY2hlY2sgZm9yIHByZS1VbHRyaXggNC40IGNjICovCi0jZGVmaW5lIGNvbnN0CQkJLyogTm90IGltcGxlbWVudGVkICovCi0jZW5kaWYKLQotI2VsaWYgZGVmaW5lZChPU0YxKQotI2RlZmluZSBIQVZFX0dNVE9GRiAxCi0jdW5kZWYgTk9fS0lMTFBHCi0jdW5kZWYgTk9fU0VUU0lECi0jZGVmaW5lIEhBVkVfTU1BUCAxCi0jZGVmaW5lIFVTRV9NTUFQX1NDT1JFQk9BUkQKLSNkZWZpbmUgVVNFX01NQVBfRklMRVMKLSNkZWZpbmUgTk9fTE9OR19ET1VCTEUKLSNkZWZpbmUgSEFWRV9TWVNMT0cgMQotI2RlZmluZSBVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQKLSNkZWZpbmUgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBUCi0KLSNlbGlmIGRlZmluZWQoUEFSQUdPTikKLSNkZWZpbmUgSEFWRV9HTVRPRkYgMQotI3VuZGVmIE5PX0tJTExQRwotI3VuZGVmIE5PX1NFVFNJRAotI2RlZmluZSBIQVZFX01NQVAgMQotI2RlZmluZSBVU0VfTU1BUF9TQ09SRUJPQVJECi0jZGVmaW5lIFVTRV9NTUFQX0ZJTEVTCi0jZGVmaW5lIE5PX0xPTkdfRE9VQkxFCi0jZGVmaW5lIEhBVkVfU1lTTE9HIDEKLXR5cGVkZWYgaW50IHJsaW1fdDsKLQotI2VsaWYgZGVmaW5lZChTRVFVRU5UKQotI2RlZmluZSBERUZBVUxUX1VTRVIgIm5vYm9keSIKLSNkZWZpbmUgREVGQVVMVF9HUk9VUCAibm9ib2R5IgotI2RlZmluZSBOT19TSE1HRVQgMQotI2RlZmluZSBIQVZFX01NQVAgMQotI2RlZmluZSBIQVZFX1NZU0xPRyAxCi0jZGVmaW5lIFVTRV9NTUFQX0ZJTEVTIDEKLSNkZWZpbmUgVVNFX01NQVBfU0NPUkVCT0FSRCAxCi0jZGVmaW5lIFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVCAxCi0jZGVmaW5lIEpNUF9CVUYgc2lnam1wX2J1ZgotI3VuZGVmIE5PX1NFVFNJRAotI2lmIFNFUVVFTlQgPCA0MAotdHlwZWRlZiBpbnQgcmxpbV90OwotI2RlZmluZSBOT19HRVRUSU1FT0ZEQVkKLSN1bmRlZiBIQVZFX1NZU19SRVNPVVJDRV9IIC8qIGV4aXN0cyBidXQgZG9lcyBub3QgcHJvdmlkZSAqcmxpbWl0IGZ1bmNzICovCi0jaW5jbHVkZSA8c3lzL3RpbWVzLmg+Ci0jZW5kaWYKLSNpZiBTRVFVRU5UIDwgNDIKLSNkZWZpbmUgTkVFRF9TVFJDQVNFQ01QCi0jZGVmaW5lIE5FRURfU1RSTkNBU0VDTVAKLSNlbmRpZgotI2lmIFNFUVVFTlQgPCA0NAotI2RlZmluZSBOT19LSUxMUEcgMQotI2RlZmluZSBORVRfU0laRV9UIGludAotI2VuZGlmCi0jaWYgU0VRVUVOVCA+PSA0NAotI3VuZGVmIE5PX0tJTExQRwotI2RlZmluZSBORVRfU0laRV9UIHNpemVfdAotI2VuZGlmCi0KLSNlbGlmIGRlZmluZWQoTkVYVCkKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgbW9kZV90OwotI2RlZmluZSBIQVZFX0dNVE9GRiAxCi0jdW5kZWYgTk9fS0lMTFBHCi0jZGVmaW5lIE5PX1NFVFNJRAotI2RlZmluZSBORUVEX1NUUkRVUAotI2RlZmluZSBOT19MSU5HQ0xPU0UKLSN1bmRlZiBfUE9TSVhfU09VUkNFCi0jaWZuZGVmIEZEX0NMT0VYRUMKLSNkZWZpbmUgRkRfQ0xPRVhFQyAxCi0jZW5kaWYKLSNpZm5kZWYgU19JU0RJUgotI2RlZmluZSBTX0lTRElSKG0pICAgICAgKCgobSkmKFNfSUZNVCkpID09IChTX0lGRElSKSkKLSNlbmRpZgotI2lmbmRlZiBTX0lTUkVHCi0jZGVmaW5lIFNfSVNSRUcobSkgICAgICAoKChtKSYoU19JRk1UKSkgPT0gKFNfSUZSRUcpKQotI2VuZGlmCi0jaWZuZGVmIFNfSVhVU1IKLSNkZWZpbmUgU19JWFVTUiAwMDEwMAotI2VuZGlmCi0jaWZuZGVmIFNfSVJHUlAKLSNkZWZpbmUgU19JUkdSUCAwMDA0MAotI2VuZGlmCi0jaWZuZGVmIFNfSVhHUlAKLSNkZWZpbmUgU19JWEdSUCAwMDAxMAotI2VuZGlmCi0jaWZuZGVmIFNfSVJPVEgKLSNkZWZpbmUgU19JUk9USCAwMDAwNAotI2VuZGlmCi0jaWZuZGVmIFNfSVhPVEgKLSNkZWZpbmUgU19JWE9USCAwMDAwMQotI2VuZGlmCi0jaWZuZGVmIFNfSVJVU1IKLSNkZWZpbmUgU19JUlVTUiBTX0lSRUFECi0jZW5kaWYKLSNpZm5kZWYgU19JV1VTUgotI2RlZmluZSBTX0lXVVNSIFNfSVdSSVRFCi0jZW5kaWYKLSNpZm5kZWYgU19JV0dSUAotI2RlZmluZSBTX0lXR1JQCTAwMDAyMAotI2VuZGlmCi0jaWZuZGVmIFNfSVdPVEgKLSNkZWZpbmUgU19JV09USCAwMDAwMDIKLSNlbmRpZgotCi0jZGVmaW5lIFNURElOX0ZJTEVOTyAgMAotI2RlZmluZSBTVERPVVRfRklMRU5PIDEKLSNkZWZpbmUgU1RERVJSX0ZJTEVOTyAyCi0KLS8qIFBSIzIyOTMgZml4ICovCi0jZGVmaW5lCWFwX3dhaXRfdAl1bmlvbiB3YWl0Ci0jZGVmaW5lIHdhaXRwaWQoYSxiLGMpIHdhaXQ0KChhKSA9PSAtMSA/IDAgOiAoYSksKHVuaW9uIHdhaXQgKikoYiksYyxOVUxMKQotI2RlZmluZSBXRVhJVFNUQVRVUyhzdGF0dXMpICAgICAoaW50KSggV0lGRVhJVEVEKHN0YXR1cykgPyAoIChzdGF0dXMpLndfcmV0Y29kZSApIDogLTEpCi0jZGVmaW5lIFdURVJNU0lHKHN0YXR1cykJKGludCkoIChzdGF0dXMpLndfdGVybXNpZyApCi0KLXR5cGVkZWYgaW50IHBpZF90OwotI2RlZmluZSBVU0VfTE9OR0pNUAotI2RlZmluZSBOT19VU0VfU0lHQUNUSU9OCi0jZGVmaW5lIEhBVkVfU1lTTE9HIDEKLQotI2lmIGRlZmluZWQoX19EWU5BTUlDX18pCi0jZGVmaW5lIEhBVkVfRFlMRAotI2RlZmluZSBEWUxEX0NBTlRfVU5MT0FECi0jZW5kaWYKLQotI2VsaWYgZGVmaW5lZChNQUNfT1MpIHx8IGRlZmluZWQoTUFDX09TX1hfU0VSVkVSKSAvKiBNYWMgT1MgKD49IDEwLjApIGFuZCBNYWMgT1MgWCBTZXJ2ZXIgKDw9IDUueCkgKi8KLSN1bmRlZiBQTEFURk9STQotI2lmZGVmIE1BQ19PU19YX1NFUlZFUgotI2RlZmluZSBQTEFURk9STSAiTWFjIE9TIFggU2VydmVyIgotI2Vsc2UKLSNkZWZpbmUgUExBVEZPUk0gIk1hYyBPUyIKLSNlbmRpZgotI2RlZmluZSBIQVZFX0RZTEQKLSNkZWZpbmUgSEFWRV9HTVRPRkYKLSNkZWZpbmUgSEFWRV9NTUFQCi0jZGVmaW5lIFVTRV9NTUFQX0ZJTEVTCi0jZGVmaW5lIFVTRV9NTUFQX1NDT1JFQk9BUkQKLSNpZmRlZiBNQUNfT1NfWF9TRVJWRVIKLSNkZWZpbmUgTUFQX1RNUEZJTEUKLSNlbmRpZiAvKiBNQUNfT1NfWF9TRVJWRVIgKi8KLSNkZWZpbmUgSEFWRV9SRVNPVVJDRQotI2RlZmluZSBIQVZFX1NOUFJJTlRGCi0jZGVmaW5lIEpNUF9CVUYgam1wX2J1ZgotI2RlZmluZSBVU0VfTE9OR0pNUAotI2RlZmluZSBVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQKLSNkZWZpbmUgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBUCi0vKgotICogSWYgeW91IGFyZSB1c2luZyBBUEFDSSwgKHlvdSBwcm9iYWJseSBzaG91bGQgYmUgb24gTWFjIE9TKSB0aGVzZQotICogdmFsdWVzIGFyZSBzZXQgYXQgY29uZmlndXJlIHRpbWUuCi0gKi8KLSNpZm5kZWYgSFRUUERfUk9PVAotI2RlZmluZSBIVFRQRF9ST09UICAgICAgICAgICAgICAiL0xvY2FsL0xpYnJhcnkvV2ViU2VydmVyIgotI2VuZGlmCi0jaWZuZGVmIERPQ1VNRU5UX0xPQ0FUSU9OCi0jZGVmaW5lIERPQ1VNRU5UX0xPQ0FUSU9OICAgICAgIEhUVFBEX1JPT1QgIi9Eb2N1bWVudHMiCi0jZW5kaWYKLSNpZm5kZWYgREVGQVVMVF9YRkVSTE9HCi0jZGVmaW5lIERFRkFVTFRfWEZFUkxPRyAgICAgICAgICJMb2dzL0FjY2VzcyIKLSNlbmRpZgotI2lmbmRlZiBERUZBVUxUX0VSUk9STE9HCi0jZGVmaW5lIERFRkFVTFRfRVJST1JMT0cgICAgICAgICJMb2dzL0Vycm9ycyIKLSNlbmRpZgotI2lmbmRlZiBERUZBVUxUX1BJRExPRwotI2RlZmluZSBERUZBVUxUX1BJRExPRyAgICAgICAgICAiTG9ncy9Qcm9jZXNzIgotI2VuZGlmCi0jaWZuZGVmIERFRkFVTFRfU0NPUkVCT0FSRAotI2RlZmluZSBERUZBVUxUX1NDT1JFQk9BUkQgICAgICAiTG9ncy9TdGF0dXMiCi0jZW5kaWYKLSNpZm5kZWYgREVGQVVMVF9MT0NLRklMRQotI2RlZmluZSBERUZBVUxUX0xPQ0tGSUxFICAgICAgICAiTG9ncy9Mb2NrIgotI2VuZGlmCi0jaWZuZGVmIFNFUlZFUl9DT05GSUdfRklMRQotI2RlZmluZSBTRVJWRVJfQ09ORklHX0ZJTEUgICAgICAiQ29uZmlndXJhdGlvbi9TZXJ2ZXIiCi0jZW5kaWYKLSNpZm5kZWYgUkVTT1VSQ0VfQ09ORklHX0ZJTEUKLSNkZWZpbmUgUkVTT1VSQ0VfQ09ORklHX0ZJTEUgICAgIkNvbmZpZ3VyYXRpb24vUmVzb3VyY2VzIgotI2VuZGlmCi0jaWZuZGVmIFRZUEVTX0NPTkZJR19GSUxFCi0jZGVmaW5lIFRZUEVTX0NPTkZJR19GSUxFICAgICAgICJDb25maWd1cmF0aW9uL01JTUUiCi0jZW5kaWYKLSNpZm5kZWYgQUNDRVNTX0NPTkZJR19GSUxFCi0jZGVmaW5lIEFDQ0VTU19DT05GSUdfRklMRSAgICAgICJDb25maWd1cmF0aW9uL0FjY2VzcyIKLSNlbmRpZgotI2lmbmRlZiBERUZBVUxUX1VTRVJfRElSCi0jZGVmaW5lIERFRkFVTFRfVVNFUl9ESVIgICAgICAgICJMaWJyYXJ5L1dlYiBEb2N1bWVudHMiCi0jZW5kaWYKLSNpZm5kZWYgREVGQVVMVF9VU0VSCi0jZGVmaW5lIERFRkFVTFRfVVNFUiAgICAgICAgICAgICJ3d3ciCi0jZW5kaWYKLSNpZm5kZWYgREVGQVVMVF9HUk9VUAotI2RlZmluZSBERUZBVUxUX0dST1VQICAgICAgICAgICAid3d3IgotI2VuZGlmCi0jaWZuZGVmIERFRkFVTFRfUEFUSAotI2RlZmluZSBERUZBVUxUX1BBVEggICAgICAgICAgICAiL2JpbjovdXNyL2JpbjovdXNyL2xvY2FsL2JpbiIKLSNlbmRpZgotCi0jZWxpZiBkZWZpbmVkKExJTlVYKQotCi0jaWYgTElOVVggPiAxCi0jaW5jbHVkZSA8ZmVhdHVyZXMuaD4KLQotLyogbGliYzQgc3lzdGVtcyBwcm9iYWJseSBzdGlsbCB3b3JrLCBpdCBwcm9iYWJseSBkb2Vzbid0IGRlZmluZQotICogIF9fR05VX0xJQlJBUllfXwotICogbGliYzUgc3lzdGVtcyBkZWZpbmUgX19HTlVfTElCUkFSWV9fID09IDEsIGJ1dCBkb24ndCBkZWZpbmUgX19HTElCQ19fCi0gKiBnbGliYyAyLnggYW5kIGxhdGVyIHN5c3RlbXMgZGVmaW5lIF9fR05VX0xJQlJBUllfXyA9PSA2LCBidXQgbGlzdCBpdCBhcwotICogImRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIF9fR0xJQkNfXyI7IHRoZSB2YWx1ZSA2IHdpbGwgbmV2ZXIgYmUgY2hhbmdlZC4KLSAqIGdsaWJjIDEueCBzeXN0ZW1zIChpLmUuIHJlZGhhdCA0Lnggb24gc3BhcmMvYWxwaGEpIHNob3VsZCBoYXZlCi0gKiBfX0dMSUJDX18gPCAyCi0gKiBhbGwgZ2xpYmMgYmFzZWQgc3lzdGVtcyBuZWVkIGNyeXB0LmgKLSAqLwotI2lmIGRlZmluZWQoX19HTlVfTElCUkFSWV9fKSAmJiBfX0dOVV9MSUJSQVJZX18gPiAxCi0jaW5jbHVkZSA8Y3J5cHQuaD4KLSNlbmRpZgotCi0vKiBnbGliYyAyLjAuMCB0aHJvdWdoIDIuMC40IG5lZWQgc2l6ZV90ICogaGVyZSwgd2hlcmUgMi4wLjUgbmVlZHMgc29ja2xlbl90ICoKLSAqIHRoZXJlJ3Mgbm8gd2F5IHRvIGRpc2Nlcm4gYmV0d2VlbiB0aGVzZSB0d28gbGlicmFyaWVzLiAgQnV0IHVzaW5nIGludCBzaG91bGQKLSAqIGJlIHBvcnRhYmxlIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZXNlIGxpYnMgd291bGQgYmUgaG9wZWxlc3NseSBicm9rZW4gd2l0aAotICogcmVhbXMgb2YgZXhpc3RpbmcgbmV0d29ya2luZyBjb2RlLiAgV2UnbGwgdXNlIHNvY2tsZW5fdCAqIGZvciAyLjEueCBhbmQKLSAqIGxhdGVyLgotICoKLSAqIGludCB3b3JrcyBmb3IgYWxsIHRoZSBlYXJsaWVyIGxpYnMsIGFuZCBpcyBwaWNrZWQgdXAgYnkgZGVmYXVsdCBsYXRlci4KLSAqLwotI2lmIGRlZmluZWQoX19HTElCQ19fKSAmJiAoX19HTElCQ19fID4gMiB8fCAoX19HTElCQ19fID09IDIgJiYgX19HTElCQ19NSU5PUl9fID4gMCkpCi0jZGVmaW5lIE5FVF9TSVpFX1Qgc29ja2xlbl90Ci0jZW5kaWYKLQotI2RlZmluZSBIQVZFX1NITUdFVCAxCi0jZGVmaW5lIFVTRV9TSE1HRVRfU0NPUkVCT0FSRAotI2RlZmluZSBIQVZFX01NQVAgMQotI2RlZmluZSBVU0VfTU1BUF9GSUxFUwotCi0vKiBmbG9jayBpcyBmYXN0ZXIgLi4uIGJ1dCBoYXNuJ3QgYmVlbiB0ZXN0ZWQgb24gMS54IHN5c3RlbXMgKi8KLS8qIFBSIzM1MzEgaW5kaWNhdGVzIGZsb2NrKCkgbWF5IG5vdCBiZSBzdGFibGUsIHByb2JhYmx5IGRlcGVuZHMgb24KLSAqIGtlcm5lbCB2ZXJzaW9uLiAgR28gYmFjayB0byB1c2luZyBmY250bCwgYnV0IHByb3ZpZGUgYSB3YXkgZm9yCi0gKiBmb2xrcyB0byB0d2VhayB0aGVpciBDb25maWd1cmF0aW9uIHRvIGdldCBmbG9jay4KLSAqLwotI2lmbmRlZiBVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQKLSNkZWZpbmUgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUCi0jZW5kaWYKLQotI2RlZmluZSBTWVNfU0lHTElTVAlfc3lzX3NpZ2xpc3QKLQotI2Vsc2UKLSNkZWZpbmUgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUCi0jZW5kaWYKLQotI3VuZGVmIEhBVkVfR01UT0ZGCi0jdW5kZWYgTk9fS0lMTFBHCi0jdW5kZWYgTk9fU0VUU0lECi0jdW5kZWYgTkVFRF9TVFJEVVAKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2RlZmluZSBIQVZFX1NZU0xPRyAxCi0KLS8qIGdsaWJjIDIuMSBhbmQgbGF0ZXIgZmluYWxseSBkZWZpbmUgcmxpbV90ICovCi0jaWYgIWRlZmluZWQoX19HTElCQ19fKSB8fCBfX0dMSUJDX18gPCAyIHx8IChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPCAxKQotdHlwZWRlZiBpbnQgcmxpbV90OwotI2VuZGlmCi0KLSNlbGlmIGRlZmluZWQoU0NPKQotI3VuZGVmIEhBVkVfR01UT0ZGCi0jdW5kZWYgTk9fS0lMTFBHCi0jdW5kZWYgTk9fU0VUU0lECi0jZGVmaW5lIE5FRURfSU5JVEdST1VQUwotI2RlZmluZSBOT19XUklURVYKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2RlZmluZSBIQVZFX1NZU0xPRyAxCi0jdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAotCi0jZWxpZiBkZWZpbmVkKFNDTzUpCi0KLSNkZWZpbmUgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi0jZGVmaW5lIFVTRV9NTUFQX1NDT1JFQk9BUkQKLSNkZWZpbmUgVVNFX01NQVBfRklMRVMKLSNkZWZpbmUgU2VjdXJlV2FyZQotI2RlZmluZSBIQVZFX1NZU0xPRyAxCi0KLS8qIEFsdGhvdWdoIFNDTyA1IGRlZmluZXMgdGhlc2UgaW4gPHN0cmluZ3MuaD4gKG5vdGUgdGhlICJzIikgdGhleSBkb24ndCBoYXZlCi0gICBjb25zdHMuIFNpZ2guICovCi1leHRlcm4gaW50IHN0cmNhc2VjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotZXh0ZXJuIGludCBzdHJuY2FzZWNtcChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQpOwotCi0jZWxpZiBkZWZpbmVkKEFVWDMpCi0vKiBUaGVzZSBhcmUgdG8gbGV0IC1XYWxsIGNvbXBpbGUgbW9yZSBjbGVhbmx5ICovCi1leHRlcm4gaW50IHN0cmNhc2VjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotZXh0ZXJuIGludCBzdHJuY2FzZWNtcChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQpOwotZXh0ZXJuIGludCBzZXQ0MnNpZygpLCBnZXRvcHQoKSwgZ2V0cGVlcm5hbWUoKSwgYnplcm8oKTsKLWV4dGVybiBpbnQgbGlzdGVuKCksIGJpbmQoKSwgc29ja2V0KCksIGdldHNvY2tuYW1lKCk7Ci1leHRlcm4gaW50IGFjY2VwdCgpLCBnZXRob3N0bmFtZSgpLCBjb25uZWN0KCksIGxzdGF0KCk7Ci1leHRlcm4gaW50IHNlbGVjdCgpLCBraWxscGcoKSwgc2h1dGRvd24oKTsKLWV4dGVybiBpbnQgaW5pdGdyb3VwcygpLCBzZXRzb2Nrb3B0KCk7Ci1leHRlcm4gY2hhciAqc2htYXQoKTsKLWV4dGVybiBpbnQgc2htY3RsKCk7Ci1leHRlcm4gaW50IHNobWdldCgpOwotZXh0ZXJuIGNoYXIgKnNicmsoKTsKLWV4dGVybiBjaGFyICpjcnlwdCgpOwotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jdW5kZWYgSEFWRV9HTVRPRkYKLSN1bmRlZiBOT19LSUxMUEcKLSN1bmRlZiBOT19TRVRTSUQKLSNkZWZpbmUgTkVFRF9TVFJEVVAKLS8qIGZjbnRsKCkgbG9ja2luZyBpcyBleHBlbnNpdmUgd2l0aCBORlMgKi8KLSNkZWZpbmUgVVNFX0ZMT0NLX1NFUklBTElaRURfQUNDRVBUCi0jZGVmaW5lIFNJTkdMRV9MSVNURU5fVU5TRVJJQUxJWkVEX0FDQ0VQVAotI2RlZmluZSBIQVZFX1NITUdFVCAxCi0jZGVmaW5lIFVTRV9TSE1HRVRfU0NPUkVCT0FSRAotLyoKLSAqIE5PVEU6IElmIHdoZW4geW91IHJ1biBBcGFjaGUgdW5kZXIgQS9VWCBhbmQgeW91IGdldCBhIHdhcm5pbmcKLSAqIHRoYXQgaHR0cGQgY291bGRuJ3QgbW92ZSBicmVhaywgdGhlbiB0aGUgYmVsb3cgdmFsdWUgZm9yCi0gKiBNT1ZFQlJFQUsgKDY0bWVncykgaXMgdG9vIGxhcmdlIGZvciB5b3VyIHNldHVwLiBUcnkgcmVkdWNpbmcKLSAqIHRvIDB4MjAwMDAwMCB3aGljaCBpcyBzdGlsbCBQTEVOVFkgb2Ygc3BhY2UuIEkgZG91YnQgaWYKLSAqIGV2ZW4gb24gaGVhdnkgc3lzdGVtcyBzYnJrKCkgd291bGQgYmUgY2FsbGVkIGF0IGFsbC4uLgotICovCi0jZGVmaW5lIE1PVkVCUkVBSwkJMHg0MDAwMDAwCi0jZGVmaW5lIE5PX0xJTkdDTE9TRQotI2RlZmluZSBOT19TTEFDSwotI2RlZmluZSBIQVZFX1NZU0xPRyAxCi0jdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAkvKiBleGlzdHMgYnV0IGRvZXMgbm90IHByb3ZpZGUgKnJsaW1pdCBmdW5jcyAqLwotCi0jZWxpZiBkZWZpbmVkKFNWUjQpCi0jZGVmaW5lIE5PX0tJTExQRwotI3VuZGVmICBOT19TRVRTSUQKLSN1bmRlZiBORUVEX1NUUkRVUAotI2lmbmRlZiBNUFJBUwotI2RlZmluZSBORUVEX1NUUkNBU0VDTVAKLSNpZm5kZWYgRU5DT1JFCi0jZGVmaW5lIE5FRURfU1RSTkNBU0VDTVAKLSNlbmRpZiAvKiBFTkNPUkUgKi8KLSNlbmRpZiAvKiBNUFJBUyAqLwotI2RlZmluZSBiemVybyhhLGIpIG1lbXNldChhLDAsYikKLS8qIEEgbG90IG9mIFNWUjQgc3lzdGVtcyBuZWVkIHRoaXMgKi8KLSNpZm5kZWYgVVNFX1NZU1ZTRU1fU0VSSUFMSVpFRF9BQ0NFUFQKLSNkZWZpbmUgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUCi0jZW5kaWYKLSNkZWZpbmUgSEFWRV9TWVNMT0cgMQotI2RlZmluZSBORVRfU0laRV9UIHNpemVfdAotI2RlZmluZSBIQVZFX1NITUdFVCAxCi0jZGVmaW5lIFVTRV9TSE1HRVRfU0NPUkVCT0FSRAotI2lmZGVmIF9PU0RfUE9TSVggLyogQlMyMDAwLVBPU0lYIG1haW5mcmFtZSBuZWVkcyBpbml0Z3JvdXBzICovCi0jZGVmaW5lIE5FRURfSEFTSEJBTkdfRU1VTCAvKiBleGVjdmUoKSBkb2Vzbid0IHN0YXJ0IHNoZWxsIHNjcmlwdHMgYnkgZGVmYXVsdCAqLwotI2RlZmluZSBfS01FTVVTRVIgICAgICAgICAgLyogRW5hYmxlIFNITV9SL1NITV9XIGRlZmluZXMgaW4gPHNobS5oPiAqLwotI3VuZGVmIE5FRURfU1RSQ0FTRUNNUAotI3VuZGVmIE5FRURfU1RSTkNBU0VDTVAKLSN1bmRlZiBiemVybwotI2VuZGlmIC8qX09TRF9QT1NJWCovCi0KLSNlbGlmIGRlZmluZWQoVVcpCi0jaWYgVVcgPCA3MDAKLSNkZWZpbmUgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUCi0jZGVmaW5lIE5PX0xJTkdDTE9TRQotI2RlZmluZSBOT19LSUxMUEcKLSNlbmRpZgotI3VuZGVmICBOT19TRVRTSUQKLSN1bmRlZiBORUVEX1NUUkRVUAotI2RlZmluZSBORUVEX1NUUkNBU0VDTVAKLSNkZWZpbmUgTkVFRF9TVFJOQ0FTRUNNUAotI2RlZmluZSBiemVybyhhLGIpIG1lbXNldChhLDAsYikKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLSNkZWZpbmUgVVNFX01NQVBfU0NPUkVCT0FSRAotI2RlZmluZSBVU0VfTU1BUF9GSUxFUwotI2RlZmluZSBIQVZFX1NITUdFVCAxCi0jdW5kZWYgVVNFX1NITUdFVF9TQ09SRUJPQVJECS8qIGZvcmNlIHVzZSBvZiBtbWFwKCkgc2NvcmVib2FyZCAqLwotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaWYgVVcgPj0gMjAwCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UKLSNlbmRpZgotI2RlZmluZSBORVRfU0laRV9UIHNpemVfdAotI2RlZmluZSBIQVZFX1NZU0xPRyAxCi0KLSNlbGlmIGRlZmluZWQoREdVWCkKLSNkZWZpbmUgTk9fS0lMTFBHCi0jdW5kZWYgIE5PX1NFVFNJRAotI3VuZGVmIE5FRURfU1RSRFVQCi0jaWZkZWYgX0lYODZfREcKLSN1bmRlZiBORUVEX1NUUkNBU0VDTVAKLSN1bmRlZiBORUVEX1NUUk5DQVNFQ01QCi0jZWxzZQotI2RlZmluZSBORUVEX1NUUkNBU0VDTVAKLSNkZWZpbmUgTkVFRF9TVFJOQ0FTRUNNUAotI2VuZGlmCi0jZGVmaW5lIGJ6ZXJvKGEsYikgbWVtc2V0KGEsMCxiKQotLyogQSBsb3Qgb2YgU1ZSNCBzeXN0ZW1zIG5lZWQgdGhpcyAqLwotI2RlZmluZSBVU0VfRkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQKLSNkZWZpbmUgYXBfaW5ldF9hZGRyIGluZXRfbmV0d29yawotI2RlZmluZSBIQVZFX1NZU0xPRyAxCi0KLSNlbGlmIGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykgfHwgZGVmaW5lZChORVRCU0QpCi0jZGVmaW5lIEhBVkVfR01UT0ZGIDEKLSN1bmRlZiBOT19LSUxMUEcKLSN1bmRlZiBOT19TRVRTSUQKLSNkZWZpbmUgSEFWRV9TWVNMT0cgMQotI2lmbmRlZiBERUZBVUxUX1VTRVIKLSNkZWZpbmUgREVGQVVMVF9VU0VSICJub2JvZHkiCi0jZW5kaWYKLSNpZm5kZWYgREVGQVVMVF9HUk9VUAotI2RlZmluZSBERUZBVUxUX0dST1VQICJub2dyb3VwIgotI2VuZGlmCi0jZGVmaW5lIEhBVkVfU0hNR0VUIDEKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLSNkZWZpbmUgVVNFX01NQVBfU0NPUkVCT0FSRAotI2RlZmluZSBVU0VfTU1BUF9GSUxFUwotI2RlZmluZSBVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQKLSNkZWZpbmUgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBUCi0KLSNlbGlmIGRlZmluZWQoVVRTMjEpCi0jdW5kZWYgSEFWRV9HTVRPRkYKLSN1bmRlZiBOT19LSUxMUEcKLSNkZWZpbmUgTk9fU0VUU0lECi0jZGVmaW5lIE5FRURfV0FJVFBJRAotI2RlZmluZSBTVERJTl9GSUxFTk8gMAotI2RlZmluZSBTVERPVVRfRklMRU5PIDEKLSNkZWZpbmUgU1RERVJSX0ZJTEVOTyAyCi0jZGVmaW5lIEhBVkVfU1lTTE9HIDEKLSNkZWZpbmUgVVNFX0xPTkdKTVAKLSNkZWZpbmUgSk1QX0JVRiBqbXBfYnVmCi0jZGVmaW5lIE5PX1VTRV9TSUdBQ1RJT04KLSNkZWZpbmUgTkVFRF9TVFJFUlJPUgotI2RlZmluZSBORUVEX1NUUlNUUgotI2RlZmluZSBORUVEX0hBU0hCQU5HX0VNVUwKLSNkZWZpbmUgTkRFTEFZX1BJUEVfUkVUVVJOU19aRVJPCi0jZGVmaW5lIE5PX0RBVEEgTk9fQUREUkVTUwotI2RlZmluZQlhcF93YWl0X3QJCXVuaW9uIHdhaXQKLSNkZWZpbmUgV0VYSVRTVEFUVVMoc3RhdHVzKQkoaW50KSgoc3RhdHVzKS53X3JldGNvZGUpCi0jZGVmaW5lIFdURVJNU0lHKHN0YXR1cykJKGludCkoKHN0YXR1cykud190ZXJtc2lnKQotI2RlZmluZSBzdHJmdGltZShidWYsYnVmc2l6ZSxmbXQsdG0pICAgIGFzY2Z0aW1lKGJ1ZixmbXQsdG0pCi0jdW5kZWYgSEFWRV9TWVNfUkVTT1VSQ0VfSCAvKiBleGlzdHMgYnV0IGRvZXMgbm90IHByb3ZpZGUgKnJsaW1pdCBmdW5jcyAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+ICAgICAKLQotI2VsaWYgZGVmaW5lZChBUE9MTE8pCi0jdW5kZWYgSEFWRV9HTVRPRkYKLSN1bmRlZiBOT19LSUxMUEcKLSN1bmRlZiBOT19TRVRTSUQKLSNkZWZpbmUgSEFWRV9TWVNMT0cgMQotCi0jZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fYnNkaV9fKQotI2lmIGRlZmluZWQoX19GcmVlQlNEX18pCi0jaW5jbHVkZSA8b3NyZWxkYXRlLmg+Ci0jZW5kaWYKLSNkZWZpbmUgSEFWRV9HTVRPRkYgMQotI3VuZGVmIE5PX0tJTExQRwotI3VuZGVmIE5PX1NFVFNJRAotI2RlZmluZSBIQVZFX01NQVAgMQotI2RlZmluZSBVU0VfTU1BUF9TQ09SRUJPQVJECi0jZGVmaW5lIFVTRV9NTUFQX0ZJTEVTCi0jaWZuZGVmIERFRkFVTFRfVVNFUgotI2RlZmluZSBERUZBVUxUX1VTRVIgIm5vYm9keSIKLSNlbmRpZgotI2lmbmRlZiBERUZBVUxUX0dST1VQCi0jZGVmaW5lIERFRkFVTFRfR1JPVVAgIm5vZ3JvdXAiCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fYnNkaV9fKSB8fCBcCi0oZGVmaW5lZChfX0ZyZWVCU0RfdmVyc2lvbikgJiYgKF9fRnJlZUJTRF92ZXJzaW9uIDwgMjIwMDAwKSkKLXR5cGVkZWYgcXVhZF90IHJsaW1fdDsKLSNlbmRpZgotI2RlZmluZSBVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQKLSNkZWZpbmUgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBUCi0jZGVmaW5lIEhBVkVfU1lTTE9HIDEKLSNkZWZpbmUgU1lTX1NJR0xJU1Qgc3lzX3NpZ2xpc3QKLQotI2VsaWYgZGVmaW5lZChRTlgpCi0jaWZuZGVmIGNyeXB0Ci1jaGFyICpjcnlwdChjb25zdCBjaGFyICpwdywgY29uc3QgY2hhciAqc2FsdCk7Ci0jZW5kaWYKLSNpZm5kZWYgaW5pdGdyb3VwcwotaW50IGluaXRncm91cHMoY2hhciAqLCBpbnQpOwotI2VuZGlmCi0jaWZuZGVmIHN0cm5jYXNlY21wCi0jZGVmaW5lIHN0cm5jYXNlY21wIHN0cm5pY21wCi0jZW5kaWYKLSN1bmRlZiBOT19LSUxMUEcKLSN1bmRlZiBOT19TRVRTSUQKLSNkZWZpbmUgTkVFRF9JTklUR1JPVVBTCi0jZGVmaW5lIE5FRURfU0VMRUNUX0gKLSNkZWZpbmUgTkVFRF9QUk9DRVNTX0gKLSNpbmNsdWRlIDx1bml4Lmg+Ci0jZGVmaW5lIEhBVkVfTU1BUCAxCi0jZGVmaW5lIFVTRV9QT1NJWF9TQ09SRUJPQVJECi0jZGVmaW5lIFVTRV9GTE9DS19TRVJJQUxJWkVEX0FDQ0VQVAotI2RlZmluZSBTSU5HTEVfTElTVEVOX1VOU0VSSUFMSVpFRF9BQ0NFUFQKLSNkZWZpbmUgSEFWRV9TWVNMT0cgMQotCi0jZWxpZiBkZWZpbmVkKExZTlhPUykKLSN1bmRlZiBIQVZFX0dNVE9GRgotI3VuZGVmIFVTRV9NTUFQX1NDT1JFQk9BUkQKLSN1bmRlZiBVU0VfU0hNR0VUX1NDT1JFQk9BUkQKLSN1bmRlZiBVU0VfRkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQKLSN1bmRlZiBVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQKLSNkZWZpbmUgVVNFX0xPTkdKTVAKLSN1bmRlZiBOT19LSUxMUEcKLSN1bmRlZiBOT19TRVRTSUQKLSN1bmRlZiBOT19VU0VfU0lHQUNUSU9OCi0jdW5kZWYgTk9fTElOR0NMT1NFCi1leHRlcm4gY2hhciAqY3J5cHQoY2hhciAqcHcsIGNoYXIgKnNhbHQpOwotdHlwZWRlZiBpbnQgcmxpbV90OwotI2RlZmluZSBIQVZFX1NZU0xPRyAxCi0KLSNlbGlmIGRlZmluZWQoVVhQRFMpCi0jdW5kZWYgTkVFRF9TVFJDQVNFQ01QCi0jdW5kZWYgTkVFRF9TVFJOQ0FTRUNNUAotI3VuZGVmIE5FRURfU1RSRFVQCi0jdW5kZWYgSEFWRV9HTVRPRkYKLSNkZWZpbmUgTk9fS0lMTFBHCi0jdW5kZWYgTk9fU0VUU0lECi0jZGVmaW5lIGJ6ZXJvKGEsYikgbWVtc2V0KGEsMCxiKQotI2RlZmluZSBVU0VfRkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLSNkZWZpbmUgVVNFX01NQVBfU0NPUkVCT0FSRAotI2RlZmluZSBVU0VfTU1BUF9GSUxFUwotI2RlZmluZSBIQVZFX1NZU0xPRyAxCi0KLSNlbGlmIGRlZmluZWQoT1MyKQotLyogRGVmaW5lcyByZXF1aXJlZCBmb3IgRU1YIE9TLzIgcG9ydC4gKi8KLSNkZWZpbmUgTk9fS0lMTFBHCi0jZGVmaW5lIE5FRURfU1RSQ0FTRUNNUAotI2RlZmluZSBORUVEX1NUUk5DQVNFQ01QCi0jZGVmaW5lIE5FRURfUFJPQ0VTU19ICi0jZGVmaW5lIE5PX1NFVFNJRAotI2RlZmluZSBOT19USU1FUwotI2RlZmluZSBDQVNFX0JMSU5EX0ZJTEVTWVNURU0KLS8qIEFkZCBzb21lIGRyaXZlIG5hbWUgc3VwcG9ydCAqLwotI2RlZmluZSBjaGRpciBfY2hkaXIyCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNkZWZpbmUgTUFYU09DS0VUUyAyMDQ4Ci0jZGVmaW5lIFVTRV9PUzJfU0NPUkVCT0FSRAotI2RlZmluZSBOT19SRUxJQUJMRV9QSVBFRF9MT0dTCi0jZGVmaW5lIFVTRV9PUzJTRU1fU0VSSUFMSVpFRF9BQ0NFUFQKLSNkZWZpbmUgU0lOR0xFX0xJU1RFTl9VTlNFUklBTElaRURfQUNDRVBUCi0KLSNlbGlmIGRlZmluZWQoX19NQUNIVEVOX18pCi10eXBlZGVmIGludCBybGltX3Q7Ci0jdW5kZWYgTk9fS0lMTFBHCi0jZGVmaW5lIE5PX1NFVFNJRAotI2RlZmluZSBIQVZFX0dNVE9GRiAxCi0jaWZuZGVmIF9fTUFDSFRFTl9QUENfXwotI2lmbmRlZiBfX01BQ0hURU5fNjhLX18KLSNkZWZpbmUgX19NQUNIVEVOXzY4S19fCi0jZW5kaWYKLSNkZWZpbmUgVVNFX0ZMT0NLX1NFUklBTElaRURfQUNDRVBUCi0jZGVmaW5lIE5PX1VTRV9TSUdBQ1RJT04KLSNkZWZpbmUgSk1QX0JVRiBzaWdqbXBfYnVmCi0jZGVmaW5lIFVTRV9MT05HSk1QCi0jdW5kZWYgTkVFRF9TVFJEVVAKLSNlbHNlCi0jZGVmaW5lIEhBVkVfU0hNR0VUIDEKLSNkZWZpbmUgVVNFX1NITUdFVF9TQ09SRUJPQVJECi0jZGVmaW5lIFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVAotI2VuZGlmCi0KLS8qIENvbnZleCBPUyB2MTEgKi8KLSNlbGlmIGRlZmluZWQoQ09OVkVYT1MxMSkKLSN1bmRlZiBIQVZFX0dNVE9GRgotI3VuZGVmIE5PX0tJTExQRwotI3VuZGVmIE5PX1NFVFNJRAotI3VuZGVmIE5FRURfU1RSRFVQCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi0jZGVmaW5lIFVTRV9NTUFQX1NDT1JFQk9BUkQKLSNkZWZpbmUgVVNFX01NQVBfRklMRVMKLSNkZWZpbmUgSEFWRV9TWVNMT0cgMQotCi0jZGVmaW5lIE5PX1RJTUVaT05FCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLXR5cGVkZWYgaW50IHJsaW1fdDsKLQotI2VsaWYgZGVmaW5lZChJU0MpCi0jaW5jbHVkZSA8bmV0L2Vycm5vLmg+Ci0jZGVmaW5lIE5PX0tJTExQRwotI3VuZGVmIE5PX1NFVFNJRAotI2RlZmluZSBIQVZFX1NITUdFVCAxCi0jZGVmaW5lIFVTRV9TSE1HRVRfU0NPUkVCT0FSRAotI2RlZmluZSBVU0VfRkNOVExfU0VSSUFMSVpFRF9BQ0NFUFQKLSNkZWZpbmUgSEFWRV9TWVNMT0cgMQotCi0jZWxpZiBkZWZpbmVkKE5FV1NPUykKLSNkZWZpbmUgSEFWRV9TSE1HRVQgMQotI2RlZmluZSBVU0VfU0hNR0VUX1NDT1JFQk9BUkQKLSNkZWZpbmUgVVNFX0xPTkdKTVAKLSNkZWZpbmUgTk9fU0VUU0lECi0jZGVmaW5lIE5PX1VTRV9TSUdBQ1RJT04KLSNkZWZpbmUgTkVFRF9XQUlUUElECi0jZGVmaW5lIEhBVkVfU1lTTE9HIDEKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotdHlwZWRlZiBpbnQgcGlkX3Q7Ci10eXBlZGVmIGludCBybGltX3Q7Ci10eXBlZGVmIGludCBtb2RlX3Q7Ci0KLSNlbGlmIGRlZmluZWQoUklTQ0lYKQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci10eXBlZGVmIGludCBybGltX3Q7Ci0jZGVmaW5lIE5PX1VTRV9TSUdBQ1RJT04KLSNkZWZpbmUgVVNFX0xPTkdKTVAKLSNkZWZpbmUgTkVFRF9TVFJDQVNFQ01QCi0jZGVmaW5lIE5FRURfU1RSTkNBU0VDTVAKLSNkZWZpbmUgTkVFRF9TVFJEVVAKLQotI2VsaWYgZGVmaW5lZChCRU9TKQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPGtlcm5lbC9PUy5oPgotI2luY2x1ZGUgPGtlcm5lbC9pbWFnZS5oPgotI2luY2x1ZGUgPHN5cy91aW8uaD4KLQotI2RlZmluZSBOT19XUklURVYKLSNkZWZpbmUgTk9fS0lMTFBHCi0jZGVmaW5lIE5FRURfSU5JVEdST1VQUwotCi0jZWxpZiBkZWZpbmVkKF9DWF9TWCkKLSNkZWZpbmUgSk1QX0JVRiBzaWdqbXBfYnVmCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotI2VsaWYgZGVmaW5lZChXSU4zMikKLQotLyogQWxsIHdpbmRvd3Mgc3R1ZmYgaXMgbm93IGluIG9zL3dpbjMyL29zLmggKi8KLQotI2VsaWYgZGVmaW5lZChUUEYpIC8qIElCTSBUcmFuc2FjdGlvbiBQcm9jZXNzaW5nIEZhY2lsaXR5IG9wZXJhdGluZyBzeXN0ZW0gKi8KLQotI2luY2x1ZGUgPHRwZmVxLmg+Ci0jaW5jbHVkZSA8dHBmaW8uaD4KLSNpbmNsdWRlIDxzeXNhcGkuaD4KLSNpbmNsdWRlIDxzeXNndGltZS5oPgotI2RlZmluZSBQUklNRUNSQVMgMHgwMTAwMDAKLSNkZWZpbmUgSk1QX0JVRiBqbXBfYnVmCi0jZGVmaW5lIEhBVkVfU0hNR0VUCi0jdW5kZWYgIEhBVkVfU1lTX1JFU09VUkNFX0gKLSNkZWZpbmUgTkVFRF9JTklUR1JPVVBTCi0jZGVmaW5lIE5FRURfU0lHTkFMX0lOVEVSUlVQVAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNpZm5kZWYgX19zdHJpbmdzX2gKLSNkZWZpbmUgTkVFRF9TVFJDQVNFQ01QCi0jZGVmaW5lIE5FRURfU1RSTkNBU0VDTVAKLSNlbmRpZgotI2RlZmluZSBORUVEX1NUUkRVUAotI2RlZmluZSBOT19EQk1fUkVXUklURU1BUAotI2RlZmluZSBOT19HRVRUSU1FT0ZEQVkKLSNkZWZpbmUgTk9fS0lMTFBHCi0jZGVmaW5lIE5PX0xJTkdDTE9TRQotI2RlZmluZSBOT19NTUFQCi0jZGVmaW5lIE5PX1JFTElBQkxFX1BJUEVEX0xPR1MKLSNkZWZpbmUgTk9fU0VUU0lECi0jZGVmaW5lIE5PX1NMQUNLCi0jZGVmaW5lIE5PX1RJTUVTCi0jZGVmaW5lIE5PX1VTRV9TSUdBQ1RJT04KLSNkZWZpbmUgTk9fV1JJVEVWCi0jZGVmaW5lIFVTRV9MT05HSk1QCi0vKiNkZWZpbmUgVVNFX1NITUdFVF9TQ09SRUJPQVJEKi8KLSNkZWZpbmUgVVNFX1RQRl9BQ0NFUFQKLSNkZWZpbmUgVVNFX1RQRl9DT1JFX1NFUklBTElaRURfQUNDRVBUCi0vKiNkZWZpbmUgVVNFX1RQRl9EQUVNT04qLwotI2RlZmluZSBVU0VfVFBGX1NDT1JFQk9BUkQKLSNkZWZpbmUgVVNFX1RQRl9TRUxFQ1QKLSN1bmRlZiAgb2Zmc2V0b2YKLSNkZWZpbmUgb2Zmc2V0b2Yoc190eXBlLGZpZWxkKSAoKHNpemVfdCkmKCgoc190eXBlKikwKS0+ZmllbGQpKQotCi0jZWxpZiBkZWZpbmVkKF9fVEFOREVNKQotI2RlZmluZSBOT19XUklURVYKLSNkZWZpbmUgTk9fS0lMTFBHCi0jZGVmaW5lIE5FRURfSU5JVEdST1VQUwotI2RlZmluZSBOT19TTEFDSwotCi0jZWxzZQotLyogVW5rbm93biBzeXN0ZW0gLSBFZGl0IHRoZXNlIHRvIG1hdGNoICovCi0jaWZkZWYgQlNECi0jZGVmaW5lIEhBVkVfR01UT0ZGIDEKLSNlbHNlCi0jdW5kZWYgSEFWRV9HTVRPRkYKLSNlbmRpZgotLyogTk9fS0lMTFBHIGlzIHNldCBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSBraWxscGcgKi8KLSN1bmRlZiBOT19LSUxMUEcKLS8qIE5PX1NFVFNJRCBpcyBzZXQgb24gc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgc2V0c2lkICovCi0jdW5kZWYgTk9fU0VUU0lECi0vKiBORUVEX1NUUkRVUCBpcyBzZXQgb24gc3R1cGlkIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIHN0cmR1cC4gKi8KLSN1bmRlZiBORUVEX1NUUkRVUAotI2VuZGlmCi0KLS8qIHN0dWZmIG1hcmtlZCBBUElfRVhQT1JUIGlzIHBhcnQgb2YgdGhlIEFQSSwgYW5kIGludGVuZGVkIGZvciB1c2UKLSAqIGJ5IG1vZHVsZXMKLSAqLwotI2lmbmRlZiBBUElfRVhQT1JUCi0jZGVmaW5lIEFQSV9FWFBPUlQodHlwZSkgICAgdHlwZQotI2VuZGlmCi0KLS8qIFN0dWZmIG1hcmtlZCBBUElfRVhQT1JUX05PTlNURCBpcyBwYXJ0IG9mIHRoZSBBUEksIGFuZCBpbnRlbmRlZCBmb3IKLSAqIHVzZSBieSBtb2R1bGVzLiAgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBBUElfRVhQT1JUIGFuZAotICogQVBJX0VYUE9SVF9OT05TVEQgaXMgdGhhdCB0aGUgbGF0dGVyIGlzIHJlcXVpcmVkIGZvciBhbnkgZnVuY3Rpb25zCi0gKiB3aGljaCB1c2UgdmFyYXJncyBvciBhcmUgdXNlZCB2aWEgaW5kaXJlY3QgZnVuY3Rpb24gY2FsbC4gIFRoaXMKLSAqIGlzIHRvIGFjY29tb2RhdGUgdGhlIHR3byBjYWxsaW5nIGNvbnZlbnRpb25zIGluIHdpbmRvd3MgZGxscy4KLSAqLwotI2lmbmRlZiBBUElfRVhQT1JUX05PTlNURAotI2RlZmluZSBBUElfRVhQT1JUX05PTlNURCh0eXBlKSAgICB0eXBlCi0jZW5kaWYKLQotI2lmbmRlZiBNT0RVTEVfVkFSX0VYUE9SVAotI2RlZmluZSBNT0RVTEVfVkFSX0VYUE9SVAotI2VuZGlmCi0jaWZuZGVmIEFQSV9WQVJfRVhQT1JUCi0jZGVmaW5lIEFQSV9WQVJfRVhQT1JUCi0jZW5kaWYKLQotLyogbW9kdWxlcyBzaG91bGQgbm90IHVzZWQgZnVuY3Rpb25zIG1hcmtlZCBDT1JFX0VYUE9SVAotICogb3IgQ09SRV9FWFBPUlRfTk9OU1REICovCi0jaWZuZGVmIENPUkVfRVhQT1JUCi0jZGVmaW5lIENPUkVfRVhQT1JUCUFQSV9FWFBPUlQKLSNlbmRpZgotI2lmbmRlZiBDT1JFX0VYUE9SVF9OT05TVEQKLSNkZWZpbmUgQ09SRV9FWFBPUlRfTk9OU1RECUFQSV9FWFBPUlRfTk9OU1RECi0jZW5kaWYKLQotLyogT24gTWFjIE9TIFggU2VydmVyLCBzeW1ib2xzIHRoYXQgY29uZmxpY3Qgd2l0aCBsb2FkZWQgZHlsaWJzCi0gKiAoZWcuIFN5c3RlbSBmcmFtZXdvcmspIG5lZWQgdG8gYmUgZGVjbGFyZWQgYXMgcHJpdmF0ZSBzeW1ib2xzIHdpdGgKLSAqIF9fcHJpdmF0ZV9leHRlcm5fXy4KLSAqIEZvciBvdGhlciBzeXN0ZW1zLCBtYWtlIHRoYXQgYSBuby1vcC4KLSAqLwotI2lmIChkZWZpbmVkKE1BQ19PUykgfHwgZGVmaW5lZChNQUNfT1NfWF9TRVJWRVIpKSAmJiBkZWZpbmVkKF9fRFlOQU1JQ19fKQotI2RlZmluZSBhcF9wcml2YXRlX2V4dGVybiBfX3ByaXZhdGVfZXh0ZXJuX18KLSNlbHNlCi0jZGVmaW5lIGFwX3ByaXZhdGVfZXh0ZXJuCi0jZW5kaWYKLQotLyoKLSAqIFRoZSBwYXJ0aWN1bGFyIGRpcmVjdG9yeSBzdHlsZSB5b3VyIHN5c3RlbSBzdXBwb3J0cy4gSWYgeW91IGhhdmUgZGlyZW50LmgKLSAqIGluIC91c3IvaW5jbHVkZSAoUE9TSVgpIG9yIC91c3IvaW5jbHVkZS9zeXMgKFNZU1YpLCAjaW5jbHVkZSAKLSAqIHRoYXQgZmlsZSBhbmQgZGVmaW5lIERJUl9UWVBFIHRvIGJlIGRpcmVudC4gT3RoZXJ3aXNlLCBpZiB5b3UgaGF2ZSAKLSAqIC91c3IvaW5jbHVkZS9zeXMvZGlyLmgsIGRlZmluZSBESVJfVFlQRSB0byBiZSBkaXJlY3QgYW5kIGluY2x1ZGUgdGhhdAotICogZmlsZS4gSWYgeW91IGhhdmUgbmVpdGhlciwgSSdtIGNvbmZ1c2VkLgotICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2lmICFkZWZpbmVkKE5FWFQpICYmICFkZWZpbmVkKFdJTjMyKQotI2luY2x1ZGUgPGRpcmVudC5oPgotI2RlZmluZSBESVJfVFlQRSBkaXJlbnQKLSNlbGlmICFkZWZpbmVkKFdJTjMyKQotI2luY2x1ZGUgPHN5cy9kaXIuaD4KLSNkZWZpbmUgRElSX1RZUEUgZGlyZWN0Ci0jZWxzZQotI2RlZmluZSBESVJfVFlQRSBkaXJlbnQKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpZmRlZiBfX1RBTkRFTQotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2luY2x1ZGUgImFwX2N0eXBlLmgiCi0jaWYgIWRlZmluZWQoTVBFKSAmJiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoVFBGKSAmJiAhZGVmaW5lZChfX1RBTkRFTSkKLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotI2VuZGlmCi0jaWZuZGVmIFdJTjMyCi0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2lmZGVmIEhBVkVfU1lTX1NFTEVDVF9ICi0jaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgotI2VuZGlmIC8qIEhBVkVfU1lTX1NFTEVDVF9IICovCi0jaWZuZGVmIFRQRgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNlbmRpZiAvKiBUUEYgKi8KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2lmICFkZWZpbmVkKE1QRSkgJiYgIWRlZmluZWQoQkVPUykgJiYgIWRlZmluZWQoVFBGKQotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgkJLyogZm9yIGluZXRfbnRvYSAqLwotI2VuZGlmCi0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxncnAuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2lmbmRlZiBPX0JJTkFSWQotI2RlZmluZSBPX0JJTkFSWSAoMCkKLSNlbmRpZgotI2VuZGlmIC8qIG5kZWYgV0lOMzIgKi8KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDx0aW1lLmg+CQkvKiBmb3IgY3RpbWUgKi8KLSNpZmRlZiBXSU4zMgotI2RlZmluZSBzdHJmdGltZShzLG1heCxmb3JtYXQsdG0pICBvc19zdHJmdGltZShzLG1heCxmb3JtYXQsdG0pCi0jZW5kaWYKLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpZiBkZWZpbmVkKFRQRikgJiYgZGVmaW5lZChOU0lHKQotI3VuZGVmIE5TSUcKLSNlbmRpZgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWYgIWRlZmluZWQoUU5YKSAmJiAhZGVmaW5lZChDT05WRVhPUzExKSAmJiAhZGVmaW5lZChORVhUKSAmJiAhZGVmaW5lZChUUEYpCi0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0jZW5kaWYKLQotI2lmZGVmIE5FRURfUFJPQ0VTU19ICi0jaW5jbHVkZSA8cHJvY2Vzcy5oPgotI2VuZGlmCi0KLSNpZmRlZiBXSU4zMgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvaHNyZWdleC5oIgotI2VsaWYgZGVmaW5lZChVU0VfSFNSRUdFWCkKLSNpbmNsdWRlICJoc3JlZ2V4LmgiCi0jZWxzZQotI2luY2x1ZGUgPHJlZ2V4Lmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNpZmRlZiBTVU5PUzQKLWludCBnZXRybGltaXQoaW50LCBzdHJ1Y3QgcmxpbWl0ICopOwotaW50IHNldHJsaW1pdChpbnQsIHN0cnVjdCBybGltaXQgKik7Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIFVTRV9NTUFQX1NDT1JFQk9BUkQKLSNpZiAhZGVmaW5lZChPUzIpICYmICFkZWZpbmVkKFdJTjMyKQotLyogVGhpcyBmaWxlIGlzIG5vdCBuZWVkZWQgZm9yIE9TLzIgKi8KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChNQVBfQU5PTikgJiYgZGVmaW5lZChNQVBfQU5PTllNT1VTKQotI2RlZmluZSBNQVBfQU5PTiBNQVBfQU5PTllNT1VTCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoVVNFX01NQVBfRklMRVMpICYmIChkZWZpbmVkKE5PX01NQVApIHx8ICFkZWZpbmVkKEhBVkVfTU1BUCkpCi0jdW5kZWYgVVNFX01NQVBfRklMRVMKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChVU0VfTU1BUF9TQ09SRUJPQVJEKSAmJiAoZGVmaW5lZChOT19NTUFQKSB8fCAhZGVmaW5lZChIQVZFX01NQVApKQotI3VuZGVmIFVTRV9NTUFQX1NDT1JFQk9BUkQKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChVU0VfU0hNR0VUX1NDT1JFQk9BUkQpICYmIChkZWZpbmVkKE5PX1NITUdFVCkgfHwgIWRlZmluZWQoSEFWRV9TSE1HRVQpKQotI3VuZGVmIFVTRV9TSE1HRVRfU0NPUkVCT0FSRAotI2VuZGlmCi0KLSNpZm5kZWYgTE9HTkFNRV9NQVgKLSNkZWZpbmUgTE9HTkFNRV9NQVggMjUKLSNlbmRpZgotCi0jaWZkZWYgdWx0cml4Ci0jZGVmaW5lIFVMVFJJWF9CUkFJTl9ERUFUSAotI2VuZGlmCi0KLSNpZm5kZWYgU19JU0xOSwotI2RlZmluZSBTX0lTTE5LKG0pICgoKG0pICYgU19JRk1UKSA9PSBTX0lGTE5LKQotI2VuZGlmCi0KLSNpZm5kZWYgSU5BRERSX05PTkUKLSNkZWZpbmUgSU5BRERSX05PTkUgKCh1bnNpZ25lZCBsb25nKSAtMSkKLSNlbmRpZgotCi0jaWYgMAotLyogVGhpcyBzdHVmZiB0YWtlbiBjYXJlIG9mIGluIEFQUiBYWFhYWCAqLwotLyoKLSAqIFJlcGxhY2Ugc2lnbmFsIGZ1bmN0aW9uIHdpdGggc2lnYWN0aW9uIGVxdWl2YWxlbnQKLSAqLwotI2lmbmRlZiBOT19VU0VfU0lHQUNUSU9OCi10eXBlZGVmIHZvaWQgU2lnZnVuYyhpbnQpOwotCi0jaWYgZGVmaW5lZChTSUdfSUdOKSAmJiAhZGVmaW5lZChTSUdfRVJSKQotI2RlZmluZSBTSUdfRVJSICgoU2lnZnVuYyAqKS0xKQotI2VuZGlmCi0KLS8qCi0gKiBGb3Igc29tZSBzdHJhbmdlIHJlYXNvbiwgUU5YIGRlZmluZXMgc2lnbmFsIHRvIHNpZ25hbC4gRWxpbWluYXRlIGl0LgotICovCi0jaWZkZWYgc2lnbmFsCi0jdW5kZWYgc2lnbmFsCi0jZW5kaWYKLSNkZWZpbmUgc2lnbmFsKHMsZikJYXBfc2lnbmFsKHMsZikKLVNpZ2Z1bmMgKnNpZ25hbChpbnQgc2lnbm8sIFNpZ2Z1bmMgKiBmdW5jKTsKLSNlbmRpZgotI2VuZGlmCi0jaW5jbHVkZSA8c2V0am1wLmg+Ci0KLSNpZiBkZWZpbmVkKFVTRV9MT05HSk1QKQotI2RlZmluZSBhcF9sb25nam1wKHgsIHkpICAgICAgICBsb25nam1wKCh4KSwgKHkpKQotI2RlZmluZSBhcF9zZXRqbXAoeCkgICAgICAgICAgICBzZXRqbXAoeCkKLSNpZm5kZWYgSk1QX0JVRgotI2RlZmluZSBKTVBfQlVGIGptcF9idWYKLSNlbmRpZgotI2Vsc2UKLSNkZWZpbmUgYXBfbG9uZ2ptcCh4LCB5KSAgICAgICAgc2lnbG9uZ2ptcCgoeCksICh5KSkKLSNkZWZpbmUgYXBfc2V0am1wKHgpICAgICAgICAgICAgc2lnc2V0am1wKCh4KSwgMSkKLSNpZm5kZWYgSk1QX0JVRgotI2RlZmluZSBKTVBfQlVGIHNpZ2ptcF9idWYKLSNlbmRpZgotI2VuZGlmCi0KLS8qIE1ham9yaXR5IG9mIG9zJ3Mgd2FudCB0byB2ZXJpZnkgRkRfU0VUU0laRSAqLwotI2lmICFkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChUUEYpCi0jZGVmaW5lIENIRUNLX0ZEX1NFVFNJWkUKLSNlbmRpZgotCi0jaWZkZWYgVVNFX1RQRl9TRUxFQ1QKLSNkZWZpbmUgYXBfc2VsZWN0KF9hLCBfYiwgX2MsIF9kLCBfZSkJXAotCXRwZl9zZWxlY3QoX2EsIF9iLCBfYywgX2QsIF9lKQotI2VsaWYgZGVmaW5lZChTRUxFQ1RfTkVFRFNfQ0FTVCkKLSNkZWZpbmUgYXBfc2VsZWN0KF9hLCBfYiwgX2MsIF9kLCBfZSkgICBcCi0gICAgc2VsZWN0KChfYSksIChpbnQgKikoX2IpLCAoaW50ICopKF9jKSwgKGludCAqKShfZCksIChfZSkpCi0jZWxpZiBkZWZpbmVkKE9TMikKLWludCBhcF9zZWxlY3QoaW50IG5mZHMsIGZkX3NldCAqcmVhZGZkcywgZmRfc2V0ICp3cml0ZWZkcywgZmRfc2V0ICpleGNlcHRmZHMsIHN0cnVjdCB0aW1ldmFsICp0aW1lb3V0KTsKLSNlbHNlCi0jZGVmaW5lIGFwX3NlbGVjdChfYSwgX2IsIF9jLCBfZCwgX2UpICAgXAotCXNlbGVjdChfYSwgX2IsIF9jLCBfZCwgX2UpCi0jZW5kaWYKLQotI2lmZGVmIE5FRURfU0lHTkFMX0lOVEVSUlVQVAotI2RlZmluZSBhcF9jaGVja19zaWduYWxzKCkJdHBmX3Byb2Nlc3Nfc2lnbmFscygpCi0jZWxzZQotI2RlZmluZSBhcF9jaGVja19zaWduYWxzKCkKLSNlbmRpZgotCi0jaWZkZWYgVUxUUklYX0JSQUlOX0RFQVRICi0jZGVmaW5lIGFwX2Zkb3BlbihkLG0pIGZkb3BlbigoZCksIChjaGFyICopKG0pKQotI2Vsc2UKLSNkZWZpbmUgYXBfZmRvcGVuKGQsbSkgZmRvcGVuKChkKSwgKG0pKQotI2VuZGlmCi0KLSNpZm5kZWYgYXBfaW5ldF9hZGRyCi0jZGVmaW5lIGFwX2luZXRfYWRkciBpbmV0X2FkZHIKLSNlbmRpZgotCi0jaWZuZGVmIEhBU19PVEhFUl9DSElMRAotI2RlZmluZSBOT19SRUxJQUJMRV9QSVBFRF9MT0dTCi0jZW5kaWYKLQotLyogV2hlbiB0aGUgdW5kZXJseWluZyBPUyBkb2Vzbid0IHN1cHBvcnQgZXhlYygpIG9mIHNjcmlwdHMgd2hpY2ggc3RhcnQKLSAqIHdpdGggYSBIQVNIQkFORyAoIyEpIGZvbGxvd2VkIGJ5IGludGVycHJldGVyIG5hbWUgYW5kIGFyZ3MsIGRlZmluZSB0aGlzLgotICovCi0jaWZkZWYgTkVFRF9IQVNIQkFOR19FTVVMCi1leHRlcm4gaW50IGFwX2V4ZWNsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqYXJnLC4uLik7Ci1leHRlcm4gaW50IGFwX2V4ZWN2ZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqYXJndltdLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW52cFtdKTsKLS8qIGFwX2V4ZWNsZSgpIGlzIGEgd3JhcHBlciBmdW5jdGlvbiBhcm91bmQgYXBfZXhlY3ZlKCkuICovCi0jZGVmaW5lIGV4ZWNsZSAgYXBfZXhlY2xlCi0jZGVmaW5lIGV4ZWN2ZShwYXRoLGFyZ3YsZW52cCkgIGFwX2V4ZWN2ZShwYXRoLGFyZ3YsZW52cCkKLSNlbmRpZgotCi0vKiBGaW5kaW5nIG9mZnNldHMgb2YgZWxlbWVudHMgd2l0aGluIHN0cnVjdHVyZXMuCi0gKiBUYWtlbiBmcm9tIHRoZSBYIGNvZGUuLi4gdGhleSd2ZSBzd2VhdGVkIHBvcnRhYmlsaXR5IG9mIHRoaXMgc3R1ZmYKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8uICBTaWdoLi4uCi0gKi8KLQotI2lmIGRlZmluZWQoQ1JBWSkgfHwgKGRlZmluZWQoX19hcm0pICYmICFkZWZpbmVkKExJTlVYKSkKLSNpZmRlZiBfX1NURENfXwotI2RlZmluZSBYdE9mZnNldChwX3R5cGUsZmllbGQpIF9PZmZzZXRvZihwX3R5cGUsZmllbGQpCi0jZWxzZQotI2lmZGVmIENSQVkyCi0jZGVmaW5lIFh0T2Zmc2V0KHBfdHlwZSxmaWVsZCkgXAotCShzaXplb2YoaW50KSooKHVuc2lnbmVkIGludCkmKCgocF90eXBlKU5VTEwpLT5maWVsZCkpKQotCi0jZWxzZSAvKiAhQ1JBWTIgKi8KLQotI2RlZmluZSBYdE9mZnNldChwX3R5cGUsZmllbGQpICgodW5zaWduZWQgaW50KSYoKChwX3R5cGUpTlVMTCktPmZpZWxkKSkKLQotI2VuZGlmIC8qICFDUkFZMiAqLwotI2VuZGlmIC8qIF9fU1REQ19fICovCi0jZWxzZSAvKiAhIChDUkFZIHx8IF9fYXJtKSAqLwotCi0jZGVmaW5lIFh0T2Zmc2V0KHBfdHlwZSxmaWVsZCkgXAotCSgobG9uZykgKCgoY2hhciAqKSAoJigoKHBfdHlwZSlOVUxMKS0+ZmllbGQpKSkgLSAoKGNoYXIgKikgTlVMTCkpKQotCi0jZW5kaWYgLyogIUNSQVkgKi8KLQotI2lmZGVmIG9mZnNldG9mCi0jZGVmaW5lIFh0T2Zmc2V0T2Yoc190eXBlLGZpZWxkKSBvZmZzZXRvZihzX3R5cGUsZmllbGQpCi0jZWxzZQotI2RlZmluZSBYdE9mZnNldE9mKHNfdHlwZSxmaWVsZCkgWHRPZmZzZXQoc190eXBlKixmaWVsZCkKLSNlbmRpZgotCi0vKgotICogTkVUX1NJWkVfVCBleGlzdHMgYmVjYXVzZSBvZiBzaG9ydHNpZ2h0ZWRuZXNzIG9uIHRoZSBQT1NJWCBjb21taXR0ZWUuICBCU0QKLSAqIHN5c3RlbXMgdXNlZCAiaW50ICoiIGFzIHRoZSBwYXJhbWV0ZXIgdG8gYWNjZXB0KCksIGdldHNvY2tuYW1lKCksCi0gKiBnZXRwZWVybmFtZSgpIGV0IGFsLiAgQ29uc2VxdWVudGx5IG1hbnkgdW5peGVzIHRvb2sgYW4gaW50ICogZm9yIHRoYXQKLSAqIHBhcmFtZXRlci4gIFRoZSBQT1NJWCBjb21taXR0ZWUgZGVjaWRlZCB0aGF0ICJpbnQiIHdhcyBqdXN0IHRvbyBnZW5lcmljIGFuZAotICogaGFkIHRvIGJlIHJlcGxhY2VkIHdpdGggc2l6ZV90IGFsbW9zdCBldmVyeXdoZXJlLiAgVGhlcmUncyBubyBwcm9ibGVtIHdpdGgKLSAqIHRoYXQgd2hlbiB5b3UncmUgcGFzc2luZyBieSB2YWx1ZS4gIEJ1dCB3aGVuIHlvdSdyZSBwYXNzaW5nIGJ5IHJlZmVyZW5jZQotICogdGhpcyBjcmVhdGVzIGEgZ3Jvc3Mgc291cmNlIGluY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIHByb2dyYW1zLiAgT24KLSAqIDMyLWJpdCBhcmNoaXRlY3R1cmVzIGl0IGNyZWF0ZXMgb25seSBhIHdhcm5pbmcuICBPbiA2NC1iaXQgYXJjaGl0ZWN0dXJlcyBpdAotICogY3JlYXRlcyBicm9rZW4gY29kZSAtLSBiZWNhdXNlICJpbnQgKiIgaXMgYSBwb2ludGVyIHRvIGEgNjQtYml0IHF1YW50aXR5IGFuZAotICogInNpemVfdCAqIiBpcyBmcmVxdWVudGx5IGEgcG9pbnRlciB0byBhIDMyLWJpdCBxdWFudGl0eS4KLSAqCi0gKiBTb21lIFVuaXhlcyBhZG9wdGVkICJzaXplX3QgKiIgZm9yIHRoZSBzYWtlIG9mIFBPU0lYIGNvbXBsaWFuY2UuICBPdGhlcnMKLSAqIGlnbm9yZWQgaXQgYmVjYXVzZSBpdCB3YXMgc3VjaCBhIGJyb2tlbiBpbnRlcmZhY2UuICBDaGFvcyBlbnN1ZWQuICBQT1NJWAotICogZmluYWxseSB3b2tlIHVwIGFuZCBkZWNpZGVkIHRoYXQgaXQgd2FzIHdyb25nIGFuZCBjcmVhdGVkIGEgbmV3IHR5cGUKLSAqIHNvY2tsZW5fdC4gIFRoZSBvbmx5IHVzZWZ1bCB2YWx1ZSBmb3Igc29ja2xlbl90IGlzIGludCwgYW5kIHRoYXQncyBob3cKLSAqIGV2ZXJ5b25lIHdobyBoYXMgYSBjbHVlIGltcGxlbWVudHMgaXQuICBJdCBpcyBhbG1vc3QgYWx3YXlzIHRoZSBjYXNlIHRoYXQKLSAqIE5FVF9TSVpFX1Qgc2hvdWxkIGJlIGRlZmluZWQgdG8gYmUgYW4gaW50LCB1bmxlc3MgdGhlIHN5c3RlbSBiZWluZyBjb21waWxlZAotICogZm9yIHdhcyBjcmVhdGVkIGluIHRoZSB3aW5kb3cgb2YgUE9TSVggbWFkbmVzcy4KLSAqLwotI2lmbmRlZiBORVRfU0laRV9UCi0jZGVmaW5lIE5FVF9TSVpFX1QgaW50Ci0jZW5kaWYKLQotLyogTGludXggZGVmaW5lcyBfX1dDT1JFRFVNUCwgYnV0IGRvZXNuJ3QgZGVmaW5lIFdDT1JFRFVNUCB1bmxlc3MgX19VU0VfQlNECi0gKiBpcyBpbiB1c2UuLi4gd2UnZCBwcmVmZXIgdG8ganVzdCB1c2UgV0NPUkVEVU1QIGV2ZXJ5d2hlcmUuCi0gKi8KLSNpZiBkZWZpbmVkKF9fV0NPUkVEVU1QKSAmJiAhZGVmaW5lZChXQ09SRURVTVApCi0jZGVmaW5lIFdDT1JFRFVNUCBfX1dDT1JFRFVNUAotI2VuZGlmCi0KLSNpZmRlZiBTVU5PU19MSUJfUFJPVE9UWVBFUwotLyogUHJvdG90eXBlcyBuZWVkZWQgdG8gZ2V0IGEgY2xlYW4gY29tcGlsZSB3aXRoIGdjYyAtV2FsbC4KLSAqIEJlbGlldmUgaXQgb3Igbm90LCB0aGVzZSBkbyBoYXZlIHRvIGJlIGRlY2xhcmVkLCBhdCBsZWFzdCBvbiBTdW5PUywKLSAqIGJlY2F1c2UgdGhleSBhcmVuJ3QgbWVudGlvbmVkIGluIHRoZSByZWxldmFudCBzeXN0ZW0gaGVhZGVycy4KLSAqIFN1biBRdWFsaXR5IFNvZnR3YXJlLiAgR290dGEgbG92ZSBpdC4gIFRoaXMgc2VjdGlvbiBpcyBub3QgCi0gKiBjdXJyZW50bHkgKDEzTm92OTcpIHVzZWQuCi0gKi8KLQotaW50IGdldG9wdChpbnQsIGNoYXIgKiosIGNoYXIgKik7Ci0KLWludCBzdHJjYXNlY21wKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLWludCBzdHJuY2FzZWNtcChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKLWludCB0b3VwcGVyKGludCk7Ci1pbnQgdG9sb3dlcihpbnQpOwotCi1pbnQgcHJpbnRmKGNoYXIgKiwuLi4pOwotaW50IGZwcmludGYoRklMRSAqLCBjaGFyICosLi4uKTsKLWludCBmcHV0cyhjaGFyICosIEZJTEUgKik7Ci1pbnQgZnJlYWQoY2hhciAqLCBpbnQsIGludCwgRklMRSAqKTsKLWludCBmd3JpdGUoY2hhciAqLCBpbnQsIGludCwgRklMRSAqKTsKLWludCBmZ2V0YyhGSUxFICopOwotY2hhciAqZmdldHMoY2hhciAqcywgaW50LCBGSUxFKik7Ci1pbnQgZmZsdXNoKEZJTEUgKik7Ci1pbnQgZmNsb3NlKEZJTEUgKik7Ci1pbnQgdW5nZXRjKGludCwgRklMRSAqKTsKLWludCBfZmlsYnVmKEZJTEUgKik7CS8qICEhISAqLwotaW50IF9mbHNidWYodW5zaWduZWQgY2hhciwgRklMRSAqKTsJLyogISEhICovCi1pbnQgc3NjYW5mKGNoYXIgKiwgY2hhciAqLC4uLik7Ci12b2lkIHNldGJ1ZihGSUxFICosIGNoYXIgKik7Ci12b2lkIHBlcnJvcihjaGFyICopOwotCi10aW1lX3QgdGltZSh0aW1lX3QgKik7Ci1pbnQgc3RyZnRpbWUoY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgc3RydWN0IHRtICopOwotCi1pbnQgaW5pdGdyb3VwcyhjaGFyICosIGludCk7Ci1pbnQgd2FpdDMoaW50ICosIGludCwgdm9pZCAqKTsJLyogQ2xvc2UgZW5vdWdoIGZvciB1cy4uLiAqLwotaW50IGxzdGF0KGNvbnN0IGNoYXIgKiwgc3RydWN0IHN0YXQgKik7Ci1pbnQgc3RhdChjb25zdCBjaGFyICosIHN0cnVjdCBzdGF0ICopOwotaW50IGZsb2NrKGludCwgaW50KTsKLSNpZm5kZWYgTk9fS0lMTFBHCi1pbnQga2lsbHBnKGludCwgaW50KTsKLSNlbmRpZgotaW50IHNvY2tldChpbnQsIGludCwgaW50KTsKLWludCBzZXRzb2Nrb3B0KGludCwgaW50LCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50KTsKLWludCBsaXN0ZW4oaW50LCBpbnQpOwotaW50IGJpbmQoaW50LCBzdHJ1Y3Qgc29ja2FkZHIgKiwgaW50KTsKLWludCBjb25uZWN0KGludCwgc3RydWN0IHNvY2thZGRyICosIGludCk7Ci1pbnQgYWNjZXB0KGludCwgc3RydWN0IHNvY2thZGRyICosIGludCAqKTsKLWludCBzaHV0ZG93bihpbnQsIGludCk7Ci0KLWludCBnZXRzb2NrbmFtZShpbnQgcywgc3RydWN0IHNvY2thZGRyICpuYW1lLCBpbnQgKm5hbWVsZW4pOwotaW50IGdldHBlZXJuYW1lKGludCBzLCBzdHJ1Y3Qgc29ja2FkZHIgKm5hbWUsIGludCAqbmFtZWxlbik7Ci1pbnQgZ2V0aG9zdG5hbWUoY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pOwotdm9pZCBzeXNsb2coaW50LCBjaGFyICosLi4uKTsKLWNoYXIgKm1rdGVtcChjaGFyICopOwotCi1sb25nIHZmcHJpbnRmKEZJTEUgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKLQotI2VuZGlmIC8qIFNVTk9TX0xJQl9QUk9UT1RZUEVTICovCi0KLS8qCi0gKiBUcmFuc2l0aW9uIG1hY3JvcyBmcm9tIG9sZC1zdHlsZSBjb25maWd1cmF0aW9uIHRvIGF1dG9jb25mCi0gKi8KLSNpZm5kZWYgSEFWRV9DT05GSUdfSAotCi0jaWYgIWRlZmluZWQoTk9fS0lMTFBHKSAmJiAhZGVmaW5lZChIQVZFX0tJTExQRykKLSNkZWZpbmUgSEFWRV9LSUxMUEcKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoTkVFRF9TVFJEVVApICYmICFkZWZpbmVkKEhBVkVfU1RSRFVQKQotI2RlZmluZSBIQVZFX1NUUkRVUAotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChORUVEX1NUUkNBU0VDTVApICYmICFkZWZpbmVkKEhBVkVfU1RSQ0FTRUNNUCkKLSNkZWZpbmUgSEFWRV9TVFJDQVNFQ01QCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKE5FRURfU1RSTkNBU0VDTVApICYmICFkZWZpbmVkKEhBVkVfU1RSTkNBU0VDTVApCi0jZGVmaW5lIEhBVkVfU1RSTkNBU0VDTVAKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoTkVFRF9TVFJTVFIpICYmICFkZWZpbmVkKEhBVkVfU1RSU1RSKQotI2RlZmluZSBIQVZFX1NUUlNUUgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChORUVEX0lOSVRHUk9VUFMpICYmICFkZWZpbmVkKEhBVkVfSU5JVEdST1VQUykKLSNkZWZpbmUgSEFWRV9JTklUR1JPVVBTCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKE5FRURfV0FJVFBJRCkgJiYgIWRlZmluZWQoSEFWRV9XQUlUUElEKQotI2RlZmluZSBIQVZFX1dBSVRQSUQKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoTkVFRF9TVFJFUlJPUikgJiYgIWRlZmluZWQoSEFWRV9TVFJFUlJPUikKLSNkZWZpbmUgSEFWRV9TVFJFUlJPUgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChORUVEX0RJRkZUSU1FKSAmJiAhZGVmaW5lZChIQVZFX0RJRkZUSU1FKQotI2RlZmluZSBIQVZFX0RJRkZUSU1FCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKE5FRURfR0VUVElNRU9GREFZKSAmJiAhZGVmaW5lZChIQVZFX0dFVFRJTUVPRkRBWSkKLSNkZWZpbmUgSEFWRV9HRVRUSU1FT0ZEQVkKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoTkVFRF9TRVRTSUQpICYmICFkZWZpbmVkKEhBVkVfU0VUU0lEKQotI2RlZmluZSBIQVZFX1NFVFNJRAotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChOT19USU1FUykgJiYgIWRlZmluZWQoSEFWRV9USU1FUykKLSNkZWZpbmUgSEFWRV9USU1FUwotI2RlZmluZSBIQVZFX1NZU19USU1FU19ICi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKE5PX1JFTElBQkxFX1BJUEVEX0xPR1MpCi0jZGVmaW5lIEhBVkVfUkVMSUFCTEVfUElQRURfTE9HUwotI2VuZGlmCi0KLSNlbmRpZiAvKiBIQVZFX0NPTkZJR19IICovCi0KLS8qIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgd2hlbiB0aGUgZnVuY3Rpb25zIGFyZSBtaXNzaW5nLAotICogdGhlbiB0aGVyZSdzIG5vIG1hdGNoaW5nIHByb3RvdHlwZSBhdmFpbGFibGUgZWl0aGVyLgotICogRGVjbGFyZSB3aGF0IGlzIG5lZWRlZCBleGFjdGx5IGFzIHRoZSByZXBsYWNlbWVudCByb3V0aW5lcyBpbXBsZW1lbnQgaXQuCi0gKi8KLSNpZm5kZWYgSEFWRV9TVFJEVVAKLWV4dGVybiBjaGFyICpzdHJkdXAgKGNvbnN0IGNoYXIgKnN0cik7Ci0jZW5kaWYKLSNpZm5kZWYgSEFWRV9TVFJDQVNFQ01QCi1leHRlcm4gaW50IHN0cmNhc2VjbXAgKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIpOwotI2VuZGlmCi0jaWZuZGVmIEhBVkVfU1RSTkNBU0VDTVAKLWV4dGVybiBpbnQgc3RybmNhc2VjbXAgKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIsIGludCBuKTsKLSNlbmRpZgotI2lmbmRlZiBIQVZFX0lOSVRHUk9VUFMKLWV4dGVybiBpbnQgaW5pdGdyb3Vwcyhjb25zdCBjaGFyICpuYW1lLCBnaWRfdCBiYXNlZ2lkKTsKLSNlbmRpZgotI2lmbmRlZiBIQVZFX1dBSVRQSUQKLWV4dGVybiBpbnQgd2FpdHBpZChwaWRfdCBwaWQsIGludCAqc3RhdHVzcCwgaW50IG9wdGlvbnMpOwotI2VuZGlmCi0jaWZuZGVmIEhBVkVfU1RSRVJST1IKLWV4dGVybiBjaGFyICpzdHJlcnJvciAoaW50IGVycik7Ci0jZW5kaWYKLSNpZm5kZWYgSEFWRV9ESUZGVElNRQotZXh0ZXJuIGRvdWJsZSBkaWZmdGltZSh0aW1lX3QgdGltZTEsIHRpbWVfdCB0aW1lMCk7Ci0jZW5kaWYKLQotI2lmbmRlZiBhcF93YWl0X3QKLSNkZWZpbmUgYXBfd2FpdF90IGludAotI2VuZGlmCi0KLS8qCi0gKiBTcGVjaWFsIFN1cHBvcnQgZm9yIFVzZXItU3BhY2UgVGhyZWFkaW5nIEVudmlyb25tZW50cyBbcnNlLCAxMi1BdWctMTk5OV0KLSAqLwotCi0vKiBvcHRpb25hbGx5IG1ha2Ugc3VyZSB0aGUgUHRocmVhZCBlbnZpcm9ubWVudCBpcyBhdmFpbGFibGUgaW4gX0VWRVJZXyBzb3VyY2UgCi0gICBieSBpbmNsdWRpbmcgdGhlIFB0aHJlYWQgaGVhZGVyIGFscmVhZHkgaW4gdGhpcyBoZWFkZXIgZmlsZS4gVGhpcyBpcwotICAgaW1wb3J0YW50IGZvciBwb3J0YWJsZSB1c2VyLXNwYWNlIHRocmVhZGluZyBlbnZpcm9ubWVudHMgd2hpY2ggY2FuIG9ubHkgdXNlCi0gICBzb2Z0IHN5c2NhbGwgd3JhcHBpbmcgKGkuZS4gYGAjZGVmaW5lIHJlYWQgX3B0aHJlYWRfcmVhZCcnLCBldGMuKSAqLwotI2lmZGVmIFBUSFJFQURfRVZFUllXSEVSRQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNlbmRpZgotCi0vKiBzdXBwb3J0IGZvciBmb3JjaW5nIG5vIHNlcmlhbGl6ZWQgYWNjZXB0IHNpdHVhdGlvbi4gVGhpcyBoYXMgdG8gYmUKLSAgIHVzZWQgYnkgdXNlci1zcGFjZSB0aHJlYWRpbmcgZW52aXJvbm1lbnRzLCBiZWNhdXNlIG1vc3RseSBhbGwgKGV4Y2VwdCBmb3IKLSAgIFVTRV9QVEhSRUFEX1NFUklBTElaRURfQUNDRVBULCBidXQgdGhpcyBvbmx5IHdvcmtzIG9uIGEgZmV3IHBsYXRmb3JtcykKLSAgIHZhcmlhbnRzIG9mIHRoZSBpbnRlci1wcm9jZXNzIGFjY2VwdCBsb2NrIHdvdWxkIHN1c3BlbmQgdGhlIHdob2xlIHByb2Nlc3MKLSAgIGFuZCBub3QganVzdCB0aGUgYWNjZXB0b3IgdGhyZWFkLiAqLwotI2lmZGVmIE5PX1NFUklBTElaRURfQUNDRVBUCi0jdW5kZWYgVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUCi0jdW5kZWYgVVNFX0ZMT0NLX1NFUklBTElaRURfQUNDRVBUCi0jdW5kZWYgVVNFX1VTTE9DS19TRVJJQUxJWkVEX0FDQ0VQVAotI3VuZGVmIFVTRV9TWVNWU0VNX1NFUklBTElaRURfQUNDRVBUCi0jdW5kZWYgVVNFX1BUSFJFQURfU0VSSUFMSVpFRF9BQ0NFUFQKLSNlbmRpZgotI2VuZGlmIC8qIEhBVkVfQ09ORklHX0ggKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFBUF9DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hcF9saXN0ZW4uaCBiL2luY2x1ZGUvYXBfbGlzdGVuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNTY1ZTkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hcF9saXN0ZW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotI2lmbmRlZiBBUF9MSVNURU5fSAotI2RlZmluZSBBUF9MSVNURU5fSAotCi0jaW5jbHVkZSAiYXByX25ldHdvcmtfaW8uaCIKLQotdHlwZWRlZiBzdHJ1Y3QgYXBfbGlzdGVuX3JlYyBhcF9saXN0ZW5fcmVjOwotc3RydWN0IGFwX2xpc3Rlbl9yZWMgewotICAgIGFwX2xpc3Rlbl9yZWMgKm5leHQ7Ci0gICAgYXBfc29ja2V0X3QgKnNkOwotICAgIGludCBhY3RpdmU7Ci0jaWZkZWYgV0lOMzIKLSAgICBpbnQgY291bnQ7Ci0jZW5kaWYKLS8qIG1vcmUgc3R1ZmYgaGVyZSwgbGlrZSB3aGljaCBwcm90b2NvbCBpcyBib3VuZCB0byB0aGUgcG9ydCAqLwotfTsKLQotZXh0ZXJuIGFwX2xpc3Rlbl9yZWMgKmFwX2xpc3RlbmVyczsKLQotdm9pZCBhcF9saXN0ZW5fcHJlX2NvbmZpZyh2b2lkKTsKLWludCBhcF9saXN0ZW5fb3Blbihwcm9jZXNzX3JlYyAqcHJvY2VzcywgdW5zaWduZWQgcG9ydCk7Ci1jb25zdCBjaGFyICphcF9zZXRfbGlzdGVuYmFja2xvZyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZyk7Ci1jb25zdCBjaGFyICphcF9zZXRfbGlzdGVuZXIoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICppcHMpOwotY29uc3QgY2hhciAqYXBfc2V0X3NlbmRfYnVmZmVyX3NpemUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpOwotCi0jZGVmaW5lIExJU1RFTl9DT01NQU5EUwlcCi17ICJMaXN0ZW5CYWNrbG9nIiwgYXBfc2V0X2xpc3RlbmJhY2tsb2csIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsIFwKLSAgIk1heGltdW0gbGVuZ3RoIG9mIHRoZSBxdWV1ZSBvZiBwZW5kaW5nIGNvbm5lY3Rpb25zLCBhcyB1c2VkIGJ5IGxpc3RlbigyKSIgfSwgXAoteyAiTGlzdGVuIiwgYXBfc2V0X2xpc3RlbmVyLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLCBcCi0gICJBIHBvcnQgbnVtYmVyIG9yIGEgbnVtZXJpYyBJUCBhZGRyZXNzIGFuZCBhIHBvcnQgbnVtYmVyIn0sIFwKLXsgIlNlbmRCdWZmZXJTaXplIiwgYXBfc2V0X3NlbmRfYnVmZmVyX3NpemUsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsIFwKLSAgIlNlbmQgYnVmZmVyIHNpemUgaW4gYnl0ZXMifSwKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FwX21tbi5oIGIvaW5jbHVkZS9hcF9tbW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYzMTM4My4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FwX21tbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotI2lmbmRlZiBBUEFDSEVfQVBfTU1OX0gKLSNkZWZpbmUgQVBBQ0hFX0FQX01NTl9ICi0KLS8qCi0gKiBNT0RVTEVfTUFHSUNfTlVNQkVSX01BSk9SCi0gKiBNYWpvciBBUEkgY2hhbmdlcyB0aGF0IGNvdWxkIGNhdXNlIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgZm9yIG9sZGVyIG1vZHVsZXMKLSAqIHN1Y2ggYXMgc3RydWN0dXJlIHNpemUgY2hhbmdlcy4gIE5vIGJpbmFyeSBjb21wYXRpYmlsaXR5IGlzIHBvc3NpYmxlIGFjcm9zcwotICogYSBjaGFuZ2UgaW4gdGhlIG1ham9yIHZlcnNpb24uCi0gKgotICogTU9EVUxFX01BR0lDX05VTUJFUl9NSU5PUgotICogTWlub3IgQVBJIGNoYW5nZXMgdGhhdCBkbyBub3QgY2F1c2UgYmluYXJ5IGNvbXBhdGliaWxpdHkgcHJvYmxlbXMuCi0gKiBTaG91bGQgYmUgcmVzZXQgdG8gMCB3aGVuIHVwZ3JhZGluZyBNT0RVTEVfTUFHSUNfTlVNQkVSX01BSk9SLgotICoKLSAqIFNlZSB0aGUgTU9EVUxFX01BR0lDX0FUX0xFQVNUIG1hY3JvIGJlbG93IGZvciBhbiBleGFtcGxlLgotICovCi0KLS8qCi0gKiAxOTk1MDUyNQkJLSBvcmlnaW5hbCB2YWx1ZQotICogMTk5NjA1MTIgKDEuMWIyKQktIHVwZGF0ZWQsIDEuMSwgdmVyc2lvbi4KLSAqIDE5OTYwNTI2ICgxLjFiMykJLSBnZXRfdG9rZW4oKSwgdGFibGVfdW5zZXQoKSwgcHN0cm5kdXAoKQotICoJCQkgIGZ1bmN0aW9ucyBhZGRlZAotICogMTk5NjA3MjUgKDEuMi1kZXYpCS0gSFRUUC8xLjEgY29tcGxpYW5jZQotICoJCQkgIChuZXcgdmVyc2lvbiBvZiByZWFkX2NsaWVudF9ibG9jaykKLSAqIDE5OTYwODA2ICgxLjItZGV2KQktIHNjYW5fc2NyaXB0X2hlYWRlcl9lcnIoKSBhZGRlZAotICogMTk5NjEwMDcgKDEuMi1kZXYpCS0gcmVwbGFjZSByZWFkX2NsaWVudF9ibG9jaygpIHdpdGggZ2V0X2NsaWVudF9ibG9jaygpCi0gKiAxOTk2MTEyNSAoMS4yYjEpCS0gY2hhbmdlIHNldHVwX2NsaWVudF9ibG9jaygpIHRvIFJveSdzIHZlcnNpb24KLSAqIDE5OTYxMjExICgxLjJiMykJLSByd3JpdGUoKSBhZGRlZAotICogMTk5NzAxMDMgKDEuMmI1LWRldikJLSBoZWFkZXIgcGFyc2UgQVBJCi0gKiAxOTk3MDQyNyAoMS4yYjktZGV2KQktIHBvcnQgcmVmZXJlbmNlcyBtYWRlIHVuc2lnbmVkCi0gKiAxOTk3MDUyNiAoMS4yKQktIGNvcnJlY3Qgdmhvc3Qgd2FsayBmb3IgbXVsdGlwbGUgcmVxdWVzdHMgb24gYSBzaW5nbGUKLSAqCQkJICBjb25uZWN0Ci0gKiAxOTk3MDYyMyAoMS4zLWRldikJLSBOVCBjaGFuZ2VzCi0gKiAxOTk3MDYyOCAoMS4zLWRldikJLSBhcF9zbGFjayAoZmQgZml4ZXMpIGFkZGVkCi0gKiAxOTk3MDcxNyAoMS4zLWRldikJLSBjaGlsZF9pbml0IEFQSSBob29rIGFkZGVkCi0gKiAxOTk3MDcxOSAoMS4zLWRldikJLSBkaXNjYXJkX3JlcXVlc3RfYm9keSgpIGFkZGVkICh0byBjbGVhciB0aGUgZGVja3MKLSAqCQkJICBhcyBuZWVkZWQpCi0gKiAxOTk3MDcyOCAoMS4zYTItZGV2KQktIGNoaWxkX2V4aXQgQVBJIGhvb2sgYWRkZWQKLSAqIDE5OTcwODE4ICgxLjNhMi1kZXYpCS0gcG9zdCByZWFkLXJlcXVlc3QgcGhhc2UgYWRkZWQKLSAqIDE5OTcwODI1ICgxLjNhMi1kZXYpCS0gci0+bXRpbWUgY2VsbCBhZGRlZAotICogMTk5NzA4MzEgKDEuM2EyLWRldikJLSBlcnJvciBsb2dnaW5nIGNoYW5nZWQgdG8gdXNlIGFwbG9nX2Vycm9yKCkKLSAqIDE5OTcwOTAyICgxLjNhMi1kZXYpCS0gTUQ1IHJvdXRpbmVzIGFuZCBzdHJ1Y3R1cmVzIHJlbmFtZWQgdG8gYXBfKgotICogMTk5NzA5MTIgKDEuM2IxLWRldikJLSBzZXRfbGFzdF9tb2RpZmllZCBzcGxpdCBpbnRvIHNldF9sYXN0X21vZGlmaWVkLAotICogCQkJICBzZXRfZXRhZyBhbmQgbWVldHNfY29uZGl0aW9ucwotICoJCQkgIHJlZ2lzdGVyX290aGVyX2NoaWxkIEFQSQotICoJCQkgIHBpcGVkX2xvZyBBUEkKLSAqCQkJICBzaG9ydF9zY29yZSBzcGxpdCBpbnRvIHBhcmVudCBhbmQgY2hpbGQgcGllY2VzCi0gKgkJCSAgb3NfaXNfYWJzb2x1dGVfcGF0aAotICogMTk5NzEwMjYgKDEuM2IzLWRldikJLSBjdXN0b20gY29uZmlnIGhvb2tzIGluIHBsYWNlCi0gKiAxOTk4MDEyNiAoMS4zYjQtZGV2KQktIGFwX2NweXN0cm4oKSwgdGFibGVfYWRkbigpLCB0YWJsZV9zZXRuKCksCi0gKgkJCSAgdGFibGVfbWVyZ2VuKCkKLSAqIDE5OTgwMjAxICgxLjNiNC1kZXYpCS0gY29uc3RydWN0X3VybCgpCi0gKgkJCSAgcHJvdG90eXBlIHNlcnZlcl9yZWMgKiAtPiByZXF1ZXN0X3JlYyAqCi0gKgkJCSAgYWRkIGdldF9zZXJ2ZXJfbmFtZSgpIGFuZCBnZXRfc2VydmVyX3BvcnQoKQotICogMTk5ODAyMDcgKDEuM2I0LWRldikJLSBhZGQgZHluYW1pY19sb2FkX2hhbmRsZSB0byBtb2R1bGUgc3RydWN0dXJlIGFzIHBhcnQKLSAqCQkJICBvZiB0aGUgU1RBTkRBUkRfTU9EVUxFX1NUVUZGIGhlYWRlcgotICogMTk5ODAzMDQgKDEuM2I2LWRldikJLSBhYnN0cmFjdGlvbiBvZiBTRVJWRVJfQlVJTFQgYW5kIFNFUlZFUl9WRVJTSU9OCi0gKiAxOTk4MDMwNSAoMS4zYjYtZGV2KQktIGFwX2NvbmZpZy5oIGFkZGVkIGZvciB1c2UgYnkgZXh0ZXJuYWwgbW9kdWxlcwotICogMTk5ODAzMTIgKDEuM2I2LWRldikJLSBwYXJzZV91cmlfY29tcG9uZW50cygpIGFuZCBpdHMgaWxrCi0gKgkJCSAgcmVtb3ZlIHItPmhvc3RsZW4sIGFkZCByLT51bnBhcnNlZF91cmkKLSAqCQkJICBzZXRfc3RyaW5nX3Nsb3RfbG93ZXIoKQotICoJCQkgIGNsYXJpZmljYXRpb246IG5vbi1SQVdfQVJHUyBjbWQgaGFuZGxlcnMgZG8gbm90Ci0gKgkJCSAgbmVlZCB0byBwc3RyZHVwKCkgdGhlaXIgYXJndW1lbnRzCi0gKgkJCSAgY2xhcmlmaWNhdGlvbjogcmVxdWVzdF9yZWMgbWVtYmVycyBjb250ZW50X3R5cGUsCi0gKgkJCSAgaGFuZGxlciwgY29udGVudF9lbmNvZGluZywgY29udGVudF9sYW5ndWFnZSwKLSAqCQkJICBjb250ZW50X2xhbmd1YWdlcyBNVVNUIGFsbCBiZSBsb3dlcmNhc2Ugc3RyaW5ncywKLSAqCQkJICBhbmQgTUFZIE5PVCBiZSBtb2RpZmllZCBpbiBwbGFjZSAtLSBtb2RpZmljYXRpb25zCi0gKgkJCSAgcmVxdWlyZSBwc3RyZHVwKCkuCi0gKiAxOTk4MDMxNyAoMS4zYjYtZGV2KQktIENPUkVfRVhQT1JUcyBmb3Igd2luMzIgYW5kIDxQZXJsPgotICoJCQkgIEFQSSBleHBvcnQgYmFzaWNfaHR0cF9oZWFkZXIsIHNlbmRfaGVhZGVyX2ZpZWxkLAotICoJCQkgIHNldF9rZWVwYWxpdmUsIHNybV9jb21tYW5kX2xvb3AsIGNoZWNrX2NtZF9jb250ZXh0LAotICoJCQkgIHRtMnNlYwotICoJCQkgIHNwYWNldG9wbHVzKCksIHBsdXN0b3NwYWNlKCksIGNsaWVudF90b19zdGRvdXQoKQotICoJCQkgIHJlbW92ZWQKLSAqIDE5OTgwMzI0ICgxLjNiNi1kZXYpCS0gQVBJX0VYUE9SVChpbmRleF9vZl9yZXNwb25zZSkKLSAqIDE5OTgwNDEzICgxLjNiNi1kZXYpCS0gVGhlIEJJRyBTWU1CT0wgUkVOQU1JTkc6IGdlbmVyYWwgYXBfIHByZWZpeAotICoJCQkgIChzZWUgc3JjL2luY2x1ZGUvY29tcGF0LmggZm9yIG1vcmUgZGV0YWlscykKLSAqCQkJICBhcF92Zm9ybWF0dGVyKCkgQVBJLCBzZWUgc3JjL2luY2x1ZGUvYXAuaAotICogMTk5ODA1MDcgKDEuM2I3LWRldikJLSBhZGRpdGlvbiBvZiBhcF9hZGRfdmVyc2lvbl9jb21wb25lbnQoKSBhbmQKLSAqCQkJICBkaXNjb250aW51YXRpb24gb2YgLURTRVJWRVJfU1VCVkVSU0lPTiBzdXBwb3J0Ci0gKiAxOTk4MDUxOSAoMS4zYjctZGV2KQktIGFkZCBjaGlsZF9pbmZvICogdG8gc3Bhd24gZnVuY3Rpb24gKGFzIHBhc3NlZCB0bwotICoJCQkgIGFwX3NwYXduX2NoaWxkX2Vycl9idWZmKSBhbmQgdG8gYXBfY2FsbF9leGVjIHRvIG1ha2UKLSAqCQkJICBjaGlsZHJlbiB3b3JrIGNvcnJlY3RseSBvbiBXaW4zMi4KLSAqIDE5OTgwNTI3ICgxLjNiOC1kZXYpCS0gcmVuYW1lZCBzb21lIG1vcmUgZnVuY3Rpb25zIHRvIGFwXyBwcmVmaXggd2hpY2ggd2VyZQotICoJCQkgIG1pc3NlZCBhdCB0aGUgYmlnIHJlbmFtaW5nICh0aGV5IGFyZSBkZWZpbmVzKToKLSAqCQkJICBpc19kZWZhdWx0X3BvcnQsIGRlZmF1bHRfcG9ydCBhbmQgaHR0cF9tZXRob2QuCi0gKgkJCSAgQSBuZXcgY29tbXVuaWNhdGlvbiBtZXRob2QgZm9yIG1vZHVsZXMgd2FzIGFkZGVkOgotICoJCQkgIHRoZXkgY2FuIGNyZWF0ZSBjdXN0b21pemVkIGVycm9yIG1lc3NhZ2VzIHVuZGVyIHRoZQotICoJCQkgICJlcnJvci1ub3RlcyIga2V5IGluIHRoZSByZXF1ZXN0X3JlYy0+bm90ZXMgdGFibGUuCi0gKgkJCSAgVGhpcyBzdHJpbmcgd2lsbCBiZSBwcmludGVkIGluIHBsYWNlIG9mIHRoZSBjYW5uZWQKLSAqCQkJICBlcnJvciByZXNwb25zZXMsIGFuZCB3aWxsIGJlIHByb3BhZ2F0ZWQgdG8KLSAqCQkJICBFcnJvckRvY3VtZW50cyBvciBjZ2kgc2NyaXB0cyBpbiB0aGUKLSAqCQkJICAoUkVESVJFQ1RfKUVSUk9SX05PVEVTIHZhcmlhYmxlLgotICogMTk5ODA2MjcgKDEuMy4xLWRldikJLSBNb3JlIHJlbmFtaW5nIHRoYXQgd2UgZm9yZ290L2J5cGFzc2VkLiBJbiBwYXJ0aWN1bGFyOgotICoJCQkgIHRhYmxlX2VsdHMgLS0+IGFwX3RhYmxlX2VsdHMKLSAqCQkJICBpc190YWJsZV9lbXB0eSAtLT4gYXBfaXNfdGFibGVfZW1wdHkKLSAqIDE5OTgwNzA4ICgxLjMuMS1kZXYpCS0gYXBfaXNhbG51bSgpLCBhcF9pc2FscGhhKCksIC4uLiAiOC1iaXQgc2FmZSIgY3R5cGUKLSAqCQkJICBtYWNyb3MgYW5kIGFwY3R5cGUuaCBhZGRlZAotICogMTk5ODA3MTMgKDEuMy4xLWRldikJLSByZW5hbWluZyBvZiBDIGhlYWRlciBmaWxlczoKLSAqCQkJICAxLiBjb25mLmggICAgICAtPiBhcF9jb25maWcuaAotICoJCQkgIDIuIGNvbmZfYXV0by5oIC0+IGFwX2NvbmZpZ19hdXRvLmggLSBub3cgbWVyZ2VkCi0gKgkJCSAgMy4gYXBfY29uZmlnLmggLT4gYXBfY29uZmlnX2F1dG8uaCAtIG5vdyBtZXJnZWQKLSAqCQkJICA0LiBjb21wYXQuaCAgICAtPiBhcF9jb21wYXQuaAotICoJCQkgIDUuIGFwY3R5cGUuaCAgIC0+IGFwX2N0eXBlLmgKLSAqIDE5OTgwODA2ICgxLjMuMi1kZXYpIC0gYWRkIGFwX2xvZ19yZXJyb3IoKQotICogICAgICAgICAgICAgICAgICAgICAgLSBhZGQgYXBfc2Nhbl9zY3JpcHRfaGVhZGVyX2Vycl9jb3JlKCkKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gYWRkIGFwX3V1ZW5jb2RlKCkKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gYWRkIGFwX2N1c3RvbV9yZXNwb25zZSgpCi0gKiAxOTk4MDgxMSAoMS4zLjItZGV2KQktIGFkZGVkIGxpbWl0X3JlcV9saW5lLCBsaW1pdF9yZXFfZmllbGRzaXplLCBhbmQKLSAqCQkJICBsaW1pdF9yZXFfZmllbGRzIHRvIHNlcnZlcl9yZWMuCi0gKgkJCSAgYWRkZWQgbGltaXRfcmVxX2JvZHkgdG8gY29yZV9kaXJfY29uZmlnIGFuZAotICoJCQkgIGFwX2dldF9saW1pdF9yZXFfYm9keSgpIHRvIGdldCBpdHMgdmFsdWUuCi0gKiAxOTk4MDgxMiAoMS4zLjItZGV2KQktIHNwbGl0IG9mZiBNT0RVTEVfTUFHSUNfTlVNQkVSCi0gKiAxOTk4MDgxMi4yICAgICAgICAgICAtIGFkZCBhcF9vdmVybGFwX3RhYmxlcygpCi0gKiAxOTk4MDgxNiAoMS4zLjItZGV2KQktIGNoYW5nZSBwcm94eSB0byB1c2UgdGFibGVzIGZvciBoZWFkZXJzLCBjaGFuZ2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNhY2hlX3JlcSB0byB0eXBlZGVmIGNhY2hlX3JlcS4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlIGFwX3Byb3h5X2dldF9oZWFkZXIoKSwgYXBfcHJveHlfYWRkX2hlYWRlcigpLAotICogICAgICAgICAgICAgICAgICAgICAgICBhcF9wcm94eV9kZWxfaGVhZGVyKCkuIENoYW5nZSBpbnRlcmZhY2Ugb2YgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFwX3Byb3h5X3NlbmRfZmIoKSBhbmQgYXBfcHJveHlfY2FjaGVfZXJyb3IoKS4gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBhcF9wcm94eV9zZW5kX2hkcl9saW5lKCkgYW5kIGFwX3Byb3h5X2JwdXRzMigpLgotICogMTk5ODA4MjUgKDEuMy4yLWRldikgLSByZW5hbWVkIGlzX0hUVFBfeHh4KCkgbWFjcm9zIHRvIGFwX2lzX0hUVFBfeHh4KCkKLSAqIDE5OTgwODI1LjEgICAgICAgICAgIC0gbW9kX3Byb3h5IG9ubHkgKG1pbm9yIGNoYW5nZSk6IG1vZGlmaWVkIGludGVyZmFjZSBvZgotICogICAgICAgICAgICAgICAgICAgICAgICBhcF9wcm94eV9yZWFkX2hlYWRlcnMoKSBhbmQgcmRjYWNoZSgpIHRvIHVzZSBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfcmVjKiBpbnN0ZWFkIG9mIHBvb2wqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIChmb3IgaW1wbGVtZW50aW5nIGJldHRlciBlcnJvciByZXBvcnRpbmcpLgotICogMTk5ODA5MDYgKDEuMy4yLWRldikgLSBhZGRlZCBhcF9tZDVfYmluYXJ5KCkKLSAqIDE5OTgwOTE3ICgxLjMuMi1kZXYpIC0gYnMyMDAwOiBjaGFuZ2VkIG9zX3NldF9hdXRoZmlsZSgpIHRvIG9zX3NldF9hY2NvdW50KCkKLSAqIDE5OTgxMTA4ICgxLjMuNC1kZXYpIC0gYWRkZWQgYXBfbWV0aG9kX251bWJlcl9vZigpCi0gKiAgICAgICAgICAgICAgICAgICAgICAtIGNoYW5nZWQgdmFsdWUgb2YgTV9JTlZBTElEIGFuZCBhZGRlZCBXZWJEQVYgbWV0aG9kcwotICogMTk5ODExMDguMSAgICAgICAgICAgLSBhcF9leGlzdHNfY29uZmlnX2RlZmluZSgpIGlzIG5vdyBwdWJsaWMgKG1pbm9yIGJ1bXApCi0gKiAxOTk4MTIwNCAgICAgICAgICAgICAtIHNjb3JlYm9hcmQgY2hhbmdlcyAtLSBhZGRlZCBnZW5lcmF0aW9uLCBjaGFuZ2VkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRfZ2VuZXJhdGlvbiB0byBydW5uaW5nX2dlbmVyYXRpb24uICBTb21ld2hlcmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgZWFybGllciB2aG9zdHJlYyB3YXMgYWRkZWQsIGJ1dCBpdCdzIG9ubHkgc2FmZSB0byB1c2UKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXMgb2YgdGhpcyByZXYuICBTZWUgc2NvcmVib2FyZC5oIGZvciBkb2N1bWVudGF0aW9uLgotICogMTk5ODEyMTEgICAgICAgICAgICAgLSBEU08gY2hhbmdlcyAtLSBhZGRlZCBhcF9zaW5nbGVfbW9kdWxlX2NvbmZpZ3VyZSgpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGFkZGVkIGFwX3NpbmdsZV9tb2R1bGVfaW5pdCgpCi0gKiAxOTk4MTIyOSAgICAgICAgICAgICAtIG1vZF9uZWdvdGlhdGlvbiBvdmVyaGF1bCAtLSBhZGRlZCBhcF9tYWtlX2V0YWcoKQotICogICAgICAgICAgICAgICAgICAgICAgICBhbmQgYWRkZWQgdmxpc3RfdmFsaWRhdG9yIHRvIHJlcXVlc3RfcmVjLgotICogMTk5OTAxMDEgICAgICAgICAgICAgLSByZW5hbWVkIG1hY3JvIGVzY2FwZV91cmkoKSB0byBhcF9lc2NhcGVfdXJpKCkKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gYWRkZWQgTU9EVUxFX01BR0lDX0NPT0tJRSB0byBpZGVudGlmeSBtb2R1bGUgc3RydWN0cwotICogMTk5OTAxMDMgKDEuMy40LWRldikgLSBhZGRlZCBhcF9hcnJheV9wc3RyY2F0KCkKLSAqIDE5OTkwMTA1ICgxLjMuNC1kZXYpIC0gYWRkZWQgYXBfb3NfaXNfZmlsZW5hbWVfdmFsaWQoKQotICogMTk5OTAxMDYgKDEuMy40LWRldikgLSBNb3ZlIE1PRFVMRV9NQUdJQ19DT09LSUUgdG8gdGhlIGVuZCBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGIG1hY3JvIHNvIHRoZSB2ZXJzaW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcnMgYW5kIGZpbGUgbmFtZSByZW1haW4gYXQgaW52YXJpYW50IG9mZnNldHMKLSAqIDE5OTkwMTA4ICgxLjMuNC1kZXYpIC0gc3RhdHVzX2Ryb3BzX2Nvbm5lY3Rpb24gLT4gYXBfc3RhdHVzX2Ryb3BzX2Nvbm5lY3Rpb24KLSAqICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbl9zY3JpcHRfaGVhZGVyIC0+IGFwX3NjYW5fc2NyaXB0X2hlYWRlcl9lcnIKLSAqICAgICAgICAgICAgICAgICAgICAgIC0gcmVvcmRlcmVkIGVudHJpZXMgaW4gcmVxdWVzdF9yZWMgdGhhdCB3ZXJlIHdhaXRpbmcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGEgbm9uLWJpbmFyeS1jb21wYXRpYmxlIHJlbGVhc2UuCi0gKiAgICAgICAgICAoMS4zLjUtZGV2KQotICogMTk5OTAxMDguMSAgICAgICAgICAgLSBhZGQgYXBfTUQ1RW5jb2RlKCkgZm9yIE1ENSBwYXNzd29yZCBoYW5kbGluZy4KLSAqIDE5OTkwMTA4LjIgICAgICAgICAgIC0gYWRkIGFwX3ZhbGlkYXRlX3Bhc3N3b3JkKCkgYW5kIGNoYW5nZSBhcF9NRDVFbmNvZGUoKQotICogICAgICAgICAgICAgICAgICAgICAgICB0byB1c2UgYSBzdHJvbmdlciBhbGdvcml0aG0uCi0gKiAxOTk5MDEwOC40ICAgICAgICAgICAtIGFkZCBhcF9zaXplX2xpc3RfaXRlbSgpLCBhcF9nZXRfbGlzdF9pdGVtKCksIGFuZAotICogICAgICAgICAgICAgICAgICAgICAgICBhcF9maW5kX2xpc3RfaXRlbSgpCi0gKiAxOTk5MDEwOC41ICAgICAgICAgICAtIGFkZGVkIGFwX3N1Yl9yZXFfbWV0aG9kX3VyaSgpIGFuZCBhZGRlZCBjb25zdCB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiBvZiBtZXRob2QgaW4gcmVxdWVzdF9yZWMuCi0gKiAxOTk5MDEwOC42ICAgICAgICAgICAtIFNJR1BJUEUgaXMgbm93IGlnbm9yZWQgYnkgdGhlIGNvcmUgc2VydmVyLgotICogMTk5OTAxMDguNyAgICAgICAgICAgLSBhcF9pc3hkaWdpdCBhZGRlZAotICogMTk5OTAzMjAgICAgICAgICAgICAgLSBNRVRIT0RTIGFuZCBNX0lOVkFMSUQgc3ltYm9sIHZhbHVlcyBtb2RpZmllZAotICogMTk5OTAzMjAuMSAgICAgICAgICAgLSBhZGQgYXBfdnJwcmludGYoKQotICogMTk5OTAzMjAuMiAgICAgICAgICAgLSBhZGQgY21kX3Bhcm1zLmNvbnRleHQsIGFwX3NldF9jb25maWdfdmVjdG9ycywgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydCBhcF9hZGRfZmlsZV9jb25mCi0gKiAxOTk5MDMyMC4zICAgICAgICAgICAtIGFkZCBhcF9yZWdleGVjKCkgYW5kIGFwX3JlZ2Vycm9yKCkKLSAqIDE5OTkwMzIwLjQgICAgICAgICAgIC0gYWRkIGFwX2ZpZWxkX25vcGFyYW0oKQotICogMTk5OTAzMjAuNSAgICAgICAgICAgLSBhZGQgbG9jYWxfaXAvaG9zdCB0byBjb25uX3JlYyBmb3IgbWFzcy12aG9zdAotICogMTk5OTAzMjAuNiAgICAgICAgICAgLSBhZGQgYXBfU0hBMUZpbmFsKCksIGFwX1NIQTFJbml0KCksCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFwX1NIQTFVcGRhdGVfYmluYXJ5KCksIGFwX1NIQTFVcGRhdGUoKSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXBfYmFzZTY0ZW5jb2RlKCksIGFwX2Jhc2U2NGVuY29kZV9iaW5hcnkoKSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXBfYmFzZTY0ZW5jb2RlX2xlbigpLCBhcF9iYXNlNjRkZWNvZGUoKSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgYXBfYmFzZTY0ZGVjb2RlX2JpbmFyeSgpLCBhcF9iYXNlNjRkZWNvZGVfbGVuKCksCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFwX3BiYXNlNjRkZWNvZGUoKSwgYXBfcGJhc2U2NGVuY29kZSgpCi0gKi8KLQotI2RlZmluZSBNT0RVTEVfTUFHSUNfQ09PS0lFIDB4NDE1MDMxMzNVTCAvKiAiQVAxMyIgKi8KLQotI2lmbmRlZiBNT0RVTEVfTUFHSUNfTlVNQkVSX01BSk9SCi0jZGVmaW5lIE1PRFVMRV9NQUdJQ19OVU1CRVJfTUFKT1IgMTk5OTAzMjAKLSNlbmRpZgotI2RlZmluZSBNT0RVTEVfTUFHSUNfTlVNQkVSX01JTk9SIDYgICAgICAgICAgICAgICAgICAgICAvKiAwLi4ubiAqLwotI2RlZmluZSBNT0RVTEVfTUFHSUNfTlVNQkVSIE1PRFVMRV9NQUdJQ19OVU1CRVJfTUFKT1IJLyogYmFja3dhcmQgY29tcGF0ICovCi0KLS8qIFVzZWZ1bCBmb3IgdGVzdGluZyBmb3IgZmVhdHVyZXMuICovCi0jZGVmaW5lIE1PRFVMRV9NQUdJQ19BVF9MRUFTVChtYWpvcixtaW5vcikJCVwKLSAgICAoKG1ham9yKSA+IE1PRFVMRV9NQUdJQ19OVU1CRVJfTUFKT1IgCQlcCi0JfHwgKChtYWpvcikgPT0gTU9EVUxFX01BR0lDX05VTUJFUl9NQUpPUiAJXAotCSAgICAmJiAobWlub3IpID49IE1PRFVMRV9NQUdJQ19OVU1CRVJfTUlOT1IpKQotCi0vKiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3Ugd2lzaCB0byB1c2UgdGhlIGFwX292ZXJsYXBfdGFibGVzCi0gICBmdW5jdGlvbi4gIFlvdSBjYW4gZG8gdGhpczoKLQotI2lmIE1PRFVMRV9NQUdJQ19BVF9MRUFTVCgxOTk4MDgxMiwyKQotICAgIC4uLiB1c2UgYXBfb3ZlcmxhcF90YWJsZXMoKQotI2Vsc2UKLSAgICAuLi4gYWx0ZXJuYXRpdmUgY29kZSB3aGljaCBkb2Vzbid0IHVzZSBhcF9vdmVybGFwX3RhYmxlcygpCi0jZW5kaWYKLQotKi8KLQotI2VuZGlmIC8qICFBUEFDSEVfQVBfTU1OX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXBfbXBtLmggYi9pbmNsdWRlL2FwX21wbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWZjNGIyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXBfbXBtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaWZuZGVmIEFQX01NTl9ICi0jZGVmaW5lIEFQX01NTl9ICi0KLS8qCi0gICAgVGhlIE1QTSwgIm11bHRpLXByb2Nlc3NpbmcgbW9kZWwiIHByb3ZpZGVzIGFuIGFic3RyYWN0aW9uIG9mIHRoZQotICAgIGludGVyZmFjZSB3aXRoIHRoZSBPUyBmb3IgZGlzdHJpYnV0aW5nIGluY29taW5nIGNvbm5lY3Rpb25zIHRvCi0gICAgdGhyZWFkcy9wcm9jZXNzIGZvciBwcm9jZXNzaW5nLiAgaHR0cF9tYWluIGludm9rZXMgdGhlIE1QTSwgYW5kCi0gICAgdGhlIE1QTSBydW5zIHVudGlsIGEgc2h1dGRvd24vcmVzdGFydCBoYXMgYmVlbiBpbmRpY2F0ZWQuCi0gICAgVGhlIE1QTSBjYWxscyBvdXQgdG8gdGhlIGFwYWNoZSBjb3JlIHZpYSB0aGUgYXBfcHJvY2Vzc19jb25uZWN0aW9uCi0gICAgZnVuY3Rpb24gd2hlbiBhIGNvbm5lY3Rpb24gYXJyaXZlcy4KLQotICAgIFRoZSBNUE0gbWF5IG9yIG1heSBub3QgYmUgbXVsdGl0aHJlYWRlZC4gIEluIHRoZSBldmVudCB0aGF0IGl0IGlzCi0gICAgbXVsdGl0aHJlYWRlZCwgYXQgYW55IGluc3RhbnQgaXQgZ3VhcmFudGVlcyBhIDE6MSBtYXBwaW5nIG9mIHRocmVhZHMKLSAgICBhcF9wcm9jZXNzX2Nvbm5lY3Rpb24gaW52b2NhdGlvbnMuICAKLQotICAgIE5vdGU6IEluIHRoZSBmdXR1cmUgaXQgd2lsbCBiZSBwb3NzaWJsZSBmb3IgYXBfcHJvY2Vzc19jb25uZWN0aW9uCi0gICAgdG8gcmV0dXJuIHRvIHRoZSBNUE0gcHJpb3IgdG8gZmluaXNoaW5nIHRoZSBlbnRpcmUgY29ubmVjdGlvbjsgYW5kCi0gICAgdGhlIE1QTSB3aWxsIHByb2NlZWQgd2l0aCBhc3luY2hyb25vdXMgaGFuZGxpbmcgZm9yIHRoZSBjb25uZWN0aW9uOwotICAgIGluIHRoZSBmdXR1cmUgdGhlIE1QTSBtYXkgY2FsbCBhcF9wcm9jZXNzX2Nvbm5lY3Rpb24gYWdhaW4gLS0gYnV0Ci0gICAgZG9lcyBub3QgZ3VhcmFudGVlIGl0IHdpbGwgb2NjdXIgb24gdGhlIHNhbWUgdGhyZWFkIGFzIHRoZSBmaXJzdCBjYWxsLgotCi0gICAgVGhlIE1QTSBmdXJ0aGVyIGd1YXJhbnRlZXMgdGhhdCBubyBhc3luY2hyb25vdXMgYmVoYXZpb3VyIHN1Y2ggYXMKLSAgICBsb25nam1wcyBhbmQgc2lnbmFscyB3aWxsIGludGVyZmVyZSB3aXRoIHRoZSB1c2VyIGNvZGUgdGhhdCBpcwotICAgIGludm9rZWQgdGhyb3VnaCBhcF9wcm9jZXNzX2Nvbm5lY3Rpb24uICBUaGUgTVBNIG1heSByZXNlcnZlIHNvbWUKLSAgICBzaWduYWxzIGZvciBpdHMgdXNlIChpLmUuIFNJR1VTUjEpLCBidXQgZ3VhcmFudGVlcyB0aGF0IHRoZXNlIHNpZ25hbHMKLSAgICBhcmUgaWdub3JlZCB3aGVuIGV4ZWN1dGluZyBvdXRzaWRlIHRoZSBNUE0gY29kZSBpdHNlbGYuICAoVGhpcwotICAgIGFsbG93cyBicm9rZW4gdXNlciBjb2RlIHRoYXQgZG9lcyBub3QgaGFuZGxlIEVJTlRSIHRvIGZ1bmN0aW9uCi0gICAgcHJvcGVybHkuKQotCi0gICAgVGhlIHN1Z2dlc3RlZCBzZXJ2ZXIgcmVzdGFydCBhbmQgc3RvcCBiZWhhdmlvdXIgd2lsbCBiZSAiZ3JhY2VmdWwiLgotICAgIEhvd2V2ZXIgdGhlIE1QTSBtYXkgY2hvb3NlIHRvIHRlcm1pbmF0ZSBwcm9jZXNzZXMgd2hlbiB0aGUgdXNlcgotICAgIHJlcXVlc3RzIGEgbm9uLWdyYWNlZnVsIHJlc3RhcnQvc3RvcC4gIFdoZW4gdGhpcyBvY2N1cnMsIHRoZSBNUE0ga2lsbHMKLSAgICBhbGwgdGhyZWFkcyB3aXRoIGV4dHJlbWUgcHJlanVkaWNlLCBhbmQgZGVzdHJveXMgdGhlIHBjaGlsZCBwb29sLgotICAgIFVzZXIgY2xlYW51cHMgcmVnaXN0ZXJlZCBpbiB0aGUgcGNoaWxkIGFwX2NvbnRleHRfdCB3aWxsIGJlIGludm9rZWQgYXQKLSAgICB0aGlzIHBvaW50LiAgKFRoaXMgY2FuIHBvc2Ugc29tZSBjb21wbGljYXRpb25zLCB0aGUgdXNlciBjbGVhbnVwcwotICAgIGFyZSBhc3luY2hyb25vdXMgYmVoYXZpb3VyIG5vdCB1bmxpa2UgbG9uZ2ptcC9zaWduYWwuLi4gYnV0IGlmIHRoZQotICAgIGFkbWluIGlzIGFza2luZyBmb3IgYSBub24tZ3JhY2VmdWwgc2h1dGRvd24sIGhvdyBtdWNoIGVmZm9ydCBzaG91bGQKLSAgICB3ZSBwdXQgaW50byBkb2luZyBpdCBpbiBhIG5pY2Ugd2F5PykKLQotICAgIHVuaXgvcG9zaXggbm90ZXM6Ci0gICAgLSBUaGUgTVBNIGRvZXMgbm90IHNldCBhIFNJR0FMUk0gaGFuZGxlciwgdXNlciBjb2RlIG1heSB1c2UgU0lHQUxSTS4KLQlCdXQgdGhlIHByZWZlcnJlZCBtZXRob2Qgb2YgaGFuZGxpbmcgdGltZW91dHMgaXMgdG8gdXNlIHRoZQotCXRpbWVvdXRzIHByb3ZpZGVkIGJ5IHRoZSBCVUZGL2lvbCBhYnN0cmFjdGlvbi4KLSAgICAtIFRoZSBwcm9wZXIgc2V0dGluZyBmb3IgU0lHUElQRSBpcyBTSUdfSUdOLCBpZiB1c2VyIGNvZGUgY2hhbmdlcyBpdAotICAgICAgICBmb3IgYW55IG9mIHRoZWlyIG93biBwcm9jZXNzaW5nLCBpdCBtdXN0IGJlIHJlc3RvcmVkIHRvIFNJR19JR04KLQlwcmlvciB0byBleGVjdXRpbmcgb3IgcmV0dXJuaW5nIHRvIGFueSBhcGFjaGUgY29kZS4KLSAgICBUT0RPOiBhZGQgU0lHUElQRSBkZWJ1Z2dpbmcgY2hlY2sgc29tZXdoZXJlIHRvIG1ha2Ugc3VyZSBpdHMgU0lHX0lHTgotKi8KLQotLyogcnVuIHVudGlsIGEgcmVzdGFydC9zaHV0ZG93biBpcyBpbmRpY2F0ZWQsIHJldHVybiAxIGZvciBzaHV0ZG93bgotICAgMCBvdGhlcndpc2UgKi8KLUFQSV9FWFBPUlQoaW50KSBhcF9tcG1fcnVuKGFwX2NvbnRleHRfdCAqcGNvbmYsIGFwX2NvbnRleHRfdCAqcGxvZywgc2VydmVyX3JlYyAqc2VydmVyX2NvbmYpOwotCi0vKiBwcmVkaWNhdGUgaW5kaWNhdGluZyBpZiBhIGdyYWNlZnVsIHN0b3AgaGFzIGJlZW4gcmVxdWVzdGVkIC4uLgotICAgdXNlZCBieSB0aGUgY29ubmVjdGlvbiBsb29wICovCi1BUElfRVhQT1JUKGludCkgYXBfZ3JhY2VmdWxfc3RvcF9zaWduYWxsZWQodm9pZCk7Ci0KLS8qCi0gKiBhcF9zdGFydF9zaHV0ZG93bigpIGFuZCBhcF9zdGFydF9yZXN0YXJ0KCkgYXJlIGZ1bmN0aW9ucyB0byBpbml0aWF0ZSAKLSAqIHNodXRkb3duIG9yIHJlc3RhcnQgd2l0aG91dCByZWx5aW5nIG9uIHNpZ25hbHMuIAotICoKLSAqIFRoZXNlIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBwYXJlbnQgcHJvY2VzcyBpdHNlbGYsIHNpbmNlIHRoZQotICogcGFyZW50IHByb2Nlc3Mgd2lsbCB1c2UgdGhlIHNodXRkb3duX3BlbmRpbmcgYW5kIHJlc3RhcnRfcGVuZGluZyB2YXJpYWJsZXMKLSAqIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNodXRkb3duIG9yIHJlc3RhcnQuIFRoZSBjaGlsZCBwcm9jZXNzIHNob3VsZAotICogY2FsbCBzaWduYWxfcGFyZW50KCkgZGlyZWN0bHkgdG8gdGVsbCB0aGUgcGFyZW50IHRvIGRpZSAtLSB0aGlzIHdpbGwKLSAqIGNhdXNlIG5laXRoZXIgb2YgdGhvc2UgdmFyaWFibGUgdG8gYmUgc2V0LCB3aGljaCB0aGUgcGFyZW50IHdpbGwKLSAqIGFzc3VtZSBtZWFucyBzb21ldGhpbmcgc2VyaW91cyBpcyB3cm9uZyAod2hpY2ggaXQgd2lsbCBiZSwgZm9yIHRoZQotICogY2hpbGQgdG8gZm9yY2UgYW4gZXhpdCkgYW5kIHNvIGRvIGFuIGV4aXQgYW55d2F5LgotICovCi0KLXZvaWQgYXBfc3RhcnRfc2h1dGRvd24odm9pZCk7Ci12b2lkIGFwX3N0YXJ0X3Jlc3RhcnQoaW50IGdyYWNlZnVsKTsKLQotLyogCi0gKiBhcF9zaWduYWxfcGFyZW50KCkgLSB1c2VkIHRvIHNlbmQgYSBzaWduYWwgdG8gdGhlIHBhcmVudCBwcm9jZXNzLgotICovCi12b2lkIGFwX3NpZ25hbF9wYXJlbnQoYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyKiBzaWduYWwsIGNvbnN0IGNoYXIqIHNlcnZlcl9yb290KTsKLQotI2lmZGVmIEhBU19PVEhFUl9DSElMRAotLyoKLSAqIHJlZ2lzdGVyIGFuIG90aGVyX2NoaWxkIC0tIGEgY2hpbGQgd2hpY2ggdGhlIG1haW4gbG9vcCBrZWVwcyB0cmFjayBvZgotICogYW5kIGtub3dzIGl0IGlzIGRpZmZlcmVudCB0aGFuIHRoZSByZXN0IG9mIHRoZSBzY29yZWJvYXJkLgotICoKLSAqIHBpZCBpcyB0aGUgcGlkIG9mIHRoZSBjaGlsZC4KLSAqCi0gKiBtYWludGVuYW5jZSBpcyBhIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCB3aXRoIGEgcmVhc29uLCB0aGUgZGF0YQotICogcG9pbnRlciBwYXNzZWQgaGVyZSwgYW5kIHdoZW4gYXBwcm9wcmlhdGUgYSBzdGF0dXMgcmVzdWx0IGZyb20gd2FpdHBpZCgpLgotICoKLSAqIHdyaXRlX2ZkIGlzIGFuIGZkIHRoYXQgaXMgcHJvYmVkIGZvciB3cml0aW5nIGJ5IHNlbGVjdCgpIGlmIGl0IGlzIGV2ZXIKLSAqIHVud3JpdGFibGUsIHRoZW4gbWFpbnRlbmFuY2UgaXMgaW52b2tlZCB3aXRoIHJlYXNvbiBPQ19SRUFTT05fVU5XUklUQUJMRS4KLSAqIFRoaXMgaXMgdXNlZnVsIGZvciBsb2cgcGlwZSBjaGlsZHJlbiwgdG8ga25vdyB3aGVuIHRoZXkndmUgYmxvY2tlZC4gIFRvCi0gKiBkaXNhYmxlIHRoaXMgZmVhdHVyZSwgdXNlIC0xIGZvciB3cml0ZV9mZC4KLSAqLwotQVBJX0VYUE9SVCh2b2lkKSBhcF9yZWdpc3Rlcl9vdGhlcl9jaGlsZChpbnQgcGlkLAotICAgICAgIHZvaWQgKCptYWludGVuYW5jZSkgKGludCByZWFzb24sIHZvaWQgKmRhdGEsIGFwX3dhaXRfdCBzdGF0dXMpLCB2b2lkICpkYXRhLAotCQkJCSAgICAgIGludCB3cml0ZV9mZCk7Ci0jZGVmaW5lIE9DX1JFQVNPTl9ERUFUSAkJMAkvKiBjaGlsZCBoYXMgZGllZCwgY2FsbGVyIG11c3QgY2FsbAotCQkJCQkgKiB1bnJlZ2lzdGVyIHN0aWxsICovCi0jZGVmaW5lIE9DX1JFQVNPTl9VTldSSVRBQkxFCTEJLyogd3JpdGVfZmQgaXMgdW53cml0YWJsZSAqLwotI2RlZmluZSBPQ19SRUFTT05fUkVTVEFSVAkyCS8qIGEgcmVzdGFydCBpcyBvY2N1cmluZywgcGVyZm9ybQotCQkJCQkgKiBhbnkgbmVjZXNzYXJ5IGNsZWFudXAgKGluY2x1ZGluZwotCQkJCQkgKiBzZW5kaW5nIGEgc3BlY2lhbCBzaWduYWwgdG8gY2hpbGQpCi0JCQkJCSAqLwotI2RlZmluZSBPQ19SRUFTT05fVU5SRUdJU1RFUgkzCS8qIHVucmVnaXN0ZXIgaGFzIGJlZW4gY2FsbGVkLCBkbwotCQkJCQkgKiB3aGF0ZXZlciBpcyBuZWNlc3NhcnkgKGluY2x1ZGluZwotCQkJCQkgKiBraWxsIHRoZSBjaGlsZCkgKi8KLSNkZWZpbmUgT0NfUkVBU09OX0xPU1QJCTQJLyogc29tZWhvdyB0aGUgY2hpbGQgZXhpdGVkIHdpdGhvdXQKLQkJCQkJICogdXMga25vd2luZyAuLi4gYnVnZ3kgb3M/ICovCi0KLS8qCi0gKiB1bnJlZ2lzdGVyIGFuIG90aGVyX2NoaWxkLiAgTm90ZSB0aGF0IHRoZSBkYXRhIHBvaW50ZXIgaXMgdXNlZCBoZXJlLCBhbmQKLSAqIGlzIGFzc3VtZWQgdG8gYmUgdW5pcXVlIHBlciBvdGhlcl9jaGlsZC4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgcGlkIGFuZAotICogd3JpdGVfZmQgYXJlIHBvc3NpYmx5IGtpbGxlZCBvZmYgc2VwYXJhdGVseS4KLSAqLwotQVBJX0VYUE9SVCh2b2lkKSBhcF91bnJlZ2lzdGVyX290aGVyX2NoaWxkKHZvaWQgKmRhdGEpOwotCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2h0dHBfY29uZl9nbG9iYWxzLmggYi9pbmNsdWRlL2h0dHBfY29uZl9nbG9iYWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZTlmYzQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9odHRwX2NvbmZfZ2xvYmFscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaWZuZGVmIEFQQUNIRV9IVFRQX0NPTkZfR0xPQkFMU19ICi0jZGVmaW5lIEFQQUNIRV9IVFRQX0NPTkZfR0xPQkFMU19ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogVE9ETzogdGhpcyBmaWxlIHNob3VsZCBiZSBkZWxldGVkIGFmdGVyIHRoZSBvdGhlciB0b2RvcyBhcmUgZGVhbHQgd2l0aCAqLwotCi0vKiBUT0RPOiBleHRlcm4gZW51bSBzZXJ2ZXJfdG9rZW5fdHlwZSBhcF9zZXJ2ZXJfdG9rZW5zOyAqLwotCi0vKiBUT0RPOiBleHRlcm4gaW50IGFwX2NvbmZpZ3Rlc3Rvbmx5OyAgLi4uIGFsdGhvdWdoIGl0IHBhaW5zIG1lIGJlY2F1c2UgdGhpcyBicmVha3MgYW4gYWJzdHJhY3Rpb24gKi8KLS8qIFRPRE86IGV4dGVybiBpbnQgYXBfZG9jcm9vdGNoZWNrOyAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYJLyogIUFQQUNIRV9IVFRQX0NPTkZfR0xPQkFMU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2h0dHBfY29uZmlnLmggYi9pbmNsdWRlL2h0dHBfY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMzE3NjMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9odHRwX2NvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotI2lmbmRlZiBBUEFDSEVfSFRUUF9DT05GSUdfSAotI2RlZmluZSBBUEFDSEVfSFRUUF9DT05GSUdfSAotCi0jaW5jbHVkZSAiYXBfaG9va3MuaCIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKgotICogVGhlIGNlbnRyYWwgZGF0YSBzdHJ1Y3R1cmVzIGFyb3VuZCBoZXJlLi4uCi0gKi8KLQotLyogQ29tbWFuZCBkaXNwYXRjaCBzdHJ1Y3R1cmVzLi4uICovCi0KLS8qIE5vdGUgdGhhdCBmb3IgYWxsIG9mIHRoZXNlIGV4Y2VwdCBSQVdfQVJHUywgdGhlIGNvbmZpZyByb3V0aW5lIGlzCi0gKiBwYXNzZWQgYSBmcmVzaGx5IGFsbG9jYXRlZCBzdHJpbmcgd2hpY2ggY2FuIGJlIG1vZGlmaWVkIG9yIHN0b3JlZAotICogb3Igd2hhdGV2ZXIuLi4gaXQncyBvbmx5IG5lY2Vzc2FyeSB0byBkbyBwc3RyZHVwKCkgc3R1ZmYgd2l0aAotICogUkFXX0FSR1MuCi0gKi8KLWVudW0gY21kX2hvdyB7Ci0gICAgUkFXX0FSR1MsCQkJLyogY21kX2Z1bmMgcGFyc2VzIGNvbW1hbmQgbGluZSBpdHNlbGYgKi8KLSAgICBUQUtFMSwJCQkvKiBvbmUgYXJndW1lbnQgb25seSAqLwotICAgIFRBS0UyLAkJCS8qIHR3byBhcmd1bWVudHMgb25seSAqLwotICAgIElURVJBVEUsCQkJLyogb25lIGFyZ3VtZW50LCBvY2N1cmluZyBtdWx0aXBsZSB0aW1lcwotCQkJCSAqIChlLmcuLCBJbmRleElnbm9yZSkKLQkJCQkgKi8KLSAgICBJVEVSQVRFMiwJCQkvKiB0d28gYXJndW1lbnRzLCAybmQgb2NjdXJzIG11bHRpcGxlIHRpbWVzCi0JCQkJICogKGUuZy4sIEFkZEljb24pCi0JCQkJICovCi0gICAgRkxBRywJCQkvKiBPbmUgb2YgJ09uJyBvciAnT2ZmJyAqLwotICAgIE5PX0FSR1MsCQkJLyogTm8gYXJncyBhdCBhbGwsIGUuZy4gPC9EaXJlY3Rvcnk+ICovCi0gICAgVEFLRTEyLAkJCS8qIG9uZSBvciB0d28gYXJndW1lbnRzICovCi0gICAgVEFLRTMsCQkJLyogdGhyZWUgYXJndW1lbnRzIG9ubHkgKi8KLSAgICBUQUtFMjMsCQkJLyogdHdvIG9yIHRocmVlIGFyZ3VtZW50cyAqLwotICAgIFRBS0UxMjMsCQkJLyogb25lLCB0d28gb3IgdGhyZWUgYXJndW1lbnRzICovCi0gICAgVEFLRTEzCQkJLyogb25lIG9yIHRocmVlIGFyZ3VtZW50cyAqLwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgY29tbWFuZF9zdHJ1Y3QgewotICAgIGNvbnN0IGNoYXIgKm5hbWU7CQkvKiBOYW1lIG9mIHRoaXMgY29tbWFuZCAqLwotICAgIGNvbnN0IGNoYXIgKigqZnVuYykgKCk7CS8qIEZ1bmN0aW9uIGludm9rZWQgKi8KLSAgICB2b2lkICpjbWRfZGF0YTsJCS8qIEV4dHJhIGRhdGEsIGZvciBmdW5jdGlvbnMgd2hpY2gKLQkJCQkgKiBpbXBsZW1lbnQgbXVsdGlwbGUgY29tbWFuZHMuLi4KLQkJCQkgKi8KLSAgICBpbnQgcmVxX292ZXJyaWRlOwkJLyogV2hhdCBvdmVycmlkZXMgbmVlZCB0byBiZSBhbGxvd2VkIHRvCi0JCQkJICogZW5hYmxlIHRoaXMgY29tbWFuZC4KLQkJCQkgKi8KLSAgICBlbnVtIGNtZF9ob3cgYXJnc19ob3c7CS8qIFdoYXQgdGhlIGNvbW1hbmQgZXhwZWN0cyBhcyBhcmd1bWVudHMgKi8KLQotICAgIGNvbnN0IGNoYXIgKmVycm1zZzsJCS8qICd1c2FnZScgbWVzc2FnZSwgaW4gY2FzZSBvZiBzeW50YXggZXJyb3JzICovCi19IGNvbW1hbmRfcmVjOwotCi0vKiBUaGUgYWxsb3dlZCBsb2NhdGlvbnMgZm9yIGEgY29uZmlndXJhdGlvbiBkaXJlY3RpdmUgYXJlIHRoZSB1bmlvbiBvZgotICogdGhvc2UgaW5kaWNhdGVkIGJ5IGVhY2ggc2V0IGJpdCBpbiB0aGUgcmVxX292ZXJyaWRlIG1hc2suCi0gKgotICogKHJlcV9vdmVycmlkZSAmIFJTUkNfQ09ORikgICA9PiAqLmNvbmYgb3V0c2lkZSA8RGlyZWN0b3J5PiBvciA8TG9jYXRpb24+Ci0gKiAocmVxX292ZXJyaWRlICYgQUNDRVNTX0NPTkYpID0+ICouY29uZiBpbnNpZGUgPERpcmVjdG9yeT4gb3IgPExvY2F0aW9uPgotICogKHJlcV9vdmVycmlkZSAmIE9SX0FVVEhDRkcpICA9PiAqLmNvbmYgaW5zaWRlIDxEaXJlY3Rvcnk+IG9yIDxMb2NhdGlvbj4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIC5odGFjY2VzcyB3aGVuIEFsbG93T3ZlcnJpZGUgQXV0aENvbmZpZwotICogKHJlcV9vdmVycmlkZSAmIE9SX0xJTUlUKSAgICA9PiAqLmNvbmYgaW5zaWRlIDxEaXJlY3Rvcnk+IG9yIDxMb2NhdGlvbj4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIC5odGFjY2VzcyB3aGVuIEFsbG93T3ZlcnJpZGUgTGltaXQKLSAqIChyZXFfb3ZlcnJpZGUgJiBPUl9PUFRJT05TKSAgPT4gKi5jb25mIGFueXdoZXJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCAuaHRhY2Nlc3Mgd2hlbiBBbGxvd092ZXJyaWRlIE9wdGlvbnMKLSAqIChyZXFfb3ZlcnJpZGUgJiBPUl9GSUxFSU5GTykgPT4gKi5jb25mIGFueXdoZXJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCAuaHRhY2Nlc3Mgd2hlbiBBbGxvd092ZXJyaWRlIEZpbGVJbmZvCi0gKiAocmVxX292ZXJyaWRlICYgT1JfSU5ERVhFUykgID0+ICouY29uZiBhbnl3aGVyZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgLmh0YWNjZXNzIHdoZW4gQWxsb3dPdmVycmlkZSBJbmRleGVzCi0gKi8KLSNkZWZpbmUgT1JfTk9ORSAwCi0jZGVmaW5lIE9SX0xJTUlUIDEKLSNkZWZpbmUgT1JfT1BUSU9OUyAyCi0jZGVmaW5lIE9SX0ZJTEVJTkZPIDQKLSNkZWZpbmUgT1JfQVVUSENGRyA4Ci0jZGVmaW5lIE9SX0lOREVYRVMgMTYKLSNkZWZpbmUgT1JfVU5TRVQgMzIKLSNkZWZpbmUgQUNDRVNTX0NPTkYgNjQKLSNkZWZpbmUgUlNSQ19DT05GIDEyOAotI2RlZmluZSBPUl9BTEwgKE9SX0xJTUlUfE9SX09QVElPTlN8T1JfRklMRUlORk98T1JfQVVUSENGR3xPUl9JTkRFWEVTKQotCi0vKiBUaGlzIGNhbiBiZSByZXR1cm5lZCBieSBhIGZ1bmN0aW9uIGlmIHRoZXkgZG9uJ3Qgd2lzaCB0byBoYW5kbGUKLSAqIGEgY29tbWFuZC4gTWFrZSBpdCBzb21ldGhpbmcgbm90IGxpa2VseSBzb21lb25lIHdpbGwgYWN0dWFsbHkgdXNlCi0gKiBhcyBhbiBlcnJvciBjb2RlLgotICovCi0KLSNkZWZpbmUgREVDTElORV9DTUQgIlxhXGIiCi0KLS8qCi0gKiBUaGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgdG8gYSBjb21tYW5kIHdoaWNoIGlzIGJlaW5nIGludm9rZWQsCi0gKiB0byBjYXJyeSBhIGxhcmdlIHZhcmlldHkgb2YgbWlzY2VsbGFuZW91cyBkYXRhIHdoaWNoIGlzIGFsbCBvZgotICogdXNlIHRvICpzb21lYm9keSouLi4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdm9pZCAqaW5mbzsJCQkvKiBBcmd1bWVudCB0byBjb21tYW5kIGZyb20gY21kX3RhYmxlICovCi0gICAgaW50IG92ZXJyaWRlOwkJLyogV2hpY2ggYWxsb3ctb3ZlcnJpZGUgYml0cyBhcmUgc2V0ICovCi0gICAgaW50IGxpbWl0ZWQ7CQkvKiBXaGljaCBtZXRob2RzIGFyZSA8TGltaXQ+ZWQgKi8KLQotICAgIGNvbmZpZ2ZpbGVfdCAqY29uZmlnX2ZpbGU7CS8qIENvbmZpZyBmaWxlIHN0cnVjdHVyZSBmcm9tIHBjZmdfb3BlbmZpbGUoKSAqLwotCi0gICAgYXBfY29udGV4dF90ICpwb29sOwkJCS8qIFBvb2wgdG8gYWxsb2NhdGUgbmV3IHN0b3JhZ2UgaW4gKi8KLSAgICBhcF9jb250ZXh0X3QgKnRlbXBfcG9vbDsJCS8qIFBvb2wgZm9yIHNjcmF0Y2ggbWVtb3J5OyBwZXJzaXN0cyBkdXJpbmcKLQkJCQkgKiBjb25maWd1cmF0aW9uLCBidXQgd2lwZWQgYmVmb3JlIHRoZSBmaXJzdAotCQkJCSAqIHJlcXVlc3QgaXMgc2VydmVkLi4uCi0JCQkJICovCi0gICAgc2VydmVyX3JlYyAqc2VydmVyOwkJLyogU2VydmVyX3JlYyBiZWluZyBjb25maWd1cmVkIGZvciAqLwotICAgIGNoYXIgKnBhdGg7CQkJLyogSWYgY29uZmlndXJpbmcgZm9yIGEgZGlyZWN0b3J5LAotCQkJCSAqIHBhdGhuYW1lIG9mIHRoYXQgZGlyZWN0b3J5LgotCQkJCSAqIE5PUEUhICBUaGF0J3Mgd2hhdCBpdCBtZWFudCBwcmV2aW91cyB0byB0aGUKLQkJCQkgKiBleGlzdGFuY2Ugb2YgPEZpbGVzPiwgPExvY2F0aW9uPiBhbmQgcmVnZXgKLQkJCQkgKiBtYXRjaGluZy4gIE5vdyB0aGUgb25seSB1c2VmdWxuZXNzIHRoYXQgY2FuCi0JCQkJICogYmUgZGVyaXZlZCBmcm9tIHRoaXMgZmllbGQgaXMgd2hldGhlciBhIGNvbW1hbmQKLQkJCQkgKiBpcyBiZWluZyBjYWxsZWQgaW4gYSBzZXJ2ZXIgY29udGV4dCAocGF0aCA9PSBOVUxMKQotCQkJCSAqIG9yIGJlaW5nIGNhbGxlZCBpbiBhIGRpciBjb250ZXh0IChwYXRoICE9IE5VTEwpLgotCQkJCSAqLwotICAgIGNvbnN0IGNvbW1hbmRfcmVjICpjbWQ7CS8qIGNvbmZpZ3VyYXRpb24gY29tbWFuZCAqLwotICAgIGNvbnN0IGNoYXIgKmVuZF90b2tlbjsJLyogZW5kIHRva2VuIHJlcXVpcmVkIHRvIGVuZCBhIG5lc3RlZCBzZWN0aW9uICovCi0gICAgdm9pZCAqY29udGV4dDsJCS8qIHBlcl9kaXJfY29uZmlnIHZlY3RvciBwYXNzZWQgCi0JCQkJICogdG8gaGFuZGxlX2NvbW1hbmQgKi8KLX0gY21kX3Bhcm1zOwotCi0vKiBUaGlzIHN0cnVjdHVyZSByZWNvcmRzIHRoZSBleGlzdGVuY2Ugb2YgaGFuZGxlcnMgaW4gYSBtb2R1bGUuLi4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNvbnN0IGNoYXIgKmNvbnRlbnRfdHlwZTsJLyogTVVTVCBiZSBhbGwgbG93ZXIgY2FzZSAqLwotICAgIGludCAoKmhhbmRsZXIpIChyZXF1ZXN0X3JlYyAqKTsKLX0gaGFuZGxlcl9yZWM7Ci0KLS8qCi0gKiBNb2R1bGUgc3RydWN0dXJlcy4gIEp1c3QgYWJvdXQgZXZlcnl0aGluZyBpcyBkaXNwYXRjaGVkIHRocm91Z2gKLSAqIHRoZXNlLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5ICh0aHJvdWdoIHRoZSBjb21tYW5kIGFuZCBoYW5kbGVyCi0gKiB0YWJsZXMpLgotICovCi0KLXR5cGVkZWYgc3RydWN0IG1vZHVsZV9zdHJ1Y3QgewotICAgIGludCB2ZXJzaW9uOwkJLyogQVBJIHZlcnNpb24sICpub3QqIG1vZHVsZSB2ZXJzaW9uOwotCQkJCSAqIGNoZWNrIHRoYXQgbW9kdWxlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGlzCi0JCQkJICogdmVyc2lvbiBvZiB0aGUgc2VydmVyLgotCQkJCSAqLwotICAgIGludCBtaW5vcl92ZXJzaW9uOyAgICAgICAgICAvKiBBUEkgbWlub3IgdmVyc2lvbi4gUHJvdmlkZXMgQVBJIGZlYXR1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbWlsZXN0b25lcy4gTm90IGNoZWNrZWQgZHVyaW5nIG1vZHVsZSBpbml0Ci0JCQkJICovCi0gICAgaW50IG1vZHVsZV9pbmRleDsJCS8qIEluZGV4IHRvIHRoaXMgbW9kdWxlcyBzdHJ1Y3R1cmVzIGluCi0JCQkJICogY29uZmlnIHZlY3RvcnMuCi0JCQkJICovCi0KLSAgICBjb25zdCBjaGFyICpuYW1lOwotICAgIHZvaWQgKmR5bmFtaWNfbG9hZF9oYW5kbGU7Ci0KLSAgICBzdHJ1Y3QgbW9kdWxlX3N0cnVjdCAqbmV4dDsKLQotICAgIHVuc2lnbmVkIGxvbmcgbWFnaWM7ICAgICAgICAvKiBNYWdpYyBDb29raWUgdG8gaWRlbnRpZnkgYSBtb2R1bGUgc3RydWN0dXJlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBJdCdzIG1haW5seSBpbXBvcnRhbnQgZm9yIHRoZSBEU08gZmFjaWxpdHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKHNlZSBhbHNvIG1vZF9zbykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgdm9pZCAqKCpjcmVhdGVfZGlyX2NvbmZpZykgKGFwX2NvbnRleHRfdCAqcCwgY2hhciAqZGlyKTsKLSAgICB2b2lkICooKm1lcmdlX2Rpcl9jb25maWcpIChhcF9jb250ZXh0X3QgKnAsIHZvaWQgKmJhc2VfY29uZiwgdm9pZCAqbmV3X2NvbmYpOwotICAgIHZvaWQgKigqY3JlYXRlX3NlcnZlcl9jb25maWcpIChhcF9jb250ZXh0X3QgKnAsIHNlcnZlcl9yZWMgKnMpOwotICAgIHZvaWQgKigqbWVyZ2Vfc2VydmVyX2NvbmZpZykgKGFwX2NvbnRleHRfdCAqcCwgdm9pZCAqYmFzZV9jb25mLCB2b2lkICpuZXdfY29uZik7Ci0KLSAgICBjb25zdCBjb21tYW5kX3JlYyAqY21kczsKLSAgICBjb25zdCBoYW5kbGVyX3JlYyAqaGFuZGxlcnM7Ci0KLSAgICAvKiBIb29rcyBmb3IgZ2V0dGluZyBpbnRvIHRoZSBtaWRkbGUgb2Ygc2VydmVyIG9wcy4uLgotCi0gICAgICogdHJhbnNsYXRlX2hhbmRsZXIgLS0tIHRyYW5zbGF0ZSBVUkkgdG8gZmlsZW5hbWUKLSAgICAgKiBhY2Nlc3NfY2hlY2tlciAtLS0gY2hlY2sgYWNjZXNzIGJ5IGhvc3QgYWRkcmVzcywgZXRjLiAgIEFsbCBvZiB0aGVzZQotICAgICAqICAgICAgICAgICAgICAgICAgICBydW47IGlmIGFsbCBkZWNsaW5lLCB0aGF0J3Mgc3RpbGwgT0suCi0gICAgICogY2hlY2tfdXNlcl9pZCAtLS0gZ2V0IGFuZCB2YWxpZGF0ZSB1c2VyIGlkIGZyb20gdGhlIEhUVFAgcmVxdWVzdAotICAgICAqIGF1dGhfY2hlY2tlciAtLS0gc2VlIGlmIHRoZSB1c2VyIChmcm9tIGNoZWNrX3VzZXJfaWQpIGlzIE9LICpoZXJlKi4KLSAgICAgKiAgICAgICAgICAgICAgICAgIElmIGFsbCBvZiAqdGhlc2UqIGRlY2xpbmUsIHRoZSByZXF1ZXN0IGlzIHJlamVjdGVkCi0gICAgICogICAgICAgICAgICAgICAgICAoYXMgYSBTRVJWRVJfRVJST1IsIHNpbmNlIHRoZSBtb2R1bGUgd2hpY2ggd2FzCi0gICAgICogICAgICAgICAgICAgICAgICBzdXBwb3NlZCB0byBoYW5kbGUgdGhpcyB3YXMgY29uZmlndXJlZCB3cm9uZykuCi0gICAgICogdHlwZV9jaGVja2VyIC0tLSBEZXRlcm1pbmUgTUlNRSB0eXBlIG9mIHRoZSByZXF1ZXN0ZWQgZW50aXR5OwotICAgICAqICAgICAgICAgICAgICAgICAgc2V0cyBjb250ZW50X3R5cGUsIF9lbmNvZGluZyBhbmQgX2xhbmd1YWdlIGZpZWxkcy4KLSAgICAgKi8KLQotICAgIHZvaWQgKCpyZWdpc3Rlcl9ob29rcykgKHZvaWQpOwotfSBtb2R1bGU7Ci0KLS8qIEluaXRpYWxpemVyIGZvciB0aGUgZmlyc3QgZmV3IG1vZHVsZSBzbG90cywgd2hpY2ggYXJlIG9ubHkKLSAqIHJlYWxseSBzZXQgdXAgb25jZSB3ZSBzdGFydCBydW5uaW5nLiAgTm90ZSB0aGF0IHRoZSBmaXJzdCB0d28gc2xvdHMKLSAqIHByb3ZpZGUgYSB2ZXJzaW9uIGNoZWNrOyB0aGlzIHNob3VsZCBhbGxvdyB1cyB0byBkZWFsIHdpdGggY2hhbmdlcyB0bwotICogdGhlIEFQSS4gVGhlIG1ham9yIG51bWJlciBzaG91bGQgcmVmbGVjdCBjaGFuZ2VzIHRvIHRoZSBBUEkgaGFuZGxlciB0YWJsZQotICogaXRzZWxmIG9yIHJlbW92YWwgb2YgZnVuY3Rpb25hbGl0eS4gVGhlIG1pbm9yIG51bWJlciBzaG91bGQgcmVmbGVjdAotICogYWRkaXRpb25zIG9mIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIGV4aXN0aW5nIEFQSS4gKHRoZSBzZXJ2ZXIgY2FuIGRldGVjdAotICogYW4gb2xkLWZvcm1hdCBtb2R1bGUsIGFuZCBlaXRoZXIgaGFuZGxlIGl0IGJhY2stY29tcGF0aWJseSwgb3IgYXQgbGVhc3QKLSAqIHNpZ25hbCBhbiBlcnJvcikuIFNlZSBzcmMvaW5jbHVkZS9hcF9tbW4uaCBmb3IgTU1OIHZlcnNpb24gaGlzdG9yeS4KLSAqLwotCi0jZGVmaW5lIFNUQU5EQVJEX01PRFVMRV9TVFVGRgl0aGlzX21vZHVsZV9uZWVkc190b19iZV9wb3J0ZWRfdG9fYXBhY2hlXzJfMAotCi0jZGVmaW5lIFNUQU5EQVJEMjBfTU9EVUxFX1NUVUZGCU1PRFVMRV9NQUdJQ19OVU1CRVJfTUFKT1IsIFwKLQkJCQlNT0RVTEVfTUFHSUNfTlVNQkVSX01JTk9SLCBcCi0JCQkJLTEsIFwKLQkJCQlfX0ZJTEVfXywgXAotCQkJCU5VTEwsIFwKLQkJCQlOVUxMLCBcCi0JCQkJTU9EVUxFX01BR0lDX0NPT0tJRQotCi0vKiBHZW5lcmljIGFjY2Vzc29ycyBmb3Igb3RoZXIgbW9kdWxlcyB0byBnZXQgYXQgdGhlaXIgb3duIG1vZHVsZS1zcGVjaWZpYwotICogZGF0YQotICovCi0KLUFQSV9FWFBPUlQodm9pZCAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyh2b2lkICpjb25mX3ZlY3RvciwgbW9kdWxlICptKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfc2V0X21vZHVsZV9jb25maWcodm9pZCAqY29uZl92ZWN0b3IsIG1vZHVsZSAqbSwgdm9pZCAqdmFsKTsKLQotI2RlZmluZSBhcF9nZXRfbW9kdWxlX2NvbmZpZyh2LG0pCVwKLSAgICAoKCh2b2lkICoqKSh2KSlbKG0pLT5tb2R1bGVfaW5kZXhdKQotI2RlZmluZSBhcF9zZXRfbW9kdWxlX2NvbmZpZyh2LG0sdmFsKQlcCi0gICAgKCgoKHZvaWQgKiopKHYpKVsobSktPm1vZHVsZV9pbmRleF0pID0gKHZhbCkpCi0KLS8qIEdlbmVyaWMgY29tbWFuZCBoYW5kbGluZyBmdW5jdGlvbi4uLiAqLwotCi1BUElfRVhQT1JUX05PTlNURChjb25zdCBjaGFyICopIGFwX3NldF9zdHJpbmdfc2xvdChjbWRfcGFybXMgKiwgY2hhciAqLCBjaGFyICopOwotQVBJX0VYUE9SVF9OT05TVEQoY29uc3QgY2hhciAqKSBhcF9zZXRfc3RyaW5nX3Nsb3RfbG93ZXIoY21kX3Bhcm1zICosIGNoYXIgKiwgY2hhciAqKTsKLUFQSV9FWFBPUlRfTk9OU1REKGNvbnN0IGNoYXIgKikgYXBfc2V0X2ZsYWdfc2xvdChjbWRfcGFybXMgKiwgY2hhciAqLCBpbnQpOwotQVBJX0VYUE9SVF9OT05TVEQoY29uc3QgY2hhciAqKSBhcF9zZXRfZmlsZV9zbG90KGNtZF9wYXJtcyAqLCBjaGFyICosIGNoYXIgKik7Ci0KLS8qIEZvciBtb2R1bGVzIHdoaWNoIG5lZWQgdG8gcmVhZCBjb25maWcgZmlsZXMsIG9wZW4gbG9ncywgZXRjLiAuLi4KLSAqIHRoaXMgcmV0dXJucyB0aGUgZm5hbWUgYXJndW1lbnQgaWYgaXQgYmVnaW5zIHdpdGggJy8nOyBvdGhlcndpc2UKLSAqIGl0IHJlbGF0aXZpemVzIGl0IHdydCBzZXJ2ZXJfcm9vdC4KLSAqLwotCi1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUoYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyICpmbmFtZSk7Ci0KLS8qIEZpbmFsbHksIHRoZSBob29rIGZvciBkeW5hbWljYWxseSBsb2FkaW5nIG1vZHVsZXMgaW4uLi4gKi8KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9hZGRfbW9kdWxlKG1vZHVsZSAqbSk7Ci1BUElfRVhQT1JUKHZvaWQpIGFwX3JlbW92ZV9tb2R1bGUobW9kdWxlICptKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfYWRkX2xvYWRlZF9tb2R1bGUobW9kdWxlICptb2QpOwotQVBJX0VYUE9SVCh2b2lkKSBhcF9yZW1vdmVfbG9hZGVkX21vZHVsZShtb2R1bGUgKm1vZCk7Ci1BUElfRVhQT1JUKGludCkgYXBfYWRkX25hbWVkX21vZHVsZShjb25zdCBjaGFyICpuYW1lKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfY2xlYXJfbW9kdWxlX2xpc3Qodm9pZCk7Ci1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfZmluZF9tb2R1bGVfbmFtZShtb2R1bGUgKm0pOwotQVBJX0VYUE9SVChtb2R1bGUgKikgYXBfZmluZF9saW5rZWRfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpOwotCi0vKiBmb3IgaW1wbGVtZW50aW5nIHN1YmNvbmZpZ3MgYW5kIGN1c3RvbWl6ZWQgY29uZmlnIGZpbGVzICovCi1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfc3JtX2NvbW1hbmRfbG9vcChjbWRfcGFybXMgKnBhcm1zLCB2b2lkICpjb25maWcpOwotCi0vKiBhcF9jaGVja19jbWRfY29udGV4dCgpIGRlZmluaXRpb25zOiAqLwotQVBJX0VYUE9SVChjb25zdCBjaGFyICopIGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZF9wYXJtcyAqY21kLCB1bnNpZ25lZCBmb3JiaWRkZW4pOwotCi0vKiBhcF9jaGVja19jbWRfY29udGV4dCgpOiAgICAgICAgICAgICAgRm9yYmlkZGVuIGluOiAqLwotI2RlZmluZSAgTk9UX0lOX1ZJUlRVQUxIT1NUICAgICAweDAxIC8qIDxWaXJ0dWFsaG9zdD4gKi8KLSNkZWZpbmUgIE5PVF9JTl9MSU1JVCAgICAgICAgICAgMHgwMiAvKiA8TGltaXQ+ICovCi0jZGVmaW5lICBOT1RfSU5fRElSRUNUT1JZICAgICAgIDB4MDQgLyogPERpcmVjdG9yeT4gKi8KLSNkZWZpbmUgIE5PVF9JTl9MT0NBVElPTiAgICAgICAgMHgwOCAvKiA8TG9jYXRpb24+ICovCi0jZGVmaW5lICBOT1RfSU5fRklMRVMgICAgICAgICAgIDB4MTAgLyogPEZpbGVzPiAqLwotI2RlZmluZSAgTk9UX0lOX0RJUl9MT0NfRklMRSAgICAoTk9UX0lOX0RJUkVDVE9SWXxOT1RfSU5fTE9DQVRJT058Tk9UX0lOX0ZJTEVTKSAvKiA8RGlyZWN0b3J5Pi88TG9jYXRpb24+LzxGaWxlcz4qLwotI2RlZmluZSAgR0xPQkFMX09OTFkgICAgICAgICAgICAoTk9UX0lOX1ZJUlRVQUxIT1NUfE5PVF9JTl9MSU1JVHxOT1RfSU5fRElSX0xPQ19GSUxFKQotCi0KLSNpZmRlZiBDT1JFX1BSSVZBVEUKLQotZXh0ZXJuIEFQSV9WQVJfRVhQT1JUIG1vZHVsZSAqdG9wX21vZHVsZTsKLQotZXh0ZXJuIG1vZHVsZSAqYXBfcHJlbGlua2VkX21vZHVsZXNbXTsKLWV4dGVybiBtb2R1bGUgKmFwX3ByZWxvYWRlZF9tb2R1bGVzW107Ci1leHRlcm4gQVBJX1ZBUl9FWFBPUlQgbW9kdWxlICoqYXBfbG9hZGVkX21vZHVsZXM7Ci0KLS8qIEZvciBtb2Rfc28uYy4uLiAqLwotCi12b2lkIGFwX3NpbmdsZV9tb2R1bGVfY29uZmlndXJlKGFwX2NvbnRleHRfdCAqcCwgc2VydmVyX3JlYyAqcywgbW9kdWxlICptKTsKLQotLyogRm9yIGh0dHBfbWFpbi5jLi4uICovCi0KLXZvaWQgYXBfc2V0dXBfcHJlbGlua2VkX21vZHVsZXMocHJvY2Vzc19yZWMgKnByb2Nlc3MpOwotdm9pZCBhcF9zaG93X2RpcmVjdGl2ZXModm9pZCk7Ci12b2lkIGFwX3Nob3dfbW9kdWxlcyh2b2lkKTsKLXNlcnZlcl9yZWMgKmFwX3JlYWRfY29uZmlnKHByb2Nlc3NfcmVjICpwcm9jZXNzLCBhcF9jb250ZXh0X3QgKnRlbXBfcG9vbCwgY29uc3QgY2hhciAqY29uZmlnX25hbWUpOwotdm9pZCBhcF9wb3N0X2NvbmZpZ19ob29rKGFwX2NvbnRleHRfdCAqcGNvbmYsIGFwX2NvbnRleHRfdCAqcGxvZywgYXBfY29udGV4dF90ICpwdGVtcCwgc2VydmVyX3JlYyAqcyk7Ci12b2lkIGFwX2NoaWxkX2luaXRfaG9vayhhcF9jb250ZXh0X3QgKnBjaGlsZCwgc2VydmVyX3JlYyAqcyk7Ci0KLS8qIEZvciBodHRwX3JlcXVlc3QuYy4uLiAqLwotCi12b2lkICphcF9jcmVhdGVfcmVxdWVzdF9jb25maWcoYXBfY29udGV4dF90ICpwKTsKLUNPUkVfRVhQT1JUKHZvaWQgKikgYXBfY3JlYXRlX3Blcl9kaXJfY29uZmlnKGFwX2NvbnRleHRfdCAqcCk7Ci12b2lkICphcF9tZXJnZV9wZXJfZGlyX2NvbmZpZ3MoYXBfY29udGV4dF90ICpwLCB2b2lkICpiYXNlLCB2b2lkICpuZXcpOwotCi0vKiBGb3IgaHR0cF9jb25uZWN0aW9uLmMuLi4gKi8KLQotdm9pZCAqYXBfY3JlYXRlX2Nvbm5fY29uZmlnKGFwX2NvbnRleHRfdCAqcCk7Ci0KLS8qIEZvciBodHRwX2NvcmUuYy4uLiAoPERpcmVjdG9yeT4gY29tbWFuZCBhbmQgdmlydHVhbCBob3N0cykgKi8KLQotaW50IGFwX3BhcnNlX2h0YWNjZXNzKHZvaWQgKipyZXN1bHQsIHJlcXVlc3RfcmVjICpyLCBpbnQgb3ZlcnJpZGUsCi0JCWNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmFjY2Vzc19uYW1lKTsKLQotQ09SRV9FWFBPUlQoY29uc3QgY2hhciAqKSBhcF9pbml0X3ZpcnR1YWxfaG9zdChhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKmhvc3RuYW1lLAotCQkJCXNlcnZlcl9yZWMgKm1haW5fc2VydmVyLCBzZXJ2ZXJfcmVjICoqKTsKLXZvaWQgYXBfcHJvY2Vzc19yZXNvdXJjZV9jb25maWcoc2VydmVyX3JlYyAqcywgY29uc3QgY2hhciAqZm5hbWUsIGFwX2NvbnRleHRfdCAqcCwgYXBfY29udGV4dF90ICpwdGVtcCk7Ci0KLS8qIE1vZHVsZS1tZXRob2QgZGlzcGF0Y2hlcnMsIGFsc28gZm9yIGh0dHBfcmVxdWVzdC5jICovCi0KLWludCBhcF90cmFuc2xhdGVfbmFtZShyZXF1ZXN0X3JlYyAqKTsKLWludCBhcF9jaGVja191c2VyX2lkKHJlcXVlc3RfcmVjICopOwkvKiBvYnRhaW4gdmFsaWQgdXNlcm5hbWUgZnJvbSBjbGllbnQgYXV0aCAqLwotaW50IGFwX2ludm9rZV9oYW5kbGVyKHJlcXVlc3RfcmVjICopOwotCi0vKiBmb3IgbW9kX3BlcmwgKi8KLQotQ09SRV9FWFBPUlQoY29uc3QgY29tbWFuZF9yZWMgKikgYXBfZmluZF9jb21tYW5kKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNvbW1hbmRfcmVjICpjbWRzKTsKLUNPUkVfRVhQT1JUKGNvbnN0IGNvbW1hbmRfcmVjICopIGFwX2ZpbmRfY29tbWFuZF9pbl9tb2R1bGVzKGNvbnN0IGNoYXIgKmNtZF9uYW1lLCBtb2R1bGUgKiptb2QpOwotQ09SRV9FWFBPUlQodm9pZCAqKSBhcF9zZXRfY29uZmlnX3ZlY3RvcnMoY21kX3Bhcm1zICpwYXJtcywgdm9pZCAqY29uZmlnLCBtb2R1bGUgKm1vZCk7Ci1DT1JFX0VYUE9SVChjb25zdCBjaGFyICopIGFwX2hhbmRsZV9jb21tYW5kKGNtZF9wYXJtcyAqcGFybXMsIHZvaWQgKmNvbmZpZywgY29uc3QgY2hhciAqbCk7Ci0KLSNlbmRpZgotCi0gIC8qIEhvb2tzICovCi1ERUNMQVJFX0hPT0soaW50LGhlYWRlcl9wYXJzZXIsKHJlcXVlc3RfcmVjICopKQotREVDTEFSRV9IT09LKHZvaWQscHJlX2NvbmZpZywoYXBfY29udGV4dF90ICpwY29uZixhcF9jb250ZXh0X3QgKnBsb2csYXBfY29udGV4dF90ICpwdGVtcCkpCi1ERUNMQVJFX0hPT0sodm9pZCxwb3N0X2NvbmZpZywKLQkgICAgIChhcF9jb250ZXh0X3QgKnBjb25mLGFwX2NvbnRleHRfdCAqcGxvZyxhcF9jb250ZXh0X3QgKnB0ZW1wLHNlcnZlcl9yZWMgKnMpKQotREVDTEFSRV9IT09LKHZvaWQsb3Blbl9sb2dzLAotCSAgICAgKGFwX2NvbnRleHRfdCAqcGNvbmYsYXBfY29udGV4dF90ICpwbG9nLGFwX2NvbnRleHRfdCAqcHRlbXAsc2VydmVyX3JlYyAqcykpCi1ERUNMQVJFX0hPT0sodm9pZCxjaGlsZF9pbml0LChhcF9jb250ZXh0X3QgKnBjaGlsZCwgc2VydmVyX3JlYyAqcykpCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgkvKiAhQVBBQ0hFX0hUVFBfQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaHR0cF9jb25uZWN0aW9uLmggYi9pbmNsdWRlL2h0dHBfY29ubmVjdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmQ5MWQ1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaHR0cF9jb25uZWN0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotI2lmbmRlZiBBUEFDSEVfSFRUUF9DT05ORUNUSU9OX0gKLSNkZWZpbmUgQVBBQ0hFX0hUVFBfQ09OTkVDVElPTl9ICi0KLSNpbmNsdWRlICJhcF9ob29rcy5oIgotI2luY2x1ZGUgImFwcl9uZXR3b3JrX2lvLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmZGVmIENPUkVfUFJJVkFURQotY29ubl9yZWMgKmFwX25ld19jb25uZWN0aW9uKGFwX2NvbnRleHRfdCAqcCwgc2VydmVyX3JlYyAqc2VydmVyLCBCVUZGICppbm91dCwKLQkJCSAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnJlbWFkZHIsCi0JCQkgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzYWRkciwgbG9uZyBpZCk7Ci1jb25uX3JlYyAqYXBfbmV3X2Fwcl9jb25uZWN0aW9uKGFwX2NvbnRleHRfdCAqcCwgc2VydmVyX3JlYyAqc2VydmVyLCBCVUZGICppbm91dCwKLQkJCSAgICBjb25zdCBhcF9zb2NrZXRfdCAqY29ubl9zb2NrZXQsIGxvbmcgaWQpOwotQ09SRV9FWFBPUlQodm9pZCkgYXBfcHJvY2Vzc19jb25uZWN0aW9uKGNvbm5fcmVjICopOwotaW50IGFwX3Byb2Nlc3NfaHR0cF9jb25uZWN0aW9uKGNvbm5fcmVjICopOwotI2VuZGlmCi0KLSAgLyogSG9va3MgKi8KLURFQ0xBUkVfSE9PSyh2b2lkLHByZV9jb25uZWN0aW9uLChjb25uX3JlYyAqKSkKLURFQ0xBUkVfSE9PSyhpbnQscHJvY2Vzc19jb25uZWN0aW9uLChjb25uX3JlYyAqKSkKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCS8qICFBUEFDSEVfSFRUUF9SRVFVRVNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaHR0cF9jb3JlLmggYi9pbmNsdWRlL2h0dHBfY29yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjA5NmI4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaHR0cF9jb3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaWZuZGVmIEFQQUNIRV9IVFRQX0NPUkVfSAotI2RlZmluZSBBUEFDSEVfSFRUUF9DT1JFX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaW5jbHVkZSAiYXByX2xpYi5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaGUgbW9zdCBiYXNpYyBzZXJ2ZXIgY29kZSBpcyBlbmNhcHN1bGF0ZWQgaW4gYSBzaW5nbGUgbW9kdWxlCi0gKiBrbm93biBhcyB0aGUgY29yZSwgd2hpY2ggaXMganVzdCAqYmFyZWx5KiBmdW5jdGlvbmFsIGVub3VnaCB0bwotICogc2VydmUgZG9jdW1lbnRzLCB0aG91Z2ggbm90IHRlcnJpYmx5IHdlbGwuCi0gKgotICogTGFyZ2VseSBmb3IgTkNTQSBiYWNrLWNvbXBhdGliaWxpdHkgcmVhc29ucywgdGhlIGNvcmUgbmVlZHMgdG8KLSAqIG1ha2UgcGllY2VzIG9mIGl0cyBjb25maWcgc3RydWN0dXJlcyBhdmFpbGFibGUgdG8gb3RoZXIgbW9kdWxlcy4KLSAqIFRoZSBhY2Nlc3NvcnMgYXJlIGRlY2xhcmVkIGhlcmUsIGFsb25nIHdpdGggdGhlIGludGVycHJldGF0aW9uCi0gKiBvZiBvbmUgb2YgdGhlbSAoYWxsb3dfb3B0aW9ucykuCi0gKi8KLQotI2RlZmluZSBPUFRfTk9ORSAwCi0jZGVmaW5lIE9QVF9JTkRFWEVTIDEKLSNkZWZpbmUgT1BUX0lOQ0xVREVTIDIKLSNkZWZpbmUgT1BUX1NZTV9MSU5LUyA0Ci0jZGVmaW5lIE9QVF9FWEVDQ0dJIDgKLSNkZWZpbmUgT1BUX1VOU0VUIDE2Ci0jZGVmaW5lIE9QVF9JTkNOT0VYRUMgMzIKLSNkZWZpbmUgT1BUX1NZTV9PV05FUiA2NAotI2RlZmluZSBPUFRfTVVMVEkgMTI4Ci0jZGVmaW5lIE9QVF9BTEwgKE9QVF9JTkRFWEVTfE9QVF9JTkNMVURFU3xPUFRfU1lNX0xJTktTfE9QVF9FWEVDQ0dJKQotCi0vKiBvcHRpb25zIGZvciBnZXRfcmVtb3RlX2hvc3QoKSAqLwotLyogUkVNT1RFX0hPU1QgcmV0dXJucyB0aGUgaG9zdG5hbWUsIG9yIE5VTEwgaWYgdGhlIGhvc3RuYW1lCi0gKiBsb29rdXAgZmFpbHMuICBJdCB3aWxsIGZvcmNlIGEgRE5TIGxvb2t1cCBhY2NvcmRpbmcgdG8gdGhlCi0gKiBIb3N0bmFtZUxvb2t1cHMgc2V0dGluZy4KLSAqLwotI2RlZmluZSBSRU1PVEVfSE9TVCAoMCkKLQotLyogUkVNT1RFX05BTUUgcmV0dXJucyB0aGUgaG9zdG5hbWUsIG9yIHRoZSBkb3R0ZWQgcXVhZCBpZiB0aGUKLSAqIGhvc3RuYW1lIGxvb2t1cCBmYWlscy4gIEl0IHdpbGwgZm9yY2UgYSBETlMgbG9va3VwIGFjY29yZGluZwotICogdG8gdGhlIEhvc3RuYW1lTG9va3VwcyBzZXR0aW5nLgotICovCi0jZGVmaW5lIFJFTU9URV9OQU1FICgxKQotCi0vKiBSRU1PVEVfTk9MT09LVVAgaXMgbGlrZSBSRU1PVEVfTkFNRSBleGNlcHQgdGhhdCBhIEROUyBsb29rdXAgaXMKLSAqIG5ldmVyIGZvcmNlZC4KLSAqLwotI2RlZmluZSBSRU1PVEVfTk9MT09LVVAgKDIpCi0KLS8qIFJFTU9URV9ET1VCTEVfUkVWIHdpbGwgYWx3YXlzIGZvcmNlIGEgRE5TIGxvb2t1cCwgYW5kIGFsc28gZm9yY2UKLSAqIGEgZG91YmxlIHJldmVyc2UgbG9va3VwLCByZWdhcmRsZXNzIG9mIHRoZSBIb3N0bmFtZUxvb2t1cHMKLSAqIHNldHRpbmcuICBUaGUgcmVzdWx0IGlzIHRoZSAoZG91YmxlIHJldmVyc2UgY2hlY2tlZCkgaG9zdG5hbWUsCi0gKiBvciBOVUxMIGlmIGFueSBvZiB0aGUgbG9va3VwcyBmYWlsLgotICovCi0jZGVmaW5lIFJFTU9URV9ET1VCTEVfUkVWICgzKQotCi0jZGVmaW5lIFNBVElTRllfQUxMIDAKLSNkZWZpbmUgU0FUSVNGWV9BTlkgMQotI2RlZmluZSBTQVRJU0ZZX05PU1BFQyAyCi0KLUFQSV9FWFBPUlQoaW50KSBhcF9hbGxvd19vcHRpb25zIChyZXF1ZXN0X3JlYyAqKTsKLUFQSV9FWFBPUlQoaW50KSBhcF9hbGxvd19vdmVycmlkZXMgKHJlcXVlc3RfcmVjICopOwotQVBJX0VYUE9SVChjb25zdCBjaGFyICopIGFwX2RlZmF1bHRfdHlwZSAocmVxdWVzdF9yZWMgKik7ICAgICAKLUFQSV9FWFBPUlQoY29uc3QgY2hhciAqKSBhcF9kb2N1bWVudF9yb290IChyZXF1ZXN0X3JlYyAqKTsgLyogRG9uJ3QgdXNlIHRoaXMhICBJZiB5b3VyIHJlcXVlc3Qgd2VudAotCQkJCSAgICAgICogdGhyb3VnaCBhIFVzZXJkaXIsIG9yIHNvbWV0aGluZyBsaWtlCi0JCQkJICAgICAgKiB0aGF0LCBpdCdsbCBzY3JldyB5b3UuICBCdXQgaXQncwotCQkJCSAgICAgICogYmFjay1jb21wYXRpYmxlLi4uCi0JCQkJICAgICAgKi8KLUFQSV9FWFBPUlQoY29uc3QgY2hhciAqKSBhcF9nZXRfcmVtb3RlX2hvc3QoY29ubl9yZWMgKmNvbm4sIHZvaWQgKmRpcl9jb25maWcsIGludCB0eXBlKTsKLUFQSV9FWFBPUlQoY29uc3QgY2hhciAqKSBhcF9nZXRfcmVtb3RlX2xvZ25hbWUocmVxdWVzdF9yZWMgKnIpOwotCi0vKiBVc2VkIGZvciBjb25zdHJ1Y3Rpbmcgc2VsZi1yZWZlcmVuY2luZyBVUkxzLCBhbmQgdGhpbmdzIGxpa2UgU0VSVkVSX1BPUlQsCi0gKiBhbmQgU0VSVkVSX05BTUUuCi0gKi8KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9jb25zdHJ1Y3RfdXJsKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqdXJpLCByZXF1ZXN0X3JlYyAqcik7Ci1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfZ2V0X3NlcnZlcl9uYW1lKHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQodW5zaWduZWQpIGFwX2dldF9zZXJ2ZXJfcG9ydChjb25zdCByZXF1ZXN0X3JlYyAqcik7Ci1BUElfRVhQT1JUKHVuc2lnbmVkIGxvbmcpIGFwX2dldF9saW1pdF9yZXFfYm9keShjb25zdCByZXF1ZXN0X3JlYyAqcik7Ci1BUElfRVhQT1JUKHZvaWQpIGFwX2N1c3RvbV9yZXNwb25zZShyZXF1ZXN0X3JlYyAqciwgaW50IHN0YXR1cywgY2hhciAqc3RyaW5nKTsKLUFQSV9FWFBPUlQoaW50KSBhcF9leGlzdHNfY29uZmlnX2RlZmluZShjaGFyICpuYW1lKTsKLQotLyogQXV0aGVudGljYXRpb24gc3R1ZmYuICBUaGlzIGlzIG9uZSBvZiB0aGUgcGxhY2VzIHdoZXJlIGNvbXBhdGliaWxpdHkKLSAqIHdpdGggdGhlIG9sZCBjb25maWcgZmlsZXMgKnJlYWxseSogaHVydHM7IHRoZXkgZG9uJ3QgZGlzY3JpbWluYXRlIGF0Ci0gKiBhbGwgYmV0d2VlbiBkaWZmZXJlbnQgYXV0aGVudGljYXRpb24gc2NoZW1lcywgbWVhbmluZyB0aGF0IHdlIG5lZWQKLSAqIHRvIG1haW50YWluIGNvbW1vbiBzdGF0ZSBmb3IgYWxsIG9mIHRoZW0gaW4gdGhlIGNvcmUsIGFuZCBtYWtlIGl0Ci0gKiBhdmFpbGFibGUgdG8gdGhlIG90aGVyIG1vZHVsZXMgdGhyb3VnaCBpbnRlcmZhY2VzLgotICovCi0gICAgCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50IG1ldGhvZF9tYXNrOwotICAgIGNoYXIgKnJlcXVpcmVtZW50OwotfSByZXF1aXJlX2xpbmU7Ci0gICAgIAotQVBJX0VYUE9SVChjb25zdCBjaGFyICopIGFwX2F1dGhfdHlwZSAocmVxdWVzdF9yZWMgKik7Ci1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfYXV0aF9uYW1lIChyZXF1ZXN0X3JlYyAqKTsgICAgIAotQVBJX0VYUE9SVChpbnQpIGFwX3NhdGlzZmllcyAocmVxdWVzdF9yZWMgKnIpOwotQVBJX0VYUE9SVChjb25zdCBhcF9hcnJheV9oZWFkZXJfdCAqKSBhcF9yZXF1aXJlcyAocmVxdWVzdF9yZWMgKik7ICAgIAotCi0jaWZkZWYgV0lOMzIKLS8qIAotICogQ0dJIFNjcmlwdCBzdHVmZiBmb3IgV2luMzIuLi4KLSAqLwotdHlwZWRlZiBlbnVtIHsgZUZpbGVUeXBlVU5LTk9XTiwgZUZpbGVUeXBlQklOLCBlRmlsZVR5cGVFWEUxNiwgZUZpbGVUeXBlRVhFMzIsIAotICAgICAgICAgICAgICAgZUZpbGVUeXBlU0NSSVBUIH0gZmlsZV90eXBlX2U7Ci10eXBlZGVmIGVudW0geyBJTlRFUlBSRVRFUl9TT1VSQ0VfVU5TRVQsIElOVEVSUFJFVEVSX1NPVVJDRV9SRUdJU1RSWSwgCi0gICAgICAgICAgICAgICBJTlRFUlBSRVRFUl9TT1VSQ0VfU0hFQkFORyB9IGludGVycHJldGVyX3NvdXJjZV9lOwotQVBJX0VYUE9SVChmaWxlX3R5cGVfZSkgYXBfZ2V0X3dpbjMyX2ludGVycHJldGVyKGNvbnN0IHJlcXVlc3RfcmVjICosIGNoYXIgKiopOwotI2VuZGlmCi0KLSNpZmRlZiBDT1JFX1BSSVZBVEUKLQotLyoKLSAqIENvcmUgaXMgYWxzbyB1bmxpa2Ugb3RoZXIgbW9kdWxlcyBpbiBiZWluZyBpbXBsZW1lbnRlZCBpbiBtb3JlIHRoYW4KLSAqIG9uZSBmaWxlLi4uIHNvLCBkYXRhIHN0cnVjdHVyZXMgYXJlIGRlY2xhcmVkIGhlcmUsIGV2ZW4gdGhvdWdoIG1vc3Qgb2YKLSAqIHRoZSBjb2RlIHRoYXQgY2FyZXMgcmVhbGx5IGlzIGluIGh0dHBfY29yZS5jLiAgQWxzbywgYW5vdGhlciBhY2Nlc3Nvci4KLSAqLwotCi1jaGFyICphcF9yZXNwb25zZV9jb2RlX3N0cmluZyAocmVxdWVzdF9yZWMgKnIsIGludCBlcnJvcl9pbmRleCk7Ci0KLWV4dGVybiBBUElfVkFSX0VYUE9SVCBtb2R1bGUgY29yZV9tb2R1bGU7Ci0KLS8qIFBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgYWxsb3dfb3B0aW9uc190OwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIG92ZXJyaWRlc190OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgLyogcGF0aCBvZiB0aGUgZGlyZWN0b3J5L3JlZ2V4L2V0Yy4gIHNlZSBhbHNvIGRfaXNfZm5tYXRjaCBiZWxvdyAqLwotICAgIGNoYXIgKmQ7Ci0gICAgLyogdGhlIG51bWJlciBvZiBzbGFzaGVzIGluIGQgKi8KLSAgICB1bnNpZ25lZCBkX2NvbXBvbmVudHM7Ci0KLSAgICAvKiBJZiAob3B0cyAmIE9QVF9VTlNFVCkgdGhlbiBubyBhYnNvbHV0ZSBhc3NpZ25tZW50IHRvIG9wdGlvbnMgaGFzCi0gICAgICogYmVlbiBtYWRlLgotICAgICAqIGludmFyaWFudDogKG9wdHNfYWRkICYgb3B0c19yZW1vdmUpID09IDAKLSAgICAgKiBXaGljaCBzYWlkIGFub3RoZXIgd2F5IG1lYW5zIHRoYXQgdGhlIGxhc3QgcmVsYXRpdmUgKG9wdGlvbnMgKyBvciAtKQotICAgICAqIGFzc2lnbm1lbnQgbWFkZSB0byBlYWNoIGJpdCBpcyByZWNvcmRlZCBpbiBleGFjdGx5IG9uZSBvZiBvcHRzX2FkZAotICAgICAqIG9yIG9wdHNfcmVtb3ZlLgotICAgICAqLwotICAgIGFsbG93X29wdGlvbnNfdCBvcHRzOwotICAgIGFsbG93X29wdGlvbnNfdCBvcHRzX2FkZDsKLSAgICBhbGxvd19vcHRpb25zX3Qgb3B0c19yZW1vdmU7Ci0gICAgb3ZlcnJpZGVzX3Qgb3ZlcnJpZGU7Ci0gICAgCi0gICAgLyogTUlNRSB0eXBpbmcgLS0tIHRoZSBjb3JlIGRvZXNuJ3QgZG8gYW55dGhpbmcgYXQgYWxsIHdpdGggdGhpcywKLSAgICAgKiBidXQgaXQgZG9lcyBrbm93IHdoYXQgdG8gc2xhcCBvbiBhIHJlcXVlc3QgZm9yIGEgZG9jdW1lbnQgd2hpY2gKLSAgICAgKiBnb2VzIHVudHlwZWQgYnkgb3RoZXIgbWVjaGFuaXNtcyBiZWZvcmUgaXQgc2xpcHMgb3V0IHRoZSBkb29yLi4uCi0gICAgICovCi0gICAgCi0gICAgY2hhciAqYXBfZGVmYXVsdF90eXBlOwotICAKLSAgICAvKiBBdXRoZW50aWNhdGlvbiBzdHVmZi4gIEdyb2FuLi4uICovCi0gICAgCi0gICAgaW50IHNhdGlzZnk7Ci0gICAgY2hhciAqYXBfYXV0aF90eXBlOwotICAgIGNoYXIgKmFwX2F1dGhfbmFtZTsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqYXBfcmVxdWlyZXM7Ci0KLSAgICAvKiBDdXN0b20gcmVzcG9uc2UgY29uZmlnLiBUaGVzZSBjYW4gY29udGFpbiB0ZXh0IG9yIGEgVVJMIHRvIHJlZGlyZWN0IHRvLgotICAgICAqIGlmIHJlc3BvbnNlX2NvZGVfc3RyaW5ncyBpcyBOVUxMIHRoZW4gdGhlcmUgYXJlIG5vbmUgaW4gdGhlIGNvbmZpZywKLSAgICAgKiBpZiBpdCdzIG5vdCBudWxsIHRoZW4gaXQncyBhbGxvY2F0ZWQgdG8gc2l6ZW9mKGNoYXIqKSpSRVNQT05TRV9DT0RFUy4KLSAgICAgKiBUaGlzIGxldHMgdXMgZG8gcXVpY2sgbWVyZ2VzIGluIG1lcmdlX2NvcmVfZGlyX2NvbmZpZ3MoKS4KLSAgICAgKi8KLSAgCi0gICAgY2hhciAqKnJlc3BvbnNlX2NvZGVfc3RyaW5nczsKLQotICAgIC8qIEhvc3RuYW1lIHJlc29sdXRpb24gZXRjICovCi0jZGVmaW5lIEhPU1ROQU1FX0xPT0tVUF9PRkYJMAotI2RlZmluZSBIT1NUTkFNRV9MT09LVVBfT04JMQotI2RlZmluZSBIT1NUTkFNRV9MT09LVVBfRE9VQkxFCTIKLSNkZWZpbmUgSE9TVE5BTUVfTE9PS1VQX1VOU0VUCTMKLSAgICB1bnNpZ25lZCBpbnQgaG9zdG5hbWVfbG9va3VwcyA6IDQ7Ci0KLSAgICBzaWduZWQgaW50IGRvX3JmYzE0MTMgOiAyOyAgIC8qIFNlZSBpZiBjbGllbnQgaXMgYWR2ZXJ0aXNpbmcgYSB1c2VybmFtZT8gKi8KLQotICAgIHNpZ25lZCBpbnQgY29udGVudF9tZDUgOiAyOyAgLyogY2FsY3VsYXRlIENvbnRlbnQtTUQ1PyAqLwotCi0jZGVmaW5lIFVTRV9DQU5PTklDQUxfTkFNRV9PRkYgICAoMCkKLSNkZWZpbmUgVVNFX0NBTk9OSUNBTF9OQU1FX09OICAgICgxKQotI2RlZmluZSBVU0VfQ0FOT05JQ0FMX05BTUVfRE5TICAgKDIpCi0jZGVmaW5lIFVTRV9DQU5PTklDQUxfTkFNRV9VTlNFVCAoMykKLSAgICB1bnNpZ25lZCB1c2VfY2Fub25pY2FsX25hbWUgOiAyOwotCi0gICAgLyogc2luY2UgaXNfZm5tYXRjaChjb25mLT5kKSB3YXMgYmVpbmcgY2FsbGVkIHNvIGZyZXF1ZW50bHkgaW4KLSAgICAgKiBkaXJlY3Rvcnlfd2FsaygpIGFuZCBpdHMgcmVsYXRpdmVzLCB0aGlzIGZpZWxkIHdhcyBjcmVhdGVkIGFuZAotICAgICAqIGlzIHNldCB0byB0aGUgcmVzdWx0IG9mIHRoYXQgY2FsbC4KLSAgICAgKi8KLSAgICB1bnNpZ25lZCBkX2lzX2ZubWF0Y2ggOiAxOwotCi0gICAgdW5zaWduZWQgbG9uZyBsaW1pdF9yZXFfYm9keTsgIC8qIGxpbWl0IG9uIGJ5dGVzIGluIHJlcXVlc3QgbXNnIGJvZHkgKi8KLQotICAgIC8qIGxvZ2dpbmcgb3B0aW9ucyAqLwotICAgIGVudW0geyBzcnZfc2lnX3Vuc2V0LCBzcnZfc2lnX29mZiwgc3J2X3NpZ19vbiwKLQkgICAgc3J2X3NpZ193aXRobWFpbCB9IHNlcnZlcl9zaWduYXR1cmU7Ci0gICAgaW50IGxvZ2xldmVsOwotICAgIAotICAgIC8qIEFjY2VzcyBjb250cm9sICovCi0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKnNlYzsKLSAgICByZWdleF90ICpyOwotCi0jaWZkZWYgV0lOMzIKLSAgICAvKiBXaGVyZSB0byBmaW5kIGludGVycHJldGVyIHRvIHJ1biBzY3JpcHRzICovCi0gICAgaW50ZXJwcmV0ZXJfc291cmNlX2Ugc2NyaXB0X2ludGVycHJldGVyX3NvdXJjZTsKLSNlbmRpZiAgICAKLSAgICAKLX0gY29yZV9kaXJfY29uZmlnOwotCi0vKiBQZXItc2VydmVyIGNvcmUgY29uZmlndXJhdGlvbiAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIAotI2lmZGVmIEdQUk9GCi0gICAgY2hhciAqZ3Byb2ZfZGlyOwotI2VuZGlmCi0KLSAgICAvKiBOYW1lIHRyYW5zbGF0aW9ucyAtLS0gd2Ugd2FudCB0aGUgY29yZSB0byBiZSBhYmxlIHRvIGRvICpzb21ldGhpbmcqCi0gICAgICogc28gaXQncyBhdCBsZWFzdCBhIG1pbmltYWxseSBmdW5jdGlvbmFsIHdlYiBzZXJ2ZXIgb24gaXRzIG93biAoYW5kCi0gICAgICogY2FuIGJlIHRlc3RlZCB0aGF0IHdheSkuICBCdXQgbGV0J3Mga2VlcCBpdCB0byB0aGUgYmFyZSBtaW5pbXVtOgotICAgICAqLwotICAgIGNoYXIgKmFwX2RvY3VtZW50X3Jvb3Q7Ci0gIAotICAgIC8qIEFjY2VzcyBjb250cm9sICovCi0KLSAgICBjaGFyICphY2Nlc3NfbmFtZTsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqc2VjOwotICAgIGFwX2FycmF5X2hlYWRlcl90ICpzZWNfdXJsOwotfSBjb3JlX3NlcnZlcl9jb25maWc7Ci0KLS8qIGZvciBodHRwX2NvbmZpZy5jICovCi12b2lkIGFwX2NvcmVfcmVvcmRlcl9kaXJlY3RvcmllcyhhcF9jb250ZXh0X3QgKiwgc2VydmVyX3JlYyAqKTsKLQotLyogZm9yIG1vZF9wZXJsICovCi1DT1JFX0VYUE9SVCh2b2lkKSBhcF9hZGRfcGVyX2Rpcl9jb25mIChzZXJ2ZXJfcmVjICpzLCB2b2lkICpkaXJfY29uZmlnKTsKLUNPUkVfRVhQT1JUKHZvaWQpIGFwX2FkZF9wZXJfdXJsX2NvbmYgKHNlcnZlcl9yZWMgKnMsIHZvaWQgKnVybF9jb25maWcpOwotQ09SRV9FWFBPUlQodm9pZCkgYXBfYWRkX2ZpbGVfY29uZihjb3JlX2Rpcl9jb25maWcgKmNvbmYsIHZvaWQgKnVybF9jb25maWcpOwotQ09SRV9FWFBPUlRfTk9OU1REKGNvbnN0IGNoYXIgKikgYXBfbGltaXRfc2VjdGlvbiAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjb25zdCBjaGFyICphcmcpOwotCi0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCS8qICFBUEFDSEVfSFRUUF9DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaHR0cF9sb2cuaCBiL2luY2x1ZGUvaHR0cF9sb2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk2MzExMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2h0dHBfbG9nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaWZuZGVmIEFQQUNIRV9IVFRQX0xPR19ICi0jZGVmaW5lIEFQQUNIRV9IVFRQX0xPR19ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2luY2x1ZGUgImFwcl90aHJlYWRfcHJvYy5oIgotCi0jaWZkZWYgSEFWRV9TWVNMT0cKLSNpbmNsdWRlIDxzeXNsb2cuaD4KLQotI2RlZmluZSBBUExPR19FTUVSRyAgICAgTE9HX0VNRVJHICAgICAvKiBzeXN0ZW0gaXMgdW51c2FibGUgKi8KLSNkZWZpbmUgQVBMT0dfQUxFUlQgICAgIExPR19BTEVSVCAgICAgLyogYWN0aW9uIG11c3QgYmUgdGFrZW4gaW1tZWRpYXRlbHkgKi8KLSNkZWZpbmUgQVBMT0dfQ1JJVCAgICAgIExPR19DUklUICAgICAgLyogY3JpdGljYWwgY29uZGl0aW9ucyAqLwotI2RlZmluZSBBUExPR19FUlIgICAgICAgTE9HX0VSUiAgICAgICAvKiBlcnJvciBjb25kaXRpb25zICovCi0jZGVmaW5lIEFQTE9HX1dBUk5JTkcgICBMT0dfV0FSTklORyAgIC8qIHdhcm5pbmcgY29uZGl0aW9ucyAqLwotI2RlZmluZSBBUExPR19OT1RJQ0UgICAgTE9HX05PVElDRSAgICAvKiBub3JtYWwgYnV0IHNpZ25pZmljYW50IGNvbmRpdGlvbiAqLwotI2RlZmluZSBBUExPR19JTkZPICAgICAgTE9HX0lORk8gICAgICAvKiBpbmZvcm1hdGlvbmFsICovCi0jZGVmaW5lIEFQTE9HX0RFQlVHICAgICBMT0dfREVCVUcgICAgIC8qIGRlYnVnLWxldmVsIG1lc3NhZ2VzICovCi0KLSNkZWZpbmUgQVBMT0dfTEVWRUxNQVNLIExPR19QUklNQVNLICAgLyogbWFzayBvZmYgdGhlIGxldmVsIHZhbHVlICovCi0KLSNlbHNlCi0KLSNkZWZpbmUJQVBMT0dfRU1FUkcJMAkvKiBzeXN0ZW0gaXMgdW51c2FibGUgKi8KLSNkZWZpbmUJQVBMT0dfQUxFUlQJMQkvKiBhY3Rpb24gbXVzdCBiZSB0YWtlbiBpbW1lZGlhdGVseSAqLwotI2RlZmluZQlBUExPR19DUklUCTIJLyogY3JpdGljYWwgY29uZGl0aW9ucyAqLwotI2RlZmluZQlBUExPR19FUlIJMwkvKiBlcnJvciBjb25kaXRpb25zICovCi0jZGVmaW5lCUFQTE9HX1dBUk5JTkcJNAkvKiB3YXJuaW5nIGNvbmRpdGlvbnMgKi8KLSNkZWZpbmUJQVBMT0dfTk9USUNFCTUJLyogbm9ybWFsIGJ1dCBzaWduaWZpY2FudCBjb25kaXRpb24gKi8KLSNkZWZpbmUJQVBMT0dfSU5GTwk2CS8qIGluZm9ybWF0aW9uYWwgKi8KLSNkZWZpbmUJQVBMT0dfREVCVUcJNwkvKiBkZWJ1Zy1sZXZlbCBtZXNzYWdlcyAqLwotCi0jZGVmaW5lCUFQTE9HX0xFVkVMTUFTSwk3CS8qIG1hc2sgb2ZmIHRoZSBsZXZlbCB2YWx1ZSAqLwotCi0jZW5kaWYKLQotI2RlZmluZSBBUExPR19OT0VSUk5PCQkoQVBMT0dfTEVWRUxNQVNLICsgMSkKLQotLyogbm9ybWFsIGJ1dCBzaWduaWZpY2FudCBjb25kaXRpb24gb24gc3RhcnR1cCwgdXN1YWxseSBwcmludGVkIHRvIHN0ZGVyciAqLwotI2RlZmluZSBBUExPR19TVEFSVFVQICAgICAgICAgICAoKEFQTE9HX0xFVkVMTUFTSyArIDEpICogNCkgCi0KLSNpZm5kZWYgREVGQVVMVF9MT0dMRVZFTAotI2RlZmluZSBERUZBVUxUX0xPR0xFVkVMCUFQTE9HX1dBUk5JTkcKLSNlbmRpZgotCi0jZGVmaW5lIEFQTE9HX01BUksJX19GSUxFX18sX19MSU5FX18KLQotdm9pZCBhcF9vcGVuX2xvZ3MgKHNlcnZlcl9yZWMgKiwgYXBfY29udGV4dF90ICpwKTsKLQotLyogVGhlIHR3byBwcmltYXJ5IGxvZ2dpbmcgZnVuY3Rpb25zLCBhcF9sb2dfZXJyb3IgYW5kIGFwX2xvZ19yZXJyb3IsCi0gKiB1c2UgYSBwcmludGYgc3R5bGUgZm9ybWF0IHN0cmluZyB0byBidWlsZCB0aGUgbG9nIG1lc3NhZ2UuICBJdCBpcwotICogVkVSWSBJTVBPUlRBTlQgdGhhdCB5b3Ugbm90IGluY2x1ZGUgYW55IHJhdyBkYXRhIGZyb20gdGhlIG5ldHdvcmssCi0gKiBzdWNoIGFzIHRoZSByZXF1ZXN0LVVSSSBvciByZXF1ZXN0IGhlYWRlciBmaWVsZHMsIHdpdGhpbiB0aGUgZm9ybWF0Ci0gKiBzdHJpbmcuICBEb2luZyBzbyBtYWtlcyB0aGUgc2VydmVyIHZ1bG5lcmFibGUgdG8gYSBkZW5pYWwtb2Ytc2VydmljZQotICogYXR0YWNrIGFuZCBvdGhlciBtZXNzeSBiZWhhdmlvci4gIEluc3RlYWQsIHVzZSBhIHNpbXBsZSBmb3JtYXQgc3RyaW5nCi0gKiBsaWtlICIlcyIsIGZvbGxvd2VkIGJ5IHRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgdW50cnVzdGVkIGRhdGEuCi0gKi8KLUFQSV9FWFBPUlQodm9pZCkgYXBfbG9nX2Vycm9yKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBpbnQgbGV2ZWwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9zdGF0dXNfdCBzdGF0dXMsIGNvbnN0IHNlcnZlcl9yZWMgKnMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKLQkJCSAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLDYsNykpKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfbG9nX3JlcnJvcihjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IGxldmVsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9zdGF0dXNfdCBzdGF0dXMsIGNvbnN0IHJlcXVlc3RfcmVjICpzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKLQkJCSAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLDYsNykpKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfZXJyb3JfbG9nMnN0ZGVyciAoc2VydmVyX3JlYyAqKTsgICAgIAotCi12b2lkIGFwX2xvZ19waWQgKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqZm5hbWUpOwotLyogVGhlc2UgYXJlIGZvciBsZWdhY3kgY29kZSwgbmV3IGNvZGUgc2hvdWxkIHVzZSBhcF9sb2dfZXJyb3IsCi0gKiBvciBhcF9sb2dfcmVycm9yLgotICovCi1BUElfRVhQT1JUKHZvaWQpIGFwX2xvZ19lcnJvcl9vbGQoY29uc3QgY2hhciAqZXJyLCBzZXJ2ZXJfcmVjICpzKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfbG9nX3VuaXhlcnIoY29uc3QgY2hhciAqcm91dGluZSwgY29uc3QgY2hhciAqZmlsZSwKLQkJCSAgICAgY29uc3QgY2hhciAqbXNnLCBzZXJ2ZXJfcmVjICpzKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfbG9nX3ByaW50Zihjb25zdCBzZXJ2ZXJfcmVjICpzLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQkJCSAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLDIsMykpKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfbG9nX3JlYXNvbihjb25zdCBjaGFyICpyZWFzb24sIGNvbnN0IGNoYXIgKmZuYW1lLAotCQkJICAgIHJlcXVlc3RfcmVjICpyKTsKLQotdHlwZWRlZiBzdHJ1Y3QgcGlwZWRfbG9nIHsKLSAgICBhcF9jb250ZXh0X3QgKnA7Ci0gICAgYXBfZmlsZV90ICpmZHNbMl07Ci0gICAgLyogWFhYIC0gYW4gI2lmZGVmIHRoYXQgbmVlZHMgdG8gYmUgZWxpbWluYXRlZCBmcm9tIHB1YmxpYyB2aWV3LiBTaG91bGRuJ3QKLSAgICAgKiBiZSBoYXJkICovCi0jaWZkZWYgSEFWRV9SRUxJQUJMRV9QSVBFRF9MT0dTCi0gICAgY2hhciAqcHJvZ3JhbTsKLSAgICBhcF9wcm9jX3QgKnBpZDsKLSNlbmRpZgotfSBwaXBlZF9sb2c7Ci0KLUFQSV9FWFBPUlQocGlwZWRfbG9nICopIGFwX29wZW5fcGlwZWRfbG9nIChhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKnByb2dyYW0pOwotQVBJX0VYUE9SVCh2b2lkKSBhcF9jbG9zZV9waXBlZF9sb2cgKHBpcGVkX2xvZyAqKTsKLSNkZWZpbmUgYXBfcGlwZWRfbG9nX3JlYWRfZmQocGwpCSgocGwpLT5mZHNbMF0pCi0jZGVmaW5lIGFwX3BpcGVkX2xvZ193cml0ZV9mZChwbCkJKChwbCktPmZkc1sxXSkKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCS8qICFBUEFDSEVfSFRUUF9MT0dfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9odHRwX21haW4uaCBiL2luY2x1ZGUvaHR0cF9tYWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNWUwYjEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9odHRwX21haW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotI2lmbmRlZiBBUEFDSEVfSFRUUF9NQUlOX0gKLSNkZWZpbmUgQVBBQ0hFX0hUVFBfTUFJTl9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotZXh0ZXJuIE1PRFVMRV9WQVJfRVhQT1JUIGNvbnN0IGNoYXIgKmFwX3NlcnZlcl9hcmd2MDsKLWV4dGVybiBBUElfVkFSX0VYUE9SVCBjb25zdCBjaGFyICphcF9zZXJ2ZXJfcm9vdDsKLQotLyogZm9yIC1DLCAtYyBhbmQgLUQgc3dpdGNoZXMgKi8KLWV4dGVybiBhcF9hcnJheV9oZWFkZXJfdCAqYXBfc2VydmVyX3ByZV9yZWFkX2NvbmZpZzsKLWV4dGVybiBhcF9hcnJheV9oZWFkZXJfdCAqYXBfc2VydmVyX3Bvc3RfcmVhZF9jb25maWc7Ci1leHRlcm4gYXBfYXJyYXlfaGVhZGVyX3QgKmFwX3NlcnZlcl9jb25maWdfZGVmaW5lczsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCS8qICFBUEFDSEVfSFRUUF9NQUlOX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaHR0cF9wcm90b2NvbC5oIGIvaW5jbHVkZS9odHRwX3Byb3RvY29sLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYTdhYzIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9odHRwX3Byb3RvY29sLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLSNpZm5kZWYgQVBBQ0hFX0hUVFBfUFJPVE9DT0xfSAotI2RlZmluZSBBUEFDSEVfSFRUUF9QUk9UT0NPTF9ICi0KLSNpbmNsdWRlICJhcF9ob29rcy5oIgotI2luY2x1ZGUgImFwcl9wb3J0YWJsZS5oIgotI2luY2x1ZGUgImFwcl9tbWFwLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoKLSAqIFByb3RvdHlwZXMgZm9yIHJvdXRpbmVzIHdoaWNoIGVpdGhlciB0YWxrIGRpcmVjdGx5IGJhY2sgdG8gdGhlIHVzZXIsCi0gKiBvciBjb250cm9sIHRoZSBvbmVzIHRoYXQgZXZlbnR1YWxseSBkby4KLSAqLwotCi0vKiBSZWFkIGEgcmVxdWVzdCBhbmQgZmlsbCBpbiB0aGUgZmllbGRzLiAqLwotCi1yZXF1ZXN0X3JlYyAqYXBfcmVhZF9yZXF1ZXN0KGNvbm5fcmVjICpjKTsKLQotLyogU2VuZCBhIHNpbmdsZSBIVFRQIGhlYWRlciBmaWVsZCAqLwotCi1BUElfRVhQT1JUX05PTlNURChpbnQpIGFwX3NlbmRfaGVhZGVyX2ZpZWxkKHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICpmaWVsZG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmllbGR2YWwpOwotCi0vKiBTZW5kIHRoZSBtaW5pbWFsIHBhcnQgb2YgYW4gSFRUUCByZXNwb25zZSBoZWFkZXIuLi4gYnV0IG1vZHVsZXMgc2hvdWxkIGJlCi0gKiB2ZXJ5IGNhcmVmdWwgYWJvdXQgdXNpbmcgdGhpcywgYW5kIHNob3VsZCBwcmVmZXIgYXBfc2VuZF9odHRwX2hlYWRlcigpLgotICogTXVjaCBvZiB0aGUgSFRUUC8xLjEgaW1wbGVtZW50YXRpb24gY29ycmVjdG5lc3MgZGVwZW5kcyBvbiBjb2RlIGluCi0gKiBhcF9zZW5kX2h0dHBfaGVhZGVyKCkuCi0gKi8KLUFQSV9FWFBPUlQodm9pZCkgYXBfYmFzaWNfaHR0cF9oZWFkZXIocmVxdWVzdF9yZWMgKnIpOwotCi0vKiBTZW5kIHRoZSBTdGF0dXMtTGluZSBhbmQgaGVhZGVyIGZpZWxkcyBmb3IgSFRUUCByZXNwb25zZSAqLwotCi1BUElfRVhQT1JUKHZvaWQpIGFwX3NlbmRfaHR0cF9oZWFkZXIocmVxdWVzdF9yZWMgKmwpOwotCi0vKiBTZW5kIHRoZSByZXNwb25zZSB0byBzcGVjaWFsIG1ldGhvZCByZXF1ZXN0cyAqLwotCi1BUElfRVhQT1JUKGludCkgYXBfc2VuZF9odHRwX3RyYWNlKHJlcXVlc3RfcmVjICpyKTsKLWludCBhcF9zZW5kX2h0dHBfb3B0aW9ucyhyZXF1ZXN0X3JlYyAqcik7Ci0KLS8qIEZpbmlzaCB1cCBzdHVmZiBhZnRlciBhIHJlcXVlc3QgKi8KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9maW5hbGl6ZV9yZXF1ZXN0X3Byb3RvY29sKHJlcXVlc3RfcmVjICpyKTsKLQotLyogU2VuZCBlcnJvciBiYWNrIHRvIGNsaWVudC4uLiBsYXN0IGFyZyBpbmRpY2F0ZXMgZXJyb3Igc3RhdHVzIGluIGNhc2UKLSAqIHdlIGdldCBhbiBlcnJvciBpbiB0aGUgcHJvY2VzcyBvZiB0cnlpbmcgdG8gZGVhbCB3aXRoIGFuIEVycm9yRG9jdW1lbnQKLSAqIHRvIGhhbmRsZSBzb21lIG90aGVyIGVycm9yLiAgSW4gdGhhdCBjYXNlLCB3ZSBwcmludCB0aGUgZGVmYXVsdCByZXBvcnQKLSAqIGZvciB0aGUgZmlyc3QgdGhpbmcgdGhhdCB3ZW50IHdyb25nLCBhbmQgbW9yZSBicmllZmx5IHJlcG9ydCBvbiB0aGUKLSAqIHByb2JsZW0gd2l0aCB0aGUgRXJyb3JEb2N1bWVudC4KLSAqLwotCi1BUElfRVhQT1JUKHZvaWQpIGFwX3NlbmRfZXJyb3JfcmVzcG9uc2UocmVxdWVzdF9yZWMgKnIsIGludCByZWN1cnNpdmVfZXJyb3IpOwotCi0vKiBTZXQgbGFzdCBtb2RpZmllZCBoZWFkZXIgbGluZSBmcm9tIHRoZSBsYXN0bW9kIGRhdGUgb2YgdGhlIGFzc29jaWF0ZWQgZmlsZS4KLSAqIEFsc28sIHNldCBjb250ZW50IGxlbmd0aC4KLSAqCi0gKiBNYXkgcmV0dXJuIGFuIGVycm9yIHN0YXR1cywgdHlwaWNhbGx5IFVTRV9MT0NBTF9DT1BZICh0aGF0IHdoZW4gdGhlCi0gKiBwZXJtaXRfY2FjaGUgYXJndW1lbnQgaXMgc2V0IHRvIG9uZSkuCi0gKi8KLQotQVBJX0VYUE9SVChpbnQpIGFwX3NldF9jb250ZW50X2xlbmd0aChyZXF1ZXN0X3JlYyAqciwgbG9uZyBsZW5ndGgpOwotQVBJX0VYUE9SVChpbnQpIGFwX3NldF9rZWVwYWxpdmUocmVxdWVzdF9yZWMgKnIpOwotQVBJX0VYUE9SVChhcF90aW1lX3QpIGFwX3JhdGlvbmFsaXplX210aW1lKHJlcXVlc3RfcmVjICpyLCBhcF90aW1lX3QgbXRpbWUpOwotQVBJX0VYUE9SVChjaGFyICopIGFwX21ha2VfZXRhZyhyZXF1ZXN0X3JlYyAqciwgaW50IGZvcmNlX3dlYWspOwotQVBJX0VYUE9SVCh2b2lkKSBhcF9zZXRfZXRhZyhyZXF1ZXN0X3JlYyAqcik7Ci1BUElfRVhQT1JUKHZvaWQpIGFwX3NldF9sYXN0X21vZGlmaWVkKHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQoaW50KSBhcF9tZWV0c19jb25kaXRpb25zKHJlcXVlc3RfcmVjICpyKTsKLQotLyogT3RoZXIgd2F5cyB0byBzZW5kIHN0dWZmIGF0IHRoZSBjbGllbnQuICBBbGwgb2YgdGhlc2Uga2VlcCB0cmFjawotICogb2YgYnl0ZXNfc2VudCBhdXRvbWF0aWNhbGx5LiAgVGhpcyBpbmRpcmVjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlCi0gKiBpdCBhIGxpdHRsZSBtb3JlIHBhaW5sZXNzIHRvIHNsaWRlIHRoaW5ncyBsaWtlIEhUVFAtTkcgcGFja2V0aXphdGlvbgotICogdW5kZXJuZWF0aCB0aGUgbWFpbiBib2R5IG9mIHRoZSBjb2RlIGxhdGVyLiAgSW4gdGhlIG1lYW50aW1lLCBpdCBsZXRzCi0gKiB1cyBjZW50cmFsaXplIGEgYml0IG9mIGFjY291bnRpbmcgKGJ5dGVzX3NlbnQpLgotICoKLSAqIFRoZXNlIGFsc28gcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBieSB0aGUgY2FsbC4KLSAqIFRoZXkgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdpdGggYSB0aW1lb3V0IHJlZ2lzdGVyZWQsIGZvciBvYnZpb3VzIHJlYWFzb25zLgotICogKERpdHRvIHRoZSBzZW5kX2hlYWRlciBzdHVmZikuCi0gKi8KLQotQVBJX0VYUE9SVChsb25nKSBhcF9zZW5kX2ZkKGFwX2ZpbGVfdCAqZmQsIHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQobG9uZykgYXBfc2VuZF9mZF9sZW5ndGgoYXBfZmlsZV90ICpmZCwgcmVxdWVzdF9yZWMgKnIsIGxvbmcgbGVuZ3RoKTsKLQotQVBJX0VYUE9SVChsb25nKSBhcF9zZW5kX2ZiKEJVRkYgKmYsIHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQobG9uZykgYXBfc2VuZF9mYl9sZW5ndGgoQlVGRiAqZiwgcmVxdWVzdF9yZWMgKnIsIGxvbmcgbGVuZ3RoKTsKLQotQVBJX0VYUE9SVChzaXplX3QpIGFwX3NlbmRfbW1hcChhcF9tbWFwX3QgKm1tLCByZXF1ZXN0X3JlYyAqciwgc2l6ZV90IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCk7Ci0KLS8qIEhtbW0uLi4gY291bGQgbWFjcm9meSB0aGVzZSBmb3Igbm93LCBhbmQgbWF5YmUgZm9yZXZlciwgdGhvdWdoIHRoZQotICogZGVmaW5pdGlvbnMgb2YgdGhlIG1hY3JvcyB3b3VsZCBnZXQgYSB3aG9sZSBsb3QgaGFpcmllci4KLSAqLwotCi1BUElfRVhQT1JUKGludCkgYXBfcnB1dGMoaW50IGMsIHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQoaW50KSBhcF9ycHV0cyhjb25zdCBjaGFyICpzdHIsIHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQoaW50KSBhcF9yd3JpdGUoY29uc3Qgdm9pZCAqYnVmLCBpbnQgbmJ5dGUsIHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlRfTk9OU1REKGludCkgYXBfcnZwdXRzKHJlcXVlc3RfcmVjICpyLC4uLik7Ci1BUElfRVhQT1JUKGludCkgYXBfdnJwcmludGYocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCB2bGlzdCk7Ci1BUElfRVhQT1JUX05PTlNURChpbnQpIGFwX3JwcmludGYocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKmZtdCwuLi4pCi0JCQkJX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwyLDMpKSk7Ci1BUElfRVhQT1JUKGludCkgYXBfcmZsdXNoKHJlcXVlc3RfcmVjICpyKTsKLQotLyoKLSAqIEluZGV4IHVzZWQgaW4gY3VzdG9tX3Jlc3BvbnNlcyBhcnJheSBmb3IgYSBzcGVjaWZpYyBlcnJvciBjb2RlCi0gKiAob25seSB1c2Ugb3V0c2lkZSBwcm90b2NvbC5jIGlzIGluIGdldHRpbmcgdGhlbSBjb25maWd1cmVkKS4KLSAqLwotCi1BUElfRVhQT1JUKGludCkgYXBfaW5kZXhfb2ZfcmVzcG9uc2UoaW50IHN0YXR1cyk7Ci0KLS8qIFJlYWRpbmcgYSBibG9jayBvZiBkYXRhIGZyb20gdGhlIGNsaWVudCBjb25uZWN0aW9uIChlLmcuLCBQT1NUIGFyZykgKi8KLQotQVBJX0VYUE9SVChpbnQpIGFwX3NldHVwX2NsaWVudF9ibG9jayhyZXF1ZXN0X3JlYyAqciwgaW50IHJlYWRfcG9saWN5KTsKLUFQSV9FWFBPUlQoaW50KSBhcF9zaG91bGRfY2xpZW50X2Jsb2NrKHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQobG9uZykgYXBfZ2V0X2NsaWVudF9ibG9jayhyZXF1ZXN0X3JlYyAqciwgY2hhciAqYnVmZmVyLCBpbnQgYnVmc2l6KTsKLUFQSV9FWFBPUlQoaW50KSBhcF9kaXNjYXJkX3JlcXVlc3RfYm9keShyZXF1ZXN0X3JlYyAqcik7Ci0KLS8qIFNlbmRpbmcgYSBieXRlcmFuZ2UgKi8KLQotQVBJX0VYUE9SVChpbnQpIGFwX3NldF9ieXRlcmFuZ2UocmVxdWVzdF9yZWMgKnIpOwotQVBJX0VYUE9SVChpbnQpIGFwX2VhY2hfYnl0ZXJhbmdlKHJlcXVlc3RfcmVjICpyLCBhcF9vZmZfdCAqb2Zmc2V0LAotCQkJCSAgbG9uZyAqbGVuZ3RoKTsKLQotLyogU3VwcG9ydCBmb3IgdGhlIEJhc2ljIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sLiAgTm90ZSB0aGF0IHRoZXJlJ3MKLSAqIG5vdGhpbmcgdGhhdCBwcmV2ZW50cyB0aGVzZSBmcm9tIGJlaW5nIGluIG1vZF9hdXRoLmMsIGV4Y2VwdCB0aGF0IG90aGVyCi0gKiBtb2R1bGVzIHdoaWNoIHdhbnRlZCB0byBwcm92aWRlIHRoZWlyIG93biB2YXJpYW50cyBvbiBmaW5kaW5nIHVzZXJzIGFuZAotICogcGFzc3dvcmRzIGZvciBCYXNpYyBhdXRoIChhIGZhaXJseSBjb21tb24gcmVxdWVzdCkgd291bGQgdGhlbiByZXF1aXJlCi0gKiBtb2RfYXV0aCB0byBiZSBsb2FkZWQgb3IgdGhleSB3b3VsZG4ndCB3b3JrLgotICoKLSAqIGdldF9iYXNpY19hdXRoX3B3IHJldHVybnMgMCAoT0spIGlmIGl0IHNldCB0aGUgJ3B3JyBhcmd1bWVudCAoYW5kIGFzc3VyZWQKLSAqIGEgY29ycmVjdCB2YWx1ZSBpbiByLT5jb25uZWN0aW9uLT51c2VyKTsgb3RoZXJ3aXNlIGl0IHJldHVybnMgYW4gZXJyb3IKLSAqIGNvZGUsIGVpdGhlciBTRVJWRVJfRVJST1IgaWYgdGhpbmdzIGFyZSByZWFsbHkgY29uZnVzZWQsIEFVVEhfUkVRVUlSRUQKLSAqIGlmIG5vIGF1dGhlbnRpY2F0aW9uIGF0IGFsbCBzZWVtZWQgdG8gYmUgaW4gdXNlLCBvciBERUNMSU5FRCBpZiB0aGVyZQotICogd2FzIGF1dGhlbnRpY2F0aW9uIGJ1dCBpdCB3YXNuJ3QgQmFzaWMgKGluIHdoaWNoIGNhc2UsIHRoZSBjYWxsZXIgc2hvdWxkCi0gKiBwcmVzdW1hYmx5IGRlY2xpbmUgYXMgd2VsbCkuCi0gKgotICogbm90ZV9iYXNpY19hdXRoX2ZhaWx1cmUgYXJyYW5nZXMgZm9yIHRoZSByaWdodCBzdHVmZiB0byBiZSBzY3JpYmJsZWQgb24KLSAqIHRoZSBIVFRQIHJldHVybiBzbyB0aGF0IHRoZSBjbGllbnQga25vd3MgaG93IHRvIGF1dGhlbnRpY2F0ZSBpdHNlbGYgdGhlCi0gKiBuZXh0IHRpbWUuIEFzIGRvZXMgbm90ZV9kaWdlc3RfYXV0aF9mYWlsdXJlIGZvciBEaWdlc3QgYXV0aC4KLSAqCi0gKiBub3RlX2F1dGhfZmFpbHVyZSBkb2VzIHRoZSBzYW1lIHRoaW5nLCBidXQgd2lsbCBjYWxsIHRoZSBjb3JyZWN0IG9uZQotICogYmFzZWQgb24gdGhlIGF1dGhlbnRpY2F0aW9uIHR5cGUgaW4gdXNlLgotICoKLSAqLwotCi1BUElfRVhQT1JUKHZvaWQpIGFwX25vdGVfYXV0aF9mYWlsdXJlKHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfbm90ZV9iYXNpY19hdXRoX2ZhaWx1cmUocmVxdWVzdF9yZWMgKnIpOwotQVBJX0VYUE9SVCh2b2lkKSBhcF9ub3RlX2RpZ2VzdF9hdXRoX2ZhaWx1cmUocmVxdWVzdF9yZWMgKnIpOwotQVBJX0VYUE9SVChpbnQpIGFwX2dldF9iYXNpY19hdXRoX3B3KHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICoqcHcpOwotCi0vKgotICogU2V0dGluZyB1cCB0aGUgcHJvdG9jb2wgZmllbGRzIGZvciBzdWJzaWRpYXJ5IHJlcXVlc3RzLi4uCi0gKiBBbHNvLCBhIHdyYXB1cCBmdW5jdGlvbiB0byBrZWVwIHRoZSBpbnRlcm5hbCBhY2NvdW50aW5nIHN0cmFpZ2h0LgotICovCi0KLXZvaWQgYXBfc2V0X3N1Yl9yZXFfcHJvdG9jb2wocmVxdWVzdF9yZWMgKnJuZXcsIGNvbnN0IHJlcXVlc3RfcmVjICpyKTsKLXZvaWQgYXBfZmluYWxpemVfc3ViX3JlcV9wcm90b2NvbChyZXF1ZXN0X3JlYyAqc3ViX3IpOwotCi0vKiBUaGlzIGlzIGFsc28gdXNlZnVsIGZvciBwdXR0aW5nIHN1Yl9yZXFzIGFuZCBpbnRlcm5hbF9yZWRpcmVjdHMgdG9nZXRoZXIgKi8KLQotQ09SRV9FWFBPUlQodm9pZCkgYXBfcGFyc2VfdXJpKHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICp1cmkpOwotCi0vKiBHZXQgdGhlIG1ldGhvZCBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBzdHJpbmcsIGFzc3VtZWQgdG8KLSAqIGNvbnRhaW4gYW4gSFRUUCBtZXRob2QuICBSZXR1cm5zIE1fSU5WQUxJRCBpZiBub3QgcmVjb2duaXplZC4KLSAqLwotQVBJX0VYUE9SVChpbnQpIGFwX21ldGhvZF9udW1iZXJfb2YoY29uc3QgY2hhciAqbWV0aG9kKTsKLQotICAvKiBIb29rcyAqLwotICAvKgotICAgKiBwb3N0X3JlYWRfcmVxdWVzdCAtLS0gcnVuIHJpZ2h0IGFmdGVyIHJlYWRfcmVxdWVzdCBvciBpbnRlcm5hbF9yZWRpcmVjdCwKLSAgICogICAgICAgICAgICAgICAgICBhbmQgbm90IHJ1biBkdXJpbmcgYW55IHN1YnJlcXVlc3RzLgotICAgKi8KLURFQ0xBUkVfSE9PSyhpbnQscG9zdF9yZWFkX3JlcXVlc3QsKHJlcXVlc3RfcmVjICopKQotREVDTEFSRV9IT09LKGludCxsb2dfdHJhbnNhY3Rpb24sKHJlcXVlc3RfcmVjICopKQotREVDTEFSRV9IT09LKGNvbnN0IGNoYXIgKixodHRwX21ldGhvZCwoY29uc3QgcmVxdWVzdF9yZWMgKikpCi1ERUNMQVJFX0hPT0sodW5zaWduZWQgc2hvcnQsZGVmYXVsdF9wb3J0LChjb25zdCByZXF1ZXN0X3JlYyAqKSkKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCS8qICFBUEFDSEVfSFRUUF9QUk9UT0NPTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2h0dHBfcmVxdWVzdC5oIGIvaW5jbHVkZS9odHRwX3JlcXVlc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UwZmE3MS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2h0dHBfcmVxdWVzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaWZuZGVmIEFQQUNIRV9IVFRQX1JFUVVFU1RfSAotI2RlZmluZSBBUEFDSEVfSFRUUF9SRVFVRVNUX0gKLQotI2luY2x1ZGUgImFwX2hvb2tzLmgiCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogaHR0cF9yZXF1ZXN0LmMgaXMgdGhlIGNvZGUgd2hpY2ggaGFuZGxlcyB0aGUgbWFpbiBsaW5lIG9mIHJlcXVlc3QKLSAqIHByb2Nlc3NpbmcsIG9uY2UgYSByZXF1ZXN0IGhhcyBiZWVuIHJlYWQgaW4gKGZpbmRpbmcgdGhlIHJpZ2h0IHBlci0KLSAqIGRpcmVjdG9yeSBjb25maWd1cmF0aW9uLCBidWlsZGluZyBpdCBpZiBuZWNlc3NhcnksIGFuZCBjYWxsaW5nIGFsbAotICogdGhlIG1vZHVsZSBkaXNwYXRjaCBmdW5jdGlvbnMgaW4gdGhlIHJpZ2h0IG9yZGVyKS4KLSAqCi0gKiBUaGUgcGllY2VzIGhlcmUgd2hpY2ggYXJlIHB1YmxpYyB0byB0aGUgbW9kdWxlcywgYWxsb3cgdGhlbSB0byBsZWFybgotICogaG93IHRoZSBzZXJ2ZXIgd291bGQgaGFuZGxlIHNvbWUgb3RoZXIgZmlsZSBvciBVUkksIG9yIHBlcmhhcHMgZXZlbgotICogZGlyZWN0IHRoZSBzZXJ2ZXIgdG8gc2VydmUgdGhhdCBvdGhlciBmaWxlIGluc3RlYWQgb2YgdGhlIG9uZSB0aGUKLSAqIGNsaWVudCByZXF1ZXN0ZWQgZGlyZWN0bHkuCi0gKgotICogVGhlcmUgYXJlIHR3byB3YXlzIHRvIGRvIHRoYXQuICBUaGUgZmlyc3QgaXMgdGhlIHN1Yl9yZXF1ZXN0IG1lY2hhbmlzbSwKLSAqIHdoaWNoIGhhbmRsZXMgbG9va2luZyB1cCBmaWxlcyBhbmQgVVJJcyBhcyBhZGp1bmN0cyB0byBzb21lIG90aGVyCi0gKiByZXF1ZXN0IChlLmcuLCBkaXJlY3RvcnkgZW50cmllcyBmb3IgbXVsdGl2aWV3cyBhbmQgZGlyZWN0b3J5IGxpc3RpbmdzKTsKLSAqIHRoZSBsb29rdXAgZnVuY3Rpb25zIHN0b3Agc2hvcnQgb2YgYWN0dWFsbHkgcnVubmluZyB0aGUgcmVxdWVzdCwgYnV0Ci0gKiAoZS5nLiwgZm9yIGluY2x1ZGVzKSwgYSBtb2R1bGUgbWF5IGNhbGwgZm9yIHRoZSByZXF1ZXN0IHRvIGJlIHJ1bgotICogYnkgY2FsbGluZyBydW5fc3ViX3JlcS4gIFRoZSBzcGFjZSBhbGxvY2F0ZWQgdG8gY3JlYXRlIHN1Yl9yZXFzIGNhbiBiZQotICogcmVjbGFpbWVkIGJ5IGNhbGxpbmcgZGVzdHJveV9zdWJfcmVxIC0tLSBiZSBzdXJlIHRvIGNvcHkgYW55dGhpbmcgeW91IGNhcmUKLSAqIGFib3V0IHdoaWNoIHdhcyBhbGxvY2F0ZWQgaW4gaXRzIGFwX2NvbnRleHRfdCBlbHNld2hlcmUgYmVmb3JlIGRvaW5nIHRoaXMuCi0gKi8KLQotQVBJX0VYUE9SVChyZXF1ZXN0X3JlYyAqKSBhcF9zdWJfcmVxX2xvb2t1cF91cmkoY29uc3QgY2hhciAqbmV3X2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0X3JlYyAqcik7Ci1BUElfRVhQT1JUKHJlcXVlc3RfcmVjICopIGFwX3N1Yl9yZXFfbG9va3VwX2ZpbGUoY29uc3QgY2hhciAqbmV3X2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdF9yZWMgKnIpOwotQVBJX0VYUE9SVChyZXF1ZXN0X3JlYyAqKSBhcF9zdWJfcmVxX21ldGhvZF91cmkoY29uc3QgY2hhciAqbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmV3X2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0X3JlYyAqcik7Ci1BUElfRVhQT1JUKGludCkgYXBfcnVuX3N1Yl9yZXEocmVxdWVzdF9yZWMgKnIpOwotQVBJX0VYUE9SVCh2b2lkKSBhcF9kZXN0cm95X3N1Yl9yZXEocmVxdWVzdF9yZWMgKnIpOwotCi0vKgotICogVGhlbiB0aGVyZSdzIHRoZSBjYXNlIHRoYXQgeW91IHdhbnQgc29tZSBvdGhlciByZXF1ZXN0IHRvIGJlIHNlcnZlZAotICogYXMgdGhlIHRvcC1sZXZlbCByZXF1ZXN0IElOU1RFQUQgb2Ygd2hhdCB0aGUgY2xpZW50IHJlcXVlc3RlZCBkaXJlY3RseS4KLSAqIElmIHNvLCBjYWxsIHRoaXMgZnJvbSBhIGhhbmRsZXIsIGFuZCB0aGVuIGltbWVkaWF0ZWx5IHJldHVybiBPSy4KLSAqLwotCi1BUElfRVhQT1JUKHZvaWQpIGFwX2ludGVybmFsX3JlZGlyZWN0KGNvbnN0IGNoYXIgKm5ld191cmksIHJlcXVlc3RfcmVjICopOwotQVBJX0VYUE9SVCh2b2lkKSBhcF9pbnRlcm5hbF9yZWRpcmVjdF9oYW5kbGVyKGNvbnN0IGNoYXIgKm5ld191cmksIHJlcXVlc3RfcmVjICopOwotQVBJX0VYUE9SVChpbnQpIGFwX3NvbWVfYXV0aF9yZXF1aXJlZChyZXF1ZXN0X3JlYyAqcik7Ci1BUElfRVhQT1JUKGludCkgYXBfaXNfaW5pdGlhbF9yZXEocmVxdWVzdF9yZWMgKnIpOwotQVBJX0VYUE9SVCh2b2lkKSBhcF91cGRhdGVfbXRpbWUocmVxdWVzdF9yZWMgKnIsIGFwX3RpbWVfdCBkZXBlbmRlbmN5X210aW1lKTsKLQotI2lmZGVmIENPUkVfUFJJVkFURQotLyogRnVuY3Rpb24gY2FsbGVkIGJ5IG1haW4uYyB0byBoYW5kbGUgZmlyc3QtbGV2ZWwgcmVxdWVzdCAqLwotdm9pZCBhcF9wcm9jZXNzX3JlcXVlc3QocmVxdWVzdF9yZWMgKik7Ci1BUElfRVhQT1JUKHZvaWQpIGFwX2RpZShpbnQgdHlwZSwgcmVxdWVzdF9yZWMgKnIpOwotI2VuZGlmCi0KLSAgLyogSG9va3MgKi8KLURFQ0xBUkVfSE9PSyhpbnQsdHJhbnNsYXRlX25hbWUsKHJlcXVlc3RfcmVjICopKQotREVDTEFSRV9IT09LKGludCxjaGVja191c2VyX2lkLChyZXF1ZXN0X3JlYyAqKSkKLURFQ0xBUkVfSE9PSyhpbnQsZml4dXBzLChyZXF1ZXN0X3JlYyAqKSkKLURFQ0xBUkVfSE9PSyhpbnQsdHlwZV9jaGVja2VyLChyZXF1ZXN0X3JlYyAqKSkKLURFQ0xBUkVfSE9PSyhpbnQsYWNjZXNzX2NoZWNrZXIsKHJlcXVlc3RfcmVjICopKQotREVDTEFSRV9IT09LKGludCxhdXRoX2NoZWNrZXIsKHJlcXVlc3RfcmVjICopKQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYJLyogIUFQQUNIRV9IVFRQX1JFUVVFU1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9odHRwX3Zob3N0LmggYi9pbmNsdWRlL2h0dHBfdmhvc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFhNGZjYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2h0dHBfdmhvc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotI2lmbmRlZiBBUEFDSEVfSFRUUF9WSE9TVF9ICi0jZGVmaW5lIEFQQUNIRV9IVFRQX1ZIT1NUX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiBjYWxsZWQgYmVmb3JlIGFueSBjb25maWcgaXMgcmVhZCAqLwotdm9pZCBhcF9pbml0X3Zob3N0X2NvbmZpZyhhcF9jb250ZXh0X3QgKnApOwotCi0vKiBjYWxsZWQgYWZ0ZXIgdGhlIGNvbmZpZyBoYXMgYmVlbiByZWFkICovCi12b2lkIGFwX2Zpbmlfdmhvc3RfY29uZmlnKGFwX2NvbnRleHRfdCAqcCwgc2VydmVyX3JlYyAqbWFpbl9zZXJ2ZXIpOwotCi0vKiBoYW5kbGUgYWRkcmVzc2VzIGluIDxWaXJ0dWFsSG9zdD4gc3RhdGVtZW50ICovCi1jb25zdCBjaGFyICphcF9wYXJzZV92aG9zdF9hZGRycyhhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKmhvc3RuYW1lLCBzZXJ2ZXJfcmVjICpzKTsKLQotLyogaGFuZGxlIE5hbWVWaXJ0dWFsSG9zdCBkaXJlY3RpdmUgKi8KLWNvbnN0IGNoYXIgKmFwX3NldF9uYW1lX3ZpcnR1YWxfaG9zdCAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpOwotCi0vKiBnaXZlbiBhbiBpcCBhZGRyZXNzIG9ubHksIGdpdmUgb3VyIGJlc3QgZ3Vlc3MgYXMgdG8gd2hhdCB2aG9zdCBpdCBpcyAqLwotdm9pZCBhcF91cGRhdGVfdmhvc3RfZ2l2ZW5faXAoY29ubl9yZWMgKmNvbm4pOwotCi0vKiBUaGUgYWJvdmUgaXMgbmV2ZXIgZW5vdWdoLCBhbmQgdGhpcyBpcyBhbHdheXMgY2FsbGVkIGFmdGVyIHRoZSBoZWFkZXJzCi0gKiBoYXZlIGJlZW4gcmVhZC4gIEl0IG1heSBjaGFuZ2Ugci0+c2VydmVyLgotICovCi12b2lkIGFwX3VwZGF0ZV92aG9zdF9mcm9tX2hlYWRlcnMocmVxdWVzdF9yZWMgKnIpOwotCi0vKiByZXR1cm4gMSBpZiB0aGUgaG9zdDpwb3J0IG1hdGNoZXMgYW55IG9mIHRoZSBhbGlhc2VzIG9mIHItPnNlcnZlcgotICogcmV0dXJuIDAgb3RoZXJ3aXNlCi0gKi8KLUFQSV9FWFBPUlQoaW50KSBhcF9tYXRjaGVzX3JlcXVlc3Rfdmhvc3QocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKmhvc3QsCi0gICAgdW5zaWduZWQgcG9ydCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgkvKiAhQVBBQ0hFX0hUVFBfVkhPU1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9odHRwZC5oIGIvaW5jbHVkZS9odHRwZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWE4ZDA1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaHR0cGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNjQgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaWZuZGVmIEFQQUNIRV9IVFRQRF9ICi0jZGVmaW5lIEFQQUNIRV9IVFRQRF9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoKLSAqIGh0dHBkLmg6IGhlYWRlciBmb3Igc2ltcGxlIChoYSEgbm90IGFueW1vcmUpIGh0dHAgZGFlbW9uCi0gKi8KLQotLyogWFhYIC0gV2UgbmVlZCB0byBwdXNoIG1vcmUgc3R1ZmYgdG8gb3RoZXIgLmggZmlsZXMsIG9yIGV2ZW4gLmMgZmlsZXMsIHRvCi0gKiBtYWtlIHRoaXMgZmlsZSBzbWFsbGVyCi0gKi8KLQotCi0vKiBIZWFkZXJzIGluIHdoaWNoIEVWRVJZT05FIGhhcyBhbiBpbnRlcmVzdC4uLiAqLwotCi0jaW5jbHVkZSAiYXByX2dlbmVyYWwuaCIKLSNpbmNsdWRlICJhcHJfbGliLmgiCi0jaW5jbHVkZSAiYXByX3RpbWUuaCIKLSNpbmNsdWRlICJhcHJfbmV0d29ya19pby5oIgotI2luY2x1ZGUgImJ1ZmYuaCIKLSNpbmNsdWRlICJhcC5oIgotI2luY2x1ZGUgImFwX21tbi5oIgotCi0jaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jZW5kaWYKLQotI2lmZGVmIENPUkVfUFJJVkFURQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb25maWcgZGlyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBEZWZpbmUgdGhpcyB0byBiZSB0aGUgZGVmYXVsdCBzZXJ2ZXIgaG9tZSBkaXIuIE1vc3QgdGhpbmdzIGxhdGVyIGluIHRoaXMKLSAqIGZpbGUgd2l0aCBhIHJlbGF0aXZlIHBhdGhuYW1lIHdpbGwgaGF2ZSB0aGlzIGFkZGVkLgotICovCi0jaWZuZGVmIEhUVFBEX1JPT1QKLSNpZmRlZiBPUzIKLS8qIFNldCBkZWZhdWx0IGZvciBPUy8yIGZpbGUgc3lzdGVtICovCi0jZGVmaW5lIEhUVFBEX1JPT1QgIi9vczJodHRwZCIKLSNlbGlmIGRlZmluZWQoV0lOMzIpCi0vKiBTZXQgZGVmYXVsdCBmb3IgV2luZG93cyBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBIVFRQRF9ST09UICIvYXBhY2hlIgotI2VsaWYgZGVmaW5lZCAoQkVPUykKLS8qIFNldCB0aGUgZGVmYXVsdCBmb3IgQmVPUyAqLwotI2RlZmluZSBIVFRQRF9ST09UICIvYm9vdC9ob21lL2FwYWNoZSIKLSNlbHNlCi0jZGVmaW5lIEhUVFBEX1JPT1QgIi91c3IvbG9jYWwvYXBhY2hlIgotI2VuZGlmCi0jZW5kaWYgLyogSFRUUERfUk9PVCAqLwotCi0vKiAKLSAqIC0tLS0tLS0tLSBZb3Ugc2hvdWxkbid0IGhhdmUgdG8gZWRpdCBhbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgLS0tLS0tLS0tLQotICoKLSAqIEFueSBtb2RpZmljYXRpb25zIHRvIGFueSBkZWZhdWx0cyBub3QgZGVmaW5lZCBhYm92ZSBzaG91bGQgYmUgZG9uZSBpbiB0aGUgCi0gKiByZXNwZWN0aXZlIGNvbmZpZy4gZmlsZS4gCi0gKgotICovCi0KLS8qIERlZmF1bHQgbG9jYXRpb24gb2YgZG9jdW1lbnRzLiAgQ2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIERvY3VtZW50Um9vdAotICogZGlyZWN0aXZlLgotICovCi0jaWZuZGVmIERPQ1VNRU5UX0xPQ0FUSU9OCi0jaWZkZWYgT1MyCi0vKiBTZXQgZGVmYXVsdCBmb3IgT1MvMiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBET0NVTUVOVF9MT0NBVElPTiAgSFRUUERfUk9PVCAiL2RvY3MiCi0jZWxzZQotI2RlZmluZSBET0NVTUVOVF9MT0NBVElPTiAgSFRUUERfUk9PVCAiL2h0ZG9jcyIKLSNlbmRpZgotI2VuZGlmIC8qIERPQ1VNRU5UX0xPQ0FUSU9OICovCi0KLS8qIE1heC4gbnVtYmVyIG9mIGR5bmFtaWNhbGx5IGxvYWRlZCBtb2R1bGVzICovCi0jaWZuZGVmIERZTkFNSUNfTU9EVUxFX0xJTUlUCi0jZGVmaW5lIERZTkFNSUNfTU9EVUxFX0xJTUlUIDY0Ci0jZW5kaWYKLQotLyogRGVmYXVsdCBhZG1pbmlzdHJhdG9yJ3MgYWRkcmVzcyAqLwotI2RlZmluZSBERUZBVUxUX0FETUlOICJbbm8gYWRkcmVzcyBnaXZlbl0iCi0KLS8qIFRoZSB0YXJnZXQgbmFtZSBvZiB0aGUgaW5zdGFsbGVkIEFwYWNoZSAqLwotI2lmbmRlZiBUQVJHRVQKLSNkZWZpbmUgVEFSR0VUICJodHRwZCIKLSNlbmRpZgotCi0vKiAtLS0tLS0tLS0gRGVmYXVsdCB1c2VyIG5hbWUgYW5kIGdyb3VwIG5hbWUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIC0tLSBUaGVzZSBtYXkgYmUgc3BlY2lmaWVkIGFzIG51bWJlcnMgYnkgcGxhY2luZyBhICMgYmVmb3JlIGEgbnVtYmVyIC0tLSAqLwotCi0jaWZuZGVmIERFRkFVTFRfVVNFUgotI2RlZmluZSBERUZBVUxUX1VTRVIgIiMtMSIKLSNlbmRpZgotI2lmbmRlZiBERUZBVUxUX0dST1VQCi0jZGVmaW5lIERFRkFVTFRfR1JPVVAgIiMtMSIKLSNlbmRpZgotCi0vKiBUaGUgbmFtZSBvZiB0aGUgbG9nIGZpbGVzICovCi0jaWZuZGVmIERFRkFVTFRfWEZFUkxPRwotI2lmIGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTjMyKQotI2RlZmluZSBERUZBVUxUX1hGRVJMT0cgImxvZ3MvYWNjZXNzLmxvZyIKLSNlbHNlCi0jZGVmaW5lIERFRkFVTFRfWEZFUkxPRyAibG9ncy9hY2Nlc3NfbG9nIgotI2VuZGlmCi0jZW5kaWYgLyogREVGQVVMVF9YRkVSTE9HICovCi0KLSNpZm5kZWYgREVGQVVMVF9FUlJPUkxPRwotI2lmIGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTjMyKQotI2RlZmluZSBERUZBVUxUX0VSUk9STE9HICJsb2dzL2Vycm9yLmxvZyIKLSNlbHNlCi0jZGVmaW5lIERFRkFVTFRfRVJST1JMT0cgImxvZ3MvZXJyb3JfbG9nIgotI2VuZGlmCi0jZW5kaWYgLyogREVGQVVMVF9FUlJPUkxPRyAqLwotCi0vKiBEZWZpbmUgdGhpcyB0byBiZSB3aGF0IHlvdXIgcGVyLWRpcmVjdG9yeSBzZWN1cml0eSBmaWxlcyBhcmUgY2FsbGVkICovCi0jaWZuZGVmIERFRkFVTFRfQUNDRVNTX0ZOQU1FCi0jaWZkZWYgT1MyCi0vKiBTZXQgZGVmYXVsdCBmb3IgT1MvMiBmaWxlIHN5c3RlbSAqLwotI2RlZmluZSBERUZBVUxUX0FDQ0VTU19GTkFNRSAiaHRhY2Nlc3MiCi0jZWxzZQotI2RlZmluZSBERUZBVUxUX0FDQ0VTU19GTkFNRSAiLmh0YWNjZXNzIgotI2VuZGlmCi0jZW5kaWYgLyogREVGQVVMVF9BQ0NFU1NfRk5BTUUgKi8KLQotLyogVGhlIG5hbWUgb2YgdGhlIHNlcnZlciBjb25maWcgZmlsZSAqLwotI2lmbmRlZiBTRVJWRVJfQ09ORklHX0ZJTEUKLSNkZWZpbmUgU0VSVkVSX0NPTkZJR19GSUxFICJjb25mL2h0dHBkLmNvbmYiCi0jZW5kaWYKLQotLyogVGhlIG5hbWUgb2YgdGhlIGRvY3VtZW50IGNvbmZpZyBmaWxlICovCi0jaWZuZGVmIFJFU09VUkNFX0NPTkZJR19GSUxFCi0jZGVmaW5lIFJFU09VUkNFX0NPTkZJR19GSUxFICJjb25mL3NybS5jb25mIgotI2VuZGlmCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBhY2Nlc3MgZmlsZSAqLwotI2lmbmRlZiBBQ0NFU1NfQ09ORklHX0ZJTEUKLSNkZWZpbmUgQUNDRVNTX0NPTkZJR19GSUxFICJjb25mL2FjY2Vzcy5jb25mIgotI2VuZGlmCi0KLS8qIFdoZXRoZXIgd2Ugc2hvdWxkIGVuYWJsZSByZmMxNDEzIGlkZW50aXR5IGNoZWNraW5nICovCi0jaWZuZGVmIERFRkFVTFRfUkZDMTQxMwotI2RlZmluZSBERUZBVUxUX1JGQzE0MTMgMAotI2VuZGlmCi0KLS8qIFRoZSBkZWZhdWx0IHBhdGggZm9yIENHSSBzY3JpcHRzIGlmIG5vbmUgaXMgY3VycmVudGx5IHNldCAqLwotI2lmbmRlZiBERUZBVUxUX1BBVEgKLSNkZWZpbmUgREVGQVVMVF9QQVRIICIvYmluOi91c3IvYmluOi91c3IvdWNiOi91c3IvYnNkOi91c3IvbG9jYWwvYmluIgotI2VuZGlmCi0KLS8qIFRoZSBwYXRoIHRvIHRoZSBzdUV4ZWMgd3JhcHBlciwgY2FuIGJlIG92ZXJyaWRkZW4gaW4gQ29uZmlndXJhdGlvbiAqLwotI2lmbmRlZiBTVUVYRUNfQklOCi0jZGVmaW5lIFNVRVhFQ19CSU4gIEhUVFBEX1JPT1QgIi9zYmluL3N1ZXhlYyIKLSNlbmRpZgotCi0vKiBUaGUgdGltZW91dCBmb3Igd2FpdGluZyBmb3IgbWVzc2FnZXMgKi8KLSNpZm5kZWYgREVGQVVMVF9USU1FT1VUCi0jZGVmaW5lIERFRkFVTFRfVElNRU9VVCAxMjAwMDAgCi0jZW5kaWYKLQotLyogVGhlIHRpbWVvdXQgZm9yIHdhaXRpbmcgZm9yIGtlZXBhbGl2ZSB0aW1lb3V0IHVudGlsIG5leHQgcmVxdWVzdCAqLwotI2lmbmRlZiBERUZBVUxUX0tFRVBBTElWRV9USU1FT1VUCi0jZGVmaW5lIERFRkFVTFRfS0VFUEFMSVZFX1RJTUVPVVQgMzAwCi0jZW5kaWYKLQotLyogVGhlIG51bWJlciBvZiByZXF1ZXN0cyB0byBlbnRlcnRhaW4gcGVyIGNvbm5lY3Rpb24gKi8KLSNpZm5kZWYgREVGQVVMVF9LRUVQQUxJVkUKLSNkZWZpbmUgREVGQVVMVF9LRUVQQUxJVkUgMTAwCi0jZW5kaWYKLQotLyogVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBxdWV1ZSBvZiBwZW5kaW5nIGNvbm5lY3Rpb25zLCBhcyBkZWZpbmVkCi0gKiBieSBsaXN0ZW4oMikuICBVbmRlciBzb21lIHN5c3RlbXMsIGl0IHNob3VsZCBiZSBpbmNyZWFzZWQgaWYgeW91Ci0gKiBhcmUgZXhwZXJpZW5jaW5nIGEgaGVhdnkgVENQIFNZTiBmbG9vZCBhdHRhY2suCi0gKgotICogSXQgZGVmYXVsdHMgdG8gNTExIGluc3RlYWQgb2YgNTEyIGJlY2F1c2Ugc29tZSBzeXN0ZW1zIHN0b3JlIGl0IAotICogYXMgYW4gOC1iaXQgZGF0YXR5cGU7IDUxMiB0cnVuY2F0ZWQgdG8gOC1iaXRzIGlzIDAsIHdoaWxlIDUxMSBpcyAKLSAqIDI1NSB3aGVuIHRydW5jYXRlZC4KLSAqLwotCi0jaWZuZGVmIERFRkFVTFRfTElTVEVOQkFDS0xPRwotI2RlZmluZSBERUZBVUxUX0xJU1RFTkJBQ0tMT0cgNTExCi0jZW5kaWYKLQotLyogTGltaXRzIG9uIHRoZSBzaXplIG9mIHZhcmlvdXMgcmVxdWVzdCBpdGVtcy4gIFRoZXNlIGxpbWl0cyBwcmltYXJpbHkKLSAqIGV4aXN0IHRvIHByZXZlbnQgc2ltcGxlIGRlbmlhbC1vZi1zZXJ2aWNlIGF0dGFja3Mgb24gYSBzZXJ2ZXIgYmFzZWQKLSAqIG9uIG1pc3VzZSBvZiB0aGUgcHJvdG9jb2wuICBUaGUgcmVjb21tZW5kZWQgdmFsdWVzIHdpbGwgZGVwZW5kIG9uIHRoZQotICogbmF0dXJlIG9mIHRoZSBzZXJ2ZXIgcmVzb3VyY2VzIC0tIENHSSBzY3JpcHRzIGFuZCBkYXRhYmFzZSBiYWNrZW5kcwotICogbWlnaHQgcmVxdWlyZSBsYXJnZSB2YWx1ZXMsIGJ1dCBtb3N0IHNlcnZlcnMgY291bGQgZ2V0IGJ5IHdpdGggbXVjaAotICogc21hbGxlciBsaW1pdHMgdGhhbiB3ZSB1c2UgYmVsb3cuICBUaGUgcmVxdWVzdCBtZXNzYWdlIGJvZHkgc2l6ZSBjYW4KLSAqIGJlIGxpbWl0ZWQgYnkgdGhlIHBlci1kaXIgY29uZmlnIGRpcmVjdGl2ZSBMaW1pdFJlcXVlc3RCb2R5LgotICoKLSAqIEludGVybmFsIGJ1ZmZlciBzaXplcyBhcmUgdHdvIGJ5dGVzIG1vcmUgdGhhbiB0aGUgREVGQVVMVF9MSU1JVF9SRVFVRVNUX0xJTkUKLSAqIGFuZCBERUZBVUxUX0xJTUlUX1JFUVVFU1RfRklFTERTSVpFIGJlbG93LCB3aGljaCBleHBsYWlucyB0aGUgODE5MC4KLSAqIFRoZXNlIHR3byBsaW1pdHMgY2FuIGJlIGxvd2VyZWQgKGJ1dCBub3QgcmFpc2VkKSBieSB0aGUgc2VydmVyIGNvbmZpZwotICogZGlyZWN0aXZlcyBMaW1pdFJlcXVlc3RMaW5lIGFuZCBMaW1pdFJlcXVlc3RGaWVsZHNpemUsIHJlc3BlY3RpdmVseS4KLSAqCi0gKiBERUZBVUxUX0xJTUlUX1JFUVVFU1RfRklFTERTIGNhbiBiZSBtb2RpZmllZCBvciBkaXNhYmxlZCAoc2V0ID0gMCkgYnkKLSAqIHRoZSBzZXJ2ZXIgY29uZmlnIGRpcmVjdGl2ZSBMaW1pdFJlcXVlc3RGaWVsZHMuCi0gKi8KLSNpZm5kZWYgREVGQVVMVF9MSU1JVF9SRVFVRVNUX0xJTkUKLSNkZWZpbmUgREVGQVVMVF9MSU1JVF9SRVFVRVNUX0xJTkUgODE5MAotI2VuZGlmIC8qIGRlZmF1bHQgbGltaXQgb24gYnl0ZXMgaW4gUmVxdWVzdC1MaW5lIChNZXRob2QrVVJJK0hUVFAtdmVyc2lvbikgKi8KLSNpZm5kZWYgREVGQVVMVF9MSU1JVF9SRVFVRVNUX0ZJRUxEU0laRQotI2RlZmluZSBERUZBVUxUX0xJTUlUX1JFUVVFU1RfRklFTERTSVpFIDgxOTAKLSNlbmRpZiAvKiBkZWZhdWx0IGxpbWl0IG9uIGJ5dGVzIGluIGFueSBvbmUgaGVhZGVyIGZpZWxkICAqLwotI2lmbmRlZiBERUZBVUxUX0xJTUlUX1JFUVVFU1RfRklFTERTCi0jZGVmaW5lIERFRkFVTFRfTElNSVRfUkVRVUVTVF9GSUVMRFMgMTAwCi0jZW5kaWYgLyogZGVmYXVsdCBsaW1pdCBvbiBudW1iZXIgb2YgcmVxdWVzdCBoZWFkZXIgZmllbGRzICovCi0KLS8qCi0gKiBUaGUgYmVsb3cgZGVmaW5lcyB0aGUgYmFzZSBzdHJpbmcgb2YgdGhlIFNlcnZlcjogaGVhZGVyLiBBZGRpdGlvbmFsCi0gKiB0b2tlbnMgY2FuIGJlIGFkZGVkIHZpYSB0aGUgYXBfYWRkX3ZlcnNpb25fY29tcG9uZW50KCkgQVBJIGNhbGwuCi0gKgotICogVGhlIHRva2VucyBhcmUgbGlzdGVkIGluIG9yZGVyIG9mIHRoZWlyIHNpZ25pZmljYW5jZSBmb3IgaWRlbnRpZnlpbmcgdGhlCi0gKiBhcHBsaWNhdGlvbi4KLSAqCi0gKiAiUHJvZHVjdCB0b2tlbnMgc2hvdWxkIGJlIHNob3J0IGFuZCB0byB0aGUgcG9pbnQgLS0gdXNlIG9mIHRoZW0gZm9yIAotICogYWR2ZXJ0aXppbmcgb3Igb3RoZXIgbm9uLWVzc2VudGlhbCBpbmZvcm1hdGlvbiBpcyBleHBsaWNpdGx5IGZvcmJpZGRlbi4iCi0gKgotICogRXhhbXBsZTogIkFwYWNoZS8xLjEuMCBNcldpZGdldC8wLjEtYWxwaGEiIAotICovCi0KLS8qIERlZmluZSB0aGlzIHRvIDEgaWYgeW91IHdhbnQgZmFuY3kgaW5kZXhpbmcsIDAgb3RoZXJ3aXNlICovCi0jaWZuZGVmIERFRkFVTFRfSU5ERVhJTkcKLSNkZWZpbmUgREVGQVVMVF9JTkRFWElORyAwCi0jZW5kaWYKLSNlbmRpZiAvKiBDT1JFX1BSSVZBVEUgKi8KLQotI2RlZmluZSBBUF9TRVJWRVJfQkFTRVZFUlNJT04gIkFwYWNoZS8yLjAtZGV2IiAgICAgICAvKiBTRUUgQ09NTUVOVFMgQUJPVkUgKi8KLSNkZWZpbmUgQVBfU0VSVkVSX1ZFUlNJT04gIEFQX1NFUlZFUl9CQVNFVkVSU0lPTgotCi0jZGVmaW5lIEFQX1NFUlZFUl9QUk9UT0NPTCAiSFRUUC8xLjEiCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tIHN0dWZmIHRoYXQgbW9kdWxlcyBhcmUgYWxsb3dlZCB0byBsb29rIGF0IC0tLS0tLS0tLS0tICovCi0KLS8qIERlZmluZSB0aGlzIHRvIGJlIHdoYXQgeW91ciBIVE1MIGRpcmVjdG9yeSBjb250ZW50IGZpbGVzIGFyZSBjYWxsZWQgKi8KLSNpZm5kZWYgQVBfREVGQVVMVF9JTkRFWAotI2RlZmluZSBBUF9ERUZBVUxUX0lOREVYICJpbmRleC5odG1sIgotI2VuZGlmCi0KLQotLyogRGVmaW5lIHRoaXMgdG8gYmUgd2hhdCB0eXBlIHlvdSdkIGxpa2UgcmV0dXJuZWQgZm9yIGZpbGVzIHdpdGggdW5rbm93biAqLwotLyogc3VmZml4ZXMuICBNVVNUIGJlIGFsbCBsb3dlciBjYXNlLiAqLwotI2lmbmRlZiBERUZBVUxUX0NPTlRFTlRfVFlQRQotI2RlZmluZSBERUZBVUxUX0NPTlRFTlRfVFlQRSAidGV4dC9wbGFpbiIKLSNlbmRpZgotCi0vKiBUaGUgbmFtZSBvZiB0aGUgTUlNRSB0eXBlcyBmaWxlICovCi0jaWZuZGVmIEFQX1RZUEVTX0NPTkZJR19GSUxFCi0jZGVmaW5lIEFQX1RZUEVTX0NPTkZJR19GSUxFICJjb25mL21pbWUudHlwZXMiCi0jZW5kaWYKLQotLyoKLSAqIERlZmluZSB0aGUgSFRNTCBkb2N0eXBlIHN0cmluZ3MgY2VudHJhbGx5LgotICovCi0jZGVmaW5lIERPQ1RZUEVfSFRNTF8yXzAgICI8IURPQ1RZUEUgSFRNTCBQVUJMSUMgXCItLy9JRVRGLy8iIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkRURCBIVE1MIDIuMC8vRU5cIj5cbiIKLSNkZWZpbmUgRE9DVFlQRV9IVE1MXzNfMiAgIjwhRE9DVFlQRSBIVE1MIFBVQkxJQyBcIi0vL1czQy8vIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJEVEQgSFRNTCAzLjIgRmluYWwvL0VOXCI+XG4iCi0jZGVmaW5lIERPQ1RZUEVfSFRNTF80XzBTICI8IURPQ1RZUEUgSFRNTCBQVUJMSUMgXCItLy9XM0MvLyIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAiRFREIEhUTUwgNC4wLy9FTlwiXG4iIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9zdHJpY3QuZHRkXCI+XG4iCi0jZGVmaW5lIERPQ1RZUEVfSFRNTF80XzBUICI8IURPQ1RZUEUgSFRNTCBQVUJMSUMgXCItLy9XM0MvLyIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAiRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU5cIlxuIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJcImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvbG9vc2UuZHRkXCI+XG4iCi0jZGVmaW5lIERPQ1RZUEVfSFRNTF80XzBGICI8IURPQ1RZUEUgSFRNTCBQVUJMSUMgXCItLy9XM0MvLyIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAiRFREIEhUTUwgNC4wIEZyYW1lc2V0Ly9FTlwiXG4iIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9mcmFtZXNldC5kdGRcIj5cbiIKLQotLyogLS0gSW50ZXJuYWwgcmVwcmVzZW50YXRpb24gZm9yIGEgSFRUUCBwcm90b2NvbCBudW1iZXIsIGUuZy4sIEhUVFAvMS4xIC0tICovCi0KLSNkZWZpbmUgSFRUUF9WRVJTSU9OKG1ham9yLG1pbm9yKSAoMTAwMCoobWFqb3IpKyhtaW5vcikpCi0jZGVmaW5lIEhUVFBfVkVSU0lPTl9NQUpPUihudW1iZXIpICgobnVtYmVyKS8xMDAwKQotI2RlZmluZSBIVFRQX1ZFUlNJT05fTUlOT1IobnVtYmVyKSAoKG51bWJlciklMTAwMCkKLQotLyogLS0tLS0tLS0tLS0tLS0gUG9ydCBudW1iZXIgZm9yIHNlcnZlciBydW5uaW5nIHN0YW5kYWxvbmUgLS0tLS0tLS0tLS0tLS0tICovCi0KLSNkZWZpbmUgREVGQVVMVF9IVFRQX1BPUlQJODAKLSNkZWZpbmUgREVGQVVMVF9IVFRQU19QT1JUCTQ0MwotI2RlZmluZSBhcF9pc19kZWZhdWx0X3BvcnQocG9ydCxyKQkoKHBvcnQpID09IGFwX2RlZmF1bHRfcG9ydChyKSkKLSNkZWZpbmUgYXBfaHR0cF9tZXRob2QocikJYXBfcnVuX2h0dHBfbWV0aG9kKHIpCi0jZGVmaW5lIGFwX2RlZmF1bHRfcG9ydChyKQlhcF9ydW5fZGVmYXVsdF9wb3J0KHIpCi0KLS8qIFRoZSBkZWZhdWx0IHN0cmluZyBsZW5ndGhzICovCi0jZGVmaW5lIE1BWF9TVFJJTkdfTEVOIEhVR0VfU1RSSU5HX0xFTgotI2RlZmluZSBIVUdFX1NUUklOR19MRU4gODE5MgotCi0vKiBUaGUgc2l6ZSBvZiB0aGUgc2VydmVyJ3MgaW50ZXJuYWwgcmVhZC13cml0ZSBidWZmZXJzICovCi0jZGVmaW5lIElPQlVGU0laRSA4MTkyCi0KLS8qCi0gKiBTcGVjaWFsIEFwYWNoZSBlcnJvciBjb2Rlcy4gVGhlc2UgYXJlIGJhc2ljYWxseSB1c2VkCi0gKiAgaW4gaHR0cF9tYWluLmMgc28gd2UgY2FuIGtlZXAgdHJhY2sgb2YgdmFyaW91cyBlcnJvcnMuCi0gKgotICogICBBUEVYSVRfT0s6Ci0gKiAgICAgQSBub3JtYWwgZXhpdAotICogICBBUEVYSVRfSU5JVDoKLSAqICAgICBBIGZhdGFsIGVycm9yIGFyaXNpbmcgZHVyaW5nIHRoZSBzZXJ2ZXIncyBpbml0IHNlcXVlbmNlCi0gKiAgIEFQRVhJVF9DSElMRElOSVQ6Ci0gKiAgICAgVGhlIGNoaWxkIGRpZWQgZHVyaW5nIGl0J3MgaW5pdCBzZXF1ZW5jZQotICogICBBUEVYSVRfQ0hJTERGQVRBTDoKLSAqICAgICBBIGZhdGFsIGVycm9yLCByZXN1bHRpbmcgaW4gdGhlIHdob2xlIHNlcnZlciBhYm9ydGluZy4KLSAqICAgICBJZiBhIGNoaWxkIGV4aXRzIHdpdGggdGhpcyBlcnJvciwgdGhlIHBhcmVudCBwcm9jZXNzCi0gKiAgICAgY29uc2lkZXJzIHRoaXMgYSBzZXJ2ZXItd2lkZSBmYXRhbCBlcnJvciBhbmQgYWJvcnRzLgotICogICAgICAgICAgICAgICAgIAotICovCi0jZGVmaW5lIEFQRVhJVF9PSwkJMHgwCi0jZGVmaW5lIEFQRVhJVF9JTklUCQkweDIKLSNkZWZpbmUgQVBFWElUX0NISUxESU5JVAkweDMKLSNkZWZpbmUgQVBFWElUX0NISUxERkFUQUwJMHhmCi0KLS8qIFRPRE86IHJlLWltcGxlbWVudCB0aGUgc2VydmVyIHRva2VuL3ZlcnNpb24gc3R1ZmYgLS0gaXQncyBwYXJ0IG9mIGh0dHBfY29yZQotICogaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGRvIHdpdGhvdXQgdG91Y2hpbmcgaHR0cF9tYWluIGF0IGFsbC4gKG9yIGVsc2UKLSAqIHdlIGhhdmVuJ3QgZ290IGVub3VnaCBtb2R1bGUgaG9va3MpCi0gKi8KLQotZW51bSBzZXJ2ZXJfdG9rZW5fdHlwZSB7Ci0gICAgU3J2VGtfTUlOLAkJLyogZWc6IEFwYWNoZS8xLjMuMCAqLwotICAgIFNydlRrX09TLAkJLyogZWc6IEFwYWNoZS8xLjMuMCAoVU5JWCkgKi8KLSAgICBTcnZUa19GVUxMCQkvKiBlZzogQXBhY2hlLzEuMy4wIChVTklYKSBQSFAvMy4wIEZvb0Jhci8xLjJiICovCi19OwotCi0jaWYgMAotQVBJX0VYUE9SVChjb25zdCBjaGFyICopIGFwX2dldF9zZXJ2ZXJfdmVyc2lvbih2b2lkKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfYWRkX3ZlcnNpb25fY29tcG9uZW50KGNvbnN0IGNoYXIgKmNvbXBvbmVudCk7Ci0jZWxzZQotI2RlZmluZSBhcF9nZXRfc2VydmVyX3ZlcnNpb24oKQkoQVBfU0VSVkVSX0JBU0VWRVJTSU9OKQotI2RlZmluZSBhcF9hZGRfdmVyc2lvbl9jb21wb25lbnQoeCkgKCh2b2lkKTApCi0jZW5kaWYKLUFQSV9FWFBPUlQoY29uc3QgY2hhciAqKSBhcF9nZXRfc2VydmVyX2J1aWx0KHZvaWQpOwotCi0vKiBOdW1lcmljIHJlbGVhc2UgdmVyc2lvbiBpZGVudGlmaWVyOiBNTU5ORkZSQkI6IG1ham9yIG1pbm9yIGZpeCBmaW5hbCBiZXRhCi0gKiBBbHdheXMgaW5jcmVhc2VzIGFsb25nIHRoZSBzYW1lIHRyYWNrIGFzIHRoZSBzb3VyY2UgYnJhbmNoLgotICogRm9yIGV4YW1wbGUsIEFwYWNoZSAxLjQuMiB3b3VsZCBiZSAnMTA0MDIxMDAnLCAyLjViNyB3b3VsZCBiZSAnMjA1MDAwMDcnLgotICovCi0jZGVmaW5lIEFQQUNIRV9SRUxFQVNFIDEwMzA5MTAwCi0KLSNkZWZpbmUgREVDTElORUQgLTEJCS8qIE1vZHVsZSBkZWNsaW5lcyB0byBoYW5kbGUgKi8KLSNkZWZpbmUgRE9ORSAtMgkJCS8qIE1vZHVsZSBoYXMgc2VydmVkIHRoZSByZXNwb25zZSBjb21wbGV0ZWx5IAotCQkJCSAqICAtIGl0J3Mgc2FmZSB0byBkaWUoKSB3aXRoIG5vIG1vcmUgb3V0cHV0Ci0JCQkJICovCi0jZGVmaW5lIE9LIDAJCQkvKiBNb2R1bGUgaGFzIGhhbmRsZWQgdGhpcyBzdGFnZS4gKi8KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIVFRQIFN0YXR1cyBDb2RlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBUaGUgc2l6ZSBvZiB0aGUgc3RhdGljIGFycmF5IGluIGh0dHBfcHJvdG9jb2wuYyBmb3Igc3RvcmluZwotICogYWxsIG9mIHRoZSBwb3RlbnRpYWwgcmVzcG9uc2Ugc3RhdHVzLWxpbmVzIChhIHNwYXJzZSB0YWJsZSkuCi0gKiBBIGZ1dHVyZSB2ZXJzaW9uIHNob3VsZCBkeW5hbWljYWxseSBnZW5lcmF0ZSB0aGUgYXBfdGFibGVfdCBhdCBzdGFydHVwLgotICovCi0jZGVmaW5lIFJFU1BPTlNFX0NPREVTIDU1Ci0KLSNkZWZpbmUgSFRUUF9DT05USU5VRSAgICAgICAgICAgICAgICAgICAgICAxMDAKLSNkZWZpbmUgSFRUUF9TV0lUQ0hJTkdfUFJPVE9DT0xTICAgICAgICAgICAxMDEKLSNkZWZpbmUgSFRUUF9QUk9DRVNTSU5HICAgICAgICAgICAgICAgICAgICAxMDIKLSNkZWZpbmUgSFRUUF9PSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAKLSNkZWZpbmUgSFRUUF9DUkVBVEVEICAgICAgICAgICAgICAgICAgICAgICAyMDEKLSNkZWZpbmUgSFRUUF9BQ0NFUFRFRCAgICAgICAgICAgICAgICAgICAgICAyMDIKLSNkZWZpbmUgSFRUUF9OT05fQVVUSE9SSVRBVElWRSAgICAgICAgICAgICAyMDMKLSNkZWZpbmUgSFRUUF9OT19DT05URU5UICAgICAgICAgICAgICAgICAgICAyMDQKLSNkZWZpbmUgSFRUUF9SRVNFVF9DT05URU5UICAgICAgICAgICAgICAgICAyMDUKLSNkZWZpbmUgSFRUUF9QQVJUSUFMX0NPTlRFTlQgICAgICAgICAgICAgICAyMDYKLSNkZWZpbmUgSFRUUF9NVUxUSV9TVEFUVVMgICAgICAgICAgICAgICAgICAyMDcKLSNkZWZpbmUgSFRUUF9NVUxUSVBMRV9DSE9JQ0VTICAgICAgICAgICAgICAzMDAKLSNkZWZpbmUgSFRUUF9NT1ZFRF9QRVJNQU5FTlRMWSAgICAgICAgICAgICAzMDEKLSNkZWZpbmUgSFRUUF9NT1ZFRF9URU1QT1JBUklMWSAgICAgICAgICAgICAzMDIKLSNkZWZpbmUgSFRUUF9TRUVfT1RIRVIgICAgICAgICAgICAgICAgICAgICAzMDMKLSNkZWZpbmUgSFRUUF9OT1RfTU9ESUZJRUQgICAgICAgICAgICAgICAgICAzMDQKLSNkZWZpbmUgSFRUUF9VU0VfUFJPWFkgICAgICAgICAgICAgICAgICAgICAzMDUKLSNkZWZpbmUgSFRUUF9URU1QT1JBUllfUkVESVJFQ1QgICAgICAgICAgICAzMDcKLSNkZWZpbmUgSFRUUF9CQURfUkVRVUVTVCAgICAgICAgICAgICAgICAgICA0MDAKLSNkZWZpbmUgSFRUUF9VTkFVVEhPUklaRUQgICAgICAgICAgICAgICAgICA0MDEKLSNkZWZpbmUgSFRUUF9QQVlNRU5UX1JFUVVJUkVEICAgICAgICAgICAgICA0MDIKLSNkZWZpbmUgSFRUUF9GT1JCSURERU4gICAgICAgICAgICAgICAgICAgICA0MDMKLSNkZWZpbmUgSFRUUF9OT1RfRk9VTkQgICAgICAgICAgICAgICAgICAgICA0MDQKLSNkZWZpbmUgSFRUUF9NRVRIT0RfTk9UX0FMTE9XRUQgICAgICAgICAgICA0MDUKLSNkZWZpbmUgSFRUUF9OT1RfQUNDRVBUQUJMRSAgICAgICAgICAgICAgICA0MDYKLSNkZWZpbmUgSFRUUF9QUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRCA0MDcKLSNkZWZpbmUgSFRUUF9SRVFVRVNUX1RJTUVfT1VUICAgICAgICAgICAgICA0MDgKLSNkZWZpbmUgSFRUUF9DT05GTElDVCAgICAgICAgICAgICAgICAgICAgICA0MDkKLSNkZWZpbmUgSFRUUF9HT05FICAgICAgICAgICAgICAgICAgICAgICAgICA0MTAKLSNkZWZpbmUgSFRUUF9MRU5HVEhfUkVRVUlSRUQgICAgICAgICAgICAgICA0MTEKLSNkZWZpbmUgSFRUUF9QUkVDT05ESVRJT05fRkFJTEVEICAgICAgICAgICA0MTIKLSNkZWZpbmUgSFRUUF9SRVFVRVNUX0VOVElUWV9UT09fTEFSR0UgICAgICA0MTMKLSNkZWZpbmUgSFRUUF9SRVFVRVNUX1VSSV9UT09fTEFSR0UgICAgICAgICA0MTQKLSNkZWZpbmUgSFRUUF9VTlNVUFBPUlRFRF9NRURJQV9UWVBFICAgICAgICA0MTUKLSNkZWZpbmUgSFRUUF9SQU5HRV9OT1RfU0FUSVNGSUFCTEUgICAgICAgICA0MTYKLSNkZWZpbmUgSFRUUF9FWFBFQ1RBVElPTl9GQUlMRUQgICAgICAgICAgICA0MTcKLSNkZWZpbmUgSFRUUF9VTlBST0NFU1NBQkxFX0VOVElUWSAgICAgICAgICA0MjIKLSNkZWZpbmUgSFRUUF9MT0NLRUQgICAgICAgICAgICAgICAgICAgICAgICA0MjMKLSNkZWZpbmUgSFRUUF9GQUlMRURfREVQRU5ERU5DWSAgICAgICAgICAgICA0MjQKLSNkZWZpbmUgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IgICAgICAgICA1MDAKLSNkZWZpbmUgSFRUUF9OT1RfSU1QTEVNRU5URUQgICAgICAgICAgICAgICA1MDEKLSNkZWZpbmUgSFRUUF9CQURfR0FURVdBWSAgICAgICAgICAgICAgICAgICA1MDIKLSNkZWZpbmUgSFRUUF9TRVJWSUNFX1VOQVZBSUxBQkxFICAgICAgICAgICA1MDMKLSNkZWZpbmUgSFRUUF9HQVRFV0FZX1RJTUVfT1VUICAgICAgICAgICAgICA1MDQKLSNkZWZpbmUgSFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQgICAgICAgICA1MDUKLSNkZWZpbmUgSFRUUF9WQVJJQU5UX0FMU09fVkFSSUVTICAgICAgICAgICA1MDYKLSNkZWZpbmUgSFRUUF9JTlNVRkZJQ0lFTlRfU1RPUkFHRSAgICAgICAgICA1MDcKLSNkZWZpbmUgSFRUUF9OT1RfRVhURU5ERUQgICAgICAgICAgICAgICAgICA1MTAKLQotI2RlZmluZSBET0NVTUVOVF9GT0xMT1dTICAgIEhUVFBfT0sKLSNkZWZpbmUgUEFSVElBTF9DT05URU5UICAgICBIVFRQX1BBUlRJQUxfQ09OVEVOVAotI2RlZmluZSBNVUxUSVBMRV9DSE9JQ0VTICAgIEhUVFBfTVVMVElQTEVfQ0hPSUNFUwotI2RlZmluZSBNT1ZFRCAgICAgICAgICAgICAgIEhUVFBfTU9WRURfUEVSTUFORU5UTFkKLSNkZWZpbmUgUkVESVJFQ1QgICAgICAgICAgICBIVFRQX01PVkVEX1RFTVBPUkFSSUxZCi0jZGVmaW5lIFVTRV9MT0NBTF9DT1BZICAgICAgSFRUUF9OT1RfTU9ESUZJRUQKLSNkZWZpbmUgQkFEX1JFUVVFU1QgICAgICAgICBIVFRQX0JBRF9SRVFVRVNUCi0jZGVmaW5lIEFVVEhfUkVRVUlSRUQgICAgICAgSFRUUF9VTkFVVEhPUklaRUQKLSNkZWZpbmUgRk9SQklEREVOICAgICAgICAgICBIVFRQX0ZPUkJJRERFTgotI2RlZmluZSBOT1RfRk9VTkQgICAgICAgICAgIEhUVFBfTk9UX0ZPVU5ECi0jZGVmaW5lIE1FVEhPRF9OT1RfQUxMT1dFRCAgSFRUUF9NRVRIT0RfTk9UX0FMTE9XRUQKLSNkZWZpbmUgTk9UX0FDQ0VQVEFCTEUgICAgICBIVFRQX05PVF9BQ0NFUFRBQkxFCi0jZGVmaW5lIExFTkdUSF9SRVFVSVJFRCAgICAgSFRUUF9MRU5HVEhfUkVRVUlSRUQKLSNkZWZpbmUgUFJFQ09ORElUSU9OX0ZBSUxFRCBIVFRQX1BSRUNPTkRJVElPTl9GQUlMRUQKLSNkZWZpbmUgU0VSVkVSX0VSUk9SICAgICAgICBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUgotI2RlZmluZSBOT1RfSU1QTEVNRU5URUQgICAgIEhUVFBfTk9UX0lNUExFTUVOVEVECi0jZGVmaW5lIEJBRF9HQVRFV0FZICAgICAgICAgSFRUUF9CQURfR0FURVdBWQotI2RlZmluZSBWQVJJQU5UX0FMU09fVkFSSUVTIEhUVFBfVkFSSUFOVF9BTFNPX1ZBUklFUwotCi0jZGVmaW5lIGFwX2lzX0hUVFBfSU5GTyh4KSAgICAgICAgICgoKHgpID49IDEwMCkmJigoeCkgPCAyMDApKQotI2RlZmluZSBhcF9pc19IVFRQX1NVQ0NFU1MoeCkgICAgICAoKCh4KSA+PSAyMDApJiYoKHgpIDwgMzAwKSkKLSNkZWZpbmUgYXBfaXNfSFRUUF9SRURJUkVDVCh4KSAgICAgKCgoeCkgPj0gMzAwKSYmKCh4KSA8IDQwMCkpCi0jZGVmaW5lIGFwX2lzX0hUVFBfRVJST1IoeCkgICAgICAgICgoKHgpID49IDQwMCkmJigoeCkgPCA2MDApKQotI2RlZmluZSBhcF9pc19IVFRQX0NMSUVOVF9FUlJPUih4KSAoKCh4KSA+PSA0MDApJiYoKHgpIDwgNTAwKSkKLSNkZWZpbmUgYXBfaXNfSFRUUF9TRVJWRVJfRVJST1IoeCkgKCgoeCkgPj0gNTAwKSYmKCh4KSA8IDYwMCkpCi0KLSNkZWZpbmUgYXBfc3RhdHVzX2Ryb3BzX2Nvbm5lY3Rpb24oeCkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA9PSBIVFRQX0JBRF9SRVFVRVNUKSAgICAgICAgICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh4KSA9PSBIVFRQX1JFUVVFU1RfVElNRV9PVVQpICAgICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh4KSA9PSBIVFRQX0xFTkdUSF9SRVFVSVJFRCkgICAgICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh4KSA9PSBIVFRQX1JFUVVFU1RfRU5USVRZX1RPT19MQVJHRSkgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh4KSA9PSBIVFRQX1JFUVVFU1RfVVJJX1RPT19MQVJHRSkgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh4KSA9PSBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUikgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh4KSA9PSBIVFRQX1NFUlZJQ0VfVU5BVkFJTEFCTEUpIHx8IFwKLQkJCQkgICAgKCh4KSA9PSBIVFRQX05PVF9JTVBMRU1FTlRFRCkpCi0KLS8qIE1ldGhvZHMgcmVjb2duaXplZCAoYnV0IG5vdCBuZWNlc3NhcmlseSBoYW5kbGVkKSBieSB0aGUgc2VydmVyLgotICogVGhlc2UgY29uc3RhbnRzIGFyZSB1c2VkIGluIGJpdCBzaGlmdGluZyBtYXNrcyBvZiBzaXplIGludCwgc28gaXQgaXMKLSAqIHVuc2FmZSB0byBoYXZlIG1vcmUgbWV0aG9kcyB0aGFuIGJpdHMgaW4gYW4gaW50LiAgSEVBRCA9PSBNX0dFVC4KLSAqLwotI2RlZmluZSBNX0dFVCAgICAgICAgMAotI2RlZmluZSBNX1BVVCAgICAgICAgMQotI2RlZmluZSBNX1BPU1QgICAgICAgMgotI2RlZmluZSBNX0RFTEVURSAgICAgMwotI2RlZmluZSBNX0NPTk5FQ1QgICAgNAotI2RlZmluZSBNX09QVElPTlMgICAgNQotI2RlZmluZSBNX1RSQUNFICAgICAgNgotI2RlZmluZSBNX1BBVENIICAgICAgNwotI2RlZmluZSBNX1BST1BGSU5EICAgOAotI2RlZmluZSBNX1BST1BQQVRDSCAgOQotI2RlZmluZSBNX01LQ09MICAgICAxMAotI2RlZmluZSBNX0NPUFkgICAgICAxMQotI2RlZmluZSBNX01PVkUgICAgICAxMgotI2RlZmluZSBNX0xPQ0sgICAgICAxMwotI2RlZmluZSBNX1VOTE9DSyAgICAxNAotI2RlZmluZSBNX0lOVkFMSUQgICAxNQotCi0jZGVmaW5lIE1FVEhPRFMgICAgIDE2Ci0KLSNkZWZpbmUgQ0dJX01BR0lDX1RZUEUgImFwcGxpY2F0aW9uL3gtaHR0cGQtY2dpIgotI2RlZmluZSBJTkNMVURFU19NQUdJQ19UWVBFICJ0ZXh0L3gtc2VydmVyLXBhcnNlZC1odG1sIgotI2RlZmluZSBJTkNMVURFU19NQUdJQ19UWVBFMyAidGV4dC94LXNlcnZlci1wYXJzZWQtaHRtbDMiCi0jZGVmaW5lIERJUl9NQUdJQ19UWVBFICJodHRwZC91bml4LWRpcmVjdG9yeSIKLQotI2RlZmluZSBMRiAxMAotI2RlZmluZSBDUiAxMwotCi0vKiBQb3NzaWJsZSB2YWx1ZXMgZm9yIHJlcXVlc3RfcmVjLnJlYWRfYm9keSAoc2V0IGJ5IGhhbmRsaW5nIG1vZHVsZSk6Ci0gKiAgICBSRVFVRVNUX05PX0JPRFkgICAgICAgICAgU2VuZCA0MTMgZXJyb3IgaWYgbWVzc2FnZSBoYXMgYW55IGJvZHkKLSAqICAgIFJFUVVFU1RfQ0hVTktFRF9FUlJPUiAgICBTZW5kIDQxMSBlcnJvciBpZiBib2R5IHdpdGhvdXQgQ29udGVudC1MZW5ndGgKLSAqICAgIFJFUVVFU1RfQ0hVTktFRF9ERUNIVU5LICBJZiBjaHVua2VkLCByZW1vdmUgdGhlIGNodW5rcyBmb3IgbWUuCi0gKiAgICBSRVFVRVNUX0NIVU5LRURfUEFTUyAgICAgUGFzcyB0aGUgY2h1bmtzIHRvIG1lIHdpdGhvdXQgcmVtb3ZhbC4KLSAqLwotI2RlZmluZSBSRVFVRVNUX05PX0JPRFkgICAgICAgICAgMAotI2RlZmluZSBSRVFVRVNUX0NIVU5LRURfRVJST1IgICAgMQotI2RlZmluZSBSRVFVRVNUX0NIVU5LRURfREVDSFVOSyAgMgotI2RlZmluZSBSRVFVRVNUX0NIVU5LRURfUEFTUyAgICAgMwotCi0vKiBUaGluZ3Mgd2hpY2ggbWF5IHZhcnkgcGVyIGZpbGUtbG9va3VwIFdJVEhJTiBhIHJlcXVlc3QgLS0tCi0gKiBlLmcuLCBzdGF0ZSBvZiBNSU1FIGNvbmZpZy4gIEJhc2ljYWxseSwgdGhlIG5hbWUgb2YgYW4gb2JqZWN0LCBpbmZvCi0gKiBhYm91dCB0aGUgb2JqZWN0LCBhbmQgYW55IG90aGVyIGluZm8gd2UgbWF5IGFodmUgd2hpY2ggbWF5IG5lZWQgdG8KLSAqIGNoYW5nZSBhcyB3ZSBnbyBwb2tpbmcgYXJvdW5kIGxvb2tpbmcgZm9yIGl0IChlLmcuLCBvdmVycmlkZGVuIGJ5Ci0gKiAuaHRhY2Nlc3MgZmlsZXMpLgotICoKLSAqIE5vdGUgaG93IHRoZSBkZWZhdWx0IHN0YXRlIG9mIGFsbW9zdCBhbGwgdGhlc2UgdGhpbmdzIGlzIHByb3Blcmx5Ci0gKiB6ZXJvLCBzbyB0aGF0IGFsbG9jYXRpbmcgaXQgd2l0aCBwY2FsbG9jIGRvZXMgdGhlIHJpZ2h0IHRoaW5nIHdpdGhvdXQKLSAqIGEgd2hvbGUgbG90IG9mIGhhaXJ5IGluaXRpYWxpemF0aW9uLi4uIHNvIGxvbmcgYXMgd2UgYXJlIHdpbGxpbmcgdG8KLSAqIG1ha2UgdGhlIChmYWlybHkpIHBvcnRhYmxlIGFzc3VtcHRpb24gdGhhdCB0aGUgYml0IHBhdHRlcm4gb2YgYSBOVUxMCi0gKiBwb2ludGVyIGlzLCBpbiBmYWN0LCB6ZXJvLgotICovCi0KLS8qIFRoaXMgcmVwcmVzZW50cyB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgaHRhY2Nlc3M7IHRoZXNlIGFyZSBjYWNoZWQgZm9yCi0gKiBlYWNoIHJlcXVlc3QuCi0gKi8KLXN0cnVjdCBodGFjY2Vzc19yZXN1bHQgewotICAgIGNoYXIgKmRpcjsJCQkvKiB0aGUgZGlyZWN0b3J5IHRvIHdoaWNoIHRoaXMgYXBwbGllcyAqLwotICAgIGludCBvdmVycmlkZTsJCS8qIHRoZSBvdmVycmlkZXMgYWxsb3dlZCBmb3IgdGhlIC5odGFjY2VzcyBmaWxlICovCi0gICAgdm9pZCAqaHRhY2Nlc3M7CQkvKiB0aGUgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzICovCi0vKiB0aGUgbmV4dCBvbmUsIG9yIE5VTEwgaWYgbm8gbW9yZTsgTi5CLiBuZXZlciBjaGFuZ2UgdGhpcyAqLwotICAgIGNvbnN0IHN0cnVjdCBodGFjY2Vzc19yZXN1bHQgKm5leHQ7Ci19OwotCi0vKiBUaGUgZm9sbG93aW5nIGZvdXIgdHlwZXMgZGVmaW5lIGEgaGllcmFyY2h5IG9mIGFjdGl2aXRpZXMsIHNvIHRoYXQKLSAqIGdpdmVuIGEgcmVxdWVzdF9yZWMgciB5b3UgY2FuIHdyaXRlIHItPmNvbm5lY3Rpb24tPnNlcnZlci0+cHJvY2VzcwotICogdG8gZ2V0IHRvIHRoZSBwcm9jZXNzX3JlYy4gIFdoaWxlIHRoaXMgcmVkdWNlcyBzdWJzdGFudGlhbGx5IHRoZQotICogbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGF0IHZhcmlvdXMgaG9va3MgcmVxdWlyZSBiZXdhcmUgdGhhdCBpbgotICogdGhyZWFkZWQgdmVyc2lvbnMgb2YgdGhlIHNlcnZlciB5b3UgbXVzdCBjb25zaWRlciBtdWx0aXBsZXhpbmcKLSAqIGlzc3Vlcy4gICovCi0KLXR5cGVkZWYgc3RydWN0IHByb2Nlc3NfcmVjIHByb2Nlc3NfcmVjOwotdHlwZWRlZiBzdHJ1Y3Qgc2VydmVyX3JlYyBzZXJ2ZXJfcmVjOwotdHlwZWRlZiBzdHJ1Y3QgY29ubl9yZWMgY29ubl9yZWM7Ci10eXBlZGVmIHN0cnVjdCByZXF1ZXN0X3JlYyByZXF1ZXN0X3JlYzsKLQotI2luY2x1ZGUgInV0aWxfdXJpLmgiCi0KLXN0cnVjdCBwcm9jZXNzX3JlYyB7Ci0gICAgYXBfY29udGV4dF90ICpwb29sOyAgLyogR2xvYmFsIHBvb2wuIFBsZWFzZSB0cnkgdG8gY2xlYXJlZCBvbiBfYWxsXyBleGl0cyAqLwotICAgIGFwX2NvbnRleHRfdCAqcGNvbmY7IC8qIGFrYSBjb25maWd1cmF0aW9uIHBvb2wsIGNsZWFyZWQgb24gcmVzdGFydHMgKi8KLSAgICBpbnQgYXJnYzsKLSAgICBjb25zdCBjaGFyICoqYXJndjsKLSAgICBjb25zdCBjaGFyICpzaG9ydF9uYW1lOwotfTsKLQotc3RydWN0IHJlcXVlc3RfcmVjIHsKLQotICAgIGFwX2NvbnRleHRfdCAqcG9vbDsKLSAgICBjb25uX3JlYyAqY29ubmVjdGlvbjsKLSAgICBzZXJ2ZXJfcmVjICpzZXJ2ZXI7Ci0KLSAgICByZXF1ZXN0X3JlYyAqbmV4dDsJCS8qIElmIHdlIHdpbmQgdXAgZ2V0dGluZyByZWRpcmVjdGVkLAotCQkJCSAqIHBvaW50ZXIgdG8gdGhlIHJlcXVlc3Qgd2UgcmVkaXJlY3RlZCB0by4KLQkJCQkgKi8KLSAgICByZXF1ZXN0X3JlYyAqcHJldjsJCS8qIElmIHRoaXMgaXMgYW4gaW50ZXJuYWwgcmVkaXJlY3QsCi0JCQkJICogcG9pbnRlciB0byB3aGVyZSB3ZSByZWRpcmVjdGVkICpmcm9tKi4KLQkJCQkgKi8KLQotICAgIHJlcXVlc3RfcmVjICptYWluOwkJLyogSWYgdGhpcyBpcyBhIHN1Yl9yZXF1ZXN0IChzZWUgcmVxdWVzdC5oKSAKLQkJCQkgKiBwb2ludGVyIGJhY2sgdG8gdGhlIG1haW4gcmVxdWVzdC4KLQkJCQkgKi8KLQotICAgIC8qIEluZm8gYWJvdXQgdGhlIHJlcXVlc3QgaXRzZWxmLi4uIHdlIGJlZ2luIHdpdGggc3R1ZmYgdGhhdCBvbmx5Ci0gICAgICogcHJvdG9jb2wuYyBzaG91bGQgZXZlciB0b3VjaC4uLgotICAgICAqLwotCi0gICAgY2hhciAqdGhlX3JlcXVlc3Q7CQkvKiBGaXJzdCBsaW5lIG9mIHJlcXVlc3QsIHNvIHdlIGNhbiBsb2cgaXQgKi8KLSAgICBpbnQgYXNzYmFja3dhcmRzOwkJLyogSFRUUC8wLjksICJzaW1wbGUiIHJlcXVlc3QgKi8KLSAgICBpbnQgcHJveHlyZXE7CQkvKiBBIHByb3h5IHJlcXVlc3QgKGNhbGN1bGF0ZWQgZHVyaW5nCi0JCQkJICogcG9zdF9yZWFkX3JlcXVlc3Qgb3IgdHJhbnNsYXRlX25hbWUpICovCi0gICAgaW50IGhlYWRlcl9vbmx5OwkJLyogSEVBRCByZXF1ZXN0LCBhcyBvcHBvc2VkIHRvIEdFVCAqLwotICAgIGNoYXIgKnByb3RvY29sOwkJLyogUHJvdG9jb2wsIGFzIGdpdmVuIHRvIHVzLCBvciBIVFRQLzAuOSAqLwotICAgIGludCBwcm90b19udW07CQkvKiBOdW1iZXIgdmVyc2lvbiBvZiBwcm90b2NvbDsgMS4xID0gMTAwMSAqLwotICAgIGNvbnN0IGNoYXIgKmhvc3RuYW1lOwkvKiBIb3N0LCBhcyBzZXQgYnkgZnVsbCBVUkkgb3IgSG9zdDogKi8KLQotICAgIGFwX3RpbWVfdCByZXF1ZXN0X3RpbWU7CS8qIFdoZW4gdGhlIHJlcXVlc3Qgc3RhcnRlZCAqLwotCi0gICAgY29uc3QgY2hhciAqc3RhdHVzX2xpbmU7CS8qIFN0YXR1cyBsaW5lLCBpZiBzZXQgYnkgc2NyaXB0ICovCi0gICAgaW50IHN0YXR1czsJCQkvKiBJbiBhbnkgY2FzZSAqLwotCi0gICAgLyogUmVxdWVzdCBtZXRob2QsIHR3byB3YXlzOyBhbHNvLCBwcm90b2NvbCwgZXRjLi4gIE91dHNpZGUgb2YgcHJvdG9jb2wuYywKLSAgICAgKiBsb29rLCBidXQgZG9uJ3QgdG91Y2guCi0gICAgICovCi0KLSAgICBjb25zdCBjaGFyICptZXRob2Q7CQkvKiBHRVQsIEhFQUQsIFBPU1QsIGV0Yy4gKi8KLSAgICBpbnQgbWV0aG9kX251bWJlcjsJCS8qIE1fR0VULCBNX1BPU1QsIGV0Yy4gKi8KLQotICAgIC8qCi0JYWxsb3dlZCBpcyBhIGJpdHZlY3RvciBvZiB0aGUgYWxsb3dlZCBtZXRob2RzLgotCi0JQSBoYW5kbGVyIG11c3QgZW5zdXJlIHRoYXQgdGhlIHJlcXVlc3QgbWV0aG9kIGlzIG9uZSB0aGF0Ci0JaXQgaXMgY2FwYWJsZSBvZiBoYW5kbGluZy4gIEdlbmVyYWxseSBtb2R1bGVzIHNob3VsZCBERUNMSU5FCi0JYW55IHJlcXVlc3QgbWV0aG9kcyB0aGV5IGRvIG5vdCBoYW5kbGUuICBQcmlvciB0byBhYm9ydGluZyB0aGUKLQloYW5kbGVyIGxpa2UgdGhpcyB0aGUgaGFuZGxlciBzaG91bGQgc2V0IHItPmFsbG93ZWQgdG8gdGhlIGxpc3QKLQlvZiBtZXRob2RzIHRoYXQgaXQgaXMgd2lsbGluZyB0byBoYW5kbGUuICBUaGlzIGJpdHZlY3RvciBpcyB1c2VkCi0JdG8gY29uc3RydWN0IHRoZSAiQWxsb3c6IiBoZWFkZXIgcmVxdWlyZWQgZm9yIE9QVElPTlMgcmVxdWVzdHMsCi0JYW5kIE1FVEhPRF9OT1RfQUxMT1dFRCBhbmQgTk9UX0lNUExFTUVOVEVEIHN0YXR1cyBjb2Rlcy4KLQotCVNpbmNlIHRoZSBkZWZhdWx0X2hhbmRsZXIgZGVhbHMgd2l0aCBPUFRJT05TLCBhbGwgbW9kdWxlcyBjYW4KLQl1c3VhbGx5IGRlY2xpbmUgdG8gZGVhbCB3aXRoIE9QVElPTlMuICBUUkFDRSBpcyBhbHdheXMgYWxsb3dlZCwKLQltb2R1bGVzIGRvbid0IG5lZWQgdG8gc2V0IGl0IGV4cGxpY2l0bHkuCi0KLQlTaW5jZSB0aGUgZGVmYXVsdF9oYW5kbGVyIHdpbGwgYWx3YXlzIGhhbmRsZSBhIEdFVCwgYQotCW1vZHVsZSB3aGljaCBkb2VzICpub3QqIGltcGxlbWVudCBHRVQgc2hvdWxkIHByb2JhYmx5IHJldHVybgotCU1FVEhPRF9OT1RfQUxMT1dFRC4gIFVuZm9ydHVuYXRlbHkgdGhpcyBtZWFucyB0aGF0IGEgU2NyaXB0IEdFVAotCWhhbmRsZXIgY2FuJ3QgYmUgaW5zdGFsbGVkIGJ5IG1vZF9hY3Rpb25zLgotICAgICovCi0gICAgaW50IGFsbG93ZWQ7CQkvKiBBbGxvd2VkIG1ldGhvZHMgLSBmb3IgNDA1LCBPUFRJT05TLCBldGMgKi8KLQotICAgIGludCBzZW50X2JvZHljdDsJCS8qIGJ5dGUgY291bnQgaW4gc3RyZWFtIGlzIGZvciBib2R5ICovCi0gICAgbG9uZyBieXRlc19zZW50OwkJLyogYm9keSBieXRlIGNvdW50LCBmb3IgZWFzeSBhY2Nlc3MgKi8KLSAgICBhcF90aW1lX3QgbXRpbWU7CQkvKiBUaW1lIHRoZSByZXNvdXJjZSB3YXMgbGFzdCBtb2RpZmllZCAqLwotCi0gICAgLyogSFRUUC8xLjEgY29ubmVjdGlvbi1sZXZlbCBmZWF0dXJlcyAqLwotCi0gICAgaW50IGNodW5rZWQ7CQkvKiBzZW5kaW5nIGNodW5rZWQgdHJhbnNmZXItY29kaW5nICovCi0gICAgaW50IGJ5dGVyYW5nZTsJCS8qIG51bWJlciBvZiBieXRlIHJhbmdlcyAqLwotICAgIGNoYXIgKmJvdW5kYXJ5OwkJLyogbXVsdGlwYXJ0L2J5dGVyYW5nZXMgYm91bmRhcnkgKi8KLSAgICBjb25zdCBjaGFyICpyYW5nZTsJCS8qIFRoZSBSYW5nZTogaGVhZGVyICovCi0gICAgbG9uZyBjbGVuZ3RoOwkJLyogVGhlICJyZWFsIiBjb250ZW50IGxlbmd0aCAqLwotCi0gICAgbG9uZyByZW1haW5pbmc7CQkvKiBieXRlcyBsZWZ0IHRvIHJlYWQgKi8KLSAgICBsb25nIHJlYWRfbGVuZ3RoOwkJLyogYnl0ZXMgdGhhdCBoYXZlIGJlZW4gcmVhZCAqLwotICAgIGludCByZWFkX2JvZHk7CQkvKiBob3cgdGhlIHJlcXVlc3QgYm9keSBzaG91bGQgYmUgcmVhZCAqLwotICAgIGludCByZWFkX2NodW5rZWQ7CQkvKiByZWFkaW5nIGNodW5rZWQgdHJhbnNmZXItY29kaW5nICovCi0gICAgdW5zaWduZWQgZXhwZWN0aW5nXzEwMDsJLyogaXMgY2xpZW50IHdhaXRpbmcgZm9yIGEgMTAwIHJlc3BvbnNlPyAqLwotCi0gICAgLyogTUlNRSBoZWFkZXIgZW52aXJvbm1lbnRzLCBpbiBhbmQgb3V0LiAgQWxzbywgYW4gYXJyYXkgY29udGFpbmluZwotICAgICAqIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBiZSBwYXNzZWQgdG8gc3VicHJvY2Vzc2VzLCBzbyBwZW9wbGUgY2FuCi0gICAgICogd3JpdGUgbW9kdWxlcyB0byBhZGQgdG8gdGhhdCBlbnZpcm9ubWVudC4KLSAgICAgKgotICAgICAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gaGVhZGVyc19vdXQgYW5kIGVycl9oZWFkZXJzX291dCBpcyB0aGF0IHRoZQotICAgICAqIGxhdHRlciBhcmUgcHJpbnRlZCBldmVuIG9uIGVycm9yLCBhbmQgcGVyc2lzdCBhY3Jvc3MgaW50ZXJuYWwgcmVkaXJlY3RzCi0gICAgICogKHNvIHRoZSBoZWFkZXJzIHByaW50ZWQgZm9yIEVycm9yRG9jdW1lbnQgaGFuZGxlcnMgd2lsbCBoYXZlIHRoZW0pLgotICAgICAqCi0gICAgICogVGhlICdub3RlcycgYXBfdGFibGVfdCBpcyBmb3Igbm90ZXMgZnJvbSBvbmUgbW9kdWxlIHRvIGFub3RoZXIsIHdpdGggbm8KLSAgICAgKiBvdGhlciBzZXQgcHVycG9zZSBpbiBtaW5kLi4uCi0gICAgICovCi0KLSAgICBhcF90YWJsZV90ICpoZWFkZXJzX2luOwotICAgIGFwX3RhYmxlX3QgKmhlYWRlcnNfb3V0OwotICAgIGFwX3RhYmxlX3QgKmVycl9oZWFkZXJzX291dDsKLSAgICBhcF90YWJsZV90ICpzdWJwcm9jZXNzX2VudjsKLSAgICBhcF90YWJsZV90ICpub3RlczsKLQotICAgIC8qIGNvbnRlbnRfdHlwZSwgaGFuZGxlciwgY29udGVudF9lbmNvZGluZywgY29udGVudF9sYW5ndWFnZSwgYW5kIGFsbAotICAgICAqIGNvbnRlbnRfbGFuZ3VhZ2VzIE1VU1QgYmUgbG93ZXJjYXNlZCBzdHJpbmdzLiAgVGhleSBtYXkgYmUgcG9pbnRlcnMKLSAgICAgKiB0byBzdGF0aWMgc3RyaW5nczsgdGhleSBzaG91bGQgbm90IGJlIG1vZGlmaWVkIGluIHBsYWNlLgotICAgICAqLwotICAgIGNvbnN0IGNoYXIgKmNvbnRlbnRfdHlwZTsJLyogQnJlYWsgdGhlc2Ugb3V0IC0tLSB3ZSBkaXNwYXRjaCBvbiAnZW0gKi8KLSAgICBjb25zdCBjaGFyICpoYW5kbGVyOwkvKiBXaGF0IHdlICpyZWFsbHkqIGRpc3BhdGNoIG9uICAgICAgICAgICAqLwotCi0gICAgY29uc3QgY2hhciAqY29udGVudF9lbmNvZGluZzsKLSAgICBjb25zdCBjaGFyICpjb250ZW50X2xhbmd1YWdlOwkvKiBmb3IgYmFjay1jb21wYXQuIG9ubHkgLS0gZG8gbm90IHVzZSAqLwotICAgIGFwX2FycmF5X2hlYWRlcl90ICpjb250ZW50X2xhbmd1YWdlczsJLyogYXJyYXkgb2YgKGNoYXIqKSAqLwotCi0gICAgY2hhciAqdmxpc3RfdmFsaWRhdG9yOyAgICAgIC8qIHZhcmlhbnQgbGlzdCB2YWxpZGF0b3IgKGlmIG5lZ290aWF0ZWQpICovCi0gICAgCi0gICAgY2hhciAqdXNlcjsJCQkvKiBJZiBhbiBhdXRoZW50aWNhdGlvbiBjaGVjayB3YXMgbWFkZSwKLQkJCQkgKiB0aGlzIGdldHMgc2V0IHRvIHRoZSB1c2VyIG5hbWUuCi0JCQkJICovCi0gICAgY2hhciAqYXBfYXV0aF90eXBlOwkJLyogRGl0dG8uICovCi0KLSAgICBpbnQgbm9fY2FjaGU7Ci0gICAgaW50IG5vX2xvY2FsX2NvcHk7Ci0KLSAgICAvKiBXaGF0IG9iamVjdCBpcyBiZWluZyByZXF1ZXN0ZWQgKGVpdGhlciBkaXJlY3RseSwgb3IgdmlhIGluY2x1ZGUKLSAgICAgKiBvciBjb250ZW50LW5lZ290aWF0aW9uIG1hcHBpbmcpLgotICAgICAqLwotCi0gICAgY2hhciAqdW5wYXJzZWRfdXJpOwkJLyogdGhlIHVyaSB3aXRob3V0IGFueSBwYXJzaW5nIHBlcmZvcm1lZCAqLwotICAgIGNoYXIgKnVyaTsJCQkvKiB0aGUgcGF0aCBwb3J0aW9uIG9mIHRoZSBVUkkgKi8KLSAgICBjaGFyICpmaWxlbmFtZTsKLSAgICBjaGFyICpwYXRoX2luZm87Ci0gICAgY2hhciAqYXJnczsJCQkvKiBRVUVSWV9BUkdTLCBpZiBhbnkgKi8KLSAgICBhcF9maW5mb190IGZpbmZvOwkJLyogU1RfTU9ERSBzZXQgdG8gemVybyBpZiBubyBzdWNoIGZpbGUgKi8KLSAgICB1cmlfY29tcG9uZW50cyBwYXJzZWRfdXJpOwkvKiBjb21wb25lbnRzIG9mIHVyaSwgZGlzbWFudGxlZCAqLwotCi0gICAgLyogVmFyaW91cyBvdGhlciBjb25maWcgaW5mbyB3aGljaCBtYXkgY2hhbmdlIHdpdGggLmh0YWNjZXNzIGZpbGVzCi0gICAgICogVGhlc2UgYXJlIGNvbmZpZyB2ZWN0b3JzLCB3aXRoIG9uZSB2b2lkKiBwb2ludGVyIGZvciBlYWNoIG1vZHVsZQotICAgICAqICh0aGUgdGhpbmcgcG9pbnRlZCB0byBiZWluZyB0aGUgbW9kdWxlJ3MgYnVzaW5lc3MpLgotICAgICAqLwotCi0gICAgdm9pZCAqcGVyX2Rpcl9jb25maWc7CS8qIE9wdGlvbnMgc2V0IGluIGNvbmZpZyBmaWxlcywgZXRjLiAqLwotICAgIHZvaWQgKnJlcXVlc3RfY29uZmlnOwkvKiBOb3RlcyBvbiAqdGhpcyogcmVxdWVzdCAqLwotCi0vKgotICogYSBsaW5rZWQgbGlzdCBvZiB0aGUgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzIGluIHRoZSAuaHRhY2Nlc3MgZmlsZXMKLSAqIGFjY2Vzc2VkIGJ5IHRoaXMgcmVxdWVzdC4KLSAqIE4uQi4gYWx3YXlzIGFkZCB0byB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgX25ldmVyXyB0byB0aGUgZW5kLgotICogdGhhdCB3YXksIGEgc3ViIHJlcXVlc3QncyBsaXN0IGNhbiAodGVtcG9yYXJpbHkpIHBvaW50IHRvIGEgcGFyZW50J3MgbGlzdAotICovCi0gICAgY29uc3Qgc3RydWN0IGh0YWNjZXNzX3Jlc3VsdCAqaHRhY2Nlc3M7Ci0KLS8qIFRoaW5ncyBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgcmVjb3JkIHRvIGF2b2lkIGJyZWFraW5nIGJpbmFyeQotICogY29tcGF0aWJpbGl0eS4gIEl0IHdvdWxkIGJlIG5pY2UgdG8gcmVtZW1iZXIgdG8gcmVvcmRlciB0aGUgZW50aXJlCi0gKiByZWNvcmQgdG8gaW1wcm92ZSA2NGJpdCBhbGlnbm1lbnQgdGhlIG5leHQgdGltZSB3ZSBuZWVkIHRvIGJyZWFrCi0gKiBiaW5hcnkgY29tcGF0aWJpbGl0eSBmb3Igc29tZSBvdGhlciByZWFzb24uCi0gKi8KLX07Ci0KLQotLyogVGhpbmdzIHdoaWNoIGFyZSBwZXIgY29ubmVjdGlvbgotICovCi0KLXN0cnVjdCBjb25uX3JlYyB7Ci0KLSAgICBhcF9jb250ZXh0X3QgKnBvb2w7Ci0gICAgc2VydmVyX3JlYyAqYmFzZV9zZXJ2ZXI7CS8qIFBoeXNpY2FsIHZob3N0IHRoaXMgY29ubiBjb21lIGluIG9uICovCi0gICAgdm9pZCAqdmhvc3RfbG9va3VwX2RhdGE7CS8qIHVzZWQgYnkgaHR0cF92aG9zdC5jICovCi0KLSAgICAvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29ubmVjdGlvbiBpdHNlbGYgKi8KLQotICAgIEJVRkYgKmNsaWVudDsJCS8qIENvbm5lY3Rpb24gdG8gdGhlIGd1eSAqLwotCi0gICAgLyogV2hvIGlzIHRoZSBjbGllbnQ/ICovCi0KLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbG9jYWxfYWRkcjsJLyogbG9jYWwgYWRkcmVzcyAqLwotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVfYWRkcjsJLyogcmVtb3RlIGFkZHJlc3MgKi8KLSAgICBjaGFyICpyZW1vdGVfaXA7CQkvKiBDbGllbnQncyBJUCBhZGRyZXNzICovCi0gICAgY2hhciAqcmVtb3RlX2hvc3Q7CQkvKiBDbGllbnQncyBETlMgbmFtZSwgaWYga25vd24uCi0JCQkJICogTlVMTCBpZiBETlMgaGFzbid0IGJlZW4gY2hlY2tlZCwKLQkJCQkgKiAiIiBpZiBpdCBoYXMgYW5kIG5vIGFkZHJlc3Mgd2FzIGZvdW5kLgotCQkJCSAqIE4uQi4gT25seSBhY2Nlc3MgdGhpcyB0aG91Z2gKLQkJCQkgKiBnZXRfcmVtb3RlX2hvc3QoKSAqLwotICAgIGNoYXIgKnJlbW90ZV9sb2duYW1lOwkvKiBPbmx5IGV2ZXIgc2V0IGlmIGRvaW5nIHJmYzE0MTMgbG9va3Vwcy4KLQkJCQkgKiBOLkIuIE9ubHkgYWNjZXNzIHRoaXMgdGhyb3VnaAotCQkJCSAqIGdldF9yZW1vdGVfbG9nbmFtZSgpICovCi0KLSAgICB1bnNpZ25lZCBhYm9ydGVkOjE7CQkvKiBBcmUgd2Ugc3RpbGwgdGFsa2luZz8gKi8KLSAgICBzaWduZWQgaW50IGtlZXBhbGl2ZToyOwkvKiBBcmUgd2UgdXNpbmcgSFRUUCBLZWVwLUFsaXZlPwotCQkJCSAqIC0xIGZhdGFsIGVycm9yLCAwIHVuZGVjaWRlZCwgMSB5ZXMgKi8KLSAgICB1bnNpZ25lZCBrZXB0YWxpdmU6MTsJLyogRGlkIHdlIHVzZSBIVFRQIEtlZXAtQWxpdmU/ICovCi0gICAgc2lnbmVkIGludCBkb3VibGVfcmV2ZXJzZToyOy8qIGhhdmUgd2UgZG9uZSBkb3VibGUtcmV2ZXJzZSBETlM/Ci0JCQkJICogLTEgeWVzL2ZhaWx1cmUsIDAgbm90IHlldCwgMSB5ZXMvc3VjY2VzcyAqLwotICAgIGludCBrZWVwYWxpdmVzOwkJLyogSG93IG1hbnkgdGltZXMgaGF2ZSB3ZSB1c2VkIGl0PyAqLwotICAgIGNoYXIgKmxvY2FsX2lwOwkJLyogc2VydmVyIElQIGFkZHJlc3MgKi8KLSAgICBjaGFyICpsb2NhbF9ob3N0OwkJLyogdXNlZCBmb3IgYXBfZ2V0X3NlcnZlcl9uYW1lIHdoZW4KLQkJCQkgKiBVc2VDYW5vbmljYWxOYW1lIGlzIHNldCB0byBETlMKLQkJCQkgKiAoaWdub3JlcyBzZXR0aW5nIG9mIEhvc3RuYW1lTG9va3VwcykgKi8KLSAgICBsb25nIGlkOyAgICAgICAgICAgICAgICAgICAgLyogSUQgb2YgdGhpcyBjb25uZWN0aW9uOyB1bmlxdWUgYXQgYW55Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBvaW50IGluIHRpbWUgKi8KLSAgICB2b2lkICpjb25uX2NvbmZpZzsJCS8qIE5vdGVzIG9uICp0aGlzKiBjb25uZWN0aW9uICovCi19OwotCi0vKiBQZXItdmhvc3QgY29uZmlnLi4uICovCi0KLS8qIFRoZSBhZGRyZXNzIDI1NS4yNTUuMjU1LjI1NSwgd2hlbiB1c2VkIGFzIGEgdmlydHVhbGhvc3QgYWRkcmVzcywKLSAqIHdpbGwgYmVjb21lIHRoZSAiZGVmYXVsdCIgc2VydmVyIHdoZW4gdGhlIGlwIGRvZXNuJ3QgbWF0Y2ggb3RoZXIgdmhvc3RzLgotICovCi0jZGVmaW5lIERFRkFVTFRfVkhPU1RfQUREUiAweGZmZmZmZmZmdWwKLQotdHlwZWRlZiBzdHJ1Y3Qgc2VydmVyX2FkZHJfcmVjIHNlcnZlcl9hZGRyX3JlYzsKLXN0cnVjdCBzZXJ2ZXJfYWRkcl9yZWMgewotICAgIHNlcnZlcl9hZGRyX3JlYyAqbmV4dDsKLSAgICBhcF9pbl9hZGRyIGhvc3RfYWRkcjsJLyogVGhlIGJvdW5kIGFkZHJlc3MsIGZvciB0aGlzIHNlcnZlciAqLwotICAgIHVuc2lnbmVkIHNob3J0IGhvc3RfcG9ydDsJLyogVGhlIGJvdW5kIHBvcnQsIGZvciB0aGlzIHNlcnZlciAqLwotICAgIGNoYXIgKnZpcnRob3N0OwkJLyogVGhlIG5hbWUgZ2l2ZW4gaW4gPFZpcnR1YWxIb3N0PiAqLwotfTsKLQotc3RydWN0IHNlcnZlcl9yZWMgewotICAgIHByb2Nlc3NfcmVjICpwcm9jZXNzOwotICAgIHNlcnZlcl9yZWMgKm5leHQ7Ci0KLSAgICAvKiBkZXNjcmlwdGlvbiBvZiB3aGVyZSB0aGUgZGVmaW5pdGlvbiBjYW1lIGZyb20gKi8KLSAgICBjb25zdCBjaGFyICpkZWZuX25hbWU7Ci0gICAgdW5zaWduZWQgZGVmbl9saW5lX251bWJlcjsKLQotICAgIC8qIEZ1bGwgbG9jYXRpb25zIG9mIHNlcnZlciBjb25maWcgaW5mbyAqLwotCi0gICAgY2hhciAqc3JtX2NvbmZuYW1lOwotICAgIGNoYXIgKmFjY2Vzc19jb25mbmFtZTsKLQotICAgIC8qIENvbnRhY3QgaW5mb3JtYXRpb24gKi8KLQotICAgIGNoYXIgKnNlcnZlcl9hZG1pbjsKLSAgICBjaGFyICpzZXJ2ZXJfaG9zdG5hbWU7Ci0gICAgdW5zaWduZWQgc2hvcnQgcG9ydDsJLyogZm9yIHJlZGlyZWN0cywgZXRjLiAqLwotCi0gICAgLyogTG9nIGZpbGVzIC0tLSBub3RlIHRoYXQgdHJhbnNmZXIgbG9nIGlzIG5vdyBpbiB0aGUgbW9kdWxlcy4uLiAqLwotCi0gICAgY2hhciAqZXJyb3JfZm5hbWU7Ci0gICAgYXBfZmlsZV90ICplcnJvcl9sb2c7Ci0gICAgaW50IGxvZ2xldmVsOwotCi0gICAgLyogTW9kdWxlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZm9yIHNlcnZlciwgYW5kIGRlZmF1bHRzLi4uICovCi0KLSAgICBpbnQgaXNfdmlydHVhbDsJCS8qIHRydWUgaWYgdGhpcyBpcyB0aGUgdmlydHVhbCBzZXJ2ZXIgKi8KLSAgICB2b2lkICptb2R1bGVfY29uZmlnOwkvKiBDb25maWcgdmVjdG9yIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8KLQkJCQkgKiBtb2R1bGVzJyBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmVzLgotCQkJCSAqLwotICAgIHZvaWQgKmxvb2t1cF9kZWZhdWx0czsJLyogTUlNRSB0eXBlIGluZm8sIGV0Yy4sIGJlZm9yZSB3ZSBzdGFydAotCQkJCSAqIGNoZWNraW5nIHBlci1kaXJlY3RvcnkgaW5mby4KLQkJCQkgKi8KLSAgICAvKiBUcmFuc2FjdGlvbiBoYW5kbGluZyAqLwotCi0gICAgc2VydmVyX2FkZHJfcmVjICphZGRyczsKLSAgICBpbnQgdGltZW91dDsJCS8qIFRpbWVvdXQsIGluIHNlY29uZHMsIGJlZm9yZSB3ZSBnaXZlIHVwICovCi0gICAgaW50IGtlZXBfYWxpdmVfdGltZW91dDsJLyogU2Vjb25kcyB3ZSdsbCB3YWl0IGZvciBhbm90aGVyIHJlcXVlc3QgKi8KLSAgICBpbnQga2VlcF9hbGl2ZV9tYXg7CQkvKiBNYXhpbXVtIHJlcXVlc3RzIHBlciBjb25uZWN0aW9uICovCi0gICAgaW50IGtlZXBfYWxpdmU7CQkvKiBVc2UgcGVyc2lzdGVudCBjb25uZWN0aW9ucz8gKi8KLQotICAgIGNoYXIgKnBhdGg7CQkJLyogUGF0aG5hbWUgZm9yIFNlcnZlclBhdGggKi8KLSAgICBpbnQgcGF0aGxlbjsJCS8qIExlbmd0aCBvZiBwYXRoICovCi0KLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqbmFtZXM7CS8qIE5vcm1hbCBuYW1lcyBmb3IgU2VydmVyQWxpYXMgc2VydmVycyAqLwotICAgIGFwX2FycmF5X2hlYWRlcl90ICp3aWxkX25hbWVzOwkvKiBXaWxkY2FyZGVkIG5hbWVzIGZvciBTZXJ2ZXJBbGlhcyBzZXJ2ZXJzICovCi0KLSAgICB1aWRfdCBzZXJ2ZXJfdWlkOyAgICAgICAgLyogZWZmZWN0aXZlIHVzZXIgaWQgd2hlbiBjYWxsaW5nIGV4ZWMgd3JhcHBlciAqLwotICAgIGdpZF90IHNlcnZlcl9naWQ7ICAgICAgICAvKiBlZmZlY3RpdmUgZ3JvdXAgaWQgd2hlbiBjYWxsaW5nIGV4ZWMgd3JhcHBlciAqLwotCi0gICAgaW50IGxpbWl0X3JlcV9saW5lOyAgICAgIC8qIGxpbWl0IG9uIHNpemUgb2YgdGhlIEhUVFAgcmVxdWVzdCBsaW5lICAgICovCi0gICAgaW50IGxpbWl0X3JlcV9maWVsZHNpemU7IC8qIGxpbWl0IG9uIHNpemUgb2YgYW55IHJlcXVlc3QgaGVhZGVyIGZpZWxkICovCi0gICAgaW50IGxpbWl0X3JlcV9maWVsZHM7ICAgIC8qIGxpbWl0IG9uIG51bWJlciBvZiByZXF1ZXN0IGhlYWRlciBmaWVsZHMgICovCi19OwotCi0vKiBzdHVmZiBtYXJrZWQgQVBJX0VYUE9SVCBpcyBwYXJ0IG9mIHRoZSBBUEksIGFuZCBpbnRlbmRlZCBmb3IgdXNlCi0gKiBieSBtb2R1bGVzCi0gKi8KLSNpZm5kZWYgQVBJX0VYUE9SVAotI2RlZmluZSBBUElfRVhQT1JUKHR5cGUpICAgIHR5cGUKLSNlbmRpZgotCi0vKiBTdHVmZiBtYXJrZWQgQVBJX0VYUE9SVF9OT05TVEQgaXMgcGFydCBvZiB0aGUgQVBJLCBhbmQgaW50ZW5kZWQgZm9yCi0gKiB1c2UgYnkgbW9kdWxlcy4gIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gQVBJX0VYUE9SVCBhbmQKLSAqIEFQSV9FWFBPUlRfTk9OU1REIGlzIHRoYXQgdGhlIGxhdHRlciBpcyByZXF1aXJlZCBmb3IgYW55IGZ1bmN0aW9ucwotICogd2hpY2ggdXNlIHZhcmFyZ3Mgb3IgYXJlIHVzZWQgdmlhIGluZGlyZWN0IGZ1bmN0aW9uIGNhbGwuICBUaGlzCi0gKiBpcyB0byBhY2NvbW9kYXRlIHRoZSB0d28gY2FsbGluZyBjb252ZW50aW9ucyBpbiB3aW5kb3dzIGRsbHMuCi0gKi8KLSNpZm5kZWYgQVBJX0VYUE9SVF9OT05TVEQKLSNkZWZpbmUgQVBJX0VYUE9SVF9OT05TVEQodHlwZSkgICAgdHlwZQotI2VuZGlmCi0KLSNpZm5kZWYgTU9EVUxFX1ZBUl9FWFBPUlQKLSNkZWZpbmUgTU9EVUxFX1ZBUl9FWFBPUlQKLSNlbmRpZgotI2lmbmRlZiBBUElfVkFSX0VYUE9SVAotI2RlZmluZSBBUElfVkFSX0VYUE9SVAotI2VuZGlmCi0KLS8qIG1vZHVsZXMgc2hvdWxkIG5vdCB1c2VkIGZ1bmN0aW9ucyBtYXJrZWQgQ09SRV9FWFBPUlQKLSAqIG9yIENPUkVfRVhQT1JUX05PTlNURCAqLwotI2lmbmRlZiBDT1JFX0VYUE9SVAotI2RlZmluZSBDT1JFX0VYUE9SVAlBUElfRVhQT1JUCi0jZW5kaWYKLSNpZm5kZWYgQ09SRV9FWFBPUlRfTk9OU1RECi0jZGVmaW5lIENPUkVfRVhQT1JUX05PTlNURAlBUElfRVhQT1JUX05PTlNURAotI2VuZGlmCi0KLS8qIE9uIE1hYyBPUyBYIFNlcnZlciwgc3ltYm9scyB0aGF0IGNvbmZsaWN0IHdpdGggbG9hZGVkIGR5bGlicwotICogKGVnLiBTeXN0ZW0gZnJhbWV3b3JrKSBuZWVkIHRvIGJlIGRlY2xhcmVkIGFzIHByaXZhdGUgc3ltYm9scyB3aXRoCi0gKiBfX3ByaXZhdGVfZXh0ZXJuX18uCi0gKiBGb3Igb3RoZXIgc3lzdGVtcywgbWFrZSB0aGF0IGEgbm8tb3AuCi0gKi8KLSNpZm5kZWYgYXBfcHJpdmF0ZV9leHRlcm4KLSNpZiAoZGVmaW5lZChNQUNfT1MpIHx8IGRlZmluZWQoTUFDX09TX1hfU0VSVkVSKSkgJiYgZGVmaW5lZChfX0RZTkFNSUNfXykKLSNkZWZpbmUgYXBfcHJpdmF0ZV9leHRlcm4gX19wcml2YXRlX2V4dGVybl9fCi0jZWxzZQotI2RlZmluZSBhcF9wcml2YXRlX2V4dGVybgotI2VuZGlmCi0jZW5kaWYKLQotLyogVGltZSAqLwotCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfZmllbGRfbm9wYXJhbShhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKmludHlwZSk7Ci1BUElfRVhQT1JUKGNoYXIgKikgYXBfaHRfdGltZShhcF9jb250ZXh0X3QgKnAsIGFwX3RpbWVfdCB0LCBjb25zdCBjaGFyICpmbXQsIGludCBnbXQpOwotCi0vKiBTdHJpbmcgaGFuZGxpbmcuIFRoZSAqX25jIHZhcmlhbnRzIGFsbG93IHlvdSB0byB1c2Ugbm9uLWNvbnN0IGNoYXIgKipzIGFzCi0gICBhcmd1bWVudHMgKHVuZm9ydHVuYXRlbHkgQyB3b24ndCBhdXRvbWF0aWNhbGx5IGNvbnZlcnQgYSBjaGFyICoqIHRvIGEgY29uc3QKLSAgIGNoYXIgKiopICovCi0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9nZXR3b3JkKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqKmxpbmUsIGNoYXIgc3RvcCk7Ci1BUElfRVhQT1JUKGNoYXIgKikgYXBfZ2V0d29yZF9uYyhhcF9jb250ZXh0X3QgKnAsIGNoYXIgKipsaW5lLCBjaGFyIHN0b3ApOwotQVBJX0VYUE9SVChjaGFyICopIGFwX2dldHdvcmRfd2hpdGUoYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyICoqbGluZSk7Ci1BUElfRVhQT1JUKGNoYXIgKikgYXBfZ2V0d29yZF93aGl0ZV9uYyhhcF9jb250ZXh0X3QgKnAsIGNoYXIgKipsaW5lKTsKLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9nZXR3b3JkX251bGxzKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqKmxpbmUsIGNoYXIgc3RvcCk7Ci1BUElfRVhQT1JUKGNoYXIgKikgYXBfZ2V0d29yZF9udWxsc19uYyhhcF9jb250ZXh0X3QgKnAsIGNoYXIgKipsaW5lLCBjaGFyIHN0b3ApOwotQVBJX0VYUE9SVChjaGFyICopIGFwX2dldHdvcmRfY29uZihhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKipsaW5lKTsKLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9nZXR3b3JkX2NvbmZfbmMoYXBfY29udGV4dF90ICpwLCBjaGFyICoqbGluZSk7Ci0KLUFQSV9FWFBPUlQoY29uc3QgY2hhciAqKSBhcF9zaXplX2xpc3RfaXRlbShjb25zdCBjaGFyICoqZmllbGQsIGludCAqbGVuKTsKLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9nZXRfbGlzdF9pdGVtKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqKmZpZWxkKTsKLUFQSV9FWFBPUlQoaW50KSBhcF9maW5kX2xpc3RfaXRlbShhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKmxpbmUsIGNvbnN0IGNoYXIgKnRvayk7Ci0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9nZXRfdG9rZW4oYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyICoqYWNjZXB0X2xpbmUsIGludCBhY2NlcHRfd2hpdGUpOwotQVBJX0VYUE9SVChpbnQpIGFwX2ZpbmRfdG9rZW4oYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyICpsaW5lLCBjb25zdCBjaGFyICp0b2spOwotQVBJX0VYUE9SVChpbnQpIGFwX2ZpbmRfbGFzdF90b2tlbihhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKmxpbmUsIGNvbnN0IGNoYXIgKnRvayk7Ci0KLUFQSV9FWFBPUlQoaW50KSBhcF9pc191cmwoY29uc3QgY2hhciAqdSk7Ci1BUElfRVhQT1JUKGludCkgYXBfdW5lc2NhcGVfdXJsKGNoYXIgKnVybCk7Ci1BUElfRVhQT1JUKHZvaWQpIGFwX25vMnNsYXNoKGNoYXIgKm5hbWUpOwotQVBJX0VYUE9SVCh2b2lkKSBhcF9nZXRwYXJlbnRzKGNoYXIgKm5hbWUpOwotQVBJX0VYUE9SVChjaGFyICopIGFwX2VzY2FwZV9wYXRoX3NlZ21lbnQoYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyICpzKTsKLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9vc19lc2NhcGVfcGF0aChhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKnBhdGgsIGludCBwYXJ0aWFsKTsKLSNkZWZpbmUgYXBfZXNjYXBlX3VyaShwcG9vbCxwYXRoKSBhcF9vc19lc2NhcGVfcGF0aChwcG9vbCxwYXRoLDEpCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfZXNjYXBlX2h0bWwoYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyICpzKTsKLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9jb25zdHJ1Y3Rfc2VydmVyKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqaG9zdG5hbWUsCi0JCQkJICAgIHVuc2lnbmVkIHBvcnQsIGNvbnN0IHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9lc2NhcGVfc2hlbGxfY21kKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqcyk7Ci0KLUFQSV9FWFBPUlQoaW50KSBhcF9jb3VudF9kaXJzKGNvbnN0IGNoYXIgKnBhdGgpOwotQVBJX0VYUE9SVChjaGFyICopIGFwX21ha2VfZGlyc3RyX3ByZWZpeChjaGFyICpkLCBjb25zdCBjaGFyICpzLCBpbnQgbik7Ci1BUElfRVhQT1JUKGNoYXIgKikgYXBfbWFrZV9kaXJzdHJfcGFyZW50KGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqcyk7Ci0vKiBkZXByZWNhdGVkLiAgVGhlIHByZXZpb3VzIHR3byByb3V0aW5lcyBhcmUgcHJlZmVycmVkLiAqLwotQVBJX0VYUE9SVChjaGFyICopIGFwX21ha2VfZGlyc3RyKGFwX2NvbnRleHRfdCAqYSwgY29uc3QgY2hhciAqcywgaW50IG4pOwotQVBJX0VYUE9SVChjaGFyICopIGFwX21ha2VfZnVsbF9wYXRoKGFwX2NvbnRleHRfdCAqYSwgY29uc3QgY2hhciAqZGlyLCBjb25zdCBjaGFyICpmKTsKLQotQVBJX0VYUE9SVChpbnQpIGFwX2lzX21hdGNoZXhwKGNvbnN0IGNoYXIgKnN0cik7Ci1BUElfRVhQT1JUKGludCkgYXBfc3RyY21wX21hdGNoKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZXhwKTsKLUFQSV9FWFBPUlQoaW50KSBhcF9zdHJjYXNlY21wX21hdGNoKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZXhwKTsKLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9wYmFzZTY0ZGVjb2RlKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqYnVmY29kZWQpOwotQVBJX0VYUE9SVChjaGFyICopIGFwX3BiYXNlNjRlbmNvZGUoYXBfY29udGV4dF90ICpwLCBjaGFyICpzdHJpbmcpOyAKLUFQSV9FWFBPUlQoY2hhciAqKSBhcF91dWRlY29kZShhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKmJ1ZmNvZGVkKTsKLUFQSV9FWFBPUlQoY2hhciAqKSBhcF91dWVuY29kZShhcF9jb250ZXh0X3QgKnAsIGNoYXIgKnN0cmluZyk7IAotCi0vKiBSZWdleGVzICovCi0jaWZkZWYgQVBfVVNFX0hTUkVHRVgKLSNpbmNsdWRlICJoc3JlZ2V4LmgiCi0jZWxzZQotI2luY2x1ZGUgPHJlZ2V4Lmg+Ci0jZW5kaWYKLQotQVBJX0VYUE9SVChyZWdleF90ICopIGFwX3ByZWdjb21wKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqcGF0dGVybiwKLQkJCQkgICBpbnQgY2ZsYWdzKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfcHJlZ2ZyZWUoYXBfY29udGV4dF90ICpwLCByZWdleF90ICpyZWcpOwotQVBJX0VYUE9SVChpbnQpICAgIGFwX3JlZ2V4ZWMoY29uc3QgcmVnZXhfdCAqcHJlZywgY29uc3QgY2hhciAqc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5tYXRjaCwgcmVnbWF0Y2hfdCBwbWF0Y2hbXSwgaW50IGVmbGFncyk7Ci1BUElfRVhQT1JUKHNpemVfdCkgYXBfcmVnZXJyb3IoaW50IGVycmNvZGUsIGNvbnN0IHJlZ2V4X3QgKnByZWcsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmVycmJ1Ziwgc2l6ZV90IGVycmJ1Zl9zaXplKTsKLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9wcmVnc3ViKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqaW5wdXQsIGNvbnN0IGNoYXIgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBubWF0Y2gsIHJlZ21hdGNoX3QgcG1hdGNoW10pOwotCi1BUElfRVhQT1JUKHZvaWQpIGFwX2NvbnRlbnRfdHlwZV90b2xvd2VyKGNoYXIgKik7Ci1BUElfRVhQT1JUKHZvaWQpIGFwX3N0cl90b2xvd2VyKGNoYXIgKik7Ci1BUElfRVhQT1JUKGludCkgYXBfaW5kKGNvbnN0IGNoYXIgKiwgY2hhcik7CS8qIFNpZ2guLi4gKi8KLUFQSV9FWFBPUlQoaW50KSBhcF9yaW5kKGNvbnN0IGNoYXIgKiwgY2hhcik7Ci0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9lc2NhcGVfcXVvdGVzIChhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKmluc3RyaW5nKTsKLQotLyogQ29tbW9uIHN0cnVjdHVyZSBmb3IgcmVhZGluZyBvZiBjb25maWcgZmlsZXMgLyBwYXNzd2QgZmlsZXMgZXRjLiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCAoKmdldGNoKSAodm9pZCAqcGFyYW0pOwkvKiBhIGdldGMoKS1saWtlIGZ1bmN0aW9uICovCi0gICAgdm9pZCAqKCpnZXRzdHIpICh2b2lkICpidWYsIHNpemVfdCBidWZzaXosIHZvaWQgKnBhcmFtKTsgLyogYSBmZ2V0cygpLWxpa2UgZnVuY3Rpb24gKi8KLSAgICBpbnQgKCpjbG9zZSkgKHZvaWQgKnBhcmFtKTsJLyogYSBjbG9zZSBoYW5kZXIgZnVuY3Rpb24gKi8KLSAgICB2b2lkICpwYXJhbTsJCS8qIHRoZSBhcmd1bWVudCBwYXNzZWQgdG8gZ2V0Y2gvZ2V0c3RyL2Nsb3NlICovCi0gICAgY29uc3QgY2hhciAqbmFtZTsJCS8qIHRoZSBmaWxlbmFtZSAvIGRlc2NyaXB0aW9uICovCi0gICAgdW5zaWduZWQgbGluZV9udW1iZXI7CS8qIGN1cnJlbnQgbGluZSBudW1iZXIsIHN0YXJ0aW5nIGF0IDEgKi8KLX0gY29uZmlnZmlsZV90OwotCi0vKiBPcGVuIGEgY29uZmlnZmlsZV90IGFzIEZJTEUsIHJldHVybiBvcGVuIGNvbmZpZ2ZpbGVfdCBzdHJ1Y3QgcG9pbnRlciAqLwotQVBJX0VYUE9SVChhcF9zdGF0dXNfdCkgYXBfcGNmZ19vcGVuZmlsZShjb25maWdmaWxlX3QgKiosIGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqbmFtZSk7Ci0KLS8qIEFsbG9jYXRlIGEgY29uZmlnZmlsZV90IGhhbmRsZSB3aXRoIHVzZXIgZGVmaW5lZCBmdW5jdGlvbnMgYW5kIHBhcmFtcyAqLwotQVBJX0VYUE9SVChjb25maWdmaWxlX3QgKikgYXBfcGNmZ19vcGVuX2N1c3RvbShhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKmRlc2NyLAotICAgIHZvaWQgKnBhcmFtLAotICAgIGludCgqZ2V0Y19mdW5jKSh2b2lkKiksCi0gICAgdm9pZCAqKCpnZXRzX2Z1bmMpICh2b2lkICpidWYsIHNpemVfdCBidWZzaXosIHZvaWQgKnBhcmFtKSwKLSAgICBpbnQoKmNsb3NlX2Z1bmMpKHZvaWQgKnBhcmFtKSk7Ci0KLS8qIFJlYWQgb25lIGxpbmUgZnJvbSBvcGVuIGNvbmZpZ2ZpbGVfdCwgc3RyaXAgTEYsIGluY3JlYXNlIGxpbmUgbnVtYmVyICovCi1BUElfRVhQT1JUKGludCkgYXBfY2ZnX2dldGxpbmUoY2hhciAqYnVmLCBzaXplX3QgYnVmc2l6ZSwgY29uZmlnZmlsZV90ICpjZnApOwotCi0vKiBSZWFkIG9uZSBjaGFyIGZyb20gb3BlbiBjb25maWdmaWxlX3QsIGluY3JlYXNlIGxpbmUgbnVtYmVyIHVwb24gTEYgKi8KLUFQSV9FWFBPUlQoaW50KSBhcF9jZmdfZ2V0Yyhjb25maWdmaWxlX3QgKmNmcCk7Ci0KLS8qIERldGFjaCBmcm9tIG9wZW4gY29uZmlnZmlsZV90LCBjYWxsaW5nIHRoZSBjbG9zZSBoYW5kbGVyICovCi1BUElfRVhQT1JUKGludCkgYXBfY2ZnX2Nsb3NlZmlsZShjb25maWdmaWxlX3QgKmNmcCk7Ci0KLS8qIE1pc2Mgc3lzdGVtIGhhY2tlcnkgKi8KLQotQVBJX0VYUE9SVCh1aWRfdCkgYXBfdW5hbWUyaWQoY29uc3QgY2hhciAqbmFtZSk7Ci1BUElfRVhQT1JUKGdpZF90KSBhcF9nbmFtZTJpZChjb25zdCBjaGFyICpuYW1lKTsKLUFQSV9FWFBPUlQoaW50KSBhcF9pc19kaXJlY3RvcnkoY29uc3QgY2hhciAqbmFtZSk7Ci1BUElfRVhQT1JUKHZvaWQpIGFwX2NoZGlyX2ZpbGUoY29uc3QgY2hhciAqZmlsZSk7Ci1BUElfRVhQT1JUKGludCkgYXBfZ2V0X21heF9kYWVtb25zKHZvaWQpOwotQVBJX0VYUE9SVChjb25zdCBzZXJ2ZXJfcmVjICopIGFwX2dldF9zZXJ2ZXJfY29uZih2b2lkKTsKLQotI2lmZGVmIF9PU0RfUE9TSVgKLWV4dGVybiBjb25zdCBjaGFyICpvc19zZXRfYWNjb3VudChhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKmFjY291bnQpOwotZXh0ZXJuIGludCBvc19pbml0X2pvYl9lbnZpcm9ubWVudChzZXJ2ZXJfcmVjICpzLCBjb25zdCBjaGFyICp1c2VyX25hbWUsIGludCBvbmVfcHJvY2Vzcyk7Ci0jZW5kaWYgLyogX09TRF9QT1NJWCAqLwotCi1jaGFyICphcF9nZXRfbG9jYWxfaG9zdChhcF9jb250ZXh0X3QgKik7Ci11bnNpZ25lZCBsb25nIGFwX2dldF92aXJ0aG9zdF9hZGRyKGNoYXIgKmhvc3RuYW1lLCB1bnNpZ25lZCBzaG9ydCAqcG9ydCk7Ci0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9lc2NhcGVfcXVvdGVzKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqaW5zdHIpOwotCi0vKgotICogUmVkZWZpbmUgYXNzZXJ0KCkgdG8gc29tZXRoaW5nIG1vcmUgdXNlZnVsIGZvciBhbiBBcGFjaGUuLi4KLSAqLwotQVBJX0VYUE9SVCh2b2lkKSBhcF9sb2dfYXNzZXJ0KGNvbnN0IGNoYXIgKnN6RXhwLCBjb25zdCBjaGFyICpzekZpbGUsIGludCBuTGluZSkKLQkJCSAgICBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOwotI2RlZmluZSBhcF9hc3NlcnQoZXhwKSAoKGV4cCkgPyAodm9pZCkwIDogYXBfbG9nX2Fzc2VydCgjZXhwLF9fRklMRV9fLF9fTElORV9fKSkKLQotLyogQSBzZXQgb2YgZmxhZ3Mgd2hpY2ggaW5kaWNhdGUgcGxhY2VzIHdoZXJlIHRoZSBzZXJ2ZXIgc2hvdWxkIHJhaXNlKFNJR1NUT1ApLgotICogVGhpcyBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZywgYmVjYXVzZSB5b3UgY2FuIHRoZW4gYXR0YWNoIHRvIHRoYXQgcHJvY2VzcwotICogd2l0aCBnZGIgYW5kIGNvbnRpbnVlLiAgVGhpcyBpcyBpbXBvcnRhbnQgaW4gY2FzZXMgd2hlcmUgb25lX3Byb2Nlc3MKLSAqIGRlYnVnZ2luZyBpc24ndCBwb3NzaWJsZS4KLSAqLwotI2RlZmluZSBTSUdTVE9QX0RFVEFDSAkJCTEKLSNkZWZpbmUgU0lHU1RPUF9NQUtFX0NISUxECQkyCi0jZGVmaW5lIFNJR1NUT1BfU1BBV05fQ0hJTEQJCTQKLSNkZWZpbmUgU0lHU1RPUF9QSVBFRF9MT0dfU1BBV04JCTgKLSNkZWZpbmUgU0lHU1RPUF9DR0lfQ0hJTEQJCTE2Ci0KLSNpZmRlZiBERUJVR19TSUdTVE9QCi1leHRlcm4gaW50IHJhaXNlX3NpZ3N0b3BfZmxhZ3M7Ci0jZGVmaW5lIFJBSVNFX1NJR1NUT1AoeCkJZG8geyBcCi0JaWYgKHJhaXNlX3NpZ3N0b3BfZmxhZ3MgJiBTSUdTVE9QXyMjeCkgcmFpc2UoU0lHU1RPUCk7XAotICAgIH0gd2hpbGUgKDApCi0jZWxzZQotI2RlZmluZSBSQUlTRV9TSUdTVE9QKHgpCi0jZW5kaWYKLQotQVBJX0VYUE9SVChleHRlcm4gY29uc3QgY2hhciAqKSBhcF9wc2lnbmF0dXJlKGNvbnN0IGNoYXIgKnByZWZpeCwgcmVxdWVzdF9yZWMgKnIpOwotCi0vKiBzdHJ0b3VsIGRvZXMgbm90IGV4aXN0IG9uIHN1bm9zNC4gKi8KLSNpZmRlZiBzdHJ0b3VsCi0jdW5kZWYgc3RydG91bAotI2VuZGlmCi0jZGVmaW5lIHN0cnRvdWwgc3RydG91bF9pc19ub3RfYV9wb3J0YWJsZV9mdW5jdGlvbl91c2Vfc3RydG9sX2luc3RlYWQKLQotI2RlZmluZSBhcF9pc19hYm9ydGVkKGFib3J0KSAoYWJvcnQtPmFib3J0ZWQgPT0xKQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYJLyogIUFQQUNIRV9IVFRQRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wbV9zdGF0dXMuaCBiL2luY2x1ZGUvbXBtX3N0YXR1cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTZmNTBmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXBtX3N0YXR1cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIFRPRE86IFBvc3NpYmxlIGFkZGl0aW9ucyB0byB0aGlzIEFQSSBpbmNsdWRlIGdldHRpbmcgYSBsaXN0IG9mIGNvbm5lY3Rpb24KLSAqIElEcyBhbmQgYSBsaXN0IG9mIGtleXMgaW4gYSBwYXJ0aWN1bGFyIHJvdy4KLSAqLwotCi0jaWZuZGVmIEFQQUNIRV9NUE1fU1RBVFVTX0gKLSNkZWZpbmUgQVBBQ0hFX01QTV9TVEFUVVNfSAotCi0jaW5jbHVkZSAiYXByX2xpYi5oIgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbG9uZyBjb25uX2lkOwotICAgIGFwX3RhYmxlX3QgKmRhdGE7Ci19IGFwX3N0YXR1c190YWJsZV9yb3dfdDsKLQotLyoqCi0gKgotICogR2V0IGEgY2VsbCBmcm9tIHRoZSBzdGF0dXMgdGFibGUuIERvbid0IG1lc3Mgd2l0aCB0aGUgc3RyaW5nIHlvdSBnZXQuCi0gKgotICogY29ubl9pZCA9IENvbm5lY3Rpb24gSUQKLSAqIGtleSA9IGtleQotICoKLSAqLwotQVBJX0VYUE9SVChjb25zdCBjaGFyICopIGFwX2dldF9jb25uZWN0aW9uX3N0YXR1cyhsb25nIGNvbm5faWQsIGNvbnN0IGNoYXIgKmtleSk7Ci0KLS8qKgotICogR2V0IGFuIGFycmF5IG9mIGN1cnJlbnQgY29ubmVjdGlvbiBJRHMuCi0gKgotICovCi1BUElfRVhQT1JUKGFwX2FycmF5X2hlYWRlcl90ICopIGFwX2dldF9jb25uZWN0aW9ucyhhcF9jb250ZXh0X3QgKnApOwotCi0vKioKLSAqIEdldCBhbiBhcnJheSBvZiBrZXlzIGZyb20gYSBnaXZlbiBjb25uZWN0aW9uLgotICoKLSAqIGNvbm5faWQgPSBDb25uZWN0aW9uIElECi0gKgotICovCi1BUElfRVhQT1JUKGFwX2FycmF5X2hlYWRlcl90ICopIGFwX2dldF9jb25uZWN0aW9uX2tleXMoYXBfY29udGV4dF90ICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgY29ubl9pZCk7Ci0KLS8qKgotICoKLSAqIFNldCBhIGNlbGwgaW4gdGhlIHN0YXR1cyB0YWJsZS4gTm8gZ3VhcmFudGVlcyBhcmUgbWFkZSB0aGF0IGxvbmcgc3RyaW5ncwotICogd29uJ3QgYmUgdHJ1bmNhdGVkLgotICoKLSAqIGNvbm5faWQgPSBDb25uZWN0aW9uIElECi0gKiBrZXkgPSBrZXkKLSAqIHZhbHVlID0gdmFsdWUKLSAqCi0gKi8KLUFQSV9FWFBPUlQodm9pZCkgYXBfdXBkYXRlX2Nvbm5lY3Rpb25fc3RhdHVzKGxvbmcgY29ubl9pZCwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSk7Ci0KLS8qKgotICoKLSAqIENsZWFyIG91dCB0aGlzIGNvbm5lY3Rpb24ncyBzdGF0dXMgdmFsdWVzLiBOb3JtYWxseSBjYWxsZWQgd2hlbiBhCi0gKiBjb25uZWN0aW9uIGlzIGNsb3NlZAotICoKLSAqIGNvbm5faWQgPSBDb25uZWN0aW9uIElECi0gKgotICovCi1BUElfRVhQT1JUKHZvaWQpIGFwX3Jlc2V0X2Nvbm5lY3Rpb25fc3RhdHVzKGxvbmcgY29ubl9pZCk7Ci0KLS8qKgotICoKLSAqIFJldHVybnMgdGhlIG1vc3QgdXAtdG8tZGF0ZSBzdGF0dXMgdGFibGUgYXZhaWxhYmxlLCBpbiB0aGUgZm9ybSBvZiBhbiBhcnJheQotICogb2YgYXBfc3RhdHVzX3Jvd190J3MuCi0gKgotICogcCA9IGNvbnRleHQsIGdlbmVyYWxseSBvZiB0aGUgcmVxdWVzdAotICoKLSAqLwotQVBJX0VYUE9SVChhcF9hcnJheV9oZWFkZXJfdCAqKSBhcF9nZXRfc3RhdHVzX3RhYmxlKGFwX2NvbnRleHRfdCAqcCk7Ci0KLSNlbmRpZiAvKiBBUEFDSEVfU0VSVkVSX1NUQVRTX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZmMxNDEzLmggYi9pbmNsdWRlL3JmYzE0MTMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5YzlkMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3JmYzE0MTMuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotI2lmbmRlZiBBUEFDSEVfUkZDMTQxM19ICi0jZGVmaW5lIEFQQUNIRV9SRkMxNDEzX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1leHRlcm4gY2hhciAqYXBfcmZjMTQxMyhjb25uX3JlYyAqY29ubiwgc2VydmVyX3JlYyAqc3J2KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCS8qICFBUEFDSEVfUkZDMTQxM19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxfZGF0ZS5oIGIvaW5jbHVkZS91dGlsX2RhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhjOTE1NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxfZGF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaWZuZGVmIEFQQUNIRV9VVElMX0RBVEVfSAotI2RlZmluZSBBUEFDSEVfVVRJTF9EQVRFX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKgotICogdXRpbF9kYXRlLmg6IHByb3RvdHlwZXMgZm9yIGRhdGUgcGFyc2luZyB1dGlsaXR5IHJvdXRpbmVzCi0gKi8KLQotI2luY2x1ZGUgImFwcl90aW1lLmgiCi0KLSNkZWZpbmUgQkFEX0RBVEUgKGFwX3RpbWVfdCkwCi0KLUFQSV9FWFBPUlQoaW50KSBhcF9jaGVja21hc2soY29uc3QgY2hhciAqZGF0YSwgY29uc3QgY2hhciAqbWFzayk7Ci1BUElfRVhQT1JUKGFwX3RpbWVfdCkgYXBfcGFyc2VIVFRQZGF0ZShjb25zdCBjaGFyICpkYXRlKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCS8qICFBUEFDSEVfVVRJTF9EQVRFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbF9tZDUuaCBiL2luY2x1ZGUvdXRpbF9tZDUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUxMTUwNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxfbWQ1LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLSNpZm5kZWYgQVBBQ0hFX1VUSUxfTUQ1X0gKLSNkZWZpbmUgQVBBQ0hFX1VUSUxfTUQ1X0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaW5jbHVkZSAiYXBfbWQ1LmgiCi0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9tZDUoYXBfY29udGV4dF90ICphLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzdHJpbmcpOwotQVBJX0VYUE9SVChjaGFyICopIGFwX21kNV9iaW5hcnkoYXBfY29udGV4dF90ICphLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pOwotQVBJX0VYUE9SVChjaGFyICopIGFwX21kNWNvbnRleHRUbzY0KGFwX2NvbnRleHRfdCAqcCwgQVBfTUQ1X0NUWCAqIGNvbnRleHQpOwotQVBJX0VYUE9SVChjaGFyICopIGFwX21kNWRpZ2VzdChhcF9jb250ZXh0X3QgKnAsIGFwX2ZpbGVfdCAqaW5maWxlKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCS8qICFBUEFDSEVfVVRJTF9NRDVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlsX3NjcmlwdC5oIGIvaW5jbHVkZS91dGlsX3NjcmlwdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDM4YzYzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbF9zY3JpcHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotI2lmbmRlZiBBUEFDSEVfVVRJTF9TQ1JJUFRfSAotI2RlZmluZSBBUEFDSEVfVVRJTF9TQ1JJUFRfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZm5kZWYgQVBBQ0hFX0FSR19NQVgKLSNpZmRlZiBfUE9TSVhfQVJHX01BWAotI2RlZmluZSBBUEFDSEVfQVJHX01BWCBfUE9TSVhfQVJHX01BWAotI2Vsc2UKLSNkZWZpbmUgQVBBQ0hFX0FSR19NQVggNTEyCi0jZW5kaWYKLSNlbmRpZgotCi1BUElfRVhQT1JUKGNoYXIgKiopIGFwX2NyZWF0ZV9lbnZpcm9ubWVudChhcF9jb250ZXh0X3QgKnAsIGFwX3RhYmxlX3QgKnQpOwotQVBJX0VYUE9SVChpbnQpIGFwX2ZpbmRfcGF0aF9pbmZvKGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgY2hhciAqcGF0aF9pbmZvKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfYWRkX2NnaV92YXJzKHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfYWRkX2NvbW1vbl92YXJzKHJlcXVlc3RfcmVjICpyKTsKLUFQSV9FWFBPUlQoaW50KSBhcF9zY2FuX3NjcmlwdF9oZWFkZXJfZXJyKHJlcXVlc3RfcmVjICpyLCBhcF9maWxlX3QgKmYsIGNoYXIgKmJ1ZmZlcik7Ci1BUElfRVhQT1JUKGludCkgYXBfc2Nhbl9zY3JpcHRfaGVhZGVyX2Vycl9idWZmKHJlcXVlc3RfcmVjICpyLCBCVUZGICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpidWZmZXIpOwotQVBJX0VYUE9SVChpbnQpIGFwX3NjYW5fc2NyaXB0X2hlYWRlcl9lcnJfY29yZShyZXF1ZXN0X3JlYyAqciwgY2hhciAqYnVmZmVyLAotCQkJCSAgICAgICBpbnQgKCpnZXRzZnVuYykgKGNoYXIgKiwgaW50LCB2b2lkICopLAotCQkJCSAgICAgICB2b2lkICpnZXRzZnVuY19kYXRhKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfc2VuZF9zaXplKGFwX3NzaXplX3Qgc2l6ZSwgcmVxdWVzdF9yZWMgKnIpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYJLyogIUFQQUNIRV9VVElMX1NDUklQVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxfdXJpLmggYi9pbmNsdWRlL3V0aWxfdXJpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTBjODEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlsX3VyaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiB1dGlsX3VyaS5oOiBFeHRlcm5hbCBJbnRlcmZhY2Ugb2YgdXRpbF91cmkuYwotICovCi0KLSNpZm5kZWYgVVRJTF9VUklfSAotI2RlZmluZSBVVElMX1VSSV9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgdW5zaWduZWQgc2hvcnQgZGVmYXVsdF9wb3J0OwotfSBzY2hlbWVzX3Q7Ci0KLSNkZWZpbmUJREVGQVVMVF9GVFBfREFUQV9QT1JUCTIwCi0jZGVmaW5lCURFRkFVTFRfRlRQX1BPUlQJMjEKLSNkZWZpbmUJREVGQVVMVF9HT1BIRVJfUE9SVAk3MAotI2RlZmluZQlERUZBVUxUX05OVFBfUE9SVAkxMTkKLSNkZWZpbmUJREVGQVVMVF9XQUlTX1BPUlQJMjEwCi0jZGVmaW5lCURFRkFVTFRfU05FV1NfUE9SVAk1NjMKLSNkZWZpbmUJREVGQVVMVF9QUk9TUEVST19QT1JUCTE1MjUJLyogV0FSTklORzogY29uZmxpY3Qgdy9PcmFjbGUgKi8KLQotLyogRmxhZ3MgcGFzc2VkIHRvIHVucGFyc2VfdXJpX2NvbXBvbmVudHMoKTogKi8KLSNkZWZpbmUgVU5QX09NSVRTSVRFUEFSVAkoMVU8PDApCS8qIHN1cHByZXNzICJzY2hlbWU6Ly91c2VyQHNpdGU6cG9ydCIgKi8KLSNkZWZpbmUJVU5QX09NSVRVU0VSCQkoMVU8PDEpCS8qIEp1c3Qgb21pdCB1c2VyICovCi0jZGVmaW5lCVVOUF9PTUlUUEFTU1dPUkQJKDFVPDwyKQkvKiBKdXN0IG9taXQgcGFzc3dvcmQgKi8KLSNkZWZpbmUJVU5QX09NSVRVU0VSSU5GTwkoVU5QX09NSVRVU0VSfFVOUF9PTUlUUEFTU1dPUkQpCS8qIG9taXQgInVzZXI6cGFzc3dvcmRAIiBwYXJ0ICovCi0jZGVmaW5lCVVOUF9SRVZFQUxQQVNTV09SRAkoMVU8PDMpCS8qIFNob3cgcGxhaW4gdGV4dCBwYXNzd29yZCAoZGVmYXVsdDogc2hvdyBYWFhYWFhYWCkgKi8KLSNkZWZpbmUgVU5QX09NSVRQQVRISU5GTwkoMVU8PDQpCS8qIFNob3cgInNjaGVtZTovL3VzZXJAc2l0ZTpwb3J0IiBvbmx5ICovCi0jZGVmaW5lIFVOUF9PTUlUUVVFUlkJICAgICAgICAoMVU8PDUpCS8qIE9taXQgdGhlICI/cXVlcnlhcmciIGZyb20gdGhlIHBhdGggKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNoYXIgKnNjaGVtZTsJCS8qIHNjaGVtZSAoImh0dHAiLyJmdHAiLy4uLikgKi8KLSAgICBjaGFyICpob3N0aW5mbzsgICAgICAgICAgICAgLyogY29tYmluZWQgW3VzZXJbOnBhc3N3b3JkXUBdaG9zdFs6cG9ydF0gKi8KLSAgICBjaGFyICp1c2VyOwkJCS8qIHVzZXIgbmFtZSwgYXMgaW4gaHR0cDovL3VzZXI6cGFzc3dkQGhvc3Q6cG9ydC8gKi8KLSAgICBjaGFyICpwYXNzd29yZDsJCS8qIHBhc3N3b3JkLCBhcyBpbiBodHRwOi8vdXNlcjpwYXNzd2RAaG9zdDpwb3J0LyAqLwotICAgIGNoYXIgKmhvc3RuYW1lOwkJLyogaG9zdG5hbWUgZnJvbSBVUkkgKG9yIGZyb20gSG9zdDogaGVhZGVyKSAqLwotICAgIGNoYXIgKnBvcnRfc3RyOwkJLyogcG9ydCBzdHJpbmcgKGludGVnZXIgcmVwcmVzZW50YXRpb24gaXMgaW4gInBvcnQiKSAqLwotICAgIGNoYXIgKnBhdGg7CQkJLyogdGhlIHJlcXVlc3QgcGF0aCAob3IgIi8iIGlmIG9ubHkgc2NoZW1lOi8vaG9zdCB3YXMgZ2l2ZW4pICovCi0gICAgY2hhciAqcXVlcnk7CQkvKiBFdmVyeXRoaW5nIGFmdGVyIGEgJz8nIGluIHRoZSBwYXRoLCBpZiBwcmVzZW50ICovCi0gICAgY2hhciAqZnJhZ21lbnQ7CQkvKiBUcmFpbGluZyAiI2ZyYWdtZW50IiBzdHJpbmcsIGlmIHByZXNlbnQgKi8KLQotICAgIHN0cnVjdCBob3N0ZW50ICpob3N0ZW50OwotCi0gICAgdW5zaWduZWQgc2hvcnQgcG9ydDsJLyogVGhlIHBvcnQgbnVtYmVyLCBudW1lcmljLCB2YWxpZCBvbmx5IGlmIHBvcnRfc3RyICE9IE5VTEwgKi8KLSAgICAKLSAgICB1bnNpZ25lZCBpc19pbml0aWFsaXplZDoxOwotCi0gICAgdW5zaWduZWQgZG5zX2xvb2tlZF91cDoxOwotICAgIHVuc2lnbmVkIGRuc19yZXNvbHZlZDoxOwotCi19IHVyaV9jb21wb25lbnRzOwotCi0vKiB1dGlsX3VyaS5jICovCi1BUElfRVhQT1JUKHVuc2lnbmVkIHNob3J0KSBhcF9kZWZhdWx0X3BvcnRfZm9yX3NjaGVtZShjb25zdCBjaGFyICpzY2hlbWVfc3RyKTsKLUFQSV9FWFBPUlQodW5zaWduZWQgc2hvcnQpIGFwX2RlZmF1bHRfcG9ydF9mb3JfcmVxdWVzdChjb25zdCByZXF1ZXN0X3JlYyAqcik7Ci1BUElfRVhQT1JUKHN0cnVjdCBob3N0ZW50ICopIGFwX3BkdXBob3N0ZW50KGFwX2NvbnRleHRfdCAqcCwgY29uc3Qgc3RydWN0IGhvc3RlbnQgKmhwKTsKLUFQSV9FWFBPUlQoc3RydWN0IGhvc3RlbnQgKikgYXBfcGdldGhvc3RieW5hbWUoYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyICpob3N0bmFtZSk7Ci1BUElfRVhQT1JUKGNoYXIgKikgYXBfdW5wYXJzZV91cmlfY29tcG9uZW50cyhhcF9jb250ZXh0X3QgKnAsIGNvbnN0IHVyaV9jb21wb25lbnRzICp1cHRyLAotICAgIHVuc2lnbmVkIGZsYWdzKTsKLUFQSV9FWFBPUlQoaW50KSBhcF9wYXJzZV91cmlfY29tcG9uZW50cyhhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKnVyaSwgdXJpX2NvbXBvbmVudHMgKnVwdHIpOwotQVBJX0VYUE9SVChpbnQpIGFwX3BhcnNlX2hvc3RpbmZvX2NvbXBvbmVudHMoYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyICpob3N0aW5mbywgdXJpX2NvbXBvbmVudHMgKnVwdHIpOwotLyogY2FsbGVkIGJ5IHRoZSBjb3JlIGluIG1haW4oKSAqLwotZXh0ZXJuIHZvaWQgYXBfdXRpbF91cmlfaW5pdCh2b2lkKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qVVRJTF9VUklfSCovCmRpZmYgLS1naXQgYS9saWJodHRwZC5kZWYgYi9saWJodHRwZC5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NGY3OTEuLjAwMDAwMDAKLS0tIGEvbGliaHR0cGQuZGVmCisrKyAvZGV2L251bGwKQEAgLTEsMzg0ICswLDAgQEAKLTsgYXBhY2hlY29yZS5kZWYgOiAKLQotTElCUkFSWSBBcGFjaGVDb3JlCi1ERVNDUklQVElPTiAnJwotCi1FWFBPUlRTCi0JOyBBZGQgbmV3IEFQSSBjYWxscyB0byB0aGUgZW5kIG9mIHRoaXMgbGlzdC4KLTsJYXBfTUQ1RmluYWwgICBAMQotOwlhcF9NRDVJbml0ICAgQDIKLTsJYXBfTUQ1VXBkYXRlICAgQDMKLTsJYXBfYWNxdWlyZV9tdXRleCAgIEA0Ci0JYXBfYWRkX2NnaV92YXJzCSAgQDUKLQlhcF9hZGRfY29tbW9uX3ZhcnMgICBANgotCWFwX2FkZF9sb2FkZWRfbW9kdWxlICAgQDcKLQlhcF9hZGRfbW9kdWxlICAgQDgKLQlhcF9hZGRfbmFtZWRfbW9kdWxlICAgQDkKLQlhcF9hZGRfcGVyX2Rpcl9jb25mICAgQDEwCi0JYXBfYWRkX3Blcl91cmxfY29uZiAgIEAxMQotCTthcF9hZGRfdmVyc2lvbl9jb21wb25lbnQgICBAMTIKLQlhcF9hbGxvd19vcHRpb25zICAgQDEzCi0JYXBfYWxsb3dfb3ZlcnJpZGVzICAgQDE0Ci07CWFwX2FwcGVuZF9hcnJheXMgICBAMTUKLTsJYXBfYXJyYXlfY2F0ICAgQDE2Ci0JYXBfYXV0aF9uYW1lICAgQDE3Ci0JYXBfYXV0aF90eXBlICAgQDE4Ci0JYXBfYmFzaWNfaHR0cF9oZWFkZXIgICBAMTkKLQlhcF9iY2xvc2UgICBAMjAKLQlhcF9iY3JlYXRlICAgQDIxCi0JYXBfYmZpbGJ1ZiAgIEAyMgotCTthcF9iZmlsZW5vICAgQDIzCi0JYXBfYmZsc2J1ZiAgIEAyNAotCWFwX2JmbHVzaCAgIEAyNQotCWFwX2JnZXRvcHQgICBAMjYKLQlhcF9iZ2V0cyAgIEAyNwotCTthcF9iaGFsZmR1cGxleCAgIEAyOAotCTthcF9ibG9ja19hbGFybXMgICBAMjkKLQlhcF9ibG9va2MgICBAMzAKLQk7YXBfYm5vbmJsb2NrICAgQDMxCi0JYXBfYm9uZXJyb3IgICBAMzIKLQk7YXBfYnB1c2hmZCAgIEAzMwotCTthcF9icHVzaGggICBAMzQKLQlhcF9icHV0cyAgIEAzNQotCWFwX2JyZWFkICAgQDM2Ci0JYXBfYnNldGZsYWcgICBAMzcKLQlhcF9ic2V0b3B0ICAgQDM4Ci0JO2FwX2Jza2lwbGYgICBAMzkKLTsJYXBfYnNwYXduX2NoaWxkICAgQDQwCi0JYXBfYndyaXRlICAgQDQxCi0JO2FwX2J5dGVzX2luX2ZyZWVfYmxvY2tzICAgQDQyCi0JO2FwX2J5dGVzX2luX3Bvb2wgICBANDMKLTsJYXBfY2FsbF9leGVjICAgQDQ0Ci0JO2FwX2Nhbl9leGVjICAgQDQ1Ci0JYXBfY2ZnX2Nsb3NlZmlsZSAgIEA0NgotCWFwX2NmZ19nZXRjICAgQDQ3Ci0JYXBfY2ZnX2dldGxpbmUgICBANDgKLQlhcF9jaGRpcl9maWxlICAgQDQ5Ci0JO2FwX2NoZWNrX2FsYXJtICAgQDUwCi0JYXBfY2hlY2tfY21kX2NvbnRleHQgICBANTEKLQlhcF9jaGVja21hc2sgICBANTIKLTsJYXBfY2xlYW51cF9mb3JfZXhlYyAgIEA1MwotCWFwX2NsZWFyX21vZHVsZV9saXN0ICAgQDU0Ci07CWFwX2NsZWFyX3Bvb2wgICBANTUKLTsJYXBfY2xlYXJfdGFibGUgICBANTYKLQlhcF9jbG9zZV9waXBlZF9sb2cgICBANTcKLQlhcF9jb25zdHJ1Y3Rfc2VydmVyICAgQDU4Ci0JYXBfY29uc3RydWN0X3VybCAgIEA1OQotCWFwX2NvbnRlbnRfdHlwZV90b2xvd2VyICAgQDYwCi07CWFwX2NvcHlfYXJyYXkgICBANjEKLTsJYXBfY29weV9hcnJheV9oZHIgICBANjIKLTsJYXBfY29weV90YWJsZSAgIEA2MwotCWFwX2NvdW50X2RpcnMgICBANjQKLTsJYXBfY3B5c3RybiAgIEA2NQotCWFwX2NyZWF0ZV9lbnZpcm9ubWVudCAgIEA2NgotOwlhcF9jcmVhdGVfbXV0ZXggICBANjcKLQlhcF9jcmVhdGVfcGVyX2Rpcl9jb25maWcgICBANjgKLQlhcF9jdXN0b21fcmVzcG9uc2UgICBANjkKLQlhcF9kZWZhdWx0X3BvcnRfZm9yX3JlcXVlc3QgICBANzAKLQlhcF9kZWZhdWx0X3BvcnRfZm9yX3NjaGVtZSAgIEA3MQotCWFwX2RlZmF1bHRfdHlwZSAgIEA3MgotOwlhcF9kZXN0cm95X211dGV4ICAgQDczCi07CWFwX2Rlc3Ryb3lfcG9vbCAgIEA3NAotCWFwX2Rlc3Ryb3lfc3ViX3JlcSAgIEA3NQotCWFwX2RpZSAgIEA3NgotCWFwX2Rpc2NhcmRfcmVxdWVzdF9ib2R5ICAgQDc3Ci0JYXBfZG9jdW1lbnRfcm9vdCAgIEA3OAotCWFwX2VhY2hfYnl0ZXJhbmdlICAgQDc5Ci0JYXBfZXJyb3JfbG9nMnN0ZGVyciAgIEA4MAotCWFwX2VzY2FwZV9odG1sICAgQDgxCi0JYXBfZXNjYXBlX3BhdGhfc2VnbWVudCAgIEA4MgotCWFwX2VzY2FwZV9xdW90ZXMgICBAODMKLQlhcF9lc2NhcGVfc2hlbGxfY21kICAgQDg0Ci0JO2FwX2V4aXN0c19zY29yZWJvYXJkX2ltYWdlICAgQDg1Ci0JYXBfZmluYWxpemVfcmVxdWVzdF9wcm90b2NvbCAgIEA4NgotCWFwX2ZpbmRfY29tbWFuZCAgIEA4NwotCWFwX2ZpbmRfY29tbWFuZF9pbl9tb2R1bGVzICAgQDg4Ci0JYXBfZmluZF9sYXN0X3Rva2VuICAgQDg5Ci0JYXBfZmluZF9saW5rZWRfbW9kdWxlICAgQDkwCi0JYXBfZmluZF9tb2R1bGVfbmFtZSAgIEA5MQotCWFwX2ZpbmRfcGF0aF9pbmZvICAgQDkyCi0JYXBfZmluZF90b2tlbiAgIEA5MwotCWFwX2dldF9iYXNpY19hdXRoX3B3ICAgQDk0Ci0JYXBfZ2V0X2NsaWVudF9ibG9jayAgIEA5NQotOwlhcF9nZXRfZ210b2ZmICAgQDk2Ci0JYXBfZ2V0X2xpbWl0X3JlcV9ib2R5ICAgQDk3Ci0JYXBfZ2V0X3JlbW90ZV9ob3N0ICAgQDk4Ci0JYXBfZ2V0X3JlbW90ZV9sb2duYW1lICAgQDk5Ci0JYXBfZ2V0X3NlcnZlcl9idWlsdCAgIEAxMDAKLQlhcF9nZXRfc2VydmVyX25hbWUgICBAMTAxCi0JYXBfZ2V0X3NlcnZlcl9wb3J0ICAgQDEwMgotCTthcF9nZXRfc2VydmVyX3ZlcnNpb24gICBAMTAzCi07CWFwX2dldF90aW1lICAgQDEwNAotCWFwX2dldF90b2tlbiAgIEAxMDUKLQlhcF9nZXRwYXJlbnRzICAgQDEwNgotCWFwX2dldHdvcmQgICBAMTA3Ci0JYXBfZ2V0d29yZF9jb25mICAgQDEwOAotCWFwX2dldHdvcmRfY29uZl9uYyAgIEAxMDkKLQlhcF9nZXR3b3JkX25jICAgQDExMAotCWFwX2dldHdvcmRfbnVsbHMgICBAMTExCi0JYXBfZ2V0d29yZF9udWxsc19uYyAgIEAxMTIKLQlhcF9nZXR3b3JkX3doaXRlICAgQDExMwotCWFwX2dldHdvcmRfd2hpdGVfbmMgICBAMTE0Ci07CWFwX2dtX3RpbWVzdHJfODIyICAgQDExNQotCWFwX2duYW1lMmlkICAgQDExNgotCWFwX2hhbmRsZV9jb21tYW5kICAgQDExNwotCTthcF9oYXJkX3RpbWVvdXQgICBAMTE4Ci0JYXBfaHRfdGltZSAgIEAxMTkKLQlhcF9pbmQgICBAMTIwCi0JYXBfaW5kZXhfb2ZfcmVzcG9uc2UgICBAMTIxCi0JYXBfaW5pdF92aXJ0dWFsX2hvc3QgICBAMTIyCi0JYXBfaW50ZXJuYWxfcmVkaXJlY3QgICBAMTIzCi0JYXBfaW50ZXJuYWxfcmVkaXJlY3RfaGFuZGxlciAgIEAxMjQKLQlhcF9pc19kaXJlY3RvcnkgICBAMTI1Ci07CWFwX2lzX2ZubWF0Y2ggICBAMTI2Ci0JYXBfaXNfaW5pdGlhbF9yZXEgICBAMTI3Ci0JYXBfaXNfbWF0Y2hleHAgICBAMTI4Ci0JYXBfaXNfdXJsICAgQDEyOQotOwlhcF9raWxsX2NsZWFudXAgICBAMTMwCi07CWFwX2tpbGxfY2xlYW51cHNfZm9yX2ZkICAgQDEzMQotOwlhcF9raWxsX2NsZWFudXBzX2Zvcl9zb2NrZXQgICBAMTMyCi0JO2FwX2tpbGxfdGltZW91dCAgIEAxMzMKLQlhcF9sb2dfYXNzZXJ0ICAgQDEzNAotCWFwX2xvZ19lcnJvcl9vbGQgICBAMTM1Ci0JYXBfbG9nX3JlYXNvbiAgIEAxMzYKLQlhcF9sb2dfdW5peGVyciAgIEAxMzcKLTsJYXBfbWFrZV9hcnJheSAgIEAxMzgKLQlhcF9tYWtlX2RpcnN0ciAgIEAxMzkKLQlhcF9tYWtlX2RpcnN0cl9wYXJlbnQgICBAMTQwCi0JYXBfbWFrZV9kaXJzdHJfcHJlZml4ICAgQDE0MQotCWFwX21ha2VfZnVsbF9wYXRoICAgQDE0MgotOwlhcF9tYWtlX3N1Yl9wb29sICAgQDE0MwotOwlhcF9tYWtlX3RhYmxlICAgQDE0NAotCWFwX21hdGNoZXNfcmVxdWVzdF92aG9zdCAgIEAxNDUKLQlhcF9tZDUgICBAMTQ2Ci0JYXBfbWQ1X2JpbmFyeSAgIEAxNDcKLQlhcF9tZDVjb250ZXh0VG82NCAgIEAxNDgKLQlhcF9tZDVkaWdlc3QgICBAMTQ5Ci0JYXBfbWVldHNfY29uZGl0aW9ucyAgIEAxNTAKLQlhcF9ubzJzbGFzaCAgIEAxNTEKLQlhcF9ub3RlX2F1dGhfZmFpbHVyZSAgIEAxNTIKLQlhcF9ub3RlX2Jhc2ljX2F1dGhfZmFpbHVyZSAgIEAxNTMKLTsJYXBfbm90ZV9jbGVhbnVwc19mb3JfZmQgICBAMTU0Ci07CWFwX25vdGVfY2xlYW51cHNfZm9yX2ZpbGUgICBAMTU1Ci07CWFwX25vdGVfY2xlYW51cHNfZm9yX2ggICBAMTU2Ci07CWFwX25vdGVfY2xlYW51cHNfZm9yX3NvY2tldCAgIEAxNTcKLQlhcF9ub3RlX2RpZ2VzdF9hdXRoX2ZhaWx1cmUgICBAMTU4Ci07CWFwX25vdGVfc3VicHJvY2VzcyAgIEAxNTkKLTsJYXBfb3Blbl9tdXRleCAgIEAxNjAKLQlhcF9vcGVuX3BpcGVkX2xvZyAgIEAxNjEKLQlhcF9vc19jYW5vbmljYWxfZmlsZW5hbWUgICBAMTYyCi0JYXBfb3NfZXNjYXBlX3BhdGggICBAMTYzCi07CWFwX292ZXJsYXBfdGFibGVzICAgQDE2NAotOwlhcF9vdmVybGF5X3RhYmxlcyAgIEAxNjUKLTsJYXBfcGFsbG9jICAgQDE2NgotCWFwX3BhcnNlSFRUUGRhdGUgICBAMTY3Ci0JYXBfcGFyc2VfaG9zdGluZm9fY29tcG9uZW50cyAgIEAxNjgKLQlhcF9wYXJzZV91cmkgICBAMTY5Ci0JYXBfcGFyc2VfdXJpX2NvbXBvbmVudHMgICBAMTcwCi07CWFwX3BjYWxsb2MgICBAMTcxCi0JYXBfcGNmZ19vcGVuX2N1c3RvbSAgIEAxNzIKLQlhcF9wY2ZnX29wZW5maWxlICAgQDE3MwotOwlhcF9wY2xvc2VkaXIgICBAMTc0Ci07CWFwX3BjbG9zZWYgICBAMTc1Ci07CWFwX3BjbG9zZWggICBAMTc2Ci07CWFwX3BjbG9zZXNvY2tldCAgIEAxNzcKLQlhcF9wZHVwaG9zdGVudCAgIEAxNzgKLTsJYXBfcGZjbG9zZSAgIEAxNzkKLTsJYXBfcGZkb3BlbiAgIEAxODAKLTsJYXBfcGZvcGVuICAgQDE4MQotCWFwX3BnZXRob3N0YnluYW1lICAgQDE4MgotOwlhcF9wb3BlbmRpciAgIEAxODMKLTsJYXBfcG9wZW5mICAgQDE4NAotCWFwX3ByZWdjb21wICAgQDE4NQotCWFwX3ByZWdmcmVlICAgQDE4NgotCWFwX3ByZWdzdWIgICBAMTg3Ci0JYXBfcHNpZ25hdHVyZSAgIEAxODgKLTsJYXBfcHNvY2tldCAgIEAxODkKLTsJYXBfcHN0cmR1cCAgIEAxOTAKLTsJYXBfcHN0cm5kdXAgICBAMTkxCi07CWFwX3B1c2hfYXJyYXkgICBAMTkyCi07CWFwX3B2c3ByaW50ZiAgIEAxOTMKLQlhcF9yYXRpb25hbGl6ZV9tdGltZSAgIEAxOTQKLTsJYXBfcmVnaXN0ZXJfY2xlYW51cCAgIEAxOTUKLTsJYXBfcmVsZWFzZV9tdXRleCAgIEAxOTYKLQlhcF9yZW1vdmVfbG9hZGVkX21vZHVsZSAgIEAxOTcKLQlhcF9yZW1vdmVfbW9kdWxlICAgQDE5OAotCWFwX3JlcXVpcmVzICAgQDE5OQotCTthcF9yZXNldF90aW1lb3V0ICAgQDIwMAotCWFwX3JmbHVzaCAgIEAyMDEKLQlhcF9yaW5kICAgQDIwMgotCWFwX3JwdXRjICAgQDIwMwotCWFwX3JwdXRzICAgQDIwNAotOwlhcF9ydW5fY2xlYW51cCAgIEAyMDUKLQlhcF9ydW5fc3ViX3JlcSAgIEAyMDYKLQlhcF9yd3JpdGUgICBAMjA3Ci0JYXBfc2F0aXNmaWVzICAgQDIwOAotCWFwX3NjYW5fc2NyaXB0X2hlYWRlcl9lcnIgICBAMjA5Ci0JYXBfc2Nhbl9zY3JpcHRfaGVhZGVyX2Vycl9idWZmICAgQDIxMAotCWFwX3NjYW5fc2NyaXB0X2hlYWRlcl9lcnJfY29yZSAgIEAyMTEKLQk7YXBfc2VuZF9mYiAgIEAyMTIKLQk7YXBfc2VuZF9mYl9sZW5ndGggICBAMjEzCi0JYXBfc2VuZF9mZCAgIEAyMTQKLQlhcF9zZW5kX2ZkX2xlbmd0aCAgIEAyMTUKLQlhcF9zZW5kX2h0dHBfaGVhZGVyICAgQDIxNgotCWFwX3NlbmRfaHR0cF90cmFjZSAgIEAyMTcKLTsJYXBfc2VuZF9tbWFwICAgQDIxOAotCWFwX3NlbmRfc2l6ZSAgIEAyMTkKLQlhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZSAgIEAyMjAKLQlhcF9zZXRfYnl0ZXJhbmdlICAgQDIyMQotCWFwX3NldF9jb250ZW50X2xlbmd0aCAgIEAyMjIKLQlhcF9zZXRfZXRhZyAgIEAyMjMKLQlhcF9zZXRfa2VlcGFsaXZlICAgQDIyNAotCWFwX3NldF9sYXN0X21vZGlmaWVkICAgQDIyNQotCWFwX3NldHVwX2NsaWVudF9ibG9jayAgIEAyMjYKLQlhcF9zaG91bGRfY2xpZW50X2Jsb2NrICAgQDIyNwotCTthcF9zb2Z0X3RpbWVvdXQgICBAMjI4Ci0JYXBfc29tZV9hdXRoX3JlcXVpcmVkICAgQDIyOQotOwlhcF9zcGF3bl9jaGlsZCAgIEAyMzAKLQlhcF9zcm1fY29tbWFuZF9sb29wICAgQDIzMQotCWFwX3N0cl90b2xvd2VyICAgQDIzMgotCWFwX3N0cmNhc2VjbXBfbWF0Y2ggICBAMjMzCi0JYXBfc3RyY21wX21hdGNoICAgQDIzNAotCWFwX3N1Yl9yZXFfbG9va3VwX2ZpbGUgICBAMjM1Ci0JYXBfc3ViX3JlcV9sb29rdXBfdXJpICAgQDIzNgotCTthcF9zeW5jX3Njb3JlYm9hcmRfaW1hZ2UgICBAMjM3Ci07CWFwX3RhYmxlX2FkZCAgIEAyMzgKLTsJYXBfdGFibGVfYWRkbiAgIEAyMzkKLTsJYXBfdGFibGVfZ2V0ICAgQDI0MAotOwlhcF90YWJsZV9tZXJnZSAgIEAyNDEKLTsJYXBfdGFibGVfbWVyZ2VuICAgQDI0MgotOwlhcF90YWJsZV9zZXQgICBAMjQzCi07CWFwX3RhYmxlX3NldG4gICBAMjQ0Ci07CWFwX3RhYmxlX3Vuc2V0ICAgQDI0NQotOwlhcF90bTJzZWMgICBAMjQ2Ci0JYXBfdW5hbWUyaWQgICBAMjQ3Ci0JO2FwX3VuYmxvY2tfYWxhcm1zICAgQDI0OAotCWFwX3VuZXNjYXBlX3VybCAgIEAyNDkKLQlhcF91bnBhcnNlX3VyaV9jb21wb25lbnRzICAgQDI1MAotCWFwX3VwZGF0ZV9tdGltZSAgIEAyNTEKLQlhcF91dWRlY29kZSAgIEAyNTIKLQlhcF91dWVuY29kZSAgIEAyNTMKLQlhcF92YnByaW50ZiAgIEAyNTQKLTsJYXBfdmZvcm1hdHRlciAgIEAyNTUKLTsJYXBfdnNucHJpbnRmICAgQDI1NgotCWNsb3NlZGlyICAgQDI1NwotCW9wZW5kaXIgICBAMjU4Ci07CW9zX3NwYXdudiAgIEAyNTkKLTsJb3Nfc3Bhd252ZSAgIEAyNjAKLQlvc19zdGF0ICAgQDI2MQotCXJlYWRkaXIgICBAMjYyCi0JcmVnY29tcCAgIEAyNjMKLQlyZWdleGVjICAgQDI2NAotCXJlZ2ZyZWUgICBAMjY1Ci0JYWNjZXNzX21vZHVsZSBAMjY2Ci0JYWxpYXNfbW9kdWxlICAgQDI2NwotCWFwX2JwcmludGYgICBAMjY4Ci0JYXBfYnZwdXRzICAgQDI2OQotOwlhcF9kYXlfc25hbWVzIEAyNzAgIAotCTthcF9leHRlbmRlZF9zdGF0dXMgIEAyNzEgICAKLQlhcF9saW1pdF9zZWN0aW9uICAgQDI3MgotCWFwX2xvYWRlZF9tb2R1bGVzICAgQDI3MwotCWFwX2xvZ19lcnJvciAgIEAyNzQKLQlhcF9sb2dfcHJpbnRmICAgQDI3NQotCWFwX2xvZ19yZXJyb3IgICBAMjc2Ci07CWFwX21vbnRoX3NuYW1lcyAgQDI3NwotOwlhcF9udWxsX2NsZWFudXAgICBAMjc4Ci07CWFwX3BzcHJpbnRmICAgQDI3OQotOwlhcF9wc3RyY2F0ICAgQDI4MAotCTthcF9yZXN0YXJ0X3RpbWUgIEAyODEgCi0JYXBfcnByaW50ZiAgIEAyODIKLQlhcF9ydnB1dHMgICBAMjgzCi0JO2FwX3Njb3JlYm9hcmRfaW1hZ2UgICBAMjg0Ci0JYXBfc2VuZF9oZWFkZXJfZmllbGQgICBAMjg1Ci0JYXBfc2VydmVyX2FyZ3YwICAgQDI4NgotCWFwX3NlcnZlcl9yb290ICAgQDI4NwotCWFwX3NldF9maWxlX3Nsb3QgIEAyODgKLQlhcF9zZXRfZmxhZ19zbG90ICAgQDI4OQotCWFwX3NldF9zdHJpbmdfc2xvdCAgQDI5MAotCWFwX3NldF9zdHJpbmdfc2xvdF9sb3dlciAgQDI5MSAKLTsJYXBfc25wcmludGYgICBAMjkyCi0JO2FwX3N1ZXhlY19lbmFibGVkICBAMjkzIAotOwlhcF90YWJsZV9kbyAgIEAyOTQKLQlhcGFjaGVfbWFpbiAgIEAyOTUKLQlhc2lzX21vZHVsZSAgIEAyOTYKLQlhdXRoX21vZHVsZSAgIEAyOTcKLQlhdXRvaW5kZXhfbW9kdWxlICBAMjk4IAotCTtjZ2lfbW9kdWxlICAgQDI5OQotCWNvbmZpZ19sb2dfbW9kdWxlICBAMzAwIAotCWNvcmVfbW9kdWxlICAgQDMwMQotCWRpcl9tb2R1bGUgICBAMzAyCi0JZW52X21vZHVsZSAgIEAzMDMKLQlpbWFwX21vZHVsZSAgIEAzMDQKLQk7aW5jbHVkZXNfbW9kdWxlICBAMzA1ICAgCi0JbWltZV9tb2R1bGUgICBAMzA2Ci0JbmVnb3RpYXRpb25fbW9kdWxlIEAzMDcgIAotOwlvc19zcGF3bmxlICAgQDMwOAotCXNldGVudmlmX21vZHVsZSAgQDMwOSAKLQk7c29fbW9kdWxlICAgQDMxMAotCXRvcF9tb2R1bGUgICBAMzExCi07CWFwX2ZubWF0Y2ggICBAMzEyCi0JYXBfbWV0aG9kX251bWJlcl9vZiAgIEAzMTMKLQlhcF9leGlzdHNfY29uZmlnX2RlZmluZSAgIEAzMTQKLQlhcF9zaW5nbGVfbW9kdWxlX2NvbmZpZ3VyZSAgIEAzMTUKLQlhcF9tYWtlX2V0YWcgICBAMzE3Ci07CWFwX2FycmF5X3BzdHJjYXQgICBAMzE4Ci0JYXBfb3NfaXNfZmlsZW5hbWVfdmFsaWQgICBAMzE5Ci0JYXBfZmluZF9saXN0X2l0ZW0gICBAMzIwCi07CWFwX01ENUVuY29kZSAgIEAzMjEKLTsJYXBfdmFsaWRhdGVfcGFzc3dvcmQgICBAMzIyCi0JYXBfc2l6ZV9saXN0X2l0ZW0gICBAMzIzCi0JYXBfZ2V0X2xpc3RfaXRlbSAgIEAzMjQKLQk7YXBfc2NvcmVib2FyZF9mbmFtZSAgIEAzMjUKLQk7YXBfcGlkX2ZuYW1lICAgQDMyNgotCTthcF9leGNlc3NfcmVxdWVzdHNfcGVyX2NoaWxkICAgQDMyNwotCTthcF90aHJlYWRzX3Blcl9jaGlsZCAgIEAzMjgKLQk7YXBfbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCAgIEAzMjkKLQk7YXBfZGFlbW9uc190b19zdGFydCAgIEAzMzAKLQk7YXBfZGFlbW9uc19taW5fZnJlZSAgIEAzMzEKLQk7YXBfZGFlbW9uc19tYXhfZnJlZSAgIEAzMzIKLQk7YXBfZGFlbW9uc19saW1pdCAgIEAzMzMKLQk7YXBfdXNlcl9uYW1lICAgQDMzNAotCTthcF91c2VyX2lkICAgQDMzNQotCTthcF9ncm91cF9pZCAgIEAzMzYKLQk7YXBfc3RhbmRhbG9uZSAgIEAzMzcKLQk7YXBfc2VydmVyX2NvbmZuYW1lICAgQDMzOAotCWFwX3N1Yl9yZXFfbWV0aG9kX3VyaSAgIEAzMzkKLQlhcF9yZWdlcnJvciAgIEAzNDEKLQlhcF9yZWdleGVjICAgQDM0MgotCWFwX2ZpZWxkX25vcGFyYW0gICBAMzQzCi0JYXBfcGJhc2U2NGRlY29kZSAgIEAzNDQKLQlhcF9wYmFzZTY0ZW5jb2RlICAgQDM0NQotCWFwX2Jhc2U2NGVuY29kZSAgIEAzNDYKLQlhcF9iYXNlNjRlbmNvZGVfYmluYXJ5ICAgQDM0NwotCWFwX2Jhc2U2NGVuY29kZV9sZW4gICBAMzQ4Ci0JYXBfYmFzZTY0ZGVjb2RlICAgQDM0OQotCWFwX2Jhc2U2NGRlY29kZV9iaW5hcnkgICBAMzUwCi0JYXBfYmFzZTY0ZGVjb2RlX2xlbiAgIEAzNTEKLQlhcF9TSEExSW5pdCAgIEAzNTIKLQlhcF9TSEExVXBkYXRlX2JpbmFyeSAgIEAzNTMKLQlhcF9TSEExVXBkYXRlICAgQDM1NAotCWFwX1NIQTFGaW5hbCAgIEAzNTUKLQlhcF9zaGExX2Jhc2U2NCAgIEAzNTYKLQlhcF9zaG93X2hvb2sgQDM1NwotCWFwX2hvb2tfc29ydF9yZWdpc3RlciBAMzU4Ci0JYXBfaG9va19wcm9jZXNzX2Nvbm5lY3Rpb24gQDM1OQotCWFwX3Byb2Nlc3NfaHR0cF9jb25uZWN0aW9uIEAzNjAKLQlhcF9ob29rX2NoZWNrX3VzZXJfaWQgQDM2MQotCWFwX2hvb2tfYXV0aF9jaGVja2VyIEAzNjIKLQlhcF9ob29rX2ZpeHVwcyBAMzYzCi0gICAgICAgIHJlZ2Vycm9yIEAzNjQKLSAgICAgICAgYXBfc2VuZF9lcnJvcl9yZXNwb25zZSBAMzY1Ci0JYXBfc3RhcnRfc2h1dGRvd24gQDM2NgotICAgICAgICBzZW5kX3NpZ25hbF90b19zZXJ2aWNlICBAMzY3Ci0gICAgICAgIGFwX3JlYWRfY29uZmlnICAgQDM2OAotCWFwX3NlcnZlcl9wcmVfcmVhZF9jb25maWcgIEAzNjkKLQlhcF9zZXJ2ZXJfcG9zdF9yZWFkX2NvbmZpZyBAMzcwCi0JYXBfc2V0dXBfcHJlbGlua2VkX21vZHVsZXMgQDM3MQotCVJlbW92ZVNlcnZpY2UgQDM3MgotCUluc3RhbGxTZXJ2aWNlIEAzNzMKLQlpc1ZhbGlkU2VydmljZSBAMzc0Ci0Jc2VydmljZV9tYWluICBAMzc1Ci0JaXNQcm9jZXNzU2VydmljZSBAMzc2Ci0JYXBfcmVnaXN0cnlfZ2V0X3NlcnZlcl9yb290IEAzNzcKLQlhcF9yZWdpc3RyeV9nZXRfc2VydmljZV9jb25mIEAzNzgKLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy8uY3ZzaWdub3JlIGIvbW9kdWxlcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2M3YTdjLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1ha2VmaWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL01ha2VmaWxlLmluIGIvbW9kdWxlcy9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE4YTgyMi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCi1ERVBUSCAgICAgPSAuLgotdG9wc3JjZGlyID0gQHRvcHNyY2RpckAKLXNyY2RpciAgICA9IEBzcmNkaXJACi1WUEFUSCAgICAgPSBAc3JjZGlyQAotCi1TVUJESVJTID0gbXBtICQoTU9EVUxFX0RJUlMpCi0KLWluY2x1ZGUgJCh0b3BzcmNkaXIpL2J1aWxkL3J1bGVzLm1rCi0KZGlmZiAtLWdpdCBhL21vZHVsZXMvUkVBRE1FIGIvbW9kdWxlcy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkOWJkMjIuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1UaGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBmb3IgdGhpcyBsZXZlbCBpcyBhcyBmb2xsb3dzOgotCi1zdGFuZGFyZC8KLQotICBJbiB0aGlzIGRpcmVjdG9yeSBhcmUgdGhlIHN0YW5kYXJkIHN1cHBvcnRlZCBtb2R1bGVzIGZvciAKLSAgQXBhY2hlLiAgTm90IGFsbCBhcmUgY29tcGlsZWQgYnkgZGVmYXVsdC4KLQotcHJveHkvCi0KLSAgVGhpcyBob3VzZXMgdGhlIGNvZGUgZm9yIHRoZSBwcm94eSBtb2R1bGUgZm9yIEFwYWNoZS4KLQotZXhwZXJpbWVudGFsLwotCi0gIEluIHRoaXMgZGlyZWN0b3J5IHdlJ3ZlIHBsYWNlZCBzb21lIG1vZHVsZXMgd2hpY2ggd2UgdGhpbmsKLSAgcHJvdmlkZSBzb21lIHByZXR0eSBpbnRlcmVzdGluZyBmdW5jdGlvbmFsaXR5LCBidXQgd2hpY2gKLSAgYXJlIHN0aWxsIGluIHRoZSBlYXJseSBzdGFnZXMgb2YgZGV2ZWxvcG1lbnQgYW5kIGNvdWxkCi0gIGV2b2x2ZSByYWRpY2FsbHkgaW4gdGhlIGZ1dHVyZS4gIFRoaXMgY29kZSBpc24ndCBzdXBwb3J0ZWQKLSAgb2ZmaWNpYWxseS4KLQotdGVzdC8KLQotICBUaGlzIGRpcmVjdG9yeSBob3VzZXMgbW9kdWxlcyB3aGljaCB0ZXN0IHZhcmlvdXMgY29tcG9uZW50cyAKLSAgb2YgQXBhY2hlLiAgWW91IHNob3VsZCBub3QgY29tcGlsZSB0aGVzZSBpbnRvIGEgcHJvZHVjdGlvbgotICBzZXJ2ZXIuICAKLQotZXhhbXBsZS8KLQotICBUaGlzIGRpcmVjdG9yeSBob3VzZXMgZXhhbXBsZSBtb2R1bGVzLCB0byBoZWxwIG1vZHVsZSBhdXRob3JzCi0gIGZpZ3VyZSB0aGVpciB3YXkgYXJvdW5kIHRoZSBBcGFjaGUgQVBJIGFuZCBtb2R1bGUgY29uY2VwdC4KLQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hYWEvLmN2c2lnbm9yZSBiL21vZHVsZXMvYWFhLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZjdhNzAuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9hYWEvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS5kZXBzCi0ubGlicwotKi5sYQotbW9kdWxlcy5tawotTWFrZWZpbGUKLSoubG8KLSouc2xvCi0qLnNvCi0qLmRsbAotKi5kZWYKZGlmZiAtLWdpdCBhL21vZHVsZXMvYWFhLy5pbmRlbnQucHJvIGIvbW9kdWxlcy9hYWEvLmluZGVudC5wcm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZmJlOWYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9hYWEvLmluZGVudC5wcm8KKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0taTQgLW5wc2wgLWRpMCAtYnIgLW5jZSAtZDAgLWNsaTAgLW5wY3MgLW5mYzEKLS1UQlVGRgotLVRGSUxFCi0tVFRSQU5TCi0tVFVJTlQ0Ci0tVF90cmFucwotLVRhbGxvd19vcHRpb25zX3QKLS1UYXBhY2hlX3NmaW8KLS1UYXJyYXlfaGVhZGVyCi0tVGJvb2xfaW50Ci0tVGJ1Zl9hcmVhCi0tVGJ1ZmZfc3RydWN0Ci0tVGJ1ZmZ5Ci0tVGNtZF9ob3cKLS1UY21kX3Bhcm1zCi0tVGNvbW1hbmRfcmVjCi0tVGNvbW1hbmRfc3RydWN0Ci0tVGNvbm5fcmVjCi0tVGNvcmVfZGlyX2NvbmZpZwotLVRjb3JlX3NlcnZlcl9jb25maWcKLS1UZGlyX21ha2VyX2Z1bmMKLS1UZXZlbnQKLS1UZ2xvYmFsc19zCi0tVGhhbmRsZXJfZnVuYwotLVRoYW5kbGVyX3JlYwotLVRqb2JsaXN0X3MKLS1UbGlzdGVuX3JlYwotLVRtZXJnZXJfZnVuYwotLVRtb2RlX3QKLS1UbW9kdWxlCi0tVG1vZHVsZV9zdHJ1Y3QKLS1UbXV0ZXgKLS1Ubl9sb25nCi0tVG90aGVyX2NoaWxkX3JlYwotLVRvdmVycmlkZXNfdAotLVRwYXJlbnRfc2NvcmUKLS1UcGlkX3QKLS1UcGlwZWRfbG9nCi0tVHBvb2wKLS1UcmVxdWVzdF9yZWMKLS1UcmVxdWlyZV9saW5lCi0tVHJsaW1fdAotLVRzY29yZWJvYXJkCi0tVHNlbWFwaG9yZQotLVRzZXJ2ZXJfYWRkcl9yZWMKLS1Uc2VydmVyX3JlYwotLVRzZXJ2ZXJfcmVjX2NoYWluCi0tVHNob3J0X3Njb3JlCi0tVHRhYmxlCi0tVHRhYmxlX2VudHJ5Ci0tVHRocmVhZAotLVR1X3dpZGVfaW50Ci0tVHZ0aW1lX3QKLS1Ud2lkZV9pbnQKZGlmZiAtLWdpdCBhL21vZHVsZXMvYWFhL01ha2VmaWxlLmluIGIvbW9kdWxlcy9hYWEvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZDNjMTkuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9hYWEvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQotREVQVEggICAgID0gLi4vLi4KLXRvcHNyY2RpciA9IEB0b3BzcmNkaXJACi1zcmNkaXIgICAgPSBAc3JjZGlyQAotVlBBVEggICAgID0gQHNyY2RpckAKLQotaW5jbHVkZSAkKHRvcHNyY2RpcikvYnVpbGQvc3BlY2lhbC5tawotCmRpZmYgLS1naXQgYS9tb2R1bGVzL2FhYS9jb25maWcubTQgYi9tb2R1bGVzL2FhYS9jb25maWcubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlOGViYTkuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9hYWEvY29uZmlnLm00CisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotZG5sIG1vZHVsZXMgZW5hYmxlZCBpbiB0aGlzIGRpcmVjdG9yeSBieSBkZWZhdWx0Ci0KLWRubCBBQ19ERUZVTihtb2R1bGVuYW1lLCBtb2R1bGVzdHJ1Y3RuYW1lLCBkZWZhdWx0b25vcm9mZiwgY29uZmlnbWFjcm9zKQotZG5sIFhYWCAtIE5lZWQgdG8gYWRkIGhlbHAgdGV4dCB0byAtLWVuYWJsZS1tb2R1bGUgZmxhZ3MKLWRubCBYWFggLSBOZWVkIHRvIGFsbG93IC0tZW5hYmxlLW1vZHVsZSB0byBmYWlsIGlmIG9wdGlvbmFsIGNvbmZpZyBmYWlscwotCi1BQ19ERUZVTihBUEFDSEVfQ0hFQ0tfU1RBTkRBUkRfTU9EVUxFLCBbCi0gIEFQQUNIRV9NT0RVTEUoJDEsLCwkMiwkMywkNCkKLV0pCi0KLUFQQUNIRV9NT0RQQVRIX0lOSVQoc3RhbmRhcmQpCi0KLUFQQUNIRV9NT0RVTEUodmhvc3RfYWxpYXMsYmxhYmxhKQotCQotZG5sIEFQQUNIRV9DSEVDS19TVEFOREFSRF9NT0RVTEUodmhvc3RfYWxpYXMsICwgbm8pCi1BUEFDSEVfQ0hFQ0tfU1RBTkRBUkRfTU9EVUxFKGVudiwgLCB5ZXMpCi1BUEFDSEVfQ0hFQ0tfU1RBTkRBUkRfTU9EVUxFKGxvZ19jb25maWcsIGNvbmZpZ19sb2csIHllcykKLUFQQUNIRV9DSEVDS19TVEFOREFSRF9NT0RVTEUobWltZV9tYWdpYywgLCBubykKLUFQQUNIRV9DSEVDS19TVEFOREFSRF9NT0RVTEUobWltZSwgLCB5ZXMpCi1BUEFDSEVfQ0hFQ0tfU1RBTkRBUkRfTU9EVUxFKG5lZ290aWF0aW9uLCAsIHllcykKLUFQQUNIRV9DSEVDS19TVEFOREFSRF9NT0RVTEUoc3RhdHVzLCAsIG5vKQotQVBBQ0hFX0NIRUNLX1NUQU5EQVJEX01PRFVMRShpbmNsdWRlLCBpbmNsdWRlcywgeWVzKQotQVBBQ0hFX0NIRUNLX1NUQU5EQVJEX01PRFVMRShhdXRvaW5kZXgsICwgeWVzKQotQVBBQ0hFX0NIRUNLX1NUQU5EQVJEX01PRFVMRShkaXIsICwgeWVzKQotQVBBQ0hFX0NIRUNLX1NUQU5EQVJEX01PRFVMRShjZ2ksICwgeWVzKQotQVBBQ0hFX0NIRUNLX1NUQU5EQVJEX01PRFVMRShhc2lzLCAsIHllcykKLUFQQUNIRV9DSEVDS19TVEFOREFSRF9NT0RVTEUoaW1hcCwgLCB5ZXMpCi1BUEFDSEVfQ0hFQ0tfU1RBTkRBUkRfTU9EVUxFKGFjdGlvbnMsIGFjdGlvbiwgeWVzKQotQVBBQ0hFX0NIRUNLX1NUQU5EQVJEX01PRFVMRShzcGVsaW5nLCAsIG5vKQotQVBBQ0hFX0NIRUNLX1NUQU5EQVJEX01PRFVMRSh1c2VyZGlyLCAsIHllcykKLUFQQUNIRV9DSEVDS19TVEFOREFSRF9NT0RVTEUoYWxpYXMsICwgeWVzKQotQVBBQ0hFX0NIRUNLX1NUQU5EQVJEX01PRFVMRShyZXdyaXRlLCAsIG5vKQotQVBBQ0hFX0NIRUNLX1NUQU5EQVJEX01PRFVMRShhY2Nlc3MsICwgeWVzKQotQVBBQ0hFX0NIRUNLX1NUQU5EQVJEX01PRFVMRShhdXRoLCAsIHllcykKLUFQQUNIRV9DSEVDS19TVEFOREFSRF9NT0RVTEUoYXV0aF9hbm9uLCAsIG5vKQotQVBBQ0hFX0NIRUNLX1NUQU5EQVJEX01PRFVMRShhdXRoX2RibSwgLCBubykKLUFQQUNIRV9DSEVDS19TVEFOREFSRF9NT0RVTEUoYXV0aF9kYiwgLCBubykKLUFQQUNIRV9DSEVDS19TVEFOREFSRF9NT0RVTEUoYXV0aF9kaWdlc3QsICwgbm8pCi1BUEFDSEVfQ0hFQ0tfU1RBTkRBUkRfTU9EVUxFKGNlcm5fbWV0YSwgLCBubykKLUFQQUNIRV9DSEVDS19TVEFOREFSRF9NT0RVTEUoZXhwaXJlcywgLCBubykKLUFQQUNIRV9DSEVDS19TVEFOREFSRF9NT0RVTEUoaGVhZGVycywgLCBubykKLQotQVBBQ0hFX0NIRUNLX1NUQU5EQVJEX01PRFVMRSh1c2VydHJhY2ssICwgbm8sIFsKLSAgQUNfQ0hFQ0tfSEVBREVSUyhzeXMvdGltZXMuaCkKLSAgQUNfQ0hFQ0tfRlVOQ1ModGltZXMpCi1dKQotCi1BUEFDSEVfQ0hFQ0tfU1RBTkRBUkRfTU9EVUxFKHVuaXF1ZV9pZCwgLCBubykKLUFQQUNIRV9DSEVDS19TVEFOREFSRF9NT0RVTEUoc28sICwgbm8pCi1BUEFDSEVfQ0hFQ0tfU1RBTkRBUkRfTU9EVUxFKHNldGVudmlmLCAsIHllcykKLUFQQUNIRV9DSEVDS19TVEFOREFSRF9NT0RVTEUoZWNobywgLCB5ZXMpCi0KLUFQQUNIRV9NT0RQQVRIX0ZJTklTSAotICAgIAotQVBBQ0hFX1NVQlNUKFNUQU5EQVJEX0xJQlMpCmRpZmYgLS1naXQgYS9tb2R1bGVzL2FhYS9tb2RfYWNjZXNzLmMgYi9tb2R1bGVzL2FhYS9tb2RfYWNjZXNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MmJiZTQuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9hYWEvbW9kX2FjY2Vzcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDA3ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIFNlY3VyaXR5IG9wdGlvbnMgZXRjLgotICogCi0gKiBNb2R1bGUgZGVyaXZlZCBmcm9tIGNvZGUgb3JpZ2luYWxseSB3cml0dGVuIGJ5IFJvYiBNY0Nvb2wKLSAqIAotICovCi0KLSNpbmNsdWRlICJhcHJfbmV0d29ya19pby5oIgotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotCi1lbnVtIGFsbG93ZGVueV90eXBlIHsKLSAgICBUX0VOViwKLSAgICBUX0FMTCwKLSAgICBUX0lQLAotICAgIFRfSE9TVCwKLSAgICBUX0ZBSUwKLX07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgbGltaXRlZDsKLSAgICB1bmlvbiB7Ci0JY2hhciAqZnJvbTsKLQlzdHJ1Y3QgewotCSAgICB1bnNpZ25lZCBsb25nIG5ldDsKLQkgICAgdW5zaWduZWQgbG9uZyBtYXNrOwotCX0gaXA7Ci0gICAgfSB4OwotICAgIGVudW0gYWxsb3dkZW55X3R5cGUgdHlwZTsKLX0gYWxsb3dkZW55OwotCi0vKiB0aGluZ3MgaW4gdGhlICdvcmRlcicgYXJyYXkgKi8KLSNkZWZpbmUgREVOWV9USEVOX0FMTE9XIDAKLSNkZWZpbmUgQUxMT1dfVEhFTl9ERU5ZIDEKLSNkZWZpbmUgTVVUVUFMX0ZBSUxVUkUgMgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50IG9yZGVyW01FVEhPRFNdOwotICAgIGFwX2FycmF5X2hlYWRlcl90ICphbGxvd3M7Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmRlbnlzOwotfSBhY2Nlc3NfZGlyX2NvbmY7Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBhY2Nlc3NfbW9kdWxlOwotCi1zdGF0aWMgdm9pZCAqY3JlYXRlX2FjY2Vzc19kaXJfY29uZmlnKGFwX2NvbnRleHRfdCAqcCwgY2hhciAqZHVtbXkpCi17Ci0gICAgYWNjZXNzX2Rpcl9jb25mICpjb25mID0KLSAgICAoYWNjZXNzX2Rpcl9jb25mICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKGFjY2Vzc19kaXJfY29uZikpOwotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE1FVEhPRFM7ICsraSkKLQljb25mLT5vcmRlcltpXSA9IERFTllfVEhFTl9BTExPVzsKLSAgICBjb25mLT5hbGxvd3MgPSBhcF9tYWtlX2FycmF5KHAsIDEsIHNpemVvZihhbGxvd2RlbnkpKTsKLSAgICBjb25mLT5kZW55cyA9IGFwX21ha2VfYXJyYXkocCwgMSwgc2l6ZW9mKGFsbG93ZGVueSkpOwotCi0gICAgcmV0dXJuICh2b2lkICopIGNvbmY7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpvcmRlcihjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHYsIGNoYXIgKmFyZykKLXsKLSAgICBhY2Nlc3NfZGlyX2NvbmYgKmQgPSAoYWNjZXNzX2Rpcl9jb25mICopIGR2OwotICAgIGludCBpLCBvOwotCi0gICAgaWYgKCFzdHJjYXNlY21wKGFyZywgImFsbG93LGRlbnkiKSkKLQlvID0gQUxMT1dfVEhFTl9ERU5ZOwotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZywgImRlbnksYWxsb3ciKSkKLQlvID0gREVOWV9USEVOX0FMTE9XOwotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZywgIm11dHVhbC1mYWlsdXJlIikpCi0JbyA9IE1VVFVBTF9GQUlMVVJFOwotICAgIGVsc2UKLQlyZXR1cm4gInVua25vd24gb3JkZXIiOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE1FVEhPRFM7ICsraSkKLQlpZiAoY21kLT5saW1pdGVkICYgKDEgPDwgaSkpCi0JICAgIGQtPm9yZGVyW2ldID0gbzsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IGlzX2lwKGNvbnN0IGNoYXIgKmhvc3QpCi17Ci0gICAgd2hpbGUgKCgqaG9zdCA9PSAnLicpIHx8IGFwX2lzZGlnaXQoKmhvc3QpKQotCWhvc3QrKzsKLSAgICByZXR1cm4gKCpob3N0ID09ICdcMCcpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqYWxsb3dfY21kKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdiwgY2hhciAqZnJvbSwgY2hhciAqd2hlcmUpCi17Ci0gICAgYWNjZXNzX2Rpcl9jb25mICpkID0gKGFjY2Vzc19kaXJfY29uZiAqKSBkdjsKLSAgICBhbGxvd2RlbnkgKmE7Ci0gICAgY2hhciAqczsKLQotICAgIGlmIChzdHJjYXNlY21wKGZyb20sICJmcm9tIikpCi0JcmV0dXJuICJhbGxvdyBhbmQgZGVueSBtdXN0IGJlIGZvbGxvd2VkIGJ5ICdmcm9tJyI7Ci0KLSAgICBhID0gKGFsbG93ZGVueSAqKSBhcF9wdXNoX2FycmF5KGNtZC0+aW5mbyA/IGQtPmFsbG93cyA6IGQtPmRlbnlzKTsKLSAgICBhLT54LmZyb20gPSB3aGVyZTsKLSAgICBhLT5saW1pdGVkID0gY21kLT5saW1pdGVkOwotCi0gICAgaWYgKCFzdHJuY2FzZWNtcCh3aGVyZSwgImVudj0iLCA0KSkgewotCWEtPnR5cGUgPSBUX0VOVjsKLQlhLT54LmZyb20gKz0gNDsKLQotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY2FzZWNtcCh3aGVyZSwgImFsbCIpKSB7Ci0JYS0+dHlwZSA9IFRfQUxMOwotCi0gICAgfQotICAgIGVsc2UgaWYgKChzID0gc3RyY2hyKHdoZXJlLCAnLycpKSkgewotCXVuc2lnbmVkIGxvbmcgbWFzazsKLQotCWEtPnR5cGUgPSBUX0lQOwotCS8qIHRyYW1wbGUgb24gd2hlcmUsIHdlIHdvbid0IGJlIHVzaW5nIGl0IGFueSBtb3JlICovCi0JKnMrKyA9ICdcMCc7Ci0KLQlpZiAoIWlzX2lwKHdoZXJlKQotCSAgICB8fCAoYS0+eC5pcC5uZXQgPSBhcF9pbmV0X2FkZHIod2hlcmUpKSA9PSBJTkFERFJfTk9ORSkgewotCSAgICBhLT50eXBlID0gVF9GQUlMOwotCSAgICByZXR1cm4gInN5bnRheCBlcnJvciBpbiBuZXR3b3JrIHBvcnRpb24gb2YgbmV0d29yay9uZXRtYXNrIjsKLQl9Ci0KLQkvKiBpc19pcCBqdXN0IHRlc3RzIGlmIGl0IG1hdGNoZXMgW1xkLl0rICovCi0JaWYgKCFpc19pcChzKSkgewotCSAgICBhLT50eXBlID0gVF9GQUlMOwotCSAgICByZXR1cm4gInN5bnRheCBlcnJvciBpbiBtYXNrIHBvcnRpb24gb2YgbmV0d29yay9uZXRtYXNrIjsKLQl9Ci0JLyogaXMgaXQgaW4gL2EuYi5jLmQgZm9ybT8gKi8KLQlpZiAoc3RyY2hyKHMsICcuJykpIHsKLQkgICAgbWFzayA9IGFwX2luZXRfYWRkcihzKTsKLQkgICAgaWYgKG1hc2sgPT0gSU5BRERSX05PTkUpIHsKLQkJYS0+dHlwZSA9IFRfRkFJTDsKLQkJcmV0dXJuICJzeW50YXggZXJyb3IgaW4gbWFzayBwb3J0aW9uIG9mIG5ldHdvcmsvbmV0bWFzayI7Ci0JICAgIH0KLQl9Ci0JZWxzZSB7Ci0JICAgIC8qIGFzc3VtZSBpdCdzIGluIC9ubm4gZm9ybSAqLwotCSAgICBtYXNrID0gYXRvaShzKTsKLQkgICAgaWYgKG1hc2sgPiAzMiB8fCBtYXNrIDw9IDApIHsKLQkJYS0+dHlwZSA9IFRfRkFJTDsKLQkJcmV0dXJuICJpbnZhbGlkIG1hc2sgaW4gbmV0d29yay9uZXRtYXNrIjsKLQkgICAgfQotCSAgICBtYXNrID0gMHhGRkZGRkZGRlVMIDw8ICgzMiAtIG1hc2spOwotCSAgICBtYXNrID0gaHRvbmwobWFzayk7Ci0JfQotCWEtPnguaXAubWFzayA9IG1hc2s7Ci0gICAgICAgIGEtPnguaXAubmV0ICA9IChhLT54LmlwLm5ldCAmIG1hc2spOyAgIC8qIHBqciAtIFRoaXMgZml4ZXMgUFIgNDc3MCAqLwotICAgIH0KLSAgICBlbHNlIGlmIChhcF9pc2RpZ2l0KCp3aGVyZSkgJiYgaXNfaXAod2hlcmUpKSB7Ci0JLyogbGVnYWN5IHN5bnRheCBmb3IgaXAgYWRkcnM6IGEuYi5jLiA9PT4gYS5iLmMuMC8yNCBmb3IgZXhhbXBsZSAqLwotCWludCBzaGlmdDsKLQljaGFyICp0OwotCWludCBvY3RldDsKLQotCWEtPnR5cGUgPSBUX0lQOwotCS8qIHBhcnNlIGNvbXBvbmVudHMgKi8KLQlzID0gd2hlcmU7Ci0JYS0+eC5pcC5uZXQgPSAwOwotCWEtPnguaXAubWFzayA9IDA7Ci0Jc2hpZnQgPSAyNDsKLQl3aGlsZSAoKnMpIHsKLQkgICAgdCA9IHM7Ci0JICAgIGlmICghYXBfaXNkaWdpdCgqdCkpIHsKLQkJYS0+dHlwZSA9IFRfRkFJTDsKLQkJcmV0dXJuICJpbnZhbGlkIGlwIGFkZHJlc3MiOwotCSAgICB9Ci0JICAgIHdoaWxlIChhcF9pc2RpZ2l0KCp0KSkgewotCQkrK3Q7Ci0JICAgIH0KLQkgICAgaWYgKCp0ID09ICcuJykgewotCQkqdCsrID0gMDsKLQkgICAgfQotCSAgICBlbHNlIGlmICgqdCkgewotCQlhLT50eXBlID0gVF9GQUlMOwotCQlyZXR1cm4gImludmFsaWQgaXAgYWRkcmVzcyI7Ci0JICAgIH0KLQkgICAgaWYgKHNoaWZ0IDwgMCkgewotCQlyZXR1cm4gImludmFsaWQgaXAgYWRkcmVzcywgb25seSA0IG9jdGV0cyBhbGxvd2VkIjsKLQkgICAgfQotCSAgICBvY3RldCA9IGF0b2kocyk7Ci0JICAgIGlmIChvY3RldCA8IDAgfHwgb2N0ZXQgPiAyNTUpIHsKLQkJYS0+dHlwZSA9IFRfRkFJTDsKLQkJcmV0dXJuICJlYWNoIG9jdGV0IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTUgaW5jbHVzaXZlIjsKLQkgICAgfQotCSAgICBhLT54LmlwLm5ldCB8PSBvY3RldCA8PCBzaGlmdDsKLQkgICAgYS0+eC5pcC5tYXNrIHw9IDB4RkZVTCA8PCBzaGlmdDsKLQkgICAgcyA9IHQ7Ci0JICAgIHNoaWZ0IC09IDg7Ci0JfQotCWEtPnguaXAubmV0ID0gbnRvaGwoYS0+eC5pcC5uZXQpOwotCWEtPnguaXAubWFzayA9IG50b2hsKGEtPnguaXAubWFzayk7Ci0gICAgfQotICAgIGVsc2UgewotCWEtPnR5cGUgPSBUX0hPU1Q7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjaGFyIGl0c19hbl9hbGxvdzsKLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIGFjY2Vzc19jbWRzW10gPQotewotICAgIHsib3JkZXIiLCBvcmRlciwgTlVMTCwgT1JfTElNSVQsIFRBS0UxLAotICAgICAiJ2FsbG93LGRlbnknLCAnZGVueSxhbGxvdycsIG9yICdtdXR1YWwtZmFpbHVyZScifSwKLSAgICB7ImFsbG93IiwgYWxsb3dfY21kLCAmaXRzX2FuX2FsbG93LCBPUl9MSU1JVCwgSVRFUkFURTIsCi0gICAgICInZnJvbScgZm9sbG93ZWQgYnkgaG9zdG5hbWVzIG9yIElQLWFkZHJlc3Mgd2lsZGNhcmRzIn0sCi0gICAgeyJkZW55IiwgYWxsb3dfY21kLCBOVUxMLCBPUl9MSU1JVCwgSVRFUkFURTIsCi0gICAgICInZnJvbScgZm9sbG93ZWQgYnkgaG9zdG5hbWVzIG9yIElQLWFkZHJlc3Mgd2lsZGNhcmRzIn0sCi0gICAge05VTEx9Ci19OwotCi1zdGF0aWMgaW50IGluX2RvbWFpbihjb25zdCBjaGFyICpkb21haW4sIGNvbnN0IGNoYXIgKndoYXQpCi17Ci0gICAgaW50IGRsID0gc3RybGVuKGRvbWFpbik7Ci0gICAgaW50IHdsID0gc3RybGVuKHdoYXQpOwotCi0gICAgaWYgKCh3bCAtIGRsKSA+PSAwKSB7Ci0JaWYgKHN0cmNhc2VjbXAoZG9tYWluLCAmd2hhdFt3bCAtIGRsXSkgIT0gMCkKLQkgICAgcmV0dXJuIDA7Ci0KLQkvKiBNYWtlIHN1cmUgd2UgbWF0Y2hlZCBhbiAqZW50aXJlKiBzdWJkb21haW4gLS0tIGlmIHRoZSB1c2VyCi0JICogc2FpZCAnYWxsb3cgZnJvbSBnb29kLmNvbScsIHdlIGRvbid0IHdhbnQgcGVvcGxlIGZyb20gbm9nb29kLmNvbQotCSAqIHRvIGJlIGFibGUgdG8gZ2V0IGluLgotCSAqLwotCi0JaWYgKHdsID09IGRsKQotCSAgICByZXR1cm4gMTsJCS8qIG1hdGNoZWQgd2hvbGUgdGhpbmcgKi8KLQllbHNlCi0JICAgIHJldHVybiAoZG9tYWluWzBdID09ICcuJyB8fCB3aGF0W3dsIC0gZGwgLSAxXSA9PSAnLicpOwotICAgIH0KLSAgICBlbHNlCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZmluZF9hbGxvd2RlbnkocmVxdWVzdF9yZWMgKnIsIGFwX2FycmF5X2hlYWRlcl90ICphLCBpbnQgbWV0aG9kKQotewotICAgIGFsbG93ZGVueSAqYXAgPSAoYWxsb3dkZW55ICopIGEtPmVsdHM7Ci0gICAgaW50IG1tYXNrID0gKDEgPDwgbWV0aG9kKTsKLSAgICBpbnQgaTsKLSAgICBpbnQgZ290aG9zdCA9IDA7Ci0gICAgY29uc3QgY2hhciAqcmVtb3RlaG9zdCA9IE5VTEw7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgYS0+bmVsdHM7ICsraSkgewotCWlmICghKG1tYXNrICYgYXBbaV0ubGltaXRlZCkpCi0JICAgIGNvbnRpbnVlOwotCi0Jc3dpdGNoIChhcFtpXS50eXBlKSB7Ci0JY2FzZSBUX0VOVjoKLQkgICAgaWYgKGFwX3RhYmxlX2dldChyLT5zdWJwcm9jZXNzX2VudiwgYXBbaV0ueC5mcm9tKSkgewotCQlyZXR1cm4gMTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCWNhc2UgVF9BTEw6Ci0JICAgIHJldHVybiAxOwotCi0JY2FzZSBUX0lQOgotCSAgICBpZiAoYXBbaV0ueC5pcC5uZXQgIT0gSU5BRERSX05PTkUKLQkJJiYgKHItPmNvbm5lY3Rpb24tPnJlbW90ZV9hZGRyLnNpbl9hZGRyLnNfYWRkcgotCQkgICAgJiBhcFtpXS54LmlwLm1hc2spID09IGFwW2ldLnguaXAubmV0KSB7Ci0JCXJldHVybiAxOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBUX0hPU1Q6Ci0JICAgIGlmICghZ290aG9zdCkgewotCQlyZW1vdGVob3N0ID0gYXBfZ2V0X3JlbW90ZV9ob3N0KHItPmNvbm5lY3Rpb24sIHItPnBlcl9kaXJfY29uZmlnLAotCQkJCQkgICAgUkVNT1RFX0RPVUJMRV9SRVYpOwotCi0JCWlmICgocmVtb3RlaG9zdCA9PSBOVUxMKSB8fCBpc19pcChyZW1vdGVob3N0KSkKLQkJICAgIGdvdGhvc3QgPSAxOwotCQllbHNlCi0JCSAgICBnb3Rob3N0ID0gMjsKLQkgICAgfQotCi0JICAgIGlmICgoZ290aG9zdCA9PSAyKSAmJiBpbl9kb21haW4oYXBbaV0ueC5mcm9tLCByZW1vdGVob3N0KSkKLQkJcmV0dXJuIDE7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBUX0ZBSUw6Ci0JICAgIC8qIGRvIG5vdGhpbmc/ICovCi0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjaGVja19kaXJfYWNjZXNzKHJlcXVlc3RfcmVjICpyKQotewotICAgIGludCBtZXRob2QgPSByLT5tZXRob2RfbnVtYmVyOwotICAgIGFjY2Vzc19kaXJfY29uZiAqYSA9Ci0gICAgKGFjY2Vzc19kaXJfY29uZiAqKQotICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAmYWNjZXNzX21vZHVsZSk7Ci0gICAgaW50IHJldCA9IE9LOwotCi0gICAgaWYgKGEtPm9yZGVyW21ldGhvZF0gPT0gQUxMT1dfVEhFTl9ERU5ZKSB7Ci0JcmV0ID0gRk9SQklEREVOOwotCWlmIChmaW5kX2FsbG93ZGVueShyLCBhLT5hbGxvd3MsIG1ldGhvZCkpCi0JICAgIHJldCA9IE9LOwotCWlmIChmaW5kX2FsbG93ZGVueShyLCBhLT5kZW55cywgbWV0aG9kKSkKLQkgICAgcmV0ID0gRk9SQklEREVOOwotICAgIH0KLSAgICBlbHNlIGlmIChhLT5vcmRlclttZXRob2RdID09IERFTllfVEhFTl9BTExPVykgewotCWlmIChmaW5kX2FsbG93ZGVueShyLCBhLT5kZW55cywgbWV0aG9kKSkKLQkgICAgcmV0ID0gRk9SQklEREVOOwotCWlmIChmaW5kX2FsbG93ZGVueShyLCBhLT5hbGxvd3MsIG1ldGhvZCkpCi0JICAgIHJldCA9IE9LOwotICAgIH0KLSAgICBlbHNlIHsKLQlpZiAoZmluZF9hbGxvd2RlbnkociwgYS0+YWxsb3dzLCBtZXRob2QpCi0JICAgICYmICFmaW5kX2FsbG93ZGVueShyLCBhLT5kZW55cywgbWV0aG9kKSkKLQkgICAgcmV0ID0gT0s7Ci0JZWxzZQotCSAgICByZXQgPSBGT1JCSURERU47Ci0gICAgfQotCi0gICAgaWYgKHJldCA9PSBGT1JCSURERU4KLQkmJiAoYXBfc2F0aXNmaWVzKHIpICE9IFNBVElTRllfQU5ZIHx8ICFhcF9zb21lX2F1dGhfcmVxdWlyZWQocikpKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLQkJICAiY2xpZW50IGRlbmllZCBieSBzZXJ2ZXIgY29uZmlndXJhdGlvbjogJXMiLAotCQkgIHItPmZpbGVuYW1lKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCByZWdpc3Rlcl9ob29rcyh2b2lkKQotewotICAgIGFwX2hvb2tfYWNjZXNzX2NoZWNrZXIoY2hlY2tfZGlyX2FjY2VzcyxOVUxMLE5VTEwsSE9PS19NSURETEUpOwotfQotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgYWNjZXNzX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCi0gICAgY3JlYXRlX2FjY2Vzc19kaXJfY29uZmlnLAkvKiBkaXIgY29uZmlnIGNyZWF0ZXIgKi8KLSAgICBOVUxMLAkJCS8qIGRpciBtZXJnZXIgLS0tIGRlZmF1bHQgaXMgdG8gb3ZlcnJpZGUgKi8KLSAgICBOVUxMLAkJCS8qIHNlcnZlciBjb25maWcgKi8KLSAgICBOVUxMLAkJCS8qIG1lcmdlIHNlcnZlciBjb25maWcgKi8KLSAgICBhY2Nlc3NfY21kcywKLSAgICBOVUxMLAkJCS8qIGhhbmRsZXJzICovCi0gICAgcmVnaXN0ZXJfaG9va3MJCS8qIHJlZ2lzdGVyIGhvb2tzICovCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hYWEvbW9kX2FjY2Vzcy5leHAgYi9tb2R1bGVzL2FhYS9tb2RfYWNjZXNzLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhhZmYzMy4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2FhYS9tb2RfYWNjZXNzLmV4cAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWFjY2Vzc19tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvYWFhL21vZF9hdXRoLmMgYi9tb2R1bGVzL2FhYS9tb2RfYXV0aC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGVkMjgyLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvYWFhL21vZF9hdXRoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogaHR0cF9hdXRoOiBhdXRoZW50aWNhdGlvbgotICogCi0gKiBSb2IgTWNDb29sCi0gKiAKLSAqIEFkYXB0ZWQgdG8gQXBhY2hlIGJ5IHJzdC4KLSAqCi0gKiBkaXJreCAtIEFkZGVkIEF1dGhvcml0YXRpdmUgY29udHJvbCB0byBhbGxvdyBwYXNzaW5nIG9uIHRvIGxvd2VyCi0gKiAgICAgICAgIG1vZHVsZXMgaWYgYW5kIG9ubHkgaWYgdGhlIHVzZXJpZCBpcyBub3Qga25vd24gdG8gdGhpcwotICogICAgICAgICBtb2R1bGUuIEEga25vd24gdXNlciB3aXRoIGEgZmF1bHR5IG9yIGFic2VudCBwYXNzd29yZCBzdGlsbAotICogICAgICAgICBjYXVzZXMgYW4gQXV0aFJlcXVpcmVkLiBUaGUgZGVmYXVsdCBpcyAnQXV0aG9yaXRhdGl2ZScsIGkuZS4KLSAqICAgICAgICAgbm8gY29udHJvbCBpcyBwYXNzZWQgYWxvbmcuCi0gKi8KLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImFwcl9tZDUuaCIKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCi0KLXR5cGVkZWYgc3RydWN0IGF1dGhfY29uZmlnX3N0cnVjdCB7Ci0gICAgY2hhciAqYXV0aF9wd2ZpbGU7Ci0gICAgY2hhciAqYXV0aF9ncnBmaWxlOwotICAgIGludCBhdXRoX2F1dGhvcml0YXRpdmU7Ci19IGF1dGhfY29uZmlnX3JlYzsKLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9hdXRoX2Rpcl9jb25maWcoYXBfY29udGV4dF90ICpwLCBjaGFyICpkKQotewotICAgIGF1dGhfY29uZmlnX3JlYyAqc2VjID0KLSAgICAoYXV0aF9jb25maWdfcmVjICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKGF1dGhfY29uZmlnX3JlYykpOwotICAgIHNlYy0+YXV0aF9wd2ZpbGUgPSBOVUxMOwkvKiBqdXN0IHRvIGlsbHVzdHJhdGUgdGhlIGRlZmF1bHQgcmVhbGx5ICovCi0gICAgc2VjLT5hdXRoX2dycGZpbGUgPSBOVUxMOwkvKiB1bmxlc3MgeW91IGhhdmUgYSBicm9rZW4gSFAgY2MgKi8KLSAgICBzZWMtPmF1dGhfYXV0aG9yaXRhdGl2ZSA9IDE7CS8qIGtlZXAgdGhlIGZvcnRyZXNzIHNlY3VyZSBieSBkZWZhdWx0ICovCi0gICAgcmV0dXJuIHNlYzsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9hdXRoX3Nsb3QoY21kX3Bhcm1zICpjbWQsIHZvaWQgKm9mZnNldCwgY2hhciAqZiwgY2hhciAqdCkKLXsKLSAgICBpZiAodCAmJiBzdHJjbXAodCwgInN0YW5kYXJkIikpCi0JcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiSW52YWxpZCBhdXRoIGZpbGUgdHlwZTogIiwgdCwgTlVMTCk7Ci0KLSAgICByZXR1cm4gYXBfc2V0X2ZpbGVfc2xvdChjbWQsIG9mZnNldCwgZik7Ci19Ci0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBhdXRoX2NtZHNbXSA9Ci17Ci0gICAgeyJBdXRoVXNlckZpbGUiLCBzZXRfYXV0aF9zbG90LAotICAgICAodm9pZCAqKSBYdE9mZnNldE9mKGF1dGhfY29uZmlnX3JlYywgYXV0aF9wd2ZpbGUpLCBPUl9BVVRIQ0ZHLCBUQUtFMTIsCi0gICAgICJ0ZXh0IGZpbGUgY29udGFpbmluZyB1c2VyIElEcyBhbmQgcGFzc3dvcmRzIn0sCi0gICAgeyJBdXRoR3JvdXBGaWxlIiwgc2V0X2F1dGhfc2xvdCwKLSAgICAgKHZvaWQgKikgWHRPZmZzZXRPZihhdXRoX2NvbmZpZ19yZWMsIGF1dGhfZ3JwZmlsZSksIE9SX0FVVEhDRkcsIFRBS0UxMiwKLSAgICAgInRleHQgZmlsZSBjb250YWluaW5nIGdyb3VwIG5hbWVzIGFuZCBtZW1iZXIgdXNlciBJRHMifSwKLSAgICB7IkF1dGhBdXRob3JpdGF0aXZlIiwgYXBfc2V0X2ZsYWdfc2xvdCwKLSAgICAgKHZvaWQgKikgWHRPZmZzZXRPZihhdXRoX2NvbmZpZ19yZWMsIGF1dGhfYXV0aG9yaXRhdGl2ZSksCi0gICAgIE9SX0FVVEhDRkcsIEZMQUcsCi0gICAgICJTZXQgdG8gJ25vJyB0byBhbGxvdyBhY2Nlc3MgY29udHJvbCB0byBiZSBwYXNzZWQgYWxvbmcgdG8gbG93ZXIgbW9kdWxlcyBpZiB0aGUgVXNlcklEIGlzIG5vdCBrbm93biB0byB0aGlzIG1vZHVsZSJ9LAotICAgIHtOVUxMfQotfTsKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGF1dGhfbW9kdWxlOwotCi1zdGF0aWMgY2hhciAqZ2V0X3B3KHJlcXVlc3RfcmVjICpyLCBjaGFyICp1c2VyLCBjaGFyICphdXRoX3B3ZmlsZSkKLXsKLSAgICBjb25maWdmaWxlX3QgKmY7Ci0gICAgY2hhciBsW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjb25zdCBjaGFyICpycHcsICp3OwotICAgIGFwX3N0YXR1c190IHN0YXR1czsKLQotICAgIGlmICgoc3RhdHVzID0gYXBfcGNmZ19vcGVuZmlsZSgmZiwgci0+cG9vbCwgYXV0aF9wd2ZpbGUpKSAhPSBBUFJfU1VDQ0VTUykgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzdGF0dXMsIHIsCi0JCSAgICAiQ291bGQgbm90IG9wZW4gcGFzc3dvcmQgZmlsZTogJXMiLCBhdXRoX3B3ZmlsZSk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHdoaWxlICghKGFwX2NmZ19nZXRsaW5lKGwsIE1BWF9TVFJJTkdfTEVOLCBmKSkpIHsKLQlpZiAoKGxbMF0gPT0gJyMnKSB8fCAoIWxbMF0pKQotCSAgICBjb250aW51ZTsKLQlycHcgPSBsOwotCXcgPSBhcF9nZXR3b3JkKHItPnBvb2wsICZycHcsICc6Jyk7Ci0KLQlpZiAoIXN0cmNtcCh1c2VyLCB3KSkgewotCSAgICBhcF9jZmdfY2xvc2VmaWxlKGYpOwotCSAgICByZXR1cm4gYXBfZ2V0d29yZChyLT5wb29sLCAmcnB3LCAnOicpOwotCX0KLSAgICB9Ci0gICAgYXBfY2ZnX2Nsb3NlZmlsZShmKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGFwX3RhYmxlX3QgKmdyb3Vwc19mb3JfdXNlcihhcF9jb250ZXh0X3QgKnAsIGNoYXIgKnVzZXIsIGNoYXIgKmdycGZpbGUpCi17Ci0gICAgY29uZmlnZmlsZV90ICpmOwotICAgIGFwX3RhYmxlX3QgKmdycHMgPSBhcF9tYWtlX3RhYmxlKHAsIDE1KTsKLSAgICBhcF9jb250ZXh0X3QgKnNwOwotICAgIGNoYXIgbFtNQVhfU1RSSU5HX0xFTl07Ci0gICAgY29uc3QgY2hhciAqZ3JvdXBfbmFtZSwgKmxsLCAqdzsKLSAgICBhcF9zdGF0dXNfdCBzdGF0dXM7Ci0KLSAgICBpZiAoKHN0YXR1cyA9IGFwX3BjZmdfb3BlbmZpbGUoJmYsIHAsIGdycGZpbGUpKSAhPSBBUFJfU1VDQ0VTUykgewotLyphZGQ/CWFwbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgTlVMTCwKLQkJICAgICJDb3VsZCBub3Qgb3BlbiBncm91cCBmaWxlOiAlcyIsIGdycGZpbGUpOyovCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgYXBfY3JlYXRlX2NvbnRleHQoJnNwLCBwKTsKLQotICAgIHdoaWxlICghKGFwX2NmZ19nZXRsaW5lKGwsIE1BWF9TVFJJTkdfTEVOLCBmKSkpIHsKLQlpZiAoKGxbMF0gPT0gJyMnKSB8fCAoIWxbMF0pKQotCSAgICBjb250aW51ZTsKLQlsbCA9IGw7Ci0JYXBfY2xlYXJfcG9vbChzcCk7Ci0KLQlncm91cF9uYW1lID0gYXBfZ2V0d29yZChzcCwgJmxsLCAnOicpOwotCi0Jd2hpbGUgKGxsWzBdKSB7Ci0JICAgIHcgPSBhcF9nZXR3b3JkX2NvbmYoc3AsICZsbCk7Ci0JICAgIGlmICghc3RyY21wKHcsIHVzZXIpKSB7Ci0JCWFwX3RhYmxlX3NldG4oZ3JwcywgYXBfcHN0cmR1cChwLCBncm91cF9uYW1lKSwgImluIik7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICBhcF9jZmdfY2xvc2VmaWxlKGYpOwotICAgIGFwX2Rlc3Ryb3lfcG9vbChzcCk7Ci0gICAgcmV0dXJuIGdycHM7Ci19Ci0KLS8qIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gMCBpZiBjbGllbnQgaXMgT0ssIGFuZCBwcm9wZXIgZXJyb3Igc3RhdHVzCi0gKiBpZiBub3QuLi4gZWl0aGVyIEFVVEhfUkVRVUlSRUQsIGlmIHdlIG1hZGUgYSBjaGVjaywgYW5kIGl0IGZhaWxlZCwgb3IKLSAqIFNFUlZFUl9FUlJPUiwgaWYgdGhpbmdzIGFyZSBzbyB0b3RhbGx5IGNvbmZ1c2VkIHRoYXQgd2UgY291bGRuJ3QKLSAqIGZpZ3VyZSBvdXQgaG93IHRvIHRlbGwgaWYgdGhlIGNsaWVudCBpcyBhdXRob3JpemVkIG9yIG5vdC4KLSAqCi0gKiBJZiB0aGV5IHJldHVybiBERUNMSU5FRCwgYW5kIGFsbCBvdGhlciBtb2R1bGVzIGFsc28gZGVjbGluZSwgdGhhdCdzCi0gKiB0cmVhdGVkIGJ5IHRoZSBzZXJ2ZXIgY29yZSBhcyBhIGNvbmZpZ3VyYXRpb24gZXJyb3IsIGxvZ2dlZCBhbmQKLSAqIHJlcG9ydGVkIGFzIHN1Y2guCi0gKi8KLQotLyogRGV0ZXJtaW5lIHVzZXIgSUQsIGFuZCBjaGVjayBpZiBpdCByZWFsbHkgaXMgdGhhdCB1c2VyLCBmb3IgSFRUUAotICogYmFzaWMgYXV0aGVudGljYXRpb24uLi4KLSAqLwotCi1zdGF0aWMgaW50IGF1dGhlbnRpY2F0ZV9iYXNpY191c2VyKHJlcXVlc3RfcmVjICpyKQotewotICAgIGF1dGhfY29uZmlnX3JlYyAqc2VjID0KLSAgICAoYXV0aF9jb25maWdfcmVjICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAmYXV0aF9tb2R1bGUpOwotICAgIGNvbnN0IGNoYXIgKnNlbnRfcHc7Ci0gICAgY2hhciAqcmVhbF9wdzsKLSAgICBhcF9zdGF0dXNfdCBpbnZhbGlkX3B3OwotICAgIGludCByZXM7Ci0KLSAgICBpZiAoKHJlcyA9IGFwX2dldF9iYXNpY19hdXRoX3B3KHIsICZzZW50X3B3KSkpCi0JcmV0dXJuIHJlczsKLQotICAgIGlmICghc2VjLT5hdXRoX3B3ZmlsZSkKLQlyZXR1cm4gREVDTElORUQ7Ci0KLSAgICBpZiAoIShyZWFsX3B3ID0gZ2V0X3B3KHIsIHItPnVzZXIsIHNlYy0+YXV0aF9wd2ZpbGUpKSkgewotCWlmICghKHNlYy0+YXV0aF9hdXRob3JpdGF0aXZlKSkKLQkgICAgcmV0dXJuIERFQ0xJTkVEOwotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0JCSAgICAidXNlciAlcyBub3QgZm91bmQ6ICVzIiwgci0+dXNlciwgci0+dXJpKTsKLQlhcF9ub3RlX2Jhc2ljX2F1dGhfZmFpbHVyZShyKTsKLQlyZXR1cm4gQVVUSF9SRVFVSVJFRDsKLSAgICB9Ci0gICAgaW52YWxpZF9wdyA9IGFwX3ZhbGlkYXRlX3Bhc3N3b3JkKHNlbnRfcHcsIHJlYWxfcHcpOwotICAgIGlmIChpbnZhbGlkX3B3ICE9IEFQUl9TVUNDRVNTKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLQkJICAgICAgInVzZXIgJXM6IGF1dGhlbnRpY2F0aW9uIGZhaWx1cmUgZm9yIFwiJXNcIjogIgotICAgICAgICAgICAgICAgICAgICAgICJQYXNzd29yZCBNaXNtYXRjaCIsCi0JCSAgICAgIHItPnVzZXIsIHItPnVyaSk7Ci0JYXBfbm90ZV9iYXNpY19hdXRoX2ZhaWx1cmUocik7Ci0JcmV0dXJuIEFVVEhfUkVRVUlSRUQ7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotLyogQ2hlY2tpbmcgSUQgKi8KLQotc3RhdGljIGludCBjaGVja191c2VyX2FjY2VzcyhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBhdXRoX2NvbmZpZ19yZWMgKnNlYyA9Ci0gICAgKGF1dGhfY29uZmlnX3JlYyAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywgJmF1dGhfbW9kdWxlKTsKLSAgICBjaGFyICp1c2VyID0gci0+dXNlcjsKLSAgICBpbnQgbSA9IHItPm1ldGhvZF9udW1iZXI7Ci0gICAgaW50IG1ldGhvZF9yZXN0cmljdGVkID0gMDsKLSAgICByZWdpc3RlciBpbnQgeDsKLSAgICBjb25zdCBjaGFyICp0LCAqdzsKLSAgICBhcF90YWJsZV90ICpncnBzdGF0dXM7Ci0gICAgY29uc3QgYXBfYXJyYXlfaGVhZGVyX3QgKnJlcXNfYXJyID0gYXBfcmVxdWlyZXMocik7Ci0gICAgcmVxdWlyZV9saW5lICpyZXFzOwotCi0gICAgLyogQlVHIEZJWDogdGFkYywgMTEtTm92LTE5OTUuICBJZiB0aGVyZSBpcyBubyAicmVxdWlyZXMiIGRpcmVjdGl2ZSwgCi0gICAgICogdGhlbiBhbnkgdXNlciB3aWxsIGRvLgotICAgICAqLwotICAgIGlmICghcmVxc19hcnIpCi0JcmV0dXJuIChPSyk7Ci0gICAgcmVxcyA9IChyZXF1aXJlX2xpbmUgKikgcmVxc19hcnItPmVsdHM7Ci0KLSAgICBpZiAoc2VjLT5hdXRoX2dycGZpbGUpCi0JZ3Jwc3RhdHVzID0gZ3JvdXBzX2Zvcl91c2VyKHItPnBvb2wsIHVzZXIsIHNlYy0+YXV0aF9ncnBmaWxlKTsKLSAgICBlbHNlCi0JZ3Jwc3RhdHVzID0gTlVMTDsKLQotICAgIGZvciAoeCA9IDA7IHggPCByZXFzX2Fyci0+bmVsdHM7IHgrKykgewotCi0JaWYgKCEocmVxc1t4XS5tZXRob2RfbWFzayAmICgxIDw8IG0pKSkKLQkgICAgY29udGludWU7Ci0KLQltZXRob2RfcmVzdHJpY3RlZCA9IDE7Ci0KLQl0ID0gcmVxc1t4XS5yZXF1aXJlbWVudDsKLQl3ID0gYXBfZ2V0d29yZF93aGl0ZShyLT5wb29sLCAmdCk7Ci0JaWYgKCFzdHJjbXAodywgInZhbGlkLXVzZXIiKSkKLQkgICAgcmV0dXJuIE9LOwotCWlmICghc3RyY21wKHcsICJ1c2VyIikpIHsKLQkgICAgd2hpbGUgKHRbMF0pIHsKLQkJdyA9IGFwX2dldHdvcmRfY29uZihyLT5wb29sLCAmdCk7Ci0JCWlmICghc3RyY21wKHVzZXIsIHcpKQotCQkgICAgcmV0dXJuIE9LOwotCSAgICB9Ci0JfQotCWVsc2UgaWYgKCFzdHJjbXAodywgImdyb3VwIikpIHsKLQkgICAgaWYgKCFncnBzdGF0dXMpCi0JCXJldHVybiBERUNMSU5FRDsJLyogREJNIGdyb3VwPyAgU29tZXRoaW5nIGVsc2U/ICovCi0KLQkgICAgd2hpbGUgKHRbMF0pIHsKLQkJdyA9IGFwX2dldHdvcmRfY29uZihyLT5wb29sLCAmdCk7Ci0JCWlmIChhcF90YWJsZV9nZXQoZ3Jwc3RhdHVzLCB3KSkKLQkJICAgIHJldHVybiBPSzsKLQkgICAgfQotCX0gZWxzZSBpZiAoc2VjLT5hdXRoX2F1dGhvcml0YXRpdmUpIHsKLQkgICAgLyogaWYgd2UgYXJlbid0IGF1dGhvcml0YXRpdmUsIGFueSByZXF1aXJlIGRpcmVjdGl2ZSBjb3VsZCBiZQotCSAgICAgKiB2YWxpZCBldmVuIGlmIHdlIGRvbid0IGdyb2sgaXQuICBIb3dldmVyLCBpZiB3ZSBhcmUgCi0JICAgICAqIGF1dGhvcml0YXRpdmUsIHdlIGNhbiB3YXJuIHRoZSB1c2VyIHRoZXkgZGlkIHNvbWV0aGluZyB3cm9uZy4KLQkgICAgICogVGhhdCBzb21ldGhpbmcgY291bGQgYmUgYSBtaXNzaW5nICJBdXRoQXV0aG9yaXRhdGl2ZSBvZmYiLCBidXQKLQkgICAgICogbW9yZSBsaWtlbHkgaXMgYSB0eXBvIGluIHRoZSByZXF1aXJlIGRpcmVjdGl2ZS4KLQkgICAgICovCi0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0JCSJhY2Nlc3MgdG8gJXMgZmFpbGVkLCByZWFzb246IHVua25vd24gcmVxdWlyZSBkaXJlY3RpdmU6IgotCQkiXCIlc1wiIiwgci0+dXJpLCByZXFzW3hdLnJlcXVpcmVtZW50KTsKLQl9Ci0gICAgfQotCi0gICAgaWYgKCFtZXRob2RfcmVzdHJpY3RlZCkKLQlyZXR1cm4gT0s7Ci0KLSAgICBpZiAoIShzZWMtPmF1dGhfYXV0aG9yaXRhdGl2ZSkpCi0JcmV0dXJuIERFQ0xJTkVEOwotCi0gICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLQkiYWNjZXNzIHRvICVzIGZhaWxlZCwgcmVhc29uOiB1c2VyICVzIG5vdCBhbGxvd2VkIGFjY2VzcyIsCi0Jci0+dXJpLCB1c2VyKTsKLQkKLSAgICBhcF9ub3RlX2Jhc2ljX2F1dGhfZmFpbHVyZShyKTsKLSAgICByZXR1cm4gQVVUSF9SRVFVSVJFRDsKLX0KLQotc3RhdGljIHZvaWQgcmVnaXN0ZXJfaG9va3Modm9pZCkKLXsKLSAgICBhcF9ob29rX2NoZWNrX3VzZXJfaWQoYXV0aGVudGljYXRlX2Jhc2ljX3VzZXIsTlVMTCxOVUxMLEhPT0tfTUlERExFKTsKLSAgICBhcF9ob29rX2F1dGhfY2hlY2tlcihjaGVja191c2VyX2FjY2VzcyxOVUxMLE5VTEwsSE9PS19NSURETEUpOwotfQotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgYXV0aF9tb2R1bGUgPQotewotICAgIFNUQU5EQVJEMjBfTU9EVUxFX1NUVUZGLAotICAgIGNyZWF0ZV9hdXRoX2Rpcl9jb25maWcsCS8qIGRpciBjb25maWcgY3JlYXRlciAqLwotICAgIE5VTEwsCQkJLyogZGlyIG1lcmdlciAtLS0gZGVmYXVsdCBpcyB0byBvdmVycmlkZSAqLwotICAgIE5VTEwsCQkJLyogc2VydmVyIGNvbmZpZyAqLwotICAgIE5VTEwsCQkJLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLwotICAgIGF1dGhfY21kcywJCQkvKiBjb21tYW5kIGFwX3RhYmxlX3QgKi8KLSAgICBOVUxMLAkJCS8qIGhhbmRsZXJzICovCi0gICAgcmVnaXN0ZXJfaG9va3MJCS8qIHJlZ2lzdGVyIGhvb2tzICovCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hYWEvbW9kX2F1dGguZXhwIGIvbW9kdWxlcy9hYWEvbW9kX2F1dGguZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmFkYWQwLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvYWFhL21vZF9hdXRoLmV4cAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWF1dGhfbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL2FhYS9tb2RfYXV0aF9hbm9uLmMgYi9tb2R1bGVzL2FhYS9tb2RfYXV0aF9hbm9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNmFiZmQuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9hYWEvbW9kX2F1dGhfYW5vbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVCdTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBodHRwX2F1dGg6IGF1dGhlbnRpY2F0aW9uCi0gKiAKLSAqIFJvYiBNY0Nvb2wgJiBCcmlhbiBCZWhsZW5kb3JmLgotICogCi0gKiBBZGFwdGVkIHRvIEFwYWNoZSBieSByc3QuCi0gKgotICogVmVyc2lvbiAwLjUgTWF5IDE5OTYKLSAqCi0gKiBNb2RpZmllZCBieSBEaXJrLnZhbkd1bGlrQGpyYy5pdCB0bwotICogCi0gKiBBZGFwdGVkIHRvIGFsbG93IGFub255bW91cyBsb2dpbnMsIGp1c3QgbGlrZSB3aXRoIEFub24tRlRQLCB3aGVuCi0gKiBvbmUgZ2l2ZXMgdGhlIG1hZ2ljIHVzZXIgbmFtZSAnYW5vbnltb3VzJyBhbmQgb25lcyBlbWFpbCBhZGRyZXNzCi0gKiBhcyB0aGUgcGFzc3dvcmQuCi0gKgotICogSnVzdCBhZGQgdGhlIGZvbGxvd2luZyB0b2tlcyB0byB5b3VyIDxkaXJlY3Rvcnk+IHNldHVwOgotICogCi0gKiBBbm9ueW1vdXMgICAgICAgICAgICAgICAgICAgIG1hZ2ljLXVzZXJpZCBbbWFnaWMtdXNlcmlkXS4uLgotICoKLSAqIEFub255bW91c19NdXN0R2l2ZUVtYWlsICAgICAgWyBvbiB8IG9mZiBdIGRlZmF1bHQgPSBvZmYKLSAqIEFub255bW91c19Mb2dFbWFpbCAgICAgICAgICAgWyBvbiB8IG9mZiBdIGRlZmF1bHQgPSBvbgotICogQW5vbnltb3VzX1ZlcmlmeUVtYWlsICAgICAgICBbIG9uIHwgb2ZmIF0gZGVmYXVsdCA9IG9mZgotICogQW5vbnltb3VzX05vVXNlcklkICAgICAgICAgICBbIG9uIHwgb2ZmIF0gZGVmYXVsdCA9IG9mZgotICogQW5vbnltb3VzX0F1dGhvcml0YXRpdmUgICAgICBbIG9uIHwgb2ZmIF0gZGVmYXVsdCA9IG9mZgotICoKLSAqIFRoZSBtYWdpYyB1c2VyIGlkIGlzIHNvbWV0aGluZyBsaWtlICdhbm9ueW1vdXMnLCBpdCBpcyBOT1QgY2FzZSBzZW5zaXRpdmUuIAotICogCi0gKiBUaGUgTXVzdEdpdmVFbWFpbCBmbGFnIGNhbiBiZSB1c2VkIHRvIGZvcmNlIHVzZXJzIHRvIGVudGVyIHNvbWV0aGluZwotICogaW4gdGhlIHBhc3N3b3JkIGZpZWxkIChsaWtlIGFuIGVtYWlsIGFkZHJlc3MpLiBEZWZhdWx0IGlzIG9mZi4KLSAqCi0gKiBGdXJ0aGVybW9yZSB0aGUgJ05vVXNlcklEJyBmbGFnIGNhbiBiZSBzZXQgdG8gYWxsb3cgY29tcGxldGVseSBlbXB0eQotICogdXNlcm5hbWVzIGluIGFzIHdlbGw7IHRoaXMgY2FuIGJlIGlzIGNvbnZlbmllbnQgYXMgYSBzaW5nbGUgcmV0dXJuCi0gKiBpbiBicm9rZW4gR1VJcyBsaWtlIFc5NSBpcyBvZnRlbiBnaXZlbiBieSB0aGUgdXNlci4gVGhlIERlZmF1bHQgaXMgb2ZmLgotICoKLSAqIERpcmsudmFuR3VsaWtAanJjLml0OyBodHRwOi8vZXdzZS5jZW8ub3JnOyBodHRwOi8vbWUtd3d3LmpyYy5pdC9+ZGlya3gKLSAqIAotICovCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCi0KLXR5cGVkZWYgc3RydWN0IGF1dGhfYW5vbiB7Ci0gICAgY2hhciAqcGFzc3dvcmQ7Ci0gICAgc3RydWN0IGF1dGhfYW5vbiAqbmV4dDsKLX0gYXV0aF9hbm9uOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBhdXRoX2Fub24gKmF1dGhfYW5vbl9wYXNzd29yZHM7Ci0gICAgaW50IGF1dGhfYW5vbl9ub3VzZXJpZDsKLSAgICBpbnQgYXV0aF9hbm9uX2xvZ2VtYWlsOwotICAgIGludCBhdXRoX2Fub25fdmVyaWZ5ZW1haWw7Ci0gICAgaW50IGF1dGhfYW5vbl9tdXN0ZW1haWw7Ci0gICAgaW50IGF1dGhfYW5vbl9hdXRob3JpdGF0aXZlOwotCi19IGFub25fYXV0aF9jb25maWdfcmVjOwotCi1zdGF0aWMgdm9pZCAqY3JlYXRlX2Fub25fYXV0aF9kaXJfY29uZmlnKGFwX2NvbnRleHRfdCAqcCwgY2hhciAqZCkKLXsKLSAgICBhbm9uX2F1dGhfY29uZmlnX3JlYyAqc2VjID0gKGFub25fYXV0aF9jb25maWdfcmVjICopCi0gICAgYXBfcGNhbGxvYyhwLCBzaXplb2YoYW5vbl9hdXRoX2NvbmZpZ19yZWMpKTsKLQotICAgIGlmICghc2VjKQotCXJldHVybiBOVUxMOwkJLyogbm8gbWVtb3J5Li4uICovCi0KLSAgICAvKiBqdXN0IHRvIGlsbHVzdHJhdGUgdGhlIGRlZmF1bHRzIHJlYWxseS4gKi8KLSAgICBzZWMtPmF1dGhfYW5vbl9wYXNzd29yZHMgPSBOVUxMOwotCi0gICAgc2VjLT5hdXRoX2Fub25fbm91c2VyaWQgPSAwOwotICAgIHNlYy0+YXV0aF9hbm9uX2xvZ2VtYWlsID0gMTsKLSAgICBzZWMtPmF1dGhfYW5vbl92ZXJpZnllbWFpbCA9IDA7Ci0gICAgc2VjLT5hdXRoX2Fub25fbXVzdGVtYWlsID0gMTsKLSAgICBzZWMtPmF1dGhfYW5vbl9hdXRob3JpdGF0aXZlID0gMDsKLSAgICByZXR1cm4gc2VjOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqYW5vbl9zZXRfcGFzc3dkX2ZsYWcoY21kX3Bhcm1zICpjbWQsCi0JCQkJIGFub25fYXV0aF9jb25maWdfcmVjICogc2VjLCBpbnQgYXJnKQotewotICAgIHNlYy0+YXV0aF9hbm9uX211c3RlbWFpbCA9IGFyZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmFub25fc2V0X3VzZXJpZF9mbGFnKGNtZF9wYXJtcyAqY21kLAotCQkJCSBhbm9uX2F1dGhfY29uZmlnX3JlYyAqIHNlYywgaW50IGFyZykKLXsKLSAgICBzZWMtPmF1dGhfYW5vbl9ub3VzZXJpZCA9IGFyZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLXN0YXRpYyBjb25zdCBjaGFyICphbm9uX3NldF9sb2dlbWFpbF9mbGFnKGNtZF9wYXJtcyAqY21kLAotCQkJCSAgIGFub25fYXV0aF9jb25maWdfcmVjICogc2VjLCBpbnQgYXJnKQotewotICAgIHNlYy0+YXV0aF9hbm9uX2xvZ2VtYWlsID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotc3RhdGljIGNvbnN0IGNoYXIgKmFub25fc2V0X3ZlcmlmeWVtYWlsX2ZsYWcoY21kX3Bhcm1zICpjbWQsCi0JCQkJICAgICAgYW5vbl9hdXRoX2NvbmZpZ19yZWMgKiBzZWMsIGludCBhcmcpCi17Ci0gICAgc2VjLT5hdXRoX2Fub25fdmVyaWZ5ZW1haWwgPSBhcmc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci1zdGF0aWMgY29uc3QgY2hhciAqYW5vbl9zZXRfYXV0aG9yaXRhdGl2ZV9mbGFnKGNtZF9wYXJtcyAqY21kLAotCQkJCQlhbm9uX2F1dGhfY29uZmlnX3JlYyAqIHNlYywgaW50IGFyZykKLXsKLSAgICBzZWMtPmF1dGhfYW5vbl9hdXRob3JpdGF0aXZlID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqYW5vbl9zZXRfc3RyaW5nX3Nsb3RzKGNtZF9wYXJtcyAqY21kLAotCQkJCSAgYW5vbl9hdXRoX2NvbmZpZ19yZWMgKiBzZWMsIGNoYXIgKmFyZykKLXsKLQotICAgIGF1dGhfYW5vbiAqZmlyc3Q7Ci0KLSAgICBpZiAoISgqYXJnKSkKLQlyZXR1cm4gIkFub255bW91cyBzdHJpbmcgY2Fubm90IGJlIGVtcHR5LCB1c2UgQW5vbnltb3VzX05vVXNlcklkIGluc3RlYWQiOwotCi0gICAgLyogc3F1ZWV6ZSBpbiBhIHJlY29yZCAqLwotICAgIGZpcnN0ID0gc2VjLT5hdXRoX2Fub25fcGFzc3dvcmRzOwotCi0gICAgaWYgKAotCSAgICghKHNlYy0+YXV0aF9hbm9uX3Bhc3N3b3JkcyA9IChhdXRoX2Fub24gKikgYXBfcGFsbG9jKGNtZC0+cG9vbCwgc2l6ZW9mKGF1dGhfYW5vbikpKSkgfHwKLSAgICAgICAgICAgKCEoc2VjLT5hdXRoX2Fub25fcGFzc3dvcmRzLT5wYXNzd29yZCA9IGFyZykpCi0gICAgKQotCSAgICAgcmV0dXJuICJGYWlsZWQgdG8gY2xhaW0gbWVtb3J5IGZvciBhbiBhbm9ueW1vdXMgcGFzc3dvcmQuLi4iOwotCi0gICAgLyogYW5kIHJlcGFpciB0aGUgbmV4dCAqLwotICAgIHNlYy0+YXV0aF9hbm9uX3Bhc3N3b3Jkcy0+bmV4dCA9IGZpcnN0OwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBhbm9uX2F1dGhfY21kc1tdID0KLXsKLSAgICB7IkFub255bW91cyIsIGFub25fc2V0X3N0cmluZ19zbG90cywgTlVMTCwgT1JfQVVUSENGRywgSVRFUkFURSwKLSAgICAgImEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgdXNlciBJRHMifSwKLSAgICB7IkFub255bW91c19NdXN0R2l2ZUVtYWlsIiwgYW5vbl9zZXRfcGFzc3dkX2ZsYWcsIE5VTEwsIE9SX0FVVEhDRkcsIEZMQUcsCi0gICAgICJMaW1pdGVkIHRvICdvbicgb3IgJ29mZicifSwKLSAgICB7IkFub255bW91c19Ob1VzZXJJZCIsIGFub25fc2V0X3VzZXJpZF9mbGFnLCBOVUxMLCBPUl9BVVRIQ0ZHLCBGTEFHLAotICAgICAiTGltaXRlZCB0byAnb24nIG9yICdvZmYnIn0sCi17IkFub255bW91c19WZXJpZnlFbWFpbCIsIGFub25fc2V0X3ZlcmlmeWVtYWlsX2ZsYWcsIE5VTEwsIE9SX0FVVEhDRkcsIEZMQUcsCi0gIkxpbWl0ZWQgdG8gJ29uJyBvciAnb2ZmJyJ9LAotICAgIHsiQW5vbnltb3VzX0xvZ0VtYWlsIiwgYW5vbl9zZXRfbG9nZW1haWxfZmxhZywgTlVMTCwgT1JfQVVUSENGRywgRkxBRywKLSAgICAgIkxpbWl0ZWQgdG8gJ29uJyBvciAnb2ZmJyJ9LAotICAgIHsiQW5vbnltb3VzX0F1dGhvcml0YXRpdmUiLCBhbm9uX3NldF9hdXRob3JpdGF0aXZlX2ZsYWcsIE5VTEwsIE9SX0FVVEhDRkcsIEZMQUcsCi0gICAgICJMaW1pdGVkIHRvICdvbicgb3IgJ29mZicifSwKLQotICAgIHtOVUxMfQotfTsKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGFub25fYXV0aF9tb2R1bGU7Ci0KLXN0YXRpYyBpbnQgYW5vbl9hdXRoZW50aWNhdGVfYmFzaWNfdXNlcihyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBhbm9uX2F1dGhfY29uZmlnX3JlYyAqc2VjID0KLSAgICAoYW5vbl9hdXRoX2NvbmZpZ19yZWMgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCSAgICAgICAmYW5vbl9hdXRoX21vZHVsZSk7Ci0gICAgY29uc3QgY2hhciAqc2VudF9wdzsKLSAgICBpbnQgcmVzID0gREVDTElORUQ7Ci0KLSAgICBpZiAoKHJlcyA9IGFwX2dldF9iYXNpY19hdXRoX3B3KHIsICZzZW50X3B3KSkpCi0JcmV0dXJuIHJlczsKLQotICAgIC8qIElnbm9yZSBpZiB3ZSBhcmUgbm90IGNvbmZpZ3VyZWQgKi8KLSAgICBpZiAoIXNlYy0+YXV0aF9hbm9uX3Bhc3N3b3JkcykKLQlyZXR1cm4gREVDTElORUQ7Ci0KLSAgICAvKiBEbyB3ZSBhbGxvdyBhbiBlbXB0eSB1c2VySUQgYW5kL29yIGlzIGl0IHRoZSBtYWdpYyBvbmUKLSAgICAgKi8KLQotICAgIGlmICgoIShyLT51c2VyWzBdKSkgJiYgKHNlYy0+YXV0aF9hbm9uX25vdXNlcmlkKSkgewotCXJlcyA9IE9LOwotICAgIH0KLSAgICBlbHNlIHsKLQlhdXRoX2Fub24gKnAgPSBzZWMtPmF1dGhfYW5vbl9wYXNzd29yZHM7Ci0JcmVzID0gREVDTElORUQ7Ci0Jd2hpbGUgKChyZXMgPT0gREVDTElORUQpICYmIChwICE9IE5VTEwpKSB7Ci0JICAgIGlmICghKHN0cmNhc2VjbXAoci0+dXNlciwgcC0+cGFzc3dvcmQpKSkKLQkJcmVzID0gT0s7Ci0JICAgIHAgPSBwLT5uZXh0OwotCX0KLSAgICB9Ci0gICAgaWYgKAotICAgIC8qIHVzZXJuYW1lIGlzIE9LICovCi0JICAgKHJlcyA9PSBPSykKLSAgICAvKiBwYXNzd29yZCBiZWVuIGZpbGxlZCBvdXQgPyAqLwotCSAgICYmICgoIXNlYy0+YXV0aF9hbm9uX211c3RlbWFpbCkgfHwgc3RybGVuKHNlbnRfcHcpKQotICAgIC8qIGRvZXMgdGhlIHBhc3N3b3JkIGxvb2sgbGlrZSBhbiBlbWFpbCBhZGRyZXNzID8gKi8KLQkgICAmJiAoKCFzZWMtPmF1dGhfYW5vbl92ZXJpZnllbWFpbCkKLQkgICAgICAgfHwgKChzdHJwYnJrKCJAIiwgc2VudF9wdykgIT0gTlVMTCkKLQkJICAgJiYgKHN0cnBicmsoIi4iLCBzZW50X3B3KSAhPSBOVUxMKSkpKSB7Ci0JaWYgKHNlYy0+YXV0aF9hbm9uX2xvZ2VtYWlsICYmIGFwX2lzX2luaXRpYWxfcmVxKHIpKSB7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19JTkZPLCBBUFJfU1VDQ0VTUywgciwKLQkJCSJBbm9ueW1vdXM6IFBhc3N3ZCA8JXM+IEFjY2VwdGVkIiwKLQkJCXNlbnRfcHcgPyBzZW50X3B3IDogIlwnbm9uZVwnIik7Ci0JfQotCXJldHVybiBPSzsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JaWYgKHNlYy0+YXV0aF9hbm9uX2F1dGhvcml0YXRpdmUpIHsKLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgQVBSX1NVQ0NFU1MsIHIsCi0JCQkiQW5vbnltb3VzOiBBdXRob3JpdGF0aXZlLCBQYXNzd2QgPCVzPiBub3QgYWNjZXB0ZWQiLAotCQkJc2VudF9wdyA/IHNlbnRfcHcgOiAiXCdub25lXCciKTsKLQkgICAgcmV0dXJuIEFVVEhfUkVRVUlSRUQ7Ci0JfQotCS8qIERyb3Agb3V0IHRoZSBib3R0b20gdG8gcmV0dXJuIERFQ0xJTkVEICovCi0gICAgfQotCi0gICAgcmV0dXJuIERFQ0xJTkVEOwotfQotCi1zdGF0aWMgaW50IGNoZWNrX2Fub25fYWNjZXNzKHJlcXVlc3RfcmVjICpyKQotewotI2lmZGVmIE5PVFlFVAotICAgIGNvbm5fcmVjICpjID0gci0+Y29ubmVjdGlvbjsKLSAgICBhbm9uX2F1dGhfY29uZmlnX3JlYyAqc2VjID0KLSAgICAoYW5vbl9hdXRoX2NvbmZpZ19yZWMgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCSAgICAgICAmYW5vbl9hdXRoX21vZHVsZSk7Ci0KLSAgICBpZiAoIXNlYy0+YXV0aF9hbm9uKQotCXJldHVybiBERUNMSU5FRDsKLQotICAgIGlmIChzdHJjYXNlY21wKHItPmNvbm5lY3Rpb24tPnVzZXIsIHNlYy0+YXV0aF9hbm9uKSkKLQlyZXR1cm4gREVDTElORUQ7Ci0KLSAgICByZXR1cm4gT0s7Ci0jZW5kaWYKLSAgICByZXR1cm4gREVDTElORUQ7Ci19Ci1zdGF0aWMgdm9pZCByZWdpc3Rlcl9ob29rcyh2b2lkKQotewotICAgIGFwX2hvb2tfY2hlY2tfdXNlcl9pZChhbm9uX2F1dGhlbnRpY2F0ZV9iYXNpY191c2VyLE5VTEwsTlVMTCxIT09LX01JRERMRSk7Ci0gICAgYXBfaG9va19hdXRoX2NoZWNrZXIoY2hlY2tfYW5vbl9hY2Nlc3MsTlVMTCxOVUxMLEhPT0tfTUlERExFKTsKLX0KLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGFub25fYXV0aF9tb2R1bGUgPQotewotICAgIFNUQU5EQVJEMjBfTU9EVUxFX1NUVUZGLAotICAgIGNyZWF0ZV9hbm9uX2F1dGhfZGlyX2NvbmZpZywvKiBkaXIgY29uZmlnIGNyZWF0ZXIgKi8KLSAgICBOVUxMLAkJCS8qIGRpciBtZXJnZXIgZW5zdXJlIHN0cmljdG5lc3MgKi8KLSAgICBOVUxMLAkJCS8qIHNlcnZlciBjb25maWcgKi8KLSAgICBOVUxMLAkJCS8qIG1lcmdlIHNlcnZlciBjb25maWcgKi8KLSAgICBhbm9uX2F1dGhfY21kcywJCS8qIGNvbW1hbmQgYXBfdGFibGVfdCAqLwotICAgIE5VTEwsCQkJLyogaGFuZGxlcnMgKi8KLSAgICByZWdpc3Rlcl9ob29rcwkJLyogcmVnaXN0ZXIgaG9va3MgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL2FhYS9tb2RfYXV0aF9hbm9uLmRzcCBiL21vZHVsZXMvYWFhL21vZF9hdXRoX2Fub24uZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmU4Y2M3Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvYWFhL21vZF9hdXRoX2Fub24uZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iQXBhY2hlTW9kdWxlQXV0aEFub24iIC0gUGFja2FnZSBPd25lcj08ND4KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDUuMDAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMgotCi1DRkc9QXBhY2hlTW9kdWxlQXV0aEFub24gLSBXaW4zMiBSZWxlYXNlCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIkFwYWNoZU1vZHVsZUF1dGhBbm9uLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiQXBhY2hlTW9kdWxlQXV0aEFub24ubWFrIlwKLSBDRkc9IkFwYWNoZU1vZHVsZUF1dGhBbm9uIC0gV2luMzIgUmVsZWFzZSIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJBcGFjaGVNb2R1bGVBdXRoQW5vbiAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvblwKLSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgIkFwYWNoZU1vZHVsZUF1dGhBbm9uIC0gV2luMzIgRGVidWciIChiYXNlZCBvblwKLSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLU1UTD1taWRsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJBcGFjaGVNb2R1bGVBdXRoQW5vbiAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiLlxBcGFjaGVNb2R1bGVBdXRoQW5vblIiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVNb2R1bGVBdXRoQW5vblIiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dYIC9PMiAvSSAiLi5cLi5caW5jbHVkZSIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJTSEFSRURfTU9EVUxFIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiAuLlwuLlxDb3JlUlxBcGFjaGVDb3JlLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFjaGluZTpJMzg2Ci0KLSFFTFNFSUYgICIkKENGRykiID09ICJBcGFjaGVNb2R1bGVBdXRoQW5vbiAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIi5cRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiLlxBcGFjaGVNb2R1bGVBdXRoQW5vbkQiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVNb2R1bGVBdXRoQW5vbkQiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvSSAiLi5cLi5caW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJTSEFSRURfTU9EVUxFIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgLi5cLi5cQ29yZURcQXBhY2hlQ29yZS5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIkFwYWNoZU1vZHVsZUF1dGhBbm9uIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAiQXBhY2hlTW9kdWxlQXV0aEFub24gLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2hwajtiYXQ7Zm9yO2Y5MCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXC4uXG1vZHVsZXNcc3RhbmRhcmRcbW9kX2F1dGhfYW5vbi5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sO2ZpO2ZkIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxyZWFkZGlyLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO2NudDtydGY7Z2lmO2pwZztqcGVnO2pwZSIKLSMgRW5kIEdyb3VwCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL21vZHVsZXMvYWFhL21vZF9hdXRoX2Fub24uZXhwIGIvbW9kdWxlcy9hYWEvbW9kX2F1dGhfYW5vbi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMzk4OTYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9hYWEvbW9kX2F1dGhfYW5vbi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1hbm9uX2F1dGhfbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL2FhYS9tb2RfYXV0aF9kYi5jIGIvbW9kdWxlcy9hYWEvbW9kX2F1dGhfZGIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ2NTdlMS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2FhYS9tb2RfYXV0aF9kYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVCdTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBtb2RfYXV0aF9kYjogYXV0aGVudGljYXRpb24KLSAqIAotICogT3JpZ2luYWwgd29yayBieSBSb2IgTWNDb29sICYgQnJpYW4gQmVobGVuZG9yZi4KLSAqIAotICogQWRhcHRlZCB0byBBcGFjaGUgYnkgcnN0IChtb2RfYXV0aF9kYm0pCi0gKgotICogQWRhcHRlZCBmb3IgQmVya2VsZXkgREIgYnkgQW5kcmV3IENvaGVuIAotICoKLSAqIG1vZF9hdXRoX2RiIHdhcyBiYXNlZCBvbiBtb2RfYXV0aF9kYm0uCi0gKiAKLSAqIFdhcm5pbmcsIHRoaXMgaXMgbm90IGEgZHJvcCBpbiByZXBsYWNlbWVudCBmb3IgbW9kX2F1dGhfZGJtLCAKLSAqIGZvciBwZW9wbGUgd2FudGluZyB0byBzd2l0Y2ggZnJvbSBkYm0gdG8gQmVya2VsZXkgREIuCi0gKiBJdCByZXF1aXJlcyB0aGUgdXNlIG9mIEF1dGhEQlVzZXJGaWxlIGFuZCBBdXRoREJHcm91cEZpbGUKLSAqICAgICAgICAgICBpbnN0ZWFkIG9mICAgQXV0aERCTVVzZXJGaWxlICAgIEF1dGhEQk1Hcm91cEZpbGUKLSAqCi0gKiBBbHNvLCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHlvdSBuZWVkIHRvIHNwZWNpZnkKLSAqICBkYl9hdXRoX21vZHVsZSByYXRoZXIgdGhhbiBkYm1fYXV0aF9tb2R1bGUKLSAqCi0gKiBPbiBzb21lIEJTRCBzeXN0ZW1zIChlLmcuIEZyZWVCU0QgYW5kIE5ldEJTRCkgZGJtIGlzIGF1dG9tYXRpY2FsbHkKLSAqIG1hcHBlZCB0byBCZXJrZWxleSBEQi4gWW91IGNhbiB1c2UgZWl0aGVyIG1vZF9hdXRoX2RibSBvcgotICogbW9kX2F1dGhfZGIuIFRoZSBsYXR0ZXIgbWFrZXMgaXQgbW9yZSBvYnZpb3VzIHRoYXQgaXQncyBCZXJrZWxleS4KLSAqIE9uIG90aGVyIHBsYXRmb3JtcyB3aGVyZSB5b3Ugd2FudCB0byB1c2UgdGhlIERCIGxpYnJhcnkgeW91Ci0gKiB1c3VhbGx5IGhhdmUgdG8gaW5zdGFsbCBpdCBmaXJzdC4gU2VlIGh0dHA6Ly93d3cuc2xlZXB5Y2F0LmNvbS8KLSAqIGZvciB0aGUgZGlzdHJpYnV0aW9uLiBUaGUgaW50ZXJmYWNlIHRoaXMgbW9kdWxlIHVzZXMgaXMgdGhlCi0gKiBvbmUgZnJvbSBEQiB2ZXJzaW9uIDEuODUgYW5kIDEuODYsIGJ1dCBEQiB2ZXJzaW9uIDIueAotICogY2FuIGFsc28gYmUgdXNlZCB3aGVuIGNvbXBhdGliaWxpdHkgbW9kZSBpcyBlbmFibGVkLgotICoKLSAqIGRpcmt4IC0gQWRkZWQgQXV0aG9yaXRhdGl2ZSBjb250cm9sIHRvIGFsbG93IHBhc3Npbmcgb24gdG8gbG93ZXIgIAotICogICAgICAgICBtb2R1bGVzIGlmIGFuZCBvbmx5IGlmIHRoZSB1c2VyaWQgaXMgbm90IGtub3duIHRvIHRoaXMKLSAqICAgICAgICAgbW9kdWxlLiBBIGtub3duIHVzZXIgd2l0aCBhIGZhdWx0eSBvciBhYnNlbnQgcGFzc3dvcmQgc3RpbGwKLSAqICAgICAgICAgY2F1c2VzIGFuIEF1dGhSZXF1aXJlZC4gVGhlIGRlZmF1bHQgaXMgJ0F1dGhvcml0YXRpdmUnLCBpLmUuCi0gKiAgICAgICAgIG5vIGNvbnRyb2wgaXMgcGFzc2VkIGFsb25nLgotICovCi0KLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaWZkZWYgSEFWRV9EQl9ICi0jaW5jbHVkZSA8ZGIuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChEQl9WRVJTSU9OX01BSk9SKSAmJiAoREJfVkVSU0lPTl9NQUpPUiA9PSAyKQotI2RlZmluZSBEQjIKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBjaGFyICphdXRoX2RicHdmaWxlOwotICAgIGNoYXIgKmF1dGhfZGJncnBmaWxlOwotICAgIGludCBhdXRoX2RiYXV0aG9yaXRhdGl2ZTsKLX0gZGJfYXV0aF9jb25maWdfcmVjOwotCi1zdGF0aWMgdm9pZCAqY3JlYXRlX2RiX2F1dGhfZGlyX2NvbmZpZyhhcF9jb250ZXh0X3QgKnAsIGNoYXIgKmQpCi17Ci0gICAgZGJfYXV0aF9jb25maWdfcmVjICpzZWMKLSAgICA9IChkYl9hdXRoX2NvbmZpZ19yZWMgKikgYXBfcGNhbGxvYyhwLCBzaXplb2YoZGJfYXV0aF9jb25maWdfcmVjKSk7Ci0gICAgc2VjLT5hdXRoX2RicHdmaWxlID0gTlVMTDsKLSAgICBzZWMtPmF1dGhfZGJncnBmaWxlID0gTlVMTDsKLSAgICBzZWMtPmF1dGhfZGJhdXRob3JpdGF0aXZlID0gMTsJLyogZm9ydHJlc3MgaXMgc2VjdXJlIGJ5IGRlZmF1bHQgKi8KLSAgICByZXR1cm4gc2VjOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2RiX3Nsb3QoY21kX3Bhcm1zICpjbWQsIHZvaWQgKm9mZnNldCwgY2hhciAqZiwgY2hhciAqdCkKLXsKLSAgICBpZiAoIXQgfHwgc3RyY21wKHQsICJkYiIpKQotCXJldHVybiBERUNMSU5FX0NNRDsKLQotICAgIHJldHVybiBhcF9zZXRfZmlsZV9zbG90KGNtZCwgb2Zmc2V0LCBmKTsKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIGRiX2F1dGhfY21kc1tdID0KLXsKLSAgICB7IkF1dGhEQlVzZXJGaWxlIiwgYXBfc2V0X2ZpbGVfc2xvdCwKLSAgICAgKHZvaWQgKikgWHRPZmZzZXRPZihkYl9hdXRoX2NvbmZpZ19yZWMsIGF1dGhfZGJwd2ZpbGUpLAotICAgICBPUl9BVVRIQ0ZHLCBUQUtFMSwgTlVMTH0sCi0gICAgeyJBdXRoREJHcm91cEZpbGUiLCBhcF9zZXRfZmlsZV9zbG90LAotICAgICAodm9pZCAqKSBYdE9mZnNldE9mKGRiX2F1dGhfY29uZmlnX3JlYywgYXV0aF9kYmdycGZpbGUpLAotICAgICBPUl9BVVRIQ0ZHLCBUQUtFMSwgTlVMTH0sCi0gICAgeyJBdXRoVXNlckZpbGUiLCBzZXRfZGJfc2xvdCwKLSAgICAgKHZvaWQgKikgWHRPZmZzZXRPZihkYl9hdXRoX2NvbmZpZ19yZWMsIGF1dGhfZGJwd2ZpbGUpLAotICAgICBPUl9BVVRIQ0ZHLCBUQUtFMTIsIE5VTEx9LAotICAgIHsiQXV0aEdyb3VwRmlsZSIsIHNldF9kYl9zbG90LAotICAgICAodm9pZCAqKSBYdE9mZnNldE9mKGRiX2F1dGhfY29uZmlnX3JlYywgYXV0aF9kYmdycGZpbGUpLAotICAgICBPUl9BVVRIQ0ZHLCBUQUtFMTIsIE5VTEx9LAotICAgIHsiQXV0aERCQXV0aG9yaXRhdGl2ZSIsIGFwX3NldF9mbGFnX3Nsb3QsCi0gICAgICh2b2lkICopIFh0T2Zmc2V0T2YoZGJfYXV0aF9jb25maWdfcmVjLCBhdXRoX2RiYXV0aG9yaXRhdGl2ZSksCi0gICAgIE9SX0FVVEhDRkcsIEZMQUcsCi0gICAgICJTZXQgdG8gJ25vJyB0byBhbGxvdyBhY2Nlc3MgY29udHJvbCB0byBiZSBwYXNzZWQgYWxvbmcgdG8gbG93ZXIgbW9kdWxlcyBpZiB0aGUgdXNlcklEIGlzIG5vdCBrbm93biB0byB0aGlzIG1vZHVsZSJ9LAotICAgIHtOVUxMfQotfTsKLQotbW9kdWxlIGRiX2F1dGhfbW9kdWxlOwotCi1zdGF0aWMgY2hhciAqZ2V0X2RiX3B3KHJlcXVlc3RfcmVjICpyLCBjaGFyICp1c2VyLCBjb25zdCBjaGFyICphdXRoX2RicHdmaWxlKQotewotICAgIERCICpmOwotICAgIERCVCBkLCBxOwotICAgIGNoYXIgKnB3ID0gTlVMTDsKLQotICAgIG1lbXNldCgmZCwgMCwgc2l6ZW9mKGQpKTsKLSAgICBtZW1zZXQoJnEsIDAsIHNpemVvZihxKSk7Ci0KLSAgICBxLmRhdGEgPSB1c2VyOwotICAgIHEuc2l6ZSA9IHN0cmxlbihxLmRhdGEpOwotCi0jaWZkZWYgREIyCi0gICAgaWYgKGRiX29wZW4oYXV0aF9kYnB3ZmlsZSwgREJfSEFTSCwgREJfUkRPTkxZLCAwNjY0LCBOVUxMLCBOVUxMLCAmZikgIT0gMCkgewotI2Vsc2UKLSAgICBpZiAoIShmID0gZGJvcGVuKGF1dGhfZGJwd2ZpbGUsIE9fUkRPTkxZLCAwNjY0LCBEQl9IQVNILCBOVUxMKSkpIHsKLSNlbmRpZgotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgciwKLQkJICAgICJjb3VsZCBub3Qgb3BlbiBkYiBhdXRoIGZpbGU6ICVzIiwgYXV0aF9kYnB3ZmlsZSk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0jaWZkZWYgREIyCi0gICAgaWYgKCEoKGYtPmdldCkgKGYsIE5VTEwsICZxLCAmZCwgMCkpKSB7Ci0jZWxzZQotICAgIGlmICghKChmLT5nZXQpIChmLCAmcSwgJmQsIDApKSkgewotI2VuZGlmCi0JcHcgPSBhcF9wYWxsb2Moci0+cG9vbCwgZC5zaXplICsgMSk7Ci0Jc3RybmNweShwdywgZC5kYXRhLCBkLnNpemUpOwotCXB3W2Quc2l6ZV0gPSAnXDAnOwkvKiBUZXJtaW5hdGUgdGhlIHN0cmluZyAqLwotICAgIH0KLQotI2lmZGVmIERCMgotICAgIChmLT5jbG9zZSkgKGYsIDApOwotI2Vsc2UKLSAgICAoZi0+Y2xvc2UpIChmKTsKLSNlbmRpZgotICAgIHJldHVybiBwdzsKLX0KLQotLyogV2UgZG8gc29tZXRoaW5nIHN0cmFuZ2Ugd2l0aCB0aGUgZ3JvdXAgZmlsZS4gIElmIHRoZSBncm91cCBmaWxlCi0gKiBjb250YWlucyBhbnkgOiB3ZSBhc3N1bWUgdGhlIGZvcm1hdCBpcwotICogICAgICBrZXk9dXNlcm5hbWUgdmFsdWU9IjoiZ3JvdXBuYW1lIFsiOiJhbnl0aGluZyBoZXJlIGlzIGlnbm9yZWRdCi0gKiBvdGhlcndpc2Ugd2Ugbm93ICgwLjguMTQrKSBhc3N1bWUgdGhhdCB0aGUgZm9ybWF0IGlzCi0gKiAgICAgIGtleT11c2VybmFtZSB2YWx1ZT1ncm91cG5hbWUKLSAqIFRoZSBmaXJzdCBhbGxvd3MgdGhlIHBhc3N3b3JkIGFuZCBncm91cCBmaWxlcyB0byBiZSB0aGUgc2FtZSAKLSAqIHBoeXNpY2FsIERCIGZpbGU7ICAga2V5PXVzZXJuYW1lIHZhbHVlPXBhc3N3b3JkIjoiZ3JvdXBuYW1lWyI6ImFueXRoaW5nXQotICoKLSAqIG1hcmtAdGVsZXNjb3BlLm9yZywgMjJTZXA5NQotICovCi0KLXN0YXRpYyBjaGFyICpnZXRfZGJfZ3JwKHJlcXVlc3RfcmVjICpyLCBjaGFyICp1c2VyLCBjb25zdCBjaGFyICphdXRoX2RiZ3JwZmlsZSkKLXsKLSAgICBjaGFyICpncnBfZGF0YSA9IGdldF9kYl9wdyhyLCB1c2VyLCBhdXRoX2RiZ3JwZmlsZSk7Ci0gICAgY2hhciAqZ3JwX2NvbG9uOwotICAgIGNoYXIgKmdycF9jb2xvbjI7Ci0KLSAgICBpZiAoZ3JwX2RhdGEgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLQotICAgIGlmICgoZ3JwX2NvbG9uID0gc3RyY2hyKGdycF9kYXRhLCAnOicpKSAhPSBOVUxMKSB7Ci0JZ3JwX2NvbG9uMiA9IHN0cmNocigrK2dycF9jb2xvbiwgJzonKTsKLQlpZiAoZ3JwX2NvbG9uMikKLQkgICAgKmdycF9jb2xvbjIgPSAnXDAnOwotCXJldHVybiBncnBfY29sb247Ci0gICAgfQotICAgIHJldHVybiBncnBfZGF0YTsKLX0KLQotc3RhdGljIGludCBkYl9hdXRoZW50aWNhdGVfYmFzaWNfdXNlcihyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBkYl9hdXRoX2NvbmZpZ19yZWMgKnNlYyA9Ci0gICAgKGRiX2F1dGhfY29uZmlnX3JlYyAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywKLQkJCQkJICAgICAmZGJfYXV0aF9tb2R1bGUpOwotICAgIGNvbnN0IGNoYXIgKnNlbnRfcHc7Ci0gICAgY2hhciAqcmVhbF9wdywgKmNvbG9uX3B3OwotICAgIGNoYXIgKmludmFsaWRfcHc7Ci0gICAgaW50IHJlczsKLQotICAgIGlmICgocmVzID0gYXBfZ2V0X2Jhc2ljX2F1dGhfcHcociwgJnNlbnRfcHcpKSkKLQlyZXR1cm4gcmVzOwotCi0gICAgaWYgKCFzZWMtPmF1dGhfZGJwd2ZpbGUpCi0JcmV0dXJuIERFQ0xJTkVEOwotCi0gICAgaWYgKCEocmVhbF9wdyA9IGdldF9kYl9wdyhyLCByLT51c2VyLCBzZWMtPmF1dGhfZGJwd2ZpbGUpKSkgewotCWlmICghKHNlYy0+YXV0aF9kYmF1dGhvcml0YXRpdmUpKQotCSAgICByZXR1cm4gREVDTElORUQ7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLQkJICAgICJEQiB1c2VyICVzIG5vdCBmb3VuZDogJXMiLCByLT51c2VyLCByLT5maWxlbmFtZSk7Ci0JYXBfbm90ZV9iYXNpY19hdXRoX2ZhaWx1cmUocik7Ci0JcmV0dXJuIEFVVEhfUkVRVUlSRUQ7Ci0gICAgfQotICAgIC8qIFBhc3N3b3JkIGlzIHVwIHRvIGZpcnN0IDogaWYgZXhpc3RzICovCi0gICAgY29sb25fcHcgPSBzdHJjaHIocmVhbF9wdywgJzonKTsKLSAgICBpZiAoY29sb25fcHcpIHsKLQkqY29sb25fcHcgPSAnXDAnOwotICAgIH0KLSAgICBpbnZhbGlkX3B3ID0gYXBfdmFsaWRhdGVfcGFzc3dvcmQoc2VudF9wdywgcmVhbF9wdyk7Ci0gICAgaWYgKGludmFsaWRfcHcgIT0gTlVMTCkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0JCSAgICAgICJEQiB1c2VyICVzOiBhdXRoZW50aWNhdGlvbiBmYWlsdXJlIGZvciBcIiVzXCI6ICVzIiwKLQkJICAgICAgci0+dXNlciwgci0+dXJpLCBpbnZhbGlkX3B3KTsKLQlhcF9ub3RlX2Jhc2ljX2F1dGhfZmFpbHVyZShyKTsKLQlyZXR1cm4gQVVUSF9SRVFVSVJFRDsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vKiBDaGVja2luZyBJRCAqLwotCi1zdGF0aWMgaW50IGRiX2NoZWNrX2F1dGgocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgZGJfYXV0aF9jb25maWdfcmVjICpzZWMgPQotICAgIChkYl9hdXRoX2NvbmZpZ19yZWMgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCSAgICAgJmRiX2F1dGhfbW9kdWxlKTsKLSAgICBjaGFyICp1c2VyID0gci0+dXNlcjsKLSAgICBpbnQgbSA9IHItPm1ldGhvZF9udW1iZXI7Ci0KLSAgICBjb25zdCBhcF9hcnJheV9oZWFkZXJfdCAqcmVxc19hcnIgPSBhcF9yZXF1aXJlcyhyKTsKLSAgICByZXF1aXJlX2xpbmUgKnJlcXMgPSByZXFzX2FyciA/IChyZXF1aXJlX2xpbmUgKikgcmVxc19hcnItPmVsdHMgOiBOVUxMOwotCi0gICAgcmVnaXN0ZXIgaW50IHg7Ci0gICAgY29uc3QgY2hhciAqdDsKLSAgICBjaGFyICp3OwotCi0gICAgaWYgKCFzZWMtPmF1dGhfZGJncnBmaWxlKQotCXJldHVybiBERUNMSU5FRDsKLSAgICBpZiAoIXJlcXNfYXJyKQotCXJldHVybiBERUNMSU5FRDsKLQotICAgIGZvciAoeCA9IDA7IHggPCByZXFzX2Fyci0+bmVsdHM7IHgrKykgewotCi0JaWYgKCEocmVxc1t4XS5tZXRob2RfbWFzayAmICgxIDw8IG0pKSkKLQkgICAgY29udGludWU7Ci0KLQl0ID0gcmVxc1t4XS5yZXF1aXJlbWVudDsKLQl3ID0gYXBfZ2V0d29yZF93aGl0ZShyLT5wb29sLCAmdCk7Ci0KLQlpZiAoIXN0cmNtcCh3LCAiZ3JvdXAiKSAmJiBzZWMtPmF1dGhfZGJncnBmaWxlKSB7Ci0JICAgIGNvbnN0IGNoYXIgKm9yaWdfZ3JvdXBzLCAqZ3JvdXBzOwotCSAgICBjaGFyICp2OwotCi0JICAgIGlmICghKGdyb3VwcyA9IGdldF9kYl9ncnAociwgdXNlciwgc2VjLT5hdXRoX2RiZ3JwZmlsZSkpKSB7Ci0JCWlmICghKHNlYy0+YXV0aF9kYmF1dGhvcml0YXRpdmUpKQotCQkgICAgcmV0dXJuIERFQ0xJTkVEOwotCQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotCQkJICAgICJ1c2VyICVzIG5vdCBpbiBEQiBncm91cCBmaWxlICVzOiAlcyIsCi0JCQkgICAgdXNlciwgc2VjLT5hdXRoX2RiZ3JwZmlsZSwgci0+ZmlsZW5hbWUpOwotCQlhcF9ub3RlX2Jhc2ljX2F1dGhfZmFpbHVyZShyKTsKLQkJcmV0dXJuIEFVVEhfUkVRVUlSRUQ7Ci0JICAgIH0KLQkgICAgb3JpZ19ncm91cHMgPSBncm91cHM7Ci0JICAgIHdoaWxlICh0WzBdKSB7Ci0JCXcgPSBhcF9nZXR3b3JkX3doaXRlKHItPnBvb2wsICZ0KTsKLQkJZ3JvdXBzID0gb3JpZ19ncm91cHM7Ci0JCXdoaWxlIChncm91cHNbMF0pIHsKLQkJICAgIHYgPSBhcF9nZXR3b3JkKHItPnBvb2wsICZncm91cHMsICcsJyk7Ci0JCSAgICBpZiAoIXN0cmNtcCh2LCB3KSkKLQkJCXJldHVybiBPSzsKLQkJfQotCSAgICB9Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0JCQkidXNlciAlcyBub3QgaW4gcmlnaHQgZ3JvdXA6ICVzIiwgdXNlciwgci0+ZmlsZW5hbWUpOwotCSAgICBhcF9ub3RlX2Jhc2ljX2F1dGhfZmFpbHVyZShyKTsKLQkgICAgcmV0dXJuIEFVVEhfUkVRVUlSRUQ7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotCi1tb2R1bGUgZGJfYXV0aF9tb2R1bGUgPQotewotICAgIFNUQU5EQVJEX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLAkJCS8qIGluaXRpYWxpemVyICovCi0gICAgY3JlYXRlX2RiX2F1dGhfZGlyX2NvbmZpZywJLyogZGlyIGNvbmZpZyBjcmVhdGVyICovCi0gICAgTlVMTCwJCQkvKiBkaXIgbWVyZ2VyIC0tLSBkZWZhdWx0IGlzIHRvIG92ZXJyaWRlICovCi0gICAgTlVMTCwJCQkvKiBzZXJ2ZXIgY29uZmlnICovCi0gICAgTlVMTCwJCQkvKiBtZXJnZSBzZXJ2ZXIgY29uZmlnICovCi0gICAgZGJfYXV0aF9jbWRzLAkJLyogY29tbWFuZCBhcF90YWJsZV90ICovCi0gICAgTlVMTCwJCQkvKiBoYW5kbGVycyAqLwotICAgIE5VTEwsCQkJLyogZmlsZW5hbWUgdHJhbnNsYXRpb24gKi8KLSAgICBkYl9hdXRoZW50aWNhdGVfYmFzaWNfdXNlciwJLyogY2hlY2tfdXNlcl9pZCAqLwotICAgIGRiX2NoZWNrX2F1dGgsCQkvKiBjaGVjayBhdXRoICovCi0gICAgTlVMTCwJCQkvKiBjaGVjayBhY2Nlc3MgKi8KLSAgICBOVUxMLAkJCS8qIHR5cGVfY2hlY2tlciAqLwotICAgIE5VTEwsCQkJLyogZml4dXBzICovCi0gICAgTlVMTCwJCQkvKiBsb2dnZXIgKi8KLSAgICBOVUxMLAkJCS8qIGhlYWRlciBwYXJzZXIgKi8KLSAgICBOVUxMLAkJCS8qIGNoaWxkX2luaXQgKi8KLSAgICBOVUxMLAkJCS8qIGNoaWxkX2V4aXQgKi8KLSAgICBOVUxMCQkJLyogcG9zdCByZWFkLXJlcXVlc3QgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL2FhYS9tb2RfYXV0aF9kYi5tb2R1bGUgYi9tb2R1bGVzL2FhYS9tb2RfYXV0aF9kYi5tb2R1bGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MDhlMjkuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9hYWEvbW9kX2F1dGhfZGIubW9kdWxlCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotTmFtZTogZGJfYXV0aF9tb2R1bGUKLUNvbmZpZ1N0YXJ0Ci0gICAgREJfVkVSU0lPTj0nJwotICAgIERCX0xJQj0nJwotICAgIGlmIC4vaGVscGVycy9UZXN0Q29tcGlsZSBmdW5jIGRiX29wZW47IHRoZW4KLSAgICAgICAgREJfVkVSU0lPTj0nQmVya2VsZXktREIvMi54JwotICAgIGVsc2UKLSAgICAgICAgaWYgLi9oZWxwZXJzL1Rlc3RDb21waWxlIGxpYiBkYiBkYl9vcGVuOyB0aGVuCi0gICAgICAgICAgICBEQl9WRVJTSU9OPSdCZXJrZWxleS1EQi8yLngnCi0gICAgICAgICAgICBEQl9MSUI9Jy1sZGInCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGlmIC4vaGVscGVycy9UZXN0Q29tcGlsZSBmdW5jIGRib3BlbjsgdGhlbgotICAgICAgICAgICAgICAgIERCX1ZFUlNJT049J0JlcmtlbGV5LURCLzEueCcKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBpZiAuL2hlbHBlcnMvVGVzdENvbXBpbGUgbGliIGRiIGRib3BlbjsgdGhlbgotICAgICAgICAgICAgICAgICAgICBEQl9WRVJTSU9OPSdCZXJrZWxleS1EQi8xLngnCi0gICAgICAgICAgICAgICAgICAgIERCX0xJQj0nLWxkYicKLSAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgZmkgCi0gICAgICAgIGZpCi0gICAgZmkKLSAgICBpZiBbICIuJERCX1ZFUlNJT04iICE9IC4gXTsgdGhlbgotICAgICAgICBpZiBbICIuJERCX0xJQiIgIT0gLiBdOyB0aGVuCi0gICAgICAgICAgICBMSUJTPSIkTElCUyAkREJfTElCIgotICAgICAgICAgICAgZWNobyAiICAgICAgdXNpbmcgJERCX1ZFUlNJT04gZm9yIG1vZF9hdXRoX2RiICgkREJfTElCKSIKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZWNobyAiICAgICAgdXNpbmcgJERCX1ZFUlNJT04gZm9yIG1vZF9hdXRoX2RiICgtbGMpIgotICAgICAgICBmaQotICAgIGVsc2UKLSAgICAgICAgZWNobyAiRXJyb3I6IE5laXRoZXIgQmVya2VsZXktREIvMS54IG5vciBCZXJrZWxleS1EQi8yLnggbGlicmFyeSBmb3VuZC4iCi0gICAgICAgIGVjaG8gIiAgICAgICBFaXRoZXIgZGlzYWJsZSBtb2RfYXV0aF9kYiBvciBwcm92aWRlIHVzIHdpdGggdGhlIHBhdGhzIgotICAgICAgICBlY2hvICIgICAgICAgdG8gdGhlIEJlcmtlbGV5LURCIGluY2x1ZGUgYW5kIGxpYnJhcnkgZmlsZXMuIgotICAgICAgICBlY2hvICIgICAgICAgKEhpbnQ6IElOQ0xVREVTLCBMREZMQUdTLCBMSUJTKSIKLSAgICAgICAgZXhpdCAxCi0gICAgZmkKLUNvbmZpZ0VuZApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hYWEvbW9kX2F1dGhfZGJtLmMgYi9tb2R1bGVzL2FhYS9tb2RfYXV0aF9kYm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMyNGQ2MC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2FhYS9tb2RfYXV0aF9kYm0uYworKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBodHRwX2F1dGg6IGF1dGhlbnRpY2F0aW9uCi0gKiAKLSAqIFJvYiBNY0Nvb2wgJiBCcmlhbiBCZWhsZW5kb3JmLgotICogCi0gKiBBZGFwdGVkIHRvIEFwYWNoZSBieSByc3QuCi0gKgotICogZGlya3ggLSBBZGRlZCBBdXRob3JpdGF0aXZlIGNvbnRyb2wgdG8gYWxsb3cgcGFzc2luZyBvbiB0byBsb3dlciAgCi0gKiAgICAgICAgIG1vZHVsZXMgaWYgYW5kIG9ubHkgaWYgdGhlIHVzZXJpZCBpcyBub3Qga25vd24gdG8gdGhpcwotICogICAgICAgICBtb2R1bGUuIEEga25vd24gdXNlciB3aXRoIGEgZmF1bHR5IG9yIGFic2VudCBwYXNzd29yZCBzdGlsbAotICogICAgICAgICBjYXVzZXMgYW4gQXV0aFJlcXVpcmVkLiBUaGUgZGVmYXVsdCBpcyAnQXV0aG9yaXRhdGl2ZScsIGkuZS4KLSAqICAgICAgICAgbm8gY29udHJvbCBpcyBwYXNzZWQgYWxvbmcuCi0gKi8KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLSNpZiBkZWZpbmVkKF9fR0xJQkNfXykgJiYgZGVmaW5lZChfX0dMSUJDX01JTk9SX18pIFwKLSAgICAmJiBfX0dMSUJDX18gPj0gMiAmJiBfX0dMSUJDX01JTk9SX18gPj0gMQotI2luY2x1ZGUgPGRiMS9uZGJtLmg+Ci0jZWxzZQotI2luY2x1ZGUgPG5kYm0uaD4KLSNlbmRpZgotCi0vKgotICogTW9kdWxlIGRlZmluaXRpb24gaW5mb3JtYXRpb24gLSB0aGUgcGFydCBiZXR3ZWVuIHRoZSAtU1RBUlQgYW5kIC1FTkQKLSAqIGxpbmVzIGJlbG93IGlzIHVzZWQgYnkgQ29uZmlndXJlLiBUaGlzIGNvdWxkIGJlIHN0b3JlZCBpbiBhIHNlcGFyYXRlCi0gKiBpbnN0ZWFkLgotICoKLSAqIE1PRFVMRS1ERUZJTklUSU9OLVNUQVJUCi0gKiBOYW1lOiBkYm1fYXV0aF9tb2R1bGUKLSAqIENvbmZpZ1N0YXJ0Ci0gICAgLiAuL2hlbHBlcnMvZmluZC1kYm0tbGliCi0gKiBDb25maWdFbmQKLSAqIE1PRFVMRS1ERUZJTklUSU9OLUVORAotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQotICAgIGNoYXIgKmF1dGhfZGJtcHdmaWxlOwotICAgIGNoYXIgKmF1dGhfZGJtZ3JwZmlsZTsKLSAgICBpbnQgYXV0aF9kYm1hdXRob3JpdGF0aXZlOwotCi19IGRibV9hdXRoX2NvbmZpZ19yZWM7Ci0KLXN0YXRpYyB2b2lkICpjcmVhdGVfZGJtX2F1dGhfZGlyX2NvbmZpZyhhcF9jb250ZXh0X3QgKnAsIGNoYXIgKmQpCi17Ci0gICAgZGJtX2F1dGhfY29uZmlnX3JlYyAqc2VjCi0gICAgPSAoZGJtX2F1dGhfY29uZmlnX3JlYyAqKSBhcF9wY2FsbG9jKHAsIHNpemVvZihkYm1fYXV0aF9jb25maWdfcmVjKSk7Ci0KLSAgICBzZWMtPmF1dGhfZGJtcHdmaWxlID0gTlVMTDsKLSAgICBzZWMtPmF1dGhfZGJtZ3JwZmlsZSA9IE5VTEw7Ci0gICAgc2VjLT5hdXRoX2RibWF1dGhvcml0YXRpdmUgPSAxOwkvKiBmb3J0cmVzcyBpcyBzZWN1cmUgYnkgZGVmYXVsdCAqLwotCi0gICAgcmV0dXJuIHNlYzsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9kYm1fc2xvdChjbWRfcGFybXMgKmNtZCwgdm9pZCAqb2Zmc2V0LCBjaGFyICpmLCBjaGFyICp0KQotewotICAgIGlmICghdCB8fCBzdHJjbXAodCwgImRibSIpKQotCXJldHVybiBERUNMSU5FX0NNRDsKLQotICAgIHJldHVybiBhcF9zZXRfZmlsZV9zbG90KGNtZCwgb2Zmc2V0LCBmKTsKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIGRibV9hdXRoX2NtZHNbXSA9Ci17Ci0gICAgeyJBdXRoREJNVXNlckZpbGUiLCBhcF9zZXRfZmlsZV9zbG90LAotICAgICAodm9pZCAqKSBYdE9mZnNldE9mKGRibV9hdXRoX2NvbmZpZ19yZWMsIGF1dGhfZGJtcHdmaWxlKSwKLSAgICAgT1JfQVVUSENGRywgVEFLRTEsIE5VTEx9LAotICAgIHsiQXV0aERCTUdyb3VwRmlsZSIsIGFwX3NldF9maWxlX3Nsb3QsCi0gICAgICh2b2lkICopIFh0T2Zmc2V0T2YoZGJtX2F1dGhfY29uZmlnX3JlYywgYXV0aF9kYm1ncnBmaWxlKSwKLSAgICAgT1JfQVVUSENGRywgVEFLRTEsIE5VTEx9LAotICAgIHsiQXV0aFVzZXJGaWxlIiwgc2V0X2RibV9zbG90LAotICAgICAodm9pZCAqKSBYdE9mZnNldE9mKGRibV9hdXRoX2NvbmZpZ19yZWMsIGF1dGhfZGJtcHdmaWxlKSwKLSAgICAgT1JfQVVUSENGRywgVEFLRTEyLCBOVUxMfSwKLSAgICB7IkF1dGhHcm91cEZpbGUiLCBzZXRfZGJtX3Nsb3QsCi0gICAgICh2b2lkICopIFh0T2Zmc2V0T2YoZGJtX2F1dGhfY29uZmlnX3JlYywgYXV0aF9kYm1ncnBmaWxlKSwKLSAgICAgT1JfQVVUSENGRywgVEFLRTEyLCBOVUxMfSwKLSAgICB7IkF1dGhEQk1BdXRob3JpdGF0aXZlIiwgYXBfc2V0X2ZsYWdfc2xvdCwKLSAgICAgKHZvaWQgKikgWHRPZmZzZXRPZihkYm1fYXV0aF9jb25maWdfcmVjLCBhdXRoX2RibWF1dGhvcml0YXRpdmUpLAotICAgICBPUl9BVVRIQ0ZHLCBGTEFHLCAiU2V0IHRvICdubycgdG8gYWxsb3cgYWNjZXNzIGNvbnRyb2wgdG8gYmUgcGFzc2VkIGFsb25nIHRvIGxvd2VyIG1vZHVsZXMsIGlmIHRoZSBVc2VySUQgaXMgbm90IGtub3duIGluIHRoaXMgbW9kdWxlIn0sCi0gICAge05VTEx9Ci19OwotCi1tb2R1bGUgZGJtX2F1dGhfbW9kdWxlOwotCi1zdGF0aWMgY2hhciAqZ2V0X2RibV9wdyhyZXF1ZXN0X3JlYyAqciwgY2hhciAqdXNlciwgY2hhciAqYXV0aF9kYm1wd2ZpbGUpCi17Ci0gICAgREJNICpmOwotICAgIGRhdHVtIGQsIHE7Ci0gICAgY2hhciAqcHcgPSBOVUxMOwotCi0gICAgcS5kcHRyID0gdXNlcjsKLSNpZm5kZWYgTkVUU0NBUEVfREJNX0NPTVBBVAotICAgIHEuZHNpemUgPSBzdHJsZW4ocS5kcHRyKTsKLSNlbHNlCi0gICAgcS5kc2l6ZSA9IHN0cmxlbihxLmRwdHIpICsgMTsKLSNlbmRpZgotCi0KLSAgICBpZiAoIShmID0gZGJtX29wZW4oYXV0aF9kYm1wd2ZpbGUsIE9fUkRPTkxZLCAwNjY0KSkpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHIsCi0JCSAgICAiY291bGQgbm90IG9wZW4gZGJtIGF1dGggZmlsZTogJXMiLCBhdXRoX2RibXB3ZmlsZSk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgZCA9IGRibV9mZXRjaChmLCBxKTsKLQotICAgIGlmIChkLmRwdHIpIHsKLQlwdyA9IGFwX3BhbGxvYyhyLT5wb29sLCBkLmRzaXplICsgMSk7Ci0Jc3RybmNweShwdywgZC5kcHRyLCBkLmRzaXplKTsKLQlwd1tkLmRzaXplXSA9ICdcMCc7CS8qIFRlcm1pbmF0ZSB0aGUgc3RyaW5nICovCi0gICAgfQotCi0gICAgZGJtX2Nsb3NlKGYpOwotICAgIHJldHVybiBwdzsKLX0KLQotLyogV2UgZG8gc29tZXRoaW5nIHN0cmFuZ2Ugd2l0aCB0aGUgZ3JvdXAgZmlsZS4gIElmIHRoZSBncm91cCBmaWxlCi0gKiBjb250YWlucyBhbnkgOiB3ZSBhc3N1bWUgdGhlIGZvcm1hdCBpcwotICogICAgICBrZXk9dXNlcm5hbWUgdmFsdWU9IjoiZ3JvdXBuYW1lIFsiOiJhbnl0aGluZyBoZXJlIGlzIGlnbm9yZWRdCi0gKiBvdGhlcndpc2Ugd2Ugbm93ICgwLjguMTQrKSBhc3N1bWUgdGhhdCB0aGUgZm9ybWF0IGlzCi0gKiAgICAgIGtleT11c2VybmFtZSB2YWx1ZT1ncm91cG5hbWUKLSAqIFRoZSBmaXJzdCBhbGxvd3MgdGhlIHBhc3N3b3JkIGFuZCBncm91cCBmaWxlcyB0byBiZSB0aGUgc2FtZSAKLSAqIHBoeXNpY2FsIERCTSBmaWxlOyAgIGtleT11c2VybmFtZSB2YWx1ZT1wYXNzd29yZCI6Imdyb3VwbmFtZVsiOiJhbnl0aGluZ10KLSAqCi0gKiBtYXJrQHRlbGVzY29wZS5vcmcsIDIyU2VwOTUKLSAqLwotCi1zdGF0aWMgY2hhciAqZ2V0X2RibV9ncnAocmVxdWVzdF9yZWMgKnIsIGNoYXIgKnVzZXIsIGNoYXIgKmF1dGhfZGJtZ3JwZmlsZSkKLXsKLSAgICBjaGFyICpncnBfZGF0YSA9IGdldF9kYm1fcHcociwgdXNlciwgYXV0aF9kYm1ncnBmaWxlKTsKLSAgICBjaGFyICpncnBfY29sb247Ci0gICAgY2hhciAqZ3JwX2NvbG9uMjsKLQotICAgIGlmIChncnBfZGF0YSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotCi0gICAgaWYgKChncnBfY29sb24gPSBzdHJjaHIoZ3JwX2RhdGEsICc6JykpICE9IE5VTEwpIHsKLQlncnBfY29sb24yID0gc3RyY2hyKCsrZ3JwX2NvbG9uLCAnOicpOwotCWlmIChncnBfY29sb24yKQotCSAgICAqZ3JwX2NvbG9uMiA9ICdcMCc7Ci0JcmV0dXJuIGdycF9jb2xvbjsKLSAgICB9Ci0gICAgcmV0dXJuIGdycF9kYXRhOwotfQotCi1zdGF0aWMgaW50IGRibV9hdXRoZW50aWNhdGVfYmFzaWNfdXNlcihyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBkYm1fYXV0aF9jb25maWdfcmVjICpzZWMgPQotICAgIChkYm1fYXV0aF9jb25maWdfcmVjICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLAotCQkJCQkgICAgICAmZGJtX2F1dGhfbW9kdWxlKTsKLSAgICBjb25zdCBjaGFyICpzZW50X3B3OwotICAgIGNoYXIgKnJlYWxfcHcsICpjb2xvbl9wdzsKLSAgICBhcF9zdGF0dXNfdCBpbnZhbGlkX3B3OwotICAgIGludCByZXM7Ci0KLSAgICBpZiAoKHJlcyA9IGFwX2dldF9iYXNpY19hdXRoX3B3KHIsICZzZW50X3B3KSkpCi0JcmV0dXJuIHJlczsKLQotICAgIGlmICghc2VjLT5hdXRoX2RibXB3ZmlsZSkKLQlyZXR1cm4gREVDTElORUQ7Ci0KLSAgICBpZiAoIShyZWFsX3B3ID0gZ2V0X2RibV9wdyhyLCByLT51c2VyLCBzZWMtPmF1dGhfZGJtcHdmaWxlKSkpIHsKLQlpZiAoIShzZWMtPmF1dGhfZGJtYXV0aG9yaXRhdGl2ZSkpCi0JICAgIHJldHVybiBERUNMSU5FRDsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotCQkgICAgIkRCTSB1c2VyICVzIG5vdCBmb3VuZDogJXMiLCByLT51c2VyLCByLT5maWxlbmFtZSk7Ci0JYXBfbm90ZV9iYXNpY19hdXRoX2ZhaWx1cmUocik7Ci0JcmV0dXJuIEFVVEhfUkVRVUlSRUQ7Ci0gICAgfQotICAgIC8qIFBhc3N3b3JkIGlzIHVwIHRvIGZpcnN0IDogaWYgZXhpc3RzICovCi0gICAgY29sb25fcHcgPSBzdHJjaHIocmVhbF9wdywgJzonKTsKLSAgICBpZiAoY29sb25fcHcpIHsKLQkqY29sb25fcHcgPSAnXDAnOwotICAgIH0KLSAgICBpbnZhbGlkX3B3ID0gYXBfdmFsaWRhdGVfcGFzc3dvcmQoc2VudF9wdywgcmVhbF9wdyk7Ci0gICAgaWYgKGludmFsaWRfcHcgIT0gQVBSX1NVQ0NFU1MpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotCQkgICAgICAiREJNIHVzZXIgJXM6IGF1dGhlbnRpY2F0aW9uIGZhaWx1cmUgZm9yIFwiJXNcIjogJXMiLAotCQkgICAgICByLT51c2VyLCByLT51cmksIGludmFsaWRfcHcpOwotCWFwX25vdGVfYmFzaWNfYXV0aF9mYWlsdXJlKHIpOwotCXJldHVybiBBVVRIX1JFUVVJUkVEOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8qIENoZWNraW5nIElEICovCi0KLXN0YXRpYyBpbnQgZGJtX2NoZWNrX2F1dGgocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgZGJtX2F1dGhfY29uZmlnX3JlYyAqc2VjID0KLSAgICAoZGJtX2F1dGhfY29uZmlnX3JlYyAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywKLQkJCQkJICAgICAgJmRibV9hdXRoX21vZHVsZSk7Ci0gICAgY2hhciAqdXNlciA9IHItPnVzZXI7Ci0gICAgaW50IG0gPSByLT5tZXRob2RfbnVtYmVyOwotCi0gICAgY29uc3QgYXBfYXJyYXlfaGVhZGVyX3QgKnJlcXNfYXJyID0gYXBfcmVxdWlyZXMocik7Ci0gICAgcmVxdWlyZV9saW5lICpyZXFzID0gcmVxc19hcnIgPyAocmVxdWlyZV9saW5lICopIHJlcXNfYXJyLT5lbHRzIDogTlVMTDsKLQotICAgIHJlZ2lzdGVyIGludCB4OwotICAgIGNvbnN0IGNoYXIgKnQ7Ci0gICAgY2hhciAqdzsKLQotICAgIGlmICghc2VjLT5hdXRoX2RibWdycGZpbGUpCi0JcmV0dXJuIERFQ0xJTkVEOwotICAgIGlmICghcmVxc19hcnIpCi0JcmV0dXJuIERFQ0xJTkVEOwotCi0gICAgZm9yICh4ID0gMDsgeCA8IHJlcXNfYXJyLT5uZWx0czsgeCsrKSB7Ci0KLQlpZiAoIShyZXFzW3hdLm1ldGhvZF9tYXNrICYgKDEgPDwgbSkpKQotCSAgICBjb250aW51ZTsKLQotCXQgPSByZXFzW3hdLnJlcXVpcmVtZW50OwotCXcgPSBhcF9nZXR3b3JkX3doaXRlKHItPnBvb2wsICZ0KTsKLQotCWlmICghc3RyY21wKHcsICJncm91cCIpICYmIHNlYy0+YXV0aF9kYm1ncnBmaWxlKSB7Ci0JICAgIGNvbnN0IGNoYXIgKm9yaWdfZ3JvdXBzLCAqZ3JvdXBzOwotCSAgICBjaGFyICp2OwotCi0JICAgIGlmICghKGdyb3VwcyA9IGdldF9kYm1fZ3JwKHIsIHVzZXIsIHNlYy0+YXV0aF9kYm1ncnBmaWxlKSkpIHsKLQkJaWYgKCEoc2VjLT5hdXRoX2RibWF1dGhvcml0YXRpdmUpKQotCQkgICAgcmV0dXJuIERFQ0xJTkVEOwotCQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotCQkJICAgICJ1c2VyICVzIG5vdCBpbiBEQk0gZ3JvdXAgZmlsZSAlczogJXMiLAotCQkJICAgIHVzZXIsIHNlYy0+YXV0aF9kYm1ncnBmaWxlLCByLT5maWxlbmFtZSk7Ci0JCWFwX25vdGVfYmFzaWNfYXV0aF9mYWlsdXJlKHIpOwotCQlyZXR1cm4gQVVUSF9SRVFVSVJFRDsKLQkgICAgfQotCSAgICBvcmlnX2dyb3VwcyA9IGdyb3VwczsKLQkgICAgd2hpbGUgKHRbMF0pIHsKLQkJdyA9IGFwX2dldHdvcmRfd2hpdGUoci0+cG9vbCwgJnQpOwotCQlncm91cHMgPSBvcmlnX2dyb3VwczsKLQkJd2hpbGUgKGdyb3Vwc1swXSkgewotCQkgICAgdiA9IGFwX2dldHdvcmQoci0+cG9vbCwgJmdyb3VwcywgJywnKTsKLQkJICAgIGlmICghc3RyY21wKHYsIHcpKQotCQkJcmV0dXJuIE9LOwotCQl9Ci0JICAgIH0KLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLQkJCSJ1c2VyICVzIG5vdCBpbiByaWdodCBncm91cDogJXMiLAotCQkJdXNlciwgci0+ZmlsZW5hbWUpOwotCSAgICBhcF9ub3RlX2Jhc2ljX2F1dGhfZmFpbHVyZShyKTsKLQkgICAgcmV0dXJuIEFVVEhfUkVRVUlSRUQ7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotc3RhdGljIHZvaWQgcmVnaXN0ZXJfaG9va3Modm9pZCkKLXsKLSAgICBhcF9ob29rX2NoZWNrX3VzZXJfaWQoZGJtX2F1dGhlbnRpY2F0ZV9iYXNpY191c2VyLCBOVUxMLCBOVUxMLCBIT09LX01JRERMRSk7Ci0gICAgYXBfaG9va19hdXRoX2NoZWNrZXIoZGJtX2NoZWNrX2F1dGgsIE5VTEwsIE5VTEwsIEhPT0tfTUlERExFKTsKLX0KLQotbW9kdWxlIGRibV9hdXRoX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCi0gICAgY3JlYXRlX2RibV9hdXRoX2Rpcl9jb25maWcsCS8qIGRpciBjb25maWcgY3JlYXRlciAqLwotICAgIE5VTEwsCQkJLyogZGlyIG1lcmdlciAtLS0gZGVmYXVsdCBpcyB0byBvdmVycmlkZSAqLwotICAgIE5VTEwsCQkJLyogc2VydmVyIGNvbmZpZyAqLwotICAgIE5VTEwsCQkJLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLwotICAgIGRibV9hdXRoX2NtZHMsCQkvKiBjb21tYW5kIGFwX3RhYmxlX3QgKi8KLSAgICBOVUxMLAkJCS8qIGhhbmRsZXJzICovCi0gICAgcmVnaXN0ZXJfaG9va3MgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIGhvb2tzICovCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hYWEvbW9kX2F1dGhfZGJtLmV4cCBiL21vZHVsZXMvYWFhL21vZF9hdXRoX2RibS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjOGE0MzguLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9hYWEvbW9kX2F1dGhfZGJtLmV4cAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWRibV9hdXRoX21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9hYWEvbW9kX2F1dGhfZGlnZXN0LmMgYi9tb2R1bGVzL2FhYS9tb2RfYXV0aF9kaWdlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY3YTU4Yy4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2FhYS9tb2RfYXV0aF9kaWdlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDE5NzAgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogbW9kX2F1dGhfZGlnZXN0OiBNRDUgZGlnZXN0IGF1dGhlbnRpY2F0aW9uCi0gKgotICogT3JpZ2luYWxseSBieSBBbGV4ZWkgS29zdXQgPGFrb3N1dEBudWV2YS5wdnQuazEyLmNhLnVzPgotICogVXBkYXRlZCB0byBSRkMtMjYxNyBieSBSb25hbGQgVHNjaGFs5HIgPHJvbmFsZEBpbm5vdmF0aW9uLmNoPgotICogYmFzZWQgb24gbW9kX2F1dGgsIGJ5IFJvYiBNY0Nvb2wgYW5kIFJvYmVydCBTLiBUaGF1Ci0gKgotICogVGhpcyBtb2R1bGUgYW4gdXBkYXRlZCB2ZXJzaW9uIG9mIG1vZHVsZXMvc3RhbmRhcmQvbW9kX2RpZ2VzdC5jCi0gKiBIb3dldmVyLCBpdCBoYXMgbm90IGJlZW4gZXh0ZW5zaXZlbHkgdGVzdGVkIHlldCwgYW5kIGlzIHRoZXJlZm9yZQotICogY3VycmVudGx5IG1hcmtlZCBleHBlcmltZW50YWwuIFNlbmQgcHJvYmxlbSByZXBvcnRzIHRvIG1lCi0gKiAocm9uYWxkQGlubm92YXRpb24uY2gpCi0gKgotICogUmVxdWlyZXMgZWl0aGVyIC9kZXYvcmFuZG9tIChvciBlcXVpdmFsZW50KSBvciB0aGUgdHJ1ZXJhbmQgbGlicmFyeSwKLSAqIGF2YWlsYWJsZSBmb3IgaW5zdGFuY2UgZnJvbQotICogZnRwOi8vcmVzZWFyY2guYXR0LmNvbS9kaXN0L21hYi9saWJyYW5kLnNoYXIKLSAqCi0gKiBPcGVuIElzc3VlczoKLSAqICAgLSBxb3A9YXV0aC1pbnQgKHdoZW4gc3RyZWFtcyBhbmQgdHJhaWxlciBzdXBwb3J0IGF2YWlsYWJsZSkKLSAqICAgLSBub25jZS1mb3JtYXQgY29uZmlndXJhYmlsaXR5Ci0gKiAgIC0gUHJveHktQXV0aG9yaXphdGlvbi1JbmZvIGhlYWRlciBpcyBzZXQgYnkgdGhpcyBtb2R1bGUsIGJ1dCBpcwotICogICAgIGN1cnJlbnRseSBpZ25vcmVkIGJ5IG1vZF9wcm94eSAobmVlZHMgcGF0Y2ggdG8gbW9kX3Byb3h5KQotICogICAtIGdlbmVyYXRpbmcgdGhlIHNlY3JldCB0YWtlcyBhIHdoaWxlICh+IDggc2Vjb25kcykgaWYgdXNpbmcgdGhlCi0gKiAgICAgdHJ1ZXJhbmQgbGlicmFyeQotICogICAtIHNoYXJlZC1tZW0gbm90IGNvbXBsZXRlbHkgdGVzdGVkIHlldC4gU2VlbXMgdG8gd29yayBvayBmb3IgbWUsCi0gKiAgICAgYnV0Li4uIChkZWZpbml0ZWx5IHdvbid0IHdvcmsgb24gV2luZG96ZSkKLSAqLwotCi0vKiBUaGUgc2VjdGlvbiBmb3IgdGhlIENvbmZpZ3VyZSBzY3JpcHQ6Ci0gKiBNT0RVTEUtREVGSU5JVElPTi1TVEFSVAotICogTmFtZTogZGlnZXN0X2F1dGhfbW9kdWxlCi0gKiBDb25maWdTdGFydAotCi0gICAgUlVMRV9ERVZfUkFORE9NPWAuL2hlbHBlcnMvQ3V0UnVsZSBERVZfUkFORE9NICRmaWxlYAotICAgIGlmIFsgIiRSVUxFX0RFVl9SQU5ET00iID0gImRlZmF1bHQiIF07IHRoZW4KLQlpZiBbIC1yICIvZGV2L3JhbmRvbSIgXTsgdGhlbgotCSAgICBSVUxFX0RFVl9SQU5ET009Ii9kZXYvcmFuZG9tIgotCWVsaWYgWyAtciAiL2Rldi91cmFuZG9tIiBdOyB0aGVuCi0JICAgIFJVTEVfREVWX1JBTkRPTT0iL2Rldi91cmFuZG9tIgotCWVsc2UKLQkgICAgUlVMRV9ERVZfUkFORE9NPSJ0cnVlcmFuZCIKLQkgICAgaWYgaGVscGVycy9UZXN0Q29tcGlsZSBmdW5jIHJhbmRieXRlOyB0aGVuCi0JCToKLQkgICAgZWxpZiBoZWxwZXJzL1Rlc3RDb21waWxlIGxpYiByYW5kIHJhbmRieXRlOyB0aGVuCi0JCToKLQkgICAgZWxzZQotCQllY2hvICIgICAgICAobW9kX2F1dGhfZGlnZXN0KSB0cnVlcmFuZCBsaWJyYXJ5IG1pc3NpbmchIgotCQllY2hvICIqKiBUaGlzIHdpbGwgbW9zdCBwcm9iYWJseSBkZWZlYXQgc3VjY2Vzc2Z1bCBjb21waWxhdGlvbi4iCi0JCWVjaG8gIioqIFNlZSBSdWxlIERFVl9SQU5ET00gaW4gc3JjL0NvbmZpZ3VyYXRpb24udG1wbCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0JICAgIGZpCi0JZmkKLSAgICBmaQotICAgIGlmIFsgIiRSVUxFX0RFVl9SQU5ET00iID0gInRydWVyYW5kIiBdOyB0aGVuCi0JZWNobyAiICAgICAgdXNpbmcgdHJ1ZXJhbmQgbGlicmFyeSAoLWxyYW5kKSBmb3IgdGhlIHJhbmRvbSBzZWVkIgotCUxJQlM9IiRMSUJTIC1ML3Vzci9sb2NhbC9saWIgLWxyYW5kIgotICAgIGVsc2UKLQllY2hvICIgICAgICB1c2luZyAkUlVMRV9ERVZfUkFORE9NIGZvciB0aGUgcmFuZG9tIHNlZWQiCi0JQ0ZMQUdTPSIkQ0ZMQUdTIC1EREVWX1JBTkRPTT0kUlVMRV9ERVZfUkFORE9NIgotICAgIGZpCi0KLSAqIENvbmZpZ0VuZAotICogTU9EVUxFLURFRklOSVRJT04tRU5ECi0gKi8KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZfZ2xvYmFscy5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIgotI2luY2x1ZGUgImFwX2N0eXBlLmgiCi0jaW5jbHVkZSAidXRpbF91cmkuaCIKLSNpbmNsdWRlICJ1dGlsX21kNS5oIgotI2luY2x1ZGUgImFwX3NoYTEuaCIKLQotI2lmZGVmIFdJTjMyCi0vKiBDcnlwdCBBUElzIGFyZSBhdmFpbGFibGUgb24gV2luOTUgd2l0aCBPU1IgMiAqLwotI2luY2x1ZGUgPHdpbmNyeXB0Lmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU0hNRU1fTU0KLSNpbmNsdWRlICJtbS5oIgotI2VuZGlmCS8qIEhBVkVfU0hNRU1fTU0gKi8KLQotCi0vKiBzdHJ1Y3QgdG8gaG9sZCB0aGUgY29uZmlndXJhdGlvbiBpbmZvICovCi0KLXR5cGVkZWYgc3RydWN0IGRpZ2VzdF9jb25maWdfc3RydWN0IHsKLSAgICBjb25zdCBjaGFyICAqZGlyX25hbWU7Ci0gICAgY29uc3QgY2hhciAgKnB3ZmlsZTsKLSAgICBjb25zdCBjaGFyICAqZ3JwZmlsZTsKLSAgICBjb25zdCBjaGFyICAqcmVhbG07Ci0gICAgY29uc3QgY2hhciAqKnFvcF9saXN0OwotICAgIEFQX1NIQTFfQ1RYICBub25jZV9jdHg7Ci0gICAgbG9uZyAgICAgICAgIG5vbmNlX2xpZmV0aW1lOwotICAgIGNvbnN0IGNoYXIgICpub25jZV9mb3JtYXQ7Ci0gICAgaW50ICAgICAgICAgIGNoZWNrX25jOwotICAgIGNvbnN0IGNoYXIgICphbGdvcml0aG07Ci0gICAgY2hhciAgICAgICAgKnVyaV9saXN0OwotICAgIGNvbnN0IGNoYXIgICpoYTE7Ci19IGRpZ2VzdF9jb25maWdfcmVjOwotCi0KLSNkZWZpbmUJREZMVF9BTEdPUklUSE0JIk1ENSIKLQotI2RlZmluZQlERkxUX05PTkNFX0xJRkUJMzAwTAotI2RlZmluZSBORVhUTk9OQ0VfREVMVEEJMzAKLQotCi0jZGVmaW5lIE5PTkNFX1RJTUVfTEVOCSgoKHNpemVvZih0aW1lX3QpKzIpLzMpKjQpCi0jZGVmaW5lIE5PTkNFX0hBU0hfTEVOCSgyKlNIQV9ESUdFU1RTSVpFKQotI2RlZmluZSBOT05DRV9MRU4JKE5PTkNFX1RJTUVfTEVOICsgTk9OQ0VfSEFTSF9MRU4pCi0KLSNkZWZpbmUJU0VDUkVUX0xFTgkyMAotCi0KLS8qIGNsaWVudCBsaXN0IGRlZmluaXRpb25zICovCi0KLXR5cGVkZWYgc3RydWN0IGhhc2hfZW50cnkgewotICAgIHVuc2lnbmVkIGxvbmcgICAgICBrZXk7CQkJLyogdGhlIGtleSBmb3IgdGhpcyBlbnRyeSAgICAqLwotICAgIHN0cnVjdCBoYXNoX2VudHJ5ICpuZXh0OwkJCS8qIG5leHQgZW50cnkgaW4gdGhlIGJ1Y2tldCAgKi8KLSAgICB1bnNpZ25lZCBsb25nICAgICAgbm9uY2VfY291bnQ7CQkvKiBmb3Igbm9uY2UtY291bnQgY2hlY2tpbmcgICovCi0gICAgY2hhciAgICAgICAgICAgICAgIGhhMVsyKk1ENV9ESUdFU1RTSVpFKzFdOwkvKiBmb3IgYWxnb3JpdGhtPU1ENS1zZXNzICAgICovCi0gICAgY2hhciAgICAgICAgICAgICAgIGxhc3Rfbm9uY2VbTk9OQ0VfTEVOKzFdOwkvKiBmb3Igb25lLXRpbWUgbm9uY2UncyAgICAgICovCi19IGNsaWVudF9lbnRyeTsKLQotc3RhdGljIHN0cnVjdCBoYXNoX3RhYmxlIHsKLSAgICBjbGllbnRfZW50cnkgICoqYXBfdGFibGVfdDsKLSAgICB1bnNpZ25lZCBsb25nICAgdGJsX2xlbjsKLSAgICB1bnNpZ25lZCBsb25nICAgbnVtX2VudHJpZXM7Ci0gICAgdW5zaWduZWQgbG9uZyAgIG51bV9jcmVhdGVkOwotICAgIHVuc2lnbmVkIGxvbmcgICBudW1fcmVtb3ZlZDsKLSAgICB1bnNpZ25lZCBsb25nICAgbnVtX3JlbmV3ZWQ7Ci19ICpjbGllbnRfbGlzdDsKLQotCi0vKiBzdHJ1Y3QgdG8gaG9sZCBhIHBhcnNlZCBBdXRob3JpemF0aW9uIGhlYWRlciAqLwotCi1lbnVtIGhkcl9zdHMgeyBOT19IRUFERVIsIE5PVF9ESUdFU1QsIElOVkFMSUQsIFZBTElEIH07Ci0KLXR5cGVkZWYgc3RydWN0IGRpZ2VzdF9oZWFkZXJfc3RydWN0IHsKLSAgICBjb25zdCBjaGFyICAgICAgICAgICAqc2NoZW1lOwotICAgIGNvbnN0IGNoYXIgICAgICAgICAgICpyZWFsbTsKLSAgICBjb25zdCBjaGFyICAgICAgICAgICAqdXNlcm5hbWU7Ci0gICAgICAgICAgY2hhciAgICAgICAgICAgKm5vbmNlOwotICAgIGNvbnN0IGNoYXIgICAgICAgICAgICp1cmk7Ci0gICAgY29uc3QgY2hhciAgICAgICAgICAgKmRpZ2VzdDsKLSAgICBjb25zdCBjaGFyICAgICAgICAgICAqYWxnb3JpdGhtOwotICAgIGNvbnN0IGNoYXIgICAgICAgICAgICpjbm9uY2U7Ci0gICAgY29uc3QgY2hhciAgICAgICAgICAgKm9wYXF1ZTsKLSAgICB1bnNpZ25lZCBsb25nICAgICAgICAgb3BhcXVlX251bTsKLSAgICBjb25zdCBjaGFyICAgICAgICAgICAqbWVzc2FnZV9xb3A7Ci0gICAgY29uc3QgY2hhciAgICAgICAgICAgKm5vbmNlX2NvdW50OwotICAgIC8qIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBub3QgKGRpcmVjdGx5KSBmcm9tIHRoZSBoZWFkZXIgKi8KLSAgICB0aW1lX3QgICAgICAgICAgICAgICAgbm9uY2VfdGltZTsKLSAgICBlbnVtIGhkcl9zdHMgICAgICAgICAgYXV0aF9oZHJfc3RzOwotICAgIHVyaV9jb21wb25lbnRzICAgICAgICpyZXF1ZXN0X3VyaTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgbmVlZGVkX2F1dGg7Ci0gICAgY2xpZW50X2VudHJ5ICAgICAgICAgKmNsaWVudDsKLX0gZGlnZXN0X2hlYWRlcl9yZWM7Ci0KLQotLyogKG1vc3RseSkgbm9uY2Ugc3R1ZmYgKi8KLQotdHlwZWRlZiB1bmlvbiB0aW1lX3VuaW9uIHsKLSAgICB0aW1lX3QJICB0aW1lOwotICAgIHVuc2lnbmVkIGNoYXIgYXJyW3NpemVvZih0aW1lX3QpXTsKLX0gdGltZV9yZWM7Ci0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgc2VjcmV0W1NFQ1JFVF9MRU5dOwotc3RhdGljIGludCBjYWxsX2NudCA9IDA7Ci0KLQotI2lmZGVmIEhBVkVfU0hNRU1fTU0KLS8qIG9wYXF1ZSBzdHVmZiAqLwotCi1zdGF0aWMgTU0gICAgICAgICAgICAqb3BhcXVlX21tOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgKm9wYXF1ZV9jbnRyOwotCi1zdGF0aWMgTU0gICAgICAgICAgICAqY2xpZW50X21tOwotCi1zdGF0aWMgTU0gICAgICAgICAgICAqb3RuX2NvdW50X21tOwotc3RhdGljIHRpbWVfdCAgICAgICAgKm90bl9jb3VudGVyOwkvKiBvbmUtdGltZS1ub25jZSBjb3VudGVyICovCi0KLSNkZWZpbmUJU0hNRU1fU0laRSAJMTAwMAkJLyogfiAxMiBlbnRyaWVzICovCi0jZGVmaW5lCU5VTV9CVUNLRVRTCTE1VUwKLQotI2Vsc2UJLyogSEFWRV9TSE1FTV9NTSAqLwotc3RhdGljIHZvaWQgICAgICAgICAgKmNsaWVudF9tbSA9IE5VTEw7Ci0jZW5kaWYJLyogSEFWRV9TSE1FTV9NTSAqLwotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgZGlnZXN0X2F1dGhfbW9kdWxlOwotCi0vKgotICogaW5pdGlhbGl6YXRpb24gY29kZQotICovCi0KLSNpZmRlZiBIQVZFX1NITUVNX01NCi1zdGF0aWMgYXBfc3RhdHVzX3QgY2xlYW51cF90YWJsZXModm9pZCAqbm90X3VzZWQpCi17Ci0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgIkRpZ2VzdDogY2xlYW5pbmcgdXAgc2hhcmVkIG1lbW9yeSIpOwotICAgIGZmbHVzaChzdGRlcnIpOwotCi0gICAgaWYgKGNsaWVudF9tbSkgewotCW1tX2Rlc3Ryb3koY2xpZW50X21tKTsKLQljbGllbnRfbW0gPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChvcGFxdWVfbW0pIHsKLQltbV9kZXN0cm95KG9wYXF1ZV9tbSk7Ci0Jb3BhcXVlX21tID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAob3RuX2NvdW50X21tKSB7Ci0JbW1fZGVzdHJveShvdG5fY291bnRfbW0pOwotCW90bl9jb3VudF9tbSA9IE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotfQotI2VuZGlmCS8qIEhBVkVfU0hNRU1fTU0gKi8KLQotI2lmZGVmIFdJTjMyCi0vKiBUT0RPOiBhYnN0cmFjdCBvdXQgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbi4gQVBSPyAqLwotc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9zZWNyZXQoc2VydmVyX3JlYyAqcykKLXsKLSAgICBIQ1JZUFRQUk9WIGhQcm92OwotCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCBzLAotCQkgIkRpZ2VzdDogZ2VuZXJhdGluZyBzZWNyZXQgZm9yIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiAuLi4iKTsKLSAgICBpZiAoIUNyeXB0QWNxdWlyZUNvbnRleHQoJmhQcm92LE5VTEwsTlVMTCxQUk9WX1JTQV9GVUxMLDApKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19DUklULCBzLCAKLSAgICAgICAgICAgICAgICAgICAgICJEaWdlc3Q6IEVycm9yIGFjcXVpcmluZyBjb250ZXh0LiBFcnJubyA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgIEdldExhc3RFcnJvcigpKTsKLSAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgICBpZiAoIUNyeXB0R2VuUmFuZG9tKGhQcm92LHNpemVvZihzZWNyZXQpLHNlY3JldCkpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0NSSVQsIHMsIAotICAgICAgICAgICAgICAgICAgICAgIkRpZ2VzdDogRXJyb3IgZ2VuZXJhdGluZyBzZWNyZXQuIEVycm5vID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgR2V0TGFzdEVycm9yKCkpOwotICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCBzLCAiRGlnZXN0OiBkb25lIik7Ci19Ci0jZWxzZQotc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9zZWNyZXQoc2VydmVyX3JlYyAqcykKLXsKLSNpZmRlZglERVZfUkFORE9NCi0gICAgaW50IHJuZDsKLSAgICBzaXplX3QgZ290LCB0b3Q7Ci0jZWxzZQotICAgIGV4dGVybiBpbnQgcmFuZGJ5dGUodm9pZCk7CS8qIGZyb20gdGhlIHRydWVyYW5kIGxpYnJhcnkgKi8KLSAgICB1bnNpZ25lZCBpbnQgaWR4OwotI2VuZGlmCi0KLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19OT1RJQ0UsIDAsIHMsCi0JCSAiRGlnZXN0OiBnZW5lcmF0aW5nIHNlY3JldCBmb3IgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIC4uLiIpOwotCi0jaWZkZWYJREVWX1JBTkRPTQotI2RlZmluZQlYU1RSKHgpCSN4Ci0jZGVmaW5lCVNUUih4KQlYU1RSKHgpCi0gICAgaWYgKChybmQgPSBvcGVuKFNUUihERVZfUkFORE9NKSwgT19SRE9OTFkpKSA9PSBOVUxMKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0NSSVQsIHMsCi0JCSAgICAgIkRpZ2VzdDogQ291bGRuJ3Qgb3BlbiAiIFNUUihERVZfUkFORE9NKSk7Ci0JZXhpdChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgICBmb3IgKHRvdD0wOyB0b3Q8c2l6ZW9mKHNlY3JldCk7IHRvdCArPSBnb3QpIHsKLQlpZiAoKGdvdCA9IHJlYWQocm5kLCBzZWNyZXQrdG90LCBzaXplb2Yoc2VjcmV0KS10b3QpKSA8IDApIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0NSSVQsIHMsCi0JCQkgIkRpZ2VzdDogRXJyb3IgcmVhZGluZyAiIFNUUihERVZfUkFORE9NKSk7Ci0JICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLQl9Ci0gICAgfQotICAgIGNsb3NlKHJuZCk7Ci0jdW5kZWYJU1RSCi0jdW5kZWYJWFNUUgotI2Vsc2UJLyogdXNlIHRydWVyYW5kICovCi0gICAgLyogdGhpcyB3aWxsIGluY3JlYXNlIHRoZSBzdGFydHVwIHRpbWUgb2YgdGhlIHNlcnZlciwgdW5mb3J0dW5hdGVseS4uLgotICAgICAqIChnZW5lcmF0aW5nIDIwIGJ5dGVzIHRha2VzIGFib3V0IDggc2Vjb25kcykKLSAgICAgKi8KLSAgICBmb3IgKGlkeD0wOyBpZHg8c2l6ZW9mKHNlY3JldCk7IGlkeCsrKQotCXNlY3JldFtpZHhdID0gKHVuc2lnbmVkIGNoYXIpIHJhbmRieXRlKCk7Ci0jZW5kaWYJLyogREVWX1JBTkRPTSAqLwotCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCAwLCBzLCAiRGlnZXN0OiBkb25lIik7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU0hNRU1fTU0KLXN0YXRpYyB2b2lkIGluaXRpYWxpemVfdGFibGVzKHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgdW5zaWduZWQgbG9uZyBpZHg7Ci0KLSAgICAvKiBzZXQgdXAgY2xpZW50IGxpc3QgKi8KLQotICAgIGNsaWVudF9tbSA9IG1tX2NyZWF0ZShTSE1FTV9TSVpFLCB0bXBuYW0oTlVMTCkpOwotICAgIGlmIChjbGllbnRfbW0gPT0gTlVMTCkKLQlnb3RvIGZhaWxlZDsKLSNpZmRlZiBNUEUKLSAgICBpZiAoZ2V0ZXVpZCgpID09IDEpIHsKLSNlbHNlCi0gICAgaWYgKGdldGV1aWQoKSA9PSAwKSB7Ci0jZW5kaWYKLQlpZiAobW1fcGVybWlzc2lvbihjbGllbnRfbW0sIDA2MDAsIGFwX3VzZXJfaWQsIGFwX2dyb3VwX2lkKSkKLQkgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIGNsaWVudF9saXN0ID0gbW1fbWFsbG9jKGNsaWVudF9tbSwgc2l6ZW9mKCpjbGllbnRfbGlzdCkgKwotCQkJCSAgICAgICBzaXplb2YoY2xpZW50X2VudHJ5KikqTlVNX0JVQ0tFVFMpOwotICAgIGlmICghY2xpZW50X2xpc3QpICBnb3RvIGZhaWxlZDsKLSAgICBjbGllbnRfbGlzdC0+dGFibGUgPSAoY2xpZW50X2VudHJ5KiopIChjbGllbnRfbGlzdCArIDEpOwotICAgIGZvciAoaWR4PTA7IGlkeDxOVU1fQlVDS0VUUzsgaWR4KyspCi0JY2xpZW50X2xpc3QtPnRhYmxlW2lkeF0gPSBOVUxMOwotICAgIGNsaWVudF9saXN0LT50YmxfbGVuICAgICA9IE5VTV9CVUNLRVRTOwotICAgIGNsaWVudF9saXN0LT5udW1fZW50cmllcyA9IDA7Ci0KLQotICAgIC8qIHNldHVwIG9wYXF1ZSAqLwotCi0gICAgb3BhcXVlX21tID0gbW1fY3JlYXRlKHNpemVvZigqb3BhcXVlX2NudHIpLCB0bXBuYW0oTlVMTCkpOwotICAgIGlmIChvcGFxdWVfbW0gPT0gTlVMTCkKLQlnb3RvIGZhaWxlZDsKLSNpZmRlZiBNUEUKLSAgICBpZiAoZ2V0ZXVpZCgpID09IDEpIHsKLSNlbHNlCi0gICAgaWYgKGdldGV1aWQoKSA9PSAwKSB7Ci0jZW5kaWYKLQlpZiAobW1fcGVybWlzc2lvbihvcGFxdWVfbW0sIDA2MDAsIGFwX3VzZXJfaWQsIGFwX2dyb3VwX2lkKSkKLQkgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIG9wYXF1ZV9jbnRyID0gbW1fbWFsbG9jKG9wYXF1ZV9tbSwgc2l6ZW9mKCpvcGFxdWVfY250cikpOwotICAgIGlmIChvcGFxdWVfY250ciA9PSBOVUxMKQotCWdvdG8gZmFpbGVkOwotICAgICpvcGFxdWVfY250ciA9IDFVTDsKLQotCi0gICAgLyogc2V0dXAgb25lLXRpbWUtbm9uY2UgY291bnRlciAqLwotCi0gICAgb3RuX2NvdW50X21tID0gbW1fY3JlYXRlKHNpemVvZigqb3RuX2NvdW50ZXIpLCB0bXBuYW0oTlVMTCkpOwotICAgIGlmIChvdG5fY291bnRfbW0gPT0gTlVMTCkKLQlnb3RvIGZhaWxlZDsKLSNpZmRlZiBNUEUKLSAgICBpZiAoZ2V0ZXVpZCgpID09IDEpIHsKLSNlbHNlCi0gICAgaWYgKGdldGV1aWQoKSA9PSAwKSB7Ci0jZW5kaWYKLQlpZiAobW1fcGVybWlzc2lvbihvdG5fY291bnRfbW0sIDA2MDAsIGFwX3VzZXJfaWQsIGFwX2dyb3VwX2lkKSkKLQkgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotICAgIG90bl9jb3VudGVyID0gbW1fbWFsbG9jKG90bl9jb3VudF9tbSwgc2l6ZW9mKCpvdG5fY291bnRlcikpOwotICAgIGlmIChvdG5fY291bnRlciA9PSBOVUxMKQotCWdvdG8gZmFpbGVkOwotICAgICpvdG5fY291bnRlciA9IDA7Ci0KLQotICAgIC8qIHN1Y2Nlc3MgKi8KLSAgICByZXR1cm47Ci0KLWZhaWxlZDoKLSAgICBpZiAoIWNsaWVudF9tbSB8fCAoY2xpZW50X2xpc3QgJiYgY2xpZW50X2xpc3QtPnRhYmxlICYmICFvcGFxdWVfbW0pCi0JfHwgKG9wYXF1ZV9jbnRyICYmICFvdG5fY291bnRfbW0pKQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgcywKLQkJICAgICAiRGlnZXN0OiBmYWlsZWQgdG8gY3JlYXRlIHNoYXJlZCBtZW1vcnkgc2VnbWVudHM7IHJlYXNvbiAiCi0JCSAgICAgIndhcyBgJXMnIC0gYWxsIG5vbmNlLWNvdW50IGNoZWNraW5nLCBvbmUtdGltZSBub25jZXMsICIKLQkJICAgICAiYW5kIE1ENS1zZXNzIGFsZ29yaXRobSBkaXNhYmxlZCIsIG1tX2Vycm9yKCkpOwotICAgIGVsc2UKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIHMsCi0JCSAgICAgIkRpZ2VzdDogZmFpbGVkIHRvIGFsbG9jYXRlIHNoYXJlZCBtZW07IHJlYXNvbiB3YXMgYCVzJyAiCi0JCSAgICAgIi0gYWxsIG5vbmNlLWNvdW50IGNoZWNraW5nLCBvbmUtdGltZSBub25jZXMsIGFuZCAiCi0JCSAgICAgIk1ENS1zZXNzIGFsZ29yaXRobSBkaXNhYmxlZCIsIG1tX2Vycm9yKCkpOwotCi0gICAgY2xlYW51cF90YWJsZXMoTlVMTCk7Ci19Ci0jZW5kaWYJLyogSEFWRV9TSE1FTV9NTSAqLwotCi1zdGF0aWMgdm9pZCBpbml0aWFsaXplX21vZHVsZShhcF9jb250ZXh0X3QgKnAsIGFwX2NvbnRleHRfdCAqcGxvZywKLQkJCSAgICAgIGFwX2NvbnRleHRfdCAqcHRlbXAsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgLyoga2VlcCBmcm9tIGRvaW5nIHRoZSBpbml0IG1vcmUgdGhhbiBvbmNlIGF0IHN0YXJ0dXAsIGFuZCBkZWxheQotICAgICAqIHRoZSBpbml0IHVudGlsIHRoZSBzZWNvbmQgcm91bmQKLSAgICAgKi8KLSAgICBpZiAoKytjYWxsX2NudCA8IDIpCi0JcmV0dXJuOwotCi0gICAgLyogb25seSBpbml0aWFsaXplIHRoZSBzZWNyZXQgb24gc3RhcnR1cCwgbm90IG9uIHJlc3RhcnRzICovCi0gICAgaWYgKGNhbGxfY250ID09IDIpCi0JaW5pdGlhbGl6ZV9zZWNyZXQocyk7Ci0KLSNpZmRlZiBIQVZFX1NITUVNX01NCi0gICAgLyogTm90ZTogdGhpcyBzdHVmZiBpcyBjdXJyZW50bHkgZml4ZWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgc2VydmVyLAotICAgICAqIGkuZS4gZXZlbiBhY3Jvc3MgcmVzdGFydHMuIFRoaXMgbWVhbnMgdGhhdCBBKSBhbnkgc2htZW0tc2l6ZQotICAgICAqIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBhcmUgaWdub3JlZCwgYW5kIEIpIGNlcnRhaW4gb3B0aW1pemF0aW9ucywKLSAgICAgKiBzdWNoIGFzIG9ubHkgYWxsb2NhdGluZyB0aGUgc21hbGxlc3QgbmVjZXNzYXJ5IGVudHJ5IGZvciBlYWNoCi0gICAgICogY2xpZW50LCBjYW4ndCBiZSBkb25lLiBIb3dldmVyLCB0aGUgYWx0ZXJuYXRpdmUgaXMgYSBuaWdodG1hcmU6Ci0gICAgICogd2UgY2FuJ3QgY2FsbCBtbV9kZXN0cm95IG9uIGEgZ3JhY2VmdWwgcmVzdGFydCBiZWNhdXNlIHRoZXJlIHdpbGwKLSAgICAgKiBiZSBjaGlsZHJlbiB1c2luZyB0aGUgdGFibGVzLCBhbmQgd2UgYWxzbyBkb24ndCBrbm93IHdoZW4gdGhlCi0gICAgICogbGFzdCBjaGlsZCBkaWVzLiBUaGVyZWZvcmUgd2UgY2FuIG5ldmVyIGNsZWFuIHVwIHRoZSBvbGQgc3R1ZmYsCi0gICAgICogY3JlYXRpbmcgYSBjcmVlcGluZyBtZW1vcnkgbGVhay4KLSAgICAgKi8KLSAgICBpbml0aWFsaXplX3RhYmxlcyhzKTsKLSAgICBhcF9yZWdpc3Rlcl9jbGVhbnVwKHAsIE5VTEwsIGNsZWFudXBfdGFibGVzLCBhcF9udWxsX2NsZWFudXApOwotI2VuZGlmCS8qIEhBVkVfU0hNRU1fTU0gKi8KLX0KLQotCi0vKgotICogY29uZmlndXJhdGlvbiBjb2RlCi0gKi8KLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9kaWdlc3RfZGlyX2NvbmZpZyhhcF9jb250ZXh0X3QgKnAsIGNoYXIgKmRpcikKLXsKLSAgICBkaWdlc3RfY29uZmlnX3JlYyAqY29uZjsKLQotICAgIGlmIChkaXIgPT0gTlVMTCkgIHJldHVybiBOVUxMOwotCi0gICAgY29uZiA9IChkaWdlc3RfY29uZmlnX3JlYyAqKSBhcF9wY2FsbG9jKHAsIHNpemVvZihkaWdlc3RfY29uZmlnX3JlYykpOwotICAgIGlmIChjb25mKSB7Ci0JY29uZi0+cW9wX2xpc3QgICAgICAgPSBhcF9wYWxsb2MocCwgc2l6ZW9mKGNoYXIqKSk7Ci0JY29uZi0+cW9wX2xpc3RbMF0gICAgPSBOVUxMOwotCWNvbmYtPm5vbmNlX2xpZmV0aW1lID0gREZMVF9OT05DRV9MSUZFOwotCWNvbmYtPmRpcl9uYW1lICAgICAgID0gYXBfcHN0cmR1cChwLCBkaXIpOwotCWNvbmYtPmFsZ29yaXRobSAgICAgID0gREZMVF9BTEdPUklUSE07Ci0gICAgfQotCi0gICAgcmV0dXJuIGNvbmY7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfcmVhbG0oY21kX3Bhcm1zICpjbWQsIHZvaWQgKmNvbmZpZywgY29uc3QgY2hhciAqcmVhbG0pCi17Ci0gICAgZGlnZXN0X2NvbmZpZ19yZWMgKmNvbmYgPSAoZGlnZXN0X2NvbmZpZ19yZWMgKikgY29uZmlnOwotCi0gICAgLyogVGhlIGNvcmUgYWxyZWFkeSBoYW5kbGVzIHRoZSByZWFsbSwgYnV0IGl0J3MganVzdCB0b28gY29udmVuaWVudCB0bwotICAgICAqIGdyYWIgaXQgb3Vyc2VsdmVzIHRvbyBhbmQgY2FjaGUgc29tZSBzZXR1cHMuIEhvd2V2ZXIsIHdlIG5lZWQgdG8KLSAgICAgKiBsZXQgdGhlIGNvcmUgZ2V0IGF0IGl0IHRvbywgd2hpY2ggaXMgd2h5IHdlIGRlY2xpbmUgYXQgdGhlIGVuZCAtCi0gICAgICogdGhpcyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBodHRwX2NvcmUgaXMgbGFzdCBpbiB0aGUgbGlzdC4KLSAgICAgKi8KLSAgICBjb25mLT5yZWFsbSA9IHJlYWxtOwotCi0gICAgLyogd2UgcHJlY29tcHV0ZSB0aGUgcGFydCBvZiB0aGUgbm9uY2UgaGFzaCB0aGF0IGlzIGNvbnN0YW50ICh3ZWxsLAotICAgICAqIHRoZSBob3N0OnBvcnQgd291bGQgYmUgdG9vLCBidXQgdGhhdCB2YXJpZXMgZm9yIC5odGFjY2VzcyBmaWxlcwotICAgICAqIGFuZCBkaXJlY3RpdmVzIG91dHNpZGUgYSB2aXJ0dWFsIGhvc3Qgc2VjdGlvbikKLSAgICAgKi8KLSAgICBhcF9TSEExSW5pdCgmY29uZi0+bm9uY2VfY3R4KTsKLSAgICBhcF9TSEExVXBkYXRlX2JpbmFyeSgmY29uZi0+bm9uY2VfY3R4LCAoY29uc3QgdW5zaWduZWQgY2hhciAqKSByZWFsbSwKLQkJCSBzdHJsZW4ocmVhbG0pKTsKLSAgICBhcF9TSEExVXBkYXRlX2JpbmFyeSgmY29uZi0+bm9uY2VfY3R4LCBzZWNyZXQsIHNpemVvZihzZWNyZXQpKTsKLQotICAgIHJldHVybiBERUNMSU5FX0NNRDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9kaWdlc3RfZmlsZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqY29uZmlnLAotCQkJCSAgIGNvbnN0IGNoYXIgKmZpbGUpCi17Ci0gICAgKChkaWdlc3RfY29uZmlnX3JlYyAqKSBjb25maWcpLT5wd2ZpbGUgPSBmaWxlOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2dyb3VwX2ZpbGUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmNvbmZpZywKLQkJCQkgIGNvbnN0IGNoYXIgKmZpbGUpCi17Ci0gICAgKChkaWdlc3RfY29uZmlnX3JlYyAqKSBjb25maWcpLT5ncnBmaWxlID0gZmlsZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9xb3AoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmNvbmZpZywgY29uc3QgY2hhciAqb3ApCi17Ci0gICAgZGlnZXN0X2NvbmZpZ19yZWMgKmNvbmYgPSAoZGlnZXN0X2NvbmZpZ19yZWMgKikgY29uZmlnOwotICAgIGNvbnN0IGNoYXIgKip0bXA7Ci0gICAgaW50IGNudDsKLQotICAgIGlmICghc3RyY2FzZWNtcChvcCwgIm5vbmUiKSkgewotCWlmIChjb25mLT5xb3BfbGlzdFswXSA9PSBOVUxMKSB7Ci0JICAgIGNvbmYtPnFvcF9saXN0ID0gYXBfcGFsbG9jKGNtZC0+cG9vbCwgMiAqIHNpemVvZihjaGFyKikpOwotCSAgICBjb25mLT5xb3BfbGlzdFsxXSA9IE5VTEw7Ci0JfQotCWNvbmYtPnFvcF9saXN0WzBdID0gIm5vbmUiOwotCXJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICghc3RyY2FzZWNtcChvcCwgImF1dGgtaW50IikpCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfV0FSTklORywgMCwgY21kLT5zZXJ2ZXIsCi0JCSAgICAgIkRpZ2VzdDogV0FSTklORzogcW9wIGBhdXRoLWludCcgY3VycmVudGx5IG9ubHkgd29ya3MgIgotCQkgICAgICJjb3JyZWN0bHkgZm9yIHJlc3BvbnNlcyB3aXRoIG5vIGVudGl0eSIpOwotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAob3AsICJhdXRoIikpCi0JcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiVW5yZWNvZ25pemVkIHFvcDogIiwgb3AsIE5VTEwpOwotCi0gICAgZm9yIChjbnQ9MDsgY29uZi0+cW9wX2xpc3RbY250XSAhPSBOVUxMOyBjbnQrKykKLQk7Ci0gICAgdG1wID0gYXBfcGFsbG9jKGNtZC0+cG9vbCwgKGNudCsyKSpzaXplb2YoY2hhciopKTsKLSAgICBtZW1jcHkodG1wLCBjb25mLT5xb3BfbGlzdCwgY250KnNpemVvZihjaGFyKikpOwotICAgIHRtcFtjbnRdICAgPSBhcF9wc3RyZHVwKGNtZC0+cG9vbCwgb3ApOwotICAgIHRtcFtjbnQrMV0gPSBOVUxMOwotICAgIGNvbmYtPnFvcF9saXN0ID0gdG1wOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbm9uY2VfbGlmZXRpbWUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmNvbmZpZywKLQkJCQkgICAgICBjb25zdCBjaGFyICp0KQotewotICAgIGNoYXIgKmVuZHB0cjsKLSAgICBsb25nICBsaWZldGltZTsKLQotICAgIGxpZmV0aW1lID0gc3RydG9sKHQsICZlbmRwdHIsIDEwKTsKLSAgICBpZiAoZW5kcHRyIDwgKHQrc3RybGVuKHQpKSAmJiAhYXBfaXNzcGFjZSgqZW5kcHRyKSkKLQlyZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsICJJbnZhbGlkIHRpbWUgaW4gQXV0aERpZ2VzdE5vbmNlTGlmZXRpbWU6ICIsIHQsIE5VTEwpOwotCi0gICAgKChkaWdlc3RfY29uZmlnX3JlYyAqKSBjb25maWcpLT5ub25jZV9saWZldGltZSA9IGxpZmV0aW1lOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X25vbmNlX2Zvcm1hdChjbWRfcGFybXMgKmNtZCwgdm9pZCAqY29uZmlnLAotCQkJCSAgICBjb25zdCBjaGFyICpmbXQpCi17Ci0gICAgKChkaWdlc3RfY29uZmlnX3JlYyAqKSBjb25maWcpLT5ub25jZV9mb3JtYXQgPSBmbXQ7Ci0gICAgcmV0dXJuICJBdXRoRGlnZXN0Tm9uY2VGb3JtYXQgaXMgbm90IGltcGxlbWVudGVkICh5ZXQpIjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9uY19jaGVjayhjbWRfcGFybXMgKmNtZCwgdm9pZCAqY29uZmlnLCBpbnQgZmxhZykKLXsKLSAgICAoKGRpZ2VzdF9jb25maWdfcmVjICopIGNvbmZpZyktPmNoZWNrX25jID0gZmxhZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9hbGdvcml0aG0oY21kX3Bhcm1zICpjbWQsIHZvaWQgKmNvbmZpZywgY29uc3QgY2hhciAqYWxnKQotewotICAgIGlmICghc3RyY2FzZWNtcChhbGcsICJNRDUtc2VzcyIpKQotI2lmZGVmIEhBVkVfU0hNRU1fTU0KLQk7Ci0jZWxzZQkvKiBIQVZFX1NITUVNX01NICovCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfV0FSTklORywgMCwgY21kLT5zZXJ2ZXIsCi0JCSAgICAgIkRpZ2VzdDogV0FSTklORzogYWxnb3JpdGhtIGBNRDUtc2VzcycgaXMgY3VycmVudGx5IG5vdCAiCi0JCSAgICAgImNvcnJlY3RseSBpbXBsZW1lbnRlZCIpOwotI2VuZGlmCS8qIEhBVkVfU0hNRU1fTU0gKi8KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKGFsZywgIk1ENSIpKQotCXJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIkludmFsaWQgYWxnb3JpdGhtIGluIEF1dGhEaWdlc3RBbGdvcml0aG06ICIsIGFsZywgTlVMTCk7Ci0KLSAgICAoKGRpZ2VzdF9jb25maWdfcmVjICopIGNvbmZpZyktPmFsZ29yaXRobSA9IGFsZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF91cmlfbGlzdChjbWRfcGFybXMgKmNtZCwgdm9pZCAqY29uZmlnLCBjb25zdCBjaGFyICp1cmkpCi17Ci0gICAgZGlnZXN0X2NvbmZpZ19yZWMgKmMgPSAoZGlnZXN0X2NvbmZpZ19yZWMgKikgY29uZmlnOwotICAgIGlmIChjLT51cmlfbGlzdCkgewotCWMtPnVyaV9saXN0W3N0cmxlbihjLT51cmlfbGlzdCktMV0gPSAnXDAnOwotCWMtPnVyaV9saXN0ID0gYXBfcHN0cmNhdChjbWQtPnBvb2wsIGMtPnVyaV9saXN0LCAiICIsIHVyaSwgIlwiIiwgTlVMTCk7Ci0gICAgfQotICAgIGVsc2UKLQljLT51cmlfbGlzdCA9IGFwX3BzdHJjYXQoY21kLT5wb29sLCAiLCBkb21haW49XCIiLCB1cmksICJcIiIsIE5VTEwpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgZGlnZXN0X2NtZHNbXSA9Ci17Ci0gICAgeyJBdXRoTmFtZSIsIHNldF9yZWFsbSwgTlVMTCwgT1JfQVVUSENGRywgVEFLRTEsCi0gICAgICJUaGUgYXV0aGVudGljYXRpb24gcmVhbG0gKGUuZy4gXCJNZW1iZXJzIE9ubHlcIikifSwKLSAgICB7IkF1dGhEaWdlc3RGaWxlIiwgc2V0X2RpZ2VzdF9maWxlLCBOVUxMLCBPUl9BVVRIQ0ZHLCBUQUtFMSwKLSAgICAgIlRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHVzZXJuYW1lcyBhbmQgcGFzc3dvcmQgaGFzaGVzIn0sCi0gICAgeyJBdXRoRGlnZXN0R3JvdXBGaWxlIiwgc2V0X2dyb3VwX2ZpbGUsIE5VTEwsIE9SX0FVVEhDRkcsIFRBS0UxLAotICAgICAiVGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgZ3JvdXAgbmFtZXMgYW5kIG1lbWJlcnMifSwKLSAgICB7IkF1dGhEaWdlc3RRb3AiLCBzZXRfcW9wLCBOVUxMLCBPUl9BVVRIQ0ZHLCBJVEVSQVRFLAotICAgICAiQSBsaXN0IG9mIHF1YWxpdHktb2YtcHJvdGVjdGlvbiBvcHRpb25zIn0sCi0gICAgeyJBdXRoRGlnZXN0Tm9uY2VMaWZldGltZSIsIHNldF9ub25jZV9saWZldGltZSwgTlVMTCwgT1JfQVVUSENGRywgVEFLRTEsCi0gICAgICJNYXhpbXVtIGxpZmV0aW1lIG9mIHRoZSBzZXJ2ZXIgbm9uY2UgKHNlY29uZHMpIn0sCi0gICAgeyJBdXRoRGlnZXN0Tm9uY2VGb3JtYXQiLCBzZXRfbm9uY2VfZm9ybWF0LCBOVUxMLCBPUl9BVVRIQ0ZHLCBUQUtFMSwKLSAgICAgIlRoZSBmb3JtYXQgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyB0aGUgc2VydmVyIG5vbmNlIn0sCi0gICAgeyJBdXRoRGlnZXN0TmNDaGVjayIsIHNldF9uY19jaGVjaywgTlVMTCwgT1JfQVVUSENGRywgRkxBRywKLSAgICAgIldoZXRoZXIgb3Igbm90IHRvIGNoZWNrIHRoZSBub25jZS1jb3VudCBzZW50IGJ5IHRoZSBjbGllbnQifSwKLSAgICB7IkF1dGhEaWdlc3RBbGdvcml0aG0iLCBzZXRfYWxnb3JpdGhtLCBOVUxMLCBPUl9BVVRIQ0ZHLCBUQUtFMSwKLSAgICAgIlRoZSBhbGdvcml0aG0gdXNlZCBmb3IgdGhlIGhhc2ggY2FsY3VsYXRpb24ifSwKLSAgICB7IkF1dGhEaWdlc3REb21haW4iLCBzZXRfdXJpX2xpc3QsIE5VTEwsIE9SX0FVVEhDRkcsIElURVJBVEUsCi0gICAgICJBIGxpc3Qgb2YgVVJJJ3Mgd2hpY2ggYmVsb25nIHRvIHRoZSBzYW1lIHByb3RlY3Rpb24gc3BhY2UgYXMgdGhlIGN1cnJlbnQgVVJJIn0sCi0gICAge05VTEx9Ci19OwotCi0KLSNpZmRlZiBIQVZFX1NITUVNX01NCi0vKgotICogY2xpZW50IGxpc3QgY29kZQotICoKLSAqIEVhY2ggY2xpZW50IGlzIGFzc2lnbmVkIGEgbnVtYmVyLCB3aGljaCBpcyB0cmFuc2ZlcmVkIGluIHRoZSBvcGFxdWUKLSAqIGZpZWxkIG9mIHRoZSBXV1ctQXV0aGVudGljYXRlIGFuZCBBdXRob3JpemF0aW9uIGhlYWRlcnMuIFRoZSBudW1iZXIKLSAqIGlzIGp1c3QgYSBzaW1wbGUgY291bnRlciB3aGljaCBpcyBpbmNyZW1lbnRlZCBmb3IgZWFjaCBuZXcgY2xpZW50LgotICogQ2xpZW50cyBjYW4ndCBmb3JnZSB0aGlzIG51bWJlciBiZWNhdXNlIGl0IGlzIGhhc2hlZCB1cCBpbnRvIHRoZQotICogc2VydmVyIG5vbmNlLCBhbmQgdGhhdCBpcyBjaGVja2VkLgotICoKLSAqIFRoZSBjbGllbnRzIGFyZSBrZXB0IGluIGEgc2ltcGxlIGhhc2ggdGFibGUsIHdoaWNoIGNvbnNpc3RzIG9mIGFuCi0gKiBhcnJheSBvZiBjbGllbnRfZW50cnkncywgZWFjaCB3aXRoIGEgbGlua2VkIGxpc3Qgb2YgZW50cmllcyBoYW5naW5nCi0gKiBvZmYgaXQuIFRoZSBjbGllbnQncyBudW1iZXIgbW9kdWxvIHRoZSBzaXplIG9mIHRoZSBhcnJheSBnaXZlcyB0aGUKLSAqIGJ1Y2tldCBudW1iZXIuCi0gKgotICogVGhlIGNsaWVudHMgYXJlIGdhcmJhZ2UgY29sbGVjdGVkIHdoZW5ldmVyIGEgbmV3IGNsaWVudCBpcyBhbGxvY2F0ZWQKLSAqIGJ1dCB0aGVyZSBpcyBub3QgZW5vdWdoIHNwYWNlIGxlZnQgaW4gdGhlIHNoYXJlZCBtZW1vcnkgc2VnbWVudC4gQQotICogc2ltcGxlIHNlbWktTFJVIGlzIHVzZWQgZm9yIHRoaXM6IHdoZW5ldmVyIGEgY2xpZW50IGVudHJ5IGlzIGFjY2Vzc2VkCi0gKiBpdCBpcyBtb3ZlZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5rZWQgbGlzdCBpbiBpdHMgYnVja2V0ICh0aGlzCi0gKiBhbHNvIG1ha2VzIGZvciBmYXN0ZXIgbG9va3VwcyBmb3IgY3VycmVudCBjbGllbnRzKS4gVGhlIGdhcmJhZ2UKLSAqIGNvbGxlY3RlciB0aGVuIGp1c3QgcmVtb3ZlcyB0aGUgb2xkZXN0IGVudHJ5IChpLmUuIHRoZSBvbmUgYXQgdGhlCi0gKiBlbmQgb2YgdGhlIGxpc3QpIGluIGVhY2ggYnVja2V0LgotICoKLSAqIFRoZSBtYWluIGFkdmFudGFnZXMgb2YgdGhlIGFib3ZlIHNjaGVtZSBhcmUgdGhhdCBpdCdzIGVhc3kgdG8gaW1wbGVtZW50Ci0gKiBhbmQgaXQga2VlcHMgdGhlIGhhc2ggdGFibGUgZXZlbmx5IGJhbGFuY2VkIChpLmUuIHNhbWUgbnVtYmVyIG9mIGVudHJpZXMKLSAqIGluIGVhY2ggYnVja2V0KS4gVGhlIG1ham9yIGRpc2FkdmFudGFnZSBpcyB0aGF0IHlvdSBtYXkgYmUgdGhyb3dpbmcKLSAqIGVudHJpZXMgb3V0IHdoaWNoIGFyZSBpbiBhY3RpdmUgdXNlLiBUaGlzIGlzIG5vdCB0cmFnaWMsIGFzIHRoZXNlCi0gKiBjbGllbnRzIHdpbGwganVzdCBiZSBzZW50IGEgbmV3IGNsaWVudCBpZCAob3BhcXVlIGZpZWxkKSBhbmQgbm9uY2UKLSAqIHdpdGggYSBzdGFsZT10cnVlIChpLmUuIGl0IHdpbGwganVzdCBsb29rIGxpa2UgdGhlIG5vbmNlIGV4cGlyZWQsCi0gKiB0aGVyZWJ5IGZvcmNpbmcgYW4gZXh0cmEgcm91bmQgdHJpcCkuIElmIHRoZSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQKLSAqIGhhcyBlbm91Z2ggaGVhZHJvb20gb3ZlciB0aGUgY3VycmVudCBjbGllbnQgc2V0IHNpemUgdGhlbiB0aGlzIHNob3VsZAotICogbm90IG9jY3VyIHRvbyBvZnRlbi4KLSAqCi0gKiBUbyBoZWxwIHR1bmUgdGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnkgc2VnbWVudCAoYW5kIHNlZSBpZiB0aGUKLSAqIGFib3ZlIGFsZ29yaXRobSBpcyByZWFsbHkgc3VmZmljaWVudCkgYSBzZXQgb2YgY291bnRlcnMgaXMga2VwdAotICogaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIGNsaWVudHMgaGVsZCwgdGhlIG51bWJlciBvZiBnYXJiYWdlIGNvbGxlY3RlZAotICogY2xpZW50cywgYW5kIHRoZSBudW1iZXIgb2YgZXJyb25lb3VzbHkgcHVyZ2VkIGNsaWVudHMuIFRoZXNlIGFyZSBwcmludGVkCi0gKiBvdXQgYXQgZWFjaCBnYXJiYWdlIGNvbGxlY3Rpb24gcnVuLiBOb3RlIHRoYXQgYWNjZXNzIHRvIHRoZSBjb3VudGVycyBpcwotICogbm90IHN5bmNocm9uaXplZCBiZWNhdXNlIHRoZXkgYXJlIGp1c3QgaW5kaWNhdGVycywgYW5kIHdoZXRoZXIgdGhleSBhcmUKLSAqIG9mZiBieSBhIGZldyBkb2Vzbid0IG1hdHRlcjsgYW5kIGZvciB0aGUgc2FtZSByZWFzb24gbm8gYXR0ZW1wdCBpcyBtYWRlCi0gKiB0byBndWFyYW50ZWUgdGhlIG51bV9yZW5ld2VkIGlzIGNvcnJlY3QgaW4gdGhlIGZhY2Ugb2YgY2xpZW50cyBzcG9vZmluZwotICogdGhlIG9wYXF1ZSBmaWVsZC4KLSAqLwotCi0vKgotICogR2V0IHRoZSBjbGllbnQgZ2l2ZW4gaXRzIGNsaWVudCBudW1iZXIgKHRoZSBrZXkpLiBSZXR1cm5zIHRoZSBlbnRyeSwKLSAqIG9yIE5VTEwgaWYgaXRzIG5vdCBmb3VuZC4KLSAqCi0gKiBBY2Nlc3MgdG8gdGhlIGxpc3QgaXRzZWxmIGlzIHN5bmNocm9uaXplZCB2aWEgbG9ja3MuIEhvd2V2ZXIsIGFjY2VzcwotICogdG8gdGhlIGVudHJ5IHJldHVybmVkIGJ5IGdldF9jbGllbnQoKSBpcyBOT1Qgc3luY2hyb25pemVkLiBUaGlzIG1lYW5zCi0gKiB0aGF0IHRoZXJlIGFyZSBwb3RlbnRpYWxseSBwcm9ibGVtcyBpZiBhIGNsaWVudCB1c2VzIG11bHRpcGxlLAotICogc2ltdWx0YW5lb3VzIGNvbm5lY3Rpb25zIHRvIGFjY2VzcyB1cmwncyB3aXRoaW4gdGhlIHNhbWUgcHJvdGVjdGlvbgotICogc3BhY2UuIEhvd2V2ZXIsIHRoZXNlIHByb2JsZW1zIGFyZSBub3QgbmV3OiB3aGVuIHVzaW5nIG11bHRpcGxlCi0gKiBjb25uZWN0aW9ucyB5b3UgaGF2ZSBubyBndWFyYW50ZWUgb2YgdGhlIG9yZGVyIHRoZSByZXF1ZXN0cyBhcmUKLSAqIHByb2Nlc3NlZCBhbnl3YXksIHNvIHlvdSBoYXZlIHByb2JsZW1zIHdpdGggdGhlIG5vbmNlLWNvdW50IGFuZAotICogb25lLXRpbWUgbm9uY2VzIGFueXdheS4KLSAqLwotc3RhdGljIGNsaWVudF9lbnRyeSAqZ2V0X2NsaWVudCh1bnNpZ25lZCBsb25nIGtleSwgY29uc3QgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IGJ1Y2tldDsKLSAgICBjbGllbnRfZW50cnkgKmVudHJ5LCAqcHJldiA9IE5VTEw7Ci0KLQotICAgIGlmICgha2V5IHx8ICFjbGllbnRfbW0pICByZXR1cm4gTlVMTDsKLQotICAgIGJ1Y2tldCA9IGtleSAlIGNsaWVudF9saXN0LT50YmxfbGVuOwotICAgIGVudHJ5ICA9IGNsaWVudF9saXN0LT50YWJsZVtidWNrZXRdOwotCi0gICAgbW1fbG9jayhjbGllbnRfbW0sIE1NX0xPQ0tfUkQpOwotCi0gICAgd2hpbGUoZW50cnkgJiYga2V5ICE9IGVudHJ5LT5rZXkpIHsKLQlwcmV2ICA9IGVudHJ5OwotCWVudHJ5ID0gZW50cnktPm5leHQ7Ci0gICAgfQotCi0gICAgaWYgKGVudHJ5ICYmIHByZXYpIHsJCS8qIG1vdmUgZW50cnkgdG8gZnJvbnQgb2YgbGlzdCAqLwotCXByZXYtPm5leHQgID0gZW50cnktPm5leHQ7Ci0JZW50cnktPm5leHQgPSBjbGllbnRfbGlzdC0+dGFibGVbYnVja2V0XTsKLQljbGllbnRfbGlzdC0+dGFibGVbYnVja2V0XSA9IGVudHJ5OwotICAgIH0KLQotICAgIG1tX3VubG9jayhjbGllbnRfbW0pOwotCi0gICAgaWYgKGVudHJ5KQotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19ERUJVRywgMCwgciwKLQkJICAgICAgImdldF9jbGllbnQoKTogY2xpZW50ICVsdSBmb3VuZCIsIGtleSk7Ci0gICAgZWxzZQotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19ERUJVRywgMCwgciwKLQkJICAgICAgImdldF9jbGllbnQoKTogY2xpZW50ICVsdSBub3QgZm91bmQiLCBrZXkpOwotCi0gICAgcmV0dXJuIGVudHJ5OwotfQotCi0KLS8qIEEgc2ltcGxlIGdhcmJhZ2UtY29sbGVjdGVyIHRvIHJlbW92ZSB1bnVzZWQgY2xpZW50cy4gSXQgcmVtb3ZlcyB0aGUKLSAqIGxhc3QgZW50cnkgaW4gZWFjaCBidWNrZXQgYW5kIHVwZGF0ZXMgdGhlIGNvdW50ZXJzLiBSZXR1cm5zIHRoZQotICogbnVtYmVyIG9mIHJlbW92ZWQgZW50cmllcy4KLSAqLwotc3RhdGljIGxvbmcgZ2Modm9pZCkKLXsKLSAgICBjbGllbnRfZW50cnkgKmVudHJ5LCAqcHJldjsKLSAgICB1bnNpZ25lZCBsb25nIG51bV9yZW1vdmVkID0gMCwgaWR4OwotCi0gICAgLyogZ2FyYmFnZSBjb2xsZWN0IGFsbCBsYXN0IGVudHJpZXMgKi8KLQotICAgIGZvciAoaWR4PTA7IGlkeDxjbGllbnRfbGlzdC0+dGJsX2xlbjsgaWR4KyspIHsKLQllbnRyeSA9IGNsaWVudF9saXN0LT50YWJsZVtpZHhdOwotCXByZXYgID0gTlVMTDsKLQl3aGlsZSAoZW50cnktPm5leHQpIHsJLyogZmluZCBsYXN0IGVudHJ5ICovCi0JICAgIHByZXYgID0gZW50cnk7Ci0JICAgIGVudHJ5ID0gZW50cnktPm5leHQ7Ci0JfQotCWlmIChwcmV2KSAgcHJldi0+bmV4dCA9IE5VTEw7CS8qIGN1dCBsaXN0ICovCi0JZWxzZSAgICAgICBjbGllbnRfbGlzdC0+dGFibGVbaWR4XSA9IE5VTEw7Ci0JaWYgKGVudHJ5KSB7CQkJLyogcmVtb3ZlIGVudHJ5ICovCi0JICAgIG1tX2ZyZWUoY2xpZW50X21tLCBlbnRyeSk7Ci0JICAgIG51bV9yZW1vdmVkKys7Ci0JfQotICAgIH0KLQotICAgIC8qIHVwZGF0ZSBjb3VudGVycyBhbmQgbG9nICovCi0KLSAgICBjbGllbnRfbGlzdC0+bnVtX2VudHJpZXMgLT0gbnVtX3JlbW92ZWQ7Ci0gICAgY2xpZW50X2xpc3QtPm51bV9yZW1vdmVkICs9IG51bV9yZW1vdmVkOwotCi0gICAgcmV0dXJuIG51bV9yZW1vdmVkOwotfQotCi0KLS8qCi0gKiBBZGQgYSBuZXcgY2xpZW50IHRvIHRoZSBsaXN0LiBSZXR1cm5zIHRoZSBlbnRyeSBpZiBzdWNjZXNzZnVsLCBOVUxMCi0gKiBvdGhlcndpc2UuIFRoaXMgdHJpZ2dlcnMgdGhlIGdhcmJhZ2UgY29sbGVjdGlvbiBpcyBtZW1vcnkgaXMgbG93LgotICovCi1zdGF0aWMgY2xpZW50X2VudHJ5ICphZGRfY2xpZW50KHVuc2lnbmVkIGxvbmcga2V5LCBjbGllbnRfZW50cnkgKm5ldywKLQkJCQlzZXJ2ZXJfcmVjICpzKQotewotICAgIGludCBidWNrZXQ7Ci0gICAgY2xpZW50X2VudHJ5ICplbnRyeTsKLQotCi0gICAgaWYgKCFrZXkgfHwgIWNsaWVudF9tbSkgIHJldHVybiBOVUxMOwotCi0gICAgYnVja2V0ID0ga2V5ICUgY2xpZW50X2xpc3QtPnRibF9sZW47Ci0gICAgZW50cnkgID0gY2xpZW50X2xpc3QtPnRhYmxlW2J1Y2tldF07Ci0KLSAgICBtbV9sb2NrKGNsaWVudF9tbSwgTU1fTE9DS19SVyk7Ci0KLSAgICAvKiB0cnkgdG8gYWxsb2NhdGUgYSBuZXcgZW50cnkgKi8KLQotICAgIGVudHJ5ID0gbW1fbWFsbG9jKGNsaWVudF9tbSwgc2l6ZW9mKGNsaWVudF9lbnRyeSkpOwotICAgIGlmICghZW50cnkpIHsKLQlsb25nIG51bV9yZW1vdmVkID0gZ2MoKTsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19JTkZPLCBzLAotCQkgICAgICJEaWdlc3Q6IGdjJ2QgJWxkIGNsaWVudCBlbnRyaWVzLiBUb3RhbCBuZXcgY2xpZW50czogIgotCQkgICAgICIlbGQ7IFRvdGFsIHJlbW92ZWQgY2xpZW50czogJWxkOyBUb3RhbCByZW5ld2VkIGNsaWVudHM6ICIKLQkJICAgICAiJWxkIiwgbnVtX3JlbW92ZWQsCi0JCSAgICAgY2xpZW50X2xpc3QtPm51bV9jcmVhdGVkIC0gY2xpZW50X2xpc3QtPm51bV9yZW5ld2VkLAotCQkgICAgIGNsaWVudF9saXN0LT5udW1fcmVtb3ZlZCwgY2xpZW50X2xpc3QtPm51bV9yZW5ld2VkKTsKLQllbnRyeSA9IG1tX21hbGxvYyhjbGllbnRfbW0sIHNpemVvZihjbGllbnRfZW50cnkpKTsKLQlpZiAoIWVudHJ5KSAgcmV0dXJuIE5VTEw7CS8qIGdpdmUgdXAgKi8KLSAgICB9Ci0KLSAgICAvKiBub3cgYWRkIHRoZSBlbnRyeSAqLwotCi0gICAgbWVtY3B5KGVudHJ5LCBuZXcsIHNpemVvZihjbGllbnRfZW50cnkpKTsKLSAgICBlbnRyeS0+a2V5ICA9IGtleTsKLSAgICBlbnRyeS0+bmV4dCA9IGNsaWVudF9saXN0LT50YWJsZVtidWNrZXRdOwotICAgIGNsaWVudF9saXN0LT50YWJsZVtidWNrZXRdID0gZW50cnk7Ci0gICAgY2xpZW50X2xpc3QtPm51bV9jcmVhdGVkKys7Ci0gICAgY2xpZW50X2xpc3QtPm51bV9lbnRyaWVzKys7Ci0KLSAgICBtbV91bmxvY2soY2xpZW50X21tKTsKLQotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0RFQlVHLCBzLAotCQkgImFsbG9jYXRlZCBuZXcgY2xpZW50ICVsdSIsIGtleSk7Ci0KLSAgICByZXR1cm4gZW50cnk7Ci19Ci0jZWxzZQkvKiBIQVZFX1NITUVNX01NICovCi1zdGF0aWMgY2xpZW50X2VudHJ5ICpnZXRfY2xpZW50KHVuc2lnbmVkIGxvbmcga2V5LCBjb25zdCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICByZXR1cm4gTlVMTDsKLX0KLSNlbmRpZgkvKiBIQVZFX1NITUVNX01NICovCi0KLQotLyoKLSAqIEF1dGhvcml6YXRpb24gaGVhZGVyIHBhcnNlciBjb2RlCi0gKi8KLQotLyogUGFyc2UgdGhlIEF1dGhvcml6YXRpb24gaGVhZGVyLCBpZiBpdCBleGlzdHMgKi8KLXN0YXRpYyBpbnQgZ2V0X2RpZ2VzdF9yZWMocmVxdWVzdF9yZWMgKnIsIGRpZ2VzdF9oZWFkZXJfcmVjICpyZXNwKQotewotICAgIGNvbnN0IGNoYXIgKmF1dGhfbGluZSA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLAotCQkJCQkgci0+cHJveHlyZXEgPyAiUHJveHktQXV0aG9yaXphdGlvbiIKLQkJCQkJCSAgICAgOiAiQXV0aG9yaXphdGlvbiIpOwotICAgIHNpemVfdCBsOwotICAgIGludCB2ayA9IDAsIHZ2ID0gMDsKLSAgICBjaGFyICprZXksICp2YWx1ZTsKLQotCi0gICAgaWYgKCFhdXRoX2xpbmUpIHsKLQlyZXNwLT5hdXRoX2hkcl9zdHMgPSBOT19IRUFERVI7Ci0JcmV0dXJuICFPSzsKLSAgICB9Ci0KLSAgICByZXNwLT5zY2hlbWUgPSBhcF9nZXR3b3JkX3doaXRlKHItPnBvb2wsICZhdXRoX2xpbmUpOwotICAgIGlmIChzdHJjYXNlY21wKHJlc3AtPnNjaGVtZSwgIkRpZ2VzdCIpKSB7Ci0JcmVzcC0+YXV0aF9oZHJfc3RzID0gTk9UX0RJR0VTVDsKLQlyZXR1cm4gIU9LOwotICAgIH0KLQotICAgIGwgPSBzdHJsZW4oYXV0aF9saW5lKTsKLQotICAgIGtleSAgID0gYXBfcGFsbG9jKHItPnBvb2wsIGwrMSk7Ci0gICAgdmFsdWUgPSBhcF9wYWxsb2Moci0+cG9vbCwgbCsxKTsKLQotICAgIHdoaWxlIChhdXRoX2xpbmVbMF0gIT0gJ1wwJykgewotCi0JLyogZmluZCBrZXkgKi8KLQotCXdoaWxlIChhcF9pc3NwYWNlKGF1dGhfbGluZVswXSkpIGF1dGhfbGluZSsrOwotCXZrID0gMDsKLQl3aGlsZSAoYXV0aF9saW5lWzBdICE9ICc9JyAmJiBhdXRoX2xpbmVbMF0gIT0gJywnCi0JICAgICAgICYmIGF1dGhfbGluZVswXSAhPSAnXDAnICYmICFhcF9pc3NwYWNlKGF1dGhfbGluZVswXSkpCi0JICAgIGtleVt2aysrXSA9ICphdXRoX2xpbmUrKzsKLQlrZXlbdmtdID0gJ1wwJzsKLQl3aGlsZSAoYXBfaXNzcGFjZShhdXRoX2xpbmVbMF0pKSBhdXRoX2xpbmUrKzsKLQotCS8qIGZpbmQgdmFsdWUgKi8KLQotCWlmIChhdXRoX2xpbmVbMF0gPT0gJz0nKSB7Ci0JICAgIGF1dGhfbGluZSsrOwotCSAgICB3aGlsZSAoYXBfaXNzcGFjZShhdXRoX2xpbmVbMF0pKSBhdXRoX2xpbmUrKzsKLQotCSAgICB2diA9IDA7Ci0JICAgIGlmIChhdXRoX2xpbmVbMF0gPT0gJ1wiJykgewkJLyogcXVvdGVkIHN0cmluZyAqLwotCQlhdXRoX2xpbmUrKzsKLQkJd2hpbGUgKGF1dGhfbGluZVswXSAhPSAnXCInICYmIGF1dGhfbGluZVswXSAhPSAnXDAnKSB7Ci0JCSAgICBpZiAoYXV0aF9saW5lWzBdID09ICdcXCcgJiYgYXV0aF9saW5lWzFdICE9ICdcMCcpCi0JCQlhdXRoX2xpbmUrKzsJCS8qIGVzY2FwZWQgY2hhciAqLwotCQkgICAgdmFsdWVbdnYrK10gPSAqYXV0aF9saW5lKys7Ci0JCX0KLQkJaWYgKGF1dGhfbGluZVswXSAhPSAnXDAnKSBhdXRoX2xpbmUrKzsKLQkgICAgfQotCSAgICBlbHNlIHsJCQkJIC8qIHRva2VuICovCi0JCXdoaWxlIChhdXRoX2xpbmVbMF0gIT0gJywnICYmIGF1dGhfbGluZVswXSAhPSAnXDAnCi0JCSAgICAgICAmJiAhYXBfaXNzcGFjZShhdXRoX2xpbmVbMF0pKQotCQkgICAgdmFsdWVbdnYrK10gPSAqYXV0aF9saW5lKys7Ci0JICAgIH0KLQkgICAgdmFsdWVbdnZdID0gJ1wwJzsKLQl9Ci0KLQl3aGlsZSAoYXV0aF9saW5lWzBdICE9ICcsJyAmJiBhdXRoX2xpbmVbMF0gIT0gJ1wwJykgIGF1dGhfbGluZSsrOwotCWlmIChhdXRoX2xpbmVbMF0gIT0gJ1wwJykgYXV0aF9saW5lKys7Ci0KLQlpZiAoIXN0cmNhc2VjbXAoa2V5LCAidXNlcm5hbWUiKSkKLQkgICAgcmVzcC0+dXNlcm5hbWUgPSBhcF9wc3RyZHVwKHItPnBvb2wsIHZhbHVlKTsKLQllbHNlIGlmICghc3RyY2FzZWNtcChrZXksICJyZWFsbSIpKQotCSAgICByZXNwLT5yZWFsbSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgdmFsdWUpOwotCWVsc2UgaWYgKCFzdHJjYXNlY21wKGtleSwgIm5vbmNlIikpCi0JICAgIHJlc3AtPm5vbmNlID0gYXBfcHN0cmR1cChyLT5wb29sLCB2YWx1ZSk7Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAoa2V5LCAidXJpIikpCi0JICAgIHJlc3AtPnVyaSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgdmFsdWUpOwotCWVsc2UgaWYgKCFzdHJjYXNlY21wKGtleSwgInJlc3BvbnNlIikpCi0JICAgIHJlc3AtPmRpZ2VzdCA9IGFwX3BzdHJkdXAoci0+cG9vbCwgdmFsdWUpOwotCWVsc2UgaWYgKCFzdHJjYXNlY21wKGtleSwgImFsZ29yaXRobSIpKQotCSAgICByZXNwLT5hbGdvcml0aG0gPSBhcF9wc3RyZHVwKHItPnBvb2wsIHZhbHVlKTsKLQllbHNlIGlmICghc3RyY2FzZWNtcChrZXksICJjbm9uY2UiKSkKLQkgICAgcmVzcC0+Y25vbmNlID0gYXBfcHN0cmR1cChyLT5wb29sLCB2YWx1ZSk7Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAoa2V5LCAib3BhcXVlIikpCi0JICAgIHJlc3AtPm9wYXF1ZSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgdmFsdWUpOwotCWVsc2UgaWYgKCFzdHJjYXNlY21wKGtleSwgInFvcCIpKQotCSAgICByZXNwLT5tZXNzYWdlX3FvcCA9IGFwX3BzdHJkdXAoci0+cG9vbCwgdmFsdWUpOwotCWVsc2UgaWYgKCFzdHJjYXNlY21wKGtleSwgIm5jIikpCi0JICAgIHJlc3AtPm5vbmNlX2NvdW50ID0gYXBfcHN0cmR1cChyLT5wb29sLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgaWYgKCFyZXNwLT51c2VybmFtZSB8fCAhcmVzcC0+cmVhbG0gfHwgIXJlc3AtPm5vbmNlIHx8ICFyZXNwLT51cmkKLQl8fCAhcmVzcC0+ZGlnZXN0KSB7Ci0JcmVzcC0+YXV0aF9oZHJfc3RzID0gSU5WQUxJRDsKLQlyZXR1cm4gIU9LOwotICAgIH0KLQotICAgIGlmIChyZXNwLT5vcGFxdWUpCi0JcmVzcC0+b3BhcXVlX251bSA9ICh1bnNpZ25lZCBsb25nKSBzdHJ0b2wocmVzcC0+b3BhcXVlLCBOVUxMLCAxNik7Ci0KLSAgICByZXNwLT5hdXRoX2hkcl9zdHMgPSBWQUxJRDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotLyogQmVjYXVzZSB0aGUgYnJvd3NlciBtYXkgcHJlZW1wdGl2ZWx5IHNlbmQgYXV0aCBpbmZvLCBpbmNyZW1lbnRpbmcgdGhlCi0gKiBub25jZS1jb3VudCB3aGVuIGl0IGRvZXMsIGFuZCBiZWNhdXNlIHRoZSBjbGllbnQgZG9lcyBub3QgZ2V0IG5vdGlmaWVkCi0gKiBpZiB0aGUgVVJJIGRpZG4ndCBuZWVkIGF1dGhlbnRpY2F0aW9uIGFmdGVyIGFsbCwgd2UgbmVlZCB0byBiZSBzdXJlIHRvCi0gKiB1cGRhdGUgdGhlIG5vbmNlLWNvdW50IGVhY2ggdGltZSB3ZSByZWNlaXZlIGFuIEF1dGhvcml6YXRpb24gaGVhZGVyIG5vCi0gKiBtYXR0ZXIgd2hhdCB0aGUgZmluYWwgb3V0Y29tZSBvZiB0aGUgcmVxdWVzdC4gRnVydGhlcm1vcmUgdGhpcyBpcyBhCi0gKiBjb252ZW5pZW50IHBsYWNlIHRvIGdldCB0aGUgcmVxdWVzdC11cmkgKGJlZm9yZSBhbnkgc3VicmVxdWVzdHMgZXRjCi0gKiBhcmUgaW5pdGlhdGVkKSBhbmQgdG8gaW5pdGlhbGl6ZSB0aGUgcmVxdWVzdF9jb25maWcuCi0gKgotICogTm90ZSB0aGF0IHRoaXMgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgbW9kX3Byb3h5IGhhZCBpdHMgZ28gc28gdGhhdAotICogci0+cHJveHlyZXEgaXMgc2V0IGNvcnJlY3RseS4KLSAqLwotc3RhdGljIGludCBwYXJzZV9oZHJfYW5kX3VwZGF0ZV9uYyhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBkaWdlc3RfaGVhZGVyX3JlYyAqcmVzcDsKLSAgICBpbnQgcmVzOwotCi0gICAgaWYgKCFhcF9pc19pbml0aWFsX3JlcShyKSkKLQlyZXR1cm4gREVDTElORUQ7Ci0KLSAgICByZXNwID0gYXBfcGNhbGxvYyhyLT5wb29sLCBzaXplb2YoZGlnZXN0X2hlYWRlcl9yZWMpKTsKLSAgICByZXNwLT5yZXF1ZXN0X3VyaSA9ICZyLT5wYXJzZWRfdXJpOwotICAgIHJlc3AtPm5lZWRlZF9hdXRoID0gMDsKLSAgICBhcF9zZXRfbW9kdWxlX2NvbmZpZyhyLT5yZXF1ZXN0X2NvbmZpZywgJmRpZ2VzdF9hdXRoX21vZHVsZSwgcmVzcCk7Ci0KLSAgICByZXMgPSBnZXRfZGlnZXN0X3JlYyhyLCByZXNwKTsKLSAgICByZXNwLT5jbGllbnQgPSBnZXRfY2xpZW50KHJlc3AtPm9wYXF1ZV9udW0sIHIpOwotICAgIGlmIChyZXMgPT0gT0sgJiYgcmVzcC0+Y2xpZW50KQotCXJlc3AtPmNsaWVudC0+bm9uY2VfY291bnQrKzsKLQotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotCi0vKgotICogTm9uY2UgZ2VuZXJhdGlvbiBjb2RlCi0gKi8KLQotLyogVGhlIGhhc2ggcGFydCBvZiB0aGUgbm9uY2UgaXMgYSBTSEEtMSBoYXNoIG9mIHRoZSB0aW1lLCByZWFsbSwgb3BhcXVlLAotICogYW5kIG91ciBzZWNyZXQuCi0gKi8KLXN0YXRpYyB2b2lkIGdlbl9ub25jZV9oYXNoKGNoYXIgKmhhc2gsIGNvbnN0IGNoYXIgKnRpbWVzdHIsIGNvbnN0IGNoYXIgKm9wYXF1ZSwKLQkJCSAgIGNvbnN0IHNlcnZlcl9yZWMgKnNlcnZlciwKLQkJCSAgIGNvbnN0IGRpZ2VzdF9jb25maWdfcmVjICpjb25mKQotewotICAgIGNvbnN0IGNoYXIgKmhleCA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKLSAgICB1bnNpZ25lZCBjaGFyIHNoYTFbU0hBX0RJR0VTVFNJWkVdOwotICAgIEFQX1NIQTFfQ1RYIGN0eDsKLSAgICBpbnQgaWR4OwotCi0gICAgbWVtY3B5KCZjdHgsICZjb25mLT5ub25jZV9jdHgsIHNpemVvZihjdHgpKTsKLSAgICBhcF9TSEExVXBkYXRlX2JpbmFyeSgmY3R4LCAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBzZXJ2ZXItPnNlcnZlcl9ob3N0bmFtZSwKLQkJCSBzdHJsZW4oc2VydmVyLT5zZXJ2ZXJfaG9zdG5hbWUpKTsKLSAgICBhcF9TSEExVXBkYXRlX2JpbmFyeSgmY3R4LCAoY29uc3QgdW5zaWduZWQgY2hhciAqKSAmc2VydmVyLT5wb3J0LAotCQkJIHNpemVvZihzZXJ2ZXItPnBvcnQpKTsKLSAgICBhcF9TSEExVXBkYXRlX2JpbmFyeSgmY3R4LCAoY29uc3QgdW5zaWduZWQgY2hhciAqKSB0aW1lc3RyLCBzdHJsZW4odGltZXN0cikpOwotICAgIGlmIChvcGFxdWUpCi0JYXBfU0hBMVVwZGF0ZV9iaW5hcnkoJmN0eCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgb3BhcXVlLAotCQkJICAgICBzdHJsZW4ob3BhcXVlKSk7Ci0gICAgYXBfU0hBMUZpbmFsKHNoYTEsICZjdHgpOwotCi0gICAgZm9yIChpZHg9MDsgaWR4PFNIQV9ESUdFU1RTSVpFOyBpZHgrKykgewotCSpoYXNoKysgPSBoZXhbc2hhMVtpZHhdID4+IDRdOwotCSpoYXNoKysgPSBoZXhbc2hhMVtpZHhdICYgMHhGXTsKLSAgICB9Ci0KLSAgICAqaGFzaCsrID0gJ1wwJzsKLX0KLQotCi0vKiBUaGUgbm9uY2UgaGFzIHRoZSBmb3JtYXQgYjY0KHRpbWUpK2hhc2ggLgotICovCi1zdGF0aWMgY29uc3QgY2hhciAqZ2VuX25vbmNlKGFwX2NvbnRleHRfdCAqcCwgdGltZV90IG5vdywgY29uc3QgY2hhciAqb3BhcXVlLAotCQkJICAgICBjb25zdCBzZXJ2ZXJfcmVjICpzZXJ2ZXIsCi0JCQkgICAgIGNvbnN0IGRpZ2VzdF9jb25maWdfcmVjICpjb25mKQotewotICAgIGNoYXIgKm5vbmNlID0gYXBfcGFsbG9jKHAsIE5PTkNFX0xFTisxKTsKLSAgICB0aW1lX3JlYyB0OwotCi0gICAgaWYgKGNvbmYtPm5vbmNlX2xpZmV0aW1lICE9IDApCi0JdC50aW1lID0gbm93OwotICAgIGVsc2UKLSNpZmRlZiBIQVZFX1NITUVNX01NCi0JLyogdGhpcyBjb3VudGVyIGlzIG5vdCBzeW5jaCdkLCBiZWNhdXNlIGl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlcgotCSAqIGlmIGl0IGNvdW50cyBleGFjdGx5LgotCSAqLwotCXQudGltZSA9ICgqb3RuX2NvdW50ZXIpKys7Ci0jZWxzZQkvKiBIQVZFX1NITUVNX01NICovCi0JdC50aW1lID0gNDI7Ci0jZW5kaWYJLyogSEFWRV9TSE1FTV9NTSAqLwotICAgIGFwX2Jhc2U2NGVuY29kZV9iaW5hcnkobm9uY2UsIHQuYXJyLCBzaXplb2YodC5hcnIpKTsKLSAgICBnZW5fbm9uY2VfaGFzaChub25jZStOT05DRV9USU1FX0xFTiwgbm9uY2UsIG9wYXF1ZSwgc2VydmVyLCBjb25mKTsKLQotICAgIHJldHVybiBub25jZTsKLX0KLQotCi0vKgotICogT3BhcXVlIGFuZCBoYXNoLXRhYmxlIG1hbmFnZW1lbnQKLSAqLwotCi0jaWZkZWYgSEFWRV9TSE1FTV9NTQotLyoKLSAqIEdlbmVyYXRlIGEgbmV3IGNsaWVudCBlbnRyeSwgYWRkIGl0IHRvIHRoZSBsaXN0LCBhbmQgcmV0dXJuIHRoZQotICogZW50cnkuIFJldHVybnMgTlVMTCBpZiBmYWlsZWQuCi0gKi8KLXN0YXRpYyBjbGllbnRfZW50cnkgKmdlbl9jbGllbnQoY29uc3QgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgdW5zaWduZWQgbG9uZyBvcDsKLSAgICBjbGllbnRfZW50cnkgbmV3ID0geyAwLCBOVUxMLCAwLCAiIiwgIiIgfSwgKmVudHJ5OwotCi0gICAgaWYgKCFvcGFxdWVfbW0pICByZXR1cm4gMDsKLQotICAgIG1tX2xvY2sob3BhcXVlX21tLCBNTV9MT0NLX1JXKTsKLSAgICBvcCA9ICgqb3BhcXVlX2NudHIpKys7Ci0gICAgbW1fdW5sb2NrKG9wYXF1ZV9tbSk7Ci0KLSAgICBpZiAoIShlbnRyeSA9IGFkZF9jbGllbnQob3AsICZuZXcsIHItPnNlcnZlcikpKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIDAsIHIsCi0JCSAgICAgICJEaWdlc3Q6IGZhaWxlZCB0byBhbGxvY2F0ZSBjbGllbnQgZW50cnkgLSBpZ25vcmluZyAiCi0JCSAgICAgICJjbGllbnQiKTsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZW50cnk7Ci19Ci0jZWxzZQkvKiBIQVZFX1NITUVNX01NICovCi1zdGF0aWMgY2xpZW50X2VudHJ5ICpnZW5fY2xpZW50KGNvbnN0IHJlcXVlc3RfcmVjICpyKSB7IHJldHVybiBOVUxMOyB9Ci0jZW5kaWYJLyogSEFWRV9TSE1FTV9NTSAqLwotCi0KLQotLyoKLSAqIE1ENS1zZXNzIGNvZGUuCi0gKgotICogSWYgeW91IHdhbnQgdG8gdXNlIGFsZ29yaXRobT1NRDUtc2VzcyB5b3UgbXVzdCB3cml0ZSBnZXRfdXNlcnB3X2hhc2goKQotICogeW91cnNlbGYgKHNlZSBiZWxvdykuIFRoZSBkdW1teSBwcm92aWRlZCBoZXJlIGp1c3QgcmV0dXJucyB0aGUgaGFzaAotICogZnJvbSB0aGUgYXV0aC1maWxlLCBpLmUuIGl0IGlzIG9ubHkgdXNlZnVsIGZvciB0ZXN0aW5nIGNsaWVudAotICogaW1wbGVtZW50YXRpb25zIG9mIE1ENS1zZXNzIC4KLSAqLwotCi0vKgotICogZ2V0X3VzZXJwd19oYXNoKCkgd2lsbCBiZSBjYWxsZWQgZWFjaCB0aW1lIGEgbmV3IHNlc3Npb24gbmVlZHMgdG8gYmUKLSAqIGdlbmVyYXRlZCBhbmQgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIHRoZSBlcXVpdmFsZW50IG9mCi0gKgotICogYXBfbWQ1KHItPnBvb2wsCi0gKiAgICAgICAgYXBfcHN0cmNhdChyLT5wb29sLCB1c2VybmFtZSwgIjoiLCBhcF9hdXRoX25hbWUociksICI6IiwgcGFzc3dkKSkKLSAqCi0gKiBZb3UgbXVzdCBpbXBsZW1lbnQgdGhpcyB5b3Vyc2VsZiwgYW5kIHdpbGwgcHJvYmFibHkgY29uc2lzdCBvZiBjb2RlCi0gKiBjb250YWN0aW5nIHRoZSBwYXNzd29yZCBzZXJ2ZXIgYW5kIHJldHJpZXZpbmcgdGhlIGhhc2ggZnJvbSBpdC4KLSAqCi0gKiBUQkQ6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIHByb2JhYmx5IGJlIGluIGEgc2VwZXJhdGUgc291cmNlIGZpbGUgc28gdGhhdAotICogcGVvcGxlIG5lZWQgbm90IG1vZGlmeSBtb2RfYXV0aF9kaWdlc3QuYyBlYWNoIHRpbWUgdGhleSBpbnN0YWxsIGEgbmV3IHZlcnNpb24KLSAqIG9mIGFwYWNoZS4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmdldF91c2VycHdfaGFzaChjb25zdCByZXF1ZXN0X3JlYyAqciwKLQkJCQkgICBjb25zdCBkaWdlc3RfaGVhZGVyX3JlYyAqcmVzcCwKLQkJCQkgICBjb25zdCBkaWdlc3RfY29uZmlnX3JlYyAqY29uZikKLXsKLSAgICAvKiBmb3Igbm93LCBqdXN0IGdldCBpdCBmcm9tIHB3ZmlsZSAqLwotICAgIHJldHVybiBjb25mLT5oYTE7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmdldF9zZXNzaW9uKGNvbnN0IHJlcXVlc3RfcmVjICpyLAotCQkJICAgICAgIGRpZ2VzdF9oZWFkZXJfcmVjICpyZXNwLAotCQkJICAgICAgIGNvbnN0IGRpZ2VzdF9jb25maWdfcmVjICpjb25mKQotewotICAgIGNvbnN0IGNoYXIgKmhhMSA9IE5VTEwsICp1cnA7Ci0KLSAgICAvKiBnZXQgaGExIGZyb20gY2xpZW50IGxpc3QgKi8KLSAgICBpZiAocmVzcC0+b3BhcXVlICYmIHJlc3AtPmNsaWVudCkKLQloYTEgPSByZXNwLT5jbGllbnQtPmhhMTsKLQotICAgIC8qIGdlbmVyYXRlIG5ldyBzZXNzaW9uIGlmIG5lY2Vzc2FyeSAqLwotICAgIGlmIChoYTEgPT0gTlVMTCB8fCBoYTFbMF0gPT0gJ1wwJykgewotCXVycCA9IGdldF91c2VycHdfaGFzaChyLCByZXNwLCBjb25mKTsKLQloYTEgPSBhcF9tZDUoci0+cG9vbCwKLQkJICAgICAodW5zaWduZWQgY2hhciAqKSBhcF9wc3RyY2F0KHItPnBvb2wsIHVycCwgIjoiLCByZXNwLT5ub25jZSwKLQkJCQkJCSAgIjoiLCByZXNwLT5jbm9uY2UsIE5VTEwpKTsKLQlpZiAoIXJlc3AtPmNsaWVudCkKLQkgICAgcmVzcC0+Y2xpZW50ID0gZ2VuX2NsaWVudChyKTsKLQlpZiAocmVzcC0+Y2xpZW50KQotCSAgICBtZW1jcHkocmVzcC0+Y2xpZW50LT5oYTEsIGhhMSwgc2l6ZW9mKHJlc3AtPmNsaWVudC0+aGExKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGhhMTsKLX0KLQotCi1zdGF0aWMgdm9pZCBjbGVhcl9zZXNzaW9uKGNvbnN0IGRpZ2VzdF9oZWFkZXJfcmVjICpyZXNwKQotewotICAgIGlmIChyZXNwLT5jbGllbnQpCi0JcmVzcC0+Y2xpZW50LT5oYTFbMF0gPSAnXDAnOwotfQotCi0KLS8qCi0gKiBBdXRob3JpemF0aW9uIGNoYWxsZW5nZSBnZW5lcmF0aW9uIGNvZGUgKGZvciBXV1ctQXV0aGVudGljYXRlKQotICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpndWVzc19kb21haW4oYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyICp1cmksCi0JCQkJY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmRpcikKLXsKLSAgICBzaXplX3QgdV9sZW4gPSBzdHJsZW4odXJpKSwgZl9sZW4gPSBzdHJsZW4oZmlsZW5hbWUpLCBkX2xlbiA9IHN0cmxlbihkaXIpOwotICAgIGNvbnN0IGNoYXIgKnUsICpmOwotCi0KLSAgICAvKiBCZWNhdXNlIG9mIHRoaW5ncyBsaWtlIG1vZF9hbGlhcyBhbmQgbW9kX3Jld3JpdGUgYW5kIHRoZSBmYWN0IHRoYXQKLSAgICAgKiBwcm90ZWN0aW9uIGlzIG9mdGVuIG9uIGEgZGlyZWN0b3J5IGJhc2lzIChub3QgYSBsb2NhdGlvbiBiYXNpcykgaXQKLSAgICAgKiBpcyBoYXJkIHRvIGRldGVybWluZSB0aGUgdXJpIHRvIHB1dCBpbiB0aGUgZG9tYWluIGF0dHJpYnV0ZS4KLSAgICAgKgotICAgICAqIFdoYXQgd2UgZG8gaXMgdGhlIGZvbGxvd2luZzogZmlyc3Qgd2Ugc2VlIGlmIHRoZSBkaXJlY3RvcnkgaXMKLSAgICAgKiBhIHByZWZpeCBmb3IgdGhlIHVyaSAtIGlmIHRoaXMgaXMgdGhlIGNhc2Ugd2UgYXNzdW1lIHRoYXQgdGhlcmVmb3JlCi0gICAgICogYSA8TG9jYXRpb24+IGRpcmVjdGl2ZSB3YXMgcHJvdGVjdGluZyB0aGlzIHVyaSBhbmQgd2UgY2FuIHVzZSBpdAotICAgICAqIGZvciB0aGUgZG9tYWluLgotICAgICAqLwotICAgIGlmICh1X2xlbiA+PSBkX2xlbiAmJiAhbWVtY21wKHVyaSwgZGlyLCBkX2xlbikpCi0JcmV0dXJuIGRpcjsKLQotICAgIC8qIE5vdyB3ZSBjaGVjayBmb3IgPEZpbGVzIC4uLj4sIGFuZCBpZiB3ZSBmaW5kIG9uZSB3ZSBzZW5kIGJhY2sgYQotICAgICAqIGR1bW15IHVyaSAtIHRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvIHNwZWNpZnkgdGhhdCB0aGUgcHJvdGVjdGlvbgotICAgICAqIHNwYWNlIG9ubHkgY292ZXJzIGEgc2luZ2xlIHVyaS4KLSAgICAgKi8KLSAgICBpZiAoZGlyWzBdICE9ICcvJykKLQkvKiBUaGlzIGRvZXNuJ3Qgd29yayBmb3IgQW1heWEgKG9rLCBpdCdzIG9mIGFyZ3VhYmxlIHZhbGlkaXR5IGluCi0JICogdGhlIGZpcnN0IHBsYWNlKSwgc28ganVzdCByZXR1cm4gdGhlIGZpbGUgbmFtZSBpbnN0ZWFkCi0JcmV0dXJuICJodHRwOi8vMC4wLjAuMC8iOwotCSAqLwotCXJldHVybiBkaXI7Ci0KLSAgICAvKiBOZXh0IHdlIGZpbmQgdGhlIGxhcmdlc3QgY29tbW9uIGNvbW1vbiBzdWZmaXggb2YgdGhlIHJlcXVlc3QtdXJpCi0gICAgICogYW5kIHRoZSBmaW5hbCBmaWxlIG5hbWUsIGlnbm9yaW5nIGFueSBleHRlbnNpb25zOyB0aGlzIGdpdmVzIHVzIGEKLSAgICAgKiBoaW50IGFzIHRvIHdoZXJlIGFueSByZXdyaXRpbmcgY291bGQndmUgb2NjdXJlZCAoYXNzdW1pbmcgdGhhdCBzb21lCi0gICAgICogcHJlZml4IG9mIHRoZSB1cmkgaXMgcmV3cml0dGVuLCBub3QgYSBzdWZmaXgpLgotICAgICAqLwotICAgIHUgPSB1cmkgKyB1X2xlbiAtIDE7CS8qIHN0cmlwIGFueSBleHRlbnNpb24gKi8KLSAgICB3aGlsZSAodSA+IHVyaSAmJiAqdSAhPSAnLycpICB1LS07Ci0gICAgd2hpbGUgKCp1ICYmICp1ICE9ICcuJykgIHUrKzsKLSAgICBpZiAoKnUgPT0gJy4nKSAgdS0tOwotICAgIGlmICgqdSA9PSAnLycpICB1LS07Ci0KLSAgICBmID0gZmlsZW5hbWUgKyBmX2xlbiAtIDE7CS8qIHN0cmlwIGFueSBleHRlbnNpb24gKi8KLSAgICB3aGlsZSAoZiA+IGZpbGVuYW1lICYmICpmICE9ICcvJykgIGYtLTsKLSAgICB3aGlsZSAoKmYgJiYgKmYgIT0gJy4nKSAgZisrOwotICAgIGlmICgqZiA9PSAnLicpICBmLS07Ci0gICAgaWYgKCpmID09ICcvJykgIGYtLTsKLQotICAgIHdoaWxlICgqZiA9PSAqdSAmJiBmID4gZmlsZW5hbWUgJiYgdSA+IHVyaSkgIHUtLSwgZi0tOwotICAgIGYrKzsgdSsrOwotCi0gICAgd2hpbGUgKCpmICYmICpmICE9ICcvJykgIGYrKywgdSsrOwkvKiBzdWZmaXggbXVzdCBzdGFydCB3aXRoIC8gKi8KLQotICAgIC8qIE5vdywgaWYgdGhlIGRpcmVjdG9yeSByZWFjaGVzIGludG8gdGhpcyBjb21tb24gc3VmZml4IHRoZW4gd2UgY2FuCi0gICAgICogdGFrZSB0aGUgdXJpIHdpdGggdGhlIHNhbWUgcmVhY2guCi0gICAgICovCi0gICAgaWYgKCh1bnNpZ25lZCBsb25nKSAoZi1maWxlbmFtZSkgPCBkX2xlbikgewotCWNoYXIgKnRtcCA9IGFwX3BzdHJkdXAocCwgdXJpKTsKLQl0bXBbKHUtdXJpKSsoZF9sZW4tKGYtZmlsZW5hbWUpKV0gPSAnXDAnOwotCXJldHVybiB0bXA7Ci0gICAgfQotCi0gICAgcmV0dXJuICIiOwkvKiBnaXZlIHVwICovCi19Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmx0b3goYXBfY29udGV4dF90ICpwLCB1bnNpZ25lZCBsb25nIG51bSkKLXsKLSAgICBpZiAobnVtICE9IDApCi0JcmV0dXJuIGFwX3BzcHJpbnRmKHAsICIlbHgiLCBudW0pOwotICAgIGVsc2UKLQlyZXR1cm4gIiI7Ci19Ci0KLXN0YXRpYyB2b2lkIG5vdGVfZGlnZXN0X2F1dGhfZmFpbHVyZShyZXF1ZXN0X3JlYyAqciwKLQkJCQkgICAgIGNvbnN0IGRpZ2VzdF9jb25maWdfcmVjICpjb25mLAotCQkJCSAgICAgZGlnZXN0X2hlYWRlcl9yZWMgKnJlc3AsIGludCBzdGFsZSkKLXsKLSAgICBjb25zdCBjaGFyICAgKnFvcCwgKm9wYXF1ZSwgKm9wYXF1ZV9wYXJhbSwgKmRvbWFpbiwgKm5vbmNlOwotICAgIGludCAgICAgICAgICAgY250OwotCi0KLSAgICAvKiBTZXR1cCBxb3AgKi8KLQotICAgIGlmIChjb25mLT5xb3BfbGlzdFswXSA9PSBOVUxMKQotCXFvcCA9ICIsIHFvcD1cImF1dGhcIiI7Ci0gICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAoY29uZi0+cW9wX2xpc3RbMF0sICJub25lIikpCi0JcW9wID0gIiI7Ci0gICAgZWxzZSB7Ci0JcW9wID0gYXBfcHN0cmNhdChyLT5wb29sLCAiLCBxb3A9XCIiLCBjb25mLT5xb3BfbGlzdFswXSwgTlVMTCk7Ci0JZm9yIChjbnQ9MTsgY29uZi0+cW9wX2xpc3RbY250XSAhPSBOVUxMOyBjbnQrKykKLQkgICAgcW9wID0gYXBfcHN0cmNhdChyLT5wb29sLCBxb3AsICIsIiwgY29uZi0+cW9wX2xpc3RbY250XSwgTlVMTCk7Ci0JcW9wID0gYXBfcHN0cmNhdChyLT5wb29sLCBxb3AsICJcIiIsIE5VTEwpOwotICAgIH0KLQotICAgIC8qIE1ENS1zZXNzIHN0dWZmICovCi0KLSAgICBpZiAoIXN0YWxlICYmICFzdHJjYXNlY21wKGNvbmYtPmFsZ29yaXRobSwgIk1ENS1zZXNzIikpCi0JY2xlYXJfc2Vzc2lvbihyZXNwKTsKLQotICAgIC8qIFNldHVwIG9wYXF1ZSAqLwotCi0gICAgaWYgKHJlc3AtPm9wYXF1ZSA9PSBOVUxMKSB7Ci0JLyogbmV3IGNsaWVudCAqLwotCWlmICgoY29uZi0+Y2hlY2tfbmMgfHwgY29uZi0+bm9uY2VfbGlmZXRpbWUgPT0gMAotCSAgICAgfHwgIXN0cmNhc2VjbXAoY29uZi0+YWxnb3JpdGhtLCAiTUQ1LXNlc3MiKSkKLQkgICAgJiYgKHJlc3AtPmNsaWVudCA9IGdlbl9jbGllbnQocikpICE9IE5VTEwpCi0JICAgIG9wYXF1ZSA9IGx0b3goci0+cG9vbCwgcmVzcC0+Y2xpZW50LT5rZXkpOwotCWVsc2UKLQkgICAgb3BhcXVlID0gIiI7CQkvKiBvcGFxdWUgbm90IG5lZWRlZCAqLwotICAgIH0KLSAgICBlbHNlIGlmIChyZXNwLT5jbGllbnQgPT0gTlVMTCkgewotCS8qIGNsaWVudCBpbmZvIHdhcyBnYydkICovCi0JcmVzcC0+Y2xpZW50ID0gZ2VuX2NsaWVudChyKTsKLQlpZiAocmVzcC0+Y2xpZW50ICE9IE5VTEwpIHsKLQkgICAgb3BhcXVlID0gbHRveChyLT5wb29sLCByZXNwLT5jbGllbnQtPmtleSk7Ci0JICAgIHN0YWxlID0gMTsKLQkgICAgY2xpZW50X2xpc3QtPm51bV9yZW5ld2VkKys7Ci0JfQotCWVsc2UKLQkgICAgb3BhcXVlID0gIiI7CQkvKiA/Pz8gKi8KLSAgICB9Ci0gICAgZWxzZSB7Ci0Jb3BhcXVlID0gcmVzcC0+b3BhcXVlOwotCS8qIHdlJ3JlIGdlbmVyYXRpbmcgYSBuZXcgbm9uY2UsIHNvIHJlc2V0IHRoZSBub25jZS1jb3VudCAqLwotCXJlc3AtPmNsaWVudC0+bm9uY2VfY291bnQgPSAwOwotICAgIH0KLQotICAgIGlmIChvcGFxdWVbMF0pCi0Jb3BhcXVlX3BhcmFtID0gYXBfcHN0cmNhdChyLT5wb29sLCAiLCBvcGFxdWU9XCIiLCBvcGFxdWUsICJcIiIsIE5VTEwpOwotICAgIGVsc2UKLQlvcGFxdWVfcGFyYW0gPSBOVUxMOwotCi0gICAgLyogU2V0dXAgbm9uY2UgKi8KLQotICAgIG5vbmNlID0gZ2VuX25vbmNlKHItPnBvb2wsIHItPnJlcXVlc3RfdGltZSwgb3BhcXVlLCByLT5zZXJ2ZXIsIGNvbmYpOwotICAgIGlmIChyZXNwLT5jbGllbnQgJiYgY29uZi0+bm9uY2VfbGlmZXRpbWUgPT0gMCkKLQltZW1jcHkocmVzcC0+Y2xpZW50LT5sYXN0X25vbmNlLCBub25jZSwgTk9OQ0VfTEVOKzEpOwotCi0gICAgLyogc2V0dXAgZG9tYWluIGF0dHJpYnV0ZS4gV2Ugd2FudCB0byBzZW5kIHRoaXMgYXR0cmlidXRlIHdoZXJldmVyCi0gICAgICogcG9zc2libGUgc28gdGhhdCB0aGUgY2xpZW50IHdvbid0IHNlbmQgdGhlIEF1dGhvcml6YXRpb24gaGVhZGVyCi0gICAgICogdW5uZWNjZXNzYXJpbHkgKGl0J3MgdXN1YWxseSA+IDIwMCBieXRlcyEpLgotICAgICAqLwotCi0gICAgaWYgKHItPnByb3h5cmVxKQotCWRvbWFpbiA9IE5VTEw7CS8qIGRvbid0IHNlbmQgZG9tYWluIGZvciBwcm94eSByZXF1ZXN0cyAqLwotICAgIGVsc2UgaWYgKGNvbmYtPnVyaV9saXN0KQotCWRvbWFpbiA9IGNvbmYtPnVyaV9saXN0OwotICAgIGVsc2UgewotCS8qIFRoZXkgZGlkbid0IHNwZWNpZnkgYW55IGRvbWFpbiwgc28gbGV0J3MgZ3Vlc3MgYXQgaXQgKi8KLQlkb21haW4gPSBndWVzc19kb21haW4oci0+cG9vbCwgcmVzcC0+cmVxdWVzdF91cmktPnBhdGgsIHItPmZpbGVuYW1lLAotCQkJICAgICAgY29uZi0+ZGlyX25hbWUpOwotCWlmIChkb21haW5bMF0gPT0gJy8nICYmIGRvbWFpblsxXSA9PSAnXDAnKQotCSAgICBkb21haW4gPSBOVUxMOwkvKiAiLyIgaXMgdGhlIGRlZmF1bHQsIHNvIG5vIG5lZWQgdG8gc2VuZCBpdCAqLwotCWVsc2UKLQkgICAgZG9tYWluID0gYXBfcHN0cmNhdChyLT5wb29sLCAiLCBkb21haW49XCIiLCBkb21haW4sICJcIiIsIE5VTEwpOwotICAgIH0KLQotICAgIGFwX3RhYmxlX21lcmdlbihyLT5lcnJfaGVhZGVyc19vdXQsCi0JCSAgICByLT5wcm94eXJlcSA/ICJQcm94eS1BdXRoZW50aWNhdGUiIDogIldXVy1BdXRoZW50aWNhdGUiLAotCQkgICAgYXBfcHNwcmludGYoci0+cG9vbCwgIkRpZ2VzdCByZWFsbT1cIiVzXCIsIG5vbmNlPVwiJXNcIiwgIgotCQkJCQkgImFsZ29yaXRobT0lcyVzJXMlcyVzIiwKLQkJCQlhcF9hdXRoX25hbWUociksIG5vbmNlLCBjb25mLT5hbGdvcml0aG0sCi0JCQkJb3BhcXVlX3BhcmFtID8gb3BhcXVlX3BhcmFtIDogIiIsCi0JCQkJZG9tYWluID8gZG9tYWluIDogIiIsCi0JCQkJc3RhbGUgPyAiLCBzdGFsZT10cnVlIiA6ICIiLCBxb3ApKTsKLX0KLQotCi0vKgotICogQXV0aG9yaXphdGlvbiBoZWFkZXIgdmVyaWZpY2F0aW9uIGNvZGUKLSAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqZ2V0X2hhc2gocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKnVzZXIsCi0JCQkgICAgY29uc3QgY2hhciAqcmVhbG0sIGNvbnN0IGNoYXIgKmF1dGhfcHdmaWxlKQotewotICAgIGNvbmZpZ2ZpbGVfdCAqZjsKLSAgICBjaGFyIGxbTUFYX1NUUklOR19MRU5dOwotICAgIGNvbnN0IGNoYXIgKnJwdzsKLSAgICBjaGFyICp3LCAqeDsKLSAgICBhcF9zdGF0dXNfdCBzdHM7Ci0KLSAgICBpZiAoKHN0cyA9IGFwX3BjZmdfb3BlbmZpbGUoJmYsIHItPnBvb2wsIGF1dGhfcHdmaWxlKSkgIT0gQVBSX1NVQ0NFU1MpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHIsCi0JCSAgICAgICJEaWdlc3Q6IENvdWxkIG5vdCBvcGVuIHBhc3N3b3JkIGZpbGU6ICVzIiwgYXV0aF9wd2ZpbGUpOwotCXJldHVybiBOVUxMOwotICAgIH0KLSAgICB3aGlsZSAoIShhcF9jZmdfZ2V0bGluZShsLCBNQVhfU1RSSU5HX0xFTiwgZikpKSB7Ci0JaWYgKChsWzBdID09ICcjJykgfHwgKCFsWzBdKSkKLQkgICAgY29udGludWU7Ci0JcnB3ID0gbDsKLQl3ID0gYXBfZ2V0d29yZChyLT5wb29sLCAmcnB3LCAnOicpOwotCXggPSBhcF9nZXR3b3JkKHItPnBvb2wsICZycHcsICc6Jyk7Ci0KLQlpZiAoeCAmJiB3ICYmICFzdHJjbXAodXNlciwgdykgJiYgIXN0cmNtcChyZWFsbSwgeCkpIHsKLQkgICAgYXBfY2ZnX2Nsb3NlZmlsZShmKTsKLQkgICAgcmV0dXJuIGFwX3BzdHJkdXAoci0+cG9vbCwgcnB3KTsKLQl9Ci0gICAgfQotICAgIGFwX2NmZ19jbG9zZWZpbGUoZik7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2tfbmMoY29uc3QgcmVxdWVzdF9yZWMgKnIsIGNvbnN0IGRpZ2VzdF9oZWFkZXJfcmVjICpyZXNwLAotCQkgICAgY29uc3QgZGlnZXN0X2NvbmZpZ19yZWMgKmNvbmYpCi17Ci0gICAgaWYgKGNvbmYtPmNoZWNrX25jICYmIGNsaWVudF9tbSkgewotCXVuc2lnbmVkIGxvbmcgbmM7Ci0KLQljb25zdCBjaGFyICpzbmMgPSByZXNwLT5ub25jZV9jb3VudDsKLQljaGFyICplbmRwdHI7Ci0KLQluYyA9IHN0cnRvbChzbmMsICZlbmRwdHIsIDE2KTsKLQlpZiAoZW5kcHRyIDwgKHNuYytzdHJsZW4oc25jKSkgJiYgIWFwX2lzc3BhY2UoKmVuZHB0cikpIHsKLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLQkJCSAgIkRpZ2VzdDogaW52YWxpZCBuYyAlcyByZWNlaXZlZCAtIG5vdCBhIG51bWJlciIsIHNuYyk7Ci0JICAgIHJldHVybiAhT0s7Ci0JfQotCi0JaWYgKCFyZXNwLT5jbGllbnQpCi0JICAgIHJldHVybiAhT0s7Ci0KLQlpZiAobmMgIT0gcmVzcC0+Y2xpZW50LT5ub25jZV9jb3VudCkgewotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfREVCVUcsIDAsIHIsCi0JCQkgICJub25jZS1jb3VudCBjaGVjayBmYWlsZWQ6ICVsdSAhPSAlbHUiLCBuYywKLQkJCSAgcmVzcC0+Y2xpZW50LT5ub25jZV9jb3VudCk7Ci0JICAgIHJldHVybiAhT0s7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdGljIGludCBjaGVja19ub25jZShyZXF1ZXN0X3JlYyAqciwgZGlnZXN0X2hlYWRlcl9yZWMgKnJlc3AsCi0JCSAgICAgICBjb25zdCBkaWdlc3RfY29uZmlnX3JlYyAqY29uZikKLXsKLSAgICBkb3VibGUgZHQ7Ci0gICAgdGltZV9yZWMgbm9uY2VfdGltZTsKLSAgICBjaGFyIHRtcCwgaGFzaFtOT05DRV9IQVNIX0xFTisxXTsKLQotICAgIGlmIChzdHJsZW4ocmVzcC0+bm9uY2UpICE9IE5PTkNFX0xFTikgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0JCSAgICAgICJEaWdlc3Q6IGludmFsaWQgbm9uY2UgJXMgcmVjZWl2ZWQgLSBsZW5ndGggaXMgbm90ICVkIiwKLQkJICAgICAgcmVzcC0+bm9uY2UsIE5PTkNFX0xFTik7Ci0Jbm90ZV9kaWdlc3RfYXV0aF9mYWlsdXJlKHIsIGNvbmYsIHJlc3AsIDEpOwotCXJldHVybiBBVVRIX1JFUVVJUkVEOwotICAgIH0KLQotICAgIHRtcCA9IHJlc3AtPm5vbmNlW05PTkNFX1RJTUVfTEVOXTsKLSAgICByZXNwLT5ub25jZVtOT05DRV9USU1FX0xFTl0gPSAnXDAnOwotICAgIGFwX2Jhc2U2NGRlY29kZV9iaW5hcnkobm9uY2VfdGltZS5hcnIsIHJlc3AtPm5vbmNlKTsKLSAgICBnZW5fbm9uY2VfaGFzaChoYXNoLCByZXNwLT5ub25jZSwgcmVzcC0+b3BhcXVlLCByLT5zZXJ2ZXIsIGNvbmYpOwotICAgIHJlc3AtPm5vbmNlW05PTkNFX1RJTUVfTEVOXSA9IHRtcDsKLSAgICByZXNwLT5ub25jZV90aW1lID0gbm9uY2VfdGltZS50aW1lOwotCi0gICAgaWYgKHN0cmNtcChoYXNoLCByZXNwLT5ub25jZStOT05DRV9USU1FX0xFTikpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotCQkgICAgICAiRGlnZXN0OiBpbnZhbGlkIG5vbmNlICVzIHJlY2VpdmVkIC0gaGFzaCBpcyBub3QgJXMiLAotCQkgICAgICByZXNwLT5ub25jZSwgaGFzaCk7Ci0Jbm90ZV9kaWdlc3RfYXV0aF9mYWlsdXJlKHIsIGNvbmYsIHJlc3AsIDEpOwotCXJldHVybiBBVVRIX1JFUVVJUkVEOwotICAgIH0KLQotICAgIGR0ID0gZGlmZnRpbWUoci0+cmVxdWVzdF90aW1lLCBub25jZV90aW1lLnRpbWUpOwotICAgIGlmIChjb25mLT5ub25jZV9saWZldGltZSA+IDAgJiYgZHQgPCAwKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLQkJICAgICAgIkRpZ2VzdDogaW52YWxpZCBub25jZSAlcyByZWNlaXZlZCAtIHVzZXIgYXR0ZW1wdGVkICIKLQkJICAgICAgInRpbWUgdHJhdmVsIiwgcmVzcC0+bm9uY2UpOwotCW5vdGVfZGlnZXN0X2F1dGhfZmFpbHVyZShyLCBjb25mLCByZXNwLCAxKTsKLQlyZXR1cm4gQVVUSF9SRVFVSVJFRDsKLSAgICB9Ci0KLSAgICBpZiAoY29uZi0+bm9uY2VfbGlmZXRpbWUgPiAwKSB7Ci0JaWYgKGR0ID4gY29uZi0+bm9uY2VfbGlmZXRpbWUpIHsKLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0lORk8sIDAsciwKLQkJCSAgIkRpZ2VzdDogdXNlciAlczogbm9uY2UgZXhwaXJlZCAtIHNlbmRpbmcgbmV3IG5vbmNlIiwKLQkJCSAgci0+dXNlcik7Ci0JICAgIG5vdGVfZGlnZXN0X2F1dGhfZmFpbHVyZShyLCBjb25mLCByZXNwLCAxKTsKLQkgICAgcmV0dXJuIEFVVEhfUkVRVUlSRUQ7Ci0JfQotICAgIH0KLSAgICBlbHNlIGlmIChjb25mLT5ub25jZV9saWZldGltZSA9PSAwICYmIHJlc3AtPmNsaWVudCkgewotCWlmIChtZW1jbXAocmVzcC0+Y2xpZW50LT5sYXN0X25vbmNlLCByZXNwLT5ub25jZSwgTk9OQ0VfTEVOKSkgewotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgMCwgciwKLQkJCSAgIkRpZ2VzdDogdXNlciAlczogb25lLXRpbWUtbm9uY2UgbWlzbWF0Y2ggLSBzZW5kaW5nICIKLQkJCSAgIm5ldyBub25jZSIsIHItPnVzZXIpOwotCSAgICBub3RlX2RpZ2VzdF9hdXRoX2ZhaWx1cmUociwgY29uZiwgcmVzcCwgMSk7Ci0JICAgIHJldHVybiBBVVRIX1JFUVVJUkVEOwotCX0KLSAgICB9Ci0gICAgLyogZWxzZSAobGlmZXRpbWUgPCAwKSA9PiBuZXZlciBleHBpcmVzICovCi0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8qIFRoZSBhY3R1YWwgTUQ1IGNvZGUuLi4gd2hlZSAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqb2xkX2RpZ2VzdChjb25zdCByZXF1ZXN0X3JlYyAqciwKLQkJCSAgICAgIGNvbnN0IGRpZ2VzdF9oZWFkZXJfcmVjICpyZXNwLCBjb25zdCBjaGFyICpoYTEpCi17Ci0gICAgY29uc3QgY2hhciAqaGEyOwotCi0gICAgLyogcmZjLTIwNjkgKi8KLSAgICBoYTIgPSBhcF9tZDUoci0+cG9vbCwgKHVuc2lnbmVkIGNoYXIgKilhcF9wc3RyY2F0KHItPnBvb2wsIHItPm1ldGhvZCwgIjoiLAotCQkJCQkJICAgICAgcmVzcC0+dXJpLCBOVUxMKSk7Ci0gICAgcmV0dXJuIGFwX21kNShyLT5wb29sLAotCQkgICh1bnNpZ25lZCBjaGFyICopYXBfcHN0cmNhdChyLT5wb29sLCBoYTEsICI6IiwgcmVzcC0+bm9uY2UsCi0JCQkJCSAgICAgICI6IiwgaGEyLCBOVUxMKSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpuZXdfZGlnZXN0KGNvbnN0IHJlcXVlc3RfcmVjICpyLAotCQkJICAgICAgZGlnZXN0X2hlYWRlcl9yZWMgKnJlc3AsCi0JCQkgICAgICBjb25zdCBkaWdlc3RfY29uZmlnX3JlYyAqY29uZikKLXsKLSAgICBjb25zdCBjaGFyICpoYTEsICpoYTIsICphMjsKLQotICAgIC8qIGRyYWZ0LWlldGYtaHR0cC1hdXRoZW50aWNhdGlvbi0wMyAqLwotICAgIGlmIChyZXNwLT5hbGdvcml0aG0gJiYgIXN0cmNhc2VjbXAocmVzcC0+YWxnb3JpdGhtLCAiTUQ1LXNlc3MiKSkKLQloYTEgPSBnZXRfc2Vzc2lvbihyLCByZXNwLCBjb25mKTsKLSAgICBlbHNlCi0JaGExID0gY29uZi0+aGExOwotCi0gICAgaWYgKHJlc3AtPm1lc3NhZ2VfcW9wICYmICFzdHJjYXNlY21wKHJlc3AtPm1lc3NhZ2VfcW9wLCAiYXV0aC1pbnQiKSkKLQlhMiA9IGFwX3BzdHJjYXQoci0+cG9vbCwgci0+bWV0aG9kLCAiOiIsIHJlc3AtPnVyaSwgIjoiLAotCQkJYXBfbWQ1KHItPnBvb2wsIChjb25zdCB1bnNpZ25lZCBjaGFyKikgIiIpLCBOVUxMKTsgLyogVEJEICovCi0gICAgZWxzZQotCWEyID0gYXBfcHN0cmNhdChyLT5wb29sLCByLT5tZXRob2QsICI6IiwgcmVzcC0+dXJpLCBOVUxMKTsKLSAgICBoYTIgPSBhcF9tZDUoci0+cG9vbCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilhMik7Ci0KLSAgICByZXR1cm4gYXBfbWQ1KHItPnBvb2wsCi0JCSAgKHVuc2lnbmVkIGNoYXIgKilhcF9wc3RyY2F0KHItPnBvb2wsIGhhMSwgIjoiLCByZXNwLT5ub25jZSwKLQkJCQkJICAgICAgIjoiLCByZXNwLT5ub25jZV9jb3VudCwgIjoiLAotCQkJCQkgICAgICByZXNwLT5jbm9uY2UsICI6IiwKLQkJCQkJICAgICAgcmVzcC0+bWVzc2FnZV9xb3AsICI6IiwgaGEyLAotCQkJCQkgICAgICBOVUxMKSk7Ci19Ci0KLQotLyogVGhlc2UgZnVuY3Rpb25zIHJldHVybiAwIGlmIGNsaWVudCBpcyBPSywgYW5kIHByb3BlciBlcnJvciBzdGF0dXMKLSAqIGlmIG5vdC4uLiBlaXRoZXIgQVVUSF9SRVFVSVJFRCwgaWYgd2UgbWFkZSBhIGNoZWNrLCBhbmQgaXQgZmFpbGVkLCBvcgotICogU0VSVkVSX0VSUk9SLCBpZiB0aGluZ3MgYXJlIHNvIHRvdGFsbHkgY29uZnVzZWQgdGhhdCB3ZSBjb3VsZG4ndAotICogZmlndXJlIG91dCBob3cgdG8gdGVsbCBpZiB0aGUgY2xpZW50IGlzIGF1dGhvcml6ZWQgb3Igbm90LgotICoKLSAqIElmIHRoZXkgcmV0dXJuIERFQ0xJTkVELCBhbmQgYWxsIG90aGVyIG1vZHVsZXMgYWxzbyBkZWNsaW5lLCB0aGF0J3MKLSAqIHRyZWF0ZWQgYnkgdGhlIHNlcnZlciBjb3JlIGFzIGEgY29uZmlndXJhdGlvbiBlcnJvciwgbG9nZ2VkIGFuZAotICogcmVwb3J0ZWQgYXMgc3VjaC4KLSAqLwotCi0vKiBEZXRlcm1pbmUgdXNlciBJRCwgYW5kIGNoZWNrIGlmIHRoZSBhdHRyaWJ1dGVzIGFyZSBjb3JyZWN0LCBpZiBpdAotICogcmVhbGx5IGlzIHRoYXQgdXNlciwgaWYgdGhlIG5vbmNlIGlzIGNvcnJlY3QsIGV0Yy4KLSAqLwotCi1zdGF0aWMgaW50IGF1dGhlbnRpY2F0ZV9kaWdlc3RfdXNlcihyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBkaWdlc3RfY29uZmlnX3JlYyAqY29uZjsKLSAgICBkaWdlc3RfaGVhZGVyX3JlYyAqcmVzcDsKLSAgICByZXF1ZXN0X3JlYyAgICAgICAqbWFpbnJlcTsKLSAgICBjb25zdCBjaGFyICAgICAgICAqdDsKLSAgICBpbnQgICAgICAgICAgICAgICAgcmVzOwotCi0KLSAgICAvKiBkbyB3ZSByZXF1aXJlIERpZ2VzdCBhdXRoIGZvciB0aGlzIFVSST8gKi8KLQotICAgIGlmICghKHQgPSBhcF9hdXRoX3R5cGUocikpIHx8IHN0cmNhc2VjbXAodCwgIkRpZ2VzdCIpKQotCXJldHVybiBERUNMSU5FRDsKLQotICAgIGlmICghYXBfYXV0aF9uYW1lKHIpKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLQkJICAgICAgIkRpZ2VzdDogbmVlZCBBdXRoTmFtZTogJXMiLCByLT51cmkpOwotCXJldHVybiBTRVJWRVJfRVJST1I7Ci0gICAgfQotCi0KLSAgICAvKiBnZXQgdGhlIGNsaWVudCByZXNwb25zZSBhbmQgbWFyayAqLwotCi0gICAgbWFpbnJlcSA9IHI7Ci0gICAgd2hpbGUgKG1haW5yZXEtPm1haW4gIT0gTlVMTCkgIG1haW5yZXEgPSBtYWlucmVxLT5tYWluOwotICAgIHdoaWxlIChtYWlucmVxLT5wcmV2ICE9IE5VTEwpICBtYWlucmVxID0gbWFpbnJlcS0+cHJldjsKLSAgICByZXNwID0gKGRpZ2VzdF9oZWFkZXJfcmVjICopIGFwX2dldF9tb2R1bGVfY29uZmlnKG1haW5yZXEtPnJlcXVlc3RfY29uZmlnLAotCQkJCQkJICAgICAgJmRpZ2VzdF9hdXRoX21vZHVsZSk7Ci0gICAgcmVzcC0+bmVlZGVkX2F1dGggPSAxOwotCi0KLSAgICAvKiBnZXQgb3VyIGNvbmYgKi8KLQotICAgIGNvbmYgPSAoZGlnZXN0X2NvbmZpZ19yZWMgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCQkgICAgICAmZGlnZXN0X2F1dGhfbW9kdWxlKTsKLQotCi0gICAgLyogY2hlY2sgZm9yIGV4aXN0ZW5jZSBhbmQgc3ludGF4IG9mIEF1dGggaGVhZGVyICovCi0KLSAgICBpZiAocmVzcC0+YXV0aF9oZHJfc3RzICE9IFZBTElEKSB7Ci0JaWYgKHJlc3AtPmF1dGhfaGRyX3N0cyA9PSBOT1RfRElHRVNUKQotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotCQkJICAiRGlnZXN0OiBjbGllbnQgdXNlZCB3cm9uZyBhdXRoZW50aWNhdGlvbiBzY2hlbWUgIgotCQkJICAiYCVzJzogJXMiLCByZXNwLT5zY2hlbWUsIHItPnVyaSk7Ci0JZWxzZSBpZiAocmVzcC0+YXV0aF9oZHJfc3RzID09IElOVkFMSUQpCi0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0JCQkgICJEaWdlc3Q6IG1pc3NpbmcgdXNlciwgcmVhbG0sIG5vbmNlLCB1cmksIG9yIGRpZ2VzdCAiCi0JCQkgICJpbiBhdXRob3JpemF0aW9uIGhlYWRlcjogJXMiLCByLT51cmkpOwotCS8qIGVsc2UgKHJlc3AtPmF1dGhfaGRyX3N0cyA9PSBOT19IRUFERVIpICovCi0Jbm90ZV9kaWdlc3RfYXV0aF9mYWlsdXJlKHIsIGNvbmYsIHJlc3AsIDApOwotCXJldHVybiBBVVRIX1JFUVVJUkVEOwotICAgIH0KLQotICAgIHItPnVzZXIgICAgICAgICA9IChjaGFyICopIHJlc3AtPnVzZXJuYW1lOwotICAgIHItPmFwX2F1dGhfdHlwZSA9IChjaGFyICopICJEaWdlc3QiOwotCi0KLSAgICAvKiBjaGVjayB0aGUgYXV0aCBhdHRyaWJ1dGVzICovCi0KLSAgICBpZiAoc3RyY21wKHJlc3AtPnVyaSwgcmVzcC0+cmVxdWVzdF91cmktPnBhdGgpKSB7Ci0JdXJpX2NvbXBvbmVudHMgKnJfdXJpID0gcmVzcC0+cmVxdWVzdF91cmksIGRfdXJpOwotCWludCBwb3J0OwotCi0JaWYgKGFwX3BhcnNlX3VyaV9jb21wb25lbnRzKHItPnBvb2wsIHJlc3AtPnVyaSwgJmRfdXJpKSAhPSBIVFRQX09LKSB7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0JCQkgICJEaWdlc3Q6IGludmFsaWQgdXJpIDwlcz4gaW4gQXV0aG9yaXphdGlvbiBoZWFkZXIiLAotCQkJICByZXNwLT51cmkpOwotCSAgICByZXR1cm4gQkFEX1JFUVVFU1Q7Ci0JfQotCi0JaWYgKGRfdXJpLmhvc3RuYW1lKQotCSAgICBhcF91bmVzY2FwZV91cmwoZF91cmkuaG9zdG5hbWUpOwotCWlmIChkX3VyaS5wYXRoKQotCSAgICBhcF91bmVzY2FwZV91cmwoZF91cmkucGF0aCk7Ci0JaWYgKGRfdXJpLnF1ZXJ5KQotCSAgICBhcF91bmVzY2FwZV91cmwoZF91cmkucXVlcnkpOwotCWlmIChyX3VyaS0+cXVlcnkpCi0JICAgIGFwX3VuZXNjYXBlX3VybChyX3VyaS0+cXVlcnkpOwotCXBvcnQgPSBhcF9nZXRfc2VydmVyX3BvcnQocik7Ci0KLQlpZiAoKGRfdXJpLmhvc3RuYW1lICYmIGRfdXJpLmhvc3RuYW1lWzBdICE9ICdcMCcKLQkgICAgICYmIHN0cmNhc2VjbXAoZF91cmkuaG9zdG5hbWUsIGFwX2dldF9zZXJ2ZXJfbmFtZShyKSkpCi0JICAgIHx8IChkX3VyaS5wb3J0X3N0ciAmJiBkX3VyaS5wb3J0ICE9IHBvcnQpCi0JICAgIHx8IChkX3VyaS5ob3N0bmFtZSAmJiBkX3VyaS5ob3N0bmFtZVswXSAhPSAnXDAnCi0JCSYmICFkX3VyaS5wb3J0X3N0ciAmJiBwb3J0ICE9IGFwX2RlZmF1bHRfcG9ydChyKSkKLQkgICAgfHwgIWRfdXJpLnBhdGggfHwgc3RyY21wKGRfdXJpLnBhdGgsIHJfdXJpLT5wYXRoKQotCSAgICB8fCAoZF91cmkucXVlcnkgIT0gcl91cmktPnF1ZXJ5Ci0JCSYmICghZF91cmkucXVlcnkgfHwgIXJfdXJpLT5xdWVyeQotCQkgICAgfHwgc3RyY21wKGRfdXJpLnF1ZXJ5LCByX3VyaS0+cXVlcnkpKSkKLQkgICAgKSB7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0JCQkgICJEaWdlc3Q6IHVyaSBtaXNtYXRjaCAtIDwlcz4gZG9lcyBub3QgbWF0Y2ggIgotCQkJICAicmVxdWVzdC11cmkgPCVzPiIsIHJlc3AtPnVyaSwKLQkJCSAgYXBfdW5wYXJzZV91cmlfY29tcG9uZW50cyhyLT5wb29sLCByX3VyaSwgMCkpOwotCSAgICByZXR1cm4gQkFEX1JFUVVFU1Q7Ci0JfQotICAgIH0KLQotICAgIGlmIChyZXNwLT5vcGFxdWUgJiYgcmVzcC0+b3BhcXVlX251bSA9PSAwKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLQkJICAgICAgIkRpZ2VzdDogcmVjZWl2ZWQgaW52YWxpZCBvcGFxdWUgLSBnb3QgYCVzJyIsCi0JCSAgICAgIHJlc3AtPm9wYXF1ZSk7Ci0Jbm90ZV9kaWdlc3RfYXV0aF9mYWlsdXJlKHIsIGNvbmYsIHJlc3AsIDApOwotCXJldHVybiBBVVRIX1JFUVVJUkVEOwotICAgIH0KLQotICAgIGlmIChzdHJjbXAocmVzcC0+cmVhbG0sIGNvbmYtPnJlYWxtKSkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0JCSAgICAgICJEaWdlc3Q6IHJlYWxtIG1pc21hdGNoIC0gZ290IGAlcycgYnV0IGV4cGVjdGVkIGAlcyciLAotCQkgICAgICByZXNwLT5yZWFsbSwgY29uZi0+cmVhbG0pOwotCW5vdGVfZGlnZXN0X2F1dGhfZmFpbHVyZShyLCBjb25mLCByZXNwLCAwKTsKLQlyZXR1cm4gQVVUSF9SRVFVSVJFRDsKLSAgICB9Ci0KLSAgICBpZiAocmVzcC0+YWxnb3JpdGhtICE9IE5VTEwKLQkmJiBzdHJjYXNlY21wKHJlc3AtPmFsZ29yaXRobSwgIk1ENSIpCi0JJiYgc3RyY2FzZWNtcChyZXNwLT5hbGdvcml0aG0sICJNRDUtc2VzcyIpKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLQkJICAgICAgIkRpZ2VzdDogdW5rbm93biBhbGdvcml0aG0gYCVzJyByZWNlaXZlZDogJXMiLAotCQkgICAgICByZXNwLT5hbGdvcml0aG0sIHItPnVyaSk7Ci0Jbm90ZV9kaWdlc3RfYXV0aF9mYWlsdXJlKHIsIGNvbmYsIHJlc3AsIDApOwotCXJldHVybiBBVVRIX1JFUVVJUkVEOwotICAgIH0KLQotICAgIGlmICghY29uZi0+cHdmaWxlKQotCXJldHVybiBERUNMSU5FRDsKLQotICAgIGlmICghKGNvbmYtPmhhMSA9IGdldF9oYXNoKHIsIHItPnVzZXIsIGNvbmYtPnJlYWxtLCBjb25mLT5wd2ZpbGUpKSkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0JCSAgICAgICJEaWdlc3Q6IHVzZXIgYCVzJyBpbiByZWFsbSBgJXMnIG5vdCBmb3VuZDogJXMiLAotCQkgICAgICByLT51c2VyLCBjb25mLT5yZWFsbSwgci0+dXJpKTsKLQlub3RlX2RpZ2VzdF9hdXRoX2ZhaWx1cmUociwgY29uZiwgcmVzcCwgMCk7Ci0JcmV0dXJuIEFVVEhfUkVRVUlSRUQ7Ci0gICAgfQotCi0gICAgaWYgKHJlc3AtPm1lc3NhZ2VfcW9wID09IE5VTEwpIHsKLQkvKiBvbGQgKHJmYy0yMDY5KSBzdHlsZSBkaWdlc3QgKi8KLQlpZiAoc3RyY21wKHJlc3AtPmRpZ2VzdCwgb2xkX2RpZ2VzdChyLCByZXNwLCBjb25mLT5oYTEpKSkgewotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotCQkJICAiRGlnZXN0OiB1c2VyICVzOiBwYXNzd29yZCBtaXNtYXRjaDogJXMiLCByLT51c2VyLAotCQkJICByLT51cmkpOwotCSAgICBub3RlX2RpZ2VzdF9hdXRoX2ZhaWx1cmUociwgY29uZiwgcmVzcCwgMCk7Ci0JICAgIHJldHVybiBBVVRIX1JFUVVJUkVEOwotCX0KLSAgICB9Ci0gICAgZWxzZSB7Ci0JaW50IG1hdGNoID0gMCwgaWR4OwotCWZvciAoaWR4PTA7IGNvbmYtPnFvcF9saXN0W2lkeF0gIT0gTlVMTDsgaWR4KyspIHsKLQkgICAgaWYgKCFzdHJjYXNlY21wKGNvbmYtPnFvcF9saXN0W2lkeF0sIHJlc3AtPm1lc3NhZ2VfcW9wKSkgewotCQltYXRjaCA9IDE7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotCi0JaWYgKCFtYXRjaAotCSAgICAmJiAhKGNvbmYtPnFvcF9saXN0WzBdID09IE5VTEwKLQkJICYmICFzdHJjYXNlY21wKHJlc3AtPm1lc3NhZ2VfcW9wLCAiYXV0aCIpKSkgewotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotCQkJICAiRGlnZXN0OiBpbnZhbGlkIHFvcCBgJXMnIHJlY2VpdmVkOiAlcyIsCi0JCQkgIHJlc3AtPm1lc3NhZ2VfcW9wLCByLT51cmkpOwotCSAgICBub3RlX2RpZ2VzdF9hdXRoX2ZhaWx1cmUociwgY29uZiwgcmVzcCwgMCk7Ci0JICAgIHJldHVybiBBVVRIX1JFUVVJUkVEOwotCX0KLQotCWlmIChzdHJjbXAocmVzcC0+ZGlnZXN0LCBuZXdfZGlnZXN0KHIsIHJlc3AsIGNvbmYpKSkgewotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotCQkJICAiRGlnZXN0OiB1c2VyICVzOiBwYXNzd29yZCBtaXNtYXRjaDogJXMiLCByLT51c2VyLAotCQkJICByLT51cmkpOwotCSAgICBub3RlX2RpZ2VzdF9hdXRoX2ZhaWx1cmUociwgY29uZiwgcmVzcCwgMCk7Ci0JICAgIHJldHVybiBBVVRIX1JFUVVJUkVEOwotCX0KLSAgICB9Ci0KLSAgICBpZiAoY2hlY2tfbmMociwgcmVzcCwgY29uZikgIT0gT0spIHsKLQlub3RlX2RpZ2VzdF9hdXRoX2ZhaWx1cmUociwgY29uZiwgcmVzcCwgMCk7Ci0JcmV0dXJuIEFVVEhfUkVRVUlSRUQ7Ci0gICAgfQotCi0gICAgLyogTm90ZTogdGhpcyBjaGVjayBpcyBkb25lIGxhc3Qgc28gdGhhdCBhICJzdGFsZT10cnVlIiBjYW4gYmUKLSAgICAgICBnZW5lcmF0ZWQgaWYgdGhlIG5vbmNlIGlzIG9sZCAqLwotICAgIGlmICgocmVzID0gY2hlY2tfbm9uY2UociwgcmVzcCwgY29uZikpKQotCXJldHVybiByZXM7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotLyoKLSAqIENoZWNraW5nIElECi0gKi8KLQotc3RhdGljIGFwX3RhYmxlX3QgKmdyb3Vwc19mb3JfdXNlcihyZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqdXNlciwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKmdycGZpbGUpCi17Ci0gICAgY29uZmlnZmlsZV90ICpmOwotICAgIGFwX3RhYmxlX3QgKmdycHMgPSBhcF9tYWtlX3RhYmxlKHItPnBvb2wsIDE1KTsKLSAgICBhcF9jb250ZXh0X3QgKnNwOwotICAgIGNoYXIgbFtNQVhfU1RSSU5HX0xFTl07Ci0gICAgY29uc3QgY2hhciAqZ3JvdXBfbmFtZSwgKmxsLCAqdzsKLSAgICBhcF9zdGF0dXNfdCBzdHM7Ci0KLSAgICBpZiAoKHN0cyA9IGFwX3BjZmdfb3BlbmZpbGUoJmYsIHItPnBvb2wsIGdycGZpbGUpKSAhPSBBUFJfU1VDQ0VTUykgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgciwKLQkJICAgICAgIkRpZ2VzdDogQ291bGQgbm90IG9wZW4gZ3JvdXAgZmlsZTogJXMiLCBncnBmaWxlKTsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoYXBfY3JlYXRlX2NvbnRleHQoJnNwLCByLT5wb29sKSAhPSBBUFJfU1VDQ0VTUykKLQkJcmV0dXJuIE5VTEw7Ci0KLSAgICB3aGlsZSAoIShhcF9jZmdfZ2V0bGluZShsLCBNQVhfU1RSSU5HX0xFTiwgZikpKSB7Ci0JaWYgKChsWzBdID09ICcjJykgfHwgKCFsWzBdKSkKLQkgICAgY29udGludWU7Ci0JbGwgPSBsOwotCWFwX2NsZWFyX3Bvb2woc3ApOwotCi0JZ3JvdXBfbmFtZSA9IGFwX2dldHdvcmQoc3AsICZsbCwgJzonKTsKLQotCXdoaWxlIChsbFswXSkgewotCSAgICB3ID0gYXBfZ2V0d29yZF9jb25mKHNwLCAmbGwpOwotCSAgICBpZiAoIXN0cmNtcCh3LCB1c2VyKSkgewotCQlhcF90YWJsZV9zZXRuKGdycHMsIGFwX3BzdHJkdXAoci0+cG9vbCwgZ3JvdXBfbmFtZSksICJpbiIpOwotCQlicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICBhcF9jZmdfY2xvc2VmaWxlKGYpOwotICAgIGFwX2Rlc3Ryb3lfcG9vbChzcCk7Ci0gICAgcmV0dXJuIGdycHM7Ci19Ci0KLQotc3RhdGljIGludCBkaWdlc3RfY2hlY2tfYXV0aChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb25zdCBkaWdlc3RfY29uZmlnX3JlYyAqY29uZiA9Ci0JCShkaWdlc3RfY29uZmlnX3JlYyAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywKLQkJCQkJCQkgICAmZGlnZXN0X2F1dGhfbW9kdWxlKTsKLSAgICBjb25zdCBjaGFyICp1c2VyID0gci0+dXNlcjsKLSAgICBpbnQgbSA9IHItPm1ldGhvZF9udW1iZXI7Ci0gICAgaW50IG1ldGhvZF9yZXN0cmljdGVkID0gMDsKLSAgICByZWdpc3RlciBpbnQgeDsKLSAgICBjb25zdCBjaGFyICp0LCAqdzsKLSAgICBhcF90YWJsZV90ICpncnBzdGF0dXM7Ci0gICAgY29uc3QgYXBfYXJyYXlfaGVhZGVyX3QgKnJlcXNfYXJyOwotICAgIHJlcXVpcmVfbGluZSAqcmVxczsKLQotICAgIGlmICghKHQgPSBhcF9hdXRoX3R5cGUocikpIHx8IHN0cmNhc2VjbXAodCwgIkRpZ2VzdCIpKQotCXJldHVybiBERUNMSU5FRDsKLQotICAgIHJlcXNfYXJyID0gYXBfcmVxdWlyZXMocik7Ci0gICAgLyogSWYgdGhlcmUgaXMgbm8gInJlcXVpcmVzIiBkaXJlY3RpdmUsIHRoZW4gYW55IHVzZXIgd2lsbCBkby4KLSAgICAgKi8KLSAgICBpZiAoIXJlcXNfYXJyKQotCXJldHVybiBPSzsKLSAgICByZXFzID0gKHJlcXVpcmVfbGluZSAqKSByZXFzX2Fyci0+ZWx0czsKLQotICAgIGlmIChjb25mLT5ncnBmaWxlKQotCWdycHN0YXR1cyA9IGdyb3Vwc19mb3JfdXNlcihyLCB1c2VyLCBjb25mLT5ncnBmaWxlKTsKLSAgICBlbHNlCi0JZ3Jwc3RhdHVzID0gTlVMTDsKLQotICAgIGZvciAoeCA9IDA7IHggPCByZXFzX2Fyci0+bmVsdHM7IHgrKykgewotCi0JaWYgKCEocmVxc1t4XS5tZXRob2RfbWFzayAmICgxIDw8IG0pKSkKLQkgICAgY29udGludWU7Ci0KLQltZXRob2RfcmVzdHJpY3RlZCA9IDE7Ci0KLQl0ID0gcmVxc1t4XS5yZXF1aXJlbWVudDsKLQl3ID0gYXBfZ2V0d29yZF93aGl0ZShyLT5wb29sLCAmdCk7Ci0JaWYgKCFzdHJjYXNlY21wKHcsICJ2YWxpZC11c2VyIikpCi0JICAgIHJldHVybiBPSzsKLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAidXNlciIpKSB7Ci0JICAgIHdoaWxlICh0WzBdKSB7Ci0JCXcgPSBhcF9nZXR3b3JkX2NvbmYoci0+cG9vbCwgJnQpOwotCQlpZiAoIXN0cmNtcCh1c2VyLCB3KSkKLQkJICAgIHJldHVybiBPSzsKLQkgICAgfQotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiZ3JvdXAiKSkgewotCSAgICBpZiAoIWdycHN0YXR1cykKLQkJcmV0dXJuIERFQ0xJTkVEOwotCi0JICAgIHdoaWxlICh0WzBdKSB7Ci0JCXcgPSBhcF9nZXR3b3JkX2NvbmYoci0+cG9vbCwgJnQpOwotCQlpZiAoYXBfdGFibGVfZ2V0KGdycHN0YXR1cywgdykpCi0JCSAgICByZXR1cm4gT0s7Ci0JICAgIH0KLQl9Ci0JZWxzZSB7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0JCSJEaWdlc3Q6IGFjY2VzcyB0byAlcyBmYWlsZWQsIHJlYXNvbjogdW5rbm93biByZXF1aXJlICIKLQkJImRpcmVjdGl2ZSBcIiVzXCIiLCByLT51cmksIHJlcXNbeF0ucmVxdWlyZW1lbnQpOwotCSAgICByZXR1cm4gREVDTElORUQ7Ci0JfQotICAgIH0KLQotICAgIGlmICghbWV0aG9kX3Jlc3RyaWN0ZWQpCi0JcmV0dXJuIE9LOwotCi0gICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLQkiRGlnZXN0OiBhY2Nlc3MgdG8gJXMgZmFpbGVkLCByZWFzb246IHVzZXIgJXMgbm90IGFsbG93ZWQgYWNjZXNzIiwKLQlyLT51cmksIHVzZXIpOwotCi0gICAgbm90ZV9kaWdlc3RfYXV0aF9mYWlsdXJlKHIsIGNvbmYsCi0JKGRpZ2VzdF9oZWFkZXJfcmVjICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnJlcXVlc3RfY29uZmlnLAotCQkJCQkJICAgJmRpZ2VzdF9hdXRoX21vZHVsZSksCi0JMCk7Ci0gICAgcmV0dXJuIEFVVEhfUkVRVUlSRUQ7Ci19Ci0KLQotLyoKLSAqIEF1dGhvcml6YXRpb24tSW5mbyBoZWFkZXIgY29kZQotICovCi0KLSNpZmRlZiBTRU5EX0RJR0VTVAotc3RhdGljIGNvbnN0IGNoYXIgKmhkcihjb25zdCBhcF90YWJsZV90ICp0YmwsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgY29uc3QgY2hhciAqdmFsID0gYXBfdGFibGVfZ2V0KHRibCwgbmFtZSk7Ci0gICAgaWYgKHZhbCkKLQlyZXR1cm4gdmFsOwotICAgIGVsc2UKLQlyZXR1cm4gIiI7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCBhZGRfYXV0aF9pbmZvKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvbnN0IGRpZ2VzdF9jb25maWdfcmVjICpjb25mID0KLQkJKGRpZ2VzdF9jb25maWdfcmVjICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLAotCQkJCQkJCSAgICZkaWdlc3RfYXV0aF9tb2R1bGUpOwotICAgIGRpZ2VzdF9oZWFkZXJfcmVjICpyZXNwID0KLQkJKGRpZ2VzdF9oZWFkZXJfcmVjICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnJlcXVlc3RfY29uZmlnLAotCQkJCQkJCSAgICZkaWdlc3RfYXV0aF9tb2R1bGUpOwotICAgIGNvbnN0IGNoYXIgKmFpID0gTlVMTCwgKmRpZ2VzdCA9IE5VTEwsICpuZXh0bm9uY2UgPSAiIjsKLQotICAgIGlmIChyZXNwID09IE5VTEwgfHwgIXJlc3AtPm5lZWRlZF9hdXRoIHx8IGNvbmYgPT0gTlVMTCkKLQlyZXR1cm4gT0s7Ci0KLQotICAgIC8qIHJmYy0yMDY5IGRpZ2VzdAotICAgICAqLwotICAgIGlmIChyZXNwLT5tZXNzYWdlX3FvcCA9PSBOVUxMKSB7Ci0JLyogb2xkIGNsaWVudCwgc28gY2FsYyByZmMtMjA2OSBkaWdlc3QgKi8KLQotI2lmZGVmIFNFTkRfRElHRVNUCi0JLyogbW9zdCBvZiB0aGlzIHRvdGFsbHkgYm9ndXMgYmVjYXVzZSB0aGUgaGFuZGxlcnMgZG9uJ3Qgc2V0IHRoZQotCSAqIGhlYWRlcnMgdW50aWwgdGhlIGZpbmFsIGhhbmRsZXIgcGhhc2UgKEkgd29uZGVyIHdoeSB0aGlzIHBoYXNlCi0JICogaXMgY2FsbGVkIGZpeHVwIHdoZW4gdGhlcmUncyBhbG1vc3Qgbm90aGluZyB5b3UgY2FuIGZpeCB1cC4uLikKLQkgKgotCSAqIEJlY2F1c2UgaXQncyBiYXNpY2FsbHkgaW1wb3NzaWJsZSB0byBnZXQgdGhpcyByaWdodCAoZS5nLiB0aGUKLQkgKiBDb250ZW50LWxlbmd0aCBpcyBuZXZlciBzZXQgeWV0IHdoZW4gd2UgZ2V0IGhlcmUsIGFuZCB3ZSBjYW4ndAotCSAqIGNhbGMgdGhlIGVudGl0eSBoYXNoKSBpdCdzIGJlc3QgdG8ganVzdCBsZWF2ZSB0aGlzICNkZWYnZCBvdXQuCi0JICovCi0JY2hhciAqZW50aXR5X2luZm8gPQotCSAgICBhcF9tZDUoci0+cG9vbCwKLQkJICAgKHVuc2lnbmVkIGNoYXIgKikgYXBfcHN0cmNhdChyLT5wb29sLAotCQkgICAgICAgYXBfdW5wYXJzZV91cmlfY29tcG9uZW50cyhyLT5wb29sLAotCQkJCQkJIHJlc3AtPnJlcXVlc3RfdXJpLCAwKSwgIjoiLAotCQkgICAgICAgci0+Y29udGVudF90eXBlID8gci0+Y29udGVudF90eXBlIDogYXBfZGVmYXVsdF90eXBlKHIpLCAiOiIsCi0JCSAgICAgICBoZHIoci0+aGVhZGVyc19vdXQsICJDb250ZW50LUxlbmd0aCIpLCAiOiIsCi0JCSAgICAgICByLT5jb250ZW50X2VuY29kaW5nID8gci0+Y29udGVudF9lbmNvZGluZyA6ICIiLCAiOiIsCi0JCSAgICAgICBoZHIoci0+aGVhZGVyc19vdXQsICJMYXN0LU1vZGlmaWVkIiksICI6IiwKLQkJICAgICAgIHItPm5vX2NhY2hlICYmICFhcF90YWJsZV9nZXQoci0+aGVhZGVyc19vdXQsICJFeHBpcmVzIikgPwotCQkJICAgIGFwX2dtX3RpbWVzdHJfODIyKHItPnBvb2wsIHItPnJlcXVlc3RfdGltZSkgOgotCQkJICAgIGhkcihyLT5oZWFkZXJzX291dCwgIkV4cGlyZXMiKSwKLQkJICAgICAgIE5VTEwpKTsKLQlkaWdlc3QgPQotCSAgICBhcF9tZDUoci0+cG9vbCwKLQkJICAgKHVuc2lnbmVkIGNoYXIgKilhcF9wc3RyY2F0KHItPnBvb2wsIGNvbmYtPmhhMSwgIjoiLAotCQkJCQkgICAgICAgcmVzcC0+bm9uY2UsICI6IiwKLQkJCQkJICAgICAgIHItPm1ldGhvZCwgIjoiLAotCQkJCQkgICAgICAgYXBfZ21fdGltZXN0cl84MjIoci0+cG9vbCwgci0+cmVxdWVzdF90aW1lKSwgIjoiLAotCQkJCQkgICAgICAgZW50aXR5X2luZm8sICI6IiwKLQkJCQkJICAgICAgIGFwX21kNShyLT5wb29sLCAodW5zaWduZWQgY2hhciAqKSAiIiksIC8qIEgoZW50aXR5KSAtIFRCRCAqLwotCQkJCQkgICAgICAgTlVMTCkpOwotI2VuZGlmCi0gICAgfQotCi0KLSAgICAvKiBzZXR1cCBuZXh0bm9uY2UKLSAgICAgKi8KLSAgICBpZiAoY29uZi0+bm9uY2VfbGlmZXRpbWUgPiAwKSB7Ci0JLyogc2VuZCBuZXh0bm9uY2UgaWYgY3VycmVudCBub25jZSB3aWxsIGV4cGlyZSBpbiBsZXNzIHRoYW4gMzAgc2VjcyAqLwotCWlmIChkaWZmdGltZShyLT5yZXF1ZXN0X3RpbWUsIHJlc3AtPm5vbmNlX3RpbWUpID4gKGNvbmYtPm5vbmNlX2xpZmV0aW1lLU5FWFROT05DRV9ERUxUQSkpIHsKLQkgICAgbmV4dG5vbmNlID0gYXBfcHN0cmNhdChyLT5wb29sLCAiLCBuZXh0bm9uY2U9XCIiLAotCQkJCSAgIGdlbl9ub25jZShyLT5wb29sLCByLT5yZXF1ZXN0X3RpbWUsCi0JCQkJCSAgICAgcmVzcC0+b3BhcXVlLCByLT5zZXJ2ZXIsIGNvbmYpLAotCQkJCSAgICJcIiIsIE5VTEwpOwotCSAgICByZXNwLT5jbGllbnQtPm5vbmNlX2NvdW50ID0gMDsKLQl9Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbmYtPm5vbmNlX2xpZmV0aW1lID09IDAgJiYgcmVzcC0+Y2xpZW50KSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKm5vbmNlID0gZ2VuX25vbmNlKHItPnBvb2wsIDAsIHJlc3AtPm9wYXF1ZSwgci0+c2VydmVyLAotCQkJCSAgICAgIGNvbmYpOwotCW5leHRub25jZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgIiwgbmV4dG5vbmNlPVwiIiwgbm9uY2UsICJcIiIsIE5VTEwpOwotCW1lbWNweShyZXNwLT5jbGllbnQtPmxhc3Rfbm9uY2UsIG5vbmNlLCBOT05DRV9MRU4rMSk7Ci0gICAgfQotICAgIC8qIGVsc2Ugbm9uY2UgbmV2ZXIgZXhwaXJlcywgaGVuY2Ugbm8gbmV4dG5vbmNlICovCi0KLQotICAgIC8qIGRvIHJmYy0yMDY5IGRpZ2VzdAotICAgICAqLwotICAgIGlmIChjb25mLT5xb3BfbGlzdFswXSAmJiAhc3RyY2FzZWNtcChjb25mLT5xb3BfbGlzdFswXSwgIm5vbmUiKQotCSYmIHJlc3AtPm1lc3NhZ2VfcW9wID09IE5VTEwpIHsKLQkvKiB1c2Ugb25seSBSRkMtMjA2OSBmb3JtYXQgKi8KLQlpZiAoZGlnZXN0KQotCSAgICBhaSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgImRpZ2VzdD1cIiIsIGRpZ2VzdCwgIlwiIiwgbmV4dG5vbmNlLE5VTEwpOwotCWVsc2UKLQkgICAgYWkgPSBuZXh0bm9uY2U7Ci0gICAgfQotICAgIGVsc2UgewotCWNvbnN0IGNoYXIgKnJlc3BfZGlnLCAqaGExLCAqYTIsICpoYTI7Ci0KLQkvKiBjYWxjdWxhdGUgcnNwYXV0aCBhdHRyaWJ1dGUKLQkgKi8KLQlpZiAocmVzcC0+YWxnb3JpdGhtICYmICFzdHJjYXNlY21wKHJlc3AtPmFsZ29yaXRobSwgIk1ENS1zZXNzIikpCi0JICAgIGhhMSA9IGdldF9zZXNzaW9uKHIsIHJlc3AsIGNvbmYpOwotCWVsc2UKLQkgICAgaGExID0gY29uZi0+aGExOwotCi0JaWYgKHJlc3AtPm1lc3NhZ2VfcW9wICYmICFzdHJjYXNlY21wKHJlc3AtPm1lc3NhZ2VfcW9wLCAiYXV0aC1pbnQiKSkKLQkgICAgYTIgPSBhcF9wc3RyY2F0KHItPnBvb2wsICI6IiwgcmVzcC0+dXJpLCAiOiIsCi0JCQkgICAgYXBfbWQ1KHItPnBvb2wsIChjb25zdCB1bnNpZ25lZCBjaGFyICopICIiKSwgTlVMTCk7IC8qIFRCRCAqLwotCWVsc2UKLQkgICAgYTIgPSBhcF9wc3RyY2F0KHItPnBvb2wsICI6IiwgcmVzcC0+dXJpLCBOVUxMKTsKLQloYTIgPSBhcF9tZDUoci0+cG9vbCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilhMik7Ci0KLQlyZXNwX2RpZyA9IGFwX21kNShyLT5wb29sLAotCQkgICAgICAgICAodW5zaWduZWQgY2hhciAqKWFwX3BzdHJjYXQoci0+cG9vbCwgaGExLCAiOiIsCi0JCQkJCQkgICAgIHJlc3AtPm5vbmNlLCAiOiIsCi0JCQkJCQkgICAgIHJlc3AtPm5vbmNlX2NvdW50LCAiOiIsCi0JCQkJCQkgICAgIHJlc3AtPmNub25jZSwgIjoiLAotCQkJCQkJICAgICByZXNwLT5tZXNzYWdlX3FvcCA/Ci0JCQkJCQkJIHJlc3AtPm1lc3NhZ2VfcW9wIDogIiIsCi0JCQkJCQkgICAgICI6IiwgaGEyLCBOVUxMKSk7Ci0KLQkvKiBhc3NlbWJsZSBBdXRoZW50aWNhdGlvbi1JbmZvIGhlYWRlcgotCSAqLwotCWFpID0gYXBfcHN0cmNhdChyLT5wb29sLAotCQkJInJzcGF1dGg9XCIiLCByZXNwX2RpZywgIlwiIiwKLQkJCW5leHRub25jZSwKLQkJICAgICAgICByZXNwLT5jbm9uY2UgPyAiLCBjbm9uY2U9XCIiIDogIiIsCi0JCSAgICAgICAgcmVzcC0+Y25vbmNlID8gYXBfZXNjYXBlX3F1b3RlcyhyLT5wb29sLCByZXNwLT5jbm9uY2UpIDoKLQkJCQkJIiIsCi0JCSAgICAgICAgcmVzcC0+Y25vbmNlID8gIlwiIiA6ICIiLAotCQkgICAgICAgIHJlc3AtPm5vbmNlX2NvdW50ID8gIiwgbmM9IiA6ICIiLAotCQkgICAgICAgIHJlc3AtPm5vbmNlX2NvdW50ID8gcmVzcC0+bm9uY2VfY291bnQgOiAiIiwKLQkJICAgICAgICByZXNwLT5tZXNzYWdlX3FvcCA/ICIsIHFvcD0iIDogIiIsCi0JCSAgICAgICAgcmVzcC0+bWVzc2FnZV9xb3AgPyByZXNwLT5tZXNzYWdlX3FvcCA6ICIiLAotCQkJZGlnZXN0ID8gImRpZ2VzdD1cIiIgOiAiIiwKLQkJCWRpZ2VzdCA/IGRpZ2VzdCA6ICIiLAotCQkJZGlnZXN0ID8gIlwiIiA6ICIiLAotCQkJTlVMTCk7Ci0gICAgfQotCi0gICAgaWYgKGFpICYmIGFpWzBdKQotCWFwX3RhYmxlX21lcmdlbihyLT5oZWFkZXJzX291dCwKLQkJCXItPnByb3h5cmVxID8gIlByb3h5LUF1dGhlbnRpY2F0aW9uLUluZm8iIDoKLQkJCQkgICAgICAiQXV0aGVudGljYXRpb24tSW5mbyIsCi0JCQlhaSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi0KLXN0YXRpYyB2b2lkIHJlZ2lzdGVyX2hvb2tzKHZvaWQpCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZmdQb3N0W109eyAiaHR0cF9jb3JlLmMiLCBOVUxMIH07Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwYXJzZVByZVtdPXsgIm1vZF9wcm94eS5jIiwgTlVMTCB9OwotCi0gICAgYXBfaG9va19wb3N0X2NvbmZpZyhpbml0aWFsaXplX21vZHVsZSwgTlVMTCwgY2ZnUG9zdCwgTlVMTCk7Ci0gICAgYXBfaG9va19wb3N0X3JlYWRfcmVxdWVzdChwYXJzZV9oZHJfYW5kX3VwZGF0ZV9uYywgcGFyc2VQcmUsIE5VTEwsIE5VTEwpOwotICAgIGFwX2hvb2tfY2hlY2tfdXNlcl9pZChhdXRoZW50aWNhdGVfZGlnZXN0X3VzZXIsIE5VTEwsIE5VTEwsIEhPT0tfTUlERExFKTsKLSAgICBhcF9ob29rX2F1dGhfY2hlY2tlcihkaWdlc3RfY2hlY2tfYXV0aCwgTlVMTCwgTlVMTCwgSE9PS19NSURETEUpOwotICAgIGFwX2hvb2tfZml4dXBzKGFkZF9hdXRoX2luZm8sIE5VTEwsIE5VTEwsIEhPT0tfTUlERExFKTsKLX0KLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGRpZ2VzdF9hdXRoX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCi0gICAgY3JlYXRlX2RpZ2VzdF9kaXJfY29uZmlnLAkvKiBkaXIgY29uZmlnIGNyZWF0ZXIgKi8KLSAgICBOVUxMLAkJCS8qIGRpciBtZXJnZXIgLS0tIGRlZmF1bHQgaXMgdG8gb3ZlcnJpZGUgKi8KLSAgICBOVUxMLAkJCS8qIHNlcnZlciBjb25maWcgKi8KLSAgICBOVUxMLAkJCS8qIG1lcmdlIHNlcnZlciBjb25maWcgKi8KLSAgICBkaWdlc3RfY21kcywJCS8qIGNvbW1hbmQgdGFibGUgKi8KLSAgICBOVUxMLAkJCS8qIGhhbmRsZXJzICovCi0gICAgcmVnaXN0ZXJfaG9va3MJCS8qIHJlZ2lzdGVyIGhvb2tzICovCi19OwotCmRpZmYgLS1naXQgYS9tb2R1bGVzL2FyY2gvd2luMzIvbW9kX2lzYXBpLmMgYi9tb2R1bGVzL2FyY2gvd2luMzIvbW9kX2lzYXBpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YWVlNTEuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9hcmNoL3dpbjMyL21vZF9pc2FwaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTY5ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIG1vZF9pc2FwaS5jIC0gSW50ZXJuZXQgU2VydmVyIEFwcGxpY2F0aW9uIChJU0EpIG1vZHVsZSBmb3IgQXBhY2hlCi0gKiBieSBBbGV4ZWkgS29zdXQgPGFrb3N1dEBhcGFjaGUub3JnPgotICoKLSAqIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgTWljcm9zb2Z0J3MgSVNBUEksIGFsbG93aW5nIEFwYWNoZSAod2hlbiBydW5uaW5nCi0gKiB1bmRlciBXaW5kb3dzKSB0byBsb2FkIEludGVybmV0IFNlcnZlciBBcHBsaWNhdGlvbnMgKElTQVBJIGV4dGVuc2lvbnMpLgotICogSXQgaW1wbGVtZW50cyBhbGwgb2YgdGhlIElTQVBJIDIuMCBzcGVjaWZpY2F0aW9uLCBleGNlcHQgZm9yIHRoZSAKLSAqICJNaWNyb3NvZnQtb25seSIgZXh0ZW5zaW9ucyBkZWFsaW5nIHdpdGggYXN5bmNocm9ub3VzIEkvTy4gQWxsIElTQVBJCi0gKiBleHRlbnNpb25zIHRoYXQgdXNlIG9ubHkgc3luY2hyb25vdXMgSS9PIGFuZCBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZQotICogSVNBUEkgMi4wIHNwZWNpZmljYXRpb24gc2hvdWxkIHdvcmsgKG1vc3QgSVNBUEkgMS4wIGV4dGVuc2lvbnMgc2hvdWxkCi0gKiBmdW5jdGlvbiBhcyB3ZWxsKS4KLSAqCi0gKiBUbyBsb2FkLCBzaW1wbHkgcGxhY2UgdGhlIElTQSBpbiBhIGxvY2F0aW9uIGluIHRoZSBkb2N1bWVudCB0cmVlLgotICogVGhlbiBhZGQgYW4gIkFkZEhhbmRsZXIgaXNhcGktaXNhIGRsbCIgaW50byB5b3VyIGNvbmZpZyBmaWxlLgotICogWW91IHNob3VsZCBub3cgYmUgYWJsZSB0byBsb2FkIElTQVBJIERMTHMganVzdCBiZSByZWZmZXJpbmcgdG8gdGhlaXIKLSAqIFVSTHMuIE1ha2Ugc3VyZSB0aGUgRXhlY0NHSSBvcHRpb24gaXMgYWN0aXZlIGluIHRoZSBkaXJlY3RvcnkKLSAqIHRoZSBJU0EgaXMgaW4uCi0gKi8KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJ1dGlsX3NjcmlwdC5oIgotCi0vKiBXZSB1c2UgdGhlIGV4YWN0IHNhbWUgaGVhZGVyIGZpbGUgYXMgdGhlIG9yaWdpbmFsICovCi0jaW5jbHVkZSA8SHR0cEV4dC5oPgotCi0vKiBTZWVtcyBJSVMgZG9lcyBub3QgZW5mb3JjZSB0aGUgcmVxdWlyZW1lbnQgZm9yIFxyXG4gdGVybWluYXRpb24gb24gSFNFX1JFUV9TRU5EX1JFU1BPTlNFX0hFQURFUiwKLSAgIGRlZmluZSB0aGlzIHRvIGNvbmZvcm0gKi8KLSNkZWZpbmUgUkVMQVhfSEVBREVSX1JVTEUKLQotbW9kdWxlIGlzYXBpX21vZHVsZTsKLQotLyogT3VyICJDb25uZWN0aW9uIElEIiBzdHJ1Y3R1cmUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIExQRVhURU5TSU9OX0NPTlRST0xfQkxPQ0sgZWNiOwotICAgIHJlcXVlc3RfcmVjICpyOwotICAgIGludCBzdGF0dXM7Ci19IGlzYXBpX2NpZDsKLQotLyogRGVjbGFyZSB0aGUgSVNBUEkgZnVuY3Rpb25zICovCi0KLUJPT0wgV0lOQVBJIEdldFNlcnZlclZhcmlhYmxlIChIQ09OTiBoQ29ubiwgTFBTVFIgbHBzelZhcmlhYmxlTmFtZSwKLQkJCSAgICAgICBMUFZPSUQgbHB2QnVmZmVyLCBMUERXT1JEIGxwZHdTaXplb2ZCdWZmZXIpOwotQk9PTCBXSU5BUEkgV3JpdGVDbGllbnQgKEhDT05OIENvbm5JRCwgTFBWT0lEIEJ1ZmZlciwgTFBEV09SRCBscHdkd0J5dGVzLAotCQkJIERXT1JEIGR3UmVzZXJ2ZWQpOwotQk9PTCBXSU5BUEkgUmVhZENsaWVudCAoSENPTk4gQ29ubklELCBMUFZPSUQgbHB2QnVmZmVyLCBMUERXT1JEIGxwZHdTaXplKTsKLUJPT0wgV0lOQVBJIFNlcnZlclN1cHBvcnRGdW5jdGlvbiAoSENPTk4gaENvbm4sIERXT1JEIGR3SFNFUmVxdWVzdCwKLQkJCQkgICBMUFZPSUQgbHB2QnVmZmVyLCBMUERXT1JEIGxwZHdTaXplLAotCQkJCSAgIExQRFdPUkQgbHBkd0RhdGFUeXBlKTsKLQotLyoKLSAgICBUaGUgb3B0aW1pc2VyIGJsb3dzIGl0IHRvdGFsbHkgaGVyZS4gV2hhdCBoYXBwZW5zIGlzIHRoYXQgYXV0b3MgYXJlIGFkZHJlc3NlZCByZWxhdGl2ZSB0byB0aGUKLSAgICBzdGFjayBwb2ludGVyLCB3aGljaCwgb2YgY291cnNlLCBtb3ZlcyBhcm91bmQuIFRoZSBvcHRpbWlzZXIgc2VlbXMgdG8gbG9zZSB0cmFjayBvZiBpdCBzb21ld2hlcmUKLSAgICBiZXR3ZWVuIHNldHRpbmcgaXNhcGlfZW50cnkgYW5kIGNhbGxpbmcgdGhyb3VnaCBpdC4gV2Ugd29yayBhcm91bmQgdGhlIHByb2JsZW0gYnkgZm9yY2luZyBpdCB0bwotICAgIHVzZSBmcmFtZSBwb2ludGVycy4KLSovCi0jcHJhZ21hIG9wdGltaXplKCJ5IixvZmYpCi0KLWludCBpc2FwaV9oYW5kbGVyIChyZXF1ZXN0X3JlYyAqcikgewotICAgIExQRVhURU5TSU9OX0NPTlRST0xfQkxPQ0sgZWNiID0KLQlhcF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihzdHJ1Y3QgX0VYVEVOU0lPTl9DT05UUk9MX0JMT0NLKSk7Ci0gICAgSFNFX1ZFUlNJT05fSU5GTyAqcFZlciA9IGFwX3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKEhTRV9WRVJTSU9OX0lORk8pKTsKLQotICAgIEhJTlNUQU5DRSBpc2FwaV9oYW5kbGU7Ci0gICAgQk9PTCAoKmlzYXBpX3ZlcnNpb24pKEhTRV9WRVJTSU9OX0lORk8gKik7IC8qIGVudHJ5IHBvaW50IDEgKi8KLSAgICBEV09SRCAoKmlzYXBpX2VudHJ5KShMUEVYVEVOU0lPTl9DT05UUk9MX0JMT0NLKTsgLyogZW50cnkgcG9pbnQgMiAqLwotICAgIEJPT0wgKCppc2FwaV90ZXJtKShEV09SRCk7IC8qIG9wdGlvbmFsIGVudHJ5IHBvaW50IDMgKi8KLQotICAgIGlzYXBpX2NpZCAqY2lkID0gYXBfcGNhbGxvYyhyLT5wb29sLCBzaXplb2YoaXNhcGlfY2lkKSk7Ci0gICAgYXBfdGFibGVfdCAqZSA9IHItPnN1YnByb2Nlc3NfZW52OwotICAgIGludCByZXR2YWw7Ci0KLSAgICAvKiBVc2Ugc2ltaWxhciByZXN0cmljdGlvbnMgYXMgQ0dJcyAqLwotCi0gICAgaWYgKCEoYXBfYWxsb3dfb3B0aW9ucyhyKSAmIE9QVF9FWEVDQ0dJKSkKLQlyZXR1cm4gRk9SQklEREVOOwotCi0gICAgaWYgKHItPmZpbmZvLnN0X21vZGUgPT0gMCkKLQlyZXR1cm4gTk9UX0ZPVU5EOwotCi0gICAgaWYgKFNfSVNESVIoci0+ZmluZm8uc3RfbW9kZSkpCi0JcmV0dXJuIEZPUkJJRERFTjsKLQotICAgIC8qIExvYWQgdGhlIG1vZHVsZSAqLwotCi0gICAgaWYgKCEoaXNhcGlfaGFuZGxlID0gTG9hZExpYnJhcnlFeChyLT5maWxlbmFtZSwgTlVMTCwKLQkJCQkgICAgICAgTE9BRF9XSVRIX0FMVEVSRURfU0VBUkNIX1BBVEgpKSkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlQsIHIsCi0JCSAgICAiQ291bGQgbm90IGxvYWQgRExMOiAlcyIsIHItPmZpbGVuYW1lKTsKLQlyZXR1cm4gU0VSVkVSX0VSUk9SOwotICAgIH0KLQotICAgIGlmICghKGlzYXBpX3ZlcnNpb24gPQotCSAgKHZvaWQgKikoR2V0UHJvY0FkZHJlc3MoaXNhcGlfaGFuZGxlLCAiR2V0RXh0ZW5zaW9uVmVyc2lvbiIpKSkpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJULCByLAotCQkgICAgIkRMTCBjb3VsZCBub3QgbG9hZCBHZXRFeHRlbnNpb25WZXJzaW9uKCk6ICVzIiwgci0+ZmlsZW5hbWUpOwotCUZyZWVMaWJyYXJ5KGlzYXBpX2hhbmRsZSk7Ci0JcmV0dXJuIFNFUlZFUl9FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAoIShpc2FwaV9lbnRyeSA9Ci0JICAodm9pZCAqKShHZXRQcm9jQWRkcmVzcyhpc2FwaV9oYW5kbGUsICJIdHRwRXh0ZW5zaW9uUHJvYyIpKSkpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJULCByLAotCQkgICAgIkRMTCBjb3VsZCBub3QgbG9hZCBIdHRwRXh0ZW5zaW9uUHJvYygpOiAlcyIsIHItPmZpbGVuYW1lKTsKLQlGcmVlTGlicmFyeShpc2FwaV9oYW5kbGUpOwotCXJldHVybiBTRVJWRVJfRVJST1I7Ci0gICAgfQotCi0gICAgaXNhcGlfdGVybSA9ICh2b2lkICopKEdldFByb2NBZGRyZXNzKGlzYXBpX2hhbmRsZSwgIlRlcm1pbmF0ZUV4dGVuc2lvbiIpKTsKLQotICAgIC8qIFJ1biBHZXRFeHRlbnNpb25WZXJzaW9uKCkgKi8KLQotICAgIGlmICghKCppc2FwaV92ZXJzaW9uKShwVmVyKSkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlQsIHIsCi0JCSAgICAiSVNBUEkgR2V0RXh0ZW5zaW9uVmVyc2lvbigpIGZhaWxlZDogJXMiLCByLT5maWxlbmFtZSk7Ci0JRnJlZUxpYnJhcnkoaXNhcGlfaGFuZGxlKTsKLQlyZXR1cm4gU0VSVkVSX0VSUk9SOwotICAgIH0KLQotICAgIC8qIFNldCB1cCB2YXJpYWJsZXMgKi8KLSAgICBhcF9hZGRfY29tbW9uX3ZhcnMocik7Ci0gICAgYXBfYWRkX2NnaV92YXJzKHIpOwotCi0gICAgLyogU2V0IHVwIGNvbm5lY3Rpb24gSUQgKi8KLSAgICBlY2ItPkNvbm5JRCA9IChIQ09OTiljaWQ7Ci0gICAgY2lkLT5lY2IgPSBlY2I7Ci0gICAgY2lkLT5yID0gcjsKLSAgICBjaWQtPnN0YXR1cyA9IDA7Ci0KLSAgICBlY2ItPmNiU2l6ZSA9IHNpemVvZihzdHJ1Y3QgX0VYVEVOU0lPTl9DT05UUk9MX0JMT0NLKTsKLSAgICBlY2ItPmR3VmVyc2lvbiA9IE1BS0VMT05HKDAsIDIpOwotICAgIGVjYi0+ZHdIdHRwU3RhdHVzQ29kZSA9IDA7Ci0gICAgc3RyY3B5KGVjYi0+bHBzekxvZ0RhdGEsICIiKTsKLSAgICBlY2ItPmxwc3pNZXRob2QgPSByLT5tZXRob2Q7Ci0gICAgZWNiLT5scHN6UXVlcnlTdHJpbmcgPSBhcF90YWJsZV9nZXQoZSwgIlFVRVJZX1NUUklORyIpOwotICAgIGVjYi0+bHBzelBhdGhJbmZvID0gYXBfdGFibGVfZ2V0KGUsICJQQVRIX0lORk8iKTsKLSAgICBlY2ItPmxwc3pQYXRoVHJhbnNsYXRlZCA9IGFwX3RhYmxlX2dldChlLCAiUEFUSF9UUkFOU0xBVEVEIik7Ci0gICAgZWNiLT5scHN6Q29udGVudFR5cGUgPSBhcF90YWJsZV9nZXQoZSwgIkNPTlRFTlRfVFlQRSIpOwotCi0gICAgLyogU2V0IHVwIGNsaWVudCBpbnB1dCAqLwotICAgIGlmICgocmV0dmFsID0gYXBfc2V0dXBfY2xpZW50X2Jsb2NrKHIsIFJFUVVFU1RfQ0hVTktFRF9FUlJPUikpKSB7Ci0JaWYgKGlzYXBpX3Rlcm0pICgqaXNhcGlfdGVybSkoSFNFX1RFUk1fTVVTVF9VTkxPQUQpOwotCUZyZWVMaWJyYXJ5KGlzYXBpX2hhbmRsZSk7Ci0JcmV0dXJuIHJldHZhbDsKLSAgICB9Ci0KLSAgICBpZiAoYXBfc2hvdWxkX2NsaWVudF9ibG9jayhyKSkgewotCS8qIFVubGlrZSBJSVMsIHdoaWNoIGxpbWl0cyB0aGlzIHRvIDQ4aywgd2UgcmVhZCB0aGUgd2hvbGUKLQkgKiBzdWNrZXIgaW4uIEkgc3VwcG9zZSB0aGlzIGNvdWxkIGJlIGJhZCBmb3IgbWVtb3J5IGlmIHNvbWVvbmUKLQkgKiB1cGxvYWRlZCB0aGUgY29tcGxldGUgd29ya3Mgb2YgU2hha2VzcGVhcmUuIFdlbGwsIFdlYlNpdGUKLQkgKiBkb2VzIHRoZSBzYW1lIHRoaW5nLgotCSAqLwotCWxvbmcgdG9fcmVhZCA9IGF0b2woYXBfdGFibGVfZ2V0KGUsICJDT05URU5UX0xFTkdUSCIpKTsKLQlsb25nIHJlYWQ7Ci0KLQkvKiBBY3R1YWxseSwgbGV0J3MgY2FwIGl0IGF0IDQ4aywgdW50aWwgd2UgZmlndXJlIG91dCB3aGF0Ci0JICogdG8gZG8gd2l0aCB0aGlzLi4uIHdlIGRvbid0IHdhbnQgYSBDb250ZW50LUxlbmd0aDogMTAwMDAwMDAwMAotCSAqIHRha2luZyBvdXQgdGhlIG1hY2hpbmUuCi0JICovCi0KLQlpZiAodG9fcmVhZCA+IDQ5MTUyKSB7Ci0JICAgIGlmIChpc2FwaV90ZXJtKSAoKmlzYXBpX3Rlcm0pKEhTRV9URVJNX01VU1RfVU5MT0FEKTsKLQkgICAgRnJlZUxpYnJhcnkoaXNhcGlfaGFuZGxlKTsKLQkgICAgcmV0dXJuIEhUVFBfUkVRVUVTVF9FTlRJVFlfVE9PX0xBUkdFOwotCX0KLQotCWVjYi0+bHBiRGF0YSA9IGFwX3BjYWxsb2Moci0+cG9vbCwgMSArIHRvX3JlYWQpOwotCi0JaWYgKChyZWFkID0gYXBfZ2V0X2NsaWVudF9ibG9jayhyLCBlY2ItPmxwYkRhdGEsIHRvX3JlYWQpKSA8IDApIHsKLQkgICAgaWYgKGlzYXBpX3Rlcm0pICgqaXNhcGlfdGVybSkoSFNFX1RFUk1fTVVTVF9VTkxPQUQpOwotCSAgICBGcmVlTGlicmFyeShpc2FwaV9oYW5kbGUpOwotCSAgICByZXR1cm4gU0VSVkVSX0VSUk9SOwotCX0KLQotCS8qIEFsdGhvdWdoIGl0cyBub3QgdG8gc3BlYywgSUlTIHNlZW1zIHRvIG51bGwtdGVybWluYXRlCi0JICogaXRzIGxwZERhdGEgc3RyaW5nLiBTbyB3ZSB3aWxsIHRvby4gVG8gbWFrZSBzdXJlCi0JICogY2JBdmFpbGFibGUgbWF0Y2hlcyBjYlRvdGFsQnl0ZXMsIHdlJ2xsIHVwIHRoZSBsYXR0ZXIKLQkgKiBhbmQgZXF1YWxpemUgdGhlbS4KLQkgKi8KLQllY2ItPmNiQXZhaWxhYmxlID0gZWNiLT5jYlRvdGFsQnl0ZXMgPSByZWFkICsgMTsKLQllY2ItPmxwYkRhdGFbcmVhZF0gPSAnXDAnOwotCX0KLSAgICBlbHNlIHsKLQllY2ItPmNiVG90YWxCeXRlcyA9IDA7Ci0JZWNiLT5jYkF2YWlsYWJsZSA9IDA7Ci0JZWNiLT5scGJEYXRhID0gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBTZXQgdXAgdGhlIGNhbGxiYWNrcyAqLwotCi0gICAgZWNiLT5HZXRTZXJ2ZXJWYXJpYWJsZSA9ICZHZXRTZXJ2ZXJWYXJpYWJsZTsKLSAgICBlY2ItPldyaXRlQ2xpZW50ID0gJldyaXRlQ2xpZW50OwotICAgIGVjYi0+UmVhZENsaWVudCA9ICZSZWFkQ2xpZW50OwotICAgIGVjYi0+U2VydmVyU3VwcG9ydEZ1bmN0aW9uID0gJlNlcnZlclN1cHBvcnRGdW5jdGlvbjsKLQotICAgIC8qIEFsbCByaWdodC4uLiB0cnkgYW5kIGxvYWQgdGhlIHN1Y2tlciAqLwotICAgIHJldHZhbCA9ICgqaXNhcGlfZW50cnkpKGVjYik7Ci0KLSAgICAvKiBTZXQgdGhlIHN0YXR1cyAoZm9yIGxvZ2dpbmcpICovCi0gICAgaWYgKGVjYi0+ZHdIdHRwU3RhdHVzQ29kZSkKLQlyLT5zdGF0dXMgPSBlY2ItPmR3SHR0cFN0YXR1c0NvZGU7Ci0KLSAgICAvKiBDaGVjayBmb3IgYSBsb2cgbWVzc2FnZSAtIGFuZCBsb2cgaXQgKi8KLSAgICBpZiAoZWNiLT5scHN6TG9nRGF0YSAmJiBzdHJjbXAoZWNiLT5scHN6TG9nRGF0YSwgIiIpKQotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotCQkgICAgIiVzOiAlcyIsIGVjYi0+bHBzekxvZ0RhdGEsIHItPmZpbGVuYW1lKTsKLQotICAgIC8qIEFsbCBkb25lIHdpdGggdGhlIERMTC4uLiBnZXQgcmlkIG9mIGl0ICovCi0gICAgaWYgKGlzYXBpX3Rlcm0pICgqaXNhcGlfdGVybSkoSFNFX1RFUk1fTVVTVF9VTkxPQUQpOwotICAgIEZyZWVMaWJyYXJ5KGlzYXBpX2hhbmRsZSk7Ci0KLSAgICBzd2l0Y2gocmV0dmFsKSB7Ci0gICAgY2FzZSBIU0VfU1RBVFVTX1NVQ0NFU1M6Ci0gICAgY2FzZSBIU0VfU1RBVFVTX1NVQ0NFU1NfQU5EX0tFRVBfQ09OTjoKLQkvKiBJZ25vcmUgdGhlIGtlZXBhbGl2ZSBzdHVmZjsgQXBhY2hlIGhhbmRsZXMgaXQganVzdCBmaW5lIHdpdGhvdXQKLQkgKiB0aGUgSVNBJ3MgImFkdmljZSIuCi0JICovCi0KLQlpZiAoY2lkLT5zdGF0dXMpIC8qIFdlIGhhdmUgYSBzcGVjaWFsIHN0YXR1cyB0byByZXR1cm4gKi8KLQkgICAgcmV0dXJuIGNpZC0+c3RhdHVzOwotCi0JcmV0dXJuIE9LOwotICAgIGNhc2UgSFNFX1NUQVRVU19QRU5ESU5HOgkvKiBXZSBkb24ndCBzdXBwb3J0IHRoaXMgKi8KLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIHIsCi0JCSAgICAiSVNBUEkgYXN5bmNocm9ub3VzIEkvTyBub3Qgc3VwcG9ydGVkOiAlcyIsIHItPmZpbGVuYW1lKTsKLSAgICBjYXNlIEhTRV9TVEFUVVNfRVJST1I6Ci0gICAgZGVmYXVsdDoKLQlyZXR1cm4gU0VSVkVSX0VSUk9SOwotICAgIH0KLQotfQotI3ByYWdtYSBvcHRpbWl6ZSgiIixvbikKLQotQk9PTCBXSU5BUEkgR2V0U2VydmVyVmFyaWFibGUgKEhDT05OIGhDb25uLCBMUFNUUiBscHN6VmFyaWFibGVOYW1lLAotCQkJICAgICAgIExQVk9JRCBscHZCdWZmZXIsIExQRFdPUkQgbHBkd1NpemVvZkJ1ZmZlcikgewotICAgIHJlcXVlc3RfcmVjICpyID0gKChpc2FwaV9jaWQgKiloQ29ubiktPnI7Ci0gICAgYXBfdGFibGVfdCAqZSA9IHItPnN1YnByb2Nlc3NfZW52OwotICAgIGNvbnN0IGNoYXIgKnJlc3VsdDsKLSAgICAKLSAgICAvKiBNb3N0bHksIHdlIGp1c3QgZ3JhYiBpdCBmcm9tIHRoZSBlbnZpcm9ubWVudCwgYnV0IHRoZXJlIGFyZQotICAgICAqIGEgY291cGxlIG9mIHNwZWNpYWwgY2FzZXMKLSAgICAgKi8KLQotICAgIGlmICghc3RyY2FzZWNtcChscHN6VmFyaWFibGVOYW1lLCAiVU5NQVBQRURfUkVNT1RFX1VTRVIiKSkgewotCS8qIFdlIGRvbid0IHN1cHBvcnQgTlQgdXNlcnMsIHNvIHRoaXMgaXMgYWx3YXlzIHRoZSBzYW1lIGFzCi0JICogUkVNT1RFX1VTRVIKLQkgKi8KLQlyZXN1bHQgPSBhcF90YWJsZV9nZXQoZSwgIlJFTU9URV9VU0VSIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGxwc3pWYXJpYWJsZU5hbWUsICJTRVJWRVJfUE9SVF9TRUNVUkUiKSkgewotCS8qIEFwYWNoZSBkb2Vzbid0IHN1cHBvcnQgc2VjdXJlIHJlcXVlc3RzIGluaGVyZW50bHksIHNvCi0JICogd2UgaGF2ZSBubyB3YXkgb2Yga25vd2luZy4gV2UnbGwgYmUgY29uc2VydmF0aXZlLCBhbmQgc2F5Ci0JICogYWxsIHJlcXVlc3RzIGFyZSBpbnNlY3VyZS4KLQkgKi8KLQlyZXN1bHQgPSAiMCI7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGxwc3pWYXJpYWJsZU5hbWUsICJVUkwiKSkgewotCXJlc3VsdCA9IHItPnVyaTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JcmVzdWx0ID0gYXBfdGFibGVfZ2V0KGUsIGxwc3pWYXJpYWJsZU5hbWUpOwotICAgIH0KLQotICAgIGlmIChyZXN1bHQpIHsKLQlpZiAoc3RybGVuKHJlc3VsdCkgPiAqbHBkd1NpemVvZkJ1ZmZlcikgewotCSAgICAqbHBkd1NpemVvZkJ1ZmZlciA9IHN0cmxlbihyZXN1bHQpOwotCSAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7Ci0JICAgIHJldHVybiBGQUxTRTsKLQl9Ci0Jc3RybmNweShscHZCdWZmZXIsIHJlc3VsdCwgKmxwZHdTaXplb2ZCdWZmZXIpOwotCXJldHVybiBUUlVFOwotICAgIH0KLQotICAgIC8qIERpZG4ndCBmaW5kIGl0ICovCi0gICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfSU5ERVgpOwotICAgIHJldHVybiBGQUxTRTsKLX0KLQotQk9PTCBXSU5BUEkgV3JpdGVDbGllbnQgKEhDT05OIENvbm5JRCwgTFBWT0lEIEJ1ZmZlciwgTFBEV09SRCBscHdkd0J5dGVzLAotCQkJIERXT1JEIGR3UmVzZXJ2ZWQpIHsKLSAgICByZXF1ZXN0X3JlYyAqciA9ICgoaXNhcGlfY2lkICopQ29ubklEKS0+cjsKLSAgICBpbnQgd3JpdDsJLyogd3JpdHRlbiwgYWN0dWFsbHksIGJ1dCB3aHkgc2hvdWxkbid0IEkgbWFrZSB1cCB3b3Jkcz8gKi8KLQotICAgIC8qIFdlIG9ubHkgc3VwcG9ydCBzeW5jaHJvbm91cyB3cml0aW5nICovCi0gICAgaWYgKGR3UmVzZXJ2ZWQgJiYgZHdSZXNlcnZlZCAhPSBIU0VfSU9fU1lOQykgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgciwKLQkJICAgICJJU0FQSSBhc3luY2hyb25vdXMgSS9PIG5vdCBzdXBwb3J0ZWQ6ICVzIiwgci0+ZmlsZW5hbWUpOwotCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7Ci0JcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIGlmICgod3JpdCA9IGFwX3J3cml0ZShCdWZmZXIsICpscHdkd0J5dGVzLCByKSkgPT0gRU9GKSB7Ci0JU2V0TGFzdEVycm9yKEVSUk9SKTsgLyogWFhYOiBGaW5kIHRoZSByaWdodCBlcnJvciBjb2RlICovCi0JcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgIAotICAgICpscHdkd0J5dGVzID0gd3JpdDsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotQk9PTCBXSU5BUEkgUmVhZENsaWVudCAoSENPTk4gQ29ubklELCBMUFZPSUQgbHB2QnVmZmVyLCBMUERXT1JEIGxwZHdTaXplKSB7Ci0gICAgLyogRG9lc24ndCBuZWVkIHRvIGRvIGFueXRoaW5nOyB3ZSd2ZSByZWFkIGFsbCB0aGUgZGF0YSBhbHJlYWR5ICovCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qIFhYWDogVGhlcmUgaXMgYW4gTyhuXjIpIGF0dGFjayBwb3NzaWJsZSBoZXJlLiAqLwotQk9PTCBXSU5BUEkgU2VydmVyU3VwcG9ydEZ1bmN0aW9uIChIQ09OTiBoQ29ubiwgRFdPUkQgZHdIU0VSZXF1ZXN0LAotCQkJCSAgIExQVk9JRCBscHZCdWZmZXIsIExQRFdPUkQgbHBkd1NpemUsCi0JCQkJICAgTFBEV09SRCBscGR3RGF0YVR5cGUpIHsKLSAgICBpc2FwaV9jaWQgKmNpZCA9IChpc2FwaV9jaWQgKiloQ29ubjsKLSAgICByZXF1ZXN0X3JlYyAqc3VicmVxLCAqciA9IGNpZC0+cjsKLSAgICBjaGFyICpkYXRhOwotCi0gICAgc3dpdGNoIChkd0hTRVJlcXVlc3QpIHsKLSAgICBjYXNlIEhTRV9SRVFfU0VORF9VUkxfUkVESVJFQ1RfUkVTUDoKLQkvKiBTZXQgdGhlIHN0YXR1cyB0byBiZSByZXR1cm5lZCB3aGVuIHRoZSBIdHRwRXh0ZW5zaW9uUHJvYygpCi0JICogaXMgZG9uZS4KLQkgKi8KLQlhcF90YWJsZV9zZXQgKHItPmhlYWRlcnNfb3V0LCAiTG9jYXRpb24iLCBscHZCdWZmZXIpOwotCWNpZC0+c3RhdHVzID0gY2lkLT5yLT5zdGF0dXMgPSBjaWQtPmVjYi0+ZHdIdHRwU3RhdHVzQ29kZSA9IFJFRElSRUNUOwotCXJldHVybiBUUlVFOwotCi0gICAgY2FzZSBIU0VfUkVRX1NFTkRfVVJMOgotCS8qIFJlYWQgYW55IGFkZGl0aW9uYWwgaW5wdXQgKi8KLQotCWlmIChyLT5yZW1haW5pbmcgPiAwKSB7Ci0JICAgIGNoYXIgYXJnc2J1ZmZlcltIVUdFX1NUUklOR19MRU5dOwotCi0JICAgIHdoaWxlIChhcF9nZXRfY2xpZW50X2Jsb2NrKHIsIGFyZ3NidWZmZXIsIEhVR0VfU1RSSU5HX0xFTikpOwotCX0KLQkKLQkvKiBSZXNldCB0aGUgbWV0aG9kIHRvIEdFVCAqLwotCXItPm1ldGhvZCA9IGFwX3BzdHJkdXAoci0+cG9vbCwgIkdFVCIpOwotCXItPm1ldGhvZF9udW1iZXIgPSBNX0dFVDsKLQotCS8qIERvbid0IGxldCBhbnlvbmUgdGhpbmsgdGhlcmUncyBzdGlsbCBkYXRhICovCi0JYXBfdGFibGVfdW5zZXQoci0+aGVhZGVyc19pbiwgIkNvbnRlbnQtTGVuZ3RoIik7Ci0JCi0JYXBfaW50ZXJuYWxfcmVkaXJlY3QoKGNoYXIgKilscHZCdWZmZXIsIHIpOwkKLQlyZXR1cm4gVFJVRTsKLQotICAgIGNhc2UgSFNFX1JFUV9TRU5EX1JFU1BPTlNFX0hFQURFUjoKLQlyLT5zdGF0dXNfbGluZSA9IGxwdkJ1ZmZlciA/IGxwdkJ1ZmZlciA6IGFwX3BzdHJkdXAoci0+cG9vbCwgIjIwMCBPSyIpOwotCXNzY2FuZihyLT5zdGF0dXNfbGluZSwgIiVkIiwgJnItPnN0YXR1cyk7Ci0JY2lkLT5lY2ItPmR3SHR0cFN0YXR1c0NvZGUgPSByLT5zdGF0dXM7Ci0KLQkvKiBOb3cgZmlsbCBpbiB0aGUgSFRUUCBoZWFkZXJzLCBhbmQgdGhlIHJlc3Qgb2YgaXQuIEljay4KLQkgKiBscGR3RGF0YVR5cGUgY29udGFpbnMgYSBzdHJpbmcgdGhhdCBoYXMgaGVhZGVycyAoaW4gTUlNRQotCSAqIGZvcm1hdCksIGEgYmxhbmsgbGlrZSwgdGhlbiAocG9zc2libHkpIGRhdGEuIFdlIG5lZWQKLQkgKiB0byBwYXJzZSBpdC4KLQkgKgotCSAqIEVhc3kgY2FzZSBmaXJzdDoKLQkgKi8KLQlpZiAoIWxwZHdEYXRhVHlwZSkgewotCSAgICBhcF9zZW5kX2h0dHBfaGVhZGVyKHIpOwotCSAgICByZXR1cm4gVFJVRTsKLQl9Ci0KLQkvKiBNYWtlIGEgY29weSAtIGRvbid0IGRpc3R1cmIgdGhlIG9yaWdpbmFsICovCi0JZGF0YSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgKGNoYXIgKilscGR3RGF0YVR5cGUpOwotCi0JLyogV2UgKnNob3VsZCogYnJlYWsgYmVmb3JlIHRoaXMgd2hpbGUgbG9vcCBlbmRzICovCi0Jd2hpbGUgKCpkYXRhKSB7Ci0JICAgIGNoYXIgKnZhbHVlLCAqbGYgPSBzdHJjaHIoZGF0YSwgJ1xuJyk7Ci0JICAgIGludCBwOwotCi0jaWZkZWYgUkVMQVhfSEVBREVSX1JVTEUKLQkgICAgaWYgKGxmKQotCQkqbGYgPSAnXDAnOwotI2Vsc2UKLQkgICAgaWYgKCFsZikgeyAvKiBIdWg/IEludmFsaWQgZGF0YSwgSSB0aGluayAqLwotCQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLQkJCSAgICAiSVNBIHNlbnQgaW52YWxpZCBoZWFkZXJzOiAlcyIsIHItPmZpbGVuYW1lKTsKLQkJU2V0TGFzdEVycm9yKEVSUk9SKTsJLyogWFhYOiBGaW5kIHJpZ2h0IGVycm9yICovCi0JCXJldHVybiBGQUxTRTsKLQkgICAgfQotCi0JICAgIC8qIEdldCByaWQgb2YgXG4gYW5kIFxyICovCi0JICAgICpsZiA9ICdcMCc7Ci0jZW5kaWYKLQkgICAgcCA9IHN0cmxlbihkYXRhKTsKLQkgICAgaWYgKHAgPiAwICYmIGRhdGFbcC0xXSA9PSAnXHInKSBkYXRhW3AtMV0gPSAnXDAnOwotCSAgICAKLQkgICAgLyogRW5kIG9mIGhlYWRlcnMgKi8KLQkgICAgaWYgKCpkYXRhID09ICdcMCcpIHsKLSNpZmRlZiBSRUxBWF9IRUFERVJfUlVMRQotCQlpZiAobGYpCi0jZW5kaWYKLQkJICAgIGRhdGEgPSBsZiArIDE7CS8qIFJlc2V0IGRhdGEgKi8KLQkJYnJlYWs7Ci0JICAgIH0KLQotCSAgICBpZiAoISh2YWx1ZSA9IHN0cmNocihkYXRhLCAnOicpKSkgewotCQlTZXRMYXN0RXJyb3IoRVJST1IpOwkvKiBYWFg6IEZpbmQgcmlnaHQgZXJyb3IgKi8KLQkJYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0JCQkgICAgIklTQSBzZW50IGludmFsaWQgaGVhZGVycyIsIHItPmZpbGVuYW1lKTsKLQkJcmV0dXJuIEZBTFNFOwotCSAgICB9Ci0KLQkgICAgKnZhbHVlKysgPSAnXDAnOwotCSAgICB3aGlsZSAoKnZhbHVlICYmIGFwX2lzc3BhY2UoKnZhbHVlKSkgKyt2YWx1ZTsKLQotCSAgICAvKiBDaGVjayBhbGwgdGhlIHNwZWNpYWwtY2FzZSBoZWFkZXJzLiBTaW1pbGFyIHRvIHdoYXQKLQkgICAgICogYXBfc2Nhbl9zY3JpcHRfaGVhZGVyX2VycigpIGRvZXMgKHNlZSB0aGF0IGZ1bmN0aW9uIGZvcgotCSAgICAgKiBtb3JlIGRldGFpbCkKLQkgICAgICovCi0KLQkgICAgaWYgKCFzdHJjYXNlY21wKGRhdGEsICJDb250ZW50LVR5cGUiKSkgewotCQljaGFyICp0bXA7Ci0JCS8qIE51a2UgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLwotCQkKLQkJY2hhciAqZW5kcCA9IHZhbHVlICsgc3RybGVuKHZhbHVlKSAtIDE7Ci0JCXdoaWxlIChlbmRwID4gdmFsdWUgJiYgYXBfaXNzcGFjZSgqZW5kcCkpICplbmRwLS0gPSAnXDAnOwotICAgICAgICAgICAgCi0JCXRtcCA9IGFwX3BzdHJkdXAgKHItPnBvb2wsIHZhbHVlKTsKLQkJYXBfc3RyX3RvbG93ZXIodG1wKTsKLQkJci0+Y29udGVudF90eXBlID0gdG1wOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGRhdGEsICJDb250ZW50LUxlbmd0aCIpKSB7Ci0JCWFwX3RhYmxlX3NldChyLT5oZWFkZXJzX291dCwgZGF0YSwgdmFsdWUpOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGRhdGEsICJUcmFuc2Zlci1FbmNvZGluZyIpKSB7Ci0JCWFwX3RhYmxlX3NldChyLT5oZWFkZXJzX291dCwgZGF0YSwgdmFsdWUpOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGRhdGEsICJTZXQtQ29va2llIikpIHsKLQkJYXBfdGFibGVfYWRkKHItPmVycl9oZWFkZXJzX291dCwgZGF0YSwgdmFsdWUpOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQlhcF90YWJsZV9tZXJnZShyLT5lcnJfaGVhZGVyc19vdXQsIGRhdGEsIHZhbHVlKTsKLQkgICAgfQotCSAgCi0JICAgIC8qIFJlc2V0IGRhdGEgKi8KLSNpZmRlZiBSRUxBWF9IRUFERVJfUlVMRQotCSAgICBpZiAoIWxmKSB7Ci0JCWRhdGEgKz0gcDsKLQkJYnJlYWs7Ci0JICAgIH0KLSNlbmRpZgotCSAgICBkYXRhID0gbGYgKyAxOwotCX0KLQkKLQkvKiBBbGwgdGhlIGhlYWRlcnMgc2hvdWxkIGJlIHNldCBub3cgKi8KLQotCWFwX3NlbmRfaHR0cF9oZWFkZXIocik7Ci0KLQkvKiBBbnkgZGF0YSBsZWZ0IHNob3VsZCBub3cgYmUgc2VudCBkaXJlY3RseSAqLwotCWFwX3JwdXRzKGRhdGEsIHIpOwotCi0JcmV0dXJuIFRSVUU7Ci0KLSAgICBjYXNlIEhTRV9SRVFfTUFQX1VSTF9UT19QQVRIOgotCS8qIE1hcCBhIFVSTCB0byBhIGZpbGVuYW1lICovCi0Jc3VicmVxID0gYXBfc3ViX3JlcV9sb29rdXBfdXJpKGFwX3BzdHJuZHVwKHItPnBvb2wsIChjaGFyICopbHB2QnVmZmVyLAotCQkJCQkgICAgICAqbHBkd1NpemUpLCByKTsKLQotCUdldEZ1bGxQYXRoTmFtZShzdWJyZXEtPmZpbGVuYW1lLCAqbHBkd1NpemUgLSAxLCAoY2hhciAqKWxwdkJ1ZmZlciwgTlVMTCk7Ci0KLQkvKiBJSVMgcHV0cyBhIHRyYWlsaW5nIHNsYXNoIG9uIGRpcmVjdG9yaWVzLCBBcGFjaGUgZG9lc24ndCAqLwotCi0JaWYgKFNfSVNESVIgKHN1YnJlcS0+ZmluZm8uc3RfbW9kZSkpIHsKLQkJaW50IGwgPSBzdHJsZW4oKGNoYXIgKilscHZCdWZmZXIpOwotCi0JCSgoY2hhciAqKWxwdkJ1ZmZlcilbbF0gPSAnXFwnOwotCQkoKGNoYXIgKilscHZCdWZmZXIpW2wgKyAxXSA9ICdcMCc7Ci0JfQotCQotCXJldHVybiBUUlVFOwotCi0gICAgY2FzZSBIU0VfUkVRX0RPTkVfV0lUSF9TRVNTSU9OOgotCS8qIERvIG5vdGhpbmcuLi4gc2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBhc3luYyBJL08sIHRoZXknbGwKLQkgKiByZXR1cm4gZnJvbSBIdHRwRXh0ZW5zaW9uUHJvYyBzb29uCi0JICovCi0JcmV0dXJuIFRSVUU7Ci0KLSAgICAvKiBXZSBkb24ndCBzdXBwb3J0IGFsbCB0aGlzIGFzeW5jIEkvTywgTWljcm9zb2Z0LXNwZWNpZmljIHN0dWZmICovCi0gICAgY2FzZSBIU0VfUkVRX0lPX0NPTVBMRVRJT046Ci0gICAgY2FzZSBIU0VfUkVRX1RSQU5TTUlUX0ZJTEU6Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCByLAotCQkgICAgIklTQVBJIGFzeW5jaHJvbm91cyBJL08gbm90IHN1cHBvcnRlZDogJXMiLCByLT5maWxlbmFtZSk7Ci0gICAgZGVmYXVsdDoKLQlTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwotCXJldHVybiBGQUxTRTsKLSAgICB9Ci19Ci0KLWhhbmRsZXJfcmVjIGlzYXBpX2hhbmRsZXJzW10gPSB7Ci17ICJpc2FwaS1pc2EiLCBpc2FwaV9oYW5kbGVyIH0sCi17IE5VTEx9Ci19OwotCi1tb2R1bGUgaXNhcGlfbW9kdWxlID0gewotICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGLAotICAgTlVMTCwJCQkvKiBpbml0aWFsaXplciAqLwotICAgTlVMTCwJCQkvKiBjcmVhdGUgcGVyLWRpciBjb25maWcgKi8KLSAgIE5VTEwsCQkJLyogbWVyZ2UgcGVyLWRpciBjb25maWcgKi8KLSAgIE5VTEwsCQkJLyogc2VydmVyIGNvbmZpZyAqLwotICAgTlVMTCwJCQkvKiBtZXJnZSBzZXJ2ZXIgY29uZmlnICovCi0gICBOVUxMLAkJCS8qIGNvbW1hbmQgYXBfdGFibGVfdCAqLwotICAgaXNhcGlfaGFuZGxlcnMsCSAgICAgICAJLyogaGFuZGxlcnMgKi8KLSAgIE5VTEwsCQkJLyogZmlsZW5hbWUgdHJhbnNsYXRpb24gKi8KLSAgIE5VTEwsCQkJLyogY2hlY2tfdXNlcl9pZCAqLwotICAgTlVMTCwJCQkvKiBjaGVjayBhdXRoICovCi0gICBOVUxMLAkJCS8qIGNoZWNrIGFjY2VzcyAqLwotICAgTlVMTCwJCQkvKiB0eXBlX2NoZWNrZXIgKi8KLSAgIE5VTEwsCQkJLyogbG9nZ2VyICovCi0gICBOVUxMCQkJCS8qIGhlYWRlciBwYXJzZXIgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL2NhY2hlLy5pbmRlbnQucHJvIGIvbW9kdWxlcy9jYWNoZS8uaW5kZW50LnBybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlmYmU5Zi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2NhY2hlLy5pbmRlbnQucHJvCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLWk0IC1ucHNsIC1kaTAgLWJyIC1uY2UgLWQwIC1jbGkwIC1ucGNzIC1uZmMxCi0tVEJVRkYKLS1URklMRQotLVRUUkFOUwotLVRVSU5UNAotLVRfdHJhbnMKLS1UYWxsb3dfb3B0aW9uc190Ci0tVGFwYWNoZV9zZmlvCi0tVGFycmF5X2hlYWRlcgotLVRib29sX2ludAotLVRidWZfYXJlYQotLVRidWZmX3N0cnVjdAotLVRidWZmeQotLVRjbWRfaG93Ci0tVGNtZF9wYXJtcwotLVRjb21tYW5kX3JlYwotLVRjb21tYW5kX3N0cnVjdAotLVRjb25uX3JlYwotLVRjb3JlX2Rpcl9jb25maWcKLS1UY29yZV9zZXJ2ZXJfY29uZmlnCi0tVGRpcl9tYWtlcl9mdW5jCi0tVGV2ZW50Ci0tVGdsb2JhbHNfcwotLVRoYW5kbGVyX2Z1bmMKLS1UaGFuZGxlcl9yZWMKLS1Uam9ibGlzdF9zCi0tVGxpc3Rlbl9yZWMKLS1UbWVyZ2VyX2Z1bmMKLS1UbW9kZV90Ci0tVG1vZHVsZQotLVRtb2R1bGVfc3RydWN0Ci0tVG11dGV4Ci0tVG5fbG9uZwotLVRvdGhlcl9jaGlsZF9yZWMKLS1Ub3ZlcnJpZGVzX3QKLS1UcGFyZW50X3Njb3JlCi0tVHBpZF90Ci0tVHBpcGVkX2xvZwotLVRwb29sCi0tVHJlcXVlc3RfcmVjCi0tVHJlcXVpcmVfbGluZQotLVRybGltX3QKLS1Uc2NvcmVib2FyZAotLVRzZW1hcGhvcmUKLS1Uc2VydmVyX2FkZHJfcmVjCi0tVHNlcnZlcl9yZWMKLS1Uc2VydmVyX3JlY19jaGFpbgotLVRzaG9ydF9zY29yZQotLVR0YWJsZQotLVR0YWJsZV9lbnRyeQotLVR0aHJlYWQKLS1UdV93aWRlX2ludAotLVR2dGltZV90Ci0tVHdpZGVfaW50CmRpZmYgLS1naXQgYS9tb2R1bGVzL2VjaG8vLmluZGVudC5wcm8gYi9tb2R1bGVzL2VjaG8vLmluZGVudC5wcm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZmJlOWYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9lY2hvLy5pbmRlbnQucHJvCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLWk0IC1ucHNsIC1kaTAgLWJyIC1uY2UgLWQwIC1jbGkwIC1ucGNzIC1uZmMxCi0tVEJVRkYKLS1URklMRQotLVRUUkFOUwotLVRVSU5UNAotLVRfdHJhbnMKLS1UYWxsb3dfb3B0aW9uc190Ci0tVGFwYWNoZV9zZmlvCi0tVGFycmF5X2hlYWRlcgotLVRib29sX2ludAotLVRidWZfYXJlYQotLVRidWZmX3N0cnVjdAotLVRidWZmeQotLVRjbWRfaG93Ci0tVGNtZF9wYXJtcwotLVRjb21tYW5kX3JlYwotLVRjb21tYW5kX3N0cnVjdAotLVRjb25uX3JlYwotLVRjb3JlX2Rpcl9jb25maWcKLS1UY29yZV9zZXJ2ZXJfY29uZmlnCi0tVGRpcl9tYWtlcl9mdW5jCi0tVGV2ZW50Ci0tVGdsb2JhbHNfcwotLVRoYW5kbGVyX2Z1bmMKLS1UaGFuZGxlcl9yZWMKLS1Uam9ibGlzdF9zCi0tVGxpc3Rlbl9yZWMKLS1UbWVyZ2VyX2Z1bmMKLS1UbW9kZV90Ci0tVG1vZHVsZQotLVRtb2R1bGVfc3RydWN0Ci0tVG11dGV4Ci0tVG5fbG9uZwotLVRvdGhlcl9jaGlsZF9yZWMKLS1Ub3ZlcnJpZGVzX3QKLS1UcGFyZW50X3Njb3JlCi0tVHBpZF90Ci0tVHBpcGVkX2xvZwotLVRwb29sCi0tVHJlcXVlc3RfcmVjCi0tVHJlcXVpcmVfbGluZQotLVRybGltX3QKLS1Uc2NvcmVib2FyZAotLVRzZW1hcGhvcmUKLS1Uc2VydmVyX2FkZHJfcmVjCi0tVHNlcnZlcl9yZWMKLS1Uc2VydmVyX3JlY19jaGFpbgotLVRzaG9ydF9zY29yZQotLVR0YWJsZQotLVR0YWJsZV9lbnRyeQotLVR0aHJlYWQKLS1UdV93aWRlX2ludAotLVR2dGltZV90Ci0tVHdpZGVfaW50CmRpZmYgLS1naXQgYS9tb2R1bGVzL2VjaG8vbW9kX2VjaG8uYyBiL21vZHVsZXMvZWNoby9tb2RfZWNoby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWJlNWQxLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZWNoby9tb2RfZWNoby5jCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImFwX21tbi5oIgotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2Nvbm5lY3Rpb24uaCIKLQotQVBJX1ZBUl9FWFBPUlQgbW9kdWxlIGVjaG9fbW9kdWxlOwotCi10eXBlZGVmIHN0cnVjdAotICAgIHsKLSAgICBpbnQgYkVuYWJsZWQ7Ci0gICAgfSBFY2hvQ29uZmlnOwotCi1zdGF0aWMgdm9pZCAqY3JlYXRlX2VjaG9fc2VydmVyX2NvbmZpZyhhcF9jb250ZXh0X3QgKnAsc2VydmVyX3JlYyAqcykKLSAgICB7Ci0gICAgRWNob0NvbmZpZyAqcENvbmZpZz1hcF9wY2FsbG9jKHAsc2l6ZW9mICpwQ29uZmlnKTsKLQotICAgIHBDb25maWctPmJFbmFibGVkPTA7Ci0KLSAgICByZXR1cm4gcENvbmZpZzsKLSAgICB9Ci0KLXN0YXRpYyBjb25zdCBjaGFyICplY2hvX29uKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotICAgIHsKLSAgICBFY2hvQ29uZmlnICpwQ29uZmlnPWFwX2dldF9tb2R1bGVfY29uZmlnKGNtZC0+c2VydmVyLT5tb2R1bGVfY29uZmlnLAotCQkJCQkgICAgICZlY2hvX21vZHVsZSk7Ci0gICAgcENvbmZpZy0+YkVuYWJsZWQ9MTsKLQotICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotc3RhdGljIGludCBwcm9jZXNzX2VjaG9fY29ubmVjdGlvbihjb25uX3JlYyAqYykKLSAgICB7Ci0gICAgY2hhciBidWZbMTAyNF07Ci0gICAgRWNob0NvbmZpZyAqcENvbmZpZz1hcF9nZXRfbW9kdWxlX2NvbmZpZyhjLT5iYXNlX3NlcnZlci0+bW9kdWxlX2NvbmZpZywKLQkJCQkJICAgICAmZWNob19tb2R1bGUpOwotCi0gICAgaWYoIXBDb25maWctPmJFbmFibGVkKQotCXJldHVybiBERUNMSU5FRDsKLQotICAgIGZvciggOyA7ICkKLQl7Ci0JYXBfc3NpemVfdCByLCB3OwotICAgICAgICAodm9pZCkgYXBfYnJlYWQoYy0+Y2xpZW50LGJ1ZixzaXplb2YgYnVmLCZyKTsKLQlpZihyIDw9IDApCi0JICAgIGJyZWFrOwotCSh2b2lkKSBhcF9id3JpdGUoYy0+Y2xpZW50LGJ1ZixyLCAmdyk7Ci0JaWYodyAhPSByKQotCSAgICBicmVhazsKLQlhcF9iZmx1c2goYy0+Y2xpZW50KTsKLQl9Ci0gICAgcmV0dXJuIE9LOwotICAgIH0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIGVjaG9fY21kc1tdID0gewoteyAiUHJvdG9jb2xFY2hvIiwgZWNob19vbiwgTlVMTCwgUlNSQ19DT05GLCBSQVdfQVJHUywKLSAgIlJ1biBhbiBlY2hvIHNlcnZlciBvbiB0aGlzIGhvc3QiIH0sCi17IE5VTEwgfQotfTsKLQotc3RhdGljIHZvaWQgcmVnaXN0ZXJfaG9va3MoKQotewotICAgIGFwX2hvb2tfcHJvY2Vzc19jb25uZWN0aW9uKHByb2Nlc3NfZWNob19jb25uZWN0aW9uLE5VTEwsTlVMTCxIT09LX01JRERMRSk7Ci19Ci0KLUFQSV9WQVJfRVhQT1JUIG1vZHVsZSBlY2hvX21vZHVsZSA9IHsKLSAgICBTVEFOREFSRDIwX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLAkJCS8qIGNyZWF0ZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgICBOVUxMLAkJCS8qIG1lcmdlIHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgICBjcmVhdGVfZWNob19zZXJ2ZXJfY29uZmlnLAkvKiBjcmVhdGUgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlICovCi0gICAgTlVMTCwJCQkvKiBtZXJnZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgZWNob19jbWRzLAkJCS8qIGNvbW1hbmQgYXBfdGFibGVfdCAqLwotICAgIE5VTEwsCQkJLyogaGFuZGxlcnMgKi8KLSAgICByZWdpc3Rlcl9ob29rcwkJLyogcmVnaXN0ZXIgaG9va3MgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL2V4cGVyaW1lbnRhbC8uY3ZzaWdub3JlIGIvbW9kdWxlcy9leHBlcmltZW50YWwvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0YzZlMy4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2V4cGVyaW1lbnRhbC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1NYWtlZmlsZQotKi5sbwotKi5zbwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9leHBlcmltZW50YWwvLmluZGVudC5wcm8gYi9tb2R1bGVzL2V4cGVyaW1lbnRhbC8uaW5kZW50LnBybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlmYmU5Zi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2V4cGVyaW1lbnRhbC8uaW5kZW50LnBybworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS1pNCAtbnBzbCAtZGkwIC1iciAtbmNlIC1kMCAtY2xpMCAtbnBjcyAtbmZjMQotLVRCVUZGCi0tVEZJTEUKLS1UVFJBTlMKLS1UVUlOVDQKLS1UX3RyYW5zCi0tVGFsbG93X29wdGlvbnNfdAotLVRhcGFjaGVfc2ZpbwotLVRhcnJheV9oZWFkZXIKLS1UYm9vbF9pbnQKLS1UYnVmX2FyZWEKLS1UYnVmZl9zdHJ1Y3QKLS1UYnVmZnkKLS1UY21kX2hvdwotLVRjbWRfcGFybXMKLS1UY29tbWFuZF9yZWMKLS1UY29tbWFuZF9zdHJ1Y3QKLS1UY29ubl9yZWMKLS1UY29yZV9kaXJfY29uZmlnCi0tVGNvcmVfc2VydmVyX2NvbmZpZwotLVRkaXJfbWFrZXJfZnVuYwotLVRldmVudAotLVRnbG9iYWxzX3MKLS1UaGFuZGxlcl9mdW5jCi0tVGhhbmRsZXJfcmVjCi0tVGpvYmxpc3RfcwotLVRsaXN0ZW5fcmVjCi0tVG1lcmdlcl9mdW5jCi0tVG1vZGVfdAotLVRtb2R1bGUKLS1UbW9kdWxlX3N0cnVjdAotLVRtdXRleAotLVRuX2xvbmcKLS1Ub3RoZXJfY2hpbGRfcmVjCi0tVG92ZXJyaWRlc190Ci0tVHBhcmVudF9zY29yZQotLVRwaWRfdAotLVRwaXBlZF9sb2cKLS1UcG9vbAotLVRyZXF1ZXN0X3JlYwotLVRyZXF1aXJlX2xpbmUKLS1UcmxpbV90Ci0tVHNjb3JlYm9hcmQKLS1Uc2VtYXBob3JlCi0tVHNlcnZlcl9hZGRyX3JlYwotLVRzZXJ2ZXJfcmVjCi0tVHNlcnZlcl9yZWNfY2hhaW4KLS1Uc2hvcnRfc2NvcmUKLS1UdGFibGUKLS1UdGFibGVfZW50cnkKLS1UdGhyZWFkCi0tVHVfd2lkZV9pbnQKLS1UdnRpbWVfdAotLVR3aWRlX2ludApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9leHBlcmltZW50YWwvUkVBRE1FIGIvbW9kdWxlcy9leHBlcmltZW50YWwvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2FiYzA5Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZXhwZXJpbWVudGFsL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLVJFQURNRSBmb3IgQXBhY2hlIDEuMiBFeGFtcGxlIE1vZHVsZQotW0FwcmlsLCAxOTk3XQotCi1UaGUgZmlsZXMgaW4gdGhlIHNyYy9tb2R1bGVzL2V4YW1wbGUgZGlyZWN0b3J5IHVuZGVyIHRoZSBBcGFjaGUKLWRpc3RyaWJ1dGlvbiBkaXJlY3RvcnkgdHJlZSBhcmUgcHJvdmlkZWQgYXMgYW4gZXhhbXBsZSB0byB0aG9zZSB0aGF0Ci13aXNoIHRvIHdyaXRlIG1vZHVsZXMgdGhhdCB1c2UgdGhlIEFwYWNoZSBBUEkuCi0KLVRoZSBtYWluIGZpbGUgaXMgbW9kX2V4YW1wbGUuYywgd2hpY2ggaWxsdXN0cmF0ZXMgYWxsIHRoZSBkaWZmZXJlbnQKLWNhbGxiYWNrIG1lY2hhbmlzbXMgYW5kIGNhbGwgc3ludGFjZXMuICBCeSBubyBtZWFucyBkb2VzIGFuIGFkZC1vbgotbW9kdWxlIG5lZWQgdG8gaW5jbHVkZSByb3V0aW5lcyBmb3IgYWxsIG9mIHRoZSBjYWxsYmFja3MgLSBxdWl0ZSB0aGUKLWNvbnRyYXJ5IQotCi1UaGUgZXhhbXBsZSBtb2R1bGUgaXMgYW4gYWN0dWFsIHdvcmtpbmcgbW9kdWxlLiAgSWYgeW91IGxpbmsgaXQgaW50bwoteW91ciBzZXJ2ZXIsIGVuYWJsZSB0aGUgImV4YW1wbGUtaGFuZGxlciIgaGFuZGxlciBmb3IgYSBsb2NhdGlvbiwgYW5kIHRoZW4KLWJyb3dzZSB0byB0aGF0IGxvY2F0aW9uLCB5b3Ugd2lsbCBzZWUgYSBkaXNwbGF5IG9mIHNvbWUgb2YgdGhlIHRyYWNpbmcKLXRoZSBleGFtcGxlIG1vZHVsZSBkaWQgYXMgdGhlIHZhcmlvdXMgY2FsbGJhY2tzIHdlcmUgbWFkZS4KLQotVG8gaW5jbHVkZSB0aGUgZXhhbXBsZSBtb2R1bGUgaW4geW91ciBzZXJ2ZXIsIGZvbGxvdyB0aGUgc3RlcHMgYmVsb3c6Ci0KLSAgICAxLiBVbmNvbW1lbnQgdGhlICJNb2R1bGUgZXhhbXBsZV9tb2R1bGUiIGxpbmUgbmVhciB0aGUgYm90dG9tIG9mCi0gICAgICAgdGhlIHNyYy9Db25maWd1cmF0aW9uIGZpbGUuICBJZiB0aGVyZSBpc24ndCBvbmUsIGFkZCBpdDsgaXQKLSAgICAgICBzaG91bGQgbG9vayBsaWtlIHRoaXM6Ci0KLSAgICAgICBNb2R1bGUgZXhhbXBsZV9tb2R1bGUgICAgICAgIG1vZHVsZXMvZXhhbXBsZS9tb2RfZXhhbXBsZS5vCi0KLSAgICAyLiBSdW4gdGhlIHNyYy9Db25maWd1cmUgc2NyaXB0ICgiY2Qgc3JjOyAuL0NvbmZpZ3VyZSIpLiAgVGhpcyB3aWxsCi0gICAgICAgYnVpbGQgdGhlIE1ha2VmaWxlIGZvciB0aGUgc2VydmVyIGl0c2VsZiwgYW5kIHVwZGF0ZSB0aGUKLSAgICAgICBzcmMvbW9kdWxlcy9NYWtlZmlsZSBmb3IgYW55IGFkZGl0aW9uYWwgbW9kdWxlcyB5b3UgaGF2ZQotICAgICAgIHJlcXVlc3RlZCBmcm9tIGJlbmVhdGggdGhhdCBzdWJkaXJlY3RvcnkuCi0KLSAgICAzLiBNYWtlIHRoZSBzZXJ2ZXIgKHJ1biAibWFrZSIgaW4gdGhlIHNyYyBkaXJlY3RvcnkpLgotCi1UbyBhZGQgYW5vdGhlciBtb2R1bGUgb2YgeW91ciBvd246Ci0KLSAgICBBLiBta2RpciBzcmMvbW9kdWxlcy9teW1vZHVsZQotICAgIEIuIGNwIHNyYy9tb2R1bGVzL2V4YW1wbGUvKiBzcmMvbW9kdWxlcy9teW1vZHVsZQotICAgIEMuIE1vZGlmeSB0aGUgZmlsZXMgaW4gdGhlIG5ldyBkaXJlY3RvcnkKLSAgICBELiBGb2xsb3cgc3RlcHMgWzFdIHRocm91Z2ggWzNdIGFib3ZlLCB3aXRoIGFwcHJvcHJpYXRlIGNoYW5nZXMuCi0KLVRvIGFjdGl2YXRlIHRoZSBleGFtcGxlIG1vZHVsZSwgaW5jbHVkZSBhIGJsb2NrIHNpbWlsYXIgdG8gdGhlCi1mb2xsb3dpbmcgaW4geW91ciBzcm0uY29uZiBmaWxlOgotCi0gICAgPExvY2F0aW9uIC9leGFtcGxlLWluZm8+Ci0JU2V0SGFuZGxlciBleGFtcGxlLWhhbmRsZXIKLSAgICA8L0xvY2F0aW9uPgotCi1BcyBhbiBhbHRlcm5hdGl2ZSwgeW91IGNhbiBwdXQgdGhlIGZvbGxvd2luZyBpbnRvIGEgLmh0YWNjZXNzIGZpbGUgYW5kCi10aGVuIHJlcXVlc3QgdGhlIGZpbGUgInRlc3QuZXhhbXBsZSIgZnJvbSB0aGF0IGxvY2F0aW9uOgotCi0gICAgQWRkSGFuZGxlciBleGFtcGxlLWhhbmRsZXIgLmV4YW1wbGUKLQotQWZ0ZXIgcmVsb2FkaW5nL3Jlc3RhcnRpbmcgeW91ciBzZXJ2ZXIsIHlvdSBzaG91bGQgYmUgYWJsZSB0byBicm93c2UKLXRvIHRoaXMgbG9jYXRpb24gYW5kIHNlZSB0aGUgYnJpZWYgZGlzcGxheSBtZW50aW9uZWQgZWFybGllci4KZGlmZiAtLWdpdCBhL21vZHVsZXMvZXhwZXJpbWVudGFsL21vZF9leGFtcGxlLmMgYi9tb2R1bGVzL2V4cGVyaW1lbnRhbC9tb2RfZXhhbXBsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmEyNTI1Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZXhwZXJpbWVudGFsL21vZF9leGFtcGxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQ2ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyogCi0gKiBBcGFjaGUgZXhhbXBsZSBtb2R1bGUuICBQcm92aWRlIGRlbW9uc3RyYXRpb25zIG9mIGhvdyBtb2R1bGVzIGRvIHRoaW5ncy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJ1dGlsX3NjcmlwdC5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERhdGEgZGVjbGFyYXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBIZXJlIGFyZSB0aGUgc3RhdGljIGNlbGxzIGFuZCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb25zIHByaXZhdGUgdG8gb3VyICAgICAgKi8KLS8qIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSAqIFNhbXBsZSBjb25maWd1cmF0aW9uIHJlY29yZC4gIFVzZWQgZm9yIGJvdGggcGVyLWRpcmVjdG9yeSBhbmQgcGVyLXNlcnZlcgotICogY29uZmlndXJhdGlvbiBkYXRhLgotICoKLSAqIEl0J3MgcGVyZmVjdGx5IHJlYXNvbmFibGUgdG8gaGF2ZSB0d28gZGlmZmVyZW50IHN0cnVjdHVyZXMgZm9yIHRoZSB0d28KLSAqIGRpZmZlcmVudCBlbnZpcm9ubWVudHMuICBUaGUgc2FtZSBjb21tYW5kIGhhbmRsZXJzIHdpbGwgYmUgY2FsbGVkIGZvcgotICogYm90aCwgdGhvdWdoLCBzbyB0aGUgaGFuZGxlcnMgbmVlZCB0byBiZSBhYmxlIHRvIHRlbGwgdGhlbSBhcGFydC4gIE9uZQotICogcG9zc2liaWxpdHkgaXMgZm9yIGJvdGggc3RydWN0dXJlcyB0byBzdGFydCB3aXRoIGFuIGludCB3aGljaCBpcyB6ZXJvIGZvcgotICogb25lIGFuZCAxIGZvciB0aGUgb3RoZXIuCi0gKgotICogTm90ZSB0aGF0IHdoaWxlIHRoZSBwZXItZGlyZWN0b3J5IGFuZCBwZXItc2VydmVyIGNvbmZpZ3VyYXRpb24gcmVjb3JkcyBhcmUKLSAqIGF2YWlsYWJsZSB0byBtb3N0IG9mIHRoZSBtb2R1bGUgaGFuZGxlcnMsIHRoZXkgc2hvdWxkIGJlIHRyZWF0ZWQgYXMKLSAqIFJFQUQtT05MWSBieSBhbGwgZXhjZXB0IHRoZSBjb21tYW5kIGFuZCBtZXJnZSBoYW5kbGVycy4gIFNvbWV0aW1lcyBoYW5kbGVycwotICogYXJlIGhhbmRlZCBhIHJlY29yZCB0aGF0IGFwcGxpZXMgdG8gdGhlIGN1cnJlbnQgbG9jYXRpb24gYnkgaW1wbGljYXRpb24gb3IKLSAqIGluaGVyaXRhbmNlLCBhbmQgbW9kaWZ5aW5nIGl0IHdpbGwgY2hhbmdlIHRoZSBydWxlcyBmb3Igb3RoZXIgbG9jYXRpb25zLgotICovCi10eXBlZGVmIHN0cnVjdCBleGNmZyB7Ci0gICAgaW50IGNtb2RlOyAgICAgICAgICAgICAgICAgIC8qIEVudmlyb25tZW50IHRvIHdoaWNoIHJlY29yZCBhcHBsaWVzIChkaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNlcnZlciwgb3IgY29tYmluYXRpb24pLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ09ORklHX01PREVfU0VSVkVSIDEKLSNkZWZpbmUgQ09ORklHX01PREVfRElSRUNUT1JZIDIKLSNkZWZpbmUgQ09ORklHX01PREVfQ09NQk8gMyAgICAgLyogU2hvdWxkbid0IGV2ZXIgaGFwcGVuLiAqLwotICAgIGludCBsb2NhbDsgICAgICAgICAgICAgICAgICAvKiBCb29sZWFuOiAiRXhhbXBsZSIgZGlyZWN0aXZlIGRlY2xhcmVkIGhlcmU/ICovCi0gICAgaW50IGNvbmdlbml0YWw7ICAgICAgICAgICAgIC8qIEJvb2xlYW46IGRpZCB3ZSBpbmhlcml0IGFuICJFeGFtcGxlIj8gKi8KLSAgICBjaGFyICp0cmFjZTsgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0cmFjZSBzdHJpbmcuICovCi0gICAgY2hhciAqbG9jOyAgICAgICAgICAgICAgICAgIC8qIExvY2F0aW9uIHRvIHdoaWNoIHRoaXMgcmVjb3JkIGFwcGxpZXMuICovCi19IGV4Y2ZnOwotCi0vKgotICogTGV0J3Mgc2V0IHVwIGEgbW9kdWxlLWxvY2FsIHN0YXRpYyBjZWxsIHRvIHBvaW50IHRvIHRoZSBhY2NyZXRpbmcgY2FsbGJhY2sKLSAqIHRyYWNlLiAgQXMgZWFjaCBBUEkgY2FsbGJhY2sgaXMgbWFkZSB0byB1cywgd2UnbGwgdGFjayBvbiB0aGUgcGFydGljdWxhcnMKLSAqIHRvIHdoYXRldmVyIHdlJ3ZlIGFscmVhZHkgcmVjb3JkZWQuICBUbyBhdm9pZCBtYXNzaXZlIG1lbW9yeSBibG9hdCBhcwotICogZGlyZWN0b3JpZXMgYXJlIHdhbGtlZCBhZ2FpbiBhbmQgYWdhaW4sIHdlIHJlY29yZCB0aGUgcm91dGluZS9lbnZpcm9ubWVudAotICogdGhlIGZpcnN0IHRpbWUgKG5vbi1yZXF1ZXN0IGNvbnRleHQgb25seSksIGFuZCBpZ25vcmUgc3Vic2VxdWVudCBjYWxscyBmb3IKLSAqIHRoZSBzYW1lIHJvdXRpbmUvZW52aXJvbm1lbnQuCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICp0cmFjZSA9IE5VTEw7Ci1zdGF0aWMgYXBfdGFibGVfdCAqc3RhdGljX2NhbGxzX21hZGUgPSBOVUxMOwotCi0vKgotICogVG8gYXZvaWQgbGVha2luZyBtZW1vcnkgZnJvbSBwb29scyBvdGhlciB0aGFuIHRoZSBwZXItcmVxdWVzdCBvbmUsIHdlCi0gKiBhbGxvY2F0ZSBhIG1vZHVsZS1wcml2YXRlIHBvb2wsIGFuZCB0aGVuIHVzZSBhIHN1Yi1wb29sIG9mIHRoYXQgd2hpY2ggZ2V0cwotICogZnJlZWQgZWFjaCB0aW1lIHdlIG1vZGlmeSB0aGUgdHJhY2UuICBUaGF0IHdheSBwcmV2aW91cyBsYXllcnMgb2YgdHJhY2UKLSAqIGRhdGEgZG9uJ3QgZ2V0IGxvc3QuCi0gKi8KLXN0YXRpYyBhcF9jb250ZXh0X3QgKmV4YW1wbGVfcG9vbCA9IE5VTEw7Ci1zdGF0aWMgYXBfY29udGV4dF90ICpleGFtcGxlX3N1YnBvb2wgPSBOVUxMOwotCi0vKgotICogRGVjbGFyZSBvdXJzZWx2ZXMgc28gdGhlIGNvbmZpZ3VyYXRpb24gcm91dGluZXMgY2FuIGZpbmQgYW5kIGtub3cgdXMuCi0gKiBXZSdsbCBmaWxsIGl0IGluIGF0IHRoZSBlbmQgb2YgdGhlIG1vZHVsZS4KLSAqLwotbW9kdWxlIGV4YW1wbGVfbW9kdWxlOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIGZvbGxvd2luZyBwc2V1ZG8tcHJvdG90eXBlIGRlY2xhcmF0aW9ucyBpbGx1c3RyYXRlIHRoZSBwYXJhbWV0ZXJzICAgICovCi0vKiBwYXNzZWQgdG8gY29tbWFuZCBoYW5kbGVycyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBkaXJlY3RpdmUgICAgICAgICAgKi8KLS8qIHN5bnRheC4gIElmIGFuIGFyZ3VtZW50IHdhcyBzcGVjaWZpZWQgaW4gdGhlIGRpcmVjdGl2ZSBkZWZpbml0aW9uICAgICAgICAqLwotLyogKGxvb2sgZm9yICJjb21tYW5kX3JlYyIgYmVsb3cpLCBpdCdzIGF2YWlsYWJsZSB0byB0aGUgY29tbWFuZCBoYW5kbGVyICAgICovCi0vKiB2aWEgdGhlICh2b2lkICopIGluZm8gZmllbGQgaW4gdGhlIGNtZF9wYXJtcyBhcmd1bWVudCBwYXNzZWQgdG8gdGhlICAgICAgKi8KLS8qIGhhbmRsZXIgKGNtZC0+aW5mbyBmb3IgdGhlIGV4YW1wbGVzIGJlbG93KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSAqIENvbW1hbmQgaGFuZGxlciBmb3IgYSBOT19BUkdTIGRpcmVjdGl2ZS4KLSAqCi0gKiBzdGF0aWMgY29uc3QgY2hhciAqaGFuZGxlX05PX0FSR1MoY21kX3Bhcm1zICpjbWQsIHZvaWQgKm1jb25maWcpOwotICovCi0KLS8qCi0gKiBDb21tYW5kIGhhbmRsZXIgZm9yIGEgUkFXX0FSR1MgZGlyZWN0aXZlLiAgVGhlICJhcmdzIiBhcmd1bWVudCBpcyB0aGUgdGV4dAotICogb2YgdGhlIGNvbW1hbmRsaW5lIGZvbGxvd2luZyB0aGUgZGlyZWN0aXZlIGl0c2VsZi4KLSAqCi0gKiBzdGF0aWMgY29uc3QgY2hhciAqaGFuZGxlX1JBV19BUkdTKGNtZF9wYXJtcyAqY21kLCB2b2lkICptY29uZmlnLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphcmdzKTsKLSAqLwotCi0vKgotICogQ29tbWFuZCBoYW5kbGVyIGZvciBhIEZMQUcgZGlyZWN0aXZlLiAgVGhlIHNpbmdsZSBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluCi0gKiAiYm9vbCIsIHdoaWNoIGlzIGVpdGhlciB6ZXJvIG9yIG5vdCBmb3IgT2ZmIG9yIE9uIHJlc3BlY3RpdmVseS4KLSAqCi0gKiBzdGF0aWMgY29uc3QgY2hhciAqaGFuZGxlX0ZMQUcoY21kX3Bhcm1zICpjbWQsIHZvaWQgKm1jb25maWcsIGludCBib29sKTsKLSAqLwotCi0vKgotICogQ29tbWFuZCBoYW5kbGVyIGZvciBhIFRBS0UxIGRpcmVjdGl2ZS4gIFRoZSBzaW5nbGUgcGFyYW1ldGVyIGlzIHBhc3NlZCBpbgotICogIndvcmQxIi4KLSAqCi0gKiBzdGF0aWMgY29uc3QgY2hhciAqaGFuZGxlX1RBS0UxKGNtZF9wYXJtcyAqY21kLCB2b2lkICptY29uZmlnLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICp3b3JkMSk7Ci0gKi8KLQotLyoKLSAqIENvbW1hbmQgaGFuZGxlciBmb3IgYSBUQUtFMiBkaXJlY3RpdmUuICBUQUtFMiBjb21tYW5kcyBtdXN0IGFsd2F5cyBoYXZlCi0gKiBleGFjdGx5IHR3byBhcmd1bWVudHMuCi0gKgotICogc3RhdGljIGNvbnN0IGNoYXIgKmhhbmRsZV9UQUtFMihjbWRfcGFybXMgKmNtZCwgdm9pZCAqbWNvbmZpZywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqd29yZDEsIGNoYXIgKndvcmQyKTsKLSAqLwotCi0vKgotICogQ29tbWFuZCBoYW5kbGVyIGZvciBhIFRBS0UzIGRpcmVjdGl2ZS4gIExpa2UgVEFLRTIsIHRoZXNlIG11c3QgaGF2ZSBleGFjdGx5Ci0gKiB0aHJlZSBhcmd1bWVudHMsIG9yIHRoZSBwYXJzZXIgY29tcGxhaW5zIGFuZCBkb2Vzbid0IGJvdGhlciBjYWxsaW5nIHVzLgotICoKLSAqIHN0YXRpYyBjb25zdCBjaGFyICpoYW5kbGVfVEFLRTMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKm1jb25maWcsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKndvcmQxLCBjaGFyICp3b3JkMiwgY2hhciAqd29yZDMpOwotICovCi0KLS8qCi0gKiBDb21tYW5kIGhhbmRsZXIgZm9yIGEgVEFLRTEyIGRpcmVjdGl2ZS4gIFRoZXNlIGNhbiB0YWtlIGVpdGhlciBvbmUgb3IgdHdvCi0gKiBhcmd1bWVudHMuCi0gKiAtIHdvcmQyIGlzIGEgTlVMTCBwb2ludGVyIGlmIG5vIHNlY29uZCBhcmd1bWVudCB3YXMgc3BlY2lmaWVkLgotICoKLSAqIHN0YXRpYyBjb25zdCBjaGFyICpoYW5kbGVfVEFLRTEyKGNtZF9wYXJtcyAqY21kLCB2b2lkICptY29uZmlnLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqd29yZDEsIGNoYXIgKndvcmQyKTsKLSAqLwotCi0vKgotICogQ29tbWFuZCBoYW5kbGVyIGZvciBhIFRBS0UxMjMgZGlyZWN0aXZlLiAgQSBUQUtFMTIzIGRpcmVjdGl2ZSBjYW4gYmUgZ2l2ZW4sCi0gKiBhcyBtaWdodCBiZSBleHBlY3RlZCwgb25lLCB0d28sIG9yIHRocmVlIGFyZ3VtZW50cy4KLSAqIC0gd29yZDIgaXMgYSBOVUxMIHBvaW50ZXIgaWYgbm8gc2Vjb25kIGFyZ3VtZW50IHdhcyBzcGVjaWZpZWQuCi0gKiAtIHdvcmQzIGlzIGEgTlVMTCBwb2ludGVyIGlmIG5vIHRoaXJkIGFyZ3VtZW50IHdhcyBzcGVjaWZpZWQuCi0gKgotICogc3RhdGljIGNvbnN0IGNoYXIgKmhhbmRsZV9UQUtFMTIzKGNtZF9wYXJtcyAqY21kLCB2b2lkICptY29uZmlnLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKndvcmQxLCBjaGFyICp3b3JkMiwgY2hhciAqd29yZDMpOwotICovCi0KLS8qCi0gKiBDb21tYW5kIGhhbmRsZXIgZm9yIGEgVEFLRTEzIGRpcmVjdGl2ZS4gIEVpdGhlciBvbmUgb3IgdGhyZWUgYXJndW1lbnRzIGFyZQotICogcGVybWl0dGVkIC0gbm8gdHdvLXBhcmFtZXRlcnMtb25seSBzeW50YXggaXMgYWxsb3dlZC4KLSAqIC0gd29yZDIgYW5kIHdvcmQzIGFyZSBOVUxMIHBvaW50ZXJzIGlmIG9ubHkgb25lIGFyZ3VtZW50IHdhcyBzcGVjaWZpZWQuCi0gKgotICogc3RhdGljIGNvbnN0IGNoYXIgKmhhbmRsZV9UQUtFMTMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKm1jb25maWcsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICp3b3JkMSwgY2hhciAqd29yZDIsIGNoYXIgKndvcmQzKTsKLSAqLwotCi0vKgotICogQ29tbWFuZCBoYW5kbGVyIGZvciBhIFRBS0UyMyBkaXJlY3RpdmUuICBBdCBsZWFzdCB0d28gYW5kIGFzIG1hbnkgYXMgdGhyZWUKLSAqIGFyZ3VtZW50cyBtdXN0IGJlIHNwZWNpZmllZC4KLSAqIC0gd29yZDMgaXMgYSBOVUxMIHBvaW50ZXIgaWYgbm8gdGhpcmQgYXJndW1lbnQgd2FzIHNwZWNpZmllZC4KLSAqCi0gKiBzdGF0aWMgY29uc3QgY2hhciAqaGFuZGxlX1RBS0UyMyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqbWNvbmZpZywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKndvcmQxLCBjaGFyICp3b3JkMiwgY2hhciAqd29yZDMpOwotICovCi0KLS8qCi0gKiBDb21tYW5kIGhhbmRsZXIgZm9yIGEgSVRFUkFURSBkaXJlY3RpdmUuCi0gKiAtIEhhbmRsZXIgaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggb2YgbiBhcmd1bWVudHMgZ2l2ZW4gdG8gdGhlIGRpcmVjdGl2ZS4KLSAqIC0gd29yZDEgcG9pbnRzIHRvIGVhY2ggYXJndW1lbnQgaW4gdHVybi4KLSAqCi0gKiBzdGF0aWMgY29uc3QgY2hhciAqaGFuZGxlX0lURVJBVEUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKm1jb25maWcsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqd29yZDEpOwotICovCi0KLS8qCi0gKiBDb21tYW5kIGhhbmRsZXIgZm9yIGEgSVRFUkFURTIgZGlyZWN0aXZlLgotICogLSBIYW5kbGVyIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIG9mIHRoZSBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgYXJndW1lbnRzCi0gKiAgIGdpdmVuIHRvIHRoZSBkaXJlY3RpdmUuCi0gKiAtIHdvcmQxIGlzIHRoZSBzYW1lIGZvciBlYWNoIGNhbGwgZm9yIGEgcGFydGljdWxhciBkaXJlY3RpdmUgaW5zdGFuY2UgKHRoZQotICogICBmaXJzdCBhcmd1bWVudCkuCi0gKiAtIHdvcmQyIHBvaW50cyB0byBlYWNoIG9mIHRoZSBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgYXJndW1lbnRzIGluIHR1cm4uCi0gKgotICogc3RhdGljIGNvbnN0IGNoYXIgKmhhbmRsZV9JVEVSQVRFMihjbWRfcGFybXMgKmNtZCwgdm9pZCAqbWNvbmZpZywKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqd29yZDEsIGNoYXIgKndvcmQyKTsKLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlc2Ugcm91dGluZXMgYXJlIHN0cmljdGx5IGludGVybmFsIHRvIHRoaXMgbW9kdWxlLCBhbmQgc3VwcG9ydCBpdHMgICAgICovCi0vKiBvcGVyYXRpb24uICBUaGV5IGFyZSBub3QgcmVmZXJlbmNlZCBieSBhbnkgZXh0ZXJuYWwgcG9ydGlvbiBvZiB0aGUgICAgICAgKi8KLS8qIHNlcnZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSAqIExvY2F0ZSBvdXIgZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24gcmVjb3JkIGZvciB0aGUgY3VycmVudCByZXF1ZXN0LgotICovCi1zdGF0aWMgZXhjZmcgKm91cl9kY29uZmlnKHJlcXVlc3RfcmVjICpyKQotewotCi0gICAgcmV0dXJuIChleGNmZyAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywgJmV4YW1wbGVfbW9kdWxlKTsKLX0KLQotI2lmIDAKLS8qCi0gKiBMb2NhdGUgb3VyIHNlcnZlciBjb25maWd1cmF0aW9uIHJlY29yZCBmb3IgdGhlIHNwZWNpZmllZCBzZXJ2ZXIuCi0gKi8KLXN0YXRpYyBleGNmZyAqb3VyX3Njb25maWcoc2VydmVyX3JlYyAqcykKLXsKLQotICAgIHJldHVybiAoZXhjZmcgKikgYXBfZ2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywgJmV4YW1wbGVfbW9kdWxlKTsKLX0KLQotLyoKLSAqIExpa2V3aXNlIGZvciBvdXIgY29uZmlndXJhdGlvbiByZWNvcmQgZm9yIHRoZSBzcGVjaWZpZWQgcmVxdWVzdC4KLSAqLwotc3RhdGljIGV4Y2ZnICpvdXJfcmNvbmZpZyhyZXF1ZXN0X3JlYyAqcikKLXsKLQotICAgIHJldHVybiAoZXhjZmcgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cmVxdWVzdF9jb25maWcsICZleGFtcGxlX21vZHVsZSk7Ci19Ci0jZW5kaWYKLQotLyoKLSAqIFRoaXMgcm91dGluZSBzZXRzIHVwIHNvbWUgbW9kdWxlLXdpZGUgY2VsbHMgaWYgdGhleSBoYXZlbid0IGJlZW4gYWxyZWFkeS4KLSAqLwotc3RhdGljIHZvaWQgc2V0dXBfbW9kdWxlX2NlbGxzKCkKLXsKLSAgICAvKgotICAgICAqIElmIHdlIGhhdmVuJ3QgYWxyZWFkeSBhbGxvY2F0ZWQgb3VyIG1vZHVsZS1wcml2YXRlIHBvb2wsIGRvIHNvIG5vdy4KLSAgICAgKi8KLSAgICBpZiAoZXhhbXBsZV9wb29sID09IE5VTEwpIHsKLSAgICAgICAgZXhhbXBsZV9wb29sID0gYXBfbWFrZV9zdWJfcG9vbChOVUxMKTsKLSAgICB9OwotICAgIC8qCi0gICAgICogTGlrZXdpc2UgZm9yIHRoZSBhcF90YWJsZV90IG9mIHJvdXRpbmUvZW52aXJvbm1lbnQgcGFpcnMgd2UgdmlzaXQgb3V0c2lkZSBvZgotICAgICAqIHJlcXVlc3QgY29udGV4dC4KLSAgICAgKi8KLSAgICBpZiAoc3RhdGljX2NhbGxzX21hZGUgPT0gTlVMTCkgewotICAgICAgICBzdGF0aWNfY2FsbHNfbWFkZSA9IGFwX21ha2VfdGFibGUoZXhhbXBsZV9wb29sLCAxNik7Ci0gICAgfTsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGFkZCBhIHRyYWNlIG9mIGEgY2FsbGJhY2sgdG8gdGhlIGxpc3QuICBXZSdyZQotICogcGFzc2VkIHRoZSBzZXJ2ZXIgcmVjb3JkIChpZiBhdmFpbGFibGUpLCB0aGUgcmVxdWVzdCByZWNvcmQgKGlmIGF2YWlsYWJsZSksCi0gKiBhIHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgY29uZmlndXJhdGlvbiByZWNvcmQgKGlmIGF2YWlsYWJsZSkgZm9yIHRoZQotICogZW52aXJvbm1lbnQgdG8gd2hpY2ggdGhlIGNhbGxiYWNrIGlzIHN1cHBvc2VkIHRvIGFwcGx5LCBhbmQgc29tZSB0ZXh0LiAgV2UKLSAqIHR1cm4gdGhpcyBpbnRvIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBhbmQgYWRkIGl0IHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0LgotICogVGhlIGxpc3QgY2FuIGJlIGRpc3BsYXllZCBieSB0aGUgZXhhbXBsZV9oYW5kbGVyKCkgcm91dGluZS4KLSAqCi0gKiBJZiB0aGUgY2FsbCBvY2N1cnMgd2l0aGluIGEgcmVxdWVzdCBjb250ZXh0IChpLmUuLCB3ZSdyZSBwYXNzZWQgYSByZXF1ZXN0Ci0gKiByZWNvcmQpLCB3ZSBwdXQgdGhlIHRyYWNlIGludG8gdGhlIHJlcXVlc3QgYXBfY29udGV4dF90IGFuZCBhdHRhY2ggaXQgdG8gdGhlCi0gKiByZXF1ZXN0IHZpYSB0aGUgbm90ZXMgbWVjaGFuaXNtLiAgT3RoZXJ3aXNlLCB0aGUgdHJhY2UgZ2V0cyBhZGRlZAotICogdG8gdGhlIHN0YXRpYyAobm9uLXJlcXVlc3Qtc3BlY2lmaWMpIGxpc3QuCi0gKgotICogTm90ZSB0aGF0IHRoZSByLT5ub3RlcyBhcF90YWJsZV90IGlzIG9ubHkgZm9yIHN0b3Jpbmcgc3RyaW5nczsgaWYgeW91IG5lZWQgdG8KLSAqIG1haW50YWluIHBlci1yZXF1ZXN0IGRhdGEgb2YgYW55IG90aGVyIHR5cGUsIHlvdSBuZWVkIHRvIHVzZSBhbm90aGVyCi0gKiBtZWNoYW5pc20uCi0gKi8KLQotI2RlZmluZSBUUkFDRV9OT1RFICJleGFtcGxlLXRyYWNlIgotCi1zdGF0aWMgdm9pZCB0cmFjZV9hZGQoc2VydmVyX3JlYyAqcywgcmVxdWVzdF9yZWMgKnIsIGV4Y2ZnICptY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5vdGUpCi17Ci0KLSAgICBjb25zdCBjaGFyICpzb2ZhcjsKLSAgICBjaGFyICphZGRvbjsKLSAgICBjaGFyICp3aGVyZTsKLSAgICBhcF9jb250ZXh0X3QgKnA7Ci0gICAgY29uc3QgY2hhciAqdHJhY2VfY29weTsKLQotICAgIC8qCi0gICAgICogTWFrZSBzdXJlIG91ciBwb29scyBhbmQgdGFibGVzIGFyZSBzZXQgdXAgLSB3ZSBuZWVkICdlbS4KLSAgICAgKi8KLSAgICBzZXR1cF9tb2R1bGVfY2VsbHMoKTsKLSAgICAvKgotICAgICAqIE5vdywgaWYgd2UncmUgaW4gcmVxdWVzdC1jb250ZXh0LCB3ZSB1c2UgdGhlIHJlcXVlc3QgcG9vbC4KLSAgICAgKi8KLSAgICBpZiAociAhPSBOVUxMKSB7Ci0gICAgICAgIHAgPSByLT5wb29sOwotICAgICAgICBpZiAoKHRyYWNlX2NvcHkgPSBhcF90YWJsZV9nZXQoci0+bm90ZXMsIFRSQUNFX05PVEUpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICB0cmFjZV9jb3B5ID0gIiI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFdlJ3JlIG5vdCBpbiByZXF1ZXN0IGNvbnRleHQsIHNvIHRoZSB0cmFjZSBnZXRzIGF0dGFjaGVkIHRvIG91cgotICAgICAgICAgKiBtb2R1bGUtd2lkZSBwb29sLiAgV2UgZG8gdGhlIGNyZWF0ZS9kZXN0cm95IGV2ZXJ5IHRpbWUgd2UncmUgY2FsbGVkCi0gICAgICAgICAqIGluIG5vbi1yZXF1ZXN0IGNvbnRleHQ7IHRoaXMgYXZvaWRzIGxlYWtpbmcgbWVtb3J5IGluIHNvbWUgb2YKLSAgICAgICAgICogdGhlIHN1YnNlcXVlbnQgY2FsbHMgdGhhdCBhbGxvY2F0ZSBtZW1vcnkgb25seSBvbmNlIChzdWNoIGFzIHRoZQotICAgICAgICAgKiBrZXkgZm9ybWF0aW9uIGJlbG93KS4KLSAgICAgICAgICoKLSAgICAgICAgICogTWFrZSBhIG5ldyBzdWItcG9vbCBhbmQgY29weSBhbnkgZXhpc3RpbmcgdHJhY2UgdG8gaXQuICBQb2ludCB0aGUKLSAgICAgICAgICogdHJhY2UgY2VsbCBhdCB0aGUgY29waWVkIHZhbHVlLgotICAgICAgICAgKi8KLSAgICAgICAgcCA9IGFwX21ha2Vfc3ViX3Bvb2woZXhhbXBsZV9wb29sKTsKLSAgICAgICAgaWYgKHRyYWNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHRyYWNlID0gYXBfcHN0cmR1cChwLCB0cmFjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLyoKLSAgICAgICAgICogTm93LCBpZiB3ZSBoYXZlIGEgc3ViLXBvb2wgZnJvbSBiZWZvcmUsIG51a2UgaXQgYW5kIHJlcGxhY2Ugd2l0aAotICAgICAgICAgKiB0aGUgb25lIHdlIGp1c3QgYWxsb2NhdGVkLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGV4YW1wbGVfc3VicG9vbCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBhcF9kZXN0cm95X3Bvb2woZXhhbXBsZV9zdWJwb29sKTsKLSAgICAgICAgfQotICAgICAgICBleGFtcGxlX3N1YnBvb2wgPSBwOwotICAgICAgICB0cmFjZV9jb3B5ID0gdHJhY2U7Ci0gICAgfQotICAgIC8qCi0gICAgICogSWYgd2Ugd2VyZW4ndCBwYXNzZWQgYSBjb25maWd1cmF0aW9uIHJlY29yZCwgd2UgY2FuJ3QgZmlndXJlIG91dCB0bwotICAgICAqIHdoYXQgbG9jYXRpb24gdGhpcyBjYWxsIGFwcGxpZXMuICBUaGlzIG9ubHkgaGFwcGVucyBmb3IgY28tcm91dGluZXMKLSAgICAgKiB0aGF0IGRvbid0IG9wZXJhdGUgaW4gYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeSBvciBzZXJ2ZXIgY29udGV4dC4gIElmIHdlCi0gICAgICogZ290IGEgdmFsaWQgcmVjb3JkLCBleHRyYWN0IHRoZSBsb2NhdGlvbiAoZGlyZWN0b3J5IG9yIHNlcnZlcikgdG8gd2hpY2gKLSAgICAgKiBpdCBhcHBsaWVzLgotICAgICAqLwotICAgIHdoZXJlID0gKG1jb25maWcgIT0gTlVMTCkgPyBtY29uZmlnLT5sb2MgOiAibm93aGVyZSI7Ci0gICAgd2hlcmUgPSAod2hlcmUgIT0gTlVMTCkgPyB3aGVyZSA6ICIiOwotICAgIC8qCi0gICAgICogTm93LCBpZiB3ZSdyZSBub3QgaW4gcmVxdWVzdCBjb250ZXh0LCBzZWUgaWYgd2UndmUgYmVlbiBjYWxsZWQgd2l0aAotICAgICAqIHRoaXMgcGFydGljdWxhciBjb21iaW5hdGlvbiBiZWZvcmUuICBUaGUgYXBfdGFibGVfdCBpcyBhbGxvY2F0ZWQgaW4gdGhlCi0gICAgICogbW9kdWxlJ3MgcHJpdmF0ZSBwb29sLCB3aGljaCBkb2Vzbid0IGdldCBkZXN0cm95ZWQuCi0gICAgICovCi0gICAgaWYgKHIgPT0gTlVMTCkgewotICAgICAgICBjaGFyICprZXk7Ci0KLSAgICAgICAga2V5ID0gYXBfcHN0cmNhdChwLCBub3RlLCAiOiIsIHdoZXJlLCBOVUxMKTsKLSAgICAgICAgaWYgKGFwX3RhYmxlX2dldChzdGF0aWNfY2FsbHNfbWFkZSwga2V5KSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQmVlbiBoZXJlLCBkb25lIHRoaXMuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBGaXJzdCB0aW1lIGZvciB0aGlzIGNvbWJpbmF0aW9uIG9mIHJvdXRpbmUgYW5kIGVudmlyb25tZW50IC0KLSAgICAgICAgICAgICAqIGxvZyBpdCBzbyB3ZSBkb24ndCBkbyBpdCBhZ2Fpbi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYXBfdGFibGVfc2V0KHN0YXRpY19jYWxsc19tYWRlLCBrZXksICJiZWVuIGhlcmUiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBhZGRvbiA9IGFwX3BzdHJjYXQocCwgIiAgIDxMST5cbiIsICIgICAgPERMPlxuIiwgIiAgICAgPERUPjxTQU1QPiIsCi0gICAgICAgICAgICAgICAgICAgIG5vdGUsICI8L1NBTVA+XG4iLCAiICAgICA8L0RUPlxuIiwgIiAgICAgPEREPjxTQU1QPlsiLAotICAgICAgICAgICAgICAgICAgICB3aGVyZSwgIl08L1NBTVA+XG4iLCAiICAgICA8L0REPlxuIiwgIiAgICA8L0RMPlxuIiwKLSAgICAgICAgICAgICAgICAgICAgIiAgIDwvTEk+XG4iLCBOVUxMKTsKLSAgICBzb2ZhciA9ICh0cmFjZV9jb3B5ID09IE5VTEwpID8gIiIgOiB0cmFjZV9jb3B5OwotICAgIHRyYWNlX2NvcHkgPSBhcF9wc3RyY2F0KHAsIHNvZmFyLCBhZGRvbiwgTlVMTCk7Ci0gICAgaWYgKHIgIT0gTlVMTCkgewotICAgICAgICBhcF90YWJsZV9zZXQoci0+bm90ZXMsIFRSQUNFX05PVEUsIHRyYWNlX2NvcHkpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgdHJhY2UgPSB0cmFjZV9jb3B5OwotICAgIH0KLSAgICAvKgotICAgICAqIFlvdSAqY291bGQqIGNoYW5nZSB0aGUgZm9sbG93aW5nIGlmIHlvdSB3YW50ZWQgdG8gc2VlIHRoZSBjYWxsaW5nCi0gICAgICogc2VxdWVuY2UgcmVwb3J0ZWQgaW4gdGhlIHNlcnZlcidzIGVycm9yX2xvZywgYnV0IGJld2FyZSAtIGFsbW9zdCBhbGwgb2YKLSAgICAgKiB0aGVzZSBjby1yb3V0aW5lcyBhcmUgY2FsbGVkIGZvciBldmVyeSBzaW5nbGUgcmVxdWVzdCwgYW5kIHRoZSBpbXBhY3QKLSAgICAgKiBvbiB0aGUgc2l6ZSAoYW5kIHJlYWRhYmlsaXR5KSBvZiB0aGUgZXJyb3JfbG9nIGlzIGNvbnNpZGVyYWJsZS4KLSAgICAgKi8KLSNkZWZpbmUgRVhBTVBMRV9MT0dfRUFDSCAwCi0gICAgaWYgKEVYQU1QTEVfTE9HX0VBQ0ggJiYgKHMgIT0gTlVMTCkpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0RFQlVHLCBzLCAibW9kX2V4YW1wbGU6ICVzIiwgbm90ZSk7Ci0gICAgfQotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIFdlIHByb3RvdHlwZWQgdGhlIHZhcmlvdXMgc3ludGF4IGZvciBjb21tYW5kIGhhbmRsZXJzIChyb3V0aW5lcyB0aGF0ICAgICAqLwotLyogYXJlIGNhbGxlZCB3aGVuIHRoZSBjb25maWd1cmF0aW9uIHBhcnNlciBkZXRlY3RzIGEgZGlyZWN0aXZlIGRlY2xhcmVkICAgICovCi0vKiBieSBvdXIgbW9kdWxlKSBlYXJsaWVyLiAgTm93IHdlIGFjdHVhbGx5IGRlY2xhcmUgYSAicmVhbCIgcm91dGluZSB0aGF0ICAgKi8KLS8qIHdpbGwgYmUgaW52b2tlZCBieSB0aGUgcGFyc2VyIHdoZW4gb3VyICJyZWFsIiBkaXJlY3RpdmUgaXMgICAgICAgICAgICAgICAqLwotLyogZW5jb3VudGVyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIElmIGEgY29tbWFuZCBoYW5kbGVyIGVuY291bnRlcnMgYSBwcm9ibGVtIHByb2Nlc3NpbmcgdGhlIGRpcmVjdGl2ZSwgaXQgICAqLwotLyogc2lnbmFscyB0aGlzIGZhY3QgYnkgcmV0dXJuaW5nIGEgbm9uLU5VTEwgcG9pbnRlciB0byBhIHN0cmluZyAgICAgICAgICAgICovCi0vKiBkZXNjcmliaW5nIHRoZSBwcm9ibGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIG1hZ2ljIHJldHVybiB2YWx1ZSBERUNMSU5FX0NNRCBpcyB1c2VkIHRvIGRlYWwgd2l0aCBkaXJlY3RpdmVzICAgICAgICovCi0vKiB0aGF0IG1pZ2h0IGJlIGRlY2xhcmVkIGJ5IG11bHRpcGxlIG1vZHVsZXMuICBJZiB0aGUgY29tbWFuZCBoYW5kbGVyICAgICAgKi8KLS8qIHJldHVybnMgTlVMTCwgdGhlIGRpcmVjdGl2ZSB3YXMgcHJvY2Vzc2VkOyBpZiBpdCByZXR1cm5zIERFQ0xJTkVfQ01ELCAgICAqLwotLyogdGhlIG5leHQgbW9kdWxlIChpZiBhbnkpIHRoYXQgZGVjbGFyZXMgdGhlIGRpcmVjdGl2ZSBpcyBnaXZlbiBhIGNoYW5jZSAgICovCi0vKiBhdCBpdC4gIElmIGl0IHJldHVybnMgYW55IG90aGVyIHZhbHVlLCBpdCdzIHRyZWF0ZWQgYXMgdGhlIHRleHQgb2YgYW4gICAgKi8KLS8qIGVycm9yIG1lc3NhZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAKLSAqIENvbW1hbmQgaGFuZGxlciBmb3IgdGhlIE5PX0FSR1MgIkV4YW1wbGUiIGRpcmVjdGl2ZS4gIEFsbCB3ZSBkbyBpcyBtYXJrIHRoZQotICogY2FsbCBpbiB0aGUgdHJhY2UgbG9nLCBhbmQgZmxhZyB0aGUgYXBwbGljYWJpbGl0eSBvZiB0aGUgZGlyZWN0aXZlIHRvIHRoZQotICogY3VycmVudCBsb2NhdGlvbiBpbiB0aGF0IGxvY2F0aW9uJ3MgY29uZmlndXJhdGlvbiByZWNvcmQuCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjbWRfZXhhbXBsZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqbWNvbmZpZykKLXsKLQotICAgIGV4Y2ZnICpjZmcgPSAoZXhjZmcgKikgbWNvbmZpZzsKLQotICAgIC8qCi0gICAgICogIkV4YW1wbGUgV3V6IEhlcmUiCi0gICAgICovCi0gICAgY2ZnLT5sb2NhbCA9IDE7Ci0gICAgdHJhY2VfYWRkKGNtZC0+c2VydmVyLCBOVUxMLCBjZmcsICJjbWRfZXhhbXBsZSgpIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOb3cgd2UgZGVjbGFyZSBvdXIgY29udGVudCBoYW5kbGVycywgd2hpY2ggYXJlIGludm9rZWQgd2hlbiB0aGUgc2VydmVyICAgKi8KLS8qIGVuY291bnRlcnMgYSBkb2N1bWVudCB3aGljaCBvdXIgbW9kdWxlIGlzIHN1cHBvc2VkIHRvIGhhdmUgYSBjaGFuY2UgdG8gICAqLwotLyogc2VlLiAgKFNlZSBtb2RfbWltZSdzIFNldEhhbmRsZXIgYW5kIEFkZEhhbmRsZXIgZGlyZWN0aXZlcywgYW5kIHRoZSAgICAgICovCi0vKiBtb2RfaW5mbyBhbmQgbW9kX3N0YXR1cyBleGFtcGxlcywgZm9yIG1vcmUgZGV0YWlscy4pICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogU2luY2UgY29udGVudCBoYW5kbGVycyBhcmUgZHVtcGluZyBkYXRhIGRpcmVjdGx5IGludG8gdGhlIGNvbm5leGlvbiAgICAgICovCi0vKiAodXNpbmcgdGhlIHIqKCkgcm91dGluZXMsIHN1Y2ggYXMgcnB1dHMoKSBhbmQgcnByaW50ZigpKSB3aXRob3V0ICAgICAgICAgKi8KLS8qIGludGVydmVudGlvbiBieSBvdGhlciBwYXJ0cyBvZiB0aGUgc2VydmVyLCB0aGV5IG5lZWQgdG8gbWFrZSAgICAgICAgICAgICAqLwotLyogc3VyZSBhbnkgYWNjdW11bGF0ZWQgSFRUUCBoZWFkZXJzIGFyZSBzZW50IGZpcnN0LiAgVGhpcyBpcyBkb25lIGJ5ICAgICAgICovCi0vKiBjYWxsaW5nIHNlbmRfaHR0cF9oZWFkZXIoKS4gIE90aGVyd2lzZSwgbm8gaGVhZGVyIHdpbGwgYmUgc2VudCBhdCBhbGwsICAgKi8KLS8qIGFuZCB0aGUgb3V0cHV0IHNlbnQgdG8gdGhlIGNsaWVudCB3aWxsIGFjdHVhbGx5IGJlIEhUVFAtdW5jb21wbGlhbnQuICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAKLSAqIFNhbXBsZSBjb250ZW50IGhhbmRsZXIuICBBbGwgdGhpcyBkb2VzIGlzIGRpc3BsYXkgdGhlIGNhbGwgbGlzdCB0aGF0IGhhcwotICogYmVlbiBidWlsdCB1cCBzbyBmYXIuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBpbnN0cnVjdHMgdGhlIGNhbGxlciBjb25jZXJuaW5nIHdoYXQgaGFwcGVuZWQgYW5kIHdoYXQgdG8KLSAqIGRvIG5leHQ6Ci0gKiAgT0sgKCJ3ZSBkaWQgb3VyIHRoaW5nIikKLSAqICBERUNMSU5FRCAoInRoaXMgaXNuJ3Qgc29tZXRoaW5nIHdpdGggd2hpY2ggd2Ugd2FudCB0byBnZXQgaW52b2x2ZWQiKQotICogIEhUVFBfbXVtYmxlICgiYW4gZXJyb3Igc3RhdHVzIHNob3VsZCBiZSByZXBvcnRlZCIpCi0gKi8KLXN0YXRpYyBpbnQgZXhhbXBsZV9oYW5kbGVyKHJlcXVlc3RfcmVjICpyKQotewotCi0gICAgZXhjZmcgKmRjZmc7Ci0KLSAgICBkY2ZnID0gb3VyX2Rjb25maWcocik7Ci0gICAgdHJhY2VfYWRkKHItPnNlcnZlciwgciwgZGNmZywgImV4YW1wbGVfaGFuZGxlcigpIik7Ci0gICAgLyoKLSAgICAgKiBXZSdyZSBhYm91dCB0byBzdGFydCBzZW5kaW5nIGNvbnRlbnQsIHNvIHdlIG5lZWQgdG8gZm9yY2UgdGhlIEhUVFAKLSAgICAgKiBoZWFkZXJzIHRvIGJlIHNlbnQgYXQgdGhpcyBwb2ludC4gIE90aGVyd2lzZSwgbm8gaGVhZGVycyB3aWxsIGJlIHNlbnQKLSAgICAgKiBhdCBhbGwuICBXZSBjYW4gc2V0IGFueSB3ZSBsaWtlIGZpcnN0LCBvZiBjb3Vyc2UuICAqKk5PVEUqKiBIZXJlJ3MKLSAgICAgKiB3aGVyZSB5b3Ugc2V0IHRoZSAiQ29udGVudC10eXBlIiBoZWFkZXIsIGFuZCB5b3UgZG8gc28gYnkgcHV0dGluZyBpdCBpbgotICAgICAqIHItPmNvbnRlbnRfdHlwZSwgKm5vdCogci0+aGVhZGVyc19vdXQoIkNvbnRlbnQtdHlwZSIpLiAgSWYgeW91IGRvbid0Ci0gICAgICogc2V0IGl0LCBpdCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIHRoZSBzZXJ2ZXIncyBkZWZhdWx0IHR5cGUgKHR5cGljYWxseQotICAgICAqICJ0ZXh0L3BsYWluIikuICBZb3UgKm11c3QqIGFsc28gZW5zdXJlIHRoYXQgci0+Y29udGVudF90eXBlIGlzIGxvd2VyCi0gICAgICogY2FzZS4KLSAgICAgKgotICAgICAqIFdlIGFsc28gbmVlZCB0byBzdGFydCBhIHRpbWVyIHNvIHRoZSBzZXJ2ZXIgY2FuIGtub3cgaWYgdGhlIGNvbm5leGlvbgotICAgICAqIGlzIGJyb2tlbi4KLSAgICAgKi8KLSAgICByLT5jb250ZW50X3R5cGUgPSAidGV4dC9odG1sIjsKLSAgICBhcF9zZW5kX2h0dHBfaGVhZGVyKHIpOwotICAgIC8qCi0gICAgICogSWYgd2UncmUgb25seSBzdXBwb3NlZCB0byBzZW5kIGhlYWRlciBpbmZvcm1hdGlvbiAoSEVBRCByZXF1ZXN0KSwgd2UncmUKLSAgICAgKiBhbHJlYWR5IHRoZXJlLgotICAgICAqLwotICAgIGlmIChyLT5oZWFkZXJfb25seSkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBOb3cgc2VuZCBvdXIgYWN0dWFsIG91dHB1dC4gIFNpbmNlIHdlIHRhZ2dlZCB0aGlzIGFzIGJlaW5nCi0gICAgICogInRleHQvaHRtbCIsIHdlIG5lZWQgdG8gZW1iZWQgYW55IEhUTUwuCi0gICAgICovCi0gICAgYXBfcnB1dHMoRE9DVFlQRV9IVE1MXzNfMiwgcik7Ci0gICAgYXBfcnB1dHMoIjxIVE1MPlxuIiwgcik7Ci0gICAgYXBfcnB1dHMoIiA8SEVBRD5cbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgIDxUSVRMRT5tb2RfZXhhbXBsZSBNb2R1bGUgQ29udGVudC1IYW5kbGVyIE91dHB1dFxuIiwgcik7Ci0gICAgYXBfcnB1dHMoIiAgPC9USVRMRT5cbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgPC9IRUFEPlxuIiwgcik7Ci0gICAgYXBfcnB1dHMoIiA8Qk9EWT5cbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgIDxIMT48U0FNUD5tb2RfZXhhbXBsZTwvU0FNUD4gTW9kdWxlIENvbnRlbnQtSGFuZGxlciBPdXRwdXRcbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgIDwvSDE+XG4iLCByKTsKLSAgICBhcF9ycHV0cygiICA8UD5cbiIsIHIpOwotICAgIGFwX3JwcmludGYociwgIiAgQXBhY2hlIEhUVFAgU2VydmVyIHZlcnNpb246IFwiJXNcIlxuIiwKLQkgICAgYXBfZ2V0X3NlcnZlcl92ZXJzaW9uKCkpOwotICAgIGFwX3JwdXRzKCIgIDxCUj5cbiIsIHIpOwotICAgIGFwX3JwcmludGYociwgIiAgU2VydmVyIGJ1aWx0OiBcIiVzXCJcbiIsIGFwX2dldF9zZXJ2ZXJfYnVpbHQoKSk7Ci0gICAgYXBfcnB1dHMoIiAgPC9QPlxuIiwgcik7OwotICAgIGFwX3JwdXRzKCIgIDxQPlxuIiwgcik7Ci0gICAgYXBfcnB1dHMoIiAgVGhlIGZvcm1hdCBmb3IgdGhlIGNhbGxiYWNrIHRyYWNlIGlzOlxuIiwgcik7Ci0gICAgYXBfcnB1dHMoIiAgPC9QPlxuIiwgcik7Ci0gICAgYXBfcnB1dHMoIiAgPERMPlxuIiwgcik7Ci0gICAgYXBfcnB1dHMoIiAgIDxEVD48RU0+bjwvRU0+LjxTQU1QPiZsdDtyb3V0aW5lLW5hbWUmZ3Q7Iiwgcik7Ci0gICAgYXBfcnB1dHMoIigmbHQ7cm91dGluZS1kYXRhJmd0Oyk8L1NBTVA+XG4iLCByKTsKLSAgICBhcF9ycHV0cygiICAgPC9EVD5cbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgICA8REQ+PFNBTVA+WyZsdDthcHBsaWVzLXRvJmd0O108L1NBTVA+XG4iLCByKTsKLSAgICBhcF9ycHV0cygiICAgPC9ERD5cbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgIDwvREw+XG4iLCByKTsKLSAgICBhcF9ycHV0cygiICA8UD5cbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgIFRoZSA8U0FNUD4mbHQ7cm91dGluZS1kYXRhJmd0OzwvU0FNUD4gaXMgc3VwcGxpZWQgYnlcbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgIHRoZSByb3V0aW5lIHdoZW4gaXQgcmVxdWVzdHMgdGhlIHRyYWNlLFxuIiwgcik7Ci0gICAgYXBfcnB1dHMoIiAgYW5kIHRoZSA8U0FNUD4mbHQ7YXBwbGllcy10byZndDs8L1NBTVA+IGlzIGV4dHJhY3RlZFxuIiwgcik7Ci0gICAgYXBfcnB1dHMoIiAgZnJvbSB0aGUgY29uZmlndXJhdGlvbiByZWNvcmQgYXQgdGhlIHRpbWUgb2YgdGhlIHRyYWNlLlxuIiwgcik7Ci0gICAgYXBfcnB1dHMoIiAgPFNUUk9ORz5TVlIoKTwvU1RST05HPiBpbmRpY2F0ZXMgYSBzZXJ2ZXIgZW52aXJvbm1lbnRcbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgIChibGFuayBtZWFucyB0aGUgbWFpbiBvciBkZWZhdWx0IHNlcnZlciwgb3RoZXJ3aXNlIGl0J3NcbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgIHRoZSBuYW1lIG9mIHRoZSBWaXJ0dWFsSG9zdCk7IDxTVFJPTkc+RElSKCk8L1NUUk9ORz5cbiIsIHIpOwotICAgIGFwX3JwdXRzKCIgIGluZGljYXRlcyBhIGxvY2F0aW9uIGluIHRoZSBVUkwgb3IgZmlsZXN5c3RlbVxuIiwgcik7Ci0gICAgYXBfcnB1dHMoIiAgbmFtZXNwYWNlLlxuIiwgcik7Ci0gICAgYXBfcnB1dHMoIiAgPC9QPlxuIiwgcik7Ci0gICAgYXBfcnByaW50ZihyLCAiICA8SDI+U3RhdGljIGNhbGxiYWNrcyBzbyBmYXI6PC9IMj5cbiAgPE9MPlxuJXMgIDwvT0w+XG4iLAotICAgICAgICAgICAgdHJhY2UpOwotICAgIGFwX3JwdXRzKCIgIDxIMj5SZXF1ZXN0LXNwZWNpZmljIGNhbGxiYWNrcyBzbyBmYXI6PC9IMj5cbiIsIHIpOwotICAgIGFwX3JwcmludGYociwgIiAgPE9MPlxuJXMgIDwvT0w+XG4iLCBhcF90YWJsZV9nZXQoci0+bm90ZXMsIFRSQUNFX05PVEUpKTsKLSAgICBhcF9ycHV0cygiICA8SDI+RW52aXJvbm1lbnQgZm9yIDxFTT50aGlzPC9FTT4gY2FsbDo8L0gyPlxuIiwgcik7Ci0gICAgYXBfcnB1dHMoIiAgPFVMPlxuIiwgcik7Ci0gICAgYXBfcnByaW50ZihyLCAiICAgPExJPkFwcGxpZXMtdG86IDxTQU1QPiVzPC9TQU1QPlxuICAgPC9MST5cbiIsIGRjZmctPmxvYyk7Ci0gICAgYXBfcnByaW50ZihyLCAiICAgPExJPlwiRXhhbXBsZVwiIGRpcmVjdGl2ZSBkZWNsYXJlZCBoZXJlOiAlc1xuICAgPC9MST5cbiIsCi0gICAgICAgICAgICAoZGNmZy0+bG9jYWwgPyAiWUVTIiA6ICJOTyIpKTsKLSAgICBhcF9ycHJpbnRmKHIsICIgICA8TEk+XCJFeGFtcGxlXCIgaW5oZXJpdGVkOiAlc1xuICAgPC9MST5cbiIsCi0gICAgICAgICAgICAoZGNmZy0+Y29uZ2VuaXRhbCA/ICJZRVMiIDogIk5PIikpOwotICAgIGFwX3JwdXRzKCIgIDwvVUw+XG4iLCByKTsKLSAgICBhcF9ycHV0cygiIDwvQk9EWT5cbiIsIHIpOwotICAgIGFwX3JwdXRzKCI8L0hUTUw+XG4iLCByKTsKLSAgICAvKgotICAgICAqIFdlJ3JlIGFsbCBkb25lLCBzbyBjYW5jZWwgdGhlIHRpbWVvdXQgd2Ugc2V0LiAgU2luY2UgdGhpcyBpcyBwcm9iYWJseQotICAgICAqIHRoZSBlbmQgb2YgdGhlIHJlcXVlc3Qgd2UgKmNvdWxkKiBhc3N1bWUgdGhpcyB3b3VsZCBiZSBkb25lIGR1cmluZwotICAgICAqIHBvc3QtcHJvY2Vzc2luZyAtIGJ1dCBpdCdzIHBvc3NpYmxlIHRoYXQgYW5vdGhlciBoYW5kbGVyIG1pZ2h0IGJlCi0gICAgICogY2FsbGVkIGFuZCBpbmhlcml0IG91ciBvdXRzdGFuZGluZyB0aW1lci4gIE5vdCBnb29kOyB0byBlYWNoIGl0cyBvd24uCi0gICAgICovCi0gICAgLyoKLSAgICAgKiBXZSBkaWQgd2hhdCB3ZSB3YW50ZWQgdG8gZG8sIHNvIHRlbGwgdGhlIHJlc3Qgb2YgdGhlIHNlcnZlciB3ZQotICAgICAqIHN1Y2NlZWRlZC4KLSAgICAgKi8KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOb3cgbGV0J3MgZGVjbGFyZSByb3V0aW5lcyBmb3IgZWFjaCBvZiB0aGUgY2FsbGJhY2sgcGhhc2UgaW4gb3JkZXIuICAgICAgKi8KLS8qIChUaGF0J3MgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkncmUgbGlzdGVkIGluIHRoZSBjYWxsYmFjayBsaXN0LCAqbm90ICAgICAqLwotLyogdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBzZXJ2ZXIgY2FsbHMgdGhlbSEgIFNlZSB0aGUgY29tbWFuZF9yZWMgICAgICAgICAgICovCi0vKiBkZWNsYXJhdGlvbiBuZWFyIHRoZSBib3R0b20gb2YgdGhpcyBmaWxlLikgIE5vdGUgdGhhdCB0aGVzZSBtYXkgYmUgICAgICAgKi8KLS8qIGNhbGxlZCBmb3Igc2l0dWF0aW9ucyB0aGF0IGRvbid0IHJlbGF0ZSBwcmltYXJpbHkgdG8gb3VyIGZ1bmN0aW9uIC0gaW4gICAqLwotLyogb3RoZXIgd29yZHMsIHRoZSBmaXh1cCBoYW5kbGVyIHNob3VsZG4ndCBhc3N1bWUgdGhhdCB0aGUgcmVxdWVzdCBoYXMgICAgICovCi0vKiB0byBkbyB3aXRoICJleGFtcGxlIiBzdHVmZi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogV2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBjb250ZW50IGhhbmRsZXIsIGFsbCBvZiBvdXIgcm91dGluZXMgd2lsbCBiZSAgICovCi0vKiBjYWxsZWQgZm9yIGVhY2ggcmVxdWVzdCwgdW5sZXNzIGFuIGVhcmxpZXIgaGFuZGxlciBmcm9tIGFub3RoZXIgbW9kdWxlICAgKi8KLS8qIGFib3J0ZWQgdGhlIHNlcXVlbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBIYW5kbGVycyB0aGF0IGFyZSBkZWNsYXJlZCBhcyAiaW50IiBjYW4gcmV0dXJuIHRoZSBmb2xsb3dpbmc6ICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9LICAgICAgICAgIEhhbmRsZXIgYWNjZXB0ZWQgdGhlIHJlcXVlc3QgYW5kIGRpZCBpdHMgdGhpbmcgd2l0aCBpdC4gICAgICovCi0vKiAgREVDTElORUQgICAgSGFuZGxlciB0b29rIG5vIGFjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBIVFRQX211bWJsZSBIYW5kbGVyIGxvb2tlZCBhdCByZXF1ZXN0IGFuZCBmb3VuZCBpdCB3YW50aW5nLiAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBXaGF0IHRoZSBzZXJ2ZXIgZG9lcyBhZnRlciBjYWxsaW5nIGEgbW9kdWxlIGhhbmRsZXIgZGVwZW5kcyB1cG9uIHRoZSAgICAgKi8KLS8qIGhhbmRsZXIncyByZXR1cm4gdmFsdWUuICBJbiBhbGwgY2FzZXMsIGlmIHRoZSBoYW5kbGVyIHJldHVybnMgICAgICAgICAgICAqLwotLyogREVDTElORUQsIHRoZSBzZXJ2ZXIgd2lsbCBjb250aW51ZSB0byB0aGUgbmV4dCBtb2R1bGUgd2l0aCBhbiBoYW5kbGVyICAgICovCi0vKiBmb3IgdGhlIGN1cnJlbnQgcGhhc2UuICBIb3dldmVyLCBpZiB0aGUgaGFuZGxlciByZXR1cm4gYSBub24tT0ssICAgICAgICAgKi8KLS8qIG5vbi1ERUNMSU5FRCBzdGF0dXMsIHRoZSBzZXJ2ZXIgYWJvcnRzIHRoZSByZXF1ZXN0IHJpZ2h0IHRoZXJlLiAgSWYgICAgICAqLwotLyogdGhlIGhhbmRsZXIgcmV0dXJucyBPSywgdGhlIHNlcnZlcidzIG5leHQgYWN0aW9uIGlzIHBoYXNlLXNwZWNpZmljOyAgICAgICovCi0vKiBzZWUgdGhlIGluZGl2aWR1YWwgaGFuZGxlciBjb21tZW50cyBiZWxvdyBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBzZXJ2ZXIgaW5pdGlhbGlzYXRpb24uICBBbnkgaW5mb3JtYXRpb24KLSAqIHRoYXQgbmVlZHMgdG8gYmUgcmVjb3JkZWQgbXVzdCBiZSBpbiBzdGF0aWMgY2VsbHMsIHNpbmNlIHRoZXJlJ3Mgbm8KLSAqIGNvbmZpZ3VyYXRpb24gcmVjb3JkLgotICoKLSAqIFRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZS4KLSAqLwotCi0vKgotICogQWxsIG91ciBtb2R1bGUgaW5pdGlhbGlzZXIgZG9lcyBpcyBhZGQgaXRzIHRyYWNlIHRvIHRoZSBsb2cuCi0gKi8KLXN0YXRpYyB2b2lkIGV4YW1wbGVfaW5pdChzZXJ2ZXJfcmVjICpzLCBhcF9jb250ZXh0X3QgKnApCi17Ci0KLSAgICBjaGFyICpub3RlOwotICAgIGNoYXIgKnNuYW1lID0gcy0+c2VydmVyX2hvc3RuYW1lOwotCi0gICAgLyoKLSAgICAgKiBTZXQgdXAgYW55IG1vZHVsZSBjZWxscyB0aGF0IG91Z2h0IHRvIGJlIGluaXRpYWxpc2VkLgotICAgICAqLwotICAgIHNldHVwX21vZHVsZV9jZWxscygpOwotICAgIC8qCi0gICAgICogVGhlIGFyYml0cmFyeSB0ZXh0IHdlIGFkZCB0byBvdXIgdHJhY2UgZW50cnkgaW5kaWNhdGVzIGZvciB3aGljaCBzZXJ2ZXIKLSAgICAgKiB3ZSdyZSBiZWluZyBjYWxsZWQuCi0gICAgICovCi0gICAgc25hbWUgPSAoc25hbWUgIT0gTlVMTCkgPyBzbmFtZSA6ICIiOwotICAgIG5vdGUgPSBhcF9wc3RyY2F0KHAsICJleGFtcGxlX2luaXQoIiwgc25hbWUsICIpIiwgTlVMTCk7Ci0gICAgdHJhY2VfYWRkKHMsIE5VTEwsIE5VTEwsIG5vdGUpOwotfQotCi0vKiAKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBzZXJ2ZXIgaW5pdGlhbGlzYXRpb24gd2hlbiBhbiBoZWF2eS13ZWlnaHQKLSAqIHByb2Nlc3MgKHN1Y2ggYXMgYSBjaGlsZCkgaXMgYmVpbmcgaW5pdGlhbGlzZWQuICBBcyB3aXRoIHRoZQotICogbW9kdWxlIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uLCBhbnkgaW5mb3JtYXRpb24gdGhhdCBuZWVkcyB0byBiZSByZWNvcmRlZAotICogbXVzdCBiZSBpbiBzdGF0aWMgY2VsbHMsIHNpbmNlIHRoZXJlJ3Mgbm8gY29uZmlndXJhdGlvbiByZWNvcmQuCi0gKgotICogVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlLgotICovCi0KLS8qCi0gKiBBbGwgb3VyIHByb2Nlc3MgaW5pdGlhbGlzZXIgZG9lcyBpcyBhZGQgaXRzIHRyYWNlIHRvIHRoZSBsb2cuCi0gKi8KLXN0YXRpYyB2b2lkIGV4YW1wbGVfY2hpbGRfaW5pdChzZXJ2ZXJfcmVjICpzLCBhcF9jb250ZXh0X3QgKnApCi17Ci0KLSAgICBjaGFyICpub3RlOwotICAgIGNoYXIgKnNuYW1lID0gcy0+c2VydmVyX2hvc3RuYW1lOwotCi0gICAgLyoKLSAgICAgKiBTZXQgdXAgYW55IG1vZHVsZSBjZWxscyB0aGF0IG91Z2h0IHRvIGJlIGluaXRpYWxpc2VkLgotICAgICAqLwotICAgIHNldHVwX21vZHVsZV9jZWxscygpOwotICAgIC8qCi0gICAgICogVGhlIGFyYml0cmFyeSB0ZXh0IHdlIGFkZCB0byBvdXIgdHJhY2UgZW50cnkgaW5kaWNhdGVzIGZvciB3aGljaCBzZXJ2ZXIKLSAgICAgKiB3ZSdyZSBiZWluZyBjYWxsZWQuCi0gICAgICovCi0gICAgc25hbWUgPSAoc25hbWUgIT0gTlVMTCkgPyBzbmFtZSA6ICIiOwotICAgIG5vdGUgPSBhcF9wc3RyY2F0KHAsICJleGFtcGxlX2NoaWxkX2luaXQoIiwgc25hbWUsICIpIiwgTlVMTCk7Ci0gICAgdHJhY2VfYWRkKHMsIE5VTEwsIE5VTEwsIG5vdGUpOwotfQotCi0vKiAKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYW4gaGVhdnktd2VpZ2h0IHByb2Nlc3MgKHN1Y2ggYXMgYSBjaGlsZCkgaXMKLSAqIGJlaW5nIHJ1biBkb3duIG9yIGRlc3Ryb3llZC4gIEFzIHdpdGggdGhlIGNoaWxkIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uLAotICogYW55IGluZm9ybWF0aW9uIHRoYXQgbmVlZHMgdG8gYmUgcmVjb3JkZWQgbXVzdCBiZSBpbiBzdGF0aWMgY2VsbHMsIHNpbmNlCi0gKiB0aGVyZSdzIG5vIGNvbmZpZ3VyYXRpb24gcmVjb3JkLgotICoKLSAqIFRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZS4KLSAqLwotCi0vKgotICogQWxsIG91ciBwcm9jZXNzLWRlYXRoIHJvdXRpbmUgZG9lcyBpcyBhZGQgaXRzIHRyYWNlIHRvIHRoZSBsb2cuCi0gKi8KLXN0YXRpYyB2b2lkIGV4YW1wbGVfY2hpbGRfZXhpdChzZXJ2ZXJfcmVjICpzLCBhcF9jb250ZXh0X3QgKnApCi17Ci0KLSAgICBjaGFyICpub3RlOwotICAgIGNoYXIgKnNuYW1lID0gcy0+c2VydmVyX2hvc3RuYW1lOwotCi0gICAgLyoKLSAgICAgKiBUaGUgYXJiaXRyYXJ5IHRleHQgd2UgYWRkIHRvIG91ciB0cmFjZSBlbnRyeSBpbmRpY2F0ZXMgZm9yIHdoaWNoIHNlcnZlcgotICAgICAqIHdlJ3JlIGJlaW5nIGNhbGxlZC4KLSAgICAgKi8KLSAgICBzbmFtZSA9IChzbmFtZSAhPSBOVUxMKSA/IHNuYW1lIDogIiI7Ci0gICAgbm90ZSA9IGFwX3BzdHJjYXQocCwgImV4YW1wbGVfY2hpbGRfZXhpdCgiLCBzbmFtZSwgIikiLCBOVUxMKTsKLSAgICB0cmFjZV9hZGQocywgTlVMTCwgTlVMTCwgbm90ZSk7Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIHRvIGNyZWF0ZSB1cCBhIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbgotICogcmVjb3JkLiAgVGhpcyB3aWxsIGJlIGNhbGxlZCBmb3IgdGhlICJkZWZhdWx0IiBzZXJ2ZXIgZW52aXJvbm1lbnQsIGFuZCBmb3IKLSAqIGVhY2ggZGlyZWN0b3J5IGZvciB3aGljaCB0aGUgcGFyc2VyIGZpbmRzIGFueSBvZiBvdXIgZGlyZWN0aXZlcyBhcHBsaWNhYmxlLgotICogSWYgYSBkaXJlY3RvcnkgZG9lc24ndCBoYXZlIGFueSBvZiBvdXIgZGlyZWN0aXZlcyBpbnZvbHZlZCAoaS5lLiwgdGhleQotICogYXJlbid0IGluIHRoZSAuaHRhY2Nlc3MgZmlsZSwgb3IgYSA8TG9jYXRpb24+LCA8RGlyZWN0b3J5Piwgb3IgcmVsYXRlZAotICogYmxvY2spLCB0aGlzIHJvdXRpbmUgd2lsbCAqbm90KiBiZSBjYWxsZWQgLSB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlCi0gKiBjbG9zZXN0IGFuY2VzdG9yIGlzIHVzZWQuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgbW9kdWxlLXNwZWNpZmljCi0gKiBzdHJ1Y3R1cmUuCi0gKi8KLXN0YXRpYyB2b2lkICpleGFtcGxlX2NyZWF0ZV9kaXJfY29uZmlnKGFwX2NvbnRleHRfdCAqcCwgY2hhciAqZGlyc3BlYykKLXsKLQotICAgIGV4Y2ZnICpjZmc7Ci0gICAgY2hhciAqZG5hbWUgPSBkaXJzcGVjOwotCi0gICAgLyoKLSAgICAgKiBBbGxvY2F0ZSB0aGUgc3BhY2UgZm9yIG91ciByZWNvcmQgZnJvbSB0aGUgcG9vbCBzdXBwbGllZC4KLSAgICAgKi8KLSAgICBjZmcgPSAoZXhjZmcgKikgYXBfcGNhbGxvYyhwLCBzaXplb2YoZXhjZmcpKTsKLSAgICAvKgotICAgICAqIE5vdyBmaWxsIGluIHRoZSBkZWZhdWx0cy4gIElmIHRoZXJlIGFyZSBhbnkgYHBhcmVudCcgY29uZmlndXJhdGlvbgotICAgICAqIHJlY29yZHMsIHRoZXknbGwgZ2V0IG1lcmdlZCBhcyBwYXJ0IG9mIGEgc2VwYXJhdGUgY2FsbGJhY2suCi0gICAgICovCi0gICAgY2ZnLT5sb2NhbCA9IDA7Ci0gICAgY2ZnLT5jb25nZW5pdGFsID0gMDsKLSAgICBjZmctPmNtb2RlID0gQ09ORklHX01PREVfRElSRUNUT1JZOwotICAgIC8qCi0gICAgICogRmluYWxseSwgYWRkIG91ciB0cmFjZSB0byB0aGUgY2FsbGJhY2sgbGlzdC4KLSAgICAgKi8KLSAgICBkbmFtZSA9IChkbmFtZSAhPSBOVUxMKSA/IGRuYW1lIDogIiI7Ci0gICAgY2ZnLT5sb2MgPSBhcF9wc3RyY2F0KHAsICJESVIoIiwgZG5hbWUsICIpIiwgTlVMTCk7Ci0gICAgdHJhY2VfYWRkKE5VTEwsIE5VTEwsIGNmZywgImV4YW1wbGVfY3JlYXRlX2Rpcl9jb25maWcoKSIpOwotICAgIHJldHVybiAodm9pZCAqKSBjZmc7Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIHRvIG1lcmdlIHR3byBwZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24KLSAqIHJlY29yZHMuICBUaGlzIGlzIHR5cGljYWxseSBkb25lIHRvIGNvcGUgd2l0aCB0aGluZ3MgbGlrZSAuaHRhY2Nlc3MgZmlsZXMKLSAqIG9yIDxMb2NhdGlvbj4gZGlyZWN0aXZlcyBmb3IgZGlyZWN0b3JpZXMgdGhhdCBhcmUgYmVuZWF0aCBvbmUgZm9yIHdoaWNoIGEKLSAqIGNvbmZpZ3VyYXRpb24gcmVjb3JkIHdhcyBhbHJlYWR5IGNyZWF0ZWQuICBUaGUgcm91dGluZSBoYXMgdGhlCi0gKiByZXNwb25zaWJpbGl0eSBvZiBjcmVhdGluZyBhIG5ldyByZWNvcmQgYW5kIG1lcmdpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZQotICogb3RoZXIgdHdvIGludG8gaXQgYXBwcm9wcmlhdGVseS4gIElmIHRoZSBtb2R1bGUgZG9lc24ndCBkZWNsYXJlIGEgbWVyZ2UKLSAqIHJvdXRpbmUsIHRoZSByZWNvcmQgZm9yIHRoZSBjbG9zZXN0IGFuY2VzdG9yIGxvY2F0aW9uICh0aGF0IGhhcyBvbmUpIGlzCi0gKiB1c2VkIGV4Y2x1c2l2ZWx5LgotICoKLSAqIFRoZSByb3V0aW5lIE1VU1QgTk9UIG1vZGlmeSBhbnkgb2YgaXRzIGFyZ3VtZW50cyEKLSAqCi0gKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBtb2R1bGUtc3BlY2lmaWMgc3RydWN0dXJlCi0gKiBjb250YWluaW5nIHRoZSBtZXJnZWQgdmFsdWVzLgotICovCi1zdGF0aWMgdm9pZCAqZXhhbXBsZV9tZXJnZV9kaXJfY29uZmlnKGFwX2NvbnRleHRfdCAqcCwgdm9pZCAqcGFyZW50X2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm5ld2xvY19jb25mKQotewotCi0gICAgZXhjZmcgKm1lcmdlZF9jb25maWcgPSAoZXhjZmcgKikgYXBfcGNhbGxvYyhwLCBzaXplb2YoZXhjZmcpKTsKLSAgICBleGNmZyAqcGNvbmYgPSAoZXhjZmcgKikgcGFyZW50X2NvbmY7Ci0gICAgZXhjZmcgKm5jb25mID0gKGV4Y2ZnICopIG5ld2xvY19jb25mOwotICAgIGNoYXIgKm5vdGU7Ci0KLSAgICAvKgotICAgICAqIFNvbWUgdGhpbmdzIGdldCBjb3BpZWQgZGlyZWN0bHkgZnJvbSB0aGUgbW9yZS1zcGVjaWZpYyByZWNvcmQsIHJhdGhlcgotICAgICAqIHRoYW4gZ2V0dGluZyBtZXJnZWQuCi0gICAgICovCi0gICAgbWVyZ2VkX2NvbmZpZy0+bG9jYWwgPSBuY29uZi0+bG9jYWw7Ci0gICAgbWVyZ2VkX2NvbmZpZy0+bG9jID0gYXBfcHN0cmR1cChwLCBuY29uZi0+bG9jKTsKLSAgICAvKgotICAgICAqIE90aGVycywgbGlrZSB0aGUgc2V0dGluZyBvZiB0aGUgYGNvbmdlbml0YWwnIGZsYWcsIGdldCBPUmVkIGluLiAgVGhlCi0gICAgICogc2V0dGluZyBvZiB0aGF0IHBhcnRpY3VsYXIgZmxhZywgZm9yIGluc3RhbmNlLCBpcyBUUlVFIGlmIGl0IHdhcyBldmVyCi0gICAgICogdHJ1ZSBhbnl3aGVyZSBpbiB0aGUgdXBzdHJlYW0gY29uZmlndXJhdGlvbi4KLSAgICAgKi8KLSAgICBtZXJnZWRfY29uZmlnLT5jb25nZW5pdGFsID0gKHBjb25mLT5jb25nZW5pdGFsIHwgcGNvbmYtPmxvY2FsKTsKLSAgICAvKgotICAgICAqIElmIHdlJ3JlIG1lcmdpbmcgcmVjb3JkcyBmb3IgdHdvIGRpZmZlcmVudCB0eXBlcyBvZiBlbnZpcm9ubWVudCAoc2VydmVyCi0gICAgICogYW5kIGRpcmVjdG9yeSksIG1hcmsgdGhlIG5ldyByZWNvcmQgYXBwcm9wcmlhdGVseS4gIE90aGVyd2lzZSwgaW5oZXJpdAotICAgICAqIHRoZSBjdXJyZW50IHZhbHVlLgotICAgICAqLwotICAgIG1lcmdlZF9jb25maWctPmNtb2RlID0KLSAgICAgICAgKHBjb25mLT5jbW9kZSA9PSBuY29uZi0+Y21vZGUpID8gcGNvbmYtPmNtb2RlIDogQ09ORklHX01PREVfQ09NQk87Ci0gICAgLyoKLSAgICAgKiBOb3cganVzdCByZWNvcmQgb3VyIGJlaW5nIGNhbGxlZCBpbiB0aGUgdHJhY2UgbGlzdC4gIEluY2x1ZGUgdGhlCi0gICAgICogbG9jYXRpb25zIHdlIHdlcmUgYXNrZWQgdG8gbWVyZ2UuCi0gICAgICovCi0gICAgbm90ZSA9IGFwX3BzdHJjYXQocCwgImV4YW1wbGVfbWVyZ2VfZGlyX2NvbmZpZyhcIiIsIHBjb25mLT5sb2MsICJcIixcIiIsCi0gICAgICAgICAgICAgICAgICAgbmNvbmYtPmxvYywgIlwiKSIsIE5VTEwpOwotICAgIHRyYWNlX2FkZChOVUxMLCBOVUxMLCBtZXJnZWRfY29uZmlnLCBub3RlKTsKLSAgICByZXR1cm4gKHZvaWQgKikgbWVyZ2VkX2NvbmZpZzsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgdG8gY3JlYXRlIGEgcGVyLXNlcnZlciBjb25maWd1cmF0aW9uCi0gKiByZWNvcmQuICBJdCB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgZm9yIHRoZSAiZGVmYXVsdCIgc2VydmVyLgotICoKLSAqIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIG1vZHVsZS1zcGVjaWZpYwotICogc3RydWN0dXJlLgotICovCi1zdGF0aWMgdm9pZCAqZXhhbXBsZV9jcmVhdGVfc2VydmVyX2NvbmZpZyhhcF9jb250ZXh0X3QgKnAsIHNlcnZlcl9yZWMgKnMpCi17Ci0KLSAgICBleGNmZyAqY2ZnOwotICAgIGNoYXIgKnNuYW1lID0gcy0+c2VydmVyX2hvc3RuYW1lOwotCi0gICAgLyoKLSAgICAgKiBBcyB3aXRoIHRoZSBleGFtcGxlX2NyZWF0ZV9kaXJfY29uZmlnKCkgcmVvdXRpbmUsIHdlIGFsbG9jYXRlIGFuZCBmaWxsCi0gICAgICogaW4gYW4gZW1wdHkgcmVjb3JkLgotICAgICAqLwotICAgIGNmZyA9IChleGNmZyAqKSBhcF9wY2FsbG9jKHAsIHNpemVvZihleGNmZykpOwotICAgIGNmZy0+bG9jYWwgPSAwOwotICAgIGNmZy0+Y29uZ2VuaXRhbCA9IDA7Ci0gICAgY2ZnLT5jbW9kZSA9IENPTkZJR19NT0RFX1NFUlZFUjsKLSAgICAvKgotICAgICAqIE5vdGUgdGhhdCB3ZSB3ZXJlIGNhbGxlZCBpbiB0aGUgdHJhY2UgbGlzdC4KLSAgICAgKi8KLSAgICBzbmFtZSA9IChzbmFtZSAhPSBOVUxMKSA/IHNuYW1lIDogIiI7Ci0gICAgY2ZnLT5sb2MgPSBhcF9wc3RyY2F0KHAsICJTVlIoIiwgc25hbWUsICIpIiwgTlVMTCk7Ci0gICAgdHJhY2VfYWRkKHMsIE5VTEwsIGNmZywgImV4YW1wbGVfY3JlYXRlX3NlcnZlcl9jb25maWcoKSIpOwotICAgIHJldHVybiAodm9pZCAqKSBjZmc7Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIHRvIG1lcmdlIHR3byBwZXItc2VydmVyIGNvbmZpZ3VyYXRpb24KLSAqIHJlY29yZHMuICBUaGlzIGlzIHR5cGljYWxseSBkb25lIHRvIGNvcGUgd2l0aCB0aGluZ3MgbGlrZSB2aXJ0dWFsIGhvc3RzIGFuZAotICogdGhlIGRlZmF1bHQgc2VydmVyIGNvbmZpZ3VyYXRpb24gIFRoZSByb3V0aW5lIGhhcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YKLSAqIGNyZWF0aW5nIGEgbmV3IHJlY29yZCBhbmQgbWVyZ2luZyB0aGUgY29udGVudHMgb2YgdGhlIG90aGVyIHR3byBpbnRvIGl0Ci0gKiBhcHByb3ByaWF0ZWx5LiAgSWYgdGhlIG1vZHVsZSBkb2Vzbid0IGRlY2xhcmUgYSBtZXJnZSByb3V0aW5lLCB0aGUgbW9yZQotICogc3BlY2lmaWMgZXhpc3RpbmcgcmVjb3JkIGlzIHVzZWQgZXhjbHVzaXZlbHkuCi0gKgotICogVGhlIHJvdXRpbmUgTVVTVCBOT1QgbW9kaWZ5IGFueSBvZiBpdHMgYXJndW1lbnRzIQotICoKLSAqIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIG1vZHVsZS1zcGVjaWZpYyBzdHJ1Y3R1cmUKLSAqIGNvbnRhaW5pbmcgdGhlIG1lcmdlZCB2YWx1ZXMuCi0gKi8KLXN0YXRpYyB2b2lkICpleGFtcGxlX21lcmdlX3NlcnZlcl9jb25maWcoYXBfY29udGV4dF90ICpwLCB2b2lkICpzZXJ2ZXIxX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnNlcnZlcjJfY29uZikKLXsKLQotICAgIGV4Y2ZnICptZXJnZWRfY29uZmlnID0gKGV4Y2ZnICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKGV4Y2ZnKSk7Ci0gICAgZXhjZmcgKnMxY29uZiA9IChleGNmZyAqKSBzZXJ2ZXIxX2NvbmY7Ci0gICAgZXhjZmcgKnMyY29uZiA9IChleGNmZyAqKSBzZXJ2ZXIyX2NvbmY7Ci0gICAgY2hhciAqbm90ZTsKLQotICAgIC8qCi0gICAgICogT3VyIGluaGVyaXRhbmNlIHJ1bGVzIGFyZSBvdXIgb3duLCBhbmQgcGFydCBvZiBvdXIgbW9kdWxlJ3Mgc2VtYW50aWNzLgotICAgICAqIEJhc2ljYWxseSwganVzdCBub3RlIHdoZW5jZSB3ZSBjYW1lLgotICAgICAqLwotICAgIG1lcmdlZF9jb25maWctPmNtb2RlID0KLSAgICAgICAgKHMxY29uZi0+Y21vZGUgPT0gczJjb25mLT5jbW9kZSkgPyBzMWNvbmYtPmNtb2RlIDogQ09ORklHX01PREVfQ09NQk87Ci0gICAgbWVyZ2VkX2NvbmZpZy0+bG9jYWwgPSBzMmNvbmYtPmxvY2FsOwotICAgIG1lcmdlZF9jb25maWctPmNvbmdlbml0YWwgPSAoczFjb25mLT5jb25nZW5pdGFsIHwgczFjb25mLT5sb2NhbCk7Ci0gICAgbWVyZ2VkX2NvbmZpZy0+bG9jID0gYXBfcHN0cmR1cChwLCBzMmNvbmYtPmxvYyk7Ci0gICAgLyoKLSAgICAgKiBUcmFjZSBvdXIgY2FsbCwgaW5jbHVkaW5nIHdoYXQgd2Ugd2VyZSBhc2tlZCB0byBtZXJnZS4KLSAgICAgKi8KLSAgICBub3RlID0gYXBfcHN0cmNhdChwLCAiZXhhbXBsZV9tZXJnZV9zZXJ2ZXJfY29uZmlnKFwiIiwgczFjb25mLT5sb2MsICJcIixcIiIsCi0gICAgICAgICAgICAgICAgICAgczJjb25mLT5sb2MsICJcIikiLCBOVUxMKTsKLSAgICB0cmFjZV9hZGQoTlVMTCwgTlVMTCwgbWVyZ2VkX2NvbmZpZywgbm90ZSk7Ci0gICAgcmV0dXJuICh2b2lkICopIG1lcmdlZF9jb25maWc7Ci19Ci0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFmdGVyIHRoZSByZXF1ZXN0IGhhcyBiZWVuIHJlYWQgYnV0IGJlZm9yZSBhbnkgb3RoZXIKLSAqIHBoYXNlcyBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgVGhpcyBhbGxvd3MgdXMgdG8gbWFrZSBkZWNpc2lvbnMgYmFzZWQgdXBvbgotICogdGhlIGlucHV0IGhlYWRlciBmaWVsZHMuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBpcyBPSywgREVDTElORUQsIG9yIEhUVFBfbXVtYmxlLiAgSWYgd2UgcmV0dXJuIE9LLCBubwotICogZnVydGhlciBtb2R1bGVzIGFyZSBjYWxsZWQgZm9yIHRoaXMgcGhhc2UuCi0gKi8KLXN0YXRpYyBpbnQgZXhhbXBsZV9wb3N0X3JlYWRfcmVxdWVzdChyZXF1ZXN0X3JlYyAqcikKLXsKLQotICAgIGV4Y2ZnICpjZmc7Ci0KLSAgICBjZmcgPSBvdXJfZGNvbmZpZyhyKTsKLSAgICAvKgotICAgICAqIFdlIGRvbid0IGFjdHVhbGx5ICpkbyogYW55dGhpbmcgaGVyZSwgZXhjZXB0IG5vdGUgdGhlIGZhY3QgdGhhdCB3ZSB3ZXJlCi0gICAgICogY2FsbGVkLgotICAgICAqLwotICAgIHRyYWNlX2FkZChyLT5zZXJ2ZXIsIHIsIGNmZywgImV4YW1wbGVfcG9zdF9yZWFkX3JlcXVlc3QoKSIpOwotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBnaXZlcyBvdXIgbW9kdWxlIGFuIG9wcG9ydHVuaXR5IHRvIHRyYW5zbGF0ZSB0aGUgVVJJIGludG8gYW4KLSAqIGFjdHVhbCBmaWxlbmFtZS4gIElmIHdlIGRvbid0IGRvIGFueXRoaW5nIHNwZWNpYWwsIHRoZSBzZXJ2ZXIncyBkZWZhdWx0Ci0gKiBydWxlcyAoQWxpYXMgZGlyZWN0aXZlcyBhbmQgdGhlIGxpa2UpIHdpbGwgY29udGludWUgdG8gYmUgZm9sbG93ZWQuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBpcyBPSywgREVDTElORUQsIG9yIEhUVFBfbXVtYmxlLiAgSWYgd2UgcmV0dXJuIE9LLCBubwotICogZnVydGhlciBtb2R1bGVzIGFyZSBjYWxsZWQgZm9yIHRoaXMgcGhhc2UuCi0gKi8KLXN0YXRpYyBpbnQgZXhhbXBsZV90cmFuc2xhdGVfaGFuZGxlcihyZXF1ZXN0X3JlYyAqcikKLXsKLQotICAgIGV4Y2ZnICpjZmc7Ci0KLSAgICBjZmcgPSBvdXJfZGNvbmZpZyhyKTsKLSAgICAvKgotICAgICAqIFdlIGRvbid0IGFjdHVhbGx5ICpkbyogYW55dGhpbmcgaGVyZSwgZXhjZXB0IG5vdGUgdGhlIGZhY3QgdGhhdCB3ZSB3ZXJlCi0gICAgICogY2FsbGVkLgotICAgICAqLwotICAgIHRyYWNlX2FkZChyLT5zZXJ2ZXIsIHIsIGNmZywgImV4YW1wbGVfdHJhbnNsYXRlX2hhbmRsZXIoKSIpOwotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gY2hlY2sgdGhlIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIHNlbnQgd2l0aAotICogdGhlIHJlcXVlc3QgKHN1Y2ggYXMgbG9va2luZyB1cCB0aGUgdXNlciBpbiBhIGRhdGFiYXNlIGFuZCB2ZXJpZnlpbmcgdGhhdAotICogdGhlIFtlbmNyeXB0ZWRdIHBhc3N3b3JkIHNlbnQgbWF0Y2hlcyB0aGUgb25lIGluIHRoZSBkYXRhYmFzZSkuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBpcyBPSywgREVDTElORUQsIG9yIHNvbWUgSFRUUF9tdW1ibGUgZXJyb3IgKHR5cGljYWxseQotICogSFRUUF9VTkFVVEhPUklaRUQpLiAgSWYgd2UgcmV0dXJuIE9LLCBubyBvdGhlciBtb2R1bGVzIGFyZSBnaXZlbiBhIGNoYW5jZQotICogYXQgdGhlIHJlcXVlc3QgZHVyaW5nIHRoaXMgcGhhc2UuCi0gKi8KLXN0YXRpYyBpbnQgZXhhbXBsZV9jaGVja191c2VyX2lkKHJlcXVlc3RfcmVjICpyKQotewotCi0gICAgZXhjZmcgKmNmZzsKLQotICAgIGNmZyA9IG91cl9kY29uZmlnKHIpOwotICAgIC8qCi0gICAgICogRG9uJ3QgZG8gYW55dGhpbmcgZXhjZXB0IGxvZyB0aGUgY2FsbC4KLSAgICAgKi8KLSAgICB0cmFjZV9hZGQoci0+c2VydmVyLCByLCBjZmcsICJleGFtcGxlX2NoZWNrX3VzZXJfaWQoKSIpOwotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gY2hlY2sgdG8gc2VlIGlmIHRoZSByZXNvdXJjZSBiZWluZyByZXF1ZXN0ZWQKLSAqIHJlcXVpcmVzIGF1dGhvcmlzYXRpb24uCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBpcyBPSywgREVDTElORUQsIG9yIEhUVFBfbXVtYmxlLiAgSWYgd2UgcmV0dXJuIE9LLCBubwotICogb3RoZXIgbW9kdWxlcyBhcmUgY2FsbGVkIGR1cmluZyB0aGlzIHBoYXNlLgotICoKLSAqIElmICphbGwqIG1vZHVsZXMgcmV0dXJuIERFQ0xJTkVELCB0aGUgcmVxdWVzdCBpcyBhYm9ydGVkIHdpdGggYSBzZXJ2ZXIKLSAqIGVycm9yLgotICovCi1zdGF0aWMgaW50IGV4YW1wbGVfYXV0aF9jaGVja2VyKHJlcXVlc3RfcmVjICpyKQotewotCi0gICAgZXhjZmcgKmNmZzsKLQotICAgIGNmZyA9IG91cl9kY29uZmlnKHIpOwotICAgIC8qCi0gICAgICogTG9nIHRoZSBjYWxsIGFuZCByZXR1cm4gT0ssIG9yIGFjY2VzcyB3aWxsIGJlIGRlbmllZCAoZXZlbiB0aG91Z2ggd2UKLSAgICAgKiBkaWRuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcpLgotICAgICAqLwotICAgIHRyYWNlX2FkZChyLT5zZXJ2ZXIsIHIsIGNmZywgImV4YW1wbGVfYXV0aF9jaGVja2VyKCkiKTsKLSAgICByZXR1cm4gREVDTElORUQ7Ci19Ci0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGNoZWNrIGZvciBhbnkgbW9kdWxlLXNwZWNpZmljIHJlc3RyaWN0aW9ucyBwbGFjZWQKLSAqIHVwb24gdGhlIHJlcXVlc3RlZCByZXNvdXJjZS4gIChTZWUgdGhlIG1vZF9hY2Nlc3MgbW9kdWxlIGZvciBhbiBleGFtcGxlLikKLSAqCi0gKiBUaGUgcmV0dXJuIHZhbHVlIGlzIE9LLCBERUNMSU5FRCwgb3IgSFRUUF9tdW1ibGUuICBBbGwgbW9kdWxlcyB3aXRoIGFuCi0gKiBoYW5kbGVyIGZvciB0aGlzIHBoYXNlIGFyZSBjYWxsZWQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZWlyIHByZWRlY2Vzc29ycwotICogcmV0dXJuIE9LIG9yIERFQ0xJTkVELiAgVGhlIGZpcnN0IG9uZSB0byByZXR1cm4gYW55IG90aGVyIHN0YXR1cywgaG93ZXZlciwKLSAqIHdpbGwgYWJvcnQgdGhlIHNlcXVlbmNlIChhbmQgdGhlIHJlcXVlc3QpIGFzIHVzdWFsLgotICovCi1zdGF0aWMgaW50IGV4YW1wbGVfYWNjZXNzX2NoZWNrZXIocmVxdWVzdF9yZWMgKnIpCi17Ci0KLSAgICBleGNmZyAqY2ZnOwotCi0gICAgY2ZnID0gb3VyX2Rjb25maWcocik7Ci0gICAgdHJhY2VfYWRkKHItPnNlcnZlciwgciwgY2ZnLCAiZXhhbXBsZV9hY2Nlc3NfY2hlY2tlcigpIik7Ci0gICAgcmV0dXJuIERFQ0xJTkVEOwotfQotCi0vKgotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBkZXRlcm1pbmUgYW5kL29yIHNldCB0aGUgdmFyaW91cyBkb2N1bWVudCB0eXBlCi0gKiBpbmZvcm1hdGlvbiBiaXRzLCBsaWtlIENvbnRlbnQtdHlwZSAodmlhIHItPmNvbnRlbnRfdHlwZSksIGxhbmd1YWdlLCBldAotICogY2V0ZXJhLgotICoKLSAqIFRoZSByZXR1cm4gdmFsdWUgaXMgT0ssIERFQ0xJTkVELCBvciBIVFRQX211bWJsZS4gIElmIHdlIHJldHVybiBPSywgbm8KLSAqIGZ1cnRoZXIgbW9kdWxlcyBhcmUgZ2l2ZW4gYSBjaGFuY2UgYXQgdGhlIHJlcXVlc3QgZm9yIHRoaXMgcGhhc2UuCi0gKi8KLXN0YXRpYyBpbnQgZXhhbXBsZV90eXBlX2NoZWNrZXIocmVxdWVzdF9yZWMgKnIpCi17Ci0KLSAgICBleGNmZyAqY2ZnOwotCi0gICAgY2ZnID0gb3VyX2Rjb25maWcocik7Ci0gICAgLyoKLSAgICAgKiBMb2cgdGhlIGNhbGwsIGJ1dCBkb24ndCBkbyBhbnl0aGluZyBlbHNlIC0gYW5kIHJlcG9ydCB0cnV0aGZ1bGx5IHRoYXQKLSAgICAgKiB3ZSBkaWRuJ3QgZG8gYW55dGhpbmcuCi0gICAgICovCi0gICAgdHJhY2VfYWRkKHItPnNlcnZlciwgciwgY2ZnLCAiZXhhbXBsZV90eXBlX2NoZWNrZXIoKSIpOwotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gcGVyZm9ybSBhbnkgbW9kdWxlLXNwZWNpZmljIGZpeGluZyBvZiBoZWFkZXIKLSAqIGZpZWxkcywgZXQgY2V0ZXJhLiAgSXQgaXMgaW52b2tlZCBqdXN0IGJlZm9yZSBhbnkgY29udGVudC1oYW5kbGVyLgotICoKLSAqIFRoZSByZXR1cm4gdmFsdWUgaXMgT0ssIERFQ0xJTkVELCBvciBIVFRQX211bWJsZS4gIElmIHdlIHJldHVybiBPSywgdGhlCi0gKiBzZXJ2ZXIgd2lsbCBzdGlsbCBjYWxsIGFueSByZW1haW5pbmcgbW9kdWxlcyB3aXRoIGFuIGhhbmRsZXIgZm9yIHRoaXMKLSAqIHBoYXNlLgotICovCi1zdGF0aWMgaW50IGV4YW1wbGVfZml4ZXJfdXBwZXIocmVxdWVzdF9yZWMgKnIpCi17Ci0KLSAgICBleGNmZyAqY2ZnOwotCi0gICAgY2ZnID0gb3VyX2Rjb25maWcocik7Ci0gICAgLyoKLSAgICAgKiBMb2cgdGhlIGNhbGwgYW5kIGV4aXQuCi0gICAgICovCi0gICAgdHJhY2VfYWRkKHItPnNlcnZlciwgciwgY2ZnLCAiZXhhbXBsZV9maXhlcl91cHBlcigpIik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vKgotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBwZXJmb3JtIGFueSBtb2R1bGUtc3BlY2lmaWMgbG9nZ2luZyBhY3Rpdml0aWVzCi0gKiBvdmVyIGFuZCBhYm92ZSB0aGUgbm9ybWFsIHNlcnZlciB0aGluZ3MuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBpcyBPSywgREVDTElORUQsIG9yIEhUVFBfbXVtYmxlLiAgSWYgd2UgcmV0dXJuIE9LLCBhbnkKLSAqIHJlbWFpbmluZyBtb2R1bGVzIHdpdGggYW4gaGFuZGxlciBmb3IgdGhpcyBwaGFzZSB3aWxsIHN0aWxsIGJlIGNhbGxlZC4KLSAqLwotc3RhdGljIGludCBleGFtcGxlX2xvZ2dlcihyZXF1ZXN0X3JlYyAqcikKLXsKLQotICAgIGV4Y2ZnICpjZmc7Ci0KLSAgICBjZmcgPSBvdXJfZGNvbmZpZyhyKTsKLSAgICB0cmFjZV9hZGQoci0+c2VydmVyLCByLCBjZmcsICJleGFtcGxlX2xvZ2dlcigpIik7Ci0gICAgcmV0dXJuIERFQ0xJTkVEOwotfQotCi0vKgotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBnaXZlIHRoZSBtb2R1bGUgYSBjaGFuY2UgdG8gbG9vayBhdCB0aGUgcmVxdWVzdAotICogaGVhZGVycyBhbmQgdGFrZSBhbnkgYXBwcm9wcmlhdGUgc3BlY2lmaWMgYWN0aW9ucyBlYXJseSBpbiB0aGUgcHJvY2Vzc2luZwotICogc2VxdWVuY2UuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBpcyBPSywgREVDTElORUQsIG9yIEhUVFBfbXVtYmxlLiAgSWYgd2UgcmV0dXJuIE9LLCBhbnkKLSAqIHJlbWFpbmluZyBtb2R1bGVzIHdpdGggaGFuZGxlcnMgZm9yIHRoaXMgcGhhc2Ugd2lsbCBzdGlsbCBiZSBjYWxsZWQuCi0gKi8KLXN0YXRpYyBpbnQgZXhhbXBsZV9oZWFkZXJfcGFyc2VyKHJlcXVlc3RfcmVjICpyKQotewotCi0gICAgZXhjZmcgKmNmZzsKLQotICAgIGNmZyA9IG91cl9kY29uZmlnKHIpOwotICAgIHRyYWNlX2FkZChyLT5zZXJ2ZXIsIHIsIGNmZywgImV4YW1wbGVfaGVhZGVyX3BhcnNlcigpIik7Ci0gICAgcmV0dXJuIERFQ0xJTkVEOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQWxsIG9mIHRoZSByb3V0aW5lcyBoYXZlIGJlZW4gZGVjbGFyZWQgbm93LiAgSGVyZSdzIHRoZSBsaXN0IG9mICAgICAgICAgICovCi0vKiBkaXJlY3RpdmVzIHNwZWNpZmljIHRvIG91ciBtb2R1bGUsIGFuZCBpbmZvcm1hdGlvbiBhYm91dCB3aGVyZSB0aGV5ICAgICAgKi8KLS8qIG1heSBhcHBlYXIgYW5kIGhvdyB0aGUgY29tbWFuZCBwYXJzZXIgc2hvdWxkIHBhc3MgdGhlbSB0byB1cyBmb3IgICAgICAgICAqLwotLyogcHJvY2Vzc2luZy4gIE5vdGUgdGhhdCBjYXJlIG11c3QgYmUgdGFrZW4gdG8gZW5zdXJlIHRoYXQgdGhlcmUgYXJlIE5PICAgICovCi0vKiBjb2xsaXNpb25zIG9mIGRpcmVjdGl2ZSBuYW1lcyBiZXR3ZWVuIG1vZHVsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAKLSAqIExpc3Qgb2YgZGlyZWN0aXZlcyBzcGVjaWZpYyB0byBvdXIgbW9kdWxlLgotICovCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgZXhhbXBsZV9jbWRzW10gPQotewotICAgIHsKLSAgICAgICAgIkV4YW1wbGUiLCAgICAgICAgICAgICAgLyogZGlyZWN0aXZlIG5hbWUgKi8KLSAgICAgICAgY21kX2V4YW1wbGUsICAgICAgICAgICAgLyogY29uZmlnIGFjdGlvbiByb3V0aW5lICovCi0gICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgIC8qIGFyZ3VtZW50IHRvIGluY2x1ZGUgaW4gY2FsbCAqLwotICAgICAgICBPUl9PUFRJT05TLCAgICAgICAgICAgICAvKiB3aGVyZSBhdmFpbGFibGUgKi8KLSAgICAgICAgTk9fQVJHUywgICAgICAgICAgICAgICAgLyogYXJndW1lbnRzICovCi0gICAgICAgICJFeGFtcGxlIGRpcmVjdGl2ZSAtIG5vIGFyZ3VtZW50cyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlyZWN0aXZlIGRlc2NyaXB0aW9uICovCi0gICAgfSwKLSAgICB7TlVMTH0KLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOb3cgdGhlIGxpc3Qgb2YgY29udGVudCBoYW5kbGVycyBhdmFpbGFibGUgZnJvbSB0aGlzIG1vZHVsZS4gICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAKLSAqIExpc3Qgb2YgY29udGVudCBoYW5kbGVycyBvdXIgbW9kdWxlIHN1cHBsaWVzLiAgRWFjaCBoYW5kbGVyIGlzIGRlZmluZWQgYnkKLSAqIHR3byBwYXJ0czogYSBuYW1lIGJ5IHdoaWNoIGl0IGNhbiBiZSByZWZlcmVuY2VkIChzdWNoIGFzIGJ5Ci0gKiB7QWRkLFNldH1IYW5kbGVyKSwgYW5kIHRoZSBhY3R1YWwgcm91dGluZSBuYW1lLiAgVGhlIGxpc3QgaXMgdGVybWluYXRlZCBieQotICogYSBOVUxMIGJsb2NrLCBzaW5jZSBpdCBjYW4gYmUgb2YgdmFyaWFibGUgbGVuZ3RoLgotICoKLSAqIE5vdGUgdGhhdCBjb250ZW50LWhhbmRsZXJzIGFyZSBpbnZva2VkIG9uIGEgbW9zdC1zcGVjaWZpYyB0byBsZWFzdC1zcGVjaWZpYwotICogYmFzaXM7IHRoYXQgaXMsIGEgaGFuZGxlciB0aGF0IGlzIGRlY2xhcmVkIGZvciAidGV4dC9wbGFpbiIgd2lsbCBiZQotICogaW52b2tlZCBiZWZvcmUgb25lIHRoYXQgd2FzIGRlY2xhcmVkIGZvciAidGV4dCAvICoiLiAgTm90ZSBhbHNvIHRoYXQKLSAqIGlmIGEgY29udGVudC1oYW5kbGVyIHJldHVybnMgYW55dGhpbmcgZXhjZXB0IERFQ0xJTkVELCBubyBvdGhlcgotICogY29udGVudC1oYW5kbGVycyB3aWxsIGJlIGNhbGxlZC4KLSAqLwotc3RhdGljIGNvbnN0IGhhbmRsZXJfcmVjIGV4YW1wbGVfaGFuZGxlcnNbXSA9Ci17Ci0gICAgeyJleGFtcGxlLWhhbmRsZXIiLCBleGFtcGxlX2hhbmRsZXJ9LAotICAgIHtOVUxMfQotfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZpbmFsbHksIHRoZSBsaXN0IG9mIGNhbGxiYWNrIHJvdXRpbmVzIGFuZCBkYXRhIHN0cnVjdHVyZXMgdGhhdCAgICAgICAgICAqLwotLyogcHJvdmlkZSB0aGUgaG9va3MgaW50byBvdXIgbW9kdWxlIGZyb20gdGhlIG90aGVyIHBhcnRzIG9mIHRoZSBzZXJ2ZXIuICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogCi0gKiBNb2R1bGUgZGVmaW5pdGlvbiBmb3IgY29uZmlndXJhdGlvbi4gIElmIGEgcGFydGljdWxhciBjYWxsYmFjayBpcyBub3QKLSAqIG5lZWRlZCwgcmVwbGFjZSBpdHMgcm91dGluZSBuYW1lIGJlbG93IHdpdGggdGhlIHdvcmQgTlVMTC4KLSAqCi0gKiBUaGUgbnVtYmVyIGluIGJyYWNrZXRzIGluZGljYXRlcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHJvdXRpbmUgaXMgY2FsbGVkCi0gKiBkdXJpbmcgcmVxdWVzdCBwcm9jZXNzaW5nLiAgTm90ZSB0aGF0IG5vdCBhbGwgcm91dGluZXMgYXJlIG5lY2Vzc2FyaWx5Ci0gKiBjYWxsZWQgKHN1Y2ggYXMgaWYgYSByZXNvdXJjZSBkb2Vzbid0IGhhdmUgYWNjZXNzIHJlc3RyaWN0aW9ucykuCi0gKi8KLW1vZHVsZSBleGFtcGxlX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGLAotICAgIGV4YW1wbGVfaW5pdCwgICAgICAgICAgICAgICAvKiBtb2R1bGUgaW5pdGlhbGl6ZXIgKi8KLSAgICBleGFtcGxlX2NyZWF0ZV9kaXJfY29uZmlnLCAgLyogcGVyLWRpcmVjdG9yeSBjb25maWcgY3JlYXRvciAqLwotICAgIGV4YW1wbGVfbWVyZ2VfZGlyX2NvbmZpZywgICAvKiBkaXIgY29uZmlnIG1lcmdlciAqLwotICAgIGV4YW1wbGVfY3JlYXRlX3NlcnZlcl9jb25maWcsICAgICAgIC8qIHNlcnZlciBjb25maWcgY3JlYXRvciAqLwotICAgIGV4YW1wbGVfbWVyZ2Vfc2VydmVyX2NvbmZpZywgICAgICAgIC8qIHNlcnZlciBjb25maWcgbWVyZ2VyICovCi0gICAgZXhhbXBsZV9jbWRzLCAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgYXBfdGFibGVfdCAqLwotICAgIGV4YW1wbGVfaGFuZGxlcnMsICAgICAgICAgICAvKiBbN10gbGlzdCBvZiBoYW5kbGVycyAqLwotICAgIGV4YW1wbGVfdHJhbnNsYXRlX2hhbmRsZXIsICAvKiBbMl0gZmlsZW5hbWUtdG8tVVJJIHRyYW5zbGF0aW9uICovCi0gICAgZXhhbXBsZV9jaGVja191c2VyX2lkLCAgICAgIC8qIFs1XSBjaGVjay92YWxpZGF0ZSB1c2VyX2lkICovCi0gICAgZXhhbXBsZV9hdXRoX2NoZWNrZXIsICAgICAgIC8qIFs2XSBjaGVjayB1c2VyX2lkIGlzIHZhbGlkICpoZXJlKiAqLwotICAgIGV4YW1wbGVfYWNjZXNzX2NoZWNrZXIsICAgICAvKiBbNF0gY2hlY2sgYWNjZXNzIGJ5IGhvc3QgYWRkcmVzcyAqLwotICAgIGV4YW1wbGVfdHlwZV9jaGVja2VyLCAgICAgICAvKiBbN10gTUlNRSB0eXBlIGNoZWNrZXIvc2V0dGVyICovCi0gICAgZXhhbXBsZV9maXhlcl91cHBlciwgICAgICAgIC8qIFs4XSBmaXh1cHMgKi8KLSAgICBleGFtcGxlX2xvZ2dlciwgICAgICAgICAgICAgLyogWzEwXSBsb2dnZXIgKi8KLSNpZiBNT0RVTEVfTUFHSUNfTlVNQkVSID49IDE5OTcwMTAzCi0gICAgZXhhbXBsZV9oZWFkZXJfcGFyc2VyLCAgICAgIC8qIFszXSBoZWFkZXIgcGFyc2VyICovCi0jZW5kaWYKLSNpZiBNT0RVTEVfTUFHSUNfTlVNQkVSID49IDE5OTcwNzE5Ci0gICAgZXhhbXBsZV9jaGlsZF9pbml0LCAgICAgICAgIC8qIHByb2Nlc3MgaW5pdGlhbGl6ZXIgKi8KLSNlbmRpZgotI2lmIE1PRFVMRV9NQUdJQ19OVU1CRVIgPj0gMTk5NzA3MjgKLSAgICBleGFtcGxlX2NoaWxkX2V4aXQsICAgICAgICAgLyogcHJvY2VzcyBleGl0L2NsZWFudXAgKi8KLSNlbmRpZgotI2lmIE1PRFVMRV9NQUdJQ19OVU1CRVIgPj0gMTk5NzA5MDIKLSAgICBleGFtcGxlX3Bvc3RfcmVhZF9yZXF1ZXN0ICAgLyogWzFdIHBvc3QgcmVhZF9yZXF1ZXN0IGhhbmRsaW5nICovCi0jZW5kaWYKLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL2ZpbHRlcnMvLmluZGVudC5wcm8gYi9tb2R1bGVzL2ZpbHRlcnMvLmluZGVudC5wcm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZmJlOWYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9maWx0ZXJzLy5pbmRlbnQucHJvCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLWk0IC1ucHNsIC1kaTAgLWJyIC1uY2UgLWQwIC1jbGkwIC1ucGNzIC1uZmMxCi0tVEJVRkYKLS1URklMRQotLVRUUkFOUwotLVRVSU5UNAotLVRfdHJhbnMKLS1UYWxsb3dfb3B0aW9uc190Ci0tVGFwYWNoZV9zZmlvCi0tVGFycmF5X2hlYWRlcgotLVRib29sX2ludAotLVRidWZfYXJlYQotLVRidWZmX3N0cnVjdAotLVRidWZmeQotLVRjbWRfaG93Ci0tVGNtZF9wYXJtcwotLVRjb21tYW5kX3JlYwotLVRjb21tYW5kX3N0cnVjdAotLVRjb25uX3JlYwotLVRjb3JlX2Rpcl9jb25maWcKLS1UY29yZV9zZXJ2ZXJfY29uZmlnCi0tVGRpcl9tYWtlcl9mdW5jCi0tVGV2ZW50Ci0tVGdsb2JhbHNfcwotLVRoYW5kbGVyX2Z1bmMKLS1UaGFuZGxlcl9yZWMKLS1Uam9ibGlzdF9zCi0tVGxpc3Rlbl9yZWMKLS1UbWVyZ2VyX2Z1bmMKLS1UbW9kZV90Ci0tVG1vZHVsZQotLVRtb2R1bGVfc3RydWN0Ci0tVG11dGV4Ci0tVG5fbG9uZwotLVRvdGhlcl9jaGlsZF9yZWMKLS1Ub3ZlcnJpZGVzX3QKLS1UcGFyZW50X3Njb3JlCi0tVHBpZF90Ci0tVHBpcGVkX2xvZwotLVRwb29sCi0tVHJlcXVlc3RfcmVjCi0tVHJlcXVpcmVfbGluZQotLVRybGltX3QKLS1Uc2NvcmVib2FyZAotLVRzZW1hcGhvcmUKLS1Uc2VydmVyX2FkZHJfcmVjCi0tVHNlcnZlcl9yZWMKLS1Uc2VydmVyX3JlY19jaGFpbgotLVRzaG9ydF9zY29yZQotLVR0YWJsZQotLVR0YWJsZV9lbnRyeQotLVR0aHJlYWQKLS1UdV93aWRlX2ludAotLVR2dGltZV90Ci0tVHdpZGVfaW50CmRpZmYgLS1naXQgYS9tb2R1bGVzL2ZpbHRlcnMvbW9kX2luY2x1ZGUuYyBiL21vZHVsZXMvZmlsdGVycy9tb2RfaW5jbHVkZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGUyZDk0Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZmlsdGVycy9tb2RfaW5jbHVkZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4OCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBodHRwX2luY2x1ZGUuYzogSGFuZGxlcyB0aGUgc2VydmVyLXBhcnNlZCBIVE1MIGRvY3VtZW50cwotICogCi0gKiBPcmlnaW5hbCBieSBSb2IgTWNDb29sOyBzdWJzdGFudGlhbCBmaXh1cHMgYnkgRGF2aWQgUm9iaW5zb247Ci0gKiBpbmNvcnBvcmF0ZWQgaW50byB0aGUgQXBhY2hlIG1vZHVsZSBmcmFtZXdvcmsgYnkgcnN0LgotICogCi0gKi8KLS8qIAotICogc3ViIGtleSBtYXkgYmUgYW55dGhpbmcgYSBQZXJsKkhhbmRsZXIgY2FuIGJlOgotICogc3Vicm91dGluZSBuYW1lLCBwYWNrYWdlIG5hbWUgKGRlZmF1bHRzIHRvIHBhY2thZ2U6OmhhbmRsZXIpLAotICogQ2xhc3MtPm1ldGhvZCBjYWxsIG9yIGFub3ltb3VzIHN1YiB7fQotICoKLSAqIENoaWxkIDwhLS0jcGVybCBzdWI9InN1YiB7cHJpbnQgJCR9IiAtLT4gYWNjZXNzZWQKLSAqIDwhLS0jcGVybCBzdWI9InN1YiB7cHJpbnQgKyskQWNjZXNzOjpDbnQgfSIgLS0+IHRpbWVzLiA8YnI+Ci0gKgotICogPCEtLSNwZXJsIGFyZz0ib25lIiBzdWI9Im15bW9kOjppbmNsdWRlciIgLS0+Ci0gKgotICogLURvdWcgTWFjRWFjaGVybgotICovCi0KLSNpZmRlZiBVU0VfUEVSTF9TU0kKLSNpbmNsdWRlICJjb25maWcuaCIKLSN1bmRlZiBWT0lEVVNFRAotI2lmZGVmIFVTRV9TRklPCi0jdW5kZWYgVVNFX1NGSU8KLSNkZWZpbmUgVVNFX1NURElPCi0jZW5kaWYKLSNpbmNsdWRlICJtb2R1bGVzL3BlcmwvbW9kX3BlcmwuaCIKLSNlbHNlCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgInV0aWxfc2NyaXB0LmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaWZkZWYgSEFWRV9QV0RfSAotI2luY2x1ZGUgPHB3ZC5oPgotI2VuZGlmCi0jZW5kaWYKLQotI2RlZmluZSBTVEFSVElOR19TRVFVRU5DRSAiPCEtLSMiCi0jZGVmaW5lIEVORElOR19TRVFVRU5DRSAiLS0+IgotI2RlZmluZSBERUZBVUxUX0VSUk9SX01TRyAiW2FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhpcyBkaXJlY3RpdmVdIgotI2RlZmluZSBERUZBVUxUX1RJTUVfRk9STUFUICIlQSwgJWQtJWItJVkgJUg6JU06JVMgJVoiCi0jZGVmaW5lIFNJWkVGTVRfQllURVMgMAotI2RlZmluZSBTSVpFRk1UX0tNRyAxCi0jaWZkZWYgQ0hBUlNFVF9FQkNESUMKLSNkZWZpbmUgUkFXX0FTQ0lJX0NIQVIoY2gpICBvc190b2ViY2RpY1sodW5zaWduZWQgY2hhciljaF0KLSNlbHNlIC8qQ0hBUlNFVF9FQkNESUMqLwotI2RlZmluZSBSQVdfQVNDSUlfQ0hBUihjaCkgIChjaCkKLSNlbmRpZiAvKkNIQVJTRVRfRUJDRElDKi8KLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGluY2x1ZGVzX21vZHVsZTsKLQotLyoganVzdCBuZWVkIHNvbWUgYXJiaXRyYXJ5IG5vbi1OVUxMIHBvaW50ZXIgd2hpY2ggY2FuJ3QgYWxzbyBiZSBhIHJlcXVlc3RfcmVjICovCi0jZGVmaW5lIE5FU1RFRF9JTkNMVURFX01BR0lDCSgmaW5jbHVkZXNfbW9kdWxlKQotCi0vKiBUT0RPOiBjaGFuZ2luZyBkaXJlY3Rvcnkgc2hvdWxkIGJlIGhhbmRsZWQgYnkgQ3JlYXRlUHJvY2VzcyAqLwotI2RlZmluZSBhcF9jaGRpcl9maWxlKHgpIGRvIHt9IHdoaWxlKDApCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbnZpcm9ubWVudCBmdW5jdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBYWFg6IGNvdWxkIHVzZSBhcF90YWJsZV9vdmVybGFwIGhlcmUgKi8KLXN0YXRpYyB2b2lkIGFkZF9pbmNsdWRlX3ZhcnMocmVxdWVzdF9yZWMgKnIsIGNoYXIgKnRpbWVmbXQpCi17Ci0jaWZuZGVmIFdJTjMyCi0gICAgc3RydWN0IHBhc3N3ZCAqcHc7Ci0jZW5kaWYgLyogbmRlZiBXSU4zMiAqLwotICAgIGFwX3RhYmxlX3QgKmUgPSByLT5zdWJwcm9jZXNzX2VudjsKLSAgICBjaGFyICp0OwotICAgIGFwX3RpbWVfdCBkYXRlID0gci0+cmVxdWVzdF90aW1lOwotCi0gICAgYXBfdGFibGVfc2V0bihlLCAiREFURV9MT0NBTCIsIGFwX2h0X3RpbWUoci0+cG9vbCwgZGF0ZSwgdGltZWZtdCwgMCkpOwotICAgIGFwX3RhYmxlX3NldG4oZSwgIkRBVEVfR01UIiwgYXBfaHRfdGltZShyLT5wb29sLCBkYXRlLCB0aW1lZm10LCAxKSk7Ci0gICAgYXBfdGFibGVfc2V0bihlLCAiTEFTVF9NT0RJRklFRCIsCi0gICAgICAgICAgICAgIGFwX2h0X3RpbWUoci0+cG9vbCwgci0+ZmluZm8ubXRpbWUsIHRpbWVmbXQsIDApKTsKLSAgICBhcF90YWJsZV9zZXRuKGUsICJET0NVTUVOVF9VUkkiLCByLT51cmkpOwotICAgIGFwX3RhYmxlX3NldG4oZSwgIkRPQ1VNRU5UX1BBVEhfSU5GTyIsIHItPnBhdGhfaW5mbyk7Ci0jaWZuZGVmIFdJTjMyCi0gICAgcHcgPSBnZXRwd3VpZChyLT5maW5mby51c2VyKTsKLSAgICBpZiAocHcpIHsKLSAgICAgICAgYXBfdGFibGVfc2V0bihlLCAiVVNFUl9OQU1FIiwgYXBfcHN0cmR1cChyLT5wb29sLCBwdy0+cHdfbmFtZSkpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgYXBfdGFibGVfc2V0bihlLCAiVVNFUl9OQU1FIiwgYXBfcHNwcmludGYoci0+cG9vbCwgInVzZXIjJWx1IiwKLSAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHItPmZpbmZvLnVzZXIpKTsKLSAgICB9Ci0jZW5kaWYgLyogbmRlZiBXSU4zMiAqLwotCi0gICAgaWYgKCh0ID0gc3RycmNocihyLT5maWxlbmFtZSwgJy8nKSkpIHsKLSAgICAgICAgYXBfdGFibGVfc2V0bihlLCAiRE9DVU1FTlRfTkFNRSIsICsrdCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBhcF90YWJsZV9zZXRuKGUsICJET0NVTUVOVF9OQU1FIiwgci0+dXJpKTsKLSAgICB9Ci0gICAgaWYgKHItPmFyZ3MpIHsKLSAgICAgICAgY2hhciAqYXJnX2NvcHkgPSBhcF9wc3RyZHVwKHItPnBvb2wsIHItPmFyZ3MpOwotCi0gICAgICAgIGFwX3VuZXNjYXBlX3VybChhcmdfY29weSk7Ci0gICAgICAgIGFwX3RhYmxlX3NldG4oZSwgIlFVRVJZX1NUUklOR19VTkVTQ0FQRUQiLAotICAgICAgICAgICAgICAgICAgYXBfZXNjYXBlX3NoZWxsX2NtZChyLT5wb29sLCBhcmdfY29weSkpOwotICAgIH0KLX0KLQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYXJzZXIgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jZGVmaW5lIE9VVEJVRlNJWkUgNDA5NgotLyogUFVUX0NIQVIgYW5kIEZMVVNIX0JVRiBjdXJyZW50bHkgb25seSB3b3JrIHdpdGhpbiB0aGUgc2NvcGUgb2YgCi0gKiBmaW5kX3N0cmluZygpOyB0aGV5IGFyZSBoYWNrcyB0byBhdm9pZCBjYWxsaW5nIHJwdXRjIGZvciBlYWNoIGFuZAotICogZXZlcnkgY2hhcmFjdGVyIG91dHB1dC4gIEEgY29tbW9uIHNldCBvZiBidWZmZXJpbmcgY2FsbHMgZm9yIHRoaXMgCi0gKiB0eXBlIG9mIG91dHB1dCBTSE9VTEQgYmUgaW1wbGVtZW50ZWQuCi0gKi8KLSNkZWZpbmUgUFVUX0NIQVIoYyxyKSBcCi0geyBcCi0gICAgb3V0YnVmW291dGluZCsrXSA9IGM7IFwKLSAgICBpZiAob3V0aW5kID09IE9VVEJVRlNJWkUpIHsgXAotICAgICAgICBGTFVTSF9CVUYocikgXAotICAgIH07IFwKLSB9Ci0KLS8qIHRoZXJlIFNIT1VMRCBiZSBzb21lIGVycm9yIGNoZWNraW5nIG9uIHRoZSByZXR1cm4gdmFsdWUgb2YKLSAqIHJ3cml0ZSwgaG93ZXZlciBpdCBpcyB1bmNsZWFyIHdoYXQgdGhlIEFQSSBmb3IgcndyaXRlIHJldHVybmluZwotICogZXJyb3JzIGlzIGFuZCBsaXR0bGUgY2FuIHJlYWxseSBiZSBkb25lIHRvIGhlbHAgdGhlIGVycm9yIGluIAotICogYW55IGNhc2UuCi0gKi8KLSNkZWZpbmUgRkxVU0hfQlVGKHIpIFwKLSB7IFwKLSAgIGFwX3J3cml0ZShvdXRidWYsIG91dGluZCwgcik7IFwKLSAgIG91dGluZCA9IDA7IFwKLSB9Ci0KLS8qCi0gKiBmOiBmaWxlIGhhbmRsZSBiZWluZyByZWFkIGZyb20KLSAqIGM6IGNoYXJhY3RlciB0byByZWFkIGludG8KLSAqIHJldDogcmV0dXJuIHZhbHVlIHRvIHVzZSBpZiBpbnB1dCBmYWlscwotICogcjogY3VycmVudCByZXF1ZXN0X3JlYwotICoKLSAqIFRoaXMgbWFjcm8gaXMgcmVkZWZpbmVkIGFmdGVyIGZpbmRfc3RyaW5nKCkgZm9yIGhpc3RvcmljYWwgcmVhc29ucwotICogdG8gYXZvaWQgdG9vIG1hbnkgY29kZSBjaGFuZ2VzLiAgVGhpcyBpcyBvbmUgb2YgdGhlIG1hbnkgdGhpbmdzCi0gKiB0aGF0IHNob3VsZCBiZSBmaXhlZC4KLSAqLwotI2RlZmluZSBHRVRfQ0hBUihmLGMscmV0LHIpIFwKLSB7IFwKLSAgIGFwX3N0YXR1c190IHN0YXR1cyA9IGFwX2dldGMoJmMsIGYpOyBcCi0gICBpZiAoc3RhdHVzICE9IEFQUl9TVUNDRVNTKSB7IC8qIGVpdGhlciBFT0Ygb3IgZXJyb3IgLS0gbmVlZHMgZXJyb3IgaGFuZGxpbmcgaWYgbGF0dGVyICovIFwKLSAgICAgICBpZiAoc3RhdHVzICE9IEFQUl9FT0YpIHsgXAotICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICJlbmNvdW50ZXJlZCBlcnJvciBpbiBHRVRfQ0hBUiBtYWNybywgIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAibW9kX2luY2x1ZGUuIik7IFwKLSAgICAgICB9IFwKLSAgICAgICBGTFVTSF9CVUYocik7IFwKLSAgICAgICBhcF9jbG9zZShmKTsgXAotICAgICAgIHJldHVybiByZXQ7IFwKLSAgIH0gXAotIH0KLQotc3RhdGljIGludCBmaW5kX3N0cmluZyhhcF9maWxlX3QgKmluLCBjb25zdCBjaGFyICpzdHIsIHJlcXVlc3RfcmVjICpyLCBpbnQgcHJpbnRpbmcpCi17Ci0gICAgaW50IHgsIGwgPSBzdHJsZW4oc3RyKSwgcDsKLSAgICBjaGFyIG91dGJ1ZltPVVRCVUZTSVpFXTsKLSAgICBpbnQgb3V0aW5kID0gMDsKLSAgICBjaGFyIGM7Ci0KLSAgICBwID0gMDsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBHRVRfQ0hBUihpbiwgYywgMSwgcik7Ci0gICAgICAgIGlmIChjID09IHN0cltwXSkgewotICAgICAgICAgICAgaWYgKCgrK3ApID09IGwpIHsKLSAgICAgICAgICAgICAgICBGTFVTSF9CVUYocik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAocHJpbnRpbmcpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgcDsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBVVF9DSEFSKHN0clt4XSwgcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFBVVF9DSEFSKGMsIHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcCA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLSN1bmRlZiBGTFVTSF9CVUYKLSN1bmRlZiBQVVRfQ0hBUgotI3VuZGVmIEdFVF9DSEFSCi0jZGVmaW5lIEdFVF9DSEFSKGYsYyxyLHApIFwKLSB7IFwKLSAgIGFwX3N0YXR1c190IHN0YXR1cyA9IGFwX2dldGMoJmMsIGYpOyBcCi0gICBpZiAoc3RhdHVzICE9IEFQUl9TVUNDRVNTKSB7IC8qIGVpdGhlciBFT0Ygb3IgZXJyb3IgLS0gbmVlZHMgZXJyb3IgaGFuZGxpbmcgaWYgbGF0dGVyICovIFwKLSAgICAgICBpZiAoc3RhdHVzICE9IEFQUl9FT0YpIHsgXAotICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICJlbmNvdW50ZXJlZCBlcnJvciBpbiBHRVRfQ0hBUiBtYWNybywgIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAibW9kX2luY2x1ZGUuIik7IFwKLSAgICAgICB9IFwKLSAgICAgICBhcF9jbG9zZShmKTsgXAotICAgICAgIHJldHVybiByOyBcCi0gICB9IFwKLSB9Ci0KLS8qCi0gKiBkZWNvZGVzIGEgc3RyaW5nIGNvbnRhaW5pbmcgaHRtbCBlbnRpdGllcyBvciBudW1lcmljIGNoYXJhY3RlciByZWZlcmVuY2VzLgotICogJ3MnIGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlIGRlY29kZWQgc3RyaW5nLgotICogSWYgJ3MnIGlzIHN5bnRhdGljYWxseSBpbmNvcnJlY3QsIHRoZW4gdGhlIGZvbGxvd2VkIGZpeHVwcyB3aWxsIGJlIG1hZGU6Ci0gKiAgIHVua25vd24gZW50aXRpZXMgd2lsbCBiZSBsZWZ0IHVuZGVjb2RlZDsKLSAqICAgcmVmZXJlbmNlcyB0byB1bnVzZWQgbnVtZXJpYyBjaGFyYWN0ZXJzIHdpbGwgYmUgZGVsZXRlZC4KLSAqICAgSW4gcGFydGljdWxhciwgJiMwMDsgd2lsbCBub3QgYmUgZGVjb2RlZCwgYnV0IHdpbGwgYmUgZGVsZXRlZC4KLSAqCi0gKiBkcnRyCi0gKi8KLQotLyogbWF4aW11bSBsZW5ndGggb2YgYW55IElTTy1MQVRJTi0xIEhUTUwgZW50aXR5IG5hbWUuICovCi0jZGVmaW5lIE1BWEVOVExFTiAoNikKLQotLyogVGhlIGZvbGxvd2luZyBpcyBhIHNocmlua2luZyB0cmFuc2Zvcm1hdGlvbiwgdGhlcmVmb3JlIHNhZmUuICovCi0KLXN0YXRpYyB2b2lkIGRlY29kZWh0bWwoY2hhciAqcykKLXsKLSAgICBpbnQgdmFsLCBpLCBqOwotICAgIGNoYXIgKnAgPSBzOwotICAgIGNvbnN0IGNoYXIgKmVudHM7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBlbnRsaXN0W01BWEVOVExFTiArIDFdID0KLSAgICB7Ci0gICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgIC8qIDAgKi8KLSAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLyogMSAqLwotICAgICAgICAibHRcMDc0Z3RcMDc2IiwgICAgICAgICAvKiAyICovCi0gICAgICAgICJhbXBcMDQ2RVRIXDMyMGV0aFwzNjAiLCAgICAgICAgLyogMyAqLwotICAgICAgICAicXVvdFwwNDJBdW1sXDMwNEV1bWxcMzEzSXVtbFwzMTdPdW1sXDMyNlV1bWxcMzM0YXVtbFwzNDRldW1sXDM1M1wKLWl1bWxcMzU3b3VtbFwzNjZ1dW1sXDM3NHl1bWxcMzc3IiwgICAgICAvKiA0ICovCi0gICAgICAgICJBY2lyY1wzMDJBcmluZ1wzMDVBRWxpZ1wzMDZFY2lyY1wzMTJJY2lyY1wzMTZPY2lyY1wzMjRVY2lyY1wzMzNcCi1USE9STlwzMzZzemxpZ1wzMzdhY2lyY1wzNDJhcmluZ1wzNDVhZWxpZ1wzNDZlY2lyY1wzNTJpY2lyY1wzNTZvY2lyY1wzNjRcCi11Y2lyY1wzNzN0aG9yblwzNzYiLCAgICAgICAgICAgIC8qIDUgKi8KLSAgICAgICAgIkFncmF2ZVwzMDBBYWN1dGVcMzAxQXRpbGRlXDMwM0NjZWRpbFwzMDdFZ3JhdmVcMzEwRWFjdXRlXDMxMVwKLUlncmF2ZVwzMTRJYWN1dGVcMzE1TnRpbGRlXDMyMU9ncmF2ZVwzMjJPYWN1dGVcMzIzT3RpbGRlXDMyNU9zbGFzaFwzMzBcCi1VZ3JhdmVcMzMxVWFjdXRlXDMzMllhY3V0ZVwzMzVhZ3JhdmVcMzQwYWFjdXRlXDM0MWF0aWxkZVwzNDNjY2VkaWxcMzQ3XAotZWdyYXZlXDM1MGVhY3V0ZVwzNTFpZ3JhdmVcMzU0aWFjdXRlXDM1NW50aWxkZVwzNjFvZ3JhdmVcMzYyb2FjdXRlXDM2M1wKLW90aWxkZVwzNjVvc2xhc2hcMzcwdWdyYXZlXDM3MXVhY3V0ZVwzNzJ5YWN1dGVcMzc1IiAgICAgLyogNiAqLwotICAgIH07Ci0KLSAgICBmb3IgKDsgKnMgIT0gJ1wwJzsgcysrLCBwKyspIHsKLSAgICAgICAgaWYgKCpzICE9ICcmJykgewotICAgICAgICAgICAgKnAgPSAqczsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8qIGZpbmQgZW5kIG9mIGVudGl0eSAqLwotICAgICAgICBmb3IgKGkgPSAxOyBzW2ldICE9ICc7JyAmJiBzW2ldICE9ICdcMCc7IGkrKykgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc1tpXSA9PSAnXDAnKSB7ICAgICAvKiB0cmVhdCBhcyBub3JtYWwgZGF0YSAqLwotICAgICAgICAgICAgKnAgPSAqczsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogaXMgaXQgbnVtZXJpYyA/ICovCi0gICAgICAgIGlmIChzWzFdID09ICcjJykgewotICAgICAgICAgICAgZm9yIChqID0gMiwgdmFsID0gMDsgaiA8IGkgJiYgYXBfaXNkaWdpdChzW2pdKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgdmFsID0gdmFsICogMTAgKyBzW2pdIC0gJzAnOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcyArPSBpOwotICAgICAgICAgICAgaWYgKGogPCBpIHx8IHZhbCA8PSA4IHx8ICh2YWwgPj0gMTEgJiYgdmFsIDw9IDMxKSB8fAotICAgICAgICAgICAgICAgICh2YWwgPj0gMTI3ICYmIHZhbCA8PSAxNjApIHx8IHZhbCA+PSAyNTYpIHsKLSAgICAgICAgICAgICAgICBwLS07ICAgICAgICAgICAgLyogbm8gZGF0YSB0byBvdXRwdXQgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICpwID0gUkFXX0FTQ0lJX0NIQVIodmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGogPSBpIC0gMTsKLSAgICAgICAgICAgIGlmIChqID4gTUFYRU5UTEVOIHx8IGVudGxpc3Rbal0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIC8qIHdyb25nIGxlbmd0aCAqLwotICAgICAgICAgICAgICAgICpwID0gJyYnOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAvKiBza2lwIGl0ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGVudHMgPSBlbnRsaXN0W2pdOyAqZW50cyAhPSAnXDAnOyBlbnRzICs9IGkpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RybmNtcChzICsgMSwgZW50cywgaikgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgqZW50cyA9PSAnXDAnKSB7Ci0gICAgICAgICAgICAgICAgKnAgPSAnJic7ICAgICAgIC8qIHVua25vd24gKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICpwID0gUkFXX0FTQ0lJX0NIQVIoKChjb25zdCB1bnNpZ25lZCBjaGFyICopIGVudHMpW2pdKTsKLSAgICAgICAgICAgICAgICBzICs9IGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAqcCA9ICdcMCc7Ci19Ci0KLS8qCi0gKiBleHRyYWN0IHRoZSBuZXh0IHRhZyBuYW1lIGFuZCB2YWx1ZS4KLSAqIGlmIHRoZXJlIGFyZSBubyBtb3JlIHRhZ3MsIHNldCB0aGUgdGFnIG5hbWUgdG8gJ2RvbmUnCi0gKiB0aGUgdGFnIHZhbHVlIGlzIGh0bWwgZGVjb2RlZCBpZiBkb2RlY29kZSBpcyBub24temVybwotICovCi0KLXN0YXRpYyBjaGFyICpnZXRfdGFnKGFwX2NvbnRleHRfdCAqcCwgYXBfZmlsZV90ICppbiwgY2hhciAqdGFnLCBpbnQgdGFnYnVmX2xlbiwgaW50IGRvZGVjb2RlKQotewotICAgIGNoYXIgKnQgPSB0YWcsICp0YWdfdmFsLCBjLCB0ZXJtOwotCi0gICAgLyogbWFrZXMgY29kZSBiZWxvdyBhIGxpdHRsZSBsZXNzIGNsdXR0ZXJlZCAqLwotICAgIC0tdGFnYnVmX2xlbjsKLQotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBza2lwIHdoaXRlc3BhY2UgKi8KLSAgICAgICAgR0VUX0NIQVIoaW4sIGMsIE5VTEwsIHApOwotICAgIH0gd2hpbGUgKGFwX2lzc3BhY2UoYykpOwotCi0gICAgLyogdGFncyBjYW4ndCBzdGFydCB3aXRoIC0gKi8KLSAgICBpZiAoYyA9PSAnLScpIHsKLSAgICAgICAgR0VUX0NIQVIoaW4sIGMsIE5VTEwsIHApOwotICAgICAgICBpZiAoYyA9PSAnLScpIHsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBHRVRfQ0hBUihpbiwgYywgTlVMTCwgcCk7Ci0gICAgICAgICAgICB9IHdoaWxlIChhcF9pc3NwYWNlKGMpKTsKLSAgICAgICAgICAgIGlmIChjID09ICc+JykgewotICAgICAgICAgICAgICAgIGFwX2NweXN0cm4odGFnLCAiZG9uZSIsIHRhZ2J1Zl9sZW4pOwotICAgICAgICAgICAgICAgIHJldHVybiB0YWc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgLyogZmFpbGVkICovCi0gICAgfQotCi0gICAgLyogZmluZCBlbmQgb2YgdGFnIG5hbWUgKi8KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAodCAtIHRhZyA9PSB0YWdidWZfbGVuKSB7Ci0gICAgICAgICAgICAqdCA9ICdcMCc7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoYyA9PSAnPScgfHwgYXBfaXNzcGFjZShjKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgKih0KyspID0gYXBfdG9sb3dlcihjKTsKLSAgICAgICAgR0VUX0NIQVIoaW4sIGMsIE5VTEwsIHApOwotICAgIH0KLQotICAgICp0KysgPSAnXDAnOwotICAgIHRhZ192YWwgPSB0OwotCi0gICAgd2hpbGUgKGFwX2lzc3BhY2UoYykpIHsKLSAgICAgICAgR0VUX0NIQVIoaW4sIGMsIE5VTEwsIHApOyAgICAgICAvKiBzcGFjZSBiZWZvcmUgPSAqLwotICAgIH0KLSAgICBpZiAoYyAhPSAnPScpIHsKLSAgICAgICAgYXBfdW5nZXRjKGMsIGluKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgZG8gewotICAgICAgICBHRVRfQ0hBUihpbiwgYywgTlVMTCwgcCk7ICAgICAgIC8qIHNwYWNlIGFmdGVyID0gKi8KLSAgICB9IHdoaWxlIChhcF9pc3NwYWNlKGMpKTsKLQotICAgIC8qIHdlIHNob3VsZCBhbGxvdyBhICduYW1lJyBhcyBhIHZhbHVlICovCi0KLSAgICBpZiAoYyAhPSAnIicgJiYgYyAhPSAnXCcnKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB0ZXJtID0gYzsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBHRVRfQ0hBUihpbiwgYywgTlVMTCwgcCk7Ci0gICAgICAgIGlmICh0IC0gdGFnID09IHRhZ2J1Zl9sZW4pIHsKLSAgICAgICAgICAgICp0ID0gJ1wwJzsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0vKiBXYW50IHRvIGFjY2VwdCBcIiBhcyBhIHZhbGlkIGNoYXJhY3RlciB3aXRoaW4gYSBzdHJpbmcuICovCi0gICAgICAgIGlmIChjID09ICdcXCcpIHsKLSAgICAgICAgICAgICoodCsrKSA9IGM7ICAgICAgICAgLyogQWRkIGJhY2tzbGFzaCAqLwotICAgICAgICAgICAgR0VUX0NIQVIoaW4sIGMsIE5VTEwsIHApOwotICAgICAgICAgICAgaWYgKGMgPT0gdGVybSkgeyAgICAvKiBPbmx5IGlmICovCi0gICAgICAgICAgICAgICAgKigtLXQpID0gYzsgICAgIC8qIFJlcGxhY2UgYmFja3NsYXNoIE9OTFkgZm9yIHRlcm1pbmF0b3IgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjID09IHRlcm0pIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgICoodCsrKSA9IGM7Ci0gICAgfQotICAgICp0ID0gJ1wwJzsKLSAgICBpZiAoZG9kZWNvZGUpIHsKLSAgICAgICAgZGVjb2RlaHRtbCh0YWdfdmFsKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFwX3BzdHJkdXAocCwgdGFnX3ZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2RpcmVjdGl2ZShhcF9maWxlX3QgKmluLCBjaGFyICpkZXN0LCBzaXplX3QgbGVuLCBhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgY2hhciAqZCA9IGRlc3Q7Ci0gICAgY2hhciBjOwotCi0gICAgLyogbWFrZSByb29tIGZvciBudWwgdGVybWluYXRvciAqLwotICAgIC0tbGVuOwotCi0gICAgLyogc2tpcCBpbml0aWFsIHdoaXRlc3BhY2UgKi8KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBHRVRfQ0hBUihpbiwgYywgMSwgcCk7Ci0gICAgICAgIGlmICghYXBfaXNzcGFjZShjKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogbm93IGdldCBkaXJlY3RpdmUgKi8KLSAgICB3aGlsZSAoMSkgewotCWlmIChkIC0gZGVzdCA9PSBsZW4pIHsKLQkgICAgcmV0dXJuIDE7Ci0JfQotICAgICAgICAqZCsrID0gYXBfdG9sb3dlcihjKTsKLSAgICAgICAgR0VUX0NIQVIoaW4sIGMsIDEsIHApOwotICAgICAgICBpZiAoYXBfaXNzcGFjZShjKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKmQgPSAnXDAnOwotICAgIHJldHVybiAwOwotfQotCi0vKgotICogRG8gdmFyaWFibGUgc3Vic3RpdHV0aW9uIG9uIHN0cmluZ3MKLSAqLwotc3RhdGljIHZvaWQgcGFyc2Vfc3RyaW5nKHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICppbiwgY2hhciAqb3V0LAotCQkJc2l6ZV90IGxlbmd0aCwgaW50IGxlYXZlX25hbWUpCi17Ci0gICAgY2hhciBjaDsKLSAgICBjaGFyICpuZXh0ID0gb3V0OwotICAgIGNoYXIgKmVuZF9vdXQ7Ci0KLSAgICAvKiBsZWF2ZSByb29tIGZvciBudWwgdGVybWluYXRvciAqLwotICAgIGVuZF9vdXQgPSBvdXQgKyBsZW5ndGggLSAxOwotCi0gICAgd2hpbGUgKChjaCA9ICppbisrKSAhPSAnXDAnKSB7Ci0gICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgY2FzZSAnXFwnOgotCSAgICBpZiAobmV4dCA9PSBlbmRfb3V0KSB7Ci0JCS8qIHRydW5jYXRlZCAqLwotCQkqbmV4dCA9ICdcMCc7Ci0JCXJldHVybjsKLQkgICAgfQotICAgICAgICAgICAgaWYgKCppbiA9PSAnJCcpIHsKLSAgICAgICAgICAgICAgICAqbmV4dCsrID0gKmluKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAqbmV4dCsrID0gY2g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnJCc6Ci0gICAgICAgICAgICB7Ci0JCWNoYXIgdmFyW01BWF9TVFJJTkdfTEVOXTsKLQkJY29uc3QgY2hhciAqc3RhcnRfb2ZfdmFyX25hbWU7Ci0JCWNvbnN0IGNoYXIgKmVuZF9vZl92YXJfbmFtZTsJLyogZW5kIG9mIHZhciBuYW1lICsgMSAqLwotCQljb25zdCBjaGFyICpleHBhbnNpb247Ci0JCWNvbnN0IGNoYXIgKnZhbDsKLQkJc2l6ZV90IGw7Ci0KLQkJLyogZ3Vlc3MgdGhhdCB0aGUgZXhwYW5zaW9uIHdvbid0IGhhcHBlbiAqLwotCQlleHBhbnNpb24gPSBpbiAtIDE7Ci0JCWlmICgqaW4gPT0gJ3snKSB7Ci0JCSAgICArK2luOwotCQkgICAgc3RhcnRfb2ZfdmFyX25hbWUgPSBpbjsKLQkJICAgIGluID0gc3RyY2hyKGluLCAnfScpOwotCQkgICAgaWYgKGluID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsCi0JCQkJICAgIDAsIHIsICJNaXNzaW5nICd9JyBvbiB2YXJpYWJsZSBcIiVzXCIiLAotCQkJCSAgICBleHBhbnNpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgKm5leHQgPSAnXDAnOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0JCSAgICBlbmRfb2ZfdmFyX25hbWUgPSBpbjsKLQkJICAgICsraW47Ci0JCX0KLQkJZWxzZSB7Ci0JCSAgICBzdGFydF9vZl92YXJfbmFtZSA9IGluOwotCQkgICAgd2hpbGUgKGFwX2lzYWxudW0oKmluKSB8fCAqaW4gPT0gJ18nKSB7Ci0JCQkrK2luOwotCQkgICAgfQotCQkgICAgZW5kX29mX3Zhcl9uYW1lID0gaW47Ci0JCX0KLQkJLyogd2hhdCBhIHBhaW4sIHRvbyBiYWQgdGhlcmUncyBubyB0YWJsZV9nZXRuIHdoZXJlIHlvdSBjYW4KLQkJICogcGFzcyBhIG5vbi1udWwgdGVybWluYXRlZCBzdHJpbmcgKi8KLQkJbCA9IGVuZF9vZl92YXJfbmFtZSAtIHN0YXJ0X29mX3Zhcl9uYW1lOwotCQlpZiAobCAhPSAwKSB7Ci0JCSAgICBsID0gKGwgPiBzaXplb2YodmFyKSAtIDEpID8gKHNpemVvZih2YXIpIC0gMSkgOiBsOwotCQkgICAgbWVtY3B5KHZhciwgc3RhcnRfb2ZfdmFyX25hbWUsIGwpOwotCQkgICAgdmFyW2xdID0gJ1wwJzsKLQotCQkgICAgdmFsID0gYXBfdGFibGVfZ2V0KHItPnN1YnByb2Nlc3NfZW52LCB2YXIpOwotCQkgICAgaWYgKHZhbCkgewotCQkJZXhwYW5zaW9uID0gdmFsOwotCQkJbCA9IHN0cmxlbihleHBhbnNpb24pOwotCQkgICAgfQotCQkgICAgZWxzZSBpZiAobGVhdmVfbmFtZSkgewotCQkJbCA9IGluIC0gZXhwYW5zaW9uOwotCQkgICAgfQotCQkgICAgZWxzZSB7Ci0JCQlicmVhazsJLyogbm8gZXhwYW5zaW9uIHRvIGJlIGRvbmUgKi8KLQkJICAgIH0KLQkJfQotCQllbHNlIHsKLQkJICAgIC8qIHplcm8tbGVuZ3RoIHZhcmlhYmxlIG5hbWUgY2F1c2VzIGp1c3QgdGhlICQgdG8gYmUgY29waWVkICovCi0JCSAgICBsID0gMTsKLQkJfQotCQlsID0gKGwgPiBlbmRfb3V0IC0gbmV4dCkgPyAoZW5kX291dCAtIG5leHQpIDogbDsKLQkJbWVtY3B5KG5leHQsIGV4cGFuc2lvbiwgbCk7Ci0JCW5leHQgKz0gbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLQkgICAgaWYgKG5leHQgPT0gZW5kX291dCkgewotCQkvKiB0cnVuY2F0ZWQgKi8KLQkJKm5leHQgPSAnXDAnOwotCQlyZXR1cm47Ci0JICAgIH0KLSAgICAgICAgICAgICpuZXh0KysgPSBjaDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgICpuZXh0ID0gJ1wwJzsKLSAgICByZXR1cm47Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBY3Rpb24gaGFuZGxlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgaW50IGluY2x1ZGVfY2dpKGNoYXIgKnMsIHJlcXVlc3RfcmVjICpyKQotewotICAgIHJlcXVlc3RfcmVjICpyciA9IGFwX3N1Yl9yZXFfbG9va3VwX3VyaShzLCByKTsKLSAgICBpbnQgcnJfc3RhdHVzOwotCi0gICAgaWYgKHJyLT5zdGF0dXMgIT0gSFRUUF9PSykgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogTm8gaGFyZHdpcmVkIHBhdGggaW5mbyBvciBxdWVyeSBhbGxvd2VkICovCi0KLSAgICBpZiAoKHJyLT5wYXRoX2luZm8gJiYgcnItPnBhdGhfaW5mb1swXSkgfHwgcnItPmFyZ3MpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAocnItPmZpbmZvLnByb3RlY3Rpb24gPT0gMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogU2NyaXB0IGdldHMgcGFyYW1ldGVycyBvZiB0aGUgKmRvY3VtZW50KiwgZm9yIGJhY2sgY29tcGF0aWJpbGl0eSAqLwotCi0gICAgcnItPnBhdGhfaW5mbyA9IHItPnBhdGhfaW5mbzsgICAgICAgLyogaGFyZCB0byBnZXQgcmlnaHQ7IHNlZSBtb2RfY2dpLmMgKi8KLSAgICByci0+YXJncyA9IHItPmFyZ3M7Ci0KLSAgICAvKiBGb3JjZSBzdWJfcmVxIHRvIGJlIHRyZWF0ZWQgYXMgYSBDR0kgcmVxdWVzdCwgZXZlbiBpZiBvcmRpbmFyeQotICAgICAqIHR5cGluZyBydWxlcyB3b3VsZCBoYXZlIGNhbGxlZCBpdCBzb21ldGhpbmcgZWxzZS4KLSAgICAgKi8KLQotICAgIHJyLT5jb250ZW50X3R5cGUgPSBDR0lfTUFHSUNfVFlQRTsKLQotICAgIC8qIFJ1biBpdC4gKi8KLQotICAgIHJyX3N0YXR1cyA9IGFwX3J1bl9zdWJfcmVxKHJyKTsKLSAgICBpZiAoYXBfaXNfSFRUUF9SRURJUkVDVChycl9zdGF0dXMpKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKmxvY2F0aW9uID0gYXBfdGFibGVfZ2V0KHJyLT5oZWFkZXJzX291dCwgIkxvY2F0aW9uIik7Ci0gICAgICAgIGxvY2F0aW9uID0gYXBfZXNjYXBlX2h0bWwocnItPnBvb2wsIGxvY2F0aW9uKTsKLSAgICAgICAgYXBfcnZwdXRzKHIsICI8QSBIUkVGPVwiIiwgbG9jYXRpb24sICJcIj4iLCBsb2NhdGlvbiwgIjwvQT4iLCBOVUxMKTsKLSAgICB9Ci0KLSAgICBhcF9kZXN0cm95X3N1Yl9yZXEocnIpOwotICAgIGFwX2NoZGlyX2ZpbGUoci0+ZmlsZW5hbWUpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIGVuc3VyZSB0aGF0IHBhdGggaXMgcmVsYXRpdmUsIGFuZCBkb2VzIG5vdCBjb250YWluICIuLiIgZWxlbWVudHMKLSAqIGVuc2VudGlhbGx5IGVuc3VyZSB0aGF0IGl0IGRvZXMgbm90IG1hdGNoIHRoZSByZWdleDoKLSAqICheL3woXnwvKVwuXC4oL3wkKSkKLSAqIFhYWDogdGhpcyBuZWVkcyBvcyBhYnN0cmFjdGlvbi4uLiBjb25zaWRlciBjOi4uXGZvbyBpbiB3aW4zMgotICovCi1zdGF0aWMgaW50IGlzX29ubHlfYmVsb3coY29uc3QgY2hhciAqcGF0aCkKLXsKLSNpZmRlZiBIQVZFX0RSSVZFX0xFVFRFUlMKLSAgICBpZiAocGF0aFsxXSA9PSAnOicpCi0JcmV0dXJuIDA7Ci0jZW5kaWYKLSAgICBpZiAocGF0aFswXSA9PSAnLycpIHsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHBhdGhbMF0gPT0gJy4nICYmIHBhdGhbMV0gPT0gJy4nCi0JJiYgKHBhdGhbMl0gPT0gJ1wwJyB8fCBwYXRoWzJdID09ICcvJykpIHsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgd2hpbGUgKCpwYXRoKSB7Ci0JaWYgKCpwYXRoID09ICcvJyAmJiBwYXRoWzFdID09ICcuJyAmJiBwYXRoWzJdID09ICcuJwotCSAgICAmJiAocGF0aFszXSA9PSAnXDAnIHx8IHBhdGhbM10gPT0gJy8nKSkgewotCSAgICByZXR1cm4gMDsKLQl9Ci0JKytwYXRoOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBoYW5kbGVfaW5jbHVkZShhcF9maWxlX3QgKmluLCByZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqZXJyb3IsIGludCBub2V4ZWMpCi17Ci0gICAgY2hhciB0YWdbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgcGFyc2VkX3N0cmluZ1tNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciAqdGFnX3ZhbDsKLQotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmICghKHRhZ192YWwgPSBnZXRfdGFnKHItPnBvb2wsIGluLCB0YWcsIHNpemVvZih0YWcpLCAxKSkpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc3RyY21wKHRhZywgImZpbGUiKSB8fCAhc3RyY21wKHRhZywgInZpcnR1YWwiKSkgewotICAgICAgICAgICAgcmVxdWVzdF9yZWMgKnJyID0gTlVMTDsKLSAgICAgICAgICAgIGNoYXIgKmVycm9yX2ZtdCA9IE5VTEw7Ci0KLSAgICAgICAgICAgIHBhcnNlX3N0cmluZyhyLCB0YWdfdmFsLCBwYXJzZWRfc3RyaW5nLCBzaXplb2YocGFyc2VkX3N0cmluZyksIDApOwotICAgICAgICAgICAgaWYgKHRhZ1swXSA9PSAnZicpIHsKLSAgICAgICAgICAgICAgICAvKiBiZSBzYWZlOyBvbmx5IGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IG9yIGJlbG93IGFsbG93ZWQgKi8KLQkJaWYgKCFpc19vbmx5X2JlbG93KHBhcnNlZF9zdHJpbmcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yX2ZtdCA9ICJ1bmFibGUgdG8gaW5jbHVkZSBmaWxlIFwiJXNcIiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBwYXJzZWQgZmlsZSAlcyI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICByciA9IGFwX3N1Yl9yZXFfbG9va3VwX2ZpbGUocGFyc2VkX3N0cmluZywgcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcnIgPSBhcF9zdWJfcmVxX2xvb2t1cF91cmkocGFyc2VkX3N0cmluZywgcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZXJyb3JfZm10ICYmIHJyLT5zdGF0dXMgIT0gSFRUUF9PSykgewotICAgICAgICAgICAgICAgIGVycm9yX2ZtdCA9ICJ1bmFibGUgdG8gaW5jbHVkZSBcIiVzXCIgaW4gcGFyc2VkIGZpbGUgJXMiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWVycm9yX2ZtdCAmJiBub2V4ZWMgJiYgcnItPmNvbnRlbnRfdHlwZQotICAgICAgICAgICAgICAgICYmIChzdHJuY21wKHJyLT5jb250ZW50X3R5cGUsICJ0ZXh0LyIsIDUpKSkgewotICAgICAgICAgICAgICAgIGVycm9yX2ZtdCA9ICJ1bmFibGUgdG8gaW5jbHVkZSBwb3RlbnRpYWwgZXhlYyBcIiVzXCIgIgotICAgICAgICAgICAgICAgICAgICAiaW4gcGFyc2VkIGZpbGUgJXMiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVycm9yX2ZtdCA9PSBOVUxMKSB7Ci0JCS8qIHRyeSB0byBhdm9pZCByZWN1cnNpdmUgaW5jbHVkZXMuICBXZSBkbyB0aGlzIGJ5IHdhbGtpbmcKLQkJICogdXAgdGhlIHItPm1haW4gbGlzdCBvZiBzdWJyZXF1ZXN0cywgYW5kIGF0IGVhY2ggbGV2ZWwKLQkJICogd2Fsa2luZyBiYWNrIHRocm91Z2ggYW55IGludGVybmFsIHJlZGlyZWN0cy4gIEF0IGVhY2gKLQkJICogc3RlcCwgd2UgY29tcGFyZSB0aGUgZmlsZW5hbWVzIGFuZCB0aGUgVVJJcy4gIAotCQkgKgotCQkgKiBUaGUgZmlsZW5hbWUgY29tcGFyaXNvbiBjYXRjaGVzIGEgcmVjdXJzaXZlIGluY2x1ZGUKLQkJICogd2l0aCBhbiBldmVyLWNoYW5naW5nIFVSTCwgZWcuCi0JCSAqIDwhLS0jaW5jbHVkZSB2aXJ0dWFsPQotCQkgKiAgICAgICIkUkVRVUVTVF9VUkkvJFFVRVJZX1NUUklORz8kUVVFUllfU1RSSU5HL3giLS0+Ci0JCSAqIHdoaWNoLCBhbHRob3VnaCB0aGV5IHdvdWxkIGV2ZW50dWFsbHkgYmUgY2F1Z2h0IGJlY2F1c2UKLQkJICogd2UgaGF2ZSBhIGxpbWl0IG9uIHRoZSBsZW5ndGggb2YgZmlsZXMsIGV0Yy4sIGNhbiAKLQkJICogcmVjdXJzZSBmb3IgYSB3aGlsZS4KLQkJICoKLQkJICogVGhlIFVSSSBjb21wYXJpc29uIGNhdGNoZXMgdGhlIGNhc2Ugd2hlcmUgdGhlIGZpbGVuYW1lCi0JCSAqIGlzIGNoYW5nZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgcmVxdWVzdCwgc28gdGhlIAotCQkgKiBjdXJyZW50IG5hbWUgaXMgbmV2ZXIgdGhlIHNhbWUgYXMgYW55IHByZXZpb3VzIG9uZS4KLQkJICogVGhpcyBjYW4gaGFwcGVuIHdpdGggIkRvY3VtZW50Um9vdCAvZm9vIiB3aGVuIHlvdQotCQkgKiByZXF1ZXN0ICIvIiBvbiB0aGUgc2VydmVyIGFuZCBpdCBpbmNsdWRlcyAiLyIuCi0JCSAqIFRoaXMgb25seSBhcHBsaWVzIHRvIG1vZHVsZXMgc3VjaCBhcyBtb2RfZGlyIHRoYXQgCi0JCSAqIChzb21ld2hhdCBpbXByb3Blcmx5KSBtZXNzIHdpdGggci0+ZmlsZW5hbWUgb3V0c2lkZSAKLQkJICogb2YgYSBmaWxlbmFtZSB0cmFuc2xhdGlvbiBwaGFzZS4KLQkJICovCi0JCWludCBmb3VuZGR1cGUgPSAwOwotICAgICAgICAgICAgICAgIHJlcXVlc3RfcmVjICpwOwotICAgICAgICAgICAgICAgIGZvciAocCA9IHI7IHAgIT0gTlVMTCAmJiAhZm91bmRkdXBlOyBwID0gcC0+bWFpbikgewotCQkgICAgcmVxdWVzdF9yZWMgKnE7Ci0JCSAgICBmb3IgKHEgPSBwOyBxICE9IE5VTEw7IHEgPSBxLT5wcmV2KSB7Ci0JCQlpZiAoIChzdHJjbXAocS0+ZmlsZW5hbWUsIHJyLT5maWxlbmFtZSkgPT0gMCkgfHwKLQkJCSAgICAgKHN0cmNtcChxLT51cmksIHJyLT51cmkpID09IDApICl7Ci0JCQkgICAgZm91bmRkdXBlID0gMTsKLQkJCSAgICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQkJfQotCi0gICAgICAgICAgICAgICAgaWYgKHAgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBlcnJvcl9mbXQgPSAiUmVjdXJzaXZlIGluY2x1ZGUgb2YgXCIlc1wiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJpbiBwYXJzZWQgZmlsZSAlcyI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0JICAgIC8qIHNlZSB0aGUgS2x1ZGdlIGluIHNlbmRfcGFyc2VkX2ZpbGUgZm9yIHdoeSAqLwotCSAgICBpZiAocnIpIAotCQlhcF9zZXRfbW9kdWxlX2NvbmZpZyhyci0+cmVxdWVzdF9jb25maWcsICZpbmNsdWRlc19tb2R1bGUsIHIpOwotCi0gICAgICAgICAgICBpZiAoIWVycm9yX2ZtdCAmJiBhcF9ydW5fc3ViX3JlcShycikpIHsKLSAgICAgICAgICAgICAgICBlcnJvcl9mbXQgPSAidW5hYmxlIHRvIGluY2x1ZGUgXCIlc1wiIGluIHBhcnNlZCBmaWxlICVzIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFwX2NoZGlyX2ZpbGUoci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgaWYgKGVycm9yX2ZtdCkgewotICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsCi0JCQkgICAgMCwgciwgZXJyb3JfZm10LCB0YWdfdmFsLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgYXBfcnB1dHMoZXJyb3IsIHIpOwotICAgICAgICAgICAgfQotCi0JICAgIC8qIGRlc3Ryb3kgdGhlIHN1YiByZXF1ZXN0IGlmIGl0J3Mgbm90IGEgbmVzdGVkIGluY2x1ZGUgKi8KLSAgICAgICAgICAgIGlmIChyciAhPSBOVUxMCi0JCSYmIGFwX2dldF9tb2R1bGVfY29uZmlnKHJyLT5yZXF1ZXN0X2NvbmZpZywgJmluY2x1ZGVzX21vZHVsZSkKLQkJICAgICE9IE5FU1RFRF9JTkNMVURFX01BR0lDKSB7Ci0JCWFwX2Rlc3Ryb3lfc3ViX3JlcShycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh0YWcsICJkb25lIikpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHBhcmFtZXRlciBcIiVzXCIgdG8gdGFnIGluY2x1ZGUgaW4gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgdGFnLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICBhcF9ycHV0cyhlcnJvciwgcik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSNpZmRlZiBUUEYKLSAgICBUUEZfRk9SS19DSElMRCB0OwotI2VuZGlmCi0gICAgcmVxdWVzdF9yZWMgKnI7Ci0gICAgY2hhciAqczsKLX0gaW5jbHVkZV9jbWRfYXJnOwotCi0KLQotc3RhdGljIGFwX3N0YXR1c190IGJ1aWxkX2FyZ3ZfbGlzdChjaGFyICoqKmFyZ3YsIHJlcXVlc3RfcmVjICpyLCBhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgaW50IG51bXdvcmRzLCB4LCBpZHg7Ci0gICAgY2hhciAqdzsKLSAgICBjb25zdCBjaGFyICphcmdzID0gci0+YXJnczsKLQotICAgIGlmICghYXJncyB8fCAhYXJnc1swXSB8fCBzdHJjaHIoYXJncywgJz0nKSkgewotICAgICAgIG51bXdvcmRzID0gMTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIGNvdW50IHRoZSBudW1iZXIgb2Yga2V5d29yZHMgKi8KLSAgICAgICAgZm9yICh4ID0gMCwgbnVtd29yZHMgPSAxOyBhcmdzW3hdOyB4KyspIHsKLSAgICAgICAgICAgIGlmIChhcmdzW3hdID09ICcrJykgewotICAgICAgICAgICAgICAgICsrbnVtd29yZHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogRXZlcnl0aGluZyBpcyAtIDEgdG8gYWNjb3VudCBmb3IgdGhlIGZpcnN0IHBhcmFtZXRlciB3aGljaCBpcyB0aGUKLSAgICAgKiBwcm9ncmFtIG5hbWUuICBXZSBkaWRuJ3QgdXNlZCB0byBoYXZlIHRvIGRvIHRoaXMsIGJ1dCBBUFIgd2FudHMgaXQuCi0gICAgICovCi0gICAgaWYgKG51bXdvcmRzID4gQVBBQ0hFX0FSR19NQVggLSAxKSB7Ci0gICAgICAgIG51bXdvcmRzID0gQVBBQ0hFX0FSR19NQVggLSAxOwkvKiBUcnVuY2F0ZSBhcmdzIHRvIHByZXZlbnQgb3ZlcnJ1biAqLwotICAgIH0KLSAgICAqYXJndiA9IChjaGFyICoqKSBhcF9wYWxsb2MocCwgKG51bXdvcmRzICsgMikgKiBzaXplb2YoY2hhciAqKSk7Ci0gCi0gICAgZm9yICh4ID0gMSwgaWR4ID0gMTsgeCA8IG51bXdvcmRzOyB4KyspIHsKLSAgICAgICAgdyA9IGFwX2dldHdvcmRfbnVsbHMocCwgJmFyZ3MsICcrJyk7Ci0gICAgICAgIGFwX3VuZXNjYXBlX3VybCh3KTsKLSAgICAgICAgKCphcmd2KVtpZHgrK10gPSBhcF9lc2NhcGVfc2hlbGxfY21kKHAsIHcpOwotICAgIH0KLSAgICAoKmFyZ3YpW2lkeF0gPSBOVUxMOwotCi0gICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotfQotCi0KLQotc3RhdGljIGludCBpbmNsdWRlX2NtZChjaGFyICpzLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpbmNsdWRlX2NtZF9hcmcgYXJnOwotICAgIEJVRkYgKnNjcmlwdF9pbjsKLSAgICBhcF9wcm9jYXR0cl90ICpwcm9jYXR0cjsKLSAgICBhcF9wcm9jX3QgKnByb2NuZXc7Ci0gICAgYXBfc3RhdHVzX3QgcmM7Ci0gICAgYXBfdGFibGVfdCAqZW52ID0gci0+c3VicHJvY2Vzc19lbnY7Ci0gICAgY2hhciAqKmFyZ3Y7Ci0gICAgYXBfZmlsZV90ICpmaWxlID0gTlVMTDsKLSAgICBhcF9pb2wgKmlvbDsKLQotICAgIGFyZy5yID0gcjsKLSAgICBhcmcucyA9IHM7Ci0jaWZkZWYgVFBGCi0gICAgYXJnLnQuZmlsZW5hbWUgPSByLT5maWxlbmFtZTsKLSAgICBhcmcudC5zdWJwcm9jZXNzX2VudiA9IHItPnN1YnByb2Nlc3NfZW52OwotICAgIGFyZy50LnByb2dfdHlwZSA9IEZPUktfRklMRTsKLSNlbmRpZgotCi0gICAgaWYgKHItPnBhdGhfaW5mbyAmJiByLT5wYXRoX2luZm9bMF0gIT0gJ1wwJykgewotICAgICAgICByZXF1ZXN0X3JlYyAqcGFfcmVxOwotCi0gICAgICAgIGFwX3RhYmxlX3NldG4oZW52LCAiUEFUSF9JTkZPIiwgYXBfZXNjYXBlX3NoZWxsX2NtZChyLT5wb29sLCByLT5wYXRoX2luZm8pKTsKLQotICAgICAgICBwYV9yZXEgPSBhcF9zdWJfcmVxX2xvb2t1cF91cmkoYXBfZXNjYXBlX3VyaShyLT5wb29sLCByLT5wYXRoX2luZm8pLCByKTsKLSAgICAgICAgaWYgKHBhX3JlcS0+ZmlsZW5hbWUpIHsKLSAgICAgICAgICAgIGFwX3RhYmxlX3NldG4oZW52LCAiUEFUSF9UUkFOU0xBVEVEIiwKLSAgICAgICAgICAgICAgICAgICAgICBhcF9wc3RyY2F0KHItPnBvb2wsIHBhX3JlcS0+ZmlsZW5hbWUsIHBhX3JlcS0+cGF0aF9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHItPmFyZ3MpIHsKLSAgICAgICAgY2hhciAqYXJnX2NvcHkgPSBhcF9wc3RyZHVwKHItPnBvb2wsIHItPmFyZ3MpOwotCi0gICAgICAgIGFwX3RhYmxlX3NldG4oZW52LCAiUVVFUllfU1RSSU5HIiwgci0+YXJncyk7Ci0gICAgICAgIGFwX3VuZXNjYXBlX3VybChhcmdfY29weSk7Ci0gICAgICAgIGFwX3RhYmxlX3NldG4oZW52LCAiUVVFUllfU1RSSU5HX1VORVNDQVBFRCIsCi0gICAgICAgICAgICAgICAgICBhcF9lc2NhcGVfc2hlbGxfY21kKHItPnBvb2wsIGFyZ19jb3B5KSk7Ci0gICAgfQotCi0gICAgaWYgKChhcF9jcmVhdGVwcm9jYXR0cl9pbml0KCZwcm9jYXR0ciwgci0+cG9vbCkgIT0gQVBSX1NVQ0NFU1MpIHx8Ci0gICAgICAgIChhcF9zZXRwcm9jYXR0cl9pbyhwcm9jYXR0ciwgQVBSX05PX1BJUEUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBSX0ZVTExfQkxPQ0ssIEFQUl9OT19QSVBFKSAhPSBBUFJfU1VDQ0VTUykgfHwKLSAgICAgICAgKGFwX3NldHByb2NhdHRyX2Rpcihwcm9jYXR0ciwgYXBfbWFrZV9kaXJzdHJfcGFyZW50KHItPnBvb2wsIHItPmZpbGVuYW1lKSkgIT0gQVBSX1NVQ0NFU1MpIHx8Ci0gICAgICAgIChhcF9zZXRwcm9jYXR0cl9jbWR0eXBlKHByb2NhdHRyLCBBUFJfU0hFTExDTUQpICE9IEFQUl9TVUNDRVNTKSkgewotICAgICAgICAvKiBTb21ldGhpbmcgYmFkIGhhcHBlbmVkLCB0ZWxsIHRoZSB3b3JsZC4gKi8KLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHIsCi0gICAgICAgICAgICAiY291bGRuJ3QgaW5pdGlhbGl6ZSBwcm9jIGF0dHJpYnV0ZXM6ICVzICVzIiwgci0+ZmlsZW5hbWUsIHMpOwotICAgICAgICByYyA9ICFBUFJfU1VDQ0VTUzsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGJ1aWxkX2FyZ3ZfbGlzdCgmYXJndiwgciwgci0+cG9vbCk7Ci0gICAgICAgIGFyZ3ZbMF0gPSBhcF9wc3RyZHVwKHItPnBvb2wsIHMpOwotICAgICAgICByYyA9IGFwX2NyZWF0ZV9wcm9jZXNzKCZwcm9jbmV3LCBzLCBhcmd2LCBhcF9jcmVhdGVfZW52aXJvbm1lbnQoci0+cG9vbCwgZW52KSwgcHJvY2F0dHIsIHItPnBvb2wpOwotCi0gICAgICAgIGlmIChyYyAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICAgICAgLyogQmFkIHRoaW5ncyBoYXBwZW5lZC4gRXZlcnlvbmUgc2hvdWxkIGhhdmUgY2xlYW5lZCB1cC4gKi8KLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZG4ndCBjcmVhdGUgY2hpbGQgcHJvY2VzczogJWQ6ICVzIiwgcmMsIHMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXBfbm90ZV9zdWJwcm9jZXNzKHItPnBvb2wsIHByb2NuZXcsIGtpbGxfYWZ0ZXJfdGltZW91dCk7Ci0gICAgICAgICAgICAvKiBGaWxsIGluIEJVRkYgc3RydWN0dXJlIGZvciBwYXJlbnRzIHBpcGUgdG8gY2hpbGQncyBzdGRvdXQgKi8KLSAgICAgICAgICAgIGFwX2dldF9jaGlsZG91dCgmZmlsZSwgcHJvY25ldyk7Ci0gICAgICAgICAgICBpb2wgPSBhcF9jcmVhdGVfZmlsZV9pb2woZmlsZSk7Ci0gICAgICAgICAgICBpZiAoIWlvbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gQVBSX0VCQURGOwotICAgICAgICAgICAgc2NyaXB0X2luID0gYXBfYmNyZWF0ZShyLT5wb29sLCBCX1JEKTsKLSAgICAgICAgICAgIGFwX2JwdXNoX2lvbChzY3JpcHRfaW4sIGlvbCk7Ci0gICAgICAgICAgICBhcF9zZW5kX2ZiKHNjcmlwdF9pbiwgcik7Ci0gICAgICAgICAgICBhcF9iY2xvc2Uoc2NyaXB0X2luKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhhbmRsZV9leGVjKGFwX2ZpbGVfdCAqaW4sIHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICplcnJvcikKLXsKLSAgICBjaGFyIHRhZ1tNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciAqdGFnX3ZhbDsKLSAgICBjaGFyICpmaWxlID0gci0+ZmlsZW5hbWU7Ci0gICAgY2hhciBwYXJzZWRfc3RyaW5nW01BWF9TVFJJTkdfTEVOXTsKLQotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmICghKHRhZ192YWwgPSBnZXRfdGFnKHItPnBvb2wsIGluLCB0YWcsIHNpemVvZih0YWcpLCAxKSkpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc3RyY21wKHRhZywgImNtZCIpKSB7Ci0gICAgICAgICAgICBwYXJzZV9zdHJpbmcociwgdGFnX3ZhbCwgcGFyc2VkX3N0cmluZywgc2l6ZW9mKHBhcnNlZF9zdHJpbmcpLCAxKTsKLSAgICAgICAgICAgIGlmIChpbmNsdWRlX2NtZChwYXJzZWRfc3RyaW5nLCByKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4ZWN1dGlvbiBmYWlsdXJlIGZvciBwYXJhbWV0ZXIgXCIlc1wiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gdGFnIGV4ZWMgaW4gZmlsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgYXBfcnB1dHMoZXJyb3IsIHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoganVzdCBpbiBjYXNlIHNvbWUgc3Rvb2dlIGNoYW5nZWQgZGlyZWN0b3JpZXMgKi8KLSAgICAgICAgICAgIGFwX2NoZGlyX2ZpbGUoci0+ZmlsZW5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJjbXAodGFnLCAiY2dpIikpIHsKLSAgICAgICAgICAgIHBhcnNlX3N0cmluZyhyLCB0YWdfdmFsLCBwYXJzZWRfc3RyaW5nLCBzaXplb2YocGFyc2VkX3N0cmluZyksIDApOwotICAgICAgICAgICAgaWYgKGluY2x1ZGVfY2dpKHBhcnNlZF9zdHJpbmcsIHIpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBDR0kgcmVmIFwiJXNcIiBpbiAlcyIsIHRhZ192YWwsIGZpbGUpOwotICAgICAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFwX2NoZGlyX2ZpbGUoci0+ZmlsZW5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJjbXAodGFnLCAiZG9uZSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBwYXJhbWV0ZXIgXCIlc1wiIHRvIHRhZyBleGVjIGluICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhZywgZmlsZSk7Ci0gICAgICAgICAgICBhcF9ycHV0cyhlcnJvciwgcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotc3RhdGljIGludCBoYW5kbGVfZWNobyhhcF9maWxlX3QgKmluLCByZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqZXJyb3IpCi17Ci0gICAgY2hhciB0YWdbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgKnRhZ192YWw7Ci0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoISh0YWdfdmFsID0gZ2V0X3RhZyhyLT5wb29sLCBpbiwgdGFnLCBzaXplb2YodGFnKSwgMSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXN0cmNtcCh0YWcsICJ2YXIiKSkgewotICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsID0gYXBfdGFibGVfZ2V0KHItPnN1YnByb2Nlc3NfZW52LCB0YWdfdmFsKTsKLQotICAgICAgICAgICAgaWYgKHZhbCkgewotICAgICAgICAgICAgICAgIGFwX3JwdXRzKHZhbCwgcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBhcF9ycHV0cygiKG5vbmUpIiwgcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh0YWcsICJkb25lIikpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHBhcmFtZXRlciBcIiVzXCIgdG8gdGFnIGVjaG8gaW4gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgdGFnLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICBhcF9ycHV0cyhlcnJvciwgcik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLSNpZmRlZiBVU0VfUEVSTF9TU0kKLXN0YXRpYyBpbnQgaGFuZGxlX3BlcmwoYXBfZmlsZV90ICppbiwgcmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKmVycm9yKQotewotICAgIGNoYXIgdGFnW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyIHBhcnNlZF9zdHJpbmdbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgKnRhZ192YWw7Ci0gICAgU1YgKnN1YiA9IE51bGxzdjsKLSAgICBBViAqYXYgPSBuZXdBVigpOwotCi0gICAgaWYgKGFwX2FsbG93X29wdGlvbnMocikgJiBPUFRfSU5DTk9FWEVDKSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0JCSAgICAgICIjcGVybCBTU0kgZGlzYWxsb3dlZCBieSBJbmNsdWRlc05vRXhlYyBpbiAlcyIsCi0JCSAgICAgIHItPmZpbGVuYW1lKTsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoISh0YWdfdmFsID0gZ2V0X3RhZyhyLT5wb29sLCBpbiwgdGFnLCBzaXplb2YodGFnKSwgMSkpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RybkVRKHRhZywgInN1YiIsIDMpKSB7Ci0gICAgICAgICAgICBzdWIgPSBuZXdTVnB2KHRhZ192YWwsIDApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0cm5FUSh0YWcsICJhcmciLCAzKSkgewotICAgICAgICAgICAgcGFyc2Vfc3RyaW5nKHIsIHRhZ192YWwsIHBhcnNlZF9zdHJpbmcsIHNpemVvZihwYXJzZWRfc3RyaW5nKSwgMCk7Ci0gICAgICAgICAgICBhdl9wdXNoKGF2LCBuZXdTVnB2KHBhcnNlZF9zdHJpbmcsIDApKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJuRVEodGFnLCAiZG9uZSIsIDQpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBwZXJsX3N0ZG91dDJjbGllbnQocik7Ci0gICAgcGVybF9zZXR1cF9lbnYocik7Ci0gICAgcGVybF9jYWxsX2hhbmRsZXIoc3ViLCByLCBhdik7Ci0gICAgcmV0dXJuIE9LOwotfQotI2VuZGlmCi0KLS8qIGVycm9yIGFuZCB0ZiBtdXN0IHBvaW50IHRvIGEgc3RyaW5nIHdpdGggcm9vbSBmb3IgYXQgCi0gKiBsZWFzdCBNQVhfU1RSSU5HX0xFTiBjaGFyYWN0ZXJzIAotICovCi1zdGF0aWMgaW50IGhhbmRsZV9jb25maWcoYXBfZmlsZV90ICppbiwgcmVxdWVzdF9yZWMgKnIsIGNoYXIgKmVycm9yLCBjaGFyICp0ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNpemVmbXQpCi17Ci0gICAgY2hhciB0YWdbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgKnRhZ192YWw7Ci0gICAgY2hhciBwYXJzZWRfc3RyaW5nW01BWF9TVFJJTkdfTEVOXTsKLSAgICBhcF90YWJsZV90ICplbnYgPSByLT5zdWJwcm9jZXNzX2VudjsKLQotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmICghKHRhZ192YWwgPSBnZXRfdGFnKHItPnBvb2wsIGluLCB0YWcsIHNpemVvZih0YWcpLCAwKSkpIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc3RyY21wKHRhZywgImVycm1zZyIpKSB7Ci0gICAgICAgICAgICBwYXJzZV9zdHJpbmcociwgdGFnX3ZhbCwgZXJyb3IsIE1BWF9TVFJJTkdfTEVOLCAwKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghc3RyY21wKHRhZywgInRpbWVmbXQiKSkgewotICAgICAgICAgICAgYXBfdGltZV90IGRhdGUgPSByLT5yZXF1ZXN0X3RpbWU7Ci0KLSAgICAgICAgICAgIHBhcnNlX3N0cmluZyhyLCB0YWdfdmFsLCB0ZiwgTUFYX1NUUklOR19MRU4sIDApOwotICAgICAgICAgICAgYXBfdGFibGVfc2V0bihlbnYsICJEQVRFX0xPQ0FMIiwgYXBfaHRfdGltZShyLT5wb29sLCBkYXRlLCB0ZiwgMCkpOwotICAgICAgICAgICAgYXBfdGFibGVfc2V0bihlbnYsICJEQVRFX0dNVCIsIGFwX2h0X3RpbWUoci0+cG9vbCwgZGF0ZSwgdGYsIDEpKTsKLSAgICAgICAgICAgIGFwX3RhYmxlX3NldG4oZW52LCAiTEFTVF9NT0RJRklFRCIsCi0gICAgICAgICAgICAgICAgICAgICAgYXBfaHRfdGltZShyLT5wb29sLCByLT5maW5mby5tdGltZSwgdGYsIDApKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghc3RyY21wKHRhZywgInNpemVmbXQiKSkgewotICAgICAgICAgICAgcGFyc2Vfc3RyaW5nKHIsIHRhZ192YWwsIHBhcnNlZF9zdHJpbmcsIHNpemVvZihwYXJzZWRfc3RyaW5nKSwgMCk7Ci0gICAgICAgICAgICBkZWNvZGVodG1sKHBhcnNlZF9zdHJpbmcpOwotICAgICAgICAgICAgaWYgKCFzdHJjbXAocGFyc2VkX3N0cmluZywgImJ5dGVzIikpIHsKLSAgICAgICAgICAgICAgICAqc2l6ZWZtdCA9IFNJWkVGTVRfQllURVM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKHBhcnNlZF9zdHJpbmcsICJhYmJyZXYiKSkgewotICAgICAgICAgICAgICAgICpzaXplZm10ID0gU0laRUZNVF9LTUc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh0YWcsICJkb25lIikpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHBhcmFtZXRlciBcIiVzXCIgdG8gdGFnIGNvbmZpZyBpbiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICB0YWcsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCi1zdGF0aWMgaW50IGZpbmRfZmlsZShyZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqZGlyZWN0aXZlLCBjb25zdCBjaGFyICp0YWcsCi0gICAgICAgICAgICAgICAgICAgICBjaGFyICp0YWdfdmFsLCBhcF9maW5mb190ICpmaW5mbywgY29uc3QgY2hhciAqZXJyb3IpCi17Ci0gICAgY2hhciAqdG9fc2VuZCA9IHRhZ192YWw7Ci0gICAgcmVxdWVzdF9yZWMgKnJyID0gTlVMTDsKLSAgICBpbnQgcmV0PTA7Ci0gICAgY2hhciAqZXJyb3JfZm10ID0gTlVMTDsKLQotICAgIGlmICghc3RyY21wKHRhZywgImZpbGUiKSkgewotICAgICAgICAvKiBiZSBzYWZlOyBvbmx5IGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IG9yIGJlbG93IGFsbG93ZWQgKi8KLSAgICAgICAgaWYgKCFpc19vbmx5X2JlbG93KHRhZ192YWwpKSB7Ci0gICAgICAgICAgICBlcnJvcl9mbXQgPSAidW5hYmxlIHRvIGFjY2VzcyBmaWxlIFwiJXNcIiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiaW4gcGFyc2VkIGZpbGUgJXMiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXBfZ2V0cGFyZW50cyh0YWdfdmFsKTsgICAgLyogZ2V0IHJpZCBvZiBhbnkgbmFzdGllcyAqLwotICAgICAgICAgICAgcnIgPSBhcF9zdWJfcmVxX2xvb2t1cF9maWxlKHRhZ192YWwsIHIpOwotCi0gICAgICAgICAgICBpZiAocnItPnN0YXR1cyA9PSBIVFRQX09LICYmIHJyLT5maW5mby5wcm90ZWN0aW9uICE9IDApIHsKLSAgICAgICAgICAgICAgICB0b19zZW5kID0gcnItPmZpbGVuYW1lOwotICAgICAgICAgICAgICAgIGlmIChhcF9zdGF0KGZpbmZvLCB0b19zZW5kLCByci0+cG9vbCkgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JfZm10ID0gInVuYWJsZSB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgXCIlc1wiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJpbiBwYXJzZWQgZmlsZSAlcyI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JfZm10ID0gInVuYWJsZSB0byBsb29rdXAgaW5mb3JtYXRpb24gYWJvdXQgXCIlc1wiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gcGFyc2VkIGZpbGUgJXMiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVycm9yX2ZtdCkgewotICAgICAgICAgICAgcmV0ID0gLTE7Ci0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgMCwgciwgZXJyb3JfZm10LCB0b19zZW5kLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICBhcF9ycHV0cyhlcnJvciwgcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocnIpIGFwX2Rlc3Ryb3lfc3ViX3JlcShycik7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKHRhZywgInZpcnR1YWwiKSkgewotICAgICAgICByciA9IGFwX3N1Yl9yZXFfbG9va3VwX3VyaSh0YWdfdmFsLCByKTsKLQotICAgICAgICBpZiAocnItPnN0YXR1cyA9PSBIVFRQX09LICYmIHJyLT5maW5mby5wcm90ZWN0aW9uICE9IDApIHsKLSAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBmaW5mbywgKGNvbnN0IGNoYXIgKikgJnJyLT5maW5mbywKLSAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHN0YXQpKTsKLSAgICAgICAgICAgIGFwX2Rlc3Ryb3lfc3ViX3JlcShycik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCBcIiVzXCIgIgotICAgICAgICAgICAgICAgICAgICAgICAgImluIHBhcnNlZCBmaWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhZ192YWwsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgICAgIGFwX2Rlc3Ryb3lfc3ViX3JlcShycik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHBhcmFtZXRlciBcIiVzXCIgdG8gdGFnICVzIGluICVzIiwKLSAgICAgICAgICAgICAgICAgICAgdGFnLCBkaXJlY3RpdmUsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgYXBfcnB1dHMoZXJyb3IsIHIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotCi0KLXN0YXRpYyBpbnQgaGFuZGxlX2ZzaXplKGFwX2ZpbGVfdCAqaW4sIHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICplcnJvciwgaW50IHNpemVmbXQpCi17Ci0gICAgY2hhciB0YWdbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgKnRhZ192YWw7Ci0gICAgYXBfZmluZm9fdCBmaW5mbzsKLSAgICBjaGFyIHBhcnNlZF9zdHJpbmdbTUFYX1NUUklOR19MRU5dOwotCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKCEodGFnX3ZhbCA9IGdldF90YWcoci0+cG9vbCwgaW4sIHRhZywgc2l6ZW9mKHRhZyksIDEpKSkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh0YWcsICJkb25lIikpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcGFyc2Vfc3RyaW5nKHIsIHRhZ192YWwsIHBhcnNlZF9zdHJpbmcsIHNpemVvZihwYXJzZWRfc3RyaW5nKSwgMCk7Ci0gICAgICAgICAgICBpZiAoIWZpbmRfZmlsZShyLCAiZnNpemUiLCB0YWcsIHBhcnNlZF9zdHJpbmcsICZmaW5mbywgZXJyb3IpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNpemVmbXQgPT0gU0laRUZNVF9LTUcpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBfc2VuZF9zaXplKGZpbmZvLnNpemUsIHIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGwsIHg7Ci0jaWYgZGVmaW5lZChBUF9PRkZfVF9JU19RVUFEKQotICAgICAgICAgICAgICAgICAgICBhcF9zbnByaW50Zih0YWcsIHNpemVvZih0YWcpLCAiJXFkIiwgZmluZm8uc2l6ZSk7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICBhcF9zbnByaW50Zih0YWcsIHNpemVvZih0YWcpLCAiJWxkIiwgZmluZm8uc2l6ZSk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgbCA9IHN0cmxlbih0YWcpOyAgICAvKiBncnJyICovCi0gICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBsOyB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4ICYmICghKChsIC0geCkgJSAzKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0YygnLCcsIHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dGModGFnW3hdLCByKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIGludCBoYW5kbGVfZmxhc3Rtb2QoYXBfZmlsZV90ICppbiwgcmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKmVycm9yLCBjb25zdCBjaGFyICp0ZikKLXsKLSAgICBjaGFyIHRhZ1tNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciAqdGFnX3ZhbDsKLSAgICBhcF9maW5mb190IGZpbmZvOwotICAgIGNoYXIgcGFyc2VkX3N0cmluZ1tNQVhfU1RSSU5HX0xFTl07Ci0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoISh0YWdfdmFsID0gZ2V0X3RhZyhyLT5wb29sLCBpbiwgdGFnLCBzaXplb2YodGFnKSwgMSkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghc3RyY21wKHRhZywgImRvbmUiKSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwYXJzZV9zdHJpbmcociwgdGFnX3ZhbCwgcGFyc2VkX3N0cmluZywgc2l6ZW9mKHBhcnNlZF9zdHJpbmcpLCAwKTsKLSAgICAgICAgICAgIGlmICghZmluZF9maWxlKHIsICJmbGFzdG1vZCIsIHRhZywgcGFyc2VkX3N0cmluZywgJmZpbmZvLCBlcnJvcikpIHsKLSAgICAgICAgICAgICAgICBhcF9ycHV0cyhhcF9odF90aW1lKHItPnBvb2wsIGZpbmZvLm10aW1lLCB0ZiwgMCksIHIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IHJlX2NoZWNrKHJlcXVlc3RfcmVjICpyLCBjaGFyICpzdHJpbmcsIGNoYXIgKnJleHApCi17Ci0gICAgcmVnZXhfdCAqY29tcGlsZWQ7Ci0gICAgaW50IHJlZ2V4X2Vycm9yOwotCi0gICAgY29tcGlsZWQgPSBhcF9wcmVnY29tcChyLT5wb29sLCByZXhwLCBSRUdfRVhURU5ERUQgfCBSRUdfTk9TVUIpOwotICAgIGlmIChjb21waWxlZCA9PSBOVUxMKSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gY29tcGlsZSBwYXR0ZXJuIFwiJXNcIiIsIHJleHApOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHJlZ2V4X2Vycm9yID0gYXBfcmVnZXhlYyhjb21waWxlZCwgc3RyaW5nLCAwLCAocmVnbWF0Y2hfdCAqKSBOVUxMLCAwKTsKLSAgICBhcF9wcmVnZnJlZShyLT5wb29sLCBjb21waWxlZCk7Ci0gICAgcmV0dXJuICghcmVnZXhfZXJyb3IpOwotfQotCi1lbnVtIHRva2VuX3R5cGUgewotICAgIHRva2VuX3N0cmluZywKLSAgICB0b2tlbl9hbmQsIHRva2VuX29yLCB0b2tlbl9ub3QsIHRva2VuX2VxLCB0b2tlbl9uZSwKLSAgICB0b2tlbl9yYnJhY2UsIHRva2VuX2xicmFjZSwgdG9rZW5fZ3JvdXAsCi0gICAgdG9rZW5fZ2UsIHRva2VuX2xlLCB0b2tlbl9ndCwgdG9rZW5fbHQKLX07Ci1zdHJ1Y3QgdG9rZW4gewotICAgIGVudW0gdG9rZW5fdHlwZSB0eXBlOwotICAgIGNoYXIgdmFsdWVbTUFYX1NUUklOR19MRU5dOwotfTsKLQotLyogdGhlcmUgaXMgYW4gaW1wbGljaXQgYXNzdW1wdGlvbiBoZXJlIHRoYXQgc3RyaW5nIGlzIGF0IG1vc3QgTUFYX1NUUklOR19MRU4tMQotICogY2hhcmFjdGVycyBsb25nLi4uCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpnZXRfcHRva2VuKHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICpzdHJpbmcsIHN0cnVjdCB0b2tlbiAqdG9rZW4pCi17Ci0gICAgY2hhciBjaDsKLSAgICBpbnQgbmV4dCA9IDA7Ci0gICAgaW50IHFzID0gMDsKLQotICAgIC8qIFNraXAgbGVhZGluZyB3aGl0ZSBzcGFjZSAqLwotICAgIGlmIChzdHJpbmcgPT0gKGNoYXIgKikgTlVMTCkgewotICAgICAgICByZXR1cm4gKGNoYXIgKikgTlVMTDsKLSAgICB9Ci0gICAgd2hpbGUgKChjaCA9ICpzdHJpbmcrKykpIHsKLSAgICAgICAgaWYgKCFhcF9pc3NwYWNlKGNoKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGNoID09ICdcMCcpIHsKLSAgICAgICAgcmV0dXJuIChjaGFyICopIE5VTEw7Ci0gICAgfQotCi0gICAgdG9rZW4tPnR5cGUgPSB0b2tlbl9zdHJpbmc7IC8qIHRoZSBkZWZhdWx0IHR5cGUgKi8KLSAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgY2FzZSAnKCc6Ci0gICAgICAgIHRva2VuLT50eXBlID0gdG9rZW5fbGJyYWNlOwotICAgICAgICByZXR1cm4gKHN0cmluZyk7Ci0gICAgY2FzZSAnKSc6Ci0gICAgICAgIHRva2VuLT50eXBlID0gdG9rZW5fcmJyYWNlOwotICAgICAgICByZXR1cm4gKHN0cmluZyk7Ci0gICAgY2FzZSAnPSc6Ci0gICAgICAgIHRva2VuLT50eXBlID0gdG9rZW5fZXE7Ci0gICAgICAgIHJldHVybiAoc3RyaW5nKTsKLSAgICBjYXNlICchJzoKLSAgICAgICAgaWYgKCpzdHJpbmcgPT0gJz0nKSB7Ci0gICAgICAgICAgICB0b2tlbi0+dHlwZSA9IHRva2VuX25lOwotICAgICAgICAgICAgcmV0dXJuIChzdHJpbmcgKyAxKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRva2VuLT50eXBlID0gdG9rZW5fbm90OwotICAgICAgICAgICAgcmV0dXJuIChzdHJpbmcpOwotICAgICAgICB9Ci0gICAgY2FzZSAnXCcnOgotICAgICAgICB0b2tlbi0+dHlwZSA9IHRva2VuX3N0cmluZzsKLSAgICAgICAgcXMgPSAxOwotICAgICAgICBicmVhazsKLSAgICBjYXNlICd8JzoKLSAgICAgICAgaWYgKCpzdHJpbmcgPT0gJ3wnKSB7Ci0gICAgICAgICAgICB0b2tlbi0+dHlwZSA9IHRva2VuX29yOwotICAgICAgICAgICAgcmV0dXJuIChzdHJpbmcgKyAxKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlICcmJzoKLSAgICAgICAgaWYgKCpzdHJpbmcgPT0gJyYnKSB7Ci0gICAgICAgICAgICB0b2tlbi0+dHlwZSA9IHRva2VuX2FuZDsKLSAgICAgICAgICAgIHJldHVybiAoc3RyaW5nICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnPic6Ci0gICAgICAgIGlmICgqc3RyaW5nID09ICc9JykgewotICAgICAgICAgICAgdG9rZW4tPnR5cGUgPSB0b2tlbl9nZTsKLSAgICAgICAgICAgIHJldHVybiAoc3RyaW5nICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0b2tlbi0+dHlwZSA9IHRva2VuX2d0OwotICAgICAgICAgICAgcmV0dXJuIChzdHJpbmcpOwotICAgICAgICB9Ci0gICAgY2FzZSAnPCc6Ci0gICAgICAgIGlmICgqc3RyaW5nID09ICc9JykgewotICAgICAgICAgICAgdG9rZW4tPnR5cGUgPSB0b2tlbl9sZTsKLSAgICAgICAgICAgIHJldHVybiAoc3RyaW5nICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0b2tlbi0+dHlwZSA9IHRva2VuX2x0OwotICAgICAgICAgICAgcmV0dXJuIChzdHJpbmcpOwotICAgICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgdG9rZW4tPnR5cGUgPSB0b2tlbl9zdHJpbmc7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAvKiBXZSBzaG91bGQgb25seSBiZSBoZXJlIGlmIHdlIGFyZSBpbiBhIHN0cmluZyAqLwotICAgIGlmICghcXMpIHsKLSAgICAgICAgdG9rZW4tPnZhbHVlW25leHQrK10gPSBjaDsKLSAgICB9Ci0KLSAgICAvKiAKLSAgICAgKiBZZXMgSSBrbm93IHRoYXQgZ290bydzIGFyZSBCQUQuICBCdXQsIGMgZG9lc24ndCBhbGxvdyBtZSB0bwotICAgICAqIGV4aXQgYSBsb29wIGZyb20gYSBzd2l0Y2ggc3RhdGVtZW50LiAgWWVzLCBJIGNvdWxkIHVzZSBhIGZsYWcsCi0gICAgICogYnV0IHRoYXQgaXMgKElNSE8pIGV2ZW4gbGVzcyByZWFkYWJsZS9tYWludGFpbmFibGUgdGhhbiB0aGUgZ290by4KLSAgICAgKi8KLSAgICAvKiAKLSAgICAgKiBJIHVzZWQgdGhlICsrc3RyaW5nIHRocm91Z2hvdXQgdGhpcyBzZWN0aW9uIHNvIHRoYXQgc3RyaW5nCi0gICAgICogZW5kcyB1cCBwb2ludGluZyB0byB0aGUgbmV4dCB0b2tlbiBhbmQgSSBjYW4ganVzdCByZXR1cm4gaXQKLSAgICAgKi8KLSAgICBmb3IgKGNoID0gKnN0cmluZzsgY2ggIT0gJ1wwJzsgY2ggPSAqKytzdHJpbmcpIHsKLSAgICAgICAgaWYgKGNoID09ICdcXCcpIHsKLSAgICAgICAgICAgIGlmICgoY2ggPSAqKytzdHJpbmcpID09ICdcMCcpIHsKLSAgICAgICAgICAgICAgICBnb3RvIFRPS0VOX0RPTkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0b2tlbi0+dmFsdWVbbmV4dCsrXSA9IGNoOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFxcykgewotICAgICAgICAgICAgaWYgKGFwX2lzc3BhY2UoY2gpKSB7Ci0gICAgICAgICAgICAgICAgZ290byBUT0tFTl9ET05FOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgICAgY2FzZSAnKCc6Ci0gICAgICAgICAgICAgICAgZ290byBUT0tFTl9ET05FOwotICAgICAgICAgICAgY2FzZSAnKSc6Ci0gICAgICAgICAgICAgICAgZ290byBUT0tFTl9ET05FOwotICAgICAgICAgICAgY2FzZSAnPSc6Ci0gICAgICAgICAgICAgICAgZ290byBUT0tFTl9ET05FOwotICAgICAgICAgICAgY2FzZSAnISc6Ci0gICAgICAgICAgICAgICAgZ290byBUT0tFTl9ET05FOwotICAgICAgICAgICAgY2FzZSAnfCc6Ci0gICAgICAgICAgICAgICAgaWYgKCooc3RyaW5nICsgMSkgPT0gJ3wnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gVE9LRU5fRE9ORTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICcmJzoKLSAgICAgICAgICAgICAgICBpZiAoKihzdHJpbmcgKyAxKSA9PSAnJicpIHsKLSAgICAgICAgICAgICAgICAgICAgZ290byBUT0tFTl9ET05FOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJzwnOgotICAgICAgICAgICAgICAgIGdvdG8gVE9LRU5fRE9ORTsKLSAgICAgICAgICAgIGNhc2UgJz4nOgotICAgICAgICAgICAgICAgIGdvdG8gVE9LRU5fRE9ORTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRva2VuLT52YWx1ZVtuZXh0KytdID0gY2g7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJ1wnJykgewotICAgICAgICAgICAgICAgIHFzID0gMDsKLSAgICAgICAgICAgICAgICArK3N0cmluZzsKLSAgICAgICAgICAgICAgICBnb3RvIFRPS0VOX0RPTkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0b2tlbi0+dmFsdWVbbmV4dCsrXSA9IGNoOwotICAgICAgICB9Ci0gICAgfQotICBUT0tFTl9ET05FOgotICAgIC8qIElmIHFzIGlzIHN0aWxsIHNldCwgSSBoYXZlIGFuIHVubWF0Y2hlZCAnICovCi0gICAgaWYgKHFzKSB7Ci0gICAgICAgIGFwX3JwdXRzKCJcblVubWF0Y2hlZCAnXG4iLCByKTsKLSAgICAgICAgbmV4dCA9IDA7Ci0gICAgfQotICAgIHRva2VuLT52YWx1ZVtuZXh0XSA9ICdcMCc7Ci0gICAgcmV0dXJuIChzdHJpbmcpOwotfQotCi0KLS8qCi0gKiBIZXkgSSBzdGlsbCBrbm93IHRoYXQgZ290bydzIGFyZSBCQUQuICBJIGRvbid0IHRoaW5rIHRoYXQgSSd2ZSBldmVyCi0gKiB1c2VkIHR3byBpbiB0aGUgc2FtZSBwcm9qZWN0LCBsZXQgYWxvbmUgdGhlIHNhbWUgZmlsZSBiZWZvcmUuICBCdXQsCi0gKiBJIGFic29sdXRlbHkgd2FudCB0byBtYWtlIHN1cmUgdGhhdCBJIGNsZWFuIHVwIHRoZSBtZW1vcnkgaW4gYWxsCi0gKiBjYXNlcy4gIEFuZCwgd2l0aG91dCByZXdyaXRpbmcgdGhpcyBjb21wbGV0ZWx5LCB0aGUgZWFzaWVzdCB3YXkKLSAqIGlzIHRvIGp1c3QgYnJhbmNoIHRvIHRoZSByZXR1cm4gY29kZSB3aGljaCBjbGVhbnMgaXQgdXAuCi0gKi8KLS8qIHRoZXJlIGlzIGFuIGltcGxpY2l0IGFzc3VtcHRpb24gaGVyZSB0aGF0IGV4cHIgaXMgYXQgbW9zdCBNQVhfU1RSSU5HX0xFTi0xCi0gKiBjaGFyYWN0ZXJzIGxvbmcuLi4KLSAqLwotc3RhdGljIGludCBwYXJzZV9leHByKHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICpleHByLCBjb25zdCBjaGFyICplcnJvcikKLXsKLSAgICBzdHJ1Y3QgcGFyc2Vfbm9kZSB7Ci0gICAgICAgIHN0cnVjdCBwYXJzZV9ub2RlICpsZWZ0LCAqcmlnaHQsICpwYXJlbnQ7Ci0gICAgICAgIHN0cnVjdCB0b2tlbiB0b2tlbjsKLSAgICAgICAgaW50IHZhbHVlLCBkb25lOwotICAgIH0gICAgICAgICAqcm9vdCwgKmN1cnJlbnQsICpuZXc7Ci0gICAgY29uc3QgY2hhciAqcGFyc2U7Ci0gICAgY2hhciBidWZmZXJbTUFYX1NUUklOR19MRU5dOwotICAgIGFwX2NvbnRleHRfdCAqZXhwcl9wb29sOwotICAgIGludCByZXR2YWwgPSAwOwotCi0gICAgaWYgKChwYXJzZSA9IGV4cHIpID09IChjaGFyICopIE5VTEwpIHsKLSAgICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci0gICAgcm9vdCA9IGN1cnJlbnQgPSAoc3RydWN0IHBhcnNlX25vZGUgKikgTlVMTDsKLSAgICBpZiAoYXBfY3JlYXRlX2NvbnRleHQoJmV4cHJfcG9vbCwgci0+cG9vbCkgIT0gQVBSX1NVQ0NFU1MpCi0JCXJldHVybiAwOwotCi0gICAgLyogQ3JlYXRlIFBhcnNlIFRyZWUgKi8KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBuZXcgPSAoc3RydWN0IHBhcnNlX25vZGUgKikgYXBfcGFsbG9jKGV4cHJfcG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHBhcnNlX25vZGUpKTsKLSAgICAgICAgbmV3LT5wYXJlbnQgPSBuZXctPmxlZnQgPSBuZXctPnJpZ2h0ID0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEw7Ci0gICAgICAgIG5ldy0+ZG9uZSA9IDA7Ci0gICAgICAgIGlmICgocGFyc2UgPSBnZXRfcHRva2VuKHIsIHBhcnNlLCAmbmV3LT50b2tlbikpID09IChjaGFyICopIE5VTEwpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAobmV3LT50b2tlbi50eXBlKSB7Ci0KLSAgICAgICAgY2FzZSB0b2tlbl9zdHJpbmc6Ci0jaWZkZWYgREVCVUdfSU5DTFVERQotICAgICAgICAgICAgYXBfcnZwdXRzKHIsICIgICAgIFRva2VuOiBzdHJpbmcgKCIsIG5ldy0+dG9rZW4udmFsdWUsICIpXG4iLCBOVUxMKTsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEwpIHsKLSAgICAgICAgICAgICAgICByb290ID0gY3VycmVudCA9IG5ldzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoY3VycmVudC0+dG9rZW4udHlwZSkgewotICAgICAgICAgICAgY2FzZSB0b2tlbl9zdHJpbmc6Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnRva2VuLnZhbHVlWzBdICE9ICdcMCcpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RybmNhdChjdXJyZW50LT50b2tlbi52YWx1ZSwgIiAiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjdXJyZW50LT50b2tlbi52YWx1ZSkKLQkJCSAgICAtIHN0cmxlbihjdXJyZW50LT50b2tlbi52YWx1ZSkgLSAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RybmNhdChjdXJyZW50LT50b2tlbi52YWx1ZSwgbmV3LT50b2tlbi52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY3VycmVudC0+dG9rZW4udmFsdWUpCi0JCQkgICAgLSBzdHJsZW4oY3VycmVudC0+dG9rZW4udmFsdWUpIC0gMSk7Ci0JCWN1cnJlbnQtPnRva2VuLnZhbHVlW3NpemVvZihjdXJyZW50LT50b2tlbi52YWx1ZSkgLSAxXSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIHRva2VuX2VxOgotICAgICAgICAgICAgY2FzZSB0b2tlbl9uZToKLSAgICAgICAgICAgIGNhc2UgdG9rZW5fYW5kOgotICAgICAgICAgICAgY2FzZSB0b2tlbl9vcjoKLSAgICAgICAgICAgIGNhc2UgdG9rZW5fbGJyYWNlOgotICAgICAgICAgICAgY2FzZSB0b2tlbl9ub3Q6Ci0gICAgICAgICAgICBjYXNlIHRva2VuX2dlOgotICAgICAgICAgICAgY2FzZSB0b2tlbl9ndDoKLSAgICAgICAgICAgIGNhc2UgdG9rZW5fbGU6Ci0gICAgICAgICAgICBjYXNlIHRva2VuX2x0OgotICAgICAgICAgICAgICAgIG5ldy0+cGFyZW50ID0gY3VycmVudDsKLSAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+cmlnaHQgPSBuZXc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZXhwcmVzc2lvbiBcIiVzXCIgaW4gZmlsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciwgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgICAgICAgICBnb3RvIFJFVFVSTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgdG9rZW5fYW5kOgotICAgICAgICBjYXNlIHRva2VuX29yOgotI2lmZGVmIERFQlVHX0lOQ0xVREUKLSAgICAgICAgICAgIGFwX3JwdXRzKCIgICAgIFRva2VuOiBhbmQvb3JcbiIsIHIpOwotI2VuZGlmCi0gICAgICAgICAgICBpZiAoY3VycmVudCA9PSAoc3RydWN0IHBhcnNlX25vZGUgKikgTlVMTCkgewotICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZXhwcmVzc2lvbiBcIiVzXCIgaW4gZmlsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciwgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgICAgICAgICBnb3RvIFJFVFVSTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFBlcmNvbGF0ZSB1cHdhcmRzICovCi0gICAgICAgICAgICB3aGlsZSAoY3VycmVudCAhPSAoc3RydWN0IHBhcnNlX25vZGUgKikgTlVMTCkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoY3VycmVudC0+dG9rZW4udHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fc3RyaW5nOgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fZ3JvdXA6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9ub3Q6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9lcToKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX25lOgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fYW5kOgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fb3I6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9nZToKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX2d0OgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fbGU6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9sdDoKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPnBhcmVudDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9sYnJhY2U6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGV4cHJlc3Npb24gXCIlc1wiIGluIGZpbGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBSRVRVUk47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEwpIHsKLSAgICAgICAgICAgICAgICBuZXctPmxlZnQgPSByb290OwotICAgICAgICAgICAgICAgIG5ldy0+bGVmdC0+cGFyZW50ID0gbmV3OwotICAgICAgICAgICAgICAgIG5ldy0+cGFyZW50ID0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEw7Ci0gICAgICAgICAgICAgICAgcm9vdCA9IG5ldzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIG5ldy0+bGVmdCA9IGN1cnJlbnQtPnJpZ2h0OwotICAgICAgICAgICAgICAgIGN1cnJlbnQtPnJpZ2h0ID0gbmV3OwotICAgICAgICAgICAgICAgIG5ldy0+cGFyZW50ID0gY3VycmVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGN1cnJlbnQgPSBuZXc7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHRva2VuX25vdDoKLSNpZmRlZiBERUJVR19JTkNMVURFCi0gICAgICAgICAgICBhcF9ycHV0cygiICAgICBUb2tlbjogbm90XG4iLCByKTsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEwpIHsKLSAgICAgICAgICAgICAgICByb290ID0gY3VycmVudCA9IG5ldzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFBlcmNvbGF0ZSB1cHdhcmRzICovCi0gICAgICAgICAgICB3aGlsZSAoY3VycmVudCAhPSAoc3RydWN0IHBhcnNlX25vZGUgKikgTlVMTCkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoY3VycmVudC0+dG9rZW4udHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fbm90OgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fZXE6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9uZToKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX2FuZDoKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX29yOgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fbGJyYWNlOgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fZ2U6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9ndDoKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX2xlOgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fbHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGV4cHJlc3Npb24gXCIlc1wiIGluIGZpbGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBSRVRVUk47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEwpIHsKLSAgICAgICAgICAgICAgICBuZXctPmxlZnQgPSByb290OwotICAgICAgICAgICAgICAgIG5ldy0+bGVmdC0+cGFyZW50ID0gbmV3OwotICAgICAgICAgICAgICAgIG5ldy0+cGFyZW50ID0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEw7Ci0gICAgICAgICAgICAgICAgcm9vdCA9IG5ldzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIG5ldy0+bGVmdCA9IGN1cnJlbnQtPnJpZ2h0OwotICAgICAgICAgICAgICAgIGN1cnJlbnQtPnJpZ2h0ID0gbmV3OwotICAgICAgICAgICAgICAgIG5ldy0+cGFyZW50ID0gY3VycmVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGN1cnJlbnQgPSBuZXc7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHRva2VuX2VxOgotICAgICAgICBjYXNlIHRva2VuX25lOgotICAgICAgICBjYXNlIHRva2VuX2dlOgotICAgICAgICBjYXNlIHRva2VuX2d0OgotICAgICAgICBjYXNlIHRva2VuX2xlOgotICAgICAgICBjYXNlIHRva2VuX2x0OgotI2lmZGVmIERFQlVHX0lOQ0xVREUKLSAgICAgICAgICAgIGFwX3JwdXRzKCIgICAgIFRva2VuOiBlcS9uZS9nZS9ndC9sZS9sdFxuIiwgcik7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmIChjdXJyZW50ID09IChzdHJ1Y3QgcGFyc2Vfbm9kZSAqKSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBleHByZXNzaW9uIFwiJXNcIiBpbiBmaWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgYXBfcnB1dHMoZXJyb3IsIHIpOwotICAgICAgICAgICAgICAgIGdvdG8gUkVUVVJOOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogUGVyY29sYXRlIHVwd2FyZHMgKi8KLSAgICAgICAgICAgIHdoaWxlIChjdXJyZW50ICE9IChzdHJ1Y3QgcGFyc2Vfbm9kZSAqKSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50LT50b2tlbi50eXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9zdHJpbmc6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9ncm91cDoKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPnBhcmVudDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9sYnJhY2U6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9hbmQ6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9vcjoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9ub3Q6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9lcToKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX25lOgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fZ2U6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9ndDoKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX2xlOgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fbHQ6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZXhwcmVzc2lvbiBcIiVzXCIgaW4gZmlsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoZXJyb3IsIHIpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIFJFVFVSTjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY3VycmVudCA9PSAoc3RydWN0IHBhcnNlX25vZGUgKikgTlVMTCkgewotICAgICAgICAgICAgICAgIG5ldy0+bGVmdCA9IHJvb3Q7Ci0gICAgICAgICAgICAgICAgbmV3LT5sZWZ0LT5wYXJlbnQgPSBuZXc7Ci0gICAgICAgICAgICAgICAgbmV3LT5wYXJlbnQgPSAoc3RydWN0IHBhcnNlX25vZGUgKikgTlVMTDsKLSAgICAgICAgICAgICAgICByb290ID0gbmV3OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbmV3LT5sZWZ0ID0gY3VycmVudC0+cmlnaHQ7Ci0gICAgICAgICAgICAgICAgY3VycmVudC0+cmlnaHQgPSBuZXc7Ci0gICAgICAgICAgICAgICAgbmV3LT5wYXJlbnQgPSBjdXJyZW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3VycmVudCA9IG5ldzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgdG9rZW5fcmJyYWNlOgotI2lmZGVmIERFQlVHX0lOQ0xVREUKLSAgICAgICAgICAgIGFwX3JwdXRzKCIgICAgIFRva2VuOiByYnJhY2VcbiIsIHIpOwotI2VuZGlmCi0gICAgICAgICAgICB3aGlsZSAoY3VycmVudCAhPSAoc3RydWN0IHBhcnNlX25vZGUgKikgTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LT50b2tlbi50eXBlID09IHRva2VuX2xicmFjZSkgewotICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50b2tlbi50eXBlID0gdG9rZW5fZ3JvdXA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+cGFyZW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEwpIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbm1hdGNoZWQgJyknIGluIFwiJXNcIiBpbiBmaWxlICVzIiwKLQkJCSAgICBleHByLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgYXBfcnB1dHMoZXJyb3IsIHIpOwotICAgICAgICAgICAgICAgIGdvdG8gUkVUVVJOOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSB0b2tlbl9sYnJhY2U6Ci0jaWZkZWYgREVCVUdfSU5DTFVERQotICAgICAgICAgICAgYXBfcnB1dHMoIiAgICAgVG9rZW46IGxicmFjZVxuIiwgcik7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmIChjdXJyZW50ID09IChzdHJ1Y3QgcGFyc2Vfbm9kZSAqKSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcm9vdCA9IGN1cnJlbnQgPSBuZXc7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBQZXJjb2xhdGUgdXB3YXJkcyAqLwotICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQgIT0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGN1cnJlbnQtPnRva2VuLnR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX25vdDoKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX2VxOgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fbmU6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9hbmQ6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9vcjoKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX2xicmFjZToKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX2dlOgotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fZ3Q6Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9sZToKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX2x0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX3N0cmluZzoKLSAgICAgICAgICAgICAgICBjYXNlIHRva2VuX2dyb3VwOgotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGV4cHJlc3Npb24gXCIlc1wiIGluIGZpbGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBSRVRVUk47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEwpIHsKLSAgICAgICAgICAgICAgICBuZXctPmxlZnQgPSByb290OwotICAgICAgICAgICAgICAgIG5ldy0+bGVmdC0+cGFyZW50ID0gbmV3OwotICAgICAgICAgICAgICAgIG5ldy0+cGFyZW50ID0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEw7Ci0gICAgICAgICAgICAgICAgcm9vdCA9IG5ldzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIG5ldy0+bGVmdCA9IGN1cnJlbnQtPnJpZ2h0OwotICAgICAgICAgICAgICAgIGN1cnJlbnQtPnJpZ2h0ID0gbmV3OwotICAgICAgICAgICAgICAgIG5ldy0+cGFyZW50ID0gY3VycmVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGN1cnJlbnQgPSBuZXc7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogRXZhbHVhdGUgUGFyc2UgVHJlZSAqLwotICAgIGN1cnJlbnQgPSByb290OwotICAgIHdoaWxlIChjdXJyZW50ICE9IChzdHJ1Y3QgcGFyc2Vfbm9kZSAqKSBOVUxMKSB7Ci0gICAgICAgIHN3aXRjaCAoY3VycmVudC0+dG9rZW4udHlwZSkgewotICAgICAgICBjYXNlIHRva2VuX3N0cmluZzoKLSNpZmRlZiBERUJVR19JTkNMVURFCi0gICAgICAgICAgICBhcF9ycHV0cygiICAgICBFdmFsdWF0ZSBzdHJpbmdcbiIsIHIpOwotI2VuZGlmCi0gICAgICAgICAgICBwYXJzZV9zdHJpbmcociwgY3VycmVudC0+dG9rZW4udmFsdWUsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIDApOwotCSAgICBhcF9jcHlzdHJuKGN1cnJlbnQtPnRva2VuLnZhbHVlLCBidWZmZXIsIHNpemVvZihjdXJyZW50LT50b2tlbi52YWx1ZSkpOwotICAgICAgICAgICAgY3VycmVudC0+dmFsdWUgPSAoY3VycmVudC0+dG9rZW4udmFsdWVbMF0gIT0gJ1wwJyk7Ci0gICAgICAgICAgICBjdXJyZW50LT5kb25lID0gMTsKLSAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5wYXJlbnQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHRva2VuX2FuZDoKLSAgICAgICAgY2FzZSB0b2tlbl9vcjoKLSNpZmRlZiBERUJVR19JTkNMVURFCi0gICAgICAgICAgICBhcF9ycHV0cygiICAgICBFdmFsdWF0ZSBhbmQvb3JcbiIsIHIpOwotI2VuZGlmCi0gICAgICAgICAgICBpZiAoY3VycmVudC0+bGVmdCA9PSAoc3RydWN0IHBhcnNlX25vZGUgKikgTlVMTCB8fAotICAgICAgICAgICAgICAgIGN1cnJlbnQtPnJpZ2h0ID09IChzdHJ1Y3QgcGFyc2Vfbm9kZSAqKSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBleHByZXNzaW9uIFwiJXNcIiBpbiBmaWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgYXBfcnB1dHMoZXJyb3IsIHIpOwotICAgICAgICAgICAgICAgIGdvdG8gUkVUVVJOOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFjdXJyZW50LT5sZWZ0LT5kb25lKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50LT5sZWZ0LT50b2tlbi50eXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSB0b2tlbl9zdHJpbmc6Ci0gICAgICAgICAgICAgICAgICAgIHBhcnNlX3N0cmluZyhyLCBjdXJyZW50LT5sZWZ0LT50b2tlbi52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIDApOwotICAgICAgICAgICAgICAgICAgICBhcF9jcHlzdHJuKGN1cnJlbnQtPmxlZnQtPnRva2VuLnZhbHVlLCBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGN1cnJlbnQtPmxlZnQtPnRva2VuLnZhbHVlKSk7Ci0JCSAgICBjdXJyZW50LT5sZWZ0LT52YWx1ZSA9IChjdXJyZW50LT5sZWZ0LT50b2tlbi52YWx1ZVswXSAhPSAnXDAnKTsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+bGVmdC0+ZG9uZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5sZWZ0OwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWN1cnJlbnQtPnJpZ2h0LT5kb25lKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50LT5yaWdodC0+dG9rZW4udHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgdG9rZW5fc3RyaW5nOgotICAgICAgICAgICAgICAgICAgICBwYXJzZV9zdHJpbmcociwgY3VycmVudC0+cmlnaHQtPnRva2VuLnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIGFwX2NweXN0cm4oY3VycmVudC0+cmlnaHQtPnRva2VuLnZhbHVlLCBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGN1cnJlbnQtPnJpZ2h0LT50b2tlbi52YWx1ZSkpOwotCQkgICAgY3VycmVudC0+cmlnaHQtPnZhbHVlID0gKGN1cnJlbnQtPnJpZ2h0LT50b2tlbi52YWx1ZVswXSAhPSAnXDAnKTsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+cmlnaHQtPmRvbmUgPSAxOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+cmlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSNpZmRlZiBERUJVR19JTkNMVURFCi0gICAgICAgICAgICBhcF9ydnB1dHMociwgIiAgICAgTGVmdDogIiwgY3VycmVudC0+bGVmdC0+dmFsdWUgPyAiMSIgOiAiMCIsCi0gICAgICAgICAgICAgICAgICAgIlxuIiwgTlVMTCk7Ci0gICAgICAgICAgICBhcF9ydnB1dHMociwgIiAgICAgUmlnaHQ6ICIsIGN1cnJlbnQtPnJpZ2h0LT52YWx1ZSA/ICIxIiA6ICIwIiwKLSAgICAgICAgICAgICAgICAgICAiXG4iLCBOVUxMKTsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnRva2VuLnR5cGUgPT0gdG9rZW5fYW5kKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudC0+dmFsdWUgPSBjdXJyZW50LT5sZWZ0LT52YWx1ZSAmJiBjdXJyZW50LT5yaWdodC0+dmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50LT52YWx1ZSA9IGN1cnJlbnQtPmxlZnQtPnZhbHVlIHx8IGN1cnJlbnQtPnJpZ2h0LT52YWx1ZTsKLSAgICAgICAgICAgIH0KLSNpZmRlZiBERUJVR19JTkNMVURFCi0gICAgICAgICAgICBhcF9ydnB1dHMociwgIiAgICAgUmV0dXJuaW5nICIsIGN1cnJlbnQtPnZhbHVlID8gIjEiIDogIjAiLAotICAgICAgICAgICAgICAgICAgICJcbiIsIE5VTEwpOwotI2VuZGlmCi0gICAgICAgICAgICBjdXJyZW50LT5kb25lID0gMTsKLSAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5wYXJlbnQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHRva2VuX2VxOgotICAgICAgICBjYXNlIHRva2VuX25lOgotI2lmZGVmIERFQlVHX0lOQ0xVREUKLSAgICAgICAgICAgIGFwX3JwdXRzKCIgICAgIEV2YWx1YXRlIGVxL25lXG4iLCByKTsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKChjdXJyZW50LT5sZWZ0ID09IChzdHJ1Y3QgcGFyc2Vfbm9kZSAqKSBOVUxMKSB8fAotICAgICAgICAgICAgICAgIChjdXJyZW50LT5yaWdodCA9PSAoc3RydWN0IHBhcnNlX25vZGUgKikgTlVMTCkgfHwKLSAgICAgICAgICAgICAgICAoY3VycmVudC0+bGVmdC0+dG9rZW4udHlwZSAhPSB0b2tlbl9zdHJpbmcpIHx8Ci0gICAgICAgICAgICAgICAgKGN1cnJlbnQtPnJpZ2h0LT50b2tlbi50eXBlICE9IHRva2VuX3N0cmluZykpIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGV4cHJlc3Npb24gXCIlc1wiIGluIGZpbGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICBhcF9ycHV0cyhlcnJvciwgcik7Ci0gICAgICAgICAgICAgICAgZ290byBSRVRVUk47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJzZV9zdHJpbmcociwgY3VycmVudC0+bGVmdC0+dG9rZW4udmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgMCk7Ci0gICAgICAgICAgICBhcF9jcHlzdHJuKGN1cnJlbnQtPmxlZnQtPnRva2VuLnZhbHVlLCBidWZmZXIsCi0JCQlzaXplb2YoY3VycmVudC0+bGVmdC0+dG9rZW4udmFsdWUpKTsKLSAgICAgICAgICAgIHBhcnNlX3N0cmluZyhyLCBjdXJyZW50LT5yaWdodC0+dG9rZW4udmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgMCk7Ci0gICAgICAgICAgICBhcF9jcHlzdHJuKGN1cnJlbnQtPnJpZ2h0LT50b2tlbi52YWx1ZSwgYnVmZmVyLAotCQkJc2l6ZW9mKGN1cnJlbnQtPnJpZ2h0LT50b2tlbi52YWx1ZSkpOwotICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnJpZ2h0LT50b2tlbi52YWx1ZVswXSA9PSAnLycpIHsKLSAgICAgICAgICAgICAgICBpbnQgbGVuOwotICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbihjdXJyZW50LT5yaWdodC0+dG9rZW4udmFsdWUpOwotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LT5yaWdodC0+dG9rZW4udmFsdWVbbGVuIC0gMV0gPT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnJpZ2h0LT50b2tlbi52YWx1ZVtsZW4gLSAxXSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCByZXhwIFwiJXNcIiBpbiBmaWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+cmlnaHQtPnRva2VuLnZhbHVlLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBSRVRVUk47Ci0gICAgICAgICAgICAgICAgfQotI2lmZGVmIERFQlVHX0lOQ0xVREUKLSAgICAgICAgICAgICAgICBhcF9ydnB1dHMociwgIiAgICAgUmUgQ29tcGFyZSAoIiwgY3VycmVudC0+bGVmdC0+dG9rZW4udmFsdWUsCi0gICAgICAgICAgICAgICAgICAiKSB3aXRoIC8iLCAmY3VycmVudC0+cmlnaHQtPnRva2VuLnZhbHVlWzFdLCAiL1xuIiwgTlVMTCk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBjdXJyZW50LT52YWx1ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHJlX2NoZWNrKHIsIGN1cnJlbnQtPmxlZnQtPnRva2VuLnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VycmVudC0+cmlnaHQtPnRva2VuLnZhbHVlWzFdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotI2lmZGVmIERFQlVHX0lOQ0xVREUKLSAgICAgICAgICAgICAgICBhcF9ydnB1dHMociwgIiAgICAgQ29tcGFyZSAoIiwgY3VycmVudC0+bGVmdC0+dG9rZW4udmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICIpIHdpdGggKCIsIGN1cnJlbnQtPnJpZ2h0LT50b2tlbi52YWx1ZSwgIilcbiIsIE5VTEwpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgY3VycmVudC0+dmFsdWUgPQotICAgICAgICAgICAgICAgICAgICAoc3RyY21wKGN1cnJlbnQtPmxlZnQtPnRva2VuLnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnJpZ2h0LT50b2tlbi52YWx1ZSkgPT0gMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY3VycmVudC0+dG9rZW4udHlwZSA9PSB0b2tlbl9uZSkgewotICAgICAgICAgICAgICAgIGN1cnJlbnQtPnZhbHVlID0gIWN1cnJlbnQtPnZhbHVlOwotICAgICAgICAgICAgfQotI2lmZGVmIERFQlVHX0lOQ0xVREUKLSAgICAgICAgICAgIGFwX3J2cHV0cyhyLCAiICAgICBSZXR1cm5pbmcgIiwgY3VycmVudC0+dmFsdWUgPyAiMSIgOiAiMCIsCi0gICAgICAgICAgICAgICAgICAgIlxuIiwgTlVMTCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGN1cnJlbnQtPmRvbmUgPSAxOwotICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPnBhcmVudDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRva2VuX2dlOgotICAgICAgICBjYXNlIHRva2VuX2d0OgotICAgICAgICBjYXNlIHRva2VuX2xlOgotICAgICAgICBjYXNlIHRva2VuX2x0OgotI2lmZGVmIERFQlVHX0lOQ0xVREUKLSAgICAgICAgICAgIGFwX3JwdXRzKCIgICAgIEV2YWx1YXRlIGdlL2d0L2xlL2x0XG4iLCByKTsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKChjdXJyZW50LT5sZWZ0ID09IChzdHJ1Y3QgcGFyc2Vfbm9kZSAqKSBOVUxMKSB8fAotICAgICAgICAgICAgICAgIChjdXJyZW50LT5yaWdodCA9PSAoc3RydWN0IHBhcnNlX25vZGUgKikgTlVMTCkgfHwKLSAgICAgICAgICAgICAgICAoY3VycmVudC0+bGVmdC0+dG9rZW4udHlwZSAhPSB0b2tlbl9zdHJpbmcpIHx8Ci0gICAgICAgICAgICAgICAgKGN1cnJlbnQtPnJpZ2h0LT50b2tlbi50eXBlICE9IHRva2VuX3N0cmluZykpIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGV4cHJlc3Npb24gXCIlc1wiIGluIGZpbGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICBhcF9ycHV0cyhlcnJvciwgcik7Ci0gICAgICAgICAgICAgICAgZ290byBSRVRVUk47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJzZV9zdHJpbmcociwgY3VycmVudC0+bGVmdC0+dG9rZW4udmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgMCk7Ci0gICAgICAgICAgICBhcF9jcHlzdHJuKGN1cnJlbnQtPmxlZnQtPnRva2VuLnZhbHVlLCBidWZmZXIsCi0JCQlzaXplb2YoY3VycmVudC0+bGVmdC0+dG9rZW4udmFsdWUpKTsKLSAgICAgICAgICAgIHBhcnNlX3N0cmluZyhyLCBjdXJyZW50LT5yaWdodC0+dG9rZW4udmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgMCk7Ci0gICAgICAgICAgICBhcF9jcHlzdHJuKGN1cnJlbnQtPnJpZ2h0LT50b2tlbi52YWx1ZSwgYnVmZmVyLAotCQkJc2l6ZW9mKGN1cnJlbnQtPnJpZ2h0LT50b2tlbi52YWx1ZSkpOwotI2lmZGVmIERFQlVHX0lOQ0xVREUKLSAgICAgICAgICAgIGFwX3J2cHV0cyhyLCAiICAgICBDb21wYXJlICgiLCBjdXJyZW50LT5sZWZ0LT50b2tlbi52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAiKSB3aXRoICgiLCBjdXJyZW50LT5yaWdodC0+dG9rZW4udmFsdWUsICIpXG4iLCBOVUxMKTsKLSNlbmRpZgotICAgICAgICAgICAgY3VycmVudC0+dmFsdWUgPQotICAgICAgICAgICAgICAgIHN0cmNtcChjdXJyZW50LT5sZWZ0LT50b2tlbi52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+cmlnaHQtPnRva2VuLnZhbHVlKTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50LT50b2tlbi50eXBlID09IHRva2VuX2dlKSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudC0+dmFsdWUgPSBjdXJyZW50LT52YWx1ZSA+PSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudC0+dG9rZW4udHlwZSA9PSB0b2tlbl9ndCkgewotICAgICAgICAgICAgICAgIGN1cnJlbnQtPnZhbHVlID0gY3VycmVudC0+dmFsdWUgPiAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudC0+dG9rZW4udHlwZSA9PSB0b2tlbl9sZSkgewotICAgICAgICAgICAgICAgIGN1cnJlbnQtPnZhbHVlID0gY3VycmVudC0+dmFsdWUgPD0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnQtPnRva2VuLnR5cGUgPT0gdG9rZW5fbHQpIHsKLSAgICAgICAgICAgICAgICBjdXJyZW50LT52YWx1ZSA9IGN1cnJlbnQtPnZhbHVlIDwgMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGN1cnJlbnQtPnZhbHVlID0gMDsgICAgIC8qIERvbid0IHJldHVybiAtMSBpZiB1bmtub3duIHRva2VuICovCi0gICAgICAgICAgICB9Ci0jaWZkZWYgREVCVUdfSU5DTFVERQotICAgICAgICAgICAgYXBfcnZwdXRzKHIsICIgICAgIFJldHVybmluZyAiLCBjdXJyZW50LT52YWx1ZSA/ICIxIiA6ICIwIiwKLSAgICAgICAgICAgICAgICAgICAiXG4iLCBOVUxMKTsKLSNlbmRpZgotICAgICAgICAgICAgY3VycmVudC0+ZG9uZSA9IDE7Ci0gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+cGFyZW50OwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSB0b2tlbl9ub3Q6Ci0gICAgICAgICAgICBpZiAoY3VycmVudC0+cmlnaHQgIT0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnQtPnJpZ2h0LT5kb25lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5yaWdodDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGN1cnJlbnQtPnZhbHVlID0gIWN1cnJlbnQtPnJpZ2h0LT52YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGN1cnJlbnQtPnZhbHVlID0gMDsKLSAgICAgICAgICAgIH0KLSNpZmRlZiBERUJVR19JTkNMVURFCi0gICAgICAgICAgICBhcF9ydnB1dHMociwgIiAgICAgRXZhbHVhdGUgITogIiwgY3VycmVudC0+dmFsdWUgPyAiMSIgOiAiMCIsCi0gICAgICAgICAgICAgICAgICAgIlxuIiwgTlVMTCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGN1cnJlbnQtPmRvbmUgPSAxOwotICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPnBhcmVudDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgdG9rZW5fZ3JvdXA6Ci0gICAgICAgICAgICBpZiAoY3VycmVudC0+cmlnaHQgIT0gKHN0cnVjdCBwYXJzZV9ub2RlICopIE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnQtPnJpZ2h0LT5kb25lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5yaWdodDsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGN1cnJlbnQtPnZhbHVlID0gY3VycmVudC0+cmlnaHQtPnZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgY3VycmVudC0+dmFsdWUgPSAxOwotICAgICAgICAgICAgfQotI2lmZGVmIERFQlVHX0lOQ0xVREUKLSAgICAgICAgICAgIGFwX3J2cHV0cyhyLCAiICAgICBFdmFsdWF0ZSAoKTogIiwgY3VycmVudC0+dmFsdWUgPyAiMSIgOiAiMCIsCi0gICAgICAgICAgICAgICAgICAgIlxuIiwgTlVMTCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGN1cnJlbnQtPmRvbmUgPSAxOwotICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPnBhcmVudDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgdG9rZW5fbGJyYWNlOgotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJVbm1hdGNoZWQgJygnIGluIFwiJXNcIiBpbiBmaWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgICAgIGdvdG8gUkVUVVJOOwotCi0gICAgICAgIGNhc2UgdG9rZW5fcmJyYWNlOgotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJVbm1hdGNoZWQgJyknIGluIFwiJXNcIiBpbiBmaWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgICAgIGdvdG8gUkVUVVJOOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotCQkJImJhZCB0b2tlbiB0eXBlIik7Ci0gICAgICAgICAgICBhcF9ycHV0cyhlcnJvciwgcik7Ci0gICAgICAgICAgICBnb3RvIFJFVFVSTjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHZhbCA9IChyb290ID09IChzdHJ1Y3QgcGFyc2Vfbm9kZSAqKSBOVUxMKSA/IDAgOiByb290LT52YWx1ZTsKLSAgUkVUVVJOOgotICAgIGFwX2Rlc3Ryb3lfcG9vbChleHByX3Bvb2wpOwotICAgIHJldHVybiAocmV0dmFsKTsKLX0KLQotc3RhdGljIGludCBoYW5kbGVfaWYoYXBfZmlsZV90ICppbiwgcmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKmVycm9yLAotICAgICAgICAgICAgICAgICAgICAgaW50ICpjb25kaXRpb25hbF9zdGF0dXMsIGludCAqcHJpbnRpbmcpCi17Ci0gICAgY2hhciB0YWdbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgKnRhZ192YWw7Ci0gICAgY2hhciAqZXhwcjsKLQotICAgIGV4cHIgPSBOVUxMOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIHRhZ192YWwgPSBnZXRfdGFnKHItPnBvb2wsIGluLCB0YWcsIHNpemVvZih0YWcpLCAwKTsKLSAgICAgICAgaWYgKCp0YWcgPT0gJ1wwJykgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh0YWcsICJkb25lIikpIHsKLQkgICAgaWYgKGV4cHIgPT0gTlVMTCkgewotCQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotCQkJICAgICJtaXNzaW5nIGV4cHIgaW4gaWYgc3RhdGVtZW50OiAlcyIsCi0JCQkgICAgci0+ZmlsZW5hbWUpOwotCQlhcF9ycHV0cyhlcnJvciwgcik7Ci0JCXJldHVybiAxOwotCSAgICB9Ci0gICAgICAgICAgICAqcHJpbnRpbmcgPSAqY29uZGl0aW9uYWxfc3RhdHVzID0gcGFyc2VfZXhwcihyLCBleHByLCBlcnJvcik7Ci0jaWZkZWYgREVCVUdfSU5DTFVERQotICAgICAgICAgICAgYXBfcnZwdXRzKHIsICIqKioqIGlmIGNvbmRpdGlvbmFsX3N0YXR1cz1cIiIsCi0gICAgICAgICAgICAgICAgICAgKmNvbmRpdGlvbmFsX3N0YXR1cyA/ICIxIiA6ICIwIiwgIlwiXG4iLCBOVUxMKTsKLSNlbmRpZgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh0YWcsICJleHByIikpIHsKLSAgICAgICAgICAgIGV4cHIgPSB0YWdfdmFsOwotI2lmZGVmIERFQlVHX0lOQ0xVREUKLSAgICAgICAgICAgIGFwX3J2cHV0cyhyLCAiKioqKiBpZiBleHByPVwiIiwgZXhwciwgIlwiXG4iLCBOVUxMKTsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHBhcmFtZXRlciBcIiVzXCIgdG8gdGFnIGlmIGluICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhZywgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgYXBfcnB1dHMoZXJyb3IsIHIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IGhhbmRsZV9lbGlmKGFwX2ZpbGVfdCAqaW4sIHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICplcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb25kaXRpb25hbF9zdGF0dXMsIGludCAqcHJpbnRpbmcpCi17Ci0gICAgY2hhciB0YWdbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgKnRhZ192YWw7Ci0gICAgY2hhciAqZXhwcjsKLQotICAgIGV4cHIgPSBOVUxMOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIHRhZ192YWwgPSBnZXRfdGFnKHItPnBvb2wsIGluLCB0YWcsIHNpemVvZih0YWcpLCAwKTsKLSAgICAgICAgaWYgKCp0YWcgPT0gJ1wwJykgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh0YWcsICJkb25lIikpIHsKLSNpZmRlZiBERUJVR19JTkNMVURFCi0gICAgICAgICAgICBhcF9ydnB1dHMociwgIioqKiogZWxpZiBjb25kaXRpb25hbF9zdGF0dXM9XCIiLAotICAgICAgICAgICAgICAgICAgICpjb25kaXRpb25hbF9zdGF0dXMgPyAiMSIgOiAiMCIsICJcIlxuIiwgTlVMTCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmICgqY29uZGl0aW9uYWxfc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgKnByaW50aW5nID0gMDsKLSAgICAgICAgICAgICAgICByZXR1cm4gKDApOwotICAgICAgICAgICAgfQotCSAgICBpZiAoZXhwciA9PSBOVUxMKSB7Ci0JCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0JCQkgICAgIm1pc3NpbmcgZXhwciBpbiBlbGlmIHN0YXRlbWVudDogJXMiLAotCQkJICAgIHItPmZpbGVuYW1lKTsKLQkJYXBfcnB1dHMoZXJyb3IsIHIpOwotCQlyZXR1cm4gMTsKLQkgICAgfQotICAgICAgICAgICAgKnByaW50aW5nID0gKmNvbmRpdGlvbmFsX3N0YXR1cyA9IHBhcnNlX2V4cHIociwgZXhwciwgZXJyb3IpOwotI2lmZGVmIERFQlVHX0lOQ0xVREUKLSAgICAgICAgICAgIGFwX3J2cHV0cyhyLCAiKioqKiBlbGlmIGNvbmRpdGlvbmFsX3N0YXR1cz1cIiIsCi0gICAgICAgICAgICAgICAgICAgKmNvbmRpdGlvbmFsX3N0YXR1cyA/ICIxIiA6ICIwIiwgIlwiXG4iLCBOVUxMKTsKLSNlbmRpZgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh0YWcsICJleHByIikpIHsKLSAgICAgICAgICAgIGV4cHIgPSB0YWdfdmFsOwotI2lmZGVmIERFQlVHX0lOQ0xVREUKLSAgICAgICAgICAgIGFwX3J2cHV0cyhyLCAiKioqKiBpZiBleHByPVwiIiwgZXhwciwgIlwiXG4iLCBOVUxMKTsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHBhcmFtZXRlciBcIiVzXCIgdG8gdGFnIGlmIGluICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhZywgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgYXBfcnB1dHMoZXJyb3IsIHIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IGhhbmRsZV9lbHNlKGFwX2ZpbGVfdCAqaW4sIHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICplcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb25kaXRpb25hbF9zdGF0dXMsIGludCAqcHJpbnRpbmcpCi17Ci0gICAgY2hhciB0YWdbTUFYX1NUUklOR19MRU5dOwotCi0gICAgaWYgKCFnZXRfdGFnKHItPnBvb2wsIGluLCB0YWcsIHNpemVvZih0YWcpLCAxKSkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcCh0YWcsICJkb25lIikpIHsKLSNpZmRlZiBERUJVR19JTkNMVURFCi0gICAgICAgIGFwX3J2cHV0cyhyLCAiKioqKiBlbHNlIGNvbmRpdGlvbmFsX3N0YXR1cz1cIiIsCi0gICAgICAgICAgICAgICAqY29uZGl0aW9uYWxfc3RhdHVzID8gIjEiIDogIjAiLCAiXCJcbiIsIE5VTEwpOwotI2VuZGlmCi0gICAgICAgICpwcmludGluZyA9ICEoKmNvbmRpdGlvbmFsX3N0YXR1cyk7Ci0gICAgICAgICpjb25kaXRpb25hbF9zdGF0dXMgPSAxOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICJlbHNlIGRpcmVjdGl2ZSBkb2VzIG5vdCB0YWtlIHRhZ3MgaW4gJXMiLAotCQkgICAgci0+ZmlsZW5hbWUpOwotICAgICAgICBpZiAoKnByaW50aW5nKSB7Ci0gICAgICAgICAgICBhcF9ycHV0cyhlcnJvciwgcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KLQotc3RhdGljIGludCBoYW5kbGVfZW5kaWYoYXBfZmlsZV90ICppbiwgcmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKmVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb25kaXRpb25hbF9zdGF0dXMsIGludCAqcHJpbnRpbmcpCi17Ci0gICAgY2hhciB0YWdbTUFYX1NUUklOR19MRU5dOwotCi0gICAgaWYgKCFnZXRfdGFnKHItPnBvb2wsIGluLCB0YWcsIHNpemVvZih0YWcpLCAxKSkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcCh0YWcsICJkb25lIikpIHsKLSNpZmRlZiBERUJVR19JTkNMVURFCi0gICAgICAgIGFwX3J2cHV0cyhyLCAiKioqKiBlbmRpZiBjb25kaXRpb25hbF9zdGF0dXM9XCIiLAotICAgICAgICAgICAgICAgKmNvbmRpdGlvbmFsX3N0YXR1cyA/ICIxIiA6ICIwIiwgIlwiXG4iLCBOVUxMKTsKLSNlbmRpZgotICAgICAgICAqcHJpbnRpbmcgPSAxOwotICAgICAgICAqY29uZGl0aW9uYWxfc3RhdHVzID0gMTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAiZW5kaWYgZGlyZWN0aXZlIGRvZXMgbm90IHRha2UgdGFncyBpbiAlcyIsCi0JCSAgICByLT5maWxlbmFtZSk7Ci0gICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KLQotc3RhdGljIGludCBoYW5kbGVfc2V0KGFwX2ZpbGVfdCAqaW4sIHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICplcnJvcikKLXsKLSAgICBjaGFyIHRhZ1tNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciBwYXJzZWRfc3RyaW5nW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyICp0YWdfdmFsOwotICAgIGNoYXIgKnZhcjsKLQotICAgIHZhciA9IChjaGFyICopIE5VTEw7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKCEodGFnX3ZhbCA9IGdldF90YWcoci0+cG9vbCwgaW4sIHRhZywgc2l6ZW9mKHRhZyksIDEpKSkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh0YWcsICJkb25lIikpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJjbXAodGFnLCAidmFyIikpIHsKLSAgICAgICAgICAgIHZhciA9IHRhZ192YWw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcCh0YWcsICJ2YWx1ZSIpKSB7Ci0gICAgICAgICAgICBpZiAodmFyID09IChjaGFyICopIE5VTEwpIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXJpYWJsZSBtdXN0IHByZWNlZGUgdmFsdWUgaW4gc2V0IGRpcmVjdGl2ZSBpbiAlcyIsCi0JCQkgICAgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJzZV9zdHJpbmcociwgdGFnX3ZhbCwgcGFyc2VkX3N0cmluZywgc2l6ZW9mKHBhcnNlZF9zdHJpbmcpLCAwKTsKLSAgICAgICAgICAgIGFwX3RhYmxlX3NldG4oci0+c3VicHJvY2Vzc19lbnYsIHZhciwgYXBfcHN0cmR1cChyLT5wb29sLCBwYXJzZWRfc3RyaW5nKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdGFnIGZvciBzZXQgZGlyZWN0aXZlIGluICVzIiwgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgYXBfcnB1dHMoZXJyb3IsIHIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IGhhbmRsZV9wcmludGVudihhcF9maWxlX3QgKmluLCByZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqZXJyb3IpCi17Ci0gICAgY2hhciB0YWdbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgKnRhZ192YWw7Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmFyciA9IGFwX3RhYmxlX2VsdHMoci0+c3VicHJvY2Vzc19lbnYpOwotICAgIGFwX3RhYmxlX2VudHJ5X3QgKmVsdHMgPSAoYXBfdGFibGVfZW50cnlfdCAqKWFyci0+ZWx0czsKLSAgICBpbnQgaTsKLQotICAgIGlmICghKHRhZ192YWwgPSBnZXRfdGFnKHItPnBvb2wsIGluLCB0YWcsIHNpemVvZih0YWcpLCAxKSkpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAodGFnLCAiZG9uZSIpKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcnItPm5lbHRzOyArK2kpIHsKLSAgICAgICAgICAgIGFwX3J2cHV0cyhyLCBlbHRzW2ldLmtleSwgIj0iLCBlbHRzW2ldLnZhbCwgIlxuIiwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAicHJpbnRlbnYgZGlyZWN0aXZlIGRvZXMgbm90IHRha2UgdGFncyBpbiAlcyIsCi0JCSAgICByLT5maWxlbmFtZSk7Ci0gICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KLQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRoZSBtYWluIGZ1bmN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBUaGlzIGlzIGEgc3R1YiB3aGljaCBwYXJzZXMgYSBmaWxlIGRlc2NyaXB0b3IuICovCi0KLXN0YXRpYyB2b2lkIHNlbmRfcGFyc2VkX2NvbnRlbnQoYXBfZmlsZV90ICpmLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjaGFyIGRpcmVjdGl2ZVtNQVhfU1RSSU5HX0xFTl0sIGVycm9yW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyIHRpbWVmbXRbTUFYX1NUUklOR19MRU5dOwotICAgIGludCBub2V4ZWMgPSBhcF9hbGxvd19vcHRpb25zKHIpICYgT1BUX0lOQ05PRVhFQzsKLSAgICBpbnQgcmV0LCBzaXplZm10OwotICAgIGludCBpZl9uZXN0aW5nOwotICAgIGludCBwcmludGluZzsKLSAgICBpbnQgY29uZGl0aW9uYWxfc3RhdHVzOwotCi0gICAgYXBfY3B5c3RybihlcnJvciwgREVGQVVMVF9FUlJPUl9NU0csIHNpemVvZihlcnJvcikpOwotICAgIGFwX2NweXN0cm4odGltZWZtdCwgREVGQVVMVF9USU1FX0ZPUk1BVCwgc2l6ZW9mKHRpbWVmbXQpKTsKLSAgICBzaXplZm10ID0gU0laRUZNVF9LTUc7Ci0KLS8qICBUdXJuIHByaW50aW5nIG9uICovCi0gICAgcHJpbnRpbmcgPSBjb25kaXRpb25hbF9zdGF0dXMgPSAxOwotICAgIGlmX25lc3RpbmcgPSAwOwotCi0gICAgYXBfY2hkaXJfZmlsZShyLT5maWxlbmFtZSk7Ci0gICAgaWYgKHItPmFyZ3MpIHsgICAgICAgICAgICAgIC8qIGFkZCBRVUVSWSBzdHVmZiB0byBlbnYgY2F1c2UgaXQgYWluJ3QgeWV0ICovCi0gICAgICAgIGNoYXIgKmFyZ19jb3B5ID0gYXBfcHN0cmR1cChyLT5wb29sLCByLT5hcmdzKTsKLQotICAgICAgICBhcF90YWJsZV9zZXRuKHItPnN1YnByb2Nlc3NfZW52LCAiUVVFUllfU1RSSU5HIiwgci0+YXJncyk7Ci0gICAgICAgIGFwX3VuZXNjYXBlX3VybChhcmdfY29weSk7Ci0gICAgICAgIGFwX3RhYmxlX3NldG4oci0+c3VicHJvY2Vzc19lbnYsICJRVUVSWV9TVFJJTkdfVU5FU0NBUEVEIiwKLSAgICAgICAgICAgICAgICAgIGFwX2VzY2FwZV9zaGVsbF9jbWQoci0+cG9vbCwgYXJnX2NvcHkpKTsKLSAgICB9Ci0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoIWZpbmRfc3RyaW5nKGYsIFNUQVJUSU5HX1NFUVVFTkNFLCByLCBwcmludGluZykpIHsKLSAgICAgICAgICAgIGlmIChnZXRfZGlyZWN0aXZlKGYsIGRpcmVjdGl2ZSwgc2l6ZW9mKGRpcmVjdGl2ZSksIHItPnBvb2wpKSB7Ci0JCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0JCQkgICAgIm1vZF9pbmNsdWRlOiBlcnJvciByZWFkaW5nIGRpcmVjdGl2ZSBpbiAlcyIsCi0JCQkgICAgci0+ZmlsZW5hbWUpOwotCQlhcF9ycHV0cyhlcnJvciwgcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFzdHJjbXAoZGlyZWN0aXZlLCAiaWYiKSkgewotICAgICAgICAgICAgICAgIGlmICghcHJpbnRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgaWZfbmVzdGluZysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlX2lmKGYsIHIsIGVycm9yLCAmY29uZGl0aW9uYWxfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByaW50aW5nKTsKLSAgICAgICAgICAgICAgICAgICAgaWZfbmVzdGluZyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChkaXJlY3RpdmUsICJlbHNlIikpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlmX25lc3RpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlX2Vsc2UoZiwgciwgZXJyb3IsICZjb25kaXRpb25hbF9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmludGluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChkaXJlY3RpdmUsICJlbGlmIikpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWlmX25lc3RpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlX2VsaWYoZiwgciwgZXJyb3IsICZjb25kaXRpb25hbF9zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmludGluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChkaXJlY3RpdmUsICJlbmRpZiIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpZl9uZXN0aW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZV9lbmRpZihmLCByLCBlcnJvciwgJmNvbmRpdGlvbmFsX3N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmludGluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZl9uZXN0aW5nLS07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFwcmludGluZykgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFzdHJjbXAoZGlyZWN0aXZlLCAiZXhlYyIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5vZXhlYykgewotICAgICAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotCQkJCSAgImV4ZWMgdXNlZCBidXQgbm90IGFsbG93ZWQgaW4gJXMiLAotCQkJCSAgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJpbnRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXQgPSBmaW5kX3N0cmluZyhmLCBFTkRJTkdfU0VRVUVOQ0UsIHIsIDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlX2V4ZWMoZiwgciwgZXJyb3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZGlyZWN0aXZlLCAiY29uZmlnIikpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVfY29uZmlnKGYsIHIsIGVycm9yLCB0aW1lZm10LCAmc2l6ZWZtdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGRpcmVjdGl2ZSwgInNldCIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlX3NldChmLCByLCBlcnJvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGRpcmVjdGl2ZSwgImluY2x1ZGUiKSkgewotICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZV9pbmNsdWRlKGYsIHIsIGVycm9yLCBub2V4ZWMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChkaXJlY3RpdmUsICJlY2hvIikpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVfZWNobyhmLCByLCBlcnJvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGRpcmVjdGl2ZSwgImZzaXplIikpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVfZnNpemUoZiwgciwgZXJyb3IsIHNpemVmbXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChkaXJlY3RpdmUsICJmbGFzdG1vZCIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlX2ZsYXN0bW9kKGYsIHIsIGVycm9yLCB0aW1lZm10KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZGlyZWN0aXZlLCAicHJpbnRlbnYiKSkgewotICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZV9wcmludGVudihmLCByLCBlcnJvcik7Ci0gICAgICAgICAgICB9Ci0jaWZkZWYgVVNFX1BFUkxfU1NJCi0gICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGRpcmVjdGl2ZSwgInBlcmwiKSkgewotICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZV9wZXJsKGYsIHIsIGVycm9yKTsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLQkJCSAgICAgICJ1bmtub3duIGRpcmVjdGl2ZSBcIiVzXCIgIgotCQkJICAgICAgImluIHBhcnNlZCBkb2MgJXMiLAotCQkJICAgICAgZGlyZWN0aXZlLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByaW50aW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKGVycm9yLCByKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0ID0gZmluZF9zdHJpbmcoZiwgRU5ESU5HX1NFUVVFTkNFLCByLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotCQkJICAgICAgInByZW1hdHVyZSBFT0YgaW4gcGFyc2VkIGZpbGUgJXMiLAotCQkJICAgICAgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogWEJJVEhBQ0suICBTaWdoLi4uICBOQiBpdCdzIGNvbmZpZ3VyYWJsZSBwZXItZGlyZWN0b3J5OyB0aGUgY29tcGlsZS10aW1lCi0gKiBvcHRpb24gb25seSBjaGFuZ2VzIHRoZSBkZWZhdWx0LgotICovCi0KLW1vZHVsZSBpbmNsdWRlc19tb2R1bGU7Ci1lbnVtIHhiaXRoYWNrIHsKLSAgICB4Yml0aGFja19vZmYsIHhiaXRoYWNrX29uLCB4Yml0aGFja19mdWxsCi19OwotCi0jaWZkZWYgWEJJVEhBQ0sKLSNkZWZpbmUgREVGQVVMVF9YQklUSEFDSyB4Yml0aGFja19mdWxsCi0jZWxzZQotI2RlZmluZSBERUZBVUxUX1hCSVRIQUNLIHhiaXRoYWNrX29mZgotI2VuZGlmCi0KLXN0YXRpYyB2b2lkICpjcmVhdGVfaW5jbHVkZXNfZGlyX2NvbmZpZyhhcF9jb250ZXh0X3QgKnAsIGNoYXIgKmR1bW15KQotewotICAgIGVudW0geGJpdGhhY2sgKnJlc3VsdCA9IChlbnVtIHhiaXRoYWNrICopIGFwX3BhbGxvYyhwLCBzaXplb2YoZW51bSB4Yml0aGFjaykpOwotICAgICpyZXN1bHQgPSBERUZBVUxUX1hCSVRIQUNLOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfeGJpdGhhY2soY21kX3Bhcm1zICpjbWQsIHZvaWQgKnhicCwgY2hhciAqYXJnKQotewotICAgIGVudW0geGJpdGhhY2sgKnN0YXRlID0gKGVudW0geGJpdGhhY2sgKikgeGJwOwotCi0gICAgaWYgKCFzdHJjYXNlY21wKGFyZywgIm9mZiIpKSB7Ci0gICAgICAgICpzdGF0ZSA9IHhiaXRoYWNrX29mZjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnLCAib24iKSkgewotICAgICAgICAqc3RhdGUgPSB4Yml0aGFja19vbjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnLCAiZnVsbCIpKSB7Ci0gICAgICAgICpzdGF0ZSA9IHhiaXRoYWNrX2Z1bGw7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXR1cm4gIlhCaXRIYWNrIG11c3QgYmUgc2V0IHRvIE9mZiwgT24sIG9yIEZ1bGwiOwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IHNlbmRfcGFyc2VkX2ZpbGUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgYXBfZmlsZV90ICpmID0gTlVMTDsKLSAgICBlbnVtIHhiaXRoYWNrICpzdGF0ZSA9Ci0gICAgKGVudW0geGJpdGhhY2sgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsICZpbmNsdWRlc19tb2R1bGUpOwotICAgIGludCBlcnJzdGF0dXM7Ci0gICAgcmVxdWVzdF9yZWMgKnBhcmVudDsKLQotICAgIGlmICghKGFwX2FsbG93X29wdGlvbnMocikgJiBPUFRfSU5DTFVERVMpKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0gICAgci0+YWxsb3dlZCB8PSAoMSA8PCBNX0dFVCk7Ci0gICAgaWYgKHItPm1ldGhvZF9udW1iZXIgIT0gTV9HRVQpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLSAgICBpZiAoci0+ZmluZm8ucHJvdGVjdGlvbiA9PSAwKSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0JCSAgICAiRmlsZSBkb2VzIG5vdCBleGlzdDogJXMiLAotICAgICAgICAgICAgICAgICAgICAoci0+cGF0aF9pbmZvCi0gICAgICAgICAgICAgICAgICAgICA/IGFwX3BzdHJjYXQoci0+cG9vbCwgci0+ZmlsZW5hbWUsIHItPnBhdGhfaW5mbywgTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgIDogci0+ZmlsZW5hbWUpKTsKLSAgICAgICAgcmV0dXJuIEhUVFBfTk9UX0ZPVU5EOwotICAgIH0KLQotICAgIGVycnN0YXR1cyA9IGFwX29wZW4oJmYsIHItPmZpbGVuYW1lLCBBUFJfUkVBRCwgMCwgci0+cG9vbCk7Ci0KLSAgICBpZiAoZXJyc3RhdHVzICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJzdGF0dXMsIHIsCi0gICAgICAgICAgICAgICAgICAgICJmaWxlIHBlcm1pc3Npb25zIGRlbnkgc2VydmVyIGFjY2VzczogJXMiLCByLT5maWxlbmFtZSk7Ci0gICAgICAgIHJldHVybiBIVFRQX0ZPUkJJRERFTjsKLSAgICB9Ci0KLSAgICBpZiAoKCpzdGF0ZSA9PSB4Yml0aGFja19mdWxsKQotI2lmICFkZWZpbmVkKE9TMikgJiYgIWRlZmluZWQoV0lOMzIpCi0gICAgLyogIE9TLzIgZG9zZW4ndCBzdXBwb3J0IEdyb3Vwcy4gKi8KLSAgICAgICAgJiYgKHItPmZpbmZvLnByb3RlY3Rpb24gJiBTX0lYR1JQKQotI2VuZGlmCi0gICAgICAgICkgewotICAgICAgICBhcF91cGRhdGVfbXRpbWUociwgci0+ZmluZm8ubXRpbWUpOwotICAgICAgICBhcF9zZXRfbGFzdF9tb2RpZmllZChyKTsKLSAgICB9Ci0gICAgaWYgKChlcnJzdGF0dXMgPSBhcF9tZWV0c19jb25kaXRpb25zKHIpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyc3RhdHVzOwotICAgIH0KLQotICAgIGFwX3NlbmRfaHR0cF9oZWFkZXIocik7Ci0KLSAgICBpZiAoci0+aGVhZGVyX29ubHkpIHsKLSAgICAgICAgYXBfY2xvc2UoZik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBpZiAoKHBhcmVudCA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnJlcXVlc3RfY29uZmlnLCAmaW5jbHVkZXNfbW9kdWxlKSkpIHsKLQkvKiBLbHVkZ2UgLS0tIGZvciBuZXN0ZWQgaW5jbHVkZXMsIHdlIHdhbnQgdG8ga2VlcCB0aGUgc3VicHJvY2VzcwotCSAqIGVudmlyb25tZW50IG9mIHRoZSBiYXNlIGRvY3VtZW50IChmb3IgY29tcGF0aWJpbGl0eSk7IHRoYXQgbWVhbnMKLQkgKiB0b3JxdWluZyBvdXIgb3duIGxhc3RfbW9kaWZpZWQgZGF0ZSBhcyB3ZWxsIHNvIHRoYXQgdGhlCi0JICogTEFTVF9NT0RJRklFRCB2YXJpYWJsZSBnZXRzIHJlc2V0IHRvIHRoZSBwcm9wZXIgdmFsdWUgaWYgdGhlCi0JICogbmVzdGVkIGRvY3VtZW50IHJlc2V0cyA8IS0tI2NvbmZpZyB0aW1lZm10LS0+LgotCSAqIFdlIGFsc28gaW5zaXN0IHRoYXQgdGhlIG1lbW9yeSBmb3IgdGhpcyBzdWJyZXF1ZXN0IG5vdCBiZQotCSAqIGRlc3Ryb3llZCwgdGhhdCdzIGRlYWx0IHdpdGggaW4gaGFuZGxlX2luY2x1ZGUoKS4KLQkgKi8KLQlyLT5zdWJwcm9jZXNzX2VudiA9IHBhcmVudC0+c3VicHJvY2Vzc19lbnY7Ci0JYXBfcG9vbF9qb2luKHBhcmVudC0+cG9vbCwgci0+cG9vbCk7Ci0Jci0+ZmluZm8ubXRpbWUgPSBwYXJlbnQtPmZpbmZvLm10aW1lOwotICAgIH0KLSAgICBlbHNlIHsKLQkvKiB3ZSdyZSBub3QgYSBuZXN0ZWQgaW5jbHVkZSwgc28gd2UgY3JlYXRlIGFuIGluaXRpYWwKLQkgKiBlbnZpcm9ubWVudCAqLwotICAgICAgICBhcF9hZGRfY29tbW9uX3ZhcnMocik7Ci0gICAgICAgIGFwX2FkZF9jZ2lfdmFycyhyKTsKLSAgICAgICAgYWRkX2luY2x1ZGVfdmFycyhyLCBERUZBVUxUX1RJTUVfRk9STUFUKTsKLSAgICB9Ci0gICAgLyogWFhYOiB0aGlzIGlzIGJvZ3VzLCBhdCBzb21lIHBvaW50IHdlJ3JlIGdvaW5nIHRvIGRvIGEgc3VicmVxdWVzdCwKLSAgICAgKiBhbmQgd2hlbiB3ZSBkbyBpdCB3ZSdyZSBnb2luZyB0byBiZSBzdWJqZWN0aW5nIGNvZGUgdGhhdCBkb2Vzbid0Ci0gICAgICogZXhwZWN0IHRvIGJlIHNpZ25hbC1yZWFkeSB0byBTSUdBTFJNLiAgVGhlcmUgaXMgbm8gY2xlYW4gd2F5IHRvCi0gICAgICogZml4IHRoaXMsIGV4Y2VwdCB0byBwdXQgYWxhcm0gc3VwcG9ydCBpbnRvIEJVRkYuIC1kamcKLSAgICAgKi8KLSNpZmRlZiBDSEFSU0VUX0VCQ0RJQwotICAgIC8qIFhYWDpAQEAgSXMgdGhlIGdlbmVyYXRlZC9pbmNsdWRlZCBvdXRwdXQgQUxXQVlTIGluIHRleHQvZWJjZGljIGZvcm1hdD8gKi8KLSAgICBhcF9ic2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfRUJDRElDMkFTQ0lJLCAxKTsKLSNlbmRpZgotCi0gICAgc2VuZF9wYXJzZWRfY29udGVudChmLCByKTsKLQotICAgIGlmIChwYXJlbnQpIHsKLQkvKiBzaWduaWZ5IHRoYXQgdGhlIHN1YiByZXF1ZXN0IHNob3VsZCBub3QgYmUga2lsbGVkICovCi0JYXBfc2V0X21vZHVsZV9jb25maWcoci0+cmVxdWVzdF9jb25maWcsICZpbmNsdWRlc19tb2R1bGUsCi0JICAgIE5FU1RFRF9JTkNMVURFX01BR0lDKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBpbnQgc2VuZF9zaHRtbF9maWxlKHJlcXVlc3RfcmVjICpyKQotewotICAgIHItPmNvbnRlbnRfdHlwZSA9ICJ0ZXh0L2h0bWwiOwotICAgIHJldHVybiBzZW5kX3BhcnNlZF9maWxlKHIpOwotfQotCi1zdGF0aWMgaW50IHhiaXRoYWNrX2hhbmRsZXIocmVxdWVzdF9yZWMgKnIpCi17Ci0jaWYgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lOMzIpCi0gICAgLyogT1MvMiBkb3Nlbid0IGN1cnJlbnRseSBzdXBwb3J0IHRoZSB4Yml0aGFjay4gVGhpcyBpcyBiZWluZyB3b3JrZWQgb24uICovCi0gICAgcmV0dXJuIERFQ0xJTkVEOwotI2Vsc2UKLSAgICBlbnVtIHhiaXRoYWNrICpzdGF0ZTsKLQotICAgIGlmICghKHItPmZpbmZvLnByb3RlY3Rpb24gJiBTX0lYVVNSKSkgewotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgc3RhdGUgPSAoZW51bSB4Yml0aGFjayAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmNsdWRlc19tb2R1bGUpOwotCi0gICAgaWYgKCpzdGF0ZSA9PSB4Yml0aGFja19vZmYpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLSAgICByZXR1cm4gc2VuZF9wYXJzZWRfZmlsZShyKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgaW5jbHVkZXNfY21kc1tdID0KLXsKLSAgICB7IlhCaXRIYWNrIiwgc2V0X3hiaXRoYWNrLCBOVUxMLCBPUl9PUFRJT05TLCBUQUtFMSwgIk9mZiwgT24sIG9yIEZ1bGwifSwKLSAgICB7TlVMTH0KLX07Ci0KLXN0YXRpYyBjb25zdCBoYW5kbGVyX3JlYyBpbmNsdWRlc19oYW5kbGVyc1tdID0KLXsKLSAgICB7SU5DTFVERVNfTUFHSUNfVFlQRSwgc2VuZF9zaHRtbF9maWxlfSwKLSAgICB7SU5DTFVERVNfTUFHSUNfVFlQRTMsIHNlbmRfc2h0bWxfZmlsZX0sCi0gICAgeyJzZXJ2ZXItcGFyc2VkIiwgc2VuZF9wYXJzZWRfZmlsZX0sCi0gICAgeyJ0ZXh0L2h0bWwiLCB4Yml0aGFja19oYW5kbGVyfSwKLSAgICB7TlVMTH0KLX07Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBpbmNsdWRlc19tb2R1bGUgPQotewotICAgIFNUQU5EQVJEMjBfTU9EVUxFX1NUVUZGLAotICAgIGNyZWF0ZV9pbmNsdWRlc19kaXJfY29uZmlnLCAvKiBkaXIgY29uZmlnIGNyZWF0ZXIgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogZGlyIG1lcmdlciAtLS0gZGVmYXVsdCBpcyB0byBvdmVycmlkZSAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXJ2ZXIgY29uZmlnICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lcmdlIHNlcnZlciBjb25maWcgKi8KLSAgICBpbmNsdWRlc19jbWRzLCAgICAgICAgICAgICAgLyogY29tbWFuZCBhcF90YWJsZV90ICovCi0gICAgaW5jbHVkZXNfaGFuZGxlcnMsICAgICAgICAgIC8qIGhhbmRsZXJzICovCi0gICAgTlVMTAkJCS8qIHJlZ2lzdGVyIGhvb2tzICovCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9maWx0ZXJzL21vZF9pbmNsdWRlLmV4cCBiL21vZHVsZXMvZmlsdGVycy9tb2RfaW5jbHVkZS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNWRhNzQuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9maWx0ZXJzL21vZF9pbmNsdWRlLmV4cAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWluY2x1ZGVzX21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9nZW5lcmF0b3JzLy5pbmRlbnQucHJvIGIvbW9kdWxlcy9nZW5lcmF0b3JzLy5pbmRlbnQucHJvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWZiZTlmLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZ2VuZXJhdG9ycy8uaW5kZW50LnBybworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS1pNCAtbnBzbCAtZGkwIC1iciAtbmNlIC1kMCAtY2xpMCAtbnBjcyAtbmZjMQotLVRCVUZGCi0tVEZJTEUKLS1UVFJBTlMKLS1UVUlOVDQKLS1UX3RyYW5zCi0tVGFsbG93X29wdGlvbnNfdAotLVRhcGFjaGVfc2ZpbwotLVRhcnJheV9oZWFkZXIKLS1UYm9vbF9pbnQKLS1UYnVmX2FyZWEKLS1UYnVmZl9zdHJ1Y3QKLS1UYnVmZnkKLS1UY21kX2hvdwotLVRjbWRfcGFybXMKLS1UY29tbWFuZF9yZWMKLS1UY29tbWFuZF9zdHJ1Y3QKLS1UY29ubl9yZWMKLS1UY29yZV9kaXJfY29uZmlnCi0tVGNvcmVfc2VydmVyX2NvbmZpZwotLVRkaXJfbWFrZXJfZnVuYwotLVRldmVudAotLVRnbG9iYWxzX3MKLS1UaGFuZGxlcl9mdW5jCi0tVGhhbmRsZXJfcmVjCi0tVGpvYmxpc3RfcwotLVRsaXN0ZW5fcmVjCi0tVG1lcmdlcl9mdW5jCi0tVG1vZGVfdAotLVRtb2R1bGUKLS1UbW9kdWxlX3N0cnVjdAotLVRtdXRleAotLVRuX2xvbmcKLS1Ub3RoZXJfY2hpbGRfcmVjCi0tVG92ZXJyaWRlc190Ci0tVHBhcmVudF9zY29yZQotLVRwaWRfdAotLVRwaXBlZF9sb2cKLS1UcG9vbAotLVRyZXF1ZXN0X3JlYwotLVRyZXF1aXJlX2xpbmUKLS1UcmxpbV90Ci0tVHNjb3JlYm9hcmQKLS1Uc2VtYXBob3JlCi0tVHNlcnZlcl9hZGRyX3JlYwotLVRzZXJ2ZXJfcmVjCi0tVHNlcnZlcl9yZWNfY2hhaW4KLS1Uc2hvcnRfc2NvcmUKLS1UdGFibGUKLS1UdGFibGVfZW50cnkKLS1UdGhyZWFkCi0tVHVfd2lkZV9pbnQKLS1UdnRpbWVfdAotLVR3aWRlX2ludApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9hc2lzLmMgYi9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2FzaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFkNmNmNi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2FzaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAidXRpbF9zY3JpcHQuaCIKLSNpbmNsdWRlICJodHRwX21haW4uaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLQotI2RlZmluZSBBU0lTX01BR0lDX1RZUEUgImh0dHBkL3NlbmQtYXMtaXMiCi0KLXN0YXRpYyBpbnQgYXNpc19oYW5kbGVyKHJlcXVlc3RfcmVjICpyKQotewotICAgIGFwX2ZpbGVfdCAqZiA9IE5VTEw7Ci0gICAgYXBfc3RhdHVzX3Qgc3RhdHVzOwotICAgIGNvbnN0IGNoYXIgKmxvY2F0aW9uOwotCi0gICAgci0+YWxsb3dlZCB8PSAoMSA8PCBNX0dFVCk7Ci0gICAgaWYgKHItPm1ldGhvZF9udW1iZXIgIT0gTV9HRVQpCi0JcmV0dXJuIERFQ0xJTkVEOwotICAgIGlmIChyLT5maW5mby5wcm90ZWN0aW9uID09IDApIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotCQkgICAgIkZpbGUgZG9lcyBub3QgZXhpc3Q6ICVzIiwgci0+ZmlsZW5hbWUpOwotCXJldHVybiBOT1RfRk9VTkQ7Ci0gICAgfQotCi0gICAgaWYgKChzdGF0dXMgPSBhcF9vcGVuKCZmLCByLT5maWxlbmFtZSwgQVBSX1JFQUQgfCBBUFJfQlVGRkVSRUQsIAotICAgICAgICAgICAgICAgIEFQUl9PU19ERUZBVUxULCByLT5wb29sKSkgIT0gQVBSX1NVQ0NFU1MpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgc3RhdHVzLCByLAotCQkgICAgImZpbGUgcGVybWlzc2lvbnMgZGVueSBzZXJ2ZXIgYWNjZXNzOiAlcyIsIHItPmZpbGVuYW1lKTsKLQlyZXR1cm4gRk9SQklEREVOOwotICAgIH0KLQotICAgIGFwX3NjYW5fc2NyaXB0X2hlYWRlcl9lcnIociwgZiwgTlVMTCk7Ci0gICAgbG9jYXRpb24gPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19vdXQsICJMb2NhdGlvbiIpOwotCi0gICAgaWYgKGxvY2F0aW9uICYmIGxvY2F0aW9uWzBdID09ICcvJyAmJgotCSgoci0+c3RhdHVzID09IEhUVFBfT0spIHx8IGFwX2lzX0hUVFBfUkVESVJFQ1Qoci0+c3RhdHVzKSkpIHsKLQotCWFwX2Nsb3NlKGYpOwotCi0JLyogSW50ZXJuYWwgcmVkaXJlY3QgLS0gZmFrZS11cCBhIHBzZXVkby1yZXF1ZXN0ICovCi0Jci0+c3RhdHVzID0gSFRUUF9PSzsKLQotCS8qIFRoaXMgcmVkaXJlY3QgbmVlZHMgdG8gYmUgYSBHRVQgbm8gbWF0dGVyIHdoYXQgdGhlIG9yaWdpbmFsCi0JICogbWV0aG9kIHdhcy4KLQkgKi8KLQlyLT5tZXRob2QgPSBhcF9wc3RyZHVwKHItPnBvb2wsICJHRVQiKTsKLQlyLT5tZXRob2RfbnVtYmVyID0gTV9HRVQ7Ci0KLQlhcF9pbnRlcm5hbF9yZWRpcmVjdF9oYW5kbGVyKGxvY2F0aW9uLCByKTsKLQlyZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgYXBfc2VuZF9odHRwX2hlYWRlcihyKTsKLSAgICBpZiAoIXItPmhlYWRlcl9vbmx5KSB7Ci0JYXBfc2VuZF9mZChmLCByKTsKLSAgICB9Ci0KLSAgICBhcF9jbG9zZShmKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBjb25zdCBoYW5kbGVyX3JlYyBhc2lzX2hhbmRsZXJzW10gPQotewotICAgIHtBU0lTX01BR0lDX1RZUEUsIGFzaXNfaGFuZGxlcn0sCi0gICAgeyJzZW5kLWFzLWlzIiwgYXNpc19oYW5kbGVyfSwKLSAgICB7TlVMTH0KLX07Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBhc2lzX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCi0gICAgTlVMTCwJCQkvKiBjcmVhdGUgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlICovCi0gICAgTlVMTCwJCQkvKiBtZXJnZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgTlVMTCwJCQkvKiBjcmVhdGUgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlICovCi0gICAgTlVMTCwJCQkvKiBtZXJnZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgTlVMTCwJCQkvKiBjb21tYW5kIGFwX3RhYmxlX3QgKi8KLSAgICBhc2lzX2hhbmRsZXJzLAkJLyogaGFuZGxlcnMgKi8KLSAgICBOVUxMCQkJLyogcmVnaXN0ZXIgaG9va3MgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2FzaXMuZXhwIGIvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9hc2lzLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzNDdkOS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2FzaXMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYXNpc19tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfYXV0b2luZGV4LmMgYi9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2F1dG9pbmRleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDM5ZTNhLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfYXV0b2luZGV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjc3ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIG1vZF9hdXRvaW5kZXguYzogSGFuZGxlcyB0aGUgb24tdGhlLWZseSBodG1sIGluZGV4IGdlbmVyYXRpb24KLSAqIAotICogUm9iIE1jQ29vbAotICogMy8yMy85MwotICogCi0gKiBBZGFwdGVkIHRvIEFwYWNoZSBieSByc3QuCi0gKi8KLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX21haW4uaCIKLSNpbmNsdWRlICJ1dGlsX3NjcmlwdC5oIgotI2luY2x1ZGUgImFwcl9mbm1hdGNoLmgiCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBhdXRvaW5kZXhfbW9kdWxlOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEhhbmRsaW5nIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcy4uLgotICovCi0KLSNkZWZpbmUgSFJVTEUgMQotI2RlZmluZSBOT19IUlVMRSAwCi0jZGVmaW5lIEZST05UX01BVFRFUiAxCi0jZGVmaW5lIEVORF9NQVRURVIgMAotCi0jZGVmaW5lIEZBTkNZX0lOREVYSU5HIDEJLyogSW5kZXhpbmcgb3B0aW9ucyAqLwotI2RlZmluZSBJQ09OU19BUkVfTElOS1MgMgotI2RlZmluZSBTQ0FOX0hUTUxfVElUTEVTIDQKLSNkZWZpbmUgU1VQUFJFU1NfTEFTVF9NT0QgOAotI2RlZmluZSBTVVBQUkVTU19TSVpFIDE2Ci0jZGVmaW5lIFNVUFBSRVNTX0RFU0MgMzIKLSNkZWZpbmUgU1VQUFJFU1NfUFJFQU1CTEUgNjQKLSNkZWZpbmUgU1VQUFJFU1NfQ09MU09SVCAxMjgKLSNkZWZpbmUgTk9fT1BUSU9OUyAyNTYKLQotI2RlZmluZSBLX1BBRCAxCi0jZGVmaW5lIEtfTk9QQUQgMAotCi0jZGVmaW5lIEtfTk9BREpVU1QgMAotI2RlZmluZSBLX0FESlVTVCAxCi0jZGVmaW5lIEtfVU5TRVQgMgotCi0vKgotICogRGVmaW5lIGtleXMgZm9yIHNvcnRpbmcuCi0gKi8KLSNkZWZpbmUgS19OQU1FICdOJwkJLyogU29ydCBieSBmaWxlIG5hbWUgKGRlZmF1bHQpICovCi0jZGVmaW5lIEtfTEFTVF9NT0QgJ00nCQkvKiBMYXN0IG1vZGlmaWNhdGlvbiBkYXRlICovCi0jZGVmaW5lIEtfU0laRSAnUycJCS8qIFNpemUgKGFic29sdXRlLCBub3QgYXMgZGlzcGxheWVkKSAqLwotI2RlZmluZSBLX0RFU0MgJ0QnCQkvKiBEZXNjcmlwdGlvbiAqLwotCi0jZGVmaW5lIERfQVNDRU5ESU5HICdBJwotI2RlZmluZSBEX0RFU0NFTkRJTkcgJ0QnCi0KLS8qCi0gKiBUaGVzZSBhcmUgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGRlZmF1bHQgaWNvbnMgc3VwcGxpZWQgd2l0aCBBcGFjaGUuCi0gKi8KLSNkZWZpbmUgREVGQVVMVF9JQ09OX1dJRFRIIDIwCi0jZGVmaW5lIERFRkFVTFRfSUNPTl9IRUlHSFQgMjIKLQotLyoKLSAqIE90aGVyIGRlZmF1bHQgZGltZW5zaW9ucy4KLSAqLwotI2RlZmluZSBERUZBVUxUX05BTUVfV0lEVEggMjMKLQotc3RydWN0IGl0ZW0gewotICAgIGNoYXIgKnR5cGU7Ci0gICAgY2hhciAqYXBwbHlfdG87Ci0gICAgY2hhciAqYXBwbHlfcGF0aDsKLSAgICBjaGFyICpkYXRhOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgYWlfZGVzY190IHsKLSAgICBjaGFyICpwYXR0ZXJuOwotICAgIGNoYXIgKmRlc2NyaXB0aW9uOwotICAgIGludCBmdWxsX3BhdGg7Ci0gICAgaW50IHdpbGRjYXJkczsKLX0gYWlfZGVzY190OwotCi10eXBlZGVmIHN0cnVjdCBhdXRvaW5kZXhfY29uZmlnX3N0cnVjdCB7Ci0KLSAgICBjaGFyICpkZWZhdWx0X2ljb247Ci0gICAgaW50IG9wdHM7Ci0gICAgaW50IGluY3JlbWVudGVkX29wdHM7Ci0gICAgaW50IGRlY3JlbWVudGVkX29wdHM7Ci0gICAgaW50IG5hbWVfd2lkdGg7Ci0gICAgaW50IG5hbWVfYWRqdXN0OwotICAgIGludCBpY29uX3dpZHRoOwotICAgIGludCBpY29uX2hlaWdodDsKLSAgICBjaGFyICpkZWZhdWx0X29yZGVyOwotCi0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmljb25fbGlzdDsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqYWx0X2xpc3Q7Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmRlc2NfbGlzdDsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqaWduX2xpc3Q7Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmhkcl9saXN0OwotICAgIGFwX2FycmF5X2hlYWRlcl90ICpyZG1lX2xpc3Q7Ci0KLX0gYXV0b2luZGV4X2NvbmZpZ19yZWM7Ci0KLXN0YXRpYyBjaGFyIGNfYnlfZW5jb2RpbmcsIGNfYnlfdHlwZSwgY19ieV9wYXRoOwotCi0jZGVmaW5lIEJZX0VOQ09ESU5HICZjX2J5X2VuY29kaW5nCi0jZGVmaW5lIEJZX1RZUEUgJmNfYnlfdHlwZQotI2RlZmluZSBCWV9QQVRIICZjX2J5X3BhdGgKLQotLyoKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHJlZmVycyB0byB0aGUgcGFyZW50IGRpcmVjdG9yeSAoaS5lLiwKLSAqIG1hdGNoZXMgIi4uIiBvciAiLi4vIikuICBIb3BlZnVsbHkgdGhpcyBvbmUgY2FsbCBpcyBzaWduaWZpY2FudGx5IGxlc3MKLSAqIGV4cGVuc2l2ZSB0aGFuIG11bHRpcGxlIHN0cmNtcCgpIGNhbGxzLgotICovCi1zdGF0aWMgYXBfaW5saW5lIGludCBpc19wYXJlbnQoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICAvKgotICAgICAqIE5vdywgSUZGIHRoZSBmaXJzdCB0d28gYnl0ZXMgYXJlIGRvdHMsIGFuZCB0aGUgdGhpcmQgYnl0ZSBpcyBlaXRoZXIKLSAgICAgKiBFT1MgKFwwKSBvciBhIHNsYXNoIGZvbGxvd2VkIGJ5IEVPUywgd2UgaGF2ZSBhIG1hdGNoLgotICAgICAqLwotICAgIGlmICgoKG5hbWVbMF0gPT0gJy4nKSAmJiAobmFtZVsxXSA9PSAnLicpKQotCSYmICgobmFtZVsyXSA9PSAnXDAnKQotCSAgICB8fCAoKG5hbWVbMl0gPT0gJy8nKSAmJiAobmFtZVszXSA9PSAnXDAnKSkpKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBwdXRzIHRoZSBzdGFuZGFyZCBIVE1MIGhlYWRlciBhdCB0aGUgdG9wIG9mIHRoZSBpbmRleCBwYWdlLgotICogV2UgaW5jbHVkZSB0aGUgRE9DVFlQRSBiZWNhdXNlIHdlIG1heSBiZSB1c2luZyBmZWF0dXJlcyB0aGVyZWZyb20gKGkuZS4sCi0gKiBIRUlHSFQgYW5kIFdJRFRIIGF0dHJpYnV0ZXMgb24gdGhlIGljb25zIGlmIHdlJ3JlIEZhbmN5SW5kZXhpbmcpLgotICovCi1zdGF0aWMgdm9pZCBlbWl0X3ByZWFtYmxlKHJlcXVlc3RfcmVjICpyLCBjaGFyICp0aXRsZSkKLXsKLSAgICBhcF9ydnB1dHMociwgRE9DVFlQRV9IVE1MXzNfMiwKLQkgICAgICAiPEhUTUw+XG4gPEhFQUQ+XG4gIDxUSVRMRT5JbmRleCBvZiAiLCB0aXRsZSwKLQkgICAgICAiPC9USVRMRT5cbiA8L0hFQUQ+XG4gPEJPRFk+XG4iLCBOVUxMKTsKLX0KLQotc3RhdGljIHZvaWQgcHVzaF9pdGVtKGFwX2FycmF5X2hlYWRlcl90ICphcnIsIGNoYXIgKnR5cGUsIGNoYXIgKnRvLCBjaGFyICpwYXRoLAotCQkgICAgICBjaGFyICpkYXRhKQotewotICAgIHN0cnVjdCBpdGVtICpwID0gKHN0cnVjdCBpdGVtICopIGFwX3B1c2hfYXJyYXkoYXJyKTsKLQotICAgIGlmICghdG8pIHsKLQl0byA9ICIiOwotICAgIH0KLSAgICBpZiAoIXBhdGgpIHsKLQlwYXRoID0gIiI7Ci0gICAgfQotCi0gICAgcC0+dHlwZSA9IHR5cGU7Ci0gICAgcC0+ZGF0YSA9IGRhdGEgPyBhcF9wc3RyZHVwKGFyci0+Y29udCwgZGF0YSkgOiBOVUxMOwotICAgIHAtPmFwcGx5X3BhdGggPSBhcF9wc3RyY2F0KGFyci0+Y29udCwgcGF0aCwgIioiLCBOVUxMKTsKLQotICAgIGlmICgodHlwZSA9PSBCWV9QQVRIKSAmJiAoIWFwX2lzX21hdGNoZXhwKHRvKSkpIHsKLQlwLT5hcHBseV90byA9IGFwX3BzdHJjYXQoYXJyLT5jb250LCAiKiIsIHRvLCBOVUxMKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodG8pIHsKLQlwLT5hcHBseV90byA9IGFwX3BzdHJkdXAoYXJyLT5jb250LCB0byk7Ci0gICAgfQotICAgIGVsc2UgewotCXAtPmFwcGx5X3RvID0gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICphZGRfYWx0KGNtZF9wYXJtcyAqY21kLCB2b2lkICpkLCBjaGFyICphbHQsIGNoYXIgKnRvKQotewotICAgIGlmIChjbWQtPmluZm8gPT0gQllfUEFUSCkgewotICAgICAgICBpZiAoIXN0cmNtcCh0bywgIioqRElSRUNUT1JZKioiKSkgewotCSAgICB0byA9ICJeXkRJUkVDVE9SWV5eIjsKLQl9Ci0gICAgfQotICAgIGlmIChjbWQtPmluZm8gPT0gQllfRU5DT0RJTkcpIHsKLQlhcF9zdHJfdG9sb3dlcih0byk7Ci0gICAgfQotCi0gICAgcHVzaF9pdGVtKCgoYXV0b2luZGV4X2NvbmZpZ19yZWMgKikgZCktPmFsdF9saXN0LCBjbWQtPmluZm8sIHRvLAotCSAgICAgIGNtZC0+cGF0aCwgYWx0KTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmFkZF9pY29uKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkLCBjaGFyICppY29uLCBjaGFyICp0bykKLXsKLSAgICBjaGFyICppY29uYmFrID0gYXBfcHN0cmR1cChjbWQtPnBvb2wsIGljb24pOwotCi0gICAgaWYgKGljb25bMF0gPT0gJygnKSB7Ci0JY2hhciAqYWx0OwotCWNoYXIgKmNsID0gc3RyY2hyKGljb25iYWssICcpJyk7Ci0KLQlpZiAoY2wgPT0gTlVMTCkgewotCSAgICByZXR1cm4gIm1pc3NpbmcgY2xvc2luZyBwYXJlbiI7Ci0JfQotCWFsdCA9IGFwX2dldHdvcmRfbmMoY21kLT5wb29sLCAmaWNvbmJhaywgJywnKTsKLQkqY2wgPSAnXDAnOwkJCQkvKiBMb3NlIGNsb3NpbmcgcGFyZW4gKi8KLQlhZGRfYWx0KGNtZCwgZCwgJmFsdFsxXSwgdG8pOwotICAgIH0KLSAgICBpZiAoY21kLT5pbmZvID09IEJZX1BBVEgpIHsKLSAgICAgICAgaWYgKCFzdHJjbXAodG8sICIqKkRJUkVDVE9SWSoqIikpIHsKLQkgICAgdG8gPSAiXl5ESVJFQ1RPUlleXiI7Ci0JfQotICAgIH0KLSAgICBpZiAoY21kLT5pbmZvID09IEJZX0VOQ09ESU5HKSB7Ci0JYXBfc3RyX3RvbG93ZXIodG8pOwotICAgIH0KLQotICAgIHB1c2hfaXRlbSgoKGF1dG9pbmRleF9jb25maWdfcmVjICopIGQpLT5pY29uX2xpc3QsIGNtZC0+aW5mbywgdG8sCi0JICAgICAgY21kLT5wYXRoLCBpY29uYmFrKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIEFkZCBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIGZpbGVuYW1lIHBhdHRlcm4uICBJZiB0aGUgcGF0dGVybiBoYXMKLSAqIHdpbGRjYXJkcyBhbHJlYWR5IChvciB3ZSBuZWVkIHRvIGFkZCB0aGVtKSwgYWRkIGxlYWRpbmcgYW5kCi0gKiB0cmFpbGluZyB3aWxkY2FyZHMgdG8gaXQgdG8gZW5zdXJlIHN1YnN0cmluZyBwcm9jZXNzaW5nLiAgSWYgdGhlCi0gKiBwYXR0ZXJuIGNvbnRhaW5zIGEgJy8nIGFueXdoZXJlLCBmb3JjZSB3aWxkY2FyZCBtYXRjaGluZyBtb2RlLAotICogYWRkIGEgc2xhc2ggdG8gdGhlIHByZWZpeCBzbyB0aGF0ICJiYXIvYmxldGNoIiB3b24ndCBiZSBtYXRjaGVkCi0gKiBieSAiZm9vYmFyL2JsZXRjaCIsIGFuZCBtYWtlIGEgbm90ZSB0aGF0IHRoZXJlJ3MgYSBkZWxpbWl0ZXI7Ci0gKiB0aGUgbWF0Y2hpbmcgcm91dGluZSBzaW1wbGlmaWVzIHRvIGp1c3QgdGhlIGFjdHVhbCBmaWxlbmFtZQotICogd2hlbmV2ZXIgaXQgY2FuLiAgVGhpcyBhbGxvd3MgZGVmaW5pdGlvbnMgaW4gcGFyZW50IGRpcmVjdG9yaWVzCi0gKiB0byBiZSBtYWRlIGZvciBmaWxlcyBpbiBzdWJvcmRpbmF0ZSBvbmVzIHVzaW5nIHJlbGF0aXZlIHBhdGhzLgotICovCi0KLS8qCi0gKiBBYnNlbnQgYSBzdHJjYXNlc3RyKCkgZnVuY3Rpb24sIHdlIGhhdmUgdG8gZm9yY2Ugd2lsZGNhcmRzIG9uCi0gKiBzeXN0ZW1zIGZvciB3aGljaCAiQUFBIiBhbmQgImFhYSIgbWVhbiB0aGUgc2FtZSBmaWxlLgotICovCi0jaWZkZWYgQ0FTRV9CTElORF9GSUxFU1lTVEVNCi0jZGVmaW5lIFdJTERDQVJEU19SRVFVSVJFRCAxCi0jZWxzZQotI2RlZmluZSBXSUxEQ0FSRFNfUkVRVUlSRUQgMAotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBjaGFyICphZGRfZGVzYyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZCwgY2hhciAqZGVzYywgY2hhciAqdG8pCi17Ci0gICAgYXV0b2luZGV4X2NvbmZpZ19yZWMgKmRjZmcgPSAoYXV0b2luZGV4X2NvbmZpZ19yZWMgKikgZDsKLSAgICBhaV9kZXNjX3QgKmRlc2NfZW50cnk7Ci0gICAgY2hhciAqcHJlZml4ID0gIiI7Ci0KLSAgICBkZXNjX2VudHJ5ID0gKGFpX2Rlc2NfdCAqKSBhcF9wdXNoX2FycmF5KGRjZmctPmRlc2NfbGlzdCk7Ci0gICAgZGVzY19lbnRyeS0+ZnVsbF9wYXRoID0gKHN0cmNocih0bywgJy8nKSA9PSBOVUxMKSA/IDAgOiAxOwotICAgIGRlc2NfZW50cnktPndpbGRjYXJkcyA9IChXSUxEQ0FSRFNfUkVRVUlSRUQKLQkJCSAgICAgfHwgZGVzY19lbnRyeS0+ZnVsbF9wYXRoCi0JCQkgICAgIHx8IGFwX2lzX2ZubWF0Y2godG8pKTsKLSAgICBpZiAoZGVzY19lbnRyeS0+d2lsZGNhcmRzKSB7Ci0JcHJlZml4ID0gZGVzY19lbnRyeS0+ZnVsbF9wYXRoID8gIiovIiA6ICIqIjsKLQlkZXNjX2VudHJ5LT5wYXR0ZXJuID0gYXBfcHN0cmNhdChkY2ZnLT5kZXNjX2xpc3QtPmNvbnQsCi0JCQkJCSBwcmVmaXgsIHRvLCAiKiIsIE5VTEwpOwotICAgIH0KLSAgICBlbHNlIHsKLQlkZXNjX2VudHJ5LT5wYXR0ZXJuID0gYXBfcHN0cmR1cChkY2ZnLT5kZXNjX2xpc3QtPmNvbnQsIHRvKTsKLSAgICB9Ci0gICAgZGVzY19lbnRyeS0+ZGVzY3JpcHRpb24gPSBhcF9wc3RyZHVwKGRjZmctPmRlc2NfbGlzdC0+Y29udCwgZGVzYyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICphZGRfaWdub3JlKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkLCBjaGFyICpleHQpCi17Ci0gICAgcHVzaF9pdGVtKCgoYXV0b2luZGV4X2NvbmZpZ19yZWMgKikgZCktPmlnbl9saXN0LCAwLCBleHQsIGNtZC0+cGF0aCwgTlVMTCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICphZGRfaGVhZGVyKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkLCBjaGFyICpuYW1lKQotewotICAgIHB1c2hfaXRlbSgoKGF1dG9pbmRleF9jb25maWdfcmVjICopIGQpLT5oZHJfbGlzdCwgMCwgTlVMTCwgY21kLT5wYXRoLAotCSAgICAgIG5hbWUpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqYWRkX3JlYWRtZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqZCwgY2hhciAqbmFtZSkKLXsKLSAgICBwdXNoX2l0ZW0oKChhdXRvaW5kZXhfY29uZmlnX3JlYyAqKSBkKS0+cmRtZV9saXN0LCAwLCBOVUxMLCBjbWQtPnBhdGgsCi0JICAgICAgbmFtZSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEEgbGVnYWN5IGRpcmVjdGl2ZSwgRmFuY3lJbmRleGluZyBpcyBzdXBlcnNlZGVkIGJ5IHRoZSBJbmRleE9wdGlvbnMKLSAqIGtleXdvcmQuICBCdXQgZm9yIGNvbXBhdGliaWxpdHkuLgotICovCi1zdGF0aWMgY29uc3QgY2hhciAqZmFuY3lfaW5kZXhpbmcoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmQsIGludCBhcmcpCi17Ci0gICAgaW50IGN1cm9wdHM7Ci0gICAgaW50IG5ld29wdHM7Ci0gICAgYXV0b2luZGV4X2NvbmZpZ19yZWMgKmNmZzsKLQotICAgIGNmZyA9IChhdXRvaW5kZXhfY29uZmlnX3JlYyAqKSBkOwotICAgIGN1cm9wdHMgPSBjZmctPm9wdHM7Ci0gICAgaWYgKGN1cm9wdHMgJiBOT19PUFRJT05TKSB7Ci0JcmV0dXJuICJGYW5jeUluZGV4aW5nIGRpcmVjdGl2ZSBjb25mbGljdHMgd2l0aCBleGlzdGluZyAiCi0JICAgICAgICJJbmRleE9wdGlvbnMgTm9uZSI7Ci0gICAgfQotICAgIG5ld29wdHMgPSAoYXJnID8gKGN1cm9wdHMgfCBGQU5DWV9JTkRFWElORykgOiAoY3Vyb3B0cyAmIH5GQU5DWV9JTkRFWElORykpOwotICAgIGNmZy0+b3B0cyA9IG5ld29wdHM7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICphZGRfb3B0cyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZCwgY29uc3QgY2hhciAqb3B0c3RyKQotewotICAgIGNoYXIgKnc7Ci0gICAgaW50IG9wdHM7Ci0gICAgaW50IG9wdHNfYWRkOwotICAgIGludCBvcHRzX3JlbW92ZTsKLSAgICBjaGFyIGFjdGlvbjsKLSAgICBhdXRvaW5kZXhfY29uZmlnX3JlYyAqZF9jZmcgPSAoYXV0b2luZGV4X2NvbmZpZ19yZWMgKikgZDsKLQotICAgIG9wdHMgPSBkX2NmZy0+b3B0czsKLSAgICBvcHRzX2FkZCA9IGRfY2ZnLT5pbmNyZW1lbnRlZF9vcHRzOwotICAgIG9wdHNfcmVtb3ZlID0gZF9jZmctPmRlY3JlbWVudGVkX29wdHM7Ci0gICAgd2hpbGUgKG9wdHN0clswXSkgewotCWludCBvcHRpb24gPSAwOwotCi0JdyA9IGFwX2dldHdvcmRfY29uZihjbWQtPnBvb2wsICZvcHRzdHIpOwotCWlmICgoKncgPT0gJysnKSB8fCAoKncgPT0gJy0nKSkgewotCSAgICBhY3Rpb24gPSAqKHcrKyk7Ci0JfQotCWVsc2UgewotCSAgICBhY3Rpb24gPSAnXDAnOwotCX0KLQlpZiAoIXN0cmNhc2VjbXAodywgIkZhbmN5SW5kZXhpbmciKSkgewotCSAgICBvcHRpb24gPSBGQU5DWV9JTkRFWElORzsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIkljb25zQXJlTGlua3MiKSkgewotCSAgICBvcHRpb24gPSBJQ09OU19BUkVfTElOS1M7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJTY2FuSFRNTFRpdGxlcyIpKSB7Ci0JICAgIG9wdGlvbiA9IFNDQU5fSFRNTF9USVRMRVM7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJTdXBwcmVzc0xhc3RNb2RpZmllZCIpKSB7Ci0JICAgIG9wdGlvbiA9IFNVUFBSRVNTX0xBU1RfTU9EOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiU3VwcHJlc3NTaXplIikpIHsKLQkgICAgb3B0aW9uID0gU1VQUFJFU1NfU0laRTsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIlN1cHByZXNzRGVzY3JpcHRpb24iKSkgewotCSAgICBvcHRpb24gPSBTVVBQUkVTU19ERVNDOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiU3VwcHJlc3NIVE1MUHJlYW1ibGUiKSkgewotCSAgICBvcHRpb24gPSBTVVBQUkVTU19QUkVBTUJMRTsKLQl9Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJTdXBwcmVzc0NvbHVtblNvcnRpbmciKSkgewotICAgICAgICAgICAgb3B0aW9uID0gU1VQUFJFU1NfQ09MU09SVDsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIk5vbmUiKSkgewotCSAgICBpZiAoYWN0aW9uICE9ICdcMCcpIHsKLQkJcmV0dXJuICJDYW5ub3QgY29tYmluZSAnKycgb3IgJy0nIHdpdGggJ05vbmUnIGtleXdvcmQiOwotCSAgICB9Ci0JICAgIG9wdHMgPSBOT19PUFRJT05TOwotCSAgICBvcHRzX2FkZCA9IDA7Ci0JICAgIG9wdHNfcmVtb3ZlID0gMDsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIkljb25XaWR0aCIpKSB7Ci0JICAgIGlmIChhY3Rpb24gIT0gJy0nKSB7Ci0JCWRfY2ZnLT5pY29uX3dpZHRoID0gREVGQVVMVF9JQ09OX1dJRFRIOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQlkX2NmZy0+aWNvbl93aWR0aCA9IDA7Ci0JICAgIH0KLQl9Ci0JZWxzZSBpZiAoIXN0cm5jYXNlY21wKHcsICJJY29uV2lkdGg9IiwgMTApKSB7Ci0JICAgIGlmIChhY3Rpb24gPT0gJy0nKSB7Ci0JCXJldHVybiAiQ2Fubm90IGNvbWJpbmUgJy0nIHdpdGggSWNvbldpZHRoPW4iOwotCSAgICB9Ci0JICAgIGRfY2ZnLT5pY29uX3dpZHRoID0gYXRvaSgmd1sxMF0pOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiSWNvbkhlaWdodCIpKSB7Ci0JICAgIGlmIChhY3Rpb24gIT0gJy0nKSB7Ci0JCWRfY2ZnLT5pY29uX2hlaWdodCA9IERFRkFVTFRfSUNPTl9IRUlHSFQ7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCWRfY2ZnLT5pY29uX2hlaWdodCA9IDA7Ci0JICAgIH0KLQl9Ci0JZWxzZSBpZiAoIXN0cm5jYXNlY21wKHcsICJJY29uSGVpZ2h0PSIsIDExKSkgewotCSAgICBpZiAoYWN0aW9uID09ICctJykgewotCQlyZXR1cm4gIkNhbm5vdCBjb21iaW5lICctJyB3aXRoIEljb25IZWlnaHQ9biI7Ci0JICAgIH0KLQkgICAgZF9jZmctPmljb25faGVpZ2h0ID0gYXRvaSgmd1sxMV0pOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiTmFtZVdpZHRoIikpIHsKLQkgICAgaWYgKGFjdGlvbiAhPSAnLScpIHsKLQkJcmV0dXJuICJOYW1lV2lkdGggd2l0aCBubyB2YWx1ZSBtYXkgb25seSBhcHBlYXIgYXMgIgotCQkgICAgICAgIictTmFtZVdpZHRoJyI7Ci0JICAgIH0KLQkgICAgZF9jZmctPm5hbWVfd2lkdGggPSBERUZBVUxUX05BTUVfV0lEVEg7Ci0JICAgIGRfY2ZnLT5uYW1lX2FkanVzdCA9IEtfTk9BREpVU1Q7Ci0JfQotCWVsc2UgaWYgKCFzdHJuY2FzZWNtcCh3LCAiTmFtZVdpZHRoPSIsIDEwKSkgewotCSAgICBpZiAoYWN0aW9uID09ICctJykgewotCQlyZXR1cm4gIkNhbm5vdCBjb21iaW5lICctJyB3aXRoIE5hbWVXaWR0aD1uIjsKLQkgICAgfQotCSAgICBpZiAod1sxMF0gPT0gJyonKSB7Ci0JCWRfY2ZnLT5uYW1lX2FkanVzdCA9IEtfQURKVVNUOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQlpbnQgd2lkdGggPSBhdG9pKCZ3WzEwXSk7Ci0KLQkJaWYgKHdpZHRoIDwgNSkgewotCQkgICAgcmV0dXJuICJOYW1lV2lkdGggdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gNSI7Ci0JCX0KLQkJZF9jZmctPm5hbWVfd2lkdGggPSB3aWR0aDsKLQkJZF9jZmctPm5hbWVfYWRqdXN0ID0gS19OT0FESlVTVDsKLQkgICAgfQotCX0KLQllbHNlIHsKLQkgICAgcmV0dXJuICJJbnZhbGlkIGRpcmVjdG9yeSBpbmRleGluZyBvcHRpb24iOwotCX0KLQlpZiAoYWN0aW9uID09ICdcMCcpIHsKLQkgICAgb3B0cyB8PSBvcHRpb247Ci0JICAgIG9wdHNfYWRkID0gMDsKLQkgICAgb3B0c19yZW1vdmUgPSAwOwotCX0KLQllbHNlIGlmIChhY3Rpb24gPT0gJysnKSB7Ci0JICAgIG9wdHNfYWRkIHw9IG9wdGlvbjsKLQkgICAgb3B0c19yZW1vdmUgJj0gfm9wdGlvbjsKLQl9Ci0JZWxzZSB7Ci0JICAgIG9wdHNfcmVtb3ZlIHw9IG9wdGlvbjsKLQkgICAgb3B0c19hZGQgJj0gfm9wdGlvbjsKLQl9Ci0gICAgfQotICAgIGlmICgob3B0cyAmIE5PX09QVElPTlMpICYmIChvcHRzICYgfk5PX09QVElPTlMpKSB7Ci0JcmV0dXJuICJDYW5ub3QgY29tYmluZSBvdGhlciBJbmRleE9wdGlvbnMga2V5d29yZHMgd2l0aCAnTm9uZSciOwotICAgIH0KLSAgICBkX2NmZy0+aW5jcmVtZW50ZWRfb3B0cyA9IG9wdHNfYWRkOwotICAgIGRfY2ZnLT5kZWNyZW1lbnRlZF9vcHRzID0gb3B0c19yZW1vdmU7Ci0gICAgZF9jZmctPm9wdHMgPSBvcHRzOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2RlZmF1bHRfb3JkZXIoY21kX3Bhcm1zICpjbWQsIHZvaWQgKm0sIGNoYXIgKmRpcmVjdGlvbiwKLQkJCQkgICAgIGNoYXIgKmtleSkKLXsKLSAgICBjaGFyIHRlbXBbNF07Ci0gICAgYXV0b2luZGV4X2NvbmZpZ19yZWMgKmRfY2ZnID0gKGF1dG9pbmRleF9jb25maWdfcmVjICopIG07Ci0KLSAgICBhcF9jcHlzdHJuKHRlbXAsICJrPWQiLCBzaXplb2YodGVtcCkpOwotICAgIGlmICghc3RyY2FzZWNtcChkaXJlY3Rpb24sICJBc2NlbmRpbmciKSkgewotCXRlbXBbMl0gPSBEX0FTQ0VORElORzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAoZGlyZWN0aW9uLCAiRGVzY2VuZGluZyIpKSB7Ci0JdGVtcFsyXSA9IERfREVTQ0VORElORzsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JcmV0dXJuICJGaXJzdCBrZXl3b3JkIG11c3QgYmUgJ0FzY2VuZGluZycgb3IgJ0Rlc2NlbmRpbmcnIjsKLSAgICB9Ci0KLSAgICBpZiAoIXN0cmNhc2VjbXAoa2V5LCAiTmFtZSIpKSB7Ci0JdGVtcFswXSA9IEtfTkFNRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAoa2V5LCAiRGF0ZSIpKSB7Ci0JdGVtcFswXSA9IEtfTEFTVF9NT0Q7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGtleSwgIlNpemUiKSkgewotCXRlbXBbMF0gPSBLX1NJWkU7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGtleSwgIkRlc2NyaXB0aW9uIikpIHsKLQl0ZW1wWzBdID0gS19ERVNDOwotICAgIH0KLSAgICBlbHNlIHsKLQlyZXR1cm4gIlNlY29uZCBrZXl3b3JkIG11c3QgYmUgJ05hbWUnLCAnRGF0ZScsICdTaXplJywgb3IgIgotCSAgICAiJ0Rlc2NyaXB0aW9uJyI7Ci0gICAgfQotCi0gICAgaWYgKGRfY2ZnLT5kZWZhdWx0X29yZGVyID09IE5VTEwpIHsKLQlkX2NmZy0+ZGVmYXVsdF9vcmRlciA9IGFwX3BhbGxvYyhjbWQtPnBvb2wsIDQpOwotCWRfY2ZnLT5kZWZhdWx0X29yZGVyWzNdID0gJ1wwJzsKLSAgICB9Ci0gICAgYXBfY3B5c3RybihkX2NmZy0+ZGVmYXVsdF9vcmRlciwgdGVtcCwgc2l6ZW9mKHRlbXApKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotI2RlZmluZSBESVJfQ01EX1BFUk1TIE9SX0lOREVYRVMKLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIGF1dG9pbmRleF9jbWRzW10gPQotewotICAgIHsiQWRkSWNvbiIsIGFkZF9pY29uLCBCWV9QQVRILCBESVJfQ01EX1BFUk1TLCBJVEVSQVRFMiwKLSAgICAgImFuIGljb24gVVJMIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGZpbGVuYW1lcyJ9LAotICAgIHsiQWRkSWNvbkJ5VHlwZSIsIGFkZF9pY29uLCBCWV9UWVBFLCBESVJfQ01EX1BFUk1TLCBJVEVSQVRFMiwKLSAgICAgImFuIGljb24gVVJMIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIE1JTUUgdHlwZXMifSwKLSAgICB7IkFkZEljb25CeUVuY29kaW5nIiwgYWRkX2ljb24sIEJZX0VOQ09ESU5HLCBESVJfQ01EX1BFUk1TLCBJVEVSQVRFMiwKLSAgICAgImFuIGljb24gVVJMIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGNvbnRlbnQgZW5jb2RpbmdzIn0sCi0gICAgeyJBZGRBbHQiLCBhZGRfYWx0LCBCWV9QQVRILCBESVJfQ01EX1BFUk1TLCBJVEVSQVRFMiwKLSAgICAgImFsdGVybmF0ZSBkZXNjcmlwdGl2ZSB0ZXh0IGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGZpbGVuYW1lcyJ9LAotICAgIHsiQWRkQWx0QnlUeXBlIiwgYWRkX2FsdCwgQllfVFlQRSwgRElSX0NNRF9QRVJNUywgSVRFUkFURTIsCi0gICAgICJhbHRlcm5hdGUgZGVzY3JpcHRpdmUgdGV4dCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBNSU1FIHR5cGVzIn0sCi0gICAgeyJBZGRBbHRCeUVuY29kaW5nIiwgYWRkX2FsdCwgQllfRU5DT0RJTkcsIERJUl9DTURfUEVSTVMsIElURVJBVEUyLAotICAgICAiYWx0ZXJuYXRlIGRlc2NyaXB0aXZlIHRleHQgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgY29udGVudCBlbmNvZGluZ3MifSwKLSAgICB7IkluZGV4T3B0aW9ucyIsIGFkZF9vcHRzLCBOVUxMLCBESVJfQ01EX1BFUk1TLCBSQVdfQVJHUywKLSAgICAgIm9uZSBvciBtb3JlIGluZGV4IG9wdGlvbnMifSwKLSAgICB7IkluZGV4T3JkZXJEZWZhdWx0Iiwgc2V0X2RlZmF1bHRfb3JkZXIsIE5VTEwsIERJUl9DTURfUEVSTVMsIFRBS0UyLAotICAgICAie0FzY2VuZGluZyxEZXNjZW5kaW5nfSB7TmFtZSxTaXplLERlc2NyaXB0aW9uLERhdGV9In0sCi0gICAgeyJJbmRleElnbm9yZSIsIGFkZF9pZ25vcmUsIE5VTEwsIERJUl9DTURfUEVSTVMsIElURVJBVEUsCi0gICAgICJvbmUgb3IgbW9yZSBmaWxlIGV4dGVuc2lvbnMifSwKLSAgICB7IkFkZERlc2NyaXB0aW9uIiwgYWRkX2Rlc2MsIEJZX1BBVEgsIERJUl9DTURfUEVSTVMsIElURVJBVEUyLAotICAgICAiRGVzY3JpcHRpdmUgdGV4dCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBmaWxlbmFtZXMifSwKLSAgICB7IkhlYWRlck5hbWUiLCBhZGRfaGVhZGVyLCBOVUxMLCBESVJfQ01EX1BFUk1TLCBUQUtFMSwgImEgZmlsZW5hbWUifSwKLSAgICB7IlJlYWRtZU5hbWUiLCBhZGRfcmVhZG1lLCBOVUxMLCBESVJfQ01EX1BFUk1TLCBUQUtFMSwgImEgZmlsZW5hbWUifSwKLSAgICB7IkZhbmN5SW5kZXhpbmciLCBmYW5jeV9pbmRleGluZywgTlVMTCwgRElSX0NNRF9QRVJNUywgRkxBRywKLSAgICAgIkxpbWl0ZWQgdG8gJ29uJyBvciAnb2ZmJyAoc3VwZXJzZWRlZCBieSBJbmRleE9wdGlvbnMgRmFuY3lJbmRleGluZykifSwKLSAgICB7IkRlZmF1bHRJY29uIiwgYXBfc2V0X3N0cmluZ19zbG90LAotICAgICAodm9pZCAqKSBYdE9mZnNldE9mKGF1dG9pbmRleF9jb25maWdfcmVjLCBkZWZhdWx0X2ljb24pLAotICAgICBESVJfQ01EX1BFUk1TLCBUQUtFMSwgImFuIGljb24gVVJMIn0sCi0gICAge05VTEx9Ci19OwotCi1zdGF0aWMgdm9pZCAqY3JlYXRlX2F1dG9pbmRleF9jb25maWcoYXBfY29udGV4dF90ICpwLCBjaGFyICpkdW1teSkKLXsKLSAgICBhdXRvaW5kZXhfY29uZmlnX3JlYyAqbmV3ID0KLSAgICAoYXV0b2luZGV4X2NvbmZpZ19yZWMgKikgYXBfcGNhbGxvYyhwLCBzaXplb2YoYXV0b2luZGV4X2NvbmZpZ19yZWMpKTsKLQotICAgIG5ldy0+aWNvbl93aWR0aCA9IDA7Ci0gICAgbmV3LT5pY29uX2hlaWdodCA9IDA7Ci0gICAgbmV3LT5uYW1lX3dpZHRoID0gREVGQVVMVF9OQU1FX1dJRFRIOwotICAgIG5ldy0+bmFtZV9hZGp1c3QgPSBLX1VOU0VUOwotICAgIG5ldy0+aWNvbl9saXN0ID0gYXBfbWFrZV9hcnJheShwLCA0LCBzaXplb2Yoc3RydWN0IGl0ZW0pKTsKLSAgICBuZXctPmFsdF9saXN0ID0gYXBfbWFrZV9hcnJheShwLCA0LCBzaXplb2Yoc3RydWN0IGl0ZW0pKTsKLSAgICBuZXctPmRlc2NfbGlzdCA9IGFwX21ha2VfYXJyYXkocCwgNCwgc2l6ZW9mKGFpX2Rlc2NfdCkpOwotICAgIG5ldy0+aWduX2xpc3QgPSBhcF9tYWtlX2FycmF5KHAsIDQsIHNpemVvZihzdHJ1Y3QgaXRlbSkpOwotICAgIG5ldy0+aGRyX2xpc3QgPSBhcF9tYWtlX2FycmF5KHAsIDQsIHNpemVvZihzdHJ1Y3QgaXRlbSkpOwotICAgIG5ldy0+cmRtZV9saXN0ID0gYXBfbWFrZV9hcnJheShwLCA0LCBzaXplb2Yoc3RydWN0IGl0ZW0pKTsKLSAgICBuZXctPm9wdHMgPSAwOwotICAgIG5ldy0+aW5jcmVtZW50ZWRfb3B0cyA9IDA7Ci0gICAgbmV3LT5kZWNyZW1lbnRlZF9vcHRzID0gMDsKLSAgICBuZXctPmRlZmF1bHRfb3JkZXIgPSBOVUxMOwotCi0gICAgcmV0dXJuICh2b2lkICopIG5ldzsKLX0KLQotc3RhdGljIHZvaWQgKm1lcmdlX2F1dG9pbmRleF9jb25maWdzKGFwX2NvbnRleHRfdCAqcCwgdm9pZCAqYmFzZXYsIHZvaWQgKmFkZHYpCi17Ci0gICAgYXV0b2luZGV4X2NvbmZpZ19yZWMgKm5ldzsKLSAgICBhdXRvaW5kZXhfY29uZmlnX3JlYyAqYmFzZSA9IChhdXRvaW5kZXhfY29uZmlnX3JlYyAqKSBiYXNldjsKLSAgICBhdXRvaW5kZXhfY29uZmlnX3JlYyAqYWRkID0gKGF1dG9pbmRleF9jb25maWdfcmVjICopIGFkZHY7Ci0KLSAgICBuZXcgPSAoYXV0b2luZGV4X2NvbmZpZ19yZWMgKikgYXBfcGNhbGxvYyhwLCBzaXplb2YoYXV0b2luZGV4X2NvbmZpZ19yZWMpKTsKLSAgICBuZXctPmRlZmF1bHRfaWNvbiA9IGFkZC0+ZGVmYXVsdF9pY29uID8gYWRkLT5kZWZhdWx0X2ljb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYmFzZS0+ZGVmYXVsdF9pY29uOwotICAgIG5ldy0+aWNvbl9oZWlnaHQgPSBhZGQtPmljb25faGVpZ2h0ID8gYWRkLT5pY29uX2hlaWdodCA6IGJhc2UtPmljb25faGVpZ2h0OwotICAgIG5ldy0+aWNvbl93aWR0aCA9IGFkZC0+aWNvbl93aWR0aCA/IGFkZC0+aWNvbl93aWR0aCA6IGJhc2UtPmljb25fd2lkdGg7Ci0KLSAgICBuZXctPmFsdF9saXN0ID0gYXBfYXBwZW5kX2FycmF5cyhwLCBhZGQtPmFsdF9saXN0LCBiYXNlLT5hbHRfbGlzdCk7Ci0gICAgbmV3LT5pZ25fbGlzdCA9IGFwX2FwcGVuZF9hcnJheXMocCwgYWRkLT5pZ25fbGlzdCwgYmFzZS0+aWduX2xpc3QpOwotICAgIG5ldy0+aGRyX2xpc3QgPSBhcF9hcHBlbmRfYXJyYXlzKHAsIGFkZC0+aGRyX2xpc3QsIGJhc2UtPmhkcl9saXN0KTsKLSAgICBuZXctPmRlc2NfbGlzdCA9IGFwX2FwcGVuZF9hcnJheXMocCwgYWRkLT5kZXNjX2xpc3QsIGJhc2UtPmRlc2NfbGlzdCk7Ci0gICAgbmV3LT5pY29uX2xpc3QgPSBhcF9hcHBlbmRfYXJyYXlzKHAsIGFkZC0+aWNvbl9saXN0LCBiYXNlLT5pY29uX2xpc3QpOwotICAgIG5ldy0+cmRtZV9saXN0ID0gYXBfYXBwZW5kX2FycmF5cyhwLCBhZGQtPnJkbWVfbGlzdCwgYmFzZS0+cmRtZV9saXN0KTsKLSAgICBpZiAoYWRkLT5vcHRzICYgTk9fT1BUSU9OUykgewotCS8qCi0JICogSWYgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHNheXMgJ25vIG9wdGlvbnMnIHRoZW4gd2UgYWxzbwotCSAqIGNsZWFyIGFueSBpbmNyZW1lbnRhbCBtb2RzIGZyb20gYmVpbmcgaW5oZXJpdGFibGUgZnVydGhlciBkb3duLgotCSAqLwotCW5ldy0+b3B0cyA9IE5PX09QVElPTlM7Ci0JbmV3LT5pbmNyZW1lbnRlZF9vcHRzID0gMDsKLQluZXctPmRlY3JlbWVudGVkX29wdHMgPSAwOwotICAgIH0KLSAgICBlbHNlIHsKLQkvKgotCSAqIElmIHRoZXJlIHdlcmUgYW55IG5vbmluY3JlbWVudGFsIG9wdGlvbnMgc2VsZWN0ZWQgZm9yCi0JICogdGhpcyBkaXJlY3RvcnksIHRoZXkgZG9taW5hdGUgYW5kIHdlIGRvbid0IGluaGVyaXQgKmFueXRoaW5nLioKLQkgKiBDb250cmFyaXdpc2UsIHdlICpkbyogaW5oZXJpdCBpZiB0aGUgb25seSBzZXR0aW5ncyBoZXJlIGFyZQotCSAqIGluY3JlbWVudGFsIG9uZXMuCi0JICovCi0JaWYgKGFkZC0+b3B0cyA9PSAwKSB7Ci0JICAgIG5ldy0+aW5jcmVtZW50ZWRfb3B0cyA9IChiYXNlLT5pbmNyZW1lbnRlZF9vcHRzIAotCQkJCSAgICAgfCBhZGQtPmluY3JlbWVudGVkX29wdHMpCi0JCSAgICAgICAgICAgICAgICAgICAgJiB+YWRkLT5kZWNyZW1lbnRlZF9vcHRzOwotCSAgICBuZXctPmRlY3JlbWVudGVkX29wdHMgPSAoYmFzZS0+ZGVjcmVtZW50ZWRfb3B0cwotCQkJCSAgICAgfCBhZGQtPmRlY3JlbWVudGVkX29wdHMpOwotCSAgICAvKgotCSAgICAgKiBXZSBtYXkgaGF2ZSBpbmNyZW1lbnRhbCBzZXR0aW5ncywgc28gbWFrZSBzdXJlIHdlIGRvbid0Ci0JICAgICAqIGluYWR2ZXJ0ZW50bHkgaW5oZXJpdCBhbiBJbmRleE9wdGlvbnMgTm9uZSBmcm9tIGFib3ZlLgotCSAgICAgKi8KLQkgICAgbmV3LT5vcHRzID0gKGJhc2UtPm9wdHMgJiB+Tk9fT1BUSU9OUyk7Ci0JfQotCWVsc2UgewotCSAgICAvKgotCSAgICAgKiBUaGVyZSBhcmUgbG9jYWwgbm9uaW5jcmVtZW50YWwgc2V0dGluZ3MsIHdoaWNoIGNsZWFyCi0JICAgICAqIGFsbCBpbmhlcml0YW5jZSBmcm9tIGFib3ZlLiAgVGhleSAqYXJlKiB0aGUgbmV3IGJhc2Ugc2V0dGluZ3MuCi0JICAgICAqLwotCSAgICBuZXctPm9wdHMgPSBhZGQtPm9wdHM7OwotCX0KLQkvKgotCSAqIFdlJ3JlIGd1YXJhbnRlZWQgdGhhdCB0aGVyZSdsbCBiZSBubyBvdmVybGFwIGJldHdlZW4KLQkgKiB0aGUgYWRkLW9wdGlvbnMgYW5kIHRoZSByZW1vdmUtb3B0aW9ucy4KLQkgKi8KLQluZXctPm9wdHMgfD0gbmV3LT5pbmNyZW1lbnRlZF9vcHRzOwotCW5ldy0+b3B0cyAmPSB+bmV3LT5kZWNyZW1lbnRlZF9vcHRzOwotICAgIH0KLSAgICAvKgotICAgICAqIEluaGVyaXQgdGhlIE5hbWVXaWR0aCBzZXR0aW5ncyBpZiB0aGVyZSBhcmVuJ3QgYW55IHNwZWNpZmljIHRvCi0gICAgICogdGhlIG5ldyBsb2NhdGlvbjsgb3RoZXJ3aXNlIHdlJ2xsIGVuZCB1cCB1c2luZyB0aGUgZGVmYXVsdHMgc2V0IGluIHRoZQotICAgICAqIGNvbmZpZy1yZWMgY3JlYXRpb24gcm91dGluZS4KLSAgICAgKi8KLSAgICBpZiAoYWRkLT5uYW1lX2FkanVzdCA9PSBLX1VOU0VUKSB7Ci0JbmV3LT5uYW1lX3dpZHRoID0gYmFzZS0+bmFtZV93aWR0aDsKLQluZXctPm5hbWVfYWRqdXN0ID0gYmFzZS0+bmFtZV9hZGp1c3Q7Ci0gICAgfQotICAgIGVsc2UgewotCW5ldy0+bmFtZV93aWR0aCA9IGFkZC0+bmFtZV93aWR0aDsKLQluZXctPm5hbWVfYWRqdXN0ID0gYWRkLT5uYW1lX2FkanVzdDsKLSAgICB9Ci0KLSAgICBuZXctPmRlZmF1bHRfb3JkZXIgPSAoYWRkLT5kZWZhdWx0X29yZGVyICE9IE5VTEwpCi0JPyBhZGQtPmRlZmF1bHRfb3JkZXIgOiBiYXNlLT5kZWZhdWx0X29yZGVyOwotICAgIHJldHVybiBuZXc7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTG9va2luZyB0aGluZ3MgdXAgaW4gY29uZmlnIGVudHJpZXMuLi4KLSAqLwotCi0vKiBTdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGVudHJpZXMgd2hlbiB3ZSdyZSBhY3R1YWxseSBidWlsZGluZyBhbiBpbmRleCAqLwotCi1zdHJ1Y3QgZW50IHsKLSAgICBjaGFyICpuYW1lOwotICAgIGNoYXIgKmljb247Ci0gICAgY2hhciAqYWx0OwotICAgIGNoYXIgKmRlc2M7Ci0gICAgb2ZmX3Qgc2l6ZTsKLSAgICBhcF90aW1lX3QgbG07Ci0gICAgc3RydWN0IGVudCAqbmV4dDsKLSAgICBpbnQgYXNjZW5kaW5nOwotICAgIGNoYXIga2V5OwotfTsKLQotc3RhdGljIGNoYXIgKmZpbmRfaXRlbShyZXF1ZXN0X3JlYyAqciwgYXBfYXJyYXlfaGVhZGVyX3QgKmxpc3QsIGludCBwYXRoX29ubHkpCi17Ci0gICAgY29uc3QgY2hhciAqY29udGVudF90eXBlID0gci0+Y29udGVudF90eXBlOwotICAgIGNvbnN0IGNoYXIgKmNvbnRlbnRfZW5jb2RpbmcgPSByLT5jb250ZW50X2VuY29kaW5nOwotICAgIGNoYXIgKnBhdGggPSByLT5maWxlbmFtZTsKLQotICAgIHN0cnVjdCBpdGVtICppdGVtcyA9IChzdHJ1Y3QgaXRlbSAqKSBsaXN0LT5lbHRzOwotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGxpc3QtPm5lbHRzOyArK2kpIHsKLQlzdHJ1Y3QgaXRlbSAqcCA9ICZpdGVtc1tpXTsKLQotCS8qIFNwZWNpYWwgY2FzZWQgZm9yIF5eRElSRUNUT1JZXl4gYW5kIF5eQkxBTktJQ09OXl4gKi8KLQlpZiAoKHBhdGhbMF0gPT0gJ14nKSB8fCAoIWFwX3N0cmNtcF9tYXRjaChwYXRoLCBwLT5hcHBseV9wYXRoKSkpIHsKLQkgICAgaWYgKCEqKHAtPmFwcGx5X3RvKSkgewotCQlyZXR1cm4gcC0+ZGF0YTsKLQkgICAgfQotCSAgICBlbHNlIGlmIChwLT50eXBlID09IEJZX1BBVEggfHwgcGF0aFswXSA9PSAnXicpIHsKLQkgICAgICAgIGlmICghYXBfc3RyY21wX21hdGNoKHBhdGgsIHAtPmFwcGx5X3RvKSkgewotCQkgICAgcmV0dXJuIHAtPmRhdGE7Ci0JCX0KLQkgICAgfQotCSAgICBlbHNlIGlmICghcGF0aF9vbmx5KSB7Ci0JCWlmICghY29udGVudF9lbmNvZGluZykgewotCQkgICAgaWYgKHAtPnR5cGUgPT0gQllfVFlQRSkgewotCQkJaWYgKGNvbnRlbnRfdHlwZQotCQkJICAgICYmICFhcF9zdHJjYXNlY21wX21hdGNoKGNvbnRlbnRfdHlwZSwKLQkJCQkJCSAgICBwLT5hcHBseV90bykpIHsKLQkJCSAgICByZXR1cm4gcC0+ZGF0YTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCQllbHNlIHsKLQkJICAgIGlmIChwLT50eXBlID09IEJZX0VOQ09ESU5HKSB7Ci0JCQlpZiAoIWFwX3N0cmNhc2VjbXBfbWF0Y2goY29udGVudF9lbmNvZGluZywKLQkJCQkJCSBwLT5hcHBseV90bykpIHsKLQkJCSAgICByZXR1cm4gcC0+ZGF0YTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotI2RlZmluZSBmaW5kX2ljb24oZCxwLHQpIGZpbmRfaXRlbShwLGQtPmljb25fbGlzdCx0KQotI2RlZmluZSBmaW5kX2FsdChkLHAsdCkgZmluZF9pdGVtKHAsZC0+YWx0X2xpc3QsdCkKLSNkZWZpbmUgZmluZF9oZWFkZXIoZCxwKSBmaW5kX2l0ZW0ocCxkLT5oZHJfbGlzdCwwKQotI2RlZmluZSBmaW5kX3JlYWRtZShkLHApIGZpbmRfaXRlbShwLGQtPnJkbWVfbGlzdCwwKQotCi1zdGF0aWMgY2hhciAqZmluZF9kZWZhdWx0X2ljb24oYXV0b2luZGV4X2NvbmZpZ19yZWMgKmQsIGNoYXIgKmJvZ3VzX25hbWUpCi17Ci0gICAgcmVxdWVzdF9yZWMgcjsKLQotICAgIC8qIEJsZWFoLiAgSSB0cmllZCB0byBjbGVhbiB1cCBmaW5kX2l0ZW0sIGFuZCBpdCBsZWFkIHRvIHRoaXMgYml0Ci0gICAgICogb2YgdWdsaW5lc3MuICAgTm90ZSB0aGF0IHRoZSBmaWVsZHMgaW5pdGlhbGl6ZWQgYXJlIHByZWNpc2VseQotICAgICAqIHRob3NlIHRoYXQgZmluZF9pdGVtIGxvb2tzIGF0Li4uCi0gICAgICovCi0KLSAgICByLmZpbGVuYW1lID0gYm9ndXNfbmFtZTsKLSAgICByLmNvbnRlbnRfdHlwZSA9IHIuY29udGVudF9lbmNvZGluZyA9IE5VTEw7Ci0KLSAgICByZXR1cm4gZmluZF9pdGVtKCZyLCBkLT5pY29uX2xpc3QsIDEpOwotfQotCi0vKgotICogTG9vayB0aHJvdWdoIHRoZSBsaXN0IG9mIHBhdHRlcm4vZGVzY3JpcHRpb24gcGFpcnMgYW5kIHJldHVybiB0aGUgZmlyc3Qgb25lCi0gKiBpZiBhbnkpIHRoYXQgbWF0Y2hlcyB0aGUgZmlsZW5hbWUgaW4gdGhlIHJlcXVlc3QuICBJZiBtdWx0aXBsZSBwYXR0ZXJucwotICogbWF0Y2gsIG9ubHkgdGhlIGZpcnN0IG9uZSBpcyB1c2VkOyBzaW5jZSB0aGUgb3JkZXIgaW4gdGhlIGFycmF5IGlzIHRoZQotICogc2FtZSBhcyB0aGUgb3JkZXIgaW4gd2hpY2ggZGlyZWN0aXZlcyB3ZXJlIHByb2Nlc3NlZCwgZWFybGllciBtYXRjaGluZwotICogZGlyZWN0aXZlcyB3aWxsIGRvbWluYXRlLgotICovCi0KLSNpZmRlZiBDQVNFX0JMSU5EX0ZJTEVTWVNURU0KLSNkZWZpbmUgTUFUQ0hfRkxBR1MgRk5NX0NBU0VfQkxJTkQKLSNlbHNlCi0jZGVmaW5lIE1BVENIX0ZMQUdTIDAKLSNlbmRpZgotCi1zdGF0aWMgY2hhciAqZmluZF9kZXNjKGF1dG9pbmRleF9jb25maWdfcmVjICpkY2ZnLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpbnQgaTsKLSAgICBhaV9kZXNjX3QgKmxpc3QgPSAoYWlfZGVzY190ICopIGRjZmctPmRlc2NfbGlzdC0+ZWx0czsKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZV9mdWxsID0gci0+ZmlsZW5hbWU7Ci0gICAgY29uc3QgY2hhciAqZmlsZW5hbWVfb25seTsKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLQotICAgIC8qCi0gICAgICogSWYgdGhlIGZpbGVuYW1lIGluY2x1ZGVzIGEgcGF0aCwgZXh0cmFjdCBqdXN0IHRoZSBuYW1lIGl0c2VsZgotICAgICAqIGZvciB0aGUgc2ltcGxlIG1hdGNoZXMuCi0gICAgICovCi0gICAgaWYgKChmaWxlbmFtZV9vbmx5ID0gc3RycmNocihmaWxlbmFtZV9mdWxsLCAnLycpKSA9PSBOVUxMKSB7Ci0JZmlsZW5hbWVfb25seSA9IGZpbGVuYW1lX2Z1bGw7Ci0gICAgfQotICAgIGVsc2UgewotCWZpbGVuYW1lX29ubHkrKzsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IGRjZmctPmRlc2NfbGlzdC0+bmVsdHM7ICsraSkgewotCWFpX2Rlc2NfdCAqdHVwbGUgPSAmbGlzdFtpXTsKLQlpbnQgZm91bmQ7Ci0KLQkvKgotCSAqIE9ubHkgdXNlIHRoZSBmdWxsLXBhdGggZmlsZW5hbWUgaWYgdGhlIHBhdHRlcm4gY29udGFpbnMgJy8ncy4KLQkgKi8KLQlmaWxlbmFtZSA9ICh0dXBsZS0+ZnVsbF9wYXRoKSA/IGZpbGVuYW1lX2Z1bGwgOiBmaWxlbmFtZV9vbmx5OwotCS8qCi0JICogTWFrZSB0aGUgY29tcGFyaXNvbiB1c2luZyB0aGUgY2hlYXBlc3QgbWV0aG9kOyBvbmx5IGRvCi0JICogd2lsZGNhcmQgY2hlY2tpbmcgaWYgd2UgbXVzdC4KLQkgKi8KLQlpZiAodHVwbGUtPndpbGRjYXJkcykgewotCSAgICBmb3VuZCA9IChhcF9mbm1hdGNoKHR1cGxlLT5wYXR0ZXJuLCBmaWxlbmFtZSwgTUFUQ0hfRkxBR1MpID09IDApOwotCX0KLQllbHNlIHsKLQkgICAgZm91bmQgPSAoc3Ryc3RyKGZpbGVuYW1lLCB0dXBsZS0+cGF0dGVybikgIT0gTlVMTCk7Ci0JfQotCWlmIChmb3VuZCkgewotCSAgICByZXR1cm4gdHVwbGUtPmRlc2NyaXB0aW9uOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgaWdub3JlX2VudHJ5KGF1dG9pbmRleF9jb25maWdfcmVjICpkLCBjaGFyICpwYXRoKQotewotICAgIGFwX2FycmF5X2hlYWRlcl90ICpsaXN0ID0gZC0+aWduX2xpc3Q7Ci0gICAgc3RydWN0IGl0ZW0gKml0ZW1zID0gKHN0cnVjdCBpdGVtICopIGxpc3QtPmVsdHM7Ci0gICAgY2hhciAqdHQ7Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoKHR0ID0gc3RycmNocihwYXRoLCAnLycpKSA9PSBOVUxMKSB7Ci0JdHQgPSBwYXRoOwotICAgIH0KLSAgICBlbHNlIHsKLQl0dCsrOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0LT5uZWx0czsgKytpKSB7Ci0Jc3RydWN0IGl0ZW0gKnAgPSAmaXRlbXNbaV07Ci0JY2hhciAqYXA7Ci0KLQlpZiAoKGFwID0gc3RycmNocihwLT5hcHBseV90bywgJy8nKSkgPT0gTlVMTCkgewotCSAgICBhcCA9IHAtPmFwcGx5X3RvOwotCX0KLQllbHNlIHsKLQkgICAgYXArKzsKLQl9Ci0KLSNpZm5kZWYgQ0FTRV9CTElORF9GSUxFU1lTVEVNCi0JaWYgKCFhcF9zdHJjbXBfbWF0Y2gocGF0aCwgcC0+YXBwbHlfcGF0aCkKLQkgICAgJiYgIWFwX3N0cmNtcF9tYXRjaCh0dCwgYXApKSB7Ci0JICAgIHJldHVybiAxOwotCX0KLSNlbHNlICAvKiAhQ0FTRV9CTElORF9GSUxFU1lTVEVNICovCi0JLyoKLQkgKiBPbiBzb21lIHBsYXRmb3JtcywgdGhlIG1hdGNoIG11c3QgYmUgY2FzZS1ibGluZC4gIFRoaXMgaXMgcmVhbGx5Ci0JICogYSBmYWN0b3Igb2YgdGhlIGZpbGVzeXN0ZW0gaW52b2x2ZWQsIGJ1dCB3ZSBjYW4ndCBkZXRlY3QgdGhhdAotCSAqIHJlbGlhYmx5IC0gc28gd2UgaGF2ZSB0byBncmFudWxhcmlzZSBhdCB0aGUgT1MgbGV2ZWwuCi0JICovCi0JaWYgKCFhcF9zdHJjYXNlY21wX21hdGNoKHBhdGgsIHAtPmFwcGx5X3BhdGgpCi0JICAgICYmICFhcF9zdHJjYXNlY21wX21hdGNoKHR0LCBhcCkpIHsKLQkgICAgcmV0dXJuIDE7Ci0JfQotI2VuZGlmIC8qICFDQVNFX0JMSU5EX0ZJTEVTWVNURU0gKi8KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEFjdHVhbGx5IGdlbmVyYXRpbmcgb3V0cHV0Ci0gKi8KLQotLyoKLSAqIEVsZW1lbnRzIG9mIHRoZSBlbWl0dGVkIGRvY3VtZW50OgotICoJUHJlYW1ibGUKLSAqCQlFbWl0dGVkIHVubGVzcyBTVVBQUkVTU19QUkVBTUJMRSBpcyBzZXQgQU5EIGFwX3J1bl9zdWJfcmVxCi0gKgkJc3VjY2VlZHMgZm9yIHRoZSAoY29udGVudF90eXBlID09IHRleHQvaHRtbCkgaGVhZGVyIGZpbGUuCi0gKglIZWFkZXIgZmlsZQotICoJCUVtaXR0ZWQgaWYgZm91bmQgKGFuZCBhYmxlKS4KLSAqCUgxIHRhZyBsaW5lCi0gKgkJRW1pdHRlZCBpZiBhIGhlYWRlciBmaWxlIGlzIE5PVCBlbWl0dGVkLgotICoJRGlyZWN0b3J5IHN0dWZmCi0gKgkJQWx3YXlzIGVtaXR0ZWQuCi0gKglIUgotICoJCUVtaXR0ZWQgaWYgRkFOQ1lfSU5ERVhJTkcgaXMgc2V0LgotICoJUmVhZG1lIGZpbGUKLSAqCQlFbWl0dGVkIGlmIGZvdW5kIChhbmQgYWJsZSkuCi0gKglTZXJ2ZXJTaWcKLSAqCQlFbWl0dGVkIGlmIFNlcnZlclNpZ25hdHVyZSBpcyBub3QgT2ZmIEFORCBhIHJlYWRtZSBmaWxlCi0gKgkJaXMgTk9UIGVtaXR0ZWQuCi0gKglQb3N0YW1ibGUKLSAqCQlFbWl0dGVkIHVubGVzcyBTVVBQUkVTU19QUkVBTUJMRSBpcyBzZXQgQU5EIGFwX3J1bl9zdWJfcmVxCi0gKgkJc3VjY2VlZHMgZm9yIHRoZSAoY29udGVudF90eXBlID09IHRleHQvaHRtbCkgcmVhZG1lIGZpbGUuCi0gKi8KLQotCi0vKgotICogZW1pdCBhIHBsYWluIHRleHQgZmlsZQotICovCi1zdGF0aWMgdm9pZCBkb19lbWl0X3BsYWluKHJlcXVlc3RfcmVjICpyLCBhcF9maWxlX3QgKmYpCi17Ci0gICAgY2hhciBidWZbSU9CVUZTSVpFICsgMV07Ci0gICAgaW50IGksIGMsIGNoOwotICAgIGFwX3NzaXplX3QgbjsKLSAgICBhcF9zdGF0dXNfdCBzdGF0OwotCi0gICAgYXBfcnB1dHMoIjxQUkU+XG4iLCByKTsKLSAgICB3aGlsZSAoIWFwX2VvZihmKSkgewotCWRvIHsKLSAgICAgICAgICAgIG4gPSBzaXplb2YoY2hhcikgKiBJT0JVRlNJWkU7Ci0JICAgIHN0YXQgPSBhcF9yZWFkKGYsIGJ1ZiwgJm4pOwotCX0KLQl3aGlsZSAoc3RhdCAhPSBBUFJfU1VDQ0VTUyAmJiBzdGF0ID09IEVJTlRSKTsKLQlpZiAobiA9PSAtMSB8fCBuID09IDApIHsKLQkgICAgYnJlYWs7Ci0JfQotCWJ1ZltuXSA9ICdcMCc7Ci0JYyA9IDA7Ci0Jd2hpbGUgKGMgPCBuKSB7Ci0JICAgIGZvciAoaSA9IGM7IGkgPCBuOyBpKyspIHsKLQkJaWYgKGJ1ZltpXSA9PSAnPCcgfHwgYnVmW2ldID09ICc+JyB8fCBidWZbaV0gPT0gJyYnKSB7Ci0JCSAgICBicmVhazsKLQkJfQotCSAgICB9Ci0JICAgIGNoID0gYnVmW2ldOwotCSAgICBidWZbaV0gPSAnXDAnOwotCSAgICBhcF9ycHV0cygmYnVmW2NdLCByKTsKLQkgICAgaWYgKGNoID09ICc8JykgewotCQlhcF9ycHV0cygiJmx0OyIsIHIpOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKGNoID09ICc+JykgewotCQlhcF9ycHV0cygiJmd0OyIsIHIpOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKGNoID09ICcmJykgewotCQlhcF9ycHV0cygiJmFtcDsiLCByKTsKLQkgICAgfQotCSAgICBjID0gaSArIDE7Ci0JfQotICAgIH0KLSAgICBhcF9ycHV0cygiPC9QUkU+XG4iLCByKTsKLX0KLQotLyoKLSAqIEhhbmRsZSB0aGUgcHJlYW1ibGUgdGhyb3VnaCB0aGUgSDEgdGFnIGxpbmUsIGluY2x1c2l2ZS4gIExvY2F0ZQotICogdGhlIGZpbGUgd2l0aCBhIHN1YnJlcXVlc3RzLiAgUHJvY2VzcyB0ZXh0L2h0bWwgZG9jdW1lbnRzIGJ5IGFjdHVhbGx5Ci0gKiBydW5uaW5nIHRoZSBzdWJyZXF1ZXN0OyB0ZXh0L3h4eCBkb2N1bWVudHMgZ2V0IGNvcGllZCB2ZXJiYXRpbSwKLSAqIGFuZCBhbnkgb3RoZXIgY29udGVudCB0eXBlIGlzIGlnbm9yZWQuICBUaGlzIG1lYW5zIHRoYXQgYSBub24tdGV4dAotICogZG9jdW1lbnQgKHN1Y2ggYXMgSEVBREVSLmdpZikgbWlnaHQgZ2V0IG11bHRpdmlld2VkIGFzIHRoZSByZXN1bHQKLSAqIGluc3RlYWQgb2YgYSB0ZXh0IGRvY3VtZW50LCBtZWFuaW5nIG5vdGhpbmcgd2lsbCBiZSBkaXNwbGF5ZWQsIGJ1dAotICogb2ggd2VsbC4KLSAqLwotc3RhdGljIHZvaWQgZW1pdF9oZWFkKHJlcXVlc3RfcmVjICpyLCBjaGFyICpoZWFkZXJfZm5hbWUsIGludCBzdXBwcmVzc19hbWJsZSwKLQkJICAgICAgY2hhciAqdGl0bGUpCi17Ci0gICAgYXBfZmlsZV90ICpmID0gTlVMTDsKLSAgICByZXF1ZXN0X3JlYyAqcnIgPSBOVUxMOwotICAgIGludCBlbWl0X2FtYmxlID0gMTsKLSAgICBpbnQgZW1pdF9IMSA9IDE7Ci0KLSAgICAvKgotICAgICAqIElmIHRoZXJlJ3MgYSBoZWFkZXIgZmlsZSwgc2VuZCBhIHN1YnJlcXVlc3QgdG8gbG9vayBmb3IgaXQuICBJZiBpdCdzCi0gICAgICogZm91bmQgYW5kIGEgdGV4dCBmaWxlLCBoYW5kbGUgaXQgLS0gb3RoZXJ3aXNlIGZhbGwgdGhyb3VnaCBhbmQKLSAgICAgKiBwcmV0ZW5kIHRoZXJlJ3Mgbm90aGluZyB0aGVyZS4KLSAgICAgKi8KLSAgICBpZiAoKGhlYWRlcl9mbmFtZSAhPSBOVUxMKQotCSYmIChyciA9IGFwX3N1Yl9yZXFfbG9va3VwX3VyaShoZWFkZXJfZm5hbWUsIHIpKQotCSYmIChyci0+c3RhdHVzID09IEhUVFBfT0spCi0JJiYgKHJyLT5maWxlbmFtZSAhPSBOVUxMKQotCSYmIHJyLT5maW5mby5maWxldHlwZSA9PSBBUFJfUkVHKSB7Ci0JLyoKLQkgKiBDaGVjayBmb3IgdGhlIHR3byBzcGVjaWZpYyBjYXNlcyB3ZSBhbGxvdzogdGV4dC9odG1sIGFuZAotCSAqIHRleHQvYW55dGhpbmctZWxzZS4gIFRoZSBmb3JtZXIgaXMgYWxsb3dlZCB0byBiZSBwcm9jZXNzZWQgZm9yCi0JICogU1NJcy4KLQkgKi8KLQlpZiAocnItPmNvbnRlbnRfdHlwZSAhPSBOVUxMKSB7Ci0JICAgIGlmICghc3RyY2FzZWNtcChhcF9maWVsZF9ub3BhcmFtKHItPnBvb2wsIHJyLT5jb250ZW50X3R5cGUpLAotCQkJICAgICJ0ZXh0L2h0bWwiKSkgewotCQkvKiBIb3BlIGV2ZXJ5dGhpbmcgd2lsbCB3b3JrLi4uICovCi0JCWVtaXRfYW1ibGUgPSAwOwotCQllbWl0X0gxID0gMDsKLQotCQlpZiAoISBzdXBwcmVzc19hbWJsZSkgewotCQkgICAgZW1pdF9wcmVhbWJsZShyLCB0aXRsZSk7Ci0JCX0KLQkJLyoKLQkJICogSWYgdGhlcmUncyBhIHByb2JsZW0gcnVubmluZyB0aGUgc3VicmVxdWVzdCwgZGlzcGxheSB0aGUKLQkJICogcHJlYW1ibGUgaWYgd2UgZGlkbid0IGRvIGl0IGJlZm9yZSAtLSB0aGUgaGVhZGVyIGZpbGUKLQkJICogZGlkbid0IGdldCBkaXNwbGF5ZWQuCi0JCSAqLwotCQlpZiAoYXBfcnVuX3N1Yl9yZXEocnIpICE9IE9LKSB7Ci0JCSAgICAvKiBJdCBkaWRuJ3Qgd29yayAqLwotCQkgICAgZW1pdF9hbWJsZSA9IHN1cHByZXNzX2FtYmxlOwotCQkgICAgZW1pdF9IMSA9IDE7Ci0JCX0KLQkgICAgfQotCSAgICBlbHNlIGlmICghc3RybmNhc2VjbXAoInRleHQvIiwgcnItPmNvbnRlbnRfdHlwZSwgNSkpIHsKLQkJLyoKLQkJICogSWYgd2UgY2FuIG9wZW4gdGhlIGZpbGUsIHByZWZpeCBpdCB3aXRoIHRoZSBwcmVhbWJsZQotCQkgKiByZWdhcmRsZXNzOyBzaW5jZSB3ZSdsbCBiZSBzZW5kaW5nIGEgPFBSRT4gYmxvY2sgYXJvdW5kCi0JCSAqIHRoZSBmaWxlJ3MgY29udGVudHMsIGFueSBIVE1MIGhlYWRlciBpdCBoYWQgd29uJ3QgZW5kIHVwCi0JCSAqIHdoZXJlIGl0IGJlbG9uZ3MuCi0JCSAqLwotCQlpZiAoYXBfb3BlbigmZiwgcnItPmZpbGVuYW1lLCBBUFJfUkVBRCB8IEFQUl9CVUZGRVJFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUFJfT1NfREVGQVVMVCwgci0+cG9vbCkgPT0gQVBSX1NVQ0NFU1MpIHsKLQkJICAgIGVtaXRfcHJlYW1ibGUociwgdGl0bGUpOwotCQkgICAgZW1pdF9hbWJsZSA9IDA7Ci0JCSAgICBkb19lbWl0X3BsYWluKHIsIGYpOwotCQkgICAgYXBfY2xvc2UoZik7Ci0JCSAgICBlbWl0X0gxID0gMDsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIGlmIChlbWl0X2FtYmxlKSB7Ci0JZW1pdF9wcmVhbWJsZShyLCB0aXRsZSk7Ci0gICAgfQotICAgIGlmIChlbWl0X0gxKSB7Ci0JYXBfcnZwdXRzKHIsICI8SDE+SW5kZXggb2YgIiwgdGl0bGUsICI8L0gxPlxuIiwgTlVMTCk7Ci0gICAgfQotICAgIGlmIChyciAhPSBOVUxMKSB7Ci0JYXBfZGVzdHJveV9zdWJfcmVxKHJyKTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIEhhbmRsZSB0aGUgUmVhZG1lIGZpbGUgdGhyb3VnaCB0aGUgcG9zdGFtYmxlLCBpbmNsdXNpdmUuICBMb2NhdGUKLSAqIHRoZSBmaWxlIHdpdGggYSBzdWJyZXF1ZXN0cy4gIFByb2Nlc3MgdGV4dC9odG1sIGRvY3VtZW50cyBieSBhY3R1YWxseQotICogcnVubmluZyB0aGUgc3VicmVxdWVzdDsgdGV4dC94eHggZG9jdW1lbnRzIGdldCBjb3BpZWQgdmVyYmF0aW0sCi0gKiBhbmQgYW55IG90aGVyIGNvbnRlbnQgdHlwZSBpcyBpZ25vcmVkLiAgVGhpcyBtZWFucyB0aGF0IGEgbm9uLXRleHQKLSAqIGRvY3VtZW50IChzdWNoIGFzIEZPT1RFUi5naWYpIG1pZ2h0IGdldCBtdWx0aXZpZXdlZCBhcyB0aGUgcmVzdWx0Ci0gKiBpbnN0ZWFkIG9mIGEgdGV4dCBkb2N1bWVudCwgbWVhbmluZyBub3RoaW5nIHdpbGwgYmUgZGlzcGxheWVkLCBidXQKLSAqIG9oIHdlbGwuCi0gKi8KLXN0YXRpYyB2b2lkIGVtaXRfdGFpbChyZXF1ZXN0X3JlYyAqciwgY2hhciAqcmVhZG1lX2ZuYW1lLCBpbnQgc3VwcHJlc3NfYW1ibGUpCi17Ci0gICAgYXBfZmlsZV90ICpmID0gTlVMTDsKLSAgICByZXF1ZXN0X3JlYyAqcnIgPSBOVUxMOwotICAgIGludCBzdXBwcmVzc19wb3N0ID0gMDsKLSAgICBpbnQgc3VwcHJlc3Nfc2lnID0gMDsKLQotICAgIC8qCi0gICAgICogSWYgdGhlcmUncyBhIHJlYWRtZSBmaWxlLCBzZW5kIGEgc3VicmVxdWVzdCB0byBsb29rIGZvciBpdC4gIElmIGl0J3MKLSAgICAgKiBmb3VuZCBhbmQgYSB0ZXh0IGZpbGUsIGhhbmRsZSBpdCAtLSBvdGhlcndpc2UgZmFsbCB0aHJvdWdoIGFuZAotICAgICAqIHByZXRlbmQgdGhlcmUncyBub3RoaW5nIHRoZXJlLgotICAgICAqLwotICAgIGlmICgocmVhZG1lX2ZuYW1lICE9IE5VTEwpCi0JJiYgKHJyID0gYXBfc3ViX3JlcV9sb29rdXBfdXJpKHJlYWRtZV9mbmFtZSwgcikpCi0JJiYgKHJyLT5zdGF0dXMgPT0gSFRUUF9PSykKLQkmJiAocnItPmZpbGVuYW1lICE9IE5VTEwpCi0JJiYgcnItPmZpbmZvLmZpbGV0eXBlID09IEFQUl9SRUcpIHsKLQkvKgotCSAqIENoZWNrIGZvciB0aGUgdHdvIHNwZWNpZmljIGNhc2VzIHdlIGFsbG93OiB0ZXh0L2h0bWwgYW5kCi0JICogdGV4dC9hbnl0aGluZy1lbHNlLiAgVGhlIGZvcm1lciBpcyBhbGxvd2VkIHRvIGJlIHByb2Nlc3NlZCBmb3IKLQkgKiBTU0lzLgotCSAqLwotCWlmIChyci0+Y29udGVudF90eXBlICE9IE5VTEwpIHsKLQkgICAgaWYgKCFzdHJjYXNlY21wKGFwX2ZpZWxkX25vcGFyYW0oci0+cG9vbCwgcnItPmNvbnRlbnRfdHlwZSksCi0JCQkgICAgInRleHQvaHRtbCIpKSB7Ci0JCWlmIChhcF9ydW5fc3ViX3JlcShycikgPT0gT0spIHsKLQkJICAgIC8qIHdvcmtlZC4uLiAqLwotCQkgICAgc3VwcHJlc3Nfc2lnID0gMTsKLQkJICAgIHN1cHByZXNzX3Bvc3QgPSBzdXBwcmVzc19hbWJsZTsKLQkJfQotCSAgICB9Ci0JICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgidGV4dC8iLCByci0+Y29udGVudF90eXBlLCA1KSkgewotCQkvKgotCQkgKiBJZiB3ZSBjYW4gb3BlbiB0aGUgZmlsZSwgc3VwcHJlc3MgdGhlIHNpZ25hdHVyZS4KLQkJICovCi0JCWlmIChhcF9vcGVuKCZmLCByci0+ZmlsZW5hbWUsIEFQUl9SRUFEIHwgQVBSX0JVRkZFUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQUl9PU19ERUZBVUxULCByLT5wb29sKSA9PSBBUFJfU1VDQ0VTUykgewotCQkgICAgZG9fZW1pdF9wbGFpbihyLCBmKTsKLQkJICAgIGFwX2Nsb3NlKGYpOwotCQkgICAgc3VwcHJlc3Nfc2lnID0gMTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgICAKLSAgICBpZiAoIXN1cHByZXNzX3NpZykgewotCWFwX3JwdXRzKGFwX3BzaWduYXR1cmUoIiIsIHIpLCByKTsKLSAgICB9Ci0gICAgaWYgKCFzdXBwcmVzc19wb3N0KSB7Ci0JYXBfcnB1dHMoIjwvQk9EWT48L0hUTUw+XG4iLCByKTsKLSAgICB9Ci0gICAgaWYgKHJyICE9IE5VTEwpIHsKLQlhcF9kZXN0cm95X3N1Yl9yZXEocnIpOwotICAgIH0KLX0KLQotCi1zdGF0aWMgY2hhciAqZmluZF90aXRsZShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjaGFyIHRpdGxlYnVmW01BWF9TVFJJTkdfTEVOXSwgKmZpbmQgPSAiPFRJVExFPiI7Ci0gICAgYXBfZmlsZV90ICp0aGVmaWxlID0gTlVMTDsKLSAgICBpbnQgeCwgeSwgcDsKLSAgICBhcF9zc2l6ZV90IG47Ci0KLSAgICBpZiAoci0+c3RhdHVzICE9IEhUVFBfT0spIHsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKChyLT5jb250ZW50X3R5cGUgIT0gTlVMTCkKLQkmJiAoIXN0cmNhc2VjbXAoYXBfZmllbGRfbm9wYXJhbShyLT5wb29sLCByLT5jb250ZW50X3R5cGUpLAotCQkJInRleHQvaHRtbCIpCi0JICAgIHx8ICFzdHJjbXAoci0+Y29udGVudF90eXBlLCBJTkNMVURFU19NQUdJQ19UWVBFKSkKLQkmJiAhci0+Y29udGVudF9lbmNvZGluZykgewotICAgICAgICBpZiAoYXBfb3BlbigmdGhlZmlsZSwgci0+ZmlsZW5hbWUsIEFQUl9SRUFEIHwgQVBSX0JVRkZFUkVELAotICAgICAgICAgICAgICAgICAgICBBUFJfT1NfREVGQVVMVCwgci0+cG9vbCkgIT0gQVBSX1NVQ0NFU1MpIHsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgICBuID0gc2l6ZW9mKGNoYXIpICogKE1BWF9TVFJJTkdfTEVOIC0gMSk7Ci0JYXBfcmVhZCh0aGVmaWxlLCB0aXRsZWJ1ZiwgJm4pOwotCWlmIChuIDw9IDApIHsKLQkgICAgYXBfY2xvc2UodGhlZmlsZSk7Ci0JICAgIHJldHVybiBOVUxMOwotCX0KLQl0aXRsZWJ1ZltuXSA9ICdcMCc7Ci0JZm9yICh4ID0gMCwgcCA9IDA7IHRpdGxlYnVmW3hdOyB4KyspIHsKLQkgICAgaWYgKGFwX3RvdXBwZXIodGl0bGVidWZbeF0pID09IGZpbmRbcF0pIHsKLQkJaWYgKCFmaW5kWysrcF0pIHsKLQkJICAgIGlmICgocCA9IGFwX2luZCgmdGl0bGVidWZbKyt4XSwgJzwnKSkgIT0gLTEpIHsKLQkJCXRpdGxlYnVmW3ggKyBwXSA9ICdcMCc7Ci0JCSAgICB9Ci0JCSAgICAvKiBTY2FuIGZvciBsaW5lIGJyZWFrcyBmb3IgVGFubW95J3Mgc2VjcmV0YXJ5ICovCi0JCSAgICBmb3IgKHkgPSB4OyB0aXRsZWJ1Zlt5XTsgeSsrKSB7Ci0JCQlpZiAoKHRpdGxlYnVmW3ldID09IENSKSB8fCAodGl0bGVidWZbeV0gPT0gTEYpKSB7Ci0JCQkgICAgaWYgKHkgPT0geCkgewotCQkJCXgrKzsKLQkJCSAgICB9Ci0JCQkgICAgZWxzZSB7Ci0JCQkJdGl0bGVidWZbeV0gPSAnICc7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQkgICAgYXBfY2xvc2UodGhlZmlsZSk7Ci0JCSAgICByZXR1cm4gYXBfcHN0cmR1cChyLT5wb29sLCAmdGl0bGVidWZbeF0pOwotCQl9Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCXAgPSAwOwotCSAgICB9Ci0JfQotCWFwX2Nsb3NlKHRoZWZpbGUpOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdCBlbnQgKm1ha2VfYXV0b2luZGV4X2VudHJ5KGNoYXIgKm5hbWUsIGludCBhdXRvaW5kZXhfb3B0cywKLQkJCQkJYXV0b2luZGV4X2NvbmZpZ19yZWMgKmQsCi0JCQkJCXJlcXVlc3RfcmVjICpyLCBjaGFyIGtleWlkLAotCQkJCQljaGFyIGRpcmVjdGlvbikKLXsKLSAgICBzdHJ1Y3QgZW50ICpwOwotCi0gICAgaWYgKChuYW1lWzBdID09ICcuJykgJiYgKCFuYW1lWzFdKSkgewotCXJldHVybiAoTlVMTCk7Ci0gICAgfQotCi0gICAgaWYgKGlnbm9yZV9lbnRyeShkLCBhcF9tYWtlX2Z1bGxfcGF0aChyLT5wb29sLCByLT5maWxlbmFtZSwgbmFtZSkpKSB7Ci0gICAgICAgIHJldHVybiAoTlVMTCk7Ci0gICAgfQotCi0gICAgcCA9IChzdHJ1Y3QgZW50ICopIGFwX3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKHN0cnVjdCBlbnQpKTsKLSAgICBwLT5uYW1lID0gYXBfcHN0cmR1cChyLT5wb29sLCBuYW1lKTsKLSAgICBwLT5zaXplID0gLTE7Ci0gICAgcC0+aWNvbiA9IE5VTEw7Ci0gICAgcC0+YWx0ID0gTlVMTDsKLSAgICBwLT5kZXNjID0gTlVMTDsKLSAgICBwLT5sbSA9IC0xOwotICAgIHAtPmtleSA9IGFwX3RvdXBwZXIoa2V5aWQpOwotICAgIHAtPmFzY2VuZGluZyA9IChhcF90b3VwcGVyKGRpcmVjdGlvbikgPT0gRF9BU0NFTkRJTkcpOwotCi0gICAgaWYgKGF1dG9pbmRleF9vcHRzICYgRkFOQ1lfSU5ERVhJTkcpIHsKLSAgICAgICAgcmVxdWVzdF9yZWMgKnJyID0gYXBfc3ViX3JlcV9sb29rdXBfZmlsZShuYW1lLCByKTsKLQotCWlmIChyci0+ZmluZm8ucHJvdGVjdGlvbiAhPSAwKSB7Ci0JICAgIHAtPmxtID0gcnItPmZpbmZvLm10aW1lOwotCSAgICBpZiAocnItPmZpbmZvLmZpbGV0eXBlID09IEFQUl9ESVIpIHsKLQkgICAgICAgIGlmICghKHAtPmljb24gPSBmaW5kX2ljb24oZCwgcnIsIDEpKSkgewotCQkgICAgcC0+aWNvbiA9IGZpbmRfZGVmYXVsdF9pY29uKGQsICJeXkRJUkVDVE9SWV5eIik7Ci0JCX0KLQkJaWYgKCEocC0+YWx0ID0gZmluZF9hbHQoZCwgcnIsIDEpKSkgewotCQkgICAgcC0+YWx0ID0gIkRJUiI7Ci0JCX0KLQkJcC0+c2l6ZSA9IC0xOwotCQlwLT5uYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCBuYW1lLCAiLyIsIE5VTEwpOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQlwLT5pY29uID0gZmluZF9pY29uKGQsIHJyLCAwKTsKLQkJcC0+YWx0ID0gZmluZF9hbHQoZCwgcnIsIDApOwotCQlwLT5zaXplID0gcnItPmZpbmZvLnNpemU7Ci0JICAgIH0KLQl9Ci0KLQlwLT5kZXNjID0gZmluZF9kZXNjKGQsIHJyKTsKLQotCWlmICgoIXAtPmRlc2MpICYmIChhdXRvaW5kZXhfb3B0cyAmIFNDQU5fSFRNTF9USVRMRVMpKSB7Ci0JICAgIHAtPmRlc2MgPSBhcF9wc3RyZHVwKHItPnBvb2wsIGZpbmRfdGl0bGUocnIpKTsKLQl9Ci0KLQlhcF9kZXN0cm95X3N1Yl9yZXEocnIpOwotICAgIH0KLSAgICAvKgotICAgICAqIFdlIGRvbid0IG5lZWQgdG8gdGFrZSBhbnkgc3BlY2lhbCBhY3Rpb24gZm9yIHRoZSBmaWxlIHNpemUga2V5LiAgSWYKLSAgICAgKiB3ZSBkaWQsIGl0IHdvdWxkIGdvIGhlcmUuCi0gICAgICovCi0gICAgaWYgKGtleWlkID09IEtfTEFTVF9NT0QpIHsKLSAgICAgICAgaWYgKHAtPmxtIDwgMCkgewotCSAgICBwLT5sbSA9IDA7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gKHApOwotfQotCi1zdGF0aWMgY2hhciAqdGVybWluYXRlX2Rlc2NyaXB0aW9uKGF1dG9pbmRleF9jb25maWdfcmVjICpkLCBjaGFyICpkZXNjLAotCQkJCSAgIGludCBhdXRvaW5kZXhfb3B0cykKLXsKLSAgICBpbnQgbWF4c2l6ZSA9IDIzOwotICAgIHJlZ2lzdGVyIGludCB4OwotCi0gICAgaWYgKGF1dG9pbmRleF9vcHRzICYgU1VQUFJFU1NfTEFTVF9NT0QpIHsKLQltYXhzaXplICs9IDE5OwotICAgIH0KLSAgICBpZiAoYXV0b2luZGV4X29wdHMgJiBTVVBQUkVTU19TSVpFKSB7Ci0JbWF4c2l6ZSArPSA3OwotICAgIH0KLQotICAgIGZvciAoeCA9IDA7IGRlc2NbeF0gJiYgKG1heHNpemUgPiAwIHx8IGRlc2NbeF09PSc8Jyk7IHgrKykgewotCWlmIChkZXNjW3hdID09ICc8JykgewotCSAgICB3aGlsZSAoZGVzY1t4XSAhPSAnPicpIHsKLQkJaWYgKCFkZXNjW3hdKSB7Ci0JCSAgICBtYXhzaXplID0gMDsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCSsreDsKLQkgICAgfQotCX0KLSAJZWxzZSBpZiAoZGVzY1t4XSA9PSAnJicpIHsKLSAJICAgIC8qIGVudGl0aWVzIGxpa2UgJmF1bWw7IGNvdW50IGFzIG9uZSBjaGFyYWN0ZXIgKi8KLSAJICAgIC0tbWF4c2l6ZTsKLSAJICAgIGZvciAoIDsgZGVzY1t4XSAhPSAnOyc7ICsreCkgewotIAkJaWYgKGRlc2NbeF0gPT0gJ1wwJykgewotICAgICAgICAgICAgICAgICAgICAgbWF4c2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJfQotCSAgICB9Ci0gICAgICAgIH0KLQllbHNlIHsKLQkgICAgLS1tYXhzaXplOwotCX0KLSAgICB9Ci0gICAgaWYgKCFtYXhzaXplICYmIGRlc2NbeF0gIT0gJ1wwJykgewotCWRlc2NbeCAtIDFdID0gJz4nOwkvKiBHcnVtcC4gKi8KLQlkZXNjW3hdID0gJ1wwJzsJCS8qIERvdWJsZSBHcnVtcCEgKi8KLSAgICB9Ci0gICAgcmV0dXJuIGRlc2M7Ci19Ci0KLS8qCi0gKiBFbWl0IHRoZSBhbmNob3IgZm9yIHRoZSBzcGVjaWZpZWQgZmllbGQuICBJZiBhIGZpZWxkIGlzIHRoZSBrZXkgZm9yIHRoZQotICogY3VycmVudCByZXF1ZXN0LCB0aGUgbGluayBjaGFuZ2VzIGl0cyBtZWFuaW5nIHRvIHJldmVyc2UgdGhlIG9yZGVyIHdoZW4KLSAqIHNlbGVjdGVkIGFnYWluLiAgTm9uLWFjdGl2ZSBmaWVsZHMgYWx3YXlzIHN0YXJ0IGluIGFzY2VuZGluZyBvcmRlci4KLSAqLwotc3RhdGljIHZvaWQgZW1pdF9saW5rKHJlcXVlc3RfcmVjICpyLCBjaGFyICphbmNob3IsIGNoYXIgZm5hbWUsIGNoYXIgY3Vya2V5LAotICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY3VyZGlyZWN0aW9uLCBpbnQgbm9zb3J0KQotewotICAgIGNoYXIgcXZhbHVlWzVdOwotICAgIGludCByZXZlcnNlOwotCi0gICAgaWYgKCFub3NvcnQpIHsKLQlxdmFsdWVbMF0gPSAnPyc7Ci0JcXZhbHVlWzFdID0gZm5hbWU7Ci0JcXZhbHVlWzJdID0gJz0nOwotCXF2YWx1ZVs0XSA9ICdcMCc7Ci0JcmV2ZXJzZSA9ICgoY3Vya2V5ID09IGZuYW1lKSAmJiAoY3VyZGlyZWN0aW9uID09IERfQVNDRU5ESU5HKSk7Ci0JcXZhbHVlWzNdID0gcmV2ZXJzZSA/IERfREVTQ0VORElORyA6IERfQVNDRU5ESU5HOwotCWFwX3J2cHV0cyhyLCAiPEEgSFJFRj1cIiIsIHF2YWx1ZSwgIlwiPiIsIGFuY2hvciwgIjwvQT4iLCBOVUxMKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGFwX3JwdXRzKGFuY2hvciwgcik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBvdXRwdXRfZGlyZWN0b3JpZXMoc3RydWN0IGVudCAqKmFyLCBpbnQgbiwKLQkJCSAgICAgICBhdXRvaW5kZXhfY29uZmlnX3JlYyAqZCwgcmVxdWVzdF9yZWMgKnIsCi0JCQkgICAgICAgaW50IGF1dG9pbmRleF9vcHRzLCBjaGFyIGtleWlkLCBjaGFyIGRpcmVjdGlvbikKLXsKLSAgICBpbnQgeCwgcnY7Ci0gICAgY2hhciAqbmFtZSA9IHItPnVyaTsKLSAgICBjaGFyICp0cDsKLSAgICBpbnQgc3RhdGljX2NvbHVtbnMgPSAoYXV0b2luZGV4X29wdHMgJiBTVVBQUkVTU19DT0xTT1JUKTsKLSAgICBhcF9jb250ZXh0X3QgKnNjcmF0Y2g7Ci0gICAgaW50IG5hbWVfd2lkdGg7Ci0gICAgY2hhciAqbmFtZV9zY3JhdGNoOwotICAgIGNoYXIgKnBhZF9zY3JhdGNoOwotCi0gICAgYXBfY3JlYXRlX2NvbnRleHQoJnNjcmF0Y2gsIHItPnBvb2wpOwotICAgIGlmIChuYW1lWzBdID09ICdcMCcpIHsKLQluYW1lID0gIi8iOwotICAgIH0KLQotICAgIG5hbWVfd2lkdGggPSBkLT5uYW1lX3dpZHRoOwotICAgIGlmIChkLT5uYW1lX2FkanVzdCA9PSBLX0FESlVTVCkgewotCWZvciAoeCA9IDA7IHggPCBuOyB4KyspIHsKLQkgICAgaW50IHQgPSBzdHJsZW4oYXJbeF0tPm5hbWUpOwotCSAgICBpZiAodCA+IG5hbWVfd2lkdGgpIHsKLQkJbmFtZV93aWR0aCA9IHQ7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIG5hbWVfc2NyYXRjaCA9IGFwX3BhbGxvYyhyLT5wb29sLCBuYW1lX3dpZHRoICsgMSk7Ci0gICAgcGFkX3NjcmF0Y2ggPSBhcF9wYWxsb2Moci0+cG9vbCwgbmFtZV93aWR0aCArIDEpOwotICAgIG1lbXNldChwYWRfc2NyYXRjaCwgJyAnLCBuYW1lX3dpZHRoKTsKLSAgICBwYWRfc2NyYXRjaFtuYW1lX3dpZHRoXSA9ICdcMCc7Ci0KLSAgICBpZiAoYXV0b2luZGV4X29wdHMgJiBGQU5DWV9JTkRFWElORykgewotCWFwX3JwdXRzKCI8UFJFPiIsIHIpOwotCWlmICgodHAgPSBmaW5kX2RlZmF1bHRfaWNvbihkLCAiXl5CTEFOS0lDT05eXiIpKSkgewotCSAgICBhcF9ydnB1dHMociwgIjxJTUcgU1JDPVwiIiwgYXBfZXNjYXBlX2h0bWwoc2NyYXRjaCwgdHApLAotCQkgICAiXCIgQUxUPVwiICAgICBcIiIsIE5VTEwpOwotCSAgICBpZiAoZC0+aWNvbl93aWR0aCAmJiBkLT5pY29uX2hlaWdodCkgewotCQlhcF9ycHJpbnRmCi0JCSAgICAoCi0JCQlyLAotCQkJIiBIRUlHSFQ9XCIlZFwiIFdJRFRIPVwiJWRcIiIsCi0JCQlkLT5pY29uX2hlaWdodCwKLQkJCWQtPmljb25fd2lkdGgKLQkJICAgICk7Ci0JICAgIH0KLQkgICAgYXBfcnB1dHMoIj4gIiwgcik7Ci0JfQotICAgICAgICBlbWl0X2xpbmsociwgIk5hbWUiLCBLX05BTUUsIGtleWlkLCBkaXJlY3Rpb24sIHN0YXRpY19jb2x1bW5zKTsKLQlhcF9ycHV0cyhwYWRfc2NyYXRjaCArIDQsIHIpOwotCS8qCi0JICogRW1pdCB0aGUgZ3VhcmFudGVlZC1hdC1sZWFzdC1vbmUtc3BhY2UtYmV0d2Vlbi1jb2x1bW5zIGJ5dGUuCi0JICovCi0JYXBfcnB1dHMoIiAiLCByKTsKLQlpZiAoIShhdXRvaW5kZXhfb3B0cyAmIFNVUFBSRVNTX0xBU1RfTU9EKSkgewotICAgICAgICAgICAgZW1pdF9saW5rKHIsICJMYXN0IG1vZGlmaWVkIiwgS19MQVNUX01PRCwga2V5aWQsIGRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY29sdW1ucyk7Ci0JICAgIGFwX3JwdXRzKCIgICAgICAgIiwgcik7Ci0JfQotCWlmICghKGF1dG9pbmRleF9vcHRzICYgU1VQUFJFU1NfU0laRSkpIHsKLSAgICAgICAgICAgIGVtaXRfbGluayhyLCAiU2l6ZSIsIEtfU0laRSwga2V5aWQsIGRpcmVjdGlvbiwgc3RhdGljX2NvbHVtbnMpOwotCSAgICBhcF9ycHV0cygiICAiLCByKTsKLQl9Ci0JaWYgKCEoYXV0b2luZGV4X29wdHMgJiBTVVBQUkVTU19ERVNDKSkgewotICAgICAgICAgICAgZW1pdF9saW5rKHIsICJEZXNjcmlwdGlvbiIsIEtfREVTQywga2V5aWQsIGRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY29sdW1ucyk7Ci0JfQotCWFwX3JwdXRzKCJcbjxIUj5cbiIsIHIpOwotICAgIH0KLSAgICBlbHNlIHsKLQlhcF9ycHV0cygiPFVMPiIsIHIpOwotICAgIH0KLQotICAgIGZvciAoeCA9IDA7IHggPCBuOyB4KyspIHsKLQljaGFyICphbmNob3IsICp0LCAqdDI7Ci0JaW50IG53aWR0aDsKLQotCWFwX2NsZWFyX3Bvb2woc2NyYXRjaCk7Ci0KLQlpZiAoaXNfcGFyZW50KGFyW3hdLT5uYW1lKSkgewotCSAgICB0ID0gYXBfbWFrZV9mdWxsX3BhdGgoc2NyYXRjaCwgbmFtZSwgIi4uLyIpOwotCSAgICBhcF9nZXRwYXJlbnRzKHQpOwotCSAgICBpZiAodFswXSA9PSAnXDAnKSB7Ci0JCXQgPSAiLyI7Ci0JICAgIH0KLQkgICAgdDIgPSAiUGFyZW50IERpcmVjdG9yeSI7Ci0JICAgIGFuY2hvciA9IGFwX2VzY2FwZV9odG1sKHNjcmF0Y2gsIGFwX29zX2VzY2FwZV9wYXRoKHNjcmF0Y2gsIHQsIDApKTsKLQl9Ci0JZWxzZSB7Ci0JICAgIHQgPSBhclt4XS0+bmFtZTsKLQkgICAgdDIgPSB0OwotCSAgICBhbmNob3IgPSBhcF9lc2NhcGVfaHRtbChzY3JhdGNoLCBhcF9vc19lc2NhcGVfcGF0aChzY3JhdGNoLCB0LCAwKSk7Ci0JfQotCi0JaWYgKGF1dG9pbmRleF9vcHRzICYgRkFOQ1lfSU5ERVhJTkcpIHsKLQkgICAgaWYgKGF1dG9pbmRleF9vcHRzICYgSUNPTlNfQVJFX0xJTktTKSB7Ci0JCWFwX3J2cHV0cyhyLCAiPEEgSFJFRj1cIiIsIGFuY2hvciwgIlwiPiIsIE5VTEwpOwotCSAgICB9Ci0JICAgIGlmICgoYXJbeF0tPmljb24pIHx8IGQtPmRlZmF1bHRfaWNvbikgewotCQlhcF9ydnB1dHMociwgIjxJTUcgU1JDPVwiIiwKLQkJCSAgYXBfZXNjYXBlX2h0bWwoc2NyYXRjaCwKLQkJCQkJIGFyW3hdLT5pY29uID8gYXJbeF0tPmljb24KLQkJCQkJICAgICAgICAgICAgIDogZC0+ZGVmYXVsdF9pY29uKSwKLQkJCSAgIlwiIEFMVD1cIlsiLCAoYXJbeF0tPmFsdCA/IGFyW3hdLT5hbHQgOiAiICAgIiksCi0JCQkgICJdXCIiLCBOVUxMKTsKLQkJaWYgKGQtPmljb25fd2lkdGggJiYgZC0+aWNvbl9oZWlnaHQpIHsKLQkJICAgIGFwX3JwcmludGYociwgIiBIRUlHSFQ9XCIlZFwiIFdJRFRIPVwiJWRcIiIsCi0JCQkgICAgICAgZC0+aWNvbl9oZWlnaHQsIGQtPmljb25fd2lkdGgpOwotCQl9Ci0JCWFwX3JwdXRzKCI+Iiwgcik7Ci0JICAgIH0KLQkgICAgaWYgKGF1dG9pbmRleF9vcHRzICYgSUNPTlNfQVJFX0xJTktTKSB7Ci0JCWFwX3JwdXRzKCI8L0E+Iiwgcik7Ci0JICAgIH0KLQotCSAgICBud2lkdGggPSBzdHJsZW4odDIpOwotCSAgICBpZiAobndpZHRoID4gbmFtZV93aWR0aCkgewotCSAgICAgIG1lbWNweShuYW1lX3NjcmF0Y2gsIHQyLCBuYW1lX3dpZHRoIC0gMyk7Ci0JICAgICAgbmFtZV9zY3JhdGNoW25hbWVfd2lkdGggLSAzXSA9ICcuJzsKLQkgICAgICBuYW1lX3NjcmF0Y2hbbmFtZV93aWR0aCAtIDJdID0gJy4nOwotCSAgICAgIG5hbWVfc2NyYXRjaFtuYW1lX3dpZHRoIC0gMV0gPSAnPic7Ci0JICAgICAgbmFtZV9zY3JhdGNoW25hbWVfd2lkdGhdID0gMDsKLQkgICAgICB0MiA9IG5hbWVfc2NyYXRjaDsKLQkgICAgICBud2lkdGggPSBuYW1lX3dpZHRoOwotCSAgICB9Ci0JICAgIGFwX3J2cHV0cyhyLCAiIDxBIEhSRUY9XCIiLCBhbmNob3IsICJcIj4iLAotCSAgICAgIGFwX2VzY2FwZV9odG1sKHNjcmF0Y2gsIHQyKSwgIjwvQT4iLCBwYWRfc2NyYXRjaCArIG53aWR0aCwKLQkgICAgICBOVUxMKTsKLQkgICAgLyoKLQkgICAgICogVGhlIGJsYW5rIGJlZm9yZSB0aGUgc3Rvcm0uLiBlciwgYmVmb3JlIHRoZSBuZXh0IGZpZWxkLgotCSAgICAgKi8KLQkgICAgYXBfcnB1dHMoIiAiLCByKTsKLQkgICAgaWYgKCEoYXV0b2luZGV4X29wdHMgJiBTVVBQUkVTU19MQVNUX01PRCkpIHsKLQkJaWYgKGFyW3hdLT5sbSAhPSAtMSkgewotCQkgICAgY2hhciB0aW1lX3N0cltNQVhfU1RSSU5HX0xFTl07Ci0JCSAgICBhcF9leHBsb2RlZF90aW1lX3QgdHM7Ci0gICAgICAgICAgICAgICAgICAgIGFwX2V4cGxvZGVfbG9jYWx0aW1lKCZ0cywgYXJbeF0tPmxtKTsKLQkJICAgIGFwX3N0cmZ0aW1lKHRpbWVfc3RyLCAmcnYsIE1BWF9TVFJJTkdfTEVOLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkLSViLSVZICVIOiVNICAiLCAmdHMpOwotCQkgICAgYXBfcnB1dHModGltZV9zdHIsIHIpOwotCQl9Ci0JCWVsc2UgewotCQkgICAgLypMZW5ndGg9IjIyLUZlYi0xOTk4IDIzOjQyICAiIChzZWUgNCBsaW5lcyBhYm92ZSkgKi8KLQkJICAgIGFwX3JwdXRzKCIgICAgICAgICAgICAgICAgICAgIiwgcik7Ci0JCX0KLQkgICAgfQotCSAgICBpZiAoIShhdXRvaW5kZXhfb3B0cyAmIFNVUFBSRVNTX1NJWkUpKSB7Ci0JCWFwX3NlbmRfc2l6ZShhclt4XS0+c2l6ZSwgcik7Ci0JCWFwX3JwdXRzKCIgICIsIHIpOwotCSAgICB9Ci0JICAgIGlmICghKGF1dG9pbmRleF9vcHRzICYgU1VQUFJFU1NfREVTQykpIHsKLQkJaWYgKGFyW3hdLT5kZXNjKSB7Ci0JCSAgICBhcF9ycHV0cyh0ZXJtaW5hdGVfZGVzY3JpcHRpb24oZCwgYXJbeF0tPmRlc2MsCi0JCQkJCQkgICBhdXRvaW5kZXhfb3B0cyksIHIpOwotCQl9Ci0JICAgIH0KLQl9Ci0JZWxzZSB7Ci0JICAgIGFwX3J2cHV0cyhyLCAiPExJPjxBIEhSRUY9XCIiLCBhbmNob3IsICJcIj4gIiwgdDIsCi0JCSAgICAgICI8L0E+IiwgTlVMTCk7Ci0JfQotCWFwX3JwdXRjKCdcbicsIHIpOwotICAgIH0KLSAgICBpZiAoYXV0b2luZGV4X29wdHMgJiBGQU5DWV9JTkRFWElORykgewotCWFwX3JwdXRzKCI8L1BSRT4iLCByKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JYXBfcnB1dHMoIjwvVUw+Iiwgcik7Ci0gICAgfQotfQotCi0vKgotICogQ29tcGFyZSB0d28gZmlsZSBlbnRyaWVzIGFjY29yZGluZyB0byB0aGUgc29ydCBjcml0ZXJpYS4gIFRoZSByZXR1cm4KLSAqIGlzIGVzc2VudGlhbGx5IGEgc2lnbnVtIGZ1bmN0aW9uIHZhbHVlLgotICovCi0KLXN0YXRpYyBpbnQgZHNvcnRmKHN0cnVjdCBlbnQgKiplMSwgc3RydWN0IGVudCAqKmUyKQotewotICAgIHN0cnVjdCBlbnQgKmMxOwotICAgIHN0cnVjdCBlbnQgKmMyOwotICAgIGludCByZXN1bHQgPSAwOwotCi0gICAgLyoKLSAgICAgKiBGaXJzdCwgc2VlIGlmIGVpdGhlciBvZiB0aGUgZW50cmllcyBpcyBmb3IgdGhlIHBhcmVudCBkaXJlY3RvcnkuCi0gICAgICogSWYgc28sIHRoYXQgKmFsd2F5cyogc29ydHMgbG93ZXIgdGhhbiBhbnl0aGluZyBlbHNlLgotICAgICAqLwotICAgIGlmIChpc19wYXJlbnQoKCplMSktPm5hbWUpKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKGlzX3BhcmVudCgoKmUyKS0+bmFtZSkpIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIC8qCi0gICAgICogQWxsIG9mIG91ciBjb21wYXJpc29ucyB3aWxsIGJlIG9mIHRoZSBjMSBlbnRyeSBhZ2FpbnN0IHRoZSBjMiBvbmUsCi0gICAgICogc28gYXNzaWduIHRoZW0gYXBwcm9wcmlhdGVseSB0byB0YWtlIGNhcmUgb2YgdGhlIG9yZGVyaW5nLgotICAgICAqLwotICAgIGlmICgoKmUxKS0+YXNjZW5kaW5nKSB7Ci0gICAgICAgIGMxID0gKmUxOwotICAgICAgICBjMiA9ICplMjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGMxID0gKmUyOwotICAgICAgICBjMiA9ICplMTsKLSAgICB9Ci0gICAgc3dpdGNoIChjMS0+a2V5KSB7Ci0gICAgY2FzZSBLX0xBU1RfTU9EOgotCWlmIChjMS0+bG0gPiBjMi0+bG0pIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGMxLT5sbSA8IGMyLT5sbSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19TSVpFOgotICAgICAgICBpZiAoYzEtPnNpemUgPiBjMi0+c2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYzEtPnNpemUgPCBjMi0+c2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgS19ERVNDOgotICAgICAgICByZXN1bHQgPSBzdHJjbXAoYzEtPmRlc2MgPyBjMS0+ZGVzYyA6ICIiLCBjMi0+ZGVzYyA/IGMyLT5kZXNjIDogIiIpOwotICAgICAgICBpZiAocmVzdWx0KSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gc3RyY21wKGMxLT5uYW1lLCBjMi0+bmFtZSk7Ci19Ci0KLQotc3RhdGljIGludCBpbmRleF9kaXJlY3RvcnkocmVxdWVzdF9yZWMgKnIsCi0JCQkgICBhdXRvaW5kZXhfY29uZmlnX3JlYyAqYXV0b2luZGV4X2NvbmYpCi17Ci0gICAgY2hhciAqdGl0bGVfbmFtZSA9IGFwX2VzY2FwZV9odG1sKHItPnBvb2wsIHItPnVyaSk7Ci0gICAgY2hhciAqdGl0bGVfZW5kcDsKLSAgICBjaGFyICpuYW1lID0gci0+ZmlsZW5hbWU7Ci0KLSAgICBhcF9kaXJfdCAqZDsKLSAgICBhcF9zdGF0dXNfdCBzdGF0dXM7Ci0gICAgaW50IG51bV9lbnQgPSAwLCB4OwotICAgIHN0cnVjdCBlbnQgKmhlYWQsICpwOwotICAgIHN0cnVjdCBlbnQgKiphciA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciAqcXN0cmluZzsKLSAgICBpbnQgYXV0b2luZGV4X29wdHMgPSBhdXRvaW5kZXhfY29uZi0+b3B0czsKLSAgICBjaGFyIGtleWlkOwotICAgIGNoYXIgZGlyZWN0aW9uOwotCi0gICAgaWYgKChzdGF0dXMgPSBhcF9vcGVuZGlyKCZkLCBuYW1lLCByLT5wb29sKSkgIT0gQVBSX1NVQ0NFU1MpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgc3RhdHVzLCByLAotCQkgICAgIkNhbid0IG9wZW4gZGlyZWN0b3J5IGZvciBpbmRleDogJXMiLCByLT5maWxlbmFtZSk7Ci0JcmV0dXJuIEhUVFBfRk9SQklEREVOOwotICAgIH0KLQotICAgIHItPmNvbnRlbnRfdHlwZSA9ICJ0ZXh0L2h0bWwiOwotCi0gICAgYXBfc2VuZF9odHRwX2hlYWRlcihyKTsKLQotICAgIGlmIChyLT5oZWFkZXJfb25seSkgewotCWFwX2Nsb3NlZGlyKGQpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIC8qIFNwZXcgSFRNTCBwcmVhbWJsZSAqLwotCi0gICAgdGl0bGVfZW5kcCA9IHRpdGxlX25hbWUgKyBzdHJsZW4odGl0bGVfbmFtZSkgLSAxOwotCi0gICAgd2hpbGUgKHRpdGxlX2VuZHAgPiB0aXRsZV9uYW1lICYmICp0aXRsZV9lbmRwID09ICcvJykgewotCSp0aXRsZV9lbmRwLS0gPSAnXDAnOwotICAgIH0KLQotICAgIGVtaXRfaGVhZChyLCBmaW5kX2hlYWRlcihhdXRvaW5kZXhfY29uZiwgciksCi0JICAgICAgYXV0b2luZGV4X29wdHMgJiBTVVBQUkVTU19QUkVBTUJMRSwgdGl0bGVfbmFtZSk7Ci0KLSAgICAvKgotICAgICAqIEZpZ3VyZSBvdXQgd2hhdCBzb3J0IG9mIGluZGV4aW5nIChpZiBhbnkpIHdlJ3JlIHN1cHBvc2VkIHRvIHVzZS4KLSAgICAgKgotICAgICAqIElmIG5vIFFVRVJZX1NUUklORyB3YXMgc3BlY2lmaWVkIG9yIGNvbHVtbiBzb3J0aW5nIGhhcyBiZWVuCi0gICAgICogZXhwbGljaXRseSBkaXNhYmxlZCwgd2UgdXNlIHRoZSBkZWZhdWx0IHNwZWNpZmllZCBieSB0aGUKLSAgICAgKiBJbmRleE9yZGVyRGVmYXVsdCBkaXJlY3RpdmUgKGlmIHRoZXJlIGlzIG9uZSk7IG90aGVyd2lzZSwKLSAgICAgKiB3ZSBmYWxsIGJhY2sgdG8gYXNjZW5kaW5nIGJ5IG5hbWUuCi0gICAgICovCi0gICAgcXN0cmluZyA9IHItPmFyZ3M7Ci0gICAgaWYgKChhdXRvaW5kZXhfb3B0cyAmIFNVUFBSRVNTX0NPTFNPUlQpCi0JfHwgKChxc3RyaW5nID09IE5VTEwpIHx8ICgqcXN0cmluZyA9PSAnXDAnKSkpIHsKLQlxc3RyaW5nID0gYXV0b2luZGV4X2NvbmYtPmRlZmF1bHRfb3JkZXI7Ci0gICAgfQotICAgIC8qCi0gICAgICogSWYgdGhlcmUgaXMgbm8gc3BlY2lmaWMgb3JkZXJpbmcgZGVmaW5lZCBmb3IgdGhpcyBkaXJlY3RvcnksCi0gICAgICogZGVmYXVsdCB0byBhc2NlbmRpbmcgYnkgZmlsZW5hbWUuCi0gICAgICovCi0gICAgaWYgKChxc3RyaW5nID09IE5VTEwpIHx8ICgqcXN0cmluZyA9PSAnXDAnKSkgewotCWtleWlkID0gS19OQU1FOwotCWRpcmVjdGlvbiA9IERfQVNDRU5ESU5HOwotICAgIH0KLSAgICBlbHNlIHsKLQlrZXlpZCA9ICpxc3RyaW5nOwotCWFwX2dldHdvcmQoci0+cG9vbCwgJnFzdHJpbmcsICc9Jyk7Ci0JaWYgKHFzdHJpbmcgIT0gJ1wwJykgewotCSAgICBkaXJlY3Rpb24gPSAqcXN0cmluZzsKLQl9Ci0JZWxzZSB7Ci0JICAgIGRpcmVjdGlvbiA9IERfQVNDRU5ESU5HOwotCX0KLSAgICB9Ci0KLSAgICAvKiAKLSAgICAgKiBTaW5jZSB3ZSBkb24ndCBrbm93IGhvdyBtYW55IGRpci4gZW50cmllcyB0aGVyZSBhcmUsIHB1dCB0aGVtIGludG8gYSAKLSAgICAgKiBsaW5rZWQgbGlzdCBhbmQgdGhlbiBhcnJheWlmaWNhdGUgdGhlbSBzbyBxc29ydCBjYW4gdXNlIHRoZW0uIAotICAgICAqLwotICAgIGhlYWQgPSBOVUxMOwotICAgIHdoaWxlIChhcF9yZWFkZGlyKGQpID09IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIGNoYXIgKmRfbmFtZTsKLSAgICAgICAgYXBfZ2V0X2Rpcl9maWxlbmFtZSgmZF9uYW1lLCBkKTsKLQlwID0gbWFrZV9hdXRvaW5kZXhfZW50cnkoZF9uYW1lLCBhdXRvaW5kZXhfb3B0cywKLQkJCQkgYXV0b2luZGV4X2NvbmYsIHIsIGtleWlkLCBkaXJlY3Rpb24pOwotCWlmIChwICE9IE5VTEwpIHsKLQkgICAgcC0+bmV4dCA9IGhlYWQ7Ci0JICAgIGhlYWQgPSBwOwotCSAgICBudW1fZW50Kys7Ci0JfQotICAgIH0KLSAgICBpZiAobnVtX2VudCA+IDApIHsKLQlhciA9IChzdHJ1Y3QgZW50ICoqKSBhcF9wYWxsb2Moci0+cG9vbCwKLQkJCQkgICAgICAgbnVtX2VudCAqIHNpemVvZihzdHJ1Y3QgZW50ICopKTsKLQlwID0gaGVhZDsKLQl4ID0gMDsKLQl3aGlsZSAocCkgewotCSAgICBhclt4KytdID0gcDsKLQkgICAgcCA9IHAtPm5leHQ7Ci0JfQotCi0JcXNvcnQoKHZvaWQgKikgYXIsIG51bV9lbnQsIHNpemVvZihzdHJ1Y3QgZW50ICopLAotCSAgICAgIChpbnQgKCopKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkgZHNvcnRmKTsKLSAgICB9Ci0gICAgb3V0cHV0X2RpcmVjdG9yaWVzKGFyLCBudW1fZW50LCBhdXRvaW5kZXhfY29uZiwgciwgYXV0b2luZGV4X29wdHMsIGtleWlkLAotCQkgICAgICAgZGlyZWN0aW9uKTsKLSAgICBhcF9jbG9zZWRpcihkKTsKLQotICAgIGlmIChhdXRvaW5kZXhfb3B0cyAmIEZBTkNZX0lOREVYSU5HKSB7Ci0JYXBfcnB1dHMoIjxIUj5cbiIsIHIpOwotICAgIH0KLSAgICBlbWl0X3RhaWwociwgZmluZF9yZWFkbWUoYXV0b2luZGV4X2NvbmYsIHIpLAotCSAgICAgIGF1dG9pbmRleF9vcHRzICYgU1VQUFJFU1NfUFJFQU1CTEUpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoZSBmb3JtYWwgaGFuZGxlci4uLiAqLwotCi1zdGF0aWMgaW50IGhhbmRsZV9hdXRvaW5kZXgocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgYXV0b2luZGV4X2NvbmZpZ19yZWMgKmQ7Ci0gICAgaW50IGFsbG93X29wdHMgPSBhcF9hbGxvd19vcHRpb25zKHIpOwotCi0gICAgZCA9IChhdXRvaW5kZXhfY29uZmlnX3JlYyAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywKLQkJCQkJCSAgICAgICZhdXRvaW5kZXhfbW9kdWxlKTsKLQotICAgIHItPmFsbG93ZWQgfD0gKDEgPDwgTV9HRVQpOwotICAgIGlmIChyLT5tZXRob2RfbnVtYmVyICE9IE1fR0VUKSB7Ci0JcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qIE9LLCBub3RoaW5nIGVhc3kuICBUcm90IG91dCB0aGUgaGVhdnkgYXJ0aWxsZXJ5Li4uICovCi0KLSAgICBpZiAoYWxsb3dfb3B0cyAmIE9QVF9JTkRFWEVTKSB7Ci0JLyogS0xVREdFIC0tLSBtYWtlIHRoZSBzdWJfcmVxIGxvb2t1cHMgaGFwcGVuIGluIHRoZSByaWdodCBkaXJlY3RvcnkuCi0JICogRml4aW5nIHRoaXMgaW4gdGhlIHN1Yl9yZXFfbG9va3VwIGZ1bmN0aW9ucyB0aGVtc2VsdmVzIGlzIGRpZmZpY3VsdCwKLQkgKiBhbmQgd291bGQgcHJvYmFibHkgYnJlYWsgdmlydHVhbCBpbmNsdWRlcy4uLgotCSAqLwotCi0JaWYgKHItPmZpbGVuYW1lW3N0cmxlbihyLT5maWxlbmFtZSkgLSAxXSAhPSAnLycpIHsKLQkgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHItPmZpbGVuYW1lLCAiLyIsIE5VTEwpOwotCX0KLQlyZXR1cm4gaW5kZXhfZGlyZWN0b3J5KHIsIGQpOwotICAgIH0KLSAgICBlbHNlIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotCQkgICAgICJEaXJlY3RvcnkgaW5kZXggZm9yYmlkZGVuIGJ5IHJ1bGU6ICVzIiwgci0+ZmlsZW5hbWUpOwotCXJldHVybiBIVFRQX0ZPUkJJRERFTjsKLSAgICB9Ci19Ci0KLQotc3RhdGljIGNvbnN0IGhhbmRsZXJfcmVjIGF1dG9pbmRleF9oYW5kbGVyc1tdID0KLXsKLSAgICB7RElSX01BR0lDX1RZUEUsIGhhbmRsZV9hdXRvaW5kZXh9LAotICAgIHtOVUxMfQotfTsKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGF1dG9pbmRleF9tb2R1bGUgPQotewotICAgIFNUQU5EQVJEMjBfTU9EVUxFX1NUVUZGLAotICAgIGNyZWF0ZV9hdXRvaW5kZXhfY29uZmlnLAkvKiBkaXIgY29uZmlnIGNyZWF0ZXIgKi8KLSAgICBtZXJnZV9hdXRvaW5kZXhfY29uZmlncywJLyogZGlyIG1lcmdlciAtLS0gZGVmYXVsdCBpcyB0byBvdmVycmlkZSAqLwotICAgIE5VTEwsCQkJLyogc2VydmVyIGNvbmZpZyAqLwotICAgIE5VTEwsCQkJLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLwotICAgIGF1dG9pbmRleF9jbWRzLAkJLyogY29tbWFuZCBhcF90YWJsZV90ICovCi0gICAgYXV0b2luZGV4X2hhbmRsZXJzLAkJLyogaGFuZGxlcnMgKi8KLSAgICBOVUxMCQkJLyogcmVnaXN0ZXIgaG9va3MgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2F1dG9pbmRleC5leHAgYi9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2F1dG9pbmRleC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZjQwNTcuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9hdXRvaW5kZXguZXhwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYXV0b2luZGV4X21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9jZ2kuYyBiL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfY2dpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZDQxOTcuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9jZ2kuYworKysgL2Rldi9udWxsCkBAIC0xLDY2OSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBodHRwX3NjcmlwdDoga2VlcHMgYWxsIHNjcmlwdC1yZWxhdGVkIHJhbWJsaW5ncyB0b2dldGhlci4KLSAqIAotICogQ29tcGxpYW50IHRvIENHSS8xLjEgc3BlYwotICogCi0gKiBBZGFwdGVkIGJ5IHJzdCBmcm9tIG9yaWdpbmFsIE5DU0EgY29kZSBieSBSb2IgTWNDb29sCi0gKgotICogQXBhY2hlIGFkZHMgc29tZSBuZXcgZW52IHZhcnM7IFJFRElSRUNUX1VSTCBhbmQgUkVESVJFQ1RfUVVFUllfU1RSSU5HIGZvcgotICogY3VzdG9tIGVycm9yIHJlc3BvbnNlcywgYW5kIERPQ1VNRU5UX1JPT1QgYmVjYXVzZSB3ZSBmb3VuZCBpdCB1c2VmdWwuCi0gKiBJdCBhbHNvIGFkZHMgU0VSVkVSX0FETUlOIC0gdXNlZnVsIGZvciBzY3JpcHRzIHRvIGtub3cgd2hvIHRvIG1haWwgd2hlbiAKLSAqIHRoZXkgZmFpbC4KLSAqLwotCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJodHRwX21haW4uaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgInV0aWxfc2NyaXB0LmgiCi0jaW5jbHVkZSAiaHR0cF9jb25mX2dsb2JhbHMuaCIKLSNpZmRlZiBIQVZFX1NZU19TVEFUX0gKLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBjZ2lfbW9kdWxlOwotCi0vKiBLTFVER0UgLS0tIGZvciBiYWNrLWNvbWJhdGliaWxpdHksIHdlIGRvbid0IGhhdmUgdG8gY2hlY2sgRXhlY0NHSQotICogaW4gU2NyaXB0QWxpYXNlZCBkaXJlY3Rvcmllcywgd2hpY2ggbWVhbnMgd2UgbmVlZCB0byBrbm93IGlmIHRoaXMKLSAqIHJlcXVlc3QgY2FtZSB0aHJvdWdoIFNjcmlwdEFsaWFzIG9yIG5vdC4uLiBzbyB0aGUgQWxpYXMgbW9kdWxlCi0gKiBsZWF2ZXMgYSBub3RlIGZvciB1cy4KLSAqLwotCi1zdGF0aWMgaW50IGlzX3NjcmlwdGFsaWFzZWQocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY29uc3QgY2hhciAqdCA9IGFwX3RhYmxlX2dldChyLT5ub3RlcywgImFsaWFzLWZvcmNlZC10eXBlIik7Ci0gICAgcmV0dXJuIHQgJiYgKCFzdHJjYXNlY21wKHQsICJjZ2ktc2NyaXB0IikpOwotfQotCi0vKiBDb25maWd1cmF0aW9uIHN0dWZmICovCi0KLSNkZWZpbmUgREVGQVVMVF9MT0dCWVRFUyAxMDM4NTc2MAotI2RlZmluZSBERUZBVUxUX0JVRkJZVEVTIDEwMjQKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNoYXIgKmxvZ25hbWU7Ci0gICAgbG9uZyBsb2dieXRlczsKLSAgICBpbnQgYnVmYnl0ZXM7Ci19IGNnaV9zZXJ2ZXJfY29uZjsKLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9jZ2lfY29uZmlnKGFwX2NvbnRleHRfdCAqcCwgc2VydmVyX3JlYyAqcykKLXsKLSAgICBjZ2lfc2VydmVyX2NvbmYgKmMgPQotICAgIChjZ2lfc2VydmVyX2NvbmYgKikgYXBfcGNhbGxvYyhwLCBzaXplb2YoY2dpX3NlcnZlcl9jb25mKSk7Ci0KLSAgICBjLT5sb2duYW1lID0gTlVMTDsKLSAgICBjLT5sb2dieXRlcyA9IERFRkFVTFRfTE9HQllURVM7Ci0gICAgYy0+YnVmYnl0ZXMgPSBERUZBVUxUX0JVRkJZVEVTOwotCi0gICAgcmV0dXJuIGM7Ci19Ci0KLXN0YXRpYyB2b2lkICptZXJnZV9jZ2lfY29uZmlnKGFwX2NvbnRleHRfdCAqcCwgdm9pZCAqYmFzZXYsIHZvaWQgKm92ZXJyaWRlc3YpCi17Ci0gICAgY2dpX3NlcnZlcl9jb25mICpiYXNlID0gKGNnaV9zZXJ2ZXJfY29uZiAqKSBiYXNldiwgKm92ZXJyaWRlcyA9IChjZ2lfc2VydmVyX2NvbmYgKikgb3ZlcnJpZGVzdjsKLQotICAgIHJldHVybiBvdmVycmlkZXMtPmxvZ25hbWUgPyBvdmVycmlkZXMgOiBiYXNlOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3NjcmlwdGxvZyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBzZXJ2ZXJfcmVjICpzID0gY21kLT5zZXJ2ZXI7Ci0gICAgY2dpX3NlcnZlcl9jb25mICpjb25mID0KLSAgICAoY2dpX3NlcnZlcl9jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsICZjZ2lfbW9kdWxlKTsKLQotICAgIGNvbmYtPmxvZ25hbWUgPSBhcmc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfc2NyaXB0bG9nX2xlbmd0aChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBzZXJ2ZXJfcmVjICpzID0gY21kLT5zZXJ2ZXI7Ci0gICAgY2dpX3NlcnZlcl9jb25mICpjb25mID0KLSAgICAoY2dpX3NlcnZlcl9jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsICZjZ2lfbW9kdWxlKTsKLQotICAgIGNvbmYtPmxvZ2J5dGVzID0gYXRvbChhcmcpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3NjcmlwdGxvZ19idWZmZXIoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgc2VydmVyX3JlYyAqcyA9IGNtZC0+c2VydmVyOwotICAgIGNnaV9zZXJ2ZXJfY29uZiAqY29uZiA9Ci0gICAgKGNnaV9zZXJ2ZXJfY29uZiAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAmY2dpX21vZHVsZSk7Ci0KLSAgICBjb25mLT5idWZieXRlcyA9IGF0b2koYXJnKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIGNnaV9jbWRzW10gPQotewotICAgIHsiU2NyaXB0TG9nIiwgc2V0X3NjcmlwdGxvZywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAgInRoZSBuYW1lIG9mIGEgbG9nIGZvciBzY3JpcHQgZGVidWdnaW5nIGluZm8ifSwKLSAgICB7IlNjcmlwdExvZ0xlbmd0aCIsIHNldF9zY3JpcHRsb2dfbGVuZ3RoLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAgICAidGhlIG1heGltdW0gbGVuZ3RoIChpbiBieXRlcykgb2YgdGhlIHNjcmlwdCBkZWJ1ZyBsb2cifSwKLSAgICB7IlNjcmlwdExvZ0J1ZmZlciIsIHNldF9zY3JpcHRsb2dfYnVmZmVyLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAgICAidGhlIG1heGltdW0gc2l6ZSAoaW4gYnl0ZXMpIHRvIHJlY29yZCBvZiBhIFBPU1QgcmVxdWVzdCJ9LAotICAgIHtOVUxMfQotfTsKLQotc3RhdGljIGludCBsb2dfc2NyaXB0ZXJyb3IocmVxdWVzdF9yZWMgKnIsIGNnaV9zZXJ2ZXJfY29uZiAqIGNvbmYsIGludCByZXQsCi0JCQkgICBpbnQgc2hvd19lcnJubywgY2hhciAqZXJyb3IpCi17Ci0gICAgYXBfZmlsZV90ICpmID0gTlVMTDsKLSAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsKLSAgICBjaGFyIHRpbWVfc3RyW0FQX0NUSU1FX0xFTl07Ci0KLSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIHNob3dfZXJybm98QVBMT0dfRVJSLCBlcnJubywgciwgCi0JCSIlczogJXMiLCBlcnJvciwgci0+ZmlsZW5hbWUpOwotCi0gICAgaWYgKCFjb25mLT5sb2duYW1lIHx8Ci0JKChzdGF0KGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHItPnBvb2wsIGNvbmYtPmxvZ25hbWUpLCAmZmluZm8pID09IDApCi0JICYmICAgKGZpbmZvLnN0X3NpemUgPiBjb25mLT5sb2dieXRlcykpIHx8Ci0gICAgICAgICAgKGFwX29wZW4oJmYsIGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHItPnBvb2wsIGNvbmYtPmxvZ25hbWUpLAotICAgICAgICAgICAgICAgICAgIEFQUl9BUFBFTkQgfCBBUFJfQlVGRkVSRUQsIEFQUl9PU19ERUZBVUxULCByLT5wb29sKSAhPSBBUFJfU1VDQ0VTUykpIHsKLQlyZXR1cm4gcmV0OwotICAgIH0KLQotICAgIC8qICIlJSBbV2VkIEp1biAxOSAxMDo1MzoyMSAxOTk2XSBHRVQgL2NnaS1iaW4vcHJpbnRlbnYgSFRUUC8xLjAiICovCi0gICAgYXBfY3RpbWUodGltZV9zdHIsIGFwX25vdygpKTsKLSAgICBhcF9mcHJpbnRmKGYsICIlJSUlIFslc10gJXMgJXMlcyVzICVzXG4iLCB0aW1lX3N0ciwgci0+bWV0aG9kLCByLT51cmksCi0JICAgIHItPmFyZ3MgPyAiPyIgOiAiIiwgci0+YXJncyA/IHItPmFyZ3MgOiAiIiwgci0+cHJvdG9jb2wpOwotICAgIC8qICIlJSA1MDAgL3Vzci9sb2NhbC9hcGFjaGUvY2dpLWJpbiAqLwotICAgIGFwX2ZwcmludGYoZiwgIiUlJSUgJWQgJXNcbiIsIHJldCwgci0+ZmlsZW5hbWUpOwotCi0gICAgYXBfZnByaW50ZihmLCAiJSVlcnJvclxuJXNcbiIsIGVycm9yKTsKLQotICAgIGFwX2Nsb3NlKGYpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbG9nX3NjcmlwdChyZXF1ZXN0X3JlYyAqciwgY2dpX3NlcnZlcl9jb25mICogY29uZiwgaW50IHJldCwKLQkJICBjaGFyICpkYnVmLCBjb25zdCBjaGFyICpzYnVmLCBCVUZGICpzY3JpcHRfaW4sIEJVRkYgKnNjcmlwdF9lcnIpCi17Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmhkcnNfYXJyID0gYXBfdGFibGVfZWx0cyhyLT5oZWFkZXJzX2luKTsKLSAgICBhcF90YWJsZV9lbnRyeV90ICpoZHJzID0gKGFwX3RhYmxlX2VudHJ5X3QgKikgaGRyc19hcnItPmVsdHM7Ci0gICAgY2hhciBhcmdzYnVmZmVyW0hVR0VfU1RSSU5HX0xFTl07Ci0gICAgYXBfZmlsZV90ICpmID0gTlVMTDsKLSAgICBpbnQgaTsKLSAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsKLSAgICBjaGFyIHRpbWVfc3RyW0FQX0NUSU1FX0xFTl07Ci0KLSAgICBpZiAoIWNvbmYtPmxvZ25hbWUgfHwKLQkoKHN0YXQoYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUoci0+cG9vbCwgY29uZi0+bG9nbmFtZSksICZmaW5mbykgPT0gMCkKLQkgJiYgICAoZmluZm8uc3Rfc2l6ZSA+IGNvbmYtPmxvZ2J5dGVzKSkgfHwKLSAgICAgICAgIChhcF9vcGVuKCZmLCBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShyLT5wb29sLCBjb25mLT5sb2duYW1lKSwKLSAgICAgICAgICAgICAgICAgIEFQUl9BUFBFTkQsIEFQUl9PU19ERUZBVUxULCByLT5wb29sKSAhPSBBUFJfU1VDQ0VTUykpIHsKLQkvKiBTb2FrIHVwIHNjcmlwdCBvdXRwdXQgKi8KLQl3aGlsZSAoYXBfYmdldHMoYXJnc2J1ZmZlciwgSFVHRV9TVFJJTkdfTEVOLCBzY3JpcHRfaW4pID4gMCkKLQkgICAgY29udGludWU7Ci0jaWZkZWYgV0lOMzIKLSAgICAgICAgLyogU29hayB1cCBzdGRlcnIgYW5kIHJlZGlyZWN0IGl0IHRvIHRoZSBlcnJvciBsb2cuCi0gICAgICAgICAqIFNjcmlwdCBvdXRwdXQgdG8gc3RkZXJyIGlzIGFscmVhZHkgZGlyZWN0ZWQgdG8gdGhlIGVycm9yIGxvZwotICAgICAgICAgKiBvbiBVbml4LCB0aGFua3MgdG8gdGhlIG1hZ2ljIG9mIGZvcmsoKS4KLSAgICAgICAgICovCi0gICAgICAgIHdoaWxlIChhcF9iZ2V0cyhhcmdzYnVmZmVyLCBIVUdFX1NUUklOR19MRU4sIHNjcmlwdF9lcnIpID4gMCkgewotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIgfCBBUExPR19OT0VSUk5PLCAwLCByLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIiwgYXJnc2J1ZmZlcik7ICAgICAgICAgICAgCi0gICAgICAgIH0KLSNlbHNlCi0Jd2hpbGUgKGFwX2JnZXRzKGFyZ3NidWZmZXIsIEhVR0VfU1RSSU5HX0xFTiwgc2NyaXB0X2VycikgPiAwKQotCSAgICBjb250aW51ZTsKLSNlbmRpZgotCXJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgLyogIiUlIFtXZWQgSnVuIDE5IDEwOjUzOjIxIDE5OTZdIEdFVCAvY2dpLWJpbi9wcmludGVudiBIVFRQLzEuMCIgKi8KLSAgICBhcF9jdGltZSh0aW1lX3N0ciwgYXBfbm93KCkpOwotICAgIGFwX2ZwcmludGYoZiwgIiUlJSUgWyVzXSAlcyAlcyVzJXMgJXNcbiIsIHRpbWVfc3RyLCByLT5tZXRob2QsIHItPnVyaSwKLQkgICAgci0+YXJncyA/ICI/IiA6ICIiLCByLT5hcmdzID8gci0+YXJncyA6ICIiLCByLT5wcm90b2NvbCk7Ci0gICAgLyogIiUlIDUwMCAvdXNyL2xvY2FsL2FwYWNoZS9jZ2ktYmluIiAqLwotICAgIGFwX2ZwcmludGYoZiwgIiUlJSUgJWQgJXNcbiIsIHJldCwgci0+ZmlsZW5hbWUpOwotCi0gICAgYXBfcHV0cygiJXJlcXVlc3RcbiIsIGYpOwotICAgIGZvciAoaSA9IDA7IGkgPCBoZHJzX2Fyci0+bmVsdHM7ICsraSkgewotCWlmICghaGRyc1tpXS5rZXkpCi0JICAgIGNvbnRpbnVlOwotCWFwX2ZwcmludGYoZiwgIiVzOiAlc1xuIiwgaGRyc1tpXS5rZXksIGhkcnNbaV0udmFsKTsKLSAgICB9Ci0gICAgaWYgKChyLT5tZXRob2RfbnVtYmVyID09IE1fUE9TVCB8fCByLT5tZXRob2RfbnVtYmVyID09IE1fUFVUKQotCSYmICpkYnVmKSB7Ci0JYXBfZnByaW50ZihmLCAiXG4lc1xuIiwgZGJ1Zik7Ci0gICAgfQotCi0gICAgYXBfcHV0cygiJXJlc3BvbnNlXG4iLCBmKTsKLSAgICBoZHJzX2FyciA9IGFwX3RhYmxlX2VsdHMoci0+ZXJyX2hlYWRlcnNfb3V0KTsKLSAgICBoZHJzID0gKGFwX3RhYmxlX2VudHJ5X3QgKikgaGRyc19hcnItPmVsdHM7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgaGRyc19hcnItPm5lbHRzOyArK2kpIHsKLQlpZiAoIWhkcnNbaV0ua2V5KQotCSAgICBjb250aW51ZTsKLQlhcF9mcHJpbnRmKGYsICIlczogJXNcbiIsIGhkcnNbaV0ua2V5LCBoZHJzW2ldLnZhbCk7Ci0gICAgfQotCi0gICAgaWYgKHNidWYgJiYgKnNidWYpCi0JYXBfZnByaW50ZihmLCAiJXNcbiIsIHNidWYpOwotCi0gICAgaWYgKGFwX2JnZXRzKGFyZ3NidWZmZXIsIEhVR0VfU1RSSU5HX0xFTiwgc2NyaXB0X2luKSA+IDApIHsKLQlhcF9wdXRzKCIlc3Rkb3V0XG4iLCBmKTsKLQlhcF9wdXRzKGFyZ3NidWZmZXIsIGYpOwotCXdoaWxlIChhcF9iZ2V0cyhhcmdzYnVmZmVyLCBIVUdFX1NUUklOR19MRU4sIHNjcmlwdF9pbikgPiAwKQotCSAgICBhcF9wdXRzKGFyZ3NidWZmZXIsIGYpOwotCWFwX3B1dHMoIlxuIiwgZik7Ci0gICAgfQotCi0gICAgaWYgKGFwX2JnZXRzKGFyZ3NidWZmZXIsIEhVR0VfU1RSSU5HX0xFTiwgc2NyaXB0X2VycikgPiAwKSB7Ci0JYXBfcHV0cygiJXN0ZGVyclxuIiwgZik7Ci0JYXBfcHV0cyhhcmdzYnVmZmVyLCBmKTsKLQl3aGlsZSAoYXBfYmdldHMoYXJnc2J1ZmZlciwgSFVHRV9TVFJJTkdfTEVOLCBzY3JpcHRfZXJyKSA+IDApCi0JICAgIGFwX3B1dHMoYXJnc2J1ZmZlciwgZik7Ci0JYXBfcHV0cygiXG4iLCBmKTsKLSAgICB9Ci0KLSAgICBhcF9iY2xvc2Uoc2NyaXB0X2luKTsKLSAgICBhcF9iY2xvc2Uoc2NyaXB0X2Vycik7Ci0KLSAgICBhcF9jbG9zZShmKTsKLSAgICByZXR1cm4gcmV0OwotfQotc3RhdGljIGFwX3N0YXR1c190IHJ1bl9jZ2lfY2hpbGQoQlVGRiAqKnNjcmlwdF9vdXQsIEJVRkYgKipzY3JpcHRfaW4sIEJVRkYgKipzY3JpcHRfZXJyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmNvbW1hbmQsIGNoYXIgKmNvbnN0IGFyZ3ZbXSwgcmVxdWVzdF9yZWMgKnIsIGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICBjaGFyICoqZW52OwotICAgIGFwX3Byb2NhdHRyX3QgKnByb2NhdHRyOwotICAgIGFwX3Byb2NfdCAqcHJvY25ldzsKLSAgICBhcF9zdGF0dXNfdCByYyA9IEFQUl9TVUNDRVNTOwotICAgIGFwX2ZpbGVfdCAqZmlsZSA9IE5VTEw7Ci0gICAgYXBfaW9sICppb2w7Ci0KLSNpZmRlZiBERUJVR19DR0kKLSNpZmRlZiBPUzIKLSAgICAvKiBVbmRlciBPUy8yIG5lZWQgdG8gdXNlIGRldmljZSBjb24uICovCi0gICAgRklMRSAqZGJnID0gZm9wZW4oImNvbiIsICJ3Iik7Ci0jZWxzZQotICAgIEZJTEUgKmRiZyA9IGZvcGVuKCIvZGV2L3R0eSIsICJ3Iik7Ci0jZW5kaWYKLSAgICBpbnQgaTsKLSNlbmRpZgotCi0gICAgYXBfYmxvY2tfYWxhcm1zKCk7Ci0KLSAgICBSQUlTRV9TSUdTVE9QKENHSV9DSElMRCk7Ci0jaWZkZWYgREVCVUdfQ0dJCi0gICAgZnByaW50ZihkYmcsICJBdHRlbXB0aW5nIHRvIGV4ZWMgJXMgYXMgJXNDR0kgY2hpbGQgKGFyZ3YwID0gJXMpXG4iLAotCSAgICByLT5maWxlbmFtZSwgY2xkLT5ucGggPyAiTlBIICIgOiAiIiwgYXJndjApOwotI2VuZGlmCi0KLSAgICBhcF9hZGRfY2dpX3ZhcnMocik7Ci0gICAgZW52ID0gYXBfY3JlYXRlX2Vudmlyb25tZW50KHAsIHItPnN1YnByb2Nlc3NfZW52KTsKLQotI2lmZGVmIERFQlVHX0NHSQotICAgIGZwcmludGYoZGJnLCAiRW52aXJvbm1lbnQ6IFxuIik7Ci0gICAgZm9yIChpID0gMDsgZW52W2ldOyArK2kpCi0JZnByaW50ZihkYmcsICInJXMnXG4iLCBlbnZbaV0pOwotI2VuZGlmCi0KLSAgICAvKiBUcmFuc3VtdXRlIG91cnNlbHZlcyBpbnRvIHRoZSBzY3JpcHQuCi0gICAgICogTkIgb25seSBJU0lOREVYIHNjcmlwdHMgZ2V0IGRlY29kZWQgYXJndW1lbnRzLgotICAgICAqLwotICAgIGlmICgoYXBfY3JlYXRlcHJvY2F0dHJfaW5pdCgmcHJvY2F0dHIsIHApICE9IEFQUl9TVUNDRVNTKSB8fAotICAgICAgICAoYXBfc2V0cHJvY2F0dHJfaW8ocHJvY2F0dHIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBSX0ZVTExfQkxPQ0ssIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBSX0ZVTExfQkxPQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBUFJfRlVMTF9CTE9DSykgIT0gQVBSX1NVQ0NFU1MpIHx8Ci0gICAgICAgIChhcF9zZXRwcm9jYXR0cl9kaXIocHJvY2F0dHIsIGFwX21ha2VfZGlyc3RyX3BhcmVudChyLT5wb29sLCByLT5maWxlbmFtZSkpICAgICAgICAhPSBBUFJfU1VDQ0VTUykgfHwKLSAgICAgICAgKGFwX3NldHByb2NhdHRyX2NtZHR5cGUocHJvY2F0dHIsIEFQUl9QUk9HUkFNKSAgICAhPSBBUFJfU1VDQ0VTUykpIHsKLSAgICAgICAgLyogU29tZXRoaW5nIGJhZCBoYXBwZW5lZCwgdGVsbCB0aGUgd29ybGQuICovCi0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGVycm5vLCByLAotCQkgICAgICAiY291bGRuJ3QgY3JlYXRlIGNoaWxkIHByb2Nlc3M6ICVzIiwgci0+ZmlsZW5hbWUpOwotICAgICAgICByYyA9ICFBUFJfU1VDQ0VTUzsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJjID0gYXBfY3JlYXRlX3Byb2Nlc3MoJnByb2NuZXcsIGNvbW1hbmQsIGFyZ3YsIGVudiwgcHJvY2F0dHIsIHApOwotICAgIAotICAgICAgICBpZiAocmMgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIC8qIEJhZCB0aGluZ3MgaGFwcGVuZWQuIEV2ZXJ5b25lIHNob3VsZCBoYXZlIGNsZWFuZWQgdXAuICovCi0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY291bGRuJ3QgY3JlYXRlIGNoaWxkIHByb2Nlc3M6ICVkOiAlcyIsIHJjLCByLT5maWxlbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhcF9ub3RlX3N1YnByb2Nlc3MocCwgcHJvY25ldywga2lsbF9hZnRlcl90aW1lb3V0KTsKLQotICAgICAgICAgICAgLyogRmlsbCBpbiBCVUZGIHN0cnVjdHVyZSBmb3IgcGFyZW50cyBwaXBlIHRvIGNoaWxkJ3Mgc3Rkb3V0ICovCi0gICAgICAgICAgICBhcF9nZXRfY2hpbGRvdXQoJmZpbGUsIHByb2NuZXcpOwotICAgICAgICAgICAgaW9sID0gYXBfY3JlYXRlX2ZpbGVfaW9sKGZpbGUpOwotICAgICAgICAgICAgaWYgKCFpb2wpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEFQUl9FQkFERjsKLSAgICAgICAgICAgICpzY3JpcHRfaW4gPSBhcF9iY3JlYXRlKHAsIEJfUkQpOwotICAgICAgICAgICAgYXBfYnB1c2hfaW9sKCpzY3JpcHRfaW4sIGlvbCk7Ci0KLSAgICAgICAgICAgIC8qIEZpbGwgaW4gQlVGRiBzdHJ1Y3R1cmUgZm9yIHBhcmVudHMgcGlwZSB0byBjaGlsZCdzIHN0ZGluICovCi0gICAgICAgICAgICBhcF9nZXRfY2hpbGRpbigmZmlsZSwgcHJvY25ldyk7Ci0gICAgICAgICAgICBpb2wgPSBhcF9jcmVhdGVfZmlsZV9pb2woZmlsZSk7Ci0gICAgICAgICAgICBpZiAoIWlvbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gQVBSX0VCQURGOwotICAgICAgICAgICAgKnNjcmlwdF9vdXQgPSBhcF9iY3JlYXRlKHAsIEJfV1IpOwotICAgICAgICAgICAgYXBfYnB1c2hfaW9sKCpzY3JpcHRfb3V0LCBpb2wpOwotCi0gICAgICAgICAgICAvKiBGaWxsIGluIEJVRkYgc3RydWN0dXJlIGZvciBwYXJlbnRzIHBpcGUgdG8gY2hpbGQncyBzdGRlcnIgKi8KLSAgICAgICAgICAgIGFwX2dldF9jaGlsZGVycigmZmlsZSwgcHJvY25ldyk7Ci0gICAgICAgICAgICBpb2wgPSBhcF9jcmVhdGVfZmlsZV9pb2woZmlsZSk7Ci0gICAgICAgICAgICBpZiAoIWlvbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gQVBSX0VCQURGOwotICAgICAgICAgICAgKnNjcmlwdF9lcnIgPSBhcF9iY3JlYXRlKHAsIEJfUkQpOwotICAgICAgICAgICAgYXBfYnB1c2hfaW9sKCpzY3JpcHRfZXJyLCBpb2wpOwotICAgICAgICB9Ci0gICAgfQotICAgIGFwX3VuYmxvY2tfYWxhcm1zKCk7Ci0gICAgcmV0dXJuIChyYyk7Ci19Ci1zdGF0aWMgYXBfc3RhdHVzX3QgYnVpbGRfYXJndl9saXN0KGNoYXIgKioqYXJndiwgcmVxdWVzdF9yZWMgKnIsIGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICBpbnQgbnVtd29yZHMsIHgsIGlkeDsKLSAgICBjaGFyICp3OwotICAgIGNvbnN0IGNoYXIgKmFyZ3MgPSByLT5hcmdzOwotCi0gICAgaWYgKCFhcmdzIHx8ICFhcmdzWzBdIHx8IHN0cmNocihhcmdzLCAnPScpKSB7Ci0gICAgICAgIG51bXdvcmRzID0gMTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIGNvdW50IHRoZSBudW1iZXIgb2Yga2V5d29yZHMgKi8KLSAgICAgICAgZm9yICh4ID0gMCwgbnVtd29yZHMgPSAyOyBhcmdzW3hdOyB4KyspIHsKLSAgICAgICAgICAgIGlmIChhcmdzW3hdID09ICcrJykgewotICAgICAgICAgICAgICAgICsrbnVtd29yZHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogRXZlcnl0aGluZyBpcyAtIDEgdG8gYWNjb3VudCBmb3IgdGhlIGZpcnN0IHBhcmFtZXRlciB3aGljaCBpcyB0aGUKLSAgICAgKiBwcm9ncmFtIG5hbWUuICBXZSBkaWRuJ3QgdXNlZCB0byBoYXZlIHRvIGRvIHRoaXMsIGJ1dCBBUFIgd2FudHMgaXQuCi0gICAgICovIAotICAgIGlmIChudW13b3JkcyA+IEFQQUNIRV9BUkdfTUFYIC0gMSkgewotICAgICAgICBudW13b3JkcyA9IEFQQUNIRV9BUkdfTUFYIC0gMTsJLyogVHJ1bmNhdGUgYXJncyB0byBwcmV2ZW50IG92ZXJydW4gKi8KLSAgICB9Ci0gICAgKmFyZ3YgPSAoY2hhciAqKikgYXBfcGFsbG9jKHAsIChudW13b3JkcyArIDIpICogc2l6ZW9mKGNoYXIgKikpOwotIAotICAgIGZvciAoeCA9IDEsIGlkeCA9IDE7IHggPCBudW13b3JkczsgeCsrKSB7Ci0gICAgICAgIHcgPSBhcF9nZXR3b3JkX251bGxzKHAsICZhcmdzLCAnKycpOwotICAgICAgICBhcF91bmVzY2FwZV91cmwodyk7Ci0gICAgICAgICgqYXJndilbaWR4KytdID0gYXBfZXNjYXBlX3NoZWxsX2NtZChwLCB3KTsKLSAgICB9Ci0gICAgKCphcmd2KVtpZHhdID0gTlVMTDsKLQotICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGFwX3N0YXR1c190IGJ1aWxkX2NvbW1hbmRfbGluZShjaGFyICoqYywgcmVxdWVzdF9yZWMgKnIsIGFwX2NvbnRleHRfdCAqcCkKLXsKLSNpZmRlZiBXSU4zMgotICAgIGNoYXIgKnF1b3RlZF9maWxlbmFtZSA9IE5VTEw7Ci0gICAgY2hhciAqaW50ZXJwcmV0ZXIgPSBOVUxMOwotICAgIGZpbGVfdHlwZV9lIGZpbGVUeXBlOwotCi0gICAgKmMgPSBOVUxMOwotICAgIGZpbGVUeXBlID0gYXBfZ2V0X3dpbjMyX2ludGVycHJldGVyKHIsICZpbnRlcnByZXRlcik7Ci0KLSAgICBpZiAoZmlsZVR5cGUgPT0gZUZpbGVUeXBlVU5LTk9XTikgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUnxBUExPR19OT0VSUk5PLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAgICIlcyBpcyBub3QgZXhlY3V0YWJsZTsgZW5zdXJlIGludGVycHJldGVkIHNjcmlwdHMgaGF2ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgIlwiIyFcIiBmaXJzdCBsaW5lIiwgCi0gICAgICAgICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUpOwotICAgICAgICByZXR1cm4gQVBSX0VCQURGOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQnVpbGQgdGhlIGNvbW1hbmQgc3RyaW5nIHRvIHBhc3MgdG8gYXBfY3JlYXRlX3Byb2Nlc3MoKQotICAgICAqLwotICAgIHF1b3RlZF9maWxlbmFtZSA9IGFwX3BzdHJjYXQocCwgIlwiIiwgci0+ZmlsZW5hbWUsICJcIiIsIE5VTEwpOwotICAgIGlmIChpbnRlcnByZXRlciAmJiAqaW50ZXJwcmV0ZXIpIHsKLSAgICAgICAgKmMgPSBhcF9wc3RyY2F0KHAsIGludGVycHJldGVyLCAiICIsIHF1b3RlZF9maWxlbmFtZSwgIiAiLCBOVUxMKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgICpjID0gYXBfcHN0cmNhdChwLCBxdW90ZWRfZmlsZW5hbWUsICIgIiwgTlVMTCk7Ci0gICAgfQotI2Vsc2UKLSAgICAqYyA9IGFwX3BzdHJjYXQocCwgci0+ZmlsZW5hbWUsIE5VTEwpOwotI2VuZGlmCi0gICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IGNnaV9oYW5kbGVyKHJlcXVlc3RfcmVjICpyKQotewotICAgIGludCByZXR2YWwsIG5waCwgZGJwb3MgPSAwOwotICAgIGNoYXIgKmFyZ3YwLCAqZGJ1ZiA9IE5VTEw7Ci0gICAgY2hhciAqY29tbWFuZDsKLSAgICBjaGFyICoqYXJndiA9IE5VTEw7Ci0KLSAgICBCVUZGICpzY3JpcHRfb3V0ID0gTlVMTCwgKnNjcmlwdF9pbiA9IE5VTEwsICpzY3JpcHRfZXJyID0gTlVMTDsKLSAgICBjaGFyIGFyZ3NidWZmZXJbSFVHRV9TVFJJTkdfTEVOXTsKLSAgICBpbnQgaXNfaW5jbHVkZWQgPSAhc3RyY21wKHItPnByb3RvY29sLCAiSU5DTFVERUQiKTsKLSAgICB2b2lkICpzY29uZiA9IHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZzsKLSAgICBhcF9jb250ZXh0X3QgKnA7Ci0gICAgY2dpX3NlcnZlcl9jb25mICpjb25mID0KLSAgICAoY2dpX3NlcnZlcl9jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHNjb25mLCAmY2dpX21vZHVsZSk7Ci0KLSAgICBwID0gci0+bWFpbiA/IHItPm1haW4tPnBvb2wgOiByLT5wb29sOwotCi0gICAgaWYgKHItPm1ldGhvZF9udW1iZXIgPT0gTV9PUFRJT05TKSB7Ci0JLyogOTkgb3V0IG9mIDEwMCBDR0kgc2NyaXB0cywgdGhpcyBpcyBhbGwgdGhleSBzdXBwb3J0ICovCi0Jci0+YWxsb3dlZCB8PSAoMSA8PCBNX0dFVCk7Ci0Jci0+YWxsb3dlZCB8PSAoMSA8PCBNX1BPU1QpOwotCXJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICBpZiAoKGFyZ3YwID0gc3RycmNocihyLT5maWxlbmFtZSwgJy8nKSkgIT0gTlVMTCkKLQlhcmd2MCsrOwotICAgIGVsc2UKLQlhcmd2MCA9IHItPmZpbGVuYW1lOwotCi0gICAgbnBoID0gIShzdHJuY21wKGFyZ3YwLCAibnBoLSIsIDQpKTsKLQotICAgIGlmICghKGFwX2FsbG93X29wdGlvbnMocikgJiBPUFRfRVhFQ0NHSSkgJiYgIWlzX3NjcmlwdGFsaWFzZWQocikpCi0gICAgICAgIHJldHVybiBsb2dfc2NyaXB0ZXJyb3IociwgY29uZiwgRk9SQklEREVOLCBBUExPR19OT0VSUk5PLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcHRpb25zIEV4ZWNDR0kgaXMgb2ZmIGluIHRoaXMgZGlyZWN0b3J5Iik7Ci0gICAgaWYgKG5waCAmJiBpc19pbmNsdWRlZCkKLSAgICAgICAgcmV0dXJuIGxvZ19zY3JpcHRlcnJvcihyLCBjb25mLCBGT1JCSURERU4sIEFQTE9HX05PRVJSTk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dGVtcHQgdG8gaW5jbHVkZSBOUEggQ0dJIHNjcmlwdCIpOwotCi0jaWYgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lOMzIpCi0gICAgLyogQWxsb3cgZm9yIGNnaSBmaWxlcyB3aXRob3V0IHRoZSAuRVhFIGV4dGVuc2lvbiBvbiB0aGVtIHVuZGVyIE9TLzIgKi8KLSAgICBpZiAoci0+ZmluZm8ucHJvdGVjdGlvbiA9PSAwKSB7Ci0gICAgICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gICAgICAgIGNoYXIgKm5ld2ZpbGU7Ci0KLSAgICAgICAgbmV3ZmlsZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgci0+ZmlsZW5hbWUsICIuRVhFIiwgTlVMTCk7Ci0KLSAgICAgICAgaWYgKChzdGF0KG5ld2ZpbGUsICZzdGF0YnVmKSAhPSAwKSB8fCAoIVNfSVNSRUcoc3RhdGJ1Zi5zdF9tb2RlKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBsb2dfc2NyaXB0ZXJyb3IociwgY29uZiwgTk9UX0ZPVU5ELCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2NyaXB0IG5vdCBmb3VuZCBvciB1bmFibGUgdG8gc3RhdCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgci0+ZmlsZW5hbWUgPSBuZXdmaWxlOwotICAgICAgICB9Ci0gICAgfQotI2Vsc2UKLSAgICBpZiAoci0+ZmluZm8ucHJvdGVjdGlvbiA9PSAwKQotCXJldHVybiBsb2dfc2NyaXB0ZXJyb3IociwgY29uZiwgTk9UX0ZPVU5ELCBBUExPR19OT0VSUk5PLAotCQkJICAgICAgICJzY3JpcHQgbm90IGZvdW5kIG9yIHVuYWJsZSB0byBzdGF0Iik7Ci0jZW5kaWYKLSAgICBpZiAoci0+ZmluZm8uZmlsZXR5cGUgPT0gQVBSX0RJUikKLQlyZXR1cm4gbG9nX3NjcmlwdGVycm9yKHIsIGNvbmYsIEZPUkJJRERFTiwgQVBMT0dfTk9FUlJOTywKLQkJCSAgICAgICAiYXR0ZW1wdCB0byBpbnZva2UgZGlyZWN0b3J5IGFzIHNjcmlwdCIpOwotCi0vKgotICAgIGlmICghYXBfc3VleGVjX2VuYWJsZWQpIHsKLQlpZiAoIWFwX2Nhbl9leGVjKCZyLT5maW5mbykpCi0JICAgIHJldHVybiBsb2dfc2NyaXB0ZXJyb3IociwgY29uZiwgRk9SQklEREVOLCBBUExPR19OT0VSUk5PLAotCQkJCSAgICJmaWxlIHBlcm1pc3Npb25zIGRlbnkgc2VydmVyIGV4ZWN1dGlvbiIpOwotICAgIH0KLQotKi8KLSAgICBpZiAoKHJldHZhbCA9IGFwX3NldHVwX2NsaWVudF9ibG9jayhyLCBSRVFVRVNUX0NIVU5LRURfRVJST1IpKSkKLQlyZXR1cm4gcmV0dmFsOwotCi0gICAgYXBfYWRkX2NvbW1vbl92YXJzKHIpOwotCi0gICAgLyogYnVpbGQgdGhlIGNvbW1hbmQgbGluZSAqLwotICAgIGlmIChidWlsZF9jb21tYW5kX2xpbmUoJmNvbW1hbmQsIHIsIHApICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgciwKLSAgICAgICAgICAgICAgICAgICAgICAiY291bGRuJ3Qgc3Bhd24gY2hpbGQgcHJvY2VzczogJXMiLCByLT5maWxlbmFtZSk7Ci0gICAgICAgIHJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICB9Ci0gICAgLyogYnVpbGQgdGhlIGFyZ3VtZW50IGxpc3QgKi8KLSAgICBlbHNlIGlmIChidWlsZF9hcmd2X2xpc3QoJmFyZ3YsIHIsIHApICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgciwKLSAgICAgICAgICAgICAgICAgICAgICAiY291bGRuJ3Qgc3Bhd24gY2hpbGQgcHJvY2VzczogJXMiLCByLT5maWxlbmFtZSk7Ci0gICAgICAgIHJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICB9Ci0gICAgYXJndlswXSA9IGFwX3BzdHJkdXAocCwgY29tbWFuZCk7Ci0gICAgLyogcnVuIHRoZSBzY3JpcHQgaW4gaXRzIG93biBwcm9jZXNzICovCi0gICAgaWYgKHJ1bl9jZ2lfY2hpbGQoJnNjcmlwdF9vdXQsICZzY3JpcHRfaW4sICZzY3JpcHRfZXJyLCBjb21tYW5kLCBhcmd2LCByLCBwKSAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHIsCi0gICAgICAgICAgICAgICAgICAgICAgImNvdWxkbid0IHNwYXduIGNoaWxkIHByb2Nlc3M6ICVzIiwgci0+ZmlsZW5hbWUpOwotICAgICAgICByZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgfQotCi0gICAgLyogVHJhbnNmZXIgYW55IHB1dC9wb3N0IGFyZ3MsIENFUk4gc3R5bGUuLi4KLSAgICAgKiBOb3RlIHRoYXQgd2UgYWxyZWFkeSBpZ25vcmUgU0lHUElQRSBpbiB0aGUgY29yZSBzZXJ2ZXIuCi0gICAgICovCi0gICAgaWYgKGFwX3Nob3VsZF9jbGllbnRfYmxvY2socikpIHsKLQlpbnQgZGJzaXplLCBsZW5fcmVhZDsKLSAgICAgICAgYXBfc3NpemVfdCBieXRlc193cml0dGVuOwotCi0JaWYgKGNvbmYtPmxvZ25hbWUpIHsKLQkgICAgZGJ1ZiA9IGFwX3BjYWxsb2Moci0+cG9vbCwgY29uZi0+YnVmYnl0ZXMgKyAxKTsKLQkgICAgZGJwb3MgPSAwOwotCX0KLQotCXdoaWxlICgobGVuX3JlYWQgPQotCQlhcF9nZXRfY2xpZW50X2Jsb2NrKHIsIGFyZ3NidWZmZXIsIEhVR0VfU1RSSU5HX0xFTikpID4gMCkgewotCSAgICBpZiAoY29uZi0+bG9nbmFtZSkgewotCQlpZiAoKGRicG9zICsgbGVuX3JlYWQpID4gY29uZi0+YnVmYnl0ZXMpIHsKLQkJICAgIGRic2l6ZSA9IGNvbmYtPmJ1ZmJ5dGVzIC0gZGJwb3M7Ci0JCX0KLQkJZWxzZSB7Ci0JCSAgICBkYnNpemUgPSBsZW5fcmVhZDsKLQkJfQotCQltZW1jcHkoZGJ1ZiArIGRicG9zLCBhcmdzYnVmZmVyLCBkYnNpemUpOwotCQlkYnBvcyArPSBkYnNpemU7Ci0JICAgIH0KLSAgICAgICAgICAgICh2b2lkKSBhcF9id3JpdGUoc2NyaXB0X291dCwgYXJnc2J1ZmZlciwgbGVuX3JlYWQsICZieXRlc193cml0dGVuKTsKLQkgICAgaWYgKGJ5dGVzX3dyaXR0ZW4gPCBsZW5fcmVhZCkgewotCQkvKiBzaWxseSBzY3JpcHQgc3RvcHBlZCByZWFkaW5nLCBzb2FrIHVwIHJlbWFpbmluZyBtZXNzYWdlICovCi0JCXdoaWxlIChhcF9nZXRfY2xpZW50X2Jsb2NrKHIsIGFyZ3NidWZmZXIsIEhVR0VfU1RSSU5HX0xFTikgPiAwKSB7Ci0JCSAgICAvKiBkdW1wIGl0ICovCi0JCX0KLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0JYXBfYmZsdXNoKHNjcmlwdF9vdXQpOwotICAgIH0KLQotICAgIGFwX2JjbG9zZShzY3JpcHRfb3V0KTsKLQotICAgIC8qIEhhbmRsZSBzY3JpcHQgcmV0dXJuLi4uICovCi0gICAgaWYgKHNjcmlwdF9pbiAmJiAhbnBoKSB7Ci0JY29uc3QgY2hhciAqbG9jYXRpb247Ci0JY2hhciBzYnVmW01BWF9TVFJJTkdfTEVOXTsKLQlpbnQgcmV0OwotCi0JaWYgKChyZXQgPSBhcF9zY2FuX3NjcmlwdF9oZWFkZXJfZXJyX2J1ZmYociwgc2NyaXB0X2luLCBzYnVmKSkpIHsKLQkgICAgcmV0dXJuIGxvZ19zY3JpcHQociwgY29uZiwgcmV0LCBkYnVmLCBzYnVmLCBzY3JpcHRfaW4sIHNjcmlwdF9lcnIpOwotCX0KLQotI2lmZGVmIENIQVJTRVRfRUJDRElDCi0gICAgICAgIC8qIE5vdyBjaGVjayB0aGUgQ29udGVudC1UeXBlIHRvIGRlY2lkZSBpZiBjb252ZXJzaW9uIGlzIG5lZWRlZCAqLwotICAgICAgICBhcF9jaGVja2NvbnYocik7Ci0jZW5kaWYgLypDSEFSU0VUX0VCQ0RJQyovCi0KLQlsb2NhdGlvbiA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX291dCwgIkxvY2F0aW9uIik7Ci0KLQlpZiAobG9jYXRpb24gJiYgbG9jYXRpb25bMF0gPT0gJy8nICYmIHItPnN0YXR1cyA9PSAyMDApIHsKLQotCSAgICAvKiBTb2FrIHVwIGFsbCB0aGUgc2NyaXB0IG91dHB1dCAqLwotCSAgICB3aGlsZSAoYXBfYmdldHMoYXJnc2J1ZmZlciwgSFVHRV9TVFJJTkdfTEVOLCBzY3JpcHRfaW4pID4gMCkgewotCQljb250aW51ZTsKLQkgICAgfQotCSAgICB3aGlsZSAoYXBfYmdldHMoYXJnc2J1ZmZlciwgSFVHRV9TVFJJTkdfTEVOLCBzY3JpcHRfZXJyKSA+IDApIHsKLQkJY29udGludWU7Ci0JICAgIH0KLQkgICAgLyogVGhpcyByZWRpcmVjdCBuZWVkcyB0byBiZSBhIEdFVCBubyBtYXR0ZXIgd2hhdCB0aGUgb3JpZ2luYWwKLQkgICAgICogbWV0aG9kIHdhcy4KLQkgICAgICovCi0JICAgIHItPm1ldGhvZCA9IGFwX3BzdHJkdXAoci0+cG9vbCwgIkdFVCIpOwotCSAgICByLT5tZXRob2RfbnVtYmVyID0gTV9HRVQ7Ci0KLQkgICAgLyogV2UgYWxyZWFkeSByZWFkIHRoZSBtZXNzYWdlIGJvZHkgKGlmIGFueSksIHNvIGRvbid0IGFsbG93Ci0JICAgICAqIHRoZSByZWRpcmVjdGVkIHJlcXVlc3QgdG8gdGhpbmsgaXQgaGFzIG9uZS4gIFdlIGNhbiBpZ25vcmUgCi0JICAgICAqIFRyYW5zZmVyLUVuY29kaW5nLCBzaW5jZSB3ZSB1c2VkIFJFUVVFU1RfQ0hVTktFRF9FUlJPUi4KLQkgICAgICovCi0JICAgIGFwX3RhYmxlX3Vuc2V0KHItPmhlYWRlcnNfaW4sICJDb250ZW50LUxlbmd0aCIpOwotCi0JICAgIGFwX2ludGVybmFsX3JlZGlyZWN0X2hhbmRsZXIobG9jYXRpb24sIHIpOwotCSAgICByZXR1cm4gT0s7Ci0JfQotCWVsc2UgaWYgKGxvY2F0aW9uICYmIHItPnN0YXR1cyA9PSAyMDApIHsKLQkgICAgLyogWFggTm90ZSB0aGF0IGlmIGEgc2NyaXB0IHdhbnRzIHRvIHByb2R1Y2UgaXRzIG93biBSZWRpcmVjdAotCSAgICAgKiBib2R5LCBpdCBub3cgaGFzIHRvIGV4cGxpY2l0bHkgKnNheSogIlN0YXR1czogMzAyIgotCSAgICAgKi8KLQkgICAgcmV0dXJuIFJFRElSRUNUOwotCX0KLQotCWFwX3NlbmRfaHR0cF9oZWFkZXIocik7Ci0JaWYgKCFyLT5oZWFkZXJfb25seSkgewotCSAgICBhcF9zZW5kX2ZiKHNjcmlwdF9pbiwgcik7Ci0JfQotCWFwX2JjbG9zZShzY3JpcHRfaW4pOwotCi0Jd2hpbGUgKGFwX2JnZXRzKGFyZ3NidWZmZXIsIEhVR0VfU1RSSU5HX0xFTiwgc2NyaXB0X2VycikgPiAwKSB7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlhcF9iY2xvc2Uoc2NyaXB0X2Vycik7Ci0gICAgfQotCi0gICAgaWYgKHNjcmlwdF9pbiAmJiBucGgpIHsKLQlhcF9zZW5kX2ZiKHNjcmlwdF9pbiwgcik7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwkJCS8qIE5PVCByLT5zdGF0dXMsIGV2ZW4gaWYgaXQgaGFzIGNoYW5nZWQuICovCi19Ci0KLXN0YXRpYyBjb25zdCBoYW5kbGVyX3JlYyBjZ2lfaGFuZGxlcnNbXSA9Ci17Ci0gICAge0NHSV9NQUdJQ19UWVBFLCBjZ2lfaGFuZGxlcn0sCi0gICAgeyJjZ2ktc2NyaXB0IiwgY2dpX2hhbmRsZXJ9LAotICAgIHtOVUxMfQotfTsKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGNnaV9tb2R1bGUgPQotewotICAgIFNUQU5EQVJEMjBfTU9EVUxFX1NUVUZGLAotICAgIE5VTEwsCQkJLyogZGlyIGNvbmZpZyBjcmVhdGVyICovCi0gICAgTlVMTCwJCQkvKiBkaXIgbWVyZ2VyIC0tLSBkZWZhdWx0IGlzIHRvIG92ZXJyaWRlICovCi0gICAgY3JlYXRlX2NnaV9jb25maWcsCQkvKiBzZXJ2ZXIgY29uZmlnICovCi0gICAgbWVyZ2VfY2dpX2NvbmZpZywJCS8qIG1lcmdlIHNlcnZlciBjb25maWcgKi8KLSAgICBjZ2lfY21kcywJCQkvKiBjb21tYW5kIGFwX3RhYmxlX3QgKi8KLSAgICBjZ2lfaGFuZGxlcnMsCQkvKiBoYW5kbGVycyAqLwotICAgIE5VTEwJCQkvKiByZWdpc3RlciBob29rcyAqLwotfTsKZGlmZiAtLWdpdCBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfY2dpLmV4cCBiL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfY2dpLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZlYTBjMi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2NnaS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1jZ2lfbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2NnaWQuYyBiL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfY2dpZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWE1OTFkLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfY2dpZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxMCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIAotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCi0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgCi0gKiBhcmUgbWV0OiAKLSAqIAotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgCi0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICogCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCAKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAKLSAqIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgCi0gKiBkaXN0cmlidXRpb24uIAotICogCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgCi0gKiBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogCi0gKiAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwIAotICogZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIgCi0gKiAKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8gCi0gKiBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKLSAqIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgCi0gKiAqIGFwYWNoZUBhcGFjaGUub3JnLiAKLSAqIAotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIgCi0gKiBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gCi0gKiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuIAotICogCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nIAotICogYWNrbm93bGVkZ21lbnQ6IAotICogIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cCAKLSAqIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iIAotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkgCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIAotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUiAKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCi0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSAKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCAKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKLSAqIAotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkgCi0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQgCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uIAotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlciAKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LiAKLSAqIAotICovIAotCi0vKiAKLSAqIGh0dHBfc2NyaXB0OiBrZWVwcyBhbGwgc2NyaXB0LXJlbGF0ZWQgcmFtYmxpbmdzIHRvZ2V0aGVyLiAKLSAqIAotICogQ29tcGxpYW50IHRvIGNnaS8xLjEgc3BlYyAKLSAqIAotICogQWRhcHRlZCBieSByc3QgZnJvbSBvcmlnaW5hbCBOQ1NBIGNvZGUgYnkgUm9iIE1jQ29vbCAKLSAqIAotICogQXBhY2hlIGFkZHMgc29tZSBuZXcgZW52IHZhcnM7IFJFRElSRUNUX1VSTCBhbmQgUkVESVJFQ1RfUVVFUllfU1RSSU5HIGZvciAKLSAqIGN1c3RvbSBlcnJvciByZXNwb25zZXMsIGFuZCBET0NVTUVOVF9ST09UIGJlY2F1c2Ugd2UgZm91bmQgaXQgdXNlZnVsLiAKLSAqIEl0IGFsc28gYWRkcyBTRVJWRVJfQURNSU4gLSB1c2VmdWwgZm9yIHNjcmlwdHMgdG8ga25vdyB3aG8gdG8gbWFpbCB3aGVuIAotICogdGhleSBmYWlsLiAKLSAqLyAKLQotCi0KLSNkZWZpbmUgQ09SRV9QUklWQVRFIAotCi0jaW5jbHVkZSAiYXByX2xpYi5oIgotI2luY2x1ZGUgImFwcl9nZW5lcmFsLmgiCi0jaW5jbHVkZSAiYXByX2ZpbGVfaW8uaCIKLSNpbmNsdWRlICJhcHJfcG9ydGFibGUuaCIKLSNpbmNsdWRlICJodHRwZC5oIiAKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIiAKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIgCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiIAotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIgCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiIAotI2luY2x1ZGUgImh0dHBfbG9nLmgiIAotI2luY2x1ZGUgInV0aWxfc2NyaXB0LmgiIAotI2luY2x1ZGUgImh0dHBfY29uZl9nbG9iYWxzLmgiIAotI2luY2x1ZGUgImJ1ZmYuaCIgCi0jaW5jbHVkZSAiYXBfbXBtLmgiCi0jaW5jbHVkZSAiaW9sX3NvY2tldC5oIgotCi0jaWZuZGVmIFVOSVhfUEFUSF9NQVgKLSNkZWZpbmUgVU5JWF9QQVRIX01BWCAxMDgKLSNlbmRpZgotCi0jaWZuZGVmIHNvY2thZGRyX3VuCi1zdHJ1Y3Qgc29ja2FkZHJfdW4gewotICAgIHVuc2lnbmVkIHNob3J0IHN1bl9mYW1pbHk7Ci0gICAgY2hhciBzdW5fcGF0aFtVTklYX1BBVEhfTUFYXTsKLX07Ci0jZW5kaWYKLQotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgY2dpZF9tb2R1bGU7IAotCi1zdGF0aWMgdm9pZCBjZ2lkX2luaXQoYXBfY29udGV4dF90ICpwLCBhcF9jb250ZXh0X3QgKnBsb2csIGFwX2NvbnRleHRfdCAqcHRlbXAsIHNlcnZlcl9yZWMgKm1haW5fc2VydmVyKTsgCi1zdGF0aWMgaW50IG9uY2VfdGhyb3VnaCA9IDA7IAotCi1zdGF0aWMgYXBfY29udGV4dF90ICpwY2dpOyAKLQotLyogS0xVREdFIC0tLSBmb3IgYmFjay1jb21iYXRpYmlsaXR5LCB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIEV4ZWNjZ2lkIAotICogaW4gU2NyaXB0QWxpYXNlZCBkaXJlY3Rvcmllcywgd2hpY2ggbWVhbnMgd2UgbmVlZCB0byBrbm93IGlmIHRoaXMgCi0gKiByZXF1ZXN0IGNhbWUgdGhyb3VnaCBTY3JpcHRBbGlhcyBvciBub3QuLi4gc28gdGhlIEFsaWFzIG1vZHVsZSAKLSAqIGxlYXZlcyBhIG5vdGUgZm9yIHVzLiAKLSAqLyAKLQotc3RhdGljIGludCBpc19zY3JpcHRhbGlhc2VkKHJlcXVlc3RfcmVjICpyKSAKLXsgCi0gICAgY29uc3QgY2hhciAqdCA9IGFwX3RhYmxlX2dldChyLT5ub3RlcywgImFsaWFzLWZvcmNlZC10eXBlIik7IAotICAgIHJldHVybiB0ICYmICghc3RyY2FzZWNtcCh0LCAiY2dpLXNjcmlwdCIpKTsgCi19IAotCi0vKiBDb25maWd1cmF0aW9uIHN0dWZmICovIAotCi0jZGVmaW5lIERFRkFVTFRfTE9HQllURVMgMTAzODU3NjAgCi0jZGVmaW5lIERFRkFVTFRfQlVGQllURVMgMTAyNCAKLSNkZWZpbmUgREVGQVVMVF9TT0NLRVQgImxvZ3MvY2dpc29jayIKLQotdHlwZWRlZiBzdHJ1Y3QgeyAKLSAgICBjb25zdCBjaGFyICpzb2NrbmFtZTsKLSAgICBjaGFyICpsb2duYW1lOyAKLSAgICBsb25nIGxvZ2J5dGVzOyAKLSAgICBpbnQgYnVmYnl0ZXM7IAotICAgIEJVRkYgKmJpbjsgCi0gICAgQlVGRiAqYm91dDsgCi0gICAgQlVGRiAqYmVycm9yOyAKLX0gY2dpZF9zZXJ2ZXJfY29uZjsgCi0KLS8qIElmIGEgcmVxdWVzdCBpbmNsdWRlcyBxdWVyeSBpbmZvIGluIHRoZSBVUkwgKHN0dWZmIGFmdGVyICI/IiksIGFuZAotICogdGhlIHF1ZXJ5IGluZm8gZG9lcyBub3QgY29udGFpbiAiPSIgKGluZGljYXRpdmUgb2YgYSBGT1JNIHN1Ym1pc3Npb24pLAotICogdGhlbiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGNyZWF0ZSB0aGUgYXJndW1lbnQgbGlzdCB0byBiZSBwYXNzZWQKLSAqIHRvIHRoZSBDR0kgc2NyaXB0LiAgV2hlbiBzdWV4ZWMgaXMgZW5hYmxlZCwgdGhlIHN1ZXhlYyBwYXRoLCB1c2VyLCBhbmQKLSAqIGdyb3VwIGFyZSB0aGUgZmlyc3QgdGhyZWUgYXJndW1lbnRzIHRvIGJlIHBhc3NlZDsgaWYgbm90LCBhbGwgdGhyZWUKLSAqIG11c3QgYmUgTlVMTC4gIFRoZSBxdWVyeSBpbmZvIGlzIHNwbGl0IGludG8gc2VwYXJhdGUgYXJndW1lbnRzLCB3aGVyZQotICogIisiIGlzIHRoZSBzZXBhcmF0b3IgYmV0d2VlbiBrZXl3b3JkIGFyZ3VtZW50cy4KLSAqCi0gKiBYWFhYOiBub3RlIHRoYXQgdGhlIFdJTjMyIGNvZGUgdXNlcyBvbmUgb2YgdGhlIHN1ZXhlYyBzdHJpbmdzCi0gKiB0byBwYXNzIGFuIGludGVycHJldGVyIG5hbWUuICBSZW1lbWJlciB0aGlzIGlmIGNoYW5naW5nIHRoZSB3YXkgdGhleQotICogYXJlIGhhbmRsZWQgaW4gY3JlYXRlX2FyZ3YuCi0gKgotICovCi1zdGF0aWMgY2hhciAqKmNyZWF0ZV9hcmd2KGFwX2NvbnRleHRfdCAqcCwgY2hhciAqcGF0aCwgY2hhciAqdXNlciwgY2hhciAqZ3JvdXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmF2MCwgY29uc3QgY2hhciAqYXJncykKLXsKLSAgICBpbnQgeCwgbnVtd29yZHM7Ci0gICAgY2hhciAqKmF2OwotICAgIGNoYXIgKnc7Ci0gICAgaW50IGlkeCA9IDA7Ci0KLSAgICAvKiBjb3VudCB0aGUgbnVtYmVyIG9mIGtleXdvcmRzICovCi0KLSAgICBmb3IgKHggPSAwLCBudW13b3JkcyA9IDE7IGFyZ3NbeF07IHgrKykgewotICAgICAgICBpZiAoYXJnc1t4XSA9PSAnKycpIHsKLSAgICAgICAgICAgICsrbnVtd29yZHM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobnVtd29yZHMgPiBBUEFDSEVfQVJHX01BWCAtIDUpIHsKLSAgICAgICAgbnVtd29yZHMgPSBBUEFDSEVfQVJHX01BWCAtIDU7ICAvKiBUcnVuY2F0ZSBhcmdzIHRvIHByZXZlbnQgb3ZlcnJ1biAqLwotICAgIH0KLSAgICBhdiA9IChjaGFyICoqKSBhcF9wYWxsb2MocCwgKG51bXdvcmRzICsgNSkgKiBzaXplb2YoY2hhciAqKSk7Ci0KLSAgICBpZiAocGF0aCkgewotICAgICAgICBhdltpZHgrK10gPSBwYXRoOwotICAgIH0KLSAgICBpZiAodXNlcikgewotICAgICAgICBhdltpZHgrK10gPSB1c2VyOwotICAgIH0KLSAgICBpZiAoZ3JvdXApIHsKLSAgICAgICAgYXZbaWR4KytdID0gZ3JvdXA7Ci0gICAgIH0KLQotICAgIGF2W2lkeCsrXSA9IGF2MDsKLQotICAgIGZvciAoeCA9IDE7IHggPD0gbnVtd29yZHM7IHgrKykgewotICAgICAgICB3ID0gYXBfZ2V0d29yZF9udWxscyhwLCAmYXJncywgJysnKTsKLSAgICAgICAgYXBfdW5lc2NhcGVfdXJsKHcpOwotICAgICAgICBhdltpZHgrK10gPSBhcF9lc2NhcGVfc2hlbGxfY21kKHAsIHcpOwotICAgIH0KLSAgICBhdltpZHhdID0gTlVMTDsKLSAgICByZXR1cm4gYXY7Ci19Ci0KLXN0YXRpYyBpbnQgY2FsbF9leGVjKHJlcXVlc3RfcmVjICpyLCBjaGFyICphcmd2MCwgY2hhciAqKmVudiwgaW50IHNoZWxsY21kKQotewotICAgIGludCBwaWQgPSAwOwotICAgIGludCBlcnJmaWxlbm8gPSBTVERFUlJfRklMRU5POwotCi0gICAgLyogdGhlIGZkIG9uIHItPnNlcnZlci0+ZXJyb3JfbG9nIGlzIGNsb3NlZCwgYnV0IHdlIG5lZWQgc29tZXdoZXJlIHRvICAgICAgICAgICAgKiBwdXQgdGhlIGVycm9yIG1lc3NhZ2VzIGZyb20gdGhlIGxvZ18qIGZ1bmN0aW9ucy4gU28sIHdlIHVzZSBzdGRlcnIsCi0gICAgICogc2luY2UgdGhhdCBpcyBiZXR0ZXIgdGhhbiBhbGxvd2luZyBlcnJvcnMgdG8gZ28gdW5ub3RpY2VkLiAKLSAgICAgKi8KLSAgICBhcF9wdXRfb3NfZmlsZSgmci0+c2VydmVyLT5lcnJvcl9sb2csICZlcnJmaWxlbm8sIHItPnBvb2wpOwotICAgIC8qIFRPRE86IHJlaW1wbGVtZW50IHN1ZXhlYyAqLwotI2lmIDAKLSAgICBpZiAoYXBfc3VleGVjX2VuYWJsZWQKLSAgICAgICAgJiYgKChyLT5zZXJ2ZXItPnNlcnZlcl91aWQgIT0gYXBfdXNlcl9pZCkKLSAgICAgICAgICAgIHx8IChyLT5zZXJ2ZXItPnNlcnZlcl9naWQgIT0gYXBfZ3JvdXBfaWQpCi0gICAgICAgICAgICB8fCAoIXN0cm5jbXAoIi9+Iiwgci0+dXJpLCAyKSkpKSB7Ci0KLSAgICAgICAgY2hhciAqZXhlY3VzZXIsICpncnBuYW1lOwotICAgICAgICBzdHJ1Y3QgcGFzc3dkICpwdzsKLSAgICAgICAgc3RydWN0IGdyb3VwICpncjsKLQotICAgICAgICBpZiAoIXN0cm5jbXAoIi9+Iiwgci0+dXJpLCAyKSkgewotICAgICAgICAgICAgZ2lkX3QgdXNlcl9naWQ7Ci0gICAgICAgICAgICBjaGFyICp1c2VybmFtZSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgci0+dXJpICsgMik7Ci0gICAgICAgICAgICBjaGFyICpwb3MgPSBzdHJjaHIodXNlcm5hbWUsICcvJyk7Ci0KLSAgICAgICAgICAgIGlmIChwb3MpIHsKLSAgICAgICAgICAgICAgICAqcG9zID0gJ1wwJzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChwdyA9IGdldHB3bmFtKHVzZXJuYW1lKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0cHduYW06IGludmFsaWQgdXNlcm5hbWUgJXMiLCB1c2VybmFtZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChwaWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXhlY3VzZXIgPSBhcF9wc3RyY2F0KHItPnBvb2wsICJ+IiwgcHctPnB3X25hbWUsIE5VTEwpOwotICAgICAgICAgICAgdXNlcl9naWQgPSBwdy0+cHdfZ2lkOwotCi0gICAgICAgICAgICBpZiAoKGdyID0gZ2V0Z3JnaWQodXNlcl9naWQpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChncnBuYW1lID0gYXBfcGFsbG9jKHItPnBvb2wsIDE2KSkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHBpZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhcF9zbnByaW50ZihncnBuYW1lLCAxNiwgIiVsZCIsIChsb25nKSB1c2VyX2dpZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ3JwbmFtZSA9IGdyLT5ncl9uYW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKChwdyA9IGdldHB3dWlkKHItPnNlcnZlci0+c2VydmVyX3VpZCkpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldHB3dWlkOiBpbnZhbGlkIHVzZXJpZCAlbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgci0+c2VydmVyLT5zZXJ2ZXJfdWlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKHBpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBleGVjdXNlciA9IGFwX3BzdHJkdXAoci0+cG9vbCwgcHctPnB3X25hbWUpOwotCi0gICAgICAgICAgICBpZiAoKGdyID0gZ2V0Z3JnaWQoci0+c2VydmVyLT5zZXJ2ZXJfZ2lkKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0Z3JnaWQ6IGludmFsaWQgZ3JvdXBpZCAlbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgci0+c2VydmVyLT5zZXJ2ZXJfZ2lkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKHBpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBncnBuYW1lID0gZ3ItPmdyX25hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2hlbGxjbWQpIHsKLSAgICAgICAgICAgIGV4ZWNsZShTVUVYRUNfQklOLCBTVUVYRUNfQklOLCBleGVjdXNlciwgZ3JwbmFtZSwgYXJndjAsCi0gICAgICAgICAgICAgICAgICAgTlVMTCwgZW52KTsKLSAgICAgICAgfQotCi0gICAgICAgIGVsc2UgaWYgKCghci0+YXJncykgfHwgKCFyLT5hcmdzWzBdKSB8fCBzdHJjaHIoci0+YXJncywgJz0nKSkgewotICAgICAgICAgICAgZXhlY2xlKFNVRVhFQ19CSU4sIFNVRVhFQ19CSU4sIGV4ZWN1c2VyLCBncnBuYW1lLCBhcmd2MCwKLSAgICAgICAgICAgICAgICAgICBOVUxMLCBlbnYpOwotICAgICAgICB9Ci0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBleGVjdmUoU1VFWEVDX0JJTiwKLSAgICAgICAgICAgICAgICAgICBjcmVhdGVfYXJndihyLT5wb29sLCBTVUVYRUNfQklOLCBleGVjdXNlciwgZ3JwbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2MCwgci0+YXJncyksCi0gICAgICAgICAgICAgICAgICAgZW52KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSNlbmRpZgotICAgICAgICBpZiAoc2hlbGxjbWQpIHsKLSAgICAgICAgICAgIGV4ZWNsZShTSEVMTF9QQVRILCBTSEVMTF9QQVRILCAiLWMiLCBhcmd2MCwgTlVMTCwgZW52KTsKLSAgICAgICAgfQotCi0gICAgICAgIGVsc2UgaWYgKCghci0+YXJncykgfHwgKCFyLT5hcmdzWzBdKSB8fCBzdHJjaHIoci0+YXJncywgJz0nKSkgewotICAgICAgICAgICAgZXhlY2xlKHItPmZpbGVuYW1lLCBhcmd2MCwgTlVMTCwgZW52KTsKLSAgICAgICAgfQotCi0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZXhlY3ZlKHItPmZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgIGNyZWF0ZV9hcmd2KHItPnBvb2wsIE5VTEwsIE5VTEwsIE5VTEwsIGFyZ3YwLCByLT5hcmdzKSwKLSAgICAgICAgICAgICAgICAgICBlbnYpOwotICAgICAgICB9Ci0jaWYgMAotICAgIH0KLSNlbmRpZgotICAgIHJldHVybiAocGlkKTsKLX0KLQotc3RhdGljIHZvaWQgY2dpZF9tYWludChpbnQgcmVhc29uLCB2b2lkICpkYXRhLCBhcF93YWl0X3Qgc3RhdHVzKQotewotI2lmZGVmIEhBU19PVEhFUl9DSElMRAotICAgIGludCAqc2QgPSBkYXRhOwotICAgIHN3aXRjaCAocmVhc29uKSB7Ci0gICAgICAgIGNhc2UgT0NfUkVBU09OX0RFQVRIOgotICAgICAgICBjYXNlIE9DX1JFQVNPTl9MT1NUOgotICAgICAgICAgICAgLyogc3RvcCBnYXAgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgZWxzZSB3b3Jrcy4gIEluIHRoZSBlbmQsCi0gICAgICAgICAgICAgKiB3ZSdsbCBqdXN0IHJlc3RhcnQgdGhlIGNnaWQgc2VydmVyLiAqLyAgIAotICAgICAgICAgICAga2lsbChnZXRwcGlkKCksIFNJR1dJTkNIKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9DX1JFQVNPTl9SRVNUQVJUOgotICAgICAgICBjYXNlIE9DX1JFQVNPTl9VTlJFR0lTVEVSOgotICAgICAgICAgICAga2lsbCgqc2QsIFNJR0hVUCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgZ2V0X3JlcShpbnQgZmQsIHJlcXVlc3RfcmVjICpyLCBjaGFyICoqZmlsZW5hbWUsIGNoYXIgKiphcmd2MCwgY2hhciAqKiplbnYpIAoteyAKLSAgICBpbnQgaSwgbGVuLCBqOyAKLSAgICB1bnNpZ25lZCBjaGFyICpkYXRhOyAKLSAgICBjaGFyICoqZW52aXJvbjsgCi0gICAgY2hhciB0ZW1wW01BWF9TVFJJTkdfTEVOXTsgCi0gICAgY29yZV9kaXJfY29uZmlnICp0ZW1wX2NvcmU7IAotICAgIHZvaWQgKipkY29uZjsgCi0KLSAgICByLT5zZXJ2ZXIgPSBhcF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihzZXJ2ZXJfcmVjKSk7IAotCi0gICAgcmVhZChmZCwgJmosIHNpemVvZihpbnQpKTsgCi0gICAgcmVhZChmZCwgJmxlbiwgc2l6ZW9mKGludCkpOyAKLSAgICBkYXRhID0gYXBfcGNhbGxvYyhyLT5wb29sLCBsZW4pOyAKLSAgICBpID0gcmVhZChmZCwgZGF0YSwgbGVuKTsgCi0KLSAgICByLT5maWxlbmFtZSA9IGFwX2dldHdvcmQoci0+cG9vbCwgKGNvbnN0IGNoYXIgKiopJmRhdGEsICdcbicpOyAKLSAgICAqYXJndjAgPSBhcF9nZXR3b3JkKHItPnBvb2wsIChjb25zdCBjaGFyICoqKSZkYXRhLCAnXG4nKTsgCi0KLSAgICByLT51cmkgPSBhcF9nZXR3b3JkKHItPnBvb2wsIChjb25zdCBjaGFyICoqKSZkYXRhLCAnXG4nKTsgCi0gICAgCi0gICAgZW52aXJvbiA9IGFwX3BjYWxsb2Moci0+cG9vbCwgKGogKyAyKSAqc2l6ZW9mKGNoYXIgKikpOyAKLSAgICBpID0gMDsgCi0gICAgZm9yIChpID0gMDsgaSA8IGo7IGkrKykgeyAKLSAgICAgICAgZW52aXJvbltpXSA9IGFwX2dldHdvcmQoci0+cG9vbCwgKGNvbnN0IGNoYXIgKiopJmRhdGEsICdcbicpOyAKLSAgICB9IAotICAgICplbnYgPSBlbnZpcm9uOyAKLSAgICByLT5hcmdzID0gYXBfZ2V0d29yZChyLT5wb29sLCAoY29uc3QgY2hhciAqKikmZGF0YSwgJ1xuJyk7IAotICAKLSAgICByZWFkKGZkLCAmci0+c2VydmVyLT5zZXJ2ZXJfdWlkLCBzaXplb2YodWlkX3QpKTsgCi0gICAgcmVhZChmZCwgJnItPnNlcnZlci0+c2VydmVyX2dpZCwgc2l6ZW9mKGdpZF90KSk7IAotCi0gICAgcmVhZChmZCwgJmksIHNpemVvZihpbnQpKTsgCi0gICAgIAotICAgIC8qIGFkZCAxLCBzbyB0aGF0IGlmIGkgPT0gMCwgd2Ugc3RpbGwgbWFsbG9jIHNvbWV0aGluZy4gKi8gCi0gICAgZGNvbmYgPSAodm9pZCAqKiltYWxsb2Moc2l6ZW9mKHZvaWQgKikgKiBpICsgMSk7IAotCi0gICAgdGVtcF9jb3JlID0gKGNvcmVfZGlyX2NvbmZpZyAqKW1hbGxvYyhzaXplb2YoY29yZV9tb2R1bGUpKTsgCi0jaWYgMAotI2lmZGVmIFJMSU1JVF9DUFUgCi0gICAgcmVhZChmZCwgJmosIHNpemVvZihpbnQpKTsgCi0gICAgaWYgKGopIHsgCi0gICAgICAgIHRlbXBfY29yZS0+bGltaXRfY3B1ID0gKHN0cnVjdCBybGltaXQgKiltYWxsb2MgKHNpemVvZihzdHJ1Y3QgcmxpbWl0KSk7IAotICAgICAgICByZWFkKGZkLCB0ZW1wX2NvcmUtPmxpbWl0X2NwdSwgc2l6ZW9mKHN0cnVjdCBybGltaXQpKTsgCi0gICAgfSAKLSAgICBlbHNlIHsgCi0gICAgICAgIHRlbXBfY29yZS0+bGltaXRfY3B1ID0gTlVMTDsgCi0gICAgfSAKLSNlbmRpZiAKLQotI2lmIGRlZmluZWQgKFJMSU1JVF9EQVRBKSB8fCBkZWZpbmVkKFJMSU1JVF9WTUVNKSB8fCBkZWZpbmVkKFJMSU1JVF9BUykgCi0gICAgcmVhZChmZCwgJmosIHNpemVvZihpbnQpKTsgCi0gICAgaWYgKGopIHsgCi0gICAgICAgIHRlbXBfY29yZS0+bGltaXRfbWVtID0gKHN0cnVjdCBybGltaXQgKiltYWxsb2MgKHNpemVvZihzdHJ1Y3QgcmxpbWl0KSk7IAotICAgICAgICByZWFkKGZkLCB0ZW1wX2NvcmUtPmxpbWl0X21lbSwgc2l6ZW9mKHN0cnVjdCBybGltaXQpKTsgCi0gICAgfSAKLSAgICBlbHNlIHsgCi0gICAgICAgIHRlbXBfY29yZS0+bGltaXRfbWVtID0gTlVMTDsgCi0gICAgfSAKLSNlbmRpZiAKLQotI2lmZGVmIFJMSU1JVF9OUFJPQyAKLSAgICByZWFkKGZkLCAmaiwgc2l6ZW9mKGludCkpOyAKLSAgICBpZiAoaikgeyAKLSAgICAgICAgdGVtcF9jb3JlLT5saW1pdF9ucHJvYyA9IChzdHJ1Y3QgcmxpbWl0ICopbWFsbG9jIChzaXplb2Yoc3RydWN0IHJsaW1pdCkpOyAKLSAgICAgICAgcmVhZChmZCwgdGVtcF9jb3JlLT5saW1pdF9ucHJvYywgc2l6ZW9mKHN0cnVjdCBybGltaXQpKTsgCi0gICAgfSAKLSAgICBlbHNlIHsgCi0gICAgICAgIHRlbXBfY29yZS0+bGltaXRfbnByb2MgPSBOVUxMOyAKLSAgICB9IAotI2VuZGlmIAotI2VuZGlmCi0gICAgZGNvbmZbaV0gPSAodm9pZCAqKXRlbXBfY29yZTsgCi0gICAgci0+cGVyX2Rpcl9jb25maWcgPSBkY29uZjsgCi19IAotCi0KLQotc3RhdGljIHZvaWQgc2VuZF9yZXEoaW50IGZkLCByZXF1ZXN0X3JlYyAqciwgY2hhciAqYXJndjAsIGNoYXIgKiplbnYpIAoteyAKLSAgICBpbnQgbGVuOyAKLSAgICBpbnQgcnY7Ci0gICAgaW50IGkgPSAwOyAKLSAgICBjaGFyICpkYXRhOyAKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvbmYgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvcmVfbW9kdWxlKTsgCi0KLSAgICBkYXRhID0gYXBfcHN0cmNhdChyLT5wb29sLCByLT5maWxlbmFtZSwgIlxuIiwgYXJndjAsICJcbiIsIHItPnVyaSwgIlxuIiwgCi0gICAgICAgICAgICAgICAgICAgICBOVUxMKTsgCi0KLSAgICBmb3IgKGkgPTA7IGVudltpXTsgaSsrKSB7IAotICAgICAgICBjb250aW51ZTsgCi0gICAgfSAKLQotICAgIGlmICh3cml0ZShmZCwgJmksIHNpemVvZihpbnQpKSA8IDApIHsKLSAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGVycm5vLCByLCAKLSAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byBjZ2kgZGFlbW9uIHByb2Nlc3MiKTsgCi0gICAgICAgIH0gICAgIAotCi0gICAgZm9yIChpID0gMDsgZW52W2ldOyBpKyspIHsgCi0gICAgICAgIGRhdGEgPSBhcF9wc3RyY2F0KHItPnBvb2wsIGRhdGEsIGVudltpXSwgIlxuIiwgTlVMTCk7IAotICAgIH0gCi0gICAgZGF0YSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgZGF0YSwgci0+YXJncywgTlVMTCk7IAotICAgIGxlbiA9IHN0cmxlbihkYXRhKTsgCi0gICAgaWYgKHdyaXRlKGZkLCAmbGVuLCBzaXplb2YoaW50KSkgPCAwKSB7IAotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHIsIAotICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIGNnaSBkYWVtb24gcHJvY2VzcyIpOyAKLSAgICAgICAgfSAgICAgCi0gICAgaWYgKHdyaXRlKGZkLCBkYXRhLCBsZW4pIDwgMCkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHIsIAotICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIGNnaSBkYWVtb24gcHJvY2VzcyIpOyAKLSAgICAgICAgfSAgICAgCi0gICAgaWYgKHdyaXRlKGZkLCAmci0+c2VydmVyLT5zZXJ2ZXJfdWlkLCBzaXplb2YodWlkX3QpKSA8IDApIHsKLSAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGVycm5vLCByLCAKLSAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byBjZ2kgZGFlbW9uIHByb2Nlc3MiKTsgCi0gICAgICAgIH0gICAgIAotICAgIGlmICh3cml0ZShmZCwgJnItPnNlcnZlci0+c2VydmVyX2dpZCwgc2l6ZW9mKGdpZF90KSkgPCAwKSB7IAotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHIsIAotICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIGNnaSBkYWVtb24gcHJvY2VzcyIpOyAKLSAgICAgICAgfSAgICAgCi0gICAgaWYgKHdyaXRlKGZkLCAmY29yZV9tb2R1bGUubW9kdWxlX2luZGV4LCBzaXplb2YoaW50KSkgPCAwKSB7IAotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHIsIAotICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIGNnaSBkYWVtb24gcHJvY2VzcyIpOyAKLSAgICAgICAgfSAgICAgCi0jaWYgMAotI2lmZGVmIFJMSU1JVF9DUFUgCi0gICAgaWYgKGNvbmYtPmxpbWl0X2NwdSkgeyAKLSAgICAgICAgbGVuID0gMTsgCi0gICAgICAgIHdyaXRlKGZkLCAmbGVuLCBzaXplb2YoaW50KSk7IAotICAgICAgICB3cml0ZShmZCwgY29uZi0+bGltaXRfY3B1LCBzaXplb2Yoc3RydWN0IHJsaW1pdCkpOyAKLSAgICB9IAotICAgIGVsc2UgeyAKLSAgICAgICAgbGVuID0gMDsgCi0gICAgICAgIHdyaXRlKGZkLCAmbGVuLCBzaXplb2YoaW50KSk7IAotICAgIH0gCi0jZW5kaWYgCi0KLSNpZiBkZWZpbmVkKFJMSU1JVF9EQVRBKSB8fCBkZWZpbmVkKFJMSU1JVF9WTUVNKSB8fCBkZWZpbmVkKFJMSU1JVF9BUykgCi0gICAgaWYgKGNvbmYtPmxpbWl0X21lbSkgeyAKLSAgICAgICAgbGVuID0gMTsgCi0gICAgICAgIHdyaXRlKGZkLCAmbGVuLCBzaXplb2YoaW50KSk7IAotICAgICAgICB3cml0ZShmZCwgY29uZi0+bGltaXRfbWVtLCBzaXplb2Yoc3RydWN0IHJsaW1pdCkpOyAKLSAgICB9IAotICAgIGVsc2UgeyAKLSAgICAgICAgbGVuID0gMDsgCi0gICAgICAgIHdyaXRlKGZkLCAmbGVuLCBzaXplb2YoaW50KSk7IAotICAgIH0gCi0jZW5kaWYgCi0gIAotI2lmZGVmIFJMSU1JVF9OUFJPQyAKLSAgICBpZiAoY29uZi0+bGltaXRfbnByb2MpIHsgCi0gICAgICAgIGxlbiA9IDE7IAotICAgICAgICB3cml0ZShmZCwgJmxlbiwgc2l6ZW9mKGludCkpOyAKLSAgICAgICAgd3JpdGUoZmQsIGNvbmYtPmxpbWl0X25wcm9jLCBzaXplb2Yoc3RydWN0IHJsaW1pdCkpOyAKLSAgICB9IAotICAgIGVsc2UgeyAKLSAgICAgICAgbGVuID0gMDsgCi0gICAgICAgIHdyaXRlKGZkLCAmbGVuLCBzaXplb2YoaW50KSk7IAotICAgIH0gCi0jZW5kaWYKLSNlbmRpZiAKLX0gCi0KLXN0YXRpYyBpbnQgY2dpZF9zZXJ2ZXJfY2hpbGQoaW50IHNkKSAKLXsgCi0gICAgY2hhciAqYXJndjA7IAotICAgIGNoYXIgKmZpbGVuYW1lOyAKLSAgICBjaGFyICoqZW52OyAKLSAgICBhcF9jb250ZXh0X3QgKnA7IAotICAgIHJlcXVlc3RfcmVjICpyOyAKLQotICAgIGFwX2NyZWF0ZV9jb250ZXh0KCZwLCBwY2dpKTsgCi0gICAgciA9IGFwX3BjYWxsb2MocCwgc2l6ZW9mKHJlcXVlc3RfcmVjKSk7IAotICAgIHItPnBvb2wgPSBwOyAKLSAgICBkdXAyKHNkLCBTVERJTl9GSUxFTk8pOyAKLSAgICBkdXAyKHNkLCBTVERPVVRfRklMRU5PKTsgCi0gICAgZ2V0X3JlcShzZCwgciwgJmZpbGVuYW1lLCAmYXJndjAsICZlbnYpOyAKLSAgICBjYWxsX2V4ZWMociwgYXJndjAsIGVudiwgMCk7IAotICAgIGV4aXQoLTEpOyAgIC8qIFdlIHNob3VsZCBORVZFUiBnZXQgaGVyZSAqLwotfSAKLQotc3RhdGljIGludCBjZ2lkX3NlcnZlcih2b2lkICpkYXRhKSAKLXsgCi0gICAgc3RydWN0IHNvY2thZGRyX3VuIHVuaXhfYWRkcjsKLSAgICBpbnQgcGlkOyAKLSAgICBpbnQgc2QsIHNkMiwgbGVuOwotICAgIGludCBlcnJmaWxlOwotICAgIHNlcnZlcl9yZWMgKm1haW5fc2VydmVyID0gZGF0YTsKLSAgICBjZ2lkX3NlcnZlcl9jb25mICpzY29uZiA9IChjZ2lkX3NlcnZlcl9jb25mICopYXBfZ2V0X21vZHVsZV9jb25maWcoIAotICAgICAgICAgICAgICAgICAgICAgICBtYWluX3NlcnZlci0+bW9kdWxlX2NvbmZpZywgJmNnaWRfbW9kdWxlKTsgCi0KLSAgICBzaWduYWwoU0lHQ0hMRCwgU0lHX0lHTik7IAotICAgIHVubGluayhzY29uZi0+c29ja25hbWUpOyAKLQotICAgIGlmICgoc2QgPSBzb2NrZXQoQUZfVU5JWCwgU09DS19TVFJFQU0sIDApKSA8IDApIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIG1haW5fc2VydmVyLCAKLSAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBjcmVhdGUgdW5peCBkb21haW4gc29ja2V0Iik7IAotICAgIH0gCi0KLSAgICBtZW1zZXQoJnVuaXhfYWRkciwgMCwgc2l6ZW9mKHVuaXhfYWRkcikpOwotICAgIHVuaXhfYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKLSAgICBzdHJjcHkodW5peF9hZGRyLnN1bl9wYXRoLCBzY29uZi0+c29ja25hbWUpOwotCi0gICAgaWYgKGJpbmQoc2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikmdW5peF9hZGRyLCBzaXplb2YodW5peF9hZGRyKSkgPCAwKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGVycm5vLCBtYWluX3NlcnZlciwgCi0gICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgYmluZCB1bml4IGRvbWFpbiBzb2NrZXQiKTsgCi0gICAgfSAKLSAgICAvKiBNb3N0IGltcGxlbWVudGF0aW9ucyBzaWxlbnRseSBlbmZvcmNlIGEgdmFsdWUgb2YgNSBhbnl3YXkuICAKLSAgICAgKiBUaGlzIHdheSwgaXQnbGwgd29yayB0aGUgc2FtZSBldmVyeXdoZXJlLiAqLwotICAgIGlmIChsaXN0ZW4oc2QsIDUpIDwgMCkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgbWFpbl9zZXJ2ZXIsIAotICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGxpc3RlbiBvbiB1bml4IGRvbWFpbiBzb2NrZXQiKTsgCi0gICAgfSAKLQotICAgIHdoaWxlICgxKSB7IAotICAgICAgICBzZDIgPSBhY2NlcHQoc2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikmdW5peF9hZGRyLCAmbGVuKTsKLSAgICAgICAgaWYgKHNkMiA8IDApIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGVycm5vLCAoc2VydmVyX3JlYyAqKWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGFjY2VwdGluZyBvbiBjZ2lkIHNvY2tldC4iKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgCi0gICAgICAgIGlmICgocGlkID0gZm9yaygpKSA+IDApIHsKLSAgICAgICAgICAgIGNsb3NlKHNkMik7Ci0gICAgICAgIH0gCi0gICAgICAgIGVsc2UgaWYgKHBpZCA9PSAwKSB7IAotICAgICAgICAgICAgLyogc2V0dXAgdGhlIFNUREVSUiBoZXJlLCBiZWNhdXNlIEkgaGF2ZSBhbGwgdGhlIGluZm8KLSAgICAgICAgICAgICAqIGZvciBpdC4gIEknbGwgZG8gdGhlIFNURElOIGFuZCBTVERPVVQgbGF0ZXIsIGJ1dCBJIGNhbid0Ci0gICAgICAgICAgICAgKiBkbyBTVERFUlIgYXMgZWFzaWx5LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoc2NvbmYtPmxvZ25hbWUpIHsKLSAgICAgICAgICAgICAgICBkdXAyKG9wZW4oc2NvbmYtPmxvZ25hbWUsIE9fV1JPTkxZKSwgU1RERVJSX0ZJTEVOTyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBhcF9nZXRfb3NfZmlsZSgmZXJyZmlsZSwgbWFpbl9zZXJ2ZXItPmVycm9yX2xvZyk7Ci0gICAgICAgICAgICAgICAgZHVwMihlcnJmaWxlLCBTVERFUlJfRklMRU5PKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNnaWRfc2VydmVyX2NoaWxkKHNkMik7IAotICAgICAgICB9IAotICAgICAgICBlbHNlIHsgCi0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgKHNlcnZlcl9yZWMgKilkYXRhLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgZm9yayBjZ2kgc2NyaXB0Iik7IAotICAgICAgICB9IAotICAgIH0gCi0gICAgcmV0dXJuIC0xOyAKLX0gCi0KLXN0YXRpYyB2b2lkIGNnaWRfaW5pdChhcF9jb250ZXh0X3QgKnAsIGFwX2NvbnRleHRfdCAqcGxvZywgYXBfY29udGV4dF90ICpwdGVtcCwgc2VydmVyX3JlYyAqbWFpbl9zZXJ2ZXIpIAoteyAKLSAgICBpbnQgcGlkOyAKLSAgICBpbnQgdGVtcGZkOwotCi0gICAgY2dpZF9zZXJ2ZXJfY29uZiAqc2NvbmYgPSAoY2dpZF9zZXJ2ZXJfY29uZiAqKWFwX2dldF9tb2R1bGVfY29uZmlnKCAKLSAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9zZXJ2ZXItPm1vZHVsZV9jb25maWcsICZjZ2lkX21vZHVsZSk7IAotCi0gICAgaWYgKG9uY2VfdGhyb3VnaCA+IDApIHsgCi0gICAgICAgIGFwX2NyZWF0ZV9jb250ZXh0KCZwY2dpLCBwKTsgCi0gICAgICAgIHRlbXBmZCA9IGNyZWF0KHNjb25mLT5zb2NrbmFtZSwgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JV0dSUCB8IFNfSVJPVEggfCBTX0lXT1RIKTsKLSAgICAgICAgY2xvc2UodGVtcGZkKTsgICAgICAgIAotCi0gICAgICAgIGlmICgocGlkID0gZm9yaygpKSA8IDApIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGVycm5vLCBtYWluX3NlcnZlciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IHNwYXduIGNnaWQgZGFlbW9uIHByb2Nlc3MiKTsgCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGlkID09IDApIHsKLSAgICAgICAgICAgIGNnaWRfc2VydmVyKG1haW5fc2VydmVyKTsKLSAgICAgICAgICAgIGV4aXQoLTEpOwotICAgICAgICB9IAotI2lmZGVmIEhBU19PVEhFUl9DSElMRAotICAgICAgICBhcF9yZWdpc3Rlcl9vdGhlcl9jaGlsZChwaWQsIGNnaWRfbWFpbnQsICZwaWQsIC0xKTsKLSNlbmRpZgotICAgIH0gCi0gICAgZWxzZSBvbmNlX3Rocm91Z2grKzsgCi19IAotCi1zdGF0aWMgdm9pZCAqY3JlYXRlX2NnaWRfY29uZmlnKGFwX2NvbnRleHRfdCAqcCwgc2VydmVyX3JlYyAqcykgCi17IAotICAgIGNnaWRfc2VydmVyX2NvbmYgKmMgPSAKLSAgICAoY2dpZF9zZXJ2ZXJfY29uZiAqKSBhcF9wY2FsbG9jKHAsIHNpemVvZihjZ2lkX3NlcnZlcl9jb25mKSk7IAotCi0gICAgYy0+bG9nbmFtZSA9IE5VTEw7IAotICAgIGMtPmxvZ2J5dGVzID0gREVGQVVMVF9MT0dCWVRFUzsgCi0gICAgYy0+YnVmYnl0ZXMgPSBERUZBVUxUX0JVRkJZVEVTOyAKLSAgICBjLT5zb2NrbmFtZSA9IGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHAsIERFRkFVTFRfU09DS0VUKTsgCi0gICAgYy0+YmluID0gYy0+Ym91dCA9IGMtPmJlcnJvciA9IE5VTEw7IAotICAgIHJldHVybiBjOyAKLX0gCi0KLXN0YXRpYyB2b2lkICptZXJnZV9jZ2lkX2NvbmZpZyhhcF9jb250ZXh0X3QgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICpvdmVycmlkZXN2KSAKLXsgCi0gICAgY2dpZF9zZXJ2ZXJfY29uZiAqYmFzZSA9IChjZ2lkX3NlcnZlcl9jb25mICopIGJhc2V2LCAqb3ZlcnJpZGVzID0gKGNnaWRfc2VydmVyX2NvbmYgKikgb3ZlcnJpZGVzdjsgCi0KLSAgICByZXR1cm4gb3ZlcnJpZGVzLT5sb2duYW1lID8gb3ZlcnJpZGVzIDogYmFzZTsgCi19IAotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3NjcmlwdGxvZyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgCi17IAotICAgIHNlcnZlcl9yZWMgKnMgPSBjbWQtPnNlcnZlcjsgCi0gICAgY2dpZF9zZXJ2ZXJfY29uZiAqY29uZiA9IAotICAgIChjZ2lkX3NlcnZlcl9jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsICZjZ2lkX21vZHVsZSk7IAotCi0gICAgY29uZi0+bG9nbmFtZSA9IGFyZzsgCi0gICAgcmV0dXJuIE5VTEw7IAotfSAKLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9zY3JpcHRsb2dfbGVuZ3RoKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsgCi0gICAgc2VydmVyX3JlYyAqcyA9IGNtZC0+c2VydmVyOyAKLSAgICBjZ2lkX3NlcnZlcl9jb25mICpjb25mID0gCi0gICAgKGNnaWRfc2VydmVyX2NvbmYgKikgYXBfZ2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywgJmNnaWRfbW9kdWxlKTsgCi0KLSAgICBjb25mLT5sb2dieXRlcyA9IGF0b2woYXJnKTsgCi0gICAgcmV0dXJuIE5VTEw7IAotfSAKLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9zY3JpcHRsb2dfYnVmZmVyKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsgCi0gICAgc2VydmVyX3JlYyAqcyA9IGNtZC0+c2VydmVyOyAKLSAgICBjZ2lkX3NlcnZlcl9jb25mICpjb25mID0gCi0gICAgKGNnaWRfc2VydmVyX2NvbmYgKikgYXBfZ2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywgJmNnaWRfbW9kdWxlKTsgCi0KLSAgICBjb25mLT5idWZieXRlcyA9IGF0b2koYXJnKTsgCi0gICAgcmV0dXJuIE5VTEw7IAotfSAKLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9zY3JpcHRfc29ja2V0KGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsgCi0gICAgc2VydmVyX3JlYyAqcyA9IGNtZC0+c2VydmVyOyAKLSAgICBjZ2lkX3NlcnZlcl9jb25mICpjb25mID0gCi0gICAgKGNnaWRfc2VydmVyX2NvbmYgKikgYXBfZ2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywgJmNnaWRfbW9kdWxlKTsgCi0KLSAgICBjb25mLT5zb2NrbmFtZSA9IGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKGNtZC0+cG9vbCwgYXJnKTsgCi0gICAgcmV0dXJuIE5VTEw7IAotfSAKLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIGNnaWRfY21kc1tdID0gCi17IAotICAgIHsiU2NyaXB0TG9nIiwgc2V0X3NjcmlwdGxvZywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwgCi0gICAgICJ0aGUgbmFtZSBvZiBhIGxvZyBmb3Igc2NyaXB0IGRlYnVnZ2luZyBpbmZvIn0sIAotICAgIHsiU2NyaXB0TG9nTGVuZ3RoIiwgc2V0X3NjcmlwdGxvZ19sZW5ndGgsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsIAotICAgICAidGhlIG1heGltdW0gbGVuZ3RoIChpbiBieXRlcykgb2YgdGhlIHNjcmlwdCBkZWJ1ZyBsb2cifSwgCi0gICAgeyJTY3JpcHRMb2dCdWZmZXIiLCBzZXRfc2NyaXB0bG9nX2J1ZmZlciwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwgCi0gICAgICJ0aGUgbWF4aW11bSBzaXplIChpbiBieXRlcykgdG8gcmVjb3JkIG9mIGEgUE9TVCByZXF1ZXN0In0sIAotICAgIHsiU2NyaXB0c29jayIsIHNldF9zY3JpcHRfc29ja2V0LCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLCAKLSAgICAgInRoZSBuYW1lIG9mIHRoZSBzb2NrZXQgdG8gdXNlIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGNnaSBkYWVtb24uIn0sIAotICAgIHtOVUxMfSAKLX07IAotCi1zdGF0aWMgaW50IGxvZ19zY3JpcHRlcnJvcihyZXF1ZXN0X3JlYyAqciwgY2dpZF9zZXJ2ZXJfY29uZiAqIGNvbmYsIGludCByZXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNob3dfZXJybm8sIGNoYXIgKmVycm9yKSAKLXsgCi0gICAgYXBfZmlsZV90ICpmID0gTlVMTDsgCi0gICAgc3RydWN0IHN0YXQgZmluZm87IAotICAgIGNoYXIgdGltZV9zdHJbQVBfQ1RJTUVfTEVOXTsKLQotICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgc2hvd19lcnJub3xBUExPR19FUlIsIGVycm5vLCByLCAKLSAgICAgICAgICAgICAgICAiJXM6ICVzIiwgZXJyb3IsIHItPmZpbGVuYW1lKTsgCi0KLSAgICBpZiAoIWNvbmYtPmxvZ25hbWUgfHwgCi0gICAgICAgICgoc3RhdChhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShyLT5wb29sLCBjb25mLT5sb2duYW1lKSwgJmZpbmZvKSA9PSAwKSAKLSAgICAgICAgICYmIChmaW5mby5zdF9zaXplID4gY29uZi0+bG9nYnl0ZXMpKSB8fCAKLSAgICAgICAgIChhcF9vcGVuKCZmLCBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShyLT5wb29sLCBjb25mLT5sb2duYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICBBUFJfQVBQRU5ELCBBUFJfT1NfREVGQVVMVCwgci0+cG9vbCkgIT0gQVBSX1NVQ0NFU1MpKSB7IAotICAgICAgICByZXR1cm4gcmV0OyAKLSAgICB9IAotCi0gICAgLyogIiUlIFtXZWQgSnVuIDE5IDEwOjUzOjIxIDE5OTZdIEdFVCAvY2dpZC1iaW4vcHJpbnRlbnYgSFRUUC8xLjAiICovIAotICAgIGFwX2N0aW1lKHRpbWVfc3RyLCBhcF9ub3coKSk7Ci0gICAgYXBfZnByaW50ZihmLCAiJSUlJSBbJXNdICVzICVzJXMlcyAlc1xuIiwgdGltZV9zdHIsIHItPm1ldGhvZCwgci0+dXJpLCAKLSAgICAgICAgICAgIHItPmFyZ3MgPyAiPyIgOiAiIiwgci0+YXJncyA/IHItPmFyZ3MgOiAiIiwgci0+cHJvdG9jb2wpOyAKLSAgICAvKiAiJSUgNTAwIC91c3IvbG9jYWwvYXBhY2hlL2NnaWQtYmluICovIAotICAgIGFwX2ZwcmludGYoZiwgIiUlJSUgJWQgJXNcbiIsIHJldCwgci0+ZmlsZW5hbWUpOyAKLQotICAgIGFwX2ZwcmludGYoZiwgIiUlZXJyb3JcbiVzXG4iLCBlcnJvcik7IAotCi0gICAgYXBfY2xvc2UoZik7IAotICAgIHJldHVybiByZXQ7IAotfSAKLQotc3RhdGljIGludCBsb2dfc2NyaXB0KHJlcXVlc3RfcmVjICpyLCBjZ2lkX3NlcnZlcl9jb25mICogY29uZiwgaW50IHJldCwgCi0gICAgICAgICAgICAgICAgICBjaGFyICpkYnVmLCBjb25zdCBjaGFyICpzYnVmLCBCVUZGICpzY3JpcHRfaW4sIEJVRkYgKnNjcmlwdF9lcnIpIAoteyAKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqaGRyc19hcnIgPSBhcF90YWJsZV9lbHRzKHItPmhlYWRlcnNfaW4pOyAKLSAgICBhcF90YWJsZV9lbnRyeV90ICpoZHJzID0gKGFwX3RhYmxlX2VudHJ5X3QgKikgaGRyc19hcnItPmVsdHM7IAotICAgIGNoYXIgYXJnc2J1ZmZlcltIVUdFX1NUUklOR19MRU5dOyAKLSAgICBhcF9maWxlX3QgKmYgPSBOVUxMOyAKLSAgICBpbnQgaTsgCi0gICAgc3RydWN0IHN0YXQgZmluZm87IAotICAgIGNoYXIgdGltZV9zdHJbQVBfQ1RJTUVfTEVOXTsKLQotICAgIGlmICghY29uZi0+bG9nbmFtZSB8fCAKLSAgICAgICAgKChzdGF0KGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHItPnBvb2wsIGNvbmYtPmxvZ25hbWUpLCAmZmluZm8pID09IDApIAotICAgICAgICAgJiYgKGZpbmZvLnN0X3NpemUgPiBjb25mLT5sb2dieXRlcykpIHx8IAotICAgICAgICAgKGFwX29wZW4oJmYsIGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHItPnBvb2wsIGNvbmYtPmxvZ25hbWUpLCAKLSAgICAgICAgICAgICAgICAgIEFQUl9BUFBFTkQsIEFQUl9PU19ERUZBVUxULCByLT5wb29sKSAhPSBBUFJfU1VDQ0VTUykpIHsgCi0gICAgICAgIC8qIFNvYWsgdXAgc2NyaXB0IG91dHB1dCAqLyAKLSAgICAgICAgd2hpbGUgKGFwX2JnZXRzKGFyZ3NidWZmZXIsIEhVR0VfU1RSSU5HX0xFTiwgc2NyaXB0X2luKSA+IDApIAotICAgICAgICAgICAgY29udGludWU7IAotICAgICAgICB3aGlsZSAoYXBfYmdldHMoYXJnc2J1ZmZlciwgSFVHRV9TVFJJTkdfTEVOLCBzY3JpcHRfZXJyKSA+IDApIAotICAgICAgICAgICAgY29udGludWU7IAotICAgICAgICByZXR1cm4gcmV0OyAKLSAgICB9IAotCi0gICAgLyogIiUlIFtXZWQgSnVuIDE5IDEwOjUzOjIxIDE5OTZdIEdFVCAvY2dpZC1iaW4vcHJpbnRlbnYgSFRUUC8xLjAiICovIAotICAgIGFwX2N0aW1lKHRpbWVfc3RyLCBhcF9ub3coKSk7Ci0gICAgYXBfZnByaW50ZihmLCAiJSUlJSBbJXNdICVzICVzJXMlcyAlc1xuIiwgdGltZV9zdHIsIHItPm1ldGhvZCwgci0+dXJpLCAKLSAgICAgICAgICAgIHItPmFyZ3MgPyAiPyIgOiAiIiwgci0+YXJncyA/IHItPmFyZ3MgOiAiIiwgci0+cHJvdG9jb2wpOyAKLSAgICAvKiAiJSUgNTAwIC91c3IvbG9jYWwvYXBhY2hlL2NnaWQtYmluIiAqLyAKLSAgICBhcF9mcHJpbnRmKGYsICIlJSUlICVkICVzXG4iLCByZXQsIHItPmZpbGVuYW1lKTsgCi0KLSAgICBhcF9wdXRzKCIlcmVxdWVzdFxuIiwgZik7IAotICAgIGZvciAoaSA9IDA7IGkgPCBoZHJzX2Fyci0+bmVsdHM7ICsraSkgeyAKLSAgICAgICAgaWYgKCFoZHJzW2ldLmtleSkgCi0gICAgICAgICAgICBjb250aW51ZTsgCi0gICAgICAgIGFwX2ZwcmludGYoZiwgIiVzOiAlc1xuIiwgaGRyc1tpXS5rZXksIGhkcnNbaV0udmFsKTsgCi0gICAgfSAKLSAgICBpZiAoKHItPm1ldGhvZF9udW1iZXIgPT0gTV9QT1NUIHx8IHItPm1ldGhvZF9udW1iZXIgPT0gTV9QVVQpIAotICAgICAgICAmJiAqZGJ1ZikgeyAKLSAgICAgICAgYXBfZnByaW50ZihmLCAiXG4lc1xuIiwgZGJ1Zik7IAotICAgIH0gCi0KLSAgICBhcF9wdXRzKCIlcmVzcG9uc2VcbiIsIGYpOyAKLSAgICBoZHJzX2FyciA9IGFwX3RhYmxlX2VsdHMoci0+ZXJyX2hlYWRlcnNfb3V0KTsgCi0gICAgaGRycyA9IChhcF90YWJsZV9lbnRyeV90ICopIGhkcnNfYXJyLT5lbHRzOyAKLQotICAgIGZvciAoaSA9IDA7IGkgPCBoZHJzX2Fyci0+bmVsdHM7ICsraSkgeyAKLSAgICAgICAgaWYgKCFoZHJzW2ldLmtleSkgCi0gICAgICAgICAgICBjb250aW51ZTsgCi0gICAgICAgIGFwX2ZwcmludGYoZiwgIiVzOiAlc1xuIiwgaGRyc1tpXS5rZXksIGhkcnNbaV0udmFsKTsgCi0gICAgfSAKLQotICAgIGlmIChzYnVmICYmICpzYnVmKSAKLSAgICAgICAgYXBfZnByaW50ZihmLCAiJXNcbiIsIHNidWYpOyAKLQotICAgIGlmIChhcF9iZ2V0cyhhcmdzYnVmZmVyLCBIVUdFX1NUUklOR19MRU4sIHNjcmlwdF9pbikgPiAwKSB7IAotICAgICAgICBhcF9wdXRzKCIlc3Rkb3V0XG4iLCBmKTsgCi0gICAgICAgIGFwX3B1dHMoYXJnc2J1ZmZlciwgZik7IAotICAgICAgICB3aGlsZSAoYXBfYmdldHMoYXJnc2J1ZmZlciwgSFVHRV9TVFJJTkdfTEVOLCBzY3JpcHRfaW4pID4gMCkgCi0gICAgICAgICAgICBhcF9wdXRzKGFyZ3NidWZmZXIsIGYpOyAKLSAgICAgICAgYXBfcHV0cygiXG4iLCBmKTsgCi0gICAgfSAKLQotICAgIGlmIChhcF9iZ2V0cyhhcmdzYnVmZmVyLCBIVUdFX1NUUklOR19MRU4sIHNjcmlwdF9lcnIpID4gMCkgeyAKLSAgICAgICAgYXBfcHV0cygiJXN0ZGVyclxuIiwgZik7IAotICAgICAgICBhcF9wdXRzKGFyZ3NidWZmZXIsIGYpOyAKLSAgICAgICAgd2hpbGUgKGFwX2JnZXRzKGFyZ3NidWZmZXIsIEhVR0VfU1RSSU5HX0xFTiwgc2NyaXB0X2VycikgPiAwKSAKLSAgICAgICAgICAgIGFwX3B1dHMoYXJnc2J1ZmZlciwgZik7IAotICAgICAgICBhcF9wdXRzKCJcbiIsIGYpOyAKLSAgICB9IAotCi0gICAgYXBfYmNsb3NlKHNjcmlwdF9pbik7IAotICAgIGFwX2JjbG9zZShzY3JpcHRfZXJyKTsgCi0KLSAgICBhcF9jbG9zZShmKTsgCi0gICAgcmV0dXJuIHJldDsgCi19IAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiAKLSAqIEFjdHVhbCBjZ2lkIGhhbmRsaW5nLi4uIAotICovIAotc3RhdGljIGludCBjZ2lkX2hhbmRsZXIocmVxdWVzdF9yZWMgKnIpIAoteyAKLSAgICBpbnQgcmV0dmFsLCBucGgsIGRicG9zID0gMDsgCi0gICAgY2hhciAqYXJndjAsICpkYnVmID0gTlVMTDsgCi0gICAgQlVGRiAqc2NyaXB0ID0gTlVMTDsgCi0gICAgY2hhciBhcmdzYnVmZmVyW0hVR0VfU1RSSU5HX0xFTl07IAotICAgIHZvaWQgKnNjb25mID0gci0+c2VydmVyLT5tb2R1bGVfY29uZmlnOyAKLSAgICBjZ2lkX3NlcnZlcl9jb25mICpjb25mID0gKGNnaWRfc2VydmVyX2NvbmYgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoc2NvbmYsICZjZ2lkX21vZHVsZSk7IAotICAgIGludCBpc19pbmNsdWRlZCA9ICFzdHJjbXAoci0+cHJvdG9jb2wsICJJTkNMVURFRCIpOyAKLSAgICBpbnQgc2Q7Ci0gICAgY2hhciAqKmVudjsgCi0gICAgc3RydWN0IHNvY2thZGRyX3VuIHVuaXhfYWRkcjsKLSAgICBhcF9zb2NrZXRfdCAqdGVtcHNvY2sgPSBOVUxMOwotICAgIGludCBuYnl0ZXM7Ci0gICAgYXBfaW9sICppb2w7Ci0gICAgc2NyaXB0ID0gYXBfYmNyZWF0ZShyLT5wb29sLCBCX1JEV1IpOyAKLQotICAgIGlmIChyLT5tZXRob2RfbnVtYmVyID09IE1fT1BUSU9OUykgeyAKLSAgICAgICAgLyogOTkgb3V0IG9mIDEwMCBjZ2lkIHNjcmlwdHMsIHRoaXMgaXMgYWxsIHRoZXkgc3VwcG9ydCAqLyAKLSAgICAgICAgci0+YWxsb3dlZCB8PSAoMSA8PCBNX0dFVCk7IAotICAgICAgICByLT5hbGxvd2VkIHw9ICgxIDw8IE1fUE9TVCk7IAotICAgICAgICByZXR1cm4gREVDTElORUQ7IAotICAgIH0gCi0KLSAgICBpZiAoKGFyZ3YwID0gc3RycmNocihyLT5maWxlbmFtZSwgJy8nKSkgIT0gTlVMTCkKLSAgICAgICAgYXJndjArKzsKLSAgICBlbHNlCi0gICAgICAgIGFyZ3YwID0gci0+ZmlsZW5hbWU7Ci0gCi0gICAgbnBoID0gIShzdHJuY21wKGFyZ3YwLCAibnBoLSIsIDQpKTsgCi0KLSAgICBpZiAoKGFyZ3YwID0gc3RycmNocihyLT5maWxlbmFtZSwgJy8nKSkgIT0gTlVMTCkgCi0gICAgICAgIGFyZ3YwKys7IAotICAgIGVsc2UgCi0gICAgICAgIGFyZ3YwID0gci0+ZmlsZW5hbWU7IAotCi0gICAgaWYgKCEoYXBfYWxsb3dfb3B0aW9ucyhyKSAmIE9QVF9FWEVDQ0dJKSAmJiAhaXNfc2NyaXB0YWxpYXNlZChyKSkgCi0gICAgICAgIHJldHVybiBsb2dfc2NyaXB0ZXJyb3IociwgY29uZiwgRk9SQklEREVOLCBBUExPR19OT0VSUk5PLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3B0aW9ucyBFeGVjQ0dJIGlzIG9mZiBpbiB0aGlzIGRpcmVjdG9yeSIpOyAKLSAgICBpZiAobnBoICYmIGlzX2luY2x1ZGVkKSAKLSAgICAgICAgcmV0dXJuIGxvZ19zY3JpcHRlcnJvcihyLCBjb25mLCBGT1JCSURERU4sIEFQTE9HX05PRVJSTk8sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRlbXB0IHRvIGluY2x1ZGUgTlBIIENHSSBzY3JpcHQiKTsgCi0KLSNpZiBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChXSU4zMikgCi0gICAgLyogQWxsb3cgZm9yIGNnaWQgZmlsZXMgd2l0aG91dCB0aGUgLkVYRSBleHRlbnNpb24gb24gdGhlbSB1bmRlciBPUy8yICovIAotICAgIGlmIChyLT5maW5mby5zdF9tb2RlID09IDApIHsgCi0gICAgICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7IAotICAgICAgICBjaGFyICpuZXdmaWxlOyAKLQotICAgICAgICBuZXdmaWxlID0gYXBfcHN0cmNhdChyLT5wb29sLCByLT5maWxlbmFtZSwgIi5FWEUiLCBOVUxMKTsgCi0KLSAgICAgICAgaWYgKChzdGF0KG5ld2ZpbGUsICZzdGF0YnVmKSAhPSAwKSB8fCAoIVNfSVNSRUcoc3RhdGJ1Zi5zdF9tb2RlKSkpIHsgCi0gICAgICAgICAgICByZXR1cm4gbG9nX3NjcmlwdGVycm9yKHIsIGNvbmYsIE5PVF9GT1VORCwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY3JpcHQgbm90IGZvdW5kIG9yIHVuYWJsZSB0byBzdGF0Iik7IAotICAgICAgICB9IGVsc2UgeyAKLSAgICAgICAgICAgIHItPmZpbGVuYW1lID0gbmV3ZmlsZTsgCi0gICAgICAgIH0gCi0gICAgfSAKLSNlbHNlIAotICAgIGlmIChyLT5maW5mby5zdF9tb2RlID09IDApIAotICAgICAgICByZXR1cm4gbG9nX3NjcmlwdGVycm9yKHIsIGNvbmYsIE5PVF9GT1VORCwgQVBMT0dfTk9FUlJOTywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjcmlwdCBub3QgZm91bmQgb3IgdW5hYmxlIHRvIHN0YXQiKTsgCi0jZW5kaWYgCi0gICAgaWYgKFNfSVNESVIoci0+ZmluZm8uc3RfbW9kZSkpIAotICAgICAgICByZXR1cm4gbG9nX3NjcmlwdGVycm9yKHIsIGNvbmYsIEZPUkJJRERFTiwgQVBMT0dfTk9FUlJOTywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dGVtcHQgdG8gaW52b2tlIGRpcmVjdG9yeSBhcyBzY3JpcHQiKTsgCi0vKgotICAgIGlmICghYXBfc3VleGVjX2VuYWJsZWQpIHsgCi0gICAgICAgIGlmICghYXBfY2FuX2V4ZWMoJnItPmZpbmZvKSkgCi0gICAgICAgICAgICByZXR1cm4gbG9nX3NjcmlwdGVycm9yKHIsIGNvbmYsIEZPUkJJRERFTiwgQVBMT0dfTk9FUlJOTywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlIHBlcm1pc3Npb25zIGRlbnkgc2VydmVyIGV4ZWN1dGlvbiIpOyAKLSAgICB9IAotKi8KLSAgICBhcF9hZGRfY29tbW9uX3ZhcnMocik7IAotICAgIGFwX2FkZF9jZ2lfdmFycyhyKTsgCi0gICAgZW52ID0gYXBfY3JlYXRlX2Vudmlyb25tZW50KHItPnBvb2wsIHItPnN1YnByb2Nlc3NfZW52KTsgCi0KLSAgICBpZiAoKHNkID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbG9nX3NjcmlwdGVycm9yKHIsIGNvbmYsIE5PVF9GT1VORCwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gY3JlYXRlIHNvY2tldCB0byBjZ2kgZGFlbW9uIik7Ci0gICAgfSAKLSAgICBtZW1zZXQoJnVuaXhfYWRkciwgMCwgc2l6ZW9mKHVuaXhfYWRkcikpOwotICAgIHVuaXhfYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKLSAgICBzdHJjcHkodW5peF9hZGRyLnN1bl9wYXRoLCBjb25mLT5zb2NrbmFtZSk7Ci0KLSAgICBpZiAoY29ubmVjdChzZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZ1bml4X2FkZHIsIHNpemVvZih1bml4X2FkZHIpKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBsb2dfc2NyaXB0ZXJyb3IociwgY29uZiwgTk9UX0ZPVU5ELCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuYWJsZSB0byBjb25uZWN0IHRvIGNnaSBkYWVtb24iKTsKLSAgICB9IAotCi0gICAgc2VuZF9yZXEoc2QsIHIsIGFyZ3YwLCBlbnYpOyAKLQotICAgIGFwX3B1dF9vc19zb2NrKCZ0ZW1wc29jaywgJnNkLCBwY2dpKTsKLQotICAgIGlvbCA9IHVuaXhfYXR0YWNoX3NvY2tldCh0ZW1wc29jayk7Ci0KLSAgICBhcF9icHVzaF9pb2woc2NyaXB0LCBpb2wpOyAKLQotICAgIGlmICgocmV0dmFsID0gYXBfc2V0dXBfY2xpZW50X2Jsb2NrKHIsIFJFUVVFU1RfQ0hVTktFRF9FUlJPUikpKSAKLSAgICAgICAgcmV0dXJuIHJldHZhbDsgCi0gICAgIAotICAgIGlmICgoYXJndjAgPSBzdHJyY2hyKHItPmZpbGVuYW1lLCAnLycpKSAhPSBOVUxMKSAKLSAgICAgICAgYXJndjArKzsgCi0gICAgZWxzZSAKLSAgICAgICAgYXJndjAgPSByLT5maWxlbmFtZTsgCi0KLSAgICAvKiBUcmFuc2ZlciBhbnkgcHV0L3Bvc3QgYXJncywgQ0VSTiBzdHlsZS4uLiAKLSAgICAgKiBOb3RlIHRoYXQgd2UgYWxyZWFkeSBpZ25vcmUgU0lHUElQRSBpbiB0aGUgY29yZSBzZXJ2ZXIuIAotICAgICAqLyAKLQotICAgIGlmIChhcF9zaG91bGRfY2xpZW50X2Jsb2NrKHIpKSB7IAotICAgICAgICBpbnQgZGJzaXplLCBsZW5fcmVhZDsgCi0KLSAgICAgICAgaWYgKGNvbmYtPmxvZ25hbWUpIHsgCi0gICAgICAgICAgICBkYnVmID0gYXBfcGNhbGxvYyhyLT5wb29sLCBjb25mLT5idWZieXRlcyArIDEpOyAKLSAgICAgICAgICAgIGRicG9zID0gMDsgCi0gICAgICAgIH0gCi0KLQotCi0gICAgICAgIHdoaWxlICgobGVuX3JlYWQgPSAKLSAgICAgICAgICAgICAgICBhcF9nZXRfY2xpZW50X2Jsb2NrKHIsIGFyZ3NidWZmZXIsIEhVR0VfU1RSSU5HX0xFTikpID4gMCkgeyAKLSAgICAgICAgICAgIGlmIChjb25mLT5sb2duYW1lKSB7IAotICAgICAgICAgICAgICAgIGlmICgoZGJwb3MgKyBsZW5fcmVhZCkgPiBjb25mLT5idWZieXRlcykgeyAKLSAgICAgICAgICAgICAgICAgICAgZGJzaXplID0gY29uZi0+YnVmYnl0ZXMgLSBkYnBvczsgCi0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICBlbHNlIHsgCi0gICAgICAgICAgICAgICAgICAgIGRic2l6ZSA9IGxlbl9yZWFkOyAKLSAgICAgICAgICAgICAgICB9IAotICAgICAgICAgICAgICAgIG1lbWNweShkYnVmICsgZGJwb3MsIGFyZ3NidWZmZXIsIGRic2l6ZSk7IAotICAgICAgICAgICAgICAgIGRicG9zICs9IGRic2l6ZTsgCi0gICAgICAgICAgICB9IAotICAgICAgICAgICAgYXBfYndyaXRlKHNjcmlwdCwgYXJnc2J1ZmZlciwgbGVuX3JlYWQsICZuYnl0ZXMpOwotICAgICAgICAgICAgaWYgKG5ieXRlcyA8IGxlbl9yZWFkKSB7IAotICAgICAgICAgICAgICAgIC8qIHNpbGx5IHNjcmlwdCBzdG9wcGVkIHJlYWRpbmcsIHNvYWsgdXAgcmVtYWluaW5nIG1lc3NhZ2UgKi8gCi0gICAgICAgICAgICAgICAgd2hpbGUgKGFwX2dldF9jbGllbnRfYmxvY2sociwgYXJnc2J1ZmZlciwgSFVHRV9TVFJJTkdfTEVOKSA+IDApIHsgCi0gICAgICAgICAgICAgICAgICAgIC8qIGR1bXAgaXQgKi8gCi0gICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICBicmVhazsgCi0gICAgICAgICAgICB9IAotICAgICAgICB9IAotCi0gICAgICAgIGFwX2JmbHVzaChzY3JpcHQpOyAKLQotICAgIH0gCi0KLSAgICAvKiBIYW5kbGUgc2NyaXB0IHJldHVybi4uLiAqLyAKLSAgICBpZiAoc2NyaXB0ICYmICFucGgpIHsgCi0gICAgICAgIGNvbnN0IGNoYXIgKmxvY2F0aW9uOyAKLSAgICAgICAgY2hhciBzYnVmW01BWF9TVFJJTkdfTEVOXTsgCi0gICAgICAgIGludCByZXQ7IAotCi0gICAgICAgIGlmICgocmV0ID0gYXBfc2Nhbl9zY3JpcHRfaGVhZGVyX2Vycl9idWZmKHIsIHNjcmlwdCwgc2J1ZikpKSB7IAotICAgICAgICAgICAgcmV0dXJuIGxvZ19zY3JpcHQociwgY29uZiwgcmV0LCBkYnVmLCBzYnVmLCBzY3JpcHQsIE5VTEwpOyAKLSAgICAgICAgfSAKLQotI2lmZGVmIENIQVJTRVRfRUJDRElDIAotICAgICAgICAvKiBOb3cgY2hlY2sgdGhlIENvbnRlbnQtVHlwZSB0byBkZWNpZGUgaWYgY29udmVyc2lvbiBpcyBuZWVkZWQgKi8gCi0gICAgICAgIGFwX2NoZWNrY29udihyKTsgCi0jZW5kaWYgLypDSEFSU0VUX0VCQ0RJQyovIAotCi0gICAgICAgIGxvY2F0aW9uID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfb3V0LCAiTG9jYXRpb24iKTsgCi0KLSAgICAgICAgaWYgKGxvY2F0aW9uICYmIGxvY2F0aW9uWzBdID09ICcvJyAmJiByLT5zdGF0dXMgPT0gMjAwKSB7IAotCi0gICAgICAgICAgICAvKiBTb2FrIHVwIGFsbCB0aGUgc2NyaXB0IG91dHB1dCAqLyAKLSAgICAgICAgICAgIHdoaWxlIChhcF9iZ2V0cyhhcmdzYnVmZmVyLCBIVUdFX1NUUklOR19MRU4sIHNjcmlwdCkgPiAwKSB7IAotICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAvKiBUaGlzIHJlZGlyZWN0IG5lZWRzIHRvIGJlIGEgR0VUIG5vIG1hdHRlciB3aGF0IHRoZSBvcmlnaW5hbCAKLSAgICAgICAgICAgICAqIG1ldGhvZCB3YXMuIAotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgci0+bWV0aG9kID0gYXBfcHN0cmR1cChyLT5wb29sLCAiR0VUIik7IAotICAgICAgICAgICAgci0+bWV0aG9kX251bWJlciA9IE1fR0VUOyAKLQotICAgICAgICAgICAgLyogV2UgYWxyZWFkeSByZWFkIHRoZSBtZXNzYWdlIGJvZHkgKGlmIGFueSksIHNvIGRvbid0IGFsbG93IAotICAgICAgICAgICAgICogdGhlIHJlZGlyZWN0ZWQgcmVxdWVzdCB0byB0aGluayBpdCBoYXMgb25lLiBXZSBjYW4gaWdub3JlIAotICAgICAgICAgICAgICogVHJhbnNmZXItRW5jb2RpbmcsIHNpbmNlIHdlIHVzZWQgUkVRVUVTVF9DSFVOS0VEX0VSUk9SLiAKLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIGFwX3RhYmxlX3Vuc2V0KHItPmhlYWRlcnNfaW4sICJDb250ZW50LUxlbmd0aCIpOyAKLQotICAgICAgICAgICAgYXBfaW50ZXJuYWxfcmVkaXJlY3RfaGFuZGxlcihsb2NhdGlvbiwgcik7IAotICAgICAgICAgICAgcmV0dXJuIE9LOyAKLSAgICAgICAgfSAKLSAgICAgICAgZWxzZSBpZiAobG9jYXRpb24gJiYgci0+c3RhdHVzID09IDIwMCkgeyAKLSAgICAgICAgICAgIC8qIFhYIE5vdGUgdGhhdCBpZiBhIHNjcmlwdCB3YW50cyB0byBwcm9kdWNlIGl0cyBvd24gUmVkaXJlY3QgCi0gICAgICAgICAgICAgKiBib2R5LCBpdCBub3cgaGFzIHRvIGV4cGxpY2l0bHkgKnNheSogIlN0YXR1czogMzAyIiAKLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIHJldHVybiBSRURJUkVDVDsgCi0gICAgICAgIH0gCi0KLSAgICAgICAgYXBfc2VuZF9odHRwX2hlYWRlcihyKTsgCi0gICAgICAgIGlmICghci0+aGVhZGVyX29ubHkpIHsgCi0gICAgICAgICAgICBhcF9zZW5kX2ZiKHNjcmlwdCwgcik7IAotICAgICAgICB9IAotICAgICAgICBhcF9iY2xvc2Uoc2NyaXB0KTsgCi0gICAgfSAKLQotICAgIGlmIChzY3JpcHQgJiYgbnBoKSB7IAotICAgICAgICBhcF9zZW5kX2ZiKHNjcmlwdCwgcik7IAotICAgIH0gCi0KLWFwX2Rlc3Ryb3lfcG9vbChwY2dpKTsKLQotICAgIHJldHVybiBPSzsgLyogTk9UIHItPnN0YXR1cywgZXZlbiBpZiBpdCBoYXMgY2hhbmdlZC4gKi8gCi19IAotCi1zdGF0aWMgY29uc3QgaGFuZGxlcl9yZWMgY2dpZF9oYW5kbGVyc1tdID0gCi17IAotICAgIHtDR0lfTUFHSUNfVFlQRSwgY2dpZF9oYW5kbGVyfSwgCi0gICAgeyJjZ2ktc2NyaXB0IiwgY2dpZF9oYW5kbGVyfSwgCi0gICAge05VTEx9IAotfTsKLQotc3RhdGljIHZvaWQgcmVnaXN0ZXJfaG9vayh2b2lkKQotewotICAgIGFwX2hvb2tfcG9zdF9jb25maWcoY2dpZF9pbml0LCBOVUxMLCBOVUxMLCBIT09LX01JRERMRSk7Ci19Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBjZ2lkX21vZHVsZSA9IHsgCi0gICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsIAotICAgIE5VTEwsIC8qIGRpciBjb25maWcgY3JlYXRlciAqLyAKLSAgICBOVUxMLCAvKiBkaXIgbWVyZ2VyIC0tLSBkZWZhdWx0IGlzIHRvIG92ZXJyaWRlICovIAotICAgIGNyZWF0ZV9jZ2lkX2NvbmZpZywgLyogc2VydmVyIGNvbmZpZyAqLyAKLSAgICBtZXJnZV9jZ2lkX2NvbmZpZywgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLyAKLSAgICBjZ2lkX2NtZHMsIC8qIGNvbW1hbmQgdGFibGUgKi8gCi0gICAgY2dpZF9oYW5kbGVycywgLyogaGFuZGxlcnMgKi8gCi0gICAgcmVnaXN0ZXJfaG9vayAvKiByZWdpc3Rlcl9oYW5kbGVycyAqLyAKLX07IAotCmRpZmYgLS1naXQgYS9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2luZm8uYyBiL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfaW5mby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTc0Njk0Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfaW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsNjg4ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyogCi0gKiBJbmZvIE1vZHVsZS4gIERpc3BsYXkgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNlcnZlciBhbmQKLSAqIGFsbCBpbmNsdWRlZCBtb2R1bGVzLgotICoKLSAqIDxMb2NhdGlvbiAvc2VydmVyLWluZm8+Ci0gKiBTZXRIYW5kbGVyIHNlcnZlci1pbmZvCi0gKiA8L0xvY2F0aW9uPgotICoKLSAqIEdFVCAvc2VydmVyLWluZm8gLSBSZXR1cm5zIGZ1bGwgY29uZmlndXJhdGlvbiBwYWdlIGZvciBzZXJ2ZXIgYW5kIGFsbCBtb2R1bGVzCi0gKiBHRVQgL3NlcnZlci1pbmZvP3NlcnZlciAtIFJldHVybnMgc2VydmVyIGNvbmZpZ3VyYXRpb24gb25seQotICogR0VUIC9zZXJ2ZXItaW5mbz9tb2R1bGVfbmFtZSAtIFJldHVybnMgY29uZmlndXJhdGlvbiBmb3IgYSBzaW5nbGUgbW9kdWxlCi0gKiBHRVQgL3NlcnZlci1pbmZvP2xpc3QgLSBSZXR1cm5zIHF1aWNrIGxpc3Qgb2YgaW5jbHVkZWQgbW9kdWxlcwotICoKLSAqIFJhc211cyBMZXJkb3JmIDxyYXNtdXNAdmV4Lm5ldD4sIE1heSAxOTk2Ci0gKgotICogMDUuMDEuOTYgSW5pdGlhbCBWZXJzaW9uCi0gKgotICogTG91IExhbmdob2x0eiA8bGRsQHVzaS51dGFoLmVkdT4sIEp1bHkgMTk5NwotICoKLSAqIDA3LjExLjk3IEFkZGl0aW9uIG9mIHRoZSBBZGRNb2R1bGVJbmZvIGRpcmVjdGl2ZQotICogCi0gKi8KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJ1dGlsX3NjcmlwdC5oIgotI2luY2x1ZGUgImh0dHBfY29uZl9nbG9iYWxzLmgiCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgLyogbWF0Y2hpbmcgbW9kdWxlIG5hbWUgKi8KLSAgICBjaGFyICppbmZvOyAgICAgICAgICAgICAgICAgLyogYWRkaXRpb25hbCBpbmZvICovCi19IGluZm9fZW50cnk7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqbW9yZV9pbmZvOwotfSBpbmZvX3N2cl9jb25mOwotCi10eXBlZGVmIHN0cnVjdCBpbmZvX2NmZ19saW5lcyB7Ci0gICAgY2hhciAqY21kOwotICAgIGNoYXIgKmxpbmU7Ci0gICAgc3RydWN0IGluZm9fY2ZnX2xpbmVzICpuZXh0OwotfSBpbmZvX2NmZ19saW5lczsKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGluZm9fbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSAqdG9wX21vZHVsZTsKLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9pbmZvX2NvbmZpZyhhcF9jb250ZXh0X3QgKnAsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgaW5mb19zdnJfY29uZiAqY29uZiA9IChpbmZvX3N2cl9jb25mICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKGluZm9fc3ZyX2NvbmYpKTsKLQotICAgIGNvbmYtPm1vcmVfaW5mbyA9IGFwX21ha2VfYXJyYXkocCwgMjAsIHNpemVvZihpbmZvX2VudHJ5KSk7Ci0gICAgcmV0dXJuIGNvbmY7Ci19Ci0KLXN0YXRpYyB2b2lkICptZXJnZV9pbmZvX2NvbmZpZyhhcF9jb250ZXh0X3QgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICpvdmVycmlkZXN2KQotewotICAgIGluZm9fc3ZyX2NvbmYgKm5ldyA9IChpbmZvX3N2cl9jb25mICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKGluZm9fc3ZyX2NvbmYpKTsKLSAgICBpbmZvX3N2cl9jb25mICpiYXNlID0gKGluZm9fc3ZyX2NvbmYgKikgYmFzZXY7Ci0gICAgaW5mb19zdnJfY29uZiAqb3ZlcnJpZGVzID0gKGluZm9fc3ZyX2NvbmYgKikgb3ZlcnJpZGVzdjsKLQotICAgIG5ldy0+bW9yZV9pbmZvID0gYXBfYXBwZW5kX2FycmF5cyhwLCBvdmVycmlkZXMtPm1vcmVfaW5mbywgYmFzZS0+bW9yZV9pbmZvKTsKLSAgICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgY2hhciAqbW9kX2luZm9faHRtbF9jbWRfc3RyaW5nKGNvbnN0IGNoYXIgKnN0cmluZywgY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbikKLXsKLSAgICBjb25zdCBjaGFyICpzOwotICAgIGNoYXIgKnQ7Ci0gICAgY2hhciAqZW5kX2J1ZjsKLQotICAgIHMgPSBzdHJpbmc7Ci0gICAgdCA9IGJ1ZjsKLSAgICAvKiBrZWVwIHNwYWNlIGZvciBcMCBieXRlICovCi0gICAgZW5kX2J1ZiA9IGJ1ZiArIGJ1Zl9sZW4gLSAxOwotICAgIHdoaWxlICgoKnMpICYmICh0IDwgZW5kX2J1ZikpIHsKLSAgICAgICAgaWYgKCpzID09ICc8JykgewotICAgICAgICAgICAgc3RybmNweSh0LCAiJmx0OyIsIGVuZF9idWYgLSB0KTsKLSAgICAgICAgICAgIHQgKz0gNDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgqcyA9PSAnPicpIHsKLSAgICAgICAgICAgIHN0cm5jcHkodCwgIiZndDsiLCBlbmRfYnVmIC0gdCk7Ci0gICAgICAgICAgICB0ICs9IDQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKnMgPT0gJyYnKSB7Ci0gICAgICAgICAgICBzdHJuY3B5KHQsICImYW1wOyIsIGVuZF9idWYgLSB0KTsKLSAgICAgICAgICAgIHQgKz0gNTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICp0KysgPSAqczsKLSAgICAgICAgfQotICAgICAgICBzKys7Ci0gICAgfQotICAgIC8qIG9vcHMsIG92ZXJmbG93ZWQuLi4gZG9uJ3Qgb3ZlcndyaXRlICovCi0gICAgaWYgKHQgPiBlbmRfYnVmKSB7Ci0JKmVuZF9idWYgPSAnXDAnOwotICAgIH0KLSAgICBlbHNlIHsKLQkqdCA9ICdcMCc7Ci0gICAgfQotICAgIHJldHVybiAoYnVmKTsKLX0KLQotc3RhdGljIGluZm9fY2ZnX2xpbmVzICptb2RfaW5mb19sb2FkX2NvbmZpZyhhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjaGFyIHNbTUFYX1NUUklOR19MRU5dOwotICAgIGNvbmZpZ2ZpbGVfdCAqZnA7Ci0gICAgaW5mb19jZmdfbGluZXMgKm5ldywgKnJldCwgKnByZXY7Ci0gICAgY29uc3QgY2hhciAqdDsKLQotICAgIGZwID0gYXBfcGNmZ19vcGVuZmlsZShwLCBmaWxlbmFtZSk7Ci0gICAgaWYgKCFmcCkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCByLAotCQkgICAgIm1vZF9pbmZvOiBjb3VsZG4ndCBvcGVuIGNvbmZpZyBmaWxlICVzIiwKLQkJICAgIGZpbGVuYW1lKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldCA9IE5VTEw7Ci0gICAgcHJldiA9IE5VTEw7Ci0gICAgd2hpbGUgKCFhcF9jZmdfZ2V0bGluZShzLCBNQVhfU1RSSU5HX0xFTiwgZnApKSB7Ci0gICAgICAgIGlmICgqcyA9PSAnIycpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgLyogc2tpcCBjb21tZW50cyAqLwotICAgICAgICB9Ci0gICAgICAgIG5ldyA9IGFwX3BhbGxvYyhwLCBzaXplb2Yoc3RydWN0IGluZm9fY2ZnX2xpbmVzKSk7Ci0gICAgICAgIG5ldy0+bmV4dCA9IE5VTEw7Ci0gICAgICAgIGlmICghcmV0KSB7Ci0gICAgICAgICAgICByZXQgPSBuZXc7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByZXYpIHsKLSAgICAgICAgICAgIHByZXYtPm5leHQgPSBuZXc7Ci0gICAgICAgIH0KLQl0ID0gczsKLQluZXctPmNtZCA9IGFwX2dldHdvcmRfY29uZihwLCAmdCk7Ci0JaWYgKCp0KSB7Ci0JICAgIG5ldy0+bGluZSA9IGFwX3BzdHJkdXAocCwgdCk7Ci0JfQotCWVsc2UgewotCSAgICBuZXctPmxpbmUgPSBOVUxMOwotCX0KLSAgICAgICAgcHJldiA9IG5ldzsKLSAgICB9Ci0gICAgYXBfY2ZnX2Nsb3NlZmlsZShmcCk7Ci0gICAgcmV0dXJuIChyZXQpOwotfQotCi1zdGF0aWMgdm9pZCBtb2RfaW5mb19tb2R1bGVfY21kcyhyZXF1ZXN0X3JlYyAqciwgaW5mb19jZmdfbGluZXMgKmNmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRfcmVjICpjbWRzLCBjaGFyICpsYWJlbCkKLXsKLSAgICBjb25zdCBjb21tYW5kX3JlYyAqY21kID0gY21kczsKLSAgICBpbmZvX2NmZ19saW5lcyAqbGkgPSBjZmcsICpsaV9zdCA9IE5VTEwsICpsaV9zZSA9IE5VTEw7Ci0gICAgaW5mb19jZmdfbGluZXMgKmJsb2NrX3N0YXJ0ID0gTlVMTDsKLSAgICBpbnQgbGFiID0gMCwgbmVzdCA9IDA7Ci0gICAgY2hhciBidWZbTUFYX1NUUklOR19MRU5dOwotCi0gICAgd2hpbGUgKGxpKSB7Ci0gICAgICAgIGlmICghc3RybmNhc2VjbXAobGktPmNtZCwgIjxkaXJlY3RvcnkiLCAxMCkgfHwKLSAgICAgICAgICAgICFzdHJuY2FzZWNtcChsaS0+Y21kLCAiPGxvY2F0aW9uIiwgOSkgfHwKLSAgICAgICAgICAgICFzdHJuY2FzZWNtcChsaS0+Y21kLCAiPGxpbWl0IiwgNikgfHwKLSAgICAgICAgICAgICFzdHJuY2FzZWNtcChsaS0+Y21kLCAiPGZpbGVzIiwgNikpIHsKLSAgICAgICAgICAgIGlmIChuZXN0KSB7Ci0gICAgICAgICAgICAgICAgbGlfc2UgPSBsaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGxpX3N0ID0gbGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsaSA9IGxpLT5uZXh0OwotICAgICAgICAgICAgbmVzdCsrOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobmVzdCAmJiAoIXN0cm5jYXNlY21wKGxpLT5jbWQsICI8L2xpbWl0IiwgNykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cm5jYXNlY21wKGxpLT5jbWQsICI8L2xvY2F0aW9uIiwgMTApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJuY2FzZWNtcChsaS0+Y21kLCAiPC9kaXJlY3RvcnkiLCAxMSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cm5jYXNlY21wKGxpLT5jbWQsICI8L2ZpbGVzIiwgNykpKSB7Ci0gICAgICAgICAgICBpZiAoYmxvY2tfc3RhcnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoKG5lc3QgPT0gMSAmJiBibG9ja19zdGFydCA9PSBsaV9zdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKG5lc3QgPT0gMiAmJiBibG9ja19zdGFydCA9PSBsaV9zZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIjxkZD48dHQ+Iiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXN0ID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCImbmJzcDsmbmJzcDsiLCByKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cyhtb2RfaW5mb19odG1sX2NtZF9zdHJpbmcobGktPmNtZCwgYnVmLCBzaXplb2YoYnVmKSksIHIpOwotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiICIsIHIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobGktPmxpbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKG1vZF9pbmZvX2h0bWxfY21kX3N0cmluZyhsaS0+bGluZSwgYnVmLCBzaXplb2YoYnVmKSksIHIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8L3R0PlxuIiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIG5lc3QtLTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBibG9ja19zdGFydCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaV9zdCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBibG9ja19zdGFydCA9IGxpX3N0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxpX3NlID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG5lc3QtLTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaV9zdCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbGlfc2UgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIG5lc3QtLTsKLSAgICAgICAgICAgICAgICBpZiAoIW5lc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlfc3QgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaV9zZSA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsaSA9IGxpLT5uZXh0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgY21kID0gY21kczsKLSAgICAgICAgd2hpbGUgKGNtZCkgewotICAgICAgICAgICAgaWYgKGNtZC0+bmFtZSkgewotICAgICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChjbWQtPm5hbWUsIGxpLT5jbWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbGFiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPGR0PjxzdHJvbmc+Iiwgcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cyhsYWJlbCwgcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPC9zdHJvbmc+XG4iLCByKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhYiA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCgobmVzdCAmJiBibG9ja19zdGFydCA9PSBOVUxMKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIChuZXN0ID09IDIgJiYgYmxvY2tfc3RhcnQgPT0gbGlfc3QpKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKHN0cm5jYXNlY21wKGxpLT5jbWQsICI8ZGlyZWN0b3J5IiwgMTApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNhc2VjbXAobGktPmNtZCwgIjxsb2NhdGlvbiIsIDkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNhc2VjbXAobGktPmNtZCwgIjxsaW1pdCIsIDYpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNhc2VjbXAobGktPmNtZCwgIjwvbGltaXQiLCA3KSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jYXNlY21wKGxpLT5jbWQsICI8L2xvY2F0aW9uIiwgMTApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNhc2VjbXAobGktPmNtZCwgIjwvZGlyZWN0b3J5IiwgMTEpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNhc2VjbXAobGktPmNtZCwgIjwvZmlsZXMiLCA3KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8ZGQ+PHR0PiIsIHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMobW9kX2luZm9faHRtbF9jbWRfc3RyaW5nKGxpX3N0LT5jbWQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpLCByKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCIgIiwgcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlfc3QtPmxpbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cyhtb2RfaW5mb19odG1sX2NtZF9zdHJpbmcobGlfc3QtPmxpbmUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpLCByKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8L3R0PlxuIiwgcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBibG9ja19zdGFydCA9IGxpX3N0OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpX3NlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIjxkZD48dHQ+Jm5ic3A7Jm5ic3A7Iiwgcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMobW9kX2luZm9faHRtbF9jbWRfc3RyaW5nKGxpX3NlLT5jbWQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpLCByKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiICIsIHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaV9zZS0+bGluZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cyhtb2RfaW5mb19odG1sX2NtZF9zdHJpbmcobGlfc2UtPmxpbmUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpLCByKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIjwvdHQ+XG4iLCByKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19zdGFydCA9IGxpX3NlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8ZGQ+PHR0PiIsIHIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmVzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIiZuYnNwOyZuYnNwOyIsIHIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXN0ID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCImbmJzcDsmbmJzcDsiLCByKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cyhtb2RfaW5mb19odG1sX2NtZF9zdHJpbmcobGktPmNtZCwgYnVmLCBzaXplb2YoYnVmKSksIHIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobGktPmxpbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCIgPGk+Iiwgcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cyhtb2RfaW5mb19odG1sX2NtZF9zdHJpbmcobGktPmxpbmUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpLCByKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8L2k+Iiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQkJICAgIGFwX3JwdXRzKCI8L3R0PiIsIHIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNtZCsrOwotICAgICAgICB9Ci0gICAgICAgIGxpID0gbGktPm5leHQ7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqZmluZF9tb3JlX2luZm8oc2VydmVyX3JlYyAqcywgY29uc3QgY2hhciAqbW9kdWxlX25hbWUpCi17Ci0gICAgaW50IGk7Ci0gICAgaW5mb19zdnJfY29uZiAqY29uZiA9IChpbmZvX3N2cl9jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvX21vZHVsZSk7Ci0gICAgaW5mb19lbnRyeSAqZW50cnkgPSAoaW5mb19lbnRyeSAqKSBjb25mLT5tb3JlX2luZm8tPmVsdHM7Ci0KLSAgICBpZiAoIW1vZHVsZV9uYW1lKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgY29uZi0+bW9yZV9pbmZvLT5uZWx0czsgaSsrKSB7Ci0gICAgICAgIGlmICghc3RyY21wKG1vZHVsZV9uYW1lLCBlbnRyeS0+bmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBlbnRyeS0+aW5mbzsKLSAgICAgICAgfQotICAgICAgICBlbnRyeSsrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkaXNwbGF5X2luZm8ocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgbW9kdWxlICptb2RwID0gTlVMTDsKLSAgICBjaGFyIGJ1ZltNQVhfU1RSSU5HX0xFTl0sICpjZm5hbWU7Ci0gICAgY2hhciAqbW9yZV9pbmZvOwotICAgIGNvbnN0IGNvbW1hbmRfcmVjICpjbWQgPSBOVUxMOwotICAgIGNvbnN0IGhhbmRsZXJfcmVjICpoYW5kID0gTlVMTDsKLSAgICBzZXJ2ZXJfcmVjICpzZXJ2ID0gci0+c2VydmVyOwotICAgIGludCBjb21tYSA9IDA7Ci0gICAgaW5mb19jZmdfbGluZXMgKm1vZF9pbmZvX2NmZ19odHRwZCA9IE5VTEw7Ci0gICAgaW5mb19jZmdfbGluZXMgKm1vZF9pbmZvX2NmZ19zcm0gPSBOVUxMOwotICAgIGluZm9fY2ZnX2xpbmVzICptb2RfaW5mb19jZmdfYWNjZXNzID0gTlVMTDsKLQotICAgIHItPmFsbG93ZWQgfD0gKDEgPDwgTV9HRVQpOwotICAgIGlmIChyLT5tZXRob2RfbnVtYmVyICE9IE1fR0VUKQotCXJldHVybiBERUNMSU5FRDsKLQotICAgIHItPmNvbnRlbnRfdHlwZSA9ICJ0ZXh0L2h0bWwiOwotICAgIGFwX3NlbmRfaHR0cF9oZWFkZXIocik7Ci0gICAgaWYgKHItPmhlYWRlcl9vbmx5KSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGFwX3JwdXRzKERPQ1RZUEVfSFRNTF8zXzIKLQkgICAgICI8aHRtbD48aGVhZD48dGl0bGU+U2VydmVyIEluZm9ybWF0aW9uPC90aXRsZT48L2hlYWQ+XG4iLCByKTsKLSAgICBhcF9ycHV0cygiPGJvZHk+PGgxIGFsaWduPWNlbnRlcj5BcGFjaGUgU2VydmVyIEluZm9ybWF0aW9uPC9oMT5cbiIsIHIpOwotICAgIGlmICghci0+YXJncyB8fCBzdHJjYXNlY21wKHItPmFyZ3MsICJsaXN0IikpIHsKLSAgICAgICAgY2ZuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUoci0+cG9vbCwgYXBfc2VydmVyX2NvbmZuYW1lKTsKLSAgICAgICAgbW9kX2luZm9fY2ZnX2h0dHBkID0gbW9kX2luZm9fbG9hZF9jb25maWcoci0+cG9vbCwgY2ZuYW1lLCByKTsKLSAgICAgICAgY2ZuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUoci0+cG9vbCwgc2Vydi0+c3JtX2NvbmZuYW1lKTsKLSAgICAgICAgbW9kX2luZm9fY2ZnX3NybSA9IG1vZF9pbmZvX2xvYWRfY29uZmlnKHItPnBvb2wsIGNmbmFtZSwgcik7Ci0gICAgICAgIGNmbmFtZSA9IGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHItPnBvb2wsIHNlcnYtPmFjY2Vzc19jb25mbmFtZSk7Ci0gICAgICAgIG1vZF9pbmZvX2NmZ19hY2Nlc3MgPSBtb2RfaW5mb19sb2FkX2NvbmZpZyhyLT5wb29sLCBjZm5hbWUsIHIpOwotICAgICAgICBpZiAoIXItPmFyZ3MpIHsKLSAgICAgICAgICAgIGFwX3JwdXRzKCI8dHQ+PGEgaHJlZj1cIiNzZXJ2ZXJcIj5TZXJ2ZXIgU2V0dGluZ3M8L2E+LCAiLCByKTsKLSAgICAgICAgICAgIGZvciAobW9kcCA9IHRvcF9tb2R1bGU7IG1vZHA7IG1vZHAgPSBtb2RwLT5uZXh0KSB7Ci0gICAgICAgICAgICAgICAgYXBfcnByaW50ZihyLCAiPGEgaHJlZj1cIiMlc1wiPiVzPC9hPiIsIG1vZHAtPm5hbWUsIG1vZHAtPm5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChtb2RwLT5uZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCIsICIsIHIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFwX3JwdXRzKCI8L3R0Pjxocj4iLCByKTsKLQotICAgICAgICB9Ci0gICAgICAgIGlmICghci0+YXJncyB8fCAhc3RyY2FzZWNtcChyLT5hcmdzLCAic2VydmVyIikpIHsKLSAgICAgICAgICAgIGFwX3JwcmludGYociwgIjxhIG5hbWU9XCJzZXJ2ZXJcIj48c3Ryb25nPlNlcnZlciBWZXJzaW9uOjwvc3Ryb25nPiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiPGZvbnQgc2l6ZT0rMT48dHQ+JXM8L3R0PjwvYT48L2ZvbnQ+PGJyPlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX2dldF9zZXJ2ZXJfdmVyc2lvbigpKTsKLSAgICAgICAgICAgIGFwX3JwcmludGYociwgIjxzdHJvbmc+U2VydmVyIEJ1aWx0Ojwvc3Ryb25nPiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiPGZvbnQgc2l6ZT0rMT48dHQ+JXM8L3R0PjwvYT48L2ZvbnQ+PGJyPlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX2dldF9zZXJ2ZXJfYnVpbHQoKSk7Ci0gICAgICAgICAgICBhcF9ycHJpbnRmKHIsICI8c3Ryb25nPkFQSSBWZXJzaW9uOjwvc3Ryb25nPiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiPHR0PiVkOiVkPC90dD48YnI+XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgTU9EVUxFX01BR0lDX05VTUJFUl9NQUpPUiwgTU9EVUxFX01BR0lDX05VTUJFUl9NSU5PUik7Ci0gICAgICAgICAgICBhcF9ycHJpbnRmKHIsICI8c3Ryb25nPlVzZXIvR3JvdXA6PC9zdHJvbmc+ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICI8dHQ+JXMoJWQpLyVkPC90dD48YnI+XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYXBfdXNlcl9uYW1lLCAoaW50KSBhcF91c2VyX2lkLCAoaW50KSBhcF9ncm91cF9pZCk7Ci0gICAgICAgICAgICBhcF9ycHJpbnRmKHIsICI8c3Ryb25nPkhvc3RuYW1lL3BvcnQ6PC9zdHJvbmc+ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICI8dHQ+JXM6JXU8L3R0Pjxicj5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2LT5zZXJ2ZXJfaG9zdG5hbWUsIHNlcnYtPnBvcnQpOwotICAgICAgICAgICAgYXBfcnByaW50ZihyLCAiPHN0cm9uZz5EYWVtb25zOjwvc3Ryb25nPiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiPHR0PnN0YXJ0OiAlZCAmbmJzcDsmbmJzcDsgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm1pbiBpZGxlOiAlZCAmbmJzcDsmbmJzcDsgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm1heCBpZGxlOiAlZCAmbmJzcDsmbmJzcDsgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm1heDogJWQ8L3R0Pjxicj5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBhcF9kYWVtb25zX3RvX3N0YXJ0LCBhcF9kYWVtb25zX21pbl9mcmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgYXBfZGFlbW9uc19tYXhfZnJlZSwgYXBfZGFlbW9uc19saW1pdCk7Ci0gICAgICAgICAgICBhcF9ycHJpbnRmKHIsICI8c3Ryb25nPk1heCBSZXF1ZXN0czo8L3N0cm9uZz4gIgotICAgICAgICAgICAgICAgICAgICAgICAgIjx0dD5wZXIgY2hpbGQ6ICVkICZuYnNwOyZuYnNwOyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAia2VlcCBhbGl2ZTogJXMgJm5ic3A7Jm5ic3A7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJtYXggcGVyIGNvbm5lY3Rpb246ICVkPC90dD48YnI+XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYXBfbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzZXJ2LT5rZWVwX2FsaXZlID8gIm9uIiA6ICJvZmYiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnYtPmtlZXBfYWxpdmVfbWF4KTsKLSAgICAgICAgICAgIGFwX3JwcmludGYociwgIjxzdHJvbmc+VGhyZWFkczo8L3N0cm9uZz4gIgotICAgICAgICAgICAgICAgICAgICAgICAgIjx0dD5wZXIgY2hpbGQ6ICVkICZuYnNwOyZuYnNwOyA8L3R0Pjxicj5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBhcF90aHJlYWRzX3Blcl9jaGlsZCk7Ci0gICAgICAgICAgICBhcF9ycHJpbnRmKHIsICI8c3Ryb25nPlRpbWVvdXRzOjwvc3Ryb25nPiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiPHR0PmNvbm5lY3Rpb246ICVkICZuYnNwOyZuYnNwOyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAia2VlcC1hbGl2ZTogJWQ8L3R0Pjxicj4iLAotICAgICAgICAgICAgICAgICAgICAgICAgc2Vydi0+dGltZW91dCwgc2Vydi0+a2VlcF9hbGl2ZV90aW1lb3V0KTsKLSAgICAgICAgICAgIGFwX3JwcmludGYociwgIjxzdHJvbmc+U2VydmVyIFJvb3Q6PC9zdHJvbmc+ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICI8dHQ+JXM8L3R0Pjxicj5cbiIsIGFwX3NlcnZlcl9yb290KTsKLSAgICAgICAgICAgIGFwX3JwcmludGYociwgIjxzdHJvbmc+Q29uZmlnIEZpbGU6PC9zdHJvbmc+ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICI8dHQ+JXM8L3R0Pjxicj5cbiIsIGFwX3NlcnZlcl9jb25mbmFtZSk7Ci0gICAgICAgICAgICBhcF9ycHJpbnRmKHIsICI8c3Ryb25nPlBJRCBGaWxlOjwvc3Ryb25nPiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiPHR0PiVzPC90dD48YnI+XG4iLCBhcF9waWRfZm5hbWUpOwotICAgICAgICAgICAgYXBfcnByaW50ZihyLCAiPHN0cm9uZz5TY29yZWJvYXJkIEZpbGU6PC9zdHJvbmc+ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICI8dHQ+JXM8L3R0Pjxicj5cbiIsIGFwX3Njb3JlYm9hcmRfZm5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGFwX3JwdXRzKCI8aHI+PGRsPiIsIHIpOwotICAgICAgICBmb3IgKG1vZHAgPSB0b3BfbW9kdWxlOyBtb2RwOyBtb2RwID0gbW9kcC0+bmV4dCkgewotICAgICAgICAgICAgaWYgKCFyLT5hcmdzIHx8ICFzdHJjYXNlY21wKG1vZHAtPm5hbWUsIHItPmFyZ3MpKSB7Ci0gICAgICAgICAgICAgICAgYXBfcnByaW50ZihyLCAiPGR0PjxhIG5hbWU9XCIlc1wiPjxzdHJvbmc+TW9kdWxlIE5hbWU6PC9zdHJvbmc+ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGZvbnQgc2l6ZT0rMT48dHQ+JXM8L3R0PjwvYT48L2ZvbnQ+XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHAtPm5hbWUsIG1vZHAtPm5hbWUpOwotICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8ZHQ+PHN0cm9uZz5Db250ZW50IGhhbmRsZXJzOjwvc3Ryb25nPiIsIHIpOwotICAgICAgICAgICAgICAgIGhhbmQgPSBtb2RwLT5oYW5kbGVyczsKLSAgICAgICAgICAgICAgICBpZiAoaGFuZCkgewotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaGFuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmQtPmNvbnRlbnRfdHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwcmludGYociwgIiA8dHQ+JXM8L3R0PlxuIiwgaGFuZC0+Y29udGVudF90eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmQgJiYgaGFuZC0+Y29udGVudF90eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIiwiLCByKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIjx0dD4gPEVNPm5vbmU8L0VNPjwvdHQ+Iiwgcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8ZHQ+PHN0cm9uZz5Db25maWd1cmF0aW9uIFBoYXNlIFBhcnRpY2lwYXRpb246PC9zdHJvbmc+IFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICByKTsKLSAgICAgICAgICAgICAgICBpZiAobW9kcC0+Y2hpbGRfaW5pdCkgewotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPHR0PkNoaWxkIEluaXQ8L3R0PiIsIHIpOwotICAgICAgICAgICAgICAgICAgICBjb21tYSA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtb2RwLT5jcmVhdGVfZGlyX2NvbmZpZykgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCIsICIsIHIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8dHQ+Q3JlYXRlIERpcmVjdG9yeSBDb25maWc8L3R0PiIsIHIpOwotICAgICAgICAgICAgICAgICAgICBjb21tYSA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtb2RwLT5tZXJnZV9kaXJfY29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21tYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIiwgIiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIjx0dD5NZXJnZSBEaXJlY3RvcnkgQ29uZmlnczwvdHQ+Iiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1vZHAtPmNyZWF0ZV9zZXJ2ZXJfY29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21tYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIiwgIiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIjx0dD5DcmVhdGUgU2VydmVyIENvbmZpZzwvdHQ+Iiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1vZHAtPm1lcmdlX3NlcnZlcl9jb25maWcpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiLCAiLCByKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPHR0Pk1lcmdlIFNlcnZlciBDb25maWdzPC90dD4iLCByKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWEgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobW9kcC0+Y2hpbGRfZXhpdCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCIsICIsIHIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8dHQ+Q2hpbGQgRXhpdDwvdHQ+Iiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFjb21tYSkKLSAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIjx0dD4gPEVNPm5vbmU8L0VNPjwvdHQ+Iiwgcik7Ci0gICAgICAgICAgICAgICAgY29tbWEgPSAwOwotICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8ZHQ+PHN0cm9uZz5SZXF1ZXN0IFBoYXNlIFBhcnRpY2lwYXRpb246PC9zdHJvbmc+IFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICByKTsKLSAgICAgICAgICAgICAgICBpZiAobW9kcC0+cG9zdF9yZWFkX3JlcXVlc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIjx0dD5Qb3N0LVJlYWQgUmVxdWVzdDwvdHQ+Iiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1vZHAtPmhlYWRlcl9wYXJzZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiLCAiLCByKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPHR0PkhlYWRlciBQYXJzZTwvdHQ+Iiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1vZHAtPnRyYW5zbGF0ZV9oYW5kbGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21tYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIiwgIiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIjx0dD5UcmFuc2xhdGUgUGF0aDwvdHQ+Iiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1vZHAtPmFjY2Vzc19jaGVja2VyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21tYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIiwgIiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIjx0dD5DaGVjayBBY2Nlc3M8L3R0PiIsIHIpOwotICAgICAgICAgICAgICAgICAgICBjb21tYSA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtb2RwLT5hcF9jaGVja191c2VyX2lkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21tYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIiwgIiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIjx0dD5WZXJpZnkgVXNlciBJRDwvdHQ+Iiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1vZHAtPmF1dGhfY2hlY2tlcikgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCIsICIsIHIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8dHQ+VmVyaWZ5IFVzZXIgQWNjZXNzPC90dD4iLCByKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWEgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobW9kcC0+dHlwZV9jaGVja2VyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21tYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIiwgIiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIjx0dD5DaGVjayBUeXBlPC90dD4iLCByKTsKLSAgICAgICAgICAgICAgICAgICAgY29tbWEgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobW9kcC0+Zml4ZXJfdXBwZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiLCAiLCByKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPHR0PkZpeHVwczwvdHQ+Iiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1vZHAtPmxvZ2dlcikgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCIsICIsIHIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8dHQ+TG9nZ2luZzwvdHQ+Iiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFjb21tYSkKLSAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIjx0dD4gPEVNPm5vbmU8L0VNPjwvdHQ+Iiwgcik7Ci0gICAgICAgICAgICAgICAgY29tbWEgPSAwOwotICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8ZHQ+PHN0cm9uZz5Nb2R1bGUgRGlyZWN0aXZlczo8L3N0cm9uZz4gIiwgcik7Ci0gICAgICAgICAgICAgICAgY21kID0gbW9kcC0+Y21kczsKLSAgICAgICAgICAgICAgICBpZiAoY21kKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjbWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbWQtPm5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHJpbnRmKHIsICI8ZGQ+PHR0PiVzIC0gPGk+IiwKLQkJCQkgICAgbW9kX2luZm9faHRtbF9jbWRfc3RyaW5nKGNtZC0+bmFtZSwKLQkJCQkJYnVmLCBzaXplb2YoYnVmKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbWQtPmVycm1zZykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cyhjbWQtPmVycm1zZywgcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8L2k+PC90dD5cbiIsIHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbWQrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPGR0PjxzdHJvbmc+Q3VycmVudCBDb25maWd1cmF0aW9uOjwvc3Ryb25nPlxuIiwgcik7Ci0gICAgICAgICAgICAgICAgICAgIG1vZF9pbmZvX21vZHVsZV9jbWRzKHIsIG1vZF9pbmZvX2NmZ19odHRwZCwgbW9kcC0+Y21kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHBkLmNvbmYiKTsKLSAgICAgICAgICAgICAgICAgICAgbW9kX2luZm9fbW9kdWxlX2NtZHMociwgbW9kX2luZm9fY2ZnX3NybSwgbW9kcC0+Y21kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNybS5jb25mIik7Ci0gICAgICAgICAgICAgICAgICAgIG1vZF9pbmZvX21vZHVsZV9jbWRzKHIsIG1vZF9pbmZvX2NmZ19hY2Nlc3MsIG1vZHAtPmNtZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY2Nlc3MuY29uZiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMoIjx0dD4gbm9uZTwvdHQ+XG4iLCByKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbW9yZV9pbmZvID0gZmluZF9tb3JlX2luZm8oc2VydiwgbW9kcC0+bmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1vcmVfaW5mbykgewotICAgICAgICAgICAgICAgICAgICBhcF9ycHV0cygiPGR0PjxzdHJvbmc+QWRkaXRpb25hbCBJbmZvcm1hdGlvbjo8L3N0cm9uZz5cbjxkZD4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICByKTsKLSAgICAgICAgICAgICAgICAgICAgYXBfcnB1dHMobW9yZV9pbmZvLCByKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXBfcnB1dHMoIjxkdD48aHI+XG4iLCByKTsKLSAgICAgICAgICAgICAgICBpZiAoci0+YXJncykgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtb2RwICYmIHItPmFyZ3MgJiYgc3RyY2FzZWNtcChyLT5hcmdzLCAic2VydmVyIikpIHsKLSAgICAgICAgICAgIGFwX3JwdXRzKCI8Yj5ObyBzdWNoIG1vZHVsZTwvYj5cbiIsIHIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBmb3IgKG1vZHAgPSB0b3BfbW9kdWxlOyBtb2RwOyBtb2RwID0gbW9kcC0+bmV4dCkgewotICAgICAgICAgICAgYXBfcnB1dHMobW9kcC0+bmFtZSwgcik7Ci0gICAgICAgICAgICBpZiAobW9kcC0+bmV4dCkgewotICAgICAgICAgICAgICAgIGFwX3JwdXRzKCI8YnI+Iiwgcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYXBfcnB1dHMoIjwvZGw+XG4iLCByKTsKLSAgICBhcF9ycHV0cyhhcF9wc2lnbmF0dXJlKCIiLHIpLCByKTsKLSAgICBhcF9ycHV0cygiPC9ib2R5PjwvaHRtbD5cbiIsIHIpOwotICAgIC8qIERvbmUsIHR1cm4gb2ZmIHRpbWVvdXQsIGNsb3NlIGZpbGUgYW5kIHJldHVybiAqLwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqYWRkX21vZHVsZV9pbmZvKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqaW5mbykKLXsKLSAgICBzZXJ2ZXJfcmVjICpzID0gY21kLT5zZXJ2ZXI7Ci0gICAgaW5mb19zdnJfY29uZiAqY29uZiA9IChpbmZvX3N2cl9jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvX21vZHVsZSk7Ci0gICAgaW5mb19lbnRyeSAqbmV3ID0gYXBfcHVzaF9hcnJheShjb25mLT5tb3JlX2luZm8pOwotCi0gICAgbmV3LT5uYW1lID0gbmFtZTsKLSAgICBuZXctPmluZm8gPSBpbmZvOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgaW5mb19jbWRzW10gPQotewotICAgIHsiQWRkTW9kdWxlSW5mbyIsIGFkZF9tb2R1bGVfaW5mbywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMiwKLSAgICAgImEgbW9kdWxlIG5hbWUgYW5kIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gdGhhdCBtb2R1bGUifSwKLSAgICB7TlVMTH0KLX07Ci0KLXN0YXRpYyBjb25zdCBoYW5kbGVyX3JlYyBpbmZvX2hhbmRsZXJzW10gPQotewotICAgIHsic2VydmVyLWluZm8iLCBkaXNwbGF5X2luZm99LAotICAgIHtOVUxMfQotfTsKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGluZm9fbW9kdWxlID0KLXsKLSAgICBTVEFOREFSRF9NT0RVTEVfU1RVRkYsCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemVyICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpciBjb25maWcgY3JlYXRlciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXIgbWVyZ2VyIC0tLSBkZWZhdWx0IGlzIHRvIG92ZXJyaWRlICovCi0gICAgY3JlYXRlX2luZm9fY29uZmlnLCAgICAgICAgIC8qIHNlcnZlciBjb25maWcgKi8KLSAgICBtZXJnZV9pbmZvX2NvbmZpZywgICAgICAgICAgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLwotICAgIGluZm9fY21kcywgICAgICAgICAgICAgICAgICAvKiBjb21tYW5kIGFwX3RhYmxlX3QgKi8KLSAgICBpbmZvX2hhbmRsZXJzLCAgICAgICAgICAgICAgLyogaGFuZGxlcnMgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsZW5hbWUgdHJhbnNsYXRpb24gKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2tfdXNlcl9pZCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBhdXRoICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGFjY2VzcyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiB0eXBlX2NoZWNrZXIgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogZml4dXBzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvZ2dlciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBoZWFkZXIgcGFyc2VyICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoaWxkX2luaXQgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hpbGRfZXhpdCAqLwotICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb3N0IHJlYWQtcmVxdWVzdCAqLwotfTsKZGlmZiAtLWdpdCBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfaW5mby5kc3AgYi9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2luZm8uZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjg1NjQ2Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfaW5mby5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJBcGFjaGVNb2R1bGVJbmZvIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDIKLQotQ0ZHPUFwYWNoZU1vZHVsZUluZm8gLSBXaW4zMiBSZWxlYXNlCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIkFwYWNoZU1vZHVsZUluZm8ubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJBcGFjaGVNb2R1bGVJbmZvLm1hayIgQ0ZHPSJBcGFjaGVNb2R1bGVJbmZvIC0gV2luMzIgUmVsZWFzZSIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJBcGFjaGVNb2R1bGVJbmZvIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAiQXBhY2hlTW9kdWxlSW5mbyAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1NVEw9bWlkbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAiQXBhY2hlTW9kdWxlSW5mbyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiLlxBcGFjaGVNb2R1bGVJbmZvUiIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuXEFwYWNoZU1vZHVsZUluZm9SIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvTzIgL0kgIi4uXC4uXGluY2x1ZGUiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiU0hBUkVEX01PRFVMRSIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgLi5cLi5cQ29yZVJcQXBhY2hlQ29yZS5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hY2hpbmU6STM4NgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiQXBhY2hlTW9kdWxlSW5mbyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIi5cRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiLlxBcGFjaGVNb2R1bGVJbmZvRCIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuXEFwYWNoZU1vZHVsZUluZm9EIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTURkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uXC4uXGluY2x1ZGUiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiU0hBUkVEX01PRFVMRSIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIC4uXC4uXENvcmVEXEFwYWNoZUNvcmUubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2Ci0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJBcGFjaGVNb2R1bGVJbmZvIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAiQXBhY2hlTW9kdWxlSW5mbyAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aHBqO2JhdDtmb3I7ZjkwIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cbW9kdWxlc1xzdGFuZGFyZFxtb2RfaW5mby5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sO2ZpO2ZkIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxyZWFkZGlyLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO2NudDtydGY7Z2lmO2pwZztqcGVnO2pwZSIKLSMgRW5kIEdyb3VwCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfaW5mby5leHAgYi9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX2luZm8uZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzA0ZmE3Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2RfaW5mby5leHAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmZvX21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9zdGF0dXMuYyBiL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2Rfc3RhdHVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYWNmNDUuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9zdGF0dXMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIgotI2luY2x1ZGUgIm1wbV9zdGF0dXMuaCIKLQotI2lmbmRlZiBERUZBVUxUX1RJTUVfRk9STUFUIAotI2RlZmluZSBERUZBVUxUX1RJTUVfRk9STUFUICIlQSwgJWQtJWItJVkgJUg6JU06JVMgJVoiCi0jZW5kaWYKLQotI2RlZmluZSBTVEFUVVNfTUFHSUNfVFlQRSAiYXBwbGljYXRpb24veC1odHRwZC1zdGF0dXMiCi0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBzdGF0dXNfbW9kdWxlOwotCi1zdGF0aWMgaW50IHByaW50X3N0YXR1c192YWx1ZSh2b2lkICpkYXRhLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbCkKLXsKLSAgICByZXF1ZXN0X3JlYyAqciA9IChyZXF1ZXN0X3JlYyAqKSBkYXRhOwotCi0gICAgYXBfcnByaW50ZihyLCAiPGR0PiVzXG48ZGQ+JXNcbiIsIGtleSwgdmFsKTsKLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBzdGF0dXNfaGFuZGxlcihyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpbnQgaTsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqc2VydmVyX3N0YXR1czsKLSAgICBhcF9zdGF0dXNfdGFibGVfcm93X3QgKnN0YXR1c19yb3dzOwotCi0gICAgci0+YWxsb3dlZCA9ICgxIDw8IE1fR0VUKTsKLSAgICBpZiAoci0+bWV0aG9kX251bWJlciAhPSBNX0dFVCkKLQlyZXR1cm4gREVDTElORUQ7Ci0KLSAgICByLT5jb250ZW50X3R5cGUgPSAidGV4dC9odG1sIjsKLQotICAgIGFwX3NlbmRfaHR0cF9oZWFkZXIocik7Ci0KLSAgICBpZiAoci0+aGVhZGVyX29ubHkpCi0JcmV0dXJuIDA7Ci0KLSAgICBzZXJ2ZXJfc3RhdHVzID0gYXBfZ2V0X3N0YXR1c190YWJsZShyLT5wb29sKTsKLQotICAgIGFwX3JwdXRzKERPQ1RZUEVfSFRNTF8zXzIKLSAgICAJICI8aHRtbD48aGVhZD5cbjx0aXRsZT5BcGFjaGUgU3RhdHVzPC90aXRsZT5cbjwvaGVhZD48Ym9keT5cbiIsCi0gICAgCSByKTsKLSAgICBhcF9ycHV0cygiPEgxPkFwYWNoZSBTZXJ2ZXIgU3RhdHVzIGZvciAiLCByKTsKLSAgICBhcF9ydnB1dHMociwgYXBfZ2V0X3NlcnZlcl9uYW1lKHIpLCAiPC9IMT5cblxuIiwgTlVMTCk7Ci0gICAgYXBfcnZwdXRzKHIsICJTZXJ2ZXIgVmVyc2lvbjogIiwKLSAgICAgIGFwX2dldF9zZXJ2ZXJfdmVyc2lvbigpLCAiPGJyPlxuIiwgTlVMTCk7Ci0gICAgYXBfcnZwdXRzKHIsICJTZXJ2ZXIgQnVpbHQ6ICIsCi0gICAgICBhcF9nZXRfc2VydmVyX2J1aWx0KCksICI8YnI+XG48aHI+XG4iLCBOVUxMKTsKLSAgICBhcF9ydnB1dHMociwgIkN1cnJlbnQgVGltZTogIiwKLSAgICAgIGFwX2h0X3RpbWUoci0+cG9vbCwgYXBfbm93KCksIERFRkFVTFRfVElNRV9GT1JNQVQsIDApLCAiPGJyPlxuIiwgTlVMTCk7Ci0gICAgYXBfcnByaW50ZihyLCAiXG4lZCBjb25uZWN0aW9ucyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkXG4iLAotICAgICAgICAgICAgICAgc2VydmVyX3N0YXR1cy0+bmVsdHMpOwotCi0gICAgc3RhdHVzX3Jvd3MgPSAoYXBfc3RhdHVzX3RhYmxlX3Jvd190ICopIHNlcnZlcl9zdGF0dXMtPmVsdHM7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNlcnZlcl9zdGF0dXMtPm5lbHRzOyBpKyspIHsKLQlhcF9ycHJpbnRmKHIsICI8aDI+Q29ubmVjdGlvbiAlbGQ8L2gyPlxuIiwgc3RhdHVzX3Jvd3NbaV0uY29ubl9pZCk7Ci0gICAgICAgIGFwX3RhYmxlX2RvKHByaW50X3N0YXR1c192YWx1ZSwgKHZvaWQgKikgciwgc3RhdHVzX3Jvd3NbaV0uZGF0YSwgTlVMTCk7Ci0gICAgfQotICAgIGFwX3JwdXRzKCI8L2JvZHk+PC9odG1sPlxuIiwgcik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBoYW5kbGVyX3JlYyBzdGF0dXNfaGFuZGxlcnNbXSA9Ci17Ci0gICAge1NUQVRVU19NQUdJQ19UWVBFLCBzdGF0dXNfaGFuZGxlcn0sCi0gICAgeyJzZXJ2ZXItc3RhdHVzIiwgc3RhdHVzX2hhbmRsZXJ9LAotICAgIHtOVUxMfQotfTsKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIHN0YXR1c19tb2R1bGUgPQotewotICAgIFNUQU5EQVJEMjBfTU9EVUxFX1NUVUZGLAotICAgIE5VTEwsCQkJLyogY3JlYXRlIHBlci1kaXIgY29uZmlnICovCi0gICAgTlVMTCwJCQkvKiBtZXJnZSBwZXItZGlyIGNvbmZpZyAqLwotICAgIE5VTEwsCQkJLyogc2VydmVyIGNvbmZpZyAqLwotICAgIE5VTEwsCQkJLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLwotICAgIE5VTEwsCQkJLyogY29tbWFuZCB0YWJsZSAqLwotICAgIHN0YXR1c19oYW5kbGVycywJCS8qIGhhbmRsZXJzICovCi0gICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIGhvb2tzICovCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9zdGF0dXMuZHNwIGIvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9zdGF0dXMuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmM5MjcxLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvZ2VuZXJhdG9ycy9tb2Rfc3RhdHVzLmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9IkFwYWNoZU1vZHVsZVN0YXR1cyIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNS4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyCi0KLUNGRz1BcGFjaGVNb2R1bGVTdGF0dXMgLSBXaW4zMiBSZWxlYXNlCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIkFwYWNoZU1vZHVsZVN0YXR1cy5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIkFwYWNoZU1vZHVsZVN0YXR1cy5tYWsiXAotIENGRz0iQXBhY2hlTW9kdWxlU3RhdHVzIC0gV2luMzIgUmVsZWFzZSIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJBcGFjaGVNb2R1bGVTdGF0dXMgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICJBcGFjaGVNb2R1bGVTdGF0dXMgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotTVRMPW1pZGwuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIkFwYWNoZU1vZHVsZVN0YXR1cyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiLlxBcGFjaGVNb2R1bGVTdGF0dXNSIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi5cQXBhY2hlTW9kdWxlU3RhdHVzUiIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR1ggL08yIC9JICIuLlwuLlxpbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIlNIQVJFRF9NT0RVTEUiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIC4uXC4uXENvcmVSXEFwYWNoZUNvcmUubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYWNoaW5lOkkzODYKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFwYWNoZU1vZHVsZVN0YXR1cyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIi5cRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiLlxBcGFjaGVNb2R1bGVTdGF0dXNEIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi5cQXBhY2hlTW9kdWxlU3RhdHVzRCIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9JICIuLlwuLlxpbmNsdWRlIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIlNIQVJFRF9NT0RVTEUiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiAuLlwuLlxDb3JlRFxBcGFjaGVDb3JlLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NgotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAiQXBhY2hlTW9kdWxlU3RhdHVzIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAiQXBhY2hlTW9kdWxlU3RhdHVzIC0gV2luMzIgRGVidWciCi0jIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtocGo7YmF0O2ZvcjtmOTAiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxtb2R1bGVzXHN0YW5kYXJkXG1vZF9zdGF0dXMuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubDtmaTtmZCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5ccmVhZGRpci5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIlJlc291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtjbnQ7cnRmO2dpZjtqcGc7anBlZztqcGUiCi0jIEVuZCBHcm91cAotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX3N0YXR1cy5leHAgYi9tb2R1bGVzL2dlbmVyYXRvcnMvbW9kX3N0YXR1cy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MzgwOTMuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9nZW5lcmF0b3JzL21vZF9zdGF0dXMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc3RhdHVzX21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9odHRwLy5pbmRlbnQucHJvIGIvbW9kdWxlcy9odHRwLy5pbmRlbnQucHJvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWZiZTlmLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvaHR0cC8uaW5kZW50LnBybworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS1pNCAtbnBzbCAtZGkwIC1iciAtbmNlIC1kMCAtY2xpMCAtbnBjcyAtbmZjMQotLVRCVUZGCi0tVEZJTEUKLS1UVFJBTlMKLS1UVUlOVDQKLS1UX3RyYW5zCi0tVGFsbG93X29wdGlvbnNfdAotLVRhcGFjaGVfc2ZpbwotLVRhcnJheV9oZWFkZXIKLS1UYm9vbF9pbnQKLS1UYnVmX2FyZWEKLS1UYnVmZl9zdHJ1Y3QKLS1UYnVmZnkKLS1UY21kX2hvdwotLVRjbWRfcGFybXMKLS1UY29tbWFuZF9yZWMKLS1UY29tbWFuZF9zdHJ1Y3QKLS1UY29ubl9yZWMKLS1UY29yZV9kaXJfY29uZmlnCi0tVGNvcmVfc2VydmVyX2NvbmZpZwotLVRkaXJfbWFrZXJfZnVuYwotLVRldmVudAotLVRnbG9iYWxzX3MKLS1UaGFuZGxlcl9mdW5jCi0tVGhhbmRsZXJfcmVjCi0tVGpvYmxpc3RfcwotLVRsaXN0ZW5fcmVjCi0tVG1lcmdlcl9mdW5jCi0tVG1vZGVfdAotLVRtb2R1bGUKLS1UbW9kdWxlX3N0cnVjdAotLVRtdXRleAotLVRuX2xvbmcKLS1Ub3RoZXJfY2hpbGRfcmVjCi0tVG92ZXJyaWRlc190Ci0tVHBhcmVudF9zY29yZQotLVRwaWRfdAotLVRwaXBlZF9sb2cKLS1UcG9vbAotLVRyZXF1ZXN0X3JlYwotLVRyZXF1aXJlX2xpbmUKLS1UcmxpbV90Ci0tVHNjb3JlYm9hcmQKLS1Uc2VtYXBob3JlCi0tVHNlcnZlcl9hZGRyX3JlYwotLVRzZXJ2ZXJfcmVjCi0tVHNlcnZlcl9yZWNfY2hhaW4KLS1Uc2hvcnRfc2NvcmUKLS1UdGFibGUKLS1UdGFibGVfZW50cnkKLS1UdGhyZWFkCi0tVHVfd2lkZV9pbnQKLS1UdnRpbWVfdAotLVR3aWRlX2ludApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9odHRwL2h0dHBfY29yZS5jIGIvbW9kdWxlcy9odHRwL2h0dHBfY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTEwYjg3Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvaHR0cC9odHRwX2NvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDI2NTEgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jZGVmaW5lIENPUkVfUFJJVkFURQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImFwcl9saWIuaCIKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIgkvKiBGb3IgaW5kZXhfb2ZfcmVzcG9uc2UoKS4gIEdydW1wLiAqLwotI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIgotI2luY2x1ZGUgImh0dHBfdmhvc3QuaCIKLSNpbmNsdWRlICJodHRwX21haW4uaCIJCS8qIEZvciB0aGUgZGVmYXVsdF9oYW5kbGVyIGJlbG93Li4uICovCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJyZmMxNDEzLmgiCi0jaW5jbHVkZSAidXRpbF9tZDUuaCIKLSNpbmNsdWRlICJhcHJfZm5tYXRjaC5oIgotI2luY2x1ZGUgImh0dHBfY29ubmVjdGlvbi5oIgotCi0vKiBBbGxvdyBBcGFjaGUgdG8gdXNlIGFwX21tYXAgKi8KLSNpZmRlZiBVU0VfTU1BUF9GSUxFUwotI2luY2x1ZGUgImFwcl9tbWFwLmgiCi0KLS8qIG1tYXAgc3VwcG9ydCBmb3Igc3RhdGljIGZpbGVzIGJhc2VkIG9uIGlkZWFzIGZyb20gSm9obiBIZWlkZW1hbm4ncwotICogcGF0Y2ggYWdhaW5zdCAxLjAuNS4gIFNlZQotICogPGh0dHA6Ly93d3cuaXNpLmVkdS9+am9obmgvU09GVFdBUkUvQVBBQ0hFL2luZGV4Lmh0bWw+LgotICovCi0KLS8qIEZpbGVzIGhhdmUgdG8gYmUgYXQgbGVhc3QgdGhpcyBiaWcgYmVmb3JlIHRoZXkncmUgbW1hcCgpZC4gIFRoaXMgaXMgdG8gZGVhbAotICogd2l0aCBzeXN0ZW1zIHdoZXJlIHRoZSBleHBlbnNlIG9mIGRvaW5nIGFuIG1tYXAoKSBhbmQgYW4gbXVubWFwKCkgb3V0d2VpZ2hzCi0gKiB0aGUgYmVuZWZpdCBmb3Igc21hbGwgZmlsZXMuICBJdCBzaG91bGRuJ3QgYmUgc2V0IGxvd2VyIHRoYW4gMS4KLSAqLwotI2lmbmRlZiBNTUFQX1RIUkVTSE9MRAotICAjaWZkZWYgU1VOT1M0Ci0gICNkZWZpbmUgTU1BUF9USFJFU0hPTEQJCSg4KjEwMjQpCi0gICNlbHNlCi0gICNkZWZpbmUgTU1BUF9USFJFU0hPTEQJCTEKLSAgI2VuZGlmIC8qIFNVTk9TNCAqLwotI2VuZGlmIC8qIE1NQVBfVEhSRVNIT0xEICovCi0jaWZuZGVmIE1NQVBfTElNSVQKLSNkZWZpbmUgTU1BUF9MSU1JVCAgICAgICAgICAgICAgKDQqMTAyNCoxMDI0KQotI2VuZGlmCi0jZW5kaWYgLyogVVNFX01NQVBfRklMRVMgKi8KLQotLyogU2VydmVyIGNvcmUgbW9kdWxlLi4uIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHJlYWxseSBiYXNpYwotICogc2VydmVyIG9wZXJhdGlvbnMsIGluY2x1ZGluZyBvcHRpb25zIGFuZCBjb21tYW5kcyB3aGljaCBjb250cm9sIHRoZQotICogb3BlcmF0aW9uIG9mIG90aGVyIG1vZHVsZXMuICBDb25zaWRlciB0aGlzIHRoZSBidXJlYXVjcmFjeSBtb2R1bGUuCi0gKgotICogVGhlIGNvcmUgbW9kdWxlIGFsc28gZGVmaW5lcyBoYW5kbGVycywgZXRjLiwgZG8gaGFuZGxlIGp1c3QgZW5vdWdoCi0gKiB0byBhbGxvdyBhIHNlcnZlciB3aXRoIHRoZSBjb3JlIG1vZHVsZSBPTkxZIHRvIGFjdHVhbGx5IHNlcnZlIGRvY3VtZW50cwotICogKHRob3VnaCBpdCBzbGFwcyBEZWZhdWx0VHlwZSBvbiBhbGwgb2YgJ2VtKTsgdGhpcyB3YXMgdXNlZnVsIGluIHRlc3RpbmcsCi0gKiBidXQgbWF5IG5vdCBiZSB3b3J0aCBwcmVzZXJ2aW5nLgotICoKLSAqIFRoaXMgZmlsZSBjb3VsZCBhbG1vc3QgYmUgbW9kX2NvcmUuYywgZXhjZXB0IGZvciB0aGUgc3R1ZmYgd2hpY2ggYWZmZWN0cwotICogdGhlIGh0dHBfY29uZl9nbG9iYWxzLgotICovCi0KLXN0YXRpYyB2b2lkICpjcmVhdGVfY29yZV9kaXJfY29uZmlnKGFwX2NvbnRleHRfdCAqYSwgY2hhciAqZGlyKQotewotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZjsKLQotICAgIGNvbmYgPSAoY29yZV9kaXJfY29uZmlnICopYXBfcGNhbGxvYyhhLCBzaXplb2YoY29yZV9kaXJfY29uZmlnKSk7Ci0gICAgaWYgKCFkaXIgfHwgZGlyW3N0cmxlbihkaXIpIC0gMV0gPT0gJy8nKSB7Ci0gICAgICAgIGNvbmYtPmQgPSBkaXI7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cm5jbXAoZGlyLCAicHJveHk6IiwgNikgPT0gMCkgewotICAgICAgICBjb25mLT5kID0gYXBfcHN0cmR1cChhLCBkaXIpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgY29uZi0+ZCA9IGFwX3BzdHJjYXQoYSwgZGlyLCAiLyIsIE5VTEwpOwotICAgIH0KLSAgICBjb25mLT5kX2lzX2ZubWF0Y2ggPSBjb25mLT5kID8gKGFwX2lzX2ZubWF0Y2goY29uZi0+ZCkgIT0gMCkgOiAwOwotICAgIGNvbmYtPmRfY29tcG9uZW50cyA9IGNvbmYtPmQgPyBhcF9jb3VudF9kaXJzKGNvbmYtPmQpIDogMDsKLQotICAgIGNvbmYtPm9wdHMgPSBkaXIgPyBPUFRfVU5TRVQgOiBPUFRfVU5TRVR8T1BUX0FMTDsKLSAgICBjb25mLT5vcHRzX2FkZCA9IGNvbmYtPm9wdHNfcmVtb3ZlID0gT1BUX05PTkU7Ci0gICAgY29uZi0+b3ZlcnJpZGUgPSBkaXIgPyBPUl9VTlNFVCA6IE9SX1VOU0VUfE9SX0FMTDsKLQotICAgIGNvbmYtPmNvbnRlbnRfbWQ1ID0gMjsKLQotICAgIGNvbmYtPnVzZV9jYW5vbmljYWxfbmFtZSA9IFVTRV9DQU5PTklDQUxfTkFNRV9VTlNFVDsKLQotICAgIGNvbmYtPmhvc3RuYW1lX2xvb2t1cHMgPSBIT1NUTkFNRV9MT09LVVBfVU5TRVQ7Ci0gICAgY29uZi0+ZG9fcmZjMTQxMyA9IERFRkFVTFRfUkZDMTQxMyB8IDI7IC8qIHNldCBiaXQgMSB0byBpbmRpY2F0ZSBkZWZhdWx0ICovCi0gICAgY29uZi0+c2F0aXNmeSA9IFNBVElTRllfTk9TUEVDOwotCi0gICAgY29uZi0+bGltaXRfcmVxX2JvZHkgPSAwOwotICAgIGNvbmYtPnNlYyA9IGFwX21ha2VfYXJyYXkoYSwgMiwgc2l6ZW9mKHZvaWQgKikpOwotI2lmZGVmIFdJTjMyCi0gICAgY29uZi0+c2NyaXB0X2ludGVycHJldGVyX3NvdXJjZSA9IElOVEVSUFJFVEVSX1NPVVJDRV9VTlNFVDsKLSNlbmRpZgotCi0gICAgY29uZi0+c2VydmVyX3NpZ25hdHVyZSA9IHNydl9zaWdfdW5zZXQ7Ci0KLSAgICByZXR1cm4gKHZvaWQgKiljb25mOwotfQotCi1zdGF0aWMgdm9pZCAqbWVyZ2VfY29yZV9kaXJfY29uZmlncyhhcF9jb250ZXh0X3QgKmEsIHZvaWQgKmJhc2V2LCB2b2lkICpuZXd2KQotewotICAgIGNvcmVfZGlyX2NvbmZpZyAqYmFzZSA9IChjb3JlX2Rpcl9jb25maWcgKiliYXNldjsKLSAgICBjb3JlX2Rpcl9jb25maWcgKm5ldyA9IChjb3JlX2Rpcl9jb25maWcgKiluZXd2OwotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZjsKLSAgICBpbnQgaTsKLSAgCi0gICAgY29uZiA9IChjb3JlX2Rpcl9jb25maWcgKilhcF9wYWxsb2MoYSwgc2l6ZW9mKGNvcmVfZGlyX2NvbmZpZykpOwotICAgIG1lbWNweSgoY2hhciAqKWNvbmYsIChjb25zdCBjaGFyICopYmFzZSwgc2l6ZW9mKGNvcmVfZGlyX2NvbmZpZykpOwotICAgIGlmIChiYXNlLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MpIHsKLQljb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MgPQotCSAgICBhcF9wYWxsb2MoYSwgc2l6ZW9mKCpjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MpCi0JCSAgICAgICogUkVTUE9OU0VfQ09ERVMpOwotCW1lbWNweShjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MsIGJhc2UtPnJlc3BvbnNlX2NvZGVfc3RyaW5ncywKLQkgICAgICAgc2l6ZW9mKCpjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MpICogUkVTUE9OU0VfQ09ERVMpOwotICAgIH0KLSAgICAKLSAgICBjb25mLT5kID0gbmV3LT5kOwotICAgIGNvbmYtPmRfaXNfZm5tYXRjaCA9IG5ldy0+ZF9pc19mbm1hdGNoOwotICAgIGNvbmYtPmRfY29tcG9uZW50cyA9IG5ldy0+ZF9jb21wb25lbnRzOwotICAgIGNvbmYtPnIgPSBuZXctPnI7Ci0gICAgCi0gICAgaWYgKG5ldy0+b3B0cyAmIE9QVF9VTlNFVCkgewotCS8qIHRoZXJlIHdhcyBubyBleHBsaWNpdCBzZXR0aW5nIG9mIG5ldy0+b3B0cywgc28gd2UgbWVyZ2UKLQkgKiBwcmVzZXJ2ZSB0aGUgaW52YXJpYW50IChvcHRzX2FkZCAmIG9wdHNfcmVtb3ZlKSA9PSAwCi0JICovCi0JY29uZi0+b3B0c19hZGQgPSAoY29uZi0+b3B0c19hZGQgJiB+bmV3LT5vcHRzX3JlbW92ZSkgfCBuZXctPm9wdHNfYWRkOwotCWNvbmYtPm9wdHNfcmVtb3ZlID0gKGNvbmYtPm9wdHNfcmVtb3ZlICYgfm5ldy0+b3B0c19hZGQpCi0JICAgICAgICAgICAgICAgICAgICB8IG5ldy0+b3B0c19yZW1vdmU7Ci0JY29uZi0+b3B0cyA9IChjb25mLT5vcHRzICYgfmNvbmYtPm9wdHNfcmVtb3ZlKSB8IGNvbmYtPm9wdHNfYWRkOwotICAgICAgICBpZiAoKGJhc2UtPm9wdHMgJiBPUFRfSU5DTk9FWEVDKSAmJiAobmV3LT5vcHRzICYgT1BUX0lOQ0xVREVTKSkgewotICAgICAgICAgICAgY29uZi0+b3B0cyA9IChjb25mLT5vcHRzICYgfk9QVF9JTkNOT0VYRUMpIHwgT1BUX0lOQ0xVREVTOwotCX0KLSAgICB9Ci0gICAgZWxzZSB7Ci0JLyogb3RoZXJ3aXNlIHdlIGp1c3QgY29weSwgYmVjYXVzZSBhbiBleHBsaWNpdCBvcHRzIHNldHRpbmcKLQkgKiBvdmVycmlkZXMgYWxsIGVhcmxpZXIgKy8tIG1vZGlmaWVycwotCSAqLwotCWNvbmYtPm9wdHMgPSBuZXctPm9wdHM7Ci0JY29uZi0+b3B0c19hZGQgPSBuZXctPm9wdHNfYWRkOwotCWNvbmYtPm9wdHNfcmVtb3ZlID0gbmV3LT5vcHRzX3JlbW92ZTsKLSAgICB9Ci0KLSAgICBpZiAoIShuZXctPm92ZXJyaWRlICYgT1JfVU5TRVQpKSB7Ci0gICAgICAgIGNvbmYtPm92ZXJyaWRlID0gbmV3LT5vdmVycmlkZTsKLSAgICB9Ci0gICAgaWYgKG5ldy0+YXBfZGVmYXVsdF90eXBlKSB7Ci0gICAgICAgIGNvbmYtPmFwX2RlZmF1bHRfdHlwZSA9IG5ldy0+YXBfZGVmYXVsdF90eXBlOwotICAgIH0KLSAgICAKLSAgICBpZiAobmV3LT5hcF9hdXRoX3R5cGUpIHsKLSAgICAgICAgY29uZi0+YXBfYXV0aF90eXBlID0gbmV3LT5hcF9hdXRoX3R5cGU7Ci0gICAgfQotICAgIGlmIChuZXctPmFwX2F1dGhfbmFtZSkgewotICAgICAgICBjb25mLT5hcF9hdXRoX25hbWUgPSBuZXctPmFwX2F1dGhfbmFtZTsKLSAgICB9Ci0gICAgaWYgKG5ldy0+YXBfcmVxdWlyZXMpIHsKLSAgICAgICAgY29uZi0+YXBfcmVxdWlyZXMgPSBuZXctPmFwX3JlcXVpcmVzOwotICAgIH0KLQotICAgIGlmIChuZXctPnJlc3BvbnNlX2NvZGVfc3RyaW5ncykgewotCWlmIChjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MgPT0gTlVMTCkgewotCSAgICBjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MgPSBhcF9wYWxsb2MoYSwKLQkJc2l6ZW9mKCpjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MpICogUkVTUE9OU0VfQ09ERVMpOwotCSAgICBtZW1jcHkoY29uZi0+cmVzcG9uc2VfY29kZV9zdHJpbmdzLCBuZXctPnJlc3BvbnNlX2NvZGVfc3RyaW5ncywKLQkJICAgc2l6ZW9mKCpjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MpICogUkVTUE9OU0VfQ09ERVMpOwotCX0KLQllbHNlIHsKLQkgICAgZm9yIChpID0gMDsgaSA8IFJFU1BPTlNFX0NPREVTOyArK2kpIHsKLQkgICAgICAgIGlmIChuZXctPnJlc3BvbnNlX2NvZGVfc3RyaW5nc1tpXSAhPSBOVUxMKSB7Ci0JCSAgICBjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3NbaV0KLQkJICAgICAgICA9IG5ldy0+cmVzcG9uc2VfY29kZV9zdHJpbmdzW2ldOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIGlmIChuZXctPmhvc3RuYW1lX2xvb2t1cHMgIT0gSE9TVE5BTUVfTE9PS1VQX1VOU0VUKSB7Ci0JY29uZi0+aG9zdG5hbWVfbG9va3VwcyA9IG5ldy0+aG9zdG5hbWVfbG9va3VwczsKLSAgICB9Ci0gICAgaWYgKChuZXctPmRvX3JmYzE0MTMgJiAyKSA9PSAwKSB7Ci0gICAgICAgIGNvbmYtPmRvX3JmYzE0MTMgPSBuZXctPmRvX3JmYzE0MTM7Ci0gICAgfQotICAgIGlmICgobmV3LT5jb250ZW50X21kNSAmIDIpID09IDApIHsKLSAgICAgICAgY29uZi0+Y29udGVudF9tZDUgPSBuZXctPmNvbnRlbnRfbWQ1OwotICAgIH0KLSAgICBpZiAobmV3LT51c2VfY2Fub25pY2FsX25hbWUgIT0gVVNFX0NBTk9OSUNBTF9OQU1FX1VOU0VUKSB7Ci0JY29uZi0+dXNlX2Nhbm9uaWNhbF9uYW1lID0gbmV3LT51c2VfY2Fub25pY2FsX25hbWU7Ci0gICAgfQotCi0gICAgaWYgKG5ldy0+bGltaXRfcmVxX2JvZHkpIHsKLSAgICAgICAgY29uZi0+bGltaXRfcmVxX2JvZHkgPSBuZXctPmxpbWl0X3JlcV9ib2R5OwotICAgIH0KLSAgICBjb25mLT5zZWMgPSBhcF9hcHBlbmRfYXJyYXlzKGEsIGJhc2UtPnNlYywgbmV3LT5zZWMpOwotCi0gICAgaWYgKG5ldy0+c2F0aXNmeSAhPSBTQVRJU0ZZX05PU1BFQykgewotICAgICAgICBjb25mLT5zYXRpc2Z5ID0gbmV3LT5zYXRpc2Z5OwotICAgIH0KLQotI2lmZGVmIFdJTjMyCi0gICAgaWYgKG5ldy0+c2NyaXB0X2ludGVycHJldGVyX3NvdXJjZSAhPSBJTlRFUlBSRVRFUl9TT1VSQ0VfVU5TRVQpIHsKLSAgICAgICAgY29uZi0+c2NyaXB0X2ludGVycHJldGVyX3NvdXJjZSA9IG5ldy0+c2NyaXB0X2ludGVycHJldGVyX3NvdXJjZTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGlmIChuZXctPnNlcnZlcl9zaWduYXR1cmUgIT0gc3J2X3NpZ191bnNldCkgewotCWNvbmYtPnNlcnZlcl9zaWduYXR1cmUgPSBuZXctPnNlcnZlcl9zaWduYXR1cmU7Ci0gICAgfQotCi0gICAgcmV0dXJuICh2b2lkKiljb25mOwotfQotCi1zdGF0aWMgdm9pZCAqY3JlYXRlX2NvcmVfc2VydmVyX2NvbmZpZyhhcF9jb250ZXh0X3QgKmEsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgY29yZV9zZXJ2ZXJfY29uZmlnICpjb25mOwotICAgIGludCBpc192aXJ0dWFsID0gcy0+aXNfdmlydHVhbDsKLSAgCi0gICAgY29uZiA9IChjb3JlX3NlcnZlcl9jb25maWcgKilhcF9wY2FsbG9jKGEsIHNpemVvZihjb3JlX3NlcnZlcl9jb25maWcpKTsKLSNpZmRlZiBHUFJPRgotICAgIGNvbmYtPmdwcm9mX2RpciA9IE5VTEw7Ci0jZW5kaWYKLSAgICBjb25mLT5hY2Nlc3NfbmFtZSA9IGlzX3ZpcnR1YWwgPyBOVUxMIDogREVGQVVMVF9BQ0NFU1NfRk5BTUU7Ci0gICAgY29uZi0+YXBfZG9jdW1lbnRfcm9vdCA9IGlzX3ZpcnR1YWwgPyBOVUxMIDogRE9DVU1FTlRfTE9DQVRJT047Ci0gICAgY29uZi0+c2VjID0gYXBfbWFrZV9hcnJheShhLCA0MCwgc2l6ZW9mKHZvaWQgKikpOwotICAgIGNvbmYtPnNlY191cmwgPSBhcF9tYWtlX2FycmF5KGEsIDQwLCBzaXplb2Yodm9pZCAqKSk7Ci0gICAgCi0gICAgcmV0dXJuICh2b2lkICopY29uZjsKLX0KLQotc3RhdGljIHZvaWQgKm1lcmdlX2NvcmVfc2VydmVyX2NvbmZpZ3MoYXBfY29udGV4dF90ICpwLCB2b2lkICpiYXNldiwgdm9pZCAqdmlydHYpCi17Ci0gICAgY29yZV9zZXJ2ZXJfY29uZmlnICpiYXNlID0gKGNvcmVfc2VydmVyX2NvbmZpZyAqKWJhc2V2OwotICAgIGNvcmVfc2VydmVyX2NvbmZpZyAqdmlydCA9IChjb3JlX3NlcnZlcl9jb25maWcgKil2aXJ0djsKLSAgICBjb3JlX3NlcnZlcl9jb25maWcgKmNvbmY7Ci0KLSAgICBjb25mID0gKGNvcmVfc2VydmVyX2NvbmZpZyAqKWFwX3BjYWxsb2MocCwgc2l6ZW9mKGNvcmVfc2VydmVyX2NvbmZpZykpOwotICAgICpjb25mID0gKnZpcnQ7Ci0gICAgaWYgKCFjb25mLT5hY2Nlc3NfbmFtZSkgewotICAgICAgICBjb25mLT5hY2Nlc3NfbmFtZSA9IGJhc2UtPmFjY2Vzc19uYW1lOwotICAgIH0KLSAgICBpZiAoIWNvbmYtPmFwX2RvY3VtZW50X3Jvb3QpIHsKLSAgICAgICAgY29uZi0+YXBfZG9jdW1lbnRfcm9vdCA9IGJhc2UtPmFwX2RvY3VtZW50X3Jvb3Q7Ci0gICAgfQotICAgIGNvbmYtPnNlYyA9IGFwX2FwcGVuZF9hcnJheXMocCwgYmFzZS0+c2VjLCB2aXJ0LT5zZWMpOwotICAgIGNvbmYtPnNlY191cmwgPSBhcF9hcHBlbmRfYXJyYXlzKHAsIGJhc2UtPnNlY191cmwsIHZpcnQtPnNlY191cmwpOwotCi0gICAgcmV0dXJuIGNvbmY7Ci19Ci0KLS8qIEFkZCBwZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24gZW50cnkgKGZvciA8ZGlyZWN0b3J5PiBzZWN0aW9uKTsKLSAqIHRoZXNlIGFyZSBwYXJ0IG9mIHRoZSBjb3JlIHNlcnZlciBjb25maWcuCi0gKi8KLQotQ09SRV9FWFBPUlQodm9pZCkgYXBfYWRkX3Blcl9kaXJfY29uZihzZXJ2ZXJfcmVjICpzLCB2b2lkICpkaXJfY29uZmlnKQotewotICAgIGNvcmVfc2VydmVyX2NvbmZpZyAqc2NvbmYgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLAotCQkJCQkJICAgICAmY29yZV9tb2R1bGUpOwotICAgIHZvaWQgKipuZXdfc3BhY2UgPSAodm9pZCAqKilhcF9wdXNoX2FycmF5KHNjb25mLT5zZWMpOwotICAgIAotICAgICpuZXdfc3BhY2UgPSBkaXJfY29uZmlnOwotfQotCi1DT1JFX0VYUE9SVCh2b2lkKSBhcF9hZGRfcGVyX3VybF9jb25mKHNlcnZlcl9yZWMgKnMsIHZvaWQgKnVybF9jb25maWcpCi17Ci0gICAgY29yZV9zZXJ2ZXJfY29uZmlnICpzY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsCi0JCQkJCQkgICAgICZjb3JlX21vZHVsZSk7Ci0gICAgdm9pZCAqKm5ld19zcGFjZSA9ICh2b2lkICoqKWFwX3B1c2hfYXJyYXkoc2NvbmYtPnNlY191cmwpOwotICAgIAotICAgICpuZXdfc3BhY2UgPSB1cmxfY29uZmlnOwotfQotCi1DT1JFX0VYUE9SVCh2b2lkKSBhcF9hZGRfZmlsZV9jb25mKGNvcmVfZGlyX2NvbmZpZyAqY29uZiwgdm9pZCAqdXJsX2NvbmZpZykKLXsKLSAgICB2b2lkICoqbmV3X3NwYWNlID0gKHZvaWQgKiopYXBfcHVzaF9hcnJheShjb25mLT5zZWMpOwotICAgIAotICAgICpuZXdfc3BhY2UgPSB1cmxfY29uZmlnOwotfQotCi0vKiBjb3JlX3Jlb3JkZXJfZGlyZWN0b3JpZXMgcmVvcmRlcnMgdGhlIGRpcmVjdG9yeSBzZWN0aW9ucyBzdWNoIHRoYXQgdGhlCi0gKiAxLWNvbXBvbmVudCBzZWN0aW9ucyBjb21lIGZpcnN0LCB0aGVuIHRoZSAyLWNvbXBvbmVudCwgYW5kIHNvIG9uLCBmaW5hbGx5Ci0gKiBmb2xsb3dlZCBieSB0aGUgInNwZWNpYWwiIHNlY3Rpb25zLiAgQSBzZWN0aW9uIGlzICJzcGVjaWFsIiBpZiBpdCdzIGEgcmVnZXgsCi0gKiBvciBpZiBpdCBkb2Vzbid0IHN0YXJ0IHdpdGggLyAtLSBjb25zaWRlciBwcm94eTogbWF0Y2hpbmcuICBBbGwgbW92ZW1lbnRzCi0gKiBhcmUgaW4tb3JkZXIgdG8gcHJlc2VydmUgdGhlIG9yZGVyaW5nIG9mIHRoZSBzZWN0aW9ucyBmcm9tIHRoZSBjb25maWcgZmlsZXMuCi0gKiBTZWUgZGlyZWN0b3J5X3dhbGsoKS4KLSAqLwotCi0jaWZkZWYgSEFWRV9EUklWRV9MRVRURVJTCi0jZGVmaW5lIElTX1NQRUNJQUwoZW50cnlfY29yZSkJXAotICAgICgoZW50cnlfY29yZSktPnIgIT0gTlVMTCBcCi0JfHwgKChlbnRyeV9jb3JlKS0+ZFswXSAhPSAnLycgJiYgKGVudHJ5X2NvcmUpLT5kWzFdICE9ICc6JykpCi0jZWxzZQotI2RlZmluZSBJU19TUEVDSUFMKGVudHJ5X2NvcmUpCVwKLSAgICAoKGVudHJ5X2NvcmUpLT5yICE9IE5VTEwgfHwgKGVudHJ5X2NvcmUpLT5kWzBdICE9ICcvJykKLSNlbmRpZgotCi0vKiBXZSBuZWVkIHRvIGRvIGEgc3RhYmxlIHNvcnQsIHFzb3J0IGlzbid0IHN0YWJsZS4gIFNvIHRvIG1ha2UgaXQgc3RhYmxlCi0gKiB3ZSdsbCBiZSBtYWludGFpbmluZyB0aGUgb3JpZ2luYWwgaW5kZXggaW50byB0aGUgbGlzdCwgYW5kIHVzaW5nIGl0Ci0gKiBhcyB0aGUgbWlub3Iga2V5IGR1cmluZyBzb3J0aW5nLiAgVGhlIG1ham9yIGtleSBpcyB0aGUgbnVtYmVyIG9mCi0gKiBjb21wb25lbnRzICh3aGVyZSBhICJzcGVjaWFsIiBzZWN0aW9uIGhhcyBpbmZpbml0ZSBjb21wb25lbnRzKS4KLSAqLwotc3RydWN0IHJlb3JkZXJfc29ydF9yZWMgewotICAgIHZvaWQgKmVsdDsKLSAgICBpbnQgb3JpZ19pbmRleDsKLX07Ci0KLXN0YXRpYyBpbnQgcmVvcmRlcl9zb3J0ZXIoY29uc3Qgdm9pZCAqdmEsIGNvbnN0IHZvaWQgKnZiKQotewotICAgIGNvbnN0IHN0cnVjdCByZW9yZGVyX3NvcnRfcmVjICphID0gdmE7Ci0gICAgY29uc3Qgc3RydWN0IHJlb3JkZXJfc29ydF9yZWMgKmIgPSB2YjsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvcmVfYTsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvcmVfYjsKLQotICAgIGNvcmVfYSA9IChjb3JlX2Rpcl9jb25maWcgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhhLT5lbHQsICZjb3JlX21vZHVsZSk7Ci0gICAgY29yZV9iID0gKGNvcmVfZGlyX2NvbmZpZyAqKWFwX2dldF9tb2R1bGVfY29uZmlnKGItPmVsdCwgJmNvcmVfbW9kdWxlKTsKLSAgICBpZiAoSVNfU1BFQ0lBTChjb3JlX2EpKSB7Ci0JaWYgKCFJU19TUEVDSUFMKGNvcmVfYikpIHsKLQkgICAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgICBlbHNlIGlmIChJU19TUEVDSUFMKGNvcmVfYikpIHsKLQlyZXR1cm4gLTE7Ci0gICAgfQotICAgIGVsc2UgewotCS8qIHdlIGtub3cgdGhleSdyZSBib3RoIG5vdCBzcGVjaWFsICovCi0JaWYgKGNvcmVfYS0+ZF9jb21wb25lbnRzIDwgY29yZV9iLT5kX2NvbXBvbmVudHMpIHsKLQkgICAgcmV0dXJuIC0xOwotCX0KLQllbHNlIGlmIChjb3JlX2EtPmRfY29tcG9uZW50cyA+IGNvcmVfYi0+ZF9jb21wb25lbnRzKSB7Ci0JICAgIHJldHVybiAxOwotCX0KLSAgICB9Ci0gICAgLyogRWl0aGVyIHRoZXkncmUgYm90aCBzcGVjaWFsLCBvciB0aGV5J3JlIGJvdGggbm90IHNwZWNpYWwgYW5kIGhhdmUgdGhlCi0gICAgICogc2FtZSBudW1iZXIgb2YgY29tcG9uZW50cy4gIEluIGFueSBldmVudCwgd2Ugbm93IGhhdmUgdG8gY29tcGFyZQotICAgICAqIHRoZSBtaW5vciBrZXkuICovCi0gICAgcmV0dXJuIGEtPm9yaWdfaW5kZXggLSBiLT5vcmlnX2luZGV4OwotfQotCi12b2lkIGFwX2NvcmVfcmVvcmRlcl9kaXJlY3RvcmllcyhhcF9jb250ZXh0X3QgKnAsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgY29yZV9zZXJ2ZXJfY29uZmlnICpzY29uZjsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqc2VjOwotICAgIHN0cnVjdCByZW9yZGVyX3NvcnRfcmVjICpzb3J0YmluOwotICAgIGludCBuZWx0czsKLSAgICB2b2lkICoqZWx0czsKLSAgICBpbnQgaTsKLSAgICBhcF9jb250ZXh0X3QgKnRtcDsKLQotICAgIHNjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywgJmNvcmVfbW9kdWxlKTsKLSAgICBzZWMgPSBzY29uZi0+c2VjOwotICAgIG5lbHRzID0gc2VjLT5uZWx0czsKLSAgICBlbHRzID0gKHZvaWQgKiopc2VjLT5lbHRzOwotCi0gICAgLyogd2UgaGF2ZSB0byBhbGxvY2F0ZSB0bXAgc3BhY2UgdG8gZG8gYSBzdGFibGUgc29ydCAqLwotICAgIGFwX2NyZWF0ZV9jb250ZXh0KCZ0bXAsIHApOwotICAgIHNvcnRiaW4gPSBhcF9wYWxsb2ModG1wLCBzZWMtPm5lbHRzICogc2l6ZW9mKCpzb3J0YmluKSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5lbHRzOyArK2kpIHsKLQlzb3J0YmluW2ldLm9yaWdfaW5kZXggPSBpOwotCXNvcnRiaW5baV0uZWx0ID0gZWx0c1tpXTsKLSAgICB9Ci0KLSAgICBxc29ydChzb3J0YmluLCBuZWx0cywgc2l6ZW9mKCpzb3J0YmluKSwgcmVvcmRlcl9zb3J0ZXIpOwotCi0gICAgLyogYW5kIG5vdyBjb3B5IGJhY2sgdG8gdGhlIG9yaWdpbmFsIGFycmF5ICovCi0gICAgZm9yIChpID0gMDsgaSA8IG5lbHRzOyArK2kpIHsKLSAgICAgIGVsdHNbaV0gPSBzb3J0YmluW2ldLmVsdDsKLSAgICB9Ci0KLSAgICBhcF9kZXN0cm95X3Bvb2wodG1wKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhlcmUgYXJlIHNvbWUgZWxlbWVudHMgb2YgdGhlIGNvcmUgY29uZmlnIHN0cnVjdHVyZXMgaW4gd2hpY2gKLSAqIG90aGVyIG1vZHVsZXMgaGF2ZSBhIGxlZ2l0aW1hdGUgaW50ZXJlc3QgKHRoaXMgaXMgdWdseSwgYnV0IG5lY2Vzc2FyeQotICogdG8gcHJlc2VydmUgTkNTQSBiYWNrLWNvbXBhdGliaWxpdHkpLiAgU28sIHdlIGhhdmUgYSBidW5jaCBvZiBhY2Nlc3NvcnMKLSAqIGhlcmUuLi4KLSAqLwotCi1BUElfRVhQT1JUKGludCkgYXBfYWxsb3dfb3B0aW9ucyhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvbmYgPSAKLSAgICAgIChjb3JlX2Rpcl9jb25maWcgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywgJmNvcmVfbW9kdWxlKTsgCi0KLSAgICByZXR1cm4gY29uZi0+b3B0czsgCi19IAotCi1BUElfRVhQT1JUKGludCkgYXBfYWxsb3dfb3ZlcnJpZGVzKHJlcXVlc3RfcmVjICpyKSAKLXsgCi0gICAgY29yZV9kaXJfY29uZmlnICpjb25mOwotICAgIGNvbmYgPSAoY29yZV9kaXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCQkgICAmY29yZV9tb2R1bGUpOyAKLQotICAgIHJldHVybiBjb25mLT5vdmVycmlkZTsgCi19IAotCi1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfYXV0aF90eXBlKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZjsKLQotICAgIGNvbmYgPSAoY29yZV9kaXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCQkgICAmY29yZV9tb2R1bGUpOyAKLSAgICByZXR1cm4gY29uZi0+YXBfYXV0aF90eXBlOwotfQotCi1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfYXV0aF9uYW1lKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZjsKLQotICAgIGNvbmYgPSAoY29yZV9kaXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCQkgICAmY29yZV9tb2R1bGUpOyAKLSAgICByZXR1cm4gY29uZi0+YXBfYXV0aF9uYW1lOwotfQotCi1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfZGVmYXVsdF90eXBlKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZjsKLQotICAgIGNvbmYgPSAoY29yZV9kaXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCQkgICAmY29yZV9tb2R1bGUpOyAKLSAgICByZXR1cm4gY29uZi0+YXBfZGVmYXVsdF90eXBlIAotICAgICAgICAgICAgICAgPyBjb25mLT5hcF9kZWZhdWx0X3R5cGUgCi0gICAgICAgICAgICAgICA6IERFRkFVTFRfQ09OVEVOVF9UWVBFOwotfQotCi1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfZG9jdW1lbnRfcm9vdChyZXF1ZXN0X3JlYyAqcikgLyogRG9uJ3QgdXNlIHRoaXMhICovCi17Ci0gICAgY29yZV9zZXJ2ZXJfY29uZmlnICpjb25mOwotCi0gICAgY29uZiA9IChjb3JlX3NlcnZlcl9jb25maWcgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsCi0JCQkJCQkgICAgICAmY29yZV9tb2R1bGUpOyAKLSAgICByZXR1cm4gY29uZi0+YXBfZG9jdW1lbnRfcm9vdDsKLX0KLQotQVBJX0VYUE9SVChjb25zdCBhcF9hcnJheV9oZWFkZXJfdCAqKSBhcF9yZXF1aXJlcyhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvbmY7Ci0KLSAgICBjb25mID0gKGNvcmVfZGlyX2NvbmZpZyAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLAotCQkJCQkJICAgJmNvcmVfbW9kdWxlKTsgCi0gICAgcmV0dXJuIGNvbmYtPmFwX3JlcXVpcmVzOwotfQotCi1BUElfRVhQT1JUKGludCkgYXBfc2F0aXNmaWVzKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZjsKLQotICAgIGNvbmYgPSAoY29yZV9kaXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCQkgICAmY29yZV9tb2R1bGUpOwotCi0gICAgcmV0dXJuIGNvbmYtPnNhdGlzZnk7Ci19Ci0KLS8qIFNob3VsZCBwcm9iYWJseSBqdXN0IGdldCByaWQgb2YgdGhpcy4uLiB0aGUgb25seSBjb2RlIHRoYXQgY2FyZXMgaXMKLSAqIHBhcnQgb2YgdGhlIGNvcmUgYW55d2F5IChhbmQgaW4gZmFjdCwgaXQgaXNuJ3QgcHVibGljaXNlZCB0byBvdGhlcgotICogbW9kdWxlcykuCi0gKi8KLQotY2hhciAqYXBfcmVzcG9uc2VfY29kZV9zdHJpbmcocmVxdWVzdF9yZWMgKnIsIGludCBlcnJvcl9pbmRleCkKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvbmY7Ci0KLSAgICBjb25mID0gKGNvcmVfZGlyX2NvbmZpZyAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLAotCQkJCQkJICAgJmNvcmVfbW9kdWxlKTsgCi0KLSAgICBpZiAoY29uZi0+cmVzcG9uc2VfY29kZV9zdHJpbmdzID09IE5VTEwpIHsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbmYtPnJlc3BvbnNlX2NvZGVfc3RyaW5nc1tlcnJvcl9pbmRleF07Ci19Ci0KLQotLyogQ29kZSBmcm9tIEhhcmFsZCBIYW5jaGUtT2xzZW4gPGhhbmNoZUBpbWYudW5pdC5ubz4gKi8KLXN0YXRpYyBhcF9pbmxpbmUgdm9pZCBkb19kb3VibGVfcmV2ZXJzZSAoY29ubl9yZWMgKmNvbm4pCi17Ci0gICAgc3RydWN0IGhvc3RlbnQgKmhwdHI7Ci0KLSAgICBpZiAoY29ubi0+ZG91YmxlX3JldmVyc2UpIHsKLQkvKiBhbHJlYWR5IGRvbmUgKi8KLQlyZXR1cm47Ci0gICAgfQotICAgIGlmIChjb25uLT5yZW1vdGVfaG9zdCA9PSBOVUxMIHx8IGNvbm4tPnJlbW90ZV9ob3N0WzBdID09ICdcMCcpIHsKLQkvKiBzaW5nbGUgcmV2ZXJzZSBmYWlsZWQsIHNvIGRvbid0IGJvdGhlciAqLwotCWNvbm4tPmRvdWJsZV9yZXZlcnNlID0gLTE7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBocHRyID0gZ2V0aG9zdGJ5bmFtZShjb25uLT5yZW1vdGVfaG9zdCk7ICAgCi0gICAgaWYgKGhwdHIpIHsgICAgICAgICAgCi0JY2hhciAqKmhhZGRyOwotCi0JZm9yIChoYWRkciA9IGhwdHItPmhfYWRkcl9saXN0OyAqaGFkZHI7IGhhZGRyKyspIHsKLQkgICAgaWYgKCgoc3RydWN0IGluX2FkZHIgKikoKmhhZGRyKSktPnNfYWRkcgotCQk9PSBjb25uLT5yZW1vdGVfYWRkci5zaW5fYWRkci5zX2FkZHIpIHsKLQkJY29ubi0+ZG91YmxlX3JldmVyc2UgPSAxOwotCQlyZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIGNvbm4tPmRvdWJsZV9yZXZlcnNlID0gLTE7Ci19Ci0KLUFQSV9FWFBPUlQoY29uc3QgY2hhciAqKSBhcF9nZXRfcmVtb3RlX2hvc3QoY29ubl9yZWMgKmNvbm4sIHZvaWQgKmRpcl9jb25maWcsCi0JCQkJCSAgICBpbnQgdHlwZSkKLXsKLSAgICBzdHJ1Y3QgaW5fYWRkciAqaWFkZHI7Ci0gICAgc3RydWN0IGhvc3RlbnQgKmhwdHI7Ci0gICAgaW50IGhvc3RuYW1lX2xvb2t1cHM7Ci0KLSAgICAvKiBJZiB3ZSBoYXZlbid0IGNoZWNrZWQgdGhlIGhvc3QgbmFtZSwgYW5kIHdlIHdhbnQgdG8gKi8KLSAgICBpZiAoZGlyX2NvbmZpZykgewotCWhvc3RuYW1lX2xvb2t1cHMgPQotCSAgICAoKGNvcmVfZGlyX2NvbmZpZyAqKWFwX2dldF9tb2R1bGVfY29uZmlnKGRpcl9jb25maWcsICZjb3JlX21vZHVsZSkpCi0JCS0+aG9zdG5hbWVfbG9va3VwczsKLQlpZiAoaG9zdG5hbWVfbG9va3VwcyA9PSBIT1NUTkFNRV9MT09LVVBfVU5TRVQpIHsKLQkgICAgaG9zdG5hbWVfbG9va3VwcyA9IEhPU1ROQU1FX0xPT0tVUF9PRkY7Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLQkvKiB0aGUgZGVmYXVsdCAqLwotCWhvc3RuYW1lX2xvb2t1cHMgPSBIT1NUTkFNRV9MT09LVVBfT0ZGOwotICAgIH0KLQotICAgIGlmICh0eXBlICE9IFJFTU9URV9OT0xPT0tVUAotCSYmIGNvbm4tPnJlbW90ZV9ob3N0ID09IE5VTEwKLQkmJiAodHlwZSA9PSBSRU1PVEVfRE9VQkxFX1JFVgotCSAgICB8fCBob3N0bmFtZV9sb29rdXBzICE9IEhPU1ROQU1FX0xPT0tVUF9PRkYpKSB7Ci0JaWFkZHIgPSAmKGNvbm4tPnJlbW90ZV9hZGRyLnNpbl9hZGRyKTsKLQlocHRyID0gZ2V0aG9zdGJ5YWRkcigoY2hhciAqKWlhZGRyLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpLCBBRl9JTkVUKTsKLQlpZiAoaHB0ciAhPSBOVUxMKSB7Ci0JICAgIGNvbm4tPnJlbW90ZV9ob3N0ID0gYXBfcHN0cmR1cChjb25uLT5wb29sLCAodm9pZCAqKWhwdHItPmhfbmFtZSk7Ci0JICAgIGFwX3N0cl90b2xvd2VyKGNvbm4tPnJlbW90ZV9ob3N0KTsKLQkgICAKLQkgICAgaWYgKGhvc3RuYW1lX2xvb2t1cHMgPT0gSE9TVE5BTUVfTE9PS1VQX0RPVUJMRSkgewotCQlkb19kb3VibGVfcmV2ZXJzZShjb25uKTsKLQkJaWYgKGNvbm4tPmRvdWJsZV9yZXZlcnNlICE9IDEpIHsKLQkJICAgIGNvbm4tPnJlbW90ZV9ob3N0ID0gTlVMTDsKLQkJfQotCSAgICB9Ci0JfQotCS8qIGlmIGZhaWxlZCwgc2V0IGl0IHRvIHRoZSBOVUxMIHN0cmluZyB0byBpbmRpY2F0ZSBlcnJvciAqLwotCWlmIChjb25uLT5yZW1vdGVfaG9zdCA9PSBOVUxMKSB7Ci0JICAgIGNvbm4tPnJlbW90ZV9ob3N0ID0gIiI7Ci0JfQotICAgIH0KLSAgICBpZiAodHlwZSA9PSBSRU1PVEVfRE9VQkxFX1JFVikgewotCWRvX2RvdWJsZV9yZXZlcnNlKGNvbm4pOwotCWlmIChjb25uLT5kb3VibGVfcmV2ZXJzZSA9PSAtMSkgewotCSAgICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotCi0vKgotICogUmV0dXJuIHRoZSBkZXNpcmVkIGluZm9ybWF0aW9uOyBlaXRoZXIgdGhlIHJlbW90ZSBETlMgbmFtZSwgaWYgZm91bmQsCi0gKiBvciBlaXRoZXIgTlVMTCAoaWYgdGhlIGhvc3RuYW1lIHdhcyByZXF1ZXN0ZWQpIG9yIHRoZSBJUCBhZGRyZXNzCi0gKiAoaWYgYW55IGlkZW50aWZpZXIgd2FzIHJlcXVlc3RlZCkuCi0gKi8KLSAgICBpZiAoY29ubi0+cmVtb3RlX2hvc3QgIT0gTlVMTCAmJiBjb25uLT5yZW1vdGVfaG9zdFswXSAhPSAnXDAnKSB7Ci0JcmV0dXJuIGNvbm4tPnJlbW90ZV9ob3N0OwotICAgIH0KLSAgICBlbHNlIHsKLQlpZiAodHlwZSA9PSBSRU1PVEVfSE9TVCB8fCB0eXBlID09IFJFTU9URV9ET1VCTEVfUkVWKSB7Ci0JICAgIHJldHVybiBOVUxMOwotCX0KLQllbHNlIHsKLQkgICAgcmV0dXJuIGNvbm4tPnJlbW90ZV9pcDsKLQl9Ci0gICAgfQotfQotCi1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfZ2V0X3JlbW90ZV9sb2duYW1lKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvcmVfZGlyX2NvbmZpZyAqZGlyX2NvbmY7Ci0KLSAgICBpZiAoci0+Y29ubmVjdGlvbi0+cmVtb3RlX2xvZ25hbWUgIT0gTlVMTCkgewotCXJldHVybiByLT5jb25uZWN0aW9uLT5yZW1vdGVfbG9nbmFtZTsKLSAgICB9Ci0KLS8qIElmIHdlIGhhdmVuJ3QgY2hlY2tlZCB0aGUgaWRlbnRpdHksIGFuZCB3ZSB3YW50IHRvICovCi0gICAgZGlyX2NvbmYgPSAoY29yZV9kaXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCQkgICAgICAgJmNvcmVfbW9kdWxlKTsKLQotICAgIGlmIChkaXJfY29uZi0+ZG9fcmZjMTQxMyAmIDEpIHsKLQlyZXR1cm4gYXBfcmZjMTQxMyhyLT5jb25uZWN0aW9uLCByLT5zZXJ2ZXIpOwotICAgIH0KLSAgICBlbHNlIHsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLS8qIFRoZXJlIGFyZSB0d28gb3B0aW9ucyByZWdhcmRpbmcgd2hhdCB0aGUgIm5hbWUiIG9mIGEgc2VydmVyIGlzLiAgVGhlCi0gKiAiY2Fub25pY2FsIiBuYW1lIGFzIGRlZmluZWQgYnkgU2VydmVyTmFtZSBhbmQgUG9ydCwgb3IgdGhlICJjbGllbnQncwotICogbmFtZSIgYXMgc3VwcGxpZWQgYnkgYSBwb3NzaWJsZSBIb3N0OiBoZWFkZXIgb3IgZnVsbCBVUkkuICBXZSBuZXZlcgotICogdHJ1c3QgdGhlIHBvcnQgcGFzc2VkIGluIHRoZSBjbGllbnQncyBoZWFkZXJzLCB3ZSBhbHdheXMgdXNlIHRoZQotICogcG9ydCBvZiB0aGUgYWN0dWFsIHNvY2tldC4KLSAqCi0gKiBUaGUgRE5TIG9wdGlvbiB0byBVc2VDYW5vbmljYWxOYW1lIGNhdXNlcyB0aGlzIHJvdXRpbmUgdG8gZG8gYQotICogcmV2ZXJzZSBsb29rdXAgb24gdGhlIGxvY2FsIElQIGFkZHJlc3Mgb2YgdGhlIGNvbm5lY3Rpb25hIGFuZCB1c2UKLSAqIHRoYXQgZm9yIHRoZSBTZXJ2ZXJOYW1lLiBUaGlzIG1ha2VzIGl0cyB2YWx1ZSBtb3JlIHJlbGlhYmxlIHdoaWxlCi0gKiBhdCB0aGUgc2FtZSB0aW1lIGFsbG93aW5nIERlbW9uJ3MgbWFnaWMgdmlydHVhbCBob3N0aW5nIHRvIHdvcmsuCi0gKiBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IEROUyBsb29rdXBzIGFyZSBzdWZmaWNpZW50bHkgcXVpY2suLi4KLSAqIC0tIGZhbmYgMTk5OC0xMC0wMwotICovCi1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfZ2V0X3NlcnZlcl9uYW1lKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvbm5fcmVjICpjb25uID0gci0+Y29ubmVjdGlvbjsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmQ7Ci0KLSAgICBkID0gKGNvcmVfZGlyX2NvbmZpZyAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLAotCQkJCQkJJmNvcmVfbW9kdWxlKTsKLQotICAgIGlmIChkLT51c2VfY2Fub25pY2FsX25hbWUgPT0gVVNFX0NBTk9OSUNBTF9OQU1FX09GRikgewotICAgICAgICByZXR1cm4gci0+aG9zdG5hbWUgPyByLT5ob3N0bmFtZSA6IHItPnNlcnZlci0+c2VydmVyX2hvc3RuYW1lOwotICAgIH0KLSAgICBpZiAoZC0+dXNlX2Nhbm9uaWNhbF9uYW1lID09IFVTRV9DQU5PTklDQUxfTkFNRV9ETlMpIHsKLSAgICAgICAgaWYgKGNvbm4tPmxvY2FsX2hvc3QgPT0gTlVMTCkgewotCSAgICBzdHJ1Y3QgaW5fYWRkciAqaWFkZHI7Ci0JICAgIHN0cnVjdCBob3N0ZW50ICpocHRyOwotCSAgICBpYWRkciA9ICYoY29ubi0+bG9jYWxfYWRkci5zaW5fYWRkcik7Ci0JICAgIGhwdHIgPSBnZXRob3N0YnlhZGRyKChjaGFyICopaWFkZHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkciksCi0JCQkJIEFGX0lORVQpOwotCSAgICBpZiAoaHB0ciAhPSBOVUxMKSB7Ci0JICAgICAgICBjb25uLT5sb2NhbF9ob3N0ID0gYXBfcHN0cmR1cChjb25uLT5wb29sLAotCQkJCQkgICAgICAodm9pZCAqKWhwdHItPmhfbmFtZSk7Ci0JCWFwX3N0cl90b2xvd2VyKGNvbm4tPmxvY2FsX2hvc3QpOwotCSAgICB9Ci0JICAgIGVsc2UgewotCSAgICAgICAgY29ubi0+bG9jYWxfaG9zdCA9IGFwX3BzdHJkdXAoY29ubi0+cG9vbCwKLQkJCQkJICAgICAgci0+c2VydmVyLT5zZXJ2ZXJfaG9zdG5hbWUpOwotCSAgICB9Ci0JfQotCXJldHVybiBjb25uLT5sb2NhbF9ob3N0OwotICAgIH0KLSAgICAvKiBkZWZhdWx0ICovCi0gICAgcmV0dXJuIHItPnNlcnZlci0+c2VydmVyX2hvc3RuYW1lOwotfQotCi1BUElfRVhQT1JUKHVuc2lnbmVkKSBhcF9nZXRfc2VydmVyX3BvcnQoY29uc3QgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgdW5zaWduZWQgcG9ydDsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmQgPQotICAgICAgKGNvcmVfZGlyX2NvbmZpZyAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAmY29yZV9tb2R1bGUpOwotICAgIAotICAgIHBvcnQgPSByLT5zZXJ2ZXItPnBvcnQgPyByLT5zZXJ2ZXItPnBvcnQgOiBhcF9kZWZhdWx0X3BvcnQocik7Ci0KLSAgICBpZiAoZC0+dXNlX2Nhbm9uaWNhbF9uYW1lID09IFVTRV9DQU5PTklDQUxfTkFNRV9PRkYKLQl8fCBkLT51c2VfY2Fub25pY2FsX25hbWUgPT0gVVNFX0NBTk9OSUNBTF9OQU1FX0ROUykgewotICAgICAgICByZXR1cm4gci0+aG9zdG5hbWUgPyBudG9ocyhyLT5jb25uZWN0aW9uLT5sb2NhbF9hZGRyLnNpbl9wb3J0KQotCQkJICAgOiBwb3J0OwotICAgIH0KLSAgICAvKiBkZWZhdWx0ICovCi0gICAgcmV0dXJuIHBvcnQ7Ci19Ci0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9jb25zdHJ1Y3RfdXJsKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqdXJpLAotCQkJCSAgICByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICB1bnNpZ25lZCBwb3J0ID0gYXBfZ2V0X3NlcnZlcl9wb3J0KHIpOwotICAgIGNvbnN0IGNoYXIgKmhvc3QgPSBhcF9nZXRfc2VydmVyX25hbWUocik7Ci0KLSAgICBpZiAoYXBfaXNfZGVmYXVsdF9wb3J0KHBvcnQsIHIpKSB7Ci0JcmV0dXJuIGFwX3BzdHJjYXQocCwgYXBfaHR0cF9tZXRob2QociksICI6Ly8iLCBob3N0LCB1cmksIE5VTEwpOwotICAgIH0KLSAgICByZXR1cm4gYXBfcHNwcmludGYocCwgIiVzOi8vJXM6JXUlcyIsIGFwX2h0dHBfbWV0aG9kKHIpLCBob3N0LCBwb3J0LCB1cmkpOwotfQotCi1BUElfRVhQT1JUKHVuc2lnbmVkIGxvbmcpIGFwX2dldF9saW1pdF9yZXFfYm9keShjb25zdCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmQgPQotICAgICAgKGNvcmVfZGlyX2NvbmZpZyAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAmY29yZV9tb2R1bGUpOwotICAgIAotICAgIHJldHVybiBkLT5saW1pdF9yZXFfYm9keTsKLX0KLQotI2lmZGVmIFdJTjMyCi1zdGF0aWMgY2hhciogZ2V0X2ludGVycHJldGVyX2Zyb21fd2luMzJfcmVnaXN0cnkoYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyKiBleHQpIAotewotICAgIGNoYXIgZXh0ZW5zaW9uX3BhdGhbXSA9ICJTT0ZUV0FSRVxcQ2xhc3Nlc1xcIjsKLSAgICBjaGFyIGV4ZWN1dGFibGVfcGF0aFtdID0gIlxcU0hFTExcXE9QRU5cXENPTU1BTkQiOwotCi0gICAgSEtFWSBoa2V5T3BlbjsKLSAgICBEV09SRCB0eXBlOwotICAgIGludCBzaXplOwotICAgIGludCByZXN1bHQ7Ci0gICAgY2hhciAqa2V5TmFtZTsKLSAgICBjaGFyICpidWZmZXI7Ci0gICAgY2hhciAqczsKLQotICAgIGlmICghZXh0KQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAvKiAKLSAgICAgKiBGdXR1cmUgb3B0aW1pemF0aW9uOgotICAgICAqIFdoZW4gdGhlIHJlZ2lzdHJ5IGlzIHN1Y2Nlc3NmdWxseSBzZWFyY2hlZCwgc3RvcmUgdGhlIGludGVycHJldGVyCi0gICAgICogc3RyaW5nIGluIGEgYXBfdGFibGVfdCB0byBtYWtlIHN1YnNlcXVlbnQgbG9vay11cHMgZmFzdGVyCi0gICAgICovCi0KLSAgICAvKiBPcGVuIHRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBzY3JpcHQgZXh0ZW5zaW9uICovCi0gICAga2V5TmFtZSA9IGFwX3BzdHJjYXQocCwgZXh0ZW5zaW9uX3BhdGgsIGV4dCwgTlVMTCk7Ci0KLSAgICByZXN1bHQgPSBSZWdPcGVuS2V5RXgoSEtFWV9MT0NBTF9NQUNISU5FLCBrZXlOYW1lLCAwLCBLRVlfUVVFUllfVkFMVUUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAmaGtleU9wZW4pOwotCi0gICAgaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKSAKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBSZWFkIHRvIE5VTEwgYnVmZmVyIHRvIGZpbmQgdmFsdWUgc2l6ZSAqLwotICAgIHNpemUgPSAwOwotICAgIHJlc3VsdCA9IFJlZ1F1ZXJ5VmFsdWVFeChoa2V5T3BlbiwgIiIsIE5VTEwsICZ0eXBlLCBOVUxMLCAmc2l6ZSk7Ci0KLSAgICBpZiAocmVzdWx0ID09IEVSUk9SX1NVQ0NFU1MpIHsKLSAgICAgICAgYnVmZmVyID0gYXBfcGFsbG9jKHAsIHNpemUpOwotICAgICAgICByZXN1bHQgPSBSZWdRdWVyeVZhbHVlRXgoaGtleU9wZW4sICIiLCBOVUxMLCAmdHlwZSwgYnVmZmVyLCAmc2l6ZSk7Ci0gICAgfQotCi0gICAgUmVnQ2xvc2VLZXkoaGtleU9wZW4pOwotCi0gICAgaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIC8qIE9wZW4gdGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIGludGVycHJldGVyIHBhdGggKi8KLSAgICBrZXlOYW1lID0gYXBfcHN0cmNhdChwLCBleHRlbnNpb25fcGF0aCwgYnVmZmVyLCBleGVjdXRhYmxlX3BhdGgsIE5VTEwpOwotCi0gICAgcmVzdWx0ID0gUmVnT3BlbktleUV4KEhLRVlfTE9DQUxfTUFDSElORSwga2V5TmFtZSwgMCwgS0VZX1FVRVJZX1ZBTFVFLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmhrZXlPcGVuKTsKLQotICAgIGlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBSZWFkIHRvIE5VTEwgYnVmZmVyIHRvIGZpbmQgdmFsdWUgc2l6ZSAqLwotICAgIHNpemUgPSAwOwotICAgIHJlc3VsdCA9IFJlZ1F1ZXJ5VmFsdWVFeChoa2V5T3BlbiwgIiIsIDAsICZ0eXBlLCBOVUxMLCAmc2l6ZSk7Ci0KLSAgICBpZiAocmVzdWx0ID09IEVSUk9SX1NVQ0NFU1MpIHsKLSAgICAgICAgYnVmZmVyID0gYXBfcGFsbG9jKHAsIHNpemUpOwotICAgICAgICByZXN1bHQgPSBSZWdRdWVyeVZhbHVlRXgoaGtleU9wZW4sICIiLCAwLCAmdHlwZSwgYnVmZmVyLCAmc2l6ZSk7Ci0gICAgfQotCi0gICAgUmVnQ2xvc2VLZXkoaGtleU9wZW4pOwotCi0gICAgaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIC8qCi0gICAgICogVGhlIGNhbm9uaWNhbCB3YXkgc2hlbGwgY29tbWFuZCBlbnRyaWVzIGFyZSBlbnRlcmVkIGluIHRoZSBXaW4zMiAKLSAgICAgKiByZWdpc3RyeSBpcyBhcyBmb2xsb3dzOgotICAgICAqICAgc2hlbGwgW29wdGlvbnNdICIlMSIKLSAgICAgKiB3aGVyZQotICAgICAqICAgc2hlbGwgLSBmdWxsIHBhdGggbmFtZSB0byBpbnRlcnByZXRlciBvciBzaGVsbCB0byBydW4uCi0gICAgICogICAgICAgICAgIEUuZy4sIGM6XHVzclxsb2NhbFxudHJlc2tpdFxwZXJsXGJpblxwZXJsLmV4ZQotICAgICAqICAgb3B0aW9ucyAtIG9wdGlvbmFsIHN3aXRjaGVzCi0gICAgICogICAgICAgICAgICAgIEUuZy4sIFxDCi0gICAgICogICAiJTEiIC0gUGxhY2UgaG9sZGVyIGZvciBmaWxlIHRvIHJ1biB0aGUgc2hlbGwgYWdhaW5zdC4gCi0gICAgICogICAgICAgICAgVHlwaWNhbGx5IHF1b3RlZC4KLSAgICAgKgotICAgICAqIElmIHdlIGZpbmQgYSAlMSBvciBhIHF1b3RlZCAlMSwgbG9wIGl0IG9mZi4gCi0gICAgICovCi0gICAgaWYgKGJ1ZmZlciAmJiAqYnVmZmVyKSB7Ci0gICAgICAgIGlmICgocyA9IHN0cnN0cihidWZmZXIsICJcIiUxIikpKQotICAgICAgICAgICAgKnMgPSAnXDAnOwotICAgICAgICBlbHNlIGlmICgocyA9IHN0cnN0cihidWZmZXIsICIlMSIpKSkgCi0gICAgICAgICAgICAqcyA9ICdcMCc7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotQVBJX0VYUE9SVCAoZmlsZV90eXBlX2UpIGFwX2dldF93aW4zMl9pbnRlcnByZXRlcihjb25zdCAgcmVxdWVzdF9yZWMgKnIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiogaW50ZXJwcmV0ZXIgKQotewotICAgIEhBTkRMRSBoRmlsZTsKLSAgICBEV09SRCBuQnl0ZXNSZWFkOwotICAgIEJPT0xFQU4gYlJlc3VsdDsKLSAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmQ7Ci0gICAgaW50IGk7Ci0gICAgZmlsZV90eXBlX2UgZmlsZVR5cGUgPSBlRmlsZVR5cGVVTktOT1dOOwotICAgIGNoYXIgKmV4dCA9IE5VTEw7Ci0gICAgY2hhciAqZXhlbmFtZSA9IE5VTEw7Ci0KLSAgICBkID0gKGNvcmVfZGlyX2NvbmZpZyAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3JlX21vZHVsZSk7Ci0KLSAgICAvKiBGaW5kIHRoZSBmaWxlIGV4dGVuc2lvbiAqLwotICAgIGV4ZW5hbWUgPSBzdHJyY2hyKHItPmZpbGVuYW1lLCAnLycpOwotICAgIGlmICghZXhlbmFtZSkgewotICAgICAgICBleGVuYW1lID0gc3RycmNocihyLT5maWxlbmFtZSwgJ1xcJyk7Ci0gICAgfQotICAgIGlmICghZXhlbmFtZSkgewotICAgICAgICBleGVuYW1lID0gci0+ZmlsZW5hbWU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBleGVuYW1lKys7Ci0gICAgfQotICAgIGV4dCA9IHN0cnJjaHIoZXhlbmFtZSwgJy4nKTsKLQotICAgIGlmIChleHQgJiYgKCFzdHJjYXNlY21wKGV4dCwiLmJhdCIpIHx8ICFzdHJjYXNlY21wKGV4dCwiLmNtZCIpKSkgewotICAgICAgICByZXR1cm4gZUZpbGVUeXBlRVhFMzI7Ci0gICAgfQotCi0gICAgLyogSWYgdGhlIGZpbGUgaGFzIGFuIGV4dGVuc2lvbiBhbmQgaXQgaXMgbm90IC5jb20gYW5kIG5vdCAuZXhlIGFuZAotICAgICAqIHdlJ3ZlIGJlZW4gaW5zdHJ1Y3RlZCB0byBzZWFyY2ggdGhlIHJlZ2lzdHJ5LCB0aGVuIGRvIGl0IQotICAgICAqLwotICAgIGlmIChleHQgJiYgc3RyY2FzZWNtcChleHQsIi5leGUiKSAmJiBzdHJjYXNlY21wKGV4dCwiLmNvbSIpICYmCi0gICAgICAgIGQtPnNjcmlwdF9pbnRlcnByZXRlcl9zb3VyY2UgPT0gSU5URVJQUkVURVJfU09VUkNFX1JFR0lTVFJZKSB7Ci0gICAgICAgICAvKiBDaGVjayB0aGUgcmVnaXN0cnkgKi8KLSAgICAgICAgKmludGVycHJldGVyID0gZ2V0X2ludGVycHJldGVyX2Zyb21fd2luMzJfcmVnaXN0cnkoci0+cG9vbCwgZXh0KTsKLSAgICAgICAgaWYgKCppbnRlcnByZXRlcikKLSAgICAgICAgICAgIHJldHVybiBlRmlsZVR5cGVTQ1JJUFQ7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgMCwgci0+c2VydmVyLAotICAgICAgICAgICAgICJTY3JpcHRJbnRlcnByZXRlclNvdXJjZSBjb25maWcgZGlyZWN0aXZlIHNldCB0byBcInJlZ2lzdHJ5XCIuXG5cdCIKLSAgICAgICAgICAgICAiUmVnaXN0cnkgd2FzIHNlYXJjaGVkIGJ1dCBpbnRlcnByZXRlciBub3QgZm91bmQuIFRyeWluZyB0aGUgc2hlYmFuZyBsaW5lLiIpOwotICAgICAgICB9Ci0gICAgfSAgICAgICAgCi0KLSAgICAvKiBOZWVkIHRvIHBlZWsgaW50byB0aGUgZmlsZSBmaWd1cmUgb3V0IHdoYXQgaXQgcmVhbGx5IGlzLi4uICovCi0gICAgaEZpbGUgPSBDcmVhdGVGaWxlKHItPmZpbGVuYW1lLCBHRU5FUklDX1JFQUQsIEZJTEVfU0hBUkVfUkVBRCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgT1BFTl9FWElTVElORywgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsKLSAgICBpZiAoaEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLSAgICAgICAgcmV0dXJuIGVGaWxlVHlwZVVOS05PV047Ci0gICAgfQotICAgIGJSZXN1bHQgPSBSZWFkRmlsZShoRmlsZSwgKHZvaWQqKSAmYnVmZmVyLCBzaXplb2YoYnVmZmVyKSAtIDEsIAotICAgICAgICAgICAgICAgICAgICAgICAmbkJ5dGVzUmVhZCwgTlVMTCk7Ci0gICAgaWYgKCFiUmVzdWx0IHx8IChuQnl0ZXNSZWFkID09IDApKSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBHZXRMYXN0RXJyb3IoKSwgciwKLSAgICAgICAgICAgICAgICAgICAgICAiUmVhZEZpbGUoJXMpIGZhaWxlZCIsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgQ2xvc2VIYW5kbGUoaEZpbGUpOwotICAgICAgICByZXR1cm4gZUZpbGVUeXBlVU5LTk9XTjsKLSAgICB9Ci0gICAgQ2xvc2VIYW5kbGUoaEZpbGUpOwotICAgIGJ1ZmZlcltuQnl0ZXNSZWFkXSA9ICdcMCc7Ci0KLSAgICAvKiBTY3JpcHQgb3IgZXhlY3V0YWJsZSwgdGhhdCBpcyB0aGUgcXVlc3Rpb24uLi4gKi8KLSAgICBpZiAoKGJ1ZmZlclswXSA9PSAnIycpICYmIChidWZmZXJbMV0gPT0gJyEnKSkgewotICAgICAgICAvKiBBc3N1bWluZyBmaWxlIGlzIGEgc2NyaXB0IHNpbmNlIGl0IHN0YXJ0cyB3aXRoIGEgc2hlYmFuZyAqLwotICAgICAgICBmaWxlVHlwZSA9IGVGaWxlVHlwZVNDUklQVDsKLSAgICAgICAgZm9yIChpID0gMjsgaSA8IHNpemVvZihidWZmZXIpOyBpKyspIHsKLSAgICAgICAgICAgIGlmICgoYnVmZmVyW2ldID09ICdccicpCi0gICAgICAgICAgICAgICAgfHwgKGJ1ZmZlcltpXSA9PSAnXG4nKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJ1ZmZlcltpXSA9ICdcMCc7Ci0gICAgICAgIGZvciAoaSA9IDI7IGJ1ZmZlcltpXSA9PSAnICcgOyArK2kpCi0gICAgICAgICAgICA7Ci0gICAgICAgICppbnRlcnByZXRlciA9IGFwX3BzdHJkdXAoci0+cG9vbCwgYnVmZmVyICsgaSApOyAKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIE5vdCBhIHNjcmlwdCwgaXMgaXQgYW4gZXhlY3V0YWJsZT8gKi8KLSAgICAgICAgSU1BR0VfRE9TX0hFQURFUiAqaGRyID0gKElNQUdFX0RPU19IRUFERVIqKWJ1ZmZlcjsgICAgCi0gICAgICAgIGlmICgobkJ5dGVzUmVhZCA+PSBzaXplb2YoSU1BR0VfRE9TX0hFQURFUikpICYmIChoZHItPmVfbWFnaWMgPT0gSU1BR0VfRE9TX1NJR05BVFVSRSkpIHsKLSAgICAgICAgICAgIGlmIChoZHItPmVfbGZhcmxjIDwgMHg0MCkKLSAgICAgICAgICAgICAgICBmaWxlVHlwZSA9IGVGaWxlVHlwZUVYRTE2OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGZpbGVUeXBlID0gZUZpbGVUeXBlRVhFMzI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZmlsZVR5cGUgPSBlRmlsZVR5cGVVTktOT1dOOwotICAgIH0KLQotICAgIHJldHVybiBmaWxlVHlwZTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb21tYW5kcy4uLiB0aGlzIG1vZHVsZSBoYW5kbGVzIGFsbW9zdCBhbGwgb2YgdGhlIE5DU0EgaHR0cGQuY29uZgotICogY29tbWFuZHMsIGJ1dCBtb3N0IG9mIHRoZSBvbGQgc3JtLmNvbmYgaXMgaW4gdGhlIHRoZSBtb2R1bGVzLgotICovCi0KLXN0YXRpYyBjb25zdCBjaGFyIGVuZF9kaXJlY3Rvcnlfc2VjdGlvbltdID0gIjwvRGlyZWN0b3J5PiI7Ci1zdGF0aWMgY29uc3QgY2hhciBlbmRfZGlyZWN0b3J5bWF0Y2hfc2VjdGlvbltdID0gIjwvRGlyZWN0b3J5TWF0Y2g+IjsKLXN0YXRpYyBjb25zdCBjaGFyIGVuZF9sb2NhdGlvbl9zZWN0aW9uW10gPSAiPC9Mb2NhdGlvbj4iOwotc3RhdGljIGNvbnN0IGNoYXIgZW5kX2xvY2F0aW9ubWF0Y2hfc2VjdGlvbltdID0gIjwvTG9jYXRpb25NYXRjaD4iOwotc3RhdGljIGNvbnN0IGNoYXIgZW5kX2ZpbGVzX3NlY3Rpb25bXSA9ICI8L0ZpbGVzPiI7Ci1zdGF0aWMgY29uc3QgY2hhciBlbmRfZmlsZXNtYXRjaF9zZWN0aW9uW10gPSAiPC9GaWxlc01hdGNoPiI7Ci1zdGF0aWMgY29uc3QgY2hhciBlbmRfdmlydHVhbGhvc3Rfc2VjdGlvbltdID0gIjwvVmlydHVhbEhvc3Q+IjsKLXN0YXRpYyBjb25zdCBjaGFyIGVuZF9pZm1vZHVsZV9zZWN0aW9uW10gPSAiPC9JZk1vZHVsZT4iOwotc3RhdGljIGNvbnN0IGNoYXIgZW5kX2lmZGVmaW5lX3NlY3Rpb25bXSA9ICI8L0lmRGVmaW5lPiI7Ci0KLQotQVBJX0VYUE9SVChjb25zdCBjaGFyICopIGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZF9wYXJtcyAqY21kLAotCQkJCQkgICAgICB1bnNpZ25lZCBmb3JiaWRkZW4pCi17Ci0gICAgY29uc3QgY2hhciAqZ3QgPSAoY21kLT5jbWQtPm5hbWVbMF0gPT0gJzwnCi0JCSAgICAgICYmIGNtZC0+Y21kLT5uYW1lW3N0cmxlbihjbWQtPmNtZC0+bmFtZSktMV0gIT0gJz4nKQotICAgICAgICAgICAgICAgICAgICAgICAgID8gIj4iIDogIiI7Ci0KLSAgICBpZiAoKGZvcmJpZGRlbiAmIE5PVF9JTl9WSVJUVUFMSE9TVCkgJiYgY21kLT5zZXJ2ZXItPmlzX3ZpcnR1YWwpIHsKLQlyZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsIGNtZC0+Y21kLT5uYW1lLCBndCwKLQkJCSAgIiBjYW5ub3Qgb2NjdXIgd2l0aGluIDxWaXJ0dWFsSG9zdD4gc2VjdGlvbiIsIE5VTEwpOwotICAgIH0KLQotICAgIGlmICgoZm9yYmlkZGVuICYgTk9UX0lOX0xJTUlUKSAmJiBjbWQtPmxpbWl0ZWQgIT0gLTEpIHsKLQlyZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsIGNtZC0+Y21kLT5uYW1lLCBndCwKLQkJCSAgIiBjYW5ub3Qgb2NjdXIgd2l0aGluIDxMaW1pdD4gc2VjdGlvbiIsIE5VTEwpOwotICAgIH0KLQotICAgIGlmICgoZm9yYmlkZGVuICYgTk9UX0lOX0RJUl9MT0NfRklMRSkgPT0gTk9UX0lOX0RJUl9MT0NfRklMRQotCSYmIGNtZC0+cGF0aCAhPSBOVUxMKSB7Ci0JcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCBjbWQtPmNtZC0+bmFtZSwgZ3QsCi0JCQkgICIgY2Fubm90IG9jY3VyIHdpdGhpbiA8RGlyZWN0b3J5L0xvY2F0aW9uL0ZpbGVzPiAiCi0JCQkgICJzZWN0aW9uIiwgTlVMTCk7Ci0gICAgfQotICAgIAotICAgIGlmICgoKGZvcmJpZGRlbiAmIE5PVF9JTl9ESVJFQ1RPUlkpCi0JICYmIChjbWQtPmVuZF90b2tlbiA9PSBlbmRfZGlyZWN0b3J5X3NlY3Rpb24KLQkgICAgIHx8IGNtZC0+ZW5kX3Rva2VuID09IGVuZF9kaXJlY3RvcnltYXRjaF9zZWN0aW9uKSkgCi0JfHwgKChmb3JiaWRkZW4gJiBOT1RfSU5fTE9DQVRJT04pCi0JICAgICYmIChjbWQtPmVuZF90b2tlbiA9PSBlbmRfbG9jYXRpb25fc2VjdGlvbgotCQl8fCBjbWQtPmVuZF90b2tlbiA9PSBlbmRfbG9jYXRpb25tYXRjaF9zZWN0aW9uKSkgCi0JfHwgKChmb3JiaWRkZW4gJiBOT1RfSU5fRklMRVMpCi0JICAgICYmIChjbWQtPmVuZF90b2tlbiA9PSBlbmRfZmlsZXNfc2VjdGlvbgotCQl8fCBjbWQtPmVuZF90b2tlbiA9PSBlbmRfZmlsZXNtYXRjaF9zZWN0aW9uKSkpIHsKLQlyZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsIGNtZC0+Y21kLT5uYW1lLCBndCwKLQkJCSAgIiBjYW5ub3Qgb2NjdXIgd2l0aGluIDwiLCBjbWQtPmVuZF90b2tlbisyLAotCQkJICAiIHNlY3Rpb24iLCBOVUxMKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9hY2Nlc3NfbmFtZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICB2b2lkICpzY29uZiA9IGNtZC0+c2VydmVyLT5tb2R1bGVfY29uZmlnOwotICAgIGNvcmVfc2VydmVyX2NvbmZpZyAqY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHNjb25mLCAmY29yZV9tb2R1bGUpOwotCi0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLAotCQkJCQkgICBOT1RfSU5fRElSX0xPQ19GSUxFfE5PVF9JTl9MSU1JVCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgY29uZi0+YWNjZXNzX25hbWUgPSBhcF9wc3RyZHVwKGNtZC0+cG9vbCwgYXJnKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotI2lmZGVmIEdQUk9GCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2dwcm9mX2RpcihjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICB2b2lkICpzY29uZiA9IGNtZC0+c2VydmVyLT5tb2R1bGVfY29uZmlnOwotICAgIGNvcmVfc2VydmVyX2NvbmZpZyAqY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHNjb25mLCAmY29yZV9tb2R1bGUpOwotCi0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLAotCQkJCQkgICBOT1RfSU5fRElSX0xPQ19GSUxFfE5PVF9JTl9MSU1JVCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgY29uZi0+Z3Byb2ZfZGlyID0gYXBfcHN0cmR1cChjbWQtPnBvb2wsIGFyZyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0jZW5kaWYgLypHUFJPRiovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfZG9jdW1lbnRfcm9vdChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICB2b2lkICpzY29uZiA9IGNtZC0+c2VydmVyLT5tb2R1bGVfY29uZmlnOwotICAgIGNvcmVfc2VydmVyX2NvbmZpZyAqY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHNjb25mLCAmY29yZV9tb2R1bGUpOwotICAKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsCi0JCQkJCSAgIE5PVF9JTl9ESVJfTE9DX0ZJTEV8Tk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcmcgPSBhcF9vc19jYW5vbmljYWxfZmlsZW5hbWUoY21kLT5wb29sLCBhcmcpOwotICAgIGlmICgvKiBUT0RPOiBhcF9jb25maWd0ZXN0b25seSAmJiBhcF9kb2Nyb290Y2hlY2sgJiYgKi8gIWFwX2lzX2RpcmVjdG9yeShhcmcpKSB7Ci0JaWYgKGNtZC0+c2VydmVyLT5pc192aXJ0dWFsKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiV2FybmluZzogRG9jdW1lbnRSb290IFslc10gZG9lcyBub3QgZXhpc3QiLAotCQkgICAgICAgICBhcmcpOwotCX0KLQllbHNlIHsKLQkgICAgcmV0dXJuICJEb2N1bWVudFJvb3QgbXVzdCBiZSBhIGRpcmVjdG9yeSI7Ci0JfQotICAgIH0KLSAgICAKLSAgICBjb25mLT5hcF9kb2N1bWVudF9yb290ID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX2N1c3RvbV9yZXNwb25zZShyZXF1ZXN0X3JlYyAqciwgaW50IHN0YXR1cywgY2hhciAqc3RyaW5nKQotewotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZiA9IAotCWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAmY29yZV9tb2R1bGUpOwotICAgIGludCBpZHg7Ci0KLSAgICBpZihjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MgPT0gTlVMTCkgewotICAgICAgICBjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MgPSAKLQkgICAgYXBfcGNhbGxvYyhyLT5wb29sLAotCQkgICAgc2l6ZW9mKCpjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MpICogCi0JCSAgICBSRVNQT05TRV9DT0RFUyk7Ci0gICAgfQotCi0gICAgaWR4ID0gYXBfaW5kZXhfb2ZfcmVzcG9uc2Uoc3RhdHVzKTsKLQotICAgIGNvbmYtPnJlc3BvbnNlX2NvZGVfc3RyaW5nc1tpZHhdID0gCi0gICAgICAgKChhcF9pc191cmwoc3RyaW5nKSB8fCAoKnN0cmluZyA9PSAnLycpKSAmJiAoKnN0cmluZyAhPSAnIicpKSA/IAotICAgICAgIGFwX3BzdHJkdXAoci0+cG9vbCwgc3RyaW5nKSA6IGFwX3BzdHJjYXQoci0+cG9vbCwgIlwiIiwgc3RyaW5nLCBOVUxMKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9lcnJvcl9kb2N1bWVudChjbWRfcGFybXMgKmNtZCwgY29yZV9kaXJfY29uZmlnICpjb25mLAotCQkJCSAgICAgIGNoYXIgKmxpbmUpCi17Ci0gICAgaW50IGVycm9yX251bWJlciwgaW5kZXhfbnVtYmVyLCBpZHg1MDA7Ci0gICAgY2hhciAqdzsKLSAgICAgICAgICAgICAgICAKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIE5PVF9JTl9MSU1JVCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLyogMXN0IHBhcmFtZXRlciBzaG91bGQgYmUgYSAzIGRpZ2l0IG51bWJlciwgd2hpY2ggd2UgcmVjb2duaXplOwotICAgICAqIGNvbnZlcnQgaXQgaW50byBhbiBhcnJheSBpbmRleAotICAgICAqLwotICAKLSAgICB3ID0gYXBfZ2V0d29yZF9jb25mX25jKGNtZC0+cG9vbCwgJmxpbmUpOwotICAgIGVycm9yX251bWJlciA9IGF0b2kodyk7Ci0KLSAgICBpZHg1MDAgPSBhcF9pbmRleF9vZl9yZXNwb25zZShIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0KLSAgICBpZiAoZXJyb3JfbnVtYmVyID09IEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKSB7Ci0gICAgICAgIGluZGV4X251bWJlciA9IGlkeDUwMDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKGluZGV4X251bWJlciA9IGFwX2luZGV4X29mX3Jlc3BvbnNlKGVycm9yX251bWJlcikpID09IGlkeDUwMCkgewotICAgICAgICByZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsICJVbnN1cHBvcnRlZCBIVFRQIHJlc3BvbnNlIGNvZGUgIiwKLQkJCSAgdywgTlVMTCk7Ci0gICAgfQotCi0gICAgLyogVGhlIGVudHJ5IHNob3VsZCBiZSBpZ25vcmVkIGlmIGl0IGlzIGEgZnVsbCBVUkwgZm9yIGEgNDAxIGVycm9yICovCi0KLSAgICBpZiAoZXJyb3JfbnVtYmVyID09IDQwMSAmJgotCWxpbmVbMF0gIT0gJy8nICYmIGxpbmVbMF0gIT0gJyInKSB7IC8qIElnbm9yZSBpdC4uLiAqLwotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwgMCwgY21kLT5zZXJ2ZXIsCi0JCSAgICAgImNhbm5vdCB1c2UgYSBmdWxsIFVSTCBpbiBhIDQwMSBFcnJvckRvY3VtZW50ICIKLQkJICAgICAiZGlyZWN0aXZlIC0tLSBpZ25vcmluZyEiKTsKLSAgICB9Ci0gICAgZWxzZSB7IC8qIFN0b3JlIGl0Li4uICovCi0gICAgCWlmIChjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MgPT0gTlVMTCkgewotCSAgICBjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3MgPQotCQlhcF9wY2FsbG9jKGNtZC0+cG9vbCwKLQkJCSAgIHNpemVvZigqY29uZi0+cmVzcG9uc2VfY29kZV9zdHJpbmdzKSAqIFJFU1BPTlNFX0NPREVTKTsKLSAgICAgICAgfQotICAgICAgICBjb25mLT5yZXNwb25zZV9jb2RlX3N0cmluZ3NbaW5kZXhfbnVtYmVyXSA9IGFwX3BzdHJkdXAoY21kLT5wb29sLCBsaW5lKTsKLSAgICB9ICAgCi0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogYWNjZXNzLmNvbmYgY29tbWFuZHMuLi4KLSAqCi0gKiBUaGUgKm9ubHkqIHRoaW5nIHRoYXQgY2FuIGFwcGVhciBpbiBhY2Nlc3MuY29uZiBhdCB0b3AgbGV2ZWwgaXMgYQotICogPERpcmVjdG9yeT4gc2VjdGlvbi4gIE5CIHdlIG5lZWQgdG8gaGF2ZSBhIHdheSB0byBjdXQgdGhlIHNybV9jb21tYW5kX2xvb3AKLSAqIGludm9rZWQgYnkgZGlyc2VjdGlvbiAoaS5lLiwgPERpcmVjdG9yeT4pIHNob3J0IHdoZW4gPC9EaXJlY3Rvcnk+IGlzIHNlZW4uCi0gKiBXZSBkbyB0aGF0IGJ5IHJldHVybmluZyBhbiBlcnJvciwgd2hpY2ggZGlyc2VjdGlvbiBpdHNlbGYgcmVjb2duaXplcyBhbmQKLSAqIGRpc2NhcmRzIGFzIGhhcm1sZXNzLiAgQ2hlZXN5LCBidXQgaXQgd29ya3MuCi0gKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9vdmVycmlkZShjbWRfcGFybXMgKmNtZCwgY29yZV9kaXJfY29uZmlnICpkLAotCQkJCWNvbnN0IGNoYXIgKmwpCi17Ci0gICAgY2hhciAqdzsKLSAgCi0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBOT1RfSU5fTElNSVQpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGQtPm92ZXJyaWRlID0gT1JfTk9ORTsKLSAgICB3aGlsZSAobFswXSkgewotICAgICAgICB3ID0gYXBfZ2V0d29yZF9jb25mKGNtZC0+cG9vbCwgJmwpOwotCWlmICghc3RyY2FzZWNtcCh3LCAiTGltaXQiKSkgewotCSAgICBkLT5vdmVycmlkZSB8PSBPUl9MSU1JVDsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIk9wdGlvbnMiKSkgewotCSAgICBkLT5vdmVycmlkZSB8PSBPUl9PUFRJT05TOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiRmlsZUluZm8iKSkgewotICAgICAgICAgICAgZC0+b3ZlcnJpZGUgfD0gT1JfRklMRUlORk87Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJBdXRoQ29uZmlnIikpIHsKLQkgICAgZC0+b3ZlcnJpZGUgfD0gT1JfQVVUSENGRzsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIkluZGV4ZXMiKSkgewotICAgICAgICAgICAgZC0+b3ZlcnJpZGUgfD0gT1JfSU5ERVhFUzsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIk5vbmUiKSkgewotCSAgICBkLT5vdmVycmlkZSA9IE9SX05PTkU7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJBbGwiKSkgewotCSAgICBkLT5vdmVycmlkZSA9IE9SX0FMTDsKLQl9Ci0JZWxzZSB7Ci0JICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIklsbGVnYWwgb3ZlcnJpZGUgb3B0aW9uICIsIHcsIE5VTEwpOwotCX0KLQlkLT5vdmVycmlkZSAmPSB+T1JfVU5TRVQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfb3B0aW9ucyhjbWRfcGFybXMgKmNtZCwgY29yZV9kaXJfY29uZmlnICpkLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKmwpCi17Ci0gICAgYWxsb3dfb3B0aW9uc190IG9wdDsKLSAgICBpbnQgZmlyc3QgPSAxOwotICAgIGNoYXIgYWN0aW9uOwotCi0gICAgd2hpbGUgKGxbMF0pIHsKLSAgICAgICAgY2hhciAqdyA9IGFwX2dldHdvcmRfY29uZihjbWQtPnBvb2wsICZsKTsKLQlhY3Rpb24gPSAnXDAnOwotCi0JaWYgKCp3ID09ICcrJyB8fCAqdyA9PSAnLScpIHsKLQkgICAgYWN0aW9uID0gKih3KyspOwotCX0KLQllbHNlIGlmIChmaXJzdCkgewotICAJICAgIGQtPm9wdHMgPSBPUFRfTk9ORTsKLSAgICAgICAgICAgIGZpcnN0ID0gMDsKLSAgICAgICAgfQotCSAgICAKLQlpZiAoIXN0cmNhc2VjbXAodywgIkluZGV4ZXMiKSkgewotCSAgICBvcHQgPSBPUFRfSU5ERVhFUzsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIkluY2x1ZGVzIikpIHsKLQkgICAgb3B0ID0gT1BUX0lOQ0xVREVTOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiSW5jbHVkZXNOT0VYRUMiKSkgewotCSAgICBvcHQgPSAoT1BUX0lOQ0xVREVTIHwgT1BUX0lOQ05PRVhFQyk7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJGb2xsb3dTeW1MaW5rcyIpKSB7Ci0JICAgIG9wdCA9IE9QVF9TWU1fTElOS1M7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJTeW1MaW5rc0lmT3duZXJNYXRjaCIpKSB7Ci0JICAgIG9wdCA9IE9QVF9TWU1fT1dORVI7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJleGVjQ0dJIikpIHsKLQkgICAgb3B0ID0gT1BUX0VYRUNDR0k7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJNdWx0aVZpZXdzIikpIHsKLQkgICAgb3B0ID0gT1BUX01VTFRJOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiUnVuU2NyaXB0cyIpKSB7IC8qIEFJIGJhY2tjb21wYXQuIFl1Y2sgKi8KLQkgICAgb3B0ID0gT1BUX01VTFRJfE9QVF9FWEVDQ0dJOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiTm9uZSIpKSB7Ci0JICAgIG9wdCA9IE9QVF9OT05FOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiQWxsIikpIHsKLQkgICAgb3B0ID0gT1BUX0FMTDsKLQl9Ci0JZWxzZSB7Ci0JICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIklsbGVnYWwgb3B0aW9uICIsIHcsIE5VTEwpOwotCX0KLQotCS8qIHdlIGVuc3VyZSB0aGUgaW52YXJpYW50IChkLT5vcHRzX2FkZCAmIGQtPm9wdHNfcmVtb3ZlKSA9PSAwICovCi0JaWYgKGFjdGlvbiA9PSAnLScpIHsKLQkgICAgZC0+b3B0c19yZW1vdmUgfD0gb3B0OwotCSAgICBkLT5vcHRzX2FkZCAmPSB+b3B0OwotCSAgICBkLT5vcHRzICY9IH5vcHQ7Ci0JfQotCWVsc2UgaWYgKGFjdGlvbiA9PSAnKycpIHsKLQkgICAgZC0+b3B0c19hZGQgfD0gb3B0OwotCSAgICBkLT5vcHRzX3JlbW92ZSAmPSB+b3B0OwotCSAgICBkLT5vcHRzIHw9IG9wdDsKLQl9Ci0JZWxzZSB7Ci0JICAgIGQtPm9wdHMgfD0gb3B0OwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNhdGlzZnkoY21kX3Bhcm1zICpjbWQsIGNvcmVfZGlyX2NvbmZpZyAqYywgY2hhciAqYXJnKQotewotICAgIGlmICghc3RyY2FzZWNtcChhcmcsICJhbGwiKSkgewotICAgICAgICBjLT5zYXRpc2Z5ID0gU0FUSVNGWV9BTEw7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZywgImFueSIpKSB7Ci0gICAgICAgIGMtPnNhdGlzZnkgPSBTQVRJU0ZZX0FOWTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJldHVybiAiU2F0aXNmeSBlaXRoZXIgJ2FueScgb3IgJ2FsbCcuIjsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpyZXF1aXJlKGNtZF9wYXJtcyAqY21kLCBjb3JlX2Rpcl9jb25maWcgKmMsIGNoYXIgKmFyZykKLXsKLSAgICByZXF1aXJlX2xpbmUgKnI7Ci0gIAotICAgIGlmICghYy0+YXBfcmVxdWlyZXMpIHsKLSAgICAgICAgYy0+YXBfcmVxdWlyZXMgPSBhcF9tYWtlX2FycmF5KGNtZC0+cG9vbCwgMiwgc2l6ZW9mKHJlcXVpcmVfbGluZSkpOwotICAgIH0KLSAgICByID0gKHJlcXVpcmVfbGluZSAqKWFwX3B1c2hfYXJyYXkoYy0+YXBfcmVxdWlyZXMpOwotICAgIHItPnJlcXVpcmVtZW50ID0gYXBfcHN0cmR1cChjbWQtPnBvb2wsIGFyZyk7Ci0gICAgci0+bWV0aG9kX21hc2sgPSBjbWQtPmxpbWl0ZWQ7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLUNPUkVfRVhQT1JUX05PTlNURChjb25zdCBjaGFyICopIGFwX2xpbWl0X3NlY3Rpb24oY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LAotCQkJCQkJICBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqbGltaXRlZF9tZXRob2RzID0gYXBfZ2V0d29yZChjbWQtPnBvb2wsICZhcmcsICc+Jyk7Ci0gICAgdm9pZCAqdG9nID0gY21kLT5jbWQtPmNtZF9kYXRhOwotICAgIGludCBsaW1pdGVkID0gMDsKLSAgCi0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBOT1RfSU5fTElNSVQpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIFhYWDogTkI6IEN1cnJlbnRseSwgd2UgaGF2ZSBubyB3YXkgb2YgY2hlY2tpbmcKLSAgICAgKiB3aGV0aGVyIDxMaW1pdD4gb3IgPExpbWl0RXhjZXB0PiBzZWN0aW9ucyBhcmUgY2xvc2VkIHByb3Blcmx5LgotICAgICAqIChJZiB3ZSB3b3VsZCBhZGQgYSBzcm1fY29tbWFuZF9sb29wKCkgaGVyZSB3ZSBtaWdodC4uLikKLSAgICAgKi8KLSAgICAKLSAgICB3aGlsZSAobGltaXRlZF9tZXRob2RzWzBdKSB7Ci0gICAgICAgIGNoYXIgKm1ldGhvZCA9IGFwX2dldHdvcmRfY29uZihjbWQtPnBvb2wsICZsaW1pdGVkX21ldGhvZHMpOwotICAgICAgICBpbnQgIG1ldGhudW0gPSBhcF9tZXRob2RfbnVtYmVyX29mKG1ldGhvZCk7Ci0KLSAgICAgICAgaWYgKG1ldGhudW0gPT0gTV9UUkFDRSAmJiAhdG9nKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlRSQUNFIGNhbm5vdCBiZSBjb250cm9sbGVkIGJ5IDxMaW1pdD4iOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1ldGhudW0gPT0gTV9JTlZBTElEKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsICJ1bmtub3duIG1ldGhvZCBcIiIsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiBpbiA8TGltaXQiLCB0b2cgPyAiRXhjZXB0PiIgOiAiPiIsIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgbGltaXRlZCB8PSAoMSA8PCBtZXRobnVtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEtpbGxpbmcgdHdvIGZlYXR1cmVzIHdpdGggb25lIGZ1bmN0aW9uLAotICAgICAqIGlmICh0b2cgPT0gTlVMTCkgPExpbWl0PiwgZWxzZSA8TGltaXRFeGNlcHQ+Ci0gICAgICovCi0gICAgY21kLT5saW1pdGVkID0gdG9nID8gfmxpbWl0ZWQgOiBsaW1pdGVkOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqZW5kbGltaXRfc2VjdGlvbihjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIHZvaWQgKmR1bW15MikKLXsKLSAgICB2b2lkICp0b2cgPSBjbWQtPmNtZC0+Y21kX2RhdGE7Ci0KLSAgICBpZiAoY21kLT5saW1pdGVkID09IC0xKSB7Ci0gICAgICAgIHJldHVybiB0b2cgPyAiPC9MaW1pdEV4Y2VwdD4gdW5leHBlY3RlZCIgOiAiPC9MaW1pdD4gdW5leHBlY3RlZCI7Ci0gICAgfQotICAgIAotICAgIGNtZC0+bGltaXRlZCA9IC0xOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKgotICogV2hlbiBhIHNlY3Rpb24gaXMgbm90IGNsb3NlZCBwcm9wZXJseSB3aGVuIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQsCi0gKiB0aGVuIGFuIGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGJlIHByaW50ZWQ6Ci0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICptaXNzaW5nX2VuZHNlY3Rpb24oY21kX3Bhcm1zICpjbWQsIGludCBuZXN0KQotewotICAgIGlmIChuZXN0IDwgMikgewotCXJldHVybiBhcF9wc3ByaW50ZihjbWQtPnBvb2wsICJNaXNzaW5nICVzIGRpcmVjdGl2ZSBhdCBlbmQtb2YtZmlsZSIsCi0JCQkgICBjbWQtPmVuZF90b2tlbik7Ci0gICAgfQotICAgIHJldHVybiBhcF9wc3ByaW50ZihjbWQtPnBvb2wsICIlZCBtaXNzaW5nICVzIGRpcmVjdGl2ZXMgYXQgZW5kLW9mLWZpbGUiLAotCQkgICAgICAgbmVzdCwgY21kLT5lbmRfdG9rZW4pOwotfQotCi0vKiBXZSB1c2UgdGhpcyBpbiA8RGlyZWN0b3J5TWF0Y2g+IGFuZCA8RmlsZXNNYXRjaD4sIHRvIGVuc3VyZSB0aGF0IAotICogcGVvcGxlIGRvbid0IGdldCBiaXR0ZW4gYnkgd3JvbmctY2FzZWQgcmVnZXggbWF0Y2hlcwotICovCi0KLSNpZmRlZiBXSU4zMgotI2RlZmluZSBVU0VfSUNBU0UgUkVHX0lDQVNFCi0jZWxzZQotI2RlZmluZSBVU0VfSUNBU0UgMAotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBjaGFyICplbmRfbmVzdGVkX3NlY3Rpb24oY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15KQotewotICAgIGlmIChjbWQtPmVuZF90b2tlbiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgY21kLT5jbWQtPm5hbWUsCi0JCQkgICIgd2l0aG91dCBtYXRjaGluZyA8IiwgY21kLT5jbWQtPm5hbWUgKyAyLCAKLQkJCSAgIiBzZWN0aW9uIiwgTlVMTCk7Ci0gICAgfQotICAgIC8qCi0gICAgICogVGhpcyAnIT0nIG1heSBsb29rIHdlaXJkIG9uIGEgc3RyaW5nIGNvbXBhcmlzb24sIGJ1dCBpdCdzIGNvcnJlY3QgLS0KLSAgICAgKiBpdCdzIGJlZW4gc2V0IHVwIHNvIHRoYXQgY2hlY2tpbmcgZm9yIHR3byBwb2ludGVycyB0byB0aGUgc2FtZSBkYXR1bQotICAgICAqIGlzIHZhbGlkIGhlcmUuICBBbmQgZmFzdGVyLgotICAgICAqLwotICAgIGlmIChjbWQtPmNtZC0+bmFtZSAhPSBjbWQtPmVuZF90b2tlbikgewotCXJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIkV4cGVjdGVkICIsIGNtZC0+ZW5kX3Rva2VuLCAiIGJ1dCBzYXcgIiwKLQkJCSAgY21kLT5jbWQtPm5hbWUsIE5VTEwpOwotICAgIH0KLSAgICByZXR1cm4gY21kLT5lbmRfdG9rZW47Ci19Ci0KLS8qCi0gKiBSZXBvcnQgYSBtaXNzaW5nLSc+JyBzeW50YXggZXJyb3IuCi0gKi8KLXN0YXRpYyBjaGFyICp1bmNsb3NlZF9kaXJlY3RpdmUoY21kX3Bhcm1zICpjbWQpCi17Ci0gICAgcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCBjbWQtPmNtZC0+bmFtZSwKLQkJICAgICAgIj4gZGlyZWN0aXZlIG1pc3NpbmcgY2xvc2luZyAnPiciLCBOVUxMKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmRpcnNlY3Rpb24oY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJybXNnOwotICAgIGNoYXIgKmVuZHAgPSBzdHJyY2hyKGFyZywgJz4nKTsKLSAgICBpbnQgb2xkX292ZXJyaWRlcyA9IGNtZC0+b3ZlcnJpZGU7Ci0gICAgY2hhciAqb2xkX3BhdGggPSBjbWQtPnBhdGg7Ci0gICAgY29yZV9kaXJfY29uZmlnICpjb25mOwotICAgIHZvaWQgKm5ld19kaXJfY29uZiA9IGFwX2NyZWF0ZV9wZXJfZGlyX2NvbmZpZyhjbWQtPnBvb2wpOwotICAgIHJlZ2V4X3QgKnIgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKm9sZF9lbmRfdG9rZW47Ci0gICAgY29uc3QgY29tbWFuZF9yZWMgKnRoaXNjbWQgPSBjbWQtPmNtZDsKLQotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwKLQkJCQkJICAgTk9UX0lOX0RJUl9MT0NfRklMRXxOT1RfSU5fTElNSVQpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChlbmRwID09IE5VTEwpIHsKLQlyZXR1cm4gdW5jbG9zZWRfZGlyZWN0aXZlKGNtZCk7Ci0gICAgfQotCi0gICAgKmVuZHAgPSAnXDAnOwotCi0gICAgY21kLT5wYXRoID0gYXBfZ2V0d29yZF9jb25mKGNtZC0+cG9vbCwgJmFyZyk7Ci0gICAgY21kLT5vdmVycmlkZSA9IE9SX0FMTHxBQ0NFU1NfQ09ORjsKLQotICAgIGlmICh0aGlzY21kLT5jbWRfZGF0YSkgeyAvKiA8RGlyZWN0b3J5TWF0Y2g+ICovCi0JciA9IGFwX3ByZWdjb21wKGNtZC0+cG9vbCwgY21kLT5wYXRoLCBSRUdfRVhURU5ERUR8VVNFX0lDQVNFKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChjbWQtPnBhdGgsICJ+IikpIHsKLQljbWQtPnBhdGggPSBhcF9nZXR3b3JkX2NvbmYoY21kLT5wb29sLCAmYXJnKTsKLQlyID0gYXBfcHJlZ2NvbXAoY21kLT5wb29sLCBjbWQtPnBhdGgsIFJFR19FWFRFTkRFRHxVU0VfSUNBU0UpOwotICAgIH0KLSAgICBlbHNlIHsKLQkvKiBFbnN1cmUgdGhhdCB0aGUgcGF0aG5hbWUgaXMgY2Fub25pY2FsICovCi0JY21kLT5wYXRoID0gYXBfb3NfY2Fub25pY2FsX2ZpbGVuYW1lKGNtZC0+cG9vbCwgY21kLT5wYXRoKTsKLSAgICB9Ci0KLSAgICBvbGRfZW5kX3Rva2VuID0gY21kLT5lbmRfdG9rZW47Ci0gICAgY21kLT5lbmRfdG9rZW4gPSB0aGlzY21kLT5jbWRfZGF0YSA/IGVuZF9kaXJlY3RvcnltYXRjaF9zZWN0aW9uIDogZW5kX2RpcmVjdG9yeV9zZWN0aW9uOwotICAgIGVycm1zZyA9IGFwX3NybV9jb21tYW5kX2xvb3AoY21kLCBuZXdfZGlyX2NvbmYpOwotICAgIGlmIChlcnJtc2cgPT0gTlVMTCkgewotCWVycm1zZyA9IG1pc3NpbmdfZW5kc2VjdGlvbihjbWQsIDEpOwotICAgIH0KLSAgICBjbWQtPmVuZF90b2tlbiA9IG9sZF9lbmRfdG9rZW47Ci0gICAgaWYgKGVycm1zZyAhPSAodGhpc2NtZC0+Y21kX2RhdGEgCi0JCSAgICAgICA/IGVuZF9kaXJlY3RvcnltYXRjaF9zZWN0aW9uIAotCQkgICA6IGVuZF9kaXJlY3Rvcnlfc2VjdGlvbikpIHsKLQlyZXR1cm4gZXJybXNnOwotICAgIH0KLQotICAgIGNvbmYgPSAoY29yZV9kaXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcobmV3X2Rpcl9jb25mLCAmY29yZV9tb2R1bGUpOwotICAgIGNvbmYtPnIgPSByOwotCi0gICAgYXBfYWRkX3Blcl9kaXJfY29uZihjbWQtPnNlcnZlciwgbmV3X2Rpcl9jb25mKTsKLQotICAgIGlmICgqYXJnICE9ICdcMCcpIHsKLQlyZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsICJNdWx0aXBsZSAiLCB0aGlzY21kLT5uYW1lLAotCQkJICAiPiBhcmd1bWVudHMgbm90ICh5ZXQpIHN1cHBvcnRlZC4iLCBOVUxMKTsKLSAgICB9Ci0KLSAgICBjbWQtPnBhdGggPSBvbGRfcGF0aDsKLSAgICBjbWQtPm92ZXJyaWRlID0gb2xkX292ZXJyaWRlczsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqdXJsc2VjdGlvbihjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0gICAgY2hhciAqZW5kcCA9IHN0cnJjaHIoYXJnLCAnPicpOwotICAgIGludCBvbGRfb3ZlcnJpZGVzID0gY21kLT5vdmVycmlkZTsKLSAgICBjaGFyICpvbGRfcGF0aCA9IGNtZC0+cGF0aDsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmNvbmY7Ci0gICAgcmVnZXhfdCAqciA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciAqb2xkX2VuZF90b2tlbjsKLSAgICBjb25zdCBjb21tYW5kX3JlYyAqdGhpc2NtZCA9IGNtZC0+Y21kOwotCi0gICAgdm9pZCAqbmV3X3VybF9jb25mID0gYXBfY3JlYXRlX3Blcl9kaXJfY29uZmlnKGNtZC0+cG9vbCk7Ci0KLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsCi0JCQkJCSAgIE5PVF9JTl9ESVJfTE9DX0ZJTEV8Tk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoZW5kcCA9PSBOVUxMKSB7Ci0JcmV0dXJuIHVuY2xvc2VkX2RpcmVjdGl2ZShjbWQpOwotICAgIH0KLQotICAgICplbmRwID0gJ1wwJzsKLQotICAgIGNtZC0+cGF0aCA9IGFwX2dldHdvcmRfY29uZihjbWQtPnBvb2wsICZhcmcpOwotICAgIGNtZC0+b3ZlcnJpZGUgPSBPUl9BTEx8QUNDRVNTX0NPTkY7Ci0KLSAgICBpZiAodGhpc2NtZC0+Y21kX2RhdGEpIHsgLyogPExvY2F0aW9uTWF0Y2g+ICovCi0JciA9IGFwX3ByZWdjb21wKGNtZC0+cG9vbCwgY21kLT5wYXRoLCBSRUdfRVhURU5ERUQpOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKGNtZC0+cGF0aCwgIn4iKSkgewotCWNtZC0+cGF0aCA9IGFwX2dldHdvcmRfY29uZihjbWQtPnBvb2wsICZhcmcpOwotCXIgPSBhcF9wcmVnY29tcChjbWQtPnBvb2wsIGNtZC0+cGF0aCwgUkVHX0VYVEVOREVEKTsKLSAgICB9Ci0KLSAgICBvbGRfZW5kX3Rva2VuID0gY21kLT5lbmRfdG9rZW47Ci0gICAgY21kLT5lbmRfdG9rZW4gPSB0aGlzY21kLT5jbWRfZGF0YSA/IGVuZF9sb2NhdGlvbm1hdGNoX3NlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZW5kX2xvY2F0aW9uX3NlY3Rpb247Ci0gICAgZXJybXNnID0gYXBfc3JtX2NvbW1hbmRfbG9vcChjbWQsIG5ld191cmxfY29uZik7Ci0gICAgaWYgKGVycm1zZyA9PSBOVUxMKSB7Ci0JZXJybXNnID0gbWlzc2luZ19lbmRzZWN0aW9uKGNtZCwgMSk7Ci0gICAgfQotICAgIGNtZC0+ZW5kX3Rva2VuID0gb2xkX2VuZF90b2tlbjsKLSAgICBpZiAoZXJybXNnICE9ICh0aGlzY21kLT5jbWRfZGF0YSAKLQkJICAgICAgID8gZW5kX2xvY2F0aW9ubWF0Y2hfc2VjdGlvbiAKLQkJICAgICAgIDogZW5kX2xvY2F0aW9uX3NlY3Rpb24pKSB7Ci0JcmV0dXJuIGVycm1zZzsKLSAgICB9Ci0KLSAgICBjb25mID0gKGNvcmVfZGlyX2NvbmZpZyAqKWFwX2dldF9tb2R1bGVfY29uZmlnKG5ld191cmxfY29uZiwgJmNvcmVfbW9kdWxlKTsKLSAgICBjb25mLT5kID0gYXBfcHN0cmR1cChjbWQtPnBvb2wsIGNtZC0+cGF0aCk7CS8qIE5vIG1hbmdsaW5nLCBwbGVhc2UgKi8KLSAgICBjb25mLT5kX2lzX2ZubWF0Y2ggPSBhcF9pc19mbm1hdGNoKGNvbmYtPmQpICE9IDA7Ci0gICAgY29uZi0+ciA9IHI7Ci0KLSAgICBhcF9hZGRfcGVyX3VybF9jb25mKGNtZC0+c2VydmVyLCBuZXdfdXJsX2NvbmYpOwotICAgIAotICAgIGlmICgqYXJnICE9ICdcMCcpIHsKLQlyZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsICJNdWx0aXBsZSAiLCB0aGlzY21kLT5uYW1lLAotCQkJICAiPiBhcmd1bWVudHMgbm90ICh5ZXQpIHN1cHBvcnRlZC4iLCBOVUxMKTsKLSAgICB9Ci0KLSAgICBjbWQtPnBhdGggPSBvbGRfcGF0aDsKLSAgICBjbWQtPm92ZXJyaWRlID0gb2xkX292ZXJyaWRlczsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqZmlsZXNlY3Rpb24oY21kX3Bhcm1zICpjbWQsIGNvcmVfZGlyX2NvbmZpZyAqYywKLQkJCSAgICAgICBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJybXNnOwotICAgIGNoYXIgKmVuZHAgPSBzdHJyY2hyKGFyZywgJz4nKTsKLSAgICBpbnQgb2xkX292ZXJyaWRlcyA9IGNtZC0+b3ZlcnJpZGU7Ci0gICAgY2hhciAqb2xkX3BhdGggPSBjbWQtPnBhdGg7Ci0gICAgY29yZV9kaXJfY29uZmlnICpjb25mOwotICAgIHJlZ2V4X3QgKnIgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKm9sZF9lbmRfdG9rZW47Ci0gICAgY29uc3QgY29tbWFuZF9yZWMgKnRoaXNjbWQgPSBjbWQtPmNtZDsKLQotICAgIHZvaWQgKm5ld19maWxlX2NvbmYgPSBhcF9jcmVhdGVfcGVyX2Rpcl9jb25maWcoY21kLT5wb29sKTsKLQotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgTk9UX0lOX0xJTUlUfE5PVF9JTl9MT0NBVElPTik7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKGVuZHAgPT0gTlVMTCkgewotCXJldHVybiB1bmNsb3NlZF9kaXJlY3RpdmUoY21kKTsKLSAgICB9Ci0KLSAgICAqZW5kcCA9ICdcMCc7Ci0KLSAgICBjbWQtPnBhdGggPSBhcF9nZXR3b3JkX2NvbmYoY21kLT5wb29sLCAmYXJnKTsKLSAgICAvKiBPbmx5IGlmIG5vdCBhbiAuaHRhY2Nlc3MgZmlsZSAqLwotICAgIGlmICghb2xkX3BhdGgpIHsKLQljbWQtPm92ZXJyaWRlID0gT1JfQUxMfEFDQ0VTU19DT05GOwotICAgIH0KLQotICAgIGlmICh0aGlzY21kLT5jbWRfZGF0YSkgeyAvKiA8RmlsZXNNYXRjaD4gKi8KLSAgICAgICAgciA9IGFwX3ByZWdjb21wKGNtZC0+cG9vbCwgY21kLT5wYXRoLCBSRUdfRVhURU5ERUR8VVNFX0lDQVNFKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChjbWQtPnBhdGgsICJ+IikpIHsKLQljbWQtPnBhdGggPSBhcF9nZXR3b3JkX2NvbmYoY21kLT5wb29sLCAmYXJnKTsKLQlyID0gYXBfcHJlZ2NvbXAoY21kLT5wb29sLCBjbWQtPnBhdGgsIFJFR19FWFRFTkRFRHxVU0VfSUNBU0UpOwotICAgIH0KLSAgICBlbHNlIHsKLQkvKiBFbnN1cmUgdGhhdCB0aGUgcGF0aG5hbWUgaXMgY2Fub25pY2FsICovCi0JY21kLT5wYXRoID0gYXBfb3NfY2Fub25pY2FsX2ZpbGVuYW1lKGNtZC0+cG9vbCwgY21kLT5wYXRoKTsKLSAgICB9Ci0KLSAgICBvbGRfZW5kX3Rva2VuID0gY21kLT5lbmRfdG9rZW47Ci0gICAgY21kLT5lbmRfdG9rZW4gPSB0aGlzY21kLT5jbWRfZGF0YSA/IGVuZF9maWxlc21hdGNoX3NlY3Rpb24gOiBlbmRfZmlsZXNfc2VjdGlvbjsKLSAgICBlcnJtc2cgPSBhcF9zcm1fY29tbWFuZF9sb29wKGNtZCwgbmV3X2ZpbGVfY29uZik7Ci0gICAgaWYgKGVycm1zZyA9PSBOVUxMKSB7Ci0JZXJybXNnID0gbWlzc2luZ19lbmRzZWN0aW9uKGNtZCwgMSk7Ci0gICAgfQotICAgIGNtZC0+ZW5kX3Rva2VuID0gb2xkX2VuZF90b2tlbjsKLSAgICBpZiAoZXJybXNnICE9ICh0aGlzY21kLT5jbWRfZGF0YSAKLQkJICAgICAgID8gZW5kX2ZpbGVzbWF0Y2hfc2VjdGlvbiAKLQkJICAgOiBlbmRfZmlsZXNfc2VjdGlvbikpIHsKLQlyZXR1cm4gZXJybXNnOwotICAgIH0KLQotICAgIGNvbmYgPSAoY29yZV9kaXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcobmV3X2ZpbGVfY29uZiwKLQkJCQkJCSAgICZjb3JlX21vZHVsZSk7Ci0gICAgY29uZi0+ZCA9IGNtZC0+cGF0aDsKLSAgICBjb25mLT5kX2lzX2ZubWF0Y2ggPSBhcF9pc19mbm1hdGNoKGNvbmYtPmQpICE9IDA7Ci0gICAgY29uZi0+ciA9IHI7Ci0KLSAgICBhcF9hZGRfZmlsZV9jb25mKGMsIG5ld19maWxlX2NvbmYpOwotCi0gICAgaWYgKCphcmcgIT0gJ1wwJykgewotCXJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIk11bHRpcGxlICIsIHRoaXNjbWQtPm5hbWUsCi0JCQkgICI+IGFyZ3VtZW50cyBub3QgKHlldCkgc3VwcG9ydGVkLiIsIE5VTEwpOwotICAgIH0KLQotICAgIGNtZC0+cGF0aCA9IG9sZF9wYXRoOwotICAgIGNtZC0+b3ZlcnJpZGUgPSBvbGRfb3ZlcnJpZGVzOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFhYWDogTkI6IEN1cnJlbnRseSwgd2UgaGF2ZSBubyB3YXkgb2YgY2hlY2tpbmcKLSAqIHdoZXRoZXIgPElmTW9kdWxlPiBzZWN0aW9ucyBhcmUgY2xvc2VkIHByb3Blcmx5LgotICogRXh0cmEgKHJlZHVuZGFudCwgdW5wYWlyZWQpIDwvSWZNb2R1bGU+IGRpcmVjdGl2ZXMgYXJlCi0gKiBzaW1wbHkgc2lsZW50bHkgaWdub3JlZC4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmVuZF9pZm1vZChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXkpCi17Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzdGFydF9pZm1vZChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBjaGFyICplbmRwID0gc3RycmNocihhcmcsICc+Jyk7Ci0gICAgY2hhciBsW01BWF9TVFJJTkdfTEVOXTsKLSAgICBpbnQgbm90ID0gKGFyZ1swXSA9PSAnIScpOwotICAgIG1vZHVsZSAqZm91bmQ7Ci0gICAgaW50IG5lc3QgPSAxOwotCi0gICAgaWYgKGVuZHAgPT0gTlVMTCkgewotCXJldHVybiB1bmNsb3NlZF9kaXJlY3RpdmUoY21kKTsKLSAgICB9Ci0KLSAgICAqZW5kcCA9ICdcMCc7Ci0KLSAgICBpZiAobm90KSB7Ci0gICAgICAgIGFyZysrOwotICAgIH0KLQotICAgIGZvdW5kID0gYXBfZmluZF9saW5rZWRfbW9kdWxlKGFyZyk7Ci0KLSAgICBpZiAoKCFub3QgJiYgZm91bmQpIHx8IChub3QgJiYgIWZvdW5kKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICB3aGlsZSAobmVzdCAmJiAhKGFwX2NmZ19nZXRsaW5lKGwsIE1BWF9TVFJJTkdfTEVOLCBjbWQtPmNvbmZpZ19maWxlKSkpIHsKLSAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChsLCAiPElmTW9kdWxlIiwgOSkpIHsKLQkgICAgbmVzdCsrOwotCX0KLQlpZiAoIXN0cmNhc2VjbXAobCwgIjwvSWZNb2R1bGU+IikpIHsKLQkgIG5lc3QtLTsKLQl9Ci0gICAgfQotCi0gICAgaWYgKG5lc3QpIHsKLQljbWQtPmVuZF90b2tlbiA9IGVuZF9pZm1vZHVsZV9zZWN0aW9uOwotCXJldHVybiBtaXNzaW5nX2VuZHNlY3Rpb24oY21kLCBuZXN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLUFQSV9FWFBPUlQoaW50KSBhcF9leGlzdHNfY29uZmlnX2RlZmluZShjaGFyICpuYW1lKQotewotICAgIGNoYXIgKipkZWZpbmVzOwotICAgIGludCBpOwotCi0gICAgZGVmaW5lcyA9IChjaGFyICoqKWFwX3NlcnZlcl9jb25maWdfZGVmaW5lcy0+ZWx0czsKLSAgICBmb3IgKGkgPSAwOyBpIDwgYXBfc2VydmVyX2NvbmZpZ19kZWZpbmVzLT5uZWx0czsgaSsrKSB7Ci0gICAgICAgIGlmIChzdHJjbXAoZGVmaW5lc1tpXSwgbmFtZSkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmVuZF9pZmRlZmluZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXkpIAotewotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc3RhcnRfaWZkZWZpbmUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgY2hhciAqZW5kcDsKLSAgICBjaGFyIGxbTUFYX1NUUklOR19MRU5dOwotICAgIGludCBkZWZpbmVkOwotICAgIGludCBub3QgPSAwOwotICAgIGludCBuZXN0ID0gMTsKLQotICAgIGVuZHAgPSBzdHJyY2hyKGFyZywgJz4nKTsKLSAgICBpZiAoZW5kcCA9PSBOVUxMKSB7Ci0JcmV0dXJuIHVuY2xvc2VkX2RpcmVjdGl2ZShjbWQpOwotICAgIH0KLQotICAgICplbmRwID0gJ1wwJzsKLQotICAgIGlmIChhcmdbMF0gPT0gJyEnKSB7Ci0gICAgICAgIG5vdCA9IDE7Ci0JYXJnKys7Ci0gICAgfQotCi0gICAgZGVmaW5lZCA9IGFwX2V4aXN0c19jb25maWdfZGVmaW5lKGFyZyk7Ci0KLSAgICBpZiAoKCFub3QgJiYgZGVmaW5lZCkgfHwgKG5vdCAmJiAhZGVmaW5lZCkpIHsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICB3aGlsZSAobmVzdCAmJiAhKGFwX2NmZ19nZXRsaW5lKGwsIE1BWF9TVFJJTkdfTEVOLCBjbWQtPmNvbmZpZ19maWxlKSkpIHsKLSAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChsLCAiPElmRGVmaW5lIiwgOSkpIHsKLQkgICAgbmVzdCsrOwotCX0KLQlpZiAoIXN0cmNhc2VjbXAobCwgIjwvSWZEZWZpbmU+IikpIHsKLQkgICAgbmVzdC0tOwotCX0KLSAgICB9Ci0gICAgaWYgKG5lc3QpIHsKLQljbWQtPmVuZF90b2tlbiA9IGVuZF9pZmRlZmluZV9zZWN0aW9uOwotCXJldHVybiBtaXNzaW5nX2VuZHNlY3Rpb24oY21kLCBuZXN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIGh0dHBkLmNvbmYgY29tbWFuZHMuLi4gYmVnaW5uaW5nIHdpdGggdGhlIDxWaXJ0dWFsSG9zdD4gYnVzaW5lc3MgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKnZpcnR1YWxob3N0X3NlY3Rpb24oY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgc2VydmVyX3JlYyAqbWFpbl9zZXJ2ZXIgPSBjbWQtPnNlcnZlciwgKnM7Ci0gICAgY29uc3QgY2hhciAqZXJybXNnOwotICAgIGNoYXIgKmVuZHAgPSBzdHJyY2hyKGFyZywgJz4nKTsKLSAgICBhcF9jb250ZXh0X3QgKnAgPSBjbWQtPnBvb2wsICpwdGVtcCA9IGNtZC0+dGVtcF9wb29sOwotICAgIGNvbnN0IGNoYXIgKm9sZF9lbmRfdG9rZW47Ci0KLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoZW5kcCA9PSBOVUxMKSB7Ci0JcmV0dXJuIHVuY2xvc2VkX2RpcmVjdGl2ZShjbWQpOwotICAgIH0KLQotICAgICplbmRwID0gJ1wwJzsKLSAgICAKLSAgICAvKiBGSVhNRTogVGhlcmUncyBhbm90aGVyIGZlYXR1cmUgd2FpdGluZyB0byBoYXBwZW4gaGVyZSAtLSBzaW5jZSB5b3UKLQljYW4gbm93IHB1dCBtdWx0aXBsZSBhZGRyZXNzZXMvbmFtZXMgb24gYSBzaW5nbGUgPFZpcnR1YWxIb3N0PgotCXlvdSBtaWdodCB3YW50IHRvIHVzZSBpdCB0byBncm91cCBjb21tb24gZGVmaW5pdGlvbnMgYW5kIHRoZW4KLQlkZWZpbmUgb3RoZXIgInN1Ymhvc3RzIiB3aXRoIHRoZWlyIGluZGl2aWR1YWwgZGlmZmVyZW5jZXMuICBCdXQKLQlwZXJzb25hbGx5IEknZCByYXRoZXIganVzdCBkbyBpdCB3aXRoIGEgbWFjcm8gcHJlcHJvY2Vzc29yLiAtZGpnICovCi0gICAgaWYgKG1haW5fc2VydmVyLT5pc192aXJ0dWFsKSB7Ci0JcmV0dXJuICI8VmlydHVhbEhvc3Q+IGRvZXNuJ3QgbmVzdCEiOwotICAgIH0KLSAgICAKLSAgICBlcnJtc2cgPSBhcF9pbml0X3ZpcnR1YWxfaG9zdChwLCBhcmcsIG1haW5fc2VydmVyLCAmcyk7Ci0gICAgaWYgKGVycm1zZykgewotCXJldHVybiBlcnJtc2c7Ci0gICAgfQotCi0gICAgcy0+bmV4dCA9IG1haW5fc2VydmVyLT5uZXh0OwotICAgIG1haW5fc2VydmVyLT5uZXh0ID0gczsKLQotICAgIHMtPmRlZm5fbmFtZSA9IGNtZC0+Y29uZmlnX2ZpbGUtPm5hbWU7Ci0gICAgcy0+ZGVmbl9saW5lX251bWJlciA9IGNtZC0+Y29uZmlnX2ZpbGUtPmxpbmVfbnVtYmVyOwotCi0gICAgb2xkX2VuZF90b2tlbiA9IGNtZC0+ZW5kX3Rva2VuOwotICAgIGNtZC0+ZW5kX3Rva2VuID0gZW5kX3ZpcnR1YWxob3N0X3NlY3Rpb247Ci0gICAgY21kLT5zZXJ2ZXIgPSBzOwotICAgIGVycm1zZyA9IGFwX3NybV9jb21tYW5kX2xvb3AoY21kLCBzLT5sb29rdXBfZGVmYXVsdHMpOwotICAgIGNtZC0+c2VydmVyID0gbWFpbl9zZXJ2ZXI7Ci0gICAgaWYgKGVycm1zZyA9PSBOVUxMKSB7Ci0JZXJybXNnID0gbWlzc2luZ19lbmRzZWN0aW9uKGNtZCwgMSk7Ci0gICAgfQotICAgIGNtZC0+ZW5kX3Rva2VuID0gb2xkX2VuZF90b2tlbjsKLQotICAgIGlmIChzLT5zcm1fY29uZm5hbWUpIHsKLQlhcF9wcm9jZXNzX3Jlc291cmNlX2NvbmZpZyhzLCBzLT5zcm1fY29uZm5hbWUsIHAsIHB0ZW1wKTsKLSAgICB9Ci0KLSAgICBpZiAocy0+YWNjZXNzX2NvbmZuYW1lKSB7Ci0JYXBfcHJvY2Vzc19yZXNvdXJjZV9jb25maWcocywgcy0+YWNjZXNzX2NvbmZuYW1lLCBwLCBwdGVtcCk7Ci0gICAgfQotICAgIAotICAgIGlmIChlcnJtc2cgPT0gZW5kX3ZpcnR1YWxob3N0X3NlY3Rpb24pIHsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIGVycm1zZzsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9zZXJ2ZXJfYWxpYXMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LAotCQkJCSAgICBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgaWYgKCFjbWQtPnNlcnZlci0+bmFtZXMpIHsKLQlyZXR1cm4gIlNlcnZlckFsaWFzIG9ubHkgdXNlZCBpbiA8VmlydHVhbEhvc3Q+IjsKLSAgICB9Ci0gICAgd2hpbGUgKCphcmcpIHsKLQljaGFyICoqaXRlbSwgKm5hbWUgPSBhcF9nZXR3b3JkX2NvbmYoY21kLT5wb29sLCAmYXJnKTsKLQlpZiAoYXBfaXNfbWF0Y2hleHAobmFtZSkpIHsKLQkgICAgaXRlbSA9IChjaGFyICoqKWFwX3B1c2hfYXJyYXkoY21kLT5zZXJ2ZXItPndpbGRfbmFtZXMpOwotCX0KLQllbHNlIHsKLQkgICAgaXRlbSA9IChjaGFyICoqKWFwX3B1c2hfYXJyYXkoY21kLT5zZXJ2ZXItPm5hbWVzKTsKLQl9Ci0JKml0ZW0gPSBuYW1lOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmFkZF9tb2R1bGVfY29tbWFuZChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoIWFwX2FkZF9uYW1lZF9tb2R1bGUoYXJnKSkgewotCXJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIkNhbm5vdCBhZGQgbW9kdWxlIHZpYSBuYW1lICciLCBhcmcsIAotCQkJICAiJzogbm90IGluIGxpc3Qgb2YgbG9hZGVkIG1vZHVsZXMiLCBOVUxMKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjbGVhcl9tb2R1bGVfbGlzdF9jb21tYW5kKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSkKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcF9jbGVhcl9tb2R1bGVfbGlzdCgpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3NlcnZlcl9zdHJpbmdfc2xvdChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksCi0JCQkJCSAgY2hhciAqYXJnKQotewotICAgIC8qIFRoaXMgb25lJ3MgcHJldHR5IGdlbmVyaWMuLi4gKi8KLSAgCi0gICAgaW50IG9mZnNldCA9IChpbnQpKGxvbmcpY21kLT5pbmZvOwotICAgIGNoYXIgKnN0cnVjdF9wdHIgPSAoY2hhciAqKWNtZC0+c2VydmVyOwotICAgIAotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgCi0JCQkJCSAgIE5PVF9JTl9ESVJfTE9DX0ZJTEV8Tk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAqKGNoYXIgKiopKHN0cnVjdF9wdHIgKyBvZmZzZXQpID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2VydmVyX3BvcnQoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBOT1RfSU5fRElSX0xPQ19GSUxFfE5PVF9JTl9MSU1JVCk7Ci0gICAgaW50IHBvcnQ7Ci0KLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLQlyZXR1cm4gZXJyOwotICAgIH0KLSAgICBwb3J0ID0gYXRvaShhcmcpOwotICAgIGlmIChwb3J0IDw9IDAgfHwgcG9ydCA+PSA2NTUzNikgeyAvKiA2NTUzNiA9PSAxPDwxNiAqLwotCXJldHVybiBhcF9wc3RyY2F0KGNtZC0+dGVtcF9wb29sLCAiVGhlIHBvcnQgbnVtYmVyIFwiIiwgYXJnLCAKLQkJCSAgIlwiIGlzIG91dHNpZGUgdGhlIGFwcHJvcHJpYXRlIHJhbmdlICIKLQkJCSAgIihpLmUuLCAxLi42NTUzNSkuIiwgTlVMTCk7Ci0gICAgfQotICAgIGNtZC0+c2VydmVyLT5wb3J0ID0gcG9ydDsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9zaWduYXR1cmVfZmxhZyhjbWRfcGFybXMgKmNtZCwgY29yZV9kaXJfY29uZmlnICpkLCAKLQkJCQkgICAgICBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBOT1RfSU5fTElNSVQpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChzdHJjYXNlY21wKGFyZywgIk9uIikgPT0gMCkgewotCWQtPnNlcnZlcl9zaWduYXR1cmUgPSBzcnZfc2lnX29uOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKGFyZywgIk9mZiIpID09IDApIHsKLSAgICAgICAgZC0+c2VydmVyX3NpZ25hdHVyZSA9IHNydl9zaWdfb2ZmOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKGFyZywgIkVNYWlsIikgPT0gMCkgewotCWQtPnNlcnZlcl9zaWduYXR1cmUgPSBzcnZfc2lnX3dpdGhtYWlsOwotICAgIH0KLSAgICBlbHNlIHsKLQlyZXR1cm4gIlNlcnZlclNpZ25hdHVyZTogdXNlIG9uZSBvZjogb2ZmIHwgb24gfCBlbWFpbCI7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3NlcnZlcl9yb290KGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLQotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFyZyA9IGFwX29zX2Nhbm9uaWNhbF9maWxlbmFtZShjbWQtPnBvb2wsIGFyZyk7Ci0KLSAgICBpZiAoIWFwX2lzX2RpcmVjdG9yeShhcmcpKSB7Ci0gICAgICAgIHJldHVybiAiU2VydmVyUm9vdCBtdXN0IGJlIGEgdmFsaWQgZGlyZWN0b3J5IjsKLSAgICB9Ci0gICAgYXBfc2VydmVyX3Jvb3QgPSBhcmc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfdGltZW91dChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIE5PVF9JTl9ESVJfTE9DX0ZJTEV8Tk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBjbWQtPnNlcnZlci0+dGltZW91dCA9IGF0b2koYXJnKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9rZWVwX2FsaXZlX3RpbWVvdXQoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LAotCQkJCQkgIGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIE5PVF9JTl9ESVJfTE9DX0ZJTEV8Tk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBjbWQtPnNlcnZlci0+a2VlcF9hbGl2ZV90aW1lb3V0ID0gYXRvaShhcmcpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2tlZXBfYWxpdmUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgTk9UX0lOX0RJUl9MT0NfRklMRXxOT1RfSU5fTElNSVQpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIFdlJ3ZlIGNoYW5nZWQgaXQgdG8gT24vT2ZmLCBidXQgdXNlZCB0byB1c2UgbnVtYmVycwotICAgICAqIHNvIHdlIGFjY2VwdCBhbnl0aGluZyBidXQgIk9mZiIgb3IgIjAiIGFzICJPbiIKLSAgICAgKi8KLSAgICBpZiAoIXN0cmNhc2VjbXAoYXJnLCAib2ZmIikgfHwgIXN0cmNtcChhcmcsICIwIikpIHsKLQljbWQtPnNlcnZlci0+a2VlcF9hbGl2ZSA9IDA7Ci0gICAgfQotICAgIGVsc2UgewotCWNtZC0+c2VydmVyLT5rZWVwX2FsaXZlID0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfa2VlcF9hbGl2ZV9tYXgoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgTk9UX0lOX0RJUl9MT0NfRklMRXxOT1RfSU5fTElNSVQpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGNtZC0+c2VydmVyLT5rZWVwX2FsaXZlX21heCA9IGF0b2koYXJnKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9pZGNoZWNrKGNtZF9wYXJtcyAqY21kLCBjb3JlX2Rpcl9jb25maWcgKmQsIGludCBhcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgTk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBkLT5kb19yZmMxNDEzID0gYXJnICE9IDA7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfaG9zdG5hbWVfbG9va3VwcyhjbWRfcGFybXMgKmNtZCwgY29yZV9kaXJfY29uZmlnICpkLAotCQkJCQljaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBOT1RfSU5fTElNSVQpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmICghc3RyY2FzZWNtcChhcmcsICJvbiIpKSB7Ci0JZC0+aG9zdG5hbWVfbG9va3VwcyA9IEhPU1ROQU1FX0xPT0tVUF9PTjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnLCAib2ZmIikpIHsKLQlkLT5ob3N0bmFtZV9sb29rdXBzID0gSE9TVE5BTUVfTE9PS1VQX09GRjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnLCAiZG91YmxlIikpIHsKLQlkLT5ob3N0bmFtZV9sb29rdXBzID0gSE9TVE5BTUVfTE9PS1VQX0RPVUJMRTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JcmV0dXJuICJwYXJhbWV0ZXIgbXVzdCBiZSAnb24nLCAnb2ZmJywgb3IgJ2RvdWJsZSciOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9zZXJ2ZXJwYXRoKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIE5PVF9JTl9ESVJfTE9DX0ZJTEV8Tk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBjbWQtPnNlcnZlci0+cGF0aCA9IGFyZzsKLSAgICBjbWQtPnNlcnZlci0+cGF0aGxlbiA9IHN0cmxlbihhcmcpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2NvbnRlbnRfbWQ1KGNtZF9wYXJtcyAqY21kLCBjb3JlX2Rpcl9jb25maWcgKmQsIGludCBhcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBOT1RfSU5fTElNSVQpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGQtPmNvbnRlbnRfbWQ1ID0gYXJnICE9IDA7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfdXNlX2Nhbm9uaWNhbF9uYW1lKGNtZF9wYXJtcyAqY21kLCBjb3JlX2Rpcl9jb25maWcgKmQsIAotCQkJCQkgIGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIE5PVF9JTl9MSU1JVCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0JcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoc3RyY2FzZWNtcChhcmcsICJvbiIpID09IDApIHsKLSAgICAgICAgZC0+dXNlX2Nhbm9uaWNhbF9uYW1lID0gVVNFX0NBTk9OSUNBTF9OQU1FX09OOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKGFyZywgIm9mZiIpID09IDApIHsKLSAgICAgICAgZC0+dXNlX2Nhbm9uaWNhbF9uYW1lID0gVVNFX0NBTk9OSUNBTF9OQU1FX09GRjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcChhcmcsICJkbnMiKSA9PSAwKSB7Ci0gICAgICAgIGQtPnVzZV9jYW5vbmljYWxfbmFtZSA9IFVTRV9DQU5PTklDQUxfTkFNRV9ETlM7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXR1cm4gInBhcmFtZXRlciBtdXN0IGJlICdvbicsICdvZmYnLCBvciAnZG5zJyI7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICppbmNsdWRlX2NvbmZpZyAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICpuYW1lKQotewotICAgIGFwX3Byb2Nlc3NfcmVzb3VyY2VfY29uZmlnKGNtZC0+c2VydmVyLAotCWFwX3NlcnZlcl9yb290X3JlbGF0aXZlKGNtZC0+cG9vbCwgbmFtZSksCi0JY21kLT5wb29sLCBjbWQtPnRlbXBfcG9vbCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbG9nbGV2ZWwoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjb25zdCBjaGFyICphcmcpIAotewotICAgIGNoYXIgKnN0cjsKLSAgICAKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsCi0JCQkJCSAgIE5PVF9JTl9ESVJfTE9DX0ZJTEV8Tk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoKHN0ciA9IGFwX2dldHdvcmRfY29uZihjbWQtPnBvb2wsICZhcmcpKSkgewotICAgICAgICBpZiAoIXN0cmNhc2VjbXAoc3RyLCAiZW1lcmciKSkgewotCSAgICBjbWQtPnNlcnZlci0+bG9nbGV2ZWwgPSBBUExPR19FTUVSRzsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAoc3RyLCAiYWxlcnQiKSkgewotCSAgICBjbWQtPnNlcnZlci0+bG9nbGV2ZWwgPSBBUExPR19BTEVSVDsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAoc3RyLCAiY3JpdCIpKSB7Ci0JICAgIGNtZC0+c2VydmVyLT5sb2dsZXZlbCA9IEFQTE9HX0NSSVQ7Ci0JfQotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHN0ciwgImVycm9yIikpIHsKLQkgICAgY21kLT5zZXJ2ZXItPmxvZ2xldmVsID0gQVBMT0dfRVJSOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcChzdHIsICJ3YXJuIikpIHsKLQkgICAgY21kLT5zZXJ2ZXItPmxvZ2xldmVsID0gQVBMT0dfV0FSTklORzsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAoc3RyLCAibm90aWNlIikpIHsKLQkgICAgY21kLT5zZXJ2ZXItPmxvZ2xldmVsID0gQVBMT0dfTk9USUNFOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcChzdHIsICJpbmZvIikpIHsKLQkgICAgY21kLT5zZXJ2ZXItPmxvZ2xldmVsID0gQVBMT0dfSU5GTzsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAoc3RyLCAiZGVidWciKSkgewotCSAgICBjbWQtPnNlcnZlci0+bG9nbGV2ZWwgPSBBUExPR19ERUJVRzsKLQl9Ci0JZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIkxvZ0xldmVsIHJlcXVpcmVzIGxldmVsIGtleXdvcmQ6IG9uZSBvZiAiCi0JICAgICAgICAgICAiZW1lcmcvYWxlcnQvY3JpdC9lcnJvci93YXJuL25vdGljZS9pbmZvL2RlYnVnIjsKLQl9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXR1cm4gIkxvZ0xldmVsIHJlcXVpcmVzIGxldmVsIGtleXdvcmQiOwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfcHNpZ25hdHVyZShjb25zdCBjaGFyICpwcmVmaXgsIHJlcXVlc3RfcmVjICpyKQotewotICAgIGNoYXIgc3BvcnRbMjBdOwotICAgIGNvcmVfZGlyX2NvbmZpZyAqY29uZjsKLQotICAgIGNvbmYgPSAoY29yZV9kaXJfY29uZmlnICopYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCQkgICAmY29yZV9tb2R1bGUpOwotICAgIGlmICgoY29uZi0+c2VydmVyX3NpZ25hdHVyZSA9PSBzcnZfc2lnX29mZikKLQkgICAgfHwgKGNvbmYtPnNlcnZlcl9zaWduYXR1cmUgPT0gc3J2X3NpZ191bnNldCkpIHsKLQlyZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgYXBfc25wcmludGYoc3BvcnQsIHNpemVvZiBzcG9ydCwgIiV1IiwgKHVuc2lnbmVkKSBhcF9nZXRfc2VydmVyX3BvcnQocikpOwotCi0gICAgaWYgKGNvbmYtPnNlcnZlcl9zaWduYXR1cmUgPT0gc3J2X3NpZ193aXRobWFpbCkgewotCXJldHVybiBhcF9wc3RyY2F0KHItPnBvb2wsIHByZWZpeCwgIjxBRERSRVNTPiIgQVBfU0VSVkVSX0JBU0VWRVJTSU9OCi0JCQkgICIgU2VydmVyIGF0IDxBIEhSRUY9XCJtYWlsdG86IiwKLQkJCSAgci0+c2VydmVyLT5zZXJ2ZXJfYWRtaW4sICJcIj4iLAotCQkJICBhcF9nZXRfc2VydmVyX25hbWUociksICI8L0E+IFBvcnQgIiwgc3BvcnQsCi0JCQkgICI8L0FERFJFU1M+XG4iLCBOVUxMKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFwX3BzdHJjYXQoci0+cG9vbCwgcHJlZml4LCAiPEFERFJFU1M+IiBBUF9TRVJWRVJfQkFTRVZFUlNJT04KLQkJICAgICAgIiBTZXJ2ZXIgYXQgIiwgYXBfZ2V0X3NlcnZlcl9uYW1lKHIpLCAiIFBvcnQgIiwgc3BvcnQsCi0JCSAgICAgICI8L0FERFJFU1M+XG4iLCBOVUxMKTsKLX0KLQotLyoKLSAqIExvYWQgYW4gYXV0aG9yaXNhdGlvbiByZWFsbSBpbnRvIG91ciBsb2NhdGlvbiBjb25maWd1cmF0aW9uLCBhcHBseWluZyB0aGUKLSAqIHVzdWFsIHJ1bGVzIHRoYXQgYXBwbHkgdG8gcmVhbG1zLgotICovCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2F1dGhuYW1lKGNtZF9wYXJtcyAqY21kLCB2b2lkICptY29uZmlnLCBjaGFyICp3b3JkMSkKLXsKLSAgICBjb3JlX2Rpcl9jb25maWcgKmFjb25maWcgPSAoY29yZV9kaXJfY29uZmlnICopbWNvbmZpZzsKLQotICAgIGFjb25maWctPmFwX2F1dGhfbmFtZSA9IGFwX2VzY2FwZV9xdW90ZXMoY21kLT5wb29sLCB3b3JkMSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNpZmRlZiBfT1NEX1BPU0lYIC8qIEJTMjAwMCBMb2dvbiBQYXNzd2QgZmlsZSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9iczIwMDBfYWNjb3VudChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKm5hbWUpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIG9zX3NldF9hY2NvdW50KGNtZC0+cG9vbCwgbmFtZSk7Ci19Ci0jZW5kaWYgLypfT1NEX1BPU0lYKi8KLQotLyoKLSAqIEhhbmRsZSBhIHJlcXVlc3QgdG8gaW5jbHVkZSB0aGUgc2VydmVyJ3MgT1MgcGxhdGZvcm0gaW4gdGhlIFNlcnZlcgotICogcmVzcG9uc2UgaGVhZGVyIGZpZWxkICh0aGUgU2VydmVyVG9rZW5zIGRpcmVjdGl2ZSkuICBVbmZvcnR1bmF0ZWx5Ci0gKiB0aGlzIHJlcXVpcmVzIGEgbmV3IGdsb2JhbCBpbiBvcmRlciB0byBjb21tdW5pY2F0ZSB0aGUgc2V0dGluZyBiYWNrIHRvCi0gKiBodHRwX21haW4gc28gaXQgY2FuIGluc2VydCB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHJpZ2h0IHBsYWNlIGluIHRoZQotICogc3RyaW5nLgotICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfc2Vydl90b2tlbnMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIFRPRE86IHJlaW1wbGVtZW50IHRoZSBzZXJ2ZXIgdG9rZW4gc3R1ZmYuICovCi0jaWYgMAotICAgIGlmICghc3RyY2FzZWNtcChhcmcsICJPUyIpKSB7Ci0gICAgICAgIGFwX3NlcnZlcl90b2tlbnMgPSBTcnZUa19PUzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnLCAiTWluIikgfHwgIXN0cmNhc2VjbXAoYXJnLCAiTWluaW1hbCIpKSB7Ci0gICAgICAgIGFwX3NlcnZlcl90b2tlbnMgPSBTcnZUa19NSU47Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBhcF9zZXJ2ZXJfdG9rZW5zID0gU3J2VGtfRlVMTDsKLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9saW1pdF9yZXFfbGluZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9UX0lOX0RJUl9MT0NfRklMRXxOT1RfSU5fTElNSVQpOwotICAgIGludCBsaW07Ci0KLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgbGltID0gYXRvaShhcmcpOwotICAgIGlmIChsaW0gPCAwKSB7Ci0gICAgICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+dGVtcF9wb29sLCAiTGltaXRSZXF1ZXN0TGluZSBcIiIsIGFyZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJcIiBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIiLCBOVUxMKTsKLSAgICB9Ci0gICAgaWYgKGxpbSA+IERFRkFVTFRfTElNSVRfUkVRVUVTVF9MSU5FKSB7Ci0gICAgICAgIHJldHVybiBhcF9wc3ByaW50ZihjbWQtPnRlbXBfcG9vbCwgIkxpbWl0UmVxdWVzdExpbmUgXCIlc1wiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJtdXN0IG5vdCBleGNlZWQgdGhlIHByZWNvbXBpbGVkIG1heGltdW0gb2YgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBERUZBVUxUX0xJTUlUX1JFUVVFU1RfTElORSk7Ci0gICAgfQotICAgIGNtZC0+c2VydmVyLT5saW1pdF9yZXFfbGluZSA9IGxpbTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9saW1pdF9yZXFfZmllbGRzaXplKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PVF9JTl9ESVJfTE9DX0ZJTEV8Tk9UX0lOX0xJTUlUKTsKLSAgICBpbnQgbGltOwotCi0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIGxpbSA9IGF0b2koYXJnKTsKLSAgICBpZiAobGltIDwgMCkgewotICAgICAgICByZXR1cm4gYXBfcHN0cmNhdChjbWQtPnRlbXBfcG9vbCwgIkxpbWl0UmVxdWVzdEZpZWxkc2l6ZSBcIiIsIGFyZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJcIiBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgKDAgPSBubyBsaW1pdCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICB9Ci0gICAgaWYgKGxpbSA+IERFRkFVTFRfTElNSVRfUkVRVUVTVF9GSUVMRFNJWkUpIHsKLSAgICAgICAgcmV0dXJuIGFwX3BzcHJpbnRmKGNtZC0+dGVtcF9wb29sLCAiTGltaXRSZXF1ZXN0RmllbGRzaXplIFwiJXNcIiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJtdXN0IG5vdCBleGNlZWQgdGhlIHByZWNvbXBpbGVkIG1heGltdW0gb2YgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBERUZBVUxUX0xJTUlUX1JFUVVFU1RfRklFTERTSVpFKTsKLSAgICB9Ci0gICAgY21kLT5zZXJ2ZXItPmxpbWl0X3JlcV9maWVsZHNpemUgPSBsaW07Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbGltaXRfcmVxX2ZpZWxkcyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9UX0lOX0RJUl9MT0NfRklMRXxOT1RfSU5fTElNSVQpOwotICAgIGludCBsaW07Ci0KLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgbGltID0gYXRvaShhcmcpOwotICAgIGlmIChsaW0gPCAwKSB7Ci0gICAgICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+dGVtcF9wb29sLCAiTGltaXRSZXF1ZXN0RmllbGRzIFwiIiwgYXJnLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciAoMCA9IG5vIGxpbWl0KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIH0KLSAgICBjbWQtPnNlcnZlci0+bGltaXRfcmVxX2ZpZWxkcyA9IGxpbTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9saW1pdF9yZXFfYm9keShjbWRfcGFybXMgKmNtZCwgY29yZV9kaXJfY29uZmlnICpjb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgTk9UX0lOX0xJTUlUKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBXVEY6IElmIHN0cnRvdWwgaXMgbm90IHBvcnRhYmxlLCB0aGVuIHdyaXRlIGEgcmVwbGFjZW1lbnQuCi0gICAgICogICAgICBJbnN0ZWFkIHdlIGhhdmUgYW4gaWRpb3RpYyBkZWZpbmUgaW4gaHR0cGQuaCB0aGF0IHByZXZlbnRzCi0gICAgICogICAgICBpdCBmcm9tIGJlaW5nIHVzZWQgZXZlbiB3aGVuIGl0IGlzIGF2YWlsYWJsZS4gU2hlZXNoLgotICAgICAqLwotICAgIGNvbmYtPmxpbWl0X3JlcV9ib2R5ID0gKHVuc2lnbmVkIGxvbmcpc3RydG9sKGFyZywgKGNoYXIgKiopTlVMTCwgMTApOwotICAgIHJldHVybiBOVUxMOwotfQotCi0jaWZkZWYgV0lOMzIKLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfaW50ZXJwcmV0ZXJfc291cmNlKGNtZF9wYXJtcyAqY21kLCBjb3JlX2Rpcl9jb25maWcgKmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICphcmcpCi17Ci0gICAgaWYgKCFzdHJjYXNlY21wKGFyZywgInJlZ2lzdHJ5IikpIHsKLSAgICAgICAgZC0+c2NyaXB0X2ludGVycHJldGVyX3NvdXJjZSA9IElOVEVSUFJFVEVSX1NPVVJDRV9SRUdJU1RSWTsKLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZywgInNjcmlwdCIpKSB7Ci0gICAgICAgIGQtPnNjcmlwdF9pbnRlcnByZXRlcl9zb3VyY2UgPSBJTlRFUlBSRVRFUl9TT1VSQ0VfU0hFQkFORzsKLSAgICB9IGVsc2UgewotICAgICAgICBkLT5zY3JpcHRfaW50ZXJwcmV0ZXJfc291cmNlID0gSU5URVJQUkVURVJfU09VUkNFX1NIRUJBTkc7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotI2VuZGlmCi0KLS8qIE5vdGUgLS0tIEVycm9yRG9jdW1lbnQgd2lsbCBub3cgd29yayBmcm9tIC5odGFjY2VzcyBmaWxlcy4gIAotICogVGhlIEFsbG93T3ZlcnJpZGUgb2YgRmlsZWluZm8gYWxsb3dzIHdlYm1hc3RlcnMgdG8gdHVybiBpdCBvZmYKLSAqLwotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgY29yZV9jbWRzW10gPSB7Ci0KLS8qIE9sZCBhY2Nlc3MgY29uZmlnIGZpbGUgY29tbWFuZHMgKi8KLQoteyAiPERpcmVjdG9yeSIsIGRpcnNlY3Rpb24sIE5VTEwsIFJTUkNfQ09ORiwgUkFXX0FSR1MsCi0gICJDb250YWluZXIgZm9yIGRpcmVjdGl2ZXMgYWZmZWN0aW5nIHJlc291cmNlcyBsb2NhdGVkIGluIHRoZSBzcGVjaWZpZWQgIgotICAiZGlyZWN0b3JpZXMiIH0sCi17IGVuZF9kaXJlY3Rvcnlfc2VjdGlvbiwgZW5kX25lc3RlZF9zZWN0aW9uLCBOVUxMLCBBQ0NFU1NfQ09ORiwgTk9fQVJHUywKLSAgIk1hcmtzIGVuZCBvZiA8RGlyZWN0b3J5PiIgfSwKLXsgIjxMb2NhdGlvbiIsIHVybHNlY3Rpb24sIE5VTEwsIFJTUkNfQ09ORiwgUkFXX0FSR1MsCi0gICJDb250YWluZXIgZm9yIGRpcmVjdGl2ZXMgYWZmZWN0aW5nIHJlc291cmNlcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSAiCi0gICJzcGVjaWZpZWQgVVJMIHBhdGhzIiB9LAoteyBlbmRfbG9jYXRpb25fc2VjdGlvbiwgZW5kX25lc3RlZF9zZWN0aW9uLCBOVUxMLCBBQ0NFU1NfQ09ORiwgTk9fQVJHUywKLSAgIk1hcmtzIGVuZCBvZiA8TG9jYXRpb24+IiB9LAoteyAiPFZpcnR1YWxIb3N0IiwgdmlydHVhbGhvc3Rfc2VjdGlvbiwgTlVMTCwgUlNSQ19DT05GLCBSQVdfQVJHUywKLSAgIkNvbnRhaW5lciB0byBtYXAgZGlyZWN0aXZlcyB0byBhIHBhcnRpY3VsYXIgdmlydHVhbCBob3N0LCB0YWtlcyBvbmUgb3IgIgotICAibW9yZSBob3N0IGFkZHJlc3NlcyIgfSwKLXsgZW5kX3ZpcnR1YWxob3N0X3NlY3Rpb24sIGVuZF9uZXN0ZWRfc2VjdGlvbiwgTlVMTCwgUlNSQ19DT05GLCBOT19BUkdTLAotICAiTWFya3MgZW5kIG9mIDxWaXJ0dWFsSG9zdD4iIH0sCi17ICI8RmlsZXMiLCBmaWxlc2VjdGlvbiwgTlVMTCwgT1JfQUxMLCBSQVdfQVJHUywgIkNvbnRhaW5lciBmb3IgZGlyZWN0aXZlcyAiCi0gICJhZmZlY3RpbmcgZmlsZXMgbWF0Y2hpbmcgc3BlY2lmaWVkIHBhdHRlcm5zIiB9LAoteyBlbmRfZmlsZXNfc2VjdGlvbiwgZW5kX25lc3RlZF9zZWN0aW9uLCBOVUxMLCBPUl9BTEwsIE5PX0FSR1MsCi0gICJNYXJrcyBlbmQgb2YgPEZpbGVzPiIgfSwKLXsgIjxMaW1pdCIsIGFwX2xpbWl0X3NlY3Rpb24sIE5VTEwsIE9SX0FMTCwgUkFXX0FSR1MsICJDb250YWluZXIgZm9yICIKLSAgImF1dGhlbnRpY2F0aW9uIGRpcmVjdGl2ZXMgd2hlbiBhY2Nlc3NlZCB1c2luZyBzcGVjaWZpZWQgSFRUUCBtZXRob2RzIiB9LAoteyAiPC9MaW1pdD4iLCBlbmRsaW1pdF9zZWN0aW9uLCBOVUxMLCBPUl9BTEwsIE5PX0FSR1MsCi0gICJNYXJrcyBlbmQgb2YgPExpbWl0PiIgfSwKLXsgIjxMaW1pdEV4Y2VwdCIsIGFwX2xpbWl0X3NlY3Rpb24sICh2b2lkKikxLCBPUl9BTEwsIFJBV19BUkdTLAotICAiQ29udGFpbmVyIGZvciBhdXRoZW50aWNhdGlvbiBkaXJlY3RpdmVzIHRvIGJlIGFwcGxpZWQgd2hlbiBhbnkgSFRUUCAiCi0gICJtZXRob2Qgb3RoZXIgdGhhbiB0aG9zZSBzcGVjaWZpZWQgaXMgdXNlZCB0byBhY2Nlc3MgdGhlIHJlc291cmNlIiB9LAoteyAiPC9MaW1pdEV4Y2VwdD4iLCBlbmRsaW1pdF9zZWN0aW9uLCAodm9pZCopMSwgT1JfQUxMLCBOT19BUkdTLAotICAiTWFya3MgZW5kIG9mIDxMaW1pdEV4Y2VwdD4iIH0sCi17ICI8SWZNb2R1bGUiLCBzdGFydF9pZm1vZCwgTlVMTCwgT1JfQUxMLCBUQUtFMSwKLSAgIkNvbnRhaW5lciBmb3IgZGlyZWN0aXZlcyBiYXNlZCBvbiBleGlzdGFuY2Ugb2Ygc3BlY2lmaWVkIG1vZHVsZXMiIH0sCi17IGVuZF9pZm1vZHVsZV9zZWN0aW9uLCBlbmRfaWZtb2QsIE5VTEwsIE9SX0FMTCwgTk9fQVJHUywKLSAgIk1hcmtzIGVuZCBvZiA8SWZNb2R1bGU+IiB9LAoteyAiPElmRGVmaW5lIiwgc3RhcnRfaWZkZWZpbmUsIE5VTEwsIE9SX0FMTCwgVEFLRTEsCi0gICJDb250YWluZXIgZm9yIGRpcmVjdGl2ZXMgYmFzZWQgb24gZXhpc3RhbmNlIG9mIGNvbW1hbmQgbGluZSBkZWZpbmVzIiB9LAoteyBlbmRfaWZkZWZpbmVfc2VjdGlvbiwgZW5kX2lmZGVmaW5lLCBOVUxMLCBPUl9BTEwsIE5PX0FSR1MsCi0gICJNYXJrcyBlbmQgb2YgPElmRGVmaW5lPiIgfSwKLXsgIjxEaXJlY3RvcnlNYXRjaCIsIGRpcnNlY3Rpb24sICh2b2lkKikxLCBSU1JDX0NPTkYsIFJBV19BUkdTLAotICAiQ29udGFpbmVyIGZvciBkaXJlY3RpdmVzIGFmZmVjdGluZyByZXNvdXJjZXMgbG9jYXRlZCBpbiB0aGUgIgotICAic3BlY2lmaWVkIGRpcmVjdG9yaWVzIiB9LAoteyBlbmRfZGlyZWN0b3J5bWF0Y2hfc2VjdGlvbiwgZW5kX25lc3RlZF9zZWN0aW9uLCBOVUxMLCBBQ0NFU1NfQ09ORiwgTk9fQVJHUywKLSAgIk1hcmtzIGVuZCBvZiA8RGlyZWN0b3J5TWF0Y2g+IiB9LAoteyAiPExvY2F0aW9uTWF0Y2giLCB1cmxzZWN0aW9uLCAodm9pZCopMSwgUlNSQ19DT05GLCBSQVdfQVJHUywKLSAgIkNvbnRhaW5lciBmb3IgZGlyZWN0aXZlcyBhZmZlY3RpbmcgcmVzb3VyY2VzIGFjY2Vzc2VkIHRocm91Z2ggdGhlICIKLSAgInNwZWNpZmllZCBVUkwgcGF0aHMiIH0sCi17IGVuZF9sb2NhdGlvbm1hdGNoX3NlY3Rpb24sIGVuZF9uZXN0ZWRfc2VjdGlvbiwgTlVMTCwgQUNDRVNTX0NPTkYsIE5PX0FSR1MsCi0gICJNYXJrcyBlbmQgb2YgPExvY2F0aW9uTWF0Y2g+IiB9LAoteyAiPEZpbGVzTWF0Y2giLCBmaWxlc2VjdGlvbiwgKHZvaWQqKTEsIE9SX0FMTCwgUkFXX0FSR1MsCi0gICJDb250YWluZXIgZm9yIGRpcmVjdGl2ZXMgYWZmZWN0aW5nIGZpbGVzIG1hdGNoaW5nIHNwZWNpZmllZCBwYXR0ZXJucyIgfSwKLXsgZW5kX2ZpbGVzbWF0Y2hfc2VjdGlvbiwgZW5kX25lc3RlZF9zZWN0aW9uLCBOVUxMLCBPUl9BTEwsIE5PX0FSR1MsCi0gICJNYXJrcyBlbmQgb2YgPEZpbGVzTWF0Y2g+IiB9LAoteyAiQXV0aFR5cGUiLCBhcF9zZXRfc3RyaW5nX3Nsb3QsCi0gICh2b2lkKilYdE9mZnNldE9mKGNvcmVfZGlyX2NvbmZpZywgYXBfYXV0aF90eXBlKSwgT1JfQVVUSENGRywgVEFLRTEsCi0gICJBbiBIVFRQIGF1dGhvcml6YXRpb24gdHlwZSAoZS5nLiwgXCJCYXNpY1wiKSIgfSwKLXsgIkF1dGhOYW1lIiwgc2V0X2F1dGhuYW1lLCBOVUxMLCBPUl9BVVRIQ0ZHLCBUQUtFMSwKLSAgIlRoZSBhdXRoZW50aWNhdGlvbiByZWFsbSAoZS5nLiBcIk1lbWJlcnMgT25seVwiKSIgfSwKLXsgIlJlcXVpcmUiLCByZXF1aXJlLCBOVUxMLCBPUl9BVVRIQ0ZHLCBSQVdfQVJHUywKLSAgIlNlbGVjdHMgd2hpY2ggYXV0aGVudGljYXRlZCB1c2VycyBvciBncm91cHMgbWF5IGFjY2VzcyBhIHByb3RlY3RlZCBzcGFjZSIgfSwKLXsgIlNhdGlzZnkiLCBzYXRpc2Z5LCBOVUxMLCBPUl9BVVRIQ0ZHLCBUQUtFMSwKLSAgImFjY2VzcyBwb2xpY3kgaWYgYm90aCBhbGxvdyBhbmQgcmVxdWlyZSB1c2VkICgnYWxsJyBvciAnYW55JykiIH0sICAgIAotI2lmZGVmIEdQUk9GCi17ICJHcHJvZkRpciIsIHNldF9ncHJvZl9kaXIsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJEaXJlY3RvcnkgdG8gcGxvcCBnbW9uLm91dCBmaWxlcyIgfSwKLSNlbmRpZgotCi0vKiBPbGQgcmVzb3VyY2UgY29uZmlnIGZpbGUgY29tbWFuZHMgKi8KLSAgCi17ICJBY2Nlc3NGaWxlTmFtZSIsIHNldF9hY2Nlc3NfbmFtZSwgTlVMTCwgUlNSQ19DT05GLCBSQVdfQVJHUywKLSAgIk5hbWUocykgb2YgcGVyLWRpcmVjdG9yeSBjb25maWcgZmlsZXMgKGRlZmF1bHQ6IC5odGFjY2VzcykiIH0sCi17ICJEb2N1bWVudFJvb3QiLCBzZXRfZG9jdW1lbnRfcm9vdCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIlJvb3QgZGlyZWN0b3J5IG9mIHRoZSBkb2N1bWVudCB0cmVlIiAgfSwKLXsgIkVycm9yRG9jdW1lbnQiLCBzZXRfZXJyb3JfZG9jdW1lbnQsIE5VTEwsIE9SX0ZJTEVJTkZPLCBSQVdfQVJHUywKLSAgIkNoYW5nZSByZXNwb25zZXMgZm9yIEhUVFAgZXJyb3JzIiB9LAoteyAiQWxsb3dPdmVycmlkZSIsIHNldF9vdmVycmlkZSwgTlVMTCwgQUNDRVNTX0NPTkYsIFJBV19BUkdTLAotICAiQ29udHJvbHMgd2hhdCBncm91cHMgb2YgZGlyZWN0aXZlcyBjYW4gYmUgY29uZmlndXJlZCBieSBwZXItZGlyZWN0b3J5ICIKLSAgImNvbmZpZyBmaWxlcyIgfSwKLXsgIk9wdGlvbnMiLCBzZXRfb3B0aW9ucywgTlVMTCwgT1JfT1BUSU9OUywgUkFXX0FSR1MsCi0gICJTZXQgYSBudW1iZXIgb2YgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBkaXJlY3RvcnkiIH0sCi17ICJEZWZhdWx0VHlwZSIsIGFwX3NldF9zdHJpbmdfc2xvdCwKLSAgKHZvaWQqKVh0T2Zmc2V0T2YgKGNvcmVfZGlyX2NvbmZpZywgYXBfZGVmYXVsdF90eXBlKSwKLSAgT1JfRklMRUlORk8sIFRBS0UxLCAidGhlIGRlZmF1bHQgTUlNRSB0eXBlIGZvciB1bnR5cGFibGUgZmlsZXMiIH0sCi0KLS8qIE9sZCBzZXJ2ZXIgY29uZmlnIGZpbGUgY29tbWFuZHMgKi8KLQoteyAiUG9ydCIsIHNlcnZlcl9wb3J0LCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLCAiQSBUQ1AgcG9ydCBudW1iZXIifSwKLXsgIkhvc3RuYW1lTG9va3VwcyIsIHNldF9ob3N0bmFtZV9sb29rdXBzLCBOVUxMLCBBQ0NFU1NfQ09ORnxSU1JDX0NPTkYsIFRBS0UxLAotICAiXCJvblwiIHRvIGVuYWJsZSwgXCJvZmZcIiB0byBkaXNhYmxlIHJldmVyc2UgRE5TIGxvb2t1cHMsIG9yIFwiZG91YmxlXCIgdG8gIgotICAiZW5hYmxlIGRvdWJsZS1yZXZlcnNlIEROUyBsb29rdXBzIiB9LAoteyAiU2VydmVyQWRtaW4iLCBzZXRfc2VydmVyX3N0cmluZ19zbG90LAotICAodm9pZCAqKVh0T2Zmc2V0T2YgKHNlcnZlcl9yZWMsIHNlcnZlcl9hZG1pbiksIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgc2VydmVyIGFkbWluaXN0cmF0b3IiIH0sCi17ICJTZXJ2ZXJOYW1lIiwgc2V0X3NlcnZlcl9zdHJpbmdfc2xvdCwKLSAgKHZvaWQgKilYdE9mZnNldE9mIChzZXJ2ZXJfcmVjLCBzZXJ2ZXJfaG9zdG5hbWUpLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiVGhlIGhvc3RuYW1lIG9mIHRoZSBzZXJ2ZXIiIH0sCi17ICJTZXJ2ZXJTaWduYXR1cmUiLCBzZXRfc2lnbmF0dXJlX2ZsYWcsIE5VTEwsIE9SX0FMTCwgVEFLRTEsCi0gICJFbi0vZGlzYWJsZSBzZXJ2ZXIgc2lnbmF0dXJlIChvbnxvZmZ8ZW1haWwpIiB9LAoteyAiU2VydmVyUm9vdCIsIHNldF9zZXJ2ZXJfcm9vdCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIkNvbW1vbiBkaXJlY3Rvcnkgb2Ygc2VydmVyLXJlbGF0ZWQgZmlsZXMgKGxvZ3MsIGNvbmZzLCBldGMuKSIgfSwKLXsgIkVycm9yTG9nIiwgc2V0X3NlcnZlcl9zdHJpbmdfc2xvdCwKLSAgKHZvaWQgKilYdE9mZnNldE9mIChzZXJ2ZXJfcmVjLCBlcnJvcl9mbmFtZSksIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJUaGUgZmlsZW5hbWUgb2YgdGhlIGVycm9yIGxvZyIgfSwKLXsgIkFjY2Vzc0NvbmZpZyIsIHNldF9zZXJ2ZXJfc3RyaW5nX3Nsb3QsCi0gICh2b2lkICopWHRPZmZzZXRPZiAoc2VydmVyX3JlYywgYWNjZXNzX2NvbmZuYW1lKSwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIlRoZSBmaWxlbmFtZSBvZiB0aGUgYWNjZXNzIGNvbmZpZyBmaWxlIiB9LAoteyAiUmVzb3VyY2VDb25maWciLCBzZXRfc2VydmVyX3N0cmluZ19zbG90LAotICAodm9pZCAqKVh0T2Zmc2V0T2YgKHNlcnZlcl9yZWMsIHNybV9jb25mbmFtZSksIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJUaGUgZmlsZW5hbWUgb2YgdGhlIHJlc291cmNlIGNvbmZpZyBmaWxlIiB9LAoteyAiU2VydmVyQWxpYXMiLCBzZXRfc2VydmVyX2FsaWFzLCBOVUxMLCBSU1JDX0NPTkYsIFJBV19BUkdTLAotICAiQSBuYW1lIG9yIG5hbWVzIGFsdGVybmF0ZWx5IHVzZWQgdG8gYWNjZXNzIHRoZSBzZXJ2ZXIiIH0sCi17ICJTZXJ2ZXJQYXRoIiwgc2V0X3NlcnZlcnBhdGgsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJUaGUgcGF0aG5hbWUgdGhlIHNlcnZlciBjYW4gYmUgcmVhY2hlZCBhdCIgfSwKLXsgIlRpbWVvdXQiLCBzZXRfdGltZW91dCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwgIlRpbWVvdXQgZHVyYXRpb24gKHNlYykiIH0sCi17ICJLZWVwQWxpdmVUaW1lb3V0Iiwgc2V0X2tlZXBfYWxpdmVfdGltZW91dCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIktlZXAtQWxpdmUgdGltZW91dCBkdXJhdGlvbiAoc2VjKSJ9LAoteyAiTWF4S2VlcEFsaXZlUmVxdWVzdHMiLCBzZXRfa2VlcF9hbGl2ZV9tYXgsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJNYXhpbXVtIG51bWJlciBvZiBLZWVwLUFsaXZlIHJlcXVlc3RzIHBlciBjb25uZWN0aW9uLCBvciAwIGZvciBpbmZpbml0ZSIgfSwKLXsgIktlZXBBbGl2ZSIsIHNldF9rZWVwX2FsaXZlLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiV2hldGhlciBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIHNob3VsZCBiZSBPbiBvciBPZmYiIH0sCi17ICJJZGVudGl0eUNoZWNrIiwgc2V0X2lkY2hlY2ssIE5VTEwsIFJTUkNfQ09ORnxBQ0NFU1NfQ09ORiwgRkxBRywKLSAgIkVuYWJsZSBpZGVudGQgKFJGQyAxNDEzKSB1c2VyIGxvb2t1cHMgLSBTTE9XIiB9LAoteyAiQ29udGVudERpZ2VzdCIsIHNldF9jb250ZW50X21kNSwgTlVMTCwgT1JfT1BUSU9OUywKLSAgRkxBRywgIndoZXRoZXIgb3Igbm90IHRvIHNlbmQgYSBDb250ZW50LU1ENSBoZWFkZXIgd2l0aCBlYWNoIHJlcXVlc3QiIH0sCi17ICJVc2VDYW5vbmljYWxOYW1lIiwgc2V0X3VzZV9jYW5vbmljYWxfbmFtZSwgTlVMTCwKLSAgUlNSQ19DT05GfEFDQ0VTU19DT05GLCBUQUtFMSwKLSAgIkhvdyB0byB3b3JrIG91dCB0aGUgU2VydmVyTmFtZSA6IFBvcnQgd2hlbiBjb25zdHJ1Y3RpbmcgVVJMcyIgfSwKLS8qIFRPRE9DOiBNYXhTZXJ2ZXJzIGlzIGRlcHJlY2F0ZWQgKi8KLS8qIFRPRE9DOiBTZXJ2ZXJzU2FmZXR5TGltaXQgaXMgZGVwcmVjYXRlZCAqLwotLyogVE9ETzogUmxpbWl0Rm9vIHNob3VsZCBhbGwgYmUgcGFydCBvZiBtb2RfY2dpLCBub3QgaW4gdGhlIGNvcmUgKi8KLS8qIFRPRE9DOiBCaW5kQWRkcmVzcyBkZXByZWNhdGVkICovCi17ICJBZGRNb2R1bGUiLCBhZGRfbW9kdWxlX2NvbW1hbmQsIE5VTEwsIFJTUkNfQ09ORiwgSVRFUkFURSwKLSAgIlRoZSBuYW1lIG9mIGEgbW9kdWxlIiB9LAoteyAiQ2xlYXJNb2R1bGVMaXN0IiwgY2xlYXJfbW9kdWxlX2xpc3RfY29tbWFuZCwgTlVMTCwgUlNSQ19DT05GLCBOT19BUkdTLCAKLSAgTlVMTCB9LAotLyogVE9ETzogTGlzdGVuQmFja2xvZyBpbiBNUE0gKi8KLXsgIkluY2x1ZGUiLCBpbmNsdWRlX2NvbmZpZywgTlVMTCwgKFJTUkNfQ09ORiB8IEFDQ0VTU19DT05GKSwgVEFLRTEsCi0gICJOYW1lIG9mIHRoZSBjb25maWcgZmlsZSB0byBiZSBpbmNsdWRlZCIgfSwKLXsgIkxvZ0xldmVsIiwgc2V0X2xvZ2xldmVsLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiTGV2ZWwgb2YgdmVyYm9zaXR5IGluIGVycm9yIGxvZ2dpbmciIH0sCi17ICJOYW1lVmlydHVhbEhvc3QiLCBhcF9zZXRfbmFtZV92aXJ0dWFsX2hvc3QsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJBIG51bWVyaWMgSVAgYWRkcmVzczpwb3J0LCBvciB0aGUgbmFtZSBvZiBhIGhvc3QiIH0sCi0jaWZkZWYgX09TRF9QT1NJWAoteyAiQlMyMDAwQWNjb3VudCIsIHNldF9iczIwMDBfYWNjb3VudCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIk5hbWUgb2Ygc2VydmVyIFVzZXIncyBiczIwMDAgbG9nb24gYWNjb3VudCBuYW1lIiB9LAotI2VuZGlmCi0jaWZkZWYgV0lOMzIKLXsgIlNjcmlwdEludGVycHJldGVyU291cmNlIiwgc2V0X2ludGVycHJldGVyX3NvdXJjZSwgTlVMTCwgT1JfRklMRUlORk8sIFRBS0UxLAotICAiV2hlcmUgdG8gZmluZCBpbnRlcnByZXRlciB0byBydW4gV2luMzIgc2NyaXB0cyAoUmVnaXN0cnkgb3Igc2NyaXB0IHNoZWJhbmcgbGluZSkiIH0sCi0jZW5kaWYKLXsgIlNlcnZlclRva2VucyIsIHNldF9zZXJ2X3Rva2VucywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIkRldGVybWluZSB0b2tlbnMgZGlzcGxheWVkIGluIHRoZSBTZXJ2ZXI6IGhlYWRlciAtIE1pbihpbWFsKSwgT1Mgb3IgRnVsbCIgfSwKLXsgIkxpbWl0UmVxdWVzdExpbmUiLCBzZXRfbGltaXRfcmVxX2xpbmUsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJMaW1pdCBvbiBtYXhpbXVtIHNpemUgb2YgYW4gSFRUUCByZXF1ZXN0IGxpbmUifSwKLXsgIkxpbWl0UmVxdWVzdEZpZWxkc2l6ZSIsIHNldF9saW1pdF9yZXFfZmllbGRzaXplLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiTGltaXQgb24gbWF4aW11bSBzaXplIG9mIGFuIEhUVFAgcmVxdWVzdCBoZWFkZXIgZmllbGQifSwKLXsgIkxpbWl0UmVxdWVzdEZpZWxkcyIsIHNldF9saW1pdF9yZXFfZmllbGRzLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiTGltaXQgKDAgPSB1bmxpbWl0ZWQpIG9uIG1heCBudW1iZXIgb2YgaGVhZGVyIGZpZWxkcyBpbiBhIHJlcXVlc3QgbWVzc2FnZSJ9LAoteyAiTGltaXRSZXF1ZXN0Qm9keSIsIHNldF9saW1pdF9yZXFfYm9keSwKLSAgKHZvaWQqKVh0T2Zmc2V0T2YoY29yZV9kaXJfY29uZmlnLCBsaW1pdF9yZXFfYm9keSksCi0gIE9SX0FMTCwgVEFLRTEsCi0gICJMaW1pdCAoaW4gYnl0ZXMpIG9uIG1heGltdW0gc2l6ZSBvZiByZXF1ZXN0IG1lc3NhZ2UgYm9keSIgfSwKLXsgTlVMTCB9Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3JlIGhhbmRsZXJzIGZvciB2YXJpb3VzIHBoYXNlcyBvZiBzZXJ2ZXIgb3BlcmF0aW9uLi4uCi0gKi8KLQotc3RhdGljIGludCBjb3JlX3RyYW5zbGF0ZShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICB2b2lkICpzY29uZiA9IHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZzsKLSAgICBjb3JlX3NlcnZlcl9jb25maWcgKmNvbmYgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzY29uZiwgJmNvcmVfbW9kdWxlKTsKLSAgCi0gICAgaWYgKHItPnByb3h5cmVxKSB7Ci0gICAgICAgIHJldHVybiBIVFRQX0ZPUkJJRERFTjsKLSAgICB9Ci0gICAgaWYgKChyLT51cmlbMF0gIT0gJy8nKSAmJiBzdHJjbXAoci0+dXJpLCAiKiIpKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLQkJICAgICAiSW52YWxpZCBVUkkgaW4gcmVxdWVzdCAlcyIsIHItPnRoZV9yZXF1ZXN0KTsKLQlyZXR1cm4gQkFEX1JFUVVFU1Q7Ci0gICAgfQotICAgIAotICAgIGlmIChyLT5zZXJ2ZXItPnBhdGggCi0JJiYgIXN0cm5jbXAoci0+dXJpLCByLT5zZXJ2ZXItPnBhdGgsIHItPnNlcnZlci0+cGF0aGxlbikKLQkmJiAoci0+c2VydmVyLT5wYXRoW3ItPnNlcnZlci0+cGF0aGxlbiAtIDFdID09ICcvJwotCSAgICB8fCByLT51cmlbci0+c2VydmVyLT5wYXRobGVuXSA9PSAnLycKLQkgICAgfHwgci0+dXJpW3ItPnNlcnZlci0+cGF0aGxlbl0gPT0gJ1wwJykpIHsKLSAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIGNvbmYtPmFwX2RvY3VtZW50X3Jvb3QsCi0JCQkJIChyLT51cmkgKyByLT5zZXJ2ZXItPnBhdGhsZW4pLCBOVUxMKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JLyoKLSAgICAgICAgICogTWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90IG1lc3MgdXAgdGhlIHRyYW5zbGF0aW9uIGJ5IGFkZGluZyB0d28KLSAgICAgICAgICogLydzIGluIGEgcm93LiAgVGhpcyBoYXBwZW5zIHVuZGVyIHdpbmRvd3Mgd2hlbiB0aGUgZG9jdW1lbnQKLSAgICAgICAgICogcm9vdCBlbmRzIHdpdGggYSAvCi0gICAgICAgICAqLwotICAgICAgICBpZiAoKGNvbmYtPmFwX2RvY3VtZW50X3Jvb3Rbc3RybGVuKGNvbmYtPmFwX2RvY3VtZW50X3Jvb3QpLTFdID09ICcvJykKLQkgICAgJiYgKCooci0+dXJpKSA9PSAnLycpKSB7Ci0JICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCBjb25mLT5hcF9kb2N1bWVudF9yb290LCByLT51cmkrMSwKLQkJCQkgICAgIE5VTEwpOwotCX0KLQllbHNlIHsKLQkgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIGNvbmYtPmFwX2RvY3VtZW50X3Jvb3QsIHItPnVyaSwKLQkJCQkgICAgIE5VTEwpOwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBpbnQgZG9fbm90aGluZyhyZXF1ZXN0X3JlYyAqcikgeyByZXR1cm4gT0s7IH0KLQotLyoKLSAqIERlZmF1bHQgaGFuZGxlciBmb3IgTUlNRSB0eXBlcyB3aXRob3V0IG90aGVyIGhhbmRsZXJzLiAgT25seSBHRVQKLSAqIGFuZCBPUFRJT05TIGF0IHRoaXMgcG9pbnQuLi4gYW55b25lIHdobyB3YW50cyB0byB3cml0ZSBhIGdlbmVyaWMKLSAqIGhhbmRsZXIgZm9yIFBVVCBvciBQT1NUIGlzIGZyZWUgdG8gZG8gc28sIGJ1dCBpdCBzZWVtcyB1bndpc2UgdG8gcHJvdmlkZQotICogYW55IGRlZmF1bHRzIHlldC4uLiBTbywgZm9yIG5vdywgd2UgYXNzdW1lIHRoYXQgdGhpcyB3aWxsIGFsd2F5cyBiZQotICogdGhlIGxhc3QgaGFuZGxlciBjYWxsZWQgYW5kIHJldHVybiA0MDUgb3IgNTAxLgotICovCi0KLXN0YXRpYyBpbnQgZGVmYXVsdF9oYW5kbGVyKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvcmVfZGlyX2NvbmZpZyAqZCA9Ci0JICAgIChjb3JlX2Rpcl9jb25maWcgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywgJmNvcmVfbW9kdWxlKTsKLSAgICBpbnQgcmFuZ2VzdGF0dXMsIGVycnN0YXR1czsKLSAgICBhcF9maWxlX3QgKmZkID0gTlVMTDsKLSAgICBhcF9zdGF0dXNfdCBzdGF0dXM7Ci0jaWZkZWYgVVNFX01NQVBfRklMRVMKLSAgICBhcF9tbWFwX3QgKm1tID0gTlVMTDsKLSNlbmRpZgotI2lmZGVmIENIQVJTRVRfRUJDRElDCi0gICAgLyogVG8gbWFrZSBzZXJ2aW5nIG9mICJyYXcgQVNDSUkgdGV4dCIgZmlsZXMgZWFzeSAodGhleSBzZXJ2ZSBmYXN0ZXIKLSAgICAgKiBzaW5jZSB0aGV5IGRvbid0IGhhdmUgdG8gYmUgY29udmVydGVkIGZyb20gRUJDRElDKSwgYSBuZXcKLSAgICAgKiAibWFnaWMiIHR5cGUgcHJlZml4IHdhcyBpbnZlbnRlZDogdGV4dC94LWFzY2lpLXtwbGFpbixodG1sLC4uLn0KLSAgICAgKiBJZiB3ZSBkZXRlY3Qgb25lIG9mIHRoZXNlIGNvbnRlbnQgdHlwZXMgaGVyZSwgd2Ugc2ltcGx5IGNvcnJlY3QKLSAgICAgKiB0aGUgdHlwZSB0byB0aGUgcmVhbCB0ZXh0L3twbGFpbixodG1sLC4uLn0gdHlwZS4gT3RoZXJ3aXNlLCB3ZQotICAgICAqIHNldCBhIGZsYWcgdGhhdCB0cmFuc2xhdGlvbiBpcyByZXF1aXJlZCBsYXRlciBvbi4KLSAgICAgKi8KLSAgICBpbnQgY29udmVydF9mbGFnID0gYXBfY2hlY2tjb252KHIpOwotI2VuZGlmCi0KLSAgICAvKiBUaGlzIGhhbmRsZXIgaGFzIG5vIHVzZSBmb3IgYSByZXF1ZXN0IGJvZHkgKHlldCksIGJ1dCB3ZSBzdGlsbAotICAgICAqIG5lZWQgdG8gcmVhZCBhbmQgZGlzY2FyZCBpdCBpZiB0aGUgY2xpZW50IHNlbnQgb25lLgotICAgICAqLwotICAgIGlmICgoZXJyc3RhdHVzID0gYXBfZGlzY2FyZF9yZXF1ZXN0X2JvZHkocikpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnJzdGF0dXM7Ci0gICAgfQotCi0gICAgci0+YWxsb3dlZCB8PSAoMSA8PCBNX0dFVCkgfCAoMSA8PCBNX09QVElPTlMpOwotCi0gICAgaWYgKHItPm1ldGhvZF9udW1iZXIgPT0gTV9JTlZBTElEKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLQkJICAgICJJbnZhbGlkIG1ldGhvZCBpbiByZXF1ZXN0ICVzIiwgci0+dGhlX3JlcXVlc3QpOwotCXJldHVybiBOT1RfSU1QTEVNRU5URUQ7Ci0gICAgfQotICAgIGlmIChyLT5tZXRob2RfbnVtYmVyID09IE1fT1BUSU9OUykgewotICAgICAgICByZXR1cm4gYXBfc2VuZF9odHRwX29wdGlvbnMocik7Ci0gICAgfQotICAgIGlmIChyLT5tZXRob2RfbnVtYmVyID09IE1fUFVUKSB7Ci0gICAgICAgIHJldHVybiBNRVRIT0RfTk9UX0FMTE9XRUQ7Ci0gICAgfQotICAgIGlmIChyLT5maW5mby5wcm90ZWN0aW9uID09IDAgfHwgKHItPnBhdGhfaW5mbyAmJiAqci0+cGF0aF9pbmZvKSkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSfEFQTE9HX05PRVJSTk8sIDAsIHIsCi0JCSAgICAgICJGaWxlIGRvZXMgbm90IGV4aXN0OiAlcyIsci0+cGF0aF9pbmZvID8KLQkJICAgICAgYXBfcHN0cmNhdChyLT5wb29sLCByLT5maWxlbmFtZSwgci0+cGF0aF9pbmZvLCBOVUxMKQotCQkgICAgICA6IHItPmZpbGVuYW1lKTsKLQlyZXR1cm4gSFRUUF9OT1RfRk9VTkQ7Ci0gICAgfQotICAgIGlmIChyLT5tZXRob2RfbnVtYmVyICE9IE1fR0VUKSB7Ci0gICAgICAgIHJldHVybiBNRVRIT0RfTk9UX0FMTE9XRUQ7Ci0gICAgfQotCQotICAgIGlmICgoc3RhdHVzID0gYXBfb3BlbigmZmQsIHItPmZpbGVuYW1lLCBBUFJfUkVBRCB8IEFQUl9CSU5BUlksIDAsIHItPnBvb2wpKSAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgc3RhdHVzLCByLAotCQkgICAgICJmaWxlIHBlcm1pc3Npb25zIGRlbnkgc2VydmVyIGFjY2VzczogJXMiLCByLT5maWxlbmFtZSk7Ci0gICAgICAgIHJldHVybiBGT1JCSURERU47Ci0gICAgfQotICAgIGFwX3VwZGF0ZV9tdGltZShyLCByLT5maW5mby5tdGltZSk7Ci0gICAgYXBfc2V0X2xhc3RfbW9kaWZpZWQocik7Ci0gICAgYXBfc2V0X2V0YWcocik7Ci0gICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkFjY2VwdC1SYW5nZXMiLCAiYnl0ZXMiKTsKLSAgICBpZiAoKChlcnJzdGF0dXMgPSBhcF9tZWV0c19jb25kaXRpb25zKHIpKSAhPSBPSykKLQl8fCAoZXJyc3RhdHVzID0gYXBfc2V0X2NvbnRlbnRfbGVuZ3RoKHIsIHItPmZpbmZvLnNpemUpKSkgewotICAgICAgICBhcF9jbG9zZShmZCk7Ci0gICAgICAgIHJldHVybiBlcnJzdGF0dXM7Ci0gICAgfQotCi0jaWZkZWYgVVNFX01NQVBfRklMRVMKLSAgICBpZiAoKHItPmZpbmZvLnNpemUgPj0gTU1BUF9USFJFU0hPTEQpCi0JJiYgKHItPmZpbmZvLnNpemUgPCBNTUFQX0xJTUlUKQotCSYmICghci0+aGVhZGVyX29ubHkgfHwgKGQtPmNvbnRlbnRfbWQ1ICYgMSkpKSB7Ci0JLyogd2UgbmVlZCB0byBwcm90ZWN0IG91cnNlbHZlcyBpbiBjYXNlIHdlIGRpZSB3aGlsZSB3ZSd2ZSBnb3QgdGhlCi0gCSAqIGZpbGUgbW1hcHBlZCAqLwotICAgIGlmIChhcF9tbWFwX2NyZWF0ZSgmbW0sIGZkLCAwLCByLT5maW5mby5zaXplLCByLT5wb29sKSAhPSBBUFJfU1VDQ0VTUyl7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQ1JJVCwgZXJybm8sIHIsCi0JCQkgImRlZmF1bHRfaGFuZGxlcjogbW1hcCBmYWlsZWQ6ICVzIiwgci0+ZmlsZW5hbWUpOwotCSAgICBtbSA9IE5VTEw7Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLQltbSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1tID09IE5VTEwpIHsKLSNlbmRpZgotCi0jaWZkZWYgQ0hBUlNFVF9FQkNESUMKLQlpZiAoZC0+Y29udGVudF9tZDUgJiAxKSB7Ci0JICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJDb250ZW50LU1ENSIsCi0JCQkgIGFwX21kNWRpZ2VzdChyLT5wb29sLCBmZCwgY29udmVydF9mbGFnKSk7Ci0JfQotI2Vsc2UKLQlpZiAoZC0+Y29udGVudF9tZDUgJiAxKSB7Ci0JICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJDb250ZW50LU1ENSIsCi0JCQkgIGFwX21kNWRpZ2VzdChyLT5wb29sLCBmZCkpOwotCX0KLSNlbmRpZiAvKiBDSEFSU0VUX0VCQ0RJQyAqLwotCi0JcmFuZ2VzdGF0dXMgPSBhcF9zZXRfYnl0ZXJhbmdlKHIpOwotCi0JYXBfc2VuZF9odHRwX2hlYWRlcihyKTsKLQkKLQlpZiAoIXItPmhlYWRlcl9vbmx5KSB7Ci0JICAgIGlmICghcmFuZ2VzdGF0dXMpIHsKLQkJYXBfc2VuZF9mZChmZCwgcik7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCWxvbmcgICAgIGxlbmd0aDsKLSAgICAgICAgICAgICAgICBhcF9vZmZfdCBvZmZzZXQ7Ci0KLQkJd2hpbGUgKGFwX2VhY2hfYnl0ZXJhbmdlKHIsICZvZmZzZXQsICZsZW5ndGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoc3RhdHVzID0gYXBfc2VlayhmZCwgQVBSX1NFVCwgJm9mZnNldCkpICE9IEFQUl9TVUNDRVNTKSB7Ci0JCSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgc3RhdHVzLCByLT5zZXJ2ZXIsCi0JCQkJICAiZXJyb3IgYnl0ZXNlcnZpbmcgZmlsZTogJXMiLCByLT5maWxlbmFtZSk7Ci0JCQlhcF9jbG9zZShmZCk7Ci0JCQlyZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0JCSAgICB9Ci0JCSAgICBhcF9zZW5kX2ZkX2xlbmd0aChmZCwgciwgbGVuZ3RoKTsKLQkJfQotCSAgICB9Ci0JfQotCi0jaWZkZWYgVVNFX01NQVBfRklMRVMKLSAgICB9Ci0gICAgZWxzZSB7Ci0JY2hhciAqYWRkcjsKLSAgICBhcF9tbWFwX29mZnNldCgodm9pZCoqKSZhZGRyLCBtbSAsMCk7Ci0KLQlpZiAoZC0+Y29udGVudF9tZDUgJiAxKSB7Ci0JICAgIEFQX01ENV9DVFggY29udGV4dDsKLQkgICAgCi0JICAgIGFwX01ENUluaXQoJmNvbnRleHQpOwotCSAgICBhcF9NRDVVcGRhdGUoJmNvbnRleHQsIGFkZHIsICh1bnNpZ25lZCBpbnQpci0+ZmluZm8uc2l6ZSk7Ci0JICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJDb250ZW50LU1ENSIsCi0JCQkgIGFwX21kNWNvbnRleHRUbzY0KHItPnBvb2wsICZjb250ZXh0KSk7Ci0JfQotCi0JcmFuZ2VzdGF0dXMgPSBhcF9zZXRfYnl0ZXJhbmdlKHIpOwotCWFwX3NlbmRfaHR0cF9oZWFkZXIocik7Ci0JCi0JaWYgKCFyLT5oZWFkZXJfb25seSkgewotCSAgICBpZiAoIXJhbmdlc3RhdHVzKSB7Ci0JCWFwX3NlbmRfbW1hcChtbSwgciwgMCwgci0+ZmluZm8uc2l6ZSk7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCWFwX29mZl90IG9mZnNldDsKLQkJbG9uZyBsZW5ndGg7Ci0JCXdoaWxlIChhcF9lYWNoX2J5dGVyYW5nZShyLCAmb2Zmc2V0LCAmbGVuZ3RoKSkgewotCQkgICAgYXBfc2VuZF9tbWFwKG1tLCByLCBvZmZzZXQsIGxlbmd0aCk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0jZW5kaWYKLQotICAgIGFwX2Nsb3NlKGZkKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyBjb25zdCBoYW5kbGVyX3JlYyBjb3JlX2hhbmRsZXJzW10gPSB7Ci17ICIqLyoiLCBkZWZhdWx0X2hhbmRsZXIgfSwKLXsgImRlZmF1bHQtaGFuZGxlciIsIGRlZmF1bHRfaGFuZGxlciB9LAoteyBOVUxMLCBOVUxMIH0KLX07Ci0KLXN0YXRpYyB2b2lkIGNvcmVfb3Blbl9sb2dzKGFwX2NvbnRleHRfdCAqcGNvbmYsIGFwX2NvbnRleHRfdCAqcGxvZywgYXBfY29udGV4dF90ICpwdGVtcCwgc2VydmVyX3JlYyAqcykKLXsKLSAgICBhcF9vcGVuX2xvZ3MocywgcGNvbmYpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqY29yZV9tZXRob2QoY29uc3QgcmVxdWVzdF9yZWMgKnIpCi0gICAgeyByZXR1cm4gImh0dHAiOyB9Ci0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBjb3JlX3BvcnQoY29uc3QgcmVxdWVzdF9yZWMgKnIpCi0gICAgeyByZXR1cm4gREVGQVVMVF9IVFRQX1BPUlQ7IH0KLQotc3RhdGljIHZvaWQgcmVnaXN0ZXJfaG9va3Modm9pZCkKLXsKLSAgICBhcF9ob29rX3RyYW5zbGF0ZV9uYW1lKGNvcmVfdHJhbnNsYXRlLE5VTEwsTlVMTCxIT09LX1JFQUxMWV9MQVNUKTsKLSAgICBhcF9ob29rX3Byb2Nlc3NfY29ubmVjdGlvbihhcF9wcm9jZXNzX2h0dHBfY29ubmVjdGlvbixOVUxMLE5VTEwsCi0JCQkgICAgICAgSE9PS19SRUFMTFlfTEFTVCk7Ci0gICAgYXBfaG9va19odHRwX21ldGhvZChjb3JlX21ldGhvZCxOVUxMLE5VTEwsSE9PS19SRUFMTFlfTEFTVCk7Ci0gICAgYXBfaG9va19kZWZhdWx0X3BvcnQoY29yZV9wb3J0LE5VTEwsTlVMTCxIT09LX1JFQUxMWV9MQVNUKTsKLSAgICBhcF9ob29rX29wZW5fbG9ncyhjb3JlX29wZW5fbG9ncyxOVUxMLE5VTEwsSE9PS19NSURETEUpOwotICAgIC8qIEZJWE1FOiBJIHN1c3BlY3Qgd2UgY2FuIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3IgdGhlc2UgLSBCZW4gKi8KLSAgICBhcF9ob29rX3R5cGVfY2hlY2tlcihkb19ub3RoaW5nLE5VTEwsTlVMTCxIT09LX1JFQUxMWV9MQVNUKTsKLSAgICBhcF9ob29rX2FjY2Vzc19jaGVja2VyKGRvX25vdGhpbmcsTlVMTCxOVUxMLEhPT0tfUkVBTExZX0xBU1QpOwotfQotCi1BUElfVkFSX0VYUE9SVCBtb2R1bGUgY29yZV9tb2R1bGUgPSB7Ci0gICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCi0gICAgY3JlYXRlX2NvcmVfZGlyX2NvbmZpZywJLyogY3JlYXRlIHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZSAqLwotICAgIG1lcmdlX2NvcmVfZGlyX2NvbmZpZ3MsCS8qIG1lcmdlIHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgICBjcmVhdGVfY29yZV9zZXJ2ZXJfY29uZmlnLAkvKiBjcmVhdGUgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlICovCi0gICAgbWVyZ2VfY29yZV9zZXJ2ZXJfY29uZmlncywJLyogbWVyZ2UgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIGNvcmVfY21kcywJCQkvKiBjb21tYW5kIGFwX3RhYmxlX3QgKi8KLSAgICBjb3JlX2hhbmRsZXJzLAkJLyogaGFuZGxlcnMgKi8KLSAgICByZWdpc3Rlcl9ob29rcwkJLyogcmVnaXN0ZXIgaG9va3MgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL2h0dHAvaHR0cF9wcm90b2NvbC5jIGIvbW9kdWxlcy9odHRwL2h0dHBfcHJvdG9jb2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiYWIxNS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2h0dHAvaHR0cF9wcm90b2NvbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc4NyArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIGh0dHBfcHJvdG9jb2wuYyAtLS0gcm91dGluZXMgd2hpY2ggZGlyZWN0bHkgY29tbXVuaWNhdGUgd2l0aCB0aGUgY2xpZW50LgotICoKLSAqIENvZGUgb3JpZ2luYWxseSBieSBSb2IgTWNDb29sOyBtdWNoIHJlZG9uZSBieSBSb2JlcnQgUy4gVGhhdQotICogYW5kIHRoZSBBcGFjaGUgR3JvdXAuCi0gKi8KLQotI2RlZmluZSBDT1JFX1BSSVZBVEUKLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIgotI2luY2x1ZGUgImh0dHBfdmhvc3QuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIiAgICAgICAgICAgLyogRm9yIGVycm9ycyBkZXRlY3RlZCBpbiBiYXNpYyBhdXRoIGNvbW1vbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdXBwb3J0IGNvZGUuLi4gKi8KLSNpbmNsdWRlICJ1dGlsX2RhdGUuaCIgICAgICAgICAgLyogRm9yIHBhcnNlSFRUUGRhdGUgYW5kIEJBRF9EQVRFICovCi0jaW5jbHVkZSAibXBtX3N0YXR1cy5oIgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi1IT09LX1NUUlVDVCgKLQkgICAgSE9PS19MSU5LKHBvc3RfcmVhZF9yZXF1ZXN0KQotCSAgICBIT09LX0xJTksobG9nX3RyYW5zYWN0aW9uKQotCSAgICBIT09LX0xJTksoaHR0cF9tZXRob2QpCi0JICAgIEhPT0tfTElOSyhkZWZhdWx0X3BvcnQpCi0pCi0KLSNkZWZpbmUgU0VUX0JZVEVTX1NFTlQocikgXAotICBkbyB7IGlmIChyLT5zZW50X2JvZHljdCkgXAotICAgICAgICAgIGFwX2JnZXRvcHQgKHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQk9fQllURUNULCAmci0+Ynl0ZXNfc2VudCk7IFwKLSAgfSB3aGlsZSAoMCkKLQotCi1zdGF0aWMgaW50IHBhcnNlX2J5dGVyYW5nZShjaGFyICpyYW5nZSwgbG9uZyBjbGVuZ3RoLCBsb25nICpzdGFydCwgbG9uZyAqZW5kKQotewotICAgIGNoYXIgKmRhc2ggPSBzdHJjaHIocmFuZ2UsICctJyk7Ci0KLSAgICBpZiAoIWRhc2gpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKChkYXNoID09IHJhbmdlKSkgewotICAgICAgICAvKiBJbiB0aGUgZm9ybSAiLTUiICovCi0gICAgICAgICpzdGFydCA9IGNsZW5ndGggLSBhdG9sKGRhc2ggKyAxKTsKLSAgICAgICAgKmVuZCA9IGNsZW5ndGggLSAxOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgKmRhc2ggPSAnXDAnOwotICAgICAgICBkYXNoKys7Ci0gICAgICAgICpzdGFydCA9IGF0b2wocmFuZ2UpOwotICAgICAgICBpZiAoKmRhc2gpCi0gICAgICAgICAgICAqZW5kID0gYXRvbChkYXNoKTsKLSAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgLyogIjUtIiAqLwotICAgICAgICAgICAgKmVuZCA9IGNsZW5ndGggLSAxOwotICAgIH0KLQotICAgIGlmICgqc3RhcnQgPCAwKQotCSpzdGFydCA9IDA7Ci0KLSAgICBpZiAoKmVuZCA+PSBjbGVuZ3RoKQotICAgICAgICAqZW5kID0gY2xlbmd0aCAtIDE7Ci0KLSAgICBpZiAoKnN0YXJ0ID4gKmVuZCkKLQlyZXR1cm4gMDsKLQotICAgIHJldHVybiAoKnN0YXJ0ID4gMCB8fCAqZW5kIDwgY2xlbmd0aCAtIDEpOwotfQotCi1zdGF0aWMgaW50IGludGVybmFsX2J5dGVyYW5nZShpbnQsIGxvbmcgKiwgcmVxdWVzdF9yZWMgKiwgY29uc3QgY2hhciAqKiwKLQkJCSAgICAgIGFwX29mZl90ICosIGxvbmcgKik7Ci0KLUFQSV9FWFBPUlQoaW50KSBhcF9zZXRfYnl0ZXJhbmdlKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvbnN0IGNoYXIgKnJhbmdlLCAqaWZfcmFuZ2UsICptYXRjaDsKLSAgICBsb25nIHJhbmdlX3N0YXJ0LCByYW5nZV9lbmQ7Ci0KLSAgICBpZiAoIXItPmNsZW5ndGggfHwgci0+YXNzYmFja3dhcmRzKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIENoZWNrIGZvciBSYW5nZSByZXF1ZXN0LWhlYWRlciAoSFRUUC8xLjEpIG9yIFJlcXVlc3QtUmFuZ2UgZm9yCi0gICAgICogYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgd2l0aCBzZWNvbmQtZHJhZnQgTHVvdG9uZW4vRnJhbmtzCi0gICAgICogYnl0ZS1yYW5nZXMgKGUuZy4gTmV0c2NhcGUgTmF2aWdhdG9yIDItMykuCi0gICAgICoKLSAgICAgKiBXZSBzdXBwb3J0IHRoaXMgZm9ybSwgd2l0aCBSZXF1ZXN0LVJhbmdlLCBhbmQgKGZhcnRoZXIgZG93bikgd2UKLSAgICAgKiBzZW5kIG11bHRpcGFydC94LWJ5dGVyYW5nZXMgaW5zdGVhZCBvZiBtdWx0aXBhcnQvYnl0ZXJhbmdlcyBmb3IKLSAgICAgKiBSZXF1ZXN0LVJhbmdlIGJhc2VkIHJlcXVlc3RzIHRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIE5ldHNjYXBlCi0gICAgICogTmF2aWdhdG9yIDItMyBhbmQgTVNJRSAzLgotICAgICAqLwotCi0gICAgaWYgKCEocmFuZ2UgPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIlJhbmdlIikpKQotICAgICAgICByYW5nZSA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiUmVxdWVzdC1SYW5nZSIpOwotCi0gICAgaWYgKCFyYW5nZSB8fCBzdHJuY2FzZWNtcChyYW5nZSwgImJ5dGVzPSIsIDYpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIENoZWNrIHRoZSBJZi1SYW5nZSBoZWFkZXIgZm9yIEV0YWcgb3IgRGF0ZS4KLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBjaGVjayB3aWxsIHJldHVybiBmYWxzZSAoYXMgcmVxdWlyZWQpIGlmIGVpdGhlcgotICAgICAqIG9mIHRoZSB0d28gZXRhZ3MgYXJlIHdlYWsuCi0gICAgICovCi0gICAgaWYgKChpZl9yYW5nZSA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiSWYtUmFuZ2UiKSkpIHsKLSAgICAgICAgaWYgKGlmX3JhbmdlWzBdID09ICciJykgewotICAgICAgICAgICAgaWYgKCEobWF0Y2ggPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19vdXQsICJFdGFnIikpIHx8Ci0gICAgICAgICAgICAgICAgKHN0cmNtcChpZl9yYW5nZSwgbWF0Y2gpICE9IDApKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCEobWF0Y2ggPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19vdXQsICJMYXN0LU1vZGlmaWVkIikpIHx8Ci0gICAgICAgICAgICAgICAgIChzdHJjbXAoaWZfcmFuZ2UsIG1hdGNoKSAhPSAwKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmICghc3RyY2hyKHJhbmdlLCAnLCcpKSB7Ci0gICAgICAgIC8qIEEgc2luZ2xlIHJhbmdlICovCi0gICAgICAgIGlmICghcGFyc2VfYnl0ZXJhbmdlKGFwX3BzdHJkdXAoci0+cG9vbCwgcmFuZ2UgKyA2KSwgci0+Y2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhbmdlX3N0YXJ0LCAmcmFuZ2VfZW5kKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIHItPmJ5dGVyYW5nZSA9IDE7Ci0KLSAgICAgICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkNvbnRlbnQtUmFuZ2UiLAotCSAgICBhcF9wc3ByaW50ZihyLT5wb29sLCAiYnl0ZXMgJWxkLSVsZC8lbGQiLAotCQlyYW5nZV9zdGFydCwgcmFuZ2VfZW5kLCByLT5jbGVuZ3RoKSk7Ci0gICAgICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJDb250ZW50LUxlbmd0aCIsCi0JICAgIGFwX3BzcHJpbnRmKHItPnBvb2wsICIlbGQiLCByYW5nZV9lbmQgLSByYW5nZV9zdGFydCArIDEpKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIGEgbXVsdGlwbGUgcmFuZ2UgKi8KLSAgICAgICAgY29uc3QgY2hhciAqcl9yYW5nZSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgcmFuZ2UgKyA2KTsKLSAgICAgICAgbG9uZyB0bGVuZ3RoID0gMDsKLQotICAgICAgICByLT5ieXRlcmFuZ2UgPSAyOwotICAgICAgICByLT5ib3VuZGFyeSA9IGFwX3BzcHJpbnRmKHItPnBvb2wsICIlbHglbHgiLAotCQkJCXItPnJlcXVlc3RfdGltZSwgKGxvbmcpIGdldHBpZCgpKTsKLSAgICAgICAgd2hpbGUgKGludGVybmFsX2J5dGVyYW5nZSgwLCAmdGxlbmd0aCwgciwgJnJfcmFuZ2UsIE5VTEwsIE5VTEwpKTsKLSAgICAgICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkNvbnRlbnQtTGVuZ3RoIiwKLQkgICAgYXBfcHNwcmludGYoci0+cG9vbCwgIiVsZCIsIHRsZW5ndGgpKTsKLSAgICB9Ci0KLSAgICByLT5zdGF0dXMgPSBQQVJUSUFMX0NPTlRFTlQ7Ci0gICAgci0+cmFuZ2UgPSByYW5nZSArIDY7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX2VhY2hfYnl0ZXJhbmdlKHJlcXVlc3RfcmVjICpyLCBhcF9vZmZfdCAqb2Zmc2V0LAotCQkJCSAgbG9uZyAqbGVuZ3RoKQotewotICAgIHJldHVybiBpbnRlcm5hbF9ieXRlcmFuZ2UoMSwgTlVMTCwgciwgJnItPnJhbmdlLCBvZmZzZXQsIGxlbmd0aCk7Ci19Ci0KLS8qIElmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggcmVhbHJlcT0xLCBpdCB3aWxsIHNwaXQgb3V0Ci0gKiB0aGUgY29ycmVjdCBoZWFkZXJzIGZvciBhIGJ5dGVyYW5nZSBjaHVuaywgYW5kIHNldCBvZmZzZXQgYW5kCi0gKiBsZW5ndGggdG8gdGhlIHBvc2l0aW9ucyB0aGV5IHNob3VsZCBiZS4KLSAqCi0gKiBJZiBpdCBpcyBjYWxsZWQgd2l0aCByZWFscmVxPTAsIGl0IHdpbGwgYWRkIHRvIHRsZW5ndGggdGhlIGxlbmd0aAotICogaXQgKndvdWxkKiBoYXZlIHVzZWQgd2l0aCByZWFscmVxPTEuCi0gKgotICogRWl0aGVyIGNhc2Ugd2lsbCByZXR1cm4gMSBpZiBpdCBzaG91bGQgYmUgY2FsbGVkIGFnYWluLCBhbmQgMAotICogd2hlbiBkb25lLgotICovCi1zdGF0aWMgaW50IGludGVybmFsX2J5dGVyYW5nZShpbnQgcmVhbHJlcSwgbG9uZyAqdGxlbmd0aCwgcmVxdWVzdF9yZWMgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqcl9yYW5nZSwgYXBfb2ZmX3QgKm9mZnNldCwKLQkJCSAgICAgIGxvbmcgKmxlbmd0aCkKLXsKLSAgICBsb25nIHJhbmdlX3N0YXJ0LCByYW5nZV9lbmQ7Ci0gICAgY2hhciAqcmFuZ2U7Ci0KLSAgICBpZiAoISoqcl9yYW5nZSkgewotICAgICAgICBpZiAoci0+Ynl0ZXJhbmdlID4gMSkgewotICAgICAgICAgICAgaWYgKHJlYWxyZXEpCi0gICAgICAgICAgICAgICAgYXBfcnZwdXRzKHIsICJcMDE1XDAxMi0tIiwgci0+Ym91bmRhcnksICItLVwwMTVcMDEyIiwgTlVMTCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgKnRsZW5ndGggKz0gNCArIHN0cmxlbihyLT5ib3VuZGFyeSkgKyA0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJhbmdlID0gYXBfZ2V0d29yZChyLT5wb29sLCByX3JhbmdlLCAnLCcpOwotICAgIGlmICghcGFyc2VfYnl0ZXJhbmdlKHJhbmdlLCByLT5jbGVuZ3RoLCAmcmFuZ2Vfc3RhcnQsICZyYW5nZV9lbmQpKQotICAgICAgICAvKiBTa2lwIHRoaXMgb25lICovCi0gICAgICAgIHJldHVybiBpbnRlcm5hbF9ieXRlcmFuZ2UocmVhbHJlcSwgdGxlbmd0aCwgciwgcl9yYW5nZSwgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7Ci0KLSAgICBpZiAoci0+Ynl0ZXJhbmdlID4gMSkgewotICAgICAgICBjb25zdCBjaGFyICpjdCA9IHItPmNvbnRlbnRfdHlwZSA/IHItPmNvbnRlbnRfdHlwZSA6IGFwX2RlZmF1bHRfdHlwZShyKTsKLSAgICAgICAgY2hhciB0c1tNQVhfU1RSSU5HX0xFTl07Ci0KLSAgICAgICAgYXBfc25wcmludGYodHMsIHNpemVvZih0cyksICIlbGQtJWxkLyVsZCIsIHJhbmdlX3N0YXJ0LCByYW5nZV9lbmQsCi0gICAgICAgICAgICAgICAgICAgIHItPmNsZW5ndGgpOwotICAgICAgICBpZiAocmVhbHJlcSkKLSAgICAgICAgICAgIGFwX3J2cHV0cyhyLCAiXDAxNVwwMTItLSIsIHItPmJvdW5kYXJ5LCAiXDAxNVwwMTJDb250ZW50LXR5cGU6ICIsCi0gICAgICAgICAgICAgICAgICAgY3QsICJcMDE1XDAxMkNvbnRlbnQtcmFuZ2U6IGJ5dGVzICIsIHRzLCAiXDAxNVwwMTJcMDE1XDAxMiIsCi0gICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICp0bGVuZ3RoICs9IDQgKyBzdHJsZW4oci0+Ym91bmRhcnkpICsgMTYgKyBzdHJsZW4oY3QpICsgMjMgKwotICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKHRzKSArIDQ7Ci0gICAgfQotCi0gICAgaWYgKHJlYWxyZXEpIHsKLSAgICAgICAgKm9mZnNldCA9IHJhbmdlX3N0YXJ0OwotICAgICAgICAqbGVuZ3RoID0gcmFuZ2VfZW5kIC0gcmFuZ2Vfc3RhcnQgKyAxOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgKnRsZW5ndGggKz0gcmFuZ2VfZW5kIC0gcmFuZ2Vfc3RhcnQgKyAxOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX3NldF9jb250ZW50X2xlbmd0aChyZXF1ZXN0X3JlYyAqciwgbG9uZyBjbGVuZ3RoKQotewotICAgIHItPmNsZW5ndGggPSBjbGVuZ3RoOwotICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJDb250ZW50LUxlbmd0aCIsIGFwX3BzcHJpbnRmKHItPnBvb2wsICIlbGQiLCBjbGVuZ3RoKSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLUFQSV9FWFBPUlQoaW50KSBhcF9zZXRfa2VlcGFsaXZlKHJlcXVlc3RfcmVjICpyKQotewotICAgIGludCBrYV9zZW50ID0gMDsKLSAgICBpbnQgd2ltcHkgPSBhcF9maW5kX3Rva2VuKHItPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19vdXQsICJDb25uZWN0aW9uIiksICJjbG9zZSIpOwotICAgIGNvbnN0IGNoYXIgKmNvbm4gPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIkNvbm5lY3Rpb24iKTsKLQotICAgIC8qIFRoZSBmb2xsb3dpbmcgY29udm9sdXRlZCBjb25kaXRpb25hbCBkZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90Ci0gICAgICogdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBzaG91bGQgcmVtYWluIHBlcnNpc3RlbnQgYWZ0ZXIgdGhpcyByZXNwb25zZQotICAgICAqIChhLmsuYS4gSFRUUCBLZWVwLUFsaXZlKSBhbmQgd2hldGhlciBvciBub3QgdGhlIG91dHB1dCBtZXNzYWdlCi0gICAgICogYm9keSBzaG91bGQgdXNlIHRoZSBIVFRQLzEuMSBjaHVua2VkIHRyYW5zZmVyLWNvZGluZy4gIEluIEVuZ2xpc2gsCi0gICAgICoKLSAgICAgKiAgIElGICB3ZSBoYXZlIG5vdCBtYXJrZWQgdGhpcyBjb25uZWN0aW9uIGFzIGVycm9yZWQ7Ci0gICAgICogICBhbmQgdGhlIHJlc3BvbnNlIGJvZHkgaGFzIGEgZGVmaW5lZCBsZW5ndGggZHVlIHRvIHRoZSBzdGF0dXMgY29kZQotICAgICAqICAgICAgIGJlaW5nIDMwNCBvciAyMDQsIHRoZSByZXF1ZXN0IG1ldGhvZCBiZWluZyBIRUFELCBhbHJlYWR5Ci0gICAgICogICAgICAgaGF2aW5nIGRlZmluZWQgQ29udGVudC1MZW5ndGggb3IgVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQsIG9yCi0gICAgICogICAgICAgdGhlIHJlcXVlc3QgdmVyc2lvbiBiZWluZyBIVFRQLzEuMSBhbmQgdGh1cyBjYXBhYmxlIG9mIGJlaW5nIHNldAotICAgICAqICAgICAgIGFzIGNodW5rZWQgW3dlIGtub3cgdGhlIChyLT5jaHVua2VkID0gMSkgc2lkZS1lZmZlY3QgaXMgdWdseV07Ci0gICAgICogICBhbmQgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGVuYWJsZXMga2VlcC1hbGl2ZTsKLSAgICAgKiAgIGFuZCB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gaGFzIGEgcmVhc29uYWJsZSBpbnRlci1yZXF1ZXN0IHRpbWVvdXQ7Ci0gICAgICogICBhbmQgdGhlcmUgaXMgbm8gbWF4aW11bSAjIHJlcXVlc3RzIG9yIHRoZSBtYXggaGFzbid0IGJlZW4gcmVhY2hlZDsKLSAgICAgKiAgIGFuZCB0aGUgcmVzcG9uc2Ugc3RhdHVzIGRvZXMgbm90IHJlcXVpcmUgYSBjbG9zZTsKLSAgICAgKiAgIGFuZCB0aGUgcmVzcG9uc2UgZ2VuZXJhdG9yIGhhcyBub3QgYWxyZWFkeSBpbmRpY2F0ZWQgY2xvc2U7Ci0gICAgICogICBhbmQgdGhlIGNsaWVudCBkaWQgbm90IHJlcXVlc3Qgbm9uLXBlcnNpc3RlbmNlIChDb25uZWN0aW9uOiBjbG9zZSk7Ci0gICAgICogICBhbmQgICAgd2UgaGF2ZW4ndCBiZWVuIGNvbmZpZ3VyZWQgdG8gaWdub3JlIHRoZSBidWdneSB0d2l0Ci0gICAgICogICAgICAgb3IgdGhleSdyZSBhIGJ1Z2d5IHR3aXQgY29taW5nIHRocm91Z2ggYSBIVFRQLzEuMSBwcm94eQotICAgICAqICAgYW5kICAgIHRoZSBjbGllbnQgaXMgcmVxdWVzdGluZyBhbiBIVFRQLzEuMC1zdHlsZSBrZWVwLWFsaXZlCi0gICAgICogICAgICAgb3IgdGhlIGNsaWVudCBjbGFpbXMgdG8gYmUgSFRUUC8xLjEgY29tcGxpYW50IChwZXJoYXBzIGEgcHJveHkpOwotICAgICAqICAgVEhFTiB3ZSBjYW4gYmUgcGVyc2lzdGVudCwgd2hpY2ggcmVxdWlyZXMgbW9yZSBoZWFkZXJzIGJlIG91dHB1dC4KLSAgICAgKgotICAgICAqIE5vdGUgdGhhdCB0aGUgY29uZGl0aW9uIGV2YWx1YXRpb24gb3JkZXIgaXMgZXh0cmVtZWx5IGltcG9ydGFudC4KLSAgICAgKi8KLSAgICBpZiAoKHItPmNvbm5lY3Rpb24tPmtlZXBhbGl2ZSAhPSAtMSkgJiYKLSAgICAgICAgKChyLT5zdGF0dXMgPT0gSFRUUF9OT1RfTU9ESUZJRUQpIHx8Ci0gICAgICAgICAoci0+c3RhdHVzID09IEhUVFBfTk9fQ09OVEVOVCkgfHwKLSAgICAgICAgIHItPmhlYWRlcl9vbmx5IHx8Ci0gICAgICAgICBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19vdXQsICJDb250ZW50LUxlbmd0aCIpIHx8Ci0gICAgICAgICBhcF9maW5kX2xhc3RfdG9rZW4oci0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19vdXQsICJUcmFuc2Zlci1FbmNvZGluZyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJjaHVua2VkIikgfHwKLSAgICAgICAgICgoci0+cHJvdG9fbnVtID49IEhUVFBfVkVSU0lPTigxLDEpKSAmJgotCSAgKHItPmNodW5rZWQgPSAxKSkpICYmIC8qIFRISVMgQ09ERSBJUyBDT1JSRUNULCBzZWUgY29tbWVudCBhYm92ZS4gKi8KLSAgICAgICAgci0+c2VydmVyLT5rZWVwX2FsaXZlICYmCi0gICAgICAgIChyLT5zZXJ2ZXItPmtlZXBfYWxpdmVfdGltZW91dCA+IDApICYmCi0gICAgICAgICgoci0+c2VydmVyLT5rZWVwX2FsaXZlX21heCA9PSAwKSB8fAotICAgICAgICAgKHItPnNlcnZlci0+a2VlcF9hbGl2ZV9tYXggPiByLT5jb25uZWN0aW9uLT5rZWVwYWxpdmVzKSkgJiYKLSAgICAgICAgIWFwX3N0YXR1c19kcm9wc19jb25uZWN0aW9uKHItPnN0YXR1cykgJiYKLSAgICAgICAgIXdpbXB5ICYmCi0gICAgICAgICFhcF9maW5kX3Rva2VuKHItPnBvb2wsIGNvbm4sICJjbG9zZSIpICYmCi0gICAgICAgICghYXBfdGFibGVfZ2V0KHItPnN1YnByb2Nlc3NfZW52LCAibm9rZWVwYWxpdmUiKSB8fAotICAgICAgICAgYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJWaWEiKSkgJiYKLSAgICAgICAgKChrYV9zZW50ID0gYXBfZmluZF90b2tlbihyLT5wb29sLCBjb25uLCAia2VlcC1hbGl2ZSIpKSB8fAotICAgICAgICAgKHItPnByb3RvX251bSA+PSBIVFRQX1ZFUlNJT04oMSwxKSkpCi0gICAgICAgKSB7Ci0gICAgICAgIGludCBsZWZ0ID0gci0+c2VydmVyLT5rZWVwX2FsaXZlX21heCAtIHItPmNvbm5lY3Rpb24tPmtlZXBhbGl2ZXM7Ci0KLSAgICAgICAgci0+Y29ubmVjdGlvbi0+a2VlcGFsaXZlID0gMTsKLSAgICAgICAgci0+Y29ubmVjdGlvbi0+a2VlcGFsaXZlcysrOwotCi0gICAgICAgIC8qIElmIHRoZXkgc2VudCBhIEtlZXAtQWxpdmUgdG9rZW4sIHNlbmQgb25lIGJhY2sgKi8KLSAgICAgICAgaWYgKGthX3NlbnQpIHsKLSAgICAgICAgICAgIGlmIChyLT5zZXJ2ZXItPmtlZXBfYWxpdmVfbWF4KQotCQlhcF90YWJsZV9zZXRuKHItPmhlYWRlcnNfb3V0LCAiS2VlcC1BbGl2ZSIsCi0JCSAgICBhcF9wc3ByaW50ZihyLT5wb29sLCAidGltZW91dD0lZCwgbWF4PSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5zZXJ2ZXItPmtlZXBfYWxpdmVfdGltZW91dCwgbGVmdCkpOwotICAgICAgICAgICAgZWxzZQotCQlhcF90YWJsZV9zZXRuKHItPmhlYWRlcnNfb3V0LCAiS2VlcC1BbGl2ZSIsCi0JCSAgICBhcF9wc3ByaW50ZihyLT5wb29sLCAidGltZW91dD0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+c2VydmVyLT5rZWVwX2FsaXZlX3RpbWVvdXQpKTsKLSAgICAgICAgICAgIGFwX3RhYmxlX21lcmdlbihyLT5oZWFkZXJzX291dCwgIkNvbm5lY3Rpb24iLCAiS2VlcC1BbGl2ZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLyogT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIGluZGljYXRlIHRoYXQgd2Ugd2lsbCBiZSBjbG9zaW5nIHRoaXMKLSAgICAgKiBjb25uZWN0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjdXJyZW50IHJlc3BvbnNlLgotICAgICAqCi0gICAgICogV2Ugb25seSByZWFsbHkgbmVlZCB0byBzZW5kICJjbG9zZSIgdG8gSFRUUC8xLjEgY2xpZW50cywgYnV0IHdlCi0gICAgICogYWx3YXlzIHNlbmQgaXQgYW55d2F5LCBiZWNhdXNlIGEgYnJva2VuIHByb3h5IG1heSBpZGVudGlmeSBpdHNlbGYKLSAgICAgKiBhcyBIVFRQLzEuMCwgYnV0IHBhc3Mgb3VyIHJlcXVlc3QgYWxvbmcgd2l0aCBvdXIgSFRUUC8xLjEgdGFnCi0gICAgICogdG8gYSBIVFRQLzEuMSBjbGllbnQuIEJldHRlciBzYWZlIHRoYW4gc29ycnkuCi0gICAgICovCi0gICAgaWYgKCF3aW1weSkKLQlhcF90YWJsZV9tZXJnZW4oci0+aGVhZGVyc19vdXQsICJDb25uZWN0aW9uIiwgImNsb3NlIik7Ci0KLSAgICByLT5jb25uZWN0aW9uLT5rZWVwYWxpdmUgPSAwOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBSZXR1cm4gdGhlIGxhdGVzdCByYXRpb25hbCB0aW1lIGZyb20gYSByZXF1ZXN0L210aW1lIChtb2RpZmljYXRpb24gdGltZSkKLSAqIHBhaXIuICBXZSByZXR1cm4gdGhlIG10aW1lIHVubGVzcyBpdCdzIGluIHRoZSBmdXR1cmUsIGluIHdoaWNoIGNhc2Ugd2UKLSAqIHJldHVybiB0aGUgY3VycmVudCB0aW1lLiAgV2UgdXNlIHRoZSByZXF1ZXN0IHRpbWUgYXMgYSByZWZlcmVuY2UgaW4gb3JkZXIKLSAqIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY2FsbHMgdG8gdGltZSgpLiAgV2UgZG9uJ3QgY2hlY2sgZm9yIGZ1dHVyb3NpdHkKLSAqIHVubGVzcyB0aGUgbXRpbWUgaXMgYXQgbGVhc3QgYXMgbmV3IGFzIHRoZSByZWZlcmVuY2UuCi0gKi8KLUFQSV9FWFBPUlQoYXBfdGltZV90KSBhcF9yYXRpb25hbGl6ZV9tdGltZShyZXF1ZXN0X3JlYyAqciwgYXBfdGltZV90IG10aW1lKQotewotICAgIGFwX3RpbWVfdCBub3c7Ci0KLSAgICAvKiBGb3IgYWxsIHN0YXRpYyByZXNwb25zZXMsIGl0J3MgYWxtb3N0IGNlcnRhaW4gdGhhdCB0aGUgZmlsZSB3YXMKLSAgICAgKiBsYXN0IG1vZGlmaWVkIGJlZm9yZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZXF1ZXN0LiAgU28gdGhlcmUncwotICAgICAqIG5vIHJlYXNvbiB0byBjYWxsIHRpbWUoTlVMTCkgYWdhaW4uICBCdXQgaWYgdGhlIHJlc3BvbnNlIGhhcyBiZWVuCi0gICAgICogY3JlYXRlZCBvbiBkZW1hbmQsIHRoZW4gaXQgbWlnaHQgYmUgbmV3ZXIgdGhhbiB0aGUgdGltZSB0aGUgcmVxdWVzdAotICAgICAqIHN0YXJ0ZWQuICBJbiB0aGlzIGV2ZW50IHdlIHJlYWxseSBoYXZlIHRvIGNhbGwgdGltZShOVUxMKSBhZ2FpbgotICAgICAqIHNvIHRoYXQgd2UgY2FuIGdpdmUgdGhlIGNsaWVudHMgdGhlIG1vc3QgYWNjdXJhdGUgTGFzdC1Nb2RpZmllZC4gIElmIHdlCi0gICAgICogd2VyZSBnaXZlbiBhIHRpbWUgaW4gdGhlIGZ1dHVyZSwgd2UgcmV0dXJuIHRoZSBjdXJyZW50IHRpbWUgLSB0aGUKLSAgICAgKiBMYXN0LU1vZGlmaWVkIGNhbid0IGJlIGluIHRoZSBmdXR1cmUuCi0gICAgICovCi0gICAgbm93ID0gKG10aW1lIDwgci0+cmVxdWVzdF90aW1lKSA/IHItPnJlcXVlc3RfdGltZSA6IGFwX25vdygpOwotICAgIHJldHVybiAobXRpbWUgPiBub3cpID8gbm93IDogbXRpbWU7Ci19Ci0KLUFQSV9FWFBPUlQoaW50KSBhcF9tZWV0c19jb25kaXRpb25zKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvbnN0IGNoYXIgKmV0YWcgPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19vdXQsICJFVGFnIik7Ci0gICAgY29uc3QgY2hhciAqaWZfbWF0Y2gsICppZl9tb2RpZmllZF9zaW5jZSwgKmlmX3VubW9kaWZpZWQsICppZl9ub25lbWF0Y2g7Ci0gICAgYXBfdGltZV90IG10aW1lOwotCi0gICAgLyogQ2hlY2sgZm9yIGNvbmRpdGlvbmFsIHJlcXVlc3RzIC0tLSBub3RlIHRoYXQgd2Ugb25seSB3YW50IHRvIGRvCi0gICAgICogdGhpcyBpZiB3ZSBhcmUgc3VjY2Vzc2Z1bCBzbyBmYXIgYW5kIHdlIGFyZSBub3QgcHJvY2Vzc2luZyBhCi0gICAgICogc3VicmVxdWVzdCBvciBhbiBFcnJvckRvY3VtZW50LgotICAgICAqCi0gICAgICogVGhlIG9yZGVyIG9mIHRoZSBjaGVja3MgaXMgaW1wb3J0YW50LCBzaW5jZSBFVGFnIGNoZWNrcyBhcmUgc3VwcG9zZWQKLSAgICAgKiB0byBiZSBtb3JlIGFjY3VyYXRlIHRoYW4gY2hlY2tzIHJlbGF0aXZlIHRvIHRoZSBtb2RpZmljYXRpb24gdGltZS4KLSAgICAgKiBIb3dldmVyLCBub3QgYWxsIGRvY3VtZW50cyBhcmUgZ3VhcmFudGVlZCB0byAqaGF2ZSogRVRhZ3MsIGFuZCBzb21lCi0gICAgICogbWlnaHQgaGF2ZSBMYXN0LU1vZGlmaWVkIHZhbHVlcyB3L28gRVRhZ3MsIHNvIHRoaXMgZ2V0cyBhIGxpdHRsZQotICAgICAqIGNvbXBsaWNhdGVkLgotICAgICAqLwotCi0gICAgaWYgKCFhcF9pc19IVFRQX1NVQ0NFU1Moci0+c3RhdHVzKSB8fCByLT5ub19sb2NhbF9jb3B5KSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAvKiBYWFg6IHdlIHNob3VsZCBkZWZpbmUgYSAidGltZSB1bnNldCIgY29uc3RhbnQgKi8KLSAgICBtdGltZSA9IChyLT5tdGltZSAhPSAwKSA/IHItPm10aW1lIDogYXBfbm93KCk7Ci0KLSAgICAvKiBJZiBhbiBJZi1NYXRjaCByZXF1ZXN0LWhlYWRlciBmaWVsZCB3YXMgZ2l2ZW4KLSAgICAgKiBBTkQgdGhlIGZpZWxkIHZhbHVlIGlzIG5vdCAiKiIgKG1lYW5pbmcgbWF0Y2ggYW55dGhpbmcpCi0gICAgICogQU5EIGlmIG91ciBzdHJvbmcgRVRhZyBkb2VzIG5vdCBtYXRjaCBhbnkgZW50aXR5IHRhZyBpbiB0aGF0IGZpZWxkLAotICAgICAqICAgICByZXNwb25kIHdpdGggYSBzdGF0dXMgb2YgNDEyIChQcmVjb25kaXRpb24gRmFpbGVkKS4KLSAgICAgKi8KLSAgICBpZiAoKGlmX21hdGNoID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJJZi1NYXRjaCIpKSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChpZl9tYXRjaFswXSAhPSAnKicgJiYKLSAgICAgICAgICAgIChldGFnID09IE5VTEwgfHwgZXRhZ1swXSA9PSAnVycgfHwKLSAgICAgICAgICAgICAhYXBfZmluZF9saXN0X2l0ZW0oci0+cG9vbCwgaWZfbWF0Y2gsIGV0YWcpKSkgewotICAgICAgICAgICAgcmV0dXJuIEhUVFBfUFJFQ09ORElUSU9OX0ZBSUxFRDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogRWxzZSBpZiBhIHZhbGlkIElmLVVubW9kaWZpZWQtU2luY2UgcmVxdWVzdC1oZWFkZXIgZmllbGQgd2FzIGdpdmVuCi0gICAgICAgICAqIEFORCB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSB0aW1lCi0gICAgICAgICAqIHNwZWNpZmllZCBpbiB0aGlzIGZpZWxkLCB0aGVuIHRoZSBzZXJ2ZXIgTVVTVAotICAgICAgICAgKiAgICAgcmVzcG9uZCB3aXRoIGEgc3RhdHVzIG9mIDQxMiAoUHJlY29uZGl0aW9uIEZhaWxlZCkuCi0gICAgICAgICAqLwotICAgICAgICBpZl91bm1vZGlmaWVkID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJJZi1Vbm1vZGlmaWVkLVNpbmNlIik7Ci0gICAgICAgIGlmIChpZl91bm1vZGlmaWVkICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGFwX3RpbWVfdCBpdXMgPSBhcF9wYXJzZUhUVFBkYXRlKGlmX3VubW9kaWZpZWQpOwotCi0gICAgICAgICAgICBpZiAoKGl1cyAhPSBCQURfREFURSkgJiYgKG10aW1lID4gaXVzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBIVFRQX1BSRUNPTkRJVElPTl9GQUlMRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBJZiBhbiBJZi1Ob25lLU1hdGNoIHJlcXVlc3QtaGVhZGVyIGZpZWxkIHdhcyBnaXZlbgotICAgICAqIEFORCB0aGUgZmllbGQgdmFsdWUgaXMgIioiIChtZWFuaW5nIG1hdGNoIGFueXRoaW5nKQotICAgICAqICAgICBPUiBvdXIgRVRhZyBtYXRjaGVzIGFueSBvZiB0aGUgZW50aXR5IHRhZ3MgaW4gdGhhdCBmaWVsZCwgZmFpbC4KLSAgICAgKgotICAgICAqIElmIHRoZSByZXF1ZXN0IG1ldGhvZCB3YXMgR0VUIG9yIEhFQUQsIGZhaWx1cmUgbWVhbnMgdGhlIHNlcnZlcgotICAgICAqICAgIFNIT1VMRCByZXNwb25kIHdpdGggYSAzMDQgKE5vdCBNb2RpZmllZCkgcmVzcG9uc2UuCi0gICAgICogRm9yIGFsbCBvdGhlciByZXF1ZXN0IG1ldGhvZHMsIGZhaWx1cmUgbWVhbnMgdGhlIHNlcnZlciBNVVNUCi0gICAgICogICAgcmVzcG9uZCB3aXRoIGEgc3RhdHVzIG9mIDQxMiAoUHJlY29uZGl0aW9uIEZhaWxlZCkuCi0gICAgICoKLSAgICAgKiBHRVQgb3IgSEVBRCBhbGxvdyB3ZWFrIGV0YWcgY29tcGFyaXNvbiwgYWxsIG90aGVyIG1ldGhvZHMgcmVxdWlyZQotICAgICAqIHN0cm9uZyBjb21wYXJpc29uLiAgV2UgY2FuIG9ubHkgdXNlIHdlYWsgaWYgaXQncyBub3QgYSByYW5nZSByZXF1ZXN0LgotICAgICAqLwotICAgIGlmX25vbmVtYXRjaCA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiSWYtTm9uZS1NYXRjaCIpOwotICAgIGlmIChpZl9ub25lbWF0Y2ggIT0gTlVMTCkgewotICAgICAgICBpZiAoci0+bWV0aG9kX251bWJlciA9PSBNX0dFVCkgewotICAgICAgICAgICAgaWYgKGlmX25vbmVtYXRjaFswXSA9PSAnKicpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEhUVFBfTk9UX01PRElGSUVEOwotICAgICAgICAgICAgaWYgKGV0YWcgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChhcF90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIlJhbmdlIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV0YWdbMF0gIT0gJ1cnICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBhcF9maW5kX2xpc3RfaXRlbShyLT5wb29sLCBpZl9ub25lbWF0Y2gsIGV0YWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSFRUUF9OT1RfTU9ESUZJRUQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc3Ryc3RyKGlmX25vbmVtYXRjaCwgZXRhZykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhUVFBfTk9UX01PRElGSUVEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpZl9ub25lbWF0Y2hbMF0gPT0gJyonIHx8Ci0gICAgICAgICAgICAgICAgIChldGFnICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICAgIGFwX2ZpbmRfbGlzdF9pdGVtKHItPnBvb2wsIGlmX25vbmVtYXRjaCwgZXRhZykpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSFRUUF9QUkVDT05ESVRJT05fRkFJTEVEOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIEVsc2UgaWYgYSB2YWxpZCBJZi1Nb2RpZmllZC1TaW5jZSByZXF1ZXN0LWhlYWRlciBmaWVsZCB3YXMgZ2l2ZW4KLSAgICAgKiBBTkQgaXQgaXMgYSBHRVQgb3IgSEVBRCByZXF1ZXN0Ci0gICAgICogQU5EIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgaGFzIG5vdCBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSB0aW1lCi0gICAgICogc3BlY2lmaWVkIGluIHRoaXMgZmllbGQsIHRoZW4gdGhlIHNlcnZlciBNVVNUCi0gICAgICogICAgcmVzcG9uZCB3aXRoIGEgc3RhdHVzIG9mIDMwNCAoTm90IE1vZGlmaWVkKS4KLSAgICAgKiBBIGRhdGUgbGF0ZXIgdGhhbiB0aGUgc2VydmVyJ3MgY3VycmVudCByZXF1ZXN0IHRpbWUgaXMgaW52YWxpZC4KLSAgICAgKi8KLSAgICBlbHNlIGlmICgoci0+bWV0aG9kX251bWJlciA9PSBNX0dFVCkKLSAgICAgICAgICAgICAmJiAoKGlmX21vZGlmaWVkX3NpbmNlID0KLSAgICAgICAgICAgICAgICAgIGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiSWYtTW9kaWZpZWQtU2luY2UiKSkgIT0gTlVMTCkpIHsKLSAgICAgICAgYXBfdGltZV90IGltcyA9IGFwX3BhcnNlSFRUUGRhdGUoaWZfbW9kaWZpZWRfc2luY2UpOwotCi0JaWYgKChpbXMgPj0gbXRpbWUpICYmIChpbXMgPD0gci0+cmVxdWVzdF90aW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIEhUVFBfTk9UX01PRElGSUVEOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotLyoKLSAqIENvbnN0cnVjdCBhbiBlbnRpdHkgdGFnIChFVGFnKSBmcm9tIHJlc291cmNlIGluZm9ybWF0aW9uLiAgSWYgaXQncyBhIHJlYWwKLSAqIGZpbGUsIGJ1aWxkIGluIHNvbWUgb2YgdGhlIGZpbGUgY2hhcmFjdGVyaXN0aWNzLiAgSWYgdGhlIG1vZGlmaWNhdGlvbiB0aW1lCi0gKiBpcyBuZXdlciB0aGFuIChyZXF1ZXN0LXRpbWUgbWludXMgMSBzZWNvbmQpLCBtYXJrIHRoZSBFVGFnIGFzIHdlYWsgLSBpdAotICogY291bGQgYmUgbW9kaWZpZWQgYWdhaW4gaW4gYXMgc2hvcnQgYW4gaW50ZXJ2YWwuICBXZSByYXRpb25hbGl6ZSB0aGUKLSAqIG1vZGlmaWNhdGlvbiB0aW1lIHdlJ3JlIGdpdmVuIHRvIGtlZXAgaXQgZnJvbSBiZWluZyBpbiB0aGUgZnV0dXJlLgotICovCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfbWFrZV9ldGFnKHJlcXVlc3RfcmVjICpyLCBpbnQgZm9yY2Vfd2VhaykKLXsKLSAgICBjaGFyICpldGFnOwotICAgIGNoYXIgKndlYWs7Ci0KLSAgICAvKgotICAgICAqIE1ha2UgYW4gRVRhZyBoZWFkZXIgb3V0IG9mIHZhcmlvdXMgcGllY2VzIG9mIGluZm9ybWF0aW9uLiBXZSB1c2UKLSAgICAgKiB0aGUgbGFzdC1tb2RpZmllZCBkYXRlIGFuZCwgaWYgd2UgaGF2ZSBhIHJlYWwgZmlsZSwgdGhlCi0gICAgICogbGVuZ3RoIGFuZCBpbm9kZSBudW1iZXIgLSBub3RlIHRoYXQgdGhpcyBkb2Vzbid0IGhhdmUgdG8gbWF0Y2gKLSAgICAgKiB0aGUgY29udGVudC1sZW5ndGggKGkuZS4gaW5jbHVkZXMpLCBpdCBqdXN0IGhhcyB0byBiZSB1bmlxdWUKLSAgICAgKiBmb3IgdGhlIGZpbGUuCi0gICAgICoKLSAgICAgKiBJZiB0aGUgcmVxdWVzdCB3YXMgbWFkZSB3aXRoaW4gYSBzZWNvbmQgb2YgdGhlIGxhc3QtbW9kaWZpZWQgZGF0ZSwKLSAgICAgKiB3ZSBzZW5kIGEgd2VhayB0YWcgaW5zdGVhZCBvZiBhIHN0cm9uZyBvbmUsIHNpbmNlIGl0IGNvdWxkCi0gICAgICogYmUgbW9kaWZpZWQgYWdhaW4gbGF0ZXIgaW4gdGhlIHNlY29uZCwgYW5kIHRoZSB2YWxpZGF0aW9uCi0gICAgICogd291bGQgYmUgaW5jb3JyZWN0LgotICAgICAqLwotICAgIAotICAgIHdlYWsgPSAoKHItPnJlcXVlc3RfdGltZSAtIHItPm10aW1lID4gQVBfVVNFQ19QRVJfU0VDKSAmJiAhZm9yY2Vfd2VhaykgPyAiIiA6ICJXLyI7Ci0KLSAgICBpZiAoci0+ZmluZm8ucHJvdGVjdGlvbiAhPSAwKSB7Ci0gICAgICAgIGV0YWcgPSBhcF9wc3ByaW50ZihyLT5wb29sLAotICAgICAgICAgICAgICAgICAgICAiJXNcIiVseC0lbHgtJWx4XCIiLCB3ZWFrLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgci0+ZmluZm8uaW5vZGUsCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSByLT5maW5mby5zaXplLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgci0+bXRpbWUpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgZXRhZyA9IGFwX3BzcHJpbnRmKHItPnBvb2wsICIlc1wiJWx4XCIiLCB3ZWFrLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgci0+bXRpbWUpOwotICAgIH0KLQotICAgIHJldHVybiBldGFnOwotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX3NldF9ldGFnKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNoYXIgKmV0YWc7Ci0gICAgY2hhciAqdmFyaWFudF9ldGFnLCAqdmx2OwotICAgIGludCB2bHZfd2VhazsKLQotICAgIGlmICghci0+dmxpc3RfdmFsaWRhdG9yKSB7Ci0gICAgICAgIGV0YWcgPSBhcF9tYWtlX2V0YWcociwgMCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAvKiBJZiB3ZSBoYXZlIGEgdmFyaWFudCBsaXN0IHZhbGlkYXRvciAodmx2KSBkdWUgdG8gdGhlCi0gICAgICAgICAqIHJlc3BvbnNlIGJlaW5nIG5lZ290aWF0ZWQsIHRoZW4gd2UgY3JlYXRlIGEgc3RydWN0dXJlZAotICAgICAgICAgKiBlbnRpdHkgdGFnIHdoaWNoIG1lcmdlcyB0aGUgdmFyaWFudCBldGFnIHdpdGggdGhlIHZhcmlhbnQKLSAgICAgICAgICogbGlzdCB2YWxpZGF0b3IgKHZsdikuICBUaGlzIG1lcmdpbmcgbWFrZXMgcmV2YWxpZGF0aW9uCi0gICAgICAgICAqIHNvbWV3aGF0IHNhZmVyLCBlbnN1cmVzIHRoYXQgY2FjaGVzIHdoaWNoIGNhbiBkZWFsIHdpdGgKLSAgICAgICAgICogVmFyeSB3aWxsIChldmVudHVhbGx5KSBiZSB1cGRhdGVkIGlmIHRoZSBzZXQgb2YgdmFyaWFudHMgaXMKLSAgICAgICAgICogY2hhbmdlZCwgYW5kIGlzIGFsc28gYSBwcm90b2NvbCByZXF1aXJlbWVudCBmb3IgdHJhbnNwYXJlbnQKLSAgICAgICAgICogY29udGVudCBuZWdvdGlhdGlvbi4KLSAgICAgICAgICovCi0KLSAgICAgICAgLyogaWYgdGhlIHZhcmlhbnQgbGlzdCB2YWxpZGF0b3IgaXMgd2Vhaywgd2UgbWFrZSB0aGUgd2hvbGUKLSAgICAgICAgICogc3RydWN0dXJlZCBldGFnIHdlYWsuICBJZiB3ZSB3b3VsZCBub3QsIHRoZW4gY2xpZW50cyBjb3VsZAotICAgICAgICAgKiBoYXZlIHByb2JsZW1zIG1lcmdpbmcgcmFuZ2UgcmVzcG9uc2VzIGlmIHdlIGhhdmUgZGlmZmVyZW50Ci0gICAgICAgICAqIHZhcmlhbnRzIHdpdGggdGhlIHNhbWUgbm9uLWdsb2JhbGx5LXVuaXF1ZSBzdHJvbmcgZXRhZy4KLSAgICAgICAgICovCi0KLSAgICAgICAgdmx2ID0gci0+dmxpc3RfdmFsaWRhdG9yOwotICAgICAgICB2bHZfd2VhayA9ICh2bHZbMF0gPT0gJ1cnKTsKLSAgICAgICAgICAgICAgIAotICAgICAgICB2YXJpYW50X2V0YWcgPSBhcF9tYWtlX2V0YWcociwgdmx2X3dlYWspOwotCi0gICAgICAgIC8qIG1lcmdlIHZhcmlhbnRfZXRhZyBhbmQgdmx2IGludG8gYSBzdHJ1Y3R1cmVkIGV0YWcgKi8KLQotICAgICAgICB2YXJpYW50X2V0YWdbc3RybGVuKHZhcmlhbnRfZXRhZykgLSAxXSA9ICdcMCc7Ci0gICAgICAgIGlmICh2bHZfd2VhaykKLSAgICAgICAgICAgIHZsdiArPSAzOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2bHYrKzsKLSAgICAgICAgZXRhZyA9IGFwX3BzdHJjYXQoci0+cG9vbCwgdmFyaWFudF9ldGFnLCAiOyIsIHZsdiwgTlVMTCk7Ci0gICAgfQotCi0gICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkVUYWciLCBldGFnKTsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgTGFzdC1Nb2RpZmllZCBvdXRwdXQgaGVhZGVyIGZpZWxkIHRvIHRoZSB2YWx1ZQotICogb2YgdGhlIG10aW1lIGZpZWxkIGluIHRoZSByZXF1ZXN0IHN0cnVjdHVyZSAtIHJhdGlvbmFsaXplZCB0byBrZWVwIGl0IGZyb20KLSAqIGJlaW5nIGluIHRoZSBmdXR1cmUuCi0gKi8KLUFQSV9FWFBPUlQodm9pZCkgYXBfc2V0X2xhc3RfbW9kaWZpZWQocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgYXBfdGltZV90IG1vZF90aW1lID0gYXBfcmF0aW9uYWxpemVfbXRpbWUociwgci0+bXRpbWUpOwotICAgIGNoYXIgKmRhdGVzdHIgPSBhcF9wYWxsb2Moci0+cG9vbCwgQVBfUkZDODIyX0RBVEVfTEVOKTsKLSAgICBhcF9yZmM4MjJfZGF0ZShkYXRlc3RyLCBtb2RfdGltZSk7Ci0gICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkxhc3QtTW9kaWZpZWQiLCBkYXRlc3RyKTsKLX0KLQotLyogR2V0IHRoZSBtZXRob2QgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nLCBhc3N1bWVkIHRvCi0gKiBjb250YWluIGFuIEhUVFAgbWV0aG9kLiAgUmV0dXJucyBNX0lOVkFMSUQgaWYgbm90IHJlY29nbml6ZWQuCi0gKgotICogVGhpcyBpcyB0aGUgZmlyc3Qgc3RlcCB0b3dhcmQgcGxhY2luZyBtZXRob2QgbmFtZXMgaW4gYSBjb25maWd1cmFibGUKLSAqIGxpc3QuICBIb3BlZnVsbHkgaXQgKGFuZCBvdGhlciByb3V0aW5lcykgY2FuIGV2ZW50dWFsbHkgYmUgbW92ZWQgdG8KLSAqIHNvbWV0aGluZyBsaWtlIGEgbW9kX2h0dHBfbWV0aG9kcy5jLCBjb21wbGV0ZSB3aXRoIGNvbmZpZyBzdHVmZi4KLSAqLwotQVBJX0VYUE9SVChpbnQpIGFwX21ldGhvZF9udW1iZXJfb2YoY29uc3QgY2hhciAqbWV0aG9kKQotewotICAgIHN3aXRjaCAoKm1ldGhvZCkgewotICAgICAgICBjYXNlICdIJzoKLSAgICAgICAgICAgaWYgKHN0cmNtcChtZXRob2QsICJIRUFEIikgPT0gMCkKLSAgICAgICAgICAgICAgIHJldHVybiBNX0dFVDsgICAvKiBzZWUgaGVhZGVyX29ubHkgaW4gcmVxdWVzdF9yZWMgKi8KLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0cnOgotICAgICAgICAgICBpZiAoc3RyY21wKG1ldGhvZCwgIkdFVCIpID09IDApCi0gICAgICAgICAgICAgICByZXR1cm4gTV9HRVQ7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdQJzoKLSAgICAgICAgICAgaWYgKHN0cmNtcChtZXRob2QsICJQT1NUIikgPT0gMCkKLSAgICAgICAgICAgICAgIHJldHVybiBNX1BPU1Q7Ci0gICAgICAgICAgIGlmIChzdHJjbXAobWV0aG9kLCAiUFVUIikgPT0gMCkKLSAgICAgICAgICAgICAgIHJldHVybiBNX1BVVDsKLSAgICAgICAgICAgaWYgKHN0cmNtcChtZXRob2QsICJQQVRDSCIpID09IDApCi0gICAgICAgICAgICAgICByZXR1cm4gTV9QQVRDSDsKLSAgICAgICAgICAgaWYgKHN0cmNtcChtZXRob2QsICJQUk9QRklORCIpID09IDApCi0gICAgICAgICAgICAgICByZXR1cm4gTV9QUk9QRklORDsKLSAgICAgICAgICAgaWYgKHN0cmNtcChtZXRob2QsICJQUk9QUEFUQ0giKSA9PSAwKQotICAgICAgICAgICAgICAgcmV0dXJuIE1fUFJPUFBBVENIOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnRCc6Ci0gICAgICAgICAgIGlmIChzdHJjbXAobWV0aG9kLCAiREVMRVRFIikgPT0gMCkKLSAgICAgICAgICAgICAgIHJldHVybiBNX0RFTEVURTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0MnOgotICAgICAgICAgICBpZiAoc3RyY21wKG1ldGhvZCwgIkNPTk5FQ1QiKSA9PSAwKQotICAgICAgICAgICAgICAgcmV0dXJuIE1fQ09OTkVDVDsKLSAgICAgICAgICAgaWYgKHN0cmNtcChtZXRob2QsICJDT1BZIikgPT0gMCkKLSAgICAgICAgICAgICAgIHJldHVybiBNX0NPUFk7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdNJzoKLSAgICAgICAgICAgaWYgKHN0cmNtcChtZXRob2QsICJNS0NPTCIpID09IDApCi0gICAgICAgICAgICAgICByZXR1cm4gTV9NS0NPTDsKLSAgICAgICAgICAgaWYgKHN0cmNtcChtZXRob2QsICJNT1ZFIikgPT0gMCkKLSAgICAgICAgICAgICAgIHJldHVybiBNX01PVkU7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdPJzoKLSAgICAgICAgICAgaWYgKHN0cmNtcChtZXRob2QsICJPUFRJT05TIikgPT0gMCkKLSAgICAgICAgICAgICAgIHJldHVybiBNX09QVElPTlM7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdUJzoKLSAgICAgICAgICAgaWYgKHN0cmNtcChtZXRob2QsICJUUkFDRSIpID09IDApCi0gICAgICAgICAgICAgICByZXR1cm4gTV9UUkFDRTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0wnOgotICAgICAgICAgICBpZiAoc3RyY21wKG1ldGhvZCwgIkxPQ0siKSA9PSAwKQotICAgICAgICAgICAgICAgcmV0dXJuIE1fTE9DSzsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1UnOgotICAgICAgICAgICBpZiAoc3RyY21wKG1ldGhvZCwgIlVOTE9DSyIpID09IDApCi0gICAgICAgICAgICAgICByZXR1cm4gTV9VTkxPQ0s7Ci0gICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gTV9JTlZBTElEOwotfQotCi0vKiBHZXQgYSBsaW5lIG9mIHByb3RvY29sIGlucHV0LCBpbmNsdWRpbmcgYW55IGNvbnRpbnVhdGlvbiBsaW5lcwotICogY2F1c2VkIGJ5IE1JTUUgZm9sZGluZyAob3IgYnJva2VuIGNsaWVudHMpIGlmIGZvbGQgIT0gMCwgYW5kIHBsYWNlIGl0Ci0gKiBpbiB0aGUgYnVmZmVyIHMsIG9mIHNpemUgbiBieXRlcywgd2l0aG91dCB0aGUgZW5kaW5nIG5ld2xpbmUuCi0gKgotICogUmV0dXJucyAtMSBvbiBlcnJvciwgb3IgdGhlIGxlbmd0aCBvZiBzLgotICoKLSAqIE5vdGU6IEJlY2F1c2UgYmdldHMgdXNlcyAxIGNoYXIgZm9yIG5ld2xpbmUgYW5kIDEgY2hhciBmb3IgTlVMLAotICogICAgICAgdGhlIG1vc3Qgd2UgY2FuIGdldCBpcyAobiAtIDIpIGFjdHVhbCBjaGFyYWN0ZXJzIGlmIGl0Ci0gKiAgICAgICB3YXMgZW5kZWQgYnkgYSBuZXdsaW5lLCBvciAobiAtIDEpIGNoYXJhY3RlcnMgaWYgdGhlIGxpbmUKLSAqICAgICAgIGxlbmd0aCBleGNlZWRlZCAobiAtIDEpLiAgU28sIGlmIHRoZSByZXN1bHQgPT0gKG4gLSAxKSwKLSAqICAgICAgIHRoZW4gdGhlIGFjdHVhbCBpbnB1dCBsaW5lIGV4Y2VlZGVkIHRoZSBidWZmZXIgbGVuZ3RoLAotICogICAgICAgYW5kIGl0IHdvdWxkIGJlIGEgZ29vZCBpZGVhIGZvciB0aGUgY2FsbGVyIHRvIHB1a2UgNDAwIG9yIDQxNC4KLSAqLwotc3RhdGljIGludCBnZXRsaW5lKGNoYXIgKnMsIGludCBuLCBCVUZGICppbiwgaW50IGZvbGQpCi17Ci0gICAgY2hhciAqcG9zLCBuZXh0OwotICAgIGludCByZXR2YWw7Ci0gICAgaW50IHRvdGFsID0gMDsKLQotICAgIHBvcyA9IHM7Ci0KLSAgICBkbyB7Ci0gICAgICAgIHJldHZhbCA9IGFwX2JnZXRzKHBvcywgbiwgaW4pOwotICAgICAgIC8qIHJldHZhbCA9PSAtMSBpZiBlcnJvciwgMCBpZiBFT0YgKi8KLQotICAgICAgICBpZiAocmV0dmFsIDw9IDApCi0gICAgICAgICAgICByZXR1cm4gKChyZXR2YWwgPCAwKSAmJiAodG90YWwgPT0gMCkpID8gLTEgOiB0b3RhbDsKLQotICAgICAgICAvKiByZXR2YWwgaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQsIG5vdCBpbmNsdWRpbmcgTlVMICAgICAgKi8KLQotICAgICAgICBuIC09IHJldHZhbDsgICAgICAgICAgICAvKiBLZWVwIHRyYWNrIG9mIGhvdyBtdWNoIG9mIHMgaXMgZnVsbCAgICAgKi8KLSAgICAgICAgcG9zICs9IChyZXR2YWwgLSAxKTsgICAgLyogYW5kIHdoZXJlIHMgZW5kcyAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHRvdGFsICs9IHJldHZhbDsgICAgICAgIC8qIGFuZCBob3cgbG9uZyBzIGhhcyBiZWNvbWUgICAgICAgICAgICAgICAqLwotCi0gICAgICAgIGlmICgqcG9zID09ICdcbicpIHsgICAgIC8qIERpZCB3ZSBnZXQgYSBmdWxsIGxpbmUgb2YgaW5wdXQ/ICAgICAgICAqLwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRyaW0gYW55IGV4dHJhIHRyYWlsaW5nIHNwYWNlcyBvciB0YWJzIGV4Y2VwdCBmb3IgdGhlIGZpcnN0Ci0gICAgICAgICAgICAgKiBzcGFjZSBvciB0YWIgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGJsYW5rIHN0cmluZy4gIFRoaXMgbWFrZXMKLSAgICAgICAgICAgICAqIGl0IG11Y2ggZWFzaWVyIHRvIGNoZWNrIGZpZWxkIHZhbHVlcyBmb3IgZXhhY3QgbWF0Y2hlcywgYW5kCi0gICAgICAgICAgICAgKiBzYXZlcyBtZW1vcnkgYXMgd2VsbC4gIFRlcm1pbmF0ZSBzdHJpbmcgYXQgZW5kIG9mIGxpbmUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHdoaWxlIChwb3MgPiAocyArIDEpICYmICgqKHBvcyAtIDEpID09ICcgJyB8fCAqKHBvcyAtIDEpID09ICdcdCcpKSB7Ci0gICAgICAgICAgICAgICAgLS1wb3M7ICAgICAgICAgIC8qIHRyaW0gZXh0cmEgdHJhaWxpbmcgc3BhY2VzIG9yIHRhYnMgICAgICAqLwotICAgICAgICAgICAgICAgIC0tdG90YWw7ICAgICAgICAvKiBidXQgbm90IG9uZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGxpbmUgICAgKi8KLSAgICAgICAgICAgICAgICArK247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqcG9zID0gJ1wwJzsKLSAgICAgICAgICAgIC0tdG90YWw7Ci0gICAgICAgICAgICArK247Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIHRvdGFsOyAgICAgICAvKiBpZiBub3QsIGlucHV0IGxpbmUgZXhjZWVkZWQgYnVmZmVyIHNpemUgKi8KLQotICAgICAgICAvKiBDb250aW51ZSBhcHBlbmRpbmcgaWYgbGluZSBmb2xkaW5nIGlzIGRlc2lyZWQgYW5kCi0gICAgICAgICAqIHRoZSBsYXN0IGxpbmUgd2FzIG5vdCBlbXB0eSBhbmQgd2UgaGF2ZSByb29tIGluIHRoZSBidWZmZXIgYW5kCi0gICAgICAgICAqIHRoZSBuZXh0IGxpbmUgYmVnaW5zIHdpdGggYSBjb250aW51YXRpb24gY2hhcmFjdGVyLgotICAgICAgICAgKi8KLSAgICB9IHdoaWxlIChmb2xkICYmIChyZXR2YWwgIT0gMSkgJiYgKG4gPiAxKQotICAgICAgICAgICAgICAgICAgJiYgKG5leHQgPSBhcF9ibG9va2MoaW4pKQotICAgICAgICAgICAgICAgICAgJiYgKChuZXh0ID09ICcgJykgfHwgKG5leHQgPT0gJ1x0JykpKTsKLQotICAgIHJldHVybiB0b3RhbDsKLX0KLQotLyogcGFyc2VfdXJpOiBicmVhayBhcGFydCB0aGUgdXJpCi0gKiBTaWRlIEVmZmVjdHM6Ci0gKiAtIHNldHMgci0+YXJncyB0byByZXN0IGFmdGVyICc/JyAob3IgTlVMTCBpZiBubyAnPycpCi0gKiAtIHNldHMgci0+dXJpIHRvIHJlcXVlc3QgdXJpICh3aXRob3V0IHItPmFyZ3MgcGFydCkKLSAqIC0gc2V0cyByLT5ob3N0bmFtZSAoaWYgbm90IHNldCBhbHJlYWR5KSBmcm9tIHJlcXVlc3QgKHNjaGVtZTovL2hvc3Q6cG9ydCkKLSAqLwotQ09SRV9FWFBPUlQodm9pZCkgYXBfcGFyc2VfdXJpKHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICp1cmkpCi17Ci0gICAgaW50IHN0YXR1cyA9IEhUVFBfT0s7Ci0KLSAgICByLT51bnBhcnNlZF91cmkgPSBhcF9wc3RyZHVwKHItPnBvb2wsIHVyaSk7Ci0KLSAgICBpZiAoci0+bWV0aG9kX251bWJlciA9PSBNX0NPTk5FQ1QpIHsKLQlzdGF0dXMgPSBhcF9wYXJzZV9ob3N0aW5mb19jb21wb25lbnRzKHItPnBvb2wsIHVyaSwgJnItPnBhcnNlZF91cmkpOwotICAgIH0gZWxzZSB7Ci0JLyogU2ltcGxlIHN5bnRheCBFcnJvcnMgaW4gVVJMcyBhcmUgdHJhcHBlZCBieSBwYXJzZV91cmlfY29tcG9uZW50cygpLiAqLwotCXN0YXR1cyA9IGFwX3BhcnNlX3VyaV9jb21wb25lbnRzKHItPnBvb2wsIHVyaSwgJnItPnBhcnNlZF91cmkpOwotICAgIH0KLQotICAgIGlmIChhcF9pc19IVFRQX1NVQ0NFU1Moc3RhdHVzKSkgewotCS8qIGlmIGl0IGhhcyBhIHNjaGVtZSB3ZSBtYXkgbmVlZCB0byBkbyBhYnNvbHV0ZVVSSSB2aG9zdCBzdHVmZiAqLwotCWlmIChyLT5wYXJzZWRfdXJpLnNjaGVtZQotCSAgICAmJiAhc3RyY2FzZWNtcChyLT5wYXJzZWRfdXJpLnNjaGVtZSwgYXBfaHR0cF9tZXRob2QocikpKSB7Ci0JICAgIHItPmhvc3RuYW1lID0gci0+cGFyc2VkX3VyaS5ob3N0bmFtZTsKLQl9IGVsc2UgaWYgKHItPm1ldGhvZF9udW1iZXIgPT0gTV9DT05ORUNUKSB7Ci0JICAgIHItPmhvc3RuYW1lID0gci0+cGFyc2VkX3VyaS5ob3N0bmFtZTsKLQl9Ci0Jci0+YXJncyA9IHItPnBhcnNlZF91cmkucXVlcnk7Ci0Jci0+dXJpID0gci0+cGFyc2VkX3VyaS5wYXRoID8gci0+cGFyc2VkX3VyaS5wYXRoCi0JCQkJICAgIDogYXBfcHN0cmR1cChyLT5wb29sLCAiLyIpOwotI2lmIGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTjMyKQotCS8qIEhhbmRsZSBwYXRoIHRyYW5zbGF0aW9ucyBmb3IgT1MvMiBhbmQgcGx1ZyBzZWN1cml0eSBob2xlLgotCSAqIFRoaXMgd2lsbCBwcmV2ZW50ICJodHRwOi8vd3d3LndoZXJldmVyLmNvbS8uLlwuLlwvIiBmcm9tCi0JICogcmV0dXJuaW5nIGEgZGlyZWN0b3J5IGZvciB0aGUgcm9vdCBkcml2ZS4KLQkgKi8KLQl7Ci0JICAgIGNoYXIgKng7Ci0KLQkgICAgZm9yICh4ID0gci0+dXJpOyAoeCA9IHN0cmNocih4LCAnXFwnKSkgIT0gTlVMTDsgKQotCQkqeCA9ICcvJzsKLQl9Ci0jZW5kaWYgIC8qIE9TMiB8fCBXSU4zMiAqLwotICAgIH0KLSAgICBlbHNlIHsKLQlyLT5hcmdzID0gTlVMTDsKLQlyLT5ob3N0bmFtZSA9IE5VTEw7Ci0Jci0+c3RhdHVzID0gc3RhdHVzOyAgICAgICAgICAgICAvKiBzZXQgZXJyb3Igc3RhdHVzICovCi0Jci0+dXJpID0gYXBfcHN0cmR1cChyLT5wb29sLCB1cmkpOwotICAgIH0KLX0KLQotc3RhdGljIGludCByZWFkX3JlcXVlc3RfbGluZShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjaGFyIGxbREVGQVVMVF9MSU1JVF9SRVFVRVNUX0xJTkUgKyAyXTsgLyogZ2V0bGluZSdzIHR3byBleHRyYSBmb3IgXG5cMCAqLwotICAgIGNvbnN0IGNoYXIgKmxsID0gbDsKLSAgICBjb25zdCBjaGFyICp1cmk7Ci0gICAgY29ubl9yZWMgKmNvbm4gPSByLT5jb25uZWN0aW9uOwotICAgIGludCBtYWpvciA9IDEsIG1pbm9yID0gMDsgICAvKiBBc3N1bWUgSFRUUC8xLjAgaWYgbm9uLSJIVFRQIiBwcm90b2NvbCAqLwotICAgIGludCBsZW47Ci0KLSAgICAvKiBSZWFkIHBhc3QgZW1wdHkgbGluZXMgdW50aWwgd2UgZ2V0IGEgcmVhbCByZXF1ZXN0IGxpbmUsCi0gICAgICogYSByZWFkIGVycm9yLCB0aGUgY29ubmVjdGlvbiBjbG9zZXMgKEVPRiksIG9yIHdlIHRpbWVvdXQuCi0gICAgICoKLSAgICAgKiBXZSBza2lwIGVtcHR5IGxpbmVzIGJlY2F1c2UgYnJvd3NlcnMgaGF2ZSB0byB0YWNrIGEgQ1JMRiBvbiB0byB0aGUgZW5kCi0gICAgICogb2YgUE9TVHMgdG8gc3VwcG9ydCBvbGQgQ0VSTiB3ZWJzZXJ2ZXJzLiAgQnV0IG5vdGUgdGhhdCB3ZSBtYXkgbm90Ci0gICAgICogaGF2ZSBmbHVzaGVkIGFueSBwcmV2aW91cyByZXNwb25zZSBjb21wbGV0ZWx5IHRvIHRoZSBjbGllbnQgeWV0LgotICAgICAqIFdlIGRlbGF5IHRoZSBmbHVzaCBhcyBsb25nIGFzIHBvc3NpYmxlIHNvIHRoYXQgd2UgY2FuIGltcHJvdmUKLSAgICAgKiBwZXJmb3JtYW5jZSBmb3IgY2xpZW50cyB0aGF0IGFyZSBwaXBlbGluaW5nIHJlcXVlc3RzLiAgSWYgYSByZXF1ZXN0Ci0gICAgICogaXMgcGlwZWxpbmVkIHRoZW4gd2Ugd29uJ3QgYmxvY2sgZHVyaW5nIHRoZSAoaW1wbGljaXQpIHJlYWQoKSBiZWxvdy4KLSAgICAgKiBJZiB0aGUgcmVxdWVzdHMgYXJlbid0IHBpcGVsaW5lZCwgdGhlbiB0aGUgY2xpZW50IGlzIHN0aWxsIHdhaXRpbmcKLSAgICAgKiBmb3IgdGhlIGZpbmFsIGJ1ZmZlciBmbHVzaCBmcm9tIHVzLCBhbmQgd2Ugd2lsbCBibG9jayBpbiB0aGUgaW1wbGljaXQKLSAgICAgKiByZWFkKCkuICBCX1NBRkVSRUFEIGVuc3VyZXMgdGhhdCB0aGUgQlVGRiBsYXllciBmbHVzaGVzIGlmIGl0IHdpbGwKLSAgICAgKiBoYXZlIHRvIGJsb2NrIGR1cmluZyBhIHJlYWQuCi0gICAgICovCi0gICAgLyogVE9ETzogcmVpbXBsZW1lbnQgU0FGRVJFQUQgZXh0ZXJuYWwgdG8gQlVGRiB1c2luZyBhIGxheWVyICovCi0gICAgLyogLy9hcF9ic2V0ZmxhZyhjb25uLT5jbGllbnQsIEJfU0FGRVJFQUQsIDEpOyAqLwotICAgIGFwX2JmbHVzaChjb25uLT5jbGllbnQpOwotICAgIHdoaWxlICgobGVuID0gZ2V0bGluZShsLCBzaXplb2YobCksIGNvbm4tPmNsaWVudCwgMCkpIDw9IDApIHsKLSAgICAgICAgaWYgKChsZW4gPCAwKSB8fCBhcF9iZ2V0ZmxhZyhjb25uLT5jbGllbnQsIEJfRU9GKSkgewotCSAgICAvKiAvL2FwX2JzZXRmbGFnKGNvbm4tPmNsaWVudCwgQl9TQUZFUkVBRCwgMCk7ICovCi0JICAgIC8qIHRoaXMgaXMgYSBoYWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHJlcXVlc3QgdGltZSBpcyBzZXQsCi0JICAgICAqIGl0J3Mgbm90IHBlcmZlY3QsIGJ1dCBpdCdzIGJldHRlciB0aGFuIG5vdGhpbmcgCi0JICAgICAqLwotCSAgICByLT5yZXF1ZXN0X3RpbWUgPSBhcF9ub3coKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIHdlJ3ZlIHByb2JhYmx5IGdvdCBzb21ldGhpbmcgdG8gZG8sIGlnbm9yZSBncmFjZWZ1bCByZXN0YXJ0IHJlcXVlc3RzICovCi0KLSAgICAvKiBYWFggLSBzaWd3YWl0IGRvZXNuJ3Qgd29yayBpZiB0aGUgc2lnbmFsIGhhcyBiZWVuIFNJR19JR05lZCAodW5kZXIKLSAgICAgKiBsaW51eCAyLjAgdy8gZ2xpYmMgMi4wLCBhbnl3YXkpLCBhbmQgdGhpcyBzdGVwIGlzbid0IG5lY2Vzc2FyeSB3aGVuCi0gICAgICogd2UncmUgcnVubmluZyBhIHNpZ3dhaXQgdGhyZWFkIGFueXdheS4gSWYvd2hlbiB1bnRocmVhZGVkIG1vZGUgaXMKLSAgICAgKiBwdXQgYmFjayBpbiwgd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0byBpZ25vcmUgdGhpcyBzaWduYWwgaWZmIGEgc2lnd2FpdAotICAgICAqIHRocmVhZCBpc24ndCB1c2VkLiAtIG12c2sKLQotI2lmZGVmIFNJR1dJTkNICi0gICAgc2lnbmFsKFNJR1dJTkNILCBTSUdfSUdOKTsKLSNlbmRpZgotICAgICovCi0KLSAgICAvKiAvL2FwX2JzZXRmbGFnKGNvbm4tPmNsaWVudCwgQl9TQUZFUkVBRCwgMCk7ICovCi0KLSAgICByLT5yZXF1ZXN0X3RpbWUgPSBhcF9ub3coKTsKLSAgICByLT50aGVfcmVxdWVzdCA9IGFwX3BzdHJkdXAoci0+cG9vbCwgbCk7Ci0gICAgci0+bWV0aG9kID0gYXBfZ2V0d29yZF93aGl0ZShyLT5wb29sLCAmbGwpOwotICAgIGFwX3VwZGF0ZV9jb25uZWN0aW9uX3N0YXR1cyhjb25uLT5pZCwgIk1ldGhvZCIsIHItPm1ldGhvZCk7Ci0gICAgdXJpID0gYXBfZ2V0d29yZF93aGl0ZShyLT5wb29sLCAmbGwpOwotCi0gICAgLyogUHJvdmlkZSBxdWljayBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVxdWVzdCBtZXRob2QgYXMgc29vbiBhcyBrbm93biAqLwotCi0gICAgci0+bWV0aG9kX251bWJlciA9IGFwX21ldGhvZF9udW1iZXJfb2Yoci0+bWV0aG9kKTsKLSAgICBpZiAoci0+bWV0aG9kX251bWJlciA9PSBNX0dFVCAmJiByLT5tZXRob2RbMF0gPT0gJ0gnKSB7Ci0gICAgICAgIHItPmhlYWRlcl9vbmx5ID0gMTsKLSAgICB9Ci0KLSAgICBhcF9wYXJzZV91cmkociwgdXJpKTsKLQotICAgIC8qIGdldGxpbmUgcmV0dXJucyAoc2l6ZSBvZiBtYXggYnVmZmVyIC0gMSkgaWYgaXQgZmlsbHMgdXAgdGhlCi0gICAgICogYnVmZmVyIGJlZm9yZSBmaW5kaW5nIHRoZSBlbmQtb2YtbGluZS4gIFRoaXMgaXMgb25seSBnb2luZyB0bwotICAgICAqIGhhcHBlbiBpZiBpdCBleGNlZWRzIHRoZSBjb25maWd1cmVkIGxpbWl0IGZvciBhIHJlcXVlc3QtbGluZS4KLSAgICAgKi8KLSAgICBpZiAobGVuID4gci0+c2VydmVyLT5saW1pdF9yZXFfbGluZSkgewotICAgICAgICByLT5zdGF0dXMgICAgPSBIVFRQX1JFUVVFU1RfVVJJX1RPT19MQVJHRTsKLSAgICAgICAgci0+cHJvdG9fbnVtID0gSFRUUF9WRVJTSU9OKDEsMCk7Ci0gICAgICAgIHItPnByb3RvY29sICA9IGFwX3BzdHJkdXAoci0+cG9vbCwgIkhUVFAvMS4wIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHItPmFzc2JhY2t3YXJkcyA9IChsbFswXSA9PSAnXDAnKTsKLSAgICByLT5wcm90b2NvbCA9IGFwX3BzdHJkdXAoci0+cG9vbCwgbGxbMF0gPyBsbCA6ICJIVFRQLzAuOSIpOwotICAgIGFwX3VwZGF0ZV9jb25uZWN0aW9uX3N0YXR1cyhjb25uLT5pZCwgIlByb3RvY29sIiwgci0+cHJvdG9jb2wpOwotCi0gICAgaWYgKDIgPT0gc3NjYW5mKHItPnByb3RvY29sLCAiSFRUUC8ldS4ldSIsICZtYWpvciwgJm1pbm9yKQotICAgICAgJiYgbWlub3IgPCBIVFRQX1ZFUlNJT04oMSwwKSkJLyogZG9uJ3QgYWxsb3cgSFRUUC8wLjEwMDAgKi8KLQlyLT5wcm90b19udW0gPSBIVFRQX1ZFUlNJT04obWFqb3IsIG1pbm9yKTsKLSAgICBlbHNlCi0Jci0+cHJvdG9fbnVtID0gSFRUUF9WRVJTSU9OKDEsMCk7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgZ2V0X21pbWVfaGVhZGVycyhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjaGFyIGZpZWxkW0RFRkFVTFRfTElNSVRfUkVRVUVTVF9GSUVMRFNJWkUgKyAyXTsgLyogZ2V0bGluZSdzIHR3byBleHRyYSAqLwotICAgIGNvbm5fcmVjICpjID0gci0+Y29ubmVjdGlvbjsKLSAgICBjaGFyICp2YWx1ZTsKLSAgICBjaGFyICpjb3B5OwotICAgIGludCBsZW47Ci0gICAgdW5zaWduZWQgaW50IGZpZWxkc19yZWFkID0gMDsKLSAgICBhcF90YWJsZV90ICp0bXBfaGVhZGVyczsKLQotICAgIC8qIFdlJ2xsIHVzZSBhcF9vdmVybGFwX3RhYmxlcyBsYXRlciB0byBtZXJnZSB0aGVzZSBpbnRvIHItPmhlYWRlcnNfaW4uICovCi0gICAgdG1wX2hlYWRlcnMgPSBhcF9tYWtlX3RhYmxlKHItPnBvb2wsIDUwKTsKLQotICAgIC8qCi0gICAgICogUmVhZCBoZWFkZXIgbGluZXMgdW50aWwgd2UgZ2V0IHRoZSBlbXB0eSBzZXBhcmF0b3IgbGluZSwgYSByZWFkIGVycm9yLAotICAgICAqIHRoZSBjb25uZWN0aW9uIGNsb3NlcyAoRU9GKSwgcmVhY2ggdGhlIHNlcnZlciBsaW1pdCwgb3Igd2UgdGltZW91dC4KLSAgICAgKi8KLSAgICB3aGlsZSAoKGxlbiA9IGdldGxpbmUoZmllbGQsIHNpemVvZihmaWVsZCksIGMtPmNsaWVudCwgMSkpID4gMCkgewotCi0gICAgICAgIGlmIChyLT5zZXJ2ZXItPmxpbWl0X3JlcV9maWVsZHMgJiYKLSAgICAgICAgICAgICgrK2ZpZWxkc19yZWFkID4gci0+c2VydmVyLT5saW1pdF9yZXFfZmllbGRzKSkgewotICAgICAgICAgICAgci0+c3RhdHVzID0gSFRUUF9CQURfUkVRVUVTVDsKLSAgICAgICAgICAgIGFwX3RhYmxlX3NldG4oci0+bm90ZXMsICJlcnJvci1ub3RlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgbnVtYmVyIG9mIHJlcXVlc3QgaGVhZGVyIGZpZWxkcyBleGNlZWRzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgc2VydmVyJ3MgbGltaXQuPFA+XG4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvKiBnZXRsaW5lIHJldHVybnMgKHNpemUgb2YgbWF4IGJ1ZmZlciAtIDEpIGlmIGl0IGZpbGxzIHVwIHRoZQotICAgICAgICAgKiBidWZmZXIgYmVmb3JlIGZpbmRpbmcgdGhlIGVuZC1vZi1saW5lLiAgVGhpcyBpcyBvbmx5IGdvaW5nIHRvCi0gICAgICAgICAqIGhhcHBlbiBpZiBpdCBleGNlZWRzIHRoZSBjb25maWd1cmVkIGxpbWl0IGZvciBhIGZpZWxkIHNpemUuCi0gICAgICAgICAqLwotICAgICAgICBpZiAobGVuID4gci0+c2VydmVyLT5saW1pdF9yZXFfZmllbGRzaXplKSB7Ci0gICAgICAgICAgICByLT5zdGF0dXMgPSBIVFRQX0JBRF9SRVFVRVNUOwotICAgICAgICAgICAgYXBfdGFibGVfc2V0bihyLT5ub3RlcywgImVycm9yLW5vdGVzIiwgYXBfcHN0cmNhdChyLT5wb29sLAotICAgICAgICAgICAgICAgICJTaXplIG9mIGEgcmVxdWVzdCBoZWFkZXIgZmllbGQgZXhjZWVkcyBzZXJ2ZXIgbGltaXQuPFA+XG4iCi0gICAgICAgICAgICAgICAgIjxQUkU+XG4iLCBmaWVsZCwgIjwvUFJFPlxuIiwgTlVMTCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvcHkgPSBhcF9wYWxsb2Moci0+cG9vbCwgbGVuICsgMSk7Ci0gICAgICAgIG1lbWNweShjb3B5LCBmaWVsZCwgbGVuICsgMSk7Ci0KLSAgICAgICAgaWYgKCEodmFsdWUgPSBzdHJjaHIoY29weSwgJzonKSkpIHsgICAgIC8qIEZpbmQgdGhlIGNvbG9uIHNlcGFyYXRvciAqLwotICAgICAgICAgICAgci0+c3RhdHVzID0gSFRUUF9CQURfUkVRVUVTVDsgICAgICAgLyogb3IgYWJvcnQgdGhlIGJhZCByZXF1ZXN0ICovCi0gICAgICAgICAgICBhcF90YWJsZV9zZXRuKHItPm5vdGVzLCAiZXJyb3Itbm90ZXMiLCBhcF9wc3RyY2F0KHItPnBvb2wsCi0gICAgICAgICAgICAgICAgIlJlcXVlc3QgaGVhZGVyIGZpZWxkIGlzIG1pc3NpbmcgY29sb24gc2VwYXJhdG9yLjxQPlxuIgotICAgICAgICAgICAgICAgICI8UFJFPlxuIiwgY29weSwgIjwvUFJFPlxuIiwgTlVMTCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgKnZhbHVlID0gJ1wwJzsKLSAgICAgICAgKyt2YWx1ZTsKLSAgICAgICAgd2hpbGUgKCp2YWx1ZSA9PSAnICcgfHwgKnZhbHVlID09ICdcdCcpCi0gICAgICAgICAgICArK3ZhbHVlOyAgICAgICAgICAgIC8qIFNraXAgdG8gc3RhcnQgb2YgdmFsdWUgICAqLwotCi0JYXBfdGFibGVfYWRkbih0bXBfaGVhZGVycywgY29weSwgdmFsdWUpOwotICAgIH0KLQotICAgIGFwX292ZXJsYXBfdGFibGVzKHItPmhlYWRlcnNfaW4sIHRtcF9oZWFkZXJzLCBBUF9PVkVSTEFQX1RBQkxFU19NRVJHRSk7Ci19Ci0KLXJlcXVlc3RfcmVjICphcF9yZWFkX3JlcXVlc3QoY29ubl9yZWMgKmNvbm4pCi17Ci0gICAgcmVxdWVzdF9yZWMgKnI7Ci0gICAgYXBfY29udGV4dF90ICpwOwotICAgIGNvbnN0IGNoYXIgKmV4cGVjdDsKLSAgICBpbnQgYWNjZXNzX3N0YXR1czsKLQotICAgIGFwX2NyZWF0ZV9jb250ZXh0KCZwLCBjb25uLT5wb29sKTsKLSAgICByID0gYXBfcGNhbGxvYyhwLCBzaXplb2YocmVxdWVzdF9yZWMpKTsKLSAgICByLT5wb29sICAgICAgICAgICAgPSBwOwotICAgIHItPmNvbm5lY3Rpb24gICAgICA9IGNvbm47Ci0gICAgci0+c2VydmVyICAgICAgICAgID0gY29ubi0+YmFzZV9zZXJ2ZXI7Ci0KLSAgICBjb25uLT5rZXB0YWxpdmUgICAgPSBjb25uLT5rZWVwYWxpdmUgPT0gMTsKLSAgICBjb25uLT5rZWVwYWxpdmUgICAgPSAwOwotCi0gICAgci0+dXNlciAgICAgICAgICAgID0gTlVMTDsKLSAgICByLT5hcF9hdXRoX3R5cGUgICAgPSBOVUxMOwotCi0gICAgci0+aGVhZGVyc19pbiAgICAgID0gYXBfbWFrZV90YWJsZShyLT5wb29sLCA1MCk7Ci0gICAgci0+c3VicHJvY2Vzc19lbnYgID0gYXBfbWFrZV90YWJsZShyLT5wb29sLCA1MCk7Ci0gICAgci0+aGVhZGVyc19vdXQgICAgID0gYXBfbWFrZV90YWJsZShyLT5wb29sLCAxMik7Ci0gICAgci0+ZXJyX2hlYWRlcnNfb3V0ID0gYXBfbWFrZV90YWJsZShyLT5wb29sLCA1KTsKLSAgICByLT5ub3RlcyAgICAgICAgICAgPSBhcF9tYWtlX3RhYmxlKHItPnBvb2wsIDUpOwotCi0gICAgci0+cmVxdWVzdF9jb25maWcgID0gYXBfY3JlYXRlX3JlcXVlc3RfY29uZmlnKHItPnBvb2wpOwotICAgIHItPnBlcl9kaXJfY29uZmlnICA9IHItPnNlcnZlci0+bG9va3VwX2RlZmF1bHRzOwotCi0gICAgci0+c2VudF9ib2R5Y3QgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgLyogYnl0ZWN0IGlzbid0IGZvciBib2R5ICovCi0KLSAgICByLT5yZWFkX2xlbmd0aCAgICAgPSAwOwotICAgIHItPnJlYWRfYm9keSAgICAgICA9IFJFUVVFU1RfTk9fQk9EWTsKLQotICAgIHItPnN0YXR1cyAgICAgICAgICA9IEhUVFBfUkVRVUVTVF9USU1FX09VVDsgIC8qIFVudGlsIHdlIGdldCBhIHJlcXVlc3QgKi8KLSAgICByLT50aGVfcmVxdWVzdCAgICAgPSBOVUxMOwotCi0jaWZkZWYgQ0hBUlNFVF9FQkNESUMKLSAgICBhcF9ic2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfQVNDSUkyRUJDRElDfEJfRUJDRElDMkFTQ0lJLCAxKTsKLSNlbmRpZgotCi0gICAgYXBfYnNldG9wdChjb25uLT5jbGllbnQsIEJPX1RJTUVPVVQsCi0gICAgICAgIGNvbm4tPmtlcHRhbGl2ZQotICAgICAgICAgICAgPyAmci0+c2VydmVyLT5rZWVwX2FsaXZlX3RpbWVvdXQKLSAgICAgICAgICAgIDogJnItPnNlcnZlci0+dGltZW91dCk7Ci0KLSAgICAvKiBHZXQgdGhlIHJlcXVlc3QuLi4gKi8KLSAgICBpZiAoIXJlYWRfcmVxdWVzdF9saW5lKHIpKSB7Ci0gICAgICAgIGlmIChyLT5zdGF0dXMgPT0gSFRUUF9SRVFVRVNUX1VSSV9UT09fTEFSR0UpIHsKLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVlc3QgZmFpbGVkOiBVUkkgdG9vIGxvbmciKTsKLSAgICAgICAgICAgIGFwX3NlbmRfZXJyb3JfcmVzcG9uc2UociwgMCk7Ci0gICAgICAgICAgICBhcF9ydW5fbG9nX3RyYW5zYWN0aW9uKHIpOwotICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChyLT5jb25uZWN0aW9uLT5rZXB0YWxpdmUpIHsKLSAgICAgICAgYXBfYnNldG9wdChyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJPX1RJTUVPVVQsCi0gICAgICAgICAgICAmci0+c2VydmVyLT50aW1lb3V0KTsKLSAgICB9Ci0gICAgaWYgKCFyLT5hc3NiYWNrd2FyZHMpIHsKLSAgICAgICAgZ2V0X21pbWVfaGVhZGVycyhyKTsKLSAgICAgICAgaWYgKHItPnN0YXR1cyAhPSBIVFRQX1JFUVVFU1RfVElNRV9PVVQpIHsKLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVlc3QgZmFpbGVkOiBlcnJvciByZWFkaW5nIHRoZSBoZWFkZXJzIik7Ci0gICAgICAgICAgICBhcF9zZW5kX2Vycm9yX3Jlc3BvbnNlKHIsIDApOwotICAgICAgICAgICAgYXBfcnVuX2xvZ190cmFuc2FjdGlvbihyKTsKLSAgICAgICAgICAgIHJldHVybiByOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBpZiAoci0+aGVhZGVyX29ubHkpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDbGllbnQgYXNrZWQgZm9yIGhlYWRlcnMgb25seSB3aXRoIEhUVFAvMC45LCB3aGljaCBkb2Vzbid0IHNlbmQKLSAgICAgICAgICAgICAqIGhlYWRlcnMhIEhhdmUgdG8gZGluayB0aGluZ3MganVzdCB0byBtYWtlIHN1cmUgdGhlIGVycm9yIG1lc3NhZ2UKLSAgICAgICAgICAgICAqIGNvbWVzIHRocm91Z2guLi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWVudCBzZW50IGludmFsaWQgSFRUUC8wLjkgcmVxdWVzdDogSEVBRCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHItPnVyaSk7Ci0gICAgICAgICAgICByLT5oZWFkZXJfb25seSA9IDA7Ci0gICAgICAgICAgICByLT5zdGF0dXMgPSBIVFRQX0JBRF9SRVFVRVNUOwotICAgICAgICAgICAgYXBfc2VuZF9lcnJvcl9yZXNwb25zZShyLCAwKTsKLSAgICAgICAgICAgIGFwX3J1bl9sb2dfdHJhbnNhY3Rpb24ocik7Ci0gICAgICAgICAgICByZXR1cm4gcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHItPnN0YXR1cyA9IEhUVFBfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVudGlsIGZ1cnRoZXIgbm90aWNlLiAqLwotCi0gICAgLyogdXBkYXRlIHdoYXQgd2UgdGhpbmsgdGhlIHZpcnR1YWwgaG9zdCBpcyBiYXNlZCBvbiB0aGUgaGVhZGVycyB3ZSd2ZQotICAgICAqIG5vdyByZWFkLiBtYXkgdXBkYXRlIHN0YXR1cy4KLSAgICAgKi8KLSAgICBhcF91cGRhdGVfdmhvc3RfZnJvbV9oZWFkZXJzKHIpOwotCi0gICAgLyogd2UgbWF5IGhhdmUgc3dpdGNoZWQgdG8gYW5vdGhlciBzZXJ2ZXIgKi8KLSAgICByLT5wZXJfZGlyX2NvbmZpZyA9IHItPnNlcnZlci0+bG9va3VwX2RlZmF1bHRzOwotCi0gICAgY29ubi0+a2VwdGFsaXZlID0gMDsgICAgICAgIC8qIFdlIG5vdyBoYXZlIGEgcmVxdWVzdCB0byBwbGF5IHdpdGggKi8KLQotICAgIGlmICgoIXItPmhvc3RuYW1lICYmIChyLT5wcm90b19udW0gPj0gSFRUUF9WRVJTSU9OKDEsMSkpKSB8fAotICAgICAgICAoKHItPnByb3RvX251bSA9PSBIVFRQX1ZFUlNJT04oMSwxKSkgJiYKLSAgICAgICAgICFhcF90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIkhvc3QiKSkpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogQ2xpZW50IHNlbnQgdXMgYW4gSFRUUC8xLjEgb3IgbGF0ZXIgcmVxdWVzdCB3aXRob3V0IHRlbGxpbmcgdXMgdGhlCi0gICAgICAgICAqIGhvc3RuYW1lLCBlaXRoZXIgd2l0aCBhIGZ1bGwgVVJMIG9yIGEgSG9zdDogaGVhZGVyLiBXZSB0aGVyZWZvcmUKLSAgICAgICAgICogbmVlZCB0byAoYXMgcGVyIHRoZSAxLjEgc3BlYykgc2VuZCBhbiBlcnJvci4gIEFzIGEgc3BlY2lhbCBjYXNlLAotICAgICAgICAgKiBIVFRQLzEuMSBtZW50aW9ucyB0d2ljZSAoUzksIFMxNC4yMykgdGhhdCBhIHJlcXVlc3QgTVVTVCBjb250YWluCi0gICAgICAgICAqIGEgSG9zdDogaGVhZGVyLCBhbmQgdGhlIHNlcnZlciBNVVNUIHJlc3BvbmQgd2l0aCA0MDAgaWYgaXQgZG9lc24ndC4KLSAgICAgICAgICovCi0gICAgICAgIHItPnN0YXR1cyA9IEhUVFBfQkFEX1JFUVVFU1Q7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgImNsaWVudCBzZW50IEhUVFAvMS4xIHJlcXVlc3Qgd2l0aG91dCBob3N0bmFtZSAiCi0gICAgICAgICAgICAgICAgICAgICAgIihzZWUgUkZDMjA2OCBzZWN0aW9uIDksIGFuZCAxNC4yMyk6ICVzIiwgci0+dXJpKTsKLSAgICB9Ci0gICAgaWYgKHItPnN0YXR1cyAhPSBIVFRQX09LKSB7Ci0gICAgICAgIGFwX3NlbmRfZXJyb3JfcmVzcG9uc2UociwgMCk7Ci0gICAgICAgIGFwX3J1bl9sb2dfdHJhbnNhY3Rpb24ocik7Ci0gICAgICAgIHJldHVybiByOwotICAgIH0KLSAgICBpZiAoKChleHBlY3QgPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIkV4cGVjdCIpKSAhPSBOVUxMKSAmJgotICAgICAgICAoZXhwZWN0WzBdICE9ICdcMCcpKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFRoZSBFeHBlY3QgaGVhZGVyIGZpZWxkIHdhcyBhZGRlZCB0byBIVFRQLzEuMSBhZnRlciBSRkMgMjA2OAotICAgICAgICAgKiBhcyBhIG1lYW5zIHRvIHNpZ25hbCB3aGVuIGEgMTAwIHJlc3BvbnNlIGlzIGRlc2lyZWQgYW5kLAotICAgICAgICAgKiB1bmZvcnR1bmF0ZWx5LCB0byBzaWduYWwgYSBwb29yIG1hbidzIG1hbmRhdG9yeSBleHRlbnNpb24gdGhhdAotICAgICAgICAgKiB0aGUgc2VydmVyIG11c3QgdW5kZXJzdGFuZCBvciByZXR1cm4gNDE3IEV4cGVjdGF0aW9uIEZhaWxlZC4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChzdHJjYXNlY21wKGV4cGVjdCwgIjEwMC1jb250aW51ZSIpID09IDApIHsKLSAgICAgICAgICAgIHItPmV4cGVjdGluZ18xMDAgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgci0+c3RhdHVzID0gSFRUUF9FWFBFQ1RBVElPTl9GQUlMRUQ7Ci0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgMCwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImNsaWVudCBzZW50IGFuIHVucmVjb2duaXplZCBleHBlY3RhdGlvbiB2YWx1ZSBvZiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3Q6ICVzIiwgZXhwZWN0KTsKLSAgICAgICAgICAgIGFwX3NlbmRfZXJyb3JfcmVzcG9uc2UociwgMCk7Ci0gICAgICAgICAgICAodm9pZCkgYXBfZGlzY2FyZF9yZXF1ZXN0X2JvZHkocik7Ci0gICAgICAgICAgICBhcF9ydW5fbG9nX3RyYW5zYWN0aW9uKHIpOwotICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoKGFjY2Vzc19zdGF0dXMgPSBhcF9ydW5fcG9zdF9yZWFkX3JlcXVlc3QocikpKSB7Ci0gICAgICAgIGFwX2RpZShhY2Nlc3Nfc3RhdHVzLCByKTsKLSAgICAgICAgYXBfcnVuX2xvZ190cmFuc2FjdGlvbihyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHI7Ci19Ci0KLS8qCi0gKiBBIGNvdXBsZSBvZiBvdGhlciBmdW5jdGlvbnMgd2hpY2ggaW5pdGlhbGl6ZSBzb21lIG9mIHRoZSBmaWVsZHMgb2YKLSAqIGEgcmVxdWVzdCBzdHJ1Y3R1cmUsIGFzIGFwcHJvcHJpYXRlIGZvciBhZGp1bmN0cyBvZiBvbmUga2luZCBvciBhbm90aGVyCi0gKiB0byBhIHJlcXVlc3QgaW4gcHJvZ3Jlc3MuICBCZXN0IGhlcmUsIHJhdGhlciB0aGFuIGVsc2V3aGVyZSwgc2luY2UKLSAqICpzb21lb25lKiBoYXMgdG8gc2V0IHRoZSBwcm90b2NvbC1zcGVjaWZpYyBmaWVsZHMuLi4KLSAqLwotCi12b2lkIGFwX3NldF9zdWJfcmVxX3Byb3RvY29sKHJlcXVlc3RfcmVjICpybmV3LCBjb25zdCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBybmV3LT50aGVfcmVxdWVzdCAgICAgPSByLT50aGVfcmVxdWVzdDsgIC8qIEtlZXAgb3JpZ2luYWwgcmVxdWVzdC1saW5lICovCi0KLSAgICBybmV3LT5hc3NiYWNrd2FyZHMgICAgPSAxOyAgIC8qIERvbid0IHNlbmQgaGVhZGVycyBmcm9tIHRoaXMuICovCi0gICAgcm5ldy0+bm9fbG9jYWxfY29weSAgID0gMTsgICAvKiBEb24ndCB0cnkgdG8gc2VuZCBVU0VfTE9DQUxfQ09QWSBmb3IgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZnJhZ21lbnQuICovCi0gICAgcm5ldy0+bWV0aG9kICAgICAgICAgID0gIkdFVCI7Ci0gICAgcm5ldy0+bWV0aG9kX251bWJlciAgID0gTV9HRVQ7Ci0gICAgcm5ldy0+cHJvdG9jb2wgICAgICAgID0gIklOQ0xVREVEIjsKLQotICAgIHJuZXctPnN0YXR1cyAgICAgICAgICA9IEhUVFBfT0s7Ci0KLSAgICBybmV3LT5oZWFkZXJzX2luICAgICAgPSByLT5oZWFkZXJzX2luOwotICAgIHJuZXctPnN1YnByb2Nlc3NfZW52ICA9IGFwX2NvcHlfdGFibGUocm5ldy0+cG9vbCwgci0+c3VicHJvY2Vzc19lbnYpOwotICAgIHJuZXctPmhlYWRlcnNfb3V0ICAgICA9IGFwX21ha2VfdGFibGUocm5ldy0+cG9vbCwgNSk7Ci0gICAgcm5ldy0+ZXJyX2hlYWRlcnNfb3V0ID0gYXBfbWFrZV90YWJsZShybmV3LT5wb29sLCA1KTsKLSAgICBybmV3LT5ub3RlcyAgICAgICAgICAgPSBhcF9tYWtlX3RhYmxlKHJuZXctPnBvb2wsIDUpOwotCi0gICAgcm5ldy0+ZXhwZWN0aW5nXzEwMCAgID0gci0+ZXhwZWN0aW5nXzEwMDsKLSAgICBybmV3LT5yZWFkX2xlbmd0aCAgICAgPSByLT5yZWFkX2xlbmd0aDsKLSAgICBybmV3LT5yZWFkX2JvZHkgICAgICAgPSBSRVFVRVNUX05PX0JPRFk7Ci0KLSAgICBybmV3LT5tYWluID0gKHJlcXVlc3RfcmVjICopIHI7Ci19Ci0KLXZvaWQgYXBfZmluYWxpemVfc3ViX3JlcV9wcm90b2NvbChyZXF1ZXN0X3JlYyAqc3ViKQotewotICAgIFNFVF9CWVRFU19TRU5UKHN1Yi0+bWFpbik7Ci19Ci0KLS8qCi0gKiBTdXBwb3J0IGZvciB0aGUgQmFzaWMgYXV0aGVudGljYXRpb24gcHJvdG9jb2wsIGFuZCBhIGJpdCBmb3IgRGlnZXN0LgotICovCi0KLUFQSV9FWFBPUlQodm9pZCkgYXBfbm90ZV9hdXRoX2ZhaWx1cmUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaWYgKCFzdHJjYXNlY21wKGFwX2F1dGhfdHlwZShyKSwgIkJhc2ljIikpCi0gICAgICAgIGFwX25vdGVfYmFzaWNfYXV0aF9mYWlsdXJlKHIpOwotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGFwX2F1dGhfdHlwZShyKSwgIkRpZ2VzdCIpKQotICAgICAgICBhcF9ub3RlX2RpZ2VzdF9hdXRoX2ZhaWx1cmUocik7Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfbm90ZV9iYXNpY19hdXRoX2ZhaWx1cmUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaWYgKHN0cmNhc2VjbXAoYXBfYXV0aF90eXBlKHIpLCAiQmFzaWMiKSkKLSAgICAgICAgYXBfbm90ZV9hdXRoX2ZhaWx1cmUocik7Ci0gICAgZWxzZQotICAgICAgICBhcF90YWJsZV9zZXRuKHItPmVycl9oZWFkZXJzX291dCwKLSAgICAgICAgICAgICAgICAgIHItPnByb3h5cmVxID8gIlByb3h5LUF1dGhlbnRpY2F0ZSIgOiAiV1dXLUF1dGhlbnRpY2F0ZSIsCi0gICAgICAgICAgICAgICAgICBhcF9wc3RyY2F0KHItPnBvb2wsICJCYXNpYyByZWFsbT1cIiIsIGFwX2F1dGhfbmFtZShyKSwgIlwiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOwotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX25vdGVfZGlnZXN0X2F1dGhfZmFpbHVyZShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBhcF90YWJsZV9zZXRuKHItPmVycl9oZWFkZXJzX291dCwKLQkgICAgci0+cHJveHlyZXEgPyAiUHJveHktQXV0aGVudGljYXRlIiA6ICJXV1ctQXV0aGVudGljYXRlIiwKLQkgICAgYXBfcHNwcmludGYoci0+cG9vbCwgIkRpZ2VzdCByZWFsbT1cIiVzXCIsIG5vbmNlPVwiJWx1XCIiLAotCQlhcF9hdXRoX25hbWUociksIHItPnJlcXVlc3RfdGltZSkpOwotfQotCi1BUElfRVhQT1JUKGludCkgYXBfZ2V0X2Jhc2ljX2F1dGhfcHcocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKipwdykKLXsKLSAgICBjb25zdCBjaGFyICphdXRoX2xpbmUgPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+cHJveHlyZXEgPyAiUHJveHktQXV0aG9yaXphdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiQXV0aG9yaXphdGlvbiIpOwotICAgIGNvbnN0IGNoYXIgKnQ7Ci0KLSAgICBpZiAoISh0ID0gYXBfYXV0aF90eXBlKHIpKSB8fCBzdHJjYXNlY21wKHQsICJCYXNpYyIpKQotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0KLSAgICBpZiAoIWFwX2F1dGhfbmFtZShyKSkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLAotCQkgICAgMCwgciwgIm5lZWQgQXV0aE5hbWU6ICVzIiwgci0+dXJpKTsKLSAgICAgICAgcmV0dXJuIFNFUlZFUl9FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAoIWF1dGhfbGluZSkgewotICAgICAgICBhcF9ub3RlX2Jhc2ljX2F1dGhfZmFpbHVyZShyKTsKLSAgICAgICAgcmV0dXJuIEFVVEhfUkVRVUlSRUQ7Ci0gICAgfQotCi0gICAgaWYgKHN0cmNhc2VjbXAoYXBfZ2V0d29yZChyLT5wb29sLCAmYXV0aF9saW5lLCAnICcpLCAiQmFzaWMiKSkgewotICAgICAgICAvKiBDbGllbnQgdHJpZWQgdG8gYXV0aGVudGljYXRlIHVzaW5nIHdyb25nIGF1dGggc2NoZW1lICovCi0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICJjbGllbnQgdXNlZCB3cm9uZyBhdXRoZW50aWNhdGlvbiBzY2hlbWU6ICVzIiwgci0+dXJpKTsKLSAgICAgICAgYXBfbm90ZV9iYXNpY19hdXRoX2ZhaWx1cmUocik7Ci0gICAgICAgIHJldHVybiBBVVRIX1JFUVVJUkVEOwotICAgIH0KLQotICAgIC8qIENIQVJTRVRfRUJDRElDIElzc3VlJ3MgaGVyZSA/IT8gQ29tcGFyZSB3aXRoIDMyLzkgaW5zdGVhZAotICAgICAqIGFzIHdlIGFyZSBvcGVyYXRpbmcgb24gYW4gb2N0ZWQgc3RyZWFtID8KLSAgICAgKi8KLSAgICB3aGlsZSAoKmF1dGhfbGluZT09ICcgJyB8fCAqYXV0aF9saW5lPT0gJ1x0JykKLSAgICAgICAgYXV0aF9saW5lKys7Ci0KLSAgICB0ID0gYXBfcGJhc2U2NGRlY29kZShyLT5wb29sLCBhdXRoX2xpbmUpOwotICAgIC8qIE5vdGUgdGhhdCB0aGlzIGFsbG9jYXRpb24gaGFzIHRvIGJlIG1hZGUgZnJvbSByLT5jb25uZWN0aW9uLT5wb29sCi0gICAgICogYmVjYXVzZSBpdCBoYXMgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb25uZWN0aW9uLiAgVGhlIG90aGVyIGFsbG9jYXRpb25zCi0gICAgICogYXJlIHRlbXBvcmFyeSBhbmQgY2FuIGJlIHRvc3NlZCBhd2F5IGFueSB0aW1lLgotICAgICAqLwotICAgIHItPnVzZXIgPSBhcF9nZXR3b3JkX251bGxzIChyLT5wb29sLCAmdCwgJzonKTsKLSAgICByLT5hcF9hdXRoX3R5cGUgPSAiQmFzaWMiOwotCi0gICAgKnB3ID0gdDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotLyogTmV3IEFwYWNoZSByb3V0aW5lIHRvIG1hcCBzdGF0dXMgY29kZXMgaW50byBhcnJheSBpbmRpY2llcwotICogIGUuZy4gIDEwMCAtPiAwLCAgMTAxIC0+IDEsICAyMDAgLT4gMiAuLi4KLSAqIFRoZSBudW1iZXIgb2Ygc3RhdHVzIGxpbmVzIG11c3QgZXF1YWwgdGhlIHZhbHVlIG9mIFJFU1BPTlNFX0NPREVTIChodHRwZC5oKQotICogYW5kIG11c3QgYmUgbGlzdGVkIGluIG9yZGVyLgotICovCi0KLSNpZmRlZiBVVFMyMQotLyogVGhlIHNlY29uZCBjb25zdCB0cmlnZ2VycyBhbiBhc3NlbWJsZXIgYnVnIG9uIFVUUyAyLjEuCi0gKiBBbm90aGVyIHdvcmthcm91bmQgaXMgdG8gbW92ZSBzb21lIGNvZGUgb3V0IG9mIHRoaXMgZmlsZSBpbnRvIGFub3RoZXIsCi0gKiAgIGJ1dCB0aGlzIGlzIGVhc2llci4gIERhdmUgRHlrc3RyYSwgMy8zMS85OSAKLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBzdGF0dXNfbGluZXNbUkVTUE9OU0VfQ09ERVNdID0KLSNlbHNlCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHN0YXR1c19saW5lc1tSRVNQT05TRV9DT0RFU10gPQotI2VuZGlmCi17Ci0gICAgIjEwMCBDb250aW51ZSIsCi0gICAgIjEwMSBTd2l0Y2hpbmcgUHJvdG9jb2xzIiwKLSAgICAiMTAyIFByb2Nlc3NpbmciLAotI2RlZmluZSBMRVZFTF8yMDAgIDMKLSAgICAiMjAwIE9LIiwKLSAgICAiMjAxIENyZWF0ZWQiLAotICAgICIyMDIgQWNjZXB0ZWQiLAotICAgICIyMDMgTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb24iLAotICAgICIyMDQgTm8gQ29udGVudCIsCi0gICAgIjIwNSBSZXNldCBDb250ZW50IiwKLSAgICAiMjA2IFBhcnRpYWwgQ29udGVudCIsCi0gICAgIjIwNyBNdWx0aS1TdGF0dXMiLAotI2RlZmluZSBMRVZFTF8zMDAgMTEKLSAgICAiMzAwIE11bHRpcGxlIENob2ljZXMiLAotICAgICIzMDEgTW92ZWQgUGVybWFuZW50bHkiLAotICAgICIzMDIgRm91bmQiLAotICAgICIzMDMgU2VlIE90aGVyIiwKLSAgICAiMzA0IE5vdCBNb2RpZmllZCIsCi0gICAgIjMwNSBVc2UgUHJveHkiLAotICAgICIzMDYgdW51c2VkIiwKLSAgICAiMzA3IFRlbXBvcmFyeSBSZWRpcmVjdCIsCi0jZGVmaW5lIExFVkVMXzQwMCAxOQotICAgICI0MDAgQmFkIFJlcXVlc3QiLAotICAgICI0MDEgQXV0aG9yaXphdGlvbiBSZXF1aXJlZCIsCi0gICAgIjQwMiBQYXltZW50IFJlcXVpcmVkIiwKLSAgICAiNDAzIEZvcmJpZGRlbiIsCi0gICAgIjQwNCBOb3QgRm91bmQiLAotICAgICI0MDUgTWV0aG9kIE5vdCBBbGxvd2VkIiwKLSAgICAiNDA2IE5vdCBBY2NlcHRhYmxlIiwKLSAgICAiNDA3IFByb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkIiwKLSAgICAiNDA4IFJlcXVlc3QgVGltZS1vdXQiLAotICAgICI0MDkgQ29uZmxpY3QiLAotICAgICI0MTAgR29uZSIsCi0gICAgIjQxMSBMZW5ndGggUmVxdWlyZWQiLAotICAgICI0MTIgUHJlY29uZGl0aW9uIEZhaWxlZCIsCi0gICAgIjQxMyBSZXF1ZXN0IEVudGl0eSBUb28gTGFyZ2UiLAotICAgICI0MTQgUmVxdWVzdC1VUkkgVG9vIExhcmdlIiwKLSAgICAiNDE1IFVuc3VwcG9ydGVkIE1lZGlhIFR5cGUiLAotICAgICI0MTYgUmVxdWVzdGVkIFJhbmdlIE5vdCBTYXRpc2ZpYWJsZSIsCi0gICAgIjQxNyBFeHBlY3RhdGlvbiBGYWlsZWQiLAotICAgICI0MTggdW51c2VkIiwKLSAgICAiNDE5IHVudXNlZCIsCi0gICAgIjQyMCB1bnVzZWQiLAotICAgICI0MjEgdW51c2VkIiwKLSAgICAiNDIyIFVucHJvY2Vzc2FibGUgRW50aXR5IiwKLSAgICAiNDIzIExvY2tlZCIsCi0gICAgIjQyNCBGYWlsZWQgRGVwZW5kZW5jeSIsCi0jZGVmaW5lIExFVkVMXzUwMCA0NAotICAgICI1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yIiwKLSAgICAiNTAxIE1ldGhvZCBOb3QgSW1wbGVtZW50ZWQiLAotICAgICI1MDIgQmFkIEdhdGV3YXkiLAotICAgICI1MDMgU2VydmljZSBUZW1wb3JhcmlseSBVbmF2YWlsYWJsZSIsCi0gICAgIjUwNCBHYXRld2F5IFRpbWUtb3V0IiwKLSAgICAiNTA1IEhUVFAgVmVyc2lvbiBOb3QgU3VwcG9ydGVkIiwKLSAgICAiNTA2IFZhcmlhbnQgQWxzbyBOZWdvdGlhdGVzIiwKLSAgICAiNTA3IEluc3VmZmljaWVudCBTdG9yYWdlIiwKLSAgICAiNTA4IHVudXNlZCIsCi0gICAgIjUwOSB1bnVzZWQiLAotICAgICI1MTAgTm90IEV4dGVuZGVkIgotfTsKLQotLyogVGhlIGluZGV4IGlzIGZvdW5kIGJ5IGl0cyBvZmZzZXQgZnJvbSB0aGUgeDAwIGNvZGUgb2YgZWFjaCBsZXZlbC4KLSAqIEFsdGhvdWdoIHRoaXMgaXMgZmFzdCwgaXQgd2lsbCBuZWVkIHRvIGJlIHJlcGxhY2VkIGlmIHNvbWUgbnV0Y2FzZQotICogZGVjaWRlcyB0byBkZWZpbmUgYSBoaWdoLW51bWJlcmVkIGNvZGUgYmVmb3JlIHRoZSBsb3dlciBudW1iZXJzLgotICogSWYgdGhhdCBzYWQgZXZlbnQgb2NjdXJzLCByZXBsYWNlIHRoZSBjb2RlIGJlbG93IHdpdGggYSBsaW5lYXIgc2VhcmNoCi0gKiBmcm9tIHN0YXR1c19saW5lc1tzaG9ydGN1dFtpXV0gdG8gc3RhdHVzX2xpbmVzW3Nob3J0Y3V0W2krMV0tMV07Ci0gKi8KLUFQSV9FWFBPUlQoaW50KSBhcF9pbmRleF9vZl9yZXNwb25zZShpbnQgc3RhdHVzKQotewotICAgIHN0YXRpYyBpbnQgc2hvcnRjdXRbNl0gPSB7MCwgTEVWRUxfMjAwLCBMRVZFTF8zMDAsIExFVkVMXzQwMCwKLSAgICBMRVZFTF81MDAsIFJFU1BPTlNFX0NPREVTfTsKLSAgICBpbnQgaSwgcG9zOwotCi0gICAgaWYgKHN0YXR1cyA8IDEwMCkgICAgICAgICAgIC8qIEJlbG93IDEwMCBpcyBpbGxlZ2FsIGZvciBIVFRQIHN0YXR1cyAqLwotICAgICAgICByZXR1cm4gTEVWRUxfNTAwOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewotICAgICAgICBzdGF0dXMgLT0gMTAwOwotICAgICAgICBpZiAoc3RhdHVzIDwgMTAwKSB7Ci0gICAgICAgICAgICBwb3MgPSAoc3RhdHVzICsgc2hvcnRjdXRbaV0pOwotICAgICAgICAgICAgaWYgKHBvcyA8IHNob3J0Y3V0W2kgKyAxXSkKLSAgICAgICAgICAgICAgICByZXR1cm4gcG9zOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBMRVZFTF81MDA7ICAgICAgIC8qIHN0YXR1cyB1bmtub3duIChmYWxscyBpbiBnYXApICovCi0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIExFVkVMXzUwMDsgICAgICAgICAgIC8qIDYwMCBvciBhYm92ZSBpcyBhbHNvIGlsbGVnYWwgKi8KLX0KLQotLyogU2VuZCBhIHNpbmdsZSBIVFRQIGhlYWRlciBmaWVsZCB0byB0aGUgY2xpZW50LiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24KLSAqIGlzIHVzZWQgaW4gY2FsbHMgdG8gdGFibGVfZG8oKSwgc28gdGhlaXIgaW50ZXJmYWNlcyBhcmUgY28tZGVwZW5kZW50LgotICogSW4gb3RoZXIgd29yZHMsIGRvbid0IGNoYW5nZSB0aGlzIG9uZSB3aXRob3V0IGNoZWNraW5nIHRhYmxlX2RvIGluIGFsbG9jLmMuCi0gKiBJdCByZXR1cm5zIHRydWUgdW5sZXNzIHRoZXJlIHdhcyBhIHdyaXRlIGVycm9yIG9mIHNvbWUga2luZC4KLSAqLwotQVBJX0VYUE9SVF9OT05TVEQoaW50KSBhcF9zZW5kX2hlYWRlcl9maWVsZChyZXF1ZXN0X3JlYyAqciwKLSAgICBjb25zdCBjaGFyICpmaWVsZG5hbWUsIGNvbnN0IGNoYXIgKmZpZWxkdmFsKQotewotICAgIHJldHVybiAoMCA8IGFwX3J2cHV0cyhyLCBmaWVsZG5hbWUsICI6ICIsIGZpZWxkdmFsLCAiXDAxNVwwMTIiLCBOVUxMKSk7Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfYmFzaWNfaHR0cF9oZWFkZXIocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY2hhciAqcHJvdG9jb2w7Ci0gICAgY2hhciAqZGF0ZSA9IE5VTEw7Ci0jaWZkZWYgQ0hBUlNFVF9FQkNESUMKLSAgICBpbnQgY29udmVydCA9IGFwX2JnZXRmbGFnKHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQl9FQkNESUMyQVNDSUkpOwotI2VuZGlmIC8qQ0hBUlNFVF9FQkNESUMqLwotCi0gICAgaWYgKHItPmFzc2JhY2t3YXJkcykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCFyLT5zdGF0dXNfbGluZSkKLSAgICAgICAgci0+c3RhdHVzX2xpbmUgPSBzdGF0dXNfbGluZXNbYXBfaW5kZXhfb2ZfcmVzcG9uc2Uoci0+c3RhdHVzKV07Ci0KLSAgICAvKiBtb2RfcHJveHkgaXMgb25seSBIVFRQLzEuMCwgc28gYXZvaWQgc2VuZGluZyBIVFRQLzEuMSBlcnJvciByZXNwb25zZTsKLSAgICAgKiBrbHVnZSBhcm91bmQgYnJva2VuIGJyb3dzZXJzIHdoZW4gaW5kaWNhdGVkIGJ5IGZvcmNlLXJlc3BvbnNlLTEuMAotICAgICAqLwotICAgIGlmIChyLT5wcm94eXJlcQotICAgICAgICB8fCAoci0+cHJvdG9fbnVtID09IEhUVFBfVkVSU0lPTigxLDApCi0gICAgICAgICAgICAmJiBhcF90YWJsZV9nZXQoci0+c3VicHJvY2Vzc19lbnYsICJmb3JjZS1yZXNwb25zZS0xLjAiKSkpIHsKLQotICAgICAgICBwcm90b2NvbCA9ICJIVFRQLzEuMCI7Ci0gICAgICAgIHItPmNvbm5lY3Rpb24tPmtlZXBhbGl2ZSA9IC0xOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHByb3RvY29sID0gQVBfU0VSVkVSX1BST1RPQ09MOwotCi0jaWZkZWYgQ0hBUlNFVF9FQkNESUMKLSAgICBhcF9ic2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfRUJDRElDMkFTQ0lJLCAxKTsKLSNlbmRpZiAvKkNIQVJTRVRfRUJDRElDKi8KLQotICAgIC8qIE91dHB1dCB0aGUgSFRUUC8xLnggU3RhdHVzLUxpbmUgYW5kIHRoZSBEYXRlIGFuZCBTZXJ2ZXIgZmllbGRzICovCi0KLSAgICBhcF9ydnB1dHMociwgcHJvdG9jb2wsICIgIiwgci0+c3RhdHVzX2xpbmUsICJcMDE1XDAxMiIsIE5VTEwpOwotCi0gICAgZGF0ZSA9IGFwX3BhbGxvYyhyLT5wb29sLCBBUF9SRkM4MjJfREFURV9MRU4pOwotICAgIGFwX3JmYzgyMl9kYXRlKGRhdGUsIHItPnJlcXVlc3RfdGltZSk7Ci0gICAgYXBfc2VuZF9oZWFkZXJfZmllbGQociwgIkRhdGUiLCBkYXRlKTsKLSAgICBhcF9zZW5kX2hlYWRlcl9maWVsZChyLCAiU2VydmVyIiwgYXBfZ2V0X3NlcnZlcl92ZXJzaW9uKCkpOwotCi0gICAgYXBfdGFibGVfdW5zZXQoci0+aGVhZGVyc19vdXQsICJEYXRlIik7ICAgICAgICAvKiBBdm9pZCBib2dvc2l0eSAqLwotICAgIGFwX3RhYmxlX3Vuc2V0KHItPmhlYWRlcnNfb3V0LCAiU2VydmVyIik7Ci0jaWZkZWYgQ0hBUlNFVF9FQkNESUMKLSAgICBpZiAoIWNvbnZlcnQpCi0gICAgICAgIGFwX2JzZXRmbGFnKHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQl9FQkNESUMyQVNDSUksIGNvbnZlcnQpOwotI2VuZGlmIC8qQ0hBUlNFVF9FQkNESUMqLwotfQotCi0vKiBOYXZpZ2F0b3IgdmVyc2lvbnMgMi54LCAzLnggYW5kIDQuMCBiZXRhcyB1cCB0byBhbmQgaW5jbHVkaW5nIDQuMGIyCi0gKiBoYXZlIGEgaGVhZGVyIHBhcnNpbmcgYnVnLiAgSWYgdGhlIHRlcm1pbmF0aW5nIFxyXG4gb2NjdXIgc3RhcnRpbmcKLSAqIGF0IG9mZnNldCAyNTYsIDI1NyBvciAyNTggb2Ygb3V0cHV0IHRoZW4gaXQgd2lsbCBub3QgcHJvcGVybHkgcGFyc2UKLSAqIHRoZSBoZWFkZXJzLiAgQ3VyaW91c2x5IGl0IGRvZXNuJ3QgZXhoaWJpdCB0aGlzIHByb2JsZW0gYXQgNTEyLCA1MTMuCi0gKiBXZSBhcmUgZ3Vlc3NpbmcgdGhhdCB0aGlzIGlzIGJlY2F1c2UgdGhlaXIgaW5pdGlhbCByZWFkIG9mIGEgbmV3IHJlcXVlc3QKLSAqIHVzZXMgYSAyNTYgYnl0ZSBidWZmZXIsIGFuZCBzdWJzZXF1ZW50IHJlYWRzIHVzZSBhIGxhcmdlciBidWZmZXIuCi0gKiBTbyB0aGUgcHJvYmxlbSBtaWdodCBleGlzdCBhdCBkaWZmZXJlbnQgb2Zmc2V0cyBhcyB3ZWxsLgotICoKLSAqIFRoaXMgc2hvdWxkIGFsc28gd29yayBvbiBrZWVwYWxpdmUgY29ubmVjdGlvbnMgYXNzdW1pbmcgdGhleSB1c2UgdGhlCi0gKiBzYW1lIHNtYWxsIGJ1ZmZlciBmb3IgdGhlIGZpcnN0IHJlYWQgb2YgZWFjaCBuZXcgcmVxdWVzdC4KLSAqCi0gKiBBdCBhbnkgcmF0ZSwgd2UgY2hlY2sgdGhlIGJ5dGVzIHdyaXR0ZW4gc28gZmFyIGFuZCwgaWYgd2UgYXJlIGFib3V0IHRvCi0gKiB0aWNrbGUgdGhlIGJ1Zywgd2UgaW5zdGVhZCBpbnNlcnQgYSBib2d1cyBwYWRkaW5nIGhlYWRlci4gIFNpbmNlIHRoZSBidWcKLSAqIG1hbmlmZXN0cyBhcyBhIGJyb2tlbiBpbWFnZSBpbiBOYXZpZ2F0b3IsIHVzZXJzIGJsYW1lIHRoZSBzZXJ2ZXIuICA6KAotICogSXQgaXMgbW9yZSBleHBlbnNpdmUgdG8gY2hlY2sgdGhlIFVzZXItQWdlbnQgdGhhbiBpdCBpcyB0byBqdXN0IGFkZCB0aGUKLSAqIGJ5dGVzLCBzbyB3ZSBoYXZlbid0IHVzZWQgdGhlIEJyb3dzZXJNYXRjaCBmZWF0dXJlIGhlcmUuCi0gKi8KLXN0YXRpYyB2b2lkIHRlcm1pbmF0ZV9oZWFkZXIocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgbG9uZyBpbnQgYnM7Ci0KLSAgICBhcF9iZ2V0b3B0KHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQk9fQllURUNULCAmYnMpOwotICAgIGlmIChicyA+PSAyNTUgJiYgYnMgPD0gMjU3KQotICAgICAgICBhcF9ycHV0cygiWC1QYWQ6IGF2b2lkIGJyb3dzZXIgYnVnXDAxNVwwMTIiLCByKTsKLQotICAgIGFwX3JwdXRzKCJcMDE1XDAxMiIsIHIpOyAgLyogU2VuZCB0aGUgdGVybWluYXRpbmcgZW1wdHkgbGluZSAqLwotfQotCi0vKiBCdWlsZCB0aGUgQWxsb3cgZmllbGQtdmFsdWUgZnJvbSB0aGUgcmVxdWVzdCBoYW5kbGVyIG1ldGhvZCBtYXNrLgotICogTm90ZSB0aGF0IHdlIGFsd2F5cyBhbGxvdyBUUkFDRSwgc2luY2UgaXQgaXMgaGFuZGxlZCBiZWxvdy4KLSAqLwotc3RhdGljIGNoYXIgKm1ha2VfYWxsb3cocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgcmV0dXJuIDIgKyBhcF9wc3RyY2F0KHItPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgKHItPmFsbG93ZWQgJiAoMSA8PCBNX0dFVCkpICAgICAgID8gIiwgR0VULCBIRUFEIiA6ICIiLAotICAgICAgICAgICAgICAgICAgIChyLT5hbGxvd2VkICYgKDEgPDwgTV9QT1NUKSkgICAgICA/ICIsIFBPU1QiICAgICAgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAoci0+YWxsb3dlZCAmICgxIDw8IE1fUFVUKSkgICAgICAgPyAiLCBQVVQiICAgICAgIDogIiIsCi0gICAgICAgICAgICAgICAgICAgKHItPmFsbG93ZWQgJiAoMSA8PCBNX0RFTEVURSkpICAgID8gIiwgREVMRVRFIiAgICA6ICIiLAotICAgICAgICAgICAgICAgICAgIChyLT5hbGxvd2VkICYgKDEgPDwgTV9DT05ORUNUKSkgICA/ICIsIENPTk5FQ1QiICAgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAoci0+YWxsb3dlZCAmICgxIDw8IE1fT1BUSU9OUykpICAgPyAiLCBPUFRJT05TIiAgIDogIiIsCi0gICAgICAgICAgICAgICAgICAgKHItPmFsbG93ZWQgJiAoMSA8PCBNX1BBVENIKSkgICAgID8gIiwgUEFUQ0giICAgICA6ICIiLAotICAgICAgICAgICAgICAgICAgIChyLT5hbGxvd2VkICYgKDEgPDwgTV9QUk9QRklORCkpICA/ICIsIFBST1BGSU5EIiAgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAoci0+YWxsb3dlZCAmICgxIDw8IE1fUFJPUFBBVENIKSkgPyAiLCBQUk9QUEFUQ0giIDogIiIsCi0gICAgICAgICAgICAgICAgICAgKHItPmFsbG93ZWQgJiAoMSA8PCBNX01LQ09MKSkgICAgID8gIiwgTUtDT0wiICAgICA6ICIiLAotICAgICAgICAgICAgICAgICAgIChyLT5hbGxvd2VkICYgKDEgPDwgTV9DT1BZKSkgICAgICA/ICIsIENPUFkiICAgICAgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAoci0+YWxsb3dlZCAmICgxIDw8IE1fTU9WRSkpICAgICAgPyAiLCBNT1ZFIiAgICAgIDogIiIsCi0gICAgICAgICAgICAgICAgICAgKHItPmFsbG93ZWQgJiAoMSA8PCBNX0xPQ0spKSAgICAgID8gIiwgTE9DSyIgICAgICA6ICIiLAotICAgICAgICAgICAgICAgICAgIChyLT5hbGxvd2VkICYgKDEgPDwgTV9VTkxPQ0spKSAgICA/ICIsIFVOTE9DSyIgICAgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAiLCBUUkFDRSIsCi0gICAgICAgICAgICAgICAgICAgTlVMTCk7Ci19Ci0KLUFQSV9FWFBPUlQoaW50KSBhcF9zZW5kX2h0dHBfdHJhY2UocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IHJ2OwotCi0gICAgLyogR2V0IHRoZSBvcmlnaW5hbCByZXF1ZXN0ICovCi0gICAgd2hpbGUgKHItPnByZXYpCi0gICAgICAgIHIgPSByLT5wcmV2OwotCi0gICAgaWYgKChydiA9IGFwX3NldHVwX2NsaWVudF9ibG9jayhyLCBSRVFVRVNUX05PX0JPRFkpKSkKLSAgICAgICAgcmV0dXJuIHJ2OwotCi0gICAgci0+Y29udGVudF90eXBlID0gIm1lc3NhZ2UvaHR0cCI7Ci0gICAgYXBfc2VuZF9odHRwX2hlYWRlcihyKTsKLQotICAgIC8qIE5vdyB3ZSByZWNyZWF0ZSB0aGUgcmVxdWVzdCwgYW5kIGVjaG8gaXQgYmFjayAqLwotCi0gICAgYXBfcnZwdXRzKHIsIHItPnRoZV9yZXF1ZXN0LCAiXDAxNVwwMTIiLCBOVUxMKTsKLQotICAgIGFwX3RhYmxlX2RvKChpbnQgKCopICh2b2lkICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSkKLSAgICAgICAgICAgICAgICBhcF9zZW5kX2hlYWRlcl9maWVsZCwgKHZvaWQgKikgciwgci0+aGVhZGVyc19pbiwgTlVMTCk7Ci0gICAgYXBfcnB1dHMoIlwwMTVcMDEyIiwgcik7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLWludCBhcF9zZW5kX2h0dHBfb3B0aW9ucyhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb25zdCBsb25nIGludCB6ZXJvID0gMEw7Ci0KLSAgICBpZiAoci0+YXNzYmFja3dhcmRzKQotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0KLSAgICBhcF9iYXNpY19odHRwX2hlYWRlcihyKTsKLQotICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJDb250ZW50LUxlbmd0aCIsICIwIik7Ci0gICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkFsbG93IiwgbWFrZV9hbGxvdyhyKSk7Ci0gICAgYXBfc2V0X2tlZXBhbGl2ZShyKTsKLQotICAgIGFwX3RhYmxlX2RvKChpbnQgKCopICh2b2lkICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSkgYXBfc2VuZF9oZWFkZXJfZmllbGQsCi0gICAgICAgICAgICAgKHZvaWQgKikgciwgci0+aGVhZGVyc19vdXQsIE5VTEwpOwotCi0gICAgdGVybWluYXRlX2hlYWRlcihyKTsKLQotICAgIGFwX2JzZXRvcHQoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCT19CWVRFQ1QsICZ6ZXJvKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotLyoKLSAqIEhlcmUgd2UgdHJ5IHRvIGJlIGNvbXBhdGlibGUgd2l0aCBjbGllbnRzIHRoYXQgd2FudCBtdWx0aXBhcnQveC1ieXRlcmFuZ2VzCi0gKiBpbnN0ZWFkIG9mIG11bHRpcGFydC9ieXRlcmFuZ2VzIChhbHNvIHNlZSBhYm92ZSksIGFzIHBlciBIVFRQLzEuMS4gV2UKLSAqIGxvb2sgZm9yIHRoZSBSZXF1ZXN0LVJhbmdlIGhlYWRlciAoZS5nLiBOZXRzY2FwZSAyIGFuZCAzKSBhcyBhbiBpbmRpY2F0aW9uCi0gKiB0aGF0IHRoZSBicm93c2VyIHN1cHBvcnRzIGFuIG9sZGVyIHByb3RvY29sLiBXZSBhbHNvIGNoZWNrIFVzZXItQWdlbnQKLSAqIGZvciBNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIgMywgd2hpY2ggbmVlZHMgdGhpcyBhcyB3ZWxsLgotICovCi1zdGF0aWMgaW50IHVzZV9yYW5nZV94KHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvbnN0IGNoYXIgKnVhOwotICAgIHJldHVybiAoYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJSZXF1ZXN0LVJhbmdlIikgfHwKLSAgICAgICAgICAgICgodWEgPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIlVzZXItQWdlbnQiKSkKLSAgICAgICAgICAgICAmJiBzdHJzdHIodWEsICJNU0lFIDMiKSkpOwotfQotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IGFwX3RhYmxlX2RvIGFuZCBtZXJnZXMgYWxsIGluc3RhbmNlcyBvZgotICogdGhlIHBhc3NlZCBmaWVsZCB2YWx1ZXMgaW50byBhIHNpbmdsZSBhcnJheSB0aGF0IHdpbGwgYmUgZnVydGhlcgotICogcHJvY2Vzc2VkIGJ5IHNvbWUgbGF0ZXIgcm91dGluZS4gIE9yaWdpbmFsbHkgaW50ZW5kZWQgdG8gaGVscCBzcGxpdAotICogYW5kIHJlY29tYmluZSBtdWx0aXBsZSBWYXJ5IGZpZWxkcywgdGhvdWdoIGl0IGlzIGdlbmVyaWMgdG8gYW55IGZpZWxkCi0gKiBjb25zaXN0aW5nIG9mIGNvbW1hL3NwYWNlLXNlcGFyYXRlZCB0b2tlbnMuCi0gKi8KLXN0YXRpYyBpbnQgdW5pcV9maWVsZF92YWx1ZXModm9pZCAqZCwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWwpCi17Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKnZhbHVlczsKLSAgICBjaGFyICpzdGFydDsKLSAgICBjaGFyICplOwotICAgIGNoYXIgKipzdHJwcDsKLSAgICBpbnQgIGk7Ci0KLSAgICB2YWx1ZXMgPSAoYXBfYXJyYXlfaGVhZGVyX3QgKilkOwotCi0gICAgZSA9IGFwX3BzdHJkdXAodmFsdWVzLT5jb250LCB2YWwpOwotCi0gICAgZG8gewotICAgICAgICAvKiBGaW5kIGEgbm9uLWVtcHR5IGZpZWxkbmFtZSAqLwotCi0gICAgICAgIHdoaWxlICgqZSA9PSAnLCcgfHwgYXBfaXNzcGFjZSgqZSkpIHsKLSAgICAgICAgICAgICsrZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKmUgPT0gJ1wwJykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhcnQgPSBlOwotICAgICAgICB3aGlsZSAoKmUgIT0gJ1wwJyAmJiAqZSAhPSAnLCcgJiYgIWFwX2lzc3BhY2UoKmUpKSB7Ci0gICAgICAgICAgICArK2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCplICE9ICdcMCcpIHsKLSAgICAgICAgICAgICplKysgPSAnXDAnOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogTm93IGFkZCBpdCB0byB2YWx1ZXMgaWYgaXQgaXNuJ3QgYWxyZWFkeSByZXByZXNlbnRlZC4KLSAgICAgICAgICogQ291bGQgYmUgcmVwbGFjZWQgYnkgYSBhcF9hcnJheV9zdHJjYXNlY21wKCkgaWYgd2UgaGFkIG9uZS4KLSAgICAgICAgICovCi0gICAgICAgIGZvciAoaSA9IDAsIHN0cnBwID0gKGNoYXIgKiopIHZhbHVlcy0+ZWx0czsgaSA8IHZhbHVlcy0+bmVsdHM7Ci0gICAgICAgICAgICAgKytpLCArK3N0cnBwKSB7Ci0gICAgICAgICAgICBpZiAoKnN0cnBwICYmIHN0cmNhc2VjbXAoKnN0cnBwLCBzdGFydCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChpID09IHZhbHVlcy0+bmVsdHMpIHsgIC8qIGlmIG5vdCBmb3VuZCAqLwotICAgICAgICAgICAqKGNoYXIgKiopYXBfcHVzaF9hcnJheSh2YWx1ZXMpID0gc3RhcnQ7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlICgqZSAhPSAnXDAnKTsKLQotICAgIHJldHVybiAxOwotfQotCi0vKgotICogU2luY2Ugc29tZSBjbGllbnRzIGNob2tlIHZpb2xlbnRseSBvbiBtdWx0aXBsZSBWYXJ5IGZpZWxkcywgb3IKLSAqIFZhcnkgZmllbGRzIHdpdGggZHVwbGljYXRlIHRva2VucywgY29tYmluZSBhbnkgbXVsdGlwbGVzIGFuZCByZW1vdmUKLSAqIGFueSBkdXBsaWNhdGVzLgotICovCi1zdGF0aWMgdm9pZCBmaXh1cF92YXJ5KHJlcXVlc3RfcmVjICpyKQotewotICAgIGFwX2FycmF5X2hlYWRlcl90ICp2YXJpZXM7Ci0KLSAgICB2YXJpZXMgPSBhcF9tYWtlX2FycmF5KHItPnBvb2wsIDUsIHNpemVvZihjaGFyICopKTsKLQotICAgIC8qIEV4dHJhY3QgYWxsIFZhcnkgZmllbGRzIGZyb20gdGhlIGhlYWRlcnNfb3V0LCBzZXBhcmF0ZSBlYWNoIGludG8KLSAgICAgKiBpdHMgY29tbWEtc2VwYXJhdGVkIGZpZWxkbmFtZSB2YWx1ZXMsIGFuZCB0aGVuIGFkZCB0aGVtIHRvIHZhcmllcwotICAgICAqIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIGFycmF5LgotICAgICAqLwotICAgIGFwX3RhYmxlX2RvKChpbnQgKCopKHZvaWQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKXVuaXFfZmllbGRfdmFsdWVzLAotCQkodm9pZCAqKSB2YXJpZXMsIHItPmhlYWRlcnNfb3V0LCAiVmFyeSIsIE5VTEwpOwotCi0gICAgLyogSWYgd2UgZm91bmQgYW55LCByZXBsYWNlIG9sZCBWYXJ5IGZpZWxkcyB3aXRoIHVuaXF1ZS1pZmllZCB2YWx1ZSAqLwotCi0gICAgaWYgKHZhcmllcy0+bmVsdHMgPiAwKSB7Ci0JYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIlZhcnkiLAotCQkgICAgICBhcF9hcnJheV9wc3RyY2F0KHItPnBvb2wsIHZhcmllcywgJywnKSk7Ci0gICAgfQotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX3NlbmRfaHR0cF9oZWFkZXIocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IGk7Ci0gICAgY29uc3QgbG9uZyBpbnQgemVybyA9IDBMOwotICAgIGNoYXIgKmRhdGUgPSBOVUxMOwotI2lmZGVmIENIQVJTRVRfRUJDRElDCi0gICAgaW50IGNvbnZlcnQgPSBhcF9iZ2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfRUJDRElDMkFTQ0lJKTsKLSNlbmRpZiAvKkNIQVJTRVRfRUJDRElDKi8KLQotICAgIGlmIChyLT5hc3NiYWNrd2FyZHMpIHsKLSAgICAgICAgaWYgKCFyLT5tYWluKQotICAgICAgICAgICAgYXBfYnNldG9wdChyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJPX0JZVEVDVCwgJnplcm8pOwotICAgICAgICByLT5zZW50X2JvZHljdCA9IDE7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE5vdyB0aGF0IHdlIGFyZSByZWFkeSB0byBzZW5kIGEgcmVzcG9uc2UsIHdlIG5lZWQgdG8gY29tYmluZSB0aGUgdHdvCi0gICAgICogaGVhZGVyIGZpZWxkIHRhYmxlcyBpbnRvIGEgc2luZ2xlIHRhYmxlLiAgSWYgd2UgZG9uJ3QgZG8gdGhpcywgb3VyCi0gICAgICogbGF0ZXIgYXR0ZW1wdHMgdG8gc2V0IG9yIHVuc2V0IGEgZ2l2ZW4gZmllbGRuYW1lIG1pZ2h0IGJlIGJ5cGFzc2VkLgotICAgICAqLwotICAgIGlmICghYXBfaXNfZW1wdHlfdGFibGUoci0+ZXJyX2hlYWRlcnNfb3V0KSkKLSAgICAgICAgci0+aGVhZGVyc19vdXQgPSBhcF9vdmVybGF5X3RhYmxlcyhyLT5wb29sLCByLT5lcnJfaGVhZGVyc19vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+aGVhZGVyc19vdXQpOwotCi0gICAgLyoKLSAgICAgKiBSZW1vdmUgdGhlICdWYXJ5JyBoZWFkZXIgZmllbGQgaWYgdGhlIGNsaWVudCBjYW4ndCBoYW5kbGUgaXQuCi0gICAgICogU2luY2UgdGhpcyB3aWxsIGhhdmUgbmFzdHkgZWZmZWN0cyBvbiBIVFRQLzEuMSBjYWNoZXMsIGZvcmNlCi0gICAgICogdGhlIHJlc3BvbnNlIGludG8gSFRUUC8xLjAgbW9kZS4KLSAgICAgKi8KLSAgICBpZiAoYXBfdGFibGVfZ2V0KHItPnN1YnByb2Nlc3NfZW52LCAiZm9yY2Utbm8tdmFyeSIpICE9IE5VTEwpIHsKLQlhcF90YWJsZV91bnNldChyLT5oZWFkZXJzX291dCwgIlZhcnkiKTsKLQlyLT5wcm90b19udW0gPSBIVFRQX1ZFUlNJT04oMSwwKTsKLQlhcF90YWJsZV9zZXQoci0+c3VicHJvY2Vzc19lbnYsICJmb3JjZS1yZXNwb25zZS0xLjAiLCAiMSIpOwotICAgIH0KLSAgICBlbHNlIHsKLQlmaXh1cF92YXJ5KHIpOwotICAgIH0KLQotICAgIGFwX2Jhc2ljX2h0dHBfaGVhZGVyKHIpOwotCi0jaWZkZWYgQ0hBUlNFVF9FQkNESUMKLSAgICBhcF9ic2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfRUJDRElDMkFTQ0lJLCAxKTsKLSNlbmRpZiAvKkNIQVJTRVRfRUJDRElDKi8KLQotICAgIGFwX3NldF9rZWVwYWxpdmUocik7Ci0KLSAgICBpZiAoci0+Y2h1bmtlZCkgewotICAgICAgICBhcF90YWJsZV9tZXJnZW4oci0+aGVhZGVyc19vdXQsICJUcmFuc2Zlci1FbmNvZGluZyIsICJjaHVua2VkIik7Ci0gICAgICAgIGFwX3RhYmxlX3Vuc2V0KHItPmhlYWRlcnNfb3V0LCAiQ29udGVudC1MZW5ndGgiKTsKLSAgICB9Ci0KLSAgICBpZiAoci0+Ynl0ZXJhbmdlID4gMSkKLSAgICAgICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkNvbnRlbnQtVHlwZSIsCi0gICAgICAgICAgICAgICAgICBhcF9wc3RyY2F0KHItPnBvb2wsICJtdWx0aXBhcnQiLCB1c2VfcmFuZ2VfeChyKSA/ICIveC0iIDogIi8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXJhbmdlczsgYm91bmRhcnk9Iiwgci0+Ym91bmRhcnksIE5VTEwpKTsKLSAgICBlbHNlIGlmIChyLT5jb250ZW50X3R5cGUpCi0gICAgICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJDb250ZW50LVR5cGUiLCByLT5jb250ZW50X3R5cGUpOwotICAgIGVsc2UKLSAgICAgICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkNvbnRlbnQtVHlwZSIsIGFwX2RlZmF1bHRfdHlwZShyKSk7Ci0KLSAgICBpZiAoci0+Y29udGVudF9lbmNvZGluZykKLSAgICAgICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkNvbnRlbnQtRW5jb2RpbmciLCByLT5jb250ZW50X2VuY29kaW5nKTsKLQotICAgIGlmIChyLT5jb250ZW50X2xhbmd1YWdlcyAmJiByLT5jb250ZW50X2xhbmd1YWdlcy0+bmVsdHMpIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHItPmNvbnRlbnRfbGFuZ3VhZ2VzLT5uZWx0czsgKytpKSB7Ci0gICAgICAgICAgICBhcF90YWJsZV9tZXJnZW4oci0+aGVhZGVyc19vdXQsICJDb250ZW50LUxhbmd1YWdlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoY2hhciAqKikgKHItPmNvbnRlbnRfbGFuZ3VhZ2VzLT5lbHRzKSlbaV0pOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHItPmNvbnRlbnRfbGFuZ3VhZ2UpCi0gICAgICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJDb250ZW50LUxhbmd1YWdlIiwgci0+Y29udGVudF9sYW5ndWFnZSk7Ci0KLSAgICAvKgotICAgICAqIENvbnRyb2wgY2FjaGFiaWxpdHkgZm9yIG5vbi1jYWNoYWJsZSByZXNwb25zZXMgaWYgbm90IGFscmVhZHkgc2V0IGJ5Ci0gICAgICogc29tZSBvdGhlciBwYXJ0IG9mIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLSAgICAgKi8KLSAgICBpZiAoci0+bm9fY2FjaGUgJiYgIWFwX3RhYmxlX2dldChyLT5oZWFkZXJzX291dCwgIkV4cGlyZXMiKSkgewotCWRhdGUgPSBhcF9wYWxsb2Moci0+cG9vbCwgQVBfUkZDODIyX0RBVEVfTEVOKTsKLSAgICAgICAgYXBfcmZjODIyX2RhdGUoZGF0ZSwgci0+cmVxdWVzdF90aW1lKTsKLSAgICAgICAgYXBfdGFibGVfYWRkbihyLT5oZWFkZXJzX291dCwgIkV4cGlyZXMiLCBkYXRlKTsKLSAgICB9Ci0KLSAgICAvKiBTZW5kIHRoZSBlbnRpcmUgYXBfdGFibGVfdCBvZiBoZWFkZXIgZmllbGRzLCB0ZXJtaW5hdGVkIGJ5IGFuIGVtcHR5IGxpbmUuICovCi0KLSAgICBhcF90YWJsZV9kbygoaW50ICgqKSAodm9pZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpIGFwX3NlbmRfaGVhZGVyX2ZpZWxkLAotICAgICAgICAgICAgICh2b2lkICopIHIsIHItPmhlYWRlcnNfb3V0LCBOVUxMKTsKLQotICAgIHRlcm1pbmF0ZV9oZWFkZXIocik7Ci0KLQotICAgIGFwX2JzZXRvcHQoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCT19CWVRFQ1QsICZ6ZXJvKTsKLSAgICByLT5zZW50X2JvZHljdCA9IDE7ICAgICAgICAgLyogV2hhdGV2ZXIgZm9sbG93cyBpcyByZWFsIGJvZHkgc3R1ZmYuLi4gKi8KLQotICAgIC8qIFNldCBidWZmZXIgZmxhZ3MgZm9yIHRoZSBib2R5ICovCi0gICAgaWYgKHItPmNodW5rZWQpCi0gICAgICAgIGFwX2JzZXRmbGFnKHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQl9DSFVOSywgMSk7Ci0jaWZkZWYgQ0hBUlNFVF9FQkNESUMKLSAgICBpZiAoIWNvbnZlcnQpCi0gICAgICAgIGFwX2JzZXRmbGFnKHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQl9FQkNESUMyQVNDSUksIGNvbnZlcnQpOwotI2VuZGlmIC8qQ0hBUlNFVF9FQkNESUMqLwotfQotCi0vKiBmaW5hbGl6ZV9yZXF1ZXN0X3Byb3RvY29sIGlzIGNhbGxlZCBhdCBjb21wbGV0aW9uIG9mIHNlbmRpbmcgdGhlCi0gKiByZXNwb25zZS4gIEl0J3Mgc29sZSBwdXJwb3NlIGlzIHRvIHNlbmQgdGhlIHRlcm1pbmF0aW5nIHByb3RvY29sCi0gKiBpbmZvcm1hdGlvbiBmb3IgYW55IHdyYXBwZXJzIGFyb3VuZCB0aGUgcmVzcG9uc2UgbWVzc2FnZSBib2R5Ci0gKiAoaS5lLiwgdHJhbnNmZXIgZW5jb2RpbmdzKS4gIEl0IHNob3VsZCBoYXZlIGJlZW4gbmFtZWQgZmluYWxpemVfcmVzcG9uc2UuCi0gKi8KLUFQSV9FWFBPUlQodm9pZCkgYXBfZmluYWxpemVfcmVxdWVzdF9wcm90b2NvbChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpZiAoci0+Y2h1bmtlZCAmJiAhci0+Y29ubmVjdGlvbi0+YWJvcnRlZCkgewotICAgICAgICAvKgotICAgICAgICAgKiBUdXJuIG9mZiBjaHVua2VkIGVuY29kaW5nIC0tLSB3ZSBjYW4gb25seSBkbyB0aGlzIG9uY2UuCi0gICAgICAgICAqLwotICAgICAgICByLT5jaHVua2VkID0gMDsKLSAgICAgICAgYXBfYnNldGZsYWcoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCX0NIVU5LLCAwKTsKLQotICAgICAgICBhcF9ycHV0cygiMFwwMTVcMDEyIiwgcik7Ci0gICAgICAgIC8qIElmIHdlIGhhZCBmb290ZXIgImhlYWRlcnMiLCB3ZSdkIHNlbmQgdGhlbSBub3cgKi8KLSAgICAgICAgYXBfcnB1dHMoIlwwMTVcMDEyIiwgcik7Ci0gICAgfQotfQotCi0vKiBIZXJlIHdlIGRlYWwgd2l0aCBnZXR0aW5nIHRoZSByZXF1ZXN0IG1lc3NhZ2UgYm9keSBmcm9tIHRoZSBjbGllbnQuCi0gKiBXaGV0aGVyIG9yIG5vdCB0aGUgcmVxdWVzdCBjb250YWlucyBhIGJvZHkgaXMgc2lnbmFsZWQgYnkgdGhlIHByZXNlbmNlCi0gKiBvZiBhIG5vbi16ZXJvIENvbnRlbnQtTGVuZ3RoIG9yIGJ5IGEgVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQuCi0gKgotICogTm90ZSB0aGF0IHRoaXMgaXMgbW9yZSBjb21wbGljYXRlZCB0aGFuIGl0IHdhcyBpbiBBcGFjaGUgMS4xIGFuZCBwcmlvcgotICogdmVyc2lvbnMsIGJlY2F1c2UgY2h1bmtlZCBzdXBwb3J0IG1lYW5zIHRoYXQgdGhlIG1vZHVsZSBkb2VzIGxlc3MuCi0gKgotICogVGhlIHByb3BlciBwcm9jZWR1cmUgaXMgdGhpczoKLSAqCi0gKiAxLiBDYWxsIHNldHVwX2NsaWVudF9ibG9jaygpIG5lYXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVxdWVzdAotICogICAgaGFuZGxlci4gVGhpcyB3aWxsIHNldCB1cCBhbGwgdGhlIG5lY2Vzc2FyeSBwcm9wZXJ0aWVzLCBhbmQgd2lsbAotICogICAgcmV0dXJuIGVpdGhlciBPSywgb3IgYW4gZXJyb3IgY29kZS4gSWYgdGhlIGxhdHRlciwgdGhlIG1vZHVsZSBzaG91bGQKLSAqICAgIHJldHVybiB0aGF0IGVycm9yIGNvZGUuIFRoZSBzZWNvbmQgcGFyYW1ldGVyIHNlbGVjdHMgdGhlIHBvbGljeSB0bwotICogICAgYXBwbHkgaWYgdGhlIHJlcXVlc3QgbWVzc2FnZSBpbmRpY2F0ZXMgYSBib2R5LCBhbmQgaG93IGEgY2h1bmtlZAotICogICAgdHJhbnNmZXItY29kaW5nIHNob3VsZCBiZSBpbnRlcnByZXRlZC4gQ2hvb3NlIG9uZSBvZgotICoKLSAqICAgIFJFUVVFU1RfTk9fQk9EWSAgICAgICAgICBTZW5kIDQxMyBlcnJvciBpZiBtZXNzYWdlIGhhcyBhbnkgYm9keQotICogICAgUkVRVUVTVF9DSFVOS0VEX0VSUk9SICAgIFNlbmQgNDExIGVycm9yIGlmIGJvZHkgd2l0aG91dCBDb250ZW50LUxlbmd0aAotICogICAgUkVRVUVTVF9DSFVOS0VEX0RFQ0hVTksgIElmIGNodW5rZWQsIHJlbW92ZSB0aGUgY2h1bmtzIGZvciBtZS4KLSAqICAgIFJFUVVFU1RfQ0hVTktFRF9QQVNTICAgICBQYXNzIHRoZSBjaHVua3MgdG8gbWUgd2l0aG91dCByZW1vdmFsLgotICoKLSAqICAgIEluIG9yZGVyIHRvIHVzZSB0aGUgbGFzdCB0d28gb3B0aW9ucywgdGhlIGNhbGxlciBNVVNUIHByb3ZpZGUgYSBidWZmZXIKLSAqICAgIGxhcmdlIGVub3VnaCB0byBob2xkIGEgY2h1bmstc2l6ZSBsaW5lLCBpbmNsdWRpbmcgYW55IGV4dGVuc2lvbnMuCi0gKgotICogMi4gV2hlbiB5b3UgYXJlIHJlYWR5IHRvIHJlYWQgYSBib2R5IChpZiBhbnkpLCBjYWxsIHNob3VsZF9jbGllbnRfYmxvY2soKS4KLSAqICAgIFRoaXMgd2lsbCB0ZWxsIHRoZSBtb2R1bGUgd2hldGhlciBvciBub3QgdG8gcmVhZCBpbnB1dC4gSWYgaXQgaXMgMCwKLSAqICAgIHRoZSBtb2R1bGUgc2hvdWxkIGFzc3VtZSB0aGF0IHRoZXJlIGlzIG5vIG1lc3NhZ2UgYm9keSB0byByZWFkLgotICogICAgVGhpcyBzdGVwIGFsc28gc2VuZHMgYSAxMDAgQ29udGludWUgcmVzcG9uc2UgdG8gSFRUUC8xLjEgY2xpZW50cywKLSAqICAgIHNvIHNob3VsZCBub3QgYmUgY2FsbGVkIHVudGlsIHRoZSBtb2R1bGUgaXMgKmRlZmluaXRlbHkqIHJlYWR5IHRvCi0gKiAgICByZWFkIGNvbnRlbnQuIChvdGhlcndpc2UsIHRoZSBwb2ludCBvZiB0aGUgMTAwIHJlc3BvbnNlIGlzIGRlZmVhdGVkKS4KLSAqICAgIE5ldmVyIGNhbGwgdGhpcyBmdW5jdGlvbiBtb3JlIHRoYW4gb25jZS4KLSAqCi0gKiAzLiBGaW5hbGx5LCBjYWxsIGdldF9jbGllbnRfYmxvY2sgaW4gYSBsb29wLiBQYXNzIGl0IGEgYnVmZmVyIGFuZCBpdHMgc2l6ZS4KLSAqICAgIEl0IHdpbGwgcHV0IGRhdGEgaW50byB0aGUgYnVmZmVyIChub3QgbmVjZXNzYXJpbHkgYSBmdWxsIGJ1ZmZlciksIGFuZAotICogICAgcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGJsb2NrLiBXaGVuIGl0IGlzIGRvbmUgcmVhZGluZywgaXQgd2lsbAotICogICAgcmV0dXJuIDAgaWYgRU9GLCBvciAtMSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuCi0gKiAgICBJZiBhbiBlcnJvciBvY2N1cnMgb24gaW5wdXQsIHdlIGZvcmNlIGFuIGVuZCB0byBrZWVwYWxpdmUuCi0gKi8KLQotQVBJX0VYUE9SVChpbnQpIGFwX3NldHVwX2NsaWVudF9ibG9jayhyZXF1ZXN0X3JlYyAqciwgaW50IHJlYWRfcG9saWN5KQotewotICAgIGNvbnN0IGNoYXIgKnRlbmMgPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIlRyYW5zZmVyLUVuY29kaW5nIik7Ci0gICAgY29uc3QgY2hhciAqbGVucCA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiQ29udGVudC1MZW5ndGgiKTsKLSAgICB1bnNpZ25lZCBsb25nIG1heF9ib2R5OwotCi0gICAgci0+cmVhZF9ib2R5ID0gcmVhZF9wb2xpY3k7Ci0gICAgci0+cmVhZF9jaHVua2VkID0gMDsKLSAgICByLT5yZW1haW5pbmcgPSAwOwotCi0gICAgaWYgKHRlbmMpIHsKLSAgICAgICAgaWYgKHN0cmNhc2VjbXAodGVuYywgImNodW5rZWQiKSkgewotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIFRyYW5zZmVyLUVuY29kaW5nICVzIiwgdGVuYyk7Ci0gICAgICAgICAgICByZXR1cm4gSFRUUF9OT1RfSU1QTEVNRU5URUQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHItPnJlYWRfYm9keSA9PSBSRVFVRVNUX0NIVU5LRURfRVJST1IpIHsKLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY2h1bmtlZCBUcmFuc2Zlci1FbmNvZGluZyBmb3JiaWRkZW46ICVzIiwgci0+dXJpKTsKLSAgICAgICAgICAgIHJldHVybiAobGVucCkgPyBIVFRQX0JBRF9SRVFVRVNUIDogSFRUUF9MRU5HVEhfUkVRVUlSRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICByLT5yZWFkX2NodW5rZWQgPSAxOwotICAgIH0KLSAgICBlbHNlIGlmIChsZW5wKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnBvcyA9IGxlbnA7Ci0KLSAgICAgICAgd2hpbGUgKGFwX2lzZGlnaXQoKnBvcykgfHwgYXBfaXNzcGFjZSgqcG9zKSkKLSAgICAgICAgICAgICsrcG9zOwotICAgICAgICBpZiAoKnBvcyAhPSAnXDAnKSB7Ci0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgQ29udGVudC1MZW5ndGggJXMiLCBsZW5wKTsKLSAgICAgICAgICAgIHJldHVybiBIVFRQX0JBRF9SRVFVRVNUOwotICAgICAgICB9Ci0KLSAgICAgICAgci0+cmVtYWluaW5nID0gYXRvbChsZW5wKTsKLSAgICB9Ci0KLSAgICBpZiAoKHItPnJlYWRfYm9keSA9PSBSRVFVRVNUX05PX0JPRFkpICYmCi0gICAgICAgIChyLT5yZWFkX2NodW5rZWQgfHwgKHItPnJlbWFpbmluZyA+IDApKSkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAiJXMgd2l0aCBib2R5IGlzIG5vdCBhbGxvd2VkIGZvciAlcyIsIHItPm1ldGhvZCwgci0+dXJpKTsKLSAgICAgICAgcmV0dXJuIEhUVFBfUkVRVUVTVF9FTlRJVFlfVE9PX0xBUkdFOwotICAgIH0KLQotICAgIG1heF9ib2R5ID0gYXBfZ2V0X2xpbWl0X3JlcV9ib2R5KHIpOwotICAgIGlmIChtYXhfYm9keSAmJiAoci0+cmVtYWluaW5nID4gbWF4X2JvZHkpKSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgIlJlcXVlc3QgY29udGVudC1sZW5ndGggb2YgJXMgaXMgbGFyZ2VyIHRoYW4gdGhlIGNvbmZpZ3VyZWQgIgotICAgICAgICAgICJsaW1pdCBvZiAlbHUiLCBsZW5wLCBtYXhfYm9keSk7Ci0gICAgICAgIHJldHVybiBIVFRQX1JFUVVFU1RfRU5USVRZX1RPT19MQVJHRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLUFQSV9FWFBPUlQoaW50KSBhcF9zaG91bGRfY2xpZW50X2Jsb2NrKHJlcXVlc3RfcmVjICpyKQotewotICAgIC8qIEZpcnN0IGNoZWNrIGlmIHdlIGhhdmUgYWxyZWFkeSByZWFkIHRoZSByZXF1ZXN0IGJvZHkgKi8KLQotICAgIGlmIChyLT5yZWFkX2xlbmd0aCB8fCAoIXItPnJlYWRfY2h1bmtlZCAmJiAoci0+cmVtYWluaW5nIDw9IDApKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoci0+ZXhwZWN0aW5nXzEwMCAmJiByLT5wcm90b19udW0gPj0gSFRUUF9WRVJTSU9OKDEsMSkpIHsKLSAgICAgICAgLyogc2VuZGluZyAxMDAgQ29udGludWUgaW50ZXJpbSByZXNwb25zZSAqLwotICAgICAgICBhcF9ydnB1dHMociwgQVBfU0VSVkVSX1BST1RPQ09MLCAiICIsIHN0YXR1c19saW5lc1swXSwgIlwwMTVcMDEyXDAxNVwwMTIiLAotICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgIGFwX3JmbHVzaChyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGxvbmcgZ2V0X2NodW5rX3NpemUoY2hhciAqYikKLXsKLSAgICBsb25nIGNodW5rc2l6ZSA9IDA7Ci0KLSAgICB3aGlsZSAoYXBfaXN4ZGlnaXQoKmIpKSB7Ci0gICAgICAgIGludCB4dmFsdWUgPSAwOwotCi0gICAgICAgIGlmICgqYiA+PSAnMCcgJiYgKmIgPD0gJzknKQotICAgICAgICAgICAgeHZhbHVlID0gKmIgLSAnMCc7Ci0gICAgICAgIGVsc2UgaWYgKCpiID49ICdBJyAmJiAqYiA8PSAnRicpCi0gICAgICAgICAgICB4dmFsdWUgPSAqYiAtICdBJyArIDB4YTsKLSAgICAgICAgZWxzZSBpZiAoKmIgPj0gJ2EnICYmICpiIDw9ICdmJykKLSAgICAgICAgICAgIHh2YWx1ZSA9ICpiIC0gJ2EnICsgMHhhOwotCi0gICAgICAgIGNodW5rc2l6ZSA9IChjaHVua3NpemUgPDwgNCkgfCB4dmFsdWU7Ci0gICAgICAgICsrYjsKLSAgICB9Ci0KLSAgICByZXR1cm4gY2h1bmtzaXplOwotfQotCi0vKiBnZXRfY2xpZW50X2Jsb2NrIGlzIGNhbGxlZCBpbiBhIGxvb3AgdG8gZ2V0IHRoZSByZXF1ZXN0IG1lc3NhZ2UgYm9keS4KLSAqIFRoaXMgaXMgcXVpdGUgc2ltcGxlIGlmIHRoZSBjbGllbnQgaW5jbHVkZXMgYSBjb250ZW50LWxlbmd0aAotICogKHRoZSBub3JtYWwgY2FzZSksIGJ1dCBnZXRzIG1lc3N5IGlmIHRoZSBib2R5IGlzIGNodW5rZWQuIE5vdGUgdGhhdAotICogci0+cmVtYWluaW5nIGlzIHVzZWQgdG8gbWFpbnRhaW4gc3RhdGUgYWNyb3NzIGNhbGxzIGFuZCB0aGF0Ci0gKiByLT5yZWFkX2xlbmd0aCBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGdpdmVuIHRvIHRoZSBjYWxsZXIKLSAqIGFjcm9zcyBhbGwgaW52b2NhdGlvbnMuICBJdCBpcyBtZXNzeSBiZWNhdXNlIHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCBub3QKLSAqIHRvIHJlYWQgcGFzdCB0aGUgZGF0YSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBzaW5jZSB0aGVzZSByZWFkcyBibG9jay4KLSAqIFJldHVybnMgMCBvbiBFbmQtb2YtYm9keSwgLTEgb24gZXJyb3Igb3IgcHJlbWF0dXJlIGNodW5rIGVuZC4KLSAqCi0gKiBSZWFkaW5nIHRoZSBjaHVua2VkIGVuY29kaW5nIHJlcXVpcmVzIGEgYnVmZmVyIHNpemUgbGFyZ2UgZW5vdWdoIHRvCi0gKiBob2xkIGEgY2h1bmstc2l6ZSBsaW5lLCBpbmNsdWRpbmcgYW55IGV4dGVuc2lvbnMuIEZvciBub3csIHdlJ2xsIGxlYXZlCi0gKiB0aGF0IHRvIHRoZSBjYWxsZXIsIGF0IGxlYXN0IHVudGlsIHdlIGNhbiBjb21lIHVwIHdpdGggYSBiZXR0ZXIgc29sdXRpb24uCi0gKi8KLUFQSV9FWFBPUlQobG9uZykgYXBfZ2V0X2NsaWVudF9ibG9jayhyZXF1ZXN0X3JlYyAqciwgY2hhciAqYnVmZmVyLCBpbnQgYnVmc2l6KQotewotICAgIGludCBjOwotICAgIGFwX3NpemVfdCBsZW5fdG9fcmVhZDsKLSAgICBhcF9zc2l6ZV90IGxlbl9yZWFkOwotICAgIGxvbmcgY2h1bmtfc3RhcnQgPSAwOwotICAgIHVuc2lnbmVkIGxvbmcgbWF4X2JvZHk7Ci0gICAgYXBfc3RhdHVzX3QgcnY7Ci0KLSAgICBpZiAoIXItPnJlYWRfY2h1bmtlZCkgeyAgICAgLyogQ29udGVudC1sZW5ndGggcmVhZCAqLwotICAgICAgICBsZW5fdG9fcmVhZCA9IChyLT5yZW1haW5pbmcgPiBidWZzaXopID8gYnVmc2l6IDogci0+cmVtYWluaW5nOwotICAgICAgICBydiA9IGFwX2JyZWFkKHItPmNvbm5lY3Rpb24tPmNsaWVudCwgYnVmZmVyLCBsZW5fdG9fcmVhZCwgJmxlbl9yZWFkKTsKLSAgICAgICAgaWYgKGxlbl9yZWFkID09IDApIHsgICAgLyogZXJyb3Igb3IgZW9mICovCi0gICAgICAgICAgICBpZiAocnYgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICByLT5jb25uZWN0aW9uLT5rZWVwYWxpdmUgPSAtMTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICByLT5yZWFkX2xlbmd0aCArPSBsZW5fcmVhZDsKLSAgICAgICAgci0+cmVtYWluaW5nIC09IGxlbl9yZWFkOwotICAgICAgICByZXR1cm4gbGVuX3JlYWQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBIYW5kbGUgY2h1bmtlZCByZWFkaW5nIE5vdGU6IHdlIGFyZSBjYXJlZnVsIHRvIHNob3J0ZW4gdGhlIGlucHV0Ci0gICAgICogYnVmc2l6IHNvIHRoYXQgdGhlcmUgd2lsbCBhbHdheXMgYmUgZW5vdWdoIHNwYWNlIGZvciB1cyB0byBhZGQgYSBDUkxGCi0gICAgICogKGlmIG5lY2Vzc2FyeSkuCi0gICAgICovCi0gICAgaWYgKHItPnJlYWRfYm9keSA9PSBSRVFVRVNUX0NIVU5LRURfUEFTUykKLSAgICAgICAgYnVmc2l6IC09IDI7Ci0gICAgaWYgKGJ1ZnNpeiA8PSAwKQotICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAvKiBDYW5ub3QgcmVhZCBjaHVua2VkIHdpdGggYSBzbWFsbCBidWZmZXIgKi8KLQotICAgIC8qIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFscmVhZHkgcmVhZCB0b28gbXVjaCByZXF1ZXN0IGRhdGEuCi0gICAgICogRm9yIGVmZmljaWVuY3kgcmVhc29ucywgd2Ugb25seSBjaGVjayB0aGlzIGF0IHRoZSB0b3Agb2YgZWFjaAotICAgICAqIGNhbGxlciByZWFkIHBhc3MsIHNpbmNlIHRoZSBsaW1pdCBleGlzdHMganVzdCB0byBzdG9wIGluZmluaXRlCi0gICAgICogbGVuZ3RoIHJlcXVlc3RzIGFuZCBub2JvZHkgY2FyZXMgaWYgaXQgZ29lcyBvdmVyIGJ5IG9uZSBidWZmZXIuCi0gICAgICovCi0gICAgbWF4X2JvZHkgPSBhcF9nZXRfbGltaXRfcmVxX2JvZHkocik7Ci0gICAgaWYgKG1heF9ib2R5ICYmIChyLT5yZWFkX2xlbmd0aCA+IG1heF9ib2R5KSkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotICAgICAgICAgICAgIkNodW5rZWQgcmVxdWVzdCBib2R5IGlzIGxhcmdlciB0aGFuIHRoZSBjb25maWd1cmVkIGxpbWl0IG9mICVsdSIsCi0gICAgICAgICAgICBtYXhfYm9keSk7Ci0gICAgICAgIHItPmNvbm5lY3Rpb24tPmtlZXBhbGl2ZSA9IC0xOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKHItPnJlbWFpbmluZyA9PSAwKSB7ICAgIC8qIFN0YXJ0IG9mIG5ldyBjaHVuayAqLwotCi0gICAgICAgIGNodW5rX3N0YXJ0ID0gZ2V0bGluZShidWZmZXIsIGJ1ZnNpeiwgci0+Y29ubmVjdGlvbi0+Y2xpZW50LCAwKTsKLSAgICAgICAgaWYgKChjaHVua19zdGFydCA8PSAwKSB8fCAoY2h1bmtfc3RhcnQgPj0gKGJ1ZnNpeiAtIDEpKQotICAgICAgICAgICAgfHwgIWFwX2lzeGRpZ2l0KCpidWZmZXIpKSB7Ci0gICAgICAgICAgICByLT5jb25uZWN0aW9uLT5rZWVwYWxpdmUgPSAtMTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIGxlbl90b19yZWFkID0gZ2V0X2NodW5rX3NpemUoYnVmZmVyKTsKLQotICAgICAgICBpZiAobGVuX3RvX3JlYWQgPT0gMCkgeyAvKiBMYXN0IGNodW5rIGluZGljYXRlZCwgZ2V0IGZvb3RlcnMgKi8KLSAgICAgICAgICAgIGlmIChyLT5yZWFkX2JvZHkgPT0gUkVRVUVTVF9DSFVOS0VEX0RFQ0hVTkspIHsKLSAgICAgICAgICAgICAgICBnZXRfbWltZV9oZWFkZXJzKHIpOwotICAgICAgICAgICAgICAgIGFwX3NucHJpbnRmKGJ1ZmZlciwgYnVmc2l6LCAiJWxkIiwgci0+cmVhZF9sZW5ndGgpOwotICAgICAgICAgICAgICAgIGFwX3RhYmxlX3Vuc2V0KHItPmhlYWRlcnNfaW4sICJUcmFuc2Zlci1FbmNvZGluZyIpOwotICAgICAgICAgICAgICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19pbiwgIkNvbnRlbnQtTGVuZ3RoIiwKLSAgICAgICAgICAgICAgICAgICAgYXBfcHN0cmR1cChyLT5wb29sLCBidWZmZXIpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHItPnJlbWFpbmluZyA9IC0xOyAgLyogSW5kaWNhdGUgZm9vdGVycyBpbi1wcm9ncmVzcyAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgci0+cmVtYWluaW5nID0gbGVuX3RvX3JlYWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHItPnJlYWRfYm9keSA9PSBSRVFVRVNUX0NIVU5LRURfUEFTUykgewotICAgICAgICAgICAgYnVmZmVyW2NodW5rX3N0YXJ0KytdID0gQ1I7IC8qIFJlc3RvcmUgY2h1bmstc2l6ZSBsaW5lIGVuZCAgKi8KLSAgICAgICAgICAgIGJ1ZmZlcltjaHVua19zdGFydCsrXSA9IExGOwotICAgICAgICAgICAgYnVmZmVyICs9IGNodW5rX3N0YXJ0OyAgICAgIC8qIGFuZCBwYXNzIGxpbmUgb24gdG8gY2FsbGVyICAgKi8KLSAgICAgICAgICAgIGJ1ZnNpeiAtPSBjaHVua19zdGFydDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIFJFUVVFU1RfQ0hVTktFRF9ERUNIVU5LIC0tIGRvIG5vdCBpbmNsdWRlIHRoZSBsZW5ndGggb2YgdGhlCi0gICAgICAgICAgICAgKiBoZWFkZXIgaW4gdGhlIHJldHVybiB2YWx1ZQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBjaHVua19zdGFydCA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdoZW4gUkVRVUVTVF9DSFVOS0VEX1BBU1MsIHdlIGFyZSAqLwotICAgIGlmIChyLT5yZW1haW5pbmcgPT0gLTEpIHsgICAvKiByZWFkaW5nIGZvb3RlcnMgdW50aWwgZW1wdHkgbGluZSAgKi8KLSAgICAgICAgbGVuX3JlYWQgPSBjaHVua19zdGFydDsKLQotICAgICAgICB3aGlsZSAoKGJ1ZnNpeiA+IDEpICYmICgobGVuX3JlYWQgPQotICAgICAgICAgICAgICAgICAgZ2V0bGluZShidWZmZXIsIGJ1ZnNpeiwgci0+Y29ubmVjdGlvbi0+Y2xpZW50LCAxKSkgPiAwKSkgewotCi0gICAgICAgICAgICBpZiAobGVuX3JlYWQgIT0gKGJ1ZnNpeiAtIDEpKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyW2xlbl9yZWFkKytdID0gQ1I7ICAgICAgICAvKiBSZXN0b3JlIGZvb3RlciBsaW5lIGVuZCAgKi8KLSAgICAgICAgICAgICAgICBidWZmZXJbbGVuX3JlYWQrK10gPSBMRjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNodW5rX3N0YXJ0ICs9IGxlbl9yZWFkOwotICAgICAgICAgICAgYnVmZmVyICs9IGxlbl9yZWFkOwotICAgICAgICAgICAgYnVmc2l6IC09IGxlbl9yZWFkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsZW5fcmVhZCA8IDApIHsKLSAgICAgICAgICAgIHItPmNvbm5lY3Rpb24tPmtlZXBhbGl2ZSA9IC0xOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxlbl9yZWFkID09IDApIHsgICAgLyogSW5kaWNhdGVzIGFuIGVtcHR5IGxpbmUgKi8KLSAgICAgICAgICAgIGJ1ZmZlclswXSA9IENSOwotICAgICAgICAgICAgYnVmZmVyWzFdID0gTEY7Ci0gICAgICAgICAgICBjaHVua19zdGFydCArPSAyOwotICAgICAgICAgICAgci0+cmVtYWluaW5nID0gLTI7Ci0gICAgICAgIH0KLSAgICAgICAgci0+cmVhZF9sZW5ndGggKz0gY2h1bmtfc3RhcnQ7Ci0gICAgICAgIHJldHVybiBjaHVua19zdGFydDsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdoZW4gUkVRVUVTVF9DSFVOS0VEX1BBU1MsIHdlICAgICAqLwotICAgIGlmIChyLT5yZW1haW5pbmcgPT0gLTIpIHsgICAvKiBmaW5pc2hlZCBmb290ZXJzIHdoZW4gbGFzdCBjYWxsZWQgKi8KLSAgICAgICAgci0+cmVtYWluaW5nID0gMDsgICAgICAgLyogc28gbm93IHdlIG11c3Qgc2lnbmFsIEVPRiAgICAgICAgICovCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIE90aGVyd2lzZSwgd2UgYXJlIGluIHRoZSBtaWRzdCBvZiByZWFkaW5nIGEgY2h1bmsgb2YgZGF0YSAqLwotCi0gICAgbGVuX3RvX3JlYWQgPSAoci0+cmVtYWluaW5nID4gYnVmc2l6KSA/IGJ1ZnNpeiA6IHItPnJlbWFpbmluZzsKLQotICAgICh2b2lkKSBhcF9icmVhZChyLT5jb25uZWN0aW9uLT5jbGllbnQsIGJ1ZmZlciwgbGVuX3RvX3JlYWQsICZsZW5fcmVhZCk7Ci0gICAgaWYgKGxlbl9yZWFkID09IDApIHsgICAgICAgIC8qIGVycm9yIG9yIGVvZiAqLwotICAgICAgICByLT5jb25uZWN0aW9uLT5rZWVwYWxpdmUgPSAtMTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHItPnJlbWFpbmluZyAtPSBsZW5fcmVhZDsKLQotICAgIGlmIChyLT5yZW1haW5pbmcgPT0gMCkgeyAgICAvKiBFbmQgb2YgY2h1bmssIGdldCB0cmFpbGluZyBDUkxGICovCi0gICAgICAgIGlmICgoYyA9IGFwX2JnZXRjKHItPmNvbm5lY3Rpb24tPmNsaWVudCkpID09IENSKSB7Ci0gICAgICAgICAgICBjID0gYXBfYmdldGMoci0+Y29ubmVjdGlvbi0+Y2xpZW50KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYyAhPSBMRikgewotICAgICAgICAgICAgci0+Y29ubmVjdGlvbi0+a2VlcGFsaXZlID0gLTE7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHItPnJlYWRfYm9keSA9PSBSRVFVRVNUX0NIVU5LRURfUEFTUykgewotICAgICAgICAgICAgYnVmZmVyW2xlbl9yZWFkKytdID0gQ1I7Ci0gICAgICAgICAgICBidWZmZXJbbGVuX3JlYWQrK10gPSBMRjsKLSAgICAgICAgfQotICAgIH0KLSAgICByLT5yZWFkX2xlbmd0aCArPSAoY2h1bmtfc3RhcnQgKyBsZW5fcmVhZCk7Ci0KLSAgICByZXR1cm4gKGNodW5rX3N0YXJ0ICsgbGVuX3JlYWQpOwotfQotCi0vKiBJbiBIVFRQLzEuMSwgYW55IG1ldGhvZCBjYW4gaGF2ZSBhIGJvZHkuICBIb3dldmVyLCBtb3N0IEdFVCBoYW5kbGVycwotICogd291bGRuJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggYSByZXF1ZXN0IGJvZHkgaWYgdGhleSByZWNlaXZlZCBvbmUuCi0gKiBUaGlzIGhlbHBlciByb3V0aW5lIHRlc3RzIGZvciBhbmQgcmVhZHMgYW55IG1lc3NhZ2UgYm9keSBpbiB0aGUgcmVxdWVzdCwKLSAqIHNpbXBseSBkaXNjYXJkaW5nIHdoYXRldmVyIGl0IHJlY2VpdmVzLiAgV2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2UKLSAqIGZhaWxpbmcgdG8gcmVhZCB0aGUgcmVxdWVzdCBib2R5IHdvdWxkIGNhdXNlIGl0IHRvIGJlIGludGVycHJldGVkCi0gKiBhcyB0aGUgbmV4dCByZXF1ZXN0IG9uIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uLgotICoKLSAqIFNpbmNlIHdlIHJldHVybiBhbiBlcnJvciBzdGF0dXMgaWYgdGhlIHJlcXVlc3QgaXMgbWFsZm9ybWVkLCB0aGlzCi0gKiByb3V0aW5lIHNob3VsZCBiZSBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIG5vLWJvZHkgaGFuZGxlciwgZS5nLiwKLSAqCi0gKiAgICBpZiAoKHJldHZhbCA9IGFwX2Rpc2NhcmRfcmVxdWVzdF9ib2R5KHIpKSAhPSBPSykKLSAqICAgICAgICByZXR1cm4gcmV0dmFsOwotICovCi1BUElfRVhQT1JUKGludCkgYXBfZGlzY2FyZF9yZXF1ZXN0X2JvZHkocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IHJ2OwotCi0gICAgaWYgKChydiA9IGFwX3NldHVwX2NsaWVudF9ibG9jayhyLCBSRVFVRVNUX0NIVU5LRURfUEFTUykpKQotICAgICAgICByZXR1cm4gcnY7Ci0KLSAgICAvKiBJbiBvcmRlciB0byBhdm9pZCBzZW5kaW5nIDEwMCBDb250aW51ZSB3aGVuIHdlIGFscmVhZHkga25vdyB0aGUKLSAgICAgKiBmaW5hbCByZXNwb25zZSBzdGF0dXMsIGFuZCB5ZXQgbm90IGtpbGwgdGhlIGNvbm5lY3Rpb24gaWYgdGhlcmUgaXMKLSAgICAgKiBubyByZXF1ZXN0IGJvZHkgdG8gYmUgcmVhZCwgd2UgbmVlZCB0byBkdXBsaWNhdGUgdGhlIHRlc3QgZnJvbQotICAgICAqIGFwX3Nob3VsZF9jbGllbnRfYmxvY2soKSBoZXJlIG5lZ2F0ZWQgcmF0aGVyIHRoYW4gY2FsbCBpdCBkaXJlY3RseS4KLSAgICAgKi8KLSAgICBpZiAoKHItPnJlYWRfbGVuZ3RoID09IDApICYmIChyLT5yZWFkX2NodW5rZWQgfHwgKHItPnJlbWFpbmluZyA+IDApKSkgewotICAgICAgICBjaGFyIGR1bXBidWZbSFVHRV9TVFJJTkdfTEVOXTsKLQotICAgICAgICBpZiAoci0+ZXhwZWN0aW5nXzEwMCkgewotICAgICAgICAgICAgci0+Y29ubmVjdGlvbi0+a2VlcGFsaXZlID0gLTE7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAoKHJ2ID0gYXBfZ2V0X2NsaWVudF9ibG9jayhyLCBkdW1wYnVmLCBIVUdFX1NUUklOR19MRU4pKSA+IDApCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpZiAocnYgPCAwKQotICAgICAgICAgICAgcmV0dXJuIEhUVFBfQkFEX1JFUVVFU1Q7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotLyoKLSAqIFNlbmQgdGhlIGJvZHkgb2YgYSByZXNwb25zZSB0byB0aGUgY2xpZW50LgotICovCi1BUElfRVhQT1JUKGxvbmcpIGFwX3NlbmRfZmQoYXBfZmlsZV90ICpmZCwgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgbG9uZyBsZW4gPSByLT5maW5mby5zaXplOwotI2lmZGVmIEhBVkVfU0VOREZJTEUKLSAgICBpZiAoIXItPmNodW5rZWQpIHsKLSAgICAgICAgYXBfYmZsdXNoKHItPmNvbm5lY3Rpb24tPmNsaWVudCk7Ci0gICAgICAgIGlmIChpb2xfc2VuZGZpbGUoci0+Y29ubmVjdGlvbi0+Y2xpZW50LT5pb2wsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGZkLCAgLyogVGhlIGZpbGUgdG8gc2VuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIC8qIGhlYWRlciBhbmQgdHJhaWxlciBpb3ZlY3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgIC8qIE9mZnNldCBpbiBmaWxlIHRvIGJlZ2luIHNlbmRpbmcgZnJvbSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgMCkgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJhcF9zZW5kX2ZkOiBpb2xfc2VuZGZpbGUgZmFpbGVkLiIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBsZW4gPSBhcF9zZW5kX2ZkX2xlbmd0aChmZCwgciwgLTEpOwotICAgIH0KLSNlbHNlCi0gICAgbGVuID0gYXBfc2VuZF9mZF9sZW5ndGgoZmQsIHIsIC0xKTsKLSNlbmRpZgotICAgIHJldHVybiBsZW47Ci19Ci0KLUFQSV9FWFBPUlQobG9uZykgYXBfc2VuZF9mZF9sZW5ndGgoYXBfZmlsZV90ICpmZCwgcmVxdWVzdF9yZWMgKnIsIGxvbmcgbGVuZ3RoKQotewotICAgIGNoYXIgYnVmW0lPQlVGU0laRV07Ci0gICAgbG9uZyB0b3RhbF9ieXRlc19zZW50ID0gMDsKLSAgICByZWdpc3RlciBpbnQgbzsKLSAgICBhcF9zc2l6ZV90IHc7Ci0gICAgYXBfc3NpemVfdCBuOwotICAgIGFwX3N0YXR1c190IHJ2OwotCi0gICAgaWYgKGxlbmd0aCA9PSAwKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHdoaWxlICghYXBfaXNfYWJvcnRlZChyLT5jb25uZWN0aW9uKSkgewotICAgICAgICBpZiAoKGxlbmd0aCA+IDApICYmICh0b3RhbF9ieXRlc19zZW50ICsgSU9CVUZTSVpFKSA+IGxlbmd0aCkKLSAgICAgICAgICAgIG8gPSBsZW5ndGggLSB0b3RhbF9ieXRlc19zZW50OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBvID0gSU9CVUZTSVpFOwotICAgICAgICAKLSAgICAgICAgbiA9IG87Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHJ2ID0gYXBfcmVhZChmZCwgYnVmLCAmbik7Ci0gICAgICAgIH0gd2hpbGUgKHJ2ID09IEFQUl9FSU5UUiAmJiAhYXBfaXNfYWJvcnRlZChyLT5jb25uZWN0aW9uKSk7Ci0KLSAgICAgICAgaWYgKG4gPCAxKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIG8gPSAwOwotCi0gICAgICAgIHdoaWxlIChuICYmICFhcF9pc19hYm9ydGVkKHItPmNvbm5lY3Rpb24pKSB7Ci0gICAgICAgICAgICBydiA9IGFwX2J3cml0ZShyLT5jb25uZWN0aW9uLT5jbGllbnQsICZidWZbb10sIG4sICZ3KTsKLSAgICAgICAgICAgIGlmICh3ID4gMCkgewotICAgICAgICAgICAgICAgIHRvdGFsX2J5dGVzX3NlbnQgKz0gdzsKLSAgICAgICAgICAgICAgICBuIC09IHc7Ci0gICAgICAgICAgICAgICAgbyArPSB3OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocnYgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWFwX2lzX2Fib3J0ZWQoci0+Y29ubmVjdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19JTkZPLCBydiwgciwKLSAgICAgICAgICAgICAgICAgICAgICJjbGllbnQgc3RvcHBlZCBjb25uZWN0aW9uIGJlZm9yZSBzZW5kIGJvZHkgY29tcGxldGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIGFwX2JzZXRmbGFnKHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQl9FT1VULCAxKTsKLSAgICAgICAgICAgICAgICAgICAgci0+Y29ubmVjdGlvbi0+YWJvcnRlZCA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgU0VUX0JZVEVTX1NFTlQocik7Ci0gICAgcmV0dXJuIHRvdGFsX2J5dGVzX3NlbnQ7Ci19Ci0KLS8qCi0gKiBTZW5kIHRoZSBib2R5IG9mIGEgcmVzcG9uc2UgdG8gdGhlIGNsaWVudC4KLSAqLwotQVBJX0VYUE9SVChsb25nKSBhcF9zZW5kX2ZiKEJVRkYgKmZiLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICByZXR1cm4gYXBfc2VuZF9mYl9sZW5ndGgoZmIsIHIsIC0xKTsKLX0KLQotQVBJX0VYUE9SVChsb25nKSBhcF9zZW5kX2ZiX2xlbmd0aChCVUZGICpmYiwgcmVxdWVzdF9yZWMgKnIsIGxvbmcgbGVuZ3RoKQotewotICAgIGNoYXIgYnVmW0lPQlVGU0laRV07Ci0gICAgbG9uZyB0b3RhbF9ieXRlc19zZW50ID0gMDsKLSAgICBsb25nIHplcm9fdGltZW91dCA9IDA7Ci0gICAgcmVnaXN0ZXIgaW50IG87Ci0gICAgYXBfc3NpemVfdCB3OwotICAgIGFwX3NzaXplX3QgbjsKLSAgICBhcF9zdGF0dXNfdCBydjsKLQotICAgIGlmIChsZW5ndGggPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIGFzIG11Y2ggYXMgcG9zc2libGUgdGhyb3VnaCBub24tYmxvY2tpbmcKLSAgICAgKiByZWFkcyBzbyB0aGF0IGl0IGNhbiBkbyB3cml0ZXMgd2hpbGUgd2FpdGluZyBmb3IgdGhlIENHSSB0bwotICAgICAqIHByb2R1Y2UgbW9yZSBkYXRhLiBUaGlzIHdheSwgdGhlIENHSSdzIG91dHB1dCBnZXRzIHRvIHRoZSBjbGllbnQKLSAgICAgKiBhcyBzb29uIGFzIHBvc3NpYmxlICovCi0KLSAgICBhcF9ic2V0b3B0KGZiLCBCT19USU1FT1VULCAmemVyb190aW1lb3V0KTsKLSAgICB3aGlsZSAoIWFwX2lzX2Fib3J0ZWQoci0+Y29ubmVjdGlvbikpIHsKLSAgICAgICAgcnYgPSBhcF9icmVhZChmYiwgYnVmLCBzaXplb2YoYnVmKSwgJm4pOwotICAgICAgICBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAocnYgPT0gQVBSX1NVQ0NFU1MpIHsgICAgLyogZW9mICovCi0gICAgICAgICAgICAgICAgKHZvaWQpIGFwX3JmbHVzaChyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChydiAhPSBBUFJfRUFHQUlOKSB7Ci0gICAgICAgICAgICAgICAgci0+Y29ubmVjdGlvbi0+YWJvcnRlZCA9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBuZXh0IHJlYWQgd2lsbCBibG9jaywgc28gZmx1c2ggdGhlIGNsaWVudCBub3cgKi8KLSAgICAgICAgICAgIGlmIChhcF9yZmx1c2gocikgPT0gRU9GKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFwX2JzZXRvcHQoZmIsIEJPX1RJTUVPVVQsICZyLT5zZXJ2ZXItPnRpbWVvdXQpOwotICAgICAgICAgICAgcnYgPSBhcF9icmVhZChmYiwgYnVmLCBzaXplb2YoYnVmKSwgJm4pOwotICAgICAgICAgICAgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChydiA9PSBBUFJfU1VDQ0VTUykgeyAgICAgICAgLyogZW9mICovCi0gICAgICAgICAgICAgICAgICAgICh2b2lkKSBhcF9yZmx1c2gocik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHItPmNvbm5lY3Rpb24tPmFib3J0ZWQgPSAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXBfYnNldG9wdChmYiwgQk9fVElNRU9VVCwgJnplcm9fdGltZW91dCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG8gPSAwOwotICAgICAgICB3aGlsZSAobiAmJiAhYXBfaXNfYWJvcnRlZChyLT5jb25uZWN0aW9uKSkgewotICAgICAgICAgICAgcnYgPSBhcF9id3JpdGUoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCAmYnVmW29dLCBuLCAmdyk7Ci0gICAgICAgICAgICBpZiAodyA+IDApIHsKLSAgICAgICAgICAgICAgICB0b3RhbF9ieXRlc19zZW50ICs9IHc7Ci0gICAgICAgICAgICAgICAgbiAtPSB3OwotICAgICAgICAgICAgICAgIG8gKz0gdzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHJ2ICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFhcF9pc19hYm9ydGVkKHItPmNvbm5lY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfSU5GTywgcnYsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50IHN0b3BwZWQgY29ubmVjdGlvbiBiZWZvcmUgcmZsdXNoIGNvbXBsZXRlZCIpOwotICAgICAgICAgICAgICAgICAgICBhcF9ic2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfRU9VVCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIHItPmNvbm5lY3Rpb24tPmFib3J0ZWQgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBTRVRfQllURVNfU0VOVChyKTsKLSAgICByZXR1cm4gdG90YWxfYnl0ZXNfc2VudDsKLX0KLQotI2lmZGVmIFVTRV9NTUFQX0ZJTEVTCi0KLS8qIFRoZSBjb2RlIHdyaXRlcyBNTUFQX1NFR01FTlRfU0laRSBieXRlcyBhdCBhIHRpbWUuICBUaGlzIGlzIGR1ZSB0byBBcGFjaGUncwotICogdGltZW91dCBtb2RlbCwgd2hpY2ggaXMgYSB0aW1lb3V0IHBlci13cml0ZSByYXRoZXIgdGhhbiBhIHRpbWUgZm9yIHRoZQotICogZW50aXJlIHRyYW5zYWN0aW9uIHRvIGNvbXBsZXRlLiAgRXNzZW50aWFsbHkgdGhpcyBzaG91bGQgYmUgc21hbGwgZW5vdWdoCi0gKiBzbyB0aGF0IGluIG9uZSBUaW1lb3V0IHBlcmlvZCwgeW91ciBzbG93ZXN0IGNsaWVudHMgc2hvdWxkIGJlIHJlYXNvbmFibHkKLSAqIGFibGUgdG8gcmVjZWl2ZSB0aGlzIG1hbnkgYnl0ZXMuCi0gKgotICogVG8gdGFrZSBhZHZhbnRhZ2Ugb2YgemVyby1jb3B5IFRDUCB1bmRlciBTb2xhcmlzIDIuNiB0aGlzIHNob3VsZCBiZSBhCi0gKiBtdWx0aXBsZSBvZiAxNmsuICAoQW5kIHlvdSBuZWVkIGEgU3VuQVRNMi4wIG5ldHdvcmsgY2FyZC4pCi0gKi8KLSNpZm5kZWYgTU1BUF9TRUdNRU5UX1NJWkUKLSNkZWZpbmUgTU1BUF9TRUdNRU5UX1NJWkUgICAgICAgMzI3NjgKLSNlbmRpZgotCi0vKiBzZW5kIGRhdGEgZnJvbSBhbiBpbi1tZW1vcnkgYnVmZmVyICovCi1BUElfRVhQT1JUKHNpemVfdCkgYXBfc2VuZF9tbWFwKGFwX21tYXBfdCAqbW0sIHJlcXVlc3RfcmVjICpyLCBzaXplX3Qgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKQotewotICAgIHNpemVfdCB0b3RhbF9ieXRlc19zZW50ID0gMDsKLSAgICBpbnQgbjsKLSAgICBhcF9zc2l6ZV90IHc7Ci0gICAgYXBfc3RhdHVzX3QgcnY7Ci0gICAgY2hhciAqYWRkcjsKLSAgICAKLSAgICBpZiAobGVuZ3RoID09IDApCi0gICAgICAgIHJldHVybiAwOwotCi0KLSAgICBsZW5ndGggKz0gb2Zmc2V0OwotICAgIHdoaWxlICghci0+Y29ubmVjdGlvbi0+YWJvcnRlZCAmJiBvZmZzZXQgPCBsZW5ndGgpIHsKLSAgICAgICAgaWYgKGxlbmd0aCAtIG9mZnNldCA+IE1NQVBfU0VHTUVOVF9TSVpFKSB7Ci0gICAgICAgICAgICBuID0gTU1BUF9TRUdNRU5UX1NJWkU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBuID0gbGVuZ3RoIC0gb2Zmc2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKG4gJiYgIXItPmNvbm5lY3Rpb24tPmFib3J0ZWQpIHsKLSAgICAgICAgICAgIGFwX21tYXBfb2Zmc2V0KCh2b2lkKiopJmFkZHIsIG1tLCBvZmZzZXQpOwotICAgICAgICAgICAgcnYgPSBhcF9id3JpdGUoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBhZGRyLCBuLCAmdyk7Ci0gICAgICAgICAgICBpZiAodyA+IDApIHsKLSAgICAgICAgICAgICAgICB0b3RhbF9ieXRlc19zZW50ICs9IHc7Ci0gICAgICAgICAgICAgICAgbiAtPSB3OwotICAgICAgICAgICAgICAgIG9mZnNldCArPSB3OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocnYgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICBpZiAoci0+Y29ubmVjdGlvbi0+YWJvcnRlZCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocnYgPT0gRUFHQUlOKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19JTkZPLCBydiwgciwKLSAgICAgICAgICAgICAgICAgICAgICJjbGllbnQgc3RvcHBlZCBjb25uZWN0aW9uIGJlZm9yZSBzZW5kIG1tYXAgY29tcGxldGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIGFwX2JzZXRmbGFnKHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQl9FT1VULCAxKTsKLSAgICAgICAgICAgICAgICAgICAgci0+Y29ubmVjdGlvbi0+YWJvcnRlZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIFNFVF9CWVRFU19TRU5UKHIpOwotICAgIHJldHVybiB0b3RhbF9ieXRlc19zZW50OwotfQotI2VuZGlmIC8qIFVTRV9NTUFQX0ZJTEVTICovCi0KLUFQSV9FWFBPUlQoaW50KSBhcF9ycHV0YyhpbnQgYywgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaWYgKHItPmNvbm5lY3Rpb24tPmFib3J0ZWQpCi0gICAgICAgIHJldHVybiBFT0Y7Ci0KLSAgICBpZiAoYXBfYnB1dGMoYywgci0+Y29ubmVjdGlvbi0+Y2xpZW50KSA8IDApIHsKLSAgICAgICAgaWYgKCFyLT5jb25uZWN0aW9uLT5hYm9ydGVkKSB7Ci0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0lORk8sCi0gICAgICAgICAgICAgICAgYXBfYmVycm9yKHItPmNvbm5lY3Rpb24tPmNsaWVudCksIHIsCi0gICAgICAgICAgICAgICAgImNsaWVudCBzdG9wcGVkIGNvbm5lY3Rpb24gYmVmb3JlIHJwdXRjIGNvbXBsZXRlZCIpOwotICAgICAgICAgICAgYXBfYnNldGZsYWcoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCX0VPVVQsIDEpOwotICAgICAgICAgICAgci0+Y29ubmVjdGlvbi0+YWJvcnRlZCA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEVPRjsKLSAgICB9Ci0gICAgU0VUX0JZVEVTX1NFTlQocik7Ci0gICAgcmV0dXJuIGM7Ci19Ci0KLUFQSV9FWFBPUlQoaW50KSBhcF9ycHV0cyhjb25zdCBjaGFyICpzdHIsIHJlcXVlc3RfcmVjICpyKQotewotICAgIGludCByY29kZTsKLQotICAgIGlmIChyLT5jb25uZWN0aW9uLT5hYm9ydGVkKQotICAgICAgICByZXR1cm4gRU9GOwotICAgIAotICAgIHJjb2RlID0gYXBfYnB1dHMoc3RyLCByLT5jb25uZWN0aW9uLT5jbGllbnQpOwotICAgIGlmIChyY29kZSA8IDApIHsKLSAgICAgICAgaWYgKCFyLT5jb25uZWN0aW9uLT5hYm9ydGVkKSB7Ci0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0lORk8sCi0gICAgICAgICAgICAgICAgYXBfYmVycm9yKHItPmNvbm5lY3Rpb24tPmNsaWVudCksIHIsCi0gICAgICAgICAgICAgICAgImNsaWVudCBzdG9wcGVkIGNvbm5lY3Rpb24gYmVmb3JlIHJwdXRzIGNvbXBsZXRlZCIpOwotICAgICAgICAgICAgYXBfYnNldGZsYWcoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCX0VPVVQsIDEpOwotICAgICAgICAgICAgci0+Y29ubmVjdGlvbi0+YWJvcnRlZCA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEVPRjsKLSAgICB9Ci0gICAgU0VUX0JZVEVTX1NFTlQocik7Ci0gICAgcmV0dXJuIHJjb2RlOwotfQotCi1BUElfRVhQT1JUKGludCkgYXBfcndyaXRlKGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG5ieXRlLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBhcF9zc2l6ZV90IG47Ci0gICAgYXBfc3RhdHVzX3QgcnY7Ci0KLSAgICBpZiAoci0+Y29ubmVjdGlvbi0+YWJvcnRlZCkKLSAgICAgICAgcmV0dXJuIEVPRjsKLQotICAgIHJ2ID0gYXBfYndyaXRlKHItPmNvbm5lY3Rpb24tPmNsaWVudCwgYnVmLCBuYnl0ZSwgJm4pOwotICAgIGlmIChuIDwgMCkgewotICAgICAgICBpZiAoIXItPmNvbm5lY3Rpb24tPmFib3J0ZWQpIHsKLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfSU5GTywgcnYsIHIsCi0gICAgICAgICAgICAgICAgImNsaWVudCBzdG9wcGVkIGNvbm5lY3Rpb24gYmVmb3JlIHJ3cml0ZSBjb21wbGV0ZWQiKTsKLSAgICAgICAgICAgIGFwX2JzZXRmbGFnKHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQl9FT1VULCAxKTsKLSAgICAgICAgICAgIHItPmNvbm5lY3Rpb24tPmFib3J0ZWQgPSAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBFT0Y7Ci0gICAgfQotICAgIFNFVF9CWVRFU19TRU5UKHIpOwotICAgIHJldHVybiBuOwotfQotCi1BUElfRVhQT1JUKGludCkgYXBfdnJwcmludGYocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKLXsKLSAgICBpbnQgbjsKLQotICAgIGlmIChyLT5jb25uZWN0aW9uLT5hYm9ydGVkKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBuID0gYXBfdmJwcmludGYoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBmbXQsIGFwKTsKLQotICAgIGlmIChuIDwgMCkgewotICAgICAgICBpZiAoIXItPmNvbm5lY3Rpb24tPmFib3J0ZWQpIHsKLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfSU5GTywKLSAgICAgICAgICAgICAgICBhcF9iZXJyb3Ioci0+Y29ubmVjdGlvbi0+Y2xpZW50KSwgciwKLSAgICAgICAgICAgICAgICAiY2xpZW50IHN0b3BwZWQgY29ubmVjdGlvbiBiZWZvcmUgdnJwcmludGYgY29tcGxldGVkIik7Ci0gICAgICAgICAgICBhcF9ic2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfRU9VVCwgMSk7Ci0gICAgICAgICAgICByLT5jb25uZWN0aW9uLT5hYm9ydGVkID0gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIFNFVF9CWVRFU19TRU5UKHIpOwotICAgIHJldHVybiBuOwotfQotCi1BUElfRVhQT1JUKGludCkgYXBfcnByaW50ZihyZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqZm10LC4uLikKLXsKLSAgICB2YV9saXN0IHZsaXN0OwotICAgIGludCBuOwotCi0gICAgaWYgKHItPmNvbm5lY3Rpb24tPmFib3J0ZWQpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIHZhX3N0YXJ0KHZsaXN0LCBmbXQpOwotICAgIG4gPSBhcF92YnByaW50ZihyLT5jb25uZWN0aW9uLT5jbGllbnQsIGZtdCwgdmxpc3QpOwotICAgIHZhX2VuZCh2bGlzdCk7Ci0KLSAgICBpZiAobiA8IDApIHsKLSAgICAgICAgaWYgKCFyLT5jb25uZWN0aW9uLT5hYm9ydGVkKSB7Ci0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0lORk8sCi0gICAgICAgICAgICAgICAgYXBfYmVycm9yKHItPmNvbm5lY3Rpb24tPmNsaWVudCksIHIsCi0gICAgICAgICAgICAgICAgImNsaWVudCBzdG9wcGVkIGNvbm5lY3Rpb24gYmVmb3JlIHJwcmludGYgY29tcGxldGVkIik7Ci0gICAgICAgICAgICBhcF9ic2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfRU9VVCwgMSk7Ci0gICAgICAgICAgICByLT5jb25uZWN0aW9uLT5hYm9ydGVkID0gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIFNFVF9CWVRFU19TRU5UKHIpOwotICAgIHJldHVybiBuOwotfQotCi1BUElfRVhQT1JUX05PTlNURChpbnQpIGFwX3J2cHV0cyhyZXF1ZXN0X3JlYyAqciwuLi4pCi17Ci0gICAgdmFfbGlzdCBhcmdzOwotICAgIGFwX3NzaXplX3QgaTsKLSAgICBpbnQgaiwgazsKLSAgICBjb25zdCBjaGFyICp4OwotICAgIEJVRkYgKmZiID0gci0+Y29ubmVjdGlvbi0+Y2xpZW50OwotICAgIGFwX3N0YXR1c190IHJ2OwotCi0gICAgaWYgKHItPmNvbm5lY3Rpb24tPmFib3J0ZWQpCi0gICAgICAgIHJldHVybiBFT0Y7Ci0KLSAgICB2YV9zdGFydChhcmdzLCByKTsKLSAgICBmb3IgKGsgPSAwOzspIHsKLSAgICAgICAgeCA9IHZhX2FyZyhhcmdzLCBjb25zdCBjaGFyICopOwotICAgICAgICBpZiAoeCA9PSBOVUxMKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGogPSBzdHJsZW4oeCk7Ci0gICAgICAgIHJ2ID0gYXBfYndyaXRlKGZiLCB4LCBqLCAmaSk7Ci0gICAgICAgIGlmIChpICE9IGopIHsKLSAgICAgICAgICAgIHZhX2VuZChhcmdzKTsKLSAgICAgICAgICAgIGlmICghci0+Y29ubmVjdGlvbi0+YWJvcnRlZCkgewotICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfSU5GTywgcnYsIHIsCi0gICAgICAgICAgICAgICAgICAgICJjbGllbnQgc3RvcHBlZCBjb25uZWN0aW9uIGJlZm9yZSBydnB1dHMgY29tcGxldGVkIik7Ci0gICAgICAgICAgICAgICAgYXBfYnNldGZsYWcoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCX0VPVVQsIDEpOwotICAgICAgICAgICAgICAgIHItPmNvbm5lY3Rpb24tPmFib3J0ZWQgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEVPRjsKLSAgICAgICAgfQotICAgICAgICBrICs9IGk7Ci0gICAgfQotICAgIHZhX2VuZChhcmdzKTsKLQotICAgIFNFVF9CWVRFU19TRU5UKHIpOwotICAgIHJldHVybiBrOwotfQotCi1BUElfRVhQT1JUKGludCkgYXBfcmZsdXNoKHJlcXVlc3RfcmVjICpyKQotewotICAgIGFwX3N0YXR1c190IHJ2OwotCi0gICAgaWYgKChydiA9IGFwX2JmbHVzaChyLT5jb25uZWN0aW9uLT5jbGllbnQpKSAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICBpZiAoIWFwX2lzX2Fib3J0ZWQoci0+Y29ubmVjdGlvbikpIHsKLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfSU5GTywgcnYsIHIsCi0gICAgICAgICAgICAgICAgImNsaWVudCBzdG9wcGVkIGNvbm5lY3Rpb24gYmVmb3JlIHJmbHVzaCBjb21wbGV0ZWQiKTsKLSAgICAgICAgICAgIGFwX2JzZXRmbGFnKHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQl9FT1VULCAxKTsKLSAgICAgICAgICAgIHItPmNvbm5lY3Rpb24tPmFib3J0ZWQgPSAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBFT0Y7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKiBXZSBzaG91bGQgaGF2ZSBuYW1lZCB0aGlzIHNlbmRfY2FubmVkX3Jlc3BvbnNlLCBzaW5jZSBpdCBpcyB1c2VkIGZvciBhbnkKLSAqIHJlc3BvbnNlIHRoYXQgY2FuIGJlIGdlbmVyYXRlZCBieSB0aGUgc2VydmVyIGZyb20gdGhlIHJlcXVlc3QgcmVjb3JkLgotICogVGhpcyBpbmNsdWRlcyBhbGwgMjA0IChubyBjb250ZW50KSwgM3h4IChyZWRpcmVjdCksIDR4eCAoY2xpZW50IGVycm9yKSwKLSAqIGFuZCA1eHggKHNlcnZlciBlcnJvcikgbWVzc2FnZXMgdGhhdCBoYXZlIG5vdCBiZWVuIHJlZGlyZWN0ZWQgdG8gYW5vdGhlcgotICogaGFuZGxlciB2aWEgdGhlIEVycm9yRG9jdW1lbnQgZmVhdHVyZS4KLSAqLwotQVBJX0VYUE9SVCh2b2lkKSBhcF9zZW5kX2Vycm9yX3Jlc3BvbnNlKHJlcXVlc3RfcmVjICpyLCBpbnQgcmVjdXJzaXZlX2Vycm9yKQotewotICAgIGludCBzdGF0dXMgPSByLT5zdGF0dXM7Ci0gICAgaW50IGlkeCA9IGFwX2luZGV4X29mX3Jlc3BvbnNlKHN0YXR1cyk7Ci0gICAgY2hhciAqY3VzdG9tX3Jlc3BvbnNlOwotICAgIGNvbnN0IGNoYXIgKmxvY2F0aW9uID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfb3V0LCAiTG9jYXRpb24iKTsKLQotICAgIC8qCi0gICAgICogSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBMb2NhdGlvbiBmaWVsZCBtaWdodCBiZSBpbiByLT5lcnJfaGVhZGVyc19vdXQKLSAgICAgKiBpbnN0ZWFkIG9mIHItPmhlYWRlcnNfb3V0OyB1c2UgdGhlIGxhdHRlciBpZiBwb3NzaWJsZSwgZWxzZSB0aGUKLSAgICAgKiBmb3JtZXIuCi0gICAgICovCi0gICAgaWYgKGxvY2F0aW9uID09IE5VTEwpIHsKLQlsb2NhdGlvbiA9IGFwX3RhYmxlX2dldChyLT5lcnJfaGVhZGVyc19vdXQsICJMb2NhdGlvbiIpOwotICAgIH0KLSAgICAvKiBXZSBuZWVkIHRvIHNwZWNpYWwtY2FzZSB0aGUgaGFuZGxpbmcgb2YgMjA0IGFuZCAzMDQgcmVzcG9uc2VzLAotICAgICAqIHNpbmNlIHRoZXkgaGF2ZSBzcGVjaWZpYyBIVFRQIHJlcXVpcmVtZW50cyBhbmQgZG8gbm90IGluY2x1ZGUgYQotICAgICAqIG1lc3NhZ2UgYm9keS4gIE5vdGUgdGhhdCBiZWluZyBhc3NiYWNrd2FyZHMgaGVyZSBpcyBub3QgYW4gb3B0aW9uLgotICAgICAqLwotICAgIGlmIChzdGF0dXMgPT0gSFRUUF9OT1RfTU9ESUZJRUQpIHsKLSAgICAgICAgaWYgKCFhcF9pc19lbXB0eV90YWJsZShyLT5lcnJfaGVhZGVyc19vdXQpKQotICAgICAgICAgICAgci0+aGVhZGVyc19vdXQgPSBhcF9vdmVybGF5X3RhYmxlcyhyLT5wb29sLCByLT5lcnJfaGVhZGVyc19vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0KTsKLSAgICAgICAgYXBfYmFzaWNfaHR0cF9oZWFkZXIocik7Ci0gICAgICAgIGFwX3NldF9rZWVwYWxpdmUocik7Ci0KLSAgICAgICAgYXBfdGFibGVfZG8oKGludCAoKikodm9pZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpIGFwX3NlbmRfaGVhZGVyX2ZpZWxkLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSByLCByLT5oZWFkZXJzX291dCwKLSAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24iLAotICAgICAgICAgICAgICAgICAgICAiS2VlcC1BbGl2ZSIsCi0gICAgICAgICAgICAgICAgICAgICJFVGFnIiwKLSAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQtTG9jYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAiRXhwaXJlcyIsCi0gICAgICAgICAgICAgICAgICAgICJDYWNoZS1Db250cm9sIiwKLSAgICAgICAgICAgICAgICAgICAgIlZhcnkiLAotICAgICAgICAgICAgICAgICAgICAiV2FybmluZyIsCi0gICAgICAgICAgICAgICAgICAgICJXV1ctQXV0aGVudGljYXRlIiwKLSAgICAgICAgICAgICAgICAgICAgIlByb3h5LUF1dGhlbnRpY2F0ZSIsCi0gICAgICAgICAgICAgICAgICAgIE5VTEwpOwotCi0gICAgICAgIHRlcm1pbmF0ZV9oZWFkZXIocik7Ci0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChzdGF0dXMgPT0gSFRUUF9OT19DT05URU5UKSB7Ci0gICAgICAgIGFwX3NlbmRfaHR0cF9oZWFkZXIocik7Ci0gICAgICAgIGFwX2ZpbmFsaXplX3JlcXVlc3RfcHJvdG9jb2wocik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIXItPmFzc2JhY2t3YXJkcykgewotICAgICAgICBhcF90YWJsZV90ICp0bXAgPSByLT5oZWFkZXJzX291dDsKLQotICAgICAgICAvKiBGb3IgYWxsIEhUVFAvMS54IHJlc3BvbnNlcyBmb3Igd2hpY2ggd2UgZ2VuZXJhdGUgdGhlIG1lc3NhZ2UsCi0gICAgICAgICAqIHdlIG5lZWQgdG8gYXZvaWQgaW5oZXJpdGluZyB0aGUgIm5vcm1hbCBzdGF0dXMiIGhlYWRlciBmaWVsZHMKLSAgICAgICAgICogdGhhdCBtYXkgaGF2ZSBiZWVuIHNldCBieSB0aGUgcmVxdWVzdCBoYW5kbGVyIGJlZm9yZSB0aGUKLSAgICAgICAgICogZXJyb3Igb3IgcmVkaXJlY3QsIGV4Y2VwdCBmb3IgTG9jYXRpb24gb24gZXh0ZXJuYWwgcmVkaXJlY3RzLgotICAgICAgICAgKi8KLSAgICAgICAgci0+aGVhZGVyc19vdXQgPSByLT5lcnJfaGVhZGVyc19vdXQ7Ci0gICAgICAgIHItPmVycl9oZWFkZXJzX291dCA9IHRtcDsKLSAgICAgICAgYXBfY2xlYXJfdGFibGUoci0+ZXJyX2hlYWRlcnNfb3V0KTsKLQotICAgICAgICBpZiAoYXBfaXNfSFRUUF9SRURJUkVDVChzdGF0dXMpIHx8IChzdGF0dXMgPT0gSFRUUF9DUkVBVEVEKSkgewotICAgICAgICAgICAgaWYgKChsb2NhdGlvbiAhPSBOVUxMKSAmJiAqbG9jYXRpb24pIHsKLQkgICAgICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJMb2NhdGlvbiIsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gIiI7ICAgLyogYXZvaWRzIGNvcmVkdW1wIHdoZW4gcHJpbnRpbmcsIGJlbG93ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByLT5jb250ZW50X2xhbmd1YWdlID0gTlVMTDsKLSAgICAgICAgci0+Y29udGVudF9sYW5ndWFnZXMgPSBOVUxMOwotICAgICAgICByLT5jb250ZW50X2VuY29kaW5nID0gTlVMTDsKLSAgICAgICAgci0+Y2xlbmd0aCA9IDA7Ci0gICAgICAgIHItPmNvbnRlbnRfdHlwZSA9ICJ0ZXh0L2h0bWwiOwotCi0gICAgICAgIGlmICgoc3RhdHVzID09IE1FVEhPRF9OT1RfQUxMT1dFRCkgfHwgKHN0YXR1cyA9PSBOT1RfSU1QTEVNRU5URUQpKQotICAgICAgICAgICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkFsbG93IiwgbWFrZV9hbGxvdyhyKSk7Ci0KLSAgICAgICAgYXBfc2VuZF9odHRwX2hlYWRlcihyKTsKLQotICAgICAgICBpZiAoci0+aGVhZGVyX29ubHkpIHsKLSAgICAgICAgICAgIGFwX2ZpbmFsaXplX3JlcXVlc3RfcHJvdG9jb2wocik7Ci0gICAgICAgICAgICBhcF9yZmx1c2gocik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoKGN1c3RvbV9yZXNwb25zZSA9IGFwX3Jlc3BvbnNlX2NvZGVfc3RyaW5nKHIsIGlkeCkpKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFdlIGhhdmUgYSBjdXN0b20gcmVzcG9uc2Ugb3V0cHV0LiBUaGlzIHNob3VsZCBvbmx5IGJlCi0gICAgICAgICAqIGEgdGV4dC1zdHJpbmcgdG8gd3JpdGUgYmFjay4gQnV0IGlmIHRoZSBFcnJvckRvY3VtZW50Ci0gICAgICAgICAqIHdhcyBhIGxvY2FsIHJlZGlyZWN0IGFuZCB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGZhaWxlZAotICAgICAgICAgKiBmb3IgYW55IHJlYXNvbiwgdGhlIGN1c3RvbV9yZXNwb25zZSB3aWxsIHN0aWxsIGhvbGQgdGhlCi0gICAgICAgICAqIHJlZGlyZWN0IFVSTC4gV2UgZG9uJ3QgcmVhbGx5IHdhbnQgdG8gb3V0cHV0IHRoaXMgVVJMCi0gICAgICAgICAqIGFzIGEgdGV4dCBtZXNzYWdlLCBzbyBmaXJzdCBjaGVjayB0aGUgY3VzdG9tIHJlc3BvbnNlCi0gICAgICAgICAqIHN0cmluZyB0byBlbnN1cmUgdGhhdCBpdCBpcyBhIHRleHQtc3RyaW5nICh1c2luZyB0aGUKLSAgICAgICAgICogc2FtZSB0ZXN0IHVzZWQgaW4gYXBfZGllKCksIGkuZS4gZG9lcyBpdCBzdGFydCB3aXRoIGEgIikuCi0gICAgICAgICAqIElmIGl0IGRvZXNuJ3QsIHdlJ3ZlIGdvdCBhIHJlY3Vyc2l2ZSBlcnJvciwgc28gZmluZAotICAgICAgICAgKiB0aGUgb3JpZ2luYWwgZXJyb3IgYW5kIG91dHB1dCB0aGF0IGFzIHdlbGwuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoY3VzdG9tX3Jlc3BvbnNlWzBdID09ICdcIicpIHsKLSAgICAgICAgICAgIGFwX3JwdXRzKGN1c3RvbV9yZXNwb25zZSArIDEsIHIpOwotICAgICAgICAgICAgYXBfZmluYWxpemVfcmVxdWVzdF9wcm90b2NvbChyKTsKLSAgICAgICAgICAgIGFwX3JmbHVzaChyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvKgotICAgICAgICAgKiBSZWRpcmVjdCBmYWlsZWQsIHNvIGdldCBiYWNrIHRoZSBvcmlnaW5hbCBlcnJvcgotICAgICAgICAgKi8KLSAgICAgICAgd2hpbGUgKHItPnByZXYgJiYgKHItPnByZXYtPnN0YXR1cyAhPSBIVFRQX09LKSkKLSAgICAgICAgICAgIHIgPSByLT5wcmV2OwotICAgIH0KLSAgICB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnRpdGxlID0gc3RhdHVzX2xpbmVzW2lkeF07Ci0gICAgICAgIGNvbnN0IGNoYXIgKmgxOwotICAgICAgICBjb25zdCBjaGFyICplcnJvcl9ub3RlczsKLQotICAgICAgICAvKiBBY2NlcHQgYSBzdGF0dXNfbGluZSBzZXQgYnkgYSBtb2R1bGUsIGJ1dCBvbmx5IGlmIGl0IGJlZ2lucwotICAgICAgICAgKiB3aXRoIHRoZSAzIGRpZ2l0IHN0YXR1cyBjb2RlCi0gICAgICAgICAqLwotICAgICAgICBpZiAoci0+c3RhdHVzX2xpbmUgIT0gTlVMTAotICAgICAgICAgICAgJiYgc3RybGVuKHItPnN0YXR1c19saW5lKSA+IDQgICAgICAgLyogbG9uZyBlbm91Z2ggKi8KLSAgICAgICAgICAgICYmIGFwX2lzZGlnaXQoci0+c3RhdHVzX2xpbmVbMF0pCi0gICAgICAgICAgICAmJiBhcF9pc2RpZ2l0KHItPnN0YXR1c19saW5lWzFdKQotICAgICAgICAgICAgJiYgYXBfaXNkaWdpdChyLT5zdGF0dXNfbGluZVsyXSkKLSAgICAgICAgICAgICYmIGFwX2lzc3BhY2Uoci0+c3RhdHVzX2xpbmVbM10pCi0gICAgICAgICAgICAmJiBhcF9pc2FsbnVtKHItPnN0YXR1c19saW5lWzRdKSkgewotICAgICAgICAgICAgdGl0bGUgPSByLT5zdGF0dXNfbGluZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGZvbGtzIGRlY2lkZWQgdGhleSBkaWRuJ3Qgd2FudCB0aGUgZXJyb3IgY29kZSBpbiB0aGUgSDEgdGV4dCAqLwotICAgICAgICBoMSA9ICZ0aXRsZVs0XTsKLQotICAgICAgICBhcF9ydnB1dHMociwKLSAgICAgICAgICAgICAgICAgIERPQ1RZUEVfSFRNTF8yXzAKLSAgICAgICAgICAgICAgICAgICI8SFRNTD48SEVBRD5cbjxUSVRMRT4iLCB0aXRsZSwKLSAgICAgICAgICAgICAgICAgICI8L1RJVExFPlxuPC9IRUFEPjxCT0RZPlxuPEgxPiIsIGgxLCAiPC9IMT5cbiIsCi0gICAgICAgICAgICAgICAgICBOVUxMKTsKLQotCXN3aXRjaCAoc3RhdHVzKSB7Ci0JY2FzZSBIVFRQX01PVkVEX1BFUk1BTkVOVExZOgotCWNhc2UgSFRUUF9NT1ZFRF9URU1QT1JBUklMWToKLQljYXNlIEhUVFBfVEVNUE9SQVJZX1JFRElSRUNUOgotCSAgICBhcF9ydnB1dHMociwgIlRoZSBkb2N1bWVudCBoYXMgbW92ZWQgPEEgSFJFRj1cIiIsCi0JCSAgICAgIGFwX2VzY2FwZV9odG1sKHItPnBvb2wsIGxvY2F0aW9uKSwgIlwiPmhlcmU8L0E+LjxQPlxuIiwKLQkJICAgICAgTlVMTCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgSFRUUF9TRUVfT1RIRVI6Ci0JICAgIGFwX3J2cHV0cyhyLCAiVGhlIGFuc3dlciB0byB5b3VyIHJlcXVlc3QgaXMgbG9jYXRlZCA8QSBIUkVGPVwiIiwKLQkJICAgICAgYXBfZXNjYXBlX2h0bWwoci0+cG9vbCwgbG9jYXRpb24pLCAiXCI+aGVyZTwvQT4uPFA+XG4iLAotCQkgICAgICBOVUxMKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBIVFRQX1VTRV9QUk9YWToKLQkgICAgYXBfcnZwdXRzKHIsICJUaGlzIHJlc291cmNlIGlzIG9ubHkgYWNjZXNzaWJsZSAiCi0JCSAgICAgICJ0aHJvdWdoIHRoZSBwcm94eVxuIiwKLQkJICAgICAgYXBfZXNjYXBlX2h0bWwoci0+cG9vbCwgbG9jYXRpb24pLAotCQkgICAgICAiPEJSPlxuWW91IHdpbGwgbmVlZCB0byAiLAotCQkgICAgICAiY29uZmlndXJlIHlvdXIgY2xpZW50IHRvIHVzZSB0aGF0IHByb3h5LjxQPlxuIiwgTlVMTCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgSFRUUF9QUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRDoKLQljYXNlIEFVVEhfUkVRVUlSRUQ6Ci0JICAgIGFwX3JwdXRzKCJUaGlzIHNlcnZlciBjb3VsZCBub3QgdmVyaWZ5IHRoYXQgeW91XG4iCi0JICAgICAgICAgICAgICJhcmUgYXV0aG9yaXplZCB0byBhY2Nlc3MgdGhlIGRvY3VtZW50XG4iCi0JICAgICAgICAgICAgICJyZXF1ZXN0ZWQuICBFaXRoZXIgeW91IHN1cHBsaWVkIHRoZSB3cm9uZ1xuIgotCSAgICAgICAgICAgICAiY3JlZGVudGlhbHMgKGUuZy4sIGJhZCBwYXNzd29yZCksIG9yIHlvdXJcbiIKLQkgICAgICAgICAgICAgImJyb3dzZXIgZG9lc24ndCB1bmRlcnN0YW5kIGhvdyB0byBzdXBwbHlcbiIKLQkgICAgICAgICAgICAgInRoZSBjcmVkZW50aWFscyByZXF1aXJlZC48UD5cbiIsIHIpOwotCSAgICBicmVhazsKLQljYXNlIEJBRF9SRVFVRVNUOgotCSAgICBhcF9ycHV0cygiWW91ciBicm93c2VyIHNlbnQgYSByZXF1ZXN0IHRoYXQgIgotCSAgICAgICAgICAgICAidGhpcyBzZXJ2ZXIgY291bGQgbm90IHVuZGVyc3RhbmQuPFA+XG4iLCByKTsKLQkgICAgaWYgKChlcnJvcl9ub3RlcyA9IGFwX3RhYmxlX2dldChyLT5ub3RlcywgImVycm9yLW5vdGVzIikpICE9IE5VTEwpIHsKLQkJYXBfcnZwdXRzKHIsIGVycm9yX25vdGVzLCAiPFA+XG4iLCBOVUxMKTsKLQkgICAgfQotCSAgICBicmVhazsKLQljYXNlIEhUVFBfRk9SQklEREVOOgotCSAgICBhcF9ydnB1dHMociwgIllvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzICIsCi0JCSAgICAgIGFwX2VzY2FwZV9odG1sKHItPnBvb2wsIHItPnVyaSksCi0JCSAgICAgICJcbm9uIHRoaXMgc2VydmVyLjxQPlxuIiwgTlVMTCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgTk9UX0ZPVU5EOgotCSAgICBhcF9ydnB1dHMociwgIlRoZSByZXF1ZXN0ZWQgVVJMICIsCi0JCSAgICAgIGFwX2VzY2FwZV9odG1sKHItPnBvb2wsIHItPnVyaSksCi0JCSAgICAgICIgd2FzIG5vdCBmb3VuZCBvbiB0aGlzIHNlcnZlci48UD5cbiIsIE5VTEwpOwotCSAgICBicmVhazsKLQljYXNlIE1FVEhPRF9OT1RfQUxMT1dFRDoKLQkgICAgYXBfcnZwdXRzKHIsICJUaGUgcmVxdWVzdGVkIG1ldGhvZCAiLCByLT5tZXRob2QsCi0JCSAgICAgICIgaXMgbm90IGFsbG93ZWQgIgotCQkgICAgICAiZm9yIHRoZSBVUkwgIiwgYXBfZXNjYXBlX2h0bWwoci0+cG9vbCwgci0+dXJpKSwKLQkJICAgICAgIi48UD5cbiIsIE5VTEwpOwotCSAgICBicmVhazsKLQljYXNlIE5PVF9BQ0NFUFRBQkxFOgotCSAgICBhcF9ydnB1dHMociwKLQkJICAgICAgIkFuIGFwcHJvcHJpYXRlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSAiCi0JCSAgICAgICJyZXF1ZXN0ZWQgcmVzb3VyY2UgIiwKLQkJICAgICAgYXBfZXNjYXBlX2h0bWwoci0+cG9vbCwgci0+dXJpKSwKLQkJICAgICAgIiBjb3VsZCBub3QgYmUgZm91bmQgb24gdGhpcyBzZXJ2ZXIuPFA+XG4iLCBOVUxMKTsKLQkgICAgLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBNVUxUSVBMRV9DSE9JQ0VTOgotCSAgICB7Ci0JCWNvbnN0IGNoYXIgKmxpc3Q7Ci0JCWlmICgobGlzdCA9IGFwX3RhYmxlX2dldChyLT5ub3RlcywgInZhcmlhbnQtbGlzdCIpKSkKLQkJICAgIGFwX3JwdXRzKGxpc3QsIHIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgTEVOR1RIX1JFUVVJUkVEOgotCSAgICBhcF9ydnB1dHMociwgIkEgcmVxdWVzdCBvZiB0aGUgcmVxdWVzdGVkIG1ldGhvZCAiLCByLT5tZXRob2QsCi0JCSAgICAgICIgcmVxdWlyZXMgYSB2YWxpZCBDb250ZW50LWxlbmd0aC48UD5cbiIsIE5VTEwpOwotCSAgICBpZiAoKGVycm9yX25vdGVzID0gYXBfdGFibGVfZ2V0KHItPm5vdGVzLCAiZXJyb3Itbm90ZXMiKSkgIT0gTlVMTCkgewotCQlhcF9ydnB1dHMociwgZXJyb3Jfbm90ZXMsICI8UD5cbiIsIE5VTEwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgUFJFQ09ORElUSU9OX0ZBSUxFRDoKLQkgICAgYXBfcnZwdXRzKHIsICJUaGUgcHJlY29uZGl0aW9uIG9uIHRoZSByZXF1ZXN0IGZvciB0aGUgVVJMICIsCi0JCSAgICAgIGFwX2VzY2FwZV9odG1sKHItPnBvb2wsIHItPnVyaSksCi0JCSAgICAgICIgZXZhbHVhdGVkIHRvIGZhbHNlLjxQPlxuIiwgTlVMTCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgSFRUUF9OT1RfSU1QTEVNRU5URUQ6Ci0JICAgIGFwX3J2cHV0cyhyLCBhcF9lc2NhcGVfaHRtbChyLT5wb29sLCByLT5tZXRob2QpLCAiIHRvICIsCi0JCSAgICAgIGFwX2VzY2FwZV9odG1sKHItPnBvb2wsIHItPnVyaSksCi0JCSAgICAgICIgbm90IHN1cHBvcnRlZC48UD5cbiIsIE5VTEwpOwotCSAgICBpZiAoKGVycm9yX25vdGVzID0gYXBfdGFibGVfZ2V0KHItPm5vdGVzLCAiZXJyb3Itbm90ZXMiKSkgIT0gTlVMTCkgewotCQlhcF9ydnB1dHMociwgZXJyb3Jfbm90ZXMsICI8UD5cbiIsIE5VTEwpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWNhc2UgQkFEX0dBVEVXQVk6Ci0JICAgIGFwX3JwdXRzKCJUaGUgcHJveHkgc2VydmVyIHJlY2VpdmVkIGFuIGludmFsaWRcMDE1XDAxMiIKLQkgICAgICAgICAgICAgInJlc3BvbnNlIGZyb20gYW4gdXBzdHJlYW0gc2VydmVyLjxQPlwwMTVcMDEyIiwgcik7Ci0JICAgIGlmICgoZXJyb3Jfbm90ZXMgPSBhcF90YWJsZV9nZXQoci0+bm90ZXMsICJlcnJvci1ub3RlcyIpKSAhPSBOVUxMKSB7Ci0JCWFwX3J2cHV0cyhyLCBlcnJvcl9ub3RlcywgIjxQPlxuIiwgTlVMTCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSBWQVJJQU5UX0FMU09fVkFSSUVTOgotCSAgICBhcF9ydnB1dHMociwgIkEgdmFyaWFudCBmb3IgdGhlIHJlcXVlc3RlZCByZXNvdXJjZVxuPFBSRT5cbiIsCi0JCSAgICAgIGFwX2VzY2FwZV9odG1sKHItPnBvb2wsIHItPnVyaSksCi0JCSAgICAgICJcbjwvUFJFPlxuaXMgaXRzZWxmIGEgbmVnb3RpYWJsZSByZXNvdXJjZS4gIgotCQkgICAgICAiVGhpcyBpbmRpY2F0ZXMgYSBjb25maWd1cmF0aW9uIGVycm9yLjxQPlxuIiwgTlVMTCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgSFRUUF9SRVFVRVNUX1RJTUVfT1VUOgotCSAgICBhcF9ycHV0cygiSSdtIHRpcmVkIG9mIHdhaXRpbmcgZm9yIHlvdXIgcmVxdWVzdC5cbiIsIHIpOwotCSAgICBicmVhazsKLQljYXNlIEhUVFBfR09ORToKLQkgICAgYXBfcnZwdXRzKHIsICJUaGUgcmVxdWVzdGVkIHJlc291cmNlPEJSPiIsCi0JCSAgICAgIGFwX2VzY2FwZV9odG1sKHItPnBvb2wsIHItPnVyaSksCi0JCSAgICAgICI8QlI+XG5pcyBubyBsb25nZXIgYXZhaWxhYmxlIG9uIHRoaXMgc2VydmVyICIsCi0JCSAgICAgICJhbmQgdGhlcmUgaXMgbm8gZm9yd2FyZGluZyBhZGRyZXNzLlxuIiwKLQkJICAgICAgIlBsZWFzZSByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gdGhpcyByZXNvdXJjZS5cbiIsCi0JCSAgICAgIE5VTEwpOwotCSAgICBicmVhazsKLQljYXNlIEhUVFBfUkVRVUVTVF9FTlRJVFlfVE9PX0xBUkdFOgotCSAgICBhcF9ydnB1dHMociwgIlRoZSByZXF1ZXN0ZWQgcmVzb3VyY2U8QlI+IiwKLQkJICAgICAgYXBfZXNjYXBlX2h0bWwoci0+cG9vbCwgci0+dXJpKSwgIjxCUj5cbiIsCi0JCSAgICAgICJkb2VzIG5vdCBhbGxvdyByZXF1ZXN0IGRhdGEgd2l0aCAiLCByLT5tZXRob2QsCi0JCSAgICAgICIgcmVxdWVzdHMsIG9yIHRoZSBhbW91bnQgb2YgZGF0YSBwcm92aWRlZCBpblxuIiwKLQkJICAgICAgInRoZSByZXF1ZXN0IGV4Y2VlZHMgdGhlIGNhcGFjaXR5IGxpbWl0LlxuIiwgTlVMTCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgSFRUUF9SRVFVRVNUX1VSSV9UT09fTEFSR0U6Ci0JICAgIGFwX3JwdXRzKCJUaGUgcmVxdWVzdGVkIFVSTCdzIGxlbmd0aCBleGNlZWRzIHRoZSBjYXBhY2l0eVxuIgotCSAgICAgICAgICAgICAibGltaXQgZm9yIHRoaXMgc2VydmVyLjxQPlxuIiwgcik7Ci0JICAgIGlmICgoZXJyb3Jfbm90ZXMgPSBhcF90YWJsZV9nZXQoci0+bm90ZXMsICJlcnJvci1ub3RlcyIpKSAhPSBOVUxMKSB7Ci0JCWFwX3J2cHV0cyhyLCBlcnJvcl9ub3RlcywgIjxQPlxuIiwgTlVMTCk7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSBIVFRQX1VOU1VQUE9SVEVEX01FRElBX1RZUEU6Ci0JICAgIGFwX3JwdXRzKCJUaGUgc3VwcGxpZWQgcmVxdWVzdCBkYXRhIGlzIG5vdCBpbiBhIGZvcm1hdFxuIgotCSAgICAgICAgICAgICAiYWNjZXB0YWJsZSBmb3IgcHJvY2Vzc2luZyBieSB0aGlzIHJlc291cmNlLlxuIiwgcik7Ci0JICAgIGJyZWFrOwotCWNhc2UgSFRUUF9SQU5HRV9OT1RfU0FUSVNGSUFCTEU6Ci0JICAgIGFwX3JwdXRzKCJOb25lIG9mIHRoZSByYW5nZS1zcGVjaWZpZXIgdmFsdWVzIGluIHRoZSBSYW5nZVxuIgotCSAgICAgICAgICAgICAicmVxdWVzdC1oZWFkZXIgZmllbGQgb3ZlcmxhcCB0aGUgY3VycmVudCBleHRlbnRcbiIKLQkgICAgICAgICAgICAgIm9mIHRoZSBzZWxlY3RlZCByZXNvdXJjZS5cbiIsIHIpOwotCSAgICBicmVhazsKLQljYXNlIEhUVFBfRVhQRUNUQVRJT05fRkFJTEVEOgotCSAgICBhcF9ydnB1dHMociwgIlRoZSBleHBlY3RhdGlvbiBnaXZlbiBpbiB0aGUgRXhwZWN0IHJlcXVlc3QtaGVhZGVyIgotCSAgICAgICAgICAgICAgIlxuZmllbGQgY291bGQgbm90IGJlIG1ldCBieSB0aGlzIHNlcnZlci48UD5cbiIKLQkgICAgICAgICAgICAgICJUaGUgY2xpZW50IHNlbnQ8UFJFPlxuICAgIEV4cGVjdDogIiwKLQkgICAgICAgICAgICAgIGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiRXhwZWN0IiksICJcbjwvUFJFPlxuIgotCSAgICAgICAgICAgICAgImJ1dCB3ZSBvbmx5IGFsbG93IHRoZSAxMDAtY29udGludWUgZXhwZWN0YXRpb24uXG4iLAotCSAgICAgICAgICAgICAgTlVMTCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgSFRUUF9VTlBST0NFU1NBQkxFX0VOVElUWToKLQkgICAgYXBfcnB1dHMoIlRoZSBzZXJ2ZXIgdW5kZXJzdGFuZHMgdGhlIG1lZGlhIHR5cGUgb2YgdGhlXG4iCi0JICAgICAgICAgICAgICJyZXF1ZXN0IGVudGl0eSwgYnV0IHdhcyB1bmFibGUgdG8gcHJvY2VzcyB0aGVcbiIKLQkgICAgICAgICAgICAgImNvbnRhaW5lZCBpbnN0cnVjdGlvbnMuXG4iLCByKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBIVFRQX0xPQ0tFRDoKLQkgICAgYXBfcnB1dHMoIlRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgaXMgY3VycmVudGx5IGxvY2tlZC5cbiIKLQkgICAgICAgICAgICAgIlRoZSBsb2NrIG11c3QgYmUgcmVsZWFzZWQgb3IgcHJvcGVyIGlkZW50aWZpY2F0aW9uXG4iCi0JICAgICAgICAgICAgICJnaXZlbiBiZWZvcmUgdGhlIG1ldGhvZCBjYW4gYmUgYXBwbGllZC5cbiIsIHIpOwotCSAgICBicmVhazsKLQljYXNlIEhUVFBfRkFJTEVEX0RFUEVOREVOQ1k6Ci0JICAgIGFwX3JwdXRzKCJUaGUgbWV0aG9kIGNvdWxkIG5vdCBiZSBwZXJmb3JtZWQgb24gdGhlIHJlc291cmNlXG4iCi0JICAgICAgICAgICAgICJiZWNhdXNlIHRoZSByZXF1ZXN0ZWQgYWN0aW9uIGRlcGVuZGVkIG9uIGFub3RoZXJcbiIKLQkgICAgICAgICAgICAgImFjdGlvbiBhbmQgdGhhdCBvdGhlciBhY3Rpb24gZmFpbGVkLlxuIiwgcik7Ci0JICAgIGJyZWFrOwotCWNhc2UgSFRUUF9JTlNVRkZJQ0lFTlRfU1RPUkFHRToKLQkgICAgYXBfcnB1dHMoIlRoZSBtZXRob2QgY291bGQgbm90IGJlIHBlcmZvcm1lZCBvbiB0aGUgcmVzb3VyY2VcbiIKLQkgICAgICAgICAgICAgImJlY2F1c2UgdGhlIHNlcnZlciBpcyB1bmFibGUgdG8gc3RvcmUgdGhlXG4iCi0JICAgICAgICAgICAgICJyZXByZXNlbnRhdGlvbiBuZWVkZWQgdG8gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlIHRoZVxuIgotCSAgICAgICAgICAgICAicmVxdWVzdC4gIFRoZXJlIGlzIGluc3VmZmljaWVudCBmcmVlIHNwYWNlIGxlZnQgaW5cbiIKLQkgICAgICAgICAgICAgInlvdXIgc3RvcmFnZSBhbGxvY2F0aW9uLlxuIiwgcik7Ci0JICAgIGJyZWFrOwotCWNhc2UgSFRUUF9TRVJWSUNFX1VOQVZBSUxBQkxFOgotCSAgICBhcF9ycHV0cygiVGhlIHNlcnZlciBpcyB0ZW1wb3JhcmlseSB1bmFibGUgdG8gc2VydmljZSB5b3VyXG4iCi0JICAgICAgICAgICAgICJyZXF1ZXN0IGR1ZSB0byBtYWludGVuYW5jZSBkb3dudGltZSBvciBjYXBhY2l0eVxuIgotCSAgICAgICAgICAgICAicHJvYmxlbXMuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuXG4iLCByKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBIVFRQX0dBVEVXQVlfVElNRV9PVVQ6Ci0JICAgIGFwX3JwdXRzKCJUaGUgcHJveHkgc2VydmVyIGRpZCBub3QgcmVjZWl2ZSBhIHRpbWVseSByZXNwb25zZVxuIgotCSAgICAgICAgICAgICAiZnJvbSB0aGUgdXBzdHJlYW0gc2VydmVyLlxuIiwgcik7Ci0JICAgIGJyZWFrOwotCWNhc2UgSFRUUF9OT1RfRVhURU5ERUQ6Ci0JICAgIGFwX3JwdXRzKCJBIG1hbmRhdG9yeSBleHRlbnNpb24gcG9saWN5IGluIHRoZSByZXF1ZXN0IGlzIG5vdFxuIgotCSAgICAgICAgICAgICAiYWNjZXB0ZWQgYnkgdGhlIHNlcnZlciBmb3IgdGhpcyByZXNvdXJjZS5cbiIsIHIpOwotCSAgICBicmVhazsKLQlkZWZhdWx0OiAgICAgICAgICAgIC8qIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SICovCi0JICAgIC8qCi0JICAgICAqIFRoaXMgY29tcGFyaXNvbiB0byBleHBvc2UgZXJyb3Itbm90ZXMgY291bGQgYmUgbW9kaWZpZWQgdG8KLQkgICAgICogdXNlIGEgY29uZmlndXJhdGlvbiBkaXJlY3RpdmUgYW5kIGV4cG9ydCBiYXNlZCBvbiB0aGF0IAotCSAgICAgKiBkaXJlY3RpdmUuICBGb3Igbm93ICIqIiBpcyB1c2VkIHRvIGRlc2lnbmF0ZSBhbiBlcnJvci1ub3RlcwotCSAgICAgKiB0aGF0IGlzIHRvdGFsbHkgc2FmZSBmb3IgYW55IHVzZXIgdG8gc2VlIChpZSBsYWNrcyBwYXRocywKLQkgICAgICogZGF0YWJhc2UgcGFzc3dvcmRzLCBldGMuKQotCSAgICAgKi8KLQkgICAgaWYgKCgoZXJyb3Jfbm90ZXMgPSBhcF90YWJsZV9nZXQoci0+bm90ZXMsICJlcnJvci1ub3RlcyIpKSAhPSBOVUxMKQotCQkmJiAoaDEgPSBhcF90YWJsZV9nZXQoci0+bm90ZXMsICJ2ZXJib3NlLWVycm9yLXRvIikpICE9IE5VTEwKLQkJJiYgKHN0cmNtcChoMSwgIioiKSA9PSAwKSkgewotCSAgICAgICAgYXBfcnZwdXRzKHIsIGVycm9yX25vdGVzLCAiPFA+XG4iLCBOVUxMKTsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkgICAgICAgIGFwX3J2cHV0cyhyLCAiVGhlIHNlcnZlciBlbmNvdW50ZXJlZCBhbiBpbnRlcm5hbCBlcnJvciBvclxuIgotCSAgICAgICAgICAgICAibWlzY29uZmlndXJhdGlvbiBhbmQgd2FzIHVuYWJsZSB0byBjb21wbGV0ZVxuIgotCSAgICAgICAgICAgICAieW91ciByZXF1ZXN0LjxQPlxuIgotCSAgICAgICAgICAgICAiUGxlYXNlIGNvbnRhY3QgdGhlIHNlcnZlciBhZG1pbmlzdHJhdG9yLFxuICIsCi0JICAgICAgICAgICAgIGFwX2VzY2FwZV9odG1sKHItPnBvb2wsIHItPnNlcnZlci0+c2VydmVyX2FkbWluKSwKLQkgICAgICAgICAgICAgIiBhbmQgaW5mb3JtIHRoZW0gb2YgdGhlIHRpbWUgdGhlIGVycm9yIG9jY3VycmVkLFxuIgotCSAgICAgICAgICAgICAiYW5kIGFueXRoaW5nIHlvdSBtaWdodCBoYXZlIGRvbmUgdGhhdCBtYXkgaGF2ZVxuIgotCSAgICAgICAgICAgICAiY2F1c2VkIHRoZSBlcnJvci48UD5cbiIKLQkJICAgICAiTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGVycm9yIG1heSBiZSBhdmFpbGFibGVcbiIKLQkJICAgICAiaW4gdGhlIHNlcnZlciBlcnJvciBsb2cuPFA+XG4iLCBOVUxMKTsKLQkgICAgfQotCSAvKgotCSAgKiBJdCB3b3VsZCBiZSBuaWNlIHRvIGdpdmUgdGhlIHVzZXIgdGhlIGluZm9ybWF0aW9uIHRoZXkgbmVlZCB0bwotCSAgKiBmaXggdGhlIHByb2JsZW0gZGlyZWN0bHkgc2luY2UgbWFueSB1c2VycyBkb24ndCBoYXZlIGFjY2VzcyB0bwotCSAgKiB0aGUgZXJyb3JfbG9nICh0aGluayBVbml2ZXJzaXR5IHNpdGVzKSBldmVuIHRob3VnaCB0aGV5IGNhbiBlYXNpbHkKLQkgICogZ2V0IHRoaXMgZXJyb3IgYnkgbWlzY29uZmlndXJpbmcgYW4gaHRhY2Nlc3MgZmlsZS4gIEhvd2V2ZXIsIHRoZQotCSAgKiBlcnJvciBub3RlcyB0ZW5kIHRvIGluY2x1ZGUgdGhlIHJlYWwgZmlsZSBwYXRobmFtZSBpbiB0aGlzIGNhc2UsCi0JICAqIHdoaWNoIHNvbWUgcGVvcGxlIGNvbnNpZGVyIHRvIGJlIGEgYnJlYWNoIG9mIHByaXZhY3kuICBVbnRpbCB3ZQotCSAgKiBjYW4gZmlndXJlIG91dCBhIHdheSB0byByZW1vdmUgdGhlIHBhdGhuYW1lLCBsZWF2ZSB0aGlzIGNvbW1lbnRlZC4KLQkgICoKLQkgICogaWYgKChlcnJvcl9ub3RlcyA9IGFwX3RhYmxlX2dldChyLT5ub3RlcywgImVycm9yLW5vdGVzIikpICE9IE5VTEwpIHsKLQkgICogICAgIGFwX3J2cHV0cyhyLCBlcnJvcl9ub3RlcywgIjxQPlxuIiwgTlVMTCk7Ci0JICAqIH0KLQkgICovCi0JICAgIGJyZWFrOwotCX0KLQotICAgICAgICBpZiAocmVjdXJzaXZlX2Vycm9yKSB7Ci0gICAgICAgICAgICBhcF9ydnB1dHMociwgIjxQPkFkZGl0aW9uYWxseSwgYSAiLAotICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c19saW5lc1thcF9pbmRleF9vZl9yZXNwb25zZShyZWN1cnNpdmVfZXJyb3IpXSwKLSAgICAgICAgICAgICAgICAgICAgICAiXG5lcnJvciB3YXMgZW5jb3VudGVyZWQgd2hpbGUgdHJ5aW5nIHRvIHVzZSBhbiAiCi0gICAgICAgICAgICAgICAgICAgICAgIkVycm9yRG9jdW1lbnQgdG8gaGFuZGxlIHRoZSByZXF1ZXN0LlxuIiwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXBfcnB1dHMoYXBfcHNpZ25hdHVyZSgiPEhSPlxuIiwgciksIHIpOwotICAgICAgICBhcF9ycHV0cygiPC9CT0RZPjwvSFRNTD5cbiIsIHIpOwotICAgIH0KLSAgICBhcF9maW5hbGl6ZV9yZXF1ZXN0X3Byb3RvY29sKHIpOwotICAgIGFwX3JmbHVzaChyKTsKLX0KLQotSU1QTEVNRU5UX0hPT0tfUlVOX0FMTChpbnQscG9zdF9yZWFkX3JlcXVlc3QsKHJlcXVlc3RfcmVjICpyKSwociksT0ssREVDTElORUQpCi1JTVBMRU1FTlRfSE9PS19SVU5fQUxMKGludCxsb2dfdHJhbnNhY3Rpb24sKHJlcXVlc3RfcmVjICpyKSwociksT0ssREVDTElORUQpCi1JTVBMRU1FTlRfSE9PS19SVU5fRklSU1QoY29uc3QgY2hhciAqLGh0dHBfbWV0aG9kLChjb25zdCByZXF1ZXN0X3JlYyAqciksKHIpLAotCQkJIE5VTEwpCi1JTVBMRU1FTlRfSE9PS19SVU5fRklSU1QodW5zaWduZWQgc2hvcnQsZGVmYXVsdF9wb3J0LChjb25zdCByZXF1ZXN0X3JlYyAqciksCi0JCQkgKHIpLDApCmRpZmYgLS1naXQgYS9tb2R1bGVzL2h0dHAvaHR0cF9yZXF1ZXN0LmMgYi9tb2R1bGVzL2h0dHAvaHR0cF9yZXF1ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZDRhOWUuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9odHRwL2h0dHBfcmVxdWVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM4NCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIGh0dHBfcmVxdWVzdC5jOiBmdW5jdGlvbnMgdG8gZ2V0IGFuZCBwcm9jZXNzIHJlcXVlc3RzCi0gKgotICogUm9iIE1jQ29vbCAzLzIxLzkzCi0gKgotICogVGhvcm91Z2hseSByZXZhbXBlZCBieSByc3QgZm9yIEFwYWNoZS4gIE5CIHRoaXMgZmlsZSByZWFkcwotICogYmVzdCBmcm9tIHRoZSBib3R0b20gdXAuCi0gKgotICovCi0KLSNkZWZpbmUgQ09SRV9QUklWQVRFCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgImFwcl9mbm1hdGNoLmgiCi0KLUhPT0tfU1RSVUNUKAotCSAgICBIT09LX0xJTksodHJhbnNsYXRlX25hbWUpCi0JICAgIEhPT0tfTElOSyhjaGVja191c2VyX2lkKQotCSAgICBIT09LX0xJTksoZml4dXBzKQotCSAgICBIT09LX0xJTksodHlwZV9jaGVja2VyKQotCSAgICBIT09LX0xJTksoYWNjZXNzX2NoZWNrZXIpCi0JICAgIEhPT0tfTElOSyhhdXRoX2NoZWNrZXIpCi0pCi0KLUlNUExFTUVOVF9IT09LX1JVTl9GSVJTVChpbnQsdHJhbnNsYXRlX25hbWUsKHJlcXVlc3RfcmVjICpyKSwociksREVDTElORUQpCi1JTVBMRU1FTlRfSE9PS19SVU5fRklSU1QoaW50LGNoZWNrX3VzZXJfaWQsKHJlcXVlc3RfcmVjICpyKSwociksREVDTElORUQpCi1JTVBMRU1FTlRfSE9PS19SVU5fQUxMKGludCxmaXh1cHMsKHJlcXVlc3RfcmVjICpyKSwociksT0ssREVDTElORUQpCi1JTVBMRU1FTlRfSE9PS19SVU5fRklSU1QoaW50LHR5cGVfY2hlY2tlciwocmVxdWVzdF9yZWMgKnIpLChyKSxERUNMSU5FRCkKLUlNUExFTUVOVF9IT09LX1JVTl9BTEwoaW50LGFjY2Vzc19jaGVja2VyLChyZXF1ZXN0X3JlYyAqciksKHIpLE9LLERFQ0xJTkVEKQotSU1QTEVNRU5UX0hPT0tfUlVOX0ZJUlNUKGludCxhdXRoX2NoZWNrZXIsKHJlcXVlc3RfcmVjICpyKSwociksREVDTElORUQpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEdldHRpbmcgYW5kIGNoZWNraW5nIGRpcmVjdG9yeSBjb25maWd1cmF0aW9uLiAgQWxzbyBjaGVja3MgdGhlCi0gKiBGb2xsb3dTeW1saW5rcyBhbmQgRm9sbG93U3ltT3duZXIgc3R1ZmYsIHNpbmNlIHRoaXMgaXMgcmVhbGx5IHRoZQotICogb25seSBwbGFjZSB0aGF0IGNhbiBoYXBwZW4gKGJhcnJpbmcgYSBuZXcgbWlkX2Rpcl93YWxrIGNhbGxvdXQpLgotICoKLSAqIFdlIGNhbid0IGRvIGl0IGFzIGFuIGFjY2Vzc19jaGVja2VyIG1vZHVsZSBmdW5jdGlvbiB3aGljaCBnZXRzCi0gKiBjYWxsZWQgd2l0aCB0aGUgZmluYWwgcGVyX2Rpcl9jb25maWcsIHNpbmNlIHdlIGNvdWxkIGhhdmUgYSBkaXJlY3RvcnkKLSAqIHdpdGggRm9sbG93U3ltTGlua3MgZGlzYWJsZWQsIHdoaWNoIGNvbnRhaW5zIGEgc3ltbGluayB0byBhbm90aGVyCi0gKiB3aXRoIGEgLmh0YWNjZXNzIGZpbGUgd2hpY2ggdHVybnMgRm9sbG93U3ltTGlua3MgYmFjayBvbiAtLS0gYW5kCi0gKiBhY2Nlc3MgaW4gc3VjaCBhIGNhc2UgbXVzdCBiZSBkZW5pZWQuICBTbywgd2hhdGV2ZXIgaXQgaXMgdGhhdAotICogY2hlY2tzIEZvbGxvd1N5bUxpbmtzIG5lZWRzIHRvIGtub3cgdGhlIHN0YXRlIG9mIHRoZSBvcHRpb25zIGFzCi0gKiB0aGV5IGNoYW5nZSwgYWxsIHRoZSB3YXkgZG93bi4KLSAqLwotCi0vKgotICogV2UgZG9uJ3Qgd2FudCBwZW9wbGUgYWJsZSB0byBzZXJ2ZSB1cCBwaXBlcywgb3IgdW5peCBzb2NrZXRzLCBvciBvdGhlcgotICogc2NhcnkgdGhpbmdzLiAgTm90ZSB0aGF0IHN5bWxpbmsgdGVzdHMgYXJlIHBlcmZvcm1lZCBsYXRlci4KLSAqLwotc3RhdGljIGludCBjaGVja19zYWZlX2ZpbGUocmVxdWVzdF9yZWMgKnIpCi17Ci0KLSAgICBpZiAoci0+ZmluZm8ucHJvdGVjdGlvbiA9PSAwICAgICAgLyogZG9lc24ndCBleGlzdCAqLwotICAgICAgICB8fCByLT5maW5mby5maWxldHlwZSA9PSBBUFJfRElSCi0gICAgICAgIHx8IHItPmZpbmZvLmZpbGV0eXBlID09IEFQUl9SRUcKLSAgICAgICAgfHwgci0+ZmluZm8uZmlsZXR5cGUgPT0gQVBSX0xOSykgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLSAgICAgICAgICAgICAgICAib2JqZWN0IGlzIG5vdCBhIGZpbGUsIGRpcmVjdG9yeSBvciBzeW1saW5rOiAlcyIsCi0gICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUpOwotICAgIHJldHVybiBIVFRQX0ZPUkJJRERFTjsKLX0KLQotCi1zdGF0aWMgaW50IGNoZWNrX3N5bWxpbmtzKGNoYXIgKmQsIGludCBvcHRzKQotewotI2lmIGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTjMyKQotICAgIC8qIE9TLzIgZG9lc24ndCBoYXZlIHN5bWxpbmtzICovCi0gICAgcmV0dXJuIE9LOwotI2Vsc2UKLSAgICBzdHJ1Y3Qgc3RhdCBsZmksIGZpOwotICAgIGNoYXIgKmxhc3RwOwotICAgIGludCByZXM7Ci0KLSAgICBpZiAob3B0cyAmIE9QVF9TWU1fTElOS1MpCi0gICAgICAgIHJldHVybiBPSzsKLQotICAgIC8qCi0gICAgICogU3RyaXAgdHJhaWxpbmcgJy8nLCBpZiBhbnksIG9mZiB3aGF0IHdlJ3JlIGNoZWNraW5nOyB0cmFpbGluZyBzbGFzaGVzCi0gICAgICogbWFrZSBzb21lIHN5c3RlbXMgZm9sbG93IHN5bWxpbmtzIHRvIGRpcmVjdG9yaWVzIGV2ZW4gaW4gbHN0YXQoKS4KLSAgICAgKiBBZnRlciB3ZSd2ZSBkb25lIHRoZSBsc3RhdCwgcHV0IGl0IGJhY2suICBBbHNvLCBkb24ndCBib3RoZXIgY2hlY2tpbmcKLSAgICAgKiAnLycgYXQgYWxsLi4uCi0gICAgICogCi0gICAgICogTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgbXVsdGlwbGUgc2xhc2hlcyBoZXJlIGJlY2F1c2Ugb2YKLSAgICAgKiBubzJzbGFzaCgpIGJlbG93Li4uCi0gICAgICovCi0KLSAgICBsYXN0cCA9IGQgKyBzdHJsZW4oZCkgLSAxOwotICAgIGlmIChsYXN0cCA9PSBkKQotICAgICAgICByZXR1cm4gT0s7ICAgICAgICAgICAgICAvKiBSb290IGRpcmVjdG9yeSwgJy8nICovCi0KLSAgICBpZiAoKmxhc3RwID09ICcvJykKLSAgICAgICAgKmxhc3RwID0gJ1wwJzsKLSAgICBlbHNlCi0gICAgICAgIGxhc3RwID0gTlVMTDsKLQotICAgIHJlcyA9IGxzdGF0KGQsICZsZmkpOwotCi0gICAgaWYgKGxhc3RwKQotICAgICAgICAqbGFzdHAgPSAnLyc7Ci0KLSAgICAvKgotICAgICAqIE5vdGUgdGhhdCB3ZSBkb24ndCByZWplY3QgYWNjZXNzZXMgdG8gbm9uZXhpc3RlbnQgZmlsZXMgKG11bHRpdmlld3Mgb3IKLSAgICAgKiB0aGUgbGlrZSBtYXkgY29ucyB1cCBhIHdheSB0byBydW4gdGhlIHRyYW5zYWN0aW9uIGFueXdheSkuLi4KLSAgICAgKi8KLQotICAgIGlmICghKHJlcyA+PSAwKSB8fCAhU19JU0xOSyhsZmkuc3RfbW9kZSkpCi0gICAgICAgIHJldHVybiBPSzsKLQotICAgIC8qIE9LLCBpdCdzIGEgc3ltbGluay4gIE1heSBzdGlsbCBiZSBPSyB3aXRoIE9QVF9TWU1fT1dORVIgKi8KLQotICAgIGlmICghKG9wdHMgJiBPUFRfU1lNX09XTkVSKSkKLSAgICAgICAgcmV0dXJuIEhUVFBfRk9SQklEREVOOwotCi0gICAgaWYgKHN0YXQoZCwgJmZpKSA8IDApCi0gICAgICAgIHJldHVybiBIVFRQX0ZPUkJJRERFTjsKLQotICAgIHJldHVybiAoZmkuc3RfdWlkID09IGxmaS5zdF91aWQpID8gT0sgOiBIVFRQX0ZPUkJJRERFTjsKLQotI2VuZGlmCi19Ci0KLS8qIERlYWxpbmcgd2l0aCB0aGUgZmlsZSBzeXN0ZW0gdG8gZ2V0IFBBVEhfSU5GTwotICovCi1zdGF0aWMgaW50IGdldF9wYXRoX2luZm8ocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY2hhciAqY3A7Ci0gICAgY2hhciAqcGF0aCA9IHItPmZpbGVuYW1lOwotICAgIGNoYXIgKmVuZCA9ICZwYXRoW3N0cmxlbihwYXRoKV07Ci0gICAgY2hhciAqbGFzdF9jcCA9IE5VTEw7Ci0gICAgaW50IHJ2OwotI2lmZGVmIEhBVkVfRFJJVkVfTEVUVEVSUwotICAgIGNoYXIgYlN0cmlwU2xhc2g9MTsKLSNlbmRpZgotCi0gICAgaWYgKHItPmZpbmZvLnByb3RlY3Rpb24pIHsKLQkvKiBhc3N1bWUgcGF0aF9pbmZvIGFscmVhZHkgc2V0ICovCi0JcmV0dXJuIE9LOwotICAgIH0KLQotI2lmZGVmIEhBVkVfRFJJVkVfTEVUVEVSUwotICAgIC8qIElmIHRoZSBkaXJlY3RvcnkgaXMgeDpcLCB0aGVuIHdlIGRvbid0IHdhbnQgdG8gc3RyaXAKLSAgICAgKiB0aGUgdHJhaWxpbmcgc2xhc2ggc2luY2UgeDogaXMgbm90IGEgdmFsaWQgZGlyZWN0b3J5LgotICAgICAqLwotICAgIGlmIChzdHJsZW4ocGF0aCkgPT0gMyAmJiBwYXRoWzFdID09ICc6JyAmJiBwYXRoWzJdID09ICcvJykKLSAgICAgICAgYlN0cmlwU2xhc2ggPSAwOwotCi0KLSAgICAvKiBJZiBVTkMgbmFtZSA9PSAvL21hY2hpbmUvc2hhcmUvLCBkbyBub3QgCi0gICAgICogYWR2YW5jZSBvdmVyIHRoZSB0cmFpbGluZyBzbGFzaC4gIEFueSBvdGhlcgotICAgICAqIFVOQyBuYW1lIGlzIE9LIHRvIHN0cmlwIHRoZSBzbGFzaC4KLSAgICAgKi8KLSAgICBjcCA9IGVuZDsKLSAgICBpZiAoc3RybGVuKHBhdGgpID4gMiAmJiBwYXRoWzBdID09ICcvJyAmJiBwYXRoWzFdID09ICcvJyAmJiAKLSAgICAgICAgcGF0aFsyXSAhPSAnLycgJiYgY3BbLTFdID09ICcvJykgewotICAgICAgICBjaGFyICpwOwotICAgICAgICBpbnQgaUNvdW50PTA7Ci0gICAgICAgIHAgPSBwYXRoOwotICAgICAgICB3aGlsZSAoKHAgPSBzdHJjaHIocCwnLycpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBwKys7Ci0gICAgICAgICAgICBpQ291bnQrKzsKLSAgICAgICAgfQotICAgIAotICAgICAgICBpZiAoaUNvdW50ID09IDQpCi0gICAgICAgICAgICBiU3RyaXBTbGFzaCA9IDA7Ci0gICAgfQotCi0gICAgaWYgKGJTdHJpcFNsYXNoKQotI2VuZGlmCi0gICAgICAgIC8qIEFkdmFuY2Ugb3ZlciB0cmFpbGluZyBzbGFzaGVzIC4uLiBOT1QgcGFydCBvZiBmaWxlbmFtZSAKLSAgICAgICAgICogaWYgZmlsZSBpcyBub3QgYSBVTkMgbmFtZSAoV2luMzIgb25seSkuCi0gICAgICAgICAqLwotICAgICAgICBmb3IgKGNwID0gZW5kOyBjcCA+IHBhdGggJiYgY3BbLTFdID09ICcvJzsgLS1jcCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0KLSAgICB3aGlsZSAoY3AgPiBwYXRoKSB7Ci0KLSAgICAgICAgLyogU2VlIGlmIHRoZSBwYXRobmFtZSBlbmRpbmcgaGVyZSBleGlzdHMuLi4gKi8KLQotICAgICAgICAqY3AgPSAnXDAnOwotCi0gICAgICAgICAvKiBXZSBtdXN0IG5vdCBzdGF0KCkgZmlsZW5hbWVzIHRoYXQgbWF5IGNhdXNlIG9zLXNwZWNpZmljIHN5c3RlbQotICAgICAgICAgICogcHJvYmxlbXMsIHN1Y2ggYXMgIi9maWxlL2F1eCIgb24gRE9TLWFidXNlZCBmaWxlc3lzdGVtcy4KLSAgICAgICAgICAqIFNvIHByZXRlbmQgdGhhdCB0aGV5IGRvIG5vdCBleGlzdCBieSByZXR1cm5pbmcgYW4gRU5PRU5UIGVycm9yLgotICAgICAgICAgICogVGhpcyB3aWxsIGZvcmNlIHVzIHRvIGRyb3AgdGhhdCBwYXJ0IG9mIHRoZSBwYXRoIGFuZCBrZWVwCi0gICAgICAgICAgKiBsb29raW5nIGJhY2sgZm9yIGEgInJlYWwiIGZpbGUgdGhhdCBleGlzdHMsIHdoaWxlIHN0aWxsIGFsbG93aW5nCi0gICAgICAgICAgKiB0aGUgImludmFsaWQiIHBhdGggcGFydHMgd2l0aGluIHRoZSBQQVRIX0lORk8uCi0gICAgICAgICAgKi8KLSAgICAgICAgIGlmICghYXBfb3NfaXNfZmlsZW5hbWVfdmFsaWQocGF0aCkpIHsKLSAgICAgICAgICAgICBlcnJubyA9IEVOT0VOVDsKLSAgICAgICAgICAgICBydiA9IC0xOwotICAgICAgICAgfQotICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgZXJybm8gPSAwOwotICAgICAgICAgICAgIHJ2ID0gYXBfc3RhdCgmci0+ZmluZm8sIHBhdGgsIHItPnBvb2wpOwotICAgICAgICAgfQotCi0gICAgICAgIGlmIChjcCAhPSBlbmQpCi0gICAgICAgICAgICAqY3AgPSAnLyc7Ci0KLSAgICAgICAgaWYgKHJ2ID09IEFQUl9TVUNDRVNTKSB7ICAgIAotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEFoYSEgIEZvdW5kIHNvbWV0aGluZy4gIElmIGl0IHdhcyBhIGRpcmVjdG9yeSwgd2Ugd2lsbCBzZWFyY2gKLSAgICAgICAgICAgICAqIGNvbnRlbnRzIG9mIHRoYXQgZGlyZWN0b3J5IGZvciBhIG11bHRpX21hdGNoLCBzbyB0aGUgUEFUSF9JTkZPCi0gICAgICAgICAgICAgKiBhcmd1bWVudCBzdGFydHMgd2l0aCB0aGUgY29tcG9uZW50IGFmdGVyIHRoYXQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChyLT5maW5mby5maWxldHlwZSA9PSBBUFJfRElSICYmIGxhc3RfY3ApIHsKLSAgICAgICAgICAgICAgICByLT5maW5mby5wcm90ZWN0aW9uID0gMDsgICAvKiBObyBzdWNoIGZpbGUuLi4gKi8KLSAgICAgICAgICAgICAgICByLT5maW5mby5maWxldHlwZSA9IEFQUl9OT0ZJTEU7ICAgLyogTm8gc3VjaCBmaWxlLi4uICovCi0gICAgICAgICAgICAgICAgY3AgPSBsYXN0X2NwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByLT5wYXRoX2luZm8gPSBhcF9wc3RyZHVwKHItPnBvb2wsIGNwKTsKLSAgICAgICAgICAgICpjcCA9ICdcMCc7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLQkvKiBtdXN0IHNldCB0aGlzIHRvIHplcm8sIHNvbWUgc3RhdCgpcyBtYXkgaGF2ZSBjb3JydXB0ZWQgaXQKLQkgKiBldmVuIGlmIHRoZXkgcmV0dXJuZWQgYW4gZXJyb3IuCi0JICovCi0Jci0+ZmluZm8ucHJvdGVjdGlvbiA9IDA7Ci0KLSNpZiBkZWZpbmVkKEFQUl9FTk9FTlQpICYmIGRlZmluZWQoQVBSX0VOT1RESVIpCi0gICAgICAgIGlmIChydiA9PSBBUFJfRU5PRU5UIHx8IHJ2ID09IEFQUl9FTk9URElSKSB7Ci0gICAgICAgICAgICBsYXN0X2NwID0gY3A7Ci0KLSAgICAgICAgICAgIHdoaWxlICgtLWNwID4gcGF0aCAmJiAqY3AgIT0gJy8nKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICB3aGlsZSAoY3AgPiBwYXRoICYmIGNwWy0xXSA9PSAnLycpCi0gICAgICAgICAgICAgICAgLS1jcDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSNpZiBkZWZpbmVkKEFQUl9FQUNDRVMpCi0gICAgICAgICAgICBpZiAocnYgIT0gQVBSX0VBQ0NFUykKLSNlbmRpZgotICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBydiwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWNjZXNzIHRvICVzIGZhaWxlZCIsIHItPnVyaSk7Ci0gICAgICAgICAgICByZXR1cm4gSFRUUF9GT1JCSURERU47Ci0gICAgICAgIH0KLSNlbHNlCi0jZXJyb3IgRU5PRU5UIHx8IEVOT1RESVIgbm90IGRlZmluZWQ7IHBsZWFzZSBzZWUgdGhlCi0jZXJyb3IgY29tbWVudHMgYXQgdGhpcyBsaW5lIGluIHRoZSBzb3VyY2UgZm9yIGEgd29ya2Fyb3VuZC4KLSAgICAgICAgLyoKLSAgICAgICAgICogSWYgRU5PRU5UIHx8IEVOT1RESVIgaXMgbm90IGRlZmluZWQgaW4gb25lIG9mIHRoZSB5b3VyIE9TJ3MKLSAgICAgICAgICogaW5jbHVkZSBmaWxlcywgQXBhY2hlIGRvZXMgbm90IGtub3cgaG93IHRvIGNoZWNrIHRvIHNlZSB3aHkgdGhlCi0gICAgICAgICAqIHN0YXQoKSBvZiB0aGUgaW5kZXggZmlsZSBmYWlsZWQ7IHRoZXJlIGFyZSBjYXNlcyB3aGVyZSBpdCBjYW4gZmFpbAotICAgICAgICAgKiBldmVuIHRob3VnaCB0aGUgZmlsZSBleGlzdHMuICBUaGlzIG1lYW5zIHRoYXQgaXQgaXMgcG9zc2libGUgZm9yCi0gICAgICAgICAqIHNvbWVvbmUgdG8gZ2V0IGEgZGlyZWN0b3J5IGxpc3Rpbmcgb2YgYSBkaXJlY3RvcnkgZXZlbiB0aG91Z2gKLSAgICAgICAgICogdGhlcmUgaXMgYW4gaW5kZXggKGVnLiBpbmRleC5odG1sKSBmaWxlIGluIGl0LiAgSWYgeW91IGRvIG5vdCBoYXZlCi0gICAgICAgICAqIGEgcHJvYmxlbSB3aXRoIHRoaXMsIGRlbGV0ZSB0aGUgYWJvdmUgI2Vycm9yIGxpbmVzIGFuZCBzdGFydCB0aGUKLSAgICAgICAgICogY29tcGlsZSBhZ2Fpbi4gIElmIHlvdSBuZWVkIHRvIGRvIHRoaXMsIHBsZWFzZSBzdWJtaXQgYSBidWcgcmVwb3J0Ci0gICAgICAgICAqIGZyb20gaHR0cDovL3d3dy5hcGFjaGUub3JnL2J1Z19yZXBvcnQuaHRtbCBsZXR0aW5nIHVzIGtub3cgdGhhdAotICAgICAgICAgKiB5b3UgbmVlZGVkIHRvIGRvIHRoaXMuICBQbGVhc2UgYmUgc3VyZSB0byBpbmNsdWRlIHRoZSBvcGVyYXRpbmcKLSAgICAgICAgICogc3lzdGVtIHlvdSBhcmUgdXNpbmcuCi0gICAgICAgICAqLwotCWxhc3RfY3AgPSBjcDsKLQotCXdoaWxlICgtLWNwID4gcGF0aCAmJiAqY3AgIT0gJy8nKQotCSAgICBjb250aW51ZTsKLQotCXdoaWxlIChjcCA+IHBhdGggJiYgY3BbLTFdID09ICcvJykKLQkgICAgLS1jcDsKLSNlbmRpZiAgLyogRU5PRU5UICYmIEVOT1RESVIgKi8KLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgaW50IGRpcmVjdG9yeV93YWxrKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvcmVfc2VydmVyX2NvbmZpZyAqc2NvbmYgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3JlX21vZHVsZSk7Ci0gICAgdm9pZCAqcGVyX2Rpcl9kZWZhdWx0cyA9IHItPnNlcnZlci0+bG9va3VwX2RlZmF1bHRzOwotICAgIHZvaWQgKipzZWMgPSAodm9pZCAqKikgc2NvbmYtPnNlYy0+ZWx0czsKLSAgICBpbnQgbnVtX3NlYyA9IHNjb25mLT5zZWMtPm5lbHRzOwotICAgIGNoYXIgKnRlc3RfZmlsZW5hbWU7Ci0gICAgY2hhciAqdGVzdF9kaXJuYW1lOwotICAgIGludCByZXM7Ci0gICAgdW5zaWduZWQgaSwgbnVtX2RpcnMsIGlTdGFydDsKLSAgICBpbnQgaiwgdGVzdF9maWxlbmFtZV9sZW47Ci0KLSAgICAvKgotICAgICAqIEFyZSB3ZSBkZWFsaW5nIHdpdGggYSBmaWxlPyBJZiBub3QsIHdlIGNhbiAoaG9wZWZ1bHkpIHNhZmVseSBhc3N1bWUgd2UKLSAgICAgKiBoYXZlIGEgaGFuZGxlciB0aGF0IGRvZXNuJ3QgcmVxdWlyZSBvbmUsIGJ1dCBmb3Igc2FmZXR5J3Mgc2FrZSwgYW5kIHNvCi0gICAgICogd2UgaGF2ZSBzb21ldGhpbmcgZmluZF90eXBlcygpIGNhbiBnZXQgc29tZXRoaW5nIG91dCBvZiwgZmFrZSBvbmUuIEJ1dAotICAgICAqIGRvbid0IHJ1biB0aHJvdWdoIHRoZSBkaXJlY3RvcnkgZW50cmllcy4KLSAgICAgKi8KLQotICAgIGlmIChyLT5maWxlbmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmR1cChyLT5wb29sLCByLT51cmkpOwotICAgICAgICByLT5maW5mby5wcm90ZWN0aW9uID0gMDsgICAvKiBOb3QgcmVhbGx5IGEgZmlsZS4uLiAqLwotICAgICAgICByLT5maW5mby5maWxldHlwZSA9IEFQUl9OT0ZJTEU7Ci0gICAgICAgIHItPnBlcl9kaXJfY29uZmlnID0gcGVyX2Rpcl9kZWZhdWx0czsKLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBHbyBkb3duIHRoZSBkaXJlY3RvcnkgaGllcmFyY2h5LiAgV2hlcmUgd2UgaGF2ZSB0byBjaGVjayBmb3Igc3ltbGlua3MsCi0gICAgICogZG8gc28uICBXaGVyZSBhIC5odGFjY2VzcyBmaWxlIGhhcyBwZXJtaXNzaW9uIHRvIG92ZXJyaWRlIGFueXRoaW5nLAotICAgICAqIHRyeSB0byBmaW5kIG9uZS4gIElmIGVpdGhlciBvZiB0aGVzZSB0aGluZ3MgZmFpbHMsIHdlIGNvdWxkIHBva2UKLSAgICAgKiBhcm91bmQsIHNlZSB3aHksIGFuZCBhZGp1c3QgdGhlIGxvb2t1cF9yZWMgYWNjb3JkaW5nbHkgLS0tIHRoaXMgbWlnaHQKLSAgICAgKiBzYXZlIHVzIGEgY2FsbCB0byBnZXRfcGF0aF9pbmZvICh3aXRoIHRoZSBhdHRlbmRhbnQgc3RhdCgpcyk7IGhvd2V2ZXIsCi0gICAgICogZm9yIHRoZSBtb21lbnQsIHRoYXQncyBub3Qgd29ydGggdGhlIHRyb3VibGUuCi0gICAgICoKLSAgICAgKiBGYWtlIGZpbGVuYW1lcyAoaS5lLiBwcm94eTopIG9ubHkgbWF0Y2ggRGlyZWN0b3J5IHNlY3Rpb25zLgotICAgICAqLwotCi0gICAgaWYgKCFhcF9vc19pc19wYXRoX2Fic29sdXRlKHItPmZpbGVuYW1lKSkKLSAgICB7Ci0gICAgICAgIHZvaWQgKnRoaXNfY29uZiwgKmVudHJ5X2NvbmZpZzsKLSAgICAgICAgY29yZV9kaXJfY29uZmlnICplbnRyeV9jb3JlOwotICAgICAgICBjaGFyICplbnRyeV9kaXI7Ci0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bV9zZWM7ICsraikgewotCi0gICAgICAgICAgICBlbnRyeV9jb25maWcgPSBzZWNbal07Ci0KLSAgICAgICAgICAgIGVudHJ5X2NvcmUgPSAoY29yZV9kaXJfY29uZmlnICopCi0gICAgICAgICAgICAgICAgYXBfZ2V0X21vZHVsZV9jb25maWcoZW50cnlfY29uZmlnLCAmY29yZV9tb2R1bGUpOwotICAgICAgICAgICAgZW50cnlfZGlyID0gZW50cnlfY29yZS0+ZDsKLQotICAgICAgICAgICAgdGhpc19jb25mID0gTlVMTDsKLSAgICAgICAgICAgIGlmIChlbnRyeV9jb3JlLT5yKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFhcF9yZWdleGVjKGVudHJ5X2NvcmUtPnIsIHItPmZpbGVuYW1lLCAwLCBOVUxMLCAwKSkKLSAgICAgICAgICAgICAgICAgICAgdGhpc19jb25mID0gZW50cnlfY29uZmlnOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoZW50cnlfY29yZS0+ZF9pc19mbm1hdGNoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFhcF9mbm1hdGNoKGVudHJ5X2Rpciwgci0+ZmlsZW5hbWUsIDApKQotICAgICAgICAgICAgICAgICAgICB0aGlzX2NvbmYgPSBlbnRyeV9jb25maWc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghc3RybmNtcChyLT5maWxlbmFtZSwgZW50cnlfZGlyLCBzdHJsZW4oZW50cnlfZGlyKSkpCi0gICAgICAgICAgICAgICAgdGhpc19jb25mID0gZW50cnlfY29uZmlnOwotCi0gICAgICAgICAgICBpZiAodGhpc19jb25mKQotICAgICAgICAgICAgICAgIHBlcl9kaXJfZGVmYXVsdHMgPSBhcF9tZXJnZV9wZXJfZGlyX2NvbmZpZ3Moci0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcl9kaXJfZGVmYXVsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2NvbmYpOwotICAgICAgICB9Ci0KLSAgICAgICAgci0+cGVyX2Rpcl9jb25maWcgPSBwZXJfZGlyX2RlZmF1bHRzOwotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICByLT5maWxlbmFtZSAgID0gYXBfb3NfY2FzZV9jYW5vbmljYWxfZmlsZW5hbWUoci0+cG9vbCwgci0+ZmlsZW5hbWUpOwotCi0gICAgcmVzID0gZ2V0X3BhdGhfaW5mbyhyKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgci0+ZmlsZW5hbWUgICA9IGFwX29zX2Nhbm9uaWNhbF9maWxlbmFtZShyLT5wb29sLCByLT5maWxlbmFtZSk7Ci0KLSAgICB0ZXN0X2ZpbGVuYW1lID0gYXBfcHN0cmR1cChyLT5wb29sLCByLT5maWxlbmFtZSk7Ci0KLSAgICBhcF9ubzJzbGFzaCh0ZXN0X2ZpbGVuYW1lKTsKLSAgICBudW1fZGlycyA9IGFwX2NvdW50X2RpcnModGVzdF9maWxlbmFtZSk7Ci0KLSAgICBpZiAoIWFwX29zX2lzX2ZpbGVuYW1lX3ZhbGlkKHItPmZpbGVuYW1lKSkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAgICJGaWxlbmFtZSBpcyBub3QgdmFsaWQ6ICVzIiwgci0+ZmlsZW5hbWUpOwotICAgICAgICByZXR1cm4gSFRUUF9GT1JCSURERU47Ci0gICAgfQotCi0gICAgaWYgKChyZXMgPSBjaGVja19zYWZlX2ZpbGUocikpKSB7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgdGVzdF9maWxlbmFtZV9sZW4gPSBzdHJsZW4odGVzdF9maWxlbmFtZSk7Ci0gICAgaWYgKHRlc3RfZmlsZW5hbWVbdGVzdF9maWxlbmFtZV9sZW4gLSAxXSA9PSAnLycpCi0gICAgICAgIC0tbnVtX2RpcnM7Ci0KLSAgICBpZiAoci0+ZmluZm8uZmlsZXR5cGUgPT0gQVBSX0RJUikKLSAgICAgICAgKytudW1fZGlyczsKLQotICAgIC8qCi0gICAgICogV2Ugd2lsbCB1c2UgdGVzdF9kaXJuYW1lIGFzIHNjcmF0Y2ggc3BhY2Ugd2hpbGUgd2UgYnVpbGQgZGlyZWN0b3J5Ci0gICAgICogbmFtZXMgZHVyaW5nIHRoZSB3YWxrLiAgUHJvZmlsaW5nIHNob3dzIGRpcmVjdG9yeV93YWxrIHRvIGJlIGEgYnVzeQotICAgICAqIGZ1bmN0aW9uIHNvIHdlIHRyeSB0byBhdm9pZCBhbGxvY2F0aW5nIGxvdHMgb2YgZXh0cmEgbWVtb3J5IGhlcmUuCi0gICAgICogV2UgbmVlZCAyIGV4dHJhIGJ5dGVzLCBvbmUgZm9yIHRyYWlsaW5nIFwwIGFuZCBvbmUgYmVjYXVzZQotICAgICAqIG1ha2VfZGlyc3RyX3ByZWZpeCB3aWxsIGFkZCBwb3RlbnRpYWxseSBvbmUgZXh0cmEgLy4KLSAgICAgKi8KLSAgICB0ZXN0X2Rpcm5hbWUgPSBhcF9wYWxsb2Moci0+cG9vbCwgdGVzdF9maWxlbmFtZV9sZW4gKyAyKTsKLQotICAgIGlTdGFydCA9IDE7Ci0jaWZkZWYgV0lOMzIKLSAgICAvKiBJZiB0aGUgbmFtZSBpcyBhIFVOQyBuYW1lLCB0aGVuIGRvIG5vdCB3YWxrIHRocm91Z2ggdGhlCi0gICAgICogbWFjaGluZSBhbmQgc2hhcmUgbmFtZSAoZS5nLiBcXG1hY2hpbmVcc2hhcmVcKQotICAgICAqLwotICAgIGlmIChudW1fZGlycyA+IDMgJiYgdGVzdF9maWxlbmFtZVswXSA9PSAnLycgJiYgdGVzdF9maWxlbmFtZVsxXSA9PSAnLycpCi0gICAgICAgIGlTdGFydCA9IDQ7Ci0jZW5kaWYKLQotICAgIC8qIGoga2VlcHMgdHJhY2sgb2Ygd2hpY2ggc2VjdGlvbiB3ZSdyZSBvbiwgc2VlIGNvcmVfcmVvcmRlcl9kaXJlY3RvcmllcyAqLwotICAgIGogPSAwOwotICAgIGZvciAoaSA9IGlTdGFydDsgaSA8PSBudW1fZGlyczsgKytpKSB7Ci0gICAgICAgIGludCBvdmVycmlkZXNfaGVyZTsKLSAgICAgICAgY29yZV9kaXJfY29uZmlnICpjb3JlX2RpciA9IChjb3JlX2Rpcl9jb25maWcgKikKLSAgICAgICAgICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKHBlcl9kaXJfZGVmYXVsdHMsICZjb3JlX21vZHVsZSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogWFhYOiB0aGlzIGNvdWxkIGJlIG1hZGUgZmFzdGVyIGJ5IG9ubHkgY29weWluZyB0aGUgbmV4dCBjb21wb25lbnQKLSAgICAgICAgICogcmF0aGVyIHRoYW4gY29weWluZyB0aGUgZW50aXJlIHRoaW5nIGFsbCBvdmVyLgotICAgICAgICAgKi8KLSAgICAgICAgYXBfbWFrZV9kaXJzdHJfcHJlZml4KHRlc3RfZGlybmFtZSwgdGVzdF9maWxlbmFtZSwgaSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogRG8gc3ltbGluayBjaGVja3MgZmlyc3QsIGJlY2F1c2UgdGhleSBhcmUgZG9uZSB3aXRoIHRoZQotICAgICAgICAgKiBwZXJtaXNzaW9ucyBhcHByb3ByaWF0ZSB0byB0aGUgKnBhcmVudCogZGlyZWN0b3J5Li4uCi0gICAgICAgICAqLwotCi0gICAgICAgIGlmICgocmVzID0gY2hlY2tfc3ltbGlua3ModGVzdF9kaXJuYW1lLCBjb3JlX2Rpci0+b3B0cykpKSB7Ci0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgIlN5bWJvbGljIGxpbmsgbm90IGFsbG93ZWQ6ICVzIiwgdGVzdF9kaXJuYW1lKTsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBCZWdpbiAqdGhpcyogbGV2ZWwgYnkgbG9va2luZyBmb3IgbWF0Y2hpbmcgPERpcmVjdG9yeT4gc2VjdGlvbnMKLSAgICAgICAgICogZnJvbSBhY2Nlc3MuY29uZi4KLSAgICAgICAgICovCi0KLSAgICAgICAgZm9yICg7IGogPCBudW1fc2VjOyArK2opIHsKLSAgICAgICAgICAgIHZvaWQgKmVudHJ5X2NvbmZpZyA9IHNlY1tqXTsKLSAgICAgICAgICAgIGNvcmVfZGlyX2NvbmZpZyAqZW50cnlfY29yZTsKLSAgICAgICAgICAgIGNoYXIgKmVudHJ5X2RpcjsKLSAgICAgICAgICAgIHZvaWQgKnRoaXNfY29uZjsKLQotICAgICAgICAgICAgZW50cnlfY29yZSA9IChjb3JlX2Rpcl9jb25maWcgKikKLSAgICAgICAgICAgICAgICAgICAgICAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhlbnRyeV9jb25maWcsICZjb3JlX21vZHVsZSk7Ci0gICAgICAgICAgICBlbnRyeV9kaXIgPSBlbnRyeV9jb3JlLT5kOwotCi0gICAgICAgICAgICBpZiAoZW50cnlfY29yZS0+cgotCQl8fCAhYXBfb3NfaXNfcGF0aF9hYnNvbHV0ZShlbnRyeV9kaXIpCi0gICAgICAgICAgICAgICAgfHwgZW50cnlfY29yZS0+ZF9jb21wb25lbnRzID4gaSkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgdGhpc19jb25mID0gTlVMTDsKLSAgICAgICAgICAgIGlmIChlbnRyeV9jb3JlLT5kX2lzX2ZubWF0Y2gpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWFwX2ZubWF0Y2goZW50cnlfZGlyLCB0ZXN0X2Rpcm5hbWUsIEZOTV9QQVRITkFNRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpc19jb25mID0gZW50cnlfY29uZmlnOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAodGVzdF9kaXJuYW1lLCBlbnRyeV9kaXIpKQotICAgICAgICAgICAgICAgIHRoaXNfY29uZiA9IGVudHJ5X2NvbmZpZzsKLQotICAgICAgICAgICAgaWYgKHRoaXNfY29uZikgewotICAgICAgICAgICAgICAgIHBlcl9kaXJfZGVmYXVsdHMgPSBhcF9tZXJnZV9wZXJfZGlyX2NvbmZpZ3Moci0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcl9kaXJfZGVmYXVsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2NvbmYpOwotICAgICAgICAgICAgICAgIGNvcmVfZGlyID0gKGNvcmVfZGlyX2NvbmZpZyAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfZ2V0X21vZHVsZV9jb25maWcocGVyX2Rpcl9kZWZhdWx0cywgJmNvcmVfbW9kdWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBvdmVycmlkZXNfaGVyZSA9IGNvcmVfZGlyLT5vdmVycmlkZTsKLQotICAgICAgICAvKiBJZiAuaHRhY2Nlc3MgZmlsZXMgYXJlIGVuYWJsZWQsIGNoZWNrIGZvciBvbmUuICovCi0KLSAgICAgICAgaWYgKG92ZXJyaWRlc19oZXJlKSB7Ci0gICAgICAgICAgICB2b2lkICpodGFjY2Vzc19jb25mID0gTlVMTDsKLQotICAgICAgICAgICAgcmVzID0gYXBfcGFyc2VfaHRhY2Nlc3MoJmh0YWNjZXNzX2NvbmYsIHIsIG92ZXJyaWRlc19oZXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfcHN0cmR1cChyLT5wb29sLCB0ZXN0X2Rpcm5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvbmYtPmFjY2Vzc19uYW1lKTsKLSAgICAgICAgICAgIGlmIChyZXMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKLQotICAgICAgICAgICAgaWYgKGh0YWNjZXNzX2NvbmYpIHsKLSAgICAgICAgICAgICAgICBwZXJfZGlyX2RlZmF1bHRzID0gYXBfbWVyZ2VfcGVyX2Rpcl9jb25maWdzKHItPnBvb2wsCi0JCQkJCQkJICAgIHBlcl9kaXJfZGVmYXVsdHMsCi0JCQkJCQkJICAgIGh0YWNjZXNzX2NvbmYpOwotCQlyLT5wZXJfZGlyX2NvbmZpZyA9IHBlcl9kaXJfZGVmYXVsdHM7Ci0JICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogVGhlcmUncyB0d28gdHlwZXMgb2YgSVNfU1BFQ0lBTCBzZWN0aW9ucyAoc2VlIGh0dHBfY29yZS5jKSwgYW5kIHdlJ3ZlCi0gICAgICogYWxyZWFkeSBoYW5kbGVkIHRoZSBwcm94eTotc3R5bGUgc3R1ZmYuICBOb3cgd2UnbGwgZGVhbCB3aXRoIHRoZQotICAgICAqIHJlZ2V4ZXMuCi0gICAgICovCi0gICAgZm9yICg7IGogPCBudW1fc2VjOyArK2opIHsKLSAgICAgICAgdm9pZCAqZW50cnlfY29uZmlnID0gc2VjW2pdOwotICAgICAgICBjb3JlX2Rpcl9jb25maWcgKmVudHJ5X2NvcmU7Ci0KLSAgICAgICAgZW50cnlfY29yZSA9IChjb3JlX2Rpcl9jb25maWcgKikKLSAgICAgICAgICAgICAgICAgICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKGVudHJ5X2NvbmZpZywgJmNvcmVfbW9kdWxlKTsKLQotICAgICAgICBpZiAoZW50cnlfY29yZS0+cikgewotICAgICAgICAgICAgaWYgKCFhcF9yZWdleGVjKGVudHJ5X2NvcmUtPnIsIHRlc3RfZGlybmFtZSwgMCwgTlVMTCwgUkVHX05PVEVPTCkpIHsKLSAgICAgICAgICAgICAgICBwZXJfZGlyX2RlZmF1bHRzID0KLSAgICAgICAgICAgICAgICAgICAgYXBfbWVyZ2VfcGVyX2Rpcl9jb25maWdzKHItPnBvb2wsIHBlcl9kaXJfZGVmYXVsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeV9jb25maWcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHItPnBlcl9kaXJfY29uZmlnID0gcGVyX2Rpcl9kZWZhdWx0czsKLQotICAgIC8qCi0gICAgICogU3ltbGluayBwZXJtaXNzaW9ucyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgcGFyZW50LiAgSWYgdGhlIHJlcXVlc3QgaXMKLSAgICAgKiBmb3IgYSBkaXJlY3RvcnkgdGhlbiBhcHBseWluZyB0aGUgc3ltbGluayB0ZXN0IGhlcmUgd291bGQgdXNlIHRoZQotICAgICAqIHBlcm1pc3Npb25zIG9mIHRoZSBkaXJlY3RvcnkgYXMgb3Bwb3NlZCB0byBpdHMgcGFyZW50LiAgQ29uc2lkZXIgYQotICAgICAqIHN5bWxpbmsgcG9pbnRpbmcgdG8gYSBkaXIgd2l0aCBhIC5odGFjY2VzcyBkaXNhbGxvd2luZyBzeW1saW5rcy4gIElmCi0gICAgICogeW91IGFjY2VzcyAvc3ltbGluayAob3IgL3N5bWxpbmsvKSB5b3Ugd291bGQgZ2V0IGEgNDAzIHdpdGhvdXQgdGhpcwotICAgICAqIFNfSVNESVIgdGVzdC4gIEJ1dCBpZiB5b3UgYWNjZXNzZWQgL3N5bWxpbmsvaW5kZXguaHRtbCwgZm9yIGV4YW1wbGUsCi0gICAgICogeW91IHdvdWxkICpub3QqIGdldCB0aGUgNDAzLgotICAgICAqLwotICAgIGlmIChyLT5maW5mby5maWxldHlwZSAhPSBBUFJfRElSCi0gICAgICAgICYmIChyZXMgPSBjaGVja19zeW1saW5rcyhyLT5maWxlbmFtZSwgYXBfYWxsb3dfb3B0aW9ucyhyKSkpKSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICJTeW1ib2xpYyBsaW5rIG5vdCBhbGxvd2VkOiAlcyIsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOyAgICAgICAgICAgICAgICAgIC8qIENhbiBvbmx5ICJmYWlsIiBpZiBhY2Nlc3MgZGVuaWVkIGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzeW1saW5rIGdvb3AuICovCi19Ci0KLXN0YXRpYyBpbnQgbG9jYXRpb25fd2FsayhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb3JlX3NlcnZlcl9jb25maWcgKnNjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcoci0+c2VydmVyLT5tb2R1bGVfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29yZV9tb2R1bGUpOwotICAgIHZvaWQgKnBlcl9kaXJfZGVmYXVsdHMgPSByLT5wZXJfZGlyX2NvbmZpZzsKLSAgICB2b2lkICoqdXJsID0gKHZvaWQgKiopIHNjb25mLT5zZWNfdXJsLT5lbHRzOwotICAgIGludCBsZW4sIG51bV91cmwgPSBzY29uZi0+c2VjX3VybC0+bmVsdHM7Ci0gICAgY2hhciAqdGVzdF9sb2NhdGlvbjsKLSAgICB2b2lkICp0aGlzX2NvbmYsICplbnRyeV9jb25maWc7Ci0gICAgY29yZV9kaXJfY29uZmlnICplbnRyeV9jb3JlOwotICAgIGNoYXIgKmVudHJ5X3VybDsKLSAgICBpbnQgajsKLQotICAgIGlmICghbnVtX3VybCkgewotCXJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAvKiBMb2NhdGlvbiBhbmQgTG9jYXRpb25NYXRjaCBkaWZmZXIgb24gdGhlaXIgYmVoYXZpb3VyIHcuci50LiBtdWx0aXBsZQotICAgICAqIHNsYXNoZXMuICBMb2NhdGlvbiBtYXRjaGVzIG11bHRpcGxlIHNsYXNoZXMgd2l0aCBhIHNpbmdsZSBzbGFzaCwKLSAgICAgKiBMb2NhdGlvbk1hdGNoIGRvZXNuJ3QuICBBbiBleGNlcHRpb24sIGZvciBiYWNrd2FyZHMgYnJva2VubmVzcyBpcwotICAgICAqIGFic29sdXRlVVJJcy4uLiBpbiB3aGljaCBjYXNlIG5laXRoZXIgbWF0Y2ggbXVsdGlwbGUgc2xhc2hlcy4KLSAgICAgKi8KLSAgICBpZiAoci0+dXJpWzBdICE9ICcvJykgewotCXRlc3RfbG9jYXRpb24gPSByLT51cmk7Ci0gICAgfQotICAgIGVsc2UgewotCXRlc3RfbG9jYXRpb24gPSBhcF9wc3RyZHVwKHItPnBvb2wsIHItPnVyaSk7Ci0JYXBfbm8yc2xhc2godGVzdF9sb2NhdGlvbik7Ci0gICAgfQotCi0gICAgLyogR28gdGhyb3VnaCB0aGUgbG9jYXRpb24gZW50cmllcywgYW5kIGNoZWNrIGZvciBtYXRjaGVzLiAqLwotCi0gICAgLyogd2UgYXBwbHkgdGhlIGRpcmVjdGl2ZSBzZWN0aW9ucyBpbiBzb21lIG9yZGVyOwotICAgICAqIHNob3VsZCByZWFsbHkgdHJ5IHRoZW0gd2l0aCB0aGUgbW9zdCBnZW5lcmFsIGZpcnN0LgotICAgICAqLwotICAgIGZvciAoaiA9IDA7IGogPCBudW1fdXJsOyArK2opIHsKLQotCWVudHJ5X2NvbmZpZyA9IHVybFtqXTsKLQotCWVudHJ5X2NvcmUgPSAoY29yZV9kaXJfY29uZmlnICopCi0JICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKGVudHJ5X2NvbmZpZywgJmNvcmVfbW9kdWxlKTsKLQllbnRyeV91cmwgPSBlbnRyeV9jb3JlLT5kOwotCi0JbGVuID0gc3RybGVuKGVudHJ5X3VybCk7Ci0KLQl0aGlzX2NvbmYgPSBOVUxMOwotCi0JaWYgKGVudHJ5X2NvcmUtPnIpIHsKLQkgICAgaWYgKCFhcF9yZWdleGVjKGVudHJ5X2NvcmUtPnIsIHItPnVyaSwgMCwgTlVMTCwgMCkpCi0JCXRoaXNfY29uZiA9IGVudHJ5X2NvbmZpZzsKLQl9Ci0JZWxzZSBpZiAoZW50cnlfY29yZS0+ZF9pc19mbm1hdGNoKSB7Ci0JICAgIGlmICghYXBfZm5tYXRjaChlbnRyeV91cmwsIHRlc3RfbG9jYXRpb24sIEZOTV9QQVRITkFNRSkpIHsKLQkJdGhpc19jb25mID0gZW50cnlfY29uZmlnOwotCSAgICB9Ci0JfQotCWVsc2UgaWYgKCFzdHJuY21wKHRlc3RfbG9jYXRpb24sIGVudHJ5X3VybCwgbGVuKSAmJgotCQkgICAgKGVudHJ5X3VybFtsZW4gLSAxXSA9PSAnLycgfHwKLQkJdGVzdF9sb2NhdGlvbltsZW5dID09ICcvJyB8fCB0ZXN0X2xvY2F0aW9uW2xlbl0gPT0gJ1wwJykpCi0JICAgIHRoaXNfY29uZiA9IGVudHJ5X2NvbmZpZzsKLQotCWlmICh0aGlzX2NvbmYpCi0JICAgIHBlcl9kaXJfZGVmYXVsdHMgPSBhcF9tZXJnZV9wZXJfZGlyX2NvbmZpZ3Moci0+cG9vbCwKLQkJCQkJICAgIHBlcl9kaXJfZGVmYXVsdHMsIHRoaXNfY29uZik7Ci0gICAgfQotICAgIHItPnBlcl9kaXJfY29uZmlnID0gcGVyX2Rpcl9kZWZhdWx0czsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdGljIGludCBmaWxlX3dhbGsocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY29yZV9kaXJfY29uZmlnICpjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsICZjb3JlX21vZHVsZSk7Ci0gICAgdm9pZCAqcGVyX2Rpcl9kZWZhdWx0cyA9IHItPnBlcl9kaXJfY29uZmlnOwotICAgIHZvaWQgKipmaWxlID0gKHZvaWQgKiopIGNvbmYtPnNlYy0+ZWx0czsKLSAgICBpbnQgbnVtX2ZpbGVzID0gY29uZi0+c2VjLT5uZWx0czsKLSAgICBjaGFyICp0ZXN0X2ZpbGU7Ci0KLSAgICAvKiBnZXQgdGhlIGJhc2VuYW1lICovCi0gICAgdGVzdF9maWxlID0gc3RycmNocihyLT5maWxlbmFtZSwgJy8nKTsKLSAgICBpZiAodGVzdF9maWxlID09IE5VTEwpIHsKLQl0ZXN0X2ZpbGUgPSByLT5maWxlbmFtZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JKyt0ZXN0X2ZpbGU7Ci0gICAgfQotCi0gICAgLyogR28gdGhyb3VnaCB0aGUgZmlsZSBlbnRyaWVzLCBhbmQgY2hlY2sgZm9yIG1hdGNoZXMuICovCi0KLSAgICBpZiAobnVtX2ZpbGVzKSB7Ci0gICAgICAgIHZvaWQgKnRoaXNfY29uZiwgKmVudHJ5X2NvbmZpZzsKLSAgICAgICAgY29yZV9kaXJfY29uZmlnICplbnRyeV9jb3JlOwotICAgICAgICBjaGFyICplbnRyeV9maWxlOwotICAgICAgICBpbnQgajsKLQotICAgICAgICAvKiB3ZSBhcHBseSB0aGUgZGlyZWN0aXZlIHNlY3Rpb25zIGluIHNvbWUgb3JkZXI7Ci0gICAgICAgICAqIHNob3VsZCByZWFsbHkgdHJ5IHRoZW0gd2l0aCB0aGUgbW9zdCBnZW5lcmFsIGZpcnN0LgotICAgICAgICAgKi8KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bV9maWxlczsgKytqKSB7Ci0KLSAgICAgICAgICAgIGVudHJ5X2NvbmZpZyA9IGZpbGVbal07Ci0KLSAgICAgICAgICAgIGVudHJ5X2NvcmUgPSAoY29yZV9kaXJfY29uZmlnICopCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXBfZ2V0X21vZHVsZV9jb25maWcoZW50cnlfY29uZmlnLCAmY29yZV9tb2R1bGUpOwotICAgICAgICAgICAgZW50cnlfZmlsZSA9IGVudHJ5X2NvcmUtPmQ7Ci0KLSAgICAgICAgICAgIHRoaXNfY29uZiA9IE5VTEw7Ci0KLSAgICAgICAgICAgIGlmIChlbnRyeV9jb3JlLT5yKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFhcF9yZWdleGVjKGVudHJ5X2NvcmUtPnIsIHRlc3RfZmlsZSwgMCwgTlVMTCwgMCkpCi0gICAgICAgICAgICAgICAgICAgIHRoaXNfY29uZiA9IGVudHJ5X2NvbmZpZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGVudHJ5X2NvcmUtPmRfaXNfZm5tYXRjaCkgewotICAgICAgICAgICAgICAgIGlmICghYXBfZm5tYXRjaChlbnRyeV9maWxlLCB0ZXN0X2ZpbGUsIEZOTV9QQVRITkFNRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpc19jb25mID0gZW50cnlfY29uZmlnOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAodGVzdF9maWxlLCBlbnRyeV9maWxlKSkgewotICAgICAgICAgICAgICAgIHRoaXNfY29uZiA9IGVudHJ5X2NvbmZpZzsKLQkgICAgfQotCi0gICAgICAgICAgICBpZiAodGhpc19jb25mKQotICAgICAgICAgICAgICAgIHBlcl9kaXJfZGVmYXVsdHMgPSBhcF9tZXJnZV9wZXJfZGlyX2NvbmZpZ3Moci0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcl9kaXJfZGVmYXVsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2NvbmYpOwotICAgICAgICB9Ci0gICAgICAgIHItPnBlcl9kaXJfY29uZmlnID0gcGVyX2Rpcl9kZWZhdWx0czsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaGUgc3ViX3JlcXVlc3QgbWVjaGFuaXNtLgotICoKLSAqIEZucyB0byBsb29rIHVwIGEgcmVsYXRpdmUgVVJJIGZyb20sIGUuZy4sIGEgbWFwIGZpbGUgb3IgU1NJIGRvY3VtZW50LgotICogVGhlc2UgZG8gYWxsIGFjY2VzcyBjaGVja3MsIGV0Yy4sIGJ1dCBkb24ndCBhY3R1YWxseSBydW4gdGhlIHRyYW5zYWN0aW9uCi0gKiAuLi4gdXNlIHJ1bl9zdWJfcmVxIGJlbG93IGZvciB0aGF0LiAgQWxzbywgYmUgc3VyZSB0byB1c2UgZGVzdHJveV9zdWJfcmVxCi0gKiBhcyBhcHByb3ByaWF0ZSBpZiB5b3UncmUgbGlrZWx5IHRvIGJlIGNyZWF0aW5nIG1vcmUgdGhhbiBhIGZldyBvZiB0aGVzZS4KLSAqIChBbiBlYXJseSBBcGFjaGUgdmVyc2lvbiBkaWRuJ3QgZGVzdHJveSB0aGUgc3ViX3JlcXMgdXNlZCBpbiBkaXJlY3RvcnkKLSAqIGluZGV4aW5nLiAgVGhlIHJlc3VsdCwgd2hlbiBpbmRleGluZyBhIGRpcmVjdG9yeSB3aXRoIDgwMC1vZGQgZmlsZXMgaW4KLSAqIGl0LCB3YXMgbWFzc2l2ZWx5IGV4Y2Vzc2l2ZSBzdG9yYWdlIGFsbG9jYXRpb24pLgotICoKLSAqIE5vdGUgbW9yZSBtYW5pcHVsYXRpb24gb2YgcHJvdG9jb2wtc3BlY2lmaWMgdmFycyBpbiB0aGUgcmVxdWVzdAotICogc3RydWN0dXJlLi4uCi0gKi8KLQotc3RhdGljIHJlcXVlc3RfcmVjICptYWtlX3N1Yl9yZXF1ZXN0KGNvbnN0IHJlcXVlc3RfcmVjICpyKQotewotICAgIGFwX2NvbnRleHRfdCAqcnJwOwotICAgIHJlcXVlc3RfcmVjICpycjsKLSAgICAKLSAgICBhcF9jcmVhdGVfY29udGV4dCgmcnJwLCByLT5wb29sKTsKLSAgICByciA9IGFwX3BjYWxsb2MocnJwLCBzaXplb2YocmVxdWVzdF9yZWMpKTsKLSAgICByci0+cG9vbCA9IHJycDsKLSAgICByZXR1cm4gcnI7Ci19Ci0KLUFQSV9FWFBPUlQocmVxdWVzdF9yZWMgKikgYXBfc3ViX3JlcV9tZXRob2RfdXJpKGNvbnN0IGNoYXIgKm1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5ld19maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgcmVxdWVzdF9yZWMgKnJuZXc7Ci0gICAgaW50IHJlczsKLSAgICBjaGFyICp1ZGlyOwotCi0gICAgcm5ldyA9IG1ha2Vfc3ViX3JlcXVlc3Qocik7Ci0gICAgcm5ldy0+aG9zdG5hbWUgICAgICAgPSByLT5ob3N0bmFtZTsKLSAgICBybmV3LT5yZXF1ZXN0X3RpbWUgICA9IHItPnJlcXVlc3RfdGltZTsKLSAgICBybmV3LT5jb25uZWN0aW9uICAgICA9IHItPmNvbm5lY3Rpb247Ci0gICAgcm5ldy0+c2VydmVyICAgICAgICAgPSByLT5zZXJ2ZXI7Ci0gICAgcm5ldy0+cmVxdWVzdF9jb25maWcgPSBhcF9jcmVhdGVfcmVxdWVzdF9jb25maWcocm5ldy0+cG9vbCk7Ci0gICAgcm5ldy0+aHRhY2Nlc3MgICAgICAgPSByLT5odGFjY2VzczsKLSAgICBybmV3LT5wZXJfZGlyX2NvbmZpZyA9IHItPnNlcnZlci0+bG9va3VwX2RlZmF1bHRzOwotCi0gICAgYXBfc2V0X3N1Yl9yZXFfcHJvdG9jb2wocm5ldywgcik7Ci0KLSAgICAvKiB3b3VsZCBiZSBuaWNlciB0byBwYXNzICJtZXRob2QiIHRvIGFwX3NldF9zdWJfcmVxX3Byb3RvY29sICovCi0gICAgcm5ldy0+bWV0aG9kID0gbWV0aG9kOwotICAgIHJuZXctPm1ldGhvZF9udW1iZXIgPSBhcF9tZXRob2RfbnVtYmVyX29mKG1ldGhvZCk7Ci0KLSAgICBpZiAobmV3X2ZpbGVbMF0gPT0gJy8nKQotICAgICAgICBhcF9wYXJzZV91cmkocm5ldywgbmV3X2ZpbGUpOwotICAgIGVsc2UgewotICAgICAgICB1ZGlyID0gYXBfbWFrZV9kaXJzdHJfcGFyZW50KHJuZXctPnBvb2wsIHItPnVyaSk7Ci0gICAgICAgIHVkaXIgPSBhcF9lc2NhcGVfdXJpKHJuZXctPnBvb2wsIHVkaXIpOyAgICAvKiByZS1lc2NhcGUgaXQgKi8KLSAgICAgICAgYXBfcGFyc2VfdXJpKHJuZXcsIGFwX21ha2VfZnVsbF9wYXRoKHJuZXctPnBvb2wsIHVkaXIsIG5ld19maWxlKSk7Ci0gICAgfQotCi0gICAgcmVzID0gYXBfdW5lc2NhcGVfdXJsKHJuZXctPnVyaSk7Ci0gICAgaWYgKHJlcykgewotICAgICAgICBybmV3LT5zdGF0dXMgPSByZXM7Ci0gICAgICAgIHJldHVybiBybmV3OwotICAgIH0KLQotICAgIGFwX2dldHBhcmVudHMocm5ldy0+dXJpKTsKLQotICAgIGlmICgocmVzID0gbG9jYXRpb25fd2FsayhybmV3KSkpIHsKLSAgICAgICAgcm5ldy0+c3RhdHVzID0gcmVzOwotICAgICAgICByZXR1cm4gcm5ldzsKLSAgICB9Ci0KLSAgICByZXMgPSBhcF9ydW5fdHJhbnNsYXRlX25hbWUocm5ldyk7Ci0gICAgaWYgKHJlcykgewotICAgICAgICBybmV3LT5zdGF0dXMgPSByZXM7Ci0gICAgICAgIHJldHVybiBybmV3OwotICAgIH0KLQotICAgIC8qCi0gICAgICogV2UgY291bGQgYmUgY2xldmVyIGF0IHRoaXMgcG9pbnQsIGFuZCBhdm9pZCBjYWxsaW5nIGRpcmVjdG9yeV93YWxrLAotICAgICAqIGV0Yy4gSG93ZXZlciwgd2UnZCBuZWVkIHRvIHRlc3QgdGhhdCB0aGUgb2xkIGFuZCBuZXcgZmlsZW5hbWVzIGNvbnRhaW4KLSAgICAgKiB0aGUgc2FtZSBkaXJlY3RvcnkgY29tcG9uZW50cywgc28gaXQgd291bGQgcmVxdWlyZSBkdXBsaWNhdGluZyB0aGUKLSAgICAgKiBzdGFydCBvZiB0cmFuc2xhdGVfbmFtZS4gSW5zdGVhZCB3ZSByZWx5IG9uIHRoZSBjYWNoZSBvZiAuaHRhY2Nlc3MKLSAgICAgKiByZXN1bHRzLgotICAgICAqCi0gICAgICogTkI6IGRpcmVjdG9yeV93YWxrKCkgY2xlYXJzIHRoZSBwZXJfZGlyX2NvbmZpZywgc28gd2UgZG9uJ3QgaW5oZXJpdAotICAgICAqIGZyb20gbG9jYXRpb25fd2FsaygpIGFib3ZlCi0gICAgICovCi0KLSAgICBpZiAoKHJlcyA9IGRpcmVjdG9yeV93YWxrKHJuZXcpKQotICAgICAgICB8fCAocmVzID0gZmlsZV93YWxrKHJuZXcpKQotICAgICAgICB8fCAocmVzID0gbG9jYXRpb25fd2FsayhybmV3KSkKLSAgICAgICAgfHwgKChhcF9zYXRpc2ZpZXMocm5ldykgPT0gU0FUSVNGWV9BTEwKLSAgICAgICAgICAgICB8fCBhcF9zYXRpc2ZpZXMocm5ldykgPT0gU0FUSVNGWV9OT1NQRUMpCi0gICAgICAgICAgICA/ICgocmVzID0gYXBfcnVuX2FjY2Vzc19jaGVja2VyKHJuZXcpKQotICAgICAgICAgICAgICAgfHwgKGFwX3NvbWVfYXV0aF9yZXF1aXJlZChybmV3KQotICAgICAgICAgICAgICAgICAgICYmICgocmVzID0gYXBfcnVuX2NoZWNrX3VzZXJfaWQocm5ldykpCi0gICAgICAgICAgICAgICAgICAgICAgIHx8IChyZXMgPSBhcF9ydW5fYXV0aF9jaGVja2VyKHJuZXcpKSkpKQotICAgICAgICAgICAgOiAoKHJlcyA9IGFwX3J1bl9hY2Nlc3NfY2hlY2tlcihybmV3KSkKLSAgICAgICAgICAgICAgICYmICghYXBfc29tZV9hdXRoX3JlcXVpcmVkKHJuZXcpCi0gICAgICAgICAgICAgICAgICAgfHwgKChyZXMgPSBhcF9ydW5fY2hlY2tfdXNlcl9pZChybmV3KSkKLSAgICAgICAgICAgICAgICAgICAgICAgfHwgKHJlcyA9IGFwX3J1bl9hdXRoX2NoZWNrZXIocm5ldykpKSkpCi0gICAgICAgICAgICkKLSAgICAgICAgfHwgKHJlcyA9IGFwX3J1bl90eXBlX2NoZWNrZXIocm5ldykpCi0gICAgICAgIHx8IChyZXMgPSBhcF9ydW5fZml4dXBzKHJuZXcpKQotICAgICAgICkgewotICAgICAgICBybmV3LT5zdGF0dXMgPSByZXM7Ci0gICAgfQotICAgIHJldHVybiBybmV3OwotfQotCi1BUElfRVhQT1JUKHJlcXVlc3RfcmVjICopIGFwX3N1Yl9yZXFfbG9va3VwX3VyaShjb25zdCBjaGFyICpuZXdfZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RfcmVjICpyKQotewotICAgIHJldHVybiBhcF9zdWJfcmVxX21ldGhvZF91cmkoIkdFVCIsIG5ld19maWxlLCByKTsKLX0KLQotQVBJX0VYUE9SVChyZXF1ZXN0X3JlYyAqKSBhcF9zdWJfcmVxX2xvb2t1cF9maWxlKGNvbnN0IGNoYXIgKm5ld19maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RfcmVjICpyKQotewotICAgIHJlcXVlc3RfcmVjICpybmV3OwotICAgIGludCByZXM7Ci0gICAgY2hhciAqZmRpcjsKLQotICAgIHJuZXcgPSBtYWtlX3N1Yl9yZXF1ZXN0KHIpOwotICAgIHJuZXctPmhvc3RuYW1lICAgICAgID0gci0+aG9zdG5hbWU7Ci0gICAgcm5ldy0+cmVxdWVzdF90aW1lICAgPSByLT5yZXF1ZXN0X3RpbWU7Ci0gICAgcm5ldy0+Y29ubmVjdGlvbiAgICAgPSByLT5jb25uZWN0aW9uOwotICAgIHJuZXctPnNlcnZlciAgICAgICAgID0gci0+c2VydmVyOwotICAgIHJuZXctPnJlcXVlc3RfY29uZmlnID0gYXBfY3JlYXRlX3JlcXVlc3RfY29uZmlnKHJuZXctPnBvb2wpOwotICAgIHJuZXctPmh0YWNjZXNzICAgICAgID0gci0+aHRhY2Nlc3M7Ci0gICAgcm5ldy0+Y2h1bmtlZCAgICAgICAgPSByLT5jaHVua2VkOwotCi0gICAgYXBfc2V0X3N1Yl9yZXFfcHJvdG9jb2wocm5ldywgcik7Ci0gICAgZmRpciA9IGFwX21ha2VfZGlyc3RyX3BhcmVudChybmV3LT5wb29sLCByLT5maWxlbmFtZSk7Ci0KLSAgICAvKgotICAgICAqIENoZWNrIGZvciBhIHNwZWNpYWwgY2FzZS4uLiBpZiB0aGVyZSBhcmUgbm8gJy8nIGNoYXJhY3RlcnMgaW4gbmV3X2ZpbGUKLSAgICAgKiBhdCBhbGwsIHRoZW4gd2UgYXJlIGxvb2tpbmcgYXQgYSByZWxhdGl2ZSBsb29rdXAgaW4gdGhlIHNhbWUKLSAgICAgKiBkaXJlY3RvcnkuIFRoYXQgbWVhbnMgd2Ugd29uJ3QgaGF2ZSB0byByZWRvIGRpcmVjdG9yeV93YWxrLCBhbmQgd2UgbWF5Ci0gICAgICogbm90IGV2ZW4gaGF2ZSB0byByZWRvIGFjY2VzcyBjaGVja3MuCi0gICAgICovCi0KLSAgICBpZiAoc3RyY2hyKG5ld19maWxlLCAnLycpID09IE5VTEwpIHsKLSAgICAgICAgY2hhciAqdWRpciA9IGFwX21ha2VfZGlyc3RyX3BhcmVudChybmV3LT5wb29sLCByLT51cmkpOwotCi0gICAgICAgIHJuZXctPnVyaSA9IGFwX21ha2VfZnVsbF9wYXRoKHJuZXctPnBvb2wsIHVkaXIsIG5ld19maWxlKTsKLSAgICAgICAgcm5ldy0+ZmlsZW5hbWUgPSBhcF9tYWtlX2Z1bGxfcGF0aChybmV3LT5wb29sLCBmZGlyLCBuZXdfZmlsZSk7Ci0gICAgICAgIGFwX3BhcnNlX3VyaShybmV3LCBybmV3LT51cmkpOyAgICAvKiBmaWxsIGluIHBhcnNlZF91cmkgdmFsdWVzICovCi0KLSAgICAgICAgaWYgKGFwX3N0YXQoJnJuZXctPmZpbmZvLCBybmV3LT5maWxlbmFtZSwgcm5ldy0+cG9vbCkgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHJuZXctPmZpbmZvLnByb3RlY3Rpb24gPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChyZXMgPSBjaGVja19zYWZlX2ZpbGUocm5ldykpKSB7Ci0gICAgICAgICAgICBybmV3LT5zdGF0dXMgPSByZXM7Ci0gICAgICAgICAgICByZXR1cm4gcm5ldzsKLSAgICAgICAgfQotCi0gICAgICAgIHJuZXctPnBlcl9kaXJfY29uZmlnID0gci0+cGVyX2Rpcl9jb25maWc7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogbm8gbWF0dGVyIHdoYXQsIGlmIGl0J3MgYSBzdWJkaXJlY3RvcnksIHdlIG5lZWQgdG8gcmUtcnVuCi0gICAgICAgICAqIGRpcmVjdG9yeV93YWxrCi0gICAgICAgICAqLwotICAgICAgICBpZiAocm5ldy0+ZmluZm8uZmlsZXR5cGUgPT0gQVBSX0RJUikgewotICAgICAgICAgICAgcmVzID0gZGlyZWN0b3J5X3dhbGsocm5ldyk7Ci0gICAgICAgICAgICBpZiAoIXJlcykgewotICAgICAgICAgICAgICAgIHJlcyA9IGZpbGVfd2FsayhybmV3KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmICgocmVzID0gY2hlY2tfc3ltbGlua3Mocm5ldy0+ZmlsZW5hbWUsIGFwX2FsbG93X29wdGlvbnMocm5ldykpKSkgewotICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHJuZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN5bWJvbGljIGxpbmsgbm90IGFsbG93ZWQ6ICVzIiwgcm5ldy0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIHJuZXctPnN0YXR1cyA9IHJlczsKLSAgICAgICAgICAgICAgICByZXR1cm4gcm5ldzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBkbyBhIGZpbGVfd2FsaywgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHBlcl9kaXJfY29uZmlnIHRoZW4KLSAgICAgICAgICAgICAqIHdlIGtub3cgdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHJlZG8gYWxsIHRoZSBhY2Nlc3MgY2hlY2tzCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICgocmVzID0gZmlsZV93YWxrKHJuZXcpKSkgewotICAgICAgICAgICAgICAgIHJuZXctPnN0YXR1cyA9IHJlczsKLSAgICAgICAgICAgICAgICByZXR1cm4gcm5ldzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChybmV3LT5wZXJfZGlyX2NvbmZpZyA9PSByLT5wZXJfZGlyX2NvbmZpZykgewotICAgICAgICAgICAgICAgIGlmICgocmVzID0gYXBfcnVuX3R5cGVfY2hlY2tlcihybmV3KSkgfHwgKHJlcyA9IGFwX3J1bl9maXh1cHMocm5ldykpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJuZXctPnN0YXR1cyA9IHJlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJuZXc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0JLyogWFhYOiBAQEA6IFdoYXQgc2hvdWxkIGJlIGRvbmUgd2l0aCB0aGUgcGFyc2VkX3VyaSB2YWx1ZXM/ICovCi0JYXBfcGFyc2VfdXJpKHJuZXcsIG5ld19maWxlKTsJLyogZmlsbCBpbiBwYXJzZWRfdXJpIHZhbHVlcyAqLwotICAgICAgICAvKgotICAgICAgICAgKiBYWFg6IHRoaXMgc2hvdWxkIGJlIHNldCBwcm9wZXJseSBsaWtlIGl0IGlzIGluIHRoZSBzYW1lLWRpciBjYXNlCi0gICAgICAgICAqIGJ1dCBpdCdzIGFjdHVhbGx5IHNvbWV0aW1lcyB0byBpbXBvc3NpYmxlIHRvIGRvIGl0Li4uIGJlY2F1c2UgdGhlCi0gICAgICAgICAqIGZpbGUgbWF5IG5vdCBoYXZlIGEgdXJpIGFzc29jaWF0ZWQgd2l0aCBpdCAtZGpnCi0gICAgICAgICAqLwotICAgICAgICBybmV3LT51cmkgPSAiSU5URVJOQUxMWSBHRU5FUkFURUQgZmlsZS1yZWxhdGl2ZSByZXEiOwotICAgICAgICBybmV3LT5maWxlbmFtZSA9ICgoYXBfb3NfaXNfcGF0aF9hYnNvbHV0ZShuZXdfZmlsZSkpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfcHN0cmR1cChybmV3LT5wb29sLCBuZXdfZmlsZSkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9tYWtlX2Z1bGxfcGF0aChybmV3LT5wb29sLCBmZGlyLCBuZXdfZmlsZSkpOwotICAgICAgICBybmV3LT5wZXJfZGlyX2NvbmZpZyA9IHItPnNlcnZlci0+bG9va3VwX2RlZmF1bHRzOwotICAgICAgICByZXMgPSBkaXJlY3Rvcnlfd2FsayhybmV3KTsKLSAgICAgICAgaWYgKCFyZXMpIHsKLSAgICAgICAgICAgIHJlcyA9IGZpbGVfd2FsayhybmV3KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChyZXMKLSAgICAgICAgfHwgKChhcF9zYXRpc2ZpZXMocm5ldykgPT0gU0FUSVNGWV9BTEwKLSAgICAgICAgICAgICB8fCBhcF9zYXRpc2ZpZXMocm5ldykgPT0gU0FUSVNGWV9OT1NQRUMpCi0gICAgICAgICAgICA/ICgocmVzID0gYXBfcnVuX2FjY2Vzc19jaGVja2VyKHJuZXcpKQotICAgICAgICAgICAgICAgfHwgKGFwX3NvbWVfYXV0aF9yZXF1aXJlZChybmV3KQotICAgICAgICAgICAgICAgICAgICYmICgocmVzID0gYXBfcnVuX2NoZWNrX3VzZXJfaWQocm5ldykpCi0gICAgICAgICAgICAgICAgICAgICAgIHx8IChyZXMgPSBhcF9ydW5fYXV0aF9jaGVja2VyKHJuZXcpKSkpKQotICAgICAgICAgICAgOiAoKHJlcyA9IGFwX3J1bl9hY2Nlc3NfY2hlY2tlcihybmV3KSkKLSAgICAgICAgICAgICAgICYmICghYXBfc29tZV9hdXRoX3JlcXVpcmVkKHJuZXcpCi0gICAgICAgICAgICAgICAgICAgfHwgKChyZXMgPSBhcF9ydW5fY2hlY2tfdXNlcl9pZChybmV3KSkKLSAgICAgICAgICAgICAgICAgICAgICAgfHwgKHJlcyA9IGFwX3J1bl9hdXRoX2NoZWNrZXIocm5ldykpKSkpCi0gICAgICAgICAgICkKLSAgICAgICAgfHwgKHJlcyA9IGFwX3J1bl90eXBlX2NoZWNrZXIocm5ldykpCi0gICAgICAgIHx8IChyZXMgPSBhcF9ydW5fZml4dXBzKHJuZXcpKQotICAgICAgICkgewotICAgICAgICBybmV3LT5zdGF0dXMgPSByZXM7Ci0gICAgfQotICAgIHJldHVybiBybmV3OwotfQotCi1BUElfRVhQT1JUKGludCkgYXBfcnVuX3N1Yl9yZXEocmVxdWVzdF9yZWMgKnIpCi17Ci0jaWZuZGVmIENIQVJTRVRfRUJDRElDCi0gICAgaW50IHJldHZhbCA9IGFwX2ludm9rZV9oYW5kbGVyKHIpOwotI2Vsc2UgLypDSEFSU0VUX0VCQ0RJQyovCi0gICAgLyogU2F2ZSB0aGUgRUJDRElDIGNvbnZlcnNpb24gc2V0dGluZyBvZiB0aGUgY2FsbGVyIGFjcm9zcyBzdWJyZXF1ZXN0cyAqLwotICAgIGludCBjb252ZXJ0ID0gYXBfYmdldGZsYWcoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCX0VCQ0RJQzJBU0NJSSk7Ci0gICAgaW50IHJldHZhbCAgPSBhcF9pbnZva2VfaGFuZGxlcihyKTsKLSAgICBhcF9ic2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfRUJDRElDMkFTQ0lJLCBjb252ZXJ0KTsKLSNlbmRpZiAvKkNIQVJTRVRfRUJDRElDKi8KLSAgICBhcF9maW5hbGl6ZV9zdWJfcmVxX3Byb3RvY29sKHIpOwotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfZGVzdHJveV9zdWJfcmVxKHJlcXVlc3RfcmVjICpyKQotewotICAgIC8qIFJlY2xhaW0gdGhlIHNwYWNlICovCi0gICAgYXBfZGVzdHJveV9wb29sKHItPnBvb2wpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNYWlubGluZSByZXF1ZXN0IHByb2Nlc3NpbmcuLi4KLSAqLwotCi1BUElfRVhQT1JUKHZvaWQpIGFwX2RpZShpbnQgdHlwZSwgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IGVycm9yX2luZGV4ID0gYXBfaW5kZXhfb2ZfcmVzcG9uc2UodHlwZSk7Ci0gICAgY2hhciAqY3VzdG9tX3Jlc3BvbnNlID0gYXBfcmVzcG9uc2VfY29kZV9zdHJpbmcociwgZXJyb3JfaW5kZXgpOwotICAgIGludCByZWN1cnNpdmVfZXJyb3IgPSAwOwotCi0gICAgaWYgKHR5cGUgPT0gRE9ORSkgewotICAgICAgICBhcF9maW5hbGl6ZV9yZXF1ZXN0X3Byb3RvY29sKHIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUaGUgZm9sbG93aW5nIHRha2VzIGNhcmUgb2YgQXBhY2hlIHJlZGlyZWN0cyB0byBjdXN0b20gcmVzcG9uc2UgVVJMcwotICAgICAqIE5vdGUgdGhhdCBpZiB3ZSBhcmUgYWxyZWFkeSBkZWFsaW5nIHdpdGggdGhlIHJlc3BvbnNlIHRvIHNvbWUgb3RoZXIKLSAgICAgKiBlcnJvciBjb25kaXRpb24sIHdlIGp1c3QgcmVwb3J0IG9uIHRoZSBvcmlnaW5hbCBlcnJvciwgYW5kIGdpdmUgdXAgb24KLSAgICAgKiBhbnkgYXR0ZW1wdCB0byBoYW5kbGUgdGhlIG90aGVyIHRoaW5nICJpbnRlbGxpZ2VudGx5Ii4uLgotICAgICAqLwotCi0gICAgaWYgKHItPnN0YXR1cyAhPSBIVFRQX09LKSB7Ci0gICAgICAgIHJlY3Vyc2l2ZV9lcnJvciA9IHR5cGU7Ci0KLSAgICAgICAgd2hpbGUgKHItPnByZXYgJiYgKHItPnByZXYtPnN0YXR1cyAhPSBIVFRQX09LKSkKLSAgICAgICAgICAgIHIgPSByLT5wcmV2OyAgICAgICAgLyogR2V0IGJhY2sgdG8gb3JpZ2luYWwgZXJyb3IgKi8KLQotICAgICAgICB0eXBlID0gci0+c3RhdHVzOwotICAgICAgICBjdXN0b21fcmVzcG9uc2UgPSBOVUxMOyAvKiBEbyBOT1QgcmV0cnkgdGhlIGN1c3RvbSB0aGluZyEgKi8KLSAgICB9Ci0KLSAgICByLT5zdGF0dXMgPSB0eXBlOwotCi0gICAgLyoKLSAgICAgKiBUaGlzIHRlc3QgaXMgZG9uZSBoZXJlIHNvIHRoYXQgbm9uZSBvZiB0aGUgYXV0aCBtb2R1bGVzIG5lZWRzIHRvIGtub3cKLSAgICAgKiBhYm91dCBwcm94eSBhdXRoZW50aWNhdGlvbi4gIFRoZXkgdHJlYXQgaXQgbGlrZSBub3JtYWwgYXV0aCwgYW5kIHRoZW4KLSAgICAgKiB3ZSB0d2VhayB0aGUgc3RhdHVzLgotICAgICAqLwotICAgIGlmIChyLT5zdGF0dXMgPT0gQVVUSF9SRVFVSVJFRCAmJiByLT5wcm94eXJlcSkgewotICAgICAgICByLT5zdGF0dXMgPSBIVFRQX1BST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEOwotICAgIH0KLQotICAgIC8qCi0gICAgICogSWYgd2Ugd2FudCB0byBrZWVwIHRoZSBjb25uZWN0aW9uLCBiZSBzdXJlIHRoYXQgdGhlIHJlcXVlc3QgYm9keQotICAgICAqIChpZiBhbnkpIGhhcyBiZWVuIHJlYWQuCi0gICAgICovCi0gICAgaWYgKChyLT5zdGF0dXMgIT0gSFRUUF9OT1RfTU9ESUZJRUQpICYmIChyLT5zdGF0dXMgIT0gSFRUUF9OT19DT05URU5UKQotICAgICAgICAmJiAhYXBfc3RhdHVzX2Ryb3BzX2Nvbm5lY3Rpb24oci0+c3RhdHVzKQotICAgICAgICAmJiByLT5jb25uZWN0aW9uICYmIChyLT5jb25uZWN0aW9uLT5rZWVwYWxpdmUgIT0gLTEpKSB7Ci0KLSAgICAgICAgKHZvaWQpIGFwX2Rpc2NhcmRfcmVxdWVzdF9ib2R5KHIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVHdvIHR5cGVzIG9mIGN1c3RvbSByZWRpcmVjdHMgLS0tIHBsYWluIHRleHQsIGFuZCBVUkxzLiBQbGFpbiB0ZXh0IGhhcwotICAgICAqIGEgbGVhZGluZyAnIicsIHNvIHRoZSBVUkwgY29kZSwgaGVyZSwgaXMgdHJpZ2dlcmVkIG9uIGl0cyBhYnNlbmNlCi0gICAgICovCi0KLSAgICBpZiAoY3VzdG9tX3Jlc3BvbnNlICYmIGN1c3RvbV9yZXNwb25zZVswXSAhPSAnIicpIHsKLQotICAgICAgICBpZiAoYXBfaXNfdXJsKGN1c3RvbV9yZXNwb25zZSkpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUaGUgVVJMIGlzbid0IGxvY2FsLCBzbyBsZXRzIGRyb3AgdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGlzCi0gICAgICAgICAgICAgKiBhcGFjaGUgY29kZSwgYW5kIGNvbnRpbnVlIHdpdGggdGhlIHVzdWFsIFJFRElSRUNUIGhhbmRsZXIuCi0gICAgICAgICAgICAgKiBCdXQgbm90ZSB0aGF0IHRoZSBjbGllbnQgd2lsbCB1bHRpbWF0ZWx5IHNlZSB0aGUgd3JvbmcKLSAgICAgICAgICAgICAqIHN0YXR1cy4uLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICByLT5zdGF0dXMgPSBSRURJUkVDVDsKLSAgICAgICAgICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJMb2NhdGlvbiIsIGN1c3RvbV9yZXNwb25zZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY3VzdG9tX3Jlc3BvbnNlWzBdID09ICcvJykgewotICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3Jfbm90ZXM7Ci0gICAgICAgICAgICByLT5ub19sb2NhbF9jb3B5ID0gMTsgICAgICAgLyogRG8gTk9UIHNlbmQgVVNFX0xPQ0FMX0NPUFkgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZXJyb3IgZG9jdW1lbnRzISAqLwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRoaXMgcmVkaXJlY3QgbmVlZHMgdG8gYmUgYSBHRVQgbm8gbWF0dGVyIHdoYXQgdGhlIG9yaWdpbmFsCi0gICAgICAgICAgICAgKiBtZXRob2Qgd2FzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBhcF90YWJsZV9zZXRuKHItPnN1YnByb2Nlc3NfZW52LCAiUkVRVUVTVF9NRVRIT0QiLCByLT5tZXRob2QpOwotCi0JICAgIC8qCi0JICAgICAqIFByb3ZpZGUgYSBzcGVjaWFsIG1ldGhvZCBmb3IgbW9kdWxlcyB0byBjb21tdW5pY2F0ZQotCSAgICAgKiBtb3JlIGluZm9ybWF0aXZlICh0aGFuIHRoZSBwbGFpbiBjYW5uZWQpIG1lc3NhZ2VzIHRvIHVzLgotCSAgICAgKiBQcm9wYWdhdGUgdGhlbSB0byBFcnJvckRvY3VtZW50cyB2aWEgdGhlIEVSUk9SX05PVEVTIHZhcmlhYmxlOgotCSAgICAgKi8KLSAgICAgICAgICAgIGlmICgoZXJyb3Jfbm90ZXMgPSBhcF90YWJsZV9nZXQoci0+bm90ZXMsICJlcnJvci1ub3RlcyIpKSAhPSBOVUxMKSB7Ci0JCWFwX3RhYmxlX3NldG4oci0+c3VicHJvY2Vzc19lbnYsICJFUlJPUl9OT1RFUyIsIGVycm9yX25vdGVzKTsKLQkgICAgfQotICAgICAgICAgICAgci0+bWV0aG9kID0gYXBfcHN0cmR1cChyLT5wb29sLCAiR0VUIik7Ci0gICAgICAgICAgICByLT5tZXRob2RfbnVtYmVyID0gTV9HRVQ7Ci0gICAgICAgICAgICBhcF9pbnRlcm5hbF9yZWRpcmVjdChjdXN0b21fcmVzcG9uc2UsIHIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIER1bWIgdXNlciBoYXMgZ2l2ZW4gdXMgYSBiYWQgdXJsIHRvIHJlZGlyZWN0IHRvIC0tLSBmYWtlIHVwCi0gICAgICAgICAgICAgKiBkeWluZyB3aXRoIGEgcmVjdXJzaXZlIHNlcnZlciBlcnJvci4uLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICByZWN1cnNpdmVfZXJyb3IgPSBTRVJWRVJfRVJST1I7Ci0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZXJyb3IgcmVkaXJlY3Rpb24gZGlyZWN0aXZlOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21fcmVzcG9uc2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIGFwX3NlbmRfZXJyb3JfcmVzcG9uc2UociwgcmVjdXJzaXZlX2Vycm9yKTsKLX0KLQotc3RhdGljIHZvaWQgZGVjbF9kaWUoaW50IHN0YXR1cywgY2hhciAqcGhhc2UsIHJlcXVlc3RfcmVjICpyKQotewotICAgIGlmIChzdGF0dXMgPT0gREVDTElORUQpIHsKLSAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0NSSVQsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICJjb25maWd1cmF0aW9uIGVycm9yOiAgY291bGRuJ3QgJXM6ICVzIiwgcGhhc2UsIHItPnVyaSk7Ci0gICAgICAgIGFwX2RpZShTRVJWRVJfRVJST1IsIHIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGFwX2RpZShzdGF0dXMsIHIpOwotfQotCi1BUElfRVhQT1JUKGludCkgYXBfc29tZV9hdXRoX3JlcXVpcmVkKHJlcXVlc3RfcmVjICpyKQotewotICAgIC8qIElzIHRoZXJlIGEgcmVxdWlyZSBsaW5lIGNvbmZpZ3VyZWQgZm9yIHRoZSB0eXBlIG9mICp0aGlzKiByZXE/ICovCi0KLSAgICBjb25zdCBhcF9hcnJheV9oZWFkZXJfdCAqcmVxc19hcnIgPSBhcF9yZXF1aXJlcyhyKTsKLSAgICByZXF1aXJlX2xpbmUgKnJlcXM7Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoIXJlcXNfYXJyKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJlcXMgPSAocmVxdWlyZV9saW5lICopIHJlcXNfYXJyLT5lbHRzOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHJlcXNfYXJyLT5uZWx0czsgKytpKQotICAgICAgICBpZiAocmVxc1tpXS5tZXRob2RfbWFzayAmICgxIDw8IHItPm1ldGhvZF9udW1iZXIpKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcHJvY2Vzc19yZXF1ZXN0X2ludGVybmFsKHJlcXVlc3RfcmVjICpyKQotewotICAgIGludCBhY2Nlc3Nfc3RhdHVzOwotCi0gICAgLyogSWdub3JlIGVtYmVkZGVkICUyRidzIGluIHBhdGggZm9yIHByb3h5IHJlcXVlc3RzICovCi0gICAgaWYgKCFyLT5wcm94eXJlcSAmJiByLT5wYXJzZWRfdXJpLnBhdGgpIHsKLQlhY2Nlc3Nfc3RhdHVzID0gYXBfdW5lc2NhcGVfdXJsKHItPnBhcnNlZF91cmkucGF0aCk7Ci0JaWYgKGFjY2Vzc19zdGF0dXMpIHsKLQkgICAgYXBfZGllKGFjY2Vzc19zdGF0dXMsIHIpOwotCSAgICByZXR1cm47Ci0JfQotICAgIH0KLQotICAgIGFwX2dldHBhcmVudHMoci0+dXJpKTsgICAgIC8qIE9LIC0tLSBzaHJpbmtpbmcgdHJhbnNmb3JtYXRpb25zLi4uICovCi0KLSAgICBpZiAoKGFjY2Vzc19zdGF0dXMgPSBsb2NhdGlvbl93YWxrKHIpKSkgewotICAgICAgICBhcF9kaWUoYWNjZXNzX3N0YXR1cywgcik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoKGFjY2Vzc19zdGF0dXMgPSBhcF9ydW5fdHJhbnNsYXRlX25hbWUocikpKSB7Ci0gICAgICAgIGRlY2xfZGllKGFjY2Vzc19zdGF0dXMsICJ0cmFuc2xhdGUiLCByKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghci0+cHJveHlyZXEpIHsKLQkvKgotCSAqIFdlIGRvbid0IHdhbnQgVFJBQ0UgdG8gcnVuIHRocm91Z2ggdGhlIG5vcm1hbCBoYW5kbGVyIHNldCwgd2UKLQkgKiBoYW5kbGUgaXQgc3BlY2lhbGx5LgotCSAqLwotCWlmIChyLT5tZXRob2RfbnVtYmVyID09IE1fVFJBQ0UpIHsKLQkgICAgaWYgKChhY2Nlc3Nfc3RhdHVzID0gYXBfc2VuZF9odHRwX3RyYWNlKHIpKSkKLQkJYXBfZGllKGFjY2Vzc19zdGF0dXMsIHIpOwotCSAgICBlbHNlCi0JCWFwX2ZpbmFsaXplX3JlcXVlc3RfcHJvdG9jb2wocik7Ci0JICAgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gICAgaWYgKHItPnByb3RvX251bSA+IEhUVFBfVkVSU0lPTigxLDApICYmIGFwX3RhYmxlX2dldChyLT5zdWJwcm9jZXNzX2VudiwgImRvd25ncmFkZS0xLjAiKSkgewotICAgICAgICByLT5wcm90b19udW0gPSBIVFRQX1ZFUlNJT04oMSwwKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE5COiBkaXJlY3Rvcnlfd2FsaygpIGNsZWFycyB0aGUgcGVyX2Rpcl9jb25maWcsIHNvIHdlIGRvbid0IGluaGVyaXQKLSAgICAgKiBmcm9tIGxvY2F0aW9uX3dhbGsoKSBhYm92ZQotICAgICAqLwotCi0gICAgaWYgKChhY2Nlc3Nfc3RhdHVzID0gZGlyZWN0b3J5X3dhbGsocikpKSB7Ci0gICAgICAgIGFwX2RpZShhY2Nlc3Nfc3RhdHVzLCByKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICgoYWNjZXNzX3N0YXR1cyA9IGZpbGVfd2FsayhyKSkpIHsKLSAgICAgICAgYXBfZGllKGFjY2Vzc19zdGF0dXMsIHIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKChhY2Nlc3Nfc3RhdHVzID0gbG9jYXRpb25fd2FsayhyKSkpIHsKLSAgICAgICAgYXBfZGllKGFjY2Vzc19zdGF0dXMsIHIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKChhY2Nlc3Nfc3RhdHVzID0gYXBfcnVuX2hlYWRlcl9wYXJzZXIocikpKSB7Ci0gICAgICAgIGFwX2RpZShhY2Nlc3Nfc3RhdHVzLCByKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN3aXRjaCAoYXBfc2F0aXNmaWVzKHIpKSB7Ci0gICAgY2FzZSBTQVRJU0ZZX0FMTDoKLSAgICBjYXNlIFNBVElTRllfTk9TUEVDOgotICAgICAgICBpZiAoKGFjY2Vzc19zdGF0dXMgPSBhcF9ydW5fYWNjZXNzX2NoZWNrZXIocikpICE9IDApIHsKLSAgICAgICAgICAgIGRlY2xfZGllKGFjY2Vzc19zdGF0dXMsICJjaGVjayBhY2Nlc3MiLCByKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXBfc29tZV9hdXRoX3JlcXVpcmVkKHIpKSB7Ci0gICAgICAgICAgICBpZiAoKChhY2Nlc3Nfc3RhdHVzID0gYXBfcnVuX2NoZWNrX3VzZXJfaWQocikpICE9IDApIHx8ICFhcF9hdXRoX3R5cGUocikpIHsKLSAgICAgICAgICAgICAgICBkZWNsX2RpZShhY2Nlc3Nfc3RhdHVzLCBhcF9hdXRoX3R5cGUocikKLQkJICAgID8gImNoZWNrIHVzZXIuICBObyB1c2VyIGZpbGU/IgotCQkgICAgOiAicGVyZm9ybSBhdXRoZW50aWNhdGlvbi4gQXV0aFR5cGUgbm90IHNldCEiLCByKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKChhY2Nlc3Nfc3RhdHVzID0gYXBfcnVuX2F1dGhfY2hlY2tlcihyKSkgIT0gMCkgfHwgIWFwX2F1dGhfdHlwZShyKSkgewotICAgICAgICAgICAgICAgIGRlY2xfZGllKGFjY2Vzc19zdGF0dXMsIGFwX2F1dGhfdHlwZShyKQotCQkgICAgPyAiY2hlY2sgYWNjZXNzLiAgTm8gZ3JvdXBzIGZpbGU/IgotCQkgICAgOiAicGVyZm9ybSBhdXRoZW50aWNhdGlvbi4gQXV0aFR5cGUgbm90IHNldCEiLCByKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTQVRJU0ZZX0FOWToKLSAgICAgICAgaWYgKCgoYWNjZXNzX3N0YXR1cyA9IGFwX3J1bl9hY2Nlc3NfY2hlY2tlcihyKSkgIT0gMCkgfHwgIWFwX2F1dGhfdHlwZShyKSkgewotICAgICAgICAgICAgaWYgKCFhcF9zb21lX2F1dGhfcmVxdWlyZWQocikpIHsKLSAgICAgICAgICAgICAgICBkZWNsX2RpZShhY2Nlc3Nfc3RhdHVzLCBhcF9hdXRoX3R5cGUocikKLQkJICAgID8gImNoZWNrIGFjY2VzcyIKLQkJICAgIDogInBlcmZvcm0gYXV0aGVudGljYXRpb24uIEF1dGhUeXBlIG5vdCBzZXQhIiwgcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCgoYWNjZXNzX3N0YXR1cyA9IGFwX3J1bl9jaGVja191c2VyX2lkKHIpKSAhPSAwKSB8fCAhYXBfYXV0aF90eXBlKHIpKSB7Ci0gICAgICAgICAgICAgICAgZGVjbF9kaWUoYWNjZXNzX3N0YXR1cywgYXBfYXV0aF90eXBlKHIpCi0JCSAgICA/ICJjaGVjayB1c2VyLiAgTm8gdXNlciBmaWxlPyIKLQkJICAgIDogInBlcmZvcm0gYXV0aGVudGljYXRpb24uIEF1dGhUeXBlIG5vdCBzZXQhIiwgcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCgoYWNjZXNzX3N0YXR1cyA9IGFwX3J1bl9hdXRoX2NoZWNrZXIocikpICE9IDApIHx8ICFhcF9hdXRoX3R5cGUocikpIHsKLSAgICAgICAgICAgICAgICBkZWNsX2RpZShhY2Nlc3Nfc3RhdHVzLCBhcF9hdXRoX3R5cGUocikKLQkJICAgID8gImNoZWNrIGFjY2Vzcy4gIE5vIGdyb3VwcyBmaWxlPyIKLQkJICAgIDogInBlcmZvcm0gYXV0aGVudGljYXRpb24uIEF1dGhUeXBlIG5vdCBzZXQhIiwgcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmICghIChyLT5wcm94eXJlcSAKLQkgICAmJiByLT5wYXJzZWRfdXJpLnNjaGVtZSAhPSBOVUxMCi0JICAgJiYgc3RyY21wKHItPnBhcnNlZF91cmkuc2NoZW1lLCAiaHR0cCIpID09IDApICkgewotCWlmICgoYWNjZXNzX3N0YXR1cyA9IGFwX3J1bl90eXBlX2NoZWNrZXIocikpICE9IDApIHsKLQkgICAgZGVjbF9kaWUoYWNjZXNzX3N0YXR1cywgImZpbmQgdHlwZXMiLCByKTsKLQkgICAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgICBpZiAoKGFjY2Vzc19zdGF0dXMgPSBhcF9ydW5fZml4dXBzKHIpKSAhPSAwKSB7Ci0gICAgICAgIGFwX2RpZShhY2Nlc3Nfc3RhdHVzLCByKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICgoYWNjZXNzX3N0YXR1cyA9IGFwX2ludm9rZV9oYW5kbGVyKHIpKSAhPSAwKSB7Ci0gICAgICAgIGFwX2RpZShhY2Nlc3Nfc3RhdHVzLCByKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIFRha2UgY2FyZSBvZiBsaXR0bGUgdGhpbmdzIHRoYXQgbmVlZCB0byBoYXBwZW4gd2hlbiB3ZSdyZSBkb25lICovCi0gICAgYXBfZmluYWxpemVfcmVxdWVzdF9wcm90b2NvbChyKTsKLX0KLQotdm9pZCBhcF9wcm9jZXNzX3JlcXVlc3QocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgcHJvY2Vzc19yZXF1ZXN0X2ludGVybmFsKHIpOwotCi0gICAgLyoKLSAgICAgKiBXZSB3YW50IHRvIGZsdXNoIHRoZSBsYXN0IHBhY2tldCBpZiB0aGlzIGlzbid0IGEgcGlwZWxpbmluZyBjb25uZWN0aW9uCi0gICAgICogKmJlZm9yZSogd2Ugc3RhcnQgaW50byBsb2dnaW5nLiAgU3VwcG9zZSB0aGF0IHRoZSBsb2dnaW5nIGNhdXNlcyBhIEROUwotICAgICAqIGxvb2t1cCB0byBvY2N1ciwgd2hpY2ggbWF5IGhhdmUgYSBoaWdoIGxhdGVuY3kuICBJZiB3ZSBob2xkIG9mZiBvbgotICAgICAqIHRoaXMgcGFja2V0LCB0aGVuIGl0J2xsIGFwcGVhciBsaWtlIHRoZSBsaW5rIGlzIHN0YWxsZWQgd2hlbiByZWFsbHkKLSAgICAgKiBpdCdzIHRoZSBhcHBsaWNhdGlvbiB0aGF0J3Mgc3RhbGxlZC4KLSAgICAgKi8KLSAgICAvKiBUT0RPOiByZWltcGxlbWVudCBhcF9iaGFsZmR1cGxleC4uLiBub3Qgc3VyZSBob3cgeWV0ICovCi0gICAgLyogLy9hcF9iaGFsZmR1cGxleChyLT5jb25uZWN0aW9uLT5jbGllbnQpOyAqLwotICAgIGFwX3J1bl9sb2dfdHJhbnNhY3Rpb24ocik7Ci19Ci0KLXN0YXRpYyBhcF90YWJsZV90ICpyZW5hbWVfb3JpZ2luYWxfZW52KGFwX2NvbnRleHRfdCAqcCwgYXBfdGFibGVfdCAqdCkKLXsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqZW52X2FyciA9IGFwX3RhYmxlX2VsdHModCk7Ci0gICAgYXBfdGFibGVfZW50cnlfdCAqZWx0cyA9IChhcF90YWJsZV9lbnRyeV90ICopIGVudl9hcnItPmVsdHM7Ci0gICAgYXBfdGFibGVfdCAqbmV3ID0gYXBfbWFrZV90YWJsZShwLCBlbnZfYXJyLT5uYWxsb2MpOwotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGVudl9hcnItPm5lbHRzOyArK2kpIHsKLSAgICAgICAgaWYgKCFlbHRzW2ldLmtleSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBhcF90YWJsZV9zZXRuKG5ldywgYXBfcHN0cmNhdChwLCAiUkVESVJFQ1RfIiwgZWx0c1tpXS5rZXksIE5VTEwpLAotICAgICAgICAgICAgICAgICAgZWx0c1tpXS52YWwpOwotICAgIH0KLQotICAgIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyByZXF1ZXN0X3JlYyAqaW50ZXJuYWxfaW50ZXJuYWxfcmVkaXJlY3QoY29uc3QgY2hhciAqbmV3X3VyaSwgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IGFjY2Vzc19zdGF0dXM7Ci0gICAgcmVxdWVzdF9yZWMgKm5ldyA9IChyZXF1ZXN0X3JlYyAqKSBhcF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihyZXF1ZXN0X3JlYykpOwotCi0gICAgbmV3LT5jb25uZWN0aW9uID0gci0+Y29ubmVjdGlvbjsKLSAgICBuZXctPnNlcnZlciAgICAgPSByLT5zZXJ2ZXI7Ci0gICAgbmV3LT5wb29sICAgICAgID0gci0+cG9vbDsKLQotICAgIC8qCi0gICAgICogQSB3aG9sZSBsb3Qgb2YgdGhpcyByZWFsbHkgb3VnaHQgdG8gYmUgc2hhcmVkIHdpdGggaHR0cF9wcm90b2NvbC5jLi4uCi0gICAgICogYW5vdGhlciBtaXNzaW5nIGNsZWFudXAuICBJdCdzIHBhcnRpY3VsYXJseSBpbmFwcHJvcHJpYXRlIHRvIGJlCi0gICAgICogc2V0dGluZyBoZWFkZXJfb25seSwgZXRjLiwgaGVyZS4KLSAgICAgKi8KLQotICAgIG5ldy0+bWV0aG9kICAgICAgICAgID0gci0+bWV0aG9kOwotICAgIG5ldy0+bWV0aG9kX251bWJlciAgID0gci0+bWV0aG9kX251bWJlcjsKLSAgICBhcF9wYXJzZV91cmkobmV3LCBuZXdfdXJpKTsKLSAgICBuZXctPnJlcXVlc3RfY29uZmlnID0gYXBfY3JlYXRlX3JlcXVlc3RfY29uZmlnKHItPnBvb2wpOwotICAgIG5ldy0+cGVyX2Rpcl9jb25maWcgPSByLT5zZXJ2ZXItPmxvb2t1cF9kZWZhdWx0czsKLQotICAgIG5ldy0+cHJldiA9IHI7Ci0gICAgci0+bmV4dCAgID0gbmV3OwotCi0gICAgLyogSW5oZXJpdCB0aGUgcmVzdCBvZiB0aGUgcHJvdG9jb2wgaW5mby4uLiAqLwotCi0gICAgbmV3LT50aGVfcmVxdWVzdCA9IHItPnRoZV9yZXF1ZXN0OwotCi0gICAgbmV3LT5hbGxvd2VkICAgICAgICAgPSByLT5hbGxvd2VkOwotCi0gICAgbmV3LT5zdGF0dXMgICAgICAgICAgPSByLT5zdGF0dXM7Ci0gICAgbmV3LT5hc3NiYWNrd2FyZHMgICAgPSByLT5hc3NiYWNrd2FyZHM7Ci0gICAgbmV3LT5oZWFkZXJfb25seSAgICAgPSByLT5oZWFkZXJfb25seTsKLSAgICBuZXctPnByb3RvY29sICAgICAgICA9IHItPnByb3RvY29sOwotICAgIG5ldy0+cHJvdG9fbnVtICAgICAgID0gci0+cHJvdG9fbnVtOwotICAgIG5ldy0+aG9zdG5hbWUgICAgICAgID0gci0+aG9zdG5hbWU7Ci0gICAgbmV3LT5yZXF1ZXN0X3RpbWUgICAgPSByLT5yZXF1ZXN0X3RpbWU7Ci0gICAgbmV3LT5tYWluICAgICAgICAgICAgPSByLT5tYWluOwotCi0gICAgbmV3LT5oZWFkZXJzX2luICAgICAgPSByLT5oZWFkZXJzX2luOwotICAgIG5ldy0+aGVhZGVyc19vdXQgICAgID0gYXBfbWFrZV90YWJsZShyLT5wb29sLCAxMik7Ci0gICAgbmV3LT5lcnJfaGVhZGVyc19vdXQgPSByLT5lcnJfaGVhZGVyc19vdXQ7Ci0gICAgbmV3LT5zdWJwcm9jZXNzX2VudiAgPSByZW5hbWVfb3JpZ2luYWxfZW52KHItPnBvb2wsIHItPnN1YnByb2Nlc3NfZW52KTsKLSAgICBuZXctPm5vdGVzICAgICAgICAgICA9IGFwX21ha2VfdGFibGUoci0+cG9vbCwgNSk7Ci0KLSAgICBuZXctPmh0YWNjZXNzICAgICAgICA9IHItPmh0YWNjZXNzOwotICAgIG5ldy0+bm9fY2FjaGUgICAgICAgID0gci0+bm9fY2FjaGU7Ci0gICAgbmV3LT5leHBlY3RpbmdfMTAwCSA9IHItPmV4cGVjdGluZ18xMDA7Ci0gICAgbmV3LT5ub19sb2NhbF9jb3B5ICAgPSByLT5ub19sb2NhbF9jb3B5OwotICAgIG5ldy0+cmVhZF9sZW5ndGggICAgID0gci0+cmVhZF9sZW5ndGg7ICAgICAvKiBXZSBjYW4gb25seSByZWFkIGl0IG9uY2UgKi8KLSAgICBuZXctPnZsaXN0X3ZhbGlkYXRvciA9IHItPnZsaXN0X3ZhbGlkYXRvcjsKLQotICAgIGFwX3RhYmxlX3NldG4obmV3LT5zdWJwcm9jZXNzX2VudiwgIlJFRElSRUNUX1NUQVRVUyIsCi0JYXBfcHNwcmludGYoci0+cG9vbCwgIiVkIiwgci0+c3RhdHVzKSk7Ci0KLSAgICAvKgotICAgICAqIFhYWDogaG1tLiAgVGhpcyBpcyBiZWNhdXNlIG1vZF9zZXRlbnZpZiBhbmQgbW9kX3VuaXF1ZV9pZCByZWFsbHkgbmVlZAotICAgICAqIHRvIGRvIHRoZWlyIHRoaW5nIG9uIGludGVybmFsIHJlZGlyZWN0cyBhcyB3ZWxsLiAgUGVyaGFwcyB0aGlzIGlzIGEKLSAgICAgKiBtaXNuYW1lZCBmdW5jdGlvbi4KLSAgICAgKi8KLSAgICBpZiAoKGFjY2Vzc19zdGF0dXMgPSBhcF9ydW5fcG9zdF9yZWFkX3JlcXVlc3QobmV3KSkpIHsKLSAgICAgICAgYXBfZGllKGFjY2Vzc19zdGF0dXMsIG5ldyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBuZXc7Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfaW50ZXJuYWxfcmVkaXJlY3QoY29uc3QgY2hhciAqbmV3X3VyaSwgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgcmVxdWVzdF9yZWMgKm5ldyA9IGludGVybmFsX2ludGVybmFsX3JlZGlyZWN0KG5ld191cmksIHIpOwotICAgIHByb2Nlc3NfcmVxdWVzdF9pbnRlcm5hbChuZXcpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIGZvciB0aGluZ3MgbGlrZSBhY3Rpb25zIG9yIENHSSBzY3JpcHRzLCB3aGVuCi0gKiB1c2luZyBBZGRIYW5kbGVyLCBhbmQgeW91IHdhbnQgdG8gcHJlc2VydmUgdGhlIGNvbnRlbnQgdHlwZSBhY3Jvc3MKLSAqIGFuIGludGVybmFsIHJlZGlyZWN0LgotICovCi1BUElfRVhQT1JUKHZvaWQpIGFwX2ludGVybmFsX3JlZGlyZWN0X2hhbmRsZXIoY29uc3QgY2hhciAqbmV3X3VyaSwgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgcmVxdWVzdF9yZWMgKm5ldyA9IGludGVybmFsX2ludGVybmFsX3JlZGlyZWN0KG5ld191cmksIHIpOwotICAgIGlmIChyLT5oYW5kbGVyKQotICAgICAgICBuZXctPmNvbnRlbnRfdHlwZSA9IHItPmNvbnRlbnRfdHlwZTsKLSAgICBwcm9jZXNzX3JlcXVlc3RfaW50ZXJuYWwobmV3KTsKLX0KLQotLyoKLSAqIElzIGl0IHRoZSBpbml0aWFsIG1haW4gcmVxdWVzdCwgd2hpY2ggd2Ugb25seSBnZXQgKm9uY2UqIHBlciBIVFRQIHJlcXVlc3Q/Ci0gKi8KLUFQSV9FWFBPUlQoaW50KSBhcF9pc19pbml0aWFsX3JlcShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICByZXR1cm4KLSAgICAgICAgKHItPm1haW4gPT0gTlVMTCkgICAgICAgLyogb3RoZXJ3aXNlLCB0aGlzIGlzIGEgc3ViLXJlcXVlc3QgKi8KLSAgICAgICAgJiYKLSAgICAgICAgKHItPnByZXYgPT0gTlVMTCk7ICAgICAgLyogb3RoZXJ3aXNlLCB0aGlzIGlzIGFuIGludGVybmFsIHJlZGlyZWN0ICovCi19Ci0KLS8qCi0gKiBGdW5jdGlvbiB0byBzZXQgdGhlIHItPm10aW1lIGZpZWxkIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgaWYgaXQncyBsYXRlcgotICogdGhhbiB3aGF0J3MgYWxyZWFkeSB0aGVyZS4KLSAqLwotQVBJX0VYUE9SVCh2b2lkKSBhcF91cGRhdGVfbXRpbWUocmVxdWVzdF9yZWMgKnIsIGFwX3RpbWVfdCBkZXBlbmRlbmN5X210aW1lKQotewotICAgIGlmIChyLT5tdGltZSA8IGRlcGVuZGVuY3lfbXRpbWUpIHsKLQlyLT5tdGltZSA9IGRlcGVuZGVuY3lfbXRpbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9odHRwL21vZF9taW1lLmMgYi9tb2R1bGVzL2h0dHAvbW9kX21pbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0NzgxMS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL2h0dHAvbW9kX21pbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDQwMiArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBodHRwX21pbWUuYzogU2VuZHMvZ2V0cyBNSU1FIGhlYWRlcnMgZm9yIHJlcXVlc3RzCi0gKiAKLSAqIFJvYiBNY0Nvb2wKLSAqIAotICovCi0KLSNkZWZpbmUgTUlNRV9QUklWQVRFCi0KLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgaGFuZGxlcnNfaW5mbyB7Ci0gICAgY2hhciAqbmFtZTsKLX0gaGFuZGxlcnNfaW5mbzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGFwX3RhYmxlX3QgKmZvcmNlZF90eXBlczsgICAgICAgIC8qIEFkZGl0aW9uYWwgQWRkVHlwZWQgc3R1ZmYgKi8KLSAgICBhcF90YWJsZV90ICplbmNvZGluZ190eXBlczsgICAgICAvKiBBZGRlZCB3aXRoIEFkZEVuY29kaW5nLi4uICovCi0gICAgYXBfdGFibGVfdCAqbGFuZ3VhZ2VfdHlwZXM7ICAgICAgLyogQWRkZWQgd2l0aCBBZGRMYW5ndWFnZS4uLiAqLwotICAgIGFwX3RhYmxlX3QgKmhhbmRsZXJzOyAgICAgICAgICAgIC8qIEFkZGVkIHdpdGggQWRkSGFuZGxlci4uLiAgKi8KLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqaGFuZGxlcnNfcmVtb3ZlOyAgICAgLyogTGlzdCBvZiBoYW5kbGVycyB0byByZW1vdmUgKi8KLQotICAgIGNoYXIgKnR5cGU7ICAgICAgICAgICAgICAgICAvKiBUeXBlIGZvcmNlZCB3aXRoIEZvcmNlVHlwZSAgKi8KLSAgICBjaGFyICpoYW5kbGVyOyAgICAgICAgICAgICAgLyogSGFuZGxlciBmb3JjZWQgd2l0aCBTZXRIYW5kbGVyICovCi0gICAgY2hhciAqZGVmYXVsdF9sYW5ndWFnZTsgICAgIC8qIExhbmd1YWdlIGlmIG5vIEFkZExhbmd1YWdlIGV4dCBmb3VuZCAqLwotfSBtaW1lX2Rpcl9jb25maWc7Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBtaW1lX21vZHVsZTsKLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9taW1lX2Rpcl9jb25maWcoYXBfY29udGV4dF90ICpwLCBjaGFyICpkdW1teSkKLXsKLSAgICBtaW1lX2Rpcl9jb25maWcgKm5ldyA9Ci0gICAgKG1pbWVfZGlyX2NvbmZpZyAqKSBhcF9wYWxsb2MocCwgc2l6ZW9mKG1pbWVfZGlyX2NvbmZpZykpOwotCi0gICAgbmV3LT5mb3JjZWRfdHlwZXMgPSBhcF9tYWtlX3RhYmxlKHAsIDQpOwotICAgIG5ldy0+ZW5jb2RpbmdfdHlwZXMgPSBhcF9tYWtlX3RhYmxlKHAsIDQpOwotICAgIG5ldy0+bGFuZ3VhZ2VfdHlwZXMgPSBhcF9tYWtlX3RhYmxlKHAsIDQpOwotICAgIG5ldy0+aGFuZGxlcnMgPSBhcF9tYWtlX3RhYmxlKHAsIDQpOwotICAgIG5ldy0+aGFuZGxlcnNfcmVtb3ZlID0gYXBfbWFrZV9hcnJheShwLCA0LCBzaXplb2YoaGFuZGxlcnNfaW5mbykpOwotCi0gICAgbmV3LT50eXBlID0gTlVMTDsKLSAgICBuZXctPmhhbmRsZXIgPSBOVUxMOwotICAgIG5ldy0+ZGVmYXVsdF9sYW5ndWFnZSA9IE5VTEw7Ci0KLSAgICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgdm9pZCAqbWVyZ2VfbWltZV9kaXJfY29uZmlncyhhcF9jb250ZXh0X3QgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICphZGR2KQotewotICAgIG1pbWVfZGlyX2NvbmZpZyAqYmFzZSA9IChtaW1lX2Rpcl9jb25maWcgKikgYmFzZXY7Ci0gICAgbWltZV9kaXJfY29uZmlnICphZGQgPSAobWltZV9kaXJfY29uZmlnICopIGFkZHY7Ci0gICAgbWltZV9kaXJfY29uZmlnICpuZXcgPQotICAgICAgICAobWltZV9kaXJfY29uZmlnICopIGFwX3BhbGxvYyhwLCBzaXplb2YobWltZV9kaXJfY29uZmlnKSk7Ci0gICAgaW50IGk7Ci0gICAgaGFuZGxlcnNfaW5mbyAqaGFuZDsKLQotICAgIGhhbmQgPSAoaGFuZGxlcnNfaW5mbyAqKSBhZGQtPmhhbmRsZXJzX3JlbW92ZS0+ZWx0czsKLSAgICBmb3IgKGkgPSAwOyBpIDwgYWRkLT5oYW5kbGVyc19yZW1vdmUtPm5lbHRzOyBpKyspIHsKLSAgICAgICAgYXBfdGFibGVfdW5zZXQoYmFzZS0+aGFuZGxlcnMsIGhhbmRbaV0ubmFtZSk7Ci0gICAgfQotCi0gICAgbmV3LT5mb3JjZWRfdHlwZXMgPSBhcF9vdmVybGF5X3RhYmxlcyhwLCBhZGQtPmZvcmNlZF90eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmZvcmNlZF90eXBlcyk7Ci0gICAgbmV3LT5lbmNvZGluZ190eXBlcyA9IGFwX292ZXJsYXlfdGFibGVzKHAsIGFkZC0+ZW5jb2RpbmdfdHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmVuY29kaW5nX3R5cGVzKTsKLSAgICBuZXctPmxhbmd1YWdlX3R5cGVzID0gYXBfb3ZlcmxheV90YWJsZXMocCwgYWRkLT5sYW5ndWFnZV90eXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+bGFuZ3VhZ2VfdHlwZXMpOwotICAgIG5ldy0+aGFuZGxlcnMgPSBhcF9vdmVybGF5X3RhYmxlcyhwLCBhZGQtPmhhbmRsZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5oYW5kbGVycyk7Ci0KLSAgICBuZXctPnR5cGUgPSBhZGQtPnR5cGUgPyBhZGQtPnR5cGUgOiBiYXNlLT50eXBlOwotICAgIG5ldy0+aGFuZGxlciA9IGFkZC0+aGFuZGxlciA/IGFkZC0+aGFuZGxlciA6IGJhc2UtPmhhbmRsZXI7Ci0gICAgbmV3LT5kZWZhdWx0X2xhbmd1YWdlID0gYWRkLT5kZWZhdWx0X2xhbmd1YWdlID8KLSAgICAgICAgYWRkLT5kZWZhdWx0X2xhbmd1YWdlIDogYmFzZS0+ZGVmYXVsdF9sYW5ndWFnZTsKLQotICAgIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICphZGRfdHlwZShjbWRfcGFybXMgKmNtZCwgbWltZV9kaXJfY29uZmlnICogbSwgY2hhciAqY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZXh0KQotewotICAgIGlmICgqZXh0ID09ICcuJykKLSAgICAgICAgKytleHQ7Ci0gICAgYXBfc3RyX3RvbG93ZXIoY3QpOwotICAgIGFwX3RhYmxlX3NldG4obS0+Zm9yY2VkX3R5cGVzLCBleHQsIGN0KTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmFkZF9lbmNvZGluZyhjbWRfcGFybXMgKmNtZCwgbWltZV9kaXJfY29uZmlnICogbSwgY2hhciAqZW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpleHQpCi17Ci0gICAgaWYgKCpleHQgPT0gJy4nKQotICAgICAgICArK2V4dDsKLSAgICBhcF9zdHJfdG9sb3dlcihlbmMpOwotICAgIGFwX3RhYmxlX3NldG4obS0+ZW5jb2RpbmdfdHlwZXMsIGV4dCwgZW5jKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmFkZF9sYW5ndWFnZShjbWRfcGFybXMgKmNtZCwgbWltZV9kaXJfY29uZmlnICogbSwgY2hhciAqbGFuZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZXh0KQotewotICAgIGlmICgqZXh0ID09ICcuJykKLSAgICAgICAgKytleHQ7Ci0gICAgYXBfc3RyX3RvbG93ZXIobGFuZyk7Ci0gICAgYXBfdGFibGVfc2V0bihtLT5sYW5ndWFnZV90eXBlcywgZXh0LCBsYW5nKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmFkZF9oYW5kbGVyKGNtZF9wYXJtcyAqY21kLCBtaW1lX2Rpcl9jb25maWcgKiBtLCBjaGFyICpoZGxyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmV4dCkKLXsKLSAgICBpZiAoKmV4dCA9PSAnLicpCi0gICAgICAgICsrZXh0OwotICAgIGFwX3N0cl90b2xvd2VyKGhkbHIpOwotICAgIGFwX3RhYmxlX3NldG4obS0+aGFuZGxlcnMsIGV4dCwgaGRscik7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBOb3RlIGhhbmRsZXIgbmFtZXMgdGhhdCBzaG91bGQgYmUgdW4tYWRkZWQgZm9yIHRoaXMgbG9jYXRpb24uICBUaGlzCi0gKiB3aWxsIGtlZXAgdGhlIGFzc29jaWF0aW9uIGZyb20gYmVpbmcgaW5oZXJpdGVkLCBhcyB3ZWxsLCBidXQgbm90Ci0gKiBmcm9tIGJlaW5nIHJlLWFkZGVkIGF0IGEgc3Vib3JkaW5hdGUgbGV2ZWwuCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpyZW1vdmVfaGFuZGxlcihjbWRfcGFybXMgKmNtZCwgdm9pZCAqbSwgY2hhciAqZXh0KQotewotICAgIG1pbWVfZGlyX2NvbmZpZyAqbWNmZyA9IChtaW1lX2Rpcl9jb25maWcgKikgbTsKLSAgICBoYW5kbGVyc19pbmZvICpoYW5kOwotCi0gICAgaWYgKCpleHQgPT0gJy4nKSB7Ci0gICAgICAgICsrZXh0OwotICAgIH0KLSAgICBoYW5kID0gKGhhbmRsZXJzX2luZm8gKikgYXBfcHVzaF9hcnJheShtY2ZnLT5oYW5kbGVyc19yZW1vdmUpOwotICAgIGhhbmQtPm5hbWUgPSBhcF9wc3RyZHVwKGNtZC0+cG9vbCwgZXh0KTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogVGhlIHNvbGUgYml0IG9mIHNlcnZlciBjb25maWd1cmF0aW9uIHRoYXQgdGhlIE1JTUUgbW9kdWxlIGhhcyBpcwotICogdGhlIG5hbWUgb2YgaXRzIGNvbmZpZyBmaWxlLCBzby4uLgotICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfdHlwZXNfY29uZmlnKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGFwX3NldF9tb2R1bGVfY29uZmlnKGNtZC0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAmbWltZV9tb2R1bGUsIGFyZyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBtaW1lX2NtZHNbXSA9Ci17Ci0gICAgeyJBZGRUeXBlIiwgYWRkX3R5cGUsIE5VTEwsIE9SX0ZJTEVJTkZPLCBJVEVSQVRFMiwKLSAgICAgImEgbWltZSB0eXBlIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGZpbGUgZXh0ZW5zaW9ucyJ9LAotICAgIHsiQWRkRW5jb2RpbmciLCBhZGRfZW5jb2RpbmcsIE5VTEwsIE9SX0ZJTEVJTkZPLCBJVEVSQVRFMiwKLSAgICAgImFuIGVuY29kaW5nIChlLmcuLCBnemlwKSwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZmlsZSBleHRlbnNpb25zIn0sCi0gICAgeyJBZGRMYW5ndWFnZSIsIGFkZF9sYW5ndWFnZSwgTlVMTCwgT1JfRklMRUlORk8sIElURVJBVEUyLAotICAgICAiYSBsYW5ndWFnZSAoZS5nLiwgZnIpLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBmaWxlIGV4dGVuc2lvbnMifSwKLSAgICB7IkFkZEhhbmRsZXIiLCBhZGRfaGFuZGxlciwgTlVMTCwgT1JfRklMRUlORk8sIElURVJBVEUyLAotICAgICAiYSBoYW5kbGVyIG5hbWUgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZmlsZSBleHRlbnNpb25zIn0sCi0gICAgeyJGb3JjZVR5cGUiLCBhcF9zZXRfc3RyaW5nX3Nsb3RfbG93ZXIsIAotICAgICAodm9pZCAqKVh0T2Zmc2V0T2YobWltZV9kaXJfY29uZmlnLCB0eXBlKSwgT1JfRklMRUlORk8sIFRBS0UxLCAKLSAgICAgImEgbWVkaWEgdHlwZSJ9LAotICAgIHsiUmVtb3ZlSGFuZGxlciIsIHJlbW92ZV9oYW5kbGVyLCBOVUxMLCBPUl9GSUxFSU5GTywgSVRFUkFURSwKLSAgICAgIm9uZSBvciBtb3JlIGZpbGUgZXh0ZW5zaW9ucyJ9LAotICAgIHsiU2V0SGFuZGxlciIsIGFwX3NldF9zdHJpbmdfc2xvdF9sb3dlciwgCi0gICAgICh2b2lkICopWHRPZmZzZXRPZihtaW1lX2Rpcl9jb25maWcsIGhhbmRsZXIpLCBPUl9GSUxFSU5GTywgVEFLRTEsIAotICAgICAiYSBoYW5kbGVyIG5hbWUifSwKLSAgICB7IlR5cGVzQ29uZmlnIiwgc2V0X3R5cGVzX2NvbmZpZywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAgInRoZSBNSU1FIHR5cGVzIGNvbmZpZyBmaWxlIn0sCi0gICAgeyJEZWZhdWx0TGFuZ3VhZ2UiLCBhcF9zZXRfc3RyaW5nX3Nsb3QsCi0gICAgICh2b2lkKilYdE9mZnNldE9mKG1pbWVfZGlyX2NvbmZpZywgZGVmYXVsdF9sYW5ndWFnZSksIE9SX0ZJTEVJTkZPLCBUQUtFMSwKLSAgICAgImxhbmd1YWdlIHRvIHVzZSBmb3IgZG9jdW1lbnRzIHdpdGggbm8gb3RoZXIgbGFuZ3VhZ2UgZmlsZSBleHRlbnNpb24iIH0sCi0gICAge05VTEx9Ci19OwotCi0vKiBIYXNoIGFwX3RhYmxlX3QgIC0tLSBvbmx5IG9uZSBvZiB0aGVzZSBwZXIgZGFlbW9uOyB2aXJ0dWFsIGhvc3RzIGNhbgotICogZ2V0IHByaXZhdGUgdmVyc2lvbnMgdGhyb3VnaCBBZGRUeXBlLi4uCi0gKi8KLQotI2RlZmluZSBNSU1FX0hBU0hTSVpFICgzMikKLSNkZWZpbmUgaGFzaChpKSAoYXBfdG9sb3dlcihpKSAlIE1JTUVfSEFTSFNJWkUpCi0KLXN0YXRpYyBhcF90YWJsZV90ICpoYXNoX2J1Y2tldHNbTUlNRV9IQVNIU0laRV07Ci0KLXN0YXRpYyB2b2lkIG1pbWVfcG9zdF9jb25maWcoYXBfY29udGV4dF90ICpwLCBhcF9jb250ZXh0X3QgKnBsb2csIGFwX2NvbnRleHRfdCAqcHRlbXAsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgY29uZmlnZmlsZV90ICpmOwotICAgIGNoYXIgbFtNQVhfU1RSSU5HX0xFTl07Ci0gICAgaW50IHg7Ci0gICAgY29uc3QgY2hhciAqdHlwZXNfY29uZm5hbWUgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAmbWltZV9tb2R1bGUpOwotICAgIGFwX3N0YXR1c190IHN0YXR1czsKLQotICAgIGlmICghdHlwZXNfY29uZm5hbWUpCi0gICAgICAgIHR5cGVzX2NvbmZuYW1lID0gQVBfVFlQRVNfQ09ORklHX0ZJTEU7Ci0KLSAgICB0eXBlc19jb25mbmFtZSA9IGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHAsIHR5cGVzX2NvbmZuYW1lKTsKLQotICAgIGlmICgoc3RhdHVzID0gYXBfcGNmZ19vcGVuZmlsZSgmZiwgcCwgdHlwZXNfY29uZm5hbWUpKSAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzdGF0dXMsIHMsCi0JCSAgICAgImNvdWxkIG5vdCBvcGVuIG1pbWUgdHlwZXMgbG9nIGZpbGUgJXMuIiwgdHlwZXNfY29uZm5hbWUpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGZvciAoeCA9IDA7IHggPCBNSU1FX0hBU0hTSVpFOyB4KyspCi0gICAgICAgIGhhc2hfYnVja2V0c1t4XSA9IGFwX21ha2VfdGFibGUocCwgMTApOwotCi0gICAgd2hpbGUgKCEoYXBfY2ZnX2dldGxpbmUobCwgTUFYX1NUUklOR19MRU4sIGYpKSkgewotICAgICAgICBjb25zdCBjaGFyICpsbCA9IGwsICpjdDsKLQotICAgICAgICBpZiAobFswXSA9PSAnIycpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgY3QgPSBhcF9nZXR3b3JkX2NvbmYocCwgJmxsKTsKLQotICAgICAgICB3aGlsZSAobGxbMF0pIHsKLSAgICAgICAgICAgIGNoYXIgKmV4dCA9IGFwX2dldHdvcmRfY29uZihwLCAmbGwpOwotICAgICAgICAgICAgYXBfc3RyX3RvbG93ZXIoZXh0KTsgICAvKiA/Pz8gKi8KLSAgICAgICAgICAgIGFwX3RhYmxlX3NldG4oaGFzaF9idWNrZXRzW2hhc2goZXh0WzBdKV0sIGV4dCwgY3QpOwotICAgICAgICB9Ci0gICAgfQotICAgIGFwX2NmZ19jbG9zZWZpbGUoZik7Ci19Ci0KLXN0YXRpYyBpbnQgZmluZF9jdChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb25zdCBjaGFyICpmbiA9IHN0cnJjaHIoci0+ZmlsZW5hbWUsICcvJyk7Ci0gICAgbWltZV9kaXJfY29uZmlnICpjb25mID0KLSAgICAobWltZV9kaXJfY29uZmlnICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAmbWltZV9tb2R1bGUpOwotICAgIGNoYXIgKmV4dDsKLSAgICBjb25zdCBjaGFyICpvcmlnaGFuZGxlciA9IHItPmhhbmRsZXI7Ci0gICAgY29uc3QgY2hhciAqdHlwZTsKLQotICAgIGlmIChyLT5maW5mby5maWxldHlwZSA9PSBBUFJfRElSKSB7Ci0gICAgICAgIHItPmNvbnRlbnRfdHlwZSA9IERJUl9NQUdJQ19UWVBFOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgLyogVE0gLS0gRklYTUUKLSAgICAgKiBpZiByLT5maWxlbmFtZSBkb2VzIG5vdCBjb250YWluIGEgJy8nLCB0aGUgZm9sbG93aW5nIHBhc3NlcyBhIG51bGwKLSAgICAgKiBwb2ludGVyIHRvIGdldHdvcmQsIGNhdXNpbmcgYSBTRUdWIC4uCi0gICAgICovCi0KLSAgICBpZiAoZm4gPT0gTlVMTCkKLSAgICAgICAgZm4gPSByLT5maWxlbmFtZTsKLQotICAgIC8qIFBhcnNlIGZpbGVuYW1lIGV4dGVuc2lvbnMsIHdoaWNoIGNhbiBiZSBpbiBhbnkgb3JkZXIgKi8KLSAgICB3aGlsZSAoKGV4dCA9IGFwX2dldHdvcmQoci0+cG9vbCwgJmZuLCAnLicpKSAmJiAqZXh0KSB7Ci0gICAgICAgIGludCBmb3VuZCA9IDA7Ci0KLSAgICAgICAgLyogQ2hlY2sgZm9yIENvbnRlbnQtVHlwZSAqLwotICAgICAgICBpZiAoKHR5cGUgPSBhcF90YWJsZV9nZXQoY29uZi0+Zm9yY2VkX3R5cGVzLCBleHQpKQotICAgICAgICAgICAgfHwgKHR5cGUgPSBhcF90YWJsZV9nZXQoaGFzaF9idWNrZXRzW2hhc2goKmV4dCldLCBleHQpKSkgewotICAgICAgICAgICAgci0+Y29udGVudF90eXBlID0gdHlwZTsKLSAgICAgICAgICAgIGZvdW5kID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENoZWNrIGZvciBDb250ZW50LUxhbmd1YWdlICovCi0gICAgICAgIGlmICgodHlwZSA9IGFwX3RhYmxlX2dldChjb25mLT5sYW5ndWFnZV90eXBlcywgZXh0KSkpIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKipuZXc7Ci0KLSAgICAgICAgICAgIHItPmNvbnRlbnRfbGFuZ3VhZ2UgPSB0eXBlOyAgICAgICAgIC8qIGJhY2sgY29tcGF0LiBvbmx5ICovCi0gICAgICAgICAgICBpZiAoIXItPmNvbnRlbnRfbGFuZ3VhZ2VzKQotICAgICAgICAgICAgICAgIHItPmNvbnRlbnRfbGFuZ3VhZ2VzID0gYXBfbWFrZV9hcnJheShyLT5wb29sLCAyLCBzaXplb2YoY2hhciAqKSk7Ci0gICAgICAgICAgICBuZXcgPSAoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShyLT5jb250ZW50X2xhbmd1YWdlcyk7Ci0gICAgICAgICAgICAqbmV3ID0gdHlwZTsKLSAgICAgICAgICAgIGZvdW5kID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENoZWNrIGZvciBDb250ZW50LUVuY29kaW5nICovCi0gICAgICAgIGlmICgodHlwZSA9IGFwX3RhYmxlX2dldChjb25mLT5lbmNvZGluZ190eXBlcywgZXh0KSkpIHsKLSAgICAgICAgICAgIGlmICghci0+Y29udGVudF9lbmNvZGluZykKLSAgICAgICAgICAgICAgICByLT5jb250ZW50X2VuY29kaW5nID0gdHlwZTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByLT5jb250ZW50X2VuY29kaW5nID0gYXBfcHN0cmNhdChyLT5wb29sLCByLT5jb250ZW50X2VuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsICIsIHR5cGUsIE5VTEwpOwotICAgICAgICAgICAgZm91bmQgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2hlY2sgZm9yIGEgc3BlY2lhbCBoYW5kbGVyLCBidXQgbm90IGZvciBwcm94eSByZXF1ZXN0ICovCi0gICAgICAgIGlmICgodHlwZSA9IGFwX3RhYmxlX2dldChjb25mLT5oYW5kbGVycywgZXh0KSkgJiYgIXItPnByb3h5cmVxKSB7Ci0gICAgICAgICAgICByLT5oYW5kbGVyID0gdHlwZTsKLSAgICAgICAgICAgIGZvdW5kID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFRoaXMgaXMgdG8gZGVhbCB3aXRoIGNhc2VzIHN1Y2ggYXMgZm9vLmdpZi5iYWssIHdoaWNoIHdlIHdhbnQKLSAgICAgICAgICogdG8gbm90IGhhdmUgYSB0eXBlLiBTbyBpZiB3ZSBmaW5kIGFuIHVua25vd24gZXh0ZW5zaW9uLCB3ZQotICAgICAgICAgKiB6YXAgdGhlIHR5cGUvbGFuZ3VhZ2UvZW5jb2RpbmcgYW5kIHJlc2V0IHRoZSBoYW5kbGVyCi0gICAgICAgICAqLwotCi0gICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgIHItPmNvbnRlbnRfdHlwZSA9IE5VTEw7Ci0gICAgICAgICAgICByLT5jb250ZW50X2xhbmd1YWdlID0gTlVMTDsKLSAgICAgICAgICAgIHItPmNvbnRlbnRfbGFuZ3VhZ2VzID0gTlVMTDsKLSAgICAgICAgICAgIHItPmNvbnRlbnRfZW5jb2RpbmcgPSBOVUxMOwotICAgICAgICAgICAgci0+aGFuZGxlciA9IG9yaWdoYW5kbGVyOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKiBTZXQgZGVmYXVsdCBsYW5ndWFnZSwgaWYgbm9uZSB3YXMgc3BlY2lmaWVkIGJ5IHRoZSBleHRlbnNpb25zCi0gICAgICogYW5kIHdlIGhhdmUgYSBEZWZhdWx0TGFuZ3VhZ2Ugc2V0dGluZyBpbiBmb3JjZQotICAgICAqLwotCi0gICAgaWYgKCFyLT5jb250ZW50X2xhbmd1YWdlcyAmJiBjb25mLT5kZWZhdWx0X2xhbmd1YWdlKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKipuZXc7Ci0KLSAgICAgICAgci0+Y29udGVudF9sYW5ndWFnZSA9IGNvbmYtPmRlZmF1bHRfbGFuZ3VhZ2U7IC8qIGJhY2sgY29tcGF0LiBvbmx5ICovCi0gICAgICAgIGlmICghci0+Y29udGVudF9sYW5ndWFnZXMpCi0gICAgICAgICAgICByLT5jb250ZW50X2xhbmd1YWdlcyA9IGFwX21ha2VfYXJyYXkoci0+cG9vbCwgMiwgc2l6ZW9mKGNoYXIgKikpOwotICAgICAgICBuZXcgPSAoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShyLT5jb250ZW50X2xhbmd1YWdlcyk7Ci0gICAgICAgICpuZXcgPSBjb25mLT5kZWZhdWx0X2xhbmd1YWdlOwotICAgIH0KLQotICAgIC8qIENoZWNrIGZvciBvdmVycmlkZXMgd2l0aCBGb3JjZVR5cGUvU2V0SGFuZGxlciAqLwotCi0gICAgaWYgKGNvbmYtPnR5cGUgJiYgc3RyY21wKGNvbmYtPnR5cGUsICJub25lIikpCi0gICAgICAgIHItPmNvbnRlbnRfdHlwZSA9IGNvbmYtPnR5cGU7Ci0gICAgaWYgKGNvbmYtPmhhbmRsZXIgJiYgc3RyY21wKGNvbmYtPmhhbmRsZXIsICJub25lIikpCi0gICAgICAgIHItPmhhbmRsZXIgPSBjb25mLT5oYW5kbGVyOwotCi0gICAgaWYgKCFyLT5jb250ZW50X3R5cGUpCi0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdGljIHZvaWQgcmVnaXN0ZXJfaG9va3Modm9pZCkKLXsKLSAgICBhcF9ob29rX3R5cGVfY2hlY2tlcihmaW5kX2N0LE5VTEwsTlVMTCxIT09LX01JRERMRSk7Ci0gICAgYXBfaG9va19wb3N0X2NvbmZpZyhtaW1lX3Bvc3RfY29uZmlnLE5VTEwsTlVMTCxIT09LX01JRERMRSk7Ci19Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBtaW1lX21vZHVsZSA9IHsKLSAgICBTVEFOREFSRDIwX01PRFVMRV9TVFVGRiwKLSAgICBjcmVhdGVfbWltZV9kaXJfY29uZmlnLAkvKiBjcmVhdGUgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlICovCi0gICAgbWVyZ2VfbWltZV9kaXJfY29uZmlncywJLyogbWVyZ2UgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIE5VTEwsCQkJLyogY3JlYXRlIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZSAqLwotICAgIE5VTEwsCQkJLyogbWVyZ2UgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIG1pbWVfY21kcywJCQkvKiBjb21tYW5kIGFwX3RhYmxlX3QgKi8KLSAgICBOVUxMLAkJCS8qIGhhbmRsZXJzICovCi0gICAgcmVnaXN0ZXJfaG9va3MJCS8qIHJlZ2lzdGVyIGhvb2tzICovCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9odHRwL21vZF9taW1lLmV4cCBiL21vZHVsZXMvaHR0cC9tb2RfbWltZS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZTM4ZGIuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9odHRwL21vZF9taW1lLmV4cAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW1pbWVfbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL2xvZ2dlcnMvLmluZGVudC5wcm8gYi9tb2R1bGVzL2xvZ2dlcnMvLmluZGVudC5wcm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZmJlOWYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9sb2dnZXJzLy5pbmRlbnQucHJvCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLWk0IC1ucHNsIC1kaTAgLWJyIC1uY2UgLWQwIC1jbGkwIC1ucGNzIC1uZmMxCi0tVEJVRkYKLS1URklMRQotLVRUUkFOUwotLVRVSU5UNAotLVRfdHJhbnMKLS1UYWxsb3dfb3B0aW9uc190Ci0tVGFwYWNoZV9zZmlvCi0tVGFycmF5X2hlYWRlcgotLVRib29sX2ludAotLVRidWZfYXJlYQotLVRidWZmX3N0cnVjdAotLVRidWZmeQotLVRjbWRfaG93Ci0tVGNtZF9wYXJtcwotLVRjb21tYW5kX3JlYwotLVRjb21tYW5kX3N0cnVjdAotLVRjb25uX3JlYwotLVRjb3JlX2Rpcl9jb25maWcKLS1UY29yZV9zZXJ2ZXJfY29uZmlnCi0tVGRpcl9tYWtlcl9mdW5jCi0tVGV2ZW50Ci0tVGdsb2JhbHNfcwotLVRoYW5kbGVyX2Z1bmMKLS1UaGFuZGxlcl9yZWMKLS1Uam9ibGlzdF9zCi0tVGxpc3Rlbl9yZWMKLS1UbWVyZ2VyX2Z1bmMKLS1UbW9kZV90Ci0tVG1vZHVsZQotLVRtb2R1bGVfc3RydWN0Ci0tVG11dGV4Ci0tVG5fbG9uZwotLVRvdGhlcl9jaGlsZF9yZWMKLS1Ub3ZlcnJpZGVzX3QKLS1UcGFyZW50X3Njb3JlCi0tVHBpZF90Ci0tVHBpcGVkX2xvZwotLVRwb29sCi0tVHJlcXVlc3RfcmVjCi0tVHJlcXVpcmVfbGluZQotLVRybGltX3QKLS1Uc2NvcmVib2FyZAotLVRzZW1hcGhvcmUKLS1Uc2VydmVyX2FkZHJfcmVjCi0tVHNlcnZlcl9yZWMKLS1Uc2VydmVyX3JlY19jaGFpbgotLVRzaG9ydF9zY29yZQotLVR0YWJsZQotLVR0YWJsZV9lbnRyeQotLVR0aHJlYWQKLS1UdV93aWRlX2ludAotLVR2dGltZV90Ci0tVHdpZGVfaW50CmRpZmYgLS1naXQgYS9tb2R1bGVzL2xvZ2dlcnMvbW9kX2xvZ19jb25maWcuYyBiL21vZHVsZXMvbG9nZ2Vycy9tb2RfbG9nX2NvbmZpZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2U4NTEwLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbG9nZ2Vycy9tb2RfbG9nX2NvbmZpZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE2MCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBNb2RpZmllZCBieSBkam1AdmEucHVibml4LmNvbToKLSAqIElmIG5vIFRyYW5zZmVyTG9nIGlzIGdpdmVuIGV4cGxpY2l0bHksIGRlY2xpbmUgdG8gbG9nLgotICoKLSAqIFRoaXMgaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIFRyYW5zZmVyTG9nIGRpcmVjdGl2ZSAoc2FtZSBhcyB0aGUKLSAqIGNvbW1vbiBsb2cgbW9kdWxlKSwgYW5kIGFkZGl0aW9uYWwgZGlyZWN0aXZlcywgTG9nRm9ybWF0IGFuZCBDdXN0b21Mb2cuCi0gKgotICoKLSAqIFN5bnRheDoKLSAqCi0gKiAgICBUcmFuc2ZlckxvZyBmbiAgICAgIExvZ3MgdHJhbnNmZXJzIHRvIGZuIGluIHN0YW5kYXJkIGxvZyBmb3JtYXQsIHVubGVzcwotICogICAgICAgICAgICAgICAgICAgICAgICBhIGN1c3RvbSBmb3JtYXQgaXMgc2V0IHdpdGggTG9nRm9ybWF0Ci0gKiAgICBMb2dGb3JtYXQgZm9ybWF0ICAgIFNldCBhIGxvZyBmb3JtYXQgZnJvbSBUcmFuc2ZlckxvZyBmaWxlcwotICogICAgQ3VzdG9tTG9nIGZuIGZvcm1hdAotICogICAgICAgICAgICAgICAgICAgICAgICBMb2cgdG8gZmlsZSBmbiB3aXRoIGZvcm1hdCBnaXZlbiBieSB0aGUgZm9ybWF0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50Ci0gKgotICogICAgQ29va2llTG9nIGZuICAgICAgICBGb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkgd2l0aCBvbGQgQ29va2llCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcgbW9kdWxlIC0gbm93IGRlcHJlY2F0ZWQuCi0gKgotICogVGhlcmUgY2FuIGJlIGFueSBudW1iZXIgb2YgVHJhbnNmZXJMb2cgYW5kIEN1c3RvbUxvZwotICogY29tbWFuZHMuIEVhY2ggcmVxdWVzdCB3aWxsIGJlIGxvZ2dlZCB0byBfQUxMXyB0aGUKLSAqIG5hbWVkIGZpbGVzLCBpbiB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0LgotICoKLSAqIElmIG5vIFRyYW5zZmVyTG9nIG9yIEN1c3RvbUxvZyBkaXJlY3RpdmUgYXBwZWFycyBpbiBhIFZpcnR1YWxIb3N0LAotICogdGhlIHJlcXVlc3Qgd2lsbCBiZSBsb2dnZWQgdG8gdGhlIGxvZyBmaWxlKHMpIGRlZmluZWQgb3V0c2lkZQotICogdGhlIHZpcnR1YWwgaG9zdCBzZWN0aW9uLiBJZiBhIFRyYW5zZmVyTG9nIG9yIEN1c3RvbUxvZyBkaXJlY3RpdmUKLSAqIGFwcGVhcnMgaW4gdGhlIFZpcnR1YWxIb3N0IHNlY3Rpb24sIHRoZSBsb2cgZmlsZXMgZGVmaW5lZCBvdXRzaWRlCi0gKiB0aGUgVmlydHVhbEhvc3Qgd2lsbCBfbm90XyBiZSB1c2VkLiBUaGlzIG1ha2VzIHRoaXMgbW9kdWxlIGNvbXBhdGFibGUKLSAqIHdpdGggdGhlIENMRiBhbmQgY29uZmlnIGxvZyBtb2R1bGVzLCB3aGVyZSB0aGUgdXNlIG9mIFRyYW5zZmVyTG9nCi0gKiBpbnNpZGUgdGhlIFZpcnR1YWxIb3N0IHNlY3Rpb24gb3ZlcnJpZGVzIGl0cyB1c2Ugb3V0c2lkZS4KLSAqIAotICogRXhhbXBsZXM6Ci0gKgotICogICAgVHJhbnNmZXJMb2cgICAgbG9ncy9hY2Nlc3NfbG9nCi0gKiAgICA8VmlydHVhbEhvc3Q+Ci0gKiAgICBMb2dGb3JtYXQgICAgICAiLi4uIGN1c3RvbSBmb3JtYXQgLi4uIgotICogICAgVHJhbnNmZXJMb2cgICAgbG9nL3ZpcnR1YWxfb25seQotICogICAgQ3VzdG9tTG9nICAgICAgbG9nL3ZpcnR1YWxfdXNlcmFnZW50cyAiJXQgJXt1c2VyLWFnZW50fWkiCi0gKiAgICA8L1ZpcnR1YWxIb3N0PgotICoKLSAqIFRoaXMgd2lsbCBsb2cgdXNpbmcgQ0xGIHRvIGFjY2Vzc19sb2cgYW55IHJlcXVlc3RzIGhhbmRsZWQgYnkgdGhlCi0gKiBtYWluIHNlcnZlciwgd2hpbGUgYW55IHJlcXVlc3RzIHRvIHRoZSB2aXJ0dWFsIGhvc3Qgd2lsbCBiZSBsb2dnZWQKLSAqIHdpdGggdGhlICIuLi4gY3VzdG9tIGZvcm1hdC4uLiIgdG8gdmlydHVhbF9vbmx5IF9BTkRfIHVzaW5nCi0gKiB0aGUgY3VzdG9tIHVzZXItYWdlbnQgbG9nIHRvIHZpcnR1YWxfdXNlcmFnZW50cy4KLSAqCi0gKiBOb3RlIHRoYXQgdGhlIE5DU0EgcmVmZXJlciBhbmQgdXNlci1hZ2VudCBsb2dzIGFyZSBlYXNpbHkgYWRkZWQgd2l0aAotICogQ3VzdG9tTG9nOgotICogICBDdXN0b21Mb2cgICBsb2dzL3JlZmVyZXIgICIle3JlZmVyZXJ9aSAtPiAlVSIKLSAqICAgQ3VzdG9tTG9nICAgbG9ncy9hZ2VudCAgICAiJXt1c2VyLWFnZW50fWkiCi0gKgotICogUmVmZXJlcklnbm9yZSBmdW5jdGlvbmFsaXR5IGNhbiBiZSBvYnRhaW5lZCB3aXRoIGNvbmRpdGlvbmFsCi0gKiBsb2dnaW5nIChTZXRFbnZJZiBhbmQgQ3VzdG9tTG9nIC4uLiBlbnY9IVZBUikuCi0gKgotICogQnV0IHVzaW5nIHRoaXMgbWV0aG9kIGFsbG93cyBtdWNoIGVhc2llciBtb2RpZmljYXRpb24gb2YgdGhlCi0gKiBsb2cgZm9ybWF0LCBlLmcuIHRvIGxvZyBob3N0cyBhbG9uZyB3aXRoIFVBOgotICogICBDdXN0b21Mb2cgICBsb2dzL3JlZmVyZXIgIiV7cmVmZXJlcn1pICVVICVoIgotICoKLSAqIFRoZSBhcmd1bWVudCB0byBMb2dGb3JtYXQgYW5kIEN1c3RvbUxvZyBpcyBhIHN0cmluZywgd2hpY2ggY2FuIGluY2x1ZGUKLSAqIGxpdGVyYWwgY2hhcmFjdGVycyBjb3BpZWQgaW50byB0aGUgbG9nIGZpbGVzLCBhbmQgJyUnIGRpcmVjdGl2ZXMgYXMKLSAqIGZvbGxvd3M6Ci0gKgotICogJS4uLmI6ICBieXRlcyBzZW50LCBleGNsdWRpbmcgSFRUUCBoZWFkZXJzLgotICogJS4uLntGT09CQVJ9ZTogIFRoZSBjb250ZW50cyBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgRk9PQkFSCi0gKiAlLi4uZjogIGZpbGVuYW1lCi0gKiAlLi4uaDogIHJlbW90ZSBob3N0Ci0gKiAlLi4uYTogIHJlbW90ZSBJUC1hZGRyZXNzCi0gKiAlLi4uQTogIGxvY2FsIElQLWFkZHJlc3MKLSAqICUuLi57Rm9vYmFyfWk6ICBUaGUgY29udGVudHMgb2YgRm9vYmFyOiBoZWFkZXIgbGluZShzKSBpbiB0aGUgcmVxdWVzdAotICogICAgICAgICAgICAgICAgIHNlbnQgdG8gdGhlIGNsaWVudC4KLSAqICUuLi5sOiAgcmVtb3RlIGxvZ25hbWUgKGZyb20gaWRlbnRkLCBpZiBzdXBwbGllZCkKLSAqICUuLi57Rm9vYmFyfW46ICBUaGUgY29udGVudHMgb2Ygbm90ZSAiRm9vYmFyIiBmcm9tIGFub3RoZXIgbW9kdWxlLgotICogJS4uLntGb29iYXJ9bzogIFRoZSBjb250ZW50cyBvZiBGb29iYXI6IGhlYWRlciBsaW5lKHMpIGluIHRoZSByZXBseS4KLSAqICUuLi5wOiAgdGhlIHBvcnQgdGhlIHJlcXVlc3Qgd2FzIHNlcnZlZCB0bwotICogJS4uLlA6ICB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgY2hpbGQgdGhhdCBzZXJ2aWNlZCB0aGUgcmVxdWVzdC4KLSAqICUuLi5yOiAgZmlyc3QgbGluZSBvZiByZXF1ZXN0Ci0gKiAlLi4uczogIHN0YXR1cy4gIEZvciByZXF1ZXN0cyB0aGF0IGdvdCBpbnRlcm5hbGx5IHJlZGlyZWN0ZWQsIHRoaXMKLSAqICAgICAgICAgaXMgc3RhdHVzIG9mIHRoZSAqb3JpZ2luYWwqIHJlcXVlc3QgLS0tICUuLi4+cyBmb3IgdGhlIGxhc3QuCi0gKiAlLi4udDogIHRpbWUsIGluIGNvbW1vbiBsb2cgZm9ybWF0IHRpbWUgZm9ybWF0Ci0gKiAlLi4ue2Zvcm1hdH10OiAgVGhlIHRpbWUsIGluIHRoZSBmb3JtIGdpdmVuIGJ5IGZvcm1hdCwgd2hpY2ggc2hvdWxkCi0gKiAgICAgICAgICAgICAgICAgYmUgaW4gc3RyZnRpbWUoMykgZm9ybWF0LgotICogJS4uLlQ6ICB0aGUgdGltZSB0YWtlbiB0byBzZXJ2ZSB0aGUgcmVxdWVzdCwgaW4gc2Vjb25kcy4KLSAqICUuLi51OiAgcmVtb3RlIHVzZXIgKGZyb20gYXV0aDsgbWF5IGJlIGJvZ3VzIGlmIHJldHVybiBzdGF0dXMgKCVzKSBpcyA0MDEpCi0gKiAlLi4uVTogIHRoZSBVUkwgcGF0aCByZXF1ZXN0ZWQuCi0gKiAlLi4udjogIHRoZSBjb25maWd1cmVkIG5hbWUgb2YgdGhlIHNlcnZlciAoaS5lLiB3aGljaCB2aXJ0dWFsIGhvc3Q/KQotICogJS4uLlY6ICB0aGUgc2VydmVyIG5hbWUgYWNjb3JkaW5nIHRvIHRoZSBVc2VDYW5vbmljYWxOYW1lIHNldHRpbmcKLSAqCi0gKiBUaGUgJy4uLicgY2FuIGJlIG5vdGhpbmcgYXQgYWxsIChlLmcuICIlaCAldSAlciAlcyAlYiIpLCBvciBpdCBjYW4KLSAqIGluZGljYXRlIGNvbmRpdGlvbnMgZm9yIGluY2x1c2lvbiBvZiB0aGUgaXRlbSAod2hpY2ggd2lsbCBjYXVzZSBpdAotICogdG8gYmUgcmVwbGFjZWQgd2l0aCAnLScgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0KS4gIE5vdGUgdGhhdAotICogdGhlcmUgaXMgbm8gZXNjYXBpbmcgcGVyZm9ybWVkIG9uIHRoZSBzdHJpbmdzIGZyb20gJXIsICUuLi5pIGFuZAotICogJS4uLm87IHNvbWUgd2l0aCBsb25nIG1lbW9yaWVzIG1heSByZW1lbWJlciB0aGF0IEkgdGhvdWdodCB0aGlzIHdhcwotICogYSBiYWQgaWRlYSwgb25jZSB1cG9uIGEgdGltZSwgYW5kIEknbSBzdGlsbCBub3QgY29tZm9ydGFibGUgd2l0aAotICogaXQsIGJ1dCBpdCBpcyBkaWZmaWN1bHQgdG8gc2VlIGhvdyB0byAiZG8gdGhlIHJpZ2h0IHRoaW5nIiB3aXRoIGFsbAotICogb2YgJyUuLmknLCB1bmxlc3Mgd2UgVVJMLWVzY2FwZSBldmVyeXRoaW5nIGFuZCBicmVhayB3aXRoIENMRi4KLSAqCi0gKiBUaGUgZm9ybXMgb2YgY29uZGl0aW9uIGFyZSBhIGxpc3Qgb2YgSFRUUCBzdGF0dXMgY29kZXMsIHdoaWNoIG1heQotICogb3IgbWF5IG5vdCBiZSBwcmVjZWRlZCBieSAnIScuICBUaHVzLCAnJTQwMCw1MDF7VXNlci1hZ2VudH1pJyBsb2dzCi0gKiBVc2VyLWFnZW50OiBvbiA0MDAgZXJyb3JzIGFuZCA1MDEgZXJyb3JzIChCYWQgUmVxdWVzdCwgTm90Ci0gKiBJbXBsZW1lbnRlZCkgb25seTsgJyUhMjAwLDMwNCwzMDJ7UmVmZXJlcn1pJyBsb2dzIFJlZmVyZXI6IG9uIGFsbAotICogcmVxdWVzdHMgd2hpY2ggZGlkICpub3QqIHJldHVybiBzb21lIHNvcnQgb2Ygbm9ybWFsIHN0YXR1cy4KLSAqCi0gKiBUaGUgZGVmYXVsdCBMb2dGb3JtYXQgcmVwcm9kdWNlcyBDTEY7IHNlZSBiZWxvdy4KLSAqCi0gKiBUaGUgd2F5IHRoaXMgaXMgc3VwcG9zZWQgdG8gd29yayB3aXRoIHZpcnR1YWwgaG9zdHMgaXMgYXMgZm9sbG93czoKLSAqIGEgdmlydHVhbCBob3N0IGNhbiBoYXZlIGl0cyBvd24gTG9nRm9ybWF0LCBvciBpdHMgb3duIFRyYW5zZmVyTG9nLgotICogSWYgaXQgZG9lc24ndCBoYXZlIGl0cyBvd24gTG9nRm9ybWF0LCBpdCBpbmhlcml0cyBmcm9tIHRoZSBtYWluCi0gKiBzZXJ2ZXIuICBJZiBpdCBkb2Vzbid0IGhhdmUgaXRzIG93biBUcmFuc2ZlckxvZywgaXQgd3JpdGVzIHRvIHRoZQotICogc2FtZSBkZXNjcmlwdG9yIChtZWFuaW5nIHRoZSBzYW1lIHByb2Nlc3MgZm9yICJ8IC4uLiIpLgotICoKLSAqIC0tLSByc3QgKi8KLQotI2RlZmluZSBERUZBVUxUX0xPR19GT1JNQVQgIiVoICVsICV1ICV0IFwiJXJcIiAlPnMgJWIiCi0KLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiICAgICAgICAgIC8qIEZvciBSRU1PVEVfTkFNRSAqLwotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF9wcm90b2NvbC5oIgotI2lmZGVmIEhBVkVfTElNSVRTX0gKLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbmRpZgotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgY29uZmlnX2xvZ19tb2R1bGU7Ci0KLXN0YXRpYyBpbnQgeGZlcl9mbGFncyA9IChBUFJfV1JJVEUgfCBBUFJfQVBQRU5EIHwgQVBSX0NSRUFURSk7Ci0jaWYgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lOMzIpCi0vKiBPUy8yIGRvc2VuJ3Qgc3VwcG9ydCB1c2VycyBhbmQgZ3JvdXBzICovCi1zdGF0aWMgbW9kZV90IHhmZXJfbW9kZSA9IChTX0lSRUFEIHwgU19JV1JJVEUpOwotI2Vsc2UKLXN0YXRpYyBtb2RlX3QgeGZlcl9tb2RlID0gKEFQUl9VUkVBRCB8IEFQUl9VV1JJVEUgfCBBUFJfR1JFQUQgfCBBUFJfV1JFQUQpOwotI2VuZGlmCi0KLS8qIFBPU0lYLjEgZGVmaW5lcyBQSVBFX0JVRiBhcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBpcwotICogZ3VhcmFudGVlZCB0byBiZSBhdG9taWMgd2hlbiB3cml0aW5nIGEgcGlwZS4gIEFuZCBQSVBFX0JVRiA+PSA1MTIKLSAqIGlzIGd1YXJhbnRlZWQuICBTbyB3ZSdsbCBqdXN0IGd1ZXNzIDUxMiBpbiB0aGUgZXZlbnQgdGhlIHN5c3RlbQotICogZG9lc24ndCBoYXZlIHRoaXMuICBOb3csIGZvciBmaWxlIHdyaXRlcyB0aGVyZSBpcyBhY3R1YWxseSBubyBsaW1pdCwKLSAqIHRoZSBlbnRpcmUgd3JpdGUgaXMgYXRvbWljLiAgV2hldGhlciBhbGwgc3lzdGVtcyBpbXBsZW1lbnQgdGhpcwotICogY29ycmVjdGx5IGlzIGFub3RoZXIgcXVlc3Rpb24gZW50aXJlbHkgLi4uIHNvIHdlJ2xsIGp1c3QgdXNlIFBJUEVfQlVGCi0gKiBiZWNhdXNlIGl0J3MgcHJvYmFibHkgYSBnb29kIGd1ZXNzIGFzIHRvIHdoYXQgaXMgaW1wbGVtZW50ZWQgY29ycmVjdGx5Ci0gKiBldmVyeXdoZXJlLgotICovCi0jaWZkZWYgUElQRV9CVUYKLSNkZWZpbmUgTE9HX0JVRlNJWkUgICAgIFBJUEVfQlVGCi0jZWxzZQotI2RlZmluZSBMT0dfQlVGU0laRSAgICAgKDUxMikKLSNlbmRpZgotCi0vKgotICogbXVsdGlfbG9nX3N0YXRlIGlzIG91ciBwZXItKHZpcnR1YWwpLXNlcnZlciBjb25maWd1cmF0aW9uLiBXZSBzdG9yZQotICogYW4gYXJyYXkgb2YgdGhlIGxvZ3Mgd2UgYXJlIGdvaW5nIHRvIHVzZSwgZWFjaCBvZiB0eXBlIGNvbmZpZ19sb2dfc3RhdGUuCi0gKiBJZiBhIGRlZmF1bHQgbG9nIGZvcm1hdCBpcyBnaXZlbiBieSBMb2dGb3JtYXQsIHN0b3JlIGluIGRlZmF1bHRfZm9ybWF0Ci0gKiAoYmFja3dhcmQgY29tcGF0LiB3aXRoIG1vZF9sb2dfY29uZmlnKS4gIFdlIGFsc28gc3RvcmUgZm9yIGVhY2ggdmlydHVhbAotICogc2VydmVyIGEgcG9pbnRlciB0byB0aGUgbG9ncyBzcGVjaWZpZWQgZm9yIHRoZSBtYWluIHNlcnZlciwgc28gdGhhdCBpZiB0aGlzCi0gKiB2aG9zdCBoYXMgbm8gbG9ncyBkZWZpbmVkLCB3ZSBjYW4gdXNlIHRoZSBtYWluIHNlcnZlcidzIGxvZ3MgaW5zdGVhZC4KLSAqCi0gKiBTbywgZm9yIHRoZSBtYWluIHNlcnZlciwgY29uZmlnX2xvZ3MgY29udGFpbnMgYSBsaXN0IG9mIHRoZSBsb2cgZmlsZXMKLSAqIGFuZCBzZXJ2ZXJfY29uZmlnX2xvZ3MgaW4gZW1wdHkuIEZvciBhIHZob3N0LCBzZXJ2ZXJfY29uZmlnX2xvZ3MKLSAqIHBvaW50cyB0byB0aGUgc2FtZSBhcnJheSBhcyBjb25maWdfbG9ncyBpbiB0aGUgbWFpbiBzZXJ2ZXIsIGFuZAotICogY29uZmlnX2xvZ3MgcG9pbnRzIHRvIHRoZSBhcnJheSBvZiBsb2dzIGRlZmluZWQgaW5zaWRlIHRoaXMgdmhvc3QsCi0gKiB3aGljaCBtaWdodCBiZSBlbXB0eS4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY2hhciAqZGVmYXVsdF9mb3JtYXRfc3RyaW5nOwotICAgIGFwX2FycmF5X2hlYWRlcl90ICpkZWZhdWx0X2Zvcm1hdDsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqY29uZmlnX2xvZ3M7Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKnNlcnZlcl9jb25maWdfbG9nczsKLSAgICBhcF90YWJsZV90ICpmb3JtYXRzOwotfSBtdWx0aV9sb2dfc3RhdGU7Ci0KLS8qCi0gKiBjb25maWdfbG9nX3N0YXRlIGhvbGRzIHRoZSBzdGF0dXMgb2YgYSBzaW5nbGUgbG9nIGZpbGUuIGZuYW1lIG1pZ2h0Ci0gKiBiZSBOVUxMLCB3aGljaCBtZWFucyB0aGlzIG1vZHVsZSBkb2VzIG5vIGxvZ2dpbmcgZm9yIHRoaXMKLSAqIHJlcXVlc3QuIGZvcm1hdCBtaWdodCBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIHRoZSBkZWZhdWx0X2Zvcm1hdAotICogZnJvbSB0aGUgbXVsdGlfbG9nX3N0YXRlIHNob3VsZCBiZSB1c2VkLCBvciBpZiB0aGF0IGlzIE5VTEwgYXMKLSAqIHdlbGwsIHVzZSB0aGUgQ0xGLiBsb2dfZmQgaXMgTlVMTCBiZWZvcmUgdGhlIGxvZyBmaWxlIGlzIG9wZW5lZCBhbmQKLSAqIHNldCB0byBhIHZhbGlkIGZkIGFmdGVyIGl0IGlzIG9wZW5lZC4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY2hhciAqZm5hbWU7Ci0gICAgY2hhciAqZm9ybWF0X3N0cmluZzsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqZm9ybWF0OwotICAgIGFwX2ZpbGVfdCAqbG9nX2ZkOwotICAgIGNoYXIgKmNvbmRpdGlvbl92YXI7Ci0jaWZkZWYgQlVGRkVSRURfTE9HUwotICAgIGludCBvdXRjbnQ7Ci0gICAgY2hhciBvdXRidWZbTE9HX0JVRlNJWkVdOwotI2VuZGlmCi19IGNvbmZpZ19sb2dfc3RhdGU7Ci0KLS8qCi0gKiBGb3JtYXQgaXRlbXMuLi4KLSAqIE5vdGUgdGhhdCBtYW55IG9mIHRoZXNlIGNvdWxkIGhhdmUgYXBfc3ByaW50ZnMgcmVwbGFjZWQgd2l0aCBzdGF0aWMgYnVmZmVycy4KLSAqLwotCi10eXBlZGVmIGNvbnN0IGNoYXIgKigqaXRlbV9rZXlfZnVuYykgKHJlcXVlc3RfcmVjICosIGNoYXIgKik7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpdGVtX2tleV9mdW5jIGZ1bmM7Ci0gICAgY2hhciAqYXJnOwotICAgIGludCBjb25kaXRpb25fc2Vuc2U7Ci0gICAgaW50IHdhbnRfb3JpZzsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqY29uZGl0aW9uczsKLX0gbG9nX2Zvcm1hdF9pdGVtOwotCi1zdGF0aWMgY2hhciAqZm9ybWF0X2ludGVnZXIoYXBfY29udGV4dF90ICpwLCBpbnQgaSkKLXsKLSAgICByZXR1cm4gYXBfcHNwcmludGYocCwgIiVkIiwgaSk7Ci19Ci0KLXN0YXRpYyBjaGFyICpwZm10KGFwX2NvbnRleHRfdCAqcCwgaW50IGkpCi17Ci0gICAgaWYgKGkgPD0gMCkgewotICAgICAgICByZXR1cm4gIi0iOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGZvcm1hdF9pbnRlZ2VyKHAsIGkpOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0YW50X2l0ZW0ocmVxdWVzdF9yZWMgKmR1bW15LCBjaGFyICpzdHVmZikKLXsKLSAgICByZXR1cm4gc3R1ZmY7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpsb2dfcmVtb3RlX2hvc3QocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmEpCi17Ci0gICAgcmV0dXJuIGFwX2dldF9yZW1vdGVfaG9zdChyLT5jb25uZWN0aW9uLCByLT5wZXJfZGlyX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFTU9URV9OQU1FKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmxvZ19yZW1vdGVfYWRkcmVzcyhyZXF1ZXN0X3JlYyAqciwgY2hhciAqYSkKLXsKLSAgICByZXR1cm4gci0+Y29ubmVjdGlvbi0+cmVtb3RlX2lwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqbG9nX2xvY2FsX2FkZHJlc3MocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmEpCi17Ci0gICAgcmV0dXJuIHItPmNvbm5lY3Rpb24tPmxvY2FsX2lwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqbG9nX3JlbW90ZV9sb2duYW1lKHJlcXVlc3RfcmVjICpyLCBjaGFyICphKQotewotICAgIHJldHVybiBhcF9nZXRfcmVtb3RlX2xvZ25hbWUocik7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpsb2dfcmVtb3RlX3VzZXIocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmEpCi17Ci0gICAgY2hhciAqcnZhbHVlID0gci0+dXNlcjsKLQotICAgIGlmIChydmFsdWUgPT0gTlVMTCkgewotICAgICAgICBydmFsdWUgPSAiLSI7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmxlbihydmFsdWUpID09IDApIHsKLSAgICAgICAgcnZhbHVlID0gIlwiXCIiOwotICAgIH0KLSAgICByZXR1cm4gcnZhbHVlOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqbG9nX3JlcXVlc3RfbGluZShyZXF1ZXN0X3JlYyAqciwgY2hhciAqYSkKLXsKLQkgICAgLyogTk9URTogSWYgdGhlIG9yaWdpbmFsIHJlcXVlc3QgY29udGFpbmVkIGEgcGFzc3dvcmQsIHdlCi0JICAgICAqIHJlLXdyaXRlIHRoZSByZXF1ZXN0IGxpbmUgaGVyZSB0byBjb250YWluIFhYWFhYWCBpbnN0ZWFkOgotCSAgICAgKiAobm90ZSB0aGUgdHJ1bmNhdGlvbiBiZWZvcmUgdGhlIHByb3RvY29sIHN0cmluZyBmb3IgSFRUUC8wLjkgcmVxdWVzdHMpCi0JICAgICAqIChub3RlIGFsc28gdGhhdCByLT50aGVfcmVxdWVzdCBjb250YWlucyB0aGUgdW5tb2RpZmllZCByZXF1ZXN0KQotCSAgICAgKi8KLSAgICByZXR1cm4gKHItPnBhcnNlZF91cmkucGFzc3dvcmQpID8gYXBfcHN0cmNhdChyLT5wb29sLCByLT5tZXRob2QsICIgIiwKLQkJCQkJIGFwX3VucGFyc2VfdXJpX2NvbXBvbmVudHMoci0+cG9vbCwgJnItPnBhcnNlZF91cmksIDApLAotCQkJCQkgci0+YXNzYmFja3dhcmRzID8gTlVMTCA6ICIgIiwgci0+cHJvdG9jb2wsIE5VTEwpCi0JCQkJCTogci0+dGhlX3JlcXVlc3Q7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpsb2dfcmVxdWVzdF9maWxlKHJlcXVlc3RfcmVjICpyLCBjaGFyICphKQotewotICAgIHJldHVybiByLT5maWxlbmFtZTsKLX0KLXN0YXRpYyBjb25zdCBjaGFyICpsb2dfcmVxdWVzdF91cmkocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmEpCi17Ci0gICAgcmV0dXJuIHItPnVyaTsKLX0KLXN0YXRpYyBjb25zdCBjaGFyICpsb2dfc3RhdHVzKHJlcXVlc3RfcmVjICpyLCBjaGFyICphKQotewotICAgIHJldHVybiBwZm10KHItPnBvb2wsIHItPnN0YXR1cyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpsb2dfYnl0ZXNfc2VudChyZXF1ZXN0X3JlYyAqciwgY2hhciAqYSkKLXsKLSAgICBpZiAoIXItPnNlbnRfYm9keWN0KSB7Ci0gICAgICAgIHJldHVybiAiLSI7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBsb25nIGludCBiczsKLSAgICAgICAgYXBfYmdldG9wdChyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJPX0JZVEVDVCwgJmJzKTsKLQlyZXR1cm4gYXBfcHNwcmludGYoci0+cG9vbCwgIiVsZCIsIGJzKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpsb2dfaGVhZGVyX2luKHJlcXVlc3RfcmVjICpyLCBjaGFyICphKQotewotICAgIHJldHVybiBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgYSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpsb2dfaGVhZGVyX291dChyZXF1ZXN0X3JlYyAqciwgY2hhciAqYSkKLXsKLSAgICBjb25zdCBjaGFyICpjcCA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX291dCwgYSk7Ci0gICAgaWYgKCFzdHJjYXNlY21wKGEsICJDb250ZW50LXR5cGUiKSAmJiByLT5jb250ZW50X3R5cGUpIHsKLSAgICAgICAgY3AgPSByLT5jb250ZW50X3R5cGU7Ci0gICAgfQotICAgIGlmIChjcCkgewotICAgICAgICByZXR1cm4gY3A7Ci0gICAgfQotICAgIHJldHVybiBhcF90YWJsZV9nZXQoci0+ZXJyX2hlYWRlcnNfb3V0LCBhKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmxvZ19ub3RlKHJlcXVlc3RfcmVjICpyLCBjaGFyICphKQotewotICAgIHJldHVybiBhcF90YWJsZV9nZXQoci0+bm90ZXMsIGEpOwotfQotc3RhdGljIGNvbnN0IGNoYXIgKmxvZ19lbnZfdmFyKHJlcXVlc3RfcmVjICpyLCBjaGFyICphKQotewotICAgIHJldHVybiBhcF90YWJsZV9nZXQoci0+c3VicHJvY2Vzc19lbnYsIGEpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqbG9nX3JlcXVlc3RfdGltZShyZXF1ZXN0X3JlYyAqciwgY2hhciAqYSkKLXsKLSAgICBhcF9leHBsb2RlZF90aW1lX3QgeHQ7Ci0gICAgYXBfc3RhdHVzX3QgcmV0Y29kZTsKLSAgICBjaGFyIHRzdHJbTUFYX1NUUklOR19MRU5dOwotCi0gICAgLyoKLQloaS4gIGkgdGhpbmsgZ2V0dGluZyB0aGUgdGltZSBhZ2FpbiBhdCB0aGUgZW5kIG9mIHRoZSByZXF1ZXN0Ci0JanVzdCBmb3IgbG9nZ2luZyBpcyBkdW1iLiAgaSBrbm93IGl0J3MgInJlcXVpcmVkIiBmb3IgQ0xGLgotCWZvbGtzIHdyaXRpbmcgbG9nIHBhcnNpbmcgdG9vbHMgZG9uJ3QgcmVhbGlzZSB0aGF0IG91dCBvZiBvcmRlcgotCXRpbWVzIGhhdmUgYWx3YXlzIGJlZW4gcG9zc2libGUgKGNvbnNpZGVyIHdoYXQgaGFwcGVucyBpZiBvbmUKLQlwcm9jZXNzIGNhbGN1bGF0ZXMgdGhlIHRpbWUgdG8gbG9nLCBidXQgdGhlbiB0aGVyZSdzIGEgY29udGV4dAotCXN3aXRjaCBiZWZvcmUgaXQgd3JpdGVzIGFuZCBiZWZvcmUgdGhhdCBwcm9jZXNzIGlzIHJ1biBhZ2FpbiB0aGUKLQlsb2cgcm90YXRpb24gb2NjdXJzKSBhbmQgdGhleSBzaG91bGQganVzdCBmaXggdGhlaXIgdG9vbHMgcmF0aGVyCi0JdGhhbiBmb3JjZSB0aGUgc2VydmVyIHRvIHBheSBleHRyYSBjcHUgY3ljbGVzLglpZiB5b3UndmUgZ290Ci0JYSBwcm9ibGVtIHdpdGggdGhpcywgeW91IGNhbiBzZXQgdGhlIGRlZmluZS4gIC1kamcKLSAgICAqLwotI2lmZGVmIElfSU5TSVNUX09OX0VYVFJBX0NZQ0xFU19GT1JfQ0xGX0NPTVBMSUFOQ0UKLSAgICBhcF9leHBsb2RlX2xvY2FsdGltZSgmeHQsIGFwX25vdygpKTsKLSNlbHNlCi0gICAgYXBfZXhwbG9kZV9sb2NhbHRpbWUoJnh0LCByLT5yZXF1ZXN0X3RpbWUpOwotI2VuZGlmCi0gICAgaWYgKGEgJiYgKmEpIHsgICAgICAgICAgICAgIC8qIEN1c3RvbSBmb3JtYXQgKi8KLSAgICAgICAgYXBfc3RyZnRpbWUodHN0ciwgJnJldGNvZGUsIE1BWF9TVFJJTkdfTEVOLCBhLCAmeHQpOwotICAgIH0KLSAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLyogQ0xGIGZvcm1hdCAqLwotCWNoYXIgc2lnbjsKLQlpbnQgdGltejsKLQotCXRpbXogPSB4dC50bV9nbXRvZmY7Ci0JaWYgKHRpbXogPCAwKSB7Ci0JICAgIHRpbXogPSAtdGltejsKLQkgICAgc2lnbiA9ICctJzsKLQl9Ci0JZWxzZSB7Ci0JICAgIHNpZ24gPSAnKyc7Ci0JfQotCi0gICAgICAgIGFwX3NucHJpbnRmKHRzdHIsIHNpemVvZih0c3RyKSwgIlslMDJkLyVzLyVkOiUwMmQ6JTAyZDolMDJkICVjJS4yZCUuMmRdIiwKLSAgICAgICAgICAgICAgICB4dC50bV9tZGF5LCBhcF9tb250aF9zbmFtZXNbeHQudG1fbW9uXSwgeHQudG1feWVhcisxOTAwLAotICAgICAgICAgICAgICAgIHh0LnRtX2hvdXIsIHh0LnRtX21pbiwgeHQudG1fc2VjLAotICAgICAgICAgICAgICAgIHNpZ24sIHRpbXogLyAoNjAqNjApLCB0aW16ICUgKDYwKjYwKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFwX3BzdHJkdXAoci0+cG9vbCwgdHN0cik7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpsb2dfcmVxdWVzdF9kdXJhdGlvbihyZXF1ZXN0X3JlYyAqciwgY2hhciAqYSkKLXsKLSAgICByZXR1cm4gYXBfcHNwcmludGYoci0+cG9vbCwgIiVsZCIsIChhcF9ub3coKSAtIHItPnJlcXVlc3RfdGltZSkgLyBBUF9VU0VDX1BFUl9TRUMpOwotfQotCi0vKiBUaGVzZSBuZXh0IHR3byByb3V0aW5lcyB1c2UgdGhlIGNhbm9uaWNhbCBuYW1lOnBvcnQgc28gdGhhdCBsb2cKLSAqIHBhcnNlcnMgZG9uJ3QgbmVlZCB0byBkdXBsaWNhdGUgYWxsIHRoZSB2aG9zdCBwYXJzaW5nIGNydWQuCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpsb2dfdmlydHVhbF9ob3N0KHJlcXVlc3RfcmVjICpyLCBjaGFyICphKQotewotICAgIHJldHVybiByLT5zZXJ2ZXItPnNlcnZlcl9ob3N0bmFtZTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmxvZ19zZXJ2ZXJfcG9ydChyZXF1ZXN0X3JlYyAqciwgY2hhciAqYSkKLXsKLSAgICByZXR1cm4gYXBfcHNwcmludGYoci0+cG9vbCwgIiV1IiwKLQlyLT5zZXJ2ZXItPnBvcnQgPyByLT5zZXJ2ZXItPnBvcnQgOiBhcF9kZWZhdWx0X3BvcnQocikpOwotfQotCi0vKiBUaGlzIHJlc3BlY3RzIHRoZSBzZXR0aW5nIG9mIFVzZUNhbm9uaWNhbE5hbWUgc28gdGhhdAotICogdGhlIGR5bmFtaWMgbWFzcyB2aXJ0dWFsIGhvc3RpbmcgdHJpY2sgd29ya3MgYmV0dGVyLgotICovCi1zdGF0aWMgY29uc3QgY2hhciAqbG9nX3NlcnZlcl9uYW1lKHJlcXVlc3RfcmVjICpyLCBjaGFyICphKQotewotICAgIHJldHVybiBhcF9nZXRfc2VydmVyX25hbWUocik7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpsb2dfY2hpbGRfcGlkKHJlcXVlc3RfcmVjICpyLCBjaGFyICphKQotewotICAgIHJldHVybiBhcF9wc3ByaW50ZihyLT5wb29sLCAiJWxkIiwgKGxvbmcpIGdldHBpZCgpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogUGFyc2luZyB0aGUgbG9nIGZvcm1hdCBzdHJpbmcKLSAqLwotCi1zdGF0aWMgc3RydWN0IGxvZ19pdGVtX2xpc3QgewotICAgIGNoYXIgY2g7Ci0gICAgaXRlbV9rZXlfZnVuYyBmdW5jOwotICAgIGludCB3YW50X29yaWdfZGVmYXVsdDsKLX0gbG9nX2l0ZW1fa2V5c1tdID0gewotCi0gICAgewotICAgICAgICAnaCcsIGxvZ19yZW1vdGVfaG9zdCwgMAotICAgIH0sCi0gICAgeyAgIAotICAgICAgICAnYScsIGxvZ19yZW1vdGVfYWRkcmVzcywgMCAKLSAgICB9LAotICAgIHsgICAKLSAgICAgICAgJ0EnLCBsb2dfbG9jYWxfYWRkcmVzcywgMCAKLSAgICB9LAotICAgIHsKLSAgICAgICAgJ2wnLCBsb2dfcmVtb3RlX2xvZ25hbWUsIDAKLSAgICB9LAotICAgIHsKLSAgICAgICAgJ3UnLCBsb2dfcmVtb3RlX3VzZXIsIDAKLSAgICB9LAotICAgIHsKLSAgICAgICAgJ3QnLCBsb2dfcmVxdWVzdF90aW1lLCAwCi0gICAgfSwKLSAgICB7Ci0gICAgICAgICdUJywgbG9nX3JlcXVlc3RfZHVyYXRpb24sIDEKLSAgICB9LAotICAgIHsKLSAgICAgICAgJ3InLCBsb2dfcmVxdWVzdF9saW5lLCAxCi0gICAgfSwKLSAgICB7Ci0gICAgICAgICdmJywgbG9nX3JlcXVlc3RfZmlsZSwgMAotICAgIH0sCi0gICAgewotICAgICAgICAnVScsIGxvZ19yZXF1ZXN0X3VyaSwgMQotICAgIH0sCi0gICAgewotICAgICAgICAncycsIGxvZ19zdGF0dXMsIDEKLSAgICB9LAotICAgIHsKLSAgICAgICAgJ2InLCBsb2dfYnl0ZXNfc2VudCwgMAotICAgIH0sCi0gICAgewotICAgICAgICAnaScsIGxvZ19oZWFkZXJfaW4sIDAKLSAgICB9LAotICAgIHsKLSAgICAgICAgJ28nLCBsb2dfaGVhZGVyX291dCwgMAotICAgIH0sCi0gICAgewotICAgICAgICAnbicsIGxvZ19ub3RlLCAwCi0gICAgfSwKLSAgICB7Ci0gICAgICAgICdlJywgbG9nX2Vudl92YXIsIDAKLSAgICB9LAotICAgIHsKLSAgICAgICAgJ1YnLCBsb2dfc2VydmVyX25hbWUsIDAKLSAgICB9LAotICAgIHsKLSAgICAgICAgJ3YnLCBsb2dfdmlydHVhbF9ob3N0LCAwCi0gICAgfSwKLSAgICB7Ci0gICAgICAgICdwJywgbG9nX3NlcnZlcl9wb3J0LCAwCi0gICAgfSwKLSAgICB7Ci0gICAgICAgICdQJywgbG9nX2NoaWxkX3BpZCwgMAotICAgIH0sCi0gICAgewotICAgICAgICAnXDAnCi0gICAgfQotfTsKLQotc3RhdGljIHN0cnVjdCBsb2dfaXRlbV9saXN0ICpmaW5kX2xvZ19mdW5jKGNoYXIgaykKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGxvZ19pdGVtX2tleXNbaV0uY2g7ICsraSkKLSAgICAgICAgaWYgKGsgPT0gbG9nX2l0ZW1fa2V5c1tpXS5jaCkgewotICAgICAgICAgICAgcmV0dXJuICZsb2dfaXRlbV9rZXlzW2ldOwotICAgICAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNoYXIgKnBhcnNlX2xvZ19taXNjX3N0cmluZyhhcF9jb250ZXh0X3QgKnAsIGxvZ19mb3JtYXRfaXRlbSAqaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipzYSkKLXsKLSAgICBjb25zdCBjaGFyICpzOwotICAgIGNoYXIgKmQ7Ci0KLSAgICBpdC0+ZnVuYyA9IGNvbnN0YW50X2l0ZW07Ci0gICAgaXQtPmNvbmRpdGlvbnMgPSBOVUxMOwotCi0gICAgcyA9ICpzYTsKLSAgICB3aGlsZSAoKnMgJiYgKnMgIT0gJyUnKSB7Ci0JcysrOwotICAgIH0KLSAgICAvKgotICAgICAqIFRoaXMgbWlnaHQgYWxsb2NhdGUgYSBmZXcgY2hhcnMgZXh0cmEgaWYgdGhlcmUncyBhIGJhY2tzbGFzaAotICAgICAqIGVzY2FwZSBpbiB0aGUgZm9ybWF0IHN0cmluZy4KLSAgICAgKi8KLSAgICBpdC0+YXJnID0gYXBfcGFsbG9jKHAsIHMgLSAqc2EgKyAxKTsKLQotICAgIGQgPSBpdC0+YXJnOwotICAgIHMgPSAqc2E7Ci0gICAgd2hpbGUgKCpzICYmICpzICE9ICclJykgewotCWlmICgqcyAhPSAnXFwnKSB7Ci0JICAgICpkKysgPSAqcysrOwotCX0KLQllbHNlIHsKLQkgICAgcysrOwotCSAgICBzd2l0Y2ggKCpzKSB7Ci0JICAgIGNhc2UgJ1xcJzoKLQkJKmQrKyA9ICdcXCc7Ci0JCXMrKzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgJ24nOgotCQkqZCsrID0gJ1xuJzsKLQkJcysrOwotCQlicmVhazsKLQkgICAgY2FzZSAndCc6CQotCQkqZCsrID0gJ1x0JzsKLQkJcysrOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJLyogY29weSB2ZXJiYXRpbSAqLwotCQkqZCsrID0gJ1xcJzsKLQkJLyoKLQkJICogQWxsb3cgdGhlIGxvb3AgdG8gZGVhbCB3aXRoIHRoaXMgKnMgaW4gdGhlIG5vcm1hbAotCQkgKiBmYXNoaW9uIHNvIHRoYXQgaXQgaGFuZGxlcyBlbmQgb2Ygc3RyaW5nIGV0Yy4KLQkJICogcHJvcGVybHkuCi0JCSAqLwotCQlicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gICAgKmQgPSAnXDAnOwotCi0gICAgKnNhID0gczsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNoYXIgKnBhcnNlX2xvZ19pdGVtKGFwX2NvbnRleHRfdCAqcCwgbG9nX2Zvcm1hdF9pdGVtICppdCwgY29uc3QgY2hhciAqKnNhKQotewotICAgIGNvbnN0IGNoYXIgKnMgPSAqc2E7Ci0KLSAgICBpZiAoKnMgIT0gJyUnKSB7Ci0gICAgICAgIHJldHVybiBwYXJzZV9sb2dfbWlzY19zdHJpbmcocCwgaXQsIHNhKTsKLSAgICB9Ci0KLSAgICArK3M7Ci0gICAgaXQtPmNvbmRpdGlvbl9zZW5zZSA9IDA7Ci0gICAgaXQtPmNvbmRpdGlvbnMgPSBOVUxMOwotICAgIGl0LT53YW50X29yaWcgPSAtMTsKLSAgICBpdC0+YXJnID0gIiI7ICAgICAgICAgICAgICAgLyogRm9yIHNhZmV0eSdzIHNha2UuLi4gKi8KLQotICAgIHdoaWxlICgqcykgewotICAgICAgICBpbnQgaTsKLSAgICAgICAgc3RydWN0IGxvZ19pdGVtX2xpc3QgKmw7Ci0KLSAgICAgICAgc3dpdGNoICgqcykgewotICAgICAgICBjYXNlICchJzoKLSAgICAgICAgICAgICsrczsKLSAgICAgICAgICAgIGl0LT5jb25kaXRpb25fc2Vuc2UgPSAhaXQtPmNvbmRpdGlvbl9zZW5zZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJzwnOgotICAgICAgICAgICAgKytzOwotICAgICAgICAgICAgaXQtPndhbnRfb3JpZyA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICc+JzoKLSAgICAgICAgICAgICsrczsKLSAgICAgICAgICAgIGl0LT53YW50X29yaWcgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnLCc6Ci0gICAgICAgICAgICArK3M7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICd7JzoKLSAgICAgICAgICAgICsrczsKLSAgICAgICAgICAgIGl0LT5hcmcgPSBhcF9nZXR3b3JkKHAsICZzLCAnfScpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnMCc6Ci0gICAgICAgIGNhc2UgJzEnOgotICAgICAgICBjYXNlICcyJzoKLSAgICAgICAgY2FzZSAnMyc6Ci0gICAgICAgIGNhc2UgJzQnOgotICAgICAgICBjYXNlICc1JzoKLSAgICAgICAgY2FzZSAnNic6Ci0gICAgICAgIGNhc2UgJzcnOgotICAgICAgICBjYXNlICc4JzoKLSAgICAgICAgY2FzZSAnOSc6Ci0gICAgICAgICAgICBpID0gKnMgLSAnMCc7Ci0gICAgICAgICAgICB3aGlsZSAoYXBfaXNkaWdpdCgqKytzKSkgewotICAgICAgICAgICAgICAgIGkgPSBpICogMTAgKyAoKnMpIC0gJzAnOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFpdC0+Y29uZGl0aW9ucykgewotICAgICAgICAgICAgICAgIGl0LT5jb25kaXRpb25zID0gYXBfbWFrZV9hcnJheShwLCA0LCBzaXplb2YoaW50KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqKGludCAqKSBhcF9wdXNoX2FycmF5KGl0LT5jb25kaXRpb25zKSA9IGk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgbCA9IGZpbmRfbG9nX2Z1bmMoKnMrKyk7Ci0gICAgICAgICAgICBpZiAoIWwpIHsKLSAgICAgICAgICAgICAgICBjaGFyIGR1bW15WzJdOwotCi0gICAgICAgICAgICAgICAgZHVtbXlbMF0gPSBzWy0xXTsKLSAgICAgICAgICAgICAgICBkdW1teVsxXSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFwX3BzdHJjYXQocCwgIlVucmVjb2duaXplZCBMb2dGb3JtYXQgZGlyZWN0aXZlICUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bW15LCBOVUxMKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGl0LT5mdW5jID0gbC0+ZnVuYzsKLSAgICAgICAgICAgIGlmIChpdC0+d2FudF9vcmlnID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgaXQtPndhbnRfb3JpZyA9IGwtPndhbnRfb3JpZ19kZWZhdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKnNhID0gczsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICJSYW4gb2ZmIGVuZCBvZiBMb2dGb3JtYXQgcGFyc2luZyBhcmdzIHRvIHNvbWUgZGlyZWN0aXZlIjsKLX0KLQotc3RhdGljIGFwX2FycmF5X2hlYWRlcl90ICpwYXJzZV9sb2dfc3RyaW5nKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqKmVycikKLXsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqYSA9IGFwX21ha2VfYXJyYXkocCwgMzAsIHNpemVvZihsb2dfZm9ybWF0X2l0ZW0pKTsKLSAgICBjaGFyICpyZXM7Ci0KLSAgICB3aGlsZSAoKnMpIHsKLSAgICAgICAgaWYgKChyZXMgPSBwYXJzZV9sb2dfaXRlbShwLCAobG9nX2Zvcm1hdF9pdGVtICopIGFwX3B1c2hfYXJyYXkoYSksICZzKSkpIHsKLSAgICAgICAgICAgICplcnIgPSByZXM7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHMgPSAiXG4iOwotICAgIHBhcnNlX2xvZ19pdGVtKHAsIChsb2dfZm9ybWF0X2l0ZW0gKikgYXBfcHVzaF9hcnJheShhKSwgJnMpOwotICAgIHJldHVybiBhOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBBY3R1YWxseSBsb2dnaW5nLgotICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpwcm9jZXNzX2l0ZW0ocmVxdWVzdF9yZWMgKnIsIHJlcXVlc3RfcmVjICpvcmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfZm9ybWF0X2l0ZW0gKml0ZW0pCi17Ci0gICAgY29uc3QgY2hhciAqY3A7Ci0KLSAgICAvKiBGaXJzdCwgc2VlIGlmIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGlzIHRoaW5nIGF0IGFsbC4uLiAqLwotCi0gICAgaWYgKGl0ZW0tPmNvbmRpdGlvbnMgJiYgaXRlbS0+Y29uZGl0aW9ucy0+bmVsdHMgIT0gMCkgewotICAgICAgICBpbnQgaTsKLSAgICAgICAgaW50ICpjb25kcyA9IChpbnQgKikgaXRlbS0+Y29uZGl0aW9ucy0+ZWx0czsKLSAgICAgICAgaW50IGluX2xpc3QgPSAwOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtLT5jb25kaXRpb25zLT5uZWx0czsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoci0+c3RhdHVzID09IGNvbmRzW2ldKSB7Ci0gICAgICAgICAgICAgICAgaW5fbGlzdCA9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKGl0ZW0tPmNvbmRpdGlvbl9zZW5zZSAmJiBpbl9saXN0KQotICAgICAgICAgICAgfHwgKCFpdGVtLT5jb25kaXRpb25fc2Vuc2UgJiYgIWluX2xpc3QpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIi0iOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogV2UgZG8uICBEbyBpdC4uLiAqLwotCi0gICAgY3AgPSAoKml0ZW0tPmZ1bmMpIChpdGVtLT53YW50X29yaWcgPyBvcmlnIDogciwgaXRlbS0+YXJnKTsKLSAgICByZXR1cm4gY3AgPyBjcCA6ICItIjsKLX0KLQotI2lmZGVmIEJVRkZFUkVEX0xPR1MKLXN0YXRpYyB2b2lkIGZsdXNoX2xvZyhjb25maWdfbG9nX3N0YXRlICpjbHMpCi17Ci0gICAgaWYgKGNscy0+b3V0Y250ICYmIGNscy0+bG9nX2ZkICE9IE5VTEwpIHsKLSAgICAgICAgYXBfd3JpdGUoY2xzLT5sb2dfZmQsIGNscy0+b3V0YnVmLCBjbHMtPm91dGNudCk7Ci0gICAgICAgIGNscy0+b3V0Y250ID0gMDsKLSAgICB9Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCBjb25maWdfbG9nX3RyYW5zYWN0aW9uKHJlcXVlc3RfcmVjICpyLCBjb25maWdfbG9nX3N0YXRlICpjbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfYXJyYXlfaGVhZGVyX3QgKmRlZmF1bHRfZm9ybWF0KQotewotICAgIGxvZ19mb3JtYXRfaXRlbSAqaXRlbXM7Ci0gICAgY2hhciAqc3RyLCAqczsKLSAgICBjb25zdCBjaGFyICoqc3RyczsKLSAgICBpbnQgKnN0cmw7Ci0gICAgcmVxdWVzdF9yZWMgKm9yaWc7Ci0gICAgaW50IGk7Ci0gICAgYXBfc3NpemVfdCBsZW4gPSAwOwotICAgIGFwX2FycmF5X2hlYWRlcl90ICpmb3JtYXQ7Ci0gICAgY2hhciAqZW52YXI7Ci0KLSAgICBpZiAoY2xzLT5mbmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNlZSBpZiB3ZSd2ZSBnb3QgYW55IGNvbmRpdGlvbmFsIGVudmFyaWFibGUtY29udHJvbGxlZCBsb2dnaW5nIGRlY2lzaW9ucwotICAgICAqIHRvIG1ha2UuCi0gICAgICovCi0gICAgaWYgKGNscy0+Y29uZGl0aW9uX3ZhciAhPSBOVUxMKSB7Ci0JZW52YXIgPSBjbHMtPmNvbmRpdGlvbl92YXI7Ci0JaWYgKCplbnZhciAhPSAnIScpIHsKLQkgICAgaWYgKGFwX3RhYmxlX2dldChyLT5zdWJwcm9jZXNzX2VudiwgZW52YXIpID09IE5VTEwpIHsKLQkJcmV0dXJuIERFQ0xJTkVEOwotCSAgICB9Ci0JfQotCWVsc2UgewotCSAgICBpZiAoYXBfdGFibGVfZ2V0KHItPnN1YnByb2Nlc3NfZW52LCAmZW52YXJbMV0pICE9IE5VTEwpIHsKLQkJcmV0dXJuIERFQ0xJTkVEOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIGZvcm1hdCA9IGNscy0+Zm9ybWF0ID8gY2xzLT5mb3JtYXQgOiBkZWZhdWx0X2Zvcm1hdDsKLQotICAgIHN0cnMgPSBhcF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKGNoYXIgKikgKiAoZm9ybWF0LT5uZWx0cykpOwotICAgIHN0cmwgPSBhcF9wYWxsb2Moci0+cG9vbCwgc2l6ZW9mKGludCkgKiAoZm9ybWF0LT5uZWx0cykpOwotICAgIGl0ZW1zID0gKGxvZ19mb3JtYXRfaXRlbSAqKSBmb3JtYXQtPmVsdHM7Ci0KLSAgICBvcmlnID0gcjsKLSAgICB3aGlsZSAob3JpZy0+cHJldikgewotICAgICAgICBvcmlnID0gb3JpZy0+cHJldjsKLSAgICB9Ci0gICAgd2hpbGUgKHItPm5leHQpIHsKLSAgICAgICAgciA9IHItPm5leHQ7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IGZvcm1hdC0+bmVsdHM7ICsraSkgewotICAgICAgICBzdHJzW2ldID0gcHJvY2Vzc19pdGVtKHIsIG9yaWcsICZpdGVtc1tpXSk7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IGZvcm1hdC0+bmVsdHM7ICsraSkgewotICAgICAgICBsZW4gKz0gc3RybFtpXSA9IHN0cmxlbihzdHJzW2ldKTsKLSAgICB9Ci0KLSNpZmRlZiBCVUZGRVJFRF9MT0dTCi0gICAgaWYgKGxlbiArIGNscy0+b3V0Y250ID4gTE9HX0JVRlNJWkUpIHsKLSAgICAgICAgZmx1c2hfbG9nKGNscyk7Ci0gICAgfQotICAgIGlmIChsZW4gPj0gTE9HX0JVRlNJWkUpIHsKLSAgICAgICAgc3RyID0gYXBfcGFsbG9jKHItPnBvb2wsIGxlbiArIDEpOwotICAgICAgICBmb3IgKGkgPSAwLCBzID0gc3RyOyBpIDwgZm9ybWF0LT5uZWx0czsgKytpKSB7Ci0gICAgICAgICAgICBtZW1jcHkocywgc3Ryc1tpXSwgc3RybFtpXSk7Ci0gICAgICAgICAgICBzICs9IHN0cmxbaV07Ci0gICAgICAgIH0KLSAgICAgICAgYXBfd3JpdGUoY2xzLT5sb2dfZmQsIHN0ciwgbGVuKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZvciAoaSA9IDAsIHMgPSAmY2xzLT5vdXRidWZbY2xzLT5vdXRjbnRdOyBpIDwgZm9ybWF0LT5uZWx0czsgKytpKSB7Ci0gICAgICAgICAgICBtZW1jcHkocywgc3Ryc1tpXSwgc3RybFtpXSk7Ci0gICAgICAgICAgICBzICs9IHN0cmxbaV07Ci0gICAgICAgIH0KLSAgICAgICAgY2xzLT5vdXRjbnQgKz0gbGVuOwotICAgIH0KLSNlbHNlCi0gICAgc3RyID0gYXBfcGFsbG9jKHItPnBvb2wsIGxlbiArIDEpOwotCi0gICAgZm9yIChpID0gMCwgcyA9IHN0cjsgaSA8IGZvcm1hdC0+bmVsdHM7ICsraSkgewotICAgICAgICBtZW1jcHkocywgc3Ryc1tpXSwgc3RybFtpXSk7Ci0gICAgICAgIHMgKz0gc3RybFtpXTsKLSAgICB9Ci0KLSAgICBhcF93cml0ZShjbHMtPmxvZ19mZCwgc3RyLCAmbGVuKTsKLSNlbmRpZgotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgaW50IG11bHRpX2xvZ190cmFuc2FjdGlvbihyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBtdWx0aV9sb2dfc3RhdGUgKm1scyA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZywKLQkJCQkJCSZjb25maWdfbG9nX21vZHVsZSk7Ci0gICAgY29uZmlnX2xvZ19zdGF0ZSAqY2xzYXJyYXk7Ci0gICAgaW50IGk7Ci0KLSAgICAvKgotICAgICAqIExvZyB0aGlzIHRyYW5zYWN0aW9uLi4KLSAgICAgKi8KLSAgICBpZiAobWxzLT5jb25maWdfbG9ncy0+bmVsdHMpIHsKLSAgICAgICAgY2xzYXJyYXkgPSAoY29uZmlnX2xvZ19zdGF0ZSAqKSBtbHMtPmNvbmZpZ19sb2dzLT5lbHRzOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWxzLT5jb25maWdfbG9ncy0+bmVsdHM7ICsraSkgewotICAgICAgICAgICAgY29uZmlnX2xvZ19zdGF0ZSAqY2xzID0gJmNsc2FycmF5W2ldOwotCi0gICAgICAgICAgICBjb25maWdfbG9nX3RyYW5zYWN0aW9uKHIsIGNscywgbWxzLT5kZWZhdWx0X2Zvcm1hdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAobWxzLT5zZXJ2ZXJfY29uZmlnX2xvZ3MpIHsKLSAgICAgICAgY2xzYXJyYXkgPSAoY29uZmlnX2xvZ19zdGF0ZSAqKSBtbHMtPnNlcnZlcl9jb25maWdfbG9ncy0+ZWx0czsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG1scy0+c2VydmVyX2NvbmZpZ19sb2dzLT5uZWx0czsgKytpKSB7Ci0gICAgICAgICAgICBjb25maWdfbG9nX3N0YXRlICpjbHMgPSAmY2xzYXJyYXlbaV07Ci0KLSAgICAgICAgICAgIGNvbmZpZ19sb2dfdHJhbnNhY3Rpb24ociwgY2xzLCBtbHMtPmRlZmF1bHRfZm9ybWF0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTW9kdWxlIGdsdWUuLi4KLSAqLwotCi1zdGF0aWMgdm9pZCAqbWFrZV9jb25maWdfbG9nX3N0YXRlKGFwX2NvbnRleHRfdCAqcCwgc2VydmVyX3JlYyAqcykKLXsKLSAgICBtdWx0aV9sb2dfc3RhdGUgKm1sczsKLQotICAgIG1scyA9IChtdWx0aV9sb2dfc3RhdGUgKikgYXBfcGFsbG9jKHAsIHNpemVvZihtdWx0aV9sb2dfc3RhdGUpKTsKLSAgICBtbHMtPmNvbmZpZ19sb2dzID0gYXBfbWFrZV9hcnJheShwLCAxLCBzaXplb2YoY29uZmlnX2xvZ19zdGF0ZSkpOwotICAgIG1scy0+ZGVmYXVsdF9mb3JtYXRfc3RyaW5nID0gTlVMTDsKLSAgICBtbHMtPmRlZmF1bHRfZm9ybWF0ID0gTlVMTDsKLSAgICBtbHMtPnNlcnZlcl9jb25maWdfbG9ncyA9IE5VTEw7Ci0gICAgbWxzLT5mb3JtYXRzID0gYXBfbWFrZV90YWJsZShwLCA0KTsKLSAgICBhcF90YWJsZV9zZXRuKG1scy0+Zm9ybWF0cywgIkNMRiIsIERFRkFVTFRfTE9HX0ZPUk1BVCk7Ci0KLSAgICByZXR1cm4gbWxzOwotfQotCi0vKgotICogVXNlIHRoZSBtZXJnZXIgdG8gc2ltcGx5IGFkZCBhIHBvaW50ZXIgZnJvbSB0aGUgdmhvc3QgbG9nIHN0YXRlCi0gKiB0byB0aGUgbG9nIG9mIGxvZ3Mgc3BlY2lmaWVkIGZvciB0aGUgbm9uLXZob3N0IGNvbmZpZ3VyYXRpb24uICBNYWtlIHN1cmUKLSAqIHZob3N0cyBpbmhlcml0IGFueSBnbG9iYWxseS1kZWZpbmVkIGZvcm1hdCBuYW1lcy4KLSAqLwotCi1zdGF0aWMgdm9pZCAqbWVyZ2VfY29uZmlnX2xvZ19zdGF0ZShhcF9jb250ZXh0X3QgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICphZGR2KQotewotICAgIG11bHRpX2xvZ19zdGF0ZSAqYmFzZSA9IChtdWx0aV9sb2dfc3RhdGUgKikgYmFzZXY7Ci0gICAgbXVsdGlfbG9nX3N0YXRlICphZGQgPSAobXVsdGlfbG9nX3N0YXRlICopIGFkZHY7Ci0KLSAgICBhZGQtPnNlcnZlcl9jb25maWdfbG9ncyA9IGJhc2UtPmNvbmZpZ19sb2dzOwotICAgIGlmICghYWRkLT5kZWZhdWx0X2Zvcm1hdCkgewotICAgICAgICBhZGQtPmRlZmF1bHRfZm9ybWF0X3N0cmluZyA9IGJhc2UtPmRlZmF1bHRfZm9ybWF0X3N0cmluZzsKLSAgICAgICAgYWRkLT5kZWZhdWx0X2Zvcm1hdCA9IGJhc2UtPmRlZmF1bHRfZm9ybWF0OwotICAgIH0KLSAgICBhZGQtPmZvcm1hdHMgPSBhcF9vdmVybGF5X3RhYmxlcyhwLCBiYXNlLT5mb3JtYXRzLCBhZGQtPmZvcm1hdHMpOwotCi0gICAgcmV0dXJuIGFkZDsKLX0KLQotLyoKLSAqIFNldCB0aGUgZGVmYXVsdCBsb2dmaWxlIGZvcm1hdCwgb3IgZGVmaW5lIGEgbmlja25hbWUgZm9yIGEgZm9ybWF0IHN0cmluZy4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmxvZ19mb3JtYXQoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICpmbXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpuYW1lKQotewotICAgIGNvbnN0IGNoYXIgKmVycl9zdHJpbmcgPSBOVUxMOwotICAgIG11bHRpX2xvZ19zdGF0ZSAqbWxzID0gYXBfZ2V0X21vZHVsZV9jb25maWcoY21kLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsCi0JCQkJCQkmY29uZmlnX2xvZ19tb2R1bGUpOwotCi0gICAgLyoKLSAgICAgKiBJZiB3ZSB3ZXJlIGdpdmVuIHR3byBhcmd1bWVudHMsIHRoZSBzZWNvbmQgaXMgYSBuYW1lIHRvIGJlIGdpdmVuIHRvIHRoZQotICAgICAqIGZvcm1hdC4gIFRoaXMgc3ludGF4IGp1c3QgZGVmaW5lcyB0aGUgbmlja25hbWUgLSBpdCBkb2Vzbid0IGFjdHVhbGx5Ci0gICAgICogbWFrZSB0aGUgZm9ybWF0IHRoZSBkZWZhdWx0LgotICAgICAqLwotICAgIGlmIChuYW1lICE9IE5VTEwpIHsKLSAgICAgICAgcGFyc2VfbG9nX3N0cmluZyhjbWQtPnBvb2wsIGZtdCwgJmVycl9zdHJpbmcpOwotICAgICAgICBpZiAoZXJyX3N0cmluZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBhcF90YWJsZV9zZXRuKG1scy0+Zm9ybWF0cywgbmFtZSwgZm10KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgbWxzLT5kZWZhdWx0X2Zvcm1hdF9zdHJpbmcgPSBmbXQ7Ci0gICAgICAgIG1scy0+ZGVmYXVsdF9mb3JtYXQgPSBwYXJzZV9sb2dfc3RyaW5nKGNtZC0+cG9vbCwgZm10LCAmZXJyX3N0cmluZyk7Ci0gICAgfQotICAgIHJldHVybiBlcnJfc3RyaW5nOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICphZGRfY3VzdG9tX2xvZyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmZtdCwgY2hhciAqZW52Y2xhdXNlKQotewotICAgIGNvbnN0IGNoYXIgKmVycl9zdHJpbmcgPSBOVUxMOwotICAgIG11bHRpX2xvZ19zdGF0ZSAqbWxzID0gYXBfZ2V0X21vZHVsZV9jb25maWcoY21kLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsCi0JCQkJCQkmY29uZmlnX2xvZ19tb2R1bGUpOwotICAgIGNvbmZpZ19sb2dfc3RhdGUgKmNsczsKLQotICAgIGNscyA9IChjb25maWdfbG9nX3N0YXRlICopIGFwX3B1c2hfYXJyYXkobWxzLT5jb25maWdfbG9ncyk7Ci0gICAgY2xzLT5jb25kaXRpb25fdmFyID0gTlVMTDsKLSAgICBpZiAoZW52Y2xhdXNlICE9IE5VTEwpIHsKLQlpZiAoc3RybmNhc2VjbXAoZW52Y2xhdXNlLCAiZW52PSIsIDQpICE9IDApIHsKLQkgICAgcmV0dXJuICJlcnJvciBpbiBjb25kaXRpb24gY2xhdXNlIjsKLQl9Ci0JaWYgKChlbnZjbGF1c2VbNF0gPT0gJ1wwJykKLQkgICAgfHwgKChlbnZjbGF1c2VbNF0gPT0gJyEnKSAmJiAoZW52Y2xhdXNlWzVdID09ICdcMCcpKSkgewotCSAgICByZXR1cm4gIm1pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSI7Ci0JfQotCWNscy0+Y29uZGl0aW9uX3ZhciA9IGFwX3BzdHJkdXAoY21kLT5wb29sLCAmZW52Y2xhdXNlWzRdKTsKLSAgICB9Ci0KLSAgICBjbHMtPmZuYW1lID0gZm47Ci0gICAgY2xzLT5mb3JtYXRfc3RyaW5nID0gZm10OwotICAgIGlmIChmbXQgPT0gTlVMTCkgewotICAgICAgICBjbHMtPmZvcm1hdCA9IE5VTEw7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBjbHMtPmZvcm1hdCA9IHBhcnNlX2xvZ19zdHJpbmcoY21kLT5wb29sLCBmbXQsICZlcnJfc3RyaW5nKTsKLSAgICB9Ci0gICAgY2xzLT5sb2dfZmQgPSBOVUxMOwotCi0gICAgcmV0dXJuIGVycl9zdHJpbmc7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfdHJhbnNmZXJfbG9nKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqZm4pCi17Ci0gICAgcmV0dXJuIGFkZF9jdXN0b21fbG9nKGNtZCwgZHVtbXksIGZuLCBOVUxMLCBOVUxMKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9jb29raWVfbG9nKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqZm4pCi17Ci0gICAgcmV0dXJuIGFkZF9jdXN0b21fbG9nKGNtZCwgZHVtbXksIGZuLCAiJXtDb29raWV9biBcIiVyXCIgJXQiLCBOVUxMKTsKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIGNvbmZpZ19sb2dfY21kc1tdID0KLXsKLSAgICB7IkN1c3RvbUxvZyIsIGFkZF9jdXN0b21fbG9nLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UyMywKLSAgICAgImEgZmlsZSBuYW1lLCBhIGN1c3RvbSBsb2cgZm9ybWF0IHN0cmluZyBvciBmb3JtYXQgbmFtZSwgIgotICAgICAiYW5kIGFuIG9wdGlvbmFsIFwiZW52PVwiIGNsYXVzZSAoc2VlIGRvY3MpIn0sCi0gICAgeyJUcmFuc2ZlckxvZyIsIHNldF90cmFuc2Zlcl9sb2csIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICAgICJ0aGUgZmlsZW5hbWUgb2YgdGhlIGFjY2VzcyBsb2cifSwKLSAgICB7IkxvZ0Zvcm1hdCIsIGxvZ19mb3JtYXQsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEyLAotICAgICAiYSBsb2cgZm9ybWF0IHN0cmluZyAoc2VlIGRvY3MpIGFuZCBhbiBvcHRpb25hbCBmb3JtYXQgbmFtZSJ9LAotICAgIHsiQ29va2llTG9nIiwgc2V0X2Nvb2tpZV9sb2csIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICAgICJ0aGUgZmlsZW5hbWUgb2YgdGhlIGNvb2tpZSBsb2cifSwKLSAgICB7TlVMTH0KLX07Ci0KLXN0YXRpYyBjb25maWdfbG9nX3N0YXRlICpvcGVuX2NvbmZpZ19sb2coc2VydmVyX3JlYyAqcywgYXBfY29udGV4dF90ICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfbG9nX3N0YXRlICpjbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX2FycmF5X2hlYWRlcl90ICpkZWZhdWx0X2Zvcm1hdCkKLXsKLSAgICBhcF9zdGF0dXNfdCBzdGF0dXM7Ci0KLSAgICBpZiAoY2xzLT5sb2dfZmQgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gY2xzOyAgICAgICAgICAgICAvKiB2aXJ0dWFsIGNvbmZpZyBzaGFyZWQgdy9tYWluIHNlcnZlciAqLwotICAgIH0KLQotICAgIGlmIChjbHMtPmZuYW1lID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGNsczsgICAgICAgICAgICAgLyogTGVhdmUgaXQgTlVMTCB0byBkZWNsaW5lLiAgKi8KLSAgICB9Ci0KLSAgICBpZiAoKmNscy0+Zm5hbWUgPT0gJ3wnKSB7Ci0gICAgICAgIHBpcGVkX2xvZyAqcGw7Ci0KLSAgICAgICAgcGwgPSBhcF9vcGVuX3BpcGVkX2xvZyhwLCBjbHMtPmZuYW1lICsgMSk7Ci0gICAgICAgIGlmIChwbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgICAgIGNscy0+bG9nX2ZkID0gYXBfcGlwZWRfbG9nX3dyaXRlX2ZkKHBsKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKmZuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocCwgY2xzLT5mbmFtZSk7Ci0gICAgICAgIGlmICgoc3RhdHVzID0gYXBfb3BlbigmY2xzLT5sb2dfZmQsIGZuYW1lLCB4ZmVyX2ZsYWdzLCB4ZmVyX21vZGUsIHApKSAKLSAgICAgICAgICAgICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBzdGF0dXMsIHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBvcGVuIHRyYW5zZmVyIGxvZyBmaWxlICVzLiIsIGZuYW1lKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0jaWZkZWYgQlVGRkVSRURfTE9HUwotICAgIGNscy0+b3V0Y250ID0gMDsKLSNlbmRpZgotCi0gICAgcmV0dXJuIGNsczsKLX0KLQotc3RhdGljIGNvbmZpZ19sb2dfc3RhdGUgKm9wZW5fbXVsdGlfbG9ncyhzZXJ2ZXJfcmVjICpzLCBhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgaW50IGk7Ci0gICAgbXVsdGlfbG9nX3N0YXRlICptbHMgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZ19sb2dfbW9kdWxlKTsKLSAgICBjb25maWdfbG9nX3N0YXRlICpjbHNhcnJheTsKLSAgICBjb25zdCBjaGFyICpkdW1teTsKLSAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0KLSAgICBpZiAobWxzLT5kZWZhdWx0X2Zvcm1hdF9zdHJpbmcpIHsKLQlmb3JtYXQgPSBhcF90YWJsZV9nZXQobWxzLT5mb3JtYXRzLCBtbHMtPmRlZmF1bHRfZm9ybWF0X3N0cmluZyk7Ci0JaWYgKGZvcm1hdCkgewotCSAgICBtbHMtPmRlZmF1bHRfZm9ybWF0ID0gcGFyc2VfbG9nX3N0cmluZyhwLCBmb3JtYXQsICZkdW1teSk7Ci0JfQotICAgIH0gICAgCi0KLSAgICBpZiAoIW1scy0+ZGVmYXVsdF9mb3JtYXQpIHsKLSAgICAgICAgbWxzLT5kZWZhdWx0X2Zvcm1hdCA9IHBhcnNlX2xvZ19zdHJpbmcocCwgREVGQVVMVF9MT0dfRk9STUFULCAmZHVtbXkpOwotICAgIH0KLQotICAgIGlmIChtbHMtPmNvbmZpZ19sb2dzLT5uZWx0cykgewotICAgICAgICBjbHNhcnJheSA9IChjb25maWdfbG9nX3N0YXRlICopIG1scy0+Y29uZmlnX2xvZ3MtPmVsdHM7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBtbHMtPmNvbmZpZ19sb2dzLT5uZWx0czsgKytpKSB7Ci0gICAgICAgICAgICBjb25maWdfbG9nX3N0YXRlICpjbHMgPSAmY2xzYXJyYXlbaV07Ci0KLQkgICAgaWYgKGNscy0+Zm9ybWF0X3N0cmluZykgewotCQlmb3JtYXQgPSBhcF90YWJsZV9nZXQobWxzLT5mb3JtYXRzLCBjbHMtPmZvcm1hdF9zdHJpbmcpOwotCQlpZiAoZm9ybWF0KSB7Ci0JCSAgICBjbHMtPmZvcm1hdCA9IHBhcnNlX2xvZ19zdHJpbmcocCwgZm9ybWF0LCAmZHVtbXkpOwotCQl9Ci0JICAgIH0KLQotICAgICAgICAgICAgY2xzID0gb3Blbl9jb25maWdfbG9nKHMsIHAsIGNscywgbWxzLT5kZWZhdWx0X2Zvcm1hdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAobWxzLT5zZXJ2ZXJfY29uZmlnX2xvZ3MpIHsKLSAgICAgICAgY2xzYXJyYXkgPSAoY29uZmlnX2xvZ19zdGF0ZSAqKSBtbHMtPnNlcnZlcl9jb25maWdfbG9ncy0+ZWx0czsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG1scy0+c2VydmVyX2NvbmZpZ19sb2dzLT5uZWx0czsgKytpKSB7Ci0gICAgICAgICAgICBjb25maWdfbG9nX3N0YXRlICpjbHMgPSAmY2xzYXJyYXlbaV07Ci0KLQkgICAgaWYgKGNscy0+Zm9ybWF0X3N0cmluZykgewotCQlmb3JtYXQgPSBhcF90YWJsZV9nZXQobWxzLT5mb3JtYXRzLCBjbHMtPmZvcm1hdF9zdHJpbmcpOwotCQlpZiAoZm9ybWF0KSB7Ci0JCSAgICBjbHMtPmZvcm1hdCA9IHBhcnNlX2xvZ19zdHJpbmcocCwgZm9ybWF0LCAmZHVtbXkpOwotCQl9Ci0JICAgIH0KLQotICAgICAgICAgICAgY2xzID0gb3Blbl9jb25maWdfbG9nKHMsIHAsIGNscywgbWxzLT5kZWZhdWx0X2Zvcm1hdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgaW5pdF9jb25maWdfbG9nKGFwX2NvbnRleHRfdCAqcGMsIGFwX2NvbnRleHRfdCAqcCwgYXBfY29udGV4dF90ICpwdCwgc2VydmVyX3JlYyAqcykKLXsKLSAgICAvKiBGaXJzdCwgZG8gInBoeXNpY2FsIiBzZXJ2ZXIsIHdoaWNoIGdldHMgZGVmYXVsdCBsb2cgZmQgYW5kIGZvcm1hdAotICAgICAqIGZvciB0aGUgdmlydHVhbCBzZXJ2ZXJzLCBpZiB0aGV5IGRvbid0IG92ZXJyaWRlLi4uCi0gICAgICovCi0KLSAgICBvcGVuX211bHRpX2xvZ3MocywgcCk7Ci0KLSAgICAvKiBUaGVuLCB2aXJ0dWFsIHNlcnZlcnMgKi8KLQotICAgIGZvciAocyA9IHMtPm5leHQ7IHM7IHMgPSBzLT5uZXh0KSB7Ci0gICAgICAgIG9wZW5fbXVsdGlfbG9ncyhzLCBwKTsKLSAgICB9Ci0jaWZkZWYgQlVGRkVSRURfTE9HUwotCS8qIE5vdyByZWdpc3RlciB0aGUgbGFzdCBidWZmZXIgZmx1c2ggd2l0aCB0aGUgY2xlYW51cCBlbmdpbmUgKi8KLQlhcF9yZWdpc3Rlcl9jbGVhbnVwKHAgLCBzLCBmbHVzaF9hbGxfbG9ncywgZmx1c2hfYWxsX2xvZ3MpOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBCVUZGRVJFRF9MT0dTCi1zdGF0aWMgdm9pZCBmbHVzaF9hbGxfbG9ncyhzZXJ2ZXJfcmVjICpzKQotewotICAgIG11bHRpX2xvZ19zdGF0ZSAqbWxzOwotICAgIGFwX2FycmF5X2hlYWRlcl90ICpsb2dfbGlzdDsKLSAgICBjb25maWdfbG9nX3N0YXRlICpjbHNhcnJheTsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoOyBzOyBzID0gcy0+bmV4dCkgewotICAgICAgICBtbHMgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAmY29uZmlnX2xvZ19tb2R1bGUpOwotICAgICAgICBsb2dfbGlzdCA9IE5VTEw7Ci0gICAgICAgIGlmIChtbHMtPmNvbmZpZ19sb2dzLT5uZWx0cykgewotICAgICAgICAgICAgbG9nX2xpc3QgPSBtbHMtPmNvbmZpZ19sb2dzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG1scy0+c2VydmVyX2NvbmZpZ19sb2dzKSB7Ci0gICAgICAgICAgICBsb2dfbGlzdCA9IG1scy0+c2VydmVyX2NvbmZpZ19sb2dzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb2dfbGlzdCkgewotICAgICAgICAgICAgY2xzYXJyYXkgPSAoY29uZmlnX2xvZ19zdGF0ZSAqKSBsb2dfbGlzdC0+ZWx0czsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsb2dfbGlzdC0+bmVsdHM7ICsraSkgewotICAgICAgICAgICAgICAgIGZsdXNoX2xvZygmY2xzYXJyYXlbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIHJlZ2lzdGVyX2hvb2tzKHZvaWQpCi17Ci0gICAgYXBfaG9va19vcGVuX2xvZ3MoaW5pdF9jb25maWdfbG9nLE5VTEwsTlVMTCxIT09LX01JRERMRSk7Ci0gICAgYXBfaG9va19sb2dfdHJhbnNhY3Rpb24obXVsdGlfbG9nX3RyYW5zYWN0aW9uLE5VTEwsTlVMTCxIT09LX01JRERMRSk7Ci19Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBjb25maWdfbG9nX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBwZXItZGlyIGNvbmZpZyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBwZXItZGlyIGNvbmZpZyAqLwotICAgIG1ha2VfY29uZmlnX2xvZ19zdGF0ZSwgICAgICAvKiBzZXJ2ZXIgY29uZmlnICovCi0gICAgbWVyZ2VfY29uZmlnX2xvZ19zdGF0ZSwgICAgIC8qIG1lcmdlIHNlcnZlciBjb25maWcgKi8KLSAgICBjb25maWdfbG9nX2NtZHMsICAgICAgICAgICAgLyogY29tbWFuZCBhcF90YWJsZV90ICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGhhbmRsZXJzICovCi0gICAgcmVnaXN0ZXJfaG9va3MgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIGhvb2tzICovCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9sb2dnZXJzL21vZF9sb2dfY29uZmlnLmV4cCBiL21vZHVsZXMvbG9nZ2Vycy9tb2RfbG9nX2NvbmZpZy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYjkyNmYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9sb2dnZXJzL21vZF9sb2dfY29uZmlnLmV4cAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWNvbmZpZ19sb2dfbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvLmluZGVudC5wcm8gYi9tb2R1bGVzL21hcHBlcnMvLmluZGVudC5wcm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZmJlOWYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tYXBwZXJzLy5pbmRlbnQucHJvCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLWk0IC1ucHNsIC1kaTAgLWJyIC1uY2UgLWQwIC1jbGkwIC1ucGNzIC1uZmMxCi0tVEJVRkYKLS1URklMRQotLVRUUkFOUwotLVRVSU5UNAotLVRfdHJhbnMKLS1UYWxsb3dfb3B0aW9uc190Ci0tVGFwYWNoZV9zZmlvCi0tVGFycmF5X2hlYWRlcgotLVRib29sX2ludAotLVRidWZfYXJlYQotLVRidWZmX3N0cnVjdAotLVRidWZmeQotLVRjbWRfaG93Ci0tVGNtZF9wYXJtcwotLVRjb21tYW5kX3JlYwotLVRjb21tYW5kX3N0cnVjdAotLVRjb25uX3JlYwotLVRjb3JlX2Rpcl9jb25maWcKLS1UY29yZV9zZXJ2ZXJfY29uZmlnCi0tVGRpcl9tYWtlcl9mdW5jCi0tVGV2ZW50Ci0tVGdsb2JhbHNfcwotLVRoYW5kbGVyX2Z1bmMKLS1UaGFuZGxlcl9yZWMKLS1Uam9ibGlzdF9zCi0tVGxpc3Rlbl9yZWMKLS1UbWVyZ2VyX2Z1bmMKLS1UbW9kZV90Ci0tVG1vZHVsZQotLVRtb2R1bGVfc3RydWN0Ci0tVG11dGV4Ci0tVG5fbG9uZwotLVRvdGhlcl9jaGlsZF9yZWMKLS1Ub3ZlcnJpZGVzX3QKLS1UcGFyZW50X3Njb3JlCi0tVHBpZF90Ci0tVHBpcGVkX2xvZwotLVRwb29sCi0tVHJlcXVlc3RfcmVjCi0tVHJlcXVpcmVfbGluZQotLVRybGltX3QKLS1Uc2NvcmVib2FyZAotLVRzZW1hcGhvcmUKLS1Uc2VydmVyX2FkZHJfcmVjCi0tVHNlcnZlcl9yZWMKLS1Uc2VydmVyX3JlY19jaGFpbgotLVRzaG9ydF9zY29yZQotLVR0YWJsZQotLVR0YWJsZV9lbnRyeQotLVR0aHJlYWQKLS1UdV93aWRlX2ludAotLVR2dGltZV90Ci0tVHdpZGVfaW50CmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvbW9kX2FjdGlvbnMuYyBiL21vZHVsZXMvbWFwcGVycy9tb2RfYWN0aW9ucy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmY5MzE4Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWFwcGVycy9tb2RfYWN0aW9ucy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIG1vZF9hY3Rpb25zLmM6IGV4ZWN1dGVzIHNjcmlwdHMgYmFzZWQgb24gTUlNRSB0eXBlIG9yIEhUVFAgbWV0aG9kCi0gKgotICogYnkgQWxleGVpIEtvc3V0OyBiYXNlZCBvbiBtb2RfY2dpLmMsIG1vZF9taW1lLmMgYW5kIG1vZF9pbmNsdWRlcy5jLAotICogYWRhcHRlZCBieSByc3QgZnJvbSBvcmlnaW5hbCBOQ1NBIGNvZGUgYnkgUm9iIE1jQ29vbAotICoKLSAqIFVzYWdlIGluc3RydWN0aW9uczoKLSAqCi0gKiBBY3Rpb24gbWltZS90eXBlIC9jZ2ktYmluL3NjcmlwdAotICogCi0gKiB3aWxsIGFjdGl2YXRlIC9jZ2ktYmluL3NjcmlwdCB3aGVuIGEgZmlsZSBvZiBjb250ZW50IHR5cGUgbWltZS90eXBlIGlzIAotICogcmVxdWVzdGVkLiBJdCBzZW5kcyB0aGUgVVJMIGFuZCBmaWxlIHBhdGggb2YgdGhlIHJlcXVlc3RlZCBkb2N1bWVudCB1c2luZyAKLSAqIHRoZSBzdGFuZGFyZCBDR0kgUEFUSF9JTkZPIGFuZCBQQVRIX1RSQU5TTEFURUQgZW52aXJvbm1lbnQgdmFyaWFibGVzLgotICoKLSAqIFNjcmlwdCBQVVQgL2NnaS1iaW4vc2NyaXB0Ci0gKgotICogd2lsbCBhY3RpdmF0ZSAvY2dpLWJpbi9zY3JpcHQgd2hlbiBhIHJlcXVlc3QgaXMgcmVjZWl2ZWQgd2l0aCB0aGUKLSAqIEhUVFAgbWV0aG9kICJQVVQiLiAgVGhlIGF2YWlsYWJsZSBtZXRob2QgbmFtZXMgYXJlIGRlZmluZWQgaW4gaHR0cGQuaC4KLSAqIElmIHRoZSBtZXRob2QgaXMgR0VULCB0aGUgc2NyaXB0IHdpbGwgb25seSBiZSBhY3RpdmF0ZWQgaWYgdGhlIHJlcXVlc3RlZAotICogVVJJIGluY2x1ZGVzIHF1ZXJ5IGluZm9ybWF0aW9uIChzdHVmZiBhZnRlciBhID8tbWFyaykuCi0gKi8KLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJ1dGlsX3NjcmlwdC5oIgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgYXBfdGFibGVfdCAqYWN0aW9uX3R5cGVzOyAgICAgICAvKiBBZGRlZCB3aXRoIEFjdGlvbi4uLiAqLwotICAgIGNoYXIgKnNjcmlwdGVkW01FVEhPRFNdOyAgIC8qIEFkZGVkIHdpdGggU2NyaXB0Li4uICovCi19IGFjdGlvbl9kaXJfY29uZmlnOwotCi1tb2R1bGUgYWN0aW9uX21vZHVsZTsKLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9hY3Rpb25fZGlyX2NvbmZpZyhhcF9jb250ZXh0X3QgKnAsIGNoYXIgKmR1bW15KQotewotICAgIGFjdGlvbl9kaXJfY29uZmlnICpuZXcgPQotICAgIChhY3Rpb25fZGlyX2NvbmZpZyAqKSBhcF9wYWxsb2MocCwgc2l6ZW9mKGFjdGlvbl9kaXJfY29uZmlnKSk7Ci0KLSAgICBuZXctPmFjdGlvbl90eXBlcyA9IGFwX21ha2VfdGFibGUocCwgNCk7Ci0gICAgbWVtc2V0KG5ldy0+c2NyaXB0ZWQsIDAsIHNpemVvZihuZXctPnNjcmlwdGVkKSk7Ci0KLSAgICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgdm9pZCAqbWVyZ2VfYWN0aW9uX2Rpcl9jb25maWdzKGFwX2NvbnRleHRfdCAqcCwgdm9pZCAqYmFzZXYsIHZvaWQgKmFkZHYpCi17Ci0gICAgYWN0aW9uX2Rpcl9jb25maWcgKmJhc2UgPSAoYWN0aW9uX2Rpcl9jb25maWcgKikgYmFzZXY7Ci0gICAgYWN0aW9uX2Rpcl9jb25maWcgKmFkZCA9IChhY3Rpb25fZGlyX2NvbmZpZyAqKSBhZGR2OwotICAgIGFjdGlvbl9kaXJfY29uZmlnICpuZXcgPSAoYWN0aW9uX2Rpcl9jb25maWcgKikgYXBfcGFsbG9jKHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFjdGlvbl9kaXJfY29uZmlnKSk7Ci0gICAgaW50IGk7Ci0KLSAgICBuZXctPmFjdGlvbl90eXBlcyA9IGFwX292ZXJsYXlfdGFibGVzKHAsIGFkZC0+YWN0aW9uX3R5cGVzLAotCQkJCSAgICAgICBiYXNlLT5hY3Rpb25fdHlwZXMpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE1FVEhPRFM7ICsraSkgewotICAgICAgICBuZXctPnNjcmlwdGVkW2ldID0gYWRkLT5zY3JpcHRlZFtpXSA/IGFkZC0+c2NyaXB0ZWRbaV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiYXNlLT5zY3JpcHRlZFtpXTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmFkZF9hY3Rpb24oY21kX3Bhcm1zICpjbWQsIGFjdGlvbl9kaXJfY29uZmlnICogbSwgY2hhciAqdHlwZSwKLQkJCSAgICAgIGNoYXIgKnNjcmlwdCkKLXsKLSAgICBhcF90YWJsZV9zZXRuKG0tPmFjdGlvbl90eXBlcywgdHlwZSwgc2NyaXB0KTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9zY3JpcHQoY21kX3Bhcm1zICpjbWQsIGFjdGlvbl9kaXJfY29uZmlnICogbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm1ldGhvZCwgY2hhciAqc2NyaXB0KQotewotICAgIGludCBtZXRobnVtOwotCi0gICAgbWV0aG51bSA9IGFwX21ldGhvZF9udW1iZXJfb2YobWV0aG9kKTsKLSAgICBpZiAobWV0aG51bSA9PSBNX1RSQUNFKQotICAgICAgICByZXR1cm4gIlRSQUNFIG5vdCBhbGxvd2VkIGZvciBTY3JpcHQiOwotICAgIGVsc2UgaWYgKG1ldGhudW0gPT0gTV9JTlZBTElEKQotICAgICAgICByZXR1cm4gIlVua25vd24gbWV0aG9kIHR5cGUgZm9yIFNjcmlwdCI7Ci0gICAgZWxzZQotICAgICAgICBtLT5zY3JpcHRlZFttZXRobnVtXSA9IHNjcmlwdDsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgYWN0aW9uX2NtZHNbXSA9Ci17Ci0gICAgeyJBY3Rpb24iLCBhZGRfYWN0aW9uLCBOVUxMLCBPUl9GSUxFSU5GTywgVEFLRTIsCi0gICAgICJhIG1lZGlhIHR5cGUgZm9sbG93ZWQgYnkgYSBzY3JpcHQgbmFtZSJ9LAotICAgIHsiU2NyaXB0Iiwgc2V0X3NjcmlwdCwgTlVMTCwgQUNDRVNTX0NPTkYgfCBSU1JDX0NPTkYsIFRBS0UyLAotICAgICAiYSBtZXRob2QgZm9sbG93ZWQgYnkgYSBzY3JpcHQgbmFtZSJ9LAotICAgIHtOVUxMfQotfTsKLQotc3RhdGljIGludCBhY3Rpb25faGFuZGxlcihyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBhY3Rpb25fZGlyX2NvbmZpZyAqY29uZiA9IChhY3Rpb25fZGlyX2NvbmZpZyAqKQotICAgICAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywgJmFjdGlvbl9tb2R1bGUpOwotICAgIGNvbnN0IGNoYXIgKnQsICphY3Rpb24gPSByLT5oYW5kbGVyID8gci0+aGFuZGxlciA6IHItPmNvbnRlbnRfdHlwZTsKLSAgICBjb25zdCBjaGFyICpzY3JpcHQ7Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBTZXQgYWxsb3dlZCBzdHVmZiAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBNRVRIT0RTOyArK2kpIHsKLSAgICAgICAgaWYgKGNvbmYtPnNjcmlwdGVkW2ldKQotICAgICAgICAgICAgci0+YWxsb3dlZCB8PSAoMSA8PCBpKTsKLSAgICB9Ci0KLSAgICAvKiBGaXJzdCwgY2hlY2sgZm9yIHRoZSBtZXRob2QtaGFuZGxpbmcgc2NyaXB0cyAqLwotICAgIGlmIChyLT5tZXRob2RfbnVtYmVyID09IE1fR0VUKSB7Ci0gICAgICAgIGlmIChyLT5hcmdzKQotICAgICAgICAgICAgc2NyaXB0ID0gY29uZi0+c2NyaXB0ZWRbTV9HRVRdOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzY3JpcHQgPSBOVUxMOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc2NyaXB0ID0gY29uZi0+c2NyaXB0ZWRbci0+bWV0aG9kX251bWJlcl07Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgZm9yIGxvb3BpbmcsIHdoaWNoIGNhbiBoYXBwZW4gaWYgdGhlIENHSSBzY3JpcHQgaXNuJ3QgKi8KLSAgICBpZiAoc2NyaXB0ICYmIHItPnByZXYgJiYgci0+cHJldi0+cHJldikKLQlyZXR1cm4gREVDTElORUQ7Ci0KLSAgICAvKiBTZWNvbmQsIGNoZWNrIGZvciBhY3Rpb25zICh3aGljaCBvdmVycmlkZSB0aGUgbWV0aG9kIHNjcmlwdHMpICovCi0gICAgaWYgKCh0ID0gYXBfdGFibGVfZ2V0KGNvbmYtPmFjdGlvbl90eXBlcywKLQkJICAgICAgIGFjdGlvbiA/IGFjdGlvbiA6IGFwX2RlZmF1bHRfdHlwZShyKSkpKSB7Ci0Jc2NyaXB0ID0gdDsKLQlpZiAoci0+ZmluZm8ucHJvdGVjdGlvbiA9PSAwKSB7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0JCQkiRmlsZSBkb2VzIG5vdCBleGlzdDogJXMiLCByLT5maWxlbmFtZSk7Ci0JICAgIHJldHVybiBOT1RfRk9VTkQ7Ci0JfQotICAgIH0KLQotICAgIGlmIChzY3JpcHQgPT0gTlVMTCkKLQlyZXR1cm4gREVDTElORUQ7Ci0KLSAgICBhcF9pbnRlcm5hbF9yZWRpcmVjdF9oYW5kbGVyKGFwX3BzdHJjYXQoci0+cG9vbCwgc2NyaXB0LCBhcF9lc2NhcGVfdXJpKHItPnBvb2wsCi0JCQkgIHItPnVyaSksIHItPmFyZ3MgPyAiPyIgOiBOVUxMLCByLT5hcmdzLCBOVUxMKSwgcik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgY29uc3QgaGFuZGxlcl9yZWMgYWN0aW9uX2hhbmRsZXJzW10gPQotewotICAgIHsiKi8qIiwgYWN0aW9uX2hhbmRsZXJ9LAotICAgIHtOVUxMfQotfTsKLQotbW9kdWxlIGFjdGlvbl9tb2R1bGUgPQotewotICAgIFNUQU5EQVJEMjBfTU9EVUxFX1NUVUZGLAotICAgIGNyZWF0ZV9hY3Rpb25fZGlyX2NvbmZpZywJLyogZGlyIGNvbmZpZyBjcmVhdGVyICovCi0gICAgbWVyZ2VfYWN0aW9uX2Rpcl9jb25maWdzLAkvKiBkaXIgbWVyZ2VyIC0tLSBkZWZhdWx0IGlzIHRvIG92ZXJyaWRlICovCi0gICAgTlVMTCwJCQkvKiBzZXJ2ZXIgY29uZmlnICovCi0gICAgTlVMTCwJCQkvKiBtZXJnZSBzZXJ2ZXIgY29uZmlnICovCi0gICAgYWN0aW9uX2NtZHMsCQkvKiBjb21tYW5kIGFwX3RhYmxlX3QgKi8KLSAgICBhY3Rpb25faGFuZGxlcnMsCQkvKiBoYW5kbGVycyAqLwotICAgIE5VTEwJCQkvKiByZWdpc3RlciBob29rcyAqLwotfTsKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWFwcGVycy9tb2RfYWN0aW9ucy5leHAgYi9tb2R1bGVzL21hcHBlcnMvbW9kX2FjdGlvbnMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTVkZmYyLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWFwcGVycy9tb2RfYWN0aW9ucy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1hY3Rpb25fbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvbW9kX2FsaWFzLmMgYi9tb2R1bGVzL21hcHBlcnMvbW9kX2FsaWFzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZjMxNzkuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tYXBwZXJzL21vZF9hbGlhcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDE3ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIGh0dHBfYWxpYXMuYzogU3R1ZmYgZm9yIGRlYWxpbmcgd2l0aCBkaXJlY3RvcnkgYWxpYXNlcwotICogCi0gKiBPcmlnaW5hbCBieSBSb2IgTWNDb29sLCByZXdyaXR0ZW4gaW4gc3VjY2Vzc2lvbiBieSBEYXZpZCBSb2JpbnNvbgotICogYW5kIHJzdC4KLSAqIAotICovCi0KLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjaGFyICpyZWFsOwotICAgIGNoYXIgKmZha2U7Ci0gICAgY2hhciAqaGFuZGxlcjsKLSAgICByZWdleF90ICpyZWdleHA7Ci0gICAgaW50IHJlZGlyX3N0YXR1czsJCS8qIDMwMSwgMzAyLCAzMDMsIDQxMCwgZXRjICovCi19IGFsaWFzX2VudHJ5OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmFsaWFzZXM7Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKnJlZGlyZWN0czsKLX0gYWxpYXNfc2VydmVyX2NvbmY7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqcmVkaXJlY3RzOwotfSBhbGlhc19kaXJfY29uZjsKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGFsaWFzX21vZHVsZTsKLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9hbGlhc19jb25maWcoYXBfY29udGV4dF90ICpwLCBzZXJ2ZXJfcmVjICpzKQotewotICAgIGFsaWFzX3NlcnZlcl9jb25mICphID0KLSAgICAoYWxpYXNfc2VydmVyX2NvbmYgKikgYXBfcGNhbGxvYyhwLCBzaXplb2YoYWxpYXNfc2VydmVyX2NvbmYpKTsKLQotICAgIGEtPmFsaWFzZXMgPSBhcF9tYWtlX2FycmF5KHAsIDIwLCBzaXplb2YoYWxpYXNfZW50cnkpKTsKLSAgICBhLT5yZWRpcmVjdHMgPSBhcF9tYWtlX2FycmF5KHAsIDIwLCBzaXplb2YoYWxpYXNfZW50cnkpKTsKLSAgICByZXR1cm4gYTsKLX0KLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9hbGlhc19kaXJfY29uZmlnKGFwX2NvbnRleHRfdCAqcCwgY2hhciAqZCkKLXsKLSAgICBhbGlhc19kaXJfY29uZiAqYSA9Ci0gICAgKGFsaWFzX2Rpcl9jb25mICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKGFsaWFzX2Rpcl9jb25mKSk7Ci0gICAgYS0+cmVkaXJlY3RzID0gYXBfbWFrZV9hcnJheShwLCAyLCBzaXplb2YoYWxpYXNfZW50cnkpKTsKLSAgICByZXR1cm4gYTsKLX0KLQotc3RhdGljIHZvaWQgKm1lcmdlX2FsaWFzX2NvbmZpZyhhcF9jb250ZXh0X3QgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICpvdmVycmlkZXN2KQotewotICAgIGFsaWFzX3NlcnZlcl9jb25mICphID0KLSAgICAoYWxpYXNfc2VydmVyX2NvbmYgKikgYXBfcGNhbGxvYyhwLCBzaXplb2YoYWxpYXNfc2VydmVyX2NvbmYpKTsKLSAgICBhbGlhc19zZXJ2ZXJfY29uZiAqYmFzZSA9IChhbGlhc19zZXJ2ZXJfY29uZiAqKSBiYXNldiwgKm92ZXJyaWRlcyA9IChhbGlhc19zZXJ2ZXJfY29uZiAqKSBvdmVycmlkZXN2OwotCi0gICAgYS0+YWxpYXNlcyA9IGFwX2FwcGVuZF9hcnJheXMocCwgb3ZlcnJpZGVzLT5hbGlhc2VzLCBiYXNlLT5hbGlhc2VzKTsKLSAgICBhLT5yZWRpcmVjdHMgPSBhcF9hcHBlbmRfYXJyYXlzKHAsIG92ZXJyaWRlcy0+cmVkaXJlY3RzLCBiYXNlLT5yZWRpcmVjdHMpOwotICAgIHJldHVybiBhOwotfQotCi1zdGF0aWMgdm9pZCAqbWVyZ2VfYWxpYXNfZGlyX2NvbmZpZyhhcF9jb250ZXh0X3QgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICpvdmVycmlkZXN2KQotewotICAgIGFsaWFzX2Rpcl9jb25mICphID0KLSAgICAoYWxpYXNfZGlyX2NvbmYgKikgYXBfcGNhbGxvYyhwLCBzaXplb2YoYWxpYXNfZGlyX2NvbmYpKTsKLSAgICBhbGlhc19kaXJfY29uZiAqYmFzZSA9IChhbGlhc19kaXJfY29uZiAqKSBiYXNldiwgKm92ZXJyaWRlcyA9IChhbGlhc19kaXJfY29uZiAqKSBvdmVycmlkZXN2OwotICAgIGEtPnJlZGlyZWN0cyA9IGFwX2FwcGVuZF9hcnJheXMocCwgb3ZlcnJpZGVzLT5yZWRpcmVjdHMsIGJhc2UtPnJlZGlyZWN0cyk7Ci0gICAgcmV0dXJuIGE7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICphZGRfYWxpYXNfaW50ZXJuYWwoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICpmLCBjaGFyICpyLAotCQkJCSAgICAgIGludCB1c2VfcmVnZXgpCi17Ci0gICAgc2VydmVyX3JlYyAqcyA9IGNtZC0+c2VydmVyOwotICAgIGFsaWFzX3NlcnZlcl9jb25mICpjb25mID0KLSAgICAoYWxpYXNfc2VydmVyX2NvbmYgKikgYXBfZ2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywgJmFsaWFzX21vZHVsZSk7Ci0gICAgYWxpYXNfZW50cnkgKm5ldyA9IGFwX3B1c2hfYXJyYXkoY29uZi0+YWxpYXNlcyk7Ci0KLSAgICAvKiBYWCByIGNhbiBOT1QgYmUgcmVsYXRpdmUgdG8gRG9jdW1lbnRSb290IGhlcmUuLi4gY29tcGF0IGJ1Zy4gKi8KLQotICAgIGlmICh1c2VfcmVnZXgpIHsKLQluZXctPnJlZ2V4cCA9IGFwX3ByZWdjb21wKGNtZC0+cG9vbCwgZiwgUkVHX0VYVEVOREVEKTsKLQlpZiAobmV3LT5yZWdleHAgPT0gTlVMTCkKLQkgICAgcmV0dXJuICJSZWd1bGFyIGV4cHJlc3Npb24gY291bGQgbm90IGJlIGNvbXBpbGVkLiI7Ci0gICAgfQotCi0gICAgbmV3LT5mYWtlID0gZjsKLSAgICBuZXctPnJlYWwgPSByOwotICAgIG5ldy0+aGFuZGxlciA9IGNtZC0+aW5mbzsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqYWRkX2FsaWFzKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqZiwgY2hhciAqcikKLXsKLSAgICByZXR1cm4gYWRkX2FsaWFzX2ludGVybmFsKGNtZCwgZHVtbXksIGYsIHIsIDApOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqYWRkX2FsaWFzX3JlZ2V4KGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqZiwgY2hhciAqcikKLXsKLSAgICByZXR1cm4gYWRkX2FsaWFzX2ludGVybmFsKGNtZCwgZHVtbXksIGYsIHIsIDEpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqYWRkX3JlZGlyZWN0X2ludGVybmFsKGNtZF9wYXJtcyAqY21kLCBhbGlhc19kaXJfY29uZiAqIGRpcmNvbmYsCi0JCQkJCSBjaGFyICphcmcxLCBjaGFyICphcmcyLCBjaGFyICphcmczLAotCQkJCQkgaW50IHVzZV9yZWdleCkKLXsKLSAgICBhbGlhc19lbnRyeSAqbmV3OwotICAgIHNlcnZlcl9yZWMgKnMgPSBjbWQtPnNlcnZlcjsKLSAgICBhbGlhc19zZXJ2ZXJfY29uZiAqc2VydmVyY29uZiA9Ci0gICAgKGFsaWFzX3NlcnZlcl9jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsICZhbGlhc19tb2R1bGUpOwotICAgIGludCBzdGF0dXMgPSAoaW50KSAobG9uZykgY21kLT5pbmZvOwotICAgIHJlZ2V4X3QgKnIgPSBOVUxMOwotICAgIGNoYXIgKmYgPSBhcmcyOwotICAgIGNoYXIgKnVybCA9IGFyZzM7Ci0KLSAgICBpZiAoIXN0cmNhc2VjbXAoYXJnMSwgImdvbmUiKSkKLQlzdGF0dXMgPSBIVFRQX0dPTkU7Ci0gICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnMSwgInBlcm1hbmVudCIpKQotCXN0YXR1cyA9IEhUVFBfTU9WRURfUEVSTUFORU5UTFk7Ci0gICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnMSwgInRlbXAiKSkKLQlzdGF0dXMgPSBIVFRQX01PVkVEX1RFTVBPUkFSSUxZOwotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZzEsICJzZWVvdGhlciIpKQotCXN0YXR1cyA9IEhUVFBfU0VFX09USEVSOwotICAgIGVsc2UgaWYgKGFwX2lzZGlnaXQoKmFyZzEpKQotCXN0YXR1cyA9IGF0b2koYXJnMSk7Ci0gICAgZWxzZSB7Ci0JZiA9IGFyZzE7Ci0JdXJsID0gYXJnMjsKLSAgICB9Ci0KLSAgICBpZiAodXNlX3JlZ2V4KSB7Ci0JciA9IGFwX3ByZWdjb21wKGNtZC0+cG9vbCwgZiwgUkVHX0VYVEVOREVEKTsKLQlpZiAociA9PSBOVUxMKQotCSAgICByZXR1cm4gIlJlZ3VsYXIgZXhwcmVzc2lvbiBjb3VsZCBub3QgYmUgY29tcGlsZWQuIjsKLSAgICB9Ci0KLSAgICBpZiAoYXBfaXNfSFRUUF9SRURJUkVDVChzdGF0dXMpKSB7Ci0JaWYgKCF1cmwpCi0JICAgIHJldHVybiAiVVJMIHRvIHJlZGlyZWN0IHRvIGlzIG1pc3NpbmciOwotCWlmICghdXNlX3JlZ2V4ICYmICFhcF9pc191cmwodXJsKSkKLQkgICAgcmV0dXJuICJSZWRpcmVjdCB0byBub24tVVJMIjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JaWYgKHVybCkKLQkgICAgcmV0dXJuICJSZWRpcmVjdCBVUkwgbm90IHZhbGlkIGZvciB0aGlzIHN0YXR1cyI7Ci0gICAgfQotCi0gICAgaWYgKGNtZC0+cGF0aCkKLQluZXcgPSBhcF9wdXNoX2FycmF5KGRpcmNvbmYtPnJlZGlyZWN0cyk7Ci0gICAgZWxzZQotCW5ldyA9IGFwX3B1c2hfYXJyYXkoc2VydmVyY29uZi0+cmVkaXJlY3RzKTsKLQotICAgIG5ldy0+ZmFrZSA9IGY7Ci0gICAgbmV3LT5yZWFsID0gdXJsOwotICAgIG5ldy0+cmVnZXhwID0gcjsKLSAgICBuZXctPnJlZGlyX3N0YXR1cyA9IHN0YXR1czsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmFkZF9yZWRpcmVjdChjbWRfcGFybXMgKmNtZCwgYWxpYXNfZGlyX2NvbmYgKiBkaXJjb25mLCBjaGFyICphcmcxLAotCQkJCWNoYXIgKmFyZzIsIGNoYXIgKmFyZzMpCi17Ci0gICAgcmV0dXJuIGFkZF9yZWRpcmVjdF9pbnRlcm5hbChjbWQsIGRpcmNvbmYsIGFyZzEsIGFyZzIsIGFyZzMsIDApOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqYWRkX3JlZGlyZWN0X3JlZ2V4KGNtZF9wYXJtcyAqY21kLCBhbGlhc19kaXJfY29uZiAqIGRpcmNvbmYsCi0JCQkJICAgICAgY2hhciAqYXJnMSwgY2hhciAqYXJnMiwgY2hhciAqYXJnMykKLXsKLSAgICByZXR1cm4gYWRkX3JlZGlyZWN0X2ludGVybmFsKGNtZCwgZGlyY29uZiwgYXJnMSwgYXJnMiwgYXJnMywgMSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBhbGlhc19jbWRzW10gPQotewotICAgIHsiQWxpYXMiLCBhZGRfYWxpYXMsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTIsCi0gICAgICJhIGZha2VuYW1lIGFuZCBhIHJlYWxuYW1lIn0sCi0gICAgeyJTY3JpcHRBbGlhcyIsIGFkZF9hbGlhcywgImNnaS1zY3JpcHQiLCBSU1JDX0NPTkYsIFRBS0UyLAotICAgICAiYSBmYWtlbmFtZSBhbmQgYSByZWFsbmFtZSJ9LAotICAgIHsiUmVkaXJlY3QiLCBhZGRfcmVkaXJlY3QsICh2b2lkICopIEhUVFBfTU9WRURfVEVNUE9SQVJJTFksCi0gICAgIE9SX0ZJTEVJTkZPLCBUQUtFMjMsCi0gICJhbiBvcHRpb25hbCBzdGF0dXMsIHRoZW4gZG9jdW1lbnQgdG8gYmUgcmVkaXJlY3RlZCBhbmQgZGVzdGluYXRpb24gVVJMIn0sCi0gICAgeyJBbGlhc01hdGNoIiwgYWRkX2FsaWFzX3JlZ2V4LCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UyLAotICAgICAiYSByZWd1bGFyIGV4cHJlc3Npb24gYW5kIGEgZmlsZW5hbWUifSwKLSAgICB7IlNjcmlwdEFsaWFzTWF0Y2giLCBhZGRfYWxpYXNfcmVnZXgsICJjZ2ktc2NyaXB0IiwgUlNSQ19DT05GLCBUQUtFMiwKLSAgICAgImEgcmVndWxhciBleHByZXNzaW9uIGFuZCBhIGZpbGVuYW1lIn0sCi0gICAgeyJSZWRpcmVjdE1hdGNoIiwgYWRkX3JlZGlyZWN0X3JlZ2V4LCAodm9pZCAqKSBIVFRQX01PVkVEX1RFTVBPUkFSSUxZLAotICAgICBPUl9GSUxFSU5GTywgVEFLRTIzLAotICAgICAiYW4gb3B0aW9uYWwgc3RhdHVzLCB0aGVuIGEgcmVndWxhciBleHByZXNzaW9uIGFuZCBkZXN0aW5hdGlvbiBVUkwifSwKLSAgICB7IlJlZGlyZWN0VGVtcCIsIGFkZF9yZWRpcmVjdCwgKHZvaWQgKikgSFRUUF9NT1ZFRF9URU1QT1JBUklMWSwKLSAgICAgT1JfRklMRUlORk8sIFRBS0UyLAotICAgICAiYSBkb2N1bWVudCB0byBiZSByZWRpcmVjdGVkLCB0aGVuIHRoZSBkZXN0aW5hdGlvbiBVUkwifSwKLSAgICB7IlJlZGlyZWN0UGVybWFuZW50IiwgYWRkX3JlZGlyZWN0LCAodm9pZCAqKSBIVFRQX01PVkVEX1BFUk1BTkVOVExZLAotICAgICBPUl9GSUxFSU5GTywgVEFLRTIsCi0gICAgICJhIGRvY3VtZW50IHRvIGJlIHJlZGlyZWN0ZWQsIHRoZW4gdGhlIGRlc3RpbmF0aW9uIFVSTCJ9LAotICAgIHtOVUxMfQotfTsKLQotc3RhdGljIGludCBhbGlhc19tYXRjaGVzKGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgY2hhciAqYWxpYXNfZmFrZW5hbWUpCi17Ci0gICAgY29uc3QgY2hhciAqZW5kX2Zha2VuYW1lID0gYWxpYXNfZmFrZW5hbWUgKyBzdHJsZW4oYWxpYXNfZmFrZW5hbWUpOwotICAgIGNvbnN0IGNoYXIgKmFsaWFzcCA9IGFsaWFzX2Zha2VuYW1lLCAqdXJpcCA9IHVyaTsKLQotICAgIHdoaWxlIChhbGlhc3AgPCBlbmRfZmFrZW5hbWUpIHsKLQlpZiAoKmFsaWFzcCA9PSAnLycpIHsKLQkgICAgLyogYW55IG51bWJlciBvZiAnLycgaW4gdGhlIGFsaWFzIG1hdGNoZXMgYW55IG51bWJlciBpbgotCSAgICAgKiB0aGUgc3VwcGxpZWQgVVJJLCBidXQgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUuLi4KLQkgICAgICovCi0JICAgIGlmICgqdXJpcCAhPSAnLycpCi0JCXJldHVybiAwOwotCi0JICAgIHdoaWxlICgqYWxpYXNwID09ICcvJykKLQkJKythbGlhc3A7Ci0JICAgIHdoaWxlICgqdXJpcCA9PSAnLycpCi0JCSsrdXJpcDsKLQl9Ci0JZWxzZSB7Ci0JICAgIC8qIE90aGVyIGNoYXJhY3RlcnMgYXJlIGNvbXBhcmVkIGxpdGVyYWxseSAqLwotCSAgICBpZiAoKnVyaXArKyAhPSAqYWxpYXNwKyspCi0JCXJldHVybiAwOwotCX0KLSAgICB9Ci0KLSAgICAvKiBDaGVjayBsYXN0IGFsaWFzIHBhdGggY29tcG9uZW50IG1hdGNoZWQgYWxsIHRoZSB3YXkgKi8KLQotICAgIGlmIChhbGlhc3BbLTFdICE9ICcvJyAmJiAqdXJpcCAhPSAnXDAnICYmICp1cmlwICE9ICcvJykKLQlyZXR1cm4gMDsKLQotICAgIC8qIFJldHVybiBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIFVSSSB3aGljaCBtYXRjaGVkIChtYXkgYmUKLSAgICAgKiBncmVhdGVyIHRoYW4gbGVuZ3RoIG9mIGFsaWFzLCBzaW5jZSB3ZSBtYXkgaGF2ZSBtYXRjaGVkCi0gICAgICogZG91YmxlZCBzbGFzaGVzKQotICAgICAqLwotCi0gICAgcmV0dXJuIHVyaXAgLSB1cmk7Ci19Ci0KLXN0YXRpYyBjaGFyICp0cnlfYWxpYXNfbGlzdChyZXF1ZXN0X3JlYyAqciwgYXBfYXJyYXlfaGVhZGVyX3QgKmFsaWFzZXMsIGludCBkb2VzYywgaW50ICpzdGF0dXMpCi17Ci0gICAgYWxpYXNfZW50cnkgKmVudHJpZXMgPSAoYWxpYXNfZW50cnkgKikgYWxpYXNlcy0+ZWx0czsKLSAgICByZWdtYXRjaF90IHJlZ21bMTBdOwotICAgIGNoYXIgKmZvdW5kID0gTlVMTDsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBhbGlhc2VzLT5uZWx0czsgKytpKSB7Ci0JYWxpYXNfZW50cnkgKnAgPSAmZW50cmllc1tpXTsKLQlpbnQgbDsKLQotCWlmIChwLT5yZWdleHApIHsKLQkgICAgaWYgKCFhcF9yZWdleGVjKHAtPnJlZ2V4cCwgci0+dXJpLCBwLT5yZWdleHAtPnJlX25zdWIgKyAxLCByZWdtLCAwKSkgewotCQlpZiAocC0+cmVhbCkgewotCQkgICAgZm91bmQgPSBhcF9wcmVnc3ViKHItPnBvb2wsIHAtPnJlYWwsIHItPnVyaSwKLQkJCQkgICAgcC0+cmVnZXhwLT5yZV9uc3ViICsgMSwgcmVnbSk7Ci0JCSAgICBpZiAoZm91bmQgJiYgZG9lc2MpIHsKLQkJCWZvdW5kID0gYXBfZXNjYXBlX3VyaShyLT5wb29sLCBmb3VuZCk7Ci0JCSAgICB9Ci0JCX0KLQkJZWxzZSB7Ci0JCSAgICAvKiBuZWVkIHNvbWV0aGluZyBub24tbnVsbCAqLwotCQkgICAgZm91bmQgPSBhcF9wc3RyZHVwKHItPnBvb2wsICIiKTsKLQkJfQotCSAgICB9Ci0JfQotCWVsc2UgewotCSAgICBsID0gYWxpYXNfbWF0Y2hlcyhyLT51cmksIHAtPmZha2UpOwotCi0JICAgIGlmIChsID4gMCkgewotCQlpZiAoZG9lc2MpIHsKLQkJICAgIGNoYXIgKmVzY3VybDsKLQkJICAgIGVzY3VybCA9IGFwX29zX2VzY2FwZV9wYXRoKHItPnBvb2wsIHItPnVyaSArIGwsIDEpOwotCi0JCSAgICBmb3VuZCA9IGFwX3BzdHJjYXQoci0+cG9vbCwgcC0+cmVhbCwgZXNjdXJsLCBOVUxMKTsKLQkJfQotCQllbHNlCi0JCSAgICBmb3VuZCA9IGFwX3BzdHJjYXQoci0+cG9vbCwgcC0+cmVhbCwgci0+dXJpICsgbCwgTlVMTCk7Ci0JICAgIH0KLQl9Ci0KLQlpZiAoZm91bmQpIHsKLQkgICAgaWYgKHAtPmhhbmRsZXIpIHsJLyogU2V0IGhhbmRsZXIsIGFuZCBsZWF2ZSBhIG5vdGUgZm9yIG1vZF9jZ2kgKi8KLQkJci0+aGFuZGxlciA9IHAtPmhhbmRsZXI7Ci0JCWFwX3RhYmxlX3NldG4oci0+bm90ZXMsICJhbGlhcy1mb3JjZWQtdHlwZSIsIHItPmhhbmRsZXIpOwotCSAgICB9Ci0KLQkgICAgKnN0YXR1cyA9IHAtPnJlZGlyX3N0YXR1czsKLQotCSAgICByZXR1cm4gZm91bmQ7Ci0JfQotCi0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgdHJhbnNsYXRlX2FsaWFzX3JlZGlyKHJlcXVlc3RfcmVjICpyKQotewotICAgIHZvaWQgKnNjb25mID0gci0+c2VydmVyLT5tb2R1bGVfY29uZmlnOwotICAgIGFsaWFzX3NlcnZlcl9jb25mICpzZXJ2ZXJjb25mID0KLSAgICAoYWxpYXNfc2VydmVyX2NvbmYgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoc2NvbmYsICZhbGlhc19tb2R1bGUpOwotICAgIGNoYXIgKnJldDsKLSAgICBpbnQgc3RhdHVzOwotCi0gICAgaWYgKHItPnVyaVswXSAhPSAnLycgJiYgci0+dXJpWzBdICE9ICdcMCcpCi0JcmV0dXJuIERFQ0xJTkVEOwotCi0gICAgaWYgKChyZXQgPSB0cnlfYWxpYXNfbGlzdChyLCBzZXJ2ZXJjb25mLT5yZWRpcmVjdHMsIDEsICZzdGF0dXMpKSAhPSBOVUxMKSB7Ci0JaWYgKGFwX2lzX0hUVFBfUkVESVJFQ1Qoc3RhdHVzKSkgewotCSAgICAvKiBpbmNsdWRlIFFVRVJZX1NUUklORyBpZiBhbnkgKi8KLQkgICAgaWYgKHItPmFyZ3MpIHsKLQkJcmV0ID0gYXBfcHN0cmNhdChyLT5wb29sLCByZXQsICI/Iiwgci0+YXJncywgTlVMTCk7Ci0JICAgIH0KLQkgICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkxvY2F0aW9uIiwgcmV0KTsKLQl9Ci0JcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBpZiAoKHJldCA9IHRyeV9hbGlhc19saXN0KHIsIHNlcnZlcmNvbmYtPmFsaWFzZXMsIDAsICZzdGF0dXMpKSAhPSBOVUxMKSB7Ci0Jci0+ZmlsZW5hbWUgPSByZXQ7Ci0JcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotc3RhdGljIGludCBmaXh1cF9yZWRpcihyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICB2b2lkICpkY29uZiA9IHItPnBlcl9kaXJfY29uZmlnOwotICAgIGFsaWFzX2Rpcl9jb25mICpkaXJjb25mID0KLSAgICAoYWxpYXNfZGlyX2NvbmYgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoZGNvbmYsICZhbGlhc19tb2R1bGUpOwotICAgIGNoYXIgKnJldDsKLSAgICBpbnQgc3RhdHVzOwotCi0gICAgLyogSXQgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSBsYXN0IHRpbWUsIHNvIHRyeSBhZ2FpbiAqLwotCi0gICAgaWYgKChyZXQgPSB0cnlfYWxpYXNfbGlzdChyLCBkaXJjb25mLT5yZWRpcmVjdHMsIDEsICZzdGF0dXMpKSAhPSBOVUxMKSB7Ci0JaWYgKGFwX2lzX0hUVFBfUkVESVJFQ1Qoc3RhdHVzKSkKLQkgICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkxvY2F0aW9uIiwgcmV0KTsKLQlyZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotc3RhdGljIHZvaWQgcmVnaXN0ZXJfaG9va3Modm9pZCkKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFzelByZVtdPXsgIm1vZF91c2VyZGlyLmMiLE5VTEwgfTsKLQotICAgIGFwX2hvb2tfdHJhbnNsYXRlX25hbWUodHJhbnNsYXRlX2FsaWFzX3JlZGlyLGFzelByZSxOVUxMLEhPT0tfTUlERExFKTsKLSAgICBhcF9ob29rX2ZpeHVwcyhmaXh1cF9yZWRpcixOVUxMLE5VTEwsSE9PS19NSURETEUpOwotfQotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgYWxpYXNfbW9kdWxlID0KLXsKLSAgICBTVEFOREFSRDIwX01PRFVMRV9TVFVGRiwKLSAgICBjcmVhdGVfYWxpYXNfZGlyX2NvbmZpZywJLyogZGlyIGNvbmZpZyBjcmVhdGVyICovCi0gICAgbWVyZ2VfYWxpYXNfZGlyX2NvbmZpZywJLyogZGlyIG1lcmdlciAtLS0gZGVmYXVsdCBpcyB0byBvdmVycmlkZSAqLwotICAgIGNyZWF0ZV9hbGlhc19jb25maWcsCS8qIHNlcnZlciBjb25maWcgKi8KLSAgICBtZXJnZV9hbGlhc19jb25maWcsCQkvKiBtZXJnZSBzZXJ2ZXIgY29uZmlncyAqLwotICAgIGFsaWFzX2NtZHMsCQkJLyogY29tbWFuZCBhcF90YWJsZV90ICovCi0gICAgTlVMTCwJCQkvKiBoYW5kbGVycyAqLwotICAgIHJlZ2lzdGVyX2hvb2tzCQkvKiByZWdpc3RlciBob29rcyAqLwotfTsKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWFwcGVycy9tb2RfYWxpYXMuZXhwIGIvbW9kdWxlcy9tYXBwZXJzL21vZF9hbGlhcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMzg2ZWMuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tYXBwZXJzL21vZF9hbGlhcy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1hbGlhc19tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWFwcGVycy9tb2RfZGlyLmMgYi9tb2R1bGVzL21hcHBlcnMvbW9kX2Rpci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmY5YjNiLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWFwcGVycy9tb2RfZGlyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogbW9kX2Rpci5jOiBoYW5kbGUgZGVmYXVsdCBpbmRleCBmaWxlcywgYW5kIHRyYWlsaW5nLS8gcmVkaXJlY3RzCi0gKi8KLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX21haW4uaCIKLSNpbmNsdWRlICJ1dGlsX3NjcmlwdC5oIgotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgZGlyX21vZHVsZTsKLQotdHlwZWRlZiBzdHJ1Y3QgZGlyX2NvbmZpZ19zdHJ1Y3QgewotICAgIGFwX2FycmF5X2hlYWRlcl90ICppbmRleF9uYW1lczsKLX0gZGlyX2NvbmZpZ19yZWM7Ci0KLSNkZWZpbmUgRElSX0NNRF9QRVJNUyBPUl9JTkRFWEVTCi0KLXN0YXRpYyBjb25zdCBjaGFyICphZGRfaW5kZXgoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgZGlyX2NvbmZpZ19yZWMgKmQgPSBkdW1teTsKLQotICAgIGlmICghZC0+aW5kZXhfbmFtZXMpIHsKLQlkLT5pbmRleF9uYW1lcyA9IGFwX21ha2VfYXJyYXkoY21kLT5wb29sLCAyLCBzaXplb2YoY2hhciAqKSk7Ci0gICAgfQotICAgICooY2hhciAqKilhcF9wdXNoX2FycmF5KGQtPmluZGV4X25hbWVzKSA9IGFyZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIGRpcl9jbWRzW10gPQotewotICAgIHsiRGlyZWN0b3J5SW5kZXgiLCBhZGRfaW5kZXgsIE5VTEwsCi0gICAgIERJUl9DTURfUEVSTVMsIElURVJBVEUsCi0gICAgICJhIGxpc3Qgb2YgZmlsZSBuYW1lcyJ9LAotICAgIHtOVUxMfQotfTsKLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9kaXJfY29uZmlnKGFwX2NvbnRleHRfdCAqcCwgY2hhciAqZHVtbXkpCi17Ci0gICAgZGlyX2NvbmZpZ19yZWMgKm5ldyA9Ci0gICAgKGRpcl9jb25maWdfcmVjICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKGRpcl9jb25maWdfcmVjKSk7Ci0KLSAgICBuZXctPmluZGV4X25hbWVzID0gTlVMTDsKLSAgICByZXR1cm4gKHZvaWQgKikgbmV3OwotfQotCi1zdGF0aWMgdm9pZCAqbWVyZ2VfZGlyX2NvbmZpZ3MoYXBfY29udGV4dF90ICpwLCB2b2lkICpiYXNldiwgdm9pZCAqYWRkdikKLXsKLSAgICBkaXJfY29uZmlnX3JlYyAqbmV3ID0gKGRpcl9jb25maWdfcmVjICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKGRpcl9jb25maWdfcmVjKSk7Ci0gICAgZGlyX2NvbmZpZ19yZWMgKmJhc2UgPSAoZGlyX2NvbmZpZ19yZWMgKikgYmFzZXY7Ci0gICAgZGlyX2NvbmZpZ19yZWMgKmFkZCA9IChkaXJfY29uZmlnX3JlYyAqKSBhZGR2OwotCi0gICAgbmV3LT5pbmRleF9uYW1lcyA9IGFkZC0+aW5kZXhfbmFtZXMgPyBhZGQtPmluZGV4X25hbWVzIDogYmFzZS0+aW5kZXhfbmFtZXM7Ci0gICAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIGludCBoYW5kbGVfZGlyKHJlcXVlc3RfcmVjICpyKQotewotICAgIGRpcl9jb25maWdfcmVjICpkID0KLSAgICAoZGlyX2NvbmZpZ19yZWMgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJfbW9kdWxlKTsKLSAgICBjaGFyICpkdW1teV9wdHJbMV07Ci0gICAgY2hhciAqKm5hbWVzX3B0cjsKLSAgICBpbnQgbnVtX25hbWVzOwotICAgIGludCBlcnJvcl9ub3Rmb3VuZCA9IDA7Ci0KLSAgICBpZiAoci0+dXJpWzBdID09ICdcMCcgfHwgci0+dXJpW3N0cmxlbihyLT51cmkpIC0gMV0gIT0gJy8nKSB7Ci0gICAgICAgIGNoYXIgKmlmaWxlOwotICAgICAgICBpZiAoci0+YXJncyAhPSBOVUxMKQotICAgICAgICAgICAgaWZpbGUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIGFwX2VzY2FwZV91cmkoci0+cG9vbCwgci0+dXJpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIsICI/Iiwgci0+YXJncywgTlVMTCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGlmaWxlID0gYXBfcHN0cmNhdChyLT5wb29sLCBhcF9lc2NhcGVfdXJpKHItPnBvb2wsIHItPnVyaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8iLCBOVUxMKTsKLQotICAgICAgICBhcF90YWJsZV9zZXRuKHItPmhlYWRlcnNfb3V0LCAiTG9jYXRpb24iLAotICAgICAgICAgICAgICAgICAgYXBfY29uc3RydWN0X3VybChyLT5wb29sLCBpZmlsZSwgcikpOwotICAgICAgICByZXR1cm4gSFRUUF9NT1ZFRF9QRVJNQU5FTlRMWTsKLSAgICB9Ci0KLSAgICAvKiBLTFVER0UgLS0tIG1ha2UgdGhlIHN1Yl9yZXEgbG9va3VwcyBoYXBwZW4gaW4gdGhlIHJpZ2h0IGRpcmVjdG9yeS4KLSAgICAgKiBGaXhpbmcgdGhpcyBpbiB0aGUgc3ViX3JlcV9sb29rdXAgZnVuY3Rpb25zIHRoZW1zZWx2ZXMgaXMgZGlmZmljdWx0LAotICAgICAqIGFuZCB3b3VsZCBwcm9iYWJseSBicmVhayB2aXJ0dWFsIGluY2x1ZGVzLi4uCi0gICAgICovCi0KLSAgICBpZiAoci0+ZmlsZW5hbWVbc3RybGVuKHItPmZpbGVuYW1lKSAtIDFdICE9ICcvJykgewotICAgICAgICByLT5maWxlbmFtZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgci0+ZmlsZW5hbWUsICIvIiwgTlVMTCk7Ci0gICAgfQotCi0gICAgaWYgKGQtPmluZGV4X25hbWVzKSB7Ci0JbmFtZXNfcHRyID0gKGNoYXIgKiopZC0+aW5kZXhfbmFtZXMtPmVsdHM7Ci0JbnVtX25hbWVzID0gZC0+aW5kZXhfbmFtZXMtPm5lbHRzOwotICAgIH0KLSAgICBlbHNlIHsKLQlkdW1teV9wdHJbMF0gPSBBUF9ERUZBVUxUX0lOREVYOwotCW5hbWVzX3B0ciA9IGR1bW15X3B0cjsKLQludW1fbmFtZXMgPSAxOwotICAgIH0KLQotICAgIGZvciAoOyBudW1fbmFtZXM7ICsrbmFtZXNfcHRyLCAtLW51bV9uYW1lcykgewotICAgICAgICBjaGFyICpuYW1lX3B0ciA9ICpuYW1lc19wdHI7Ci0gICAgICAgIHJlcXVlc3RfcmVjICpyciA9IGFwX3N1Yl9yZXFfbG9va3VwX3VyaShuYW1lX3B0ciwgcik7Ci0KLSAgICAgICAgaWYgKHJyLT5zdGF0dXMgPT0gSFRUUF9PSyAmJiByci0+ZmluZm8uZmlsZXR5cGUgPT0gQVBSX1JFRykgewotICAgICAgICAgICAgY2hhciAqbmV3X3VyaSA9IGFwX2VzY2FwZV91cmkoci0+cG9vbCwgcnItPnVyaSk7Ci0KLSAgICAgICAgICAgIGlmIChyci0+YXJncyAhPSBOVUxMKQotICAgICAgICAgICAgICAgIG5ld191cmkgPSBhcF9wc3RyY2F0KHItPnBvb2wsIG5ld191cmksICI/IiwgcnItPmFyZ3MsIE5VTEwpOwotICAgICAgICAgICAgZWxzZSBpZiAoci0+YXJncyAhPSBOVUxMKQotICAgICAgICAgICAgICAgIG5ld191cmkgPSBhcF9wc3RyY2F0KHItPnBvb2wsIG5ld191cmksICI/Iiwgci0+YXJncywgTlVMTCk7Ci0KLSAgICAgICAgICAgIGFwX2Rlc3Ryb3lfc3ViX3JlcShycik7Ci0gICAgICAgICAgICBhcF9pbnRlcm5hbF9yZWRpcmVjdChuZXdfdXJpLCByKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIElmIHRoZSByZXF1ZXN0IHJldHVybmVkIGEgcmVkaXJlY3QsIHByb3BhZ2F0ZSBpdCB0byB0aGUgY2xpZW50ICovCi0KLSAgICAgICAgaWYgKGFwX2lzX0hUVFBfUkVESVJFQ1QocnItPnN0YXR1cykgfHwKLSAgICAgICAgICAgIChyci0+c3RhdHVzID09IEhUVFBfTk9UX0FDQ0VQVEFCTEUgJiYgbnVtX25hbWVzID09IDEpKSB7Ci0KLSAgICAgICAgICAgIGFwX3Bvb2xfam9pbihyLT5wb29sLCByci0+cG9vbCk7Ci0gICAgICAgICAgICBlcnJvcl9ub3Rmb3VuZCA9IHJyLT5zdGF0dXM7Ci0gICAgICAgICAgICByLT5ub3RlcyA9IGFwX292ZXJsYXlfdGFibGVzKHItPnBvb2wsIHItPm5vdGVzLCByci0+bm90ZXMpOwotICAgICAgICAgICAgci0+aGVhZGVyc19vdXQgPSBhcF9vdmVybGF5X3RhYmxlcyhyLT5wb29sLCByLT5oZWFkZXJzX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnItPmhlYWRlcnNfb3V0KTsKLSAgICAgICAgICAgIHItPmVycl9oZWFkZXJzX291dCA9IGFwX292ZXJsYXlfdGFibGVzKHItPnBvb2wsIHItPmVycl9oZWFkZXJzX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJyLT5lcnJfaGVhZGVyc19vdXQpOwotICAgICAgICAgICAgcmV0dXJuIGVycm9yX25vdGZvdW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSWYgdGhlIHJlcXVlc3QgcmV0dXJuZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gNDA0IChvciAyMDApLAotICAgICAgICAgKiBpdCBtZWFucyB0aGUgbW9kdWxlIGVuY291bnRlcmVkIHNvbWUgc29ydCBvZiBwcm9ibGVtLiBUbyBiZQotICAgICAgICAgKiBzZWN1cmUsIHdlIHNob3VsZCByZXR1cm4gdGhlIGVycm9yLCByYXRoZXIgdGhhbiBjcmVhdGUKLSAgICAgICAgICogYWxvbmcgYSAocG9zc2libHkgdW5zYWZlKSBkaXJlY3RvcnkgaW5kZXguCi0gICAgICAgICAqCi0gICAgICAgICAqIFNvIHdlIHN0b3JlIHRoZSBlcnJvciwgYW5kIGlmIG5vbmUgb2YgdGhlIGxpc3RlZCBmaWxlcwotICAgICAgICAgKiBleGlzdCwgd2UgcmV0dXJuIHRoZSBsYXN0IGVycm9yIHJlc3BvbnNlIHdlIGdvdCwgaW5zdGVhZAotICAgICAgICAgKiBvZiBhIGRpcmVjdG9yeSBsaXN0aW5nLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHJyLT5zdGF0dXMgJiYgcnItPnN0YXR1cyAhPSBIVFRQX05PVF9GT1VORCAmJiByci0+c3RhdHVzICE9IEhUVFBfT0spCi0gICAgICAgICAgICBlcnJvcl9ub3Rmb3VuZCA9IHJyLT5zdGF0dXM7Ci0KLSAgICAgICAgYXBfZGVzdHJveV9zdWJfcmVxKHJyKTsKLSAgICB9Ci0KLSAgICBpZiAoZXJyb3Jfbm90Zm91bmQpCi0gICAgICAgIHJldHVybiBlcnJvcl9ub3Rmb3VuZDsKLQotICAgIGlmIChyLT5tZXRob2RfbnVtYmVyICE9IE1fR0VUKQotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0KLSAgICAvKiBub3RoaW5nIGZvciB1cyB0byBkbywgcGFzcyBvbiB0aHJvdWdoICovCi0KLSAgICByZXR1cm4gREVDTElORUQ7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGhhbmRsZXJfcmVjIGRpcl9oYW5kbGVyc1tdID0KLXsKLSAgICB7RElSX01BR0lDX1RZUEUsIGhhbmRsZV9kaXJ9LAotICAgIHtOVUxMfQotfTsKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGRpcl9tb2R1bGUgPSB7Ci0gICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCi0gICAgY3JlYXRlX2Rpcl9jb25maWcsCQkvKiBjcmVhdGUgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlICovCi0gICAgbWVyZ2VfZGlyX2NvbmZpZ3MsCQkvKiBtZXJnZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgTlVMTCwJCQkvKiBjcmVhdGUgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlICovCi0gICAgTlVMTCwJCQkvKiBtZXJnZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgZGlyX2NtZHMsCQkJLyogY29tbWFuZCBhcF90YWJsZV90ICovCi0gICAgZGlyX2hhbmRsZXJzLAkJLyogaGFuZGxlcnMgKi8KLSAgICBOVUxMCQkJLyogcmVnaXN0ZXIgaG9va3MgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvbW9kX2Rpci5leHAgYi9tb2R1bGVzL21hcHBlcnMvbW9kX2Rpci5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYmY3NzIuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tYXBwZXJzL21vZF9kaXIuZXhwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZGlyX21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tYXBwZXJzL21vZF9pbWFwLmMgYi9tb2R1bGVzL21hcHBlcnMvbW9kX2ltYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZlYWRiYi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21hcHBlcnMvbW9kX2ltYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDkxMiArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVQnUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogVGhpcyBpbWFnZW1hcCBtb2R1bGUgc3RhcnRlZCBhcyBhIHBvcnQgb2YgdGhlIG9yaWdpbmFsIGltYWdlbWFwLmMKLSAqIHdyaXR0ZW4gYnkgUm9iIE1jQ29vbCAoMTEvMTMvOTMgcm9ibUBuY3NhLnVpdWMuZWR1KS4KLSAqIFRoaXMgdmVyc2lvbiBpbmNsdWRlcyB0aGUgbWFwcGluZyBhbGdvcml0aG1zIGZvdW5kIGluIHZlcnNpb24gMS4zCi0gKiBvZiBpbWFnZW1hcC5jLgotICoKLSAqIENvbnRyaWJ1dG9ycyB0byB0aGlzIGNvZGUgaW5jbHVkZToKLSAqCi0gKiBLZXZpbiBIdWdoZXMsIGtldmluaEBwdWx1YS5oY2MuaGF3YWlpLmVkdQotICoKLSAqIEVyaWMgSGFpbmVzLCBlcmljaEBleWUuY29tCi0gKiAibWFjbWFydGluaXplZCIgcG9seWdvbiBjb2RlIGNvcHlyaWdodCAxOTkyIGJ5IEVyaWMgSGFpbmVzLCBlcmljaEBleWUuY29tCi0gKgotICogUmFuZHkgVGVyYnVzaCwgcmFuZHlAenl6enl2YS5jb20KLSAqIHBvcnQgdG8gQXBhY2hlIG1vZHVsZSBmb3JtYXQsICJiYXNlX3VyaSIgYW5kIHN1cHBvcnQgZm9yIHJlbGF0aXZlIFVSTHMKLSAqIAotICogSmFtZXMgSC4gQ2xvb3MsIEpyLiwgY2xvb3NAamhjbG9vcy5jb20KLSAqIEFkZGVkIHBvaW50IGRhdGF0eXBlLCB1c2luZyBjb2RlIGluIE5DU0EncyB2ZXJzaW9uIDEuOCBpbWFnZW1hcC5jCi0gKiBwcm9ncmFtLCBhcyBkaXN0cmlidXRlZCB3aXRoIHZlcnNpb24gMS40LjEgb2YgdGhlaXIgc2VydmVyLgotICogVGhlIHBvaW50IGNvZGUgaXMgb3JpZ2luYWxseSBhZGRlZCBieSBDcmFpZyBNaWxvIFJvZ2VycywgUm9nZXJzQElTSS5FZHUKLSAqCi0gKiBOYXRoYW4gS3VyeiwgbmF0ZUB0cmlwb2QuY29tCi0gKiBSZXdyaXRlL3Jlb3JnYW5pemF0aW9uLiAgTmV3IGhhbmRsaW5nIG9mIGRlZmF1bHQsIGJhc2UgYW5kIHJlbGF0aXZlIFVSTHMuICAKLSAqIE5ldyBDb25maWd1cmF0aW9uIGRpcmVjdGl2ZXM6Ci0gKiAgICBJbWFwTWVudSB7bm9uZSwgZm9ybWF0dGVkLCBzZW1pZm9ybWF0dGVkLCB1bmZvcm1hdHRlZH0KLSAqICAgIEltYXBEZWZhdWx0IHtlcnJvciwgbm9jb250ZW50LCByZWZlcmVyLCBtZW51LCBVUkx9Ci0gKiAgICBJbWFwQmFzZSB7bWFwLCByZWZlcmVyLCBVUkx9Ci0gKiBTdXBwb3J0IGZvciBjcmVhdGluZyBub24tZ3JhcGhpY2FsIG1lbnUgYWRkZWQuICAoYmFja3dhcmRzIGNvbXBhdGlibGUpOgotICogICAgT2xkOiAgZGlyZWN0aXZlIFVSTCBbeCx5IC4uLl0KLSAqICAgIE5ldzogIGRpcmVjdGl2ZSBVUkwgIk1lbnUgdGV4dCIgW3gseSAuLi5dCi0gKiAgICAgb3I6ICBkaXJlY3RpdmUgVVJMIHgseSAuLi4gIk1lbnUgdGV4dCIKLSAqIE1hcCBmb3JtYXQgYW5kIG1lbnUgY29uY2VwdCBjb3VydGVzeSBKb3NodWEgQmVsbCwganNiZWxsQGFjcy51Y2FsZ2FyeS5jYS4KLSAqCi0gKiBNYXJrIENveCwgbWFya0B1a3dlYi5jb20sIEFsbG93IHJlbGF0aXZlIFVSTHMgZXZlbiB3aGVuIG5vIGJhc2Ugc3BlY2lmaWVkCi0gKi8KLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJ1dGlsX3NjcmlwdC5oIgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotCi0jZGVmaW5lIElNQVBfTUFHSUNfVFlQRSAiYXBwbGljYXRpb24veC1odHRwZC1pbWFwIgotI2RlZmluZSBNQVhWRVJUUyAxMDAKLSNkZWZpbmUgWCAwCi0jZGVmaW5lIFkgMQotCi0jZGVmaW5lIElNQVBfTUVOVV9ERUZBVUxUICJmb3JtYXR0ZWQiCi0jZGVmaW5lIElNQVBfREVGQVVMVF9ERUZBVUxUICJub2NvbnRlbnQiCi0jZGVmaW5lIElNQVBfQkFTRV9ERUZBVUxUICJtYXAiCi0KLSNpZmRlZiBTVU5PUzQKLWRvdWJsZSBzdHJ0b2QoKTsgICAgICAgICAgICAgICAgLyogU3VuT1MgbmVlZGVkIHRoaXMgKi8KLSNlbmRpZgotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgaW1hcF9tb2R1bGU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjaGFyICppbWFwX21lbnU7Ci0gICAgY2hhciAqaW1hcF9kZWZhdWx0OwotICAgIGNoYXIgKmltYXBfYmFzZTsKLX0gaW1hcF9jb25mX3JlYzsKLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9pbWFwX2Rpcl9jb25maWcoYXBfY29udGV4dF90ICpwLCBjaGFyICpkdW1teSkKLXsKLSAgICBpbWFwX2NvbmZfcmVjICppY3IgPQotICAgIChpbWFwX2NvbmZfcmVjICopIGFwX3BhbGxvYyhwLCBzaXplb2YoaW1hcF9jb25mX3JlYykpOwotCi0gICAgaWNyLT5pbWFwX21lbnUgPSBOVUxMOwotICAgIGljci0+aW1hcF9kZWZhdWx0ID0gTlVMTDsKLSAgICBpY3ItPmltYXBfYmFzZSA9IE5VTEw7Ci0KLSAgICByZXR1cm4gaWNyOwotfQotCi1zdGF0aWMgdm9pZCAqbWVyZ2VfaW1hcF9kaXJfY29uZmlncyhhcF9jb250ZXh0X3QgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICphZGR2KQotewotICAgIGltYXBfY29uZl9yZWMgKm5ldyA9IChpbWFwX2NvbmZfcmVjICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKGltYXBfY29uZl9yZWMpKTsKLSAgICBpbWFwX2NvbmZfcmVjICpiYXNlID0gKGltYXBfY29uZl9yZWMgKikgYmFzZXY7Ci0gICAgaW1hcF9jb25mX3JlYyAqYWRkID0gKGltYXBfY29uZl9yZWMgKikgYWRkdjsKLQotICAgIG5ldy0+aW1hcF9tZW51ID0gYWRkLT5pbWFwX21lbnUgPyBhZGQtPmltYXBfbWVudSA6IGJhc2UtPmltYXBfbWVudTsKLSAgICBuZXctPmltYXBfZGVmYXVsdCA9IGFkZC0+aW1hcF9kZWZhdWx0ID8gYWRkLT5pbWFwX2RlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYmFzZS0+aW1hcF9kZWZhdWx0OwotICAgIG5ldy0+aW1hcF9iYXNlID0gYWRkLT5pbWFwX2Jhc2UgPyBhZGQtPmltYXBfYmFzZSA6IGJhc2UtPmltYXBfYmFzZTsKLQotICAgIHJldHVybiBuZXc7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIGltYXBfY21kc1tdID0KLXsKLSAgICB7IkltYXBNZW51IiwgYXBfc2V0X3N0cmluZ19zbG90LAotICAgICAodm9pZCAqKSBYdE9mZnNldE9mKGltYXBfY29uZl9yZWMsIGltYXBfbWVudSksIE9SX0lOREVYRVMsIFRBS0UxLAotICJ0aGUgdHlwZSBvZiBtZW51IGdlbmVyYXRlZDogbm9uZSwgZm9ybWF0dGVkLCBzZW1pZm9ybWF0dGVkLCB1bmZvcm1hdHRlZCJ9LAotICAgIHsiSW1hcERlZmF1bHQiLCBhcF9zZXRfc3RyaW5nX3Nsb3QsCi0gICAgICh2b2lkICopIFh0T2Zmc2V0T2YoaW1hcF9jb25mX3JlYywgaW1hcF9kZWZhdWx0KSwgT1JfSU5ERVhFUywgVEFLRTEsCi0gICAgICJ0aGUgYWN0aW9uIHRha2VuIGlmIG5vIG1hdGNoOiBlcnJvciwgbm9jb250ZW50LCByZWZlcmVyLCBtZW51LCBVUkwifSwKLSAgICB7IkltYXBCYXNlIiwgYXBfc2V0X3N0cmluZ19zbG90LAotICAgICAodm9pZCAqKSBYdE9mZnNldE9mKGltYXBfY29uZl9yZWMsIGltYXBfYmFzZSksIE9SX0lOREVYRVMsIFRBS0UxLAotICAgICAidGhlIGJhc2UgZm9yIGFsbCBVUkwnczogbWFwLCByZWZlcmVyLCBVUkwgKG9yIHN0YXJ0IG9mKSJ9LAotICAgIHtOVUxMfQotfTsKLQotc3RhdGljIGludCBwb2ludGlucmVjdChjb25zdCBkb3VibGUgcG9pbnRbMl0sIGRvdWJsZSBjb29yZHNbTUFYVkVSVFNdWzJdKQotewotICAgIGRvdWJsZSBtYXhbMl0sIG1pblsyXTsKLSAgICBpZiAoY29vcmRzWzBdW1hdID4gY29vcmRzWzFdW1hdKSB7Ci0gICAgICAgIG1heFswXSA9IGNvb3Jkc1swXVtYXTsKLSAgICAgICAgbWluWzBdID0gY29vcmRzWzFdW1hdOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgbWF4WzBdID0gY29vcmRzWzFdW1hdOwotICAgICAgICBtaW5bMF0gPSBjb29yZHNbMF1bWF07Ci0gICAgfQotCi0gICAgaWYgKGNvb3Jkc1swXVtZXSA+IGNvb3Jkc1sxXVtZXSkgewotICAgICAgICBtYXhbMV0gPSBjb29yZHNbMF1bWV07Ci0gICAgICAgIG1pblsxXSA9IGNvb3Jkc1sxXVtZXTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIG1heFsxXSA9IGNvb3Jkc1sxXVtZXTsKLSAgICAgICAgbWluWzFdID0gY29vcmRzWzBdW1ldOwotICAgIH0KLQotICAgIHJldHVybiAoKHBvaW50W1hdID49IG1pblswXSAmJiBwb2ludFtYXSA8PSBtYXhbMF0pICYmCi0gICAgICAgICAgICAocG9pbnRbWV0gPj0gbWluWzFdICYmIHBvaW50W1ldIDw9IG1heFsxXSkpOwotfQotCi1zdGF0aWMgaW50IHBvaW50aW5jaXJjbGUoY29uc3QgZG91YmxlIHBvaW50WzJdLCBkb3VibGUgY29vcmRzW01BWFZFUlRTXVsyXSkKLXsKLSAgICBkb3VibGUgcmFkaXVzMSwgcmFkaXVzMjsKLQotICAgIHJhZGl1czEgPSAoKGNvb3Jkc1swXVtZXSAtIGNvb3Jkc1sxXVtZXSkgKiAoY29vcmRzWzBdW1ldIC0gY29vcmRzWzFdW1ldKSkKLSAgICAgICAgKyAoKGNvb3Jkc1swXVtYXSAtIGNvb3Jkc1sxXVtYXSkgKiAoY29vcmRzWzBdW1hdIC0gY29vcmRzWzFdW1hdKSk7Ci0KLSAgICByYWRpdXMyID0gKChjb29yZHNbMF1bWV0gLSBwb2ludFtZXSkgKiAoY29vcmRzWzBdW1ldIC0gcG9pbnRbWV0pKQotICAgICAgICArICgoY29vcmRzWzBdW1hdIC0gcG9pbnRbWF0pICogKGNvb3Jkc1swXVtYXSAtIHBvaW50W1hdKSk7Ci0KLSAgICByZXR1cm4gKHJhZGl1czIgPD0gcmFkaXVzMSk7Ci19Ci0KLSNkZWZpbmUgZm1pbihhLGIpICgoKGEpPihiKSk/KGIpOihhKSkKLSNkZWZpbmUgZm1heChhLGIpICgoKGEpPihiKSk/KGEpOihiKSkKLQotc3RhdGljIGludCBwb2ludGlucG9seShjb25zdCBkb3VibGUgcG9pbnRbMl0sIGRvdWJsZSBwZ29uW01BWFZFUlRTXVsyXSkKLXsKLSAgICBpbnQgaSwgbnVtdmVydHMsIGNyb3NzaW5ncyA9IDA7Ci0gICAgZG91YmxlIHggPSBwb2ludFtYXSwgeSA9IHBvaW50W1ldOwotCi0gICAgZm9yIChudW12ZXJ0cyA9IDA7IHBnb25bbnVtdmVydHNdW1hdICE9IC0xICYmIG51bXZlcnRzIDwgTUFYVkVSVFM7Ci0JbnVtdmVydHMrKykgewotCS8qIGp1c3QgY291bnRpbmcgdGhlIHZlcnRleGVzICovCi0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bXZlcnRzOyBpKyspIHsKLSAgICAgICAgZG91YmxlIHgxPXBnb25baV1bWF07Ci0gICAgICAgIGRvdWJsZSB5MT1wZ29uW2ldW1ldOwotICAgICAgICBkb3VibGUgeDI9cGdvblsoaSArIDEpICUgbnVtdmVydHNdW1hdOwotICAgICAgICBkb3VibGUgeTI9cGdvblsoaSArIDEpICUgbnVtdmVydHNdW1ldOwotICAgICAgICBkb3VibGUgZD0oeSAtIHkxKSAqICh4MiAtIHgxKSAtICh4IC0geDEpICogKHkyIC0geTEpOwotCi0gICAgICAgIGlmICgoeTEgPj0geSkgIT0gKHkyID49IHkpKSB7Ci0JICAgIGNyb3NzaW5ncyArPXkyIC0geTEgPj0gMCA/IGQgPj0gMCA6IGQgPD0gMDsKLQl9Ci0gICAgICAgIGlmICghZCAmJiBmbWluKHgxLHgyKSA8PSB4ICYmIHggPD0gZm1heCh4MSx4MikKLQkgICAgJiYgZm1pbih5MSx5MikgPD0geSAmJiB5IDw9IGZtYXgoeTEseTIpKSB7Ci0JICAgIHJldHVybiAxOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIGNyb3NzaW5ncyAmIDB4MDE7Ci19Ci0KLQotc3RhdGljIGludCBpc19jbG9zZXIoY29uc3QgZG91YmxlIHBvaW50WzJdLCBkb3VibGUgY29vcmRzW01BWFZFUlRTXVsyXSwKLSAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqY2xvc2VzdCkKLXsKLSAgICBkb3VibGUgZGlzdF9zcXVhcmVkID0gKChwb2ludFtYXSAtIGNvb3Jkc1swXVtYXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICogKHBvaW50W1hdIC0gY29vcmRzWzBdW1hdKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKHBvaW50W1ldIC0gY29vcmRzWzBdW1ldKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChwb2ludFtZXSAtIGNvb3Jkc1swXVtZXSkpOwotCi0gICAgaWYgKHBvaW50W1hdIDwgMCB8fCBwb2ludFtZXSA8IDApIHsKLSAgICAgICAgcmV0dXJuICgwKTsgICAgICAgICAgLyogZG9uJ3QgbWVzcyBhcm91bmQgd2l0aCBuZWdhdGl2ZSBjb29yZGluYXRlcyAqLwotICAgIH0KLQotICAgIGlmICgqY2xvc2VzdCA8IDAgfHwgZGlzdF9zcXVhcmVkIDwgKmNsb3Nlc3QpIHsKLSAgICAgICAgKmNsb3Nlc3QgPSBkaXN0X3NxdWFyZWQ7Ci0gICAgICAgIHJldHVybiAoMSk7ICAgICAgICAgIC8qIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHBvaW50IG9yIGlzIHRoZSBjbG9zZXN0IHlldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgJ2Nsb3Nlc3QnIGVxdWFsIHRvIHRoaXMgZGlzdGFuY2VeMiAqLwotICAgIH0KLQotICAgIHJldHVybiAoMCk7ICAgICAgICAgICAgICAvKiBpZiBpdCdzIG5vdCB0aGUgZmlyc3Qgb3IgY2xvc2VzdCAqLwotCi19Ci0KLXN0YXRpYyBkb3VibGUgZ2V0X3hfY29vcmQoY29uc3QgY2hhciAqYXJncykKLXsKLSAgICBjaGFyICplbmRwdHI7ICAgICAgICAgICAgICAgLyogd2Ugd2FudCBpdCBub24tbnVsbCAqLwotICAgIGRvdWJsZSB4X2Nvb3JkID0gLTE7ICAgICAgICAvKiAtMSBpcyByZXR1cm5lZCBpZiBubyBjb29yZGluYXRlIGlzIGdpdmVuICovCi0KLSAgICBpZiAoYXJncyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAoLTEpOyAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgYXJlbid0IHBhc3NlZCBhbnl0aGluZyAqLwotICAgIH0KLQotICAgIHdoaWxlICgqYXJncyAmJiAhYXBfaXNkaWdpdCgqYXJncykgJiYgKmFyZ3MgIT0gJywnKSB7Ci0gICAgICAgIGFyZ3MrKzsgICAgICAgICAgICAgICAgIC8qIGp1bXAgdG8gdGhlIGZpcnN0IGRpZ2l0LCBidXQgbm90IHBhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBjb21tYSBvciBlbmQgKi8KLSAgICB9Ci0KLSAgICB4X2Nvb3JkID0gc3RydG9kKGFyZ3MsICZlbmRwdHIpOwotCi0gICAgaWYgKGVuZHB0ciA+IGFyZ3MpIHsgICAgICAgIC8qIGlmIGEgY29udmVyc2lvbiB3YXMgbWFkZSAqLwotICAgICAgICByZXR1cm4gKHhfY29vcmQpOwotICAgIH0KLQotICAgIHJldHVybiAoLTEpOyAgICAgICAgICAgICAgICAvKiBlbHNlIGlmIG5vIGNvbnZlcnNpb24gd2FzIG1hZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIG5vIGFyZ3Mgd2FzIGdpdmVuICovCi19Ci0KLXN0YXRpYyBkb3VibGUgZ2V0X3lfY29vcmQoY29uc3QgY2hhciAqYXJncykKLXsKLSAgICBjaGFyICplbmRwdHI7ICAgICAgICAgICAgICAgLyogd2Ugd2FudCBpdCBub24tbnVsbCAqLwotICAgIGNoYXIgKnN0YXJ0X29mX3kgPSBOVUxMOwotICAgIGRvdWJsZSB5X2Nvb3JkID0gLTE7ICAgICAgICAvKiAtMSBpcyByZXR1cm5lZCBvbiBlcnJvciAqLwotCi0gICAgaWYgKGFyZ3MgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gKC0xKTsgICAgICAgICAgICAvKiBpbiBjYXNlIHdlIGFyZW4ndCBwYXNzZWQgYW55dGhpbmcgKi8KLSAgICB9Ci0KLSAgICBzdGFydF9vZl95ID0gc3RyY2hyKGFyZ3MsICcsJyk7ICAgICAvKiB0aGUgY29tbWEgKi8KLQotICAgIGlmIChzdGFydF9vZl95KSB7Ci0KLSAgICAgICAgc3RhcnRfb2ZfeSsrOyAgICAgICAgICAgLyogc3RhcnQgbG9va2luZyBhdCB0aGUgY2hhcmFjdGVyIGFmdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb21tYSAqLwotCi0gICAgICAgIHdoaWxlICgqc3RhcnRfb2ZfeSAmJiAhYXBfaXNkaWdpdCgqc3RhcnRfb2ZfeSkpIHsKLSAgICAgICAgICAgIHN0YXJ0X29mX3krKzsgICAgICAgLyoganVtcCB0byB0aGUgZmlyc3QgZGlnaXQsIGJ1dCBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdCB0aGUgZW5kICovCi0JfQotCi0gICAgICAgIHlfY29vcmQgPSBzdHJ0b2Qoc3RhcnRfb2ZfeSwgJmVuZHB0cik7Ci0KLSAgICAgICAgaWYgKGVuZHB0ciA+IHN0YXJ0X29mX3kpIHsKLSAgICAgICAgICAgIHJldHVybiAoeV9jb29yZCk7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiAoLTEpOyAgICAgICAgICAgICAgICAvKiBpZiBubyBjb252ZXJzaW9uIHdhcyBtYWRlLCBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBjb21tYSB3YXMgZm91bmQgaW4gYXJncyAqLwotfQotCi0KLS8qIFNlZSBpZiBzdHJpbmcgaGFzIGEgInF1b3RlZCBwYXJ0IiwgYW5kIGlmIHNvIHNldCAqcXVvdGVkX3BhcnQgdG8KLSAqIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHF1b3RlZCBwYXJ0LCB0aGVuIGhhbW1lciBhIFwwIG9udG8gdGhlCi0gKiB0cmFpbGluZyBxdW90ZSwgYW5kIHNldCAqc3RyaW5nIHRvIHBvaW50IGF0IHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAqIHBhc3QgdGhlIHNlY29uZCBxdW90ZS4KLSAqCi0gKiBPdGhlcndpc2Ugc2V0ICpxdW90ZWRfcGFydCB0byBOVUxMLCBhbmQgbGVhdmUgKnN0cmluZyBhbG9uZS4KLSAqLwotc3RhdGljIHZvaWQgcmVhZF9xdW90ZWQoY2hhciAqKnN0cmluZywgY2hhciAqKnF1b3RlZF9wYXJ0KQotewotICAgIGNoYXIgKnN0cnAgPSAqc3RyaW5nOwotCi0gICAgLyogYXNzdW1lIHRoZXJlJ3Mgbm8gcXVvdGVkIHBhcnQgKi8KLSAgICAqcXVvdGVkX3BhcnQgPSBOVUxMOwotCi0gICAgd2hpbGUgKGFwX2lzc3BhY2UoKnN0cnApKSB7Ci0gICAgICAgIHN0cnArKzsgICAgICAgICAgICAgICAJLyogZ28gYWxvbmcgc3RyaW5nIHVudGlsIG5vbi13aGl0ZXNwYWNlICovCi0gICAgfQotCi0gICAgaWYgKCpzdHJwID09ICciJykgeyAgICAgICAJLyogaWYgdGhhdCBjaGFyYWN0ZXIgaXMgYSBkb3VibGUgcXVvdGUgKi8KLSAgICAgICAgc3RycCsrOyAgICAgICAgICAgICAgIAkvKiBzdGVwIG92ZXIgaXQgKi8KLQkqcXVvdGVkX3BhcnQgPSBzdHJwOyAgCS8qIG5vdGUgd2hlcmUgdGhlIHF1b3RlZCBwYXJ0IGJlZ2lucyAqLwotCi0gICAgICAgIHdoaWxlICgqc3RycCAmJiAqc3RycCAhPSAnIicpIHsKLQkgICAgKytzdHJwOwkJLyogc2tpcCB0aGUgcXVvdGVkIHBvcnRpb24gKi8KLSAgICAgICAgfQotCi0gICAgICAgICpzdHJwID0gJ1wwJzsgICAgCS8qIGVuZCB0aGUgc3RyaW5nIHdpdGggYSBOVUwgKi8KLQotICAgICAgICBzdHJwKys7ICAgICAgICAgICAgICAgCS8qIHN0ZXAgb3ZlciB0aGUgbGFzdCBkb3VibGUgcXVvdGUgKi8KLQkqc3RyaW5nID0gc3RycDsKLSAgICB9Ci19Ci0KLS8qCi0gKiByZXR1cm5zIHRoZSBtYXBwZWQgVVJMIG9yIE5VTEwuCi0gKi8KLXN0YXRpYyBjaGFyICppbWFwX3VybChyZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqdmFsdWUpCi17Ci0vKiB0cmFuc2xhdGVzIGEgdmFsdWUgaW50byBhIFVSTC4gKi8KLSAgICBpbnQgc2xlbiwgY2xlbjsKLSAgICBjaGFyICpzdHJpbmdfcG9zID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICpzdHJpbmdfcG9zX2NvbnN0ID0gTlVMTDsKLSAgICBjaGFyICpkaXJlY3RvcnkgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnJlZmVyZXIgPSBOVUxMOwotICAgIGNoYXIgKm15X2Jhc2U7Ci0KLSAgICBpZiAoIXN0cmNhc2VjbXAodmFsdWUsICJtYXAiKSB8fCAhc3RyY2FzZWNtcCh2YWx1ZSwgIm1lbnUiKSkgewotCXJldHVybiBhcF9jb25zdHJ1Y3RfdXJsKHItPnBvb2wsIHItPnVyaSwgcik7Ci0gICAgfQotCi0gICAgaWYgKCFzdHJjYXNlY21wKHZhbHVlLCAibm9jb250ZW50IikgfHwgIXN0cmNhc2VjbXAodmFsdWUsICJlcnJvciIpKSB7Ci0gICAgICAgIHJldHVybiBhcF9wc3RyZHVwKHItPnBvb2wsIHZhbHVlKTsgICAgICAvKiB0aGVzZSBhcmUgaGFuZGxlZCBlbHNld2hlcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyBqdXN0IGNvcHkgdGhlbSAqLwotICAgIH0KLQotICAgIGlmICghc3RyY2FzZWNtcCh2YWx1ZSwgInJlZmVyZXIiKSkgewotICAgICAgICByZWZlcmVyID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJSZWZlcmVyIik7Ci0gICAgICAgIGlmIChyZWZlcmVyICYmICpyZWZlcmVyKSB7Ci0JICAgIHJldHVybiBhcF9wc3RyZHVwKHItPnBvb2wsIHJlZmVyZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCSAgICAvKiBYWFg6ICBUaGlzIHVzZWQgdG8gZG8gKnZhbHVlID0gJ1wwJzsgLi4uIHdoaWNoIGlzIHRvdGFsbHkgYm9ndXMKLQkgICAgICogYmVjYXVzZSBpdCBoYW1tZXJzIHRoZSBwYXNzZWQgaW4gdmFsdWUsIHdoaWNoIGNhbiBiZSBhIHN0cmluZwotICAgICAgICAgICAgICogY29uc3RhbnQsIG9yIHBhcnQgb2YgYSBjb25maWcsIG9yIHdoYXRldmVyLiAgVG90YWwgZ2FyYmFnZS4KLSAgICAgICAgICAgICAqIFRoaXMgd29ya3MgYXJvdW5kIHRoYXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgcmVzdCBvZiB0aGlzCi0gICAgICAgICAgICAgKiBjb2RlIG11Y2gKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgdmFsdWUgPSAiIjsgICAgICAvKiBpZiAncmVmZXJlcicgYnV0IG5vIHJlZmVycmluZyBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIHRoZSB2YWx1ZSAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RyaW5nX3Bvc19jb25zdCA9IHZhbHVlOwotICAgIHdoaWxlIChhcF9pc2FscGhhKCpzdHJpbmdfcG9zX2NvbnN0KSkgewotCXN0cmluZ19wb3NfY29uc3QrKzsgICAgICAgICAgIC8qIGdvIGFsb25nIHRoZSBVUkwgZnJvbSB0aGUgbWFwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudGlsIGEgbm9uLWxldHRlciAqLwotICAgIH0KLSAgICBpZiAoKnN0cmluZ19wb3NfY29uc3QgPT0gJzonKSB7Ci0JLyogaWYgbGV0dGVycyBhbmQgdGhlbiBhIGNvbG9uIChsaWtlIGh0dHA6KSAqLwotCS8qIGl0J3MgYW4gYWJzb2x1dGUgVVJMLCBzbyB1c2UgaXQhICovCi0JcmV0dXJuIGFwX3BzdHJkdXAoci0+cG9vbCwgdmFsdWUpOwotICAgIH0KLQotICAgIGlmICghYmFzZSB8fCAhKmJhc2UpIHsKLSAgICAgICAgaWYgKHZhbHVlICYmICp2YWx1ZSkgewotCSAgICByZXR1cm4gYXBfcHN0cmR1cChyLT5wb29sLCB2YWx1ZSk7IC8qIG5vIGJhc2U6IHVzZSB3aGF0IGlzIGdpdmVuICovCi0gICAgICAgIH0KLQkvKiBubyBiYXNlLCBubyB2YWx1ZTogcGljayBhIHNpbXBsZSBkZWZhdWx0ICovCi0JcmV0dXJuIGFwX2NvbnN0cnVjdF91cmwoci0+cG9vbCwgIi8iLCByKTsKLSAgICB9Ci0KLSAgICAvKiBtdXN0IGJlIGEgcmVsYXRpdmUgVVJMIHRvIGJlIGNvbWJpbmVkIHdpdGggYmFzZSAqLwotICAgIGlmIChzdHJjaHIoYmFzZSwgJy8nKSA9PSBOVUxMICYmICghc3RybmNtcCh2YWx1ZSwgIi4uLyIsIDMpCi0gICAgICAgIHx8ICFzdHJjbXAodmFsdWUsICIuLiIpKSkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBiYXNlIGRpcmVjdGl2ZSBpbiBtYXAgZmlsZTogJXMiLCByLT51cmkpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgbXlfYmFzZSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgYmFzZSk7Ci0gICAgc3RyaW5nX3BvcyA9IG15X2Jhc2U7Ci0gICAgd2hpbGUgKCpzdHJpbmdfcG9zKSB7Ci0gICAgICAgIGlmICgqc3RyaW5nX3BvcyA9PSAnLycgJiYgKihzdHJpbmdfcG9zICsgMSkgPT0gJy8nKSB7Ci0gICAgICAgICAgICBzdHJpbmdfcG9zICs9IDI7ICAgIC8qIGlmIHRoZXJlIGFyZSB0d28gc2xhc2hlcywganVtcCBvdmVyIHRoZW0gKi8KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICgqc3RyaW5nX3BvcyA9PSAnLycpIHsgICAgICAgLyogdGhlIGZpcnN0IHNpbmdsZSBzbGFzaCAqLwotICAgICAgICAgICAgaWYgKHZhbHVlWzBdID09ICcvJykgewotICAgICAgICAgICAgICAgICpzdHJpbmdfcG9zID0gJ1wwJzsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogaWYgdGhlIFVSTCBmcm9tIHRoZSBtYXAgc3RhcnRzIGZyb20gcm9vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kIHRoZSBiYXNlIFVSTCBzdHJpbmcgYXQgdGhlIGZpcnN0IHNpbmdsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGFzaCAqLwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gc3RyaW5nX3BvczsgICAgICAgICAvKiBzYXZlIHRoZSBzdGFydCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRpcmVjdG9yeSBwb3J0aW9uICovCi0KLSAgICAgICAgICAgICAgICBzdHJpbmdfcG9zID0gc3RycmNocihzdHJpbmdfcG9zLCAnLycpOyAgLyogbm93IHJldXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19wb3MgKi8KLSAgICAgICAgICAgICAgICBzdHJpbmdfcG9zKys7ICAgLyogc3RlcCBvdmVyIHRoYXQgbGFzdCBzbGFzaCAqLwotICAgICAgICAgICAgICAgICpzdHJpbmdfcG9zID0gJ1wwJzsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogYnV0IGlmIHRoZSBtYXAgdXJsIGlzIHJlbGF0aXZlLCBsZWF2ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xhc2ggb24gdGhlIGJhc2UgKGlmIHRoZXJlIGlzIG9uZSkgKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHN0cmluZ19wb3MrKzsgICAgICAgICAgIC8qIHVudGlsIHdlIGdldCB0byB0aGUgZW5kIG9mIG15X2Jhc2Ugd2l0aG91dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kaW5nIGEgc2xhc2ggYnkgaXRzZWxmICovCi0gICAgfQotCi0gICAgd2hpbGUgKCFzdHJuY21wKHZhbHVlLCAiLi4vIiwgMykgfHwgIXN0cmNtcCh2YWx1ZSwgIi4uIikpIHsKLQotICAgICAgICBpZiAoZGlyZWN0b3J5ICYmIChzbGVuID0gc3RybGVuKGRpcmVjdG9yeSkpKSB7Ci0KLSAgICAgICAgICAgIC8qIGZvciBlYWNoICcuLicsICBrbm9jayBhIGRpcmVjdG9yeSBvZmYgdGhlIGVuZCAKLSAgICAgICAgICAgICAgIGJ5IGVuZGluZyB0aGUgc3RyaW5nIHJpZ2h0IGF0IHRoZSBsYXN0IHNsYXNoLgotICAgICAgICAgICAgICAgQnV0IG9ubHkgY29uc2lkZXIgdGhlIGRpcmVjdG9yeSBwb3J0aW9uOiBkb24ndCBlYXQKLSAgICAgICAgICAgICAgIGludG8gdGhlIHNlcnZlciBuYW1lLiAgQW5kIG9ubHkgdHJ5IGlmIGEgZGlyZWN0b3J5Ci0gICAgICAgICAgICAgICBwb3J0aW9uIHdhcyBmb3VuZCAqLwotCi0gICAgICAgICAgICBjbGVuID0gc2xlbiAtIDE7Ci0KLSAgICAgICAgICAgIHdoaWxlICgoc2xlbiAtIGNsZW4pID09IDEpIHsKLQotICAgICAgICAgICAgICAgIGlmICgoc3RyaW5nX3BvcyA9IHN0cnJjaHIoZGlyZWN0b3J5LCAnLycpKSkgewotICAgICAgICAgICAgICAgICAgICAqc3RyaW5nX3BvcyA9ICdcMCc7Ci0JCX0KLSAgICAgICAgICAgICAgICBjbGVuID0gc3RybGVuKGRpcmVjdG9yeSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNsZW4gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2YWx1ZSArPSAyOyAgICAgICAgIC8qIGp1bXAgb3ZlciB0aGUgJy4uJyB0aGF0IHdlIGZvdW5kIGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGRpcmVjdG9yeSkgewotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGRpcmVjdG9yeSBuYW1lIGluIG1hcCBmaWxlOiAlcyIsIHItPnVyaSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc3RybmNtcCh2YWx1ZSwgIi8uLi8iLCA0KSB8fCAhc3RyY21wKHZhbHVlLCAiLy4uIikpIHsKLSAgICAgICAgICAgIHZhbHVlKys7ICAgICAgICAgICAgLyogc3RlcCBvdmVyIHRoZSAnLycgaWYgdGhlcmUgYXJlIG1vcmUgJy4uJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBkby4gIFRoaXMgd2F5LCB3ZSBsZWF2ZSB0aGUgc3RhcnRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nIG9uIHZhbHVlIGFmdGVyIHRoZSBsYXN0ICcuLicsIGJ1dCBnZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlkIG9mIGl0IG90aGVyd2lzZSAqLwotCX0KLQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBieSB0aGlzIHBvaW50LCB2YWx1ZSBkb2VzIG5vdCBzdGFydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoICcuLicgKi8KLQotICAgIGlmICh2YWx1ZSAmJiAqdmFsdWUpIHsKLQlyZXR1cm4gYXBfcHN0cmNhdChyLT5wb29sLCBteV9iYXNlLCB2YWx1ZSwgTlVMTCk7Ci0gICAgfQotICAgIHJldHVybiBteV9iYXNlOwotfQotCi1zdGF0aWMgaW50IGltYXBfcmVwbHkocmVxdWVzdF9yZWMgKnIsIGNoYXIgKnJlZGlyZWN0KQotewotICAgIGlmICghc3RyY2FzZWNtcChyZWRpcmVjdCwgImVycm9yIikpIHsKLSAgICAgICAgcmV0dXJuIFNFUlZFUl9FUlJPUjsgICAgLyogdGhleSBhY3R1YWxseSByZXF1ZXN0ZWQgYW4gZXJyb3IhICovCi0gICAgfQotICAgIGlmICghc3RyY2FzZWNtcChyZWRpcmVjdCwgIm5vY29udGVudCIpKSB7Ci0gICAgICAgIHJldHVybiBIVFRQX05PX0NPTlRFTlQ7IC8qIHRlbGwgdGhlIGNsaWVudCB0byBrZWVwIHRoZSBwYWdlIGl0IGhhcyAqLwotICAgIH0KLSAgICBpZiAocmVkaXJlY3QgJiYgKnJlZGlyZWN0KSB7Ci0gICAgICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJMb2NhdGlvbiIsIHJlZGlyZWN0KTsKLSAgICAgICAgcmV0dXJuIFJFRElSRUNUOyAgICAgICAgLyogbXVzdCBiZSBhIFVSTCwgc28gcmVkaXJlY3QgdG8gaXQgKi8KLSAgICB9Ci0gICAgcmV0dXJuIFNFUlZFUl9FUlJPUjsKLX0KLQotc3RhdGljIHZvaWQgbWVudV9oZWFkZXIocmVxdWVzdF9yZWMgKnIsIGNoYXIgKm1lbnUpCi17Ci0gICAgci0+Y29udGVudF90eXBlID0gInRleHQvaHRtbCI7Ci0gICAgYXBfc2VuZF9odHRwX2hlYWRlcihyKTsKLQotCi0gICAgYXBfcnZwdXRzKHIsIERPQ1RZUEVfSFRNTF8zXzIsICI8aHRtbD48aGVhZD5cbjx0aXRsZT5NZW51IGZvciAiLCByLT51cmksCi0gICAgICAgICAgICI8L3RpdGxlPlxuPC9oZWFkPjxib2R5PlxuIiwgTlVMTCk7Ci0KLSAgICBpZiAoIXN0cmNhc2VjbXAobWVudSwgImZvcm1hdHRlZCIpKSB7Ci0gICAgICAgIGFwX3J2cHV0cyhyLCAiPGgxPk1lbnUgZm9yICIsIHItPnVyaSwgIjwvaDE+XG48aHI+XG5cbiIsIE5VTEwpOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgbWVudV9ibGFuayhyZXF1ZXN0X3JlYyAqciwgY2hhciAqbWVudSkKLXsKLSAgICBpZiAoIXN0cmNhc2VjbXAobWVudSwgImZvcm1hdHRlZCIpKSB7Ci0gICAgICAgIGFwX3JwdXRzKCJcbiIsIHIpOwotICAgIH0KLSAgICBpZiAoIXN0cmNhc2VjbXAobWVudSwgInNlbWlmb3JtYXR0ZWQiKSkgewotICAgICAgICBhcF9ycHV0cygiPGJyPlxuIiwgcik7Ci0gICAgfQotICAgIGlmICghc3RyY2FzZWNtcChtZW51LCAidW5mb3JtYXR0ZWQiKSkgewotICAgICAgICBhcF9ycHV0cygiXG4iLCByKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBtZW51X2NvbW1lbnQocmVxdWVzdF9yZWMgKnIsIGNoYXIgKm1lbnUsIGNoYXIgKmNvbW1lbnQpCi17Ci0gICAgaWYgKCFzdHJjYXNlY21wKG1lbnUsICJmb3JtYXR0ZWQiKSkgewotICAgICAgICBhcF9ycHV0cygiXG4iLCByKTsgICAgICAgICAvKiBwcmludCBqdXN0IGEgbmV3bGluZSBpZiAnZm9ybWF0dGVkJyAqLwotICAgIH0KLSAgICBpZiAoIXN0cmNhc2VjbXAobWVudSwgInNlbWlmb3JtYXR0ZWQiKSAmJiAqY29tbWVudCkgewotICAgICAgICBhcF9ydnB1dHMociwgY29tbWVudCwgIlxuIiwgTlVMTCk7Ci0gICAgfQotICAgIGlmICghc3RyY2FzZWNtcChtZW51LCAidW5mb3JtYXR0ZWQiKSAmJiAqY29tbWVudCkgewotICAgICAgICBhcF9ydnB1dHMociwgY29tbWVudCwgIlxuIiwgTlVMTCk7Ci0gICAgfQotICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAvKiBjb21tZW50cyBhcmUgaWdub3JlZCBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zvcm1hdHRlZCcgZm9ybSAqLwotfQotCi1zdGF0aWMgdm9pZCBtZW51X2RlZmF1bHQocmVxdWVzdF9yZWMgKnIsIGNoYXIgKm1lbnUsIGNoYXIgKmhyZWYsIGNoYXIgKnRleHQpCi17Ci0gICAgaWYgKCFzdHJjYXNlY21wKGhyZWYsICJlcnJvciIpIHx8ICFzdHJjYXNlY21wKGhyZWYsICJub2NvbnRlbnQiKSkgewotICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAvKiBkb24ndCBwcmludCBzdWNoIGxpbmVzLCB0aGVzZSBhcmVuJ3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbGx5IGhyZWYncyAqLwotICAgIH0KLSAgICBpZiAoIXN0cmNhc2VjbXAobWVudSwgImZvcm1hdHRlZCIpKSB7Ci0gICAgICAgIGFwX3J2cHV0cyhyLCAiPHByZT4oRGVmYXVsdCkgPGEgaHJlZj1cIiIsIGhyZWYsICJcIj4iLCB0ZXh0LAotICAgICAgICAgICAgICAgIjwvYT48L3ByZT5cbiIsIE5VTEwpOwotICAgIH0KLSAgICBpZiAoIXN0cmNhc2VjbXAobWVudSwgInNlbWlmb3JtYXR0ZWQiKSkgewotICAgICAgICBhcF9ydnB1dHMociwgIjxwcmU+KERlZmF1bHQpIDxhIGhyZWY9XCIiLCBocmVmLCAiXCI+IiwgdGV4dCwKLSAgICAgICAgICAgICAgICI8L2E+PC9wcmU+XG4iLCBOVUxMKTsKLSAgICB9Ci0gICAgaWYgKCFzdHJjYXNlY21wKG1lbnUsICJ1bmZvcm1hdHRlZCIpKSB7Ci0gICAgICAgIGFwX3J2cHV0cyhyLCAiPGEgaHJlZj1cIiIsIGhyZWYsICJcIj4iLCB0ZXh0LCAiPC9hPiIsIE5VTEwpOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIG1lbnVfZGlyZWN0aXZlKHJlcXVlc3RfcmVjICpyLCBjaGFyICptZW51LCBjaGFyICpocmVmLCBjaGFyICp0ZXh0KQotewotICAgIGlmICghc3RyY2FzZWNtcChocmVmLCAiZXJyb3IiKSB8fCAhc3RyY2FzZWNtcChocmVmLCAibm9jb250ZW50IikpIHsKLSAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgLyogZG9uJ3QgcHJpbnQgc3VjaCBsaW5lcywgYXMgdGhpcyBpc24ndAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsbHkgYW4gaHJlZiAqLwotICAgIH0KLSAgICBpZiAoIXN0cmNhc2VjbXAobWVudSwgImZvcm1hdHRlZCIpKSB7Ci0gICAgICAgIGFwX3J2cHV0cyhyLCAiPHByZT4gICAgICAgICAgPGEgaHJlZj1cIiIsIGhyZWYsICJcIj4iLCB0ZXh0LAotICAgICAgICAgICAgICAgIjwvYT48L3ByZT5cbiIsIE5VTEwpOwotICAgIH0KLSAgICBpZiAoIXN0cmNhc2VjbXAobWVudSwgInNlbWlmb3JtYXR0ZWQiKSkgewotICAgICAgICBhcF9ydnB1dHMociwgIjxwcmU+ICAgICAgICAgIDxhIGhyZWY9XCIiLCBocmVmLCAiXCI+IiwgdGV4dCwKLSAgICAgICAgICAgICAgICI8L2E+PC9wcmU+XG4iLCBOVUxMKTsKLSAgICB9Ci0gICAgaWYgKCFzdHJjYXNlY21wKG1lbnUsICJ1bmZvcm1hdHRlZCIpKSB7Ci0gICAgICAgIGFwX3J2cHV0cyhyLCAiPGEgaHJlZj1cIiIsIGhyZWYsICJcIj4iLCB0ZXh0LCAiPC9hPiIsIE5VTEwpOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIG1lbnVfZm9vdGVyKHJlcXVlc3RfcmVjICpyKQotewotICAgIGFwX3JwdXRzKCJcblxuPC9ib2R5PlxuPC9odG1sPlxuIiwgcik7ICAgICAgICAgLyogZmluaXNoIHRoZSBtZW51ICovCi19Ci0KLXN0YXRpYyBpbnQgaW1hcF9oYW5kbGVyKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNoYXIgaW5wdXRbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgKmRpcmVjdGl2ZTsKLSAgICBjaGFyICp2YWx1ZTsKLSAgICBjaGFyICpocmVmX3RleHQ7Ci0gICAgY2hhciAqYmFzZTsKLSAgICBjaGFyICpyZWRpcmVjdDsKLSAgICBjaGFyICptYXBkZmx0OwotICAgIGNoYXIgKmNsb3Nlc3QgPSBOVUxMOwotICAgIGRvdWJsZSBjbG9zZXN0X3lldCA9IC0xOwotICAgIGFwX3N0YXR1c190IHN0YXR1czsKLQotICAgIGRvdWJsZSB0ZXN0cG9pbnRbMl07Ci0gICAgZG91YmxlIHBvaW50YXJyYXlbTUFYVkVSVFMgKyAxXVsyXTsKLSAgICBpbnQgdmVydGV4OwotCi0gICAgY2hhciAqc3RyaW5nX3BvczsKLSAgICBpbnQgc2hvd21lbnUgPSAwOwotCi0gICAgaW1hcF9jb25mX3JlYyAqaWNyID0gYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsICZpbWFwX21vZHVsZSk7Ci0KLSAgICBjaGFyICppbWFwX21lbnUgPSBpY3ItPmltYXBfbWVudSA/IGljci0+aW1hcF9tZW51IDogSU1BUF9NRU5VX0RFRkFVTFQ7Ci0gICAgY2hhciAqaW1hcF9kZWZhdWx0ID0gaWNyLT5pbWFwX2RlZmF1bHQKLQkJCSAgICA/ICBpY3ItPmltYXBfZGVmYXVsdCA6IElNQVBfREVGQVVMVF9ERUZBVUxUOwotICAgIGNoYXIgKmltYXBfYmFzZSA9IGljci0+aW1hcF9iYXNlID8gaWNyLT5pbWFwX2Jhc2UgOiBJTUFQX0JBU0VfREVGQVVMVDsKLQotICAgIGNvbmZpZ2ZpbGVfdCAqaW1hcDsgCi0KLSAgICBpZiAoci0+bWV0aG9kX251bWJlciAhPSBNX0dFVCkgewotCXJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICBzdGF0dXMgPSBhcF9wY2ZnX29wZW5maWxlKCZpbWFwLCByLT5wb29sLCByLT5maWxlbmFtZSk7Ci0KLSAgICBpZiAoc3RhdHVzICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIHJldHVybiBOT1RfRk9VTkQ7Ci0gICAgfQotCi0gICAgYmFzZSA9IGltYXBfdXJsKHIsIE5VTEwsIGltYXBfYmFzZSk7ICAgICAgICAgLyogc2V0IGJhc2UgYWNjb3JkaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZGVmYXVsdCAqLwotICAgIGlmICghYmFzZSkgewotCXJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICB9Ci0gICAgbWFwZGZsdCA9IGltYXBfdXJsKHIsIE5VTEwsIGltYXBfZGVmYXVsdCk7ICAgLyogYW5kIGRlZmF1bHQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwgZGVmYXVsdCAqLwotICAgIGlmICghbWFwZGZsdCkgewotCXJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICB9Ci0KLSAgICB0ZXN0cG9pbnRbWF0gPSBnZXRfeF9jb29yZChyLT5hcmdzKTsKLSAgICB0ZXN0cG9pbnRbWV0gPSBnZXRfeV9jb29yZChyLT5hcmdzKTsKLQotICAgIGlmICgodGVzdHBvaW50W1hdID09IC0xIHx8IHRlc3Rwb2ludFtZXSA9PSAtMSkgfHwKLSAgICAgICAgKHRlc3Rwb2ludFtYXSA9PSAwICYmIHRlc3Rwb2ludFtZXSA9PSAwKSkgewotICAgICAgICAvKiBpZiBlaXRoZXIgaXMgLTEgb3IgaWYgYm90aCBhcmUgemVybyAobmV3IEx5bngpICovCi0gICAgICAgIC8qIHdlIGRvbid0IGhhdmUgdmFsaWQgY29vcmRpbmF0ZXMgKi8KLSAgICAgICAgdGVzdHBvaW50W1hdID0gLTE7Ci0gICAgICAgIHRlc3Rwb2ludFtZXSA9IC0xOwotICAgICAgICBpZiAoc3RybmNhc2VjbXAoaW1hcF9tZW51LCAibm9uZSIsIDIpKSB7Ci0gICAgICAgICAgICBzaG93bWVudSA9IDE7ICAgICAgIC8qIHNob3cgdGhlIG1lbnUgX3VubGVzc18gSW1hcE1lbnUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vbmUnIG9yICdubycgKi8KLQl9Ci0gICAgfQotCi0gICAgaWYgKHNob3dtZW51KSB7ICAgICAgICAgICAgIC8qIHNlbmQgc3RhcnQgb2YgaW1hZ2VtYXAgbWVudSBpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZSdyZSBnb2luZyB0byAqLwotICAgICAgICBtZW51X2hlYWRlcihyLCBpbWFwX21lbnUpOwotICAgIH0KLQotICAgIHdoaWxlICghYXBfY2ZnX2dldGxpbmUoaW5wdXQsIHNpemVvZihpbnB1dCksIGltYXApKSB7Ci0gICAgICAgIGlmICghaW5wdXRbMF0pIHsKLSAgICAgICAgICAgIGlmIChzaG93bWVudSkgewotICAgICAgICAgICAgICAgIG1lbnVfYmxhbmsociwgaW1hcF9tZW51KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlucHV0WzBdID09ICcjJykgewotICAgICAgICAgICAgaWYgKHNob3dtZW51KSB7Ci0gICAgICAgICAgICAgICAgbWVudV9jb21tZW50KHIsIGltYXBfbWVudSwgaW5wdXQgKyAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBibGFuayBsaW5lcyBhbmQgY29tbWVudHMgYXJlIGlnbm9yZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgd2UgYXJlbid0IHByaW50aW5nIGEgbWVudSAqLwotCi0JLyogZmluZCB0aGUgZmlyc3QgdHdvIHNwYWNlIGRlbGltaXRlZCBmaWVsZHMsIHJlY2FsbCB0aGF0Ci0JICogYXBfY2ZnX2dldGxpbmUgaGFzIHJlbW92ZWQgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlLgotCSAqCi0JICogbm90ZSB0aGF0IHdlJ3JlIHRva2VuaXppbmcgYXMgd2UgZ28uLi4gaWYgd2Ugd2VyZSB0byB1c2UgdGhlCi0JICogYXBfZ2V0d29yZCgpIGNsYXNzIG9mIGZ1bmN0aW9ucyB3ZSB3b3VsZCBlbmQgdXAgYWxsb2NhdGluZyBleHRyYQotCSAqIG1lbW9yeSBmb3IgZXZlcnkgbGluZSBvZiB0aGUgbWFwIGZpbGUKLQkgKi8KLSAgICAgICAgc3RyaW5nX3BvcyA9IGlucHV0OwotCWlmICghKnN0cmluZ19wb3MpIHsJCS8qIG5lZWQgYXQgbGVhc3QgdHdvIGZpZWxkcyAqLwotCSAgICBnb3RvIG5lZWRfMl9maWVsZHM7Ci0JfQotCi0JZGlyZWN0aXZlID0gc3RyaW5nX3BvczsKLQl3aGlsZSAoKnN0cmluZ19wb3MgJiYgIWFwX2lzc3BhY2UoKnN0cmluZ19wb3MpKSB7CS8qIHBhc3QgZGlyZWN0aXZlICovCi0JICAgICsrc3RyaW5nX3BvczsKLQl9Ci0JaWYgKCEqc3RyaW5nX3BvcykgewkJLyogbmVlZCBhdCBsZWFzdCB0d28gZmllbGRzICovCi0JICAgIGdvdG8gbmVlZF8yX2ZpZWxkczsKLQl9Ci0JKnN0cmluZ19wb3MrKyA9ICdcMCc7Ci0KLQlpZiAoISpzdHJpbmdfcG9zKSB7CQkvKiBuZWVkIGF0IGxlYXN0IHR3byBmaWVsZHMgKi8KLQkgICAgZ290byBuZWVkXzJfZmllbGRzOwotCX0KLQl3aGlsZSgqc3RyaW5nX3BvcyAmJiBhcF9pc3NwYWNlKCpzdHJpbmdfcG9zKSkgeyAvKiBwYXN0IHdoaXRlc3BhY2UgKi8KLQkgICAgKytzdHJpbmdfcG9zOwotCX0KLQotCXZhbHVlID0gc3RyaW5nX3BvczsKLQl3aGlsZSAoKnN0cmluZ19wb3MgJiYgIWFwX2lzc3BhY2UoKnN0cmluZ19wb3MpKSB7CS8qIHBhc3QgdmFsdWUgKi8KLQkgICAgKytzdHJpbmdfcG9zOwotCX0KLQlpZiAoYXBfaXNzcGFjZSgqc3RyaW5nX3BvcykpIHsKLQkgICAgKnN0cmluZ19wb3MrKyA9ICdcMCc7Ci0JfQotCWVsc2UgewotCSAgICAvKiBlbmQgb2YgaW5wdXQsIGRvbid0IGFkdmFuY2UgcGFzdCBpdCAqLwotCSAgICAqc3RyaW5nX3BvcyA9ICdcMCc7Ci0JfQotCi0gICAgICAgIGlmICghc3RybmNhc2VjbXAoZGlyZWN0aXZlLCAiYmFzZSIsIDQpKSB7ICAgICAgIC8qIGJhc2UsIGJhc2VfdXJpICovCi0gICAgICAgICAgICBiYXNlID0gaW1hcF91cmwociwgTlVMTCwgdmFsdWUpOwotCSAgICBpZiAoIWJhc2UpIHsKLQkJZ290byBtZW51X2JhaWw7Ci0JICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgLyogYmFzZSBpcyBuZXZlciBwcmludGVkIHRvIGEgbWVudSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgcmVhZF9xdW90ZWQoJnN0cmluZ19wb3MsICZocmVmX3RleHQpOwotCi0gICAgICAgIGlmICghc3RyY2FzZWNtcChkaXJlY3RpdmUsICJkZWZhdWx0IikpIHsgICAgICAgIC8qIGRlZmF1bHQgKi8KLSAgICAgICAgICAgIG1hcGRmbHQgPSBpbWFwX3VybChyLCBOVUxMLCB2YWx1ZSk7Ci0JICAgIGlmICghbWFwZGZsdCkgewotCQlnb3RvIG1lbnVfYmFpbDsKLQkgICAgfQotICAgICAgICAgICAgaWYgKHNob3dtZW51KSB7ICAgICAvKiBwcmludCB0aGUgZGVmYXVsdCBpZiB0aGVyZSdzIGEgbWVudSAqLwotICAgICAgICAgICAgICAgIHJlZGlyZWN0ID0gaW1hcF91cmwociwgYmFzZSwgbWFwZGZsdCk7Ci0JCWlmICghcmVkaXJlY3QpIHsKLQkJICAgIGdvdG8gbWVudV9iYWlsOwotCQl9Ci0gICAgICAgICAgICAgICAgbWVudV9kZWZhdWx0KHIsIGltYXBfbWVudSwgcmVkaXJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWZfdGV4dCA/IGhyZWZfdGV4dCA6IG1hcGRmbHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICB2ZXJ0ZXggPSAwOwotICAgICAgICB3aGlsZSAodmVydGV4IDwgTUFYVkVSVFMgJiYKLSAgICAgICAgICAgICAgIHNzY2FuZihzdHJpbmdfcG9zLCAiJWxmJSpbLCBdJWxmIiwKLSAgICAgICAgICAgICAgICAgICAgICAmcG9pbnRhcnJheVt2ZXJ0ZXhdW1hdLCAmcG9pbnRhcnJheVt2ZXJ0ZXhdW1ldKSA9PSAyKSB7Ci0gICAgICAgICAgICAvKiBOb3cgc2tpcCB3aGF0IHdlIGp1c3QgcmVhZC4uLiB3ZSBjYW4ndCB1c2UgQU5TSWlzbSAlbiAqLwotICAgICAgICAgICAgd2hpbGUgKGFwX2lzc3BhY2UoKnN0cmluZ19wb3MpKSB7ICAgICAgLyogcGFzdCB3aGl0ZXNwYWNlICovCi0gICAgICAgICAgICAgICAgc3RyaW5nX3BvcysrOwotCSAgICB9Ci0gICAgICAgICAgICB3aGlsZSAoYXBfaXNkaWdpdCgqc3RyaW5nX3BvcykpIHsgICAgICAvKiBhbmQgdGhlIDFzdCBudW1iZXIgKi8KLSAgICAgICAgICAgICAgICBzdHJpbmdfcG9zKys7Ci0JICAgIH0KLSAgICAgICAgICAgIHN0cmluZ19wb3MrKzsgICAgICAgLyogc2tpcCB0aGUgJywnICovCi0gICAgICAgICAgICB3aGlsZSAoYXBfaXNzcGFjZSgqc3RyaW5nX3BvcykpIHsgICAgICAvKiBwYXN0IGFueSBtb3JlIHdoaXRlc3BhY2UgKi8KLSAgICAgICAgICAgICAgICBzdHJpbmdfcG9zKys7Ci0JICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChhcF9pc2RpZ2l0KCpzdHJpbmdfcG9zKSkgeyAgICAgIC8qIDJuZCBudW1iZXIgKi8KLSAgICAgICAgICAgICAgICBzdHJpbmdfcG9zKys7Ci0JICAgIH0KLSAgICAgICAgICAgIHZlcnRleCsrOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBzbyBsb25nIGFzIHRoZXJlIGFyZSBtb3JlIHZlcnRpY2VzIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQsIGFuZCB3ZSBoYXZlIHJvb20sIHJlYWQgdGhlbSBpbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2Ugc3RhcnQgd2hlcmUgd2UgbGVmdCBvZmYgb2YgdGhlIGxhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NjYW5mLCBub3QgYXQgdGhlIGJlZ2lubmluZy4gKi8KLQotICAgICAgICBwb2ludGFycmF5W3ZlcnRleF1bWF0gPSAtMTsgICAgIC8qIHNpZ25hbHMgdGhlIGVuZCBvZiB2ZXJ0aWNlcyAqLwotCi0gICAgICAgIGlmIChzaG93bWVudSkgewotCSAgICBpZiAoIWhyZWZfdGV4dCkgewotCQlyZWFkX3F1b3RlZCgmc3RyaW5nX3BvcywgJmhyZWZfdGV4dCk7ICAgICAvKiBocmVmIHRleHQgY291bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBoZXJlIGluc3RlYWQgKi8KLQkgICAgfQotICAgICAgICAgICAgcmVkaXJlY3QgPSBpbWFwX3VybChyLCBiYXNlLCB2YWx1ZSk7Ci0JICAgIGlmICghcmVkaXJlY3QpIHsKLQkJZ290byBtZW51X2JhaWw7Ci0JICAgIH0KLSAgICAgICAgICAgIG1lbnVfZGlyZWN0aXZlKHIsIGltYXBfbWVudSwgcmVkaXJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmX3RleHQgPyBocmVmX3RleHQgOiB2YWx1ZSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvKiBub3RlIHRoYXQgd2UgZG9uJ3QgbWFrZSBpdCBwYXN0IGhlcmUgaWYgd2UgYXJlIG1ha2luZyBhIG1lbnUgKi8KLQotICAgICAgICBpZiAodGVzdHBvaW50W1hdID09IC0xIHx8IHBvaW50YXJyYXlbMF1bWF0gPT0gLTEpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgLyogZG9uJ3QgdHJ5IHRoZSBmb2xsb3dpbmcgdGVzdHMgaWYgdGVzdHBvaW50cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgaW52YWxpZCwgb3IgaWYgdGhlcmUgYXJlIG5vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzICovCi0JfQotCi0gICAgICAgIGlmICghc3RyY2FzZWNtcChkaXJlY3RpdmUsICJwb2x5IikpIHsgICAvKiBwb2x5ICovCi0KLSAgICAgICAgICAgIGlmIChwb2ludGlucG9seSh0ZXN0cG9pbnQsIHBvaW50YXJyYXkpKSB7Ci0JCWFwX2NmZ19jbG9zZWZpbGUoaW1hcCk7Ci0gICAgICAgICAgICAgICAgcmVkaXJlY3QgPSBpbWFwX3VybChyLCBiYXNlLCB2YWx1ZSk7Ci0JCWlmICghcmVkaXJlY3QpIHsKLQkJICAgIHJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLQkJfQotICAgICAgICAgICAgICAgIHJldHVybiAoaW1hcF9yZXBseShyLCByZWRpcmVjdCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXN0cmNhc2VjbXAoZGlyZWN0aXZlLCAiY2lyY2xlIikpIHsgICAgICAgICAvKiBjaXJjbGUgKi8KLQotICAgICAgICAgICAgaWYgKHBvaW50aW5jaXJjbGUodGVzdHBvaW50LCBwb2ludGFycmF5KSkgewotCQlhcF9jZmdfY2xvc2VmaWxlKGltYXApOwotICAgICAgICAgICAgICAgIHJlZGlyZWN0ID0gaW1hcF91cmwociwgYmFzZSwgdmFsdWUpOwotCQlpZiAoIXJlZGlyZWN0KSB7Ci0JCSAgICByZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0JCX0KLSAgICAgICAgICAgICAgICByZXR1cm4gKGltYXBfcmVwbHkociwgcmVkaXJlY3QpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFzdHJjYXNlY21wKGRpcmVjdGl2ZSwgInJlY3QiKSkgeyAgIC8qIHJlY3QgKi8KLQotICAgICAgICAgICAgaWYgKHBvaW50aW5yZWN0KHRlc3Rwb2ludCwgcG9pbnRhcnJheSkpIHsKLQkJYXBfY2ZnX2Nsb3NlZmlsZShpbWFwKTsKLSAgICAgICAgICAgICAgICByZWRpcmVjdCA9IGltYXBfdXJsKHIsIGJhc2UsIHZhbHVlKTsKLQkJaWYgKCFyZWRpcmVjdCkgewotCQkgICAgcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotCQl9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChpbWFwX3JlcGx5KHIsIHJlZGlyZWN0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc3RyY2FzZWNtcChkaXJlY3RpdmUsICJwb2ludCIpKSB7ICAvKiBwb2ludCAqLwotCi0gICAgICAgICAgICBpZiAoaXNfY2xvc2VyKHRlc3Rwb2ludCwgcG9pbnRhcnJheSwgJmNsb3Nlc3RfeWV0KSkgewotCQljbG9zZXN0ID0gYXBfcHN0cmR1cChyLT5wb29sLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3ZlIG9uIHRvIG5leHQgbGluZSB3aGV0aGVyIGl0J3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdCBvciBub3QgKi8KLQotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3RoaW5nIG1hdGNoZWQsIHNvIHdlIGdldCBhbm90aGVyIGxpbmUhICovCi0KLSAgICBhcF9jZmdfY2xvc2VmaWxlKGltYXApOyAgICAgICAgLyogd2UgYXJlIGRvbmUgd2l0aCB0aGUgbWFwIGZpbGU7IGNsb3NlIGl0ICovCi0KLSAgICBpZiAoc2hvd21lbnUpIHsKLSAgICAgICAgbWVudV9mb290ZXIocik7ICAgICAgICAgLyogZmluaXNoIHRoZSBtZW51IGFuZCB3ZSBhcmUgZG9uZSAqLwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgaWYgKGNsb3Nlc3QpIHsgICAgICAgICAgICAgLyogaWYgYSAncG9pbnQnIGRpcmVjdGl2ZSBoYXMgYmVlbiBzZWVuICovCi0gICAgICAgIHJlZGlyZWN0ID0gaW1hcF91cmwociwgYmFzZSwgY2xvc2VzdCk7Ci0JaWYgKCFyZWRpcmVjdCkgewotCSAgICByZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0JfQotICAgICAgICByZXR1cm4gKGltYXBfcmVwbHkociwgcmVkaXJlY3QpKTsKLSAgICB9Ci0KLSAgICBpZiAobWFwZGZsdCkgeyAgICAgICAgICAgICAvKiBhIGRlZmF1bHQgc2hvdWxkIGJlIGRlZmluZWQsIGV2ZW4gaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5ICdub2NvbnRlbnQnICovCi0gICAgICAgIHJlZGlyZWN0ID0gaW1hcF91cmwociwgYmFzZSwgbWFwZGZsdCk7Ci0JaWYgKCFyZWRpcmVjdCkgewotCSAgICByZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0JfQotICAgICAgICByZXR1cm4gKGltYXBfcmVwbHkociwgcmVkaXJlY3QpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7ICAgICAgICAvKiBJZiB3ZSBtYWtlIGl0IHRoaXMgZmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlIGZhaWxlZC4gVGhleSBsb3NlISAqLwotCi1uZWVkXzJfZmllbGRzOgotICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0JCSJtYXAgZmlsZSAlcywgbGluZSAlZCBzeW50YXggZXJyb3I6IHJlcXVpcmVzIGF0ICIKLSAgICAgICAgICAgICAgICAibGVhc3QgdHdvIGZpZWxkcyIsIHItPnVyaSwgaW1hcC0+bGluZV9udW1iZXIpOwotICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotbWVudV9iYWlsOgotICAgIGFwX2NmZ19jbG9zZWZpbGUoaW1hcCk7Ci0gICAgaWYgKHNob3dtZW51KSB7Ci0JLyogVGhlcmUncyBub3QgbXVjaCBlbHNlIHdlIGNhbiBkbyAuLi4gd2UndmUgYWxyZWFkeSBzZW50IHRoZSBoZWFkZXJzCi0JICogdG8gdGhlIGNsaWVudC4KLQkgKi8KLQlhcF9ycHV0cygiXG5cblthbiBpbnRlcm5hbCBzZXJ2ZXIgZXJyb3Igb2NjdXJlZF1cbiIsIHIpOwotCW1lbnVfZm9vdGVyKHIpOwotCXJldHVybiBPSzsKLSAgICB9Ci0gICAgcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotfQotCi0KLXN0YXRpYyBjb25zdCBoYW5kbGVyX3JlYyBpbWFwX2hhbmRsZXJzW10gPQotewotICAgIHtJTUFQX01BR0lDX1RZUEUsIGltYXBfaGFuZGxlcn0sCi0gICAgeyJpbWFwLWZpbGUiLCBpbWFwX2hhbmRsZXJ9LAotICAgIHtOVUxMfQotfTsKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGltYXBfbW9kdWxlID0KLXsKLSAgICBTVEFOREFSRDIwX01PRFVMRV9TVFVGRiwKLSAgICBjcmVhdGVfaW1hcF9kaXJfY29uZmlnLCAgICAgLyogZGlyIGNvbmZpZyBjcmVhdGVyICovCi0gICAgbWVyZ2VfaW1hcF9kaXJfY29uZmlncywgICAgIC8qIGRpciBtZXJnZXIgLS0tIGRlZmF1bHQgaXMgdG8gb3ZlcnJpZGUgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogc2VydmVyIGNvbmZpZyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBzZXJ2ZXIgY29uZmlnICovCi0gICAgaW1hcF9jbWRzLCAgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgYXBfdGFibGVfdCAqLwotICAgIGltYXBfaGFuZGxlcnMsICAgICAgICAgICAgICAvKiBoYW5kbGVycyAqLwotICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciBob29rcyAqLwotfTsKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWFwcGVycy9tb2RfaW1hcC5leHAgYi9tb2R1bGVzL21hcHBlcnMvbW9kX2ltYXAuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTBlMGI4Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWFwcGVycy9tb2RfaW1hcC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbWFwX21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tYXBwZXJzL21vZF9uZWdvdGlhdGlvbi5jIGIvbW9kdWxlcy9tYXBwZXJzL21vZF9uZWdvdGlhdGlvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTMwMWRiLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWFwcGVycy9tb2RfbmVnb3RpYXRpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDI3NTQgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogbW9kX25lZ290aWF0aW9uLmM6IGtlZXBzIHRyYWNrIG9mIE1JTUUgdHlwZXMgdGhlIGNsaWVudCBpcyB3aWxsaW5nIHRvCi0gKiBhY2NlcHQsIGFuZCBjb250YWlucyBjb2RlIHRvIGhhbmRsZSB0eXBlIGFyYml0cmF0aW9uLgotICoKLSAqIHJzdAotICovCi0KLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlICJhcHJfZmlsZV9pby5oIgotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJ1dGlsX3NjcmlwdC5oIgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotCi0jZGVmaW5lIE1BUF9GSUxFX01BR0lDX1RZUEUgImFwcGxpY2F0aW9uL3gtdHlwZS1tYXAiCi0KLS8qIENvbW1hbmRzIC0tLSBjb25maWd1cmluZyBkb2N1bWVudCBjYWNoaW5nIG9uIGEgcGVyICh2aXJ0dWFsPykKLSAqIHNlcnZlciBiYXNpcy4uLiAKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmxhbmd1YWdlX3ByaW9yaXR5OwotfSBuZWdfZGlyX2NvbmZpZzsKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIG5lZ290aWF0aW9uX21vZHVsZTsKLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9uZWdfZGlyX2NvbmZpZyhhcF9jb250ZXh0X3QgKnAsIGNoYXIgKmR1bW15KQotewotICAgIG5lZ19kaXJfY29uZmlnICpuZXcgPSAobmVnX2Rpcl9jb25maWcgKikgYXBfcGFsbG9jKHAsIHNpemVvZihuZWdfZGlyX2NvbmZpZykpOwotCi0gICAgbmV3LT5sYW5ndWFnZV9wcmlvcml0eSA9IGFwX21ha2VfYXJyYXkocCwgNCwgc2l6ZW9mKGNoYXIgKikpOwotICAgIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyB2b2lkICptZXJnZV9uZWdfZGlyX2NvbmZpZ3MoYXBfY29udGV4dF90ICpwLCB2b2lkICpiYXNldiwgdm9pZCAqYWRkdikKLXsKLSAgICBuZWdfZGlyX2NvbmZpZyAqYmFzZSA9IChuZWdfZGlyX2NvbmZpZyAqKSBiYXNldjsKLSAgICBuZWdfZGlyX2NvbmZpZyAqYWRkID0gKG5lZ19kaXJfY29uZmlnICopIGFkZHY7Ci0gICAgbmVnX2Rpcl9jb25maWcgKm5ldyA9IChuZWdfZGlyX2NvbmZpZyAqKSBhcF9wYWxsb2MocCwgc2l6ZW9mKG5lZ19kaXJfY29uZmlnKSk7Ci0KLSAgICAvKiBnaXZlIHByaW9yaXR5IHRvIHRoZSBjb25maWcgaW4gdGhlIHN1YmRpcmVjdG9yeSAqLwotICAgIG5ldy0+bGFuZ3VhZ2VfcHJpb3JpdHkgPSBhcF9hcHBlbmRfYXJyYXlzKHAsIGFkZC0+bGFuZ3VhZ2VfcHJpb3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+bGFuZ3VhZ2VfcHJpb3JpdHkpOwotICAgIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbGFuZ3VhZ2VfcHJpb3JpdHkoY21kX3Bhcm1zICpjbWQsIHZvaWQgKm4sIGNoYXIgKmxhbmcpCi17Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmFyciA9ICgobmVnX2Rpcl9jb25maWcgKikgbiktPmxhbmd1YWdlX3ByaW9yaXR5OwotICAgIGNoYXIgKipsYW5ncCA9IChjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycik7Ci0KLSAgICAqbGFuZ3AgPSBsYW5nOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqY2FjaGVfbmVnb3RpYXRlZF9kb2NzKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZHVtbXkyKQotewotICAgIHZvaWQgKnNlcnZlcl9jb25mID0gY21kLT5zZXJ2ZXItPm1vZHVsZV9jb25maWc7Ci0KLSAgICBhcF9zZXRfbW9kdWxlX2NvbmZpZyhzZXJ2ZXJfY29uZiwgJm5lZ290aWF0aW9uX21vZHVsZSwgIkNhY2hlIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgZG9fY2FjaGVfbmVnb3RpYXRlZF9kb2NzKHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgcmV0dXJuIChhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAmbmVnb3RpYXRpb25fbW9kdWxlKSAhPSBOVUxMKTsKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIG5lZ290aWF0aW9uX2NtZHNbXSA9Ci17Ci0gICAgeyJDYWNoZU5lZ290aWF0ZWREb2NzIiwgY2FjaGVfbmVnb3RpYXRlZF9kb2NzLCBOVUxMLCBSU1JDX0NPTkYsIE5PX0FSR1MsCi0gICAgICJubyBhcmd1bWVudHMgKGVpdGhlciBwcmVzZW50IG9yIGFic2VudCkifSwKLSAgICB7Ikxhbmd1YWdlUHJpb3JpdHkiLCBzZXRfbGFuZ3VhZ2VfcHJpb3JpdHksIE5VTEwsIE9SX0ZJTEVJTkZPLCBJVEVSQVRFLAotICAgICAic3BhY2UtZGVsaW1pdGVkIGxpc3Qgb2YgTUlNRSBsYW5ndWFnZSBhYmJyZXZpYXRpb25zIn0sCi0gICAge05VTEx9Ci19OwotCi0vKgotICogUmVjb3JkIG9mIGF2YWlsYWJsZSBpbmZvIG9uIGEgbWVkaWEgdHlwZSBzcGVjaWZpZWQgYnkgdGhlIGNsaWVudAotICogKHdlIGFsc28gdXNlICdlbSBmb3IgZW5jb2RpbmdzIGFuZCBsYW5ndWFnZXMpCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgYWNjZXB0X3JlYyB7Ci0gICAgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAgIC8qIE1VU1QgYmUgbG93ZXJjYXNlICovCi0gICAgZmxvYXQgcXVhbGl0eTsKLSAgICBmbG9hdCBsZXZlbDsKLSAgICBjaGFyICpjaGFyc2V0OyAgICAgICAgICAgICAgLyogZm9yIGNvbnRlbnQtdHlwZSBvbmx5ICovCi19IGFjY2VwdF9yZWM7Ci0KLS8qCi0gKiBSZWNvcmQgb2YgYXZhaWxhYmxlIGluZm8gb24gYSBwYXJ0aWN1bGFyIHZhcmlhbnQKLSAqCi0gKiBOb3RlIHRoYXQgYSBmZXcgb2YgdGhlc2UgZmllbGRzIGFyZSB1cGRhdGVkIGJ5IHRoZSBhY3R1YWwgbmVnb3RpYXRpb24KLSAqIGNvZGUuICBUaGVzZSBhcmU6Ci0gKgotICogbGV2ZWxfbWF0Y2hlZCAtLS0gaW5pdGlhbGl6ZWQgdG8gemVyby4gIFNldCB0byB0aGUgdmFsdWUgb2YgbGV2ZWwKLSAqICAgICAgICAgICAgIGlmIHRoZSBjbGllbnQgYWN0dWFsbHkgYWNjZXB0cyB0aGlzIG1lZGlhIHR5cGUgYXQgdGhhdAotICogICAgICAgICAgICAgbGV2ZWwgKGFuZCAqbm90KiBpZiBpdCBnb3QgaW4gb24gYSB3aWxkY2FyZCkuICBTZWUgbGV2ZWxfY21wCi0gKiAgICAgICAgICAgICBiZWxvdy4KLSAqIG1pbWVfc3RhcnMgLS0gaW5pdGlhbGl6ZWQgdG8gemVyby4gIFNldCB0byB0aGUgbnVtYmVyIG9mIHN0YXJzCi0gKiAgICAgICAgICAgICAgIHByZXNlbnQgaW4gdGhlIGJlc3QgbWF0Y2hpbmcgQWNjZXB0IGhlYWRlciBlbGVtZW50LgotICogICAgICAgICAgICAgICAxIGZvciBzdGFyL3N0YXIsIDIgZm9yIHR5cGUvc3RhciBhbmQgMyBmb3IKLSAqICAgICAgICAgICAgICAgdHlwZS9zdWJ0eXBlLgotICoKLSAqIGRlZmluaXRlIC0tIGluaXRpYWxpemVkIHRvIDEuICBTZXQgdG8gMCBpZiB0aGVyZSBpcyBhIG1hdGNoIHdoaWNoCi0gKiAgICAgICAgICAgICBtYWtlcyB0aGUgdmFyaWFudCBub24tZGVmaW5pdGUgYWNjb3JkaW5nIHRvIHRoZSBydWxlcwotICogICAgICAgICAgICAgaW4gcmZjMjI5Ni4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB2YXJfcmVjIHsKLSAgICByZXF1ZXN0X3JlYyAqc3ViX3JlcTsgICAgICAgLyogTWF5IGJlIE5VTEwgKGlzLCBmb3IgbWFwIGZpbGVzKSAqLwotICAgIGNoYXIgKm1pbWVfdHlwZTsgICAgICAgICAgICAvKiBNVVNUIGJlIGxvd2VyY2FzZSAqLwotICAgIGNoYXIgKmZpbGVfbmFtZTsKLSAgICBjb25zdCBjaGFyICpjb250ZW50X2VuY29kaW5nOwotICAgIGFwX2FycmF5X2hlYWRlcl90ICpjb250ZW50X2xhbmd1YWdlczsgICAvKiBsaXN0IG9mIGxhbmd1YWdlcyBmb3IgdGhpcyB2YXJpYW50ICovCi0gICAgY2hhciAqY29udGVudF9jaGFyc2V0OwotICAgIGNoYXIgKmRlc2NyaXB0aW9uOwotCi0gICAgLyogVGhlIG5leHQgZml2ZSBpdGVtcyBnaXZlIHRoZSBxdWFsaXR5IHZhbHVlcyBmb3IgdGhlIGRpbWVuc2lvbnMKLSAgICAgKiBvZiBuZWdvdGlhdGlvbiBmb3IgdGhpcyB2YXJpYW50LiBUaGV5IGFyZSBvYnRhaW5lZCBmcm9tIHRoZQotICAgICAqIGFwcHJvcHJpYXRlIGhlYWRlciBsaW5lcywgZXhjZXB0IGZvciBzb3VyY2VfcXVhbGl0eSwgd2hpY2gKLSAgICAgKiBpcyBvYnRhaW5lZCBmcm9tIHRoZSB2YXJpYW50IGl0c2VsZiAodGhlICdxcycgcGFyYW1ldGVyIHZhbHVlCi0gICAgICogZnJvbSB0aGUgdmFyaWFudCdzIG1pbWUtdHlwZSkuIEFwYXJ0IGZyb20gc291cmNlX3F1YWxpdHksCi0gICAgICogdGhlc2UgdmFsdWVzIGFyZSBzZXQgd2hlbiB3ZSBmaW5kIHRoZSBxdWFsaXR5IGZvciBlYWNoIHZhcmlhbnQKLSAgICAgKiAoc2VlIGJlc3RfbWF0Y2goKSkuIHNvdXJjZV9xdWFsaXR5IGlzIHNldCBmcm9tIHRoZSAncXMnIHBhcmFtZXRlcgotICAgICAqIG9mIHRoZSB2YXJpYW50IGRlc2NyaXB0aW9uIG9yIG1pbWUgdHlwZTogc2VlIHNldF9taW1lX2ZpZWxkcygpLgotICAgICAqLwotICAgIGZsb2F0IGxhbmdfcXVhbGl0eTsgICAgICAgICAvKiBxdWFsaXR5IG9mIHRoaXMgdmFyaWFudCdzIGxhbmd1YWdlICovCi0gICAgZmxvYXQgZW5jb2RpbmdfcXVhbGl0eTsgICAgIC8qIGRpdHRvIGVuY29kaW5nICovCi0gICAgZmxvYXQgY2hhcnNldF9xdWFsaXR5OyAgICAgIC8qIGRpdHRvIGNoYXJzZXQgKi8KLSAgICBmbG9hdCBtaW1lX3R5cGVfcXVhbGl0eTsgICAgLyogZGl0dG8gbWVkaWEgdHlwZSAqLwotICAgIGZsb2F0IHNvdXJjZV9xdWFsaXR5OyAgICAgICAvKiBzb3VyY2UgcXVhbGl0eSBmb3IgdGhpcyB2YXJpYW50ICovCi0KLSAgICAvKiBOb3cgc29tZSBzcGVjaWFsIHZhbHVlcyAqLwotICAgIGZsb2F0IGxldmVsOyAgICAgICAgICAgICAgICAvKiBBdXhpbGlhcnkgdG8gY29udGVudC10eXBlLi4uICovCi0gICAgZmxvYXQgYnl0ZXM7ICAgICAgICAgICAgICAgIC8qIGNvbnRlbnQgbGVuZ3RoLCBpZiBrbm93biAqLwotICAgIGludCBsYW5nX2luZGV4OyAgICAgICAgICAgICAvKiBwcmUgSFRUUC8xLjEgbGFuZ3VhZ2UgcHJpb3JpdHkgc3R1ZmYgKi8KLSAgICBpbnQgaXNfcHNldWRvX2h0bWw7ICAgICAgICAgLyogdGV4dC9odG1sLCAqb3IqIHRoZSBJTkNMVURFU19NQUdJQ19UWVBFcyAqLwotCi0gICAgLyogQWJvdmUgYXJlIGFsbCB3cml0dGVuLW9uY2UgcHJvcGVydGllcyBvZiB0aGUgdmFyaWFudC4gIFRoZQotICAgICAqIHRocmVlIGZpZWxkcyBiZWxvdyBhcmUgY2hhbmdlZCBkdXJpbmcgbmVnb3RpYXRpb246Ci0gICAgICovCi0KLSAgICBmbG9hdCBsZXZlbF9tYXRjaGVkOwotICAgIGludCBtaW1lX3N0YXJzOwotICAgIGludCBkZWZpbml0ZTsKLX0gdmFyX3JlYzsKLQotLyogU29tZXRoaW5nIHRvIGNhcnJ5IGFyb3VuZCB0aGUgc3RhdGUgb2YgbmVnb3RpYXRpb24gKGFuZCB0byBrZWVwCi0gKiBhbGwgb2YgdGhpcyB0aHJlYWQtc2FmZSkuLi4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgYXBfY29udGV4dF90ICpwb29sOwotICAgIHJlcXVlc3RfcmVjICpyOwotICAgIGNoYXIgKmRpcl9uYW1lOwotICAgIGludCBhY2NlcHRfcTsgICAgICAgICAgICAgICAvKiAxIGlmIGFuIEFjY2VwdCBpdGVtIGhhcyBhIHE9IHBhcmFtICovCi0gICAgZmxvYXQgZGVmYXVsdF9sYW5nX3F1YWxpdHk7IC8qIGZpZGRsZSBsYW5nIHEgZm9yIHZhcmlhbnRzIHdpdGggbm8gbGFuZyAqLwotCi0gICAgLyogdGhlIGFycmF5IHBvaW50ZXJzIGJlbG93IGFyZSBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIGFjY2VwdAotICAgICAqIGhlYWRlcnMgYXJlIG5vdCBwcmVzZW50Ci0gICAgICovCi0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmFjY2VwdHM7ICAgICAgICAgICAgLyogYWNjZXB0X3JlY3MgKi8KLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqYWNjZXB0X2VuY29kaW5nczsgICAvKiBhY2NlcHRfcmVjcyAqLwotICAgIGFwX2FycmF5X2hlYWRlcl90ICphY2NlcHRfY2hhcnNldHM7ICAgIC8qIGFjY2VwdF9yZWNzICovCi0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmFjY2VwdF9sYW5nczsgICAgICAgLyogYWNjZXB0X3JlY3MgKi8KLQotICAgIGFwX2FycmF5X2hlYWRlcl90ICphdmFpbF92YXJzOyAgICAgICAgIC8qIGF2YWlsYWJsZSB2YXJpYW50cyAqLwotCi0gICAgaW50IGNvdW50X211bHRpdmlld3NfdmFyaWFudHM7ICAgIC8qIG51bWJlciBvZiB2YXJpYW50cyBmb3VuZCBvbiBkaXNrICovCi0KLSAgICBpbnQgaXNfdHJhbnNwYXJlbnQ7ICAgICAgIC8qIDEgaWYgdGhpcyByZXNvdXJjZSBpcyB0cmFucy4gbmVnb3RpYWJsZSAqLwotCi0gICAgaW50IGRvbnRfZmlkZGxlX2hlYWRlcnM7ICAvKiAxIGlmIHdlIG1heSBub3QgZmlkZGxlIHdpdGggYWNjZXB0IGhkcnMgKi8KLSAgICBpbnQgdWFfc3VwcG9ydHNfdHJhbnM7ICAgIC8qIDEgaWYgdWEgc3VwcG9ydHMgdHJhbnMgbmVnb3RpYXRpb24gKi8KLSAgICBpbnQgc2VuZF9hbHRlcm5hdGVzOyAgICAgIC8qIDEgaWYgd2Ugd2FudCB0byBzZW5kIGFuIEFsdGVybmF0ZXMgaGVhZGVyICovCi0gICAgaW50IG1heV9jaG9vc2U7ICAgICAgICAgICAvKiAxIGlmIHdlIG1heSBjaG9vc2UgYSB2YXJpYW50IGZvciB0aGUgY2xpZW50ICovCi0gICAgaW50IHVzZV9ydnNhOyAgICAgICAgICAgICAvKiAxIGlmIHdlIG11c3QgdXNlIFJWU0EvMS4wIG5lZ290aWF0aW9uIGFsZ28gKi8KLX0gbmVnb3RpYXRpb25fc3RhdGU7Ci0KLS8qIEEgZmV3IGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIHZhcl9yZWNzLgotICogQ2xlYW5pbmcgb3V0IHRoZSBmaWVsZHMuLi4KLSAqLwotCi1zdGF0aWMgdm9pZCBjbGVhbl92YXJfcmVjKHZhcl9yZWMgKm1pbWVfaW5mbykKLXsKLSAgICBtaW1lX2luZm8tPnN1Yl9yZXEgPSBOVUxMOwotICAgIG1pbWVfaW5mby0+bWltZV90eXBlID0gIiI7Ci0gICAgbWltZV9pbmZvLT5maWxlX25hbWUgPSAiIjsKLSAgICBtaW1lX2luZm8tPmNvbnRlbnRfZW5jb2RpbmcgPSBOVUxMOwotICAgIG1pbWVfaW5mby0+Y29udGVudF9sYW5ndWFnZXMgPSBOVUxMOwotICAgIG1pbWVfaW5mby0+Y29udGVudF9jaGFyc2V0ID0gIiI7Ci0gICAgbWltZV9pbmZvLT5kZXNjcmlwdGlvbiA9ICIiOwotCi0gICAgbWltZV9pbmZvLT5pc19wc2V1ZG9faHRtbCA9IDA7Ci0gICAgbWltZV9pbmZvLT5sZXZlbCA9IDAuMGY7Ci0gICAgbWltZV9pbmZvLT5sZXZlbF9tYXRjaGVkID0gMC4wZjsKLSAgICBtaW1lX2luZm8tPmJ5dGVzID0gMC4wZjsKLSAgICBtaW1lX2luZm8tPmxhbmdfaW5kZXggPSAtMTsKLSAgICBtaW1lX2luZm8tPm1pbWVfc3RhcnMgPSAwOwotICAgIG1pbWVfaW5mby0+ZGVmaW5pdGUgPSAxOwotCi0gICAgbWltZV9pbmZvLT5jaGFyc2V0X3F1YWxpdHkgPSAxLjBmOwotICAgIG1pbWVfaW5mby0+ZW5jb2RpbmdfcXVhbGl0eSA9IDEuMGY7Ci0gICAgbWltZV9pbmZvLT5sYW5nX3F1YWxpdHkgPSAxLjBmOwotICAgIG1pbWVfaW5mby0+bWltZV90eXBlX3F1YWxpdHkgPSAxLjBmOwotICAgIG1pbWVfaW5mby0+c291cmNlX3F1YWxpdHkgPSAwLjBmOwotfQotCi0vKiBJbml0aWFsaXppbmcgdGhlIHJlbGV2YW50IGZpZWxkcyBvZiBhIHZhcmlhbnQgcmVjb3JkIGZyb20gdGhlCi0gKiBhY2NlcHRfaW5mbyByZWFkIG91dCBvZiBpdHMgY29udGVudC10eXBlLCBvbmUgd2F5IG9yIGFub3RoZXIuCi0gKi8KLQotc3RhdGljIHZvaWQgc2V0X21pbWVfZmllbGRzKHZhcl9yZWMgKnZhciwgYWNjZXB0X3JlYyAqbWltZV9pbmZvKQotewotICAgIHZhci0+bWltZV90eXBlID0gbWltZV9pbmZvLT5uYW1lOwotICAgIHZhci0+c291cmNlX3F1YWxpdHkgPSBtaW1lX2luZm8tPnF1YWxpdHk7Ci0gICAgdmFyLT5sZXZlbCA9IG1pbWVfaW5mby0+bGV2ZWw7Ci0gICAgdmFyLT5jb250ZW50X2NoYXJzZXQgPSBtaW1lX2luZm8tPmNoYXJzZXQ7Ci0KLSAgICB2YXItPmlzX3BzZXVkb19odG1sID0gKCFzdHJjbXAodmFyLT5taW1lX3R5cGUsICJ0ZXh0L2h0bWwiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIXN0cmNtcCh2YXItPm1pbWVfdHlwZSwgSU5DTFVERVNfTUFHSUNfVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFzdHJjbXAodmFyLT5taW1lX3R5cGUsIElOQ0xVREVTX01BR0lDX1RZUEUzKSk7Ci19Ci0KLS8qIENyZWF0ZSBhIHZhcmlhbnQgbGlzdCB2YWxpZGF0b3IgaW4gciB1c2luZyBpbmZvIGZyb20gdmxpc3RyLiAqLwotCi1zdGF0aWMgdm9pZCBzZXRfdmxpc3RfdmFsaWRhdG9yKHJlcXVlc3RfcmVjICpyLCByZXF1ZXN0X3JlYyAqdmxpc3RyKQotewotICAgIC8qIENhbGN1bGF0aW5nIHRoZSB2YXJpYW50IGxpc3QgdmFsaWRhdG9yIGlzIHNpbWlsYXIgdG8KLSAgICAgKiBjYWxjdWxhdGluZyBhbiBldGFnIGZvciB0aGUgc291cmNlIG9mIHRoZSB2YXJpYW50IGxpc3QKLSAgICAgKiBpbmZvcm1hdGlvbiwgc28gd2UgdXNlIGFwX21ha2VfZXRhZygpLiAgTm90ZSB0aGF0IHRoaXMKLSAgICAgKiB2YWxpZGF0b3IgY2FuIGJlICd3ZWFrJyBpbiBleHRyZW1lIGNhc2UuCi0gICAgICovCi0gICAgYXBfdXBkYXRlX210aW1lKHZsaXN0ciwgdmxpc3RyLT5maW5mby5tdGltZSk7Ci0gICAgci0+dmxpc3RfdmFsaWRhdG9yID0gYXBfbWFrZV9ldGFnKHZsaXN0ciwgMCk7Ci0KLSAgICAvKiBhcF9zZXRfZXRhZyB3aWxsIGxhdGVyIHRha2Ugci0+dmxpc3RfdmFsaWRhdG9yIGludG8gYWNjb3VudAotICAgICAqIHdoZW4gY3JlYXRpbmcgdGhlIGV0YWcgaGVhZGVyCi0gICAgICovCi19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogUGFyc2luZyAobGlzdHMgb2YpIG1lZGlhIHR5cGVzIGFuZCB0aGVpciBwYXJhbWV0ZXJzLCBhcyBzZWVuIGluCi0gKiBIVFRQRCBoZWFkZXIgbGluZXMgYW5kIGVsc2V3aGVyZS4KLSAqLwotCi0vKgotICogR2V0IGEgc2luZ2xlIG1pbWUgdHlwZSBlbnRyeSAtLS0gb25lIG1lZGlhIHR5cGUgYW5kIHBhcmFtZXRlcnM7Ci0gKiBlbnRlciB0aGUgdmFsdWVzIHdlIHJlY29nbml6ZSBpbnRvIHRoZSBhcmd1bWVudCBhY2NlcHRfcmVjCi0gKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKmdldF9lbnRyeShhcF9jb250ZXh0X3QgKnAsIGFjY2VwdF9yZWMgKnJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWNjZXB0X2xpbmUpCi17Ci0gICAgcmVzdWx0LT5xdWFsaXR5ID0gMS4wZjsKLSAgICByZXN1bHQtPmxldmVsID0gMC4wZjsKLSAgICByZXN1bHQtPmNoYXJzZXQgPSAiIjsKLQotICAgIC8qCi0gICAgICogTm90ZSB0aGF0IHRoaXMgaGFuZGxlcyB3aGF0IEkgZ2F0aGVyIGlzIHRoZSAib2xkIGZvcm1hdCIsCi0gICAgICoKLSAgICAgKiAgICBBY2NlcHQ6IHRleHQvaHRtbCB0ZXh0L3BsYWluIG1vby96b3QKLSAgICAgKgotICAgICAqIHdpdGhvdXQgYW55IGNvbXBhdGliaWxpdHkga2x1ZGdlcyAtLS0gaWYgdGhlIHRva2VuIGFmdGVyIHRoZQotICAgICAqIE1JTUUgdHlwZSBiZWdpbnMgd2l0aCBhIHNlbWljb2xvbiwgd2Uga25vdyB3ZSdyZSBsb29raW5nIGF0IHBhcm1zLAotICAgICAqIG90aGVyd2lzZSwgd2Uga25vdyB3ZSBhcmVuJ3QuICAoU28gd2h5IGFsbCB0aGUgcGlzc2luZyBhbmQgbW9hbmluZwotICAgICAqIGluIHRoZSBDRVJOIHNlcnZlciBjb2RlPyAgSSBtdXN0IGJlIG1pc3Npbmcgc29tZXRoaW5nKS4KLSAgICAgKi8KLQotICAgIHJlc3VsdC0+bmFtZSA9IGFwX2dldF90b2tlbihwLCAmYWNjZXB0X2xpbmUsIDApOwotICAgIGFwX3N0cl90b2xvd2VyKHJlc3VsdC0+bmFtZSk7ICAgICAvKiBZb3Ugd2FudCBjYXNlIGluc2Vuc2l0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB5b3UnbGwgKmdldCogY2FzZSBpbnNlbnNpdGl2ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAvKiBLTFVER0UhISEgRGVmYXVsdCBIVE1MIHRvIGxldmVsIDIuMCB1bmxlc3MgdGhlIGJyb3dzZXIKLSAgICAgKiAqZXhwbGljaXRseSogc2F5cyBzb21ldGhpbmcgZWxzZS4KLSAgICAgKi8KLQotICAgIGlmICghc3RyY21wKHJlc3VsdC0+bmFtZSwgInRleHQvaHRtbCIpICYmIChyZXN1bHQtPmxldmVsID09IDAuMCkpIHsKLSAgICAgICAgcmVzdWx0LT5sZXZlbCA9IDIuMGY7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAocmVzdWx0LT5uYW1lLCBJTkNMVURFU19NQUdJQ19UWVBFKSkgewotICAgICAgICByZXN1bHQtPmxldmVsID0gMi4wZjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChyZXN1bHQtPm5hbWUsIElOQ0xVREVTX01BR0lDX1RZUEUzKSkgewotICAgICAgICByZXN1bHQtPmxldmVsID0gMy4wZjsKLSAgICB9Ci0KLSAgICB3aGlsZSAoKmFjY2VwdF9saW5lID09ICc7JykgewotICAgICAgICAvKiBQYXJhbWV0ZXJzIC4uLiAqLwotCi0gICAgICAgIGNoYXIgKnBhcm07Ci0gICAgICAgIGNoYXIgKmNwOwotICAgICAgICBjaGFyICplbmQ7Ci0KLSAgICAgICAgKythY2NlcHRfbGluZTsKLSAgICAgICAgcGFybSA9IGFwX2dldF90b2tlbihwLCAmYWNjZXB0X2xpbmUsIDEpOwotCi0gICAgICAgIC8qIExvb2sgZm9yICd2YXIgPSB2YWx1ZScgLS0tIGFuZCBtYWtlIHN1cmUgdGhlIHZhciBpcyBpbiBsY2FzZS4gKi8KLQotICAgICAgICBmb3IgKGNwID0gcGFybTsgKCpjcCAmJiAhYXBfaXNzcGFjZSgqY3ApICYmICpjcCAhPSAnPScpOyArK2NwKSB7Ci0gICAgICAgICAgICAqY3AgPSBhcF90b2xvd2VyKCpjcCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoISpjcCkgewotICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAvKiBObyAnPSc7IGp1c3QgaWdub3JlIGl0LiAqLwotICAgICAgICB9Ci0KLSAgICAgICAgKmNwKysgPSAnXDAnOyAgICAgICAgICAgLyogRGVsaW1pdCB2YXIgKi8KLSAgICAgICAgd2hpbGUgKCpjcCAmJiAoYXBfaXNzcGFjZSgqY3ApIHx8ICpjcCA9PSAnPScpKSB7Ci0gICAgICAgICAgICArK2NwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCpjcCA9PSAnIicpIHsKLSAgICAgICAgICAgICsrY3A7Ci0gICAgICAgICAgICBmb3IgKGVuZCA9IGNwOwotICAgICAgICAgICAgICAgICAoKmVuZCAmJiAqZW5kICE9ICdcbicgJiYgKmVuZCAhPSAnXHInICYmICplbmQgIT0gJ1wiJyk7Ci0gICAgICAgICAgICAgICAgIGVuZCsrKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoZW5kID0gY3A7ICgqZW5kICYmICFhcF9pc3NwYWNlKCplbmQpKTsgZW5kKyspOwotICAgICAgICB9Ci0gICAgICAgIGlmICgqZW5kKSB7Ci0gICAgICAgICAgICAqZW5kID0gJ1wwJzsgICAgICAgIC8qIHN0cmlwIGVuZGluZyBxdW90ZSBvciByZXR1cm4gKi8KLSAgICAgICAgfQotICAgICAgICBhcF9zdHJfdG9sb3dlcihjcCk7Ci0KLSAgICAgICAgaWYgKHBhcm1bMF0gPT0gJ3EnCi0gICAgICAgICAgICAmJiAocGFybVsxXSA9PSAnXDAnIHx8IChwYXJtWzFdID09ICdzJyAmJiBwYXJtWzJdID09ICdcMCcpKSkgewotICAgICAgICAgICAgcmVzdWx0LT5xdWFsaXR5ID0gYXRvZihjcCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocGFybVswXSA9PSAnbCcgJiYgIXN0cmNtcCgmcGFybVsxXSwgImV2ZWwiKSkgewotICAgICAgICAgICAgcmVzdWx0LT5sZXZlbCA9IGF0b2YoY3ApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJjbXAocGFybSwgImNoYXJzZXQiKSkgewotICAgICAgICAgICAgcmVzdWx0LT5jaGFyc2V0ID0gY3A7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoKmFjY2VwdF9saW5lID09ICcsJykgewotICAgICAgICArK2FjY2VwdF9saW5lOwotICAgIH0KLQotICAgIHJldHVybiBhY2NlcHRfbGluZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRGVhbGluZyB3aXRoIGhlYWRlciBsaW5lcyAuLi4KLSAqCi0gKiBBY2NlcHQsIEFjY2VwdC1DaGFyc2V0LCBBY2NlcHQtTGFuZ3VhZ2UgYW5kIEFjY2VwdC1FbmNvZGluZwotICogYXJlIGhhbmRsZWQgYnkgZG9faGVhZGVyX2xpbmUoKSAtIHRoZXkgYWxsIGhhdmUgdGhlIHNhbWUKLSAqIGJhc2ljIHN0cnVjdHVyZSBvZiBhIGxpc3Qgb2YgaXRlbXMgb2YgdGhlIGZvcm1hdAotICogICAgbmFtZTsgcT1OOyBjaGFyc2V0PVRFWFQKLSAqCi0gKiB3aGVyZSBjaGFyc2V0IGlzIG9ubHkgdmFsaWQgaW4gQWNjZXB0LgotICovCi0KLXN0YXRpYyBhcF9hcnJheV9oZWFkZXJfdCAqZG9faGVhZGVyX2xpbmUoYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyICphY2NlcHRfbGluZSkKLXsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqYWNjZXB0X3JlY3M7Ci0KLSAgICBpZiAoIWFjY2VwdF9saW5lKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGFjY2VwdF9yZWNzID0gYXBfbWFrZV9hcnJheShwLCA0MCwgc2l6ZW9mKGFjY2VwdF9yZWMpKTsKLQotICAgIHdoaWxlICgqYWNjZXB0X2xpbmUpIHsKLSAgICAgICAgYWNjZXB0X3JlYyAqbmV3ID0gKGFjY2VwdF9yZWMgKikgYXBfcHVzaF9hcnJheShhY2NlcHRfcmVjcyk7Ci0gICAgICAgIGFjY2VwdF9saW5lID0gZ2V0X2VudHJ5KHAsIG5ldywgYWNjZXB0X2xpbmUpOwotICAgIH0KLQotICAgIHJldHVybiBhY2NlcHRfcmVjczsKLX0KLQotLyogR2l2ZW4gdGhlIHRleHQgb2YgdGhlIENvbnRlbnQtTGFuZ3VhZ2VzOiBsaW5lIGZyb20gdGhlIHZhciBtYXAgZmlsZSwKLSAqIHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBsYW5ndWFnZXMgb2YgdGhpcyB2YXJpYW50Ci0gKi8KLQotc3RhdGljIGFwX2FycmF5X2hlYWRlcl90ICpkb19sYW5ndWFnZXNfbGluZShhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKipsYW5nX2xpbmUpCi17Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmxhbmdfcmVjcyA9IGFwX21ha2VfYXJyYXkocCwgMiwgc2l6ZW9mKGNoYXIgKikpOwotCi0gICAgaWYgKCFsYW5nX2xpbmUpIHsKLSAgICAgICAgcmV0dXJuIGxhbmdfcmVjczsKLSAgICB9Ci0KLSAgICB3aGlsZSAoKipsYW5nX2xpbmUpIHsKLSAgICAgICAgY2hhciAqKm5ldyA9IChjaGFyICoqKSBhcF9wdXNoX2FycmF5KGxhbmdfcmVjcyk7Ci0gICAgICAgICpuZXcgPSBhcF9nZXRfdG9rZW4ocCwgbGFuZ19saW5lLCAwKTsKLSAgICAgICAgYXBfc3RyX3RvbG93ZXIoKm5ldyk7Ci0gICAgICAgIGlmICgqKmxhbmdfbGluZSA9PSAnLCcgfHwgKipsYW5nX2xpbmUgPT0gJzsnKSB7Ci0gICAgICAgICAgICArKygqbGFuZ19saW5lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBsYW5nX3JlY3M7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEhhbmRsaW5nIGhlYWRlciBsaW5lcyBmcm9tIGNsaWVudHMuLi4KLSAqLwotCi1zdGF0aWMgbmVnb3RpYXRpb25fc3RhdGUgKnBhcnNlX2FjY2VwdF9oZWFkZXJzKHJlcXVlc3RfcmVjICpyKQotewotICAgIG5lZ290aWF0aW9uX3N0YXRlICpuZXcgPQotICAgICAgICAobmVnb3RpYXRpb25fc3RhdGUgKikgYXBfcGNhbGxvYyhyLT5wb29sLCBzaXplb2YobmVnb3RpYXRpb25fc3RhdGUpKTsKLSAgICBhY2NlcHRfcmVjICplbHRzOwotICAgIGFwX3RhYmxlX3QgKmhkcnMgPSByLT5oZWFkZXJzX2luOwotICAgIGludCBpOwotCi0gICAgbmV3LT5wb29sID0gci0+cG9vbDsKLSAgICBuZXctPnIgPSByOwotICAgIG5ldy0+ZGlyX25hbWUgPSBhcF9tYWtlX2RpcnN0cl9wYXJlbnQoci0+cG9vbCwgci0+ZmlsZW5hbWUpOwotCi0gICAgbmV3LT5hY2NlcHRzID0gZG9faGVhZGVyX2xpbmUoci0+cG9vbCwgYXBfdGFibGVfZ2V0KGhkcnMsICJBY2NlcHQiKSk7Ci0KLSAgICAvKiBjYWxjdWxhdGUgbmV3LT5hY2NlcHRfcSB2YWx1ZSAqLwotICAgIGlmIChuZXctPmFjY2VwdHMpIHsKLSAgICAgICAgZWx0cyA9IChhY2NlcHRfcmVjICopIG5ldy0+YWNjZXB0cy0+ZWx0czsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmV3LT5hY2NlcHRzLT5uZWx0czsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoZWx0c1tpXS5xdWFsaXR5IDwgMS4wKSB7Ci0gICAgICAgICAgICAgICAgbmV3LT5hY2NlcHRfcSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBuZXctPmFjY2VwdF9lbmNvZGluZ3MgPQotICAgICAgICBkb19oZWFkZXJfbGluZShyLT5wb29sLCBhcF90YWJsZV9nZXQoaGRycywgIkFjY2VwdC1FbmNvZGluZyIpKTsKLSAgICBuZXctPmFjY2VwdF9sYW5ncyA9Ci0gICAgICAgIGRvX2hlYWRlcl9saW5lKHItPnBvb2wsIGFwX3RhYmxlX2dldChoZHJzLCAiQWNjZXB0LUxhbmd1YWdlIikpOwotICAgIG5ldy0+YWNjZXB0X2NoYXJzZXRzID0KLSAgICAgICAgZG9faGVhZGVyX2xpbmUoci0+cG9vbCwgYXBfdGFibGVfZ2V0KGhkcnMsICJBY2NlcHQtQ2hhcnNldCIpKTsKLQotICAgIG5ldy0+YXZhaWxfdmFycyA9IGFwX21ha2VfYXJyYXkoci0+cG9vbCwgNDAsIHNpemVvZih2YXJfcmVjKSk7Ci0KLSAgICByZXR1cm4gbmV3OwotfQotCi0KLXN0YXRpYyB2b2lkIHBhcnNlX25lZ290aWF0ZV9oZWFkZXIocmVxdWVzdF9yZWMgKnIsIG5lZ290aWF0aW9uX3N0YXRlICpuZWcpCi17Ci0gICAgY29uc3QgY2hhciAqbmVnb3RpYXRlID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJOZWdvdGlhdGUiKTsKLSAgICBjaGFyICp0b2s7Ci0gICAgCi0gICAgLyogRmlyc3QsIGRlZmF1bHQgdG8gbm8gVENOLCBubyBBbHRlcm5hdGVzLCBhbmQgdGhlIG9yaWdpbmFsIEFwYWNoZQotICAgICAqIG5lZ290aWF0aW9uIGFsZ29yaXRobSB3aXRoIGZpZGRsZXMgZm9yIGJyb2tlbiBicm93c2VyIGNvbmZpZ3MuCi0gICAgICoKLSAgICAgKiBUbyBzYXZlIG5ldHdvcmsgYmFuZHdpZHRoLCB3ZSBkbyBub3QgY29uZmlndXJlIHRvIHNlbmQgYW4KLSAgICAgKiBBbHRlcm5hdGVzIGhlYWRlciB0byB0aGUgdXNlciBhZ2VudCBieSBkZWZhdWx0LiAgVXNlcgotICAgICAqIGFnZW50cyB0aGF0IHdhbnQgYW4gQWx0ZXJuYXRlcyBoZWFkZXIgZm9yIGFnZW50LWRyaXZlbgotICAgICAqIG5lZ290aWF0aW9uIHdpbGwgaGF2ZSB0byByZXF1ZXN0IGl0IGJ5IHNlbmRpbmcgYW4KLSAgICAgKiBhcHByb3ByaWF0ZSBOZWdvdGlhdGUgaGVhZGVyLgotICAgICAqLwotICAgIG5lZy0+dWFfc3VwcG9ydHNfdHJhbnMgICA9IDA7Ci0gICAgbmVnLT5zZW5kX2FsdGVybmF0ZXMgICAgID0gMDsKLSAgICBuZWctPm1heV9jaG9vc2UgICAgICAgICAgPSAxOwotICAgIG5lZy0+dXNlX3J2c2EgICAgICAgICAgICA9IDA7Ci0gICAgbmVnLT5kb250X2ZpZGRsZV9oZWFkZXJzID0gMDsKLQotICAgIGlmICghbmVnb3RpYXRlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoc3RyY21wKG5lZ290aWF0ZSwgInRyYW5zIikgPT0gMCkgewotICAgICAgICAvKiBMeW54IDIuNyBhbmQgMi44IHNlbmQgJ25lZ290aWF0ZTogdHJhbnMnIGV2ZW4gdGhvdWdoIHRoZXkKLSAgICAgICAgICogZG8gbm90IHN1cHBvcnQgdHJhbnNwYXJlbnQgY29udGVudCBuZWdvdGlhdGlvbiwgc28gZm9yIEx5bnggd2UKLSAgICAgICAgICogaWdub3JlIHRoZSBuZWdvdGlhdGUgaGVhZGVyIHdoZW4gaXRzIGNvbnRlbnRzIGFyZSBleGFjdGx5ICJ0cmFucyIuCi0gICAgICAgICAqIElmIGZ1dHVyZSB2ZXJzaW9ucyBvZiBMeW54IGV2ZXIgbmVlZCB0byBzYXkgJ25lZ290aWF0ZTogdHJhbnMnLAotICAgICAgICAgKiB0aGV5IGNhbiBzZW5kIHRoZSBlcXVpdmFsZW50ICduZWdvdGlhdGU6IHRyYW5zLCB0cmFucycgaW5zdGVhZAotICAgICAgICAgKiB0byBhdm9pZCB0cmlnZ2VyaW5nIHRoZSB3b3JrYXJvdW5kIGJlbG93LiAKLSAgICAgICAgICovCi0gICAgICAgIGNvbnN0IGNoYXIgKnVhID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJVc2VyLUFnZW50Iik7Ci0KLSAgICAgICAgaWYgKHVhICYmIChzdHJuY21wKHVhLCAiTHlueCIsIDQpID09IDApKQotICAgICAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG5lZy0+bWF5X2Nob29zZSA9IDA7ICAvKiBBbiBlbXB0eSBOZWdvdGlhdGUgd291bGQgcmVxdWlyZSAzMDAgcmVzcG9uc2UgKi8KLQotICAgIHdoaWxlICgodG9rID0gYXBfZ2V0X2xpc3RfaXRlbShuZWctPnBvb2wsICZuZWdvdGlhdGUpKSAhPSBOVUxMKSB7Ci0KLSAgICAgICAgaWYgKHN0cmNtcCh0b2ssICJ0cmFucyIpID09IDAgfHwKLSAgICAgICAgICAgIHN0cmNtcCh0b2ssICJ2bGlzdCIpID09IDAgfHwKLSAgICAgICAgICAgIHN0cmNtcCh0b2ssICJndWVzcy1zbWFsbCIpID09IDAgfHwKLSAgICAgICAgICAgIGFwX2lzZGlnaXQodG9rWzBdKSB8fAotICAgICAgICAgICAgc3RyY21wKHRvaywgIioiKSA9PSAwKSB7Ci0KLSAgICAgICAgICAgIC8qIFRoZSB1c2VyIGFnZW50IHN1cHBvcnRzIHRyYW5zcGFyZW50IG5lZ290aWF0aW9uICovCi0gICAgICAgICAgICBuZWctPnVhX3N1cHBvcnRzX3RyYW5zID0gMTsKLQotICAgICAgICAgICAgLyogU2VuZC1hbHRlcm5hdGVzIGNvdWxkIGJlIGNvbmZpZ3VyYWJsZSwgYnV0IG5vdGUKLSAgICAgICAgICAgICAqIHRoYXQgaXQgbXVzdCBiZSAxIGlmIHdlIGhhdmUgJ3ZsaXN0JyBpbiB0aGUKLSAgICAgICAgICAgICAqIG5lZ290aWF0ZSBoZWFkZXIuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG5lZy0+c2VuZF9hbHRlcm5hdGVzID0gMTsKLQotICAgICAgICAgICAgaWYgKHN0cmNtcCh0b2ssICIxLjAiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLyogd2UgbWF5IHVzZSB0aGUgUlZTQS8xLjAgYWxnb3JpdGhtLCBjb25maWd1cmUgZm9yIGl0ICovCi0gICAgICAgICAgICAgICAgbmVnLT5tYXlfY2hvb3NlID0gMTsKLSAgICAgICAgICAgICAgICBuZWctPnVzZV9ydnNhID0gMTsKLSAgICAgICAgICAgICAgICBuZWctPmRvbnRfZmlkZGxlX2hlYWRlcnMgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodG9rWzBdID09ICcqJykgewotICAgICAgICAgICAgICAgIC8qIHdlIG1heSB1c2UgYW55IHZhcmlhbnQgc2VsZWN0aW9uIGFsZ29yaXRobSwgY29uZmlndXJlCi0gICAgICAgICAgICAgICAgICogdG8gdXNlIHRoZSBBcGFjaGUgYWxnb3JpdGhtCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgbmVnLT5tYXlfY2hvb3NlID0gMTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKiBXZSBkaXNhYmxlIGhlYWRlciBmaWRkbGVzIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgYQotICAgICAgICAgICAgICAgICAqIGNsaWVudCBzZW5kaW5nIE5lZ290aWF0ZSBrbm93cyBob3cgdG8gc2VuZCBjb3JyZWN0Ci0gICAgICAgICAgICAgICAgICogaGVhZGVycyB3aGljaCBkb24ndCBuZWVkIGZpZGRsaW5nLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIG5lZy0+ZG9udF9maWRkbGVfaGVhZGVycyA9IDE7IAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0jaWZkZWYgTkVHX0RFQlVHCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICJkb250X2ZpZGRsZV9oZWFkZXJzPSVkIHVzZV9ydnNhPSVkIHVhX3N1cHBvcnRzX3RyYW5zPSVkICIKLSAgICAgICAgICAgICJzZW5kX2FsdGVybmF0ZXM9JWQsIG1heV9jaG9vc2U9JWQiLAotICAgICAgICAgICAgbmVnLT5kb250X2ZpZGRsZV9oZWFkZXJzLCBuZWctPnVzZV9ydnNhLCAgCi0gICAgICAgICAgICBuZWctPnVhX3N1cHBvcnRzX3RyYW5zLCBuZWctPnNlbmRfYWx0ZXJuYXRlcywgbmVnLT5tYXlfY2hvb3NlKTsKLSNlbmRpZgotCi19Ci0KLS8qIFNvbWV0aW1lcyBjbGllbnRzIHdpbGwgZ2l2ZSB1cyBubyBBY2NlcHQgaW5mbyBhdCBhbGw7IHRoaXMgcm91dGluZSBzZXRzCi0gKiB1cCB0aGUgc3RhbmRhcmQgZGVmYXVsdCBmb3IgdGhhdCBjYXNlLCBhbmQgYWxzbyBhcnJhbmdlcyBmb3IgdXMgdG8gYmUKLSAqIHdpbGxpbmcgdG8gcnVuIGEgQ0dJIHNjcmlwdCBpZiB3ZSBmaW5kIG9uZS4gIChJbiBmYWN0LCB3ZSBzZXQgdXAgdG8KLSAqIGRyYW1hdGljYWxseSBwcmVmZXIgQ0dJIHNjcmlwdHMgaW4gY2FzZXMgd2hlcmUgdGhhdCdzIGFwcHJvcHJpYXRlLAotICogZS5nLiwgUE9TVCBvciB3aGVuIFVSSSBpbmNsdWRlcyBxdWVyeSBhcmdzIG9yIGV4dHJhIHBhdGggaW5mbykuCi0gKi8KLXN0YXRpYyB2b2lkIG1heWJlX2FkZF9kZWZhdWx0X2FjY2VwdHMobmVnb3RpYXRpb25fc3RhdGUgKm5lZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVmZXJfc2NyaXB0cykKLXsKLSAgICBhY2NlcHRfcmVjICpuZXdfYWNjZXB0OwotCi0gICAgaWYgKCFuZWctPmFjY2VwdHMpIHsKLSAgICAgICAgbmVnLT5hY2NlcHRzID0gYXBfbWFrZV9hcnJheShuZWctPnBvb2wsIDQsIHNpemVvZihhY2NlcHRfcmVjKSk7Ci0KLSAgICAgICAgbmV3X2FjY2VwdCA9IChhY2NlcHRfcmVjICopIGFwX3B1c2hfYXJyYXkobmVnLT5hY2NlcHRzKTsKLSAgICAgICAgCi0gICAgICAgIG5ld19hY2NlcHQtPm5hbWUgPSAiKi8qIjsKLSAgICAgICAgbmV3X2FjY2VwdC0+cXVhbGl0eSA9IDEuMGY7Ci0gICAgICAgIG5ld19hY2NlcHQtPmxldmVsID0gMC4wZjsKLSAgICB9ICAgIAotCi0gICAgbmV3X2FjY2VwdCA9IChhY2NlcHRfcmVjICopIGFwX3B1c2hfYXJyYXkobmVnLT5hY2NlcHRzKTsKLQotICAgIG5ld19hY2NlcHQtPm5hbWUgPSBDR0lfTUFHSUNfVFlQRTsKLSAgICBpZiAobmVnLT51c2VfcnZzYSkgewotICAgICAgICBuZXdfYWNjZXB0LT5xdWFsaXR5ID0gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIG5ld19hY2NlcHQtPnF1YWxpdHkgPSBwcmVmZXJfc2NyaXB0cyA/IDIuMGYgOiAwLjAwMWY7Ci0gICAgfQotICAgIG5ld19hY2NlcHQtPmxldmVsID0gMC4wZjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogUGFyc2luZyB0eXBlLW1hcCBmaWxlcywgaW4gUm95J3MgbWV0YS9odHRwIGZvcm1hdCBhdWdtZW50ZWQgd2l0aAotICogIy1jb21tZW50cy4KLSAqLwotCi0vKiBSZWFkaW5nIFJGQzgyMi1zdHlsZSBoZWFkZXIgbGluZXMsIGlnbm9yaW5nICMtY29tbWVudHMgYW5kCi0gKiBoYW5kbGluZyBjb250aW51YXRpb25zLgotICovCi0KLWVudW0gaGVhZGVyX3N0YXRlIHsKLSAgICBoZWFkZXJfZW9mLCBoZWFkZXJfc2VlbiwgaGVhZGVyX3NlcAotfTsKLQotc3RhdGljIGVudW0gaGVhZGVyX3N0YXRlIGdldF9oZWFkZXJfbGluZShjaGFyICpidWZmZXIsIGludCBsZW4sIGFwX2ZpbGVfdCAqbWFwKQotewotICAgIGNoYXIgKmJ1Zl9lbmQgPSBidWZmZXIgKyBsZW47Ci0gICAgY2hhciAqY3A7Ci0gICAgY2hhciBjOwotCi0gICAgLyogR2V0IGEgbm9uY29tbWVudGVkIGxpbmUgKi8KLQotICAgIGRvIHsKLSAgICAgICAgaWYgKGFwX2ZnZXRzKGJ1ZmZlciwgTUFYX1NUUklOR19MRU4sIG1hcCkgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHJldHVybiBoZWFkZXJfZW9mOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoYnVmZmVyWzBdID09ICcjJyk7Ci0KLSAgICAvKiBJZiBibGFuaywganVzdCByZXR1cm4gaXQgLS0tIHRoaXMgZW5kcyBpbmZvcm1hdGlvbiBvbiB0aGlzIHZhcmlhbnQgKi8KLQotICAgIGZvciAoY3AgPSBidWZmZXI7ICgqY3AgJiYgYXBfaXNzcGFjZSgqY3ApKTsgKytjcCkgewotICAgICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBpZiAoKmNwID09ICdcMCcpIHsKLSAgICAgICAgcmV0dXJuIGhlYWRlcl9zZXA7Ci0gICAgfQotCi0gICAgLyogSWYgbm9uLWJsYW5rLCBnbyBsb29raW5nIGZvciBoZWFkZXIgbGluZXMsIGJ1dCBub3RlIHRoYXQgd2Ugc3RpbGwKLSAgICAgKiBoYXZlIHRvIHRyZWF0IGNvbW1lbnRzIHNwZWNpYWxseS4uLgotICAgICAqLwotCi0gICAgY3AgKz0gc3RybGVuKGNwKTsKLQotICAgIHdoaWxlIChhcF9nZXRjKCZjLCBtYXApICE9IEFQUl9FT0YpIHsKLSAgICAgICAgaWYgKGMgPT0gJyMnKSB7Ci0gICAgICAgICAgICAvKiBDb21tZW50IGxpbmUgKi8KLSAgICAgICAgICAgIHdoaWxlIChhcF9nZXRjKCZjLCBtYXApICE9IEVPRiAmJiBjICE9ICdcbicpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhcF9pc3NwYWNlKGMpKSB7Ci0gICAgICAgICAgICAvKiBMZWFkaW5nIHdoaXRlc3BhY2UuICBQT1NTSUJMRSBjb250aW51YXRpb24gbGluZQotICAgICAgICAgICAgICogQWxzbywgcG9zc2libHkgYmxhbmsgLS0tIGlmIHNvLCB3ZSB1bmdldGMoKSB0aGUgZmluYWwgbmV3bGluZQotICAgICAgICAgICAgICogc28gdGhhdCB3ZSB3aWxsIHBpY2sgdXAgdGhlIGJsYW5rIGxpbmUgdGhlIG5leHQgdGltZSAncm91bmQuCi0gICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgd2hpbGUgKGMgIT0gJ1xuJyAmJiBhcF9pc3NwYWNlKGMpKSB7Ci0gICAgICAgICAgICAgICAgaWYoYXBfZ2V0YygmYywgbWFwKSAhPSBBUFJfU1VDQ0VTUykKLQkJICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhcF91bmdldGMoYywgbWFwKTsKLQotICAgICAgICAgICAgaWYgKGMgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgIHJldHVybiBoZWFkZXJfc2VlbjsgICAgIC8qIEJsYW5rIGxpbmUgKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogQ29udGludWF0aW9uICovCi0KLSAgICAgICAgICAgIHdoaWxlIChjcCA8IGJ1Zl9lbmQgLSAyICYmIChhcF9nZXRjKCZjLCBtYXApKSAhPSBFT0YgJiYgYyAhPSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgKmNwKysgPSBjOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAqY3ArKyA9ICdcbic7Ci0gICAgICAgICAgICAqY3AgPSAnXDAnOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCi0gICAgICAgICAgICAvKiBMaW5lIGJlZ2lubmluZyB3aXRoIHNvbWV0aGluZyBvdGhlciB0aGFuIHdoaXRlc3BhY2UgKi8KLQotICAgICAgICAgICAgYXBfdW5nZXRjKGMsIG1hcCk7Ci0gICAgICAgICAgICByZXR1cm4gaGVhZGVyX3NlZW47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gaGVhZGVyX3NlZW47Ci19Ci0KLS8qIFN0cmlwcGluZyBvdXQgUkZDODIyIGNvbW1lbnRzICovCi0KLXN0YXRpYyB2b2lkIHN0cmlwX3BhcmVuX2NvbW1lbnRzKGNoYXIgKmhkcikKLXsKLSAgICAvKiBIbW1tLi4uIGlzIHRoaXMgY29ycmVjdD8gIEluIFJveSdzIGxhdGVzdCBkcmFmdCwgKGNvbW1lbnRzKSBjYW4gbmVzdCEgKi8KLSAgICAvKiBOb3BlLCBpdCBpc24ndCBjb3JyZWN0LiAgRmFpbHMgdG8gaGFuZGxlIGJhY2tzbGFzaCBlc2NhcGUgYXMgd2VsbC4gICAgKi8KLQotICAgIHdoaWxlICgqaGRyKSB7Ci0gICAgICAgIGlmICgqaGRyID09ICciJykgewotICAgICAgICAgICAgaGRyID0gc3RyY2hyKGhkciwgJyInKTsKLSAgICAgICAgICAgIGlmIChoZHIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICsraGRyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCpoZHIgPT0gJygnKSB7Ci0gICAgICAgICAgICB3aGlsZSAoKmhkciAmJiAqaGRyICE9ICcpJykgewotICAgICAgICAgICAgICAgICpoZHIrKyA9ICcgJzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCpoZHIpIHsKLSAgICAgICAgICAgICAgICAqaGRyKysgPSAnICc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICArK2hkcjsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyogR2V0dGluZyB0byBhIGhlYWRlciBib2R5IGZyb20gdGhlIGhlYWRlciAqLwotCi1zdGF0aWMgY2hhciAqbGNhc2VfaGVhZGVyX25hbWVfcmV0dXJuX2JvZHkoY2hhciAqaGVhZGVyLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjaGFyICpjcCA9IGhlYWRlcjsKLQotICAgIGZvciAoIDsgKmNwICYmICpjcCAhPSAnOicgOyArK2NwKSB7Ci0gICAgICAgICpjcCA9IGFwX3RvbG93ZXIoKmNwKTsKLSAgICB9Ci0KLSAgICBpZiAoISpjcCkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAgICJTeW50YXggZXJyb3IgaW4gdHlwZSBtYXAgLS0tIG5vICc6JzogJXMiLCByLT5maWxlbmFtZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGRvIHsKLSAgICAgICAgKytjcDsKLSAgICB9IHdoaWxlICgqY3AgJiYgYXBfaXNzcGFjZSgqY3ApKTsKLQotICAgIGlmICghKmNwKSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgIlN5bnRheCBlcnJvciBpbiB0eXBlIG1hcCAtLS0gbm8gaGVhZGVyIGJvZHk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICByLT5maWxlbmFtZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBjcDsKLX0KLQotc3RhdGljIGludCByZWFkX3R5cGVfbWFwKG5lZ290aWF0aW9uX3N0YXRlICpuZWcsIHJlcXVlc3RfcmVjICpycikKLXsKLSAgICByZXF1ZXN0X3JlYyAqciA9IG5lZy0+cjsKLSAgICBhcF9maWxlX3QgKm1hcCA9IE5VTEw7Ci0gICAgYXBfc3RhdHVzX3Qgc3RhdHVzOwotICAgIGNoYXIgYnVmZmVyW01BWF9TVFJJTkdfTEVOXTsKLSAgICBlbnVtIGhlYWRlcl9zdGF0ZSBoc3RhdGU7Ci0gICAgc3RydWN0IHZhcl9yZWMgbWltZV9pbmZvOwotICAgIGludCBoYXNfY29udGVudDsKLQotICAgIC8qIFdlIGFyZSBub3QgdXNpbmcgbXVsdGl2aWV3cyAqLwotICAgIG5lZy0+Y291bnRfbXVsdGl2aWV3c192YXJpYW50cyA9IDA7Ci0KLSAgICBpZiAoKHN0YXR1cyA9IGFwX29wZW4oJm1hcCwgcnItPmZpbGVuYW1lLCBBUFJfUkVBRCB8IEFQUl9CVUZGRVJFRCwKLSAgICAgICAgICAgICAgICBBUFJfT1NfREVGQVVMVCwgbmVnLT5wb29sKSkgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHN0YXR1cywgciwKLSAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGFjY2VzcyB0eXBlIG1hcCBmaWxlOiAlcyIsIHJyLT5maWxlbmFtZSk7Ci0gICAgICAgIHJldHVybiBIVFRQX0ZPUkJJRERFTjsKLSAgICB9Ci0KLSAgICBjbGVhbl92YXJfcmVjKCZtaW1lX2luZm8pOwotICAgIGhhc19jb250ZW50ID0gMDsKLQotICAgIGRvIHsKLSAgICAgICAgaHN0YXRlID0gZ2V0X2hlYWRlcl9saW5lKGJ1ZmZlciwgTUFYX1NUUklOR19MRU4sIG1hcCk7Ci0KLSAgICAgICAgaWYgKGhzdGF0ZSA9PSBoZWFkZXJfc2VlbikgewotICAgICAgICAgICAgY2hhciAqYm9keTEgPSBsY2FzZV9oZWFkZXJfbmFtZV9yZXR1cm5fYm9keShidWZmZXIsIG5lZy0+cik7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpib2R5OwotCi0gICAgICAgICAgICBpZiAoYm9keTEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTRVJWRVJfRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0cmlwX3BhcmVuX2NvbW1lbnRzKGJvZHkxKTsKLSAgICAgICAgICAgIGJvZHkgPSBib2R5MTsKLQotICAgICAgICAgICAgaWYgKCFzdHJuY21wKGJ1ZmZlciwgInVyaToiLCA0KSkgewotICAgICAgICAgICAgICAgIG1pbWVfaW5mby5maWxlX25hbWUgPSBhcF9nZXRfdG9rZW4obmVnLT5wb29sLCAmYm9keSwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghc3RybmNtcChidWZmZXIsICJjb250ZW50LXR5cGU6IiwgMTMpKSB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IGFjY2VwdF9yZWMgYWNjZXB0X2luZm87Ci0KLSAgICAgICAgICAgICAgICBnZXRfZW50cnkobmVnLT5wb29sLCAmYWNjZXB0X2luZm8sIGJvZHkpOwotICAgICAgICAgICAgICAgIHNldF9taW1lX2ZpZWxkcygmbWltZV9pbmZvLCAmYWNjZXB0X2luZm8pOwotICAgICAgICAgICAgICAgIGhhc19jb250ZW50ID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJuY21wKGJ1ZmZlciwgImNvbnRlbnQtbGVuZ3RoOiIsIDE1KSkgewotICAgICAgICAgICAgICAgIG1pbWVfaW5mby5ieXRlcyA9IGF0b2YoYm9keSk7Ci0gICAgICAgICAgICAgICAgaGFzX2NvbnRlbnQgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIXN0cm5jbXAoYnVmZmVyLCAiY29udGVudC1sYW5ndWFnZToiLCAxNykpIHsKLSAgICAgICAgICAgICAgICBtaW1lX2luZm8uY29udGVudF9sYW5ndWFnZXMgPSBkb19sYW5ndWFnZXNfbGluZShuZWctPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvZHkpOwotICAgICAgICAgICAgICAgIGhhc19jb250ZW50ID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJuY21wKGJ1ZmZlciwgImNvbnRlbnQtZW5jb2Rpbmc6IiwgMTcpKSB7Ci0gICAgICAgICAgICAgICAgbWltZV9pbmZvLmNvbnRlbnRfZW5jb2RpbmcgPSBhcF9nZXRfdG9rZW4obmVnLT5wb29sLCAmYm9keSwgMCk7Ci0gICAgICAgICAgICAgICAgaGFzX2NvbnRlbnQgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIXN0cm5jbXAoYnVmZmVyLCAiZGVzY3JpcHRpb246IiwgMTIpKSB7Ci0gICAgICAgICAgICAgICAgY2hhciAqZGVzYyA9IGFwX3BzdHJkdXAobmVnLT5wb29sLCBib2R5KTsKLSAgICAgICAgICAgICAgICBjaGFyICpjcDsKLQotICAgICAgICAgICAgICAgIGZvciAoY3AgPSBkZXNjOyAqY3A7ICsrY3ApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCpjcD09J1xuJykgKmNwPScgJzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNwPmRlc2MpICooY3AtMSk9MDsKLSAgICAgICAgICAgICAgICBtaW1lX2luZm8uZGVzY3JpcHRpb24gPSBkZXNjOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKCptaW1lX2luZm8uZmlsZV9uYW1lICYmIGhhc19jb250ZW50KSB7Ci0gICAgICAgICAgICAgICAgdm9pZCAqbmV3X3ZhciA9IGFwX3B1c2hfYXJyYXkobmVnLT5hdmFpbF92YXJzKTsKLQotICAgICAgICAgICAgICAgIG1lbWNweShuZXdfdmFyLCAodm9pZCAqKSAmbWltZV9pbmZvLCBzaXplb2YodmFyX3JlYykpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjbGVhbl92YXJfcmVjKCZtaW1lX2luZm8pOwotICAgICAgICAgICAgaGFzX2NvbnRlbnQgPSAwOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoaHN0YXRlICE9IGhlYWRlcl9lb2YpOwotCi0gICAgYXBfY2xvc2UobWFwKTsKLQotICAgIHNldF92bGlzdF92YWxpZGF0b3IociwgcnIpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0KLS8qIFNvcnQgZnVuY3Rpb24gdXNlZCBieSByZWFkX3R5cGVzX211bHRpLiAqLwotc3RhdGljIGludCB2YXJpYW50c29ydGYodmFyX3JlYyAqYSwgdmFyX3JlYyAqYikgewotCi0gICAgLyogRmlyc3Qga2V5IGlzIHRoZSBzb3VyY2UgcXVhbGl0eSwgc29ydCBpbiBkZXNjZW5kaW5nIG9yZGVyLiAqLwotCi0gICAgLyogWFhYOiBub3RlIHRoYXQgd2UgY3VycmVudGx5IGltcGxlbWVudCBubyBtZXRob2Qgb2Ygc2V0dGluZyB0aGUKLSAgICAgKiBzb3VyY2UgcXVhbGl0eSBmb3IgbXVsdGl2aWV3cyB2YXJpYW50cywgc28gd2UgYXJlIGFsd2F5cyBjb21wYXJpbmcKLSAgICAgKiAxLjAgdG8gMS4wIGZvciBub3cKLSAgICAgKi8KLSAgICBpZiAoYS0+c291cmNlX3F1YWxpdHkgPCBiLT5zb3VyY2VfcXVhbGl0eSkKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgaWYgKGEtPnNvdXJjZV9xdWFsaXR5ID4gYi0+c291cmNlX3F1YWxpdHkpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIFNlY29uZCBrZXkgaXMgdGhlIHZhcmlhbnQgbmFtZSAqLwotICAgIHJldHVybiBzdHJjbXAoYS0+ZmlsZV9uYW1lLCBiLT5maWxlX25hbWUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBTYW1lIGFzIHJlYWRfdHlwZV9tYXAsIGV4Y2VwdCB3ZSB1c2UgYSBmaWx0ZXJlZCBkaXJlY3RvcnkgbGlzdGluZwotICogYXMgdGhlIG1hcC4uLiAgCi0gKi8KLQotc3RhdGljIGludCByZWFkX3R5cGVzX211bHRpKG5lZ290aWF0aW9uX3N0YXRlICpuZWcpCi17Ci0gICAgcmVxdWVzdF9yZWMgKnIgPSBuZWctPnI7Ci0KLSAgICBjaGFyICpmaWxwOwotICAgIGludCBwcmVmaXhfbGVuOwotICAgIGFwX2Rpcl90ICpkaXJwOwotICAgIGFwX3N0YXR1c190IHN0YXR1czsKLSAgICBzdHJ1Y3QgdmFyX3JlYyBtaW1lX2luZm87Ci0gICAgc3RydWN0IGFjY2VwdF9yZWMgYWNjZXB0X2luZm87Ci0gICAgdm9pZCAqbmV3X3ZhcjsKLQotICAgIGNsZWFuX3Zhcl9yZWMoJm1pbWVfaW5mbyk7Ci0KLSAgICBpZiAoIShmaWxwID0gc3RycmNocihyLT5maWxlbmFtZSwgJy8nKSkpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOyAgICAgICAgLyogV2VpcmQuLi4gKi8KLSAgICB9Ci0KLSAgICBpZiAoc3RybmNtcChyLT5maWxlbmFtZSwgInByb3h5OiIsIDYpID09IDApIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgICsrZmlscDsKLSAgICBwcmVmaXhfbGVuID0gc3RybGVuKGZpbHApOwotCi0gICAgaWYgKChzdGF0dXMgPSBhcF9vcGVuZGlyKCZkaXJwLCBuZWctPmRpcl9uYW1lLCBuZWctPnBvb2wpKSAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgc3RhdHVzLCByLAotICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHJlYWQgZGlyZWN0b3J5IGZvciBtdWx0aTogJXMiLCBuZWctPmRpcl9uYW1lKTsKLSAgICAgICAgcmV0dXJuIEhUVFBfRk9SQklEREVOOwotICAgIH0KLQotICAgIHdoaWxlIChhcF9yZWFkZGlyKGRpcnApID09IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIHJlcXVlc3RfcmVjICpzdWJfcmVxOwotICAgICAgICBjaGFyICpkX25hbWU7Ci0KLSAgICAgICAgYXBfZ2V0X2Rpcl9maWxlbmFtZSgmZF9uYW1lLCBkaXJwKTsKLSAgICAgICAgLyogRG8gd2UgaGF2ZSBhIG1hdGNoPyAqLwotCi0gICAgICAgIGlmIChzdHJuY21wKGRfbmFtZSwgZmlscCwgcHJlZml4X2xlbikpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkX25hbWVbcHJlZml4X2xlbl0gIT0gJy4nKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFllcC4gIFNlZSBpZiBpdCdzIHNvbWV0aGluZyB3aGljaCB3ZSBoYXZlIGFjY2VzcyB0bywgYW5kIAotICAgICAgICAgKiB3aGljaCBoYXMgYSBrbm93biB0eXBlIGFuZCBlbmNvZGluZyAoYXMgb3Bwb3NlZCB0byBzb21ldGhpbmcKLSAgICAgICAgICogd2hpY2ggd2UnbGwgYmUgc2xhcHBpbmcgZGVmYXVsdF90eXBlIG9uIGxhdGVyKS4KLSAgICAgICAgICovCi0KLSAgICAgICAgc3ViX3JlcSA9IGFwX3N1Yl9yZXFfbG9va3VwX2ZpbGUoZF9uYW1lLCByKTsKLQotICAgICAgICAvKiBJZiBpdCBoYXMgYSBoYW5kbGVyLCB3ZSdsbCBwcmV0ZW5kIGl0J3MgYSBDR0kgc2NyaXB0LAotICAgICAgICAgKiBzaW5jZSB0aGF0J3MgYSBnb29kIGluZGljYXRpb24gb2YgdGhlIHNvcnQgb2YgdGhpbmcgaXQKLSAgICAgICAgICogbWlnaHQgYmUgZG9pbmcuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoc3ViX3JlcS0+aGFuZGxlciAmJiAhc3ViX3JlcS0+Y29udGVudF90eXBlKSB7Ci0gICAgICAgICAgICBzdWJfcmVxLT5jb250ZW50X3R5cGUgPSBDR0lfTUFHSUNfVFlQRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdWJfcmVxLT5zdGF0dXMgIT0gSFRUUF9PSyB8fCAhc3ViX3JlcS0+Y29udGVudF90eXBlKSB7Ci0gICAgICAgICAgICBhcF9kZXN0cm95X3N1Yl9yZXEoc3ViX3JlcSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIElmIGl0J3MgYSBtYXAgZmlsZSwgd2UgdXNlIHRoYXQgaW5zdGVhZCBvZiB0aGUgbWFwCi0gICAgICAgICAqIHdlJ3JlIGJ1aWxkaW5nLi4uCi0gICAgICAgICAqLwotCi0gICAgICAgIGlmICgoKHN1Yl9yZXEtPmNvbnRlbnRfdHlwZSkgJiYKLSAgICAgICAgICAgICAhc3RyY21wKHN1Yl9yZXEtPmNvbnRlbnRfdHlwZSwgTUFQX0ZJTEVfTUFHSUNfVFlQRSkpIHx8Ci0gICAgICAgICAgICAoKHN1Yl9yZXEtPmhhbmRsZXIpICYmCi0gICAgICAgICAgICAgIXN0cmNtcChzdWJfcmVxLT5oYW5kbGVyLCAidHlwZS1tYXAiKSkpIHsKLQotICAgICAgICAgICAgYXBfY2xvc2VkaXIoZGlycCk7Ci0gICAgICAgICAgICBuZWctPmF2YWlsX3ZhcnMtPm5lbHRzID0gMDsKLSAgICAgICAgICAgIGlmIChzdWJfcmVxLT5zdGF0dXMgIT0gSFRUUF9PSykgewotICAgICAgICAgICAgICAgIHJldHVybiBzdWJfcmVxLT5zdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVhZF90eXBlX21hcChuZWcsIHN1Yl9yZXEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSGF2ZSByZWFzb25hYmxlIHZhcmlhbnQgLS0tIGdhdGhlciBub3Rlcy4gKi8KLQotICAgICAgICBtaW1lX2luZm8uc3ViX3JlcSA9IHN1Yl9yZXE7Ci0gICAgICAgIG1pbWVfaW5mby5maWxlX25hbWUgPSBhcF9wc3RyZHVwKG5lZy0+cG9vbCwgZF9uYW1lKTsKLSAgICAgICAgaWYgKHN1Yl9yZXEtPmNvbnRlbnRfZW5jb2RpbmcpIHsKLSAgICAgICAgICAgIG1pbWVfaW5mby5jb250ZW50X2VuY29kaW5nID0gc3ViX3JlcS0+Y29udGVudF9lbmNvZGluZzsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3ViX3JlcS0+Y29udGVudF9sYW5ndWFnZXMpIHsKLSAgICAgICAgICAgIG1pbWVfaW5mby5jb250ZW50X2xhbmd1YWdlcyA9IHN1Yl9yZXEtPmNvbnRlbnRfbGFuZ3VhZ2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2V0X2VudHJ5KG5lZy0+cG9vbCwgJmFjY2VwdF9pbmZvLCBzdWJfcmVxLT5jb250ZW50X3R5cGUpOwotICAgICAgICBzZXRfbWltZV9maWVsZHMoJm1pbWVfaW5mbywgJmFjY2VwdF9pbmZvKTsKLQotICAgICAgICBuZXdfdmFyID0gYXBfcHVzaF9hcnJheShuZWctPmF2YWlsX3ZhcnMpOwotICAgICAgICBtZW1jcHkobmV3X3ZhciwgKHZvaWQgKikgJm1pbWVfaW5mbywgc2l6ZW9mKHZhcl9yZWMpKTsKLQotICAgICAgICBuZWctPmNvdW50X211bHRpdmlld3NfdmFyaWFudHMrKzsKLQotICAgICAgICBjbGVhbl92YXJfcmVjKCZtaW1lX2luZm8pOwotICAgIH0KLQotICAgIGFwX2Nsb3NlZGlyKGRpcnApOwotCi0gICAgc2V0X3ZsaXN0X3ZhbGlkYXRvcihyLCByKTsKLQotICAgIC8qIFNvcnQgdGhlIHZhcmlhbnRzIGludG8gYSBjYW5vbmljYWwgb3JkZXIuICBUaGUgbmVnb3RpYXRpb24KLSAgICAgKiByZXN1bHQgc29tZXRpbWVzIGRlcGVuZHMgb24gdGhlIG9yZGVyIG9mIHRoZSB2YXJpYW50cy4gIEJ5Ci0gICAgICogc29ydGluZyB0aGUgdmFyaWFudHMgaW50byBhIGNhbm9uaWNhbCBvcmRlciwgcmF0aGVyIHRoYW4gdXNpbmcKLSAgICAgKiB0aGUgb3JkZXIgaW4gd2hpY2ggcmVhZGRpcigpIGhhcHBlbnMgdG8gcmV0dXJuIHRoZW0sIHdlIGVuc3VyZQotICAgICAqIHRoYXQgdGhlIG5lZ290aWF0aW9uIHJlc3VsdCB3aWxsIGJlIGNvbnNpc3RlbnQgb3ZlciBmaWxlc3lzdGVtCi0gICAgICogYmFja3VwL3Jlc3RvcmVzIGFuZCBvdmVyIGFsbCBtaXJyb3Igc2l0ZXMuCi0gICAgICovCi0gICAgICAgCi0gICAgcXNvcnQoKHZvaWQgKikgbmVnLT5hdmFpbF92YXJzLT5lbHRzLCBuZWctPmF2YWlsX3ZhcnMtPm5lbHRzLAotICAgICAgICAgIHNpemVvZih2YXJfcmVjKSwgKGludCAoKikoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKSB2YXJpYW50c29ydGYpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQW5kIG5vdyBmb3IgdGhlIGNvZGUgeW91J3ZlIGJlZW4gd2FpdGluZyBmb3IuLi4gYWN0dWFsbHkKLSAqIGZpbmRpbmcgYSBtYXRjaCB0byB0aGUgY2xpZW50J3MgcmVxdWlyZW1lbnRzLiAgCi0gKi8KLQotLyogTWF0Y2hpbmcgTUlNRSB0eXBlcyAuLi4gdGhlIHN0YXIvc3RhciBhbmQgZm9vL3N0YXIgY29tbWVudGluZyBjb252ZW50aW9ucwotICogYXJlIGltcGxlbWVudGVkIGhlcmUuICAoWW91IGtub3cgd2hhdCBJIG1lYW4gYnkgc3Rhci9zdGFyLCBidXQganVzdAotICogdHJ5IG1lbnRpb25pbmcgdGhvc2UgdGhyZWUgY2hhcmFjdGVycyBpbiBhIEMgY29tbWVudCkuICBVc2luZyBzdHJjbXAoKQotICogaXMgbGVnaXQsIGJlY2F1c2UgZXZlcnl0aGluZyBoYXMgYWxyZWFkeSBiZWVuIHNtYXNoZWQgdG8gbG93ZXJjYXNlLgotICoKLSAqIE5vdGUgYWxzbyB0aGF0IGlmIHdlIGdldCBhbiBleGFjdCBtYXRjaCBvbiB0aGUgbWVkaWEgdHlwZSwgd2UgdXBkYXRlCi0gKiBsZXZlbF9tYXRjaGVkIGZvciB1c2UgaW4gbGV2ZWxfY21wIGJlbG93Li4uCi0gKiAKLSAqIFdlIGFsc28gZ2l2ZSBhIHZhbHVlIGZvciBtaW1lX3N0YXJzLCB3aGljaCBpcyB1c2VkIGxhdGVyLiBJdCBzaG91bGQKLSAqIGJlIDEgZm9yIHN0YXIvc3RhciwgMiBmb3IgdHlwZS9zdGFyIGFuZCAzIGZvciB0eXBlL3N1YnR5cGUuCi0gKi8KLQotc3RhdGljIGludCBtaW1lX21hdGNoKGFjY2VwdF9yZWMgKmFjY2VwdF9yLCB2YXJfcmVjICphdmFpbCkKLXsKLSAgICBjaGFyICphY2NlcHRfdHlwZSA9IGFjY2VwdF9yLT5uYW1lOwotICAgIGNoYXIgKmF2YWlsX3R5cGUgPSBhdmFpbC0+bWltZV90eXBlOwotICAgIGludCBsZW4gPSBzdHJsZW4oYWNjZXB0X3R5cGUpOwotCi0gICAgaWYgKGFjY2VwdF90eXBlWzBdID09ICcqJykgeyAgICAgICAgLyogQW55dGhpbmcgbWF0Y2hlcyBzdGFyL3N0YXIgKi8KLSAgICAgICAgaWYgKGF2YWlsLT5taW1lX3N0YXJzIDwgMSkgewotICAgICAgICAgICAgYXZhaWwtPm1pbWVfc3RhcnMgPSAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBlbHNlIGlmICgoYWNjZXB0X3R5cGVbbGVuIC0gMV0gPT0gJyonKSAmJgotICAgICAgICAgICAgICFzdHJuY21wKGFjY2VwdF90eXBlLCBhdmFpbF90eXBlLCBsZW4gLSAyKSkgewotICAgICAgICBpZiAoYXZhaWwtPm1pbWVfc3RhcnMgPCAyKSB7Ci0gICAgICAgICAgICBhdmFpbC0+bWltZV9zdGFycyA9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAoYWNjZXB0X3R5cGUsIGF2YWlsX3R5cGUpCi0gICAgICAgICAgICAgfHwgKCFzdHJjbXAoYWNjZXB0X3R5cGUsICJ0ZXh0L2h0bWwiKQotICAgICAgICAgICAgICAgICAmJiAoIXN0cmNtcChhdmFpbF90eXBlLCBJTkNMVURFU19NQUdJQ19UWVBFKQotICAgICAgICAgICAgICAgICAgICAgfHwgIXN0cmNtcChhdmFpbF90eXBlLCBJTkNMVURFU19NQUdJQ19UWVBFMykpKSkgewotICAgICAgICBpZiAoYWNjZXB0X3ItPmxldmVsID49IGF2YWlsLT5sZXZlbCkgewotICAgICAgICAgICAgYXZhaWwtPmxldmVsX21hdGNoZWQgPSBhdmFpbC0+bGV2ZWw7Ci0gICAgICAgICAgICBhdmFpbC0+bWltZV9zdGFycyA9IDM7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotLyogVGhpcyBjb2RlIGltcGxlbWVudHMgYSBwaWVjZSBvZiB0aGUgdGllLWJyZWFraW5nIGFsZ29yaXRobSBiZXR3ZWVuCi0gKiB2YXJpYW50cyBvZiBlcXVhbCBxdWFsaXR5LiAgVGhpcyBwaWVjZSBpcyB0aGUgdHJlYXRtZW50IG9mIHZhcmlhbnRzCi0gKiBvZiB0aGUgc2FtZSBiYXNlIG1lZGlhIHR5cGUsIGJ1dCBkaWZmZXJlbnQgbGV2ZWxzLiAgV2hhdCB3ZSB3YW50IHRvCi0gKiByZXR1cm4gaXMgdGhlIHZhcmlhbnQgYXQgdGhlIGhpZ2hlc3QgbGV2ZWwgdGhhdCB0aGUgY2xpZW50IGV4cGxpY2l0bHkKLSAqIGNsYWltZWQgdG8gYWNjZXB0LgotICoKLSAqIElmIGFsbCB0aGUgdmFyaWFudHMgYXZhaWxhYmxlIGFyZSBhdCBhIGhpZ2hlciBsZXZlbCB0aGFuIHRoYXQsIG9yIGlmCi0gKiB0aGUgY2xpZW50IGRpZG4ndCBzYXkgYW55dGhpbmcgc3BlY2lmaWMgYWJvdXQgdGhpcyBtZWRpYSB0eXBlIGF0IGFsbAotICogYW5kIHRoZXNlIHZhcmlhbnRzIGp1c3QgZ290IGluIG9uIGEgd2lsZGNhcmQsIHdlIHByZWZlciB0aGUgbG93ZXN0Ci0gKiBsZXZlbCwgb24gZ3JvdW5kcyB0aGF0IHRoYXQncyB0aGUgb25lIHRoYXQgdGhlIGNsaWVudCBpcyBsZWFzdCBsaWtlbHkKLSAqIHRvIGNob2tlIG9uLgotICoKLSAqIChUaGlzIGlzIGFsbCBtb3RpdmF0ZWQgYnkgdHJlYXRtZW50IG9mIGxldmVscyBpbiBIVE1MIC0tLSB3ZSBvbmx5Ci0gKiB3YW50IHRvIGdpdmUgbGV2ZWwgMyB0byBicm93c2VycyB0aGF0IGV4cGxpY2l0bHkgYXNrIGZvciBpdDsgYnJvd3NlcnMKLSAqIHRoYXQgZG9uJ3QsIGluY2x1ZGluZyBIVFRQLzAuOSBicm93c2VycyB0aGF0IG9ubHkgZ2V0IHRoZSBpbXBsaWNpdAotICogIkFjY2VwdDogKiAvICoiIFtzcGFjZSBhZGRlZCB0byBhdm9pZCBjb25mdXNpbmcgY3BwIC0tLSBubywgdGhhdAotICogc3ludGF4IGRvZXNuJ3QgcmVhbGx5IHdvcmtdIHNob3VsZCBnZXQgSFRNTDIgaWYgYXZhaWxhYmxlKS4KLSAqCi0gKiAoTm90ZSB0aGF0IHRoaXMgY29kZSBvbmx5IGNvbWVzIGludG8gcGxheSB3aGVuIHdlIGFyZSBjaG9vc2luZyBhbW9uZwotICogdmFyaWFudHMgb2YgZXF1YWwgcXVhbGl0eSwgd2hlcmUgdGhlIGRyYWZ0IHN0YW5kYXJkIGdpdmVzIHVzIGEgZmFpcgotICogYml0IG9mIGxlZXdheSBhYm91dCB3aGF0IHRvIGRvLiAgSXQgYWluJ3Qgc3BlY2lmaWVkIGJ5IHRoZSBzdGFuZGFyZDsKLSAqIHJhdGhlciwgaXQgaXMgYSBjaG9pY2UgbWFkZSBieSB0aGlzIHNlcnZlciBhYm91dCB3aGF0IHRvIGRvIGluIGNhc2VzCi0gKiB3aGVyZSB0aGUgc3RhbmRhcmQgZG9lcyBub3Qgc3BlY2lmeSBhIHVuaXF1ZSBjb3Vyc2Ugb2YgYWN0aW9uKS4KLSAqLwotCi1zdGF0aWMgaW50IGxldmVsX2NtcCh2YXJfcmVjICp2YXIxLCB2YXJfcmVjICp2YXIyKQotewotICAgIC8qIExldmVscyBhcmUgb25seSBjb21wYXJhYmxlIGJldHdlZW4gbWF0Y2hpbmcgbWVkaWEgdHlwZXMgKi8KLQotICAgIGlmICh2YXIxLT5pc19wc2V1ZG9faHRtbCAmJiAhdmFyMi0+aXNfcHNldWRvX2h0bWwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKCF2YXIxLT5pc19wc2V1ZG9faHRtbCAmJiBzdHJjbXAodmFyMS0+bWltZV90eXBlLCB2YXIyLT5taW1lX3R5cGUpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAvKiBUaGUgcmVzdWx0IG9mIHRoZSBhYm92ZSBpZiBzdGF0ZW1lbnRzIGlzIHRoYXQsIGlmIHdlIGdldCB0bwotICAgICAqIGhlcmUsIGJvdGggdmFyaWFudHMgaGF2ZSB0aGUgc2FtZSBtaW1lX3R5cGUgb3IgYm90aCBhcmUKLSAgICAgKiBwc2V1ZG8taHRtbC4KLSAgICAgKi8gICAgCi0KLSAgICAvKiBUYWtlIGhpZ2hlc3QgbGV2ZWwgdGhhdCBtYXRjaGVkLCBpZiBlaXRoZXIgZGlkIG1hdGNoLiAqLwotCi0gICAgaWYgKHZhcjEtPmxldmVsX21hdGNoZWQgPiB2YXIyLT5sZXZlbF9tYXRjaGVkKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpZiAodmFyMS0+bGV2ZWxfbWF0Y2hlZCA8IHZhcjItPmxldmVsX21hdGNoZWQpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIE5laXRoZXIgbWF0Y2hlZC4gIFRha2UgbG93ZXN0IGxldmVsLCBpZiB0aGVyZSdzIGEgZGlmZmVyZW5jZS4gKi8KLQotICAgIGlmICh2YXIxLT5sZXZlbCA8IHZhcjItPmxldmVsKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpZiAodmFyMS0+bGV2ZWwgPiB2YXIyLT5sZXZlbCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogVGllZCAqLwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIEZpbmRpbmcgbGFuZ3VhZ2VzLiAgVGhlIG1haW4gZW50cnkgcG9pbnQgaXMgc2V0X2xhbmd1YWdlX3F1YWxpdHkoKQotICogd2hpY2ggaXMgY2FsbGVkIGZvciBlYWNoIHZhcmlhbnQuIEl0IHNldHMgdHdvIGVsZW1lbnRzIGluIHRoZQotICogdmFyaWFudCByZWNvcmQ6Ci0gKiAgICBsYW5ndWFnZV9xdWFsaXR5ICAtIHRoZSAncScgdmFsdWUgb2YgdGhlICdiZXN0JyBtYXRjaGluZyBsYW5ndWFnZQotICogICAgICAgICAgICAgICAgICAgICAgICBmcm9tIEFjY2VwdC1MYW5ndWFnZTogaGVhZGVyIChIVFRQLzEuMSkKLSAqICAgIGxhbmdfaW5kZXggICAgLSAgICAgUHJlIEhUVFAvMS4xIGxhbmd1YWdlIHByaW9yaXR5LCB1c2luZwotICogICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiBvZiBsYW5ndWFnZSBvbiB0aGUgQWNjZXB0LUxhbmd1YWdlOgotICogICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIsIGlmIHByZXNlbnQsIGVsc2UgTGFuZ3VhZ2VQcmlvcml0eQotICogICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmUgb3JkZXIuCi0gKgotICogV2hlbiB3ZSBkbyB0aGUgdmFyaWFudCBjaGVja2luZyBmb3IgYmVzdCB2YXJpYW50LCB3ZSB1c2UgbGFuZ3VhZ2UKLSAqIHF1YWxpdHkgZmlyc3QsIGFuZCBpZiBhIHRpZSwgbGFuZ3VhZ2VfaW5kZXggbmV4dCAodGhpcyBvbmx5IGFwcGxpZXMKLSAqIHdoZW4gX25vdF8gdXNpbmcgdGhlIFJWU0EvMS4wIGFsZ29yaXRobSkuIElmIHVzaW5nIHRoZSBSVlNBLzEuMAotICogYWxnb3JpdGhtLCBsYW5nX2luZGV4IGlzIG5ldmVyIHVzZWQuCi0gKgotICogc2V0X2xhbmd1YWdlX3F1YWxpdHkoKSBjYWxscyBmaW5kX2xhbmdfaW5kZXgoKSBhbmQgZmluZF9kZWZhdWx0X2luZGV4KCkKLSAqIHRvIHNldCBsYW5nX2luZGV4LiAgCi0gKi8KLQotc3RhdGljIGludCBmaW5kX2xhbmdfaW5kZXgoYXBfYXJyYXlfaGVhZGVyX3QgKmFjY2VwdF9sYW5ncywgY2hhciAqbGFuZykKLXsKLSAgICBhY2NlcHRfcmVjICphY2NzOwotICAgIGludCBpOwotCi0gICAgaWYgKCFsYW5nIHx8ICFhY2NlcHRfbGFuZ3MpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGFjY3MgPSAoYWNjZXB0X3JlYyAqKSBhY2NlcHRfbGFuZ3MtPmVsdHM7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgYWNjZXB0X2xhbmdzLT5uZWx0czsgKytpKSB7Ci0gICAgICAgIGlmICghc3RybmNtcChsYW5nLCBhY2NzW2ldLm5hbWUsIHN0cmxlbihhY2NzW2ldLm5hbWUpKSkgewotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcHJpb3JpdHkgb2YgYSBnaXZlbiBsYW5ndWFnZQotICogYWNjb3JkaW5nIHRvIExhbmd1YWdlUHJpb3JpdHkuICBJdCBpcyB1c2VkIGluIGNhc2Ugb2YgYSB0aWUKLSAqIGJldHdlZW4gc2V2ZXJhbCBsYW5ndWFnZXMuCi0gKi8KLQotc3RhdGljIGludCBmaW5kX2RlZmF1bHRfaW5kZXgobmVnX2Rpcl9jb25maWcgKmNvbmYsIGNoYXIgKmxhbmcpCi17Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmFycjsKLSAgICBpbnQgbmVsdHM7Ci0gICAgY2hhciAqKmVsdHM7Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoIWxhbmcpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGFyciA9IGNvbmYtPmxhbmd1YWdlX3ByaW9yaXR5OwotICAgIG5lbHRzID0gYXJyLT5uZWx0czsKLSAgICBlbHRzID0gKGNoYXIgKiopIGFyci0+ZWx0czsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuZWx0czsgKytpKSB7Ci0gICAgICAgIGlmICghc3RyY2FzZWNtcChlbHRzW2ldLCBsYW5nKSkgewotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLS8qIHNldF9kZWZhdWx0X2xhbmdfcXVhbGl0eSgpIHNldHMgdGhlIHF1YWxpdHkgd2UgYXBwbHkgdG8gdmFyaWFudHMKLSAqIHdoaWNoIGhhdmUgbm8gbGFuZ3VhZ2UgYXNzaWduZWQgdG8gdGhlbS4gSWYgbm9uZSBvZiB0aGUgdmFyaWFudHMKLSAqIGhhdmUgYSBsYW5ndWFnZSwgd2UgYXJlIG5vdCBuZWdvdGlhdGluZyBvbiBsYW5ndWFnZSwgc28gYWxsIGFyZQotICogYWNjZXB0YWJsZSwgYW5kIHdlIHNldCB0aGUgZGVmYXVsdCBxIHZhbHVlIHRvIDEuMC4gSG93ZXZlciBpZgotICogc29tZSBvZiB0aGUgdmFyaWFudHMgaGF2ZSBsYW5ndWFnZXMsIHdlIHNldCB0aGlzIGRlZmF1bHQgdG8gMC4wMDEuCi0gKiBUaGUgdmFsdWUgb2YgdGhpcyBkZWZhdWx0IHdpbGwgYmUgYXBwbGllZCB0byBhbGwgdmFyaWFudHMgd2l0aAotICogbm8gZXhwbGljaXQgbGFuZ3VhZ2UgLS0gd2hpY2ggd2lsbCBoYXZlIHRoZSBlZmZlY3Qgb2YgbWFraW5nIHRoZW0KLSAqIGFjY2VwdGFibGUsIGJ1dCBvbmx5IGlmIG5vIHZhcmlhbnRzIHdpdGggYW4gZXhwbGljaXQgbGFuZ3VhZ2UKLSAqIGFyZSBhY2NlcHRhYmxlLiBUaGUgZGVmYXVsdCBxIHZhbHVlIHNldCBoZXJlIGlzIGFzc2lnbmVkIHRvIHZhcmlhbnRzCi0gKiB3aXRoIG5vIGxhbmd1YWdlIHR5cGUgaW4gc2V0X2xhbmd1YWdlX3F1YWxpdHkoKS4KLSAqCi0gKiBOb3RlIHRoYXQgaWYgdXNpbmcgdGhlIFJWU0EvMS4wIGFsZ29yaXRobSwgd2UgZG9uJ3QgdXNlIHRoaXMKLSAqIGZpZGRsZS4gIAotICovCi0KLXN0YXRpYyB2b2lkIHNldF9kZWZhdWx0X2xhbmdfcXVhbGl0eShuZWdvdGlhdGlvbl9zdGF0ZSAqbmVnKQotewotICAgIHZhcl9yZWMgKmF2YWlsX3JlY3MgPSAodmFyX3JlYyAqKSBuZWctPmF2YWlsX3ZhcnMtPmVsdHM7Ci0gICAgaW50IGo7Ci0KLSAgICBpZiAoIW5lZy0+ZG9udF9maWRkbGVfaGVhZGVycykgewotICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmVnLT5hdmFpbF92YXJzLT5uZWx0czsgKytqKSB7Ci0gICAgICAgICAgICB2YXJfcmVjICp2YXJpYW50ID0gJmF2YWlsX3JlY3Nbal07Ci0gICAgICAgICAgICBpZiAodmFyaWFudC0+Y29udGVudF9sYW5ndWFnZXMgJiYKLSAgICAgICAgICAgICAgICB2YXJpYW50LT5jb250ZW50X2xhbmd1YWdlcy0+bmVsdHMpIHsKLSAgICAgICAgICAgICAgICBuZWctPmRlZmF1bHRfbGFuZ19xdWFsaXR5ID0gMC4wMDFmOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIG5lZy0+ZGVmYXVsdF9sYW5nX3F1YWxpdHkgPSAxLjBmOwotfQotCi0vKiBTZXQgdGhlIGxhbmd1YWdlX3F1YWxpdHkgdmFsdWUgaW4gdGhlIHZhcmlhbnQgcmVjb3JkLiBBbHNvCi0gKiBhc3NpZ25zIGxhbmdfaW5kZXggZm9yIGJhY2stY29tcGF0LiAKLSAqCi0gKiBUbyBmaW5kIHRoZSBsYW5ndWFnZV9xdWFsaXR5IHZhbHVlLCB3ZSBsb29rIGZvciB0aGUgJ3EnIHZhbHVlCi0gKiBvZiB0aGUgJ2Jlc3QnIG1hdGNoaW5nIGxhbmd1YWdlIG9uIHRoZSBBY2NlcHQtTGFuZ3VhZ2UKLSAqIGhlYWRlci4gVGhlICdiZXN0JyBtYXRjaCBpcyB0aGUgbGFuZ3VhZ2Ugb24gQWNjZXB0LUxhbmd1YWdlCi0gKiBoZWFkZXIgd2hpY2ggbWF0Y2hlcyB0aGUgbGFuZ3VhZ2Ugb2YgdGhpcyB2YXJpYW50IGVpdGhlciBmdWxseSwKLSAqIG9yIGFzIGZhciBhcyB0aGUgcHJlZml4IG1hcmtlciAoLSkuIElmIHR3byBvciBtb3JlIGxhbmd1YWdlcwotICogbWF0Y2gsIHVzZSB0aGUgbG9uZ2VzdCBzdHJpbmcgZnJvbSB0aGUgQWNjZXB0LUxhbmd1YWdlIGhlYWRlcgotICogKHNlZSBIVFRQLzEuMSBbMTQuNF0pCi0gKgotICogV2hlbiBhIHZhcmlhbnQgaGFzIG11bHRpcGxlIGxhbmd1YWdlcywgd2UgZmluZCB0aGUgJ2Jlc3QnCi0gKiBtYXRjaCBmb3IgZWFjaCB2YXJpYW50IGxhbmd1YWdlIHRhZyBhcyBhYm92ZSwgdGhlbiBzZWxlY3QgdGhlCi0gKiBvbmUgd2l0aCB0aGUgaGlnaGVzdCBxIHZhbHVlLiBCZWNhdXNlIGJvdGggdGhlIGFjY2VwdC1oZWFkZXIKLSAqIGFuZCB2YXJpYW50IGNhbiBoYXZlIG11bHRpcGxlIGxhbmd1YWdlcywgd2Ugbm93IGhhdmUgYSBoYWlyeQotICogbG9vcC13aXRoaW4tYS1sb29wIGhlcmUuCi0gKgotICogSWYgdGhlIHZhcmlhbnQgaGFzIG5vIGxhbmd1YWdlIGFuZCB3ZSBoYXZlIG5vIEFjY2VwdC1MYW5ndWFnZQotICogaXRlbXMsIGxlYXZlIHRoZSBxdWFsaXR5IGF0IDEuMCBhbmQgcmV0dXJuLgotICoKLSAqIElmIHRoZSB2YXJpYW50IGhhcyBubyBsYW5ndWFnZSwgd2UgdXNlIHRoZSBkZWZhdWx0IGFzIHNldCBieQotICogc2V0X2RlZmF1bHRfbGFuZ19xdWFsaXR5KCkgKDEuMCBpZiB3ZSBhcmUgbm90IG5lZ290aWF0aW5nIG9uCi0gKiBsYW5ndWFnZSwgMC4wMDEgaWYgd2UgYXJlKS4KLSAqCi0gKiBGb2xsb3dpbmcgdGhlIHNldHRpbmcgb2YgdGhlIGxhbmd1YWdlIHF1YWxpdHksIHdlIGRyb3AgdGhyb3VnaCB0bwotICogc2V0IHRoZSBvbGQgJ2xhbmdfaW5kZXgnLiBUaGlzIGlzIHNldCBiYXNlZCBvbiBlaXRoZXIgdGhlIG9yZGVyCi0gKiBvZiB0aGUgbGFuZ3VhZ2VzIG9uIHRoZSBBY2NlcHQtTGFuZ3VhZ2UgaGVhZGVyLCBvciB0aGUKLSAqIG9yZGVyIG9uIHRoZSBMYW5ndWFnZVByaW9yaXR5IGRpcmVjdGl2ZS4gVGhpcyBpcyBvbmx5IHVzZWQKLSAqIGluIHRoZSBuZWdvdGlhdGlvbiBpZiB0aGUgbGFuZ3VhZ2UgcXVhbGl0aWVzIHRpZS4KLSAqLwotCi1zdGF0aWMgdm9pZCBzZXRfbGFuZ3VhZ2VfcXVhbGl0eShuZWdvdGlhdGlvbl9zdGF0ZSAqbmVnLCB2YXJfcmVjICp2YXJpYW50KQotewotICAgIGNoYXIgKmZpcnN0bGFuZzsKLSAgICBpbnQgaWR4OwotCi0gICAgaWYgKCF2YXJpYW50LT5jb250ZW50X2xhbmd1YWdlcyB8fCAhdmFyaWFudC0+Y29udGVudF9sYW5ndWFnZXMtPm5lbHRzKSB7Ci0gICAgICAgIC8qIFRoaXMgdmFyaWFudCBoYXMgbm8gY29udGVudC1sYW5ndWFnZSwgc28gdXNlIHRoZSBkZWZhdWx0Ci0gICAgICAgICAqIHF1YWxpdHkgZmFjdG9yIGZvciB2YXJpYW50cyB3aXRoIG5vIGNvbnRlbnQtbGFuZ3VhZ2UKLSAgICAgICAgICogKHByZXZpb3VzbHkgc2V0IGJ5IHNldF9kZWZhdWx0X2xhbmdfcXVhbGl0eSgpKS4KLSAgICAgICAgICogTGVhdmUgdGhlIGZhY3RvciBhbG9uZSAoaXQgcmVtYWlucyBhdCAxLjApIHdoZW4gd2UgbWF5IG5vdCBmaWRkbGUKLSAgICAgICAgICogd2l0aCB0aGUgaGVhZGVycy4KLSAgICAgICAgICovCi0gICAgICAgIGlmICghbmVnLT5kb250X2ZpZGRsZV9oZWFkZXJzKSB7Ci0gICAgICAgICAgICB2YXJpYW50LT5sYW5nX3F1YWxpdHkgPSBuZWctPmRlZmF1bHRfbGFuZ19xdWFsaXR5OwotICAgICAgICB9Ci0gICAgICAgIGlmICghbmVnLT5hY2NlcHRfbGFuZ3MpIHsKLSAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgLyogbm8gYWNjZXB0LWxhbmd1YWdlIGhlYWRlciAqLwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIFZhcmlhbnQgaGFzIG9uZSAob3IgbW9yZSkgbGFuZ3VhZ2VzLiAgTG9vayBmb3IgdGhlIGJlc3QKLSAgICAgICAgICogbWF0Y2guIFdlIGRvIHRoaXMgYnkgZ29pbmcgdGhyb3VnaCBlYWNoIGxhbmd1YWdlIG9uIHRoZQotICAgICAgICAgKiB2YXJpYW50IGRlc2NyaXB0aW9uIGxvb2tpbmcgZm9yIGEgbWF0Y2ggb24gdGhlCi0gICAgICAgICAqIEFjY2VwdC1MYW5ndWFnZSBoZWFkZXIuIFRoZSBiZXN0IG1hdGNoIGlzIHRoZSBsb25nZXN0Ci0gICAgICAgICAqIG1hdGNoaW5nIGxhbmd1YWdlIG9uIHRoZSBoZWFkZXIuIFRoZSBmaW5hbCByZXN1bHQgaXMgdGhlCi0gICAgICAgICAqIGJlc3QgcSB2YWx1ZSBmcm9tIGFsbCB0aGUgbGFuZ3VhZ2VzIG9uIHRoZSB2YXJpYW50Ci0gICAgICAgICAqIGRlc2NyaXB0aW9uLgotICAgICAgICAgKi8KLQotICAgICAgICBpZiAoIW5lZy0+YWNjZXB0X2xhbmdzKSB7Ci0gICAgICAgICAgICAvKiBubyBhY2NlcHQtbGFuZ3VhZ2UgaGVhZGVyIG1ha2VzIHRoZSB2YXJpYW50IGluZGVmaW5pdGUgKi8KLSAgICAgICAgICAgIHZhcmlhbnQtPmRlZmluaXRlID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsgICAgLyogVGhlcmUgaXMgYW4gYWNjZXB0LWxhbmd1YWdlIHdpdGggMCBvciBtb3JlIGl0ZW1zICovCi0gICAgICAgICAgICBhY2NlcHRfcmVjICphY2NzID0gKGFjY2VwdF9yZWMgKikgbmVnLT5hY2NlcHRfbGFuZ3MtPmVsdHM7Ci0gICAgICAgICAgICBhY2NlcHRfcmVjICpiZXN0ID0gTlVMTCwgKnN0YXIgPSBOVUxMOwotICAgICAgICAgICAgYWNjZXB0X3JlYyAqYmVzdHRoaXN0YWc7Ci0gICAgICAgICAgICBjaGFyICpsYW5nLCAqcDsKLSAgICAgICAgICAgIGZsb2F0IGZpZGRsZV9xID0gMC4wZjsKLSAgICAgICAgICAgIGludCBhbnlfbWF0Y2hfb25fc3RhciA9IDA7Ci0gICAgICAgICAgICBpbnQgaSwgaiwgYWxlbiwgbG9uZ2VzdF9sYW5nX3JhbmdlX2xlbjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHZhcmlhbnQtPmNvbnRlbnRfbGFuZ3VhZ2VzLT5uZWx0czsgKytqKSB7Ci0gICAgICAgICAgICAgICAgcCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgYmVzdHRoaXN0YWcgPSBOVUxMOwotICAgICAgICAgICAgICAgIGxvbmdlc3RfbGFuZ19yYW5nZV9sZW4gPSAwOwotICAgICAgICAgICAgICAgIGFsZW4gPSAwOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qIGxhbmcgaXMgdGhlIHZhcmlhbnQncyBsYW5ndWFnZS10YWcsIHdoaWNoIGlzIHRoZSBvbmUKLSAgICAgICAgICAgICAgICAgKiB3ZSBhcmUgYWxsb3dlZCB0byB1c2UgdGhlIHByZWZpeCBvZiBpbiBIVFRQLzEuMQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGxhbmcgPSAoKGNoYXIgKiopICh2YXJpYW50LT5jb250ZW50X2xhbmd1YWdlcy0+ZWx0cykpW2pdOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qIG5vdyBmaW5kIHRoZSBiZXN0IChpLmUuIGxvbmdlc3QpIG1hdGNoaW5nCi0gICAgICAgICAgICAgICAgICogQWNjZXB0LUxhbmd1YWdlIGhlYWRlciBsYW5ndWFnZS4gV2UgcHV0IHRoZSBiZXN0IG1hdGNoCi0gICAgICAgICAgICAgICAgICogZm9yIHRoaXMgdGFnIGluIGJlc3R0aGlzdGFnLiBXZSBjYW5ub3QgdXBkYXRlIHRoZQotICAgICAgICAgICAgICAgICAqIG92ZXJhbGwgYmVzdCAoYmFzZWQgb24gcSB2YWx1ZSkgYmVjYXVzZSB0aGUgYmVzdCBtYXRjaAotICAgICAgICAgICAgICAgICAqIGZvciB0aGlzIHRhZyBpcyB0aGUgbG9uZ2VzdCBsYW5ndWFnZSBpdGVtIG9uIHRoZSBhY2NlcHQKLSAgICAgICAgICAgICAgICAgKiBoZWFkZXIsIG5vdCBuZWNlc3NhcmlseSB0aGUgaGlnaGVzdCBxLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuZWctPmFjY2VwdF9sYW5ncy0+bmVsdHM7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChhY2NzW2ldLm5hbWUsICIqIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXIgPSAmYWNjc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIEZpbmQgbGFuZ3VhZ2UuIFdlIG1hdGNoIGlmIGVpdGhlciB0aGUgdmFyaWFudAotICAgICAgICAgICAgICAgICAgICAgKiBsYW5ndWFnZSB0YWcgZXhhY3RseSBtYXRjaGVzIHRoZSBsYW5ndWFnZSByYW5nZQotICAgICAgICAgICAgICAgICAgICAgKiBmcm9tIHRoZSBhY2NlcHQgaGVhZGVyLCBvciBhIHByZWZpeCBvZiB0aGUgdmFyaWFudAotICAgICAgICAgICAgICAgICAgICAgKiBsYW5ndWFnZSB0YWcgdXAgdG8gYSAnLScgY2hhcmFjdGVyIG1hdGNoZXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAqIHdob2xlIG9mIHRoZSBsYW5ndWFnZSByYW5nZSBpbiB0aGUgQWNjZXB0LUxhbmd1YWdlCi0gICAgICAgICAgICAgICAgICAgICAqIGhlYWRlci4gIE5vdGUgdGhhdCBIVFRQLzEueCBhbGxvd3MgYW55IG51bWJlciBvZgotICAgICAgICAgICAgICAgICAgICAgKiAnLScgY2hhcmFjdGVycyBpbiBhIHRhZyBvciByYW5nZSwgY3VycmVudGx5IG9ubHkKLSAgICAgICAgICAgICAgICAgICAgICogdGFncyB3aXRoIHplcm8gb3Igb25lICctJyBjaGFyYWN0ZXJzIGFyZSBkZWZpbmVkCi0gICAgICAgICAgICAgICAgICAgICAqIGZvciBnZW5lcmFsIHVzZSAoc2VlIHJmYzE3NjYpLgotICAgICAgICAgICAgICAgICAgICAgKiAgCi0gICAgICAgICAgICAgICAgICAgICAqIFdlIG9ubHkgdXNlIGxhbmd1YWdlIHJhbmdlIGluIHRoZSBBY2NlcHQtTGFuZ3VhZ2UKLSAgICAgICAgICAgICAgICAgICAgICogaGVhZGVyIHRoZSBiZXN0IG1hdGNoIGZvciB0aGUgdmFyaWFudCBsYW5ndWFnZSB0YWcKLSAgICAgICAgICAgICAgICAgICAgICogaWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHByZXZpb3VzIGJlc3QgbWF0Y2guCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYWxlbiA9IHN0cmxlbihhY2NzW2ldLm5hbWUpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKChzdHJsZW4obGFuZykgPj0gYWxlbikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFzdHJuY21wKGxhbmcsIGFjY3NbaV0ubmFtZSwgYWxlbikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICgobGFuZ1thbGVuXSA9PSAwKSB8fCAobGFuZ1thbGVuXSA9PSAnLScpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsZW4gPiBsb25nZXN0X2xhbmdfcmFuZ2VfbGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ2VzdF9sYW5nX3JhbmdlX2xlbiA9IGFsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdHRoaXN0YWcgPSAmYWNjc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFiZXN0dGhpc3RhZyAmJiAhbmVnLT5kb250X2ZpZGRsZV9oZWFkZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgbmV4dCBiaXQgaXMgYSBmaWRkbGUuIFNvbWUgYnJvd3NlcnMgbWlnaHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGJlIGNvbmZpZ3VyZWQgdG8gc2VuZCBtb3JlIHNwZWNpZmljIGxhbmd1YWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiByYW5nZXMgdGhhbiBkZXNpcmFibGUuIEZvciBleGFtcGxlLCBhbgotICAgICAgICAgICAgICAgICAgICAgICAgICogQWNjZXB0LUxhbmd1YWdlIG9mIGVuLVVTIHNob3VsZCBuZXZlciBtYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICogdmFyaWFudHMgd2l0aCBsYW5ndWFnZXMgZW4gb3IgZW4tR0IuIEJ1dCBVUwotICAgICAgICAgICAgICAgICAgICAgICAgICogRW5nbGlzaCBzcGVha2VycyBtaWdodCBwaWNrIGVuLVVTIGFzIHRoZWlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBsYW5ndWFnZSBjaG9pY2UuICBTbyB0aGlzIGZpZGRsZSBjaGVja3MgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBsYW5ndWFnZSByYW5nZSBoYXMgYSBwcmVmaXgsIGFuZCBpZiBzbywgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIG1hdGNoZXMgdmFyaWFudHMgd2hpY2ggbWF0Y2ggdGhhdCBwcmVmaXggd2l0aCBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBwcmlvcml0eSBvZiAwLjAwMS4gU28gYSByZXF1ZXN0IGZvciBlbi1VUyB3b3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICogbWF0Y2ggdmFyaWFudHMgb2YgdHlwZXMgZW4gYW5kIGVuLUdCLCBidXQgYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIG11Y2ggbG93ZXIgcHJpb3JpdHkgdGhhbiBtYXRjaGVzIG9mIGVuLVVTCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBkaXJlY3RseSwgb3Igb2YgYW55IG90aGVyIGxhbmd1YWdlIGxpc3RlZCBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIEFjY2VwdC1MYW5ndWFnZSBoZWFkZXIuIE5vdGUgdGhhdCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBmaWRkbGUgZG9lcyBub3QgaGFuZGxlIG11bHRpLWxldmVsIHByZWZpeGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHAgPSBzdHJjaHIoYWNjc1tpXS5uYW1lLCAnLScpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwbGVuID0gcCAtIGFjY3NbaV0ubmFtZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RybmNtcChsYW5nLCBhY2NzW2ldLm5hbWUsIHBsZW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZGRsZV9xID0gMC4wMDFmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBGaW5pc2hlZCBsb29raW5nIGF0IEFjY2VwdC1MYW5ndWFnZSBoZWFkZXJzLCB0aGUgYmVzdAotICAgICAgICAgICAgICAgICAqIChsb25nZXN0KSBtYXRjaCBpcyBpbiBiZXN0dGhpc3RhZywgb3IgTlVMTCBpZiBubyBtYXRjaAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmICghYmVzdCB8fAotICAgICAgICAgICAgICAgICAgICAoYmVzdHRoaXN0YWcgJiYgYmVzdHRoaXN0YWctPnF1YWxpdHkgPiBiZXN0LT5xdWFsaXR5KSkgewotICAgICAgICAgICAgICAgICAgICBiZXN0ID0gYmVzdHRoaXN0YWc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qIFNlZSBpZiB0aGUgdGFnIG1hdGNoZXMgb24gYSAqIGluIHRoZSBBY2NlcHQtTGFuZ3VhZ2UKLSAgICAgICAgICAgICAgICAgKiBoZWFkZXIuIElmIHNvLCByZWNvcmQgdGhpcyBmYWN0IGZvciBsYXRlciB1c2UgCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKCFiZXN0dGhpc3RhZyAmJiBzdGFyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFueV9tYXRjaF9vbl9zdGFyID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIElmIG9uZSBvZiB0aGUgbGFuZ3VhZ2UgdGFncyBvZiB0aGUgdmFyaWFudCBtYXRjaGVkIG9uICosIHdlCi0gICAgICAgICAgICAgKiBuZWVkIHRvIHNlZSBpZiBpdHMgcSBpcyBiZXR0ZXIgdGhhbiB0aGF0IG9mIGFueSBub24tKiBtYXRjaAotICAgICAgICAgICAgICogb24gYW55IG90aGVyIHRhZyBvZiB0aGUgdmFyaWFudC4gIElmIHNvIHRoZSAqIG1hdGNoIHRha2VzCi0gICAgICAgICAgICAgKiBwcmVjZWRlbmNlIGFuZCB0aGUgb3ZlcmFsbCBtYXRjaCBpcyBub3QgZGVmaW5pdGUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICggYW55X21hdGNoX29uX3N0YXIgJiYKLSAgICAgICAgICAgICAgICAoKGJlc3QgJiYgc3Rhci0+cXVhbGl0eSA+IGJlc3QtPnF1YWxpdHkpIHx8Ci0gICAgICAgICAgICAgICAgICghYmVzdCkpICkgewotICAgICAgICAgICAgICAgIGJlc3QgPSBzdGFyOwotICAgICAgICAgICAgICAgIHZhcmlhbnQtPmRlZmluaXRlID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdmFyaWFudC0+bGFuZ19xdWFsaXR5ID0gYmVzdCA/IGJlc3QtPnF1YWxpdHkgOiBmaWRkbGVfcTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIE5vdyBzZXQgdGhlIG9sZCBsYW5nX2luZGV4IGZpZWxkLiBTaW5jZSB0aGlzIGlzIG9sZCAKLSAgICAgKiBzdHVmZiBhbnl3YXksIGRvbid0IGJvdGhlciB3aXRoIGhhbmRsaW5nIG11bHRpcGxlIGxhbmd1YWdlcwotICAgICAqIHBlciB2YXJpYW50LCBqdXN0IHVzZSB0aGUgZmlyc3Qgb25lIGFzc2lnbmVkIHRvIGl0IAotICAgICAqLwotICAgIGlkeCA9IDA7Ci0gICAgaWYgKHZhcmlhbnQtPmNvbnRlbnRfbGFuZ3VhZ2VzICYmIHZhcmlhbnQtPmNvbnRlbnRfbGFuZ3VhZ2VzLT5uZWx0cykgewotICAgICAgICBmaXJzdGxhbmcgPSAoKGNoYXIgKiopIHZhcmlhbnQtPmNvbnRlbnRfbGFuZ3VhZ2VzLT5lbHRzKVswXTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZpcnN0bGFuZyA9ICIiOwotICAgIH0KLSAgICBpZiAoIW5lZy0+YWNjZXB0X2xhbmdzKSB7ICAgLyogQ2xpZW50IGRvZXNuJ3QgY2FyZSAqLwotICAgICAgICBpZHggPSBmaW5kX2RlZmF1bHRfaW5kZXgoKG5lZ19kaXJfY29uZmlnICopIGFwX2dldF9tb2R1bGVfY29uZmlnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZy0+ci0+cGVyX2Rpcl9jb25maWcsICZuZWdvdGlhdGlvbl9tb2R1bGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RsYW5nKTsKLSAgICB9Ci0gICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIENsaWVudCBoYXMgQWNjZXB0LUxhbmd1YWdlICovCi0gICAgICAgIGlkeCA9IGZpbmRfbGFuZ19pbmRleChuZWctPmFjY2VwdF9sYW5ncywgZmlyc3RsYW5nKTsKLSAgICB9Ci0gICAgdmFyaWFudC0+bGFuZ19pbmRleCA9IGlkeDsKLQotICAgIHJldHVybjsKLX0KLQotLyogRGV0ZXJtaW5pbmcgdGhlIGNvbnRlbnQgbGVuZ3RoIC0tLSBpZiB0aGUgbWFwIGRpZG4ndCB0ZWxsIHVzLAotICogd2UgaGF2ZSB0byBkbyBhIHN0YXQoKSBhbmQgcmVtZW1iZXIgZm9yIG5leHQgdGltZS4KLSAqCi0gKiBHcnVtcC4gIEZvciBBcGFjaGUsIGV2ZW4gdGhlIGZpcnN0IHN0YXQgaGVyZSBtYXkgd2VsbCBiZQotICogcmVkdW5kYW50IChmb3IgbXVsdGl2aWV3cykgd2l0aCBhIHN0YXQoKSBkb25lIGJ5IHRoZSBzdWJfcmVxCi0gKiBtYWNoaW5lcnkuICBBdCBzb21lIHBvaW50LCB0aGF0IG91Z2h0IHRvIGJlIGZpeGVkLgotICovCi0KLXN0YXRpYyBmbG9hdCBmaW5kX2NvbnRlbnRfbGVuZ3RoKG5lZ290aWF0aW9uX3N0YXRlICpuZWcsIHZhcl9yZWMgKnZhcmlhbnQpCi17Ci0gICAgYXBfZmluZm9fdCBzdGF0YjsKLQotICAgIGlmICh2YXJpYW50LT5ieXRlcyA9PSAwKSB7Ci0gICAgICAgIGNoYXIgKmZ1bGxuYW1lID0gYXBfbWFrZV9mdWxsX3BhdGgobmVnLT5wb29sLCBuZWctPmRpcl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQtPmZpbGVfbmFtZSk7Ci0KLSAgICAgICAgaWYgKGFwX3N0YXQoJnN0YXRiLCBmdWxsbmFtZSwgbmVnLT5wb29sKSA9PSBBUFJfU1VDQ0VTUykgewotICAgICAgICAgICAgLyogTm90ZSwgcHJlY2lzaW9uIG1heSBiZSBsb3N0ICovCi0gICAgICAgICAgICB2YXJpYW50LT5ieXRlcyA9IChmbG9hdCkgc3RhdGIuc2l6ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB2YXJpYW50LT5ieXRlczsKLX0KLQotLyogRm9yIGEgZ2l2ZW4gdmFyaWFudCwgZmluZCB0aGUgYmVzdCBtYXRjaGluZyBBY2NlcHQ6IGhlYWRlcgotICogYW5kIGFzc2lnbiB0aGUgQWNjZXB0OiBoZWFkZXIncyBxdWFsaXR5IHZhbHVlIHRvIHRoZQotICogbWltZV90eXBlX3F1YWxpdHkgZmllbGQgb2YgdGhlIHZhcmlhbnQsIGZvciBsYXRlciB1c2UgaW4KLSAqIGRldGVybWluaW5nIHRoZSBiZXN0IG1hdGNoaW5nIHZhcmlhbnQuCi0gKi8KLQotc3RhdGljIHZvaWQgc2V0X2FjY2VwdF9xdWFsaXR5KG5lZ290aWF0aW9uX3N0YXRlICpuZWcsIHZhcl9yZWMgKnZhcmlhbnQpCi17Ci0gICAgaW50IGk7Ci0gICAgYWNjZXB0X3JlYyAqYWNjZXB0X3JlY3M7Ci0gICAgZmxvYXQgcSA9IDAuMGY7Ci0gICAgaW50IHFfZGVmaW5pdGUgPSAxOwotCi0gICAgLyogaWYgbm8gQWNjZXB0OiBoZWFkZXIsIGxlYXZlIHF1YWxpdHkgYWxvbmUgKHdpbGwKLSAgICAgKiByZW1haW4gYXQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgMSkgCi0gICAgICoKLSAgICAgKiBYWFg6IFRoaXMgaWYgaXMgY3VycmVudGx5IG5ldmVyIHRydWUgYmVjYXVzZSBvZiB0aGUgZWZmZWN0IG9mCi0gICAgICogbWF5YmVfYWRkX2RlZmF1bHRfYWNjZXB0cygpLgotICAgICAqLwotICAgIGlmICghbmVnLT5hY2NlcHRzKSB7Ci0gICAgICAgIGlmICh2YXJpYW50LT5taW1lX3R5cGUgJiYgKnZhcmlhbnQtPm1pbWVfdHlwZSkKLSAgICAgICAgICAgIHZhcmlhbnQtPmRlZmluaXRlID0gMDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGFjY2VwdF9yZWNzID0gKGFjY2VwdF9yZWMgKikgbmVnLT5hY2NlcHRzLT5lbHRzOwotCi0gICAgLyoKLSAgICAgKiBHbyB0aHJvdWdoIGVhY2ggb2YgdGhlIHJhbmdlcyBvbiB0aGUgQWNjZXB0OiBoZWFkZXIsCi0gICAgICogbG9va2luZyBmb3IgdGhlICdiZXN0JyBtYXRjaCB3aXRoIHRoaXMgdmFyaWFudCdzCi0gICAgICogY29udGVudC10eXBlLiBXZSB1c2UgdGhlIGJlc3QgbWF0Y2gncyBxdWFsaXR5Ci0gICAgICogdmFsdWUgKGZyb20gdGhlIEFjY2VwdDogaGVhZGVyKSBmb3IgdGhpcyB2YXJpYW50J3MKLSAgICAgKiBtaW1lX3R5cGVfcXVhbGl0eSBmaWVsZC4KLSAgICAgKgotICAgICAqIFRoZSBiZXN0IG1hdGNoIGlzIGRldGVybWluZWQgbGlrZSB0aGlzOgotICAgICAqICAgIHR5cGUvdHlwZSBpcyBiZXR0ZXIgdGhhbiB0eXBlLyAqIGlzIGJldHRlciB0aGFuICogLyAqCi0gICAgICogICAgaWYgbWF0Y2ggaXMgdHlwZS90eXBlLCB1c2UgdGhlIGxldmVsIG1pbWUgcGFyYW0gaWYgYXZhaWxhYmxlCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IG5lZy0+YWNjZXB0cy0+bmVsdHM7ICsraSkgewotCi0gICAgICAgIGFjY2VwdF9yZWMgKnR5cGUgPSAmYWNjZXB0X3JlY3NbaV07Ci0gICAgICAgIGludCBwcmV2X21pbWVfc3RhcnM7Ci0KLSAgICAgICAgcHJldl9taW1lX3N0YXJzID0gdmFyaWFudC0+bWltZV9zdGFyczsKLQotICAgICAgICBpZiAoIW1pbWVfbWF0Y2godHlwZSwgdmFyaWFudCkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgLyogZGlkbid0IG1hdGNoIHRoZSBjb250ZW50IHR5cGUgYXQgYWxsICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiBkaWQgbWF0Y2ggLSBzZWUgaWYgdGhlcmUgd2VyZSBsZXNzIG9yIG1vcmUgc3RhcnMgdGhhbgotICAgICAgICAgICAgICogaW4gcHJldmlvdXMgbWF0Y2gKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHByZXZfbWltZV9zdGFycyA9PSB2YXJpYW50LT5taW1lX3N0YXJzKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgIC8qIG1vcmUgc3RhcnMgPT4gbm90IGFzIGdvb2QgYSBtYXRjaCAqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogSWYgd2UgYXJlIGFsbG93ZWQgdG8gbWVzcyB3aXRoIHRoZSBxLXZhbHVlcwotICAgICAgICAgKiBhbmQgaGF2ZSBubyBleHBsaWNpdCBxPSBwYXJhbWV0ZXJzIGluIHRoZSBhY2NlcHQgaGVhZGVyLAotICAgICAgICAgKiBtYWtlIHdpbGRjYXJkcyB2ZXJ5IGxvdywgc28gd2UgaGF2ZSBhIGxvdyBjaGFuY2UKLSAgICAgICAgICogb2YgZW5kaW5nIHVwIHdpdGggdGhlbSBpZiB0aGVyZSdzIHNvbWV0aGluZyBiZXR0ZXIuCi0gICAgICAgICAqLwotCi0gICAgICAgIGlmICghbmVnLT5kb250X2ZpZGRsZV9oZWFkZXJzICYmICFuZWctPmFjY2VwdF9xICYmCi0gICAgICAgICAgICB2YXJpYW50LT5taW1lX3N0YXJzID09IDEpIHsKLSAgICAgICAgICAgIHEgPSAwLjAxZjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghbmVnLT5kb250X2ZpZGRsZV9oZWFkZXJzICYmICFuZWctPmFjY2VwdF9xICYmCi0gICAgICAgICAgICAgICAgIHZhcmlhbnQtPm1pbWVfc3RhcnMgPT0gMikgewotICAgICAgICAgICAgcSA9IDAuMDJmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcSA9IHR5cGUtPnF1YWxpdHk7Ci0gICAgICAgIH0KLQotICAgICAgICBxX2RlZmluaXRlID0gKHZhcmlhbnQtPm1pbWVfc3RhcnMgPT0gMyk7Ci0gICAgfQotICAgIHZhcmlhbnQtPm1pbWVfdHlwZV9xdWFsaXR5ID0gcTsKLSAgICB2YXJpYW50LT5kZWZpbml0ZSA9IHZhcmlhbnQtPmRlZmluaXRlICYmIHFfZGVmaW5pdGU7Ci0KLX0KLQotLyogRm9yIGEgZ2l2ZW4gdmFyaWFudCwgZmluZCB0aGUgJ3EnIHZhbHVlIG9mIHRoZSBjaGFyc2V0IGdpdmVuCi0gKiBvbiB0aGUgQWNjZXB0LUNoYXJzZXQgbGluZS4gSWYgbm8gY2hhcnNldHMgYXJlIGxpc3RlZCwKLSAqIGFzc3VtZSB2YWx1ZSBvZiAnMScuCi0gKi8KLXN0YXRpYyB2b2lkIHNldF9jaGFyc2V0X3F1YWxpdHkobmVnb3RpYXRpb25fc3RhdGUgKm5lZywgdmFyX3JlYyAqdmFyaWFudCkKLXsKLSAgICBpbnQgaTsKLSAgICBhY2NlcHRfcmVjICphY2NlcHRfcmVjczsKLSAgICBjaGFyICpjaGFyc2V0ID0gdmFyaWFudC0+Y29udGVudF9jaGFyc2V0OwotICAgIGFjY2VwdF9yZWMgKnN0YXIgPSBOVUxMOwotCi0gICAgLyogaWYgbm8gQWNjZXB0LUNoYXJzZXQ6IGhlYWRlciwgbGVhdmUgcXVhbGl0eSBhbG9uZSAod2lsbAotICAgICAqIHJlbWFpbiBhdCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiAxKQotICAgICAqLwotICAgIGlmICghbmVnLT5hY2NlcHRfY2hhcnNldHMpIHsKLSAgICAgICAgaWYgKGNoYXJzZXQgJiYgKmNoYXJzZXQpCi0gICAgICAgICAgICB2YXJpYW50LT5kZWZpbml0ZSA9IDA7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhY2NlcHRfcmVjcyA9IChhY2NlcHRfcmVjICopIG5lZy0+YWNjZXB0X2NoYXJzZXRzLT5lbHRzOwotCi0gICAgaWYgKGNoYXJzZXQgPT0gTlVMTCB8fCAhKmNoYXJzZXQpIHsKLSAgICAgICAgLyogQ2hhcnNldCBvZiB2YXJpYW50IG5vdCBrbm93biAqLwotCi0gICAgICAgIC8qIGlmIG5vdCBhIHRleHQgLyAqIHR5cGUsIGxlYXZlIHF1YWxpdHkgYWxvbmUgKi8KLSAgICAgICAgaWYgKCEoIXN0cm5jbXAodmFyaWFudC0+bWltZV90eXBlLCAidGV4dC8iLCA1KQotICAgICAgICAgICAgICB8fCAhc3RyY21wKHZhcmlhbnQtPm1pbWVfdHlwZSwgSU5DTFVERVNfTUFHSUNfVFlQRSkKLSAgICAgICAgICAgICAgfHwgIXN0cmNtcCh2YXJpYW50LT5taW1lX3R5cGUsIElOQ0xVREVTX01BR0lDX1RZUEUzKSAKLSAgICAgICAgICAgICAgKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvKiBEb24ndCBnbyBndWVzc2luZyBpZiB3ZSBhcmUgaW4gc3RyaWN0IGhlYWRlciBtb2RlLAotICAgICAgICAgKiBlLmcuIHdoZW4gcnVubmluZyB0aGUgcnZzYSwgYXMgYW55IGd1ZXNzIHdvbid0IGJlIHJlZmxlY3RlZAotICAgICAgICAgKiBpbiB0aGUgdmFyaWFudCBsaXN0IG9yIGNvbnRlbnQtbG9jYXRpb24gaGVhZGVycy4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChuZWctPmRvbnRfZmlkZGxlX2hlYWRlcnMpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgY2hhcnNldCA9ICJpc28tODg1OS0xIjsgLyogVGhlIGRlZmF1bHQgY2hhcnNldCBmb3IgSFRUUCB0ZXh0IHR5cGVzICovCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBHbyB0aHJvdWdoIGVhY2ggb2YgdGhlIGl0ZW1zIG9uIHRoZSBBY2NlcHQtQ2hhcnNldCBoZWFkZXIsCi0gICAgICogbG9va2luZyBmb3IgYSBtYXRjaCB3aXRoIHRoaXMgdmFyaWFudCdzIGNoYXJzZXQuIElmIG5vbmUKLSAgICAgKiBtYXRjaCwgY2hhcnNldCBpcyB1bmFjY2VwdGFibGUsIHNvIHNldCBxdWFsaXR5IHRvIDAuCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IG5lZy0+YWNjZXB0X2NoYXJzZXRzLT5uZWx0czsgKytpKSB7Ci0KLSAgICAgICAgYWNjZXB0X3JlYyAqdHlwZSA9ICZhY2NlcHRfcmVjc1tpXTsKLQotICAgICAgICBpZiAoIXN0cmNtcCh0eXBlLT5uYW1lLCBjaGFyc2V0KSkgewotICAgICAgICAgICAgdmFyaWFudC0+Y2hhcnNldF9xdWFsaXR5ID0gdHlwZS0+cXVhbGl0eTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJjbXAodHlwZS0+bmFtZSwgIioiKSA9PSAwKSB7Ci0gICAgICAgICAgICBzdGFyID0gdHlwZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBObyBleHBsaWNpdCBtYXRjaCAqLwotICAgIGlmIChzdGFyKSB7Ci0gICAgICAgIHZhcmlhbnQtPmNoYXJzZXRfcXVhbGl0eSA9IHN0YXItPnF1YWxpdHk7Ci0gICAgICAgIHZhcmlhbnQtPmRlZmluaXRlID0gMDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvKiBJZiB0aGlzIHZhcmlhbnQgaXMgaW4gY2hhcnNldCBpc28tODg1OS0xLCB0aGUgZGVmYXVsdCBpcyAxLjAgKi8KLSAgICBpZiAoc3RyY21wKGNoYXJzZXQsICJpc28tODg1OS0xIikgPT0gMCkgewotICAgICAgICB2YXJpYW50LT5jaGFyc2V0X3F1YWxpdHkgPSAxLjBmOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgdmFyaWFudC0+Y2hhcnNldF9xdWFsaXR5ID0gMC4wZjsKLSAgICB9Ci19Ci0KLQotLyogaXNfaWRlbnRpdHlfZW5jb2RpbmcgaXMgaW5jbHVkZWQgZm9yIGJhY2stY29tcGF0LCBidXQgZG9lcyBhbnlvbmUKLSAqIHVzZSA3Yml0LCA4YmluIG9yIGJpbmFyeSBpbiB0aGVpciB2YXIgZmlsZXM/PwotICovCi0KLXN0YXRpYyBpbnQgaXNfaWRlbnRpdHlfZW5jb2RpbmcoY29uc3QgY2hhciAqZW5jKQotewotICAgIHJldHVybiAoIWVuYyB8fCAhZW5jWzBdIHx8ICFzdHJjbXAoZW5jLCAiN2JpdCIpIHx8ICFzdHJjbXAoZW5jLCAiOGJpdCIpCi0gICAgICAgICAgICB8fCAhc3RyY21wKGVuYywgImJpbmFyeSIpKTsKLX0KLQotLyoKLSAqIHNldF9lbmNvZGluZ19xdWFsaXR5IGRldGVybWluZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgZm9yIGEgcGFydGljdWxhcgotICogdmFyaWFudCBpcyBhY2NlcHRhYmxlIGZvciB0aGUgdXNlci1hZ2VudC4KLSAqCi0gKiBUaGUgcnVsZXMgZm9yIGVuY29kaW5nIGFyZSB0aGF0IGlmIHRoZSB1c2VyLWFnZW50IGRvZXMgbm90IHN1cHBseQotICogYW55IEFjY2VwdC1FbmNvZGluZyBoZWFkZXIsIHRoZW4gYWxsIGVuY29kaW5ncyBhcmUgYWxsb3dlZCBidXQgYQotICogdmFyaWFudCB3aXRoIG5vIGVuY29kaW5nIHNob3VsZCBiZSBwcmVmZXJyZWQuCi0gKiBJZiB0aGVyZSBpcyBhbiBlbXB0eSBBY2NlcHQtRW5jb2RpbmcgaGVhZGVyLCB0aGVuIG5vIGVuY29kaW5ncyBhcmUgCi0gKiBhY2NlcHRhYmxlLiBJZiB0aGVyZSBpcyBhIG5vbi1lbXB0eSBBY2NlcHQtRW5jb2RpbmcgaGVhZGVyLCB0aGVuCi0gKiBhbnkgb2YgdGhlIGxpc3RlZCBlbmNvZGluZ3MgYXJlIGFjY2VwdGFibGUsIGFzIHdlbGwgYXMgbm8gZW5jb2RpbmcKLSAqIHVubGVzcyB0aGUgImlkZW50aXR5IiBlbmNvZGluZyBpcyBzcGVjaWZpY2FsbHkgZXhjbHVkZWQuCi0gKi8KLXN0YXRpYyB2b2lkIHNldF9lbmNvZGluZ19xdWFsaXR5KG5lZ290aWF0aW9uX3N0YXRlICpuZWcsIHZhcl9yZWMgKnZhcmlhbnQpCi17Ci0gICAgYWNjZXB0X3JlYyAqYWNjZXB0X3JlY3M7Ci0gICAgY29uc3QgY2hhciAqZW5jID0gdmFyaWFudC0+Y29udGVudF9lbmNvZGluZzsKLSAgICBhY2NlcHRfcmVjICpzdGFyID0gTlVMTDsKLSAgICBmbG9hdCB2YWx1ZV9pZl9ub3RfZm91bmQgPSAwLjBmOwotICAgIGludCBpOwotCi0gICAgaWYgKCFuZWctPmFjY2VwdF9lbmNvZGluZ3MpIHsKLSAgICAgICAgLyogV2UgaGFkIG5vIEFjY2VwdC1FbmNvZGluZyBoZWFkZXIsIGFzc3VtZSB0aGF0IGFsbAotICAgICAgICAgKiBlbmNvZGluZ3MgYXJlIGFjY2VwdGFibGUgd2l0aCBhIGxvdyBxdWFsaXR5LAotICAgICAgICAgKiBidXQgd2UgcHJlZmVyIG5vIGVuY29kaW5nIGlmIGF2YWlsYWJsZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICghZW5jIHx8IGlzX2lkZW50aXR5X2VuY29kaW5nKGVuYykpCi0gICAgICAgICAgICB2YXJpYW50LT5lbmNvZGluZ19xdWFsaXR5ID0gMS4wZjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdmFyaWFudC0+ZW5jb2RpbmdfcXVhbGl0eSA9IDAuNWY7Ci0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghZW5jIHx8IGlzX2lkZW50aXR5X2VuY29kaW5nKGVuYykpIHsKLSAgICAgICAgZW5jID0gImlkZW50aXR5IjsKLSAgICAgICAgdmFsdWVfaWZfbm90X2ZvdW5kID0gMC4wMDAxZjsKLSAgICB9Ci0KLSAgICBhY2NlcHRfcmVjcyA9IChhY2NlcHRfcmVjICopIG5lZy0+YWNjZXB0X2VuY29kaW5ncy0+ZWx0czsKLQotICAgIC8qIEdvIHRocm91Z2ggZWFjaCBvZiB0aGUgZW5jb2RpbmdzIG9uIHRoZSBBY2NlcHQtRW5jb2Rpbmc6IGhlYWRlciwKLSAgICAgKiBsb29raW5nIGZvciBhIG1hdGNoIHdpdGggb3VyIGVuY29kaW5nLiB4LSBwcmVmaXhlcyBhcmUgaWdub3JlZC4KLSAgICAgKi8KLSAgICBpZiAoZW5jWzBdID09ICd4JyAmJiBlbmNbMV0gPT0gJy0nKSB7Ci0gICAgICAgIGVuYyArPSAyOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbmVnLT5hY2NlcHRfZW5jb2RpbmdzLT5uZWx0czsgKytpKSB7Ci0KLSAgICAgICAgY2hhciAqbmFtZSA9IGFjY2VwdF9yZWNzW2ldLm5hbWU7Ci0KLSAgICAgICAgaWYgKG5hbWVbMF0gPT0gJ3gnICYmIG5hbWVbMV0gPT0gJy0nKSB7Ci0gICAgICAgICAgICBuYW1lICs9IDI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCBlbmMpKSB7Ci0gICAgICAgICAgICB2YXJpYW50LT5lbmNvZGluZ19xdWFsaXR5ID0gYWNjZXB0X3JlY3NbaV0ucXVhbGl0eTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdHJjbXAobmFtZSwgIioiKSA9PSAwKSB7Ci0gICAgICAgICAgICBzdGFyID0gJmFjY2VwdF9yZWNzW2ldOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgLyogTm8gZXhwbGljaXQgbWF0Y2ggKi8KLSAgICBpZiAoc3RhcikgewotICAgICAgICB2YXJpYW50LT5lbmNvZGluZ19xdWFsaXR5ID0gc3Rhci0+cXVhbGl0eTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIEVuY29kaW5nIG5vdCBmb3VuZCBvbiBBY2NlcHQtRW5jb2Rpbmc6IGhlYWRlciwgc28gaXQgaXMKLSAgICAgKiBfbm90XyBhY2NlcHRhYmxlIHVubGVzcyBpdCBpcyB0aGUgaWRlbnRpdHkgKG5vIGVuY29kaW5nKQotICAgICAqLwotICAgIHZhcmlhbnQtPmVuY29kaW5nX3F1YWxpdHkgPSB2YWx1ZV9pZl9ub3RfZm91bmQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotICogUG9zc2libGUgcmVzdWx0cyBvZiB0aGUgdmFyaWFudCBzZWxlY3Rpb24gYWxnb3JpdGhtIAotICovCi1lbnVtIGFsZ29yaXRobV9yZXN1bHRzIHsKLSAgICBhbGdfY2hvaWNlID0gMSwgICAgICAgICAgICAgIC8qIGNob29zZSB2YXJpYW50ICovCi0gICAgYWxnX2xpc3QgICAgICAgICAgICAgICAgICAgICAvKiBsaXN0IHZhcmlhbnRzICovCi19OwotCi0vKiBCZWxvdyBpcyB0aGUgJ2Jlc3RfbWF0Y2gnIGZ1bmN0aW9uLiBJdCByZXR1cm5zIGFuIGludCwgd2hpY2ggaGFzCi0gKiBvbmUgb2YgdGhlIHR3byB2YWx1ZXMgYWxnX2Nob2ljZSBvciBhbGdfbGlzdCwgd2hpY2ggZ2l2ZSB0aGUgcmVzdWx0Ci0gKiBvZiB0aGUgdmFyaWFudCBzZWxlY3Rpb24gYWxnb3JpdGhtLiAgYWxnX2xpc3QgbWVhbnMgdGhhdCBubyBiZXN0Ci0gKiB2YXJpYW50IHdhcyBmb3VuZCBieSB0aGUgYWxnb3JpdGhtLCBhbGdfY2hvaWNlIG1lYW5zIHRoYXQgYSBiZXN0Ci0gKiB2YXJpYW50IHdhcyBmb3VuZCBhbmQgc2hvdWxkIGJlIHJldHVybmVkLiAgVGhlIGxpc3QvY2hvaWNlCi0gKiB0ZXJtaW5vbG9neSBjb21lcyBmcm9tIFRDTiAocmZjMjI5NSksIGJ1dCBpcyB1c2VkIGluIGEgbW9yZSBnZW5lcmljCi0gKiB3YXkgaGVyZS4gIFRoZSBiZXN0IHZhcmlhbnQgaXMgcmV0dXJuZWQgaW4gKnBiZXN0LiBiZXN0X21hdGNoIGhhcwotICogdHdvIHBvc3NpYmxlIGFsZ29yaXRobXMgZm9yIGRldGVybWluaW5nIHRoZSBiZXN0IHZhcmlhbnQ6IHRoZQotICogUlZTQS8xLjAgYWxnb3JpdGhtIChmcm9tIFJGQzIyOTYpLCBhbmQgdGhlIHN0YW5kYXJkIEFwYWNoZQotICogYWxnb3JpdGhtLiBUaGVzZSBhcmUgc3BsaXQgb3V0IGludG8gc2VwYXJhdGUgZnVuY3Rpb25zCi0gKiAoaXNfdmFyaWFudF9iZXR0ZXJfcnZzYSgpIGFuZCBpc192YXJpYW50X2JldHRlcigpKS4gIFNlbGVjdGlvbiBvZgotICogb25lIGlzIHRocm91Z2ggdGhlIG5lZy0+dXNlX3J2c2EgZmxhZy4KLSAqCi0gKiBUaGUgY2FsbCB0byBiZXN0X21hdGNoIGFsc28gY3JlYXRlcyBmdWxsIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcKLSAqIGxhbmd1YWdlLCBjaGFyc2V0LCBldGMgcXVhbGl0eSBmb3IgX2V2ZXJ5XyB2YXJpYW50LiBUaGlzIGlzIG5lZWRlZAotICogZm9yIGdlbmVyYXRpbmcgYSBjb3JyZWN0IFZhcnkgaGVhZGVyLCBhbmQgY2FuIGJlIHVzZWQgZm9yIHRoZQotICogQWx0ZXJuYXRlcyBoZWFkZXIsIHRoZSBodW1hbi1yZWFkYWJsZSBsaXN0IHJlc3BvbnNlcyBhbmQgNDA2IGVycm9ycy4KLSAqLwotCi0vKiBGaXJzdGx5LCB0aGUgUlZTQS8xLjAgKEhUVFAgUmVtb3RlIFZhcmlhbnQgU2VsZWN0aW9uIEFsZ29yaXRobQotICogdjEuMCkgZnJvbSByZmMyMjk2LiAgVGhpcyBpcyB0aGUgYWxnb3JpdGhtIHRoYXQgZ29lcyB0b2dldGhlciB3aXRoCi0gKiB0cmFuc3BhcmVudCBjb250ZW50IG5lZ290aWF0aW9uIChUQ04pLgotICovCi1zdGF0aWMgaW50IGlzX3ZhcmlhbnRfYmV0dGVyX3J2c2EobmVnb3RpYXRpb25fc3RhdGUgKm5lZywgdmFyX3JlYyAqdmFyaWFudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfcmVjICpiZXN0LCBmbG9hdCAqcF9iZXN0cSkKLXsKLSAgICBmbG9hdCBiZXN0cSA9ICpwX2Jlc3RxLCBxOwotCi0gICAgLyogVENOIGRvZXMgbm90IGNvdmVyIG5lZ290aWF0aW9uIG9uIGNvbnRlbnQtZW5jb2RpbmcuICBGb3Igbm93LAotICAgICAqIHdlIGlnbm9yZSB0aGUgZW5jb2RpbmcgdW5sZXNzIGl0IHdhcyBleHBsaWNpdGx5IGV4Y2x1ZGVkLgotICAgICAqLwotICAgIGlmICh2YXJpYW50LT5lbmNvZGluZ19xdWFsaXR5ID09IDAuMGYpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIHEgPSB2YXJpYW50LT5taW1lX3R5cGVfcXVhbGl0eSAqCi0gICAgICAgIHZhcmlhbnQtPnNvdXJjZV9xdWFsaXR5ICoKLSAgICAgICAgdmFyaWFudC0+Y2hhcnNldF9xdWFsaXR5ICoKLSAgICAgICAgdmFyaWFudC0+bGFuZ19xdWFsaXR5OwotCi0gICAvKiBSRkMgMjI5NiBjYWxscyBmb3IgdGhlIHJlc3VsdCB0byBiZSByb3VuZGVkIHRvIDUgZGVjaW1hbCBwbGFjZXMsCi0gICAgKiBidXQgd2UgZG9uJ3QgZG8gdGhhdCBiZWNhdXNlIGl0IHNlcnZlcyBubyB1c2VmdWwgcHVycG9zZSBvdGhlcgotICAgICogdGhhbiB0byBlbnN1cmUgdGhhdCBhIHJlbW90ZSBhbGdvcml0aG0gb3BlcmF0ZXMgb24gdGhlIHNhbWUKLSAgICAqIHByZWNpc2lvbiBhcyBvdXJzLiAgVGhhdCBpcyBzaWxseSwgc2luY2Ugd2hhdCB3ZSBvYnZpb3VzbHkgd2FudAotICAgICogaXMgZm9yIHRoZSBhbGdvcml0aG0gdG8gb3BlcmF0ZSBvbiB0aGUgYmVzdCBhdmFpbGFibGUgcHJlY2lzaW9uCi0gICAgKiByZWdhcmRsZXNzIG9mIHdobyBydW5zIGl0LiAgU2luY2UgdGhlIGFib3ZlIGNhbGN1bGF0aW9uIG1heQotICAgICogcmVzdWx0IGluIHNpZ25pZmljYW50IHZhcmlhbmNlIGF0IDFlLTEyLCByb3VuZGluZyB3b3VsZCBiZSBib2d1cy4KLSAgICAqLwotCi0jaWZkZWYgTkVHX0RFQlVHCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgIlZhcmlhbnQ6IGZpbGU9JXMgdHlwZT0lcyBsYW5nPSVzIHNvdXJjZXE9JTEuM2YgIgotICAgICAgICAgICAibWltZXE9JTEuM2YgbGFuZ3E9JTEuM2YgY2hhcnE9JTEuM2YgZW5jcT0lMS4zZiAiCi0gICAgICAgICAgICJxPSUxLjVmIGRlZmluaXRlPSVkIiwgICAgICAgICAgICAKLSAgICAgICAgICAgICh2YXJpYW50LT5maWxlX25hbWUgPyB2YXJpYW50LT5maWxlX25hbWUgOiAiIiksCi0gICAgICAgICAgICAodmFyaWFudC0+bWltZV90eXBlID8gdmFyaWFudC0+bWltZV90eXBlIDogIiIpLAotICAgICAgICAgICAgKHZhcmlhbnQtPmNvbnRlbnRfbGFuZ3VhZ2VzCi0gICAgICAgICAgICAgPyBhcF9hcnJheV9wc3RyY2F0KG5lZy0+cG9vbCwgdmFyaWFudC0+Y29udGVudF9sYW5ndWFnZXMsICcsJykKLSAgICAgICAgICAgICA6ICIiKSwKLSAgICAgICAgICAgIHZhcmlhbnQtPnNvdXJjZV9xdWFsaXR5LAotICAgICAgICAgICAgdmFyaWFudC0+bWltZV90eXBlX3F1YWxpdHksCi0gICAgICAgICAgICB2YXJpYW50LT5sYW5nX3F1YWxpdHksCi0gICAgICAgICAgICB2YXJpYW50LT5jaGFyc2V0X3F1YWxpdHksCi0gICAgICAgICAgICB2YXJpYW50LT5lbmNvZGluZ19xdWFsaXR5LAotICAgICAgICAgICAgcSwKLSAgICAgICAgICAgIHZhcmlhbnQtPmRlZmluaXRlKTsKLSNlbmRpZgotCi0gICAgaWYgKHEgPD0gMC4wZikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHEgPiBiZXN0cSkgewotICAgICAgICAqcF9iZXN0cSA9IHE7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpZiAocSA9PSBiZXN0cSkgewotICAgICAgICAvKiBJZiB0aGUgYmVzdCB2YXJpYW50J3MgZW5jb2RpbmcgaXMgb2YgbGVzc2VyIHF1YWxpdHkgdGhhbgotICAgICAgICAgKiB0aGlzIHZhcmlhbnQsIHRoZW4gd2UgcHJlZmVyIHRoaXMgdmFyaWFudAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHZhcmlhbnQtPmVuY29kaW5nX3F1YWxpdHkgPiBiZXN0LT5lbmNvZGluZ19xdWFsaXR5KSB7Ci0gICAgICAgICAgICAqcF9iZXN0cSA9IHE7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyogTmVnb3RpYXRpb24gYWxnb3JpdGhtIGFzIHVzZWQgYnkgcHJldmlvdXMgdmVyc2lvbnMgb2YgQXBhY2hlCi0gKiAoanVzdCBhYm91dCkuIAotICovCi0KLXN0YXRpYyBpbnQgaXNfdmFyaWFudF9iZXR0ZXIobmVnb3RpYXRpb25fc3RhdGUgKm5lZywgdmFyX3JlYyAqdmFyaWFudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX3JlYyAqYmVzdCwgZmxvYXQgKnBfYmVzdHEpCi17Ci0gICAgZmxvYXQgYmVzdHEgPSAqcF9iZXN0cSwgcTsKLSAgICBpbnQgbGV2Y21wOwotCi0gICAgLyogRm9yIG5vbi10cmFuc3BhcmVudCBuZWdvdGlhdGlvbiwgc2VydmVyIGNhbiBjaG9vc2UgaG93Ci0gICAgICogdG8gaGFuZGxlIHRoZSBuZWdvdGlhdGlvbi4gV2UnbGwgdXNlIHRoZSBmb2xsb3dpbmcgaW4KLSAgICAgKiBvcmRlcjogY29udGVudC10eXBlLCBsYW5ndWFnZSwgY29udGVudC10eXBlIGxldmVsLCBjaGFyc2V0LAotICAgICAqIGNvbnRlbnQgZW5jb2RpbmcsIGNvbnRlbnQgbGVuZ3RoLgotICAgICAqCi0gICAgICogRm9yIGVhY2ggY2hlY2ssIHdlIGhhdmUgdGhyZWUgcG9zc2libGUgb3V0Y29tZXM6Ci0gICAgICogICBUaGlzIHZhcmlhbnQgaXMgd29yc2UgdGhhbiBjdXJyZW50IGJlc3Q6IHJldHVybiAwCi0gICAgICogICBUaGlzIHZhcmlhbnQgaXMgYmV0dGVyIHRoYW4gdGhlIGN1cnJlbnQgYmVzdDoKLSAgICAgKiAgICAgICAgICBhc3NpZ24gdGhpcyB2YXJpYW50J3MgcSB0byAqcF9iZXN0cSwgYW5kIHJldHVybiAxCi0gICAgICogICBUaGlzIHZhcmlhbnQgaXMganVzdCBhcyBkZXNpcmFibGUgYXMgdGhlIGN1cnJlbnQgYmVzdDoKLSAgICAgKiAgICAgICAgICBkcm9wIHRocm91Z2ggdG8gdGhlIG5leHQgdGVzdC4KLSAgICAgKgotICAgICAqIFRoaXMgY29kZSBpcyB3cml0dGVuIGluIHRoaXMgbG9uZy13aW5kZWQgd2F5IHRvIGFsbG93IGZ1dHVyZQotICAgICAqIGN1c3RvbWlzYXRpb24sIGVpdGhlciBieSB0aGUgYWRkaXRpb24gb2YgYWRkaXRpb25hbAotICAgICAqIGNoZWNrcywgb3IgdG8gYWxsb3cgdGhlIG9yZGVyIG9mIHRoZSBjaGVja3MgdG8gYmUgZGV0ZXJtaW5lZAotICAgICAqIGJ5IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAoZS5nLiB3ZSBtaWdodCBwcmVmZXIgdG8gY2hlY2sKLSAgICAgKiBsYW5ndWFnZSBxdWFsaXR5IF9iZWZvcmVfIGNvbnRlbnQgdHlwZSkuCi0gICAgICovCi0KLSAgICAvKiBGaXJzdCB0aG91Z2gsIGVsaW1pbmF0ZSB0aGlzIHZhcmlhbnQgaWYgaXQgaXMgbm90Ci0gICAgICogYWNjZXB0YWJsZSBieSB0eXBlLCBjaGFyc2V0LCBlbmNvZGluZyBvciBsYW5ndWFnZS4KLSAgICAgKi8KLQotI2lmZGVmIE5FR19ERUJVRwotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICJWYXJpYW50OiBmaWxlPSVzIHR5cGU9JXMgbGFuZz0lcyBzb3VyY2VxPSUxLjNmICIKLSAgICAgICAgICAgIm1pbWVxPSUxLjNmIGxhbmdxPSUxLjNmIGxhbmdpZHg9JWQgY2hhcnE9JTEuM2YgZW5jcT0lMS4zZiAiLAotICAgICAgICAgICAgKHZhcmlhbnQtPmZpbGVfbmFtZSA/IHZhcmlhbnQtPmZpbGVfbmFtZSA6ICIiKSwKLSAgICAgICAgICAgICh2YXJpYW50LT5taW1lX3R5cGUgPyB2YXJpYW50LT5taW1lX3R5cGUgOiAiIiksCi0gICAgICAgICAgICAodmFyaWFudC0+Y29udGVudF9sYW5ndWFnZXMKLSAgICAgICAgICAgICA/IGFwX2FycmF5X3BzdHJjYXQobmVnLT5wb29sLCB2YXJpYW50LT5jb250ZW50X2xhbmd1YWdlcywgJywnKQotICAgICAgICAgICAgIDogIiIpLAotICAgICAgICAgICAgdmFyaWFudC0+c291cmNlX3F1YWxpdHksCi0gICAgICAgICAgICB2YXJpYW50LT5taW1lX3R5cGVfcXVhbGl0eSwKLSAgICAgICAgICAgIHZhcmlhbnQtPmxhbmdfcXVhbGl0eSwKLSAgICAgICAgICAgIHZhcmlhbnQtPmxhbmdfaW5kZXgsCi0gICAgICAgICAgICB2YXJpYW50LT5jaGFyc2V0X3F1YWxpdHksCi0gICAgICAgICAgICB2YXJpYW50LT5lbmNvZGluZ19xdWFsaXR5KTsKLSNlbmRpZgotCi0gICAgaWYgKHZhcmlhbnQtPmVuY29kaW5nX3F1YWxpdHkgPT0gMC4wZiB8fAotICAgICAgICB2YXJpYW50LT5sYW5nX3F1YWxpdHkgPT0gMC4wZiB8fAotICAgICAgICB2YXJpYW50LT5zb3VyY2VfcXVhbGl0eSA9PSAwLjBmIHx8Ci0gICAgICAgIHZhcmlhbnQtPmNoYXJzZXRfcXVhbGl0eSA9PSAwLjBmIHx8Ci0gICAgICAgIHZhcmlhbnQtPm1pbWVfdHlwZV9xdWFsaXR5ID09IDAuMGYpIHsKLSAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgLyogZG9uJ3QgY29uc2lkZXIgdW5hY2NlcHRhYmxlcyAqLwotICAgIH0KLQotICAgIHEgPSB2YXJpYW50LT5taW1lX3R5cGVfcXVhbGl0eSAqIHZhcmlhbnQtPnNvdXJjZV9xdWFsaXR5OwotICAgIGlmIChxID09IDAuMCB8fCBxIDwgYmVzdHEpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChxID4gYmVzdHEgfHwgIWJlc3QpIHsKLSAgICAgICAgKnBfYmVzdHEgPSBxOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiBsYW5ndWFnZSAqLwotICAgIGlmICh2YXJpYW50LT5sYW5nX3F1YWxpdHkgPCBiZXN0LT5sYW5nX3F1YWxpdHkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmICh2YXJpYW50LT5sYW5nX3F1YWxpdHkgPiBiZXN0LT5sYW5nX3F1YWxpdHkpIHsKLSAgICAgICAgKnBfYmVzdHEgPSBxOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiBpZiBsYW5ndWFnZSBxdWFsaXRpZXMgd2VyZSBlcXVhbCwgdHJ5IHRoZSBMYW5ndWFnZVByaW9yaXR5IHN0dWZmICovCi0gICAgaWYgKGJlc3QtPmxhbmdfaW5kZXggIT0gLTEgJiYKLSAgICAgICAgKHZhcmlhbnQtPmxhbmdfaW5kZXggPT0gLTEgfHwgdmFyaWFudC0+bGFuZ19pbmRleCA+IGJlc3QtPmxhbmdfaW5kZXgpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAodmFyaWFudC0+bGFuZ19pbmRleCAhPSAtMSAmJgotICAgICAgICAoYmVzdC0+bGFuZ19pbmRleCA9PSAtMSB8fCB2YXJpYW50LT5sYW5nX2luZGV4IDwgYmVzdC0+bGFuZ19pbmRleCkpIHsKLSAgICAgICAgKnBfYmVzdHEgPSBxOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiBjb250ZW50LXR5cGUgbGV2ZWwgKHNvbWV0aW1lcyB1c2VkIHdpdGggdGV4dC9odG1sLCB0aG91Z2ggd2UKLSAgICAgKiBzdXBwb3J0IGl0IG9uIG90aGVyIHR5cGVzIHRvbykKLSAgICAgKi8KLSAgICBsZXZjbXAgPSBsZXZlbF9jbXAodmFyaWFudCwgYmVzdCk7Ci0gICAgaWYgKGxldmNtcCA9PSAtMSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGxldmNtcCA9PSAxKSB7Ci0gICAgICAgICpwX2Jlc3RxID0gcTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLyogY2hhcnNldCAqLwotICAgIGlmICh2YXJpYW50LT5jaGFyc2V0X3F1YWxpdHkgPCBiZXN0LT5jaGFyc2V0X3F1YWxpdHkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIC8qIElmIHRoZSBiZXN0IHZhcmlhbnQncyBjaGFyc2V0IGlzIElTTy04ODU5LTEgYW5kIHRoaXMgdmFyaWFudCBoYXMKLSAgICAgKiB0aGUgc2FtZSBjaGFyc2V0IHF1YWxpdHksIHRoZW4gd2UgcHJlZmVyIHRoaXMgdmFyaWFudAotICAgICAqLwotCi0gICAgaWYgKHZhcmlhbnQtPmNoYXJzZXRfcXVhbGl0eSA+IGJlc3QtPmNoYXJzZXRfcXVhbGl0eSB8fAotICAgICAgICAoKHZhcmlhbnQtPmNvbnRlbnRfY2hhcnNldCAhPSBOVUxMICYmCi0gICAgICAgICAgKnZhcmlhbnQtPmNvbnRlbnRfY2hhcnNldCAhPSAnXDAnICYmCi0gICAgICAgICAgc3RyY21wKHZhcmlhbnQtPmNvbnRlbnRfY2hhcnNldCwgImlzby04ODU5LTEiKSAhPSAwKSAmJgotICAgICAgICAgKGJlc3QtPmNvbnRlbnRfY2hhcnNldCA9PSBOVUxMIHx8Ci0gICAgICAgICAgKmJlc3QtPmNvbnRlbnRfY2hhcnNldCA9PSAnXDAnIHx8Ci0gICAgICAgICAgc3RyY21wKGJlc3QtPmNvbnRlbnRfY2hhcnNldCwgImlzby04ODU5LTEiKSA9PSAwKSkpIHsKLSAgICAgICAgKnBfYmVzdHEgPSBxOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiBQcmVmZXIgdGhlIGhpZ2hlc3QgdmFsdWUgZm9yIGVuY29kaW5nX3F1YWxpdHkuCi0gICAgICovCi0gICAgaWYgKHZhcmlhbnQtPmVuY29kaW5nX3F1YWxpdHkgPCBiZXN0LT5lbmNvZGluZ19xdWFsaXR5KSB7Ci0gICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmICh2YXJpYW50LT5lbmNvZGluZ19xdWFsaXR5ID4gYmVzdC0+ZW5jb2RpbmdfcXVhbGl0eSkgewotICAgICAgICpwX2Jlc3RxID0gcTsKLSAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiBjb250ZW50IGxlbmd0aCBpZiBhbGwgZWxzZSBlcXVhbCAqLwotICAgIGlmIChmaW5kX2NvbnRlbnRfbGVuZ3RoKG5lZywgdmFyaWFudCkgPj0gZmluZF9jb250ZW50X2xlbmd0aChuZWcsIGJlc3QpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIG9rLCB0byBnZXQgaGVyZSBtZWFucyBldmVyeSB0aGluZyB0dXJuZWQgb3V0IGVxdWFsLCBleGNlcHQKLSAgICAgKiB3ZSBoYXZlIGEgc2hvcnRlciBjb250ZW50IGxlbmd0aCwgc28gdXNlIHRoaXMgdmFyaWFudAotICAgICAqLwotICAgICpwX2Jlc3RxID0gcTsKLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBiZXN0X21hdGNoKG5lZ290aWF0aW9uX3N0YXRlICpuZWcsIHZhcl9yZWMgKipwYmVzdCkKLXsKLSAgICBpbnQgajsKLSAgICB2YXJfcmVjICpiZXN0ID0gTlVMTDsKLSAgICBmbG9hdCBiZXN0cSA9IDAuMGY7Ci0gICAgZW51bSBhbGdvcml0aG1fcmVzdWx0cyBhbGdvcml0aG1fcmVzdWx0OwotCi0gICAgdmFyX3JlYyAqYXZhaWxfcmVjcyA9ICh2YXJfcmVjICopIG5lZy0+YXZhaWxfdmFycy0+ZWx0czsKLQotICAgIHNldF9kZWZhdWx0X2xhbmdfcXVhbGl0eShuZWcpOwotCi0gICAgLyoKLSAgICAgKiBGaW5kIHRoZSAnYmVzdCcgdmFyaWFudCAKLSAgICAgKi8KLQotICAgIGZvciAoaiA9IDA7IGogPCBuZWctPmF2YWlsX3ZhcnMtPm5lbHRzOyArK2opIHsKLSAgICAgICAgdmFyX3JlYyAqdmFyaWFudCA9ICZhdmFpbF9yZWNzW2pdOwotCi0gICAgICAgIC8qIEZpbmQgYWxsIHRoZSByZWxldmFudCAncXVhbGl0eScgdmFsdWVzIGZyb20gdGhlCi0gICAgICAgICAqIEFjY2VwdC4uLiBoZWFkZXJzLCBhbmQgc3RvcmUgaW4gdGhlIHZhcmlhbnQuICBUaGlzIGFsc28KLSAgICAgICAgICogcHJlcGFyZXMgZm9yIHNlbmRpbmcgYW4gQWx0ZXJuYXRlcyBoZWFkZXIgZXRjIHNvIHdlIG5lZWQgdG8KLSAgICAgICAgICogZG8gaXQgZXZlbiBpZiB3ZSBkbyBub3QgYWN0dWFsbHkgcGxhbiB0byBmaW5kIGEgYmVzdAotICAgICAgICAgKiB2YXJpYW50LiAgCi0gICAgICAgICAqLwotICAgICAgICBzZXRfYWNjZXB0X3F1YWxpdHkobmVnLCB2YXJpYW50KTsKLSAgICAgICAgc2V0X2xhbmd1YWdlX3F1YWxpdHkobmVnLCB2YXJpYW50KTsKLSAgICAgICAgc2V0X2VuY29kaW5nX3F1YWxpdHkobmVnLCB2YXJpYW50KTsKLSAgICAgICAgc2V0X2NoYXJzZXRfcXVhbGl0eShuZWcsIHZhcmlhbnQpOwotCi0gICAgICAgIC8qIE9ubHkgZG8gdmFyaWFudCBzZWxlY3Rpb24gaWYgd2UgbWF5IGFjdHVhbGx5IGNob29zZSBhCi0gICAgICAgICAqIHZhcmlhbnQgZm9yIHRoZSBjbGllbnQgCi0gICAgICAgICAqLwotICAgICAgICBpZiAobmVnLT5tYXlfY2hvb3NlKSB7Ci0KLSAgICAgICAgICAgIC8qIE5vdyBmaW5kIG91dCBpZiB0aGlzIHZhcmlhbnQgaXMgYmV0dGVyIHRoYW4gdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAqIGJlc3QsIGVpdGhlciB1c2luZyB0aGUgUlZTQS8xLjAgYWxnb3JpdGhtLCBvciBBcGFjaGUncwotICAgICAgICAgICAgICogaW50ZXJuYWwgc2VydmVyLWRyaXZlbiBhbGdvcml0aG0uIFByZXN1bWFibHkgb3RoZXIKLSAgICAgICAgICAgICAqIHNlcnZlci1kcml2ZW4gYWxnb3JpdGhtcyBhcmUgcG9zc2libGUsIGFuZCBjb3VsZCBiZQotICAgICAgICAgICAgICogaW1wbGVtZW50ZWQgaGVyZS4KLSAgICAgICAgICAgICAqLwotICAgICAKLSAgICAgICAgICAgIGlmIChuZWctPnVzZV9ydnNhKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzX3ZhcmlhbnRfYmV0dGVyX3J2c2EobmVnLCB2YXJpYW50LCBiZXN0LCAmYmVzdHEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3QgPSB2YXJpYW50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChpc192YXJpYW50X2JldHRlcihuZWcsIHZhcmlhbnQsIGJlc3QsICZiZXN0cSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYmVzdCA9IHZhcmlhbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogV2Ugbm93IGVpdGhlciBoYXZlIGEgYmVzdCB2YXJpYW50LCBvciBubyBiZXN0IHZhcmlhbnQgKi8KLQotICAgIGlmIChuZWctPnVzZV9ydnNhKSAgICB7Ci0gICAgICAgIC8qIGNhbGN1bGF0ZSByZXN1bHQgZm9yIFJWU0EvMS4wIGFsZ29yaXRobToKLSAgICAgICAgICogb25seSBhIGNob2ljZSByZXNwb25zZSBpZiB0aGUgYmVzdCB2YXJpYW50IGhhcyBxPjAKLSAgICAgICAgICogYW5kIGlzIGRlZmluaXRlCi0gICAgICAgICAqLwotICAgICAgICBhbGdvcml0aG1fcmVzdWx0ID0gKGJlc3QgJiYgYmVzdC0+ZGVmaW5pdGUpICYmIChiZXN0cSA+IDApID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ19jaG9pY2UgOiBhbGdfbGlzdDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIGNhbGN1bGF0ZSByZXN1bHQgZm9yIEFwYWNoZSBuZWdvdGlhdGlvbiBhbGdvcml0aG0gKi8KLSAgICAgICAgYWxnb3JpdGhtX3Jlc3VsdCA9IGJlc3RxID4gMCA/IGFsZ19jaG9pY2UgOiBhbGdfbGlzdDsgICAgICAgIAotICAgIH0KLQotICAgIC8qIFJldHVybmluZyBhIGNob2ljZSByZXNwb25zZSB3aXRoIGEgbm9uLW5laWdoYm9yaW5nIHZhcmlhbnQgaXMgYQotICAgICAqIHByb3RvY29sIHNlY3VyaXR5IGVycm9yIGluIFRDTiAoc2VlIHJmYzIyOTUpLiAgV2UgZG8gKm5vdCoKLSAgICAgKiB2ZXJpZnkgaGVyZSB0aGF0IHRoZSB2YXJpYW50IGFuZCBVUkkgYXJlIG5laWdoYm9ycywgZXZlbiB0aG91Z2gKLSAgICAgKiB3ZSBtYXkgcmV0dXJuIGFsZ19jaG9pY2UuICBXZSBkZXBlbmQgb24gdGhlIGVudmlyb25tZW50ICh0aGUKLSAgICAgKiBjYWxsZXIpIHRvIG9ubHkgZGVjbGFyZSB0aGUgcmVzb3VyY2UgdHJhbnNwYXJlbnRseSBuZWdvdGlhYmxlIGlmCi0gICAgICogYWxsIHZhcmlhbnRzIGFyZSBuZWlnaGJvcnMuCi0gICAgICovCi0gICAgKnBiZXN0ID0gYmVzdDsKLSAgICByZXR1cm4gYWxnb3JpdGhtX3Jlc3VsdDsKLX0KLQotLyogU2V0cyByZXNwb25zZSBoZWFkZXJzIGZvciBhIG5lZ290aWF0ZWQgcmVzcG9uc2UuCi0gKiBuZWctPmlzX3RyYW5zcGFyZW50IGRldGVybWluZXMgd2hldGhlciBhIHRyYW5zcGFyZW50bHkgbmVnb3RpYXRlZAotICogcmVzcG9uc2Ugb3IgYSBwbGFpbiBgc2VydmVyIGRyaXZlbiBuZWdvdGlhdGlvbicgcmVzcG9uc2UgaXMKLSAqIGNyZWF0ZWQuICAgQXBwbGljYWJsZSBoZWFkZXJzIGFyZSBBbHRlcm5hdGVzLCBWYXJ5LCBhbmQgVENOLgotICoKLSAqIFRoZSBWYXJ5IGhlYWRlciB3ZSBjcmVhdGUgaXMgc29tZXRpbWVzIGxvbmdlciB0aGFuIGlzIHJlcXVpcmVkIGZvcgotICogdGhlIGNvcnJlY3QgY2FjaGluZyBvZiBuZWdvdGlhdGVkIHJlc3VsdHMgYnkgSFRUUC8xLjEgY2FjaGVzLiAgRm9yCi0gKiBleGFtcGxlIGlmIHdlIGhhdmUgMyB2YXJpYW50cyB4Lmh0bWwsIHgucHMuZW4gYW5kIHgucHMubmwsIGFuZCBpZgotICogdGhlIEFjY2VwdDogaGVhZGVyIGFzc2lnbnMgYSAwIHF1YWxpdHkgdG8gLnBzLCB0aGVuIHRoZSByZXN1bHRzIG9mCi0gKiB0aGUgdHdvIHNlcnZlci1zaWRlIG5lZ290aWF0aW9uIGFsZ29yaXRobXMgd2UgY3VycmVudGx5IGltcGxlbWVudAotICogd2lsbCBuZXZlciBkZXBlbmQgb24gQWNjZXB0LUxhbmd1YWdlIHNvIHdlIGNvdWxkIHJldHVybiBgVmFyeToKLSAqIG5lZ290aWF0ZSwgYWNjZXB0JyBpbnN0ZWFkIG9mIHRoZSBsb25nZXIgJ1Zhcnk6IG5lZ290aWF0ZSwgYWNjZXB0LAotICogYWNjZXB0LWxhbmd1YWdlJyB3aGljaCB0aGUgY29kZSBiZWxvdyB3aWxsIHJldHVybi4gIEEgcm91dGluZSBmb3IKLSAqIGNvbXB1dGluZyB0aGUgZXhhY3QgbWluaW1hbCBWYXJ5IGhlYWRlciB3b3VsZCBiZSBhIGh1Z2UgcGFpbiB0byBjb2RlCi0gKiBhbmQgbWFpbnRhaW4gdGhvdWdoLCBlc3BlY2lhbGx5IGJlY2F1c2Ugd2UgbmVlZCB0byB0YWtlIGFsbCBwb3NzaWJsZQotICogdHdpZGRsZXMgaW4gdGhlIHNlcnZlci1zaWRlIG5lZ290aWF0aW9uIGFsZ29yaXRobXMgaW50byBhY2NvdW50LgotICovCi1zdGF0aWMgdm9pZCBzZXRfbmVnX2hlYWRlcnMocmVxdWVzdF9yZWMgKnIsIG5lZ290aWF0aW9uX3N0YXRlICpuZWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsZ19yZXN1bHQpCi17Ci0gICAgYXBfdGFibGVfdCAqaGRyczsKLSAgICB2YXJfcmVjICphdmFpbF9yZWNzID0gKHZhcl9yZWMgKikgbmVnLT5hdmFpbF92YXJzLT5lbHRzOwotICAgIGNvbnN0IGNoYXIgKnNhbXBsZV90eXBlID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICpzYW1wbGVfbGFuZ3VhZ2UgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKnNhbXBsZV9lbmNvZGluZyA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciAqc2FtcGxlX2NoYXJzZXQgPSBOVUxMOwotICAgIGNoYXIgKmxhbmc7Ci0gICAgY2hhciAqcXN0cjsKLSAgICBjaGFyICpsZW5zdHI7Ci0gICAgbG9uZyBsZW47Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmFycjsKLSAgICBpbnQgbWF4X3ZsaXN0X2FycmF5ID0gKG5lZy0+YXZhaWxfdmFycy0+bmVsdHMgKiAyMSk7Ci0gICAgaW50IGZpcnN0X3ZhcmlhbnQgPSAxOwotICAgIGludCB2YXJ5X2J5X3R5cGUgPSAwOwotICAgIGludCB2YXJ5X2J5X2xhbmd1YWdlID0gMDsKLSAgICBpbnQgdmFyeV9ieV9jaGFyc2V0ID0gMDsKLSAgICBpbnQgdmFyeV9ieV9lbmNvZGluZyA9IDA7Ci0gICAgaW50IGo7Ci0KLSAgICAvKiBJbiBvcmRlciB0byBhdm9pZCBPKG5eMikgbWVtb3J5IGNvcGllcyBpbiBidWlsZGluZyBBbHRlcm5hdGVzLAotICAgICAqIHdlIHByZWFsbG9jYXRlIGEgYXBfdGFibGVfdCB3aXRoIHRoZSBtYXhpbXVtIHN1YnN0cmluZ3MgcG9zc2libGUsCi0gICAgICogZmlsbCBpdCB3aXRoIHRoZSB2YXJpYW50IGxpc3QsIGFuZCB0aGVuIGNvbmNhdGVuYXRlIHRoZSBlbnRpcmUgYXJyYXkuCi0gICAgICogTm90ZSB0aGF0IGlmIHlvdSBjaGFuZ2UgdGhlIG51bWJlciBvZiBzdWJzdHJpbmdzIHB1c2hlZCwgeW91IGFsc28KLSAgICAgKiBuZWVkIHRvIGNoYW5nZSB0aGUgY2FsY3VsYXRpb24gb2YgbWF4X3ZsaXN0X2FycmF5IGFib3ZlLgotICAgICAqLwotICAgIGlmIChuZWctPnNlbmRfYWx0ZXJuYXRlcyAmJiBuZWctPmF2YWlsX3ZhcnMtPm5lbHRzKQotICAgICAgICBhcnIgPSBhcF9tYWtlX2FycmF5KHItPnBvb2wsIG1heF92bGlzdF9hcnJheSwgc2l6ZW9mKGNoYXIgKikpOwotICAgIGVsc2UKLSAgICAgICAgYXJyID0gTlVMTDsKLQotICAgIC8qIFB1dCBoZWFkZXJzIGludG8gZXJyX2hlYWRlcnNfb3V0LCBzaW5jZSBzZW5kX2h0dHBfaGVhZGVyKCkKLSAgICAgKiBvdXRwdXRzIGJvdGggaGVhZGVyc19vdXQgYW5kIGVycl9oZWFkZXJzX291dC4KLSAgICAgKi8KLSAgICBoZHJzID0gci0+ZXJyX2hlYWRlcnNfb3V0OwotCi0gICAgZm9yIChqID0gMDsgaiA8IG5lZy0+YXZhaWxfdmFycy0+bmVsdHM7ICsraikgewotICAgICAgICB2YXJfcmVjICp2YXJpYW50ID0gJmF2YWlsX3JlY3Nbal07Ci0KLSAgICAgICAgaWYgKHZhcmlhbnQtPmNvbnRlbnRfbGFuZ3VhZ2VzICYmIHZhcmlhbnQtPmNvbnRlbnRfbGFuZ3VhZ2VzLT5uZWx0cykgewotICAgICAgICAgICAgbGFuZyA9IGFwX2FycmF5X3BzdHJjYXQoci0+cG9vbCwgdmFyaWFudC0+Y29udGVudF9sYW5ndWFnZXMsICcsJyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBsYW5nID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENhbGN1bGF0ZSBWYXJ5IGJ5IGxvb2tpbmcgZm9yIGFueSBkaWZmZXJlbmNlIGJldHdlZW4gdmFyaWFudHMgKi8KLQotICAgICAgICBpZiAoZmlyc3RfdmFyaWFudCkgewotICAgICAgICAgICAgc2FtcGxlX3R5cGUgICAgID0gdmFyaWFudC0+bWltZV90eXBlOwotICAgICAgICAgICAgc2FtcGxlX2NoYXJzZXQgID0gdmFyaWFudC0+Y29udGVudF9jaGFyc2V0OwotICAgICAgICAgICAgc2FtcGxlX2xhbmd1YWdlID0gbGFuZzsKLSAgICAgICAgICAgIHNhbXBsZV9lbmNvZGluZyA9IHZhcmlhbnQtPmNvbnRlbnRfZW5jb2Rpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIXZhcnlfYnlfdHlwZSAmJgotICAgICAgICAgICAgICAgIHN0cmNtcChzYW1wbGVfdHlwZSA/IHNhbXBsZV90eXBlIDogIiIsIAotICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50LT5taW1lX3R5cGUgPyB2YXJpYW50LT5taW1lX3R5cGUgOiAiIikpIHsKLSAgICAgICAgICAgICAgICB2YXJ5X2J5X3R5cGUgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCF2YXJ5X2J5X2NoYXJzZXQgJiYKLSAgICAgICAgICAgICAgICBzdHJjbXAoc2FtcGxlX2NoYXJzZXQgPyBzYW1wbGVfY2hhcnNldCA6ICIiLAotICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50LT5jb250ZW50X2NoYXJzZXQgPwotICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50LT5jb250ZW50X2NoYXJzZXQgOiAiIikpIHsKLSAgICAgICAgICAgICAgICB2YXJ5X2J5X2NoYXJzZXQgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCF2YXJ5X2J5X2xhbmd1YWdlICYmCi0gICAgICAgICAgICAgICAgc3RyY21wKHNhbXBsZV9sYW5ndWFnZSA/IHNhbXBsZV9sYW5ndWFnZSA6ICIiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgbGFuZyA/IGxhbmcgOiAiIikpIHsKLSAgICAgICAgICAgICAgICB2YXJ5X2J5X2xhbmd1YWdlID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghdmFyeV9ieV9lbmNvZGluZyAmJgotICAgICAgICAgICAgICAgIHN0cmNtcChzYW1wbGVfZW5jb2RpbmcgPyBzYW1wbGVfZW5jb2RpbmcgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudC0+Y29udGVudF9lbmNvZGluZyA/IAotICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50LT5jb250ZW50X2VuY29kaW5nIDogIiIpKSB7Ci0gICAgICAgICAgICAgICAgdmFyeV9ieV9lbmNvZGluZyA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmlyc3RfdmFyaWFudCA9IDA7Ci0KLSAgICAgICAgaWYgKCFuZWctPnNlbmRfYWx0ZXJuYXRlcykKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8qIEdlbmVyYXRlIHRoZSBzdHJpbmcgY29tcG9uZW50cyBmb3IgdGhpcyBBbHRlcm5hdGVzIGVudHJ5ICovCi0KLSAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9ICJ7XCIiOwotICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gdmFyaWFudC0+ZmlsZV9uYW1lOwotICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gIlwiICI7Ci0KLSAgICAgICAgcXN0ciA9IChjaGFyICopIGFwX3BhbGxvYyhyLT5wb29sLCA2KTsKLSAgICAgICAgYXBfc25wcmludGYocXN0ciwgNiwgIiUxLjNmIiwgdmFyaWFudC0+c291cmNlX3F1YWxpdHkpOwotCi0gICAgICAgIC8qIFN0cmlwIHRyYWlsaW5nIHplcm9zIChzYXZlcyB0aG9zZSB2YWx1YWJsZSBuZXR3b3JrIGJ5dGVzKSAqLwotICAgICAgICBpZiAocXN0cls0XSA9PSAnMCcpIHsKLSAgICAgICAgICAgIHFzdHJbNF0gPSAnXDAnOwotICAgICAgICAgICAgaWYgKHFzdHJbM10gPT0gJzAnKSB7Ci0gICAgICAgICAgICAgICAgcXN0clszXSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgaWYgKHFzdHJbMl0gPT0gJzAnKSB7Ci0gICAgICAgICAgICAgICAgICAgIHFzdHJbMV0gPSAnXDAnOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gcXN0cjsKLQotICAgICAgICBpZiAodmFyaWFudC0+bWltZV90eXBlICYmICp2YXJpYW50LT5taW1lX3R5cGUpIHsKLSAgICAgICAgICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSAiIHt0eXBlICI7Ci0gICAgICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gdmFyaWFudC0+bWltZV90eXBlOwotICAgICAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9ICJ9IjsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFyaWFudC0+Y29udGVudF9jaGFyc2V0ICYmICp2YXJpYW50LT5jb250ZW50X2NoYXJzZXQpIHsKLSAgICAgICAgICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSAiIHtjaGFyc2V0ICI7Ci0gICAgICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gdmFyaWFudC0+Y29udGVudF9jaGFyc2V0OwotICAgICAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9ICJ9IjsKLSAgICAgICAgfQotICAgICAgICBpZiAobGFuZykgewotICAgICAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9ICIge2xhbmd1YWdlICI7Ci0gICAgICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gbGFuZzsKLSAgICAgICAgICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSAifSI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhcmlhbnQtPmNvbnRlbnRfZW5jb2RpbmcgJiYgKnZhcmlhbnQtPmNvbnRlbnRfZW5jb2RpbmcpIHsKLSAgICAgICAgICAgIC8qIFN0cmljdGx5IHNwZWFraW5nLCB0aGlzIGlzIG5vbi1zdGFuZGFyZCwgYnV0IHNvIGlzIFRDTiAqLwotCi0gICAgICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gIiB7ZW5jb2RpbmcgIjsKLSAgICAgICAgICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSB2YXJpYW50LT5jb250ZW50X2VuY29kaW5nOwotICAgICAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9ICJ9IjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIE5vdGUgdGhhdCB0aGUgQWx0ZXJuYXRlcyBzcGVjaWZpY2F0aW9uIChpbiByZmMyMjk1KSBkb2VzCi0gICAgICAgICAqIG5vdCByZXF1aXJlIHRoYXQgd2UgaW5jbHVkZSB7bGVuZ3RoIHh9LCBzbyB3ZSBjb3VsZCBvbWl0IGl0Ci0gICAgICAgICAqIGlmIGRldGVybWluaW5nIHRoZSBsZW5ndGggaXMgdG9vIGV4cGVuc2l2ZS4gIFdlIGN1cnJlbnRseQotICAgICAgICAgKiBhbHdheXMgaW5jbHVkZSBpdCB0aG91Z2guICAyMiBieXRlcyBpcyBlbm91Z2ggZm9yIDJeNjQuCi0gICAgICAgICAqCi0gICAgICAgICAqIElmIHRoZSB2YXJpYW50IGlzIGEgQ0dJIHNjcmlwdCwgZmluZF9jb250ZW50X2xlbmd0aCB3b3VsZAotICAgICAgICAgKiByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgc2NyaXB0LCBub3QgdGhlIG91dHB1dCBpdAotICAgICAgICAgKiBwcm9kdWNlcywgc28gd2UgY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIGhhbmRsZXIgYW5kIGlmCi0gICAgICAgICAqIHRoZXJlIGlzIG9uZSB3ZSBkb24ndCBhZGQgYSBsZW5ndGguCi0gICAgICAgICAqIAotICAgICAgICAgKiBYWFg6IFRPRE86IFRoaXMgY2hlY2sgZG9lcyBub3QgZGV0ZWN0IGEgQ0dJIHNjcmlwdCBpZiB3ZQotICAgICAgICAgKiBnZXQgdGhlIHZhcmlhbnQgZnJvbSBhIHR5cGUgbWFwLiAgVGhpcyBuZWVkcyB0byBiZSBmaXhlZAotICAgICAgICAgKiAod2l0aG91dCBicmVha2luZyB0aGluZ3MgaWYgdGhlIHR5cGUgbWFwIHNwZWNpZmllcyBhCi0gICAgICAgICAqIGNvbnRlbnQtbGVuZ3RoLCB3aGljaCBjdXJyZW50bHkgbGVhZHMgdG8gdGhlIGNvcnJlY3QgcmVzdWx0KS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICghKHZhcmlhbnQtPnN1Yl9yZXEgJiYgdmFyaWFudC0+c3ViX3JlcS0+aGFuZGxlcikKLSAgICAgICAgICAgICYmIChsZW4gPSBmaW5kX2NvbnRlbnRfbGVuZ3RoKG5lZywgdmFyaWFudCkpICE9IDApIHsKLQotICAgICAgICAgICAgbGVuc3RyID0gKGNoYXIgKikgYXBfcGFsbG9jKHItPnBvb2wsIDIyKTsKLSAgICAgICAgICAgIGFwX3NucHJpbnRmKGxlbnN0ciwgMjIsICIlbGQiLCBsZW4pOwotICAgICAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9ICIge2xlbmd0aCAiOwotICAgICAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9IGxlbnN0cjsKLSAgICAgICAgICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSAifSI7Ci0gICAgICAgIH0KLSAgICAgIAotICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gIn0iOwotICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gIiwgIjsgLyogdHJpbW1lZCBiZWxvdyAqLwotICAgIH0KLQotICAgIGlmIChuZWctPnNlbmRfYWx0ZXJuYXRlcyAmJiBuZWctPmF2YWlsX3ZhcnMtPm5lbHRzKSB7Ci0gICAgICAgIGFyci0+bmVsdHMtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW1vdmUgbGFzdCBjb21tYSAqLwotICAgICAgICBhcF90YWJsZV9tZXJnZW4oaGRycywgIkFsdGVybmF0ZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgYXBfYXJyYXlfcHN0cmNhdChyLT5wb29sLCBhcnIsICdcMCcpKTsKLSAgICB9IAotCi0gICAgaWYgKG5lZy0+aXNfdHJhbnNwYXJlbnQgfHwgdmFyeV9ieV90eXBlIHx8IHZhcnlfYnlfbGFuZ3VhZ2UgfHwKLSAgICAgICAgdmFyeV9ieV9sYW5ndWFnZSB8fCB2YXJ5X2J5X2NoYXJzZXQgfHwgdmFyeV9ieV9lbmNvZGluZykgewotCi0gICAgICAgIGFwX3RhYmxlX21lcmdlbihoZHJzLCAiVmFyeSIsIDIgKyBhcF9wc3RyY2F0KHItPnBvb2wsCi0gICAgICAgICAgICBuZWctPmlzX3RyYW5zcGFyZW50ID8gIiwgbmVnb3RpYXRlIiAgICAgICA6ICIiLAotICAgICAgICAgICAgdmFyeV9ieV90eXBlICAgICAgICA/ICIsIGFjY2VwdCIgICAgICAgICAgOiAiIiwKLSAgICAgICAgICAgIHZhcnlfYnlfbGFuZ3VhZ2UgICAgPyAiLCBhY2NlcHQtbGFuZ3VhZ2UiIDogIiIsCi0gICAgICAgICAgICB2YXJ5X2J5X2NoYXJzZXQgICAgID8gIiwgYWNjZXB0LWNoYXJzZXQiICA6ICIiLAotICAgICAgICAgICAgdmFyeV9ieV9lbmNvZGluZyAgICA/ICIsIGFjY2VwdC1lbmNvZGluZyIgOiAiIiwgTlVMTCkpOwotICAgIH0KLQotICAgIGlmIChuZWctPmlzX3RyYW5zcGFyZW50KSB7IC8qIENyZWF0ZSBUQ04gcmVzcG9uc2UgaGVhZGVyICovCi0gICAgICAgIGFwX3RhYmxlX3NldG4oaGRycywgIlRDTiIsCi0gICAgICAgICAgICAgICAgICAgICAgYWxnX3Jlc3VsdCA9PSBhbGdfbGlzdCA/ICJsaXN0IiA6ICJjaG9pY2UiKTsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogUmV0dXJuIGFuIEhUTUwgbGlzdCBvZiB2YXJpYW50cy4gVGhpcyBpcyBvdXRwdXQgYXMgcGFydCBvZiB0aGUKLSAqIGNob2ljZSByZXNwb25zZSBvciA0MDYgc3RhdHVzIGJvZHkuCi0gKi8KLQotc3RhdGljIGNoYXIgKm1ha2VfdmFyaWFudF9saXN0KHJlcXVlc3RfcmVjICpyLCBuZWdvdGlhdGlvbl9zdGF0ZSAqbmVnKQotewotICAgIGFwX2FycmF5X2hlYWRlcl90ICphcnI7Ci0gICAgaW50IGk7Ci0gICAgaW50IG1heF92bGlzdF9hcnJheSA9IChuZWctPmF2YWlsX3ZhcnMtPm5lbHRzICogMTUpICsgMjsKLQotICAgIC8qIEluIG9yZGVyIHRvIGF2b2lkIE8obl4yKSBtZW1vcnkgY29waWVzIGluIGJ1aWxkaW5nIHRoZSBsaXN0LAotICAgICAqIHdlIHByZWFsbG9jYXRlIGEgYXBfdGFibGVfdCB3aXRoIHRoZSBtYXhpbXVtIHN1YnN0cmluZ3MgcG9zc2libGUsCi0gICAgICogZmlsbCBpdCB3aXRoIHRoZSB2YXJpYW50IGxpc3QsIGFuZCB0aGVuIGNvbmNhdGVuYXRlIHRoZSBlbnRpcmUgYXJyYXkuCi0gICAgICovCi0gICAgYXJyID0gYXBfbWFrZV9hcnJheShyLT5wb29sLCBtYXhfdmxpc3RfYXJyYXksIHNpemVvZihjaGFyICopKTsKLQotICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSAiQXZhaWxhYmxlIHZhcmlhbnRzOlxuPHVsPlxuIjsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuZWctPmF2YWlsX3ZhcnMtPm5lbHRzOyArK2kpIHsKLSAgICAgICAgdmFyX3JlYyAqdmFyaWFudCA9ICYoKHZhcl9yZWMgKikgbmVnLT5hdmFpbF92YXJzLT5lbHRzKVtpXTsKLSAgICAgICAgY2hhciAqZmlsZW5hbWUgPSB2YXJpYW50LT5maWxlX25hbWUgPyB2YXJpYW50LT5maWxlX25hbWUgOiAiIjsKLSAgICAgICAgYXBfYXJyYXlfaGVhZGVyX3QgKmxhbmd1YWdlcyA9IHZhcmlhbnQtPmNvbnRlbnRfbGFuZ3VhZ2VzOwotICAgICAgICBjaGFyICpkZXNjcmlwdGlvbiA9IHZhcmlhbnQtPmRlc2NyaXB0aW9uID8gdmFyaWFudC0+ZGVzY3JpcHRpb24gOiAiIjsKLQotICAgICAgICAvKiBUaGUgZm9ybWF0IGlzbid0IHZlcnkgbmVhdCwgYW5kIGl0IHdvdWxkIGJlIG5pY2UgdG8gbWFrZQotICAgICAgICAgKiB0aGUgdGFncyBodW1hbiByZWFkYWJsZSAoZWcgcmVwbGFjZSAnbGFuZ3VhZ2UgZW4nIHdpdGggJ0VuZ2xpc2gnKS4KLSAgICAgICAgICogTm90ZSB0aGF0IGlmIHlvdSBjaGFuZ2UgdGhlIG51bWJlciBvZiBzdWJzdHJpbmdzIHB1c2hlZCwgeW91IGFsc28KLSAgICAgICAgICogbmVlZCB0byBjaGFuZ2UgdGhlIGNhbGN1bGF0aW9uIG9mIG1heF92bGlzdF9hcnJheSBhYm92ZS4KLSAgICAgICAgICovCi0gICAgICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSAiPGxpPjxhIGhyZWY9XCIiOwotICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gZmlsZW5hbWU7Ci0gICAgICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSAiXCI+IjsKLSAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9IGZpbGVuYW1lOwotICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gIjwvYT4gIjsKLSAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9IGRlc2NyaXB0aW9uOwotCi0gICAgICAgIGlmICh2YXJpYW50LT5taW1lX3R5cGUgJiYgKnZhcmlhbnQtPm1pbWVfdHlwZSkgewotICAgICAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9ICIsIHR5cGUgIjsKLSAgICAgICAgICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSB2YXJpYW50LT5taW1lX3R5cGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxhbmd1YWdlcyAmJiBsYW5ndWFnZXMtPm5lbHRzKSB7Ci0gICAgICAgICAgICAqKChjb25zdCBjaGFyICoqKSBhcF9wdXNoX2FycmF5KGFycikpID0gIiwgbGFuZ3VhZ2UgIjsKLSAgICAgICAgICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSBhcF9hcnJheV9wc3RyY2F0KHItPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VzLCAnLCcpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YXJpYW50LT5jb250ZW50X2NoYXJzZXQgJiYgKnZhcmlhbnQtPmNvbnRlbnRfY2hhcnNldCkgewotICAgICAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9ICIsIGNoYXJzZXQgIjsKLSAgICAgICAgICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSB2YXJpYW50LT5jb250ZW50X2NoYXJzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhcmlhbnQtPmNvbnRlbnRfZW5jb2RpbmcpIHsKLSAgICAgICAgICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSAiLCBlbmNvZGluZyAiOwotICAgICAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9IHZhcmlhbnQtPmNvbnRlbnRfZW5jb2Rpbmc7Ci0gICAgICAgIH0KLSAgICAgICAgKigoY29uc3QgY2hhciAqKikgYXBfcHVzaF9hcnJheShhcnIpKSA9ICJcbiI7Ci0gICAgfQotICAgICooKGNvbnN0IGNoYXIgKiopIGFwX3B1c2hfYXJyYXkoYXJyKSkgPSAiPC91bD5cbiI7Ci0KLSAgICByZXR1cm4gYXBfYXJyYXlfcHN0cmNhdChyLT5wb29sLCBhcnIsICdcMCcpOwotfQotCi1zdGF0aWMgdm9pZCBzdG9yZV92YXJpYW50X2xpc3QocmVxdWVzdF9yZWMgKnIsIG5lZ290aWF0aW9uX3N0YXRlICpuZWcpCi17Ci0gICAgaWYgKHItPm1haW4gPT0gTlVMTCkgewotICAgICAgICBhcF90YWJsZV9zZXRuKHItPm5vdGVzLCAidmFyaWFudC1saXN0IiwgbWFrZV92YXJpYW50X2xpc3QociwgbmVnKSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBhcF90YWJsZV9zZXRuKHItPm1haW4tPm5vdGVzLCAidmFyaWFudC1saXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICBtYWtlX3ZhcmlhbnRfbGlzdChyLT5tYWluLCBuZWcpKTsKLSAgICB9Ci19Ci0KLS8qIENhbGxlZCBpZiB3ZSBnb3QgYSAiQ2hvaWNlIiByZXNwb25zZSBmcm9tIHRoZSB2YXJpYW50IHNlbGVjdGlvbiBhbGdvcml0aG0uCi0gKiBJdCBjaGVja3MgdGhlIHJlc3VsdCBvZiB0aGUgY2hvc2VuIHZhcmlhbnQgdG8gc2VlIGlmIGl0Ci0gKiBpcyBpdHNlbGYgbmVnb3RpYXRlZCAoaWYgc28sIHJldHVybiBlcnJvciBWQVJJQU5UX0FMU09fVkFSSUVTKS4KLSAqIE90aGVyd2lzZSwgYWRkIHRoZSBhcHByb3ByaWF0ZSBoZWFkZXJzIHRvIHRoZSBjdXJyZW50IHJlc3BvbnNlLgotICovCi0KLXN0YXRpYyBpbnQgc2V0dXBfY2hvaWNlX3Jlc3BvbnNlKHJlcXVlc3RfcmVjICpyLCBuZWdvdGlhdGlvbl9zdGF0ZSAqbmVnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX3JlYyAqdmFyaWFudCkKLXsKLSAgICByZXF1ZXN0X3JlYyAqc3ViX3JlcTsKLSAgICBjb25zdCBjaGFyICpzdWJfdmFyeTsKLQotICAgIGlmICghdmFyaWFudC0+c3ViX3JlcSkgewotICAgICAgICBpbnQgc3RhdHVzOwotCi0gICAgICAgIHN1Yl9yZXEgPSBhcF9zdWJfcmVxX2xvb2t1cF9maWxlKHZhcmlhbnQtPmZpbGVfbmFtZSwgcik7Ci0gICAgICAgIHN0YXR1cyA9IHN1Yl9yZXEtPnN0YXR1czsKLQotICAgICAgICBpZiAoc3RhdHVzICE9IEhUVFBfT0sgJiYgCi0gICAgICAgICAgICAhYXBfdGFibGVfZ2V0KHN1Yl9yZXEtPmVycl9oZWFkZXJzX291dCwgIlRDTiIpKSB7Ci0gICAgICAgICAgICBhcF9kZXN0cm95X3N1Yl9yZXEoc3ViX3JlcSk7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHZhcmlhbnQtPnN1Yl9yZXEgPSBzdWJfcmVxOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc3ViX3JlcSA9IHZhcmlhbnQtPnN1Yl9yZXE7Ci0gICAgfQotCi0gICAgLyogVGhlIHZhcmlhbnQgc2VsZWN0aW9uIGFsZ29yaXRobSB0b2xkIHVzIHRvIHJldHVybiBhICJDaG9pY2UiCi0gICAgICogcmVzcG9uc2UuIFRoaXMgaXMgdGhlIG5vcm1hbCB2YXJpYW50IHJlc3BvbnNlLCB3aXRoCi0gICAgICogc29tZSBleHRyYSBoZWFkZXJzLiBGaXJzdCwgZW5zdXJlIHRoYXQgdGhlIGNob3NlbgotICAgICAqIHZhcmlhbnQgZGlkIG9yIHdpbGwgbm90IGl0c2VsZiBlbmdhZ2UgaW4gdHJhbnNwYXJlbnQgbmVnb3RpYXRpb24uCi0gICAgICogSWYgbm90LCBzZXQgdGhlIGFwcHJvcHJpYXRlIGhlYWRlcnMsIGFuZCBmYWxsIHRocm91Z2ggdG8KLSAgICAgKiB0aGUgbm9ybWFsIHZhcmlhbnQgaGFuZGxpbmcgCi0gICAgICovCi0KLSAgICAvKiBUaGlzIGNhdGNoZXMgdGhlIGVycm9yIHRoYXQgYSB0cmFuc3BhcmVudCB0eXBlIG1hcCBzZWxlY3RzIGEKLSAgICAgKiB0cmFuc3BhcmVudCBtdWx0aXZpZXdzIHJlc291cmNlIGFzIHRoZSBiZXN0IHZhcmlhbnQuCi0gICAgICoKLSAgICAgKiBYWFg6IFdlIGRvIG5vdCBzaWduYWwgYW4gZXJyb3IgaWYgYSB0cmFuc3BhcmVudCB0eXBlIG1hcAotICAgICAqIHNlbGVjdHMgYSBfbm9uX3RyYW5zcGFyZW50IG11bHRpdmlld3MgcmVzb3VyY2UgYXMgdGhlIGJlc3QKLSAgICAgKiB2YXJpYW50LCBiZWNhdXNlIHdlIGNhbiBnZW5lcmF0ZSBhIGxlZ2FsIG5lZ290aWF0aW9uIHJlc3BvbnNlCi0gICAgICogaW4gdGhpcyBjYXNlLiAgSW4gdGhpcyBjYXNlLCB0aGUgdmxpc3RfdmFsaWRhdG9yIG9mIHRoZQotICAgICAqIG5vbnRyYW5zcGFyZW50IHN1YnJlcXVlc3Qgd2lsbCBiZSBsb3N0IGhvd2V2ZXIuICBUaGlzIGNvdWxkCi0gICAgICogbGVhZCB0byBjYXNlcyBpbiB3aGljaCBhIGNoYW5nZSBpbiB0aGUgc2V0IG9mIHZhcmlhbnRzIG9yIHRoZQotICAgICAqIG5lZ290aWF0aW9uIGFsZ29yaXRobSBvZiB0aGUgbm9udHJhbnNwYXJlbnQgcmVzb3VyY2UgaXMgbmV2ZXIKLSAgICAgKiBwcm9wYWdhdGVkIHVwIHRvIGEgSFRUUC8xLjEgY2FjaGUgd2hpY2ggaW50ZXJwcmV0cyBWYXJ5LiAgVG8gYmUKLSAgICAgKiBjb21wbGV0ZWx5IG9uIHRoZSBzYWZlIHNpZGUgd2Ugc2hvdWxkIHJldHVybiBWQVJJQU5UX0FMU09fVkFSSUVTCi0gICAgICogZm9yIHRoaXMgdHlwZSBvZiByZWN1cnNpdmUgbmVnb3RpYXRpb24gdG9vLgotICAgICAqLwotICAgIGlmIChuZWctPmlzX3RyYW5zcGFyZW50ICYmCi0gICAgICAgIGFwX3RhYmxlX2dldChzdWJfcmVxLT5lcnJfaGVhZGVyc19vdXQsICJUQ04iKSkgewotICAgICAgICByZXR1cm4gVkFSSUFOVF9BTFNPX1ZBUklFUzsKLSAgICB9Ci0KLSAgICAvKiBUaGlzIGNhdGNoZXMgdGhlIGVycm9yIHRoYXQgYSB0cmFuc3BhcmVudCB0eXBlIG1hcCByZWN1cnNpdmVseQotICAgICAqIHNlbGVjdHMsIGFzIHRoZSBiZXN0IHZhcmlhbnQsIGFub3RoZXIgdHlwZSBtYXAgd2hpY2ggaXRzZWxmCi0gICAgICogY2F1c2VzIHRyYW5zcGFyZW50IG5lZ290aWF0aW9uIHRvIGJlIGRvbmUuCi0gICAgICoKLSAgICAgKiBYWFg6IEFjdHVhbGx5LCB3ZSBjYXRjaCB0aGlzIGVycm9yIGJ5IGNhdGNoaW5nIGFsbCBjYXNlcyBvZgotICAgICAqIHR5cGUgbWFwIHJlY3Vyc2lvbi4gIFRoZXJlIGFyZSBzb21lIGJvcmRlcmxpbmUgcmVjdXJzaXZlIHR5cGUKLSAgICAgKiBtYXAgYXJyYW5nZW1lbnRzIHdoaWNoIHdvdWxkIG5vdCBwcm9kdWNlIHRyYW5zcGFyZW50Ci0gICAgICogbmVnb3RpYXRpb24gcHJvdG9jb2wgZXJyb3JzIG9yIGxhY2sgb2YgY2FjaGUgcHJvcGFnYXRpb24KLSAgICAgKiBwcm9ibGVtcywgYnV0IHN1Y2ggYXJyYW5nZW1lbnRzIGFyZSB2ZXJ5IGhhcmQgdG8gZGV0ZWN0IGF0IHRoaXMKLSAgICAgKiBwb2ludCBpbiB0aGUgY29udHJvbCBmbG93LCBzbyB3ZSBkbyBub3QgYm90aGVyIHRvIHNpbmdsZSB0aGVtCi0gICAgICogb3V0LgotICAgICAqCi0gICAgICogUmVjdXJzaXZlIHR5cGUgbWFwcyBpbXBseSBhIHJlY3Vyc2l2ZSBhcnJhbmdlbWVudCBvZiBuZWdvdGlhdGVkCi0gICAgICogcmVzb3VyY2VzIHdoaWNoIGlzIHZpc2libGUgdG8gb3V0c2lkZSBjbGllbnRzLCBhbmQgdGhpcyBpcyBub3QKLSAgICAgKiBzdXBwb3J0ZWQgYnkgdGhlIHRyYW5zcGFyZW50IG5lZ290aWF0aW9uIGNhY2hpbmcgcHJvdG9jb2xzLCBzbwotICAgICAqIGlmIHdlIGFyZSB0byBoYXZlIGdlbmVyaWMgc3VwcG9ydCBmb3IgcmVjdXJzaXZlIHR5cGUgbWFwcywgd2UKLSAgICAgKiBoYXZlIHRvIGNyZWF0ZSBzb21lIGNvbmZpZ3VyYXRpb24gc2V0dGluZyB3aGljaCBtYWtlcyBhbGwgdHlwZQotICAgICAqIG1hcHMgbm9uLXRyYW5zcGFyZW50IHdoZW4gcmVjdXJzaW9uIGlzIGVuYWJsZWQuICBBbHNvLCBpZiB3ZQotICAgICAqIHdhbnQgcmVjdXJzaXZlIHR5cGUgbWFwIHN1cHBvcnQgd2hpY2ggZW5zdXJlcyBwcm9wYWdhdGlvbiBvZgotICAgICAqIHR5cGUgbWFwIGNoYW5nZXMgaW50byBIVFRQLzEuMSBjYWNoZXMgdGhhdCBoYW5kbGUgVmFyeSwgd2UKLSAgICAgKiB3b3VsZCBoYXZlIHRvIGV4dGVuZCB0aGUgY3VycmVudCBtZWNoYW5pc20gZm9yIGdlbmVyYXRpbmcKLSAgICAgKiB2YXJpYW50IGxpc3QgdmFsaWRhdG9ycy4KLSAgICAgKi8KLSAgICBpZiAoc3ViX3JlcS0+aGFuZGxlciAmJiBzdHJjbXAoc3ViX3JlcS0+aGFuZGxlciwgInR5cGUtbWFwIikgPT0gMCkgewotICAgICAgICByZXR1cm4gVkFSSUFOVF9BTFNPX1ZBUklFUzsKLSAgICB9Ci0KLSAgICAvKiBUaGlzIGFkZHMgYW4gYXBwcm9wcmlhdGUgVmFyaWFudC1WYXJ5IGhlYWRlciBpZiB0aGUgc3VicmVxdWVzdAotICAgICAqIGlzIGEgbXVsdGl2aWV3cyByZXNvdXJjZS4KLSAgICAgKgotICAgICAqIFhYWDogVE9ETzogTm90ZSB0aGF0IHRoaXMgZG9lcyBfbm90XyBoYW5kbGUgYW55IFZhcnkgaGVhZGVyCi0gICAgICogcmV0dXJuZWQgYnkgYSBDR0kgaWYgc3ViX3JlcSBpcyBhIENHSSBzY3JpcHQsIGJlY2F1c2Ugd2UgZG9uJ3QKLSAgICAgKiBzZWUgdGhhdCBWYXJ5IGhlYWRlciB5ZXQgYXQgdGhpcyBwb2ludCBpbiB0aGUgY29udHJvbCBmbG93LgotICAgICAqIFRoaXMgd29uJ3QgY2F1c2UgYW55IGNhY2hlIGNvbnNpc3RlbmN5IHByb2JsZW1zIF91bmxlc3NfIHRoZQotICAgICAqIENHSSBzY3JpcHQgYWxzbyByZXR1cm5zIGEgQ2FjaGUtQ29udHJvbCBoZWFkZXIgbWFya2luZyB0aGUKLSAgICAgKiByZXNwb25zZSBhcyBjYWNoYWJsZS4gIFRoaXMgbmVlZHMgdG8gYmUgZml4ZWQsIGFsc28gdGhlcmUgYXJlCi0gICAgICogcHJvYmxlbXMgaWYgYSBDR0kgcmV0dXJucyBhbiBFdGFnIGhlYWRlciB3aGljaCBhbHNvIG5lZWQgdG8gYmUKLSAgICAgKiBmaXhlZC4KLSAgICAgKi8KLSAgICBpZiAoKHN1Yl92YXJ5ID0gYXBfdGFibGVfZ2V0KHN1Yl9yZXEtPmVycl9oZWFkZXJzX291dCwgIlZhcnkiKSkgIT0gTlVMTCkgewotICAgICAgICBhcF90YWJsZV9zZXRuKHItPmVycl9oZWFkZXJzX291dCwgIlZhcmlhbnQtVmFyeSIsIHN1Yl92YXJ5KTsKLQotICAgICAgICAvKiBNb3ZlIHRoZSBzdWJyZXEgVmFyeSBoZWFkZXIgaW50byB0aGUgbWFpbiByZXF1ZXN0IHRvCi0gICAgICAgICAqIHByZXZlbnQgaGF2aW5nIHR3byBWYXJ5IGhlYWRlcnMgaW4gdGhlIHJlc3BvbnNlLCB3aGljaAotICAgICAgICAgKiB3b3VsZCBiZSBsZWdhbCBidXQgc3RyYW5nZS4KLSAgICAgICAgICovCi0gICAgICAgIGFwX3RhYmxlX3NldG4oci0+ZXJyX2hlYWRlcnNfb3V0LCAiVmFyeSIsIHN1Yl92YXJ5KTsKLSAgICAgICAgYXBfdGFibGVfdW5zZXQoc3ViX3JlcS0+ZXJyX2hlYWRlcnNfb3V0LCAiVmFyeSIpOwotICAgIH0KLSAgICAKLSAgICBhcF90YWJsZV9zZXRuKHItPmVycl9oZWFkZXJzX291dCwgIkNvbnRlbnQtTG9jYXRpb24iLAotICAgICAgICAgICAgICAgICAgYXBfcHN0cmR1cChyLT5wb29sLCB2YXJpYW50LT5maWxlX25hbWUpKTsKLQotICAgIHNldF9uZWdfaGVhZGVycyhyLCBuZWcsIGFsZ19jaG9pY2UpOyAgICAgICAgIC8qIGFkZCBBbHRlcm5hdGVzIGFuZCBWYXJ5ICovCi0KLSAgICAvKiBTdGlsbCB0byBkbyBieSBjYWxsZXI6IGFkZCBFeHBpcmVzICovCi0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBFeGVjdXRpdmUuLi4KLSAqLwotCi1zdGF0aWMgaW50IGRvX25lZ290aWF0aW9uKHJlcXVlc3RfcmVjICpyLCBuZWdvdGlhdGlvbl9zdGF0ZSAqbmVnLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX3JlYyAqKmJlc3RwLCBpbnQgcHJlZmVyX3NjcmlwdHMpIAotewotICAgIHZhcl9yZWMgKmF2YWlsX3JlY3MgPSAodmFyX3JlYyAqKSBuZWctPmF2YWlsX3ZhcnMtPmVsdHM7Ci0gICAgaW50IGFsZ19yZXN1bHQ7ICAgICAgICAgICAgICAvKiByZXN1bHQgb2YgdmFyaWFudCBzZWxlY3Rpb24gYWxnb3JpdGhtICovCi0gICAgaW50IHJlczsKLSAgICBpbnQgajsKLQotICAgIC8qIERlY2lkZSBpZiByZXNvdXJjZSBpcyB0cmFuc3BhcmVudGx5IG5lZ290aWFibGUgKi8KLQotICAgIC8qIEdFVCBvciBIRUFEPyAoSEVBRCBoYXMgc2FtZSBtZXRob2QgbnVtYmVyIGFzIEdFVCkgKi8KLSAgICBpZiAoci0+bWV0aG9kX251bWJlciA9PSBNX0dFVCkgewotCi0gICAgICAgIC8qIG1heWJlIHRoaXMgc2hvdWxkIGJlIGNvbmZpZ3VyYWJsZSwgc2VlIGFsc28gdGhlIGNvbW1lbnQKLSAgICAgICAgICogYWJvdXQgcmVjdXJzaXZlIHR5cGUgbWFwcyBpbiBzZXR1cF9jaG9pY2VfcmVzcG9uc2UoKQotICAgICAgICAgKi8KLSAgICAgICAgbmVnLT5pc190cmFuc3BhcmVudCA9IDE7ICAgICAgIAotCi0gICAgICAgIC8qIFdlIGNhbid0IGJlIHRyYW5zcGFyZW50IGlmIHdlIGFyZSBhIG1hcCBmaWxlIGluIHRoZSBtaWRkbGUKLSAgICAgICAgICogb2YgdGhlIHJlcXVlc3QgVVJJLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHItPnBhdGhfaW5mbyAmJiAqci0+cGF0aF9pbmZvKQotICAgICAgICAgICAgbmVnLT5pc190cmFuc3BhcmVudCA9IDA7Ci0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IG5lZy0+YXZhaWxfdmFycy0+bmVsdHM7ICsraikgewotICAgICAgICAgICAgdmFyX3JlYyAqdmFyaWFudCA9ICZhdmFpbF9yZWNzW2pdOwotCi0gICAgICAgICAgICAvKiBXZSBjYW4ndCBiZSB0cmFuc3BhcmVudCwgYmVjYXVzZSBvZiBpbnRlcm5hbAotICAgICAgICAgICAgICogYXNzdW1wdGlvbnMgaW4gYmVzdF9tYXRjaCgpLCBpZiB0aGVyZSBpcyBhCi0gICAgICAgICAgICAgKiBub24tbmVpZ2hib3JpbmcgdmFyaWFudC4gIFdlIGNhbiBoYXZlIGEgbm9uLW5laWdoYm9yaW5nCi0gICAgICAgICAgICAgKiB2YXJpYW50IHdoZW4gcHJvY2Vzc2luZyBhIHR5cGUgbWFwLiAgCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChzdHJjaHIodmFyaWFudC0+ZmlsZV9uYW1lLCAnLycpKQotICAgICAgICAgICAgICAgIG5lZy0+aXNfdHJhbnNwYXJlbnQgPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5lZy0+aXNfdHJhbnNwYXJlbnQpICB7Ci0gICAgICAgIHBhcnNlX25lZ290aWF0ZV9oZWFkZXIociwgbmVnKTsKLSAgICB9Ci0gICAgZWxzZSB7IC8qIGNvbmZpZ3VyZSBuZWdvdGlhdGlvbiBvbiBub24tdHJhbnNwYXJlbnQgcmVzb3VyY2UgKi8KLSAgICAgICAgbmVnLT5tYXlfY2hvb3NlID0gMTsKLSAgICB9Ci0KLSAgICBtYXliZV9hZGRfZGVmYXVsdF9hY2NlcHRzKG5lZywgcHJlZmVyX3NjcmlwdHMpOwotCi0gICAgYWxnX3Jlc3VsdCA9IGJlc3RfbWF0Y2gobmVnLCBiZXN0cCk7Ci0KLSAgICAvKiBhbGdfcmVzdWx0IGlzIG9uZSBvZgotICAgICAqICAgYWxnX2Nob2ljZTogYSBiZXN0IHZhcmlhbnQgaXMgY2hvc2VuCi0gICAgICogICBhbGdfbGlzdDogbm8gYmVzdCB2YXJpYW50IGlzIGNob3NlbgotICAgICAqLwotCi0gICAgaWYgKGFsZ19yZXN1bHQgPT0gYWxnX2xpc3QpIHsKLSAgICAgICAgLyogc2VuZCBhIGxpc3QgcmVzcG9uc2Ugb3IgTk9UX0FDQ0VQVEFCTEUgZXJyb3IgcmVzcG9uc2UgICovCi0KLSAgICAgICAgbmVnLT5zZW5kX2FsdGVybmF0ZXMgPSAxOyAvKiBhbHdheXMgaW5jbHVkZSBBbHRlcm5hdGVzIGhlYWRlciAqLwotICAgICAgICBzZXRfbmVnX2hlYWRlcnMociwgbmVnLCBhbGdfcmVzdWx0KTsgCi0gICAgICAgIHN0b3JlX3ZhcmlhbnRfbGlzdChyLCBuZWcpOwotCi0gICAgICAgIGlmIChuZWctPmlzX3RyYW5zcGFyZW50ICYmIG5lZy0+dWFfc3VwcG9ydHNfdHJhbnMpIHsKLSAgICAgICAgICAgIC8qIFhYWCB0b2RvOiBleHBpcmVzPyBjYWNoYWJpbGl0eT8gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogU29tZSBIVFRQLzEuMCBjbGllbnRzIGFyZSBrbm93biB0byBjaG9rZSB3aGVuIHRoZXkgZ2V0Ci0gICAgICAgICAgICAgKiBhIDMwMCAobXVsdGlwbGUgY2hvaWNlcykgcmVzcG9uc2Ugd2l0aG91dCBhIExvY2F0aW9uCi0gICAgICAgICAgICAgKiBoZWFkZXIuICBIb3dldmVyIHRoZSAzMDAgY29kZSByZXNwb25zZSB3ZSBhcmUgYXJlIGFib3V0Ci0gICAgICAgICAgICAgKiB0byBnZW5lcmF0ZSB3aWxsIG9ubHkgcmVhY2ggMS4wIGNsaWVudHMgd2hpY2ggc3VwcG9ydAotICAgICAgICAgICAgICogdHJhbnNwYXJlbnQgbmVnb3RpYXRpb24sIGFuZCB0aGV5IHNob3VsZCBiZSBPSy4gVGhlCi0gICAgICAgICAgICAgKiByZXNwb25zZSBzaG91bGQgbmV2ZXIgcmVhY2ggb2xkZXIgMS4wIGNsaWVudHMsIGV2ZW4gaWYKLSAgICAgICAgICAgICAqIHdlIGhhdmUgQ2FjaGVOZWdvdGlhdGVkRG9jcyBlbmFibGVkLCBiZWNhdXNlIG5vIDEuMAotICAgICAgICAgICAgICogcHJveHkgY2FjaGUgKHdlIGtub3cgb2YpIHdpbGwgY2FjaGUgYW5kIHJldHVybiAzMDAKLSAgICAgICAgICAgICAqIHJlc3BvbnNlcyAodGhleSBjZXJ0YWlubHkgd29uJ3QgaWYgdGhleSBjb25mb3JtIHRvIHRoZQotICAgICAgICAgICAgICogSFRUUC8xLjAgc3BlY2lmaWNhdGlvbikuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHJldHVybiBNVUxUSVBMRV9DSE9JQ0VTOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoISpiZXN0cCkgewotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vIGFjY2VwdGFibGUgdmFyaWFudDogJXMiLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9UX0FDQ0VQVEFCTEU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBWYXJpYW50IHNlbGVjdGlvbiBjaG9zZSBhIHZhcmlhbnQgKi8KLQotICAgIC8qIFhYWCB0b2RvOiBtZXJnZSB0aGUgdHdvIGNhc2VzIGluIHRoZSBpZiBzdGF0ZW1lbnQgYmVsb3cgKi8KLSAgICBpZiAobmVnLT5pc190cmFuc3BhcmVudCkgewotCi0gICAgICAgIGlmICgocmVzID0gc2V0dXBfY2hvaWNlX3Jlc3BvbnNlKHIsIG5lZywgKmJlc3RwKSkgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIHJlczsgLyogcmV0dXJuIGlmIGVycm9yICovCi0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHNldF9uZWdfaGVhZGVycyhyLCBuZWcsIGFsZ19yZXN1bHQpOwotICAgIH0KLQotICAgIC8qIE1ha2Ugc3VyZSBjYWNoaW5nIHdvcmtzIC0gVmFyeSBzaG91bGQgaGFuZGxlIEhUVFAvMS4xLCBidXQgZm9yCi0gICAgICogSFRUUC8xLjAsIHdlIGNhbid0IGFsbG93IGNhY2hpbmcgYXQgYWxsLgotICAgICAqLwotCi0gICAgLyogWFhYOiBOb3RlIHRoYXQgd2Ugb25seSBzZXQgci0+bm9fY2FjaGUgdG8gMSwgd2hpY2ggY2F1c2VzCi0gICAgICogRXhwaXJlczogPG5vdz4gdG8gYmUgYWRkZWQsIHdoZW4gcmVzcG9uZGluZyB0byBhIEhUVFAvMS4wCi0gICAgICogY2xpZW50LiAgSWYgd2UgcmV0dXJuIHRoZSByZXNwb25zZSB0byBhIDEuMSBjbGllbnQsIHdlIGRvIG5vdAotICAgICAqIGFkZCBFeHBpcmVzIDxub3c+LCBiZWNhdXNlIGRvaW5nIHNvIHdvdWxkIGRlZ3JhZGUgMS4xIGNhY2hlCi0gICAgICogcGVyZm9ybWFuY2UgYnkgcHJldmVudGluZyByZS11c2Ugb2YgdGhlIHJlc3BvbnNlIHdpdGhvdXQgcHJpb3IKLSAgICAgKiByZXZhbGlkYXRpb24uICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlIDEuMSBjbGllbnQgaXMgYSBwcm94eQotICAgICAqIHdoaWNoIHdhcyBpdHNlbGYgY29udGFjdGVkIGJ5IGEgMS4wIGNsaWVudCwgb3IgYSBwcm94eSBjYWNoZQotICAgICAqIHdoaWNoIGNhbiBiZSBjb250YWN0ZWQgbGF0ZXIgYnkgMS4wIGNsaWVudHMsIHRoZW4gd2UgY3VycmVudGx5Ci0gICAgICogcmVseSBvbiB0aGlzIDEuMSBwcm94eSB0byBhZGQgdGhlIEV4cGlyZXM6IDxub3c+IHdoZW4gaXQKLSAgICAgKiBmb3J3YXJkcyB0aGUgcmVzcG9uc2UuCi0gICAgICoKLSAgICAgKiBYWFg6IFRPRE86IEZpbmQgb3V0IGlmIHRoZSAxLjEgc3BlYyByZXF1aXJlcyBwcm94aWVzIGFuZAotICAgICAqIHR1bm5lbHMgdG8gYWRkIEV4cGlyZXM6IDxub3c+IHdoZW4gZm9yd2FyZGluZyB0aGUgcmVzcG9uc2UgdG8KLSAgICAgKiAxLjAgY2xpZW50cy4gIEkgKGtoKSByZWNhbGwgaXQgaXMgcmF0aGVyIHZhZ3VlIG9uIHRoaXMgcG9pbnQuCi0gICAgICogVGVzdGluZyBhY3R1YWwgMS4xIHByb3h5IGltcGxlbWVudGF0aW9ucyB3b3VsZCBhbHNvIGJlIG5pY2UuIElmCi0gICAgICogRXhwaXJlczogPG5vdz4gaXMgbm90IGFkZGVkIGJ5IHByb3hpZXMgdGhlbiB3ZSBuZWVkIHRvIGFsd2F5cwotICAgICAqIGluY2x1ZGUgRXhwaXJlczogPG5vdz4gb3Vyc2VsdmVzIHRvIGVuc3VyZSBjb3JyZWN0IGNhY2hpbmcsIGJ1dAotICAgICAqIHRoaXMgd291bGQgZGVncmFkZSBIVFRQLzEuMSBjYWNoZSBlZmZpY2llbmN5IHVubGVzcyB3ZSBhbHNvIGFkZAotICAgICAqIENhY2hlLUNvbnRyb2w6IG1heC1hZ2U9Tiwgd2hpY2ggd2UgY3VycmVudGx5IGRvbid0LgotICAgICAqCi0gICAgICogUm95OiBObywgd2UgYXJlIG5vdCBnb2luZyB0byBzY3JldyBvdmVyIEhUVFAgZnV0dXJlIGp1c3QgdG8KLSAgICAgKiAgICAgIGVuc3VyZSB0aGF0IHBlb3BsZSB3aG8gY2FuJ3QgYmUgYm90aGVyZWQgdG8gdXBncmFkZSB0aGVpcgotICAgICAqICAgICAgY2xpZW50cyB3aWxsIGFsd2F5cyByZWNlaXZlIHBlcmZlY3Qgc2VydmVyLXNpZGUgbmVnb3RpYXRpb24uCi0gICAgICogICAgICBIZWxsLCB0aG9zZSBjbGllbnRzIGFyZSBzZW5kaW5nIGJvZ3VzIGFjY2VwdCBoZWFkZXJzIGFueXdheS4KLSAgICAgKgotICAgICAqICAgICAgTWFudWFsIHNldHRpbmcgb2YgY2FjaGUtY29udHJvbC9leHBpcmVzIGFsd2F5cyBvdmVycmlkZXMgdGhpcwotICAgICAqICAgICAgYXV0b21hdGVkIGtsdWdlLCBvbiBwdXJwb3NlLgotICAgICAqLwotICAgIAotICAgIGlmICgoIWRvX2NhY2hlX25lZ290aWF0ZWRfZG9jcyhyLT5zZXJ2ZXIpCi0gICAgICAgICAmJiAoci0+cHJvdG9fbnVtIDwgSFRUUF9WRVJTSU9OKDEsMSkpKSAgICAgICAgCi0gICAgICAgICAmJiBuZWctPmNvdW50X211bHRpdmlld3NfdmFyaWFudHMgIT0gMSkgewotICAgICAgICByLT5ub19jYWNoZSA9IDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgaW50IGhhbmRsZV9tYXBfZmlsZShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBuZWdvdGlhdGlvbl9zdGF0ZSAqbmVnID0gcGFyc2VfYWNjZXB0X2hlYWRlcnMocik7Ci0gICAgdmFyX3JlYyAqYmVzdDsKLSAgICBpbnQgcmVzOwotCi0gICAgY2hhciAqdWRpcjsKLQotICAgIGlmICgocmVzID0gcmVhZF90eXBlX21hcChuZWcsIHIpKSkgewotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIHJlcyA9IGRvX25lZ290aWF0aW9uKHIsIG5lZywgJmJlc3QsIDApOwotICAgIGlmIChyZXMgIT0gMCkgcmV0dXJuIHJlczsKLQotICAgIGlmIChyLT5wYXRoX2luZm8gJiYgKnItPnBhdGhfaW5mbykgewotICAgICAgICByLT51cmlbYXBfZmluZF9wYXRoX2luZm8oci0+dXJpLCByLT5wYXRoX2luZm8pXSA9ICdcMCc7Ci0gICAgfQotICAgIHVkaXIgPSBhcF9tYWtlX2RpcnN0cl9wYXJlbnQoci0+cG9vbCwgci0+dXJpKTsKLSAgICB1ZGlyID0gYXBfZXNjYXBlX3VyaShyLT5wb29sLCB1ZGlyKTsKLSAgICBhcF9pbnRlcm5hbF9yZWRpcmVjdChhcF9wc3RyY2F0KHItPnBvb2wsIHVkaXIsIGJlc3QtPmZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnBhdGhfaW5mbywgTlVMTCksIHIpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdGljIGludCBoYW5kbGVfbXVsdGkocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgbmVnb3RpYXRpb25fc3RhdGUgKm5lZzsKLSAgICB2YXJfcmVjICpiZXN0LCAqYXZhaWxfcmVjczsKLSAgICByZXF1ZXN0X3JlYyAqc3ViX3JlcTsKLSAgICBpbnQgcmVzOwotICAgIGludCBqOwotCi0gICAgaWYgKHItPmZpbmZvLnByb3RlY3Rpb24gIT0gMCB8fCAhKGFwX2FsbG93X29wdGlvbnMocikgJiBPUFRfTVVMVEkpKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICBuZWcgPSBwYXJzZV9hY2NlcHRfaGVhZGVycyhyKTsKLQotICAgIGlmICgocmVzID0gcmVhZF90eXBlc19tdWx0aShuZWcpKSkgewotICAgICAgcmV0dXJuX2Zyb21fbXVsdGk6Ci0gICAgICAgIC8qIGZyZWUgYWxsIGFsbG9jYXRlZCBtZW1vcnkgZnJvbSBzdWJyZXF1ZXN0cyAqLwotICAgICAgICBhdmFpbF9yZWNzID0gKHZhcl9yZWMgKikgbmVnLT5hdmFpbF92YXJzLT5lbHRzOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmVnLT5hdmFpbF92YXJzLT5uZWx0czsgKytqKSB7Ci0gICAgICAgICAgICB2YXJfcmVjICp2YXJpYW50ID0gJmF2YWlsX3JlY3Nbal07Ci0gICAgICAgICAgICBpZiAodmFyaWFudC0+c3ViX3JlcSkgewotICAgICAgICAgICAgICAgIGFwX2Rlc3Ryb3lfc3ViX3JlcSh2YXJpYW50LT5zdWJfcmVxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLSAgICBpZiAobmVnLT5hdmFpbF92YXJzLT5uZWx0cyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICByZXMgPSBkb19uZWdvdGlhdGlvbihyLCBuZWcsICZiZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIChyLT5tZXRob2RfbnVtYmVyICE9IE1fR0VUKSB8fCByLT5hcmdzIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKHItPnBhdGhfaW5mbyAmJiAqci0+cGF0aF9pbmZvKSk7Ci0gICAgaWYgKHJlcyAhPSAwKQotICAgICAgICBnb3RvIHJldHVybl9mcm9tX211bHRpOwotCi0gICAgaWYgKCEoc3ViX3JlcSA9IGJlc3QtPnN1Yl9yZXEpKSB7Ci0gICAgICAgIC8qIFdlIGdvdCB0aGlzIG91dCBvZiBhIG1hcCBmaWxlLCBzbyB3ZSBkb24ndCBhY3R1YWxseSBoYXZlCi0gICAgICAgICAqIGEgc3ViX3JlcSBzdHJ1Y3R1cmUgeWV0LiAgR2V0IG9uZSBub3cuCi0gICAgICAgICAqLwotCi0gICAgICAgIHN1Yl9yZXEgPSBhcF9zdWJfcmVxX2xvb2t1cF9maWxlKGJlc3QtPmZpbGVfbmFtZSwgcik7Ci0gICAgICAgIGlmIChzdWJfcmVxLT5zdGF0dXMgIT0gSFRUUF9PSykgewotICAgICAgICAgICAgcmVzID0gc3ViX3JlcS0+c3RhdHVzOwotICAgICAgICAgICAgYXBfZGVzdHJveV9zdWJfcmVxKHN1Yl9yZXEpOwotICAgICAgICAgICAgZ290byByZXR1cm5fZnJvbV9tdWx0aTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEJMRUNIIC0tLSBkb24ndCBtdWx0aS1yZXNvbHZlIG5vbi1vcmRpbmFyeSBmaWxlcyAqLwotCi0gICAgaWYgKHN1Yl9yZXEtPmZpbmZvLmZpbGV0eXBlICE9IEFQUl9SRUcpIHsKLSAgICAgICAgcmVzID0gTk9UX0ZPVU5EOwotICAgICAgICBnb3RvIHJldHVybl9mcm9tX211bHRpOwotICAgIH0KLQotICAgIC8qIE90aGVyd2lzZSwgdXNlIGl0LiAqLwotCi0gICAgLyogbm93IGRvIGEgImZhc3QgcmVkaXJlY3QiIC4uLiBwcm9tb3RlIHRoZSBzdWJfcmVxIGludG8gdGhlIG1haW4gcmVxICovCi0gICAgLyogV2UgbmVlZCB0byB0ZWxsIFBPT0xfREVCVUcgdGhhdCB3ZSdyZSBndWFyYW50ZWVpbmcgdGhhdCBzdWJfcmVxLT5wb29sCi0gICAgICogd2lsbCBleGlzdCBhcyBsb25nIGFzIHItPnBvb2wuICBPdGhlcndpc2Ugd2UgcnVuIGludG8gdHJvdWJsZXMgYmVjYXVzZQotICAgICAqIHNvbWUgdmFsdWVzIGluIHRoaXMgcmVxdWVzdCB3aWxsIGJlIGFsbG9jYXRlZCBpbiByLT5wb29sLCBhbmQgb3RoZXJzIGluCi0gICAgICogc3ViX3JlcS0+cG9vbC4KLSAgICAgKi8KLSAgICBhcF9wb29sX2pvaW4oci0+cG9vbCwgc3ViX3JlcS0+cG9vbCk7Ci0gICAgci0+bXRpbWUgPSAwOyAvKiByZXNldCBldGFnIGluZm8gZm9yIHN1YnJlcXVlc3QgKi8KLSAgICByLT5maWxlbmFtZSA9IHN1Yl9yZXEtPmZpbGVuYW1lOwotICAgIHItPmhhbmRsZXIgPSBzdWJfcmVxLT5oYW5kbGVyOwotICAgIHItPmNvbnRlbnRfdHlwZSA9IHN1Yl9yZXEtPmNvbnRlbnRfdHlwZTsKLSAgICByLT5jb250ZW50X2VuY29kaW5nID0gc3ViX3JlcS0+Y29udGVudF9lbmNvZGluZzsKLSAgICByLT5jb250ZW50X2xhbmd1YWdlcyA9IHN1Yl9yZXEtPmNvbnRlbnRfbGFuZ3VhZ2VzOwotICAgIHItPmNvbnRlbnRfbGFuZ3VhZ2UgPSBzdWJfcmVxLT5jb250ZW50X2xhbmd1YWdlOwotICAgIHItPmZpbmZvID0gc3ViX3JlcS0+ZmluZm87Ci0gICAgci0+cGVyX2Rpcl9jb25maWcgPSBzdWJfcmVxLT5wZXJfZGlyX2NvbmZpZzsKLSAgICAvKiBjb3B5IG91dHB1dCBoZWFkZXJzIGZyb20gc3VicmVxdWVzdCwgYnV0IGxlYXZlIG5lZ290aWF0aW9uIGhlYWRlcnMgKi8KLSAgICByLT5ub3RlcyA9IGFwX292ZXJsYXlfdGFibGVzKHItPnBvb2wsIHN1Yl9yZXEtPm5vdGVzLCByLT5ub3Rlcyk7Ci0gICAgci0+aGVhZGVyc19vdXQgPSBhcF9vdmVybGF5X3RhYmxlcyhyLT5wb29sLCBzdWJfcmVxLT5oZWFkZXJzX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPmhlYWRlcnNfb3V0KTsKLSAgICByLT5lcnJfaGVhZGVyc19vdXQgPSBhcF9vdmVybGF5X3RhYmxlcyhyLT5wb29sLCBzdWJfcmVxLT5lcnJfaGVhZGVyc19vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+ZXJyX2hlYWRlcnNfb3V0KTsKLSAgICByLT5zdWJwcm9jZXNzX2VudiA9IGFwX292ZXJsYXlfdGFibGVzKHItPnBvb2wsIHN1Yl9yZXEtPnN1YnByb2Nlc3NfZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+c3VicHJvY2Vzc19lbnYpOwotICAgIGF2YWlsX3JlY3MgPSAodmFyX3JlYyAqKSBuZWctPmF2YWlsX3ZhcnMtPmVsdHM7Ci0gICAgZm9yIChqID0gMDsgaiA8IG5lZy0+YXZhaWxfdmFycy0+bmVsdHM7ICsraikgewotICAgICAgICB2YXJfcmVjICp2YXJpYW50ID0gJmF2YWlsX3JlY3Nbal07Ci0gICAgICAgIGlmICh2YXJpYW50ICE9IGJlc3QgJiYgdmFyaWFudC0+c3ViX3JlcSkgewotICAgICAgICAgICAgYXBfZGVzdHJveV9zdWJfcmVxKHZhcmlhbnQtPnN1Yl9yZXEpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0gKiBUaGVyZSBpcyBhIHByb2JsZW0gd2l0aCBjb250ZW50LWVuY29kaW5nLCBhcyBzb21lIGNsaWVudHMgc2VuZCBhbmQKLSAqIGV4cGVjdCBhbiB4LSB0b2tlbiAoZS5nLiB4LWd6aXApIHdoaWxlIG90aGVycyBleHBlY3QgdGhlIHBsYWluIHRva2VuCi0gKiAoaS5lLiBnemlwKS4gVG8gdHJ5IGFuZCBkZWFsIHdpdGggdGhpcyBhcyBiZXN0IGFzIHBvc3NpYmxlIHdlIGRvCi0gKiB0aGUgZm9sbG93aW5nOiBpZiB0aGUgY2xpZW50IHNlbnQgYW4gQWNjZXB0LUVuY29kaW5nIGhlYWRlciBhbmQgaXQKLSAqIGNvbnRhaW5zIGEgcGxhaW4gdG9rZW4gY29ycmVzcG9uZGluZyB0byB0aGUgY29udGVudCBlbmNvZGluZyBvZiB0aGUKLSAqIHJlc3BvbnNlLCB0aGVuIHNldCBjb250ZW50IGVuY29kaW5nIHVzaW5nIHRoZSBwbGFpbiB0b2tlbi4gRWxzZSBpZgotICogdGhlIEEtRSBoZWFkZXIgY29udGFpbnMgdGhlIHgtIHRva2VuIHVzZSB0aGUgeC0gdG9rZW4gaW4gdGhlIEMtRQotICogaGVhZGVyLiBFbHNlIGRvbid0IGRvIGFueXRoaW5nLgotICoKLSAqIE5vdGUgdGhhdCBpZiBubyBBLUUgaGVhZGVyIHdhcyBzZW50LCBvciBpdCBkb2VzIG5vdCBjb250YWluIGEgdG9rZW4KLSAqIGNvbXBhdGlibGUgd2l0aCB0aGUgZmluYWwgY29udGVudCBlbmNvZGluZywgdGhlbiB0aGUgdG9rZW4gaW4gdGhlCi0gKiBDLUUgaGVhZGVyIHdpbGwgYmUgd2hhdGV2ZXIgd2FzIHNwZWNpZmllZCBpbiB0aGUgQWRkRW5jb2RpbmcKLSAqIGRpcmVjdGl2ZS4KLSAqLwotc3RhdGljIGludCBmaXhfZW5jb2RpbmcocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY29uc3QgY2hhciAqZW5jID0gci0+Y29udGVudF9lbmNvZGluZzsKLSAgICBjaGFyICp4X2VuYyA9IE5VTEw7Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmFjY2VwdF9lbmNvZGluZ3M7Ci0gICAgYWNjZXB0X3JlYyAqYWNjZXB0X3JlY3M7Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoIWVuYyB8fCAhKmVuYykgewotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgaWYgKGVuY1swXSA9PSAneCcgJiYgZW5jWzFdID09ICctJykgewotICAgICAgICBlbmMgKz0gMjsKLSAgICB9Ci0KLSAgICBpZiAoKGFjY2VwdF9lbmNvZGluZ3MgPSBkb19oZWFkZXJfbGluZShyLT5wb29sLAotICAgICAgICAgICAgIGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiQWNjZXB0LUVuY29kaW5nIikpKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICBhY2NlcHRfcmVjcyA9IChhY2NlcHRfcmVjICopIGFjY2VwdF9lbmNvZGluZ3MtPmVsdHM7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgYWNjZXB0X2VuY29kaW5ncy0+bmVsdHM7ICsraSkgewotICAgICAgICBjaGFyICpuYW1lID0gYWNjZXB0X3JlY3NbaV0ubmFtZTsKLQotICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCBlbmMpKSB7Ci0gICAgICAgICAgICByLT5jb250ZW50X2VuY29kaW5nID0gbmFtZTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuYW1lWzBdID09ICd4JyAmJiBuYW1lWzFdID09ICctJyAmJiAhc3RyY21wKG5hbWUrMiwgZW5jKSkgewotICAgICAgICAgICAgeF9lbmMgPSBuYW1lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHhfZW5jKSB7Ci0gICAgICAgIHItPmNvbnRlbnRfZW5jb2RpbmcgPSB4X2VuYzsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLQotc3RhdGljIGNvbnN0IGhhbmRsZXJfcmVjIG5lZ290aWF0aW9uX2hhbmRsZXJzW10gPQotewotICAgIHtNQVBfRklMRV9NQUdJQ19UWVBFLCBoYW5kbGVfbWFwX2ZpbGV9LAotICAgIHsidHlwZS1tYXAiLCBoYW5kbGVfbWFwX2ZpbGV9LAotICAgIHtOVUxMfQotfTsKLQotc3RhdGljIHZvaWQgcmVnaXN0ZXJfaG9va3Modm9pZCkKLXsKLSAgICBhcF9ob29rX2ZpeHVwcyhmaXhfZW5jb2RpbmcsTlVMTCxOVUxMLEhPT0tfTUlERExFKTsKLSAgICBhcF9ob29rX3R5cGVfY2hlY2tlcihoYW5kbGVfbXVsdGksTlVMTCxOVUxMLEhPT0tfTUlERExFKTsKLX0KLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIG5lZ290aWF0aW9uX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCi0gICAgY3JlYXRlX25lZ19kaXJfY29uZmlnLCAgICAgIC8qIGRpciBjb25maWcgY3JlYXRvciAqLwotICAgIG1lcmdlX25lZ19kaXJfY29uZmlncywgICAgICAvKiBkaXIgbWVyZ2VyIC0tLSBkZWZhdWx0IGlzIHRvIG92ZXJyaWRlICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlcnZlciBjb25maWcgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLwotICAgIG5lZ290aWF0aW9uX2NtZHMsICAgICAgICAgICAvKiBjb21tYW5kIGFwX3RhYmxlX3QgKi8KLSAgICBuZWdvdGlhdGlvbl9oYW5kbGVycywgICAgICAgLyogaGFuZGxlcnMgKi8KLSAgICByZWdpc3Rlcl9ob29rcyAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgaG9va3MgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvbW9kX25lZ290aWF0aW9uLmV4cCBiL21vZHVsZXMvbWFwcGVycy9tb2RfbmVnb3RpYXRpb24uZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2MxOGRhLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWFwcGVycy9tb2RfbmVnb3RpYXRpb24uZXhwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotbmVnb3RpYXRpb25fbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvbW9kX3Jld3JpdGUuYyBiL21vZHVsZXMvbWFwcGVycy9tb2RfcmV3cml0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGVmNDU4Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWFwcGVycy9tb2RfcmV3cml0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMxOCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotCi0vKiAgICAgICAgICAgICAgICAgICAgICAgXyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfIF8KLSoqICAgXyBfXyBfX18gICBfX18gICBfX3wgfCAgICBfIF9fIF9fX19fICAgICAgX19fIF9fKF8pIHxfIF9fXwotKiogIHwgJ18gYCBfIFwgLyBfIFwgLyBfYCB8ICAgfCAnX18vIF8gXCBcIC9cIC8gLyAnX198IHwgX18vIF8gXAotKiogIHwgfCB8IHwgfCB8IChfKSB8IChffCB8ICAgfCB8IHwgIF9fL1wgViAgViAvfCB8ICB8IHwgfHwgIF9fLwotKiogIHxffCB8X3wgfF98XF9fXy8gXF9fLF98X19ffF98ICBcX19ffCBcXy9cXy8gfF98ICB8X3xcX19cX19ffAotKiogICAgICAgICAgICAgICAgICAgICAgIHxfX19fX3wKLSoqCi0qKiAgVVJMIFJld3JpdGluZyBNb2R1bGUKLSoqCi0qKiAgVGhpcyBtb2R1bGUgdXNlcyBhIHJ1bGUtYmFzZWQgcmV3cml0aW5nIGVuZ2luZSAoYmFzZWQgb24gYQotKiogIHJlZ3VsYXItZXhwcmVzc2lvbiBwYXJzZXIpIHRvIHJld3JpdGUgcmVxdWVzdGVkIFVSTHMgb24gdGhlIGZseS4KLSoqCi0qKiAgSXQgc3VwcG9ydHMgYW4gdW5saW1pdGVkIG51bWJlciBvZiBhZGRpdGlvbmFsIHJ1bGUgY29uZGl0aW9ucyAod2hpY2ggY2FuCi0qKiAgb3BlcmF0ZSBvbiBhIGxvdCBvZiB2YXJpYWJsZXMsIGV2ZW4gb24gSFRUUCBoZWFkZXJzKSBmb3IgZ3JhbnVsYXIKLSoqICBtYXRjaGluZyBhbmQgZXZlbiBleHRlcm5hbCBkYXRhYmFzZSBsb29rdXBzIChlaXRoZXIgdmlhIHBsYWluIHRleHQKLSoqICB0YWJsZXMsIERCTSBoYXNoIGZpbGVzIG9yIGV2ZW4gZXh0ZXJuYWwgcHJvY2Vzc2VzKSBmb3IgYWR2YW5jZWQgVVJMCi0qKiAgc3Vic3RpdHV0aW9uLgotKioKLSoqICBJdCBvcGVyYXRlcyBvbiB0aGUgZnVsbCBVUkxzIChpbmNsdWRpbmcgdGhlIFBBVEhfSU5GTyBwYXJ0KSBib3RoIGluCi0qKiAgcGVyLXNlcnZlciBjb250ZXh0IChodHRwZC5jb25mKSBhbmQgcGVyLWRpciBjb250ZXh0ICguaHRhY2Nlc3MpIGFuZCBldmVuCi0qKiAgY2FuIGdlbmVyYXRlIFFVRVJZX1NUUklORyBwYXJ0cyBvbiByZXN1bHQuICAgVGhlIHJld3JpdGluZyByZXN1bHQgZmluYWxseQotKiogIGNhbiBsZWFkIHRvIGludGVybmFsIHN1YnByb2Nlc3NpbmcsIGV4dGVybmFsIHJlcXVlc3QgcmVkaXJlY3Rpb24gb3IgZXZlbgotKiogIHRvIGludGVybmFsIHByb3h5IHRocm91Z2hwdXQuCi0qKgotKiogIFRoaXMgbW9kdWxlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gaW4gQXByaWwgMTk5NiBhbmQKLSoqICBnaWZ0ZWQgZXhjbHVzaXZlbHkgdG8gdGhlIFRoZSBBcGFjaGUgR3JvdXAgaW4gSnVseSAxOTk3IGJ5Ci0qKgotKiogICAgICBSYWxmIFMuIEVuZ2Vsc2NoYWxsCi0qKiAgICAgIHJzZUBlbmdlbHNjaGFsbC5jb20KLSoqICAgICAgd3d3LmVuZ2Vsc2NoYWxsLmNvbQotKi8KLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJtb2RfcmV3cml0ZS5oIgotCi0jaWYgIWRlZmluZWQoT1MyKSAmJiAhZGVmaW5lZChXSU4zMikKLSNpbmNsdWRlICJ1bml4ZC5oIgotI2VuZGlmCi0KLSNpZm5kZWYgTk9fV1JJVEVWCi0jaWZuZGVmIE5FVFdBUkUKLSNpZmRlZiBIQVZFX1NZU19UWVBFU19ICi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1lTX1VJT19ICi0jaW5jbHVkZSA8c3lzL3Vpby5oPgotI2VuZGlmCi0jZW5kaWYKLQotLyoKLSoqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKiogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qKiB8ICAgICAgICAgICAgIHN0YXRpYyBtb2R1bGUgY29uZmlndXJhdGlvbgotKiogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi0KLQotLyoKLSoqICBPdXIgaW50ZXJmYWNlIHRvIHRoZSBBcGFjaGUgc2VydmVyIGtlcm5lbDoKLSoqCi0qKiAgbyAgUnVudGltZSBsb2dpYyBvZiBhIHJlcXVlc3QgaXMgYXMgZm9sbG93aW5nOgotKiogICAgICAgd2hpbGUocmVxdWVzdCBvciBzdWJyZXF1ZXN0KQotKiogICAgICAgICAgIGZvcmVhY2goc3RhZ2UgIzAuLi4jOSkKLSoqICAgICAgICAgICAgICAgZm9yZWFjaChtb2R1bGUpICgqKikKLSoqICAgICAgICAgICAgICAgICAgIHRyeSB0byBydW4gaG9vawotKioKLSoqICBvICB0aGUgb3JkZXIgb2YgbW9kdWxlcyBhdCAoKiopIGlzIHRoZSBpbnZlcnRlZCBvcmRlciBhcwotKiogICAgIGdpdmVuIGluIHRoZSAiQ29uZmlndXJhdGlvbiIgZmlsZSwgaS5lLiB0aGUgbGFzdCBtb2R1bGUKLSoqICAgICBzcGVjaWZpZWQgaXMgdGhlIGZpcnN0IG9uZSBjYWxsZWQgZm9yIGVhY2ggaG9vayEKLSoqICAgICBUaGUgY29yZSBtb2R1bGUgaXMgYWx3YXlzIHRoZSBsYXN0IQotKioKLSoqICBvICB0aGVyZSBhcmUgdHdvIGRpZmZlcmVudCB0eXBlcyBvZiByZXN1bHQgY2hlY2tpbmcgYW5kCi0qKiAgICAgY29udGludWUgcHJvY2Vzc2luZzoKLSoqICAgICBmb3IgaG9vayAjMCwjMSwjNCwjNSwjNiwjODoKLSoqICAgICAgICAgaG9vayBydW4gbG9vcCBzdG9wcyBvbiBmaXJzdCBtb2R1bGVzIHdoaWNoIGdpdmVzCi0qKiAgICAgICAgIGJhY2sgYSByZXN1bHQgIT0gREVDTElORUQsIGkuZS4gaXQgdXN1YWxseSByZXR1cm5zIE9LCi0qKiAgICAgICAgIHdoaWNoIHNheXMgIk9LLCBtb2R1bGUgaGFzIGhhbmRsZWQgdGhpcyBfc3RhZ2VfIiBhbmQgZm9yICMxCi0qKiAgICAgICAgIHRoaXMgaGF2ZSBub3QgdG8gbWVhbiAiT2ssIHRoZSBmaWxlbmFtZSBpcyBub3cgdmFsaWQiLgotKiogICAgIGZvciBob29rICMyLCMzLCM3LCM5OgotKiogICAgICAgICBhbGwgaG9va3MgYXJlIHJ1biwgaW5kZXBlbmRlbmQgb2YgcmVzdWx0Ci0qKgotKiogIG8gIGF0IHRoZSBsYXN0IHN0YWdlLCB0aGUgY29yZSBtb2R1bGUgYWx3YXlzCi0qKiAgICAgICAtIHNheXMgIkJBRF9SRVFVRVNUIiBpZiByLT5maWxlbmFtZSBkb2VzIG5vdCBiZWdpbiB3aXRoICIvIgotKiogICAgICAgLSBwcmVmaXggVVJMIHdpdGggZG9jdW1lbnRfcm9vdCBvciByZXBsYWNlZCBzZXJ2ZXJfcm9vdAotKiogICAgICAgICB3aXRoIGRvY3VtZW50X3Jvb3QgYW5kIHNldHMgci0+ZmlsZW5hbWUKLSoqICAgICAgIC0gYWx3YXlzIHJldHVybiBhICJPSyIgaW5kZXBlbmRlZCBpZiB0aGUgZmlsZSByZWFsbHkgZXhpc3RzCi0qKiAgICAgICAgIG9yIG5vdCEKLSovCi0KLSAgICAvKiBUaGUgc2VjdGlvbiBmb3IgdGhlIENvbmZpZ3VyZSBzY3JpcHQ6Ci0gICAgICogTU9EVUxFLURFRklOSVRJT04tU1RBUlQKLSAgICAgKiBOYW1lOiByZXdyaXRlX21vZHVsZQotICAgICAqIENvbmZpZ1N0YXJ0Ci0gICAgLiAuL2hlbHBlcnMvZmluZC1kYm0tbGliCi0gICAgaWYgWyAieCRmb3VuZF9kYm0iID0gIngxIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gIiAgICAgIGVuYWJsaW5nIERCTSBzdXBwb3J0IGZvciBtb2RfcmV3cml0ZSIKLSAgICBlbHNlCi0gICAgICAgIGVjaG8gIiAgICAgIGRpc2FibGluZyBEQk0gc3VwcG9ydCBmb3IgbW9kX3Jld3JpdGUiCi0gICAgICAgIGVjaG8gIiAgICAgIChwZXJoYXBzIHlvdSBuZWVkIHRvIGFkZCAtbGRibSwgLWxuZGJtIG9yIC1sZ2RibSB0byBFWFRSQV9MSUJTKSIKLSAgICAgICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1ETk9fREJNX1JFV1JJVEVNQVAiCi0gICAgZmkKLSAgICAgKiBDb25maWdFbmQKLSAgICAgKiBNT0RVTEUtREVGSU5JVElPTi1FTkQKLSAgICAgKi8KLQotICAgIC8qIHRoZSBhcF90YWJsZV90IG9mIGNvbW1hbmRzIHdlIHByb3ZpZGUgKi8KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBjb21tYW5kX3RhYmxlW10gPSB7Ci0gICAgeyAiUmV3cml0ZUVuZ2luZSIsICAgY21kX3Jld3JpdGVlbmdpbmUsICAgTlVMTCwgT1JfRklMRUlORk8sIEZMQUcsCi0gICAgICAiT24gb3IgT2ZmIHRvIGVuYWJsZSBvciBkaXNhYmxlIChkZWZhdWx0KSB0aGUgd2hvbGUgcmV3cml0aW5nIGVuZ2luZSIgfSwKLSAgICB7ICJSZXdyaXRlT3B0aW9ucyIsICBjbWRfcmV3cml0ZW9wdGlvbnMsICBOVUxMLCBPUl9GSUxFSU5GTywgSVRFUkFURSwKLSAgICAgICJMaXN0IG9mIG9wdGlvbiBzdHJpbmdzIHRvIHNldCIgfSwKLSAgICB7ICJSZXdyaXRlQmFzZSIsICAgICBjbWRfcmV3cml0ZWJhc2UsICAgICBOVUxMLCBPUl9GSUxFSU5GTywgVEFLRTEsCi0gICAgICAidGhlIGJhc2UgVVJMIG9mIHRoZSBwZXItZGlyZWN0b3J5IGNvbnRleHQiIH0sCi0gICAgeyAiUmV3cml0ZUNvbmQiLCAgICAgY21kX3Jld3JpdGVjb25kLCAgICAgTlVMTCwgT1JfRklMRUlORk8sIFJBV19BUkdTLAotICAgICAgImFuIGlucHV0IHN0cmluZyBhbmQgYSB0byBiZSBhcHBsaWVkIHJlZ2V4cC1wYXR0ZXJuIiB9LAotICAgIHsgIlJld3JpdGVSdWxlIiwgICAgIGNtZF9yZXdyaXRlcnVsZSwgICAgIE5VTEwsIE9SX0ZJTEVJTkZPLCBSQVdfQVJHUywKLSAgICAgICJhbiBVUkwtYXBwbGllZCByZWdleHAtcGF0dGVybiBhbmQgYSBzdWJzdGl0dXRpb24gVVJMIiB9LAotICAgIHsgIlJld3JpdGVNYXAiLCAgICAgIGNtZF9yZXdyaXRlbWFwLCAgICAgIE5VTEwsIFJTUkNfQ09ORiwgICBUQUtFMiwKLSAgICAgICJhIG1hcG5hbWUgYW5kIGEgZmlsZW5hbWUiIH0sCi0gICAgeyAiUmV3cml0ZUxvY2siLCAgICAgY21kX3Jld3JpdGVsb2NrLCAgICAgTlVMTCwgUlNSQ19DT05GLCAgIFRBS0UxLAotICAgICAgInRoZSBmaWxlbmFtZSBvZiBhIGxvY2tmaWxlIHVzZWQgZm9yIGludGVyLXByb2Nlc3Mgc3luY2hyb25pemF0aW9uIn0sCi0gICAgeyAiUmV3cml0ZUxvZyIsICAgICAgY21kX3Jld3JpdGVsb2csICAgICAgTlVMTCwgUlNSQ19DT05GLCAgIFRBS0UxLAotICAgICAgInRoZSBmaWxlbmFtZSBvZiB0aGUgcmV3cml0aW5nIGxvZ2ZpbGUiIH0sCi0gICAgeyAiUmV3cml0ZUxvZ0xldmVsIiwgY21kX3Jld3JpdGVsb2dsZXZlbCwgTlVMTCwgUlNSQ19DT05GLCAgIFRBS0UxLAotICAgICAgInRoZSBsZXZlbCBvZiB0aGUgcmV3cml0aW5nIGxvZ2ZpbGUgdmVyYm9zaXR5ICIKLSAgICAgICIoMD1ub25lLCAxPXN0ZCwgLi4sIDk9bWF4KSIgfSwKLSAgICB7IE5VTEwgfQotfTsKLQotICAgIC8qIHRoZSBhcF90YWJsZV90IG9mIGNvbnRlbnQgaGFuZGxlcnMgd2UgcHJvdmlkZSAqLwotc3RhdGljIGNvbnN0IGhhbmRsZXJfcmVjIGhhbmRsZXJfdGFibGVbXSA9IHsKLSAgICB7ICJyZWRpcmVjdC1oYW5kbGVyIiwgaGFuZGxlcl9yZWRpcmVjdCB9LAotICAgIHsgTlVMTCB9Ci19OwotCi1zdGF0aWMgdm9pZCByZWdpc3Rlcl9ob29rcyh2b2lkKQotewotICAgIGFwX2hvb2tfcG9zdF9jb25maWcoaW5pdF9tb2R1bGUsTlVMTCxOVUxMLEhPT0tfTUlERExFKTsKLSAgICBhcF9ob29rX2NoaWxkX2luaXQoaW5pdF9jaGlsZCxOVUxMLE5VTEwsSE9PS19NSURETEUpOwotCi0gICAgYXBfaG9va19maXh1cHMoaG9va19maXh1cCxOVUxMLE5VTEwsSE9PS19GSVJTVCk7Ci0gICAgYXBfaG9va190cmFuc2xhdGVfbmFtZShob29rX3VyaTJmaWxlLE5VTEwsTlVMTCxIT09LX0ZJUlNUKTsKLSAgICBhcF9ob29rX3R5cGVfY2hlY2tlcihob29rX21pbWV0eXBlLE5VTEwsTlVMTCxIT09LX01JRERMRSk7Ci19Ci0KLSAgICAvKiB0aGUgbWFpbiBjb25maWcgc3RydWN0dXJlICovCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgcmV3cml0ZV9tb2R1bGUgPSB7Ci0gICBTVEFOREFSRDIwX01PRFVMRV9TVFVGRiwKLSAgIGNvbmZpZ19wZXJkaXJfY3JlYXRlLCAgICAgICAgLyogY3JlYXRlIHBlci1kaXIgICAgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgIGNvbmZpZ19wZXJkaXJfbWVyZ2UsICAgICAgICAgLyogbWVyZ2UgIHBlci1kaXIgICAgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgIGNvbmZpZ19zZXJ2ZXJfY3JlYXRlLCAgICAgICAgLyogY3JlYXRlIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgIGNvbmZpZ19zZXJ2ZXJfbWVyZ2UsICAgICAgICAgLyogbWVyZ2UgIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgIGNvbW1hbmRfdGFibGUsICAgICAgICAgICAgICAgLyogYXBfdGFibGVfdCBvZiBjb25maWcgZmlsZSBjb21tYW5kcyAgKi8KLSAgIGhhbmRsZXJfdGFibGUsICAgICAgICAgICAgICAgLyogWyM4XSBNSU1FLXR5cGVkLWRpc3BhdGNoZWQgaGFuZGxlcnMgKi8KLSAgIHJlZ2lzdGVyX2hvb2tzICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgaG9va3MgICAgICAgICAgICAgICAgICAgICAgKi8KLX07Ci0KLSAgICAvKiB0aGUgY2FjaGUgKi8KLXN0YXRpYyBjYWNoZSAqY2FjaGVwOwotCi0gICAgLyogd2hldGhlciBwcm94eSBtb2R1bGUgaXMgYXZhaWxhYmxlIG9yIG5vdCAqLwotc3RhdGljIGludCBwcm94eV9hdmFpbGFibGU7Ci1zdGF0aWMgaW50IG9uY2VfdGhyb3VnaCA9IDA7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpsb2NrbmFtZTsKLXN0YXRpYyBhcF9maWxlX3QgKmxvY2tmZCA9IE5VTEw7Ci0KLS8qCi0qKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSoqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiogfCAgICAgICAgICAgY29uZmlndXJhdGlvbiBkaXJlY3RpdmUgaGFuZGxpbmcKLSoqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotCi0vKgotKioKLSoqICBwZXItc2VydmVyIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGhhbmRsaW5nCi0qKgotKi8KLQotc3RhdGljIHZvaWQgKmNvbmZpZ19zZXJ2ZXJfY3JlYXRlKGFwX2NvbnRleHRfdCAqcCwgc2VydmVyX3JlYyAqcykKLXsKLSAgICByZXdyaXRlX3NlcnZlcl9jb25mICphOwotCi0gICAgYSA9IChyZXdyaXRlX3NlcnZlcl9jb25mICopYXBfcGNhbGxvYyhwLCBzaXplb2YocmV3cml0ZV9zZXJ2ZXJfY29uZikpOwotCi0gICAgYS0+c3RhdGUgICAgICAgICAgID0gRU5HSU5FX0RJU0FCTEVEOwotICAgIGEtPm9wdGlvbnMgICAgICAgICA9IE9QVElPTl9OT05FOwotICAgIGEtPnJld3JpdGVsb2dmaWxlICA9IE5VTEw7Ci0gICAgYS0+cmV3cml0ZWxvZ2ZwICAgID0gTlVMTDsKLSAgICBhLT5yZXdyaXRlbG9nbGV2ZWwgPSAwOwotICAgIGEtPnJld3JpdGVtYXBzICAgICA9IGFwX21ha2VfYXJyYXkocCwgMiwgc2l6ZW9mKHJld3JpdGVtYXBfZW50cnkpKTsKLSAgICBhLT5yZXdyaXRlY29uZHMgICAgPSBhcF9tYWtlX2FycmF5KHAsIDIsIHNpemVvZihyZXdyaXRlY29uZF9lbnRyeSkpOwotICAgIGEtPnJld3JpdGVydWxlcyAgICA9IGFwX21ha2VfYXJyYXkocCwgMiwgc2l6ZW9mKHJld3JpdGVydWxlX2VudHJ5KSk7Ci0gICAgYS0+c2VydmVyICAgICAgICAgID0gczsKLQotICAgIHJldHVybiAodm9pZCAqKWE7Ci19Ci0KLXN0YXRpYyB2b2lkICpjb25maWdfc2VydmVyX21lcmdlKGFwX2NvbnRleHRfdCAqcCwgdm9pZCAqYmFzZXYsIHZvaWQgKm92ZXJyaWRlc3YpCi17Ci0gICAgcmV3cml0ZV9zZXJ2ZXJfY29uZiAqYSwgKmJhc2UsICpvdmVycmlkZXM7Ci0KLSAgICBhICAgICAgICAgPSAocmV3cml0ZV9zZXJ2ZXJfY29uZiAqKWFwX3BjYWxsb2MocCwgc2l6ZW9mKHJld3JpdGVfc2VydmVyX2NvbmYpKTsKLSAgICBiYXNlICAgICAgPSAocmV3cml0ZV9zZXJ2ZXJfY29uZiAqKWJhc2V2OwotICAgIG92ZXJyaWRlcyA9IChyZXdyaXRlX3NlcnZlcl9jb25mICopb3ZlcnJpZGVzdjsKLQotICAgIGEtPnN0YXRlICAgPSBvdmVycmlkZXMtPnN0YXRlOwotICAgIGEtPm9wdGlvbnMgPSBvdmVycmlkZXMtPm9wdGlvbnM7Ci0gICAgYS0+c2VydmVyICA9IG92ZXJyaWRlcy0+c2VydmVyOwotCi0gICAgaWYgKGEtPm9wdGlvbnMgJiBPUFRJT05fSU5IRVJJVCkgewotICAgICAgICAvKgotICAgICAgICAgKiAgbG9jYWwgZGlyZWN0aXZlcyBvdmVycmlkZQotICAgICAgICAgKiAgYW5kIGFueXRoaW5nIGVsc2UgaXMgaW5oZXJpdGVkCi0gICAgICAgICAqLwotICAgICAgICBhLT5yZXdyaXRlbG9nbGV2ZWwgPSBvdmVycmlkZXMtPnJld3JpdGVsb2dsZXZlbCAhPSAwIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG92ZXJyaWRlcy0+cmV3cml0ZWxvZ2xldmVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYmFzZS0+cmV3cml0ZWxvZ2xldmVsOwotICAgICAgICBhLT5yZXdyaXRlbG9nZmlsZSAgPSBvdmVycmlkZXMtPnJld3JpdGVsb2dmaWxlICE9IE5VTEwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gb3ZlcnJpZGVzLT5yZXdyaXRlbG9nZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGJhc2UtPnJld3JpdGVsb2dmaWxlOwotICAgICAgICBhLT5yZXdyaXRlbG9nZnAgICAgPSBvdmVycmlkZXMtPnJld3JpdGVsb2dmcCAhPSBOVUxMIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG92ZXJyaWRlcy0+cmV3cml0ZWxvZ2ZwIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGJhc2UtPnJld3JpdGVsb2dmcDsKLSAgICAgICAgYS0+cmV3cml0ZW1hcHMgICAgID0gYXBfYXBwZW5kX2FycmF5cyhwLCBvdmVycmlkZXMtPnJld3JpdGVtYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPnJld3JpdGVtYXBzKTsKLSAgICAgICAgYS0+cmV3cml0ZWNvbmRzICAgID0gYXBfYXBwZW5kX2FycmF5cyhwLCBvdmVycmlkZXMtPnJld3JpdGVjb25kcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5yZXdyaXRlY29uZHMpOwotICAgICAgICBhLT5yZXdyaXRlcnVsZXMgICAgPSBhcF9hcHBlbmRfYXJyYXlzKHAsIG92ZXJyaWRlcy0+cmV3cml0ZXJ1bGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPnJld3JpdGVydWxlcyk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAvKgotICAgICAgICAgKiAgbG9jYWwgZGlyZWN0aXZlcyBvdmVycmlkZQotICAgICAgICAgKiAgYW5kIGFueXRoaW5nIGVsc2UgZ2V0cyBkZWZhdWx0cwotICAgICAgICAgKi8KLSAgICAgICAgYS0+cmV3cml0ZWxvZ2xldmVsID0gb3ZlcnJpZGVzLT5yZXdyaXRlbG9nbGV2ZWw7Ci0gICAgICAgIGEtPnJld3JpdGVsb2dmaWxlICA9IG92ZXJyaWRlcy0+cmV3cml0ZWxvZ2ZpbGU7Ci0gICAgICAgIGEtPnJld3JpdGVsb2dmcCAgICA9IG92ZXJyaWRlcy0+cmV3cml0ZWxvZ2ZwOwotICAgICAgICBhLT5yZXdyaXRlbWFwcyAgICAgPSBvdmVycmlkZXMtPnJld3JpdGVtYXBzOwotICAgICAgICBhLT5yZXdyaXRlY29uZHMgICAgPSBvdmVycmlkZXMtPnJld3JpdGVjb25kczsKLSAgICAgICAgYS0+cmV3cml0ZXJ1bGVzICAgID0gb3ZlcnJpZGVzLT5yZXdyaXRlcnVsZXM7Ci0gICAgfQotCi0gICAgcmV0dXJuICh2b2lkICopYTsKLX0KLQotCi0vKgotKioKLSoqICBwZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIGhhbmRsaW5nCi0qKgotKi8KLQotc3RhdGljIHZvaWQgKmNvbmZpZ19wZXJkaXJfY3JlYXRlKGFwX2NvbnRleHRfdCAqcCwgY2hhciAqcGF0aCkKLXsKLSAgICByZXdyaXRlX3BlcmRpcl9jb25mICphOwotCi0gICAgYSA9IChyZXdyaXRlX3BlcmRpcl9jb25mICopYXBfcGNhbGxvYyhwLCBzaXplb2YocmV3cml0ZV9wZXJkaXJfY29uZikpOwotCi0gICAgYS0+c3RhdGUgICAgICAgICAgID0gRU5HSU5FX0RJU0FCTEVEOwotICAgIGEtPm9wdGlvbnMgICAgICAgICA9IE9QVElPTl9OT05FOwotICAgIGEtPmJhc2V1cmwgICAgICAgICA9IE5VTEw7Ci0gICAgYS0+cmV3cml0ZWNvbmRzICAgID0gYXBfbWFrZV9hcnJheShwLCAyLCBzaXplb2YocmV3cml0ZWNvbmRfZW50cnkpKTsKLSAgICBhLT5yZXdyaXRlcnVsZXMgICAgPSBhcF9tYWtlX2FycmF5KHAsIDIsIHNpemVvZihyZXdyaXRlcnVsZV9lbnRyeSkpOwotCi0gICAgaWYgKHBhdGggPT0gTlVMTCkgewotICAgICAgICBhLT5kaXJlY3RvcnkgPSBOVUxMOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogbWFrZSBzdXJlIGl0IGhhcyBhIHRyYWlsaW5nIHNsYXNoICovCi0gICAgICAgIGlmIChwYXRoW3N0cmxlbihwYXRoKS0xXSA9PSAnLycpIHsKLSAgICAgICAgICAgIGEtPmRpcmVjdG9yeSA9IGFwX3BzdHJkdXAocCwgcGF0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhLT5kaXJlY3RvcnkgPSBhcF9wc3RyY2F0KHAsIHBhdGgsICIvIiwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gKHZvaWQgKilhOwotfQotCi1zdGF0aWMgdm9pZCAqY29uZmlnX3BlcmRpcl9tZXJnZShhcF9jb250ZXh0X3QgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICpvdmVycmlkZXN2KQotewotICAgIHJld3JpdGVfcGVyZGlyX2NvbmYgKmEsICpiYXNlLCAqb3ZlcnJpZGVzOwotCi0gICAgYSAgICAgICAgID0gKHJld3JpdGVfcGVyZGlyX2NvbmYgKilhcF9wY2FsbG9jKHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyZXdyaXRlX3BlcmRpcl9jb25mKSk7Ci0gICAgYmFzZSAgICAgID0gKHJld3JpdGVfcGVyZGlyX2NvbmYgKiliYXNldjsKLSAgICBvdmVycmlkZXMgPSAocmV3cml0ZV9wZXJkaXJfY29uZiAqKW92ZXJyaWRlc3Y7Ci0KLSAgICBhLT5zdGF0ZSAgICAgPSBvdmVycmlkZXMtPnN0YXRlOwotICAgIGEtPm9wdGlvbnMgICA9IG92ZXJyaWRlcy0+b3B0aW9uczsKLSAgICBhLT5kaXJlY3RvcnkgPSBvdmVycmlkZXMtPmRpcmVjdG9yeTsKLSAgICBhLT5iYXNldXJsICAgPSBvdmVycmlkZXMtPmJhc2V1cmw7Ci0KLSAgICBpZiAoYS0+b3B0aW9ucyAmIE9QVElPTl9JTkhFUklUKSB7Ci0gICAgICAgIGEtPnJld3JpdGVjb25kcyA9IGFwX2FwcGVuZF9hcnJheXMocCwgb3ZlcnJpZGVzLT5yZXdyaXRlY29uZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+cmV3cml0ZWNvbmRzKTsKLSAgICAgICAgYS0+cmV3cml0ZXJ1bGVzID0gYXBfYXBwZW5kX2FycmF5cyhwLCBvdmVycmlkZXMtPnJld3JpdGVydWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5yZXdyaXRlcnVsZXMpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgYS0+cmV3cml0ZWNvbmRzID0gb3ZlcnJpZGVzLT5yZXdyaXRlY29uZHM7Ci0gICAgICAgIGEtPnJld3JpdGVydWxlcyA9IG92ZXJyaWRlcy0+cmV3cml0ZXJ1bGVzOwotICAgIH0KLQotICAgIHJldHVybiAodm9pZCAqKWE7Ci19Ci0KLQotLyoKLSoqCi0qKiAgdGhlIGNvbmZpZ3VyYXRpb24gY29tbWFuZHMKLSoqCi0qLwotCi1zdGF0aWMgY29uc3QgY2hhciAqY21kX3Jld3JpdGVlbmdpbmUoY21kX3Bhcm1zICpjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZV9wZXJkaXJfY29uZiAqZGNvbmYsIGludCBmbGFnKQotewotICAgIHJld3JpdGVfc2VydmVyX2NvbmYgKnNjb25mOwotCi0gICAgc2NvbmYgPSAKLSAgICAgICAgKHJld3JpdGVfc2VydmVyX2NvbmYgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhjbWQtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV3cml0ZV9tb2R1bGUpOwotCi0gICAgaWYgKGNtZC0+cGF0aCA9PSBOVUxMKSB7IC8qIGlzIHNlcnZlciBjb21tYW5kICovCi0gICAgICAgIHNjb25mLT5zdGF0ZSA9IChmbGFnID8gRU5HSU5FX0VOQUJMRUQgOiBFTkdJTkVfRElTQUJMRUQpOwotICAgIH0KLSAgICBlbHNlICAgICAgICAgICAgICAgICAgIC8qIGlzIHBlci1kaXJlY3RvcnkgY29tbWFuZCAqLyB7Ci0gICAgICAgIGRjb25mLT5zdGF0ZSA9IChmbGFnID8gRU5HSU5FX0VOQUJMRUQgOiBFTkdJTkVfRElTQUJMRUQpOwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqY21kX3Jld3JpdGVvcHRpb25zKGNtZF9wYXJtcyAqY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXdyaXRlX3BlcmRpcl9jb25mICpkY29uZiwgY2hhciAqb3B0aW9uKQotewotICAgIHJld3JpdGVfc2VydmVyX2NvbmYgKnNjb25mOwotICAgIGNvbnN0IGNoYXIgKmVycjsKLQotICAgIHNjb25mID0gKHJld3JpdGVfc2VydmVyX2NvbmYgKikKLSAgICAgICAgICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKGNtZC0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAmcmV3cml0ZV9tb2R1bGUpOwotCi0gICAgaWYgKGNtZC0+cGF0aCA9PSBOVUxMKSB7IC8qIGlzIHNlcnZlciBjb21tYW5kICovCi0gICAgICAgIGVyciA9IGNtZF9yZXdyaXRlb3B0aW9uc19zZXRvcHRpb24oY21kLT5wb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc2NvbmYtPm9wdGlvbnMpLCBvcHRpb24pOwotICAgIH0KLSAgICBlbHNlIHsgICAgICAgICAgICAgICAgIC8qIGlzIHBlci1kaXJlY3RvcnkgY29tbWFuZCAqLwotICAgICAgICBlcnIgPSBjbWRfcmV3cml0ZW9wdGlvbnNfc2V0b3B0aW9uKGNtZC0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGRjb25mLT5vcHRpb25zKSwgb3B0aW9uKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqY21kX3Jld3JpdGVvcHRpb25zX3NldG9wdGlvbihhcF9jb250ZXh0X3QgKnAsIGludCAqb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm5hbWUpCi17Ci0gICAgaWYgKHN0cmNhc2VjbXAobmFtZSwgImluaGVyaXQiKSA9PSAwKSB7Ci0gICAgICAgICpvcHRpb25zIHw9IE9QVElPTl9JTkhFUklUOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGFwX3BzdHJjYXQocCwgIlJld3JpdGVPcHRpb25zOiB1bmtub3duIG9wdGlvbiAnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgIidcbiIsIE5VTEwpOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9yZXdyaXRlbG9nKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkY29uZiwgY2hhciAqYTEpCi17Ci0gICAgcmV3cml0ZV9zZXJ2ZXJfY29uZiAqc2NvbmY7Ci0KLSAgICBzY29uZiA9IChyZXdyaXRlX3NlcnZlcl9jb25mICopCi0gICAgICAgICAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhjbWQtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgJnJld3JpdGVfbW9kdWxlKTsKLQotICAgIHNjb25mLT5yZXdyaXRlbG9nZmlsZSA9IGExOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjbWRfcmV3cml0ZWxvZ2xldmVsKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkY29uZiwgY2hhciAqYTEpCi17Ci0gICAgcmV3cml0ZV9zZXJ2ZXJfY29uZiAqc2NvbmY7Ci0KLSAgICBzY29uZiA9IChyZXdyaXRlX3NlcnZlcl9jb25mICopCi0gICAgICAgICAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhjbWQtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgJnJld3JpdGVfbW9kdWxlKTsKLQotICAgIHNjb25mLT5yZXdyaXRlbG9nbGV2ZWwgPSBhdG9pKGExKTsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqY21kX3Jld3JpdGVtYXAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmRjb25mLCBjaGFyICphMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICphMikKLXsKLSAgICByZXdyaXRlX3NlcnZlcl9jb25mICpzY29uZjsKLSAgICByZXdyaXRlbWFwX2VudHJ5ICpuZXdtYXA7Ci0gICAgc3RydWN0IHN0YXQgc3Q7Ci0KLSAgICBzY29uZiA9IChyZXdyaXRlX3NlcnZlcl9jb25mICopCi0gICAgICAgICAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhjbWQtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgJnJld3JpdGVfbW9kdWxlKTsKLQotICAgIG5ld21hcCA9IGFwX3B1c2hfYXJyYXkoc2NvbmYtPnJld3JpdGVtYXBzKTsKLQotICAgIG5ld21hcC0+bmFtZSA9IGExOwotICAgIG5ld21hcC0+ZnVuYyA9IE5VTEw7Ci0gICAgaWYgKHN0cm5jbXAoYTIsICJ0eHQ6IiwgNCkgPT0gMCkgewotICAgICAgICBuZXdtYXAtPnR5cGUgICAgICA9IE1BUFRZUEVfVFhUOwotICAgICAgICBuZXdtYXAtPmRhdGFmaWxlICA9IGEyKzQ7Ci0gICAgICAgIG5ld21hcC0+Y2hlY2tmaWxlID0gYTIrNDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RybmNtcChhMiwgInJuZDoiLCA0KSA9PSAwKSB7Ci0gICAgICAgIG5ld21hcC0+dHlwZSAgICAgID0gTUFQVFlQRV9STkQ7Ci0gICAgICAgIG5ld21hcC0+ZGF0YWZpbGUgID0gYTIrNDsKLSAgICAgICAgbmV3bWFwLT5jaGVja2ZpbGUgPSBhMis0OwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJuY21wKGEyLCAiZGJtOiIsIDQpID09IDApIHsKLSNpZm5kZWYgTk9fREJNX1JFV1JJVEVNQVAKLSAgICAgICAgbmV3bWFwLT50eXBlICAgICAgPSBNQVBUWVBFX0RCTTsKLSAgICAgICAgbmV3bWFwLT5kYXRhZmlsZSAgPSBhMis0OwotICAgICAgICBuZXdtYXAtPmNoZWNrZmlsZSA9IGFwX3BzdHJjYXQoY21kLT5wb29sLCBhMis0LCBOREJNX0ZJTEVfU1VGRklYLCBOVUxMKTsKLSNlbHNlCi0gICAgICAgIHJldHVybiBhcF9wc3RyZHVwKGNtZC0+cG9vbCwgIlJld3JpdGVNYXA6IGNhbm5vdCB1c2UgTkRCTSBtYXBmaWxlLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJiZWNhdXNlIG5vIE5EQk0gc3VwcG9ydCBpcyBjb21waWxlZCBpbiIpOwotI2VuZGlmCi0gICAgfQotICAgIGVsc2UgaWYgKHN0cm5jbXAoYTIsICJwcmc6IiwgNCkgPT0gMCkgewotICAgICAgICBuZXdtYXAtPnR5cGUgPSBNQVBUWVBFX1BSRzsKLSAgICAgICAgbmV3bWFwLT5kYXRhZmlsZSA9IGEyKzQ7Ci0gICAgICAgIG5ld21hcC0+Y2hlY2tmaWxlID0gYTIrNDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RybmNtcChhMiwgImludDoiLCA0KSA9PSAwKSB7Ci0gICAgICAgIG5ld21hcC0+dHlwZSAgICAgID0gTUFQVFlQRV9JTlQ7Ci0gICAgICAgIG5ld21hcC0+ZGF0YWZpbGUgID0gTlVMTDsKLSAgICAgICAgbmV3bWFwLT5jaGVja2ZpbGUgPSBOVUxMOwotICAgICAgICBpZiAoc3RyY21wKGEyKzQsICJ0b2xvd2VyIikgPT0gMCkgewotICAgICAgICAgICAgbmV3bWFwLT5mdW5jID0gcmV3cml0ZV9tYXBmdW5jX3RvbG93ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RyY21wKGEyKzQsICJ0b3VwcGVyIikgPT0gMCkgewotICAgICAgICAgICAgbmV3bWFwLT5mdW5jID0gcmV3cml0ZV9tYXBmdW5jX3RvdXBwZXI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RyY21wKGEyKzQsICJlc2NhcGUiKSA9PSAwKSB7Ci0gICAgICAgICAgICBuZXdtYXAtPmZ1bmMgPSByZXdyaXRlX21hcGZ1bmNfZXNjYXBlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNtcChhMis0LCAidW5lc2NhcGUiKSA9PSAwKSB7Ci0gICAgICAgICAgICBuZXdtYXAtPmZ1bmMgPSByZXdyaXRlX21hcGZ1bmNfdW5lc2NhcGU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc2NvbmYtPnN0YXRlID09IEVOR0lORV9FTkFCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsICJSZXdyaXRlTWFwOiBpbnRlcm5hbCBtYXAgbm90IGZvdW5kOiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhMis0LCBOVUxMKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgbmV3bWFwLT50eXBlICAgICAgPSBNQVBUWVBFX1RYVDsKLSAgICAgICAgbmV3bWFwLT5kYXRhZmlsZSAgPSBhMjsKLSAgICAgICAgbmV3bWFwLT5jaGVja2ZpbGUgPSBhMjsKLSAgICB9Ci0gICAgbmV3bWFwLT5mcGluICA9IE5VTEw7Ci0gICAgbmV3bWFwLT5mcG91dCA9IE5VTEw7Ci0KLSAgICBpZiAobmV3bWFwLT5jaGVja2ZpbGUgJiYgKHNjb25mLT5zdGF0ZSA9PSBFTkdJTkVfRU5BQkxFRCkKLSAgICAgICAgJiYgKHN0YXQobmV3bWFwLT5jaGVja2ZpbGUsICZzdCkgPT0gLTEpKSB7Ci0gICAgICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlJld3JpdGVNYXA6IG1hcCBmaWxlIG9yIHByb2dyYW0gbm90IGZvdW5kOiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5ld21hcC0+Y2hlY2tmaWxlLCBOVUxMKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9yZXdyaXRlbG9jayhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZGNvbmYsIGNoYXIgKmExKQotewotICAgIGNvbnN0IGNoYXIgKmVycm9yOwotCi0gICAgaWYgKChlcnJvciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpKSAhPSBOVUxMKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBsb2NrbmFtZSA9IGExOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjbWRfcmV3cml0ZWJhc2UoY21kX3Bhcm1zICpjbWQsIHJld3JpdGVfcGVyZGlyX2NvbmYgKmRjb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICphMSkKLXsKLSAgICBpZiAoY21kLT5wYXRoID09IE5VTEwgfHwgZGNvbmYgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gIlJld3JpdGVCYXNlOiBvbmx5IHZhbGlkIGluIHBlci1kaXJlY3RvcnkgY29uZmlnIGZpbGVzIjsKLSAgICB9Ci0gICAgaWYgKGExWzBdID09ICdcMCcpIHsKLSAgICAgICAgcmV0dXJuICJSZXdyaXRlQmFzZTogZW1wdHkgVVJMIG5vdCBhbGxvd2VkIjsKLSAgICB9Ci0gICAgaWYgKGExWzBdICE9ICcvJykgewotICAgICAgICByZXR1cm4gIlJld3JpdGVCYXNlOiBhcmd1bWVudCBpcyBub3QgYSB2YWxpZCBVUkwiOwotICAgIH0KLQotICAgIGRjb25mLT5iYXNldXJsID0gYTE7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9yZXdyaXRlY29uZChjbWRfcGFybXMgKmNtZCwgcmV3cml0ZV9wZXJkaXJfY29uZiAqZGNvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN0cikKLXsKLSAgICByZXdyaXRlX3NlcnZlcl9jb25mICpzY29uZjsKLSAgICByZXdyaXRlY29uZF9lbnRyeSAqbmV3Y29uZDsKLSAgICByZWdleF90ICpyZWdleHA7Ci0gICAgY2hhciAqYTE7Ci0gICAgY2hhciAqYTI7Ci0gICAgY2hhciAqYTM7Ci0gICAgY2hhciAqY3A7Ci0gICAgY29uc3QgY2hhciAqZXJyOwotICAgIGludCByYzsKLQotICAgIHNjb25mID0gKHJld3JpdGVfc2VydmVyX2NvbmYgKikKLSAgICAgICAgICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKGNtZC0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAmcmV3cml0ZV9tb2R1bGUpOwotCi0gICAgLyogIG1ha2UgYSBuZXcgZW50cnkgaW4gdGhlIGludGVybmFsIHRlbXBvcmFyeSByZXdyaXRlIHJ1bGUgbGlzdCAqLwotICAgIGlmIChjbWQtPnBhdGggPT0gTlVMTCkgeyAgIC8qIGlzIHNlcnZlciBjb21tYW5kICovCi0gICAgICAgIG5ld2NvbmQgPSBhcF9wdXNoX2FycmF5KHNjb25mLT5yZXdyaXRlY29uZHMpOwotICAgIH0KLSAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAvKiBpcyBwZXItZGlyZWN0b3J5IGNvbW1hbmQgKi8KLSAgICAgICAgbmV3Y29uZCA9IGFwX3B1c2hfYXJyYXkoZGNvbmYtPnJld3JpdGVjb25kcyk7Ci0gICAgfQotCi0gICAgLyogIHBhcnNlIHRoZSBhcmd1bWVudCBsaW5lIG91cnNlbGYgKi8KLSAgICBpZiAocGFyc2VhcmdsaW5lKHN0ciwgJmExLCAmYTIsICZhMykpIHsKLSAgICAgICAgcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiUmV3cml0ZUNvbmQ6IGJhZCBhcmd1bWVudCBsaW5lICciLCBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICInXG4iLCBOVUxMKTsKLSAgICB9Ci0KLSAgICAvKiAgYXJnMTogdGhlIGlucHV0IHN0cmluZyAqLwotICAgIG5ld2NvbmQtPmlucHV0ID0gYXBfcHN0cmR1cChjbWQtPnBvb2wsIGExKTsKLQotICAgIC8qIGFyZzM6IG9wdGlvbmFsIGZsYWdzIGZpZWxkCi0gICAgICAgKHRoaXMgaGF2ZSB0byBiZSBmaXJzdCBwYXJzZWQsIGJlY2F1c2Ugd2UgbmVlZCB0bwotICAgICAgICBrbm93IGlmIHRoZSByZWdleCBzaG91bGQgYmUgY29tcGlsZWQgd2l0aCBJQ0FTRSEpICovCi0gICAgbmV3Y29uZC0+ZmxhZ3MgPSBDT05ERkxBR19OT05FOwotICAgIGlmIChhMyAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICgoZXJyID0gY21kX3Jld3JpdGVjb25kX3BhcnNlZmxhZ2ZpZWxkKGNtZC0+cG9vbCwgbmV3Y29uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTMpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogIGFyZzI6IHRoZSBwYXR0ZXJuCi0gICAgICAgIHRyeSB0byBjb21waWxlIHRoZSByZWdleHAgdG8gdGVzdCBpZiBpcyBvayAqLwotICAgIGNwID0gYTI7Ci0gICAgaWYgKGNwWzBdID09ICchJykgewotICAgICAgICBuZXdjb25kLT5mbGFncyB8PSBDT05ERkxBR19OT1RNQVRDSDsKLSAgICAgICAgY3ArKzsKLSAgICB9Ci0KLSAgICAvKiBub3cgYmUgY2FyZWZ1bDogVW5kZXIgdGhlIFBPU0lYIHJlZ2V4IGxpYnJhcnkKLSAgICAgICB3ZSBjYW4gY29tcGlsZSB0aGUgcGF0dGVybiBmb3IgY2FzZSBpbnNlbnNpdGl2ZSBtYXRjaGluZywKLSAgICAgICB1bmRlciB0aGUgb2xkIFY4IGxpYnJhcnkgd2UgaGF2ZSB0byBkbyBpdCBzZWxmIHZpYSBhIGhhY2sgKi8KLSAgICBpZiAobmV3Y29uZC0+ZmxhZ3MgJiBDT05ERkxBR19OT0NBU0UpIHsKLSAgICAgICAgcmMgPSAoKHJlZ2V4cCA9IGFwX3ByZWdjb21wKGNtZC0+cG9vbCwgY3AsIFJFR19FWFRFTkRFRHxSRUdfSUNBU0UpKQotICAgICAgICAgICAgICA9PSBOVUxMKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJjID0gKChyZWdleHAgPSBhcF9wcmVnY29tcChjbWQtPnBvb2wsIGNwLCBSRUdfRVhURU5ERUQpKSA9PSBOVUxMKTsKLSAgICB9Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlJld3JpdGVDb25kOiBjYW5ub3QgY29tcGlsZSByZWd1bGFyIGV4cHJlc3Npb24gJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGEyLCAiJ1xuIiwgTlVMTCk7Ci0gICAgfQotCi0gICAgbmV3Y29uZC0+cGF0dGVybiA9IGFwX3BzdHJkdXAoY21kLT5wb29sLCBjcCk7Ci0gICAgbmV3Y29uZC0+cmVnZXhwICA9IHJlZ2V4cDsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqY21kX3Jld3JpdGVjb25kX3BhcnNlZmxhZ2ZpZWxkKGFwX2NvbnRleHRfdCAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZWNvbmRfZW50cnkgKmNmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3RyKQotewotICAgIGNoYXIgKmNwOwotICAgIGNoYXIgKmNwMTsKLSAgICBjaGFyICpjcDI7Ci0gICAgY2hhciAqY3AzOwotICAgIGNoYXIgKmtleTsKLSAgICBjaGFyICp2YWw7Ci0gICAgY29uc3QgY2hhciAqZXJyOwotCi0gICAgaWYgKHN0clswXSAhPSAnWycgfHwgc3RyW3N0cmxlbihzdHIpLTFdICE9ICddJykgewotICAgICAgICByZXR1cm4gIlJld3JpdGVDb25kOiBiYWQgZmxhZyBkZWxpbWl0ZXJzIjsKLSAgICB9Ci0KLSAgICBjcCA9IHN0cisxOwotICAgIHN0cltzdHJsZW4oc3RyKS0xXSA9ICcsJzsgLyogZm9yIHNpbXBsZXIgcGFyc2luZyAqLwotICAgIGZvciAoIDsgKmNwICE9ICdcMCc7ICkgewotICAgICAgICAvKiBza2lwIHdoaXRlc3BhY2VzICovCi0gICAgICAgIGZvciAoIDsgKCpjcCA9PSAnICcgfHwgKmNwID09ICdcdCcpICYmICpjcCAhPSAnXDAnOyBjcCsrKQotICAgICAgICAgICAgOwotICAgICAgICBpZiAoKmNwID09ICdcMCcpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNwMSA9IGNwOwotICAgICAgICBpZiAoKGNwMiA9IHN0cmNocihjcCwgJywnKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgY3AgPSBjcDIrMTsKLSAgICAgICAgICAgIGZvciAoIDsgKCooY3AyLTEpID09ICcgJyB8fCAqKGNwMi0xKSA9PSAnXHQnKTsgY3AyLS0pCi0gICAgICAgICAgICAgICAgOwotICAgICAgICAgICAgKmNwMiA9ICdcMCc7Ci0gICAgICAgICAgICBpZiAoKGNwMyA9IHN0cmNocihjcDEsICc9JykpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqY3AzID0gJ1wwJzsKLSAgICAgICAgICAgICAgICBrZXkgPSBjcDE7Ci0gICAgICAgICAgICAgICAgdmFsID0gY3AzKzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBrZXkgPSBjcDE7Ci0gICAgICAgICAgICAgICAgdmFsID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGVyciA9IGNtZF9yZXdyaXRlY29uZF9zZXRmbGFnKHAsIGNmZywga2V5LCB2YWwpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjbWRfcmV3cml0ZWNvbmRfc2V0ZmxhZyhhcF9jb250ZXh0X3QgKnAsIHJld3JpdGVjb25kX2VudHJ5ICpjZmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqa2V5LCBjaGFyICp2YWwpCi17Ci0gICAgaWYgKCAgIHN0cmNhc2VjbXAoa2V5LCAibm9jYXNlIikgPT0gMAotICAgICAgICB8fCBzdHJjYXNlY21wKGtleSwgIk5DIikgPT0gMCAgICApIHsKLSAgICAgICAgY2ZnLT5mbGFncyB8PSBDT05ERkxBR19OT0NBU0U7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAgIHN0cmNhc2VjbXAoa2V5LCAib3JuZXh0IikgPT0gMAotICAgICAgICAgICAgIHx8IHN0cmNhc2VjbXAoa2V5LCAiT1IiKSA9PSAwICAgICkgewotICAgICAgICBjZmctPmZsYWdzIHw9IENPTkRGTEFHX09STkVYVDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJldHVybiBhcF9wc3RyY2F0KHAsICJSZXdyaXRlQ29uZDogdW5rbm93biBmbGFnICciLCBrZXksICInXG4iLCBOVUxMKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjbWRfcmV3cml0ZXJ1bGUoY21kX3Bhcm1zICpjbWQsIHJld3JpdGVfcGVyZGlyX2NvbmYgKmRjb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzdHIpCi17Ci0gICAgcmV3cml0ZV9zZXJ2ZXJfY29uZiAqc2NvbmY7Ci0gICAgcmV3cml0ZXJ1bGVfZW50cnkgKm5ld3J1bGU7Ci0gICAgcmVnZXhfdCAqcmVnZXhwOwotICAgIGNoYXIgKmExOwotICAgIGNoYXIgKmEyOwotICAgIGNoYXIgKmEzOwotICAgIGNoYXIgKmNwOwotICAgIGNvbnN0IGNoYXIgKmVycjsKLSAgICBpbnQgbW9kZTsKLQotICAgIHNjb25mID0gKHJld3JpdGVfc2VydmVyX2NvbmYgKikKLSAgICAgICAgICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKGNtZC0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAmcmV3cml0ZV9tb2R1bGUpOwotCi0gICAgLyogIG1ha2UgYSBuZXcgZW50cnkgaW4gdGhlIGludGVybmFsIHJld3JpdGUgcnVsZSBsaXN0ICovCi0gICAgaWYgKGNtZC0+cGF0aCA9PSBOVUxMKSB7ICAgLyogaXMgc2VydmVyIGNvbW1hbmQgKi8KLSAgICAgICAgbmV3cnVsZSA9IGFwX3B1c2hfYXJyYXkoc2NvbmYtPnJld3JpdGVydWxlcyk7Ci0gICAgfQotICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgIC8qIGlzIHBlci1kaXJlY3RvcnkgY29tbWFuZCAqLwotICAgICAgICBuZXdydWxlID0gYXBfcHVzaF9hcnJheShkY29uZi0+cmV3cml0ZXJ1bGVzKTsKLSAgICB9Ci0KLSAgICAvKiAgcGFyc2UgdGhlIGFyZ3VtZW50IGxpbmUgb3Vyc2VsZiAqLwotICAgIGlmIChwYXJzZWFyZ2xpbmUoc3RyLCAmYTEsICZhMiwgJmEzKSkgewotICAgICAgICByZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsICJSZXdyaXRlUnVsZTogYmFkIGFyZ3VtZW50IGxpbmUgJyIsIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIidcbiIsIE5VTEwpOwotICAgIH0KLQotICAgIC8qIGFyZzM6IG9wdGlvbmFsIGZsYWdzIGZpZWxkICovCi0gICAgbmV3cnVsZS0+Zm9yY2VkX21pbWV0eXBlICAgICA9IE5VTEw7Ci0gICAgbmV3cnVsZS0+Zm9yY2VkX3Jlc3BvbnNlY29kZSA9IEhUVFBfTU9WRURfVEVNUE9SQVJJTFk7Ci0gICAgbmV3cnVsZS0+ZmxhZ3MgID0gUlVMRUZMQUdfTk9ORTsKLSAgICBuZXdydWxlLT5lbnZbMF0gPSBOVUxMOwotICAgIG5ld3J1bGUtPnNraXAgICA9IDA7Ci0gICAgaWYgKGEzICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKChlcnIgPSBjbWRfcmV3cml0ZXJ1bGVfcGFyc2VmbGFnZmllbGQoY21kLT5wb29sLCBuZXdydWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhMykpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAgYXJnMTogdGhlIHBhdHRlcm4KLSAgICAgKiAgdHJ5IHRvIGNvbXBpbGUgdGhlIHJlZ2V4cCB0byB0ZXN0IGlmIGlzIG9rCi0gICAgICovCi0gICAgY3AgPSBhMTsKLSAgICBpZiAoY3BbMF0gPT0gJyEnKSB7Ci0gICAgICAgIG5ld3J1bGUtPmZsYWdzIHw9IFJVTEVGTEFHX05PVE1BVENIOwotICAgICAgICBjcCsrOwotICAgIH0KLSAgICBtb2RlID0gUkVHX0VYVEVOREVEOwotICAgIGlmIChuZXdydWxlLT5mbGFncyAmIFJVTEVGTEFHX05PQ0FTRSkgewotICAgICAgICBtb2RlIHw9IFJFR19JQ0FTRTsKLSAgICB9Ci0gICAgaWYgKChyZWdleHAgPSBhcF9wcmVnY29tcChjbWQtPnBvb2wsIGNwLCBtb2RlKSkgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJSZXdyaXRlUnVsZTogY2Fubm90IGNvbXBpbGUgcmVndWxhciBleHByZXNzaW9uICciLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhMSwgIidcbiIsIE5VTEwpOwotICAgIH0KLSAgICBuZXdydWxlLT5wYXR0ZXJuID0gYXBfcHN0cmR1cChjbWQtPnBvb2wsIGNwKTsKLSAgICBuZXdydWxlLT5yZWdleHAgID0gcmVnZXhwOwotCi0gICAgLyogIGFyZzI6IHRoZSBvdXRwdXQgc3RyaW5nCi0gICAgICogIHJlcGxhY2UgdGhlICQ8Tj4gYnkgXDxuPiB3aGljaCBpcyBuZWVkZWQgYnkgdGhlIGN1cnJlbnRseQotICAgICAqICB1c2VkIFJlZ3VsYXIgRXhwcmVzc2lvbiBsaWJyYXJ5Ci0gICAgICovCi0gICAgbmV3cnVsZS0+b3V0cHV0ID0gYXBfcHN0cmR1cChjbWQtPnBvb2wsIGEyKTsKLQotICAgIC8qIG5vdywgaWYgdGhlIHNlcnZlciBvciBwZXItZGlyIGNvbmZpZyBob2xkcyBhbgotICAgICAqIGFycmF5IG9mIFJld3JpdGVDb25kIGVudHJpZXMsIHdlIHRha2UgaXQgZm9yIHVzCi0gICAgICogYW5kIGNsZWFyIHRoZSBhcnJheQotICAgICAqLwotICAgIGlmIChjbWQtPnBhdGggPT0gTlVMTCkgeyAgLyogaXMgc2VydmVyIGNvbW1hbmQgKi8KLSAgICAgICAgbmV3cnVsZS0+cmV3cml0ZWNvbmRzICAgPSBzY29uZi0+cmV3cml0ZWNvbmRzOwotICAgICAgICBzY29uZi0+cmV3cml0ZWNvbmRzID0gYXBfbWFrZV9hcnJheShjbWQtPnBvb2wsIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyZXdyaXRlY29uZF9lbnRyeSkpOwotICAgIH0KLSAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgIC8qIGlzIHBlci1kaXJlY3RvcnkgY29tbWFuZCAqLwotICAgICAgICBuZXdydWxlLT5yZXdyaXRlY29uZHMgICA9IGRjb25mLT5yZXdyaXRlY29uZHM7Ci0gICAgICAgIGRjb25mLT5yZXdyaXRlY29uZHMgPSBhcF9tYWtlX2FycmF5KGNtZC0+cG9vbCwgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHJld3JpdGVjb25kX2VudHJ5KSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjbWRfcmV3cml0ZXJ1bGVfcGFyc2VmbGFnZmllbGQoYXBfY29udGV4dF90ICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXdyaXRlcnVsZV9lbnRyeSAqY2ZnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzdHIpCi17Ci0gICAgY2hhciAqY3A7Ci0gICAgY2hhciAqY3AxOwotICAgIGNoYXIgKmNwMjsKLSAgICBjaGFyICpjcDM7Ci0gICAgY2hhciAqa2V5OwotICAgIGNoYXIgKnZhbDsKLSAgICBjb25zdCBjaGFyICplcnI7Ci0KLSAgICBpZiAoc3RyWzBdICE9ICdbJyB8fCBzdHJbc3RybGVuKHN0ciktMV0gIT0gJ10nKSB7Ci0gICAgICAgIHJldHVybiAiUmV3cml0ZVJ1bGU6IGJhZCBmbGFnIGRlbGltaXRlcnMiOwotICAgIH0KLQotICAgIGNwID0gc3RyKzE7Ci0gICAgc3RyW3N0cmxlbihzdHIpLTFdID0gJywnOyAvKiBmb3Igc2ltcGxlciBwYXJzaW5nICovCi0gICAgZm9yICggOyAqY3AgIT0gJ1wwJzsgKSB7Ci0gICAgICAgIC8qIHNraXAgd2hpdGVzcGFjZXMgKi8KLSAgICAgICAgZm9yICggOyAoKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JykgJiYgKmNwICE9ICdcMCc7IGNwKyspCi0gICAgICAgICAgICA7Ci0gICAgICAgIGlmICgqY3AgPT0gJ1wwJykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY3AxID0gY3A7Ci0gICAgICAgIGlmICgoY3AyID0gc3RyY2hyKGNwLCAnLCcpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjcCA9IGNwMisxOwotICAgICAgICAgICAgZm9yICggOyAoKihjcDItMSkgPT0gJyAnIHx8ICooY3AyLTEpID09ICdcdCcpOyBjcDItLSkKLSAgICAgICAgICAgICAgICA7Ci0gICAgICAgICAgICAqY3AyID0gJ1wwJzsKLSAgICAgICAgICAgIGlmICgoY3AzID0gc3RyY2hyKGNwMSwgJz0nKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpjcDMgPSAnXDAnOwotICAgICAgICAgICAgICAgIGtleSA9IGNwMTsKLSAgICAgICAgICAgICAgICB2YWwgPSBjcDMrMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGtleSA9IGNwMTsKLSAgICAgICAgICAgICAgICB2YWwgPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoZXJyID0gY21kX3Jld3JpdGVydWxlX3NldGZsYWcocCwgY2ZnLCBrZXksIHZhbCkpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9yZXdyaXRlcnVsZV9zZXRmbGFnKGFwX2NvbnRleHRfdCAqcCwgcmV3cml0ZXJ1bGVfZW50cnkgKmNmZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICprZXksIGNoYXIgKnZhbCkKLXsKLSAgICBpbnQgc3RhdHVzID0gMDsKLSAgICBpbnQgaTsKLQotICAgIGlmICggICBzdHJjYXNlY21wKGtleSwgInJlZGlyZWN0IikgPT0gMAotICAgICAgICB8fCBzdHJjYXNlY21wKGtleSwgIlIiKSA9PSAwICAgICAgICkgewotICAgICAgICBjZmctPmZsYWdzIHw9IFJVTEVGTEFHX0ZPUkNFUkVESVJFQ1Q7Ci0gICAgICAgIGlmIChzdHJsZW4odmFsKSA+IDApIHsKLSAgICAgICAgICAgIGlmIChzdHJjYXNlY21wKHZhbCwgInBlcm1hbmVudCIpID09IDApIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBIVFRQX01PVkVEX1BFUk1BTkVOVExZOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YWwsICJ0ZW1wIikgPT0gMCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEhUVFBfTU9WRURfVEVNUE9SQVJJTFk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhbCwgInNlZW90aGVyIikgPT0gMCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEhUVFBfU0VFX09USEVSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoYXBfaXNkaWdpdCgqdmFsKSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGF0b2kodmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghYXBfaXNfSFRUUF9SRURJUkVDVChzdGF0dXMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJSZXdyaXRlUnVsZTogaW52YWxpZCBIVFRQIHJlc3BvbnNlIGNvZGUgIgotICAgICAgICAgICAgICAgICAgICAgICAiZm9yIGZsYWcgJ1InIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNmZy0+Zm9yY2VkX3Jlc3BvbnNlY29kZSA9IHN0YXR1czsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICggICBzdHJjYXNlY21wKGtleSwgImxhc3QiKSA9PSAwCi0gICAgICAgICAgICAgfHwgc3RyY2FzZWNtcChrZXksICJMIikgPT0gMCAgICkgewotICAgICAgICBjZmctPmZsYWdzIHw9IFJVTEVGTEFHX0xBU1RSVUxFOwotICAgIH0KLSAgICBlbHNlIGlmICggICBzdHJjYXNlY21wKGtleSwgIm5leHQiKSA9PSAwCi0gICAgICAgICAgICAgfHwgc3RyY2FzZWNtcChrZXksICJOIikgPT0gMCAgICkgewotICAgICAgICBjZmctPmZsYWdzIHw9IFJVTEVGTEFHX05FV1JPVU5EOwotICAgIH0KLSAgICBlbHNlIGlmICggICBzdHJjYXNlY21wKGtleSwgImNoYWluIikgPT0gMAotICAgICAgICAgICAgIHx8IHN0cmNhc2VjbXAoa2V5LCAiQyIpID09IDAgICAgKSB7Ci0gICAgICAgIGNmZy0+ZmxhZ3MgfD0gUlVMRUZMQUdfQ0hBSU47Ci0gICAgfQotICAgIGVsc2UgaWYgKCAgIHN0cmNhc2VjbXAoa2V5LCAidHlwZSIpID09IDAKLSAgICAgICAgICAgICB8fCBzdHJjYXNlY21wKGtleSwgIlQiKSA9PSAwICAgKSB7Ci0gICAgICAgIGNmZy0+Zm9yY2VkX21pbWV0eXBlID0gYXBfcHN0cmR1cChwLCB2YWwpOwotICAgICAgICBhcF9zdHJfdG9sb3dlcihjZmctPmZvcmNlZF9taW1ldHlwZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAgIHN0cmNhc2VjbXAoa2V5LCAiZW52IikgPT0gMAotICAgICAgICAgICAgIHx8IHN0cmNhc2VjbXAoa2V5LCAiRSIpID09IDAgICApIHsKLSAgICAgICAgZm9yIChpID0gMDsgKGNmZy0+ZW52W2ldICE9IE5VTEwpICYmIChpIDwgTUFYX0VOVl9GTEFHUyk7IGkrKykKLSAgICAgICAgICAgIDsKLSAgICAgICAgaWYgKGkgPCBNQVhfRU5WX0ZMQUdTKSB7Ci0gICAgICAgICAgICBjZmctPmVudltpXSA9IGFwX3BzdHJkdXAocCwgdmFsKTsKLSAgICAgICAgICAgIGNmZy0+ZW52W2krMV0gPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuICJSZXdyaXRlUnVsZTogdG9vIG1hbnkgZW52aXJvbm1lbnQgZmxhZ3MgJ0UnIjsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICggICBzdHJjYXNlY21wKGtleSwgIm5vc3VicmVxIikgPT0gMAotICAgICAgICAgICAgIHx8IHN0cmNhc2VjbXAoa2V5LCAiTlMiKSA9PSAwICAgICAgKSB7Ci0gICAgICAgIGNmZy0+ZmxhZ3MgfD0gUlVMRUZMQUdfSUdOT1JFT05TVUJSRVE7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAgIHN0cmNhc2VjbXAoa2V5LCAicHJveHkiKSA9PSAwCi0gICAgICAgICAgICAgfHwgc3RyY2FzZWNtcChrZXksICJQIikgPT0gMCAgICAgICkgewotICAgICAgICBjZmctPmZsYWdzIHw9IFJVTEVGTEFHX1BST1hZOwotICAgIH0KLSAgICBlbHNlIGlmICggICBzdHJjYXNlY21wKGtleSwgInBhc3N0aHJvdWdoIikgPT0gMAotICAgICAgICAgICAgIHx8IHN0cmNhc2VjbXAoa2V5LCAiUFQiKSA9PSAwICAgICAgKSB7Ci0gICAgICAgIGNmZy0+ZmxhZ3MgfD0gUlVMRUZMQUdfUEFTU1RIUk9VR0g7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAgIHN0cmNhc2VjbXAoa2V5LCAic2tpcCIpID09IDAKLSAgICAgICAgICAgICB8fCBzdHJjYXNlY21wKGtleSwgIlMiKSA9PSAwICAgKSB7Ci0gICAgICAgIGNmZy0+c2tpcCA9IGF0b2kodmFsKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoICAgc3RyY2FzZWNtcChrZXksICJmb3JiaWRkZW4iKSA9PSAwCi0gICAgICAgICAgICAgfHwgc3RyY2FzZWNtcChrZXksICJGIikgPT0gMCAgICkgewotICAgICAgICBjZmctPmZsYWdzIHw9IFJVTEVGTEFHX0ZPUkJJRERFTjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoICAgc3RyY2FzZWNtcChrZXksICJnb25lIikgPT0gMAotICAgICAgICAgICAgIHx8IHN0cmNhc2VjbXAoa2V5LCAiRyIpID09IDAgICApIHsKLSAgICAgICAgY2ZnLT5mbGFncyB8PSBSVUxFRkxBR19HT05FOwotICAgIH0KLSAgICBlbHNlIGlmICggICBzdHJjYXNlY21wKGtleSwgInFzYXBwZW5kIikgPT0gMAotICAgICAgICAgICAgIHx8IHN0cmNhc2VjbXAoa2V5LCAiUVNBIikgPT0gMCAgICkgewotICAgICAgICBjZmctPmZsYWdzIHw9IFJVTEVGTEFHX1FTQVBQRU5EOwotICAgIH0KLSAgICBlbHNlIGlmICggICBzdHJjYXNlY21wKGtleSwgIm5vY2FzZSIpID09IDAKLSAgICAgICAgICAgICB8fCBzdHJjYXNlY21wKGtleSwgIk5DIikgPT0gMCAgICApIHsKLSAgICAgICAgY2ZnLT5mbGFncyB8PSBSVUxFRkxBR19OT0NBU0U7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXR1cm4gYXBfcHN0cmNhdChwLCAiUmV3cml0ZVJ1bGU6IHVua25vd24gZmxhZyAnIiwga2V5LCAiJ1xuIiwgTlVMTCk7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi0KLS8qCi0qKgotKiogIEdsb2JhbCBNb2R1bGUgSW5pdGlhbGl6YXRpb24KLSoqICBbY2FsbGVkIGZyb20gcmVhZF9jb25maWcoKSBhZnRlciBhbGwKLSoqICBjb25maWcgY29tbWFuZHMgd2VyZSBhbHJlYWR5IGNhbGxlZF0KLSoqCi0qLwotCi1zdGF0aWMgdm9pZCBpbml0X21vZHVsZShhcF9jb250ZXh0X3QgKnAsCi0gICAgICAgICAgICAgICAgICAgICAgICBhcF9jb250ZXh0X3QgKnBsb2csCi0gICAgICAgICAgICAgICAgICAgICAgICBhcF9jb250ZXh0X3QgKnB0ZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX3JlYyAqcykKLXsKLSAgICAvKiBjaGVjayBpZiBwcm94eSBtb2R1bGUgaXMgYXZhaWxhYmxlICovCi0gICAgcHJveHlfYXZhaWxhYmxlID0gKGFwX2ZpbmRfbGlua2VkX21vZHVsZSgibW9kX3Byb3h5LmMiKSAhPSBOVUxMKTsKLQotICAgIC8qIGNyZWF0ZSB0aGUgcmV3cml0aW5nIGxvY2tmaWxlIGluIHRoZSBwYXJlbnQgKi8KLSAgICByZXdyaXRlbG9ja19jcmVhdGUocywgcCk7Ci0gICAgYXBfcmVnaXN0ZXJfY2xlYW51cChwLCAodm9pZCAqKXMsIHJld3JpdGVsb2NrX3JlbW92ZSwgYXBfbnVsbF9jbGVhbnVwKTsKLQotICAgIC8qIHN0ZXAgdGhyb3VnaCB0aGUgc2VydmVycyBhbmQKLSAgICAgKiAtIG9wZW4gZWFjaCByZXdyaXRpbmcgbG9nZmlsZQotICAgICAqIC0gb3BlbiB0aGUgUmV3cml0ZU1hcCBwcmc6eHh4IHByb2dyYW1zCi0gICAgICovCi0gICAgZm9yICg7IHM7IHMgPSBzLT5uZXh0KSB7Ci0gICAgICAgIG9wZW5fcmV3cml0ZWxvZyhzLCBwKTsKLSAgICAgICAgaWYgKG9uY2VfdGhyb3VnaCA+IDApCi0gICAgICAgICAgIHJ1bl9yZXdyaXRlbWFwX3Byb2dyYW1zKHMsIHApOwotICAgIH0KLQotICAgIG9uY2VfdGhyb3VnaCsrOwotfQotCi0KLS8qCi0qKgotKiogIFBlci1DaGlsZCBNb2R1bGUgSW5pdGlhbGl6YXRpb24KLSoqICBbY2FsbGVkIGFmdGVyIGEgY2hpbGQgcHJvY2VzcyBpcyBzcGF3bmVkXQotKioKLSovCi0KLXN0YXRpYyB2b2lkIGluaXRfY2hpbGQoYXBfY29udGV4dF90ICpwLCBzZXJ2ZXJfcmVjICpzKQotewotICAgICAvKiBvcGVuIHRoZSByZXdyaXRpbmcgbG9ja2ZpbGUgKi8KLSAgICAgcmV3cml0ZWxvY2tfb3BlbihzLCBwKTsKLQotICAgICAvKiBjcmVhdGUgdGhlIGxvb2t1cCBjYWNoZSAqLwotICAgICBjYWNoZXAgPSBpbml0X2NhY2hlKHApOwotfQotCi0KLS8qCi0qKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSoqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiogfCAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUgaG9va3MKLSoqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotCi0vKgotKioKLSoqICBVUkktdG8tZmlsZW5hbWUgaG9vawotKioKLSoqICBbdXNlZCBmb3IgdGhlIHJld3JpdGluZyBlbmdpbmUgdHJpZ2dlcmVkIGJ5Ci0qKiAgdGhlIHBlci1zZXJ2ZXIgJ1Jld3JpdGVSdWxlJyBkaXJlY3RpdmVzXQotKioKLSovCi0KLXN0YXRpYyBpbnQgaG9va191cmkyZmlsZShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICB2b2lkICpzY29uZjsKLSAgICByZXdyaXRlX3NlcnZlcl9jb25mICpjb25mOwotICAgIGNvbnN0IGNoYXIgKnZhcjsKLSAgICBjb25zdCBjaGFyICp0aGlzc2VydmVyOwotICAgIGNoYXIgKnRoaXNwb3J0OwotICAgIGNvbnN0IGNoYXIgKnRoaXN1cmw7Ci0gICAgY2hhciBidWZbNTEyXTsKLSAgICBjaGFyIGRvY3Jvb3RbNTEyXTsKLSAgICBjaGFyICpjcCwgKmNwMjsKLSAgICBjb25zdCBjaGFyICpjY3A7Ci0gICAgc3RydWN0IHN0YXQgZmluZm87Ci0gICAgdW5zaWduZWQgaW50IHBvcnQ7Ci0gICAgaW50IG47Ci0gICAgaW50IGw7Ci0KLSAgICAvKgotICAgICAqICByZXRyaWV2ZSB0aGUgY29uZmlnIHN0cnVjdHVyZXMKLSAgICAgKi8KLSAgICBzY29uZiA9IHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZzsKLSAgICBjb25mICA9IChyZXdyaXRlX3NlcnZlcl9jb25mICopYXBfZ2V0X21vZHVsZV9jb25maWcoc2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXdyaXRlX21vZHVsZSk7Ci0KLSAgICAvKgotICAgICAqICBvbmx5IGRvIHNvbWV0aGluZyB1bmRlciBydW50aW1lIGlmIHRoZSBlbmdpbmUgaXMgcmVhbGx5IGVuYWJsZWQsCi0gICAgICogIGVsc2UgcmV0dXJuIGltbWVkaWF0ZWx5IQotICAgICAqLwotICAgIGlmIChjb25mLT5zdGF0ZSA9PSBFTkdJTkVfRElTQUJMRUQpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIGNoZWNrIGZvciB0aGUgdWdseSBBUEkgY2FzZSBvZiBhIHZpcnR1YWwgaG9zdCBzZWN0aW9uIHdoZXJlIG5vCi0gICAgICogIG1vZF9yZXdyaXRlIGRpcmVjdGl2ZXMgZXhpc3RzLiBJbiB0aGlzIHNpdHVhdGlvbiB3ZSBiZWNhbWUgbm8gY2hhbmNlCi0gICAgICogIGJ5IHRoZSBBUEkgdG8gc2V0dXAgb3VyIGRlZmF1bHQgcGVyLXNlcnZlciBjb25maWcgc28gd2UgaGF2ZSB0bwotICAgICAqICBvbi10aGUtZmx5IGFzc3VtZSB3ZSBoYXZlIHRoZSBkZWZhdWx0IGNvbmZpZy4gQnV0IGJlY2F1c2UgdGhlIGRlZmF1bHQKLSAgICAgKiAgY29uZmlnIGhhcyBhIGRpc2FibGVkIHJld3JpdGluZyBlbmdpbmUgd2UgYXJlIGx1Y2t5IGJlY2F1c2UgY2FuCi0gICAgICogIGp1c3Qgc3RvcCBvcGVyYXRpbmcgbm93LgotICAgICAqLwotICAgIGlmIChjb25mLT5zZXJ2ZXIgIT0gci0+c2VydmVyKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICBhZGQgdGhlIFNDUklQVF9VUkwgdmFyaWFibGUgdG8gdGhlIGVudi4gdGhpcyBpcyBhIGJpdCBjb21wbGljYXRlZAotICAgICAqICBkdWUgdG8gdGhlIGZhY3QgdGhhdCBhcGFjaGUgdXNlcyBzdWJyZXF1ZXN0cyBhbmQgaW50ZXJuYWwgcmVkaXJlY3RzCi0gICAgICovCi0KLSAgICBpZiAoci0+bWFpbiA9PSBOVUxMKSB7Ci0gICAgICAgICB2YXIgPSBhcF9wc3RyY2F0KHItPnBvb2wsICJSRURJUkVDVF8iLCBFTlZWQVJfU0NSSVBUX1VSTCwgTlVMTCk7Ci0gICAgICAgICB2YXIgPSBhcF90YWJsZV9nZXQoci0+c3VicHJvY2Vzc19lbnYsIHZhcik7Ci0gICAgICAgICBpZiAodmFyID09IE5VTEwpIHsKLSAgICAgICAgICAgICBhcF90YWJsZV9zZXRuKHItPnN1YnByb2Nlc3NfZW52LCBFTlZWQVJfU0NSSVBUX1VSTCwgci0+dXJpKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgIGFwX3RhYmxlX3NldG4oci0+c3VicHJvY2Vzc19lbnYsIEVOVlZBUl9TQ1JJUFRfVVJMLCB2YXIpOwotICAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgIHZhciA9IGFwX3RhYmxlX2dldChyLT5tYWluLT5zdWJwcm9jZXNzX2VudiwgRU5WVkFSX1NDUklQVF9VUkwpOwotICAgICAgICAgYXBfdGFibGVfc2V0bihyLT5zdWJwcm9jZXNzX2VudiwgRU5WVkFSX1NDUklQVF9VUkwsIHZhcik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgY3JlYXRlIHRoZSBTQ1JJUFRfVVJJIHZhcmlhYmxlIGZvciB0aGUgZW52Ci0gICAgICovCi0KLSAgICAvKiBhZGQgdGhlIGNhbm9uaWNhbCBVUkkgb2YgdGhpcyBVUkwgKi8KLSAgICB0aGlzc2VydmVyID0gYXBfZ2V0X3NlcnZlcl9uYW1lKHIpOwotICAgIHBvcnQgPSBhcF9nZXRfc2VydmVyX3BvcnQocik7Ci0gICAgaWYgKGFwX2lzX2RlZmF1bHRfcG9ydChwb3J0LCByKSkgewotICAgICAgICB0aGlzcG9ydCA9ICIiOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgYXBfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIjoldSIsIHBvcnQpOwotICAgICAgICB0aGlzcG9ydCA9IGJ1ZjsKLSAgICB9Ci0gICAgdGhpc3VybCA9IGFwX3RhYmxlX2dldChyLT5zdWJwcm9jZXNzX2VudiwgRU5WVkFSX1NDUklQVF9VUkwpOwotCi0gICAgLyogc2V0IHRoZSB2YXJpYWJsZSAqLwotICAgIHZhciA9IGFwX3BzdHJjYXQoci0+cG9vbCwgYXBfaHR0cF9tZXRob2QociksICI6Ly8iLCB0aGlzc2VydmVyLCB0aGlzcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgIHRoaXN1cmwsIE5VTEwpOwotICAgIGFwX3RhYmxlX3NldG4oci0+c3VicHJvY2Vzc19lbnYsIEVOVlZBUl9TQ1JJUFRfVVJJLCB2YXIpOwotCi0gICAgLyogaWYgZmlsZW5hbWUgd2FzIG5vdCBpbml0aWFsbHkgc2V0LAotICAgICAqIHdlIHN0YXJ0IHdpdGggdGhlIHJlcXVlc3RlZCBVUkkKLSAgICAgKi8KLSAgICBpZiAoci0+ZmlsZW5hbWUgPT0gTlVMTCkgewotICAgICAgICByLT5maWxlbmFtZSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgci0+dXJpKTsKLSAgICAgICAgcmV3cml0ZWxvZyhyLCAyLCAiaW5pdCByZXdyaXRlIGVuZ2luZSB3aXRoIHJlcXVlc3RlZCB1cmkgJXMiLAotICAgICAgICAgICAgICAgICAgIHItPmZpbGVuYW1lKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICBub3cgYXBwbHkgdGhlIHJ1bGVzIC4uLgotICAgICAqLwotICAgIGlmIChhcHBseV9yZXdyaXRlX2xpc3QociwgY29uZi0+cmV3cml0ZXJ1bGVzLCBOVUxMKSkgewotCi0gICAgICAgIGlmIChzdHJsZW4oci0+ZmlsZW5hbWUpID4gNiAmJgotICAgICAgICAgICAgc3RybmNtcChyLT5maWxlbmFtZSwgInByb3h5OiIsIDYpID09IDApIHsKLSAgICAgICAgICAgIC8qIGl0IHNob3VsZCBiZSBnbyBvbiBhcyBhbiBpbnRlcm5hbCBwcm94eSByZXF1ZXN0ICovCi0KLSAgICAgICAgICAgIC8qIGNoZWNrIGlmIHRoZSBwcm94eSBtb2R1bGUgaXMgZW5hYmxlZCwgc28KLSAgICAgICAgICAgICAqIHdlIGNhbiBhY3R1YWxseSB1c2UgaXQhCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICghcHJveHlfYXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dGVtcHQgdG8gbWFrZSByZW1vdGUgcmVxdWVzdCBmcm9tIG1vZF9yZXdyaXRlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGhvdXQgcHJveHkgZW5hYmxlZDogJXMiLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZPUkJJRERFTjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogbWFrZSBzdXJlIHRoZSBRVUVSWV9TVFJJTkcgYW5kCi0gICAgICAgICAgICAgKiBQQVRIX0lORk8gcGFydHMgZ2V0IGluY29ycG9yYXRlZAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoci0+cGF0aF9pbmZvICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByLT5maWxlbmFtZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgci0+ZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnBhdGhfaW5mbywgTlVMTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoci0+YXJncyAhPSBOVUxMICYmCi0gICAgICAgICAgICAgICAgci0+dXJpID09IHItPnVucGFyc2VkX3VyaSkgewotICAgICAgICAgICAgICAgIC8qIHNlZSBwcm94eV9odHRwOnByb3h5X2h0dHBfY2Fub24oKSAqLwotICAgICAgICAgICAgICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCByLT5maWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj8iLCByLT5hcmdzLCBOVUxMKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogbm93IG1ha2Ugc3VyZSB0aGUgcmVxdWVzdCBnZXRzIGhhbmRsZWQgYnkgdGhlIHByb3h5IGhhbmRsZXIgKi8KLSAgICAgICAgICAgIHItPnByb3h5cmVxID0gMTsKLSAgICAgICAgICAgIHItPmhhbmRsZXIgID0gInByb3h5LXNlcnZlciI7Ci0KLSAgICAgICAgICAgIHJld3JpdGVsb2cociwgMSwgImdvLWFoZWFkIHdpdGggcHJveHkgcmVxdWVzdCAlcyBbT0tdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCAgKHN0cmxlbihyLT5maWxlbmFtZSkgPiA3ICYmCi0gICAgICAgICAgICAgICAgICAgIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAiaHR0cDovLyIsICAgNykgPT0gMCkKLSAgICAgICAgICAgICAgICB8fCAoc3RybGVuKHItPmZpbGVuYW1lKSA+IDggJiYKLSAgICAgICAgICAgICAgICAgICAgc3RybmNhc2VjbXAoci0+ZmlsZW5hbWUsICJodHRwczovLyIsICA4KSA9PSAwKQotICAgICAgICAgICAgICAgIHx8IChzdHJsZW4oci0+ZmlsZW5hbWUpID4gOSAmJgotICAgICAgICAgICAgICAgICAgICBzdHJuY2FzZWNtcChyLT5maWxlbmFtZSwgImdvcGhlcjovLyIsIDkpID09IDApCi0gICAgICAgICAgICAgICAgfHwgKHN0cmxlbihyLT5maWxlbmFtZSkgPiA2ICYmCi0gICAgICAgICAgICAgICAgICAgIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAiZnRwOi8vIiwgICAgNikgPT0gMCkKLSAgICAgICAgICAgICAgICB8fCAoc3RybGVuKHItPmZpbGVuYW1lKSA+IDUgJiYKLSAgICAgICAgICAgICAgICAgICAgc3RybmNhc2VjbXAoci0+ZmlsZW5hbWUsICJsZGFwOiIsICAgICA1KSA9PSAwKQotICAgICAgICAgICAgICAgIHx8IChzdHJsZW4oci0+ZmlsZW5hbWUpID4gNSAmJgotICAgICAgICAgICAgICAgICAgICBzdHJuY2FzZWNtcChyLT5maWxlbmFtZSwgIm5ld3M6IiwgICAgIDUpID09IDApCi0gICAgICAgICAgICAgICAgfHwgKHN0cmxlbihyLT5maWxlbmFtZSkgPiA3ICYmCi0gICAgICAgICAgICAgICAgICAgIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAibWFpbHRvOiIsICAgNykgPT0gMCkpIHsKLSAgICAgICAgICAgIC8qIGl0IHdhcyBmaW5hbGx5IHJld3JpdHRlbiB0byBhIHJlbW90ZSBVUkwgKi8KLQotICAgICAgICAgICAgLyogc2tpcCAnc2NoZW1lOicgKi8KLSAgICAgICAgICAgIGZvciAoY3AgPSByLT5maWxlbmFtZTsgKmNwICE9ICc6JyAmJiAqY3AgIT0gJ1wwJzsgY3ArKykKLSAgICAgICAgICAgICAgICA7Ci0gICAgICAgICAgICAvKiBza2lwICc6Ly8nICovCi0gICAgICAgICAgICBjcCArPSAzOwotICAgICAgICAgICAgLyogc2tpcCBob3N0IHBhcnQgKi8KLSAgICAgICAgICAgIGZvciAoIDsgKmNwICE9ICcvJyAmJiAqY3AgIT0gJ1wwJzsgY3ArKykKLSAgICAgICAgICAgICAgICA7Ci0gICAgICAgICAgICBpZiAoKmNwICE9ICdcMCcpIHsKLSAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDEsICJlc2NhcGluZyAlcyBmb3IgcmVkaXJlY3QiLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgY3AyID0gYXBfZXNjYXBlX3VyaShyLT5wb29sLCBjcCk7Ci0gICAgICAgICAgICAgICAgKmNwID0gJ1wwJzsKLSAgICAgICAgICAgICAgICByLT5maWxlbmFtZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgci0+ZmlsZW5hbWUsIGNwMiwgTlVMTCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGFwcGVuZCB0aGUgUVVFUllfU1RSSU5HIHBhcnQgKi8KLSAgICAgICAgICAgIGlmIChyLT5hcmdzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByLT5maWxlbmFtZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgci0+ZmlsZW5hbWUsICI/IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX2VzY2FwZV91cmkoci0+cG9vbCwgci0+YXJncyksIE5VTEwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBkZXRlcm1pbmUgSFRUUCByZWRpcmVjdCByZXNwb25zZSBjb2RlICovCi0gICAgICAgICAgICBpZiAoYXBfaXNfSFRUUF9SRURJUkVDVChyLT5zdGF0dXMpKSB7Ci0gICAgICAgICAgICAgICAgbiA9IHItPnN0YXR1czsKLSAgICAgICAgICAgICAgICByLT5zdGF0dXMgPSBIVFRQX09LOyAvKiBtYWtlIEFwYWNoZSBrZXJuZWwgaGFwcHkgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIG4gPSBSRURJUkVDVDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogbm93IGRvIHRoZSByZWRpcmVjdGlvbiAqLwotICAgICAgICAgICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkxvY2F0aW9uIiwgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAxLCAicmVkaXJlY3QgdG8gJXMgW1JFRElSRUNULyVkXSIsIHItPmZpbGVuYW1lLCBuKTsKLSAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0cmxlbihyLT5maWxlbmFtZSkgPiAxMCAmJgotICAgICAgICAgICAgICAgICBzdHJuY21wKHItPmZpbGVuYW1lLCAiZm9yYmlkZGVuOiIsIDEwKSA9PSAwKSB7Ci0gICAgICAgICAgICAvKiBUaGlzIFVSTHMgaXMgZm9yY2VkIHRvIGJlIGZvcmJpZGRlbiBmb3IgdGhlIHJlcXVlc3RlciAqLwotICAgICAgICAgICAgcmV0dXJuIEZPUkJJRERFTjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdHJsZW4oci0+ZmlsZW5hbWUpID4gNSAmJgotICAgICAgICAgICAgICAgICBzdHJuY21wKHItPmZpbGVuYW1lLCAiZ29uZToiLCA1KSA9PSAwKSB7Ci0gICAgICAgICAgICAvKiBUaGlzIFVSTHMgaXMgZm9yY2VkIHRvIGJlIGdvbmUgKi8KLSAgICAgICAgICAgIHJldHVybiBIVFRQX0dPTkU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RybGVuKHItPmZpbGVuYW1lKSA+IDEyICYmCi0gICAgICAgICAgICAgICAgIHN0cm5jbXAoci0+ZmlsZW5hbWUsICJwYXNzdGhyb3VnaDoiLCAxMikgPT0gMCkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEhhY2sgYmVjYXVzZSBvZiB1bmRlcnBvd2VyZWQgQVBJOiBwYXNzaW5nIHRoZSBjdXJyZW50Ci0gICAgICAgICAgICAgKiByZXdyaXR0ZW4gZmlsZW5hbWUgdGhyb3VnaCB0byBvdGhlciBVUkwtdG8tZmlsZW5hbWUgaGFuZGxlcnMKLSAgICAgICAgICAgICAqIGp1c3QgYXMgaXQgd2VyZSB0aGUgcmVxdWVzdGVkIFVSTC4gVGhpcyBpcyB0byBlbmFibGUKLSAgICAgICAgICAgICAqIHBvc3QtcHJvY2Vzc2luZyBieSBtb2RfYWxpYXMsIGV0Yy4gIHdoaWNoIGFsd2F5cyBhY3Qgb24KLSAgICAgICAgICAgICAqIHItPnVyaSEgVGhlIGRpZmZlcmVuY2UgaGVyZSBpczogV2UgZG8gbm90IHRyeSB0bwotICAgICAgICAgICAgICogYWRkIHRoZSBkb2N1bWVudCByb290Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHItPnVyaSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgci0+ZmlsZW5hbWUrMTIpOwotICAgICAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLyogaXQgd2FzIGZpbmFsbHkgcmV3cml0dGVuIHRvIGEgbG9jYWwgcGF0aCAqLwotCi0gICAgICAgICAgICAvKiBleHBhbmQgIi9+dXNlciIgcHJlZml4ICovCi0jaWYgIWRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKE5FVFdBUkUpCi0gICAgICAgICAgICByLT5maWxlbmFtZSA9IGV4cGFuZF90aWxkZXBhdGhzKHIsIHItPmZpbGVuYW1lKTsKLSNlbmRpZgotICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAyLCAibG9jYWwgcGF0aCByZXN1bHQ6ICVzIiwgci0+ZmlsZW5hbWUpOwotCi0gICAgICAgICAgICAvKiB0aGUgZmlsZW5hbWUgaGFzIHRvIHN0YXJ0IHdpdGggYSBzbGFzaCEgKi8KLSAgICAgICAgICAgIGlmIChyLT5maWxlbmFtZVswXSAhPSAnLycpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1JFUVVFU1Q7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGlmIHRoZXJlIGlzIG5vIHZhbGlkIHByZWZpeCwgd2UgaGF2ZQotICAgICAgICAgICAgICogdG8gZW11bGF0ZSB0aGUgdHJhbnNsYXRvciBmcm9tIHRoZSBjb3JlIGFuZAotICAgICAgICAgICAgICogcHJlZml4IHRoZSBmaWxlbmFtZSB3aXRoIGRvY3VtZW50X3Jvb3QKLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBOT1RJQ0U6Ci0gICAgICAgICAgICAgKiBXZSBjYW5ub3QgbGVhdmUgb3V0IHRoZSBwcmVmaXhfc3RhdCBiZWNhdXNlCi0gICAgICAgICAgICAgKiAtIHdoZW4gd2UgYWx3YXlzIHByZWZpeCB3aXRoIGRvY3VtZW50X3Jvb3QKLSAgICAgICAgICAgICAqICAgdGhlbiBubyBhYnNvbHV0ZSBwYXRoIGNhbiBiZSBjcmVhdGVkLCBlLmcuIHZpYQotICAgICAgICAgICAgICogICBlbXVsYXRpbmcgYSBTY3JpcHRBbGlhcyBkaXJlY3RpdmUsIGV0Yy4KLSAgICAgICAgICAgICAqIC0gd2hlbiB3ZSBhbHdheXMgTk9UIHByZWZpeCB3aXRoIGRvY3VtZW50X3Jvb3QKLSAgICAgICAgICAgICAqICAgdGhlbiB0aGUgZmlsZXMgdW5kZXIgZG9jdW1lbnRfcm9vdCBoYXZlIHRvCi0gICAgICAgICAgICAgKiAgIGJlIHJlZmVyZW5jZXMgZGlyZWN0bHkgYW5kIGRvY3VtZW50X3Jvb3QKLSAgICAgICAgICAgICAqICAgZ2V0cyBuZXZlciB1c2VkIGFuZCB3aWxsIGJlIGEgZHVtbXkgcGFyYW1ldGVyIC0KLSAgICAgICAgICAgICAqICAgdGhpcyBpcyBhbHNvIGJhZAotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIEJVVDoKLSAgICAgICAgICAgICAqIFVuZGVyIHJlYWwgVW5peCBzeXN0ZW1zIHRoaXMgaXMgbm8gcHJvYmxlbSwKLSAgICAgICAgICAgICAqIGJlY2F1c2Ugd2Ugb25seSBkbyBzdGF0KCkgb24gdGhlIGZpcnN0IGRpcmVjdG9yeQotICAgICAgICAgICAgICogYW5kIHRoaXMgZ2V0cyBjYWNoZWQgYnkgdGhlIGtlcm5lbCBmb3IgYWxvbmcgdGltZSEKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbiA9IHByZWZpeF9zdGF0KHItPmZpbGVuYW1lLCAmZmluZm8pOwotICAgICAgICAgICAgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgICAgIGlmICgoY2NwID0gYXBfZG9jdW1lbnRfcm9vdChyKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBsID0gYXBfY3B5c3Rybihkb2Nyb290LCBjY3AsIHNpemVvZihkb2Nyb290KSkgLSBkb2Nyb290OwotCi0gICAgICAgICAgICAgICAgICAgIC8qIGFsd2F5cyBOT1QgaGF2ZSBhIHRyYWlsaW5nIHNsYXNoICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChkb2Nyb290W2wtMV0gPT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb2Nyb290W2wtMV0gPSAnXDAnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyLT5zZXJ2ZXItPnBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICFzdHJuY21wKHItPmZpbGVuYW1lLCByLT5zZXJ2ZXItPnBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5zZXJ2ZXItPnBhdGhsZW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByLT5maWxlbmFtZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgZG9jcm9vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoci0+ZmlsZW5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5zZXJ2ZXItPnBhdGhsZW4pLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCBkb2Nyb290LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5maWxlbmFtZSwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAyLCAicHJlZml4ZWQgd2l0aCBkb2N1bWVudF9yb290IHRvICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXdyaXRlbG9nKHIsIDEsICJnby1haGVhZCB3aXRoICVzIFtPS10iLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJld3JpdGVsb2cociwgMSwgInBhc3MgdGhyb3VnaCAlcyIsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLX0KLQotCi0vKgotKioKLSoqICBNSU1FLXR5cGUgaG9vawotKioKLSoqICBbdXNlZCB0byBzdXBwb3J0IHRoZSBmb3JjZWQtTUlNRS10eXBlIGZlYXR1cmVdCi0qKgotKi8KLQotc3RhdGljIGludCBob29rX21pbWV0eXBlKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvbnN0IGNoYXIgKnQ7Ci0KLSAgICAvKiBub3cgY2hlY2sgaWYgd2UgaGF2ZSB0byBmb3JjZSBhIE1JTUUtdHlwZSAqLwotICAgIHQgPSBhcF90YWJsZV9nZXQoci0+bm90ZXMsIFJFV1JJVEVfRk9SQ0VEX01JTUVUWVBFX05PVEVWQVIpOwotICAgIGlmICh0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcmV3cml0ZWxvZyhyLCAxLCAiZm9yY2UgZmlsZW5hbWUgJXMgdG8gaGF2ZSBNSU1FLXR5cGUgJyVzJyIsCi0gICAgICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUsIHQpOwotICAgICAgICByLT5jb250ZW50X3R5cGUgPSB0OwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotfQotCi0KLS8qCi0qKgotKiogIEZpeHVwIGhvb2sKLSoqCi0qKiAgW3VzZWQgZm9yIHRoZSByZXdyaXRpbmcgZW5naW5lIHRyaWdnZXJlZCBieQotKiogIHRoZSBwZXItZGlyZWN0b3J5ICdSZXdyaXRlUnVsZScgZGlyZWN0aXZlc10KLSoqCi0qLwotCi1zdGF0aWMgaW50IGhvb2tfZml4dXAocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgcmV3cml0ZV9wZXJkaXJfY29uZiAqZGNvbmY7Ci0gICAgY2hhciAqY3A7Ci0gICAgY2hhciAqY3AyOwotICAgIGNvbnN0IGNoYXIgKmNjcDsKLSAgICBjaGFyICpwcmVmaXg7Ci0gICAgaW50IGw7Ci0gICAgaW50IG47Ci0gICAgY2hhciAqb2ZpbGVuYW1lOwotCi0gICAgZGNvbmYgPSAocmV3cml0ZV9wZXJkaXJfY29uZiAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV3cml0ZV9tb2R1bGUpOwotCi0gICAgLyogaWYgdGhlcmUgaXMgbm8gcGVyLWRpciBjb25maWcgd2UgcmV0dXJuIGltbWVkaWF0ZWx5ICovCi0gICAgaWYgKGRjb25mID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qIHdlIHNob3VsZG4ndCBkbyBhbnl0aGluZyBpbiBzdWJyZXF1ZXN0cyAqLwotICAgIGlmIChyLT5tYWluICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qIGlmIHRoZXJlIGFyZSBubyByZWFsIChpLmUuIG5vIFJld3JpdGVSdWxlIGRpcmVjdGl2ZXMhKQotICAgICAgIHBlci1kaXIgY29uZmlnIG9mIHVzLCB3ZSByZXR1cm4gYWxzbyBpbW1lZGlhdGVseSAqLwotICAgIGlmIChkY29uZi0+ZGlyZWN0b3J5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIG9ubHkgZG8gc29tZXRoaW5nIHVuZGVyIHJ1bnRpbWUgaWYgdGhlIGVuZ2luZSBpcyByZWFsbHkgZW5hYmxlZCwKLSAgICAgKiAgZm9yIHRoaXMgZGlyZWN0b3J5LCBlbHNlIHJldHVybiBpbW1lZGlhdGVseSEKLSAgICAgKi8KLSAgICBpZiAoIShhcF9hbGxvd19vcHRpb25zKHIpICYgKE9QVF9TWU1fTElOS1MgfCBPUFRfU1lNX09XTkVSKSkpIHsKLSAgICAgICAgLyogRm9sbG93U3ltTGlua3MgaXMgbWFuZGF0b3J5ISAqLwotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAgIk9wdGlvbnMgRm9sbG93U3ltTGlua3Mgb3IgU3ltTGlua3NJZk93bmVyTWF0Y2ggaXMgb2ZmICIKLSAgICAgICAgICAgICAgICAgICAgICJ3aGljaCBpbXBsaWVzIHRoYXQgUmV3cml0ZVJ1bGUgZGlyZWN0aXZlIGlzIGZvcmJpZGRlbjogIgotICAgICAgICAgICAgICAgICAgICAgIiVzIiwgci0+ZmlsZW5hbWUpOwotICAgICAgICByZXR1cm4gRk9SQklEREVOOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogRm9sbG93U3ltTGlua3MgaXMgZ2l2ZW4sIGJ1dCB0aGUgdXNlciBjYW4KLSAgICAgICAgICogc3RpbGwgdHVybiBvZmYgdGhlIHJld3JpdGluZyBlbmdpbmUKLSAgICAgICAgICovCi0gICAgICAgIGlmIChkY29uZi0+c3RhdGUgPT0gRU5HSU5FX0RJU0FCTEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqICByZW1lbWJlciB0aGUgY3VycmVudCBmaWxlbmFtZSBiZWZvcmUgcmV3cml0aW5nIGZvciBsYXRlciBjaGVjawotICAgICAqICB0byBwcmV2ZW50IGRlYWRsb29waW5nIGJlY2F1c2Ugb2YgaW50ZXJuYWwgcmVkaXJlY3RzCi0gICAgICogIG9uIGZpbmFsIFVSTC9maWxlbmFtZSB3aGljaCBjYW4gYmUgZXF1YWwgdG8gdGhlIGluaXRhbCBvbmUuCi0gICAgICovCi0gICAgb2ZpbGVuYW1lID0gci0+ZmlsZW5hbWU7Ci0KLSAgICAvKgotICAgICAqICBub3cgYXBwbHkgdGhlIHJ1bGVzIC4uLgotICAgICAqLwotICAgIGlmIChhcHBseV9yZXdyaXRlX2xpc3QociwgZGNvbmYtPnJld3JpdGVydWxlcywgZGNvbmYtPmRpcmVjdG9yeSkpIHsKLQotICAgICAgICBpZiAoc3RybGVuKHItPmZpbGVuYW1lKSA+IDYgJiYKLSAgICAgICAgICAgIHN0cm5jbXAoci0+ZmlsZW5hbWUsICJwcm94eToiLCA2KSA9PSAwKSB7Ci0gICAgICAgICAgICAvKiBpdCBzaG91bGQgZ28gb24gYXMgYW4gaW50ZXJuYWwgcHJveHkgcmVxdWVzdCAqLwotCi0gICAgICAgICAgICAvKiBtYWtlIHN1cmUgdGhlIFFVRVJZX1NUUklORyBhbmQKLSAgICAgICAgICAgICAqIFBBVEhfSU5GTyBwYXJ0cyBnZXQgaW5jb3Jwb3JhdGVkCi0gICAgICAgICAgICAgKiAoci0+cGF0aF9pbmZvIHdhcyBhbHJlYWR5IGFwcGVuZGVkIGJ5IHRoZQotICAgICAgICAgICAgICogcmV3cml0aW5nIGVuZ2luZSBiZWNhdXNlIG9mIHRoZSBwZXItZGlyIGNvbnRleHQhKQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoci0+YXJncyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHItPmZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPyIsIHItPmFyZ3MsIE5VTEwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBub3cgbWFrZSBzdXJlIHRoZSByZXF1ZXN0IGdldHMgaGFuZGxlZCBieSB0aGUgcHJveHkgaGFuZGxlciAqLwotICAgICAgICAgICAgci0+cHJveHlyZXEgPSAxOwotICAgICAgICAgICAgci0+aGFuZGxlciAgPSAicHJveHktc2VydmVyIjsKLQotICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAxLCAiW3Blci1kaXIgJXNdIGdvLWFoZWFkIHdpdGggcHJveHkgcmVxdWVzdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICIlcyBbT0tdIiwgZGNvbmYtPmRpcmVjdG9yeSwgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCAgKHN0cmxlbihyLT5maWxlbmFtZSkgPiA3ICYmCi0gICAgICAgICAgICAgICAgICAgIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAiaHR0cDovLyIsICAgNykgPT0gMCkKLSAgICAgICAgICAgICAgICB8fCAoc3RybGVuKHItPmZpbGVuYW1lKSA+IDggJiYgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAiaHR0cHM6Ly8iLCAgOCkgPT0gMCkKLSAgICAgICAgICAgICAgICB8fCAoc3RybGVuKHItPmZpbGVuYW1lKSA+IDkgJiYKLSAgICAgICAgICAgICAgICAgICAgc3RybmNhc2VjbXAoci0+ZmlsZW5hbWUsICJnb3BoZXI6Ly8iLCA5KSA9PSAwKQotICAgICAgICAgICAgICAgIHx8IChzdHJsZW4oci0+ZmlsZW5hbWUpID4gNiAmJgotICAgICAgICAgICAgICAgICAgICBzdHJuY2FzZWNtcChyLT5maWxlbmFtZSwgImZ0cDovLyIsICAgIDYpID09IDApCi0gICAgICAgICAgICAgICAgfHwgKHN0cmxlbihyLT5maWxlbmFtZSkgPiA1ICYmCi0gICAgICAgICAgICAgICAgICAgIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAibGRhcDoiLCAgICAgNSkgPT0gMCkKLSAgICAgICAgICAgICAgICB8fCAoc3RybGVuKHItPmZpbGVuYW1lKSA+IDUgJiYKLSAgICAgICAgICAgICAgICAgICAgc3RybmNhc2VjbXAoci0+ZmlsZW5hbWUsICJuZXdzOiIsICAgICA1KSA9PSAwKQotICAgICAgICAgICAgICAgIHx8IChzdHJsZW4oci0+ZmlsZW5hbWUpID4gNyAmJgotICAgICAgICAgICAgICAgICAgICBzdHJuY2FzZWNtcChyLT5maWxlbmFtZSwgIm1haWx0bzoiLCAgIDcpID09IDApKSB7Ci0gICAgICAgICAgICAvKiBpdCB3YXMgZmluYWxseSByZXdyaXR0ZW4gdG8gYSByZW1vdGUgVVJMICovCi0KLSAgICAgICAgICAgIC8qIGJlY2F1c2Ugd2UgYXJlIGluIGEgcGVyLWRpciBjb250ZXh0Ci0gICAgICAgICAgICAgKiBmaXJzdCB0cnkgdG8gcmVwbGFjZSB0aGUgZGlyZWN0b3J5IHdpdGggaXRzIGJhc2UtVVJMCi0gICAgICAgICAgICAgKiBpZiB0aGVyZSBpcyBhIGJhc2UtVVJMIGF2YWlsYWJsZQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoZGNvbmYtPmJhc2V1cmwgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIC8qIHNraXAgJ3NjaGVtZTonICovCi0gICAgICAgICAgICAgICAgZm9yIChjcCA9IHItPmZpbGVuYW1lOyAqY3AgIT0gJzonICYmICpjcCAhPSAnXDAnOyBjcCsrKQotICAgICAgICAgICAgICAgICAgICA7Ci0gICAgICAgICAgICAgICAgLyogc2tpcCAnOi8vJyAqLwotICAgICAgICAgICAgICAgIGNwICs9IDM7Ci0gICAgICAgICAgICAgICAgaWYgKChjcCA9IHN0cmNocihjcCwgJy8nKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltwZXItZGlyICVzXSB0cnlpbmcgdG8gcmVwbGFjZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZWZpeCAlcyB3aXRoICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY29uZi0+ZGlyZWN0b3J5LCBkY29uZi0+ZGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjb25mLT5iYXNldXJsKTsKLSAgICAgICAgICAgICAgICAgICAgY3AyID0gc3Vic3RfcHJlZml4X3BhdGgociwgY3AsIGRjb25mLT5kaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjb25mLT5iYXNldXJsKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChjcDIsIGNwKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqY3AgPSAnXDAnOwotICAgICAgICAgICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHItPmZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwMiwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIG5vdyBwcmVwYXJlIHRoZSByZWRpcmVjdC4uLiAqLwotCi0gICAgICAgICAgICAvKiBza2lwICdzY2hlbWU6JyAqLwotICAgICAgICAgICAgZm9yIChjcCA9IHItPmZpbGVuYW1lOyAqY3AgIT0gJzonICYmICpjcCAhPSAnXDAnOyBjcCsrKQotICAgICAgICAgICAgICAgIDsKLSAgICAgICAgICAgIC8qIHNraXAgJzovLycgKi8KLSAgICAgICAgICAgIGNwICs9IDM7Ci0gICAgICAgICAgICAvKiBza2lwIGhvc3QgcGFydCAqLwotICAgICAgICAgICAgZm9yICggOyAqY3AgIT0gJy8nICYmICpjcCAhPSAnXDAnOyBjcCsrKQotICAgICAgICAgICAgICAgIDsKLSAgICAgICAgICAgIGlmICgqY3AgIT0gJ1wwJykgewotICAgICAgICAgICAgICAgIHJld3JpdGVsb2cociwgMSwgIltwZXItZGlyICVzXSBlc2NhcGluZyAlcyBmb3IgcmVkaXJlY3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNvbmYtPmRpcmVjdG9yeSwgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIGNwMiA9IGFwX2VzY2FwZV91cmkoci0+cG9vbCwgY3ApOwotICAgICAgICAgICAgICAgICpjcCA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHItPmZpbGVuYW1lLCBjcDIsIE5VTEwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBhcHBlbmQgdGhlIFFVRVJZX1NUUklORyBwYXJ0ICovCi0gICAgICAgICAgICBpZiAoci0+YXJncyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHItPmZpbGVuYW1lLCAiPyIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9lc2NhcGVfdXJpKHItPnBvb2wsIHItPmFyZ3MpLCBOVUxMKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogZGV0ZXJtaW5lIEhUVFAgcmVkaXJlY3QgcmVzcG9uc2UgY29kZSAqLwotICAgICAgICAgICAgaWYgKGFwX2lzX0hUVFBfUkVESVJFQ1Qoci0+c3RhdHVzKSkgewotICAgICAgICAgICAgICAgIG4gPSByLT5zdGF0dXM7Ci0gICAgICAgICAgICAgICAgci0+c3RhdHVzID0gSFRUUF9PSzsgLyogbWFrZSBBcGFjaGUga2VybmVsIGhhcHB5ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBuID0gUkVESVJFQ1Q7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIG5vdyBkbyB0aGUgcmVkaXJlY3Rpb24gKi8KLSAgICAgICAgICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJMb2NhdGlvbiIsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgICAgIHJld3JpdGVsb2cociwgMSwgIltwZXItZGlyICVzXSByZWRpcmVjdCB0byAlcyBbUkVESVJFQ1QvJWRdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgZGNvbmYtPmRpcmVjdG9yeSwgci0+ZmlsZW5hbWUsIG4pOwotICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RybGVuKHItPmZpbGVuYW1lKSA+IDEwICYmCi0gICAgICAgICAgICAgICAgIHN0cm5jbXAoci0+ZmlsZW5hbWUsICJmb3JiaWRkZW46IiwgMTApID09IDApIHsKLSAgICAgICAgICAgIC8qIFRoaXMgVVJMIGlzIGZvcmNlZCB0byBiZSBmb3JiaWRkZW4gZm9yIHRoZSByZXF1ZXN0ZXIgKi8KLSAgICAgICAgICAgIHJldHVybiBGT1JCSURERU47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RybGVuKHItPmZpbGVuYW1lKSA+IDUgJiYKLSAgICAgICAgICAgICAgICAgc3RybmNtcChyLT5maWxlbmFtZSwgImdvbmU6IiwgNSkgPT0gMCkgewotICAgICAgICAgICAgLyogVGhpcyBVUkwgaXMgZm9yY2VkIHRvIGJlIGdvbmUgKi8KLSAgICAgICAgICAgIHJldHVybiBIVFRQX0dPTkU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiBpdCB3YXMgZmluYWxseSByZXdyaXR0ZW4gdG8gYSBsb2NhbCBwYXRoICovCi0KLSAgICAgICAgICAgIC8qIGlmIHNvbWVvbmUgdXNlZCB0aGUgUEFTU1RIUk9VR0ggZmxhZyBpbiBwZXItZGlyCi0gICAgICAgICAgICAgKiBjb250ZXh0IHdlIGp1c3QgaWdub3JlIGl0LiBJdCBpcyBvbmx5IHVzZWZ1bAotICAgICAgICAgICAgICogaW4gcGVyLXNlcnZlciBjb250ZXh0Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChzdHJsZW4oci0+ZmlsZW5hbWUpID4gMTIgJiYKLSAgICAgICAgICAgICAgICBzdHJuY21wKHItPmZpbGVuYW1lLCAicGFzc3Rocm91Z2g6IiwgMTIpID09IDApIHsKLSAgICAgICAgICAgICAgICByLT5maWxlbmFtZSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgci0+ZmlsZW5hbWUrMTIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiB0aGUgZmlsZW5hbWUgaGFzIHRvIHN0YXJ0IHdpdGggYSBzbGFzaCEgKi8KLSAgICAgICAgICAgIGlmIChyLT5maWxlbmFtZVswXSAhPSAnLycpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1JFUVVFU1Q7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIENoZWNrIGZvciBkZWFkbG9vcGluZzoKLSAgICAgICAgICAgICAqIEF0IHRoaXMgcG9pbnQgd2UgS05PVyB0aGF0IGF0IGxlYXN0IG9uZSByZXdyaXRpbmcKLSAgICAgICAgICAgICAqIHJ1bGUgd2FzIGFwcGxpZWQsIGJ1dCB3aGVuIHRoZSByZXN1bHRpbmcgVVJMIGlzCi0gICAgICAgICAgICAgKiB0aGUgc2FtZSBhcyB0aGUgaW5pdGlhbCBVUkwsIHdlIGFyZSBub3QgYWxsb3dlZCB0bwotICAgICAgICAgICAgICogdXNlIHRoZSBmb2xsb3dpbmcgaW50ZXJuYWwgcmVkaXJlY3Rpb24gc3R1ZmYgYmVjYXVzZQotICAgICAgICAgICAgICogdGhpcyB3b3VsZCBsZWFkIHRvIGEgZGVhZGxvb3AuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChzdHJjbXAoci0+ZmlsZW5hbWUsIG9maWxlbmFtZSkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJld3JpdGVsb2cociwgMSwgIltwZXItZGlyICVzXSBpbml0aWFsIFVSTCBlcXVhbCByZXdyaXR0ZW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVSTDogJXMgW0lHTk9SSU5HIFJFV1JJVEVdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjb25mLT5kaXJlY3RvcnksIHItPmZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGlmIHRoZXJlIGlzIGEgdmFsaWQgYmFzZS1VUkwgdGhlbiBzdWJzdGl0dXRlCi0gICAgICAgICAgICAgKiB0aGUgcGVyLWRpciBwcmVmaXggd2l0aCB0aGlzIGJhc2UtVVJMIGlmIHRoZQotICAgICAgICAgICAgICogY3VycmVudCBmaWxlbmFtZSBzdGlsbCBpcyBpbnNpZGUgdGhpcyBwZXItZGlyCi0gICAgICAgICAgICAgKiBjb250ZXh0LiBJZiBub3QgdGhlbiB0cmVhdCB0aGUgcmVzdWx0IGFzIGEKLSAgICAgICAgICAgICAqIHBsYWluIFVSTAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoZGNvbmYtPmJhc2V1cmwgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJld3JpdGVsb2cociwgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJbcGVyLWRpciAlc10gdHJ5aW5nIHRvIHJlcGxhY2UgcHJlZml4ICVzIHdpdGggJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNvbmYtPmRpcmVjdG9yeSwgZGNvbmYtPmRpcmVjdG9yeSwgZGNvbmYtPmJhc2V1cmwpOwotICAgICAgICAgICAgICAgIHItPmZpbGVuYW1lID0gc3Vic3RfcHJlZml4X3BhdGgociwgci0+ZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY29uZi0+ZGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNvbmYtPmJhc2V1cmwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogaWYgbm8gZXhwbGljaXQgYmFzZS1VUkwgZXhpc3RzIHdlIGFzc3VtZQotICAgICAgICAgICAgICAgICAqIHRoYXQgdGhlIGRpcmVjdG9yeSBwcmVmaXggaXMgYWxzbyBhIHZhbGlkIFVSTAotICAgICAgICAgICAgICAgICAqIGZvciB0aGlzIHdlYnNlcnZlciBhbmQgb25seSB0cnkgdG8gcmVtb3ZlIHRoZQotICAgICAgICAgICAgICAgICAqIGRvY3VtZW50X3Jvb3QgaWYgaXQgaXMgcHJlZml4Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKChjY3AgPSBhcF9kb2N1bWVudF9yb290KHIpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGFwX3BzdHJkdXAoci0+cG9vbCwgY2NwKTsKLSAgICAgICAgICAgICAgICAgICAgLyogYWx3YXlzIE5PVCBoYXZlIGEgdHJhaWxpbmcgc2xhc2ggKi8KLSAgICAgICAgICAgICAgICAgICAgbCA9IHN0cmxlbihwcmVmaXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJlZml4W2wtMV0gPT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhbbC0xXSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsLS07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cm5jbXAoci0+ZmlsZW5hbWUsIHByZWZpeCwgbCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW3Blci1kaXIgJXNdIHN0cmlwIGRvY3VtZW50X3Jvb3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlZml4OiAlcyAtPiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjb25mLT5kaXJlY3RvcnksIHItPmZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5maWxlbmFtZStsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmR1cChyLT5wb29sLCByLT5maWxlbmFtZStsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogbm93IGluaXRpYXRlIHRoZSBpbnRlcm5hbCByZWRpcmVjdCAqLwotICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAxLCAiW3Blci1kaXIgJXNdIGludGVybmFsIHJlZGlyZWN0IHdpdGggJXMgIgotICAgICAgICAgICAgICAgICAgICAgICAiW0lOVEVSTkFMIFJFRElSRUNUXSIsIGRjb25mLT5kaXJlY3RvcnksIHItPmZpbGVuYW1lKTsKLSAgICAgICAgICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCAicmVkaXJlY3Q6Iiwgci0+ZmlsZW5hbWUsIE5VTEwpOwotICAgICAgICAgICAgci0+aGFuZGxlciA9ICJyZWRpcmVjdC1oYW5kbGVyIjsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcmV3cml0ZWxvZyhyLCAxLCAiW3Blci1kaXIgJXNdIHBhc3MgdGhyb3VnaCAlcyIsIAotICAgICAgICAgICAgICAgICAgIGRjb25mLT5kaXJlY3RvcnksIHItPmZpbGVuYW1lKTsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLX0KLQotCi0vKgotKioKLSoqICBDb250ZW50LUhhbmRsZXJzCi0qKgotKiogIFt1c2VkIGZvciByZWRpcmVjdCBzdXBwb3J0XQotKioKLSovCi0KLXN0YXRpYyBpbnQgaGFuZGxlcl9yZWRpcmVjdChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICAvKiBqdXN0IG1ha2Ugc3VyZSB0aGF0IHdlIGFyZSByZWFsbHkgbWVhbnQhICovCi0gICAgaWYgKHN0cm5jbXAoci0+ZmlsZW5hbWUsICJyZWRpcmVjdDoiLCA5KSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICAvKiBub3cgZG8gdGhlIGludGVybmFsIHJlZGlyZWN0ICovCi0gICAgYXBfaW50ZXJuYWxfcmVkaXJlY3QoYXBfcHN0cmNhdChyLT5wb29sLCByLT5maWxlbmFtZSs5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+YXJncyA/ICI/IiA6IE5VTEwsIHItPmFyZ3MsIE5VTEwpLCByKTsKLQotICAgIC8qIGFuZCByZXR1cm4gZ3JhY2VmdWxseSAqLwotICAgIHJldHVybiBPSzsKLX0KLQotCi0vKgotKiogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSoqIHwgICAgICAgICAgICAgICAgICB0aGUgcmV3cml0aW5nIGVuZ2luZQotKiogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi0KLS8qCi0gKiAgQXBwbHkgYSBjb21wbGV0ZSBydWxlIHNldCwKLSAqICBpLmUuIGEgbGlzdCBvZiByZXdyaXRlIHJ1bGVzCi0gKi8KLXN0YXRpYyBpbnQgYXBwbHlfcmV3cml0ZV9saXN0KHJlcXVlc3RfcmVjICpyLCBhcF9hcnJheV9oZWFkZXJfdCAqcmV3cml0ZXJ1bGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGVyZGlyKQotewotICAgIHJld3JpdGVydWxlX2VudHJ5ICplbnRyaWVzOwotICAgIHJld3JpdGVydWxlX2VudHJ5ICpwOwotICAgIGludCBpOwotICAgIGludCBjaGFuZ2VkOwotICAgIGludCByYzsKLSAgICBpbnQgczsKLQotICAgIC8qCi0gICAgICogIEl0ZXJhdGUgb3ZlciBhbGwgZXhpc3RpbmcgcnVsZXMKLSAgICAgKi8KLSAgICBlbnRyaWVzID0gKHJld3JpdGVydWxlX2VudHJ5ICopcmV3cml0ZXJ1bGVzLT5lbHRzOwotICAgIGNoYW5nZWQgPSAwOwotICAgIGxvb3A6Ci0gICAgZm9yIChpID0gMDsgaSA8IHJld3JpdGVydWxlcy0+bmVsdHM7IGkrKykgewotICAgICAgICBwID0gJmVudHJpZXNbaV07Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogIElnbm9yZSB0aGlzIHJ1bGUgb24gc3VicmVxdWVzdHMgaWYgd2UgYXJlIGV4cGxpY2l0bHkKLSAgICAgICAgICogIGFza2VkIHRvIGRvIHNvIG9yIHRoaXMgaXMgYSBwcm94eS10aHJvdWdocHV0IG9yIGEKLSAgICAgICAgICogIGZvcmNlZCByZWRpcmVjdCBydWxlLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHItPm1haW4gIT0gTlVMTCAmJgotICAgICAgICAgICAgKHAtPmZsYWdzICYgUlVMRUZMQUdfSUdOT1JFT05TVUJSRVEgfHwKLSAgICAgICAgICAgICBwLT5mbGFncyAmIFJVTEVGTEFHX1BST1hZICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgcC0+ZmxhZ3MgJiBSVUxFRkxBR19GT1JDRVJFRElSRUNUICAgICkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogIEFwcGx5IHRoZSBjdXJyZW50IHJ1bGUuCi0gICAgICAgICAqLwotICAgICAgICByYyA9IGFwcGx5X3Jld3JpdGVfcnVsZShyLCBwLCBwZXJkaXIpOwotICAgICAgICBpZiAocmMpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiAgSW5kaWNhdGUgYSBjaGFuZ2UgaWYgdGhpcyB3YXMgbm90IGEgbWF0Y2gtb25seSBydWxlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocmMgIT0gMikgewotICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogIFBhc3MtVGhyb3VnaCBGZWF0dXJlIChgUmV3cml0ZVJ1bGUgLi4gLi4gW1BUXScpOgotICAgICAgICAgICAgICogIEJlY2F1c2UgdGhlIEFwYWNoZSAxLnggQVBJIGlzIHZlcnkgbGltaXRlZCB3ZQotICAgICAgICAgICAgICogIG5lZWQgdGhpcyBoYWNrIHRvIHBhc3MgdGhlIHJld3JpdHRlbiBVUkwgdG8gb3RoZXIKLSAgICAgICAgICAgICAqICBtb2R1bGVzIGxpa2UgbW9kX2FsaWFzLCBtb2RfdXNlcmRpciwgZXRjLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocC0+ZmxhZ3MgJiBSVUxFRkxBR19QQVNTVEhST1VHSCkgewotICAgICAgICAgICAgICAgIHJld3JpdGVsb2cociwgMiwgImZvcmNpbmcgJyVzJyB0byBnZXQgcGFzc2VkIHRocm91Z2ggIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIG5leHQgQVBJIFVSSS10by1maWxlbmFtZSBoYW5kbGVyIiwgci0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCAicGFzc3Rocm91Z2g6IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUsIE5VTEwpOwotICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogIFJ1bGUgaGFzIHRoZSAiZm9yYmlkZGVuIiBmbGFnIHNldCB3aGljaCBtZWFucyB0aGF0Ci0gICAgICAgICAgICAgKiAgd2Ugc3RvcCBwcm9jZXNzaW5nIGFuZCBpbmRpY2F0ZSB0aGlzIHRvIHRoZSBjYWxsZXIuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChwLT5mbGFncyAmIFJVTEVGTEFHX0ZPUkJJRERFTikgewotICAgICAgICAgICAgICAgIHJld3JpdGVsb2cociwgMiwgImZvcmNpbmcgJyVzJyB0byBiZSBmb3JiaWRkZW4iLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsICJmb3JiaWRkZW46IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUsIE5VTEwpOwotICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogIFJ1bGUgaGFzIHRoZSAiZ29uZSIgZmxhZyBzZXQgd2hpY2ggbWVhbnMgdGhhdAotICAgICAgICAgICAgICogIHdlIHN0b3AgcHJvY2Vzc2luZyBhbmQgaW5kaWNhdGUgdGhpcyB0byB0aGUgY2FsbGVyLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocC0+ZmxhZ3MgJiBSVUxFRkxBR19HT05FKSB7Ci0gICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAyLCAiZm9yY2luZyAnJXMnIHRvIGJlIGdvbmUiLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsICJnb25lOiIsIHItPmZpbGVuYW1lLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBjaGFuZ2VkID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqICBTdG9wIHByb2Nlc3NpbmcgYWxzbyBvbiBwcm94eSBwYXNzLXRocm91Z2ggYW5kCi0gICAgICAgICAgICAgKiAgbGFzdC1ydWxlIGFuZCBuZXctcm91bmQgZmxhZ3MuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChwLT5mbGFncyAmIFJVTEVGTEFHX1BST1hZKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocC0+ZmxhZ3MgJiBSVUxFRkxBR19MQVNUUlVMRSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogIE9uICJuZXctcm91bmQiIGZsYWcgd2UganVzdCBzdGFydCBmcm9tIHRoZSB0b3Agb2YKLSAgICAgICAgICAgICAqICB0aGUgcmV3cml0aW5nIHJ1bGVzZXQgYWdhaW4uCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChwLT5mbGFncyAmIFJVTEVGTEFHX05FV1JPVU5EKSB7Ci0gICAgICAgICAgICAgICAgZ290byBsb29wOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogIElmIHdlIGFyZSBmb3JjZWQgdG8gc2tpcCBOIG5leHQgcnVsZXMsIGRvIGl0IG5vdy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHAtPnNraXAgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcyA9IHAtPnNraXA7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCAgIGkgPCByZXdyaXRlcnVsZXMtPm5lbHRzCi0gICAgICAgICAgICAgICAgICAgICAgICYmIHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgcCA9ICZlbnRyaWVzW2ldOwotICAgICAgICAgICAgICAgICAgICBzLS07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqICBJZiBjdXJyZW50IHJ1bGUgaXMgY2hhaW5lZCB3aXRoIG5leHQgcnVsZShzKSwKLSAgICAgICAgICAgICAqICBza2lwIGFsbCB0aGlzIG5leHQgcnVsZShzKQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICB3aGlsZSAoICAgaSA8IHJld3JpdGVydWxlcy0+bmVsdHMKLSAgICAgICAgICAgICAgICAgICAmJiBwLT5mbGFncyAmIFJVTEVGTEFHX0NIQUlOKSB7Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIHAgPSAmZW50cmllc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gY2hhbmdlZDsKLX0KLQotLyoKLSAqICBBcHBseSBhIHNpbmdsZSghKSByZXdyaXRlIHJ1bGUKLSAqLwotc3RhdGljIGludCBhcHBseV9yZXdyaXRlX3J1bGUocmVxdWVzdF9yZWMgKnIsIHJld3JpdGVydWxlX2VudHJ5ICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGVyZGlyKQotewotICAgIGNoYXIgKnVyaTsKLSAgICBjaGFyICpvdXRwdXQ7Ci0gICAgY29uc3QgY2hhciAqdmFyeTsKLSAgICBjaGFyIG5ld3VyaVtNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciBlbnZbTUFYX1NUUklOR19MRU5dOwotICAgIHJlZ2V4X3QgKnJlZ2V4cDsKLSAgICByZWdtYXRjaF90IHJlZ21hdGNoW01BWF9OTUFUQ0hdOwotICAgIGJhY2tyZWZpbmZvICpicmlSUiA9IE5VTEw7Ci0gICAgYmFja3JlZmluZm8gKmJyaVJDID0gTlVMTDsKLSAgICBpbnQgcHJlZml4c3RyaXA7Ci0gICAgaW50IGZhaWxlZDsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqcmV3cml0ZWNvbmRzOwotICAgIHJld3JpdGVjb25kX2VudHJ5ICpjb25kczsKLSAgICByZXdyaXRlY29uZF9lbnRyeSAqYzsKLSAgICBpbnQgaTsKLSAgICBpbnQgcmM7Ci0KLSAgICAvKgotICAgICAqICBJbml0aWFsaXNhdGlvbgotICAgICAqLwotICAgIHVyaSAgICAgPSByLT5maWxlbmFtZTsKLSAgICByZWdleHAgID0gcC0+cmVnZXhwOwotICAgIG91dHB1dCAgPSBwLT5vdXRwdXQ7Ci0KLSAgICAvKgotICAgICAqICBBZGQgKHBlcmhhcHMgc3BsaXR0ZWQgYXdheSkgUEFUSF9JTkZPIHBvc3RmaXggdG8gVVJMIHRvCi0gICAgICogIG1ha2Ugc3VyZSB3ZSByZWFsbHkgbWF0Y2ggYWdhaW5zdCB0aGUgY29tcGxldGUgVVJMLgotICAgICAqLwotICAgIGlmIChwZXJkaXIgIT0gTlVMTCAmJiByLT5wYXRoX2luZm8gIT0gTlVMTCAmJiByLT5wYXRoX2luZm9bMF0gIT0gJ1wwJykgewotICAgICAgICByZXdyaXRlbG9nKHIsIDMsICJbcGVyLWRpciAlc10gYWRkIHBhdGggaW5mbyBwb3N0Zml4OiAlcyAtPiAlcyVzIiwKLSAgICAgICAgICAgICAgICAgICBwZXJkaXIsIHVyaSwgdXJpLCByLT5wYXRoX2luZm8pOwotICAgICAgICB1cmkgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHVyaSwgci0+cGF0aF9pbmZvLCBOVUxMKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICBPbiBwZXItZGlyZWN0b3J5IGNvbnRleHQgKC5odGFjY2Vzcykgc3RyaXAgdGhlIGxvY2F0aW9uCi0gICAgICogIHByZWZpeCBmcm9tIHRoZSBVUkwgdG8gbWFrZSBzdXJlIHBhdHRlcm5zIGFwcGx5IG9ubHkgdG8KLSAgICAgKiAgdGhlIGxvY2FsIHBhcnQuICBBZGRpdGlvbmFsbHkgaW5kaWNhdGUgdGhpcyBzcGVjaWFsCi0gICAgICogIHRocmVhdG1lbnQgaW4gdGhlIGxvZ2ZpbGUuCi0gICAgICovCi0gICAgcHJlZml4c3RyaXAgPSAwOwotICAgIGlmIChwZXJkaXIgIT0gTlVMTCkgewotICAgICAgICBpZiAoICAgc3RybGVuKHVyaSkgPj0gc3RybGVuKHBlcmRpcikKLSAgICAgICAgICAgICYmIHN0cm5jbXAodXJpLCBwZXJkaXIsIHN0cmxlbihwZXJkaXIpKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXdyaXRlbG9nKHIsIDMsICJbcGVyLWRpciAlc10gc3RyaXAgcGVyLWRpciBwcmVmaXg6ICVzIC0+ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgcGVyZGlyLCB1cmksIHVyaStzdHJsZW4ocGVyZGlyKSk7Ci0gICAgICAgICAgICB1cmkgPSB1cmkrc3RybGVuKHBlcmRpcik7Ci0gICAgICAgICAgICBwcmVmaXhzdHJpcCA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqICBUcnkgdG8gbWF0Y2ggdGhlIFVSSSBhZ2FpbnN0IHRoZSBSZXdyaXRlUnVsZSBwYXR0ZXJuCi0gICAgICogIGFuZCBleGl0IGltbWVkZGlhdGVseSBpZiBpdCBkaWRuJ3QgYXBwbHkuCi0gICAgICovCi0gICAgaWYgKHBlcmRpciA9PSBOVUxMKSB7Ci0gICAgICAgIHJld3JpdGVsb2cociwgMywgImFwcGx5aW5nIHBhdHRlcm4gJyVzJyB0byB1cmkgJyVzJyIsCi0gICAgICAgICAgICAgICAgICAgcC0+cGF0dGVybiwgdXJpKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJld3JpdGVsb2cociwgMywgIltwZXItZGlyICVzXSBhcHBseWluZyBwYXR0ZXJuICclcycgdG8gdXJpICclcyciLAotICAgICAgICAgICAgICAgICAgIHBlcmRpciwgcC0+cGF0dGVybiwgdXJpKTsKLSAgICB9Ci0gICAgcmMgPSAoYXBfcmVnZXhlYyhyZWdleHAsIHVyaSwgcmVnZXhwLT5yZV9uc3ViKzEsIHJlZ21hdGNoLCAwKSA9PSAwKTsKLSAgICBpZiAoISAoKCByYyAmJiAhKHAtPmZsYWdzICYgUlVMRUZMQUdfTk9UTUFUQ0gpKSB8fAotICAgICAgICAgICAoIXJjICYmICAocC0+ZmxhZ3MgJiBSVUxFRkxBR19OT1RNQVRDSCkpICAgKSApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgRWxzZSBjcmVhdGUgdGhlIFJld3JpdGVSdWxlIGByZWdzdWJpbmZvJyBzdHJ1Y3R1cmUgd2hpY2gKLSAgICAgKiAgaG9sZHMgdGhlIHN1YnN0aXR1dGlvbiBpbmZvcm1hdGlvbi4KLSAgICAgKi8KLSAgICBicmlSUiA9IChiYWNrcmVmaW5mbyAqKWFwX3BhbGxvYyhyLT5wb29sLCBzaXplb2YoYmFja3JlZmluZm8pKTsKLSAgICBpZiAoIXJjICYmIChwLT5mbGFncyAmIFJVTEVGTEFHX05PVE1BVENIKSkgewotICAgICAgICAvKiAgZW1wdHkgaW5mbyBvbiBuZWdhdGl2ZSBwYXR0ZXJucyAgKi8KLSAgICAgICAgYnJpUlItPnNvdXJjZSA9ICIiOwotICAgICAgICBicmlSUi0+bnN1YiAgID0gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGJyaVJSLT5zb3VyY2UgPSBhcF9wc3RyZHVwKHItPnBvb2wsIHVyaSk7Ci0gICAgICAgIGJyaVJSLT5uc3ViICAgPSByZWdleHAtPnJlX25zdWI7Ci0gICAgICAgIG1lbWNweSgodm9pZCAqKShicmlSUi0+cmVnbWF0Y2gpLCAodm9pZCAqKShyZWdtYXRjaCksCi0gICAgICAgICAgICAgICBzaXplb2YocmVnbWF0Y2gpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICBJbml0aWFsbGFsbHkgY3JlYXRlIHRoZSBSZXdyaXRlQ29uZCBiYWNrcmVmaW5mbyB3aXRoCi0gICAgICogIGVtcHR5IGJhY2tyZWZpbmZvLCBpLmUuIG5vdCBzdWJzdCBwYXJ0cwotICAgICAqICAodGhpcyBvbmUgaXMgYWRqdXN0ZWQgaW5zaWRlIGFwcGx5X3Jld3JpdGVfY29uZCgpIGxhdGVyISEpCi0gICAgICovCi0gICAgYnJpUkMgPSAoYmFja3JlZmluZm8gKilhcF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihiYWNrcmVmaW5mbykpOwotICAgIGJyaVJDLT5zb3VyY2UgPSAiIjsKLSAgICBicmlSQy0+bnN1YiAgID0gMDsKLQotICAgIC8qCi0gICAgICogIE9rLCB3ZSBhbHJlYWR5IGtub3cgdGhlIHBhdHRlcm4gaGFzIG1hdGNoZWQsIGJ1dCB3ZSBub3cKLSAgICAgKiAgYWRkaXRpb25hbGx5IGhhdmUgdG8gY2hlY2sgZm9yIGFsbCBleGlzdGluZyBwcmVjb25kaXRpb25zCi0gICAgICogIChSZXdyaXRlQ29uZCkgd2hpY2ggaGF2ZSB0byBiZSBhbHNvIHRydWUuIFdlIGRvIHRoaXMgYXQKLSAgICAgKiAgdGhpcyB2ZXJ5IGxhdGUgc3RhZ2UgdG8gYXZvaWQgdW5uZXNzZXNhcnkgY2hlY2tzIHdoaWNoCi0gICAgICogIHdvdWxkIHNsb3cgZG93biB0aGUgcmV3cml0aW5nIGVuZ2luZSEhCi0gICAgICovCi0gICAgcmV3cml0ZWNvbmRzID0gcC0+cmV3cml0ZWNvbmRzOwotICAgIGNvbmRzID0gKHJld3JpdGVjb25kX2VudHJ5ICopcmV3cml0ZWNvbmRzLT5lbHRzOwotICAgIGZhaWxlZCA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IHJld3JpdGVjb25kcy0+bmVsdHM7IGkrKykgewotICAgICAgICBjID0gJmNvbmRzW2ldOwotICAgICAgICByYyA9IGFwcGx5X3Jld3JpdGVfY29uZChyLCBjLCBwZXJkaXIsIGJyaVJSLCBicmlSQyk7Ci0gICAgICAgIGlmIChjLT5mbGFncyAmIENPTkRGTEFHX09STkVYVCkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqICBUaGUgIk9SIiBjYXNlCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLyogIE9uZSBjb25kaXRpb24gaXMgZmFsc2UsIGJ1dCBhbm90aGVyIGNhbiBiZQotICAgICAgICAgICAgICAgICAqICBzdGlsbCB0cnVlLCBzbyB3ZSBoYXZlIHRvIGNvbnRpbnVlLi4uCi0gICAgICAgICAgICAgICAgICovCi0JICAgICAgICBhcF90YWJsZV91bnNldChyLT5ub3RlcywgVkFSWV9LRVlfVEhJUyk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiAgT25lIHRydWUgY29uZGl0aW9uIGlzIGVub3VnaCBpbiAib3IiIGNhc2UsIHNvCi0gICAgICAgICAgICAgICAgICogIHNraXAgdGhlIG90aGVyIGNvbmRpdGlvbnMgd2hpY2ggYXJlICJvcm5leHQiCi0gICAgICAgICAgICAgICAgICogIGNoYWluZWQKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB3aGlsZSAoICAgaSA8IHJld3JpdGVjb25kcy0+bmVsdHMKLSAgICAgICAgICAgICAgICAgICAgICAgJiYgYy0+ZmxhZ3MgJiBDT05ERkxBR19PUk5FWFQpIHsKLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICBjID0gJmNvbmRzW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiAgVGhlICJBTkQiIGNhc2UsIGkuZS4gbm8gIm9yIiBmbGFnLAotICAgICAgICAgICAgICogIHNvIGEgc2luZ2xlIGZhaWx1cmUgbWVhbnMgdG90YWwgZmFpbHVyZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHJjID09IDApIHsKLSAgICAgICAgICAgICAgICBmYWlsZWQgPSAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0JdmFyeSA9IGFwX3RhYmxlX2dldChyLT5ub3RlcywgVkFSWV9LRVlfVEhJUyk7Ci0JaWYgKHZhcnkgIT0gTlVMTCkgewotCSAgICBhcF90YWJsZV9tZXJnZShyLT5ub3RlcywgVkFSWV9LRVksIHZhcnkpOwotCSAgICBhcF90YWJsZV91bnNldChyLT5ub3RlcywgVkFSWV9LRVlfVEhJUyk7Ci0JfQotICAgIH0KLSAgICAvKiAgaWYgYW55IGNvbmRpdGlvbiBmYWlscyB0aGUgY29tcGxldGUgcnVsZSBmYWlscyAgKi8KLSAgICBpZiAoZmFpbGVkKSB7Ci0gICAgICAgIGFwX3RhYmxlX3Vuc2V0KHItPm5vdGVzLCBWQVJZX0tFWSk7Ci0gICAgICAgIGFwX3RhYmxlX3Vuc2V0KHItPm5vdGVzLCBWQVJZX0tFWV9USElTKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZWdhcmRsZXNzIG9mIHdoYXQgd2UgZG8gbmV4dCwgd2UndmUgZm91bmQgYSBtYXRjaC4gIENoZWNrIHRvIHNlZQotICAgICAqIGlmIGFueSBvZiB0aGUgcmVxdWVzdCBoZWFkZXIgZmllbGRzIHdlcmUgaW52b2x2ZWQsIGFuZCBhZGQgdGhlbQotICAgICAqIHRvIHRoZSBWYXJ5IGZpZWxkIG9mIHRoZSByZXNwb25zZS4KLSAgICAgKi8KLSAgICBpZiAoKHZhcnkgPSBhcF90YWJsZV9nZXQoci0+bm90ZXMsIFZBUllfS0VZKSkgIT0gTlVMTCkgewotICAgICAgICBhcF90YWJsZV9tZXJnZShyLT5oZWFkZXJzX291dCwgIlZhcnkiLCB2YXJ5KTsKLQlhcF90YWJsZV91bnNldChyLT5ub3RlcywgVkFSWV9LRVkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIElmIHRoaXMgaXMgYSBwdXJlIG1hdGNoaW5nIHJ1bGUgKGBSZXdyaXRlUnVsZSA8cGF0PiAtJykKLSAgICAgKiAgd2Ugc3RvcCBwcm9jZXNzaW5nIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkuIFRoZSBvbmx5IHRoaW5nCi0gICAgICogIHdlIGhhdmUgbm90IHRvIGZvcmdldCBhcmUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcwotICAgICAqICAoYFJld3JpdGVSdWxlIDxwYXQ+IC0gW0U9Li4uXScpCi0gICAgICovCi0gICAgaWYgKHN0cmNtcChvdXRwdXQsICItIikgPT0gMCkgewotICAgICAgICBmb3IgKGkgPSAwOyBwLT5lbnZbaV0gIT0gTlVMTDsgaSsrKSB7Ci0gICAgICAgICAgICAvKiAgMS4gdGFrZSB0aGUgc3RyaW5nICAqLwotICAgICAgICAgICAgYXBfY3B5c3RybihlbnYsIHAtPmVudltpXSwgc2l6ZW9mKGVudikpOwotICAgICAgICAgICAgLyogIDIuIGV4cGFuZCAkTiAoaS5lLiBiYWNrcmVmcyB0byBSZXdyaXRlUnVsZSBwYXR0ZXJuKSAgKi8KLSAgICAgICAgICAgIGV4cGFuZF9iYWNrcmVmX2luYnVmZmVyKHItPnBvb2wsIGVudiwgc2l6ZW9mKGVudiksIGJyaVJSLCAnJCcpOwotICAgICAgICAgICAgLyogIDMuIGV4cGFuZCAlTiAoaS5lLiBiYWNrcmVmcyB0byBsYXRlc3QgUmV3cml0ZUNvbmQgcGF0dGVybikgICovCi0gICAgICAgICAgICBleHBhbmRfYmFja3JlZl9pbmJ1ZmZlcihyLT5wb29sLCBlbnYsIHNpemVvZihlbnYpLCBicmlSQywgJyUnKTsKLSAgICAgICAgICAgIC8qICA0LiBleHBhbmQgJXsuLi59IChpLmUuIHZhcmlhYmxlcykgKi8KLSAgICAgICAgICAgIGV4cGFuZF92YXJpYWJsZXNfaW5idWZmZXIociwgZW52LCBzaXplb2YoZW52KSk7Ci0gICAgICAgICAgICAvKiAgNS4gZXhwYW5kICR7Li4ufSAoUmV3cml0ZU1hcCBsb29rdXBzKSAgKi8KLSAgICAgICAgICAgIGV4cGFuZF9tYXBfbG9va3VwcyhyLCBlbnYsIHNpemVvZihlbnYpKTsKLSAgICAgICAgICAgIC8qICBhbmQgYWRkIHRoZSB2YXJpYWJsZSB0byBBcGFjaGUncyBzdHJ1Y3R1cmVzICAqLwotICAgICAgICAgICAgYWRkX2Vudl92YXJpYWJsZShyLCBlbnYpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwLT5mb3JjZWRfbWltZXR5cGUgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKHBlcmRpciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgLyogSW4gdGhlIHBlci1zZXJ2ZXIgY29udGV4dCB3ZSBjYW4gZm9yY2UgdGhlIE1JTUUtdHlwZQotICAgICAgICAgICAgICAgICAqIHRoZSBjb3JyZWN0IHdheSBieSBub3RpZnlpbmcgb3VyIE1JTUUtdHlwZSBob29rIGhhbmRsZXIKLSAgICAgICAgICAgICAgICAgKiB0byBkbyB0aGUgam9iIHdoZW4gdGhlIE1JTUUtdHlwZSBBUEkgc3RhZ2UgaXMgcmVhY2hlZC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDIsICJyZW1lbWJlciAlcyB0byBoYXZlIE1JTUUtdHlwZSAnJXMnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPmZpbGVuYW1lLCBwLT5mb3JjZWRfbWltZXR5cGUpOwotICAgICAgICAgICAgICAgIGFwX3RhYmxlX3NldG4oci0+bm90ZXMsIFJFV1JJVEVfRk9SQ0VEX01JTUVUWVBFX05PVEVWQVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5mb3JjZWRfbWltZXR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogSW4gcGVyLWRpcmVjdG9yeSBjb250ZXh0IHdlIG9wZXJhdGUgaW4gdGhlIEZpeHVwIEFQSSBob29rCi0gICAgICAgICAgICAgICAgICogd2hpY2ggaXMgYWZ0ZXIgdGhlIE1JTUUtdHlwZSBob29rLCBzbyBvdXIgTUlNRS10eXBlIGhhbmRsZXIKLSAgICAgICAgICAgICAgICAgKiBoYXMgbm8gY2hhbmNlIHRvIHNldCByLT5jb250ZW50X3R5cGUuIEFuZCBiZWNhdXNlIHdlIGFyZQotICAgICAgICAgICAgICAgICAqIGluIHRoZSBzaXR1YXRpb24gd2hlcmUgbm8gc3Vic3RpdHV0aW9uIHRha2VzIHBsYWNlIG5vCi0gICAgICAgICAgICAgICAgICogc3ViLXJlcXVlc3Qgd2lsbCBoYXBwZW4gKHdoaWNoIGNvdWxkIHNvbHZlIHRoZQotICAgICAgICAgICAgICAgICAqIHJlc3RyaWN0aW9uKS4gQXMgYSB3b3JrYXJvdW5kIHdlIGRvIGl0IG91cnNlbGYgbm93Ci0gICAgICAgICAgICAgICAgICogaW1tZWRpYXRlbHkgYWx0aG91Z2ggdGhpcyBpcyBub3Qgc3RyaWN0bHkgQVBJLWNvbmZvcm1pbmcuCi0gICAgICAgICAgICAgICAgICogQnV0IGl0J3MgdGhlIG9ubHkgY2hhbmNlIHdlIGhhdmUuLi4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDEsICJbcGVyLWRpciAlc10gZm9yY2UgJXMgdG8gaGF2ZSBNSU1FLXR5cGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcyciLCBwZXJkaXIsIHItPmZpbGVuYW1lLCBwLT5mb3JjZWRfbWltZXR5cGUpOwotICAgICAgICAgICAgICAgIHItPmNvbnRlbnRfdHlwZSA9IHAtPmZvcmNlZF9taW1ldHlwZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICBPaywgbm93IHdlIGZpbmFsbHkga25vdyBhbGwgcGF0dGVybnMgaGF2ZSBtYXRjaGVkIGFuZAotICAgICAqICB0aGF0IHRoZXJlIGlzIHNvbWV0aGluZyB0byByZXBsYWNlLCBzbyB3ZSBjcmVhdGUgdGhlCi0gICAgICogIHN1YnN0aXR1dGlvbiBVUkwgc3RyaW5nIGluIGBuZXd1cmknLgotICAgICAqLwotICAgIC8qICAxLiB0YWtlIHRoZSBvdXRwdXQgc3RyaW5nICAqLwotICAgIGFwX2NweXN0cm4obmV3dXJpLCBvdXRwdXQsIHNpemVvZihuZXd1cmkpKTsKLSAgICAvKiAgMi4gZXhwYW5kICROIChpLmUuIGJhY2tyZWZzIHRvIFJld3JpdGVSdWxlIHBhdHRlcm4pICAqLwotICAgIGV4cGFuZF9iYWNrcmVmX2luYnVmZmVyKHItPnBvb2wsIG5ld3VyaSwgc2l6ZW9mKG5ld3VyaSksIGJyaVJSLCAnJCcpOwotICAgIC8qICAzLiBleHBhbmQgJU4gKGkuZS4gYmFja3JlZnMgdG8gbGF0ZXN0IFJld3JpdGVDb25kIHBhdHRlcm4pICAqLwotICAgIGV4cGFuZF9iYWNrcmVmX2luYnVmZmVyKHItPnBvb2wsIG5ld3VyaSwgc2l6ZW9mKG5ld3VyaSksIGJyaVJDLCAnJScpOwotICAgIC8qICA0LiBleHBhbmQgJXsuLi59IChpLmUuIHZhcmlhYmxlcykgKi8KLSAgICBleHBhbmRfdmFyaWFibGVzX2luYnVmZmVyKHIsIG5ld3VyaSwgc2l6ZW9mKG5ld3VyaSkpOwotICAgIC8qICA1LiBleHBhbmQgJHsuLi59IChSZXdyaXRlTWFwIGxvb2t1cHMpICAqLwotICAgIGV4cGFuZF9tYXBfbG9va3VwcyhyLCBuZXd1cmksIHNpemVvZihuZXd1cmkpKTsKLSAgICAvKiAgYW5kIGxvZyB0aGUgcmVzdWx0Li4uICovCi0gICAgaWYgKHBlcmRpciA9PSBOVUxMKSB7Ci0gICAgICAgIHJld3JpdGVsb2cociwgMiwgInJld3JpdGUgJXMgLT4gJXMiLCB1cmksIG5ld3VyaSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXdyaXRlbG9nKHIsIDIsICJbcGVyLWRpciAlc10gcmV3cml0ZSAlcyAtPiAlcyIsIHBlcmRpciwgdXJpLCBuZXd1cmkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIEFkZGl0aW9uYWxseSBkbyBleHBhbnNpb24gZm9yIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotICAgICAqICBzdHJpbmdzIChgUmV3cml0ZVJ1bGUgLi4gLi4gW0U9PHN0cmluZz5dJykuCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgcC0+ZW52W2ldICE9IE5VTEw7IGkrKykgewotICAgICAgICAvKiAgMS4gdGFrZSB0aGUgc3RyaW5nICAqLwotICAgICAgICBhcF9jcHlzdHJuKGVudiwgcC0+ZW52W2ldLCBzaXplb2YoZW52KSk7Ci0gICAgICAgIC8qICAyLiBleHBhbmQgJE4gKGkuZS4gYmFja3JlZnMgdG8gUmV3cml0ZVJ1bGUgcGF0dGVybikgICovCi0gICAgICAgIGV4cGFuZF9iYWNrcmVmX2luYnVmZmVyKHItPnBvb2wsIGVudiwgc2l6ZW9mKGVudiksIGJyaVJSLCAnJCcpOwotICAgICAgICAvKiAgMy4gZXhwYW5kICVOIChpLmUuIGJhY2tyZWZzIHRvIGxhdGVzdCBSZXdyaXRlQ29uZCBwYXR0ZXJuKSAgKi8KLSAgICAgICAgZXhwYW5kX2JhY2tyZWZfaW5idWZmZXIoci0+cG9vbCwgZW52LCBzaXplb2YoZW52KSwgYnJpUkMsICclJyk7Ci0gICAgICAgIC8qICA0LiBleHBhbmQgJXsuLi59IChpLmUuIHZhcmlhYmxlcykgKi8KLSAgICAgICAgZXhwYW5kX3ZhcmlhYmxlc19pbmJ1ZmZlcihyLCBlbnYsIHNpemVvZihlbnYpKTsKLSAgICAgICAgLyogIDUuIGV4cGFuZCAkey4uLn0gKFJld3JpdGVNYXAgbG9va3VwcykgICovCi0gICAgICAgIGV4cGFuZF9tYXBfbG9va3VwcyhyLCBlbnYsIHNpemVvZihlbnYpKTsKLSAgICAgICAgLyogIGFuZCBhZGQgdGhlIHZhcmlhYmxlIHRvIEFwYWNoZSdzIHN0cnVjdHVyZXMgICovCi0gICAgICAgIGFkZF9lbnZfdmFyaWFibGUociwgZW52KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICBOb3cgcmVwbGFjZSBBUEkncyBrbm93bGVkZ2Ugb2YgdGhlIGN1cnJlbnQgVVJJOgotICAgICAqICBSZXBsYWNlIHItPmZpbGVuYW1lIHdpdGggdGhlIG5ldyBVUkkgc3RyaW5nIGFuZCBzcGxpdCBvdXQKLSAgICAgKiAgYW4gb24tdGhlLWZseSBnZW5lcmF0ZWQgUVVFUllfU1RSSU5HIHBhcnQgaW50byByLT5hcmdzCi0gICAgICovCi0gICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyZHVwKHItPnBvb2wsIG5ld3VyaSk7Ci0gICAgc3BsaXRvdXRfcXVlcnlhcmdzKHIsIHAtPmZsYWdzICYgUlVMRUZMQUdfUVNBUFBFTkQpOwotCi0gICAgLyoKLSAgICAgKiAgIEFnYWluIGFkZCB0aGUgcHJldmlvdXNseSBzdHJpcHBlZCBwZXItZGlyZWN0b3J5IGxvY2F0aW9uCi0gICAgICogICBwcmVmaXggaWYgdGhlIG5ldyBVUkkgaXMgbm90IGEgbmV3IG9uZSBmb3IgdGhpcwotICAgICAqICAgbG9jYXRpb24sIGkuZS4gaWYgaXQncyBub3Qgc3RhcnRpbmcgd2l0aCBlaXRoZXIgYSBzbGFzaAotICAgICAqICAgb3IgYSBmdWxseSBxdWFsaWZpZWQgVVJMIHNjaGVtZS4KLSAgICAgKi8KLSAgICBpID0gc3RybGVuKHItPmZpbGVuYW1lKTsKLSAgICBpZiAoICAgcHJlZml4c3RyaXAKLSAgICAgICAgJiYgISggICByLT5maWxlbmFtZVswXSA9PSAnLycKLSAgICAgICAgICAgICB8fCAoICAgKGkgPiA3ICYmIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAiaHR0cDovLyIsICAgNykgPT0gMCkKLSAgICAgICAgICAgICAgICAgfHwgKGkgPiA4ICYmIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAiaHR0cHM6Ly8iLCAgOCkgPT0gMCkKLSAgICAgICAgICAgICAgICAgfHwgKGkgPiA5ICYmIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAiZ29waGVyOi8vIiwgOSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgfHwgKGkgPiA2ICYmIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAiZnRwOi8vIiwgICAgNikgPT0gMCkKLSAgICAgICAgICAgICAgICAgfHwgKGkgPiA1ICYmIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAibGRhcDoiLCAgICAgNSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgfHwgKGkgPiA1ICYmIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAibmV3czoiLCAgICAgNSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgfHwgKGkgPiA3ICYmIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAibWFpbHRvOiIsICAgNykgPT0gMCkpKSkgewotICAgICAgICByZXdyaXRlbG9nKHIsIDMsICJbcGVyLWRpciAlc10gYWRkIHBlci1kaXIgcHJlZml4OiAlcyAtPiAlcyVzIiwKLSAgICAgICAgICAgICAgICAgICBwZXJkaXIsIHItPmZpbGVuYW1lLCBwZXJkaXIsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHBlcmRpciwgci0+ZmlsZW5hbWUsIE5VTEwpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIElmIHRoaXMgcnVsZSBpcyBmb3JjZWQgZm9yIHByb3h5IHRocm91Z2hwdXQKLSAgICAgKiAgKGBSZXdyaXRlUnVsZSAuLi4gLi4uIFtQXScpIHRoZW4gZW11bGF0ZSBtb2RfcHJveHkncwotICAgICAqICBVUkwtdG8tZmlsZW5hbWUgaGFuZGxlciB0byBiZSBzdXJlIG1vZF9wcm94eSBpcyB0cmlnZ2VyZWQKLSAgICAgKiAgZm9yIHRoaXMgVVJMIGxhdGVyIGluIHRoZSBBcGFjaGUgQVBJLiBCdXQgbWFrZSBzdXJlIGl0IGlzCi0gICAgICogIGEgZnVsbHktcXVhbGlmaWVkIFVSTC4gKElmIG5vdCBpdCBpcyBxdWFsaWZpZWQgd2l0aAotICAgICAqICBvdXJzZWxmKS4KLSAgICAgKi8KLSAgICBpZiAocC0+ZmxhZ3MgJiBSVUxFRkxBR19QUk9YWSkgewotICAgICAgICBmdWxseV9xdWFsaWZ5X3VyaShyKTsKLSAgICAgICAgaWYgKHBlcmRpciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXdyaXRlbG9nKHIsIDIsICJmb3JjaW5nIHByb3h5LXRocm91Z2hwdXQgd2l0aCAlcyIsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJld3JpdGVsb2cociwgMiwgIltwZXItZGlyICVzXSBmb3JjaW5nIHByb3h5LXRocm91Z2hwdXQgd2l0aCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIHBlcmRpciwgci0+ZmlsZW5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCAicHJveHk6Iiwgci0+ZmlsZW5hbWUsIE5VTEwpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICBJZiB0aGlzIHJ1bGUgaXMgZXhwbGljaXRseSBmb3JjZWQgZm9yIEhUVFAgcmVkaXJlY3Rpb24KLSAgICAgKiAgKGBSZXdyaXRlUnVsZSAuLiAuLiBbUl0nKSB0aGVuIGZvcmNlIGFuIGV4dGVybmFsIEhUVFAKLSAgICAgKiAgcmVkaXJlY3QuIEJ1dCBtYWtlIHN1cmUgaXQgaXMgYSBmdWxseS1xdWFsaWZpZWQgVVJMLiAoSWYKLSAgICAgKiAgbm90IGl0IGlzIHF1YWxpZmllZCB3aXRoIG91cnNlbGYpLgotICAgICAqLwotICAgIGlmIChwLT5mbGFncyAmIFJVTEVGTEFHX0ZPUkNFUkVESVJFQ1QpIHsKLSAgICAgICAgZnVsbHlfcXVhbGlmeV91cmkocik7Ci0gICAgICAgIGlmIChwZXJkaXIgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAyLAotICAgICAgICAgICAgICAgICAgICAgICAiZXhwbGljaXRseSBmb3JjaW5nIHJlZGlyZWN0IHdpdGggJXMiLCByLT5maWxlbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXdyaXRlbG9nKHIsIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICJbcGVyLWRpciAlc10gZXhwbGljaXRseSBmb3JjaW5nIHJlZGlyZWN0IHdpdGggJXMiLAotICAgICAgICAgICAgICAgICAgICAgICBwZXJkaXIsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgfQotICAgICAgICByLT5zdGF0dXMgPSBwLT5mb3JjZWRfcmVzcG9uc2Vjb2RlOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICBTcGVjaWFsIFJld3JpdGluZyBGZWF0dXJlOiBTZWxmLVJlZHVjdGlvbgotICAgICAqICBXZSByZWR1Y2UgdGhlIFVSTCBieSBzdHJpcHBpbmcgYSBwb3NzaWJsZQotICAgICAqICBodHRwW3NdOi8vPG91cmhvc3Q+Wzo8cG9ydD5dIHByZWZpeCwgaS5lLiBhIHByZWZpeCB3aGljaAotICAgICAqICBjb3JyZXNwb25kcyB0byBvdXJzZWxmLiBUaGlzIGlzIHRvIHNpbXBsaWZ5IHJld3JpdGUgbWFwcwotICAgICAqICBhbmQgdG8gYXZvaWQgcmVjdXJzaW9uLCBldGMuIFdoZW4gdGhpcyBwcmVmaXggaXMgbm90IGEKLSAgICAgKiAgY29pbmNpZGVuY2UgdGhlbiB0aGUgdXNlciBoYXMgdG8gdXNlIFtSXSBleHBsaWNpdGx5IChzZWUKLSAgICAgKiAgYWJvdmUpLgotICAgICAqLwotICAgIHJlZHVjZV91cmkocik7Ci0KLSAgICAvKgotICAgICAqICBJZiB0aGlzIHJ1bGUgaXMgc3RpbGwgaW1wbGljaXRseSBmb3JjZWQgZm9yIEhUVFAKLSAgICAgKiAgcmVkaXJlY3Rpb24gKGBSZXdyaXRlUnVsZSAuLiA8c2NoZW1lPjovLy4uLicpIHRoZW4KLSAgICAgKiAgZGlyZWN0bHkgZm9yY2UgYW4gZXh0ZXJuYWwgSFRUUCByZWRpcmVjdC4KLSAgICAgKi8KLSAgICBpID0gc3RybGVuKHItPmZpbGVuYW1lKTsKLSAgICBpZiAoICAgKGkgPiA3ICYmIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAiaHR0cDovLyIsICAgNykgPT0gMCkKLSAgICAgICAgfHwgKGkgPiA4ICYmIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAiaHR0cHM6Ly8iLCAgOCkgPT0gMCkKLSAgICAgICAgfHwgKGkgPiA5ICYmIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAiZ29waGVyOi8vIiwgOSkgPT0gMCkKLSAgICAgICAgfHwgKGkgPiA2ICYmIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAiZnRwOi8vIiwgICAgNikgPT0gMCkKLSAgICAgICAgfHwgKGkgPiA1ICYmIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAibGRhcDoiLCAgICAgNSkgPT0gMCkKLSAgICAgICAgfHwgKGkgPiA1ICYmIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAibmV3czoiLCAgICAgNSkgPT0gMCkKLSAgICAgICAgfHwgKGkgPiA3ICYmIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAibWFpbHRvOiIsICAgNykgPT0gMCkgKSB7Ci0gICAgICAgIGlmIChwZXJkaXIgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAyLAotICAgICAgICAgICAgICAgICAgICAgICAiaW1wbGljaXRseSBmb3JjaW5nIHJlZGlyZWN0IChyYz0lZCkgd2l0aCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIHAtPmZvcmNlZF9yZXNwb25zZWNvZGUsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJld3JpdGVsb2cociwgMiwgIltwZXItZGlyICVzXSBpbXBsaWNpdGx5IGZvcmNpbmcgcmVkaXJlY3QgIgotICAgICAgICAgICAgICAgICAgICAgICAiKHJjPSVkKSB3aXRoICVzIiwgcGVyZGlyLCBwLT5mb3JjZWRfcmVzcG9uc2Vjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICByLT5maWxlbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgci0+c3RhdHVzID0gcC0+Zm9yY2VkX3Jlc3BvbnNlY29kZTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgTm93IHdlIGFyZSBzdXJlIGl0IGlzIG5vdCBhIGZ1bGx5IHF1YWxpZmllZCBVUkwuICBCdXQKLSAgICAgKiAgdGhlcmUgaXMgc3RpbGwgb25lIHNwZWNpYWwgY2FzZSBsZWZ0OiBBIGxvY2FsIHJld3JpdGUgaW4KLSAgICAgKiAgcGVyLWRpcmVjdG9yeSBjb250ZXh0LCBpLmUuIGEgc3Vic3RpdHV0aW9uIFVSTCB3aGljaCBkb2VzCi0gICAgICogIG5vdCBzdGFydCB3aXRoIGEgc2xhc2guIEhlcmUgd2UgYWRkIGFnYWluIHRoZSBpbml0aWFsbHkKLSAgICAgKiAgc3RyaXBwZWQgcGVyLWRpcmVjdG9yeSBwcmVmaXguCi0gICAgICovCi0gICAgaWYgKHByZWZpeHN0cmlwICYmIHItPmZpbGVuYW1lWzBdICE9ICcvJykgewotICAgICAgICByZXdyaXRlbG9nKHIsIDMsICJbcGVyLWRpciAlc10gYWRkIHBlci1kaXIgcHJlZml4OiAlcyAtPiAlcyVzIiwKLSAgICAgICAgICAgICAgICAgICBwZXJkaXIsIHItPmZpbGVuYW1lLCBwZXJkaXIsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHBlcmRpciwgci0+ZmlsZW5hbWUsIE5VTEwpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIEZpbmFsbHkgd2UgaGFkIHRvIHJlbWVtYmVyIGlmIGEgTUlNRS10eXBlIHNob3VsZCBiZQotICAgICAqICBmb3JjZWQgZm9yIHRoaXMgVVJMIChgUmV3cml0ZVJ1bGUgLi4gLi4gW1Q9PHR5cGU+XScpCi0gICAgICogIExhdGVyIGluIHRoZSBBUEkgcHJvY2Vzc2luZyBwaGFzZSB0aGlzIGlzIGZvcmNlZCBieSBvdXIKLSAgICAgKiAgTUlNRSBBUEktaG9vayBmdW5jdGlvbi4gVGhpcyB0aW1lIGl0cyBubyBwcm9ibGVtIGV2ZW4gZm9yCi0gICAgICogIHRoZSBwZXItZGlyZWN0b3J5IGNvbnRleHQgKHdoZXJlIHRoZSBNSU1FLXR5cGUgaG9vayB3YXMKLSAgICAgKiAgYWxyZWFkeSBwcm9jZXNzZWQpIGJlY2F1c2UgYSBzdWItcmVxdWVzdCBoYXBwZW5zIDstKQotICAgICAqLwotICAgIGlmIChwLT5mb3JjZWRfbWltZXR5cGUgIT0gTlVMTCkgewotICAgICAgICBhcF90YWJsZV9zZXRuKHItPm5vdGVzLCBSRVdSSVRFX0ZPUkNFRF9NSU1FVFlQRV9OT1RFVkFSLAotICAgICAgICAgICAgICAgICAgICAgIHAtPmZvcmNlZF9taW1ldHlwZSk7Ci0gICAgICAgIGlmIChwZXJkaXIgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAyLCAicmVtZW1iZXIgJXMgdG8gaGF2ZSBNSU1FLXR5cGUgJyVzJyIsCi0gICAgICAgICAgICAgICAgICAgICAgIHItPmZpbGVuYW1lLCBwLT5mb3JjZWRfbWltZXR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAyLAotICAgICAgICAgICAgICAgICAgICAgICAiW3Blci1kaXIgJXNdIHJlbWVtYmVyICVzIHRvIGhhdmUgTUlNRS10eXBlICclcyciLAotICAgICAgICAgICAgICAgICAgICAgICBwZXJkaXIsIHItPmZpbGVuYW1lLCBwLT5mb3JjZWRfbWltZXR5cGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgUHV1aGhoaGhoaGguLi4gV0hBVCBDT01QTElDQVRFRCBTVFVGRiA7XykKLSAgICAgKiAgQnV0IG5vdyB3ZSdyZSBkb25lIGZvciB0aGlzIHBhcnRpY3VsYXIgcnVsZS4KLSAgICAgKi8KLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBhcHBseV9yZXdyaXRlX2NvbmQocmVxdWVzdF9yZWMgKnIsIHJld3JpdGVjb25kX2VudHJ5ICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGVyZGlyLCBiYWNrcmVmaW5mbyAqYnJpUlIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrcmVmaW5mbyAqYnJpUkMpCi17Ci0gICAgY2hhciBpbnB1dFtNQVhfU1RSSU5HX0xFTl07Ci0gICAgc3RydWN0IHN0YXQgc2I7Ci0gICAgcmVxdWVzdF9yZWMgKnJzdWI7Ci0gICAgcmVnbWF0Y2hfdCByZWdtYXRjaFtNQVhfTk1BVENIXTsKLSAgICBpbnQgcmM7Ci0KLSAgICAvKgotICAgICAqICAgQ29uc3RydWN0IHRoZSBzdHJpbmcgd2UgbWF0Y2ggYWdhaW5zdAotICAgICAqLwotCi0gICAgLyogIDEuIHRha2UgdGhlIHN0cmluZyAgKi8KLSAgICBhcF9jcHlzdHJuKGlucHV0LCBwLT5pbnB1dCwgc2l6ZW9mKGlucHV0KSk7Ci0gICAgLyogIDIuIGV4cGFuZCAkTiAoaS5lLiBiYWNrcmVmcyB0byBSZXdyaXRlUnVsZSBwYXR0ZXJuKSAgKi8KLSAgICBleHBhbmRfYmFja3JlZl9pbmJ1ZmZlcihyLT5wb29sLCBpbnB1dCwgc2l6ZW9mKGlucHV0KSwgYnJpUlIsICckJyk7Ci0gICAgLyogIDMuIGV4cGFuZCAlTiAoaS5lLiBiYWNrcmVmcyB0byBsYXRlc3QgUmV3cml0ZUNvbmQgcGF0dGVybikgICovCi0gICAgZXhwYW5kX2JhY2tyZWZfaW5idWZmZXIoci0+cG9vbCwgaW5wdXQsIHNpemVvZihpbnB1dCksIGJyaVJDLCAnJScpOwotICAgIC8qICA0LiBleHBhbmQgJXsuLi59IChpLmUuIHZhcmlhYmxlcykgKi8KLSAgICBleHBhbmRfdmFyaWFibGVzX2luYnVmZmVyKHIsIGlucHV0LCBzaXplb2YoaW5wdXQpKTsKLSAgICAvKiAgNS4gZXhwYW5kICR7Li4ufSAoUmV3cml0ZU1hcCBsb29rdXBzKSAgKi8KLSAgICBleHBhbmRfbWFwX2xvb2t1cHMociwgaW5wdXQsIHNpemVvZihpbnB1dCkpOwotCi0gICAgLyoKLSAgICAgKiAgIEFwcGx5IHRoZSBwYXR0ZXJucwotICAgICAqLwotCi0gICAgcmMgPSAwOwotICAgIGlmIChzdHJjbXAocC0+cGF0dGVybiwgIi1mIikgPT0gMCkgewotICAgICAgICBpZiAoc3RhdChpbnB1dCwgJnNiKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoU19JU1JFRyhzYi5zdF9tb2RlKSkgewotICAgICAgICAgICAgICAgIHJjID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjbXAocC0+cGF0dGVybiwgIi1zIikgPT0gMCkgewotICAgICAgICBpZiAoc3RhdChpbnB1dCwgJnNiKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoU19JU1JFRyhzYi5zdF9tb2RlKSAmJiBzYi5zdF9zaXplID4gMCkgewotICAgICAgICAgICAgICAgIHJjID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjbXAocC0+cGF0dGVybiwgIi1sIikgPT0gMCkgewotI2lmICFkZWZpbmVkKE9TMikgJiYgIWRlZmluZWQoV0lOMzIpCi0gICAgICAgIGlmIChsc3RhdChpbnB1dCwgJnNiKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoU19JU0xOSyhzYi5zdF9tb2RlKSkgewotICAgICAgICAgICAgICAgIHJjID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2VuZGlmCi0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNtcChwLT5wYXR0ZXJuLCAiLWQiKSA9PSAwKSB7Ci0gICAgICAgIGlmIChzdGF0KGlucHV0LCAmc2IpID09IDApIHsKLSAgICAgICAgICAgIGlmIChTX0lTRElSKHNiLnN0X21vZGUpKSB7Ci0gICAgICAgICAgICAgICAgcmMgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNtcChwLT5wYXR0ZXJuLCAiLVUiKSA9PSAwKSB7Ci0gICAgICAgIC8qIGF2b2lkIGluZmluaXRlIHN1YnJlcXVlc3QgcmVjdXJzaW9uICovCi0gICAgICAgIGlmIChzdHJsZW4oaW5wdXQpID4gMCAgICAgICAgICAgICAgIC8qIG5vbmVtcHR5IHBhdGgsIGFuZCAgICAgICAgICAgICovCi0gICAgICAgICAgICAmJiAoICAgci0+bWFpbiA9PSBOVUxMICAgICAgICAgIC8qIC0gZWl0aGVyIG5vdCBpbiBhIHN1YnJlcXVlc3QgICovCi0gICAgICAgICAgICAgICAgfHwgKCAgIHItPm1haW4tPnVyaSAhPSBOVUxMIC8qIC0gb3IgaW4gYSBzdWJyZXF1ZXN0Li4uICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICYmIHItPnVyaSAhPSBOVUxMICAgICAgIC8qICAgLi4uYW5kIFVSSXMgYXJlbid0IE5VTEwuLi4gICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgLi4uYW5kIHN1Yi9tYWluIFVSSXMgZGlmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICYmIHN0cmNtcChyLT5tYWluLT51cmksIHItPnVyaSkgIT0gMCkgKSApIHsKLQotICAgICAgICAgICAgLyogcnVuIGEgVVJJLWJhc2VkIHN1YnJlcXVlc3QgKi8KLSAgICAgICAgICAgIHJzdWIgPSBhcF9zdWJfcmVxX2xvb2t1cF91cmkoaW5wdXQsIHIpOwotCi0gICAgICAgICAgICAvKiBVUkkgZXhpc3RzIGZvciBhbnkgcmVzdWx0IHVwIHRvIDN4eCwgcmVkaXJlY3RzIGFsbG93ZWQgKi8KLSAgICAgICAgICAgIGlmIChyc3ViLT5zdGF0dXMgPCA0MDApCi0gICAgICAgICAgICAgICAgcmMgPSAxOwotCi0gICAgICAgICAgICAvKiBsb2cgaXQgKi8KLSAgICAgICAgICAgIHJld3JpdGVsb2cociwgNSwgIlJld3JpdGVDb25kIFVSSSAoLVUpIGNoZWNrOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICJwYXRoPSVzIC0+IHN0YXR1cz0lZCIsIGlucHV0LCByc3ViLT5zdGF0dXMpOwotCi0gICAgICAgICAgICAvKiBjbGVhbnVwIGJ5IGRlc3Ryb3lpbmcgdGhlIHN1YnJlcXVlc3QgKi8KLSAgICAgICAgICAgIGFwX2Rlc3Ryb3lfc3ViX3JlcShyc3ViKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjbXAocC0+cGF0dGVybiwgIi1GIikgPT0gMCkgewotICAgICAgICAvKiBhdm9pZCBpbmZpbml0ZSBzdWJyZXF1ZXN0IHJlY3Vyc2lvbiAqLwotICAgICAgICBpZiAoc3RybGVuKGlucHV0KSA+IDAgICAgICAgICAgICAgICAvKiBub25lbXB0eSBwYXRoLCBhbmQgICAgICAgICAgICAqLwotICAgICAgICAgICAgJiYgKCAgIHItPm1haW4gPT0gTlVMTCAgICAgICAgICAvKiAtIGVpdGhlciBub3QgaW4gYSBzdWJyZXF1ZXN0ICAqLwotICAgICAgICAgICAgICAgIHx8ICggICByLT5tYWluLT51cmkgIT0gTlVMTCAvKiAtIG9yIGluIGEgc3VicmVxdWVzdC4uLiAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAmJiByLT51cmkgIT0gTlVMTCAgICAgICAvKiAgIC4uLmFuZCBVUklzIGFyZW4ndCBOVUxMLi4uICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIC4uLmFuZCBzdWIvbWFpbiBVUklzIGRpZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAmJiBzdHJjbXAoci0+bWFpbi0+dXJpLCByLT51cmkpICE9IDApICkgKSB7Ci0KLSAgICAgICAgICAgIC8qIHByb2Nlc3MgYSBmaWxlLWJhc2VkIHN1YnJlcXVlc3Q6Ci0gICAgICAgICAgICAgKiB0aGlzIGRpZmZlcnMgZnJvbSAtVSBpbiB0aGF0IG5vIHBhdGggdHJhbnNsYXRpb24gaXMgZG9uZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcnN1YiA9IGFwX3N1Yl9yZXFfbG9va3VwX2ZpbGUoaW5wdXQsIHIpOwotCi0gICAgICAgICAgICAvKiBmaWxlIGV4aXN0cyBmb3IgYW55IHJlc3VsdCB1cCB0byAyeHgsIG5vIHJlZGlyZWN0cyAqLwotICAgICAgICAgICAgaWYgKHJzdWItPnN0YXR1cyA8IDMwMCAmJgotICAgICAgICAgICAgICAgIC8qIGRvdWJsZS1jaGVjayB0aGF0IGZpbGUgZXhpc3RzIHNpbmNlIGRlZmF1bHQgcmVzdWx0IGlzIDIwMCAqLwotICAgICAgICAgICAgICAgIHN0YXQocnN1Yi0+ZmlsZW5hbWUsICZzYikgPT0gMCkgewotICAgICAgICAgICAgICAgIHJjID0gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogbG9nIGl0ICovCi0gICAgICAgICAgICByZXdyaXRlbG9nKHIsIDUsICJSZXdyaXRlQ29uZCBmaWxlICgtRikgY2hlY2s6IHBhdGg9JXMgIgotICAgICAgICAgICAgICAgICAgICAgICAiLT4gZmlsZT0lcyBzdGF0dXM9JWQiLCBpbnB1dCwgcnN1Yi0+ZmlsZW5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICByc3ViLT5zdGF0dXMpOwotCi0gICAgICAgICAgICAvKiBjbGVhbnVwIGJ5IGRlc3Ryb3lpbmcgdGhlIHN1YnJlcXVlc3QgKi8KLSAgICAgICAgICAgIGFwX2Rlc3Ryb3lfc3ViX3JlcShyc3ViKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChzdHJsZW4ocC0+cGF0dGVybikgPiAxICYmICoocC0+cGF0dGVybikgPT0gJz4nKSB7Ci0gICAgICAgIHJjID0gKGNvbXBhcmVfbGV4aWNvZ3JhcGh5KGlucHV0LCBwLT5wYXR0ZXJuKzEpID09IDEgPyAxIDogMCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmxlbihwLT5wYXR0ZXJuKSA+IDEgJiYgKihwLT5wYXR0ZXJuKSA9PSAnPCcpIHsKLSAgICAgICAgcmMgPSAoY29tcGFyZV9sZXhpY29ncmFwaHkoaW5wdXQsIHAtPnBhdHRlcm4rMSkgPT0gLTEgPyAxIDogMCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmxlbihwLT5wYXR0ZXJuKSA+IDEgJiYgKihwLT5wYXR0ZXJuKSA9PSAnPScpIHsKLSAgICAgICAgaWYgKHN0cmNtcChwLT5wYXR0ZXJuKzEsICJcIlwiIikgPT0gMCkgewotICAgICAgICAgICAgcmMgPSAoKmlucHV0ID09ICdcMCcpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmMgPSAoc3RyY21wKGlucHV0LCBwLT5wYXR0ZXJuKzEpID09IDAgPyAxIDogMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIGl0IGlzIHJlYWxseSBhIHJlZ2V4cCBwYXR0ZXJuLCBzbyBhcHBseSBpdCAqLwotICAgICAgICByYyA9IChhcF9yZWdleGVjKHAtPnJlZ2V4cCwgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcC0+cmVnZXhwLT5yZV9uc3ViKzEsIHJlZ21hdGNoLDApID09IDApOwotCi0gICAgICAgIC8qIGlmIGl0IGlzbid0IGEgbmVnYXRlZCBwYXR0ZXJuIGFuZCByZWFsbHkgbWF0Y2hlZAotICAgICAgICAgICB3ZSB1cGRhdGUgdGhlIHBhc3NlZC10aHJvdWdoIHJlZ2V4IHN1YnN0IGluZm8gc3RydWN0dXJlICovCi0gICAgICAgIGlmIChyYyAmJiAhKHAtPmZsYWdzICYgQ09OREZMQUdfTk9UTUFUQ0gpKSB7Ci0gICAgICAgICAgICBicmlSQy0+c291cmNlID0gYXBfcHN0cmR1cChyLT5wb29sLCBpbnB1dCk7Ci0gICAgICAgICAgICBicmlSQy0+bnN1YiAgID0gcC0+cmVnZXhwLT5yZV9uc3ViOwotICAgICAgICAgICAgbWVtY3B5KCh2b2lkICopKGJyaVJDLT5yZWdtYXRjaCksICh2b2lkICopKHJlZ21hdGNoKSwKLSAgICAgICAgICAgICAgICAgICBzaXplb2YocmVnbWF0Y2gpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGlmIHRoaXMgaXMgYSBub24tbWF0Y2hpbmcgcmVnZXhwLCBqdXN0IG5lZ2F0ZSB0aGUgcmVzdWx0ICovCi0gICAgaWYgKHAtPmZsYWdzICYgQ09OREZMQUdfTk9UTUFUQ0gpIHsKLSAgICAgICAgcmMgPSAhcmM7Ci0gICAgfQotCi0gICAgcmV3cml0ZWxvZyhyLCA0LCAiUmV3cml0ZUNvbmQ6IGlucHV0PSclcycgcGF0dGVybj0nJXMlcycgPT4gJXMiLAotICAgICAgICAgICAgICAgaW5wdXQsIChwLT5mbGFncyAmIENPTkRGTEFHX05PVE1BVENIID8gIiEiIDogIiIpLAotICAgICAgICAgICAgICAgcC0+cGF0dGVybiwgcmMgPyAibWF0Y2hlZCIgOiAibm90LW1hdGNoZWQiKTsKLQotICAgIC8qIGVuZCBqdXN0IHJldHVybiB0aGUgcmVzdWx0ICovCi0gICAgcmV0dXJuIHJjOwotfQotCi0KLS8qCi0qKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSoqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiogfCAgICAgICAgICAgICAgVVJMIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucwotKiogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi0KLS8qCi0qKgotKiogIHNwbGl0IG91dCBhIFFVRVJZX1NUUklORyBwYXJ0IGZyb20KLSoqICB0aGUgY3VycmVudCBVUkkgc3RyaW5nCi0qKgotKi8KLQotc3RhdGljIHZvaWQgc3BsaXRvdXRfcXVlcnlhcmdzKHJlcXVlc3RfcmVjICpyLCBpbnQgcXNhcHBlbmQpCi17Ci0gICAgY2hhciAqcTsKLSAgICBjaGFyICpvbGR1cmk7Ci0KLSAgICBxID0gc3RyY2hyKHItPmZpbGVuYW1lLCAnPycpOwotICAgIGlmIChxICE9IE5VTEwpIHsKLSAgICAgICAgb2xkdXJpID0gYXBfcHN0cmR1cChyLT5wb29sLCByLT5maWxlbmFtZSk7Ci0gICAgICAgICpxKysgPSAnXDAnOwotICAgICAgICBpZiAocXNhcHBlbmQpIHsKLSAgICAgICAgICAgIHItPmFyZ3MgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHEsICImIiwgci0+YXJncywgTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByLT5hcmdzID0gYXBfcHN0cmR1cChyLT5wb29sLCBxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RybGVuKHItPmFyZ3MpID09IDApIHsKLSAgICAgICAgICAgIHItPmFyZ3MgPSBOVUxMOwotICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAzLCAic3BsaXQgdXJpPSVzIC0+IHVyaT0lcywgYXJncz08bm9uZT4iLCBvbGR1cmksCi0gICAgICAgICAgICAgICAgICAgICAgIHItPmZpbGVuYW1lKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChyLT5hcmdzW3N0cmxlbihyLT5hcmdzKS0xXSA9PSAnJicpIHsKLSAgICAgICAgICAgICAgICByLT5hcmdzW3N0cmxlbihyLT5hcmdzKS0xXSA9ICdcMCc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXdyaXRlbG9nKHIsIDMsICJzcGxpdCB1cmk9JXMgLT4gdXJpPSVzLCBhcmdzPSVzIiwgb2xkdXJpLAotICAgICAgICAgICAgICAgICAgICAgICByLT5maWxlbmFtZSwgci0+YXJncyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi0KLS8qCi0qKgotKiogIHN0cmlwICdodHRwW3NdOi8vb3VyaG9zdC8nIGZyb20gVVJJCi0qKgotKi8KLQotc3RhdGljIHZvaWQgcmVkdWNlX3VyaShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjaGFyICpjcDsKLSAgICB1bnNpZ25lZCBzaG9ydCBwb3J0OwotICAgIGNoYXIgKnBvcnRwOwotICAgIGNoYXIgKmhvc3RwOwotICAgIGNoYXIgKnVybDsKLSAgICBjaGFyIGM7Ci0gICAgY2hhciBob3N0W0xPTkdfU1RSSU5HX0xFTl07Ci0gICAgY2hhciBidWZbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgKm9sZHVyaTsKLSAgICBpbnQgbDsKLQotICAgIGNwID0gKGNoYXIgKilhcF9odHRwX21ldGhvZChyKTsKLSAgICBsICA9IHN0cmxlbihjcCk7Ci0gICAgaWYgKCAgIHN0cmxlbihyLT5maWxlbmFtZSkgPiBsKzMgCi0gICAgICAgICYmIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCBjcCwgbCkgPT0gMAotICAgICAgICAmJiByLT5maWxlbmFtZVtsXSAgID09ICc6JwotICAgICAgICAmJiByLT5maWxlbmFtZVtsKzFdID09ICcvJwotICAgICAgICAmJiByLT5maWxlbmFtZVtsKzJdID09ICcvJyAgICAgICAgICAgICApIHsKLSAgICAgICAgLyogdGhlcmUgd2FzIHJlYWxseSBhIHJld3JpdGUgdG8gYSByZW1vdGUgcGF0aCAqLwotCi0gICAgICAgIG9sZHVyaSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgci0+ZmlsZW5hbWUpOyAvKiBzYXZlIGZvciBsb2dnaW5nICovCi0KLSAgICAgICAgLyogY3V0IHRoZSBob3N0bmFtZSBhbmQgcG9ydCBvdXQgb2YgdGhlIFVSSSAqLwotICAgICAgICBhcF9jcHlzdHJuKGJ1Ziwgci0+ZmlsZW5hbWUrKGwrMyksIHNpemVvZihidWYpKTsKLSAgICAgICAgaG9zdHAgPSBidWY7Ci0gICAgICAgIGZvciAoY3AgPSBob3N0cDsgKmNwICE9ICdcMCcgJiYgKmNwICE9ICcvJyAmJiAqY3AgIT0gJzonOyBjcCsrKQotICAgICAgICAgICAgOwotICAgICAgICBpZiAoKmNwID09ICc6JykgewotICAgICAgICAgICAgLyogc2V0IGhvc3QgKi8KLSAgICAgICAgICAgICpjcCsrID0gJ1wwJzsKLSAgICAgICAgICAgIGFwX2NweXN0cm4oaG9zdCwgaG9zdHAsIHNpemVvZihob3N0KSk7Ci0gICAgICAgICAgICAvKiBzZXQgcG9ydCAqLwotICAgICAgICAgICAgcG9ydHAgPSBjcDsKLSAgICAgICAgICAgIGZvciAoOyAqY3AgIT0gJ1wwJyAmJiAqY3AgIT0gJy8nOyBjcCsrKQotICAgICAgICAgICAgICAgIDsKLSAgICAgICAgICAgIGMgPSAqY3A7Ci0gICAgICAgICAgICAqY3AgPSAnXDAnOwotICAgICAgICAgICAgcG9ydCA9IGF0b2kocG9ydHApOwotICAgICAgICAgICAgKmNwID0gYzsKLSAgICAgICAgICAgIC8qIHNldCByZW1haW5pbmcgdXJsICovCi0gICAgICAgICAgICB1cmwgPSBjcDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgqY3AgPT0gJy8nKSB7Ci0gICAgICAgICAgICAvKiBzZXQgaG9zdCAqLwotICAgICAgICAgICAgKmNwID0gJ1wwJzsKLSAgICAgICAgICAgIGFwX2NweXN0cm4oaG9zdCwgaG9zdHAsIHNpemVvZihob3N0KSk7Ci0gICAgICAgICAgICAqY3AgPSAnLyc7Ci0gICAgICAgICAgICAvKiBzZXQgcG9ydCAqLwotICAgICAgICAgICAgcG9ydCA9IGFwX2RlZmF1bHRfcG9ydChyKTsKLSAgICAgICAgICAgIC8qIHNldCByZW1haW5pbmcgdXJsICovCi0gICAgICAgICAgICB1cmwgPSBjcDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIHNldCBob3N0ICovCi0gICAgICAgICAgICBhcF9jcHlzdHJuKGhvc3QsIGhvc3RwLCBzaXplb2YoaG9zdCkpOwotICAgICAgICAgICAgLyogc2V0IHBvcnQgKi8KLSAgICAgICAgICAgIHBvcnQgPSBhcF9kZWZhdWx0X3BvcnQocik7Ci0gICAgICAgICAgICAvKiBzZXQgcmVtYWluaW5nIHVybCAqLwotICAgICAgICAgICAgdXJsID0gIi8iOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogbm93IGNoZWNrIHdoZXRoZXIgd2UgY291bGQgcmVkdWNlIGl0IHRvIGEgbG9jYWwgcGF0aC4uLiAqLwotICAgICAgICBpZiAoYXBfbWF0Y2hlc19yZXF1ZXN0X3Zob3N0KHIsIGhvc3QsIHBvcnQpKSB7Ci0gICAgICAgICAgICAvKiB0aGlzIGlzIG91ciBob3N0LCBzbyBvbmx5IHRoZSBVUkwgcmVtYWlucyAqLwotICAgICAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3RyZHVwKHItPnBvb2wsIHVybCk7Ci0gICAgICAgICAgICByZXdyaXRlbG9nKHIsIDMsICJyZWR1Y2UgJXMgLT4gJXMiLCBvbGR1cmksIHItPmZpbGVuYW1lKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLQotLyoKLSoqCi0qKiAgYWRkICdodHRwW3NdOi8vb3VyaG9zdFs6b3VycG9ydF0vJyB0byBVUkkKLSoqICBpZiBVUkkgaXMgc3RpbGwgbm90IGZ1bGx5IHF1YWxpZmllZAotKioKLSovCi0KLXN0YXRpYyB2b2lkIGZ1bGx5X3F1YWxpZnlfdXJpKHJlcXVlc3RfcmVjICpyKQotewotICAgIGludCBpOwotICAgIGNoYXIgYnVmWzMyXTsKLSAgICBjb25zdCBjaGFyICp0aGlzc2VydmVyOwotICAgIGNoYXIgKnRoaXNwb3J0OwotICAgIGludCBwb3J0OwotCi0gICAgaSA9IHN0cmxlbihyLT5maWxlbmFtZSk7Ci0gICAgaWYgKCEoICAgKGkgPiA3ICYmIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAiaHR0cDovLyIsICAgNykgPT0gMCkKLSAgICAgICAgICB8fCAoaSA+IDggJiYgc3RybmNhc2VjbXAoci0+ZmlsZW5hbWUsICJodHRwczovLyIsICA4KSA9PSAwKQotICAgICAgICAgIHx8IChpID4gOSAmJiBzdHJuY2FzZWNtcChyLT5maWxlbmFtZSwgImdvcGhlcjovLyIsIDkpID09IDApCi0gICAgICAgICAgfHwgKGkgPiA2ICYmIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAiZnRwOi8vIiwgICAgNikgPT0gMCkKLSAgICAgICAgICB8fCAoaSA+IDUgJiYgc3RybmNhc2VjbXAoci0+ZmlsZW5hbWUsICJsZGFwOiIsICAgICA1KSA9PSAwKQotICAgICAgICAgIHx8IChpID4gNSAmJiBzdHJuY2FzZWNtcChyLT5maWxlbmFtZSwgIm5ld3M6IiwgICAgIDUpID09IDApCi0gICAgICAgICAgfHwgKGkgPiA3ICYmIHN0cm5jYXNlY21wKHItPmZpbGVuYW1lLCAibWFpbHRvOiIsICAgNykgPT0gMCkpKSB7Ci0KLSAgICAgICAgdGhpc3NlcnZlciA9IGFwX2dldF9zZXJ2ZXJfbmFtZShyKTsKLSAgICAgICAgcG9ydCA9IGFwX2dldF9zZXJ2ZXJfcG9ydChyKTsKLSAgICAgICAgaWYgKGFwX2lzX2RlZmF1bHRfcG9ydChwb3J0LHIpKSB7Ci0gICAgICAgICAgICB0aGlzcG9ydCA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXBfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIjoldSIsIHBvcnQpOwotICAgICAgICAgICAgdGhpc3BvcnQgPSBidWY7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoci0+ZmlsZW5hbWVbMF0gPT0gJy8nKSB7Ci0gICAgICAgICAgICByLT5maWxlbmFtZSA9IGFwX3BzcHJpbnRmKHItPnBvb2wsICIlczovLyVzJXMlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX2h0dHBfbWV0aG9kKHIpLCB0aGlzc2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzcG9ydCwgci0+ZmlsZW5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgci0+ZmlsZW5hbWUgPSBhcF9wc3ByaW50ZihyLT5wb29sLCAiJXM6Ly8lcyVzLyVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfaHR0cF9tZXRob2QociksIHRoaXNzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNwb3J0LCByLT5maWxlbmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi0KLS8qCi0qKgotKiogIEV4cGFuZCB0aGUgJTAtJTkgb3IgJDAtJDkgcmVnZXggYmFja3JlZmVyZW5jZXMKLSoqCi0qLwotCi1zdGF0aWMgdm9pZCBleHBhbmRfYmFja3JlZl9pbmJ1ZmZlcihhcF9jb250ZXh0X3QgKnAsIGNoYXIgKmJ1ZiwgaW50IG5idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrcmVmaW5mbyAqYnJpLCBjaGFyIGMpCi17Ci0gICAgcmVnaXN0ZXIgaW50IGk7Ci0KLSAgICAvKiBwcm90ZWN0IGV4aXN0aW5nICROIGFuZCAmIGJhY2tyZWZzIGFuZCByZXBsYWNlIDxjPk4gd2l0aCAkTiBiYWNrcmVmcyAqLwotICAgIGZvciAoaSA9IDA7IGJ1ZltpXSAhPSAnXDAnICYmIGkgPCBuYnVmOyBpKyspIHsKLSAgICAgICAgaWYgKGJ1ZltpXSA9PSAnXFwnICYmIChidWZbaSsxXSAhPSAnXDAnICYmIGkgPCAobmJ1Zi0xKSkpIHsKLSAgICAgICAgICAgIGkrKzsgLyogcHJvdGVjdCBuZXh0ICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYnVmW2ldID09ICcmJykgewotICAgICAgICAgICAgYnVmW2ldID0gJ1wwMDEnOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGMgIT0gJyQnICYmIGJ1ZltpXSA9PSAnJCcgJiYgKGJ1ZltpKzFdID49ICcwJyAmJiBidWZbaSsxXSA8PSAnOScpKSB7Ci0gICAgICAgICAgICBidWZbaV0gPSAnXDAwMic7Ci0gICAgICAgICAgICBpKys7IC8qIHNwZWVkdXAgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChidWZbaV0gPT0gYyAmJiAoYnVmW2krMV0gPj0gJzAnICYmIGJ1ZltpKzFdIDw9ICc5JykpIHsKLSAgICAgICAgICAgIGJ1ZltpXSA9ICckJzsKLSAgICAgICAgICAgIGkrKzsgLyogc3BlZWR1cCAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogbm93IGFwcGx5IHRoZSBzdGFuZGFyZCByZWdleCBzdWJzdGl0dXRpb24gZnVuY3Rpb24gKi8KLSAgICBhcF9jcHlzdHJuKGJ1ZiwgYXBfcHJlZ3N1YihwLCBidWYsIGJyaS0+c291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyaS0+bnN1YisxLCBicmktPnJlZ21hdGNoKSwgbmJ1Zik7Ci0KLSAgICAvKiByZXN0b3JlIHRoZSBvcmlnaW5hbCAkTiBhbmQgJiBiYWNrcmVmcyAqLwotICAgIGZvciAoaSA9IDA7IGJ1ZltpXSAhPSAnXDAnICYmIGkgPCBuYnVmOyBpKyspIHsKLSAgICAgICAgaWYgKGJ1ZltpXSA9PSAnXDAwMScpIHsKLSAgICAgICAgICAgIGJ1ZltpXSA9ICcmJzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChidWZbaV0gPT0gJ1wwMDInKSB7Ci0gICAgICAgICAgICBidWZbaV0gPSAnJCc7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQotLyoKLSoqCi0qKiAgRXhwYW5kIHRpbGRlLXBhdGhzICgvfnVzZXIpIHRocm91Z2gKLSoqICBVbml4IC9ldGMvcGFzc3dkIGRhdGFiYXNlIGluZm9ybWF0aW9uCi0qKgotKi8KLSNpZiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoTkVUV0FSRSkKLXN0YXRpYyBjaGFyICpleHBhbmRfdGlsZGVwYXRocyhyZXF1ZXN0X3JlYyAqciwgY2hhciAqdXJpKQotewotICAgIGNoYXIgdXNlcltMT05HX1NUUklOR19MRU5dOwotICAgIHN0cnVjdCBwYXNzd2QgKnB3OwotICAgIGNoYXIgKm5ld3VyaTsKLSAgICBpbnQgaSwgajsKLQotICAgIG5ld3VyaSA9IHVyaTsKLSAgICBpZiAodXJpICE9IE5VTEwgJiYgc3RybGVuKHVyaSkgPiAyICYmIHVyaVswXSA9PSAnLycgJiYgdXJpWzFdID09ICd+JykgewotICAgICAgICAvKiBjdXQgb3V0IHRoZSB1c2VybmFtZSAqLwotICAgICAgICBmb3IgKGogPSAwLCBpID0gMjsgaiA8IHNpemVvZih1c2VyKS0xCi0gICAgICAgICAgICAgICAmJiB1cmlbaV0gIT0gJ1wwJwotICAgICAgICAgICAgICAgJiYgdXJpW2ldICE9ICcvJyAgOyApIHsKLSAgICAgICAgICAgIHVzZXJbaisrXSA9IHVyaVtpKytdOwotICAgICAgICB9Ci0gICAgICAgIHVzZXJbal0gPSAnXDAnOwotCi0gICAgICAgIC8qIGxvb2t1cCB1c2VybmFtZSBpbiBzeXN0ZW1zIHBhc3N3ZCBmaWxlICovCi0gICAgICAgIGlmICgocHcgPSBnZXRwd25hbSh1c2VyKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgLyogb2ssIHVzZXIgd2FzIGZvdW5kLCBzbyBleHBhbmQgdGhlIH51c2VyIHN0cmluZyAqLwotICAgICAgICAgICAgaWYgKHVyaVtpXSAhPSAnXDAnKSB7Ci0gICAgICAgICAgICAgICAgLyogfnVzZXIvYW55dGhpbmcuLi4gIGhhcyB0byBiZSBleHBhbmRlZCAqLwotICAgICAgICAgICAgICAgIGlmIChwdy0+cHdfZGlyW3N0cmxlbihwdy0+cHdfZGlyKS0xXSA9PSAnLycpIHsKLSAgICAgICAgICAgICAgICAgICAgcHctPnB3X2RpcltzdHJsZW4ocHctPnB3X2RpciktMV0gPSAnXDAnOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXd1cmkgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHB3LT5wd19kaXIsIHVyaStpLCBOVUxMKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8qIG9ubHkgfnVzZXIgaGFzIHRvIGJlIGV4cGFuZGVkICovCi0gICAgICAgICAgICAgICAgbmV3dXJpID0gYXBfcHN0cmR1cChyLT5wb29sLCBwdy0+cHdfZGlyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmV3dXJpOwotfQotI2VuZGlmCi0KLS8qCi0qKgotKiogIG1hcGZpbGUgZXhwYW5zaW9uIHN1cHBvcnQKLSoqICBpLmUuIGV4cGFuc2lvbiBvZiBNQVAgbG9va3VwIGRpcmVjdGl2ZXMKLSoqICAkezxtYXBuYW1lPjo8a2V5Pn0gaW4gUmV3cml0ZVJ1bGUgcmhzCi0qKgotKi8KLQotI2RlZmluZSBsaW1pdF9sZW5ndGgobikgKG4gPiBMT05HX1NUUklOR19MRU4tMSA/IExPTkdfU1RSSU5HX0xFTi0xIDogbikKLQotc3RhdGljIHZvaWQgZXhwYW5kX21hcF9sb29rdXBzKHJlcXVlc3RfcmVjICpyLCBjaGFyICp1cmksIGludCB1cmlfbGVuKQotewotICAgIGNoYXIgbmV3dXJpW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyICpjcEk7Ci0gICAgY2hhciAqY3BJRTsKLSAgICBjaGFyICpjcE87Ci0gICAgY2hhciAqY3BUOwotICAgIGNoYXIgKmNwVDI7Ci0gICAgY2hhciBtYXBuYW1lW0xPTkdfU1RSSU5HX0xFTl07Ci0gICAgY2hhciBtYXBrZXlbTE9OR19TVFJJTkdfTEVOXTsKLSAgICBjaGFyIGRlZmF1bHR2YWx1ZVtMT05HX1NUUklOR19MRU5dOwotICAgIGludCBuOwotCi0gICAgY3BJID0gdXJpOwotICAgIGNwSUUgPSBjcEkrc3RybGVuKGNwSSk7Ci0gICAgY3BPID0gbmV3dXJpOwotICAgIHdoaWxlIChjcEkgPCBjcElFKSB7Ci0gICAgICAgIGlmIChjcEkrNiA8IGNwSUUgJiYgc3RybmNtcChjcEksICIkeyIsIDIpID09IDApIHsKLSAgICAgICAgICAgIC8qIG1pc3NpbmcgZGVsaW1pdGVyIC0+IHRha2UgaXQgYXMgcGxhaW4gdGV4dCAqLwotICAgICAgICAgICAgaWYgKCAgIHN0cmNocihjcEkrMiwgJzonKSA9PSBOVUxMCi0gICAgICAgICAgICAgICAgfHwgc3RyY2hyKGNwSSsyLCAnfScpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkoY3BPLCBjcEksIDIpOwotICAgICAgICAgICAgICAgIGNwTyArPSAyOwotICAgICAgICAgICAgICAgIGNwSSArPSAyOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3BJICs9IDI7Ci0KLSAgICAgICAgICAgIGNwVCA9IHN0cmNocihjcEksICc6Jyk7Ci0gICAgICAgICAgICBuID0gY3BULWNwSTsKLSAgICAgICAgICAgIG1lbWNweShtYXBuYW1lLCBjcEksIGxpbWl0X2xlbmd0aChuKSk7Ci0gICAgICAgICAgICBtYXBuYW1lW2xpbWl0X2xlbmd0aChuKV0gPSAnXDAnOwotICAgICAgICAgICAgY3BJICs9IG4rMTsKLQotICAgICAgICAgICAgY3BUMiA9IHN0cmNocihjcEksICd8Jyk7Ci0gICAgICAgICAgICBjcFQgPSBzdHJjaHIoY3BJLCAnfScpOwotICAgICAgICAgICAgaWYgKGNwVDIgIT0gTlVMTCAmJiBjcFQyIDwgY3BUKSB7Ci0gICAgICAgICAgICAgICAgbiA9IGNwVDItY3BJOwotICAgICAgICAgICAgICAgIG1lbWNweShtYXBrZXksIGNwSSwgbGltaXRfbGVuZ3RoKG4pKTsKLSAgICAgICAgICAgICAgICBtYXBrZXlbbGltaXRfbGVuZ3RoKG4pXSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgY3BJICs9IG4rMTsKLQotICAgICAgICAgICAgICAgIG4gPSBjcFQtY3BJOwotICAgICAgICAgICAgICAgIG1lbWNweShkZWZhdWx0dmFsdWUsIGNwSSwgbGltaXRfbGVuZ3RoKG4pKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0dmFsdWVbbGltaXRfbGVuZ3RoKG4pXSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgY3BJICs9IG4rMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIG4gPSBjcFQtY3BJOwotICAgICAgICAgICAgICAgIG1lbWNweShtYXBrZXksIGNwSSwgbGltaXRfbGVuZ3RoKG4pKTsKLSAgICAgICAgICAgICAgICBtYXBrZXlbbGltaXRfbGVuZ3RoKG4pXSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgY3BJICs9IG4rMTsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHR2YWx1ZVswXSA9ICdcMCc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNwVCA9IGxvb2t1cF9tYXAociwgbWFwbmFtZSwgbWFwa2V5KTsKLSAgICAgICAgICAgIGlmIChjcFQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG4gPSBzdHJsZW4oY3BUKTsKLSAgICAgICAgICAgICAgICBpZiAoY3BPICsgbiA+PSBuZXd1cmkgKyBzaXplb2YobmV3dXJpKSkgewotICAgICAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgciwgImluc3VmZmljaWVudCBzcGFjZSBpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwYW5kX21hcF9sb29rdXBzLCBhYm9ydGluZyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweShjcE8sIGNwVCwgbik7Ci0gICAgICAgICAgICAgICAgY3BPICs9IG47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBuID0gc3RybGVuKGRlZmF1bHR2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNwTyArIG4gPj0gbmV3dXJpICsgc2l6ZW9mKG5ld3VyaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCByLCAiaW5zdWZmaWNpZW50IHNwYWNlIGluICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBhbmRfbWFwX2xvb2t1cHMsIGFib3J0aW5nIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGNwTywgZGVmYXVsdHZhbHVlLCBuKTsKLSAgICAgICAgICAgICAgICBjcE8gKz0gbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNwVCA9IHN0cnN0cihjcEksICIkeyIpOwotICAgICAgICAgICAgaWYgKGNwVCA9PSBOVUxMKQotICAgICAgICAgICAgICAgIGNwVCA9IGNwSStzdHJsZW4oY3BJKTsKLSAgICAgICAgICAgIG4gPSBjcFQtY3BJOwotICAgICAgICAgICAgaWYgKGNwTyArIG4gPj0gbmV3dXJpICsgc2l6ZW9mKG5ld3VyaSkpIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgciwgImluc3VmZmljaWVudCBzcGFjZSBpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBhbmRfbWFwX2xvb2t1cHMsIGFib3J0aW5nIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KGNwTywgY3BJLCBuKTsKLSAgICAgICAgICAgIGNwTyArPSBuOwotICAgICAgICAgICAgY3BJICs9IG47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKmNwTyA9ICdcMCc7Ci0gICAgYXBfY3B5c3Rybih1cmksIG5ld3VyaSwgdXJpX2xlbik7Ci0gICAgcmV0dXJuOwotfQotCi0jdW5kZWYgbGltaXRfbGVuZ3RoCi0KLQotCi0vKgotKiogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSoqIHwgICAgICAgICAgICAgIERCTSBoYXNoZmlsZSBzdXBwb3J0Ci0qKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSoqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLQotCi1zdGF0aWMgY2hhciAqbG9va3VwX21hcChyZXF1ZXN0X3JlYyAqciwgY2hhciAqbmFtZSwgY2hhciAqa2V5KQotewotICAgIHZvaWQgKnNjb25mOwotICAgIHJld3JpdGVfc2VydmVyX2NvbmYgKmNvbmY7Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKnJld3JpdGVtYXBzOwotICAgIHJld3JpdGVtYXBfZW50cnkgKmVudHJpZXM7Ci0gICAgcmV3cml0ZW1hcF9lbnRyeSAqczsKLSAgICBjaGFyICp2YWx1ZTsKLSAgICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgICBpbnQgaTsKLQotICAgIC8qIGdldCBtYXAgY29uZmlndXJhdGlvbiAqLwotICAgIHNjb25mID0gci0+c2VydmVyLT5tb2R1bGVfY29uZmlnOwotICAgIGNvbmYgID0gKHJld3JpdGVfc2VydmVyX2NvbmYgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhzY29uZiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXdyaXRlX21vZHVsZSk7Ci0gICAgcmV3cml0ZW1hcHMgPSBjb25mLT5yZXdyaXRlbWFwczsKLQotICAgIGVudHJpZXMgPSAocmV3cml0ZW1hcF9lbnRyeSAqKXJld3JpdGVtYXBzLT5lbHRzOwotICAgIGZvciAoaSA9IDA7IGkgPCByZXdyaXRlbWFwcy0+bmVsdHM7IGkrKykgewotICAgICAgICBzID0gJmVudHJpZXNbaV07Ci0gICAgICAgIGlmIChzdHJjbXAocy0+bmFtZSwgbmFtZSkgPT0gMCkgewotICAgICAgICAgICAgaWYgKHMtPnR5cGUgPT0gTUFQVFlQRV9UWFQpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdChzLT5jaGVja2ZpbGUsICZzdCkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIDAsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9kX3Jld3JpdGU6IGNhbid0IGFjY2VzcyB0ZXh0IFJld3JpdGVNYXAgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUgJXMiLCBzLT5jaGVja2ZpbGUpOwotICAgICAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDEsICJjYW4ndCBvcGVuIFJld3JpdGVNYXAgZmlsZSwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWUgZXJyb3IgbG9nIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldF9jYWNoZV9zdHJpbmcoY2FjaGVwLCBzLT5uYW1lLCBDQUNIRU1PREVfVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LnN0X210aW1lLCBrZXkpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJld3JpdGVsb2cociwgNiwgImNhY2hlIGxvb2t1cCBGQUlMRUQsIGZvcmNpbmcgbmV3ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFwIGxvb2t1cCIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbHVlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBfbWFwX3R4dGZpbGUociwgcy0+ZGF0YWZpbGUsIGtleSkpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJld3JpdGVsb2cociwgNSwgIm1hcCBsb29rdXAgT0s6IG1hcD0lcyBrZXk9JXNbdHh0XSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPiB2YWw9JXMiLCBzLT5uYW1lLCBrZXksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9jYWNoZV9zdHJpbmcoY2FjaGVwLCBzLT5uYW1lLCBDQUNIRU1PREVfVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LnN0X210aW1lLCBrZXksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJld3JpdGVsb2cociwgNSwgIm1hcCBsb29rdXAgRkFJTEVEOiBtYXA9JXNbdHh0XSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrZXk9JXMiLCBzLT5uYW1lLCBrZXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2NhY2hlX3N0cmluZyhjYWNoZXAsIHMtPm5hbWUsIENBQ0hFTU9ERV9UUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Quc3RfbXRpbWUsIGtleSwgIiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJld3JpdGVsb2cociwgNSwgImNhY2hlIGxvb2t1cCBPSzogbWFwPSVzW3R4dF0ga2V5PSVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLT4gdmFsPSVzIiwgcy0+bmFtZSwga2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVswXSAhPSAnXDAnID8gdmFsdWUgOiBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHMtPnR5cGUgPT0gTUFQVFlQRV9EQk0pIHsKLSNpZm5kZWYgTk9fREJNX1JFV1JJVEVNQVAKLSAgICAgICAgICAgICAgICBpZiAoc3RhdChzLT5jaGVja2ZpbGUsICZzdCkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGVycm5vLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vZF9yZXdyaXRlOiBjYW4ndCBhY2Nlc3MgREJNIFJld3JpdGVNYXAgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUgJXMiLCBzLT5jaGVja2ZpbGUpOwotICAgICAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDEsICJjYW4ndCBvcGVuIERCTSBSZXdyaXRlTWFwIGZpbGUsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VlIGVycm9yIGxvZyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRfY2FjaGVfc3RyaW5nKGNhY2hlcCwgcy0+bmFtZSwgQ0FDSEVNT0RFX1RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC5zdF9tdGltZSwga2V5KTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlIGxvb2t1cCBGQUlMRUQsIGZvcmNpbmcgbmV3IG1hcCBsb29rdXAiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh2YWx1ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwX21hcF9kYm1maWxlKHIsIHMtPmRhdGFmaWxlLCBrZXkpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDUsICJtYXAgbG9va3VwIE9LOiBtYXA9JXNbZGJtXSBrZXk9JXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLT4gdmFsPSVzIiwgcy0+bmFtZSwga2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfY2FjaGVfc3RyaW5nKGNhY2hlcCwgcy0+bmFtZSwgQ0FDSEVNT0RFX1RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC5zdF9tdGltZSwga2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDUsICJtYXAgbG9va3VwIEZBSUxFRDogbWFwPSVzW2RibV0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia2V5PSVzIiwgcy0+bmFtZSwga2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9jYWNoZV9zdHJpbmcoY2FjaGVwLCBzLT5uYW1lLCBDQUNIRU1PREVfVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LnN0X210aW1lLCBrZXksICIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDUsICJjYWNoZSBsb29rdXAgT0s6IG1hcD0lc1tkYm1dIGtleT0lcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+IHZhbD0lcyIsIHMtPm5hbWUsIGtleSwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVbMF0gIT0gJ1wwJyA/IHZhbHVlIDogTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzLT50eXBlID09IE1BUFRZUEVfUFJHKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCh2YWx1ZSA9Ci0gICAgICAgICAgICAgICAgICAgICBsb29rdXBfbWFwX3Byb2dyYW0ociwgcy0+ZnBpbiwgcy0+ZnBvdXQsIGtleSkpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCA1LCAibWFwIGxvb2t1cCBPSzogbWFwPSVzIGtleT0lcyAtPiB2YWw9JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm5hbWUsIGtleSwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDUsICJtYXAgbG9va3VwIEZBSUxFRDogbWFwPSVzIGtleT0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bmFtZSwga2V5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzLT50eXBlID09IE1BUFRZUEVfSU5UKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCh2YWx1ZSA9IGxvb2t1cF9tYXBfaW50ZXJuYWwociwgcy0+ZnVuYywga2V5KSkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDUsICJtYXAgbG9va3VwIE9LOiBtYXA9JXMga2V5PSVzIC0+IHZhbD0lcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bmFtZSwga2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJld3JpdGVsb2cociwgNSwgIm1hcCBsb29rdXAgRkFJTEVEOiBtYXA9JXMga2V5PSVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5uYW1lLCBrZXkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHMtPnR5cGUgPT0gTUFQVFlQRV9STkQpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdChzLT5jaGVja2ZpbGUsICZzdCkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGVycm5vLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vZF9yZXdyaXRlOiBjYW4ndCBhY2Nlc3MgdGV4dCBSZXdyaXRlTWFwICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlICVzIiwgcy0+Y2hlY2tmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCAxLCAiY2FuJ3Qgb3BlbiBSZXdyaXRlTWFwIGZpbGUsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VlIGVycm9yIGxvZyIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRfY2FjaGVfc3RyaW5nKGNhY2hlcCwgcy0+bmFtZSwgQ0FDSEVNT0RFX1RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC5zdF9tdGltZSwga2V5KTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDYsICJjYWNoZSBsb29rdXAgRkFJTEVELCBmb3JjaW5nIG5ldyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hcCBsb29rdXAiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh2YWx1ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwX21hcF90eHRmaWxlKHIsIHMtPmRhdGFmaWxlLCBrZXkpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDUsICJtYXAgbG9va3VwIE9LOiBtYXA9JXMga2V5PSVzW3R4dF0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLT4gdmFsPSVzIiwgcy0+bmFtZSwga2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRfY2FjaGVfc3RyaW5nKGNhY2hlcCwgcy0+bmFtZSwgQ0FDSEVNT0RFX1RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC5zdF9tdGltZSwga2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDUsICJtYXAgbG9va3VwIEZBSUxFRDogbWFwPSVzW3R4dF0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia2V5PSVzIiwgcy0+bmFtZSwga2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldF9jYWNoZV9zdHJpbmcoY2FjaGVwLCBzLT5uYW1lLCBDQUNIRU1PREVfVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LnN0X210aW1lLCBrZXksICIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDUsICJjYWNoZSBsb29rdXAgT0s6IG1hcD0lc1t0eHRdIGtleT0lcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+IHZhbD0lcyIsIHMtPm5hbWUsIGtleSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodmFsdWVbMF0gIT0gJ1wwJykgewotICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZWN0X3JhbmRvbV92YWx1ZV9wYXJ0KHIsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICByZXdyaXRlbG9nKHIsIDUsICJyYW5kb21seSBjaG9vc2VuIHRoZSBzdWJ2YWx1ZSBgJXMnIiwgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjaGFyICpsb29rdXBfbWFwX3R4dGZpbGUocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmZpbGUsIGNoYXIgKmtleSkKLXsKLSAgICBhcF9maWxlX3QgKmZwID0gTlVMTDsKLSAgICBhcF9zdGF0dXNfdCByYzsKLSAgICBjaGFyIGxpbmVbMTAyNF07Ci0gICAgY2hhciAqdmFsdWUgPSBOVUxMOwotICAgIGNoYXIgKmNwVDsKLSAgICBzaXplX3Qgc2tpcDsKLSAgICBjaGFyICpjdXJrZXk7Ci0gICAgY2hhciAqY3VydmFsOwotCi0gICAgcmMgPSBhcF9vcGVuKCZmcCwgZmlsZSwgQVBSX1JFQUQgfCBBUFJfQlVGRkVSRUQsIEFQUl9PU19ERUZBVUxULCByLT5wb29sKTsKLSAgICBpZiAocmMgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICB3aGlsZSAoYXBfZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkgPT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgaWYgKGxpbmVbMF0gPT0gJyMnKQotICAgICAgICAgICAgY29udGludWU7IC8qIGlnbm9yZSBjb21tZW50cyAqLwotICAgICAgICBjcFQgPSBsaW5lOwotICAgICAgICBjdXJrZXkgPSBjcFQ7Ci0gICAgICAgIHNraXAgPSBzdHJjc3BuKGNwVCwiIFx0XHJcbiIpOwotICAgICAgICBpZiAoc2tpcCA9PSAwKQotICAgICAgICAgICAgY29udGludWU7IC8qIGlnbm9yZSBsaW5lcyB0aGF0IHN0YXJ0IHdpdGggYSBzcGFjZSwgdGFiLCBDUiwgb3IgTEYgKi8KLSAgICAgICAgY3BUICs9IHNraXA7Ci0gICAgICAgICpjcFQgPSAnXDAnOwotICAgICAgICBpZiAoc3RyY21wKGN1cmtleSwga2V5KSAhPSAwKQotICAgICAgICAgICAgY29udGludWU7IC8qIGtleSBkb2VzIG5vdCBtYXRjaC4uLiAqLwotICAgICAgICAgICAgCi0gICAgICAgIC8qIGZvdW5kIGEgbWF0Y2hpbmcga2V5OyBub3cgZXh0cmFjdCBhbmQgcmV0dXJuIHRoZSB2YWx1ZSAqLwotICAgICAgICArK2NwVDsKLSAgICAgICAgc2tpcCA9IHN0cnNwbihjcFQsICIgXHRcclxuIik7Ci0gICAgICAgIGNwVCArPSBza2lwOwotICAgICAgICBjdXJ2YWwgPSBjcFQ7Ci0gICAgICAgIHNraXAgPSBzdHJjc3BuKGNwVCwgIiBcdFxyXG4iKTsKLSAgICAgICAgaWYgKHNraXAgPT0gMCkKLSAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBubyB2YWx1ZS4uLiAqLwotICAgICAgICBjcFQgKz0gc2tpcDsKLSAgICAgICAgKmNwVCA9ICdcMCc7Ci0gICAgICAgIHZhbHVlID0gYXBfcHN0cmR1cChyLT5wb29sLCBjdXJ2YWwpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgYXBfY2xvc2UoZnApOwotICAgIHJldHVybiB2YWx1ZTsKLX0KLQotI2lmbmRlZiBOT19EQk1fUkVXUklURU1BUAotc3RhdGljIGNoYXIgKmxvb2t1cF9tYXBfZGJtZmlsZShyZXF1ZXN0X3JlYyAqciwgY2hhciAqZmlsZSwgY2hhciAqa2V5KQotewotICAgIERCTSAqZGJtZnAgPSBOVUxMOwotICAgIGRhdHVtIGRibWtleTsKLSAgICBkYXR1bSBkYm12YWw7Ci0gICAgY2hhciAqdmFsdWUgPSBOVUxMOwotICAgIGNoYXIgYnVmW01BWF9TVFJJTkdfTEVOXTsKLQotICAgIGRibWtleS5kcHRyICA9IGtleTsKLSAgICBkYm1rZXkuZHNpemUgPSBzdHJsZW4oa2V5KTsKLSAgICBpZiAoKGRibWZwID0gZGJtX29wZW4oZmlsZSwgT19SRE9OTFksIDA2NjYpKSAhPSBOVUxMKSB7Ci0gICAgICAgIGRibXZhbCA9IGRibV9mZXRjaChkYm1mcCwgZGJta2V5KTsKLSAgICAgICAgaWYgKGRibXZhbC5kcHRyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1lbWNweShidWYsIGRibXZhbC5kcHRyLCAKLSAgICAgICAgICAgICAgICAgICBkYm12YWwuZHNpemUgPCBzaXplb2YoYnVmKS0xID8gCi0gICAgICAgICAgICAgICAgICAgZGJtdmFsLmRzaXplIDogc2l6ZW9mKGJ1ZiktMSAgKTsKLSAgICAgICAgICAgIGJ1ZltkYm12YWwuZHNpemVdID0gJ1wwJzsKLSAgICAgICAgICAgIHZhbHVlID0gYXBfcHN0cmR1cChyLT5wb29sLCBidWYpOwotICAgICAgICB9Ci0gICAgICAgIGRibV9jbG9zZShkYm1mcCk7Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgY2hhciAqbG9va3VwX21hcF9wcm9ncmFtKHJlcXVlc3RfcmVjICpyLCBhcF9maWxlX3QgKmZwaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX2ZpbGVfdCAqZnBvdXQsIGNoYXIgKmtleSkKLXsKLSAgICBjaGFyIGJ1ZltMT05HX1NUUklOR19MRU5dOwotICAgIGNoYXIgYzsKLSAgICBpbnQgaTsKLSAgICBpbnQgc2l6ZV92YWw7Ci0jaWZuZGVmIE5PX1dSSVRFVgotICAgIGFwX2lvdmVjX3QgKmlvdjsKLSAgICBzdHJ1Y3QgaW92ZWMgaW92YVsyXTsKLSNlbmRpZgotCi0gICAgLyogd2hlbiBgUmV3cml0ZUVuZ2luZSBvZmYnIHdhcyB1c2VkIGluIHRoZSBwZXItc2VydmVyCi0gICAgICogY29udGV4dCB0aGVuIHRoZSByZXdyaXRlbWFwLXByb2dyYW1zIHdlcmUgbm90IHNwYXduZWQuCi0gICAgICogSW4gdGhpcyBjYXNlIHVzaW5nIHN1Y2ggYSBtYXAgKHVzdWFsbHkgaW4gcGVyLWRpciBjb250ZXh0KQotICAgICAqIGlzIHVzZWxlc3MgYmVjYXVzZSBpdCBpcyBub3QgYXZhaWxhYmxlLgotICAgICAqLwotICAgIGlmIChmcGluID09IE5VTEwgfHwgZnBvdXQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiB0YWtlIHRoZSBsb2NrICovCi0gICAgcmV3cml0ZWxvY2tfYWxsb2Mocik7Ci0KLSAgICAvKiB3cml0ZSBvdXQgdGhlIHJlcXVlc3Qga2V5ICovCi0jaWZkZWYgTk9fV1JJVEVWCi0gICAgYXBfd3JpdGUoZnBpbiwga2V5LCBzdHJsZW4oa2V5KSk7Ci0gICAgYXBfd3JpdGUoZnBpbiwgIlxuIiwgMSk7Ci0jZWxzZQotICAgIGlvdmFbMF0uaW92X2Jhc2UgPSBrZXk7Ci0gICAgaW92YVswXS5pb3ZfbGVuID0gc3RybGVuKGtleSk7Ci0gICAgaW92YVsxXS5pb3ZfYmFzZSA9ICJcbiI7Ci0gICAgaW92YVsxXS5pb3ZfbGVuID0gMTsKLQotICAgIGFwX21ha2VfaW92KCZpb3YsIGlvdmEsIHItPnBvb2wpOwotICAgIHNpemVfdmFsID0gMjsKLSAgICBhcF93cml0ZXYoZnBpbiwgaW92LCAmc2l6ZV92YWwpOwotI2VuZGlmCi0KLSAgICAvKiByZWFkIGluIHRoZSByZXNwb25zZSB2YWx1ZSAqLwotICAgIGkgPSAwOwotICAgIHNpemVfdmFsID0gMTsKLSAgICBhcF9yZWFkKGZwb3V0LCAmYywgJnNpemVfdmFsKTsKLSAgICB3aGlsZSAoc2l6ZV92YWwgPT0gMSAmJiAoaSA8IExPTkdfU1RSSU5HX0xFTi0xKSkgewotICAgICAgICBpZiAoYyA9PSAnXG4nKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBidWZbaSsrXSA9IGM7Ci0KLSAgICAgICAgYXBfcmVhZChmcG91dCwgJmMsICZzaXplX3ZhbCk7Ci0gICAgfQotICAgIGJ1ZltpXSA9ICdcMCc7Ci0KLSAgICAvKiBnaXZlIHRoZSBsb2NrIGJhY2sgKi8KLSAgICByZXdyaXRlbG9ja19mcmVlKHIpOwotCi0gICAgaWYgKHN0cmNhc2VjbXAoYnVmLCAiTlVMTCIpID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXR1cm4gYXBfcHN0cmR1cChyLT5wb29sLCBidWYpOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKmxvb2t1cF9tYXBfaW50ZXJuYWwocmVxdWVzdF9yZWMgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICooKmZ1bmMpKHJlcXVlc3RfcmVjICosIGNoYXIgKiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICprZXkpCi17Ci0gICAgLyogY3VycmVudGx5IHdlIGp1c3QgbGV0IHRoZSBmdW5jdGlvbiBjb252ZXJ0Ci0gICAgICAgdGhlIGtleSB0byBhIGNvcnJlc3BvbmRpbmcgdmFsdWUgKi8KLSAgICByZXR1cm4gZnVuYyhyLCBrZXkpOwotfQotCi1zdGF0aWMgY2hhciAqcmV3cml0ZV9tYXBmdW5jX3RvdXBwZXIocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmtleSkKLXsKLSAgICBjaGFyICp2YWx1ZSwgKmNwOwotCi0gICAgZm9yIChjcCA9IHZhbHVlID0gYXBfcHN0cmR1cChyLT5wb29sLCBrZXkpOyBjcCAhPSBOVUxMICYmICpjcCAhPSAnXDAnOwotICAgICAgICAgY3ArKykgewotICAgICAgICAqY3AgPSBhcF90b3VwcGVyKCpjcCk7Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIGNoYXIgKnJld3JpdGVfbWFwZnVuY190b2xvd2VyKHJlcXVlc3RfcmVjICpyLCBjaGFyICprZXkpCi17Ci0gICAgY2hhciAqdmFsdWUsICpjcDsKLQotICAgIGZvciAoY3AgPSB2YWx1ZSA9IGFwX3BzdHJkdXAoci0+cG9vbCwga2V5KTsgY3AgIT0gTlVMTCAmJiAqY3AgIT0gJ1wwJzsKLSAgICAgICAgIGNwKyspIHsKLSAgICAgICAgKmNwID0gYXBfdG9sb3dlcigqY3ApOwotICAgIH0KLSAgICByZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyBjaGFyICpyZXdyaXRlX21hcGZ1bmNfZXNjYXBlKHJlcXVlc3RfcmVjICpyLCBjaGFyICprZXkpCi17Ci0gICAgY2hhciAqdmFsdWU7Ci0KLSAgICB2YWx1ZSA9IGFwX2VzY2FwZV91cmkoci0+cG9vbCwga2V5KTsKLSAgICByZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyBjaGFyICpyZXdyaXRlX21hcGZ1bmNfdW5lc2NhcGUocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmtleSkKLXsKLSAgICBjaGFyICp2YWx1ZTsKLQotICAgIHZhbHVlID0gYXBfcHN0cmR1cChyLT5wb29sLCBrZXkpOwotICAgIGFwX3VuZXNjYXBlX3VybCh2YWx1ZSk7Ci0gICAgcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgaW50IHJld3JpdGVfcmFuZF9pbml0X2RvbmUgPSAwOwotCi1zdGF0aWMgdm9pZCByZXdyaXRlX3JhbmRfaW5pdCh2b2lkKQotewotICAgIGlmICghcmV3cml0ZV9yYW5kX2luaXRfZG9uZSkgewotICAgICAgICBzcmFuZCgodW5zaWduZWQpKGdldHBpZCgpKSk7Ci0gICAgICAgIHJld3JpdGVfcmFuZF9pbml0X2RvbmUgPSAxOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQgcmV3cml0ZV9yYW5kKGludCBsLCBpbnQgaCkKLXsKLSAgICByZXdyaXRlX3JhbmRfaW5pdCgpOwotCi0gICAgLyogR2V0IFswLDEpIGFuZCB0aGVuIHNjYWxlIHRvIHRoZSBhcHByb3ByaWF0ZSByYW5nZS4gTm90ZSB0aGF0IHVzaW5nCi0gICAgICogYSBmbG9hdGluZyBwb2ludCB2YWx1ZSBlbnN1cmVzIHRoYXQgd2UgdXNlIGFsbCBiaXRzIG9mIHRoZSByYW5kKCkKLSAgICAgKiByZXN1bHQuIERvaW5nIGFuIGludGVnZXIgbW9kdWx1cyB3b3VsZCBvbmx5IHVzZSB0aGUgbG93ZXItb3JkZXIgYml0cwotICAgICAqIHdoaWNoIG1heSBub3QgYmUgYXMgdW5pZm9ybWx5IHJhbmRvbS4KLSAgICAgKi8KLSAgICByZXR1cm4gKChkb3VibGUpKHJhbmQoKSAlIFJBTkRfTUFYKSAvIFJBTkRfTUFYKSAqIChoIC0gbCArIDEpICsgbDsKLX0KLQotc3RhdGljIGNoYXIgKnNlbGVjdF9yYW5kb21fdmFsdWVfcGFydChyZXF1ZXN0X3JlYyAqciwgY2hhciAqdmFsdWUpCi17Ci0gICAgY2hhciAqYnVmOwotICAgIGludCBuLCBpLCBrOwotCi0gICAgLyogIGNvdW50IG51bWJlciBvZiBkaXN0aW5jdCB2YWx1ZXMgICovCi0gICAgZm9yIChuID0gMSwgaSA9IDA7IHZhbHVlW2ldICE9ICdcMCc7IGkrKykgewotICAgICAgICBpZiAodmFsdWVbaV0gPT0gJ3wnKSB7Ci0gICAgICAgICAgICBuKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAgd2hlbiBvbmx5IG9uZSB2YWx1ZSB3ZSBoYXZlIG5vIG9wdGlvbiB0byBjaG9vc2UgICovCi0gICAgaWYgKG4gPT0gMSkgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyogIGVsc2UgcmFuZG9tbHkgc2VsZWN0IG9uZSAgKi8KLSAgICBrID0gcmV3cml0ZV9yYW5kKDEsIG4pOwotCi0gICAgLyogIGFuZCBncmVwIGl0IG91dCAgKi8KLSAgICBmb3IgKG4gPSAxLCBpID0gMDsgdmFsdWVbaV0gIT0gJ1wwJzsgaSsrKSB7Ci0gICAgICAgIGlmIChuID09IGspIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZVtpXSA9PSAnfCcpIHsKLSAgICAgICAgICAgIG4rKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBidWYgPSBhcF9wc3RyZHVwKHItPnBvb2wsICZ2YWx1ZVtpXSk7Ci0gICAgZm9yIChpID0gMDsgYnVmW2ldICE9ICdcMCcgJiYgYnVmW2ldICE9ICd8JzsgaSsrKQotICAgICAgICA7Ci0gICAgYnVmW2ldID0gJ1wwJzsKLSAgICByZXR1cm4gYnVmOwotfQotCi0KLS8qCi0qKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSoqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiogfCAgICAgICAgICAgICAgcmV3cml0aW5nIGxvZ2ZpbGUgc3VwcG9ydAotKiogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSovCi0KLQotc3RhdGljIHZvaWQgb3Blbl9yZXdyaXRlbG9nKHNlcnZlcl9yZWMgKnMsIGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICByZXdyaXRlX3NlcnZlcl9jb25mICpjb25mOwotICAgIGNvbnN0IGNoYXIgKmZuYW1lOwotICAgIGFwX3N0YXR1c190IHJjOwotICAgIHBpcGVkX2xvZyAqcGw7Ci0gICAgaW50ICAgIHJld3JpdGVsb2dfZmxhZ3MgPSAoIEFQUl9XUklURSB8IEFQUl9BUFBFTkQgfCBBUFJfQ1JFQVRFICk7Ci0gICAgbW9kZV90IHJld3JpdGVsb2dfbW9kZSAgPSAoIEFQUl9VUkVBRCB8IEFQUl9VV1JJVEUgfCBBUFJfR1JFQUQgfCBBUFJfV1JFQUQgKTsKLQotICAgIGNvbmYgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAmcmV3cml0ZV9tb2R1bGUpOwotCi0gICAgaWYgKGNvbmYtPnJld3JpdGVsb2dmaWxlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoKihjb25mLT5yZXdyaXRlbG9nZmlsZSkgPT0gJ1wwJykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChjb25mLT5yZXdyaXRlbG9nZnAgIT0gTlVMTCkgewotICAgICAgICByZXR1cm47IC8qIHZpcnR1YWwgbG9nIHNoYXJlZCB3LyBtYWluIHNlcnZlciAqLwotICAgIH0KLQotICAgIGZuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocCwgY29uZi0+cmV3cml0ZWxvZ2ZpbGUpOwotCi0gICAgaWYgKCpjb25mLT5yZXdyaXRlbG9nZmlsZSA9PSAnfCcpIHsKLSAgICAgICAgaWYgKChwbCA9IGFwX29wZW5fcGlwZWRfbG9nKHAsIGNvbmYtPnJld3JpdGVsb2dmaWxlKzEpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCAwLCBzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAibW9kX3Jld3JpdGU6IGNvdWxkIG5vdCBvcGVuIHJlbGlhYmxlIHBpcGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJ0byBSZXdyaXRlTG9nIGZpbHRlciAlcyIsIGNvbmYtPnJld3JpdGVsb2dmaWxlKzEpOwotICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgICBjb25mLT5yZXdyaXRlbG9nZnAgPSBhcF9waXBlZF9sb2dfd3JpdGVfZmQocGwpOwotICAgIH0KLSAgICBlbHNlIGlmICgqY29uZi0+cmV3cml0ZWxvZ2ZpbGUgIT0gJ1wwJykgewotICAgICAgICByYyA9IGFwX29wZW4oJmNvbmYtPnJld3JpdGVsb2dmcCwgZm5hbWUsIHJld3JpdGVsb2dfZmxhZ3MsIHJld3JpdGVsb2dfbW9kZSwgcCk7Ci0gICAgICAgIGlmIChyYyAhPSBBUFJfU1VDQ0VTUykgIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIDAsIHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICJtb2RfcmV3cml0ZTogY291bGQgbm90IG9wZW4gUmV3cml0ZUxvZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUgJXMiLCBmbmFtZSk7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgcmV3cml0ZWxvZyhyZXF1ZXN0X3JlYyAqciwgaW50IGxldmVsLCBjb25zdCBjaGFyICp0ZXh0LCAuLi4pCi17Ci0gICAgcmV3cml0ZV9zZXJ2ZXJfY29uZiAqY29uZjsKLSAgICBjb25uX3JlYyAqY29ubjsKLSAgICBjaGFyICpzdHIxOwotICAgIGNoYXIgc3RyMls1MTJdOwotICAgIGNoYXIgc3RyM1sxMDI0XTsKLSAgICBjaGFyIHR5cGVbMjBdOwotICAgIGNoYXIgcmVkaXJbMjBdOwotICAgIHZhX2xpc3QgYXA7Ci0gICAgaW50IGksIHNpemVfdmFsOwotICAgIHJlcXVlc3RfcmVjICpyZXE7Ci0gICAgY2hhciAqcnVzZXI7Ci0gICAgY29uc3QgY2hhciAqcmhvc3Q7Ci0KLSAgICB2YV9zdGFydChhcCwgdGV4dCk7Ci0gICAgY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgJnJld3JpdGVfbW9kdWxlKTsKLSAgICBjb25uID0gci0+Y29ubmVjdGlvbjsKLQotICAgIGlmIChjb25mLT5yZXdyaXRlbG9nZnAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChjb25mLT5yZXdyaXRlbG9nZmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCooY29uZi0+cmV3cml0ZWxvZ2ZpbGUpID09ICdcMCcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChsZXZlbCA+IGNvbmYtPnJld3JpdGVsb2dsZXZlbCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHItPnVzZXIgPT0gTlVMTCkgewotICAgICAgICBydXNlciA9ICItIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RybGVuKHItPnVzZXIpICE9IDApIHsKLSAgICAgICAgcnVzZXIgPSByLT51c2VyOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcnVzZXIgPSAiXCJcIiI7Ci0gICAgfQotCi0gICAgcmhvc3QgPSBhcF9nZXRfcmVtb3RlX2hvc3QoY29ubiwgci0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRU1PVEVfTk9MT09LVVApOwotICAgIGlmIChyaG9zdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJob3N0ID0gIlVOS05PV04tSE9TVCI7Ci0gICAgfQotCi0gICAgc3RyMSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgcmhvc3QsICIgIiwKLSAgICAgICAgICAgICAgICAgICAgICAoY29ubi0+cmVtb3RlX2xvZ25hbWUgIT0gTlVMTCA/Ci0gICAgICAgICAgICAgICAgICAgICAgY29ubi0+cmVtb3RlX2xvZ25hbWUgOiAiLSIpLCAiICIsCi0gICAgICAgICAgICAgICAgICAgICAgcnVzZXIsIE5VTEwpOwotICAgIGFwX3ZzbnByaW50ZihzdHIyLCBzaXplb2Yoc3RyMiksIHRleHQsIGFwKTsKLQotICAgIGlmIChyLT5tYWluID09IE5VTEwpIHsKLSAgICAgICAgc3RyY3B5KHR5cGUsICJpbml0aWFsIik7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBzdHJjcHkodHlwZSwgInN1YnJlcSIpOwotICAgIH0KLQotICAgIGZvciAoaSA9IDAsIHJlcSA9IHI7IHJlcS0+cHJldiAhPSBOVUxMOyByZXEgPSByZXEtPnByZXYpIHsKLSAgICAgICAgaSsrOwotICAgIH0KLSAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgIHJlZGlyWzBdID0gJ1wwJzsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGFwX3NucHJpbnRmKHJlZGlyLCBzaXplb2YocmVkaXIpLCAiL3JlZGlyIyVkIiwgaSk7Ci0gICAgfQotCi0gICAgYXBfc25wcmludGYoc3RyMywgc2l6ZW9mKHN0cjMpLAotICAgICAgICAgICAgICAgICIlcyAlcyBbJXMvc2lkIyVseF1bcmlkIyVseC8lcyVzXSAoJWQpICVzXG4iLCBzdHIxLAotICAgICAgICAgICAgICAgIGN1cnJlbnRfbG9ndGltZShyKSwgYXBfZ2V0X3NlcnZlcl9uYW1lKHIpLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKShyLT5zZXJ2ZXIpLCAodW5zaWduZWQgbG9uZylyLAotICAgICAgICAgICAgICAgIHR5cGUsIHJlZGlyLCBsZXZlbCwgc3RyMik7Ci0KLSAgICBmZF9sb2NrKHIsIGNvbmYtPnJld3JpdGVsb2dmcCk7Ci0gICAgc2l6ZV92YWwgPSBzdHJsZW4oc3RyMyk7Ci0gICAgYXBfd3JpdGUoY29uZi0+cmV3cml0ZWxvZ2ZwLCBzdHIzLCAmc2l6ZV92YWwpOwotICAgIGZkX3VubG9jayhyLCBjb25mLT5yZXdyaXRlbG9nZnApOwotCi0gICAgdmFfZW5kKGFwKTsKLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyBjaGFyICpjdXJyZW50X2xvZ3RpbWUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgYXBfZXhwbG9kZWRfdGltZV90IHQ7Ci0gICAgY2hhciB0c3RyWzgwXTsKLSAgICBhcF9zaXplX3QgbGVuOwotCi0gICAgYXBfZXhwbG9kZV9sb2NhbHRpbWUoJnQsIGFwX25vdygpKTsKLQotICAgIGFwX3N0cmZ0aW1lKHRzdHIsICZsZW4sIDgwLCAiWyVkLyViLyVZOiVIOiVNOiVTICIsICZ0KTsKLSAgICBhcF9zbnByaW50Zih0c3RyICsgc3RybGVuKHRzdHIpLCA4MC1zdHJsZW4odHN0ciksICIlYyUuMmQlLjJkXSIsCi0gICAgICAgICAgICAgICAgdC50bV9nbXRvZmYgPCAwID8gJy0nIDogJysnLAotCQl0LnRtX2dtdG9mZiAvICg2MCo2MCksIHQudG1fZ210b2ZmICUgKDYwKjYwKSk7Ci0gICAgcmV0dXJuIGFwX3BzdHJkdXAoci0+cG9vbCwgdHN0cik7Ci19Ci0KLQotCi0KLS8qCi0qKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSoqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiogfCAgICAgICAgICAgICAgcmV3cml0aW5nIGxvY2tmaWxlIHN1cHBvcnQKLSoqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotCi0jZGVmaW5lIFJFV1JJVEVMT0NLX01PREUgKCBBUFJfVVJFQUQgfCBBUFJfVVdSSVRFIHwgQVBSX0dSRUFEIHwgQVBSX1dSRUFEICkKLQotc3RhdGljIHZvaWQgcmV3cml0ZWxvY2tfY3JlYXRlKHNlcnZlcl9yZWMgKnMsIGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICByZXdyaXRlX3NlcnZlcl9jb25mICpjb25mOwotICAgIGFwX3N0YXR1c190IHJjOwotCi0gICAgY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsICZyZXdyaXRlX21vZHVsZSk7Ci0KLSAgICAvKiBvbmx5IG9wZXJhdGUgaWYgYSBsb2NrZmlsZSBpcyB1c2VkICovCi0gICAgaWYgKGxvY2tuYW1lID09IE5VTEwgfHwgKihsb2NrbmFtZSkgPT0gJ1wwJykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogZml4dXAgdGhlIHBhdGgsIGVzcGVjaWFsbHkgZm9yIHJld3JpdGVsb2NrX3JlbW92ZSgpICovCi0gICAgbG9ja25hbWUgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShwLCBsb2NrbmFtZSk7Ci0KLSAgICAvKiBjcmVhdGUgdGhlIGxvY2tmaWxlICovCi0gICAgdW5saW5rKGxvY2tuYW1lKTsKLSAgICByYyA9IGFwX29wZW4oJmxvY2tmZCwgbG9ja25hbWUsIEFQUl9XUklURSB8IEFQUl9DUkVBVEUsIFJFV1JJVEVMT0NLX01PREUsIHApOwotICAgIGlmIChyYyAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCAwLCBzLAotICAgICAgICAgICAgICAgICAgICAgIm1vZF9yZXdyaXRlOiBQYXJlbnQgY291bGQgbm90IGNyZWF0ZSBSZXdyaXRlTG9jayAiCi0gICAgICAgICAgICAgICAgICAgICAiZmlsZSAlcyIsIGxvY2tuYW1lKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0jaWYgIWRlZmluZWQoT1MyKSAmJiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoTkVUV0FSRSkKLSAgICAvKiBtYWtlIHN1cmUgdGhlIGNoaWxkcyBoYXZlIGFjY2VzcyB0byB0aGlzIGZpbGUgKi8KLSAgICBpZiAoZ2V0ZXVpZCgpID09IDAgLyogaXMgc3VwZXJ1c2VyICovKQotICAgICAgICBjaG93bihsb2NrbmFtZSwgdW5peGRfY29uZmlnLnVzZXJfaWQsIC0xIC8qIG5vIGdpZCBjaGFuZ2UgKi8pOwotI2VuZGlmCi0KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIHJld3JpdGVsb2NrX29wZW4oc2VydmVyX3JlYyAqcywgYXBfY29udGV4dF90ICpwKQotewotICAgIHJld3JpdGVfc2VydmVyX2NvbmYgKmNvbmY7Ci0gICAgYXBfc3RhdHVzX3QgcmM7Ci0KLSAgICBjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywgJnJld3JpdGVfbW9kdWxlKTsKLQotICAgIC8qIG9ubHkgb3BlcmF0ZSBpZiBhIGxvY2tmaWxlIGlzIHVzZWQgKi8KLSAgICBpZiAobG9ja25hbWUgPT0gTlVMTCB8fCAqKGxvY2tuYW1lKSA9PSAnXDAnKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBvcGVuIHRoZSBsb2NrZmlsZSAob25jZSBwZXIgY2hpbGQpIHRvIGdldCBhIHVuaXF1ZSBmZCAqLwotICAgIHJjID0gYXBfb3BlbigmbG9ja2ZkLCBsb2NrbmFtZSwgQVBSX1dSSVRFIHwgQVBSX0NSRUFURSwgUkVXUklURUxPQ0tfTU9ERSwgcCk7Ci0gICAgaWYgKHJjICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIDAsIHMsCi0gICAgICAgICAgICAgICAgICAgICAibW9kX3Jld3JpdGU6IENoaWxkIGNvdWxkIG5vdCBvcGVuIFJld3JpdGVMb2NrICIKLSAgICAgICAgICAgICAgICAgICAgICJmaWxlICVzIiwgbG9ja25hbWUpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyBhcF9zdGF0dXNfdCByZXdyaXRlbG9ja19yZW1vdmUodm9pZCAqZGF0YSkKLXsKLSAgICAvKiBvbmx5IG9wZXJhdGUgaWYgYSBsb2NrZmlsZSBpcyB1c2VkICovCi0gICAgaWYgKGxvY2tuYW1lID09IE5VTEwgfHwgKihsb2NrbmFtZSkgPT0gJ1wwJykgewotICAgICAgICByZXR1cm4oLTEpOwotICAgIH0KLQotICAgIC8qIHJlbW92ZSB0aGUgbG9ja2ZpbGUgKi8KLSAgICB1bmxpbmsobG9ja25hbWUpOwotICAgIGxvY2tuYW1lID0gTlVMTDsKLSAgICBsb2NrZmQgPSBOVUxMOwotICAgIHJldHVybigwKTsKLX0KLQotc3RhdGljIHZvaWQgcmV3cml0ZWxvY2tfYWxsb2MocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaWYgKGxvY2tmZCAhPSBOVUxMKSB7Ci0gICAgICAgIGZkX2xvY2sociwgbG9ja2ZkKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCByZXdyaXRlbG9ja19mcmVlKHJlcXVlc3RfcmVjICpyKQotewotICAgIGlmIChsb2NrZmQgIT0gTlVMTCkgewotICAgICAgICBmZF91bmxvY2sociwgbG9ja2ZkKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi0KLS8qCi0qKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSoqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiogfCAgICAgICAgICAgICAgICAgIHByb2dyYW0gbWFwIHN1cHBvcnQKLSoqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotCi1zdGF0aWMgdm9pZCBydW5fcmV3cml0ZW1hcF9wcm9ncmFtcyhzZXJ2ZXJfcmVjICpzLCBhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgcmV3cml0ZV9zZXJ2ZXJfY29uZiAqY29uZjsKLSAgICBhcF9maWxlX3QgKmZwaW4gPSBOVUxMOwotICAgIGFwX2ZpbGVfdCAqZnBvdXQgPSBOVUxMOwotICAgIGFwX2ZpbGVfdCAqZnBlcnIgPSBOVUxMOwotICAgIGFwX2FycmF5X2hlYWRlcl90ICpyZXdyaXRlbWFwczsKLSAgICByZXdyaXRlbWFwX2VudHJ5ICplbnRyaWVzOwotICAgIHJld3JpdGVtYXBfZW50cnkgKm1hcDsKLSAgICBpbnQgaTsKLSAgICBpbnQgcmM7Ci0KLSAgICBjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywgJnJld3JpdGVfbW9kdWxlKTsKLQotICAgIC8qICBJZiB0aGUgZW5naW5lIGlzbid0IHR1cm5lZCBvbiwKLSAgICAgKiAgZG9uJ3QgZXZlbiB0cnkgdG8gZG8gYW55dGhpbmcuCi0gICAgICovCi0gICAgaWYgKGNvbmYtPnN0YXRlID09IEVOR0lORV9ESVNBQkxFRCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcmV3cml0ZW1hcHMgPSBjb25mLT5yZXdyaXRlbWFwczsKLSAgICBlbnRyaWVzID0gKHJld3JpdGVtYXBfZW50cnkgKilyZXdyaXRlbWFwcy0+ZWx0czsKLSAgICBmb3IgKGkgPSAwOyBpIDwgcmV3cml0ZW1hcHMtPm5lbHRzOyBpKyspIHsKLSAgICAgICAgbWFwID0gJmVudHJpZXNbaV07Ci0gICAgICAgIGlmIChtYXAtPnR5cGUgIT0gTUFQVFlQRV9QUkcpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXAtPmRhdGFmaWxlID09IE5VTEwKLSAgICAgICAgICAgIHx8ICoobWFwLT5kYXRhZmlsZSkgPT0gJ1wwJwotICAgICAgICAgICAgfHwgbWFwLT5mcGluICAhPSBOVUxMCi0gICAgICAgICAgICB8fCBtYXAtPmZwb3V0ICE9IE5VTEwgICAgICAgICkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZnBpbiAgPSBOVUxMOwotICAgICAgICBmcG91dCA9IE5VTEw7Ci0gICAgICAgIHJjID0gcmV3cml0ZW1hcF9wcm9ncmFtX2NoaWxkKHAsIG1hcC0+ZGF0YWZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZwb3V0LCAmZnBpbiwgJmZwZXJyKTsKLSAgICAgICAgaWYgKHJjICE9IEFQUl9TVUNDRVNTIHx8IGZwaW4gPT0gTlVMTCB8fCBmcG91dCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCAwLCBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICJtb2RfcmV3cml0ZTogY291bGQgbm90IGZvcmsgY2hpbGQgZm9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiUmV3cml0ZU1hcCBwcm9jZXNzLiAlZCIsIHJjKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgbWFwLT5mcGluICA9IGZwaW47Ci0gICAgICAgIG1hcC0+ZnBvdXQgPSBmcG91dDsKLSAgICAgICAgbWFwLT5mcGVyciA9IGZwZXJyOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLS8qIGNoaWxkIHByb2Nlc3MgY29kZSAqLwotc3RhdGljIGludCByZXdyaXRlbWFwX3Byb2dyYW1fY2hpbGQoYXBfY29udGV4dF90ICpwLCBjaGFyICpwcm9nbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX2ZpbGVfdCAqKmZwb3V0LCBhcF9maWxlX3QgKipmcGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfZmlsZV90ICoqZnBlcnIpCi17Ci0gICAgaW50IHJjID0gLTE7Ci0gICAgYXBfcHJvY2F0dHJfdCAqcHJvY2F0dHI7Ci0gICAgYXBfcHJvY190ICpwcm9jbmV3OwotCi0gICAgYXBfYmxvY2tfYWxhcm1zKCk7Ci0KLSNpZmRlZiBTSUdIVVAKLSAgICBzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKLSNlbmRpZgotCi0gICAgCi0gICAgaWYgKChhcF9jcmVhdGVwcm9jYXR0cl9pbml0KCZwcm9jYXR0ciwgcCkgICAgICAgICAgICE9IEFQUl9TVUNDRVNTKSB8fAotICAgICAgICAoYXBfc2V0cHJvY2F0dHJfaW8ocHJvY2F0dHIsIEFQUl9GVUxMX0JMT0NLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQUl9GVUxMX05PTkJMT0NLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQUl9GVUxMX05PTkJMT0NLKSAhPSBBUFJfU1VDQ0VTUykgfHwKLSAgICAgICAgKGFwX3NldHByb2NhdHRyX2Rpcihwcm9jYXR0ciwgYXBfbWFrZV9kaXJzdHJfcGFyZW50KHAsIHByb2duYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gQVBSX1NVQ0NFU1MpIHx8Ci0gICAgICAgIChhcF9zZXRwcm9jYXR0cl9jbWR0eXBlKHByb2NhdHRyLCBBUFJfUFJPR1JBTSkgICE9IEFQUl9TVUNDRVNTKSkgewotICAgICAgICAvKiBTb21ldGhpbmcgYmFkIGhhcHBlbmVkLCBnaXZlIHVwIGFuZCBnbyBhd2F5LiAqLwotICAgICAgICByYyA9IC0xOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcmMgPSBhcF9jcmVhdGVfcHJvY2VzcygmcHJvY25ldywgcHJvZ25hbWUsIE5VTEwsIE5VTEwsIHByb2NhdHRyLCBwKTsKLSAgICAKLSAgICAgICAgaWYgKHJjID09IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICBhcF9ub3RlX3N1YnByb2Nlc3MocCwgcHJvY25ldywga2lsbF9hZnRlcl90aW1lb3V0KTsKLQotICAgICAgICAgICAgaWYgKGZwaW4pIHsKLSAgICAgICAgICAgICAgICBhcF9nZXRfY2hpbGRpbihmcGluLCBwcm9jbmV3KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZwb3V0KSB7Ci0gICAgICAgICAgICAgICAgYXBfZ2V0X2NoaWxkb3V0KGZwb3V0LCBwcm9jbmV3KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZwZXJyKSB7Ci0gICAgICAgICAgICAgICAgYXBfZ2V0X2NoaWxkZXJyKGZwZXJyLCBwcm9jbmV3KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGFwX3VuYmxvY2tfYWxhcm1zKCk7Ci0KLSAgICByZXR1cm4gKHJjKTsKLX0KLQotCi0KLQotLyoKLSoqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKiogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qKiB8ICAgICAgICAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlIHN1cHBvcnQKLSoqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotCi0KLXN0YXRpYyB2b2lkIGV4cGFuZF92YXJpYWJsZXNfaW5idWZmZXIocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmJ1ZiwgaW50IGJ1Zl9sZW4pCi17Ci0gICAgY2hhciAqbmV3YnVmOwotICAgIG5ld2J1ZiA9IGV4cGFuZF92YXJpYWJsZXMociwgYnVmKTsKLSAgICBpZiAoc3RyY21wKG5ld2J1ZiwgYnVmKSAhPSAwKSB7Ci0gICAgICAgIGFwX2NweXN0cm4oYnVmLCBuZXdidWYsIGJ1Zl9sZW4pOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyBjaGFyICpleHBhbmRfdmFyaWFibGVzKHJlcXVlc3RfcmVjICpyLCBjaGFyICpzdHIpCi17Ci0gICAgY2hhciBvdXRwdXRbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgaW5wdXRbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgKmNwOwotICAgIGNoYXIgKmNwMjsKLSAgICBjaGFyICpjcDM7Ci0gICAgaW50IGV4cGFuZGVkOwotICAgIGNoYXIgKm91dHA7Ci0gICAgY2hhciAqZW5kcDsKLQotICAgIGFwX2NweXN0cm4oaW5wdXQsIHN0ciwgc2l6ZW9mKGlucHV0KSk7Ci0gICAgb3V0cHV0WzBdID0gJ1wwJzsKLSAgICBvdXRwID0gb3V0cHV0OwotICAgIGVuZHAgPSBvdXRwdXQgKyBzaXplb2Yob3V0cHV0KTsKLSAgICBleHBhbmRlZCA9IDA7Ci0gICAgZm9yIChjcCA9IGlucHV0OyBjcCA8IGlucHV0K01BWF9TVFJJTkdfTEVOOyApIHsKLSAgICAgICAgaWYgKChjcDIgPSBzdHJzdHIoY3AsICIleyIpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoKGNwMyA9IHN0cnN0cihjcDIsICJ9IikpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqY3AyID0gJ1wwJzsKLSAgICAgICAgICAgICAgICBvdXRwID0gYXBfY3B5c3RybihvdXRwLCBjcCwgZW5kcCAtIG91dHApOwotCi0gICAgICAgICAgICAgICAgY3AyICs9IDI7Ci0gICAgICAgICAgICAgICAgKmNwMyA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgb3V0cCA9IGFwX2NweXN0cm4ob3V0cCwgbG9va3VwX3ZhcmlhYmxlKHIsIGNwMiksIGVuZHAgLSBvdXRwKTsKLQotICAgICAgICAgICAgICAgIGNwID0gY3AzKzE7Ci0gICAgICAgICAgICAgICAgZXhwYW5kZWQgPSAxOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG91dHAgPSBhcF9jcHlzdHJuKG91dHAsIGNwLCBlbmRwIC0gb3V0cCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gZXhwYW5kZWQgPyBhcF9wc3RyZHVwKHItPnBvb2wsIG91dHB1dCkgOiBzdHI7Ci19Ci0KLXN0YXRpYyBjaGFyICpsb29rdXBfdmFyaWFibGUocmVxdWVzdF9yZWMgKnIsIGNoYXIgKnZhcikKLXsKLSAgICBjb25zdCBjaGFyICpyZXN1bHQ7Ci0gICAgY2hhciByZXN1bHRidWZbTE9OR19TVFJJTkdfTEVOXTsKLSAgICBhcF9leHBsb2RlZF90aW1lX3QgdG07Ci0gICAgcmVxdWVzdF9yZWMgKnJzdWI7Ci0jaWZuZGVmIFdJTjMyCi0gICAgc3RydWN0IHBhc3N3ZCAqcHc7Ci0gICAgc3RydWN0IGdyb3VwICpncjsKLSAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsKLSNlbmRpZgotCi0gICAgcmVzdWx0ID0gTlVMTDsKLQotICAgIC8qIEhUVFAgaGVhZGVycyAqLwotICAgIGlmIChzdHJjYXNlY21wKHZhciwgIkhUVFBfVVNFUl9BR0VOVCIpID09IDApIHsKLSAgICAgICAgcmVzdWx0ID0gbG9va3VwX2hlYWRlcihyLCAiVXNlci1BZ2VudCIpOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIkhUVFBfUkVGRVJFUiIpID09IDApIHsKLSAgICAgICAgcmVzdWx0ID0gbG9va3VwX2hlYWRlcihyLCAiUmVmZXJlciIpOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIkhUVFBfQ09PS0lFIikgPT0gMCkgewotICAgICAgICByZXN1bHQgPSBsb29rdXBfaGVhZGVyKHIsICJDb29raWUiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJIVFRQX0ZPUldBUkRFRCIpID09IDApIHsKLSAgICAgICAgcmVzdWx0ID0gbG9va3VwX2hlYWRlcihyLCAiRm9yd2FyZGVkIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFyLCAiSFRUUF9IT1NUIikgPT0gMCkgewotICAgICAgICByZXN1bHQgPSBsb29rdXBfaGVhZGVyKHIsICJIb3N0Iik7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFyLCAiSFRUUF9QUk9YWV9DT05ORUNUSU9OIikgPT0gMCkgewotICAgICAgICByZXN1bHQgPSBsb29rdXBfaGVhZGVyKHIsICJQcm94eS1Db25uZWN0aW9uIik7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFyLCAiSFRUUF9BQ0NFUFQiKSA9PSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IGxvb2t1cF9oZWFkZXIociwgIkFjY2VwdCIpOwotICAgIH0KLSAgICAvKiBhbGwgb3RoZXIgaGVhZGVycyBmcm9tIHdoaWNoIHdlIGFyZSBzdGlsbCBub3Qga25vdyBhYm91dCAqLwotICAgIGVsc2UgaWYgKHN0cmxlbih2YXIpID4gNSAmJiBzdHJuY2FzZWNtcCh2YXIsICJIVFRQOiIsIDUpID09IDApIHsKLSAgICAgICAgcmVzdWx0ID0gbG9va3VwX2hlYWRlcihyLCB2YXIrNSk7Ci0gICAgfQotCi0gICAgLyogY29ubmVjdGlvbiBzdHVmZiAqLwotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFyLCAiUkVNT1RFX0FERFIiKSA9PSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IHItPmNvbm5lY3Rpb24tPnJlbW90ZV9pcDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJSRU1PVEVfSE9TVCIpID09IDApIHsKLSAgICAgICAgcmVzdWx0ID0gKGNoYXIgKilhcF9nZXRfcmVtb3RlX2hvc3Qoci0+Y29ubmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+cGVyX2Rpcl9jb25maWcsIFJFTU9URV9OQU1FKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJSRU1PVEVfVVNFUiIpID09IDApIHsKLSAgICAgICAgcmVzdWx0ID0gci0+dXNlcjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJSRU1PVEVfSURFTlQiKSA9PSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IChjaGFyICopYXBfZ2V0X3JlbW90ZV9sb2duYW1lKHIpOwotICAgIH0KLQotICAgIC8qIHJlcXVlc3Qgc3R1ZmYgKi8KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIlRIRV9SRVFVRVNUIikgPT0gMCkgeyAvKiBub24tc3RhbmRhcmQgKi8KLSAgICAgICAgcmVzdWx0ID0gci0+dGhlX3JlcXVlc3Q7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFyLCAiUkVRVUVTVF9NRVRIT0QiKSA9PSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IHItPm1ldGhvZDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJSRVFVRVNUX1VSSSIpID09IDApIHsgLyogbm9uLXN0YW5kYXJkICovCi0gICAgICAgIHJlc3VsdCA9IHItPnVyaTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJTQ1JJUFRfRklMRU5BTUUiKSA9PSAwIHx8Ci0gICAgICAgICAgICAgc3RyY2FzZWNtcCh2YXIsICJSRVFVRVNUX0ZJTEVOQU1FIikgPT0gMCAgKSB7Ci0gICAgICAgIHJlc3VsdCA9IHItPmZpbGVuYW1lOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIlBBVEhfSU5GTyIpID09IDApIHsKLSAgICAgICAgcmVzdWx0ID0gci0+cGF0aF9pbmZvOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIlFVRVJZX1NUUklORyIpID09IDApIHsKLSAgICAgICAgcmVzdWx0ID0gci0+YXJnczsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJBVVRIX1RZUEUiKSA9PSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IHItPmFwX2F1dGhfdHlwZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJJU19TVUJSRVEiKSA9PSAwKSB7IC8qIG5vbi1zdGFuZGFyZCAqLwotICAgICAgICByZXN1bHQgPSAoci0+bWFpbiAhPSBOVUxMID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgfQotCi0gICAgLyogaW50ZXJuYWwgc2VydmVyIHN0dWZmICovCi0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJET0NVTUVOVF9ST09UIikgPT0gMCkgewotICAgICAgICByZXN1bHQgPSBhcF9kb2N1bWVudF9yb290KHIpOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIlNFUlZFUl9BRE1JTiIpID09IDApIHsKLSAgICAgICAgcmVzdWx0ID0gci0+c2VydmVyLT5zZXJ2ZXJfYWRtaW47Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFyLCAiU0VSVkVSX05BTUUiKSA9PSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IGFwX2dldF9zZXJ2ZXJfbmFtZShyKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJTRVJWRVJfQUREUiIpID09IDApIHsgLyogbm9uLXN0YW5kYXJkICovCi0gICAgICAgIHJlc3VsdCA9IHItPmNvbm5lY3Rpb24tPmxvY2FsX2lwOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIlNFUlZFUl9QT1JUIikgPT0gMCkgewotICAgICAgICBhcF9zbnByaW50ZihyZXN1bHRidWYsIHNpemVvZihyZXN1bHRidWYpLCAiJXUiLCBhcF9nZXRfc2VydmVyX3BvcnQocikpOwotICAgICAgICByZXN1bHQgPSByZXN1bHRidWY7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFyLCAiU0VSVkVSX1BST1RPQ09MIikgPT0gMCkgewotICAgICAgICByZXN1bHQgPSByLT5wcm90b2NvbDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJTRVJWRVJfU09GVFdBUkUiKSA9PSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IGFwX2dldF9zZXJ2ZXJfdmVyc2lvbigpOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIkFQSV9WRVJTSU9OIikgPT0gMCkgeyAvKiBub24tc3RhbmRhcmQgKi8KLSAgICAgICAgYXBfc25wcmludGYocmVzdWx0YnVmLCBzaXplb2YocmVzdWx0YnVmKSwgIiVkOiVkIiwKLQkJICAgIE1PRFVMRV9NQUdJQ19OVU1CRVJfTUFKT1IsIE1PRFVMRV9NQUdJQ19OVU1CRVJfTUlOT1IpOwotICAgICAgICByZXN1bHQgPSByZXN1bHRidWY7Ci0gICAgfQotCi0vKiBYWFg6IHdvdyB0aGlzIGhhcyBnb3R0YSBiZSBzbG93IGlmIHlvdSBhY3R1YWxseSB1c2UgaXQgZm9yIGEgbG90LCByZWNhbGN1bGF0ZXMgZXhwbG9kZWQgdGltZSBmb3IgZWFjaCB2YXJpYWJsZSAqLwotICAgIC8qIHVuZGVybGF5aW5nIFVuaXggc3lzdGVtIHN0dWZmICovCi0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJUSU1FX1lFQVIiKSA9PSAwKSB7Ci0gICAgICAgIGFwX2V4cGxvZGVfbG9jYWx0aW1lKCZ0bSwgYXBfbm93KCkpOwotICAgICAgICBhcF9zbnByaW50ZihyZXN1bHRidWYsIHNpemVvZihyZXN1bHRidWYpLCAiJTA0ZCIsIHRtLnRtX3llYXIgKyAxOTAwKTsKLSAgICAgICAgcmVzdWx0ID0gcmVzdWx0YnVmOwotICAgIH0KLSNkZWZpbmUgTUtUSU1FU1RSKGZvcm1hdCwgdG1maWVsZCkgXAotICAgIGFwX2V4cGxvZGVfbG9jYWx0aW1lKCZ0bSwgYXBfbm93KCkpOyBcCi0gICAgYXBfc25wcmludGYocmVzdWx0YnVmLCBzaXplb2YocmVzdWx0YnVmKSwgZm9ybWF0LCB0bS50bWZpZWxkKTsgXAotICAgIHJlc3VsdCA9IHJlc3VsdGJ1ZjsKLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIlRJTUVfTU9OIikgPT0gMCkgewotICAgICAgICBNS1RJTUVTVFIoIiUwMmQiLCB0bV9tb24rMSkKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJUSU1FX0RBWSIpID09IDApIHsKLSAgICAgICAgTUtUSU1FU1RSKCIlMDJkIiwgdG1fbWRheSkKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJUSU1FX0hPVVIiKSA9PSAwKSB7Ci0gICAgICAgIE1LVElNRVNUUigiJTAyZCIsIHRtX2hvdXIpCi0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFyLCAiVElNRV9NSU4iKSA9PSAwKSB7Ci0gICAgICAgIE1LVElNRVNUUigiJTAyZCIsIHRtX21pbikKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcCh2YXIsICJUSU1FX1NFQyIpID09IDApIHsKLSAgICAgICAgTUtUSU1FU1RSKCIlMDJkIiwgdG1fc2VjKQotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIlRJTUVfV0RBWSIpID09IDApIHsKLSAgICAgICAgTUtUSU1FU1RSKCIlZCIsIHRtX3dkYXkpCi0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFyLCAiVElNRSIpID09IDApIHsKLSAgICAgICAgYXBfZXhwbG9kZV9sb2NhbHRpbWUoJnRtLCBhcF9ub3coKSk7Ci0gICAgICAgIGFwX3NucHJpbnRmKHJlc3VsdGJ1Ziwgc2l6ZW9mKHJlc3VsdGJ1ZiksCi0JCSAgICAiJTA0ZCUwMmQlMDJkJTAyZCUwMmQlMDJkIiwgdG0udG1feWVhciArIDE5MDAsCi0JCSAgICB0bS50bV9tb24rMSwgdG0udG1fbWRheSwKLQkJICAgIHRtLnRtX2hvdXIsIHRtLnRtX21pbiwgdG0udG1fc2VjKTsKLSAgICAgICAgcmVzdWx0ID0gcmVzdWx0YnVmOwotICAgICAgICByZXdyaXRlbG9nKHIsIDEsICJSRVNVTFQ9JyVzJyIsIHJlc3VsdCk7Ci0gICAgfQotCi0gICAgLyogYWxsIG90aGVyIGVudi12YXJpYWJsZXMgZnJvbSB0aGUgcGFyZW50IEFwYWNoZSBwcm9jZXNzICovCi0gICAgZWxzZSBpZiAoc3RybGVuKHZhcikgPiA0ICYmIHN0cm5jYXNlY21wKHZhciwgIkVOVjoiLCA0KSA9PSAwKSB7Ci0gICAgICAgIC8qIGZpcnN0IHRyeSB0aGUgaW50ZXJuYWwgQXBhY2hlIG5vdGVzIHN0cnVjdHVyZSAqLwotICAgICAgICByZXN1bHQgPSBhcF90YWJsZV9nZXQoci0+bm90ZXMsIHZhcis0KTsKLSAgICAgICAgLyogc2Vjb25kIHRyeSB0aGUgaW50ZXJuYWwgQXBhY2hlIGVudiBzdHJ1Y3R1cmUgICovCi0gICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgewotICAgICAgICAgICAgcmVzdWx0ID0gYXBfdGFibGVfZ2V0KHItPnN1YnByb2Nlc3NfZW52LCB2YXIrNCk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogdGhpcmQgdHJ5IHRoZSBleHRlcm5hbCBPUyBlbnYgKi8KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBnZXRlbnYodmFyKzQpOwotICAgICAgICB9Ci0gICAgfQotCi0jZGVmaW5lIExPT0tBSEVBRChzdWJyZWNmdW5jKSBcCi0gICAgICAgIGlmICggXAotICAgICAgICAgIC8qIGZpbGVuYW1lIGlzIHNhZmUgdG8gdXNlICovIFwKLSAgICAgICAgICByLT5maWxlbmFtZSAhPSBOVUxMIFwKLSAgICAgICAgICAgICAgLyogLSBhbmQgd2UncmUgZWl0aGVyIG5vdCBpbiBhIHN1YnJlcXVlc3QgKi8gXAotICAgICAgICAgICAgICAmJiAoIHItPm1haW4gPT0gTlVMTCBcCi0gICAgICAgICAgICAgICAgICAvKiAtIG9yIGluIGEgc3VicmVxdWVzdCB3aGVyZSBwYXRocyBhcmUgbm9uLU5VTEwuLi4gKi8gXAotICAgICAgICAgICAgICAgICAgICB8fCAoIHItPm1haW4tPnVyaSAhPSBOVUxMICYmIHItPnVyaSAhPSBOVUxMIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgLi4uYW5kIHN1YiBhbmQgbWFpbiBwYXRocyBkaWZmZXIgKi8gXAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3RyY21wKHItPm1haW4tPnVyaSwgci0+dXJpKSAhPSAwKSkpIHsgXAotICAgICAgICAgICAgLyogcHJvY2VzcyBhIGZpbGUtYmFzZWQgc3VicmVxdWVzdCAqLyBcCi0gICAgICAgICAgICByc3ViID0gc3VicmVjZnVuYyhyLT5maWxlbmFtZSwgcik7IFwKLSAgICAgICAgICAgIC8qIG5vdyByZWN1cnNpdmVseSBsb29rdXAgdGhlIHZhcmlhYmxlIGluIHRoZSBzdWJfcmVxICovIFwKLSAgICAgICAgICAgIHJlc3VsdCA9IGxvb2t1cF92YXJpYWJsZShyc3ViLCB2YXIrNSk7IFwKLSAgICAgICAgICAgIC8qIGNvcHkgaXQgdXAgdG8gb3VyIHNjb3BlIGJlZm9yZSB3ZSBkZXN0cm95IHN1Yl9yZXEncyBhcF9jb250ZXh0X3QgKi8gXAotICAgICAgICAgICAgcmVzdWx0ID0gYXBfcHN0cmR1cChyLT5wb29sLCByZXN1bHQpOyBcCi0gICAgICAgICAgICAvKiBjbGVhbnVwIGJ5IGRlc3Ryb3lpbmcgdGhlIHN1YnJlcXVlc3QgKi8gXAotICAgICAgICAgICAgYXBfZGVzdHJveV9zdWJfcmVxKHJzdWIpOyBcCi0gICAgICAgICAgICAvKiBsb2cgaXQgKi8gXAotICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCA1LCAibG9va2FoZWFkOiBwYXRoPSVzIHZhcj0lcyAtPiB2YWw9JXMiLCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHItPmZpbGVuYW1lLCB2YXIrNSwgcmVzdWx0KTsgXAotICAgICAgICAgICAgLyogcmV0dXJuIG91cnNlbGYgdG8gcHJldmVudCByZS1wc3RyZHVwICovIFwKLSAgICAgICAgICAgIHJldHVybiAoY2hhciAqKXJlc3VsdDsgXAotICAgICAgICB9Ci0KLSAgICAvKiBsb29rLWFoZWFkIGZvciBwYXJhbWV0ZXIgdGhyb3VnaCBVUkktYmFzZWQgc3ViLXJlcXVlc3QgKi8KLSAgICBlbHNlIGlmIChzdHJsZW4odmFyKSA+IDUgJiYgc3RybmNhc2VjbXAodmFyLCAiTEEtVToiLCA1KSA9PSAwKSB7Ci0gICAgICAgIExPT0tBSEVBRChhcF9zdWJfcmVxX2xvb2t1cF91cmkpCi0gICAgfQotICAgIC8qIGxvb2stYWhlYWQgZm9yIHBhcmFtZXRlciB0aHJvdWdoIGZpbGUtYmFzZWQgc3ViLXJlcXVlc3QgKi8KLSAgICBlbHNlIGlmIChzdHJsZW4odmFyKSA+IDUgJiYgc3RybmNhc2VjbXAodmFyLCAiTEEtRjoiLCA1KSA9PSAwKSB7Ci0gICAgICAgIExPT0tBSEVBRChhcF9zdWJfcmVxX2xvb2t1cF9maWxlKQotICAgIH0KLQotI2lmICFkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChORVRXQVJFKQotICAgIC8qIFdpbjMyIGhhcyBhIHJhdGhlciBkaWZmZXJlbnQgdmlldyBvZiBmaWxlIG93bmVyc2hpcHMuCi0gICAgICAgRm9yIG5vdywganVzdCBmb3JnZXQgaXQgKi8KLQotICAgIC8qIGZpbGUgc3R1ZmYgKi8KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHZhciwgIlNDUklQVF9VU0VSIikgPT0gMCkgewotICAgICAgICByZXN1bHQgPSAiPHVua25vd24+IjsKLSAgICAgICAgaWYgKHItPmZpbmZvLnByb3RlY3Rpb24gIT0gMCkgewotICAgICAgICAgICAgaWYgKChwdyA9IGdldHB3dWlkKHItPmZpbmZvLnVzZXIpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcHctPnB3X25hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc3RhdChyLT5maWxlbmFtZSwgJmZpbmZvKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChwdyA9IGdldHB3dWlkKGZpbmZvLnN0X3VpZCkpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcHctPnB3X25hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAodmFyLCAiU0NSSVBUX0dST1VQIikgPT0gMCkgewotICAgICAgICByZXN1bHQgPSAiPHVua25vd24+IjsKLSAgICAgICAgaWYgKHItPmZpbmZvLnByb3RlY3Rpb24gIT0gMCkgewotICAgICAgICAgICAgaWYgKChnciA9IGdldGdyZ2lkKHItPmZpbmZvLmdyb3VwKSkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGdyLT5ncl9uYW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKHN0YXQoci0+ZmlsZW5hbWUsICZmaW5mbykgPT0gMCkgewotICAgICAgICAgICAgICAgIGlmICgoZ3IgPSBnZXRncmdpZChmaW5mby5zdF9naWQpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGdyLT5ncl9uYW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSNlbmRpZiAvKiBuZGVmIFdJTjMyICYmIE5FVFdBUkUqLwotCi0gICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBhcF9wc3RyZHVwKHItPnBvb2wsICIiKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJldHVybiBhcF9wc3RyZHVwKHItPnBvb2wsIHJlc3VsdCk7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqbG9va3VwX2hlYWRlcihyZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqaGRyc19hcnI7Ci0gICAgYXBfdGFibGVfZW50cnlfdCAqaGRyczsKLSAgICBpbnQgaTsKLQotICAgIGhkcnNfYXJyID0gYXBfdGFibGVfZWx0cyhyLT5oZWFkZXJzX2luKTsKLSAgICBoZHJzID0gKGFwX3RhYmxlX2VudHJ5X3QgKiloZHJzX2Fyci0+ZWx0czsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaGRyc19hcnItPm5lbHRzOyArK2kpIHsKLSAgICAgICAgaWYgKGhkcnNbaV0ua2V5ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdHJjYXNlY21wKGhkcnNbaV0ua2V5LCBuYW1lKSA9PSAwKSB7Ci0JICAgIGFwX3RhYmxlX21lcmdlKHItPm5vdGVzLCBWQVJZX0tFWV9USElTLCBuYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBoZHJzW2ldLnZhbDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCi0KLQotLyoKLSoqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKiogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0qKiB8ICAgICAgICAgICAgICAgICAgICBjYWNoaW5nIHN1cHBvcnQKLSoqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotKiogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qLwotCi0KLXN0YXRpYyBjYWNoZSAqaW5pdF9jYWNoZShhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgY2FjaGUgKmM7Ci0KLSAgICBjID0gKGNhY2hlICopYXBfcGFsbG9jKHAsIHNpemVvZihjYWNoZSkpOwotICAgIGlmIChhcF9jcmVhdGVfY29udGV4dCgmYy0+cG9vbCwgcCkgIT0gQVBSX1NVQ0NFU1MpCi0JCXJldHVybiBOVUxMOwotICAgIGMtPmxpc3RzID0gYXBfbWFrZV9hcnJheShjLT5wb29sLCAyLCBzaXplb2YoY2FjaGVsaXN0KSk7Ci0gICAgcmV0dXJuIGM7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9jYWNoZV9zdHJpbmcoY2FjaGUgKmMsIGNoYXIgKnJlcywgaW50IG1vZGUsIHRpbWVfdCB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICprZXksIGNoYXIgKnZhbHVlKQotewotICAgIGNhY2hlZW50cnkgY2U7Ci0KLSAgICBjZS50aW1lICA9IHQ7Ci0gICAgY2Uua2V5ICAgPSBrZXk7Ci0gICAgY2UudmFsdWUgPSB2YWx1ZTsKLSAgICBzdG9yZV9jYWNoZV9zdHJpbmcoYywgcmVzLCAmY2UpOwotICAgIHJldHVybjsKLX0KLQotc3RhdGljIGNoYXIgKmdldF9jYWNoZV9zdHJpbmcoY2FjaGUgKmMsIGNoYXIgKnJlcywgaW50IG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3QgdCwgY2hhciAqa2V5KQotewotICAgIGNhY2hlZW50cnkgKmNlOwotCi0gICAgY2UgPSByZXRyaWV2ZV9jYWNoZV9zdHJpbmcoYywgcmVzLCBrZXkpOwotICAgIGlmIChjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAobW9kZSAmIENBQ0hFTU9ERV9UUykgewotICAgICAgICBpZiAodCAhPSBjZS0+dGltZSkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAobW9kZSAmIENBQ0hFTU9ERV9UVEwpIHsKLSAgICAgICAgaWYgKHQgPiBjZS0+dGltZSkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGFwX3BzdHJkdXAoYy0+cG9vbCwgY2UtPnZhbHVlKTsKLX0KLQotc3RhdGljIGludCBjYWNoZV90bGJfaGFzaChjaGFyICprZXkpCi17Ci0gICAgdW5zaWduZWQgbG9uZyBuOwotICAgIGNoYXIgKnA7Ci0KLSAgICBuID0gMDsKLSAgICBmb3IgKHA9a2V5OyAqcCAhPSAnXDAnOyArK3ApIHsKLSAgICAgICAgbiA9IG4gKiA1MzcxMSArIDEzNDU2MSArICh1bnNpZ25lZCkoKnAgJiAweGZmKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbiAlIENBQ0hFX1RMQl9ST1dTOwotfQotCi1zdGF0aWMgY2FjaGVlbnRyeSAqY2FjaGVfdGxiX2xvb2t1cChjYWNoZXRsYmVudHJ5ICp0bGIsIGNhY2hlZW50cnkgKmVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmtleSkKLXsKLSAgICBpbnQgaXggPSBjYWNoZV90bGJfaGFzaChrZXkpOwotICAgIGludCBpOwotICAgIGludCBqOwotCi0gICAgZm9yIChpPTA7IGkgPCBDQUNIRV9UTEJfQ09MUzsgKytpKSB7Ci0gICAgICAgIGogPSB0bGJbaXhdLnRbaV07Ci0gICAgICAgIGlmIChqIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBpZiAoc3RyY21wKGVsdFtqXS5rZXksIGtleSkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAmZWx0W2pdOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgY2FjaGVfdGxiX3JlcGxhY2UoY2FjaGV0bGJlbnRyeSAqdGxiLCBjYWNoZWVudHJ5ICplbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWVudHJ5ICplKQotewotICAgIGludCBpeCA9IGNhY2hlX3RsYl9oYXNoKGUtPmtleSk7Ci0gICAgaW50IGk7Ci0KLSAgICB0bGIgPSAmdGxiW2l4XTsKLQotICAgIGZvciAoaT0xOyBpIDwgQ0FDSEVfVExCX0NPTFM7ICsraSkKLSAgICAgICAgdGxiLT50W2ldID0gdGxiLT50W2ktMV07Ci0KLSAgICB0bGItPnRbMF0gPSBlIC0gZWx0OwotfQotCi1zdGF0aWMgdm9pZCBzdG9yZV9jYWNoZV9zdHJpbmcoY2FjaGUgKmMsIGNoYXIgKnJlcywgY2FjaGVlbnRyeSAqY2UpCi17Ci0gICAgaW50IGk7Ci0gICAgaW50IGo7Ci0gICAgY2FjaGVsaXN0ICpsOwotICAgIGNhY2hlZW50cnkgKmU7Ci0gICAgY2FjaGV0bGJlbnRyeSAqdDsKLSAgICBpbnQgZm91bmRfbGlzdDsKLQotICAgIGZvdW5kX2xpc3QgPSAwOwotICAgIC8qIGZpcnN0IHRyeSB0byBlZGl0IGFuIGV4aXN0aW5nIGVudHJ5ICovCi0gICAgZm9yIChpID0gMDsgaSA8IGMtPmxpc3RzLT5uZWx0czsgaSsrKSB7Ci0gICAgICAgIGwgPSAmKCgoY2FjaGVsaXN0ICopYy0+bGlzdHMtPmVsdHMpW2ldKTsKLSAgICAgICAgaWYgKHN0cmNtcChsLT5yZXNvdXJjZSwgcmVzKSA9PSAwKSB7Ci0gICAgICAgICAgICBmb3VuZF9saXN0ID0gMTsKLQotICAgICAgICAgICAgZSA9IGNhY2hlX3RsYl9sb29rdXAoKGNhY2hldGxiZW50cnkgKilsLT50bGItPmVsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FjaGVlbnRyeSAqKWwtPmVudHJpZXMtPmVsdHMsIGNlLT5rZXkpOwotICAgICAgICAgICAgaWYgKGUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGUtPnRpbWUgID0gY2UtPnRpbWU7Ci0gICAgICAgICAgICAgICAgZS0+dmFsdWUgPSBhcF9wc3RyZHVwKGMtPnBvb2wsIGNlLT52YWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbC0+ZW50cmllcy0+bmVsdHM7IGorKykgewotICAgICAgICAgICAgICAgIGUgPSAmKCgoY2FjaGVlbnRyeSAqKWwtPmVudHJpZXMtPmVsdHMpW2pdKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGUtPmtleSwgY2UtPmtleSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBlLT50aW1lICA9IGNlLT50aW1lOwotICAgICAgICAgICAgICAgICAgICBlLT52YWx1ZSA9IGFwX3BzdHJkdXAoYy0+cG9vbCwgY2UtPnZhbHVlKTsKLSAgICAgICAgICAgICAgICAgIGNhY2hlX3RsYl9yZXBsYWNlKChjYWNoZXRsYmVudHJ5ICopbC0+dGxiLT5lbHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhY2hlZW50cnkgKilsLT5lbnRyaWVzLT5lbHRzLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGNyZWF0ZSBhIG5lZWRlZCBuZXcgbGlzdCAqLwotICAgIGlmICghZm91bmRfbGlzdCkgewotICAgICAgICBsID0gYXBfcHVzaF9hcnJheShjLT5saXN0cyk7Ci0gICAgICAgIGwtPnJlc291cmNlID0gYXBfcHN0cmR1cChjLT5wb29sLCByZXMpOwotICAgICAgICBsLT5lbnRyaWVzICA9IGFwX21ha2VfYXJyYXkoYy0+cG9vbCwgMiwgc2l6ZW9mKGNhY2hlZW50cnkpKTsKLSAgICAgICAgbC0+dGxiICAgICAgPSBhcF9tYWtlX2FycmF5KGMtPnBvb2wsIENBQ0hFX1RMQl9ST1dTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNhY2hldGxiZW50cnkpKTsKLSAgICAgICAgZm9yIChpPTA7IGk8Q0FDSEVfVExCX1JPV1M7ICsraSkgewotICAgICAgICAgICAgdCA9ICYoKGNhY2hldGxiZW50cnkgKilsLT50bGItPmVsdHMpW2ldOwotICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPENBQ0hFX1RMQl9DT0xTOyArK2opCi0gICAgICAgICAgICAgICAgICAgIHQtPnRbal0gPSAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGNyZWF0ZSB0aGUgbmV3IGVudHJ5ICovCi0gICAgZm9yIChpID0gMDsgaSA8IGMtPmxpc3RzLT5uZWx0czsgaSsrKSB7Ci0gICAgICAgIGwgPSAmKCgoY2FjaGVsaXN0ICopYy0+bGlzdHMtPmVsdHMpW2ldKTsKLSAgICAgICAgaWYgKHN0cmNtcChsLT5yZXNvdXJjZSwgcmVzKSA9PSAwKSB7Ci0gICAgICAgICAgICBlID0gYXBfcHVzaF9hcnJheShsLT5lbnRyaWVzKTsKLSAgICAgICAgICAgIGUtPnRpbWUgID0gY2UtPnRpbWU7Ci0gICAgICAgICAgICBlLT5rZXkgICA9IGFwX3BzdHJkdXAoYy0+cG9vbCwgY2UtPmtleSk7Ci0gICAgICAgICAgICBlLT52YWx1ZSA9IGFwX3BzdHJkdXAoYy0+cG9vbCwgY2UtPnZhbHVlKTsKLSAgICAgICAgICAgIGNhY2hlX3RsYl9yZXBsYWNlKChjYWNoZXRsYmVudHJ5ICopbC0+dGxiLT5lbHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhY2hlZW50cnkgKilsLT5lbnRyaWVzLT5lbHRzLCBlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIG5vdCByZWFjaGVkLCBidXQgd2hlbiBpdCBpcyBubyBwcm9ibGVtLi4uICovCi0gICAgcmV0dXJuOwotfQotCi1zdGF0aWMgY2FjaGVlbnRyeSAqcmV0cmlldmVfY2FjaGVfc3RyaW5nKGNhY2hlICpjLCBjaGFyICpyZXMsIGNoYXIgKmtleSkKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgajsKLSAgICBjYWNoZWxpc3QgKmw7Ci0gICAgY2FjaGVlbnRyeSAqZTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBjLT5saXN0cy0+bmVsdHM7IGkrKykgewotICAgICAgICBsID0gJigoKGNhY2hlbGlzdCAqKWMtPmxpc3RzLT5lbHRzKVtpXSk7Ci0gICAgICAgIGlmIChzdHJjbXAobC0+cmVzb3VyY2UsIHJlcykgPT0gMCkgewotCi0gICAgICAgICAgICBlID0gY2FjaGVfdGxiX2xvb2t1cCgoY2FjaGV0bGJlbnRyeSAqKWwtPnRsYi0+ZWx0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYWNoZWVudHJ5ICopbC0+ZW50cmllcy0+ZWx0cywga2V5KTsKLSAgICAgICAgICAgIGlmIChlICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGU7Ci0KLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsLT5lbnRyaWVzLT5uZWx0czsgaisrKSB7Ci0gICAgICAgICAgICAgICAgZSA9ICYoKChjYWNoZWVudHJ5ICopbC0+ZW50cmllcy0+ZWx0cylbal0pOwotICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoZS0+a2V5LCBrZXkpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi0KLQotCi0vKgotKiogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0qKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSoqIHwgICAgICAgICAgICAgICAgICAgIG1pc2MgZnVuY3Rpb25zCi0qKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSoqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotKi8KLQotc3RhdGljIGNoYXIgKnN1YnN0X3ByZWZpeF9wYXRoKHJlcXVlc3RfcmVjICpyLCBjaGFyICppbnB1dCwgY2hhciAqbWF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3Vic3QpCi17Ci0gICAgY2hhciBtYXRjaGJ1ZltMT05HX1NUUklOR19MRU5dOwotICAgIGNoYXIgc3Vic3RidWZbTE9OR19TVFJJTkdfTEVOXTsKLSAgICBjaGFyICpvdXRwdXQ7Ci0gICAgaW50IGw7Ci0KLSAgICBvdXRwdXQgPSBpbnB1dDsKLQotICAgIC8qIGZpcnN0IGNyZWF0ZSBhIG1hdGNoIHN0cmluZyB3aGljaCBhbHdheXMgaGFzIGEgdHJhaWxpbmcgc2xhc2ggKi8KLSAgICBsID0gYXBfY3B5c3RybihtYXRjaGJ1ZiwgbWF0Y2gsIHNpemVvZihtYXRjaGJ1ZikpIC0gbWF0Y2hidWY7Ci0gICAgaWYgKG1hdGNoYnVmW2wtMV0gIT0gJy8nKSB7Ci0gICAgICAgbWF0Y2hidWZbbF0gPSAnLyc7Ci0gICAgICAgbWF0Y2hidWZbbCsxXSA9ICdcMCc7Ci0gICAgICAgbCsrOwotICAgIH0KLSAgICAvKiBub3cgY29tcGFyZSB0aGUgcHJlZml4ICovCi0gICAgaWYgKHN0cm5jbXAoaW5wdXQsIG1hdGNoYnVmLCBsKSA9PSAwKSB7Ci0gICAgICAgIHJld3JpdGVsb2cociwgNSwgInN0cmlwIG1hdGNoaW5nIHByZWZpeDogJXMgLT4gJXMiLCBvdXRwdXQsIG91dHB1dCtsKTsKLSAgICAgICAgb3V0cHV0ID0gYXBfcHN0cmR1cChyLT5wb29sLCBvdXRwdXQrbCk7Ci0KLSAgICAgICAgLyogYW5kIG5vdyBhZGQgdGhlIGJhc2UtVVJMIGFzIHJlcGxhY2VtZW50IHByZWZpeCAqLwotICAgICAgICBsID0gYXBfY3B5c3RybihzdWJzdGJ1Ziwgc3Vic3QsIHNpemVvZihzdWJzdGJ1ZikpIC0gc3Vic3RidWY7Ci0gICAgICAgIGlmIChzdWJzdGJ1ZltsLTFdICE9ICcvJykgewotICAgICAgICAgICBzdWJzdGJ1ZltsXSA9ICcvJzsKLSAgICAgICAgICAgc3Vic3RidWZbbCsxXSA9ICdcMCc7Ci0gICAgICAgICAgIGwrKzsKLSAgICAgICAgfQotICAgICAgICBpZiAob3V0cHV0WzBdID09ICcvJykgewotICAgICAgICAgICAgcmV3cml0ZWxvZyhyLCA0LCAiYWRkIHN1YnN0IHByZWZpeDogJXMgLT4gJXMlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwgc3Vic3RidWYsIG91dHB1dCsxKTsKLSAgICAgICAgICAgIG91dHB1dCA9IGFwX3BzdHJjYXQoci0+cG9vbCwgc3Vic3RidWYsIG91dHB1dCsxLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJld3JpdGVsb2cociwgNCwgImFkZCBzdWJzdCBwcmVmaXg6ICVzIC0+ICVzJXMiLAotICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIHN1YnN0YnVmLCBvdXRwdXQpOwotICAgICAgICAgICAgb3V0cHV0ID0gYXBfcHN0cmNhdChyLT5wb29sLCBzdWJzdGJ1Ziwgb3V0cHV0LCBOVUxMKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gb3V0cHV0OwotfQotCi0KLS8qCi0qKgotKiogIG93biBjb21tYW5kIGxpbmUgcGFyc2VyIHdoaWNoIGRvbid0IGhhdmUgdGhlICdcXCcgcHJvYmxlbQotKioKLSovCi0KLXN0YXRpYyBpbnQgcGFyc2VhcmdsaW5lKGNoYXIgKnN0ciwgY2hhciAqKmExLCBjaGFyICoqYTIsIGNoYXIgKiphMykKLXsKLSAgICBjaGFyICpjcDsKLSAgICBpbnQgaXNxdW90ZWQ7Ci0KLSNkZWZpbmUgU0tJUF9XSElURVNQQUNFKGNwKSBcCi0gICAgZm9yICggOyAqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnOyApIHsgXAotICAgICAgICBjcCsrOyBcCi0gICAgfTsKLQotI2RlZmluZSBDSEVDS19RVU9UQVRJT04oY3AsaXNxdW90ZWQpIFwKLSAgICBpc3F1b3RlZCA9IDA7IFwKLSAgICBpZiAoKmNwID09ICciJykgeyBcCi0gICAgICAgIGlzcXVvdGVkID0gMTsgXAotICAgICAgICBjcCsrOyBcCi0gICAgfQotCi0jZGVmaW5lIERFVEVSTUlORV9ORVhUU1RSSU5HKGNwLGlzcXVvdGVkKSBcCi0gICAgZm9yICggOyAqY3AgIT0gJ1wwJzsgY3ArKykgeyBcCi0gICAgICAgIGlmICggICAoaXNxdW90ZWQgICAgJiYgKCpjcCAgICAgPT0gJyAnIHx8ICpjcCAgICAgPT0gJ1x0JykpIFwKLSAgICAgICAgICAgIHx8ICgqY3AgPT0gJ1xcJyAmJiAoKihjcCsxKSA9PSAnICcgfHwgKihjcCsxKSA9PSAnXHQnKSkpIHsgXAotICAgICAgICAgICAgY3ArKzsgXAotICAgICAgICAgICAgY29udGludWU7IFwKLSAgICAgICAgfSBcCi0gICAgICAgIGlmICggICAoIWlzcXVvdGVkICYmICgqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnKSkgXAotICAgICAgICAgICAgfHwgKGlzcXVvdGVkICAmJiAqY3AgPT0gJyInKSAgICAgICAgICAgICAgICAgICkgeyBcCi0gICAgICAgICAgICBicmVhazsgXAotICAgICAgICB9IFwKLSAgICB9Ci0KLSAgICBjcCA9IHN0cjsKLSAgICBTS0lQX1dISVRFU1BBQ0UoY3ApOwotCi0gICAgLyogIGRldGVybWluZSBmaXJzdCBhcmd1bWVudCAqLwotICAgIENIRUNLX1FVT1RBVElPTihjcCwgaXNxdW90ZWQpOwotICAgICphMSA9IGNwOwotICAgIERFVEVSTUlORV9ORVhUU1RSSU5HKGNwLCBpc3F1b3RlZCk7Ci0gICAgaWYgKCpjcCA9PSAnXDAnKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICAqY3ArKyA9ICdcMCc7Ci0KLSAgICBTS0lQX1dISVRFU1BBQ0UoY3ApOwotCi0gICAgLyogIGRldGVybWluZSBzZWNvbmQgYXJndW1lbnQgKi8KLSAgICBDSEVDS19RVU9UQVRJT04oY3AsIGlzcXVvdGVkKTsKLSAgICAqYTIgPSBjcDsKLSAgICBERVRFUk1JTkVfTkVYVFNUUklORyhjcCwgaXNxdW90ZWQpOwotICAgIGlmICgqY3AgPT0gJ1wwJykgewotICAgICAgICAqY3ArKyA9ICdcMCc7Ci0gICAgICAgICphMyA9IE5VTEw7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAqY3ArKyA9ICdcMCc7Ci0KLSAgICBTS0lQX1dISVRFU1BBQ0UoY3ApOwotCi0gICAgLyogYWdhaW4gY2hlY2sgaWYgdGhlcmUgYXJlIG9ubHkgdHdvIGFyZ3VtZW50cyAqLwotICAgIGlmICgqY3AgPT0gJ1wwJykgewotICAgICAgICAqY3ArKyA9ICdcMCc7Ci0gICAgICAgICphMyA9IE5VTEw7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qICBkZXRlcm1pbmUgc2Vjb25kIGFyZ3VtZW50ICovCi0gICAgQ0hFQ0tfUVVPVEFUSU9OKGNwLCBpc3F1b3RlZCk7Ci0gICAgKmEzID0gY3A7Ci0gICAgREVURVJNSU5FX05FWFRTVFJJTkcoY3AsIGlzcXVvdGVkKTsKLSAgICAqY3ArKyA9ICdcMCc7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZCBhZGRfZW52X3ZhcmlhYmxlKHJlcXVlc3RfcmVjICpyLCBjaGFyICpzKQotewotICAgIGNoYXIgdmFyW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyIHZhbFtNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciAqY3A7Ci0gICAgaW50IG47Ci0KLSAgICBpZiAoKGNwID0gc3RyY2hyKHMsICc6JykpICE9IE5VTEwpIHsKLSAgICAgICAgbiA9ICgoY3AtcykgPiBNQVhfU1RSSU5HX0xFTi0xID8gTUFYX1NUUklOR19MRU4tMSA6IChjcC1zKSk7Ci0gICAgICAgIG1lbWNweSh2YXIsIHMsIG4pOwotICAgICAgICB2YXJbbl0gPSAnXDAnOwotICAgICAgICBhcF9jcHlzdHJuKHZhbCwgY3ArMSwgc2l6ZW9mKHZhbCkpOwotICAgICAgICBhcF90YWJsZV9zZXQoci0+c3VicHJvY2Vzc19lbnYsIHZhciwgdmFsKTsKLSAgICAgICAgcmV3cml0ZWxvZyhyLCA1LCAic2V0dGluZyBlbnYgdmFyaWFibGUgJyVzJyB0byAnJXMnIiwgdmFyLCB2YWwpOwotICAgIH0KLX0KLQotCi0KLS8qCi0qKgotKiogIHN0YXQoKSBmb3Igb25seSB0aGUgcHJlZml4IG9mIGEgcGF0aAotKioKLSovCi0KLXN0YXRpYyBpbnQgcHJlZml4X3N0YXQoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IHN0YXQgKnNiKQotewotICAgIGNoYXIgY3VycGF0aFtMT05HX1NUUklOR19MRU5dOwotICAgIGNoYXIgKmNwOwotCi0gICAgYXBfY3B5c3RybihjdXJwYXRoLCBwYXRoLCBzaXplb2YoY3VycGF0aCkpOwotICAgIGlmIChjdXJwYXRoWzBdICE9ICcvJykgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKChjcCA9IHN0cmNocihjdXJwYXRoKzEsICcvJykpICE9IE5VTEwpIHsKLSAgICAgICAgKmNwID0gJ1wwJzsKLSAgICB9Ci0gICAgaWYgKHN0YXQoY3VycGF0aCwgc2IpID09IDApIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLQotLyoKLSoqCi0qKiAgRmlsZSBsb2NraW5nCi0qKgotKi8KLQotI2lmZGVmIFVTRV9GQ05UTAotc3RhdGljIHN0cnVjdCBmbG9jayAgIGxvY2tfaXQ7Ci1zdGF0aWMgc3RydWN0IGZsb2NrIHVubG9ja19pdDsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBmZF9sb2NrKHJlcXVlc3RfcmVjICpyLCBhcF9maWxlX3QgKmZkKQotewotICAgIGludCByYzsKLSAgICBpbnQgc3lzX2ZpbGU7Ci0KLSNpZmRlZiBVU0VfRkNOVEwKLSAgICBsb2NrX2l0Lmxfd2hlbmNlID0gU0VFS19TRVQ7IC8qIGZyb20gY3VycmVudCBwb2ludCAqLwotICAgIGxvY2tfaXQubF9zdGFydCAgPSAwOyAgICAgICAgLyogLSItICovCi0gICAgbG9ja19pdC5sX2xlbiAgICA9IDA7ICAgICAgICAvKiB1bnRpbCBlbmQgb2YgZmlsZSAqLwotICAgIGxvY2tfaXQubF90eXBlICAgPSBGX1dSTENLOyAgLyogc2V0IGV4Y2x1c2l2ZS93cml0ZSBsb2NrICovCi0gICAgbG9ja19pdC5sX3BpZCAgICA9IDA7ICAgICAgICAvKiBwaWQgbm90IGFjdHVhbGx5IGludGVyZXN0aW5nICovCi0KLSAgICBhcF9nZXRfb3NfZmlsZSgmc3lzX2ZpbGUsIGZkKTsKLSAgICB3aGlsZSAoICAgKChyYyA9IGZjbnRsKHN5c19maWxlLCBGX1NFVExLVywgJmxvY2tfaXQpKSA8IDApCi0gICAgICAgICAgICAgICYmIChlcnJubyA9PSBFSU5UUikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgIH0KLSNlbmRpZgotI2lmZGVmIFVTRV9GTE9DSwotICAgIGFwX2dldF9vc19maWxlKGZkLCAmc3lzX2ZpbGUpOwotICAgIHdoaWxlICggICAoKHJjID0gZmxvY2soc3lzX2ZpbGUsIExPQ0tfRVgpKSA8IDApCi0gICAgICAgICAgICAgICYmIChlcnJubyA9PSBFSU5UUikgICAgICAgICAgICAgICApIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgfQotI2VuZGlmCi0jaWZkZWYgVVNFX0xPQ0tJTkcKLSAgICAvKiBMb2NrIHRoZSBmaXJzdCBieXRlLCBhbHdheXMsIGFzc3VtZSB3ZSB3YW50IHRvIGFwcGVuZAotICAgICAgIGFuZCBzZWVrIHRvIHRoZSBlbmQgYWZ0ZXJ3YXJkcyAqLwotICAgIGFwX3NlZWsoZmQsIEFQUl9TRVQsIDApOwotICAgIGFwX2dldF9vc19maWxlKCZzeXNfZmlsZSwgZmQpOwotICAgIHJjID0gX2xvY2tpbmcoc3lzX2ZpbGUsIF9MS19MT0NLLCAxKTsKLSAgICBhcF9zZWVrKGZkLCBBUFJfRU5ELCAwKTsKLSNlbmRpZgotCi0gICAgaWYgKHJjIDwgMCkgewotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHIsCi0gICAgICAgICAgICAgICAgICAgICAibW9kX3Jld3JpdGU6IGZhaWxlZCB0byBsb2NrIGZpbGUgZGVzY3JpcHRvciIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGZkX3VubG9jayhyZXF1ZXN0X3JlYyAqciwgYXBfZmlsZV90ICpmZCkKLXsKLSAgICBpbnQgcmM7Ci0gICAgaW50IHN5c19maWxlOwotCi0jaWZkZWYgVVNFX0ZDTlRMCi0gICAgdW5sb2NrX2l0Lmxfd2hlbmNlID0gU0VFS19TRVQ7IC8qIGZyb20gY3VycmVudCBwb2ludCAqLwotICAgIHVubG9ja19pdC5sX3N0YXJ0ICA9IDA7ICAgICAgICAvKiAtIi0gKi8KLSAgICB1bmxvY2tfaXQubF9sZW4gICAgPSAwOyAgICAgICAgLyogdW50aWwgZW5kIG9mIGZpbGUgKi8KLSAgICB1bmxvY2tfaXQubF90eXBlICAgPSBGX1VOTENLOyAgLyogdW5sb2NrICovCi0gICAgdW5sb2NrX2l0LmxfcGlkICAgID0gMDsgICAgICAgIC8qIHBpZCBub3QgYWN0dWFsbHkgaW50ZXJlc3RpbmcgKi8KLQotICAgIGFwX2dldF9vc19maWxlKCZzeXNfZmlsZSwgZmQpOwotICAgIHJjID0gZmNudGwoc3lzX2ZpbGUsIEZfU0VUTEtXLCAmdW5sb2NrX2l0KTsKLSNlbmRpZgotI2lmZGVmIFVTRV9GTE9DSwotICAgIGFwX2dldF9vc19maWxlKGZkLCAmc3lzX2ZpbGUpOwotICAgIHJjID0gZmxvY2soc3lzX2ZpbGUsIExPQ0tfVU4pOwotI2VuZGlmCi0jaWZkZWYgVVNFX0xPQ0tJTkcKLSAgICBhcF9zZWVrKGZkLCBBUFJfU0VULCAwKTsKLSAgICBhcF9nZXRfb3NfZmlsZSgmc3lzX2ZpbGUsIGZkKTsKLSAgICByYyA9IF9sb2NraW5nKHN5c19maWxlLCBfTEtfVU5MQ0ssIDEpOwotICAgIGFwX3NlZWsoZmQsIEFQUl9FTkQsIDApOwotI2VuZGlmCi0KLSAgICBpZiAocmMgPCAwKSB7Ci0gICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgciwKLSAgICAgICAgICAgICAgICAgICAgICJtb2RfcmV3cml0ZTogZmFpbGVkIHRvIHVubG9jayBmaWxlIGRlc2NyaXB0b3IiKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci19Ci0KLS8qCi0qKgotKiogIExleGljb2dyYXBoaWMgQ29tcGFyZQotKioKLSovCi0KLXN0YXRpYyBpbnQgY29tcGFyZV9sZXhpY29ncmFwaHkoY2hhciAqY3BOdW0xLCBjaGFyICpjcE51bTIpCi17Ci0gICAgaW50IGk7Ci0gICAgaW50IG4xLCBuMjsKLQotICAgIG4xID0gc3RybGVuKGNwTnVtMSk7Ci0gICAgbjIgPSBzdHJsZW4oY3BOdW0yKTsKLSAgICBpZiAobjEgPiBuMikgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYgKG4xIDwgbjIpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbjE7IGkrKykgewotICAgICAgICBpZiAoY3BOdW0xW2ldID4gY3BOdW0yW2ldKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY3BOdW0xW2ldIDwgY3BOdW0yW2ldKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBORVRXQVJFCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSAKLXsKLSAgICBFeGl0VGhyZWFkKFRTUl9USFJFQUQsIDApOwotfQotI2VuZGlmCi0gCi0vKkVPRiovCmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvbW9kX3Jld3JpdGUuZHNwIGIvbW9kdWxlcy9tYXBwZXJzL21vZF9yZXdyaXRlLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEwZmZkMS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21hcHBlcnMvbW9kX3Jld3JpdGUuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iQXBhY2hlTW9kdWxlUmV3cml0ZSIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNS4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyCi0KLUNGRz1BcGFjaGVNb2R1bGVSZXdyaXRlIC0gV2luMzIgUmVsZWFzZQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJBcGFjaGVNb2R1bGVSZXdyaXRlLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiQXBhY2hlTW9kdWxlUmV3cml0ZS5tYWsiXAotIENGRz0iQXBhY2hlTW9kdWxlUmV3cml0ZSAtIFdpbjMyIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAiQXBhY2hlTW9kdWxlUmV3cml0ZSAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvblwKLSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgIkFwYWNoZU1vZHVsZVJld3JpdGUgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotTVRMPW1pZGwuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIkFwYWNoZU1vZHVsZVJld3JpdGUgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiLlxSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIi5cQXBhY2hlTW9kdWxlUmV3cml0ZVIiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLlxBcGFjaGVNb2R1bGVSZXdyaXRlUiIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR1ggL08yIC9JICIuLlwuLlxpbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIk5PX0RCTV9SRVdSSVRFTUFQIiAvRCAiU0hBUkVEX01PRFVMRSIgL0QgIldJTjMyX0xFQU5fQU5EX01FQU4iIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIC4uXC4uXENvcmVSXEFwYWNoZUNvcmUubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiB3czJfMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hY2hpbmU6STM4NgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiQXBhY2hlTW9kdWxlUmV3cml0ZSAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIi5cRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiLlxBcGFjaGVNb2R1bGVSZXdyaXRlRCIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuXEFwYWNoZU1vZHVsZVJld3JpdGVEIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTURkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uXC4uXGluY2x1ZGUiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiTk9fREJNX1JFV1JJVEVNQVAiIC9EICJTSEFSRURfTU9EVUxFIiAvRCAiV0lOMzJfTEVBTl9BTkRfTUVBTiIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIC4uXC4uXENvcmVEXEFwYWNoZUNvcmUubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiB3czJfMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIkFwYWNoZU1vZHVsZVJld3JpdGUgLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICJBcGFjaGVNb2R1bGVSZXdyaXRlIC0gV2luMzIgRGVidWciCi0jIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtocGo7YmF0O2ZvcjtmOTAiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxtb2R1bGVzXHN0YW5kYXJkXG1vZF9yZXdyaXRlLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHBhc3N3ZC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sO2ZpO2ZkIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxyZWFkZGlyLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO2NudDtydGY7Z2lmO2pwZztqcGVnO2pwZSIKLSMgRW5kIEdyb3VwCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWFwcGVycy9tb2RfcmV3cml0ZS5leHAgYi9tb2R1bGVzL21hcHBlcnMvbW9kX3Jld3JpdGUuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjIxNjViLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWFwcGVycy9tb2RfcmV3cml0ZS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1yZXdyaXRlX21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tYXBwZXJzL21vZF9yZXdyaXRlLmggYi9tb2R1bGVzL21hcHBlcnMvbW9kX3Jld3JpdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVmYzUxMS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21hcHBlcnMvbW9kX3Jld3JpdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwNCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotCi0jaWZuZGVmIF9NT0RfUkVXUklURV9ICi0jZGVmaW5lIF9NT0RfUkVXUklURV9IIDEKLQotLyoKLSoqICAgICAgICAgICAgICAgICAgICAgICBfICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gXwotKiogICBfIF9fIF9fXyAgIF9fXyAgIF9ffCB8ICAgIF8gX18gX19fX18gICAgICBfX18gX18oXykgfF8gX19fCi0qKiAgfCAnXyBgIF8gXCAvIF8gXCAvIF9gIHwgICB8ICdfXy8gXyBcIFwgL1wgLyAvICdfX3wgfCBfXy8gXyBcCi0qKiAgfCB8IHwgfCB8IHwgKF8pIHwgKF98IHwgICB8IHwgfCAgX18vXCBWICBWIC98IHwgIHwgfCB8fCAgX18vCi0qKiAgfF98IHxffCB8X3xcX19fLyBcX18sX3xfX198X3wgIFxfX198IFxfL1xfLyB8X3wgIHxffFxfX1xfX198Ci0qKiAgICAgICAgICAgICAgICAgICAgICAgfF9fX19ffAotKioKLSoqICBVUkwgUmV3cml0aW5nIE1vZHVsZQotKioKLSoqICBUaGlzIG1vZHVsZSB1c2VzIGEgcnVsZS1iYXNlZCByZXdyaXRpbmcgZW5naW5lIChiYXNlZCBvbiBhCi0qKiAgcmVndWxhci1leHByZXNzaW9uIHBhcnNlcikgdG8gcmV3cml0ZSByZXF1ZXN0ZWQgVVJMcyBvbiB0aGUgZmx5LgotKioKLSoqICBJdCBzdXBwb3J0cyBhbiB1bmxpbWl0ZWQgbnVtYmVyIG9mIGFkZGl0aW9uYWwgcnVsZSBjb25kaXRpb25zICh3aGljaCBjYW4KLSoqICBvcGVyYXRlIG9uIGEgbG90IG9mIHZhcmlhYmxlcywgZXZlbiBvbiBIVFRQIGhlYWRlcnMpIGZvciBncmFudWxhcgotKiogIG1hdGNoaW5nIGFuZCBldmVuIGV4dGVybmFsIGRhdGFiYXNlIGxvb2t1cHMgKGVpdGhlciB2aWEgcGxhaW4gdGV4dAotKiogIHRhYmxlcywgREJNIGhhc2ggZmlsZXMgb3IgZXZlbiBleHRlcm5hbCBwcm9jZXNzZXMpIGZvciBhZHZhbmNlZCBVUkwKLSoqICBzdWJzdGl0dXRpb24uCi0qKgotKiogIEl0IG9wZXJhdGVzIG9uIHRoZSBmdWxsIFVSTHMgKGluY2x1ZGluZyB0aGUgUEFUSF9JTkZPIHBhcnQpIGJvdGggaW4KLSoqICBwZXItc2VydmVyIGNvbnRleHQgKGh0dHBkLmNvbmYpIGFuZCBwZXItZGlyIGNvbnRleHQgKC5odGFjY2VzcykgYW5kIGV2ZW4KLSoqICBjYW4gZ2VuZXJhdGUgUVVFUllfU1RSSU5HIHBhcnRzIG9uIHJlc3VsdC4gICBUaGUgcmV3cml0aW5nIHJlc3VsdCBmaW5hbGx5Ci0qKiAgY2FuIGxlYWQgdG8gaW50ZXJuYWwgc3VicHJvY2Vzc2luZywgZXh0ZXJuYWwgcmVxdWVzdCByZWRpcmVjdGlvbiBvciBldmVuCi0qKiAgdG8gaW50ZXJuYWwgcHJveHkgdGhyb3VnaHB1dC4KLSoqCi0qKiAgVGhpcyBtb2R1bGUgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBpbiBBcHJpbCAxOTk2IGFuZAotKiogIGdpZnRlZCBleGNsdXNpdmVseSB0byB0aGUgVGhlIEFwYWNoZSBHcm91cCBpbiBKdWx5IDE5OTcgYnkKLSoqCi0qKiAgICAgIFJhbGYgUy4gRW5nZWxzY2hhbGwKLSoqICAgICAgcnNlQGVuZ2Vsc2NoYWxsLmNvbQotKiogICAgICB3d3cuZW5nZWxzY2hhbGwuY29tCi0qLwotCi0KLSAgICAvKiBJbmNsdWRlIGZyb20gdGhlIHVuZGVybGF5aW5nIFVuaXggc3lzdGVtIC4uLiAqLwotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaWZuZGVmIE5FVFdBUkUKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSAgICAvKiBJbmNsdWRlIGZyb20gdGhlIEFwYWNoZSBzZXJ2ZXIgLi4uICovCi0jZGVmaW5lIENPUkVfUFJJVkFURQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZfZ2xvYmFscy5oIgotI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF92aG9zdC5oIgotCi0gICAgLyoKLSAgICAgKiBUaGUga2V5IGluIHRoZSByLT5ub3RlcyBhcF90YWJsZV90IHdoZXJlaW4gd2Ugc3RvcmUgb3VyIGFjY3VtdWxhdGVkCi0gICAgICogVmFyeSB2YWx1ZXMsIGFuZCB0aGUgb25lIHVzZWQgZm9yIHBlci1jb25kaXRpb24gY2hlY2tzIGluIGEgY2hhaW4uCi0gICAgICovCi0jZGVmaW5lIFZBUllfS0VZICJyZXdyaXRlLVZhcnkiCi0jZGVmaW5lIFZBUllfS0VZX1RISVMgInJld3JpdGUtVmFyeS10aGlzIgotCi0gICAgLyogVGhlIE5EQk0gc3VwcG9ydDoKLSAgICAgKiBXZSBzdXBwb3J0IG9ubHkgTkRCTSBmaWxlcy4KLSAgICAgKiBCdXQgd2UgaGF2ZSB0byBzdGF0IHRoZSBmaWxlIGZvciB0aGUgbXRpbWUsCi0gICAgICogc28gd2UgYWxzbyBuZWVkIHRvIGtub3cgdGhlIGZpbGUgZXh0ZW5zaW9uCi0gICAgICovCi0jaWZuZGVmIE5PX0RCTV9SRVdSSVRFTUFQCi0jaWYgZGVmaW5lZChfX0dMSUJDX18pICYmIGRlZmluZWQoX19HTElCQ19NSU5PUl9fKSBcCi0gICAgJiYgX19HTElCQ19fID49IDIgJiYgX19HTElCQ19NSU5PUl9fID49IDEKLSNpbmNsdWRlIDxkYjEvbmRibS5oPgotI2Vsc2UKLSNpbmNsdWRlIDxuZGJtLmg+Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKERCTV9TVUZGSVgpCi0jZGVmaW5lIE5EQk1fRklMRV9TVUZGSVggREJNX1NVRkZJWAotI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgKGRlZmluZWQoREJfTE9DSykgJiYgZGVmaW5lZChEQl9TSE1FTSkpCi0jZGVmaW5lIE5EQk1fRklMRV9TVUZGSVggIi5kYiIKLSNlbHNlCi0jZGVmaW5lIE5EQk1fRklMRV9TVUZGSVggIi5wYWciCi0jZW5kaWYKLSNlbmRpZgotCi0KLSAgICAvKiBUaGUgbG9ja2luZyBzdXBwb3J0OgotICAgICAqIFRyeSB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBzaG91bGQgdXNlIGZjbnRsKCkgb3IgZmxvY2soKS4KLSAgICAgKiBXb3VsZCBiZSBiZXR0ZXIgYXBfY29uZmlnLmggY291bGQgcHJvdmlkZSB0aGlzLi4uIDotKAotICAgICAqLwotI2lmIGRlZmluZWQoVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUKQotI2RlZmluZSBVU0VfRkNOVEwgMQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFVTRV9GTE9DS19TRVJJQUxJWkVEX0FDQ0VQVCkKLSNkZWZpbmUgVVNFX0ZMT0NLIDEKLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotI2VuZGlmCi0jaWYgIWRlZmluZWQoVVNFX0ZDTlRMKSAmJiAhZGVmaW5lZChVU0VfRkxPQ0spCi0jZGVmaW5lIFVTRV9GTE9DSyAxCi0jaWYgIWRlZmluZWQoTVBFKSAmJiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoX19UQU5ERU0pICYmICFkZWZpbmVkKE5FVFdBUkUpCi0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4KLSNlbmRpZgotI2lmbmRlZiBMT0NLX1VOCi0jdW5kZWYgVVNFX0ZMT0NLCi0jZGVmaW5lIFVTRV9GQ05UTCAxCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgQUlYCi0jdW5kZWYgVVNFX0ZMT0NLCi0jZGVmaW5lIFVTRV9GQ05UTCAxCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNlbmRpZgotI2lmZGVmIFdJTjMyCi0jdW5kZWYgVVNFX0ZDTlRMCi0jZGVmaW5lIFVTRV9MT0NLSU5HCi0jaW5jbHVkZSA8c3lzL2xvY2tpbmcuaD4KLSNlbmRpZgotCi0KLS8qCi0qKgotKiogIFNvbWUgZGVmaW5lcwotKioKLSovCi0KLSNkZWZpbmUgRU5WVkFSX1NDUklQVF9VUkwgIlNDUklQVF9VUkwiCi0jZGVmaW5lIEVOVlZBUl9TQ1JJUFRfVVJJICJTQ1JJUFRfVVJJIgotCi0jaWZuZGVmIFNVUFBPUlRfREJNX1JFV1JJVEVNQVAKLSNkZWZpbmUgU1VQUE9SVF9EQk1fUkVXUklURU1BUCAwCi0jZW5kaWYKLQotI2RlZmluZSBSRVdSSVRFX0ZPUkNFRF9NSU1FVFlQRV9OT1RFVkFSICJyZXdyaXRlLWZvcmNlZC1taW1ldHlwZSIKLQotI2RlZmluZSBDT05ERkxBR19OT05FICAgICAgICAgICAgICAgMTw8MAotI2RlZmluZSBDT05ERkxBR19OT0NBU0UgICAgICAgICAgICAgMTw8MQotI2RlZmluZSBDT05ERkxBR19OT1RNQVRDSCAgICAgICAgICAgMTw8MgotI2RlZmluZSBDT05ERkxBR19PUk5FWFQgICAgICAgICAgICAgMTw8MwotCi0jZGVmaW5lIFJVTEVGTEFHX05PTkUgICAgICAgICAgICAgICAxPDwwCi0jZGVmaW5lIFJVTEVGTEFHX0ZPUkNFUkVESVJFQ1QgICAgICAxPDwxCi0jZGVmaW5lIFJVTEVGTEFHX0xBU1RSVUxFICAgICAgICAgICAxPDwyCi0jZGVmaW5lIFJVTEVGTEFHX05FV1JPVU5EICAgICAgICAgICAxPDwzCi0jZGVmaW5lIFJVTEVGTEFHX0NIQUlOICAgICAgICAgICAgICAxPDw0Ci0jZGVmaW5lIFJVTEVGTEFHX0lHTk9SRU9OU1VCUkVRICAgICAxPDw1Ci0jZGVmaW5lIFJVTEVGTEFHX05PVE1BVENIICAgICAgICAgICAxPDw2Ci0jZGVmaW5lIFJVTEVGTEFHX1BST1hZICAgICAgICAgICAgICAxPDw3Ci0jZGVmaW5lIFJVTEVGTEFHX1BBU1NUSFJPVUdIICAgICAgICAxPDw4Ci0jZGVmaW5lIFJVTEVGTEFHX0ZPUkJJRERFTiAgICAgICAgICAxPDw5Ci0jZGVmaW5lIFJVTEVGTEFHX0dPTkUgICAgICAgICAgICAgICAxPDwxMAotI2RlZmluZSBSVUxFRkxBR19RU0FQUEVORCAgICAgICAgICAgMTw8MTEKLSNkZWZpbmUgUlVMRUZMQUdfTk9DQVNFICAgICAgICAgICAgIDE8PDEyCi0KLSNkZWZpbmUgTUFQVFlQRV9UWFQgICAgICAgICAgICAgICAgIDE8PDAKLSNkZWZpbmUgTUFQVFlQRV9EQk0gICAgICAgICAgICAgICAgIDE8PDEKLSNkZWZpbmUgTUFQVFlQRV9QUkcgICAgICAgICAgICAgICAgIDE8PDIKLSNkZWZpbmUgTUFQVFlQRV9JTlQgICAgICAgICAgICAgICAgIDE8PDMKLSNkZWZpbmUgTUFQVFlQRV9STkQgICAgICAgICAgICAgICAgIDE8PDQKLQotI2RlZmluZSBFTkdJTkVfRElTQUJMRUQgICAgICAgICAgICAgMTw8MAotI2RlZmluZSBFTkdJTkVfRU5BQkxFRCAgICAgICAgICAgICAgMTw8MQotCi0jZGVmaW5lIE9QVElPTl9OT05FICAgICAgICAgICAgICAgICAxPDwwCi0jZGVmaW5lIE9QVElPTl9JTkhFUklUICAgICAgICAgICAgICAxPDwxCi0KLSNkZWZpbmUgQ0FDSEVNT0RFX1RTICAgICAgICAgICAgICAgIDE8PDAKLSNkZWZpbmUgQ0FDSEVNT0RFX1RUTCAgICAgICAgICAgICAgIDE8PDEKLQotI2RlZmluZSBDQUNIRV9UTEJfUk9XUyAxMDI0Ci0jZGVmaW5lIENBQ0hFX1RMQl9DT0xTIDQKLQotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSAwCi0jZGVmaW5lIFRSVUUgICFGQUxTRQotI2VuZGlmCi0KLSNpZm5kZWYgTk8KLSNkZWZpbmUgTk8gICAgRkFMU0UKLSNkZWZpbmUgWUVTICAgVFJVRQotI2VuZGlmCi0KLSNpZm5kZWYgUkFORF9NQVgKLSNkZWZpbmUgUkFORF9NQVggMzI3NjcKLSNlbmRpZgotCi0jaWZuZGVmIExPTkdfU1RSSU5HX0xFTgotI2RlZmluZSBMT05HX1NUUklOR19MRU4gMjA0OAotI2VuZGlmCi0KLSNkZWZpbmUgTUFYX0VOVl9GTEFHUyAxNQotCi0jZGVmaW5lIE1BWF9OTUFUQ0ggICAgMTAKLQotLyoKLSoqCi0qKiAgb3VyIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmVzIHdlIGhhbmRsZSB3aXRoCi0qKgotKi8KLQotICAgIC8qIHRoZSBsaXN0IHN0cnVjdHVyZXMgZm9yIGhvbGRpbmcgdGhlIG1hcGZpbGUgaW5mb3JtYXRpb24KLSAgICAgKiBhbmQgdGhlIHJld3JpdGUgcnVsZXMKLSAgICAgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgICAgLyogdGhlIG5hbWUgb2YgdGhlIG1hcCAqLwotICAgIGNoYXIgKmRhdGFmaWxlOyAgICAgICAgICAgICAgICAvKiBmaWxlbmFtZSBmb3IgbWFwIGRhdGEgZmlsZXMgKi8KLSAgICBjaGFyICpjaGVja2ZpbGU7ICAgICAgICAgICAgICAgLyogZmlsZW5hbWUgdG8gY2hlY2sgZm9yIG1hcCBleGlzdGVuY2UgKi8KLSAgICBpbnQgICB0eXBlOyAgICAgICAgICAgICAgICAgICAgLyogdGhlIHR5cGUgb2YgdGhlIG1hcCAqLwotICAgIGFwX2ZpbGVfdCAqZnBpbjsgICAgICAgICAgICAgICAvKiBpbiAgZmlsZSBwb2ludGVyIGZvciBwcm9ncmFtIG1hcHMgKi8KLSAgICBhcF9maWxlX3QgKmZwb3V0OyAgICAgICAgICAgICAgLyogb3V0IGZpbGUgcG9pbnRlciBmb3IgcHJvZ3JhbSBtYXBzICovCi0gICAgYXBfZmlsZV90ICpmcGVycjsgICAgICAgICAgICAgIC8qIGVyciBmaWxlIHBvaW50ZXIgZm9yIHByb2dyYW0gbWFwcyAqLwotICAgIGNoYXIgKigqZnVuYykocmVxdWVzdF9yZWMgKiwgICAvKiBmdW5jdGlvbiBwb2ludGVyIGZvciBpbnRlcm5hbCBtYXBzICovCi0gICAgICAgICAgICAgICAgICBjaGFyICopOwotfSByZXdyaXRlbWFwX2VudHJ5OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY2hhciAgICAqaW5wdXQ7ICAgICAgICAgICAgICAgIC8qIElucHV0IHN0cmluZyBvZiBSZXdyaXRlQ29uZCAqLwotICAgIGNoYXIgICAgKnBhdHRlcm47ICAgICAgICAgICAgICAvKiB0aGUgUmVnRXhwIHBhdHRlcm4gc3RyaW5nICovCi0gICAgcmVnZXhfdCAqcmVnZXhwOwotICAgIGludCAgICAgIGZsYWdzOyAgICAgICAgICAgICAgICAvKiBGbGFncyB3aGljaCBjb250cm9sIHRoZSBtYXRjaCAqLwotfSByZXdyaXRlY29uZF9lbnRyeTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGFwX2FycmF5X2hlYWRlcl90ICpyZXdyaXRlY29uZHM7ICAgIC8qIHRoZSBjb3JyZXNwb25kaW5nIFJld3JpdGVDb25kIGVudHJpZXMgKi8KLSAgICBjaGFyICAgICpwYXR0ZXJuOyAgICAgICAgICAgICAgLyogdGhlIFJlZ0V4cCBwYXR0ZXJuIHN0cmluZyAqLwotICAgIHJlZ2V4X3QgKnJlZ2V4cDsgICAgICAgICAgICAgICAvKiB0aGUgUmVnRXhwIHBhdHRlcm4gY29tcGlsYXRpb24gKi8KLSAgICBjaGFyICAgICpvdXRwdXQ7ICAgICAgICAgICAgICAgLyogdGhlIFN1YnN0aXR1dGlvbiBzdHJpbmcgKi8KLSAgICBpbnQgICAgICBmbGFnczsgICAgICAgICAgICAgICAgLyogRmxhZ3Mgd2hpY2ggY29udHJvbCB0aGUgc3Vic3RpdHV0aW9uICovCi0gICAgY2hhciAgICAqZm9yY2VkX21pbWV0eXBlOyAgICAgIC8qIGZvcmNlZCBNSU1FIHR5cGUgb2Ygc3Vic3RpdHV0aW9uICovCi0gICAgaW50ICAgICAgZm9yY2VkX3Jlc3BvbnNlY29kZTsgIC8qIGZvcmNlZCBIVFRQIHJlZGlyZWN0IHJlc3BvbnNlIHN0YXR1cyAqLwotICAgIGNoYXIgICAgKmVudltNQVhfRU5WX0ZMQUdTKzFdOyAvKiBhZGRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKi8KLSAgICBpbnQgICAgICBza2lwOyAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG5leHQgcnVsZXMgdG8gc2tpcCAqLwotfSByZXdyaXRlcnVsZV9lbnRyeTsKLQotCi0gICAgLyogdGhlIHBlci1zZXJ2ZXIgb3IgcGVyLXZpcnR1YWwtc2VydmVyIGNvbmZpZ3VyYXRpb24KLSAgICAgKiBzdGF0aWNhbGx5IGdlbmVyYXRlZCBvbmNlIG9uIHN0YXJ0dXAgZm9yIGV2ZXJ5IHNlcnZlcgotICAgICAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCAgICAgICAgICAgc3RhdGU7ICAgICAgICAgICAvKiB0aGUgUmV3cml0ZUVuZ2luZSBzdGF0ZSAqLwotICAgIGludCAgICAgICAgICAgb3B0aW9uczsgICAgICAgICAvKiB0aGUgUmV3cml0ZU9wdGlvbiBzdGF0ZSAqLwotICAgIGNoYXIgICAgICAgICAqcmV3cml0ZWxvZ2ZpbGU7ICAvKiB0aGUgUmV3cml0ZUxvZyBmaWxlbmFtZSAqLwotICAgIGFwX2ZpbGVfdCAgICAqcmV3cml0ZWxvZ2ZwOyAgICAvKiB0aGUgUmV3cml0ZUxvZyBvcGVuIGZpbGVwb2ludGVyICovCi0gICAgaW50ICAgICAgICAgICByZXdyaXRlbG9nbGV2ZWw7IC8qIHRoZSBSZXdyaXRlTG9nIGxldmVsIG9mIHZlcmJvc2l0eSAqLwotICAgIGFwX2FycmF5X2hlYWRlcl90ICpyZXdyaXRlbWFwczsgICAgIC8qIHRoZSBSZXdyaXRlTWFwIGVudHJpZXMgKi8KLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqcmV3cml0ZWNvbmRzOyAgICAvKiB0aGUgUmV3cml0ZUNvbmQgZW50cmllcyAodGVtcG9yYXJ5KSAqLwotICAgIGFwX2FycmF5X2hlYWRlcl90ICpyZXdyaXRlcnVsZXM7ICAgIC8qIHRoZSBSZXdyaXRlUnVsZSBlbnRyaWVzICovCi0gICAgc2VydmVyX3JlYyAgICpzZXJ2ZXI7ICAgICAgICAgIC8qIHRoZSBjb3JyZXNwb25kaW5nIHNlcnZlciBpbmRpY2F0b3IgKi8KLX0gcmV3cml0ZV9zZXJ2ZXJfY29uZjsKLQotCi0gICAgLyogdGhlIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbgotICAgICAqIGdlbmVyYXRlZCBvbi10aGUtZmx5IGJ5IEFwYWNoZSBzZXJ2ZXIgZm9yIGN1cnJlbnQgcmVxdWVzdAotICAgICAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCAgICAgICAgICAgc3RhdGU7ICAgICAgICAgICAvKiB0aGUgUmV3cml0ZUVuZ2luZSBzdGF0ZSAqLwotICAgIGludCAgICAgICAgICAgb3B0aW9uczsgICAgICAgICAvKiB0aGUgUmV3cml0ZU9wdGlvbiBzdGF0ZSAqLwotICAgIGFwX2FycmF5X2hlYWRlcl90ICpyZXdyaXRlY29uZHM7ICAgIC8qIHRoZSBSZXdyaXRlQ29uZCBlbnRyaWVzICh0ZW1wb3JhcnkpICovCi0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKnJld3JpdGVydWxlczsgICAgLyogdGhlIFJld3JpdGVSdWxlIGVudHJpZXMgKi8KLSAgICBjaGFyICAgICAgICAgKmRpcmVjdG9yeTsgICAgICAgLyogdGhlIGRpcmVjdG9yeSB3aGVyZSBpdCBhcHBsaWVzICovCi0gICAgY2hhciAgICAgICAgICpiYXNldXJsOyAgICAgICAgIC8qIHRoZSBiYXNlLVVSTCAgd2hlcmUgaXQgYXBwbGllcyAqLwotfSByZXdyaXRlX3BlcmRpcl9jb25mOwotCi0KLSAgICAvKiB0aGUgY2FjaGUgc3RydWN0dXJlcywKLSAgICAgKiBhIDQtd2F5IGhhc2ggYXBfdGFibGVfdCB3aXRoIExSVSBmdW5jdGlvbmFsaXR5Ci0gICAgICovCi10eXBlZGVmIHN0cnVjdCBjYWNoZWVudHJ5IHsKLSAgICB0aW1lX3QgdGltZTsKLSAgICBjaGFyICAqa2V5OwotICAgIGNoYXIgICp2YWx1ZTsKLX0gY2FjaGVlbnRyeTsKLQotdHlwZWRlZiBzdHJ1Y3QgdGxiZW50cnkgewotICAgIGludCB0W0NBQ0hFX1RMQl9DT0xTXTsKLX0gY2FjaGV0bGJlbnRyeTsKLQotdHlwZWRlZiBzdHJ1Y3QgY2FjaGVsaXN0IHsKLSAgICBjaGFyICAgICAgICAgKnJlc291cmNlOwotICAgIGFwX2FycmF5X2hlYWRlcl90ICplbnRyaWVzOwotICAgIGFwX2FycmF5X2hlYWRlcl90ICp0bGI7Ci19IGNhY2hlbGlzdDsKLQotdHlwZWRlZiBzdHJ1Y3QgY2FjaGUgewotICAgIGFwX2NvbnRleHRfdCAgICAgICAgICpwb29sOwotICAgIGFwX2FycmF5X2hlYWRlcl90ICpsaXN0czsKLX0gY2FjaGU7Ci0KLQotICAgIC8qIHRoZSByZWdleCBzdHJ1Y3R1cmUgZm9yIHRoZQotICAgICAqIHN1YnN0aXR1dGlvbiBvZiBiYWNrcmVmZXJlbmNlcwotICAgICAqLwotdHlwZWRlZiBzdHJ1Y3QgYmFja3JlZmluZm8gewotICAgIGNoYXIgKnNvdXJjZTsKLSAgICBpbnQgbnN1YjsKLSAgICByZWdtYXRjaF90IHJlZ21hdGNoWzEwXTsKLX0gYmFja3JlZmluZm87Ci0KLQotLyoKLSoqCi0qKiAgZm9yd2FyZCBkZWNsYXJhdGlvbnMKLSoqCi0qLwotCi0gICAgLyogY29uZmlnIHN0cnVjdHVyZSBoYW5kbGluZyAqLwotc3RhdGljIHZvaWQgKmNvbmZpZ19zZXJ2ZXJfY3JlYXRlKGFwX2NvbnRleHRfdCAqcCwgc2VydmVyX3JlYyAqcyk7Ci1zdGF0aWMgdm9pZCAqY29uZmlnX3NlcnZlcl9tZXJnZSAoYXBfY29udGV4dF90ICpwLCB2b2lkICpiYXNldiwgdm9pZCAqb3ZlcnJpZGVzdik7Ci1zdGF0aWMgdm9pZCAqY29uZmlnX3BlcmRpcl9jcmVhdGUoYXBfY29udGV4dF90ICpwLCBjaGFyICpwYXRoKTsKLXN0YXRpYyB2b2lkICpjb25maWdfcGVyZGlyX21lcmdlIChhcF9jb250ZXh0X3QgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICpvdmVycmlkZXN2KTsKLQotICAgIC8qIGNvbmZpZyBkaXJlY3RpdmUgaGFuZGxpbmcgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjbWRfcmV3cml0ZWVuZ2luZShjbWRfcGFybXMgKmNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXdyaXRlX3BlcmRpcl9jb25mICpkY29uZiwgaW50IGZsYWcpOwotc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9yZXdyaXRlb3B0aW9ucyhjbWRfcGFybXMgKmNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZV9wZXJkaXJfY29uZiAqZGNvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm9wdGlvbik7Ci1zdGF0aWMgY29uc3QgY2hhciAqY21kX3Jld3JpdGVvcHRpb25zX3NldG9wdGlvbihhcF9jb250ZXh0X3QgKnAsIGludCAqb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm5hbWUpOwotc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9yZXdyaXRlbG9nICAgICAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmRjb25mLCBjaGFyICphMSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqY21kX3Jld3JpdGVsb2dsZXZlbChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZGNvbmYsIGNoYXIgKmExKTsKLXN0YXRpYyBjb25zdCBjaGFyICpjbWRfcmV3cml0ZW1hcCAgICAgKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkY29uZiwgY2hhciAqYTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICphMik7Ci1zdGF0aWMgY29uc3QgY2hhciAqY21kX3Jld3JpdGVsb2NrKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkY29uZiwgY2hhciAqYTEpOwotc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9yZXdyaXRlYmFzZShjbWRfcGFybXMgKmNtZCwgcmV3cml0ZV9wZXJkaXJfY29uZiAqZGNvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmExKTsKLXN0YXRpYyBjb25zdCBjaGFyICpjbWRfcmV3cml0ZWNvbmQoY21kX3Bhcm1zICpjbWQsIHJld3JpdGVfcGVyZGlyX2NvbmYgKmRjb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzdHIpOwotc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9yZXdyaXRlY29uZF9wYXJzZWZsYWdmaWVsZChhcF9jb250ZXh0X3QgKnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJld3JpdGVjb25kX2VudHJ5ICpuZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN0cik7Ci1zdGF0aWMgY29uc3QgY2hhciAqY21kX3Jld3JpdGVjb25kX3NldGZsYWcoYXBfY29udGV4dF90ICpwLCByZXdyaXRlY29uZF9lbnRyeSAqY2ZnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmtleSwgY2hhciAqdmFsKTsKLXN0YXRpYyBjb25zdCBjaGFyICpjbWRfcmV3cml0ZXJ1bGUoY21kX3Bhcm1zICpjbWQsIHJld3JpdGVfcGVyZGlyX2NvbmYgKmRjb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzdHIpOwotc3RhdGljIGNvbnN0IGNoYXIgKmNtZF9yZXdyaXRlcnVsZV9wYXJzZWZsYWdmaWVsZChhcF9jb250ZXh0X3QgKnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJld3JpdGVydWxlX2VudHJ5ICpuZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN0cik7Ci1zdGF0aWMgY29uc3QgY2hhciAqY21kX3Jld3JpdGVydWxlX3NldGZsYWcoYXBfY29udGV4dF90ICpwLCByZXdyaXRlcnVsZV9lbnRyeSAqY2ZnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmtleSwgY2hhciAqdmFsKTsKLQotICAgIC8qIGluaXRpYWxpc2F0aW9uICovCi1zdGF0aWMgdm9pZCBpbml0X21vZHVsZShhcF9jb250ZXh0X3QgKnAsCi0gICAgICAgICAgICAgICAgICAgICAgICBhcF9jb250ZXh0X3QgKnBsb2csCi0gICAgICAgICAgICAgICAgICAgICAgICBhcF9jb250ZXh0X3QgKnB0ZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX3JlYyAqcyk7Ci1zdGF0aWMgdm9pZCBpbml0X2NoaWxkKGFwX2NvbnRleHRfdCAqcCwgc2VydmVyX3JlYyAqcyk7Ci0KLSAgICAvKiBydW50aW1lIGhvb2tzICovCi1zdGF0aWMgaW50IGhvb2tfdXJpMmZpbGUgICAocmVxdWVzdF9yZWMgKnIpOwotc3RhdGljIGludCBob29rX21pbWV0eXBlICAgKHJlcXVlc3RfcmVjICpyKTsKLXN0YXRpYyBpbnQgaG9va19maXh1cCAgICAgIChyZXF1ZXN0X3JlYyAqcik7Ci1zdGF0aWMgaW50IGhhbmRsZXJfcmVkaXJlY3QocmVxdWVzdF9yZWMgKnIpOwotCi0gICAgLyogcmV3cml0aW5nIGVuZ2luZSAqLwotc3RhdGljIGludCBhcHBseV9yZXdyaXRlX2xpc3QocmVxdWVzdF9yZWMgKnIsIGFwX2FycmF5X2hlYWRlcl90ICpyZXdyaXRlcnVsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwZXJkaXIpOwotc3RhdGljIGludCBhcHBseV9yZXdyaXRlX3J1bGUocmVxdWVzdF9yZWMgKnIsIHJld3JpdGVydWxlX2VudHJ5ICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGVyZGlyKTsKLXN0YXRpYyBpbnQgYXBwbHlfcmV3cml0ZV9jb25kKHJlcXVlc3RfcmVjICpyLCByZXdyaXRlY29uZF9lbnRyeSAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBlcmRpciwgYmFja3JlZmluZm8gKmJyaVJSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3JlZmluZm8gKmJyaVJDKTsKLQotICAgIC8qIFVSSSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiAqLwotc3RhdGljIHZvaWQgIHNwbGl0b3V0X3F1ZXJ5YXJncyhyZXF1ZXN0X3JlYyAqciwgaW50IHFzYXBwZW5kKTsKLXN0YXRpYyB2b2lkICBmdWxseV9xdWFsaWZ5X3VyaShyZXF1ZXN0X3JlYyAqcik7Ci1zdGF0aWMgdm9pZCAgcmVkdWNlX3VyaShyZXF1ZXN0X3JlYyAqcik7Ci1zdGF0aWMgdm9pZCAgZXhwYW5kX2JhY2tyZWZfaW5idWZmZXIoYXBfY29udGV4dF90ICpwLCBjaGFyICpidWYsIGludCBuYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tyZWZpbmZvICpicmksIGNoYXIgYyk7Ci1zdGF0aWMgY2hhciAqZXhwYW5kX3RpbGRlcGF0aHMocmVxdWVzdF9yZWMgKnIsIGNoYXIgKnVyaSk7Ci1zdGF0aWMgdm9pZCAgZXhwYW5kX21hcF9sb29rdXBzKHJlcXVlc3RfcmVjICpyLCBjaGFyICp1cmksIGludCB1cmlfbGVuKTsKLQotICAgIC8qIHJld3JpdGUgbWFwIHN1cHBvcnQgZnVuY3Rpb25zICovCi1zdGF0aWMgY2hhciAqbG9va3VwX21hcChyZXF1ZXN0X3JlYyAqciwgY2hhciAqbmFtZSwgY2hhciAqa2V5KTsKLXN0YXRpYyBjaGFyICpsb29rdXBfbWFwX3R4dGZpbGUocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmZpbGUsIGNoYXIgKmtleSk7Ci0jaWZuZGVmIE5PX0RCTV9SRVdSSVRFTUFQCi1zdGF0aWMgY2hhciAqbG9va3VwX21hcF9kYm1maWxlKHJlcXVlc3RfcmVjICpyLCBjaGFyICpmaWxlLCBjaGFyICprZXkpOwotI2VuZGlmCi1zdGF0aWMgY2hhciAqbG9va3VwX21hcF9wcm9ncmFtKHJlcXVlc3RfcmVjICpyLCBhcF9maWxlX3QgKmZwaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX2ZpbGVfdCAqZnBvdXQsIGNoYXIgKmtleSk7Ci1zdGF0aWMgY2hhciAqbG9va3VwX21hcF9pbnRlcm5hbChyZXF1ZXN0X3JlYyAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKigqZnVuYykocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmtleSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICprZXkpOwotc3RhdGljIGNoYXIgKnJld3JpdGVfbWFwZnVuY190b3VwcGVyKHJlcXVlc3RfcmVjICpyLCBjaGFyICprZXkpOwotc3RhdGljIGNoYXIgKnJld3JpdGVfbWFwZnVuY190b2xvd2VyKHJlcXVlc3RfcmVjICpyLCBjaGFyICprZXkpOwotc3RhdGljIGNoYXIgKnJld3JpdGVfbWFwZnVuY19lc2NhcGUocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmtleSk7Ci1zdGF0aWMgY2hhciAqcmV3cml0ZV9tYXBmdW5jX3VuZXNjYXBlKHJlcXVlc3RfcmVjICpyLCBjaGFyICprZXkpOwotc3RhdGljIGNoYXIgKnNlbGVjdF9yYW5kb21fdmFsdWVfcGFydChyZXF1ZXN0X3JlYyAqciwgY2hhciAqdmFsdWUpOwotc3RhdGljIHZvaWQgIHJld3JpdGVfcmFuZF9pbml0KHZvaWQpOwotc3RhdGljIGludCAgIHJld3JpdGVfcmFuZChpbnQgbCwgaW50IGgpOwotCi0gICAgLyogcmV3cml0aW5nIGxvZ2ZpbGUgc3VwcG9ydCAqLwotc3RhdGljIHZvaWQgIG9wZW5fcmV3cml0ZWxvZyhzZXJ2ZXJfcmVjICpzLCBhcF9jb250ZXh0X3QgKnApOwotc3RhdGljIHZvaWQgIHJld3JpdGVsb2cocmVxdWVzdF9yZWMgKnIsIGludCBsZXZlbCwgY29uc3QgY2hhciAqdGV4dCwgLi4uKQotICAgICAgICAgICAgICAgICAgICAgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwzLDQpKSk7Ci1zdGF0aWMgY2hhciAqY3VycmVudF9sb2d0aW1lKHJlcXVlc3RfcmVjICpyKTsKLQotICAgIC8qIHJld3JpdGluZyBsb2NrZmlsZSBzdXBwb3J0ICovCi1zdGF0aWMgdm9pZCByZXdyaXRlbG9ja19jcmVhdGUoc2VydmVyX3JlYyAqcywgYXBfY29udGV4dF90ICpwKTsKLXN0YXRpYyB2b2lkIHJld3JpdGVsb2NrX29wZW4oc2VydmVyX3JlYyAqcywgYXBfY29udGV4dF90ICpwKTsKLXN0YXRpYyBhcF9zdGF0dXNfdCByZXdyaXRlbG9ja19yZW1vdmUodm9pZCAqZGF0YSk7Ci1zdGF0aWMgdm9pZCByZXdyaXRlbG9ja19hbGxvYyhyZXF1ZXN0X3JlYyAqcik7Ci1zdGF0aWMgdm9pZCByZXdyaXRlbG9ja19mcmVlKHJlcXVlc3RfcmVjICpyKTsKLQotICAgIC8qIHByb2dyYW0gbWFwIHN1cHBvcnQgKi8KLXN0YXRpYyB2b2lkICBydW5fcmV3cml0ZW1hcF9wcm9ncmFtcyhzZXJ2ZXJfcmVjICpzLCBhcF9jb250ZXh0X3QgKnApOwotc3RhdGljIGludCAgIHJld3JpdGVtYXBfcHJvZ3JhbV9jaGlsZChhcF9jb250ZXh0X3QgKnAsIGNoYXIgKnByb2duYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfZmlsZV90ICoqZnBvdXQsIGFwX2ZpbGVfdCAqKmZwaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9maWxlX3QgKipmcGVycik7Ci0KLSAgICAvKiBlbnYgdmFyaWFibGUgc3VwcG9ydCAqLwotc3RhdGljIHZvaWQgIGV4cGFuZF92YXJpYWJsZXNfaW5idWZmZXIocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmJ1ZiwgaW50IGJ1Zl9sZW4pOwotc3RhdGljIGNoYXIgKmV4cGFuZF92YXJpYWJsZXMocmVxdWVzdF9yZWMgKnIsIGNoYXIgKnN0cik7Ci1zdGF0aWMgY2hhciAqbG9va3VwX3ZhcmlhYmxlKHJlcXVlc3RfcmVjICpyLCBjaGFyICp2YXIpOwotc3RhdGljIGNoYXIgKmxvb2t1cF9oZWFkZXIocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKm5hbWUpOwotCi0gICAgLyogY2FjaGluZyBmdW5jdGlvbnMgKi8KLXN0YXRpYyBjYWNoZSAqaW5pdF9jYWNoZShhcF9jb250ZXh0X3QgKnApOwotc3RhdGljIGNoYXIgICpnZXRfY2FjaGVfc3RyaW5nKGNhY2hlICpjLCBjaGFyICpyZXMsIGludCBtb2RlLCB0aW1lX3QgbXRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqa2V5KTsKLXN0YXRpYyB2b2lkICAgc2V0X2NhY2hlX3N0cmluZyhjYWNoZSAqYywgY2hhciAqcmVzLCBpbnQgbW9kZSwgdGltZV90IG10aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmtleSwgY2hhciAqdmFsdWUpOwotc3RhdGljIGNhY2hlZW50cnkgKnJldHJpZXZlX2NhY2hlX3N0cmluZyhjYWNoZSAqYywgY2hhciAqcmVzLCBjaGFyICprZXkpOwotc3RhdGljIHZvaWQgICBzdG9yZV9jYWNoZV9zdHJpbmcoY2FjaGUgKmMsIGNoYXIgKnJlcywgY2FjaGVlbnRyeSAqY2UpOwotCi0gICAgLyogbWlzYyBmdW5jdGlvbnMgKi8KLXN0YXRpYyBjaGFyICAqc3Vic3RfcHJlZml4X3BhdGgocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmlucHV0LCBjaGFyICptYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3Vic3QpOwotc3RhdGljIGludCAgICBwYXJzZWFyZ2xpbmUoY2hhciAqc3RyLCBjaGFyICoqYTEsIGNoYXIgKiphMiwgY2hhciAqKmEzKTsKLXN0YXRpYyBpbnQgICAgcHJlZml4X3N0YXQoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IHN0YXQgKnNiKTsKLXN0YXRpYyB2b2lkICAgYWRkX2Vudl92YXJpYWJsZShyZXF1ZXN0X3JlYyAqciwgY2hhciAqcyk7Ci0KLSAgICAvKiBGaWxlIGxvY2tpbmcgKi8KLXN0YXRpYyB2b2lkIGZkX2xvY2socmVxdWVzdF9yZWMgKnIsIGFwX2ZpbGVfdCAqZmQpOwotc3RhdGljIHZvaWQgZmRfdW5sb2NrKHJlcXVlc3RfcmVjICpyLCBhcF9maWxlX3QgKmZkKTsKLQotICAgIC8qIExleGljb2dyYXBoaWMgQ29tcGFyaXNvbiAqLwotc3RhdGljIGludCBjb21wYXJlX2xleGljb2dyYXBoeShjaGFyICpjcE51bTEsIGNoYXIgKmNwTnVtMik7Ci0KLSNlbmRpZiAvKiBfTU9EX1JFV1JJVEVfSCAqLwotCi0vKkVPRiovCmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvbW9kX3NvLmMgYi9tb2R1bGVzL21hcHBlcnMvbW9kX3NvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMTIyYzQuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tYXBwZXJzL21vZF9zby5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyogCi0gKiBUaGlzIG1vZHVsZSBpcyB1c2VkIHRvIGxvYWQgQXBhY2hlIG1vZHVsZXMgYXQgcnVudGltZS4gVGhpcyBtZWFucyB0aGF0IHRoZQotICogc2VydmVyIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIGV4dGVuZGVkIHdpdGhvdXQgcmVjb21waWxpbmcgYW5kIGV2ZW4gd2l0aG91dAotICogdGFraW5nIHRoZSBzZXJ2ZXIgZG93biBhdCBhbGwuIE9ubHkgYSBIVVAgb3IgV0lOQ0ggc2lnbmFsIG5lZWRzIHRvIGJlIHNlbmQKLSAqIHRvIHRoZSBzZXJ2ZXIgdG8gcmVsb2FkIHRoZSBkeW5hbWljYWxseSBsb2FkZWQgbW9kdWxlcy4KLSAqCi0gKiBUbyB1c2UsIHlvdSdsbCBmaXJzdCBuZWVkIHRvIGJ1aWxkIHlvdXIgbW9kdWxlIGFzIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4KLSAqIHVwZGF0ZSB5b3VyIGNvbmZpZ3VyYXRpb24gKGh0dHBkLmNvbmYpIHRvIGdldCB0aGUgQXBhY2hlIGNvcmUgdG8gbG9hZCB0aGUKLSAqIG1vZHVsZSBhdCBzdGFydC11cC4KLSAqCi0gKiBUaGUgZWFzaWVzdCB3YXkgdG8gYnVpbGQgYSBtb2R1bGUgYXMgYSBzaGFyZWQgbGlicmFyeSBpcyB0byB1c2UgdGhlCi0gKiBgU2hhcmVkTW9kdWxlJyBjb21tYW5kIGluIHRoZSBDb25maWd1cmF0aW9uIGZpbGUsIGluc3RlYWQgb2YgYEFkZE1vZHVsZScuCi0gKiBZb3Ugc2hvdWxkIGFsc28gY2hhbmdlIHRoZSBmaWxlIGV4dGVuc2lvbiBmcm9tIGAubycgdG8gYC5zbycuIFNvLCBmb3IKLSAqIGV4YW1wbGUsIHRvIGJ1aWxkIHRoZSBzdGF0dXMgbW9kdWxlIGFzIGEgc2hhcmVkIGxpYnJhcnkgZWRpdCBDb25maWd1cmF0aW9uCi0gKiBhbmQgY2hhbmdlCi0gKiAgIEFkZE1vZHVsZSAgICBtb2R1bGVzL3N0YW5kYXJkL21vZF9zdGF0dXMubwotICogdG8KLSAqICAgU2hhcmVkTW9kdWxlIG1vZHVsZXMvc3RhbmRhcmQvbW9kX3N0YXR1cy5zbwotICoKLSAqIFJ1biBDb25maWd1cmUgYW5kIG1ha2UuIE5vdyBBcGFjaGUncyBodHRwZCBiaW5hcnkgd2lsbCBfbm90XyBpbmNsdWRlCi0gKiBtb2Rfc3RhdHVzLiBJbnN0ZWFkIGEgc2hhcmVkIG9iamVjdCBjYWxsZWQgbW9kX3N0YXR1cy5zbyB3aWxsIGJlIGJ1aWxkLCBpbgotICogdGhlIG1vZHVsZXMvc3RhbmRhcmQgZGlyZWN0b3J5LiBZb3UgY2FuIGJ1aWxkIG1vc3Qgb2YgdGhlIG1vZHVsZXMgYXMgc2hhcmVkCi0gKiBsaWJyYXJpZXMgbGlrZSB0aGlzLgotICoKLSAqIFRvIHVzZSB0aGUgc2hhcmVkIG1vZHVsZSwgbW92ZSB0aGUgLnNvIGZpbGUocykgaW50byBhbiBhcHByb3ByaWF0ZQotICogZGlyZWN0b3J5LiBZb3UgbWlnaHQgbGlrZSB0byBjcmVhdGUgYSBkaXJlY3RvcnkgY2FsbGVkICJtb2R1bGVzIiB1bmRlciB5b3UKLSAqIHNlcnZlciByb290IGZvciB0aGlzIChlLmcuIC91c3IvbG9jYWwvaHR0cGQvbW9kdWxlcykuIAotICoKLSAqIFRoZW4gZWRpdCB5b3VyIGNvbmYvaHR0cGQuY29uZiBmaWxlLCBhbmQgYWRkIExvYWRNb2R1bGUgbGluZXMuIEZvcgotICogZXhhbXBsZQotICogICBMb2FkTW9kdWxlICBzdGF0dXNfbW9kdWxlICAgbW9kdWxlcy9tb2Rfc3RhdHVzLnNvCi0gKgotICogVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBtb2R1bGUncyBzdHJ1Y3R1cmUgbmFtZSAobG9vayBhdCB0aGUgZW5kIG9mIHRoZQotICogbW9kdWxlIHNvdXJjZSB0byBmaW5kIHRoaXMpLiBUaGUgc2Vjb25kIG9wdGlvbiBpcyB0aGUgcGF0aCB0byB0aGUgbW9kdWxlCi0gKiBmaWxlLCByZWxhdGl2ZSB0byB0aGUgc2VydmVyIHJvb3QuICBQdXQgdGhlc2UgZGlyZWN0aXZlcyByaWdodCBhdCB0aGUgdG9wCi0gKiBvZiB5b3VyIGh0dHBkLmNvbmYgZmlsZS4KLSAqCi0gKiBOb3cgeW91IGNhbiBzdGFydCBBcGFjaGUuIEEgbWVzc2FnZSB3aWxsIGJlIGxvZ2dlZCBhdCAiZGVidWciIGxldmVsIHRvIHlvdXIKLSAqIGVycm9yX2xvZyB0byBjb25maXJtIHRoYXQgdGhlIG1vZHVsZShzKSBhcmUgbG9hZGVkICh1c2UgIkxvZ0xldmVsIGRlYnVnIgotICogZGlyZWN0aXZlIHRvIGdldCB0aGVzZSBsb2cgbWVzc2FnZXMpLgotICoKLSAqIElmIHlvdSBlZGl0IHRoZSBMb2FkTW9kdWxlIGRpcmVjdGl2ZXMgd2hpbGUgdGhlIHNlcnZlciBpcyBsaXZlIHlvdSBjYW4gZ2V0Ci0gKiBBcGFjaGUgdG8gcmUtbG9hZCB0aGUgbW9kdWxlcyBieSBzZW5kaW5nIGl0IGEgSFVQIG9yIFdJTkNIIHNpZ25hbCBhcyBub3JtYWwuCi0gKiBZb3UgY2FuIHVzZSB0aGlzIHRvIGR5bmFtaWNhbGx5IGNoYW5nZSB0aGUgY2FwYWJpbGl0eSBvZiB5b3VyIHNlcnZlcgotICogd2l0aG91dCBicmluZ2luZyBpdCBkb3duLgotICoKLSAqIEJlY2F1c2UgY3VycmVudGx5IHRoZXJlIGlzIG9ubHkgbGltaXRlZCBidWlsdGluIHN1cHBvcnQgaW4gdGhlIENvbmZpZ3VyZQotICogc2NyaXB0IGZvciBjcmVhdGluZyB0aGUgc2hhcmVkIGxpYnJhcnkgZmlsZXMgKGAuc28nKSwgcGxlYXNlIGNvbnN1bHQgeW91cgotICogdmVuZG9ycyBjYygxKSwgbGQoMSkgYW5kIGRsb3BlbigzKSBtYW5wYWdlcyB0byBmaW5kIG91dCB0aGUgYXBwcm9wcmlhdGUKLSAqIGNvbXBpbGVyIGFuZCBsaW5rZXIgZmxhZ3MgYW5kIGluc2VydCB0aGVtIG1hbnVhbGx5IGludG8gdGhlIENvbmZpZ3VyYXRpb24KLSAqIGZpbGUgdW5kZXIgQ0ZMQUdTX1NITElCLCBMREZMQUdTX1NITElCIGFuZCBMREZMQUdTX1NITElCX0VYUE9SVC4KLSAqCi0gKiBJZiB5b3Ugc3RpbGwgaGF2ZSBwcm9ibGVtcyBmaWd1cmluZyBvdXQgdGhlIGZsYWdzIGJvdGggdHJ5IHRoZSBwYXBlcgotICogICAgIGh0dHA6Ly9kZXZlbG9wZXIubmV0c2NhcGUuY29tL2xpYnJhcnkvZG9jdW1lbnRhdGlvbi9lbnRlcnByaXNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC91bml4L3N2cnBsdWcuaHRtIzEwMTM4MDcKLSAqIG9yIGluc3RhbGwgYSBQZXJsIDUgaW50ZXJwcmV0ZXIgb24geW91ciBwbGF0Zm9ybSBhbmQgdGhlbiBydW4gdGhlIGNvbW1hbmQKLSAqCi0gKiAgICAgJCBwZXJsIC1WOnVzZWRsIC1WOmNjZGxmbGFncyAtVjpjY2NkbGZsYWdzIC1WOmxkZGxmbGFncwotICoKLSAqIFRoaXMgZ2l2ZXMgeW91IHdoYXQgdHlwZSBvZiBkeW5hbWljIGxvYWRpbmcgUGVybCA1IHVzZXMgb24geW91ciBwbGF0Zm9ybQotICogYW5kIHdoaWNoIGNvbXBpbGVyIGFuZCBsaW5rZXIgZmxhZ3MgUGVybCA1IHVzZXMgdG8gY3JlYXRlIHRoZSBzaGFyZWQgb2JqZWN0Ci0gKiBmaWxlcy4KLSAqCi0gKiBBbm90aGVyIGxvY2F0aW9uIHdoZXJlIHlvdSBjYW4gZmluZCB1c2VmdWwgaGludHMgaXMgdGhlIGBsdGNvbmZpZycgc2NyaXB0Ci0gKiBvZiB0aGUgR05VIGxpYnRvb2wgMS4yIHBhY2thZ2UuIFNlYXJjaCBmb3IgeW91ciBwbGF0Zm9ybSBuYW1lIGluc2lkZSB0aGUKLSAqIHZhcmlvdXMgImNhc2UiIGNvbnN0cnVjdHMuCi0gKgotICovCi0KLQotI2RlZmluZSBDT1JFX1BSSVZBVEUKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIHNvX21vZHVsZTsKLQotCi0vKgotICogU2VydmVyIGNvbmZpZ3VyYXRpb24gdG8ga2VlcCB0cmFjayBvZiBhY3R1YWxseQotICogbG9hZGVkIG1vZHVsZXMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG1vZHVsZSBuYW1lLgotICovCi0KLXR5cGVkZWYgc3RydWN0IG1vZHVsZWluZm8gewotICAgIGNoYXIgKm5hbWU7Ci0gICAgbW9kdWxlICptb2RwOwotfSBtb2R1bGVpbmZvOwotCi10eXBlZGVmIHN0cnVjdCBzb19zZXJ2ZXJfY29uZiB7Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmxvYWRlZF9tb2R1bGVzOwotfSBzb19zZXJ2ZXJfY29uZjsKLQotc3RhdGljIHZvaWQgKnNvX3Njb25mX2NyZWF0ZShhcF9jb250ZXh0X3QgKnAsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgc29fc2VydmVyX2NvbmYgKnNvYzsKLQotICAgIHNvYyA9IChzb19zZXJ2ZXJfY29uZiAqKWFwX3BjYWxsb2MocCwgc2l6ZW9mKHNvX3NlcnZlcl9jb25mKSk7Ci0gICAgc29jLT5sb2FkZWRfbW9kdWxlcyA9IGFwX21ha2VfYXJyYXkocCwgRFlOQU1JQ19NT0RVTEVfTElNSVQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihtb2R1bGVpbmZvKSk7Ci0jaWZuZGVmIE5PX0RMT1BFTgotICAgIGFwX29zX2Rzb19pbml0KCk7Ci0jZW5kaWYKLQotICAgIHJldHVybiAodm9pZCAqKXNvYzsKLX0KLQotI2lmbmRlZiBOT19ETE9QRU4KLQotLyoKLSAqIFRoaXMgaXMgdGhlIGNsZWFudXAgZm9yIGEgbG9hZGVkIHNoYXJlZCBvYmplY3QuIEl0IHVubG9hZHMgdGhlIG1vZHVsZS4KLSAqIFRoaXMgaXMgY2FsbGVkIGFzIGEgY2xlYW51cCBmdW5jdGlvbiBmcm9tIHRoZSBjb3JlLgotICovCi0KLXN0YXRpYyBhcF9zdGF0dXNfdCB1bmxvYWRfbW9kdWxlKG1vZHVsZWluZm8gKm1vZGkpCi17Ci0gICAgLyogb25seSB1bmxvYWQgaWYgbW9kdWxlIGluZm9ybWF0aW9uIGlzIHN0aWxsIGV4aXN0aW5nICovCi0gICAgaWYgKG1vZGktPm1vZHAgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotCi0gICAgLyogcmVtb3ZlIHRoZSBtb2R1bGUgcG9pbnRlciBmcm9tIHRoZSBjb3JlIHN0cnVjdHVyZSAqLwotICAgIGFwX3JlbW92ZV9sb2FkZWRfbW9kdWxlKG1vZGktPm1vZHApOwotCi0gICAgLyogdW5sb2FkIHRoZSBtb2R1bGUgc3BhY2UgaXRzZWxmICovCi0gICAgYXBfb3NfZHNvX3VubG9hZCgoYXBfb3NfZHNvX2hhbmRsZV90KW1vZGktPm1vZHAtPmR5bmFtaWNfbG9hZF9oYW5kbGUpOwotCi0gICAgLyogZGVzdHJveSB0aGUgbW9kdWxlIGluZm9ybWF0aW9uICovCi0gICAgbW9kaS0+bW9kcCA9IE5VTEw7Ci0gICAgbW9kaS0+bmFtZSA9IE5VTEw7Ci0gICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotfQotCi0vKiAKLSAqIFRoaXMgaXMgdGhlIGNsZWFudXAgcm91dGluZSBmb3IgZmlsZXMgbG9hZGVkIGJ5Ci0gKiBsb2FkX2ZpbGUoKS4gVW5mb3J0dW5hdGVseSB3ZSBkb24ndCBrZWVwIGEgcmVjb3JkIG9mIHRoZSBmaWxlbmFtZQotICogdGhhdCB3YXMgbG9hZGVkLCBzbyB3ZSBjYW4ndCByZXBvcnQgdGhlIHVubG9hZCBmb3IgZGVidWcgcHVycG9zZXMKLSAqIG9yIGluY2x1ZGUgdGhlIGZpbGVuYW1lIGluIGVycm9yIG1lc3NhZ2UuCi0gKi8KLQotc3RhdGljIGFwX3N0YXR1c190IHVubG9hZF9maWxlKHZvaWQgKmhhbmRsZSkKLXsKLSAgICBhcF9vc19kc29fdW5sb2FkKChhcF9vc19kc29faGFuZGxlX3QpaGFuZGxlKTsKLSAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci19Ci0KLS8qIAotICogVGhpcyBpcyBjYWxsZWQgZm9yIHRoZSBkaXJlY3RpdmUgTG9hZE1vZHVsZSBhbmQgYWN0dWFsbHkgbG9hZHMKLSAqIGEgc2hhcmVkIG9iamVjdCBmaWxlIGludG8gdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIHNlcnZlciBwcm9jZXNzLgotICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpsb2FkX21vZHVsZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm1vZG5hbWUsIGNoYXIgKmZpbGVuYW1lKQotewotICAgIGFwX29zX2Rzb19oYW5kbGVfdCBtb2RoYW5kbGU7Ci0gICAgbW9kdWxlICptb2RwOwotICAgIGNvbnN0IGNoYXIgKnN6TW9kdWxlRmlsZT1hcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShjbWQtPnBvb2wsIGZpbGVuYW1lKTsKLSAgICBzb19zZXJ2ZXJfY29uZiAqc2NvbmY7Ci0gICAgbW9kdWxlaW5mbyAqbW9kaTsKLSAgICBtb2R1bGVpbmZvICptb2RpZTsKLSAgICBpbnQgaTsKLQotICAgIC8qIAotICAgICAqIGNoZWNrIGZvciBhbHJlYWR5IGV4aXN0aW5nIG1vZHVsZQotICAgICAqIElmIGl0IGFscmVhZHkgZXhpc3RzLCB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8gCi0gICAgICovCi0gICAgc2NvbmYgPSAoc29fc2VydmVyX2NvbmYgKilhcF9nZXRfbW9kdWxlX2NvbmZpZyhjbWQtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb19tb2R1bGUpOwotICAgIG1vZGllID0gKG1vZHVsZWluZm8gKilzY29uZi0+bG9hZGVkX21vZHVsZXMtPmVsdHM7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNjb25mLT5sb2FkZWRfbW9kdWxlcy0+bmVsdHM7IGkrKykgewotICAgICAgICBtb2RpID0gJm1vZGllW2ldOwotICAgICAgICBpZiAobW9kaS0+bmFtZSAhPSBOVUxMICYmIHN0cmNtcChtb2RpLT5uYW1lLCBtb2RuYW1lKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIG1vZGkgPSBhcF9wdXNoX2FycmF5KHNjb25mLT5sb2FkZWRfbW9kdWxlcyk7Ci0gICAgbW9kaS0+bmFtZSA9IG1vZG5hbWU7Ci0KLSAgICAvKgotICAgICAqIExvYWQgdGhlIGZpbGUgaW50byB0aGUgQXBhY2hlIGFkZHJlc3Mgc3BhY2UKLSAgICAgKi8KLSAgICBpZiAoIShtb2RoYW5kbGUgPSBhcF9vc19kc29fbG9hZChzek1vZHVsZUZpbGUpKSkgewotCWNvbnN0IGNoYXIgKm15X2Vycm9yID0gYXBfb3NfZHNvX2Vycm9yKCk7Ci0JcmV0dXJuIGFwX3BzdHJjYXQgKGNtZC0+cG9vbCwgIkNhbm5vdCBsb2FkICIsIHN6TW9kdWxlRmlsZSwKLQkJCSIgaW50byBzZXJ2ZXI6ICIsIAotCQkJbXlfZXJyb3IgPyBteV9lcnJvciA6ICIocmVhc29uIHVua25vd24pIiwKLQkJCU5VTEwpOwotICAgIH0KLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfREVCVUd8QVBMT0dfTk9FUlJOTywgMCwgTlVMTCwKLQkJImxvYWRlZCBtb2R1bGUgJXMiLCBtb2RuYW1lKTsKLQotICAgIC8qCi0gICAgICogUmV0cmlldmUgdGhlIHBvaW50ZXIgdG8gdGhlIG1vZHVsZSBzdHJ1Y3R1cmUgdGhyb3VnaCB0aGUgbW9kdWxlIG5hbWU6Ci0gICAgICogRmlyc3Qgd2l0aCB0aGUgaGlkZGVuIHZhcmlhbnQgKHByZWZpeCBgQVBfJykgYW5kIHRoZW4gd2l0aCB0aGUgcGxhaW4KLSAgICAgKiBzeW1ib2wgbmFtZS4KLSAgICAgKi8KLSAgICBpZiAoIShtb2RwID0gKG1vZHVsZSAqKShhcF9vc19kc29fc3ltKG1vZGhhbmRsZSwgbW9kbmFtZSkpKSkgewotCXJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIkNhbid0IGxvY2F0ZSBBUEkgbW9kdWxlIHN0cnVjdHVyZSBgIiwgbW9kbmFtZSwKLQkJICAgICAgICInIGluIGZpbGUgIiwgc3pNb2R1bGVGaWxlLCAiOiAiLCBhcF9vc19kc29fZXJyb3IoKSwgTlVMTCk7Ci0gICAgfQotICAgIG1vZGktPm1vZHAgPSBtb2RwOwotICAgIG1vZHAtPmR5bmFtaWNfbG9hZF9oYW5kbGUgPSAodm9pZCAqKW1vZGhhbmRsZTsKLQotICAgIC8qIAotICAgICAqIE1ha2Ugc3VyZSB0aGUgZm91bmQgbW9kdWxlIHN0cnVjdHVyZSBpcyByZWFsbHkgYSBtb2R1bGUgc3RydWN0dXJlCi0gICAgICogCi0gICAgICovCi0gICAgaWYgKG1vZHAtPm1hZ2ljICE9IE1PRFVMRV9NQUdJQ19DT09LSUUpIHsKLSAgICAgICAgcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiQVBJIG1vZHVsZSBzdHJ1Y3R1cmUgYCIsIG1vZG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICInIGluIGZpbGUgIiwgc3pNb2R1bGVGaWxlLCAiIGlzIGdhcmJsZWQgLSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiBwZXJoYXBzIHRoaXMgaXMgbm90IGFuIEFwYWNoZSBtb2R1bGUgRFNPPyIsIE5VTEwpOwotICAgIH0KLQotICAgIC8qIAotICAgICAqIEFkZCB0aGlzIG1vZHVsZSB0byB0aGUgQXBhY2hlIGNvcmUgc3RydWN0dXJlcwotICAgICAqLwotICAgIGFwX2FkZF9sb2FkZWRfbW9kdWxlKG1vZHApOwotCi0gICAgLyogCi0gICAgICogUmVnaXN0ZXIgYSBjbGVhbnVwIGluIHRoZSBjb25maWcgYXBfY29udGV4dF90IChub3JtYWxseSBwY29uZikuIFdoZW4KLSAgICAgKiB3ZSBkbyBhIHJlc3RhcnQgKG9yIHNodXRkb3duKSB0aGlzIGNsZWFudXAgd2lsbCBjYXVzZSB0aGUKLSAgICAgKiBzaGFyZWQgb2JqZWN0IHRvIGJlIHVubG9hZGVkLgotICAgICAqLwotICAgIGFwX3JlZ2lzdGVyX2NsZWFudXAoY21kLT5wb29sLCBtb2RpLCAKLQkJICAgICAoYXBfc3RhdHVzX3QgKCopKHZvaWQqKSl1bmxvYWRfbW9kdWxlLCBhcF9udWxsX2NsZWFudXApOwotCi0gICAgLyogCi0gICAgICogRmluYWxseSB3ZSBuZWVkIHRvIHJ1biB0aGUgY29uZmlndXJhdGlvbiBwcm9jZXNzIGZvciB0aGUgbW9kdWxlCi0gICAgICovCi0gICAgYXBfc2luZ2xlX21vZHVsZV9jb25maWd1cmUoY21kLT5wb29sLCBjbWQtPnNlcnZlciwgbW9kcCk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogCi0gKiBUaGlzIGltcGxlbWVudHMgdGhlIExvYWRGaWxlIGRpcmVjdGl2ZSBhbmQgbG9hZHMgYW4gYXJiaXRyYXJ5Ci0gKiBzaGFyZWQgb2JqZWN0IGZpbGUgaW50byB0aGUgYWRyZXNzIHNwYWNlIG9mIHRoZSBzZXJ2ZXIgcHJvY2Vzcy4KLSAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqbG9hZF9maWxlKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgYXBfb3NfZHNvX2hhbmRsZV90IGhhbmRsZTsKLSAgICBjb25zdCBjaGFyICpmaWxlOwotCi0gICAgZmlsZSA9IGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKGNtZC0+cG9vbCwgZmlsZW5hbWUpOwotICAgIAotICAgIGlmICghKGhhbmRsZSA9IGFwX29zX2Rzb19sb2FkKGZpbGUpKSkgewotCWNvbnN0IGNoYXIgKm15X2Vycm9yID0gYXBfb3NfZHNvX2Vycm9yKCk7Ci0JcmV0dXJuIGFwX3BzdHJjYXQgKGNtZC0+cG9vbCwgIkNhbm5vdCBsb2FkICIsIGZpbGVuYW1lLCAKLQkJCSIgaW50byBzZXJ2ZXI6IiwgCi0JCQlteV9lcnJvciA/IG15X2Vycm9yIDogIihyZWFzb24gdW5rbm93bikiLAotCQkJTlVMTCk7Ci0gICAgfQotICAgIAotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19ERUJVR3xBUExPR19OT0VSUk5PLCAwLCBOVUxMLAotCQkibG9hZGVkIGZpbGUgJXMiLCBmaWxlbmFtZSk7Ci0KLSAgICBhcF9yZWdpc3Rlcl9jbGVhbnVwKGNtZC0+cG9vbCwgKHZvaWQgKiloYW5kbGUsIHVubG9hZF9maWxlLCBhcF9udWxsX2NsZWFudXApOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNlbHNlIC8qIG5vdCBOT19ETE9QRU4gKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKmxvYWRfZmlsZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmZpbGVuYW1lKQotewotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICJXQVJOSU5HOiBMb2FkRmlsZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmxvYWRfbW9kdWxlKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgCi0JICAgICAgICAgICAgICAgICAgICAgICBjaGFyICptb2RuYW1lLCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAiV0FSTklORzogTG9hZE1vZHVsZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotI2VuZGlmIC8qIE5PX0RMT1BFTiAqLwotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgc29fY21kc1tdID0gewotICAgIHsgIkxvYWRNb2R1bGUiLCBsb2FkX21vZHVsZSwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMiwKLSAgICAgICJhIG1vZHVsZSBuYW1lIGFuZCB0aGUgbmFtZSBvZiBhIHNoYXJlZCBvYmplY3QgZmlsZSB0byBsb2FkIGl0IGZyb20ifSwKLSAgICB7ICJMb2FkRmlsZSIsIGxvYWRfZmlsZSwgTlVMTCwgUlNSQ19DT05GLCBJVEVSQVRFLAotICAgICAgInNoYXJlZCBvYmplY3QgZmlsZSBvciBsaWJyYXJ5IHRvIGxvYWQgaW50byB0aGUgc2VydmVyIGF0IHJ1bnRpbWUifSwKLSAgICB7IE5VTEwgfQotfTsKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIHNvX21vZHVsZSA9IHsKLSAgIFNUQU5EQVJEMjBfTU9EVUxFX1NUVUZGLAotICAgTlVMTCwJCQkvKiBjcmVhdGUgcGVyLWRpciBjb25maWcgKi8KLSAgIE5VTEwsCQkJLyogbWVyZ2UgcGVyLWRpciBjb25maWcgKi8KLSAgIHNvX3Njb25mX2NyZWF0ZSwJCS8qIHNlcnZlciBjb25maWcgKi8KLSAgIE5VTEwsCQkJLyogbWVyZ2Ugc2VydmVyIGNvbmZpZyAqLwotICAgc29fY21kcywJCQkvKiBjb21tYW5kIGFwX3RhYmxlX3QgKi8KLSAgIE5VTEwsCQkJLyogaGFuZGxlcnMgKi8KLSAgIE5VTEwJCQkJLyogcmVnaXN0ZXIgaG9va3MgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvbW9kX3NwZWxpbmcuYyBiL21vZHVsZXMvbWFwcGVycy9tb2Rfc3BlbGluZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWQ4YzAwLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWFwcGVycy9tb2Rfc3BlbGluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTY0ICswLDAgQEAKLSNkZWZpbmUgV0FOVF9CQVNFTkFNRV9NQVRDSAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJhcHJfZmlsZV9pby5oIgotCi0vKiBtb2Rfc3BlbGluZy5jIC0gYnkgQWxleGVpIEtvc3V0IDxha29zdXRAb3JnYW5pYy5jb20+IEp1bmUsIDE5OTYKLSAqCi0gKiBUaGlzIG1vZHVsZSBpcyB0cmFuc3BhcmVudCwgYW5kIHNpbXBsZS4gSXQgYXR0ZW1wdHMgdG8gY29ycmVjdAotICogbWlzc3BlbGxpbmdzIG9mIFVSTHMgdGhhdCB1c2VycyBtaWdodCBoYXZlIGVudGVyZWQsIG5hbWVseSBieSBjaGVja2luZwotICogY2FwaXRhbGl6YXRpb25zLiBJZiBpdCBmaW5kcyBhIG1hdGNoLCBpdCBzZW5kcyBhIHJlZGlyZWN0LgotICoKLSAqIDA4LUF1Zy0xOTk3IDxNYXJ0aW4uS3JhZW1lckBNY2guU05JLkRlPgotICogbyBVcGdyYWRlZCBtb2R1bGUgaW50ZXJmYWNlIHRvIGFwYWNoZV8xLjNhMi1kZXYgQVBJIChtb3JlIE5VTEwncyBpbgotICogICBzcGVsaW5nX21vZHVsZSkuCi0gKiBvIEludGVncmF0ZWQgdGNzaCdzICJzcGVsbGluZyBjb3JyZWN0aW9uIiByb3V0aW5lIHdoaWNoIGFsbG93cyBvbmUKLSAqICAgbWlzc3BlbGxpbmcgKGNoYXJhY3RlciBpbnNlcnRpb24vb21pc3Npb24vdHlwby90cmFuc3Bvc2l0aW9uKS4KLSAqICAgUmV3cm90ZSBpdCB0byBpZ25vcmUgY2FzZSBhcyB3ZWxsLiBUaGlzIG91Z2h0IHRvIGNhdGNoIHRoZSBtYWpvcml0eQotICogICBvZiBtaXNzcGVsbGVkIHJlcXVlc3RzLgotICogbyBDb21tZW50ZWQgb3V0IHRoZSBzZWNvbmQgcGFzcyB3aGVyZSBmaWxlcycgc3VmZml4ZXMgYXJlIHN0cmlwcGVkLgotICogICBHaXZlbiB0aGUgYmV0dGVyIGhpdCByYXRlIG9mIHRoZSBmaXJzdCBwYXNzLCB0aGlzIHJhdGhlciB1Z2x5Ci0gKiAgIChyZXF1ZXN0IGluZGV4Lmh0bWwsIHJlY2VpdmUgaW5kZXguZGIgPyE/ISkgc29sdXRpb24gY2FuIGJlCi0gKiAgIG9taXR0ZWQuCi0gKiBvIHdyb3RlIGEgImtpbmQgb2YiIGh0bWwgcGFnZSBmb3IgbW9kX3NwZWxpbmcKLSAqCi0gKiBBY3RpdmF0ZSBpdCB3aXRoICJDaGVja1NwZWxsaW5nIE9uIgotICovCi0KLU1PRFVMRV9WQVJfRVhQT1JUIG1vZHVsZSBzcGVsaW5nX21vZHVsZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCBlbmFibGVkOwotfSBzcGNvbmZpZzsKLQotLyoKLSAqIENyZWF0ZSBhIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMgdG8gdGhpcyBtb2R1bGUgZm9yIGEgc2VydmVyIG9yIGRpcmVjdG9yeQotICogbG9jYXRpb24sIGFuZCBmaWxsIGl0IHdpdGggdGhlIGRlZmF1bHQgc2V0dGluZ3MuCi0gKgotICogVGhlIEFQSSBzYXlzIHRoYXQgaW4gdGhlIGFic2VuY2Ugb2YgYSBtZXJnZSBmdW5jdGlvbiwgdGhlIHJlY29yZCBmb3IgdGhlCi0gKiBjbG9zZXN0IGFuY2VzdG9yIGlzIHVzZWQgZXhjbHVzaXZlbHkuICBUaGF0J3Mgd2hhdCB3ZSB3YW50LCBzbyB3ZSBkb24ndAotICogYm90aGVyIHRvIGhhdmUgc3VjaCBhIGZ1bmN0aW9uLgotICovCi0KLXN0YXRpYyB2b2lkICpta2NvbmZpZyhhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgc3Bjb25maWcgKmNmZyA9IGFwX3BjYWxsb2MocCwgc2l6ZW9mKHNwY29uZmlnKSk7Ci0KLSAgICBjZmctPmVuYWJsZWQgPSAwOwotICAgIHJldHVybiBjZmc7Ci19Ci0KLS8qCi0gKiBSZXNwb25kIHRvIGEgY2FsbGJhY2sgdG8gY3JlYXRlIGNvbmZpZ3VyYXRpb24gcmVjb3JkIGZvciBhIHNlcnZlciBvcgotICogdmhvc3QgZW52aXJvbm1lbnQuCi0gKi8KLXN0YXRpYyB2b2lkICpjcmVhdGVfbWNvbmZpZ19mb3Jfc2VydmVyKGFwX2NvbnRleHRfdCAqcCwgc2VydmVyX3JlYyAqcykKLXsKLSAgICByZXR1cm4gbWtjb25maWcocCk7Ci19Ci0KLS8qCi0gKiBSZXNwb25kIHRvIGEgY2FsbGJhY2sgdG8gY3JlYXRlIGEgY29uZmlnIHJlY29yZCBmb3IgYSBzcGVjaWZpYyBkaXJlY3RvcnkuCi0gKi8KLXN0YXRpYyB2b2lkICpjcmVhdGVfbWNvbmZpZ19mb3JfZGlyZWN0b3J5KGFwX2NvbnRleHRfdCAqcCwgY2hhciAqZGlyKQotewotICAgIHJldHVybiBta2NvbmZpZyhwKTsKLX0KLQotLyoKLSAqIEhhbmRsZXIgZm9yIHRoZSBDaGVja1NwZWxsaW5nIGRpcmVjdGl2ZSwgd2hpY2ggaXMgRkxBRy4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9zcGVsaW5nKGNtZF9wYXJtcyAqY21kLCB2b2lkICptY29uZmlnLCBpbnQgYXJnKQotewotICAgIHNwY29uZmlnICpjZmcgPSAoc3Bjb25maWcgKikgbWNvbmZpZzsKLQotICAgIGNmZy0+ZW5hYmxlZCA9IGFyZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoKLSAqIERlZmluZSB0aGUgZGlyZWN0aXZlcyBzcGVjaWZpYyB0byB0aGlzIG1vZHVsZS4gIFRoaXMgc3RydWN0dXJlIGlzIHJlZmVyZW5jZWQKLSAqIGxhdGVyIGJ5IHRoZSAnbW9kdWxlJyBzdHJ1Y3R1cmUuCi0gKi8KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBzcGVsaW5nX2NtZHNbXSA9Ci17Ci0gICAgeyAiQ2hlY2tTcGVsbGluZyIsIHNldF9zcGVsaW5nLCBOVUxMLCBPUl9PUFRJT05TLCBGTEFHLAotICAgICAgIndoZXRoZXIgb3Igbm90IHRvIGZpeCBtaXNjYXBpdGFsaXplZC9taXNzcGVsbGVkIHJlcXVlc3RzIiB9LAotICAgIHsgTlVMTCB9Ci19OwotCi10eXBlZGVmIGVudW0gewotICAgIFNQX0lERU5USUNBTCA9IDAsCi0gICAgU1BfTUlTQ0FQSVRBTElaRUQgPSAxLAotICAgIFNQX1RSQU5TUE9TSVRJT04gPSAyLAotICAgIFNQX01JU1NJTkdDSEFSID0gMywKLSAgICBTUF9FWFRSQUNIQVIgPSA0LAotICAgIFNQX1NJTVBMRVRZUE8gPSA1LAotICAgIFNQX1ZFUllESUZGRVJFTlQgPSA2Ci19IHNwX3JlYXNvbjsKLQotc3RhdGljIGNvbnN0IGNoYXIgKnNwX3JlYXNvbl9zdHJbXSA9Ci17Ci0gICAgImlkZW50aWNhbCIsCi0gICAgIm1pc2NhcGl0YWxpemVkIiwKLSAgICAidHJhbnNwb3NlZCBjaGFyYWN0ZXJzIiwKLSAgICAiY2hhcmFjdGVyIG1pc3NpbmciLAotICAgICJleHRyYSBjaGFyYWN0ZXIiLAotICAgICJtaXN0eXBlZCBjaGFyYWN0ZXIiLAotICAgICJjb21tb24gYmFzZW5hbWUiLAotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgc3BfcmVhc29uIHF1YWxpdHk7Ci19IG1pc3NwZWxsZWRfZmlsZTsKLQotLyoKLSAqIHNwZGlzdCgpIGlzIHRha2VuIGZyb20gS2VybmlnaGFuICYgUGlrZSwKLSAqICBfVGhlX1VOSVhfUHJvZ3JhbW1pbmdfRW52aXJvbm1lbnRfCi0gKiBhbmQgYWRhcHRlZCBzb21ld2hhdCB0byBjb3JyZXNwb25kIGJldHRlciB0byBwc3ljaG9sb2dpY2FsIHJlYWxpdHkuCi0gKiAoTm90ZSB0aGUgY2hhbmdlcyB0byB0aGUgcmV0dXJuIHZhbHVlcykKLSAqCi0gKiBBY2NvcmRpbmcgdG8gUG9sbG9jayBhbmQgWmFtb3JhLCBDQUNNIEFwcmlsIDE5ODQgKFYuIDI3LCBOby4gNCksCi0gKiBwYWdlIDM2MywgdGhlIGNvcnJlY3Qgb3JkZXIgZm9yIHRoaXMgaXM6Ci0gKiBPTUlTU0lPTiA9IFRSQU5TUE9TSVRJT04gPiBJTlNFUlRJT04gPiBTVUJTVElUVVRJT04KLSAqIHRodXMsIGl0IHdhcyBleGFjdGx5IGJhY2t3YXJkcyBpbiB0aGUgb2xkIHZlcnNpb24uIC0tIFBXUAotICoKLSAqIFRoaXMgcm91dGluZSB3YXMgdGFrZW4gb3V0IG9mIHRjc2gncyBzcGVsbGluZyBjb3JyZWN0aW9uIGNvZGUKLSAqICh0Y3NoLTYuMDcuMDQpIGFuZCByZS1jb252ZXJ0ZWQgdG8gYXBhY2hlIGRhdGEgdHlwZXMgKCJjaGFyIiB0eXBlCi0gKiBpbnN0ZWFkIG9mIHRjc2gncyBOTFMnZWQgIkNoYXIiKS4gUGx1cyBpdCBub3cgaWdub3JlcyB0aGUgY2FzZQotICogZHVyaW5nIGNvbXBhcmlzb25zLCBzbyBpcyBhICJhcHByb3hpbWF0ZSBzdHJjYXNlY21wKCkiLgotICogTk9URSB0aGF0IGlzIHN0aWxsIGFsbG93cyBvbmx5IF9vbmVfIHJlYWwgInR5cG8iLAotICogaXQgZG9lcyBOT1QgdHJ5IHRvIGNvcnJlY3QgbXVsdGlwbGUgZXJyb3JzLgotICovCi0KLXN0YXRpYyBzcF9yZWFzb24gc3BkaXN0KGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnQpCi17Ci0gICAgZm9yICg7IGFwX3RvbG93ZXIoKnMpID09IGFwX3RvbG93ZXIoKnQpOyB0KyssIHMrKykgewotICAgICAgICBpZiAoKnQgPT0gJ1wwJykgewotICAgICAgICAgICAgcmV0dXJuIFNQX01JU0NBUElUQUxJWkVEOyAgIC8qIGV4YWN0IG1hdGNoIChzYW5zIGNhc2UpICovCi0JfQotICAgIH0KLSAgICBpZiAoKnMpIHsKLSAgICAgICAgaWYgKCp0KSB7Ci0gICAgICAgICAgICBpZiAoc1sxXSAmJiB0WzFdICYmIGFwX3RvbG93ZXIoKnMpID09IGFwX3RvbG93ZXIodFsxXSkKLQkJJiYgYXBfdG9sb3dlcigqdCkgPT0gYXBfdG9sb3dlcihzWzFdKQotCQkmJiBzdHJjYXNlY21wKHMgKyAyLCB0ICsgMikgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTUF9UUkFOU1BPU0lUSU9OOyAgICAgICAgLyogdHJhbnNwb3NpdGlvbiAqLwotCSAgICB9Ci0gICAgICAgICAgICBpZiAoc3RyY2FzZWNtcChzICsgMSwgdCArIDEpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU1BfU0lNUExFVFlQTzsgICAvKiAxIGNoYXIgbWlzbWF0Y2ggKi8KLQkgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzdHJjYXNlY21wKHMgKyAxLCB0KSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gU1BfRVhUUkFDSEFSOyAgICAgICAgLyogZXh0cmEgY2hhcmFjdGVyICovCi0JfQotICAgIH0KLSAgICBpZiAoKnQgJiYgc3RyY2FzZWNtcChzLCB0ICsgMSkgPT0gMCkgewotICAgICAgICByZXR1cm4gU1BfTUlTU0lOR0NIQVI7ICAvKiBtaXNzaW5nIGNoYXJhY3RlciAqLwotICAgIH0KLSAgICByZXR1cm4gU1BfVkVSWURJRkZFUkVOVDsgICAgLyogZGlzdGFuY2UgdG9vIGxhcmdlIHRvIGZpeC4gKi8KLX0KLQotc3RhdGljIGludCBzb3J0X2J5X3F1YWxpdHkoY29uc3Qgdm9pZCAqbGVmdCwgY29uc3Qgdm9pZCAqcml0ZSkKLXsKLSAgICByZXR1cm4gKGludCkgKCgobWlzc3BlbGxlZF9maWxlICopIGxlZnQpLT5xdWFsaXR5KQotICAgICAgICAtIChpbnQpICgoKG1pc3NwZWxsZWRfZmlsZSAqKSByaXRlKS0+cXVhbGl0eSk7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2tfc3BlbGluZyhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBzcGNvbmZpZyAqY2ZnOwotICAgIGNoYXIgKmdvb2QsICpiYWQsICpwb3N0Z29vZCwgKnVybCwgKmZuYW1lOwotICAgIGludCBmaWxvYywgZG90bG9jLCB1cmxlbiwgcGdsZW47Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmNhbmRpZGF0ZXMgPSBOVUxMOwotICAgIGFwX2Rpcl90ICAgICAgICAgICpkaXI7Ci0KLSAgICBjZmcgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywgJnNwZWxpbmdfbW9kdWxlKTsKLSAgICBpZiAoIWNmZy0+ZW5hYmxlZCkgewotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgLyogV2Ugb25seSB3YW50IHRvIHdvcnJ5IGFib3V0IEdFVHMgKi8KLSAgICBpZiAoci0+bWV0aG9kX251bWJlciAhPSBNX0dFVCkgewotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgLyogV2UndmUgYWxyZWFkeSBnb3QgYSBmaWxlIG9mIHNvbWUga2luZCBvciBhbm90aGVyICovCi0gICAgaWYgKHItPnByb3h5cmVxIHx8IChyLT5maW5mby5wcm90ZWN0aW9uICE9IDApKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICAvKiBUaGlzIGlzIGEgc3ViIHJlcXVlc3QgLSBkb24ndCBtZXNzIHdpdGggaXQgKi8KLSAgICBpZiAoci0+bWFpbikgewotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUaGUgcmVxdWVzdCBzaG91bGQgZW5kIHVwIGxvb2tpbmcgbGlrZSB0aGlzOgotICAgICAqIHItPnVyaTogL2NvcnJlY3QtdXJsL21pc3BlbGxpbmcvbW9yZQotICAgICAqIHItPmZpbGVuYW1lOiAvY29ycmVjdC1maWxlL21pc3BlbGxpbmcgci0+cGF0aF9pbmZvOiAvbW9yZQotICAgICAqCi0gICAgICogU28gd2UgZG8gdGhpcyBpbiBzdGVwcy4gRmlyc3QgYnJlYWsgci0+ZmlsZW5hbWUgaW50byB0d28gcGllY2VzCi0gICAgICovCi0KLSAgICBmaWxvYyA9IGFwX3JpbmQoci0+ZmlsZW5hbWUsICcvJyk7Ci0gICAgLyoKLSAgICAgKiBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGUgcmVxdWVzdCBkb2Vzbid0IGNvbnRhaW4gYSBzbGFzaCwgb3IKLSAgICAgKiByZXF1ZXN0cyAiLyIgCi0gICAgICovCi0gICAgaWYgKGZpbG9jID09IC0xIHx8IHN0cmNtcChyLT51cmksICIvIikgPT0gMCkgewotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgLyogZ29vZCA9IC9jb3JyZWN0LWZpbGUgKi8KLSAgICBnb29kID0gYXBfcHN0cm5kdXAoci0+cG9vbCwgci0+ZmlsZW5hbWUsIGZpbG9jKTsKLSAgICAvKiBiYWQgPSBtaXNwZWxsaW5nICovCi0gICAgYmFkID0gYXBfcHN0cmR1cChyLT5wb29sLCByLT5maWxlbmFtZSArIGZpbG9jICsgMSk7Ci0gICAgLyogcG9zdGdvb2QgPSBtaXNwZWxsaW5nL21vcmUgKi8KLSAgICBwb3N0Z29vZCA9IGFwX3BzdHJjYXQoci0+cG9vbCwgYmFkLCByLT5wYXRoX2luZm8sIE5VTEwpOwotCi0gICAgdXJsZW4gPSBzdHJsZW4oci0+dXJpKTsKLSAgICBwZ2xlbiA9IHN0cmxlbihwb3N0Z29vZCk7Ci0KLSAgICAvKiBDaGVjayB0byBzZWUgaWYgdGhlIFVSTCBwaWVjZXMgYWRkIHVwICovCi0gICAgaWYgKHN0cmNtcChwb3N0Z29vZCwgci0+dXJpICsgKHVybGVuIC0gcGdsZW4pKSkgewotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgLyogdXJsID0gL2NvcnJlY3QtdXJsICovCi0gICAgdXJsID0gYXBfcHN0cm5kdXAoci0+cG9vbCwgci0+dXJpLCAodXJsZW4gLSBwZ2xlbikpOwotCi0gICAgLyogTm93IG9wZW4gdGhlIGRpcmVjdG9yeSBhbmQgZG8gb3Vyc2VsdmVzIGEgY2hlY2suLi4gKi8KLSAgICBpZiAoYXBfb3BlbmRpcigmZGlyLCBnb29kLCByLT5wb29sKSAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICAvKiBPb3BzLCBub3QgYSBkaXJlY3RvcnkuLi4gKi8KLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIGNhbmRpZGF0ZXMgPSBhcF9tYWtlX2FycmF5KHItPnBvb2wsIDIsIHNpemVvZihtaXNzcGVsbGVkX2ZpbGUpKTsKLQotICAgIGRvdGxvYyA9IGFwX2luZChiYWQsICcuJyk7Ci0gICAgaWYgKGRvdGxvYyA9PSAtMSkgewotICAgICAgICBkb3Rsb2MgPSBzdHJsZW4oYmFkKTsKLSAgICB9Ci0KLSAgICAvKiBOT1RFOiBhcF9nZXRfZGlyX2ZpbGVuYW1lKCkgZmlsbHMgZm5hbWUgd2l0aCBhIGFwX3BhbGxvYygpZWQgY29weQotICAgICAqIG9mIHRoZSBmb3VuZCBkaXJlY3RvcnkgbmFtZSBhbHJlYWR5LiBXZSBkb24ndCBuZWVkIHRvIGNvcHkgaXQuCi0gICAgICogQEBAOiBDb3B5aW5nICpBTEwqIGZvdW5kIGZpbGUgbmFtZXMgaXMgd2FzdGVkIGVuZXJneSAoYW5kIG1lbW9yeSkhCi0gICAgICovCi0gICAgd2hpbGUgKGFwX3JlYWRkaXIoZGlyKSA9PSBBUFJfU1VDQ0VTUyAmJgotCSAgIGFwX2dldF9kaXJfZmlsZW5hbWUoJmZuYW1lLCBkaXIpID09IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIHNwX3JlYXNvbiBxOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIElmIHdlIGVuZCB1cCB3aXRoIGEgImZpeGVkIiBVUkwgd2hpY2ggaXMgaWRlbnRpY2FsIHRvIHRoZQotICAgICAgICAgKiByZXF1ZXN0ZWQgb25lLCB3ZSBtdXN0IGhhdmUgZm91bmQgYSBicm9rZW4gc3ltbGluayBvciBzb21lIHN1Y2guCi0gICAgICAgICAqIERvIF9ub3RfIHRyeSB0byByZWRpcmVjdCB0aGlzLCBpdCBjYXVzZXMgYSBsb29wIQotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHN0cmNtcChiYWQsIGZuYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICBhcF9jbG9zZWRpcihkaXIpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogbWlzY2FwaXRhbGl6YXRpb24gZXJyb3JzIGFyZSBjaGVja2VkIGZpcnN0IChsaWtlLCBlLmcuLCBsb3dlciBjYXNlCi0gICAgICAgICAqIGZpbGUsIHVwcGVyIGNhc2UgcmVxdWVzdCkKLSAgICAgICAgICovCi0gICAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAoYmFkLCBmbmFtZSkgPT0gMCkgewotICAgICAgICAgICAgbWlzc3BlbGxlZF9maWxlICpzcF9uZXc7Ci0KLQkgICAgc3BfbmV3ID0gKG1pc3NwZWxsZWRfZmlsZSAqKSBhcF9wdXNoX2FycmF5KGNhbmRpZGF0ZXMpOwotICAgICAgICAgICAgc3BfbmV3LT5uYW1lID0gZm5hbWU7Ci0gICAgICAgICAgICBzcF9uZXctPnF1YWxpdHkgPSBTUF9NSVNDQVBJVEFMSVpFRDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIHNpbXBsZSB0eXBpbmcgZXJyb3JzIGFyZSBjaGVja2VkIG5leHQgKGxpa2UsIGUuZy4sCi0gICAgICAgICAqIG1pc3NpbmcvZXh0cmEvdHJhbnNwb3NlZCBjaGFyKQotICAgICAgICAgKi8KLSAgICAgICAgZWxzZSBpZiAoKHEgPSBzcGRpc3QoYmFkLCBmbmFtZSkpICE9IFNQX1ZFUllESUZGRVJFTlQpIHsKLSAgICAgICAgICAgIG1pc3NwZWxsZWRfZmlsZSAqc3BfbmV3OwotCi0JICAgIHNwX25ldyA9IChtaXNzcGVsbGVkX2ZpbGUgKikgYXBfcHVzaF9hcnJheShjYW5kaWRhdGVzKTsKLSAgICAgICAgICAgIHNwX25ldy0+bmFtZSA9IGZuYW1lOwotICAgICAgICAgICAgc3BfbmV3LT5xdWFsaXR5ID0gcTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0JICogVGhlIHNwZGlzdCgpIHNob3VsZCBoYXZlIGZvdW5kIHRoZSBtYWpvcml0eSBvZiB0aGUgbWlzc3BlbGxlZAotCSAqIHJlcXVlc3RzLiAgSXQgaXMgb2YgcXVlc3Rpb25hYmxlIHVzZSB0byBjb250aW51ZSBsb29raW5nIGZvcgotCSAqIGZpbGVzIHdpdGggdGhlIHNhbWUgYmFzZSBuYW1lLCBidXQgcG90ZW50aWFsbHkgb2YgdG90YWxseSB3cm9uZwotCSAqIHR5cGUgKGluZGV4Lmh0bWwgPC0+IGluZGV4LmRiKS4KLQkgKiBJIHdvdWxkIHByb3Bvc2UgdG8gbm90IHNldCB0aGUgV0FOVF9CQVNFTkFNRV9NQVRDSCBkZWZpbmUuCi0gICAgICAgICAqICAgICAgMDgtQXVnLTE5OTcgPE1hcnRpbi5LcmFlbWVyQE1jaC5TTkkuRGU+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEhvd2V2ZXIsIEFsZXhlaSByZXBsaWVkIGdpdmluZyBzb21lIHJlYXNvbnMgdG8gYWRkIGl0IGFueXdheToKLSAgICAgICAgICogPiBPaCwgYnkgdGhlIHdheSwgSSByZW1lbWJlcmVkIHdoeSBoYXZpbmcgdGhlCi0gICAgICAgICAqID4gZXh0ZW5zaW9uLXN0cmlwcGluZy1hbmQtbWF0Y2hpbmcgc3R1ZmYgaXMgYSBnb29kIGlkZWE6Ci0gICAgICAgICAqID4KLSAgICAgICAgICogPiBJZiB5b3UncmUgdXNpbmcgTXVsdGlWaWV3cywgYW5kIGhhdmUgYSBmaWxlIG5hbWVkIGZvb2Jhci5odG1sLAotCSAqID4gd2hpY2ggeW91IHJlZmVyIHRvIGFzICJmb29iYXIiLCBhbmQgc29tZW9uZSB0cmllZCB0byBhY2Nlc3MKLQkgKiA+ICJGb29iYXIiLCBtb2Rfc3BlbGluZyB3b24ndCBmaW5kIGl0LCBiZWNhdXNlIGl0IHdvbid0IGZpbmQKLQkgKiA+IGFueXRoaW5nIG1hdGNoaW5nIHRoYXQgc3BlbGxpbmcuIFdpdGggdGhlIGV4dGVuc2lvbi1tdW5naW5nLAotCSAqID4gaXQgd291bGQgbG9jYXRlICJmb29iYXIuaHRtbCIuIE5vdCBwZXJmZWN0LCBidXQgSSByYW4gaW50bwotCSAqID4gdGhhdCBwcm9ibGVtIHdoZW4gSSBmaXJzdCB3cm90ZSB0aGUgbW9kdWxlLgotCSAqLwotICAgICAgICBlbHNlIHsKLSNpZmRlZiBXQU5UX0JBU0VOQU1FX01BVENICi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogT2theS4uLiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4gTm93IHdlIHRha2Ugb3V0IHRoZSBoYXJkLWNvcmUKLSAgICAgICAgICAgICAqIHBvd2VyIHRvb2xzLiBUaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyBoZXJlLiBTb21lb25lIG1pZ2h0IGhhdmUKLSAgICAgICAgICAgICAqIGVudGVyZWQgYSB3cm9uZyBleHRlbnNpb24gKC5odG0gaW5zdGVhZCBvZiAuaHRtbCBvciB2aWNlCi0gICAgICAgICAgICAgKiB2ZXJzYSkgb3IgdGhlIGRvY3VtZW50IGNvdWxkIGJlIG5lZ290aWF0ZWQuIEF0IGFueSByYXRlLCBub3cKLSAgICAgICAgICAgICAqIHdlIGp1c3QgY29tcGFyZSBzdHVmZiBiZWZvcmUgdGhlIGZpcnN0IGRvdC4gSWYgaXQgbWF0Y2hlcywgd2UKLSAgICAgICAgICAgICAqIGZpZ3VyZSB3ZSBnb3QgdXMgYSBtYXRjaC4gVGhpcyBjYW4gcmVzdWx0IGluIHdyb25nIHRoaW5ncyBpZgotICAgICAgICAgICAgICogdGhlcmUgYXJlIGZpbGVzIG9mIGRpZmZlcmVudCBjb250ZW50IHR5cGVzIGJ1dCB0aGUgc2FtZSBwcmVmaXgKLSAgICAgICAgICAgICAqIChlLmcuIGZvby5naWYgYW5kIGZvby5odG1sKSBUaGlzIGNvZGUgd2lsbCBwaWNrIHRoZSBmaXJzdCBvbmUKLSAgICAgICAgICAgICAqIGl0IGZpbmRzLiBCZXR0ZXIgdGhhbiBhIE5vdCBGb3VuZCwgdGhvdWdoLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpbnQgZW50bG9jID0gYXBfaW5kKGZuYW1lLCAnLicpOwotICAgICAgICAgICAgaWYgKGVudGxvYyA9PSAtMSkgewotICAgICAgICAgICAgICAgIGVudGxvYyA9IHN0cmxlbihmbmFtZSk7Ci0JICAgIH0KLQotICAgICAgICAgICAgaWYgKChkb3Rsb2MgPT0gZW50bG9jKQotICAgICAgICAgICAgICAgICYmICFzdHJuY2FzZWNtcChiYWQsIGZuYW1lLCBkb3Rsb2MpKSB7Ci0gICAgICAgICAgICAgICAgbWlzc3BlbGxlZF9maWxlICpzcF9uZXc7Ci0KLQkJc3BfbmV3ID0gKG1pc3NwZWxsZWRfZmlsZSAqKSBhcF9wdXNoX2FycmF5KGNhbmRpZGF0ZXMpOwotICAgICAgICAgICAgICAgIHNwX25ldy0+bmFtZSA9IGZuYW1lOwotICAgICAgICAgICAgICAgIHNwX25ldy0+cXVhbGl0eSA9IFNQX1ZFUllESUZGRVJFTlQ7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgfQotICAgIH0KLSAgICBhcF9jbG9zZWRpcihkaXIpOwotCi0gICAgaWYgKGNhbmRpZGF0ZXMtPm5lbHRzICE9IDApIHsKLSAgICAgICAgLyogV293Li4uIHdlIGZvdW5kIHVzIGEgbWlzcGVsbGluZy4gQ29uc3RydWN0IGEgZml4ZWQgdXJsICovCi0gICAgICAgIGNoYXIgKm51cmk7Ci0JY29uc3QgY2hhciAqcmVmOwotICAgICAgICBtaXNzcGVsbGVkX2ZpbGUgKnZhcmlhbnQgPSAobWlzc3BlbGxlZF9maWxlICopIGNhbmRpZGF0ZXMtPmVsdHM7Ci0gICAgICAgIGludCBpOwotCi0gICAgICAgIHJlZiA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiUmVmZXJlciIpOwotCi0gICAgICAgIHFzb3J0KCh2b2lkICopIGNhbmRpZGF0ZXMtPmVsdHMsIGNhbmRpZGF0ZXMtPm5lbHRzLAotICAgICAgICAgICAgICBzaXplb2YobWlzc3BlbGxlZF9maWxlKSwgc29ydF9ieV9xdWFsaXR5KTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDb25kaXRpb25zIGZvciBpbW1lZGlhdGUgcmVkaXJlY3Rpb246IAotICAgICAgICAgKiAgICAgYSkgdGhlIGZpcnN0IGNhbmRpZGF0ZSB3YXMgbm90IGZvdW5kIGJ5IHN0cmlwcGluZyB0aGUgc3VmZml4IAotICAgICAgICAgKiBBTkQgYikgdGhlcmUgZXhpc3RzIG9ubHkgb25lIGNhbmRpZGF0ZSBPUiB0aGUgYmVzdCBtYXRjaCBpcyBub3QKLQkgKiAgICAgICAgYW1iaWd1b3VzCi0gICAgICAgICAqIHRoZW4gcmV0dXJuIGEgcmVkaXJlY3Rpb24gcmlnaHQgYXdheS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICh2YXJpYW50WzBdLnF1YWxpdHkgIT0gU1BfVkVSWURJRkZFUkVOVAotCSAgICAmJiAoY2FuZGlkYXRlcy0+bmVsdHMgPT0gMQotCQl8fCB2YXJpYW50WzBdLnF1YWxpdHkgIT0gdmFyaWFudFsxXS5xdWFsaXR5KSkgewotCi0gICAgICAgICAgICBudXJpID0gYXBfZXNjYXBlX3VyaShyLT5wb29sLCBhcF9wc3RyY2F0KHItPnBvb2wsIHVybCwKLQkJCQkJCSAgICAgdmFyaWFudFswXS5uYW1lLAotCQkJCQkJICAgICByLT5wYXRoX2luZm8sIE5VTEwpKTsKLQkgICAgaWYgKHItPnBhcnNlZF91cmkucXVlcnkpCi0JCW51cmkgPSBhcF9wc3RyY2F0KHItPnBvb2wsIG51cmksICI/Iiwgci0+cGFyc2VkX3VyaS5xdWVyeSwgTlVMTCk7Ci0KLSAgICAgICAgICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJMb2NhdGlvbiIsCi0JCQkgIGFwX2NvbnN0cnVjdF91cmwoci0+cG9vbCwgbnVyaSwgcikpOwotCi0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19JTkZPLCBBUFJfU1VDQ0VTUywKLQkJCSAgciwgCi0JCQkgIHJlZiA/ICJGaXhlZCBzcGVsbGluZzogJXMgdG8gJXMgZnJvbSAlcyIKLQkJCSAgICAgIDogIkZpeGVkIHNwZWxsaW5nOiAlcyB0byAlcyIsCi0JCQkgIHItPnVyaSwgbnVyaSwgcmVmKTsKLQotICAgICAgICAgICAgcmV0dXJuIEhUVFBfTU9WRURfUEVSTUFORU5UTFk7Ci0gICAgICAgIH0KLSAgICAgICAgLyoKLSAgICAgICAgICogT3RoZXJ3aXNlLCBhICJbMzAwXSBNdWx0aXBsZSBDaG9pY2VzIiBsaXN0IHdpdGggdGhlIHZhcmlhbnRzIGlzCi0gICAgICAgICAqIHJldHVybmVkLgotICAgICAgICAgKi8KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhcF9jb250ZXh0X3QgKnA7Ci0gICAgICAgICAgICBhcF90YWJsZV90ICpub3RlczsKLQkgICAgYXBfY29udGV4dF90ICpzdWJfcG9vbDsKLQkgICAgYXBfYXJyYXlfaGVhZGVyX3QgKnQ7Ci0JICAgIGFwX2FycmF5X2hlYWRlcl90ICp2OwotCi0KLSAgICAgICAgICAgIGlmIChyLT5tYWluID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwID0gci0+cG9vbDsKLSAgICAgICAgICAgICAgICBub3RlcyA9IHItPm5vdGVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcCA9IHItPm1haW4tPnBvb2w7Ci0gICAgICAgICAgICAgICAgbm90ZXMgPSByLT5tYWluLT5ub3RlczsKLSAgICAgICAgICAgIH0KLQotCSAgICBpZiAoYXBfY3JlYXRlX2NvbnRleHQoJnN1Yl9wb29sLCBwKSAhPSBBUFJfU1VDQ0VTUykKLQkJcmV0dXJuIERFQ0xJTkVEOwotCi0JICAgIHQgPSBhcF9tYWtlX2FycmF5KHN1Yl9wb29sLCBjYW5kaWRhdGVzLT5uZWx0cyAqIDggKyA4LAotCQkJICAgICAgc2l6ZW9mKGNoYXIgKikpOwotCSAgICB2ID0gYXBfbWFrZV9hcnJheShzdWJfcG9vbCwgY2FuZGlkYXRlcy0+bmVsdHMgKiA1LAotCQkJICAgICAgc2l6ZW9mKGNoYXIgKikpOwotCi0gICAgICAgICAgICAvKiBHZW5lcmF0ZSB0aGUgcmVzcG9uc2UgdGV4dC4gKi8KLQotCSAgICAqKGNvbnN0IGNoYXIgKiopYXBfcHVzaF9hcnJheSh0KSA9Ci0JCQkgICJUaGUgZG9jdW1lbnQgbmFtZSB5b3UgcmVxdWVzdGVkICg8Y29kZT4iOwotCSAgICAqKGNvbnN0IGNoYXIgKiopYXBfcHVzaF9hcnJheSh0KSA9IHItPnVyaTsKLQkgICAgKihjb25zdCBjaGFyICoqKWFwX3B1c2hfYXJyYXkodCkgPQotCQkJICAgIjwvY29kZT4pIGNvdWxkIG5vdCBiZSBmb3VuZCBvbiB0aGlzIHNlcnZlci5cbiIKLQkJCSAgICJIb3dldmVyLCB3ZSBmb3VuZCBkb2N1bWVudHMgd2l0aCBuYW1lcyBzaW1pbGFyICIKLQkJCSAgICJ0byB0aGUgb25lIHlvdSByZXF1ZXN0ZWQuPHA+IgotCQkJICAgIkF2YWlsYWJsZSBkb2N1bWVudHM6XG48dWw+XG4iOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2FuZGlkYXRlcy0+bmVsdHM7ICsraSkgewotCQljaGFyICp2dXJpOwotCQljb25zdCBjaGFyICpyZWFzb247Ci0KLQkJcmVhc29uID0gc3BfcmVhc29uX3N0clsoaW50KSAodmFyaWFudFtpXS5xdWFsaXR5KV07Ci0gICAgICAgICAgICAgICAgLyogVGhlIGZvcm1hdCBpc24ndCB2ZXJ5IG5lYXQuLi4gKi8KLQkJdnVyaSA9IGFwX3BzdHJjYXQoc3ViX3Bvb2wsIHVybCwgdmFyaWFudFtpXS5uYW1lLCByLT5wYXRoX2luZm8sCi0JCQkJICAoci0+cGFyc2VkX3VyaS5xdWVyeSAhPSBOVUxMKSA/ICI/IiA6ICIiLAotCQkJCSAgKHItPnBhcnNlZF91cmkucXVlcnkgIT0gTlVMTCkKLQkJCQkgICAgICA/IHItPnBhcnNlZF91cmkucXVlcnkgOiAiIiwKLQkJCQkgIE5VTEwpOwotCQkqKGNvbnN0IGNoYXIgKiopYXBfcHVzaF9hcnJheSh2KSA9ICJcIiI7Ci0JCSooY29uc3QgY2hhciAqKilhcF9wdXNoX2FycmF5KHYpID0gdnVyaTsKLQkJKihjb25zdCBjaGFyICoqKWFwX3B1c2hfYXJyYXkodikgPSAiXCI7XCIiOwotCQkqKGNvbnN0IGNoYXIgKiopYXBfcHVzaF9hcnJheSh2KSA9IHJlYXNvbjsKLQkJKihjb25zdCBjaGFyICoqKWFwX3B1c2hfYXJyYXkodikgPSAiXCIiOwotCi0JCSooY29uc3QgY2hhciAqKilhcF9wdXNoX2FycmF5KHQpID0gIjxsaT48YSBocmVmPVwiIjsKLQkJKihjb25zdCBjaGFyICoqKWFwX3B1c2hfYXJyYXkodCkgPSB2dXJpOwotCQkqKGNvbnN0IGNoYXIgKiopYXBfcHVzaF9hcnJheSh0KSA9ICJcIj4iOwotCQkqKGNvbnN0IGNoYXIgKiopYXBfcHVzaF9hcnJheSh0KSA9IHZ1cmk7Ci0JCSooY29uc3QgY2hhciAqKilhcF9wdXNoX2FycmF5KHQpID0gIjwvYT4gKCI7Ci0JCSooY29uc3QgY2hhciAqKilhcF9wdXNoX2FycmF5KHQpID0gcmVhc29uOwotCQkqKGNvbnN0IGNoYXIgKiopYXBfcHVzaF9hcnJheSh0KSA9ICIpXG4iOwotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiB3aGVuIHdlIGhhdmUgcHJpbnRlZCB0aGUgImNsb3NlIG1hdGNoZXMiIGFuZCB0aGVyZSBhcmUKLSAgICAgICAgICAgICAgICAgKiBtb3JlICJkaXN0YW50IG1hdGNoZXMiIChtYXRjaGVkIGJ5IHN0cmlwcGluZyB0aGUgc3VmZml4KSwKLSAgICAgICAgICAgICAgICAgKiB0aGVuIHdlIGluc2VydCBhbiBhZGRpdGlvbmFsIHNlcGFyYXRvciB0ZXh0IHRvIHN1Z2dlc3QKLSAgICAgICAgICAgICAgICAgKiB0aGF0IHRoZSB1c2VyIExPT0sgQ0xPU0VMWSB3aGV0aGVyIHRoZXNlIGFyZSByZWFsbHkgdGhlCi0gICAgICAgICAgICAgICAgICogZmlsZXMgc2hlIHdhbnRlZC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoaSA+IDAgJiYgaSA8IGNhbmRpZGF0ZXMtPm5lbHRzIC0gMQotICAgICAgICAgICAgICAgICAgICAmJiB2YXJpYW50W2ldLnF1YWxpdHkgIT0gU1BfVkVSWURJRkZFUkVOVAotICAgICAgICAgICAgICAgICAgICAmJiB2YXJpYW50W2kgKyAxXS5xdWFsaXR5ID09IFNQX1ZFUllESUZGRVJFTlQpIHsKLQkJICAgICooY29uc3QgY2hhciAqKilhcF9wdXNoX2FycmF5KHQpID0gCi0JCQkJICAgIjwvdWw+XG5GdXJ0aGVybW9yZSwgdGhlIGZvbGxvd2luZyByZWxhdGVkICIKLQkJCQkgICAiZG9jdW1lbnRzIHdlcmUgZm91bmQ6XG48dWw+XG4iOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQkgICAgKihjb25zdCBjaGFyICoqKWFwX3B1c2hfYXJyYXkodCkgPSAiPC91bD5cbiI7Ci0KLSAgICAgICAgICAgIC8qIElmIHdlIGtub3cgdGhlcmUgd2FzIGEgcmVmZXJyaW5nIHBhZ2UsIGFkZCBhIG5vdGU6ICovCi0gICAgICAgICAgICBpZiAocmVmICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqKGNvbnN0IGNoYXIgKiopYXBfcHVzaF9hcnJheSh0KSA9Ci0JCQkgICAgICAgIlBsZWFzZSBjb25zaWRlciBpbmZvcm1pbmcgdGhlIG93bmVyIG9mIHRoZSAiCi0JCQkgICAgICAgIjxhIGhyZWY9XCIiOwotICAgICAgICAgICAgICAgICooY29uc3QgY2hhciAqKilhcF9wdXNoX2FycmF5KHQpID0gcmVmOwotICAgICAgICAgICAgICAgICooY29uc3QgY2hhciAqKilhcF9wdXNoX2FycmF5KHQpID0gIlwiPnJlZmVycmluZyBwYWdlPC9hPiAiCi0JCQkgICAgICAgImFib3V0IHRoZSBicm9rZW4gbGluay5cbiI7Ci0JICAgIH0KLQotCi0gICAgICAgICAgICAvKiBQYXNzIG91ciBhcF90YWJsZV90IHRvIGh0dHBfcHJvdG9jb2wuYyAoc2VlIG1vZF9uZWdvdGlhdGlvbik6ICovCi0gICAgICAgICAgICBhcF90YWJsZV9zZXRuKG5vdGVzLCAidmFyaWFudC1saXN0IiwgYXBfYXJyYXlfcHN0cmNhdChwLCB0LCAwKSk7Ci0KLQkgICAgYXBfdGFibGVfbWVyZ2VuKHItPnN1YnByb2Nlc3NfZW52LCAiVkFSSUFOVFMiLAotCQkJICAgIGFwX2FycmF5X3BzdHJjYXQocCwgdiwgJywnKSk7Ci0JICAKLQkgICAgYXBfZGVzdHJveV9wb29sKHN1Yl9wb29sKTsKLQotICAgICAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfSU5GTywgMCwgciwKLQkJCSByZWYgPyAiU3BlbGxpbmcgZml4OiAlczogJWQgY2FuZGlkYXRlcyBmcm9tICVzIgotCQkJICAgICA6ICJTcGVsbGluZyBmaXg6ICVzOiAlZCBjYW5kaWRhdGVzIiwKLQkJCSByLT51cmksIGNhbmRpZGF0ZXMtPm5lbHRzLCByZWYpOwotCi0gICAgICAgICAgICByZXR1cm4gSFRUUF9NVUxUSVBMRV9DSE9JQ0VTOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgdm9pZCByZWdpc3Rlcl9ob29rcyh2b2lkKQotewotICAgIGFwX2hvb2tfZml4dXBzKGNoZWNrX3NwZWxpbmcsTlVMTCxOVUxMLEhPT0tfTEFTVCk7Ci19Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBzcGVsaW5nX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCi0gICAgY3JlYXRlX21jb25maWdfZm9yX2RpcmVjdG9yeSwgIC8qIGNyZWF0ZSBwZXItZGlyIGNvbmZpZyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBwZXItZGlyIGNvbmZpZyAqLwotICAgIGNyZWF0ZV9tY29uZmlnX2Zvcl9zZXJ2ZXIsICAvKiBzZXJ2ZXIgY29uZmlnICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lcmdlIHNlcnZlciBjb25maWcgKi8KLSAgICBzcGVsaW5nX2NtZHMsICAgICAgICAgICAgICAgLyogY29tbWFuZCBhcF90YWJsZV90ICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGhhbmRsZXJzICovCi0gICAgcmVnaXN0ZXJfaG9va3MJCS8qIHJlZ2lzdGVyIGhvb2tzICovCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tYXBwZXJzL21vZF9zcGVsaW5nLmRzcCBiL21vZHVsZXMvbWFwcGVycy9tb2Rfc3BlbGluZy5kc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5OWE3MmYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tYXBwZXJzL21vZF9zcGVsaW5nLmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9IkFwYWNoZU1vZHVsZVNwZWxpbmciIC0gUGFja2FnZSBPd25lcj08ND4KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDUuMDAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMgotCi1DRkc9QXBhY2hlTW9kdWxlU3BlbGluZyAtIFdpbjMyIFJlbGVhc2UKLSFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiQXBhY2hlTW9kdWxlU3BlbGluZy5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIkFwYWNoZU1vZHVsZVNwZWxpbmcubWFrIlwKLSBDRkc9IkFwYWNoZU1vZHVsZVNwZWxpbmcgLSBXaW4zMiBSZWxlYXNlIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgIkFwYWNoZU1vZHVsZVNwZWxpbmcgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICJBcGFjaGVNb2R1bGVTcGVsaW5nIC0gV2luMzIgRGVidWciIChiYXNlZCBvblwKLSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLU1UTD1taWRsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJBcGFjaGVNb2R1bGVTcGVsaW5nIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIi5cUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIi5cUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICIuXEFwYWNoZU1vZHVsZVNwZWxpbmdSIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi5cQXBhY2hlTW9kdWxlU3BlbGluZ1IiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dYIC9PMiAvSSAiLi5cLi5caW5jbHVkZSIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJTSEFSRURfTU9EVUxFIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiAuLlwuLlxDb3JlUlxBcGFjaGVDb3JlLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFjaGluZTpJMzg2Ci0KLSFFTFNFSUYgICIkKENGRykiID09ICJBcGFjaGVNb2R1bGVTcGVsaW5nIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXERlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiLlxEZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICIuXEFwYWNoZU1vZHVsZVNwZWxpbmdEIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi5cQXBhY2hlTW9kdWxlU3BlbGluZ0QiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvSSAiLi5cLi5caW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJTSEFSRURfTU9EVUxFIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgLi5cLi5cQ29yZURcQXBhY2hlQ29yZS5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIkFwYWNoZU1vZHVsZVNwZWxpbmcgLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICJBcGFjaGVNb2R1bGVTcGVsaW5nIC0gV2luMzIgRGVidWciCi0jIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtocGo7YmF0O2ZvcjtmOTAiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxtb2R1bGVzXHN0YW5kYXJkXG1vZF9zcGVsaW5nLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmw7Zmk7ZmQiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHJlYWRkaXIuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47Y250O3J0ZjtnaWY7anBnO2pwZWc7anBlIgotIyBFbmQgR3JvdXAKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tYXBwZXJzL21vZF9zcGVsaW5nLmV4cCBiL21vZHVsZXMvbWFwcGVycy9tb2Rfc3BlbGluZy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZWU4YjUuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tYXBwZXJzL21vZF9zcGVsaW5nLmV4cAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXNwZWxpbmdfbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvbW9kX3VzZXJkaXIuYyBiL21vZHVsZXMvbWFwcGVycy9tb2RfdXNlcmRpci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzI3NDI5Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWFwcGVycy9tb2RfdXNlcmRpci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU2ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogbW9kX3VzZXJkaXIuLi4gaW1wbGVtZW50IHRoZSBVc2VyRGlyIGNvbW1hbmQuICBCcm9rZW4gYXdheSBmcm9tIHRoZQotICogQWxpYXMgc3R1ZmYgZm9yIGEgY291cGxlIG9mIGdvb2QgYW5kIG5vdC1zby1nb29kIHJlYXNvbnM6Ci0gKgotICogMSkgSXQgc2hvd3MgYSByZWFsIG1pbmltYWwgd29ya2luZyBleGFtcGxlIG9mIGhvdyB0byBkbyBzb21ldGhpbmcgbGlrZQotICogICAgdGhpcy4KLSAqIDIpIEkga25vdyBwZW9wbGUgd2hvIGFyZSBhY3R1YWxseSBpbnRlcmVzdGVkIGluIGNoYW5naW5nIHRoaXMgKnBhcnRpY3VsYXIqCi0gKiAgICBhc3BlY3Qgb2Ygc2VydmVyIGZ1bmN0aW9uYWxpdHkgd2l0aG91dCBjaGFuZ2luZyB0aGUgcmVzdCBvZiBpdC4gIFRoYXQncwotICogICAgd2hhdCB0aGlzIHdob2xlIG1vZHVsYXIgYXJyYW5nZW1lbnQgaXMgc3VwcG9zZWQgdG8gYmUgZ29vZCBhdC4uLgotICoKLSAqIE1vZGlmaWVkIGJ5IEFsZXhlaSBLb3N1dCB0byBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgY29uc3RydWN0cwotICogKHNlcnZlciBydW5uaW5nIGF0IHd3dy5mb28uY29tLCByZXF1ZXN0IGZvciAvfmJhci9vbmUvdHdvLmh0bWwpCi0gKgotICogVXNlckRpciBwdWJsaWNfaHRtbCAgICAgIC0+IH5iYXIvcHVibGljX2h0bWwvb25lL3R3by5odG1sCi0gKiBVc2VyRGlyIC91c3Ivd2ViICAgICAgICAgLT4gL3Vzci93ZWIvYmFyL29uZS90d28uaHRtbAotICogVXNlckRpciAvaG9tZS8gKiAvd3d3ICAgICAtPiAvaG9tZS9iYXIvd3d3L29uZS90d28uaHRtbAotICogIE5PVEU6IHRoZXNlcyBeIF4gc3BhY2Ugb25seSBhZGRlZCBhbGxvdyBpdCB0byB3b3JrIGluIGEgY29tbWVudCwgaWdub3JlCi0gKiBVc2VyRGlyIGh0dHA6Ly94L3VzZXJzICAgLT4gKDMwMikgaHR0cDovL3gvdXNlcnMvYmFyL29uZS90d28uaHRtbAotICogVXNlckRpciBodHRwOi8veC8gKiAveSAgICAgLT4gKDMwMikgaHR0cDovL3gvYmFyL3kvb25lL3R3by5odG1sCi0gKiAgTk9URTogaGVyZSBhbHNvIF4gXgotICoKLSAqIEluIGFkZGl0aW9uLCB5b3UgY2FuIHVzZSBtdWx0aXBsZSBlbnRyaWVzLCB0byBzcGVjaWZ5IGFsdGVybmF0ZQotICogdXNlciBkaXJlY3RvcmllcyAoYSBsYSBEaXJlY3RvcnkgSW5kZXgpLiBGb3IgZXhhbXBsZToKLSAqCi0gKiBVc2VyRGlyIHB1YmxpY19odG1sIC91c3Ivd2ViIGh0dHA6Ly93d3cueHl6LmNvbS91c2VycwotICoKLSAqIE1vZGlmaWVkIGJ5IEtlbiBDb2FyIHRvIHByb3ZpZGUgZm9yIHRoZSBmb2xsb3dpbmc6Ci0gKgotICogVXNlckRpciBkaXNhYmxlW2RdIHVzZXJuYW1lIC4uLgotICogVXNlckRpciBlbmFibGVbZF0gdXNlcm5hbWUgLi4uCi0gKgotICogSWYgImRpc2FibGVkIiBoYXMgbm8gb3RoZXIgYXJndW1lbnRzLCAqYWxsKiB+PHVzZXJuYW1lPiByZWZlcmVuY2VzIGFyZQotICogZGlzYWJsZWQsIGV4Y2VwdCB0aG9zZSBleHBsaWNpdGx5IHR1cm5lZCBvbiB3aXRoIHRoZSAiZW5hYmxlZCIga2V5d29yZC4KLSAqLwotCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIgotI2lmZGVmIEhBVkVfUFdEX0gKLSNpbmNsdWRlIDxwd2QuaD4KLSNlbmRpZgotCi0vKiBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaW4gdXNlcidzIGhvbWUgZGlyICovCi0jaWZuZGVmIERFRkFVTFRfVVNFUl9ESVIKLSNkZWZpbmUgREVGQVVMVF9VU0VSX0RJUiAicHVibGljX2h0bWwiCi0jZW5kaWYKLQotbW9kdWxlIHVzZXJkaXJfbW9kdWxlOwotCi10eXBlZGVmIHN0cnVjdCB1c2VyZGlyX2NvbmZpZyB7Ci0gICAgaW50IGdsb2JhbGx5X2Rpc2FibGVkOwotICAgIGNoYXIgKnVzZXJkaXI7Ci0gICAgYXBfdGFibGVfdCAqZW5hYmxlZF91c2VyczsKLSAgICBhcF90YWJsZV90ICpkaXNhYmxlZF91c2VyczsKLX0gICAgICAgICAgICAgIHVzZXJkaXJfY29uZmlnOwotCi0vKgotICogU2VydmVyIGNvbmZpZyBmb3IgdGhpcyBtb2R1bGU6IGdsb2JhbCBkaXNhYmxlbWVudCBmbGFnLCBhIGxpc3Qgb2YgdXNlcm5hbWVzCi0gKiBpbmVsaWdpYmxlIGZvciBVc2VyRGlyIGFjY2VzcywgYSBsaXN0IG9mIHRob3NlIGltbXVuZSB0byBnbG9iYWwgKGJ1dCBub3QKLSAqIGV4cGxpY2l0KSBkaXNhYmxlbWVudCwgYW5kIHRoZSByZXBsYWNlbWVudCBzdHJpbmcgZm9yIGFsbCBvdGhlcnMuCi0gKi8KLQotc3RhdGljIHZvaWQgKmNyZWF0ZV91c2VyZGlyX2NvbmZpZyhhcF9jb250ZXh0X3QgKnAsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgdXNlcmRpcl9jb25maWcKLSAgICAqIG5ld2NmZyA9ICh1c2VyZGlyX2NvbmZpZyAqKSBhcF9wY2FsbG9jKHAsIHNpemVvZih1c2VyZGlyX2NvbmZpZykpOwotCi0gICAgbmV3Y2ZnLT5nbG9iYWxseV9kaXNhYmxlZCA9IDA7Ci0gICAgbmV3Y2ZnLT51c2VyZGlyID0gREVGQVVMVF9VU0VSX0RJUjsKLSAgICBuZXdjZmctPmVuYWJsZWRfdXNlcnMgPSBhcF9tYWtlX3RhYmxlKHAsIDQpOwotICAgIG5ld2NmZy0+ZGlzYWJsZWRfdXNlcnMgPSBhcF9tYWtlX3RhYmxlKHAsIDQpOwotICAgIHJldHVybiAodm9pZCAqKSBuZXdjZmc7Ci19Ci0KLSNkZWZpbmUgT19ERUZBVUxUIDAKLSNkZWZpbmUgT19FTkFCTEUgMQotI2RlZmluZSBPX0RJU0FCTEUgMgotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3VzZXJfZGlyKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIHVzZXJkaXJfY29uZmlnCi0gICAgKiBzX2NmZyA9ICh1c2VyZGlyX2NvbmZpZyAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZwotICAgICgKLSAgICAgY21kLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsCi0gICAgICZ1c2VyZGlyX21vZHVsZQotICAgICk7Ci0gICAgY2hhciAqdXNlcm5hbWU7Ci0gICAgY29uc3QgY2hhcgotICAgICAgICAqdXNlcm5hbWVzID0gYXJnOwotICAgIGNoYXIgKmt3ID0gYXBfZ2V0d29yZF9jb25mKGNtZC0+cG9vbCwgJnVzZXJuYW1lcyk7Ci0gICAgYXBfdGFibGVfdCAqdXNlcnRhYmxlOwotCi0gICAgLyoKLSAgICAgKiBMZXQncyBkbyB0aGUgY29tcGFyaXNvbnMgb25jZS4KLSAgICAgKi8KLSAgICBpZiAoKCFzdHJjYXNlY21wKGt3LCAiZGlzYWJsZSIpKSB8fCAoIXN0cmNhc2VjbXAoa3csICJkaXNhYmxlZCIpKSkgewotICAgICAgICAvKgotICAgICAgICAgKiBJZiB0aGVyZSBhcmUgbm8gdXNlcm5hbWVzIHNwZWNpZmllZCwgdGhpcyBpcyBhIGdsb2JhbCBkaXNhYmxlIC0gd2UKLSAgICAgICAgICogbmVlZCBkbyBubyBtb3JlIGF0IHRoaXMgcG9pbnQgdGhhbiByZWNvcmQgdGhlIGZhY3QuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoc3RybGVuKHVzZXJuYW1lcykgPT0gMCkgewotICAgICAgICAgICAgc19jZmctPmdsb2JhbGx5X2Rpc2FibGVkID0gMTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHVzZXJ0YWJsZSA9IHNfY2ZnLT5kaXNhYmxlZF91c2VyczsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKCFzdHJjYXNlY21wKGt3LCAiZW5hYmxlIikpIHx8ICghc3RyY2FzZWNtcChrdywgImVuYWJsZWQiKSkpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogVGhlICJkaXNhYmxlIiBrZXl3b3JkIGNhbiBzdGFuZCBhbG9uZSBvciB0YWtlIGEgbGlzdCBvZiBuYW1lcywgYnV0Ci0gICAgICAgICAqIHRoZSAiZW5hYmxlIiBrZXl3b3JkIHJlcXVpcmVzIHRoZSBsaXN0LiAgV2hpbmdlIGlmIGl0IGRvZXNuJ3QgaGF2ZQotICAgICAgICAgKiBpdC4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChzdHJsZW4odXNlcm5hbWVzKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlVzZXJEaXIgXCJlbmFibGVcIiBrZXl3b3JkIHJlcXVpcmVzIGEgbGlzdCBvZiB1c2VybmFtZXMiOwotICAgICAgICB9Ci0gICAgICAgIHVzZXJ0YWJsZSA9IHNfY2ZnLT5lbmFibGVkX3VzZXJzOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogSWYgdGhlIGZpcnN0IChvbmx5PykgdmFsdWUgaXNuJ3Qgb25lIG9mIG91ciBrZXl3b3JkcywganVzdCBjb3B5Ci0gICAgICAgICAqIHRoZSBzdHJpbmcgdG8gdGhlIHVzZXJkaXIgc3RyaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgc19jZmctPnVzZXJkaXIgPSBhcF9wc3RyZHVwKGNtZC0+cG9vbCwgYXJnKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIC8qCi0gICAgICogTm93IHdlIGp1c3QgdGFrZSBlYWNoIHdvcmQgaW4gdHVybiBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYW5kIGFkZCBpdCB0bwotICAgICAqIHRoZSBhcHByb3ByaWF0ZSB0YWJsZS4KLSAgICAgKi8KLSAgICB3aGlsZSAoKnVzZXJuYW1lcykgewotICAgICAgICB1c2VybmFtZSA9IGFwX2dldHdvcmRfY29uZihjbWQtPnBvb2wsICZ1c2VybmFtZXMpOwotICAgICAgICBhcF90YWJsZV9zZXRuKHVzZXJ0YWJsZSwgdXNlcm5hbWUsIGt3KTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyB1c2VyZGlyX2NtZHNbXSA9IHsKLSAgICB7IlVzZXJEaXIiLCBzZXRfdXNlcl9kaXIsIE5VTEwsIFJTUkNfQ09ORiwgUkFXX0FSR1MsCi0gICAgInRoZSBwdWJsaWMgc3ViZGlyZWN0b3J5IGluIHVzZXJzJyBob21lIGRpcmVjdG9yaWVzLCBvciAnZGlzYWJsZWQnLCBvciAnZGlzYWJsZWQgdXNlcm5hbWUgdXNlcm5hbWUuLi4nLCBvciAnZW5hYmxlZCB1c2VybmFtZSB1c2VybmFtZS4uLicifSwKLSAgICB7TlVMTH0KLX07Ci0KLXN0YXRpYyBpbnQgdHJhbnNsYXRlX3VzZXJkaXIocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgdm9pZCAqc2VydmVyX2NvbmYgPSByLT5zZXJ2ZXItPm1vZHVsZV9jb25maWc7Ci0gICAgY29uc3QgdXNlcmRpcl9jb25maWcgKnNfY2ZnID0KLSAgICAodXNlcmRpcl9jb25maWcgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoc2VydmVyX2NvbmYsICZ1c2VyZGlyX21vZHVsZSk7Ci0gICAgY2hhciAqbmFtZSA9IHItPnVyaTsKLSAgICBjb25zdCBjaGFyICp1c2VyZGlycyA9IHNfY2ZnLT51c2VyZGlyOwotICAgIGNvbnN0IGNoYXIgKncsICpkbmFtZTsKLSAgICBjaGFyICpyZWRpcmVjdDsKLSAgICBjaGFyICp4ID0gTlVMTDsKLSAgICBhcF9maW5mb190IHN0YXRidWY7Ci0KLSAgICAvKgotICAgICAqIElmIHRoZSBVUkkgZG9lc24ndCBtYXRjaCBvdXIgYmFzaWMgcGF0dGVybiwgd2UndmUgbm90aGluZyB0byBkbyB3aXRoCi0gICAgICogaXQuCi0gICAgICovCi0gICAgaWYgKAotICAgICAgICAoc19jZmctPnVzZXJkaXIgPT0gTlVMTCkgfHwKLSAgICAgICAgKG5hbWVbMF0gIT0gJy8nKSB8fAotICAgICAgICAobmFtZVsxXSAhPSAnficpCi0gICAgICAgICkgewotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgZG5hbWUgPSBuYW1lICsgMjsKLSAgICB3ID0gYXBfZ2V0d29yZChyLT5wb29sLCAmZG5hbWUsICcvJyk7Ci0KLSAgICAvKgotICAgICAqIFRoZSAnZG5hbWUnIGZ1bm55IGJ1c2luZXNzIGludm9sdmVzIGJhY2tpbmcgaXQgdXAgdG8gY2FwdHVyZSB0aGUgJy8nCi0gICAgICogZGVsaW1pdGluZyB0aGUgIi9+dXNlciIgcGFydCBmcm9tIHRoZSByZXN0IG9mIHRoZSBVUkwsIGluIGNhc2UgdGhlcmUKLSAgICAgKiB3YXMgb25lICh0aGUgY2FzZSB3aGVyZSB0aGVyZSB3YXNuJ3QgYmVpbmcganVzdCAiR0VUIC9+dXNlciBIVFRQLzEuMCIsCi0gICAgICogZm9yIHdoaWNoIHdlIGRvbid0IHdhbnQgdG8gdGFjayBvbiBhICcvJyBvbnRvIHRoZSBmaWxlbmFtZSkuCi0gICAgICovCi0KLSAgICBpZiAoZG5hbWVbLTFdID09ICcvJykgewotICAgICAgICAtLWRuYW1lOwotICAgIH0KLQotICAgIC8qCi0gICAgICogSWYgdGhlcmUncyBubyB1c2VybmFtZSwgaXQncyBub3QgZm9yIHVzLiAgSWdub3JlIC4gYW5kIC4uIGFzIHdlbGwuCi0gICAgICovCi0gICAgaWYgKHdbMF0gPT0gJ1wwJyB8fCAod1sxXSA9PSAnLicgJiYgKHdbMl0gPT0gJ1wwJyB8fCAod1syXSA9PSAnLicgJiYgd1szXSA9PSAnXDAnKSkpKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBOb3IgaWYgdGhlcmUncyBhbiB1c2VybmFtZSBidXQgaXQncyBpbiB0aGUgZGlzYWJsZWQgbGlzdC4KLSAgICAgKi8KLSAgICBpZiAoYXBfdGFibGVfZ2V0KHNfY2ZnLT5kaXNhYmxlZF91c2VycywgdykgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0gICAgfQotICAgIC8qCi0gICAgICogSWYgdGhlcmUncyBhIGdsb2JhbCBpbnRlcmRpY3Rpb24gb24gVXNlckRpcnMsIGNoZWNrIHRvIHNlZSBpZiB0aGlzCi0gICAgICogbmFtZSBpcyBvbmUgb2YgdGhlIEJsZXNzZWQuCi0gICAgICovCi0gICAgaWYgKAotICAgICAgICBzX2NmZy0+Z2xvYmFsbHlfZGlzYWJsZWQgJiYKLSAgICAgICAgKGFwX3RhYmxlX2dldChzX2NmZy0+ZW5hYmxlZF91c2VycywgdykgPT0gTlVMTCkKLSAgICAgICAgKSB7Ci0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNwZWNpYWwgY2FzZXMgYWxsIGNoZWNrZWQsIG9ud2FyZCB0byBub3JtYWwgc3Vic3RpdHV0aW9uIHByb2Nlc3NpbmcuCi0gICAgICovCi0KLSAgICB3aGlsZSAoKnVzZXJkaXJzKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnVzZXJkaXIgPSBhcF9nZXR3b3JkX2NvbmYoci0+cG9vbCwgJnVzZXJkaXJzKTsKLSAgICAgICAgY2hhciAqZmlsZW5hbWUgPSBOVUxMOwotCi0gICAgICAgIGlmIChzdHJjaHIodXNlcmRpciwgJyonKSkKLSAgICAgICAgICAgIHggPSBhcF9nZXR3b3JkKHItPnBvb2wsICZ1c2VyZGlyLCAnKicpOwotCi0JaWYgKHVzZXJkaXJbMF0gPT0gJ1wwJyB8fCBhcF9vc19pc19wYXRoX2Fic29sdXRlKHVzZXJkaXIpKSB7Ci0gICAgICAgICAgICBpZiAoeCkgewotI2lmZGVmIEhBVkVfRFJJVkVfTEVUVEVSUwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogQ3J1bW15IGhhY2suIE5lZWQgdG8gZmlndXJlIG91dCB3aGV0aGVyIHdlIGhhdmUgYmVlbgotICAgICAgICAgICAgICAgICAqIHJlZGlyZWN0ZWQgdG8gYSBVUkwgb3IgdG8gYSBmaWxlIG9uIHNvbWUgZHJpdmUuIFNpbmNlIEkKLSAgICAgICAgICAgICAgICAgKiBrbm93IG9mIG5vIHByb3RvY29scyB0aGF0IGFyZSBhIHNpbmdsZSBsZXR0ZXIsIGlmIHRoZSA6IGlzCi0gICAgICAgICAgICAgICAgICogdGhlIHNlY29uZCBjaGFyYWN0ZXIsIEkgd2lsbCBhc3N1bWUgYSBmaWxlIHdhcyBzcGVjaWZpZWQKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoc3RyY2hyKHggKyAyLCAnOicpKQotI2Vsc2UKLSAgICAgICAgICAgICAgICBpZiAoc3RyY2hyKHgsICc6JykpCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdJTjMyICovCi0JCXsKLSAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3QgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHgsIHcsIHVzZXJkaXIsIGRuYW1lLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkxvY2F0aW9uIiwgcmVkaXJlY3QpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUkVESVJFQ1Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHgsIHcsIHVzZXJkaXIsIE5VTEwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCB1c2VyZGlyLCAiLyIsIHcsIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNocih1c2VyZGlyLCAnOicpKSB7Ci0gICAgICAgICAgICByZWRpcmVjdCA9IGFwX3BzdHJjYXQoci0+cG9vbCwgdXNlcmRpciwgIi8iLCB3LCBkbmFtZSwgTlVMTCk7Ci0gICAgICAgICAgICBhcF90YWJsZV9zZXRuKHItPmhlYWRlcnNfb3V0LCAiTG9jYXRpb24iLCByZWRpcmVjdCk7Ci0gICAgICAgICAgICByZXR1cm4gUkVESVJFQ1Q7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0jaWZkZWYgV0lOMzIKLSAgICAgICAgICAgIC8qIE5lZWQgdG8gZmlndXJlIG91dCBob21lIGRpcnMgb24gTlQgKi8KLSAgICAgICAgICAgIHJldHVybiBERUNMSU5FRDsKLSNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0lOMzIgKi8KLSAgICAgICAgICAgIHN0cnVjdCBwYXNzd2QgKnB3OwotICAgICAgICAgICAgaWYgKChwdyA9IGdldHB3bmFtKHcpKSkgewotI2lmZGVmIE9TMgotICAgICAgICAgICAgICAgIC8qIE5lZWQgdG8gbWFudWFsbHkgYWRkIHVzZXIgbmFtZSBmb3IgT1MvMiAqLwotICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCBwdy0+cHdfZGlyLCB3LCAiLyIsIHVzZXJkaXIsIE5VTEwpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgcHctPnB3X2RpciwgIi8iLCB1c2VyZGlyLCBOVUxMKTsKLSNlbmRpZgotICAgICAgICAgICAgfQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXSU4zMiAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogTm93IHNlZSBpZiBpdCBleGlzdHMsIG9yIHdlJ3JlIGF0IHRoZSBsYXN0IGVudHJ5LiBJZiB3ZSBhcmUgYXQgdGhlCi0gICAgICAgICAqIGxhc3QgZW50cnksIHRoZW4gdXNlIHRoZSBmaWxlbmFtZSBnZW5lcmF0ZWQgKGlmIHRoZXJlIGlzIG9uZSkKLSAgICAgICAgICogYW55d2F5LCBpbiB0aGUgaG9wZSB0aGF0IHNvbWUgaGFuZGxlciBtaWdodCBoYW5kbGUgaXQuIFRoaXMgY2FuIGJlCi0gICAgICAgICAqIHVzZWQsIGZvciBleGFtcGxlLCB0byBydW4gYSBDR0kgc2NyaXB0IGZvciB0aGUgdXNlci4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChmaWxlbmFtZSAmJiAoISp1c2VyZGlycyB8fCAKLSAgICAgICAgICAgIGFwX3N0YXQoJnN0YXRidWYsIGZpbGVuYW1lLCByLT5wb29sKSA9PSBBUFJfU1VDQ0VTUykpIHsKLSAgICAgICAgICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCBmaWxlbmFtZSwgZG5hbWUsIE5VTEwpOwotCSAgICAvKiB3aGVuIHN0YXRidWYgY29udGFpbnMgaW5mbyBvbiByLT5maWxlbmFtZSB3ZSBjYW4gc2F2ZSBhIHN5c2NhbGwKLQkgICAgICogYnkgY29weWluZyBpdCB0byByLT5maW5mbwotCSAgICAgKi8KLQkgICAgaWYgKCp1c2VyZGlycyAmJiBkbmFtZVswXSA9PSAwKQotCQlyLT5maW5mbyA9IHN0YXRidWY7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gREVDTElORUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlZ2lzdGVyX2hvb2tzKHZvaWQpCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhc3pTdWNjW109eyAibW9kX2FsaWFzLmMiLE5VTEwgfTsKLQotICAgIGFwX2hvb2tfdHJhbnNsYXRlX25hbWUodHJhbnNsYXRlX3VzZXJkaXIsTlVMTCxhc3pTdWNjLEhPT0tfTUlERExFKTsKLX0KLQotbW9kdWxlIHVzZXJkaXJfbW9kdWxlID0gewotICAgIFNUQU5EQVJEMjBfTU9EVUxFX1NUVUZGLAotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXIgY29uZmlnIGNyZWF0ZXIgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogZGlyIG1lcmdlciAtLS0gZGVmYXVsdCBpcyB0byBvdmVycmlkZSAqLwotICAgIGNyZWF0ZV91c2VyZGlyX2NvbmZpZywgICAgICAvKiBzZXJ2ZXIgY29uZmlnICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lcmdlIHNlcnZlciBjb25maWcgKi8KLSAgICB1c2VyZGlyX2NtZHMsICAgICAgICAgICAgICAgLyogY29tbWFuZCBhcF90YWJsZV90ICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGhhbmRsZXJzICovCi0gICAgcmVnaXN0ZXJfaG9va3MgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyIGhvb2tzICovCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tYXBwZXJzL21vZF91c2VyZGlyLmV4cCBiL21vZHVsZXMvbWFwcGVycy9tb2RfdXNlcmRpci5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOGI4MWQuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tYXBwZXJzL21vZF91c2VyZGlyLmV4cAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXVzZXJkaXJfbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL21hcHBlcnMvbW9kX3Zob3N0X2FsaWFzLmMgYi9tb2R1bGVzL21hcHBlcnMvbW9kX3Zob3N0X2FsaWFzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MzM1MzguLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tYXBwZXJzL21vZF92aG9zdF9hbGlhcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDc2ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIG1vZF92aG9zdF9hbGlhcy5jOiBzdXBwb3J0IGZvciBkeW5hbWljYWxseSBjb25maWd1cmVkIG1hc3MgdmlydHVhbCBob3N0aW5nCi0gKiAKLSAqIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERlbW9uIEludGVybmV0IEx0ZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIHdhcyBzdWJtaXR0ZWQgYnkgRGVtb24gSW50ZXJuZXQgdG8gdGhlIEFwYWNoZSBHcm91cAotICogaW4gTWF5IDE5OTkuIEZ1dHVyZSByZXZpc2lvbnMgYW5kIGRlcml2YXRpdmVzIG9mIHRoaXMgc291cmNlIGNvZGUKLSAqIG11c3QgYWNrbm93bGVkZ2UgRGVtb24gSW50ZXJuZXQgYXMgdGhlIG9yaWdpbmFsIGNvbnRyaWJ1dG9yIG9mCi0gKiB0aGlzIG1vZHVsZS4gQWxsIG90aGVyIGxpY2Vuc2luZyBhbmQgdXNhZ2UgY29uZGl0aW9ucyBhcmUgdGhvc2UKLSAqIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogT3JpZ2luYWxseSB3cml0dGVuIGJ5IFRvbnkgRmluY2ggPGZhbmZAZGVtb24ubmV0PiA8ZG90QGRvdGF0LmF0Pi4KLSAqCi0gKiBJbXBsZW1lbnRhdGlvbiBpZGVhcyB3ZXJlIHRha2VuIGZyb20gbW9kX2FsaWFzLmMuIFRoZSBvdmVyYWxsCi0gKiBjb25jZXB0IGlzIGRlcml2ZWQgZnJvbSB0aGUgT1ZFUlJJREVfRE9DX1JPT1QvT1ZFUlJJREVfQ0dJRElSCi0gKiBwYXRjaCB0byBBcGFjaGUgMS4zYjMgYW5kIGEgc2ltaWxhciBmZWF0dXJlIGluIERlbW9uJ3MgdGh0dHBkLAotICogYm90aCB3cml0dGVuIGJ5IEphbWVzIEdyaW50ZXIgPGpyZ0BibG9kd2VuLmRlbW9uLmNvLnVrPi4KLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotCi0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCB2aG9zdF9hbGlhc19tb2R1bGU7Ci0KLQotLyoKLSAqIGJhc2ljIGNvbmZpZ3VyYXRpb24gdGhpbmdzCi0gKiB3ZSBhYmJyZXZpYXRlICJtb2Rfdmhvc3RfYWxpYXMiIHRvICJtdmEiIGZvciBzaG9ydGVyIG5hbWVzCi0gKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgICBWSE9TVF9BTElBU19VTlNFVCwgVkhPU1RfQUxJQVNfTk9ORSwgVkhPU1RfQUxJQVNfTkFNRSwgVkhPU1RfQUxJQVNfSVAKLX0gbXZhX21vZGVfZTsKLQotLyoKLSAqIFBlci1zZXJ2ZXIgbW9kdWxlIGNvbmZpZyByZWNvcmQuCi0gKi8KLXR5cGVkZWYgc3RydWN0IG12YV9zY29uZl90IHsKLSAgICBjaGFyICpkb2Nfcm9vdDsKLSAgICBjaGFyICpjZ2lfcm9vdDsKLSAgICBtdmFfbW9kZV9lIGRvY19yb290X21vZGU7Ci0gICAgbXZhX21vZGVfZSBjZ2lfcm9vdF9tb2RlOwotfSBtdmFfc2NvbmZfdDsKLQotc3RhdGljIHZvaWQgKm12YV9jcmVhdGVfc2VydmVyX2NvbmZpZyhhcF9jb250ZXh0X3QgKnAsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgbXZhX3Njb25mX3QgKmNvbmY7Ci0KLSAgICBjb25mID0gKG12YV9zY29uZl90ICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKG12YV9zY29uZl90KSk7Ci0gICAgY29uZi0+ZG9jX3Jvb3QgPSBOVUxMOwotICAgIGNvbmYtPmNnaV9yb290ID0gTlVMTDsKLSAgICBjb25mLT5kb2Nfcm9vdF9tb2RlID0gVkhPU1RfQUxJQVNfVU5TRVQ7Ci0gICAgY29uZi0+Y2dpX3Jvb3RfbW9kZSA9IFZIT1NUX0FMSUFTX1VOU0VUOwotICAgIHJldHVybiBjb25mOwotfQotCi1zdGF0aWMgdm9pZCAqbXZhX21lcmdlX3NlcnZlcl9jb25maWcoYXBfY29udGV4dF90ICpwLCB2b2lkICpwYXJlbnR2LCB2b2lkICpjaGlsZHYpCi17Ci0gICAgbXZhX3Njb25mX3QgKnBhcmVudCA9IChtdmFfc2NvbmZfdCAqKSBwYXJlbnR2OwotICAgIG12YV9zY29uZl90ICpjaGlsZCA9IChtdmFfc2NvbmZfdCAqKSBjaGlsZHY7Ci0gICAgbXZhX3Njb25mX3QgKmNvbmY7Ci0KLSAgICBjb25mID0gKG12YV9zY29uZl90ICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKCpjb25mKSk7Ci0gICAgaWYgKGNoaWxkLT5kb2Nfcm9vdF9tb2RlID09IFZIT1NUX0FMSUFTX1VOU0VUKSB7Ci0JY29uZi0+ZG9jX3Jvb3RfbW9kZSA9IHBhcmVudC0+ZG9jX3Jvb3RfbW9kZTsKLQljb25mLT5kb2Nfcm9vdCA9IHBhcmVudC0+ZG9jX3Jvb3Q7Ci0gICAgfQotICAgIGVsc2UgewotCWNvbmYtPmRvY19yb290X21vZGUgPSBjaGlsZC0+ZG9jX3Jvb3RfbW9kZTsKLQljb25mLT5kb2Nfcm9vdCA9IGNoaWxkLT5kb2Nfcm9vdDsKLSAgICB9Ci0gICAgaWYgKGNoaWxkLT5jZ2lfcm9vdF9tb2RlID09IFZIT1NUX0FMSUFTX1VOU0VUKSB7Ci0JY29uZi0+Y2dpX3Jvb3RfbW9kZSA9IHBhcmVudC0+Y2dpX3Jvb3RfbW9kZTsKLQljb25mLT5jZ2lfcm9vdCA9IHBhcmVudC0+Y2dpX3Jvb3Q7Ci0gICAgfQotICAgIGVsc2UgewotCWNvbmYtPmNnaV9yb290X21vZGUgPSBjaGlsZC0+Y2dpX3Jvb3RfbW9kZTsKLQljb25mLT5jZ2lfcm9vdCA9IGNoaWxkLT5jZ2lfcm9vdDsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbmY7Ci19Ci0KLQotLyoKLSAqIFRoZXNlIGFyZSBqdXN0IGhlcmUgdG8gdGVsbCB1cyB3aGF0IHZob3N0X2FsaWFzX3NldCBzaG91bGQgZG8uCi0gKiBXZSBkb24ndCBwdXQgYW55dGhpbmcgaW50byB0aGVtOyB3ZSBqdXN0IHVzZSB0aGUgY2VsbCBhZGRyZXNzZXMuCi0gKi8KLXN0YXRpYyBpbnQgdmhvc3RfYWxpYXNfc2V0X2RvY19yb290X2lwLAotICAgIHZob3N0X2FsaWFzX3NldF9jZ2lfcm9vdF9pcCwKLSAgICB2aG9zdF9hbGlhc19zZXRfZG9jX3Jvb3RfbmFtZSwKLSAgICB2aG9zdF9hbGlhc19zZXRfY2dpX3Jvb3RfbmFtZTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKnZob3N0X2FsaWFzX3NldChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKm1hcCkKLXsKLSAgICBtdmFfc2NvbmZfdCAqY29uZjsKLSAgICBtdmFfbW9kZV9lIG1vZGUsICpwbW9kZTsKLSAgICBjaGFyICoqcG1hcDsKLSAgICBjaGFyICpwOwotICAKLSAgICBjb25mID0gKG12YV9zY29uZl90ICopIGFwX2dldF9tb2R1bGVfY29uZmlnKGNtZC0+c2VydmVyLT5tb2R1bGVfY29uZmlnLAotCQkJCQkJJnZob3N0X2FsaWFzX21vZHVsZSk7Ci0gICAgLyogdGhlcmUgb3VnaHQgdG8gYmUgYSBiZXR0ZXIgd2F5IG9mIGRvaW5nIHRoaXMgKi8KLSAgICBpZiAoJnZob3N0X2FsaWFzX3NldF9kb2Nfcm9vdF9pcCA9PSBjbWQtPmluZm8pIHsKLQltb2RlID0gVkhPU1RfQUxJQVNfSVA7Ci0JcG1hcCA9ICZjb25mLT5kb2Nfcm9vdDsKLQlwbW9kZSA9ICZjb25mLT5kb2Nfcm9vdF9tb2RlOwotICAgIH0KLSAgICBlbHNlIGlmICgmdmhvc3RfYWxpYXNfc2V0X2NnaV9yb290X2lwID09IGNtZC0+aW5mbykgewotCW1vZGUgPSBWSE9TVF9BTElBU19JUDsKLQlwbWFwID0gJmNvbmYtPmNnaV9yb290OwotCXBtb2RlID0gJmNvbmYtPmNnaV9yb290X21vZGU7Ci0gICAgfQotICAgIGVsc2UgaWYgKCZ2aG9zdF9hbGlhc19zZXRfZG9jX3Jvb3RfbmFtZSA9PSBjbWQtPmluZm8pIHsKLQltb2RlID0gVkhPU1RfQUxJQVNfTkFNRTsKLQlwbWFwID0gJmNvbmYtPmRvY19yb290OwotCXBtb2RlID0gJmNvbmYtPmRvY19yb290X21vZGU7Ci0gICAgfQotICAgIGVsc2UgaWYgKCZ2aG9zdF9hbGlhc19zZXRfY2dpX3Jvb3RfbmFtZSA9PSBjbWQtPmluZm8pIHsKLQltb2RlID0gVkhPU1RfQUxJQVNfTkFNRTsKLQlwbWFwID0gJmNvbmYtPmNnaV9yb290OwotCXBtb2RlID0gJmNvbmYtPmNnaV9yb290X21vZGU7Ci0gICAgfQotICAgIGVsc2UgewotCXJldHVybiAiSU5URVJOQUwgRVJST1I6IHVua25vd24gY29tbWFuZCBpbmZvIjsKLSAgICB9Ci0KLSAgICBpZiAoKm1hcCAhPSAnLycpIHsKLQlpZiAoc3RyY2FzZWNtcChtYXAsICJub25lIikpIHsKLQkgICAgcmV0dXJuICJmb3JtYXQgc3RyaW5nIG11c3Qgc3RhcnQgd2l0aCAnLycgb3IgYmUgJ25vbmUnIjsKLQl9Ci0JKnBtYXAgPSBOVUxMOwotCSpwbW9kZSA9IFZIT1NUX0FMSUFTX05PTkU7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgLyogc2FuaXR5IGNoZWNrICovCi0gICAgcCA9IG1hcDsKLSAgICB3aGlsZSAoKnAgIT0gJ1wwJykgewotCWlmICgqcCsrICE9ICclJykgewotCSAgICBjb250aW51ZTsKLQl9Ci0JLyogd2UganVzdCBmb3VuZCBhICclJyAqLwotCWlmICgqcCA9PSAncCcgfHwgKnAgPT0gJyUnKSB7Ci0JICAgICsrcDsKLQkgICAgY29udGludWU7Ci0JfQotCS8qIG9wdGlvbmFsIGRhc2ggKi8KLQlpZiAoKnAgPT0gJy0nKSB7Ci0JICAgICsrcDsKLQl9Ci0JLyogZGlnaXQgTiAqLwotCWlmIChhcF9pc2RpZ2l0KCpwKSkgewotCSAgICArK3A7Ci0JfQotCWVsc2UgewotCSAgICByZXR1cm4gInN5bnRheCBlcnJvciBpbiBmb3JtYXQgc3RyaW5nIjsKLQl9Ci0JLyogb3B0aW9uYWwgcGx1cyAqLwotCWlmICgqcCA9PSAnKycpIHsKLQkgICAgKytwOwotCX0KLQkvKiBkbyB3ZSBlbmQgaGVyZT8gKi8KLQlpZiAoKnAgIT0gJy4nKSB7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQkrK3A7Ci0JLyogb3B0aW9uYWwgZGFzaCAqLwotCWlmICgqcCA9PSAnLScpIHsKLQkgICAgKytwOwotCX0KLQkvKiBkaWdpdCBNICovCi0JaWYgKGFwX2lzZGlnaXQoKnApKSB7Ci0JICAgICsrcDsKLQl9Ci0JZWxzZSB7Ci0JICAgIHJldHVybiAic3ludGF4IGVycm9yIGluIGZvcm1hdCBzdHJpbmciOwotCX0KLQkvKiBvcHRpb25hbCBwbHVzICovCi0JaWYgKCpwID09ICcrJykgewotCSAgICArK3A7Ci0JfQotICAgIH0KLSAgICAqcG1hcCA9IG1hcDsKLSAgICAqcG1vZGUgPSBtb2RlOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgbXZhX2NvbW1hbmRzW10gPQotewotICAgIHsiVmlydHVhbFNjcmlwdEFsaWFzIiwgdmhvc3RfYWxpYXNfc2V0LCAmdmhvc3RfYWxpYXNfc2V0X2NnaV9yb290X25hbWUsCi0gICAgIFJTUkNfQ09ORiwgVEFLRTEsICJob3cgdG8gY3JlYXRlIGEgU2NyaXB0QWxpYXMgYmFzZWQgb24gdGhlIGhvc3QifSwKLSAgICB7IlZpcnR1YWxEb2N1bWVudFJvb3QiLCB2aG9zdF9hbGlhc19zZXQsICZ2aG9zdF9hbGlhc19zZXRfZG9jX3Jvb3RfbmFtZSwKLSAgICAgUlNSQ19DT05GLCBUQUtFMSwgImhvdyB0byBjcmVhdGUgdGhlIERvY3VtZW50Um9vdCBiYXNlZCBvbiB0aGUgaG9zdCJ9LAotICAgIHsiVmlydHVhbFNjcmlwdEFsaWFzSVAiLCB2aG9zdF9hbGlhc19zZXQsICZ2aG9zdF9hbGlhc19zZXRfY2dpX3Jvb3RfaXAsCi0gICAgIFJTUkNfQ09ORiwgVEFLRTEsICJob3cgdG8gY3JlYXRlIGEgU2NyaXB0QWxpYXMgYmFzZWQgb24gdGhlIGhvc3QifSwKLSAgICB7IlZpcnR1YWxEb2N1bWVudFJvb3RJUCIsIHZob3N0X2FsaWFzX3NldCwgJnZob3N0X2FsaWFzX3NldF9kb2Nfcm9vdF9pcCwKLSAgICAgUlNSQ19DT05GLCBUQUtFMSwgImhvdyB0byBjcmVhdGUgdGhlIERvY3VtZW50Um9vdCBiYXNlZCBvbiB0aGUgaG9zdCJ9LAotICAgIHsgTlVMTCB9Ci19OwotCi0KLS8qCi0gKiBUaGlzIHJlYWxseSB3YW50cyB0byBiZSBhIG5lc3RlZCBmdW5jdGlvbgotICogYnV0IEMgaXMgdG9vIGZlZWJsZSB0byBzdXBwb3J0IHRoZW0uCi0gKi8KLXN0YXRpYyBhcF9pbmxpbmUgdm9pZCB2aG9zdF9hbGlhc19jaGVja3NwYWNlKHJlcXVlc3RfcmVjICpyLCBjaGFyICpidWYsCi0JCQkJCSAgICAgY2hhciAqKnBkZXN0LCBpbnQgc2l6ZSkKLXsKLSAgICAvKiBYWFg6IHdoYXQgaWYgc2l6ZSA+IEhVR0VfU1RSSU5HX0xFTj8gKi8KLSAgICBpZiAoKnBkZXN0ICsgc2l6ZSA+IGJ1ZiArIEhVR0VfU1RSSU5HX0xFTikgewotCSoqcGRlc3QgPSAnXDAnOwotCWlmIChyLT5maWxlbmFtZSkgewotCSAgICByLT5maWxlbmFtZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgci0+ZmlsZW5hbWUsIGJ1ZiwgTlVMTCk7Ci0JfQotCWVsc2UgewotCSAgICByLT5maWxlbmFtZSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgYnVmKTsKLQl9Ci0JKnBkZXN0ID0gYnVmOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgdmhvc3RfYWxpYXNfaW50ZXJwb2xhdGUocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICAgIGNvbnN0IGNoYXIgKm1hcCwgY29uc3QgY2hhciAqdXJpKQotewotICAgIC8qIDAuLjkgOS4uMCAqLwotICAgIGVudW0geyBNQVhET1RTID0gMTkgfTsKLSAgICBjb25zdCBjaGFyICpkb3RzW01BWERPVFMrMV07Ci0gICAgaW50IG5kb3RzOwotCi0gICAgY2hhciBidWZbSFVHRV9TVFJJTkdfTEVOXTsKLSAgICBjaGFyICpkZXN0LCBsYXN0OwotCi0gICAgaW50IE4sIE0sIE5wLCBNcCwgTmQsIE1kOwotICAgIGNvbnN0IGNoYXIgKnN0YXJ0LCAqZW5kOwotCi0gICAgY29uc3QgY2hhciAqcDsKLQotICAgIG5kb3RzID0gMDsKLSAgICBkb3RzW25kb3RzKytdID0gbmFtZS0xOyAvKiBzbGlnaHRseSBuYXVnaHR5ICovCi0gICAgZm9yIChwID0gbmFtZTsgKnA7ICsrcCl7Ci0JaWYgKCpwID09ICcuJyAmJiBuZG90cyA8IE1BWERPVFMpIHsKLQkgICAgZG90c1tuZG90cysrXSA9IHA7Ci0JfQotICAgIH0KLSAgICBkb3RzW25kb3RzXSA9IHA7Ci0KLSAgICByLT5maWxlbmFtZSA9IE5VTEw7Ci0gIAotICAgIGRlc3QgPSBidWY7Ci0gICAgbGFzdCA9ICdcMCc7Ci0gICAgd2hpbGUgKCptYXApIHsKLQlpZiAoKm1hcCAhPSAnJScpIHsKLQkgICAgLyogbm9ybWFsIGNoYXJhY3RlcnMgKi8KLQkgICAgdmhvc3RfYWxpYXNfY2hlY2tzcGFjZShyLCBidWYsICZkZXN0LCAxKTsKLQkgICAgbGFzdCA9ICpkZXN0KysgPSAqbWFwKys7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQkvKiB3ZSBhcmUgaW4gYSBmb3JtYXQgc3BlY2lmaWVyICovCi0JKyttYXA7Ci0JLyogY2FuJ3QgYmUgYSBzbGFzaCAqLwotCWxhc3QgPSAnXDAnOwotCS8qICUlIC0+ICUgKi8KLQlpZiAoKm1hcCA9PSAnJScpIHsKLQkgICAgKyttYXA7Ci0JICAgIHZob3N0X2FsaWFzX2NoZWNrc3BhY2UociwgYnVmLCAmZGVzdCwgMSk7Ci0JICAgICpkZXN0KysgPSAnJSc7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQkvKiBwb3J0IG51bWJlciAqLwotCWlmICgqbWFwID09ICdwJykgewotCSAgICArK21hcDsKLQkgICAgLyogbm8uIG9mIGRlY2ltYWwgZGlnaXRzIGluIGEgc2hvcnQgcGx1cyBvbmUgKi8KLQkgICAgdmhvc3RfYWxpYXNfY2hlY2tzcGFjZShyLCBidWYsICZkZXN0LCA3KTsKLQkgICAgZGVzdCArPSBhcF9zbnByaW50ZihkZXN0LCA3LCAiJWQiLCBhcF9nZXRfc2VydmVyX3BvcnQocikpOwotCSAgICBjb250aW51ZTsKLQl9Ci0JLyogZGVhbCB3aXRoICUtTisuLU0rIC0tIHN5bnRheCBpcyBhbHJlYWR5IGNoZWNrZWQgKi8KLQlOID0gTSA9IDA7ICAgLyogdmFsdWUgKi8KLQlOcCA9IE1wID0gMDsgLyogaXMgdGhlcmUgYSBwbHVzPyAqLwotCU5kID0gTWQgPSAwOyAvKiBpcyB0aGVyZSBhIGRhc2g/ICovCi0JaWYgKCptYXAgPT0gJy0nKSArK21hcCwgTmQgPSAxOwotCU4gPSAqbWFwKysgLSAnMCc7Ci0JaWYgKCptYXAgPT0gJysnKSArK21hcCwgTnAgPSAxOwotCWlmICgqbWFwID09ICcuJykgewotCSAgICArK21hcDsKLQkgICAgaWYgKCptYXAgPT0gJy0nKSB7Ci0JCSsrbWFwLCBNZCA9IDE7Ci0JICAgIH0KLQkgICAgTSA9ICptYXArKyAtICcwJzsKLQkgICAgaWYgKCptYXAgPT0gJysnKSB7Ci0JCSsrbWFwLCBNcCA9IDE7Ci0JICAgIH0KLQl9Ci0JLyogbm90ZSB0aGF0IE4gYW5kIE0gYXJlIG9uZS1iYXNlZCBpbmRpY2VzLCBub3QgemVyby1iYXNlZCAqLwotCXN0YXJ0ID0gZG90c1swXSsxOyAvKiBwdHIgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciAqLwotCWVuZCA9IGRvdHNbbmRvdHNdOyAvKiBwdHIgdG8gdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgbGFzdCBvbmUgKi8KLQlpZiAoTiAhPSAwKSB7Ci0JICAgIGlmIChOID4gbmRvdHMpIHsKLQkJc3RhcnQgPSAiXyI7Ci0JCWVuZCA9IHN0YXJ0KzE7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoIU5kKSB7Ci0JCXN0YXJ0ID0gZG90c1tOLTFdKzE7Ci0JCWlmICghTnApIHsKLQkJICAgIGVuZCA9IGRvdHNbTl07Ci0JCX0KLQkgICAgfQotCSAgICBlbHNlIHsKLQkJaWYgKCFOcCkgewotCQkgICAgc3RhcnQgPSBkb3RzW25kb3RzLU5dKzE7Ci0JCX0KLQkJZW5kID0gZG90c1tuZG90cy1OKzFdOwotCSAgICB9Ci0JfQotCWlmIChNICE9IDApIHsKLQkgICAgaWYgKE0gPiBlbmQgLSBzdGFydCkgewotCQlzdGFydCA9ICJfIjsKLQkJZW5kID0gc3RhcnQrMTsKLQkgICAgfQotCSAgICBlbHNlIGlmICghTWQpIHsKLQkJc3RhcnQgPSBzdGFydCtNLTE7Ci0JCWlmICghTXApIHsKLQkJICAgIGVuZCA9IHN0YXJ0KzE7Ci0JCX0KLQkgICAgfQotCSAgICBlbHNlIHsKLQkJaWYgKCFNcCkgewotCQkgICAgc3RhcnQgPSBlbmQtTTsKLQkJfQotCQllbmQgPSBlbmQtTSsxOwotCSAgICB9Ci0JfQotCXZob3N0X2FsaWFzX2NoZWNrc3BhY2UociwgYnVmLCAmZGVzdCwgZW5kIC0gc3RhcnQpOwotCWZvciAocCA9IHN0YXJ0OyBwIDwgZW5kOyArK3ApIHsKLQkgICAgKmRlc3QrKyA9IGFwX3RvbG93ZXIoKnApOwotCX0KLSAgICB9Ci0gICAgKmRlc3QgPSAnXDAnOwotICAgIC8qIG5vIGRvdWJsZSBzbGFzaGVzICovCi0gICAgaWYgKGxhc3QgPT0gJy8nKSB7Ci0JKyt1cmk7Ci0gICAgfQotICAgIGlmIChyLT5maWxlbmFtZSkgewotCXItPmZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCByLT5maWxlbmFtZSwgYnVmLCB1cmksIE5VTEwpOwotICAgIH0KLSAgICBlbHNlIHsKLQlyLT5maWxlbmFtZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgYnVmLCB1cmksIE5VTEwpOwotICAgIH0KLX0KLQotc3RhdGljIGludCBtdmFfdHJhbnNsYXRlKHJlcXVlc3RfcmVjICpyKQotewotICAgIG12YV9zY29uZl90ICpjb25mOwotICAgIGNvbnN0IGNoYXIgKm5hbWUsICptYXAsICp1cmk7Ci0gICAgbXZhX21vZGVfZSBtb2RlOwotICAgIGludCBjZ2k7Ci0gIAotICAgIGNvbmYgPSAobXZhX3Njb25mX3QgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoci0+c2VydmVyLT5tb2R1bGVfY29uZmlnLAotCQkJCQkgICAgICAmdmhvc3RfYWxpYXNfbW9kdWxlKTsKLSAgICBpZiAoIXN0cm5jbXAoci0+dXJpLCAiL2NnaS1iaW4vIiwgOSkpIHsKLQltb2RlID0gY29uZi0+Y2dpX3Jvb3RfbW9kZTsKLQltYXAgPSBjb25mLT5jZ2lfcm9vdDsKLQl1cmkgPSByLT51cmkgKyA4OwotCS8qCi0JICogY2FuJ3QgZm9yY2UgY2dpIGltbWVkaWF0ZWx5IGJlY2F1c2Ugd2UgbWlnaHQgbm90IGhhbmRsZSB0aGlzCi0JICogY2FsbCBpZiB0aGUgbW9kZSBpcyB3cm9uZwotCSAqLwotCWNnaSA9IDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKHItPnVyaVswXSA9PSAnLycpIHsKLQltb2RlID0gY29uZi0+ZG9jX3Jvb3RfbW9kZTsKLQltYXAgPSBjb25mLT5kb2Nfcm9vdDsKLQl1cmkgPSByLT51cmk7Ci0JY2dpID0gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLSAgCi0gICAgaWYgKG1vZGUgPT0gVkhPU1RfQUxJQVNfTkFNRSkgewotCW5hbWUgPSBhcF9nZXRfc2VydmVyX25hbWUocik7Ci0gICAgfQotICAgIGVsc2UgaWYgKG1vZGUgPT0gVkhPU1RfQUxJQVNfSVApIHsKLQluYW1lID0gci0+Y29ubmVjdGlvbi0+bG9jYWxfaXA7Ci0gICAgfQotICAgIGVsc2UgewotCXJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICB2aG9zdF9hbGlhc19pbnRlcnBvbGF0ZShyLCBuYW1lLCBtYXAsIHVyaSk7Ci0KLSAgICBpZiAoY2dpKSB7Ci0JLyogc2VlIGlzX3NjcmlwdGFsaWFzZWQoKSBpbiBtb2RfY2dpICovCi0Jci0+aGFuZGxlciA9ICJjZ2ktc2NyaXB0IjsKLQlhcF90YWJsZV9zZXRuKHItPm5vdGVzLCAiYWxpYXMtZm9yY2VkLXR5cGUiLCByLT5oYW5kbGVyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlZ2lzdGVyX2hvb2tzKHZvaWQpCi17Ci0gICAgYXBfaG9va190cmFuc2xhdGVfbmFtZShtdmFfdHJhbnNsYXRlLCBOVUxMLCBOVUxMLCBIT09LX01JRERMRSk7Ci19OwotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgdmhvc3RfYWxpYXNfbW9kdWxlID0KLXsKLSAgICBTVEFOREFSRDIwX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLAkJCS8qIGRpciBjb25maWcgY3JlYXRlciAqLwotICAgIE5VTEwsCQkJLyogZGlyIG1lcmdlciAtLS0gZGVmYXVsdCBpcyB0byBvdmVycmlkZSAqLwotICAgIG12YV9jcmVhdGVfc2VydmVyX2NvbmZpZywJLyogc2VydmVyIGNvbmZpZyAqLwotICAgIG12YV9tZXJnZV9zZXJ2ZXJfY29uZmlnLAkvKiBtZXJnZSBzZXJ2ZXIgY29uZmlncyAqLwotICAgIG12YV9jb21tYW5kcywJCS8qIGNvbW1hbmQgYXBfdGFibGVfdCAqLwotICAgIE5VTEwsCQkJLyogaGFuZGxlcnMgKi8KLSAgICByZWdpc3Rlcl9ob29rcyAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgaG9va3MgKi8KLX07Ci0KZGlmZiAtLWdpdCBhL21vZHVsZXMvbWV0YWRhdGEvLmluZGVudC5wcm8gYi9tb2R1bGVzL21ldGFkYXRhLy5pbmRlbnQucHJvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWZiZTlmLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWV0YWRhdGEvLmluZGVudC5wcm8KKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0taTQgLW5wc2wgLWRpMCAtYnIgLW5jZSAtZDAgLWNsaTAgLW5wY3MgLW5mYzEKLS1UQlVGRgotLVRGSUxFCi0tVFRSQU5TCi0tVFVJTlQ0Ci0tVF90cmFucwotLVRhbGxvd19vcHRpb25zX3QKLS1UYXBhY2hlX3NmaW8KLS1UYXJyYXlfaGVhZGVyCi0tVGJvb2xfaW50Ci0tVGJ1Zl9hcmVhCi0tVGJ1ZmZfc3RydWN0Ci0tVGJ1ZmZ5Ci0tVGNtZF9ob3cKLS1UY21kX3Bhcm1zCi0tVGNvbW1hbmRfcmVjCi0tVGNvbW1hbmRfc3RydWN0Ci0tVGNvbm5fcmVjCi0tVGNvcmVfZGlyX2NvbmZpZwotLVRjb3JlX3NlcnZlcl9jb25maWcKLS1UZGlyX21ha2VyX2Z1bmMKLS1UZXZlbnQKLS1UZ2xvYmFsc19zCi0tVGhhbmRsZXJfZnVuYwotLVRoYW5kbGVyX3JlYwotLVRqb2JsaXN0X3MKLS1UbGlzdGVuX3JlYwotLVRtZXJnZXJfZnVuYwotLVRtb2RlX3QKLS1UbW9kdWxlCi0tVG1vZHVsZV9zdHJ1Y3QKLS1UbXV0ZXgKLS1Ubl9sb25nCi0tVG90aGVyX2NoaWxkX3JlYwotLVRvdmVycmlkZXNfdAotLVRwYXJlbnRfc2NvcmUKLS1UcGlkX3QKLS1UcGlwZWRfbG9nCi0tVHBvb2wKLS1UcmVxdWVzdF9yZWMKLS1UcmVxdWlyZV9saW5lCi0tVHJsaW1fdAotLVRzY29yZWJvYXJkCi0tVHNlbWFwaG9yZQotLVRzZXJ2ZXJfYWRkcl9yZWMKLS1Uc2VydmVyX3JlYwotLVRzZXJ2ZXJfcmVjX2NoYWluCi0tVHNob3J0X3Njb3JlCi0tVHRhYmxlCi0tVHRhYmxlX2VudHJ5Ci0tVHRocmVhZAotLVR1X3dpZGVfaW50Ci0tVHZ0aW1lX3QKLS1Ud2lkZV9pbnQKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX2Nlcm5fbWV0YS5jIGIvbW9kdWxlcy9tZXRhZGF0YS9tb2RfY2Vybl9tZXRhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNGQwOTkuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfY2Vybl9tZXRhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTMgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUJ1MgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIG1vZF9jZXJuX21ldGEuYwotICogdmVyc2lvbiAwLjEuMAotICogc3RhdHVzIGJldGEKLSAqIAotICogQW5kcmV3IFdpbHNvbiA8QW5kcmV3LldpbHNvbkBjbS5jZi5hYy51az4gMjUuSmFuLjk2Ci0gKgotICogKioqIElNUE9SVEFOVCAqKioKLSAqIFRoaXMgdmVyc2lvbiBvZiBtb2RfY2Vybl9tZXRhLmMgY29udHJvbHMgTWV0YSBGaWxlIGJlaGF2aW91ciBvbiBhCi0gKiBwZXItZGlyZWN0b3J5IGJhc2lzLiAgUHJldmlvdXMgdmVyc2lvbnMgb2YgdGhlIG1vZHVsZSBkZWZpbmVkIGJlaGF2aW91cgotICogb24gYSBwZXItc2VydmVyIGJhc2lzLiAgVGhlIHVwc2hvdCBpcyB0aGF0IHlvdSdsbCBuZWVkIHRvIHJldmlzaXQgeW91ciAKLSAqIGNvbmZpZ3VyYXRpb24gZmlsZXMgaW4gb3JkZXIgdG8gbWFrZSB1c2Ugb2YgdGhlIG5ldyBtb2R1bGUuCi0gKiAqKioKLSAqCi0gKiBFbXVsYXRlIHRoZSBDRVJOIEhUVFBEIE1ldGEgZmlsZSBzZW1hbnRpY3MuICBNZXRhIGZpbGVzIGFyZSBIVFRQCi0gKiBoZWFkZXJzIHRoYXQgY2FuIGJlIG91dHB1dCBpbiBhZGRpdGlvbiB0byB0aGUgbm9ybWFsIHJhbmdlIG9mCi0gKiBoZWFkZXJzIGZvciBlYWNoIGZpbGUgYWNjZXNzZWQuICBUaGV5IGFwcGVhciByYXRoZXIgbGlrZSB0aGUgQXBhY2hlCi0gKiAuYXNpcyBmaWxlcywgYW5kIGFyZSBhYmxlIHRvIHByb3ZpZGUgYSBjcnVkZSB3YXkgb2YgaW5mbHVlbmNpbmcKLSAqIHRoZSBFeHBpcmVzOiBoZWFkZXIsIGFzIHdlbGwgYXMgcHJvdmlkaW5nIG90aGVyIGN1cmlvc2l0aWVzLgotICogVGhlcmUgYXJlIG1hbnkgd2F5cyB0byBtYW5hZ2UgbWV0YSBpbmZvcm1hdGlvbiwgdGhpcyBvbmUgd2FzCi0gKiBjaG9zZW4gYmVjYXVzZSB0aGVyZSBpcyBhbHJlYWR5IGEgbGFyZ2UgbnVtYmVyIG9mIENFUk4gdXNlcnMKLSAqIHdobyBjYW4gZXhwbG9pdCB0aGlzIG1vZHVsZS4gIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoZXJlIGFyZSBwcm9iYWJseQotICogbW9yZSBzZW5zaXRpdmUgd2F5cyBvZiBtYW5hZ2luZyB0aGUgRXhwaXJlczogaGVhZGVyIHNwZWNpZmljYWxseS4KLSAqCi0gKiBUaGUgbW9kdWxlIG9iZXlzIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlcywgd2hpY2ggY2FuIGFwcGVhciAKLSAqIGluIHRoZSBzZXJ2ZXIncyAuY29uZiBmaWxlcyBhbmQgaW4gLmh0YWNjZXNzIGZpbGVzLgotICoKLSAqICBNZXRhRmlsZXMgPG9ufG9mZj4gCi0gKgotICogICAgdHVybnMgb258b2ZmIG1ldGEgZmlsZSBwcm9jZXNzaW5nIGZvciBhbnkgZGlyZWN0b3J5LiAgCi0gKiAgICBEZWZhdWx0IHZhbHVlIGlzIG9mZgotICoKLSAqICAgICAgICAjIHR1cm4gb24gTWV0YUZpbGVzIGluIHRoaXMgZGlyZWN0b3J5Ci0gKiAgICAgICAgTWV0YUZpbGVzIG9uCi0gKgotICogIE1ldGFEaXIgPGRpcmVjdG9yeSBuYW1lPgotICogICAgICAKLSAqICAgIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIEFwYWNoZSBjYW4gZmluZAotICogICAgbWV0YSBpbmZvcm1hdGlvbiBmaWxlcy4gIFRoZSBkaXJlY3RvcnkgaXMgdXN1YWxseSBhICdoaWRkZW4nCi0gKiAgICBzdWJkaXJlY3Rvcnkgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBmaWxlIGJlaW5nCi0gKiAgICBhY2Nlc3NlZC4gIGVnOgotICoKLSAqICAgICAgICAjIC5tZXRhIGZpbGVzIGFyZSBpbiB0aGUgKnNhbWUqIGRpcmVjdG9yeSBhcyB0aGUgCi0gKiAgICAgICAgIyBmaWxlIGJlaW5nIGFjY2Vzc2VkCi0gKiAgICAgICAgTWV0YURpciAuCi0gKgotICogICAgdGhlIGRlZmF1bHQgaXMgdG8gbG9vayBpbiBhICcud2ViJyBzdWJkaXJlY3RvcnkuIFRoaXMgaXMgdGhlCi0gKiAgICBzYW1lIGFzIGZvciBDRVJOIDMuKyB3ZWJzZXJ2ZXJzIGFuZCBiZWhhdmlvdXIgaXMgdGhlIHNhbWUgYXMgCi0gKiAgICBmb3IgdGhlIGRpcmVjdGl2ZToKLSAqCi0gKiAgICAgICAgTWV0YURpciAud2ViCi0gKgotICogIE1ldGFTdWZmaXggPG1ldGEgZmlsZSBzdWZmaXg+Ci0gKgotICogICAgc3BlY2lmaWVzIHRoZSBmaWxlIG5hbWUgc3VmZml4IGZvciB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICogICAgbWV0YSBpbmZvcm1hdGlvbi4gIGVnOgotICoKLSAqICAgICAgICMgb3VyIG1ldGEgZmlsZXMgYXJlIHN1ZmZpeGVkIHdpdGggJy5jZXJuX21ldGEnCi0gKiAgICAgICBNZXRhU3VmZml4IC5jZXJuX21ldGEKLSAqCi0gKiAgICB0aGUgZGVmYXVsdCBpcyB0byBsb29rIGZvciBmaWxlcyB3aXRoIHRoZSBzdWZmaXggJy5tZXRhJy4gIFRoaXMKLSAqICAgIGJlaGF2aW91ciBpcyB0aGUgc2FtZSBhcyBmb3IgdGhlIGRpcmVjdGl2ZToKLSAqCi0gKiAgICAgICBNZXRhU3VmZml4IC5tZXRhCi0gKgotICogV2hlbiBhY2Nlc3NpbmcgdGhlIGZpbGUKLSAqCi0gKiAgIERPQ1VNRU5UX1JPT1Qvc29tZWRpci9pbmRleC5odG1sCi0gKgotICogdGhpcyBtb2R1bGUgd2lsbCBsb29rIGZvciB0aGUgZmlsZQotICoKLSAqICAgRE9DVU1FTlRfUk9PVC9zb21lZGlyLy53ZWIvaW5kZXguaHRtbC5tZXRhCi0gKgotICogYW5kIHdpbGwgdXNlIGl0cyBjb250ZW50cyB0byBnZW5lcmF0ZSBhZGRpdGlvbmFsIE1JTUUgaGVhZGVyIAotICogaW5mb3JtYXRpb24uCi0gKgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIENFUk4gTWV0YSBmaWxlIHNlbWFudGljcyBzZWU6Ci0gKgotICogICBodHRwOi8vd3d3LnczLm9yZy9oeXBlcnRleHQvV1dXL0RhZW1vbi9Vc2VyL0NvbmZpZy9HZW5lcmFsLmh0bWwjTWV0YURpcgotICoKLSAqIENoYW5nZS1sb2c6Ci0gKiAyOS5KYW4uOTYgcGZvcGVuL3BmY2xvc2UgaW5zdGVhZCBvZiBmb3Blbi9mY2xvc2UKLSAqICAgICAgICAgICBERUNMSU5FIHdoZW4gcmVhbCBmaWxlIG5vdCBmb3VuZCwgd2UgbWF5IGJlIGNoZWNraW5nIGVhY2gKLSAqICAgICAgICAgICBvZiB0aGUgaW5kZXguaHRtbC9pbmRleC5zaHRtbC9pbmRleC5odG0gdmFyaWFudHMgYW5kIGRvbid0Ci0gKiAgICAgICAgICAgbmVlZCB0byByZXBvcnQgbWlzc2luZyBvbmVzIGFzIHNwdXJpb3VzIGVycm9ycy4gCi0gKiAzMS5KYW4uOTYgbG9nX2Vycm9yIHJlcG9ydHMgYWJvdXQgYSBtYWxmb3JtZWQgLm1ldGEgZmlsZSwgcmF0aGVyCi0gKiAgICAgICAgICAgdGhhbiBhIHNjcmlwdCBlcnJvci4KLSAqIDIwLkp1bi45NiBNZXRhRmlsZXMgPG9ufG9mZj4gZGVmYXVsdCBvZmYsIGFkZGVkLCBzbyB0aGF0IG1vZHVsZQotICogICAgICAgICAgIGNhbiBiZSBjb25maWd1cmVkIHBlci1kaXJlY3RvcnkuICBQcmlvciB0byB0aGlzIHRoZSBtb2R1bGUKLSAqICAgICAgICAgICB3YXMgcnVubmluZyBmb3IgZWFjaCByZXF1ZXN0IGFueXdoZXJlIG9uIHRoZSBzZXJ2ZXIsIG5hdWdodHkuLgotICogMjkuSnVuLjk2IEFsbCBkaXJlY3RpdmVzIG1hZGUgcGVyLWRpcmVjdG9yeS4KLSAqLwotCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgInV0aWxfc2NyaXB0LmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLSNpZmRlZiBIQVZFX1NZU19UWVBFU19ICi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19TVEFUX0gKLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2VuZGlmCi0KLSNkZWZpbmUgRElSX0NNRF9QRVJNUyBPUl9JTkRFWEVTCi0KLSNkZWZpbmUgREVGQVVMVF9NRVRBRElSCQkiLndlYiIKLSNkZWZpbmUgREVGQVVMVF9NRVRBU1VGRklYCSIubWV0YSIKLSNkZWZpbmUgREVGQVVMVF9NRVRBRklMRVMJMAotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgY2Vybl9tZXRhX21vZHVsZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNoYXIgKm1ldGFkaXI7Ci0gICAgY2hhciAqbWV0YXN1ZmZpeDsKLSAgICBjaGFyICptZXRhZmlsZXM7Ci19IGNlcm5fbWV0YV9kaXJfY29uZmlnOwotCi1zdGF0aWMgdm9pZCAqY3JlYXRlX2Nlcm5fbWV0YV9kaXJfY29uZmlnKGFwX2NvbnRleHRfdCAqcCwgY2hhciAqZHVtbXkpCi17Ci0gICAgY2Vybl9tZXRhX2Rpcl9jb25maWcgKm5ldyA9Ci0gICAgKGNlcm5fbWV0YV9kaXJfY29uZmlnICopIGFwX3BhbGxvYyhwLCBzaXplb2YoY2Vybl9tZXRhX2Rpcl9jb25maWcpKTsKLQotICAgIG5ldy0+bWV0YWRpciA9IE5VTEw7Ci0gICAgbmV3LT5tZXRhc3VmZml4ID0gTlVMTDsKLSAgICBuZXctPm1ldGFmaWxlcyA9IERFRkFVTFRfTUVUQUZJTEVTOwotCi0gICAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIHZvaWQgKm1lcmdlX2Nlcm5fbWV0YV9kaXJfY29uZmlncyhhcF9jb250ZXh0X3QgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICphZGR2KQotewotICAgIGNlcm5fbWV0YV9kaXJfY29uZmlnICpiYXNlID0gKGNlcm5fbWV0YV9kaXJfY29uZmlnICopIGJhc2V2OwotICAgIGNlcm5fbWV0YV9kaXJfY29uZmlnICphZGQgPSAoY2Vybl9tZXRhX2Rpcl9jb25maWcgKikgYWRkdjsKLSAgICBjZXJuX21ldGFfZGlyX2NvbmZpZyAqbmV3ID0KLSAgICAoY2Vybl9tZXRhX2Rpcl9jb25maWcgKikgYXBfcGFsbG9jKHAsIHNpemVvZihjZXJuX21ldGFfZGlyX2NvbmZpZykpOwotCi0gICAgbmV3LT5tZXRhZGlyID0gYWRkLT5tZXRhZGlyID8gYWRkLT5tZXRhZGlyIDogYmFzZS0+bWV0YWRpcjsKLSAgICBuZXctPm1ldGFzdWZmaXggPSBhZGQtPm1ldGFzdWZmaXggPyBhZGQtPm1ldGFzdWZmaXggOiBiYXNlLT5tZXRhc3VmZml4OwotICAgIG5ldy0+bWV0YWZpbGVzID0gYWRkLT5tZXRhZmlsZXM7Ci0KLSAgICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X21ldGFkaXIoY21kX3Bhcm1zICpwYXJtcywgY2Vybl9tZXRhX2Rpcl9jb25maWcgKiBkY29uZiwgY2hhciAqYXJnKQotewotICAgIGRjb25mLT5tZXRhZGlyID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X21ldGFzdWZmaXgoY21kX3Bhcm1zICpwYXJtcywgY2Vybl9tZXRhX2Rpcl9jb25maWcgKiBkY29uZiwgY2hhciAqYXJnKQotewotICAgIGRjb25mLT5tZXRhc3VmZml4ID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X21ldGFmaWxlcyhjbWRfcGFybXMgKnBhcm1zLCBjZXJuX21ldGFfZGlyX2NvbmZpZyAqIGRjb25mLCBjaGFyICphcmcpCi17Ci0gICAgZGNvbmYtPm1ldGFmaWxlcyA9IGFyZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgY2Vybl9tZXRhX2NtZHNbXSA9Ci17Ci0gICAgeyJNZXRhRmlsZXMiLCBzZXRfbWV0YWZpbGVzLCBOVUxMLCBESVJfQ01EX1BFUk1TLCBGTEFHLAotICAgICJMaW1pdGVkIHRvICdvbicgb3IgJ29mZicifSwKLSAgICB7Ik1ldGFEaXIiLCBzZXRfbWV0YWRpciwgTlVMTCwgRElSX0NNRF9QRVJNUywgVEFLRTEsCi0gICAgICJ0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgbWV0YSBmaWxlcyJ9LAotICAgIHsiTWV0YVN1ZmZpeCIsIHNldF9tZXRhc3VmZml4LCBOVUxMLCBESVJfQ01EX1BFUk1TLCBUQUtFMSwKLSAgICAgInRoZSBmaWxlbmFtZSBzdWZmaXggZm9yIG1ldGEgZmlsZXMifSwKLSAgICB7TlVMTH0KLX07Ci0KLS8qIFhYWDogdGhpcyBpcyB2ZXJ5IHNpbWlsYXIgdG8gYXBfc2Nhbl9zY3JpcHRfaGVhZGVyX2Vycl9jb3JlLi4uCi0gKiBhcmUgdGhlIGRpZmZlcmVuY2VzIGRlbGliZXJhdGUsIG9yIGp1c3QgYSByZXN1bHQgb2YgYml0IHJvdD8KLSAqLwotc3RhdGljIGludCBzY2FuX21ldGFfZmlsZShyZXF1ZXN0X3JlYyAqciwgYXBfZmlsZV90ICpmKQotewotICAgIGNoYXIgd1tNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciAqbDsKLSAgICBpbnQgcDsKLSAgICBhcF90YWJsZV90ICp0bXBfaGVhZGVyczsKLQotICAgIHRtcF9oZWFkZXJzID0gYXBfbWFrZV90YWJsZShyLT5wb29sLCA1KTsKLSAgICB3aGlsZSAoYXBfZmdldHModywgTUFYX1NUUklOR19MRU4gLSAxLCBmKSAhPSBBUFJfU1VDQ0VTUykgewotCi0JLyogRGVsZXRlIHRlcm1pbmFsIChDUj8pTEYgKi8KLQotCXAgPSBzdHJsZW4odyk7Ci0JaWYgKHAgPiAwICYmIHdbcCAtIDFdID09ICdcbicpIHsKLQkgICAgaWYgKHAgPiAxICYmIHdbcCAtIDJdID09ICdcMDE1JykKLQkJd1twIC0gMl0gPSAnXDAnOwotCSAgICBlbHNlCi0JCXdbcCAtIDFdID0gJ1wwJzsKLQl9Ci0KLQlpZiAod1swXSA9PSAnXDAnKSB7Ci0JICAgIHJldHVybiBPSzsKLQl9Ci0KLQkvKiBpZiB3ZSBzZWUgYSBib2d1cyBoZWFkZXIgZG9uJ3QgaWdub3JlIGl0LiBTaG91dCBhbmQgc2NyZWFtICovCi0KLQlpZiAoIShsID0gc3RyY2hyKHcsICc6JykpKSB7Ci0gCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotCQkJIm1hbGZvcm1lZCBoZWFkZXIgaW4gbWV0YSBmaWxlOiAlcyIsIHItPmZpbGVuYW1lKTsKLQkgICAgcmV0dXJuIFNFUlZFUl9FUlJPUjsKLQl9Ci0KLQkqbCsrID0gJ1wwJzsKLQl3aGlsZSAoKmwgJiYgYXBfaXNzcGFjZSgqbCkpCi0JICAgICsrbDsKLQotCWlmICghc3RyY2FzZWNtcCh3LCAiQ29udGVudC10eXBlIikpIHsKLQkgICAgY2hhciAqdG1wOwotCSAgICAvKiBOdWtlIHRyYWlsaW5nIHdoaXRlc3BhY2UgKi8KLQotCSAgICBjaGFyICplbmRwID0gbCArIHN0cmxlbihsKSAtIDE7Ci0JICAgIHdoaWxlIChlbmRwID4gbCAmJiBhcF9pc3NwYWNlKCplbmRwKSkKLQkJKmVuZHAtLSA9ICdcMCc7Ci0KLQkgICAgdG1wID0gYXBfcHN0cmR1cChyLT5wb29sLCBsKTsKLQkgICAgYXBfY29udGVudF90eXBlX3RvbG93ZXIodG1wKTsKLQkgICAgci0+Y29udGVudF90eXBlID0gdG1wOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiU3RhdHVzIikpIHsKLQkgICAgc3NjYW5mKGwsICIlZCIsICZyLT5zdGF0dXMpOwotCSAgICByLT5zdGF0dXNfbGluZSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgbCk7Ci0JfQotCWVsc2UgewotCSAgICBhcF90YWJsZV9zZXQodG1wX2hlYWRlcnMsIHcsIGwpOwotCX0KLSAgICB9Ci0gICAgYXBfb3ZlcmxhcF90YWJsZXMoci0+aGVhZGVyc19vdXQsIHRtcF9oZWFkZXJzLCBBUF9PVkVSTEFQX1RBQkxFU19TRVQpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdGljIGludCBhZGRfY2Vybl9tZXRhX2RhdGEocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY2hhciAqbWV0YWZpbGVuYW1lOwotICAgIGNoYXIgKmxhc3Rfc2xhc2g7Ci0gICAgY2hhciAqcmVhbF9maWxlOwotICAgIGNoYXIgKnNjcmFwX2Jvb2s7Ci0gICAgYXBfZmlsZV90ICpmID0gTlVMTDsKLSAgICBhcF9zdGF0dXNfdCByZXRjb2RlOwotICAgIGNlcm5fbWV0YV9kaXJfY29uZmlnICpkY29uZjsKLSAgICBpbnQgcnY7Ci0gICAgcmVxdWVzdF9yZWMgKnJyOwotCi0gICAgZGNvbmYgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywgJmNlcm5fbWV0YV9tb2R1bGUpOwotCi0gICAgaWYgKCFkY29uZi0+bWV0YWZpbGVzKSB7Ci0JcmV0dXJuIERFQ0xJTkVEOwotICAgIH07Ci0KLSAgICAvKiBpZiAuLy53ZWIvJDEubWV0YSBleGlzdHMgdGhlbiBvdXRwdXQgJ2FzaXMnICovCi0KLSAgICBpZiAoci0+ZmluZm8ucHJvdGVjdGlvbiA9PSAwKSB7Ci0JcmV0dXJuIERFQ0xJTkVEOwotICAgIH07Ci0KLSAgICAvKiBpcyB0aGlzIGEgZGlyZWN0b3J5PyAqLwotICAgIGlmIChyLT5maW5mby5maWxldHlwZSA9PSBBUFJfRElSIHx8IHItPnVyaVtzdHJsZW4oci0+dXJpKSAtIDFdID09ICcvJykgewotCXJldHVybiBERUNMSU5FRDsKLSAgICB9OwotCi0gICAgLyogd2hhdCBkaXJlY3RvcnkgaXMgdGhpcyBmaWxlIGluPyAqLwotICAgIHNjcmFwX2Jvb2sgPSBhcF9wc3RyZHVwKHItPnBvb2wsIHItPmZpbGVuYW1lKTsKLSAgICAvKiBza2lwIGxlYWRpbmcgc2xhc2gsIHJlY292ZXJlZCBpbiBsYXRlciBwcm9jZXNzaW5nICovCi0gICAgc2NyYXBfYm9vaysrOwotICAgIGxhc3Rfc2xhc2ggPSBzdHJyY2hyKHNjcmFwX2Jvb2ssICcvJyk7Ci0gICAgaWYgKGxhc3Rfc2xhc2ggIT0gTlVMTCkgewotCS8qIHNraXAgb3ZlciBsYXN0IHNsYXNoICovCi0JcmVhbF9maWxlID0gbGFzdF9zbGFzaDsKLQlyZWFsX2ZpbGUrKzsKLQkqbGFzdF9zbGFzaCA9ICdcMCc7Ci0gICAgfQotICAgIGVsc2UgewotCS8qIG5vIGxhc3Qgc2xhc2gsIGJ1aD8hICovCi0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLQkJICAgICJpbnRlcm5hbCBlcnJvciBpbiBtb2RfY2Vybl9tZXRhOiAlcyIsIHItPmZpbGVuYW1lKTsKLQkvKiBzaG91bGQgcmVhbGx5IGJhcmYsIGJ1dCBoZXksIGxldCdzIGJlIGZyaWVuZHMuLi4gKi8KLQlyZXR1cm4gREVDTElORUQ7Ci0gICAgfTsKLQotICAgIG1ldGFmaWxlbmFtZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgIi8iLCBzY3JhcF9ib29rLCAiLyIsCi0JCQkgICBkY29uZi0+bWV0YWRpciA/IGRjb25mLT5tZXRhZGlyIDogREVGQVVMVF9NRVRBRElSLAotCQkJICAgIi8iLCByZWFsX2ZpbGUsCi0JCSBkY29uZi0+bWV0YXN1ZmZpeCA/IGRjb25mLT5tZXRhc3VmZml4IDogREVGQVVMVF9NRVRBU1VGRklYLAotCQkJICAgTlVMTCk7Ci0KLSAgICAvKiBYWFg6IGl0IHN1Y2tzIHRvIHJlcXVpcmUgdGhpcyBzdWJyZXF1ZXN0IHRvIGNvbXBsZXRlLCBiZWNhdXNlIHRoaXMKLSAgICAgKiBtZWFucyBwZW9wbGUgbXVzdCBsZWF2ZSB0aGVpciBtZXRhIGZpbGVzIGFjY2Vzc2libGUgdG8gdGhlIHdvcmxkLgotICAgICAqIEEgYmV0dGVyIHNvbHV0aW9uIG1pZ2h0IGJlIGEgInNhZmUgb3BlbiIgZmVhdHVyZSBvZiBwZm9wZW4gdG8gYXZvaWQKLSAgICAgKiBwaXBlcywgc3ltbGlua3MsIGFuZCBjcmFwIGxpa2UgdGhhdC4KLSAgICAgKi8KLSAgICByciA9IGFwX3N1Yl9yZXFfbG9va3VwX2ZpbGUobWV0YWZpbGVuYW1lLCByKTsKLSAgICBpZiAocnItPnN0YXR1cyAhPSBIVFRQX09LKSB7Ci0JYXBfZGVzdHJveV9zdWJfcmVxKHJyKTsKLQlyZXR1cm4gREVDTElORUQ7Ci0gICAgfQotICAgIGFwX2Rlc3Ryb3lfc3ViX3JlcShycik7Ci0KLSAgICByZXRjb2RlID0gYXBfb3BlbigmZiwgbWV0YWZpbGVuYW1lLCBBUFJfUkVBRCB8IEFQUl9DUkVBVEUsIEFQUl9PU19ERUZBVUxULCByLT5wb29sKTsKLSAgICBpZiAocmV0Y29kZSAhPSBBUFJfU1VDQ0VTUykgewotCWlmIChlcnJubyA9PSBFTk9FTlQpIHsKLQkgICAgcmV0dXJuIERFQ0xJTkVEOwotCX0KLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgMCwgciwKLQkgICAgICAibWV0YSBmaWxlIHBlcm1pc3Npb25zIGRlbnkgc2VydmVyIGFjY2VzczogJXMiLCBtZXRhZmlsZW5hbWUpOwotCXJldHVybiBGT1JCSURERU47Ci0gICAgfTsKLQotICAgIC8qIHJlYWQgdGhlIGhlYWRlcnMgaW4gKi8KLSAgICBydiA9IHNjYW5fbWV0YV9maWxlKHIsIGYpOwotICAgIGFwX2Nsb3NlKGYpOwotCi0gICAgcmV0dXJuIHJ2OwotfQotc3RhdGljIHZvaWQgcmVnaXN0ZXJfaG9va3Modm9pZCkKLXsKLSAgICBhcF9ob29rX2ZpeHVwcyhhZGRfY2Vybl9tZXRhX2RhdGEsTlVMTCxOVUxMLEhPT0tfTUlERExFKTsKLX0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBjZXJuX21ldGFfbW9kdWxlID0KLXsKLSAgICBTVEFOREFSRDIwX01PRFVMRV9TVFVGRiwKLSAgICBjcmVhdGVfY2Vybl9tZXRhX2Rpcl9jb25maWcsLyogZGlyIGNvbmZpZyBjcmVhdGVyICovCi0gICAgbWVyZ2VfY2Vybl9tZXRhX2Rpcl9jb25maWdzLC8qIGRpciBtZXJnZXIgLS0tIGRlZmF1bHQgaXMgdG8gb3ZlcnJpZGUgKi8KLSAgICBOVUxMLAkJCS8qIHNlcnZlciBjb25maWcgKi8KLSAgICBOVUxMLAkJCS8qIG1lcmdlIHNlcnZlciBjb25maWdzICovCi0gICAgY2Vybl9tZXRhX2NtZHMsCQkvKiBjb21tYW5kIGFwX3RhYmxlX3QgKi8KLSAgICBOVUxMLAkJCS8qIGhhbmRsZXJzICovCi0gICAgcmVnaXN0ZXJfaG9va3MJCS8qIHJlZ2lzdGVyIGhvb2tzICovCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfY2Vybl9tZXRhLmRzcCBiL21vZHVsZXMvbWV0YWRhdGEvbW9kX2Nlcm5fbWV0YS5kc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NjRjMGUuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfY2Vybl9tZXRhLmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9IkFwYWNoZU1vZHVsZUNFUk5NZXRhIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDIKLQotQ0ZHPUFwYWNoZU1vZHVsZUNFUk5NZXRhIC0gV2luMzIgUmVsZWFzZQotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJBcGFjaGVNb2R1bGVDRVJOTWV0YS5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIkFwYWNoZU1vZHVsZUNFUk5NZXRhLm1hayJcCi0gQ0ZHPSJBcGFjaGVNb2R1bGVDRVJOTWV0YSAtIFdpbjMyIFJlbGVhc2UiCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAiQXBhY2hlTW9kdWxlQ0VSTk1ldGEgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICJBcGFjaGVNb2R1bGVDRVJOTWV0YSAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1NVEw9bWlkbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAiQXBhY2hlTW9kdWxlQ0VSTk1ldGEgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiLlxSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIi5cQXBhY2hlTW9kdWxlQ0VSTk1ldGFSIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi5cQXBhY2hlTW9kdWxlQ0VSTk1ldGFSIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvTzIgL0kgIi4uXC4uXGluY2x1ZGUiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiU0hBUkVEX01PRFVMRSIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgLi5cLi5cQ29yZVJcQXBhY2hlQ29yZS5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hY2hpbmU6STM4NgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiQXBhY2hlTW9kdWxlQ0VSTk1ldGEgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIi5cRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXERlYnVnIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIE91dHB1dF9EaXIgIi5cQXBhY2hlTW9kdWxlQ0VSTk1ldGFEIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi5cQXBhY2hlTW9kdWxlQ0VSTk1ldGFEIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTURkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uXC4uXGluY2x1ZGUiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiU0hBUkVEX01PRFVMRSIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIC4uXC4uXENvcmVEXEFwYWNoZUNvcmUubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2Ci0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJBcGFjaGVNb2R1bGVDRVJOTWV0YSAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIkFwYWNoZU1vZHVsZUNFUk5NZXRhIC0gV2luMzIgRGVidWciCi0jIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtocGo7YmF0O2ZvcjtmOTAiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxtb2R1bGVzXHN0YW5kYXJkXG1vZF9jZXJuX21ldGEuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubDtmaTtmZCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5ccmVhZGRpci5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIlJlc291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtjbnQ7cnRmO2dpZjtqcGc7anBlZztqcGUiCi0jIEVuZCBHcm91cAotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9tb2R1bGVzL21ldGFkYXRhL21vZF9jZXJuX21ldGEuZXhwIGIvbW9kdWxlcy9tZXRhZGF0YS9tb2RfY2Vybl9tZXRhLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2ZTJiZS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL21vZF9jZXJuX21ldGEuZXhwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotY2Vybl9tZXRhX21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfZW52LmMgYi9tb2R1bGVzL21ldGFkYXRhL21vZF9lbnYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY0NTgwNy4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL21vZF9lbnYuYworKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVQnUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogbW9kX2Vudi5jCi0gKiB2ZXJzaW9uIDAuMC41Ci0gKiBzdGF0dXMgYmV0YQotICogUGFzcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gQ0dJL1NTSSBzY3JpcHRzLgotICogCi0gKiBBbmRyZXcgV2lsc29uIDxBbmRyZXcuV2lsc29uQGNtLmNmLmFjLnVrPiAwNi5EZWMuOTUKLSAqCi0gKiBDaGFuZ2UgbG9nOgotICogMDguRGVjLjk1IE5vdyBhbGxvd3MgUGFzc0VudiBkaXJlY3RpdmUgdG8gYXBwZWFyIG1vcmUgdGhhbiBvbmNlIGluCi0gKiAgICAgICAgICAgY29uZiBmaWxlcy4KLSAqIDEwLkRlYy45NSBvcHRpbWlzYXRpb24uICBnZXRlbnYoKSBvbmx5IGNhbGxlZCBhdCBzdGFydHVwIGFuZCB1c2VkIAotICogICAgICAgICAgIHRvIGJ1aWxkIGEgZmFzdC10by1hY2Nlc3MgdGFibGUuICBhcF90YWJsZV90IHVzZWQgdG8gYnVpbGQgCi0gKiAgICAgICAgICAgcGVyLXNlcnZlciBlbnZpcm9ubWVudCBmb3IgZWFjaCByZXF1ZXN0LgotICogICAgICAgICAgIHJvYnVzdG5lc3MuICBiZXR0ZXIgYWJsZSB0byBoYW5kbGUgZXJyb3JzIGluIGNvbmZpZ3VyYXRpb24KLSAqICAgICAgICAgICBmaWxlczoKLSAqICAgICAgICAgICAxKSAgUGFzc0VudiBkaXJlY3RpdmUgcHJlc2VudCwgYnV0IG5vIGVudmlyb25tZW50IHZhcmlhYmxlIGxpc3RlZAotICogICAgICAgICAgIDIpICBQYXNzRW52IEZPTyBwcmVzZW50LCBidXQgJEZPTyBub3QgcHJlc2VudCBpbiBlbnZpcm9ubWVudAotICogICAgICAgICAgIDMpICBubyBQYXNzRW52IGRpcmVjdGl2ZSBwcmVzZW50Ci0gKiAyMy5EZWMuOTUgTm93IGFsbG93cyBTZXRFbnYgZGlyZWN0aXZlIHdpdGggc2FtZSBzZW1hbnRpY3MgYXMgJ3NoJyBzZXRlbnY6Ci0gKiAgICAgICAgICAgICAgU2V0RW52IFZhciAgICAgIHNldHMgVmFyIHRvIHRoZSBlbXB0eSBzdHJpbmcKLSAqICAgICAgICAgICAgICBTZXRFbnYgVmFyIFZhbCAgc2V0cyBWYXIgdG8gdGhlIHZhbHVlIFZhbAotICogICAgICAgICAgIFZhbHVlcyBjb250YWluaW5nIHdoaXRlc3BhY2Ugc2hvdWxkIGJlIHF1b3RlZCwgZWc6Ci0gKiAgICAgICAgICAgICAgU2V0RW52IFZhciAidGhpcyBpcyBzb21lIHRleHQiCi0gKiAgICAgICAgICAgRW52aXJvbm1lbnQgdmFyaWFibGVzIHRha2UgdGhlaXIgdmFsdWUgZnJvbSB0aGUgbGFzdCBpbnN0YW5jZQotICogICAgICAgICAgIG9mIFBhc3NFbnYgLyBTZXRFbnYgdG8gYmUgcmVhY2hlZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotICogICAgICAgICAgIEZvciBleGFtcGxlLCB0aGUgc2VxdWVuY2U6Ci0gKiAgICAgICAgICAgICAgUGFzc0VudiBGT08KLSAqICAgICAgICAgICAgICBTZXRFbnYgRk9PIG92ZXJyaWRlCi0gKiAgICAgICAgICAgQ2F1c2VzIEZPTyB0byB0YWtlIHRoZSB2YWx1ZSAnb3ZlcnJpZGUnLgotICogMjMuRmViLjk2IEFkZGVkIFVuc2V0RW52IGRpcmVjdGl2ZSB0byBhbGxvdyBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLSAqICAgICAgICAgICB0byBiZSByZW1vdmVkLgotICogICAgICAgICAgIFZpcnR1YWwgaG9zdHMgbm93ICdpbmhlcml0JyBwYXJlbnQgc2VydmVyIGVudmlyb25tZW50IHdoaWNoCi0gKiAgICAgICAgICAgdGhleSdyZSBhYmxlIHRvIG92ZXJ3cml0ZSB3aXRoIHRoZWlyIG93biBkaXJlY3RpdmVzIG9yCi0gKiAgICAgICAgICAgc2VsZWN0aXZlbHkgaWdub3JlIHdpdGggVW5zZXRFbnYuCi0gKiAgICAgICAqKiogSU1QT1JUQU5UIC0gdGhlIHdheSB0aGF0IHZpcnR1YWwgaG9zdHMgaW5oZXJpdCB0aGVpciAqKioKLSAqICAgICAgICoqKiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSB0aGUgZGVmYXVsdCBzZXJ2ZXIncyAgICAgICoqKgotICogICAgICAgKioqIGNvbmZpZ3VyYXRpb24gaGFzIGNoYW5nZWQuICBZb3Ugc2hvdWxkIHRlc3QgeW91ciAgICAgKioqCi0gKiAgICAgICAqKiogY29uZmlndXJhdGlvbiBjYXJlZnVsbHkgYmVmb3JlIGFjY2VwdGluZyB0aGlzICAgICAgICAqKioKLSAqICAgICAgICoqKiB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUgaW4gYSBsaXZlIHdlYnNlcnZlciB3aGljaCB1c2VkICoqKgotICogICAgICAgKioqIG9sZGVyIHZlcnNpb25zIG9mIHRoZSBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgKioqCi0gKi8KLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGFwX3RhYmxlX3QgKnZhcnM7Ci0gICAgY2hhciAqdW5zZXRlbnY7Ci0gICAgaW50IHZhcnNfcHJlc2VudDsKLX0gZW52X2Rpcl9jb25maWdfcmVjOwotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgZW52X21vZHVsZTsKLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9lbnZfZGlyX2NvbmZpZyhhcF9jb250ZXh0X3QgKnAsIGNoYXIgKmR1bW15KQotewotICAgIGVudl9kaXJfY29uZmlnX3JlYyAqbmV3ID0KLSAgICAoZW52X2Rpcl9jb25maWdfcmVjICopIGFwX3BhbGxvYyhwLCBzaXplb2YoZW52X2Rpcl9jb25maWdfcmVjKSk7Ci0gICAgbmV3LT52YXJzID0gYXBfbWFrZV90YWJsZShwLCA1MCk7Ci0gICAgbmV3LT51bnNldGVudiA9ICIiOwotICAgIG5ldy0+dmFyc19wcmVzZW50ID0gMDsKLSAgICByZXR1cm4gKHZvaWQgKikgbmV3OwotfQotCi1zdGF0aWMgdm9pZCAqbWVyZ2VfZW52X2Rpcl9jb25maWdzKGFwX2NvbnRleHRfdCAqcCwgdm9pZCAqYmFzZXYsIHZvaWQgKmFkZHYpCi17Ci0gICAgZW52X2Rpcl9jb25maWdfcmVjICpiYXNlID0gKGVudl9kaXJfY29uZmlnX3JlYyAqKSBiYXNldjsKLSAgICBlbnZfZGlyX2NvbmZpZ19yZWMgKmFkZCA9IChlbnZfZGlyX2NvbmZpZ19yZWMgKikgYWRkdjsKLSAgICBlbnZfZGlyX2NvbmZpZ19yZWMgKm5ldyA9Ci0gICAgKGVudl9kaXJfY29uZmlnX3JlYyAqKSBhcF9wYWxsb2MocCwgc2l6ZW9mKGVudl9kaXJfY29uZmlnX3JlYykpOwotCi0gICAgYXBfdGFibGVfdCAqbmV3X3RhYmxlOwotICAgIGFwX3RhYmxlX2VudHJ5X3QgKmVsdHM7Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmFycjsKLQotICAgIGludCBpOwotICAgIGNvbnN0IGNoYXIgKnVlbnYsICp1bnNldDsKLQotICAgIC8qIAotICAgICAqIG5ld190YWJsZSA9IGNvcHlfdGFibGUoIHAsIGJhc2UtPnZhcnMgKTsKLSAgICAgKiBmb3JlYWNoICRlbGVtZW50ICggQGFkZC0+dmFycyApIHsKLSAgICAgKiAgICAgdGFibGVfc2V0KCBuZXdfdGFibGUsICRlbGVtZW50LmtleSwgJGVsZW1lbnQudmFsICk7Ci0gICAgICogfTsKLSAgICAgKiBmb3JlYWNoICR1bnNldGVudiAoIEBVTlNFVEVOViApIHsKLSAgICAgKiAgICAgdGFibGVfdW5zZXQoIG5ld190YWJsZSwgJHVuc2V0ZW52ICk7Ci0gICAgICogfQotICAgICAqLwotCi0gICAgbmV3X3RhYmxlID0gYXBfY29weV90YWJsZShwLCBiYXNlLT52YXJzKTsKLQotICAgIGFyciA9IGFwX3RhYmxlX2VsdHMoYWRkLT52YXJzKTsKLSAgICBlbHRzID0gKGFwX3RhYmxlX2VudHJ5X3QgKilhcnItPmVsdHM7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgYXJyLT5uZWx0czsgKytpKSB7Ci0gICAgICAgIGFwX3RhYmxlX3NldG4obmV3X3RhYmxlLCBlbHRzW2ldLmtleSwgZWx0c1tpXS52YWwpOwotICAgIH0KLQotICAgIHVuc2V0ID0gYWRkLT51bnNldGVudjsKLSAgICB1ZW52ID0gYXBfZ2V0d29yZF9jb25mKHAsICZ1bnNldCk7Ci0gICAgd2hpbGUgKHVlbnZbMF0gIT0gJ1wwJykgewotICAgICAgICBhcF90YWJsZV91bnNldChuZXdfdGFibGUsIHVlbnYpOwotICAgICAgICB1ZW52ID0gYXBfZ2V0d29yZF9jb25mKHAsICZ1bnNldCk7Ci0gICAgfQotCi0gICAgbmV3LT52YXJzID0gbmV3X3RhYmxlOwotCi0gICAgbmV3LT52YXJzX3ByZXNlbnQgPSBiYXNlLT52YXJzX3ByZXNlbnQgfHwgYWRkLT52YXJzX3ByZXNlbnQ7Ci0KLSAgICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqYWRkX2Vudl9tb2R1bGVfdmFyc19wYXNzZWQoY21kX3Bhcm1zICpjbWQsCi0JCQkJCSAgICAgIGVudl9kaXJfY29uZmlnX3JlYyAqc2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXJnKQotewotICAgIGFwX3RhYmxlX3QgKnZhcnMgPSBzY29uZi0+dmFyczsKLSAgICBjaGFyICplbnZfdmFyOwotICAgIGNoYXIgKm5hbWVfcHRyOwotCi0gICAgd2hpbGUgKCphcmcpIHsKLSAgICAgICAgbmFtZV9wdHIgPSBhcF9nZXR3b3JkX2NvbmYoY21kLT5wb29sLCAmYXJnKTsKLSAgICAgICAgZW52X3ZhciA9IGdldGVudihuYW1lX3B0cik7Ci0gICAgICAgIGlmIChlbnZfdmFyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHNjb25mLT52YXJzX3ByZXNlbnQgPSAxOwotICAgICAgICAgICAgYXBfdGFibGVfc2V0bih2YXJzLCBuYW1lX3B0ciwgYXBfcHN0cmR1cChjbWQtPnBvb2wsIGVudl92YXIpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmFkZF9lbnZfbW9kdWxlX3ZhcnNfc2V0KGNtZF9wYXJtcyAqY21kLAotCQkJCQkgICBlbnZfZGlyX2NvbmZpZ19yZWMgKnNjb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBhcF90YWJsZV90ICp2YXJzID0gc2NvbmYtPnZhcnM7Ci0gICAgY2hhciAqbmFtZSwgKnZhbHVlOwotCi0gICAgbmFtZSA9IGFwX2dldHdvcmRfY29uZihjbWQtPnBvb2wsICZhcmcpOwotICAgIHZhbHVlID0gYXBfZ2V0d29yZF9jb25mKGNtZC0+cG9vbCwgJmFyZyk7Ci0KLSAgICAvKiBuYW1lIGlzIG1hbmRhdG9yeSwgdmFsdWUgaXMgb3B0aW9uYWwuICBubyB2YWx1ZSBtZWFucwotICAgICAqIHNldCB0aGUgdmFyaWFibGUgdG8gYW4gZW1wdHkgc3RyaW5nCi0gICAgICovCi0KLQotICAgIGlmICgoKm5hbWUgPT0gJ1wwJykgfHwgKCphcmcgIT0gJ1wwJykpIHsKLSAgICAgICAgcmV0dXJuICJTZXRFbnYgdGFrZXMgb25lIG9yIHR3byBhcmd1bWVudHMuICBBbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIGFuZCBhbiBvcHRpb25hbCB2YWx1ZSB0byBwYXNzIHRvIENHSS4iOwotICAgIH0KLQotICAgIHNjb25mLT52YXJzX3ByZXNlbnQgPSAxOwotICAgIGFwX3RhYmxlX3NldG4odmFycywgbmFtZSwgdmFsdWUpOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICphZGRfZW52X21vZHVsZV92YXJzX3Vuc2V0KGNtZF9wYXJtcyAqY21kLAotCQkJCQkgICAgIGVudl9kaXJfY29uZmlnX3JlYyAqc2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICphcmcpCi17Ci0gICAgc2NvbmYtPnVuc2V0ZW52ID0gc2NvbmYtPnVuc2V0ZW52ID8KLSAgICAgICAgYXBfcHN0cmNhdChjbWQtPnBvb2wsIHNjb25mLT51bnNldGVudiwgIiAiLCBhcmcsIE5VTEwpIDoKLSAgICAgICAgIGFyZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIGVudl9tb2R1bGVfY21kc1tdID0KLXsKLSAgICB7IlBhc3NFbnYiLCBhZGRfZW52X21vZHVsZV92YXJzX3Bhc3NlZCwgTlVMTCwKLSAgICAgT1JfRklMRUlORk8sIFJBV19BUkdTLCAiYSBsaXN0IG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBwYXNzIHRvIENHSS4ifSwKLSAgICB7IlNldEVudiIsIGFkZF9lbnZfbW9kdWxlX3ZhcnNfc2V0LCBOVUxMLAotICAgICBPUl9GSUxFSU5GTywgUkFXX0FSR1MsICJhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIGFuZCBhIHZhbHVlIHRvIHBhc3MgdG8gQ0dJLiJ9LAotICAgIHsiVW5zZXRFbnYiLCBhZGRfZW52X21vZHVsZV92YXJzX3Vuc2V0LCBOVUxMLAotICAgICBPUl9GSUxFSU5GTywgUkFXX0FSR1MsICJhIGxpc3Qgb2YgdmFyaWFibGVzIHRvIHJlbW92ZSBmcm9tIHRoZSBDR0kgZW52aXJvbm1lbnQuIn0sCi0gICAge05VTEx9LAotfTsKLQotc3RhdGljIGludCBmaXh1cF9lbnZfbW9kdWxlKHJlcXVlc3RfcmVjICpyKQotewotICAgIGFwX3RhYmxlX3QgKmUgPSByLT5zdWJwcm9jZXNzX2VudjsKLSAgICBlbnZfZGlyX2NvbmZpZ19yZWMgKnNjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcoci0+cGVyX2Rpcl9jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnZfbW9kdWxlKTsKLSAgICBhcF90YWJsZV90ICp2YXJzID0gc2NvbmYtPnZhcnM7Ci0KLSAgICBpZiAoIXNjb25mLT52YXJzX3ByZXNlbnQpCi0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLQotICAgIHItPnN1YnByb2Nlc3NfZW52ID0gYXBfb3ZlcmxheV90YWJsZXMoci0+cG9vbCwgZSwgdmFycyk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlZ2lzdGVyX2hvb2tzKHZvaWQpCi17Ci0gICAgYXBfaG9va19maXh1cHMoZml4dXBfZW52X21vZHVsZSxOVUxMLE5VTEwsSE9PS19NSURETEUpOwotfQotCi0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBlbnZfbW9kdWxlID0KLXsKLSAgICBTVEFOREFSRDIwX01PRFVMRV9TVFVGRiwKLSAgICBjcmVhdGVfZW52X2Rpcl9jb25maWcsICAgICAgLyogZGlyIGNvbmZpZyBjcmVhdGVyICovCi0gICAgbWVyZ2VfZW52X2Rpcl9jb25maWdzLCAgICAgIC8qIGRpciBtZXJnZXIgLS0tIGRlZmF1bHQgaXMgdG8gb3ZlcnJpZGUgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogc2VydmVyIGNvbmZpZyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBzZXJ2ZXIgY29uZmlncyAqLwotICAgIGVudl9tb2R1bGVfY21kcywgICAgICAgICAgICAvKiBjb21tYW5kIGFwX3RhYmxlX3QgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaGFuZGxlcnMgKi8KLSAgICByZWdpc3Rlcl9ob29rcyAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgaG9va3MgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL21ldGFkYXRhL21vZF9lbnYuZXhwIGIvbW9kdWxlcy9tZXRhZGF0YS9tb2RfZW52LmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ4N2JmMC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL21vZF9lbnYuZXhwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZW52X21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfZXhwaXJlcy5jIGIvbW9kdWxlcy9tZXRhZGF0YS9tb2RfZXhwaXJlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTRlYzZhLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX2V4cGlyZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVQnUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogbW9kX2V4cGlyZXMuYwotICogdmVyc2lvbiAwLjAuMTEKLSAqIHN0YXR1cyBiZXRhCi0gKiAKLSAqIEFuZHJldyBXaWxzb24gPEFuZHJldy5XaWxzb25AY20uY2YuYWMudWs+IDI2Lkphbi45NgotICoKLSAqIFRoaXMgbW9kdWxlIGFsbG93cyB5b3UgdG8gY29udHJvbCB0aGUgZm9ybSBvZiB0aGUgRXhwaXJlczogaGVhZGVyCi0gKiB0aGF0IEFwYWNoZSBpc3N1ZXMgZm9yIGVhY2ggYWNjZXNzLiAgRGlyZWN0aXZlcyBjYW4gYXBwZWFyIGluCi0gKiBjb25maWd1cmF0aW9uIGZpbGVzIG9yIGluIC5odGFjY2VzcyBmaWxlcyBzbyBleHBpcnkgc2VtYW50aWNzIGNhbgotICogYmUgZGVmaW5lZCBvbiBhIHBlci1kaXJlY3RvcnkgYmFzaXMuICAKLSAqCi0gKiBESVJFQ1RJVkUgU1lOVEFYCi0gKgotICogVmFsaWQgZGlyZWN0aXZlcyBhcmU6Ci0gKgotICogICAgIEV4cGlyZXNBY3RpdmUgb24gfCBvZmYKLSAqICAgICBFeHBpcmVzRGVmYXVsdCA8Y29kZT48c2Vjb25kcz4KLSAqICAgICBFeHBpcmVzQnlUeXBlIHR5cGUvZW5jb2RpbmcgPGNvZGU+PHNlY29uZHM+Ci0gKgotICogVmFsaWQgdmFsdWVzIGZvciA8Y29kZT4gYXJlOgotICoKLSAqICAgICAnTScgICAgICBleHBpcmVzIGhlYWRlciBzaG93cyBmaWxlIG1vZGlmaWNhdGlvbiBkYXRlICsgPHNlY29uZHM+Ci0gKiAgICAgJ0EnICAgICAgZXhwaXJlcyBoZWFkZXIgc2hvd3MgYWNjZXNzIHRpbWUgKyA8c2Vjb25kcz4KLSAqCi0gKiAgICAgICAgICAgICAgW0knbSBub3Qgc3VyZSB3aGljaCBvZiB0aGVzZSBpcyBiZXN0IHVuZGVyIGRpZmZlcmVudAotICogICAgICAgICAgICAgIGNpcmN1bXN0YW5jZXMsIEkgZ3Vlc3MgaXQncyBmb3Igb3RoZXIgcGVvcGxlIHRvIGV4cGxvcmUuCi0gKiAgICAgICAgICAgICAgVGhlIGVmZmVjdHMgbWF5IGJlIGluZGlzdGluZ3Vpc2hhYmxlIGZvciBhIG51bWJlciBvZiBjYXNlc10KLSAqCi0gKiA8c2Vjb25kcz4gc2hvdWxkIGJlIGFuIGludGVnZXIgdmFsdWUgW2FjY2VwdGFibGUgdG8gYXRvaSgpXQotICoKLSAqIFRoZXJlIGlzIE5PIHNwYWNlIGJldHdlZW4gdGhlIDxjb2RlPiBhbmQgPHNlY29uZHM+LgotICoKLSAqIEZvciBleGFtcGxlLCBhIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiB3aGljaCBjaGFuZ2VzCi0gKiBmcmVxdWVudGx5IG1pZ2h0IGNvbnRhaW46Ci0gKgotICogICAgICMgcmVwb3J0cyBnZW5lcmF0ZWQgYnkgY3JvbiBldmVyeSBob3VyLiAgZG9uJ3QgbGV0IGNhY2hlcwotICogICAgICMgaG9sZCBvbnRvIHN0YWxlIGluZm9ybWF0aW9uCi0gKiAgICAgRXhwaXJlc0RlZmF1bHQgTTM2MDAKLSAqCi0gKiBBbm90aGVyIGV4YW1wbGUsIG91ciBodG1sIHBhZ2VzIGNhbiBjaGFuZ2UgYWxsIHRoZSB0aW1lLCB0aGUgZ2lmcwotICogdGVuZCBub3QgdG8gY2hhbmdlIG9mdGVuOgotICogCi0gKiAgICAgIyBwYWdlcyBhcmUgaG90ICgxIHdlZWspLCBpbWFnZXMgYXJlIGNvbGQgKDEgbW9udGgpCi0gKiAgICAgRXhwaXJlc0J5VHlwZSB0ZXh0L2h0bWwgQTYwNDgwMAotICogICAgIEV4cGlyZXNCeVR5cGUgaW1hZ2UvZ2lmIEEyNTkyMDAwCi0gKgotICogRXhwaXJlcyBjYW4gYmUgdHVybmVkIG9uIGZvciBhbGwgVVJMcyBvbiB0aGUgc2VydmVyIGJ5IHBsYWNpbmcgdGhlCi0gKiBmb2xsb3dpbmcgZGlyZWN0aXZlIGluIGEgY29uZiBmaWxlOgotICoKLSAqICAgICBFeHBpcmVzQWN0aXZlIG9uCi0gKgotICogRXhwaXJlc0FjdGl2ZSBjYW4gYWxzbyBhcHBlYXIgaW4gLmh0YWNjZXNzIGZpbGVzLCBlbmFibGluZyB0aGUKLSAqIGJlaGF2aW91ciB0byBiZSB0dXJuZWQgb24gb3Igb2ZmIGZvciBlYWNoIGNob3NlbiBkaXJlY3RvcnkuCi0gKgotICogICAgICMgdHVybiBvZmYgRXhwaXJlcyBiZWhhdmlvdXIgaW4gdGhpcyBkaXJlY3RvcnkKLSAqICAgICAjIGFuZCBzdWJkaXJlY3RvcmllcwotICogICAgIEV4cGlyZXNBY3RpdmUgb2ZmCi0gKgotICogRGlyZWN0aXZlcyBkZWZpbmVkIGZvciBhIGRpcmVjdG9yeSBhcmUgdmFsaWQgaW4gc3ViZGlyZWN0b3JpZXMKLSAqIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4gYnkgbmV3IGRpcmVjdGl2ZXMgaW4gdGhlIHN1YmRpcmVjdG9yeQotICogLmh0YWNjZXNzIGZpbGVzLgotICoKLSAqIEFMVEVSTkFUSVZFIERJUkVDVElWRSBTWU5UQVgKLSAqCi0gKiBEaXJlY3RpdmVzIGNhbiBhbHNvIGJlIGRlZmluZWQgaW4gYSBtb3JlIHJlYWRhYmxlIHN5bnRheCBvZiB0aGUgZm9ybToKLSAqCi0gKiAgICAgRXhwaXJlc0RlZmF1bHQgIjxiYXNlPiBbcGx1c10gezxudW0+IDx0eXBlPn0qIgotICogICAgIEV4cGlyZXNCeVR5cGUgdHlwZS9lbmNvZGluZyAiPGJhc2U+IFtwbHVzXSB7PG51bT4gPHR5cGU+fSoiCi0gKgotICogd2hlcmUgPGJhc2U+IGlzIG9uZSBvZjoKLSAqICAgICAgYWNjZXNzICAKLSAqICAgICAgbm93ICAgICAgICAgICAgIGVxdWl2YWxlbnQgdG8gJ2FjY2VzcycKLSAqICAgICAgbW9kaWZpY2F0aW9uCi0gKgotICogd2hlcmUgdGhlICdwbHVzJyBrZXl3b3JkIGlzIG9wdGlvbmFsCi0gKgotICogd2hlcmUgPG51bT4gc2hvdWxkIGJlIGFuIGludGVnZXIgdmFsdWUgW2FjY2VwdGFibGUgdG8gYXRvaSgpXQotICoKLSAqIHdoZXJlIDx0eXBlPiBpcyBvbmUgb2Y6Ci0gKiAgICAgIHllYXJzCi0gKiAgICAgIG1vbnRocwotICogICAgICB3ZWVrcwotICogICAgICBkYXlzCi0gKiAgICAgIGhvdXJzCi0gKiAgICAgIG1pbnV0ZXMKLSAqICAgICAgc2Vjb25kcwotICoKLSAqIEZvciBleGFtcGxlLCBhbnkgb2YgdGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzIGNhbiBiZSB1c2VkIHRvIG1ha2UKLSAqIGRvY3VtZW50cyBleHBpcmUgMSBtb250aCBhZnRlciBiZWluZyBhY2Nlc3NlZCwgYnkgZGVmYXVsdDoKLSAqCi0gKiAgICAgIEV4cGlyZXNEZWZhdWx0ICJhY2Nlc3MgcGx1cyAxIG1vbnRoIgotICogICAgICBFeHBpcmVzRGVmYXVsdCAiYWNjZXNzIHBsdXMgNCB3ZWVrcyIKLSAqICAgICAgRXhwaXJlc0RlZmF1bHQgImFjY2VzcyBwbHVzIDMwIGRheXMiCi0gKgotICogVGhlIGV4cGlyeSB0aW1lIGNhbiBiZSBmaW5lLXR1bmVkIGJ5IGFkZGluZyBzZXZlcmFsICc8bnVtPiA8dHlwZT4nCi0gKiBjbGF1c2VzOgotICoKLSAqICAgICAgRXhwaXJlc0J5VHlwZSB0ZXh0L2h0bWwgImFjY2VzcyBwbHVzIDEgbW9udGggMTUgZGF5cyAyIGhvdXJzIgotICogICAgICBFeHBpcmVzQnlUeXBlIGltYWdlL2dpZiAibW9kaWZpY2F0aW9uIHBsdXMgNSBob3VycyAzIG1pbnV0ZXMiCi0gKgotICogLS0tCi0gKgotICogQ2hhbmdlLWxvZzoKLSAqIDI5Lkphbi45NiAgICBIYXJkZW5lZCB0aGUgYWRkXyogZnVuY3Rpb25zLiAgU2VydmVyIHdpbGwgbm93IGJhaWwgb3V0Ci0gKiAgICAgICAgICAgICAgaWYgYmFkIGRpcmVjdGl2ZXMgYXJlIGdpdmVuIGluIHRoZSBjb25mIGZpbGVzLgotICogMDIuRmViLjk2ICAgIFJldHVybnMgREVDTElORUQgaWYgbm90ICdFeHBpcmVzQWN0aXZlIG9uJywgZ2l2aW5nIG90aGVyCi0gKiAgICAgICAgICAgICAgZXhwaXJlcy1hd2FyZSBtb2R1bGVzIGEgY2hhbmNlIHRvIHBsYXkgd2l0aCB0aGUgc2FtZQotICogICAgICAgICAgICAgIGRpcmVjdGl2ZXMuIFtNaWNoYWVsIFJ1dG1hbl0KLSAqIDAzLkZlYi45NiAgICBDYWxsIHR6c2V0KCkgYmVmb3JlIGxvY2FsdGltZSgpLiAgVHJ5aW5nIHRvIGdldCB0aGUgbW9kdWxlCi0gKiAgICAgICAgICAgICAgdG8gd29yayBwcm9wZXJseSBpbiBub24gR01UIHRpbWV6b25lcy4KLSAqIDEyLkZlYi45NiAgICBNb2RpZmllZCBkaXJlY3RpdmUgc3ludGF4IHRvIGFsbG93IG1vcmUgcmVhZGFibGUgY29tbWFuZHM6Ci0gKiAgICAgICAgICAgICAgICBFeHBpcmVzRGVmYXVsdCAibm93IHBsdXMgMTAgZGF5cyAyMCBzZWNvbmRzIgotICogICAgICAgICAgICAgICAgRXhwaXJlc0RlZmF1bHQgImFjY2VzcyBwbHVzIDMwIGRheXMiCi0gKiAgICAgICAgICAgICAgICBFeHBpcmVzRGVmYXVsdCAibW9kaWZpY2F0aW9uIHBsdXMgMSB5ZWFyIDEwIG1vbnRocyAzMCBkYXlzIgotICogMTMuRmViLjk2ICAgIEZpeCBjYWxsIHRvIHRhYmxlX2dldCgpIHdpdGggTlVMTCAybmQgcGFyYW1ldGVyIFtSb2IgSGFydGlsbF0KLSAqIDE5LkZlYi45NiAgICBDYWxsIGdtX3RpbWVzdHJfODIyKCkgdG8gZ2V0IHRpbWUgZm9ybWF0dGVkIGNvcnJlY3RseSwgY2FuJ3QKLSAqICAgICAgICAgICAgICByZWx5IG9uIHByZXNlbmNlIG9mIEhUVFBfVElNRV9GT1JNQVQgaW4gQXBhY2hlIDEuMSsuCi0gKiAyMS5GZWIuOTYgICAgVGhpcyB2ZXJzaW9uICgwLjAuOSkgcmV2ZXJzZXMgYXNzdW1wdGlvbnMgbWFkZSBpbiAwLjAuOAotICogICAgICAgICAgICAgIGFib3V0IHN0YXIvc3RhciBoYW5kbGVycy4gIFJldmVydGluZyB0byAwLjAuNyBiZWhhdmlvdXIuCi0gKiAwOC5KdW4uOTYgICAgYWxsb3dzIEV4cGlyZXNEZWZhdWx0IHRvIGJlIHVzZWQgd2l0aCByZXNwb25zZXMgdGhhdCB1c2UgCi0gKiAgICAgICAgICAgICAgdGhlIERlZmF1bHRUeXBlIGJ5IG5vdCBERUNMSU5JTkcsIGJ1dCBpbnN0ZWFkIHNraXBwaW5nIAotICogICAgICAgICAgICAgIHRoZSB0YWJsZV9nZXQgY2hlY2sgYW5kIHRoZW4gbG9va2luZyBmb3IgYW4gRXhwaXJlc0RlZmF1bHQuCi0gKiAgICAgICAgICAgICAgW1JvYiBIYXJ0aWxsXQotICogMDQuTm92Ljk2ICAgICdjb25zdCcgZGVmaW5pdGlvbnMgYWRkZWQuCi0gKgotICogVE9ETwotICogYWRkIHN1cHBvcnQgZm9yIENhY2hlLUNvbnRyb2w6IG1heC1hZ2U9MjAgZnJvbSB0aGUgSFRUUC8xLjEKLSAqIHByb3Bvc2FsIChpbiB0aGlzIGNhc2UsIGEgdHRsIG9mIDIwIHNlY29uZHMpIFthc2sgcm95XQotICogYWRkIHBlci1maWxlIGV4cGlyeSBhbmQgZXhwbGljaXQgZXhwaXJ5IHRpbWVzIC0gZHVwbGljYXRlcyBzb21lCi0gKiBvZiB0aGUgbW9kX2Nlcm5fbWV0YS5jIGZ1bmN0aW9uYWxpdHkuICBlZzoKLSAqICAgICAgICAgICAgICBFeHBpcmVzRXhwbGljaXQgaW5kZXguaHRtbCAibW9kaWZpY2F0aW9uIHBsdXMgMzAgZGF5cyIKLSAqCi0gKiBCVUdTCi0gKiBIaSwgd2VsY29tZSB0byB0aGUgaW50ZXJuZXQuCi0gKi8KLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2lmZGVmIEhBVkVfQ1RZUEVfSAotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCBhY3RpdmU7Ci0gICAgY2hhciAqZXhwaXJlc2RlZmF1bHQ7Ci0gICAgYXBfdGFibGVfdCAqZXhwaXJlc2J5dHlwZTsKLX0gZXhwaXJlc19kaXJfY29uZmlnOwotCi0vKiBmcm9tIG1vZF9kaXIsIHdoeSBpcyB0aGlzIGFsaWFzIHVzZWQ/Ci0gKi8KLSNkZWZpbmUgRElSX0NNRF9QRVJNUyBPUl9JTkRFWEVTCi0KLSNkZWZpbmUgQUNUSVZFX09OICAgICAgIDEKLSNkZWZpbmUgQUNUSVZFX09GRiAgICAgIDAKLSNkZWZpbmUgQUNUSVZFX0RPTlRDQVJFIDIKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGV4cGlyZXNfbW9kdWxlOwotCi1zdGF0aWMgdm9pZCAqY3JlYXRlX2Rpcl9leHBpcmVzX2NvbmZpZyhhcF9jb250ZXh0X3QgKnAsIGNoYXIgKmR1bW15KQotewotICAgIGV4cGlyZXNfZGlyX2NvbmZpZyAqbmV3ID0KLSAgICAoZXhwaXJlc19kaXJfY29uZmlnICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKGV4cGlyZXNfZGlyX2NvbmZpZykpOwotICAgIG5ldy0+YWN0aXZlID0gQUNUSVZFX0RPTlRDQVJFOwotICAgIG5ldy0+ZXhwaXJlc2RlZmF1bHQgPSAiIjsKLSAgICBuZXctPmV4cGlyZXNieXR5cGUgPSBhcF9tYWtlX3RhYmxlKHAsIDQpOwotICAgIHJldHVybiAodm9pZCAqKSBuZXc7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfZXhwaXJlc2FjdGl2ZShjbWRfcGFybXMgKmNtZCwgZXhwaXJlc19kaXJfY29uZmlnICogZGlyX2NvbmZpZywgaW50IGFyZykKLXsKLSAgICAvKiBpZiB3ZSdyZSBoZXJlIGF0IGFsbCBpdCdzIGJlY2F1c2Ugc29tZW9uZSBleHBsaWNpdGx5Ci0gICAgICogc2V0IHRoZSBhY3RpdmUgZmxhZwotICAgICAqLwotICAgIGRpcl9jb25maWctPmFjdGl2ZSA9IEFDVElWRV9PTjsKLSAgICBpZiAoYXJnID09IDApIHsKLSAgICAgICAgZGlyX2NvbmZpZy0+YWN0aXZlID0gQUNUSVZFX09GRjsKLSAgICB9OwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKiBjaGVja19jb2RlKCkgcGFyc2UgJ2NvZGUnIGFuZCByZXR1cm4gTlVMTCBvciBhbiBlcnJvciByZXNwb25zZQotICogc3RyaW5nLiAgSWYgd2UgcmV0dXJuIE5VTEwgdGhlbiByZWFsX2NvZGUgY29udGFpbnMgY29kZSBjb252ZXJ0ZWQKLSAqIHRvIHRoZSBjbm5ubiBmb3JtYXQuCi0gKi8KLXN0YXRpYyBjaGFyICpjaGVja19jb2RlKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqY29kZSwgY2hhciAqKnJlYWxfY29kZSkKLXsKLSAgICBjaGFyICp3b3JkOwotICAgIGNoYXIgYmFzZSA9ICdYJzsKLSAgICBpbnQgbW9kaWZpZXIgPSAwOwotICAgIGludCBudW0gPSAwOwotICAgIGludCBmYWN0b3IgPSAwOwotCi0gICAgLyogMC4wLjQgY29tcGF0aWJpbGl0eT8KLSAgICAgKi8KLSAgICBpZiAoKGNvZGVbMF0gPT0gJ0EnKSB8fCAoY29kZVswXSA9PSAnTScpKSB7Ci0gICAgICAgICpyZWFsX2NvZGUgPSAoY2hhciAqKWNvZGU7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH07Ci0KLSAgICAvKiA8YmFzZT4gW3BsdXNdIHs8bnVtPiA8dHlwZT59KgotICAgICAqLwotCi0gICAgLyogPGJhc2U+Ci0gICAgICovCi0gICAgd29yZCA9IGFwX2dldHdvcmRfY29uZihwLCAmY29kZSk7Ci0gICAgaWYgKCFzdHJuY2FzZWNtcCh3b3JkLCAibm93IiwgMSkgfHwKLSAgICAgICAgIXN0cm5jYXNlY21wKHdvcmQsICJhY2Nlc3MiLCAxKSkgewotICAgICAgICBiYXNlID0gJ0EnOwotICAgIH0KLSAgICBlbHNlIGlmICghc3RybmNhc2VjbXAod29yZCwgIm1vZGlmaWNhdGlvbiIsIDEpKSB7Ci0gICAgICAgIGJhc2UgPSAnTSc7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXR1cm4gYXBfcHN0cmNhdChwLCAiYmFkIGV4cGlyZXMgY29kZSwgdW5yZWNvZ25pc2VkIDxiYXNlPiAnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgd29yZCwgIiciLCBOVUxMKTsKLSAgICB9OwotCi0gICAgLyogW3BsdXNdCi0gICAgICovCi0gICAgd29yZCA9IGFwX2dldHdvcmRfY29uZihwLCAmY29kZSk7Ci0gICAgaWYgKCFzdHJuY2FzZWNtcCh3b3JkLCAicGx1cyIsIDEpKSB7Ci0gICAgICAgIHdvcmQgPSBhcF9nZXR3b3JkX2NvbmYocCwgJmNvZGUpOwotICAgIH07Ci0KLSAgICAvKiB7PG51bT4gPHR5cGU+fSoKLSAgICAgKi8KLSAgICB3aGlsZSAod29yZFswXSkgewotICAgICAgICAvKiA8bnVtPgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGFwX2lzZGlnaXQod29yZFswXSkpIHsKLSAgICAgICAgICAgIG51bSA9IGF0b2kod29yZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gYXBfcHN0cmNhdChwLCAiYmFkIGV4cGlyZXMgY29kZSwgbnVtZXJpYyB2YWx1ZSBleHBlY3RlZCA8bnVtPiAnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQsICInIiwgTlVMTCk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgLyogPHR5cGU+Ci0gICAgICAgICAqLwotICAgICAgICB3b3JkID0gYXBfZ2V0d29yZF9jb25mKHAsICZjb2RlKTsKLSAgICAgICAgaWYgKHdvcmRbMF0pIHsKLSAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBhcF9wc3RyY2F0KHAsICJiYWQgZXhwaXJlcyBjb2RlLCBtaXNzaW5nIDx0eXBlPiIsIE5VTEwpOwotICAgICAgICB9OwotCi0gICAgICAgIGZhY3RvciA9IDA7Ci0gICAgICAgIGlmICghc3RybmNhc2VjbXAod29yZCwgInllYXJzIiwgMSkpIHsKLSAgICAgICAgICAgIGZhY3RvciA9IDYwICogNjAgKiAyNCAqIDM2NTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghc3RybmNhc2VjbXAod29yZCwgIm1vbnRocyIsIDIpKSB7Ci0gICAgICAgICAgICBmYWN0b3IgPSA2MCAqIDYwICogMjQgKiAzMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghc3RybmNhc2VjbXAod29yZCwgIndlZWtzIiwgMSkpIHsKLSAgICAgICAgICAgIGZhY3RvciA9IDYwICogNjAgKiAyNCAqIDc7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0cm5jYXNlY21wKHdvcmQsICJkYXlzIiwgMSkpIHsKLSAgICAgICAgICAgIGZhY3RvciA9IDYwICogNjAgKiAyNDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghc3RybmNhc2VjbXAod29yZCwgImhvdXJzIiwgMSkpIHsKLSAgICAgICAgICAgIGZhY3RvciA9IDYwICogNjA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIXN0cm5jYXNlY21wKHdvcmQsICJtaW51dGVzIiwgMikpIHsKLSAgICAgICAgICAgIGZhY3RvciA9IDYwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCh3b3JkLCAic2Vjb25kcyIsIDEpKSB7Ci0gICAgICAgICAgICBmYWN0b3IgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGFwX3BzdHJjYXQocCwgImJhZCBleHBpcmVzIGNvZGUsIHVucmVjb2duaXNlZCA8dHlwZT4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiciLCB3b3JkLCAiJyIsIE5VTEwpOwotICAgICAgICB9OwotCi0gICAgICAgIG1vZGlmaWVyID0gbW9kaWZpZXIgKyBmYWN0b3IgKiBudW07Ci0KLSAgICAgICAgLyogbmV4dCA8bnVtPgotICAgICAgICAgKi8KLSAgICAgICAgd29yZCA9IGFwX2dldHdvcmRfY29uZihwLCAmY29kZSk7Ci0gICAgfTsKLQotICAgICpyZWFsX2NvZGUgPSBhcF9wc3ByaW50ZihwLCAiJWMlZCIsIGJhc2UsIG1vZGlmaWVyKTsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2V4cGlyZXNieXR5cGUoY21kX3Bhcm1zICpjbWQsIGV4cGlyZXNfZGlyX2NvbmZpZyAqIGRpcl9jb25maWcsIGNoYXIgKm1pbWUsIGNoYXIgKmNvZGUpCi17Ci0gICAgY2hhciAqcmVzcG9uc2UsICpyZWFsX2NvZGU7Ci0KLSAgICBpZiAoKHJlc3BvbnNlID0gY2hlY2tfY29kZShjbWQtPnBvb2wsIGNvZGUsICZyZWFsX2NvZGUpKSA9PSBOVUxMKSB7Ci0gICAgICAgIGFwX3RhYmxlX3NldG4oZGlyX2NvbmZpZy0+ZXhwaXJlc2J5dHlwZSwgbWltZSwgcmVhbF9jb2RlKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfTsKLSAgICByZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsCi0gICAgICAgICAgICAgICAgICInRXhwaXJlc0J5VHlwZSAiLCBtaW1lLCAiICIsIGNvZGUsICInOiAiLCByZXNwb25zZSwgTlVMTCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfZXhwaXJlc2RlZmF1bHQoY21kX3Bhcm1zICpjbWQsIGV4cGlyZXNfZGlyX2NvbmZpZyAqIGRpcl9jb25maWcsIGNoYXIgKmNvZGUpCi17Ci0gICAgY2hhciAqcmVzcG9uc2UsICpyZWFsX2NvZGU7Ci0KLSAgICBpZiAoKHJlc3BvbnNlID0gY2hlY2tfY29kZShjbWQtPnBvb2wsIGNvZGUsICZyZWFsX2NvZGUpKSA9PSBOVUxMKSB7Ci0gICAgICAgIGRpcl9jb25maWctPmV4cGlyZXNkZWZhdWx0ID0gcmVhbF9jb2RlOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9OwotICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAiJ0V4cGlyZXNEZWZhdWx0ICIsIGNvZGUsICInOiAiLCByZXNwb25zZSwgTlVMTCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBleHBpcmVzX2NtZHNbXSA9Ci17Ci0gICAgeyJFeHBpcmVzQWN0aXZlIiwgc2V0X2V4cGlyZXNhY3RpdmUsIE5VTEwsIERJUl9DTURfUEVSTVMsIEZMQUcsCi0gICAgICJMaW1pdGVkIHRvICdvbicgb3IgJ29mZicifSwKLSAgICB7IkV4cGlyZXNCeXR5cGUiLCBzZXRfZXhwaXJlc2J5dHlwZSwgTlVMTCwgRElSX0NNRF9QRVJNUywgVEFLRTIsCi0gICAgICJhIE1JTUUgdHlwZSBmb2xsb3dlZCBieSBhbiBleHBpcnkgZGF0ZSBjb2RlIn0sCi0gICAgeyJFeHBpcmVzRGVmYXVsdCIsIHNldF9leHBpcmVzZGVmYXVsdCwgTlVMTCwgRElSX0NNRF9QRVJNUywgVEFLRTEsCi0gICAgICJhbiBleHBpcnkgZGF0ZSBjb2RlIn0sCi0gICAge05VTEx9Ci19OwotCi1zdGF0aWMgdm9pZCAqbWVyZ2VfZXhwaXJlc19kaXJfY29uZmlncyhhcF9jb250ZXh0X3QgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICphZGR2KQotewotICAgIGV4cGlyZXNfZGlyX2NvbmZpZyAqbmV3ID0gKGV4cGlyZXNfZGlyX2NvbmZpZyAqKSBhcF9wY2FsbG9jKHAsIHNpemVvZihleHBpcmVzX2Rpcl9jb25maWcpKTsKLSAgICBleHBpcmVzX2Rpcl9jb25maWcgKmJhc2UgPSAoZXhwaXJlc19kaXJfY29uZmlnICopIGJhc2V2OwotICAgIGV4cGlyZXNfZGlyX2NvbmZpZyAqYWRkID0gKGV4cGlyZXNfZGlyX2NvbmZpZyAqKSBhZGR2OwotCi0gICAgaWYgKGFkZC0+YWN0aXZlID09IEFDVElWRV9ET05UQ0FSRSkgewotICAgICAgICBuZXctPmFjdGl2ZSA9IGJhc2UtPmFjdGl2ZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIG5ldy0+YWN0aXZlID0gYWRkLT5hY3RpdmU7Ci0gICAgfTsKLQotICAgIGlmIChhZGQtPmV4cGlyZXNkZWZhdWx0ICE9ICdcMCcpIHsKLSAgICAgICAgbmV3LT5leHBpcmVzZGVmYXVsdCA9IGFkZC0+ZXhwaXJlc2RlZmF1bHQ7Ci0gICAgfTsKLQotICAgIG5ldy0+ZXhwaXJlc2J5dHlwZSA9IGFwX292ZXJsYXlfdGFibGVzKHAsIGFkZC0+ZXhwaXJlc2J5dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5leHBpcmVzYnl0eXBlKTsKLSAgICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgaW50IGFkZF9leHBpcmVzKHJlcXVlc3RfcmVjICpyKQotewotICAgIGV4cGlyZXNfZGlyX2NvbmZpZyAqY29uZjsKLSAgICBjaGFyICpjb2RlOwotICAgIGFwX3RpbWVfdCBiYXNlOwotICAgIGFwX3RpbWVfdCBhZGRpdGlvbmFsOwotICAgIGFwX3RpbWVfdCBleHBpcmVzOwotICAgIGNoYXIgKnRpbWVzdHI7Ci0KLSAgICBpZiAoYXBfaXNfSFRUUF9FUlJPUihyLT5zdGF0dXMpKSAgICAgICAvKiBEb24ndCBhZGQgRXhwaXJlcyBoZWFkZXJzIHRvIGVycm9ycyAqLwotICAgICAgICByZXR1cm4gREVDTElORUQ7Ci0KLSAgICBpZiAoci0+bWFpbiAhPSBOVUxMKSAgICAgICAgLyogU2F5IG5vIHRvIHN1YnJlcXVlc3RzICovCi0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLQotICAgIGNvbmYgPSAoZXhwaXJlc19kaXJfY29uZmlnICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnBlcl9kaXJfY29uZmlnLCAmZXhwaXJlc19tb2R1bGUpOwotICAgIGlmIChjb25mID09IE5VTEwpIHsKLSAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLSAgICAgICAgICAgICAgICAgICAgImludGVybmFsIGVycm9yOiAlcyIsIHItPmZpbGVuYW1lKTsKLSAgICAgICAgcmV0dXJuIFNFUlZFUl9FUlJPUjsKLSAgICB9OwotCi0gICAgaWYgKGNvbmYtPmFjdGl2ZSAhPSBBQ1RJVkVfT04pCi0gICAgICAgIHJldHVybiBERUNMSU5FRDsKLQotICAgIC8qIHdlIHBlcmhhcHMgY291bGQgdXNlIHRoZSBkZWZhdWx0X3R5cGUocikgaW4gaXRzIHBsYWNlIGJ1dCB0aGF0Ci0gICAgICogbWF5IGJlIDJuZCBndWVzaW5nIHRoZSBkZXNpcmVkIGNvbmZpZ3VyYXRpb24uLi4gIGNhbGxpbmcgdGFibGVfZ2V0Ci0gICAgICogd2l0aCBhIE5VTEwga2V5IHdpbGwgU0VHViB1cwotICAgICAqCi0gICAgICogSSBzdGlsbCBkb24ndCBrbm93ICp3aHkqIHItPmNvbnRlbnRfdHlwZSB3b3VsZCBldmVyIGJlIE5VTEwsIHRoaXMKLSAgICAgKiBpcyBwb3NzaWJseSBhIHJlc3VsdCBvZiBmaXh1cHMgYmVpbmcgY2FsbGVkIGluIG1hbnkgZGlmZmVyZW50Ci0gICAgICogcGxhY2VzLiAgRml4dXBzIGlzIHByb2JhYmx5IHRoZSB3cm9uZyBwbGFjZSB0byBiZSBkb2luZyBhbGwgdGhpcwotICAgICAqIHdvcmsuLi4gIEJhaC4KLSAgICAgKgotICAgICAqIENoYW5nZWQgYXMgb2YgMDguSnVuLjk2IGRvbid0IERFQ0xJTkUsIGxvb2sgZm9yIGFuIEV4cGlyZXNEZWZhdWx0LgotICAgICAqLwotICAgIGlmIChyLT5jb250ZW50X3R5cGUgPT0gTlVMTCkKLSAgICAgICAgY29kZSA9IE5VTEw7Ci0gICAgZWxzZQotICAgICAgICBjb2RlID0gKGNoYXIgKikgYXBfdGFibGVfZ2V0KGNvbmYtPmV4cGlyZXNieXR5cGUsIHItPmNvbnRlbnRfdHlwZSk7Ci0KLSAgICBpZiAoY29kZSA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIG5vIGV4cGlyZXMgZGVmaW5lZCBmb3IgdGhhdCB0eXBlLCBpcyB0aGVyZSBhIGRlZmF1bHQ/ICovCi0gICAgICAgIGNvZGUgPSBjb25mLT5leHBpcmVzZGVmYXVsdDsKLQotICAgICAgICBpZiAoY29kZVswXSA9PSAnXDAnKQotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgIH07Ci0KLSAgICAvKiB3ZSBoYXZlIG91ciBjb2RlICovCi0KLSAgICBzd2l0Y2ggKGNvZGVbMF0pIHsKLSAgICBjYXNlICdNJzoKLQlpZiAoci0+ZmluZm8ucHJvdGVjdGlvbiA9PSAwKSB7IAotCSAgICAvKiBmaWxlIGRvZXNuJ3QgZXhpc3Qgb24gZGlzaywgc28gd2UgY2FuJ3QgZG8gYW55dGhpbmcgYmFzZWQgb24KLQkgICAgICogbW9kaWZpY2F0aW9uIHRpbWUuICBOb3RlIHRoYXQgdGhpcyBkb2VzIF9ub3RfIGxvZyBhbiBlcnJvci4KLQkgICAgICovCi0JICAgIHJldHVybiBERUNMSU5FRDsKLQl9Ci0JYmFzZSA9IHItPmZpbmZvLm10aW1lOwotICAgICAgICBhZGRpdGlvbmFsID0gYXRvaSgmY29kZVsxXSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0EnOgotICAgICAgICAvKiB0aGVyZSdzIGJlZW4gc29tZSBkaXNjdXNzaW9uIGFuZCBpdCdzIHBvc3NpYmxlIHRoYXQgCi0gICAgICAgICAqICdhY2Nlc3MgdGltZScgd2lsbCBiZSBzdG9yZWQgaW4gcmVxdWVzdCBzdHJ1Y3R1cmUKLSAgICAgICAgICovCi0gICAgICAgIGJhc2UgPSByLT5yZXF1ZXN0X3RpbWU7Ci0gICAgICAgIGFkZGl0aW9uYWwgPSBhdG9pKCZjb2RlWzFdKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgLyogZXhwZWN0aW5nIHRoZSBhZGRfKiByb3V0aW5lcyB0byBiZSBjYXNlLWhhcmRlbmVkIHRoaXMgCi0gICAgICAgICAqIGlzIGp1c3QgYSByZW1pbmRlciB0aGF0IG1vZHVsZSBpcyBiZXRhCi0gICAgICAgICAqLwotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotICAgICAgICAgICAgICAgICAgICAiaW50ZXJuYWwgZXJyb3I6IGJhZCBleHBpcmVzIGNvZGU6ICVzIiwgci0+ZmlsZW5hbWUpOwotICAgICAgICByZXR1cm4gU0VSVkVSX0VSUk9SOwotICAgIH07Ci0KLSAgICBleHBpcmVzID0gYmFzZSArIGFkZGl0aW9uYWw7Ci0gICAgYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX291dCwgIkNhY2hlLUNvbnRyb2wiLAotCWFwX3BzcHJpbnRmKHItPnBvb2wsICJtYXgtYWdlPSVxZCIsCi0JICAgIChleHBpcmVzIC0gci0+cmVxdWVzdF90aW1lKSAvIEFQX1VTRUNfUEVSX1NFQykpOwotICAgIHRpbWVzdHIgPSBhcF9wYWxsb2Moci0+cG9vbCwgQVBfUkZDODIyX0RBVEVfTEVOKTsKLSAgICBhcF9yZmM4MjJfZGF0ZSh0aW1lc3RyLCBleHBpcmVzKTsKLSAgICBhcF90YWJsZV9zZXRuKHItPmhlYWRlcnNfb3V0LCAiRXhwaXJlcyIsIHRpbWVzdHIpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdGljIHZvaWQgcmVnaXN0ZXJfaG9va3Modm9pZCkKLXsKLSAgICBhcF9ob29rX2ZpeHVwcyhhZGRfZXhwaXJlcyxOVUxMLE5VTEwsSE9PS19NSURETEUpOwotfQotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgZXhwaXJlc19tb2R1bGUgPQotewotICAgIFNUQU5EQVJEMjBfTU9EVUxFX1NUVUZGLAotICAgIGNyZWF0ZV9kaXJfZXhwaXJlc19jb25maWcsICAvKiBkaXIgY29uZmlnIGNyZWF0ZXIgKi8KLSAgICBtZXJnZV9leHBpcmVzX2Rpcl9jb25maWdzLCAgLyogZGlyIG1lcmdlciAtLS0gZGVmYXVsdCBpcyB0byBvdmVycmlkZSAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXJ2ZXIgY29uZmlnICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lcmdlIHNlcnZlciBjb25maWdzICovCi0gICAgZXhwaXJlc19jbWRzLCAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgYXBfdGFibGVfdCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBoYW5kbGVycyAqLwotICAgIHJlZ2lzdGVyX2hvb2tzCQkvKiByZWdpc3RlciBob29rcyAqLwotfTsKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX2V4cGlyZXMuZHNwIGIvbW9kdWxlcy9tZXRhZGF0YS9tb2RfZXhwaXJlcy5kc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMmZlOTAuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfZXhwaXJlcy5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJBcGFjaGVNb2R1bGVFeHBpcmVzIiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDIKLQotQ0ZHPUFwYWNoZU1vZHVsZUV4cGlyZXMgLSBXaW4zMiBSZWxlYXNlCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIkFwYWNoZU1vZHVsZUV4cGlyZXMubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJBcGFjaGVNb2R1bGVFeHBpcmVzLm1hayJcCi0gQ0ZHPSJBcGFjaGVNb2R1bGVFeHBpcmVzIC0gV2luMzIgUmVsZWFzZSIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJBcGFjaGVNb2R1bGVFeHBpcmVzIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAiQXBhY2hlTW9kdWxlRXhwaXJlcyAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1NVEw9bWlkbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAiQXBhY2hlTW9kdWxlRXhwaXJlcyAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiLlxBcGFjaGVNb2R1bGVFeHBpcmVzUiIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuXEFwYWNoZU1vZHVsZUV4cGlyZXNSIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvTzIgL0kgIi4uXC4uXGluY2x1ZGUiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiU0hBUkVEX01PRFVMRSIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgLi5cLi5cQ29yZVJcQXBhY2hlQ29yZS5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hY2hpbmU6STM4NgotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiQXBhY2hlTW9kdWxlRXhwaXJlcyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIi5cRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiLlxBcGFjaGVNb2R1bGVFeHBpcmVzRCIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuXEFwYWNoZU1vZHVsZUV4cGlyZXNEIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTURkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uXC4uXGluY2x1ZGUiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiU0hBUkVEX01PRFVMRSIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIC4uXC4uXENvcmVEXEFwYWNoZUNvcmUubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2Ci0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJBcGFjaGVNb2R1bGVFeHBpcmVzIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAiQXBhY2hlTW9kdWxlRXhwaXJlcyAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aHBqO2JhdDtmb3I7ZjkwIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Li5cLi5cbW9kdWxlc1xzdGFuZGFyZFxtb2RfZXhwaXJlcy5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIkhlYWRlciBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJoO2hwcDtoeHg7aG07aW5sO2ZpO2ZkIgotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxyZWFkZGlyLmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO2NudDtydGY7Z2lmO2pwZztqcGVnO2pwZSIKLSMgRW5kIEdyb3VwCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX2V4cGlyZXMuZXhwIGIvbW9kdWxlcy9tZXRhZGF0YS9tb2RfZXhwaXJlcy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2M2E5NjguLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfZXhwaXJlcy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1leHBpcmVzX21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfaGVhZGVycy5jIGIvbW9kdWxlcy9tZXRhZGF0YS9tb2RfaGVhZGVycy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWQyYTE1Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX2hlYWRlcnMuYworKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBtb2RfaGVhZGVycy5jOiBBZGQvYXBwZW5kL3JlbW92ZSBIVFRQIHJlc3BvbnNlIGhlYWRlcnMKLSAqICAgICBXcml0dGVuIGJ5IFBhdWwgU3V0dG9uLCBwYXVsQHVrd2ViLmNvbSwgMSBPY3QgMTk5NgotICoKLSAqIE5ldyBkaXJlY3RpdmUsIEhlYWRlciwgY2FuIGJlIHVzZWQgdG8gYWRkL3JlcGxhY2UvcmVtb3ZlIEhUVFAgaGVhZGVycy4KLSAqIFZhbGlkIGluIGJvdGggcGVyLXNlcnZlciBhbmQgcGVyLWRpciBjb25maWd1cmF0aW9ucy4KLSAqCi0gKiBTeW50YXggaXM6Ci0gKgotICogICBIZWFkZXIgYWN0aW9uIGhlYWRlciB2YWx1ZQotICoKLSAqIFdoZXJlIGFjdGlvbiBpcyBvbmUgb2Y6Ci0gKiAgICAgc2V0ICAgIC0gc2V0IHRoaXMgaGVhZGVyLCByZXBsYWNpbmcgYW55IG9sZCB2YWx1ZQotICogICAgIGFkZCAgICAtIGFkZCB0aGlzIGhlYWRlciwgcG9zc2libGUgcmVzdWx0aW5nIGluIHR3byBvciBtb3JlCi0gKiAgICAgICAgICAgICAgaGVhZGVycyB3aXRoIHRoZSBzYW1lIG5hbWUKLSAqICAgICBhcHBlbmQgLSBhcHBlbmQgdGhpcyB0ZXh0IG9udG8gYW55IGV4aXN0aW5nIGhlYWRlciBvZiB0aGlzIHNhbWUKLSAqICAgICB1bnNldCAgLSByZW1vdmUgdGhpcyBoZWFkZXIKLSAqCi0gKiBXaGVyZSBhY3Rpb24gaXMgdW5zZXQsIHRoZSB0aGlyZCBhcmd1bWVudCAodmFsdWUpIHNob3VsZCBub3QgYmUgZ2l2ZW4uCi0gKiBUaGUgaGVhZGVyIG5hbWUgY2FuIGluY2x1ZGUgdGhlIGNvbG9uLCBvciBub3QuCi0gKgotICogVGhlIEhlYWRlciBkaXJlY3RpdmUgY2FuIG9ubHkgYmUgdXNlZCB3aGVyZSBhbGxvd2VkIGJ5IHRoZSBGaWxlSW5mbyAKLSAqIG92ZXJyaWRlLgotICoKLSAqIFdoZW4gdGhlIHJlcXVlc3QgaXMgcHJvY2Vzc2VkLCB0aGUgaGVhZGVyIGRpcmVjdGl2ZXMgYXJlIHByb2Nlc3NlZCBpbgotICogdGhpcyBvcmRlcjogZmlyc3RseSwgdGhlIG1haW4gc2VydmVyLCB0aGVuIHRoZSB2aXJ0dWFsIHNlcnZlciBoYW5kbGluZwotICogdGhpcyByZXF1ZXN0IChpZiBhbnkpLCB0aGVuIGFueSA8RGlyZWN0b3J5PiBzZWN0aW9ucyAod29ya2luZyBkb3dud2FyZHMgCi0gKiBmcm9tIHRoZSByb290IGRpciksIHRoZW4gYW4gPExvY2F0aW9uPiBzZWN0aW9ucyAod29ya2luZyBkb3duIGZyb20gCi0gKiBzaG9ydGVzdCBVUkwgY29tcG9uZW50KSwgdGhlIGFueSA8RmlsZT4gc2VjdGlvbnMuIFRoaXMgb3JkZXIgaXMKLSAqIGltcG9ydGFudCBpZiBhbnkgJ3NldCcgb3IgJ3Vuc2V0JyBhY3Rpb25zIGFyZSB1c2VkLiBGb3IgZXhhbXBsZSwKLSAqIHRoZSBmb2xsb3dpbmcgdHdvIGRpcmVjdGl2ZXMgaGF2ZSBkaWZmZXJlbnQgZWZmZWN0IGlmIGFwcGxpZWQgaW4KLSAqIHRoZSByZXZlcnNlIG9yZGVyOgotICoKLSAqICAgSGVhZGVyIGFwcGVuZCBBdXRob3IgIkpvaG4gUC4gRG9lIgotICogICBIZWFkZXIgdW5zZXQgQXV0aG9yCi0gKgotICogRXhhbXBsZXM6Ci0gKgotICogIFRvIHNldCB0aGUgIkF1dGhvciIgaGVhZGVyLCB1c2UKLSAqICAgICBIZWFkZXIgYWRkIEF1dGhvciAiSm9obiBQLiBEb2UiCi0gKgotICogIFRvIHJlbW92ZSBhIGhlYWRlcjoKLSAqICAgICBIZWFkZXIgdW5zZXQgQXV0aG9yCi0gKgotICovCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0KLXR5cGVkZWYgZW51bSB7Ci0gICAgaGRyX2FkZCA9ICdhJywgICAgICAgICAgICAgIC8qIGFkZCBoZWFkZXIgKGNvdWxkIG1lYW4gbXVsdGlwbGUgaGRycykgKi8KLSAgICBoZHJfc2V0ID0gJ3MnLCAgICAgICAgICAgICAgLyogc2V0IChyZXBsYWNlIG9sZCB2YWx1ZSkgKi8KLSAgICBoZHJfYXBwZW5kID0gJ20nLCAgICAgICAgICAgLyogYXBwZW5kIChtZXJnZSBpbnRvIGFueSBvbGQgdmFsdWUpICovCi0gICAgaGRyX3Vuc2V0ID0gJ3UnICAgICAgICAgICAgIC8qIHVuc2V0IGhlYWRlciAqLwotfSBoZHJfYWN0aW9uczsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGhkcl9hY3Rpb25zIGFjdGlvbjsKLSAgICBjaGFyICpoZWFkZXI7Ci0gICAgY2hhciAqdmFsdWU7Ci19IGhlYWRlcl9lbnRyeTsKLQotLyoKLSAqIGhlYWRlcnNfY29uZiBpcyBvdXIgcGVyLW1vZHVsZSBjb25maWd1cmF0aW9uLiBUaGlzIGlzIHVzZWQgYXMgYm90aAotICogYSBwZXItZGlyIGFuZCBwZXItc2VydmVyIGNvbmZpZwotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmhlYWRlcnM7Ci19IGhlYWRlcnNfY29uZjsKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIGhlYWRlcnNfbW9kdWxlOwotCi1zdGF0aWMgdm9pZCAqY3JlYXRlX2hlYWRlcnNfY29uZmlnKGFwX2NvbnRleHRfdCAqcCwgc2VydmVyX3JlYyAqcykKLXsKLSAgICBoZWFkZXJzX2NvbmYgKmEgPQotICAgIChoZWFkZXJzX2NvbmYgKikgYXBfcGNhbGxvYyhwLCBzaXplb2YoaGVhZGVyc19jb25mKSk7Ci0KLSAgICBhLT5oZWFkZXJzID0gYXBfbWFrZV9hcnJheShwLCAyLCBzaXplb2YoaGVhZGVyX2VudHJ5KSk7Ci0gICAgcmV0dXJuIGE7Ci19Ci0KLXN0YXRpYyB2b2lkICpjcmVhdGVfaGVhZGVyc19kaXJfY29uZmlnKGFwX2NvbnRleHRfdCAqcCwgY2hhciAqZCkKLXsKLSAgICByZXR1cm4gKGhlYWRlcnNfY29uZiAqKSBjcmVhdGVfaGVhZGVyc19jb25maWcocCwgTlVMTCk7Ci19Ci0KLXN0YXRpYyB2b2lkICptZXJnZV9oZWFkZXJzX2NvbmZpZyhhcF9jb250ZXh0X3QgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICpvdmVycmlkZXN2KQotewotICAgIGhlYWRlcnNfY29uZiAqYSA9Ci0gICAgKGhlYWRlcnNfY29uZiAqKSBhcF9wY2FsbG9jKHAsIHNpemVvZihoZWFkZXJzX2NvbmYpKTsKLSAgICBoZWFkZXJzX2NvbmYgKmJhc2UgPSAoaGVhZGVyc19jb25mICopIGJhc2V2LCAqb3ZlcnJpZGVzID0gKGhlYWRlcnNfY29uZiAqKSBvdmVycmlkZXN2OwotCi0gICAgYS0+aGVhZGVycyA9IGFwX2FwcGVuZF9hcnJheXMocCwgYmFzZS0+aGVhZGVycywgb3ZlcnJpZGVzLT5oZWFkZXJzKTsKLQotICAgIHJldHVybiBhOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICpoZWFkZXJfY21kKGNtZF9wYXJtcyAqY21kLCBoZWFkZXJzX2NvbmYgKiBkaXJjb25mLCBjaGFyICphY3Rpb24sIGNoYXIgKmhkciwgY2hhciAqdmFsdWUpCi17Ci0gICAgaGVhZGVyX2VudHJ5ICpuZXc7Ci0gICAgc2VydmVyX3JlYyAqcyA9IGNtZC0+c2VydmVyOwotICAgIGhlYWRlcnNfY29uZiAqc2VydmVyY29uZiA9Ci0gICAgKGhlYWRlcnNfY29uZiAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAmaGVhZGVyc19tb2R1bGUpOwotICAgIGNoYXIgKmNvbG9uOwotCi0gICAgaWYgKGNtZC0+cGF0aCkgewotICAgICAgICBuZXcgPSAoaGVhZGVyX2VudHJ5ICopIGFwX3B1c2hfYXJyYXkoZGlyY29uZi0+aGVhZGVycyk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBuZXcgPSAoaGVhZGVyX2VudHJ5ICopIGFwX3B1c2hfYXJyYXkoc2VydmVyY29uZi0+aGVhZGVycyk7Ci0gICAgfQotCi0gICAgaWYgKCFzdHJjYXNlY21wKGFjdGlvbiwgInNldCIpKQotICAgICAgICBuZXctPmFjdGlvbiA9IGhkcl9zZXQ7Ci0gICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAoYWN0aW9uLCAiYWRkIikpCi0gICAgICAgIG5ldy0+YWN0aW9uID0gaGRyX2FkZDsKLSAgICBlbHNlIGlmICghc3RyY2FzZWNtcChhY3Rpb24sICJhcHBlbmQiKSkKLSAgICAgICAgbmV3LT5hY3Rpb24gPSBoZHJfYXBwZW5kOwotICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wKGFjdGlvbiwgInVuc2V0IikpCi0gICAgICAgIG5ldy0+YWN0aW9uID0gaGRyX3Vuc2V0OwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuICJmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGFkZCwgc2V0LCBhcHBlbmQgb3IgdW5zZXQuIjsKLQotICAgIGlmIChuZXctPmFjdGlvbiA9PSBoZHJfdW5zZXQpIHsKLSAgICAgICAgaWYgKHZhbHVlKQotICAgICAgICAgICAgcmV0dXJuICJIZWFkZXIgdW5zZXQgdGFrZXMgdHdvIGFyZ3VtZW50cyI7Ci0gICAgfQotICAgIGVsc2UgaWYgKCF2YWx1ZSkKLSAgICAgICAgcmV0dXJuICJIZWFkZXIgcmVxdWlyZXMgdGhyZWUgYXJndW1lbnRzIjsKLQotICAgIGlmICgoY29sb24gPSBzdHJjaHIoaGRyLCAnOicpKSkKLSAgICAgICAgKmNvbG9uID0gJ1wwJzsKLQotICAgIG5ldy0+aGVhZGVyID0gaGRyOwotICAgIG5ldy0+dmFsdWUgPSB2YWx1ZTsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgaGVhZGVyc19jbWRzW10gPQotewotICAgIHsiSGVhZGVyIiwgaGVhZGVyX2NtZCwgTlVMTCwgT1JfRklMRUlORk8sIFRBS0UyMywKLSAgICAgImFuIGFjdGlvbiwgaGVhZGVyIGFuZCB2YWx1ZSJ9LAotICAgIHtOVUxMfQotfTsKLQotc3RhdGljIHZvaWQgZG9faGVhZGVyc19maXh1cChyZXF1ZXN0X3JlYyAqciwgYXBfYXJyYXlfaGVhZGVyX3QgKmhlYWRlcnMpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgaGVhZGVycy0+bmVsdHM7ICsraSkgewotICAgICAgICBoZWFkZXJfZW50cnkgKmhkciA9ICYoKGhlYWRlcl9lbnRyeSAqKSAoaGVhZGVycy0+ZWx0cykpW2ldOwotICAgICAgICBzd2l0Y2ggKGhkci0+YWN0aW9uKSB7Ci0gICAgICAgIGNhc2UgaGRyX2FkZDoKLSAgICAgICAgICAgIGFwX3RhYmxlX2FkZG4oci0+aGVhZGVyc19vdXQsIGhkci0+aGVhZGVyLCBoZHItPnZhbHVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGhkcl9hcHBlbmQ6Ci0gICAgICAgICAgICBhcF90YWJsZV9tZXJnZW4oci0+aGVhZGVyc19vdXQsIGhkci0+aGVhZGVyLCBoZHItPnZhbHVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGhkcl9zZXQ6Ci0gICAgICAgICAgICBhcF90YWJsZV9zZXRuKHItPmhlYWRlcnNfb3V0LCBoZHItPmhlYWRlciwgaGRyLT52YWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBoZHJfdW5zZXQ6Ci0gICAgICAgICAgICBhcF90YWJsZV91bnNldChyLT5oZWFkZXJzX291dCwgaGRyLT5oZWFkZXIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotc3RhdGljIGludCBmaXh1cF9oZWFkZXJzKHJlcXVlc3RfcmVjICpyKQotewotICAgIHZvaWQgKnNjb25mID0gci0+c2VydmVyLT5tb2R1bGVfY29uZmlnOwotICAgIGhlYWRlcnNfY29uZiAqc2VydmVyY29uZiA9Ci0gICAgKGhlYWRlcnNfY29uZiAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzY29uZiwgJmhlYWRlcnNfbW9kdWxlKTsKLSAgICB2b2lkICpkY29uZiA9IHItPnBlcl9kaXJfY29uZmlnOwotICAgIGhlYWRlcnNfY29uZiAqZGlyY29uZiA9Ci0gICAgKGhlYWRlcnNfY29uZiAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhkY29uZiwgJmhlYWRlcnNfbW9kdWxlKTsKLQotICAgIGRvX2hlYWRlcnNfZml4dXAociwgc2VydmVyY29uZi0+aGVhZGVycyk7Ci0gICAgZG9faGVhZGVyc19maXh1cChyLCBkaXJjb25mLT5oZWFkZXJzKTsKLQotICAgIHJldHVybiBERUNMSU5FRDsKLX0KLXN0YXRpYyB2b2lkIHJlZ2lzdGVyX2hvb2tzKHZvaWQpCi17Ci0gICAgYXBfaG9va19maXh1cHMoZml4dXBfaGVhZGVycyxOVUxMLE5VTEwsSE9PS19NSURETEUpOwotfSAKLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBoZWFkZXJzX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCi0gICAgY3JlYXRlX2hlYWRlcnNfZGlyX2NvbmZpZywgIC8qIGRpciBjb25maWcgY3JlYXRlciAqLwotICAgIG1lcmdlX2hlYWRlcnNfY29uZmlnLCAgICAgICAvKiBkaXIgbWVyZ2VyIC0tLSBkZWZhdWx0IGlzIHRvIG92ZXJyaWRlICovCi0gICAgY3JlYXRlX2hlYWRlcnNfY29uZmlnLCAgICAgIC8qIHNlcnZlciBjb25maWcgKi8KLSAgICBtZXJnZV9oZWFkZXJzX2NvbmZpZywgICAgICAgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZ3MgKi8KLSAgICBoZWFkZXJzX2NtZHMsICAgICAgICAgICAgICAgLyogY29tbWFuZCBhcF90YWJsZV90ICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGhhbmRsZXJzICovCi0gICAgcmVnaXN0ZXJfaG9va3MJCS8qIHJlZ2lzdGVyIGhvb2tzICovCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfaGVhZGVycy5kc3AgYi9tb2R1bGVzL21ldGFkYXRhL21vZF9oZWFkZXJzLmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRjNzYwMi4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL21vZF9oZWFkZXJzLmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9IkFwYWNoZU1vZHVsZUhlYWRlcnMiIC0gUGFja2FnZSBPd25lcj08ND4KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDUuMDAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMgotCi1DRkc9QXBhY2hlTW9kdWxlSGVhZGVycyAtIFdpbjMyIFJlbGVhc2UKLSFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiQXBhY2hlTW9kdWxlSGVhZGVycy5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIkFwYWNoZU1vZHVsZUhlYWRlcnMubWFrIlwKLSBDRkc9IkFwYWNoZU1vZHVsZUhlYWRlcnMgLSBXaW4zMiBSZWxlYXNlIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgIkFwYWNoZU1vZHVsZUhlYWRlcnMgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICJBcGFjaGVNb2R1bGVIZWFkZXJzIC0gV2luMzIgRGVidWciIChiYXNlZCBvblwKLSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLU1UTD1taWRsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJBcGFjaGVNb2R1bGVIZWFkZXJzIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIi5cUmVsZWFzZSIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIi5cUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICIuXEFwYWNoZU1vZHVsZUhlYWRlcnNSIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi5cQXBhY2hlTW9kdWxlSGVhZGVyc1IiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dYIC9PMiAvSSAiLi5cLi5caW5jbHVkZSIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJTSEFSRURfTU9EVUxFIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiAuLlwuLlxDb3JlUlxBcGFjaGVDb3JlLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFjaGluZTpJMzg2Ci0KLSFFTFNFSUYgICIkKENGRykiID09ICJBcGFjaGVNb2R1bGVIZWFkZXJzIC0gV2luMzIgRGVidWciCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXERlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiLlxEZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICIuXEFwYWNoZU1vZHVsZUhlYWRlcnNEIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi5cQXBhY2hlTW9kdWxlSGVhZGVyc0QiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvSSAiLi5cLi5caW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJTSEFSRURfTU9EVUxFIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMgotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgLi5cLi5cQ29yZURcQXBhY2hlQ29yZS5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgIkFwYWNoZU1vZHVsZUhlYWRlcnMgLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICJBcGFjaGVNb2R1bGVIZWFkZXJzIC0gV2luMzIgRGVidWciCi0jIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtocGo7YmF0O2ZvcjtmOTAiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxtb2R1bGVzXHN0YW5kYXJkXG1vZF9oZWFkZXJzLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmw7Zmk7ZmQiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHJlYWRkaXIuaAotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47Y250O3J0ZjtnaWY7anBnO2pwZWc7anBlIgotIyBFbmQgR3JvdXAKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfaGVhZGVycy5leHAgYi9tb2R1bGVzL21ldGFkYXRhL21vZF9oZWFkZXJzLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YzMDYzOC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL21vZF9oZWFkZXJzLmV4cAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWhlYWRlcnNfbW9kdWxlCmRpZmYgLS1naXQgYS9tb2R1bGVzL21ldGFkYXRhL21vZF9taW1lX21hZ2ljLmMgYi9tb2R1bGVzL21ldGFkYXRhL21vZF9taW1lX21hZ2ljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOGVlOTIuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfbWltZV9tYWdpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUwNSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIG1vZF9taW1lX21hZ2ljOiBNSU1FIHR5cGUgbG9va3VwIHZpYSBmaWxlIG1hZ2ljIG51bWJlcnMKLSAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk3IENpc2NvIFN5c3RlbXMsIEluYy4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIHdhcyBzdWJtaXR0ZWQgYnkgQ2lzY28gU3lzdGVtcyB0byB0aGUgQXBhY2hlIEdyb3VwIGluIEp1bHkKLSAqIDE5OTcuICBGdXR1cmUgcmV2aXNpb25zIGFuZCBkZXJpdmF0aXZlcyBvZiB0aGlzIHNvdXJjZSBjb2RlIG11c3QKLSAqIGFja25vd2xlZGdlIENpc2NvIFN5c3RlbXMgYXMgdGhlIG9yaWdpbmFsIGNvbnRyaWJ1dG9yIG9mIHRoaXMgbW9kdWxlLgotICogQWxsIG90aGVyIGxpY2Vuc2luZyBhbmQgdXNhZ2UgY29uZGl0aW9ucyBhcmUgdGhvc2Ugb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiBTb21lIG9mIHRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIGZyZWUgdmVyc2lvbiBvZiB0aGUgZmlsZSBjb21tYW5kCi0gKiBvcmlnaW5hbGx5IHBvc3RlZCB0byBjb21wLnNvdXJjZXMudW5peC4gIENvcHlyaWdodCBpbmZvIGZvciB0aGF0IHByb2dyYW0KLSAqIGlzIGluY2x1ZGVkIGJlbG93IGFzIHJlcXVpcmVkLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAtIENvcHlyaWdodCAoYykgSWFuIEYuIERhcndpbiwgMTk4Ny4gV3JpdHRlbiBieSBJYW4gRi4gRGFyd2luLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbm90IHN1YmplY3QgdG8gYW55IGxpY2Vuc2Ugb2YgdGhlIEFtZXJpY2FuIFRlbGVwaG9uZSBhbmQKLSAqIFRlbGVncmFwaCBDb21wYW55IG9yIG9mIHRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKgotICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2Ugb24gYW55Ci0gKiBjb21wdXRlciBzeXN0ZW0sIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0IGZyZWVseSwgc3ViamVjdCB0bwotICogdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0gKgotICogMS4gVGhlIGF1dGhvciBpcyBub3QgcmVzcG9uc2libGUgZm9yIHRoZSBjb25zZXF1ZW5jZXMgb2YgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLCBubyBtYXR0ZXIgaG93IGF3ZnVsLCBldmVuIGlmIHRoZXkgYXJpc2UgZnJvbSBmbGF3cyBpbiBpdC4KLSAqCi0gKiAyLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQsIGVpdGhlciBieQotICogZXhwbGljaXQgY2xhaW0gb3IgYnkgb21pc3Npb24uICBTaW5jZSBmZXcgdXNlcnMgZXZlciByZWFkIHNvdXJjZXMsIGNyZWRpdHMKLSAqIG11c3QgYXBwZWFyIGluIHRoZSBkb2N1bWVudGF0aW9uLgotICoKLSAqIDMuIEFsdGVyZWQgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAqIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gIFNpbmNlIGZldyB1c2VycyBldmVyIHJlYWQKLSAqIHNvdXJjZXMsIGNyZWRpdHMgbXVzdCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24uCi0gKgotICogNC4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogRm9yIGNvbXBsaWFuY2Ugd2l0aCBNciBEYXJ3aW4ncyB0ZXJtczogdGhpcyBoYXMgYmVlbiB2ZXJ5IHNpZ25pZmljYW50bHkKLSAqIG1vZGlmaWVkIGZyb20gdGhlIGZyZWUgImZpbGUiIGNvbW1hbmQuCi0gKiAtIGFsbC1pbi1vbmUgZmlsZSBmb3IgY29tcGlsYXRpb24gY29udmVuaWVuY2Ugd2hlbiBtb3ZpbmcgZnJvbSBvbmUKLSAqICAgdmVyc2lvbiBvZiBBcGFjaGUgdG8gdGhlIG5leHQuCi0gKiAtIE1lbW9yeSBhbGxvY2F0aW9uIGlzIGRvbmUgdGhyb3VnaCB0aGUgQXBhY2hlIEFQSSdzIGFwX2NvbnRleHRfdCBzdHJ1Y3R1cmUuCi0gKiAtIEFsbCBmdW5jdGlvbnMgaGF2ZSBoYWQgbmVjZXNzYXJ5IEFwYWNoZSBBUEkgcmVxdWVzdCBvciBzZXJ2ZXIKLSAqICAgc3RydWN0dXJlcyBwYXNzZWQgdG8gdGhlbSB3aGVyZSBuZWNlc3NhcnkgdG8gY2FsbCBvdGhlciBBcGFjaGUgQVBJCi0gKiAgIHJvdXRpbmVzLiAgKGkuZS4gdXN1YWxseSBmb3IgbG9nZ2luZywgZmlsZXMsIG9yIG1lbW9yeSBhbGxvY2F0aW9uIGluCi0gKiAgIGl0c2VsZiBvciBhIGNhbGxlZCBmdW5jdGlvbi4pCi0gKiAtIHN0cnVjdCBtYWdpYyBoYXMgYmVlbiBjb252ZXJ0ZWQgZnJvbSBhbiBhcnJheSB0byBhIHNpbmdsZS1lbmRlZCBsaW5rZWQKLSAqICAgbGlzdCBiZWNhdXNlIGl0IG9ubHkgZ3Jvd3Mgb25lIHJlY29yZCBhdCBhIHRpbWUsIGl0J3Mgb25seSBhY2Nlc3NlZAotICogICBzZXF1ZW50aWFsbHksIGFuZCB0aGUgQXBhY2hlIEFQSSBoYXMgbm8gZXF1aXZhbGVudCBvZiByZWFsbG9jKCkuCi0gKiAtIEZ1bmN0aW9ucyBoYXZlIGJlZW4gY2hhbmdlZCB0byBnZXQgdGhlaXIgcGFyYW1ldGVycyBmcm9tIHRoZSBzZXJ2ZXIKLSAqICAgY29uZmlndXJhdGlvbiBpbnN0ZWFkIG9mIGdsb2JhbHMuICAoSXQgc2hvdWxkIGJlIHJlZW50cmFudCBub3cgYnV0IGhhcwotICogICBub3QgYmVlbiB0ZXN0ZWQgaW4gYSB0aHJlYWRlZCBlbnZpcm9ubWVudC4pCi0gKiAtIFBsYWNlcyB3aGVyZSBpdCB1c2VkIHRvIHByaW50IHJlc3VsdHMgdG8gc3Rkb3V0IG5vdyBzYXZlcyB0aGVtIGluIGEKLSAqICAgbGlzdCB3aGVyZSB0aGV5J3JlIHVzZWQgdG8gc2V0IHRoZSBNSU1FIHR5cGUgaW4gdGhlIEFwYWNoZSByZXF1ZXN0Ci0gKiAgIHJlY29yZC4KLSAqIC0gQ29tbWFuZC1saW5lIGZsYWdzIGhhdmUgYmVlbiByZW1vdmVkIHNpbmNlIHRoZXkgd2lsbCBuZXZlciBiZSB1c2VkIGhlcmUuCi0gKgotICogSWFuIEtsdWZ0IDxpa2x1ZnRAY2lzY28uY29tPgotICogRW5naW5lZXJpbmcgSW5mb3JtYXRpb24gRnJhbWV3b3JrCi0gKiBDZW50cmFsIEVuZ2luZWVyaW5nCi0gKiBDaXNjbyBTeXN0ZW1zLCBJbmMuCi0gKiBTYW4gSm9zZSwgQ0EsIFVTQQotICoKLSAqIEluaXRpYWwgaW5zdGFsbGF0aW9uICAgICAgICAgIEp1bHkvQXVndXN0IDE5OTYKLSAqIE1pc2MgYnVnIGZpeGVzICAgICAgICAgICAgICAgIE1heSAxOTk3Ci0gKiBTdWJtaXNzaW9uIHRvIEFwYWNoZSBHcm91cCAgICBKdWx5IDE5OTcKLSAqCi0gKi8KLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJ1dGlsX3NjcmlwdC5oIgotI2lmZGVmIEhBVkVfVVRJTUVfSAotI2luY2x1ZGUgPHV0aW1lLmg+Ci0jZW5kaWYKLQotLyoKLSAqIGRhdGEgc3RydWN0dXJlcyBhbmQgcmVsYXRlZCBjb25zdGFudHMKLSAqLwotCi0jZGVmaW5lIE1PRE5BTUUgICAgICAgICJtb2RfbWltZV9tYWdpYyIKLSNkZWZpbmUgTUlNRV9NQUdJQ19ERUJVRyAgICAgICAgMAotCi0jZGVmaW5lIE1JTUVfQklOQVJZX1VOS05PV04gICAgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIKLSNkZWZpbmUgTUlNRV9URVhUX1VOS05PV04gICAgInRleHQvcGxhaW4iCi0KLSNkZWZpbmUgTUFYTUlNRVNUUklORyAgICAgICAgMjU2Ci0KLS8qIEhPV01BTlkgbXVzdCBiZSBhdCBsZWFzdCA0MDk2IHRvIG1ha2UgZ3ppcCAtZGNxIHdvcmsgKi8KLSNkZWZpbmUgSE9XTUFOWQk0MDk2Ci0vKiBTTUFMTF9IT1dNQU5ZIGxpbWl0cyBob3cgbXVjaCB3b3JrIHdlIGRvIHRvIGZpZ3VyZSBvdXQgdGV4dCBmaWxlcyAqLwotI2RlZmluZSBTTUFMTF9IT1dNQU5ZIDEwMjQKLSNkZWZpbmUgTUFYREVTQyAgICA1MAkJLyogbWF4IGxlbmcgb2YgdGV4dCBkZXNjcmlwdGlvbiAqLwotI2RlZmluZSBNQVhzdHJpbmcgNjQJCS8qIG1heCBsZW5nIG9mICJzdHJpbmciIHR5cGVzICovCi0KLXN0cnVjdCBtYWdpYyB7Ci0gICAgc3RydWN0IG1hZ2ljICpuZXh0OwkJLyogbGluayB0byBuZXh0IGVudHJ5ICovCi0gICAgaW50IGxpbmVubzsJCQkvKiBsaW5lIG51bWJlciBmcm9tIG1hZ2ljIGZpbGUgKi8KLQotICAgIHNob3J0IGZsYWc7Ci0jZGVmaW5lIElORElSICAgIDEJCS8qIGlmICc+KC4uLiknIGFwcGVhcnMsICAqLwotI2RlZmluZSAgICBVTlNJR05FRCAyCQkvKiBjb21wYXJpc29uIGlzIHVuc2lnbmVkICovCi0gICAgc2hvcnQgY29udF9sZXZlbDsJCS8qIGxldmVsIG9mICI+IiAqLwotICAgIHN0cnVjdCB7Ci0JY2hhciB0eXBlOwkJLyogYnl0ZSBzaG9ydCBsb25nICovCi0JbG9uZyBvZmZzZXQ7CQkvKiBvZmZzZXQgZnJvbSBpbmRpcmVjdGlvbiAqLwotICAgIH0gaW47Ci0gICAgbG9uZyBvZmZzZXQ7CQkvKiBvZmZzZXQgdG8gbWFnaWMgbnVtYmVyICovCi0gICAgdW5zaWduZWQgY2hhciByZWxuOwkJLyogcmVsYXRpb24gKDA9ZXEsICc+Jz1ndCwgZXRjKSAqLwotICAgIGNoYXIgdHlwZTsJCQkvKiBpbnQsIHNob3J0LCBsb25nIG9yIHN0cmluZy4gKi8KLSAgICBjaGFyIHZhbGxlbjsJCS8qIGxlbmd0aCBvZiBzdHJpbmcgdmFsdWUsIGlmIGFueSAqLwotI2RlZmluZSBCWVRFICAgIDEKLSNkZWZpbmUgU0hPUlQgICAgMgotI2RlZmluZSBMT05HICAgIDQKLSNkZWZpbmUgU1RSSU5HICAgIDUKLSNkZWZpbmUgREFURSAgICA2Ci0jZGVmaW5lIEJFU0hPUlQgICAgNwotI2RlZmluZSBCRUxPTkcgICAgOAotI2RlZmluZSBCRURBVEUgICAgOQotI2RlZmluZSBMRVNIT1JUICAgIDEwCi0jZGVmaW5lIExFTE9ORyAgICAxMQotI2RlZmluZSBMRURBVEUgICAgMTIKLSAgICB1bmlvbiBWQUxVRVRZUEUgewotCXVuc2lnbmVkIGNoYXIgYjsKLQl1bnNpZ25lZCBzaG9ydCBoOwotCXVuc2lnbmVkIGxvbmcgbDsKLQljaGFyIHNbTUFYc3RyaW5nXTsKLQl1bnNpZ25lZCBjaGFyIGhzWzJdOwkvKiAyIGJ5dGVzIG9mIGEgZml4ZWQtZW5kaWFuICJzaG9ydCIgKi8KLQl1bnNpZ25lZCBjaGFyIGhsWzRdOwkvKiAyIGJ5dGVzIG9mIGEgZml4ZWQtZW5kaWFuICJsb25nIiAqLwotICAgIH0gdmFsdWU7CQkJLyogZWl0aGVyIG51bWJlciBvciBzdHJpbmcgKi8KLSAgICB1bnNpZ25lZCBsb25nIG1hc2s7CQkvKiBtYXNrIGJlZm9yZSBjb21wYXJpc29uIHdpdGggdmFsdWUgKi8KLSAgICBjaGFyIG5vc3BmbGFnOwkJLyogc3VwcmVzcyBzcGFjZSBjaGFyYWN0ZXIgKi8KLQotICAgIC8qIE5PVEU6IHRoaXMgc3RyaW5nIGlzIHN1c3BlY3RlZCBvZiBvdmVycnVubmluZyAtIGZpbmQgaXQhICovCi0gICAgY2hhciBkZXNjW01BWERFU0NdOwkJLyogZGVzY3JpcHRpb24gKi8KLX07Ci0KLS8qCi0gKiBkYXRhIHN0cnVjdHVyZXMgZm9yIHRhciBmaWxlIHJlY29nbml0aW9uCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogSGVhZGVyIGZpbGUgZm9yIHB1YmxpYyBkb21haW4gdGFyICh0YXBlIGFyY2hpdmUpIHByb2dyYW0uCi0gKgotICogQCgjKXRhci5oIDEuMjAgODYvMTAvMjkgICAgUHVibGljIERvbWFpbi4gQ3JlYXRlZCAyNSBBdWd1c3QgMTk4NSBieSBKb2huCi0gKiBHaWxtb3JlLCBpaG5wNCFob3B0b2FkIWdudS4KLSAqCi0gKiBIZWFkZXIgYmxvY2sgb24gdGFwZS4KLSAqCi0gKiBJJ20gZ29pbmcgdG8gdXNlIHRyYWRpdGlvbmFsIERQIG5hbWluZyBjb252ZW50aW9ucyBoZXJlLiBBICJibG9jayIgaXMgYSBiaWcKLSAqIGNodW5rIG9mIHN0dWZmIHRoYXQgd2UgZG8gSS9PIG9uLiBBICJyZWNvcmQiIGlzIGEgcGllY2Ugb2YgaW5mbyB0aGF0IHdlCi0gKiBjYXJlIGFib3V0LiBUeXBpY2FsbHkgbWFueSAicmVjb3JkInMgZml0IGludG8gYSAiYmxvY2siLgotICovCi0jZGVmaW5lIFJFQ09SRFNJWkUgICAgNTEyCi0jZGVmaW5lIE5BTVNJWiAgICAxMDAKLSNkZWZpbmUgVFVOTUxFTiAgICAzMgotI2RlZmluZSBUR05NTEVOICAgIDMyCi0KLXVuaW9uIHJlY29yZCB7Ci0gICAgY2hhciBjaGFycHRyW1JFQ09SRFNJWkVdOwotICAgIHN0cnVjdCBoZWFkZXIgewotCWNoYXIgbmFtZVtOQU1TSVpdOwotCWNoYXIgbW9kZVs4XTsKLQljaGFyIHVpZFs4XTsKLQljaGFyIGdpZFs4XTsKLQljaGFyIHNpemVbMTJdOwotCWNoYXIgbXRpbWVbMTJdOwotCWNoYXIgY2hrc3VtWzhdOwotCWNoYXIgbGlua2ZsYWc7Ci0JY2hhciBsaW5rbmFtZVtOQU1TSVpdOwotCWNoYXIgbWFnaWNbOF07Ci0JY2hhciB1bmFtZVtUVU5NTEVOXTsKLQljaGFyIGduYW1lW1RHTk1MRU5dOwotCWNoYXIgZGV2bWFqb3JbOF07Ci0JY2hhciBkZXZtaW5vcls4XTsKLSAgICB9IGhlYWRlcjsKLX07Ci0KLS8qIFRoZSBtYWdpYyBmaWVsZCBpcyBmaWxsZWQgd2l0aCB0aGlzIGlmIHVuYW1lIGFuZCBnbmFtZSBhcmUgdmFsaWQuICovCi0jZGVmaW5lICAgIFRNQUdJQyAgICAgICAgInVzdGFyICAiCS8qIDcgY2hhcnMgYW5kIGEgbnVsbCAqLwotCi0vKgotICogZmlsZS1mdW5jdGlvbiBwcm90b3R5cGVzCi0gKi8KLXN0YXRpYyBpbnQgYXNjbWFnaWMocmVxdWVzdF9yZWMgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQpOwotc3RhdGljIGludCBpc190YXIodW5zaWduZWQgY2hhciAqLCBpbnQpOwotc3RhdGljIGludCBzb2Z0bWFnaWMocmVxdWVzdF9yZWMgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQpOwotc3RhdGljIHZvaWQgdHJ5aXQocmVxdWVzdF9yZWMgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQsIGludCk7Ci1zdGF0aWMgaW50IHptYWdpYyhyZXF1ZXN0X3JlYyAqLCB1bnNpZ25lZCBjaGFyICosIGludCk7Ci0KLXN0YXRpYyBpbnQgZ2V0dmFsdWUoc2VydmVyX3JlYyAqLCBzdHJ1Y3QgbWFnaWMgKiwgY2hhciAqKik7Ci1zdGF0aWMgaW50IGhleHRvaW50KGludCk7Ci1zdGF0aWMgY2hhciAqZ2V0c3RyKHNlcnZlcl9yZWMgKiwgY2hhciAqLCBjaGFyICosIGludCwgaW50ICopOwotc3RhdGljIGludCBwYXJzZShzZXJ2ZXJfcmVjICosIGFwX2NvbnRleHRfdCAqcCwgY2hhciAqLCBpbnQpOwotCi1zdGF0aWMgaW50IG1hdGNoKHJlcXVlc3RfcmVjICosIHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKLXN0YXRpYyBpbnQgbWdldChyZXF1ZXN0X3JlYyAqLCB1bmlvbiBWQUxVRVRZUEUgKiwgdW5zaWduZWQgY2hhciAqLAotCQlzdHJ1Y3QgbWFnaWMgKiwgaW50KTsKLXN0YXRpYyBpbnQgbWNoZWNrKHJlcXVlc3RfcmVjICosIHVuaW9uIFZBTFVFVFlQRSAqLCBzdHJ1Y3QgbWFnaWMgKik7Ci1zdGF0aWMgdm9pZCBtcHJpbnQocmVxdWVzdF9yZWMgKiwgdW5pb24gVkFMVUVUWVBFICosIHN0cnVjdCBtYWdpYyAqKTsKLQotc3RhdGljIGludCB1bmNvbXByZXNzKHJlcXVlc3RfcmVjICosIGludCwgCi0JCSAgICAgIHVuc2lnbmVkIGNoYXIgKiosIGludCk7Ci1zdGF0aWMgbG9uZyBmcm9tX29jdChpbnQsIGNoYXIgKik7Ci1zdGF0aWMgaW50IGZzbWFnaWMocmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKmZuKTsKLQotLyoKLSAqIGluY2x1ZGVzIGZvciBBU0NJSSBzdWJzdHJpbmcgcmVjb2duaXRpb24gZm9ybWVybHkgIm5hbWVzLmgiIGluIGZpbGUKLSAqIGNvbW1hbmQKLSAqCi0gKiBPcmlnaW5hbCBub3RlczogbmFtZXMgYW5kIHR5cGVzIHVzZWQgYnkgYXNjbWFnaWMgaW4gZmlsZSgxKS4gVGhlc2UgdG9rZW5zIGFyZQotICogaGVyZSBiZWNhdXNlIHRoZXkgY2FuIGFwcGVhciBhbnl3aGVyZSBpbiB0aGUgZmlyc3QgSE9XTUFOWSBieXRlcywgd2hpbGUKLSAqIHRva2VucyBpbiAvZXRjL21hZ2ljIG11c3QgYXBwZWFyIGF0IGZpeGVkIG9mZnNldHMgaW50byB0aGUgZmlsZS4gRG9uJ3QKLSAqIG1ha2UgSE9XTUFOWSB0b28gaGlnaCB1bmxlc3MgeW91IGhhdmUgYSB2ZXJ5IGZhc3QgQ1BVLgotICovCi0KLS8qIHRoZXNlIHR5cGVzIGFyZSB1c2VkIHRvIGluZGV4IHRoZSBhcF90YWJsZV90ICd0eXBlcyc6IGtlZXAgZW0gaW4gc3luYyEgKi8KLS8qIEhUTUwgaW5zZXJ0ZWQgaW4gZmlyc3QgYmVjYXVzZSB0aGlzIGlzIGEgd2ViIHNlcnZlciBtb2R1bGUgbm93ICovCi0jZGVmaW5lIExfSFRNTCAgICAwCQkvKiBIVE1MICovCi0jZGVmaW5lIExfQyAgICAgICAxCQkvKiBmaXJzdCBhbmQgZm9yZW1vc3Qgb24gVU5JWCAqLwotI2RlZmluZSBMX0ZPUlQgICAgMgkJLyogdGhlIG9sZGVzdCBvbmUgKi8KLSNkZWZpbmUgTF9NQUtFICAgIDMJCS8qIE1ha2VmaWxlcyAqLwotI2RlZmluZSBMX1BMSSAgICAgNAkJLyogUEwvMSAqLwotI2RlZmluZSBMX01BQ0ggICAgNQkJLyogc29tZSBraW5kYSBhc3NlbWJsZXIgKi8KLSNkZWZpbmUgTF9FTkcgICAgIDYJCS8qIEVuZ2xpc2ggKi8KLSNkZWZpbmUgTF9QQVMgICAgIDcJCS8qIFBhc2NhbCAqLwotI2RlZmluZSBMX01BSUwgICAgOAkJLyogRWxlY3Ryb25pYyBtYWlsICovCi0jZGVmaW5lIExfTkVXUyAgICA5CQkvKiBVc2VuZXQgTmV0bmV3cyAqLwotCi1zdGF0aWMgY2hhciAqdHlwZXNbXSA9Ci17Ci0gICAgInRleHQvaHRtbCIsCQkvKiBIVE1MICovCi0gICAgInRleHQvcGxhaW4iLAkJLyogImMgcHJvZ3JhbSB0ZXh0IiwgKi8KLSAgICAidGV4dC9wbGFpbiIsCQkvKiAiZm9ydHJhbiBwcm9ncmFtIHRleHQiLCAqLwotICAgICJ0ZXh0L3BsYWluIiwJCS8qICJtYWtlIGNvbW1hbmRzIHRleHQiLCAqLwotICAgICJ0ZXh0L3BsYWluIiwJCS8qICJwbC8xIHByb2dyYW0gdGV4dCIsICovCi0gICAgInRleHQvcGxhaW4iLAkJLyogImFzc2VtYmxlciBwcm9ncmFtIHRleHQiLCAqLwotICAgICJ0ZXh0L3BsYWluIiwJCS8qICJFbmdsaXNoIHRleHQiLCAqLwotICAgICJ0ZXh0L3BsYWluIiwJCS8qICJwYXNjYWwgcHJvZ3JhbSB0ZXh0IiwgKi8KLSAgICAibWVzc2FnZS9yZmM4MjIiLAkJLyogIm1haWwgdGV4dCIsICovCi0gICAgIm1lc3NhZ2UvbmV3cyIsCQkvKiAibmV3cyB0ZXh0IiwgKi8KLSAgICAiYXBwbGljYXRpb24vYmluYXJ5IiwJLyogImNhbid0IGhhcHBlbiBlcnJvciBvbiBuYW1lcy5oL3R5cGVzIiwgKi8KLSAgICAwCi19OwotCi1zdGF0aWMgc3RydWN0IG5hbWVzIHsKLSAgICBjaGFyICpuYW1lOwotICAgIHNob3J0IHR5cGU7Ci19IG5hbWVzW10gPSB7Ci0KLSAgICAvKiBUaGVzZSBtdXN0IGJlIHNvcnRlZCBieSBleWUgZm9yIG9wdGltYWwgaGl0IHJhdGUgKi8KLSAgICAvKiBBZGQgdG8gdGhpcyBsaXN0IG9ubHkgYWZ0ZXIgc3Vic3RhbnRpYWwgbWVkaXRhdGlvbiAqLwotICAgIHsKLQkiPGh0bWw+IiwgTF9IVE1MCi0gICAgfSwKLSAgICB7Ci0JIjxIVE1MPiIsIExfSFRNTAotICAgIH0sCi0gICAgewotCSI8aGVhZD4iLCBMX0hUTUwKLSAgICB9LAotICAgIHsKLQkiPEhFQUQ+IiwgTF9IVE1MCi0gICAgfSwKLSAgICB7Ci0JIjx0aXRsZT4iLCBMX0hUTUwKLSAgICB9LAotICAgIHsKLQkiPFRJVExFPiIsIExfSFRNTAotICAgIH0sCi0gICAgewotCSI8aDE+IiwgTF9IVE1MCi0gICAgfSwKLSAgICB7Ci0JIjxIMT4iLCBMX0hUTUwKLSAgICB9LAotICAgIHsKLQkiPCEtLSIsIExfSFRNTAotICAgIH0sCi0gICAgewotCSI8IURPQ1RZUEUgSFRNTCIsIExfSFRNTAotICAgIH0sCi0gICAgewotCSIvKiIsIExfQwotICAgIH0sCQkJCS8qIG11c3QgcHJlY2VkZSAiVGhlIiwgInRoZSIsIGV0Yy4gKi8KLSAgICB7Ci0JIiNpbmNsdWRlIiwgTF9DCi0gICAgfSwKLSAgICB7Ci0JImNoYXIiLCBMX0MKLSAgICB9LAotICAgIHsKLQkiVGhlIiwgTF9FTkcKLSAgICB9LAotICAgIHsKLQkidGhlIiwgTF9FTkcKLSAgICB9LAotICAgIHsKLQkiZG91YmxlIiwgTF9DCi0gICAgfSwKLSAgICB7Ci0JImV4dGVybiIsIExfQwotICAgIH0sCi0gICAgewotCSJmbG9hdCIsIExfQwotICAgIH0sCi0gICAgewotCSJyZWFsIiwgTF9DCi0gICAgfSwKLSAgICB7Ci0JInN0cnVjdCIsIExfQwotICAgIH0sCi0gICAgewotCSJ1bmlvbiIsIExfQwotICAgIH0sCi0gICAgewotCSJDRkxBR1MiLCBMX01BS0UKLSAgICB9LAotICAgIHsKLQkiTERGTEFHUyIsIExfTUFLRQotICAgIH0sCi0gICAgewotCSJhbGw6IiwgTF9NQUtFCi0gICAgfSwKLSAgICB7Ci0JIi5QUkVDSU9VUyIsIExfTUFLRQotICAgIH0sCi0gICAgLyoKLSAgICAgKiBUb28gbWFueSBmaWxlcyBvZiB0ZXh0IGhhdmUgdGhlc2Ugd29yZHMgaW4gdGhlbS4gIEZpbmQgYW5vdGhlciB3YXkgdG8KLSAgICAgKiByZWNvZ25pemUgRm9ydHJhc2guCi0gICAgICovCi0jaWZkZWYgICAgTk9UREVGCi0gICAgewotCSJzdWJyb3V0aW5lIiwgTF9GT1JUCi0gICAgfSwKLSAgICB7Ci0JImZ1bmN0aW9uIiwgTF9GT1JUCi0gICAgfSwKLSAgICB7Ci0JImJsb2NrIiwgTF9GT1JUCi0gICAgfSwKLSAgICB7Ci0JImNvbW1vbiIsIExfRk9SVAotICAgIH0sCi0gICAgewotCSJkaW1lbnNpb24iLCBMX0ZPUlQKLSAgICB9LAotICAgIHsKLQkiaW50ZWdlciIsIExfRk9SVAotICAgIH0sCi0gICAgewotCSJkYXRhIiwgTF9GT1JUCi0gICAgfSwKLSNlbmRpZiAvKiBOT1RERUYgKi8KLSAgICB7Ci0JIi5hc2NpaSIsIExfTUFDSAotICAgIH0sCi0gICAgewotCSIuYXNjaWl6IiwgTF9NQUNICi0gICAgfSwKLSAgICB7Ci0JIi5ieXRlIiwgTF9NQUNICi0gICAgfSwKLSAgICB7Ci0JIi5ldmVuIiwgTF9NQUNICi0gICAgfSwKLSAgICB7Ci0JIi5nbG9ibCIsIExfTUFDSAotICAgIH0sCi0gICAgewotCSJjbHIiLCBMX01BQ0gKLSAgICB9LAotICAgIHsKLQkiKGlucHV0LCIsIExfUEFTCi0gICAgfSwKLSAgICB7Ci0JImRjbCIsIExfUExJCi0gICAgfSwKLSAgICB7Ci0JIlJlY2VpdmVkOiIsIExfTUFJTAotICAgIH0sCi0gICAgewotCSI+RnJvbSIsIExfTUFJTAotICAgIH0sCi0gICAgewotCSJSZXR1cm4tUGF0aDoiLCBMX01BSUwKLSAgICB9LAotICAgIHsKLQkiQ2M6IiwgTF9NQUlMCi0gICAgfSwKLSAgICB7Ci0JIk5ld3Nncm91cHM6IiwgTF9ORVdTCi0gICAgfSwKLSAgICB7Ci0JIlBhdGg6IiwgTF9ORVdTCi0gICAgfSwKLSAgICB7Ci0JIk9yZ2FuaXphdGlvbjoiLCBMX05FV1MKLSAgICB9LAotICAgIHsKLQlOVUxMLCAwCi0gICAgfQotfTsKLQotI2RlZmluZSBOTkFNRVMgKChzaXplb2YobmFtZXMpL3NpemVvZihzdHJ1Y3QgbmFtZXMpKSAtIDEpCi0KLS8qCi0gKiBSZXN1bHQgU3RyaW5nIExpc3QgKFJTTCkKLSAqCi0gKiBUaGUgZmlsZSgxKSBjb21tYW5kIHByaW50cyBpdHMgb3V0cHV0LiAgSW5zdGVhZCwgd2Ugc3RvcmUgdGhlIHZhcmlvdXMKLSAqICJwcmludGVkIiBzdHJpbmdzIGluIGEgbGlzdCAoYWxsb2NhdGluZyBtZW1vcnkgYXMgd2UgZ28pIGFuZCBjb25jYXRlbmF0ZQotICogdGhlbSBhdCB0aGUgZW5kIHdoZW4gd2UgZmluYWxseSBrbm93IGhvdyBtdWNoIHNwYWNlIHRoZXknbGwgbmVlZC4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBtYWdpY19yc2xfcyB7Ci0gICAgY2hhciAqc3RyOwkJCS8qIHN0cmluZywgcG9zc2libHkgYSBmcmFnbWVudCAqLwotICAgIHN0cnVjdCBtYWdpY19yc2xfcyAqbmV4dDsJLyogcG9pbnRlciB0byBuZXh0IGZyYWdtZW50ICovCi19IG1hZ2ljX3JzbDsKLQotLyoKLSAqIEFwYWNoZSBtb2R1bGUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmVzCi0gKi8KLQotLyogcGVyLXNlcnZlciBpbmZvICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY2hhciAqbWFnaWNmaWxlOwkJLyogd2hlcmUgbWFnaWMgYmUgZm91bmQgKi8KLSAgICBzdHJ1Y3QgbWFnaWMgKm1hZ2ljOwkvKiBoZWFkIG9mIG1hZ2ljIGNvbmZpZyBsaXN0ICovCi0gICAgc3RydWN0IG1hZ2ljICpsYXN0OwotfSBtYWdpY19zZXJ2ZXJfY29uZmlnX3JlYzsKLQotLyogcGVyLXJlcXVlc3QgaW5mbyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIG1hZ2ljX3JzbCAqaGVhZDsJCS8qIHJlc3VsdCBzdHJpbmcgbGlzdCAqLwotICAgIG1hZ2ljX3JzbCAqdGFpbDsKLSAgICB1bnNpZ25lZCBzdWZfcmVjdXJzaW9uOwkvKiByZWN1cnNpb24gZGVwdGggaW4gc3VmZml4IGNoZWNrICovCi19IG1hZ2ljX3JlcV9yZWM7Ci0KLS8qCi0gKiBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAtIGNhbGxlZCBieSBBcGFjaGUgQVBJIHJvdXRpbmVzCi0gKi8KLQotbW9kdWxlIG1pbWVfbWFnaWNfbW9kdWxlOwotCi1zdGF0aWMgdm9pZCAqY3JlYXRlX21hZ2ljX3NlcnZlcl9jb25maWcoYXBfY29udGV4dF90ICpwLCBzZXJ2ZXJfcmVjICpkKQotewotICAgIC8qIGFsbG9jYXRlIHRoZSBjb25maWcgLSB1c2UgcGNhbGxvYyBiZWNhdXNlIGl0IG5lZWRzIHRvIGJlIHplcm9lZCAqLwotICAgIHJldHVybiBhcF9wY2FsbG9jKHAsIHNpemVvZihtYWdpY19zZXJ2ZXJfY29uZmlnX3JlYykpOwotfQotCi1zdGF0aWMgdm9pZCAqbWVyZ2VfbWFnaWNfc2VydmVyX2NvbmZpZyhhcF9jb250ZXh0X3QgKnAsIHZvaWQgKmJhc2V2LCB2b2lkICphZGR2KQotewotICAgIG1hZ2ljX3NlcnZlcl9jb25maWdfcmVjICpiYXNlID0gKG1hZ2ljX3NlcnZlcl9jb25maWdfcmVjICopIGJhc2V2OwotICAgIG1hZ2ljX3NlcnZlcl9jb25maWdfcmVjICphZGQgPSAobWFnaWNfc2VydmVyX2NvbmZpZ19yZWMgKikgYWRkdjsKLSAgICBtYWdpY19zZXJ2ZXJfY29uZmlnX3JlYyAqbmV3ID0gKG1hZ2ljX3NlcnZlcl9jb25maWdfcmVjICopCi0JCQkgICAgYXBfcGFsbG9jKHAsIHNpemVvZihtYWdpY19zZXJ2ZXJfY29uZmlnX3JlYykpOwotCi0gICAgbmV3LT5tYWdpY2ZpbGUgPSBhZGQtPm1hZ2ljZmlsZSA/IGFkZC0+bWFnaWNmaWxlIDogYmFzZS0+bWFnaWNmaWxlOwotICAgIG5ldy0+bWFnaWMgPSBOVUxMOwotICAgIG5ldy0+bGFzdCA9IE5VTEw7Ci0gICAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9tYWdpY2ZpbGUoY21kX3Bhcm1zICpjbWQsIGNoYXIgKmQsIGNoYXIgKmFyZykKLXsKLSAgICBtYWdpY19zZXJ2ZXJfY29uZmlnX3JlYyAqY29uZiA9IChtYWdpY19zZXJ2ZXJfY29uZmlnX3JlYyAqKQotICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKGNtZC0+c2VydmVyLT5tb2R1bGVfY29uZmlnLAotCQkgICAgICAmbWltZV9tYWdpY19tb2R1bGUpOwotCi0gICAgaWYgKCFjb25mKSB7Ci0JcmV0dXJuIE1PRE5BTUUgIjogc2VydmVyIHN0cnVjdHVyZSBub3QgYWxsb2NhdGVkIjsKLSAgICB9Ci0gICAgY29uZi0+bWFnaWNmaWxlID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKgotICogY29uZmlndXJhdGlvbiBmaWxlIGNvbW1hbmRzIC0gZXhwb3J0ZWQgdG8gQXBhY2hlIEFQSQotICovCi0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBtaW1lX21hZ2ljX2NtZHNbXSA9Ci17Ci0gICAgeyJNaW1lTWFnaWNGaWxlIiwgc2V0X21hZ2ljZmlsZSwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAgIlBhdGggdG8gTUlNRSBNYWdpYyBmaWxlIChpbiBmaWxlKDEpIGZvcm1hdCkifSwKLSAgICB7TlVMTH0KLX07Ci0KLS8qCi0gKiBSU0wgKHJlc3VsdCBzdHJpbmcgbGlzdCkgcHJvY2Vzc2luZyByb3V0aW5lcwotICoKLSAqIFRoZXNlIGNvbGxlY3Qgc3RyaW5ncyB0aGF0IHdvdWxkIGhhdmUgYmVlbiBwcmludGVkIGluIGZyYWdtZW50cyBieSBmaWxlKDEpCi0gKiBpbnRvIGEgbGlzdCBvZiBtYWdpY19yc2wgc3RydWN0dXJlcyB3aXRoIHRoZSBzdHJpbmdzLiBXaGVuIGNvbXBsZXRlLAotICogdGhleSdyZSBjb25jYXRlbmF0ZWQgdG9nZXRoZXIgdG8gYmVjb21lIHRoZSBNSU1FIGNvbnRlbnQgYW5kIGVuY29kaW5nCi0gKiB0eXBlcy4KLSAqCi0gKiByZXR1cm4gdmFsdWUgY29udmVudGlvbnMgZm9yIHRoZXNlIGZ1bmN0aW9uczogZnVuY3Rpb25zIHdoaWNoIHJldHVybiBpbnQ6Ci0gKiBmYWlsdXJlID0gLTEsIG90aGVyID0gcmVzdWx0IGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gcG9pbnRlcnM6IGZhaWx1cmUgPSAwLAotICogb3RoZXIgPSByZXN1bHQKLSAqLwotCi0vKiBhbGxvY2F0ZSBhIHBlci1yZXF1ZXN0IHN0cnVjdHVyZSBhbmQgcHV0IGl0IGluIHRoZSByZXF1ZXN0IHJlY29yZCAqLwotc3RhdGljIG1hZ2ljX3JlcV9yZWMgKm1hZ2ljX3NldF9jb25maWcocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgbWFnaWNfcmVxX3JlYyAqcmVxX2RhdCA9IChtYWdpY19yZXFfcmVjICopIGFwX3BhbGxvYyhyLT5wb29sLAotCQkJCQkJICAgICAgc2l6ZW9mKG1hZ2ljX3JlcV9yZWMpKTsKLQotICAgIHJlcV9kYXQtPmhlYWQgPSByZXFfZGF0LT50YWlsID0gKG1hZ2ljX3JzbCAqKSBOVUxMOwotICAgIGFwX3NldF9tb2R1bGVfY29uZmlnKHItPnJlcXVlc3RfY29uZmlnLCAmbWltZV9tYWdpY19tb2R1bGUsIHJlcV9kYXQpOwotICAgIHJldHVybiByZXFfZGF0OwotfQotCi0vKiBhZGQgYSBzdHJpbmcgdG8gdGhlIHJlc3VsdCBzdHJpbmcgbGlzdCBmb3IgdGhpcyByZXF1ZXN0ICovCi0vKiBpdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBhbGxvY2F0ZSAic3RyIiAqLwotc3RhdGljIGludCBtYWdpY19yc2xfYWRkKHJlcXVlc3RfcmVjICpyLCBjaGFyICpzdHIpCi17Ci0gICAgbWFnaWNfcmVxX3JlYyAqcmVxX2RhdCA9IChtYWdpY19yZXFfcmVjICopCi0JCSAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5yZXF1ZXN0X2NvbmZpZywgJm1pbWVfbWFnaWNfbW9kdWxlKTsKLSAgICBtYWdpY19yc2wgKnJzbDsKLQotICAgIC8qIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgbGlzdCB0byBwdXQgaXQgaW4gKi8KLSAgICBpZiAoIXJlcV9kYXQpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19FUlIsIEFQUl9FSU5WQUwsIHIsCi0JCSAgICBNT0ROQU1FICI6IHJlcXVlc3QgY29uZmlnIHNob3VsZCBub3QgYmUgTlVMTCIpOwotCWlmICghKHJlcV9kYXQgPSBtYWdpY19zZXRfY29uZmlnKHIpKSkgewotCSAgICAvKiBmYWlsdXJlICovCi0JICAgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotCi0gICAgLyogYWxsb2NhdGUgdGhlIGxpc3QgZW50cnkgKi8KLSAgICByc2wgPSAobWFnaWNfcnNsICopIGFwX3BhbGxvYyhyLT5wb29sLCBzaXplb2YobWFnaWNfcnNsKSk7Ci0KLSAgICAvKiBmaWxsIGl0ICovCi0gICAgcnNsLT5zdHIgPSBzdHI7Ci0gICAgcnNsLT5uZXh0ID0gKG1hZ2ljX3JzbCAqKSBOVUxMOwotCi0gICAgLyogYXBwZW5kIHRvIHRoZSBsaXN0ICovCi0gICAgaWYgKHJlcV9kYXQtPmhlYWQgJiYgcmVxX2RhdC0+dGFpbCkgewotCXJlcV9kYXQtPnRhaWwtPm5leHQgPSByc2w7Ci0JcmVxX2RhdC0+dGFpbCA9IHJzbDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JcmVxX2RhdC0+aGVhZCA9IHJlcV9kYXQtPnRhaWwgPSByc2w7Ci0gICAgfQotCi0gICAgLyogc3VjY2VzcyAqLwotICAgIHJldHVybiAwOwotfQotCi0vKiBSU0wgaG9vayBmb3IgcHV0cy10eXBlIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBtYWdpY19yc2xfcHV0cyhyZXF1ZXN0X3JlYyAqciwgY2hhciAqc3RyKQotewotICAgIHJldHVybiBtYWdpY19yc2xfYWRkKHIsIHN0cik7Ci19Ci0KLS8qIFJTTCBob29rIGZvciBwcmludGYtdHlwZSBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgbWFnaWNfcnNsX3ByaW50ZihyZXF1ZXN0X3JlYyAqciwgY2hhciAqc3RyLC4uLikKLXsKLSAgICB2YV9saXN0IGFwOwotCi0gICAgY2hhciBidWZbTUFYTUlNRVNUUklOR107Ci0KLSAgICAvKiBhc3NlbWJsZSB0aGUgc3RyaW5nIGludG8gdGhlIGJ1ZmZlciAqLwotICAgIHZhX3N0YXJ0KGFwLCBzdHIpOwotICAgIGFwX3ZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBzdHIsIGFwKTsKLSAgICB2YV9lbmQoYXApOwotCi0gICAgLyogYWRkIHRoZSBidWZmZXIgdG8gdGhlIGxpc3QgKi8KLSAgICByZXR1cm4gbWFnaWNfcnNsX2FkZChyLCBzdHJkdXAoYnVmKSk7Ci19Ci0KLS8qIFJTTCBob29rIGZvciBwdXRjaGFyLXR5cGUgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IG1hZ2ljX3JzbF9wdXRjaGFyKHJlcXVlc3RfcmVjICpyLCBjaGFyIGMpCi17Ci0gICAgY2hhciBzdHJbMl07Ci0KLSAgICAvKiBoaWdoIG92ZXJoZWFkIGZvciAxIGNoYXIgLSBqdXN0IGhvcGUgdGhleSBkb24ndCBkbyB0aGlzIG11Y2ggKi8KLSAgICBzdHJbMF0gPSBjOwotICAgIHN0clsxXSA9ICdcMCc7Ci0gICAgcmV0dXJuIG1hZ2ljX3JzbF9hZGQociwgc3RyKTsKLX0KLQotLyogYWxsb2NhdGUgYW5kIGNvcHkgYSBjb250aWd1b3VzIHN0cmluZyBmcm9tIGEgcmVzdWx0IHN0cmluZyBsaXN0ICovCi1zdGF0aWMgY2hhciAqcnNsX3N0cmR1cChyZXF1ZXN0X3JlYyAqciwgaW50IHN0YXJ0X2ZyYWcsIGludCBzdGFydF9wb3MsIGludCBsZW4pCi17Ci0gICAgY2hhciAqcmVzdWx0OwkJLyogcmV0dXJuIHZhbHVlICovCi0gICAgaW50IGN1cl9mcmFnLAkJLyogY3VycmVudCBmcmFnbWVudCBudW1iZXIvY291bnRlciAqLwotICAgICAgICBjdXJfcG9zLAkJLyogY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gZnJhZ21lbnQgKi8KLSAgICAgICAgcmVzX3BvczsJCS8qIHBvc2l0aW9uIGluIHJlc3VsdCBzdHJpbmcgKi8KLSAgICBtYWdpY19yc2wgKmZyYWc7CQkvKiBsaXN0LXRyYXZlcnNhbCBwb2ludGVyICovCi0gICAgbWFnaWNfcmVxX3JlYyAqcmVxX2RhdCA9IChtYWdpY19yZXFfcmVjICopCi0JCSAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5yZXF1ZXN0X2NvbmZpZywgJm1pbWVfbWFnaWNfbW9kdWxlKTsKLQotICAgIC8qIGFsbG9jYXRlIHRoZSByZXN1bHQgc3RyaW5nICovCi0gICAgcmVzdWx0ID0gKGNoYXIgKikgYXBfcGFsbG9jKHItPnBvb2wsIGxlbiArIDEpOwotCi0gICAgLyogbG9vcCB0aHJvdWdoIGFuZCBjb2xsZWN0IHRoZSBzdHJpbmcgKi8KLSAgICByZXNfcG9zID0gMDsKLSAgICBmb3IgKGZyYWcgPSByZXFfZGF0LT5oZWFkLCBjdXJfZnJhZyA9IDA7Ci0JIGZyYWctPm5leHQ7Ci0JIGZyYWcgPSBmcmFnLT5uZXh0LCBjdXJfZnJhZysrKSB7Ci0JLyogbG9vcCB0byB0aGUgZmlyc3QgZnJhZ21lbnQgKi8KLQlpZiAoY3VyX2ZyYWcgPCBzdGFydF9mcmFnKQotCSAgICBjb250aW51ZTsKLQotCS8qIGxvb3AgdGhyb3VnaCBhbmQgY29sbGVjdCBjaGFycyAqLwotCWZvciAoY3VyX3BvcyA9IChjdXJfZnJhZyA9PSBzdGFydF9mcmFnKSA/IHN0YXJ0X3BvcyA6IDA7Ci0JICAgICBmcmFnLT5zdHJbY3VyX3Bvc107Ci0JICAgICBjdXJfcG9zKyspIHsKLQkgICAgaWYgKGN1cl9mcmFnID49IHN0YXJ0X2ZyYWcKLQkJJiYgY3VyX3BvcyA+PSBzdGFydF9wb3MKLQkJJiYgcmVzX3BvcyA8PSBsZW4pIHsKLQkJcmVzdWx0W3Jlc19wb3MrK10gPSBmcmFnLT5zdHJbY3VyX3Bvc107Ci0JCWlmIChyZXNfcG9zID4gbGVuKSB7Ci0JCSAgICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIC8qIGNsZWFuIHVwIGFuZCByZXR1cm4gKi8KLSAgICByZXN1bHRbcmVzX3Bvc10gPSAwOwotI2lmIE1JTUVfTUFHSUNfREVCVUcKLSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19ERUJVRywgMCwgciwKLQkgICAgIE1PRE5BTUUgIjogcnNsX3N0cmR1cCgpICVkIGNoYXJzOiAlcyIsIHJlc19wb3MgLSAxLCByZXN1bHQpOwotI2VuZGlmCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogc3RhdGVzIGZvciB0aGUgc3RhdGUtbWFjaGluZSBhbGdvcml0aG0gaW4gbWFnaWNfcnNsX3RvX3JlcXVlc3QoKSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgICByc2xfbGVhZGluZ19zcGFjZSwgcnNsX3R5cGUsIHJzbF9zdWJ0eXBlLCByc2xfc2VwYXJhdG9yLCByc2xfZW5jb2RpbmcKLX0gcnNsX3N0YXRlczsKLQotLyogcHJvY2VzcyB0aGUgUlNMIGFuZCBzZXQgdGhlIE1JTUUgaW5mbyBpbiB0aGUgcmVxdWVzdCByZWNvcmQgKi8KLXN0YXRpYyBpbnQgbWFnaWNfcnNsX3RvX3JlcXVlc3QocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IGN1cl9mcmFnLAkJLyogY3VycmVudCBmcmFnbWVudCBudW1iZXIvY291bnRlciAqLwotICAgICAgICBjdXJfcG9zLAkJLyogY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gZnJhZ21lbnQgKi8KLSAgICAgICAgdHlwZV9mcmFnLAkJLyogY29udGVudCB0eXBlIHN0YXJ0aW5nIHBvaW50OiBmcmFnbWVudCAqLwotICAgICAgICB0eXBlX3BvcywJCS8qIGNvbnRlbnQgdHlwZSBzdGFydGluZyBwb2ludDogcG9zaXRpb24gKi8KLSAgICAgICAgdHlwZV9sZW4sCQkvKiBjb250ZW50IHR5cGUgbGVuZ3RoICovCi0gICAgICAgIGVuY29kaW5nX2ZyYWcsCQkvKiBjb250ZW50IGVuY29kaW5nIHN0YXJ0aW5nIHBvaW50OiBmcmFnbWVudCAqLwotICAgICAgICBlbmNvZGluZ19wb3MsCQkvKiBjb250ZW50IGVuY29kaW5nIHN0YXJ0aW5nIHBvaW50OiBwb3NpdGlvbiAqLwotICAgICAgICBlbmNvZGluZ19sZW47CQkvKiBjb250ZW50IGVuY29kaW5nIGxlbmd0aCAqLwotCi0gICAgbWFnaWNfcnNsICpmcmFnOwkJLyogbGlzdC10cmF2ZXJzYWwgcG9pbnRlciAqLwotICAgIHJzbF9zdGF0ZXMgc3RhdGU7Ci0KLSAgICBtYWdpY19yZXFfcmVjICpyZXFfZGF0ID0gKG1hZ2ljX3JlcV9yZWMgKikKLQkJICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKHItPnJlcXVlc3RfY29uZmlnLCAmbWltZV9tYWdpY19tb2R1bGUpOwotCi0gICAgLyogY2hlY2sgaWYgd2UgaGF2ZSBhIHJlc3VsdCAqLwotICAgIGlmICghcmVxX2RhdCB8fCAhcmVxX2RhdC0+aGVhZCkgewotCS8qIGVtcHR5IC0gbm8gbWF0Y2gsIHdlIGRlZmVyIHRvIG90aGVyIEFwYWNoZSBtb2R1bGVzICovCi0JcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIC8qIHN0YXJ0IHNlYXJjaGluZyBmb3IgdGhlIHR5cGUgYW5kIGVuY29kaW5nICovCi0gICAgc3RhdGUgPSByc2xfbGVhZGluZ19zcGFjZTsKLSAgICB0eXBlX2ZyYWcgPSB0eXBlX3BvcyA9IHR5cGVfbGVuID0gMDsKLSAgICBlbmNvZGluZ19mcmFnID0gZW5jb2RpbmdfcG9zID0gZW5jb2RpbmdfbGVuID0gMDsKLSAgICBmb3IgKGZyYWcgPSByZXFfZGF0LT5oZWFkLCBjdXJfZnJhZyA9IDA7Ci0JIGZyYWcgJiYgZnJhZy0+bmV4dDsKLQkgZnJhZyA9IGZyYWctPm5leHQsIGN1cl9mcmFnKyspIHsKLQkvKiBsb29wIHRocm91Z2ggdGhlIGNoYXJhY3RlcnMgaW4gdGhlIGZyYWdtZW50ICovCi0JZm9yIChjdXJfcG9zID0gMDsgZnJhZy0+c3RyW2N1cl9wb3NdOyBjdXJfcG9zKyspIHsKLQkgICAgaWYgKGFwX2lzc3BhY2UoZnJhZy0+c3RyW2N1cl9wb3NdKSkgewotCQkvKiBwcm9jZXNzIHdoaXRlc3BhY2UgYWN0aW9ucyBmb3IgZWFjaCBzdGF0ZSAqLwotCQlpZiAoc3RhdGUgPT0gcnNsX2xlYWRpbmdfc3BhY2UpIHsKLQkJICAgIC8qIGVhdCB3aGl0ZXNwYWNlIGluIHRoaXMgc3RhdGUgKi8KLQkJICAgIGNvbnRpbnVlOwotCQl9Ci0JCWVsc2UgaWYgKHN0YXRlID09IHJzbF90eXBlKSB7Ci0JCSAgICAvKiB3aGl0ZXNwYWNlOiB0eXBlIGhhcyBubyBzbGFzaCEgKi8KLQkJICAgIHJldHVybiBERUNMSU5FRDsKLQkJfQotCQllbHNlIGlmIChzdGF0ZSA9PSByc2xfc3VidHlwZSkgewotCQkgICAgLyogd2hpdGVzcGFjZTogZW5kIG9mIE1JTUUgdHlwZSAqLwotCQkgICAgc3RhdGUrKzsKLQkJICAgIGNvbnRpbnVlOwotCQl9Ci0JCWVsc2UgaWYgKHN0YXRlID09IHJzbF9zZXBhcmF0b3IpIHsKLQkJICAgIC8qIGVhdCB3aGl0ZXNwYWNlIGluIHRoaXMgc3RhdGUgKi8KLQkJICAgIGNvbnRpbnVlOwotCQl9Ci0JCWVsc2UgaWYgKHN0YXRlID09IHJzbF9lbmNvZGluZykgewotCQkgICAgLyogd2hpdGVzcGFjZTogZW5kIG9mIE1JTUUgZW5jb2RpbmcgKi8KLQkJICAgIC8qIHdlJ3JlIGRvbmUgKi8KLQkJICAgIGZyYWcgPSByZXFfZGF0LT50YWlsOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkJZWxzZSB7Ci0JCSAgICAvKiBzaG91bGQgbm90IGJlIHBvc3NpYmxlICovCi0JCSAgICAvKiBhYmFuZG9uIG1hbGZ1bmN0aW9uaW5nIG1vZHVsZSAqLwotCQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfRVJSLCAwLCByLAotCQkJCU1PRE5BTUUgIjogYmFkIHN0YXRlICVkICh3cykiLCBzdGF0ZSk7Ci0JCSAgICByZXR1cm4gREVDTElORUQ7Ci0JCX0KLQkJLyogTk9UUkVBQ0hFRCAqLwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHN0YXRlID09IHJzbF90eXBlICYmCi0JCSAgICAgZnJhZy0+c3RyW2N1cl9wb3NdID09ICcvJykgewotCQkvKiBjb3B5IHRoZSBjaGFyIGFuZCBnbyB0byByc2xfc3VidHlwZSBzdGF0ZSAqLwotCQl0eXBlX2xlbisrOwotCQlzdGF0ZSsrOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQkvKiBwcm9jZXNzIG5vbi1zcGFjZSBhY3Rpb25zIGZvciBlYWNoIHN0YXRlICovCi0JCWlmIChzdGF0ZSA9PSByc2xfbGVhZGluZ19zcGFjZSkgewotCQkgICAgLyogbm9uLXNwYWNlOiBiZWdpbiBNSU1FIHR5cGUgKi8KLQkJICAgIHN0YXRlKys7Ci0JCSAgICB0eXBlX2ZyYWcgPSBjdXJfZnJhZzsKLQkJICAgIHR5cGVfcG9zID0gY3VyX3BvczsKLQkJICAgIHR5cGVfbGVuID0gMTsKLQkJICAgIGNvbnRpbnVlOwotCQl9Ci0JCWVsc2UgaWYgKHN0YXRlID09IHJzbF90eXBlIHx8Ci0JCQkgc3RhdGUgPT0gcnNsX3N1YnR5cGUpIHsKLQkJICAgIC8qIG5vbi1zcGFjZTogYWRkcyB0byB0eXBlICovCi0JCSAgICB0eXBlX2xlbisrOwotCQkgICAgY29udGludWU7Ci0JCX0KLQkJZWxzZSBpZiAoc3RhdGUgPT0gcnNsX3NlcGFyYXRvcikgewotCQkgICAgLyogbm9uLXNwYWNlOiBiZWdpbiBNSU1FIGVuY29kaW5nICovCi0JCSAgICBzdGF0ZSsrOwotCQkgICAgZW5jb2RpbmdfZnJhZyA9IGN1cl9mcmFnOwotCQkgICAgZW5jb2RpbmdfcG9zID0gY3VyX3BvczsKLQkJICAgIGVuY29kaW5nX2xlbiA9IDE7Ci0JCSAgICBjb250aW51ZTsKLQkJfQotCQllbHNlIGlmIChzdGF0ZSA9PSByc2xfZW5jb2RpbmcpIHsKLQkJICAgIC8qIG5vbi1zcGFjZTogYWRkcyB0byBlbmNvZGluZyAqLwotCQkgICAgZW5jb2RpbmdfbGVuKys7Ci0JCSAgICBjb250aW51ZTsKLQkJfQotCQllbHNlIHsKLQkJICAgIC8qIHNob3VsZCBub3QgYmUgcG9zc2libGUgKi8KLQkJICAgIC8qIGFiYW5kb24gbWFsZnVuY3Rpb25pbmcgbW9kdWxlICovCi0JCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19FUlIsIDAsIHIsCi0JCQkJTU9ETkFNRSAiOiBiYWQgc3RhdGUgJWQgKG5zKSIsIHN0YXRlKTsKLQkJICAgIHJldHVybiBERUNMSU5FRDsKLQkJfQotCQkvKiBOT1RSRUFDSEVEICovCi0JICAgIH0KLQkgICAgLyogTk9UUkVBQ0hFRCAqLwotCX0KLSAgICB9Ci0KLSAgICAvKiBpZiB3ZSBlbmRlZCBwcmlvciB0byBzdGF0ZSByc2xfc3VidHlwZSwgd2UgaGFkIGluY29tcGxldGUgaW5mbyAqLwotICAgIGlmIChzdGF0ZSAhPSByc2xfc3VidHlwZSAmJiBzdGF0ZSAhPSByc2xfc2VwYXJhdG9yICYmCi0Jc3RhdGUgIT0gcnNsX2VuY29kaW5nKSB7Ci0JLyogZGVmZXIgdG8gb3RoZXIgbW9kdWxlcyAqLwotCXJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICAvKiBzYXZlIHRoZSBpbmZvIGluIHRoZSByZXF1ZXN0IHJlY29yZCAqLwotICAgIGlmIChzdGF0ZSA9PSByc2xfc3VidHlwZSB8fCBzdGF0ZSA9PSByc2xfZW5jb2RpbmcgfHwKLQlzdGF0ZSA9PSByc2xfZW5jb2RpbmcpIHsKLSAgICAgICAgY2hhciAqdG1wOwotCXRtcCA9IHJzbF9zdHJkdXAociwgdHlwZV9mcmFnLCB0eXBlX3BvcywgdHlwZV9sZW4pOwotCS8qIFhYWDogdGhpcyBjb3VsZCBiZSBkb25lIGF0IGNvbmZpZyB0aW1lIEknbSBzdXJlLi4uIGJ1dCBJJ20KLQkgKiBjb25mdXNlZCBieSBhbGwgdGhpcyBtYWdpY19yc2wgc3R1ZmYuIC1kamcgKi8KLQlhcF9jb250ZW50X3R5cGVfdG9sb3dlcih0bXApOwotCXItPmNvbnRlbnRfdHlwZSA9IHRtcDsKLSAgICB9Ci0gICAgaWYgKHN0YXRlID09IHJzbF9lbmNvZGluZykgewotICAgICAgICBjaGFyICp0bXA7Ci0JdG1wID0gcnNsX3N0cmR1cChyLCBlbmNvZGluZ19mcmFnLAotCQkJCQkgZW5jb2RpbmdfcG9zLCBlbmNvZGluZ19sZW4pOwotCS8qIFhYWDogdGhpcyBjb3VsZCBiZSBkb25lIGF0IGNvbmZpZyB0aW1lIEknbSBzdXJlLi4uIGJ1dCBJJ20KLQkgKiBjb25mdXNlZCBieSBhbGwgdGhpcyBtYWdpY19yc2wgc3R1ZmYuIC1kamcgKi8KLQlhcF9zdHJfdG9sb3dlcih0bXApOwotCXItPmNvbnRlbnRfZW5jb2RpbmcgPSB0bXA7Ci0gICAgfQotCi0gICAgLyogZGV0ZWN0IG1lbW9yeSBhbGxvY2F0aW9uIGVycm9ycyAqLwotICAgIGlmICghci0+Y29udGVudF90eXBlIHx8Ci0JKHN0YXRlID09IHJzbF9lbmNvZGluZyAmJiAhci0+Y29udGVudF9lbmNvZGluZykpIHsKLQlyZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgfQotCi0gICAgLyogc3VjY2VzcyEgKi8KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8qCi0gKiBtYWdpY19wcm9jZXNzIC0gcHJvY2VzcyBpbnB1dCBmaWxlIHIgICAgICAgIEFwYWNoZSBBUEkgcmVxdWVzdCByZWNvcmQKLSAqIChmb3JtZXJseSBjYWxsZWQgInByb2Nlc3MiIGluIGZpbGUgY29tbWFuZCwgcHJlZml4IGFkZGVkIGZvciBjbGFyaXR5KSBPcGVucwotICogdGhlIGZpbGUgYW5kIHJlYWRzIGEgZml4ZWQtc2l6ZSBidWZmZXIgdG8gYmVnaW4gcHJvY2Vzc2luZyB0aGUgY29udGVudHMuCi0gKi8KLXN0YXRpYyBpbnQgbWFnaWNfcHJvY2VzcyhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBhcF9maWxlX3QgKmZkID0gTlVMTDsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZltIT1dNQU5ZICsgMV07CS8qIG9uZSBleHRyYSBmb3IgdGVybWluYXRpbmcgJ1wwJyAqLwotICAgIGludCBuYnl0ZXMgPSAwOwkJLyogbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBhIGRhdGFmaWxlICovCi0gICAgaW50IHJlc3VsdDsKLQotICAgIC8qCi0gICAgICogZmlyc3QgdHJ5IGp1ZGdpbmcgdGhlIGZpbGUgYmFzZWQgb24gaXRzIGZpbGVzeXN0ZW0gc3RhdHVzCi0gICAgICovCi0gICAgc3dpdGNoICgocmVzdWx0ID0gZnNtYWdpYyhyLCByLT5maWxlbmFtZSkpKSB7Ci0gICAgY2FzZSBET05FOgotCW1hZ2ljX3JzbF9wdXRjaGFyKHIsICdcbicpOwotCXJldHVybiBPSzsKLSAgICBjYXNlIE9LOgotCWJyZWFrOwotICAgIGRlZmF1bHQ6Ci0JLyogZmF0YWwgZXJyb3IsIGJhaWwgb3V0ICovCi0JcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBpZiAoYXBfb3BlbigmZmQsIHItPmZpbGVuYW1lLCBBUFJfUkVBRCwgQVBSX09TX0RFRkFVTFQsIHItPnBvb2wpICE9IEFQUl9TVUNDRVNTKSB7Ci0JLyogV2UgY2FuJ3Qgb3BlbiBpdCwgYnV0IHdlIHdlcmUgYWJsZSB0byBzdGF0IGl0LiAqLwotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCAwLCByLAotCQkgICAgTU9ETkFNRSAiOiBjYW4ndCByZWFkIGAlcyciLCByLT5maWxlbmFtZSk7Ci0JLyogbGV0IHNvbWUgb3RoZXIgaGFuZGxlciBkZWNpZGUgd2hhdCB0aGUgcHJvYmxlbSBpcyAqLwotCXJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHRyeSBsb29raW5nIGF0IHRoZSBmaXJzdCBIT1dNQU5ZIGJ5dGVzCi0gICAgICovCi0gICAgbmJ5dGVzID0gc2l6ZW9mKGJ1ZikgLSAxOwotICAgIGlmICgocmVzdWx0ID0gYXBfcmVhZChmZCwgKGNoYXIgKikgYnVmLCAmbmJ5dGVzKSkgIT0gQVBSX1NVQ0NFU1MpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgcmVzdWx0LCByLAotCQkgICAgTU9ETkFNRSAiOiByZWFkIGZhaWxlZDogJXMiLCByLT5maWxlbmFtZSk7Ci0JcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgIH0KLQotICAgIGlmIChuYnl0ZXMgPT0gMCkKLQltYWdpY19yc2xfcHV0cyhyLCBNSU1FX1RFWFRfVU5LTk9XTik7Ci0gICAgZWxzZSB7Ci0JYnVmW25ieXRlcysrXSA9ICdcMCc7CS8qIG51bGwtdGVybWluYXRlIGl0ICovCi0JdHJ5aXQociwgYnVmLCBuYnl0ZXMsIDEpOyAKLSAgICB9Ci0KLSAgICAodm9pZCkgYXBfY2xvc2UoZmQpOwotICAgICh2b2lkKSBtYWdpY19yc2xfcHV0Y2hhcihyLCAnXG4nKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotCi1zdGF0aWMgdm9pZCB0cnlpdChyZXF1ZXN0X3JlYyAqciwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbmIsIGludCBjaGVja3ptYWdpYykKLXsKLSAgICAvKgotICAgICAqIFRyeSBjb21wcmVzc2lvbiBzdHVmZgotICAgICAqLwotCWlmIChjaGVja3ptYWdpYyA9PSAxKSB7ICAKLQkJCWlmICh6bWFnaWMociwgYnVmLCBuYikgPT0gMSkKLQkJCXJldHVybjsKLQl9Ci0KLSAgICAvKgotICAgICAqIHRyeSB0ZXN0cyBpbiAvZXRjL21hZ2ljIChvciBzdXJyb2dhdGUgbWFnaWMgZmlsZSkKLSAgICAgKi8KLSAgICBpZiAoc29mdG1hZ2ljKHIsIGJ1ZiwgbmIpID09IDEpCi0JcmV0dXJuOwotCi0gICAgLyoKLSAgICAgKiB0cnkga25vd24ga2V5d29yZHMsIGNoZWNrIGZvciBhc2NpaS1uZXNzIHRvby4KLSAgICAgKi8KLSAgICBpZiAoYXNjbWFnaWMociwgYnVmLCBuYikgPT0gMSkKLQlyZXR1cm47Ci0KLSAgICAvKgotICAgICAqIGFiYW5kb24gaG9wZSwgYWxsIHllIHdobyByZW1haW4gaGVyZQotICAgICAqLwotICAgIG1hZ2ljX3JzbF9wdXRzKHIsIE1JTUVfQklOQVJZX1VOS05PV04pOwotfQotCi0jZGVmaW5lICAgIEVBVEFCIHt3aGlsZSAoYXBfaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKmwpKSAgKytsO30KLQotLyoKLSAqIGFwcHJlbnRpY2UgLSBsb2FkIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgbWFnaWMgZmlsZSByCi0gKiAgQVBJIHJlcXVlc3QgcmVjb3JkCi0gKi8KLXN0YXRpYyBpbnQgYXBwcmVudGljZShzZXJ2ZXJfcmVjICpzLCBhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgYXBfZmlsZV90ICpmID0gTlVMTDsKLSAgICBhcF9zdGF0dXNfdCByZXN1bHQ7Ci0gICAgY2hhciBsaW5lW0JVRlNJWiArIDFdOwotICAgIGludCBlcnJzID0gMDsKLSAgICBpbnQgbGluZW5vOwotI2lmIE1JTUVfTUFHSUNfREVCVUcKLSAgICBpbnQgcnVsZSA9IDA7Ci0gICAgc3RydWN0IG1hZ2ljICptLCAqcHJldm07Ci0jZW5kaWYKLSAgICBtYWdpY19zZXJ2ZXJfY29uZmlnX3JlYyAqY29uZiA9IChtYWdpY19zZXJ2ZXJfY29uZmlnX3JlYyAqKQotCQkgICAgYXBfZ2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywgJm1pbWVfbWFnaWNfbW9kdWxlKTsKLQotICAgIGNvbnN0IGNoYXIgKmZuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocCwgY29uZi0+bWFnaWNmaWxlKTsKLSAgICByZXN1bHQgPSBhcF9vcGVuKCZmLCBmbmFtZSwgQVBSX1JFQUQgfCBBUFJfQlVGRkVSRUQsIEFQUl9PU19ERUZBVUxULCBwKTsKLSAgICBpZiAocmVzdWx0ICE9IEFQUl9TVUNDRVNTKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgcmVzdWx0LCBzLAotCQkgICAgTU9ETkFNRSAiOiBjYW4ndCByZWFkIG1hZ2ljIGZpbGUgJXMiLCBmbmFtZSk7Ci0JcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIHNldCB1cCB0aGUgbWFnaWMgbGlzdCAoZW1wdHkpICovCi0gICAgY29uZi0+bWFnaWMgPSBjb25mLT5sYXN0ID0gTlVMTDsKLQotICAgIC8qIHBhcnNlIGl0ICovCi0gICAgZm9yIChsaW5lbm8gPSAxOyBhcF9mZ2V0cyhsaW5lLCBCVUZTSVosIGYpID09IEFQUl9TVUNDRVNTOyBsaW5lbm8rKykgewotCWludCB3c19vZmZzZXQ7Ci0KLQkvKiBkZWxldGUgbmV3bGluZSAqLwotCWlmIChsaW5lWzBdKSB7Ci0JICAgIGxpbmVbc3RybGVuKGxpbmUpIC0gMV0gPSAnXDAnOwotCX0KLQotCS8qIHNraXAgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0Jd3Nfb2Zmc2V0ID0gMDsKLQl3aGlsZSAobGluZVt3c19vZmZzZXRdICYmIGFwX2lzc3BhY2UobGluZVt3c19vZmZzZXRdKSkgewotCSAgICB3c19vZmZzZXQrKzsKLQl9Ci0KLQkvKiBza2lwIGJsYW5rIGxpbmVzICovCi0JaWYgKGxpbmVbd3Nfb2Zmc2V0XSA9PSAwKSB7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotCS8qIGNvbW1lbnQsIGRvIG5vdCBwYXJzZSAqLwotCWlmIChsaW5lW3dzX29mZnNldF0gPT0gJyMnKQotCSAgICBjb250aW51ZTsKLQotI2lmIE1JTUVfTUFHSUNfREVCVUcKLQkvKiBpZiB3ZSBnZXQgaGVyZSwgd2UncmUgZ29pbmcgdG8gdXNlIGl0IHNvIGNvdW50IGl0ICovCi0JcnVsZSsrOwotI2VuZGlmCi0KLQkvKiBwYXJzZSBpdCAqLwotCWlmIChwYXJzZShzLCBwLCBsaW5lICsgd3Nfb2Zmc2V0LCBsaW5lbm8pICE9IDApCi0JICAgICsrZXJyczsKLSAgICB9Ci0KLSAgICAodm9pZCkgYXBfY2xvc2UoZik7Ci0KLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19ERUJVRywgMCwgcywKLQkJTU9ETkFNRSAiOiBhcHByZW50aWNlIGNvbmY9JXggZmlsZT0lcyBtPSVzIG0tPm5leHQ9JXMgbGFzdD0lcyIsCi0JCWNvbmYsCi0JCWNvbmYtPm1hZ2ljZmlsZSA/IGNvbmYtPm1hZ2ljZmlsZSA6ICJOVUxMIiwKLQkJY29uZi0+bWFnaWMgPyAic2V0IiA6ICJOVUxMIiwKLQkJKGNvbmYtPm1hZ2ljICYmIGNvbmYtPm1hZ2ljLT5uZXh0KSA/ICJzZXQiIDogIk5VTEwiLAotCQljb25mLT5sYXN0ID8gInNldCIgOiAiTlVMTCIpOwotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIDAsIHMsCi0JCU1PRE5BTUUgIjogYXBwcmVudGljZSByZWFkICVkIGxpbmVzLCAlZCBydWxlcywgJWQgZXJyb3JzIiwKLQkJbGluZW5vLCBydWxlLCBlcnJzKTsKLSNlbmRpZgotCi0jaWYgTUlNRV9NQUdJQ19ERUJVRwotICAgIHByZXZtID0gMDsKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0RFQlVHLCAwLCBzLAotCQlNT0ROQU1FICI6IGFwcHJlbnRpY2UgdGVzdCIpOwotICAgIGZvciAobSA9IGNvbmYtPm1hZ2ljOyBtOyBtID0gbS0+bmV4dCkgewotCWlmIChhcF9pc3ByaW50KCgoKHVuc2lnbmVkIGxvbmcpIG0pID4+IDI0KSAmIDI1NSkgJiYKLQkgICAgYXBfaXNwcmludCgoKCh1bnNpZ25lZCBsb25nKSBtKSA+PiAxNikgJiAyNTUpICYmCi0JICAgIGFwX2lzcHJpbnQoKCgodW5zaWduZWQgbG9uZykgbSkgPj4gOCkgJiAyNTUpICYmCi0JICAgIGFwX2lzcHJpbnQoKCh1bnNpZ25lZCBsb25nKSBtKSAmIDI1NSkpIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19ERUJVRywgMCwgcywKLQkJCU1PRE5BTUUgIjogYXBwcmVudGljZTogUE9JTlRFUiBDTE9CQkVSRUQhICIKLQkJCSJtPVwiJWMlYyVjJWNcIiBsaW5lPSVkIiwKLQkJCSgoKHVuc2lnbmVkIGxvbmcpIG0pID4+IDI0KSAmIDI1NSwKLQkJCSgoKHVuc2lnbmVkIGxvbmcpIG0pID4+IDE2KSAmIDI1NSwKLQkJCSgoKHVuc2lnbmVkIGxvbmcpIG0pID4+IDgpICYgMjU1LAotCQkJKCh1bnNpZ25lZCBsb25nKSBtKSAmIDI1NSwKLQkJCXByZXZtID8gcHJldm0tPmxpbmVubyA6IC0xKTsKLQkgICAgYnJlYWs7Ci0JfQotCXByZXZtID0gbTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHJldHVybiAoZXJycyA/IC0xIDogMCk7Ci19Ci0KLS8qCi0gKiBleHRlbmQgdGhlIHNpZ24gYml0IGlmIHRoZSBjb21wYXJpc29uIGlzIHRvIGJlIHNpZ25lZAotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzaWduZXh0ZW5kKHNlcnZlcl9yZWMgKnMsIHN0cnVjdCBtYWdpYyAqbSwgdW5zaWduZWQgbG9uZyB2KQotewotICAgIGlmICghKG0tPmZsYWcgJiBVTlNJR05FRCkpCi0Jc3dpdGNoIChtLT50eXBlKSB7Ci0JICAgIC8qCi0JICAgICAqIERvIG5vdCByZW1vdmUgdGhlIGNhc3RzIGJlbG93LiAgVGhleSBhcmUgdml0YWwuIFdoZW4gbGF0ZXIKLQkgICAgICogY29tcGFyZWQgd2l0aCB0aGUgZGF0YSwgdGhlIHNpZ24gZXh0ZW5zaW9uIG11c3QgaGF2ZSBoYXBwZW5lZC4KLQkgICAgICovCi0JY2FzZSBCWVRFOgotCSAgICB2ID0gKGNoYXIpIHY7Ci0JICAgIGJyZWFrOwotCWNhc2UgU0hPUlQ6Ci0JY2FzZSBCRVNIT1JUOgotCWNhc2UgTEVTSE9SVDoKLQkgICAgdiA9IChzaG9ydCkgdjsKLQkgICAgYnJlYWs7Ci0JY2FzZSBEQVRFOgotCWNhc2UgQkVEQVRFOgotCWNhc2UgTEVEQVRFOgotCWNhc2UgTE9ORzoKLQljYXNlIEJFTE9ORzoKLQljYXNlIExFTE9ORzoKLQkgICAgdiA9IChsb25nKSB2OwotCSAgICBicmVhazsKLQljYXNlIFNUUklORzoKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19FUlIsIDAsIHMsCi0JCQlNT0ROQU1FICI6IGNhbid0IGhhcHBlbjogbS0+dHlwZT0lZCIsIG0tPnR5cGUpOwotCSAgICByZXR1cm4gLTE7Ci0JfQotICAgIHJldHVybiB2OwotfQotCi0vKgotICogcGFyc2Ugb25lIGxpbmUgZnJvbSBtYWdpYyBmaWxlLCBwdXQgaW50byBtYWdpY1tpbmRleCsrXSBpZiB2YWxpZAotICovCi1zdGF0aWMgaW50IHBhcnNlKHNlcnZlcl9yZWMgKnNlcnYsIGFwX2NvbnRleHRfdCAqcCwgY2hhciAqbCwgaW50IGxpbmVubykKLXsKLSAgICBzdHJ1Y3QgbWFnaWMgKm07Ci0gICAgY2hhciAqdCwgKnM7Ci0gICAgbWFnaWNfc2VydmVyX2NvbmZpZ19yZWMgKmNvbmYgPSAobWFnaWNfc2VydmVyX2NvbmZpZ19yZWMgKikKLQkJICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKHNlcnYtPm1vZHVsZV9jb25maWcsICZtaW1lX21hZ2ljX21vZHVsZSk7Ci0KLSAgICAvKiBhbGxvY2F0ZSBtYWdpYyBzdHJ1Y3R1cmUgZW50cnkgKi8KLSAgICBtID0gKHN0cnVjdCBtYWdpYyAqKSBhcF9wY2FsbG9jKHAsIHNpemVvZihzdHJ1Y3QgbWFnaWMpKTsKLQotICAgIC8qIGFwcGVuZCB0byBsaW5rZWQgbGlzdCAqLwotICAgIG0tPm5leHQgPSBOVUxMOwotICAgIGlmICghY29uZi0+bWFnaWMgfHwgIWNvbmYtPmxhc3QpIHsKLQljb25mLT5tYWdpYyA9IGNvbmYtPmxhc3QgPSBtOwotICAgIH0KLSAgICBlbHNlIHsKLQljb25mLT5sYXN0LT5uZXh0ID0gbTsKLQljb25mLT5sYXN0ID0gbTsKLSAgICB9Ci0KLSAgICAvKiBzZXQgdmFsdWVzIGluIG1hZ2ljIHN0cnVjdHVyZSAqLwotICAgIG0tPmZsYWcgPSAwOwotICAgIG0tPmNvbnRfbGV2ZWwgPSAwOwotICAgIG0tPmxpbmVubyA9IGxpbmVubzsKLQotICAgIHdoaWxlICgqbCA9PSAnPicpIHsKLQkrK2w7CQkJLyogc3RlcCBvdmVyICovCi0JbS0+Y29udF9sZXZlbCsrOwotICAgIH0KLQotICAgIGlmIChtLT5jb250X2xldmVsICE9IDAgJiYgKmwgPT0gJygnKSB7Ci0JKytsOwkJCS8qIHN0ZXAgb3ZlciAqLwotCW0tPmZsYWcgfD0gSU5ESVI7Ci0gICAgfQotCi0gICAgLyogZ2V0IG9mZnNldCwgdGhlbiBza2lwIG92ZXIgaXQgKi8KLSAgICBtLT5vZmZzZXQgPSAoaW50KSBzdHJ0b2wobCwgJnQsIDApOwotICAgIGlmIChsID09IHQpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0VSUiwgMCwgc2VydiwKLQkJICAgIE1PRE5BTUUgIjogb2Zmc2V0ICVzIGludmFsaWQiLCBsKTsKLSAgICB9Ci0gICAgbCA9IHQ7Ci0KLSAgICBpZiAobS0+ZmxhZyAmIElORElSKSB7Ci0JbS0+aW4udHlwZSA9IExPTkc7Ci0JbS0+aW4ub2Zmc2V0ID0gMDsKLQkvKgotCSAqIHJlYWQgWy5sYnNdWystXW5ubm5uKQotCSAqLwotCWlmICgqbCA9PSAnLicpIHsKLQkgICAgc3dpdGNoICgqKytsKSB7Ci0JICAgIGNhc2UgJ2wnOgotCQltLT5pbi50eXBlID0gTE9ORzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgJ3MnOgotCQltLT5pbi50eXBlID0gU0hPUlQ7Ci0JCWJyZWFrOwotCSAgICBjYXNlICdiJzoKLQkJbS0+aW4udHlwZSA9IEJZVEU7Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0VSUiwgMCwgc2VydiwKLQkJCU1PRE5BTUUgIjogaW5kaXJlY3Qgb2Zmc2V0IHR5cGUgJWMgaW52YWxpZCIsICpsKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgbCsrOwotCX0KLQlzID0gbDsKLQlpZiAoKmwgPT0gJysnIHx8ICpsID09ICctJykKLQkgICAgbCsrOwotCWlmIChhcF9pc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSAqbCkpIHsKLQkgICAgbS0+aW4ub2Zmc2V0ID0gc3RydG9sKGwsICZ0LCAwKTsKLQkgICAgaWYgKCpzID09ICctJykKLQkJbS0+aW4ub2Zmc2V0ID0gLW0tPmluLm9mZnNldDsKLQl9Ci0JZWxzZQotCSAgICB0ID0gbDsKLQlpZiAoKnQrKyAhPSAnKScpIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19FUlIsIDAsIHNlcnYsCi0JCQlNT0ROQU1FICI6IG1pc3NpbmcgJyknIGluIGluZGlyZWN0IG9mZnNldCIpOwotCX0KLQlsID0gdDsKLSAgICB9Ci0KLQotICAgIHdoaWxlIChhcF9pc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSAqbCkpCi0JKytsOwotICAgIEVBVEFCOwotCi0jZGVmaW5lIE5CWVRFICAgICAgICAgICA0Ci0jZGVmaW5lIE5TSE9SVCAgICAgICAgICA1Ci0jZGVmaW5lIE5MT05HICAgICAgICAgICA0Ci0jZGVmaW5lIE5TVFJJTkcgICAgICAgICA2Ci0jZGVmaW5lIE5EQVRFICAgICAgICAgICA0Ci0jZGVmaW5lIE5CRVNIT1JUICAgICAgICA3Ci0jZGVmaW5lIE5CRUxPTkcgICAgICAgICA2Ci0jZGVmaW5lIE5CRURBVEUgICAgICAgICA2Ci0jZGVmaW5lIE5MRVNIT1JUICAgICAgICA3Ci0jZGVmaW5lIE5MRUxPTkcgICAgICAgICA2Ci0jZGVmaW5lIE5MRURBVEUgICAgICAgICA2Ci0KLSAgICBpZiAoKmwgPT0gJ3UnKSB7Ci0JKytsOwotCW0tPmZsYWcgfD0gVU5TSUdORUQ7Ci0gICAgfQotCi0gICAgLyogZ2V0IHR5cGUsIHNraXAgaXQgKi8KLSAgICBpZiAoc3RybmNtcChsLCAiYnl0ZSIsIE5CWVRFKSA9PSAwKSB7Ci0JbS0+dHlwZSA9IEJZVEU7Ci0JbCArPSBOQllURTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RybmNtcChsLCAic2hvcnQiLCBOU0hPUlQpID09IDApIHsKLQltLT50eXBlID0gU0hPUlQ7Ci0JbCArPSBOU0hPUlQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cm5jbXAobCwgImxvbmciLCBOTE9ORykgPT0gMCkgewotCW0tPnR5cGUgPSBMT05HOwotCWwgKz0gTkxPTkc7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cm5jbXAobCwgInN0cmluZyIsIE5TVFJJTkcpID09IDApIHsKLQltLT50eXBlID0gU1RSSU5HOwotCWwgKz0gTlNUUklORzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RybmNtcChsLCAiZGF0ZSIsIE5EQVRFKSA9PSAwKSB7Ci0JbS0+dHlwZSA9IERBVEU7Ci0JbCArPSBOREFURTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RybmNtcChsLCAiYmVzaG9ydCIsIE5CRVNIT1JUKSA9PSAwKSB7Ci0JbS0+dHlwZSA9IEJFU0hPUlQ7Ci0JbCArPSBOQkVTSE9SVDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RybmNtcChsLCAiYmVsb25nIiwgTkJFTE9ORykgPT0gMCkgewotCW0tPnR5cGUgPSBCRUxPTkc7Ci0JbCArPSBOQkVMT05HOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJuY21wKGwsICJiZWRhdGUiLCBOQkVEQVRFKSA9PSAwKSB7Ci0JbS0+dHlwZSA9IEJFREFURTsKLQlsICs9IE5CRURBVEU7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cm5jbXAobCwgImxlc2hvcnQiLCBOTEVTSE9SVCkgPT0gMCkgewotCW0tPnR5cGUgPSBMRVNIT1JUOwotCWwgKz0gTkxFU0hPUlQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0cm5jbXAobCwgImxlbG9uZyIsIE5MRUxPTkcpID09IDApIHsKLQltLT50eXBlID0gTEVMT05HOwotCWwgKz0gTkxFTE9ORzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RybmNtcChsLCAibGVkYXRlIiwgTkxFREFURSkgPT0gMCkgewotCW0tPnR5cGUgPSBMRURBVEU7Ci0JbCArPSBOTEVEQVRFOwotICAgIH0KLSAgICBlbHNlIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0VSUiwgMCwgc2VydiwKLQkJICAgIE1PRE5BTUUgIjogdHlwZSAlcyBpbnZhbGlkIiwgbCk7Ci0JcmV0dXJuIC0xOwotICAgIH0KLSAgICAvKiBOZXctc3R5bGUgYW5kaW5nOiAiMCBieXRlJjB4ODAgPTB4ODAgZHluYW1pY2FsbHkgbGlua2VkIiAqLwotICAgIGlmICgqbCA9PSAnJicpIHsKLQkrK2w7Ci0JbS0+bWFzayA9IHNpZ25leHRlbmQoc2VydiwgbSwgc3RydG9sKGwsICZsLCAwKSk7Ci0gICAgfQotICAgIGVsc2UKLQltLT5tYXNrID0gfjBMOwotICAgIEVBVEFCOwotCi0gICAgc3dpdGNoICgqbCkgewotICAgIGNhc2UgJz4nOgotICAgIGNhc2UgJzwnOgotCS8qIE9sZC1zdHlsZSBhbmRpbmc6ICIwIGJ5dGUgJjB4ODAgZHluYW1pY2FsbHkgbGlua2VkIiAqLwotICAgIGNhc2UgJyYnOgotICAgIGNhc2UgJ14nOgotICAgIGNhc2UgJz0nOgotCW0tPnJlbG4gPSAqbDsKLQkrK2w7Ci0JYnJlYWs7Ci0gICAgY2FzZSAnISc6Ci0JaWYgKG0tPnR5cGUgIT0gU1RSSU5HKSB7Ci0JICAgIG0tPnJlbG4gPSAqbDsKLQkgICAgKytsOwotCSAgICBicmVhazsKLQl9Ci0JLyogRkFMTCBUSFJPVUdIICovCi0gICAgZGVmYXVsdDoKLQlpZiAoKmwgPT0gJ3gnICYmIGFwX2lzc3BhY2UoKHVuc2lnbmVkIGNoYXIpIGxbMV0pKSB7Ci0JICAgIG0tPnJlbG4gPSAqbDsKLQkgICAgKytsOwotCSAgICBnb3RvIEdldERlc2M7CS8qIEJpbGwgVGhlIENhdCAqLwotCX0KLQltLT5yZWxuID0gJz0nOwotCWJyZWFrOwotICAgIH0KLSAgICBFQVRBQjsKLQotICAgIGlmIChnZXR2YWx1ZShzZXJ2LCBtLCAmbCkpCi0JcmV0dXJuIC0xOwotICAgIC8qCi0gICAgICogbm93IGdldCBsYXN0IHBhcnQgLSB0aGUgZGVzY3JpcHRpb24KLSAgICAgKi8KLSAgR2V0RGVzYzoKLSAgICBFQVRBQjsKLSAgICBpZiAobFswXSA9PSAnXGInKSB7Ci0JKytsOwotCW0tPm5vc3BmbGFnID0gMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKGxbMF0gPT0gJ1xcJykgJiYgKGxbMV0gPT0gJ2InKSkgewotCSsrbDsKLQkrK2w7Ci0JbS0+bm9zcGZsYWcgPSAxOwotICAgIH0KLSAgICBlbHNlCi0JbS0+bm9zcGZsYWcgPSAwOwotICAgIHN0cm5jcHkobS0+ZGVzYywgbCwgc2l6ZW9mKG0tPmRlc2MpIC0gMSk7Ci0gICAgbS0+ZGVzY1tzaXplb2YobS0+ZGVzYykgLSAxXSA9ICdcMCc7Ci0KLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19ERUJVRywgMCwgc2VydiwKLQkJTU9ETkFNRSAiOiBwYXJzZSBsaW5lPSVkIG09JXggbmV4dD0leCBjb250PSVkIGRlc2M9JXMiLAotCQlsaW5lbm8sIG0sIG0tPm5leHQsIG0tPmNvbnRfbGV2ZWwsIG0tPmRlc2MpOwotI2VuZGlmIC8qIE1JTUVfTUFHSUNfREVCVUcgKi8KLQotICAgIHJldHVybiAwOwotfQotCi0vKgotICogUmVhZCBhIG51bWVyaWMgdmFsdWUgZnJvbSBhIHBvaW50ZXIsIGludG8gdGhlIHZhbHVlIHVuaW9uIG9mIGEgbWFnaWMKLSAqIHBvaW50ZXIsIGFjY29yZGluZyB0byB0aGUgbWFnaWMgdHlwZS4gIFVwZGF0ZSB0aGUgc3RyaW5nIHBvaW50ZXIgdG8gcG9pbnQKLSAqIGp1c3QgYWZ0ZXIgdGhlIG51bWJlciByZWFkLiAgUmV0dXJuIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlLgotICovCi1zdGF0aWMgaW50IGdldHZhbHVlKHNlcnZlcl9yZWMgKnMsIHN0cnVjdCBtYWdpYyAqbSwgY2hhciAqKnApCi17Ci0gICAgaW50IHNsZW47Ci0KLSAgICBpZiAobS0+dHlwZSA9PSBTVFJJTkcpIHsKLQkqcCA9IGdldHN0cihzLCAqcCwgbS0+dmFsdWUucywgc2l6ZW9mKG0tPnZhbHVlLnMpLCAmc2xlbik7Ci0JbS0+dmFsbGVuID0gc2xlbjsKLSAgICB9Ci0gICAgZWxzZSBpZiAobS0+cmVsbiAhPSAneCcpCi0JbS0+dmFsdWUubCA9IHNpZ25leHRlbmQocywgbSwgc3RydG9sKCpwLCBwLCAwKSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IGEgc3RyaW5nIGNvbnRhaW5pbmcgQyBjaGFyYWN0ZXIgZXNjYXBlcy4gIFN0b3AgYXQgYW4gdW5lc2NhcGVkCi0gKiBzcGFjZSBvciB0YWIuIENvcHkgdGhlIGNvbnZlcnRlZCB2ZXJzaW9uIHRvICJwIiwgcmV0dXJuaW5nIGl0cyBsZW5ndGggaW4KLSAqICpzbGVuLiBSZXR1cm4gdXBkYXRlZCBzY2FuIHBvaW50ZXIgYXMgZnVuY3Rpb24gcmVzdWx0LgotICovCi1zdGF0aWMgY2hhciAqZ2V0c3RyKHNlcnZlcl9yZWMgKnNlcnYsIHJlZ2lzdGVyIGNoYXIgKnMsIHJlZ2lzdGVyIGNoYXIgKnAsCi0JCSAgICBpbnQgcGxlbiwgaW50ICpzbGVuKQotewotICAgIGNoYXIgKm9yaWdzID0gcywgKm9yaWdwID0gcDsKLSAgICBjaGFyICpwbWF4ID0gcCArIHBsZW4gLSAxOwotICAgIHJlZ2lzdGVyIGludCBjOwotICAgIHJlZ2lzdGVyIGludCB2YWw7Ci0KLSAgICB3aGlsZSAoKGMgPSAqcysrKSAhPSAnXDAnKSB7Ci0JaWYgKGFwX2lzc3BhY2UoKHVuc2lnbmVkIGNoYXIpIGMpKQotCSAgICBicmVhazsKLQlpZiAocCA+PSBwbWF4KSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfRVJSLCAwLCBzZXJ2LAotCQkJTU9ETkFNRSAiOiBzdHJpbmcgdG9vIGxvbmc6ICVzIiwgb3JpZ3MpOwotCSAgICBicmVhazsKLQl9Ci0JaWYgKGMgPT0gJ1xcJykgewotCSAgICBzd2l0Y2ggKGMgPSAqcysrKSB7Ci0KLQkgICAgY2FzZSAnXDAnOgotCQlnb3RvIG91dDsKLQotCSAgICBkZWZhdWx0OgotCQkqcCsrID0gKGNoYXIpIGM7Ci0JCWJyZWFrOwotCi0JICAgIGNhc2UgJ24nOgotCQkqcCsrID0gJ1xuJzsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSAncic6Ci0JCSpwKysgPSAnXHInOwotCQlicmVhazsKLQotCSAgICBjYXNlICdiJzoKLQkJKnArKyA9ICdcYic7Ci0JCWJyZWFrOwotCi0JICAgIGNhc2UgJ3QnOgotCQkqcCsrID0gJ1x0JzsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSAnZic6Ci0JCSpwKysgPSAnXGYnOwotCQlicmVhazsKLQotCSAgICBjYXNlICd2JzoKLQkJKnArKyA9ICdcdic7Ci0JCWJyZWFrOwotCi0JCS8qIFwgYW5kIHVwIHRvIDMgb2N0YWwgZGlnaXRzICovCi0JICAgIGNhc2UgJzAnOgotCSAgICBjYXNlICcxJzoKLQkgICAgY2FzZSAnMic6Ci0JICAgIGNhc2UgJzMnOgotCSAgICBjYXNlICc0JzoKLQkgICAgY2FzZSAnNSc6Ci0JICAgIGNhc2UgJzYnOgotCSAgICBjYXNlICc3JzoKLQkJdmFsID0gYyAtICcwJzsKLQkJYyA9ICpzKys7CS8qIHRyeSBmb3IgMiAqLwotCQlpZiAoYyA+PSAnMCcgJiYgYyA8PSAnNycpIHsKLQkJICAgIHZhbCA9ICh2YWwgPDwgMykgfCAoYyAtICcwJyk7Ci0JCSAgICBjID0gKnMrKzsJLyogdHJ5IGZvciAzICovCi0JCSAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnNycpCi0JCQl2YWwgPSAodmFsIDw8IDMpIHwgKGMgLSAnMCcpOwotCQkgICAgZWxzZQotCQkJLS1zOwotCQl9Ci0JCWVsc2UKLQkJICAgIC0tczsKLQkJKnArKyA9IChjaGFyKSB2YWw7Ci0JCWJyZWFrOwotCi0JCS8qIFx4IGFuZCB1cCB0byAzIGhleCBkaWdpdHMgKi8KLQkgICAgY2FzZSAneCc6Ci0JCXZhbCA9ICd4JzsJLyogRGVmYXVsdCBpZiBubyBkaWdpdHMgKi8KLQkJYyA9IGhleHRvaW50KCpzKyspOwkvKiBHZXQgbmV4dCBjaGFyICovCi0JCWlmIChjID49IDApIHsKLQkJICAgIHZhbCA9IGM7Ci0JCSAgICBjID0gaGV4dG9pbnQoKnMrKyk7Ci0JCSAgICBpZiAoYyA+PSAwKSB7Ci0JCQl2YWwgPSAodmFsIDw8IDQpICsgYzsKLQkJCWMgPSBoZXh0b2ludCgqcysrKTsKLQkJCWlmIChjID49IDApIHsKLQkJCSAgICB2YWwgPSAodmFsIDw8IDQpICsgYzsKLQkJCX0KLQkJCWVsc2UKLQkJCSAgICAtLXM7Ci0JCSAgICB9Ci0JCSAgICBlbHNlCi0JCQktLXM7Ci0JCX0KLQkJZWxzZQotCQkgICAgLS1zOwotCQkqcCsrID0gKGNoYXIpIHZhbDsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0JZWxzZQotCSAgICAqcCsrID0gKGNoYXIpIGM7Ci0gICAgfQotICBvdXQ6Ci0gICAgKnAgPSAnXDAnOwotICAgICpzbGVuID0gcCAtIG9yaWdwOwotICAgIHJldHVybiBzOwotfQotCi0KLS8qIFNpbmdsZSBoZXggY2hhciB0byBpbnQ7IC0xIGlmIG5vdCBhIGhleCBjaGFyLiAqLwotc3RhdGljIGludCBoZXh0b2ludChpbnQgYykKLXsKLSAgICBpZiAoYXBfaXNkaWdpdCgodW5zaWduZWQgY2hhcikgYykpCi0JcmV0dXJuIGMgLSAnMCc7Ci0gICAgaWYgKChjID49ICdhJykgJiYgKGMgPD0gJ2YnKSkKLQlyZXR1cm4gYyArIDEwIC0gJ2EnOwotICAgIGlmICgoYyA+PSAnQScpICYmIChjIDw9ICdGJykpCi0JcmV0dXJuIGMgKyAxMCAtICdBJzsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLQotLyoKLSAqIHJldHVybiBET05FIHRvIGluZGljYXRlIGl0J3MgYmVlbiBoYW5kbGVkCi0gKiByZXR1cm4gT0sgdG8gaW5kaWNhdGUgaXQncyBhIHJlZ3VsYXIgZmlsZSBzdGlsbCBuZWVkaW5nIGhhbmRsaW5nCi0gKiBvdGhlciByZXR1cm5zIGluZGljYXRlIGEgZmFpbHVyZSBvZiBzb21lIHNvcnQKLSAqLwotc3RhdGljIGludCBmc21hZ2ljKHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICpmbikKLXsKLSAgICBzd2l0Y2ggKHItPmZpbmZvLnByb3RlY3Rpb24gJiBTX0lGTVQpIHsKLSAgICBjYXNlIFNfSUZESVI6Ci0JbWFnaWNfcnNsX3B1dHMociwgRElSX01BR0lDX1RZUEUpOwotCXJldHVybiBET05FOwotICAgIGNhc2UgU19JRkNIUjoKLQkvKgotCSAqICh2b2lkKSBtYWdpY19yc2xfcHJpbnRmKHIsImNoYXJhY3RlciBzcGVjaWFsICglZC8lZCkiLAotCSAqIG1ham9yKHNiLT5zdF9yZGV2KSwgbWlub3Ioc2ItPnN0X3JkZXYpKTsKLQkgKi8KLQkodm9pZCkgbWFnaWNfcnNsX3B1dHMociwgTUlNRV9CSU5BUllfVU5LTk9XTik7Ci0JcmV0dXJuIERPTkU7Ci0jaWZkZWYgU19JRkJMSwotICAgIGNhc2UgU19JRkJMSzoKLQkvKgotCSAqICh2b2lkKSBtYWdpY19yc2xfcHJpbnRmKHIsImJsb2NrIHNwZWNpYWwgKCVkLyVkKSIsCi0JICogbWFqb3Ioc2ItPnN0X3JkZXYpLCBtaW5vcihzYi0+c3RfcmRldikpOwotCSAqLwotCSh2b2lkKSBtYWdpY19yc2xfcHV0cyhyLCBNSU1FX0JJTkFSWV9VTktOT1dOKTsKLQlyZXR1cm4gRE9ORTsKLQkvKiBUT0RPIGFkZCBjb2RlIHRvIGhhbmRsZSBWNyBNVVggYW5kIEJsaXQgTVVYIGZpbGVzICovCi0jZW5kaWYKLSNpZmRlZiAgICBTX0lGSUZPCi0gICAgY2FzZSBTX0lGSUZPOgotCS8qCi0JICogbWFnaWNfcnNsX3B1dHMociwiZmlmbyAobmFtZWQgcGlwZSkiKTsKLQkgKi8KLQkodm9pZCkgbWFnaWNfcnNsX3B1dHMociwgTUlNRV9CSU5BUllfVU5LTk9XTik7Ci0JcmV0dXJuIERPTkU7Ci0jZW5kaWYKLSNpZmRlZiAgICBTX0lGTE5LCi0gICAgY2FzZSBTX0lGTE5LOgotCS8qIFdlIHVzZWQgc3RhdCgpLCB0aGUgb25seSBwb3NzaWJsZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB0aGUKLQkgKiBzeW1saW5rIGlzIGJyb2tlbi4KLQkgKi8KLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19FUlIsIDAsIHIsCi0JCSAgICBNT0ROQU1FICI6IGJyb2tlbiBzeW1saW5rICglcykiLCBmbik7Ci0JcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotI2VuZGlmCi0jaWZkZWYgICAgU19JRlNPQ0sKLSNpZm5kZWYgX19DT0hFUkVOVF9fCi0gICAgY2FzZSBTX0lGU09DSzoKLQltYWdpY19yc2xfcHV0cyhyLCBNSU1FX0JJTkFSWV9VTktOT1dOKTsKLQlyZXR1cm4gRE9ORTsKLSNlbmRpZgotI2VuZGlmCi0gICAgY2FzZSBTX0lGUkVHOgotCWJyZWFrOwotICAgIGRlZmF1bHQ6Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfRVJSLCAwLCByLAotCQkgICAgTU9ETkFNRSAiOiBpbnZhbGlkIG1vZGUgMCVvLiIsICh1bnNpZ25lZCBpbnQpci0+ZmluZm8ucHJvdGVjdGlvbik7Ci0JcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgIH0KLQotICAgIC8qCi0gICAgICogcmVndWxhciBmaWxlLCBjaGVjayBuZXh0IHBvc3NpYmlsaXR5Ci0gICAgICovCi0gICAgaWYgKHItPmZpbmZvLnNpemUgPT0gMCkgewotCW1hZ2ljX3JzbF9wdXRzKHIsIE1JTUVfVEVYVF9VTktOT1dOKTsKLQlyZXR1cm4gRE9ORTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vKgotICogc29mdG1hZ2ljIC0gbG9va3VwIG9uZSBmaWxlIGluIGRhdGFiYXNlIChhbHJlYWR5IHJlYWQgZnJvbSAvZXRjL21hZ2ljIGJ5Ci0gKiBhcHByZW50aWNlLmMpLiBQYXNzZWQgdGhlIG5hbWUgYW5kIEZJTEUgKiBvZiBvbmUgZmlsZSB0byBiZSB0eXBlZC4KLSAqLwotCQkvKiBBUkdTVVNFRDEgKi8vKiBuYnl0ZXMgcGFzc2VkIGZvciByZWd1bGFyaXR5LCBtYXliZSBuZWVkIGxhdGVyICovCi1zdGF0aWMgaW50IHNvZnRtYWdpYyhyZXF1ZXN0X3JlYyAqciwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbmJ5dGVzKQotewotICAgIGlmIChtYXRjaChyLCBidWYsIG5ieXRlcykpCi0JcmV0dXJuIDE7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIEdvIHRocm91Z2ggdGhlIHdob2xlIGxpc3QsIHN0b3BwaW5nIGlmIHlvdSBmaW5kIGEgbWF0Y2guICBQcm9jZXNzIGFsbCB0aGUKLSAqIGNvbnRpbnVhdGlvbnMgb2YgdGhhdCBtYXRjaCBiZWZvcmUgcmV0dXJuaW5nLgotICoKLSAqIFdlIHN1cHBvcnQgbXVsdGktbGV2ZWwgY29udGludWF0aW9uczoKLSAqCi0gKiBBdCBhbnkgdGltZSB3aGVuIHByb2Nlc3NpbmcgYSBzdWNjZXNzZnVsIHRvcC1sZXZlbCBtYXRjaCwgdGhlcmUgaXMgYSBjdXJyZW50Ci0gKiBjb250aW51YXRpb24gbGV2ZWw7IGl0IHJlcHJlc2VudHMgdGhlIGxldmVsIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWxseQotICogbWF0Y2hlZCBjb250aW51YXRpb24uCi0gKgotICogQ29udGludWF0aW9ucyBhYm92ZSB0aGF0IGxldmVsIGFyZSBza2lwcGVkIGFzLCBpZiB3ZSBzZWUgb25lLCBpdCBtZWFucyB0aGF0Ci0gKiB0aGUgY29udGludWF0aW9uIHRoYXQgY29udHJvbHMgdGhlbSAtIGkuZSwgdGhlIGxvd2VyLWxldmVsIGNvbnRpbnVhdGlvbgotICogcHJlY2VkaW5nIHRoZW0gLSBmYWlsZWQgdG8gbWF0Y2guCi0gKgotICogQ29udGludWF0aW9ucyBiZWxvdyB0aGF0IGxldmVsIGFyZSBwcm9jZXNzZWQgYXMsIGlmIHdlIHNlZSBvbmUsIGl0IG1lYW5zCi0gKiB3ZSd2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nIG9yIHNraXBwaW5nIGhpZ2hlci1sZXZlbCBjb250aW51YXRpb25zIHVuZGVyIHRoZQotICogY29udHJvbCBvZiBhIHN1Y2Nlc3NmdWwgb3IgdW5zdWNjZXNzZnVsIGxvd2VyLWxldmVsIGNvbnRpbnVhdGlvbiwgYW5kIGFyZQotICogbm93IHNlZWluZyB0aGUgbmV4dCBsb3dlci1sZXZlbCBjb250aW51YXRpb24gYW5kIHNob3VsZCBwcm9jZXNzIGl0LiAgVGhlCi0gKiBjdXJyZW50IGNvbnRpbnVhdGlvbiBsZXZlbCByZXZlcnRzIHRvIHRoZSBsZXZlbCBvZiB0aGUgb25lIHdlJ3JlIHNlZWluZy4KLSAqCi0gKiBDb250aW51YXRpb25zIGF0IHRoZSBjdXJyZW50IGxldmVsIGFyZSBwcm9jZXNzZWQgYXMsIGlmIHdlIHNlZSBvbmUsIHRoZXJlJ3MKLSAqIG5vIGxvd2VyLWxldmVsIGNvbnRpbnVhdGlvbiB0aGF0IG1heSBoYXZlIGZhaWxlZC4KLSAqCi0gKiBJZiBhIGNvbnRpbnVhdGlvbiBtYXRjaGVzLCB3ZSBidW1wIHRoZSBjdXJyZW50IGNvbnRpbnVhdGlvbiBsZXZlbCBzbyB0aGF0Ci0gKiBoaWdoZXItbGV2ZWwgY29udGludWF0aW9ucyBhcmUgcHJvY2Vzc2VkLgotICovCi1zdGF0aWMgaW50IG1hdGNoKHJlcXVlc3RfcmVjICpyLCB1bnNpZ25lZCBjaGFyICpzLCBpbnQgbmJ5dGVzKQotewotI2lmIE1JTUVfTUFHSUNfREVCVUcKLSAgICBpbnQgcnVsZV9jb3VudGVyID0gMDsKLSNlbmRpZgotICAgIGludCBjb250X2xldmVsID0gMDsKLSAgICBpbnQgbmVlZF9zZXBhcmF0b3IgPSAwOwotICAgIHVuaW9uIFZBTFVFVFlQRSBwOwotICAgIG1hZ2ljX3NlcnZlcl9jb25maWdfcmVjICpjb25mID0gKG1hZ2ljX3NlcnZlcl9jb25maWdfcmVjICopCi0JCWFwX2dldF9tb2R1bGVfY29uZmlnKHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgJm1pbWVfbWFnaWNfbW9kdWxlKTsKLSAgICBzdHJ1Y3QgbWFnaWMgKm07Ci0KLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0gICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIDAsIHIsCi0JCU1PRE5BTUUgIjogbWF0Y2ggY29uZj0leCBmaWxlPSVzIG09JXMgbS0+bmV4dD0lcyBsYXN0PSVzIiwKLQkJY29uZiwKLQkJY29uZi0+bWFnaWNmaWxlID8gY29uZi0+bWFnaWNmaWxlIDogIk5VTEwiLAotCQljb25mLT5tYWdpYyA/ICJzZXQiIDogIk5VTEwiLAotCQkoY29uZi0+bWFnaWMgJiYgY29uZi0+bWFnaWMtPm5leHQpID8gInNldCIgOiAiTlVMTCIsCi0JCWNvbmYtPmxhc3QgPyAic2V0IiA6ICJOVUxMIik7Ci0jZW5kaWYKLQotI2lmIE1JTUVfTUFHSUNfREVCVUcKLSAgICBmb3IgKG0gPSBjb25mLT5tYWdpYzsgbTsgbSA9IG0tPm5leHQpIHsKLQlpZiAoYXBfaXNwcmludCgoKCh1bnNpZ25lZCBsb25nKSBtKSA+PiAyNCkgJiAyNTUpICYmCi0JICAgIGFwX2lzcHJpbnQoKCgodW5zaWduZWQgbG9uZykgbSkgPj4gMTYpICYgMjU1KSAmJgotCSAgICBhcF9pc3ByaW50KCgoKHVuc2lnbmVkIGxvbmcpIG0pID4+IDgpICYgMjU1KSAmJgotCSAgICBhcF9pc3ByaW50KCgodW5zaWduZWQgbG9uZykgbSkgJiAyNTUpKSB7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0RFQlVHLCAwLCByLAotCQkJTU9ETkFNRSAiOiBtYXRjaDogUE9JTlRFUiBDTE9CQkVSRUQhICIKLQkJCSJtPVwiJWMlYyVjJWNcIiIsCi0JCQkoKCh1bnNpZ25lZCBsb25nKSBtKSA+PiAyNCkgJiAyNTUsCi0JCQkoKCh1bnNpZ25lZCBsb25nKSBtKSA+PiAxNikgJiAyNTUsCi0JCQkoKCh1bnNpZ25lZCBsb25nKSBtKSA+PiA4KSAmIDI1NSwKLQkJCSgodW5zaWduZWQgbG9uZykgbSkgJiAyNTUpOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmCi0KLSAgICBmb3IgKG0gPSBjb25mLT5tYWdpYzsgbTsgbSA9IG0tPm5leHQpIHsKLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0JcnVsZV9jb3VudGVyKys7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIDAsIHIsCi0JCSAgICBNT0ROQU1FICI6IGxpbmU9JWQgZGVzYz0lcyIsIG0tPmxpbmVubywgbS0+ZGVzYyk7Ci0jZW5kaWYKLQotCS8qIGNoZWNrIGlmIG1haW4gZW50cnkgbWF0Y2hlcyAqLwotCWlmICghbWdldChyLCAmcCwgcywgbSwgbmJ5dGVzKSB8fAotCSAgICAhbWNoZWNrKHIsICZwLCBtKSkgewotCSAgICBzdHJ1Y3QgbWFnaWMgKm1fY29udDsKLQotCSAgICAvKgotCSAgICAgKiBtYWluIGVudHJ5IGRpZG4ndCBtYXRjaCwgZmx1c2ggaXRzIGNvbnRpbnVhdGlvbnMKLQkgICAgICovCi0JICAgIGlmICghbS0+bmV4dCB8fCAobS0+bmV4dC0+Y29udF9sZXZlbCA9PSAwKSkgewotCQljb250aW51ZTsKLQkgICAgfQotCi0JICAgIG1fY29udCA9IG0tPm5leHQ7Ci0JICAgIHdoaWxlIChtX2NvbnQgJiYgKG1fY29udC0+Y29udF9sZXZlbCAhPSAwKSkgewotI2lmIE1JTUVfTUFHSUNfREVCVUcKLQkJcnVsZV9jb3VudGVyKys7Ci0JCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0RFQlVHLCAwLCByLAotCQkJTU9ETkFNRSAiOiBsaW5lPSVkIG1jPSV4IG1jLT5uZXh0PSV4IGNvbnQ9JWQgZGVzYz0lcyIsCi0JCQkgICAgbV9jb250LT5saW5lbm8sIG1fY29udCwKLQkJCSAgICBtX2NvbnQtPm5leHQsIG1fY29udC0+Y29udF9sZXZlbCwKLQkJCSAgICBtX2NvbnQtPmRlc2MpOwotI2VuZGlmCi0JCS8qCi0JCSAqIHRoaXMgdHJpY2sgYWxsb3dzIHVzIHRvIGtlZXAgKm0gaW4gc3luYyB3aGVuIHRoZSBjb250aW51ZQotCQkgKiBhZHZhbmNlcyB0aGUgcG9pbnRlcgotCQkgKi8KLQkJbSA9IG1fY29udDsKLQkJbV9jb250ID0gbV9jb250LT5uZXh0OwotCSAgICB9Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotCS8qIGlmIHdlIGdldCBoZXJlLCB0aGUgbWFpbiBlbnRyeSBydWxlIHdhcyBhIG1hdGNoICovCi0JLyogdGhpcyB3aWxsIGJlIHRoZSBsYXN0IHJ1biB0aHJvdWdoIHRoZSBsb29wICovCi0jaWYgTUlNRV9NQUdJQ19ERUJVRwotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0RFQlVHLCAwLCByLAotCQkgICAgTU9ETkFNRSAiOiBydWxlIG1hdGNoZWQsIGxpbmU9JWQgdHlwZT0lZCAlcyIsCi0JCSAgICBtLT5saW5lbm8sIG0tPnR5cGUsCi0JCSAgICAobS0+dHlwZSA9PSBTVFJJTkcpID8gbS0+dmFsdWUucyA6ICIiKTsKLSNlbmRpZgotCi0JLyogcHJpbnQgdGhlIG1hdGNoICovCi0JbXByaW50KHIsICZwLCBtKTsKLQotCS8qCi0JICogSWYgd2UgcHJpbnRlZCBzb21ldGhpbmcsIHdlJ2xsIG5lZWQgdG8gcHJpbnQgYSBibGFuayBiZWZvcmUgd2UKLQkgKiBwcmludCBzb21ldGhpbmcgZWxzZS4KLQkgKi8KLQlpZiAobS0+ZGVzY1swXSkKLQkgICAgbmVlZF9zZXBhcmF0b3IgPSAxOwotCS8qIGFuZCBhbnkgY29udGludWF0aW9ucyB0aGF0IG1hdGNoICovCi0JY29udF9sZXZlbCsrOwotCS8qCi0JICogd2hpbGUgKG0gJiYgbS0+bmV4dCAmJiBtLT5uZXh0LT5jb250X2xldmVsICE9IDAgJiYgKCBtID0gbS0+bmV4dAotCSAqICkpCi0JICovCi0JbSA9IG0tPm5leHQ7Ci0Jd2hpbGUgKG0gJiYgKG0tPmNvbnRfbGV2ZWwgIT0gMCkpIHsKLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0RFQlVHLCAwLCByLAotCQkJTU9ETkFNRSAiOiBtYXRjaCBsaW5lPSVkIGNvbnQ9JWQgdHlwZT0lZCAlcyIsCi0JCQltLT5saW5lbm8sIG0tPmNvbnRfbGV2ZWwsIG0tPnR5cGUsCi0JCQkobS0+dHlwZSA9PSBTVFJJTkcpID8gbS0+dmFsdWUucyA6ICIiKTsKLSNlbmRpZgotCSAgICBpZiAoY29udF9sZXZlbCA+PSBtLT5jb250X2xldmVsKSB7Ci0JCWlmIChjb250X2xldmVsID4gbS0+Y29udF9sZXZlbCkgewotCQkgICAgLyoKLQkJICAgICAqIFdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGxldmVsICJjb250X2xldmVsIgotCQkgICAgICogY29udGludWF0aW9ucy4KLQkJICAgICAqLwotCQkgICAgY29udF9sZXZlbCA9IG0tPmNvbnRfbGV2ZWw7Ci0JCX0KLQkJaWYgKG1nZXQociwgJnAsIHMsIG0sIG5ieXRlcykgJiYKLQkJICAgIG1jaGVjayhyLCAmcCwgbSkpIHsKLQkJICAgIC8qCi0JCSAgICAgKiBUaGlzIGNvbnRpbnVhdGlvbiBtYXRjaGVkLiBQcmludCBpdHMgbWVzc2FnZSwgd2l0aCBhCi0JCSAgICAgKiBibGFuayBiZWZvcmUgaXQgaWYgdGhlIHByZXZpb3VzIGl0ZW0gcHJpbnRlZCBhbmQgdGhpcwotCQkgICAgICogaXRlbSBpc24ndCBlbXB0eS4KLQkJICAgICAqLwotCQkgICAgLyogc3BhY2UgaWYgcHJldmlvdXMgcHJpbnRlZCAqLwotCQkgICAgaWYgKG5lZWRfc2VwYXJhdG9yCi0JCQkmJiAobS0+bm9zcGZsYWcgPT0gMCkKLQkJCSYmIChtLT5kZXNjWzBdICE9ICdcMCcpCi0JCQkpIHsKLQkJCSh2b2lkKSBtYWdpY19yc2xfcHV0Y2hhcihyLCAnICcpOwotCQkJbmVlZF9zZXBhcmF0b3IgPSAwOwotCQkgICAgfQotCQkgICAgbXByaW50KHIsICZwLCBtKTsKLQkJICAgIGlmIChtLT5kZXNjWzBdKQotCQkJbmVlZF9zZXBhcmF0b3IgPSAxOwotCi0JCSAgICAvKgotCQkgICAgICogSWYgd2Ugc2VlIGFueSBjb250aW51YXRpb25zIGF0IGEgaGlnaGVyIGxldmVsLCBwcm9jZXNzCi0JCSAgICAgKiB0aGVtLgotCQkgICAgICovCi0JCSAgICBjb250X2xldmVsKys7Ci0JCX0KLQkgICAgfQotCi0JICAgIC8qIG1vdmUgdG8gbmV4dCBjb250aW51YXRpb24gcmVjb3JkICovCi0JICAgIG0gPSBtLT5uZXh0OwotCX0KLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIDAsIHIsCi0JCSAgICBNT0ROQU1FICI6IG1hdGNoZWQgYWZ0ZXIgJWQgcnVsZXMiLCBydWxlX2NvdW50ZXIpOwotI2VuZGlmCi0JcmV0dXJuIDE7CQkvKiBhbGwgdGhyb3VnaCAqLwotICAgIH0KLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0gICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIDAsIHIsCi0JCU1PRE5BTUUgIjogZmFpbGVkIGFmdGVyICVkIHJ1bGVzIiwgcnVsZV9jb3VudGVyKTsKLSNlbmRpZgotICAgIHJldHVybiAwOwkJCS8qIG5vIG1hdGNoIGF0IGFsbCAqLwotfQotCi1zdGF0aWMgdm9pZCBtcHJpbnQocmVxdWVzdF9yZWMgKnIsIHVuaW9uIFZBTFVFVFlQRSAqcCwgc3RydWN0IG1hZ2ljICptKQotewotICAgIGNoYXIgKnBwLCAqcnQ7Ci0gICAgdW5zaWduZWQgbG9uZyB2OwotCi0gICAgc3dpdGNoIChtLT50eXBlKSB7Ci0gICAgY2FzZSBCWVRFOgotCXYgPSBwLT5iOwotCWJyZWFrOwotCi0gICAgY2FzZSBTSE9SVDoKLSAgICBjYXNlIEJFU0hPUlQ6Ci0gICAgY2FzZSBMRVNIT1JUOgotCXYgPSBwLT5oOwotCWJyZWFrOwotCi0gICAgY2FzZSBMT05HOgotICAgIGNhc2UgQkVMT05HOgotICAgIGNhc2UgTEVMT05HOgotCXYgPSBwLT5sOwotCWJyZWFrOwotCi0gICAgY2FzZSBTVFJJTkc6Ci0JaWYgKG0tPnJlbG4gPT0gJz0nKSB7Ci0JICAgICh2b2lkKSBtYWdpY19yc2xfcHJpbnRmKHIsIG0tPmRlc2MsIG0tPnZhbHVlLnMpOwotCX0KLQllbHNlIHsKLQkgICAgKHZvaWQpIG1hZ2ljX3JzbF9wcmludGYociwgbS0+ZGVzYywgcC0+cyk7Ci0JfQotCXJldHVybjsKLQotICAgIGNhc2UgREFURToKLSAgICBjYXNlIEJFREFURToKLSAgICBjYXNlIExFREFURToKLQkvKiBYWFg6IG5vdCBtdWx0aXRocmVhZCBzYWZlICovCi0JcHAgPSBjdGltZSgodGltZV90ICopICYgcC0+bCk7Ci0JaWYgKChydCA9IHN0cmNocihwcCwgJ1xuJykpICE9IE5VTEwpCi0JICAgICpydCA9ICdcMCc7Ci0JKHZvaWQpIG1hZ2ljX3JzbF9wcmludGYociwgbS0+ZGVzYywgcHApOwotCXJldHVybjsKLSAgICBkZWZhdWx0OgotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0VSUiwgMCwgciwKLQkJICAgIE1PRE5BTUUgIjogaW52YWxpZCBtLT50eXBlICglZCkgaW4gbXByaW50KCkuIiwKLQkJICAgIG0tPnR5cGUpOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICB2ID0gc2lnbmV4dGVuZChyLT5zZXJ2ZXIsIG0sIHYpICYgbS0+bWFzazsKLSAgICAodm9pZCkgbWFnaWNfcnNsX3ByaW50ZihyLCBtLT5kZXNjLCAodW5zaWduZWQgbG9uZykgdik7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IHRoZSBieXRlIG9yZGVyIG9mIHRoZSBkYXRhIHdlIGFyZSBsb29raW5nIGF0Ci0gKi8KLXN0YXRpYyBpbnQgbWNvbnZlcnQocmVxdWVzdF9yZWMgKnIsIHVuaW9uIFZBTFVFVFlQRSAqcCwgc3RydWN0IG1hZ2ljICptKQotewotICAgIGNoYXIgKnJ0OwotCi0gICAgc3dpdGNoIChtLT50eXBlKSB7Ci0gICAgY2FzZSBCWVRFOgotICAgIGNhc2UgU0hPUlQ6Ci0gICAgY2FzZSBMT05HOgotICAgIGNhc2UgREFURToKLQlyZXR1cm4gMTsKLSAgICBjYXNlIFNUUklORzoKLQkvKiBOdWxsIHRlcm1pbmF0ZSBhbmQgZWF0IHRoZSByZXR1cm4gKi8KLQlwLT5zW3NpemVvZihwLT5zKSAtIDFdID0gJ1wwJzsKLQlpZiAoKHJ0ID0gc3RyY2hyKHAtPnMsICdcbicpKSAhPSBOVUxMKQotCSAgICAqcnQgPSAnXDAnOwotCXJldHVybiAxOwotICAgIGNhc2UgQkVTSE9SVDoKLQlwLT5oID0gKHNob3J0KSAoKHAtPmhzWzBdIDw8IDgpIHwgKHAtPmhzWzFdKSk7Ci0JcmV0dXJuIDE7Ci0gICAgY2FzZSBCRUxPTkc6Ci0gICAgY2FzZSBCRURBVEU6Ci0JcC0+bCA9IChsb25nKQotCSAgICAoKHAtPmhsWzBdIDw8IDI0KSB8IChwLT5obFsxXSA8PCAxNikgfCAocC0+aGxbMl0gPDwgOCkgfCAocC0+aGxbM10pKTsKLQlyZXR1cm4gMTsKLSAgICBjYXNlIExFU0hPUlQ6Ci0JcC0+aCA9IChzaG9ydCkgKChwLT5oc1sxXSA8PCA4KSB8IChwLT5oc1swXSkpOwotCXJldHVybiAxOwotICAgIGNhc2UgTEVMT05HOgotICAgIGNhc2UgTEVEQVRFOgotCXAtPmwgPSAobG9uZykKLQkgICAgKChwLT5obFszXSA8PCAyNCkgfCAocC0+aGxbMl0gPDwgMTYpIHwgKHAtPmhsWzFdIDw8IDgpIHwgKHAtPmhsWzBdKSk7Ci0JcmV0dXJuIDE7Ci0gICAgZGVmYXVsdDoKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19FUlIsIDAsIHIsCi0JCSAgICBNT0ROQU1FICI6IGludmFsaWQgdHlwZSAlZCBpbiBtY29udmVydCgpLiIsIG0tPnR5cGUpOwotCXJldHVybiAwOwotICAgIH0KLX0KLQotCi1zdGF0aWMgaW50IG1nZXQocmVxdWVzdF9yZWMgKnIsIHVuaW9uIFZBTFVFVFlQRSAqcCwgdW5zaWduZWQgY2hhciAqcywKLQkJc3RydWN0IG1hZ2ljICptLCBpbnQgbmJ5dGVzKQotewotICAgIGxvbmcgb2Zmc2V0ID0gbS0+b2Zmc2V0OwotCi0gICAgaWYgKG9mZnNldCArIHNpemVvZih1bmlvbiBWQUxVRVRZUEUpID4gbmJ5dGVzKQotCSAgICAgICAgICByZXR1cm4gMDsKLQotICAgIG1lbWNweShwLCBzICsgb2Zmc2V0LCBzaXplb2YodW5pb24gVkFMVUVUWVBFKSk7Ci0KLSAgICBpZiAoIW1jb252ZXJ0KHIsIHAsIG0pKQotCXJldHVybiAwOwotCi0gICAgaWYgKG0tPmZsYWcgJiBJTkRJUikgewotCi0Jc3dpdGNoIChtLT5pbi50eXBlKSB7Ci0JY2FzZSBCWVRFOgotCSAgICBvZmZzZXQgPSBwLT5iICsgbS0+aW4ub2Zmc2V0OwotCSAgICBicmVhazsKLQljYXNlIFNIT1JUOgotCSAgICBvZmZzZXQgPSBwLT5oICsgbS0+aW4ub2Zmc2V0OwotCSAgICBicmVhazsKLQljYXNlIExPTkc6Ci0JICAgIG9mZnNldCA9IHAtPmwgKyBtLT5pbi5vZmZzZXQ7Ci0JICAgIGJyZWFrOwotCX0KLQotCWlmIChvZmZzZXQgKyBzaXplb2YodW5pb24gVkFMVUVUWVBFKSA+IG5ieXRlcykKLQkgICAgICAgICAgICAgIHJldHVybiAwOwotCi0JbWVtY3B5KHAsIHMgKyBvZmZzZXQsIHNpemVvZih1bmlvbiBWQUxVRVRZUEUpKTsKLQotCWlmICghbWNvbnZlcnQociwgcCwgbSkpCi0JICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBtY2hlY2socmVxdWVzdF9yZWMgKnIsIHVuaW9uIFZBTFVFVFlQRSAqcCwgc3RydWN0IG1hZ2ljICptKQotewotICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbCA9IG0tPnZhbHVlLmw7Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyB2OwotICAgIGludCBtYXRjaGVkOwotCi0gICAgaWYgKChtLT52YWx1ZS5zWzBdID09ICd4JykgJiYgKG0tPnZhbHVlLnNbMV0gPT0gJ1wwJykpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19FUlIsIDAsIHIsCi0JCSAgICBNT0ROQU1FICI6IEJPSU5LIik7Ci0JcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgc3dpdGNoIChtLT50eXBlKSB7Ci0gICAgY2FzZSBCWVRFOgotCXYgPSBwLT5iOwotCWJyZWFrOwotCi0gICAgY2FzZSBTSE9SVDoKLSAgICBjYXNlIEJFU0hPUlQ6Ci0gICAgY2FzZSBMRVNIT1JUOgotCXYgPSBwLT5oOwotCWJyZWFrOwotCi0gICAgY2FzZSBMT05HOgotICAgIGNhc2UgQkVMT05HOgotICAgIGNhc2UgTEVMT05HOgotICAgIGNhc2UgREFURToKLSAgICBjYXNlIEJFREFURToKLSAgICBjYXNlIExFREFURToKLQl2ID0gcC0+bDsKLQlicmVhazsKLQotICAgIGNhc2UgU1RSSU5HOgotCWwgPSAwOwotCS8qCi0JICogV2hhdCB3ZSB3YW50IGhlcmUgaXM6IHYgPSBzdHJuY21wKG0tPnZhbHVlLnMsIHAtPnMsIG0tPnZhbGxlbik7Ci0JICogYnV0IGlnbm9yaW5nIGFueSBudWxscy4gIGJjbXAgZG9lc24ndCBnaXZlIC0vKy8wIGFuZCBpc24ndAotCSAqIHVuaXZlcnNhbGx5IGF2YWlsYWJsZSBhbnl3YXkuCi0JICovCi0JdiA9IDA7Ci0JewotCSAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICphID0gKHVuc2lnbmVkIGNoYXIgKikgbS0+dmFsdWUuczsKLQkgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqYiA9ICh1bnNpZ25lZCBjaGFyICopIHAtPnM7Ci0JICAgIHJlZ2lzdGVyIGludCBsZW4gPSBtLT52YWxsZW47Ci0KLQkgICAgd2hpbGUgKC0tbGVuID49IDApCi0JCWlmICgodiA9ICpiKysgLSAqYSsrKSAhPSAwKQotCQkgICAgYnJlYWs7Ci0JfQotCWJyZWFrOwotICAgIGRlZmF1bHQ6Ci0JLyogIGJvZ29zaXR5LCBwcmV0ZW5kIHRoYXQgaXQganVzdCB3YXNuJ3QgYSBtYXRjaCAqLwotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0VSUiwgMCwgciwKLQkJICAgIE1PRE5BTUUgIjogaW52YWxpZCB0eXBlICVkIGluIG1jaGVjaygpLiIsIG0tPnR5cGUpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIHYgPSBzaWduZXh0ZW5kKHItPnNlcnZlciwgbSwgdikgJiBtLT5tYXNrOwotCi0gICAgc3dpdGNoIChtLT5yZWxuKSB7Ci0gICAgY2FzZSAneCc6Ci0jaWYgTUlNRV9NQUdJQ19ERUJVRwotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0RFQlVHLCAwLCByLAotCQkgICAgIiVsdSA9PSAqYW55KiA9IDEiLCB2KTsKLSNlbmRpZgotCW1hdGNoZWQgPSAxOwotCWJyZWFrOwotCi0gICAgY2FzZSAnISc6Ci0JbWF0Y2hlZCA9IHYgIT0gbDsKLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIDAsIHIsCi0JCSAgICAiJWx1ICE9ICVsdSA9ICVkIiwgdiwgbCwgbWF0Y2hlZCk7Ci0jZW5kaWYKLQlicmVhazsKLQotICAgIGNhc2UgJz0nOgotCW1hdGNoZWQgPSB2ID09IGw7Ci0jaWYgTUlNRV9NQUdJQ19ERUJVRwotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0RFQlVHLCAwLCByLAotCQkgICAgIiVsdSA9PSAlbHUgPSAlZCIsIHYsIGwsIG1hdGNoZWQpOwotI2VuZGlmCi0JYnJlYWs7Ci0KLSAgICBjYXNlICc+JzoKLQlpZiAobS0+ZmxhZyAmIFVOU0lHTkVEKSB7Ci0JICAgIG1hdGNoZWQgPSB2ID4gbDsKLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0RFQlVHLCAwLCByLAotCQkJIiVsdSA+ICVsdSA9ICVkIiwgdiwgbCwgbWF0Y2hlZCk7Ci0jZW5kaWYKLQl9Ci0JZWxzZSB7Ci0JICAgIG1hdGNoZWQgPSAobG9uZykgdiA+IChsb25nKSBsOwotI2lmIE1JTUVfTUFHSUNfREVCVUcKLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIDAsIHIsCi0JCQkiJWxkID4gJWxkID0gJWQiLCB2LCBsLCBtYXRjaGVkKTsKLSNlbmRpZgotCX0KLQlicmVhazsKLQotICAgIGNhc2UgJzwnOgotCWlmIChtLT5mbGFnICYgVU5TSUdORUQpIHsKLQkgICAgbWF0Y2hlZCA9IHYgPCBsOwotI2lmIE1JTUVfTUFHSUNfREVCVUcKLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIDAsIHIsCi0JCQkiJWx1IDwgJWx1ID0gJWQiLCB2LCBsLCBtYXRjaGVkKTsKLSNlbmRpZgotCX0KLQllbHNlIHsKLQkgICAgbWF0Y2hlZCA9IChsb25nKSB2IDwgKGxvbmcpIGw7Ci0jaWYgTUlNRV9NQUdJQ19ERUJVRwotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19ERUJVRywgMCwgciwKLQkJCSIlbGQgPCAlbGQgPSAlZCIsIHYsIGwsIG1hdGNoZWQpOwotI2VuZGlmCi0JfQotCWJyZWFrOwotCi0gICAgY2FzZSAnJic6Ci0JbWF0Y2hlZCA9ICh2ICYgbCkgPT0gbDsKLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIDAsIHIsCi0JCSAgICAiKCglbHggJiAlbHgpID09ICVseCkgPSAlZCIsIHYsIGwsIGwsIG1hdGNoZWQpOwotI2VuZGlmCi0JYnJlYWs7Ci0KLSAgICBjYXNlICdeJzoKLQltYXRjaGVkID0gKHYgJiBsKSAhPSBsOwotI2lmIE1JTUVfTUFHSUNfREVCVUcKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19ERUJVRywgMCwgciwKLQkJICAgICIoKCVseCAmICVseCkgIT0gJWx4KSA9ICVkIiwgdiwgbCwgbCwgbWF0Y2hlZCk7Ci0jZW5kaWYKLQlicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0JLyogYm9nb3NpdHksIHByZXRlbmQgaXQgZGlkbid0IG1hdGNoICovCi0JbWF0Y2hlZCA9IDA7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfRVJSLCAwLCByLAotCQkgICAgTU9ETkFNRSAiOiBtY2hlY2s6IGNhbid0IGhhcHBlbjogaW52YWxpZCByZWxhdGlvbiAlZC4iLAotCQkgICAgbS0+cmVsbik7Ci0JYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1hdGNoZWQ7Ci19Ci0KLS8qIGFuIG9wdGltaXphdGlvbiBvdmVyIHBsYWluIHN0cmNtcCgpICovCi0jZGVmaW5lICAgIFNUUkVRKGEsIGIpICAgICgqKGEpID09ICooYikgJiYgc3RyY21wKChhKSwgKGIpKSA9PSAwKQotCi1zdGF0aWMgaW50IGFzY21hZ2ljKHJlcXVlc3RfcmVjICpyLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBuYnl0ZXMpCi17Ci0gICAgaW50IGhhc19lc2NhcGVzID0gMDsKLSAgICB1bnNpZ25lZCBjaGFyICpzOwotICAgIGNoYXIgbmJ1ZltIT1dNQU5ZICsgMV07CS8qIG9uZSBleHRyYSBmb3IgdGVybWluYXRpbmcgJ1wwJyAqLwotICAgIGNoYXIgKnRva2VuOwotICAgIHJlZ2lzdGVyIHN0cnVjdCBuYW1lcyAqcDsKLSAgICBpbnQgc21hbGxfbmJ5dGVzOwotCi0gICAgLyogdGhlc2UgYXJlIGVhc3ksIGRvIHRoZW0gZmlyc3QgKi8KLQotICAgIC8qCi0gICAgICogZm9yIHRyb2ZmLCBsb29rIGZvciAuICsgbGV0dGVyICsgbGV0dGVyIG9yIC5cIjsgdGhpcyBtdXN0IGJlIGRvbmUgdG8KLSAgICAgKiBkaXNhbWJpZ3VhdGUgdGFyIGFyY2hpdmVzJyAuL2ZpbGUgYW5kIG90aGVyIHRyYXNoIGZyb20gcmVhbCB0cm9mZgotICAgICAqIGlucHV0LgotICAgICAqLwotICAgIGlmICgqYnVmID09ICcuJykgewotCXVuc2lnbmVkIGNoYXIgKnRwID0gYnVmICsgMTsKLQotCXdoaWxlIChhcF9pc3NwYWNlKCp0cCkpCi0JICAgICsrdHA7CQkvKiBza2lwIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotCWlmICgoYXBfaXNhbG51bSgqdHApIHx8ICp0cCA9PSAnXFwnKSAmJgotCSAgICAgKGFwX2lzYWxudW0oKih0cCArIDEpKSB8fCAqdHAgPT0gJyInKSkgewotCSAgICBtYWdpY19yc2xfcHV0cyhyLCAiYXBwbGljYXRpb24veC10cm9mZiIpOwotCSAgICByZXR1cm4gMTsKLQl9Ci0gICAgfQotICAgIGlmICgoKmJ1ZiA9PSAnYycgfHwgKmJ1ZiA9PSAnQycpICYmIGFwX2lzc3BhY2UoKihidWYgKyAxKSkpIHsKLQkvKiBGb3J0cmFuICovCi0JbWFnaWNfcnNsX3B1dHMociwgInRleHQvcGxhaW4iKTsKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiBsb29rIGZvciB0b2tlbnMgZnJvbSBuYW1lcy5oIC0gdGhpcyBpcyBleHBlbnNpdmUhLCBzbyB3ZSdsbCBsaW1pdAotICAgICAqIG91cnNlbHZlcyB0byBvbmx5IFNNQUxMX0hPV01BTlkgYnl0ZXMgKi8KLSAgICBzbWFsbF9uYnl0ZXMgPSAobmJ5dGVzID4gU01BTExfSE9XTUFOWSkgPyBTTUFMTF9IT1dNQU5ZIDogbmJ5dGVzOwotICAgIC8qIG1ha2UgYSBjb3B5IG9mIHRoZSBidWZmZXIgaGVyZSBiZWNhdXNlIHN0cnRvaygpIHdpbGwgZGVzdHJveSBpdCAqLwotICAgIHMgPSAodW5zaWduZWQgY2hhciAqKSBtZW1jcHkobmJ1ZiwgYnVmLCBzbWFsbF9uYnl0ZXMpOwotICAgIHNbc21hbGxfbmJ5dGVzXSA9ICdcMCc7Ci0gICAgaGFzX2VzY2FwZXMgPSAobWVtY2hyKHMsICdcMDMzJywgc21hbGxfbmJ5dGVzKSAhPSBOVUxMKTsKLSAgICAvKiBYWFg6IG5vdCBtdWx0aXRocmVhZCBzYWZlICovCi0gICAgd2hpbGUgKCh0b2tlbiA9IHN0cnRvaygoY2hhciAqKSBzLCAiIFx0XG5cclxmIikpICE9IE5VTEwpIHsKLQlzID0gTlVMTDsJCS8qIG1ha2Ugc3RydG9rKCkga2VlcCBvbiB0b2tpbicgKi8KLQlmb3IgKHAgPSBuYW1lczsgcCA8IG5hbWVzICsgTk5BTUVTOyBwKyspIHsKLQkgICAgaWYgKFNUUkVRKHAtPm5hbWUsIHRva2VuKSkgewotCQltYWdpY19yc2xfcHV0cyhyLCB0eXBlc1twLT50eXBlXSk7Ci0JCWlmIChoYXNfZXNjYXBlcykKLQkJICAgIG1hZ2ljX3JzbF9wdXRzKHIsICIgKHdpdGggZXNjYXBlIHNlcXVlbmNlcykiKTsKLQkJcmV0dXJuIDE7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgc3dpdGNoIChpc190YXIoYnVmLCBuYnl0ZXMpKSB7Ci0gICAgY2FzZSAxOgotCS8qIFY3IHRhciBhcmNoaXZlICovCi0JbWFnaWNfcnNsX3B1dHMociwgImFwcGxpY2F0aW9uL3gtdGFyIik7Ci0JcmV0dXJuIDE7Ci0gICAgY2FzZSAyOgotCS8qIFBPU0lYIHRhciBhcmNoaXZlICovCi0JbWFnaWNfcnNsX3B1dHMociwgImFwcGxpY2F0aW9uL3gtdGFyIik7Ci0JcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLyogYWxsIGVsc2UgZmFpbHMsIGJ1dCBpdCBpcyBhc2NpaS4uLiAqLwotICAgIGlmIChoYXNfZXNjYXBlcykgewotCS8qIHRleHQgd2l0aCBlc2NhcGUgc2VxdWVuY2VzICovCi0JLyogd2UgbGVhdmUgdGhpcyBvcGVuIGZvciBmdXJ0aGVyIGRpZmZlcmVudGlhdGlvbiBsYXRlciAqLwotCW1hZ2ljX3JzbF9wdXRzKHIsICJ0ZXh0L3BsYWluIik7Ci0gICAgfQotICAgIGVsc2UgewotCS8qIHBsYWluIHRleHQgKi8KLQltYWdpY19yc2xfcHV0cyhyLCAidGV4dC9wbGFpbiIpOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotCi0vKgotICogY29tcHJlc3Mgcm91dGluZXM6IHptYWdpYygpIC0gcmV0dXJucyAwIGlmIG5vdCByZWNvZ25pemVkLCB1bmNvbXByZXNzZXMKLSAqIGFuZCBwcmludHMgaW5mb3JtYXRpb24gaWYgcmVjb2duaXplZCB1bmNvbXByZXNzKHMsIG1ldGhvZCwgb2xkLCBuLCBuZXdjaCkKLSAqIC0gdW5jb21wcmVzcyBvbGQgaW50byBuZXcsIHVzaW5nIG1ldGhvZCwgcmV0dXJuIHNpemVvZiBuZXcKLSAqLwotCi1zdGF0aWMgc3RydWN0IHsKLSAgICBjaGFyICptYWdpYzsKLSAgICBpbnQgbWFnbGVuOwotICAgIGNoYXIgKmFyZ3ZbM107Ci0gICAgaW50IHNpbGVudDsKLSAgICBjaGFyICplbmNvZGluZzsJLyogTVVTVCBiZSBsb3dlcmNhc2UgKi8KLX0gY29tcHJbXSA9IHsKLQotICAgIC8qIHdlIHVzZSBnemlwIGhlcmUgcmF0aGVyIHRoYW4gdW5jb21wcmVzcyBiZWNhdXNlIHdlIGhhdmUgdG8gcGFzcwotICAgICAqIGl0IGEgZnVsbCBmaWxlbmFtZSAtLSBhbmQgdW5jb21wcmVzcyBvbmx5IGNvbnNpZGVycyBmaWxlbmFtZXMKLSAgICAgKiBlbmRpbmcgd2l0aCAuWgotICAgICAqLwotICAgIHsKLQkiXDAzN1wyMzUiLCAyLCB7Ci0JICAgICJnemlwIiwgIi1kY3EiLCBOVUxMCi0JfSwgMCwgIngtY29tcHJlc3MiCi0gICAgfSwKLSAgICB7Ci0JIlwwMzdcMjEzIiwgMiwgewotCSAgICAiZ3ppcCIsICItZGNxIiwgTlVMTAotCX0sIDEsICJ4LWd6aXAiCi0gICAgfSwKLSAgICAvKgotICAgICAqIFhYWCBwY2F0IGRvZXMgbm90IHdvcmssIGNhdXNlIEkgZG9uJ3Qga25vdyBob3cgdG8gbWFrZSBpdCByZWFkIHN0ZGluLAotICAgICAqIHNvIHdlIHVzZSBnemlwCi0gICAgICovCi0gICAgewotCSJcMDM3XDAzNiIsIDIsIHsKLQkgICAgImd6aXAiLCAiLWRjcSIsIE5VTEwKLQl9LCAwLCAieC1nemlwIgotICAgIH0sCi19OwotCi1zdGF0aWMgaW50IG5jb21wciA9IHNpemVvZihjb21wcikgLyBzaXplb2YoY29tcHJbMF0pOwotCi1zdGF0aWMgaW50IHptYWdpYyhyZXF1ZXN0X3JlYyAqciwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbmJ5dGVzKQotewotICAgIHVuc2lnbmVkIGNoYXIgKm5ld2J1ZjsKLSAgICBpbnQgbmV3c2l6ZTsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuY29tcHI7IGkrKykgewotCWlmIChuYnl0ZXMgPCBjb21wcltpXS5tYWdsZW4pCi0JICAgIGNvbnRpbnVlOwotCWlmIChtZW1jbXAoYnVmLCBjb21wcltpXS5tYWdpYywgY29tcHJbaV0ubWFnbGVuKSA9PSAwKQotCSAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoaSA9PSBuY29tcHIpCi0JcmV0dXJuIDA7Ci0KLSAgICBpZiAoKG5ld3NpemUgPSB1bmNvbXByZXNzKHIsIGksICZuZXdidWYsIG5ieXRlcykpID4gMCkgewotCXRyeWl0KHIsIG5ld2J1ZiwgbmV3c2l6ZSwgMCk7Ci0KLQkvKiBzZXQgZW5jb2RpbmcgdHlwZSBpbiB0aGUgcmVxdWVzdCByZWNvcmQgKi8KLQlyLT5jb250ZW50X2VuY29kaW5nID0gY29tcHJbaV0uZW5jb2Rpbmc7Ci0gICAgfQotICAgIHJldHVybiAxOwotfQotCi0KLXN0cnVjdCB1bmNvbXByZXNzX3Bhcm1zIHsKLSAgICByZXF1ZXN0X3JlYyAqcjsKLSAgICBpbnQgbWV0aG9kOwotfTsKLQotc3RhdGljIGludCB1bmNvbXByZXNzX2NoaWxkKHN0cnVjdCB1bmNvbXByZXNzX3Bhcm1zICpwYXJtLCBhcF9jb250ZXh0X3QgKmNudHh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVRkYgKipzY3JpcHRfaW4pCi17Ci0gICAgaW50IHJjID0gMTsKLSAgICBjaGFyICpuZXdfYXJndls0XTsKLSAgICBjaGFyICoqZW52OwotICAgIHJlcXVlc3RfcmVjICpyID0gcGFybS0+cjsKLSAgICBhcF9jb250ZXh0X3QgKmNoaWxkX2NvbnRleHQgPSBjbnR4dDsKLSAgICBhcF9wcm9jYXR0cl90ICpwcm9jYXR0cjsKLSAgICBhcF9wcm9jX3QgKnByb2NuZXcgPSBOVUxMOwotICAgIGFwX2ZpbGVfdCAqZmlsZSA9IE5VTEw7Ci0gICAgYXBfaW9sICppb2w7Ci0KLSAgICBhcF9ibG9ja19hbGFybXMoKTsKLQotICAgIGVudiA9IGFwX2NyZWF0ZV9lbnZpcm9ubWVudChjaGlsZF9jb250ZXh0LCByLT5zdWJwcm9jZXNzX2Vudik7Ci0KLSAgICBpZiAoKGFwX2NyZWF0ZXByb2NhdHRyX2luaXQoJnByb2NhdHRyLCBjaGlsZF9jb250ZXh0KSAhPSBBUFJfU1VDQ0VTUykgfHwKLSAgICAgICAgKGFwX3NldHByb2NhdHRyX2lvKHByb2NhdHRyLCBBUFJfRlVMTF9CTE9DSywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBUFJfRlVMTF9CTE9DSywgQVBSX05PX1BJUEUpICAgIT0gQVBSX1NVQ0NFU1MpIHx8Ci0gICAgICAgIChhcF9zZXRwcm9jYXR0cl9kaXIocHJvY2F0dHIsIHItPmZpbGVuYW1lKSAgICAgICAgIT0gQVBSX1NVQ0NFU1MpIHx8Ci0gICAgICAgIChhcF9zZXRwcm9jYXR0cl9jbWR0eXBlKHByb2NhdHRyLCBBUFJfUFJPR1JBTSkgICAgIT0gQVBSX1NVQ0NFU1MpKSB7Ci0gICAgICAgIC8qIFNvbWV0aGluZyBiYWQgaGFwcGVuZWQsIHRlbGwgdGhlIHdvcmxkLiAqLwotICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgQVBSX0VOT1BST0MsIHIsCi0gICAgICAgICAgICAgICAiY291bGRuJ3Qgc2V0dXAgY2hpbGQgcHJvY2VzczogJXMiLCByLT5maWxlbmFtZSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBuZXdfYXJndlswXSA9IGNvbXByW3Bhcm0tPm1ldGhvZF0uYXJndlswXTsKLSAgICAgICAgbmV3X2FyZ3ZbMV0gPSBjb21wcltwYXJtLT5tZXRob2RdLmFyZ3ZbMV07Ci0gICAgICAgIG5ld19hcmd2WzJdID0gci0+ZmlsZW5hbWU7Ci0gICAgICAgIG5ld19hcmd2WzNdID0gTlVMTDsKLQotICAgICAgICBpZiAoY29tcHJbcGFybS0+bWV0aG9kXS5zaWxlbnQpIHsKLSAgICAgICAgICAgIGNsb3NlKFNUREVSUl9GSUxFTk8pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmMgPSBhcF9jcmVhdGVfcHJvY2VzcygmcHJvY25ldywgY29tcHJbcGFybS0+bWV0aG9kXS5hcmd2WzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19hcmd2LCBlbnYsIHByb2NhdHRyLCBjaGlsZF9jb250ZXh0KTsKLQotICAgICAgICBpZiAocmMgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIC8qIEJhZCB0aGluZ3MgaGFwcGVuZWQuIEV2ZXJ5b25lIHNob3VsZCBoYXZlIGNsZWFuZWQgdXAuICovCi0gICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgQVBSX0VOT1BST0MsIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1PRE5BTUUgIjogY291bGQgbm90IGV4ZWN1dGUgYCVzJy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcltwYXJtLT5tZXRob2RdLmFyZ3ZbMF0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXBfbm90ZV9zdWJwcm9jZXNzKGNoaWxkX2NvbnRleHQsIHByb2NuZXcsIGtpbGxfYWZ0ZXJfdGltZW91dCk7Ci0gICAgICAgICAgICAvKiBGaWxsIGluIEJVRkYgc3RydWN0dXJlIGZvciBwYXJlbnRzIHBpcGUgdG8gY2hpbGQncyBzdGRvdXQgKi8KLSAgICAgICAgICAgIGFwX2dldF9jaGlsZG91dCgmZmlsZSwgcHJvY25ldyk7Ci0gICAgICAgICAgICBpb2wgPSBhcF9jcmVhdGVfZmlsZV9pb2woZmlsZSk7Ci0gICAgICAgICAgICBpZiAoIWlvbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gQVBSX0VCQURGOwotICAgICAgICAgICAgaWYgKHNjcmlwdF9pbikgewotICAgICAgICAgICAgICAgICpzY3JpcHRfaW4gPSBhcF9iY3JlYXRlKGNoaWxkX2NvbnRleHQsIEJfUkQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXBfYnB1c2hfaW9sKCpzY3JpcHRfaW4sIGlvbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYXBfdW5ibG9ja19hbGFybXMoKTsKLQotICAgIHJldHVybiAocmMpOwotfQotCi1zdGF0aWMgaW50IHVuY29tcHJlc3MocmVxdWVzdF9yZWMgKnIsIGludCBtZXRob2QsIAotCQkgICAgICB1bnNpZ25lZCBjaGFyICoqbmV3Y2gsIGludCBuKQotewotICAgIHN0cnVjdCB1bmNvbXByZXNzX3Bhcm1zIHBhcm07Ci0gICAgQlVGRiAqYm91dCA9IE5VTEw7Ci0gICAgYXBfY29udGV4dF90ICpzdWJfY29udGV4dDsKLSAgICBhcF9zdGF0dXNfdCBydjsKLQotICAgIHBhcm0uciA9IHI7Ci0gICAgcGFybS5tZXRob2QgPSBtZXRob2Q7Ci0KLSAgICAvKiBXZSBtYWtlIGEgc3ViX3Bvb2wgc28gdGhhdCB3ZSBjYW4gY29sbGVjdCBvdXIgY2hpbGQgZWFybHksIG90aGVyd2lzZQotICAgICAqIHRoZXJlIGFyZSBjYXNlcyAoaS5lLiBnZW5lcmF0aW5nIGRpcmVjdG9yeSBpbmRpY2llcyB3aXRoIG1vZF9hdXRvaW5kZXgpCi0gICAgICogd2hlcmUgd2Ugd291bGQgZW5kIHVwIHdpdGggTE9UUyBvZiB6b21iaWVzLgotICAgICAqLwotICAgIGlmIChhcF9jcmVhdGVfY29udGV4dCgmc3ViX2NvbnRleHQsIHItPnBvb2wpICE9IEFQUl9TVUNDRVNTKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBpZiAoKHJ2ID0gdW5jb21wcmVzc19jaGlsZCgmcGFybSwgc3ViX2NvbnRleHQsICZib3V0KSkgIT0gQVBSX1NVQ0NFU1MpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgcnYsIHIsCi0JCSAgICBNT0ROQU1FICI6IGNvdWxkbid0IHNwYXduIHVuY29tcHJlc3MgcHJvY2VzczogJXMiLCByLT51cmkpOwotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAqbmV3Y2ggPSAodW5zaWduZWQgY2hhciAqKSBhcF9wYWxsb2Moci0+cG9vbCwgbik7Ci0gICAgcnYgPSBhcF9icmVhZChib3V0LCAqbmV3Y2gsIG4sICZuKTsKLSAgICBpZiAobiA9PSAwKSB7Ci0JYXBfZGVzdHJveV9jb250ZXh0KHN1Yl9jb250ZXh0KTsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgcnYsIHIsCi0JICAgIE1PRE5BTUUgIjogcmVhZCBmYWlsZWQgJXMiLCByLT5maWxlbmFtZSk7Ci0JcmV0dXJuIC0xOwotICAgIH0KLSAgICBhcF9kZXN0cm95X2NvbnRleHQoc3ViX2NvbnRleHQpOwotICAgIHJldHVybiBuOwotfQotCi0vKgotICogaXNfdGFyKCkgLS0gZmlndXJlIG91dCB3aGV0aGVyIGZpbGUgaXMgYSB0YXIgYXJjaGl2ZS4KLSAqCi0gKiBTdG9sZW4gKGJ5IGF1dGhvciBvZiBmaWxlIHV0aWxpdHkpIGZyb20gdGhlIHB1YmxpYyBkb21haW4gdGFyIHByb2dyYW06IFB1YmxpYwotICogRG9tYWluIHZlcnNpb24gd3JpdHRlbiAyNiBBdWcgMTk4NSBKb2huIEdpbG1vcmUgKGlobnA0IWhvcHRvYWQhZ251KS4KLSAqCi0gKiBAKCMpbGlzdC5jIDEuMTggOS8yMy84NiBQdWJsaWMgRG9tYWluIC0gZ251ICRJZDogbW9kX21pbWVfbWFnaWMuYyx2IDEuNwotICogMTk5Ny8wNi8yNCAwMDo0MTowMiBpa2x1ZnQgRXhwIGlrbHVmdCAkCi0gKgotICogQ29tbWVudHMgY2hhbmdlZCBhbmQgc29tZSBjb2RlL2NvbW1lbnRzIHJlZm9ybWF0dGVkIGZvciBmaWxlIGNvbW1hbmQgYnkgSWFuCi0gKiBEYXJ3aW4uCi0gKi8KLQotI2RlZmluZSAgICBpc29kaWdpdChjKSAgICAoICgoYykgPj0gJzAnKSAmJiAoKGMpIDw9ICc3JykgKQotCi0vKgotICogUmV0dXJuIDAgaWYgdGhlIGNoZWNrc3VtIGlzIGJhZCAoaS5lLiwgcHJvYmFibHkgbm90IGEgdGFyIGFyY2hpdmUpLCAxIGZvcgotICogb2xkIFVOSVggdGFyIGZpbGUsIDIgZm9yIFVuaXggU3RkIChQT1NJWCkgdGFyIGZpbGUuCi0gKi8KLQotc3RhdGljIGludCBpc190YXIodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbmJ5dGVzKQotewotICAgIHJlZ2lzdGVyIHVuaW9uIHJlY29yZCAqaGVhZGVyID0gKHVuaW9uIHJlY29yZCAqKSBidWY7Ci0gICAgcmVnaXN0ZXIgaW50IGk7Ci0gICAgcmVnaXN0ZXIgbG9uZyBzdW0sIHJlY3N1bTsKLSAgICByZWdpc3RlciBjaGFyICpwOwotCi0gICAgaWYgKG5ieXRlcyA8IHNpemVvZih1bmlvbiByZWNvcmQpKQotCSAgICAgICByZXR1cm4gMDsKLQotICAgIHJlY3N1bSA9IGZyb21fb2N0KDgsIGhlYWRlci0+aGVhZGVyLmNoa3N1bSk7Ci0KLSAgICBzdW0gPSAwOwotICAgIHAgPSBoZWFkZXItPmNoYXJwdHI7Ci0gICAgZm9yIChpID0gc2l6ZW9mKHVuaW9uIHJlY29yZCk7IC0taSA+PSAwOykgewotCS8qCi0JICogV2UgY2FuJ3QgdXNlIHVuc2lnbmVkIGNoYXIgaGVyZSBiZWNhdXNlIG9mIG9sZCBjb21waWxlcnMsIGUuZy4gVjcuCi0JICovCi0Jc3VtICs9IDB4RkYgJiAqcCsrOwotICAgIH0KLQotICAgIC8qIEFkanVzdCBjaGVja3N1bSB0byBjb3VudCB0aGUgImNoa3N1bSIgZmllbGQgYXMgYmxhbmtzLiAqLwotICAgIGZvciAoaSA9IHNpemVvZihoZWFkZXItPmhlYWRlci5jaGtzdW0pOyAtLWkgPj0gMDspCi0Jc3VtIC09IDB4RkYgJiBoZWFkZXItPmhlYWRlci5jaGtzdW1baV07Ci0gICAgc3VtICs9ICcgJyAqIHNpemVvZiBoZWFkZXItPmhlYWRlci5jaGtzdW07Ci0KLSAgICBpZiAoc3VtICE9IHJlY3N1bSkKLQlyZXR1cm4gMDsJCS8qIE5vdCBhIHRhciBhcmNoaXZlICovCi0KLSAgICBpZiAoMCA9PSBzdHJjbXAoaGVhZGVyLT5oZWFkZXIubWFnaWMsIFRNQUdJQykpCi0JcmV0dXJuIDI7CQkvKiBVbml4IFN0YW5kYXJkIHRhciBhcmNoaXZlICovCi0KLSAgICByZXR1cm4gMTsJCQkvKiBPbGQgZmFzaGlvbmVkIHRhciBhcmNoaXZlICovCi19Ci0KLQotLyoKLSAqIFF1aWNrIGFuZCBkaXJ0eSBvY3RhbCBjb252ZXJzaW9uLgotICoKLSAqIFJlc3VsdCBpcyAtMSBpZiB0aGUgZmllbGQgaXMgaW52YWxpZCAoYWxsIGJsYW5rLCBvciBub25vY3RhbCkuCi0gKi8KLXN0YXRpYyBsb25nIGZyb21fb2N0KGludCBkaWdzLCBjaGFyICp3aGVyZSkKLXsKLSAgICByZWdpc3RlciBsb25nIHZhbHVlOwotCi0gICAgd2hpbGUgKGFwX2lzc3BhY2UoKndoZXJlKSkgewkvKiBTa2lwIHNwYWNlcyAqLwotCXdoZXJlKys7Ci0JaWYgKC0tZGlncyA8PSAwKQotCSAgICByZXR1cm4gLTE7CQkvKiBBbGwgYmxhbmsgZmllbGQgKi8KLSAgICB9Ci0gICAgdmFsdWUgPSAwOwotICAgIHdoaWxlIChkaWdzID4gMCAmJiBpc29kaWdpdCgqd2hlcmUpKSB7CS8qIFNjYW4gdGlsIG5vbm9jdGFsICovCi0JdmFsdWUgPSAodmFsdWUgPDwgMykgfCAoKndoZXJlKysgLSAnMCcpOwotCS0tZGlnczsKLSAgICB9Ci0KLSAgICBpZiAoZGlncyA+IDAgJiYgKndoZXJlICYmICFhcF9pc3NwYWNlKCp3aGVyZSkpCi0JcmV0dXJuIC0xOwkJLyogRW5kZWQgb24gbm9uLXNwYWNlL251bCAqLwotCi0gICAgcmV0dXJuIHZhbHVlOwotfQotCi0vKgotICogQ2hlY2sgZm9yIGZpbGUtcmV2aXNpb24gc3VmZml4Ci0gKgotICogVGhpcyBpcyBmb3IgYW4gb2JzY3VyZSBkb2N1bWVudCBjb250cm9sIHN5c3RlbSB1c2VkIG9uIGFuIGludHJhbmV0LgotICogVGhlIHdlYiByZXByZXNlbnRhdGlvbiBvZiBlYWNoIGZpbGUncyByZXZpc2lvbiBoYXMgYW4gQDEsIEAyLCBldGMKLSAqIGFwcGVuZGVkIHdpdGggdGhlIHJldmlzaW9uIG51bWJlci4gIFRoaXMgbmVlZHMgdG8gYmUgc3RyaXBwZWQgb2ZmIHRvCi0gKiBmaW5kIHRoZSBmaWxlIHN1ZmZpeCwgd2hpY2ggY2FuIGJlIHJlY29nbml6ZWQgYnkgc2VuZGluZyB0aGUgbmFtZSBiYWNrCi0gKiB0aHJvdWdoIGEgc3ViLXJlcXVlc3QuICBUaGUgYmFzZSBmaWxlIG5hbWUgKHdpdGhvdXQgdGhlIEBudW0gc3VmZml4KQotICogbXVzdCBleGlzdCBiZWNhdXNlIGl0cyB0eXBlIHdpbGwgYmUgdXNlZCBhcyB0aGUgcmVzdWx0LgotICovCi1zdGF0aWMgaW50IHJldmlzaW9uX3N1ZmZpeChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpbnQgc3VmZml4X3BvcywgcmVzdWx0OwotICAgIGNoYXIgKnN1Yl9maWxlbmFtZTsKLSAgICByZXF1ZXN0X3JlYyAqc3ViOwotCi0jaWYgTUlNRV9NQUdJQ19ERUJVRwotICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOTyB8IEFQTE9HX0RFQlVHLCAwLCByLAotCQlNT0ROQU1FICI6IHJldmlzaW9uX3N1ZmZpeCBjaGVja2luZyAlcyIsIHItPmZpbGVuYW1lKTsKLSNlbmRpZiAvKiBNSU1FX01BR0lDX0RFQlVHICovCi0KLSAgICAvKiBjaGVjayBmb3IgcmVjb2duaXplZCByZXZpc2lvbiBzdWZmaXggKi8KLSAgICBzdWZmaXhfcG9zID0gc3RybGVuKHItPmZpbGVuYW1lKSAtIDE7Ci0gICAgaWYgKCFhcF9pc2RpZ2l0KHItPmZpbGVuYW1lW3N1ZmZpeF9wb3NdKSkgewotCXJldHVybiAwOwotICAgIH0KLSAgICB3aGlsZSAoc3VmZml4X3BvcyA+PSAwICYmIGFwX2lzZGlnaXQoci0+ZmlsZW5hbWVbc3VmZml4X3Bvc10pKQotCXN1ZmZpeF9wb3MtLTsKLSAgICBpZiAoc3VmZml4X3BvcyA8IDAgfHwgci0+ZmlsZW5hbWVbc3VmZml4X3Bvc10gIT0gJ0AnKSB7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogcGVyZm9ybSBzdWItcmVxdWVzdCBmb3IgdGhlIGZpbGUgbmFtZSB3aXRob3V0IHRoZSBzdWZmaXggKi8KLSAgICByZXN1bHQgPSAwOwotICAgIHN1Yl9maWxlbmFtZSA9IGFwX3BzdHJuZHVwKHItPnBvb2wsIHItPmZpbGVuYW1lLCBzdWZmaXhfcG9zKTsKLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0gICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIDAsIHIsCi0JCU1PRE5BTUUgIjogc3VicmVxdWVzdCBsb29rdXAgZm9yICVzIiwgc3ViX2ZpbGVuYW1lKTsKLSNlbmRpZiAvKiBNSU1FX01BR0lDX0RFQlVHICovCi0gICAgc3ViID0gYXBfc3ViX3JlcV9sb29rdXBfZmlsZShzdWJfZmlsZW5hbWUsIHIpOwotCi0gICAgLyogZXh0cmFjdCBjb250ZW50IHR5cGUvZW5jb2RpbmcvbGFuZ3VhZ2UgZnJvbSBzdWItcmVxdWVzdCAqLwotICAgIGlmIChzdWItPmNvbnRlbnRfdHlwZSkgewotCXItPmNvbnRlbnRfdHlwZSA9IGFwX3BzdHJkdXAoci0+cG9vbCwgc3ViLT5jb250ZW50X3R5cGUpOwotI2lmIE1JTUVfTUFHSUNfREVCVUcKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19ERUJVRywgMCwgciwKLQkJICAgIE1PRE5BTUUgIjogc3VicmVxdWVzdCAlcyBnb3QgJXMiLAotCQkgICAgc3ViX2ZpbGVuYW1lLCByLT5jb250ZW50X3R5cGUpOwotI2VuZGlmIC8qIE1JTUVfTUFHSUNfREVCVUcgKi8KLQlpZiAoc3ViLT5jb250ZW50X2VuY29kaW5nKQotCSAgICByLT5jb250ZW50X2VuY29kaW5nID0KLQkJYXBfcHN0cmR1cChyLT5wb29sLCBzdWItPmNvbnRlbnRfZW5jb2RpbmcpOwotCWlmIChzdWItPmNvbnRlbnRfbGFuZ3VhZ2UpCi0JICAgIHItPmNvbnRlbnRfbGFuZ3VhZ2UgPQotCQlhcF9wc3RyZHVwKHItPnBvb2wsIHN1Yi0+Y29udGVudF9sYW5ndWFnZSk7Ci0JcmVzdWx0ID0gMTsKLSAgICB9Ci0KLSAgICAvKiBjbGVhbiB1cCAqLwotICAgIGFwX2Rlc3Ryb3lfc3ViX3JlcShzdWIpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLSAqIGluaXRpYWxpemUgdGhlIG1vZHVsZQotICovCi1zdGF0aWMgdm9pZCBtYWdpY19pbml0KGFwX2NvbnRleHRfdCAqcCwgYXBfY29udGV4dF90ICpwbG9nLCBhcF9jb250ZXh0X3QgKnB0ZW1wLCBzZXJ2ZXJfcmVjICptYWluX3NlcnZlcikKLXsKLSAgICBpbnQgcmVzdWx0OwotICAgIG1hZ2ljX3NlcnZlcl9jb25maWdfcmVjICpjb25mOwotICAgIG1hZ2ljX3NlcnZlcl9jb25maWdfcmVjICptYWluX2NvbmY7Ci0gICAgc2VydmVyX3JlYyAqczsKLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0gICAgc3RydWN0IG1hZ2ljICptLCAqcHJldm07Ci0jZW5kaWYgLyogTUlNRV9NQUdJQ19ERUJVRyAqLwotCi0gICAgbWFpbl9jb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcobWFpbl9zZXJ2ZXItPm1vZHVsZV9jb25maWcsICZtaW1lX21hZ2ljX21vZHVsZSk7Ci0gICAgZm9yIChzID0gbWFpbl9zZXJ2ZXI7IHM7IHMgPSBzLT5uZXh0KSB7Ci0JY29uZiA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsICZtaW1lX21hZ2ljX21vZHVsZSk7Ci0JaWYgKGNvbmYtPm1hZ2ljZmlsZSA9PSBOVUxMICYmIHMgIT0gbWFpbl9zZXJ2ZXIpIHsKLQkgICAgLyogaW5oZXJpdHMgZnJvbSB0aGUgcGFyZW50ICovCi0JICAgICpjb25mID0gKm1haW5fY29uZjsKLQl9Ci0JZWxzZSBpZiAoY29uZi0+bWFnaWNmaWxlKSB7Ci0JICAgIHJlc3VsdCA9IGFwcHJlbnRpY2UocywgcCk7Ci0JICAgIGlmIChyZXN1bHQgPT0gLTEpCi0JCXJldHVybjsKLSNpZiBNSU1FX01BR0lDX0RFQlVHCi0JICAgIHByZXZtID0gMDsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19ERUJVRywgMCwgcywKLQkJCU1PRE5BTUUgIjogbWFnaWNfaW5pdCAxIHRlc3QiKTsKLQkgICAgZm9yIChtID0gY29uZi0+bWFnaWM7IG07IG0gPSBtLT5uZXh0KSB7Ci0JCWlmIChhcF9pc3ByaW50KCgoKHVuc2lnbmVkIGxvbmcpIG0pID4+IDI0KSAmIDI1NSkgJiYKLQkJICAgIGFwX2lzcHJpbnQoKCgodW5zaWduZWQgbG9uZykgbSkgPj4gMTYpICYgMjU1KSAmJgotCQkgICAgYXBfaXNwcmludCgoKCh1bnNpZ25lZCBsb25nKSBtKSA+PiA4KSAmIDI1NSkgJiYKLQkJICAgIGFwX2lzcHJpbnQoKCh1bnNpZ25lZCBsb25nKSBtKSAmIDI1NSkpIHsKLQkJICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PIHwgQVBMT0dfREVCVUcsIDAsIHMsCi0JCQkJTU9ETkFNRSAiOiBtYWdpY19pbml0IDE6IFBPSU5URVIgQ0xPQkJFUkVEISAiCi0JCQkJIm09XCIlYyVjJWMlY1wiIGxpbmU9JWQiLAotCQkJCSgoKHVuc2lnbmVkIGxvbmcpIG0pID4+IDI0KSAmIDI1NSwKLQkJCQkoKCh1bnNpZ25lZCBsb25nKSBtKSA+PiAxNikgJiAyNTUsCi0JCQkJKCgodW5zaWduZWQgbG9uZykgbSkgPj4gOCkgJiAyNTUsCi0JCQkJKCh1bnNpZ25lZCBsb25nKSBtKSAmIDI1NSwKLQkJCQlwcmV2bSA/IHByZXZtLT5saW5lbm8gOiAtMSk7Ci0JCSAgICBicmVhazsKLQkJfQotCQlwcmV2bSA9IG07Ci0JICAgIH0KLSNlbmRpZgotCX0KLSAgICB9Ci19Ci0KLS8qCi0gKiBGaW5kIHRoZSBDb250ZW50LVR5cGUgZnJvbSBhbnkgcmVzb3VyY2UgdGhpcyBtb2R1bGUgaGFzIGF2YWlsYWJsZQotICovCi0KLXN0YXRpYyBpbnQgbWFnaWNfZmluZF9jdChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpbnQgcmVzdWx0OwotICAgIG1hZ2ljX3NlcnZlcl9jb25maWdfcmVjICpjb25mOwotCi0gICAgLyogdGhlIGZpbGUgaGFzIHRvIGV4aXN0ICovCi0gICAgaWYgKHItPmZpbmZvLnByb3RlY3Rpb24gPT0gMCB8fCAhci0+ZmlsZW5hbWUpIHsKLQlyZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgLyogd2FzIHNvbWVvbmUgZWxzZSBhbHJlYWR5IGhlcmU/ICovCi0gICAgaWYgKHItPmNvbnRlbnRfdHlwZSkgewotCXJldHVybiBERUNMSU5FRDsKLSAgICB9Ci0KLSAgICBjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcoci0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAmbWltZV9tYWdpY19tb2R1bGUpOwotICAgIGlmICghY29uZiB8fCAhY29uZi0+bWFnaWMpIHsKLQlyZXR1cm4gREVDTElORUQ7Ci0gICAgfQotCi0gICAgLyogaW5pdGlhbGl6ZSBwZXItcmVxdWVzdCBpbmZvICovCi0gICAgaWYgKCFtYWdpY19zZXRfY29uZmlnKHIpKSB7Ci0JcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgIH0KLQotICAgIC8qIHRyeSBleGNsdWRpbmcgZmlsZS1yZXZpc2lvbiBzdWZmaXhlcyAqLwotICAgIGlmIChyZXZpc2lvbl9zdWZmaXgocikgIT0gMSkgewotCS8qIHByb2Nlc3MgaXQgYmFzZWQgb24gdGhlIGZpbGUgY29udGVudHMgKi8KLQlpZiAoKHJlc3VsdCA9IG1hZ2ljX3Byb2Nlc3MocikpICE9IE9LKSB7Ci0JICAgIHJldHVybiByZXN1bHQ7Ci0JfQotICAgIH0KLQotICAgIC8qIGlmIHdlIGhhdmUgYW55IHJlc3VsdHMsIHB1dCB0aGVtIGluIHRoZSByZXF1ZXN0IHN0cnVjdHVyZSAqLwotICAgIHJldHVybiBtYWdpY19yc2xfdG9fcmVxdWVzdChyKTsKLX0KLQotc3RhdGljIHZvaWQgcmVnaXN0ZXJfaG9va3Modm9pZCkKLXsKLSAgICBhcF9ob29rX3R5cGVfY2hlY2tlcihtYWdpY19maW5kX2N0LCBOVUxMLCBOVUxMLCBIT09LX01JRERMRSk7Ci0gICAgYXBfaG9va19wb3N0X2NvbmZpZyhtYWdpY19pbml0LCBOVUxMLCBOVUxMLCBIT09LX0ZJUlNUKTsKLX0KLQotLyoKLSAqIEFwYWNoZSBBUEkgbW9kdWxlIGludGVyZmFjZQotICovCi0KLW1vZHVsZSBtaW1lX21hZ2ljX21vZHVsZSA9Ci17Ci0gICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogZGlyIGNvbmZpZyBjcmVhdG9yICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogZGlyIG1lcmdlciAtLS0gZGVmYXVsdCBpcyB0byBvdmVycmlkZSAqLwotICAgIGNyZWF0ZV9tYWdpY19zZXJ2ZXJfY29uZmlnLCAgICAgICAgLyogc2VydmVyIGNvbmZpZyAqLwotICAgIG1lcmdlX21hZ2ljX3NlcnZlcl9jb25maWcsIC8qIG1lcmdlIHNlcnZlciBjb25maWcgKi8KLSAgICBtaW1lX21hZ2ljX2NtZHMsICAgICAgICAgICAvKiBjb21tYW5kIGFwX3RhYmxlX3QgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiBoYW5kbGVycyAqLwotICAgIHJlZ2lzdGVyX2hvb2tzICAgICAgICAgICAgICAvKiByZWdpc3RlciBob29rcyAqLwotfTsKLQotCmRpZmYgLS1naXQgYS9tb2R1bGVzL21ldGFkYXRhL21vZF9taW1lX21hZ2ljLmV4cCBiL21vZHVsZXMvbWV0YWRhdGEvbW9kX21pbWVfbWFnaWMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjA2OGE0Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX21pbWVfbWFnaWMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotbWltZV9tYWdpY19tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX3NldGVudmlmLmMgYi9tb2R1bGVzL21ldGFkYXRhL21vZF9zZXRlbnZpZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWU1ZTZhLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX3NldGVudmlmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUJ1MgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIG1vZF9zZXRlbnZpZi5jCi0gKiBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJhc2VkIG9uIG1hdGNoaW5nIHJlcXVlc3QgaGVhZGVycyBvcgotICogYXR0cmlidXRlcyBhZ2FpbnN0IHJlZ2V4IHN0cmluZ3MKLSAqIAotICogUGF1bCBTdXR0b24gPHBhdWxAdWt3ZWIuY29tPiAyNyBPY3QgMTk5NgotICogQmFzZWQgb24gbW9kX2Jyb3dzZXIgYnkgQWxleGVpIEtvc3V0IDxha29zdXRAb3JnYW5pYy5jb20+Ci0gKi8KLQotLyoKLSAqIFVzZWQgdG8gc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBiYXNlZCBvbiB0aGUgaW5jb21pbmcgcmVxdWVzdCBoZWFkZXJzLAotICogb3Igc29tZSBzZWxlY3RlZCBvdGhlciBhdHRyaWJ1dGVzIG9mIHRoZSByZXF1ZXN0IChlLmcuLCB0aGUgcmVtb3RlIGhvc3QKLSAqIG5hbWUpLgotICoKLSAqIFVzYWdlOgotICoKLSAqICAgU2V0RW52SWYgbmFtZSByZWdleCB2YXIgLi4uCi0gKgotICogd2hlcmUgbmFtZSBpcyBlaXRoZXIgYSBIVFRQIHJlcXVlc3QgaGVhZGVyIG5hbWUsIG9yIG9uZSBvZiB0aGUKLSAqIHNwZWNpYWwgdmFsdWVzIChzZWUgYmVsb3cpLiBUaGUgJ3ZhbHVlJyBvZiB0aGUgaGVhZGVyIChvciB0aGUKLSAqIHZhbHVlIG9mIHRoZSBzcGVjaWFsIHZhbHVlIGZyb20gYmVsb3cpIGFyZSBjb21wYXJlZCBhZ2FpbnN0IHRoZQotICogcmVnZXggYXJndW1lbnQuIElmIHRoaXMgaXMgYSBzaW1wbGUgc3RyaW5nLCBhIHNpbXBsZSBzdWItc3RyaW5nCi0gKiBtYXRjaCBpcyBwZXJmb3JtZWQuIE90aGVyd2lzZSwgYSByZXF1ZXN0IGV4cHJlc3Npb24gbWF0Y2ggaXMKLSAqIGRvbmUuIElmIHRoZSB2YWx1ZSBtYXRjaGVzIHRoZSBzdHJpbmcgb3IgcmVndWxhciBleHByZXNzaW9uLCB0aGUKLSAqIGVudmlyb25tZW50IHZhcmlhYmxlcyBsaXN0ZWQgYXMgdmFyIC4uLiBhcmUgc2V0LiBFYWNoIHZhciBjYW4gCi0gKiBiZSBpbiBvbmUgb2YgdGhyZWUgZm9ybWF0czogdmFyLCB3aGljaCBzZXRzIHRoZSBuYW1lZCB2YXJpYWJsZQotICogKHRoZSB2YWx1ZSB2YWx1ZSAiMSIpOyB2YXI9dmFsdWUsIHdoaWNoIHNldHMgdGhlIHZhcmlhYmxlIHRvCi0gKiB0aGUgZ2l2ZW4gdmFsdWU7IG9yICF2YXIsIHdoaWNoIHVuc2V0cyB0aGUgdmFyaWFibGUgaXMgaXQgaGFzCi0gKiBiZWVuIHByZXZpb3VzbHkgc2V0LgotICoKLSAqIE5vcm1hbGx5IHRoZSBzdHJpbmdzIGFyZSBjb21wYXJlZCB3aXRoIHJlZ2FyZCB0byBjYXNlLiBUbyBpZ25vcmUKLSAqIGNhc2UsIHVzZSB0aGUgZGlyZWN0aXZlIFNldEVudklmTm9DYXNlIGluc3RlYWQuCi0gKgotICogU3BlY2lhbCB2YWx1ZXMgZm9yICduYW1lJyBhcmU6Ci0gKgotICogICByZW1vdGVfaG9zdCAgICAgICAgUmVtb3RlIGhvc3QgbmFtZSAoaWYgYXZhaWxhYmxlKQotICogICByZW1vdGVfYWRkciAgICAgICAgUmVtb3RlIElQIGFkZHJlc3MKLSAqICAgcmVtb3RlX3VzZXIgICAgICAgIFJlbW90ZSBhdXRoZW50aWNhdGVkIHVzZXIgKGlmIGFueSkKLSAqICAgcmVxdWVzdF9tZXRob2QgICAgIFJlcXVlc3QgbWV0aG9kIChHRVQsIFBPU1QsIGV0YykKLSAqICAgcmVxdWVzdF91cmkgICAgICAgIFJlcXVlc3RlZCBVUkkKLSAqCi0gKiBFeGFtcGxlczoKLSAqCi0gKiBUbyBzZXQgdGhlIGVudmlyb21lbnQgdmFyaWFibGUgTE9DQUxIT1NUIGlmIHRoZSBjbGllbnQgaXMgdGhlIGxvY2FsCi0gKiBtYWNoaW5lOgotICoKLSAqICAgIFNldEVudklmIHJlbW90ZV9hZGRyIDEyNy4wLjAuMSBMT0NBTEhPU1QKLSAqCi0gKiBUbyBzZXQgTE9DQUwgaWYgdGhlIGNsaWVudCBpcyB0aGUgbG9jYWwgaG9zdCwgb3Igd2l0aGluIG91ciBjb21wYW55J3MKLSAqIGRvbWFpbiAoMTkyLjE2OC4xMCk6Ci0gKgotICogICAgU2V0RW52SWYgcmVtb3RlX2FkZHIgMTkyLjE2OC4xMC4gTE9DQUwKLSAqICAgIFNldEVudklmIHJlbW90ZV9hZGRyIDEyNy4wLjAuMSAgIExPQ0FMSE9TVAotICoKLSAqIFRoaXMgY291bGQgYmUgd3JpdHRlbiBhczoKLSAqCi0gKiAgICBTZXRFbnZJZiByZW1vdGVfYWRkciAoMTI3LjAuMC4xfDE5Mi4xNjguMTAuKSBMT0NBTAotICovCi0KLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0KLWVudW0gc3BlY2lhbCB7Ci0gICAgU1BFQ0lBTF9OT1QsCi0gICAgU1BFQ0lBTF9SRU1PVEVfQUREUiwKLSAgICBTUEVDSUFMX1JFTU9URV9IT1NULAotICAgIFNQRUNJQUxfUkVNT1RFX1VTRVIsCi0gICAgU1BFQ0lBTF9SRVFVRVNUX1VSSSwKLSAgICBTUEVDSUFMX1JFUVVFU1RfTUVUSE9ELAotICAgIFNQRUNJQUxfUkVRVUVTVF9QUk9UT0NPTAotfTsKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjaGFyICpuYW1lOyAgICAgICAgICAgICAgICAgLyogaGVhZGVyIG5hbWUgKi8KLSAgICBjaGFyICpyZWdleDsgICAgICAgICAgICAgICAgLyogcmVnZXggdG8gbWF0Y2ggYWdhaW5zdCAqLwotICAgIHJlZ2V4X3QgKnByZWc7ICAgICAgICAgICAgICAvKiBjb21waWxlZCByZWdleCAqLwotICAgIGFwX3RhYmxlX3QgKmZlYXR1cmVzOyAgICAgICAgICAgIC8qIGVudiB2YXJzIHRvIHNldCAob3IgdW5zZXQpICovCi0gICAgRU5VTV9CSVRGSUVMRCggICAgICAgICAgICAgIC8qIGlzIGl0IGEgInNwZWNpYWwiIGhlYWRlciA/ICovCi0JZW51bSBzcGVjaWFsLAotCXNwZWNpYWxfdHlwZSw0KTsKLSAgICB1bnNpZ25lZCBpY2FzZSA6IDE7CQkvKiBpZ25vcmluZyBjYXNlPyAqLwotfSBzZWlfZW50cnk7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqY29uZGl0aW9uYWxzOwotfSBzZWlfY2ZnX3JlYzsKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIHNldGVudmlmX21vZHVsZTsKLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9zZXRlbnZpZl9jb25maWcoYXBfY29udGV4dF90ICpwLCBzZXJ2ZXJfcmVjICpkdW1teSkKLXsKLSAgICBzZWlfY2ZnX3JlYyAqbmV3ID0gKHNlaV9jZmdfcmVjICopIGFwX3BhbGxvYyhwLCBzaXplb2Yoc2VpX2NmZ19yZWMpKTsKLQotICAgIG5ldy0+Y29uZGl0aW9uYWxzID0gYXBfbWFrZV9hcnJheShwLCAyMCwgc2l6ZW9mKHNlaV9lbnRyeSkpOwotICAgIHJldHVybiAodm9pZCAqKSBuZXc7Ci19Ci0KLXN0YXRpYyB2b2lkICptZXJnZV9zZXRlbnZpZl9jb25maWcoYXBfY29udGV4dF90ICpwLCB2b2lkICpiYXNldiwgdm9pZCAqb3ZlcnJpZGVzdikKLXsKLSAgICBzZWlfY2ZnX3JlYyAqYSA9IGFwX3BjYWxsb2MocCwgc2l6ZW9mKHNlaV9jZmdfcmVjKSk7Ci0gICAgc2VpX2NmZ19yZWMgKmJhc2UgPSBiYXNldiwgKm92ZXJyaWRlcyA9IG92ZXJyaWRlc3Y7Ci0KLSAgICBhLT5jb25kaXRpb25hbHMgPSBhcF9hcHBlbmRfYXJyYXlzKHAsIGJhc2UtPmNvbmRpdGlvbmFscywKLQkJCQkgICAgICAgb3ZlcnJpZGVzLT5jb25kaXRpb25hbHMpOwotICAgIHJldHVybiBhOwotfQotCi0vKiBhbnkgbm9uLU5VTEwgbWFnaWMgY29uc3RhbnQgd2lsbCBkby4uLiB1c2VkIHRvIGluZGljYXRlIGlmIFJFR19JQ0FTRSBzaG91bGQKLSAqIGJlIHVzZWQKLSAqLwotI2RlZmluZSBJQ0FTRV9NQUdJQwkoKHZvaWQgKikoJnNldGVudmlmX21vZHVsZSkpCi0KLXN0YXRpYyBjb25zdCBjaGFyICphZGRfc2V0ZW52aWZfY29yZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqbWNvbmZpZywKLQkJCQkgICAgIGNoYXIgKmZuYW1lLCBjb25zdCBjaGFyICphcmdzKQotewotICAgIGNoYXIgKnJlZ2V4OwotICAgIGNvbnN0IGNoYXIgKmZlYXR1cmU7Ci0gICAgc2VpX2NmZ19yZWMgKnNjb25mID0gYXBfZ2V0X21vZHVsZV9jb25maWcoY21kLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsCi0JCQkJCSAgICAgICZzZXRlbnZpZl9tb2R1bGUpOwotICAgIHNlaV9lbnRyeSAqbmV3LCAqZW50cmllcyA9IChzZWlfZW50cnkgKikgc2NvbmYtPmNvbmRpdGlvbmFscy0+ZWx0czsKLSAgICBjaGFyICp2YXI7Ci0gICAgaW50IGk7Ci0gICAgaW50IGJlZW5oZXJlID0gMDsKLSAgICB1bnNpZ25lZCBpY2FzZTsKLQotICAgIC8qIGdldCByZWdleCAqLwotICAgIHJlZ2V4ID0gYXBfZ2V0d29yZF9jb25mKGNtZC0+cG9vbCwgJmFyZ3MpOwotICAgIGlmICghKnJlZ2V4KSB7Ci0gICAgICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIk1pc3NpbmcgcmVndWxhciBleHByZXNzaW9uIGZvciAiLAotCQkJICBjbWQtPmNtZC0+bmFtZSwgTlVMTCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhIHNlaV9lbnRyeSB3aXRoIHRoZSBzYW1lIG5hbWUgd2Ugd2FudCB0bwotICAgICAqIGp1c3QgY29weSB0aGUgbmFtZSBwb2ludGVyLi4uIHNvIHRoYXQgbGF0ZXIgb24gd2UgY2FuIGNvbXBhcmUKLSAgICAgKiB0d28gaGVhZGVyIG5hbWVzIGp1c3QgYnkgY29tcGFyaW5nIHRoZSBwb2ludGVycy4KLSAgICAgKi8KLQotICAgIGZvciAoaSA9IDA7IGkgPCBzY29uZi0+Y29uZGl0aW9uYWxzLT5uZWx0czsgKytpKSB7Ci0gICAgICAgIG5ldyA9ICZlbnRyaWVzW2ldOwotCWlmICghc3RyY2FzZWNtcChuZXctPm5hbWUsIGZuYW1lKSkgewotCSAgICBmbmFtZSA9IG5ldy0+bmFtZTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAgIC8qIGlmIHRoZSBsYXN0IGVudHJ5IGhhcyBhbiBpZGVudGlhbCBoZWFkZXJuYW1lIGFuZCByZWdleCB0aGVuCi0gICAgICogbWVyZ2Ugd2l0aCBpdAotICAgICAqLwotICAgIGkgPSBzY29uZi0+Y29uZGl0aW9uYWxzLT5uZWx0cyAtIDE7Ci0gICAgaWNhc2UgPSBjbWQtPmluZm8gPT0gSUNBU0VfTUFHSUM7Ci0gICAgaWYgKGkgPCAwCi0JfHwgZW50cmllc1tpXS5uYW1lICE9IGZuYW1lCi0JfHwgZW50cmllc1tpXS5pY2FzZSAhPSBpY2FzZQotCXx8IHN0cmNtcChlbnRyaWVzW2ldLnJlZ2V4LCByZWdleCkpIHsKLQotCS8qIG5vIG1hdGNoLCBjcmVhdGUgYSBuZXcgZW50cnkgKi8KLQotCW5ldyA9IGFwX3B1c2hfYXJyYXkoc2NvbmYtPmNvbmRpdGlvbmFscyk7Ci0JbmV3LT5uYW1lID0gZm5hbWU7Ci0JbmV3LT5yZWdleCA9IHJlZ2V4OwotCW5ldy0+aWNhc2UgPSBpY2FzZTsKLQluZXctPnByZWcgPSBhcF9wcmVnY29tcChjbWQtPnBvb2wsIHJlZ2V4LAotCQkJCShSRUdfRVhURU5ERUQgfCBSRUdfTk9TVUIKLQkJCQkgfCAoaWNhc2UgPyBSRUdfSUNBU0UgOiAwKSkpOwotCWlmIChuZXctPnByZWcgPT0gTlVMTCkgewotCSAgICByZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsIGNtZC0+Y21kLT5uYW1lLAotCQkJICAgICAgIiByZWdleCBjb3VsZCBub3QgYmUgY29tcGlsZWQuIiwgTlVMTCk7Ci0JfQotCW5ldy0+ZmVhdHVyZXMgPSBhcF9tYWtlX3RhYmxlKGNtZC0+cG9vbCwgMik7Ci0KLQlpZiAoIXN0cmNhc2VjbXAoZm5hbWUsICJyZW1vdGVfYWRkciIpKSB7Ci0JICAgIG5ldy0+c3BlY2lhbF90eXBlID0gU1BFQ0lBTF9SRU1PVEVfQUREUjsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAoZm5hbWUsICJyZW1vdGVfaG9zdCIpKSB7Ci0JICAgIG5ldy0+c3BlY2lhbF90eXBlID0gU1BFQ0lBTF9SRU1PVEVfSE9TVDsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAoZm5hbWUsICJyZW1vdGVfdXNlciIpKSB7Ci0JICAgIG5ldy0+c3BlY2lhbF90eXBlID0gU1BFQ0lBTF9SRU1PVEVfVVNFUjsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAoZm5hbWUsICJyZXF1ZXN0X3VyaSIpKSB7Ci0JICAgIG5ldy0+c3BlY2lhbF90eXBlID0gU1BFQ0lBTF9SRVFVRVNUX1VSSTsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAoZm5hbWUsICJyZXF1ZXN0X21ldGhvZCIpKSB7Ci0JICAgIG5ldy0+c3BlY2lhbF90eXBlID0gU1BFQ0lBTF9SRVFVRVNUX01FVEhPRDsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAoZm5hbWUsICJyZXF1ZXN0X3Byb3RvY29sIikpIHsKLQkgICAgbmV3LT5zcGVjaWFsX3R5cGUgPSBTUEVDSUFMX1JFUVVFU1RfUFJPVE9DT0w7Ci0JfQotCWVsc2UgewotCSAgICBuZXctPnNwZWNpYWxfdHlwZSA9IFNQRUNJQUxfTk9UOwotCX0KLSAgICB9Ci0gICAgZWxzZSB7Ci0JbmV3ID0gJmVudHJpZXNbaV07Ci0gICAgfQotCi0gICAgZm9yICggOyA7ICkgewotCWZlYXR1cmUgPSBhcF9nZXR3b3JkX2NvbmYoY21kLT5wb29sLCAmYXJncyk7Ci0JaWYgKCEqZmVhdHVyZSkgewotCSAgICBicmVhazsKLQl9Ci0gICAgICAgIGJlZW5oZXJlKys7Ci0KLSAgICAgICAgdmFyID0gYXBfZ2V0d29yZChjbWQtPnBvb2wsICZmZWF0dXJlLCAnPScpOwotICAgICAgICBpZiAoKmZlYXR1cmUpIHsKLSAgICAgICAgICAgIGFwX3RhYmxlX3NldG4obmV3LT5mZWF0dXJlcywgdmFyLCBmZWF0dXJlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgqdmFyID09ICchJykgewotICAgICAgICAgICAgYXBfdGFibGVfc2V0bihuZXctPmZlYXR1cmVzLCB2YXIgKyAxLCAiISIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXBfdGFibGVfc2V0bihuZXctPmZlYXR1cmVzLCB2YXIsICIxIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWJlZW5oZXJlKSB7Ci0gICAgICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIk1pc3NpbmcgZW52YXJpYWJsZSBleHByZXNzaW9uIGZvciAiLAotCQkJICBjbWQtPmNtZC0+bmFtZSwgTlVMTCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICphZGRfc2V0ZW52aWYoY21kX3Bhcm1zICpjbWQsIHZvaWQgKm1jb25maWcsCi0JCQkJY29uc3QgY2hhciAqYXJncykKLXsKLSAgICBjaGFyICpmbmFtZTsKLQotICAgIC8qIGdldCBoZWFkZXIgbmFtZSAqLwotICAgIGZuYW1lID0gYXBfZ2V0d29yZF9jb25mKGNtZC0+cG9vbCwgJmFyZ3MpOwotICAgIGlmICghKmZuYW1lKSB7Ci0gICAgICAgIHJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIk1pc3NpbmcgaGVhZGVyLWZpZWxkIG5hbWUgZm9yICIsCi0JCQkgIGNtZC0+Y21kLT5uYW1lLCBOVUxMKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFkZF9zZXRlbnZpZl9jb3JlKGNtZCwgbWNvbmZpZywgZm5hbWUsIGFyZ3MpOwotfQotCi0vKgotICogVGhpcyByb3V0aW5lIGhhbmRsZXMgdGhlIEJyb3dzZXJNYXRjaCogZGlyZWN0aXZlcy4gIEl0IHNpbXBseSB0dXJucyBhcm91bmQKLSAqIGFuZCBmZWVkcyB0aGVtLCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBlbWJlbGxpc2htZW50cywgdG8gdGhlIGdlbmVyYWwtcHVycG9zZQotICogY29tbWFuZCBoYW5kbGVyLgotICovCi1zdGF0aWMgY29uc3QgY2hhciAqYWRkX2Jyb3dzZXIoY21kX3Bhcm1zICpjbWQsIHZvaWQgKm1jb25maWcsIGNvbnN0IGNoYXIgKmFyZ3MpCi17Ci0gICAgcmV0dXJuIGFkZF9zZXRlbnZpZl9jb3JlKGNtZCwgbWNvbmZpZywgIlVzZXItQWdlbnQiLCBhcmdzKTsKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIHNldGVudmlmX21vZHVsZV9jbWRzW10gPQotewotICAgIHsgIlNldEVudklmIiwgYWRkX3NldGVudmlmLCBOVUxMLAotICAgICAgUlNSQ19DT05GLCBSQVdfQVJHUywgIkEgaGVhZGVyLW5hbWUsIHJlZ2V4IGFuZCBhIGxpc3Qgb2YgdmFyaWFibGVzLiIgfSwKLSAgICB7ICJTZXRFbnZJZk5vQ2FzZSIsIGFkZF9zZXRlbnZpZiwgSUNBU0VfTUFHSUMsCi0gICAgICBSU1JDX0NPTkYsIFJBV19BUkdTLCAiYSBoZWFkZXItbmFtZSwgcmVnZXggYW5kIGEgbGlzdCBvZiB2YXJpYWJsZXMuIiB9LAotICAgIHsgIkJyb3dzZXJNYXRjaCIsIGFkZF9icm93c2VyLCBOVUxMLAotICAgICAgUlNSQ19DT05GLCBSQVdfQVJHUywgIkEgYnJvd3NlciByZWdleCBhbmQgYSBsaXN0IG9mIHZhcmlhYmxlcy4iIH0sCi0gICAgeyAiQnJvd3Nlck1hdGNoTm9DYXNlIiwgYWRkX2Jyb3dzZXIsIElDQVNFX01BR0lDLAotICAgICAgUlNSQ19DT05GLCBSQVdfQVJHUywgIkEgYnJvd3NlciByZWdleCBhbmQgYSBsaXN0IG9mIHZhcmlhYmxlcy4iIH0sCi0gICAgeyBOVUxMIH0sCi19OwotCi1zdGF0aWMgaW50IG1hdGNoX2hlYWRlcnMocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgc2VydmVyX3JlYyAqcyA9IHItPnNlcnZlcjsKLSAgICBzZWlfY2ZnX3JlYyAqc2NvbmY7Ci0gICAgc2VpX2VudHJ5ICplbnRyaWVzOwotICAgIGFwX3RhYmxlX2VudHJ5X3QgKmVsdHM7Ci0gICAgY29uc3QgY2hhciAqdmFsOwotICAgIGludCBpLCBqOwotICAgIGNoYXIgKmxhc3RfbmFtZTsKLQotICAgIHNjb25mID0gKHNlaV9jZmdfcmVjICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsCi0JCQkJCQkgJnNldGVudmlmX21vZHVsZSk7Ci0gICAgZW50cmllcyA9IChzZWlfZW50cnkgKikgc2NvbmYtPmNvbmRpdGlvbmFscy0+ZWx0czsKLSAgICBsYXN0X25hbWUgPSBOVUxMOwotICAgIHZhbCA9IE5VTEw7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNjb25mLT5jb25kaXRpb25hbHMtPm5lbHRzOyArK2kpIHsKLSAgICAgICAgc2VpX2VudHJ5ICpiID0gJmVudHJpZXNbaV07Ci0KLQkvKiBPcHRpbWl6ZSB0aGUgY2FzZSB3aGVyZSBhIGJ1bmNoIG9mIGRpcmVjdGl2ZXMgaW4gYSByb3cgdXNlIHRoZQotCSAqIHNhbWUgaGVhZGVyLiAgUmVtZW1iZXIgd2UgZG9uJ3QgbmVlZCB0byBzdHJjbXAgdGhlIHR3byBoZWFkZXIKLQkgKiBuYW1lcyBiZWNhdXNlIHdlIG1hZGUgc3VyZSB0aGUgcG9pbnRlcnMgd2VyZSBlcXVhbCBkdXJpbmcKLQkgKiBjb25maWd1cmF0aW9uLgotCSAqLwotCWlmIChiLT5uYW1lICE9IGxhc3RfbmFtZSkgewotCSAgICBsYXN0X25hbWUgPSBiLT5uYW1lOwotCSAgICBzd2l0Y2ggKGItPnNwZWNpYWxfdHlwZSkgewotCSAgICBjYXNlIFNQRUNJQUxfUkVNT1RFX0FERFI6Ci0JCXZhbCA9IHItPmNvbm5lY3Rpb24tPnJlbW90ZV9pcDsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU1BFQ0lBTF9SRU1PVEVfSE9TVDoKLQkJdmFsID0gIGFwX2dldF9yZW1vdGVfaG9zdChyLT5jb25uZWN0aW9uLCByLT5wZXJfZGlyX2NvbmZpZywKLQkJCQkJICBSRU1PVEVfTkFNRSk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNQRUNJQUxfUkVNT1RFX1VTRVI6Ci0JCXZhbCA9IHItPnVzZXI7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFNQRUNJQUxfUkVRVUVTVF9VUkk6Ci0JCXZhbCA9IHItPnVyaTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgU1BFQ0lBTF9SRVFVRVNUX01FVEhPRDoKLQkJdmFsID0gci0+bWV0aG9kOwotCQlicmVhazsKLQkgICAgY2FzZSBTUEVDSUFMX1JFUVVFU1RfUFJPVE9DT0w6Ci0JCXZhbCA9IHItPnByb3RvY29sOwotCQlicmVhazsKLQkgICAgY2FzZSBTUEVDSUFMX05PVDoKLQkJdmFsID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sIGItPm5hbWUpOwotCQlpZiAodmFsID09IE5VTEwpIHsKLQkJICAgIHZhbCA9IGFwX3RhYmxlX2dldChyLT5zdWJwcm9jZXNzX2VudiwgYi0+bmFtZSk7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIH0KLSAgICAgICAgfQotCi0JLyoKLQkgKiBBIE5VTEwgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIGhlYWRlciBmaWVsZCBvciBzcGVjaWFsIGVudGl0eQotCSAqIHdhc24ndCBwcmVzZW50IG9yIGlzIHVuZGVmaW5lZC4gIFJlcHJlc2VudCB0aGF0IGFzIGFuIGVtcHR5IHN0cmluZwotCSAqIHNvIHRoYXQgUkVzIGxpa2UgIl4kIiB3aWxsIHdvcmsgYW5kIGFsbG93IGVudmFyaWFibGUgc2V0dGluZwotCSAqIGJhc2VkIG9uIG1pc3Npbmcgb3IgZW1wdHkgZmllbGQuCi0JICovCi0gICAgICAgIGlmICh2YWwgPT0gTlVMTCkgewotICAgICAgICAgICAgdmFsID0gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWFwX3JlZ2V4ZWMoYi0+cHJlZywgdmFsLCAwLCBOVUxMLCAwKSkgewotCSAgICBhcF9hcnJheV9oZWFkZXJfdCAqYXJyID0gYXBfdGFibGVfZWx0cyhiLT5mZWF0dXJlcyk7Ci0gICAgICAgICAgICBlbHRzID0gKGFwX3RhYmxlX2VudHJ5X3QgKikgYXJyLT5lbHRzOwotCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYXJyLT5uZWx0czsgKytqKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoZWx0c1tqXS52YWwsICIhIikpIHsKLSAgICAgICAgICAgICAgICAgICAgYXBfdGFibGVfdW5zZXQoci0+c3VicHJvY2Vzc19lbnYsIGVsdHNbal0ua2V5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwX3RhYmxlX3NldG4oci0+c3VicHJvY2Vzc19lbnYsIGVsdHNbal0ua2V5LCBlbHRzW2pdLnZhbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIERFQ0xJTkVEOwotfQotCi1zdGF0aWMgdm9pZCByZWdpc3Rlcl9ob29rcyh2b2lkKQotewotICAgIGFwX2hvb2tfcG9zdF9yZWFkX3JlcXVlc3QobWF0Y2hfaGVhZGVycyxOVUxMLE5VTEwsSE9PS19NSURETEUpOwotfQotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgc2V0ZW52aWZfbW9kdWxlID0KLXsKLSAgICBTVEFOREFSRDIwX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogZGlyIGNvbmZpZyBjcmVhdGVyICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpciBtZXJnZXIgLS0tIGRlZmF1bHQgaXMgdG8gb3ZlcnJpZGUgKi8KLSAgICBjcmVhdGVfc2V0ZW52aWZfY29uZmlnLCAgICAgLyogc2VydmVyIGNvbmZpZyAqLwotICAgIG1lcmdlX3NldGVudmlmX2NvbmZpZywgICAgICAvKiBtZXJnZSBzZXJ2ZXIgY29uZmlncyAqLwotICAgIHNldGVudmlmX21vZHVsZV9jbWRzLCAgICAgICAvKiBjb21tYW5kIGFwX3RhYmxlX3QgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaGFuZGxlcnMgKi8KLSAgICByZWdpc3Rlcl9ob29rcwkJLyogcmVnaXN0ZXIgaG9va3MgKi8KLX07Ci0KZGlmZiAtLWdpdCBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX3NldGVudmlmLmV4cCBiL21vZHVsZXMvbWV0YWRhdGEvbW9kX3NldGVudmlmLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzODAwZS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL21vZF9zZXRlbnZpZi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zZXRlbnZpZl9tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvbWV0YWRhdGEvbW9kX3VuaXF1ZV9pZC5jIGIvbW9kdWxlcy9tZXRhZGF0YS9tb2RfdW5pcXVlX2lkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZGViMmIuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfdW5pcXVlX2lkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTEgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBtb2RfdW5pcXVlX2lkLmM6IGdlbmVyYXRlIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGVhY2ggcmVxdWVzdAotICoKLSAqIE9yaWdpbmFsIGF1dGhvcjogRGVhbiBHYXVkZXQgPGRnYXVkZXRAYXJjdGljLm9yZz4KLSAqIFVVZW5jb2RpbmcgbW9kaWZpZWQgYnk6IEFsdmFybyBNYXJ0aW5leiBFY2hldmFycmlhIDxhbHZhcm9AbGFuZGVyLmVzPgotICovCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVuc2lnbmVkIGludCBzdGFtcDsKLSAgICB1bnNpZ25lZCBpbnQgaW5fYWRkcjsKLSAgICB1bnNpZ25lZCBpbnQgcGlkOwotICAgIHVuc2lnbmVkIHNob3J0IGNvdW50ZXI7Ci0gICAgdW5zaWduZWQgaW50IHRocmVhZF9pbmRleDsKLX0gdW5pcXVlX2lkX3JlYzsKLQotLyogV2UgYXJlIHVzaW5nIHRocmVhZF9pbmRleCAodGhlIGluZGV4IGludG8gdGhlIHNjb3JlYm9hcmQpLCBiZWNhdXNlIHdlCi0gKiBjYW5ub250IGdhcmF1bnRlZSB0aGUgdGhyZWFkX2lkIHdpbGwgYmUgYW4gaW50ZWdlci4KLSAqCi0gKiBUaGlzIGNvZGUgbG9va3MgbGlrZSBpdCB3b24ndCBnaXZlIGEgdW5pcXVlIElEIHdpdGggdGhlIG5ldyB0aHJlYWQgbG9naWMuCi0gKiBJdCB3aWxsLiAgVGhlIHJlYXNvbiBpcywgd2UgZG9uJ3QgaW5jcmVtZW50IHRoZSBjb3VudGVyIGluIGEgdGhyZWFkX3NhZmUgCi0gKiBtYW5uZXIuICBCZWNhdXNlIHRoZSB0aHJlYWRfaW5kZXggaXMgYWxzbyBpbiB0aGUgdW5pcXVlIElEIG5vdywgdGhpcyBkb2VzCi0gKiBub3QgbWF0dGVyLiAgSW4gb3JkZXIgZm9yIHRoZSBpZCB0byBub3QgYmUgdW5pcXVlLCB0aGUgc2FtZSB0aHJlYWQgd291bGQKLSAqIGhhdmUgdG8gZ2V0IHRoZSBzYW1lIGNvdW50ZXIgdHdpY2UgaW4gdGhlIHNhbWUgc2Vjb25kLiAKLSAqLwotCi0vKiBDb21tZW50czoKLSAqCi0gKiBXZSB3YW50IGFuIGlkZW50aWZpZXIgd2hpY2ggaXMgdW5pcXVlIGFjcm9zcyBhbGwgaGl0cywgZXZlcnl3aGVyZS4KLSAqICJldmVyeXdoZXJlIiBpbmNsdWRlcyBtdWx0aXBsZSBodHRwZCBpbnN0YW5jZXMgb24gdGhlIHNhbWUgbWFjaGluZSwgb3Igb24KLSAqIG11bHRpcGxlIG1hY2hpbmVzLiAgRXNzZW50aWFsbHkgImV2ZXJ5d2hlcmUiIHNob3VsZCBpbmNsdWRlIGFsbCBwb3NzaWJsZQotICogaHR0cGRzIGFjcm9zcyBhbGwgc2VydmVycyBhdCBhIHBhcnRpY3VsYXIgInNpdGUiLiAgV2UgbWFrZSBzb21lIGFzc3VtcHRpb25zCi0gKiB0aGF0IGlmIHRoZSBzaXRlIGhhcyBhIGNsdXN0ZXIgb2YgbWFjaGluZXMgdGhlbiB0aGVpciB0aW1lIGlzIHJlbGF0aXZlbHkKLSAqIHN5bmNocm9uaXplZC4gIFdlIGFsc28gYXNzdW1lIHRoYXQgdGhlIGZpcnN0IGFkZHJlc3MgcmV0dXJuZWQgYnkgYQotICogZ2V0aG9zdGJ5bmFtZSAoZ2V0aG9zdG5hbWUoKSkgaXMgdW5pcXVlIGFjcm9zcyBhbGwgdGhlIG1hY2hpbmVzIGF0IHRoZQotICogInNpdGUiLgotICoKLSAqIFdlIGFsc28gZnVydGhlciBhc3N1bWUgdGhhdCBwaWRzIGZpdCBpbiAzMi1iaXRzLiAgSWYgc29tZXRoaW5nIHVzZXMgbW9yZQotICogdGhhbiAzMi1iaXRzLCB0aGUgZml4IGlzIHRyaXZpYWwsIGJ1dCBpdCByZXF1aXJlcyB0aGUgdW5yb2xsZWQgdXVlbmNvZGluZwotICogbG9vcCB0byBiZSBleHRlbmRlZC4gICogQSBzaW1pbGFyIGZpeCBpcyBuZWVkZWQgdG8gc3VwcG9ydCBtdWx0aXRocmVhZGVkCi0gKiBzZXJ2ZXJzLCB1c2luZyBhIHBpZC90aWQgY29tYm8uCi0gKgotICogVG9nZXRoZXIsIHRoZSBpbl9hZGRyIGFuZCBwaWQgYXJlIGFzc3VtZWQgdG8gYWJzb2x1dGVseSB1bmlxdWVseSBpZGVudGlmeQotICogdGhpcyBvbmUgY2hpbGQgZnJvbSBhbGwgb3RoZXIgY3VycmVudGx5IHJ1bm5pbmcgY2hpbGRyZW4gb24gYWxsIHNlcnZlcnMKLSAqIChpbmNsdWRpbmcgdGhpcyBwaHlzaWNhbCBzZXJ2ZXIgaWYgaXQgaXMgcnVubmluZyBtdWx0aXBsZSBodHRwZHMpIGZyb20gZWFjaAotICogb3RoZXIuCi0gKgotICogVGhlIHN0YW1wIGFuZCBjb3VudGVyIGFyZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGFsbCBoaXRzIGZvciBhIHBhcnRpY3VsYXIKLSAqIChpbl9hZGRyLHBpZCkgcGFpci4gIFRoZSBzdGFtcCBpcyB1cGRhdGVkIHVzaW5nIHItPnJlcXVlc3RfdGltZSwKLSAqIHNhdmluZyBjcHUgY3ljbGVzLiAgVGhlIGNvdW50ZXIgaXMgbmV2ZXIgcmVzZXQsIGFuZCBpcyB1c2VkIHRvIHBlcm1pdCB1cCB0bwotICogNjRrIHJlcXVlc3RzIGluIGEgc2luZ2xlIHNlY29uZCBieSBhIHNpbmdsZSBjaGlsZC4KLSAqCi0gKiBUaGUgMTEyLWJpdHMgb2YgdW5pcXVlX2lkX3JlYyBhcmUgZW5jb2RlZCB1c2luZyB0aGUgYWxwaGFiZXQKLSAqIFtBLVphLXowLTlALV0sIHJlc3VsdGluZyBpbiAxOSBieXRlcyBvZiBwcmludGFibGUgY2hhcmFjdGVycy4gIFRoYXQgaXMgdGhlbgotICogc3R1ZmZlZCBpbnRvIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBVTklRVUVfSUQgc28gdGhhdCBpdCBpcyBhdmFpbGFibGUgdG8KLSAqIG90aGVyIG1vZHVsZXMuICBUaGUgYWxwaGFiZXQgY2hvaWNlIGRpZmZlcnMgZnJvbSBub3JtYWwgYmFzZTY0IGVuY29kaW5nCi0gKiBbQS1aYS16MC05Ky9dIGJlY2F1c2UgKyBhbmQgLyBhcmUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIFVSTHMgYW5kIHdlIHdhbnQgdG8KLSAqIG1ha2UgaXQgZWFzeSB0byB1c2UgVU5JUVVFX0lEIGluIFVSTHMuCi0gKgotICogTm90ZSB0aGF0IFVOSVFVRV9JRCBzaG91bGQgYmUgY29uc2lkZXJlZCBhbiBvcGFxdWUgdG9rZW4gYnkgb3RoZXIKLSAqIGFwcGxpY2F0aW9ucy4gIE5vIGF0dGVtcHQgc2hvdWxkIGJlIG1hZGUgdG8gZGlzc2VjdCBpdHMgaW50ZXJuYWwgY29tcG9uZW50cy4KLSAqIEl0IGlzIGFuIGFic3RyYWN0aW9uIHRoYXQgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIGFzIHRoZSBuZWVkcyBvZiB0aGlzCi0gKiBtb2R1bGUgY2hhbmdlLgotICoKLSAqIEl0IGlzIGhpZ2hseSBkZXNpcmFibGUgdGhhdCBpZGVudGlmaWVycyBleGlzdCBmb3IgImV0ZXJuaXR5Ii4gIEJ1dCBmdXR1cmUKLSAqIG5lZWRzIChzdWNoIGFzIG11Y2ggZmFzdGVyIHdlYnNlcnZlcnMsIG1vdmluZyB0byA2NC1iaXQgcGlkcywgb3IgbW92aW5nIHRvIGEKLSAqIG11bHRpdGhyZWFkZWQgc2VydmVyKSBtYXkgZGljdGF0ZSBhIG5lZWQgdG8gY2hhbmdlIHRoZSBjb250ZW50cyBvZgotICogdW5pcXVlX2lkX3JlYy4gIFN1Y2ggYSBmdXR1cmUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGVuc3VyZSB0aGF0IHRoZSBmaXJzdAotICogZmllbGQgaXMgc3RpbGwgYSB0aW1lX3Qgc3RhbXAuICBCeSBkb2luZyB0aGF0LCBpdCBpcyBwb3NzaWJsZSBmb3IgYSBzaXRlIHRvCi0gKiBoYXZlIGEgImZsYWcgc2Vjb25kIiBpbiB3aGljaCB0aGV5IHN0b3AgYWxsIG9mIHRoZWlyIG9sZC1mb3JtYXQgc2VydmVycywKLSAqIHdhaXQgb25lIGVudGlyZSBzZWNvbmQsIGFuZCB0aGVuIHN0YXJ0IGFsbCBvZiB0aGVpciBuZXctc2VydmVycy4gIFRoaXMKLSAqIHByb2NlZHVyZSB3aWxsIGVuc3VyZSB0aGF0IHRoZSBuZXcgc3BhY2Ugb2YgaWRlbnRpZmllcnMgaXMgY29tcGxldGVseSB1bmlxdWUKLSAqIGZyb20gdGhlIG9sZCBzcGFjZS4gIChTaW5jZSB0aGUgZmlyc3QgZm91ciB1bmVuY29kZWQgYnl0ZXMgYWx3YXlzIGRpZmZlci4pCi0gKi8KLS8qCi0gKiBTdW4gSnVuICA3IDA1OjQzOjQ5IENFU1QgMTk5OCAtLSBBbHZhcm8KLSAqIE1vcmUgY29tbWVudHM6Ci0gKiAxKSBUaGUgVVVlbmNvZGluZyBwcm9kZWN1cmUgaXMgbm93IGRvbmUgaW4gYSBnZW5lcmFsIHdheSwgYXZvaWRpbmcgdGhlIHByb2JsZW1zCi0gKiB3aXRoIHNpemVzIGFuZCBwYWRkaW5ncyB0aGF0IGNhbiBhcmlzZSBkZXBlbmRpbmcgb24gdGhlIGFyY2hpdGVjdHVyZS4gTm93IHRoZQotICogb2Zmc2V0cyBhbmQgc2l6ZXMgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSB1bmlxdWVfaWRfcmVjIHN0cnVjdHVyZSBhcmUgY2FsY3VsYXRlZAotICogaW4gdW5pcXVlX2lkX2dsb2JhbF9pbml0OyBhbmQgdGhlbiB1c2VkIHRvIGR1cGxpY2F0ZSB0aGUgc3RydWN0dXJlIHdpdGhvdXQgdGhlCi0gKiBwYWRkaW5ncyB0aGF0IG1pZ2h0IGV4aXN0LiBUaGUgbXVsdGl0aHJlYWRlZCBzZXJ2ZXIgZml4IHNob3VsZCBiZSBub3cgdmVyeSBlYXN5OgotICoganVzdCBhZGQgYSBuZXcgInRpZCIgZmllbGQgdG8gdGhlIHVuaXF1ZV9pZF9yZWMgc3RydWN0dXJlLCBhbmQgaW5jcmVhc2UgYnkgb25lCi0gKiBVTklRVUVfSURfUkVDX01BWC4KLSAqIDIpIHVuaXF1ZV9pZF9yZWMuc3RhbXAgaGFzIGJlZW4gY2hhbmdlZCBmcm9tICJ0aW1lX3QiIHRvICJ1bnNpZ25lZCBpbnQiLCBiZWNhdXNlCi0gKiBpdHMgc2l6ZSBpcyA2NGJpdHMgb24gc29tZSBwbGF0Zm9ybXMgKGxpbnV4L2FscGhhKSwgYW5kIHRoaXMgY2F1c2VkIHByb2JsZW1zIHdpdGgKLSAqIGh0b25sL250b2hsLiBXZWxsLCB0aGlzIHNob3VsZG4ndCBiZSBhIHByb2JsZW0gdGlsbCB5ZWFyIDIxMDYuCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGdsb2JhbF9pbl9hZGRyOwotCi1zdGF0aWMgdW5pcXVlX2lkX3JlYyBjdXJfdW5pcXVlX2lkOwotCi0vKgotICogTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBzdHJ1Y3R1cmUgdW5pcXVlX2lkX3JlYy4KLSAqLwotI2RlZmluZSBVTklRVUVfSURfUkVDX01BWCA1IAotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgdW5pcXVlX2lkX3JlY19vZmZzZXRbVU5JUVVFX0lEX1JFQ19NQVhdLAotICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZV9pZF9yZWNfc2l6ZVtVTklRVUVfSURfUkVDX01BWF0sCi0gICAgICAgICAgICAgICAgICAgICAgdW5pcXVlX2lkX3JlY190b3RhbF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZV9pZF9yZWNfc2l6ZV91dTsKLQotc3RhdGljIHZvaWQgdW5pcXVlX2lkX2dsb2JhbF9pbml0KGFwX2NvbnRleHRfdCAqcCwgYXBfY29udGV4dF90ICpwbG9nLCBhcF9jb250ZXh0X3QgKnB0ZW1wLCBzZXJ2ZXJfcmVjICptYWluX3NlcnZlcikKLXsKLSNpZm5kZWYgTUFYSE9TVE5BTUVMRU4KLSNkZWZpbmUgTUFYSE9TVE5BTUVMRU4gMjU2Ci0jZW5kaWYKLSAgICBjaGFyIHN0cltNQVhIT1NUTkFNRUxFTiArIDFdOwotICAgIHN0cnVjdCBob3N0ZW50ICpoZW50OwotI2lmZGVmIEhBVkVfR0VUVElNRU9GREFZCi0gICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0jZW5kaWYKLQotICAgIC8qCi0gICAgICogQ2FsY3VsYXRlIHRoZSBzaXplcyBhbmQgb2Zmc2V0cyBpbiBjdXJfdW5pcXVlX2lkLgotICAgICAqLwotICAgIHVuaXF1ZV9pZF9yZWNfb2Zmc2V0WzBdID0gWHRPZmZzZXRPZih1bmlxdWVfaWRfcmVjLCBzdGFtcCk7Ci0gICAgdW5pcXVlX2lkX3JlY19zaXplWzBdID0gc2l6ZW9mKGN1cl91bmlxdWVfaWQuc3RhbXApOwotICAgIHVuaXF1ZV9pZF9yZWNfb2Zmc2V0WzFdID0gWHRPZmZzZXRPZih1bmlxdWVfaWRfcmVjLCBpbl9hZGRyKTsKLSAgICB1bmlxdWVfaWRfcmVjX3NpemVbMV0gPSBzaXplb2YoY3VyX3VuaXF1ZV9pZC5pbl9hZGRyKTsKLSAgICB1bmlxdWVfaWRfcmVjX29mZnNldFsyXSA9IFh0T2Zmc2V0T2YodW5pcXVlX2lkX3JlYywgcGlkKTsKLSAgICB1bmlxdWVfaWRfcmVjX3NpemVbMl0gPSBzaXplb2YoY3VyX3VuaXF1ZV9pZC5waWQpOwotICAgIHVuaXF1ZV9pZF9yZWNfb2Zmc2V0WzNdID0gWHRPZmZzZXRPZih1bmlxdWVfaWRfcmVjLCBjb3VudGVyKTsKLSAgICB1bmlxdWVfaWRfcmVjX3NpemVbM10gPSBzaXplb2YoY3VyX3VuaXF1ZV9pZC5jb3VudGVyKTsKLSAgICB1bmlxdWVfaWRfcmVjX29mZnNldFs0XSA9IFh0T2Zmc2V0T2YodW5pcXVlX2lkX3JlYywgdGhyZWFkX2luZGV4KTsKLSAgICB1bmlxdWVfaWRfcmVjX3NpemVbNF0gPSBzaXplb2YoY3VyX3VuaXF1ZV9pZC50aHJlYWRfaW5kZXgpOwotICAgIHVuaXF1ZV9pZF9yZWNfdG90YWxfc2l6ZSA9IHVuaXF1ZV9pZF9yZWNfc2l6ZVswXSArIHVuaXF1ZV9pZF9yZWNfc2l6ZVsxXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlX2lkX3JlY19zaXplWzJdICsgdW5pcXVlX2lkX3JlY19zaXplWzNdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWVfaWRfcmVjX3NpemVbNF07Ci0KLSAgICAvKgotICAgICAqIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIHdoZW4gZW5jb2RlZC4KLSAgICAgKi8KLSAgICB1bmlxdWVfaWRfcmVjX3NpemVfdXUgPSAodW5pcXVlX2lkX3JlY190b3RhbF9zaXplKjgrNSkvNjsKLQotICAgIC8qCi0gICAgICogTm93IGdldCB0aGUgZ2xvYmFsIGluX2FkZHIuICBOb3RlIHRoYXQgaXQgaXMgbm90IHN1ZmZpY2llbnQgdG8gdXNlIG9uZQotICAgICAqIG9mIHRoZSBhZGRyZXNzZXMgZnJvbSB0aGUgbWFpbl9zZXJ2ZXIsIHNpbmNlIHRob3NlIGFyZW4ndCBhcyBsaWtlbHkgdG8KLSAgICAgKiBiZSB1bmlxdWUgYXMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIG1hY2hpbmUKLSAgICAgKi8KLSAgICBpZiAoZ2V0aG9zdG5hbWUoc3RyLCBzaXplb2Yoc3RyKSAtIDEpICE9IDApIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfQUxFUlQsIGVycm5vLCBtYWluX3NlcnZlciwKLSAgICAgICAgICAiZ2V0aG9zdG5hbWU6IG1vZF91bmlxdWVfaWQgcmVxdWlyZXMgdGhlIGhvc3RuYW1lIG9mIHRoZSBzZXJ2ZXIiKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgc3RyW3NpemVvZihzdHIpIC0gMV0gPSAnXDAnOwotCi0gICAgaWYgKChoZW50ID0gZ2V0aG9zdGJ5bmFtZShzdHIpKSA9PSBOVUxMKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0FMRVJULCBoX2Vycm5vLCBtYWluX3NlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgIm1vZF91bmlxdWVfaWQ6IHVuYWJsZSB0byBnZXRob3N0YnluYW1lKFwiJXNcIikiLCBzdHIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGdsb2JhbF9pbl9hZGRyID0gKChzdHJ1Y3QgaW5fYWRkciAqKSBoZW50LT5oX2FkZHJfbGlzdFswXSktPnNfYWRkcjsKLQotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0lORk8sIDAsIG1haW5fc2VydmVyLAotICAgICAgICAgICAgICAgICJtb2RfdW5pcXVlX2lkOiB1c2luZyBpcCBhZGRyICVzIiwKLSAgICAgICAgICAgICAgICBpbmV0X250b2EoKihzdHJ1Y3QgaW5fYWRkciAqKSBoZW50LT5oX2FkZHJfbGlzdFswXSkpOwotCi0gICAgLyoKLSAgICAgKiBJZiB0aGUgc2VydmVyIGlzIHB1bW1lbGxlZCB3aXRoIHJlc3RhcnQgcmVxdWVzdHMgd2UgY291bGQgcG9zc2libHkgZW5kCi0gICAgICogdXAgaW4gYSBzaXR1YXRpb24gd2hlcmUgd2UncmUgc3RhcnRpbmcgYWdhaW4gZHVyaW5nIHRoZSBzYW1lIHNlY29uZAotICAgICAqIHRoYXQgaGFzIGJlZW4gdXNlZCBpbiBwcmV2aW91cyBpZGVudGlmaWVycy4gIEF2b2lkIHRoYXQgc2l0dWF0aW9uLgotICAgICAqIAotICAgICAqIEluIHRydXRoLCBmb3IgdGhpcyB0byBhY3R1YWxseSBoYXBwZW4gbm90IG9ubHkgd291bGQgaXQgaGF2ZSB0byByZXN0YXJ0Ci0gICAgICogaW4gdGhlIHNhbWUgc2Vjb25kLCBidXQgaXQgd291bGQgaGF2ZSB0byBzb21laG93IGdldCB0aGUgc2FtZSBwaWRzIGFzCi0gICAgICogb25lIG9mIHRoZSBvdGhlciBzZXJ2ZXJzIHRoYXQgd2FzIHJ1bm5pbmcgaW4gdGhhdCBzZWNvbmQuIFdoaWNoIHdvdWxkCi0gICAgICogbWVhbiBhIDY0ayB3cmFwYXJvdW5kIG9uIHBpZHMgLi4uIG5vdCB2ZXJ5IGxpa2VseSBhdCBhbGwuCi0gICAgICogCi0gICAgICogQnV0IHByb3RlY3RpbmcgYWdhaW5zdCBpdCBpcyByZWxhdGl2ZWx5IGNoZWFwLiAgV2UganVzdCBzbGVlcCBpbnRvIHRoZQotICAgICAqIG5leHQgc2Vjb25kLgotICAgICAqLwotI2lmbmRlZiBIQVZFX0dFVFRJTUVPRkRBWQotICAgIHNsZWVwKDEpOwotI2Vsc2UKLSAgICBpZiAoZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCkgPT0gLTEpIHsKLSAgICAgICAgc2xlZXAoMSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHR2LnR2X3VzZWMpIHsKLSAgICAgICAgdHYudHZfc2VjID0gMDsKLSAgICAgICAgdHYudHZfdXNlYyA9IDEwMDAwMDAgLSB0di50dl91c2VjOwotICAgICAgICBzZWxlY3QoMCwgTlVMTCwgTlVMTCwgTlVMTCwgJnR2KTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgdW5pcXVlX2lkX2NoaWxkX2luaXQoYXBfY29udGV4dF90ICpwLCBzZXJ2ZXJfcmVjICpzKQotewotICAgIHBpZF90IHBpZDsKLSNpZmRlZiBIQVZFX0dFVFRJTUVPRkRBWQotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotI2VuZGlmCi0KLSAgICAvKgotICAgICAqIE5vdGUgdGhhdCB3ZSB1c2UgdGhlIHBpZCBiZWNhdXNlIGl0J3MgcG9zc2libGUgdGhhdCBvbiB0aGUgc2FtZQotICAgICAqIHBoeXNpY2FsIG1hY2hpbmUgdGhlcmUgYXJlIG11bHRpcGxlIHNlcnZlcnMgKGkuZS4gdXNpbmcgTGlzdGVuKS4gQnV0Ci0gICAgICogaXQncyBndWFyYW50ZWVkIHRoYXQgbm9uZSBvZiB0aGVtIHdpbGwgc2hhcmUgdGhlIHNhbWUgcGlkcyBiZXR3ZWVuCi0gICAgICogY2hpbGRyZW4uCi0gICAgICogCi0gICAgICogWFhYOiBmb3IgbXVsdGl0aHJlYWQgdGhpcyBuZWVkcyB0byB1c2UgYSBwaWQvdGlkIGNvbWJvIGFuZCBwcm9iYWJseQotICAgICAqIG5lZWRzIHRvIGJlIGV4cGFuZGVkIHRvIDMyIGJpdHMKLSAgICAgKi8KLSAgICBwaWQgPSBnZXRwaWQoKTsKLSAgICBjdXJfdW5pcXVlX2lkLnBpZCA9IHBpZDsKLQotICAgIC8qCi0gICAgICogVGVzdCBvdXIgYXNzdW1wdGlvbiB0aGF0IHRoZSBwaWQgaXMgMzItYml0cy4gIEl0J3MgcG9zc2libGUgdGhhdAotICAgICAqIDY0LWJpdCBtYWNoaW5lcyB3aWxsIGRlY2xhcmUgcGlkX3QgdG8gYmUgNjQgYml0cyBidXQgb25seSB1c2UgMzIKLSAgICAgKiBvZiB0aGVtLiAgSXQgd291bGQgaGF2ZSBiZWVuIHJlYWxseSBuaWNlIHRvIHRlc3QgdGhpcyBkdXJpbmcKLSAgICAgKiBnbG9iYWxfaW5pdCAuLi4gYnV0IG9oIHdlbGwuCi0gICAgICovCi0gICAgaWYgKGN1cl91bmlxdWVfaWQucGlkICE9IHBpZCkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19DUklULCAwLCBzLAotICAgICAgICAgICAgICAgICAgICAib2ggbm8hIHBpZHMgYXJlIGdyZWF0ZXIgdGhhbiAzMi1iaXRzISAgSSdtIGJyb2tlbiEiKTsKLSAgICB9Ci0KLSAgICBjdXJfdW5pcXVlX2lkLmluX2FkZHIgPSBnbG9iYWxfaW5fYWRkcjsKLQotICAgIC8qCi0gICAgICogSWYgd2UgdXNlIDAgYXMgdGhlIGluaXRpYWwgY291bnRlciB3ZSBoYXZlIGEgbGl0dGxlIGxlc3MgcHJvdGVjdGlvbgotICAgICAqIGFnYWluc3QgcmVzdGFydCBwcm9ibGVtcywgYW5kIGEgbGl0dGxlIGxlc3MgcHJvdGVjdGlvbiBhZ2FpbnN0IGEgY2xvY2sKLSAgICAgKiBnb2luZyBiYWNrd2FyZHMgaW4gdGltZS4KLSAgICAgKi8KLSNpZmRlZiBIQVZFX0dFVFRJTUVPRkRBWQotICAgIGlmIChnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKSA9PSAtMSkgewotICAgICAgICBjdXJfdW5pcXVlX2lkLmNvdW50ZXIgPSAwOwotICAgIH0KLSAgICBlbHNlIHsKLQkvKiBTb21lIHN5c3RlbXMgaGF2ZSB2ZXJ5IGxvdyB2YXJpYW5jZSBvbiB0aGUgbG93IGVuZCBvZiB0aGVpcgotCSAqIHN5c3RlbSBjb3VudGVyLCBkZWZlbmQgYWdhaW5zdCB0aGF0LgotCSAqLwotICAgICAgICBjdXJfdW5pcXVlX2lkLmNvdW50ZXIgPSB0di50dl91c2VjIC8gMTA7Ci0gICAgfQotI2Vsc2UKLSAgICBjdXJfdW5pcXVlX2lkLmNvdW50ZXIgPSAwOwotI2VuZGlmCi0KLSAgICAvKgotICAgICAqIFdlIG11c3QgYWx3YXlzIHVzZSBuZXR3b3JrIG9yZGVyaW5nIGZvciB0aGVzZSBieXRlcywgc28gdGhhdAotICAgICAqIGlkZW50aWZpZXJzIGFyZSBjb21wYXJhYmxlIGJldHdlZW4gbWFjaGluZXMgb2YgZGlmZmVyZW50IGJ5dGUKLSAgICAgKiBvcmRlcmluZ3MuICBOb3RlIGluX2FkZHIgaXMgYWxyZWFkeSBpbiBuZXR3b3JrIG9yZGVyLgotICAgICAqLwotICAgIGN1cl91bmlxdWVfaWQucGlkID0gaHRvbmwoY3VyX3VuaXF1ZV9pZC5waWQpOwotICAgIGN1cl91bmlxdWVfaWQuY291bnRlciA9IGh0b25zKGN1cl91bmlxdWVfaWQuY291bnRlcik7Ci19Ci0KLS8qIE5PVEU6IFRoaXMgaXMgKk5PVCogdGhlIHNhbWUgZW5jb2RpbmcgdXNlZCBieSBiYXNlNjRlbmNvZGUgLi4uIHRoZSBsYXN0IHR3bwotICogY2hhcmFjdGVycyBzaG91bGQgYmUgKyBhbmQgLy4gIEJ1dCB0aG9zZSB0d28gY2hhcmFjdGVycyBoYXZlIHZlcnkgc3BlY2lhbAotICogbWVhbmluZ3MgaW4gVVJMcywgYW5kIHdlIHdhbnQgdG8gbWFrZSBpdCBlYXN5IHRvIHVzZSBpZGVudGlmaWVycyBpbgotICogVVJMcy4gIFNvIHdlIHJlcGxhY2UgdGhlbSB3aXRoIEAgYW5kIC0uCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyIHV1ZW5jb2Rlcls2NF0gPSB7Ci0gICAgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywgJ0cnLCAnSCcsICdJJywgJ0onLCAnSycsICdMJywgJ00nLAotICAgICdOJywgJ08nLCAnUCcsICdRJywgJ1InLCAnUycsICdUJywgJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJywKLSAgICAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicsICdrJywgJ2wnLCAnbScsCi0gICAgJ24nLCAnbycsICdwJywgJ3EnLCAncicsICdzJywgJ3QnLCAndScsICd2JywgJ3cnLCAneCcsICd5JywgJ3onLAotICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ0AnLCAnLScsCi19OwotCi1zdGF0aWMgaW50IGdlbl91bmlxdWVfaWQocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY2hhciAqc3RyOwotICAgIC8qCi0gICAgICogQnVmZmVyIHBhZGRlZCB3aXRoIHR3byBmaW5hbCBieXRlcywgdXNlZCB0byBjb3B5IHRoZSB1bmlxdWVfaWRfcmVkCi0gICAgICogc3RydWN0dXJlIHdpdGhvdXQgdGhlIGludGVybmFsIHBhZGRpbmdzIHRoYXQgaXQgY291bGQgaGF2ZS4KLSAgICAgKi8KLSAgICB1bmlxdWVfaWRfcmVjIG5ld191bmlxdWVfaWQ7Ci0gICAgc3RydWN0IHsKLQl1bmlxdWVfaWRfcmVjIGZvbzsKLQl1bnNpZ25lZCBjaGFyIHBhZFsyXTsKLSAgICB9IHBhZGRlZGJ1ZjsKLSAgICB1bnNpZ25lZCBjaGFyICp4LCp5OwotICAgIHVuc2lnbmVkIHNob3J0IGNvdW50ZXI7Ci0gICAgY29uc3QgY2hhciAqZTsKLSAgICBpbnQgaSxqLGs7Ci0KLSAgICAvKiBjb3B5IHRoZSB1bmlxdWVfaWQgaWYgdGhpcyBpcyBhbiBpbnRlcm5hbCByZWRpcmVjdCAod2UncmUgbmV2ZXIKLSAgICAgKiBhY3R1YWxseSBjYWxsZWQgZm9yIHN1YiByZXF1ZXN0cywgc28gd2UgZG9uJ3QgbmVlZCB0byB0ZXN0IGZvcgotICAgICAqIHRoZW0pICovCi0gICAgaWYgKHItPnByZXYgJiYgKGUgPSBhcF90YWJsZV9nZXQoci0+c3VicHJvY2Vzc19lbnYsICJSRURJUkVDVF9VTklRVUVfSUQiKSkpIHsKLQlhcF90YWJsZV9zZXRuKHItPnN1YnByb2Nlc3NfZW52LCAiVU5JUVVFX0lEIiwgZSk7Ci0JcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLSAgICAKLSAgICBuZXdfdW5pcXVlX2lkLmluX2FkZHIgPSBjdXJfdW5pcXVlX2lkLmluX2FkZHI7Ci0gICAgbmV3X3VuaXF1ZV9pZC5waWQgPSBjdXJfdW5pcXVlX2lkLnBpZDsKLSAgICBuZXdfdW5pcXVlX2lkLmNvdW50ZXIgPSBjdXJfdW5pcXVlX2lkLmNvdW50ZXI7Ci0KLSAgICBuZXdfdW5pcXVlX2lkLnN0YW1wID0gaHRvbmwoKHVuc2lnbmVkIGludClyLT5yZXF1ZXN0X3RpbWUpOwotICAgIG5ld191bmlxdWVfaWQudGhyZWFkX2luZGV4ID0gaHRvbmwoKHVuc2lnbmVkIGludClyLT5jb25uZWN0aW9uLT5pZCk7Ci0KLSAgICAvKiB3ZSdsbCB1c2UgYSB0ZW1wb3JhbCBidWZmZXIgdG8gYXZvaWQgdXVlbmNvZGluZyB0aGUgcG9zc2libGUgaW50ZXJuYWwKLSAgICAgKiBwYWRkaW5ncyBvZiB0aGUgb3JpZ2luYWwgc3RydWN0dXJlICovCi0gICAgeCA9ICh1bnNpZ25lZCBjaGFyICopICZwYWRkZWRidWY7Ci0gICAgeSA9ICh1bnNpZ25lZCBjaGFyICopICZuZXdfdW5pcXVlX2lkOwotICAgIGsgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBVTklRVUVfSURfUkVDX01BWDsgaSsrKSB7Ci0gICAgICAgIHkgPSAoKHVuc2lnbmVkIGNoYXIgKikgJm5ld191bmlxdWVfaWQpICsgdW5pcXVlX2lkX3JlY19vZmZzZXRbaV07Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCB1bmlxdWVfaWRfcmVjX3NpemVbaV07IGorKywgaysrKSB7Ci0gICAgICAgICAgICB4W2tdID0geVtqXTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKgotICAgICAqIFdlIHJlc2V0IHR3byBtb3JlIGJ5dGVzIGp1c3QgaW4gY2FzZSBwYWRkaW5nIGlzIG5lZWRlZCBmb3IgdGhlIHV1ZW5jb2RpbmcuCi0gICAgICovCi0gICAgeFtrKytdID0gJ1wwJzsKLSAgICB4W2srK10gPSAnXDAnOwotICAgIAotICAgIC8qIGFsbG9jIHN0ciBhbmQgZG8gdGhlIHV1ZW5jb2RpbmcgKi8KLSAgICBzdHIgPSAoY2hhciAqKWFwX3BhbGxvYyhyLT5wb29sLCB1bmlxdWVfaWRfcmVjX3NpemVfdXUgKyAxKTsKLSAgICBrID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgdW5pcXVlX2lkX3JlY190b3RhbF9zaXplOyBpICs9IDMpIHsKLSAgICAgICAgeSA9IHggKyBpOwotICAgICAgICBzdHJbaysrXSA9IHV1ZW5jb2Rlclt5WzBdID4+IDJdOwotICAgICAgICBzdHJbaysrXSA9IHV1ZW5jb2RlclsoKHlbMF0gJiAweDAzKSA8PCA0KSB8ICgoeVsxXSAmIDB4ZjApID4+IDQpXTsKLSAgICAgICAgaWYgKGsgPT0gdW5pcXVlX2lkX3JlY19zaXplX3V1KSBicmVhazsKLSAgICAgICAgc3RyW2srK10gPSB1dWVuY29kZXJbKCh5WzFdICYgMHgwZikgPDwgMikgfCAoKHlbMl0gJiAweGMwKSA+PiA2KV07Ci0gICAgICAgIGlmIChrID09IHVuaXF1ZV9pZF9yZWNfc2l6ZV91dSkgYnJlYWs7Ci0gICAgICAgIHN0cltrKytdID0gdXVlbmNvZGVyW3lbMl0gJiAweDNmXTsKLSAgICB9Ci0gICAgc3RyW2srK10gPSAnXDAnOwotCi0gICAgLyogc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLwotICAgIGFwX3RhYmxlX3NldG4oci0+c3VicHJvY2Vzc19lbnYsICJVTklRVUVfSUQiLCBzdHIpOwotCi0gICAgLyogYW5kIGluY3JlbWVudCB0aGUgaWRlbnRpZmllciBmb3IgdGhlIG5leHQgY2FsbCAqLwotCi0gICAgY291bnRlciA9IG50b2hzKG5ld191bmlxdWVfaWQuY291bnRlcikgKyAxOwotICAgIGN1cl91bmlxdWVfaWQuY291bnRlciA9IGh0b25zKGNvdW50ZXIpOwotCi0gICAgcmV0dXJuIERFQ0xJTkVEOwotfQotCi1zdGF0aWMgdm9pZCByZWdpc3Rlcl9ob29rcyh2b2lkKQotewotICAgIGFwX2hvb2tfcG9zdF9jb25maWcodW5pcXVlX2lkX2dsb2JhbF9pbml0LCBOVUxMLCBOVUxMLCBIT09LX01JRERMRSk7Ci0gICAgYXBfaG9va19jaGlsZF9pbml0KHVuaXF1ZV9pZF9jaGlsZF9pbml0LCBOVUxMLCBOVUxMLCBIT09LX01JRERMRSk7Ci0gICAgYXBfaG9va19wb3N0X3JlYWRfcmVxdWVzdChnZW5fdW5pcXVlX2lkLCBOVUxMLCBOVUxMLCBIT09LX01JRERMRSk7IAotfQotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgdW5pcXVlX2lkX21vZHVsZSA9IHsKLSAgICBTVEFOREFSRDIwX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogZGlyIGNvbmZpZyBjcmVhdGVyICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpciBtZXJnZXIgLS0tIGRlZmF1bHQgaXMgdG8gb3ZlcnJpZGUgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogc2VydmVyIGNvbmZpZyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBzZXJ2ZXIgY29uZmlncyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21tYW5kIGFwX3RhYmxlX3QgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogaGFuZGxlcnMgKi8KLSAgICByZWdpc3Rlcl9ob29rcyAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgaG9va3MgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL21ldGFkYXRhL21vZF91bmlxdWVfaWQuZXhwIGIvbW9kdWxlcy9tZXRhZGF0YS9tb2RfdW5pcXVlX2lkLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMwMDBmMS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL21vZF91bmlxdWVfaWQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdW5pcXVlX2lkX21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfdXNlcnRyYWNrLmMgYi9tb2R1bGVzL21ldGFkYXRhL21vZF91c2VydHJhY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIyYzczMS4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL21vZF91c2VydHJhY2suYworKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyogVXNlciBUcmFja2luZyBNb2R1bGUgKFdhcyBtb2RfY29va2llcy5jKQotICoKLSAqIFRoaXMgQXBhY2hlIG1vZHVsZSBpcyBkZXNpZ25lZCB0byB0cmFjayB1c2VycyBwYXRocyB0aHJvdWdoIGEgc2l0ZS4KLSAqIEl0IHVzZXMgdGhlIGNsaWVudC1zaWRlIHN0YXRlICgiQ29va2llIikgcHJvdG9jb2wgZGV2ZWxvcGVkIGJ5IE5ldHNjYXBlLgotICogSXQgaXMga25vd24gdG8gd29yayBvbiBOZXRzY2FwZSBicm93c2VycywgTWljcm9zb2Z0IEludGVybmV0Ci0gKiBFeHBsb3JlciBhbmQgb3RoZXJzIGN1cnJlbnRseSBiZWluZyBkZXZlbG9wZWQuCi0gKgotICogRWFjaCB0aW1lIGEgcGFnZSBpcyByZXF1ZXN0ZWQgd2UgbG9vayB0byBzZWUgaWYgdGhlIGJyb3dzZXIgaXMgc2VuZGluZwotICogdXMgYSBDb29raWU6IGhlYWRlciB0aGF0IHdlIHByZXZpb3VzbHkgZ2VuZXJhdGVkLgotICoKLSAqIElmIHdlIGRvbid0IGZpbmQgb25lIHRoZW4gdGhlIHVzZXIgaGFzbid0IGJlZW4gdG8gdGhpcyBzaXRlIHNpbmNlCi0gKiBzdGFydGluZyB0aGVpciBicm93c2VyIG9yIHRoZWlyIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IGNvb2tpZXMuICBTbwotICogd2UgZ2VuZXJhdGUgYSB1bmlxdWUgQ29va2llIGZvciB0aGUgdHJhbnNhY3Rpb24gYW5kIHNlbmQgaXQgYmFjayB0bwotICogdGhlIGJyb3dzZXIgKHZpYSBhICJTZXQtQ29va2llIiBoZWFkZXIpCi0gKiBGdXR1cmUgcmVxdWVzdHMgZnJvbSB0aGUgc2FtZSBicm93c2VyIHNob3VsZCBrZWVwIHRoZSBzYW1lIENvb2tpZSBsaW5lLgotICoKLSAqIEJ5IG1hdGNoaW5nIHVwIGFsbCB0aGUgcmVxdWVzdHMgd2l0aCB0aGUgc2FtZSBjb29raWUgeW91IGNhbgotICogd29yayBvdXQgZXhhY3RseSB3aGF0IHBhdGggYSB1c2VyIHRvb2sgdGhyb3VnaCB5b3VyIHNpdGUuICBUbyBsb2cKLSAqIHRoZSBjb29raWUgdXNlIHRoZSAiICV7Q29va2llfW4gIiBkaXJlY3RpdmUgaW4gYSBjdXN0b20gYWNjZXNzIGxvZzsKLSAqCi0gKiBFeGFtcGxlIDEgOiBJZiB5b3UgY3VycmVudGx5IHVzZSB0aGUgc3RhbmRhcmQgTG9nIGZpbGUgZm9ybWF0IChDTEYpCi0gKiBhbmQgdXNlIHRoZSBjb21tYW5kICJUcmFuc2ZlckxvZyBzb21lZmlsZW5hbWUiLCBhZGQgdGhlIGxpbmUKLSAqICAgICAgIExvZ0Zvcm1hdCAiJWggJWwgJXUgJXQgXCIlclwiICVzICViICV7Q29va2llfW4iCi0gKiB0byB5b3VyIGNvbmZpZyBmaWxlLgotICoKLSAqIEV4YW1wbGUgMiA6IElmIHlvdSB1c2VkIHRvIHVzZSB0aGUgb2xkICJDb29raWVMb2ciIGRpcmVjdGl2ZSwgeW91Ci0gKiBjYW4gZW11bGF0ZSBpdCBieSBhZGRpbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kIHRvIHlvdXIgY29uZmlnIGZpbGUKLSAqICAgICAgIEN1c3RvbUxvZyBmaWxlbmFtZSAiJXtDb29raWV9biBcIiVyXCIgJXQiCi0gKgotICogTm90ZXM6Ci0gKiAxLiAgVGhpcyBjb2RlIG5vdyBsb2dzIHRoZSBpbml0aWFsIHRyYW5zYWN0aW9uICh0aGUgb25lIHRoYXQgY3JlYXRlZAotICogICAgIHRoZSBjb29raWUgdG8gc3RhcnQgd2l0aCkuCi0gKiAyLiAgVGhpcyBtb2R1bGUgaGFzIGJlZW4gZGVzaWduZWQgdG8gbm90IGludGVyZmVyZSB3aXRoIG90aGVyIENvb2tpZXMKLSAqICAgICB5b3VyIHNpdGUgbWF5IGJlIHVzaW5nOyBqdXN0IGF2b2lkIHNlbmRpbmcgb3V0IGNvb2tpZXMgd2l0aAotICogICAgIHRoZSBuYW1lICJBcGFjaGU9IiBvciB0aGluZ3Mgd2lsbCBnZXQgY29uZnVzZWQuCi0gKiAzLiAgSWYgeW91IHdhbnQgeW91IGNhbiBtb2RpZnkgdGhlIFNldC1Db29raWUgbGluZSBzbyB0aGF0IHRoZSBDb29raWUKLSAqICAgICBuZXZlciBleHBpcmVzLiAgWW91IHdvdWxkIHRoZW4gZ2V0IHRoZSBzYW1lIENvb2tpZSBlYWNoIHRpbWUgdGhlCi0gKiAgICAgdXNlciByZXZpc2l0cyB5b3VyIHNpdGUuCi0gKgotICogTWFyayBDb3gsIG1hcmtAdWt3ZWIuY29tLCA2IEp1bHkgOTUKLSAqCi0gKiBUaGlzIGZpbGUgcmVwbGFjZXMgbW9kX2Nvb2tpZXMuYwotICovCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCi0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCB1c2VydHJhY2tfbW9kdWxlOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50IGFsd2F5czsKLSAgICBpbnQgZXhwaXJlczsKLX0gY29va2llX2xvZ19zdGF0ZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCBlbmFibGVkOwotICAgIGNoYXIgKmNvb2tpZV9uYW1lOwotfSBjb29raWVfZGlyX3JlYzsKLQotLyogTWFrZSBDb29raWU6IE5vdyB3ZSBoYXZlIHRvIGdlbmVyYXRlIHNvbWV0aGluZyB0aGF0IGlzIGdvaW5nIHRvIGJlCi0gKiBwcmV0dHkgdW5pcXVlLiAgV2UgY2FuIGJhc2UgaXQgb24gdGhlIHBpZCwgdGltZSwgaG9zdGlwICovCi0KLSNkZWZpbmUgQ09PS0lFX05BTUUgIkFwYWNoZSIKLQotc3RhdGljIHZvaWQgbWFrZV9jb29raWUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY29va2llX2xvZ19zdGF0ZSAqY2xzID0gYXBfZ2V0X21vZHVsZV9jb25maWcoci0+c2VydmVyLT5tb2R1bGVfY29uZmlnLAotCQkJCQkJICZ1c2VydHJhY2tfbW9kdWxlKTsKLSAgICAvKiAxMDI0ID09IGhhcmRjb2RlZCBjb25zdGFudCAqLwotICAgIGNoYXIgY29va2llYnVmWzEwMjRdOwotICAgIGNoYXIgKm5ld19jb29raWU7Ci0gICAgY29uc3QgY2hhciAqcm5hbWUgPSBhcF9nZXRfcmVtb3RlX2hvc3Qoci0+Y29ubmVjdGlvbiwgci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJCSAgIFJFTU9URV9OQU1FKTsKLSAgICBjb29raWVfZGlyX3JlYyAqZGNmZzsKLQotICAgIGRjZmcgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywgJnVzZXJ0cmFja19tb2R1bGUpOwotCi0gICAgLyogWFhYOiBobW0sIHRoaXMgc2hvdWxkIHJlYWxseSB0aWUgaW4gd2l0aCBtb2RfdW5pcXVlX2lkICovCi0gICAgYXBfc25wcmludGYoY29va2llYnVmLCBzaXplb2YoY29va2llYnVmKSwgIiVzLiVxZCIsIHJuYW1lLCBhcF9ub3coKSk7Ci0KLSAgICBpZiAoY2xzLT5leHBpcmVzKSB7Ci0JYXBfZXhwbG9kZWRfdGltZV90IHRtczsKLQotCWFwX2V4cGxvZGVfZ210KCZ0bXMsIHItPnJlcXVlc3RfdGltZSArIGNscy0+ZXhwaXJlcyAqIEFQX1VTRUNfUEVSX1NFQyk7Ci0KLSAgICAgICAgLyogQ29va2llIHdpdGggZGF0ZTsgYXMgc3RyZnRpbWUgJyVhLCAlZC0laC0leSAlSDolTTolUyBHTVQnICovCi0gICAgICAgIG5ld19jb29raWUgPSBhcF9wc3ByaW50ZihyLT5wb29sLAotICAgICAgICAgICAgICAgICIlcz0lczsgcGF0aD0vOyBleHBpcmVzPSVzLCAlLjJkLSVzLSUuMmQgJS4yZDolLjJkOiUuMmQgR01UIiwKLSAgICAgICAgICAgICAgICAgICAgZGNmZy0+Y29va2llX25hbWUsIGNvb2tpZWJ1ZiwgYXBfZGF5X3NuYW1lc1t0bXMudG1fd2RheV0sCi0gICAgICAgICAgICAgICAgICAgIHRtcy50bV9tZGF5LCBhcF9tb250aF9zbmFtZXNbdG1zLnRtX21vbl0sCi0gICAgICAgICAgICAgICAgICAgIHRtcy50bV95ZWFyICUgMTAwLAotICAgICAgICAgICAgICAgICAgICB0bXMudG1faG91ciwgdG1zLnRtX21pbiwgdG1zLnRtX3NlYyk7Ci0gICAgfQotICAgIGVsc2UgewotCW5ld19jb29raWUgPSBhcF9wc3ByaW50ZihyLT5wb29sLCAiJXM9JXM7IHBhdGg9LyIsCi0JCQkJIGRjZmctPmNvb2tpZV9uYW1lLCBjb29raWVidWYpOwotICAgIH0KLQotICAgIGFwX3RhYmxlX3NldG4oci0+aGVhZGVyc19vdXQsICJTZXQtQ29va2llIiwgbmV3X2Nvb2tpZSk7Ci0gICAgYXBfdGFibGVfc2V0bihyLT5ub3RlcywgImNvb2tpZSIsIGFwX3BzdHJkdXAoci0+cG9vbCwgY29va2llYnVmKSk7ICAgLyogbG9nIGZpcnN0IHRpbWUgKi8KLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQgc3BvdF9jb29raWUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY29va2llX2Rpcl9yZWMgKmRjZmcgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhyLT5wZXJfZGlyX2NvbmZpZywKLQkJCQkJCSZ1c2VydHJhY2tfbW9kdWxlKTsKLSAgICBjb25zdCBjaGFyICpjb29raWU7Ci0gICAgY2hhciAqdmFsdWU7Ci0KLSAgICBpZiAoIWRjZmctPmVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuIERFQ0xJTkVEOwotICAgIH0KLQotICAgIGlmICgoY29va2llID0gYXBfdGFibGVfZ2V0KHItPmhlYWRlcnNfaW4sICJDb29raWUiKSkpCi0gICAgICAgIGlmICgodmFsdWUgPSBzdHJzdHIoY29va2llLCBkY2ZnLT5jb29raWVfbmFtZSkpKSB7Ci0gICAgICAgICAgICBjaGFyICpjb29raWVidWYsICpjb29raWVlbmQ7Ci0KLSAgICAgICAgICAgIHZhbHVlICs9IHN0cmxlbihkY2ZnLT5jb29raWVfbmFtZSkgKyAxOyAgLyogU2tpcCBvdmVyIHRoZSAnPScgKi8KLSAgICAgICAgICAgIGNvb2tpZWJ1ZiA9IGFwX3BzdHJkdXAoci0+cG9vbCwgdmFsdWUpOwotICAgICAgICAgICAgY29va2llZW5kID0gc3RyY2hyKGNvb2tpZWJ1ZiwgJzsnKTsKLSAgICAgICAgICAgIGlmIChjb29raWVlbmQpCi0gICAgICAgICAgICAgICAgKmNvb2tpZWVuZCA9ICdcMCc7ICAgICAgLyogSWdub3JlIGFueXRoaW5nIGFmdGVyIGEgOyAqLwotCi0gICAgICAgICAgICAvKiBTZXQgdGhlIGNvb2tpZSBpbiBhIG5vdGUsIGZvciBsb2dnaW5nICovCi0gICAgICAgICAgICBhcF90YWJsZV9zZXRuKHItPm5vdGVzLCAiY29va2llIiwgY29va2llYnVmKTsKLQotICAgICAgICAgICAgcmV0dXJuIERFQ0xJTkVEOyAgICAvKiBUaGVyZSdzIGFscmVhZHkgYSBjb29raWUsIG5vIG5ldyBvbmUgKi8KLSAgICAgICAgfQotICAgIG1ha2VfY29va2llKHIpOwotICAgIHJldHVybiBPSzsgICAgICAgICAgICAgICAgICAvKiBXZSBzZXQgb3VyIGNvb2tpZSAqLwotfQotCi1zdGF0aWMgdm9pZCAqbWFrZV9jb29raWVfbG9nX3N0YXRlKGFwX2NvbnRleHRfdCAqcCwgc2VydmVyX3JlYyAqcykKLXsKLSAgICBjb29raWVfbG9nX3N0YXRlICpjbHMgPQotICAgIChjb29raWVfbG9nX3N0YXRlICopIGFwX3BhbGxvYyhwLCBzaXplb2YoY29va2llX2xvZ19zdGF0ZSkpOwotCi0gICAgY2xzLT5leHBpcmVzID0gMDsKLQotICAgIHJldHVybiAodm9pZCAqKSBjbHM7Ci19Ci0KLXN0YXRpYyB2b2lkICptYWtlX2Nvb2tpZV9kaXIoYXBfY29udGV4dF90ICpwLCBjaGFyICpkKQotewotICAgIGNvb2tpZV9kaXJfcmVjICpkY2ZnOwotCi0gICAgZGNmZyA9IChjb29raWVfZGlyX3JlYyAqKSBhcF9wY2FsbG9jKHAsIHNpemVvZihjb29raWVfZGlyX3JlYykpOwotICAgIGRjZmctPmNvb2tpZV9uYW1lID0gQ09PS0lFX05BTUU7Ci0gICAgZGNmZy0+ZW5hYmxlZCA9IDA7Ci0gICAgcmV0dXJuIGRjZmc7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfY29va2llX2VuYWJsZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqbWNvbmZpZywgaW50IGFyZykKLXsKLSAgICBjb29raWVfZGlyX3JlYyAqZGNmZyA9IG1jb25maWc7Ci0KLSAgICBkY2ZnLT5lbmFibGVkID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2Nvb2tpZV9leHAoY21kX3Bhcm1zICpwYXJtcywgdm9pZCAqZHVtbXksIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBjb29raWVfbG9nX3N0YXRlICpjbHMgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhwYXJtcy0+c2VydmVyLT5tb2R1bGVfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VydHJhY2tfbW9kdWxlKTsKLSAgICB0aW1lX3QgZmFjdG9yLCBtb2RpZmllciA9IDA7Ci0gICAgdGltZV90IG51bSA9IDA7Ci0gICAgY2hhciAqd29yZDsKLQotICAgIC8qIFRoZSBzaW1wbGUgY2FzZSBmaXJzdCAtIGFsbCBudW1iZXJzICh3ZSBhc3N1bWUpICovCi0gICAgaWYgKGFwX2lzZGlnaXQoYXJnWzBdKSAmJiBhcF9pc2RpZ2l0KGFyZ1tzdHJsZW4oYXJnKSAtIDFdKSkgewotICAgICAgICBjbHMtPmV4cGlyZXMgPSBhdG9sKGFyZyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVGhlIGhhcmRlciBjYXNlIC0gc3RvbGVuIGZyb20gbW9kX2V4cGlyZXMgCi0gICAgICoKLSAgICAgKiBDb29raWVFeHBpcmVzICJbcGx1c10gezxudW0+IDx0eXBlPn0qIgotICAgICAqLwotCi0gICAgd29yZCA9IGFwX2dldHdvcmRfY29uZihwYXJtcy0+cG9vbCwgJmFyZyk7Ci0gICAgaWYgKCFzdHJuY2FzZWNtcCh3b3JkLCAicGx1cyIsIDEpKSB7Ci0gICAgICAgIHdvcmQgPSBhcF9nZXR3b3JkX2NvbmYocGFybXMtPnBvb2wsICZhcmcpOwotICAgIH07Ci0KLSAgICAvKiB7PG51bT4gPHR5cGU+fSogKi8KLSAgICB3aGlsZSAod29yZFswXSkgewotICAgICAgICAvKiA8bnVtPiAqLwotCWlmIChhcF9pc2RpZ2l0KHdvcmRbMF0pKQotICAgICAgICAgICAgbnVtID0gYXRvaSh3b3JkKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuICJiYWQgZXhwaXJlcyBjb2RlLCBudW1lcmljIHZhbHVlIGV4cGVjdGVkLiI7Ci0KLSAgICAgICAgLyogPHR5cGU+ICovCi0gICAgICAgIHdvcmQgPSBhcF9nZXR3b3JkX2NvbmYocGFybXMtPnBvb2wsICZhcmcpOwotICAgICAgICBpZiAoIXdvcmRbMF0pCi0gICAgICAgICAgICByZXR1cm4gImJhZCBleHBpcmVzIGNvZGUsIG1pc3NpbmcgPHR5cGU+IjsKLQotICAgICAgICBmYWN0b3IgPSAwOwotICAgICAgICBpZiAoIXN0cm5jYXNlY21wKHdvcmQsICJ5ZWFycyIsIDEpKQotICAgICAgICAgICAgZmFjdG9yID0gNjAgKiA2MCAqIDI0ICogMzY1OwotICAgICAgICBlbHNlIGlmICghc3RybmNhc2VjbXAod29yZCwgIm1vbnRocyIsIDIpKQotICAgICAgICAgICAgZmFjdG9yID0gNjAgKiA2MCAqIDI0ICogMzA7Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCh3b3JkLCAid2Vla3MiLCAxKSkKLSAgICAgICAgICAgIGZhY3RvciA9IDYwICogNjAgKiAyNCAqIDc7Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCh3b3JkLCAiZGF5cyIsIDEpKQotICAgICAgICAgICAgZmFjdG9yID0gNjAgKiA2MCAqIDI0OwotICAgICAgICBlbHNlIGlmICghc3RybmNhc2VjbXAod29yZCwgImhvdXJzIiwgMSkpCi0gICAgICAgICAgICBmYWN0b3IgPSA2MCAqIDYwOwotICAgICAgICBlbHNlIGlmICghc3RybmNhc2VjbXAod29yZCwgIm1pbnV0ZXMiLCAyKSkKLSAgICAgICAgICAgIGZhY3RvciA9IDYwOwotICAgICAgICBlbHNlIGlmICghc3RybmNhc2VjbXAod29yZCwgInNlY29uZHMiLCAxKSkKLSAgICAgICAgICAgIGZhY3RvciA9IDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiAiYmFkIGV4cGlyZXMgY29kZSwgdW5yZWNvZ25pemVkIHR5cGUiOwotCi0gICAgICAgIG1vZGlmaWVyID0gbW9kaWZpZXIgKyBmYWN0b3IgKiBudW07Ci0KLSAgICAgICAgLyogbmV4dCA8bnVtPiAqLwotICAgICAgICB3b3JkID0gYXBfZ2V0d29yZF9jb25mKHBhcm1zLT5wb29sLCAmYXJnKTsKLSAgICB9Ci0KLSAgICBjbHMtPmV4cGlyZXMgPSBtb2RpZmllcjsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2Nvb2tpZV9uYW1lKGNtZF9wYXJtcyAqY21kLCB2b2lkICptY29uZmlnLCBjaGFyICpuYW1lKQotewotICAgIGNvb2tpZV9kaXJfcmVjICpkY2ZnID0gKGNvb2tpZV9kaXJfcmVjICopIG1jb25maWc7Ci0KLSAgICBkY2ZnLT5jb29raWVfbmFtZSA9IGFwX3BzdHJkdXAoY21kLT5wb29sLCBuYW1lKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIGNvb2tpZV9sb2dfY21kc1tdID0gewotICAgIHsiQ29va2llRXhwaXJlcyIsIHNldF9jb29raWVfZXhwLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAgICAiYW4gZXhwaXJ5IGRhdGUgY29kZSJ9LAotICAgIHsiQ29va2llVHJhY2tpbmciLCBzZXRfY29va2llX2VuYWJsZSwgTlVMTCwgT1JfRklMRUlORk8sIEZMQUcsCi0gICAgICJ3aGV0aGVyIG9yIG5vdCB0byBlbmFibGUgY29va2llcyJ9LAotICAgIHsiQ29va2llTmFtZSIsIHNldF9jb29raWVfbmFtZSwgTlVMTCwgT1JfRklMRUlORk8sIFRBS0UxLAotICAgICAibmFtZSBvZiB0aGUgdHJhY2tpbmcgY29va2llIn0sCi0gICAge05VTEx9Ci19Owotc3RhdGljIHZvaWQgcmVnaXN0ZXJfaG9va3Modm9pZCkKLXsKLSAgICBhcF9ob29rX2ZpeHVwcyhzcG90X2Nvb2tpZSxOVUxMLE5VTEwsSE9PS19NSURETEUpOwotfQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIHVzZXJ0cmFja19tb2R1bGUgPSB7Ci0gICAgU1RBTkRBUkQyMF9NT0RVTEVfU1RVRkYsCi0gICAgbWFrZV9jb29raWVfZGlyLCAgICAgICAgICAgIC8qIGRpciBjb25maWcgY3JlYXRlciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXIgbWVyZ2VyIC0tLSBkZWZhdWx0IGlzIHRvIG92ZXJyaWRlICovCi0gICAgbWFrZV9jb29raWVfbG9nX3N0YXRlLCAgICAgIC8qIHNlcnZlciBjb25maWcgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogbWVyZ2Ugc2VydmVyIGNvbmZpZ3MgKi8KLSAgICBjb29raWVfbG9nX2NtZHMsICAgICAgICAgICAgLyogY29tbWFuZCBhcF90YWJsZV90ICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGhhbmRsZXJzICovCi0gICAgcmVnaXN0ZXJfaG9va3MJCS8qIHJlZ2lzdGVyIGhvb2tzICovCi19OwpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfdXNlcnRyYWNrLmRzcCBiL21vZHVsZXMvbWV0YWRhdGEvbW9kX3VzZXJ0cmFjay5kc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYWVlNTUuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9tZXRhZGF0YS9tb2RfdXNlcnRyYWNrLmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9IkFwYWNoZU1vZHVsZVVzZXJUcmFjayIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNS4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyCi0KLUNGRz1BcGFjaGVNb2R1bGVVc2VyVHJhY2sgLSBXaW4zMiBSZWxlYXNlCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIkFwYWNoZU1vZHVsZVVzZXJUcmFjay5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgIkFwYWNoZU1vZHVsZVVzZXJUcmFjay5tYWsiXAotIENGRz0iQXBhY2hlTW9kdWxlVXNlclRyYWNrIC0gV2luMzIgUmVsZWFzZSIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJBcGFjaGVNb2R1bGVVc2VyVHJhY2sgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICJBcGFjaGVNb2R1bGVVc2VyVHJhY2sgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotTVRMPW1pZGwuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIkFwYWNoZU1vZHVsZVVzZXJUcmFjayAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICIuXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXFJlbGVhc2UiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiLlxBcGFjaGVNb2R1bGVVc2VyVHJhY2tSIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi5cQXBhY2hlTW9kdWxlVXNlclRyYWNrUiIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVQgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EIC9XMyAvR1ggL08yIC9JICIuLlwuLlxpbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIlNIQVJFRF9NT0RVTEUiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIC4uXC4uXENvcmVSXEFwYWNoZUNvcmUubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9tYWNoaW5lOkkzODYKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gIkFwYWNoZU1vZHVsZVVzZXJUcmFjayAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxEZWJ1ZyIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIi5cRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiLlxBcGFjaGVNb2R1bGVVc2VyVHJhY2tEIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi5cQXBhY2hlTW9kdWxlVXNlclRyYWNrRCIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9JICIuLlwuLlxpbmNsdWRlIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfV0lORE9XUyIgL0QgIlNIQVJFRF9NT0RVTEUiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiAuLlwuLlxDb3JlRFxBcGFjaGVDb3JlLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NgotCi0hRU5ESUYgCi0KLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAiQXBhY2hlTW9kdWxlVXNlclRyYWNrIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAiQXBhY2hlTW9kdWxlVXNlclRyYWNrIC0gV2luMzIgRGVidWciCi0jIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtocGo7YmF0O2ZvcjtmOTAiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlwuLlxtb2R1bGVzXHN0YW5kYXJkXG1vZF91c2VydHJhY2suYwotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubDtmaTtmZCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5ccmVhZGRpci5oCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgQmVnaW4gR3JvdXAgIlJlc291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtjbnQ7cnRmO2dpZjtqcGc7anBlZztqcGUiCi0jIEVuZCBHcm91cAotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9tb2R1bGVzL21ldGFkYXRhL21vZF91c2VydHJhY2suZXhwIGIvbW9kdWxlcy9tZXRhZGF0YS9tb2RfdXNlcnRyYWNrLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0YTVmNy4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL21ldGFkYXRhL21vZF91c2VydHJhY2suZXhwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdXNlcnRyYWNrX21vZHVsZQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9wcm94eS8uY3ZzaWdub3JlIGIvbW9kdWxlcy9wcm94eS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGViN2E5Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvcHJveHkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLURlYnVnCi1SZWxlYXNlCi1BcGFjaGVNb2R1bGVQcm94eS5kc3cKLUFwYWNoZU1vZHVsZVByb3h5Lm1kcAotQXBhY2hlTW9kdWxlUHJveHkubmNiCi1BcGFjaGVNb2R1bGVQcm94eS5vcHQKLUFwYWNoZU1vZHVsZVByb3h5LnBsZwotTWFrZWZpbGUKLSoubG8KLSouc28KLSouZGxsCi0qLmRlZgpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9wcm94eS8uaW5kZW50LnBybyBiL21vZHVsZXMvcHJveHkvLmluZGVudC5wcm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYzJkODMuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9wcm94eS8uaW5kZW50LnBybworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS1pNCAtbnBzbCAtZGkwIC1iciAtbmNlIC1kMCAtY2xpMCAtbnBjcyAtbmZjMQotLVRCVUZGCi0tVEZJTEUKLS1UVFJBTlMKLS1UVUlOVDQKLS1UX3RyYW5zCi0tVGFsbG93X29wdGlvbnNfdAotLVRhcGFjaGVfc2ZpbwotLVRhcnJheV9oZWFkZXIKLS1UYm9vbF9pbnQKLS1UYnVmX2FyZWEKLS1UYnVmZl9zdHJ1Y3QKLS1UYnVmZnkKLS1UY21kX2hvdwotLVRjbWRfcGFybXMKLS1UY29tbWFuZF9yZWMKLS1UY29tbWFuZF9zdHJ1Y3QKLS1UY29ubl9yZWMKLS1UY29yZV9kaXJfY29uZmlnCi0tVGNvcmVfc2VydmVyX2NvbmZpZwotLVRkaXJfbWFrZXJfZnVuYwotLVRldmVudAotLVRnbG9iYWxzX3MKLS1UaGFuZGxlcl9mdW5jCi0tVGhhbmRsZXJfcmVjCi0tVGpvYmxpc3RfcwotLVRsaXN0ZW5fcmVjCi0tVG1lcmdlcl9mdW5jCi0tVG1vZGVfdAotLVRtb2R1bGUKLS1UbW9kdWxlX3N0cnVjdAotLVRtdXRleAotLVRuX2xvbmcKLS1Ub3RoZXJfY2hpbGRfcmVjCi0tVG92ZXJyaWRlc190Ci0tVHBhcmVudF9zY29yZQotLVRwaWRfdAotLVRwaXBlZF9sb2cKLS1UcG9vbAotLVRyZXF1ZXN0X3JlYwotLVRyZXF1aXJlX2xpbmUKLS1UcmxpbV90Ci0tVHNjb3JlYm9hcmQKLS1Uc2VtYXBob3JlCi0tVHNlcnZlcl9hZGRyX3JlYwotLVRzZXJ2ZXJfcmVjCi0tVHNlcnZlcl9yZWNfY2hhaW4KLS1Uc2hvcnRfc2NvcmUKLS1UdGFibGUKLS1UdGFibGVfZW50cnkKLS1UdGhyZWFkCi0tVHVfd2lkZV9pbnQKLS1UdnRpbWVfdAotLVR3aWRlX2ludAotLVRwcm94eV9zZXJ2ZXJfY29uZgpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9wcm94eS9NYWtlZmlsZS5saWJkaXIgYi9tb2R1bGVzL3Byb3h5L01ha2VmaWxlLmxpYmRpcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1MjU0MC4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3Byb3h5L01ha2VmaWxlLmxpYmRpcgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVGhpcyBpcyBhIHBsYWNlLWhvbGRlciB3aGljaCBpbmRpY2F0ZXMgdG8gQ29uZmlndXJlIHRoYXQgaXQgc2hvdWxkbid0Ci1wcm92aWRlIHRoZSBkZWZhdWx0IHRhcmdldHMgd2hlbiBidWlsZGluZyB0aGUgTWFrZWZpbGUgaW4gdGhpcyBkaXJlY3RvcnkuCi1JbnN0ZWFkIGl0J2xsIGp1c3QgcHJlcGVuZCBhbGwgdGhlIGltcG9ydGFudCB2YXJpYWJsZSBkZWZpbml0aW9ucywgYW5kCi1jb3B5IHRoZSBNYWtlZmlsZS50bXBsIG9udG8gdGhlIGVuZC4KZGlmZiAtLWdpdCBhL21vZHVsZXMvcHJveHkvbGlicHJveHkuZXhwIGIvbW9kdWxlcy9wcm94eS9saWJwcm94eS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMGYyMzcuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9wcm94eS9saWJwcm94eS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1wcm94eV9tb2R1bGUKZGlmZiAtLWdpdCBhL21vZHVsZXMvcHJveHkvbW9kX3Byb3h5LmMgYi9tb2R1bGVzL3Byb3h5L21vZF9wcm94eS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjNhMmE2Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvcHJveHkvbW9kX3Byb3h5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MDMgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaW5jbHVkZSAibW9kX3Byb3h5LmgiCi0KLSNkZWZpbmUgQ09SRV9QUklWQVRFCi0KLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfdmhvc3QuaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLQotLyogU29tZSBXV1cgc2NoZW1lcyBhbmQgdGhlaXIgZGVmYXVsdCBwb3J0czsgdGhpcyBpcyBiYXNpY2FsbHkgL2V0Yy9zZXJ2aWNlcyAqLwotLyogVGhpcyB3aWxsIGJlY29tZSBnbG9iYWwgd2hlbiB0aGUgcHJvdG9jb2wgYWJzdHJhY3Rpb24gY29tZXMgKi8KLXN0YXRpYyBzdHJ1Y3QgcHJveHlfc2VydmljZXMgZGVmcG9ydHNbXSA9Ci17Ci0gICAgeyJodHRwIiwgREVGQVVMVF9IVFRQX1BPUlR9LAotICAgIHsiZnRwIiwgREVGQVVMVF9GVFBfUE9SVH0sCi0gICAgeyJodHRwcyIsIERFRkFVTFRfSFRUUFNfUE9SVH0sCi0gICAgeyJnb3BoZXIiLCBERUZBVUxUX0dPUEhFUl9QT1JUfSwKLSAgICB7Im5udHAiLCBERUZBVUxUX05OVFBfUE9SVH0sCi0gICAgeyJ3YWlzIiwgREVGQVVMVF9XQUlTX1BPUlR9LAotICAgIHsic25ld3MiLCBERUZBVUxUX1NORVdTX1BPUlR9LAotICAgIHsicHJvc3Blcm8iLCBERUZBVUxUX1BST1NQRVJPX1BPUlR9LAotICAgIHtOVUxMLCAtMX0JCQkvKiB1bmtub3duIHBvcnQgKi8KLX07Ci0KLS8qCi0gKiBBIFdlYiBwcm94eSBtb2R1bGUuIFN0YWdlczoKLSAqCi0gKiAgdHJhbnNsYXRlX25hbWU6IHNldCBmaWxlbmFtZSB0byBwcm94eTo8VVJMPgotICogIHR5cGVfY2hlY2tlcjogICBzZXQgdHlwZSB0byBQUk9YWV9NQUdJQ19UWVBFIGlmIGZpbGVuYW1lIGJlZ2lucyBwcm94eToKLSAqICBmaXhfdXBzOiAgICAgICAgY29udmVydCB0aGUgVVJMIHN0b3JlZCBpbiB0aGUgZmlsZW5hbWUgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgIGNhbm9uaWNhbCBmb3JtLgotICogIGhhbmRsZXI6ICAgICAgICBoYW5kbGUgcHJveHkgcmVxdWVzdHMKLSAqLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogVHJhbnNsYXRlIHRoZSBVUkwgaW50byBhICdmaWxlbmFtZScgKi8KLQotc3RhdGljIGludCBhbGlhc19tYXRjaChjb25zdCBjaGFyICp1cmksIGNvbnN0IGNoYXIgKmFsaWFzX2Zha2VuYW1lKQotewotICAgIGNvbnN0IGNoYXIgKmVuZF9mYWtlbmFtZSA9IGFsaWFzX2Zha2VuYW1lICsgc3RybGVuKGFsaWFzX2Zha2VuYW1lKTsKLSAgICBjb25zdCBjaGFyICphbGlhc3AgPSBhbGlhc19mYWtlbmFtZSwgKnVyaXAgPSB1cmk7Ci0KLSAgICB3aGlsZSAoYWxpYXNwIDwgZW5kX2Zha2VuYW1lKSB7Ci0JaWYgKCphbGlhc3AgPT0gJy8nKSB7Ci0JICAgIC8qIGFueSBudW1iZXIgb2YgJy8nIGluIHRoZSBhbGlhcyBtYXRjaGVzIGFueSBudW1iZXIgaW4KLQkgICAgICogdGhlIHN1cHBsaWVkIFVSSSwgYnV0IHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lLi4uCi0JICAgICAqLwotCSAgICBpZiAoKnVyaXAgIT0gJy8nKQotCQlyZXR1cm4gMDsKLQotCSAgICB3aGlsZSAoKmFsaWFzcCA9PSAnLycpCi0JCSsrYWxpYXNwOwotCSAgICB3aGlsZSAoKnVyaXAgPT0gJy8nKQotCQkrK3VyaXA7Ci0JfQotCWVsc2UgewotCSAgICAvKiBPdGhlciBjaGFyYWN0ZXJzIGFyZSBjb21wYXJlZCBsaXRlcmFsbHkgKi8KLQkgICAgaWYgKCp1cmlwKysgIT0gKmFsaWFzcCsrKQotCQlyZXR1cm4gMDsKLQl9Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgbGFzdCBhbGlhcyBwYXRoIGNvbXBvbmVudCBtYXRjaGVkIGFsbCB0aGUgd2F5ICovCi0KLSAgICBpZiAoYWxpYXNwWy0xXSAhPSAnLycgJiYgKnVyaXAgIT0gJ1wwJyAmJiAqdXJpcCAhPSAnLycpCi0JcmV0dXJuIDA7Ci0KLSAgICAvKiBSZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSBVUkkgd2hpY2ggbWF0Y2hlZCAobWF5IGJlCi0gICAgICogZ3JlYXRlciB0aGFuIGxlbmd0aCBvZiBhbGlhcywgc2luY2Ugd2UgbWF5IGhhdmUgbWF0Y2hlZAotICAgICAqIGRvdWJsZWQgc2xhc2hlcykKLSAgICAgKi8KLQotICAgIHJldHVybiB1cmlwIC0gdXJpOwotfQotCi0vKiBEZXRlY3QgaWYgYW4gYWJzb2x1dGVVUkkgc2hvdWxkIGJlIHByb3hpZWQgb3Igbm90LiAgTm90ZSB0aGF0IHdlCi0gKiBoYXZlIHRvIGRvIHRoaXMgZHVyaW5nIHRoaXMgcGhhc2UgYmVjYXVzZSBsYXRlciBwaGFzZXMgYXJlCi0gKiAic2hvcnQtY2lyY3VpdGluZyIuLi4gaS5lLiB0cmFuc2xhdGVfbmFtZXMgd2lsbCBlbmQgd2hlbiB0aGUgZmlyc3QKLSAqIG1vZHVsZSByZXR1cm5zIE9LLiAgU28gZm9yIGV4YW1wbGUsIGlmIHRoZSByZXF1ZXN0IGlzIHNvbWV0aGluZyBsaWtlOgotICoKLSAqIEdFVCBodHRwOi8vb3RoZXJ2aG9zdC9jZ2ktYmluL3ByaW50ZW52IEhUVFAvMS4wCi0gKgotICogbW9kX2FsaWFzIHdpbGwgbm90aWNlIHRoZSAvY2dpLWJpbiBwYXJ0IGFuZCBTY3JpcHRBbGlhcyBpdCBhbmQKLSAqIHNob3J0LWNpcmN1aXQgdGhlIHByb3h5Li4uIGp1c3QgYmVjYXVzZSBvZiB0aGUgb3JkZXJpbmcgaW4gdGhlCi0gKiBjb25maWd1cmF0aW9uIGZpbGUuCi0gKi8KLXN0YXRpYyBpbnQgcHJveHlfZGV0ZWN0KHJlcXVlc3RfcmVjICpyKQotewotICAgIHZvaWQgKnNjb25mID0gci0+c2VydmVyLT5tb2R1bGVfY29uZmlnOwotICAgIHByb3h5X3NlcnZlcl9jb25mICpjb25mOwotCi0gICAgY29uZiA9IChwcm94eV9zZXJ2ZXJfY29uZiAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzY29uZiwgJnByb3h5X21vZHVsZSk7Ci0KLSAgICBpZiAoY29uZi0+cmVxICYmIHItPnBhcnNlZF91cmkuc2NoZW1lKSB7Ci0JLyogYnV0IGl0IG1pZ2h0IGJlIHNvbWV0aGluZyB2aG9zdGVkICovCi0gICAgICAgaWYgKCEoci0+cGFyc2VkX3VyaS5ob3N0bmFtZQotCSAgICAmJiAhc3RyY2FzZWNtcChyLT5wYXJzZWRfdXJpLnNjaGVtZSwgYXBfaHR0cF9tZXRob2QocikpCi0JICAgICYmIGFwX21hdGNoZXNfcmVxdWVzdF92aG9zdChyLCByLT5wYXJzZWRfdXJpLmhvc3RuYW1lLAotICAgICAgICAgICAgICAgci0+cGFyc2VkX3VyaS5wb3J0X3N0ciA/IHItPnBhcnNlZF91cmkucG9ydCA6IGFwX2RlZmF1bHRfcG9ydChyKSkpKSB7Ci0JICAgIHItPnByb3h5cmVxID0gMTsKLQkgICAgci0+dXJpID0gci0+dW5wYXJzZWRfdXJpOwotCSAgICByLT5maWxlbmFtZSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgInByb3h5OiIsIHItPnVyaSwgTlVMTCk7Ci0JICAgIHItPmhhbmRsZXIgPSAicHJveHktc2VydmVyIjsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBXZSBuZWVkIHNwZWNpYWwgdHJlYXRtZW50IGZvciBDT05ORUNUIHByb3h5aW5nOiBpdCBoYXMgbm8gc2NoZW1lIHBhcnQgKi8KLSAgICBlbHNlIGlmIChjb25mLT5yZXEgJiYgci0+bWV0aG9kX251bWJlciA9PSBNX0NPTk5FQ1QKLQkgICAgICYmIHItPnBhcnNlZF91cmkuaG9zdG5hbWUKLQkgICAgICYmIHItPnBhcnNlZF91cmkucG9ydF9zdHIpIHsKLQkgICAgci0+cHJveHlyZXEgPSAxOwotCSAgICByLT51cmkgPSByLT51bnBhcnNlZF91cmk7Ci0JICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCAicHJveHk6Iiwgci0+dXJpLCBOVUxMKTsKLQkgICAgci0+aGFuZGxlciA9ICJwcm94eS1zZXJ2ZXIiOwotICAgIH0KLSAgICByZXR1cm4gREVDTElORUQ7Ci19Ci0KLXN0YXRpYyBpbnQgcHJveHlfdHJhbnMocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgdm9pZCAqc2NvbmYgPSByLT5zZXJ2ZXItPm1vZHVsZV9jb25maWc7Ci0gICAgcHJveHlfc2VydmVyX2NvbmYgKmNvbmYgPQotICAgIChwcm94eV9zZXJ2ZXJfY29uZiAqKSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzY29uZiwgJnByb3h5X21vZHVsZSk7Ci0gICAgaW50IGksIGxlbjsKLSAgICBzdHJ1Y3QgcHJveHlfYWxpYXMgKmVudCA9IChzdHJ1Y3QgcHJveHlfYWxpYXMgKikgY29uZi0+YWxpYXNlcy0+ZWx0czsKLQotICAgIGlmIChyLT5wcm94eXJlcSkgewotCS8qIHNvbWVvbmUgaGFzIGFscmVhZHkgc2V0IHVwIHRoZSBwcm94eSwgaXQgd2FzIHBvc3NpYmx5IG91cnNlbHZlcwotCSAqIGluIHByb3h5X2RldGVjdAotCSAqLwotCXJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAvKiBYWFg6IHNpbmNlIHItPnVyaSBoYXMgYmVlbiBtYW5pcHVsYXRlZCBhbHJlYWR5IHdlJ3JlIG5vdCByZWFsbHkKLSAgICAgKiBjb21wbGlhbnQgd2l0aCBSRkMxOTQ1IGF0IHRoaXMgcG9pbnQuICBCdXQgdGhpcyBwcm9iYWJseSBpc24ndAotICAgICAqIGFuIGlzc3VlIGJlY2F1c2UgdGhpcyBpcyBhIGh5YnJpZCBwcm94eS9vcmlnaW4gc2VydmVyLgotICAgICAqLwotCi0gICAgZm9yIChpID0gMDsgaSA8IGNvbmYtPmFsaWFzZXMtPm5lbHRzOyBpKyspIHsKLSAgICAgICAgbGVuID0gYWxpYXNfbWF0Y2goci0+dXJpLCBlbnRbaV0uZmFrZSk7Ci0JICAgIAotICAgICAgIGlmIChsZW4gPiAwKSB7Ci0gICAgICAgICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCAicHJveHk6IiwgZW50W2ldLnJlYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT51cmkgKyBsZW4sIE5VTEwpOwotICAgICAgICAgICByLT5oYW5kbGVyID0gInByb3h5LXNlcnZlciI7Ci0gICAgICAgICAgIHItPnByb3h5cmVxID0gMTsKLSAgICAgICAgICAgcmV0dXJuIE9LOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIERFQ0xJTkVEOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogRml4dXAgdGhlIGZpbGVuYW1lICovCi0KLS8qCi0gKiBDYW5vbmljYWxpc2UgdGhlIFVSTAotICovCi1zdGF0aWMgaW50IHByb3h5X2ZpeHVwKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNoYXIgKnVybCwgKnA7Ci0KLSAgICBpZiAoIXItPnByb3h5cmVxIHx8IHN0cm5jbXAoci0+ZmlsZW5hbWUsICJwcm94eToiLCA2KSAhPSAwKQotCXJldHVybiBERUNMSU5FRDsKLQotICAgIHVybCA9ICZyLT5maWxlbmFtZVs2XTsKLQotLyogY2Fub25pY2FsaXNlIGVhY2ggc3BlY2lmaWMgc2NoZW1lICovCi0gICAgaWYgKHN0cm5jYXNlY21wKHVybCwgImh0dHA6IiwgNSkgPT0gMCkKLQlyZXR1cm4gYXBfcHJveHlfaHR0cF9jYW5vbihyLCB1cmwgKyA1LCAiaHR0cCIsIERFRkFVTFRfSFRUUF9QT1JUKTsKLSAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCh1cmwsICJmdHA6IiwgNCkgPT0gMCkKLQlyZXR1cm4gYXBfcHJveHlfZnRwX2Nhbm9uKHIsIHVybCArIDQpOwotCi0gICAgcCA9IHN0cmNocih1cmwsICc6Jyk7Ci0gICAgaWYgKHAgPT0gTlVMTCB8fCBwID09IHVybCkKLQlyZXR1cm4gSFRUUF9CQURfUkVRVUVTVDsKLQotICAgIHJldHVybiBPSzsJCS8qIG90aGVyd2lzZTsgd2UndmUgZG9uZSB0aGUgYmVzdCB3ZSBjYW4gKi8KLX0KLQotc3RhdGljIHZvaWQgcHJveHlfaW5pdChzZXJ2ZXJfcmVjICpyLCBhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgYXBfcHJveHlfZ2FyYmFnZV9pbml0KHIsIHApOwotfQotCi0KLQotLyogU2VuZCBhIHJlZGlyZWN0aW9uIGlmIHRoZSByZXF1ZXN0IGNvbnRhaW5zIGEgaG9zdG5hbWUgd2hpY2ggaXMgbm90ICovCi0vKiBmdWxseSBxdWFsaWZpZWQsIGkuZS4gZG9lc24ndCBoYXZlIGEgZG9tYWluIG5hbWUgYXBwZW5kZWQuIFNvbWUgcHJveHkgKi8KLS8qIHNlcnZlcnMgbGlrZSBOZXRzY2FwZSdzIGFsbG93IHRoaXMgYW5kIGFjY2VzcyBob3N0cyBmcm9tIHRoZSBsb2NhbCAqLwotLyogZG9tYWluIGluIHRoaXMgY2FzZS4gSSB0aGluayBpdCBpcyBiZXR0ZXIgdG8gcmVkaXJlY3QgdG8gYSBGUUROLCBzaW5jZSAqLwotLyogdGhlc2Ugd2lsbCBsYXRlciBiZSBmb3VuZCBpbiB0aGUgYm9va21hcmtzIGZpbGVzLiAqLwotLyogVGhlICJQcm94eURvbWFpbiIgZGlyZWN0aXZlIGRldGVybWluZXMgd2hhdCBkb21haW4gd2lsbCBiZSBhcHBlbmRlZCAqLwotc3RhdGljIGludCBwcm94eV9uZWVkc2RvbWFpbihyZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqdXJsLCBjb25zdCBjaGFyICpkb21haW4pCi17Ci0gICAgY2hhciAqbnVyaTsKLSAgICBjb25zdCBjaGFyICpyZWY7Ci0KLSAgICAvKiBXZSBvbmx5IHdhbnQgdG8gd29ycnkgYWJvdXQgR0VUcyAqLwotICAgIGlmICghci0+cHJveHlyZXEgfHwgci0+bWV0aG9kX251bWJlciAhPSBNX0dFVCB8fCAhci0+cGFyc2VkX3VyaS5ob3N0bmFtZSkKLQlyZXR1cm4gREVDTElORUQ7Ci0KLSAgICAvKiBJZiBob3N0IGRvZXMgY29udGFpbiBhIGRvdCBhbHJlYWR5LCBvciBpdCBpcyAibG9jYWxob3N0IiwgZGVjbGluZSAqLwotICAgIGlmIChzdHJjaHIoci0+cGFyc2VkX3VyaS5ob3N0bmFtZSwgJy4nKSAhPSBOVUxMCi0gICAgIHx8IHN0cmNhc2VjbXAoci0+cGFyc2VkX3VyaS5ob3N0bmFtZSwgImxvY2FsaG9zdCIpID09IDApCi0JcmV0dXJuIERFQ0xJTkVEOwkvKiBob3N0IG5hbWUgaGFzIGEgZG90IGFscmVhZHkgKi8KLQotICAgIHJlZiA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiUmVmZXJlciIpOwotCi0gICAgLyogUmVhc3NlbWJsZSB0aGUgcmVxdWVzdCwgYnV0IGluc2VydCB0aGUgZG9tYWluIGFmdGVyIHRoZSBob3N0IG5hbWUgKi8KLSAgICAvKiBOb3RlIHRoYXQgdGhlIGRvbWFpbiBuYW1lIGFsd2F5cyBzdGFydHMgd2l0aCBhIGRvdCAqLwotICAgIHItPnBhcnNlZF91cmkuaG9zdG5hbWUgPSBhcF9wc3RyY2F0KHItPnBvb2wsIHItPnBhcnNlZF91cmkuaG9zdG5hbWUsCi0JCQkJICAgICBkb21haW4sIE5VTEwpOwotICAgIG51cmkgPSBhcF91bnBhcnNlX3VyaV9jb21wb25lbnRzKHItPnBvb2wsCi0JCQkJICAmci0+cGFyc2VkX3VyaSwKLQkJCQkgIFVOUF9SRVZFQUxQQVNTV09SRCk7Ci0KLSAgICBhcF90YWJsZV9zZXQoci0+aGVhZGVyc19vdXQsICJMb2NhdGlvbiIsIG51cmkpOwotICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfSU5GT3xBUExPR19OT0VSUk5PLCByLAotCQkiRG9tYWluIG1pc3Npbmc6ICVzIHNlbnQgdG8gJXMlcyVzIiwgci0+dXJpLAotCQlhcF91bnBhcnNlX3VyaV9jb21wb25lbnRzKHItPnBvb2wsICZyLT5wYXJzZWRfdXJpLAotCQkgICAgICBVTlBfT01JVFVTRVJJTkZPKSwKLQkJcmVmID8gIiBmcm9tICIgOiAiIiwgcmVmID8gcmVmIDogIiIpOwotCi0gICAgcmV0dXJuIEhUVFBfTU9WRURfUEVSTUFORU5UTFk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiBJbnZva2UgaGFuZGxlciAqLwotCi1zdGF0aWMgaW50IHByb3h5X2hhbmRsZXIocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY2hhciAqdXJsLCAqc2NoZW1lLCAqcDsKLSAgICB2b2lkICpzY29uZiA9IHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZzsKLSAgICBwcm94eV9zZXJ2ZXJfY29uZiAqY29uZiA9Ci0gICAgKHByb3h5X3NlcnZlcl9jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHNjb25mLCAmcHJveHlfbW9kdWxlKTsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqcHJveGllcyA9IGNvbmYtPnByb3hpZXM7Ci0gICAgc3RydWN0IHByb3h5X3JlbW90ZSAqZW50cyA9IChzdHJ1Y3QgcHJveHlfcmVtb3RlICopIHByb3hpZXMtPmVsdHM7Ci0gICAgaW50IGksIHJjOwotICAgIGNhY2hlX3JlcSAqY3I7Ci0gICAgaW50IGRpcmVjdF9jb25uZWN0ID0gMDsKLSAgICBjb25zdCBjaGFyICptYXhmd2Rfc3RyOwotCi0gICAgaWYgKCFyLT5wcm94eXJlcSB8fCBzdHJuY21wKHItPmZpbGVuYW1lLCAicHJveHk6IiwgNikgIT0gMCkKLQlyZXR1cm4gREVDTElORUQ7Ci0KLSAgICBpZiAoci0+bWV0aG9kX251bWJlciA9PSBNX1RSQUNFICYmCi0JKG1heGZ3ZF9zdHIgPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIk1heC1Gb3J3YXJkcyIpKSAhPSBOVUxMKSB7Ci0JaW50IG1heGZ3ZCA9IHN0cnRvbChtYXhmd2Rfc3RyLCBOVUxMLCAxMCk7Ci0JaWYgKG1heGZ3ZCA8IDEpIHsKLQkgICAgaW50IGFjY2Vzc19zdGF0dXM7Ci0JICAgIHItPnByb3h5cmVxID0gMDsKLQkgICAgaWYgKChhY2Nlc3Nfc3RhdHVzID0gYXBfc2VuZF9odHRwX3RyYWNlKHIpKSkKLQkJYXBfZGllKGFjY2Vzc19zdGF0dXMsIHIpOwotCSAgICBlbHNlCi0JCWFwX2ZpbmFsaXplX3JlcXVlc3RfcHJvdG9jb2wocik7Ci0JICAgIHJldHVybiBPSzsKLQl9Ci0JYXBfdGFibGVfc2V0bihyLT5oZWFkZXJzX2luLCAiTWF4LUZvcndhcmRzIiwgCi0JCSAgICAgIGFwX3BzcHJpbnRmKHItPnBvb2wsICIlZCIsIChtYXhmd2QgPiAwKSA/IG1heGZ3ZC0xIDogMCkpOwotICAgIH0KLQotICAgIGlmICgocmMgPSBhcF9zZXR1cF9jbGllbnRfYmxvY2sociwgUkVRVUVTVF9DSFVOS0VEX0VSUk9SKSkpCi0JcmV0dXJuIHJjOwotCi0gICAgdXJsID0gci0+ZmlsZW5hbWUgKyA2OwotICAgIHAgPSBzdHJjaHIodXJsLCAnOicpOwotICAgIGlmIChwID09IE5VTEwpCi0JcmV0dXJuIEhUVFBfQkFEX1JFUVVFU1Q7Ci0KLSAgICByYyA9IGFwX3Byb3h5X2NhY2hlX2NoZWNrKHIsIHVybCwgJmNvbmYtPmNhY2hlLCAmY3IpOwotICAgIGlmIChyYyAhPSBERUNMSU5FRCkKLQlyZXR1cm4gcmM7Ci0KLSAgICAvKiBJZiB0aGUgaG9zdCBkb2Vzbid0IGhhdmUgYSBkb21haW4gbmFtZSwgYWRkIG9uZSBhbmQgcmVkaXJlY3QuICovCi0gICAgaWYgKGNvbmYtPmRvbWFpbiAhPSBOVUxMKSB7Ci0JcmMgPSBwcm94eV9uZWVkc2RvbWFpbihyLCB1cmwsIGNvbmYtPmRvbWFpbik7Ci0JaWYgKGFwX2lzX0hUVFBfUkVESVJFQ1QocmMpKQotCSAgICByZXR1cm4gSFRUUF9NT1ZFRF9QRVJNQU5FTlRMWTsKLSAgICB9Ci0KLSAgICAqcCA9ICdcMCc7Ci0gICAgc2NoZW1lID0gYXBfcHN0cmR1cChyLT5wb29sLCB1cmwpOwotICAgICpwID0gJzonOwotCi0gICAgLyogQ2hlY2sgVVJJJ3MgZGVzdGluYXRpb24gaG9zdCBhZ2FpbnN0IE5vUHJveHkgaG9zdHMgKi8KLSAgICAvKiBCeXBhc3MgUHJveHlSZW1vdGUgc2VydmVyIGxvb2t1cCBpZiBjb25maWd1cmVkIGFzIE5vUHJveHkgKi8KLSAgICAvKiB3ZSBvbmx5IGtub3cgaG93IHRvIGhhbmRsZSBjb21tdW5pY2F0aW9uIHRvIGEgcHJveHkgdmlhIGh0dHAgKi8KLSAgICAvKmlmIChzdHJjYXNlY21wKHNjaGVtZSwgImh0dHAiKSA9PSAwKSAqLwotICAgIHsKLQlpbnQgaWk7Ci0Jc3RydWN0IGRpcmNvbm5fZW50cnkgKmxpc3QgPSAoc3RydWN0IGRpcmNvbm5fZW50cnkgKikgY29uZi0+ZGlyY29ubi0+ZWx0czsKLQotCWZvciAoZGlyZWN0X2Nvbm5lY3QgPSBpaSA9IDA7IGlpIDwgY29uZi0+ZGlyY29ubi0+bmVsdHMgJiYgIWRpcmVjdF9jb25uZWN0OyBpaSsrKSB7Ci0JICAgIGRpcmVjdF9jb25uZWN0ID0gbGlzdFtpaV0ubWF0Y2hlcigmbGlzdFtpaV0sIHIpOwotCX0KLSNpZiBERUJVR0dJTkcKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0RFQlVHfEFQTE9HX05PRVJSTk8sIHIsCi0JCSAgICAgKGRpcmVjdF9jb25uZWN0KSA/ICJOb1Byb3h5IGZvciAlcyIgOiAiVXNlUHJveHkgZm9yICVzIiwKLQkJICAgICByLT51cmkpOwotI2VuZGlmCi0gICAgfQotCi0vKiBmaXJzdGx5LCB0cnkgYSBwcm94eSwgdW5sZXNzIGEgTm9Qcm94eSBkaXJlY3RpdmUgaXMgYWN0aXZlICovCi0KLSAgICBpZiAoIWRpcmVjdF9jb25uZWN0KQotCWZvciAoaSA9IDA7IGkgPCBwcm94aWVzLT5uZWx0czsgaSsrKSB7Ci0JICAgIHAgPSBzdHJjaHIoZW50c1tpXS5zY2hlbWUsICc6Jyk7CS8qIGlzIGl0IGEgcGFydGlhbCBVUkw/ICovCi0JICAgIGlmIChzdHJjbXAoZW50c1tpXS5zY2hlbWUsICIqIikgPT0gMCB8fAotCQkocCA9PSBOVUxMICYmIHN0cmNhc2VjbXAoc2NoZW1lLCBlbnRzW2ldLnNjaGVtZSkgPT0gMCkgfHwKLQkJKHAgIT0gTlVMTCAmJgotCSAgICAgICBzdHJuY2FzZWNtcCh1cmwsIGVudHNbaV0uc2NoZW1lLCBzdHJsZW4oZW50c1tpXS5zY2hlbWUpKSA9PSAwKSkgewotCQkvKiBDT05ORUNUIGlzIGEgc3BlY2lhbCBtZXRob2QgdGhhdCBieXBhc3NlcyB0aGUgbm9ybWFsCi0JCSAqIHByb3h5IGNvZGUuCi0JCSAqLwotCQlpZiAoci0+bWV0aG9kX251bWJlciA9PSBNX0NPTk5FQ1QpCi0JCSAgICByYyA9IGFwX3Byb3h5X2Nvbm5lY3RfaGFuZGxlcihyLCBjciwgdXJsLCBlbnRzW2ldLmhvc3RuYW1lLAotCQkJCQkgICAgICAgZW50c1tpXS5wb3J0KTsKLS8qIHdlIG9ubHkga25vdyBob3cgdG8gaGFuZGxlIGNvbW11bmljYXRpb24gdG8gYSBwcm94eSB2aWEgaHR0cCAqLwotCQllbHNlIGlmIChzdHJjYXNlY21wKGVudHNbaV0ucHJvdG9jb2wsICJodHRwIikgPT0gMCkKLQkJICAgIHJjID0gYXBfcHJveHlfaHR0cF9oYW5kbGVyKHIsIGNyLCB1cmwsIGVudHNbaV0uaG9zdG5hbWUsCi0JCQkJCSAgICBlbnRzW2ldLnBvcnQpOwotCQllbHNlCi0JCSAgICByYyA9IERFQ0xJTkVEOwotCi0JCS8qIGFuIGVycm9yIG9yIHN1Y2Nlc3MgKi8KLQkJaWYgKHJjICE9IERFQ0xJTkVEICYmIHJjICE9IEhUVFBfQkFEX0dBVEVXQVkpCi0JCSAgICByZXR1cm4gcmM7Ci0JCS8qIHdlIGZhaWxlZCB0byB0YWxrIHRvIHRoZSB1cHN0cmVhbSBwcm94eSAqLwotCSAgICB9Ci0JfQotCi0vKiBvdGhlcndpc2UsIHRyeSBpdCBkaXJlY3QgKi8KLS8qIE4uQi4gd2hhdCBpZiB3ZSdyZSBiZWhpbmQgYSBmaXJld2FsbCwgd2hlcmUgd2UgbXVzdCB1c2UgYSBwcm94eSBvcgotICogZ2l2ZSB1cD8/Ci0gKi8KLSAgICAvKiBoYW5kbGUgdGhlIHNjaGVtZSAqLwotICAgIGlmIChyLT5tZXRob2RfbnVtYmVyID09IE1fQ09OTkVDVCkKLQlyZXR1cm4gYXBfcHJveHlfY29ubmVjdF9oYW5kbGVyKHIsIGNyLCB1cmwsIE5VTEwsIDApOwotICAgIGlmIChzdHJjYXNlY21wKHNjaGVtZSwgImh0dHAiKSA9PSAwKQotCXJldHVybiBhcF9wcm94eV9odHRwX2hhbmRsZXIociwgY3IsIHVybCwgTlVMTCwgMCk7Ci0gICAgaWYgKHN0cmNhc2VjbXAoc2NoZW1lLCAiZnRwIikgPT0gMCkKLQlyZXR1cm4gYXBfcHJveHlfZnRwX2hhbmRsZXIociwgY3IsIHVybCk7Ci0gICAgZWxzZQotCXJldHVybiBIVFRQX0ZPUkJJRERFTjsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIFNldHVwIGNvbmZpZ3VyYWJsZSBkYXRhICovCi0KLXN0YXRpYyB2b2lkICoKLSAgICAgY3JlYXRlX3Byb3h5X2NvbmZpZyhhcF9jb250ZXh0X3QgKnAsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgcHJveHlfc2VydmVyX2NvbmYgKnBzID0gYXBfcGNhbGxvYyhwLCBzaXplb2YocHJveHlfc2VydmVyX2NvbmYpKTsKLQotICAgIHBzLT5wcm94aWVzID0gYXBfbWFrZV9hcnJheShwLCAxMCwgc2l6ZW9mKHN0cnVjdCBwcm94eV9yZW1vdGUpKTsKLSAgICBwcy0+YWxpYXNlcyA9IGFwX21ha2VfYXJyYXkocCwgMTAsIHNpemVvZihzdHJ1Y3QgcHJveHlfYWxpYXMpKTsKLSAgICBwcy0+cmFsaWFzZXMgPSBhcF9tYWtlX2FycmF5KHAsIDEwLCBzaXplb2Yoc3RydWN0IHByb3h5X2FsaWFzKSk7Ci0gICAgcHMtPm5vcHJveGllcyA9IGFwX21ha2VfYXJyYXkocCwgMTAsIHNpemVvZihzdHJ1Y3Qgbm9wcm94eV9lbnRyeSkpOwotICAgIHBzLT5kaXJjb25uID0gYXBfbWFrZV9hcnJheShwLCAxMCwgc2l6ZW9mKHN0cnVjdCBkaXJjb25uX2VudHJ5KSk7Ci0gICAgcHMtPm5vY2FjaGVzID0gYXBfbWFrZV9hcnJheShwLCAxMCwgc2l6ZW9mKHN0cnVjdCBub2NhY2hlX2VudHJ5KSk7Ci0gICAgcHMtPmFsbG93ZWRfY29ubmVjdF9wb3J0cyA9IGFwX21ha2VfYXJyYXkocCwgMTAsIHNpemVvZihpbnQpKTsKLSAgICBwcy0+ZG9tYWluID0gTlVMTDsKLSAgICBwcy0+dmlhb3B0ID0gdmlhX29mZjsgLyogaW5pdGlhbGx5IGJhY2t3YXJkIGNvbXBhdGlibGUgd2l0aCAxLjMuMSAqLwotICAgIHBzLT5yZXEgPSAwOwotCi0gICAgcHMtPmNhY2hlLnJvb3QgPSBOVUxMOwotICAgIHBzLT5jYWNoZS5zcGFjZSA9IERFRkFVTFRfQ0FDSEVfU1BBQ0U7Ci0gICAgcHMtPmNhY2hlLm1heGV4cGlyZSA9IERFRkFVTFRfQ0FDSEVfTUFYRVhQSVJFOwotICAgIHBzLT5jYWNoZS5kZWZhdWx0ZXhwaXJlID0gREVGQVVMVF9DQUNIRV9FWFBJUkU7Ci0gICAgcHMtPmNhY2hlLmxtZmFjdG9yID0gREVGQVVMVF9DQUNIRV9MTUZBQ1RPUjsKLSAgICBwcy0+Y2FjaGUuZ2NpbnRlcnZhbCA9IC0xOwotICAgIC8qIGF0IHRoZXNlIGxldmVscywgdGhlIGNhY2hlIGNhbiBoYXZlIDJeMTggZGlyZWN0b3JpZXMgKDI1NiwwMDApICAqLwotICAgIHBzLT5jYWNoZS5kaXJsZXZlbHMgPSAzOwotICAgIHBzLT5jYWNoZS5kaXJsZW5ndGggPSAxOwotICAgIHBzLT5jYWNoZS5jYWNoZV9jb21wbGV0aW9uID0gREVGQVVMVF9DQUNIRV9DT01QTEVUSU9OOwotCi0gICAgcmV0dXJuIHBzOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi0gICAgIGFkZF9wcm94eShjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmYsIGNoYXIgKnIpCi17Ci0gICAgc2VydmVyX3JlYyAqcyA9IGNtZC0+c2VydmVyOwotICAgIHByb3h5X3NlcnZlcl9jb25mICpjb25mID0KLSAgICAocHJveHlfc2VydmVyX2NvbmYgKikgYXBfZ2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywgJnByb3h5X21vZHVsZSk7Ci0gICAgc3RydWN0IHByb3h5X3JlbW90ZSAqbmV3OwotICAgIGNoYXIgKnAsICpxOwotICAgIGludCBwb3J0OwotCi0gICAgcCA9IHN0cmNocihyLCAnOicpOwotICAgIGlmIChwID09IE5VTEwgfHwgcFsxXSAhPSAnLycgfHwgcFsyXSAhPSAnLycgfHwgcFszXSA9PSAnXDAnKQotCXJldHVybiAiUHJveHlSZW1vdGU6IEJhZCBzeW50YXggZm9yIGEgcmVtb3RlIHByb3h5IHNlcnZlciI7Ci0gICAgcSA9IHN0cmNocihwICsgMywgJzonKTsKLSAgICBpZiAocSAhPSBOVUxMKSB7Ci0JaWYgKHNzY2FuZihxICsgMSwgIiV1IiwgJnBvcnQpICE9IDEgfHwgcG9ydCA+IDY1NTM1KQotCSAgICByZXR1cm4gIlByb3h5UmVtb3RlOiBCYWQgc3ludGF4IGZvciBhIHJlbW90ZSBwcm94eSBzZXJ2ZXIgKGJhZCBwb3J0IG51bWJlcikiOwotCSpxID0gJ1wwJzsKLSAgICB9Ci0gICAgZWxzZQotCXBvcnQgPSAtMTsKLSAgICAqcCA9ICdcMCc7Ci0gICAgaWYgKHN0cmNocihmLCAnOicpID09IE5VTEwpCi0JYXBfc3RyX3RvbG93ZXIoZik7CQkvKiBsb3dlcmNhc2Ugc2NoZW1lICovCi0gICAgYXBfc3RyX3RvbG93ZXIocCArIDMpOwkJLyogbG93ZXJjYXNlIGhvc3RuYW1lICovCi0KLSAgICBpZiAocG9ydCA9PSAtMSkgewotCWludCBpOwotCWZvciAoaSA9IDA7IGRlZnBvcnRzW2ldLnNjaGVtZSAhPSBOVUxMOyBpKyspCi0JICAgIGlmIChzdHJjYXNlY21wKGRlZnBvcnRzW2ldLnNjaGVtZSwgcikgPT0gMCkKLQkJYnJlYWs7Ci0JcG9ydCA9IGRlZnBvcnRzW2ldLnBvcnQ7Ci0gICAgfQotCi0gICAgbmV3ID0gYXBfcHVzaF9hcnJheShjb25mLT5wcm94aWVzKTsKLSAgICBuZXctPnNjaGVtZSA9IGY7Ci0gICAgbmV3LT5wcm90b2NvbCA9IHI7Ci0gICAgbmV3LT5ob3N0bmFtZSA9IHAgKyAzOwotICAgIG5ldy0+cG9ydCA9IHBvcnQ7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLSAgICAgYWRkX3Bhc3MoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICpmLCBjaGFyICpyKQotewotICAgIHNlcnZlcl9yZWMgKnMgPSBjbWQtPnNlcnZlcjsKLSAgICBwcm94eV9zZXJ2ZXJfY29uZiAqY29uZiA9Ci0gICAgKHByb3h5X3NlcnZlcl9jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsICZwcm94eV9tb2R1bGUpOwotICAgIHN0cnVjdCBwcm94eV9hbGlhcyAqbmV3OwotCi0gICAgbmV3ID0gYXBfcHVzaF9hcnJheShjb25mLT5hbGlhc2VzKTsKLSAgICBuZXctPmZha2UgPSBmOwotICAgIG5ldy0+cmVhbCA9IHI7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLSAgICBhZGRfcGFzc19yZXZlcnNlKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqZiwgY2hhciAqcikKLXsKLSAgICBzZXJ2ZXJfcmVjICpzID0gY21kLT5zZXJ2ZXI7Ci0gICAgcHJveHlfc2VydmVyX2NvbmYgKmNvbmY7Ci0gICAgc3RydWN0IHByb3h5X2FsaWFzICpuZXc7Ci0KLSAgICBjb25mID0gKHByb3h5X3NlcnZlcl9jb25mICopYXBfZ2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm94eV9tb2R1bGUpOwotICAgIG5ldyA9IGFwX3B1c2hfYXJyYXkoY29uZi0+cmFsaWFzZXMpOwotICAgIG5ldy0+ZmFrZSA9IGY7Ci0gICAgbmV3LT5yZWFsID0gcjsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotICAgICBzZXRfcHJveHlfZXhjbHVkZShjbWRfcGFybXMgKnBhcm1zLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIHNlcnZlcl9yZWMgKnMgPSBwYXJtcy0+c2VydmVyOwotICAgIHByb3h5X3NlcnZlcl9jb25mICpjb25mID0KLSAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAmcHJveHlfbW9kdWxlKTsKLSAgICBzdHJ1Y3Qgbm9wcm94eV9lbnRyeSAqbmV3OwotICAgIHN0cnVjdCBub3Byb3h5X2VudHJ5ICpsaXN0ID0gKHN0cnVjdCBub3Byb3h5X2VudHJ5ICopIGNvbmYtPm5vcHJveGllcy0+ZWx0czsKLSAgICBzdHJ1Y3QgaG9zdGVudCBocDsKLSAgICBpbnQgZm91bmQgPSAwOwotICAgIGludCBpOwotCi0gICAgLyogRG9uJ3QgZHVwbGljYXRlIGVudHJpZXMgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgY29uZi0+bm9wcm94aWVzLT5uZWx0czsgaSsrKSB7Ci0JaWYgKHN0cmNhc2VjbXAoYXJnLCBsaXN0W2ldLm5hbWUpID09IDApIC8qIGlnbm9yZSBjYXNlIGZvciBob3N0IG5hbWVzICovCi0JICAgIGZvdW5kID0gMTsKLSAgICB9Ci0KLSAgICBpZiAoIWZvdW5kKSB7Ci0JbmV3ID0gYXBfcHVzaF9hcnJheShjb25mLT5ub3Byb3hpZXMpOwotCW5ldy0+bmFtZSA9IGFyZzsKLQkvKiBEb24ndCBkbyBuYW1lIGxvb2t1cHMgb24gdGhpbmdzIHRoYXQgYXJlbid0IGRvdHRlZCAqLwotCWlmIChzdHJjaHIoYXJnLCAnLicpICE9IE5VTEwgJiYgYXBfcHJveHlfaG9zdDJhZGRyKG5ldy0+bmFtZSwgJmhwKSA9PSBOVUxMKQotCSAgICAvKkBAQEZJWE1FOiBUaGlzIGNvcGllcyBvbmx5IHRoZSBmaXJzdCBvZiAocG9zc2libHkgbWFueSkgSVAgYWRkcnMgKi8KLQkgICAgbWVtY3B5KCZuZXctPmFkZHIsIGhwLmhfYWRkciwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7Ci0JZWxzZQotCSAgICBuZXctPmFkZHIuc19hZGRyID0gMDsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBTZXQgdGhlIHBvcnRzIENPTk5FQ1QgY2FuIHVzZQotICovCi1zdGF0aWMgY29uc3QgY2hhciAqCi0gICAgc2V0X2FsbG93ZWRfcG9ydHMoY21kX3Bhcm1zICpwYXJtcywgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBzZXJ2ZXJfcmVjICpzID0gcGFybXMtPnNlcnZlcjsKLSAgICBwcm94eV9zZXJ2ZXJfY29uZiAqY29uZiA9Ci0gICAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhzLT5tb2R1bGVfY29uZmlnLCAmcHJveHlfbW9kdWxlKTsKLSAgICBpbnQgKk5ldzsKLQotICAgIGlmICghYXBfaXNkaWdpdChhcmdbMF0pKQotCXJldHVybiAiQWxsb3dDT05ORUNUOiBwb3J0IG51bWJlciBtdXN0IGJlIG51bWVyaWMiOwotCi0gICAgTmV3ID0gYXBfcHVzaF9hcnJheShjb25mLT5hbGxvd2VkX2Nvbm5lY3RfcG9ydHMpOwotICAgICpOZXcgPSBhdG9pKGFyZyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNpbWlsYXIgdG8gc2V0X3Byb3h5X2V4Y2x1ZGUoKSwgYnV0IGRlZmluaW5nIGRpcmVjdGx5IGNvbm5lY3RlZCBob3N0cywKLSAqIHdoaWNoIHNob3VsZCBuZXZlciBiZSBhY2Nlc3NlZCB2aWEgdGhlIGNvbmZpZ3VyZWQgUHJveHlSZW1vdGUgc2VydmVycwotICovCi1zdGF0aWMgY29uc3QgY2hhciAqCi0gICAgIHNldF9wcm94eV9kaXJjb25uKGNtZF9wYXJtcyAqcGFybXMsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgc2VydmVyX3JlYyAqcyA9IHBhcm1zLT5zZXJ2ZXI7Ci0gICAgcHJveHlfc2VydmVyX2NvbmYgKmNvbmYgPQotICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsICZwcm94eV9tb2R1bGUpOwotICAgIHN0cnVjdCBkaXJjb25uX2VudHJ5ICpOZXc7Ci0gICAgc3RydWN0IGRpcmNvbm5fZW50cnkgKmxpc3QgPSAoc3RydWN0IGRpcmNvbm5fZW50cnkgKikgY29uZi0+ZGlyY29ubi0+ZWx0czsKLSAgICBpbnQgZm91bmQgPSAwOwotICAgIGludCBpOwotCi0gICAgLyogRG9uJ3QgZHVwbGljYXRlIGVudHJpZXMgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgY29uZi0+ZGlyY29ubi0+bmVsdHM7IGkrKykgewotCWlmIChzdHJjYXNlY21wKGFyZywgbGlzdFtpXS5uYW1lKSA9PSAwKQotCSAgICBmb3VuZCA9IDE7Ci0gICAgfQotCi0gICAgaWYgKCFmb3VuZCkgewotCU5ldyA9IGFwX3B1c2hfYXJyYXkoY29uZi0+ZGlyY29ubik7Ci0JTmV3LT5uYW1lID0gYXJnOwotCU5ldy0+aG9zdGVudHJ5ID0gTlVMTDsKLQotCWlmIChhcF9wcm94eV9pc19pcGFkZHIoTmV3LCBwYXJtcy0+cG9vbCkpIHsKLSNpZiBERUJVR0dJTkcKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAiUGFyc2VkIGFkZHIgJXMiLCBpbmV0X250b2EoTmV3LT5hZGRyKSk7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIlBhcnNlZCBtYXNrICVzIiwgaW5ldF9udG9hKE5ldy0+bWFzaykpOwotI2VuZGlmCi0JfQotCWVsc2UgaWYgKGFwX3Byb3h5X2lzX2RvbWFpbm5hbWUoTmV3LCBwYXJtcy0+cG9vbCkpIHsKLQkgICAgYXBfc3RyX3RvbG93ZXIoTmV3LT5uYW1lKTsKLSNpZiBERUJVR0dJTkcKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAiUGFyc2VkIGRvbWFpbiAlcyIsIE5ldy0+bmFtZSk7Ci0jZW5kaWYKLQl9Ci0JZWxzZSBpZiAoYXBfcHJveHlfaXNfaG9zdG5hbWUoTmV3LCBwYXJtcy0+cG9vbCkpIHsKLQkgICAgYXBfc3RyX3RvbG93ZXIoTmV3LT5uYW1lKTsKLSNpZiBERUJVR0dJTkcKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAiUGFyc2VkIGhvc3QgJXMiLCBOZXctPm5hbWUpOwotI2VuZGlmCi0JfQotCWVsc2UgewotCSAgICBhcF9wcm94eV9pc193b3JkKE5ldywgcGFybXMtPnBvb2wpOwotI2lmIERFQlVHR0lORwotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICJQYXJzZWQgd29yZCAlcyIsIE5ldy0+bmFtZSk7Ci0jZW5kaWYKLQl9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi0gICAgIHNldF9wcm94eV9kb21haW4oY21kX3Bhcm1zICpwYXJtcywgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBwcm94eV9zZXJ2ZXJfY29uZiAqcHNmID0KLSAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhwYXJtcy0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAmcHJveHlfbW9kdWxlKTsKLQotICAgIGlmIChhcmdbMF0gIT0gJy4nKQotCXJldHVybiAiUHJveHlEb21haW46IGRvbWFpbiBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGRvdC4iOwotCi0gICAgcHNmLT5kb21haW4gPSBhcmc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLSAgICAgc2V0X3Byb3h5X3JlcShjbWRfcGFybXMgKnBhcm1zLCB2b2lkICpkdW1teSwgaW50IGZsYWcpCi17Ci0gICAgcHJveHlfc2VydmVyX2NvbmYgKnBzZiA9Ci0gICAgYXBfZ2V0X21vZHVsZV9jb25maWcocGFybXMtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgJnByb3h5X21vZHVsZSk7Ci0KLSAgICBwc2YtPnJlcSA9IGZsYWc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotICAgICBzZXRfY2FjaGVfc2l6ZShjbWRfcGFybXMgKnBhcm1zLCBjaGFyICpzdHJ1Y3RfcHRyLCBjaGFyICphcmcpCi17Ci0gICAgcHJveHlfc2VydmVyX2NvbmYgKnBzZiA9Ci0gICAgYXBfZ2V0X21vZHVsZV9jb25maWcocGFybXMtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgJnByb3h5X21vZHVsZSk7Ci0gICAgaW50IHZhbDsKLQotICAgIGlmIChzc2NhbmYoYXJnLCAiJWQiLCAmdmFsKSAhPSAxKQotCXJldHVybiAiQ2FjaGVTaXplIHZhbHVlIG11c3QgYmUgYW4gaW50ZWdlciAoa0J5dGVzKSI7Ci0gICAgcHNmLT5jYWNoZS5zcGFjZSA9IHZhbDsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotICAgICBzZXRfY2FjaGVfcm9vdChjbWRfcGFybXMgKnBhcm1zLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIHByb3h5X3NlcnZlcl9jb25mICpwc2YgPQotICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKHBhcm1zLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsICZwcm94eV9tb2R1bGUpOwotCi0gICAgcHNmLT5jYWNoZS5yb290ID0gYXJnOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLSAgICAgc2V0X2NhY2hlX2ZhY3RvcihjbWRfcGFybXMgKnBhcm1zLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIHByb3h5X3NlcnZlcl9jb25mICpwc2YgPQotICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKHBhcm1zLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsICZwcm94eV9tb2R1bGUpOwotICAgIGRvdWJsZSB2YWw7Ci0KLSAgICBpZiAoc3NjYW5mKGFyZywgIiVsZyIsICZ2YWwpICE9IDEpCi0JcmV0dXJuICJDYWNoZUxhc3RNb2RpZmllZEZhY3RvciB2YWx1ZSBtdXN0IGJlIGEgZmxvYXQiOwotICAgIHBzZi0+Y2FjaGUubG1mYWN0b3IgPSB2YWw7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotICAgICBzZXRfY2FjaGVfbWF4ZXgoY21kX3Bhcm1zICpwYXJtcywgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBwcm94eV9zZXJ2ZXJfY29uZiAqcHNmID0KLSAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhwYXJtcy0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAmcHJveHlfbW9kdWxlKTsKLSAgICBkb3VibGUgdmFsOwotCi0gICAgaWYgKHNzY2FuZihhcmcsICIlbGciLCAmdmFsKSAhPSAxKQotCXJldHVybiAiQ2FjaGVNYXhFeHBpcmUgdmFsdWUgbXVzdCBiZSBhIGZsb2F0IjsKLSAgICBwc2YtPmNhY2hlLm1heGV4cGlyZSA9IChpbnQpICh2YWwgKiAoZG91YmxlKSBTRUNfT05FX0hSKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotICAgICBzZXRfY2FjaGVfZGVmZXgoY21kX3Bhcm1zICpwYXJtcywgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBwcm94eV9zZXJ2ZXJfY29uZiAqcHNmID0KLSAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhwYXJtcy0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAmcHJveHlfbW9kdWxlKTsKLSAgICBkb3VibGUgdmFsOwotCi0gICAgaWYgKHNzY2FuZihhcmcsICIlbGciLCAmdmFsKSAhPSAxKQotCXJldHVybiAiQ2FjaGVEZWZhdWx0RXhwaXJlIHZhbHVlIG11c3QgYmUgYSBmbG9hdCI7Ci0gICAgcHNmLT5jYWNoZS5kZWZhdWx0ZXhwaXJlID0gKGludCkgKHZhbCAqIChkb3VibGUpIFNFQ19PTkVfSFIpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi0gICAgIHNldF9jYWNoZV9nY2ludChjbWRfcGFybXMgKnBhcm1zLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIHByb3h5X3NlcnZlcl9jb25mICpwc2YgPQotICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKHBhcm1zLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsICZwcm94eV9tb2R1bGUpOwotICAgIGRvdWJsZSB2YWw7Ci0KLSAgICBpZiAoc3NjYW5mKGFyZywgIiVsZyIsICZ2YWwpICE9IDEpCi0JcmV0dXJuICJDYWNoZUdjSW50ZXJ2YWwgdmFsdWUgbXVzdCBiZSBhIGZsb2F0IjsKLSAgICBwc2YtPmNhY2hlLmdjaW50ZXJ2YWwgPSAoaW50KSAodmFsICogKGRvdWJsZSkgU0VDX09ORV9IUik7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLSAgICAgc2V0X2NhY2hlX2RpcmxldmVscyhjbWRfcGFybXMgKnBhcm1zLCBjaGFyICpzdHJ1Y3RfcHRyLCBjaGFyICphcmcpCi17Ci0gICAgcHJveHlfc2VydmVyX2NvbmYgKnBzZiA9Ci0gICAgYXBfZ2V0X21vZHVsZV9jb25maWcocGFybXMtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgJnByb3h5X21vZHVsZSk7Ci0gICAgaW50IHZhbDsKLQotICAgIHZhbCA9IGF0b2koYXJnKTsKLSAgICBpZiAodmFsIDwgMSkKLQlyZXR1cm4gIkNhY2hlRGlyTGV2ZWxzIHZhbHVlIG11c3QgYmUgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMCI7Ci0gICAgaWYgKHZhbCAqIHBzZi0+Y2FjaGUuZGlybGVuZ3RoID4gQ0FDSEVGSUxFX0xFTikKLQlyZXR1cm4gIkNhY2hlRGlyTGV2ZWxzKkNhY2hlRGlyTGVuZ3RoIHZhbHVlIG11c3Qgbm90IGJlIGhpZ2hlciB0aGFuIDIwIjsKLSAgICBwc2YtPmNhY2hlLmRpcmxldmVscyA9IHZhbDsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotICAgICBzZXRfY2FjaGVfZGlybGVuZ3RoKGNtZF9wYXJtcyAqcGFybXMsIGNoYXIgKnN0cnVjdF9wdHIsIGNoYXIgKmFyZykKLXsKLSAgICBwcm94eV9zZXJ2ZXJfY29uZiAqcHNmID0KLSAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhwYXJtcy0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAmcHJveHlfbW9kdWxlKTsKLSAgICBpbnQgdmFsOwotCi0gICAgdmFsID0gYXRvaShhcmcpOwotICAgIGlmICh2YWwgPCAxKQotCXJldHVybiAiQ2FjaGVEaXJMZW5ndGggdmFsdWUgbXVzdCBiZSBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAwIjsKLSAgICBpZiAodmFsICogcHNmLT5jYWNoZS5kaXJsZXZlbHMgPiBDQUNIRUZJTEVfTEVOKQotCXJldHVybiAiQ2FjaGVEaXJMZXZlbHMqQ2FjaGVEaXJMZW5ndGggdmFsdWUgbXVzdCBub3QgYmUgaGlnaGVyIHRoYW4gMjAiOwotICAgIHBzZi0+Y2FjaGUuZGlybGVuZ3RoID0gdmFsOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi0gICAgIHNldF9jYWNoZV9leGNsdWRlKGNtZF9wYXJtcyAqcGFybXMsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgc2VydmVyX3JlYyAqcyA9IHBhcm1zLT5zZXJ2ZXI7Ci0gICAgcHJveHlfc2VydmVyX2NvbmYgKmNvbmYgPQotICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKHMtPm1vZHVsZV9jb25maWcsICZwcm94eV9tb2R1bGUpOwotICAgIHN0cnVjdCBub2NhY2hlX2VudHJ5ICpuZXc7Ci0gICAgc3RydWN0IG5vY2FjaGVfZW50cnkgKmxpc3QgPSAoc3RydWN0IG5vY2FjaGVfZW50cnkgKikgY29uZi0+bm9jYWNoZXMtPmVsdHM7Ci0gICAgc3RydWN0IGhvc3RlbnQgaHA7Ci0gICAgaW50IGZvdW5kID0gMDsKLSAgICBpbnQgaTsKLQotICAgIC8qIERvbid0IGR1cGxpY2F0ZSBlbnRyaWVzICovCi0gICAgZm9yIChpID0gMDsgaSA8IGNvbmYtPm5vY2FjaGVzLT5uZWx0czsgaSsrKSB7Ci0JaWYgKHN0cmNhc2VjbXAoYXJnLCBsaXN0W2ldLm5hbWUpID09IDApIC8qIGlnbm9yZSBjYXNlIGZvciBob3N0IG5hbWVzICovCi0JICAgIGZvdW5kID0gMTsKLSAgICB9Ci0KLSAgICBpZiAoIWZvdW5kKSB7Ci0JbmV3ID0gYXBfcHVzaF9hcnJheShjb25mLT5ub2NhY2hlcyk7Ci0JbmV3LT5uYW1lID0gYXJnOwotCS8qIERvbid0IGRvIG5hbWUgbG9va3VwcyBvbiB0aGluZ3MgdGhhdCBhcmVuJ3QgZG90dGVkICovCi0JaWYgKHN0cmNocihhcmcsICcuJykgIT0gTlVMTCAmJiBhcF9wcm94eV9ob3N0MmFkZHIobmV3LT5uYW1lLCAmaHApID09IE5VTEwpCi0JICAgIC8qQEBARklYTUU6IFRoaXMgY29waWVzIG9ubHkgdGhlIGZpcnN0IG9mIChwb3NzaWJseSBtYW55KSBJUCBhZGRycyAqLwotCSAgICBtZW1jcHkoJm5ldy0+YWRkciwgaHAuaF9hZGRyLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKLQllbHNlCi0JICAgIG5ldy0+YWRkci5zX2FkZHIgPSAwOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotICAgICBzZXRfcmVjdl9idWZmZXJfc2l6ZShjbWRfcGFybXMgKnBhcm1zLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIHByb3h5X3NlcnZlcl9jb25mICpwc2YgPQotICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKHBhcm1zLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsICZwcm94eV9tb2R1bGUpOwotICAgIGludCBzID0gYXRvaShhcmcpOwotICAgIGlmIChzIDwgNTEyICYmIHMgIT0gMCkgewotCXJldHVybiAiUHJveHlSZWNlaXZlQnVmZmVyU2l6ZSBtdXN0IGJlID49IDUxMiBieXRlcywgb3IgMCBmb3Igc3lzdGVtIGRlZmF1bHQuIjsKLSAgICB9Ci0KLSAgICBwc2YtPnJlY3ZfYnVmZmVyX3NpemUgPSBzOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhcioKLSAgICBzZXRfY2FjaGVfY29tcGxldGlvbihjbWRfcGFybXMgKnBhcm1zLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIHByb3h5X3NlcnZlcl9jb25mICpwc2YgPQotICAgIGFwX2dldF9tb2R1bGVfY29uZmlnKHBhcm1zLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsICZwcm94eV9tb2R1bGUpOwotICAgIGludCBzID0gYXRvaShhcmcpOwotICAgIGlmIChzID4gMTAwIHx8IHMgPCAwKSB7Ci0JcmV0dXJuICJDYWNoZUZvcmNlQ29tcGxldGlvbiBtdXN0IGJlIDw9IDEwMCBwZXJjZW50LCAiCi0gICAgICAgICAgICAgICAib3IgMCBmb3Igc3lzdGVtIGRlZmF1bHQuIjsKLSAgICB9Ci0KLSAgICBpZiAocyA+IDApCi0gICAgICBwc2YtPmNhY2hlLmNhY2hlX2NvbXBsZXRpb24gPSAoKGZsb2F0KXMgLyAxMDApOwotICAgIHJldHVybiBOVUxMOyAgICAKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqCi0gICAgc2V0X3ZpYV9vcHQoY21kX3Bhcm1zICpwYXJtcywgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBwcm94eV9zZXJ2ZXJfY29uZiAqcHNmID0KLSAgICBhcF9nZXRfbW9kdWxlX2NvbmZpZyhwYXJtcy0+c2VydmVyLT5tb2R1bGVfY29uZmlnLCAmcHJveHlfbW9kdWxlKTsKLQotICAgIGlmIChzdHJjYXNlY21wKGFyZywgIk9mZiIpID09IDApCi0gICAgICAgIHBzZi0+dmlhb3B0ID0gdmlhX29mZjsKLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKGFyZywgIk9uIikgPT0gMCkKLSAgICAgICAgcHNmLT52aWFvcHQgPSB2aWFfb247Ci0gICAgZWxzZSBpZiAoc3RyY2FzZWNtcChhcmcsICJCbG9jayIpID09IDApCi0gICAgICAgIHBzZi0+dmlhb3B0ID0gdmlhX2Jsb2NrOwotICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAoYXJnLCAiRnVsbCIpID09IDApCi0gICAgICAgIHBzZi0+dmlhb3B0ID0gdmlhX2Z1bGw7Ci0gICAgZWxzZSB7Ci0JcmV0dXJuICJQcm94eVZpYSBtdXN0IGJlIG9uZSBvZjogIgotICAgICAgICAgICAgICAgIm9mZiB8IG9uIHwgZnVsbCB8IGJsb2NrIjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsgICAgCi19Ci0KLXN0YXRpYyBjb25zdCBoYW5kbGVyX3JlYyBwcm94eV9oYW5kbGVyc1tdID0KLXsKLSAgICB7InByb3h5LXNlcnZlciIsIHByb3h5X2hhbmRsZXJ9LAotICAgIHtOVUxMfQotfTsKLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIHByb3h5X2NtZHNbXSA9Ci17Ci0gICAgeyJQcm94eVJlcXVlc3RzIiwgc2V0X3Byb3h5X3JlcSwgTlVMTCwgUlNSQ19DT05GLCBGTEFHLAotICAgICAib24gaWYgdGhlIHRydWUgcHJveHkgcmVxdWVzdHMgc2hvdWxkIGJlIGFjY2VwdGVkIn0sCi0gICAgeyJQcm94eVJlbW90ZSIsIGFkZF9wcm94eSwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMiwKLSAgICAgImEgc2NoZW1lLCBwYXJ0aWFsIFVSTCBvciAnKicgYW5kIGEgcHJveHkgc2VydmVyIn0sCi0gICAgeyJQcm94eVBhc3MiLCBhZGRfcGFzcywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMiwKLSAgICAgImEgdmlydHVhbCBwYXRoIGFuZCBhIFVSTCJ9LAotICAgIHsiUHJveHlQYXNzUmV2ZXJzZSIsIGFkZF9wYXNzX3JldmVyc2UsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTIsCi0gICAgICJhIHZpcnR1YWwgcGF0aCBhbmQgYSBVUkwgZm9yIHJldmVyc2UgcHJveHkgYmVoYXZpb3VyIn0sCi0gICAgeyJQcm94eUJsb2NrIiwgc2V0X3Byb3h5X2V4Y2x1ZGUsIE5VTEwsIFJTUkNfQ09ORiwgSVRFUkFURSwKLSAgICAgIkEgbGlzdCBvZiBuYW1lcywgaG9zdHMgb3IgZG9tYWlucyB0byB3aGljaCB0aGUgcHJveHkgd2lsbCBub3QgY29ubmVjdCJ9LAotICAgIHsiUHJveHlSZWNlaXZlQnVmZmVyU2l6ZSIsIHNldF9yZWN2X2J1ZmZlcl9zaXplLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAgICAiUmVjZWl2ZSBidWZmZXIgc2l6ZSBmb3Igb3V0Z29pbmcgSFRUUCBhbmQgRlRQIGNvbm5lY3Rpb25zIGluIGJ5dGVzIn0sCi0gICAgeyJOb1Byb3h5Iiwgc2V0X3Byb3h5X2RpcmNvbm4sIE5VTEwsIFJTUkNfQ09ORiwgSVRFUkFURSwKLSAgICAgIkEgbGlzdCBvZiBkb21haW5zLCBob3N0cywgb3Igc3VibmV0cyB0byB3aGljaCB0aGUgcHJveHkgd2lsbCBjb25uZWN0IGRpcmVjdGx5In0sCi0gICAgeyJQcm94eURvbWFpbiIsIHNldF9wcm94eV9kb21haW4sIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICAgICJUaGUgZGVmYXVsdCBpbnRyYW5ldCBkb21haW4gbmFtZSAoaW4gYWJzZW5jZSBvZiBhIGRvbWFpbiBpbiB0aGUgVVJMKSJ9LAotICAgIHsiQWxsb3dDT05ORUNUIiwgc2V0X2FsbG93ZWRfcG9ydHMsIE5VTEwsIFJTUkNfQ09ORiwgSVRFUkFURSwKLSAgICAgIkEgbGlzdCBvZiBwb3J0cyB3aGljaCBDT05ORUNUIG1heSBjb25uZWN0IHRvIn0sCi0gICAgeyJDYWNoZVJvb3QiLCBzZXRfY2FjaGVfcm9vdCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAgIlRoZSBkaXJlY3RvcnkgdG8gc3RvcmUgY2FjaGUgZmlsZXMifSwKLSAgICB7IkNhY2hlU2l6ZSIsIHNldF9jYWNoZV9zaXplLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAgICAiVGhlIG1heGltdW0gZGlzayBzcGFjZSB1c2VkIGJ5IHRoZSBjYWNoZSBpbiBLYiJ9LAotICAgIHsiQ2FjaGVNYXhFeHBpcmUiLCBzZXRfY2FjaGVfbWF4ZXgsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICAgICJUaGUgbWF4aW11bSB0aW1lIGluIGhvdXJzIHRvIGNhY2hlIGEgZG9jdW1lbnQifSwKLSAgICB7IkNhY2hlRGVmYXVsdEV4cGlyZSIsIHNldF9jYWNoZV9kZWZleCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAgIlRoZSBkZWZhdWx0IHRpbWUgaW4gaG91cnMgdG8gY2FjaGUgYSBkb2N1bWVudCJ9LAotICAgIHsiQ2FjaGVMYXN0TW9kaWZpZWRGYWN0b3IiLCBzZXRfY2FjaGVfZmFjdG9yLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAgICAiVGhlIGZhY3RvciB1c2VkIHRvIGVzdGltYXRlIEV4cGlyZXMgZGF0ZSBmcm9tIExhc3RNb2RpZmllZCBkYXRlIn0sCi0gICAgeyJDYWNoZUdjSW50ZXJ2YWwiLCBzZXRfY2FjaGVfZ2NpbnQsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICAgICJUaGUgaW50ZXJ2YWwgYmV0d2VlbiBnYXJiYWdlIGNvbGxlY3Rpb25zLCBpbiBob3VycyJ9LAotICAgIHsiQ2FjaGVEaXJMZXZlbHMiLCBzZXRfY2FjaGVfZGlybGV2ZWxzLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAgICAiVGhlIG51bWJlciBvZiBsZXZlbHMgb2Ygc3ViZGlyZWN0b3JpZXMgaW4gdGhlIGNhY2hlIn0sCi0gICAgeyJDYWNoZURpckxlbmd0aCIsIHNldF9jYWNoZV9kaXJsZW5ndGgsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICAgICJUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gc3ViZGlyZWN0b3J5IG5hbWVzIn0sCi0gICAgeyJOb0NhY2hlIiwgc2V0X2NhY2hlX2V4Y2x1ZGUsIE5VTEwsIFJTUkNfQ09ORiwgSVRFUkFURSwKLSAgICAgIkEgbGlzdCBvZiBuYW1lcywgaG9zdHMgb3IgZG9tYWlucyBmb3Igd2hpY2ggY2FjaGluZyBpcyAqbm90KiBwcm92aWRlZCJ9LAotICAgIHsiQ2FjaGVGb3JjZUNvbXBsZXRpb24iLCBzZXRfY2FjaGVfY29tcGxldGlvbiwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAgIkZvcmNlIGEgaHR0cCBjYWNoZSBjb21wbGV0aW9uIGFmdGVyIHRoaXMgcGVyY2VudGFnZSBpcyBsb2FkZWQifSwKLSAgICB7IlByb3h5VmlhIiwgc2V0X3ZpYV9vcHQsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICAgICJDb25maWd1cmUgVmlhOiBwcm94eSBoZWFkZXIgaGVhZGVyIHRvIG9uZSBvZjogb24gfCBvZmYgfCBibG9jayB8IGZ1bGwifSwKLSAgICB7TlVMTH0KLX07Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBwcm94eV9tb2R1bGUgPQotewotICAgIFNUQU5EQVJEX01PRFVMRV9TVFVGRiwKLSAgICBwcm94eV9pbml0LAkJCS8qIGluaXRpYWxpemVyICovCi0gICAgTlVMTCwJCQkvKiBjcmVhdGUgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlICovCi0gICAgTlVMTCwJCQkvKiBtZXJnZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgY3JlYXRlX3Byb3h5X2NvbmZpZywJLyogY3JlYXRlIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZSAqLwotICAgIE5VTEwsCQkJLyogbWVyZ2UgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIHByb3h5X2NtZHMsCQkJLyogY29tbWFuZCBhcF90YWJsZV90ICovCi0gICAgcHJveHlfaGFuZGxlcnMsCQkvKiBoYW5kbGVycyAqLwotICAgIHByb3h5X3RyYW5zLAkJLyogdHJhbnNsYXRlX2hhbmRsZXIgKi8KLSAgICBOVUxMLAkJCS8qIGNoZWNrX3VzZXJfaWQgKi8KLSAgICBOVUxMLAkJCS8qIGNoZWNrIGF1dGggKi8KLSAgICBOVUxMLAkJCS8qIGNoZWNrIGFjY2VzcyAqLwotICAgIE5VTEwsCQkJLyogdHlwZV9jaGVja2VyICovCi0gICAgcHJveHlfZml4dXAsCQkvKiBwcmUtcnVuIGZpeHVwcyAqLwotICAgIE5VTEwsCQkJLyogbG9nZ2VyICovCi0gICAgTlVMTCwJCQkvKiBoZWFkZXIgcGFyc2VyICovCi0gICAgTlVMTCwJCQkvKiBjaGlsZF9pbml0ICovCi0gICAgTlVMTCwJCQkvKiBjaGlsZF9leGl0ICovCi0gICAgcHJveHlfZGV0ZWN0CQkvKiBwb3N0IHJlYWQtcmVxdWVzdCAqLwotfTsKZGlmZiAtLWdpdCBhL21vZHVsZXMvcHJveHkvbW9kX3Byb3h5LmRzcCBiL21vZHVsZXMvcHJveHkvbW9kX3Byb3h5LmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVlNWNmMy4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3Byb3h5L21vZF9wcm94eS5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJBcGFjaGVNb2R1bGVQcm94eSIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNS4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIgMHgwMTAyCi0KLUNGRz1BcGFjaGVNb2R1bGVQcm94eSAtIFdpbjMyIFJlbGVhc2UKLSFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiQXBhY2hlTW9kdWxlUHJveHkubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJBcGFjaGVNb2R1bGVQcm94eS5tYWsiXAotIENGRz0iQXBhY2hlTW9kdWxlUHJveHkgLSBXaW4zMiBSZWxlYXNlIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgIkFwYWNoZU1vZHVsZVByb3h5IC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAiQXBhY2hlTW9kdWxlUHJveHkgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotTVRMPW1pZGwuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gIkFwYWNoZU1vZHVsZVByb3h5IC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIi5cQXBhY2hlTW8iCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICIuXEFwYWNoZU1vIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIi5cUmVsZWFzZSIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuXFJlbGVhc2UiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKLSMgQUREIENQUCAvbm9sb2dvIC9NRCAvVzMgL0dYIC9PMiAvSSAiLi5cLi5caW5jbHVkZSIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX1dJTkRPV1MiIC9EICJTSEFSRURfTU9EVUxFIiAvRCAiV0lOMzJfTEVBTl9BTkRfTUVBTiIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvd2luMzIKLSMgQUREIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzIKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIgLi5cLi5cQ29yZVJcQXBhY2hlQ29yZS5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIHdzMl8zMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvbWFjaGluZTpJMzg2Ci0KLSFFTFNFSUYgICIkKENGRykiID09ICJBcGFjaGVNb2R1bGVQcm94eSAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiLlxBcGFjaGVNMCIKLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIi5cQXBhY2hlTTAiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiLlxEZWJ1ZyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuXERlYnVnIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1ppIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTURkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uXC4uXGluY2x1ZGUiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9XSU5ET1dTIiAvRCAiU0hBUkVEX01PRFVMRSIgL0QgIldJTjMyX0xFQU5fQU5EX01FQU4iIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyCi0jIEFERCBCQVNFIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiAuLlwuLlxDb3JlRFxBcGFjaGVDb3JlLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgd3MyXzMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsIC9kZWJ1ZyAvbWFjaGluZTpJMzg2Ci0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJBcGFjaGVNb2R1bGVQcm94eSAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgIkFwYWNoZU1vZHVsZVByb3h5IC0gV2luMzIgRGVidWciCi0jIEJlZ2luIEdyb3VwICJTb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtocGo7YmF0O2ZvcjtmOTAiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXG1vZF9wcm94eS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxwcm94eV9jYWNoZS5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxwcm94eV9jb25uZWN0LmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHByb3h5X2Z0cC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9Llxwcm94eV9odHRwLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXHByb3h5X3V0aWwuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgRW5kIEdyb3VwCi0jIEJlZ2luIEdyb3VwICJIZWFkZXIgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaDtocHA7aHh4O2htO2lubDtmaTtmZCIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cbW9kX3Byb3h5LmgKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiCi0KLSMgUFJPUCBEZWZhdWx0X0ZpbHRlciAiaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO2NudDtydGY7Z2lmO2pwZztqcGVnO2pwZSIKLSMgRW5kIEdyb3VwCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL21vZHVsZXMvcHJveHkvbW9kX3Byb3h5LmggYi9tb2R1bGVzL3Byb3h5L21vZF9wcm94eS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzA2NGUzLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvcHJveHkvbW9kX3Byb3h5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaWZuZGVmIE1PRF9QUk9YWV9ICi0jZGVmaW5lIE1PRF9QUk9YWV9IIAotCi0vKgotICogTWFpbiBpbmNsdWRlIGZpbGUgZm9yIHRoZSBBcGFjaGUgcHJveHkKLSAqLwotCi0vKgotCi0gICBOb3RlIHRoYXQgdGhlIEV4cGxhaW4oKSBzdHVmZiBpcyBub3QgeWV0IGNvbXBsZXRlLgotICAgQWxzbyBub3RlIG51bWVyb3VzIEZJWE1FcyBhbmQgQ0hFQ0tNRXMgd2hpY2ggc2hvdWxkIGJlIGVsaW1pbmF0ZWQuCi0KLSAgIElmIFRFU1RJTkcgaXMgc2V0LCB0aGVuIGdhcmJhZ2UgY29sbGVjdGlvbiBkb2Vzbid0IGRlbGV0ZSAuLi4gcHJvYmFibHkgYSBnb29kCi0gICBpZGVhIHdoZW4gaGFja2luZy4KLQotICAgVGhpcyBjb2RlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCEKLQotICAgVGhpbmdzIHRvIGRvOgotCi0gICAxLiBNYWtlIGl0IGdhcmJhZ2UgY29sbGVjdCBpbiB0aGUgYmFja2dyb3VuZCwgbm90IHdoaWxlIHNvbWVvbmUgaXMgd2FpdGluZyBmb3IKLSAgIGEgcmVzcG9uc2UhCi0KLSAgIDIuIENoZWNrIHRoZSBsb2dpYyB0aG9yb3VnaGx5LgotCi0gICAzLiBFbXB0eSBkaXJlY3RvcmllcyBhcmUgb25seSByZW1vdmVkIHRoZSBuZXh0IHRpbWUgcm91bmQgKGJ1dCB0aGlzIGRvZXMgYXZvaWQKLSAgIHR3byBwYXNzZXMpLiBDb25zaWRlciBkb2luZyB0aGVtIHRoZSBmaXJzdCB0aW1lIHJvdW5kLgotCi0gICBCZW4gTGF1cmllIDxiZW5AYWxncm91cC5jby51az4gMzAgTWFyIDk2Ci0KLSAgIE1vcmUgdGhpbmdzIHRvIGRvOgotCi0gICAwLiBDb2RlIGNsZWFudXAgKG9uZ29pbmcpCi0KLSAgIDEuIGFkZCAyMzAgcmVzcG9uc2Ugb3V0cHV0IGZvciBmdHAgbm93IHRoYXQgaXQgd29ya3MKLQotICAgMi4gTWFrZSB0aGUgZnRwIHByb3h5IHRyYW5zcGFyZW50LCBhbHNvIHNhbWUgd2l0aCAoZnV0dXJlKSBnb3BoZXIgJiB3YWlzCi0KLSAgIDMuIFVzZSBwcm90b2NvbCBoYW5kbGVyIHN0cnVjdCBhIGxhIEFwYWNoZSBtb2R1bGUgaGFuZGxlcnMgKERpcmsgdmFuIEd1bGlrKQotCi0gICA0LiBVc2UgYSBjYWNoZSBleHBpcnkgZGF0YWJhc2UgZm9yIG1vcmUgZWZmaWNpZW50IEdDIChKZXJlbXkgV29obCkKLQotICAgNS4gQnVsbGV0cHJvb2YgR0MgYWdhaW5zdCBTSUdBTFJNCi0KLSAgIENodWNrIE11cmNrbyA8Y2h1Y2tAdG9wc2FpbC5vcmc+IDE1IEFwcmlsIDE5OTcKLQotICovCi0KLSNkZWZpbmUgVEVTVElORwkwCi0jdW5kZWYgRVhQTEFJTgotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLQotI2luY2x1ZGUgImV4cGxhaW4uaCIKLQotZXh0ZXJuIG1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBwcm94eV9tb2R1bGU7Ci0KLQotLyogZm9yIHByb3h5X2Nhbm9uZW5jKCkgKi8KLWVudW0gZW5jdHlwZSB7Ci0gICAgZW5jX3BhdGgsIGVuY19zZWFyY2gsIGVuY191c2VyLCBlbmNfZnBhdGgsIGVuY19wYXJtCi19OwotCi0jZGVmaW5lIEhEUl9BUFAgKDApCQkvKiBhcHBlbmQgaGVhZGVyLCBmb3IgcHJveHlfYWRkX2hlYWRlcigpICovCi0jZGVmaW5lIEhEUl9SRVAgKDEpCQkvKiByZXBsYWNlIGhlYWRlciwgZm9yIHByb3h5X2FkZF9oZWFkZXIoKSAqLwotCi0vKiBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgaGFzaCAqLwotI2RlZmluZSBIQVNIX0xFTiAoMjIqMikKLQotLyogbWF4aW11bSAgJ0NhY2hlRGlyTGV2ZWxzKkNhY2hlRGlyTGVuZ3RoJyB2YWx1ZSAqLwotI2RlZmluZSBDQUNIRUZJTEVfTEVOIDIwCS8qIG11c3QgYmUgbGVzcyB0aGFuIEhBU0hfTEVOLzIgKi8KLQotI2lmZGVmIENIQVJTRVRfRUJDRElDCi0jZGVmaW5lIENSTEYgICAiXHJcbiIKLSNlbHNlIC8qQ0hBUlNFVF9FQkNESUMqLwotI2RlZmluZSBDUkxGICAgIlwwMTVcMDEyIgotI2VuZGlmIC8qQ0hBUlNFVF9FQkNESUMqLwotCi0KLSNkZWZpbmUJU0VDX09ORV9EQVkJCTg2NDAwCS8qIG9uZSBkYXksIGluIHNlY29uZHMgKi8KLSNkZWZpbmUJU0VDX09ORV9IUgkJMzYwMAkvKiBvbmUgaG91ciwgaW4gc2Vjb25kcyAqLwotCi0jZGVmaW5lCURFRkFVTFRfRlRQX0RBVEFfUE9SVAkyMAotI2RlZmluZQlERUZBVUxUX0ZUUF9QT1JUCTIxCi0jZGVmaW5lCURFRkFVTFRfR09QSEVSX1BPUlQJNzAKLSNkZWZpbmUJREVGQVVMVF9OTlRQX1BPUlQJMTE5Ci0jZGVmaW5lCURFRkFVTFRfV0FJU19QT1JUCTIxMAotI2RlZmluZQlERUZBVUxUX0hUVFBTX1BPUlQJNDQzCi0jZGVmaW5lCURFRkFVTFRfU05FV1NfUE9SVAk1NjMKLSNkZWZpbmUJREVGQVVMVF9QUk9TUEVST19QT1JUCTE1MjUJLyogV0FSTklORzogY29uZmxpY3Qgdy9PcmFjbGUgKi8KLQotLyogU29tZSBXV1cgc2NoZW1lcyBhbmQgdGhlaXIgZGVmYXVsdCBwb3J0czsgdGhpcyBpcyBiYXNpY2FsbHkgL2V0Yy9zZXJ2aWNlcyAqLwotc3RydWN0IHByb3h5X3NlcnZpY2VzIHsKLSAgICBjb25zdCBjaGFyICpzY2hlbWU7Ci0gICAgaW50IHBvcnQ7Ci19OwotCi0vKiBzdGF0aWMgaW5mb3JtYXRpb24gYWJvdXQgYSByZW1vdGUgcHJveHkgKi8KLXN0cnVjdCBwcm94eV9yZW1vdGUgewotICAgIGNvbnN0IGNoYXIgKnNjaGVtZTsJCS8qIHRoZSBzY2hlbWVzIGhhbmRsZWQgYnkgdGhpcyBwcm94eSwgb3IgJyonICovCi0gICAgY29uc3QgY2hhciAqcHJvdG9jb2w7CS8qIHRoZSBzY2hlbWUgdXNlZCB0byB0YWxrIHRvIHRoaXMgcHJveHkgKi8KLSAgICBjb25zdCBjaGFyICpob3N0bmFtZTsJLyogdGhlIGhvc3RuYW1lIG9mIHRoaXMgcHJveHkgKi8KLSAgICBpbnQgcG9ydDsJCQkvKiB0aGUgcG9ydCBmb3IgdGhpcyBwcm94eSAqLwotfTsKLQotc3RydWN0IHByb3h5X2FsaWFzIHsKLSAgICBjaGFyICpyZWFsOwotICAgIGNoYXIgKmZha2U7Ci19OwotCi1zdHJ1Y3QgZGlyY29ubl9lbnRyeSB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBzdHJ1Y3QgaW5fYWRkciBhZGRyLCBtYXNrOwotICAgIHN0cnVjdCBob3N0ZW50ICpob3N0ZW50cnk7Ci0gICAgaW50ICgqbWF0Y2hlcikgKHN0cnVjdCBkaXJjb25uX2VudHJ5ICogVGhpcywgcmVxdWVzdF9yZWMgKnIpOwotfTsKLQotc3RydWN0IG5vcHJveHlfZW50cnkgewotICAgIGNoYXIgKm5hbWU7Ci0gICAgc3RydWN0IGluX2FkZHIgYWRkcjsKLX07Ci0KLXN0cnVjdCBub2NhY2hlX2VudHJ5IHsKLSAgICBjaGFyICpuYW1lOwotICAgIHN0cnVjdCBpbl9hZGRyIGFkZHI7Ci19OwotCi0jZGVmaW5lIERFRkFVTFRfQ0FDSEVfU1BBQ0UgNQotI2RlZmluZSBERUZBVUxUX0NBQ0hFX01BWEVYUElSRSBTRUNfT05FX0RBWQotI2RlZmluZSBERUZBVUxUX0NBQ0hFX0VYUElSRSAgICBTRUNfT05FX0hSCi0jZGVmaW5lIERFRkFVTFRfQ0FDSEVfTE1GQUNUT1IgKDAuMSkKLSNkZWZpbmUgREVGQVVMVF9DQUNIRV9DT01QTEVUSU9OICgwLjkpCi0KLS8qIHN0YXRpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9jYWwgY2FjaGUgKi8KLXN0cnVjdCBjYWNoZV9jb25mIHsKLSAgICBjb25zdCBjaGFyICpyb290OwkJLyogdGhlIGxvY2F0aW9uIG9mIHRoZSBjYWNoZSBkaXJlY3RvcnkgKi8KLSAgICBvZmZfdCBzcGFjZTsJCQkvKiBNYXhpbXVtIGNhY2hlIHNpemUgKGluIDEwMjQgYnl0ZXMpICovCi0gICAgdGltZV90IG1heGV4cGlyZTsJCS8qIE1heGltdW0gdGltZSB0byBrZWVwIGNhY2hlZCBmaWxlcyBpbiBzZWNzICovCi0gICAgdGltZV90IGRlZmF1bHRleHBpcmU7CS8qIGRlZmF1bHQgdGltZSB0byBrZWVwIGNhY2hlZCBmaWxlIGluIHNlY3MgKi8KLSAgICBkb3VibGUgbG1mYWN0b3I7CQkvKiBmYWN0b3IgZm9yIGVzdGltYXRpbmcgZXhwaXJlcyBkYXRlICovCi0gICAgdGltZV90IGdjaW50ZXJ2YWw7CQkvKiBnYXJiYWdlIGNvbGxlY3Rpb24gaW50ZXJ2YWwsIGluIHNlY29uZHMgKi8KLSAgICBpbnQgZGlybGV2ZWxzOwkJLyogTnVtYmVyIG9mIGxldmVscyBvZiBzdWJkaXJlY3RvcmllcyAqLwotICAgIGludCBkaXJsZW5ndGg7CQkvKiBMZW5ndGggb2Ygc3ViZGlyZWN0b3J5IG5hbWVzICovCi0gICAgZmxvYXQgY2FjaGVfY29tcGxldGlvbjsJLyogRm9yY2UgY2FjaGUgY29tcGxldGlvbiBhZnRlciB0aGlzIHBvaW50ICovCi19OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgc3RydWN0IGNhY2hlX2NvbmYgY2FjaGU7CS8qIGNhY2hlIGNvbmZpZ3VyYXRpb24gKi8KLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqcHJveGllczsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqYWxpYXNlczsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqcmFsaWFzZXM7Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKm5vcHJveGllczsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqZGlyY29ubjsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqbm9jYWNoZXM7Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmFsbG93ZWRfY29ubmVjdF9wb3J0czsKLSAgICBjaGFyICpkb21haW47CQkvKiBkb21haW4gbmFtZSB0byB1c2UgaW4gYWJzZW5jZSBvZiBhIGRvbWFpbiBuYW1lIGluIHRoZSByZXF1ZXN0ICovCi0gICAgaW50IHJlcTsJCQkvKiB0cnVlIGlmIHByb3h5IHJlcXVlc3RzIGFyZSBlbmFibGVkICovCi0gICAgZW51bSB7Ci0gICAgICB2aWFfb2ZmLAotICAgICAgdmlhX29uLAotICAgICAgdmlhX2Jsb2NrLAotICAgICAgdmlhX2Z1bGwKLSAgICB9IHZpYW9wdDsgICAgICAgICAgICAgICAgICAgLyogaG93IHRvIGRlYWwgd2l0aCBwcm94eSBWaWE6IGhlYWRlcnMgKi8KLSAgICBzaXplX3QgcmVjdl9idWZmZXJfc2l6ZTsKLX0gcHJveHlfc2VydmVyX2NvbmY7Ci0KLXN0cnVjdCBoZHJfZW50cnkgewotICAgIGNvbnN0IGNoYXIgKmZpZWxkOwotICAgIGNvbnN0IGNoYXIgKnZhbHVlOwotfTsKLQotLyogY2FjaGluZyBpbmZvcm1hdGlvbiBhYm91dCBhIHJlcXVlc3QgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICByZXF1ZXN0X3JlYyAqcmVxOwkJLyogdGhlIHJlcXVlc3QgKi8KLSAgICBjaGFyICp1cmw7CQkJLyogdGhlIFVSTCByZXF1ZXN0ZWQgKi8KLSAgICBjaGFyICpmaWxlbmFtZTsJCS8qIG5hbWUgb2YgdGhlIGNhY2hlIGZpbGUsIG9yIE5VTEwgaWYgbm8gY2FjaGUgKi8KLSAgICBjaGFyICp0ZW1wZmlsZTsJCS8qIG5hbWUgb2YgdGhlIHRlbXBvcmFyeSBmaWxlLCBvZiBOVUxMIGlmIG5vdCBjYWNoaW5nICovCi0gICAgdGltZV90IGltczsJCQkvKiBpZi1tb2RpZmllZC1zaW5jZSBkYXRlIG9mIHJlcXVlc3Q7IC0xIGlmIG5vIGhlYWRlciAqLwotICAgIEJVRkYgKmZwOwkJCS8qIHRoZSBjYWNoZSBmaWxlIGRlc2NyaXB0b3IgaWYgdGhlIGZpbGUgaXMgY2FjaGVkCi0JCQkJICAgYW5kIG1heSBiZSByZXR1cm5lZCwgb3IgTlVMTCBpZiB0aGUgZmlsZSBpcwotCQkJCSAgIG5vdCBjYWNoZWQgKG9yIG11c3QgYmUgcmVsb2FkZWQpICovCi0gICAgdGltZV90IGV4cGlyZTsJCS8qIGNhbGN1bGF0ZWQgZXhwaXJlIGRhdGUgb2YgY2FjaGVkIGVudGl0eSAqLwotICAgIHRpbWVfdCBsbW9kOwkJLyogbGFzdC1tb2RpZmllZCBkYXRlIG9mIGNhY2hlZCBlbnRpdHkgKi8KLSAgICB0aW1lX3QgZGF0ZTsJCS8qIHRoZSBkYXRlIHRoZSBjYWNoZWQgZmlsZSB3YXMgbGFzdCB0b3VjaGVkICovCi0gICAgaW50IHZlcnNpb247CQkvKiB1cGRhdGUgY291bnQgb2YgdGhlIGZpbGUgKi8KLSAgICBvZmZfdCBsZW47CQkJLyogY29udGVudCBsZW5ndGggKi8KLSAgICBjaGFyICpwcm90b2NvbDsJCS8qIFByb3RvY29sLCBhbmQgbWFqb3IvbWlub3IgbnVtYmVyLCBlLmcuIEhUVFAvMS4xICovCi0gICAgaW50IHN0YXR1czsJCQkvKiB0aGUgc3RhdHVzIG9mIHRoZSBjYWNoZWQgZmlsZSAqLwotICAgIHVuc2lnbmVkIGludCB3cml0dGVuOwkvKiB0b3RhbCAqY29udGVudCogYnl0ZXMgd3JpdHRlbiB0byBjYWNoZSAqLwotICAgIGZsb2F0IGNhY2hlX2NvbXBsZXRpb247CS8qIHNwZWNpZmljIHRvIHRoaXMgcmVxdWVzdCAqLwotICAgIGNoYXIgKnJlc3BfbGluZTsJCS8qIHRoZSB3aG9sZSBzdGF0dXMgbGlrZSAocHJvdG9jb2wsIGNvZGUgKyBtZXNzYWdlKSAqLwotICAgIGFwX3RhYmxlX3QgKmhkcnM7CQkvKiB0aGUgSFRUUCBoZWFkZXJzIG9mIHRoZSBmaWxlICovCi19IGNhY2hlX3JlcTsKLQotLyogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIGNhbGxlZCBieSBhcF90YWJsZV9kbygpICovCi1zdHJ1Y3QgdGJsX2RvX2FyZ3MgewotICAgIHJlcXVlc3RfcmVjICpyZXE7Ci0gICAgY2FjaGVfcmVxICpjYWNoZTsKLX07Ci0KLS8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLQotLyogcHJveHlfY2FjaGUuYyAqLwotCi12b2lkIGFwX3Byb3h5X2NhY2hlX3RpZHkoY2FjaGVfcmVxICpjKTsKLWludCBhcF9wcm94eV9jYWNoZV9jaGVjayhyZXF1ZXN0X3JlYyAqciwgY2hhciAqdXJsLCBzdHJ1Y3QgY2FjaGVfY29uZiAqY29uZiwKLQkJICAgICAgY2FjaGVfcmVxICoqY3IpOwotaW50IGFwX3Byb3h5X2NhY2hlX3VwZGF0ZShjYWNoZV9yZXEgKmMsIGFwX3RhYmxlX3QgKnJlc3BfaGRycywKLQkJICAgICAgIGNvbnN0IGludCBpc19IVFRQMSwgaW50IG5vY2FjaGUpOwotdm9pZCBhcF9wcm94eV9nYXJiYWdlX2NvbGwocmVxdWVzdF9yZWMgKnIpOwotCi0vKiBwcm94eV9jb25uZWN0LmMgKi8KLQotaW50IGFwX3Byb3h5X2Nvbm5lY3RfaGFuZGxlcihyZXF1ZXN0X3JlYyAqciwgY2FjaGVfcmVxICpjLCBjaGFyICp1cmwsCi0JCQkgIGNvbnN0IGNoYXIgKnByb3h5aG9zdCwgaW50IHByb3h5cG9ydCk7Ci0KLS8qIHByb3h5X2Z0cC5jICovCi0KLWludCBhcF9wcm94eV9mdHBfY2Fub24ocmVxdWVzdF9yZWMgKnIsIGNoYXIgKnVybCk7Ci1pbnQgYXBfcHJveHlfZnRwX2hhbmRsZXIocmVxdWVzdF9yZWMgKnIsIGNhY2hlX3JlcSAqYywgY2hhciAqdXJsKTsKLQotLyogcHJveHlfaHR0cC5jICovCi0KLWludCBhcF9wcm94eV9odHRwX2Nhbm9uKHJlcXVlc3RfcmVjICpyLCBjaGFyICp1cmwsIGNvbnN0IGNoYXIgKnNjaGVtZSwKLQkJICAgICBpbnQgZGVmX3BvcnQpOwotaW50IGFwX3Byb3h5X2h0dHBfaGFuZGxlcihyZXF1ZXN0X3JlYyAqciwgY2FjaGVfcmVxICpjLCBjaGFyICp1cmwsCi0JCSAgICAgICBjb25zdCBjaGFyICpwcm94eWhvc3QsIGludCBwcm94eXBvcnQpOwotCi0vKiBwcm94eV91dGlsLmMgKi8KLQotaW50IGFwX3Byb3h5X2hleDJjKGNvbnN0IGNoYXIgKngpOwotdm9pZCBhcF9wcm94eV9jMmhleChpbnQgY2gsIGNoYXIgKngpOwotY2hhciAqYXBfcHJveHlfY2Fub25lbmMoYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyICp4LCBpbnQgbGVuLCBlbnVtIGVuY3R5cGUgdCwKLQkJICAgICBpbnQgaXNlbmMpOwotY2hhciAqYXBfcHJveHlfY2Fub25fbmV0bG9jKGFwX2NvbnRleHRfdCAqcCwgY2hhciAqKmNvbnN0IHVybHAsIGNoYXIgKip1c2VycCwKLQkJCSBjaGFyICoqcGFzc3dvcmRwLCBjaGFyICoqaG9zdHAsIGludCAqcG9ydCk7Ci1jb25zdCBjaGFyICphcF9wcm94eV9kYXRlX2Nhbm9uKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqeCk7Ci10YWJsZSAqYXBfcHJveHlfcmVhZF9oZWFkZXJzKHJlcXVlc3RfcmVjICpyLCBjaGFyICpidWZmZXIsIGludCBzaXplLCBCVUZGICpmKTsKLWxvbmcgaW50IGFwX3Byb3h5X3NlbmRfZmIoQlVGRiAqZiwgcmVxdWVzdF9yZWMgKnIsIGNhY2hlX3JlcSAqYyk7Ci12b2lkIGFwX3Byb3h5X3NlbmRfaGVhZGVycyhyZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqcmVzcGxpbmUsIGFwX3RhYmxlX3QgKmhkcnMpOwotaW50IGFwX3Byb3h5X2xpc3RzdHIoY29uc3QgY2hhciAqbGlzdCwgY29uc3QgY2hhciAqdmFsKTsKLXZvaWQgYXBfcHJveHlfaGFzaChjb25zdCBjaGFyICppdCwgY2hhciAqdmFsLCBpbnQgbmRlcHRoLCBpbnQgbmxlbmd0aCk7Ci1pbnQgYXBfcHJveHlfaGV4MnNlYyhjb25zdCBjaGFyICp4KTsKLXZvaWQgYXBfcHJveHlfc2VjMmhleChpbnQgdCwgY2hhciAqeSk7Ci1jYWNoZV9yZXEgKmFwX3Byb3h5X2NhY2hlX2Vycm9yKGNhY2hlX3JlcSAqcik7Ci1pbnQgYXBfcHJveHllcnJvcihyZXF1ZXN0X3JlYyAqciwgaW50IHN0YXR1c2NvZGUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpOwotY29uc3QgY2hhciAqYXBfcHJveHlfaG9zdDJhZGRyKGNvbnN0IGNoYXIgKmhvc3QsIHN0cnVjdCBob3N0ZW50ICpyZXFocCk7Ci1pbnQgYXBfcHJveHlfaXNfaXBhZGRyKHN0cnVjdCBkaXJjb25uX2VudHJ5ICpUaGlzLCBhcF9jb250ZXh0X3QgKnApOwotaW50IGFwX3Byb3h5X2lzX2RvbWFpbm5hbWUoc3RydWN0IGRpcmNvbm5fZW50cnkgKlRoaXMsIGFwX2NvbnRleHRfdCAqcCk7Ci1pbnQgYXBfcHJveHlfaXNfaG9zdG5hbWUoc3RydWN0IGRpcmNvbm5fZW50cnkgKlRoaXMsIGFwX2NvbnRleHRfdCAqcCk7Ci1pbnQgYXBfcHJveHlfaXNfd29yZChzdHJ1Y3QgZGlyY29ubl9lbnRyeSAqVGhpcywgYXBfY29udGV4dF90ICpwKTsKLWludCBhcF9wcm94eV9kb2Nvbm5lY3QoaW50IHNvY2ssIHN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkciwgcmVxdWVzdF9yZWMgKnIpOwotaW50IGFwX3Byb3h5X2dhcmJhZ2VfaW5pdChzZXJ2ZXJfcmVjICosIGFwX2NvbnRleHRfdCAqKTsKLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGFwX3RhYmxlX2RvKCkgZm9yIGFsbCBoZWFkZXIgbGluZXMgKi8KLWludCBhcF9wcm94eV9zZW5kX2hkcl9saW5lKHZvaWQgKnAsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUpOwotdW5zaWduZWQgYXBfcHJveHlfYnB1dHMyKGNvbnN0IGNoYXIgKmRhdGEsIEJVRkYgKmNsaWVudCwgY2FjaGVfcmVxICpjYWNoZSk7Ci0KLSNlbmRpZiAvKk1PRF9QUk9YWV9IKi8KZGlmZiAtLWdpdCBhL21vZHVsZXMvcHJveHkvcHJveHlfY29ubmVjdC5jIGIvbW9kdWxlcy9wcm94eS9wcm94eV9jb25uZWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMjAzZjIuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9wcm94eS9wcm94eV9jb25uZWN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKiBDT05ORUNUIG1ldGhvZCBmb3IgQXBhY2hlIHByb3h5ICovCi0KLSNpbmNsdWRlICJtb2RfcHJveHkuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotCi0jaWZkZWYgSEFWRV9CU1RSSU5HX0gKLSNpbmNsdWRlIDxic3RyaW5nLmg+CQkvKiBmb3IgSVJJWCwgRkRfU0VUIGNhbGxzIGJ6ZXJvKCkgKi8KLSNlbmRpZgotCi1ERUZfRXhwbGFpbgotCi0vKiAgCi0gKiBUaGlzIGhhbmRsZXMgTmV0c2NhcGUgQ09OTkVDVCBtZXRob2Qgc2VjdXJlIHByb3h5IHJlcXVlc3RzLgotICogQSBjb25uZWN0aW9uIGlzIG9wZW5lZCB0byB0aGUgc3BlY2lmaWVkIGhvc3QgYW5kIGRhdGEgaXMKLSAqIHBhc3NlZCB0aHJvdWdoIGJldHdlZW4gdGhlIFdXVyBzaXRlIGFuZCB0aGUgYnJvd3Nlci4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIElOVEVSTkVULURSQUZUIGRvY3VtZW50Ci0gKiAiVHVubmVsaW5nIFNTTCBUaHJvdWdoIGEgV1dXIFByb3h5IiBjdXJyZW50bHkgYXQKLSAqIGh0dHA6Ly93d3cubWNvbS5jb20vbmV3c3JlZi9zdGQvdHVubmVsaW5nX3NzbC5odG1sLgotICoKLSAqIElmIHByb3h5aG9zdCBhbmQgcHJveHlwb3J0IGFyZSBzZXQsIHdlIHNlbmQgYSBDT05ORUNUIHRvIAotICogdGhlIHNwZWNpZmllZCBwcm94eS4uICAKLSAqCi0gKiBGSVhNRTogdGhpcyBpcyBiYWQsIGJlY2F1c2UgaXQgZG9lcyBpdHMgb3duIHNvY2tldCBJL08KLSAqICAgICAgICBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBJL08gaW4gYnVmZi5jLiAgSG93ZXZlciwKLSAqICAgICAgICB0aGUgSS9PIGluIGJ1ZmYuYyBibG9ja3Mgb24gcmVhZHMsIGFuZCBiZWNhdXNlCi0gKiAgICAgICAgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGtub3cgaG93IG11Y2ggZGF0YSB3aWxsCi0gKiAgICAgICAgYmUgc2VudCBlaXRoZXIgd2F5IChvciB3aGVuKSBpdCBjYW4ndCB1c2UgYmxvY2tpbmcKLSAqICAgICAgICBJL08uICBUaGlzIG1heSBiZSB2ZXJ5IGltcGxlbWVudGF0aW9uLXNwZWNpZmljCi0gKiAgICAgICAgKHRvIExpbnV4KS4gIEFueSBzdWdnZXN0aW9ucz8KLSAqIEZJWE1FOiB0aGlzIGRvZXNuJ3QgbG9nIHRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudCwgYnV0Ci0gKiAgICAgICAgdGhhdCBtYXkgYmUgb2theSwgc2luY2UgdGhlIGRhdGEgaXMgc3VwcG9zZWQgdG8KLSAqICAgICAgICBiZSB0cmFuc3BhcmVudC4gSW4gZmFjdCwgdGhpcyBkb2Vzbid0IGxvZyBhdCBhbGwKLSAqICAgICAgICB5ZXQuIDheKQotICogRklYTUU6IGRvZXNuJ3QgY2hlY2sgYW55IGhlYWRlcnMgaW5pdGFsbHkgc2VudCBmcm9tIHRoZQotICogICAgICAgIGNsaWVudC4KLSAqIEZJWE1FOiBzaG91bGQgYWxsb3cgYXV0aGVudGljYXRpb24sIGJ1dCBob3BlZnVsbHkgdGhlCi0gKiAgICAgICAgZ2VuZXJpYyBwcm94eSBhdXRoZW50aWNhdGlvbiBpcyBnb29kIGVub3VnaC4KLSAqIEZJWE1FOiBubyBjaGVjayBmb3Igci0+YXNzYmFja3dhcmRzLCB3aGF0ZXZlciB0aGF0IGlzLgotICovCi0KLXN0YXRpYyBpbnQKLWFsbG93ZWRfcG9ydChwcm94eV9zZXJ2ZXJfY29uZiAqY29uZiwgaW50IHBvcnQpCi17Ci0gICAgaW50IGk7Ci0gICAgaW50ICpsaXN0ID0gKGludCAqKSBjb25mLT5hbGxvd2VkX2Nvbm5lY3RfcG9ydHMtPmVsdHM7Ci0KLSAgICBmb3IoaSA9IDA7IGkgPCBjb25mLT5hbGxvd2VkX2Nvbm5lY3RfcG9ydHMtPm5lbHRzOyBpKyspIHsKLQlpZihwb3J0ID09IGxpc3RbaV0pCi0JICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotCi1pbnQgYXBfcHJveHlfY29ubmVjdF9oYW5kbGVyKHJlcXVlc3RfcmVjICpyLCBjYWNoZV9yZXEgKmMsIGNoYXIgKnVybCwKLQkJCSAgY29uc3QgY2hhciAqcHJveHlob3N0LCBpbnQgcHJveHlwb3J0KQotewotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzZXJ2ZXI7Ci0gICAgc3RydWN0IGluX2FkZHIgZGVzdGFkZHI7Ci0gICAgc3RydWN0IGhvc3RlbnQgc2VydmVyX2hwOwotICAgIGNvbnN0IGNoYXIgKmhvc3QsICplcnI7Ci0gICAgY2hhciAqcDsKLSAgICBpbnQgcG9ydCwgc29jazsKLSAgICBjaGFyIGJ1ZmZlcltIVUdFX1NUUklOR19MRU5dOwotICAgIGludCBuYnl0ZXMsIGksIGo7Ci0gICAgZmRfc2V0IGZkczsKLQotICAgIHZvaWQgKnNjb25mID0gci0+c2VydmVyLT5tb2R1bGVfY29uZmlnOwotICAgIHByb3h5X3NlcnZlcl9jb25mICpjb25mID0KLSAgICAocHJveHlfc2VydmVyX2NvbmYgKikgYXBfZ2V0X21vZHVsZV9jb25maWcoc2NvbmYsICZwcm94eV9tb2R1bGUpOwotICAgIHN0cnVjdCBub3Byb3h5X2VudHJ5ICpucGVudCA9IChzdHJ1Y3Qgbm9wcm94eV9lbnRyeSAqKSBjb25mLT5ub3Byb3hpZXMtPmVsdHM7Ci0KLSAgICBtZW1zZXQoJnNlcnZlciwgJ1wwJywgc2l6ZW9mKHNlcnZlcikpOwotICAgIHNlcnZlci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQotICAgIC8qIEJyZWFrIHRoZSBVUkwgaW50byBob3N0OnBvcnQgcGFpcnMgKi8KLQotICAgIGhvc3QgPSB1cmw7Ci0gICAgcCA9IHN0cmNocih1cmwsICc6Jyk7Ci0gICAgaWYgKHAgPT0gTlVMTCkKLQlwb3J0ID0gREVGQVVMVF9IVFRQU19QT1JUOwotICAgIGVsc2UgewotCXBvcnQgPSBhdG9pKHAgKyAxKTsKLQkqcCA9ICdcMCc7Ci0gICAgfQotCi0vKiBjaGVjayBpZiBQcm94eUJsb2NrIGRpcmVjdGl2ZSBvbiB0aGlzIGhvc3QgKi8KLSAgICBkZXN0YWRkci5zX2FkZHIgPSBhcF9pbmV0X2FkZHIoaG9zdCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGNvbmYtPm5vcHJveGllcy0+bmVsdHM7IGkrKykgewotCWlmICgobnBlbnRbaV0ubmFtZSAhPSBOVUxMICYmIHN0cnN0cihob3N0LCBucGVudFtpXS5uYW1lKSAhPSBOVUxMKQotCSAgICB8fCBkZXN0YWRkci5zX2FkZHIgPT0gbnBlbnRbaV0uYWRkci5zX2FkZHIgfHwgbnBlbnRbaV0ubmFtZVswXSA9PSAnKicpCi0JICAgIHJldHVybiBhcF9wcm94eWVycm9yKHIsIEhUVFBfRk9SQklEREVOLAotCQkJCSAiQ29ubmVjdCB0byByZW1vdGUgbWFjaGluZSBibG9ja2VkIik7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgaWYgaXQgaXMgYW4gYWxsb3dlZCBwb3J0ICovCi0gICAgaWYgKGNvbmYtPmFsbG93ZWRfY29ubmVjdF9wb3J0cy0+bmVsdHMgPT0gMCkgewotCS8qIERlZmF1bHQgc2V0dGluZyBpZiBub3Qgb3ZlcnJpZGRlbiBieSBBbGxvd0NPTk5FQ1QgKi8KLQlzd2l0Y2ggKHBvcnQpIHsKLQkgICAgY2FzZSBERUZBVUxUX0hUVFBTX1BPUlQ6Ci0JICAgIGNhc2UgREVGQVVMVF9TTkVXU19QT1JUOgotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJcmV0dXJuIEhUVFBfRk9SQklEREVOOwotCX0KLSAgICB9IGVsc2UgaWYoIWFsbG93ZWRfcG9ydChjb25mLCBwb3J0KSkKLQlyZXR1cm4gSFRUUF9GT1JCSURERU47Ci0KLSAgICBpZiAocHJveHlob3N0KSB7Ci0JRXhwbGFpbjIoIkNPTk5FQ1QgdG8gcmVtb3RlIHByb3h5ICVzIG9uIHBvcnQgJWQiLCBwcm94eWhvc3QsIHByb3h5cG9ydCk7Ci0gICAgfQotICAgIGVsc2UgewotCUV4cGxhaW4yKCJDT05ORUNUIHRvICVzIG9uIHBvcnQgJWQiLCBob3N0LCBwb3J0KTsKLSAgICB9Ci0KLSAgICBzZXJ2ZXIuc2luX3BvcnQgPSAocHJveHlwb3J0ID8gaHRvbnMocHJveHlwb3J0KSA6IGh0b25zKHBvcnQpKTsKLSAgICBlcnIgPSBhcF9wcm94eV9ob3N0MmFkZHIocHJveHlob3N0ID8gcHJveHlob3N0IDogaG9zdCwgJnNlcnZlcl9ocCk7Ci0KLSAgICBpZiAoZXJyICE9IE5VTEwpCi0JcmV0dXJuIGFwX3Byb3h5ZXJyb3IociwKLQkJCSAgICAgcHJveHlob3N0ID8gSFRUUF9CQURfR0FURVdBWSA6IEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLAotCQkJICAgICBlcnIpOwotCi0gICAgc29jayA9IGFwX3Bzb2NrZXQoci0+cG9vbCwgUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKLSAgICBpZiAoc29jayA9PSAtMSkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotCQkgICAgInByb3h5OiBlcnJvciBjcmVhdGluZyBzb2NrZXQiKTsKLQlyZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgfQotCi0jaWZkZWYgQ0hFQ0tfRkRfU0VUU0laRQotICAgIGlmIChzb2NrID49IEZEX1NFVFNJWkUpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLCBOVUxMLAotCSAgICAicHJveHlfY29ubmVjdF9oYW5kbGVyOiBmaWxlZGVzY3JpcHRvciAoJXUpICIKLQkgICAgImxhcmdlciB0aGFuIEZEX1NFVFNJWkUgKCV1KSAiCi0JICAgICJmb3VuZCwgeW91IHByb2JhYmx5IG5lZWQgdG8gcmVidWlsZCBBcGFjaGUgd2l0aCBhICIKLQkgICAgImxhcmdlciBGRF9TRVRTSVpFIiwgc29jaywgRkRfU0VUU0laRSk7Ci0JYXBfcGNsb3Nlc29ja2V0KHItPnBvb2wsIHNvY2spOwotCXJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGogPSAwOwotICAgIHdoaWxlIChzZXJ2ZXJfaHAuaF9hZGRyX2xpc3Rbal0gIT0gTlVMTCkgewotCW1lbWNweSgmc2VydmVyLnNpbl9hZGRyLCBzZXJ2ZXJfaHAuaF9hZGRyX2xpc3Rbal0sCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOwotCWkgPSBhcF9wcm94eV9kb2Nvbm5lY3Qoc29jaywgJnNlcnZlciwgcik7Ci0JaWYgKGkgPT0gMCkKLQkgICAgYnJlYWs7Ci0JaisrOwotICAgIH0KLSAgICBpZiAoaSA9PSAtMSkgewotCWFwX3BjbG9zZXNvY2tldChyLT5wb29sLCBzb2NrKTsKLQlyZXR1cm4gYXBfcHJveHllcnJvcihyLCBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgYXBfcHN0cmNhdChyLT5wb29sLAotCQkJCQkiQ291bGQgbm90IGNvbm5lY3QgdG8gcmVtb3RlIG1hY2hpbmU6PGJyPiIsCi0JCQkJCXN0cmVycm9yKGVycm5vKSwgTlVMTCkpOwotICAgIH0KLQotICAgIC8qIElmIHdlIGFyZSBjb25uZWN0aW5nIHRocm91Z2ggYSByZW1vdGUgcHJveHksIHdlIG5lZWQgdG8gcGFzcwotICAgICAqIHRoZSBDT05ORUNUIHJlcXVlc3Qgb24gdG8gaXQuCi0gICAgICovCi0gICAgaWYgKHByb3h5cG9ydCkgewotCS8qIEZJWE1FOiBXZSBzaG91bGQgbm90IGJlIGNhbGxpbmcgd3JpdGUoKSBkaXJlY3RseSwgYnV0IHdlIGN1cnJlbnRseQotCSAqIGhhdmUgbm8gYWx0ZXJuYXRpdmUuICBFcnJvciBjaGVja2luZyBpZ25vcmVkLiAgQWxzbywgd2UgZm9yY2UKLQkgKiBhIEhUVFAvMS4wIHJlcXVlc3QgdG8ga2VlcCB0aGluZ3Mgc2ltcGxlLgotCSAqLwotCUV4cGxhaW4wKCJTZW5kaW5nIHRoZSBDT05ORUNUIHJlcXVlc3QgdG8gdGhlIHJlbW90ZSBwcm94eSIpOwotCWFwX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJDT05ORUNUICVzIEhUVFAvMS4wIiBDUkxGLAotCQkgICAgci0+dXJpKTsKLQl3cml0ZShzb2NrLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLQlhcF9zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAotCQkgICAgIlByb3h5LWFnZW50OiAlcyIgQ1JMRiBDUkxGLCBhcF9nZXRfc2VydmVyX3ZlcnNpb24oKSk7Ci0Jd3JpdGUoc29jaywgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgfQotICAgIGVsc2UgewotCUV4cGxhaW4wKCJSZXR1cm5pbmcgMjAwIE9LIFN0YXR1cyIpOwotCWFwX3J2cHV0cyhyLCAiSFRUUC8xLjAgMjAwIENvbm5lY3Rpb24gZXN0YWJsaXNoZWQiIENSTEYsIE5VTEwpOwotCWFwX3J2cHV0cyhyLCAiUHJveHktYWdlbnQ6ICIsIGFwX2dldF9zZXJ2ZXJfdmVyc2lvbigpLCBDUkxGIENSTEYsIE5VTEwpOwotCWFwX2JmbHVzaChyLT5jb25uZWN0aW9uLT5jbGllbnQpOwotICAgIH0KLQotICAgIHdoaWxlICgxKSB7CQkJLyogSW5maW5pdGUgbG9vcCB1bnRpbCBlcnJvciAob25lIHNpZGUgY2xvc2VzIHRoZSBjb25uZWN0aW9uKSAqLwotCUZEX1pFUk8oJmZkcyk7Ci0JRkRfU0VUKHNvY2ssICZmZHMpOwotCUZEX1NFVChyLT5jb25uZWN0aW9uLT5jbGllbnQtPmZkLCAmZmRzKTsKLQotCUV4cGxhaW4wKCJHb2luZyB0byBzbGVlcCAoc2VsZWN0KSIpOwotCWkgPSBhcF9zZWxlY3QoKHItPmNvbm5lY3Rpb24tPmNsaWVudC0+ZmQgPiBzb2NrID8KLQkJICAgICAgIHItPmNvbm5lY3Rpb24tPmNsaWVudC0+ZmQgKyAxIDoKLQkJICAgICAgIHNvY2sgKyAxKSwgJmZkcywgTlVMTCwgTlVMTCwgTlVMTCk7Ci0JRXhwbGFpbjEoIldva2UgZnJvbSBzZWxlY3QoKSwgaT0lZCIsIGkpOwotCi0JaWYgKGkpIHsKLQkgICAgaWYgKEZEX0lTU0VUKHNvY2ssICZmZHMpKSB7Ci0JCUV4cGxhaW4wKCJzb2NrIHdhcyBzZXQiKTsKLQkJaWYgKChuYnl0ZXMgPSByZWFkKHNvY2ssIGJ1ZmZlciwgSFVHRV9TVFJJTkdfTEVOKSkgIT0gMCkgewotCQkgICAgaWYgKG5ieXRlcyA9PSAtMSkKLQkJCWJyZWFrOwotCQkgICAgaWYgKHdyaXRlKHItPmNvbm5lY3Rpb24tPmNsaWVudC0+ZmQsIGJ1ZmZlciwgbmJ5dGVzKSA9PSBFT0YpCi0JCQlicmVhazsKLQkJICAgIEV4cGxhaW4xKCJXcm90ZSAlZCBieXRlcyB0byBjbGllbnQiLCBuYnl0ZXMpOwotCQl9Ci0JCWVsc2UKLQkJICAgIGJyZWFrOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKEZEX0lTU0VUKHItPmNvbm5lY3Rpb24tPmNsaWVudC0+ZmQsICZmZHMpKSB7Ci0JCUV4cGxhaW4wKCJjbGllbnQtPmZkIHdhcyBzZXQiKTsKLQkJaWYgKChuYnl0ZXMgPSByZWFkKHItPmNvbm5lY3Rpb24tPmNsaWVudC0+ZmQsIGJ1ZmZlciwKLQkJCQkgICBIVUdFX1NUUklOR19MRU4pKSAhPSAwKSB7Ci0JCSAgICBpZiAobmJ5dGVzID09IC0xKQotCQkJYnJlYWs7Ci0JCSAgICBpZiAod3JpdGUoc29jaywgYnVmZmVyLCBuYnl0ZXMpID09IEVPRikKLQkJCWJyZWFrOwotCQkgICAgRXhwbGFpbjEoIldyb3RlICVkIGJ5dGVzIHRvIHNlcnZlciIsIG5ieXRlcyk7Ci0JCX0KLQkJZWxzZQotCQkgICAgYnJlYWs7Ci0JICAgIH0KLQkgICAgZWxzZQotCQlicmVhazsJCS8qIE11c3QgYmUgZG9uZSB3YWl0aW5nICovCi0JfQotCWVsc2UKLQkgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgYXBfcGNsb3Nlc29ja2V0KHItPnBvb2wsIHNvY2spOwotCi0gICAgcmV0dXJuIE9LOwotfQpkaWZmIC0tZ2l0IGEvbW9kdWxlcy9wcm94eS9wcm94eV9mdHAuYyBiL21vZHVsZXMvcHJveHkvcHJveHlfZnRwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOTAzMGQuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9wcm94eS9wcm94eV9mdHAuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNDIgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKiBGVFAgcm91dGluZXMgZm9yIEFwYWNoZSBwcm94eSAqLwotCi0jaW5jbHVkZSAibW9kX3Byb3h5LmgiCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLQotI2RlZmluZSBBVVRPREVURUNUX1BXRAotCi1ERUZfRXhwbGFpbgotCi0vKgotICogRGVjb2RlcyBhICclJyBlc2NhcGVkIHN0cmluZywgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzCi0gKi8KLXN0YXRpYyBpbnQgZGVjb2RlZW5jKGNoYXIgKngpCi17Ci0gICAgaW50IGksIGosIGNoOwotCi0gICAgaWYgKHhbMF0gPT0gJ1wwJykKLQlyZXR1cm4gMDsJCS8qIHNwZWNpYWwgY2FzZSBmb3Igbm8gY2hhcmFjdGVycyAqLwotICAgIGZvciAoaSA9IDAsIGogPSAwOyB4W2ldICE9ICdcMCc7IGkrKywgaisrKSB7Ci0vKiBkZWNvZGUgaXQgaWYgbm90IGFscmVhZHkgZG9uZSAqLwotCWNoID0geFtpXTsKLQlpZiAoY2ggPT0gJyUnICYmIGFwX2lzeGRpZ2l0KHhbaSArIDFdKSAmJiBhcF9pc3hkaWdpdCh4W2kgKyAyXSkpIHsKLQkgICAgY2ggPSBhcF9wcm94eV9oZXgyYygmeFtpICsgMV0pOwotCSAgICBpICs9IDI7Ci0JfQotCXhbal0gPSBjaDsKLSAgICB9Ci0gICAgeFtqXSA9ICdcMCc7Ci0gICAgcmV0dXJuIGo7Ci19Ci0KLS8qCi0gKiBjaGVja3MgYW4gZW5jb2RlZCBmdHAgc3RyaW5nIGZvciBiYWQgY2hhcmFjdGVycywgbmFtZWx5LCBDUiwgTEYgb3IKLSAqIG5vbi1hc2NpaSBjaGFyYWN0ZXIKLSAqLwotc3RhdGljIGludCBmdHBfY2hlY2tfc3RyaW5nKGNvbnN0IGNoYXIgKngpCi17Ci0gICAgaW50IGksIGNoOwotCi0gICAgZm9yIChpID0gMDsgeFtpXSAhPSAnXDAnOyBpKyspIHsKLQljaCA9IHhbaV07Ci0JaWYgKGNoID09ICclJyAmJiBhcF9pc3hkaWdpdCh4W2kgKyAxXSkgJiYgYXBfaXN4ZGlnaXQoeFtpICsgMl0pKSB7Ci0JICAgIGNoID0gYXBfcHJveHlfaGV4MmMoJnhbaSArIDFdKTsKLQkgICAgaSArPSAyOwotCX0KLSNpZm5kZWYgQ0hBUlNFVF9FQkNESUMKLQlpZiAoY2ggPT0gJ1wwMTUnIHx8IGNoID09ICdcMDEyJyB8fCAoY2ggJiAweDgwKSkKLSNlbHNlIC8qQ0hBUlNFVF9FQkNESUMqLwotCWlmIChjaCA9PSAnXHInIHx8IGNoID09ICdcbicgfHwgKG9zX3RvYXNjaWlbY2hdICYgMHg4MCkpCi0jZW5kaWYgLypDSEFSU0VUX0VCQ0RJQyovCi0JICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotLyoKLSAqIENhbm9uaWNhbGlzZSBmdHAgVVJMcy4KLSAqLwotaW50IGFwX3Byb3h5X2Z0cF9jYW5vbihyZXF1ZXN0X3JlYyAqciwgY2hhciAqdXJsKQotewotICAgIGNoYXIgKnVzZXIsICpwYXNzd29yZCwgKmhvc3QsICpwYXRoLCAqcGFybXMsICpzdHJwLCBzcG9ydFs3XTsKLSAgICBhcF9jb250ZXh0X3QgKnAgPSByLT5wb29sOwotICAgIGNvbnN0IGNoYXIgKmVycjsKLSAgICBpbnQgcG9ydDsKLQotICAgIHBvcnQgPSBERUZBVUxUX0ZUUF9QT1JUOwotICAgIGVyciA9IGFwX3Byb3h5X2Nhbm9uX25ldGxvYyhwLCAmdXJsLCAmdXNlciwgJnBhc3N3b3JkLCAmaG9zdCwgJnBvcnQpOwotICAgIGlmIChlcnIpCi0JcmV0dXJuIEhUVFBfQkFEX1JFUVVFU1Q7Ci0gICAgaWYgKHVzZXIgIT0gTlVMTCAmJiAhZnRwX2NoZWNrX3N0cmluZyh1c2VyKSkKLQlyZXR1cm4gSFRUUF9CQURfUkVRVUVTVDsKLSAgICBpZiAocGFzc3dvcmQgIT0gTlVMTCAmJiAhZnRwX2NoZWNrX3N0cmluZyhwYXNzd29yZCkpCi0JcmV0dXJuIEhUVFBfQkFEX1JFUVVFU1Q7Ci0KLS8qIG5vdyBwYXJzZSBwYXRoL3BhcmFtZXRlcnMgYXJncywgYWNjb3JkaW5nIHRvIHJmYzE3MzggKi8KLS8qIE4uQi4gaWYgdGhpcyBpc24ndCBhIHRydWUgcHJveHkgcmVxdWVzdCwgdGhlbiB0aGUgVVJMIHBhdGgKLSAqIChidXQgbm90IHF1ZXJ5IGFyZ3MpIGhhcyBhbHJlYWR5IGJlZW4gZGVjb2RlZC4KLSAqIFRoaXMgZ2l2ZXMgcmlzZSB0byB0aGUgcHJvYmxlbSBvZiBhIDsgYmVpbmcgZGVjb2RlZCBpbnRvIHRoZQotICogcGF0aC4KLSAqLwotICAgIHN0cnAgPSBzdHJjaHIodXJsLCAnOycpOwotICAgIGlmIChzdHJwICE9IE5VTEwpIHsKLQkqKHN0cnArKykgPSAnXDAnOwotCXBhcm1zID0gYXBfcHJveHlfY2Fub25lbmMocCwgc3RycCwgc3RybGVuKHN0cnApLCBlbmNfcGFybSwgci0+cHJveHlyZXEpOwotCWlmIChwYXJtcyA9PSBOVUxMKQotCSAgICByZXR1cm4gSFRUUF9CQURfUkVRVUVTVDsKLSAgICB9Ci0gICAgZWxzZQotCXBhcm1zID0gIiI7Ci0KLSAgICBwYXRoID0gYXBfcHJveHlfY2Fub25lbmMocCwgdXJsLCBzdHJsZW4odXJsKSwgZW5jX3BhdGgsIHItPnByb3h5cmVxKTsKLSAgICBpZiAocGF0aCA9PSBOVUxMKQotCXJldHVybiBIVFRQX0JBRF9SRVFVRVNUOwotICAgIGlmICghZnRwX2NoZWNrX3N0cmluZyhwYXRoKSkKLQlyZXR1cm4gSFRUUF9CQURfUkVRVUVTVDsKLQotICAgIGlmICghci0+cHJveHlyZXEgJiYgci0+YXJncyAhPSBOVUxMKSB7Ci0JaWYgKHN0cnAgIT0gTlVMTCkgewotCSAgICBzdHJwID0gYXBfcHJveHlfY2Fub25lbmMocCwgci0+YXJncywgc3RybGVuKHItPmFyZ3MpLCBlbmNfcGFybSwgMSk7Ci0JICAgIGlmIChzdHJwID09IE5VTEwpCi0JCXJldHVybiBIVFRQX0JBRF9SRVFVRVNUOwotCSAgICBwYXJtcyA9IGFwX3BzdHJjYXQocCwgcGFybXMsICI/Iiwgc3RycCwgTlVMTCk7Ci0JfQotCWVsc2UgewotCSAgICBzdHJwID0gYXBfcHJveHlfY2Fub25lbmMocCwgci0+YXJncywgc3RybGVuKHItPmFyZ3MpLCBlbmNfZnBhdGgsIDEpOwotCSAgICBpZiAoc3RycCA9PSBOVUxMKQotCQlyZXR1cm4gSFRUUF9CQURfUkVRVUVTVDsKLQkgICAgcGF0aCA9IGFwX3BzdHJjYXQocCwgcGF0aCwgIj8iLCBzdHJwLCBOVUxMKTsKLQl9Ci0Jci0+YXJncyA9IE5VTEw7Ci0gICAgfQotCi0vKiBub3csIHJlYnVpbGQgVVJMICovCi0KLSAgICBpZiAocG9ydCAhPSBERUZBVUxUX0ZUUF9QT1JUKQotCWFwX3NucHJpbnRmKHNwb3J0LCBzaXplb2Yoc3BvcnQpLCAiOiVkIiwgcG9ydCk7Ci0gICAgZWxzZQotCXNwb3J0WzBdID0gJ1wwJzsKLQotICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmNhdChwLCAicHJveHk6ZnRwOi8vIiwgKHVzZXIgIT0gTlVMTCkgPyB1c2VyIDogIiIsCi0JCQkgICAgICAgKHBhc3N3b3JkICE9IE5VTEwpID8gIjoiIDogIiIsCi0JCQkgICAgICAgKHBhc3N3b3JkICE9IE5VTEwpID8gcGFzc3dvcmQgOiAiIiwKLQkJICAgICAgICAgICh1c2VyICE9IE5VTEwpID8gIkAiIDogIiIsIGhvc3QsIHNwb3J0LCAiLyIsIHBhdGgsCi0JCQkgICAgICAgKHBhcm1zWzBdICE9ICdcMCcpID8gIjsiIDogIiIsIHBhcm1zLCBOVUxMKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotLyoKLSAqIFJldHVybnMgdGhlIGZ0cCBzdGF0dXMgY29kZTsKLSAqICBvciAtMSBvbiBJL08gZXJyb3IsIDAgb24gZGF0YSBlcnJvcgotICovCi1zdGF0aWMgaW50IGZ0cF9nZXRyYyhCVUZGICpmKQotewotICAgIGludCBsZW4sIHN0YXR1czsKLSAgICBjaGFyIGxpbmVidWZmWzEwMF0sIGJ1ZmZbNV07Ci0KLSAgICBsZW4gPSBhcF9iZ2V0cyhsaW5lYnVmZiwgc2l6ZW9mIGxpbmVidWZmLCBmKTsKLSAgICBpZiAobGVuID09IC0xKQotCXJldHVybiAtMTsKLS8qIGNoZWNrIGZvcm1hdCAqLwotICAgIGlmIChsZW4gPCA1IHx8ICFhcF9pc2RpZ2l0KGxpbmVidWZmWzBdKSB8fCAhYXBfaXNkaWdpdChsaW5lYnVmZlsxXSkgfHwKLQkhYXBfaXNkaWdpdChsaW5lYnVmZlsyXSkgfHwgKGxpbmVidWZmWzNdICE9ICcgJyAmJiBsaW5lYnVmZlszXSAhPSAnLScpKQotCXN0YXR1cyA9IDA7Ci0gICAgZWxzZQotCXN0YXR1cyA9IDEwMCAqIGxpbmVidWZmWzBdICsgMTAgKiBsaW5lYnVmZlsxXSArIGxpbmVidWZmWzJdIC0gMTExICogJzAnOwotCi0gICAgaWYgKGxpbmVidWZmW2xlbiAtIDFdICE9ICdcbicpIHsKLQkodm9pZClhcF9ic2tpcGxmKGYpOwotICAgIH0KLQotLyogc2tpcCBjb250aW51YXRpb24gbGluZXMgKi8KLSAgICBpZiAobGluZWJ1ZmZbM10gPT0gJy0nKSB7Ci0JbWVtY3B5KGJ1ZmYsIGxpbmVidWZmLCAzKTsKLQlidWZmWzNdID0gJyAnOwotCWRvIHsKLQkgICAgbGVuID0gYXBfYmdldHMobGluZWJ1ZmYsIHNpemVvZiBsaW5lYnVmZiwgZik7Ci0JICAgIGlmIChsZW4gPT0gLTEpCi0JCXJldHVybiAtMTsKLQkgICAgaWYgKGxpbmVidWZmW2xlbiAtIDFdICE9ICdcbicpIHsKLQkJKHZvaWQpYXBfYnNraXBsZihmKTsKLQkgICAgfQotCX0gd2hpbGUgKG1lbWNtcChsaW5lYnVmZiwgYnVmZiwgNCkgIT0gMCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyoKLSAqIExpa2UgZnRwX2dldHJjIGJ1dCByZXR1cm5zIGJvdGggdGhlIGZ0cCBzdGF0dXMgY29kZSBhbmQgCi0gKiByZW1lbWJlcnMgdGhlIHJlc3BvbnNlIG1lc3NhZ2UgaW4gdGhlIHN1cHBsaWVkIGJ1ZmZlcgotICovCi1zdGF0aWMgaW50IGZ0cF9nZXRyY19tc2coQlVGRiAqZiwgY2hhciAqbXNnYnVmLCBpbnQgbXNnbGVuKQotewotICAgIGludCBsZW4sIHN0YXR1czsKLSAgICBjaGFyIGxpbmVidWZmWzEwMF0sIGJ1ZmZbNV07Ci0gICAgY2hhciAqbWIgPSBtc2didWYsCi0JICptZSA9ICZtc2didWZbbXNnbGVuXTsKLQotICAgIGxlbiA9IGFwX2JnZXRzKGxpbmVidWZmLCBzaXplb2YgbGluZWJ1ZmYsIGYpOwotICAgIGlmIChsZW4gPT0gLTEpCi0JcmV0dXJuIC0xOwotICAgIGlmIChsZW4gPCA1IHx8ICFhcF9pc2RpZ2l0KGxpbmVidWZmWzBdKSB8fCAhYXBfaXNkaWdpdChsaW5lYnVmZlsxXSkgfHwKLQkhYXBfaXNkaWdpdChsaW5lYnVmZlsyXSkgfHwgKGxpbmVidWZmWzNdICE9ICcgJyAmJiBsaW5lYnVmZlszXSAhPSAnLScpKQotCXN0YXR1cyA9IDA7Ci0gICAgZWxzZQotCXN0YXR1cyA9IDEwMCAqIGxpbmVidWZmWzBdICsgMTAgKiBsaW5lYnVmZlsxXSArIGxpbmVidWZmWzJdIC0gMTExICogJzAnOwotCi0gICAgbWIgPSBhcF9jcHlzdHJuKG1iLCBsaW5lYnVmZis0LCBtZSAtIG1iKTsKLQotICAgIGlmIChsaW5lYnVmZltsZW4gLSAxXSAhPSAnXG4nKQotCSh2b2lkKWFwX2Jza2lwbGYoZik7Ci0KLSAgICBpZiAobGluZWJ1ZmZbM10gPT0gJy0nKSB7Ci0JbWVtY3B5KGJ1ZmYsIGxpbmVidWZmLCAzKTsKLQlidWZmWzNdID0gJyAnOwotCWRvIHsKLQkgICAgbGVuID0gYXBfYmdldHMobGluZWJ1ZmYsIHNpemVvZiBsaW5lYnVmZiwgZik7Ci0JICAgIGlmIChsZW4gPT0gLTEpCi0JCXJldHVybiAtMTsKLQkgICAgaWYgKGxpbmVidWZmW2xlbiAtIDFdICE9ICdcbicpIHsKLQkJKHZvaWQpYXBfYnNraXBsZihmKTsKLQkgICAgfQotCSAgICBtYiA9IGFwX2NweXN0cm4obWIsIGxpbmVidWZmKzQsIG1lIC0gbWIpOwotCX0gd2hpbGUgKG1lbWNtcChsaW5lYnVmZiwgYnVmZiwgNCkgIT0gMCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBsb25nIGludCBzZW5kX2RpcihCVUZGICpmLCByZXF1ZXN0X3JlYyAqciwgY2FjaGVfcmVxICpjLCBjaGFyICpjd2QpCi17Ci0gICAgY2hhciBidWZbSU9CVUZTSVpFXTsKLSAgICBjaGFyIGJ1ZjJbSU9CVUZTSVpFXTsKLSAgICBjaGFyICpmaWxlbmFtZTsKLSAgICBpbnQgc2VhcmNoaWR4ID0gMDsKLSAgICBjaGFyICpzZWFyY2hwdHIgPSBOVUxMOwotICAgIGludCBmaXJzdGZpbGUgPSAxOwotICAgIHVuc2lnbmVkIGxvbmcgdG90YWxfYnl0ZXNfc2VudCA9IDA7Ci0gICAgcmVnaXN0ZXIgaW50IG4sIG8sIHc7Ci0gICAgY29ubl9yZWMgKmNvbiA9IHItPmNvbm5lY3Rpb247Ci0gICAgY2hhciAqZGlyLCAqcGF0aCwgKnJlbGRpciwgKnNpdGU7Ci0KLSAgICAvKiBTYXZlICJzY2hlbWU6Ly9zaXRlIiBwcmVmaXggd2l0aG91dCBwYXNzd29yZCAqLwotICAgIHNpdGUgPSBhcF91bnBhcnNlX3VyaV9jb21wb25lbnRzKHItPnBvb2wsICZyLT5wYXJzZWRfdXJpLCBVTlBfT01JVFBBU1NXT1JEfFVOUF9PTUlUUEFUSElORk8pOwotICAgIC8qIC4uLiBhbmQgcGF0aCB3aXRob3V0IHF1ZXJ5IGFyZ3MgKi8KLSAgICBwYXRoID0gYXBfdW5wYXJzZV91cmlfY29tcG9uZW50cyhyLT5wb29sLCAmci0+cGFyc2VkX3VyaSwgVU5QX09NSVRTSVRFUEFSVHxVTlBfT01JVFFVRVJZKTsKLSAgICAodm9pZClkZWNvZGVlbmMocGF0aCk7Ci0KLSAgICAvKiBDb3B5IHBhdGgsIHN0cmlwIChhbGwgZXhjZXB0IHRoZSBsYXN0KSB0cmFpbGluZyBzbGFzaGVzICovCi0gICAgcGF0aCA9IGRpciA9IGFwX3BzdHJjYXQoci0+cG9vbCwgcGF0aCwgIi8iLCBOVUxMKTsKLSAgICB3aGlsZSAoKG4gPSBzdHJsZW4ocGF0aCkpID4gMSAmJiBwYXRoW24tMV0gPT0gJy8nICYmIHBhdGhbbi0yXSA9PSAnLycpCi0JcGF0aFtuLTFdID0gJ1wwJzsKLQotICAgIC8qIHByaW50ICJmdHA6Ly9ob3N0LyIgKi8KLSAgICBuID0gYXBfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgRE9DVFlQRV9IVE1MXzNfMgotCQkiPEhUTUw+PEhFQUQ+PFRJVExFPiVzJXM8L1RJVExFPlxuIgotCQkiPEJBU0UgSFJFRj1cIiVzJXNcIj48L0hFQUQ+XG4iCi0JCSI8Qk9EWT48SDI+RGlyZWN0b3J5IG9mICIKLQkJIjxBIEhSRUY9XCIvXCI+JXM8L0E+LyIsCi0JCXNpdGUsIHBhdGgsIHNpdGUsIHBhdGgsIHNpdGUpOwotICAgIHRvdGFsX2J5dGVzX3NlbnQgKz0gYXBfcHJveHlfYnB1dHMyKGJ1ZiwgY29uLT5jbGllbnQsIGMpOwotCi0gICAgd2hpbGUgKChkaXIgPSBzdHJjaHIoZGlyKzEsICcvJykpICE9IE5VTEwpCi0gICAgewotCSpkaXIgPSAnXDAnOwotCWlmICgocmVsZGlyID0gc3RycmNocihwYXRoKzEsICcvJykpPT1OVUxMKQotCSAgICByZWxkaXIgPSBwYXRoKzE7Ci0JZWxzZQotCSAgICArK3JlbGRpcjsKLQkvKiBwcmludCAicGF0aC8iIGNvbXBvbmVudCAqLwotCWFwX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICI8QSBIUkVGPVwiLyVzL1wiPiVzPC9BPi8iLCBwYXRoKzEsIHJlbGRpcik7Ci0JdG90YWxfYnl0ZXNfc2VudCArPSBhcF9wcm94eV9icHV0czIoYnVmLCBjb24tPmNsaWVudCwgYyk7Ci0JKmRpciA9ICcvJzsKLSAgICB9Ci0gICAgLyogSWYgdGhlIGNhbGxlciBoYXMgZGV0ZXJtaW5lZCB0aGUgY3VycmVudCBkaXJlY3RvcnksIGFuZCBpdCBkaWZmZXJzICovCi0gICAgLyogZnJvbSB3aGF0IHRoZSBjbGllbnQgcmVxdWVzdGVkLCB0aGVuIHNob3cgdGhlIHJlYWwgbmFtZSAqLwotICAgIGlmIChjd2QgPT0gTlVMTCB8fCBzdHJuY21wIChjd2QsIHBhdGgsIHN0cmxlbihjd2QpKSA9PSAwKSB7Ci0JYXBfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIjwvSDI+XG48SFI+PFBSRT4iKTsKLSAgICB9IGVsc2UgewotCWFwX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICI8L0gyPlxuKCVzKVxuPEhSPjxQUkU+IiwgY3dkKTsKLSAgICB9Ci0gICAgdG90YWxfYnl0ZXNfc2VudCArPSBhcF9wcm94eV9icHV0czIoYnVmLCBjb24tPmNsaWVudCwgYyk7Ci0KLSAgICB3aGlsZSAoIWNvbi0+YWJvcnRlZCkgewotCW4gPSBhcF9iZ2V0cyhidWYsIHNpemVvZiBidWYsIGYpOwotCWlmIChuID09IC0xKSB7CQkvKiBpbnB1dCBlcnJvciAqLwotCSAgICBpZiAoYyAhPSBOVUxMKSB7Ci0JCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBjLT5yZXEsCi0JCSAgICAicHJveHk6IGVycm9yIHJlYWRpbmcgZnJvbSAlcyIsIGMtPnVybCk7Ci0JCWMgPSBhcF9wcm94eV9jYWNoZV9lcnJvcihjKTsKLQkgICAgfQotCSAgICBicmVhazsKLQl9Ci0JaWYgKG4gPT0gMCkKLQkgICAgYnJlYWs7CQkvKiBFT0YgKi8KLQlpZiAoYnVmWzBdID09ICdsJyAmJiAoZmlsZW5hbWU9c3Ryc3RyKGJ1ZiwgIiAtPiAiKSkgIT0gTlVMTCkgewotCSAgICBjaGFyICpsaW5rX3B0ciA9IGZpbGVuYW1lOwotCi0JICAgIGRvIHsKLQkJZmlsZW5hbWUtLTsKLQkgICAgfSB3aGlsZSAoZmlsZW5hbWVbMF0gIT0gJyAnKTsKLQkgICAgKihmaWxlbmFtZSsrKSA9ICdcMCc7Ci0JICAgICoobGlua19wdHIrKykgPSAnXDAnOwotCSAgICBpZiAoKG4gPSBzdHJsZW4obGlua19wdHIpKSA+IDEgJiYgbGlua19wdHJbbiAtIDFdID09ICdcbicpCi0JICAgICAgbGlua19wdHJbbiAtIDFdID0gJ1wwJzsKLQkgICAgYXBfc25wcmludGYoYnVmMiwgc2l6ZW9mKGJ1ZjIpLCAiJXMgPEEgSFJFRj1cIiVzXCI+JXMgJXM8L0E+XG4iLCBidWYsIGZpbGVuYW1lLCBmaWxlbmFtZSwgbGlua19wdHIpOwotCSAgICBhcF9jcHlzdHJuKGJ1ZiwgYnVmMiwgc2l6ZW9mKGJ1ZikpOwotCSAgICBuID0gc3RybGVuKGJ1Zik7Ci0JfQotCWVsc2UgaWYgKGJ1ZlswXSA9PSAnZCcgfHwgYnVmWzBdID09ICctJyB8fCBidWZbMF0gPT0gJ2wnIHx8IGFwX2lzZGlnaXQoYnVmWzBdKSkgewotCSAgICBpZiAoYXBfaXNkaWdpdChidWZbMF0pKSB7CS8qIGhhbmRsZSBET1MgZGlyICovCi0JCXNlYXJjaHB0ciA9IHN0cmNocihidWYsICc8Jyk7Ci0JCWlmIChzZWFyY2hwdHIgIT0gTlVMTCkKLQkJICAgICpzZWFyY2hwdHIgPSAnWyc7Ci0JCXNlYXJjaHB0ciA9IHN0cmNocihidWYsICc+Jyk7Ci0JCWlmIChzZWFyY2hwdHIgIT0gTlVMTCkKLQkJICAgICpzZWFyY2hwdHIgPSAnXSc7Ci0JICAgIH0KLQotCSAgICBmaWxlbmFtZSA9IHN0cnJjaHIoYnVmLCAnICcpOwotCSAgICAqKGZpbGVuYW1lKyspID0gMDsKLQkgICAgZmlsZW5hbWVbc3RybGVuKGZpbGVuYW1lKSAtIDFdID0gMDsKLQotCSAgICAvKiBoYW5kbGUgZmlsZW5hbWVzIHdpdGggc3BhY2VzIGluICdlbSAqLwotCSAgICBpZiAoIXN0cmNtcChmaWxlbmFtZSwgIi4iKSB8fCAhc3RyY21wKGZpbGVuYW1lLCAiLi4iKSB8fCBmaXJzdGZpbGUpIHsKLQkJZmlyc3RmaWxlID0gMDsKLQkJc2VhcmNoaWR4ID0gZmlsZW5hbWUgLSBidWY7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoc2VhcmNoaWR4ICE9IDAgJiYgYnVmW3NlYXJjaGlkeF0gIT0gMCkgewotCQkqKC0tZmlsZW5hbWUpID0gJyAnOwotCQlidWZbc2VhcmNoaWR4IC0gMV0gPSAwOwotCQlmaWxlbmFtZSA9ICZidWZbc2VhcmNoaWR4XTsKLQkgICAgfQotCi0JICAgIC8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yICcuJyBhbmQgJy4uJyAqLwotCSAgICBpZiAoIXN0cmNtcChmaWxlbmFtZSwgIi4iKSB8fCAhc3RyY21wKGZpbGVuYW1lLCAiLi4iKSB8fCBidWZbMF0gPT0gJ2QnKSB7Ci0JCWFwX3NucHJpbnRmKGJ1ZjIsIHNpemVvZihidWYyKSwgIiVzIDxBIEhSRUY9XCIlcy9cIj4lczwvQT5cbiIsCi0JCSAgICBidWYsIGZpbGVuYW1lLCBmaWxlbmFtZSk7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCWFwX3NucHJpbnRmKGJ1ZjIsIHNpemVvZihidWYyKSwgIiVzIDxBIEhSRUY9XCIlc1wiPiVzPC9BPlxuIiwgYnVmLCBmaWxlbmFtZSwgZmlsZW5hbWUpOwotCSAgICB9Ci0JICAgIGFwX2NweXN0cm4oYnVmLCBidWYyLCBzaXplb2YoYnVmKSk7Ci0JICAgIG4gPSBzdHJsZW4oYnVmKTsKLQl9Ci0KLQlvID0gMDsKLQl0b3RhbF9ieXRlc19zZW50ICs9IG47Ci0KLQlpZiAoYyAhPSBOVUxMICYmIGMtPmZwICYmIGFwX2J3cml0ZShjLT5mcCwgYnVmLCBuKSAhPSBuKSB7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBjLT5yZXEsCi0JCSJwcm94eTogZXJyb3Igd3JpdGluZyB0byAlcyIsIGMtPnRlbXBmaWxlKTsKLQkgICAgYyA9IGFwX3Byb3h5X2NhY2hlX2Vycm9yKGMpOwotCX0KLQotCXdoaWxlIChuICYmICFyLT5jb25uZWN0aW9uLT5hYm9ydGVkKSB7Ci0JICAgIHcgPSBhcF9id3JpdGUoY29uLT5jbGllbnQsICZidWZbb10sIG4pOwotCSAgICBpZiAodyA8PSAwKQotCQlicmVhazsKLQkgICAgbiAtPSB3OwotCSAgICBvICs9IHc7Ci0JfQotICAgIH0KLQotICAgIHRvdGFsX2J5dGVzX3NlbnQgKz0gYXBfcHJveHlfYnB1dHMyKCI8L1BSRT48SFI+XG4iLCBjb24tPmNsaWVudCwgYyk7Ci0gICAgdG90YWxfYnl0ZXNfc2VudCArPSBhcF9wcm94eV9icHV0czIoYXBfcHNpZ25hdHVyZSgiIiwgciksIGNvbi0+Y2xpZW50LCBjKTsKLSAgICB0b3RhbF9ieXRlc19zZW50ICs9IGFwX3Byb3h5X2JwdXRzMigiPC9CT0RZPjwvSFRNTD5cbiIsIGNvbi0+Y2xpZW50LCBjKTsKLQotICAgIGFwX2JmbHVzaChjb24tPmNsaWVudCk7Ci0KLSAgICByZXR1cm4gdG90YWxfYnl0ZXNfc2VudDsKLX0KLQotLyogQ29tbW9uIHJvdXRpbmUgZm9yIGZhaWxlZCBhdXRob3JpemF0aW9uIChpLmUuLCBtaXNzaW5nIG9yIHdyb25nIHBhc3N3b3JkKQotICogdG8gYW4gZnRwIHNlcnZpY2UuIFRoaXMgY2F1c2VzIG1vc3QgYnJvd3NlcnMgdG8gcmV0cnkgdGhlIHJlcXVlc3QKLSAqIHdpdGggdXNlcm5hbWUgYW5kIHBhc3N3b3JkICh3aGljaCB3YXMgcHJlc3VtYWJseSBxdWVyaWVkIGZyb20gdGhlIHVzZXIpCi0gKiBzdXBwbGllZCBpbiB0aGUgQXV0aG9yaXphdGlvbjogaGVhZGVyLgotICogTm90ZSB0aGF0IHdlICJpbnZlbnQiIGEgcmVhbG0gbmFtZSB3aGljaCBjb25zaXN0cyBvZiB0aGUKLSAqIGZ0cDovL3VzZXJAaG9zdCBwYXJ0IG9mIHRoZSByZXFlc3QgKHNhbnMgcGFzc3dvcmQgaWYgc3VwcGxpZWQgYnV0IGludmFsaWQtKQotICovCi1zdGF0aWMgaW50IGZ0cF91bmF1dGhvcml6ZWQgKHJlcXVlc3RfcmVjICpyLCBpbnQgbG9nX2l0KQotewotICAgIHItPnByb3h5cmVxID0gMDsKLSAgICAvKiBMb2cgZmFpbGVkIHJlcXVlc3RzIGlmIHRoZXkgc3VwcGxpZWQgYSBwYXNzd29yZAotICAgICAqIChsb2cgdXNlcm5hbWUvcGFzc3dvcmQgZ3Vlc3NpbmcgYXR0ZW1wdHMpCi0gICAgICovCi0gICAgaWYgKGxvZ19pdCkKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0lORk98QVBMT0dfTk9FUlJOTywgciwKLQkJICAgICAgInByb3h5OiBtaXNzaW5nIG9yIGZhaWxlZCBhdXRoIHRvICVzIiwKLQkJICAgICAgYXBfdW5wYXJzZV91cmlfY29tcG9uZW50cyhyLT5wb29sLAotCQkgICAgICAmci0+cGFyc2VkX3VyaSwgVU5QX09NSVRQQVRISU5GTykpOwotCi0gICAgYXBfdGFibGVfc2V0bihyLT5lcnJfaGVhZGVyc19vdXQsICJXV1ctQXV0aGVudGljYXRlIiwKLSAgICAgICAgICAgICAgICAgIGFwX3BzdHJjYXQoci0+cG9vbCwgIkJhc2ljIHJlYWxtPVwiIiwKLQkJICBhcF91bnBhcnNlX3VyaV9jb21wb25lbnRzKHItPnBvb2wsICZyLT5wYXJzZWRfdXJpLAotCQkJCQkgICAgVU5QX09NSVRQQVNTV09SRHxVTlBfT01JVFBBVEhJTkZPKSwKLQkJICAiXCIiLCBOVUxMKSk7Ci0KLSAgICByZXR1cm4gSFRUUF9VTkFVVEhPUklaRUQ7Ci19Ci0KLS8qCi0gKiBIYW5kbGVzIGRpcmVjdCBhY2Nlc3Mgb2YgZnRwOi8vIFVSTHMKLSAqIE9yaWdpbmFsIChOb24tUEFTVikgdmVyc2lvbiBmcm9tCi0gKiBUcm95IE1vcnJpc29uIDxzcGlmZm5ldEB6b29tLmNvbT4KLSAqIFBBU1YgYWRkZWQgYnkgQ2h1Y2sKLSAqLwotaW50IGFwX3Byb3h5X2Z0cF9oYW5kbGVyKHJlcXVlc3RfcmVjICpyLCBjYWNoZV9yZXEgKmMsIGNoYXIgKnVybCkKLXsKLSAgICBjaGFyICpob3N0LCAqcGF0aCwgKnN0cnAsICpwYXJtczsKLSAgICBjaGFyICpjd2QgPSBOVUxMOwotICAgIGNoYXIgKnVzZXIgPSBOVUxMOwotLyogICAgY2hhciAqYWNjb3VudCA9IE5VTEw7IGhvdyB0byBzdXBwbHkgYW4gYWNjb3VudCBpbiBhIFVSTD8gKi8KLSAgICBjb25zdCBjaGFyICpwYXNzd29yZCA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciAqZXJyOwotICAgIGludCBwb3J0LCBpLCBqLCBsZW4sIHNvY2ssIGRzb2NrLCByYywgbm9jYWNoZSA9IDA7Ci0gICAgaW50IGNzZCA9IDA7Ci0gICAgc3RydWN0IHNvY2thZGRyX2luIHNlcnZlcjsKLSAgICBzdHJ1Y3QgaG9zdGVudCBzZXJ2ZXJfaHA7Ci0gICAgc3RydWN0IGluX2FkZHIgZGVzdGFkZHI7Ci0gICAgYXBfdGFibGVfdCAqcmVzcF9oZHJzOwotICAgIEJVRkYgKmY7Ci0gICAgQlVGRiAqZGF0YSA9IE5VTEw7Ci0gICAgYXBfY29udGV4dF90ICpwID0gci0+cG9vbDsKLSAgICBpbnQgb25lID0gMTsKLSAgICBjb25zdCBsb25nIGludCB6ZXJvID0gMEw7Ci0gICAgTkVUX1NJWkVfVCBjbGVuOwotICAgIHN0cnVjdCB0YmxfZG9fYXJncyB0ZG87Ci0KLSAgICB2b2lkICpzY29uZiA9IHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZzsKLSAgICBwcm94eV9zZXJ2ZXJfY29uZiAqY29uZiA9Ci0gICAgKHByb3h5X3NlcnZlcl9jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHNjb25mLCAmcHJveHlfbW9kdWxlKTsKLSAgICBzdHJ1Y3Qgbm9wcm94eV9lbnRyeSAqbnBlbnQgPSAoc3RydWN0IG5vcHJveHlfZW50cnkgKikgY29uZi0+bm9wcm94aWVzLT5lbHRzOwotICAgIHN0cnVjdCBub2NhY2hlX2VudHJ5ICpuY2VudCA9IChzdHJ1Y3Qgbm9jYWNoZV9lbnRyeSAqKSBjb25mLT5ub2NhY2hlcy0+ZWx0czsKLQotLyogc3R1ZmYgZm9yIFBBU1YgbW9kZSAqLwotICAgIHVuc2lnbmVkIGludCBwcmVzdWx0LCBoMCwgaDEsIGgyLCBoMywgcDAsIHAxOwotICAgIHVuc2lnbmVkIGludCBwYWRkcjsKLSAgICB1bnNpZ25lZCBzaG9ydCBwcG9ydDsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gZGF0YV9hZGRyOwotICAgIGludCBwYXN2bW9kZSA9IDA7Ci0gICAgY2hhciBwYXN2WzY0XTsKLSAgICBjaGFyICpwc3RyOwotCi0vKiBzdHVmZiBmb3IgcmVzcG9uc2VzICovCi0gICAgY2hhciByZXNwW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyICpzaXplID0gTlVMTDsKLQotLyogd2Ugb25seSBzdXBwb3J0IEdFVCBhbmQgSEVBRCAqLwotCi0gICAgaWYgKHItPm1ldGhvZF9udW1iZXIgIT0gTV9HRVQpCi0JcmV0dXJuIEhUVFBfTk9UX0lNUExFTUVOVEVEOwotCi0vKiBXZSBicmVhayB0aGUgVVJMIGludG8gaG9zdCwgcG9ydCwgcGF0aC1zZWFyY2ggKi8KLQotICAgIGhvc3QgPSByLT5wYXJzZWRfdXJpLmhvc3RuYW1lOwotICAgIHBvcnQgPSAoci0+cGFyc2VkX3VyaS5wb3J0ICE9IDApCi0JICAgID8gci0+cGFyc2VkX3VyaS5wb3J0Ci0JICAgIDogYXBfZGVmYXVsdF9wb3J0X2Zvcl9yZXF1ZXN0KHIpOwotICAgIHBhdGggPSBhcF9wc3RyZHVwKHAsIHItPnBhcnNlZF91cmkucGF0aCk7Ci0gICAgcGF0aCA9IChwYXRoICE9IE5VTEwgJiYgcGF0aFswXSAhPSAnXDAnKSA/ICZwYXRoWzFdIDogIiI7Ci0KLSAgICAvKiBUaGUgIkF1dGhvcml6YXRpb246IiBoZWFkZXIgbXVzdCBiZSBjaGVja2VkIGZpcnN0LgotICAgICAqIFdlIGFsbG93IHRoZSB1c2VyIHRvICJvdmVycmlkZSIgdGhlIFVSTC1jb2RlZCB1c2VyIFsgJiBwYXNzd29yZCBdCi0gICAgICogaW4gdGhlIEJyb3dzZXJzJyBVc2VyJlBhc3N3b3JkIERpYWxvZy4KLSAgICAgKiBOT1RFIHRoYXQgdGhpcyBpcyBvbmx5IG1hcmdpbmFsbHkgbW9yZSBzZWN1cmUgdGhhbiBoYXZpbmcgdGhlCi0gICAgICogcGFzc3dvcmQgdHJhdmVsIGluIHBsYWluIGFzIHBhcnQgb2YgdGhlIFVSTCwgYmVjYXVzZSBCYXNpYyBBdXRoCi0gICAgICogc2ltcGx5IHV1ZW5jb2RlcyB0aGUgcGxhaW4gdGV4dCBwYXNzd29yZC4gCi0gICAgICogQnV0IGNoYW5jZXMgYXJlIHN0aWxsIHNtYWxsZXIgdGhhdCB0aGUgVVJMIGlzIGxvZ2dlZCByZWd1bGFybHkuCi0gICAgICovCi0gICAgaWYgKChwYXNzd29yZCA9IGFwX3RhYmxlX2dldChyLT5oZWFkZXJzX2luLCAiQXV0aG9yaXphdGlvbiIpKSAhPSBOVUxMCi0JJiYgc3RyY2FzZWNtcChhcF9nZXR3b3JkKHItPnBvb2wsICZwYXNzd29yZCwgJyAnKSwgIkJhc2ljIikgPT0gMAotCSYmIChwYXNzd29yZCA9IGFwX3BiYXNlNjRkZWNvZGUoci0+cG9vbCwgcGFzc3dvcmQpKVswXSAhPSAnOicpIHsKLQkvKiBOb3RlIHRoYXQgdGhpcyBhbGxvY2F0aW9uIGhhcyB0byBiZSBtYWRlIGZyb20gci0+Y29ubmVjdGlvbi0+cG9vbAotCSAqIGJlY2F1c2UgaXQgaGFzIHRoZSBsaWZldGltZSBvZiB0aGUgY29ubmVjdGlvbi4gIFRoZSBvdGhlciBhbGxvY2F0aW9ucwotCSAqIGFyZSB0ZW1wb3JhcnkgYW5kIGNhbiBiZSB0b3NzZWQgYXdheSBhbnkgdGltZS4KLQkgKi8KLQl1c2VyID0gYXBfZ2V0d29yZF9udWxscyAoci0+cG9vbCwgJnBhc3N3b3JkLCAnOicpOwotCXItPmFwX2F1dGhfdHlwZSA9ICJCYXNpYyI7Ci0Jci0+dXNlciA9IHItPnBhcnNlZF91cmkudXNlciA9IHVzZXI7Ci0Jbm9jYWNoZSA9IDE7CS8qIFRoaXMgcmVzb3VyY2Ugb25seSBhY2Nlc3NpYmxlIHdpdGggdXNlcm5hbWUvcGFzc3dvcmQgKi8KLSAgICB9Ci0gICAgZWxzZSBpZiAoKHVzZXIgPSByLT5wYXJzZWRfdXJpLnVzZXIpICE9IE5VTEwpIHsKLQl1c2VyID0gYXBfcHN0cmR1cChwLCB1c2VyKTsKLQlkZWNvZGVlbmModXNlcik7Ci0JaWYgKChwYXNzd29yZCA9IHItPnBhcnNlZF91cmkucGFzc3dvcmQpICE9IE5VTEwpIHsKLQkgICAgY2hhciAqdG1wID0gYXBfcHN0cmR1cChwLCBwYXNzd29yZCk7Ci0JICAgIGRlY29kZWVuYyh0bXApOwotCSAgICBwYXNzd29yZCA9IHRtcDsKLQl9Ci0Jbm9jYWNoZSA9IDE7CS8qIFRoaXMgcmVzb3VyY2Ugb25seSBhY2Nlc3NpYmxlIHdpdGggdXNlcm5hbWUvcGFzc3dvcmQgKi8KLSAgICB9Ci0gICAgZWxzZSB7Ci0JdXNlciA9ICJhbm9ueW1vdXMiOwotCXBhc3N3b3JkID0gImFwYWNoZV9wcm94eUAiOwotICAgIH0KLQotLyogY2hlY2sgaWYgUHJveHlCbG9jayBkaXJlY3RpdmUgb24gdGhpcyBob3N0ICovCi0gICAgZGVzdGFkZHIuc19hZGRyID0gYXBfaW5ldF9hZGRyKGhvc3QpOwotICAgIGZvciAoaSA9IDA7IGkgPCBjb25mLT5ub3Byb3hpZXMtPm5lbHRzOyBpKyspIHsKLQlpZiAoKG5wZW50W2ldLm5hbWUgIT0gTlVMTCAmJiBzdHJzdHIoaG9zdCwgbnBlbnRbaV0ubmFtZSkgIT0gTlVMTCkKLQkgICAgfHwgZGVzdGFkZHIuc19hZGRyID09IG5wZW50W2ldLmFkZHIuc19hZGRyIHx8IG5wZW50W2ldLm5hbWVbMF0gPT0gJyonKQotCSAgICByZXR1cm4gYXBfcHJveHllcnJvcihyLCBIVFRQX0ZPUkJJRERFTiwKLQkJCQkgIkNvbm5lY3QgdG8gcmVtb3RlIG1hY2hpbmUgYmxvY2tlZCIpOwotICAgIH0KLQotICAgIEV4cGxhaW4yKCJGVFA6IGNvbm5lY3QgdG8gJXM6JWQiLCBob3N0LCBwb3J0KTsKLQotICAgIHBhcm1zID0gc3RyY2hyKHBhdGgsICc7Jyk7Ci0gICAgaWYgKHBhcm1zICE9IE5VTEwpCi0JKihwYXJtcysrKSA9ICdcMCc7Ci0KLSAgICBtZW1zZXQoJnNlcnZlciwgMCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOwotICAgIHNlcnZlci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSAgICBzZXJ2ZXIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKLSAgICBlcnIgPSBhcF9wcm94eV9ob3N0MmFkZHIoaG9zdCwgJnNlcnZlcl9ocCk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKQotCXJldHVybiBhcF9wcm94eWVycm9yKHIsIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SLCBlcnIpOwotCi0gICAgc29jayA9IGFwX3Bzb2NrZXQocCwgUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKLSAgICBpZiAoc29jayA9PSAtMSkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotCQkgICAgICJwcm94eTogZXJyb3IgY3JlYXRpbmcgc29ja2V0Iik7Ci0JcmV0dXJuIEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SOwotICAgIH0KLQotICAgIGlmIChjb25mLT5yZWN2X2J1ZmZlcl9zaXplID4gMAotCSYmIHNldHNvY2tvcHQoc29jaywgU09MX1NPQ0tFVCwgU09fUkNWQlVGLAotCQkgICAgICAgKGNvbnN0IGNoYXIgKikgJmNvbmYtPnJlY3ZfYnVmZmVyX3NpemUsIHNpemVvZihpbnQpKQotCSAgICA9PSAtMSkgewotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLQkJCSAic2V0c29ja29wdChTT19SQ1ZCVUYpOiBGYWlsZWQgdG8gc2V0IFByb3h5UmVjZWl2ZUJ1ZmZlclNpemUsIHVzaW5nIGRlZmF1bHQiKTsKLSAgICB9Ci0KLSAgICBpZiAoc2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICh2b2lkICopICZvbmUsCi0JCSAgIHNpemVvZihvbmUpKSA9PSAtMSkgewotI2lmbmRlZiBfT1NEX1BPU0lYIC8qIEJTMjAwMCBoYXMgdGhpcyBvcHRpb24gImFsd2F5cyBvbiIgKi8KLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLQkJICAgICAicHJveHk6IGVycm9yIHNldHRpbmcgcmV1c2VhZGRyIG9wdGlvbjogc2V0c29ja29wdChTT19SRVVTRUFERFIpIik7Ci0JYXBfcGNsb3Nlc29ja2V0KHAsIHNvY2spOwotCXJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSNlbmRpZiAvKl9PU0RfUE9TSVgqLwotICAgIH0KLQotI2lmZGVmIFNJTklYX0RfUkVTT0xWRVJfQlVHCi0gICAgewotCXN0cnVjdCBpbl9hZGRyICppcF9hZGRyID0gKHN0cnVjdCBpbl9hZGRyICopICpzZXJ2ZXJfaHAuaF9hZGRyX2xpc3Q7Ci0KLQlmb3IgKDsgaXBfYWRkci0+c19hZGRyICE9IDA7ICsraXBfYWRkcikgewotCSAgICBtZW1jcHkoJnNlcnZlci5zaW5fYWRkciwgaXBfYWRkciwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7Ci0JICAgIGkgPSBhcF9wcm94eV9kb2Nvbm5lY3Qoc29jaywgJnNlcnZlciwgcik7Ci0JICAgIGlmIChpID09IDApCi0JCWJyZWFrOwotCX0KLSAgICB9Ci0jZWxzZQotICAgIGogPSAwOwotICAgIHdoaWxlIChzZXJ2ZXJfaHAuaF9hZGRyX2xpc3Rbal0gIT0gTlVMTCkgewotCW1lbWNweSgmc2VydmVyLnNpbl9hZGRyLCBzZXJ2ZXJfaHAuaF9hZGRyX2xpc3Rbal0sCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOwotCWkgPSBhcF9wcm94eV9kb2Nvbm5lY3Qoc29jaywgJnNlcnZlciwgcik7Ci0JaWYgKGkgPT0gMCkKLQkgICAgYnJlYWs7Ci0JaisrOwotICAgIH0KLSNlbmRpZgotICAgIGlmIChpID09IC0xKSB7Ci0JYXBfcGNsb3Nlc29ja2V0KHAsIHNvY2spOwotCXJldHVybiBhcF9wcm94eWVycm9yKHIsIEhUVFBfQkFEX0dBVEVXQVksIGFwX3BzdHJjYXQoci0+cG9vbCwKLQkJCQkiQ291bGQgbm90IGNvbm5lY3QgdG8gcmVtb3RlIG1hY2hpbmU6ICIsCi0JCQkJc3RyZXJyb3IoZXJybm8pLCBOVUxMKSk7Ci0gICAgfQotCi0gICAgZiA9IGFwX2JjcmVhdGUocCwgQl9SRFdSIHwgQl9TT0NLRVQpOwotICAgIGFwX2JwdXNoZmQoZiwgc29jayk7Ci0vKiBzaG91bGRuJ3Qgd2UgaW1wbGVtZW50IHRlbG5ldCBjb250cm9sIG9wdGlvbnMgaGVyZT8gKi8KLQotI2lmZGVmIENIQVJTRVRfRUJDRElDCi0gICAgYXBfYnNldGZsYWcoZiwgQl9BU0NJSTJFQkNESUN8Ql9FQkNESUMyQVNDSUksIDEpOwotI2VuZGlmIC8qQ0hBUlNFVF9FQkNESUMqLwotCi0vKiBwb3NzaWJsZSByZXN1bHRzOiAqLwotICAgIC8qIDEyMCBTZXJ2aWNlIHJlYWR5IGluIG5ubiBtaW51dGVzLiAqLwotICAgIC8qIDIyMCBTZXJ2aWNlIHJlYWR5IGZvciBuZXcgdXNlci4gKi8KLSAgICAvKiA0MjEgU2VydmljZSBub3QgYXZhaWxhYmxlLCBjbG9zaW5nIGNvbnRyb2wgY29ubmVjdGlvbi4gKi8KLSAgICBpID0gZnRwX2dldHJjX21zZyhmLCByZXNwLCBzaXplb2YgcmVzcCk7Ci0gICAgRXhwbGFpbjEoIkZUUDogcmV0dXJuZWQgc3RhdHVzICVkIiwgaSk7Ci0gICAgaWYgKGkgPT0gLTEpIHsKLQlyZXR1cm4gYXBfcHJveHllcnJvcihyLCBIVFRQX0JBRF9HQVRFV0FZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcmVhZGluZyBmcm9tIHJlbW90ZSBzZXJ2ZXIiKTsKLSAgICB9Ci0jaWYgMAotICAgIGlmIChpID09IDEyMCkgewotCS8qIFJGQzIwNjggc3RhdGVzOgotCSAqIDE0LjM4IFJldHJ5LUFmdGVyCi0JICogCi0JICogIFRoZSBSZXRyeS1BZnRlciByZXNwb25zZS1oZWFkZXIgZmllbGQgY2FuIGJlIHVzZWQgd2l0aCBhIDUwMyAoU2VydmljZQotCSAqICBVbmF2YWlsYWJsZSkgcmVzcG9uc2UgdG8gaW5kaWNhdGUgaG93IGxvbmcgdGhlIHNlcnZpY2UgaXMgZXhwZWN0ZWQgdG8KLQkgKiAgYmUgdW5hdmFpbGFibGUgdG8gdGhlIHJlcXVlc3RpbmcgY2xpZW50LiBUaGUgdmFsdWUgb2YgdGhpcyBmaWVsZCBjYW4KLQkgKiAgYmUgZWl0aGVyIGFuIEhUVFAtZGF0ZSBvciBhbiBpbnRlZ2VyIG51bWJlciBvZiBzZWNvbmRzIChpbiBkZWNpbWFsKQotCSAqICBhZnRlciB0aGUgdGltZSBvZiB0aGUgcmVzcG9uc2UuCi0JICogICAgIFJldHJ5LUFmdGVyICA9ICJSZXRyeS1BZnRlciIgIjoiICggSFRUUC1kYXRlIHwgZGVsdGEtc2Vjb25kcyApCi0JICovCi0JYXBfc2V0X2hlYWRlcigiUmV0cnktQWZ0ZXIiLCBhcF9wc3ByaW50ZihwLCAiJXUiLCA2MCp3YWl0X21pbnMpOwotCXJldHVybiBhcF9wcm94eWVycm9yKHIsIEhUVFBfU0VSVklDRV9VTkFWQUlMQUJMRSwgcmVzcCk7Ci0gICAgfQotI2VuZGlmCi0gICAgaWYgKGkgIT0gMjIwKSB7Ci0JcmV0dXJuIGFwX3Byb3h5ZXJyb3IociwgSFRUUF9CQURfR0FURVdBWSwgcmVzcCk7Ci0gICAgfQotCi0gICAgRXhwbGFpbjAoIkZUUDogY29ubmVjdGVkLiIpOwotCi0gICAgYXBfYnZwdXRzKGYsICJVU0VSICIsIHVzZXIsIENSTEYsIE5VTEwpOwotICAgIGFwX2JmbHVzaChmKTsJCQkvKiBjYXB0dXJlIGFueSBlcnJvcnMgKi8KLSAgICBFeHBsYWluMSgiRlRQOiBVU0VSICVzIiwgdXNlcik7Ci0KLS8qIHBvc3NpYmxlIHJlc3VsdHM7IDIzMCwgMzMxLCAzMzIsIDQyMSwgNTAwLCA1MDEsIDUzMCAqLwotLyogc3RhdGVzOiAxIC0gZXJyb3IsIDIgLSBzdWNjZXNzOyAzIC0gc2VuZCBwYXNzd29yZCwgNCw1IGZhaWwgKi8KLSAgICAvKiAyMzAgVXNlciBsb2dnZWQgaW4sIHByb2NlZWQuICovCi0gICAgLyogMzMxIFVzZXIgbmFtZSBva2F5LCBuZWVkIHBhc3N3b3JkLiAqLwotICAgIC8qIDMzMiBOZWVkIGFjY291bnQgZm9yIGxvZ2luLiAqLwotICAgIC8qIDQyMSBTZXJ2aWNlIG5vdCBhdmFpbGFibGUsIGNsb3NpbmcgY29udHJvbCBjb25uZWN0aW9uLiAqLwotICAgIC8qIDUwMCBTeW50YXggZXJyb3IsIGNvbW1hbmQgdW5yZWNvZ25pemVkLiAqLwotICAgIC8qICAgICAoVGhpcyBtYXkgaW5jbHVkZSBlcnJvcnMgc3VjaCBhcyBjb21tYW5kIGxpbmUgdG9vIGxvbmcuKSAqLwotICAgIC8qIDUwMSBTeW50YXggZXJyb3IgaW4gcGFyYW1ldGVycyBvciBhcmd1bWVudHMuICovCi0gICAgLyogNTMwIE5vdCBsb2dnZWQgaW4uICovCi0gICAgaSA9IGZ0cF9nZXRyYyhmKTsKLSAgICBFeHBsYWluMSgiRlRQOiByZXR1cm5lZCBzdGF0dXMgJWQiLCBpKTsKLSAgICBpZiAoaSA9PSAtMSkgewotCXJldHVybiBhcF9wcm94eWVycm9yKHIsIEhUVFBfQkFEX0dBVEVXQVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciByZWFkaW5nIGZyb20gcmVtb3RlIHNlcnZlciIpOwotICAgIH0KLSAgICBpZiAoaSA9PSA1MzApIHsKLQlyZXR1cm4gZnRwX3VuYXV0aG9yaXplZCAociwgMSk7CS8qIGxvZyBpdDogdXNlciBuYW1lIGd1ZXNzaW5nIGF0dGVtcHQ/ICovCi0gICAgfQotICAgIGlmIChpICE9IDIzMCAmJiBpICE9IDMzMSkgewotCXJldHVybiBIVFRQX0JBRF9HQVRFV0FZOwotICAgIH0KLQotICAgIGlmIChpID09IDMzMSkgewkJLyogc2VuZCBwYXNzd29yZCAqLwotCWlmIChwYXNzd29yZCA9PSBOVUxMKSB7Ci0JICAgIHJldHVybiBmdHBfdW5hdXRob3JpemVkIChyLCAwKTsKLQl9Ci0JYXBfYnZwdXRzKGYsICJQQVNTICIsIHBhc3N3b3JkLCBDUkxGLCBOVUxMKTsKLQlhcF9iZmx1c2goZik7Ci0JRXhwbGFpbjEoIkZUUDogUEFTUyAlcyIsIHBhc3N3b3JkKTsKLS8qIHBvc3NpYmxlIHJlc3VsdHMgMjAyLCAyMzAsIDMzMiwgNDIxLCA1MDAsIDUwMSwgNTAzLCA1MzAgKi8KLSAgICAvKiAyMzAgVXNlciBsb2dnZWQgaW4sIHByb2NlZWQuICovCi0gICAgLyogMzMyIE5lZWQgYWNjb3VudCBmb3IgbG9naW4uICovCi0gICAgLyogNDIxIFNlcnZpY2Ugbm90IGF2YWlsYWJsZSwgY2xvc2luZyBjb250cm9sIGNvbm5lY3Rpb24uICovCi0gICAgLyogNTAwIFN5bnRheCBlcnJvciwgY29tbWFuZCB1bnJlY29nbml6ZWQuICovCi0gICAgLyogNTAxIFN5bnRheCBlcnJvciBpbiBwYXJhbWV0ZXJzIG9yIGFyZ3VtZW50cy4gKi8KLSAgICAvKiA1MDMgQmFkIHNlcXVlbmNlIG9mIGNvbW1hbmRzLiAqLwotICAgIC8qIDUzMCBOb3QgbG9nZ2VkIGluLiAqLwotCWkgPSBmdHBfZ2V0cmMoZik7Ci0JRXhwbGFpbjEoIkZUUDogcmV0dXJuZWQgc3RhdHVzICVkIiwgaSk7Ci0JaWYgKGkgPT0gLTEpIHsKLQkgICAgcmV0dXJuIGFwX3Byb3h5ZXJyb3IociwgSFRUUF9CQURfR0FURVdBWSwgIkVycm9yIHJlYWRpbmcgZnJvbSByZW1vdGUgc2VydmVyIik7Ci0JfQotCWlmIChpID09IDMzMikgewotCSAgICByZXR1cm4gYXBfcHJveHllcnJvcihyLCBIVFRQX1VOQVVUSE9SSVpFRCwgIk5lZWQgYWNjb3VudCBmb3IgbG9naW4iKTsKLQl9Ci0JLyogQEBAIHF1ZXN0aW9uYWJsZSAtLSB3ZSBtaWdodCBhcyB3ZWxsIHJldHVybiBhIDQwMyBGb3JiaWRkZW4gaGVyZSAqLwotCWlmIChpID09IDUzMCkgewotCSAgICByZXR1cm4gZnRwX3VuYXV0aG9yaXplZCAociwgMSk7IC8qIGxvZyBpdDogcGFzc3dkIGd1ZXNzaW5nIGF0dGVtcHQ/ICovCi0JfQotCWlmIChpICE9IDIzMCAmJiBpICE9IDIwMikgewotCSAgICByZXR1cm4gSFRUUF9CQURfR0FURVdBWTsKLQl9Ci0gICAgfQotCi0vKiBzZXQgdGhlIGRpcmVjdG9yeSAod2FsayBkaXJlY3RvcnkgY29tcG9uZW50IGJ5IGNvbXBvbmVudCk6Ci0gKiB0aGlzIGlzIHdoYXQgd2UgbXVzdCBkbyBpZiB3ZSBkb24ndCBrbm93IHRoZSBPUyB0eXBlIG9mIHRoZSByZW1vdGUKLSAqIG1hY2hpbmUKLSAqLwotICAgIGZvciAoOzspIHsKLQlzdHJwID0gc3RyY2hyKHBhdGgsICcvJyk7Ci0JaWYgKHN0cnAgPT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JKnN0cnAgPSAnXDAnOwotCi0JbGVuID0gZGVjb2RlZW5jKHBhdGgpOwotCWFwX2J2cHV0cyhmLCAiQ1dEICIsIHBhdGgsIENSTEYsIE5VTEwpOwotCWFwX2JmbHVzaChmKTsKLQlFeHBsYWluMSgiRlRQOiBDV0QgJXMiLCBwYXRoKTsKLQkqc3RycCA9ICcvJzsKLS8qIHJlc3BvbnNlczogMjUwLCA0MjEsIDUwMCwgNTAxLCA1MDIsIDUzMCwgNTUwICovCi0gICAgLyogMjUwIFJlcXVlc3RlZCBmaWxlIGFjdGlvbiBva2F5LCBjb21wbGV0ZWQuICovCi0gICAgLyogNDIxIFNlcnZpY2Ugbm90IGF2YWlsYWJsZSwgY2xvc2luZyBjb250cm9sIGNvbm5lY3Rpb24uICovCi0gICAgLyogNTAwIFN5bnRheCBlcnJvciwgY29tbWFuZCB1bnJlY29nbml6ZWQuICovCi0gICAgLyogNTAxIFN5bnRheCBlcnJvciBpbiBwYXJhbWV0ZXJzIG9yIGFyZ3VtZW50cy4gKi8KLSAgICAvKiA1MDIgQ29tbWFuZCBub3QgaW1wbGVtZW50ZWQuICovCi0gICAgLyogNTMwIE5vdCBsb2dnZWQgaW4uICovCi0gICAgLyogNTUwIFJlcXVlc3RlZCBhY3Rpb24gbm90IHRha2VuLiAqLwotCWkgPSBmdHBfZ2V0cmMoZik7Ci0JRXhwbGFpbjEoIkZUUDogcmV0dXJuZWQgc3RhdHVzICVkIiwgaSk7Ci0JaWYgKGkgPT0gLTEpIHsKLQkgICAgcmV0dXJuIGFwX3Byb3h5ZXJyb3IociwgSFRUUF9CQURfR0FURVdBWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciByZWFkaW5nIGZyb20gcmVtb3RlIHNlcnZlciIpOwotCX0KLQlpZiAoaSA9PSA1NTApIHsKLQkgICAgcmV0dXJuIEhUVFBfTk9UX0ZPVU5EOwotCX0KLQlpZiAoaSAhPSAyNTApIHsKLQkgICAgcmV0dXJuIEhUVFBfQkFEX0dBVEVXQVk7Ci0JfQotCi0JcGF0aCA9IHN0cnAgKyAxOwotICAgIH0KLQotICAgIGlmIChwYXJtcyAhPSBOVUxMICYmIHN0cm5jbXAocGFybXMsICJ0eXBlPSIsIDUpID09IDApIHsKLQlwYXJtcyArPSA1OwotCWlmICgocGFybXNbMF0gIT0gJ2QnICYmIHBhcm1zWzBdICE9ICdhJyAmJiBwYXJtc1swXSAhPSAnaScpIHx8Ci0JICAgIHBhcm1zWzFdICE9ICdcMCcpCi0JICAgIHBhcm1zID0gIiI7Ci0gICAgfQotICAgIGVsc2UKLQlwYXJtcyA9ICIiOwotCi0gICAgLyogY2hhbmdlZCB0byBtYWtlIGJpbmFyeSB0cmFuc2ZlcnMgdGhlIGRlZmF1bHQgKi8KLQotICAgIGlmIChwYXJtc1swXSAhPSAnYScpIHsKLQkvKiBzZXQgdHlwZSB0byBpbWFnZSAqLwotCS8qIFRNIC0gQWRkZWQgXDAxNVwwMTIgdG8gdGhlIGVuZCBvZiBUWVBFIEksIG90aGVyd2lzZSBpdCBoYW5ncyB0aGUKLQkgICBjb25uZWN0aW9uICovCi0JYXBfYnB1dHMoIlRZUEUgSSIgQ1JMRiwgZik7Ci0JYXBfYmZsdXNoKGYpOwotCUV4cGxhaW4wKCJGVFA6IFRZUEUgSSIpOwotLyogcmVzcG9uc2VzOiAyMDAsIDQyMSwgNTAwLCA1MDEsIDUwNCwgNTMwICovCi0gICAgLyogMjAwIENvbW1hbmQgb2theS4gKi8KLSAgICAvKiA0MjEgU2VydmljZSBub3QgYXZhaWxhYmxlLCBjbG9zaW5nIGNvbnRyb2wgY29ubmVjdGlvbi4gKi8KLSAgICAvKiA1MDAgU3ludGF4IGVycm9yLCBjb21tYW5kIHVucmVjb2duaXplZC4gKi8KLSAgICAvKiA1MDEgU3ludGF4IGVycm9yIGluIHBhcmFtZXRlcnMgb3IgYXJndW1lbnRzLiAqLwotICAgIC8qIDUwNCBDb21tYW5kIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhhdCBwYXJhbWV0ZXIuICovCi0gICAgLyogNTMwIE5vdCBsb2dnZWQgaW4uICovCi0JaSA9IGZ0cF9nZXRyYyhmKTsKLQlFeHBsYWluMSgiRlRQOiByZXR1cm5lZCBzdGF0dXMgJWQiLCBpKTsKLQlpZiAoaSA9PSAtMSkgewotCSAgICByZXR1cm4gYXBfcHJveHllcnJvcihyLCBIVFRQX0JBRF9HQVRFV0FZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHJlYWRpbmcgZnJvbSByZW1vdGUgc2VydmVyIik7Ci0JfQotCWlmIChpICE9IDIwMCAmJiBpICE9IDUwNCkgewotCSAgICByZXR1cm4gSFRUUF9CQURfR0FURVdBWTsKLQl9Ci0vKiBBbGxvdyBub3QgaW1wbGVtZW50ZWQgKi8KLQlpZiAoaSA9PSA1MDQpCi0JICAgIHBhcm1zWzBdID0gJ1wwJzsKLSAgICB9Ci0KLS8qIHRyeSB0byBzZXQgdXAgUEFTViBkYXRhIGNvbm5lY3Rpb24gZmlyc3QgKi8KLSAgICBkc29jayA9IGFwX3Bzb2NrZXQocCwgUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKLSAgICBpZiAoZHNvY2sgPT0gLTEpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLQkJICAgICAicHJveHk6IGVycm9yIGNyZWF0aW5nIFBBU1Ygc29ja2V0Iik7Ci0JYXBfYmNsb3NlKGYpOwotCXJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAoY29uZi0+cmVjdl9idWZmZXJfc2l6ZSkgewotCWlmIChzZXRzb2Nrb3B0KGRzb2NrLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsCi0JICAgICAgIChjb25zdCBjaGFyICopICZjb25mLT5yZWN2X2J1ZmZlcl9zaXplLCBzaXplb2YoaW50KSkgPT0gLTEpIHsKLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0JCQkgInNldHNvY2tvcHQoU09fUkNWQlVGKTogRmFpbGVkIHRvIHNldCBQcm94eVJlY2VpdmVCdWZmZXJTaXplLCB1c2luZyBkZWZhdWx0Iik7Ci0JfQotICAgIH0KLQotICAgIGFwX2JwdXRzKCJQQVNWIiBDUkxGLCBmKTsKLSAgICBhcF9iZmx1c2goZik7Ci0gICAgRXhwbGFpbjAoIkZUUDogUEFTViBjb21tYW5kIGlzc3VlZCIpOwotLyogcG9zc2libGUgcmVzdWx0czogMjI3LCA0MjEsIDUwMCwgNTAxLCA1MDIsIDUzMCAqLwotICAgIC8qIDIyNyBFbnRlcmluZyBQYXNzaXZlIE1vZGUgKGgxLGgyLGgzLGg0LHAxLHAyKS4gKi8KLSAgICAvKiA0MjEgU2VydmljZSBub3QgYXZhaWxhYmxlLCBjbG9zaW5nIGNvbnRyb2wgY29ubmVjdGlvbi4gKi8KLSAgICAvKiA1MDAgU3ludGF4IGVycm9yLCBjb21tYW5kIHVucmVjb2duaXplZC4gKi8KLSAgICAvKiA1MDEgU3ludGF4IGVycm9yIGluIHBhcmFtZXRlcnMgb3IgYXJndW1lbnRzLiAqLwotICAgIC8qIDUwMiBDb21tYW5kIG5vdCBpbXBsZW1lbnRlZC4gKi8KLSAgICAvKiA1MzAgTm90IGxvZ2dlZCBpbi4gKi8KLSAgICBpID0gYXBfYmdldHMocGFzdiwgc2l6ZW9mKHBhc3YpLCBmKTsKLSAgICBpZiAoaSA9PSAtMSkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSfEFQTE9HX05PRVJSTk8sIHIsCi0JCSAgICAgIlBBU1Y6IGNvbnRyb2wgY29ubmVjdGlvbiBpcyB0b2FzdCIpOwotCWFwX3BjbG9zZXNvY2tldChwLCBkc29jayk7Ci0JYXBfYmNsb3NlKGYpOwotCXJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JcGFzdltpIC0gMV0gPSAnXDAnOwotCXBzdHIgPSBzdHJ0b2socGFzdiwgIiAiKTsJLyogc2VwYXJhdGUgcmVzdWx0IGNvZGUgKi8KLQlpZiAocHN0ciAhPSBOVUxMKSB7Ci0JICAgIHByZXN1bHQgPSBhdG9pKHBzdHIpOwotCSAgICBpZiAoKihwc3RyICsgc3RybGVuKHBzdHIpICsgMSkgPT0gJz0nKQotCSAgICAgICAgcHN0ciArPSBzdHJsZW4ocHN0cikgKyAyOwotCSAgICBlbHNlCi0JICAgIHsKLQkgICAgICAgIHBzdHIgPSBzdHJ0b2soTlVMTCwgIigiKTsgIC8qIHNlcGFyYXRlIGFkZHJlc3MgJiBwb3J0IHBhcmFtcyAqLwotCQlpZiAocHN0ciAhPSBOVUxMKQotCQkgICAgcHN0ciA9IHN0cnRvayhOVUxMLCAiKSIpOwotCSAgICB9Ci0JfQotCWVsc2UKLQkgICAgcHJlc3VsdCA9IGF0b2kocGFzdik7Ci0KLQlFeHBsYWluMSgiRlRQOiByZXR1cm5lZCBzdGF0dXMgJWQiLCBwcmVzdWx0KTsKLQotCWlmIChwcmVzdWx0ID09IDIyNyAmJiBwc3RyICE9IE5VTEwgJiYgKHNzY2FuZihwc3RyLAotCQkgIiVkLCVkLCVkLCVkLCVkLCVkIiwgJmgzLCAmaDIsICZoMSwgJmgwLCAmcDEsICZwMCkgPT0gNikpIHsKLQkgICAgLyogcGFyZG9uIHRoZSBwYXJlbnMsIGJ1dCBpdCBtYWtlcyBnY2MgaGFwcHkgKi8KLQkgICAgcGFkZHIgPSAoKCgoKGgzIDw8IDgpICsgaDIpIDw8IDgpICsgaDEpIDw8IDgpICsgaDA7Ci0JICAgIHBwb3J0ID0gKHAxIDw8IDgpICsgcDA7Ci0JICAgIEV4cGxhaW41KCJGVFA6IGNvbnRhY3RpbmcgaG9zdCAlZC4lZC4lZC4lZDolZCIsCi0JCSAgICAgaDMsIGgyLCBoMSwgaDAsIHBwb3J0KTsKLQkgICAgZGF0YV9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCSAgICBkYXRhX2FkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwocGFkZHIpOwotCSAgICBkYXRhX2FkZHIuc2luX3BvcnQgPSBodG9ucyhwcG9ydCk7Ci0JICAgIGkgPSBhcF9wcm94eV9kb2Nvbm5lY3QoZHNvY2ssICZkYXRhX2FkZHIsIHIpOwotCi0JICAgIGlmIChpID09IC0xKSB7Ci0JCXJldHVybiBhcF9wcm94eWVycm9yKHIsIEhUVFBfQkFEX0dBVEVXQVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfcHN0cmNhdChyLT5wb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjb25uZWN0IHRvIHJlbW90ZSBtYWNoaW5lOiAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pLCBOVUxMKSk7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCXBhc3Ztb2RlID0gMTsKLQkgICAgfQotCX0KLQllbHNlCi0JICAgIGFwX3BjbG9zZXNvY2tldChwLCBkc29jayk7CS8qIGFuZCB0cnkgdGhlIHJlZ3VsYXIgd2F5ICovCi0gICAgfQotCi0gICAgaWYgKCFwYXN2bW9kZSkgewkJLyogc2V0IHVwIGRhdGEgY29ubmVjdGlvbiAqLwotCWNsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKLQlpZiAoZ2V0c29ja25hbWUoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2VydmVyLCAmY2xlbikgPCAwKSB7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotCQkJICJwcm94eTogZXJyb3IgZ2V0dGluZyBzb2NrZXQgYWRkcmVzcyIpOwotCSAgICBhcF9iY2xvc2UoZik7Ci0JICAgIHJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLQl9Ci0KLQlkc29jayA9IGFwX3Bzb2NrZXQocCwgUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKLQlpZiAoZHNvY2sgPT0gLTEpIHsKLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0JCQkgInByb3h5OiBlcnJvciBjcmVhdGluZyBzb2NrZXQiKTsKLQkgICAgYXBfYmNsb3NlKGYpOwotCSAgICByZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0JfQotCi0JaWYgKHNldHNvY2tvcHQoZHNvY2ssIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgKHZvaWQgKikgJm9uZSwKLQkJICAgICAgIHNpemVvZihvbmUpKSA9PSAtMSkgewotI2lmbmRlZiBfT1NEX1BPU0lYIC8qIEJTMjAwMCBoYXMgdGhpcyBvcHRpb24gImFsd2F5cyBvbiIgKi8KLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0JCQkgInByb3h5OiBlcnJvciBzZXR0aW5nIHJldXNlYWRkciBvcHRpb24iKTsKLQkgICAgYXBfcGNsb3Nlc29ja2V0KHAsIGRzb2NrKTsKLQkgICAgYXBfYmNsb3NlKGYpOwotCSAgICByZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0jZW5kaWYgLypfT1NEX1BPU0lYKi8KLQl9Ci0KLQlpZiAoYmluZChkc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2VydmVyLAotCQkgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpID09IC0xKSB7Ci0JICAgIGNoYXIgYnVmZlsyMl07Ci0KLQkgICAgYXBfc25wcmludGYoYnVmZiwgc2l6ZW9mKGJ1ZmYpLCAiJXM6JWQiLCBpbmV0X250b2Eoc2VydmVyLnNpbl9hZGRyKSwgc2VydmVyLnNpbl9wb3J0KTsKLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0JCQkgInByb3h5OiBlcnJvciBiaW5kaW5nIHRvIGZ0cCBkYXRhIHNvY2tldCAlcyIsIGJ1ZmYpOwotCSAgICBhcF9iY2xvc2UoZik7Ci0JICAgIGFwX3BjbG9zZXNvY2tldChwLCBkc29jayk7Ci0JICAgIHJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLQl9Ci0JbGlzdGVuKGRzb2NrLCAyKTsJLyogb25seSBuZWVkIGEgc2hvcnQgcXVldWUgKi8KLSAgICB9Ci0KLS8qIHNldCByZXF1ZXN0OyAicGF0aCIgaG9sZHMgbGFzdCBwYXRoIGNvbXBvbmVudCAqLwotICAgIGxlbiA9IGRlY29kZWVuYyhwYXRoKTsKLQotICAgIC8qIFRNIC0gaWYgbGVuID09IDAgdGhlbiBpdCBtdXN0IGJlIGEgZGlyZWN0b3J5ICh5b3UgY2FuJ3QgUkVUUiBub3RoaW5nKSAqLwotCi0gICAgaWYgKGxlbiA9PSAwKSB7Ci0JcGFybXMgPSAiZCI7Ci0gICAgfQotICAgIGVsc2UgewotCWFwX2J2cHV0cyhmLCAiU0laRSAiLCBwYXRoLCBDUkxGLCBOVUxMKTsKLQlhcF9iZmx1c2goZik7Ci0JRXhwbGFpbjEoIkZUUDogU0laRSAlcyIsIHBhdGgpOwotCWkgPSBmdHBfZ2V0cmNfbXNnKGYsIHJlc3AsIHNpemVvZiByZXNwKTsKLQlFeHBsYWluMigiRlRQOiByZXR1cm5lZCBzdGF0dXMgJWQgd2l0aCByZXNwb25zZSAlcyIsIGksIHJlc3ApOwotCWlmIChpICE9IDUwMCkgewkJLyogU2l6ZSBjb21tYW5kIG5vdCByZWNvZ25pemVkICovCi0JICAgIGlmIChpID09IDU1MCkgewkvKiBOb3QgYSByZWd1bGFyIGZpbGUgKi8KLQkJRXhwbGFpbjAoIkZUUDogU0laRSBzaG93cyB0aGlzIGlzIGEgZGlyZWN0b3J5Iik7Ci0JCXBhcm1zID0gImQiOwotCQlhcF9idnB1dHMoZiwgIkNXRCAiLCBwYXRoLCBDUkxGLCBOVUxMKTsKLQkJYXBfYmZsdXNoKGYpOwotCQlFeHBsYWluMSgiRlRQOiBDV0QgJXMiLCBwYXRoKTsKLQkJaSA9IGZ0cF9nZXRyYyhmKTsKLQkJLyogcG9zc2libGUgcmVzdWx0czogMjUwLCA0MjEsIDUwMCwgNTAxLCA1MDIsIDUzMCwgNTUwICovCi0JCS8qIDI1MCBSZXF1ZXN0ZWQgZmlsZSBhY3Rpb24gb2theSwgY29tcGxldGVkLiAqLwotCQkvKiA0MjEgU2VydmljZSBub3QgYXZhaWxhYmxlLCBjbG9zaW5nIGNvbnRyb2wgY29ubmVjdGlvbi4gKi8KLQkJLyogNTAwIFN5bnRheCBlcnJvciwgY29tbWFuZCB1bnJlY29nbml6ZWQuICovCi0JCS8qIDUwMSBTeW50YXggZXJyb3IgaW4gcGFyYW1ldGVycyBvciBhcmd1bWVudHMuICovCi0JCS8qIDUwMiBDb21tYW5kIG5vdCBpbXBsZW1lbnRlZC4gKi8KLQkJLyogNTMwIE5vdCBsb2dnZWQgaW4uICovCi0JCS8qIDU1MCBSZXF1ZXN0ZWQgYWN0aW9uIG5vdCB0YWtlbi4gKi8KLQkJRXhwbGFpbjEoIkZUUDogcmV0dXJuZWQgc3RhdHVzICVkIiwgaSk7Ci0JCWlmIChpID09IC0xKSB7Ci0JCSAgICByZXR1cm4gYXBfcHJveHllcnJvcihyLCBIVFRQX0JBRF9HQVRFV0FZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcmVhZGluZyBmcm9tIHJlbW90ZSBzZXJ2ZXIiKTsKLQkJfQotCQlpZiAoaSA9PSA1NTApIHsKLQkJICAgIHJldHVybiBIVFRQX05PVF9GT1VORDsKLQkJfQotCQlpZiAoaSAhPSAyNTApIHsKLQkJICAgIHJldHVybiBIVFRQX0JBRF9HQVRFV0FZOwotCQl9Ci0JCXBhdGggPSAiIjsKLQkJbGVuID0gMDsKLQkgICAgfQotCSAgICBlbHNlIGlmIChpID09IDIxMykgeyAvKiBTaXplIGNvbW1hbmQgb2sgKi8KLQkJZm9yIChqID0gMDsgaiA8IHNpemVvZiByZXNwICYmIGFwX2lzZGlnaXQocmVzcFtqXSk7IGorKykKLQkJCTsKLQkJcmVzcFtqXSA9ICdcMCc7Ci0JCWlmIChyZXNwWzBdICE9ICdcMCcpCi0JCSAgICBzaXplID0gYXBfcHN0cmR1cChwLCByZXNwKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSNpZmRlZiBBVVRPREVURUNUX1BXRAotICAgIGFwX2J2cHV0cyhmLCAiUFdEIiwgQ1JMRiwgTlVMTCk7Ci0gICAgYXBfYmZsdXNoKGYpOwotICAgIEV4cGxhaW4wKCJGVFA6IFBXRCIpOwotLyogcmVzcG9uc2VzOiAyNTcsIDUwMCwgNTAxLCA1MDIsIDQyMSwgNTUwICovCi0gICAgLyogMjU3ICI8ZGlyZWN0b3J5LW5hbWU+IiA8Y29tbWVudGFyeT4gKi8KLSAgICAvKiA0MjEgU2VydmljZSBub3QgYXZhaWxhYmxlLCBjbG9zaW5nIGNvbnRyb2wgY29ubmVjdGlvbi4gKi8KLSAgICAvKiA1MDAgU3ludGF4IGVycm9yLCBjb21tYW5kIHVucmVjb2duaXplZC4gKi8KLSAgICAvKiA1MDEgU3ludGF4IGVycm9yIGluIHBhcmFtZXRlcnMgb3IgYXJndW1lbnRzLiAqLwotICAgIC8qIDUwMiBDb21tYW5kIG5vdCBpbXBsZW1lbnRlZC4gKi8KLSAgICAvKiA1NTAgUmVxdWVzdGVkIGFjdGlvbiBub3QgdGFrZW4uICovCi0gICAgaSA9IGZ0cF9nZXRyY19tc2coZiwgcmVzcCwgc2l6ZW9mIHJlc3ApOwotICAgIEV4cGxhaW4xKCJGVFA6IFBXRCByZXR1cm5lZCBzdGF0dXMgJWQiLCBpKTsKLSAgICBpZiAoaSA9PSAtMSB8fCBpID09IDQyMSkgewotCXJldHVybiBhcF9wcm94eWVycm9yKHIsIEhUVFBfQkFEX0dBVEVXQVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciByZWFkaW5nIGZyb20gcmVtb3RlIHNlcnZlciIpOwotICAgIH0KLSAgICBpZiAoaSA9PSA1NTApIHsKLQlyZXR1cm4gSFRUUF9OT1RfRk9VTkQ7Ci0gICAgfQotICAgIGlmIChpID09IDI1NykgewotCWNvbnN0IGNoYXIgKmRpcnAgPSByZXNwOwotCWN3ZCA9IGFwX2dldHdvcmRfY29uZihyLT5wb29sLCAmZGlycCk7Ci0gICAgfQotI2VuZGlmIC8qQVVUT0RFVEVDVF9QV0QqLwotCi0gICAgaWYgKHBhcm1zWzBdID09ICdkJykgewotCWlmIChsZW4gIT0gMCkKLQkgICAgYXBfYnZwdXRzKGYsICJMSVNUICIsIHBhdGgsIENSTEYsIE5VTEwpOwotCWVsc2UKLQkgICAgYXBfYnB1dHMoIkxJU1QgLWxhZyIgQ1JMRiwgZik7Ci0JRXhwbGFpbjEoIkZUUDogTElTVCAlcyIsIChsZW4gPT0gMCA/ICIiIDogcGF0aCkpOwotICAgIH0KLSAgICBlbHNlIHsKLQlhcF9idnB1dHMoZiwgIlJFVFIgIiwgcGF0aCwgQ1JMRiwgTlVMTCk7Ci0JRXhwbGFpbjEoIkZUUDogUkVUUiAlcyIsIHBhdGgpOwotICAgIH0KLSAgICBhcF9iZmx1c2goZik7Ci0vKiBSRVRSOiAxMTAsIDEyNSwgMTUwLCAyMjYsIDI1MCwgNDIxLCA0MjUsIDQyNiwgNDUwLCA0NTEsIDUwMCwgNTAxLCA1MzAsIDU1MAotICAgTkxTVDogMTI1LCAxNTAsIDIyNiwgMjUwLCA0MjEsIDQyNSwgNDI2LCA0NTAsIDQ1MSwgNTAwLCA1MDEsIDUwMiwgNTMwICovCi0gICAgLyogMTEwIFJlc3RhcnQgbWFya2VyIHJlcGx5LiAqLwotICAgIC8qIDEyNSBEYXRhIGNvbm5lY3Rpb24gYWxyZWFkeSBvcGVuOyB0cmFuc2ZlciBzdGFydGluZy4gKi8KLSAgICAvKiAxNTAgRmlsZSBzdGF0dXMgb2theTsgYWJvdXQgdG8gb3BlbiBkYXRhIGNvbm5lY3Rpb24uICovCi0gICAgLyogMjI2IENsb3NpbmcgZGF0YSBjb25uZWN0aW9uLiAqLwotICAgIC8qIDI1MCBSZXF1ZXN0ZWQgZmlsZSBhY3Rpb24gb2theSwgY29tcGxldGVkLiAqLwotICAgIC8qIDQyMSBTZXJ2aWNlIG5vdCBhdmFpbGFibGUsIGNsb3NpbmcgY29udHJvbCBjb25uZWN0aW9uLiAqLwotICAgIC8qIDQyNSBDYW4ndCBvcGVuIGRhdGEgY29ubmVjdGlvbi4gKi8KLSAgICAvKiA0MjYgQ29ubmVjdGlvbiBjbG9zZWQ7IHRyYW5zZmVyIGFib3J0ZWQuICovCi0gICAgLyogNDUwIFJlcXVlc3RlZCBmaWxlIGFjdGlvbiBub3QgdGFrZW4uICovCi0gICAgLyogNDUxIFJlcXVlc3RlZCBhY3Rpb24gYWJvcnRlZC4gTG9jYWwgZXJyb3IgaW4gcHJvY2Vzc2luZy4gKi8KLSAgICAvKiA1MDAgU3ludGF4IGVycm9yLCBjb21tYW5kIHVucmVjb2duaXplZC4gKi8KLSAgICAvKiA1MDEgU3ludGF4IGVycm9yIGluIHBhcmFtZXRlcnMgb3IgYXJndW1lbnRzLiAqLwotICAgIC8qIDUzMCBOb3QgbG9nZ2VkIGluLiAqLwotICAgIC8qIDU1MCBSZXF1ZXN0ZWQgYWN0aW9uIG5vdCB0YWtlbi4gKi8KLSAgICByYyA9IGZ0cF9nZXRyYyhmKTsKLSAgICBFeHBsYWluMSgiRlRQOiByZXR1cm5lZCBzdGF0dXMgJWQiLCByYyk7Ci0gICAgaWYgKHJjID09IC0xKSB7Ci0JcmV0dXJuIGFwX3Byb3h5ZXJyb3IociwgSFRUUF9CQURfR0FURVdBWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHJlYWRpbmcgZnJvbSByZW1vdGUgc2VydmVyIik7Ci0gICAgfQotICAgIGlmIChyYyA9PSA1NTApIHsKLQlFeHBsYWluMCgiRlRQOiBSRVRSIGZhaWxlZCwgdHJ5aW5nIExJU1QgaW5zdGVhZCIpOwotCXBhcm1zID0gImQiOwotCWFwX2J2cHV0cyhmLCAiQ1dEICIsIHBhdGgsIENSTEYsIE5VTEwpOwotCWFwX2JmbHVzaChmKTsKLQlFeHBsYWluMSgiRlRQOiBDV0QgJXMiLCBwYXRoKTsKLQkvKiBwb3NzaWJsZSByZXN1bHRzOiAyNTAsIDQyMSwgNTAwLCA1MDEsIDUwMiwgNTMwLCA1NTAgKi8KLQkvKiAyNTAgUmVxdWVzdGVkIGZpbGUgYWN0aW9uIG9rYXksIGNvbXBsZXRlZC4gKi8KLQkvKiA0MjEgU2VydmljZSBub3QgYXZhaWxhYmxlLCBjbG9zaW5nIGNvbnRyb2wgY29ubmVjdGlvbi4gKi8KLQkvKiA1MDAgU3ludGF4IGVycm9yLCBjb21tYW5kIHVucmVjb2duaXplZC4gKi8KLQkvKiA1MDEgU3ludGF4IGVycm9yIGluIHBhcmFtZXRlcnMgb3IgYXJndW1lbnRzLiAqLwotCS8qIDUwMiBDb21tYW5kIG5vdCBpbXBsZW1lbnRlZC4gKi8KLQkvKiA1MzAgTm90IGxvZ2dlZCBpbi4gKi8KLQkvKiA1NTAgUmVxdWVzdGVkIGFjdGlvbiBub3QgdGFrZW4uICovCi0JcmMgPSBmdHBfZ2V0cmMoZik7Ci0JRXhwbGFpbjEoIkZUUDogcmV0dXJuZWQgc3RhdHVzICVkIiwgcmMpOwotCWlmIChyYyA9PSAtMSkgewotCSAgICByZXR1cm4gYXBfcHJveHllcnJvcihyLCBIVFRQX0JBRF9HQVRFV0FZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHJlYWRpbmcgZnJvbSByZW1vdGUgc2VydmVyIik7Ci0JfQotCWlmIChyYyA9PSA1NTApIHsKLQkgICAgcmV0dXJuIEhUVFBfTk9UX0ZPVU5EOwotCX0KLQlpZiAocmMgIT0gMjUwKSB7Ci0JICAgIHJldHVybiBIVFRQX0JBRF9HQVRFV0FZOwotCX0KLQotI2lmZGVmIEFVVE9ERVRFQ1RfUFdECi0JYXBfYnZwdXRzKGYsICJQV0QiLCBDUkxGLCBOVUxMKTsKLQlhcF9iZmx1c2goZik7Ci0JRXhwbGFpbjAoIkZUUDogUFdEIik7Ci0vKiByZXNwb25zZXM6IDI1NywgNTAwLCA1MDEsIDUwMiwgNDIxLCA1NTAgKi8KLQkvKiAyNTcgIjxkaXJlY3RvcnktbmFtZT4iIDxjb21tZW50YXJ5PiAqLwotCS8qIDQyMSBTZXJ2aWNlIG5vdCBhdmFpbGFibGUsIGNsb3NpbmcgY29udHJvbCBjb25uZWN0aW9uLiAqLwotCS8qIDUwMCBTeW50YXggZXJyb3IsIGNvbW1hbmQgdW5yZWNvZ25pemVkLiAqLwotCS8qIDUwMSBTeW50YXggZXJyb3IgaW4gcGFyYW1ldGVycyBvciBhcmd1bWVudHMuICovCi0JLyogNTAyIENvbW1hbmQgbm90IGltcGxlbWVudGVkLiAqLwotCS8qIDU1MCBSZXF1ZXN0ZWQgYWN0aW9uIG5vdCB0YWtlbi4gKi8KLQlpID0gZnRwX2dldHJjX21zZyhmLCByZXNwLCBzaXplb2YgcmVzcCk7Ci0JRXhwbGFpbjEoIkZUUDogUFdEIHJldHVybmVkIHN0YXR1cyAlZCIsIGkpOwotCWlmIChpID09IC0xIHx8IGkgPT0gNDIxKSB7Ci0JICAgIHJldHVybiBhcF9wcm94eWVycm9yKHIsIEhUVFBfQkFEX0dBVEVXQVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcmVhZGluZyBmcm9tIHJlbW90ZSBzZXJ2ZXIiKTsKLQl9Ci0JaWYgKGkgPT0gNTUwKSB7Ci0JICAgIHJldHVybiBIVFRQX05PVF9GT1VORDsKLQl9Ci0JaWYgKGkgPT0gMjU3KSB7Ci0JICAgIGNvbnN0IGNoYXIgKmRpcnAgPSByZXNwOwotCSAgICBjd2QgPSBhcF9nZXR3b3JkX2NvbmYoci0+cG9vbCwgJmRpcnApOwotCX0KLSNlbmRpZiAvKkFVVE9ERVRFQ1RfUFdEKi8KLQotCWFwX2JwdXRzKCJMSVNUIC1sYWciIENSTEYsIGYpOwotCWFwX2JmbHVzaChmKTsKLQlFeHBsYWluMCgiRlRQOiBMSVNUIC1sYWciKTsKLQlyYyA9IGZ0cF9nZXRyYyhmKTsKLQlFeHBsYWluMSgiRlRQOiByZXR1cm5lZCBzdGF0dXMgJWQiLCByYyk7Ci0JaWYgKHJjID09IC0xKQotCSAgICByZXR1cm4gYXBfcHJveHllcnJvcihyLCBIVFRQX0JBRF9HQVRFV0FZLAotCQkJCSAiRXJyb3IgcmVhZGluZyBmcm9tIHJlbW90ZSBzZXJ2ZXIiKTsKLSAgICB9Ci0gICAgaWYgKHJjICE9IDEyNSAmJiByYyAhPSAxNTAgJiYgcmMgIT0gMjI2ICYmIHJjICE9IDI1MCkKLQlyZXR1cm4gSFRUUF9CQURfR0FURVdBWTsKLQotICAgIHItPnN0YXR1cyA9IEhUVFBfT0s7Ci0gICAgci0+c3RhdHVzX2xpbmUgPSAiMjAwIE9LIjsKLQotICAgIHJlc3BfaGRycyA9IGFwX21ha2VfdGFibGUocCwgMik7Ci0gICAgYy0+aGRycyA9IHJlc3BfaGRyczsKLQotICAgIGFwX3RhYmxlX3NldG4ocmVzcF9oZHJzLCAiRGF0ZSIsIGFwX2dtX3RpbWVzdHJfODIyKHItPnBvb2wsIHItPnJlcXVlc3RfdGltZSkpOwotICAgIGFwX3RhYmxlX3NldG4ocmVzcF9oZHJzLCAiU2VydmVyIiwgYXBfZ2V0X3NlcnZlcl92ZXJzaW9uKCkpOwotCi0gICAgaWYgKHBhcm1zWzBdID09ICdkJykKLQlhcF90YWJsZV9zZXRuKHJlc3BfaGRycywgIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L2h0bWwiKTsKLSAgICBlbHNlIHsKLQlpZiAoci0+Y29udGVudF90eXBlICE9IE5VTEwpIHsKLQkgICAgYXBfdGFibGVfc2V0bihyZXNwX2hkcnMsICJDb250ZW50LVR5cGUiLCByLT5jb250ZW50X3R5cGUpOwotCSAgICBFeHBsYWluMSgiRlRQOiBDb250ZW50LVR5cGUgc2V0IHRvICVzIiwgci0+Y29udGVudF90eXBlKTsKLQl9Ci0JZWxzZSB7Ci0JICAgIGFwX3RhYmxlX3NldG4ocmVzcF9oZHJzLCAiQ29udGVudC1UeXBlIiwgYXBfZGVmYXVsdF90eXBlKHIpKTsKLQl9Ci0JaWYgKHBhcm1zWzBdICE9ICdhJyAmJiBzaXplICE9IE5VTEwpIHsKLQkgICAgLyogV2UgInRydXN0IiB0aGUgZnRwIHNlcnZlciB0byByZWFsbHkgc2VydmUgKHNpemUpIGJ5dGVzLi4uICovCi0JICAgIGFwX3RhYmxlX3NldChyZXNwX2hkcnMsICJDb250ZW50LUxlbmd0aCIsIHNpemUpOwotCSAgICBFeHBsYWluMSgiRlRQOiBDb250ZW50LUxlbmd0aCBzZXQgdG8gJXMiLCBzaXplKTsKLQl9Ci0gICAgfQotICAgIGlmIChyLT5jb250ZW50X2VuY29kaW5nICE9IE5VTEwgJiYgci0+Y29udGVudF9lbmNvZGluZ1swXSAhPSAnXDAnKSB7Ci0JRXhwbGFpbjEoIkZUUDogQ29udGVudC1FbmNvZGluZyBzZXQgdG8gJXMiLCByLT5jb250ZW50X2VuY29kaW5nKTsKLQlhcF90YWJsZV9zZXRuKHJlc3BfaGRycywgIkNvbnRlbnQtRW5jb2RpbmciLCByLT5jb250ZW50X2VuY29kaW5nKTsKLSAgICB9Ci0KLS8qIGNoZWNrIGlmIE5vQ2FjaGUgZGlyZWN0aXZlIG9uIHRoaXMgaG9zdCAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBjb25mLT5ub2NhY2hlcy0+bmVsdHM7IGkrKykgewotCWlmICgobmNlbnRbaV0ubmFtZSAhPSBOVUxMICYmIHN0cnN0cihob3N0LCBuY2VudFtpXS5uYW1lKSAhPSBOVUxMKQotCSAgICB8fCBkZXN0YWRkci5zX2FkZHIgPT0gbmNlbnRbaV0uYWRkci5zX2FkZHIgfHwgbmNlbnRbaV0ubmFtZVswXSA9PSAnKicpCi0JICAgIG5vY2FjaGUgPSAxOwotICAgIH0KLQotICAgIGkgPSBhcF9wcm94eV9jYWNoZV91cGRhdGUoYywgcmVzcF9oZHJzLCAwLCBub2NhY2hlKTsKLQotICAgIGlmIChpICE9IERFQ0xJTkVEKSB7Ci0JYXBfcGNsb3Nlc29ja2V0KHAsIGRzb2NrKTsKLQlhcF9iY2xvc2UoZik7Ci0JcmV0dXJuIGk7Ci0gICAgfQotCi0gICAgaWYgKCFwYXN2bW9kZSkgewkJLyogd2FpdCBmb3IgY29ubmVjdGlvbiAqLwotCWNsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKLQlkbwotCSAgICBjc2QgPSBhY2NlcHQoZHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNlcnZlciwgJmNsZW4pOwotCXdoaWxlIChjc2QgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOwotCWlmIChjc2QgPT0gLTEpIHsKLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0JCQkgInByb3h5OiBmYWlsZWQgdG8gYWNjZXB0IGRhdGEgY29ubmVjdGlvbiIpOwotCSAgICBhcF9wY2xvc2Vzb2NrZXQocCwgZHNvY2spOwotCSAgICBhcF9iY2xvc2UoZik7Ci0JICAgIGlmIChjICE9IE5VTEwpCi0JCWMgPSBhcF9wcm94eV9jYWNoZV9lcnJvcihjKTsKLQkgICAgcmV0dXJuIEhUVFBfQkFEX0dBVEVXQVk7Ci0JfQotCWFwX25vdGVfY2xlYW51cHNfZm9yX3NvY2tldChwLCBjc2QpOwotCWRhdGEgPSBhcF9iY3JlYXRlKHAsIEJfUkRXUiB8IEJfU09DS0VUKTsKLQlhcF9icHVzaGZkKGRhdGEsIGNzZCk7Ci0gICAgfQotICAgIGVsc2UgewotCWRhdGEgPSBhcF9iY3JlYXRlKHAsIEJfUkRXUiB8IEJfU09DS0VUKTsKLQlhcF9icHVzaGZkKGRhdGEsIGRzb2NrKTsKLSAgICB9Ci0KLS8qIHNlbmQgcmVzcG9uc2UgKi8KLS8qIHdyaXRlIHN0YXR1cyBsaW5lICovCi0gICAgaWYgKCFyLT5hc3NiYWNrd2FyZHMpCi0JYXBfcnZwdXRzKHIsICJIVFRQLzEuMCAiLCByLT5zdGF0dXNfbGluZSwgQ1JMRiwgTlVMTCk7Ci0gICAgaWYgKGMgIT0gTlVMTCAmJiBjLT5mcCAhPSBOVUxMCi0JJiYgYXBfYnZwdXRzKGMtPmZwLCAiSFRUUC8xLjAgIiwgci0+c3RhdHVzX2xpbmUsIENSTEYsIE5VTEwpID09IC0xKSB7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBjLT5yZXEsCi0JCSJwcm94eTogZXJyb3Igd3JpdGluZyBDUkxGIHRvICVzIiwgYy0+dGVtcGZpbGUpOwotCSAgICBjID0gYXBfcHJveHlfY2FjaGVfZXJyb3IoYyk7Ci0gICAgfQotCi0vKiBzZW5kIGhlYWRlcnMgKi8KLSAgICB0ZG8ucmVxID0gcjsKLSAgICB0ZG8uY2FjaGUgPSBjOwotICAgIGFwX3RhYmxlX2RvKGFwX3Byb3h5X3NlbmRfaGRyX2xpbmUsICZ0ZG8sIHJlc3BfaGRycywgTlVMTCk7Ci0KLSAgICBpZiAoIXItPmFzc2JhY2t3YXJkcykKLQlhcF9ycHV0cyhDUkxGLCByKTsKLSAgICBpZiAoYyAhPSBOVUxMICYmIGMtPmZwICE9IE5VTEwgJiYgYXBfYnB1dHMoQ1JMRiwgYy0+ZnApID09IC0xKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGMtPnJlcSwKLQkgICAgInByb3h5OiBlcnJvciB3cml0aW5nIENSTEYgdG8gJXMiLCBjLT50ZW1wZmlsZSk7Ci0JYyA9IGFwX3Byb3h5X2NhY2hlX2Vycm9yKGMpOwotICAgIH0KLQotICAgIGFwX2JzZXRvcHQoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCT19CWVRFQ1QsICZ6ZXJvKTsKLSAgICByLT5zZW50X2JvZHljdCA9IDE7Ci0vKiBzZW5kIGJvZHkgKi8KLSAgICBpZiAoIXItPmhlYWRlcl9vbmx5KSB7Ci0JaWYgKHBhcm1zWzBdICE9ICdkJykgewotLyogd2UgbmVlZCB0byBzZXQgdGhpcyBmb3IgYXBfcHJveHlfc2VuZF9mYigpLi4uICovCi0JICAgIGlmIChjICE9IE5VTEwpCi0JCWMtPmNhY2hlX2NvbXBsZXRpb24gPSAwOwotCSAgICBhcF9wcm94eV9zZW5kX2ZiKGRhdGEsIHIsIGMpOwotCX0gZWxzZQotCSAgICBzZW5kX2RpcihkYXRhLCByLCBjLCBjd2QpOwotCi0JaWYgKHJjID09IDEyNSB8fCByYyA9PSAxNTApCi0JICAgIHJjID0gZnRwX2dldHJjKGYpOwotCi0JLyogWFhYOiB3ZSBjaGVja2VkIGZvciAxMjV8fDE1MHx8MjI2fHwyNTAgYWJvdmUuIFRoaXMgaXMgcmVkdW5kYW50LiAqLwotCWlmIChyYyAhPSAyMjYgJiYgcmMgIT0gMjUwKQotICAgICAgICAgICAgLyogWFhYOiB3ZSBubyBsb25nZXIgbG9nIGFuICJlcnJvciB3cml0aW5nIHRvIGMtPnRlbXBmaWxlIiAtIHNob3VsZCB3ZT8gKi8KLQkgICAgYyA9IGFwX3Byb3h5X2NhY2hlX2Vycm9yKGMpOwotICAgIH0KLSAgICBlbHNlIHsKLS8qIGFib3J0IHRoZSB0cmFuc2ZlciAqLwotCWFwX2JwdXRzKCJBQk9SIiBDUkxGLCBmKTsKLQlhcF9iZmx1c2goZik7Ci0JaWYgKCFwYXN2bW9kZSkKLQkgICAgYXBfYmNsb3NlKGRhdGEpOwotCUV4cGxhaW4wKCJGVFA6IEFCT1IiKTsKLS8qIHJlc3BvbnNlczogMjI1LCAyMjYsIDQyMSwgNTAwLCA1MDEsIDUwMiAqLwotICAgIC8qIDIyNSBEYXRhIGNvbm5lY3Rpb24gb3Blbjsgbm8gdHJhbnNmZXIgaW4gcHJvZ3Jlc3MuICovCi0gICAgLyogMjI2IENsb3NpbmcgZGF0YSBjb25uZWN0aW9uLiAqLwotICAgIC8qIDQyMSBTZXJ2aWNlIG5vdCBhdmFpbGFibGUsIGNsb3NpbmcgY29udHJvbCBjb25uZWN0aW9uLiAqLwotICAgIC8qIDUwMCBTeW50YXggZXJyb3IsIGNvbW1hbmQgdW5yZWNvZ25pemVkLiAqLwotICAgIC8qIDUwMSBTeW50YXggZXJyb3IgaW4gcGFyYW1ldGVycyBvciBhcmd1bWVudHMuICovCi0gICAgLyogNTAyIENvbW1hbmQgbm90IGltcGxlbWVudGVkLiAqLwotCWkgPSBmdHBfZ2V0cmMoZik7Ci0JRXhwbGFpbjEoIkZUUDogcmV0dXJuZWQgc3RhdHVzICVkIiwgaSk7Ci0gICAgfQotCi0gICAgYXBfcHJveHlfY2FjaGVfdGlkeShjKTsKLQotLyogZmluaXNoICovCi0gICAgYXBfYnB1dHMoIlFVSVQiIENSTEYsIGYpOwotICAgIGFwX2JmbHVzaChmKTsKLSAgICBFeHBsYWluMCgiRlRQOiBRVUlUIik7Ci0vKiByZXNwb25zZXM6IDIyMSwgNTAwICovCi0gICAgLyogMjIxIFNlcnZpY2UgY2xvc2luZyBjb250cm9sIGNvbm5lY3Rpb24uICovCi0gICAgLyogNTAwIFN5bnRheCBlcnJvciwgY29tbWFuZCB1bnJlY29nbml6ZWQuICovCi0gICAgaSA9IGZ0cF9nZXRyYyhmKTsKLSAgICBFeHBsYWluMSgiRlRQOiBRVUlUOiBzdGF0dXMgJWQiLCBpKTsKLQotICAgIGlmIChwYXN2bW9kZSkKLQlhcF9iY2xvc2UoZGF0YSk7Ci0gICAgYXBfYmNsb3NlKGYpOwotCi0gICAgYXBfcmZsdXNoKHIpOwkvKiBmbHVzaCBiZWZvcmUgZ2FyYmFnZSBjb2xsZWN0aW9uICovCi0KLSAgICBhcF9wcm94eV9nYXJiYWdlX2NvbGwocik7Ci0KLSAgICByZXR1cm4gT0s7Ci19CmRpZmYgLS1naXQgYS9tb2R1bGVzL3Byb3h5L3Byb3h5X2h0dHAuYyBiL21vZHVsZXMvcHJveHkvcHJveHlfaHR0cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzdiMzE0Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvcHJveHkvcHJveHlfaHR0cC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMyICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTYtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyogSFRUUCByb3V0aW5lcyBmb3IgQXBhY2hlIHByb3h5ICovCi0KLSNpbmNsdWRlICJtb2RfcHJveHkuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2luY2x1ZGUgInV0aWxfZGF0ZS5oIgotCi0vKgotICogQ2Fub25pY2FsaXNlIGh0dHAtbGlrZSBVUkxzLgotICogIHNjaGVtZSBpcyB0aGUgc2NoZW1lIGZvciB0aGUgVVJMCi0gKiAgdXJsICAgIGlzIHRoZSBVUkwgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QgJy8nCi0gKiAgZGVmX3BvcnQgaXMgdGhlIGRlZmF1bHQgcG9ydCBmb3IgdGhpcyBzY2hlbWUuCi0gKi8KLWludCBhcF9wcm94eV9odHRwX2Nhbm9uKHJlcXVlc3RfcmVjICpyLCBjaGFyICp1cmwsIGNvbnN0IGNoYXIgKnNjaGVtZSwgaW50IGRlZl9wb3J0KQotewotICAgIGNoYXIgKmhvc3QsICpwYXRoLCAqc2VhcmNoLCBzcG9ydFs3XTsKLSAgICBjb25zdCBjaGFyICplcnI7Ci0gICAgaW50IHBvcnQ7Ci0KLS8qIGRvIHN5bnRhdGljIGNoZWNrLgotICogV2UgYnJlYWsgdGhlIFVSTCBpbnRvIGhvc3QsIHBvcnQsIHBhdGgsIHNlYXJjaAotICovCi0gICAgcG9ydCA9IGRlZl9wb3J0OwotICAgIGVyciA9IGFwX3Byb3h5X2Nhbm9uX25ldGxvYyhyLT5wb29sLCAmdXJsLCBOVUxMLCBOVUxMLCAmaG9zdCwgJnBvcnQpOwotICAgIGlmIChlcnIpCi0JcmV0dXJuIEhUVFBfQkFEX1JFUVVFU1Q7Ci0KLS8qIG5vdyBwYXJzZSBwYXRoL3NlYXJjaCBhcmdzLCBhY2NvcmRpbmcgdG8gcmZjMTczOCAqLwotLyogTi5CLiBpZiB0aGlzIGlzbid0IGEgdHJ1ZSBwcm94eSByZXF1ZXN0LCB0aGVuIHRoZSBVUkwgX3BhdGhfCi0gKiBoYXMgYWxyZWFkeSBiZWVuIGRlY29kZWQuICBUcnVlIHByb3h5IHJlcXVlc3RzIGhhdmUgci0+dXJpCi0gKiA9PSByLT51bnBhcnNlZF91cmksIGFuZCBubyBvdGhlcnMgaGF2ZSB0aGF0IHByb3BlcnR5LgotICovCi0gICAgaWYgKHItPnVyaSA9PSByLT51bnBhcnNlZF91cmkpIHsKLQlzZWFyY2ggPSBzdHJjaHIodXJsLCAnPycpOwotCWlmIChzZWFyY2ggIT0gTlVMTCkKLQkgICAgKihzZWFyY2grKykgPSAnXDAnOwotICAgIH0KLSAgICBlbHNlCi0Jc2VhcmNoID0gci0+YXJnczsKLQotLyogcHJvY2VzcyBwYXRoICovCi0gICAgcGF0aCA9IGFwX3Byb3h5X2Nhbm9uZW5jKHItPnBvb2wsIHVybCwgc3RybGVuKHVybCksIGVuY19wYXRoLCByLT5wcm94eXJlcSk7Ci0gICAgaWYgKHBhdGggPT0gTlVMTCkKLQlyZXR1cm4gSFRUUF9CQURfUkVRVUVTVDsKLQotICAgIGlmIChwb3J0ICE9IGRlZl9wb3J0KQotCWFwX3NucHJpbnRmKHNwb3J0LCBzaXplb2Yoc3BvcnQpLCAiOiVkIiwgcG9ydCk7Ci0gICAgZWxzZQotCXNwb3J0WzBdID0gJ1wwJzsKLQotICAgIHItPmZpbGVuYW1lID0gYXBfcHN0cmNhdChyLT5wb29sLCAicHJveHk6Iiwgc2NoZW1lLCAiOi8vIiwgaG9zdCwgc3BvcnQsICIvIiwKLQkJICAgcGF0aCwgKHNlYXJjaCkgPyAiPyIgOiAiIiwgKHNlYXJjaCkgPyBzZWFyY2ggOiAiIiwgTlVMTCk7Ci0gICAgcmV0dXJuIE9LOwotfQotIAotc3RhdGljIGNvbnN0IGNoYXIgKnByb3h5X2xvY2F0aW9uX3JldmVyc2VfbWFwKHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICp1cmwpCi17Ci0gICAgdm9pZCAqc2NvbmY7Ci0gICAgcHJveHlfc2VydmVyX2NvbmYgKmNvbmY7Ci0gICAgc3RydWN0IHByb3h5X2FsaWFzICplbnQ7Ci0gICAgaW50IGksIGwxLCBsMjsKLSAgICBjaGFyICp1OwotCi0gICAgc2NvbmYgPSByLT5zZXJ2ZXItPm1vZHVsZV9jb25maWc7Ci0gICAgY29uZiA9IChwcm94eV9zZXJ2ZXJfY29uZiAqKWFwX2dldF9tb2R1bGVfY29uZmlnKHNjb25mLCAmcHJveHlfbW9kdWxlKTsKLSAgICBsMSA9IHN0cmxlbih1cmwpOwotICAgIGVudCA9IChzdHJ1Y3QgcHJveHlfYWxpYXMgKiljb25mLT5yYWxpYXNlcy0+ZWx0czsKLSAgICBmb3IgKGkgPSAwOyBpIDwgY29uZi0+cmFsaWFzZXMtPm5lbHRzOyBpKyspIHsKLSAgICAgICAgbDIgPSBzdHJsZW4oZW50W2ldLnJlYWwpOwotICAgICAgICBpZiAobDEgPj0gbDIgJiYgc3RybmNtcChlbnRbaV0ucmVhbCwgdXJsLCBsMikgPT0gMCkgewotICAgICAgICAgICAgdSA9IGFwX3BzdHJjYXQoci0+cG9vbCwgZW50W2ldLmZha2UsICZ1cmxbbDJdLCBOVUxMKTsKLSAgICAgICAgICAgIHJldHVybiBhcF9jb25zdHJ1Y3RfdXJsKHItPnBvb2wsIHUsIHIpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB1cmw7Ci19Ci0KLS8qIENsZWFyIGFsbCBjb25uZWN0aW9uLWJhc2VkIGhlYWRlcnMgZnJvbSB0aGUgaW5jb21pbmcgaGVhZGVycyBhcF90YWJsZV90ICovCi1zdGF0aWMgdm9pZCBjbGVhcl9jb25uZWN0aW9uKGFwX2NvbnRleHRfdCAqcCwgYXBfdGFibGVfdCAqaGVhZGVycykKLXsKLSAgICBjb25zdCBjaGFyICpuYW1lOwotICAgIGNoYXIgKm5leHQgPSBhcF9wc3RyZHVwKHAsIGFwX3RhYmxlX2dldChoZWFkZXJzLCAiQ29ubmVjdGlvbiIpKTsKLQotICAgIGFwX3RhYmxlX3Vuc2V0KGhlYWRlcnMsICJQcm94eS1Db25uZWN0aW9uIik7Ci0gICAgaWYgKCFuZXh0KQotCXJldHVybjsKLQotICAgIHdoaWxlICgqbmV4dCkgewotCW5hbWUgPSBuZXh0OwotCXdoaWxlICgqbmV4dCAmJiAhYXBfaXNzcGFjZSgqbmV4dCkgJiYgKCpuZXh0ICE9ICcsJykpCi0JICAgICsrbmV4dDsKLQl3aGlsZSAoKm5leHQgJiYgKGFwX2lzc3BhY2UoKm5leHQpIHx8ICgqbmV4dCA9PSAnLCcpKSkgewotCSAgICAqbmV4dCA9ICdcMCc7Ci0JICAgICsrbmV4dDsKLQl9Ci0JYXBfdGFibGVfdW5zZXQoaGVhZGVycywgbmFtZSk7Ci0gICAgfQotICAgIGFwX3RhYmxlX3Vuc2V0KGhlYWRlcnMsICJDb25uZWN0aW9uIik7Ci19Ci0KLS8qCi0gKiBUaGlzIGhhbmRsZXMgaHR0cDovLyBVUkxzLCBhbmQgb3RoZXIgVVJMcyB1c2luZyBhIHJlbW90ZSBwcm94eSBvdmVyIGh0dHAKLSAqIElmIHByb3h5aG9zdCBpcyBOVUxMLCB0aGVuIGNvbnRhY3QgdGhlIHNlcnZlciBkaXJlY3RseSwgb3RoZXJ3aXNlCi0gKiBnbyB2aWEgdGhlIHByb3h5LgotICogTm90ZSB0aGF0IGlmIGEgcHJveHkgaXMgdXNlZCwgdGhlbiBVUkxzIG90aGVyIHRoYW4gaHR0cDogY2FuIGJlIGFjY2Vzc2VkLAotICogYWxzbywgaWYgd2UgaGF2ZSB0cm91YmxlIHdoaWNoIGlzIGNsZWFybHkgc3BlY2lmaWMgdG8gdGhlIHByb3h5LCB0aGVuCi0gKiB3ZSByZXR1cm4gREVDTElORUQgc28gdGhhdCB3ZSBjYW4gdHJ5IGFub3RoZXIgcHJveHkuIChPciB0aGUgZGlyZWN0Ci0gKiByb3V0ZS4pCi0gKi8KLWludCBhcF9wcm94eV9odHRwX2hhbmRsZXIocmVxdWVzdF9yZWMgKnIsIGNhY2hlX3JlcSAqYywgY2hhciAqdXJsLAotCQkgICAgICAgY29uc3QgY2hhciAqcHJveHlob3N0LCBpbnQgcHJveHlwb3J0KQotewotICAgIGNvbnN0IGNoYXIgKnN0cnA7Ci0gICAgY2hhciAqc3RycDI7Ci0gICAgY29uc3QgY2hhciAqZXJyLCAqZGVzdGhvc3Q7Ci0gICAgaW50IGksIGosIHNvY2ssIGxlbiwgYmFja2Fzc3dhcmRzOwotICAgIGFwX2FycmF5X2hlYWRlcl90ICpyZXFoZHJzX2FycjsKLSAgICBhcF90YWJsZV90ICpyZXNwX2hkcnM7Ci0gICAgdGFibGVfZW50cnkgKnJlcWhkcnM7Ci0gICAgc3RydWN0IHNvY2thZGRyX2luIHNlcnZlcjsKLSAgICBzdHJ1Y3QgaW5fYWRkciBkZXN0YWRkcjsKLSAgICBzdHJ1Y3QgaG9zdGVudCBzZXJ2ZXJfaHA7Ci0gICAgQlVGRiAqZjsKLSAgICBjaGFyIGJ1ZmZlcltIVUdFX1NUUklOR19MRU5dOwotICAgIGNoYXIgcG9ydHN0clszMl07Ci0gICAgYXBfY29udGV4dF90ICpwID0gci0+cG9vbDsKLSAgICBjb25zdCBsb25nIGludCB6ZXJvID0gMEw7Ci0gICAgaW50IGRlc3Rwb3J0ID0gMDsKLSAgICBjaGFyICpkZXN0cG9ydHN0ciA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciAqdXJscHRyID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICpkYXRlc3RyOwotICAgIHN0cnVjdCB0YmxfZG9fYXJncyB0ZG87Ci0KLSAgICB2b2lkICpzY29uZiA9IHItPnNlcnZlci0+bW9kdWxlX2NvbmZpZzsKLSAgICBwcm94eV9zZXJ2ZXJfY29uZiAqY29uZiA9Ci0gICAgKHByb3h5X3NlcnZlcl9jb25mICopIGFwX2dldF9tb2R1bGVfY29uZmlnKHNjb25mLCAmcHJveHlfbW9kdWxlKTsKLSAgICBzdHJ1Y3Qgbm9wcm94eV9lbnRyeSAqbnBlbnQgPSAoc3RydWN0IG5vcHJveHlfZW50cnkgKikgY29uZi0+bm9wcm94aWVzLT5lbHRzOwotICAgIHN0cnVjdCBub2NhY2hlX2VudHJ5ICpuY2VudCA9IChzdHJ1Y3Qgbm9jYWNoZV9lbnRyeSAqKSBjb25mLT5ub2NhY2hlcy0+ZWx0czsKLSAgICBpbnQgbm9jYWNoZSA9IDA7Ci0KLSAgICBtZW1zZXQoJnNlcnZlciwgJ1wwJywgc2l6ZW9mKHNlcnZlcikpOwotICAgIHNlcnZlci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQotLyogV2UgYnJlYWsgdGhlIFVSTCBpbnRvIGhvc3QsIHBvcnQsIHBhdGgtc2VhcmNoICovCi0KLSAgICB1cmxwdHIgPSBzdHJzdHIodXJsLCAiOi8vIik7Ci0gICAgaWYgKHVybHB0ciA9PSBOVUxMKQotCXJldHVybiBIVFRQX0JBRF9SRVFVRVNUOwotICAgIHVybHB0ciArPSAzOwotICAgIGRlc3Rwb3J0ID0gREVGQVVMVF9IVFRQX1BPUlQ7Ci0gICAgc3RycCA9IHN0cmNocih1cmxwdHIsICcvJyk7Ci0gICAgaWYgKHN0cnAgPT0gTlVMTCkgewotCWRlc3Rob3N0ID0gYXBfcHN0cmR1cChwLCB1cmxwdHIpOwotCXVybHB0ciA9ICIvIjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JY2hhciAqcSA9IGFwX3BhbGxvYyhwLCBzdHJwIC0gdXJscHRyICsgMSk7Ci0JbWVtY3B5KHEsIHVybHB0ciwgc3RycCAtIHVybHB0cik7Ci0JcVtzdHJwIC0gdXJscHRyXSA9ICdcMCc7Ci0JdXJscHRyID0gc3RycDsKLQlkZXN0aG9zdCA9IHE7Ci0gICAgfQotCi0gICAgc3RycDIgPSBzdHJjaHIoZGVzdGhvc3QsICc6Jyk7Ci0gICAgaWYgKHN0cnAyICE9IE5VTEwpIHsKLQkqKHN0cnAyKyspID0gJ1wwJzsKLQlpZiAoYXBfaXNkaWdpdCgqc3RycDIpKSB7Ci0JICAgIGRlc3Rwb3J0ID0gYXRvaShzdHJwMik7Ci0JICAgIGRlc3Rwb3J0c3RyID0gc3RycDI7Ci0JfQotICAgIH0KLQotLyogY2hlY2sgaWYgUHJveHlCbG9jayBkaXJlY3RpdmUgb24gdGhpcyBob3N0ICovCi0gICAgZGVzdGFkZHIuc19hZGRyID0gYXBfaW5ldF9hZGRyKGRlc3Rob3N0KTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgY29uZi0+bm9wcm94aWVzLT5uZWx0czsgaSsrKSB7Ci0JaWYgKChucGVudFtpXS5uYW1lICE9IE5VTEwgJiYgc3Ryc3RyKGRlc3Rob3N0LCBucGVudFtpXS5uYW1lKSAhPSBOVUxMKQotCSAgICB8fCBkZXN0YWRkci5zX2FkZHIgPT0gbnBlbnRbaV0uYWRkci5zX2FkZHIgfHwgbnBlbnRbaV0ubmFtZVswXSA9PSAnKicpCi0JICAgIHJldHVybiBhcF9wcm94eWVycm9yKHIsIEhUVFBfRk9SQklEREVOLAotCQkJCSAiQ29ubmVjdCB0byByZW1vdGUgbWFjaGluZSBibG9ja2VkIik7Ci0gICAgfQotCi0gICAgaWYgKHByb3h5aG9zdCAhPSBOVUxMKSB7Ci0Jc2VydmVyLnNpbl9wb3J0ID0gaHRvbnMocHJveHlwb3J0KTsKLQllcnIgPSBhcF9wcm94eV9ob3N0MmFkZHIocHJveHlob3N0LCAmc2VydmVyX2hwKTsKLQlpZiAoZXJyICE9IE5VTEwpCi0JICAgIHJldHVybiBERUNMSU5FRDsJLyogdHJ5IGFub3RoZXIgKi8KLSAgICB9Ci0gICAgZWxzZSB7Ci0Jc2VydmVyLnNpbl9wb3J0ID0gaHRvbnMoZGVzdHBvcnQpOwotCWVyciA9IGFwX3Byb3h5X2hvc3QyYWRkcihkZXN0aG9zdCwgJnNlcnZlcl9ocCk7Ci0JaWYgKGVyciAhPSBOVUxMKQotCSAgICByZXR1cm4gYXBfcHJveHllcnJvcihyLCBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgZXJyKTsKLSAgICB9Ci0KLSAgICBzb2NrID0gYXBfcHNvY2tldChwLCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOwotICAgIGlmIChzb2NrID09IC0xKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0JCSAgICAicHJveHk6IGVycm9yIGNyZWF0aW5nIHNvY2tldCIpOwotCXJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAoY29uZi0+cmVjdl9idWZmZXJfc2l6ZSkgewotCWlmIChzZXRzb2Nrb3B0KHNvY2ssIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwKLQkJICAgICAgIChjb25zdCBjaGFyICopICZjb25mLT5yZWN2X2J1ZmZlcl9zaXplLCBzaXplb2YoaW50KSkKLQkgICAgPT0gLTEpIHsKLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0JCQkgInNldHNvY2tvcHQoU09fUkNWQlVGKTogRmFpbGVkIHRvIHNldCBQcm94eVJlY2VpdmVCdWZmZXJTaXplLCB1c2luZyBkZWZhdWx0Iik7Ci0JfQotICAgIH0KLQotI2lmZGVmIFNJTklYX0RfUkVTT0xWRVJfQlVHCi0gICAgewotCXN0cnVjdCBpbl9hZGRyICppcF9hZGRyID0gKHN0cnVjdCBpbl9hZGRyICopICpzZXJ2ZXJfaHAuaF9hZGRyX2xpc3Q7Ci0KLQlmb3IgKDsgaXBfYWRkci0+c19hZGRyICE9IDA7ICsraXBfYWRkcikgewotCSAgICBtZW1jcHkoJnNlcnZlci5zaW5fYWRkciwgaXBfYWRkciwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7Ci0JICAgIGkgPSBhcF9wcm94eV9kb2Nvbm5lY3Qoc29jaywgJnNlcnZlciwgcik7Ci0JICAgIGlmIChpID09IDApCi0JCWJyZWFrOwotCX0KLSAgICB9Ci0jZWxzZQotICAgIGogPSAwOwotICAgIHdoaWxlIChzZXJ2ZXJfaHAuaF9hZGRyX2xpc3Rbal0gIT0gTlVMTCkgewotCW1lbWNweSgmc2VydmVyLnNpbl9hZGRyLCBzZXJ2ZXJfaHAuaF9hZGRyX2xpc3Rbal0sCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOwotCWkgPSBhcF9wcm94eV9kb2Nvbm5lY3Qoc29jaywgJnNlcnZlciwgcik7Ci0JaWYgKGkgPT0gMCkKLQkgICAgYnJlYWs7Ci0JaisrOwotICAgIH0KLSNlbmRpZgotICAgIGlmIChpID09IC0xKSB7Ci0JaWYgKHByb3h5aG9zdCAhPSBOVUxMKQotCSAgICByZXR1cm4gREVDTElORUQ7CS8qIHRyeSBhZ2FpbiBhbm90aGVyIHdheSAqLwotCWVsc2UKLQkgICAgcmV0dXJuIGFwX3Byb3h5ZXJyb3IociwgSFRUUF9CQURfR0FURVdBWSwgYXBfcHN0cmNhdChyLT5wb29sLAotCQkJCSJDb3VsZCBub3QgY29ubmVjdCB0byByZW1vdGUgbWFjaGluZTogIiwKLQkJCQlzdHJlcnJvcihlcnJubyksIE5VTEwpKTsKLSAgICB9Ci0KLSAgICBjbGVhcl9jb25uZWN0aW9uKHItPnBvb2wsIHItPmhlYWRlcnNfaW4pOwkvKiBTdHJpcCBjb25uZWN0aW9uLWJhc2VkIGhlYWRlcnMgKi8KLQotICAgIGYgPSBhcF9iY3JlYXRlKHAsIEJfUkRXUiB8IEJfU09DS0VUKTsKLSAgICBhcF9icHVzaGZkKGYsIHNvY2spOwotCi0gICAgYXBfYnZwdXRzKGYsIHItPm1ldGhvZCwgIiAiLCBwcm94eWhvc3QgPyB1cmwgOiB1cmxwdHIsICIgSFRUUC8xLjAiIENSTEYsCi0JICAgTlVMTCk7Ci0gICAgaWYgKGRlc3Rwb3J0c3RyICE9IE5VTEwgJiYgZGVzdHBvcnQgIT0gREVGQVVMVF9IVFRQX1BPUlQpCi0JYXBfYnZwdXRzKGYsICJIb3N0OiAiLCBkZXN0aG9zdCwgIjoiLCBkZXN0cG9ydHN0ciwgQ1JMRiwgTlVMTCk7Ci0gICAgZWxzZQotCWFwX2J2cHV0cyhmLCAiSG9zdDogIiwgZGVzdGhvc3QsIENSTEYsIE5VTEwpOwotCi0gICAgaWYgKGNvbmYtPnZpYW9wdCA9PSB2aWFfYmxvY2spIHsKLQkvKiBCbG9jayBhbGwgb3V0Z29pbmcgVmlhOiBoZWFkZXJzICovCi0JYXBfdGFibGVfdW5zZXQoci0+aGVhZGVyc19pbiwgIlZpYSIpOwotICAgIH0gZWxzZSBpZiAoY29uZi0+dmlhb3B0ICE9IHZpYV9vZmYpIHsKLQkvKiBDcmVhdGUgYSAiVmlhOiIgcmVxdWVzdCBoZWFkZXIgZW50cnkgYW5kIG1lcmdlIGl0ICovCi0JaSA9IGFwX2dldF9zZXJ2ZXJfcG9ydChyKTsKLQlpZiAoYXBfaXNfZGVmYXVsdF9wb3J0KGkscikpIHsKLQkgICAgc3RyY3B5KHBvcnRzdHIsIiIpOwotCX0gZWxzZSB7Ci0JICAgIGFwX3NucHJpbnRmKHBvcnRzdHIsIHNpemVvZiBwb3J0c3RyLCAiOiVkIiwgaSk7Ci0JfQotCS8qIEdlbmVyYXRlIG91dGdvaW5nIFZpYTogaGVhZGVyIHdpdGgvd2l0aG91dCBzZXJ2ZXIgY29tbWVudDogKi8KLQlhcF90YWJsZV9tZXJnZW4oci0+aGVhZGVyc19pbiwgIlZpYSIsCi0JCSAgICAoY29uZi0+dmlhb3B0ID09IHZpYV9mdWxsKQotCQkJPyBhcF9wc3ByaW50ZihwLCAiJWQuJWQgJXMlcyAoJXMpIiwKLQkJCQlIVFRQX1ZFUlNJT05fTUFKT1Ioci0+cHJvdG9fbnVtKSwKLQkJCQlIVFRQX1ZFUlNJT05fTUlOT1Ioci0+cHJvdG9fbnVtKSwKLQkJCQlhcF9nZXRfc2VydmVyX25hbWUociksIHBvcnRzdHIsCi0JCQkJU0VSVkVSX0JBU0VWRVJTSU9OKQotCQkJOiBhcF9wc3ByaW50ZihwLCAiJWQuJWQgJXMlcyIsCi0JCQkJSFRUUF9WRVJTSU9OX01BSk9SKHItPnByb3RvX251bSksCi0JCQkJSFRUUF9WRVJTSU9OX01JTk9SKHItPnByb3RvX251bSksCi0JCQkJYXBfZ2V0X3NlcnZlcl9uYW1lKHIpLCBwb3J0c3RyKQotCQkJKTsKLSAgICB9Ci0KLSAgICByZXFoZHJzX2FyciA9IGFwX3RhYmxlX2VsdHMoci0+aGVhZGVyc19pbik7Ci0gICAgcmVxaGRycyA9ICh0YWJsZV9lbnRyeSAqKSByZXFoZHJzX2Fyci0+ZWx0czsKLSAgICBmb3IgKGkgPSAwOyBpIDwgcmVxaGRyc19hcnItPm5lbHRzOyBpKyspIHsKLQlpZiAocmVxaGRyc1tpXS5rZXkgPT0gTlVMTCB8fCByZXFoZHJzW2ldLnZhbCA9PSBOVUxMCi0JLyogQ2xlYXIgb3V0IGhlYWRlcnMgbm90IHRvIHNlbmQgKi8KLQkgICAgfHwgIXN0cmNhc2VjbXAocmVxaGRyc1tpXS5rZXksICJIb3N0IikJLyogQWxyZWFkeSBzZW50ICovCi0JICAgIC8qIFhYWDogQEBAIEZJWE1FOiAiUHJveHktQXV0aG9yaXphdGlvbiIgc2hvdWxkICpvbmx5KiBiZSAKLQkgICAgICogc3VwcHJlc3NlZCBpZiBUSElTIHNlcnZlciByZXF1ZXN0ZWQgdGhlIGF1dGhlbnRpY2F0aW9uLAotCSAgICAgKiBub3Qgd2hlbiBhIGZyb250ZW5kIHByb3h5IHJlcXVlc3RlZCBpdCEKLQkgICAgICovCi0JICAgIHx8ICFzdHJjYXNlY21wKHJlcWhkcnNbaV0ua2V5LCAiUHJveHktQXV0aG9yaXphdGlvbiIpKQotCSAgICBjb250aW51ZTsKLQlhcF9idnB1dHMoZiwgcmVxaGRyc1tpXS5rZXksICI6ICIsIHJlcWhkcnNbaV0udmFsLCBDUkxGLCBOVUxMKTsKLSAgICB9Ci0KLSAgICBhcF9icHV0cyhDUkxGLCBmKTsKLS8qIHNlbmQgdGhlIHJlcXVlc3QgZGF0YSwgaWYgYW55LiAqLwotCi0gICAgaWYgKGFwX3Nob3VsZF9jbGllbnRfYmxvY2socikpIHsKLQl3aGlsZSAoKGkgPSBhcF9nZXRfY2xpZW50X2Jsb2NrKHIsIGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlcikpID4gMCkKLQkgICAgYXBfYndyaXRlKGYsIGJ1ZmZlciwgaSk7Ci0gICAgfQotICAgIGFwX2JmbHVzaChmKTsKLQotICAgIGxlbiA9IGFwX2JnZXRzKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciAtIDEsIGYpOwotICAgIGlmIChsZW4gPT0gLTEpIHsKLQlhcF9iY2xvc2UoZik7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0JCSAgICAgImFwX2JnZXRzKCkgLSBwcm94eSByZWNlaXZlIC0gRXJyb3IgcmVhZGluZyBmcm9tIHJlbW90ZSBzZXJ2ZXIgJXMgKGxlbmd0aCAlZCkiLAotCQkgICAgIHByb3h5aG9zdCA/IHByb3h5aG9zdCA6IGRlc3Rob3N0LCBsZW4pOwotCXJldHVybiBhcF9wcm94eWVycm9yKHIsIEhUVFBfQkFEX0dBVEVXQVksCi0JCQkgICAgICJFcnJvciByZWFkaW5nIGZyb20gcmVtb3RlIHNlcnZlciIpOwotICAgIH0gZWxzZSBpZiAobGVuID09IDApIHsKLQlhcF9iY2xvc2UoZik7Ci0JcmV0dXJuIGFwX3Byb3h5ZXJyb3IociwgSFRUUF9CQURfR0FURVdBWSwKLQkJCSAgICAgIkRvY3VtZW50IGNvbnRhaW5zIG5vIGRhdGEiKTsKLSAgICB9Ci0KLS8qIElzIGl0IGFuIEhUVFAvMSByZXNwb25zZT8gIFRoaXMgaXMgYnVnZ3kgaWYgd2UgZXZlciBzZWUgYW4gSFRUUC8xLjEwICovCi0gICAgaWYgKGFwX2NoZWNrbWFzayhidWZmZXIsICJIVFRQLyMuIyAjIyMqIikpIHsKLQlpbnQgbWFqb3IsIG1pbm9yOwotCWlmICgyICE9IHNzY2FuZihidWZmZXIsICJIVFRQLyV1LiV1IiwgJm1ham9yLCAmbWlub3IpKSB7Ci0JICAgIG1ham9yID0gMTsKLQkgICAgbWlub3IgPSAwOwotCX0KLQotLyogSWYgbm90IGFuIEhUVFAvMSBtZXNzYWdlIG9yIGlmIHRoZSBzdGF0dXMgbGluZSB3YXMgPiA4MTkyIGJ5dGVzICovCi0JaWYgKGJ1ZmZlcls1XSAhPSAnMScgfHwgYnVmZmVyW2xlbiAtIDFdICE9ICdcbicpIHsKLQkgICAgYXBfYmNsb3NlKGYpOwotCSAgICByZXR1cm4gSFRUUF9CQURfR0FURVdBWTsKLQl9Ci0JYmFja2Fzc3dhcmRzID0gMDsKLQlidWZmZXJbLS1sZW5dID0gJ1wwJzsKLQotCWJ1ZmZlclsxMl0gPSAnXDAnOwotCXItPnN0YXR1cyA9IGF0b2koJmJ1ZmZlcls5XSk7Ci0JYnVmZmVyWzEyXSA9ICcgJzsKLQlyLT5zdGF0dXNfbGluZSA9IGFwX3BzdHJkdXAocCwgJmJ1ZmZlcls5XSk7Ci0KLS8qIHJlYWQgdGhlIGhlYWRlcnMuICovCi0vKiBOLkIuIGZvciBIVFRQLzEuMCBjbGllbnRzLCB3ZSBoYXZlIHRvIGZvbGQgbGluZS13cmFwcGVkIGhlYWRlcnMgKi8KLS8qIEFsc28sIHRha2UgY2FyZSB3aXRoIGhlYWRlcnMgd2l0aCBtdWx0aXBsZSBvY2N1cmVuY2VzLiAqLwotCi0JcmVzcF9oZHJzID0gYXBfcHJveHlfcmVhZF9oZWFkZXJzKHIsIGJ1ZmZlciwgSFVHRV9TVFJJTkdfTEVOLCBmKTsKLQlpZiAocmVzcF9oZHJzID09IE5VTEwpIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkd8QVBMT0dfTk9FUlJOTywgci0+c2VydmVyLAotCQkgInByb3h5OiBCYWQgSFRUUC8lZC4lZCBoZWFkZXIgcmV0dXJuZWQgYnkgJXMgKCVzKSIsCi0JCSBtYWpvciwgbWlub3IsIHItPnVyaSwgci0+bWV0aG9kKTsKLQkgICAgcmVzcF9oZHJzID0gYXBfbWFrZV90YWJsZShwLCAyMCk7Ci0JICAgIG5vY2FjaGUgPSAxOyAgICAvKiBkbyBub3QgY2FjaGUgdGhpcyBicm9rZW4gZmlsZSAqLwotCX0KLQotCWlmIChjb25mLT52aWFvcHQgIT0gdmlhX29mZiAmJiBjb25mLT52aWFvcHQgIT0gdmlhX2Jsb2NrKSB7Ci0JICAgIC8qIENyZWF0ZSBhICJWaWE6IiByZXNwb25zZSBoZWFkZXIgZW50cnkgYW5kIG1lcmdlIGl0ICovCi0JICAgIGkgPSBhcF9nZXRfc2VydmVyX3BvcnQocik7Ci0JICAgIGlmIChhcF9pc19kZWZhdWx0X3BvcnQoaSxyKSkgewotCQlzdHJjcHkocG9ydHN0ciwiIik7Ci0JICAgIH0gZWxzZSB7Ci0JCWFwX3NucHJpbnRmKHBvcnRzdHIsIHNpemVvZiBwb3J0c3RyLCAiOiVkIiwgaSk7Ci0JICAgIH0KLQkgICAgYXBfdGFibGVfbWVyZ2VuKCh0YWJsZSAqKXJlc3BfaGRycywgIlZpYSIsCi0JCQkgICAgKGNvbmYtPnZpYW9wdCA9PSB2aWFfZnVsbCkKLQkJCSAgICA/IGFwX3BzcHJpbnRmKHAsICIlZC4lZCAlcyVzICglcykiLAotCQkJCW1ham9yLCBtaW5vciwKLQkJCQlhcF9nZXRfc2VydmVyX25hbWUociksIHBvcnRzdHIsCi0JCQkJU0VSVkVSX0JBU0VWRVJTSU9OKQotCQkJICAgIDogYXBfcHNwcmludGYocCwgIiVkLiVkICVzJXMiLAotCQkJCW1ham9yLCBtaW5vciwKLQkJCQlhcF9nZXRfc2VydmVyX25hbWUociksIHBvcnRzdHIpCi0JCQkgICAgKTsKLQl9Ci0KLQljbGVhcl9jb25uZWN0aW9uKHAsIHJlc3BfaGRycyk7CS8qIFN0cmlwIENvbm5lY3Rpb24gaGRycyAqLwotICAgIH0KLSAgICBlbHNlIHsKLS8qIGFuIGh0dHAvMC45IHJlc3BvbnNlICovCi0JYmFja2Fzc3dhcmRzID0gMTsKLQlyLT5zdGF0dXMgPSAyMDA7Ci0Jci0+c3RhdHVzX2xpbmUgPSAiMjAwIE9LIjsKLQotLyogbm8gaGVhZGVycyAqLwotCXJlc3BfaGRycyA9IGFwX21ha2VfdGFibGUocCwgMjApOwotICAgIH0KLQotICAgIGMtPmhkcnMgPSByZXNwX2hkcnM7Ci0KLQotLyoKLSAqIEhUVFAvMS4wIHJlcXVpcmVzIHVzIHRvIGFjY2VwdCAzIHR5cGVzIG9mIGRhdGVzLCBidXQgb25seSBnZW5lcmF0ZQotICogb25lIHR5cGUKLSAqLwotICAgIGlmICgoZGF0ZXN0ciA9IGFwX3RhYmxlX2dldChyZXNwX2hkcnMsICJEYXRlIikpICE9IE5VTEwpCi0JYXBfdGFibGVfc2V0KHJlc3BfaGRycywgIkRhdGUiLCBhcF9wcm94eV9kYXRlX2Nhbm9uKHAsIGRhdGVzdHIpKTsKLSAgICBpZiAoKGRhdGVzdHIgPSBhcF90YWJsZV9nZXQocmVzcF9oZHJzLCAiTGFzdC1Nb2RpZmllZCIpKSAhPSBOVUxMKQotCWFwX3RhYmxlX3NldChyZXNwX2hkcnMsICJMYXN0LU1vZGlmaWVkIiwgYXBfcHJveHlfZGF0ZV9jYW5vbihwLCBkYXRlc3RyKSk7Ci0gICAgaWYgKChkYXRlc3RyID0gYXBfdGFibGVfZ2V0KHJlc3BfaGRycywgIkV4cGlyZXMiKSkgIT0gTlVMTCkKLQlhcF90YWJsZV9zZXQocmVzcF9oZHJzLCAiRXhwaXJlcyIsIGFwX3Byb3h5X2RhdGVfY2Fub24ocCwgZGF0ZXN0cikpOwotCi0gICAgaWYgKChkYXRlc3RyID0gYXBfdGFibGVfZ2V0KHJlc3BfaGRycywgIkxvY2F0aW9uIikpICE9IE5VTEwpCi0JYXBfdGFibGVfc2V0KHJlc3BfaGRycywgIkxvY2F0aW9uIiwgcHJveHlfbG9jYXRpb25fcmV2ZXJzZV9tYXAociwgZGF0ZXN0cikpOwotICAgIGlmICgoZGF0ZXN0ciA9IGFwX3RhYmxlX2dldChyZXNwX2hkcnMsICJVUkkiKSkgIT0gTlVMTCkKLQlhcF90YWJsZV9zZXQocmVzcF9oZHJzLCAiVVJJIiwgcHJveHlfbG9jYXRpb25fcmV2ZXJzZV9tYXAociwgZGF0ZXN0cikpOwotCi0vKiBjaGVjayBpZiBOb0NhY2hlIGRpcmVjdGl2ZSBvbiB0aGlzIGhvc3QgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgY29uZi0+bm9jYWNoZXMtPm5lbHRzOyBpKyspIHsKLQlpZiAoKG5jZW50W2ldLm5hbWUgIT0gTlVMTCAmJiBzdHJzdHIoZGVzdGhvc3QsIG5jZW50W2ldLm5hbWUpICE9IE5VTEwpCi0JICAgIHx8IGRlc3RhZGRyLnNfYWRkciA9PSBuY2VudFtpXS5hZGRyLnNfYWRkciB8fCBuY2VudFtpXS5uYW1lWzBdID09ICcqJykKLQkgICAgbm9jYWNoZSA9IDE7Ci0gICAgfQotCi0gICAgaSA9IGFwX3Byb3h5X2NhY2hlX3VwZGF0ZShjLCByZXNwX2hkcnMsICFiYWNrYXNzd2FyZHMsIG5vY2FjaGUpOwotICAgIGlmIChpICE9IERFQ0xJTkVEKSB7Ci0JYXBfYmNsb3NlKGYpOwotCXJldHVybiBpOwotICAgIH0KLQotLyogd3JpdGUgc3RhdHVzIGxpbmUgKi8KLSAgICBpZiAoIXItPmFzc2JhY2t3YXJkcykKLQlhcF9ydnB1dHMociwgIkhUVFAvMS4wICIsIHItPnN0YXR1c19saW5lLCBDUkxGLCBOVUxMKTsKLSAgICBpZiAoYyAhPSBOVUxMICYmIGMtPmZwICE9IE5VTEwgJiYKLQlhcF9idnB1dHMoYy0+ZnAsICJIVFRQLzEuMCAiLCByLT5zdGF0dXNfbGluZSwgQ1JMRiwgTlVMTCkgPT0gLTEpIHsKLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGMtPnJlcSwKLQkJInByb3h5OiBlcnJvciB3cml0aW5nIHN0YXR1cyBsaW5lIHRvICVzIiwgYy0+dGVtcGZpbGUpOwotCSAgICBjID0gYXBfcHJveHlfY2FjaGVfZXJyb3IoYyk7Ci0gICAgfQotCi0vKiBzZW5kIGhlYWRlcnMgKi8KLSAgICB0ZG8ucmVxID0gcjsKLSAgICB0ZG8uY2FjaGUgPSBjOwotICAgIGFwX3RhYmxlX2RvKGFwX3Byb3h5X3NlbmRfaGRyX2xpbmUsICZ0ZG8sIHJlc3BfaGRycywgTlVMTCk7Ci0KLSAgICBpZiAoIXItPmFzc2JhY2t3YXJkcykKLQlhcF9ycHV0cyhDUkxGLCByKTsKLSAgICBpZiAoYyAhPSBOVUxMICYmIGMtPmZwICE9IE5VTEwgJiYgYXBfYnB1dHMoQ1JMRiwgYy0+ZnApID09IC0xKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGMtPnJlcSwKLQkgICAgInByb3h5OiBlcnJvciB3cml0aW5nIENSTEYgdG8gJXMiLCBjLT50ZW1wZmlsZSk7Ci0JYyA9IGFwX3Byb3h5X2NhY2hlX2Vycm9yKGMpOwotICAgIH0KLQotICAgIGFwX2JzZXRvcHQoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCT19CWVRFQ1QsICZ6ZXJvKTsKLSAgICByLT5zZW50X2JvZHljdCA9IDE7Ci0vKiBJcyBpdCBhbiBIVFRQLzAuOSByZXNwb3NlPyBJZiBzbywgc2VuZCB0aGUgZXh0cmEgZGF0YSAqLwotICAgIGlmIChiYWNrYXNzd2FyZHMpIHsKLQlhcF9id3JpdGUoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBidWZmZXIsIGxlbik7Ci0JaWYgKGMgIT0gTlVMTCAmJiBjLT5mcCAhPSBOVUxMICYmIGFwX2J3cml0ZShjLT5mcCwgYnVmZmVyLCBsZW4pICE9IGxlbikgewotCSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgYy0+cmVxLAotCQkicHJveHk6IGVycm9yIHdyaXRpbmcgZXh0cmEgZGF0YSB0byAlcyIsIGMtPnRlbXBmaWxlKTsKLQkgICAgYyA9IGFwX3Byb3h5X2NhY2hlX2Vycm9yKGMpOwotCX0KLSAgICB9Ci0KLSNpZmRlZiBDSEFSU0VUX0VCQ0RJQwotICAgIC8qIFdoYXQgd2UgcmVhZC93cml0ZSBhZnRlciB0aGUgaGVhZGVyIHNob3VsZCBub3QgYmUgbW9kaWZpZWQKLSAgICAgKiAoaS5lLiwgdGhlIGNhY2hlIGNvcHkgaXMgQVNDSUksIG5vdCBFQkNESUMsIGV2ZW4gZm9yIHRleHQvaHRtbCkKLSAgICAgKi8KLSAgICBhcF9ic2V0ZmxhZyhmLCBCX0FTQ0lJMkVCQ0RJQ3xCX0VCQ0RJQzJBU0NJSSwgMCk7Ci0gICAgYXBfYnNldGZsYWcoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCX0FTQ0lJMkVCQ0RJQ3xCX0VCQ0RJQzJBU0NJSSwgMCk7Ci0jZW5kaWYKLQotLyogc2VuZCBib2R5ICovCi0vKiBpZiBoZWFkZXIgb25seSwgdGhlbiBjYWNoZSB3aWxsIGJlIE5VTEwgKi8KLS8qIEhUVFAvMS4wIHRlbGxzIHVzIHRvIHJlYWQgdG8gRU9GLCByYXRoZXIgdGhhbiBjb250ZW50LWxlbmd0aCBieXRlcyAqLwotICAgIGlmICghci0+aGVhZGVyX29ubHkpIHsKLS8qIHdlIG5lZWQgdG8gc2V0IHRoaXMgZm9yIGFwX3Byb3h5X3NlbmRfZmIoKS4uLiAqLwotCWMtPmNhY2hlX2NvbXBsZXRpb24gPSBjb25mLT5jYWNoZS5jYWNoZV9jb21wbGV0aW9uOwotCWFwX3Byb3h5X3NlbmRfZmIoZiwgciwgYyk7Ci0gICAgfQotCi0gICAgYXBfcHJveHlfY2FjaGVfdGlkeShjKTsKLQotICAgIGFwX2JjbG9zZShmKTsKLQotICAgIGFwX3Byb3h5X2dhcmJhZ2VfY29sbChyKTsKLSAgICByZXR1cm4gT0s7Ci19CmRpZmYgLS1naXQgYS9tb2R1bGVzL3Byb3h5L3Byb3h5X3V0aWwuYyBiL21vZHVsZXMvcHJveHkvcHJveHlfdXRpbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDU1YTgxLi4wMDAwMDAwCi0tLSBhL21vZHVsZXMvcHJveHkvcHJveHlfdXRpbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI4MyArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qIFV0aWxpdHkgcm91dGluZXMgZm9yIEFwYWNoZSBwcm94eSAqLwotI2luY2x1ZGUgIm1vZF9wcm94eS5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgImFwX21kNS5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAidXRpbF91cmkuaCIKLSNpbmNsdWRlICJ1dGlsX2RhdGUuaCIJLyogZ2V0IGFwX2NoZWNrbWFzaygpIGRlY2wuICovCi0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLXN0YXRpYyBpbnQgcHJveHlfbWF0Y2hfaXBhZGRyKHN0cnVjdCBkaXJjb25uX2VudHJ5ICpUaGlzLCByZXF1ZXN0X3JlYyAqcik7Ci1zdGF0aWMgaW50IHByb3h5X21hdGNoX2RvbWFpbm5hbWUoc3RydWN0IGRpcmNvbm5fZW50cnkgKlRoaXMsIHJlcXVlc3RfcmVjICpyKTsKLXN0YXRpYyBpbnQgcHJveHlfbWF0Y2hfaG9zdG5hbWUoc3RydWN0IGRpcmNvbm5fZW50cnkgKlRoaXMsIHJlcXVlc3RfcmVjICpyKTsKLXN0YXRpYyBpbnQgcHJveHlfbWF0Y2hfd29yZChzdHJ1Y3QgZGlyY29ubl9lbnRyeSAqVGhpcywgcmVxdWVzdF9yZWMgKnIpOwotCi0vKiBhbHJlYWR5IGNhbGxlZCBpbiB0aGUga25vd2xlZGdlIHRoYXQgdGhlIGNoYXJhY3RlcnMgYXJlIGhleCBkaWdpdHMgKi8KLWludCBhcF9wcm94eV9oZXgyYyhjb25zdCBjaGFyICp4KQotewotICAgIGludCBpLCBjaDsKLQotI2lmbmRlZiBDSEFSU0VUX0VCQ0RJQwotICAgIGNoID0geFswXTsKLSAgICBpZiAoYXBfaXNkaWdpdChjaCkpCi0JaSA9IGNoIC0gJzAnOwotICAgIGVsc2UgaWYgKGFwX2lzdXBwZXIoY2gpKQotCWkgPSBjaCAtICgnQScgLSAxMCk7Ci0gICAgZWxzZQotCWkgPSBjaCAtICgnYScgLSAxMCk7Ci0gICAgaSA8PD0gNDsKLQotICAgIGNoID0geFsxXTsKLSAgICBpZiAoYXBfaXNkaWdpdChjaCkpCi0JaSArPSBjaCAtICcwJzsKLSAgICBlbHNlIGlmIChhcF9pc3VwcGVyKGNoKSkKLQlpICs9IGNoIC0gKCdBJyAtIDEwKTsKLSAgICBlbHNlCi0JaSArPSBjaCAtICgnYScgLSAxMCk7Ci0gICAgcmV0dXJuIGk7Ci0jZWxzZSAvKkNIQVJTRVRfRUJDRElDKi8KLSAgICByZXR1cm4gKDEgPT0gc3NjYW5mKHgsICIlMngiLCAmaSkpID8gb3NfdG9lYmNkaWNbaSYweEZGXSA6IDA7Ci0jZW5kaWYgLypDSEFSU0VUX0VCQ0RJQyovCi19Ci0KLXZvaWQgYXBfcHJveHlfYzJoZXgoaW50IGNoLCBjaGFyICp4KQotewotI2lmbmRlZiBDSEFSU0VUX0VCQ0RJQwotICAgIGludCBpOwotCi0gICAgeFswXSA9ICclJzsKLSAgICBpID0gKGNoICYgMHhGMCkgPj4gNDsKLSAgICBpZiAoaSA+PSAxMCkKLQl4WzFdID0gKCdBJyAtIDEwKSArIGk7Ci0gICAgZWxzZQotCXhbMV0gPSAnMCcgKyBpOwotCi0gICAgaSA9IGNoICYgMHgwRjsKLSAgICBpZiAoaSA+PSAxMCkKLQl4WzJdID0gKCdBJyAtIDEwKSArIGk7Ci0gICAgZWxzZQotCXhbMl0gPSAnMCcgKyBpOwotI2Vsc2UgLypDSEFSU0VUX0VCQ0RJQyovCi0gICAgc3RhdGljIGNvbnN0IGNoYXIgbnRvYVtdID0geyAiMDEyMzQ1Njc4OUFCQ0RFRiIgfTsKLSAgICBjaCAmPSAweEZGOwotICAgIHhbMF0gPSAnJSc7Ci0gICAgeFsxXSA9IG50b2FbKG9zX3RvYXNjaWlbY2hdPj40KSYweDBGXTsKLSAgICB4WzJdID0gbnRvYVtvc190b2FzY2lpW2NoXSYweDBGXTsKLSAgICB4WzNdID0gJ1wwJzsKLSNlbmRpZiAvKkNIQVJTRVRfRUJDRElDKi8KLX0KLQotLyoKLSAqIGNhbm9uaWNhbGlzZSBhIFVSTC1lbmNvZGVkIHN0cmluZwotICovCi0KLS8qCi0gKiBDb252ZXJ0IGEgVVJMLWVuY29kZWQgc3RyaW5nIHRvIGNhbm9uaWNhbCBmb3JtLgotICogSXQgZGVjb2RlcyBjaGFyYWN0ZXJzIHdoaWNoIG5lZWQgbm90IGJlIGVuY29kZWQsCi0gKiBhbmQgZW5jb2RlcyB0aG9zZSB3aGljaCBtdXN0IGJlIGVuY29kZWQsIGFuZCBkb2VzIG5vdCB0b3VjaAotICogdGhvc2Ugd2hpY2ggbXVzdCBub3QgYmUgdG91Y2hlZC4KLSAqLwotY2hhciAqCi0gICAgIGFwX3Byb3h5X2Nhbm9uZW5jKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqeCwgaW50IGxlbiwgZW51bSBlbmN0eXBlIHQsIGludCBpc2VuYykKLXsKLSAgICBpbnQgaSwgaiwgY2g7Ci0gICAgY2hhciAqeTsKLSAgICBjb25zdCBjaGFyICphbGxvd2VkOwkvKiBjaGFyYWN0ZXJzIHdoaWNoIHNob3VsZCBub3QgYmUgZW5jb2RlZCAqLwotICAgIGNvbnN0IGNoYXIgKnJlc2VydmVkOwkvKiBjaGFyYWN0ZXJzIHdoaWNoIG11Y2ggbm90IGJlIGVuL2RlLWNvZGVkICovCi0KLS8qIE4uQi4gaW4gYWRkaXRpb24gdG8gOkAmPSwgdGhpcyBhbGxvd3MgJzsnIGluIGFuIGh0dHAgcGF0aAotICogYW5kICc/JyBpbiBhbiBmdHAgcGF0aCAtLSB0aGlzIG1heSBiZSByZXZpc2VkCi0gKiAKLSAqIEFsc28sIGl0IG1ha2VzIGEgJysnIGNoYXJhY3RlciBpbiBhIHNlYXJjaCBzdHJpbmcgcmVzZXJ2ZWQsIGFzCi0gKiBpdCBtYXkgYmUgZm9ybS1lbmNvZGVkLiAoQWx0aG91Z2ggUkZDIDE3MzggZG9lc24ndCBhbGxvdyB0aGlzIC0KLSAqIGl0IG9ubHkgcGVybWl0cyA7IC8gPyA6IEAgPSAmIGFzIHJlc2VydmVkIGNoYXJzLikKLSAqLwotICAgIGlmICh0ID09IGVuY19wYXRoKQotCWFsbG93ZWQgPSAiJC1fLishKicoKSw7OkAmPSI7Ci0gICAgZWxzZSBpZiAodCA9PSBlbmNfc2VhcmNoKQotCWFsbG93ZWQgPSAiJC1fLiEqJygpLDs6QCY9IjsKLSAgICBlbHNlIGlmICh0ID09IGVuY191c2VyKQotCWFsbG93ZWQgPSAiJC1fLishKicoKSw7QCY9IjsKLSAgICBlbHNlIGlmICh0ID09IGVuY19mcGF0aCkKLQlhbGxvd2VkID0gIiQtXy4rISonKCksPzpAJj0iOwotICAgIGVsc2UJCQkvKiBpZiAodCA9PSBlbmNfcGFybSkgKi8KLQlhbGxvd2VkID0gIiQtXy4rISonKCksPy86QCY9IjsKLQotICAgIGlmICh0ID09IGVuY19wYXRoKQotCXJlc2VydmVkID0gIi8iOwotICAgIGVsc2UgaWYgKHQgPT0gZW5jX3NlYXJjaCkKLQlyZXNlcnZlZCA9ICIrIjsKLSAgICBlbHNlCi0JcmVzZXJ2ZWQgPSAiIjsKLQotICAgIHkgPSBhcF9wYWxsb2MocCwgMyAqIGxlbiArIDEpOwotCi0gICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBsZW47IGkrKywgaisrKSB7Ci0vKiBhbHdheXMgaGFuZGxlICcvJyBmaXJzdCAqLwotCWNoID0geFtpXTsKLQlpZiAoc3RyY2hyKHJlc2VydmVkLCBjaCkpIHsKLQkgICAgeVtqXSA9IGNoOwotCSAgICBjb250aW51ZTsKLQl9Ci0vKiBkZWNvZGUgaXQgaWYgbm90IGFscmVhZHkgZG9uZSAqLwotCWlmIChpc2VuYyAmJiBjaCA9PSAnJScpIHsKLQkgICAgaWYgKCFhcF9pc3hkaWdpdCh4W2kgKyAxXSkgfHwgIWFwX2lzeGRpZ2l0KHhbaSArIDJdKSkKLQkJcmV0dXJuIE5VTEw7Ci0JICAgIGNoID0gYXBfcHJveHlfaGV4MmMoJnhbaSArIDFdKTsKLQkgICAgaSArPSAyOwotCSAgICBpZiAoY2ggIT0gMCAmJiBzdHJjaHIocmVzZXJ2ZWQsIGNoKSkgewkvKiBrZWVwIGl0IGVuY29kZWQgKi8KLQkJYXBfcHJveHlfYzJoZXgoY2gsICZ5W2pdKTsKLQkJaiArPSAyOwotCQljb250aW51ZTsKLQkgICAgfQotCX0KLS8qIHJlY29kZSBpdCwgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKCFhcF9pc2FsbnVtKGNoKSAmJiAhc3RyY2hyKGFsbG93ZWQsIGNoKSkgewotCSAgICBhcF9wcm94eV9jMmhleChjaCwgJnlbal0pOwotCSAgICBqICs9IDI7Ci0JfQotCWVsc2UKLQkgICAgeVtqXSA9IGNoOwotICAgIH0KLSAgICB5W2pdID0gJ1wwJzsKLSAgICByZXR1cm4geTsKLX0KLQotLyoKLSAqIFBhcnNlcyBuZXR3b3JrLWxvY2F0aW9uLgotICogICAgdXJscCAgICAgICAgICAgb24gaW5wdXQgdGhlIFVSTDsgb24gb3V0cHV0IHRoZSBwYXRoLCBhZnRlciB0aGUgbGVhZGluZyAvCi0gKiAgICB1c2VyICAgICAgICAgICBOVUxMIGlmIG5vIHVzZXIvcGFzc3dvcmQgcGVybWl0dGVkCi0gKiAgICBwYXNzd29yZCAgICAgICBob2xkZXIgZm9yIHBhc3N3b3JkCi0gKiAgICBob3N0ICAgICAgICAgICBob2xkZXIgZm9yIGhvc3QKLSAqICAgIHBvcnQgICAgICAgICAgIHBvcnQgbnVtYmVyOyBvbmx5IHNldCBpZiBvbmUgaXMgc3VwcGxpZWQuCi0gKgotICogUmV0dXJucyBhbiBlcnJvciBzdHJpbmcuCi0gKi8KLWNoYXIgKgotICAgICBhcF9wcm94eV9jYW5vbl9uZXRsb2MoYXBfY29udGV4dF90ICpwLCBjaGFyICoqY29uc3QgdXJscCwgY2hhciAqKnVzZXJwLAotCQkJY2hhciAqKnBhc3N3b3JkcCwgY2hhciAqKmhvc3RwLCBpbnQgKnBvcnQpCi17Ci0gICAgaW50IGk7Ci0gICAgY2hhciAqc3RycCwgKmhvc3QsICp1cmwgPSAqdXJscDsKLSAgICBjaGFyICp1c2VyID0gTlVMTCwgKnBhc3N3b3JkID0gTlVMTDsKLQotICAgIGlmICh1cmxbMF0gIT0gJy8nIHx8IHVybFsxXSAhPSAnLycpCi0JcmV0dXJuICJNYWxmb3JtZWQgVVJMIjsKLSAgICBob3N0ID0gdXJsICsgMjsKLSAgICB1cmwgPSBzdHJjaHIoaG9zdCwgJy8nKTsKLSAgICBpZiAodXJsID09IE5VTEwpCi0JdXJsID0gIiI7Ci0gICAgZWxzZQotCSoodXJsKyspID0gJ1wwJzsJLyogc2tpcCBzZXBlcmF0aW5nICcvJyAqLwotCi0gICAgLyogZmluZCBfbGFzdF8gJ0AnIHNpbmNlIGl0IG1pZ2h0IG9jY3VyIGluIHVzZXIvcGFzc3dvcmQgcGFydCAqLwotICAgIHN0cnAgPSBzdHJyY2hyKGhvc3QsICdAJyk7Ci0KLSAgICBpZiAoc3RycCAhPSBOVUxMKSB7Ci0JKnN0cnAgPSAnXDAnOwotCXVzZXIgPSBob3N0OwotCWhvc3QgPSBzdHJwICsgMTsKLQotLyogZmluZCBwYXNzd29yZCAqLwotCXN0cnAgPSBzdHJjaHIodXNlciwgJzonKTsKLQlpZiAoc3RycCAhPSBOVUxMKSB7Ci0JICAgICpzdHJwID0gJ1wwJzsKLQkgICAgcGFzc3dvcmQgPSBhcF9wcm94eV9jYW5vbmVuYyhwLCBzdHJwICsgMSwgc3RybGVuKHN0cnAgKyAxKSwgZW5jX3VzZXIsIDEpOwotCSAgICBpZiAocGFzc3dvcmQgPT0gTlVMTCkKLQkJcmV0dXJuICJCYWQgJS1lc2NhcGUgaW4gVVJMIChwYXNzd29yZCkiOwotCX0KLQotCXVzZXIgPSBhcF9wcm94eV9jYW5vbmVuYyhwLCB1c2VyLCBzdHJsZW4odXNlciksIGVuY191c2VyLCAxKTsKLQlpZiAodXNlciA9PSBOVUxMKQotCSAgICByZXR1cm4gIkJhZCAlLWVzY2FwZSBpbiBVUkwgKHVzZXJuYW1lKSI7Ci0gICAgfQotICAgIGlmICh1c2VycCAhPSBOVUxMKSB7Ci0JKnVzZXJwID0gdXNlcjsKLSAgICB9Ci0gICAgaWYgKHBhc3N3b3JkcCAhPSBOVUxMKSB7Ci0JKnBhc3N3b3JkcCA9IHBhc3N3b3JkOwotICAgIH0KLQotICAgIHN0cnAgPSBzdHJyY2hyKGhvc3QsICc6Jyk7Ci0gICAgaWYgKHN0cnAgIT0gTlVMTCkgewotCSooc3RycCsrKSA9ICdcMCc7Ci0KLQlmb3IgKGkgPSAwOyBzdHJwW2ldICE9ICdcMCc7IGkrKykKLQkgICAgaWYgKCFhcF9pc2RpZ2l0KHN0cnBbaV0pKQotCQlicmVhazsKLQotCS8qIGlmIChpID09IDApIHRoZSBubyBwb3J0IHdhcyBnaXZlbjsga2VlcCBkZWZhdWx0ICovCi0JaWYgKHN0cnBbaV0gIT0gJ1wwJykgewotCSAgICByZXR1cm4gIkJhZCBwb3J0IG51bWJlciBpbiBVUkwiOwotCX0gZWxzZSBpZiAoaSA+IDApIHsKLQkgICAgKnBvcnQgPSBhdG9pKHN0cnApOwotCSAgICBpZiAoKnBvcnQgPiA2NTUzNSkKLQkJcmV0dXJuICJQb3J0IG51bWJlciBpbiBVUkwgPiA2NTUzNSI7Ci0JfQotICAgIH0KLSAgICBhcF9zdHJfdG9sb3dlcihob3N0KTsJCS8qIEROUyBuYW1lcyBhcmUgY2FzZSBpbnNlbnNpdGl2ZSAqLwotICAgIGlmICgqaG9zdCA9PSAnXDAnKQotCXJldHVybiAiTWlzc2luZyBob3N0IGluIFVSTCI7Ci0vKiBjaGVjayBob3N0bmFtZSBzeW50YXggKi8KLSAgICBmb3IgKGkgPSAwOyBob3N0W2ldICE9ICdcMCc7IGkrKykKLQlpZiAoIWFwX2lzZGlnaXQoaG9zdFtpXSkgJiYgaG9zdFtpXSAhPSAnLicpCi0JICAgIGJyZWFrOwotICAgIC8qIG11c3QgYmUgYW4gSVAgYWRkcmVzcyAqLwotI2lmZGVmIFdJTjMyCi0gICAgaWYgKGhvc3RbaV0gPT0gJ1wwJyAmJiAoaW5ldF9hZGRyKGhvc3QpID09IC0xKSkKLSNlbHNlCi0gICAgaWYgKGhvc3RbaV0gPT0gJ1wwJyAmJiAoYXBfaW5ldF9hZGRyKGhvc3QpID09IC0xIHx8IGluZXRfbmV0d29yayhob3N0KSA9PSAtMSkpCi0jZW5kaWYKLSAgICB7Ci0JcmV0dXJuICJCYWQgSVAgYWRkcmVzcyBpbiBVUkwiOwotICAgIH0KLQotLyogICAgaWYgKHN0cmNocihob3N0LCcuJykgPT0gTlVMTCAmJiBkb21haW4gIT0gTlVMTCkKLSAgIGhvc3QgPSBwc3RyY2F0KHAsIGhvc3QsIGRvbWFpbiwgTlVMTCk7Ci0gKi8KLSAgICAqdXJscCA9IHVybDsKLSAgICAqaG9zdHAgPSBob3N0OwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbHdkYXlbN10gPQoteyJTdW5kYXkiLCAiTW9uZGF5IiwgIlR1ZXNkYXkiLCAiV2VkbmVzZGF5IiwgIlRodXJzZGF5IiwgIkZyaWRheSIsICJTYXR1cmRheSJ9OwotCi0vKgotICogSWYgdGhlIGRhdGUgaXMgYSB2YWxpZCBSRkMgODUwIGRhdGUgb3IgYXNjdGltZSgpIGRhdGUsIHRoZW4gaXQKLSAqIGlzIGNvbnZlcnRlZCB0byB0aGUgUkZDIDExMjMgZm9ybWF0LCBvdGhlcndpc2UgaXQgaXMgbm90IG1vZGlmaWVkLgotICogVGhpcyByb3V0aW5lIGlzIG5vdCB2ZXJ5IGZhc3QgYXQgZG9pbmcgY29udmVyc2lvbnMsIGFzIGl0IHVzZXMKLSAqIHNzY2FuZiBhbmQgc3ByaW50Zi4gSG93ZXZlciwgaWYgdGhlIGRhdGUgaXMgYWxyZWFkeSBjb3JyZWN0bHkKLSAqIGZvcm1hdHRlZCwgdGhlbiBpdCBleGl0cyB2ZXJ5IHF1aWNrbHkuCi0gKi8KLWNvbnN0IGNoYXIgKgotICAgICBhcF9wcm94eV9kYXRlX2Nhbm9uKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqeCkKLXsKLSAgICBpbnQgd2ssIG1kYXksIHllYXIsIGhvdXIsIG1pbiwgc2VjLCBtb247Ci0gICAgY2hhciAqcSwgbW9udGhbNF0sIHpvbmVbNF0sIHdlZWtbNF07Ci0KLSAgICBxID0gc3RyY2hyKHgsICcsJyk7Ci0gICAgLyogY2hlY2sgZm9yIFJGQyA4NTAgZGF0ZSAqLwotICAgIGlmIChxICE9IE5VTEwgJiYgcSAtIHggPiAzICYmIHFbMV0gPT0gJyAnKSB7Ci0JKnEgPSAnXDAnOwotCWZvciAod2sgPSAwOyB3ayA8IDc7IHdrKyspCi0JICAgIGlmIChzdHJjbXAoeCwgbHdkYXlbd2tdKSA9PSAwKQotCQlicmVhazsKLQkqcSA9ICcsJzsKLQlpZiAod2sgPT0gNykKLQkgICAgcmV0dXJuIHg7CQkvKiBub3QgYSB2YWxpZCBkYXRlICovCi0JaWYgKHFbNF0gIT0gJy0nIHx8IHFbOF0gIT0gJy0nIHx8IHFbMTFdICE9ICcgJyB8fCBxWzE0XSAhPSAnOicgfHwKLQkgICAgcVsxN10gIT0gJzonIHx8IHN0cmNtcCgmcVsyMF0sICIgR01UIikgIT0gMCkKLQkgICAgcmV0dXJuIHg7Ci0JaWYgKHNzY2FuZihxICsgMiwgIiV1LSUzcy0ldSAldToldToldSAlM3MiLCAmbWRheSwgbW9udGgsICZ5ZWFyLAotCQkgICAmaG91ciwgJm1pbiwgJnNlYywgem9uZSkgIT0gNykKLQkgICAgcmV0dXJuIHg7Ci0JaWYgKHllYXIgPCA3MCkKLQkgICAgeWVhciArPSAyMDAwOwotCWVsc2UKLQkgICAgeWVhciArPSAxOTAwOwotICAgIH0KLSAgICBlbHNlIHsKLS8qIGNoZWNrIGZvciBhY3N0aW1lKCkgZGF0ZSAqLwotCWlmICh4WzNdICE9ICcgJyB8fCB4WzddICE9ICcgJyB8fCB4WzEwXSAhPSAnICcgfHwgeFsxM10gIT0gJzonIHx8Ci0JICAgIHhbMTZdICE9ICc6JyB8fCB4WzE5XSAhPSAnICcgfHwgeFsyNF0gIT0gJ1wwJykKLQkgICAgcmV0dXJuIHg7Ci0JaWYgKHNzY2FuZih4LCAiJTNzICUzcyAldSAldToldToldSAldSIsIHdlZWssIG1vbnRoLCAmbWRheSwgJmhvdXIsCi0JCSAgICZtaW4sICZzZWMsICZ5ZWFyKSAhPSA3KQotCSAgICByZXR1cm4geDsKLQlmb3IgKHdrID0gMDsgd2sgPCA3OyB3aysrKQotCSAgICBpZiAoc3RyY21wKHdlZWssIGFwX2RheV9zbmFtZXNbd2tdKSA9PSAwKQotCQlicmVhazsKLQlpZiAod2sgPT0gNykKLQkgICAgcmV0dXJuIHg7Ci0gICAgfQotCi0vKiBjaGVjayBkYXRlICovCi0gICAgZm9yIChtb24gPSAwOyBtb24gPCAxMjsgbW9uKyspCi0JaWYgKHN0cmNtcChtb250aCwgYXBfbW9udGhfc25hbWVzW21vbl0pID09IDApCi0JICAgIGJyZWFrOwotICAgIGlmIChtb24gPT0gMTIpCi0JcmV0dXJuIHg7Ci0KLSAgICBxID0gYXBfcGFsbG9jKHAsIDMwKTsKLSAgICBhcF9zbnByaW50ZihxLCAzMCwgIiVzLCAlLjJkICVzICVkICUuMmQ6JS4yZDolLjJkIEdNVCIsIGFwX2RheV9zbmFtZXNbd2tdLCBtZGF5LAotCQlhcF9tb250aF9zbmFtZXNbbW9uXSwgeWVhciwgaG91ciwgbWluLCBzZWMpOwotICAgIHJldHVybiBxOwotfQotCi0KLS8qIE5PVEU6IFRoaXMgcm91dGluZSBpcyB0YWtlbiBmcm9tIGh0dHBfcHJvdG9jb2w6OmdldGxpbmUoKQotICogYmVjYXVzZSB0aGUgb2xkIGNvZGUgZm91bmQgaW4gdGhlIHByb3h5IG1vZHVsZSB3YXMgdG9vCi0gKiBkaWZmaWN1bHQgdG8gdW5kZXJzdGFuZCBhbmQgbWFpbnRhaW4uCi0gKi8KLS8qIEdldCBhIGxpbmUgb2YgcHJvdG9jb2wgaW5wdXQsIGluY2x1ZGluZyBhbnkgY29udGludWF0aW9uIGxpbmVzCi0gKiBjYXVzZWQgYnkgTUlNRSBmb2xkaW5nIChvciBicm9rZW4gY2xpZW50cykgaWYgZm9sZCAhPSAwLCBhbmQgcGxhY2UgaXQKLSAqIGluIHRoZSBidWZmZXIgcywgb2Ygc2l6ZSBuIGJ5dGVzLCB3aXRob3V0IHRoZSBlbmRpbmcgbmV3bGluZS4KLSAqCi0gKiBSZXR1cm5zIC0xIG9uIGVycm9yLCBvciB0aGUgbGVuZ3RoIG9mIHMuCi0gKgotICogTm90ZTogQmVjYXVzZSBiZ2V0cyB1c2VzIDEgY2hhciBmb3IgbmV3bGluZSBhbmQgMSBjaGFyIGZvciBOVUwsCi0gKiAgICAgICB0aGUgbW9zdCB3ZSBjYW4gZ2V0IGlzIChuIC0gMikgYWN0dWFsIGNoYXJhY3RlcnMgaWYgaXQKLSAqICAgICAgIHdhcyBlbmRlZCBieSBhIG5ld2xpbmUsIG9yIChuIC0gMSkgY2hhcmFjdGVycyBpZiB0aGUgbGluZQotICogICAgICAgbGVuZ3RoIGV4Y2VlZGVkIChuIC0gMSkuICBTbywgaWYgdGhlIHJlc3VsdCA9PSAobiAtIDEpLAotICogICAgICAgdGhlbiB0aGUgYWN0dWFsIGlucHV0IGxpbmUgZXhjZWVkZWQgdGhlIGJ1ZmZlciBsZW5ndGgsCi0gKiAgICAgICBhbmQgaXQgd291bGQgYmUgYSBnb29kIGlkZWEgZm9yIHRoZSBjYWxsZXIgdG8gcHVrZSA0MDAgb3IgNDE0LgotICovCi1zdGF0aWMgaW50IHByb3h5X2dldGxpbmUoY2hhciAqcywgaW50IG4sIEJVRkYgKmluLCBpbnQgZm9sZCkKLXsKLSAgICBjaGFyICpwb3MsIG5leHQ7Ci0gICAgaW50IHJldHZhbDsKLSAgICBpbnQgdG90YWwgPSAwOwotCi0gICAgcG9zID0gczsKLQotICAgIGRvIHsKLSAgICAgICAgcmV0dmFsID0gYXBfYmdldHMocG9zLCBuLCBpbik7ICAgICAvKiByZXR2YWwgPT0gLTEgaWYgZXJyb3IsIDAgaWYgRU9GICovCi0KLSAgICAgICAgaWYgKHJldHZhbCA8PSAwKQotICAgICAgICAgICAgcmV0dXJuICgocmV0dmFsIDwgMCkgJiYgKHRvdGFsID09IDApKSA/IC0xIDogdG90YWw7Ci0KLSAgICAgICAgLyogcmV0dmFsIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLCBub3QgaW5jbHVkaW5nIE5VTCAgICAgICovCi0KLSAgICAgICAgbiAtPSByZXR2YWw7ICAgICAgICAgICAgLyogS2VlcCB0cmFjayBvZiBob3cgbXVjaCBvZiBzIGlzIGZ1bGwgICAgICovCi0gICAgICAgIHBvcyArPSAocmV0dmFsIC0gMSk7ICAgIC8qIGFuZCB3aGVyZSBzIGVuZHMgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICB0b3RhbCArPSByZXR2YWw7ICAgICAgICAvKiBhbmQgaG93IGxvbmcgcyBoYXMgYmVjb21lICAgICAgICAgICAgICAgKi8KLQotICAgICAgICBpZiAoKnBvcyA9PSAnXG4nKSB7ICAgICAvKiBEaWQgd2UgZ2V0IGEgZnVsbCBsaW5lIG9mIGlucHV0PyAgICAgICAgKi8KLSAgICAgICAgICAgICpwb3MgPSAnXDAnOwotICAgICAgICAgICAgLS10b3RhbDsKLSAgICAgICAgICAgICsrbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gdG90YWw7ICAgICAgIC8qIGlmIG5vdCwgaW5wdXQgbGluZSBleGNlZWRlZCBidWZmZXIgc2l6ZSAqLwotCi0gICAgICAgIC8qIENvbnRpbnVlIGFwcGVuZGluZyBpZiBsaW5lIGZvbGRpbmcgaXMgZGVzaXJlZCBhbmQKLSAgICAgICAgICogdGhlIGxhc3QgbGluZSB3YXMgbm90IGVtcHR5IGFuZCB3ZSBoYXZlIHJvb20gaW4gdGhlIGJ1ZmZlciBhbmQKLSAgICAgICAgICogdGhlIG5leHQgbGluZSBiZWdpbnMgd2l0aCBhIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXIuCi0gICAgICAgICAqLwotICAgIH0gd2hpbGUgKGZvbGQgJiYgKHJldHZhbCAhPSAxKSAmJiAobiA+IDEpCi0gICAgICAgICAgICAgICAgICAmJiAoYXBfYmxvb2tjKCZuZXh0LCBpbikgPT0gMSkKLSAgICAgICAgICAgICAgICAgICYmICgobmV4dCA9PSAnICcpIHx8IChuZXh0ID09ICdcdCcpKSk7Ci0KLSAgICByZXR1cm4gdG90YWw7Ci19Ci0KLQotLyoKLSAqIFJlYWRzIGhlYWRlcnMgZnJvbSBhIGJ1ZmZlciBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiBoZWFkZXJzLgotICogUmV0dXJucyBOVUxMIG9uIGZpbGUgZXJyb3IKLSAqIFRoaXMgcm91dGluZSB0cmllcyB0byBkZWFsIHdpdGggdG9vIGxvbmcgbGluZXMgYW5kIGNvbnRpbnVhdGlvbiBsaW5lcy4KLSAqIEBAQDogWFhYOiBGSVhNRTogY3VycmVudGx5IHRoZSBoZWFkZXJzIGFyZSBwYXNzZWQgdGhydSB1bi1tZXJnZWQuIAotICogSXMgdGhhdCBva2F5LCBvciBzaG91bGQgdGhleSBiZSBjb2xsYXBzZWQgd2hlcmUgcG9zc2libGU/Ci0gKi8KLXRhYmxlICphcF9wcm94eV9yZWFkX2hlYWRlcnMocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmJ1ZmZlciwgaW50IHNpemUsIEJVRkYgKmYpCi17Ci0gICAgYXBfdGFibGVfdCAqcmVzcF9oZHJzOwotICAgIGludCBsZW47Ci0gICAgY2hhciAqdmFsdWUsICplbmQ7Ci0gICAgY2hhciBmaWVsZFtNQVhfU1RSSU5HX0xFTl07Ci0KLSAgICByZXNwX2hkcnMgPSBhcF9tYWtlX3RhYmxlKHItPnBvb2wsIDIwKTsKLQotICAgIC8qCi0gICAgICogUmVhZCBoZWFkZXIgbGluZXMgdW50aWwgd2UgZ2V0IHRoZSBlbXB0eSBzZXBhcmF0b3IgbGluZSwgYSByZWFkIGVycm9yLAotICAgICAqIHRoZSBjb25uZWN0aW9uIGNsb3NlcyAoRU9GKSwgb3Igd2UgdGltZW91dC4KLSAgICAgKi8KLSAgICB3aGlsZSAoKGxlbiA9IHByb3h5X2dldGxpbmUoYnVmZmVyLCBzaXplLCBmLCAxKSkgPiAwKSB7Ci0JCi0JaWYgKCEodmFsdWUgPSBzdHJjaHIoYnVmZmVyLCAnOicpKSkgeyAgICAgLyogRmluZCB0aGUgY29sb24gc2VwYXJhdG9yICovCi0KLQkgICAgLyogQnVnZ3kgTVMgSUlTIHNlcnZlcnMgc29tZXRpbWVzIHJldHVybiBpbnZhbGlkIGhlYWRlcnMKLQkgICAgICogKGFuIGV4dHJhICJIVFRQLzEuMCAyMDAsIE9LIiBsaW5lIHNwcmlua2xlZCBpbiBiZXR3ZWVuCi0JICAgICAqIHRoZSB1c3VhbCBNSU1FIGhlYWRlcnMpLiBUcnkgdG8gZGVhbCB3aXRoIGl0IGluIGEgc2Vuc2libGUKLQkgICAgICogd2F5LCBidXQgbG9nIHRoZSBmYWN0LgotCSAgICAgKiBYWFg6IFRoZSBtYXNrIGNoZWNrIGlzIGJ1Z2d5IGlmIHdlIGV2ZXIgc2VlIGFuIEhUVFAvMS4xMCAqLwotCi0JICAgIGlmICghYXBfY2hlY2ttYXNrKGJ1ZmZlciwgIkhUVFAvIy4jICMjIyoiKSkgewotCQkvKiBOb3BlLCBpdCB3YXNuJ3QgZXZlbiBhbiBleHRyYSBIVFRQIGhlYWRlci4gR2l2ZSB1cC4gKi8KLQkJcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklOR3xBUExPR19OT0VSUk5PLCByLT5zZXJ2ZXIsCi0JCQkgInByb3h5OiBJZ25vcmluZyBkdXBsaWNhdGUgSFRUUCBoZWFkZXIgIgotCQkJICJyZXR1cm5lZCBieSAlcyAoJXMpIiwgci0+dXJpLCByLT5tZXRob2QpOwotCSAgICBjb250aW51ZTsKLQl9Ci0KLSAgICAgICAgKnZhbHVlID0gJ1wwJzsKLSAgICAgICAgKyt2YWx1ZTsKLQkvKiBYWFg6IFJGQzIwNjggZGVmaW5lcyBvbmx5IFNQIGFuZCBIVCBhcyB3aGl0ZXNwYWNlLCB0aGlzIHRlc3QgaXMKLQkgKiB3cm9uZy4uLiBhbmQgc28gYXJlIG1hbnkgb3RoZXJzIHByb2JhYmx5LgotCSAqLwotICAgICAgICB3aGlsZSAoYXBfaXNzcGFjZSgqdmFsdWUpKQotICAgICAgICAgICAgKyt2YWx1ZTsgICAgICAgICAgICAvKiBTa2lwIHRvIHN0YXJ0IG9mIHZhbHVlICAgKi8KLQotCS8qIHNob3VsZCBzdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlIGFzIHdlbGwgKi8KLQlmb3IgKGVuZCA9ICZ2YWx1ZVtzdHJsZW4odmFsdWUpLTFdOyBlbmQgPiB2YWx1ZSAmJiBhcF9pc3NwYWNlKCplbmQpOyAtLWVuZCkKLQkgICAgKmVuZCA9ICdcMCc7Ci0KLSAgICAgICAgYXBfdGFibGVfYWRkKHJlc3BfaGRycywgYnVmZmVyLCB2YWx1ZSk7Ci0KLQkvKiB0aGUgaGVhZGVyIHdhcyB0b28gbG9uZzsgYXQgdGhlIGxlYXN0IHdlIHNob3VsZCBza2lwIGV4dHJhIGRhdGEgKi8KLQlpZiAobGVuID49IHNpemUgLSAxKSB7IAotCSAgICB3aGlsZSAoKGxlbiA9IHByb3h5X2dldGxpbmUoZmllbGQsIE1BWF9TVFJJTkdfTEVOLCBmLCAxKSkKLQkJICAgID49IE1BWF9TVFJJTkdfTEVOIC0gMSkgewotCQkvKiBzb2FrIHVwIHRoZSBleHRyYSBkYXRhICovCi0JICAgIH0KLQkgICAgaWYgKGxlbiA9PSAwKSAvKiB0aW1lIHRvIGV4aXQgdGhlIGxhcmdlciBsb29wIGFzIHdlbGwgKi8KLQkJYnJlYWs7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gcmVzcF9oZHJzOwotfQotCi1sb25nIGludCBhcF9wcm94eV9zZW5kX2ZiKEJVRkYgKmYsIHJlcXVlc3RfcmVjICpyLCBjYWNoZV9yZXEgKmMpCi17Ci0gICAgaW50ICBvazsKLSAgICBjaGFyIGJ1ZltJT0JVRlNJWkVdOwotICAgIGxvbmcgdG90YWxfYnl0ZXNfcmN2ZDsKLSAgICByZWdpc3RlciBpbnQgbiwgbywgdzsKLSAgICBjb25uX3JlYyAqY29uID0gci0+Y29ubmVjdGlvbjsKLSAgICBpbnQgYWx0ZXJuYXRlX3RpbWVvdXRzID0gMTsJLyogMSBpZiB3ZSBhbHRlcm5hdGUgYmV0d2VlbiBzb2Z0ICYgaGFyZCB0aW1lb3V0cyAqLwotCi0gICAgdG90YWxfYnl0ZXNfcmN2ZCA9IDA7Ci0gICAgaWYgKGMgIT0gTlVMTCkKLSAgICAgICAgYy0+d3JpdHRlbiA9IDA7Ci0KLSNpZmRlZiBDSEFSU0VUX0VCQ0RJQwotICAgIC8qIFRoZSBjYWNoZSBjb3B5IGlzIEFTQ0lJLCBub3QgRUJDRElDLCBldmVuIGZvciB0ZXh0L2h0bWwpICovCi0gICAgYXBfYnNldGZsYWcoZiwgQl9BU0NJSTJFQkNESUN8Ql9FQkNESUMyQVNDSUksIDApOwotICAgIGlmIChjICE9IE5VTEwgJiYgYy0+ZnAgIT0gTlVMTCkKLQlhcF9ic2V0ZmxhZyhjLT5mcCwgQl9BU0NJSTJFQkNESUN8Ql9FQkNESUMyQVNDSUksIDApOwotICAgIGFwX2JzZXRmbGFnKGNvbi0+Y2xpZW50LCBCX0FTQ0lJMkVCQ0RJQ3xCX0VCQ0RJQzJBU0NJSSwgMCk7Ci0jZW5kaWYKLQotICAgIC8qIFNpbmNlIHdlIGFyZSByZWFkaW5nIGZyb20gb25lIGJ1ZmZlciBhbmQgd3JpdGluZyB0byBhbm90aGVyLAotICAgICAqIGl0IGlzIHVuc2FmZSB0byBkbyBhIHNvZnRfdGltZW91dCBoZXJlLCBhdCBsZWFzdCB1bnRpbCB0aGUgcHJveHkKLSAgICAgKiBoYXMgaXRzIG93biB0aW1lb3V0IGhhbmRsZXIgd2hpY2ggY2FuIHNldCBib3RoIGJ1ZmZlcnMgdG8gRU9VVC4KLSAgICAgKi8KLQotI2lmZGVmIFdJTjMyCi0gICAgLyogd29ya3MgZmluZSB1bmRlciB3aW4zMiwgc28gbGVhdmUgaXQgKi8KLSNlbHNlCi0gICAgLyogQ0hFQ0tNRSEgU2luY2UgaGFyZF90aW1lb3V0IHdvbid0IHdvcmsgaW4gdW5peCBvbiBzZW5kcyB3aXRoIHBhcnRpYWwKLSAgICAgKiBjYWNoZSBjb21wbGV0aW9uLCB3ZSBoYXZlIHRvIGFsdGVybmF0ZSBiZXR3ZWVuIGhhcmRfdGltZW91dAotICAgICAqIGZvciByZWFkcywgYW5kIHNvZnRfdGltZW91dCBmb3Igc2VuZC4gIFRoaXMgaXMgYmVjYXVzZSB3ZSBuZWVkCi0gICAgICogdG8gZ2V0IGEgcmV0dXJuIGZyb20gYXBfYndyaXRlIHRvIGJlIGFibGUgdG8gY29udGludWUgY2FjaGluZy4KLSAgICAgKiBCVVQsIGlmIHdlICpjYW4ndCogY29udGludWUgYW55d2F5LCBqdXN0IHVzZSBoYXJkX3RpbWVvdXQuCi0gICAgICovCi0KLSAgICBpZiAoYyA9PSBOVUxMIHx8IGMtPmxlbiA8PSAwIHx8IGMtPmNhY2hlX2NvbXBsZXRpb24gPT0gMS4wKSB7Ci0gICAgICAgIGFsdGVybmF0ZV90aW1lb3V0cyA9IDA7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvKiBMb29wIGFuZCBhcF9icmVhZCgpIHdoaWxlIHdlIGNhbiBzdWNjZXNzZnVsbHkgcmVhZCBhbmQgd3JpdGUsCi0gICAgICogb3IgKGFmdGVyIHRoZSBjbGllbnQgYWJvcnRlZCkgd2hpbGUgd2UgY2FuIHN1Y2Nlc3NmdWxseQotICAgICAqIHJlYWQgYW5kIGZpbmlzaCB0aGUgY29uZmlndXJlZCBjYWNoZV9jb21wbGV0aW9uLgotICAgICAqLwotICAgICBmb3IgKG9rID0gMTsgb2s7ICkgewotCS8qIFJlYWQgYmxvY2sgZnJvbSBzZXJ2ZXIgKi8KLQluID0gYXBfYnJlYWQoZiwgYnVmLCBJT0JVRlNJWkUpOwotCi0JaWYgKG4gPT0gLTEpIHsJCS8qIGlucHV0IGVycm9yICovCi0JICAgIGlmIChjICE9IE5VTEwpIHsKLQkJYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGMtPnJlcSwKLQkJICAgICJwcm94eTogZXJyb3IgcmVhZGluZyBmcm9tICVzIiwgYy0+dXJsKTsKLQkJYyA9IGFwX3Byb3h5X2NhY2hlX2Vycm9yKGMpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCX0KLQlpZiAobiA9PSAwKQotCSAgICBicmVhazsJCS8qIEVPRiAqLwotCW8gPSAwOwotCXRvdGFsX2J5dGVzX3JjdmQgKz0gbjsKLQotCS8qIFdyaXRlIHRvIGNhY2hlIGZpcnN0LiAqLwotCS8qQEBAIFhYWCBGSVhNRTogQXNzdW1pbmcgdGhhdCB3cml0aW5nIHRoZSBjYWNoZSBmaWxlIHdvbid0IHRpbWUgb3V0PyEhPyAqLwotICAgICAgICBpZiAoYyAhPSBOVUxMICYmIGMtPmZwICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChhcF9id3JpdGUoYy0+ZnAsICZidWZbMF0sIG4pICE9IG4pIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgYy0+cmVxLAotCQkgICAgInByb3h5OiBlcnJvciB3cml0aW5nIHRvICVzIiwgYy0+dGVtcGZpbGUpOwotCQljID0gYXBfcHJveHlfY2FjaGVfZXJyb3IoYyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGMtPndyaXR0ZW4gKz0gbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0JLyogV3JpdGUgdGhlIGJsb2NrIHRvIHRoZSBjbGllbnQsIGRldGVjdCBhYm9ydGVkIHRyYW5zZmVycyAqLwotICAgICAgICB3aGlsZSAoIWNvbi0+YWJvcnRlZCAmJiBuID4gMCkgewotICAgICAgICAgICAgdyA9IGFwX2J3cml0ZShjb24tPmNsaWVudCwgJmJ1ZltvXSwgbik7Ci0KLSAgICAgICAgICAgIGlmICh3IDw9IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoYyAhPSBOVUxMICYmIGMtPmZwICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgLyogd2hlbiBhIHNlbmQgZmFpbHVyZSBvY2N1cnMsIHdlIG5lZWQgdG8gZGVjaWRlCi0gICAgICAgICAgICAgICAgICAgICAqIHdoZXRoZXIgdG8gY29udGludWUgbG9hZGluZyBhbmQgY2FjaGluZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICogZG9jdW1lbnQsIG9yIHRvIGFib3J0IHRoZSB3aG9sZSB0aGluZwotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgb2sgPSAoYy0+bGVuID4gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAoYy0+Y2FjaGVfY29tcGxldGlvbiA+IDApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGMtPmxlbiAqIGMtPmNhY2hlX2NvbXBsZXRpb24gPCB0b3RhbF9ieXRlc19yY3ZkKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoISBvaykgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBfcGNsb3NlZihjLT5yZXEtPnBvb2wsIGMtPmZwLT5mZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLT5mcCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bmxpbmsoYy0+dGVtcGZpbGUpOwotCQkJYyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29uLT5hYm9ydGVkID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG4gLT0gdzsKLSAgICAgICAgICAgIG8gKz0gdzsKLSAgICAgICAgfSAvKiB3aGlsZSBjbGllbnQgYWxpdmUgYW5kIG1vcmUgZGF0YSB0byBzZW5kICovCi0gICAgfSAvKiBsb29wIGFuZCBhcF9icmVhZCB3aGlsZSAib2siICovCi0KLSAgICBpZiAoIWNvbi0+YWJvcnRlZCkKLQlhcF9iZmx1c2goY29uLT5jbGllbnQpOwotCi0gICAgcmV0dXJuIHRvdGFsX2J5dGVzX3JjdmQ7Ci19Ci0KLS8qCi0gKiBTZW5kcyByZXNwb25zZSBsaW5lIGFuZCBoZWFkZXJzLiAgVXNlcyB0aGUgY2xpZW50IGZkIGFuZCB0aGUgCi0gKiBoZWFkZXJzX291dCBhcnJheSBmcm9tIHRoZSBwYXNzZWQgcmVxdWVzdF9yZWMgdG8gdGFsayB0byB0aGUgY2xpZW50Ci0gKiBhbmQgdG8gcHJvcGVybHkgc2V0IHRoZSBoZWFkZXJzIGl0IHNlbmRzIGZvciB0aGluZ3Mgc3VjaCBhcyBsb2dnaW5nLgotICogCi0gKiBBIHRpbWVvdXQgc2hvdWxkIGJlIHNldCBiZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUuCi0gKi8KLXZvaWQgYXBfcHJveHlfc2VuZF9oZWFkZXJzKHJlcXVlc3RfcmVjICpyLCBjb25zdCBjaGFyICpyZXNwbGluZSwgYXBfdGFibGVfdCAqdCkKLXsKLSAgICBpbnQgaTsKLSAgICBCVUZGICpmcCA9IHItPmNvbm5lY3Rpb24tPmNsaWVudDsKLSAgICB0YWJsZV9lbnRyeSAqZWx0cyA9ICh0YWJsZV9lbnRyeSAqKSBhcF90YWJsZV9lbHRzKHQpLT5lbHRzOwotCi0gICAgYXBfYnZwdXRzKGZwLCByZXNwbGluZSwgQ1JMRiwgTlVMTCk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgYXBfdGFibGVfZWx0cyh0KS0+bmVsdHM7ICsraSkgewotCWlmIChlbHRzW2ldLmtleSAhPSBOVUxMKSB7Ci0JICAgIGFwX2J2cHV0cyhmcCwgZWx0c1tpXS5rZXksICI6ICIsIGVsdHNbaV0udmFsLCBDUkxGLCBOVUxMKTsKLQkgICAgYXBfdGFibGVfYWRkbihyLT5oZWFkZXJzX291dCwgZWx0c1tpXS5rZXksIGVsdHNbaV0udmFsKTsKLQl9Ci0gICAgfQotCi0gICAgYXBfYnB1dHMoQ1JMRiwgZnApOwotfQotCi0KLS8qCi0gKiBsaXN0IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY2FzZSBpbnNlbnNpdGl2ZSB0b2tlbnMsIHdpdGgKLSAqIG9wdGlvbmFsIHdoaXRlc3BhY2UgYXJvdW5kIHRoZSB0b2tlbnMuCi0gKiBUaGUgcmV0dXJuIHJldHVybnMgMSBpZiB0aGUgdG9rZW4gdmFsIGlzIGZvdW5kIGluIHRoZSBsaXN0LCBvciAwCi0gKiBvdGhlcndpc2UuCi0gKi8KLWludCBhcF9wcm94eV9saXN0c3RyKGNvbnN0IGNoYXIgKmxpc3QsIGNvbnN0IGNoYXIgKnZhbCkKLXsKLSAgICBpbnQgbGVuLCBpOwotICAgIGNvbnN0IGNoYXIgKnA7Ci0KLSAgICBsZW4gPSBzdHJsZW4odmFsKTsKLQotICAgIHdoaWxlIChsaXN0ICE9IE5VTEwpIHsKLQlwID0gc3RyY2hyKGxpc3QsICcsJyk7Ci0JaWYgKHAgIT0gTlVMTCkgewotCSAgICBpID0gcCAtIGxpc3Q7Ci0JICAgIGRvCi0JCXArKzsKLQkgICAgd2hpbGUgKGFwX2lzc3BhY2UoKnApKTsKLQl9Ci0JZWxzZQotCSAgICBpID0gc3RybGVuKGxpc3QpOwotCi0Jd2hpbGUgKGkgPiAwICYmIGFwX2lzc3BhY2UobGlzdFtpIC0gMV0pKQotCSAgICBpLS07Ci0JaWYgKGkgPT0gbGVuICYmIHN0cm5jYXNlY21wKGxpc3QsIHZhbCwgbGVuKSA9PSAwKQotCSAgICByZXR1cm4gMTsKLQlsaXN0ID0gcDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDQVNFX0JMSU5EX0ZJTEVTWVNURU0KLQotLyoKLSAqIE9uIHNvbWUgcGxhdGZvcm1zLCB0aGUgZmlsZSBzeXN0ZW0gaXMgTk9UIGNhc2Ugc2Vuc2l0aXZlLiBTbywgYSA9PSBBCi0gKiBuZWVkIHRvIG1hcCB0byBzbWFsbGVyIHNldCBvZiBjaGFyYWN0ZXJzCi0gKi8KLXZvaWQgYXBfcHJveHlfaGFzaChjb25zdCBjaGFyICppdCwgY2hhciAqdmFsLCBpbnQgbmRlcHRoLCBpbnQgbmxlbmd0aCkKLXsKLSAgICBBUF9NRDVfQ1RYIGNvbnRleHQ7Ci0gICAgdW5zaWduZWQgY2hhciBkaWdlc3RbMTZdOwotICAgIGNoYXIgdG1wWzI2XTsKLSAgICBpbnQgaSwgaywgZDsKLSAgICB1bnNpZ25lZCBpbnQgeDsKLSAgICBzdGF0aWMgY29uc3QgY2hhciBlbmNfdGFibGVbMzJdID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1IjsKLQotICAgIGFwX01ENUluaXQoJmNvbnRleHQpOwotICAgIGFwX01ENVVwZGF0ZSgmY29udGV4dCwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgaXQsIHN0cmxlbihpdCkpOwotICAgIGFwX01ENUZpbmFsKGRpZ2VzdCwgJmNvbnRleHQpOwotCi0vKiBlbmNvZGUgMTI4IGJpdHMgYXMgMjYgY2hhcmFjdGVycywgdXNpbmcgYSBtb2RpZmllZCB1dWVuY29kaW5nICovCi0vKiB0aGUgZW5jb2RpbmcgaXMgNSBieXRlcyAtPiA4IGNoYXJhY3RlcnMKLSAqIGkuZS4gMTI4IGJpdHMgaXMgMyB4IDUgYnl0ZXMgKyAxIGJ5dGUgLT4gMyAqIDggY2hhcmFjdGVycyArIDIgY2hhcmFjdGVycwotICovCi0gICAgZm9yIChpID0gMCwgayA9IDA7IGkgPCAxNTsgaSArPSA1KSB7Ci0JeCA9IChkaWdlc3RbaV0gPDwgMjQpIHwgKGRpZ2VzdFtpICsgMV0gPDwgMTYpIHwgKGRpZ2VzdFtpICsgMl0gPDwgOCkgfCBkaWdlc3RbaSArIDNdOwotCXRtcFtrKytdID0gZW5jX3RhYmxlW3ggPj4gMjddOwotCXRtcFtrKytdID0gZW5jX3RhYmxlWyh4ID4+IDIyKSAmIDB4MWZdOwotCXRtcFtrKytdID0gZW5jX3RhYmxlWyh4ID4+IDE3KSAmIDB4MWZdOwotCXRtcFtrKytdID0gZW5jX3RhYmxlWyh4ID4+IDEyKSAmIDB4MWZdOwotCXRtcFtrKytdID0gZW5jX3RhYmxlWyh4ID4+IDcpICYgMHgxZl07Ci0JdG1wW2srK10gPSBlbmNfdGFibGVbKHggPj4gMikgJiAweDFmXTsKLQl4ID0gKCh4ICYgMHgzKSA8PCA4KSB8IGRpZ2VzdFtpICsgNF07Ci0JdG1wW2srK10gPSBlbmNfdGFibGVbeCA+PiA1XTsKLQl0bXBbaysrXSA9IGVuY190YWJsZVt4ICYgMHgxZl07Ci0gICAgfQotLyogb25lIGJ5dGUgbGVmdCAqLwotICAgIHggPSBkaWdlc3RbMTVdOwotICAgIHRtcFtrKytdID0gZW5jX3RhYmxlW3ggPj4gM107CS8qIHVzZSB1cCA1IGJpdHMgKi8KLSAgICB0bXBbaysrXSA9IGVuY190YWJsZVt4ICYgMHg3XTsKLSAgICAvKiBub3cgc3BsaXQgaW50byBkaXJlY3RvcnkgbGV2ZWxzICovCi0KLSAgICBmb3IgKGkgPSBrID0gZCA9IDA7IGQgPCBuZGVwdGg7ICsrZCkgewotCW1lbWNweSgmdmFsW2ldLCAmdG1wW2tdLCBubGVuZ3RoKTsKLQlrICs9IG5sZW5ndGg7Ci0JdmFsW2kgKyBubGVuZ3RoXSA9ICcvJzsKLQlpICs9IG5sZW5ndGggKyAxOwotICAgIH0KLSAgICBtZW1jcHkoJnZhbFtpXSwgJnRtcFtrXSwgMjYgLSBrKTsKLSAgICB2YWxbaSArIDI2IC0ga10gPSAnXDAnOwotfQotCi0jZWxzZQotCi12b2lkIGFwX3Byb3h5X2hhc2goY29uc3QgY2hhciAqaXQsIGNoYXIgKnZhbCwgaW50IG5kZXB0aCwgaW50IG5sZW5ndGgpCi17Ci0gICAgQVBfTUQ1X0NUWCBjb250ZXh0OwotICAgIHVuc2lnbmVkIGNoYXIgZGlnZXN0WzE2XTsKLSAgICBjaGFyIHRtcFsyMl07Ci0gICAgaW50IGksIGssIGQ7Ci0gICAgdW5zaWduZWQgaW50IHg7Ci0jaWYgZGVmaW5lZChBSVgpICYmIGRlZmluZWQoX19wczJfXykKLSAgICAvKiBCZWxpZXZlIGl0IG9yIG5vdCwgQUlYIDEueCBkb2VzIG5vdCBhbGxvdyB5b3UgdG8gbmFtZSBhIGZpbGUgJ0AnLAotICAgICAqIHNvIGhhY2sgYXJvdW5kIGl0IGluIHRoZSBlbmNvZGluZy4gKi8KLSAgICBzdGF0aWMgY29uc3QgY2hhciBlbmNfdGFibGVbNjRdID0KLQkiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlfJSI7Ci0jZWxzZQotICAgIHN0YXRpYyBjb25zdCBjaGFyIGVuY190YWJsZVs2NF0gPQotCSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OV9AIjsKLSNlbmRpZgotCi0gICAgYXBfTUQ1SW5pdCgmY29udGV4dCk7Ci0gICAgYXBfTUQ1VXBkYXRlKCZjb250ZXh0LCAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBpdCwgc3RybGVuKGl0KSk7Ci0gICAgYXBfTUQ1RmluYWwoZGlnZXN0LCAmY29udGV4dCk7Ci0KLS8qIGVuY29kZSAxMjggYml0cyBhcyAyMiBjaGFyYWN0ZXJzLCB1c2luZyBhIG1vZGlmaWVkIHV1ZW5jb2RpbmcgKi8KLS8qIHRoZSBlbmNvZGluZyBpcyAzIGJ5dGVzIC0+IDQgY2hhcmFjdGVycwotICogaS5lLiAxMjggYml0cyBpcyA1IHggMyBieXRlcyArIDEgYnl0ZSAtPiA1ICogNCBjaGFyYWN0ZXJzICsgMiBjaGFyYWN0ZXJzCi0gKi8KLSAgICBmb3IgKGkgPSAwLCBrID0gMDsgaSA8IDE1OyBpICs9IDMpIHsKLQl4ID0gKGRpZ2VzdFtpXSA8PCAxNikgfCAoZGlnZXN0W2kgKyAxXSA8PCA4KSB8IGRpZ2VzdFtpICsgMl07Ci0JdG1wW2srK10gPSBlbmNfdGFibGVbeCA+PiAxOF07Ci0JdG1wW2srK10gPSBlbmNfdGFibGVbKHggPj4gMTIpICYgMHgzZl07Ci0JdG1wW2srK10gPSBlbmNfdGFibGVbKHggPj4gNikgJiAweDNmXTsKLQl0bXBbaysrXSA9IGVuY190YWJsZVt4ICYgMHgzZl07Ci0gICAgfQotLyogb25lIGJ5dGUgbGVmdCAqLwotICAgIHggPSBkaWdlc3RbMTVdOwotICAgIHRtcFtrKytdID0gZW5jX3RhYmxlW3ggPj4gMl07CS8qIHVzZSB1cCA2IGJpdHMgKi8KLSAgICB0bXBbaysrXSA9IGVuY190YWJsZVsoeCA8PCA0KSAmIDB4M2ZdOwotICAgIC8qIG5vdyBzcGxpdCBpbnRvIGRpcmVjdG9yeSBsZXZlbHMgKi8KLQotICAgIGZvciAoaSA9IGsgPSBkID0gMDsgZCA8IG5kZXB0aDsgKytkKSB7Ci0JbWVtY3B5KCZ2YWxbaV0sICZ0bXBba10sIG5sZW5ndGgpOwotCWsgKz0gbmxlbmd0aDsKLQl2YWxbaSArIG5sZW5ndGhdID0gJy8nOwotCWkgKz0gbmxlbmd0aCArIDE7Ci0gICAgfQotICAgIG1lbWNweSgmdmFsW2ldLCAmdG1wW2tdLCAyMiAtIGspOwotICAgIHZhbFtpICsgMjIgLSBrXSA9ICdcMCc7Ci19Ci0KLSNlbmRpZiAvKiBDQVNFX0JMSU5EX0ZJTEVTWVNURU0gKi8KLQotLyoKLSAqIENvbnZlcnRzIDggaGV4IGRpZ2l0cyB0byBhIHRpbWUgaW50ZWdlcgotICovCi1pbnQgYXBfcHJveHlfaGV4MnNlYyhjb25zdCBjaGFyICp4KQotewotICAgIGludCBpLCBjaDsKLSAgICB1bnNpZ25lZCBpbnQgajsKLQotICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgODsgaSsrKSB7Ci0JY2ggPSB4W2ldOwotCWogPDw9IDQ7Ci0JaWYgKGFwX2lzZGlnaXQoY2gpKQotCSAgICBqIHw9IGNoIC0gJzAnOwotCWVsc2UgaWYgKGFwX2lzdXBwZXIoY2gpKQotCSAgICBqIHw9IGNoIC0gKCdBJyAtIDEwKTsKLQllbHNlCi0JICAgIGogfD0gY2ggLSAoJ2EnIC0gMTApOwotICAgIH0KLSAgICBpZiAoaiA9PSAweGZmZmZmZmZmKQotCXJldHVybiAtMTsJCS8qIHNvIHRoYXQgaXQgd29ya3Mgd2l0aCA4LWJ5dGUgaW50cyAqLwotICAgIGVsc2UKLQlyZXR1cm4gajsKLX0KLQotLyoKLSAqIENvbnZlcnRzIGEgdGltZSBpbnRlZ2VyIHRvIDggaGV4IGRpZ2l0cwotICovCi12b2lkIGFwX3Byb3h5X3NlYzJoZXgoaW50IHQsIGNoYXIgKnkpCi17Ci0gICAgaW50IGksIGNoOwotICAgIHVuc2lnbmVkIGludCBqID0gdDsKLQotICAgIGZvciAoaSA9IDc7IGkgPj0gMDsgaS0tKSB7Ci0JY2ggPSBqICYgMHhGOwotCWogPj49IDQ7Ci0JaWYgKGNoID49IDEwKQotCSAgICB5W2ldID0gY2ggKyAoJ0EnIC0gMTApOwotCWVsc2UKLQkgICAgeVtpXSA9IGNoICsgJzAnOwotICAgIH0KLSAgICB5WzhdID0gJ1wwJzsKLX0KLQotCi1jYWNoZV9yZXEgKmFwX3Byb3h5X2NhY2hlX2Vycm9yKGNhY2hlX3JlcSAqYykKLXsKLSAgICBpZiAoYyAhPSBOVUxMKSB7Ci0JaWYgKGMtPmZwICE9IE5VTEwpIHsKLQkgICAgYXBfcGNsb3NlZihjLT5yZXEtPnBvb2wsIGMtPmZwLT5mZCk7Ci0JICAgIGMtPmZwID0gTlVMTDsKLQl9Ci0JaWYgKGMtPnRlbXBmaWxlKSB1bmxpbmsoYy0+dGVtcGZpbGUpOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotaW50IGFwX3Byb3h5ZXJyb3IocmVxdWVzdF9yZWMgKnIsIGludCBzdGF0dXNjb2RlLCBjb25zdCBjaGFyICptZXNzYWdlKQotewotICAgIGFwX3RhYmxlX3NldG4oci0+bm90ZXMsICJlcnJvci1ub3RlcyIsCi0JCSAgYXBfcHN0cmNhdChyLT5wb29sLCAKLQkJCSAgICAgIlRoZSBwcm94eSBzZXJ2ZXIgY291bGQgbm90IGhhbmRsZSB0aGUgcmVxdWVzdCAiCi0JCQkgICAgICI8RU0+PEEgSFJFRj1cIiIsIHItPnVyaSwgIlwiPiIsCi0JCQkgICAgIHItPm1ldGhvZCwgIiZuYnNwOyIsIHItPnVyaSwgIjwvQT48L0VNPi48UD5cbiIKLQkJCSAgICAgIlJlYXNvbjogPFNUUk9ORz4iLCBtZXNzYWdlLCAiPC9TVFJPTkc+IiwgTlVMTCkpOwotCi0gICAgLyogQWxsb3cgdGhlICJlcnJvci1ub3RlcyIgc3RyaW5nIHRvIGJlIHByaW50ZWQgYnkgYXBfc2VuZF9lcnJvcl9yZXNwb25zZSgpICovCi0gICAgYXBfdGFibGVfc2V0bihyLT5ub3RlcywgInZlcmJvc2UtZXJyb3ItdG8iLCBhcF9wc3RyZHVwKHItPnBvb2wsICIqIikpOwotCi0gICAgci0+c3RhdHVzX2xpbmUgPSBhcF9wc3ByaW50ZihyLT5wb29sLCAiJTMuM3UgUHJveHkgRXJyb3IiLCBzdGF0dXNjb2RlKTsKLSAgICByZXR1cm4gc3RhdHVzY29kZTsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSByZXR1cm5zIGl0cyBvd24gZXJyb3IgbWVzc2FnZQotICovCi1jb25zdCBjaGFyICoKLSAgICAgYXBfcHJveHlfaG9zdDJhZGRyKGNvbnN0IGNoYXIgKmhvc3QsIHN0cnVjdCBob3N0ZW50ICpyZXFocCkKLXsKLSAgICBpbnQgaTsKLSAgICBzdHJ1Y3QgaG9zdGVudCAqaHA7Ci0vKiBYWFggLSBFaXRoZXIgZ2V0IHJpZCBvZiBUTFMsIG9yIHVzZSBwdGhyZWFkL0FQUiBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgQVBBQ0hFX1RMUwotICAgIHN0YXRpYyBBUEFDSEVfVExTIHN0cnVjdCBob3N0ZW50IGhwYnVmOwotICAgIHN0YXRpYyBBUEFDSEVfVExTIHVfbG9uZyBpcGFkZHI7Ci0gICAgc3RhdGljIEFQQUNIRV9UTFMgY2hhciAqY2hhcnBidWZbMl07Ci0KLSAgICBmb3IgKGkgPSAwOyBob3N0W2ldICE9ICdcMCc7IGkrKykKLQlpZiAoIWFwX2lzZGlnaXQoaG9zdFtpXSkgJiYgaG9zdFtpXSAhPSAnLicpCi0JICAgIGJyZWFrOwotCi0gICAgaWYgKGhvc3RbaV0gIT0gJ1wwJykgewotCWhwID0gZ2V0aG9zdGJ5bmFtZShob3N0KTsKLQlpZiAoaHAgPT0gTlVMTCkKLQkgICAgcmV0dXJuICJIb3N0IG5vdCBmb3VuZCI7Ci0gICAgfQotICAgIGVsc2UgewotCWlwYWRkciA9IGFwX2luZXRfYWRkcihob3N0KTsKLQlocCA9IGdldGhvc3RieWFkZHIoKGNoYXIgKikgJmlwYWRkciwgc2l6ZW9mKHVfbG9uZyksIEFGX0lORVQpOwotCWlmIChocCA9PSBOVUxMKSB7Ci0JICAgIG1lbXNldCgmaHBidWYsIDAsIHNpemVvZihocGJ1ZikpOwotCSAgICBocGJ1Zi5oX25hbWUgPSAwOwotCSAgICBocGJ1Zi5oX2FkZHJ0eXBlID0gQUZfSU5FVDsKLQkgICAgaHBidWYuaF9sZW5ndGggPSBzaXplb2YodV9sb25nKTsKLQkgICAgaHBidWYuaF9hZGRyX2xpc3QgPSBjaGFycGJ1ZjsKLQkgICAgaHBidWYuaF9hZGRyX2xpc3RbMF0gPSAoY2hhciAqKSAmaXBhZGRyOwotCSAgICBocGJ1Zi5oX2FkZHJfbGlzdFsxXSA9IDA7Ci0JICAgIGhwID0gJmhwYnVmOwotCX0KLSAgICB9Ci0gICAgKnJlcWhwID0gKmhwOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi0gICAgIHByb3h5X2dldF9ob3N0X29mX3JlcXVlc3QocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY2hhciAqdXJsLCAqdXNlciA9IE5VTEwsICpwYXNzd29yZCA9IE5VTEwsICplcnIsICpob3N0OwotICAgIGludCBwb3J0ID0gLTE7Ci0KLSAgICBpZiAoci0+aG9zdG5hbWUgIT0gTlVMTCkKLQlyZXR1cm4gci0+aG9zdG5hbWU7Ci0KLSAgICAvKiBTZXQgdXJsIHRvIHRoZSBmaXJzdCBjaGFyIGFmdGVyICJzY2hlbWU6Ly8iICovCi0gICAgaWYgKCh1cmwgPSBzdHJjaHIoci0+dXJpLCAnOicpKSA9PSBOVUxMCi0JfHwgdXJsWzFdICE9ICcvJyB8fCB1cmxbMl0gIT0gJy8nKQotCXJldHVybiBOVUxMOwotCi0gICAgdXJsID0gYXBfcHN0cmR1cChyLT5wb29sLCAmdXJsWzFdKTsJLyogbWFrZSBpdCBwb2ludCB0byAiLy8iLCB3aGljaCBpcyB3aGF0IHByb3h5X2Nhbm9uX25ldGxvYyBleHBlY3RzICovCi0KLSAgICBlcnIgPSBhcF9wcm94eV9jYW5vbl9uZXRsb2Moci0+cG9vbCwgJnVybCwgJnVzZXIsICZwYXNzd29yZCwgJmhvc3QsICZwb3J0KTsKLQotICAgIGlmIChlcnIgIT0gTlVMTCkKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUnxBUExPR19OT0VSUk5PLCByLAotCQkgICAgICIlcyIsIGVycik7Ci0KLSAgICByLT5ob3N0bmFtZSA9IGhvc3Q7Ci0KLSAgICByZXR1cm4gaG9zdDsJCS8qIG91Z2h0IHRvIHJldHVybiB0aGUgcG9ydCwgdG9vICovCi19Ci0KLS8qIFJldHVybiBUUlVFIGlmIGFkZHIgcmVwcmVzZW50cyBhbiBJUCBhZGRyZXNzIChvciBhbiBJUCBuZXR3b3JrIGFkZHJlc3MpICovCi1pbnQgYXBfcHJveHlfaXNfaXBhZGRyKHN0cnVjdCBkaXJjb25uX2VudHJ5ICpUaGlzLCBhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgY29uc3QgY2hhciAqYWRkciA9IFRoaXMtPm5hbWU7Ci0gICAgbG9uZyBpcF9hZGRyWzRdOwotICAgIGludCBpLCBxdWFkczsKLSAgICBsb25nIGJpdHM7Ci0KLSAgICAvKiBpZiB0aGUgYWRkcmVzcyBpcyBnaXZlbiB3aXRoIGFuIGV4cGxpY2l0IG5ldG1hc2ssIHVzZSB0aGF0ICovCi0gICAgLyogRHVlIHRvIGEgZGVmaWNpZW5jeSBpbiBhcF9pbmV0X2FkZHIoKSwgaXQgaXMgaW1wb3NzaWJsZSB0byBwYXJzZSAqLwotICAgIC8qICJwYXJ0aWFsIiBhZGRyZXNzZXMgKHdpdGggbGVzcyB0aGFuIDQgcXVhZHMpIGNvcnJlY3RseSwgaS5lLiAgKi8KLSAgICAvKiAxOTIuMTY4LjEyMyBpcyBwYXJzZWQgYXMgMTkyLjE2OC4wLjEyMywgd2hpY2ggaXMgbm90IHdoYXQgSSB3YW50LiAqLwotICAgIC8qIEkgdGhlcmVmb3JlIGhhdmUgdG8gcGFyc2UgdGhlIElQIGFkZHJlc3MgbWFudWFsbHk6ICovCi0gICAgLyppZiAocHJveHlfcmVhZG1hc2soVGhpcy0+bmFtZSwgJlRoaXMtPmFkZHIuc19hZGRyLCAmVGhpcy0+bWFzay5zX2FkZHIpID09IDApICovCi0gICAgLyogYWRkciBhbmQgbWFzayB3ZXJlIHNldCBieSBwcm94eV9yZWFkbWFzaygpICovCi0gICAgLypyZXR1cm4gMTsgKi8KLQotICAgIC8qIFBhcnNlIElQIGFkZHIgbWFudWFsbHksIG9wdGlvbmFsbHkgYWxsb3dpbmcgKi8KLSAgICAvKiBhYmJyZXZpYXRlZCBuZXQgYWRkcmVzc2VzIGxpa2UgMTkyLjE2OC4gKi8KLQotICAgIC8qIEl0ZXJhdGUgb3ZlciB1cCB0byA0IChkb3R0ZWQpIHF1YWRzLiAqLwotICAgIGZvciAocXVhZHMgPSAwOyBxdWFkcyA8IDQgJiYgKmFkZHIgIT0gJ1wwJzsgKytxdWFkcykgewotCWNoYXIgKnRtcDsKLQotCWlmICgqYWRkciA9PSAnLycgJiYgcXVhZHMgPiAwKQkvKiBuZXRtYXNrIHN0YXJ0cyBoZXJlLiAqLwotCSAgICBicmVhazsKLQotCWlmICghYXBfaXNkaWdpdCgqYWRkcikpCi0JICAgIHJldHVybiAwOwkJLyogbm8gZGlnaXQgYXQgc3RhcnQgb2YgcXVhZCAqLwotCi0JaXBfYWRkcltxdWFkc10gPSBzdHJ0b2woYWRkciwgJnRtcCwgMCk7Ci0KLQlpZiAodG1wID09IGFkZHIpCS8qIGV4cGVjdGVkIGEgZGlnaXQsIGZvdW5kIHNvbWV0aGluZyBlbHNlICovCi0JICAgIHJldHVybiAwOwotCi0JaWYgKGlwX2FkZHJbcXVhZHNdIDwgMCB8fCBpcF9hZGRyW3F1YWRzXSA+IDI1NSkgewotCSAgICAvKiBpbnZhbGlkIG9jdGV0ICovCi0JICAgIHJldHVybiAwOwotCX0KLQotCWFkZHIgPSB0bXA7Ci0KLQlpZiAoKmFkZHIgPT0gJy4nICYmIHF1YWRzICE9IDMpCi0JICAgICsrYWRkcjsJCS8qIGFmdGVyIHRoZSA0dGggcXVhZCwgYSBkb3Qgd291bGQgYmUgaWxsZWdhbCAqLwotICAgIH0KLQotICAgIGZvciAoVGhpcy0+YWRkci5zX2FkZHIgPSAwLCBpID0gMDsgaSA8IHF1YWRzOyArK2kpCi0JVGhpcy0+YWRkci5zX2FkZHIgfD0gaHRvbmwoaXBfYWRkcltpXSA8PCAoMjQgLSA4ICogaSkpOwotCi0gICAgaWYgKGFkZHJbMF0gPT0gJy8nICYmIGFwX2lzZGlnaXQoYWRkclsxXSkpIHsJLyogbmV0IG1hc2sgZm9sbG93czogKi8KLQljaGFyICp0bXA7Ci0KLQkrK2FkZHI7Ci0KLQliaXRzID0gc3RydG9sKGFkZHIsICZ0bXAsIDApOwotCi0JaWYgKHRtcCA9PSBhZGRyKQkvKiBleHBlY3RlZCBhIGRpZ2l0LCBmb3VuZCBzb21ldGhpbmcgZWxzZSAqLwotCSAgICByZXR1cm4gMDsKLQotCWFkZHIgPSB0bXA7Ci0KLQlpZiAoYml0cyA8IDAgfHwgYml0cyA+IDMyKQkvKiBuZXRtYXNrIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAzMiAqLwotCSAgICByZXR1cm4gMDsKLQotICAgIH0KLSAgICBlbHNlIHsKLQkvKiBEZXRlcm1pbmUgKGkuZS4sICJndWVzcyIpIG5ldG1hc2sgYnkgY291bnRpbmcgdGhlICovCi0JLyogbnVtYmVyIG9mIHRyYWlsaW5nIC4wJ3M7IHJlZHVjZSAjcXVhZHMgYXBwcm9wcmlhdGVseSAqLwotCS8qIChzbyB0aGF0IDE5Mi4xNjguMC4wIGlzIGVxdWl2YWxlbnQgdG8gMTkyLjE2OC4pICAgICAgICAqLwotCXdoaWxlIChxdWFkcyA+IDAgJiYgaXBfYWRkcltxdWFkcyAtIDFdID09IDApCi0JICAgIC0tcXVhZHM7Ci0KLQkvKiAiSVAgQWRkcmVzcyBzaG91bGQgYmUgZ2l2ZW4gaW4gZG90dGVkLXF1YWQgZm9ybSwgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIG5ldG1hc2sgKGUuZy4sIDE5Mi4xNjguMTExLjAvMjQpIjsgKi8KLQlpZiAocXVhZHMgPCAxKQotCSAgICByZXR1cm4gMDsKLQotCS8qIGV2ZXJ5IHplcm8tYnl0ZSBjb3VudHMgYXMgOCB6ZXJvLWJpdHMgKi8KLQliaXRzID0gOCAqIHF1YWRzOwotCi0JaWYgKGJpdHMgIT0gMzIpCQkvKiBubyB3YXJuaW5nIGZvciBmdWxseSBxdWFsaWZpZWQgSVAgYWRkcmVzcyAqLwotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nOiBOZXRNYXNrIG5vdCBzdXBwbGllZCB3aXRoIElQLUFkZHI7IGd1ZXNzaW5nOiAlcy8lbGQiLAotCQkgICAgaW5ldF9udG9hKFRoaXMtPmFkZHIpLCBiaXRzKTsKLSAgICB9Ci0KLSAgICBUaGlzLT5tYXNrLnNfYWRkciA9IGh0b25sKElOQUREUl9OT05FIDw8ICgzMiAtIGJpdHMpKTsKLQotICAgIGlmICgqYWRkciA9PSAnXDAnICYmIChUaGlzLT5hZGRyLnNfYWRkciAmIH5UaGlzLT5tYXNrLnNfYWRkcikgIT0gMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgIldhcm5pbmc6IE5ldE1hc2sgYW5kIElQLUFkZHIgZGlzYWdyZWUgaW4gJXMvJWxkXG4iLAotCQlpbmV0X250b2EoVGhpcy0+YWRkciksIGJpdHMpOwotCVRoaXMtPmFkZHIuc19hZGRyICY9IFRoaXMtPm1hc2suc19hZGRyOwotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgU2V0IHRvICVzLyVsZCIsCi0JCWluZXRfbnRvYShUaGlzLT5hZGRyKSwgYml0cyk7Ci0gICAgfQotCi0gICAgaWYgKCphZGRyID09ICdcMCcpIHsKLQlUaGlzLT5tYXRjaGVyID0gcHJveHlfbWF0Y2hfaXBhZGRyOwotCXJldHVybiAxOwotICAgIH0KLSAgICBlbHNlCi0JcmV0dXJuICgqYWRkciA9PSAnXDAnKTsJLyogb2theSBpZmYgd2UndmUgcGFyc2VkIHRoZSB3aG9sZSBzdHJpbmcgKi8KLX0KLQotLyogUmV0dXJuIFRSVUUgaWYgYWRkciByZXByZXNlbnRzIGFuIElQIGFkZHJlc3MgKG9yIGFuIElQIG5ldHdvcmsgYWRkcmVzcykgKi8KLXN0YXRpYyBpbnQgcHJveHlfbWF0Y2hfaXBhZGRyKHN0cnVjdCBkaXJjb25uX2VudHJ5ICpUaGlzLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgaXBfYWRkcls0XTsKLSAgICBzdHJ1Y3QgaW5fYWRkciBhZGRyOwotICAgIHN0cnVjdCBpbl9hZGRyICppcF9saXN0OwotICAgIGNoYXIgKippcF9saXN0cHRyOwotICAgIGNvbnN0IGNoYXIgKmZvdW5kOwotICAgIGNvbnN0IGNoYXIgKmhvc3QgPSBwcm94eV9nZXRfaG9zdF9vZl9yZXF1ZXN0KHIpOwotCi0gICAgaWYgKGhvc3QgPT0gTlVMTCkgICAvKiBvb3BzISAqLwotICAgICAgIHJldHVybiAwOwotCi0gICAgbWVtc2V0KCZhZGRyLCAnXDAnLCBzaXplb2YgYWRkcik7Ci0gICAgbWVtc2V0KGlwX2FkZHIsICdcMCcsIHNpemVvZiBpcF9hZGRyKTsKLQotICAgIGlmICg0ID09IHNzY2FuZihob3N0LCAiJWQuJWQuJWQuJWQiLCAmaXBfYWRkclswXSwgJmlwX2FkZHJbMV0sICZpcF9hZGRyWzJdLCAmaXBfYWRkclszXSkpIHsKLQlmb3IgKGFkZHIuc19hZGRyID0gMCwgaSA9IDA7IGkgPCA0OyArK2kpCi0JICAgIGFkZHIuc19hZGRyIHw9IGh0b25sKGlwX2FkZHJbaV0gPDwgKDI0IC0gOCAqIGkpKTsKLQotCWlmIChUaGlzLT5hZGRyLnNfYWRkciA9PSAoYWRkci5zX2FkZHIgJiBUaGlzLT5tYXNrLnNfYWRkcikpIHsKLSNpZiBERUJVR0dJTkcKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAiMSlJUC1NYXRjaDogJXNbJXNdIDwtPiAiLCBob3N0LCBpbmV0X250b2EoYWRkcikpOwotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICIlcy8iLCBpbmV0X250b2EoVGhpcy0+YWRkcikpOwotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICIlcyIsIGluZXRfbnRvYShUaGlzLT5tYXNrKSk7Ci0jZW5kaWYKLQkgICAgcmV0dXJuIDE7Ci0JfQotI2lmIERFQlVHR0lORwotCWVsc2UgewotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICIxKUlQLU5vTWF0Y2g6ICVzWyVzXSA8LT4gIiwgaG9zdCwgaW5ldF9udG9hKGFkZHIpKTsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAiJXMvIiwgaW5ldF9udG9hKFRoaXMtPmFkZHIpKTsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAiJXMiLCBpbmV0X250b2EoVGhpcy0+bWFzaykpOwotCX0KLSNlbmRpZgotICAgIH0KLSAgICBlbHNlIHsKLQlzdHJ1Y3QgaG9zdGVudCB0aGVfaG9zdDsKLQotCW1lbXNldCgmdGhlX2hvc3QsICdcMCcsIHNpemVvZiB0aGVfaG9zdCk7Ci0JZm91bmQgPSBhcF9wcm94eV9ob3N0MmFkZHIoaG9zdCwgJnRoZV9ob3N0KTsKLQotCWlmIChmb3VuZCAhPSBOVUxMKSB7Ci0jaWYgREVCVUdHSU5HCi0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIjIpSVAtTm9NYXRjaDogaG9zdG5hbWU9JXMgbXNnPSVzIiwgaG9zdCwgZm91bmQpOwotI2VuZGlmCi0JICAgIHJldHVybiAwOwotCX0KLQotCWlmICh0aGVfaG9zdC5oX25hbWUgIT0gTlVMTCkKLQkgICAgZm91bmQgPSB0aGVfaG9zdC5oX25hbWU7Ci0JZWxzZQotCSAgICBmb3VuZCA9IGhvc3Q7Ci0KLQkvKiBUcnkgdG8gZGVhbCB3aXRoIG11bHRpcGxlIElQIGFkZHIncyBmb3IgYSBob3N0ICovCi0JZm9yIChpcF9saXN0cHRyID0gdGhlX2hvc3QuaF9hZGRyX2xpc3Q7ICppcF9saXN0cHRyOyArK2lwX2xpc3RwdHIpIHsKLQkgICAgaXBfbGlzdCA9IChzdHJ1Y3QgaW5fYWRkciAqKSAqaXBfbGlzdHB0cjsKLQkgICAgaWYgKFRoaXMtPmFkZHIuc19hZGRyID09IChpcF9saXN0LT5zX2FkZHIgJiBUaGlzLT5tYXNrLnNfYWRkcikpIHsKLSNpZiBERUJVR0dJTkcKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAiMylJUC1NYXRjaDogJXNbJXNdIDwtPiAiLCBmb3VuZCwgaW5ldF9udG9hKCppcF9saXN0KSk7Ci0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIiVzLyIsIGluZXRfbnRvYShUaGlzLT5hZGRyKSk7Ci0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIiVzIiwgaW5ldF9udG9hKFRoaXMtPm1hc2spKTsKLSNlbmRpZgotCQlyZXR1cm4gMTsKLQkgICAgfQotI2lmIERFQlVHR0lORwotCSAgICBlbHNlIHsKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAiMylJUC1Ob01hdGNoOiAlc1slc10gPC0+ICIsIGZvdW5kLCBpbmV0X250b2EoKmlwX2xpc3QpKTsKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAiJXMvIiwgaW5ldF9udG9hKFRoaXMtPmFkZHIpKTsKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAiJXMiLCBpbmV0X250b2EoVGhpcy0+bWFzaykpOwotCSAgICB9Ci0jZW5kaWYKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiBUUlVFIGlmIGFkZHIgcmVwcmVzZW50cyBhIGRvbWFpbiBuYW1lICovCi1pbnQgYXBfcHJveHlfaXNfZG9tYWlubmFtZShzdHJ1Y3QgZGlyY29ubl9lbnRyeSAqVGhpcywgYXBfY29udGV4dF90ICpwKQotewotICAgIGNoYXIgKmFkZHIgPSBUaGlzLT5uYW1lOwotICAgIGludCBpOwotCi0gICAgLyogRG9tYWluIG5hbWUgbXVzdCBzdGFydCB3aXRoIGEgJy4nICovCi0gICAgaWYgKGFkZHJbMF0gIT0gJy4nKQotCXJldHVybiAwOwotCi0gICAgLyogcmZjMTAzNSBzYXlzIEROUyBuYW1lcyBtdXN0IGNvbnNpc3Qgb2YgIlstYS16QS1aMC05XSIgYW5kICcuJyAqLwotICAgIGZvciAoaSA9IDA7IGFwX2lzYWxudW0oYWRkcltpXSkgfHwgYWRkcltpXSA9PSAnLScgfHwgYWRkcltpXSA9PSAnLic7ICsraSkKLQljb250aW51ZTsKLQotI2lmIDAKLSAgICBpZiAoYWRkcltpXSA9PSAnOicpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIkBAQEAgaGFuZGxlIG9wdGlvbmFsIHBvcnQgaW4gcHJveHlfaXNfZG9tYWlubmFtZSgpIik7Ci0JLyogQEBAQCBoYW5kbGUgb3B0aW9uYWwgcG9ydCAqLwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKGFkZHJbaV0gIT0gJ1wwJykKLQlyZXR1cm4gMDsKLQotICAgIC8qIFN0cmlwIHRyYWlsaW5nIGRvdHMgKi8KLSAgICBmb3IgKGkgPSBzdHJsZW4oYWRkcikgLSAxOyBpID4gMCAmJiBhZGRyW2ldID09ICcuJzsgLS1pKQotCWFkZHJbaV0gPSAnXDAnOwotCi0gICAgVGhpcy0+bWF0Y2hlciA9IHByb3h5X21hdGNoX2RvbWFpbm5hbWU7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qIFJldHVybiBUUlVFIGlmIGhvc3QgImhvc3QiIGlzIGluIGRvbWFpbiAiZG9tYWluIiAqLwotc3RhdGljIGludCBwcm94eV9tYXRjaF9kb21haW5uYW1lKHN0cnVjdCBkaXJjb25uX2VudHJ5ICpUaGlzLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb25zdCBjaGFyICpob3N0ID0gcHJveHlfZ2V0X2hvc3Rfb2ZfcmVxdWVzdChyKTsKLSAgICBpbnQgZF9sZW4gPSBzdHJsZW4oVGhpcy0+bmFtZSksIGhfbGVuOwotCi0gICAgaWYgKGhvc3QgPT0gTlVMTCkJCS8qIHNvbWUgZXJyb3Igd2FzIGxvZ2dlZCBhbHJlYWR5ICovCi0JcmV0dXJuIDA7Ci0KLSAgICBoX2xlbiA9IHN0cmxlbihob3N0KTsKLQotICAgIC8qIEBAQCBkbyB0aGlzIHdpdGhpbiB0aGUgc2V0dXA/ICovCi0gICAgLyogSWdub3JlIHRyYWlsaW5nIGRvdHMgaW4gZG9tYWluIGNvbXBhcmlzb246ICovCi0gICAgd2hpbGUgKGRfbGVuID4gMCAmJiBUaGlzLT5uYW1lW2RfbGVuIC0gMV0gPT0gJy4nKQotCS0tZF9sZW47Ci0gICAgd2hpbGUgKGhfbGVuID4gMCAmJiBob3N0W2hfbGVuIC0gMV0gPT0gJy4nKQotCS0taF9sZW47Ci0gICAgcmV0dXJuIGhfbGVuID4gZF9sZW4KLQkmJiBzdHJuY2FzZWNtcCgmaG9zdFtoX2xlbiAtIGRfbGVuXSwgVGhpcy0+bmFtZSwgZF9sZW4pID09IDA7Ci19Ci0KLS8qIFJldHVybiBUUlVFIGlmIGFkZHIgcmVwcmVzZW50cyBhIGhvc3QgbmFtZSAqLwotaW50IGFwX3Byb3h5X2lzX2hvc3RuYW1lKHN0cnVjdCBkaXJjb25uX2VudHJ5ICpUaGlzLCBhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgc3RydWN0IGhvc3RlbnQgaG9zdDsKLSAgICBjaGFyICphZGRyID0gVGhpcy0+bmFtZTsKLSAgICBpbnQgaTsKLQotICAgIC8qIEhvc3QgbmFtZXMgbXVzdCBub3Qgc3RhcnQgd2l0aCBhICcuJyAqLwotICAgIGlmIChhZGRyWzBdID09ICcuJykKLQlyZXR1cm4gMDsKLQotICAgIC8qIHJmYzEwMzUgc2F5cyBETlMgbmFtZXMgbXVzdCBjb25zaXN0IG9mICJbLWEtekEtWjAtOV0iIGFuZCAnLicgKi8KLSAgICBmb3IgKGkgPSAwOyBhcF9pc2FsbnVtKGFkZHJbaV0pIHx8IGFkZHJbaV0gPT0gJy0nIHx8IGFkZHJbaV0gPT0gJy4nOyArK2kpOwotCi0jaWYgMAotICAgIGlmIChhZGRyW2ldID09ICc6JykgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiQEBAQCBoYW5kbGUgb3B0aW9uYWwgcG9ydCBpbiBwcm94eV9pc19ob3N0bmFtZSgpIik7Ci0JLyogQEBAQCBoYW5kbGUgb3B0aW9uYWwgcG9ydCAqLwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKGFkZHJbaV0gIT0gJ1wwJyB8fCBhcF9wcm94eV9ob3N0MmFkZHIoYWRkciwgJmhvc3QpICE9IE5VTEwpCi0JcmV0dXJuIDA7Ci0KLSAgICBUaGlzLT5ob3N0ZW50cnkgPSBhcF9wZHVwaG9zdGVudCAocCwgJmhvc3QpOwotCi0gICAgLyogU3RyaXAgdHJhaWxpbmcgZG90cyAqLwotICAgIGZvciAoaSA9IHN0cmxlbihhZGRyKSAtIDE7IGkgPiAwICYmIGFkZHJbaV0gPT0gJy4nOyAtLWkpCi0JYWRkcltpXSA9ICdcMCc7Ci0KLSAgICBUaGlzLT5tYXRjaGVyID0gcHJveHlfbWF0Y2hfaG9zdG5hbWU7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qIFJldHVybiBUUlVFIGlmIGhvc3QgImhvc3QiIGlzIGVxdWFsIHRvIGhvc3QyICJob3N0MiIgKi8KLXN0YXRpYyBpbnQgcHJveHlfbWF0Y2hfaG9zdG5hbWUoc3RydWN0IGRpcmNvbm5fZW50cnkgKlRoaXMsIHJlcXVlc3RfcmVjICpyKQotewotICAgIGNoYXIgKmhvc3QgPSBUaGlzLT5uYW1lOwotICAgIGNvbnN0IGNoYXIgKmhvc3QyID0gcHJveHlfZ2V0X2hvc3Rfb2ZfcmVxdWVzdChyKTsKLSAgICBpbnQgaDJfbGVuOwotICAgIGludCBoMV9sZW47Ci0KLSAgICBpZiAoaG9zdCA9PSBOVUxMIHx8IGhvc3QyID09IE5VTEwpCi0gICAgICAgcmV0dXJuIDA7IC8qIG9vcHMhICovCi0KLSAgICBoMl9sZW4gPSBzdHJsZW4oaG9zdDIpOwotICAgIGgxX2xlbiA9IHN0cmxlbihob3N0KTsKLQotI2lmIDAKLSAgICB1bnNpZ25lZCBsb25nICppcF9saXN0OwotCi0gICAgLyogVHJ5IHRvIGRlYWwgd2l0aCBtdWx0aXBsZSBJUCBhZGRyJ3MgZm9yIGEgaG9zdCAqLwotICAgIGZvciAoaXBfbGlzdCA9ICpUaGlzLT5ob3N0ZW50cnktPmhfYWRkcl9saXN0OyAqaXBfbGlzdCAhPSAwVUw7ICsraXBfbGlzdCkKLQlpZiAoKmlwX2xpc3QgPT0gPyA/ID8gPyA/ID8gPyA/ID8gPyA/ID8gPykKLQkgICAgcmV0dXJuIDE7Ci0jZW5kaWYKLQotICAgIC8qIElnbm9yZSB0cmFpbGluZyBkb3RzIGluIGhvc3QyIGNvbXBhcmlzb246ICovCi0gICAgd2hpbGUgKGgyX2xlbiA+IDAgJiYgaG9zdDJbaDJfbGVuIC0gMV0gPT0gJy4nKQotCS0taDJfbGVuOwotICAgIHdoaWxlIChoMV9sZW4gPiAwICYmIGhvc3RbaDFfbGVuIC0gMV0gPT0gJy4nKQotCS0taDFfbGVuOwotICAgIHJldHVybiBoMV9sZW4gPT0gaDJfbGVuCi0JJiYgc3RybmNhc2VjbXAoaG9zdCwgaG9zdDIsIGgxX2xlbikgPT0gMDsKLX0KLQotLyogUmV0dXJuIFRSVUUgaWYgYWRkciBpcyB0byBiZSBtYXRjaGVkIGFzIGEgd29yZCAqLwotaW50IGFwX3Byb3h5X2lzX3dvcmQoc3RydWN0IGRpcmNvbm5fZW50cnkgKlRoaXMsIGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICBUaGlzLT5tYXRjaGVyID0gcHJveHlfbWF0Y2hfd29yZDsKLSAgICByZXR1cm4gMTsKLX0KLQotLyogUmV0dXJuIFRSVUUgaWYgc3RyaW5nICJzdHIyIiBvY2N1cnMgbGl0ZXJhbGx5IGluICJzdHIxIiAqLwotc3RhdGljIGludCBwcm94eV9tYXRjaF93b3JkKHN0cnVjdCBkaXJjb25uX2VudHJ5ICpUaGlzLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjb25zdCBjaGFyICpob3N0ID0gcHJveHlfZ2V0X2hvc3Rfb2ZfcmVxdWVzdChyKTsKLSAgICByZXR1cm4gaG9zdCAhPSBOVUxMICYmIHN0cnN0cihob3N0LCBUaGlzLT5uYW1lKSAhPSBOVUxMOwotfQotCi1pbnQgYXBfcHJveHlfZG9jb25uZWN0KGludCBzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIsIHJlcXVlc3RfcmVjICpyKQotewotICAgIGludCBpOwotCi0gICAgZG8gewotCWkgPSBjb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgYWRkciwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOwotI2lmZGVmIFdJTjMyCi0JaWYgKGkgPT0gU09DS0VUX0VSUk9SKQotCSAgICBlcnJubyA9IFdTQUdldExhc3RFcnJvcigpOwotI2VuZGlmIC8qIFdJTjMyICovCi0gICAgfSB3aGlsZSAoaSA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7Ci0gICAgaWYgKGkgPT0gLTEpIHsKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLQkJICAgICAicHJveHkgY29ubmVjdCB0byAlcyBwb3J0ICVkIGZhaWxlZCIsCi0JCSAgICAgaW5ldF9udG9hKGFkZHItPnNpbl9hZGRyKSwgbnRvaHMoYWRkci0+c2luX3BvcnQpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYXBfdGFibGVfZG8oKSBmb3IgYWxsIGhlYWRlciBsaW5lcyAqLwotLyogKGZyb20gcHJveHlfaHR0cC5jIGFuZCBwcm94eV9mdHAuYykgKi8KLS8qIEl0IGlzIHBhc3NlZCBhIHRhYmxlX2RvX2FyZ3Mgc3RydWN0IHBvaW50ZXIgYW5kIGEgTUlNRSBmaWVsZCBhbmQgdmFsdWUgcGFpciAqLwotaW50IGFwX3Byb3h5X3NlbmRfaGRyX2xpbmUodm9pZCAqcCwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSkKLXsKLSAgICBzdHJ1Y3QgdGJsX2RvX2FyZ3MgKnBhcm0gPSAoc3RydWN0IHRibF9kb19hcmdzICopcDsKLQotICAgIGlmIChrZXkgPT0gTlVMTCB8fCB2YWx1ZSA9PSBOVUxMIHx8IHZhbHVlWzBdID09ICdcMCcpCi0JcmV0dXJuIDE7Ci0gICAgaWYgKCFwYXJtLT5yZXEtPmFzc2JhY2t3YXJkcykKLQlhcF9ydnB1dHMocGFybS0+cmVxLCBrZXksICI6ICIsIHZhbHVlLCBDUkxGLCBOVUxMKTsKLSAgICBpZiAocGFybS0+Y2FjaGUgIT0gTlVMTCAmJiBwYXJtLT5jYWNoZS0+ZnAgIT0gTlVMTCAmJgotCWFwX2J2cHV0cyhwYXJtLT5jYWNoZS0+ZnAsIGtleSwgIjogIiwgdmFsdWUsIENSTEYsIE5VTEwpID09IC0xKSB7Ci0JICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBwYXJtLT5jYWNoZS0+cmVxLAotCQkgICAgInByb3h5OiBlcnJvciB3cml0aW5nIGhlYWRlciB0byAlcyIsIHBhcm0tPmNhY2hlLT50ZW1wZmlsZSk7Ci0JICAgIHBhcm0tPmNhY2hlID0gYXBfcHJveHlfY2FjaGVfZXJyb3IocGFybS0+Y2FjaGUpOwotICAgIH0KLSAgICByZXR1cm4gMTsgLyogdGVsbCBhcF90YWJsZV9kbygpIHRvIGNvbnRpbnVlIGNhbGxpbmcgdXMgZm9yIG1vcmUgaGVhZGVycyAqLwotfQotCi0vKiBzZW5kIGEgdGV4dCBsaW5lIHRvIG9uZSBvciB0d28gQlVGRidzOyByZXR1cm4gbGluZSBsZW5ndGggKi8KLXVuc2lnbmVkIGFwX3Byb3h5X2JwdXRzMihjb25zdCBjaGFyICpkYXRhLCBCVUZGICpjbGllbnQsIGNhY2hlX3JlcSAqY2FjaGUpCi17Ci0gICAgdW5zaWduZWQgbGVuID0gYXBfYnB1dHMoZGF0YSwgY2xpZW50KTsKLSAgICBpZiAoY2FjaGUgIT0gTlVMTCAmJiBjYWNoZS0+ZnAgIT0gTlVMTCkKLQlhcF9icHV0cyhkYXRhLCBjYWNoZS0+ZnApOwotICAgIHJldHVybiBsZW47Ci19Ci0KZGlmZiAtLWdpdCBhL21vZHVsZXMvc3NsLy5pbmRlbnQucHJvIGIvbW9kdWxlcy9zc2wvLmluZGVudC5wcm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZmJlOWYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy9zc2wvLmluZGVudC5wcm8KKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0taTQgLW5wc2wgLWRpMCAtYnIgLW5jZSAtZDAgLWNsaTAgLW5wY3MgLW5mYzEKLS1UQlVGRgotLVRGSUxFCi0tVFRSQU5TCi0tVFVJTlQ0Ci0tVF90cmFucwotLVRhbGxvd19vcHRpb25zX3QKLS1UYXBhY2hlX3NmaW8KLS1UYXJyYXlfaGVhZGVyCi0tVGJvb2xfaW50Ci0tVGJ1Zl9hcmVhCi0tVGJ1ZmZfc3RydWN0Ci0tVGJ1ZmZ5Ci0tVGNtZF9ob3cKLS1UY21kX3Bhcm1zCi0tVGNvbW1hbmRfcmVjCi0tVGNvbW1hbmRfc3RydWN0Ci0tVGNvbm5fcmVjCi0tVGNvcmVfZGlyX2NvbmZpZwotLVRjb3JlX3NlcnZlcl9jb25maWcKLS1UZGlyX21ha2VyX2Z1bmMKLS1UZXZlbnQKLS1UZ2xvYmFsc19zCi0tVGhhbmRsZXJfZnVuYwotLVRoYW5kbGVyX3JlYwotLVRqb2JsaXN0X3MKLS1UbGlzdGVuX3JlYwotLVRtZXJnZXJfZnVuYwotLVRtb2RlX3QKLS1UbW9kdWxlCi0tVG1vZHVsZV9zdHJ1Y3QKLS1UbXV0ZXgKLS1Ubl9sb25nCi0tVG90aGVyX2NoaWxkX3JlYwotLVRvdmVycmlkZXNfdAotLVRwYXJlbnRfc2NvcmUKLS1UcGlkX3QKLS1UcGlwZWRfbG9nCi0tVHBvb2wKLS1UcmVxdWVzdF9yZWMKLS1UcmVxdWlyZV9saW5lCi0tVHJsaW1fdAotLVRzY29yZWJvYXJkCi0tVHNlbWFwaG9yZQotLVRzZXJ2ZXJfYWRkcl9yZWMKLS1Uc2VydmVyX3JlYwotLVRzZXJ2ZXJfcmVjX2NoYWluCi0tVHNob3J0X3Njb3JlCi0tVHRhYmxlCi0tVHRhYmxlX2VudHJ5Ci0tVHRocmVhZAotLVR1X3dpZGVfaW50Ci0tVHZ0aW1lX3QKLS1Ud2lkZV9pbnQKZGlmZiAtLWdpdCBhL21vZHVsZXMvdGVzdC8uY3ZzaWdub3JlIGIvbW9kdWxlcy90ZXN0Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNGM2ZTMuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy90ZXN0Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLU1ha2VmaWxlCi0qLmxvCi0qLnNvCmRpZmYgLS1naXQgYS9tb2R1bGVzL3Rlc3QvLmluZGVudC5wcm8gYi9tb2R1bGVzL3Rlc3QvLmluZGVudC5wcm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZmJlOWYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy90ZXN0Ly5pbmRlbnQucHJvCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLWk0IC1ucHNsIC1kaTAgLWJyIC1uY2UgLWQwIC1jbGkwIC1ucGNzIC1uZmMxCi0tVEJVRkYKLS1URklMRQotLVRUUkFOUwotLVRVSU5UNAotLVRfdHJhbnMKLS1UYWxsb3dfb3B0aW9uc190Ci0tVGFwYWNoZV9zZmlvCi0tVGFycmF5X2hlYWRlcgotLVRib29sX2ludAotLVRidWZfYXJlYQotLVRidWZmX3N0cnVjdAotLVRidWZmeQotLVRjbWRfaG93Ci0tVGNtZF9wYXJtcwotLVRjb21tYW5kX3JlYwotLVRjb21tYW5kX3N0cnVjdAotLVRjb25uX3JlYwotLVRjb3JlX2Rpcl9jb25maWcKLS1UY29yZV9zZXJ2ZXJfY29uZmlnCi0tVGRpcl9tYWtlcl9mdW5jCi0tVGV2ZW50Ci0tVGdsb2JhbHNfcwotLVRoYW5kbGVyX2Z1bmMKLS1UaGFuZGxlcl9yZWMKLS1Uam9ibGlzdF9zCi0tVGxpc3Rlbl9yZWMKLS1UbWVyZ2VyX2Z1bmMKLS1UbW9kZV90Ci0tVG1vZHVsZQotLVRtb2R1bGVfc3RydWN0Ci0tVG11dGV4Ci0tVG5fbG9uZwotLVRvdGhlcl9jaGlsZF9yZWMKLS1Ub3ZlcnJpZGVzX3QKLS1UcGFyZW50X3Njb3JlCi0tVHBpZF90Ci0tVHBpcGVkX2xvZwotLVRwb29sCi0tVHJlcXVlc3RfcmVjCi0tVHJlcXVpcmVfbGluZQotLVRybGltX3QKLS1Uc2NvcmVib2FyZAotLVRzZW1hcGhvcmUKLS1Uc2VydmVyX2FkZHJfcmVjCi0tVHNlcnZlcl9yZWMKLS1Uc2VydmVyX3JlY19jaGFpbgotLVRzaG9ydF9zY29yZQotLVR0YWJsZQotLVR0YWJsZV9lbnRyeQotLVR0aHJlYWQKLS1UdV93aWRlX2ludAotLVR2dGltZV90Ci0tVHdpZGVfaW50CmRpZmYgLS1naXQgYS9tb2R1bGVzL3Rlc3QvUkVBRE1FIGIvbW9kdWxlcy90ZXN0L1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxNzYzYy4uMDAwMDAwMAotLS0gYS9tb2R1bGVzL3Rlc3QvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1UaGlzIGRpcmVjdG9yeSBpcyBpbnRlbmRlZCB0byBob3VzZSBtb2R1bGVzIHdoaWNoIGFyZSB1c2VkIGZvciB0ZXN0aW5nCi1zZXJ2ZXIgZnVuY3Rpb25hbGl0eS4gIFRoZXkncmUgdW5zdXBwb3J0ZWQsIGFuZCBub3QgZ3VhcmFudGVlZCB0byByZW1haW4KLWNvbnNpc3RhbnQgYmV0d2VlbiByZWxlYXNlcy4gIFlvdSdyZSBvbiB5b3VyIG93biBjb21wbGV0ZWx5IHdpdGggdGhlc2UuCmRpZmYgLS1naXQgYS9tb2R1bGVzL3Rlc3QvbW9kX3JuZGNodW5rLmMgYi9tb2R1bGVzL3Rlc3QvbW9kX3JuZGNodW5rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MWYxYWYuLjAwMDAwMDAKLS0tIGEvbW9kdWxlcy90ZXN0L21vZF9ybmRjaHVuay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIFRoaXMgbW9kdWxlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIHRlc3RpbmcgY2h1bmtlZCBlbmNvZGluZy4gIEl0Ci0gKiBnZW5lcmF0ZXMgYSB3aG9sZSB3aGFjayBvZiBvdXRwdXQgdXNpbmcgYXBfYnB1dGMoKSBhbmQgYXBfYnB1dHMoKS4gIEl0Ci0gKiBhbHNvIGV4ZXJjaXNlcyBzdGFydF9jaHVuaygpIGFuZCBlbmRfY2h1bmsoKSBpbiBidWZmLmMuICBUbyB1c2UgaXQKLSAqIHlvdSBzaG91bGQgdXNlIGEgdG9vbCBsaWtlIG5ldGNhdCBhbmQgdGhlIHNyYy90ZXN0L2NoZWNrX2NodW5rZWQKLSAqIHRvb2wuICBBZGQgc29tZXRoaW5nIGxpa2UgdGhpcyB0byB5b3VyIGFjY2Vzcy5jb25mIGZpbGU6Ci0gKgotICogPExvY2F0aW9uIC9ybmRjaHVuaz4KLSAqIFNldEhhbmRsZXIgcm5kY2h1bmsKLSAqIDwvTG9jYXRpb24+Ci0gKgotICogVGhlbiBmYWtlIHJlcXVlc3RzIHN1Y2ggYXM6Ci0gKgotICogR0VUIC9ybmRjaHVuaz8wLDEwMDAwMDAgSFRUUC8xLjEKLSAqIEhvc3Q6IGxvY2FsaG9zdAotICoKLSAqIFRoZSBmaXJzdCBhcmcgaXMgdGhlIHJhbmRvbSBzZWVkLCB0aGUgc2Vjb25kIGlzIHRoZSBudW1iZXIgb2YKLSAqICJ0aGluZ3MiIHRvIGRvLiAgWW91IHNob3VsZCB0cnkgYSBmZXcgc2VlZHMuCi0gKgotICogWW91IHNob3VsZCBhbHNvIGVkaXQgbWFpbi9idWZmLmMgYW5kIGNoYW5nZSBERUZBVUxUX0JVRlNJWkUgKGFuZAotICogQ0hVTktfSEVBREVSX1NJWkUpLiAgU21hbGwgdmFsdWVzIGFyZSBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvcgotICogZmluZGluZyBidWdzLiAgVHJ5IGEgZmV3IGRpZmZlcmVudCB2YWx1ZXMuCi0gKgotICogLWRqZwotICovCi0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotCi0jZGVmaW5lIE1BWF9TRUdNRU5UCTMyCi0jZGVmaW5lIE9ORV9XRUlHSFQJKDI1Ni0zMikKLQotc3RhdGljIGludCBzZW5kX3JuZGNodW5rKHJlcXVlc3RfcmVjICpyKQotewotICAgIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gICAgY2hhciAqZW5kcHRyOwotICAgIHVuc2lnbmVkIGludCBzZWVkOwotICAgIHVuc2lnbmVkIGludCBjb3VudDsKLSAgICBpbnQgaTsKLSAgICBjaGFyIGJ1ZltNQVhfU0VHTUVOVCArIDFdOwotICAgIHVuc2lnbmVkIGludCBsZW47Ci0KLSAgICByLT5hbGxvd2VkIHw9ICgxIDw8IE1fR0VUKTsKLSAgICBpZiAoci0+bWV0aG9kX251bWJlciAhPSBNX0dFVCkKLQlyZXR1cm4gREVDTElORUQ7Ci0KLSAgICByLT5jb250ZW50X3R5cGUgPSAidGV4dC9odG1sIjsJCQotICAgIGFwX3NlbmRfaHR0cF9oZWFkZXIocik7Ci0gICAgaWYoci0+aGVhZGVyX29ubHkpIHsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgYXBfaGFyZF90aW1lb3V0KCJzZW5kX3JuZGNodW5rIiwgcik7Ci0KLSAgICBpZiAoIXItPmNodW5rZWQpIHsKLQlhcF9ycHV0cygiTm90IGNodW5rZWQhIiwgcik7Ci0JYXBfa2lsbF90aW1lb3V0KHIpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIGFyZ3MgPSByLT5hcmdzOwotICAgIGlmICghYXJncykgewotZXJyb3I6Ci0JYXBfcnB1dHMoIk11c3QgaW5jbHVkZSBhcmdzISAuLi4gb2YgdGhlIGZvcm0gPGNvZGU+P3NlZWQsY291bnQ8L2NvZGU+Iiwgcik7Ci0JYXBfa2lsbF90aW1lb3V0KHIpOwotCXJldHVybiAwOwotICAgIH0KLSAgICBzZWVkID0gc3RydG9sKGFyZ3MsICZlbmRwdHIsIDApOwotICAgIGlmICghZW5kcHRyIHx8ICplbmRwdHIgIT0gJywnKSB7Ci0JZ290byBlcnJvcjsKLSAgICB9Ci0gICAgKytlbmRwdHI7Ci0gICAgY291bnQgPSBzdHJ0b2woZW5kcHRyLCAmZW5kcHRyLCAwKTsKLQotICAgIHNyYW5kb20oc2VlZCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLQlsZW4gPSByYW5kb20oKSAlIChNQVhfU0VHTUVOVCArIE9ORV9XRUlHSFQpOwotCWlmIChsZW4gPj0gTUFYX1NFR01FTlQpIHsKLQkgICAgYXBfcnB1dGMoKGkgJiAxKSA/ICcwJyA6ICcxJywgcik7Ci0JfQotCWVsc2UgaWYgKGxlbiA9PSAwKSB7Ci0JICAgIC8qIG5vdCBhIHJlYWxseSBuaWNlIHRoaW5nIHRvIGRvLCBidXQgd2UgbmVlZCB0byB0ZXN0Ci0JICAgICAqIGJlZ2lubmluZy9lbmRpbmcgY2h1bmtzIGFzIHdlbGwKLQkgICAgICovCi0JICAgIGFwX2JzZXRmbGFnKHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQl9DSFVOSywgMCk7Ci0JICAgIGFwX2JzZXRmbGFnKHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQl9DSFVOSywgMSk7Ci0JfQotCWVsc2UgewotCSAgICBtZW1zZXQoYnVmLCAnMicgKyBsZW4sIGxlbik7Ci0JICAgIGJ1ZltsZW5dID0gMDsKLQkgICAgYXBfcnB1dHMoYnVmLCByKTsKLQl9Ci0gICAgfQotICAgIGFwX2tpbGxfdGltZW91dChyKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IGhhbmRsZXJfcmVjIHJuZGNodW5rX2hhbmRsZXJzW10gPQotewotICAgIHsicm5kY2h1bmsiLCBzZW5kX3JuZGNodW5rfSwKLSAgICB7TlVMTH0KLX07Ci0KLW1vZHVsZSBybmRjaHVua19tb2R1bGUgPSB7Ci0gICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGLAotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplciAqLwotICAgIE5VTEwsCQkJLyogZGlyIGNvbmZpZyBjcmVhdGVyICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpciBtZXJnZXIgLS0tIGRlZmF1bHQgaXMgdG8gb3ZlcnJpZGUgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogc2VydmVyIGNvbmZpZyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBzZXJ2ZXIgY29uZmlnICovCi0gICAgTlVMTCwJCQkvKiBjb21tYW5kIGFwX3RhYmxlX3QgKi8KLSAgICBybmRjaHVua19oYW5kbGVycywJICAgICAgICAvKiBoYW5kbGVycyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWxlbmFtZSB0cmFuc2xhdGlvbiAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVja191c2VyX2lkICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGF1dGggKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgYWNjZXNzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHR5cGVfY2hlY2tlciAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXh1cHMgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogbG9nZ2VyICovCi0gICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhlYWRlciBwYXJzZXIgKi8KLX07CmRpZmYgLS1naXQgYS9tb2R1bGVzL3Rlc3QvbW9kX3Rlc3RfdXRpbF91cmkuYyBiL21vZHVsZXMvdGVzdC9tb2RfdGVzdF91dGlsX3VyaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmZlNjU3Li4wMDAwMDAwCi0tLSBhL21vZHVsZXMvdGVzdC9tb2RfdGVzdF91dGlsX3VyaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIFRoaXMgbW9kdWxlIGlzIGludGVuZGVkIHRvIHRlc3QgdGhlIHV0aWxfdXJpIHJvdXRpbmVzIGJ5IHBhcnNpbmcgYQotICogYnVuY2ggb2YgdXJscyBhbmQgY29tcGFyaW5nIHRoZSByZXN1bHRzIHdpdGggd2hhdCB3ZSBleHBlY3QgdG8KLSAqIHNlZS4KLSAqCi0gKiBVc2FnZToKLSAqCi0gKiA8TG9jYXRpb24gL3Rlc3QtdXRpbC11cmk+Ci0gKiBTZXRIYW5kbGVyIHRlc3QtdXRpbC11cmkKLSAqIDwvTG9jYXRpb24+Ci0gKgotICogVGhlbiBtYWtlIGEgcmVxdWVzdCB0byAvdGVzdC11dGlsLXVyaS4gIEFuIGh0bWwgYXBfdGFibGVfdCBvZiBlcnJvcnMgd2lsbAotICogYmUgb3V0cHV0Li4uIGFuZCBhIHRvdGFsIGNvdW50IG9mIGVycm9ycy4KLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX21haW4uaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNvbnN0IGNoYXIgKnNjaGVtZTsKLSAgICBjb25zdCBjaGFyICp1c2VyOwotICAgIGNvbnN0IGNoYXIgKnBhc3N3b3JkOwotICAgIGNvbnN0IGNoYXIgKmhvc3RuYW1lOwotICAgIGNvbnN0IGNoYXIgKnBvcnRfc3RyOwotICAgIGNvbnN0IGNoYXIgKnBhdGg7Ci0gICAgY29uc3QgY2hhciAqcXVlcnk7Ci0gICAgY29uc3QgY2hhciAqZnJhZ21lbnQ7Ci19IHRlc3RfdXJpX3Q7Ci0KLSNkZWZpbmUgVF9zY2hlbWUJMHgwMQotI2RlZmluZSBUX3VzZXIJCTB4MDIKLSNkZWZpbmUgVF9wYXNzd29yZAkweDA0Ci0jZGVmaW5lIFRfaG9zdG5hbWUJMHgwOAotI2RlZmluZSBUX3BvcnRfc3RyCTB4MTAKLSNkZWZpbmUgVF9wYXRoCQkweDIwCi0jZGVmaW5lIFRfcXVlcnkJCTB4NDAKLSNkZWZpbmUgVF9mcmFnbWVudAkweDgwCi0jZGVmaW5lIFRfTUFYCQkweDEwMAotCi0vKiBUaGUgaWRlYSBpcyB0aGF0IHdlIGxpc3QgaGVyZSBhIGJ1bmNoIG9mIHVybCBwaWVjZXMgdGhhdCB3ZSB3YW50Ci0gKiBzdGl0Y2hlZCB0b2dldGhlciBpbiBldmVyeSB3YXkgdGhhdCdzIHZhbGlkLgotICovCi1zdGF0aWMgY29uc3QgdGVzdF91cmlfdCB1cmlfdGVzdHNbXSA9IHsKLSAgICB7ICJodHRwIiwgInVzZXJpZCIsICJwYXNzd2QiLCAiaG9zdG5hbWUuZ29lcy5oZXJlIiwgIjgwIiwgIi9wYXRoL2dvZXMvaGVyZSIsICJxdWVyeS1oZXJlIiwgImZyYWctaGVyZSIgfSwKLSAgICB7ICJodHRwIiwgIiIsICJwYXNzd2QiLCAiaG9zdG5hbWUuZ29lcy5oZXJlIiwgIjgwIiwgIi9wYXRoL2dvZXMvaGVyZSIsICJxdWVyeS1oZXJlIiwgImZyYWctaGVyZSIgfSwKLSAgICB7ICJodHRwIiwgInVzZXJpZCIsICIiLCAiaG9zdG5hbWUuZ29lcy5oZXJlIiwgIjgwIiwgIi9wYXRoL2dvZXMvaGVyZSIsICJxdWVyeS1oZXJlIiwgImZyYWctaGVyZSIgfSwKLSAgICB7ICJodHRwIiwgInVzZXJpZCIsICJwYXNzd2QiLCAiIiwgIjgwIiwgIi9wYXRoL2dvZXMvaGVyZSIsICJxdWVyeS1oZXJlIiwgImZyYWctaGVyZSIgfSwKLSAgICB7ICJodHRwIiwgInVzZXJpZCIsICJwYXNzd2QiLCAiaG9zdG5hbWUuZ29lcy5oZXJlIiwgIiIsICIvcGF0aC9nb2VzL2hlcmUiLCAicXVlcnktaGVyZSIsICJmcmFnLWhlcmUiIH0sCi0jaWYgMAotICAgIC8qIEFuIGVtcHR5IHBhdGggbWVhbnMgdHdvIGRpZmZlcmVudCB0aGluZ3MgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhpcyBpcyBhCi0gICAgICogcmVsYXRpdmUgb3IgYW4gYWJzb2x1dGUgdXJpLi4uIGNvbnNpZGVyIDxhIGhyZWY9IiNmcmFnIj4gdmVyc3VzICJHRVQKLSAgICAgKiBodHRwOi8vaG9zdG5hbWUgSFRUUC8xLjEiLiAgU28gdGhpcyBpcyB3aHkgcGFyc2VfdXJpX2NvbXBvbmVudHMgcmV0dXJucwotICAgICAqIGEgTlVMTCBmb3IgcGF0aCB3aGVuIGl0IGRvZXNuJ3QgZmluZCBvbmUsIGluc3RlYWQgb2YgcmV0dXJuaW5nIGFuIGVtcHR5Ci0gICAgICogc3RyaW5nLgotICAgICAqCi0gICAgICogV2UgZG9uJ3QgcmVhbGx5IG5lZWQgdG8gdGVzdCBpdCBleHBsaWNpdGx5IHNpbmNlIHBhdGggaGFzIG5vIGV4cGxpY2l0Ci0gICAgICogY2hhcmFjdGVyIHRoYXQgaW5kaWNhdGVzIGl0cyBwcmVjZW5zZSwgYW5kIHNvIHdlIHRlc3QgZW1wdHkgcGF0aHMgYWxsCi0gICAgICogdGhlIHRpbWUgYnkgdmFyeWluZyBUX3BhdGggaW4gdGhlIGxvb3AuICBJdCB3b3VsZCBqdXN0IGNvc3QgdXMgZXh0cmEKLSAgICAgKiBjb2RlIHRvIHNwZWNpYWwgY2FzZSB0aGUgZW1wdHkgcGF0aCBzdHJpbmcuLi4KLSAgICAgKi8KLSAgICB7ICJodHRwIiwgInVzZXJpZCIsICJwYXNzd2QiLCAiaG9zdG5hbWUuZ29lcy5oZXJlIiwgIjgwIiwgIiIsICJxdWVyeS1oZXJlIiwgImZyYWctaGVyZSIgfSwKLSNlbmRpZgotICAgIHsgImh0dHAiLCAidXNlcmlkIiwgInBhc3N3ZCIsICJob3N0bmFtZS5nb2VzLmhlcmUiLCAiODAiLCAiL3BhdGgvZ29lcy9oZXJlIiwgIiIsICJmcmFnLWhlcmUiIH0sCi0gICAgeyAiaHR0cCIsICJ1c2VyaWQiLCAicGFzc3dkIiwgImhvc3RuYW1lLmdvZXMuaGVyZSIsICI4MCIsICIvcGF0aC9nb2VzL2hlcmUiLCAicXVlcnktaGVyZSIsICIiIH0sCi0gICAgeyAiaHR0cHMiLCAidXNlckBkIiwgInBhOnN3ZCIsICJob3N0bmFtZS5nb2VzLmhlcmUuIiwgIiIsICIvfnBhdGgvZ29lcy9oZXJlIiwgInF1ZXJ5JnF1ZXJ5P2NydWQiLCAiZnJhZy1oZXJlP2JhYnkiIH0KLQotfTsKLQotc3RhdGljIGNoYXIgKm15X3N0cGNweShjaGFyICpkLCBjb25zdCBjaGFyICpzKQotewotICAgIHdoaWxlKCgqZCA9ICpzKSkgewotCSsrZDsKLQkrK3M7Ci0gICAgfQotICAgIHJldHVybiBkOwotfQotCi0vKiByZXR1cm4gdGhlIG51bWJlciBvZiBmYWlsdXJlcyAqLwotc3RhdGljIHVuc2lnbmVkIGl0ZXJhdGVfcGllY2VzKHJlcXVlc3RfcmVjICpyLCBjb25zdCB0ZXN0X3VyaV90ICpwaWVjZXMsIGludCByb3cpCi17Ci0gICAgdW5zaWduZWQgdTsKLSAgICBhcF9jb250ZXh0X3QgKnN1YjsKLSAgICBjaGFyICppbnB1dF91cmk7Ci0gICAgY2hhciAqc3RycDsKLSAgICB1cmlfY29tcG9uZW50cyByZXN1bHQ7Ci0gICAgdW5zaWduZWQgZXhwZWN0OwotICAgIGludCBzdGF0dXM7Ci0gICAgdW5zaWduZWQgZmFpbHVyZXM7Ci0KLSAgICBmYWlsdXJlcyA9IDA7Ci0KLSAgICBpbnB1dF91cmkgPSBhcF9wYWxsb2Moci0+cG9vbCwKLQlzdHJsZW4ocGllY2VzLT5zY2hlbWUpICsgMwotCSsgc3RybGVuKHBpZWNlcy0+dXNlcikgKyAxCi0JKyBzdHJsZW4ocGllY2VzLT5wYXNzd29yZCkgKyAxCi0JKyBzdHJsZW4ocGllY2VzLT5ob3N0bmFtZSkgKyAxCi0JKyBzdHJsZW4ocGllY2VzLT5wb3J0X3N0cikgKyAxCi0JKyBzdHJsZW4ocGllY2VzLT5wYXRoKSArCi0JKyBzdHJsZW4ocGllY2VzLT5xdWVyeSkgKyAxCi0JKyBzdHJsZW4ocGllY2VzLT5mcmFnbWVudCkgKyAxCi0JKyAxKTsKLQotICAgIGZvciAodSA9IDA7IHUgPCBUX01BWDsgKyt1KSB7Ci0Jc3RycCA9IGlucHV0X3VyaTsKLQlleHBlY3QgPSAwOwotCi0JLyogYSBzY2hlbWUgcmVxdWlyZXMgYSBob3N0aW5mbyBhbmQgdmljZSB2ZXJzYSAqLwotCS8qIGEgaG9zdGluZm8gcmVxdWlyZXMgYSBob3N0bmFtZSAqLwotCWlmICh1ICYgKFRfc2NoZW1lfFRfdXNlcnxUX3Bhc3N3b3JkfFRfaG9zdG5hbWV8VF9wb3J0X3N0cikpIHsKLQkgICAgZXhwZWN0IHw9IFRfc2NoZW1lOwotCSAgICBzdHJwID0gbXlfc3RwY3B5KHN0cnAsIHBpZWNlcy0+c2NoZW1lKTsKLQkgICAgKnN0cnArKyA9ICc6JzsKLQkgICAgKnN0cnArKyA9ICcvJzsKLQkgICAgKnN0cnArKyA9ICcvJzsKLQkgICAgLyogY2FuJ3QgaGF2ZSBwYXNzd29yZCB3aXRob3V0IHVzZXIgKi8KLQkgICAgaWYgKHUgJiAoVF91c2VyfFRfcGFzc3dvcmQpKSB7Ci0JCWV4cGVjdCB8PSBUX3VzZXI7Ci0JCXN0cnAgPSBteV9zdHBjcHkoc3RycCwgcGllY2VzLT51c2VyKTsKLQkJaWYgKHUgJiBUX3Bhc3N3b3JkKSB7Ci0JCSAgICBleHBlY3QgfD0gVF9wYXNzd29yZDsKLQkJICAgICpzdHJwKysgPSAnOic7Ci0JCSAgICBzdHJwID0gbXlfc3RwY3B5KHN0cnAsIHBpZWNlcy0+cGFzc3dvcmQpOwotCQl9Ci0JCSpzdHJwKysgPSAnQCc7Ci0JICAgIH0KLQkgICAgZXhwZWN0IHw9IFRfaG9zdG5hbWU7Ci0JICAgIHN0cnAgPSBteV9zdHBjcHkoc3RycCwgcGllY2VzLT5ob3N0bmFtZSk7Ci0JICAgIGlmICh1ICYgVF9wb3J0X3N0cikgewotCQlleHBlY3QgfD0gVF9wb3J0X3N0cjsKLQkJKnN0cnArKyA9ICc6JzsKLQkJc3RycCA9IG15X3N0cGNweShzdHJwLCBwaWVjZXMtPnBvcnRfc3RyKTsKLQkgICAgfQotCX0KLQlpZiAodSAmIFRfcGF0aCkgewotCSAgICBleHBlY3QgfD0gVF9wYXRoOwotCSAgICBzdHJwID0gbXlfc3RwY3B5KHN0cnAsIHBpZWNlcy0+cGF0aCk7Ci0JfQotCWlmICh1ICYgVF9xdWVyeSkgewotCSAgICBleHBlY3QgfD0gVF9xdWVyeTsKLQkgICAgKnN0cnArKyA9ICc/JzsKLQkgICAgc3RycCA9IG15X3N0cGNweShzdHJwLCBwaWVjZXMtPnF1ZXJ5KTsKLQl9Ci0JaWYgKHUgJiBUX2ZyYWdtZW50KSB7Ci0JICAgIGV4cGVjdCB8PSBUX2ZyYWdtZW50OwotCSAgICAqc3RycCsrID0gJyMnOwotCSAgICBzdHJwID0gbXlfc3RwY3B5KHN0cnAsIHBpZWNlcy0+ZnJhZ21lbnQpOwotCX0KLQkqc3RycCA9IDA7Ci0KLQlzdWIgPSBhcF9tYWtlX3N1Yl9wb29sKHItPnBvb2wpOwotCXN0YXR1cyA9IGFwX3BhcnNlX3VyaV9jb21wb25lbnRzKHN1YiwgaW5wdXRfdXJpLCAmcmVzdWx0KTsKLQlpZiAoc3RhdHVzID09IEhUVFBfT0spIHsKLSNkZWZpbmUgQ0hFQ0soZikJCQkJCQkJXAotCSAgICBpZiAoKGV4cGVjdCAmIFRfIyNmKQkJCQkJXAotCQkmJiAocmVzdWx0LmYgPT0gTlVMTCB8fCBzdHJjbXAocmVzdWx0LmYsIHBpZWNlcy0+ZikpKSB7IFwKLQkJc3RhdHVzID0gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CQkJXAotCSAgICB9CQkJCQkJCQlcCi0JICAgIGVsc2UgaWYgKCEoZXhwZWN0ICYgVF8jI2YpICYmIHJlc3VsdC5mICE9IE5VTEwpIHsJCVwKLQkJc3RhdHVzID0gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7CQkJXAotCSAgICB9Ci0JICAgIENIRUNLKHNjaGVtZSkKLQkgICAgQ0hFQ0sodXNlcikKLQkgICAgQ0hFQ0socGFzc3dvcmQpCi0JICAgIENIRUNLKGhvc3RuYW1lKQotCSAgICBDSEVDSyhwb3J0X3N0cikKLQkgICAgQ0hFQ0socGF0aCkKLQkgICAgQ0hFQ0socXVlcnkpCi0JICAgIENIRUNLKGZyYWdtZW50KQotI3VuZGVmIENIRUNLCi0JfQotCWlmIChzdGF0dXMgIT0gSFRUUF9PSykgewotCSAgICBhcF9ycHJpbnRmKHIsICI8dHI+PHRkPiVkPC90ZD48dGQ+MHglMDJ4PC90ZD48dGQ+MHglMDJ4PC90ZD48dGQ+JWQ8L3RkPjx0ZD5cIiVzXCI8L3RkPiIsIHJvdywgdSwgZXhwZWN0LCBzdGF0dXMsIGlucHV0X3VyaSk7Ci0jZGVmaW5lIERVTVAoZikgCQkJCQkJCVwKLQkgICAgaWYgKHJlc3VsdC5mKSB7CQkJCQkJXAotCQlhcF9ydnB1dHMociwgIjx0ZD5cIiIsIHJlc3VsdC5mLCAiXCI8YnI+IiwgTlVMTCk7CQlcCi0JICAgIH0JCQkJCQkJCVwKLQkgICAgZWxzZSB7CQkJCQkJCVwKLQkJYXBfcnB1dHMoIjx0ZD5OVUxMPGJyPiIsIHIpOwkJCQlcCi0JICAgIH0JCQkJCQkJCVwKLQkgICAgaWYgKGV4cGVjdCAmIFRfIyNmKSB7CQkJCQlcCi0JCWFwX3J2cHV0cyhyLCAiXCIiLCBwaWVjZXMtPmYsICJcIjwvdGQ+IiwgTlVMTCk7CQlcCi0JICAgIH0JCQkJCQkJCVwKLQkgICAgZWxzZSB7CQkJCQkJCVwKLQkJYXBfcnB1dHMoIk5VTEw8L3RkPiIsIHIpOwkJCQkJXAotCSAgICB9Ci0JICAgIERVTVAoc2NoZW1lKTsKLQkgICAgRFVNUCh1c2VyKTsKLQkgICAgRFVNUChwYXNzd29yZCk7Ci0JICAgIERVTVAoaG9zdG5hbWUpOwotCSAgICBEVU1QKHBvcnRfc3RyKTsKLQkgICAgRFVNUChwYXRoKTsKLQkgICAgRFVNUChxdWVyeSk7Ci0JICAgIERVTVAoZnJhZ21lbnQpOwotI3VuZGVmIERVTVAKLQkgICAgYXBfcnB1dHMoIjwvdHI+XG4iLCByKTsKLQkgICAgKytmYWlsdXJlczsKLQl9Ci0JYXBfZGVzdHJveV9wb29sKHN1Yik7Ci0gICAgfQotICAgIHJldHVybiBmYWlsdXJlczsKLX0KLQotc3RhdGljIGludCB0ZXN0X3V0aWxfdXJpKHJlcXVlc3RfcmVjICpyKQotewotICAgIHVuc2lnbmVkIHRvdGFsX2ZhaWx1cmVzOwotICAgIGludCBpOwotCi0gICAgci0+YWxsb3dlZCB8PSAoMSA8PCBNX0dFVCk7Ci0gICAgaWYgKHItPm1ldGhvZF9udW1iZXIgIT0gTV9HRVQpCi0JcmV0dXJuIERFQ0xJTkVEOwotCi0gICAgci0+Y29udGVudF90eXBlID0gInRleHQvaHRtbCI7CQkKLSAgICBhcF9zZW5kX2h0dHBfaGVhZGVyKHIpOwotICAgIGlmKHItPmhlYWRlcl9vbmx5KSB7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGFwX2hhcmRfdGltZW91dCgidGVzdF91dGlsX3VyaSIsIHIpOwotCi0gICAgYXBfcnB1dHMoCi1ET0NUWVBFX0hUTUxfMl8wICIKLTxodG1sPjxib2R5PgotPHA+S2V5OgotPGRsPgotPGR0PnJvdwotPGRkPmVudHJ5IG51bWJlciBpbiB0aGUgdXJpX3Rlc3RzIGFycmF5Ci08ZHQ+dQotPGRkPmZpZWxkcyB1bmRlciB0ZXN0Ci08ZHQ+ZXhwZWN0ZWQKLTxkZD5maWVsZHMgZXhwZWN0ZWQgaW4gdGhlIHJlc3VsdAotPGR0PnN0YXR1cwotPGRkPnJlc3BvbnNlIGZyb20gcGFyc2VfdXJpX2NvbXBvbmVudHMsIG9yIDUwMCBpZiB1bmV4cGVjdGVkIHJlc3VsdHMKLTxkdD5pbnB1dCB1cmkKLTxkZD50aGUgdXJpIGdpdmVuIHRvIHBhcnNlX3VyaV9jb21wb25lbnRzCi08L2RsPgotPHA+VGhlIHJlbWFpbmluZyBmaWVsZHMgYXJlIHRoZSBwaWVjZXMgcmV0dXJuZWQgZnJvbSBwYXJzZV91cmlfY29tcG9uZW50cywgYW5kCi10aGUgdmFsdWVzIHdlIGV4cGVjdGVkIGZvciBlYWNoIHBpZWNlIChyZXNwLikuCi08cD5Pbmx5IGZhaWx1cmVzIGFyZSBkaXNwbGF5ZWQuCi08cD4KLTx0YWJsZT48dHI+PHRoPnJvdzwvdGg+PHRoPnU8L3RoPjx0aD5leHBlY3Q8L3RoPjx0aD5zdGF0dXM8L3RoPjx0aD5pbnB1dCB1cmk8L3RoPiIsIHIpOwotI2RlZmluZSBIRUFERVIoZikgYXBfcnByaW50ZihyLCAiPHRoPiIgI2YgIjxicj4weCUwMng8L3RoPiIsIFRfIyNmKQotICAgIEhFQURFUihzY2hlbWUpOwotICAgIEhFQURFUih1c2VyKTsKLSAgICBIRUFERVIocGFzc3dvcmQpOwotICAgIEhFQURFUihob3N0bmFtZSk7Ci0gICAgSEVBREVSKHBvcnRfc3RyKTsKLSAgICBIRUFERVIocGF0aCk7Ci0gICAgSEVBREVSKHF1ZXJ5KTsKLSAgICBIRUFERVIoZnJhZ21lbnQpOwotI3VuZGVmIEhFQURFUgotCi0gICAgaWYgKHItPmFyZ3MpIHsKLQlpID0gYXRvaShyLT5hcmdzKTsKLQl0b3RhbF9mYWlsdXJlcyA9IGl0ZXJhdGVfcGllY2VzKHIsICZ1cmlfdGVzdHNbaV0sIGkpOwotICAgIH0KLSAgICBlbHNlIHsKLQl0b3RhbF9mYWlsdXJlcyA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IHNpemVvZih1cmlfdGVzdHMpIC8gc2l6ZW9mKHVyaV90ZXN0c1swXSk7ICsraSkgewotCSAgICB0b3RhbF9mYWlsdXJlcyArPSBpdGVyYXRlX3BpZWNlcyhyLCAmdXJpX3Rlc3RzW2ldLCBpKTsKLQkgICAgaWYgKHRvdGFsX2ZhaWx1cmVzID4gMjU2KSB7Ci0JCWFwX3JwcmludGYociwgIjwvdGFibGU+XG48Yj5TdG9wcGVkIGVhcmx5IHRvIHNhdmUgeW91ciBicm93c2VyICIKLQkJCSAgICJmcm9tIGNlcnRhaW4gZGVhdGghPC9iPlxuVE9UQUwgRkFJTFVSRVMgPSAldVxuIiwKLQkJCSAgIHRvdGFsX2ZhaWx1cmVzKTsKLQkJcmV0dXJuIE9LOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICBhcF9ycHJpbnRmKHIsICI8L3RhYmxlPlxuVE9UQUwgRkFJTFVSRVMgPSAldVxuIiwgdG90YWxfZmFpbHVyZXMpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0aWMgY29uc3QgaGFuZGxlcl9yZWMgdGVzdF91dGlsX3VyaV9oYW5kbGVyc1tdID0KLXsKLSAgICB7InRlc3QtdXRpbC11cmkiLCB0ZXN0X3V0aWxfdXJpfSwKLSAgICB7TlVMTH0KLX07Ci0KLW1vZHVsZSB0ZXN0X3V0aWxfdXJpX21vZHVsZSA9IHsKLSAgICBTVEFOREFSRF9NT0RVTEVfU1RVRkYsCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpemVyICovCi0gICAgTlVMTCwJCQkvKiBkaXIgY29uZmlnIGNyZWF0ZXIgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogZGlyIG1lcmdlciAtLS0gZGVmYXVsdCBpcyB0byBvdmVycmlkZSAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXJ2ZXIgY29uZmlnICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lcmdlIHNlcnZlciBjb25maWcgKi8KLSAgICBOVUxMLAkJCS8qIGNvbW1hbmQgYXBfdGFibGVfdCAqLwotICAgIHRlc3RfdXRpbF91cmlfaGFuZGxlcnMsCS8qIGhhbmRsZXJzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbGVuYW1lIHRyYW5zbGF0aW9uICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrX3VzZXJfaWQgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgYXV0aCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBhY2Nlc3MgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwZV9jaGVja2VyICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpeHVwcyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2dnZXIgKi8KLSAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgLyogaGVhZGVyIHBhcnNlciAqLwotfTsKZGlmZiAtLWdpdCBhL29zLy5jdnNpZ25vcmUgYi9vcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2M3YTdjLi4wMDAwMDAwCi0tLSBhL29zLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYWtlZmlsZQpkaWZmIC0tZ2l0IGEvb3MvLmluZGVudC5wcm8gYi9vcy8uaW5kZW50LnBybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlmYmU5Zi4uMDAwMDAwMAotLS0gYS9vcy8uaW5kZW50LnBybworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS1pNCAtbnBzbCAtZGkwIC1iciAtbmNlIC1kMCAtY2xpMCAtbnBjcyAtbmZjMQotLVRCVUZGCi0tVEZJTEUKLS1UVFJBTlMKLS1UVUlOVDQKLS1UX3RyYW5zCi0tVGFsbG93X29wdGlvbnNfdAotLVRhcGFjaGVfc2ZpbwotLVRhcnJheV9oZWFkZXIKLS1UYm9vbF9pbnQKLS1UYnVmX2FyZWEKLS1UYnVmZl9zdHJ1Y3QKLS1UYnVmZnkKLS1UY21kX2hvdwotLVRjbWRfcGFybXMKLS1UY29tbWFuZF9yZWMKLS1UY29tbWFuZF9zdHJ1Y3QKLS1UY29ubl9yZWMKLS1UY29yZV9kaXJfY29uZmlnCi0tVGNvcmVfc2VydmVyX2NvbmZpZwotLVRkaXJfbWFrZXJfZnVuYwotLVRldmVudAotLVRnbG9iYWxzX3MKLS1UaGFuZGxlcl9mdW5jCi0tVGhhbmRsZXJfcmVjCi0tVGpvYmxpc3RfcwotLVRsaXN0ZW5fcmVjCi0tVG1lcmdlcl9mdW5jCi0tVG1vZGVfdAotLVRtb2R1bGUKLS1UbW9kdWxlX3N0cnVjdAotLVRtdXRleAotLVRuX2xvbmcKLS1Ub3RoZXJfY2hpbGRfcmVjCi0tVG92ZXJyaWRlc190Ci0tVHBhcmVudF9zY29yZQotLVRwaWRfdAotLVRwaXBlZF9sb2cKLS1UcG9vbAotLVRyZXF1ZXN0X3JlYwotLVRyZXF1aXJlX2xpbmUKLS1UcmxpbV90Ci0tVHNjb3JlYm9hcmQKLS1Uc2VtYXBob3JlCi0tVHNlcnZlcl9hZGRyX3JlYwotLVRzZXJ2ZXJfcmVjCi0tVHNlcnZlcl9yZWNfY2hhaW4KLS1Uc2hvcnRfc2NvcmUKLS1UdGFibGUKLS1UdGFibGVfZW50cnkKLS1UdGhyZWFkCi0tVHVfd2lkZV9pbnQKLS1UdnRpbWVfdAotLVR3aWRlX2ludApkaWZmIC0tZ2l0IGEvb3MvTWFrZWZpbGUuaW4gYi9vcy9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU2MmM5NS4uMDAwMDAwMAotLS0gYS9vcy9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotCi1ERVBUSCAgICAgPSAuLgotdG9wc3JjZGlyID0gQHRvcHNyY2RpckAKLXNyY2RpciAgICA9IEBzcmNkaXJACi1WUEFUSCAgICAgPSBAc3JjZGlyQAotCi1TVUJESVJTID0gJChPUykKLQotaW5jbHVkZSAkKHRvcHNyY2RpcikvYnVpbGQvcnVsZXMubWsKZGlmZiAtLWdpdCBhL29zL2Jlb3MvYmVvc2QuYyBiL29zL2Jlb3MvYmVvc2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU0NTBjZS4uMDAwMDAwMAotLS0gYS9vcy9iZW9zL2Jlb3NkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiYmVvc2QuaCIKLQotYmVvc2RfY29uZmlnX3JlYyBiZW9zZF9jb25maWc7Ci0KLXZvaWQgYmVvc2RfZGV0YWNoKHZvaWQpCi17Ci0gICAgcGlkX3QgcGdycDsKLQotICAgIGNoZGlyKCIvIik7Ci0KLSAgICBSQUlTRV9TSUdTVE9QKERFVEFDSCk7Ci0KLSAgICBpZiAoKHBncnAgPSBzZXRzaWQoKSkgPT0gLTEpIHsKLQlwZXJyb3IoInNldHNpZCIpOwotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiJXM6IHNldHNpZCBmYWlsZWQiLCBhcF9zZXJ2ZXJfYXJndjApOwotCWV4aXQoMSk7Ci0gICAgfQotCi0gICAgLyogY2xvc2Ugb3V0IHRoZSBzdGFuZGFyZCBmaWxlIGRlc2NyaXB0b3JzICovCi0gICAgaWYgKGZyZW9wZW4oIi9kZXYvbnVsbCIsICJyIiwgc3RkaW4pID09IE5VTEwpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIiVzOiB1bmFibGUgdG8gcmVwbGFjZSBzdGRpbiB3aXRoIC9kZXYvbnVsbDogJXMiLAotCQlhcF9zZXJ2ZXJfYXJndjAsIHN0cmVycm9yKGVycm5vKSk7Ci0JLyogY29udGludWUgYW55aG93IC0tIG5vdGUgd2UgY2FuJ3QgY2xvc2Ugb3V0IGRlc2NyaXB0b3IgMCBiZWNhdXNlIHdlCi0JICogaGF2ZSBub3RoaW5nIHRvIHJlcGxhY2UgaXQgd2l0aCwgYW5kIGlmIHdlIGRpZG4ndCBoYXZlIGEgZGVzY3JpcHRvcgotCSAqIDAgdGhlIG5leHQgZmlsZSB3b3VsZCBiZSBjcmVhdGVkIHdpdGggdGhhdCB2YWx1ZSAuLi4gbGVhZGluZyB0bwotCSAqIGhhdm9jLgotCSAqLwotICAgIH0KLSAgICBpZiAoZnJlb3BlbigiL2Rldi9udWxsIiwgInciLCBzdGRvdXQpID09IE5VTEwpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIiVzOiB1bmFibGUgdG8gcmVwbGFjZSBzdGRvdXQgd2l0aCAvZGV2L251bGw6ICVzIiwKLQkJYXBfc2VydmVyX2FyZ3YwLCBzdHJlcnJvcihlcnJubykpOwotICAgIH0KLSAgICAvKiBzdGRlcnIgaXMgYSB0cmlja3kgb25lLCB3ZSByZWFsbHkgd2FudCBpdCB0byBiZSB0aGUgZXJyb3JfbG9nLAotICAgICAqIGJ1dCB3ZSBoYXZlbid0IG9wZW5lZCB0aGF0IHlldC4gIFNvIGxlYXZlIGl0IGFsb25lIGZvciBub3cgYW5kIGl0J2xsCi0gICAgICogYmUgcmVvcGVuZWQgbW9tZW50cyBsYXRlci4KLSAgICAgKi8KLX0KLQotLyogU2V0IGdyb3VwIHByaXZpbGVnZXMuCi0gKgotICogTm90ZSB0aGF0IHdlIHVzZSB0aGUgdXNlcm5hbWUgYXMgc2V0IGluIHRoZSBjb25maWcgZmlsZXMsIHJhdGhlciB0aGFuCi0gKiB0aGUgbG9va3VwIG9mIHRvIHVpZCAtLS0gdGhlIHNhbWUgdWlkIG1heSBoYXZlIG11bHRpcGxlIHBhc3N3ZCBlbnRyaWVzLAotICogd2l0aCBkaWZmZXJlbnQgc2V0cyBvZiBncm91cHMgZm9yIGVhY2guCi0gKi8KLQotc3RhdGljIGludCBzZXRfZ3JvdXBfcHJpdnModm9pZCkKLXsKLSNpZiBCX0JFT1NfVkVSU0lPTiA8IDB4MDQ2MAotCi0gICAgaWYgKCFnZXRldWlkKCkpIHsKLQljaGFyICpuYW1lOwotCi0JLyogR2V0IHVzZXJuYW1lIGlmIHBhc3NlZCBhcyBhIHVpZCAqLwotCi0JaWYgKGJlb3NkX2NvbmZpZy51c2VyX25hbWVbMF0gPT0gJyMnKSB7Ci0JICAgIHN0cnVjdCBwYXNzd2QgKmVudDsKLQkgICAgdWlkX3QgdWlkID0gYXRvaSgmYmVvc2RfY29uZmlnLnVzZXJfbmFtZVsxXSk7Ci0KLQkgICAgaWYgKChlbnQgPSBnZXRwd3VpZCh1aWQpKSA9PSBOVUxMKSB7Ci0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgZXJybm8sIE5VTEwsCi0JCQkgImdldHB3dWlkOiBjb3VsZG4ndCBkZXRlcm1pbmUgdXNlciBuYW1lIGZyb20gdWlkICV1LCAiCi0JCQkgInlvdSBwcm9iYWJseSBuZWVkIHRvIG1vZGlmeSB0aGUgVXNlciBkaXJlY3RpdmUiLAotCQkJICh1bnNpZ25lZCl1aWQpOwotCQlyZXR1cm4gLTE7Ci0JICAgIH0KLQotCSAgICBuYW1lID0gZW50LT5wd19uYW1lOwotCX0KLQllbHNlCi0JICAgIG5hbWUgPSBiZW9zZF9jb25maWcudXNlcl9uYW1lOwotCi0JaWYgKHNldGdpZChiZW9zZF9jb25maWcuZ3JvdXBfaWQpID09IC0xKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgZXJybm8sIE5VTEwsCi0JCQkic2V0Z2lkOiB1bmFibGUgdG8gc2V0IGdyb3VwIGlkIHRvIEdyb3VwICV1IiwKLQkJCSh1bnNpZ25lZCliZW9zZF9jb25maWcuZ3JvdXBfaWQpOwotCSAgICByZXR1cm4gLTE7Ci0JfQotCi0JLyogUmVzZXQgYGdyb3VwcycgYXR0cmlidXRlcy4gKi8KLQotCWlmIChpbml0Z3JvdXBzKG5hbWUsIGJlb3NkX2NvbmZpZy5ncm91cF9pZCkgPT0gLTEpIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJULCBlcnJubywgTlVMTCwKLQkJCSJpbml0Z3JvdXBzOiB1bmFibGUgdG8gc2V0IGdyb3VwcyBmb3IgVXNlciAlcyAiCi0JCQkiYW5kIEdyb3VwICV1IiwgbmFtZSwgKHVuc2lnbmVkKWJlb3NkX2NvbmZpZy5ncm91cF9pZCk7Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotI2VuZGlmCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IGJlb3NkX3NldHVwX2NoaWxkKHZvaWQpCi17Ci0gICAgaWYgKHNldF9ncm91cF9wcml2cygpKSB7Ci0JcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIE9ubHkgdHJ5IHRvIHN3aXRjaCBpZiB3ZSdyZSBydW5uaW5nIGFzIHJvb3QgKi8KLSAgICBpZiAoIWdldGV1aWQoKSAmJiAoCi0Jc2V0dWlkKGJlb3NkX2NvbmZpZy51c2VyX2lkKSA9PSAtMSkpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlQsIGVycm5vLCBOVUxMLAotCQkgICAgInNldHVpZDogdW5hYmxlIHRvIGNoYW5nZSB1aWQiKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0KLWNvbnN0IGNoYXIgKmJlb3NkX3NldF91c2VyKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGJlb3NkX2NvbmZpZy51c2VyX25hbWUgPSBhcmc7Ci0gICAgYmVvc2RfY29uZmlnLnVzZXJfaWQgPSBhcF91bmFtZTJpZChhcmcpOwotI2lmICFkZWZpbmVkIChCSUdfU0VDVVJJVFlfSE9MRSkgJiYgIWRlZmluZWQgKE9TMikKLSAgICBpZiAoYmVvc2RfY29uZmlnLnVzZXJfaWQgPT0gMCkgewotCXJldHVybiAiRXJyb3I6XHRBcGFjaGUgaGFzIG5vdCBiZWVuIGRlc2lnbmVkIHRvIHNlcnZlIHBhZ2VzIHdoaWxlXG4iCi0JCSJcdHJ1bm5pbmcgYXMgcm9vdC4gIFRoZXJlIGFyZSBrbm93biByYWNlIGNvbmRpdGlvbnMgdGhhdFxuIgotCQkiXHR3aWxsIGFsbG93IGFueSBsb2NhbCB1c2VyIHRvIHJlYWQgYW55IGZpbGUgb24gdGhlIHN5c3RlbS5cbiIKLQkJIlx0SWYgeW91IHN0aWxsIGRlc2lyZSB0byBzZXJ2ZSBwYWdlcyBhcyByb290IHRoZW5cbiIKLQkJIlx0YWRkIC1EQklHX1NFQ1VSSVRZX0hPTEUgdG8gdGhlIEVYVFJBX0NGTEFHUyBsaW5lIGluIHlvdXJcbiIKLQkJIlx0c3JjL0NvbmZpZ3VyYXRpb24gZmlsZSBhbmQgcmVidWlsZCB0aGUgc2VydmVyLiAgSXQgaXNcbiIKLQkJIlx0c3Ryb25nbHkgc3VnZ2VzdGVkIHRoYXQgeW91IGluc3RlYWQgbW9kaWZ5IHRoZSBVc2VyXG4iCi0JCSJcdGRpcmVjdGl2ZSBpbiB5b3VyIGh0dHBkLmNvbmYgZmlsZSB0byBsaXN0IGEgbm9uLXJvb3RcbiIKLQkJIlx0dXNlci5cbiI7Ci0gICAgfQotI2VuZGlmCi0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotY29uc3QgY2hhciAqYmVvc2Rfc2V0X2dyb3VwKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGJlb3NkX2NvbmZpZy5ncm91cF9pZCA9IGFwX2duYW1lMmlkKGFyZyk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCBiZW9zZF9wcmVfY29uZmlnKHZvaWQpCi17Ci0gICAgYmVvc2RfY29uZmlnLnVzZXJfbmFtZSA9IERFRkFVTFRfVVNFUjsKLSAgICBiZW9zZF9jb25maWcudXNlcl9pZCA9IGFwX3VuYW1lMmlkKERFRkFVTFRfVVNFUik7Ci0gICAgYmVvc2RfY29uZmlnLmdyb3VwX2lkID0gYXBfZ25hbWUyaWQoREVGQVVMVF9HUk9VUCk7Ci19CmRpZmYgLS1naXQgYS9vcy9iZW9zL2Jlb3NkLmggYi9vcy9iZW9zL2Jlb3NkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NmJiNDcuLjAwMDAwMDAKLS0tIGEvb3MvYmVvcy9iZW9zZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotI2lmbmRlZiBVTklYRF9ICi0jZGVmaW5lIFVOSVhEX0gKLQotLyogY29tbW9uIHN0dWZmIHRoYXQgYmVvcyBNUE1zIHdpbGwgd2FudCAqLwotCi0vKiBEZWZhdWx0IHVzZXIgbmFtZSBhbmQgZ3JvdXAgbmFtZS4gVGhlc2UgbWF5IGJlIHNwZWNpZmllZCBhcyBudW1iZXJzIGJ5Ci0gKiBwbGFjaW5nIGEgIyBiZWZvcmUgYSBudW1iZXIgKi8KLQotI2lmbmRlZiBERUZBVUxUX1VTRVIKLSNkZWZpbmUgREVGQVVMVF9VU0VSICIjLTEiCi0jZW5kaWYKLSNpZm5kZWYgREVGQVVMVF9HUk9VUAotI2RlZmluZSBERUZBVUxUX0dST1VQICIjLTEiCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNoYXIgKnVzZXJfbmFtZTsKLSAgICB1aWRfdCB1c2VyX2lkOwotICAgIGdpZF90IGdyb3VwX2lkOwotfSBiZW9zZF9jb25maWdfcmVjOwotZXh0ZXJuIGJlb3NkX2NvbmZpZ19yZWMgYmVvc2RfY29uZmlnOwotCi12b2lkIGJlb3NkX2RldGFjaCh2b2lkKTsKLWludCBiZW9zZF9zZXR1cF9jaGlsZCh2b2lkKTsKLXZvaWQgYmVvc2RfcHJlX2NvbmZpZyh2b2lkKTsKLWNvbnN0IGNoYXIgKmJlb3NkX3NldF91c2VyKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKTsKLWNvbnN0IGNoYXIgKmJlb3NkX3NldF9ncm91cChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZyk7Ci0KLSNpZiBkZWZpbmVkKE5TSUcpCi0jZGVmaW5lIE51bVNJRyBOU0lHCi0jZWxpZiBkZWZpbmVkKF9OU0lHKQotI2RlZmluZSBOdW1TSUcgX05TSUcKLSNlbGlmIGRlZmluZWQoX19OU0lHKQotI2RlZmluZSBOdW1TSUcgX19OU0lHCi0jZWxzZQotI2RlZmluZSBOdW1TSUcgMzIgICAvKiBmb3IgMTk5OCdzIHVuaXhlcywgdGhpcyBpcyBzdGlsbCBhIGdvb2QgYXNzdW1wdGlvbiAqLwotI2VuZGlmCi0KLSNkZWZpbmUgSU5JVF9TSUdMSVNUKCkgIC8qIG5vdGhpbmcgKi8KLQotI2RlZmluZSBiZW9zZF9raWxscGcoeCwgeSkJKGtpbGwgKC0oeCksICh5KSkpCi0KLSNkZWZpbmUgVU5JWF9EQUVNT05fQ09NTUFORFMJXAoteyAiVXNlciIsIGJlb3NkX3NldF91c2VyLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLCBcCi0gICJFZmZlY3RpdmUgdXNlciBpZCBmb3IgdGhpcyBzZXJ2ZXIifSwgXAoteyAiR3JvdXAiLCBiZW9zZF9zZXRfZ3JvdXAsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsIFwKLSAgIkVmZmVjdGl2ZSBncm91cCBpZCBmb3IgdGhpcyBzZXJ2ZXIifSwgXAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29zL2Jlb3Mvb3MuYyBiL29zL2Jlb3Mvb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwYTIxYi4uMDAwMDAwMAotLS0gYS9vcy9iZW9zL29zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIHdpbGwgaW5jbHVkZSBPUyBzcGVjaWZpYyBmdW5jdGlvbnMgd2hpY2ggYXJlIG5vdCBpbmxpbmVhYmxlLgotICogQW55IGlubGluZWFibGUgZnVuY3Rpb25zIHNob3VsZCBiZSBkZWZpbmVkIGluIG9zLWlubGluZS5jIGluc3RlYWQuCi0gKi8KLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgIm9zLmgiCi0KLWludCBhcF9vc19pc19wYXRoX2Fic29sdXRlKGNvbnN0IGNoYXIgKmZpbGUpCi17Ci0gIHJldHVybiBmaWxlWzBdID09ICcvJzsKLX0KLQotCi0vKiBzb21lIGxpbmtlcnMgY29tcGxhaW4gdW5sZXNzIHRoZXJlJ3MgYXQgbGVhc3Qgb25lIGZ1bmN0aW9uIGluIGVhY2gKLSAqIC5vIGZpbGUuLi4gYW5kIGV4dHJhIHByb3RvdHlwZSBpcyBmb3IgZ2NjIC1XbWlzc2luZy1wcm90b3R5cGVzCi0gKi8KLWV4dGVybiB2b2lkIGFwX2lzX25vdF9oZXJlKHZvaWQpOwotdm9pZCBhcF9pc19ub3RfaGVyZSh2b2lkKSB7fQotCi0vKgotICogIEFic3RyYWN0aW9uIGxheWVyIGZvciBsb2FkaW5nCi0gKiAgQXBhY2hlIG1vZHVsZXMgdW5kZXIgcnVuLXRpbWUgdmlhIAotICogIGR5bmFtaWMgc2hhcmVkIG9iamVjdCAoRFNPKSBtZWNoYW5pc20KLSAqLwotCi12b2lkIGFwX29zX2Rzb19pbml0KHZvaWQpCi17Ci0gICAgLyogTm90aGluZyByZXF1aXJlZCB0byBiZSBkb25lISAqLyAKLX0KLQotdm9pZCogYXBfb3NfZHNvX2xvYWQoY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgICByZXR1cm4gKHZvaWQqKSBsb2FkX2FkZF9vbihwYXRoKTsKLX0KLQotdm9pZCBhcF9vc19kc29fdW5sb2FkKHZvaWQqIGhhbmRsZSkKLXsKLSAgICB1bmxvYWRfYWRkX29uKChpbWFnZV9pZCloYW5kbGUpOwotfQotCi12b2lkICphcF9vc19kc29fc3ltKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqc3ltbmFtZSkKLXsKLSAgICB2b2lkICogcmV0dmFsID0gMDsKLSNpZiBkZWZpbmVkKERMU1lNX05FRURTX1VOREVSU0NPUkUpCi0gICAgY2hhciAqc3ltYm9sID0gKGNoYXIqKW1hbGxvYyhzaXplb2YoY2hhcikqKHN0cmxlbihzeW1uYW1lKSsyKSk7Ci0gICAgc3ByaW50ZihzeW1ib2wsICJfJXMiLCBzeW1uYW1lKTsKLSAgICBnZXRfaW1hZ2Vfc3ltYm9sKChpbWFnZV9pZCloYW5kbGUsIHN5bWJvbCwgQl9TWU1CT0xfVFlQRV9BTlksICh2b2lkICoqKSZyZXR2YWwpOwotICAgIGZyZWUoc3ltYm9sKTsKLSAgICByZXR1cm4gcmV0dmFsOwotI2VuZGlmCi0gICAgZ2V0X2ltYWdlX3N5bWJvbCgoaW1hZ2VfaWQpaGFuZGxlLCBzeW1uYW1lLCBCX1NZTUJPTF9UWVBFX0FOWSwgKHZvaWQgKiopJnJldHZhbCk7Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotY29uc3QgY2hhciAqYXBfb3NfZHNvX2Vycm9yKHZvaWQpCi17Ci0gICAgcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS9vcy9iZW9zL29zLmggYi9vcy9iZW9zL29zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZTQyZTIuLjAwMDAwMDAKLS0tIGEvb3MvYmVvcy9vcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotI2lmbmRlZiBBUEFDSEVfT1NfSAotI2RlZmluZSBBUEFDSEVfT1NfSAotCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSA8a2VybmVsL2ltYWdlLmg+Ci0KLSNpZm5kZWYgUExBVEZPUk0KLSNkZWZpbmUgUExBVEZPUk0gIkJlT1MiCi0jZW5kaWYKLQotLyoKLSAqIFRoaXMgZmlsZSBpbiBpbmNsdWRlZCBpbiBhbGwgQXBhY2hlIHNvdXJjZSBjb2RlLiBJdCBjb250YWlucyBkZWZpbml0aW9ucwotICogb2YgZmFjaWxpdGllcyBhdmFpbGFibGUgb24gX3RoaXNfIG9wZXJhdGluZyBzeXN0ZW0gKEhBVkVfKiBtYWNyb3MpLAotICogYW5kIHByb3RvdHlwZXMgb2YgT1Mgc3BlY2lmaWMgZnVuY3Rpb25zIGRlZmluZWQgaW4gb3MuYyBvciBvcy1pbmxpbmUuYwotICovCi0KLWV4dGVybiBpbnQgYXBfb3NfaXNfcGF0aF9hYnNvbHV0ZShjb25zdCBjaGFyICpmaWxlKTsKLSNkZWZpbmUgYXBfb3NfY2Fub25pY2FsX2ZpbGVuYW1lKHAsZikgIChmKQotI2RlZmluZSBhcF9vc19jYXNlX2Nhbm9uaWNhbF9maWxlbmFtZShwLGYpICAoZikKLSNkZWZpbmUgYXBfb3Nfc3lzdGVtY2FzZV9maWxlbmFtZShwLGYpICAoZikKLSNkZWZpbmUgYXBfb3NfaXNfZmlsZW5hbWVfdmFsaWQoZikgICAgICAgICAgKDEpCi0jZGVmaW5lIGFwX29zX2tpbGwocGlkLCBzaWcpICAgICAgICAgICAgICAgIGtpbGwocGlkLCBzaWcpCi0KLS8qCi0gKiAgQWJzdHJhY3Rpb24gbGF5ZXIgZm9yIGxvYWRpbmcKLSAqICBBcGFjaGUgbW9kdWxlcyB1bmRlciBydW4tdGltZSB2aWEgCi0gKiAgZHluYW1pYyBzaGFyZWQgb2JqZWN0IChEU08pIG1lY2hhbmlzbQotICovCi0KLXZvaWQgKmRsb3Blbihjb25zdCBjaGFyICosIGludCk7Ci1pbnQgZGxjbG9zZSh2b2lkICopOwotdm9pZCAqZGxzeW0odm9pZCAqLCBjb25zdCBjaGFyICopOwotY29uc3QgY2hhciAqZGxlcnJvcih2b2lkKTsKLQotI2RlZmluZSBSVExEX05PVyAxCi0jZGVmaW5lIFJUTERfR0xPQkFMIDAKLQotI2RlZmluZSAgICAgYXBfb3NfZHNvX2hhbmRsZV90ICBpbWFnZV9pZCAqCi12b2lkICAgICAgICBhcF9vc19kc29faW5pdCh2b2lkKTsKLXZvaWQgKiAgICAgIGFwX29zX2Rzb19sb2FkKGNvbnN0IGNoYXIgKik7Ci12b2lkICAgICAgICBhcF9vc19kc29fdW5sb2FkKHZvaWQgKik7Ci12b2lkICogICAgICBhcF9vc19kc29fc3ltKHZvaWQgKiwgY29uc3QgY2hhciAqKTsKLWNvbnN0IGNoYXIgKmFwX29zX2Rzb19lcnJvcih2b2lkKTsKLQotI2VuZGlmCS8qICFBUEFDSEVfT1NfSCAqLwpkaWZmIC0tZ2l0IGEvb3MvYnMyMDAwLy5jdnNpZ25vcmUgYi9vcy9iczIwMDAvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjN2E3Yy4uMDAwMDAwMAotLS0gYS9vcy9iczIwMDAvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1ha2VmaWxlCmRpZmYgLS1naXQgYS9vcy9iczIwMDAvYnMybG9naW4uYyBiL29zL2JzMjAwMC9iczJsb2dpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmJmMDNmLi4wMDAwMDAwCi0tLSBhL29zL2JzMjAwMC9iczJsb2dpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotI2lmZGVmIF9PU0RfUE9TSVgKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+Ci0KLSNkZWZpbmUgQUNDVF9MRU4gOAotI2RlZmluZSBVU0VSX0xFTiA4Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpiczIwMDBfYWNjb3VudCA9IE5VTEw7Ci10eXBlZGVmIGVudW0KLXsKLSAgICBiczJfdW5rbm93biwgICAgIC8qIG5vdCBpbml0aWFsaXplZCB5ZXQuICovCi0gICAgYnMyX25vRk9SSywgICAgICAvKiBubyBmb3JrKCkgYmVjYXVzZSAtWCBmbGFnIHdhcyBzcGVjaWZpZWQgKi8KLSAgICBiczJfRk9SSywgICAgICAgIC8qIG9ubHkgZm9yaygpIGJlY2F1c2UgdWlkICE9IDAgKi8KLSAgICBiczJfRk9SS19SSU5JLCAgIC8qIHByaW9yIHRvIEExNywgcmVndWxhciBmb3JrKCkgYW5kIF9yaW5pKCkgd2FzIHVzZWQuICovCi0gICAgYnMyX1JGT1JLX1JJTkksICAvKiBmb3IgQTE3LCB1c2Ugb2YgX3Jmb3JrKCkgYW5kIF9yaW5pKCkgd2FzIHJlcXVpcmVkICovCi0gICAgYnMyX1VGT1JLICAgICAgICAvKiBBcyBvZiBBMTgsIHRoZSBuZXcgdWZvcmsoKSBpcyB1c2VkLiAqLwotfSBiczJfRm9ya1R5cGU7Ci0KLXN0YXRpYyBiczJfRm9ya1R5cGUgZm9ya3R5cGUgPSBiczJfdW5rbm93bjsKLQotCi1zdGF0aWMgdm9pZCBhcF9wYWQoY2hhciAqZGVzdCwgc2l6ZV90IHNpemUsIGNoYXIgY2gpCi17Ci0gICAgaW50IGkgPSBzdHJsZW4oZGVzdCk7IC8qIExlYXZlIHNwYWNlIGZvciB0cmFpbGluZyAnXDAnICovCi0gICAgCi0gICAgd2hpbGUgKGkgPCBzaXplLTEpCi0JZGVzdFtpKytdID0gY2g7Ci0KLSAgICBkZXN0W3NpemUtMV0gPSAnXDAnOwkvKiBHdWFyYW50ZWUgZm9yIHRyYWlsaW5nICdcMCcgKi8KLX0KLQotc3RhdGljIHZvaWQgYXBfc3RyX3RvdXBwZXIoY2hhciAqc3RyKQotewotICAgIHdoaWxlICgqc3RyKSB7Ci0JKnN0ciA9IGFwX3RvdXBwZXIoKnN0cik7Ci0JKytzdHI7Ci0gICAgfQotfQotCi0vKiBEZXRlcm1pbmUgdGhlIG1ldGhvZCBmb3IgZm9ya2luZyBvZmYgYSBjaGlsZCBpbiBzdWNoIGEgd2F5IGFzIHRvCi0gKiBzZXQgYm90aCB0aGUgUE9TSVggYW5kIEJTMjAwMCB1c2VyIGlkJ3MgdG8gdGhlIHVucHJpdmlsZWdlZCB1c2VyLgotICovCi1zdGF0aWMgYnMyX0ZvcmtUeXBlIG9zX2Zvcmt0eXBlKHZvaWQpCi17Ci0gICAgc3RydWN0IHV0c25hbWUgb3NfdmVyc2lvbjsKLQotICAgIC8qIGhhdmUgd2UgY2hlY2tlZCB0aGUgT1MgdmVyc2lvbiBiZWZvcmU/IElmIHllcyByZXR1cm4gdGhlIHByZXZpb3VzCi0gICAgICogcmVzdWx0IC0gdGhlIE9TIHJlbGVhc2UgaXNuJ3QgZ29pbmcgdG8gY2hhbmdlIHN1ZGRlbmx5IQotICAgICAqLwotICAgIGlmIChmb3JrdHlwZSAhPSBiczJfdW5rbm93bikgewotCXJldHVybiBmb3JrdHlwZTsKLSAgICB9Ci0KLSAgICAvKiBJZiB0aGUgdXNlciBpcyB1bnByaXZpbGVnZWQsIHVzZSB0aGUgbm9ybWFsIGZvcmsoKSBvbmx5LiAqLwotICAgIGlmIChnZXR1aWQoKSAhPSAwKSB7Ci0JcmV0dXJuIGZvcmt0eXBlID0gYnMyX0ZPUks7Ci0gICAgfQotCi0gICAgaWYgKHVuYW1lKCZvc192ZXJzaW9uKSA8IDApCi0gICAgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgTlVMTCwKLQkJICAgICAidW5hbWUoKSBmYWlsZWQgLSBhYm9ydGluZy4iKTsKLQlleGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE9sZCBCUzIwMDAvT1NEIHZlcnNpb25zIChiZWZvcmUgWFBHNCBTUEVDMTE3MCkgZG9uJ3Qgd29yayB3aXRoIEFwYWNoZS4KLSAgICAgKiBBbnl3YXksIHNpbXBseSByZXR1cm4gYSBmb3JrKCkuCi0gICAgICovCi0gICAgaWYgKHN0cmNtcChvc192ZXJzaW9uLnJlbGVhc2UsICIwMS4wQSIpID09IDAgfHwKLQlzdHJjbXAob3NfdmVyc2lvbi5yZWxlYXNlLCAiMDIuMEEiKSA9PSAwIHx8Ci0Jc3RyY21wKG9zX3ZlcnNpb24ucmVsZWFzZSwgIjAyLjFBIikgPT0gMCkKLSAgICB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUnxBUExPR19OT0VSUk5PLCBOVUxMLAotCQkgICAgICJFcnJvcjogdW5zdXBwb3J0ZWQgT1MgdmVyc2lvbi4gIgotCQkgICAgICJZb3UgbWF5IGVuY291bnRlciBwcm9ibGVtcy4iKTsKLQlmb3JrdHlwZSA9IGJzMl9GT1JLOwotICAgIH0KLQotICAgIC8qIFRoZSBmb2xsb3dpbmcgdmVyc2lvbnMgYXJlIHNwZWNpYWw6Ci0gICAgICogT1MgdmVyc2lvbnMgYmVmb3JlIEExNyBuZWVkcyByZWd1bGFyIGZvcmsoKSBhbmQgX3JpbmkoKS4KLSAgICAgKiBBMTcgcmVxdWlyZXMgX3Jmb3JrKCkgYW5kIF9yaW5pKCksCi0gICAgICogYW5kIGxhdGVyIHZlcnNpb25zIG5lZWQgdWZvcmsoKS4KLSAgICAgKi8KLSAgICBlbHNlIGlmIChzdHJjbXAob3NfdmVyc2lvbi5yZWxlYXNlLCAiMDEuMUEiKSA9PSAwIHx8Ci0JICAgICBzdHJjbXAob3NfdmVyc2lvbi5yZWxlYXNlLCAiMDMuMEEiKSA9PSAwIHx8Ci0JICAgICBzdHJjbXAob3NfdmVyc2lvbi5yZWxlYXNlLCAiMDMuMUEiKSA9PSAwIHx8Ci0JICAgICBzdHJjbXAob3NfdmVyc2lvbi5yZWxlYXNlLCAiMDQuMEEiKSA9PSAwKQotICAgIHsKLSAgICAgICAgaWYgKHN0cmNtcCAob3NfdmVyc2lvbi52ZXJzaW9uLCAiQTE4IikgPj0gMCkKLSAgICAgICAgICAgIGZvcmt0eXBlID0gYnMyX1VGT1JLOwotCi0JZWxzZSBpZiAoc3RyY21wIChvc192ZXJzaW9uLnZlcnNpb24sICJBMTciKSA8IDApCi0gICAgICAgICAgICBmb3JrdHlwZSA9IGJzMl9GT1JLX1JJTkk7Ci0KLQllbHNlCi0JICAgIGZvcmt0eXBlID0gYnMyX1JGT1JLX1JJTkk7Ci0gICAgfQotCi0gICAgLyogQWxsIGxhdGVyIE9TIHZlcnNpb25zIHdpbGwgaG9wZWZ1bGx5IHVzZSB1Zm9yaygpIG9ubHkgIDstKSAqLwotICAgIGVsc2UKLSAgICAgICAgZm9ya3R5cGUgPSBiczJfVUZPUks7Ci0KLSAgICByZXR1cm4gZm9ya3R5cGU7Ci19Ci0KLQotCi0vKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IGh0dHBfY29yZSBmb3IgdGhlIEJTMjAwMEFjY291bnQgZGlyZWN0aXZlICovCi0vKiBJdCBzdG9yZXMgdGhlIGFjY291bnQgbmFtZSBmb3IgbGF0ZXIgdXNlICovCi1jb25zdCBjaGFyICpvc19zZXRfYWNjb3VudChhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKmFjY291bnQpCi17Ci0gICAgY2hhciBhY2NvdW50X3RlbXBbQUNDVF9MRU4rMV07Ci0KLSAgICBhcF9jcHlzdHJuKGFjY291bnRfdGVtcCwgYWNjb3VudCwgc2l6ZW9mIGFjY291bnRfdGVtcCk7Ci0KLSAgICAvKiBNYWtlIGFjY291bnQgYWxsIHVwcGVyIGNhc2UgKi8KLSAgICBhcF9zdHJfdG91cHBlcihhY2NvdW50X3RlbXApOwotCi0gICAgLyogUGFkIHRvIGxlbmd0aCA4ICovCi0gICAgYXBfcGFkKGFjY291bnRfdGVtcCwgc2l6ZW9mIGFjY291bnRfdGVtcCwgJyAnKTsKLQotICAgIGJzMjAwMF9hY2NvdW50ID0gYXBfcHN0cmR1cChwLCBhY2NvdW50X3RlbXApOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKiBUaGlzIHJvdXRpbmUgY29tcGxlbWVudHMgdGhlIHNldHVpZCgpIGNhbGw6IGl0IGNhdXNlcyB0aGUgQlMyMDAwIGpvYgotICogZW52aXJvbm1lbnQgdG8gYmUgc3dpdGNoZWQgdG8gdGhlIHRhcmdldCB1c2VyJ3MgdXNlciBpZC4KLSAqIFRoYXQgaXMgaW1wb3J0YW50IGlmIENHSSBzY3JpcHRzIHRyeSB0byBleGVjdXRlIG5hdGl2ZSBCUzIwMDAgY29tbWFuZHMuCi0gKi8KLWludCBvc19pbml0X2pvYl9lbnZpcm9ubWVudChzZXJ2ZXJfcmVjICpzZXJ2ZXIsIGNvbnN0IGNoYXIgKnVzZXJfbmFtZSwgaW50IG9uZV9wcm9jZXNzKQotewotICAgIF9yaW5pX3N0cnVjdCAgICAgICAgICAgIGluaXR0YXNrOyAKLSAgICBjaGFyICAgICAgICAgICAgICAgICAgICB1c2VybmFtZVtVU0VSX0xFTisxXTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBzYXZlX2Vycm5vOwotICAgIGJzMl9Gb3JrVHlwZSAgICAgICAgICAgIHR5cGUgPSBvc19mb3JrdHlwZSgpOwotCi0gICAgLyogV2UgY2FuIGJlIHN1cmUgdGhhdCBubyBjaGFuZ2UgdG8gdWlkPT0wIGlzIHBvc3NpYmxlIGJlY2F1c2Ugb2YKLSAgICAgKiB0aGUgY2hlY2tzIGluIGh0dHBfY29yZS5jOnNldF91c2VyKCkKLSAgICAgKi8KLQotICAgIC8qIFRoZSBfcmluaSgpIGZ1bmN0aW9uIHdvcmtzIG9ubHkgYWZ0ZXIgYSBwcmlvciBfcmZvcmsoKS4KLSAgICAgKiBJbiB0aGUgY2FzZSBvZiBvbmVfcHJvY2VzcywgaXQgd291bGQgZmFpbC4KLSAgICAgKi8KLSAgICBpZiAob25lX3Byb2Nlc3MpIHsKLQotCXR5cGUgPSBmb3JrdHlwZSA9IGJzMl9ub0ZPUks7Ci0KLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSfEFQTE9HX05PRVJSTk8sIHNlcnZlciwKLQkJICAgICAiVGhlIGRlYnVnIG1vZGUgb2YgQXBhY2hlIHNob3VsZCBvbmx5ICIKLQkJICAgICAiYmUgc3RhcnRlZCBieSBhbiB1bnByaXZpbGVnZWQgdXNlciEiKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBJZiBubyBfcmluaSgpIGlzIHJlcXVpcmVkLCB0aGVuIHJldHVybiBxdWlja2x5LiAqLwotICAgIGlmICh0eXBlICE9IGJzMl9SRk9SS19SSU5JICYmIHR5cGUgIT0gYnMyX0ZPUktfUklOSSkKLQlyZXR1cm4gMDsKLQotICAgIC8qIEFuIEFjY291bnQgaXMgcmVxdWlyZWQgZm9yIF9yaW5pKCkgKi8KLSAgICBpZiAoYnMyMDAwX2FjY291bnQgPT0gTlVMTCkKLSAgICB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJUfEFQTE9HX05PRVJSTk8sIHNlcnZlciwKLQkJICAgICAiTm8gQlMyMDAwQWNjb3VudCBjb25maWd1cmVkIC0gY2Fubm90IHN3aXRjaCB0byBVc2VyICVzIiwKLQkJICAgICB1c2VyX25hbWUpOwotCWV4aXQoQVBFWElUX0NISUxERkFUQUwpOwotICAgIH0KLQotICAgIGFwX2NweXN0cm4odXNlcm5hbWUsIHVzZXJfbmFtZSwgc2l6ZW9mIHVzZXJuYW1lKTsKLQotICAgIC8qIE1ha2UgdXNlciBuYW1lIGFsbCB1cHBlciBjYXNlICovCi0gICAgYXBfc3RyX3RvdXBwZXIodXNlcm5hbWUpOwotCi0gICAgLyogUGFkIHRvIGxlbmd0aCA4ICovCi0gICAgYXBfcGFkKHVzZXJuYW1lLCBzaXplb2YgdXNlcm5hbWUsICcgJyk7Ci0KLSAgICBpbml0dGFzay51c2VybmFtZSAgICAgICA9IHVzZXJuYW1lOwotICAgIGluaXR0YXNrLmFjY291bnQgICAgICAgID0gYnMyMDAwX2FjY291bnQ7Ci0gICAgaW5pdHRhc2sucHJvY2Vzc29yX25hbWUgPSAiICAgICAgICAiOwotCi0gICAgLyogU3dpdGNoIHRvIHRoZSBuZXcgbG9nb24gdXNlciAoc2V0dWlkKCkgYW5kIHNldGdpZCgpIGFyZSBkb25lIGxhdGVyKSAqLwotICAgIC8qIE9ubHkgdGhlIHN1cGVyIHVzZXIgY2FuIHN3aXRjaCBpZGVudGl0aWVzLiAqLwotICAgIGlmIChfcmluaSgmaW5pdHRhc2spICE9IDApIHsKLQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgc2VydmVyLAotCQkgICAgICJfcmluaTogQlMyMDAwIGF1dGggZmFpbGVkIGZvciB1c2VyIFwiJXNcIiBhY2N0IFwiJXNcIiIsCi0JCSAgICAgaW5pdHRhc2sudXNlcm5hbWUsIGluaXR0YXNrLmFjY291bnQpOwotCi0JZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIEJTMjAwMCByZXF1aXJlcyBhICJzcGVjaWFsIiB2ZXJzaW9uIG9mIGZvcmsoKSBiZWZvcmUgYSBzZXR1aWQoKS9fcmluaSgpIGNhbGwgKi8KLXBpZF90IG9zX2ZvcmsoY29uc3QgY2hhciAqdXNlcikKLXsKLSAgICBwaWRfdCBwaWQ7Ci0gICAgY2hhciAgdXNlcm5hbWVbVVNFUl9MRU4rMV07Ci0KLSAgICBzd2l0Y2ggKG9zX2Zvcmt0eXBlKCkpIHsKLSAgICAgIGNhc2UgYnMyX0ZPUks6Ci0gICAgICBjYXNlIGJzMl9GT1JLX1JJTkk6Ci0JcGlkID0gZm9yaygpOwotCWJyZWFrOwotCi0gICAgICBjYXNlIGJzMl9SRk9SS19SSU5JOgotCXBpZCA9IF9yZm9yaygpOwotCWJyZWFrOwotCi0gICAgICBjYXNlIGJzMl9VRk9SSzoKLQlhcF9jcHlzdHJuKHVzZXJuYW1lLCB1c2VyLCBzaXplb2YgdXNlcm5hbWUpOwotCi0JLyogTWFrZSB1c2VyIG5hbWUgYWxsIHVwcGVyIGNhc2UgLSBmb3Igc29tZSB2ZXJzaW9ucyBvZiB1Zm9yaygpICovCi0JYXBfc3RyX3RvdXBwZXIodXNlcm5hbWUpOwotCi0JcGlkID0gdWZvcmsodXNlcm5hbWUpOwotCWlmIChwaWQgPT0gLTEgJiYgZXJybm8gPT0gRVBFUk0pIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLAotCQkJIE5VTEwsICJ1Zm9yazogUG9zc2libGUgbWlzLWNvbmZpZ3VyYXRpb24gIgotCQkJICJmb3IgdXNlciAlcyAtIEFib3J0aW5nLiIsIHVzZXIpOwotCSAgICBleGl0KDEpOwotCX0KLQlicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQlwaWQgPSAwOwotCWJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBwaWQ7Ci19Ci0KLSNlbHNlIC8qIF9PU0RfUE9TSVggKi8KLXZvaWQgYnMybG9naW5faXNfbm90X2hlcmUoKQotewotfQotI2VuZGlmIC8qIF9PU0RfUE9TSVggKi8KZGlmZiAtLWdpdCBhL29zL2JzMjAwMC9lYmNkaWMuYyBiL29zL2JzMjAwMC9lYmNkaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmM2NhNS4uMDAwMDAwMAotLS0gYS9vcy9iczIwMDAvZWJjZGljLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0KLSNpZmRlZiBDSEFSU0VUX0VCQ0RJQwotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImViY2RpYy5oIgotLyoKLQkgICBJbml0aWFsIFBvcnQgZm9yICBBcGFjaGUtMS4zIGJ5IDxNYXJ0aW4uS3JhZW1lckBNY2guU05JLkRlPgotCi0iQlMyMDAwIE9TRCIgaXMgYSBQT1NJWCBvbiBhIG1haW4gZnJhbWUuIEl0IGlzIG1hZGUgYnkgU2llbWVucyBBRywgR2VybWFueS4KLVdpdGhpbiB0aGUgUE9TSVggc3Vic3lzdGVtLCB0aGUgc2FtZSBjaGFyYWN0ZXIgc2V0IHdhcyBjaG9zZW4gYXMgaW4KLSJuYXRpdmUgQlMyMDAwIiwgbmFtZWx5IEVCQ0RJQy4KLQotRUJDRElDIFRhYmxlLiAoWWVzLCBpbiBFQkNESUMsIHRoZSBsZXR0ZXJzICdhJy4uJ3onIGFyZSBub3QgY29udGlndW91cyEpCi1UaGlzIGFwX3RhYmxlX3QgaXMgYmlqZWN0aXZlLCBpLmUuIHRoZXJlIGFyZSBubyBhbWJpZ291cyBvciBkdXBsaWNhdGUgY2hhcmFjdGVycwotMDAgICAgMDAgMDEgMDIgMDMgODUgMDkgODYgN2YgIDg3IDhkIDhlIDBiIDBjIDBkIDBlIDBmICAqLi4uLi4uLi4uLi4uLi4uLioKLTEwICAgIDEwIDExIDEyIDEzIDhmIDBhIDA4IDk3ICAxOCAxOSA5YyA5ZCAxYyAxZCAxZSAxZiAgKi4uLi4uLi4uLi4uLi4uLi4qCi0yMCAgICA4MCA4MSA4MiA4MyA4NCA5MiAxNyAxYiAgODggODkgOGEgOGIgOGMgMDUgMDYgMDcgICouLi4uLi4uLi4uLi4uLi4uKgotMzAgICAgOTAgOTEgMTYgOTMgOTQgOTUgOTYgMDQgIDk4IDk5IDlhIDliIDE0IDE1IDllIDFhICAqLi4uLi4uLi4uLi4uLi4uLioKLTQwICAgIDIwIGEwIGUyIGU0IGUwIGUxIGUzIGU1ICBlNyBmMSA2MCAyZSAzYyAyOCAyYiA3YyAgKiAuLi4uLi4uLi5gLjwoK3wqCi01MCAgICAyNiBlOSBlYSBlYiBlOCBlZCBlZSBlZiAgZWMgZGYgMjEgMjQgMmEgMjkgM2IgOWYgIComLi4uLi4uLi4uISQqKTsuKgotNjAgICAgMmQgMmYgYzIgYzQgYzAgYzEgYzMgYzUgIGM3IGQxIDVlIDJjIDI1IDVmIDNlIDNmICAqLS8uLi4uLi4uLl4sJV8+PyoKLTcwICAgIGY4IGM5IGNhIGNiIGM4IGNkIGNlIGNmICBjYyBhOCAzYSAyMyA0MCAyNyAzZCAyMiAgKi4uLi4uLi4uLi46I0AnPSIqCi04MCAgICBkOCA2MSA2MiA2MyA2NCA2NSA2NiA2NyAgNjggNjkgYWIgYmIgZjAgZmQgZmUgYjEgICouYWJjZGVmZ2hpLi4uLi4uKgotOTAgICAgYjAgNmEgNmIgNmMgNmQgNmUgNmYgNzAgIDcxIDcyIGFhIGJhIGU2IGI4IGM2IGE0ICAqLmprbG1ub3Bxci4uLi4uLioKLWEwICAgIGI1IGFmIDczIDc0IDc1IDc2IDc3IDc4ICA3OSA3YSBhMSBiZiBkMCBkZCBkZSBhZSAgKi4uc3R1dnd4eXouLi4uLi4qCi1iMCAgICBhMiBhMyBhNSBiNyBhOSBhNyBiNiBiYyAgYmQgYmUgYWMgNWIgNWMgNWQgYjQgZDcgICouLi4uLi4uLi4uLltcXS4uKgotYzAgICAgZjkgNDEgNDIgNDMgNDQgNDUgNDYgNDcgIDQ4IDQ5IGFkIGY0IGY2IGYyIGYzIGY1ICAqLkFCQ0RFRkdISS4uLi4uLioKLWQwICAgIGE2IDRhIDRiIDRjIDRkIDRlIDRmIDUwICA1MSA1MiBiOSBmYiBmYyBkYiBmYSBmZiAgKi5KS0xNTk9QUVIuLi4uLi4qCi1lMCAgICBkOSBmNyA1MyA1NCA1NSA1NiA1NyA1OCAgNTkgNWEgYjIgZDQgZDYgZDIgZDMgZDUgICouLlNUVVZXWFlaLi4uLi4uKgotZjAgICAgMzAgMzEgMzIgMzMgMzQgMzUgMzYgMzcgIDM4IDM5IGIzIDdiIGRjIDdkIGRhIDdlICAqMDEyMzQ1Njc4OS57Ln0ufioKLSovCi0KLS8qIFRoZSBiaWplY3RpdmUgZWJjZGljLXRvLWFzY2lpIHRhYmxlOiAqLwotY29uc3QgdW5zaWduZWQgY2hhciBvc190b2FzY2lpX3N0cmljdGx5WzI1Nl0gPSB7Ci0vKjAwKi8gMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHg4NSwgMHgwOSwgMHg4NiwgMHg3ZiwKLSAgICAgICAweDg3LCAweDhkLCAweDhlLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKi4uLi4uLi4uLi4uLi4uLi4qLwotLyoxMCovIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4OGYsIDB4MGEsIDB4MDgsIDB4OTcsCi0gICAgICAgMHgxOCwgMHgxOSwgMHg5YywgMHg5ZCwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyouLi4uLi4uLi4uLi4uLi4uKi8KLS8qMjAqLyAweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDkyLCAweDE3LCAweDFiLAotICAgICAgIDB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4MDUsIDB4MDYsIDB4MDcsIC8qLi4uLi4uLi4uLi4uLi4uLiovCi0vKjMwKi8gMHg5MCwgMHg5MSwgMHgxNiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHgwNCwKLSAgICAgICAweDk4LCAweDk5LCAweDlhLCAweDliLCAweDE0LCAweDE1LCAweDllLCAweDFhLCAvKi4uLi4uLi4uLi4uLi4uLi4qLwotLyo0MCovIDB4MjAsIDB4YTAsIDB4ZTIsIDB4ZTQsIDB4ZTAsIDB4ZTEsIDB4ZTMsIDB4ZTUsCi0gICAgICAgMHhlNywgMHhmMSwgMHg2MCwgMHgyZSwgMHgzYywgMHgyOCwgMHgyYiwgMHg3YywgLyogLi4uLi4uLi4uYC48KCt8Ki8KLS8qNTAqLyAweDI2LCAweGU5LCAweGVhLCAweGViLCAweGU4LCAweGVkLCAweGVlLCAweGVmLAotICAgICAgIDB4ZWMsIDB4ZGYsIDB4MjEsIDB4MjQsIDB4MmEsIDB4MjksIDB4M2IsIDB4OWYsIC8qJi4uLi4uLi4uLiEkKik7LiovCi0vKjYwKi8gMHgyZCwgMHgyZiwgMHhjMiwgMHhjNCwgMHhjMCwgMHhjMSwgMHhjMywgMHhjNSwKLSAgICAgICAweGM3LCAweGQxLCAweDVlLCAweDJjLCAweDI1LCAweDVmLCAweDNlLCAweDNmLCAvKi0vLi4uLi4uLi5eLCVfPj8qLwotLyo3MCovIDB4ZjgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4YzgsIDB4Y2QsIDB4Y2UsIDB4Y2YsCi0gICAgICAgMHhjYywgMHhhOCwgMHgzYSwgMHgyMywgMHg0MCwgMHgyNywgMHgzZCwgMHgyMiwgLyouLi4uLi4uLi4uOiNAJz0iKi8KLS8qODAqLyAweGQ4LCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LAotICAgICAgIDB4NjgsIDB4NjksIDB4YWIsIDB4YmIsIDB4ZjAsIDB4ZmQsIDB4ZmUsIDB4YjEsIC8qLmFiY2RlZmdoaS4uLi4uLiovCi0vKjkwKi8gMHhiMCwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgMHg3MCwKLSAgICAgICAweDcxLCAweDcyLCAweGFhLCAweGJhLCAweGU2LCAweGI4LCAweGM2LCAweGE0LCAvKi5qa2xtbm9wcXIuLi4uLi4qLwotLyphMCovIDB4YjUsIDB4YWYsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsCi0gICAgICAgMHg3OSwgMHg3YSwgMHhhMSwgMHhiZiwgMHhkMCwgMHhkZCwgMHhkZSwgMHhhZSwgLyouLnN0dXZ3eHl6Li4uLi4uKi8KLS8qYjAqLyAweGEyLCAweGEzLCAweGE1LCAweGI3LCAweGE5LCAweGE3LCAweGI2LCAweGJjLAotICAgICAgIDB4YmQsIDB4YmUsIDB4YWMsIDB4NWIsIDB4NWMsIDB4NWQsIDB4YjQsIDB4ZDcsIC8qLi4uLi4uLi4uLi5bXF0uLiovCi0vKmMwKi8gMHhmOSwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywKLSAgICAgICAweDQ4LCAweDQ5LCAweGFkLCAweGY0LCAweGY2LCAweGYyLCAweGYzLCAweGY1LCAvKi5BQkNERUZHSEkuLi4uLi4qLwotLypkMCovIDB4YTYsIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIDB4NTAsCi0gICAgICAgMHg1MSwgMHg1MiwgMHhiOSwgMHhmYiwgMHhmYywgMHhkYiwgMHhmYSwgMHhmZiwgLyouSktMTU5PUFFSLi4uLi4uKi8KLS8qZTAqLyAweGQ5LCAweGY3LCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LAotICAgICAgIDB4NTksIDB4NWEsIDB4YjIsIDB4ZDQsIDB4ZDYsIDB4ZDIsIDB4ZDMsIDB4ZDUsIC8qLi5TVFVWV1hZWi4uLi4uLiovCi0vKmYwKi8gMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywKLSAgICAgICAweDM4LCAweDM5LCAweGIzLCAweDdiLCAweGRjLCAweDdkLCAweGRhLCAweDdlICAvKjAxMjM0NTY3ODkuey59Ln4qLwotfTsKLQotLyogVGhpcyBhcF90YWJsZV90IGlzIChhbG1vc3QpIGlkZW50aWNhbCB0byB0aGUgcHJldmlvdXMgb25lLiBUaGUgb25seSBkaWZmZXJlbmNlCi0gKiBpcyB0aGUgZmFjdCB0aGF0IGl0IG1hcHMgZXZlcnkgRUJDRElDICpleGNlcHQgMHgwQSogdG8gaXRzIEFTQ0lJCi0gKiBlcXVpdmFsZW50LiBUaGUgcmVhc29uIGZvciB0aGlzIGFwX3RhYmxlX3QgaXMgc2ltcGxlOiBUaHJvdWdob3V0IHRoZQotICogc2VydmVyLCBwcm90b2NvbCBzdHJpbmdzIGFyZSB1c2VkIGluIHRoZSBmb3JtCi0gKiAgIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpblwwMTVcMDEyIi4gTm93IGFsbCB0aGUgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nCi0gKiBhcmUgc3RvcmVkIGFzIEVCQ0RJQywgb25seSB0aGUgc2VtYW50aWNzIG9mIFwwMTIgaXMgY29tcGxldGVseQotICogZGlmZmVyZW50IGZyb20gTEYgKGxvb2sgaXQgdXAgaW4gdGhlIGFwX3RhYmxlX3QgYWJvdmUpLiBcMDE1IGhhcHBlbnMgdG8gYmUKLSAqIG1hcHBlZCB0byBcMDE1IGFueXdheSwgc28gdGhlcmUncyBubyBzcGVjaWFsIGNhc2UgZm9yIGl0LgotICogCi0gKiBJbiBUSElTIHRhYmxlLCBFQkNESUMtXDAxMiBpcyBtYXBwZWQgdG8gQVNDSUktXDAxMi4KLSAqIFRoaXMgYXBfdGFibGVfdCBpcyB0aGVyZWZvcmUgdXNlZCB3aGVyZXZlciBhbiBFQkNESUMgdG8gQVNDSUkgY29udmVyc2lvbiBpcwotICogbmVlZGVkIGluIHRoZSBzZXJ2ZXIuCi0gKi8KLS8qIGViY2RpYy10by1hc2NpaSB3aXRoIFwwMTIgbWFwcGVkIHRvIEFTQ0lJLVxuICovCi1jb25zdCB1bnNpZ25lZCBjaGFyIG9zX3RvYXNjaWlbMjU2XSA9IHsKLS8qMDAqLyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDg1LCAweDA5LCAweDg2LCAweDdmLAotICAgICAgIDB4ODcsIDB4OGQsIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qLi4uLi4uLi4uLi4uLi4uLiovCi0vKjEwKi8gMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHg4ZiwgMHgwYSwgMHgwOCwgMHg5NywKLSAgICAgICAweDE4LCAweDE5LCAweDljLCAweDlkLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKi4uLi4uLi4uLi4uLi4uLi4qLwotLyoyMCovIDB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4OTIsIDB4MTcsIDB4MWIsCi0gICAgICAgMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHgwNSwgMHgwNiwgMHgwNywgLyouLi4uLi4uLi4uLi4uLi4uKi8KLS8qMzAqLyAweDkwLCAweDkxLCAweDE2LCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDA0LAotICAgICAgIDB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4MTQsIDB4MTUsIDB4OWUsIDB4MWEsIC8qLi4uLi4uLi4uLi4uLi4uLiovCi0vKjQwKi8gMHgyMCwgMHhhMCwgMHhlMiwgMHhlNCwgMHhlMCwgMHhlMSwgMHhlMywgMHhlNSwKLSAgICAgICAweGU3LCAweGYxLCAweDYwLCAweDJlLCAweDNjLCAweDI4LCAweDJiLCAweDdjLCAvKiAuLi4uLi4uLi5gLjwoK3wqLwotLyo1MCovIDB4MjYsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZTgsIDB4ZWQsIDB4ZWUsIDB4ZWYsCi0gICAgICAgMHhlYywgMHhkZiwgMHgyMSwgMHgyNCwgMHgyYSwgMHgyOSwgMHgzYiwgMHg5ZiwgLyomLi4uLi4uLi4uISQqKTsuKi8KLS8qNjAqLyAweDJkLCAweDJmLCAweGMyLCAweGM0LCAweGMwLCAweGMxLCAweGMzLCAweGM1LAotICAgICAgIDB4YzcsIDB4ZDEsIDB4NWUsIDB4MmMsIDB4MjUsIDB4NWYsIDB4M2UsIDB4M2YsIC8qLS8uLi4uLi4uLl4sJV8+PyovCi0vKjcwKi8gMHhmOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjOCwgMHhjZCwgMHhjZSwgMHhjZiwKLSAgICAgICAweGNjLCAweGE4LCAweDNhLCAweDIzLCAweDQwLCAweDI3LCAweDNkLCAweDIyLCAvKi4uLi4uLi4uLi46I0AnPSIqLwotLyo4MCovIDB4ZDgsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsCi0gICAgICAgMHg2OCwgMHg2OSwgMHhhYiwgMHhiYiwgMHhmMCwgMHhmZCwgMHhmZSwgMHhiMSwgLyouYWJjZGVmZ2hpLi4uLi4uKi8KLS8qOTAqLyAweGIwLCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAweDcwLAotICAgICAgIDB4NzEsIDB4NzIsIDB4YWEsIDB4YmEsIDB4ZTYsIDB4YjgsIDB4YzYsIDB4YTQsIC8qLmprbG1ub3Bxci4uLi4uLiovCi0vKmEwKi8gMHhiNSwgMHhhZiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwKLSAgICAgICAweDc5LCAweDdhLCAweGExLCAweGJmLCAweGQwLCAweGRkLCAweGRlLCAweGFlLCAvKi4uc3R1dnd4eXouLi4uLi4qLwotLypiMCovIDB4YTIsIDB4YTMsIDB4YTUsIDB4YjcsIDB4YTksIDB4YTcsIDB4YjYsIDB4YmMsCi0gICAgICAgMHhiZCwgMHhiZSwgMHhhYywgMHg1YiwgMHg1YywgMHg1ZCwgMHhiNCwgMHhkNywgLyouLi4uLi4uLi4uLltcXS4uKi8KLS8qYzAqLyAweGY5LCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LAotICAgICAgIDB4NDgsIDB4NDksIDB4YWQsIDB4ZjQsIDB4ZjYsIDB4ZjIsIDB4ZjMsIDB4ZjUsIC8qLkFCQ0RFRkdISS4uLi4uLiovCi0vKmQwKi8gMHhhNiwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgMHg1MCwKLSAgICAgICAweDUxLCAweDUyLCAweGI5LCAweGZiLCAweGZjLCAweGRiLCAweGZhLCAweGZmLCAvKi5KS0xNTk9QUVIuLi4uLi4qLwotLyplMCovIDB4ZDksIDB4ZjcsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsCi0gICAgICAgMHg1OSwgMHg1YSwgMHhiMiwgMHhkNCwgMHhkNiwgMHhkMiwgMHhkMywgMHhkNSwgLyouLlNUVVZXWFlaLi4uLi4uKi8KLS8qZjAqLyAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LAotICAgICAgIDB4MzgsIDB4MzksIDB4YjMsIDB4N2IsIDB4ZGMsIDB4N2QsIDB4ZGEsIDB4N2UgIC8qMDEyMzQ1Njc4OS57Ln0ufiovCi19OwotCi0vKiBUaGUgYXNjaWktdG8tZWJjZGljIHRhYmxlOgotMDAgICAgMDAgMDEgMDIgMDMgMzcgMmQgMmUgMmYgIDE2IDA1IDE1IDBiIDBjIDBkIDBlIDBmICAqLi4uLi4uLi4uLi4uLi4uLioKLTEwICAgIDEwIDExIDEyIDEzIDNjIDNkIDMyIDI2ICAxOCAxOSAzZiAyNyAxYyAxZCAxZSAxZiAgKi4uLi4uLi4uLi4uLi4uLi4qCi0yMCAgICA0MCA1YSA3ZiA3YiA1YiA2YyA1MCA3ZCAgNGQgNWQgNWMgNGUgNmIgNjAgNGIgNjEgICogISIjJCUmJygpKissLS4vCi0zMCAgICBmMCBmMSBmMiBmMyBmNCBmNSBmNiBmNyAgZjggZjkgN2EgNWUgNGMgN2UgNmUgNmYgICowMTIzNDU2Nzg5Ojs8PT4/KgotNDAgICAgN2MgYzEgYzIgYzMgYzQgYzUgYzYgYzcgIGM4IGM5IGQxIGQyIGQzIGQ0IGQ1IGQ2ICAqQEFCQ0RFRkdISUpLTE1OTyoKLTUwICAgIGQ3IGQ4IGQ5IGUyIGUzIGU0IGU1IGU2ICBlNyBlOCBlOSBiYiBiYyBiZCA2YSA2ZCAgKlBRUlNUVVZXWFlaW1xdXl8qCi02MCAgICA0YSA4MSA4MiA4MyA4NCA4NSA4NiA4NyAgODggODkgOTEgOTIgOTMgOTQgOTUgOTYgICpgYWJjZGVmZ2hpamtsbW5vKgotNzAgICAgOTcgOTggOTkgYTIgYTMgYTQgYTUgYTYgIGE3IGE4IGE5IGZiIDRmIGZkIGZmIDA3ICAqcHFyc3R1dnd4eXp7fH1+LioKLTgwICAgIDIwIDIxIDIyIDIzIDI0IDA0IDA2IDA4ICAyOCAyOSAyYSAyYiAyYyAwOSAwYSAxNCAgKi4uLi4uLi4uLi4uLi4uLi4qCi05MCAgICAzMCAzMSAyNSAzMyAzNCAzNSAzNiAxNyAgMzggMzkgM2EgM2IgMWEgMWIgM2UgNWYgICouLi4uLi4uLi4uLi4uLi4uKgotYTAgICAgNDEgYWEgYjAgYjEgOWYgYjIgZDAgYjUgIDc5IGI0IDlhIDhhIGJhIGNhIGFmIGExICAqLi4uLi4uLi4uLi4uLi4uLioKLWIwICAgIDkwIDhmIGVhIGZhIGJlIGEwIGI2IGIzICA5ZCBkYSA5YiA4YiBiNyBiOCBiOSBhYiAgKi4uLi4uLi4uLi4uLi4uLi4qCi1jMCAgICA2NCA2NSA2MiA2NiA2MyA2NyA5ZSA2OCAgNzQgNzEgNzIgNzMgNzggNzUgNzYgNzcgICouLi4uLi4uLi4uLi4uLi4uKgotZDAgICAgYWMgNjkgZWQgZWUgZWIgZWYgZWMgYmYgIDgwIGUwIGZlIGRkIGZjIGFkIGFlIDU5ICAqLi4uLi4uLi4uLi4uLi4uLioKLWUwICAgIDQ0IDQ1IDQyIDQ2IDQzIDQ3IDljIDQ4ICA1NCA1MSA1MiA1MyA1OCA1NSA1NiA1NyAgKi4uLi4uLi4uLi4uLi4uLi4qCi1mMCAgICA4YyA0OSBjZCBjZSBjYiBjZiBjYyBlMSAgNzAgYzAgZGUgZGIgZGMgOGQgOGUgZGYgICouLi4uLi4uLi4uLi4uLi4uKgotKi8KLWNvbnN0IHVuc2lnbmVkIGNoYXIgb3NfdG9lYmNkaWNbMjU2XSA9IHsKLS8qMDAqLyAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgzNywgMHgyZCwgMHgyZSwgMHgyZiwKLQkweDE2LCAweDA1LCAweDE1LCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAgLyouLi4uLi4uLi4uLi4uLi4uKi8KLS8qMTAqLyAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgzYywgMHgzZCwgMHgzMiwgMHgyNiwKLQkweDE4LCAweDE5LCAweDNmLCAweDI3LCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAgLyouLi4uLi4uLi4uLi4uLi4uKi8KLS8qMjAqLyAgMHg0MCwgMHg1YSwgMHg3ZiwgMHg3YiwgMHg1YiwgMHg2YywgMHg1MCwgMHg3ZCwKLQkweDRkLCAweDVkLCAweDVjLCAweDRlLCAweDZiLCAweDYwLCAweDRiLCAweDYxLCAgLyogISIjJCUmJygpKissLS4vICovCi0vKjMwKi8gIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsCi0JMHhmOCwgMHhmOSwgMHg3YSwgMHg1ZSwgMHg0YywgMHg3ZSwgMHg2ZSwgMHg2ZiwgIC8qMDEyMzQ1Njc4OTo7PD0+PyovCi0vKjQwKi8gIDB4N2MsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsCi0JMHhjOCwgMHhjOSwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgIC8qQEFCQ0RFRkdISUpLTE1OTyovCi0vKjUwKi8gIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsCi0JMHhlNywgMHhlOCwgMHhlOSwgMHhiYiwgMHhiYywgMHhiZCwgMHg2YSwgMHg2ZCwgIC8qUFFSU1RVVldYWVpbXF1eXyovCi0vKjYwKi8gIDB4NGEsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsCi0JMHg4OCwgMHg4OSwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgIC8qYGFiY2RlZmdoaWprbG1ubyovCi0vKjcwKi8gIDB4OTcsIDB4OTgsIDB4OTksIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsCi0JMHhhNywgMHhhOCwgMHhhOSwgMHhmYiwgMHg0ZiwgMHhmZCwgMHhmZiwgMHgwNywgIC8qcHFyc3R1dnd4eXp7fH1+LiovCi0vKjgwKi8gIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MDQsIDB4MDYsIDB4MDgsCi0JMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgwOSwgMHgwYSwgMHgxNCwgIC8qLi4uLi4uLi4uLi4uLi4uLiovCi0vKjkwKi8gIDB4MzAsIDB4MzEsIDB4MjUsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MTcsCi0JMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgxYSwgMHgxYiwgMHgzZSwgMHg1ZiwgIC8qLi4uLi4uLi4uLi4uLi4uLiovCi0vKmEwKi8gIDB4NDEsIDB4YWEsIDB4YjAsIDB4YjEsIDB4OWYsIDB4YjIsIDB4ZDAsIDB4YjUsCi0JMHg3OSwgMHhiNCwgMHg5YSwgMHg4YSwgMHhiYSwgMHhjYSwgMHhhZiwgMHhhMSwgIC8qLi4uLi4uLi4uLi4uLi4uLiovCi0vKmIwKi8gIDB4OTAsIDB4OGYsIDB4ZWEsIDB4ZmEsIDB4YmUsIDB4YTAsIDB4YjYsIDB4YjMsCi0JMHg5ZCwgMHhkYSwgMHg5YiwgMHg4YiwgMHhiNywgMHhiOCwgMHhiOSwgMHhhYiwgIC8qLi4uLi4uLi4uLi4uLi4uLiovCi0vKmMwKi8gIDB4NjQsIDB4NjUsIDB4NjIsIDB4NjYsIDB4NjMsIDB4NjcsIDB4OWUsIDB4NjgsCi0JMHg3NCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3OCwgMHg3NSwgMHg3NiwgMHg3NywgIC8qLi4uLi4uLi4uLi4uLi4uLiovCi0vKmQwKi8gIDB4YWMsIDB4NjksIDB4ZWQsIDB4ZWUsIDB4ZWIsIDB4ZWYsIDB4ZWMsIDB4YmYsCi0JMHg4MCwgMHhlMCwgMHhmZSwgMHhkZCwgMHhmYywgMHhhZCwgMHhhZSwgMHg1OSwgIC8qLi4uLi4uLi4uLi4uLi4uLiovCi0vKmUwKi8gIDB4NDQsIDB4NDUsIDB4NDIsIDB4NDYsIDB4NDMsIDB4NDcsIDB4OWMsIDB4NDgsCi0JMHg1NCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1OCwgMHg1NSwgMHg1NiwgMHg1NywgIC8qLi4uLi4uLi4uLi4uLi4uLiovCi0vKmYwKi8gIDB4OGMsIDB4NDksIDB4Y2QsIDB4Y2UsIDB4Y2IsIDB4Y2YsIDB4Y2MsIDB4ZTEsCi0JMHg3MCwgMHhjMCwgMHhkZSwgMHhkYiwgMHhkYywgMHg4ZCwgMHg4ZSwgMHhkZiAgIC8qLi4uLi4uLi4uLi4uLi4uLiovCi19OwotCi0vKiBUcmFuc2xhdGUgYSBtZW1vcnkgYmxvY2sgZnJvbSBFQkNESUMgKGhvc3QgY2hhcnNldCkgdG8gQVNDSUkgKG5ldCBjaGFyc2V0KQotICogZGVzdCBhbmQgc3JjZSBtYXkgYmUgaWRlbnRpY2FsLCBvciBzZXBhcmF0ZSBtZW1vcnkgYmxvY2tzLCBidXQKLSAqIHNob3VsZCBub3Qgb3ZlcmxhcC4KLSAqLwotdm9pZAotZWJjZGljMmFzY2lpKHVuc2lnbmVkIGNoYXIgKmRlc3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY2UsIHNpemVfdCBjb3VudCkKLXsKLQl3aGlsZSAoY291bnQtLSAhPSAwKSB7Ci0JCSpkZXN0KysgPSBvc190b2FzY2lpWypzcmNlKytdOwotCX0KLX0KLXZvaWQKLWViY2RpYzJhc2NpaV9zdHJpY3RseSh1bnNpZ25lZCBjaGFyICpkZXN0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNlLCBzaXplX3QgY291bnQpCi17Ci0Jd2hpbGUgKGNvdW50LS0gIT0gMCkgewotCQkqZGVzdCsrID0gb3NfdG9hc2NpaV9zdHJpY3RseVsqc3JjZSsrXTsKLQl9Ci19Ci12b2lkCi1hc2NpaTJlYmNkaWModW5zaWduZWQgY2hhciAqZGVzdCwgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjZSwgc2l6ZV90IGNvdW50KQotewotCXdoaWxlIChjb3VudC0tICE9IDApIHsKLQkJKmRlc3QrKyA9IG9zX3RvZWJjZGljWypzcmNlKytdOwotCX0KLX0KLSNlbmRpZiAvKkNIQVJTRVRfRUJDRElDKi8KZGlmZiAtLWdpdCBhL29zL2JzMjAwMC9lYmNkaWMuaCBiL29zL2JzMjAwMC9lYmNkaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY3Zjk3OC4uMDAwMDAwMAotLS0gYS9vcy9iczIwMDAvZWJjZGljLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgb3NfdG9hc2NpaVsyNTZdOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgb3NfdG9lYmNkaWNbMjU2XTsKLXZvaWQgZWJjZGljMmFzY2lpKHVuc2lnbmVkIGNoYXIgKmRlc3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY2UsIHNpemVfdCBjb3VudCk7Ci12b2lkIGViY2RpYzJhc2NpaV9zdHJpY3RseSh1bnNpZ25lZCBjaGFyICpkZXN0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNlLCBzaXplX3QgY291bnQpOwotdm9pZCBhc2NpaTJlYmNkaWModW5zaWduZWQgY2hhciAqZGVzdCwgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjZSwgc2l6ZV90IGNvdW50KTsKLQpkaWZmIC0tZ2l0IGEvb3MvYnMyMDAwL29zLWlubGluZS5jIGIvb3MvYnMyMDAwL29zLWlubGluZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTg5MTdhLi4wMDAwMDAwCi0tLSBhL29zL2JzMjAwMC9vcy1pbmxpbmUuYworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIHdoaWNoIGNhbiBiZSBpbmxpbmVkIGlmIHRoZSBjb21waWxlcgotICogaGFzIGFuICJpbmxpbmUiIG1vZGlmaWVyLiBCZWNhdXNlIG9mIHRoaXMsIHRoaXMgZmlsZSBpcyBib3RoIGEKLSAqIGhlYWRlciBmaWxlIGFuZCBhIGNvbXBpbGFibGUgbW9kdWxlLgotICoKLSAqIE9ubHkgaW5saW5lYWJsZSBmdW5jdGlvbnMgc2hvdWxkIGJlIGRlZmluZWQgaW4gaGVyZS4gVGhleSBtdXN0IGFsbAotICogaW5jbHVkZSB0aGUgSU5MSU5FIG1vZGlmaWVyLiAKLSAqCi0gKiBJZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgaW5saW5lLCB0aGlzIGZpbGUgd2lsbCBiZSAjaW5jbHVkZWQgYXMgYQotICogaGVhZGVyIGZpbGUgZnJvbSBvcy5oIHRvIGNyZWF0ZSBhbGwgdGhlIGlubGluZSBmdW5jdGlvbgotICogZGVmaW5pdGlvbnMuIElOTElORSB3aWxsIGJlIGRlZmluZWQgdG8gd2hhdGV2ZXIgaXMgcmVxdWlyZWQgb24KLSAqIGZ1bmN0aW9uIGRlZmluaXRpb25zIHRvIG1ha2UgdGhlbSBpbmxpbmUgZGVjbGFyYXRpb25zLgotICoKLSAqIElmIHRoZSBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IGlubGluZSwgdGhpcyBmaWxlIHdpbGwgYmUgY29tcGlsZWQKLSAqIGFzIGEgbm9ybWFsIEMgZmlsZSBpbnRvIGxpYm9zLmEgKGFsb25nIHdpdGggb3MuYykuIEluIHRoaXMgY2FzZQotICogSU5MSU5FIHdpbGwgX25vdF8gYmUgc2V0IHNvIHdlIGNhbiB1c2UgdGhpcyB0byB0ZXN0IGlmIHdlIGFyZQotICogY29tcGlsaW5nIHRoaXMgc291cmNlIGZpbGUuICAKLSAqLwotCi0jaWZuZGVmIElOTElORQotI2RlZmluZSBJTkxJTkUKLQotLyogQW55dGhpbmcgcmVxdWlyZWQgb25seSB3aGVuIGNvbXBpbGluZyAqLwotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotCi0jZW5kaWYKLQotSU5MSU5FIGludCBhcF9vc19pc19wYXRoX2Fic29sdXRlKGNvbnN0IGNoYXIgKmZpbGUpCi17Ci0gIHJldHVybiAoZmlsZSAmJiBmaWxlWzBdID09ICcvJyA/IDEgOiAwKTsKLX0KZGlmZiAtLWdpdCBhL29zL2JzMjAwMC9vcy5jIGIvb3MvYnMyMDAwL29zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMzgxMGEuLjAwMDAwMDAKLS0tIGEvb3MvYnMyMDAwL29zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogVGhpcyBmaWxlIHdpbGwgaW5jbHVkZSBPUyBzcGVjaWZpYyBmdW5jdGlvbnMgd2hpY2ggYXJlIG5vdCBpbmxpbmVhYmxlLgotICogQW55IGlubGluZWFibGUgZnVuY3Rpb25zIHNob3VsZCBiZSBkZWZpbmVkIGluIG9zLWlubGluZS5jIGluc3RlYWQuCi0gKi8KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAib3MuaCIKLQotLyogQ2hlY2sgdGhlIENvbnRlbnQtVHlwZSB0byBkZWNpZGUgaWYgY29udmVyc2lvbiBpcyBuZWVkZWQgKi8KLWludCBhcF9jaGVja2NvbnYoc3RydWN0IHJlcXVlc3RfcmVjICpyKQotewotICAgIGludCBjb252ZXJ0X3RvX2FzY2lpOwotICAgIGNvbnN0IGNoYXIgKnR5cGU7Ci0KLSAgICAvKiBUbyBtYWtlIHNlcnZpbmcgb2YgInJhdyBBU0NJSSB0ZXh0IiBmaWxlcyBlYXN5ICh0aGV5IHNlcnZlIGZhc3RlciAKLSAgICAgKiBzaW5jZSB0aGV5IGRvbid0IGhhdmUgdG8gYmUgY29udmVydGVkIGZyb20gRUJDRElDKSwgYSBuZXcKLSAgICAgKiAibWFnaWMiIHR5cGUgcHJlZml4IHdhcyBpbnZlbnRlZDogdGV4dC94LWFzY2lpLXtwbGFpbixodG1sLC4uLn0KLSAgICAgKiBJZiB3ZSBkZXRlY3Qgb25lIG9mIHRoZXNlIGNvbnRlbnQgdHlwZXMgaGVyZSwgd2Ugc2ltcGx5IGNvcnJlY3QKLSAgICAgKiB0aGUgdHlwZSB0byB0aGUgcmVhbCB0ZXh0L3twbGFpbixodG1sLC4uLn0gdHlwZS4gT3RoZXJ3aXNlLCB3ZQotICAgICAqIHNldCBhIGZsYWcgdGhhdCB0cmFuc2xhdGlvbiBpcyByZXF1aXJlZCBsYXRlciBvbi4KLSAgICAgKi8KLQotICAgIHR5cGUgPSAoci0+Y29udGVudF90eXBlID09IE5VTEwpID8gYXBfZGVmYXVsdF90eXBlKHIpIDogci0+Y29udGVudF90eXBlOwotCi0gICAgLyogSWYgbm8gY29udGVudCB0eXBlIGlzIHNldCB0aGVuIHRyZWF0IGl0IGFzIChlYmNkaWMpIHRleHQvcGxhaW4gKi8KLSAgICBjb252ZXJ0X3RvX2FzY2lpID0gKHR5cGUgPT0gTlVMTCk7Ci0KLSAgICAvKiBDb252ZXJzaW9uIGlzIGFwcGxpZWQgdG8gdGV4dC8gZmlsZXMgb25seSwgaWYgZXZlci4gKi8KLSAgICBpZiAodHlwZSAmJiAoc3RybmNhc2VjbXAodHlwZSwgInRleHQvIiwgNSkgPT0gMCB8fAotCQkgc3RybmNhc2VjbXAodHlwZSwgIm1lc3NhZ2UvIiwgOCkgPT0gMCkpIHsKLQlpZiAoc3RybmNhc2VjbXAodHlwZSwgQVNDSUlURVhUX01BR0lDX1RZUEVfUFJFRklYLAotCQkJc2l6ZW9mKEFTQ0lJVEVYVF9NQUdJQ19UWVBFX1BSRUZJWCktMSkgPT0gMCkKLQkgICAgci0+Y29udGVudF90eXBlID0gYXBfcHN0cmNhdChyLT5wb29sLCAidGV4dC8iLAotCQkJCQkgdHlwZStzaXplb2YoQVNDSUlURVhUX01BR0lDX1RZUEVfUFJFRklYKS0xLAotCQkJCQkgTlVMTCk7Ci0gICAgICAgIGVsc2UKLQkgICAgLyogdHJhbnNsYXRlIEVCQ0RJQyB0byBBU0NJSSAqLwotCSAgICBjb252ZXJ0X3RvX2FzY2lpID0gMTsKLSAgICB9Ci0gICAgLyogRW5hYmxlIGNvbnZlcnNpb24gaWYgaXQncyBhIHRleHQgZG9jdW1lbnQgKi8KLSAgICBhcF9ic2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfRUJDRElDMkFTQ0lJLCBjb252ZXJ0X3RvX2FzY2lpKTsKLQotICAgIHJldHVybiBjb252ZXJ0X3RvX2FzY2lpOwotfQotCmRpZmYgLS1naXQgYS9vcy9iczIwMDAvb3MuaCBiL29zL2JzMjAwMC9vcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWRlMDgxLi4wMDAwMDAwCi0tLSBhL29zL2JzMjAwMC9vcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotI2lmbmRlZiBBUEFDSEVfT1NfSAotI2RlZmluZSBBUEFDSEVfT1NfSAotCi0jZGVmaW5lIFBMQVRGT1JNICJCUzIwMDAiCi0KLS8qCi0gKiBUaGlzIGZpbGUgaW4gaW5jbHVkZWQgaW4gYWxsIEFwYWNoZSBzb3VyY2UgY29kZS4gSXQgY29udGFpbnMgZGVmaW5pdGlvbnMKLSAqIG9mIGZhY2lsaXRpZXMgYXZhaWxhYmxlIG9uIF90aGlzXyBvcGVyYXRpbmcgc3lzdGVtIChIQVZFXyogbWFjcm9zKSwKLSAqIGFuZCBwcm90b3R5cGVzIG9mIE9TIHNwZWNpZmljIGZ1bmN0aW9ucyBkZWZpbmVkIGluIG9zLmMgb3Igb3MtaW5saW5lLmMKLSAqLwotCi0jaWYgIWRlZmluZWQoSU5MSU5FKSAmJiBkZWZpbmVkKFVTRV9HTlVfSU5MSU5FKQotLyogQ29tcGlsZXIgc3VwcG9ydHMgaW5saW5lLCBzbyBpbmNsdWRlIHRoZSBpbmxpbmVhYmxlIGZ1bmN0aW9ucyBhcwotICogcGFydCBvZiB0aGUgaGVhZGVyCi0gKi8KLSNkZWZpbmUgSU5MSU5FIGV4dGVybiBhcF9pbmxpbmUKLQotSU5MSU5FIGludCBhcF9vc19pc19wYXRoX2Fic29sdXRlKGNvbnN0IGNoYXIgKmZpbGUpOwotCi0jaW5jbHVkZSAib3MtaW5saW5lLmMiCi0jZW5kaWYKLQotI2lmbmRlZiBJTkxJTkUKLS8qIENvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgaW5saW5lLCBzbyBwcm90b3R5cGUgdGhlIGlubGluZWFibGUgZnVuY3Rpb25zCi0gKiBhcyBub3JtYWwKLSAqLwotZXh0ZXJuIGludCBhcF9vc19pc19wYXRoX2Fic29sdXRlKGNvbnN0IGNoYXIgKmZpbGUpOwotI2VuZGlmCi0KLS8qIE90aGVyIGFwX29zXyByb3V0aW5lcyBub3QgdXNlZCBieSB0aGlzIHBsYXRmb3JtICovCi0KLSNkZWZpbmUgYXBfb3NfaXNfZmlsZW5hbWVfdmFsaWQoZikgICAgICAgICAgKDEpCi0jZGVmaW5lIGFwX29zX2tpbGwocGlkLCBzaWcpICAgICAgICAgICAgICAgIGtpbGwocGlkLCBzaWcpCi0KLSNpZiAhZGVmaW5lZChfUE9TSVhfU09VUkNFKSAmJiAhZGVmaW5lZChfWE9QRU5fU09VUkNFKQotdHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgCi0gICAgY2hhciAgICAqdXNlcm5hbWU7ICAgICAKLSAgICBjaGFyICAgICphY2NvdW50OyAgICAgIAotICAgIGNoYXIgICAgKnByb2Nlc3Nvcl9uYW1lOwotfSAgX3Jpbmlfc3RydWN0OyAgICAgICAgICAgCi0KLWV4dGVybiBpbnQgX3JpbmkoX3Jpbmlfc3RydWN0ICopOwotI2VuZGlmIC8qICFkZWZpbmVkKF9QT1NJWF9TT1VSQ0UpICYmICFkZWZpbmVkKF9YT1BFTl9TT1VSQ0UpICovCi0KLS8qIFNvcnJ5IGlmIHRoaXMgaXMgdWdseSwgYnV0IHRoZSBpbmNsdWRlIG9yZGVyIGRvZXNuJ3QgYWxsb3cgbWUKLSAqIHRvIHVzZSByZXF1ZXN0X3JlYyBoZXJlLi4uICovCi1zdHJ1Y3QgcmVxdWVzdF9yZWM7Ci1leHRlcm4gaW50IGFwX2NoZWNrY29udihzdHJ1Y3QgcmVxdWVzdF9yZWMgKnIpOwotZXh0ZXJuIHBpZF90IG9zX2ZvcmsoY29uc3QgY2hhciAqdXNlcik7Ci0KLSNlbmRpZiAvKiEgQVBBQ0hFX09TX0gqLwpkaWZmIC0tZ2l0IGEvb3MvY29uZmlnLm00IGIvb3MvY29uZmlnLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzI0ODZjLi4wMDAwMDAwCi0tLSBhL29zL2NvbmZpZy5tNAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLUFDX01TR19DSEVDS0lORyhmb3IgdGFyZ2V0IHBsYXRmb3JtKQotCi1QTEFURk9STT1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2AKLQotY2FzZSAiJFBMQVRGT1JNIiBpbgotKmJlb3MqKQotICBPUz0iYmVvcyI7OwotKnBjLW9zMl9lbXgqKQotICBPUz0ib3MyIjs7Ci0qKQotICBPUz0idW5peCI7OwotZXNhYwotCi1PU19ESVI9b3MvJE9TCi0KLUFDX01TR19SRVNVTFQoJE9TKQotQVBBQ0hFX0ZBU1RfT1VUUFVUKCRPU19ESVIvTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9vcy9vczIvLmN2c2lnbm9yZSBiL29zL29zMi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2M3YTdjLi4wMDAwMDAwCi0tLSBhL29zL29zMi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotTWFrZWZpbGUKZGlmZiAtLWdpdCBhL29zL29zMi9NYWtlZmlsZS5pbiBiL29zL29zMi9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzYWMzZi4uMDAwMDAwMAotLS0gYS9vcy9vczIvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0KLURFUFRIICAgICA9IC4uLy4uCi10b3BzcmNkaXIgPSBAdG9wc3JjZGlyQAotc3JjZGlyICAgID0gQHNyY2RpckAKLVZQQVRIICAgICA9IEBzcmNkaXJACi0KLUxUTElCUkFSWV9OQU1FICAgID0gbGlib3MubGEKLUxUTElCUkFSWV9TT1VSQ0VTID0gb3MuYyBvcy1pbmxpbmUuYyB1dGlsX29zMi5jIGlvbF9zb2NrZXQuYwotCi1pbmNsdWRlICQodG9wc3JjZGlyKS9idWlsZC9sdGxpYi5tawpkaWZmIC0tZ2l0IGEvb3Mvb3MyL2NvbmZpZy5tNCBiL29zL29zMi9jb25maWcubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YmFiMDIuLjAwMDAwMDAKLS0tIGEvb3Mvb3MyL2NvbmZpZy5tNAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotaWYgdGVzdCAiJE9TIiA9ICJvczIiIDsgdGhlbgotICBDRkxBR1M9IiRDRkxBR1MgLURPUzIgLU8yIgotICBMREZMQUdTPSIkTERGTEFHUyAtWmV4ZSIKLWZpCmRpZmYgLS1naXQgYS9vcy9vczIvb3MtaW5saW5lLmMgYi9vcy9vczIvb3MtaW5saW5lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZmY5ZjIuLjAwMDAwMDAKLS0tIGEvb3Mvb3MyL29zLWlubGluZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgd2hpY2ggY2FuIGJlIGlubGluZWQgaWYgdGhlIGNvbXBpbGVyCi0gKiBoYXMgYW4gImlubGluZSIgbW9kaWZpZXIuIEJlY2F1c2Ugb2YgdGhpcywgdGhpcyBmaWxlIGlzIGJvdGggYQotICogaGVhZGVyIGZpbGUgYW5kIGEgY29tcGlsYWJsZSBtb2R1bGUuCi0gKgotICogT25seSBpbmxpbmVhYmxlIGZ1bmN0aW9ucyBzaG91bGQgYmUgZGVmaW5lZCBpbiBoZXJlLiBUaGV5IG11c3QgYWxsCi0gKiBpbmNsdWRlIHRoZSBJTkxJTkUgbW9kaWZpZXIuIAotICoKLSAqIElmIHRoZSBjb21waWxlciBzdXBwb3J0cyBpbmxpbmUsIHRoaXMgZmlsZSB3aWxsIGJlICNpbmNsdWRlZCBhcyBhCi0gKiBoZWFkZXIgZmlsZSBmcm9tIG9zLmggdG8gY3JlYXRlIGFsbCB0aGUgaW5saW5lIGZ1bmN0aW9uCi0gKiBkZWZpbml0aW9ucy4gSU5MSU5FIHdpbGwgYmUgZGVmaW5lZCB0byB3aGF0ZXZlciBpcyByZXF1aXJlZCBvbgotICogZnVuY3Rpb24gZGVmaW5pdGlvbnMgdG8gbWFrZSB0aGVtIGlubGluZSBkZWNsYXJhdGlvbnMuCi0gKgotICogSWYgdGhlIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgaW5saW5lLCB0aGlzIGZpbGUgd2lsbCBiZSBjb21waWxlZAotICogYXMgYSBub3JtYWwgQyBmaWxlIGludG8gbGlib3MuYSAoYWxvbmcgd2l0aCBvcy5jKS4gSW4gdGhpcyBjYXNlCi0gKiBJTkxJTkUgd2lsbCBfbm90XyBiZSBzZXQgc28gd2UgY2FuIHVzZSB0aGlzIHRvIHRlc3QgaWYgd2UgYXJlCi0gKiBjb21waWxpbmcgdGhpcyBzb3VyY2UgZmlsZS4gIAotICovCi0KLSNpZm5kZWYgSU5MSU5FCi0jZGVmaW5lIElOTElORQotCi0vKiBBbnl0aGluZyByZXF1aXJlZCBvbmx5IHdoZW4gY29tcGlsaW5nICovCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0KLSNlbmRpZgotCi1JTkxJTkUgaW50IGFwX29zX2lzX3BhdGhfYWJzb2x1dGUoY29uc3QgY2hhciAqZmlsZSkKLXsKLSAgLyogRm9yIG5vdywganVzdCBkbyB0aGUgc2FtZSBjaGVjayB0aGF0IGh0dHBfcmVxdWVzdC5jIGFuZCBtb2RfYWxpYXMuYwotICAgKiBkby4gCi0gICAqLwotICByZXR1cm4gZmlsZSAmJiAoZmlsZVswXSA9PSAnLycgfHwgZmlsZVsxXSA9PSAnOicpOwotfQpkaWZmIC0tZ2l0IGEvb3Mvb3MyL29zLmggYi9vcy9vczIvb3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBlYmNlYy4uMDAwMDAwMAotLS0gYS9vcy9vczIvb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNpZm5kZWYgQVBBQ0hFX09TX0gKLSNkZWZpbmUgQVBBQ0hFX09TX0gKLQotI2RlZmluZSBQTEFURk9STSAiT1MvMiIKLSNkZWZpbmUgSEFWRV9DQU5PTklDQUxfRklMRU5BTUUKLSNkZWZpbmUgSEFWRV9EUklWRV9MRVRURVJTCi0KLSNpbmNsdWRlIDxhcHJfZ2VuZXJhbC5oPgotCi0vKgotICogVGhpcyBmaWxlIGluIGluY2x1ZGVkIGluIGFsbCBBcGFjaGUgc291cmNlIGNvZGUuIEl0IGNvbnRhaW5zIGRlZmluaXRpb25zCi0gKiBvZiBmYWNpbGl0aWVzIGF2YWlsYWJsZSBvbiBfdGhpc18gb3BlcmF0aW5nIHN5c3RlbSAoSEFWRV8qIG1hY3JvcyksCi0gKiBhbmQgcHJvdG90eXBlcyBvZiBPUyBzcGVjaWZpYyBmdW5jdGlvbnMgZGVmaW5lZCBpbiBvcy5jIG9yIG9zLWlubGluZS5jCi0gKi8KLQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKElOTElORSkKLS8qIENvbXBpbGVyIHN1cHBvcnRzIGlubGluZSwgc28gaW5jbHVkZSB0aGUgaW5saW5lYWJsZSBmdW5jdGlvbnMgYXMKLSAqIHBhcnQgb2YgdGhlIGhlYWRlcgotICovCi0jZGVmaW5lIElOTElORSBleHRlcm4gX19pbmxpbmVfXwotCi1JTkxJTkUgaW50IGFwX29zX2lzX3BhdGhfYWJzb2x1dGUoY29uc3QgY2hhciAqZmlsZSk7Ci0KLSNpbmNsdWRlICJvcy1pbmxpbmUuYyIKLSNlbmRpZgotCi0jaWZuZGVmIElOTElORQotLyogQ29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBpbmxpbmUsIHNvIHByb3RvdHlwZSB0aGUgaW5saW5lYWJsZSBmdW5jdGlvbnMKLSAqIGFzIG5vcm1hbAotICovCi1leHRlcm4gaW50IGFwX29zX2lzX3BhdGhfYWJzb2x1dGUoY29uc3QgY2hhciAqZmlsZSk7Ci0jZW5kaWYKLQotY2hhciAqYXBfb3NfY2Fub25pY2FsX2ZpbGVuYW1lKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqZmlsZSk7Ci0jZGVmaW5lIGFwX29zX2Nhc2VfY2Fub25pY2FsX2ZpbGVuYW1lKHAsZikgYXBfb3NfY2Fub25pY2FsX2ZpbGVuYW1lKHAsZikKLSNkZWZpbmUgYXBfb3Nfc3lzdGVtY2FzZV9maWxlbmFtZShwLGYpIGFwX29zX2Nhbm9uaWNhbF9maWxlbmFtZShwLGYpCi0vKiBGSVhNRTogdGhlIGZvbGxvd2luZyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgb24gdGhpcyBwbGF0Zm9ybSAqLwotI2RlZmluZSBhcF9vc19pc19maWxlbmFtZV92YWxpZChmKSAgICAgICAgICgxKQotCi0vKiBVc2UgYSBzcGVjaWFsaXplZCBraWxsKCkgZnVuY3Rpb24gKi8KLWludCBhcF9vc19raWxsKGludCBwaWQsIGludCBzaWcpOwotCi0vKiBNYXBzIGFuIE9TIGVycm9yIGNvZGUgdG8gYW4gZXJyb3IgbWVzc2FnZSAqLwotY2hhciAqYXBfb3NfZXJyb3JfbWVzc2FnZShpbnQgZXJyKTsKLQotLyogT1MvMiBkb2Vzbid0IGhhdmUgc3ltbGlua3Mgc28gU19JU0xOSyBpcyBhbHdheXMgZmFsc2UgKi8KLSNkZWZpbmUgU19JU0xOSyhtKSAwCi0KLS8qIER5bmFtaWMgbG9hZGluZyBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgICAgIGFwX29zX2Rzb19oYW5kbGVfdCAgdW5zaWduZWQgbG9uZwotdm9pZCAgICAgICAgYXBfb3NfZHNvX2luaXQodm9pZCk7Ci1hcF9vc19kc29faGFuZGxlX3QgYXBfb3NfZHNvX2xvYWQoY29uc3QgY2hhciAqKTsKLXZvaWQgICAgICAgIGFwX29zX2Rzb191bmxvYWQoYXBfb3NfZHNvX2hhbmRsZV90KTsKLXZvaWQgKiAgICAgIGFwX29zX2Rzb19zeW0oYXBfb3NfZHNvX2hhbmRsZV90LCBjb25zdCBjaGFyICopOwotY29uc3QgY2hhciAqYXBfb3NfZHNvX2Vycm9yKHZvaWQpOwotCi0jZW5kaWYgICAvKiAhIEFQQUNIRV9PU19IICovCmRpZmYgLS1naXQgYS9vcy9vczIvdXRpbF9vczIuYyBiL29zL29zMi91dGlsX29zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzZjNDA5Li4wMDAwMDAwCi0tLSBhL29zL29zMi91dGlsX29zMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLSNkZWZpbmUgSU5DTF9ET1MKLSNkZWZpbmUgSU5DTF9ET1NFUlJPUlMKLSNpbmNsdWRlIDxvczIuaD4KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAib3MuaCIKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy9zaWduYWwuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0KLUFQSV9FWFBPUlQoY2hhciAqKWFwX29zX2Nhbm9uaWNhbF9maWxlbmFtZShhcF9jb250ZXh0X3QgKnBQb29sLCBjb25zdCBjaGFyICpzekZpbGUpCi17Ci0gICAgY2hhciBidWZbSFVHRV9TVFJJTkdfTEVOXTsKLSAgICBjaGFyIGJ1ZjJbSFVHRV9TVFJJTkdfTEVOXTsKLSAgICBpbnQgcmMsIGxlbjsgCi0gICAgY2hhciAqcG9zOwotICAgIAotLyogUmVtb3ZlIHRyYWlsaW5nIHNsYXNoIHVubGVzcyBpdCdzIGEgcm9vdCBkaXJlY3RvcnkgKi8KLSAgICBzdHJjcHkoYnVmLCBzekZpbGUpOwotICAgIGxlbiA9IHN0cmxlbihidWYpOwotICAgIAotICAgIGlmIChsZW4gPiAzICYmIGJ1ZltsZW4tMV0gPT0gJy8nKQotICAgICAgICBidWZbLS1sZW5dID0gMDsKLSAgICAgIAotICAgIHJjID0gRG9zUXVlcnlQYXRoSW5mbyhidWYsIEZJTF9RVUVSWUZVTExOQU1FLCBidWYyLCBIVUdFX1NUUklOR19MRU4pOwotCi0gICAgaWYgKHJjKSB7Ci0gICAgICAgIGlmICggcmMgIT0gRVJST1JfSU5WQUxJRF9OQU1FICkgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUnxBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAiT1MvMiBlcnJvciAlZCBmb3IgZmlsZSAlcyIsIHJjLCBzekZpbGUpOwotICAgICAgICAgICAgcmV0dXJuIGFwX3BzdHJkdXAocFBvb2wsICIiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBhcF9wc3RyZHVwKHBQb29sLCBzekZpbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RybHdyKGJ1ZjIpOwotICAgIAotLyogU3dpdGNoIGJhY2tzbGFzaGVzIHRvIGZvcndhcmQgKi8KLSAgICBmb3IgKHBvcz1idWYyOyAqcG9zOyBwb3MrKykKLSAgICAgICAgaWYgKCpwb3MgPT0gJ1xcJykKLSAgICAgICAgICAgICpwb3MgPSAnLyc7Ci0gICAgCi0gICAgcmV0dXJuIGFwX3BzdHJkdXAocFBvb2wsIGJ1ZjIpOwotfQotCi0KLQotaW50IGFwX29zX2tpbGwocGlkX3QgcGlkLCBpbnQgc2lnKQotewotLyogU0lHVEVSTSdzIGRvbid0IHdvcmsgdG9vIHdlbGwgaW4gT1MvMiAob25seSBhZmZlY3RzIG90aGVyIEVNWCBwcm9ncmFtcykuCi0gICBDR0lzIG1heSBub3QgYmUsIGVzcC4gUkVYWCBzY3JpcHRzLCBzbyB1c2UgYSBuYXRpdmUgY2FsbCBpbnN0ZWFkICovCi0gICAKLSAgICBpbnQgcmM7Ci0gICAgCi0gICAgaWYgKCBzaWcgPT0gU0lHVEVSTSApIHsKLSAgICAgICAgcmMgPSBEb3NTZW5kU2lnbmFsRXhjZXB0aW9uKCBwaWQsIFhDUFRfU0lHTkFMX0JSRUFLICk7Ci0gICAgICAgIAotICAgICAgICBpZiAoIHJjICkgewotICAgICAgICAgICAgZXJybm8gPSBFU1JDSDsKLSAgICAgICAgICAgIHJjID0gLTE7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICByYyA9IGtpbGwocGlkLCBzaWcpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmM7Ci19Ci0KLQotCi1jaGFyICphcF9vc19lcnJvcl9tZXNzYWdlKGludCBlcnIpCi17Ci0gIHN0YXRpYyBjaGFyIHJlc3VsdFsyMDBdOwotICB1bnNpZ25lZCBjaGFyIG1lc3NhZ2VbSFVHRV9TVFJJTkdfTEVOXTsKLSAgVUxPTkcgbGVuOwotICBjaGFyICpwb3M7Ci0gIGludCBjOwotICAKLSAgaWYgKERvc0dldE1lc3NhZ2UoTlVMTCwgMCwgbWVzc2FnZSwgSFVHRV9TVFJJTkdfTEVOLCBlcnIsICJPU08wMDEuTVNHIiwgJmxlbikgPT0gMCkgewotICAgICAgbGVuLS07Ci0gICAgICBtZXNzYWdlW2xlbl0gPSAwOwotICAgICAgcG9zID0gcmVzdWx0OwotICAKLSAgICAgIGlmIChsZW4gPj0gc2l6ZW9mKHJlc3VsdCkpCi0gICAgICAgIGxlbiA9IHNpemVvZihyZXN1bHQtMSk7Ci0KLSAgICAgIGZvciAoYz0wOyBjPGxlbjsgYysrKSB7Ci0gICAgICAgICAgd2hpbGUgKGlzc3BhY2UobWVzc2FnZVtjXSkgJiYgaXNzcGFjZShtZXNzYWdlW2MrMV0pKSAvKiBza2lwIG11bHRpcGxlIHdoaXRlc3BhY2UgKi8KLSAgICAgICAgICAgICAgYysrOwotICAgICAgICAgICoocG9zKyspID0gaXNzcGFjZShtZXNzYWdlW2NdKSA/ICcgJyA6IG1lc3NhZ2VbY107Ci0gICAgICB9Ci0gIAotICAgICAgKnBvcyA9IDA7Ci0gIH0gZWxzZSB7Ci0gICAgICBzcHJpbnRmKHJlc3VsdCwgIk9TLzIgZXJyb3IgJWQiLCBlcnIpOwotICB9Ci0gIAotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLQotCi1zdGF0aWMgaW50ICgqb3MyX3NlbGVjdCkoIGludCAqLCBpbnQsIGludCwgaW50LCBsb25nICkgPSBOVUxMOwotc3RhdGljIEhNT0RVTEUgaFNPMzJETEw7Ci0KLWludCBhcF9zZWxlY3QoaW50IG5mZHMsIGZkX3NldCAqcmVhZGZkcywgZmRfc2V0ICp3cml0ZWZkcywgZmRfc2V0ICpleGNlcHRmZHMsIHN0cnVjdCB0aW1ldmFsICp0aW1lb3V0KQotewotICAgIGludCAqZmRzLCBzLCBmZF9jb3VudD0wLCByYzsKLSAgICBpbnQgbnVtX3JlYWQsIG51bV93cml0ZSwgbnVtX2V4Y2VwdDsKLSAgICBsb25nIG1zX3RpbWVvdXQgPSAtMTsKLQotICAgIGlmIChvczJfc2VsZWN0ID09IE5VTEwpIHsKLSAgICAgICAgRG9zRW50ZXJDcml0U2VjKCk7IC8qIFN0b3AgdHdvIHRocmVhZHMgZG9pbmcgdGhpcyBhdCB0aGUgc2FtZSB0aW1lICovCi0KLSAgICAgICAgaWYgKG9zMl9zZWxlY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgaFNPMzJETEwgPSBhcF9vc19kc29fbG9hZCgiU08zMkRMTCIpOwotCi0gICAgICAgICAgICBpZiAoaFNPMzJETEwpIHsKLSAgICAgICAgICAgICAgICBvczJfc2VsZWN0ID0gYXBfb3NfZHNvX3N5bShoU08zMkRMTCwgIlNFTEVDVCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIERvc0V4aXRDcml0U2VjKCk7Ci0gICAgfQotCi0gICAgYXBfYXNzZXJ0KG9zMl9zZWxlY3QgIT0gTlVMTCk7Ci0gICAgZmRzID0gYWxsb2NhKHNpemVvZihpbnQpICogbmZkcyk7Ci0KLSAgICBpZiAocmVhZGZkcykgewotICAgICAgICBmb3IgKHM9MDsgczxuZmRzOyBzKyspCi0gICAgICAgICAgICBpZiAoRkRfSVNTRVQocywgcmVhZGZkcykpCi0gICAgICAgICAgICAgICAgZmRzW2ZkX2NvdW50KytdID0gX2dldHNvY2toYW5kbGUocyk7Ci0gICAgfQotCi0gICAgbnVtX3JlYWQgPSBmZF9jb3VudDsKLQotICAgIGlmICh3cml0ZWZkcykgewotICAgICAgICBmb3IgKHM9MDsgczxuZmRzOyBzKyspCi0gICAgICAgICAgICBpZiAoRkRfSVNTRVQocywgd3JpdGVmZHMpKQotICAgICAgICAgICAgICAgIGZkc1tmZF9jb3VudCsrXSA9IF9nZXRzb2NraGFuZGxlKHMpOwotICAgIH0KLQotICAgIG51bV93cml0ZSA9IGZkX2NvdW50IC0gbnVtX3JlYWQ7Ci0KLSAgICBpZiAoZXhjZXB0ZmRzKSB7Ci0gICAgICAgIGZvciAocz0wOyBzPG5mZHM7IHMrKykKLSAgICAgICAgICAgIGlmIChGRF9JU1NFVChzLCBleGNlcHRmZHMpKQotICAgICAgICAgICAgICAgIGZkc1tmZF9jb3VudCsrXSA9IF9nZXRzb2NraGFuZGxlKHMpOwotICAgIH0KLQotICAgIG51bV9leGNlcHQgPSBmZF9jb3VudCAtIG51bV9yZWFkIC0gbnVtX3dyaXRlOwotCi0gICAgaWYgKHRpbWVvdXQpCi0gICAgICAgIG1zX3RpbWVvdXQgPSB0aW1lb3V0LT50dl91c2VjIC8gMTAwMCArIHRpbWVvdXQtPnR2X3NlYyAqIDEwMDA7Ci0KLSAgICByYyA9IG9zMl9zZWxlY3QoZmRzLCBudW1fcmVhZCwgbnVtX3dyaXRlLCBudW1fZXhjZXB0LCBtc190aW1lb3V0KTsKLQotICAgIGlmIChyYyA+IDApIHsKLSAgICAgICAgZmRfY291bnQgPSAwOwotCi0gICAgICAgIGlmIChyZWFkZmRzKSB7Ci0gICAgICAgICAgICBmb3IgKHM9MDsgczxuZmRzOyBzKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoRkRfSVNTRVQocywgcmVhZGZkcykpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZkc1tmZF9jb3VudCsrXSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBGRF9DTFIocywgcmVhZGZkcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHdyaXRlZmRzKSB7Ci0gICAgICAgICAgICBmb3IgKHM9MDsgczxuZmRzOyBzKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoRkRfSVNTRVQocywgd3JpdGVmZHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmZHNbZmRfY291bnQrK10gPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgRkRfQ0xSKHMsIHdyaXRlZmRzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXhjZXB0ZmRzKSB7Ci0gICAgICAgICAgICBmb3IgKHM9MDsgczxuZmRzOyBzKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoRkRfSVNTRVQocywgZXhjZXB0ZmRzKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmRzW2ZkX2NvdW50KytdIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIEZEX0NMUihzLCBleGNlcHRmZHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByYzsKLX0KZGlmZiAtLWdpdCBhL29zL3RwZi9UUEZFeHBvcnQgYi9vcy90cGYvVFBGRXhwb3J0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDllYmYyLi4wMDAwMDAwCi0tLSBhL29zL3RwZi9UUEZFeHBvcnQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMhL2Jpbi9zaAotZWNobyAiIFNldHRpbmcgVFBGL2M4OSBlbnZpcm9ubWVudCB2YXJpYWJsZXMiCi1leHBvcnQgX0M4OV9DQ01PREU9MQotIyByZXBsYWNlIHRoZSBmb2xsb3dpbmcgd2l0aCB0aGUgbG9jYXRpb24gb2YgeW91ciBUUEYgaW5jbHVkZSBmaWxlcwotZXhwb3J0IF9DODlfSU5DRElSUz0iL3UvdHBmNDEvY3VycmVudG1haW50L2luY2x1ZGUgL3UvdHBmNDEvY3VycmVudG1haW50L2luY2x1ZGUvb2NvIiAKLWV4cG9ydCBUUEY9WUVTCi1lY2hvICJEb25lIgpkaWZmIC0tZ2l0IGEvb3MvdHBmL2ViY2RpYy5jIGIvb3MvdHBmL2ViY2RpYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzlhY2UxLi4wMDAwMDAwCi0tLSBhL29zL3RwZi9lYmNkaWMuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotCi0jaWZkZWYgQ0hBUlNFVF9FQkNESUMKLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlICJlYmNkaWMuaCIKLS8qCi1UaGlzIGNvZGUgZG9lcyBiYXNpYyBjaGFyYWN0ZXIgbWFwcGluZyBmb3IgSUJNJ3MgVFBGIG9wZXJhdGluZyBzeXN0ZW0uCi1JdCBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgPE1hcnRpbi5LcmFlbWVyQE1jaC5TTkkuRGU+J3MgY29kZSBmb3IKLXRoZSBCUzIwMDAgKGFwYWNoZS9zcmMvb3MvYnMyMDAwL2ViY2RpYy5jKS4KLSovCi0KLS8qCi1CaWplY3RpdmUgRUJDRElDIChjaGFyYWN0ZXIgc2V0IElCTS0xMDQ3KSB0byBVUy1BU0NJSSB0YWJsZToKLVRoaXMgYXBfdGFibGVfdCBpcyBiaWplY3RpdmUgLSB0aGVyZSBhcmUgbm8gYW1iaWdvdXMgb3IgZHVwbGljYXRlIGNoYXJhY3RlcnMuCi0qLwotY29uc3QgdW5zaWduZWQgY2hhciBvc190b2FzY2lpX3N0cmljdGx5WzI1Nl0gPSB7Ci0gICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHg4NSwgMHgwOSwgMHg4NiwgMHg3ZiwgLyogMDAtMGY6ICAgICAgICAgICAqLwotICAgIDB4ODcsIDB4OGQsIDB4OGUsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIC4uLi4uLi4uLi4uLi4uLi4gKi8KLSAgICAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDhmLCAweDBhLCAweDA4LCAweDk3LCAvKiAxMC0xZjogICAgICAgICAgICovCi0gICAgMHgxOCwgMHgxOSwgMHg5YywgMHg5ZCwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogLi4uLi4uLi4uLi4uLi4uLiAqLwotICAgIDB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4OTIsIDB4MTcsIDB4MWIsIC8qIDIwLTJmOiAgICAgICAgICAgKi8KLSAgICAweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDA1LCAweDA2LCAweDA3LCAvKiAuLi4uLi4uLi4uLi4uLi4uICovCi0gICAgMHg5MCwgMHg5MSwgMHgxNiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHgwNCwgLyogMzAtM2Y6ICAgICAgICAgICAqLwotICAgIDB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4MTQsIDB4MTUsIDB4OWUsIDB4MWEsIC8qIC4uLi4uLi4uLi4uLi4uLi4gKi8KLSAgICAweDIwLCAweGEwLCAweGUyLCAweGU0LCAweGUwLCAweGUxLCAweGUzLCAweGU1LCAvKiA0MC00ZjogICAgICAgICAgICovCi0gICAgMHhlNywgMHhmMSwgMHhhMiwgMHgyZSwgMHgzYywgMHgyOCwgMHgyYiwgMHg3YywgLyogIC4uLi4uLi4uLi4uPCgrfCAqLwotICAgIDB4MjYsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZTgsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDUwLTVmOiAgICAgICAgICAgKi8KLSAgICAweGVjLCAweGRmLCAweDIxLCAweDI0LCAweDJhLCAweDI5LCAweDNiLCAweDVlLCAvKiAmLi4uLi4uLi4uISQqKTteICovCi0gICAgMHgyZCwgMHgyZiwgMHhjMiwgMHhjNCwgMHhjMCwgMHhjMSwgMHhjMywgMHhjNSwgLyogNjAtNmY6ICAgICAgICAgICAqLwotICAgIDB4YzcsIDB4ZDEsIDB4YTYsIDB4MmMsIDB4MjUsIDB4NWYsIDB4M2UsIDB4M2YsIC8qIC0vLi4uLi4uLi4uLCVfPj8gKi8KLSAgICAweGY4LCAweGM5LCAweGNhLCAweGNiLCAweGM4LCAweGNkLCAweGNlLCAweGNmLCAvKiA3MC03ZjogICAgICAgICAgICovCi0gICAgMHhjYywgMHg2MCwgMHgzYSwgMHgyMywgMHg0MCwgMHgyNywgMHgzZCwgMHgyMiwgLyogLi4uLi4uLi4uYDojQCc9IiAqLwotICAgIDB4ZDgsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDgwLThmOiAgICAgICAgICAgKi8KLSAgICAweDY4LCAweDY5LCAweGFiLCAweGJiLCAweGYwLCAweGZkLCAweGZlLCAweGIxLCAvKiAuYWJjZGVmZ2hpLi4uLi4uICovCi0gICAgMHhiMCwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgMHg3MCwgLyogOTAtOWY6ICAgICAgICAgICAqLwotICAgIDB4NzEsIDB4NzIsIDB4YWEsIDB4YmEsIDB4ZTYsIDB4YjgsIDB4YzYsIDB4YTQsIC8qIC5qa2xtbm9wcXIuLi4uLi4gKi8KLSAgICAweGI1LCAweDdlLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LCAvKiBhMC1hZjogICAgICAgICAgICovCi0gICAgMHg3OSwgMHg3YSwgMHhhMSwgMHhiZiwgMHhkMCwgMHg1YiwgMHhkZSwgMHhhZSwgLyogLn5zdHV2d3h5ei4uLlsuLiAqLwotICAgIDB4YWMsIDB4YTMsIDB4YTUsIDB4YjcsIDB4YTksIDB4YTcsIDB4YjYsIDB4YmMsIC8qIGIwLWJmOiAgICAgICAgICAgKi8KLSAgICAweGJkLCAweGJlLCAweGRkLCAweGE4LCAweGFmLCAweDVkLCAweGI0LCAweGQ3LCAvKiAuLi4uLi4uLi4uLi4uXS4uICovCi0gICAgMHg3YiwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogYzAtY2Y6ICAgICAgICAgICAqLwotICAgIDB4NDgsIDB4NDksIDB4YWQsIDB4ZjQsIDB4ZjYsIDB4ZjIsIDB4ZjMsIDB4ZjUsIC8qIHtBQkNERUZHSEkuLi4uLi4gKi8KLSAgICAweDdkLCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAweDUwLCAvKiBkMC1kZjogICAgICAgICAgICovCi0gICAgMHg1MSwgMHg1MiwgMHhiOSwgMHhmYiwgMHhmYywgMHhmOSwgMHhmYSwgMHhmZiwgLyogfUpLTE1OT1BRUi4uLi4uLiAqLwotICAgIDB4NWMsIDB4ZjcsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIC8qIGUwLWVmOiAgICAgICAgICAgKi8KLSAgICAweDU5LCAweDVhLCAweGIyLCAweGQ0LCAweGQ2LCAweGQyLCAweGQzLCAweGQ1LCAvKiBcLlNUVVZXWFlaLi4uLi4uICovCi0gICAgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogZjAtZmY6ICAgICAgICAgICAqLwotICAgIDB4MzgsIDB4MzksIDB4YjMsIDB4ZGIsIDB4ZGMsIDB4ZDksIDB4ZGEsIDB4OWYgIC8qIDAxMjM0NTY3ODkuLi4uLi4gKi8KLX07Ci0KLS8qCi1TZXJ2ZXIgRUJDRElDIChjaGFyYWN0ZXIgc2V0IElCTS0xMDQ3KSB0byBVUy1BU0NJSSB0YWJsZToKLVRoaXMgYXBfdGFibGVfdCBpcyBhIGNvcHkgb2YgdGhlIG9zX3RvYXNjaWlfc3RyaWN0bHkgYmlqZWN0aXZlIGFwX3RhYmxlX3QgYWJvdmUuCi1UaGUgb25seSBjaGFuZ2UgaXMgdGhhdCBoZXggMGEgKFwwMTIgb2N0YWwpIGlzIG1hcHBlZCB0byBoZXggMGEKLShBU0NJSSdzIGxpbmUgZmVlZCkgaW5zdGVhZCBvZiBoZXggOGUuICBUaGlzIGlzIGRvbmUgYmVjYXVzZSB0aHJvdWdob3V0Ci1BcGFjaGUsIHByb3RvY29sIHN0cmluZyBkZWZpbml0aW9ucyBoYXJkY29kZSB0aGUgbGluZWZlZWQgYXMgXDAxMiAob2N0YWwpOgotIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpblwwMTVcMDEyIi4gIFdpdGhvdXQgdGhpcyBrbHVkZ2UgYWxsIHByb3RvY29sCi1zdHJpbmcgZGVmaW5pdGlvbnMgd291bGQgbmVlZCB0byBiZSBjaGFuZ2VkIGZyb20gLi4uXDAxMiB0byAuLi5cMDI1LgotKi8KLWNvbnN0IHVuc2lnbmVkIGNoYXIgb3NfdG9hc2NpaVsyNTZdID0gewotICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4ODUsIDB4MDksIDB4ODYsIDB4N2YsIC8qIDAwLTBmOiAgICAgICAgICAgKi8KLSAgICAweDg3LCAweDhkLCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAuLi4uLi4uLi4uLi4uLi4uICovCi0gICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHg4ZiwgMHgwYSwgMHgwOCwgMHg5NywgLyogMTAtMWY6ICAgICAgICAgICAqLwotICAgIDB4MTgsIDB4MTksIDB4OWMsIDB4OWQsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIC4uLi4uLi4uLi4uLi4uLi4gKi8KLSAgICAweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDkyLCAweDE3LCAweDFiLCAvKiAyMC0yZjogICAgICAgICAgICovCi0gICAgMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHgwNSwgMHgwNiwgMHgwNywgLyogLi4uLi4uLi4uLi4uLi4uLiAqLwotICAgIDB4OTAsIDB4OTEsIDB4MTYsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4MDQsIC8qIDMwLTNmOiAgICAgICAgICAgKi8KLSAgICAweDk4LCAweDk5LCAweDlhLCAweDliLCAweDE0LCAweDE1LCAweDllLCAweDFhLCAvKiAuLi4uLi4uLi4uLi4uLi4uICovCi0gICAgMHgyMCwgMHhhMCwgMHhlMiwgMHhlNCwgMHhlMCwgMHhlMSwgMHhlMywgMHhlNSwgLyogNDAtNGY6ICAgICAgICAgICAqLwotICAgIDB4ZTcsIDB4ZjEsIDB4YTIsIDB4MmUsIDB4M2MsIDB4MjgsIDB4MmIsIDB4N2MsIC8qICAuLi4uLi4uLi4uLjwoK3wgKi8KLSAgICAweDI2LCAweGU5LCAweGVhLCAweGViLCAweGU4LCAweGVkLCAweGVlLCAweGVmLCAvKiA1MC01ZjogICAgICAgICAgICovCi0gICAgMHhlYywgMHhkZiwgMHgyMSwgMHgyNCwgMHgyYSwgMHgyOSwgMHgzYiwgMHg1ZSwgLyogJi4uLi4uLi4uLiEkKik7XiAqLwotICAgIDB4MmQsIDB4MmYsIDB4YzIsIDB4YzQsIDB4YzAsIDB4YzEsIDB4YzMsIDB4YzUsIC8qIDYwLTZmOiAgICAgICAgICAgKi8KLSAgICAweGM3LCAweGQxLCAweGE2LCAweDJjLCAweDI1LCAweDVmLCAweDNlLCAweDNmLCAvKiAtLy4uLi4uLi4uLiwlXz4/ICovCi0gICAgMHhmOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjOCwgMHhjZCwgMHhjZSwgMHhjZiwgLyogNzAtN2Y6ICAgICAgICAgICAqLwotICAgIDB4Y2MsIDB4NjAsIDB4M2EsIDB4MjMsIDB4NDAsIDB4MjcsIDB4M2QsIDB4MjIsIC8qIC4uLi4uLi4uLmA6I0AnPSIgKi8KLSAgICAweGQ4LCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiA4MC04ZjogICAgICAgICAgICovCi0gICAgMHg2OCwgMHg2OSwgMHhhYiwgMHhiYiwgMHhmMCwgMHhmZCwgMHhmZSwgMHhiMSwgLyogLmFiY2RlZmdoaS4uLi4uLiAqLwotICAgIDB4YjAsIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIDB4NzAsIC8qIDkwLTlmOiAgICAgICAgICAgKi8KLSAgICAweDcxLCAweDcyLCAweGFhLCAweGJhLCAweGU2LCAweGI4LCAweGM2LCAweGE0LCAvKiAuamtsbW5vcHFyLi4uLi4uICovCi0gICAgMHhiNSwgMHg3ZSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgLyogYTAtYWY6ICAgICAgICAgICAqLwotICAgIDB4NzksIDB4N2EsIDB4YTEsIDB4YmYsIDB4ZDAsIDB4NWIsIDB4ZGUsIDB4YWUsIC8qIC5+c3R1dnd4eXouLi5bLi4gKi8KLSAgICAweGFjLCAweGEzLCAweGE1LCAweGI3LCAweGE5LCAweGE3LCAweGI2LCAweGJjLCAvKiBiMC1iZjogICAgICAgICAgICovCi0gICAgMHhiZCwgMHhiZSwgMHhkZCwgMHhhOCwgMHhhZiwgMHg1ZCwgMHhiNCwgMHhkNywgLyogLi4uLi4uLi4uLi4uLl0uLiAqLwotICAgIDB4N2IsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIGMwLWNmOiAgICAgICAgICAgKi8KLSAgICAweDQ4LCAweDQ5LCAweGFkLCAweGY0LCAweGY2LCAweGYyLCAweGYzLCAweGY1LCAvKiB7QUJDREVGR0hJLi4uLi4uICovCi0gICAgMHg3ZCwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgMHg1MCwgLyogZDAtZGY6ICAgICAgICAgICAqLwotICAgIDB4NTEsIDB4NTIsIDB4YjksIDB4ZmIsIDB4ZmMsIDB4ZjksIDB4ZmEsIDB4ZmYsIC8qIH1KS0xNTk9QUVIuLi4uLi4gKi8KLSAgICAweDVjLCAweGY3LCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAvKiBlMC1lZjogICAgICAgICAgICovCi0gICAgMHg1OSwgMHg1YSwgMHhiMiwgMHhkNCwgMHhkNiwgMHhkMiwgMHhkMywgMHhkNSwgLyogXC5TVFVWV1hZWi4uLi4uLiAqLwotICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIGYwLWZmOiAgICAgICAgICAgKi8KLSAgICAweDM4LCAweDM5LCAweGIzLCAweGRiLCAweGRjLCAweGQ5LCAweGRhLCAweDlmICAvKiAwMTIzNDU2Nzg5Li4uLi4uICovCi19OwotCi0vKgotVGhlIFVTLUFTQ0lJIHRvIEVCQ0RJQyAoY2hhcmFjdGVyIHNldCBJQk0tMTA0NykgdGFibGU6Ci1UaGlzIGFwX3RhYmxlX3QgaXMgYmlqZWN0aXZlIChubyBhbWJpZ3VvdXMgb3IgZHVwbGljYXRlIGNoYXJhY3RlcnMpCi0qLwotY29uc3QgdW5zaWduZWQgY2hhciBvc190b2ViY2RpY1syNTZdID0gewotICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MzcsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDAwLTBmOiAgICAgICAgICAgKi8KLSAgICAweDE2LCAweDA1LCAweDE1LCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAuLi4uLi4uLi4uLi4uLi4uICovCi0gICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgzYywgMHgzZCwgMHgzMiwgMHgyNiwgLyogMTAtMWY6ICAgICAgICAgICAqLwotICAgIDB4MTgsIDB4MTksIDB4M2YsIDB4MjcsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIC4uLi4uLi4uLi4uLi4uLi4gKi8KLSAgICAweDQwLCAweDVhLCAweDdmLCAweDdiLCAweDViLCAweDZjLCAweDUwLCAweDdkLCAvKiAyMC0yZjogICAgICAgICAgICovCi0gICAgMHg0ZCwgMHg1ZCwgMHg1YywgMHg0ZSwgMHg2YiwgMHg2MCwgMHg0YiwgMHg2MSwgLyogICEiIyQlJicoKSorLC0uLyAqLwotICAgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDMwLTNmOiAgICAgICAgICAgKi8KLSAgICAweGY4LCAweGY5LCAweDdhLCAweDVlLCAweDRjLCAweDdlLCAweDZlLCAweDZmLCAvKiAwMTIzNDU2Nzg5Ojs8PT4/ICovCi0gICAgMHg3YywgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogNDAtNGY6ICAgICAgICAgICAqLwotICAgIDB4YzgsIDB4YzksIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIC8qIEBBQkNERUZHSElKS0xNTk8gKi8KLSAgICAweGQ3LCAweGQ4LCAweGQ5LCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAvKiA1MC01ZjogICAgICAgICAgICovCi0gICAgMHhlNywgMHhlOCwgMHhlOSwgMHhhZCwgMHhlMCwgMHhiZCwgMHg1ZiwgMHg2ZCwgLyogUFFSU1RVVldYWVpbXF1eXyAqLwotICAgIDB4NzksIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDYwLTZmOiAgICAgICAgICAgKi8KLSAgICAweDg4LCAweDg5LCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAvKiBgYWJjZGVmZ2hpamtsbW5vICovCi0gICAgMHg5NywgMHg5OCwgMHg5OSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgLyogNzAtN2Y6ICAgICAgICAgICAqLwotICAgIDB4YTcsIDB4YTgsIDB4YTksIDB4YzAsIDB4NGYsIDB4ZDAsIDB4YTEsIDB4MDcsIC8qIHBxcnN0dXZ3eHl6e3x9fi4gKi8KLSAgICAweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDA0LCAweDA2LCAweDA4LCAvKiA4MC04ZjogICAgICAgICAgICovCi0gICAgMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgwOSwgMHgwYSwgMHgxNCwgLyogLi4uLi4uLi4uLi4uLi4uLiAqLwotICAgIDB4MzAsIDB4MzEsIDB4MjUsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MTcsIC8qIDkwLTlmOiAgICAgICAgICAgKi8KLSAgICAweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDFhLCAweDFiLCAweDNlLCAweGZmLCAvKiAuLi4uLi4uLi4uLi4uLi4uICovCi0gICAgMHg0MSwgMHhhYSwgMHg0YSwgMHhiMSwgMHg5ZiwgMHhiMiwgMHg2YSwgMHhiNSwgLyogYTAtYWY6ICAgICAgICAgICAqLwotICAgIDB4YmIsIDB4YjQsIDB4OWEsIDB4OGEsIDB4YjAsIDB4Y2EsIDB4YWYsIDB4YmMsIC8qIC4uLi4uLi4uLi4uLi4uLi4gKi8KLSAgICAweDkwLCAweDhmLCAweGVhLCAweGZhLCAweGJlLCAweGEwLCAweGI2LCAweGIzLCAvKiBiMC1iZjogICAgICAgICAgICovCi0gICAgMHg5ZCwgMHhkYSwgMHg5YiwgMHg4YiwgMHhiNywgMHhiOCwgMHhiOSwgMHhhYiwgLyogLi4uLi4uLi4uLi4uLi4uLiAqLwotICAgIDB4NjQsIDB4NjUsIDB4NjIsIDB4NjYsIDB4NjMsIDB4NjcsIDB4OWUsIDB4NjgsIC8qIGMwLWNmOiAgICAgICAgICAgKi8KLSAgICAweDc0LCAweDcxLCAweDcyLCAweDczLCAweDc4LCAweDc1LCAweDc2LCAweDc3LCAvKiAuLi4uLi4uLi4uLi4uLi4uICovCi0gICAgMHhhYywgMHg2OSwgMHhlZCwgMHhlZSwgMHhlYiwgMHhlZiwgMHhlYywgMHhiZiwgLyogZDAtZGY6ICAgICAgICAgICAqLwotICAgIDB4ODAsIDB4ZmQsIDB4ZmUsIDB4ZmIsIDB4ZmMsIDB4YmEsIDB4YWUsIDB4NTksIC8qIC4uLi4uLi4uLi4uLi4uLi4gKi8KLSAgICAweDQ0LCAweDQ1LCAweDQyLCAweDQ2LCAweDQzLCAweDQ3LCAweDljLCAweDQ4LCAvKiBlMC1lZjogICAgICAgICAgICovCi0gICAgMHg1NCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1OCwgMHg1NSwgMHg1NiwgMHg1NywgLyogLi4uLi4uLi4uLi4uLi4uLiAqLwotICAgIDB4OGMsIDB4NDksIDB4Y2QsIDB4Y2UsIDB4Y2IsIDB4Y2YsIDB4Y2MsIDB4ZTEsIC8qIGYwLWZmOiAgICAgICAgICAgKi8KLSAgICAweDcwLCAweGRkLCAweGRlLCAweGRiLCAweGRjLCAweDhkLCAweDhlLCAweGRmICAvKiAuLi4uLi4uLi4uLi4uLi4uICovCi19OwotCi0vKiBUcmFuc2xhdGUgYSBtZW1vcnkgYmxvY2sgZnJvbSBFQkNESUMgKGhvc3QgY2hhcnNldCkgdG8gQVNDSUkgKG5ldCBjaGFyc2V0KQotICogZGVzdCBhbmQgc3JjZSBtYXkgYmUgaWRlbnRpY2FsLCBvciBzZXBhcmF0ZSBtZW1vcnkgYmxvY2tzLCBidXQKLSAqIHNob3VsZCBub3Qgb3ZlcmxhcC4KLSAqLwotdm9pZAotZWJjZGljMmFzY2lpKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyY2UsIHNpemVfdCBjb3VudCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyICp1ZGVzdCA9IGRlc3Q7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqdXNyY2UgPSBzcmNlOwotICAgIHdoaWxlIChjb3VudC0tICE9IDApIHsKLSAgICAgICAgKnVkZXN0KysgPSBvc190b2FzY2lpWyp1c3JjZSsrXTsKLSAgICB9Ci19Ci12b2lkCi1lYmNkaWMyYXNjaWlfc3RyaWN0bHkodW5zaWduZWQgY2hhciAqZGVzdCwgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjZSwgc2l6ZV90IGNvdW50KQotewotICAgIHdoaWxlIChjb3VudC0tICE9IDApIHsKLSAgICAgICAgKmRlc3QrKyA9IG9zX3RvYXNjaWlfc3RyaWN0bHlbKnNyY2UrK107Ci0gICAgfQotfQotdm9pZAotYXNjaWkyZWJjZGljKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyY2UsIHNpemVfdCBjb3VudCkKLXsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqdWRlc3QgPSBkZXN0OwotICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICp1c3JjZSA9IHNyY2U7Ci0KLSAgICAgICAgd2hpbGUgKGNvdW50LS0gIT0gMCkgewotICAgICAgICAgICAgICAgICp1ZGVzdCsrID0gb3NfdG9lYmNkaWNbKnVzcmNlKytdOwotICAgIH0KLX0KLSNlbmRpZiAvKkNIQVJTRVRfRUJDRElDKi8KLSAKZGlmZiAtLWdpdCBhL29zL3RwZi9lYmNkaWMuaCBiL29zL3RwZi9lYmNkaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTljNDEyMC4uMDAwMDAwMAotLS0gYS9vcy90cGYvZWJjZGljLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgb3NfdG9hc2NpaVsyNTZdOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgb3NfdG9lYmNkaWNbMjU2XTsKLXZvaWQgZWJjZGljMmFzY2lpKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyY2UsIHNpemVfdCBjb3VudCk7Ci12b2lkIGViY2RpYzJhc2NpaV9zdHJpY3RseSh1bnNpZ25lZCBjaGFyICpkZXN0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmNlLCBzaXplX3QgY291bnQpOwotdm9pZCBhc2NpaTJlYmNkaWModm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjZSwgc2l6ZV90IGNvdW50KTsKLQpkaWZmIC0tZ2l0IGEvb3MvdHBmL29zLWlubGluZS5jIGIvb3MvdHBmL29zLWlubGluZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTg5MTdhLi4wMDAwMDAwCi0tLSBhL29zL3RwZi9vcy1pbmxpbmUuYworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIHdoaWNoIGNhbiBiZSBpbmxpbmVkIGlmIHRoZSBjb21waWxlcgotICogaGFzIGFuICJpbmxpbmUiIG1vZGlmaWVyLiBCZWNhdXNlIG9mIHRoaXMsIHRoaXMgZmlsZSBpcyBib3RoIGEKLSAqIGhlYWRlciBmaWxlIGFuZCBhIGNvbXBpbGFibGUgbW9kdWxlLgotICoKLSAqIE9ubHkgaW5saW5lYWJsZSBmdW5jdGlvbnMgc2hvdWxkIGJlIGRlZmluZWQgaW4gaGVyZS4gVGhleSBtdXN0IGFsbAotICogaW5jbHVkZSB0aGUgSU5MSU5FIG1vZGlmaWVyLiAKLSAqCi0gKiBJZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgaW5saW5lLCB0aGlzIGZpbGUgd2lsbCBiZSAjaW5jbHVkZWQgYXMgYQotICogaGVhZGVyIGZpbGUgZnJvbSBvcy5oIHRvIGNyZWF0ZSBhbGwgdGhlIGlubGluZSBmdW5jdGlvbgotICogZGVmaW5pdGlvbnMuIElOTElORSB3aWxsIGJlIGRlZmluZWQgdG8gd2hhdGV2ZXIgaXMgcmVxdWlyZWQgb24KLSAqIGZ1bmN0aW9uIGRlZmluaXRpb25zIHRvIG1ha2UgdGhlbSBpbmxpbmUgZGVjbGFyYXRpb25zLgotICoKLSAqIElmIHRoZSBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IGlubGluZSwgdGhpcyBmaWxlIHdpbGwgYmUgY29tcGlsZWQKLSAqIGFzIGEgbm9ybWFsIEMgZmlsZSBpbnRvIGxpYm9zLmEgKGFsb25nIHdpdGggb3MuYykuIEluIHRoaXMgY2FzZQotICogSU5MSU5FIHdpbGwgX25vdF8gYmUgc2V0IHNvIHdlIGNhbiB1c2UgdGhpcyB0byB0ZXN0IGlmIHdlIGFyZQotICogY29tcGlsaW5nIHRoaXMgc291cmNlIGZpbGUuICAKLSAqLwotCi0jaWZuZGVmIElOTElORQotI2RlZmluZSBJTkxJTkUKLQotLyogQW55dGhpbmcgcmVxdWlyZWQgb25seSB3aGVuIGNvbXBpbGluZyAqLwotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotCi0jZW5kaWYKLQotSU5MSU5FIGludCBhcF9vc19pc19wYXRoX2Fic29sdXRlKGNvbnN0IGNoYXIgKmZpbGUpCi17Ci0gIHJldHVybiAoZmlsZSAmJiBmaWxlWzBdID09ICcvJyA/IDEgOiAwKTsKLX0KZGlmZiAtLWdpdCBhL29zL3RwZi9vcy5jIGIvb3MvdHBmL29zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZTE2ZGEuLjAwMDAwMDAKLS0tIGEvb3MvdHBmL29zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTQgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBUaGlzIGZpbGUgd2lsbCBpbmNsdWRlIE9TIHNwZWNpZmljIGZ1bmN0aW9ucyB3aGljaCBhcmUgbm90IGlubGluZWFibGUuCi0gKiBBbnkgaW5saW5lYWJsZSBmdW5jdGlvbnMgc2hvdWxkIGJlIGRlZmluZWQgaW4gb3MtaW5saW5lLmMgaW5zdGVhZC4KLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJvcy5oIgotI2luY2x1ZGUgInNjb3JlYm9hcmQuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfY29uZl9nbG9iYWxzLmgiCi0KLXN0YXRpYyBGSUxFICpzb2NrX2ZwOwotCi0vKiBDaGVjayB0aGUgQ29udGVudC1UeXBlIHRvIGRlY2lkZSBpZiBjb252ZXJzaW9uIGlzIG5lZWRlZCAqLwotaW50IGFwX2NoZWNrY29udihzdHJ1Y3QgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IGNvbnZlcnRfdG9fYXNjaWk7Ci0gICAgY29uc3QgY2hhciAqdHlwZTsKLQotICAgIC8qIFRvIG1ha2Ugc2VydmluZyBvZiAicmF3IEFTQ0lJIHRleHQiIGZpbGVzIGVhc3kgKHRoZXkgc2VydmUgZmFzdGVyIAotICAgICAqIHNpbmNlIHRoZXkgZG9uJ3QgaGF2ZSB0byBiZSBjb252ZXJ0ZWQgZnJvbSBFQkNESUMpLCBhIG5ldwotICAgICAqICJtYWdpYyIgdHlwZSBwcmVmaXggd2FzIGludmVudGVkOiB0ZXh0L3gtYXNjaWkte3BsYWluLGh0bWwsLi4ufQotICAgICAqIElmIHdlIGRldGVjdCBvbmUgb2YgdGhlc2UgY29udGVudCB0eXBlcyBoZXJlLCB3ZSBzaW1wbHkgY29ycmVjdAotICAgICAqIHRoZSB0eXBlIHRvIHRoZSByZWFsIHRleHQve3BsYWluLGh0bWwsLi4ufSB0eXBlLiBPdGhlcndpc2UsIHdlCi0gICAgICogc2V0IGEgZmxhZyB0aGF0IHRyYW5zbGF0aW9uIGlzIHJlcXVpcmVkIGxhdGVyIG9uLgotICAgICAqLwotCi0gICAgdHlwZSA9IChyLT5jb250ZW50X3R5cGUgPT0gTlVMTCkgPyBhcF9kZWZhdWx0X3R5cGUocikgOiByLT5jb250ZW50X3R5cGU7Ci0KLSAgICAvKiBJZiBubyBjb250ZW50IHR5cGUgaXMgc2V0IHRoZW4gdHJlYXQgaXQgYXMgKGViY2RpYykgdGV4dC9wbGFpbiAqLwotICAgIGNvbnZlcnRfdG9fYXNjaWkgPSAodHlwZSA9PSBOVUxMKTsKLQotICAgIC8qIENvbnZlcnNpb24gaXMgYXBwbGllZCB0byB0ZXh0LyBmaWxlcyBvbmx5LCBpZiBldmVyLiAqLwotICAgIGlmICh0eXBlICYmIChzdHJuY2FzZWNtcCh0eXBlLCAidGV4dC8iLCA1KSA9PSAwIHx8Ci0JCSBzdHJuY2FzZWNtcCh0eXBlLCAibWVzc2FnZS8iLCA4KSA9PSAwKSkgewotCWlmIChzdHJuY2FzZWNtcCh0eXBlLCBBU0NJSVRFWFRfTUFHSUNfVFlQRV9QUkVGSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQVNDSUlURVhUX01BR0lDX1RZUEVfUFJFRklYKS0xKSA9PSAwKXsKLQkgICAgci0+Y29udGVudF90eXBlID0gYXBfcHN0cmNhdChyLT5wb29sLCAidGV4dC8iLAotICAgICAgICAgICAgICAgICAgIHR5cGUrc2l6ZW9mKEFTQ0lJVEVYVF9NQUdJQ19UWVBFX1BSRUZJWCktMSwgTlVMTCk7Ci0gICAgICAgICAgICBpZiAoci0+bWV0aG9kX251bWJlciA9PSBNX1BVVCkKLSAgICAgICAgICAgICAgICAgICBhcF9ic2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfQVNDSUkyRUJDRElDLCAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICBlbHNlCi0JICAgIC8qIHRyYW5zbGF0ZSBFQkNESUMgdG8gQVNDSUkgKi8KLQkgICAgY29udmVydF90b19hc2NpaSA9IDE7Ci0gICAgfQotICAgIGVsc2V7Ci0gICAgICAgICAgIGlmIChyLT5tZXRob2RfbnVtYmVyID09IE1fUFVUKQotICAgICAgICAgICAgICAgYXBfYnNldGZsYWcoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCX0FTQ0lJMkVCQ0RJQywgMCk7Ci0gICAgICAgICAgICAgICAvKiBkb24ndCB0cmFuc2xhdGUgbm9uLXRleHQgZmlsZXMgdG8gRUJDRElDICovCi0gICAgfQotICAgIC8qIEVuYWJsZSBjb252ZXJzaW9uIGlmIGl0J3MgYSB0ZXh0IGRvY3VtZW50ICovCi0gICAgYXBfYnNldGZsYWcoci0+Y29ubmVjdGlvbi0+Y2xpZW50LCBCX0VCQ0RJQzJBU0NJSSwgY29udmVydF90b19hc2NpaSk7Ci0KLSAgICByZXR1cm4gY29udmVydF90b19hc2NpaTsKLX0KLQotaW50IHRwZl9zZWxlY3QoaW50IG1heGZkcywgZmRfc2V0ICpyZWFkcywgZmRfc2V0ICp3cml0ZXMsIGZkX3NldCAqZXhjZXB0cywgc3RydWN0IHRpbWV2YWwgKnR2KQotewotLyogV2UncmUgZ29pbmcgdG8gZm9yY2Ugb3VyIHdheSB0aHJvdWdoIHNlbGVjdC4gIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCByZWFkcyBhbmQgVFBGIGFsbG93cwotICAgMmJpbGxpb24rIHNvY2tldCBkZXNjcmlwdG9ycyBmb3Igd2UgZG9uJ3Qgd2FudCBhbiBmZF9zZXQgdGhhdCBiaWcuICBKdXN0IGFzc3VtZSB0aGF0IG1heGZkcy0xCi0gICBjb250YWlucyB0aGUgc29ja2V0IGRlc2NyaXB0b3Igd2UncmUgaW50ZXJlc3RlZCBpbi4gIElmIGl0J3MgMCwgbGVhdmUgaXQgYWxvbmUuICovCi0KLSAgICBpbnQgc29ja2V0c1sxXTsKLSAgICBpbnQgbm9fcmVhZHMgPSAwOwotICAgIGludCBub193cml0ZXMgPSAwOwotICAgIGludCBub19leGNlcHRzID0gMDsKLSAgICBpbnQgdGltZW91dCA9IDA7Ci0gICAgaW50IHJ2OwotICAgIAotICAgIGlmKG1heGZkcykgewotICAgICAgICBpZih0dikKLSAgICAgICAgICAgIHRpbWVvdXQgPSB0di0+dHZfc2VjICogMTAwMCArIHR2LT50dl91c2VjOwotICAgICAgICBzb2NrZXRzWzBdID0gbWF4ZmRzLTE7Ci0gICAgICAgIG5vX3JlYWRzKys7Ci0gICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHNvY2tldHNbMF0gPSAwOwotICAgICAgICAKLSAgICBhcF9jaGVja19zaWduYWxzKCk7Ci0gICAgcnYgPSBzZWxlY3Qoc29ja2V0cywgbm9fcmVhZHMsIG5vX3dyaXRlcywgbm9fZXhjZXB0cywgdGltZW91dCk7Ci0gICAgYXBfY2hlY2tfc2lnbmFscygpOwotICAgIAotICAgIHJldHVybiBydjsKLQotfQotCi1pbnQgdHBmX2FjY2VwdChpbnQgc29ja2ZkLCBzdHJ1Y3Qgc29ja2FkZHIgKnBlZXIsIGludCAqcGFkZHJsZW4pCi17Ci0gICAgaW50IHNvY2tzWzFdOwotICAgIGludCBydjsKLQotICAgIGFwX2NoZWNrX3NpZ25hbHMoKTsKLSAgICBzb2Nrc1swXSA9IHNvY2tmZDsKLSAgICBydiA9IHNlbGVjdChzb2NrcywgMSwgMCwgMCwgMTAwMCk7Ci0gICAgZXJybm8gPSBzb2NrX2Vycm5vKCk7Ci0gICAgaWYocnY+MCkgewotICAgICAgICBhcF9jaGVja19zaWduYWxzKCk7Ci0gICAgICAgIHJ2ID0gYWNjZXB0KHNvY2tmZCwgcGVlciwgcGFkZHJsZW4pOwotICAgICAgICBlcnJubyA9IHNvY2tfZXJybm8oKTsKLSAgICB9ICAgIAotICAgIHJldHVybiBydjsKLX0KLSAgIAotLyogdGhlIGdldHBhc3MgZnVuY3Rpb24gaXMgbm90IHVzYWJsZSBvbiBUUEYgKi8KLWNoYXIgKmdldHBhc3MoY29uc3QgY2hhciogcHJvbXB0KQotewotICAgIGVycm5vID0gRUlPOwotICAgIHJldHVybigoY2hhciAqKU5VTEwpOwotfQotCi0jaWZuZGVmIF9fUElQRV8KLWludCBwaXBlKGludCBmaWxkZXNbMl0pCi17Ci0gICAgZXJybm8gPSBFTk9TWVM7Ci0gICAgcmV0dXJuKC0xKTsKLX0KLSNlbmRpZgotICAKLS8qIGZvcmsgYW5kIGV4ZWMgZnVuY3Rpb25zIGFyZSBub3QgZGVmaW5lZCBvbgotICAgVFBGIGR1ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdHBmX2ZvcmsoKSAqLwotIAotcGlkX3QgZm9yayh2b2lkKQotewotICAgIGVycm5vID0gRU5PU1lTOwotICAgIHJldHVybigtMSk7Ci19Ci0KLWludCBleGVjbChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICphcmcwLCAuLi4pCi17Ci0gICAgZXJybm8gPSBFTk9TWVM7Ci0gICAgcmV0dXJuKC0xKTsKLX0KLQotaW50IGV4ZWNsZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICphcmcwLCAuLi4pCi17Ci0gICAgZXJybm8gPSBFTk9TWVM7Ci0gICAgcmV0dXJuKC0xKTsKLX0KLQotaW50IGV4ZWN2ZShjb25zdCBjaGFyICpwYXRoLCBjaGFyICpjb25zdCBhcmd2W10sIGNoYXIgKmNvbnN0IGVudnBbXSkKLXsKLSAgICBlcnJubyA9IEVOT1NZUzsKLSAgICByZXR1cm4oLTEpOwotfQotCi1pbnQgZXhlY3ZwKGNvbnN0IGNoYXIgKmZpbGUsIGNoYXIgKmNvbnN0IGFyZ3ZbXSkKLXsKLSAgICBlcnJubyA9IEVOT1NZUzsKLSAgICByZXR1cm4oLTEpOwotfQotCi0KLQotaW50IGFwX3RwZl9zcGF3bl9jaGlsZChhcF9jb250ZXh0X3QgKnAsIGludCAoKmZ1bmMpICh2b2lkICosIGNoaWxkX2luZm8gKiksCi0gICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGVudW0ga2lsbF9jb25kaXRpb25zIGtpbGxfaG93LAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBpcGVfaW4sIGludCAqcGlwZV9vdXQsIGludCAqcGlwZV9lcnIsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRfZmRzW10sIGludCBpbl9mZHNbXSwgaW50IGVycl9mZHNbXSkKLQotewotCi0gICBpbnQgICAgICAgICAgICAgICAgICAgICAgaSwgdGVtcF9vdXQsIHRlbXBfaW4sIHRlbXBfZXJyLCBzYXZlX2Vycm5vLCBwaWQsIHJlc3VsdD0wOwotICAgaW50ICAgICAgICAgICAgICAgICAgICAgIGZkX2ZsYWdzX291dCwgZmRfZmxhZ3NfaW4sIGZkX2ZsYWdzX2VycjsKLSAgIHN0cnVjdCB0cGZfZm9ya19pbnB1dCAgICBmb3JrX2lucHV0OwotICAgVFBGX0ZPUktfQ0hJTEQgICAgICAgICAgICpjbGQgPSAoVFBGX0ZPUktfQ0hJTEQgKikgZGF0YTsKLSAgIGFwX2FycmF5X2hlYWRlcl90ICAgICAgICAgICAgICplbnZfYXJyID0gYXBfdGFibGVfZWx0cyAoKGFycmF5X2hlYWRlciAqKSBjbGQtPnN1YnByb2Nlc3NfZW52KTsKLSAgIHRhYmxlX2VudHJ5ICAgICAgICAgICAgICAqZWx0cyA9ICh0YWJsZV9lbnRyeSAqKSBlbnZfYXJyLT5lbHRzOwotCi0KLQotICAgaWYgKGZ1bmMpIHsKLSAgICAgIGlmIChyZXN1bHQ9ZnVuYyhkYXRhLCBOVUxMKSkgewotICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgLyogZXJyb3IgZnJvbSBjaGlsZCBmdW5jdGlvbiAqLwotICAgICAgfQotICAgfQotCi0gICBpZiAocGlwZV9vdXQpIHsKLSAgICAgIGZkX2ZsYWdzX291dCA9IGZjbnRsKG91dF9mZHNbMF0sIEZfR0VURkQpOwotICAgICAgZmNudGwob3V0X2Zkc1swXSwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7Ci0gICAgICB0ZW1wX291dCA9IGR1cChTVERPVVRfRklMRU5PKTsKLSAgICAgIGZjbnRsKHRlbXBfb3V0LCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKLSAgICAgIGR1cDIob3V0X2Zkc1sxXSwgU1RET1VUX0ZJTEVOTyk7Ci0gICB9Ci0KLQotICAgaWYgKHBpcGVfaW4pIHsKLSAgICAgIGZkX2ZsYWdzX2luID0gZmNudGwoaW5fZmRzWzFdLCBGX0dFVEZEKTsKLSAgICAgIGZjbnRsKGluX2Zkc1sxXSwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7Ci0gICAgICB0ZW1wX2luID0gZHVwKFNURElOX0ZJTEVOTyk7Ci0gICAgICBmY250bCh0ZW1wX2luLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKLSAgICAgIGR1cDIoaW5fZmRzWzBdLCBTVERJTl9GSUxFTk8pOwotICAgfQotCi0gICBpZiAocGlwZV9lcnIpIHsKLSAgICAgIGZkX2ZsYWdzX2VyciA9IGZjbnRsKGVycl9mZHNbMF0sIEZfR0VURkQpOwotICAgICAgZmNudGwoZXJyX2Zkc1swXSwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7Ci0gICAgICB0ZW1wX2VyciA9IGR1cChTVERFUlJfRklMRU5PKTsKLSAgICAgIGZjbnRsKHRlbXBfZXJyLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKLSAgICAgIGR1cDIoZXJyX2Zkc1sxXSwgU1RERVJSX0ZJTEVOTyk7Ci0gICB9Ci0KLSAgIGlmIChjbGQtPnN1YnByb2Nlc3NfZW52KSB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgZW52X2Fyci0+bmVsdHM7ICsraSkgewotICAgICAgICAgICBpZiAoIWVsdHNbaV0ua2V5KQotICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIHNldGVudiAoZWx0c1tpXS5rZXksIGVsdHNbaV0udmFsLCAxKTsKLSAgICAgICB9Ci0gICB9Ci0KLSAgIGZvcmtfaW5wdXQucHJvZ3JhbSA9IChjb25zdCBjaGFyKikgY2xkLT5maWxlbmFtZTsKLSAgIGZvcmtfaW5wdXQucHJvZ190eXBlID0gY2xkLT5wcm9nX3R5cGU7Ci0gICBmb3JrX2lucHV0LmlzdHJlYW0gPSBUUEZfRk9SS19JU19CQUxBTkNFOwotICAgZm9ya19pbnB1dC5lYndfZGF0YV9sZW5ndGggPSAwOwotICAgZm9ya19pbnB1dC5lYndfZGF0YSA9IE5VTEw7Ci0gICBmb3JrX2lucHV0LnBhcm1fZGF0YSA9IE5VTEw7Ci0KLQotICAgaWYgKChwaWQgPSB0cGZfZm9yaygmZm9ya19pbnB1dCkpIDwgMCkgewotICAgICAgIHNhdmVfZXJybm8gPSBlcnJubzsKLSAgICAgICBpZiAocGlwZV9vdXQpIHsKLSAgICAgICAgICAgY2xvc2Uob3V0X2Zkc1swXSk7Ci0gICAgICAgfQotICAgICAgIGlmIChwaXBlX2luKSB7Ci0gICAgICAgICAgIGNsb3NlKGluX2Zkc1sxXSk7Ci0gICAgICAgfQotICAgICAgIGlmIChwaXBlX2VycikgewotICAgICAgICAgICBjbG9zZShlcnJfZmRzWzBdKTsKLSAgICAgICB9Ci0gICAgICAgZXJybm8gPSBzYXZlX2Vycm5vOwotICAgICAgIHBpZCA9IDA7Ci0gICB9Ci0KLSAgIGlmIChjbGQtPnN1YnByb2Nlc3NfZW52KSB7Ci0gICAgICAgZm9yIChpID0gMDsgaSA8IGVudl9hcnItPm5lbHRzOyArK2kpIHsKLSAgICAgICAgICAgIGlmICghZWx0c1tpXS5rZXkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB1bnNldGVudiAoZWx0c1tpXS5rZXkpOwotICAgICAgIH0KLSAgIH0KLQotICAgaWYgKHBpcGVfb3V0KSB7Ci0gICAgICAgY2xvc2Uob3V0X2Zkc1sxXSk7Ci0gICAgICAgZHVwMih0ZW1wX291dCwgU1RET1VUX0ZJTEVOTyk7Ci0gICAgICAgY2xvc2UodGVtcF9vdXQpOwotICAgICAgIGZjbnRsKG91dF9mZHNbMF0sIEZfU0VURkQsIGZkX2ZsYWdzX291dCk7Ci0gICB9Ci0KLSAgIGlmIChwaXBlX2luKSB7Ci0gICAgICAgY2xvc2UoaW5fZmRzWzBdKTsKLSAgICAgICBkdXAyKHRlbXBfaW4sIFNURElOX0ZJTEVOTyk7Ci0gICAgICAgY2xvc2UodGVtcF9pbik7Ci0gICAgICAgZmNudGwoaW5fZmRzWzFdLCBGX1NFVEZELCBmZF9mbGFnc19pbik7Ci0gICB9Ci0KLQotICAgaWYgKHBpcGVfZXJyKSB7Ci0gICAgICAgY2xvc2UoZXJyX2Zkc1sxXSk7Ci0gICAgICAgZHVwMih0ZW1wX2VyciwgU1RERVJSX0ZJTEVOTyk7Ci0gICAgICAgY2xvc2UodGVtcF9lcnIpOwotICAgICAgIGZjbnRsKGVycl9mZHNbMF0sIEZfU0VURkQsIGZkX2ZsYWdzX2Vycik7Ci0gICB9Ci0KLQotICAgaWYgKHBpZCkgewotCi0gICAgICAgYXBfbm90ZV9zdWJwcm9jZXNzKHAsIHBpZCwga2lsbF9ob3cpOwotCi0gICAgICAgaWYgKHBpcGVfb3V0KSB7Ci0gICAgICAgICAgKnBpcGVfb3V0ID0gb3V0X2Zkc1swXTsKLSAgICAgICB9Ci0gICAgICAgaWYgKHBpcGVfaW4pIHsKLSAgICAgICAgICAqcGlwZV9pbiA9IGluX2Zkc1sxXTsKLSAgICAgICB9Ci0gICAgICAgaWYgKHBpcGVfZXJyKSB7Ci0gICAgICAgICAgKnBpcGVfZXJyID0gZXJyX2Zkc1swXTsKLSAgICAgICB9Ci0gICB9Ci0KLSAgIHJldHVybiBwaWQ7Ci0KLX0KLQotcGlkX3Qgb3NfZm9yayhzZXJ2ZXJfcmVjICpzLCBpbnQgc2xvdCkKLXsKLSAgICBzdHJ1Y3QgdHBmX2ZvcmtfaW5wdXQgZm9ya19pbnB1dDsKLSAgICBBUEFDSEVfVFBGX0lOUFVUIGlucHV0X3Bhcm1zOwotICAgIGludCBjb3VudDsKLSAgICBsaXN0ZW5fcmVjICpscjsKLQotICAgIGZmbHVzaChzdGRpbik7Ci0gICAgaWYgKGR1cDIoZmlsZW5vKHNvY2tfZnApLCBTVERJTl9GSUxFTk8pID09IC0xKQotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQ1JJVCwgcywKLSAgICAgICAgInVuYWJsZSB0byByZXBsYWNlIHN0ZGluIHdpdGggc29jayBkZXZpY2UgZHJpdmVyIik7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgaWYgKGR1cDIoZmlsZW5vKHNvY2tfZnApLCBTVERPVVRfRklMRU5PKSA9PSAtMSkKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0NSSVQsIHMsCi0gICAgICAgICJ1bmFibGUgdG8gcmVwbGFjZSBzdGRvdXQgd2l0aCBzb2NrIGRldmljZSBkcml2ZXIiKTsKLSAgICBpbnB1dF9wYXJtcy5nZW5lcmF0aW9uID0gYXBfbXlfZ2VuZXJhdGlvbjsKLSNpZmRlZiBTQ09SRUJPQVJEX0ZJTEUKLSAgICBpbnB1dF9wYXJtcy5zY29yZWJvYXJkX2ZkID0gc2NvcmVib2FyZF9mZDsKLSNlbHNlIC8qIG11c3QgYmUgVVNFX1RQRl9TQ09SRUJPQVJEIG9yIFVTRV9TSE1HRVRfU0NPUkVCT0FSRCAqLwotICAgIGlucHV0X3Bhcm1zLnNjb3JlYm9hcmRfaGVhcCA9IGFwX3Njb3JlYm9hcmRfaW1hZ2U7Ci0jZW5kaWYKLQotICAgIGxyID0gYXBfbGlzdGVuZXJzOwotICAgIGNvdW50ID0gMDsKLSAgICBkbyB7Ci0gICAgICAgIGlucHV0X3Bhcm1zLmxpc3RlbmVyc1tjb3VudF0gPSBsci0+ZmQ7Ci0gICAgICAgIGxyID0gbHItPm5leHQ7Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgfSB3aGlsZShsciAhPSBhcF9saXN0ZW5lcnMpOwotCi0gICAgaW5wdXRfcGFybXMuc2xvdCA9IHNsb3Q7Ci0gICAgaW5wdXRfcGFybXMucmVzdGFydF90aW1lID0gYXBfcmVzdGFydF90aW1lOwotICAgIGZvcmtfaW5wdXQuZWJ3X2RhdGEgPSAmaW5wdXRfcGFybXM7Ci0gICAgZm9ya19pbnB1dC5wcm9ncmFtID0gYXBfc2VydmVyX2FyZ3YwOwotICAgIGZvcmtfaW5wdXQucHJvZ190eXBlID0gVFBGX0ZPUktfTkFNRTsKLSAgICBmb3JrX2lucHV0LmlzdHJlYW0gPSBUUEZfRk9SS19JU19CQUxBTkNFOwotICAgIGZvcmtfaW5wdXQuZWJ3X2RhdGFfbGVuZ3RoID0gc2l6ZW9mKGlucHV0X3Bhcm1zKTsKLSAgICBmb3JrX2lucHV0LnBhcm1fZGF0YSA9ICIteCI7Ci0gICAgcmV0dXJuIHRwZl9mb3JrKCZmb3JrX2lucHV0KTsKLX0KLQotaW50IG9zX2NoZWNrX3NlcnZlcihjaGFyICpzZXJ2ZXIpIHsKLSAgICAjaWZuZGVmIFVTRV9UUEZfREFFTU9OCi0gICAgaW50IHJ2OwotICAgIGludCAqY3VycmVudF9hY247Ci0gICAgaWYoKHJ2ID0gaW5ldGRfZ2V0U2VydmVyU3RhdHVzKHNlcnZlcikpID09IElORVREX1NFUlZFUl9TVEFUVVNfSU5BQ1RJVkUpCi0gICAgICAgIHJldHVybiAxOwotICAgIGVsc2UgewotICAgICAgICBjdXJyZW50X2FjbiA9IChpbnQgKiljaW5mY19mYXN0KENJTkZDX0NNTUFDTlVNKTsKLSAgICAgICAgaWYoZWNicDIoKS0+Y2UyYWNuICE9ICpjdXJyZW50X2FjbikKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICAjZW5kaWYKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBvc19ub3RlX2FkZGl0aW9uYWxfY2xlYW51cHMoYXBfY29udGV4dF90ICpwLCBpbnQgc2QpIHsKLSAgICBjaGFyIHNvY2tmaWxlbmFtZVs1MF07Ci0gICAgLyogd3JpdGUgdGhlIHNvY2tldCB0byBmaWxlIHNvIHRoYXQgVFBGIHNvY2tldCBkZXZpY2UgZHJpdmVyIHdpbGwgY2xvc2Ugc29ja2V0IGluIGNhc2UKLSAgICAgICB3ZSBoYXBwZW4gdG8gYWJlbmQuICovCi0gICAgc3ByaW50Zihzb2NrZmlsZW5hbWUsICIvZGV2L3RwZi5zb2NrZXQuZmlsZS8lLjhYIiwgc2QpOwotICAgIHNvY2tfZnAgPSBmb3Blbihzb2NrZmlsZW5hbWUsICJyKyIpOwotICAgIGFwX25vdGVfY2xlYW51cHNfZm9yX2ZpbGUocCwgc29ja19mcCk7ICAvKiBhcnJhbmdlIHRvIGNsb3NlIG9uIGV4ZWMgb3IgcmVzdGFydCAqLwotICAgIGZjbnRsKHNkLEZfU0VURkQsRkRfQ0xPRVhFQyk7Ci19Ci0KLXZvaWQgb3NfdHBmX2NoaWxkKEFQQUNIRV9UUEZfSU5QVVQgKmlucHV0X3Bhcm1zKSB7Ci0gICAgdHBmX2NoaWxkID0gMTsKLSAgICBhcF9teV9nZW5lcmF0aW9uID0gaW5wdXRfcGFybXMtPmdlbmVyYXRpb247Ci0gICAgYXBfcmVzdGFydF90aW1lID0gaW5wdXRfcGFybXMtPnJlc3RhcnRfdGltZTsKLX0KLQotCmRpZmYgLS1naXQgYS9vcy90cGYvb3MuaCBiL29zL3RwZi9vcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjY1MzIyLi4wMDAwMDAwCi0tLSBhL29zL3RwZi9vcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLSNpZm5kZWYgQVBBQ0hFX09TX0gKLSNkZWZpbmUgQVBBQ0hFX09TX0gKLQotI2RlZmluZSBQTEFURk9STSAiVFBGIgotCi0jaWZkZWYgZXJybm8KLSN1bmRlZiBlcnJubwotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIGZpbGUgaW4gaW5jbHVkZWQgaW4gYWxsIEFwYWNoZSBzb3VyY2UgY29kZS4gSXQgY29udGFpbnMgZGVmaW5pdGlvbnMKLSAqIG9mIGZhY2lsaXRpZXMgYXZhaWxhYmxlIG9uIF90aGlzXyBvcGVyYXRpbmcgc3lzdGVtIChIQVZFXyogbWFjcm9zKSwKLSAqIGFuZCBwcm90b3R5cGVzIG9mIE9TIHNwZWNpZmljIGZ1bmN0aW9ucyBkZWZpbmVkIGluIG9zLmMgb3Igb3MtaW5saW5lLmMKLSAqLwotCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0KLSNpZiAhZGVmaW5lZChJTkxJTkUpICYmIGRlZmluZWQoVVNFX0dOVV9JTkxJTkUpCi0vKiBDb21waWxlciBzdXBwb3J0cyBpbmxpbmUsIHNvIGluY2x1ZGUgdGhlIGlubGluZWFibGUgZnVuY3Rpb25zIGFzCi0gKiBwYXJ0IG9mIHRoZSBoZWFkZXIKLSAqLwotI2RlZmluZSBJTkxJTkUgZXh0ZXJuIGFwX2lubGluZQotI2luY2x1ZGUgIm9zLWlubGluZS5jIgotI2VuZGlmCi0KLSNpZm5kZWYgSU5MSU5FCi0vKiBDb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IGlubGluZSwgc28gcHJvdG90eXBlIHRoZSBpbmxpbmVhYmxlIGZ1bmN0aW9ucwotICogYXMgbm9ybWFsCi0gKi8KLWV4dGVybiBpbnQgYXBfb3NfaXNfcGF0aF9hYnNvbHV0ZShjb25zdCBjaGFyICpmKTsKLSNlbmRpZgotCi0vKiBPdGhlciBhcF9vc18gcm91dGluZXMgbm90IHVzZWQgYnkgdGhpcyBwbGF0Zm9ybSAqLwotCi0jZGVmaW5lIGFwX29zX2lzX2ZpbGVuYW1lX3ZhbGlkKGYpICAgICAgICAgICgxKQotI2RlZmluZSBhcF9vc19raWxsKHBpZCwgc2lnKSAgICAgICAgICAgICAgICBraWxsKHBpZCwgc2lnKQotCi0vKiBTb3JyeSBpZiB0aGlzIGlzIHVnbHksIGJ1dCB0aGUgaW5jbHVkZSBvcmRlciBkb2Vzbid0IGFsbG93IG1lCi0gKiB0byB1c2UgcmVxdWVzdF9yZWMgaGVyZS4uLiAqLwotc3RydWN0IHJlcXVlc3RfcmVjOwotZXh0ZXJuIGludCBhcF9jaGVja2NvbnYoc3RydWN0IHJlcXVlc3RfcmVjICpyKTsKLSAKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jaWZuZGVmIF9fc3RyaW5nc19oCi0KLSNkZWZpbmUgRkRfU0VUU0laRSAgICAyMDQ4IAotIAotdHlwZWRlZiBsb25nIGZkX21hc2s7Ci0KLSNkZWZpbmUgTkJCWSAgICA4ICAgIC8qIG51bWJlciBvZiBiaXRzIGluIGEgYnl0ZSAqLwotI2RlZmluZSBORkRCSVRTIChzaXplb2YoZmRfbWFzaykgKiBOQkJZKQotI2RlZmluZSAgaG93bWFueSh4LCB5KSAgKCgoeCkrKCh5KS0xKSkvKHkpKQotCi10eXBlZGVmIHN0cnVjdCBmZF9zZXQgeyAKLSAgICAgICAgZmRfbWFzayBmZHNfYml0cyBbaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKV07Ci19IGZkX3NldDsgCi0KLSNkZWZpbmUgRkRfQ0xSKG4sIHApKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdICY9IH4oMSA8PCAoKG4pICUgTkZEQklUUykpKQotI2RlZmluZSBGRF9JU1NFVChuLCBwKSgocCktPmZkc19iaXRzWyhuKS9ORkRCSVRTXSAmICgxIDw8KChuKSAlIE5GREJJVFMpKSkKLSNkZWZpbmUgIEZEX1pFUk8ocCkgICBtZW1zZXQoKGNoYXIgKikocCksIDAsIHNpemVvZigqKHApKSkKLSNlbmRpZgotICAgIAotI2lmZGVmIEZEX1NFVAotI3VuZGVmIEZEX1NFVAotI2RlZmluZSBGRF9TRVQobiwgcCkgKDApCi0jZW5kaWYKLQotI2RlZmluZSAgUkVTT1VSQ0VfS0VZICgodm9pZCopIDB4QzFDMkMxQzMpCi0KLS8qIFRQRiBkb2Vzbid0IGhhdmUsIG9yIG5lZWQsIHR6c2V0IChpdCBpcyB1c2VkIGluIG1vZF9leHBpcmVzLmMpICovCi0jZGVmaW5lIHR6c2V0KCkKLQotI2luY2x1ZGUgPGkkbmV0ZC5oPgotc3RydWN0IGFwYWNoZV9pbnB1dCB7Ci0gICAgSU5FVERfU0VSVkVSX0lOUFVUICBpbmV0ZF9zZXJ2ZXI7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAqc2NvcmVib2FyZF9oZWFwOyAgIC8qIHNjb3JlYm9hcmQgc3lzdGVtIGhlYXAgYWRkcmVzcyAqLwotICAgIGludCAgICAgICAgICAgICAgICAgc2NvcmVib2FyZF9mZDsgICAgICAvKiBzY29yZWJvYXJkIGZpbGUgZGVzY3JpcHRvciAqLwotICAgIGludCAgICAgICAgICAgICAgICAgc2xvdDsgICAgICAgICAgICAgICAvKiBjaGlsZCBudW1iZXIgKi8KLSAgICBpbnQgICAgICAgICAgICAgICAgIGdlbmVyYXRpb247ICAgICAgICAgLyogc2VydmVyIGdlbmVyYXRpb24gbnVtYmVyICovCi0gICAgaW50ICAgICAgICAgICAgICAgICBsaXN0ZW5lcnNbMTBdOwotICAgIHRpbWVfdCAgICAgICAgICAgICAgcmVzdGFydF90aW1lOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgYXBhY2hlX2lucHV0IEFQQUNIRV9UUEZfSU5QVVQ7Ci0KLXR5cGVkZWYgc3RydWN0IHRwZl9mb3JrX2NoaWxkIHsKLSAgICAgY2hhciAgKmZpbGVuYW1lOwotICAgICBlbnVtIHsgRk9SS19OQU1FID0gMSwgRk9SS19GSUxFID0gMiB9IHByb2dfdHlwZTsKLSAgICAgdm9pZCAgKnN1YnByb2Nlc3NfZW52OwotfVRQRl9GT1JLX0NISUxEOwotCi1pbnQgdHBmX2FjY2VwdChpbnQgc29ja2ZkLCBzdHJ1Y3Qgc29ja2FkZHIgKnBlZXIsIGludCAqcGFkZHJsZW4pOwotZXh0ZXJuIGludCB0cGZfY2hpbGQ7Ci0KLXN0cnVjdCBzZXJ2ZXJfcmVjOwotcGlkX3Qgb3NfZm9yayhzdHJ1Y3Qgc2VydmVyX3JlYyAqcywgaW50IHNsb3QpOwotaW50IG9zX2NoZWNrX3NlcnZlcihjaGFyICpzZXJ2ZXIpOwotY2hhciAqZ2V0cGFzcyhjb25zdCBjaGFyICpwcm9tcHQpOwotZXh0ZXJuIGNoYXIgKmFwX3NlcnZlcl9hcmd2MDsKLWV4dGVybiBpbnQgc2NvcmVib2FyZF9mZDsKLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpZm5kZWYgU0lHUElQRQotI2RlZmluZSBTSUdQSVBFIDE0Ci0jZW5kaWYKLSNpZmRlZiBOU0lHCi0jdW5kZWYgTlNJRwotI2VuZGlmCi0jZW5kaWYgLyohIEFQQUNIRV9PU19IKi8KZGlmZiAtLWdpdCBhL29zL3RwZi9zYW1wbGVzL2xpbmtkbGwuamNsIGIvb3MvdHBmL3NhbXBsZXMvbGlua2RsbC5qY2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NTI0YmYuLjAwMDAwMDAKLS0tIGEvb3MvdHBmL3NhbXBsZXMvbGlua2RsbC5qY2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLy9BUEFDSCBKT0IgTVNHTEVWRUw9KDEsMSksQ0xBU1M9QSxNU0dDTEFTUz1BCi0vKlJPVVRFIFBSSU5UIFhYWFhYWC5YWFhYWFgKLS8qUk9VVEUgUFVOQ0ggWFhYWFhYLlhYWFhYWAotLypOT1RJRlkgWFhYWFhYLlhYWFhYWAotLy9DQ0xFIEpDTExJQiBPUkRFUj0oU1lTMS5DQkMuU0NCQ1BSQyxTWVMxLkNFRS5TQ0VFUFJPQykKLS8vUFJFTElOSyBFWEVDIEVEQ1BMLENPTkQuTEtFRD0oMCxORSksCi0vLyBQUEFSTT0nT01WUyxETExOQU1FKHBwcHApJywKLS8vIExSRUdTSVo9JzIwNDhLJywKLS8vIExQQVJNPSdBTU9ERT0zMSxSTU9ERT1BTlksTElTVCxYUkVGJwotLy9QTEtFRC5TWVNMSUIgREQgRElTUD1TSFIsRFNOPUZTRTAwMDAuREVWUC5TVFVCLk9CCi0vLyAgICAgICAgICAgICBERCBESVNQPVNIUixEU049RlNFMDAwMC5ERVZQLkNMSUIuT0IKLS8vICAgICAgICAgICAgIEREIERJU1A9U0hSLERTTj1BQ1AuQ0xJQi5STFNFNDYuV0VCCi0vLyAgICAgICAgICAgICBERCBESVNQPVNIUixEU049QUNQLlNUVUIuUkxTRTQ2LldFQgotLy8gICAgICAgICAgICAgREQgRElTUD1TSFIsRFNOPUFDUC5DTElCLlJMU0U0MAotLy8gICAgICAgICAgICAgREQgRElTUD1TSFIsRFNOPUFDUC5TVFVCLlJMU0U0MAotLy9QTEtFRC5TWVNERUZTRCBERCBEU049QVBBMDAwMC5ERVZQLklNUE9SVFMuRFNEKHBwcHB2diksRElTUD1TSFIKLS8vUExLRUQuRFNEIEREIERTTj1BUEEwMDAwLkRFVlAuSU1QT1JUUy5EU0QsRElTUD1TSFIKLS8vUExLRUQuT0JKTElCIEREIERJU1A9U0hSLERTTj1GU0UwMDAwLkRFVlAuVEVTVC5PQgotLy8gICAgICAgICAgICAgREQgRElTUD1TSFIsRFNOPUFDUC5PQkouUkxTRTQ2LldFQgotLy8gICAgICAgICAgICAgREQgRElTUD1TSFIsRFNOPUFDUC5PQkouSU5URzk4Lk5CUwotLy8gICAgICAgICAgICAgREQgRElTUD1TSFIsRFNOPUFDUC5NQUlOLlNZU1QuT0JCU1MKLS8vICAgICAgICAgICAgIEREIERJU1A9U0hSLERTTj1BQ1AuREYuTUFJTi5TWVNULk9CQlNTCi0vLyAgICAgICAgICAgICBERCBESVNQPVNIUixEU049QUNQLk9CSi5STFNFNDAuQlNTCi0vL1BMS0VELk9CSjEgICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvYXAvYXBfY3B5c3Rybi5vJwotLy9QTEtFRC5PQkoyICAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL2FwL2FwX2V4ZWN2ZS5vJwotLy9QTEtFRC5PQkozICAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL2FwL2FwX3NpZ25hbC5vJwotLy9QTEtFRC5PQko0ICAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL2FwL2FwX3NsYWNrLm8nCi0vL1BMS0VELk9CSjUgICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvYXAvYXBfc25wcmludGYubycKLS8vUExLRUQuT0JKNiAgIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9hcC9hcF9zdHJpbmdzLm8nCi0vL1BMS0VELk9CSjcgICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvb3MvdHBmL2ViY2RpYy5vJwotLy9QTEtFRC5PQko4ICAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL29zL3RwZi9vcy5vJwotLy9QTEtFRC5PQko5ICAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL29zL3RwZi9vcy1pbmxpbmUubycKLS8vUExLRUQuT0JKMTAgIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9yZWdleC9yZWdjb21wLm8nCi0vL1BMS0VELk9CSjExICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvcmVnZXgvcmVnZXJyb3IubycKLS8vUExLRUQuT0JKMTIgIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9yZWdleC9yZWdleGVjLm8nCi0vL1BMS0VELk9CSjEzICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvcmVnZXgvcmVnZnJlZS5vJwotLy9QTEtFRC5PQkoxNCAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21haW4vYWxsb2MubycKLS8vUExLRUQuT0JKMTUgIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9tYWluL2J1ZmYubycKLS8vUExLRUQuT0JKMTYgIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9tYWluL2ZubWF0Y2gubycKLS8vUExLRUQuT0JKMTcgIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9tYWluL2h0dHBfY29uZmlnLm8nCi0vL1BMS0VELk9CSjE4ICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvbWFpbi9odHRwX2NvcmUubycKLS8vUExLRUQuT0JKMTkgIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9tYWluL2h0dHBfbG9nLm8nCi0vL1BMS0VELk9CSjIwICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvbWFpbi9odHRwX21haW4ubycKLS8vUExLRUQuT0JKMjEgIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9tYWluL2h0dHBfcHJvdG9jb2wubycKLS8vUExLRUQuT0JKMjIgIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9tYWluL2h0dHBfcmVxdWVzdC5vJwotLy9QTEtFRC5PQkoyMyAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21haW4vaHR0cF92aG9zdC5vJwotLy9QTEtFRC5PQkoyNCAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21haW4vbWQ1Yy5vJwotLy9QTEtFRC5PQkoyNSAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21haW4vcmZjMTQxMy5vJwotLy9QTEtFRC5PQkoyNiAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21haW4vdXRpbC5vJwotLy9QTEtFRC5PQkoyNyAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21haW4vdXRpbF9kYXRlLm8nCi0vL1BMS0VELk9CSjI4ICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvbWFpbi91dGlsX21kNS5vJwotLy9QTEtFRC5PQkoyOSAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21haW4vdXRpbF9zY3JpcHQubycKLS8vUExLRUQuT0JKMzAgIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9tYWluL3V0aWxfdXJpLm8nCi0vL1BMS0VELk9CSjMxICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvbW9kdWxlcy5vJwotLy9QTEtFRC5PQkozMiAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL2J1aWxkbWFyay5vJwotLy9QTEtFRC5PQkozMyAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21vZHVsZXMvc3RhbmRhcmQvbW9kX2F1dG9cCi0vLyAgICAgICAgICAgICBpbmRleC5vJwotLy9QTEtFRC5PQkozNCAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21vZHVsZXMvc3RhbmRhcmQvbW9kX2Rpci5cCi0vLyAgICAgICAgICAgICBvJwotLy9QTEtFRC5PQkozNSAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21vZHVsZXMvc3RhbmRhcmQvbW9kX21pbWVcCi0vLyAgICAgICAgICAgICAubycKLS8vUExLRUQuT0JKMzYgIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9tb2R1bGVzL3N0YW5kYXJkL21vZF9zZXRlXAotLy8gICAgICAgICAgICAgbnZpZi5vJwotLy9QTEtFRC5PQkozNyAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21vZHVsZXMvc3RhbmRhcmQvbW9kX2FsaWFcCi0vLyAgICAgICAgICAgICBzLm8nCi0vL1BMS0VELk9CSjM4ICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvbW9kdWxlcy9zdGFuZGFyZC9tb2RfYWNjZVwKLS8vICAgICAgICAgICAgIHNzLm8nCi0vL1BMS0VELk9CSjM5ICBERCBQQVRIPScvdXNyL2xvY2FsL2FwYWNoZS9zcmMvbW9kdWxlcy9zdGFuZGFyZC9tb2RfdXNlclwKLS8vICAgICAgICAgICAgIGRpci5vJwotLy9QTEtFRC5PQko0MCAgREQgUEFUSD0nL3Vzci9sb2NhbC9hcGFjaGUvc3JjL21vZHVsZXMvc3RhbmRhcmQvbW9kX3NwZWxcCi0vLyAgICAgICAgICAgICBpbmcubycKLS8vUExLRUQuT0JKNDEgIEREIFBBVEg9Jy91c3IvbG9jYWwvYXBhY2hlL3NyYy9tb2R1bGVzL3N0YW5kYXJkL21vZF9uZWdvXAotLy8gICAgICAgICAgICAgdGlhdGlvbi5vJwotLy9QTEtFRC5TWVNJTiBERCAqCi0gT1JERVIgQEBETE1IRFIKLSBJTkNMVURFIE9CSkxJQihDU1RSVEQ0MCkKLSBJTkNMVURFIE9CSjEKLSBJTkNMVURFIE9CSjIKLSBJTkNMVURFIE9CSjMKLSBJTkNMVURFIE9CSjQKLSBJTkNMVURFIE9CSjUKLSBJTkNMVURFIE9CSjYKLSBJTkNMVURFIE9CSjcKLSBJTkNMVURFIE9CSjgKLSBJTkNMVURFIE9CSjkKLSBJTkNMVURFIE9CSjEwCi0gSU5DTFVERSBPQkoxMQotIElOQ0xVREUgT0JKMTIKLSBJTkNMVURFIE9CSjEzCi0gSU5DTFVERSBPQkoxNAotIElOQ0xVREUgT0JKMTUKLSBJTkNMVURFIE9CSjE2Ci0gSU5DTFVERSBPQkoxNwotIElOQ0xVREUgT0JKMTgKLSBJTkNMVURFIE9CSjE5Ci0gSU5DTFVERSBPQkoyMAotIElOQ0xVREUgT0JKMjEKLSBJTkNMVURFIE9CSjIyCi0gSU5DTFVERSBPQkoyMwotIElOQ0xVREUgT0JKMjQKLSBJTkNMVURFIE9CSjI1Ci0gSU5DTFVERSBPQkoyNgotIElOQ0xVREUgT0JKMjcKLSBJTkNMVURFIE9CSjI4Ci0gSU5DTFVERSBPQkoyOQotIElOQ0xVREUgT0JKMzAKLSBJTkNMVURFIE9CSjMxCi0gSU5DTFVERSBPQkozMgotIElOQ0xVREUgT0JKMzMKLSBJTkNMVURFIE9CSjM0Ci0gSU5DTFVERSBPQkozNQotIElOQ0xVREUgT0JKMzYKLSBJTkNMVURFIE9CSjM3Ci0gSU5DTFVERSBPQkozOAotIElOQ0xVREUgT0JKMzkKLSBJTkNMVURFIE9CSjQwCi0gSU5DTFVERSBPQko0MQotLyoKLS8vKioqIFdBUk5JTkcgKioqIE5FVkVSIGNoYW5nZSAuTEsgdG8gLk9CIGluIFNZU0xNT0QhISEKLS8vTEtFRC5TWVNMTU9EIEREIERJU1A9T0xELERTTj14eHh4eHgueHh4eChwcHBwdnYpCi0vLwpkaWZmIC0tZ2l0IGEvb3MvdHBmL3NhbXBsZXMvbG9hZHNldC5qY2wgYi9vcy90cGYvc2FtcGxlcy9sb2Fkc2V0LmpjbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA1YWY4Mi4uMDAwMDAwMAotLS0gYS9vcy90cGYvc2FtcGxlcy9sb2Fkc2V0LmpjbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vT0xEUldFQiBKT0IgTVNHTEVWRUw9MSxDTEFTUz1BLE1TR0NMQVNTPVMKLS8vSk9CQ0FUIEREIERTTj1JQ0ZDQVQuRVNBV0syLERJU1A9U0hSCi0vKlJPVVRFIFBSSU5UIHh4eHh4eC54eHh4eHh4Ci0vKlJPVVRFIFBVTkNIIHh4eHh4eC54eHh4eHh4Ci0vL1RMRFIgICBFWEVDICBQR009VFBGTERSQ0EsUkVHSU9OPThNLAotLy8gICAgICAgICAgICAgUEFSTT0nT0xEUixTWVM9QUNQLENMTVNJWkU9ODAwMDAwMCcKLS8vU1RFUExJQiAgREQgIERTTj1BQ1AuTElOSy5STFNFNDYuV0VCLERJU1A9U0hSCi0vLyAgICAgICAgIEREICBEU049QUNQLkxJTksuUkxTRTQwLkJTUyxESVNQPVNIUgotLy8gICAgICAgICBERCAgRFNOPVZJUzAwMDAuREVWUC5URVNULkxLLERJU1A9U0hSCi0vLyAgICAgICAgIEREICBEU049U1lTMS5DRUUuU0NFRVJVTixESVNQPVNIUgotLy9TQUxUQiAgICBERCAgRFNOPUFDUC5TQUxUQkwuUkxTRTQ2LldFQixESVNQPVNIUgotLy8gICAgICAgICBERCAgRFNOPUFDUC5TQUxUQkwuSU5URzQ2LldFQixESVNQPVNIUgotLy9PQkpMSUIgICBERCAgRFNOPUZTRTAwMDAuREVWUC5URVNULk9CLERJU1A9U0hSCi0vLyAgICAgICAgIEREICBEU049QVBBMDAwMC5ERVZQLlRFU1QuT0IsRElTUD1TSFIKLS8vICAgICAgICAgREQgIERTTj1BQ1AuRFJWRS5URVNULk9CLERJU1A9U0hSCi0vLyAgICAgICAgIEREICBEU049QUNQLk9CSi5STFNFNDYuV0VCLERJU1A9U0hSCi0vLyAgICAgICAgIEREICBEU049QUNQLk9CSi5JTlRHMzYuRFJWLERJU1A9U0hSCi0vLyAgICAgICAgIEREICBEU049QUNQLk9CSi5JTlRHNDYuV0VCLERJU1A9U0hSCi0vLyAgICAgICAgIEREICBEU049QUNQLk9CSi5JTlRHNDAuQlNTLERJU1A9U0hSCi0vL0xPQURNT0QgIEREICBEU049RlNFMDAwMC5ERVZQLlRFU1QuTEssRElTUD1TSFIKLS8vICAgICAgICAgREQgIERTTj1BUEEwMDAwLkRFVlAuVEVTVC5MSyxESVNQPVNIUgotLy8gICAgICAgICBERCAgRFNOPUNXRUlTUy5MSU5LLERJU1A9U0hSCi0vLyAgICAgICAgIEREICBEU049QUNQLkRSVkUuVEVTVC5MSyxESVNQPVNIUgotLy8gICAgICAgICBERCAgRFNOPUFDUC5MSU5LLlJMU0U0Ni5XRUIsRElTUD1TSFIKLS8vICAgICAgICAgREQgIERTTj1BQ1AuTElOSy5JTlRHOTguTkJTLERJU1A9U0hSCi0vLyAgICAgICAgIEREICBEU049QUNQLkxJTksuSU5URzQ2LldFQixESVNQPVNIUgotLy8gICAgICAgICBERCAgRFNOPUFDUC5MSU5LLklOVEczNi5EUlYsRElTUD1TSFIKLS8vICAgICAgICAgREQgIERTTj1BQ1AuTElOSy5JTlRHNDAuQlNTLERJU1A9U0hSCi0vL0xPQURTVU0gIEREICBEU049JiZMT0FEU1VNLERJU1A9KE5FVyxQQVNTKSxVTklUPVNZU0RBLAotLy8gICAgICAgICAgICAgTFJFQ0w9MTMzLFNQQUNFPShUUkssKDEwLDEwKSksUkVDRk09RkJBCi0vL0NQUlRFTVAgIEREICBVTklUPVNZU0RBLAotLy8gICAgICAgICAgICAgRFNOPSYmQ1BSVEVNUCxTUEFDRT0oVFJLLCgxMDAsMjApKSwKLS8vICAgICAgICAgICAgIERDQj0oUkVDRk09RkIsQkxLU0laRT00MDk1LExSRUNMPTQwOTUpLAotLy8gICAgICAgICAgICAgRElTUD0oTkVXLERFTEVURSkKLS8vUFJPR1RFTVAgREQgIFVOSVQ9U1lTREEsCi0vLyAgICAgICAgICAgICBEU049JiZQUlRFTVAsU1BBQ0U9KFRSSywoMTAwLDIwKSksCi0vLyAgICAgICAgICAgICBEQ0I9KFJFQ0ZNPUZCLEJMS1NJWkU9NDA5NSxMUkVDTD00MDk1KSwKLS8vICAgICAgICAgICAgIERJU1A9KE5FVyxERUxFVEUpCi0vL09VVFBVVCAgIEREICBEU049JiZWUkRST1VULERJU1A9KE5FVyxQQVNTKSxVTklUPVNZU0RBLAotLy8gICAgICAgICAgICAgRENCPShSRUNGTT1GLEJMS1NJWkU9NDA5NSxMUkVDTD00MDk1KQotLy9TWVNVRFVNUCBERCAgRFVNTVkKLS8vU1lTQUJFTkQgREQgIERVTU1ZCi0vL1NZU09VVCAgIEREICBTWVNPVVQ9QQotLy9TWVNQUklOVCBERCAgU1lTT1VUPUEKLS8vUFJJTlRFUiAgREQgIFNZU09VVD1BCi0vL0NFRURVTVAgIEREICBTWVNPVVQ9QQotLy9TWVNJTiAgICBERCAgKgotU1lTSUQ9QlNTCi1QQVRWRVJTPU5PTkUKLVNBTFZFUlM9NDAKLUxPQURFUiAgIExPQURTRVQgIGxsbGxsbGwKLUxPQURFUiAgIENBTEwgIFBST0cgcHBwcHZ2Ci0vKgotLy9UUkFOU01JVCBFWEVDIFBHTT1JS0pFRlQwMSwKLS8vICBQQVJNPSdUUkFOU01JVCB4eHh4eHgueHh4eHh4IERETkFNRShTWVNUU0lOKSBOT0xPRyBOT05PVElGWSBTRVEnCi0vL1NZU1RTSU4gIEREICBVTklUPVNZU0RBLAotLy8gICAgICAgICAgICAgRFNOPSYmVlJEUk9VVCxESVNQPShPTEQsREVMRVRFKQotLy9TWVNUU1BSVCBERCAgRFVNTVkKZGlmZiAtLWdpdCBhL29zL3VuaXgvLmN2c2lnbm9yZSBiL29zL3VuaXgvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJjOGJhMC4uMDAwMDAwMAotLS0gYS9vcy91bml4Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLU1ha2VmaWxlCi0uZGVwcwotLmxpYnMKLSoubG8KLSoubGEKZGlmZiAtLWdpdCBhL29zL3VuaXgvTWFrZWZpbGUuaW4gYi9vcy91bml4L01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmIyZGZjLi4wMDAwMDAwCi0tLSBhL29zL3VuaXgvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0KLURFUFRIICAgICA9IC4uLy4uCi10b3BzcmNkaXIgPSBAdG9wc3JjZGlyQAotc3JjZGlyICAgID0gQHNyY2RpckAKLVZQQVRIICAgICA9IEBzcmNkaXJACi0KLUxUTElCUkFSWV9OQU1FICAgID0gbGlib3MubGEKLUxUTElCUkFSWV9TT1VSQ0VTID0gb3MuYyBvcy1pbmxpbmUuYyB1bml4ZC5jIGlvbF9zb2NrZXQuYwotCi1pbmNsdWRlICQodG9wc3JjZGlyKS9idWlsZC9sdGxpYi5tawpkaWZmIC0tZ2l0IGEvb3MvdW5peC9jb25maWcubTQgYi9vcy91bml4L2NvbmZpZy5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk2OGE0MC4uMDAwMDAwMAotLS0gYS9vcy91bml4L2NvbmZpZy5tNAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotaWYgdGVzdCAiJE9TIiA9ICJ1bml4IiA7IHRoZW4KLSAgICBBQ19DSEVDS19GVU5DUyggXAotICAgIHNldHNpZCBcCi0gICAga2lsbHBnIFwKLSAgICApCi0gICAgCi0gICAgZG5sIFhYWCAtIFRoaXMgZG9lc24ndCBkZWFsIHdpdGggX3N5c19zaWdsaXN0LiBNYXliZSBoYXZlIHRvIHJvbGwgb3VyIG93bgotICAgIEFDX0RFQ0xfU1lTX1NJR0xJU1QKLWZpCmRpZmYgLS1naXQgYS9vcy91bml4L29zLWlubGluZS5jIGIvb3MvdW5peC9vcy1pbmxpbmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFkN2E4NC4uMDAwMDAwMAotLS0gYS9vcy91bml4L29zLWlubGluZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgd2hpY2ggY2FuIGJlIGlubGluZWQgaWYgdGhlIGNvbXBpbGVyCi0gKiBoYXMgYW4gImlubGluZSIgbW9kaWZpZXIuIEJlY2F1c2Ugb2YgdGhpcywgdGhpcyBmaWxlIGlzIGJvdGggYQotICogaGVhZGVyIGZpbGUgYW5kIGEgY29tcGlsYWJsZSBtb2R1bGUuCi0gKgotICogT25seSBpbmxpbmVhYmxlIGZ1bmN0aW9ucyBzaG91bGQgYmUgZGVmaW5lZCBpbiBoZXJlLiBUaGV5IG11c3QgYWxsCi0gKiBpbmNsdWRlIHRoZSBJTkxJTkUgbW9kaWZpZXIuIAotICoKLSAqIElmIHRoZSBjb21waWxlciBzdXBwb3J0cyBpbmxpbmUsIHRoaXMgZmlsZSB3aWxsIGJlICNpbmNsdWRlZCBhcyBhCi0gKiBoZWFkZXIgZmlsZSBmcm9tIG9zLmggdG8gY3JlYXRlIGFsbCB0aGUgaW5saW5lIGZ1bmN0aW9uCi0gKiBkZWZpbml0aW9ucy4gSU5MSU5FIHdpbGwgYmUgZGVmaW5lZCB0byB3aGF0ZXZlciBpcyByZXF1aXJlZCBvbgotICogZnVuY3Rpb24gZGVmaW5pdGlvbnMgdG8gbWFrZSB0aGVtIGlubGluZSBkZWNsYXJhdGlvbnMuCi0gKgotICogSWYgdGhlIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgaW5saW5lLCB0aGlzIGZpbGUgd2lsbCBiZSBjb21waWxlZAotICogYXMgYSBub3JtYWwgQyBmaWxlIGludG8gbGlib3MuYSAoYWxvbmcgd2l0aCBvcy5jKS4gSW4gdGhpcyBjYXNlCi0gKiBJTkxJTkUgd2lsbCBfbm90XyBiZSBzZXQgc28gd2UgY2FuIHVzZSB0aGlzIHRvIHRlc3QgaWYgd2UgYXJlCi0gKiBjb21waWxpbmcgdGhpcyBzb3VyY2UgZmlsZS4gIAotICovCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpZm5kZWYgSU5MSU5FCi0jZGVmaW5lIElOTElORQotCi0vKiBBbnl0aGluZyByZXF1aXJlZCBvbmx5IHdoZW4gY29tcGlsaW5nICovCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0KLSNlbmRpZgotCi1JTkxJTkUgaW50IGFwX29zX2lzX3BhdGhfYWJzb2x1dGUoY29uc3QgY2hhciAqZmlsZSkKLXsKLSAgcmV0dXJuIGZpbGVbMF0gPT0gJy8nOwotfQpkaWZmIC0tZ2l0IGEvb3MvdW5peC9vcy5oIGIvb3MvdW5peC9vcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzVhNjY5Li4wMDAwMDAwCi0tLSBhL29zL3VuaXgvb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLSNpZm5kZWYgQVBBQ0hFX09TX0gKLSNkZWZpbmUgQVBBQ0hFX09TX0gKLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotCi0jaWZuZGVmIFBMQVRGT1JNCi0jZGVmaW5lIFBMQVRGT1JNICJVbml4IgotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIGZpbGUgaW4gaW5jbHVkZWQgaW4gYWxsIEFwYWNoZSBzb3VyY2UgY29kZS4gSXQgY29udGFpbnMgZGVmaW5pdGlvbnMKLSAqIG9mIGZhY2lsaXRpZXMgYXZhaWxhYmxlIG9uIF90aGlzXyBvcGVyYXRpbmcgc3lzdGVtIChIQVZFXyogbWFjcm9zKSwKLSAqIGFuZCBwcm90b3R5cGVzIG9mIE9TIHNwZWNpZmljIGZ1bmN0aW9ucyBkZWZpbmVkIGluIG9zLmMgb3Igb3MtaW5saW5lLmMKLSAqLwotCi0jaWYgIWRlZmluZWQoSU5MSU5FKSAmJiBkZWZpbmVkKFVTRV9HTlVfSU5MSU5FKQotLyogQ29tcGlsZXIgc3VwcG9ydHMgaW5saW5lLCBzbyBpbmNsdWRlIHRoZSBpbmxpbmVhYmxlIGZ1bmN0aW9ucyBhcwotICogcGFydCBvZiB0aGUgaGVhZGVyCi0gKi8KLSNkZWZpbmUgSU5MSU5FIGV4dGVybiBhcF9pbmxpbmUKLQotSU5MSU5FIGludCBhcF9vc19pc19wYXRoX2Fic29sdXRlKGNvbnN0IGNoYXIgKmZpbGUpOwotCi0jaW5jbHVkZSAib3MtaW5saW5lLmMiCi0KLSNlbHNlCi0KLS8qIENvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgaW5saW5lLCBzbyBwcm90b3R5cGUgdGhlIGlubGluZWFibGUgZnVuY3Rpb25zCi0gKiBhcyBub3JtYWwKLSAqLwotZXh0ZXJuIGludCBhcF9vc19pc19wYXRoX2Fic29sdXRlKGNvbnN0IGNoYXIgKmZpbGUpOwotI2VuZGlmCi0KLS8qIE90aGVyIGFwX29zXyByb3V0aW5lcyBub3QgdXNlZCBieSB0aGlzIHBsYXRmb3JtICovCi0KLSNkZWZpbmUgYXBfb3NfY2Fub25pY2FsX2ZpbGVuYW1lKHAsZikgIChmKQotI2RlZmluZSBhcF9vc19jYXNlX2Nhbm9uaWNhbF9maWxlbmFtZShwLGYpICAoZikKLSNkZWZpbmUgYXBfb3Nfc3lzdGVtY2FzZV9maWxlbmFtZShwLGYpICAoZikKLSNkZWZpbmUgYXBfb3NfaXNfZmlsZW5hbWVfdmFsaWQoZikgICAgICAgICAgKDEpCi0jZGVmaW5lIGFwX29zX2tpbGwocGlkLCBzaWcpICAgICAgICAgICAgICAgIGtpbGwocGlkLCBzaWcpCi0KLS8qCi0gKiAgQWJzdHJhY3Rpb24gbGF5ZXIgZm9yIGxvYWRpbmcKLSAqICBBcGFjaGUgbW9kdWxlcyB1bmRlciBydW4tdGltZSB2aWEgCi0gKiAgZHluYW1pYyBzaGFyZWQgb2JqZWN0IChEU08pIG1lY2hhbmlzbQotICovCi0KLSNpZmRlZiBIQVZFX0RMX0gKLSNpbmNsdWRlIDxkbC5oPgotI2VuZGlmCi0KLS8qCi0gKiBEbyBub3QgdXNlIG5hdGl2ZSBBSVggRFNPIHN1cHBvcnQgb24gcmVsZWFzZXMgb2YgQUlYIHByaW9yCi0gKiB0byBWNC4zCi0gKi8KLSNpZmRlZiBBSVgKLSNpZiBBSVggPCA0MwotI3VuZGVmIEhBVkVfRExGQ05fSAotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfRExGQ05fSAotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jZWxzZQotdm9pZCAqZGxvcGVuKGNvbnN0IGNoYXIgKiwgaW50KTsKLWludCBkbGNsb3NlKHZvaWQgKik7Ci12b2lkICpkbHN5bSh2b2lkICosIGNvbnN0IGNoYXIgKik7Ci1jb25zdCBjaGFyICpkbGVycm9yKHZvaWQpOwotI2VuZGlmCi0KLS8qIHByb2JhYmx5IG9uIGFuIG9sZGVyIHN5c3RlbSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBSVExEX05PVyBvciBSVExEX0xBWlkuCi0gKiBUaGUgYmVsb3cgZGVmaW5lIGlzIGEgbGllIHNpbmNlIHdlIGFyZSByZWFsbHkgZG9pbmcgUlRMRF9MQVpZIHNpbmNlIHRoZQotICogc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBSVExEX05PVy4KLSAqLwotI2lmbmRlZiBSVExEX05PVwotI2RlZmluZSBSVExEX05PVyAxCi0jZW5kaWYKLQotI2lmbmRlZiBSVExEX0dMT0JBTAotI2RlZmluZSBSVExEX0dMT0JBTCAwCi0jZW5kaWYKLQotI2lmIChkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fFwKLSAgICAgZGVmaW5lZChfX09wZW5CU0RfXykgfHxcCi0gICAgIGRlZmluZWQoX19OZXRCU0RfXykgICAgICkgJiYgIWRlZmluZWQoX19FTEZfXykKLSNkZWZpbmUgRExTWU1fTkVFRFNfVU5ERVJTQ09SRQotI2VuZGlmCi0KLSNkZWZpbmUgICAgIGFwX29zX2Rzb19oYW5kbGVfdCAgdm9pZCAqCi12b2lkICAgICAgICBhcF9vc19kc29faW5pdCh2b2lkKTsKLXZvaWQgKiAgICAgIGFwX29zX2Rzb19sb2FkKGNvbnN0IGNoYXIgKik7Ci12b2lkICAgICAgICBhcF9vc19kc29fdW5sb2FkKHZvaWQgKik7Ci12b2lkICogICAgICBhcF9vc19kc29fc3ltKHZvaWQgKiwgY29uc3QgY2hhciAqKTsKLWNvbnN0IGNoYXIgKmFwX29zX2Rzb19lcnJvcih2b2lkKTsKLQotI2VuZGlmCS8qICFBUEFDSEVfT1NfSCAqLwpkaWZmIC0tZ2l0IGEvb3MvdW5peC91bml4ZC5jIGIvb3MvdW5peC91bml4ZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWFhMTMwLi4wMDAwMDAwCi0tLSBhL29zL3VuaXgvdW5peGQuYworKysgL2Rldi9udWxsCkBAIC0xLDM5MyArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJ1bml4ZC5oIgotI2luY2x1ZGUgPHB3ZC5oPgotCi11bml4ZF9jb25maWdfcmVjIHVuaXhkX2NvbmZpZzsKLQotdm9pZCB1bml4ZF9kZXRhY2godm9pZCkKLXsKLSAgICBpbnQgeDsKLSAgICBwaWRfdCBwZ3JwOwotCi0gICAgY2hkaXIoIi8iKTsKLSNpZiAhZGVmaW5lZChNUEUpICYmICFkZWZpbmVkKE9TMikgJiYgIWRlZmluZWQoVFBGKQotLyogRG9uJ3QgZGV0YWNoIGZvciBNUEUgYmVjYXVzZSBjaGlsZCBwcm9jZXNzZXMgY2FuJ3Qgc3Vydml2ZSB0aGUgZGVhdGggb2YKLSAgIHRoZSBwYXJlbnQuICovCi0gICAgaWYgKCh4ID0gZm9yaygpKSA+IDApCi0JZXhpdCgwKTsKLSAgICBlbHNlIGlmICh4ID09IC0xKSB7Ci0JcGVycm9yKCJmb3JrIik7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICIlczogdW5hYmxlIHRvIGZvcmsgbmV3IHByb2Nlc3MiLCBhcF9zZXJ2ZXJfYXJndjApOwotCWV4aXQoMSk7Ci0gICAgfQotICAgIFJBSVNFX1NJR1NUT1AoREVUQUNIKTsKLSNlbmRpZgotI2lmZGVmIEhBVkVfU0VUU0lECi0gICAgaWYgKChwZ3JwID0gc2V0c2lkKCkpID09IC0xKSB7Ci0JcGVycm9yKCJzZXRzaWQiKTsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIiVzOiBzZXRzaWQgZmFpbGVkIiwgYXBfc2VydmVyX2FyZ3YwKTsKLQlleGl0KDEpOwotICAgIH0KLSNlbGlmIGRlZmluZWQoTkVYVCkgfHwgZGVmaW5lZChORVdTT1MpCi0gICAgaWYgKHNldHBncnAoMCwgZ2V0cGlkKCkpID09IC0xIHx8IChwZ3JwID0gZ2V0cGdycCgwKSkgPT0gLTEpIHsKLQlwZXJyb3IoInNldHBncnAiKTsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIiVzOiBzZXRwZ3JwIG9yIGdldHBncnAgZmFpbGVkIiwgYXBfc2VydmVyX2FyZ3YwKTsKLQlleGl0KDEpOwotICAgIH0KLSNlbGlmIGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFRQRikKLSAgICAvKiBPUy8yIGFuZCBUUEYgZG9uJ3Qgc3VwcG9ydCBwcm9jZXNzIGdyb3VwIElEcyAqLwotICAgIHBncnAgPSBnZXRwaWQoKTsKLSNlbGlmIGRlZmluZWQoTVBFKQotICAgIC8qIE1QRSB1c2VzIG5lZ2F0aXZlIHBpZCBmb3IgcHJvY2VzcyBncm91cCAqLwotICAgIHBncnAgPSAtZ2V0cGlkKCk7Ci0jZWxzZQotICAgIGlmICgocGdycCA9IHNldHBncnAoZ2V0cGlkKCksIDApKSA9PSAtMSkgewotCXBlcnJvcigic2V0cGdycCIpOwotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiJXM6IHNldHBncnAgZmFpbGVkIiwgYXBfc2VydmVyX2FyZ3YwKTsKLQlleGl0KDEpOwotICAgIH0KLSNlbmRpZgotCi0gICAgLyogY2xvc2Ugb3V0IHRoZSBzdGFuZGFyZCBmaWxlIGRlc2NyaXB0b3JzICovCi0gICAgaWYgKGZyZW9wZW4oIi9kZXYvbnVsbCIsICJyIiwgc3RkaW4pID09IE5VTEwpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIiVzOiB1bmFibGUgdG8gcmVwbGFjZSBzdGRpbiB3aXRoIC9kZXYvbnVsbDogJXMiLAotCQlhcF9zZXJ2ZXJfYXJndjAsIHN0cmVycm9yKGVycm5vKSk7Ci0JLyogY29udGludWUgYW55aG93IC0tIG5vdGUgd2UgY2FuJ3QgY2xvc2Ugb3V0IGRlc2NyaXB0b3IgMCBiZWNhdXNlIHdlCi0JICogaGF2ZSBub3RoaW5nIHRvIHJlcGxhY2UgaXQgd2l0aCwgYW5kIGlmIHdlIGRpZG4ndCBoYXZlIGEgZGVzY3JpcHRvcgotCSAqIDAgdGhlIG5leHQgZmlsZSB3b3VsZCBiZSBjcmVhdGVkIHdpdGggdGhhdCB2YWx1ZSAuLi4gbGVhZGluZyB0bwotCSAqIGhhdm9jLgotCSAqLwotICAgIH0KLSAgICBpZiAoZnJlb3BlbigiL2Rldi9udWxsIiwgInciLCBzdGRvdXQpID09IE5VTEwpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIiVzOiB1bmFibGUgdG8gcmVwbGFjZSBzdGRvdXQgd2l0aCAvZGV2L251bGw6ICVzIiwKLQkJICAgICBhcF9zZXJ2ZXJfYXJndjAsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgfQotICAgIC8qIHN0ZGVyciBpcyBhIHRyaWNreSBvbmUsIHdlIHJlYWxseSB3YW50IGl0IHRvIGJlIHRoZSBlcnJvcl9sb2csCi0gICAgICogYnV0IHdlIGhhdmVuJ3Qgb3BlbmVkIHRoYXQgeWV0LiAgU28gbGVhdmUgaXQgYWxvbmUgZm9yIG5vdyBhbmQgaXQnbGwKLSAgICAgKiBiZSByZW9wZW5lZCBtb21lbnRzIGxhdGVyLgotICAgICAqLwotfQotCi0vKiBTZXQgZ3JvdXAgcHJpdmlsZWdlcy4KLSAqCi0gKiBOb3RlIHRoYXQgd2UgdXNlIHRoZSB1c2VybmFtZSBhcyBzZXQgaW4gdGhlIGNvbmZpZyBmaWxlcywgcmF0aGVyIHRoYW4KLSAqIHRoZSBsb29rdXAgb2YgdG8gdWlkIC0tLSB0aGUgc2FtZSB1aWQgbWF5IGhhdmUgbXVsdGlwbGUgcGFzc3dkIGVudHJpZXMsCi0gKiB3aXRoIGRpZmZlcmVudCBzZXRzIG9mIGdyb3VwcyBmb3IgZWFjaC4KLSAqLwotCi1zdGF0aWMgaW50IHNldF9ncm91cF9wcml2cyh2b2lkKQotewotICAgIGlmICghZ2V0ZXVpZCgpKSB7Ci0JY2hhciAqbmFtZTsKLQotCS8qIEdldCB1c2VybmFtZSBpZiBwYXNzZWQgYXMgYSB1aWQgKi8KLQotCWlmICh1bml4ZF9jb25maWcudXNlcl9uYW1lWzBdID09ICcjJykgewotCSAgICBzdHJ1Y3QgcGFzc3dkICplbnQ7Ci0JICAgIHVpZF90IHVpZCA9IGF0b2koJnVuaXhkX2NvbmZpZy51c2VyX25hbWVbMV0pOwotCi0JICAgIGlmICgoZW50ID0gZ2V0cHd1aWQodWlkKSkgPT0gTlVMTCkgewotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlQsIGVycm5vLCBOVUxMLAotCQkJICJnZXRwd3VpZDogY291bGRuJ3QgZGV0ZXJtaW5lIHVzZXIgbmFtZSBmcm9tIHVpZCAldSwgIgotCQkJICJ5b3UgcHJvYmFibHkgbmVlZCB0byBtb2RpZnkgdGhlIFVzZXIgZGlyZWN0aXZlIiwKLQkJCSAodW5zaWduZWQpdWlkKTsKLQkJcmV0dXJuIC0xOwotCSAgICB9Ci0KLQkgICAgbmFtZSA9IGVudC0+cHdfbmFtZTsKLQl9Ci0JZWxzZQotCSAgICBuYW1lID0gdW5peGRfY29uZmlnLnVzZXJfbmFtZTsKLQotI2lmICFkZWZpbmVkKE9TMikgJiYgIWRlZmluZWQoVFBGKQotCS8qIE9TLzIgYW5kIFRQRiBkb24ndCBzdXBwb3J0IGdyb3Vwcy4gKi8KLQotCS8qCi0JICogU2V0IHRoZSBHSUQgYmVmb3JlIGluaXRncm91cHMoKSwgc2luY2Ugb24gc29tZSBwbGF0Zm9ybXMKLQkgKiBzZXRnaWQoKSBpcyBrbm93biB0byB6YXAgdGhlIGdyb3VwIGxpc3QuCi0JICovCi0JaWYgKHNldGdpZCh1bml4ZF9jb25maWcuZ3JvdXBfaWQpID09IC0xKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgZXJybm8sIE5VTEwsCi0JCQkic2V0Z2lkOiB1bmFibGUgdG8gc2V0IGdyb3VwIGlkIHRvIEdyb3VwICV1IiwKLQkJCSh1bnNpZ25lZCl1bml4ZF9jb25maWcuZ3JvdXBfaWQpOwotCSAgICByZXR1cm4gLTE7Ci0JfQotCi0JLyogUmVzZXQgYGdyb3VwcycgYXR0cmlidXRlcy4gKi8KLQotCWlmIChpbml0Z3JvdXBzKG5hbWUsIHVuaXhkX2NvbmZpZy5ncm91cF9pZCkgPT0gLTEpIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJULCBlcnJubywgTlVMTCwKLQkJCSJpbml0Z3JvdXBzOiB1bmFibGUgdG8gc2V0IGdyb3VwcyBmb3IgVXNlciAlcyAiCi0JCQkiYW5kIEdyb3VwICV1IiwgbmFtZSwgKHVuc2lnbmVkKXVuaXhkX2NvbmZpZy5ncm91cF9pZCk7Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0jZW5kaWYgLyogIWRlZmluZWQoT1MyKSAmJiAhZGVmaW5lZChUUEYpICovCi0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0KLWludCB1bml4ZF9zZXR1cF9jaGlsZCh2b2lkKQotewotICAgIGlmIChzZXRfZ3JvdXBfcHJpdnMoKSkgewotCXJldHVybiAtMTsKLSAgICB9Ci0jaWZkZWYgTVBFCi0gICAgLyogT25seSB0cnkgdG8gc3dpdGNoIGlmIHdlJ3JlIHJ1bm5pbmcgYXMgTUFOQUdFUi5TWVMgKi8KLSAgICBpZiAoZ2V0ZXVpZCgpID09IDEgJiYgdW5peGRfY29uZmlnLnVzZXJfaWQgPiAxKSB7Ci0JR0VUUFJJVk1PREUoKTsKLQlpZiAoc2V0dWlkKHVuaXhkX2NvbmZpZy51c2VyX2lkKSA9PSAtMSkgewotCSAgICBHRVRVU0VSTU9ERSgpOwotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlQsIGVycm5vLCBOVUxMLAotCQkJInNldHVpZDogdW5hYmxlIHRvIGNoYW5nZSB0byB1aWQ6ICVsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgdW5peGRfY29uZmlnLnVzZXJfaWQpOwotCSAgICBleGl0KDEpOwotCX0KLQlHRVRVU0VSTU9ERSgpOwotICAgIH0KLSNlbHNlCi0gICAgLyogT25seSB0cnkgdG8gc3dpdGNoIGlmIHdlJ3JlIHJ1bm5pbmcgYXMgcm9vdCAqLwotICAgIGlmICghZ2V0ZXVpZCgpICYmICgKLSNpZmRlZiBfT1NEX1BPU0lYCi0Jb3NfaW5pdF9qb2JfZW52aXJvbm1lbnQoc2VydmVyX2NvbmYsIHVuaXhkX2NvbmZpZy51c2VyX25hbWUsIG9uZV9wcm9jZXNzKSAhPSAwIHx8IAotI2VuZGlmCi0Jc2V0dWlkKHVuaXhkX2NvbmZpZy51c2VyX2lkKSA9PSAtMSkpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlQsIGVycm5vLCBOVUxMLAotCQkgICAgInNldHVpZDogdW5hYmxlIHRvIGNoYW5nZSB0byB1aWQ6ICVsZCIsCi0gICAgICAgICAgICAgICAgICAgIChsb25nKSB1bml4ZF9jb25maWcudXNlcl9pZCk7Ci0JcmV0dXJuIC0xOwotICAgIH0KLSNlbmRpZgotICAgIHJldHVybiAwOwotfQotCi0KLWNvbnN0IGNoYXIgKnVuaXhkX3NldF91c2VyKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHVuaXhkX2NvbmZpZy51c2VyX25hbWUgPSBhcmc7Ci0gICAgdW5peGRfY29uZmlnLnVzZXJfaWQgPSBhcF91bmFtZTJpZChhcmcpOwotI2lmICFkZWZpbmVkIChCSUdfU0VDVVJJVFlfSE9MRSkgJiYgIWRlZmluZWQgKE9TMikKLSAgICBpZiAodW5peGRfY29uZmlnLnVzZXJfaWQgPT0gMCkgewotCXJldHVybiAiRXJyb3I6XHRBcGFjaGUgaGFzIG5vdCBiZWVuIGRlc2lnbmVkIHRvIHNlcnZlIHBhZ2VzIHdoaWxlXG4iCi0JCSJcdHJ1bm5pbmcgYXMgcm9vdC4gIFRoZXJlIGFyZSBrbm93biByYWNlIGNvbmRpdGlvbnMgdGhhdFxuIgotCQkiXHR3aWxsIGFsbG93IGFueSBsb2NhbCB1c2VyIHRvIHJlYWQgYW55IGZpbGUgb24gdGhlIHN5c3RlbS5cbiIKLQkJIlx0SWYgeW91IHN0aWxsIGRlc2lyZSB0byBzZXJ2ZSBwYWdlcyBhcyByb290IHRoZW5cbiIKLQkJIlx0YWRkIC1EQklHX1NFQ1VSSVRZX0hPTEUgdG8gdGhlIEVYVFJBX0NGTEFHUyBsaW5lIGluIHlvdXJcbiIKLQkJIlx0c3JjL0NvbmZpZ3VyYXRpb24gZmlsZSBhbmQgcmVidWlsZCB0aGUgc2VydmVyLiAgSXQgaXNcbiIKLQkJIlx0c3Ryb25nbHkgc3VnZ2VzdGVkIHRoYXQgeW91IGluc3RlYWQgbW9kaWZ5IHRoZSBVc2VyXG4iCi0JCSJcdGRpcmVjdGl2ZSBpbiB5b3VyIGh0dHBkLmNvbmYgZmlsZSB0byBsaXN0IGEgbm9uLXJvb3RcbiIKLQkJIlx0dXNlci5cbiI7Ci0gICAgfQotI2VuZGlmCi0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotY29uc3QgY2hhciAqdW5peGRfc2V0X2dyb3VwKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHVuaXhkX2NvbmZpZy5ncm91cF9pZCA9IGFwX2duYW1lMmlkKGFyZyk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZCB1bml4ZF9wcmVfY29uZmlnKHZvaWQpCi17Ci0gICAgdW5peGRfY29uZmlnLnVzZXJfbmFtZSA9IERFRkFVTFRfVVNFUjsKLSAgICB1bml4ZF9jb25maWcudXNlcl9pZCA9IGFwX3VuYW1lMmlkKERFRkFVTFRfVVNFUik7Ci0gICAgdW5peGRfY29uZmlnLmdyb3VwX2lkID0gYXBfZ25hbWUyaWQoREVGQVVMVF9HUk9VUCk7Ci19Ci0KLSNpZmRlZiBORUVEX0FQX1NZU19TSUdMSVNUCi0KLWNvbnN0IGNoYXIgKmFwX3N5c19zaWdsaXN0W051bVNJR107Ci0KLXZvaWQgdW5peGRfc2lnbGlzdF9pbml0KHZvaWQpCi17Ci0gICAgaW50IHNpZzsKLQotICAgIGFwX3N5c19zaWdsaXN0WzBdID0gIlNpZ25hbCAwIjsKLSNpZmRlZiBTSUdIVVAKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdIVVBdID0gIkhhbmd1cCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdJTlQKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdJTlRdID0gIkludGVycnVwdCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdRVUlUCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHUVVJVF0gPSAiUXVpdCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdJTEwKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdJTExdID0gIklsbGVnYWwgaW5zdHJ1Y3Rpb24iOwotI2VuZGlmCi0jaWZkZWYgU0lHVFJBUAotICAgIGFwX3N5c19zaWdsaXN0W1NJR1RSQVBdID0gIlRyYWNlL0JQVCB0cmFwIjsKLSNlbmRpZgotI2lmZGVmIFNJR0lPVAotICAgIGFwX3N5c19zaWdsaXN0W1NJR0lPVF0gPSAiSU9UIGluc3RydWN0aW9uIjsKLSNlbmRpZgotI2lmZGVmIFNJR0FCUlQKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdBQlJUXSA9ICJBYm9ydCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdFTVQKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdFTVRdID0gIkVtdWxhdG9yIHRyYXAiOwotI2VuZGlmCi0jaWZkZWYgU0lHRlBFCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHRlBFXSA9ICJBcml0aG1ldGljIGV4Y2VwdGlvbiI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdLSUxMCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHS0lMTF0gPSAiS2lsbGVkIjsKLSNlbmRpZgotI2lmZGVmIFNJR0JVUwotICAgIGFwX3N5c19zaWdsaXN0W1NJR0JVU10gPSAiQnVzIGVycm9yIjsKLSNlbmRpZgotI2lmZGVmIFNJR1NFR1YKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdTRUdWXSA9ICJTZWdtZW50YXRpb24gZmF1bHQiOwotI2VuZGlmCi0jaWZkZWYgU0lHU1lTCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHU1lTXSA9ICJCYWQgc3lzdGVtIGNhbGwiOwotI2VuZGlmCi0jaWZkZWYgU0lHUElQRQotICAgIGFwX3N5c19zaWdsaXN0W1NJR1BJUEVdID0gIkJyb2tlbiBwaXBlIjsKLSNlbmRpZgotI2lmZGVmIFNJR0FMUk0KLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdBTFJNXSA9ICJBbGFybSBjbG9jayI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdURVJNCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHVEVSTV0gPSAiVGVybWluYXRlZCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdVU1IxCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHVVNSMV0gPSAiVXNlciBkZWZpbmVkIHNpZ25hbCAxIjsKLSNlbmRpZgotI2lmZGVmIFNJR1VTUjIKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdVU1IyXSA9ICJVc2VyIGRlZmluZWQgc2lnbmFsIDIiOwotI2VuZGlmCi0jaWZkZWYgU0lHQ0xECi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHQ0xEXSA9ICJDaGlsZCBzdGF0dXMgY2hhbmdlIjsKLSNlbmRpZgotI2lmZGVmIFNJR0NITEQKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdDSExEXSA9ICJDaGlsZCBzdGF0dXMgY2hhbmdlIjsKLSNlbmRpZgotI2lmZGVmIFNJR1BXUgotICAgIGFwX3N5c19zaWdsaXN0W1NJR1BXUl0gPSAiUG93ZXItZmFpbCByZXN0YXJ0IjsKLSNlbmRpZgotI2lmZGVmIFNJR1dJTkNICi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHV0lOQ0hdID0gIldpbmRvdyBjaGFuZ2VkIjsKLSNlbmRpZgotI2lmZGVmIFNJR1VSRwotICAgIGFwX3N5c19zaWdsaXN0W1NJR1VSR10gPSAidXJnZW50IHNvY2tldCBjb25kaXRpb24iOwotI2VuZGlmCi0jaWZkZWYgU0lHUE9MTAotICAgIGFwX3N5c19zaWdsaXN0W1NJR1BPTExdID0gIlBvbGxhYmxlIGV2ZW50IG9jY3VycmVkIjsKLSNlbmRpZgotI2lmZGVmIFNJR0lPCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHSU9dID0gInNvY2tldCBJL08gcG9zc2libGUiOwotI2VuZGlmCi0jaWZkZWYgU0lHU1RPUAotICAgIGFwX3N5c19zaWdsaXN0W1NJR1NUT1BdID0gIlN0b3BwZWQgKHNpZ25hbCkiOwotI2VuZGlmCi0jaWZkZWYgU0lHVFNUUAotICAgIGFwX3N5c19zaWdsaXN0W1NJR1RTVFBdID0gIlN0b3BwZWQiOwotI2VuZGlmCi0jaWZkZWYgU0lHQ09OVAotICAgIGFwX3N5c19zaWdsaXN0W1NJR0NPTlRdID0gIkNvbnRpbnVlZCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdUVElOCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHVFRJTl0gPSAiU3RvcHBlZCAodHR5IGlucHV0KSI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdUVE9VCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHVFRPVV0gPSAiU3RvcHBlZCAodHR5IG91dHB1dCkiOwotI2VuZGlmCi0jaWZkZWYgU0lHVlRBTFJNCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHVlRBTFJNXSA9ICJ2aXJ0dWFsIHRpbWVyIGV4cGlyZWQiOwotI2VuZGlmCi0jaWZkZWYgU0lHUFJPRgotICAgIGFwX3N5c19zaWdsaXN0W1NJR1BST0ZdID0gInByb2ZpbGluZyB0aW1lciBleHBpcmVkIjsKLSNlbmRpZgotI2lmZGVmIFNJR1hDUFUKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdYQ1BVXSA9ICJleGNlZWRlZCBjcHUgbGltaXQiOwotI2VuZGlmCi0jaWZkZWYgU0lHWEZTWgotICAgIGFwX3N5c19zaWdsaXN0W1NJR1hGU1pdID0gImV4Y2VlZGVkIGZpbGUgc2l6ZSBsaW1pdCI7Ci0jZW5kaWYKLSAgICBmb3IgKHNpZz0wOyBzaWcgPCBzaXplb2YoYXBfc3lzX3NpZ2xpc3QpL3NpemVvZihhcF9zeXNfc2lnbGlzdFswXSk7ICsrc2lnKQotICAgICAgICBpZiAoYXBfc3lzX3NpZ2xpc3Rbc2lnXSA9PSBOVUxMKQotICAgICAgICAgICAgYXBfc3lzX3NpZ2xpc3Rbc2lnXSA9ICIiOwotfQotI2VuZGlmIC8qIE5FRURfQVBfU1lTX1NJR0xJU1QgKi8KLSAKZGlmZiAtLWdpdCBhL29zL3VuaXgvdW5peGQuaCBiL29zL3VuaXgvdW5peGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBhNzRmNy4uMDAwMDAwMAotLS0gYS9vcy91bml4L3VuaXhkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaWZuZGVmIFVOSVhEX0gKLSNkZWZpbmUgVU5JWERfSAotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLQotLyogY29tbW9uIHN0dWZmIHRoYXQgdW5peCBNUE1zIHdpbGwgd2FudCAqLwotCi0vKiBEZWZhdWx0IHVzZXIgbmFtZSBhbmQgZ3JvdXAgbmFtZS4gVGhlc2UgbWF5IGJlIHNwZWNpZmllZCBhcyBudW1iZXJzIGJ5Ci0gKiBwbGFjaW5nIGEgIyBiZWZvcmUgYSBudW1iZXIgKi8KLQotI2lmbmRlZiBERUZBVUxUX1VTRVIKLSNkZWZpbmUgREVGQVVMVF9VU0VSICIjLTEiCi0jZW5kaWYKLSNpZm5kZWYgREVGQVVMVF9HUk9VUAotI2RlZmluZSBERUZBVUxUX0dST1VQICIjLTEiCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNoYXIgKnVzZXJfbmFtZTsKLSAgICB1aWRfdCB1c2VyX2lkOwotICAgIGdpZF90IGdyb3VwX2lkOwotfSB1bml4ZF9jb25maWdfcmVjOwotZXh0ZXJuIHVuaXhkX2NvbmZpZ19yZWMgdW5peGRfY29uZmlnOwotCi12b2lkIHVuaXhkX2RldGFjaCh2b2lkKTsKLWludCB1bml4ZF9zZXR1cF9jaGlsZCh2b2lkKTsKLXZvaWQgdW5peGRfcHJlX2NvbmZpZyh2b2lkKTsKLWNvbnN0IGNoYXIgKnVuaXhkX3NldF91c2VyKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKTsKLWNvbnN0IGNoYXIgKnVuaXhkX3NldF9ncm91cChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZyk7Ci0KLS8qIEluZm9ybWF0aW9uIG9uIHNpZ25hbHMgZm9yIHRoZSB2YXJpb3VzIHBsYXRmb3JtcyAqLwotCi0jaWYgZGVmaW5lZChOU0lHKQotI2RlZmluZSBOdW1TSUcgTlNJRwotI2VsaWYgZGVmaW5lZChfTlNJRykKLSNkZWZpbmUgTnVtU0lHIF9OU0lHCi0jZWxpZiBkZWZpbmVkKF9fTlNJRykKLSNkZWZpbmUgTnVtU0lHIF9fTlNJRwotI2Vsc2UKLSNkZWZpbmUgTnVtU0lHIDMyICAgLyogZm9yIDE5OTgncyB1bml4ZXMsIHRoaXMgaXMgc3RpbGwgYSBnb29kIGFzc3VtcHRpb24gKi8KLSNlbmRpZgotCi0jaWZkZWYgU1lTX1NJR0xJU1QgLyogcGxhdGZvcm0gaGFzIHN5c19zaWdsaXN0W10gKi8KLSNkZWZpbmUgSU5JVF9TSUdMSVNUKCkgIC8qIG5vdGhpbmcgKi8KLSNlbGlmIGRlZmluZWQoU1lTX1NJR0xJU1RfREVDTEFSRUQpIC8qIGZyb20gYXV0b2NvbmYgKi8KLSNkZWZpbmUgSU5JVF9TSUdMSVNUKCkgIC8qIG5vdGhpbmcgKi8KLSNkZWZpbmUgU1lTX1NJR0xJU1Qgc3lzX3NpZ2xpc3QKLSNlbHNlCi0jZGVmaW5lIE5FRURfQVBfU1lTX1NJR0xJU1QKLWV4dGVybiBjb25zdCBjaGFyICphcF9zeXNfc2lnbGlzdFtOdW1TSUddOwotI2RlZmluZSBTWVNfU0lHTElTVCBhcF9zeXNfc2lnbGlzdAotdm9pZCB1bml4ZF9zaWdsaXN0X2luaXQodm9pZCk7Ci0jZGVmaW5lIElOSVRfU0lHTElTVCgpIHVuaXhkX3NpZ2xpc3RfaW5pdCgpOwotI2VuZGlmIC8qIHBsYXRmb3JtIGhhcyBzeXNfc2lnbGlzdFtdICovCi0KLSNpZmRlZiBIQVZFX0tJTExQRwotI2RlZmluZSB1bml4ZF9raWxscGcoeCwgeSkJKGtpbGxwZyAoKHgpLCAoeSkpKQotI2Vsc2UgLyogSEFWRV9LSUxMUEcgKi8KLSNkZWZpbmUgdW5peGRfa2lsbHBnKHgsIHkpCShraWxsICgtKHgpLCAoeSkpKQotI2VuZGlmIC8qIEhBVkVfS0lMTFBHICovCi0KLSNkZWZpbmUgVU5JWF9EQUVNT05fQ09NTUFORFMJXAoteyAiVXNlciIsIHVuaXhkX3NldF91c2VyLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLCBcCi0gICJFZmZlY3RpdmUgdXNlciBpZCBmb3IgdGhpcyBzZXJ2ZXIifSwgXAoteyAiR3JvdXAiLCB1bml4ZF9zZXRfZ3JvdXAsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsIFwKLSAgIkVmZmVjdGl2ZSBncm91cCBpZCBmb3IgdGhpcyBzZXJ2ZXIifSwgXAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29zL3dpbjMyLy5jdnNpZ25vcmUgYi9vcy93aW4zMi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzU2NDQ1Li4wMDAwMDAwCi0tLSBhL29zL3dpbjMyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0qLm1kcAotKi5uY2IKLSoub3B0Ci0qLnBsZwotKi5kc3cKLUFwYWNoZU1vZHVsZUF1dGhBbm9uRAotQXBhY2hlTW9kdWxlQXV0aEFub25SCi1BcGFjaGVNb2R1bGVDRVJOTWV0YUQKLUFwYWNoZU1vZHVsZUNFUk5NZXRhUgotQXBhY2hlTW9kdWxlRGlnZXN0RAotQXBhY2hlTW9kdWxlRGlnZXN0UgotQXBhY2hlTW9kdWxlRXhwaXJlc0QKLUFwYWNoZU1vZHVsZUV4cGlyZXNSCi1BcGFjaGVNb2R1bGVIZWFkZXJzRAotQXBhY2hlTW9kdWxlSGVhZGVyc1IKLUFwYWNoZU1vZHVsZUluZm9ECi1BcGFjaGVNb2R1bGVJbmZvUgotQXBhY2hlTW9kdWxlUmV3cml0ZUQKLUFwYWNoZU1vZHVsZVJld3JpdGVSCi1BcGFjaGVNb2R1bGVTcGVsaW5nRAotQXBhY2hlTW9kdWxlU3BlbGluZ1IKLUFwYWNoZU1vZHVsZVN0YXR1c0QKLUFwYWNoZU1vZHVsZVN0YXR1c1IKLUFwYWNoZU1vZHVsZVVzZXJUcmFja0QKLUFwYWNoZU1vZHVsZVVzZXJUcmFja1IKLUFwYWNoZU9TUgotQXBhY2hlT1NECmRpZmYgLS1naXQgYS9vcy93aW4zMi9NYWtlTW9kdWxlTWFrLmNwcCBiL29zL3dpbjMyL01ha2VNb2R1bGVNYWsuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWI5ZjI3Li4wMDAwMDAwCi0tLSBhL29zL3dpbjMyL01ha2VNb2R1bGVNYWsuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotI2luY2x1ZGUgPGZzdHJlYW0uaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi12b2lkIE1ha2VNYWtlKGNvbnN0IGNoYXIgKnN6TW9kdWxlLGNvbnN0IGNoYXIgKnN6U291cmNlKQotICAgIHsKLSAgICBpZnN0cmVhbSBpZnMoIk1vZHVsZS5tYWsudG1wbCIsaW9zOjpub2NyZWF0ZSk7Ci0gICAgYXNzZXJ0KGlmcy5nb29kKCkpOwotICAgIAotICAgIGNoYXIgYnVmWzEwMjRdOwotICAgIHNwcmludGYoYnVmLCIlcy5tYWsiLHN6TW9kdWxlKTsKLSAgICBvZnN0cmVhbSBvZnMoYnVmLGlvczo6dHJ1bmMpOwotICAgIGZvciggOyA7ICkKLQl7Ci0JaWZzLmdldGxpbmUoYnVmLHNpemVvZiBidWYpOwotCWlmKGlmcy5lb2YoKSkKLQkgICAgYnJlYWs7Ci0JZm9yKGNoYXIgKnM9YnVmIDsgKnMgOyApCi0JICAgIHsKLQkgICAgY2hhciAqcD1zdHJjaHIocywnJScpOwotCSAgICBpZighcCkKLQkJewotCQlvZnMgPDwgcyA8PCAnXG4nOwotCQlicmVhazsKLQkJfQotCSAgICBpZighc3RybmNtcChwLCIlTW9kdWxlJSIsOCkpCi0JCXsKLQkJb2ZzLndyaXRlKHMscC1zKTsKLQkJb2ZzIDw8IHN6TW9kdWxlOwotCQlzPXArODsKLQkJfQotCSAgICBlbHNlIGlmKCFzdHJuY21wKHAsIiVTb3VyY2UlIiw4KSkKLQkJewotCQlvZnMud3JpdGUocyxwLXMpOwotCQlvZnMgPDwgc3pTb3VyY2U7Ci0JCXM9cCs4OwotCQl9Ci0JICAgIGVsc2UKLQkJewotCQlvZnMud3JpdGUocyxwLXMrMSk7Ci0JCXM9cCsxOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi12b2lkIG1haW4oaW50IGFyZ2MsY2hhciAqKmFyZ3YpCi0gICAgewotICAgIGlmKGFyZ2MgPCAyIHx8IChhcmdjJTIpICE9IDEpCi0JewotCWNlcnIgPDwgYXJndlswXSA8PCAiIFs8bW9kdWxlIG5hbWU+IDxzb3VyY2UgZmlsZT5dK1xuIjsKLQlleGl0KDEpOwotCX0KLSAgICBmb3IoaW50IG49MSA7IG4gPCBhcmdjIDsgbis9MikKLQlNYWtlTWFrZShhcmd2W25dLGFyZ3ZbbisxXSk7Ci0gICAgfQotCmRpZmYgLS1naXQgYS9vcy93aW4zMi9Nb2R1bGUubWFrLnRtcGwgYi9vcy93aW4zMi9Nb2R1bGUubWFrLnRtcGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MjQ1NmYuLjAwMDAwMDAKLS0tIGEvb3Mvd2luMzIvTW9kdWxlLm1hay50bXBsCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIE5NQUtFIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDQuMjAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgRHluYW1pYy1MaW5rIExpYnJhcnkiIDB4MDEwMgotCi0hSUYgIiQoQ0ZHKSIgPT0gIiIKLUNGRz0lTW9kdWxlJSAtIFdpbjMyIERlYnVnCi0hTUVTU0FHRSBObyBjb25maWd1cmF0aW9uIHNwZWNpZmllZC4gIERlZmF1bHRpbmcgdG8gJU1vZHVsZSUgLSBXaW4zMlwKLSBEZWJ1Zy4KLSFFTkRJRiAKLQotIUlGICIkKENGRykiICE9ICIlTW9kdWxlJSAtIFdpbjMyIFJlbGVhc2UiICYmICIkKENGRykiICE9XAotICIlTW9kdWxlJSAtIFdpbjMyIERlYnVnIgotIU1FU1NBR0UgSW52YWxpZCBjb25maWd1cmF0aW9uICIkKENGRykiIHNwZWNpZmllZC4KLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFIG9uIHRoaXMgbWFrZWZpbGUKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiJU1vZHVsZSUubWFrIlwKLSBDRkc9IiVNb2R1bGUlIC0gV2luMzIgRGVidWciCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAiJU1vZHVsZSUgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFICIlTW9kdWxlJSAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikKLSFNRVNTQUdFIAotIUVSUk9SIEFuIGludmFsaWQgY29uZmlndXJhdGlvbiBpcyBzcGVjaWZpZWQuCi0hRU5ESUYgCi0KLSFJRiAiJChPUykiID09ICJXaW5kb3dzX05UIgotTlVMTD0KLSFFTFNFIAotTlVMTD1udWwKLSFFTkRJRiAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBUYXJnZXRfTGFzdF9TY2FubmVkICIlTW9kdWxlJSAtIFdpbjMyIERlYnVnIgotTVRMPW1rdHlwbGliLmV4ZQotQ1BQPWNsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICIlTW9kdWxlJSAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICIlTW9kdWxlJVIiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiJU1vZHVsZSVSIgotIyBQUk9QIFRhcmdldF9EaXIgIiIKLU9VVERJUj0uXCVNb2R1bGUlUgotSU5URElSPS5cJU1vZHVsZSVSCi0KLUFMTCA6ICIkKE9VVERJUilcJU1vZHVsZSUuZGxsIgotCi1DTEVBTiA6IAotCS1AZXJhc2UgIiQoSU5URElSKVwlU291cmNlJS5vYmoiCi0JLUBlcmFzZSAiJChPVVRESVIpXCVNb2R1bGUlLmRsbCIKLQktQGVyYXNlICIkKE9VVERJUilcJU1vZHVsZSUuZXhwIgotCS1AZXJhc2UgIiQoT1VURElSKVwlTW9kdWxlJS5saWIiCi0KLSIkKE9VVERJUikiIDoKLSAgICBpZiBub3QgZXhpc3QgIiQoT1VURElSKS8kKE5VTEwpIiBta2RpciAiJChPVVRESVIpIgotCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NVCAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvTUQgL1czIC9HWCAvTzIgL0kgIi4uXHJlZ2V4IiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfV0lORE9XUyIgL1lYIC9jCi1DUFBfUFJPSj0vbm9sb2dvIC9NRCAvVzMgL0dYIC9PMiAvSSAiLi5ccmVnZXgiIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0RcCi0gIl9XSU5ET1dTIiAvRnAiJChJTlRESVIpLyVNb2R1bGUlLnBjaCIgL1lYIC9GbyIkKElOVERJUikvIiAvYyAKLUNQUF9PQkpTPS5cJU1vZHVsZSVSLwotQ1BQX1NCUlM9LlwuCi0jIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJOREVCVUciIC93aW4zMgotIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL3dpbjMyCi1NVExfUFJPSj0vbm9sb2dvIC9EICJOREVCVUciIC93aW4zMiAKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUJTQzMyX0ZMQUdTPS9ub2xvZ28gL28iJChPVVRESVIpLyVNb2R1bGUlLmJzYyIgCi1CU0MzMl9TQlJTPSBcCi0JCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIC4uXENvcmVSXEFwYWNoZUNvcmUubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL21hY2hpbmU6STM4NgotTElOSzMyX0ZMQUdTPS4uXENvcmVSXEFwYWNoZUNvcmUubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYlwKLSB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliXAotIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGxcCi0gL2luY3JlbWVudGFsOm5vIC9wZGI6IiQoT1VURElSKS8lTW9kdWxlJS5wZGIiIC9tYWNoaW5lOkkzODZcCi0gL291dDoiJChPVVRESVIpLyVNb2R1bGUlLmRsbCJcCi0gL2ltcGxpYjoiJChPVVRESVIpLyVNb2R1bGUlLmxpYiIgCi1MSU5LMzJfT0JKUz0gXAotCSIkKElOVERJUilcJVNvdXJjZSUub2JqIgotCi0iJChPVVRESVIpXCVNb2R1bGUlLmRsbCIgOiAiJChPVVRESVIpIiAkKERFRl9GSUxFKSAkKExJTkszMl9PQkpTKQotICAgICQoTElOSzMyKSBAPDwKLSAgJChMSU5LMzJfRkxBR1MpICQoTElOSzMyX09CSlMpCi08PAotCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiJU1vZHVsZSUgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiJU1vZHVsZSVEIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIiVNb2R1bGUlRCIKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi1PVVRESVI9LlwlTW9kdWxlJUQKLUlOVERJUj0uXCVNb2R1bGUlRAotCi1BTEwgOiAiJChPVVRESVIpXCVNb2R1bGUlLmRsbCIKLQotQ0xFQU4gOiAKLQktQGVyYXNlICIkKElOVERJUilcJVNvdXJjZSUub2JqIgotCS1AZXJhc2UgIiQoSU5URElSKVx2YzQwLmlkYiIKLQktQGVyYXNlICIkKElOVERJUilcdmM0MC5wZGIiCi0JLUBlcmFzZSAiJChPVVRESVIpXCVNb2R1bGUlLmRsbCIKLQktQGVyYXNlICIkKE9VVERJUilcJU1vZHVsZSUuZXhwIgotCS1AZXJhc2UgIiQoT1VURElSKVwlTW9kdWxlJS5pbGsiCi0JLUBlcmFzZSAiJChPVVRESVIpXCVNb2R1bGUlLmxpYiIKLQktQGVyYXNlICIkKE9VVERJUilcJU1vZHVsZSUucGRiIgotCi0iJChPVVRESVIpIiA6Ci0gICAgaWYgbm90IGV4aXN0ICIkKE9VVERJUikvJChOVUxMKSIgbWtkaXIgIiQoT1VURElSKSIKLQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTVRkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL01EZCAvVzMgL0dtIC9HWCAvWmkgL09kIC9JICIuLlxyZWdleCIgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX1dJTkRPV1MiIC9ZWCAvYwotQ1BQX1BST0o9L25vbG9nbyAvTURkIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uXHJlZ2V4IiAvRCAiV0lOMzIiIC9EICJfREVCVUciXAotIC9EICJfV0lORE9XUyIgL0ZwIiQoSU5URElSKS8lTW9kdWxlJS5wY2giIC9ZWCAvRm8iJChJTlRESVIpLyJcCi0gL0ZkIiQoSU5URElSKS8iIC9jIAotQ1BQX09CSlM9LlwlTW9kdWxlJUQvCi1DUFBfU0JSUz0uXC4KLSMgQUREIEJBU0UgTVRMIC9ub2xvZ28gL0QgIl9ERUJVRyIgL3dpbjMyCi0jIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvd2luMzIKLU1UTF9QUk9KPS9ub2xvZ28gL0QgIl9ERUJVRyIgL3dpbjMyIAotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotQlNDMzJfRkxBR1M9L25vbG9nbyAvbyIkKE9VVERJUikvJU1vZHVsZSUuYnNjIiAKLUJTQzMyX1NCUlM9IFwKLQkKLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOndpbmRvd3MgL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIC4uXENvcmVEXEFwYWNoZUNvcmUubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTp3aW5kb3dzIC9kbGwgL2RlYnVnIC9tYWNoaW5lOkkzODYKLUxJTkszMl9GTEFHUz0uLlxDb3JlRFxBcGFjaGVDb3JlLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWJcCi0gd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYlwKLSB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06d2luZG93cyAvZGxsXAotIC9pbmNyZW1lbnRhbDp5ZXMgL3BkYjoiJChPVVRESVIpLyVNb2R1bGUlLnBkYiIgL2RlYnVnIC9tYWNoaW5lOkkzODZcCi0gL291dDoiJChPVVRESVIpLyVNb2R1bGUlLmRsbCJcCi0gL2ltcGxpYjoiJChPVVRESVIpLyVNb2R1bGUlLmxpYiIgCi1MSU5LMzJfT0JKUz0gXAotCSIkKElOVERJUilcJVNvdXJjZSUub2JqIgotCi0iJChPVVRESVIpXCVNb2R1bGUlLmRsbCIgOiAiJChPVVRESVIpIiAkKERFRl9GSUxFKSAkKExJTkszMl9PQkpTKQotICAgICQoTElOSzMyKSBAPDwKLSAgJChMSU5LMzJfRkxBR1MpICQoTElOSzMyX09CSlMpCi08PAotCi0hRU5ESUYgCi0KLS5jeyQoQ1BQX09CSlMpfS5vYmo6Ci0gICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAotCi0uY3BweyQoQ1BQX09CSlMpfS5vYmo6Ci0gICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAotCi0uY3h4eyQoQ1BQX09CSlMpfS5vYmo6Ci0gICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAotCi0uY3skKENQUF9TQlJTKX0uc2JyOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotLmNwcHskKENQUF9TQlJTKX0uc2JyOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotLmN4eHskKENQUF9TQlJTKX0uc2JyOgotICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQmVnaW4gVGFyZ2V0Ci0KLSMgTmFtZSAiJU1vZHVsZSUgLSBXaW4zMiBSZWxlYXNlIgotIyBOYW1lICIlTW9kdWxlJSAtIFdpbjMyIERlYnVnIgotCi0hSUYgICIkKENGRykiID09ICIlTW9kdWxlJSAtIFdpbjMyIFJlbGVhc2UiCi0KLSFFTFNFSUYgICIkKENGRykiID09ICIlTW9kdWxlJSAtIFdpbjMyIERlYnVnIgotCi0hRU5ESUYgCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT1cd29ya1xhcGFjaGVcc3JjXCVTb3VyY2UlLmMKLURFUF9DUFBfTU9EX0E9XAotCSIuLlxhbGxvYy5oIlwKLQkiLi5cYnVmZi5oIlwKLQkiLi5cY29uZi5oIlwKLQkiLi5caHR0cF9jb25maWcuaCJcCi0JIi4uXGh0dHBfY29yZS5oIlwKLQkiLi5caHR0cF9sb2cuaCJcCi0JIi4uXGh0dHBfcmVxdWVzdC5oIlwKLQkiLi5caHR0cGQuaCJcCi0JIi4uXHJlZ2V4XHJlZ2V4LmgiXAotCSIuLlxhcF9tbW4uaCJcCi0JIi5ccmVhZGRpci5oIlwKLQl7JChJTkNMVURFKX0iXHN5c1xzdGF0LmgiXAotCXskKElOQ0xVREUpfSJcc3lzXHR5cGVzLmgiXAotCQotTk9ERVBfQ1BQX01PRF9BPVwKLQkiLi5cc2Zpby5oIlwKLQkKLQotIiQoSU5URElSKVwlU291cmNlJS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9NT0RfQSkgIiQoSU5URElSKSIKLSAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKLQotCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3Mvd2luMzIvYXBhY2hlLmljbyBiL29zL3dpbjMyL2FwYWNoZS5pY28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MWJjZjcuLjAwMDAwMDAKLS0tIGEvb3Mvd2luMzIvYXBhY2hlLmljbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29zL3dpbjMyL2FwYWNoZS5yYyBiL29zL3dpbjMyL2FwYWNoZS5yYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRkZTYzZi4uMDAwMDAwMAotLS0gYS9vcy93aW4zMi9hcGFjaGUucmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vL01pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIGdlbmVyYXRlZCByZXNvdXJjZSBzY3JpcHQuCi0vLwotI2luY2x1ZGUgInJlc291cmNlLmgiCi0KLSNkZWZpbmUgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vCi0vLyBHZW5lcmF0ZWQgZnJvbSB0aGUgVEVYVElOQ0xVREUgMiByZXNvdXJjZS4KLS8vCi0jaW5jbHVkZSAid2lucmVzcmMuaCIKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSN1bmRlZiBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBOZXV0cmFsIHJlc291cmNlcwotCi0jaWYgIWRlZmluZWQoQUZYX1JFU09VUkNFX0RMTCkgfHwgZGVmaW5lZChBRlhfVEFSR19ORVUpCi0jaWZkZWYgX1dJTjMyCi1MQU5HVUFHRSBMQU5HX05FVVRSQUwsIFNVQkxBTkdfTkVVVFJBTAotI3ByYWdtYSBjb2RlX3BhZ2UoMTI1MikKLSNlbmRpZiAvL19XSU4zMgotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vIEljb24KLS8vCi0KLS8vIEljb24gd2l0aCBsb3dlc3QgSUQgdmFsdWUgcGxhY2VkIGZpcnN0IHRvIGVuc3VyZSBhcHBsaWNhdGlvbiBpY29uCi0vLyByZW1haW5zIGNvbnNpc3RlbnQgb24gYWxsIHN5c3RlbXMuCi1JRElfQVBBQ0hFICAgICAgICAgICAgICBJQ09OICAgIERJU0NBUkRBQkxFICAgICAiYXBhY2hlLmljbyIKLSNlbmRpZiAgICAvLyBOZXV0cmFsIHJlc291cmNlcwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRW5nbGlzaCAoVS5LLikgcmVzb3VyY2VzCi0KLSNpZiAhZGVmaW5lZChBRlhfUkVTT1VSQ0VfRExMKSB8fCBkZWZpbmVkKEFGWF9UQVJHX0VORykKLSNpZmRlZiBfV0lOMzIKLUxBTkdVQUdFIExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VLCi0jcHJhZ21hIGNvZGVfcGFnZSgxMjUyKQotI2VuZGlmIC8vX1dJTjMyCi0KLSNpZmRlZiBBUFNUVURJT19JTlZPS0VECi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vIFRFWFRJTkNMVURFCi0vLwotCi0xIFRFWFRJTkNMVURFIERJU0NBUkRBQkxFIAotQkVHSU4KLSAgICAicmVzb3VyY2UuaFwwIgotRU5ECi0KLTIgVEVYVElOQ0xVREUgRElTQ0FSREFCTEUgCi1CRUdJTgotICAgICIjaW5jbHVkZSAiIndpbnJlc3JjLmgiIlxyXG4iCi0gICAgIlwwIgotRU5ECi0KLTMgVEVYVElOQ0xVREUgRElTQ0FSREFCTEUgCi1CRUdJTgotICAgICJcclxuIgotICAgICJcMCIKLUVORAotCi0jZW5kaWYgICAgLy8gQVBTVFVESU9fSU5WT0tFRAotCi0jZW5kaWYgICAgLy8gRW5nbGlzaCAoVS5LLikgcmVzb3VyY2VzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0KLQotI2lmbmRlZiBBUFNUVURJT19JTlZPS0VECi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8KLS8vIEdlbmVyYXRlZCBmcm9tIHRoZSBURVhUSU5DTFVERSAzIHJlc291cmNlLgotLy8KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotI2VuZGlmICAgIC8vIG5vdCBBUFNUVURJT19JTlZPS0VECi0KZGlmZiAtLWdpdCBhL29zL3dpbjMyL21vZF9pc2FwaS5jIGIvb3Mvd2luMzIvbW9kX2lzYXBpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YWVlNTEuLjAwMDAwMDAKLS0tIGEvb3Mvd2luMzIvbW9kX2lzYXBpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjkgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogbW9kX2lzYXBpLmMgLSBJbnRlcm5ldCBTZXJ2ZXIgQXBwbGljYXRpb24gKElTQSkgbW9kdWxlIGZvciBBcGFjaGUKLSAqIGJ5IEFsZXhlaSBLb3N1dCA8YWtvc3V0QGFwYWNoZS5vcmc+Ci0gKgotICogVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBNaWNyb3NvZnQncyBJU0FQSSwgYWxsb3dpbmcgQXBhY2hlICh3aGVuIHJ1bm5pbmcKLSAqIHVuZGVyIFdpbmRvd3MpIHRvIGxvYWQgSW50ZXJuZXQgU2VydmVyIEFwcGxpY2F0aW9ucyAoSVNBUEkgZXh0ZW5zaW9ucykuCi0gKiBJdCBpbXBsZW1lbnRzIGFsbCBvZiB0aGUgSVNBUEkgMi4wIHNwZWNpZmljYXRpb24sIGV4Y2VwdCBmb3IgdGhlIAotICogIk1pY3Jvc29mdC1vbmx5IiBleHRlbnNpb25zIGRlYWxpbmcgd2l0aCBhc3luY2hyb25vdXMgSS9PLiBBbGwgSVNBUEkKLSAqIGV4dGVuc2lvbnMgdGhhdCB1c2Ugb25seSBzeW5jaHJvbm91cyBJL08gYW5kIGFyZSBjb21wYXRpYmxlIHdpdGggdGhlCi0gKiBJU0FQSSAyLjAgc3BlY2lmaWNhdGlvbiBzaG91bGQgd29yayAobW9zdCBJU0FQSSAxLjAgZXh0ZW5zaW9ucyBzaG91bGQKLSAqIGZ1bmN0aW9uIGFzIHdlbGwpLgotICoKLSAqIFRvIGxvYWQsIHNpbXBseSBwbGFjZSB0aGUgSVNBIGluIGEgbG9jYXRpb24gaW4gdGhlIGRvY3VtZW50IHRyZWUuCi0gKiBUaGVuIGFkZCBhbiAiQWRkSGFuZGxlciBpc2FwaS1pc2EgZGxsIiBpbnRvIHlvdXIgY29uZmlnIGZpbGUuCi0gKiBZb3Ugc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGxvYWQgSVNBUEkgRExMcyBqdXN0IGJlIHJlZmZlcmluZyB0byB0aGVpcgotICogVVJMcy4gTWFrZSBzdXJlIHRoZSBFeGVjQ0dJIG9wdGlvbiBpcyBhY3RpdmUgaW4gdGhlIGRpcmVjdG9yeQotICogdGhlIElTQSBpcyBpbi4KLSAqLwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgInV0aWxfc2NyaXB0LmgiCi0KLS8qIFdlIHVzZSB0aGUgZXhhY3Qgc2FtZSBoZWFkZXIgZmlsZSBhcyB0aGUgb3JpZ2luYWwgKi8KLSNpbmNsdWRlIDxIdHRwRXh0Lmg+Ci0KLS8qIFNlZW1zIElJUyBkb2VzIG5vdCBlbmZvcmNlIHRoZSByZXF1aXJlbWVudCBmb3IgXHJcbiB0ZXJtaW5hdGlvbiBvbiBIU0VfUkVRX1NFTkRfUkVTUE9OU0VfSEVBREVSLAotICAgZGVmaW5lIHRoaXMgdG8gY29uZm9ybSAqLwotI2RlZmluZSBSRUxBWF9IRUFERVJfUlVMRQotCi1tb2R1bGUgaXNhcGlfbW9kdWxlOwotCi0vKiBPdXIgIkNvbm5lY3Rpb24gSUQiIHN0cnVjdHVyZSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgTFBFWFRFTlNJT05fQ09OVFJPTF9CTE9DSyBlY2I7Ci0gICAgcmVxdWVzdF9yZWMgKnI7Ci0gICAgaW50IHN0YXR1czsKLX0gaXNhcGlfY2lkOwotCi0vKiBEZWNsYXJlIHRoZSBJU0FQSSBmdW5jdGlvbnMgKi8KLQotQk9PTCBXSU5BUEkgR2V0U2VydmVyVmFyaWFibGUgKEhDT05OIGhDb25uLCBMUFNUUiBscHN6VmFyaWFibGVOYW1lLAotCQkJICAgICAgIExQVk9JRCBscHZCdWZmZXIsIExQRFdPUkQgbHBkd1NpemVvZkJ1ZmZlcik7Ci1CT09MIFdJTkFQSSBXcml0ZUNsaWVudCAoSENPTk4gQ29ubklELCBMUFZPSUQgQnVmZmVyLCBMUERXT1JEIGxwd2R3Qnl0ZXMsCi0JCQkgRFdPUkQgZHdSZXNlcnZlZCk7Ci1CT09MIFdJTkFQSSBSZWFkQ2xpZW50IChIQ09OTiBDb25uSUQsIExQVk9JRCBscHZCdWZmZXIsIExQRFdPUkQgbHBkd1NpemUpOwotQk9PTCBXSU5BUEkgU2VydmVyU3VwcG9ydEZ1bmN0aW9uIChIQ09OTiBoQ29ubiwgRFdPUkQgZHdIU0VSZXF1ZXN0LAotCQkJCSAgIExQVk9JRCBscHZCdWZmZXIsIExQRFdPUkQgbHBkd1NpemUsCi0JCQkJICAgTFBEV09SRCBscGR3RGF0YVR5cGUpOwotCi0vKgotICAgIFRoZSBvcHRpbWlzZXIgYmxvd3MgaXQgdG90YWxseSBoZXJlLiBXaGF0IGhhcHBlbnMgaXMgdGhhdCBhdXRvcyBhcmUgYWRkcmVzc2VkIHJlbGF0aXZlIHRvIHRoZQotICAgIHN0YWNrIHBvaW50ZXIsIHdoaWNoLCBvZiBjb3Vyc2UsIG1vdmVzIGFyb3VuZC4gVGhlIG9wdGltaXNlciBzZWVtcyB0byBsb3NlIHRyYWNrIG9mIGl0IHNvbWV3aGVyZQotICAgIGJldHdlZW4gc2V0dGluZyBpc2FwaV9lbnRyeSBhbmQgY2FsbGluZyB0aHJvdWdoIGl0LiBXZSB3b3JrIGFyb3VuZCB0aGUgcHJvYmxlbSBieSBmb3JjaW5nIGl0IHRvCi0gICAgdXNlIGZyYW1lIHBvaW50ZXJzLgotKi8KLSNwcmFnbWEgb3B0aW1pemUoInkiLG9mZikKLQotaW50IGlzYXBpX2hhbmRsZXIgKHJlcXVlc3RfcmVjICpyKSB7Ci0gICAgTFBFWFRFTlNJT05fQ09OVFJPTF9CTE9DSyBlY2IgPQotCWFwX3BjYWxsb2Moci0+cG9vbCwgc2l6ZW9mKHN0cnVjdCBfRVhURU5TSU9OX0NPTlRST0xfQkxPQ0spKTsKLSAgICBIU0VfVkVSU0lPTl9JTkZPICpwVmVyID0gYXBfcGNhbGxvYyhyLT5wb29sLCBzaXplb2YoSFNFX1ZFUlNJT05fSU5GTykpOwotCi0gICAgSElOU1RBTkNFIGlzYXBpX2hhbmRsZTsKLSAgICBCT09MICgqaXNhcGlfdmVyc2lvbikoSFNFX1ZFUlNJT05fSU5GTyAqKTsgLyogZW50cnkgcG9pbnQgMSAqLwotICAgIERXT1JEICgqaXNhcGlfZW50cnkpKExQRVhURU5TSU9OX0NPTlRST0xfQkxPQ0spOyAvKiBlbnRyeSBwb2ludCAyICovCi0gICAgQk9PTCAoKmlzYXBpX3Rlcm0pKERXT1JEKTsgLyogb3B0aW9uYWwgZW50cnkgcG9pbnQgMyAqLwotCi0gICAgaXNhcGlfY2lkICpjaWQgPSBhcF9wY2FsbG9jKHItPnBvb2wsIHNpemVvZihpc2FwaV9jaWQpKTsKLSAgICBhcF90YWJsZV90ICplID0gci0+c3VicHJvY2Vzc19lbnY7Ci0gICAgaW50IHJldHZhbDsKLQotICAgIC8qIFVzZSBzaW1pbGFyIHJlc3RyaWN0aW9ucyBhcyBDR0lzICovCi0KLSAgICBpZiAoIShhcF9hbGxvd19vcHRpb25zKHIpICYgT1BUX0VYRUNDR0kpKQotCXJldHVybiBGT1JCSURERU47Ci0KLSAgICBpZiAoci0+ZmluZm8uc3RfbW9kZSA9PSAwKQotCXJldHVybiBOT1RfRk9VTkQ7Ci0KLSAgICBpZiAoU19JU0RJUihyLT5maW5mby5zdF9tb2RlKSkKLQlyZXR1cm4gRk9SQklEREVOOwotCi0gICAgLyogTG9hZCB0aGUgbW9kdWxlICovCi0KLSAgICBpZiAoIShpc2FwaV9oYW5kbGUgPSBMb2FkTGlicmFyeUV4KHItPmZpbGVuYW1lLCBOVUxMLAotCQkJCSAgICAgICBMT0FEX1dJVEhfQUxURVJFRF9TRUFSQ0hfUEFUSCkpKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgciwKLQkJICAgICJDb3VsZCBub3QgbG9hZCBETEw6ICVzIiwgci0+ZmlsZW5hbWUpOwotCXJldHVybiBTRVJWRVJfRVJST1I7Ci0gICAgfQotCi0gICAgaWYgKCEoaXNhcGlfdmVyc2lvbiA9Ci0JICAodm9pZCAqKShHZXRQcm9jQWRkcmVzcyhpc2FwaV9oYW5kbGUsICJHZXRFeHRlbnNpb25WZXJzaW9uIikpKSkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlQsIHIsCi0JCSAgICAiRExMIGNvdWxkIG5vdCBsb2FkIEdldEV4dGVuc2lvblZlcnNpb24oKTogJXMiLCByLT5maWxlbmFtZSk7Ci0JRnJlZUxpYnJhcnkoaXNhcGlfaGFuZGxlKTsKLQlyZXR1cm4gU0VSVkVSX0VSUk9SOwotICAgIH0KLQotICAgIGlmICghKGlzYXBpX2VudHJ5ID0KLQkgICh2b2lkICopKEdldFByb2NBZGRyZXNzKGlzYXBpX2hhbmRsZSwgIkh0dHBFeHRlbnNpb25Qcm9jIikpKSkgewotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlQsIHIsCi0JCSAgICAiRExMIGNvdWxkIG5vdCBsb2FkIEh0dHBFeHRlbnNpb25Qcm9jKCk6ICVzIiwgci0+ZmlsZW5hbWUpOwotCUZyZWVMaWJyYXJ5KGlzYXBpX2hhbmRsZSk7Ci0JcmV0dXJuIFNFUlZFUl9FUlJPUjsKLSAgICB9Ci0KLSAgICBpc2FwaV90ZXJtID0gKHZvaWQgKikoR2V0UHJvY0FkZHJlc3MoaXNhcGlfaGFuZGxlLCAiVGVybWluYXRlRXh0ZW5zaW9uIikpOwotCi0gICAgLyogUnVuIEdldEV4dGVuc2lvblZlcnNpb24oKSAqLwotCi0gICAgaWYgKCEoKmlzYXBpX3ZlcnNpb24pKHBWZXIpKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgciwKLQkJICAgICJJU0FQSSBHZXRFeHRlbnNpb25WZXJzaW9uKCkgZmFpbGVkOiAlcyIsIHItPmZpbGVuYW1lKTsKLQlGcmVlTGlicmFyeShpc2FwaV9oYW5kbGUpOwotCXJldHVybiBTRVJWRVJfRVJST1I7Ci0gICAgfQotCi0gICAgLyogU2V0IHVwIHZhcmlhYmxlcyAqLwotICAgIGFwX2FkZF9jb21tb25fdmFycyhyKTsKLSAgICBhcF9hZGRfY2dpX3ZhcnMocik7Ci0KLSAgICAvKiBTZXQgdXAgY29ubmVjdGlvbiBJRCAqLwotICAgIGVjYi0+Q29ubklEID0gKEhDT05OKWNpZDsKLSAgICBjaWQtPmVjYiA9IGVjYjsKLSAgICBjaWQtPnIgPSByOwotICAgIGNpZC0+c3RhdHVzID0gMDsKLQotICAgIGVjYi0+Y2JTaXplID0gc2l6ZW9mKHN0cnVjdCBfRVhURU5TSU9OX0NPTlRST0xfQkxPQ0spOwotICAgIGVjYi0+ZHdWZXJzaW9uID0gTUFLRUxPTkcoMCwgMik7Ci0gICAgZWNiLT5kd0h0dHBTdGF0dXNDb2RlID0gMDsKLSAgICBzdHJjcHkoZWNiLT5scHN6TG9nRGF0YSwgIiIpOwotICAgIGVjYi0+bHBzek1ldGhvZCA9IHItPm1ldGhvZDsKLSAgICBlY2ItPmxwc3pRdWVyeVN0cmluZyA9IGFwX3RhYmxlX2dldChlLCAiUVVFUllfU1RSSU5HIik7Ci0gICAgZWNiLT5scHN6UGF0aEluZm8gPSBhcF90YWJsZV9nZXQoZSwgIlBBVEhfSU5GTyIpOwotICAgIGVjYi0+bHBzelBhdGhUcmFuc2xhdGVkID0gYXBfdGFibGVfZ2V0KGUsICJQQVRIX1RSQU5TTEFURUQiKTsKLSAgICBlY2ItPmxwc3pDb250ZW50VHlwZSA9IGFwX3RhYmxlX2dldChlLCAiQ09OVEVOVF9UWVBFIik7Ci0KLSAgICAvKiBTZXQgdXAgY2xpZW50IGlucHV0ICovCi0gICAgaWYgKChyZXR2YWwgPSBhcF9zZXR1cF9jbGllbnRfYmxvY2sociwgUkVRVUVTVF9DSFVOS0VEX0VSUk9SKSkpIHsKLQlpZiAoaXNhcGlfdGVybSkgKCppc2FwaV90ZXJtKShIU0VfVEVSTV9NVVNUX1VOTE9BRCk7Ci0JRnJlZUxpYnJhcnkoaXNhcGlfaGFuZGxlKTsKLQlyZXR1cm4gcmV0dmFsOwotICAgIH0KLQotICAgIGlmIChhcF9zaG91bGRfY2xpZW50X2Jsb2NrKHIpKSB7Ci0JLyogVW5saWtlIElJUywgd2hpY2ggbGltaXRzIHRoaXMgdG8gNDhrLCB3ZSByZWFkIHRoZSB3aG9sZQotCSAqIHN1Y2tlciBpbi4gSSBzdXBwb3NlIHRoaXMgY291bGQgYmUgYmFkIGZvciBtZW1vcnkgaWYgc29tZW9uZQotCSAqIHVwbG9hZGVkIHRoZSBjb21wbGV0ZSB3b3JrcyBvZiBTaGFrZXNwZWFyZS4gV2VsbCwgV2ViU2l0ZQotCSAqIGRvZXMgdGhlIHNhbWUgdGhpbmcuCi0JICovCi0JbG9uZyB0b19yZWFkID0gYXRvbChhcF90YWJsZV9nZXQoZSwgIkNPTlRFTlRfTEVOR1RIIikpOwotCWxvbmcgcmVhZDsKLQotCS8qIEFjdHVhbGx5LCBsZXQncyBjYXAgaXQgYXQgNDhrLCB1bnRpbCB3ZSBmaWd1cmUgb3V0IHdoYXQKLQkgKiB0byBkbyB3aXRoIHRoaXMuLi4gd2UgZG9uJ3Qgd2FudCBhIENvbnRlbnQtTGVuZ3RoOiAxMDAwMDAwMDAwCi0JICogdGFraW5nIG91dCB0aGUgbWFjaGluZS4KLQkgKi8KLQotCWlmICh0b19yZWFkID4gNDkxNTIpIHsKLQkgICAgaWYgKGlzYXBpX3Rlcm0pICgqaXNhcGlfdGVybSkoSFNFX1RFUk1fTVVTVF9VTkxPQUQpOwotCSAgICBGcmVlTGlicmFyeShpc2FwaV9oYW5kbGUpOwotCSAgICByZXR1cm4gSFRUUF9SRVFVRVNUX0VOVElUWV9UT09fTEFSR0U7Ci0JfQotCi0JZWNiLT5scGJEYXRhID0gYXBfcGNhbGxvYyhyLT5wb29sLCAxICsgdG9fcmVhZCk7Ci0KLQlpZiAoKHJlYWQgPSBhcF9nZXRfY2xpZW50X2Jsb2NrKHIsIGVjYi0+bHBiRGF0YSwgdG9fcmVhZCkpIDwgMCkgewotCSAgICBpZiAoaXNhcGlfdGVybSkgKCppc2FwaV90ZXJtKShIU0VfVEVSTV9NVVNUX1VOTE9BRCk7Ci0JICAgIEZyZWVMaWJyYXJ5KGlzYXBpX2hhbmRsZSk7Ci0JICAgIHJldHVybiBTRVJWRVJfRVJST1I7Ci0JfQotCi0JLyogQWx0aG91Z2ggaXRzIG5vdCB0byBzcGVjLCBJSVMgc2VlbXMgdG8gbnVsbC10ZXJtaW5hdGUKLQkgKiBpdHMgbHBkRGF0YSBzdHJpbmcuIFNvIHdlIHdpbGwgdG9vLiBUbyBtYWtlIHN1cmUKLQkgKiBjYkF2YWlsYWJsZSBtYXRjaGVzIGNiVG90YWxCeXRlcywgd2UnbGwgdXAgdGhlIGxhdHRlcgotCSAqIGFuZCBlcXVhbGl6ZSB0aGVtLgotCSAqLwotCWVjYi0+Y2JBdmFpbGFibGUgPSBlY2ItPmNiVG90YWxCeXRlcyA9IHJlYWQgKyAxOwotCWVjYi0+bHBiRGF0YVtyZWFkXSA9ICdcMCc7Ci0JfQotICAgIGVsc2UgewotCWVjYi0+Y2JUb3RhbEJ5dGVzID0gMDsKLQllY2ItPmNiQXZhaWxhYmxlID0gMDsKLQllY2ItPmxwYkRhdGEgPSBOVUxMOwotICAgIH0KLQotICAgIC8qIFNldCB1cCB0aGUgY2FsbGJhY2tzICovCi0KLSAgICBlY2ItPkdldFNlcnZlclZhcmlhYmxlID0gJkdldFNlcnZlclZhcmlhYmxlOwotICAgIGVjYi0+V3JpdGVDbGllbnQgPSAmV3JpdGVDbGllbnQ7Ci0gICAgZWNiLT5SZWFkQ2xpZW50ID0gJlJlYWRDbGllbnQ7Ci0gICAgZWNiLT5TZXJ2ZXJTdXBwb3J0RnVuY3Rpb24gPSAmU2VydmVyU3VwcG9ydEZ1bmN0aW9uOwotCi0gICAgLyogQWxsIHJpZ2h0Li4uIHRyeSBhbmQgbG9hZCB0aGUgc3Vja2VyICovCi0gICAgcmV0dmFsID0gKCppc2FwaV9lbnRyeSkoZWNiKTsKLQotICAgIC8qIFNldCB0aGUgc3RhdHVzIChmb3IgbG9nZ2luZykgKi8KLSAgICBpZiAoZWNiLT5kd0h0dHBTdGF0dXNDb2RlKQotCXItPnN0YXR1cyA9IGVjYi0+ZHdIdHRwU3RhdHVzQ29kZTsKLQotICAgIC8qIENoZWNrIGZvciBhIGxvZyBtZXNzYWdlIC0gYW5kIGxvZyBpdCAqLwotICAgIGlmIChlY2ItPmxwc3pMb2dEYXRhICYmIHN0cmNtcChlY2ItPmxwc3pMb2dEYXRhLCAiIikpCi0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHIsCi0JCSAgICAiJXM6ICVzIiwgZWNiLT5scHN6TG9nRGF0YSwgci0+ZmlsZW5hbWUpOwotCi0gICAgLyogQWxsIGRvbmUgd2l0aCB0aGUgRExMLi4uIGdldCByaWQgb2YgaXQgKi8KLSAgICBpZiAoaXNhcGlfdGVybSkgKCppc2FwaV90ZXJtKShIU0VfVEVSTV9NVVNUX1VOTE9BRCk7Ci0gICAgRnJlZUxpYnJhcnkoaXNhcGlfaGFuZGxlKTsKLQotICAgIHN3aXRjaChyZXR2YWwpIHsKLSAgICBjYXNlIEhTRV9TVEFUVVNfU1VDQ0VTUzoKLSAgICBjYXNlIEhTRV9TVEFUVVNfU1VDQ0VTU19BTkRfS0VFUF9DT05OOgotCS8qIElnbm9yZSB0aGUga2VlcGFsaXZlIHN0dWZmOyBBcGFjaGUgaGFuZGxlcyBpdCBqdXN0IGZpbmUgd2l0aG91dAotCSAqIHRoZSBJU0EncyAiYWR2aWNlIi4KLQkgKi8KLQotCWlmIChjaWQtPnN0YXR1cykgLyogV2UgaGF2ZSBhIHNwZWNpYWwgc3RhdHVzIHRvIHJldHVybiAqLwotCSAgICByZXR1cm4gY2lkLT5zdGF0dXM7Ci0KLQlyZXR1cm4gT0s7Ci0gICAgY2FzZSBIU0VfU1RBVFVTX1BFTkRJTkc6CS8qIFdlIGRvbid0IHN1cHBvcnQgdGhpcyAqLwotCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgciwKLQkJICAgICJJU0FQSSBhc3luY2hyb25vdXMgSS9PIG5vdCBzdXBwb3J0ZWQ6ICVzIiwgci0+ZmlsZW5hbWUpOwotICAgIGNhc2UgSFNFX1NUQVRVU19FUlJPUjoKLSAgICBkZWZhdWx0OgotCXJldHVybiBTRVJWRVJfRVJST1I7Ci0gICAgfQotCi19Ci0jcHJhZ21hIG9wdGltaXplKCIiLG9uKQotCi1CT09MIFdJTkFQSSBHZXRTZXJ2ZXJWYXJpYWJsZSAoSENPTk4gaENvbm4sIExQU1RSIGxwc3pWYXJpYWJsZU5hbWUsCi0JCQkgICAgICAgTFBWT0lEIGxwdkJ1ZmZlciwgTFBEV09SRCBscGR3U2l6ZW9mQnVmZmVyKSB7Ci0gICAgcmVxdWVzdF9yZWMgKnIgPSAoKGlzYXBpX2NpZCAqKWhDb25uKS0+cjsKLSAgICBhcF90YWJsZV90ICplID0gci0+c3VicHJvY2Vzc19lbnY7Ci0gICAgY29uc3QgY2hhciAqcmVzdWx0OwotICAgIAotICAgIC8qIE1vc3RseSwgd2UganVzdCBncmFiIGl0IGZyb20gdGhlIGVudmlyb25tZW50LCBidXQgdGhlcmUgYXJlCi0gICAgICogYSBjb3VwbGUgb2Ygc3BlY2lhbCBjYXNlcwotICAgICAqLwotCi0gICAgaWYgKCFzdHJjYXNlY21wKGxwc3pWYXJpYWJsZU5hbWUsICJVTk1BUFBFRF9SRU1PVEVfVVNFUiIpKSB7Ci0JLyogV2UgZG9uJ3Qgc3VwcG9ydCBOVCB1c2Vycywgc28gdGhpcyBpcyBhbHdheXMgdGhlIHNhbWUgYXMKLQkgKiBSRU1PVEVfVVNFUgotCSAqLwotCXJlc3VsdCA9IGFwX3RhYmxlX2dldChlLCAiUkVNT1RFX1VTRVIiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAobHBzelZhcmlhYmxlTmFtZSwgIlNFUlZFUl9QT1JUX1NFQ1VSRSIpKSB7Ci0JLyogQXBhY2hlIGRvZXNuJ3Qgc3VwcG9ydCBzZWN1cmUgcmVxdWVzdHMgaW5oZXJlbnRseSwgc28KLQkgKiB3ZSBoYXZlIG5vIHdheSBvZiBrbm93aW5nLiBXZSdsbCBiZSBjb25zZXJ2YXRpdmUsIGFuZCBzYXkKLQkgKiBhbGwgcmVxdWVzdHMgYXJlIGluc2VjdXJlLgotCSAqLwotCXJlc3VsdCA9ICIwIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAobHBzelZhcmlhYmxlTmFtZSwgIlVSTCIpKSB7Ci0JcmVzdWx0ID0gci0+dXJpOwotICAgIH0KLSAgICBlbHNlIHsKLQlyZXN1bHQgPSBhcF90YWJsZV9nZXQoZSwgbHBzelZhcmlhYmxlTmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdCkgewotCWlmIChzdHJsZW4ocmVzdWx0KSA+ICpscGR3U2l6ZW9mQnVmZmVyKSB7Ci0JICAgICpscGR3U2l6ZW9mQnVmZmVyID0gc3RybGVuKHJlc3VsdCk7Ci0JICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKLQkgICAgcmV0dXJuIEZBTFNFOwotCX0KLQlzdHJuY3B5KGxwdkJ1ZmZlciwgcmVzdWx0LCAqbHBkd1NpemVvZkJ1ZmZlcik7Ci0JcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgLyogRGlkbid0IGZpbmQgaXQgKi8KLSAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9JTkRFWCk7Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1CT09MIFdJTkFQSSBXcml0ZUNsaWVudCAoSENPTk4gQ29ubklELCBMUFZPSUQgQnVmZmVyLCBMUERXT1JEIGxwd2R3Qnl0ZXMsCi0JCQkgRFdPUkQgZHdSZXNlcnZlZCkgewotICAgIHJlcXVlc3RfcmVjICpyID0gKChpc2FwaV9jaWQgKilDb25uSUQpLT5yOwotICAgIGludCB3cml0OwkvKiB3cml0dGVuLCBhY3R1YWxseSwgYnV0IHdoeSBzaG91bGRuJ3QgSSBtYWtlIHVwIHdvcmRzPyAqLwotCi0gICAgLyogV2Ugb25seSBzdXBwb3J0IHN5bmNocm9ub3VzIHdyaXRpbmcgKi8KLSAgICBpZiAoZHdSZXNlcnZlZCAmJiBkd1Jlc2VydmVkICE9IEhTRV9JT19TWU5DKSB7Ci0JYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCByLAotCQkgICAgIklTQVBJIGFzeW5jaHJvbm91cyBJL08gbm90IHN1cHBvcnRlZDogJXMiLCByLT5maWxlbmFtZSk7Ci0JU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKLQlyZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKCh3cml0ID0gYXBfcndyaXRlKEJ1ZmZlciwgKmxwd2R3Qnl0ZXMsIHIpKSA9PSBFT0YpIHsKLQlTZXRMYXN0RXJyb3IoRVJST1IpOyAvKiBYWFg6IEZpbmQgdGhlIHJpZ2h0IGVycm9yIGNvZGUgKi8KLQlyZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgCi0gICAgKmxwd2R3Qnl0ZXMgPSB3cml0OwotICAgIHJldHVybiBUUlVFOwotfQotCi1CT09MIFdJTkFQSSBSZWFkQ2xpZW50IChIQ09OTiBDb25uSUQsIExQVk9JRCBscHZCdWZmZXIsIExQRFdPUkQgbHBkd1NpemUpIHsKLSAgICAvKiBEb2Vzbid0IG5lZWQgdG8gZG8gYW55dGhpbmc7IHdlJ3ZlIHJlYWQgYWxsIHRoZSBkYXRhIGFscmVhZHkgKi8KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyogWFhYOiBUaGVyZSBpcyBhbiBPKG5eMikgYXR0YWNrIHBvc3NpYmxlIGhlcmUuICovCi1CT09MIFdJTkFQSSBTZXJ2ZXJTdXBwb3J0RnVuY3Rpb24gKEhDT05OIGhDb25uLCBEV09SRCBkd0hTRVJlcXVlc3QsCi0JCQkJICAgTFBWT0lEIGxwdkJ1ZmZlciwgTFBEV09SRCBscGR3U2l6ZSwKLQkJCQkgICBMUERXT1JEIGxwZHdEYXRhVHlwZSkgewotICAgIGlzYXBpX2NpZCAqY2lkID0gKGlzYXBpX2NpZCAqKWhDb25uOwotICAgIHJlcXVlc3RfcmVjICpzdWJyZXEsICpyID0gY2lkLT5yOwotICAgIGNoYXIgKmRhdGE7Ci0KLSAgICBzd2l0Y2ggKGR3SFNFUmVxdWVzdCkgewotICAgIGNhc2UgSFNFX1JFUV9TRU5EX1VSTF9SRURJUkVDVF9SRVNQOgotCS8qIFNldCB0aGUgc3RhdHVzIHRvIGJlIHJldHVybmVkIHdoZW4gdGhlIEh0dHBFeHRlbnNpb25Qcm9jKCkKLQkgKiBpcyBkb25lLgotCSAqLwotCWFwX3RhYmxlX3NldCAoci0+aGVhZGVyc19vdXQsICJMb2NhdGlvbiIsIGxwdkJ1ZmZlcik7Ci0JY2lkLT5zdGF0dXMgPSBjaWQtPnItPnN0YXR1cyA9IGNpZC0+ZWNiLT5kd0h0dHBTdGF0dXNDb2RlID0gUkVESVJFQ1Q7Ci0JcmV0dXJuIFRSVUU7Ci0KLSAgICBjYXNlIEhTRV9SRVFfU0VORF9VUkw6Ci0JLyogUmVhZCBhbnkgYWRkaXRpb25hbCBpbnB1dCAqLwotCi0JaWYgKHItPnJlbWFpbmluZyA+IDApIHsKLQkgICAgY2hhciBhcmdzYnVmZmVyW0hVR0VfU1RSSU5HX0xFTl07Ci0KLQkgICAgd2hpbGUgKGFwX2dldF9jbGllbnRfYmxvY2sociwgYXJnc2J1ZmZlciwgSFVHRV9TVFJJTkdfTEVOKSk7Ci0JfQotCQotCS8qIFJlc2V0IHRoZSBtZXRob2QgdG8gR0VUICovCi0Jci0+bWV0aG9kID0gYXBfcHN0cmR1cChyLT5wb29sLCAiR0VUIik7Ci0Jci0+bWV0aG9kX251bWJlciA9IE1fR0VUOwotCi0JLyogRG9uJ3QgbGV0IGFueW9uZSB0aGluayB0aGVyZSdzIHN0aWxsIGRhdGEgKi8KLQlhcF90YWJsZV91bnNldChyLT5oZWFkZXJzX2luLCAiQ29udGVudC1MZW5ndGgiKTsKLQkKLQlhcF9pbnRlcm5hbF9yZWRpcmVjdCgoY2hhciAqKWxwdkJ1ZmZlciwgcik7CQotCXJldHVybiBUUlVFOwotCi0gICAgY2FzZSBIU0VfUkVRX1NFTkRfUkVTUE9OU0VfSEVBREVSOgotCXItPnN0YXR1c19saW5lID0gbHB2QnVmZmVyID8gbHB2QnVmZmVyIDogYXBfcHN0cmR1cChyLT5wb29sLCAiMjAwIE9LIik7Ci0Jc3NjYW5mKHItPnN0YXR1c19saW5lLCAiJWQiLCAmci0+c3RhdHVzKTsKLQljaWQtPmVjYi0+ZHdIdHRwU3RhdHVzQ29kZSA9IHItPnN0YXR1czsKLQotCS8qIE5vdyBmaWxsIGluIHRoZSBIVFRQIGhlYWRlcnMsIGFuZCB0aGUgcmVzdCBvZiBpdC4gSWNrLgotCSAqIGxwZHdEYXRhVHlwZSBjb250YWlucyBhIHN0cmluZyB0aGF0IGhhcyBoZWFkZXJzIChpbiBNSU1FCi0JICogZm9ybWF0KSwgYSBibGFuayBsaWtlLCB0aGVuIChwb3NzaWJseSkgZGF0YS4gV2UgbmVlZAotCSAqIHRvIHBhcnNlIGl0LgotCSAqCi0JICogRWFzeSBjYXNlIGZpcnN0OgotCSAqLwotCWlmICghbHBkd0RhdGFUeXBlKSB7Ci0JICAgIGFwX3NlbmRfaHR0cF9oZWFkZXIocik7Ci0JICAgIHJldHVybiBUUlVFOwotCX0KLQotCS8qIE1ha2UgYSBjb3B5IC0gZG9uJ3QgZGlzdHVyYiB0aGUgb3JpZ2luYWwgKi8KLQlkYXRhID0gYXBfcHN0cmR1cChyLT5wb29sLCAoY2hhciAqKWxwZHdEYXRhVHlwZSk7Ci0KLQkvKiBXZSAqc2hvdWxkKiBicmVhayBiZWZvcmUgdGhpcyB3aGlsZSBsb29wIGVuZHMgKi8KLQl3aGlsZSAoKmRhdGEpIHsKLQkgICAgY2hhciAqdmFsdWUsICpsZiA9IHN0cmNocihkYXRhLCAnXG4nKTsKLQkgICAgaW50IHA7Ci0KLSNpZmRlZiBSRUxBWF9IRUFERVJfUlVMRQotCSAgICBpZiAobGYpCi0JCSpsZiA9ICdcMCc7Ci0jZWxzZQotCSAgICBpZiAoIWxmKSB7IC8qIEh1aD8gSW52YWxpZCBkYXRhLCBJIHRoaW5rICovCi0JCWFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCByLAotCQkJICAgICJJU0Egc2VudCBpbnZhbGlkIGhlYWRlcnM6ICVzIiwgci0+ZmlsZW5hbWUpOwotCQlTZXRMYXN0RXJyb3IoRVJST1IpOwkvKiBYWFg6IEZpbmQgcmlnaHQgZXJyb3IgKi8KLQkJcmV0dXJuIEZBTFNFOwotCSAgICB9Ci0KLQkgICAgLyogR2V0IHJpZCBvZiBcbiBhbmQgXHIgKi8KLQkgICAgKmxmID0gJ1wwJzsKLSNlbmRpZgotCSAgICBwID0gc3RybGVuKGRhdGEpOwotCSAgICBpZiAocCA+IDAgJiYgZGF0YVtwLTFdID09ICdccicpIGRhdGFbcC0xXSA9ICdcMCc7Ci0JICAgIAotCSAgICAvKiBFbmQgb2YgaGVhZGVycyAqLwotCSAgICBpZiAoKmRhdGEgPT0gJ1wwJykgewotI2lmZGVmIFJFTEFYX0hFQURFUl9SVUxFCi0JCWlmIChsZikKLSNlbmRpZgotCQkgICAgZGF0YSA9IGxmICsgMTsJLyogUmVzZXQgZGF0YSAqLwotCQlicmVhazsKLQkgICAgfQotCi0JICAgIGlmICghKHZhbHVlID0gc3RyY2hyKGRhdGEsICc6JykpKSB7Ci0JCVNldExhc3RFcnJvcihFUlJPUik7CS8qIFhYWDogRmluZCByaWdodCBlcnJvciAqLwotCQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgciwKLQkJCSAgICAiSVNBIHNlbnQgaW52YWxpZCBoZWFkZXJzIiwgci0+ZmlsZW5hbWUpOwotCQlyZXR1cm4gRkFMU0U7Ci0JICAgIH0KLQotCSAgICAqdmFsdWUrKyA9ICdcMCc7Ci0JICAgIHdoaWxlICgqdmFsdWUgJiYgYXBfaXNzcGFjZSgqdmFsdWUpKSArK3ZhbHVlOwotCi0JICAgIC8qIENoZWNrIGFsbCB0aGUgc3BlY2lhbC1jYXNlIGhlYWRlcnMuIFNpbWlsYXIgdG8gd2hhdAotCSAgICAgKiBhcF9zY2FuX3NjcmlwdF9oZWFkZXJfZXJyKCkgZG9lcyAoc2VlIHRoYXQgZnVuY3Rpb24gZm9yCi0JICAgICAqIG1vcmUgZGV0YWlsKQotCSAgICAgKi8KLQotCSAgICBpZiAoIXN0cmNhc2VjbXAoZGF0YSwgIkNvbnRlbnQtVHlwZSIpKSB7Ci0JCWNoYXIgKnRtcDsKLQkJLyogTnVrZSB0cmFpbGluZyB3aGl0ZXNwYWNlICovCi0JCQotCQljaGFyICplbmRwID0gdmFsdWUgKyBzdHJsZW4odmFsdWUpIC0gMTsKLQkJd2hpbGUgKGVuZHAgPiB2YWx1ZSAmJiBhcF9pc3NwYWNlKCplbmRwKSkgKmVuZHAtLSA9ICdcMCc7Ci0gICAgICAgICAgICAKLQkJdG1wID0gYXBfcHN0cmR1cCAoci0+cG9vbCwgdmFsdWUpOwotCQlhcF9zdHJfdG9sb3dlcih0bXApOwotCQlyLT5jb250ZW50X3R5cGUgPSB0bXA7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAoZGF0YSwgIkNvbnRlbnQtTGVuZ3RoIikpIHsKLQkJYXBfdGFibGVfc2V0KHItPmhlYWRlcnNfb3V0LCBkYXRhLCB2YWx1ZSk7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAoZGF0YSwgIlRyYW5zZmVyLUVuY29kaW5nIikpIHsKLQkJYXBfdGFibGVfc2V0KHItPmhlYWRlcnNfb3V0LCBkYXRhLCB2YWx1ZSk7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAoZGF0YSwgIlNldC1Db29raWUiKSkgewotCQlhcF90YWJsZV9hZGQoci0+ZXJyX2hlYWRlcnNfb3V0LCBkYXRhLCB2YWx1ZSk7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCWFwX3RhYmxlX21lcmdlKHItPmVycl9oZWFkZXJzX291dCwgZGF0YSwgdmFsdWUpOwotCSAgICB9Ci0JICAKLQkgICAgLyogUmVzZXQgZGF0YSAqLwotI2lmZGVmIFJFTEFYX0hFQURFUl9SVUxFCi0JICAgIGlmICghbGYpIHsKLQkJZGF0YSArPSBwOwotCQlicmVhazsKLQkgICAgfQotI2VuZGlmCi0JICAgIGRhdGEgPSBsZiArIDE7Ci0JfQotCQotCS8qIEFsbCB0aGUgaGVhZGVycyBzaG91bGQgYmUgc2V0IG5vdyAqLwotCi0JYXBfc2VuZF9odHRwX2hlYWRlcihyKTsKLQotCS8qIEFueSBkYXRhIGxlZnQgc2hvdWxkIG5vdyBiZSBzZW50IGRpcmVjdGx5ICovCi0JYXBfcnB1dHMoZGF0YSwgcik7Ci0KLQlyZXR1cm4gVFJVRTsKLQotICAgIGNhc2UgSFNFX1JFUV9NQVBfVVJMX1RPX1BBVEg6Ci0JLyogTWFwIGEgVVJMIHRvIGEgZmlsZW5hbWUgKi8KLQlzdWJyZXEgPSBhcF9zdWJfcmVxX2xvb2t1cF91cmkoYXBfcHN0cm5kdXAoci0+cG9vbCwgKGNoYXIgKilscHZCdWZmZXIsCi0JCQkJCSAgICAgICpscGR3U2l6ZSksIHIpOwotCi0JR2V0RnVsbFBhdGhOYW1lKHN1YnJlcS0+ZmlsZW5hbWUsICpscGR3U2l6ZSAtIDEsIChjaGFyICopbHB2QnVmZmVyLCBOVUxMKTsKLQotCS8qIElJUyBwdXRzIGEgdHJhaWxpbmcgc2xhc2ggb24gZGlyZWN0b3JpZXMsIEFwYWNoZSBkb2Vzbid0ICovCi0KLQlpZiAoU19JU0RJUiAoc3VicmVxLT5maW5mby5zdF9tb2RlKSkgewotCQlpbnQgbCA9IHN0cmxlbigoY2hhciAqKWxwdkJ1ZmZlcik7Ci0KLQkJKChjaGFyICopbHB2QnVmZmVyKVtsXSA9ICdcXCc7Ci0JCSgoY2hhciAqKWxwdkJ1ZmZlcilbbCArIDFdID0gJ1wwJzsKLQl9Ci0JCi0JcmV0dXJuIFRSVUU7Ci0KLSAgICBjYXNlIEhTRV9SRVFfRE9ORV9XSVRIX1NFU1NJT046Ci0JLyogRG8gbm90aGluZy4uLiBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0IGFzeW5jIEkvTywgdGhleSdsbAotCSAqIHJldHVybiBmcm9tIEh0dHBFeHRlbnNpb25Qcm9jIHNvb24KLQkgKi8KLQlyZXR1cm4gVFJVRTsKLQotICAgIC8qIFdlIGRvbid0IHN1cHBvcnQgYWxsIHRoaXMgYXN5bmMgSS9PLCBNaWNyb3NvZnQtc3BlY2lmaWMgc3R1ZmYgKi8KLSAgICBjYXNlIEhTRV9SRVFfSU9fQ09NUExFVElPTjoKLSAgICBjYXNlIEhTRV9SRVFfVFJBTlNNSVRfRklMRToKLQlhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIHIsCi0JCSAgICAiSVNBUEkgYXN5bmNocm9ub3VzIEkvTyBub3Qgc3VwcG9ydGVkOiAlcyIsIHItPmZpbGVuYW1lKTsKLSAgICBkZWZhdWx0OgotCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7Ci0JcmV0dXJuIEZBTFNFOwotICAgIH0KLX0KLQotaGFuZGxlcl9yZWMgaXNhcGlfaGFuZGxlcnNbXSA9IHsKLXsgImlzYXBpLWlzYSIsIGlzYXBpX2hhbmRsZXIgfSwKLXsgTlVMTH0KLX07Ci0KLW1vZHVsZSBpc2FwaV9tb2R1bGUgPSB7Ci0gICBTVEFOREFSRF9NT0RVTEVfU1RVRkYsCi0gICBOVUxMLAkJCS8qIGluaXRpYWxpemVyICovCi0gICBOVUxMLAkJCS8qIGNyZWF0ZSBwZXItZGlyIGNvbmZpZyAqLwotICAgTlVMTCwJCQkvKiBtZXJnZSBwZXItZGlyIGNvbmZpZyAqLwotICAgTlVMTCwJCQkvKiBzZXJ2ZXIgY29uZmlnICovCi0gICBOVUxMLAkJCS8qIG1lcmdlIHNlcnZlciBjb25maWcgKi8KLSAgIE5VTEwsCQkJLyogY29tbWFuZCBhcF90YWJsZV90ICovCi0gICBpc2FwaV9oYW5kbGVycywJICAgICAgIAkvKiBoYW5kbGVycyAqLwotICAgTlVMTCwJCQkvKiBmaWxlbmFtZSB0cmFuc2xhdGlvbiAqLwotICAgTlVMTCwJCQkvKiBjaGVja191c2VyX2lkICovCi0gICBOVUxMLAkJCS8qIGNoZWNrIGF1dGggKi8KLSAgIE5VTEwsCQkJLyogY2hlY2sgYWNjZXNzICovCi0gICBOVUxMLAkJCS8qIHR5cGVfY2hlY2tlciAqLwotICAgTlVMTCwJCQkvKiBsb2dnZXIgKi8KLSAgIE5VTEwJCQkJLyogaGVhZGVyIHBhcnNlciAqLwotfTsKZGlmZiAtLWdpdCBhL29zL3dpbjMyL21vZHVsZXMuYyBiL29zL3dpbjMyL21vZHVsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM2MjRjMi4uMDAwMDAwMAotLS0gYS9vcy93aW4zMi9tb2R1bGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKiBtb2R1bGVzLmMgLS0tIG1ham9yIG1vZHVsZXMgY29tcGlsZWQgaW50byBBcGFjaGUgZm9yIFdpbjMyLgotICogT25seSBpbnNlcnQgYW4gZW50cnkgZm9yIGEgbW9kdWxlIGlmIGl0IG11c3QgYmUgY29tcGlsZWQgaW50bwotICogdGhlIGNvcmUgc2VydmVyCi0gKi8KLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLQotZXh0ZXJuIG1vZHVsZSBjb3JlX21vZHVsZTsKLWV4dGVybiBtb2R1bGUgbXBtX3dpbm50X21vZHVsZTsKLWV4dGVybiBtb2R1bGUgc29fbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSBtaW1lX21vZHVsZTsKLWV4dGVybiBtb2R1bGUgYWNjZXNzX21vZHVsZTsKLWV4dGVybiBtb2R1bGUgYXV0aF9tb2R1bGU7Ci1leHRlcm4gbW9kdWxlIG5lZ290aWF0aW9uX21vZHVsZTsKLWV4dGVybiBtb2R1bGUgaW5jbHVkZXNfbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSBhdXRvaW5kZXhfbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSBkaXJfbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSBjZ2lfbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSB1c2VyZGlyX21vZHVsZTsKLWV4dGVybiBtb2R1bGUgYWxpYXNfbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSBlbnZfbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSBjb25maWdfbG9nX21vZHVsZTsKLWV4dGVybiBtb2R1bGUgYXNpc19tb2R1bGU7Ci1leHRlcm4gbW9kdWxlIGltYXBfbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSBhY3Rpb25fbW9kdWxlOwotZXh0ZXJuIG1vZHVsZSBzZXRlbnZpZl9tb2R1bGU7Ci0vL2V4dGVybiBtb2R1bGUgaXNhcGlfbW9kdWxlOwotCi1tb2R1bGUgKmFwX3ByZWxpbmtlZF9tb2R1bGVzW10gPSB7Ci0gICZjb3JlX21vZHVsZSwKLSAgJm1wbV93aW5udF9tb2R1bGUsCi0gICZzb19tb2R1bGUsCi0gICZtaW1lX21vZHVsZSwKLSAgJmFjY2Vzc19tb2R1bGUsCi0gICZhdXRoX21vZHVsZSwKLSAgJm5lZ290aWF0aW9uX21vZHVsZSwKLSAgJmluY2x1ZGVzX21vZHVsZSwKLSAgJmF1dG9pbmRleF9tb2R1bGUsCi0gICZkaXJfbW9kdWxlLAotICAmY2dpX21vZHVsZSwKLSAgJnVzZXJkaXJfbW9kdWxlLAotICAmYWxpYXNfbW9kdWxlLAotICAmZW52X21vZHVsZSwKLSAgJmNvbmZpZ19sb2dfbW9kdWxlLAotICAmYXNpc19tb2R1bGUsCi0gICZpbWFwX21vZHVsZSwKLSAgJmFjdGlvbl9tb2R1bGUsCi0gICZzZXRlbnZpZl9tb2R1bGUsCi0vLyAgJmlzYXBpX21vZHVsZSwKLSAgTlVMTAotfTsKLW1vZHVsZSAqYXBfcHJlbG9hZGVkX21vZHVsZXNbXSA9IHsKLSAgJmNvcmVfbW9kdWxlLAotICAmbXBtX3dpbm50X21vZHVsZSwKLSAgJnNvX21vZHVsZSwKLSAgJm1pbWVfbW9kdWxlLAotICAmYWNjZXNzX21vZHVsZSwKLSAgJmF1dGhfbW9kdWxlLAotICAmbmVnb3RpYXRpb25fbW9kdWxlLAotICAmaW5jbHVkZXNfbW9kdWxlLAotICAmYXV0b2luZGV4X21vZHVsZSwKLSAgJmRpcl9tb2R1bGUsCi0gICZjZ2lfbW9kdWxlLAotICAmdXNlcmRpcl9tb2R1bGUsCi0gICZhbGlhc19tb2R1bGUsCi0gICZlbnZfbW9kdWxlLAotICAmY29uZmlnX2xvZ19tb2R1bGUsCi0gICZhc2lzX21vZHVsZSwKLSAgJmltYXBfbW9kdWxlLAotICAmYWN0aW9uX21vZHVsZSwKLSAgJnNldGVudmlmX21vZHVsZSwKLS8vICAmaXNhcGlfbW9kdWxlLAotICBOVUxMCi19OwpkaWZmIC0tZ2l0IGEvb3Mvd2luMzIvb3MuaCBiL29zL3dpbjMyL29zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlODAxYjIuLjAwMDAwMDAKLS0tIGEvb3Mvd2luMzIvb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLSNpZm5kZWYgQVBBQ0hFX09TX0gKLSNkZWZpbmUgQVBBQ0hFX09TX0gKLS8qIAotICogQ29tcGlsZSB0aGUgc2VydmVyIGluY2x1ZGluZyBhbGwgdGhlIFdpbmRvd3MgTlQgNC4wIGhlYWRlciBmaWxlcyBieSAKLSAqIGRlZmF1bHQuIFdlIHN0aWxsIHdhbnQgdGhlIHNlcnZlciB0byBydW4gb24gV2luOTUvOTggc28gdXNlIAotICogcnVudGltZSBjaGVja3MgYmVmb3JlIGNhbGxpbmcgTlQgc3BlY2lmaWMgZnVuY3Rpb25zIHRvIHZlcmlmeSB3ZSBhcmUgCi0gKiByZWFsbHkgcnVubmluZyBvbiBhbiBOVCBzeXN0ZW0uCi0gKi8KLSNkZWZpbmUgX1dJTjMyX1dJTk5UIDB4MDQwMAotI2luY2x1ZGUgImFwcl9nZW5lcmFsLmgiCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPHdpbnNvY2syLmg+Ci0jaW5jbHVkZSA8bXN3c29jay5oPgotI2luY2x1ZGUgPHByb2Nlc3MuaD4KLSNpbmNsdWRlIDxtYWxsb2MuaD4KLSNpbmNsdWRlIDxpby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KLSNkZWZpbmUgUExBVEZPUk0gIldpbjMyIgotCi0vKgotICogVGhpcyBmaWxlIGluIGluY2x1ZGVkIGluIGFsbCBBcGFjaGUgc291cmNlIGNvZGUuIEl0IGNvbnRhaW5zIGRlZmluaXRpb25zCi0gKiBvZiBmYWNpbGl0aWVzIGF2YWlsYWJsZSBvbiBfdGhpc18gb3BlcmF0aW5nIHN5c3RlbSAoSEFWRV8qIG1hY3JvcyksCi0gKiBhbmQgcHJvdG90eXBlcyBvZiBPUyBzcGVjaWZpYyBmdW5jdGlvbnMgZGVmaW5lZCBpbiBvcy5jCi0gKi8KLQotLyogdGVtcG9yYXJpbHkgcmVwbGFjZSBjcnlwdCAqLwotLyogY2hhciAqY3J5cHQoY29uc3QgY2hhciAqcHcsIGNvbnN0IGNoYXIgKnNhbHQpOyAqLwotI2RlZmluZSBjcnlwdChidWYsc2FsdCkJICAgIChidWYpCi0KLS8qIEFsdGhvdWdoIERJUl9UWVBFIGlzIGRpcmVudCAoc2VlIG50L3JlYWRkaXIuaCkgd2UgbmVlZCBkaXJlY3QuaCBmb3IKLSAgIGNoZGlyKCkgKi8KLSNpbmNsdWRlIDxkaXJlY3QuaD4KLQotI2RlZmluZSBTVEFUVVMKLSNpZm5kZWYgU1RSSUNUCi0jZGVmaW5lIFNUUklDVAotI2VuZGlmCi0jZGVmaW5lIENBU0VfQkxJTkRfRklMRVNZU1RFTQotI2RlZmluZSBOT19XUklURVYKLSNkZWZpbmUgTk9fVVNFX1NJR0FDVElPTgotLyogI3VuZGVmIEhBVkVfVElNRVMgKi8KLS8qICN1bmRlZiBIQVZFX0dFVFRJTUVPRkRBWSAqLwotI2RlZmluZSBVU0VfTE9OR0pNUAotI2RlZmluZSBIQVZFX01NQVAKLSNkZWZpbmUgVVNFX01NQVBfU0NPUkVCT0FSRAotI2RlZmluZSBNVUxUSVRIUkVBRAotI2RlZmluZSBIQVZFX0NBTk9OSUNBTF9GSUxFTkFNRQotI2RlZmluZSBIQVZFX0RSSVZFX0xFVFRFUlMKLSNkZWZpbmUgSEFWRV9TRU5ERklMRQotCi10eXBlZGVmIGludCB1aWRfdDsKLXR5cGVkZWYgaW50IGdpZF90OwotdHlwZWRlZiBpbnQgcGlkX3Q7Ci10eXBlZGVmIGludCBtb2RlX3Q7Ci10eXBlZGVmIGNoYXIgKiBjYWRkcl90OwotCi0vKgotRGVmaW5lIGV4cG9ydCB0eXBlcy4gQVBJX0VYUE9SVF9OT05TVEQgaXMgYSBuYXN0eSBoYWNrIHRvIGF2b2lkIGhhdmluZyB0byBkZWNsYXJlCi1ldmVyeSBjb25maWd1cmF0aW9uIGZ1bmN0aW9uIGFzIF9fc3RkY2FsbC4KLSovCi0KLSNpZiAwIC8qIEhhbmRsZWQgYnkgQVBSLi4uICovCi0jaWZkZWYgU0hBUkVEX01PRFVMRQotIyBkZWZpbmUgQVBJX1ZBUl9FWFBPUlQJCV9fZGVjbHNwZWMoZGxsaW1wb3J0KQotIyBkZWZpbmUgQVBJX0VYUE9SVCh0eXBlKSAgICBfX2RlY2xzcGVjKGRsbGltcG9ydCkgdHlwZSBfX3N0ZGNhbGwKLSMgZGVmaW5lIEFQSV9FWFBPUlRfTk9OU1REKHR5cGUpICAgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB0eXBlCi0jZWxzZQotIyBkZWZpbmUgQVBJX1ZBUl9FWFBPUlQJCV9fZGVjbHNwZWMoZGxsZXhwb3J0KQotIyBkZWZpbmUgQVBJX0VYUE9SVCh0eXBlKSAgICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdHlwZSBfX3N0ZGNhbGwKLSMgZGVmaW5lIEFQSV9FWFBPUlRfTk9OU1REKHR5cGUpICAgIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB0eXBlCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIE1PRFVMRV9WQVJfRVhQT1JUICAgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0KLSNkZWZpbmUgc3RyY2FzZWNtcChzMSwgczIpIHN0cmljbXAoczEsIHMyKQotI2RlZmluZSBzdHJuY2FzZWNtcChzMSwgczIsIG4pIHN0cm5pY21wKHMxLCBzMiwgbikKLSNkZWZpbmUgbHN0YXQoeCwgeSkgc3RhdCh4LCB5KQotI2RlZmluZSBTX0lTTE5LKG0pICgwKQotI2RlZmluZSBTX0lTUkVHKG0pICgobSAmIF9TX0lGUkVHKSA9PSBfU19JRlJFRykKLSNpZm5kZWYgU19JU0RJUgotI2RlZmluZSBTX0lTRElSKG0pICgoKG0pICYgU19JRkRJUikgPT0gU19JRkRJUikKLSNlbmRpZgotCi0jaWYgMAotI2lmbmRlZiBTX0lTUkVHCi0jZGVmaW5lIFNfSVNSRUcobSkgICAgICAoKChtKSYoU19JRlJFRykpID09IChTX0lGUkVHKSkKLSNlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgU1RESU5fRklMRU5PICAwCi0jZGVmaW5lIFNURE9VVF9GSUxFTk8gMQotI2RlZmluZSBTVERFUlJfRklMRU5PIDIKLSNkZWZpbmUgSk1QX0JVRiBqbXBfYnVmCi0jZGVmaW5lIE9fQ1JFQVQgX09fQ1JFQVQKLSNkZWZpbmUgT19SRFdSIF9PX1JEV1IKLS8qIFNlZW1zIFdpbmRvd3MgaXMgbm90IGEgc3ViZ2VuaXVzICovCi0jZGVmaW5lIE5PX1NMQUNLCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLV9faW5saW5lIGludCBhcF9vc19pc19wYXRoX2Fic29sdXRlKGNvbnN0IGNoYXIgKmZpbGUpCi17Ci0gIC8qIEZvciBub3csIGp1c3QgZG8gdGhlIHNhbWUgY2hlY2sgdGhhdCBodHRwX3JlcXVlc3QuYyBhbmQgbW9kX2FsaWFzLmMKLSAgICogZG8uIAotICAgKi8KLSAgcmV0dXJuIGZpbGVbMF0gPT0gJy8nIHx8IGZpbGVbMV0gPT0gJzonOwotfQotCi0jZGVmaW5lIF9zcGF3bnYobW9kZSxjbWRuYW1lLGFyZ3YpCSAgICBvc19zcGF3bnYobW9kZSxjbWRuYW1lLGFyZ3YpCi0jZGVmaW5lIHNwYXdudihtb2RlLGNtZG5hbWUsYXJndikJICAgIG9zX3NwYXdudihtb2RlLGNtZG5hbWUsYXJndikKLSNkZWZpbmUgX3NwYXdudmUobW9kZSxjbWRuYW1lLGFyZ3YsZW52cCkgICAgb3Nfc3Bhd252ZShtb2RlLGNtZG5hbWUsYXJndixlbnZwKQotI2RlZmluZSBzcGF3bnZlKG1vZGUsY21kbmFtZSxhcmd2LGVudnApCSAgICBvc19zcGF3bnZlKG1vZGUsY21kbmFtZSxhcmd2LGVudnApCi0jZGVmaW5lIF9zcGF3bmxlCQkJICAgIG9zX3NwYXdubGUKLSNkZWZpbmUgc3Bhd25sZQkJCQkgICAgb3Nfc3Bhd25sZQotCi0vKiBPUy1kZXBlbmRlbnQgZmlsZW5hbWUgcm91dGluZXMgaW4gdXRpbF93aW4zMi5jICovCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfb3NfY2Fub25pY2FsX2ZpbGVuYW1lKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqZmlsZSk7Ci1BUElfRVhQT1JUKGNoYXIgKikgYXBfb3NfY2FzZV9jYW5vbmljYWxfZmlsZW5hbWUoYXBfY29udGV4dF90ICpwUG9vbCwgY29uc3QgY2hhciAqc3pGaWxlKTsKLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9vc19zeXN0ZW1jYXNlX2ZpbGVuYW1lKGFwX2NvbnRleHRfdCAqcFBvb2wsIGNvbnN0IGNoYXIgKnN6RmlsZSk7Ci1pbnQgYXBfb3NfaXNfZmlsZW5hbWVfdmFsaWQoY29uc3QgY2hhciAqZmlsZSk7Ci1pbnQgb3Nfc3RyZnRpbWUoY2hhciAqLCBzaXplX3QgLCBjb25zdCBjaGFyICosIGNvbnN0IHN0cnVjdCB0bSAqKTsKLQotLyogQWJzdHJhY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggc2hhcmVkIG9iamVjdCBmaWxlcyAoRExMcyBvbiBXaW4zMikuCi0gKiBUaGVzZSBhcmUgdXNlZCBieSBtb2Rfc28uYwotICovCi0jZGVmaW5lIGFwX29zX2Rzb19oYW5kbGVfdCAgSElOU1RBTkNFCi0jZGVmaW5lIGFwX29zX2Rzb19pbml0KCkKLSNkZWZpbmUgYXBfb3NfZHNvX2xvYWQobCkgICBMb2FkTGlicmFyeUV4KGwsIE5VTEwsIExPQURfV0lUSF9BTFRFUkVEX1NFQVJDSF9QQVRIKQotI2RlZmluZSBhcF9vc19kc29fdW5sb2FkKGwpIEZyZWVMaWJyYXJ5KGwpCi0jZGVmaW5lIGFwX29zX2Rzb19zeW0oaCxzKSAgR2V0UHJvY0FkZHJlc3MoaCxzKQotI2RlZmluZSBhcF9vc19kc29fZXJyb3IoKSAgICIiCS8qIGZvciBub3cgKi8KLQotLyogT3RoZXIgYXBfb3NfIHJvdXRpbmVzIG5vdCB1c2VkIGJ5IHRoaXMgcGxhdGZvcm0gKi8KLSNkZWZpbmUgYXBfb3Nfa2lsbChwaWQsIHNpZykgICAgICAgICAgICAgICAga2lsbChwaWQsIHNpZykKLQotLyogTW92ZWQgZnJvbSBtdWx0aXRocmVhZC5oLiBBeGUgdGhpcyBzdHVmZiB3aGVuIEFQUiBjb21lcyBvbmxpbmUuLi4gKi8KLQotI2RlZmluZSBNVUxUSV9PSyAoMCkKLSNkZWZpbmUgTVVMVElfVElNRU9VVCAoMSkKLSNkZWZpbmUgTVVMVElfRVJSICgyKQotCi10eXBlZGVmIHZvaWQgbXV0ZXg7Ci10eXBlZGVmIHZvaWQgc2VtYXBob3JlOwotdHlwZWRlZiB2b2lkIHRocmVhZDsKLXR5cGVkZWYgdm9pZCBldmVudDsKLQotdGhyZWFkICpjcmVhdGVfdGhyZWFkKHZvaWQgKHRocmVhZF9mbikgKHZvaWQgKnRocmVhZF9hcmcpLCB2b2lkICp0aHJlYWRfYXJnKTsKLWludCBraWxsX3RocmVhZCh0aHJlYWQgKnRocmVhZF9pZCk7Ci1pbnQgYXdhaXRfdGhyZWFkKHRocmVhZCAqdGhyZWFkX2lkLCBpbnQgc2VjX3RvX3dhaXQpOwotdm9pZCBleGl0X3RocmVhZChpbnQgc3RhdHVzKTsKLXZvaWQgZnJlZV90aHJlYWQodGhyZWFkICp0aHJlYWRfaWQpOwotCi1zZW1hcGhvcmUgKmNyZWF0ZV9zZW1hcGhvcmUoaW50IGluaXRpYWwpOwotaW50IGFjcXVpcmVfc2VtYXBob3JlKHNlbWFwaG9yZSAqc2VtYXBob3JlX2lkKTsKLWludCByZWxlYXNlX3NlbWFwaG9yZShzZW1hcGhvcmUgKnNlbWFwaG9yZV9pZCk7Ci12b2lkIGRlc3Ryb3lfc2VtYXBob3JlKHNlbWFwaG9yZSAqc2VtYXBob3JlX2lkKTsKLQotZXZlbnQgKmNyZWF0ZV9ldmVudChpbnQgbWFudWFsLCBpbnQgaW5pdGlhbCwgY2hhciAqbmFtZSk7Ci1ldmVudCAqb3Blbl9ldmVudChjaGFyICpuYW1lKTsKLWludCBhY3F1aXJlX2V2ZW50KGV2ZW50ICpldmVudF9pZCk7Ci1pbnQgc2V0X2V2ZW50KGV2ZW50ICpldmVudF9pZCk7Ci1pbnQgcmVzZXRfZXZlbnQoZXZlbnQgKmV2ZW50X2lkKTsKLXZvaWQgZGVzdHJveV9ldmVudChldmVudCAqZXZlbnRfaWQpOwotCi0jZW5kaWYgICAvKiAhIEFQQUNIRV9PU19IICovCmRpZmYgLS1naXQgYS9vcy93aW4zMi9yZXNvdXJjZS5oIGIvb3Mvd2luMzIvcmVzb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIwYmI2YS4uMDAwMDAwMAotLS0gYS9vcy93aW4zMi9yZXNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy97e05PX0RFUEVOREVOQ0lFU319Ci0vLyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBnZW5lcmF0ZWQgaW5jbHVkZSBmaWxlLgotLy8gVXNlZCBieSBBcGFjaGUucmMKLS8vCi0jZGVmaW5lIElESV9BUEFDSEUgICAgICAgICAgICAgICAgICAgICAgMTAxCi0KLS8vIE5leHQgZGVmYXVsdCB2YWx1ZXMgZm9yIG5ldyBvYmplY3RzCi0vLyAKLSNpZmRlZiBBUFNUVURJT19JTlZPS0VECi0jaWZuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKLSNkZWZpbmUgX0FQU19OT19NRkMgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIF9BUFNfTkVYVF9SRVNPVVJDRV9WQUxVRSAgICAgICAgMTAyCi0jZGVmaW5lIF9BUFNfTkVYVF9DT01NQU5EX1ZBTFVFICAgICAgICAgNDAwMDEKLSNkZWZpbmUgX0FQU19ORVhUX0NPTlRST0xfVkFMVUUgICAgICAgICAxMDAwCi0jZGVmaW5lIF9BUFNfTkVYVF9TWU1FRF9WQUxVRSAgICAgICAgICAgMTAxCi0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3Mvd2luMzIvdXRpbF93aW4zMi5jIGIvb3Mvd2luMzIvdXRpbF93aW4zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjFiNmRkLi4wMDAwMDAwCi0tLSBhL29zL3dpbjMyL3V0aWxfd2luMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDU5NCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyAKLSAqIGFyZSBtZXQ6IAotICogCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gIAotICogCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCAKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAKLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgCi0gKiAgICBkaXN0cmlidXRpb24uIAotICogCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogCi0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwIAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIgCi0gKiAKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8gCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgCi0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4gCi0gKiAKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiIAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLiAKLSAqIAotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZyAKLSAqICAgIGFja25vd2xlZGdtZW50OiAKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAgCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIiAKLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZIAotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SIAotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCAKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCAKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyAKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIAotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCAKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAotICogCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueSAKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZCAKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciAKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4gCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIAotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uIAotICogCi0gKi8gCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0KLS8qIFJldHVybnMgVFJVRSBpZiB0aGUgaW5wdXQgc3RyaW5nIGlzIGEgc3RyaW5nCi0gKiBvZiBvbmUgb3IgbW9yZSAnLicgY2hhcmFjdGVycy4KLSAqLwotc3RhdGljIEJPT0wgT25seURvdHMoY2hhciAqcFN0cmluZykKLXsKLSAgICBjaGFyICpjOwotCi0gICAgaWYgKCpwU3RyaW5nID09ICdcMCcpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIGZvciAoYyA9IHBTdHJpbmc7KmM7YysrKQotICAgICAgICBpZiAoKmMgIT0gJy4nKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qIEFjY2VwdHMgYXMgaW5wdXQgYSBwYXRobmFtZSwgYW5kIHRyaWVzIHRvIG1hdGNoIGl0IHRvIGFuIAotICogZXhpc3RpbmcgcGF0aCBhbmQgcmV0dXJuIHRoZSBwYXRobmFtZSBpbiB0aGUgY2FzZSB0aGF0Ci0gKiBpcyBwcmVzZW50IG9uIHRoZSBleGlzdGluZyBwYXRoLiAgVGhpcyByb3V0aW5lIGFsc28KLSAqIGNvbnZlcnRzIGFsaWFzIG5hbWVzIHRvIGxvbmcgbmFtZXMuCi0gKi8KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9vc19zeXN0ZW1jYXNlX2ZpbGVuYW1lKGFwX2NvbnRleHRfdCAqcFBvb2wsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3pGaWxlKQotewotICAgIGNoYXIgYnVmW0hVR0VfU1RSSU5HX0xFTl07Ci0gICAgY2hhciAqcElucHV0TmFtZTsKLSAgICBjaGFyICpwLCAqcTsKLSAgICBCT09MIGJEb25lID0gRkFMU0U7Ci0gICAgQk9PTCBiRmlsZUV4aXN0cyA9IFRSVUU7Ci0gICAgSEFORExFIGhGaW5kOwotICAgIFdJTjMyX0ZJTkRfREFUQSB3ZmQ7Ci0KLSAgICBpZiAoIXN6RmlsZSB8fCBzdHJsZW4oc3pGaWxlKSA9PSAwIHx8IHN0cmxlbihzekZpbGUpID49IHNpemVvZihidWYpKQotICAgICAgICByZXR1cm4gYXBfcHN0cmR1cChwUG9vbCwgIiIpOwotCi0gICAgYnVmWzBdID0gJ1wwJzsKLSAgICBwSW5wdXROYW1lID0gYXBfcHN0cmR1cChwUG9vbCwgc3pGaWxlKTsKLQotICAgIC8qIEZpcnN0IGNvbnZlcnQgYWxsIHNsYXNoZXMgdG8gXCBzbyBXaW4zMiBjYWxscyB3b3JrIE9LICovCi0gICAgZm9yIChwID0gcElucHV0TmFtZTsgKnA7IHArKykgewotICAgICAgICBpZiAoKnAgPT0gJy8nKQotICAgICAgICAgICAgKnAgPSAnXFwnOwotICAgIH0KLSAgICAKLSAgICBwID0gcElucHV0TmFtZTsKLSAgICAvKiBJZiB0aGVyZSBpcyBkcml2ZSBpbmZvcm1hdGlvbiwgY29weSBpdCBvdmVyLiAqLyAKLSAgICBpZiAocElucHV0TmFtZVsxXSA9PSAnOicpIHsKLSAgICAgICAgYnVmWzBdID0gdG9sb3dlcigqcCsrKTsKLSAgICAgICAgYnVmWzFdID0gKnArKzsKLSAgICAgICAgYnVmWzJdID0gJ1wwJzsKLQotICAgICAgICAvKiBJZiBhbGwgd2UgaGF2ZSBpcyBhIGRyaXZlIGxldHRlciwgdGhlbiB3ZSBhcmUgZG9uZSAqLwotICAgICAgICBpZiAoc3RybGVuKHBJbnB1dE5hbWUpID09IDIpCi0gICAgICAgICAgICBiRG9uZSA9IFRSVUU7Ci0gICAgfQotICAgIAotICAgIHEgPSBwOwotICAgIGlmICgqcCA9PSAnXFwnKSB7Ci0gICAgICAgIHArKzsKLSAgICAgICAgaWYgKCpwID09ICdcXCcpICAvKiBQb3NzaWJsZSBVTkMgbmFtZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBwKys7Ci0gICAgICAgICAgICAvKiBHZXQgcGFzdCB0aGUgbWFjaGluZSBuYW1lLiAgRmluZEZpcnN0RmlsZSAqLwotICAgICAgICAgICAgLyogd2lsbCBub3QgZmluZCBhIG1hY2hpbmUgbmFtZSBvbmx5ICovCi0gICAgICAgICAgICBwID0gc3RyY2hyKHAsICdcXCcpOyAKLSAgICAgICAgICAgIGlmIChwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHArKzsKLSAgICAgICAgICAgICAgICAvKiBHZXQgcGFzdCB0aGUgc2hhcmUgbmFtZS4gIEZpbmRGaXJzdEZpbGUgKi8KLSAgICAgICAgICAgICAgICAvKiB3aWxsIG5vdCBmaW5kIGEgXFxtYWNoaW5lXHNoYXJlIG5hbWUgb25seSAqLwotICAgICAgICAgICAgICAgIHAgPSBzdHJjaHIocCwgJ1xcJyk7IAotICAgICAgICAgICAgICAgIGlmIChwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cm5jYXQoYnVmLHEscC1xKTsKLSAgICAgICAgICAgICAgICAgICAgcSA9IHA7Ci0gICAgICAgICAgICAgICAgICAgIHArKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghcCkKLSAgICAgICAgICAgICAgICBwID0gcTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHAgPSBzdHJjaHIocCwgJ1xcJyk7Ci0KLSAgICB3aGlsZSAoIWJEb25lKSB7Ci0gICAgICAgIGlmIChwKQotICAgICAgICAgICAgKnAgPSAnXDAnOwotCi0gICAgICAgIGlmIChzdHJjaHIocSwgJyonKSB8fCBzdHJjaHIocSwgJz8nKSkKLSAgICAgICAgICAgIGJGaWxlRXhpc3RzID0gRkFMU0U7Ci0KLSAgICAgICAgLyogSWYgdGhlIHBhdGggZXhpc3RzIHNvIGZhciwgY2FsbCBGaW5kRmlyc3RGaWxlCi0gICAgICAgICAqIGFnYWluLiAgSG93ZXZlciwgaWYgdGhpcyBwb3J0aW9uIG9mIHRoZSBwYXRoIGNvbnRhaW5zCi0gICAgICAgICAqIG9ubHkgJy4nIGNoYXJhdGVycywgc2tpcCB0aGUgY2FsbCB0byBGaW5kRmlyc3RGaWxlCi0gICAgICAgICAqIHNpbmNlIGl0IHdpbGwgY29udmVydCAnLicgYW5kICcuLicgdG8gYWN0dWFsIG5hbWVzLgotICAgICAgICAgKiBOb3RlOiBpbiB0aGUgY2FsbCB0byBPbmx5RG90cywgd2UgbWF5IGhhdmUgdG8gc2tpcAotICAgICAgICAgKiAgICAgICBhIGxlYWRpbmcgc2xhc2guCi0gICAgICAgICAqLwotICAgICAgICBpZiAoYkZpbGVFeGlzdHMgJiYgIU9ubHlEb3RzKCgqcSA9PSAnLicgPyBxIDogcSsxKSkpIHsgICAgICAgICAgICAKLSAgICAgICAgICAgIGhGaW5kID0gRmluZEZpcnN0RmlsZShwSW5wdXROYW1lLCAmd2ZkKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGhGaW5kID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgYkZpbGVFeGlzdHMgPSBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIEZpbmRDbG9zZShoRmluZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKnEgPT0gJ1xcJykKLSAgICAgICAgICAgICAgICAgICAgc3RyY2F0KGJ1ZiwiXFwiKTsKLSAgICAgICAgICAgICAgICBzdHJjYXQoYnVmLCB3ZmQuY0ZpbGVOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCFiRmlsZUV4aXN0cyB8fCBPbmx5RG90cygoKnEgPT0gJy4nID8gcSA6IHErMSkpKSB7Ci0gICAgICAgICAgICBzdHJjYXQoYnVmLCBxKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHApIHsKLSAgICAgICAgICAgIHEgPSBwOwotICAgICAgICAgICAgKnArKyA9ICdcXCc7Ci0gICAgICAgICAgICBwID0gc3RyY2hyKHAsICdcXCcpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYkRvbmUgPSBUUlVFOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qIEZpcnN0IGNvbnZlcnQgYWxsIHNsYXNoZXMgdG8gLyBzbyBzZXJ2ZXIgY29kZSBoYW5kbGVzIGl0IG9rICovCi0gICAgZm9yIChwID0gYnVmOyAqcDsgcCsrKSB7Ci0gICAgICAgIGlmICgqcCA9PSAnXFwnKQotICAgICAgICAgICAgKnAgPSAnLyc7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFwX3BzdHJkdXAocFBvb2wsIGJ1Zik7Ci19Ci0KLQotLyogIFBlcmZvcm0gY2Fub25pY2FsaXphdGlvbiB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCB0aGUKLSAqICBpbnB1dCBjYXNlIGlzIHByZXNlcnZlZC4KLSAqLwotQVBJX0VYUE9SVChjaGFyICopIGFwX29zX2Nhc2VfY2Fub25pY2FsX2ZpbGVuYW1lKGFwX2NvbnRleHRfdCAqcFBvb2wsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN6RmlsZSkKLXsKLSAgICBjaGFyICpwTmV3U3RyOwotICAgIGNoYXIgKnM7Ci0gICAgY2hhciAqcDsgCi0gICAgY2hhciAqcTsKLQotICAgIGlmIChzekZpbGUgPT0gTlVMTCB8fCBzdHJsZW4oc3pGaWxlKSA9PSAwKQotICAgICAgICByZXR1cm4gYXBfcHN0cmR1cChwUG9vbCwgIiIpOwotCi0gICAgcE5ld1N0ciA9IGFwX3BzdHJkdXAocFBvb2wsIHN6RmlsZSk7Ci0KLSAgICAvKiAgQ2hhbmdlIGFsbCAnXCcgY2hhcmFjdGVycyB0byAnLycgY2hhcmFjdGVycy4KLSAgICAgKiAgV2hpbGUgZG9pbmcgdGhpcywgcmVtb3ZlIGFueSB0cmFpbGluZyAnLicuCi0gICAgICogIEFsc28sIGJsb3cgYXdheSBhbnkgZGlyZWN0b3JpZXMgd2l0aCAzIG9yCi0gICAgICogIG1vcmUgJy4nCi0gICAgICovCi0gICAgZm9yIChwID0gcE5ld1N0cixzID0gcE5ld1N0cjsgKnM7IHMrKyxwKyspIHsKLSAgICAgICAgaWYgKCpzID09ICdcXCcgfHwgKnMgPT0gJy8nKSB7Ci0KLSAgICAgICAgICAgIHEgPSBwOwotICAgICAgICAgICAgd2hpbGUgKHAgPiBwTmV3U3RyICYmICoocC0xKSA9PSAnLicpCi0gICAgICAgICAgICAgICAgcC0tOwotCi0gICAgICAgICAgICBpZiAocCA9PSBwTmV3U3RyICYmIHEtcCA8PSAyICYmICpwID09ICcuJykKLSAgICAgICAgICAgICAgICBwID0gcTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHAgPiBwTmV3U3RyICYmIHAgPCBxICYmICoocC0xKSA9PSAnLycpIHsKLSAgICAgICAgICAgICAgICBpZiAocS1wID4gMikKLSAgICAgICAgICAgICAgICAgICAgcC0tOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcCA9IHE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICpwID0gJy8nOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgKnAgPSAqczsKLSAgICAgICAgfQotICAgIH0KLSAgICAqcCA9ICdcMCc7Ci0KLSAgICAvKiAgQmxvdyBhd2F5IGFueSBmaW5hbCB0cmFpbGluZyAnLicgc2luY2Ugb24gV2luMzIKLSAgICAgKiAgZm9vLmJhdCA9PSBmb28uYmF0LiA9PSBmb28uYmF0Li4uIGV0Yy4KLSAgICAgKiAgQWxzbyBibG93IGF3YXkgYW55IHRyYWlsaW5nIHNwYWNlcyBzaW5jZQotICAgICAqICAiZmlsZW5hbWUiID09ICJmaWxlbmFtZSAiCi0gICAgICovCi0gICAgcSA9IHA7Ci0gICAgd2hpbGUgKHAgPiBwTmV3U3RyICYmICgqKHAtMSkgPT0gJy4nIHx8ICoocC0xKSA9PSAnICcpKQotICAgICAgICBwLS07Ci0gICAgaWYgKChwID4gcE5ld1N0cikgfHwKLSAgICAgICAgKHAgPT0gcE5ld1N0ciAmJiBxLXAgPiAyKSkKLSAgICAgICAgKnAgPSAnXDAnOwotICAgICAgICAKLQotICAgIC8qICBPbmUgbW9yZSBzZWN1cml0eSBpc3N1ZSB0byBkZWFsIHdpdGguICBXaW4zMiBhbGxvd3MKLSAgICAgKiAgeW91IHRvIGNyZWF0ZSBsb25nIGZpbGVuYW1lcy4gIEhvd2V2ZXIsIGFsaWFzIGZpbGVuYW1lcwotICAgICAqICBhcmUgYWx3YXlzIGNyZWF0ZWQgc28gdGhhdCB0aGUgZmlsZW5hbWUgd2lsbAotICAgICAqICBjb25mb3JtIHRvIDguMyBydWxlcy4gIEFjY29yZGluZyB0byB0aGUgTWljcm9zb2Z0Ci0gICAgICogIERldmVsb3BlcidzIG5ldHdvcmsgQ0QgKDEvOTgpIAotICAgICAqICAiQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYWxpYXNlcyBhcmUgY29tcG9zZWQgb2YgdGhlIAotICAgICAqICAgZmlyc3Qgc2l4IGNoYXJhY3RlcnMgb2YgdGhlIGZpbGVuYW1lIHBsdXMgfm4gCi0gICAgICogICAod2hlcmUgbiBpcyBhIG51bWJlcikgYW5kIHRoZSBmaXJzdCB0aHJlZSBjaGFyYWN0ZXJzIAotICAgICAqICAgYWZ0ZXIgdGhlIGxhc3QgcGVyaW9kLiIKLSAgICAgKiAgSGVyZSwgd2UgYXR0ZW1wdCB0byBkZXRlY3QgYW5kIGRlY29kZSB0aGVzZSBuYW1lcy4KLSAgICAgKi8KLSAgICBwID0gc3RyY2hyKHBOZXdTdHIsICd+Jyk7Ci0gICAgaWYgKHAgIT0gTlVMTCkgewotICAgICAgICBjaGFyICpwQ29udmVydGVkTmFtZSwgKnBRc3RyLCAqcFBzdHI7Ci0gICAgICAgIGNoYXIgYnVmW0hVR0VfU1RSSU5HX0xFTl07Ci0gICAgICAgIC8qIFdlIHBvdGVudGlhbGx5IGhhdmUgYSBzaG9ydCBuYW1lLiAgQ2FsbCAKLSAgICAgICAgICogYXBfb3Nfc3lzdGVtY2FzZV9maWxlbmFtZSB0byBleGFtaW5lIHRoZSBmaWxlc3lzdGVtCi0gICAgICAgICAqIGFuZCBwb3NzaWJseSBleHRyYWN0IHRoZSBsb25nIG5hbWUuCi0gICAgICAgICAqLwotICAgICAgICBwQ29udmVydGVkTmFtZSA9IGFwX29zX3N5c3RlbWNhc2VfZmlsZW5hbWUocFBvb2wsIHBOZXdTdHIpOwotCi0gICAgICAgIC8qIFNpbmNlIHdlIHdhbnQgdG8gcHJlc2VydmUgdGhlIGluY29taW5nIGNhc2UgYXMgbXVjaAotICAgICAgICAgKiBhcyB3ZSBjYW4sIGNvbXBhcmUgZm9yIGRpZmZlcmVuY2VzIGluIHRoZSBzdHJpbmcgYW5kCi0gICAgICAgICAqIG9ubHkgc3Vic3RpdHV0ZSBpbiB0aGUgcGF0aCBuYW1lcyB0aGF0IGNoYW5nZWQuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoc3RyaWNtcChwTmV3U3RyLCBwQ29udmVydGVkTmFtZSkpIHsKLSAgICAgICAgICAgIGJ1ZlswXSA9ICdcMCc7Ci0KLSAgICAgICAgICAgIHEgPSBwUXN0ciA9IHBDb252ZXJ0ZWROYW1lOwotICAgICAgICAgICAgcCA9IHBQc3RyID0gcE5ld1N0cjsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBxID0gc3RyY2hyKHEsJy8nKTsKLSAgICAgICAgICAgICAgICBwID0gc3RyY2hyKHAsJy8nKTsKLQotICAgICAgICAgICAgICAgIGlmIChwICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgKnEgPSAnXDAnOwotICAgICAgICAgICAgICAgICAgICAqcCA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHN0cmljbXAocFFzdHIsIHBQc3RyKSkgCi0gICAgICAgICAgICAgICAgICAgIHN0cmNhdChidWYsIHBRc3RyKTsgICAvKiBDb252ZXJ0ZWQgbmFtZSAqLwotICAgICAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgICAgICAgIHN0cmNhdChidWYsIHBQc3RyKTsgICAvKiBPcmlnaW5hbCBuYW1lICAqLwotCi0KLSAgICAgICAgICAgICAgICBpZiAocCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBRc3RyID0gcTsKLSAgICAgICAgICAgICAgICAgICAgcFBzdHIgPSBwOwotICAgICAgICAgICAgICAgICAgICAqcSsrID0gJy8nOwotICAgICAgICAgICAgICAgICAgICAqcCsrID0gJy8nOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSB3aGlsZSAocCAhPSBOVUxMKTsgCi0KLSAgICAgICAgICAgIHBOZXdTdHIgPSBhcF9wc3RyZHVwKHBQb29sLCBidWYpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICByZXR1cm4gcE5ld1N0cjsKLX0KLQotLyogIFBlcmZvcm0gY29tcGxldGUgY2Fub25pY2FsaXphdGlvbi4KLSAqLwotQVBJX0VYUE9SVChjaGFyICopIGFwX29zX2Nhbm9uaWNhbF9maWxlbmFtZShhcF9jb250ZXh0X3QgKnBQb29sLCBjb25zdCBjaGFyICpzekZpbGUpCi17Ci0gICAgY2hhciAqcE5ld05hbWU7Ci0gICAgcE5ld05hbWUgPSBhcF9vc19jYXNlX2Nhbm9uaWNhbF9maWxlbmFtZShwUG9vbCwgc3pGaWxlKTsKLSAgICBzdHJsd3IocE5ld05hbWUpOwotICAgIHJldHVybiBwTmV3TmFtZTsKLX0KLQotLyogV2luOTUgZG9lc24ndCBsaWtlIHRyYWlsaW5nIC9zLiBOVCBhbmQgVW5peCBkb24ndCBtaW5kLiBUaGlzIHdvcmtzIAotICogYXJvdW5kIHRoZSBwcm9ibGVtLgotICogRXJyci4uLiBleGNlcHQgaWYgaXQgaXMgVU5DIGFuZCB3ZSBhcmUgcmVmZXJyaW5nIHRvIHRoZSByb290IG9mIAotICogdGhlIFVOQywgd2UgTVVTVCBoYXZlIGEgdHJhaWxpbmcgXCBhbmQgd2UgY2FuJ3QgdXNlIC9zLiBKZWV6LiAKLSAqIE5vdCBzdXJlIGlmIHRoaXMgcmVmZXJzIHRvIGFsbCBVTkNzIG9yIGp1c3Qgcm9vdHMsCi0gKiBidXQgSSdtIGdvaW5nIHRvIGZpeCBpdCBmb3IgYWxsIGNhc2VzIGZvciBub3cuIChCZW4pCi0gKi8KLQotI3VuZGVmIHN0YXQKLUFQSV9FWFBPUlQoaW50KSBvc19zdGF0KGNvbnN0IGNoYXIgKnN6UGF0aCwgc3RydWN0IHN0YXQgKnBTdGF0KQotewotICAgIGludCBuOwotICAgIAotICAgIGlmIChzdHJsZW4oc3pQYXRoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAoc3pQYXRoWzBdID09ICcvJyAmJiBzelBhdGhbMV0gPT0gJy8nKSB7Ci0JY2hhciBidWZbX01BWF9QQVRIXTsKLQljaGFyICpzOwotCWludCBuU2xhc2hlcyA9IDA7Ci0KLQlhcF9hc3NlcnQoc3RybGVuKHN6UGF0aCkgPCBfTUFYX1BBVEgpOwotCXN0cmNweShidWYsIHN6UGF0aCk7Ci0JZm9yIChzID0gYnVmOyAqczsgKytzKSB7Ci0JICAgIGlmICgqcyA9PSAnLycpIHsKLQkJKnMgPSAnXFwnOwotCQkrK25TbGFzaGVzOwotCSAgICB9Ci0JfQotCS8qIHRoZW4gd2UgbmVlZCB0byBhZGQgb25lIG1vcmUgdG8gZ2V0IFxcbWFjaGluZVxzaGFyZVwgKi8KLQlpZiAoblNsYXNoZXMgPT0gMykgewotCSAgICAqcysrID0gJ1xcJzsKLQl9Ci0JKnMgPSAnXDAnOwotCXJldHVybiBzdGF0KGJ1ZiwgcFN0YXQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQmVsb3cgcmVtb3ZlcyB0aGUgdHJhaWxpbmcgLywgaG93ZXZlciwgZG8gbm90IHJlbW92ZQotICAgICAqIGl0IGluIHRoZSBjYXNlIG9mICd4Oi8nIG9yIHN0YXQgd2lsbCBmYWlsCi0gICAgICovCi0gICAgbiA9IHN0cmxlbihzelBhdGgpOwotICAgIGlmICgoc3pQYXRoW24gLSAxXSA9PSAnXFwnIHx8IHN6UGF0aFtuIC0gMV0gPT0gJy8nKSAmJgotICAgICAgICAhKG4gPT0gMyAmJiBzelBhdGhbMV0gPT0gJzonKSkgewotICAgICAgICBjaGFyIGJ1ZltfTUFYX1BBVEhdOwotICAgICAgICAKLSAgICAgICAgYXBfYXNzZXJ0KG4gPCBfTUFYX1BBVEgpOwotICAgICAgICBzdHJjcHkoYnVmLCBzelBhdGgpOwotICAgICAgICBidWZbbiAtIDFdID0gJ1wwJzsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzdGF0KGJ1ZiwgcFN0YXQpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdChzelBhdGgsIHBTdGF0KTsKLX0KLQotCi0jdW5kZWYgc3RyZnRpbWUKLQotLyogUGFydGlhbCByZXBsYWNlbWVudCBmb3Igc3RyZnRpbWUuIFRoaXMgYWRkcyBjZXJ0YWluIGV4cGFuZG9zIHRvIHRoZQotICogV2luZG93cyB2ZXJzaW9uCi0gKi8KLQotQVBJX0VYUE9SVChpbnQpIG9zX3N0cmZ0aW1lKGNoYXIgKnMsIHNpemVfdCBtYXgsIGNvbnN0IGNoYXIgKmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdG0gKnRtKSB7Ci0gICAvKiBJZiB0aGUgbmV3IGZvcm1hdCBzdHJpbmcgaXMgYmlnZ2VyIHRoYW4gbWF4LCB0aGUgcmVzdWx0IHN0cmluZyBwcm9iYWJseQotICAgICogd29uJ3QgZml0IGFueXdheS4gV2hlbiAlLWV4cGFuZG9zIGFyZSBhZGRlZCwgbWFkZSBzdXJlIHRoZSBwYWRkaW5nIGJlbG93Ci0gICAgKiBpcyBlbm91Z2guCi0gICAgKi8KLSAgICBjaGFyICpuZXdfZm9ybWF0ID0gKGNoYXIgKikgX2FsbG9jYShtYXggKyAxMSk7Ci0gICAgc2l6ZV90IGksIGosIGZvcm1hdF9sZW5ndGggPSBzdHJsZW4oZm9ybWF0KTsKLSAgICBpbnQgcmV0dXJuX3ZhbHVlOwotICAgIGludCBsZW5ndGhfd3JpdHRlbjsKLQotICAgIGZvciAoaSA9IDAsIGogPSAwOyAoaSA8IGZvcm1hdF9sZW5ndGggJiYgaiA8IG1heCk7KSB7Ci0gICAgICAgIGlmIChmb3JtYXRbaV0gIT0gJyUnKSB7Ci0gICAgICAgICAgICBuZXdfZm9ybWF0W2orK10gPSBmb3JtYXRbaSsrXTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoZm9ybWF0W2krMV0pIHsKLSAgICAgICAgICAgIGNhc2UgJ0QnOgotICAgICAgICAgICAgICAgIC8qIElzIHRoaXMgbG9jYWxlIGRlcGVuZGVudD8gU2hvdWxkbid0IGJlLi4uCi0gICAgICAgICAgICAgICAgICAgQWxzbyBub3RlIHRoZSB5ZWFyIDIwMDAgZXhwb3N1cmUgaGVyZSAqLwotICAgICAgICAgICAgICAgIG1lbWNweShuZXdfZm9ybWF0ICsgaiwgIiVtLyVkLyV5IiwgOCk7Ci0gICAgICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgICAgIGogKz0gODsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3InOgotICAgICAgICAgICAgICAgIG1lbWNweShuZXdfZm9ybWF0ICsgaiwgIiVJOiVNOiVTICVwIiwgMTEpOwotICAgICAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgICAgICAgICBqICs9IDExOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnVCc6Ci0gICAgICAgICAgICAgICAgbWVtY3B5KG5ld19mb3JtYXQgKyBqLCAiJUg6JU06JVMiLCA4KTsKLSAgICAgICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgICAgICAgICAgaiArPSA4OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnZSc6Ci0gICAgICAgICAgICAgICAgbGVuZ3RoX3dyaXR0ZW4gPSBhcF9zbnByaW50ZihuZXdfZm9ybWF0ICsgaiwgbWF4IC0gaiwgIiUyZCIsCi0gICAgICAgICAgICAgICAgICAgIHRtLT50bV9tZGF5KTsKLSAgICAgICAgICAgICAgICBqID0gKGxlbmd0aF93cml0dGVuID09IC0xKSA/IG1heCA6IChqICsgbGVuZ3RoX3dyaXR0ZW4pOwotICAgICAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLyogV2Uga25vdyB3ZSBjYW4gYWR2YW5jZSB0d28gY2hhcmFjdGVycyBmb3J3YXJkIGhlcmUuICovCi0gICAgICAgICAgICAgICAgbmV3X2Zvcm1hdFtqKytdID0gZm9ybWF0W2krK107Ci0gICAgICAgICAgICAgICAgbmV3X2Zvcm1hdFtqKytdID0gZm9ybWF0W2krK107Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGogPj0gbWF4KSB7Ci0gICAgICAgICpzID0gJ1wwJzsgIC8qIERlZmVuc2l2ZSBwcm9ncmFtbWluZywgb2theSBzaW5jZSBvdXRwdXQgaXMgdW5kZWZpbmVkICovCi0gICAgICAgIHJldHVybl92YWx1ZSA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbmV3X2Zvcm1hdFtqXSA9ICdcMCc7Ci0gICAgICAgIHJldHVybl92YWx1ZSA9IHN0cmZ0aW1lKHMsIG1heCwgbmV3X2Zvcm1hdCwgdG0pOwotICAgIH0KLSAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotfQotCi0vKgotICogYXBfb3NfaXNfZmlsZW5hbWVfdmFsaWQgaXMgZ2l2ZW4gYSBmaWxlbmFtZSwgYW5kIHJldHVybnMgMCBpZiB0aGUgZmlsZW5hbWUKLSAqIGlzIG5vdCB2YWxpZCBmb3IgdXNlIG9uIHRoaXMgc3lzdGVtLiBPbiBXaW5kb3dzLCB0aGlzIG1lYW5zIGl0IGZhaWxzIGFueQotICogb2YgdGhlIHRlc3RzIGJlbG93LiBPdGhlcndpc2UgcmV0dXJucyAxLgotICoKLSAqIFRlc3QgZm9yIGZpbGVuYW1lIHZhbGlkaXR5IG9uIFdpbjMyLiBUaGlzIGlzIG9mIHRlc3RzIGNvbWUgaW4gcGFydCBmcm9tCi0gKiB0aGUgTVNETiBhcnRpY2xlIGF0ICJUZWNobmljYWwgQXJ0aWNsZXMsIFdpbmRvd3MgUGxhdGZvcm0sIEJhc2UgU2VydmljZXMsCi0gKiBHdWlkZWxpbmVzLCBNYWtpbmcgUm9vbSBmb3IgTG9uZyBGaWxlbmFtZXMiIGFsdGhvdWdoIHRoZSBpbmZvcm1hdGlvbgotICogaW4gTVNETiBhYm91dCBmaWxlbmFtZSB0ZXN0aW5nIGlzIGluY29tcGxldGUgb3IgY29uZmxpY3RpbmcuIFRoZXJlIGlzIGEKLSAqIHNpbWlsYXIgc2V0IG9mIHRlc3RzIGluICJUZWNobmljYWwgQXJ0aWNsZXMsIFdpbmRvd3MgUGxhdGZvcm0sIEJhc2UgU2VydmljZXMsCi0gKiBHdWlkZWxpbmVzLCBNb3ZpbmcgVW5peCBBcHBsaWNhdGlvbnMgdG8gV2luZG93cyBOVCIuCi0gKgotICogVGhlIHRlc3RzIGFyZToKLSAqCi0gKiAxKSB0b3RhbCBwYXRoIGxlbmd0aCBncmVhdGVyIHRoYW4gTUFYX1BBVEgKLSAqCi0gKiAyKSBhbnl0aGluZyB1c2luZyB0aGUgb2N0ZXRzIDAtMzEgb3IgY2hhcmFjdGVycyAiIDwgPiB8IDoKLSAqICAgICh0aGVzZSBhcmUgcmVzZXJ2ZWQgZm9yIFdpbmRvd3MgdXNlIGluIGZpbGVuYW1lcy4gSW4gYWRkaXRpb24KLSAqICAgICBlYWNoIGZpbGUgc3lzdGVtIGhhcyBpdHMgb3duIGFkZGl0aW9uYWwgY2hhcmFjdGVycyB0aGF0IGFyZQotICogICAgIGludmFsaWQuIFNlZSBLQiBhcnRpY2xlIFExMDAxMDggZm9yIG1vcmUgZGV0YWlscykuCi0gKgotICogMykgYW55dGhpbmcgZW5kaW5nIGluICIuIiAobm8gbWF0dGVyIGhvdyBtYW55KQotICogICAgKGZpbGVuYW1lIGRvYywgZG9jLiBhbmQgZG9jLi4uIGFsbCByZWZlciB0byB0aGUgc2FtZSBmaWxlKQotICoKLSAqIDQpIGFueSBzZWdtZW50IGluIHdoaWNoIHRoZSBiYXNlbmFtZSAoYmVmb3JlIGZpcnN0IHBlcmlvZCkgbWF0Y2hlcwotICogICAgb25lIG9mIHRoZSBET1MgZGV2aWNlIG5hbWVzCi0gKiAgICAodGhlIGxpc3QgY29tZXMgZnJvbSBLQiBhcnRpY2xlIFExMDAxMDggYWx0aG91Z2ggc29tZSBwZW9wbGUKLSAqICAgICByZXBvcnRzIHRoYXQgYWRkaXRpb25hbCBuYW1lcyBzdWNoIGFzICJDT001IiBhcmUgYWxzbyBzcGVjaWFsCi0gKiAgICAgZGV2aWNlcykuCi0gKgotICogSWYgdGhlIHBhdGggZmFpbHMgQU5ZIG9mIHRoZXNlIHRlc3RzLCB0aGUgcmVzdWx0IG11c3QgYmUgdG8gZGVueSBhY2Nlc3MuCi0gKi8KLQotQVBJX0VYUE9SVChpbnQpIGFwX29zX2lzX2ZpbGVuYW1lX3ZhbGlkKGNvbnN0IGNoYXIgKmZpbGUpCi17Ci0gICAgY29uc3QgY2hhciAqc2Vnc3RhcnQ7Ci0gICAgdW5zaWduZWQgaW50IHNlZ2xlbmd0aDsKLSAgICBjb25zdCBjaGFyICpwb3M7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpbnZhbGlkX2NoYXJhY3RlcnMgPSAiP1wiPD4qfDoiOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaW52YWxpZF9maWxlbmFtZXNbXSA9IHsgCi0JIkNPTiIsICJBVVgiLCAiQ09NMSIsICJDT00yIiwgIkNPTTMiLCAKLQkiQ09NNCIsICJMUFQxIiwgIkxQVDIiLCAiTFBUMyIsICJQUk4iLCAiTlVMIiwgTlVMTCAKLSAgICB9OwotCi0gICAgLyogVGVzdCAxICovCi0gICAgaWYgKHN0cmxlbihmaWxlKSA+IE1BWF9QQVRIKSB7Ci0JLyogUGF0aCB0b28gbG9uZyBmb3IgV2luZG93cy4gTm90ZSB0aGF0IHRoaXMgdGVzdCBpcyBub3QgdmFsaWQKLQkgKiBpZiB0aGUgcGF0aCBzdGFydHMgd2l0aCAvLz8vIG9yIFxcP1wuICovCi0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcG9zID0gZmlsZTsKLQotICAgIC8qIFNraXAgYW55IGxlYWRpbmcgbm9uLXBhdGggY29tcG9uZW50cy4gVGhpcyBjYW4gYmUgZWl0aGVyIGEKLSAgICAgKiBkcml2ZSBsZXR0ZXIgc3VjaCBhcyBDOiwgb3IgYSBVTkMgcGF0aCBzdWNoIGFzIFxcU0VSVkVSXFNIQVJFXC4KLSAgICAgKiBXZSBjb250aW51ZSBhbmQgY2hlY2sgdGhlIHJlc3Qgb2YgdGhlIHBhdGggYmFzZWQgb24gdGhlIHJ1bGVzIGFib3ZlLgotICAgICAqIFRoaXMgbWVhbnMgd2UgY291bGQgZWxpbWluYXRlIHZhbGlkIGZpbGVuYW1lcyBmcm9tIHNlcnZlcnMgd2hpY2gKLSAgICAgKiBhcmUgbm90IHJ1bm5pbmcgTlQgKHN1Y2ggYXMgU2FtYmEpLgotICAgICAqLwotCi0gICAgaWYgKHBvc1swXSAmJiBwb3NbMV0gPT0gJzonKSB7Ci0JLyogU2tpcCBsZWFkaW5nIGRyaXZlIGxldHRlciAqLwotCXBvcyArPSAyOwotICAgIH0KLSAgICBlbHNlIHsKLQlpZiAoKHBvc1swXSA9PSAnXFwnIHx8IHBvc1swXSA9PSAnLycpICYmCi0JICAgIChwb3NbMV0gPT0gJ1xcJyB8fCBwb3NbMV0gPT0gJy8nKSkgewotCSAgICAvKiBJcyBhIFVOQywgc28gc2tpcCB0aGUgc2VydmVyIG5hbWUgYW5kIHNoYXJlIG5hbWUgKi8KLQkgICAgcG9zICs9IDI7Ci0JICAgIHdoaWxlICgqcG9zICYmICpwb3MgIT0gJy8nICYmICpwb3MgIT0gJ1xcJykKLQkJcG9zKys7Ci0JICAgIGlmICghKnBvcykgewotCQkvKiBObyBzaGFyZSBuYW1lICovCi0JCXJldHVybiAwOwotCSAgICB9Ci0JICAgIHBvcysrOwkvKiBNb3ZlIHRvIHN0YXJ0IG9mIHNoYXJlIG5hbWUgKi8KLQkgICAgd2hpbGUgKCpwb3MgJiYgKnBvcyAhPSAnLycgJiYgKnBvcyAhPSAnXFwnKQotCQlwb3MrKzsKLQkgICAgaWYgKCEqcG9zKSB7Ci0JCS8qIE5vIHBhdGggaW5mb3JtYXRpb24gKi8KLQkJcmV0dXJuIDA7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgd2hpbGUgKCpwb3MpIHsKLQl1bnNpZ25lZCBpbnQgaWR4OwotCXVuc2lnbmVkIGludCBiYXNlbGVuZ3RoOwotCi0Jd2hpbGUgKCpwb3MgPT0gJy8nIHx8ICpwb3MgPT0gJ1xcJykgewotICAgIAkgICAgcG9zKys7Ci0JfQotCWlmICgqcG9zID09ICdcMCcpIHsKLQkgICAgYnJlYWs7Ci0JfQotCXNlZ3N0YXJ0ID0gcG9zOwkvKiBzdGFydCBvZiBzZWdtZW50ICovCi0Jd2hpbGUgKCpwb3MgJiYgKnBvcyAhPSAnLycgJiYgKnBvcyAhPSAnXFwnKSB7Ci0JICAgIHBvcysrOwotCX0KLQlzZWdsZW5ndGggPSBwb3MgLSBzZWdzdGFydDsKLQkvKiAKLQkgKiBOb3cgd2UgaGF2ZSBhIHNlZ21lbnQgb2YgdGhlIHBhdGgsIHN0YXJ0aW5nIGF0IHBvc2l0aW9uICJzZWdzdGFydCIKLQkgKiBhbmQgbGVuZ3RoICJzZWdsZW5ndGgiCi0JICovCi0KLQkvKiBUZXN0IDIgKi8KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IHNlZ2xlbmd0aDsgaWR4KyspIHsKLQkgICAgaWYgKChzZWdzdGFydFtpZHhdID4gMCAmJiBzZWdzdGFydFtpZHhdIDwgMzIpIHx8Ci0JCXN0cmNocihpbnZhbGlkX2NoYXJhY3RlcnMsIHNlZ3N0YXJ0W2lkeF0pKSB7Ci0JCXJldHVybiAwOwotCSAgICB9Ci0JfQotCi0JLyogVGVzdCAzICovCi0JaWYgKHNlZ3N0YXJ0W3NlZ2xlbmd0aC0xXSA9PSAnLicpIHsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCi0JLyogVGVzdCA0ICovCi0JZm9yIChiYXNlbGVuZ3RoID0gMDsgYmFzZWxlbmd0aCA8IHNlZ2xlbmd0aDsgYmFzZWxlbmd0aCsrKSB7Ci0JICAgIGlmIChzZWdzdGFydFtiYXNlbGVuZ3RoXSA9PSAnLicpIHsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLQkvKiBiYXNlbGVuZ3RoIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgYmFzZSBwYXRoIG9mCi0JICogdGhlIHNlZ21lbnQgKHdoaWNoIGNvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSB3aG9sZSBzZWdtZW50IGxlbmd0aCwKLQkgKiBpZiBpdCBkb2VzIG5vdCBpbmNsdWRlIGFueSBkb3QgY2hhcmFjdGVycykuICovCi0JaWYgKGJhc2VsZW5ndGggPT0gMyB8fCBiYXNlbGVuZ3RoID09IDQpIHsKLQkgICAgZm9yIChpZHggPSAwOyBpbnZhbGlkX2ZpbGVuYW1lc1tpZHhdOyBpZHgrKykgewotCQlpZiAoc3RybGVuKGludmFsaWRfZmlsZW5hbWVzW2lkeF0pID09IGJhc2VsZW5ndGggJiYKLQkJICAgICFzdHJuaWNtcChpbnZhbGlkX2ZpbGVuYW1lc1tpZHhdLCBzZWdzdGFydCwgYmFzZWxlbmd0aCkpIHsKLQkJICAgIHJldHVybiAwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9zZXJ2ZXIvLmN2c2lnbm9yZSBiL3NlcnZlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGU1MTQ2Li4wMDAwMDAwCi0tLSBhL3NlcnZlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotTWFrZWZpbGUKLS5kZXBzCi0ubGlicwotKi5sbwotKi5sYQotdXJpX2RlbGltcy5oCi1nZW5fdXJpX2RlbGltcwotdGVzdF9jaGFyLmgKLWdlbl90ZXN0X2NoYXIKLWdlbl91cmlfZGVsaW1zX1IKLWdlbl90ZXN0X2NoYXJfUgotZ2VuX3VyaV9kZWxpbXNfRAotZ2VuX3VyaV9kZWxpbXMuaWxrCi1nZW5fdXJpX2RlbGltcy5wZGIKLWdlbl90ZXN0X2NoYXJfRAotZ2VuX3Rlc3RfY2hhci5pbGsKLWdlbl90ZXN0X2NoYXIucGRiCmRpZmYgLS1naXQgYS9zZXJ2ZXIvLmluZGVudC5wcm8gYi9zZXJ2ZXIvLmluZGVudC5wcm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZmJlOWYuLjAwMDAwMDAKLS0tIGEvc2VydmVyLy5pbmRlbnQucHJvCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLWk0IC1ucHNsIC1kaTAgLWJyIC1uY2UgLWQwIC1jbGkwIC1ucGNzIC1uZmMxCi0tVEJVRkYKLS1URklMRQotLVRUUkFOUwotLVRVSU5UNAotLVRfdHJhbnMKLS1UYWxsb3dfb3B0aW9uc190Ci0tVGFwYWNoZV9zZmlvCi0tVGFycmF5X2hlYWRlcgotLVRib29sX2ludAotLVRidWZfYXJlYQotLVRidWZmX3N0cnVjdAotLVRidWZmeQotLVRjbWRfaG93Ci0tVGNtZF9wYXJtcwotLVRjb21tYW5kX3JlYwotLVRjb21tYW5kX3N0cnVjdAotLVRjb25uX3JlYwotLVRjb3JlX2Rpcl9jb25maWcKLS1UY29yZV9zZXJ2ZXJfY29uZmlnCi0tVGRpcl9tYWtlcl9mdW5jCi0tVGV2ZW50Ci0tVGdsb2JhbHNfcwotLVRoYW5kbGVyX2Z1bmMKLS1UaGFuZGxlcl9yZWMKLS1Uam9ibGlzdF9zCi0tVGxpc3Rlbl9yZWMKLS1UbWVyZ2VyX2Z1bmMKLS1UbW9kZV90Ci0tVG1vZHVsZQotLVRtb2R1bGVfc3RydWN0Ci0tVG11dGV4Ci0tVG5fbG9uZwotLVRvdGhlcl9jaGlsZF9yZWMKLS1Ub3ZlcnJpZGVzX3QKLS1UcGFyZW50X3Njb3JlCi0tVHBpZF90Ci0tVHBpcGVkX2xvZwotLVRwb29sCi0tVHJlcXVlc3RfcmVjCi0tVHJlcXVpcmVfbGluZQotLVRybGltX3QKLS1Uc2NvcmVib2FyZAotLVRzZW1hcGhvcmUKLS1Uc2VydmVyX2FkZHJfcmVjCi0tVHNlcnZlcl9yZWMKLS1Uc2VydmVyX3JlY19jaGFpbgotLVRzaG9ydF9zY29yZQotLVR0YWJsZQotLVR0YWJsZV9lbnRyeQotLVR0aHJlYWQKLS1UdV93aWRlX2ludAotLVR2dGltZV90Ci0tVHdpZGVfaW50CmRpZmYgLS1naXQgYS9zZXJ2ZXIvTWFrZWZpbGUuaW4gYi9zZXJ2ZXIvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZmFjZjIuLjAwMDAwMDAKLS0tIGEvc2VydmVyL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotCi1ERVBUSCAgICAgPSAuLgotdG9wc3JjZGlyID0gQHRvcHNyY2RpckAKLXNyY2RpciAgICA9IEBzcmNkaXJACi1WUEFUSCAgICAgPSBAc3JjZGlyQAotCi1MVExJQlJBUllfTkFNRSAgICA9IGxpYm1haW4ubGEKLUxUTElCUkFSWV9TT1VSQ0VTID0gXAotICAgIHVyaV9kZWxpbXMuaCB0ZXN0X2NoYXIuaCBcCi0JYnVmZi5jIGh0dHBfY29uZmlnLmMgaHR0cF9jb3JlLmMgaHR0cF9sb2cuYyBodHRwX21haW4uYyBcCi0JaHR0cF9wcm90b2NvbC5jIGh0dHBfcmVxdWVzdC5jIGh0dHBfdmhvc3QuYyB1dGlsLmMgdXRpbF9kYXRlLmMgXAotCXV0aWxfc2NyaXB0LmMgdXRpbF91cmkuYyB1dGlsX21kNS5jIFwKLQlyZmMxNDEzLmMgaHR0cF9jb25uZWN0aW9uLmMgaW9sX2ZpbGUuYyBsaXN0ZW4uYwotCi1pbmNsdWRlICQodG9wc3JjZGlyKS9idWlsZC9sdGxpYi5tawotCi1nZW5fdXJpX2RlbGltc19PQkpFQ1RTID0gZ2VuX3VyaV9kZWxpbXMubG8KLWdlbl91cmlfZGVsaW1zOiAkKGdlbl91cmlfZGVsaW1zX09CSkVDVFMpCi0JJChMSU5LKSAkKGdlbl91cmlfZGVsaW1zX09CSkVDVFMpCi0KLWdlbl90ZXN0X2NoYXJfT0JKRUNUUyA9IGdlbl90ZXN0X2NoYXIubG8KLWdlbl90ZXN0X2NoYXI6ICQoZ2VuX3Rlc3RfY2hhcl9PQkpFQ1RTKQotCSQoTElOSykgJChnZW5fdGVzdF9jaGFyX09CSkVDVFMpCi0KLXVyaV9kZWxpbXMuaDogZ2VuX3VyaV9kZWxpbXMKLQkuL2dlbl91cmlfZGVsaW1zID4gdXJpX2RlbGltcy5oCi0KLXRlc3RfY2hhci5oOiBnZW5fdGVzdF9jaGFyCi0JLi9nZW5fdGVzdF9jaGFyID4gdGVzdF9jaGFyLmgKLQotdXRpbF91cmkuYzogdXJpX2RlbGltcy5oCi11dGlsLmM6IHRlc3RfY2hhci5oCmRpZmYgLS1naXQgYS9zZXJ2ZXIvYnVpbGRtYXJrLmMgYi9zZXJ2ZXIvYnVpbGRtYXJrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NWI5NzMuLjAwMDAwMDAKLS0tIGEvc2VydmVyL2J1aWxkbWFyay5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cGQuaCIKLQotI2lmIGRlZmluZWQoX19EQVRFX18pICYmIGRlZmluZWQoX19USU1FX18pCi1zdGF0aWMgY29uc3QgY2hhciBzZXJ2ZXJfYnVpbHRbXSA9IF9fREFURV9fICIgIiBfX1RJTUVfXzsKLSNlbHNlCi1zdGF0aWMgY29uc3QgY2hhciBzZXJ2ZXJfYnVpbHRbXSA9ICJ1bmtub3duIjsKLSNlbmRpZgotCi1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfZ2V0X3NlcnZlcl9idWlsdCgpCi17Ci0gICAgcmV0dXJuIHNlcnZlcl9idWlsdDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZlci9jb25maWcuYyBiL3NlcnZlci9jb25maWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJiN2M5My4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvY29uZmlnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDM4ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIGh0dHBfY29uZmlnLmM6IG9uY2Ugd2FzIGF1eGlsbGFyeSBmdW5jdGlvbnMgZm9yIHJlYWRpbmcgaHR0cGQncyBjb25maWcKLSAqIGZpbGUgYW5kIGNvbnZlcnRpbmcgZmlsZW5hbWVzIGludG8gYSBuYW1lc3BhY2UKLSAqCi0gKiBSb2IgTWNDb29sIAotICogCi0gKiBXYWxsLXRvLXdhbGwgcmV3cml0ZSBmb3IgQXBhY2hlLi4uIGNvbW1hbmRzIHdoaWNoIGFyZSBwYXJ0IG9mIHRoZQotICogc2VydmVyIGNvcmUgY2FuIG5vdyBiZSBmb3VuZCBuZXh0IGRvb3IgaW4gImh0dHBfY29yZS5jIi4gIE5vdyBjb250YWlucwotICogZ2VuZXJhbCBjb21tYW5kIGxvb3AsIGFuZCBmdW5jdGlvbnMgd2hpY2ggZG8gYm9va2tlZXBpbmcgZm9yIHRoZSBuZXcKLSAqIEFwYWNoZSBjb25maWcgc3R1ZmYgKG1vZHVsZXMgYW5kIGNvbmZpZ3VyYXRpb24gdmVjdG9ycykuCi0gKgotICogcnN0Ci0gKgotICovCi0KLSNkZWZpbmUgQ09SRV9QUklWQVRFCi0KLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlICJhcHJfcG9ydGFibGUuaCIKLSNpbmNsdWRlICJhcHJfZmlsZV9pby5oIgotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgkJLyogZm9yIGVycm9ycyBpbiBwYXJzZV9odGFjY2VzcyAqLwotI2luY2x1ZGUgImh0dHBfcmVxdWVzdC5oIgkvKiBmb3IgZGVmYXVsdF9oYW5kbGVyIChzZWUgaW52b2tlX2hhbmRsZXIpICovCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCi0jaW5jbHVkZSAiaHR0cF92aG9zdC5oIgotCi1IT09LX1NUUlVDVCgKLQkgICAgSE9PS19MSU5LKGhlYWRlcl9wYXJzZXIpCi0JICAgIEhPT0tfTElOSyhwcmVfY29uZmlnKQotCSAgICBIT09LX0xJTksocG9zdF9jb25maWcpCi0JICAgIEhPT0tfTElOSyhvcGVuX2xvZ3MpCi0JICAgIEhPT0tfTElOSyhjaGlsZF9pbml0KQotKQotCi1JTVBMRU1FTlRfSE9PS19SVU5fQUxMKGludCxoZWFkZXJfcGFyc2VyLChyZXF1ZXN0X3JlYyAqciksKHIpLE9LLERFQ0xJTkVEKQotSU1QTEVNRU5UX0hPT0tfVk9JRChwcmVfY29uZmlnLChhcF9jb250ZXh0X3QgKnBjb25mLGFwX2NvbnRleHRfdCAqcGxvZyxhcF9jb250ZXh0X3QgKnB0ZW1wKSwKLQkJICAgIChwY29uZixwbG9nLHB0ZW1wKSkKLUlNUExFTUVOVF9IT09LX1ZPSUQocG9zdF9jb25maWcsCi0JCSAgICAoYXBfY29udGV4dF90ICpwY29uZiwgYXBfY29udGV4dF90ICpwbG9nLCBhcF9jb250ZXh0X3QgKnB0ZW1wLCBzZXJ2ZXJfcmVjICpzKSwKLQkJICAgIChwY29uZixwbG9nLHB0ZW1wLHMpKQotSU1QTEVNRU5UX0hPT0tfVk9JRChvcGVuX2xvZ3MsCi0JCSAgICAoYXBfY29udGV4dF90ICpwY29uZiwgYXBfY29udGV4dF90ICpwbG9nLCBhcF9jb250ZXh0X3QgKnB0ZW1wLCBzZXJ2ZXJfcmVjICpzKSwKLQkJICAgIChwY29uZixwbG9nLHB0ZW1wLHMpKQotSU1QTEVNRU5UX0hPT0tfVk9JRChjaGlsZF9pbml0LChhcF9jb250ZXh0X3QgKnBjaGlsZCwgc2VydmVyX3JlYyAqcyksKHBjaGlsZCxzKSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBXZSBiZWdpbiB3aXRoIHRoZSBmdW5jdGlvbnMgd2hpY2ggZGVhbCB3aXRoIHRoZSBsaW5rZWQgbGlzdAotICogb2YgbW9kdWxlcyB3aGljaCBjb250cm9sIGp1c3QgYWJvdXQgYWxsIG9mIHRoZSBzZXJ2ZXIgb3BlcmF0aW9uLgotICovCi0KLS8qIHRvdGFsX21vZHVsZXMgaXMgdGhlIG51bWJlciBvZiBtb2R1bGVzIHRoYXQgaGF2ZSBiZWVuIGxpbmtlZAotICogaW50byB0aGUgc2VydmVyLgotICovCi1zdGF0aWMgaW50IHRvdGFsX21vZHVsZXMgPSAwOwotLyogZHluYW1pY19tb2R1bGVzIGlzIHRoZSBudW1iZXIgb2YgbW9kdWxlcyB0aGF0IGhhdmUgYmVlbiBhZGRlZAotICogYWZ0ZXIgdGhlIHByZS1sb2FkZWQgb25lcyBoYXZlIGJlZW4gc2V0IHVwLiBJdCBzaG91bGRuJ3QgYmUgbGFyZ2VyCi0gKiB0aGFuIERZTkFNSUNfTU9EVUxFX0xJTUlULgotICovCi1zdGF0aWMgaW50IGR5bmFtaWNfbW9kdWxlcyA9IDA7Ci1BUElfVkFSX0VYUE9SVCBtb2R1bGUgKnRvcF9tb2R1bGUgPSBOVUxMOwotQVBJX1ZBUl9FWFBPUlQgbW9kdWxlICoqYXBfbG9hZGVkX21vZHVsZXM9TlVMTDsKLQotdHlwZWRlZiBpbnQgKCpoYW5kbGVyX2Z1bmMpIChyZXF1ZXN0X3JlYyAqKTsKLXR5cGVkZWYgdm9pZCAqKCpkaXJfbWFrZXJfZnVuYykgKGFwX2NvbnRleHRfdCAqLCBjaGFyICopOwotdHlwZWRlZiB2b2lkICooKm1lcmdlcl9mdW5jKSAoYXBfY29udGV4dF90ICosIHZvaWQgKiwgdm9pZCAqKTsKLQotLyogRGVhbGluZyB3aXRoIGNvbmZpZyB2ZWN0b3JzLiAgVGhlc2UgYXJlIGFzc29jaWF0ZWQgd2l0aCBwZXItZGlyZWN0b3J5LAotICogcGVyLXNlcnZlciwgYW5kIHBlci1yZXF1ZXN0IGNvbmZpZ3VyYXRpb24sIGFuZCBoYXZlIGEgdm9pZCogcG9pbnRlciBmb3IKLSAqIGVhY2ggbW9kdWxlcy4gIFRoZSBuYXR1cmUgb2YgdGhlIHN0cnVjdHVyZSBwb2ludGVkIHRvIGlzIHByaXZhdGUgdG8gdGhlCi0gKiBtb2R1bGUgaW4gcXVlc3Rpb24uLi4gdGhlIGNvcmUgZG9lc24ndCAoYW5kIGNhbid0KSBrbm93LiAgSG93ZXZlciwgdGhlcmUKLSAqIGFyZSBkZWZpbmVkIGludGVyZmFjZXMgd2hpY2ggYWxsb3cgaXQgdG8gY3JlYXRlIGluc3RhbmNlcyBvZiBpdHMgcHJpdmF0ZQotICogcGVyLWRpcmVjdG9yeSBhbmQgcGVyLXNlcnZlciBzdHJ1Y3R1cmVzLCBhbmQgdG8gbWVyZ2UgdGhlIHBlci1kaXJlY3RvcnkKLSAqIHN0cnVjdHVyZXMgb2YgYSBkaXJlY3RvcnkgYW5kIGl0cyBzdWJkaXJlY3RvcnkgKHByb2R1Y2luZyBhIG5ldyBvbmUgaW4KLSAqIHdoaWNoIHRoZSBkZWZhdWx0cyBhcHBseWluZyB0byB0aGUgYmFzZSBkaXJlY3RvcnkgaGF2ZSBiZWVuIHByb3Blcmx5Ci0gKiBvdmVycmlkZGVuKS4KLSAqLwotCi0jaWZuZGVmIGFwX2dldF9tb2R1bGVfY29uZmlnCi1BUElfRVhQT1JUKHZvaWQgKikgYXBfZ2V0X21vZHVsZV9jb25maWcodm9pZCAqY29uZl92ZWN0b3IsIG1vZHVsZSAqbSkKLXsKLSAgICB2b2lkICoqY29uZnYgPSAodm9pZCAqKikgY29uZl92ZWN0b3I7Ci0gICAgcmV0dXJuIGNvbmZ2W20tPm1vZHVsZV9pbmRleF07Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBhcF9zZXRfbW9kdWxlX2NvbmZpZwotQVBJX0VYUE9SVCh2b2lkKSBhcF9zZXRfbW9kdWxlX2NvbmZpZyh2b2lkICpjb25mX3ZlY3RvciwgbW9kdWxlICptLCB2b2lkICp2YWwpCi17Ci0gICAgdm9pZCAqKmNvbmZ2ID0gKHZvaWQgKiopIGNvbmZfdmVjdG9yOwotICAgIGNvbmZ2W20tPm1vZHVsZV9pbmRleF0gPSB2YWw7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9lbXB0eV9jb25maWcoYXBfY29udGV4dF90ICpwKQotewotICAgIHZvaWQgKipjb25mX3ZlY3RvciA9ICh2b2lkICoqKSBhcF9wY2FsbG9jKHAsIHNpemVvZih2b2lkICopICoKLQkJCQkgICAgKHRvdGFsX21vZHVsZXMgKyBEWU5BTUlDX01PRFVMRV9MSU1JVCkpOwotICAgIHJldHVybiAodm9pZCAqKSBjb25mX3ZlY3RvcjsKLX0KLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9kZWZhdWx0X3Blcl9kaXJfY29uZmlnKGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICB2b2lkICoqY29uZl92ZWN0b3IgPSAodm9pZCAqKikgYXBfcGNhbGxvYyhwLCBzaXplb2Yodm9pZCAqKSAqICh0b3RhbF9tb2R1bGVzICsgRFlOQU1JQ19NT0RVTEVfTElNSVQpKTsKLSAgICBtb2R1bGUgKm1vZHA7Ci0KLSAgICBmb3IgKG1vZHAgPSB0b3BfbW9kdWxlOyBtb2RwOyBtb2RwID0gbW9kcC0+bmV4dCkgewotCWRpcl9tYWtlcl9mdW5jIGRmID0gbW9kcC0+Y3JlYXRlX2Rpcl9jb25maWc7Ci0KLQlpZiAoZGYpCi0JICAgIGNvbmZfdmVjdG9yW21vZHAtPm1vZHVsZV9pbmRleF0gPSAoKmRmKSAocCwgTlVMTCk7Ci0gICAgfQotCi0gICAgcmV0dXJuICh2b2lkICopIGNvbmZfdmVjdG9yOwotfQotCi12b2lkICoKLSAgICAgYXBfbWVyZ2VfcGVyX2Rpcl9jb25maWdzKGFwX2NvbnRleHRfdCAqcCwgdm9pZCAqYmFzZSwgdm9pZCAqbmV3KQotewotICAgIHZvaWQgKipjb25mX3ZlY3RvciA9ICh2b2lkICoqKSBhcF9wYWxsb2MocCwgc2l6ZW9mKHZvaWQgKikgKiB0b3RhbF9tb2R1bGVzKTsKLSAgICB2b2lkICoqYmFzZV92ZWN0b3IgPSAodm9pZCAqKikgYmFzZTsKLSAgICB2b2lkICoqbmV3X3ZlY3RvciA9ICh2b2lkICoqKSBuZXc7Ci0gICAgbW9kdWxlICptb2RwOwotCi0gICAgZm9yIChtb2RwID0gdG9wX21vZHVsZTsgbW9kcDsgbW9kcCA9IG1vZHAtPm5leHQpIHsKLQltZXJnZXJfZnVuYyBkZiA9IG1vZHAtPm1lcmdlX2Rpcl9jb25maWc7Ci0JaW50IGkgPSBtb2RwLT5tb2R1bGVfaW5kZXg7Ci0KLQlpZiAoZGYgJiYgbmV3X3ZlY3RvcltpXSkKLQkgICAgY29uZl92ZWN0b3JbaV0gPSAoKmRmKSAocCwgYmFzZV92ZWN0b3JbaV0sIG5ld192ZWN0b3JbaV0pOwotCWVsc2UKLQkgICAgY29uZl92ZWN0b3JbaV0gPSBuZXdfdmVjdG9yW2ldID8gbmV3X3ZlY3RvcltpXSA6IGJhc2VfdmVjdG9yW2ldOwotICAgIH0KLQotICAgIHJldHVybiAodm9pZCAqKSBjb25mX3ZlY3RvcjsKLX0KLQotc3RhdGljIHZvaWQgKmNyZWF0ZV9zZXJ2ZXJfY29uZmlnKGFwX2NvbnRleHRfdCAqcCwgc2VydmVyX3JlYyAqcykKLXsKLSAgICB2b2lkICoqY29uZl92ZWN0b3IgPSAodm9pZCAqKikgYXBfcGNhbGxvYyhwLCBzaXplb2Yodm9pZCAqKSAqICh0b3RhbF9tb2R1bGVzICsgRFlOQU1JQ19NT0RVTEVfTElNSVQpKTsKLSAgICBtb2R1bGUgKm1vZHA7Ci0KLSAgICBmb3IgKG1vZHAgPSB0b3BfbW9kdWxlOyBtb2RwOyBtb2RwID0gbW9kcC0+bmV4dCkgewotCWlmIChtb2RwLT5jcmVhdGVfc2VydmVyX2NvbmZpZykKLQkgICAgY29uZl92ZWN0b3JbbW9kcC0+bW9kdWxlX2luZGV4XSA9ICgqbW9kcC0+Y3JlYXRlX3NlcnZlcl9jb25maWcpIChwLCBzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKHZvaWQgKikgY29uZl92ZWN0b3I7Ci19Ci0KLXN0YXRpYyB2b2lkIG1lcmdlX3NlcnZlcl9jb25maWdzKGFwX2NvbnRleHRfdCAqcCwgdm9pZCAqYmFzZSwgdm9pZCAqdmlydCkKLXsKLSAgICAvKiBDYW4gcmV1c2UgdGhlICd2aXJ0JyB2ZWN0b3IgZm9yIHRoZSBzcGluZSBvZiBpdCwgc2luY2Ugd2UgZG9uJ3QKLSAgICAgKiBoYXZlIHRvIGRlYWwgd2l0aCB0aGUgbW9yYWwgZXF1aXZhbGVudCBvZiAuaHRhY2Nlc3MgZmlsZXMgaGVyZS4uLgotICAgICAqLwotCi0gICAgdm9pZCAqKmJhc2VfdmVjdG9yID0gKHZvaWQgKiopIGJhc2U7Ci0gICAgdm9pZCAqKnZpcnRfdmVjdG9yID0gKHZvaWQgKiopIHZpcnQ7Ci0gICAgbW9kdWxlICptb2RwOwotCi0gICAgZm9yIChtb2RwID0gdG9wX21vZHVsZTsgbW9kcDsgbW9kcCA9IG1vZHAtPm5leHQpIHsKLQltZXJnZXJfZnVuYyBkZiA9IG1vZHAtPm1lcmdlX3NlcnZlcl9jb25maWc7Ci0JaW50IGkgPSBtb2RwLT5tb2R1bGVfaW5kZXg7Ci0KLQlpZiAoIXZpcnRfdmVjdG9yW2ldKQotCSAgICB2aXJ0X3ZlY3RvcltpXSA9IGJhc2VfdmVjdG9yW2ldOwotCWVsc2UgaWYgKGRmKQotCSAgICB2aXJ0X3ZlY3RvcltpXSA9ICgqZGYpIChwLCBiYXNlX3ZlY3RvcltpXSwgdmlydF92ZWN0b3JbaV0pOwotICAgIH0KLX0KLQotdm9pZCAqYXBfY3JlYXRlX3JlcXVlc3RfY29uZmlnKGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICByZXR1cm4gY3JlYXRlX2VtcHR5X2NvbmZpZyhwKTsKLX0KLQotdm9pZCAqYXBfY3JlYXRlX2Nvbm5fY29uZmlnKGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICByZXR1cm4gY3JlYXRlX2VtcHR5X2NvbmZpZyhwKTsKLX0KLQotQ09SRV9FWFBPUlQodm9pZCAqKSBhcF9jcmVhdGVfcGVyX2Rpcl9jb25maWcoYXBfY29udGV4dF90ICpwKQotewotICAgIHJldHVybiBjcmVhdGVfZW1wdHlfY29uZmlnKHApOwotfQotCi0vKgotICogRm9yIHNwZWVkL2VmZmljaWVuY3kgd2UgZ2VuZXJhdGUgYSBjb21wYWN0IGxpc3Qgb2YgYWxsIHRoZSBoYW5kbGVycwotICogYW5kIHdpbGRjYXJkIGhhbmRsZXJzLiAgVGhpcyBtZWFucyB3ZSB3b24ndCBoYXZlIHRvIHNjYW4gdGhlIGVudGlyZQotICogbW9kdWxlIGxpc3QgbG9va2luZyBmb3IgaGFuZGxlcnMuLi4gd2hlcmUgd2UnbGwgZmluZCBhIHdob2xlIHdoYWNrCi0gKiBvZiBOVUxMcy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGhhbmRsZXJfcmVjIGhyOwotICAgIHNpemVfdCBsZW47Ci19IGZhc3RfaGFuZGxlcl9yZWM7Ci0KLXN0YXRpYyBmYXN0X2hhbmRsZXJfcmVjICpoYW5kbGVyczsKLXN0YXRpYyBmYXN0X2hhbmRsZXJfcmVjICp3aWxkaGFuZGxlcnM7Ci0KLXN0YXRpYyB2b2lkIGluaXRfaGFuZGxlcnMoYXBfY29udGV4dF90ICpwKQotewotICAgIG1vZHVsZSAqbW9kcDsKLSAgICBpbnQgbmhhbmRsZXJzID0gMDsKLSAgICBpbnQgbndpbGRoYW5kbGVycyA9IDA7Ci0gICAgY29uc3QgaGFuZGxlcl9yZWMgKmhhbmRwOwotICAgIGZhc3RfaGFuZGxlcl9yZWMgKnBoLCAqcHc7Ci0gICAgY2hhciAqc3RhcnA7Ci0KLSAgICBmb3IgKG1vZHAgPSB0b3BfbW9kdWxlOyBtb2RwOyBtb2RwID0gbW9kcC0+bmV4dCkgewotCWlmICghbW9kcC0+aGFuZGxlcnMpCi0JICAgIGNvbnRpbnVlOwotCWZvciAoaGFuZHAgPSBtb2RwLT5oYW5kbGVyczsgaGFuZHAtPmNvbnRlbnRfdHlwZTsgKytoYW5kcCkgewotCSAgICBpZiAoc3RyY2hyKGhhbmRwLT5jb250ZW50X3R5cGUsICcqJykpIHsKLSAgICAgICAgICAgICAgICBud2lsZGhhbmRsZXJzICsrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuaGFuZGxlcnMgKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcGggPSBoYW5kbGVycyA9IGFwX3BhbGxvYyhwLCBzaXplb2YoKnBoKSoobmhhbmRsZXJzICsgMSkpOwotICAgIHB3ID0gd2lsZGhhbmRsZXJzID0gYXBfcGFsbG9jKHAsIHNpemVvZigqcHcpKihud2lsZGhhbmRsZXJzICsgMSkpOwotICAgIGZvciAobW9kcCA9IHRvcF9tb2R1bGU7IG1vZHA7IG1vZHAgPSBtb2RwLT5uZXh0KSB7Ci0JaWYgKCFtb2RwLT5oYW5kbGVycykKLQkgICAgY29udGludWU7Ci0JZm9yIChoYW5kcCA9IG1vZHAtPmhhbmRsZXJzOyBoYW5kcC0+Y29udGVudF90eXBlOyArK2hhbmRwKSB7Ci0JICAgIGlmICgoc3RhcnAgPSBzdHJjaHIoaGFuZHAtPmNvbnRlbnRfdHlwZSwgJyonKSkpIHsKLSAgICAgICAgICAgICAgICBwdy0+aHIuY29udGVudF90eXBlID0gaGFuZHAtPmNvbnRlbnRfdHlwZTsKLSAgICAgICAgICAgICAgICBwdy0+aHIuaGFuZGxlciA9IGhhbmRwLT5oYW5kbGVyOwotCQlwdy0+bGVuID0gc3RhcnAgLSBoYW5kcC0+Y29udGVudF90eXBlOwotICAgICAgICAgICAgICAgIHB3ICsrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwaC0+aHIuY29udGVudF90eXBlID0gaGFuZHAtPmNvbnRlbnRfdHlwZTsKLSAgICAgICAgICAgICAgICBwaC0+aHIuaGFuZGxlciA9IGhhbmRwLT5oYW5kbGVyOwotCQlwaC0+bGVuID0gc3RybGVuKGhhbmRwLT5jb250ZW50X3R5cGUpOwotICAgICAgICAgICAgICAgIHBoICsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHB3LT5oci5jb250ZW50X3R5cGUgPSBOVUxMOwotICAgIHB3LT5oci5oYW5kbGVyID0gTlVMTDsKLSAgICBwaC0+aHIuY29udGVudF90eXBlID0gTlVMTDsKLSAgICBwaC0+aHIuaGFuZGxlciA9IE5VTEw7Ci19Ci0KLWludCBhcF9pbnZva2VfaGFuZGxlcihyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBmYXN0X2hhbmRsZXJfcmVjICpoYW5kcDsKLSAgICBjb25zdCBjaGFyICpoYW5kbGVyOwotICAgIGNoYXIgKnA7Ci0gICAgc2l6ZV90IGhhbmRsZXJfbGVuOwotICAgIGludCByZXN1bHQgPSBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLQotICAgIGlmIChyLT5oYW5kbGVyKSB7Ci0JaGFuZGxlciA9IHItPmhhbmRsZXI7Ci0JaGFuZGxlcl9sZW4gPSBzdHJsZW4oaGFuZGxlcik7Ci0gICAgfQotICAgIGVsc2UgewotCWhhbmRsZXIgPSByLT5jb250ZW50X3R5cGUgPyByLT5jb250ZW50X3R5cGUgOiBhcF9kZWZhdWx0X3R5cGUocik7Ci0JaWYgKChwID0gc3RyY2hyKGhhbmRsZXIsICc7JykpICE9IE5VTEwpIHsgLyogTUlNRSB0eXBlIGFyZ3VtZW50cyAqLwotCSAgICB3aGlsZSAocCA+IGhhbmRsZXIgJiYgcFstMV0gPT0gJyAnKQotCQktLXA7CQkvKiBzdHJpcCB0cmFpbGluZyBzcGFjZXMgKi8KLQkgICAgaGFuZGxlcl9sZW4gPSBwIC0gaGFuZGxlcjsKLQl9Ci0JZWxzZSB7Ci0JICAgIGhhbmRsZXJfbGVuID0gc3RybGVuKGhhbmRsZXIpOwotCX0KLSAgICB9Ci0KLSAgICAvKiBQYXNzIG9uZSAtLS0gZGlyZWN0IG1hdGNoZXMgKi8KLQotICAgIGZvciAoaGFuZHAgPSBoYW5kbGVyczsgaGFuZHAtPmhyLmNvbnRlbnRfdHlwZTsgKytoYW5kcCkgewotCWlmIChoYW5kbGVyX2xlbiA9PSBoYW5kcC0+bGVuCi0JICAgICYmICFzdHJuY21wKGhhbmRsZXIsIGhhbmRwLT5oci5jb250ZW50X3R5cGUsIGhhbmRsZXJfbGVuKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gKCpoYW5kcC0+aHIuaGFuZGxlcikgKHIpOwotCi0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IERFQ0xJTkVEKQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBQYXNzIHR3byAtLS0gd2lsZGNhcmQgbWF0Y2hlcyAqLwotCi0gICAgZm9yIChoYW5kcCA9IHdpbGRoYW5kbGVyczsgaGFuZHAtPmhyLmNvbnRlbnRfdHlwZTsgKytoYW5kcCkgewotCWlmIChoYW5kbGVyX2xlbiA+PSBoYW5kcC0+bGVuCi0JICAgICYmICFzdHJuY21wKGhhbmRsZXIsIGhhbmRwLT5oci5jb250ZW50X3R5cGUsIGhhbmRwLT5sZW4pKSB7Ci0gICAgICAgICAgICAgcmVzdWx0ID0gKCpoYW5kcC0+aHIuaGFuZGxlcikgKHIpOwotCi0gICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBERUNMSU5FRCkKLSAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0ID09IEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SICYmIHItPmhhbmRsZXIgJiYgci0+ZmlsZW5hbWUpIHsKLSAgICAgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX1dBUk5JTkcsIDAsIHIsCi0gICAgICAgICAgICAiaGFuZGxlciBcIiVzXCIgbm90IGZvdW5kIGZvcjogJXMiLCByLT5oYW5kbGVyLCByLT5maWxlbmFtZSk7Ci0gICAgfQotICAgIHJldHVybiBIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLX0KLQotaW50IGdfYkRlYnVnSG9va3M7Ci1jb25zdCBjaGFyICpnX3N6Q3VycmVudEhvb2tOYW1lOwotCi1zdGF0aWMgdm9pZCByZWdpc3Rlcl9ob29rcyhtb2R1bGUgKm0pCi0gICAgewotICAgIGlmKG0tPnJlZ2lzdGVyX2hvb2tzKQotCXsKLQlpZihnZXRlbnYoIlNIT1dfSE9PS1MiKSkKLQkgICAgewotCSAgICBwcmludGYoIlJlZ2lzdGVyaW5nIGhvb2tzIGZvciAlc1xuIixtLT5uYW1lKTsKLQkgICAgZ19iRGVidWdIb29rcz0xOwotCSAgICB9Ci0JZ19zekN1cnJlbnRIb29rTmFtZT1tLT5uYW1lOwotCW0tPnJlZ2lzdGVyX2hvb2tzKCk7Ci0JfQotICAgIH0KLQotLyogT25lLXRpbWUgc2V0dXAgZm9yIHByZWNvbXBpbGVkIG1vZHVsZXMgLS0tIE5PVCB0byBiZSBkb25lIG9uIHJlc3RhcnQgKi8KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9hZGRfbW9kdWxlKG1vZHVsZSAqbSkKLXsKLSAgICAvKiBUaGlzIGNvdWxkIGJlIGNhbGxlZCBmcm9tIGFuIEFkZE1vZHVsZSBodHRwZC5jb25mIGNvbW1hbmQsCi0gICAgICogYWZ0ZXIgdGhlIGZpbGUgaGFzIGJlZW4gbGlua2VkIGFuZCB0aGUgbW9kdWxlIHN0cnVjdHVyZSB3aXRoaW4gaXQKLSAgICAgKiB0ZWFzZWQgb3V0Li4uCi0gICAgICovCi0KLSAgICBpZiAobS0+dmVyc2lvbiAhPSBNT0RVTEVfTUFHSUNfTlVNQkVSX01BSk9SKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgIiVzOiBtb2R1bGUgXCIlc1wiIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcyAiCi0JCSAgICAgInZlcnNpb24gb2YgQXBhY2hlLiIsIGFwX3NlcnZlcl9hcmd2MCwgbS0+bmFtZSk7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAiUGxlYXNlIGNvbnRhY3QgdGhlIHZlbmRvciBmb3IgdGhlIGNvcnJlY3QgdmVyc2lvbi4iKTsKLQlleGl0KDEpOwotICAgIH0KLQotICAgIGlmIChtLT5uZXh0ID09IE5VTEwpIHsKLQltLT5uZXh0ID0gdG9wX21vZHVsZTsKLQl0b3BfbW9kdWxlID0gbTsKLSAgICB9Ci0gICAgaWYgKG0tPm1vZHVsZV9pbmRleCA9PSAtMSkgewotCW0tPm1vZHVsZV9pbmRleCA9IHRvdGFsX21vZHVsZXMrKzsKLQlkeW5hbWljX21vZHVsZXMrKzsKLQotCWlmIChkeW5hbWljX21vZHVsZXMgPiBEWU5BTUlDX01PRFVMRV9MSU1JVCkgewotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICIlczogbW9kdWxlIFwiJXNcIiBjb3VsZCBub3QgYmUgbG9hZGVkLCBiZWNhdXNlIgotCQkgICAgICAgICAiIHRoZSBkeW5hbWljIiwgYXBfc2VydmVyX2FyZ3YwLCBtLT5uYW1lKTsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICJtb2R1bGUgbGltaXQgd2FzIHJlYWNoZWQuIFBsZWFzZSBpbmNyZWFzZSAiCi0JCSAgICAgICAgICJEWU5BTUlDX01PRFVMRV9MSU1JVCBhbmQgcmVjb21waWxlLiIpOwotCSAgICBleGl0KDEpOwotCX0KLSAgICB9Ci0KLSAgICAvKiBTb21lIEMgY29tcGlsZXJzIHB1dCBhIGNvbXBsZXRlIHBhdGggaW50byBfX0ZJTEVfXywgYnV0IHdlIHdhbnQKLSAgICAgKiBvbmx5IHRoZSBmaWxlbmFtZSAoZS5nLiBtb2RfaW5jbHVkZXMuYykuIFNvIGNoZWNrIGZvciBwYXRoCi0gICAgICogY29tcG9uZW50cyAoVW5peCBhbmQgRE9TKSwgYW5kIHJlbW92ZSB0aGVtLgotICAgICAqLwotCi0gICAgaWYgKHN0cnJjaHIobS0+bmFtZSwgJy8nKSkKLQltLT5uYW1lID0gMSArIHN0cnJjaHIobS0+bmFtZSwgJy8nKTsKLSAgICBpZiAoc3RycmNocihtLT5uYW1lLCAnXFwnKSkKLQltLT5uYW1lID0gMSArIHN0cnJjaHIobS0+bmFtZSwgJ1xcJyk7Ci0KLSNpZmRlZiBfT1NEX1BPU0lYIC8qIF9fRklMRV9fPSIqUE9TSVgoL2hvbWUvbWFydGluL2FwYWNoZS9zcmMvbW9kdWxlcy9zdGFuZGFyZC9tb2RfaW5mby5jKSIgKi8KLSAgICAvKiBXZSBjYW5ub3QgZml4IHRoZSBzdHJpbmcgaW4tcGxhY2UsIGJlY2F1c2UgaXQncyBjb25zdCAqLwotICAgIGlmIChtLT5uYW1lW3N0cmxlbihtLT5uYW1lKS0xXT09JyknKSB7Ci0JY2hhciAqdG1wID0gc3RyZHVwKG0tPm5hbWUpOwkvKiBGSVhNRTptZW1vcnkgbGVhaywgYWxiZWl0IGEgc21hbGwgb25lICovCi0JdG1wW3N0cmxlbih0bXApLTFdID0gJ1wwJzsKLQltLT5uYW1lID0gdG1wOwotICAgIH0KLSNlbmRpZiAvKl9PU0RfUE9TSVgqLwotCi0gICAgLyogRklYTUU6IGlzIHRoaXMgdGhlIHJpZ2h0IHBsYWNlIHRvIGNhbGwgdGhpcz8gKi8KLSAgICByZWdpc3Rlcl9ob29rcyhtKTsKLX0KLQotLyogCi0gKiByZW1vdmVfbW9kdWxlIHVuZG9lcyB3aGF0IGFkZF9tb2R1bGUgZGlkLiBUaGVyZSBhcmUgc29tZSBjYXZlYXRzOgotICogd2hlbiB0aGUgbW9kdWxlIGlzIHJlbW92ZWQsIGl0cyBzbG90IGlzIGxvc3Qgc28gYWxsIHRoZSBjdXJyZW50Ci0gKiBwZXItZGlyIGFuZCBwZXItc2VydmVyIGNvbmZpZ3VyYXRpb25zIGFyZSBpbnZhbGlkLiBTbyB3ZSBzaG91bGQKLSAqIG9ubHkgZXZlciBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiB5b3UgYXJlIGludmFsaWRhdGluZyBhbG1vc3QKLSAqIGFsbCBvdXIgY3VycmVudCBkYXRhLiBJLmUuIHdoZW4gZG9pbmcgYSByZXN0YXJ0LgotICovCi0KLUFQSV9FWFBPUlQodm9pZCkgYXBfcmVtb3ZlX21vZHVsZShtb2R1bGUgKm0pCi17Ci0gICAgbW9kdWxlICptb2RwOwotCi0gICAgbW9kcCA9IHRvcF9tb2R1bGU7Ci0gICAgaWYgKG1vZHAgPT0gbSkgewotCS8qIFdlIGFyZSB0aGUgdG9wIG1vZHVsZSwgc3BlY2lhbCBjYXNlICovCi0JdG9wX21vZHVsZSA9IG1vZHAtPm5leHQ7Ci0JbS0+bmV4dCA9IE5VTEw7Ci0gICAgfQotICAgIGVsc2UgewotCS8qIE5vdCB0aGUgdG9wIG1vZHVsZSwgZmluZCB1c2UuIFdoZW4gZm91bmQgbW9kcCB3aWxsCi0JICogcG9pbnQgdG8gdGhlIG1vZHVsZSBfYmVmb3JlXyB1cyBpbiB0aGUgbGlzdAotCSAqLwotCi0Jd2hpbGUgKG1vZHAgJiYgbW9kcC0+bmV4dCAhPSBtKSB7Ci0JICAgIG1vZHAgPSBtb2RwLT5uZXh0OwotCX0KLQlpZiAoIW1vZHApIHsKLQkgICAgLyogVWgtb2gsIHRoaXMgbW9kdWxlIGRvZXNuJ3QgZXhpc3QgKi8KLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUnxBUExPR19OT0VSUk5PLCAwLCBOVUxMLAotCQkiQ2Fubm90IHJlbW92ZSBtb2R1bGUgJXM6IG5vdCBmb3VuZCBpbiBtb2R1bGUgbGlzdCIsCi0JCW0tPm5hbWUpOwotCSAgICByZXR1cm47Ci0JfQotCS8qIEVsaW1pbmF0ZSB1cyBmcm9tIHRoZSBtb2R1bGUgbGlzdCAqLwotCW1vZHAtPm5leHQgPSBtb2RwLT5uZXh0LT5uZXh0OwotICAgIH0KLQotICAgIG0tPm1vZHVsZV9pbmRleCA9IC0xOwkvKiBzaW11bGF0ZSBiZWluZyB1bmxvYWRlZCwgc2hvdWxkCi0JCQkJICogYmUgdW5uZWNlc3NhcnkgKi8KLSAgICBkeW5hbWljX21vZHVsZXMtLTsKLSAgICB0b3RhbF9tb2R1bGVzLS07Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfYWRkX2xvYWRlZF9tb2R1bGUobW9kdWxlICptb2QpCi17Ci0gICAgbW9kdWxlICoqbTsKLQotICAgIC8qIAotICAgICAqICBBZGQgbW9kdWxlIHBvaW50ZXIgdG8gdG9wIG9mIGNoYWluZWQgbW9kdWxlIGxpc3QgCi0gICAgICovCi0gICAgYXBfYWRkX21vZHVsZShtb2QpOwotCi0gICAgLyogCi0gICAgICogIEFuZCBtb2R1bGUgcG9pbnRlciB0byBsaXN0IG9mIGxvYWRlZCBtb2R1bGVzIAotICAgICAqCi0gICAgICogIE5vdGVzOiAxLiBhcF9hZGRfbW9kdWxlKCkgd291bGQgYWxyZWFkeSBjb21wbGFpbiBpZiBubyBtb3JlIHNwYWNlCi0gICAgICogICAgICAgICAgICBleGlzdHMgZm9yIGFkZGluZyBhIGR5bmFtaWNhbGx5IGxvYWRlZCBtb2R1bGUKLSAgICAgKiAgICAgICAgIDIuIGFwX2FkZF9tb2R1bGUoKSBhY2NlcHRzIGRvdWJsZSBpbmNsdXNpb24sIHNvIHdlIGhhdmUKLSAgICAgKiAgICAgICAgICAgIHRvIGFjY2VwdCB0aGlzLCB0b28uCi0gICAgICovCi0gICAgZm9yIChtID0gYXBfbG9hZGVkX21vZHVsZXM7ICptICE9IE5VTEw7IG0rKykKLSAgICAgICAgOwotICAgICptKysgPSBtb2Q7Ci0gICAgKm0gPSBOVUxMOwotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX3JlbW92ZV9sb2FkZWRfbW9kdWxlKG1vZHVsZSAqbW9kKQotewotICAgIG1vZHVsZSAqKm07Ci0gICAgbW9kdWxlICoqbTI7Ci0gICAgaW50IGRvbmU7Ci0KLSAgICAvKiAKLSAgICAgKiAgUmVtb3ZlIG1vZHVsZSBwb2ludGVyIGZyb20gY2hhaW5lZCBtb2R1bGUgbGlzdCAKLSAgICAgKi8KLSAgICBhcF9yZW1vdmVfbW9kdWxlKG1vZCk7Ci0KLSAgICAvKiAKLSAgICAgKiAgUmVtb3ZlIG1vZHVsZSBwb2ludGVyIGZyb20gbGlzdCBvZiBsb2FkZWQgbW9kdWxlcwotICAgICAqCi0gICAgICogIE5vdGU6IDEuIFdlIGNhbm5vdCBkZXRlcm1pbmUgaWYgdGhlIG1vZHVsZSB3YXMgc3VjY2Vzc2Z1bGx5Ci0gICAgICogICAgICAgICAgIHJlbW92ZWQgYnkgYXBfcmVtb3ZlX21vZHVsZSgpLgotICAgICAqICAgICAgICAyLiBXZSBoYXZlIG5vdCB0byBjb21wbGFpbiBleHBsaWNpdHkgd2hlbiB0aGUgbW9kdWxlCi0gICAgICogICAgICAgICAgIGlzIG5vdCBmb3VuZCBiZWNhdXNlIGFwX3JlbW92ZV9tb2R1bGUoKSBkaWQgaXQKLSAgICAgKiAgICAgICAgICAgZm9yIHVzIGFscmVhZHkuCi0gICAgICovCi0gICAgZm9yIChtID0gbTIgPSBhcF9sb2FkZWRfbW9kdWxlcywgZG9uZSA9IDA7ICptMiAhPSBOVUxMOyBtMisrKSB7Ci0gICAgICAgIGlmICgqbTIgPT0gbW9kICYmIGRvbmUgPT0gMCkKLSAgICAgICAgICAgIGRvbmUgPSAxOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAqbSsrID0gKm0yOwotICAgIH0KLSAgICAqbSA9IE5VTEw7Ci19Ci0KLXZvaWQgYXBfc2V0dXBfcHJlbGlua2VkX21vZHVsZXMocHJvY2Vzc19yZWMgKnByb2Nlc3MpCi17Ci0gICAgbW9kdWxlICoqbTsKLSAgICBtb2R1bGUgKiptMjsKLQotICAgIC8qCi0gICAgICogIEluaXRpYWxpc2UgdG90YWxfbW9kdWxlcyB2YXJpYWJsZSBhbmQgbW9kdWxlIGluZGljZXMKLSAgICAgKi8KLSAgICB0b3RhbF9tb2R1bGVzID0gMDsKLSAgICBmb3IgKG0gPSBhcF9wcmVsb2FkZWRfbW9kdWxlczsgKm0gIT0gTlVMTDsgbSsrKQotICAgICAgICAoKm0pLT5tb2R1bGVfaW5kZXggPSB0b3RhbF9tb2R1bGVzKys7Ci0KLSAgICAvKiAKLSAgICAgKiAgSW5pdGlhbGlzZSBsaXN0IG9mIGxvYWRlZCBtb2R1bGVzCi0gICAgICovCi0gICAgYXBfbG9hZGVkX21vZHVsZXMgPSAobW9kdWxlICoqKWFwX3BhbGxvYyhwcm9jZXNzLT5wb29sLAotICAgICAgICBzaXplb2YobW9kdWxlICopKih0b3RhbF9tb2R1bGVzK0RZTkFNSUNfTU9EVUxFX0xJTUlUKzEpKTsKLSAgICBpZiAoYXBfbG9hZGVkX21vZHVsZXMgPT0gTlVMTCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICJPdWNoISAgT3V0IG9mIG1lbW9yeSBpbiBhcF9zZXR1cF9wcmVsaW5rZWRfbW9kdWxlcygpISIpOwotICAgIH0KLSAgICBmb3IgKG0gPSBhcF9wcmVsb2FkZWRfbW9kdWxlcywgbTIgPSBhcF9sb2FkZWRfbW9kdWxlczsgKm0gIT0gTlVMTDsgKQotICAgICAgICAqbTIrKyA9ICptKys7Ci0gICAgKm0yID0gTlVMTDsKLQotICAgIC8qCi0gICAgICogICBJbml0aWFsaXplIGNoYWluIG9mIGxpbmtlZCAoPWFjdGl2YXRlKSBtb2R1bGVzCi0gICAgICovCi0gICAgZm9yIChtID0gYXBfcHJlbGlua2VkX21vZHVsZXM7ICptICE9IE5VTEw7IG0rKykKLSAgICAgICAgYXBfYWRkX21vZHVsZSgqbSk7Ci0KLSAgICBhcF9zb3J0X2hvb2tzKCk7Ci19Ci0KLUFQSV9FWFBPUlQoY29uc3QgY2hhciAqKSBhcF9maW5kX21vZHVsZV9uYW1lKG1vZHVsZSAqbSkKLXsKLSAgICByZXR1cm4gbS0+bmFtZTsKLX0KLQotQVBJX0VYUE9SVChtb2R1bGUgKikgYXBfZmluZF9saW5rZWRfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgbW9kdWxlICptb2RwOwotCi0gICAgZm9yIChtb2RwID0gdG9wX21vZHVsZTsgbW9kcDsgbW9kcCA9IG1vZHAtPm5leHQpIHsKLQlpZiAoc3RyY21wKG1vZHAtPm5hbWUsIG5hbWUpID09IDApCi0JICAgIHJldHVybiBtb2RwOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogQWRkIGEgbmFtZWQgbW9kdWxlLiAgUmV0dXJucyAxIGlmIG1vZHVsZSBmb3VuZCwgMCBvdGhlcndpc2UuICAqLwotQVBJX0VYUE9SVChpbnQpIGFwX2FkZF9uYW1lZF9tb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBtb2R1bGUgKm1vZHA7Ci0gICAgaW50IGkgPSAwOwotCi0gICAgZm9yIChtb2RwID0gYXBfbG9hZGVkX21vZHVsZXNbaV07IG1vZHA7IG1vZHAgPSBhcF9sb2FkZWRfbW9kdWxlc1srK2ldKSB7Ci0JaWYgKHN0cmNtcChtb2RwLT5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0JICAgIC8qIE9ubHkgYWRkIG1vZHVsZXMgdGhhdCBhcmUgbm90IGFscmVhZHkgZW5hYmxlZC4gICovCi0JICAgIGlmIChtb2RwLT5uZXh0ID09IE5VTEwpIHsKLQkJYXBfYWRkX21vZHVsZShtb2RwKTsKLQkgICAgfQotCSAgICByZXR1cm4gMTsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIENsZWFyIHRoZSBpbnRlcm5hbCBsaXN0IG9mIG1vZHVsZXMsIGluIHByZXBhcmF0aW9uIGZvciBzdGFydGluZyBvdmVyLiAqLwotQVBJX0VYUE9SVCh2b2lkKSBhcF9jbGVhcl9tb2R1bGVfbGlzdCgpCi17Ci0gICAgbW9kdWxlICoqbSA9ICZ0b3BfbW9kdWxlOwotICAgIG1vZHVsZSAqKm5leHRfbTsKLQotICAgIHdoaWxlICgqbSkgewotCW5leHRfbSA9ICYoKCptKS0+bmV4dCk7Ci0JKm0gPSBOVUxMOwotCW0gPSBuZXh0X207Ci0gICAgfQotCi0gICAgLyogVGhpcyBpcyByZXF1aXJlZDsgc28gd2UgYWRkIGl0IGFsd2F5cy4gICovCi0gICAgYXBfYWRkX25hbWVkX21vZHVsZSgiaHR0cF9jb3JlLmMiKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogUmVzb3VyY2UsIGFjY2VzcywgYW5kIC5odGFjY2VzcyBjb25maWcgZmlsZXMgbm93IHBhcnNlZCBieSBhIGNvbW1vbgotICogY29tbWFuZCBsb29wLgotICoKLSAqIExldCdzIGJlZ2luIHdpdGggdGhlIGJhc2ljczsgcGFyc2luZyB0aGUgbGluZSBhbmQKLSAqIGludm9raW5nIHRoZSBmdW5jdGlvbi4uLgotICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICppbnZva2VfY21kKGNvbnN0IGNvbW1hbmRfcmVjICpjbWQsIGNtZF9wYXJtcyAqcGFybXMsCi0JCQkgICAgdm9pZCAqbWNvbmZpZywgY29uc3QgY2hhciAqYXJncykKLXsKLSAgICBjaGFyICp3LCAqdzIsICp3MzsKLSAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0KLSAgICBpZiAoKHBhcm1zLT5vdmVycmlkZSAmIGNtZC0+cmVxX292ZXJyaWRlKSA9PSAwKQotCXJldHVybiBhcF9wc3RyY2F0KHBhcm1zLT5wb29sLCBjbWQtPm5hbWUsICIgbm90IGFsbG93ZWQgaGVyZSIsIE5VTEwpOwotCi0gICAgcGFybXMtPmluZm8gPSBjbWQtPmNtZF9kYXRhOwotICAgIHBhcm1zLT5jbWQgPSBjbWQ7Ci0KLSAgICBzd2l0Y2ggKGNtZC0+YXJnc19ob3cpIHsKLSAgICBjYXNlIFJBV19BUkdTOgotCXJldHVybiAoKGNvbnN0IGNoYXIgKigqKShjbWRfcGFybXMgKiwgdm9pZCAqLCBjb25zdCBjaGFyICopKQotCQkoY21kLT5mdW5jKSkgKHBhcm1zLCBtY29uZmlnLCBhcmdzKTsKLQotICAgIGNhc2UgTk9fQVJHUzoKLQlpZiAoKmFyZ3MgIT0gMCkKLQkgICAgcmV0dXJuIGFwX3BzdHJjYXQocGFybXMtPnBvb2wsIGNtZC0+bmFtZSwgIiB0YWtlcyBubyBhcmd1bWVudHMiLAotCQkJICAgTlVMTCk7Ci0KLQlyZXR1cm4gKChjb25zdCBjaGFyICooKikoY21kX3Bhcm1zICosIHZvaWQgKikpCi0JCShjbWQtPmZ1bmMpKSAocGFybXMsIG1jb25maWcpOwotCi0gICAgY2FzZSBUQUtFMToKLQl3ID0gYXBfZ2V0d29yZF9jb25mKHBhcm1zLT5wb29sLCAmYXJncyk7Ci0KLQlpZiAoKncgPT0gJ1wwJyB8fCAqYXJncyAhPSAwKQotCSAgICByZXR1cm4gYXBfcHN0cmNhdChwYXJtcy0+cG9vbCwgY21kLT5uYW1lLCAiIHRha2VzIG9uZSBhcmd1bWVudCIsCi0JCQkgICAgY21kLT5lcnJtc2cgPyAiLCAiIDogTlVMTCwgY21kLT5lcnJtc2csIE5VTEwpOwotCi0JcmV0dXJuICgoY29uc3QgY2hhciAqKCopKGNtZF9wYXJtcyAqLCB2b2lkICosIGNvbnN0IGNoYXIgKikpCi0JCShjbWQtPmZ1bmMpKSAocGFybXMsIG1jb25maWcsIHcpOwotCi0gICAgY2FzZSBUQUtFMjoKLQotCXcgPSBhcF9nZXR3b3JkX2NvbmYocGFybXMtPnBvb2wsICZhcmdzKTsKLQl3MiA9IGFwX2dldHdvcmRfY29uZihwYXJtcy0+cG9vbCwgJmFyZ3MpOwotCi0JaWYgKCp3ID09ICdcMCcgfHwgKncyID09ICdcMCcgfHwgKmFyZ3MgIT0gMCkKLQkgICAgcmV0dXJuIGFwX3BzdHJjYXQocGFybXMtPnBvb2wsIGNtZC0+bmFtZSwgIiB0YWtlcyB0d28gYXJndW1lbnRzIiwKLQkJCSAgICBjbWQtPmVycm1zZyA/ICIsICIgOiBOVUxMLCBjbWQtPmVycm1zZywgTlVMTCk7Ci0KLQlyZXR1cm4gKChjb25zdCBjaGFyICooKikoY21kX3Bhcm1zICosIHZvaWQgKiwgY29uc3QgY2hhciAqLAotCQkJY29uc3QgY2hhciAqKSkgKGNtZC0+ZnVuYykpIChwYXJtcywgbWNvbmZpZywgdywgdzIpOwotCi0gICAgY2FzZSBUQUtFMTI6Ci0KLQl3ID0gYXBfZ2V0d29yZF9jb25mKHBhcm1zLT5wb29sLCAmYXJncyk7Ci0JdzIgPSBhcF9nZXR3b3JkX2NvbmYocGFybXMtPnBvb2wsICZhcmdzKTsKLQotCWlmICgqdyA9PSAnXDAnIHx8ICphcmdzICE9IDApCi0JICAgIHJldHVybiBhcF9wc3RyY2F0KHBhcm1zLT5wb29sLCBjbWQtPm5hbWUsICIgdGFrZXMgMS0yIGFyZ3VtZW50cyIsCi0JCQkgICAgY21kLT5lcnJtc2cgPyAiLCAiIDogTlVMTCwgY21kLT5lcnJtc2csIE5VTEwpOwotCi0JcmV0dXJuICgoY29uc3QgY2hhciAqKCopKGNtZF9wYXJtcyAqLCB2b2lkICosIGNvbnN0IGNoYXIgKiwKLQkJCSAgICBjb25zdCBjaGFyICopKSAoY21kLT5mdW5jKSkgKHBhcm1zLCBtY29uZmlnLCB3LAotCQkJCQkJCSAgICAqdzIgPyB3MiA6IE5VTEwpOwotCi0gICAgY2FzZSBUQUtFMzoKLQotCXcgPSBhcF9nZXR3b3JkX2NvbmYocGFybXMtPnBvb2wsICZhcmdzKTsKLQl3MiA9IGFwX2dldHdvcmRfY29uZihwYXJtcy0+cG9vbCwgJmFyZ3MpOwotCXczID0gYXBfZ2V0d29yZF9jb25mKHBhcm1zLT5wb29sLCAmYXJncyk7Ci0KLQlpZiAoKncgPT0gJ1wwJyB8fCAqdzIgPT0gJ1wwJyB8fCAqdzMgPT0gJ1wwJyB8fCAqYXJncyAhPSAwKQotCSAgICByZXR1cm4gYXBfcHN0cmNhdChwYXJtcy0+cG9vbCwgY21kLT5uYW1lLCAiIHRha2VzIHRocmVlIGFyZ3VtZW50cyIsCi0JCQkgICAgY21kLT5lcnJtc2cgPyAiLCAiIDogTlVMTCwgY21kLT5lcnJtc2csIE5VTEwpOwotCi0JcmV0dXJuICgoY29uc3QgY2hhciAqKCopKGNtZF9wYXJtcyAqLCB2b2lkICosIGNvbnN0IGNoYXIgKiwKLQkJCSAgICBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpIChjbWQtPmZ1bmMpKSAocGFybXMsCi0JCQkJCQkJbWNvbmZpZywgdywgdzIsIHczKTsKLQotICAgIGNhc2UgVEFLRTIzOgotCi0JdyA9IGFwX2dldHdvcmRfY29uZihwYXJtcy0+cG9vbCwgJmFyZ3MpOwotCXcyID0gYXBfZ2V0d29yZF9jb25mKHBhcm1zLT5wb29sLCAmYXJncyk7Ci0JdzMgPSAqYXJncyA/IGFwX2dldHdvcmRfY29uZihwYXJtcy0+cG9vbCwgJmFyZ3MpIDogTlVMTDsKLQotCWlmICgqdyA9PSAnXDAnIHx8ICp3MiA9PSAnXDAnIHx8ICphcmdzICE9IDApCi0JICAgIHJldHVybiBhcF9wc3RyY2F0KHBhcm1zLT5wb29sLCBjbWQtPm5hbWUsCi0JCQkgICAgIiB0YWtlcyB0d28gb3IgdGhyZWUgYXJndW1lbnRzIiwKLQkJCSAgICBjbWQtPmVycm1zZyA/ICIsICIgOiBOVUxMLCBjbWQtPmVycm1zZywgTlVMTCk7Ci0KLQlyZXR1cm4gKChjb25zdCBjaGFyICooKikoY21kX3Bhcm1zICosIHZvaWQgKiwgY29uc3QgY2hhciAqLAotCQkJICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSkgKGNtZC0+ZnVuYykpIChwYXJtcywKLQkJCQkJCQltY29uZmlnLCB3LCB3MiwgdzMpOwotCi0gICAgY2FzZSBUQUtFMTIzOgotCi0JdyA9IGFwX2dldHdvcmRfY29uZihwYXJtcy0+cG9vbCwgJmFyZ3MpOwotCXcyID0gKmFyZ3MgPyBhcF9nZXR3b3JkX2NvbmYocGFybXMtPnBvb2wsICZhcmdzKSA6IE5VTEw7Ci0JdzMgPSAqYXJncyA/IGFwX2dldHdvcmRfY29uZihwYXJtcy0+cG9vbCwgJmFyZ3MpIDogTlVMTDsKLQotCWlmICgqdyA9PSAnXDAnIHx8ICphcmdzICE9IDApCi0JICAgIHJldHVybiBhcF9wc3RyY2F0KHBhcm1zLT5wb29sLCBjbWQtPm5hbWUsCi0JCQkgICAgIiB0YWtlcyBvbmUsIHR3byBvciB0aHJlZSBhcmd1bWVudHMiLAotCQkJICAgIGNtZC0+ZXJybXNnID8gIiwgIiA6IE5VTEwsIGNtZC0+ZXJybXNnLCBOVUxMKTsKLQotCXJldHVybiAoKGNvbnN0IGNoYXIgKigqKShjbWRfcGFybXMgKiwgdm9pZCAqLCBjb25zdCBjaGFyICosCi0JCQkgICAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKSAoY21kLT5mdW5jKSkgKHBhcm1zLAotCQkJCQkJCW1jb25maWcsIHcsIHcyLCB3Myk7Ci0KLSAgICBjYXNlIFRBS0UxMzoKLQotCXcgPSBhcF9nZXR3b3JkX2NvbmYocGFybXMtPnBvb2wsICZhcmdzKTsKLQl3MiA9ICphcmdzID8gYXBfZ2V0d29yZF9jb25mKHBhcm1zLT5wb29sLCAmYXJncykgOiBOVUxMOwotCXczID0gKmFyZ3MgPyBhcF9nZXR3b3JkX2NvbmYocGFybXMtPnBvb2wsICZhcmdzKSA6IE5VTEw7Ci0KLQlpZiAoKncgPT0gJ1wwJyB8fCAoKncyICYmICF3MykgfHwgKmFyZ3MgIT0gMCkKLQkgICAgcmV0dXJuIGFwX3BzdHJjYXQocGFybXMtPnBvb2wsIGNtZC0+bmFtZSwKLQkJCSAgICAiIHRha2VzIG9uZSBvciB0aHJlZSBhcmd1bWVudHMiLAotCQkJICAgIGNtZC0+ZXJybXNnID8gIiwgIiA6IE5VTEwsIGNtZC0+ZXJybXNnLCBOVUxMKTsKLQotCXJldHVybiAoKGNvbnN0IGNoYXIgKigqKShjbWRfcGFybXMgKiwgdm9pZCAqLCBjb25zdCBjaGFyICosCi0JCQkgICAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKSAoY21kLT5mdW5jKSkgKHBhcm1zLAotCQkJCQkJCW1jb25maWcsIHcsIHcyLCB3Myk7Ci0KLSAgICBjYXNlIElURVJBVEU6Ci0KLQl3aGlsZSAoKih3ID0gYXBfZ2V0d29yZF9jb25mKHBhcm1zLT5wb29sLCAmYXJncykpICE9ICdcMCcpCi0JaWYgICAoKGVycm1zZyA9ICgoY29uc3QgY2hhciAqKCopKGNtZF9wYXJtcyAqLCB2b2lkICosCi0JCQljb25zdCBjaGFyICopKSAoY21kLT5mdW5jKSkgKHBhcm1zLCBtY29uZmlnLCB3KSkpCi0JCSAgICByZXR1cm4gZXJybXNnOwotCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICBjYXNlIElURVJBVEUyOgotCi0JdyA9IGFwX2dldHdvcmRfY29uZihwYXJtcy0+cG9vbCwgJmFyZ3MpOwotCi0JaWYgKCp3ID09ICdcMCcgfHwgKmFyZ3MgPT0gMCkKLQkgICAgcmV0dXJuIGFwX3BzdHJjYXQocGFybXMtPnBvb2wsIGNtZC0+bmFtZSwKLQkJCSAgICAiIHJlcXVpcmVzIGF0IGxlYXN0IHR3byBhcmd1bWVudHMiLAotCQkJICAgIGNtZC0+ZXJybXNnID8gIiwgIiA6IE5VTEwsIGNtZC0+ZXJybXNnLCBOVUxMKTsKLQotCi0Jd2hpbGUgKCoodzIgPSBhcF9nZXR3b3JkX2NvbmYocGFybXMtPnBvb2wsICZhcmdzKSkgIT0gJ1wwJykKLQkgICAgaWYgICAoKGVycm1zZyA9ICgoY29uc3QgY2hhciAqKCopKGNtZF9wYXJtcyAqLCB2b2lkICosCi0JCQkgICAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKSAoY21kLT5mdW5jKSkgKHBhcm1zLAotCQkJCQkJCSAgICBtY29uZmlnLCB3LCB3MikpKQotCQkJcmV0dXJuIGVycm1zZzsKLQotCXJldHVybiBOVUxMOwotCi0gICAgY2FzZSBGTEFHOgotCi0JdyA9IGFwX2dldHdvcmRfY29uZihwYXJtcy0+cG9vbCwgJmFyZ3MpOwotCi0JaWYgKCp3ID09ICdcMCcgfHwgKHN0cmNhc2VjbXAodywgIm9uIikgJiYgc3RyY2FzZWNtcCh3LCAib2ZmIikpKQotCSAgICByZXR1cm4gYXBfcHN0cmNhdChwYXJtcy0+cG9vbCwgY21kLT5uYW1lLCAiIG11c3QgYmUgT24gb3IgT2ZmIiwKLQkJCSAgICBOVUxMKTsKLQotCXJldHVybiAoKGNvbnN0IGNoYXIgKigqKShjbWRfcGFybXMgKiwgdm9pZCAqLCBpbnQpKQotCQkoY21kLT5mdW5jKSkgKHBhcm1zLCBtY29uZmlnLCBzdHJjYXNlY21wKHcsICJvZmYiKSAhPSAwKTsKLQotICAgIGRlZmF1bHQ6Ci0KLQlyZXR1cm4gYXBfcHN0cmNhdChwYXJtcy0+cG9vbCwgY21kLT5uYW1lLAotCQkgICAgIiBpcyBpbXByb3Blcmx5IGNvbmZpZ3VyZWQgaW50ZXJuYWxseSAoc2VydmVyIGJ1ZykiLAotCQkJTlVMTCk7Ci0gICAgfQotfQotCi1DT1JFX0VYUE9SVChjb25zdCBjb21tYW5kX3JlYyAqKSBhcF9maW5kX2NvbW1hbmQoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY29tbWFuZF9yZWMgKmNtZHMpCi17Ci0gICAgd2hpbGUgKGNtZHMtPm5hbWUpCi0JaWYgKCFzdHJjYXNlY21wKG5hbWUsIGNtZHMtPm5hbWUpKQotCSAgICByZXR1cm4gY21kczsKLQllbHNlCi0JICAgICsrY21kczsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1DT1JFX0VYUE9SVChjb25zdCBjb21tYW5kX3JlYyAqKSBhcF9maW5kX2NvbW1hbmRfaW5fbW9kdWxlcyhjb25zdCBjaGFyICpjbWRfbmFtZSwgbW9kdWxlICoqbW9kKQotewotICAgIGNvbnN0IGNvbW1hbmRfcmVjICpjbWRwOwotICAgIG1vZHVsZSAqbW9kcDsKLQotICAgIGZvciAobW9kcCA9ICptb2Q7IG1vZHA7IG1vZHAgPSBtb2RwLT5uZXh0KQotCWlmIChtb2RwLT5jbWRzICYmIChjbWRwID0gYXBfZmluZF9jb21tYW5kKGNtZF9uYW1lLCBtb2RwLT5jbWRzKSkpIHsKLQkgICAgKm1vZCA9IG1vZHA7Ci0JICAgIHJldHVybiBjbWRwOwotCX0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi1DT1JFX0VYUE9SVCh2b2lkICopIGFwX3NldF9jb25maWdfdmVjdG9ycyhjbWRfcGFybXMgKnBhcm1zLCB2b2lkICpjb25maWcsIG1vZHVsZSAqbW9kKQotewotICAgIHZvaWQgKm1jb25maWcgPSBhcF9nZXRfbW9kdWxlX2NvbmZpZyhjb25maWcsIG1vZCk7Ci0gICAgdm9pZCAqc2NvbmZpZyA9IGFwX2dldF9tb2R1bGVfY29uZmlnKHBhcm1zLT5zZXJ2ZXItPm1vZHVsZV9jb25maWcsIG1vZCk7Ci0KLSAgICBpZiAoIW1jb25maWcgJiYgbW9kLT5jcmVhdGVfZGlyX2NvbmZpZykgewotCW1jb25maWcgPSAoKm1vZC0+Y3JlYXRlX2Rpcl9jb25maWcpIChwYXJtcy0+cG9vbCwgcGFybXMtPnBhdGgpOwotCWFwX3NldF9tb2R1bGVfY29uZmlnKGNvbmZpZywgbW9kLCBtY29uZmlnKTsKLSAgICB9Ci0KLSAgICBpZiAoIXNjb25maWcgJiYgbW9kLT5jcmVhdGVfc2VydmVyX2NvbmZpZykgewotCXNjb25maWcgPSAoKm1vZC0+Y3JlYXRlX3NlcnZlcl9jb25maWcpIChwYXJtcy0+cG9vbCwgcGFybXMtPnNlcnZlcik7Ci0JYXBfc2V0X21vZHVsZV9jb25maWcocGFybXMtPnNlcnZlci0+bW9kdWxlX2NvbmZpZywgbW9kLCBzY29uZmlnKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1jb25maWc7Ci19Ci0KLUNPUkVfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfaGFuZGxlX2NvbW1hbmQoY21kX3Bhcm1zICpwYXJtcywgdm9pZCAqY29uZmlnLCBjb25zdCBjaGFyICpsKQotewotICAgIHZvaWQgKm9sZGNvbmZpZzsKLSAgICBjb25zdCBjaGFyICphcmdzLCAqY21kX25hbWUsICpyZXR2YWw7Ci0gICAgY29uc3QgY29tbWFuZF9yZWMgKmNtZDsKLSAgICBtb2R1bGUgKm1vZCA9IHRvcF9tb2R1bGU7Ci0KLSAgICBpZiAoKGxbMF0gPT0gJyMnKSB8fCAoIWxbMF0pKQotCXJldHVybiBOVUxMOwotCi0gICAgYXJncyA9IGw7Ci0gICAgY21kX25hbWUgPSBhcF9nZXR3b3JkX2NvbmYocGFybXMtPnRlbXBfcG9vbCwgJmFyZ3MpOwotICAgIGlmICgqY21kX25hbWUgPT0gJ1wwJykKLQlyZXR1cm4gTlVMTDsKLQotICAgIG9sZGNvbmZpZyA9IHBhcm1zLT5jb250ZXh0OwotICAgIHBhcm1zLT5jb250ZXh0ID0gY29uZmlnOwotICAgIGRvIHsKLQlpZiAoIShjbWQgPSBhcF9maW5kX2NvbW1hbmRfaW5fbW9kdWxlcyhjbWRfbmFtZSwgJm1vZCkpKSB7Ci0gICAgICAgICAgICBlcnJubyA9IEVJTlZBTDsKLSAgICAgICAgICAgIHJldHVybiBhcF9wc3RyY2F0KHBhcm1zLT5wb29sLCAiSW52YWxpZCBjb21tYW5kICciLCBjbWRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICInLCBwZXJoYXBzIG1pcy1zcGVsbGVkIG9yIGRlZmluZWQgYnkgYSBtb2R1bGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBpbmNsdWRlZCBpbiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24iLCBOVUxMKTsKLQl9Ci0JZWxzZSB7Ci0JICAgIHZvaWQgKm1jb25maWcgPSBhcF9zZXRfY29uZmlnX3ZlY3RvcnMocGFybXMsY29uZmlnLCBtb2QpOwotCi0JICAgIHJldHZhbCA9IGludm9rZV9jbWQoY21kLCBwYXJtcywgbWNvbmZpZywgYXJncyk7Ci0JICAgIG1vZCA9IG1vZC0+bmV4dDsJLyogTmV4dCB0aW1lIGFyb3VuZCwgc2tpcCB0aGlzIG9uZSAqLwotCX0KLSAgICB9IHdoaWxlIChyZXR2YWwgJiYgIXN0cmNtcChyZXR2YWwsIERFQ0xJTkVfQ01EKSk7Ci0gICAgcGFybXMtPmNvbnRleHQgPSBvbGRjb25maWc7Ci0KLSAgICByZXR1cm4gcmV0dmFsOwotfQotCi1BUElfRVhQT1JUKGNvbnN0IGNoYXIgKikgYXBfc3JtX2NvbW1hbmRfbG9vcChjbWRfcGFybXMgKnBhcm1zLCB2b2lkICpjb25maWcpCi17Ci0gICAgY2hhciBsW01BWF9TVFJJTkdfTEVOXTsKLQotICAgIHdoaWxlICghKGFwX2NmZ19nZXRsaW5lKGwsIE1BWF9TVFJJTkdfTEVOLCBwYXJtcy0+Y29uZmlnX2ZpbGUpKSkgewotCWNvbnN0IGNoYXIgKmVycm1zZyA9IGFwX2hhbmRsZV9jb21tYW5kKHBhcm1zLCBjb25maWcsIGwpOwotICAgICAgICBpZiAoZXJybXNnKSB7Ci0JICAgIHJldHVybiBlcnJtc2c7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi0vKgotICogR2VuZXJpYyBjb21tYW5kIGZ1bmN0aW9ucy4uLgotICovCi0KLUFQSV9FWFBPUlRfTk9OU1REKGNvbnN0IGNoYXIgKikgYXBfc2V0X3N0cmluZ19zbG90KGNtZF9wYXJtcyAqY21kLAotCQkJCQkJY2hhciAqc3RydWN0X3B0ciwgY2hhciAqYXJnKQotewotICAgIC8qIFRoaXMgb25lJ3MgcHJldHR5IGdlbmVyaWMuLi4gKi8KLQotICAgIGludCBvZmZzZXQgPSAoaW50KSAobG9uZykgY21kLT5pbmZvOwotICAgICooY2hhciAqKikgKHN0cnVjdF9wdHIgKyBvZmZzZXQpID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1BUElfRVhQT1JUX05PTlNURChjb25zdCBjaGFyICopIGFwX3NldF9zdHJpbmdfc2xvdF9sb3dlcihjbWRfcGFybXMgKmNtZCwKLQkJCQkJCWNoYXIgKnN0cnVjdF9wdHIsIGNoYXIgKmFyZykKLXsKLSAgICAvKiBUaGlzIG9uZSdzIHByZXR0eSBnZW5lcmljLi4uICovCi0KLSAgICBpbnQgb2Zmc2V0ID0gKGludCkgKGxvbmcpIGNtZC0+aW5mbzsKLSAgICBhcF9zdHJfdG9sb3dlcihhcmcpOwotICAgICooY2hhciAqKikgKHN0cnVjdF9wdHIgKyBvZmZzZXQpID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1BUElfRVhQT1JUX05PTlNURChjb25zdCBjaGFyICopIGFwX3NldF9mbGFnX3Nsb3QoY21kX3Bhcm1zICpjbWQsCi0JCQkJCSAgICAgIGNoYXIgKnN0cnVjdF9wdHIsIGludCBhcmcpCi17Ci0gICAgLyogVGhpcyBvbmUncyBwcmV0dHkgZ2VuZXJpYyB0b28uLi4gKi8KLQotICAgIGludCBvZmZzZXQgPSAoaW50KSAobG9uZykgY21kLT5pbmZvOwotICAgICooaW50ICopIChzdHJ1Y3RfcHRyICsgb2Zmc2V0KSA9IGFyZyA/IDEgOiAwOwotICAgIHJldHVybiBOVUxMOwotfQotCi1BUElfRVhQT1JUX05PTlNURChjb25zdCBjaGFyICopIGFwX3NldF9maWxlX3Nsb3QoY21kX3Bhcm1zICpjbWQsIGNoYXIgKnN0cnVjdF9wdHIsIGNoYXIgKmFyZykKLXsKLSAgICAvKiBQcmVwZW5kIHNlcnZlcl9yb290IHRvIHJlbGF0aXZlIGFyZy4KLSAgICAgICBUaGlzIGFsbG93cyAuaHRhY2Nlc3MgdG8gYmUgaW5kZXBlbmRlbnQgb2Ygc2VydmVyX3Jvb3QsCi0gICAgICAgc28gdGhlIHNlcnZlciBjYW4gYmUgbW92ZWQgb3IgbWlycm9yZWQgd2l0aCBsZXNzIHBhaW4uICAqLwotICAgIGNoYXIgKnA7Ci0gICAgaW50IG9mZnNldCA9IChpbnQpIChsb25nKSBjbWQtPmluZm87Ci0gICAgaWYgKGFwX29zX2lzX3BhdGhfYWJzb2x1dGUoYXJnKSkKLQlwID0gYXJnOwotICAgIGVsc2UKLQlwID0gYXBfbWFrZV9mdWxsX3BhdGgoY21kLT5wb29sLCBhcF9zZXJ2ZXJfcm9vdCwgYXJnKTsKLSAgICAqKGNoYXIgKiopIChzdHJ1Y3RfcHRyICsgb2Zmc2V0KSA9IHA7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFJlYWRpbmcgd2hvbGUgY29uZmlnIGZpbGVzLi4uCi0gKi8KLQotc3RhdGljIGNtZF9wYXJtcyBkZWZhdWx0X3Bhcm1zID0KLXtOVUxMLCAwLCAtMSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTH07Ci0KLUFQSV9FWFBPUlQoY29uc3QgY2hhciAqKSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKmZpbGUpCi17Ci0gICAgaWYoYXBfb3NfaXNfcGF0aF9hYnNvbHV0ZShmaWxlKSkKLQlyZXR1cm4gZmlsZTsKLSAgICByZXR1cm4gYXBfbWFrZV9mdWxsX3BhdGgocCwgYXBfc2VydmVyX3Jvb3QsIGZpbGUpOwotfQotCi0KLS8qIFRoaXMgc3RydWN0dXJlIGFuZCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIGZvciB0aGUKLSAqIHRhYmxlLWJhc2VkIGNvbmZpZyBmaWxlIHJlYWRpbmcuIFRoZXkgYXJlIHBhc3NlZCB0byB0aGUKLSAqIGNmZ19vcGVuX2N1c3RvbSgpIHJvdXRpbmUuCi0gKi8KLQotLyogU3RydWN0dXJlIHRvIGJlIHBhc3NlZCB0byBjZmdfb3Blbl9jdXN0b20oKTogaXQgY29udGFpbnMgYW4KLSAqIGluZGV4IHdoaWNoIGlzIGluY3JlbWVudGVkIGZyb20gMCB0byBuZWx0cyBvbiBlYWNoIGNhbGwgdG8KLSAqIGNmZ19nZXRsaW5lKCkgKHdoaWNoIGluIHR1cm4gY2FsbHMgYXJyX2VsdHNfZ2V0c3RyKCkpCi0gKiBhbmQgYW4gYXBfYXJyYXlfaGVhZGVyX3QgcG9pbnRlciBmb3IgdGhlIHN0cmluZyBhcnJheS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGFwX2FycmF5X2hlYWRlcl90ICphcnJheTsKLSAgICBpbnQgY3Vycl9pZHg7Ci19IGFycl9lbHRzX3BhcmFtX3Q7Ci0KLQotLyogYXJyX2VsdHNfZ2V0c3RyKCkgcmV0dXJucyB0aGUgbmV4dCBsaW5lIGZyb20gdGhlIHN0cmluZyBhcnJheS4gKi8KLXN0YXRpYyB2b2lkICphcnJfZWx0c19nZXRzdHIodm9pZCAqYnVmLCBzaXplX3QgYnVmc2l6LCB2b2lkICpwYXJhbSkKLXsKLSAgICBhcnJfZWx0c19wYXJhbV90ICphcnJfcGFyYW0gPSAoYXJyX2VsdHNfcGFyYW1fdCAqKSBwYXJhbTsKLQotICAgIC8qIEVuZCBvZiBhcnJheSByZWFjaGVkPyAqLwotICAgIGlmICgrK2Fycl9wYXJhbS0+Y3Vycl9pZHggPiBhcnJfcGFyYW0tPmFycmF5LT5uZWx0cykKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiByZXR1cm4gdGhlIGxpbmUgKi8KLSAgICBhcF9jcHlzdHJuKGJ1ZiwgKChjaGFyICoqKSBhcnJfcGFyYW0tPmFycmF5LT5lbHRzKVthcnJfcGFyYW0tPmN1cnJfaWR4IC0gMV0sIGJ1ZnNpeik7Ci0KLSAgICByZXR1cm4gYnVmOwotfQotCi0KLS8qIGFycl9lbHRzX2Nsb3NlKCk6IGR1bW15IGNsb3NlIHJvdXRpbmUgKG1ha2VzIHN1cmUgbm8gbW9yZSBsaW5lcyBjYW4gYmUgcmVhZCkgKi8KLXN0YXRpYyBpbnQgYXJyX2VsdHNfY2xvc2Uodm9pZCAqcGFyYW0pCi17Ci0gICAgYXJyX2VsdHNfcGFyYW1fdCAqYXJyX3BhcmFtID0gKGFycl9lbHRzX3BhcmFtX3QgKikgcGFyYW07Ci0gICAgYXJyX3BhcmFtLT5jdXJyX2lkeCA9IGFycl9wYXJhbS0+YXJyYXktPm5lbHRzOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBwcm9jZXNzX2NvbW1hbmRfY29uZmlnKHNlcnZlcl9yZWMgKnMsIGFwX2FycmF5X2hlYWRlcl90ICphcnIsIGFwX2NvbnRleHRfdCAqcCwKLQkJCQkgICAgYXBfY29udGV4dF90ICpwdGVtcCkKLXsKLSAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0gICAgY21kX3Bhcm1zIHBhcm1zOwotICAgIGFycl9lbHRzX3BhcmFtX3QgYXJyX3Bhcm1zOwotCi0gICAgYXJyX3Bhcm1zLmN1cnJfaWR4ID0gMDsKLSAgICBhcnJfcGFybXMuYXJyYXkgPSBhcnI7Ci0KLSAgICBwYXJtcyA9IGRlZmF1bHRfcGFybXM7Ci0gICAgcGFybXMucG9vbCA9IHA7Ci0gICAgcGFybXMudGVtcF9wb29sID0gcHRlbXA7Ci0gICAgcGFybXMuc2VydmVyID0gczsKLSAgICBwYXJtcy5vdmVycmlkZSA9IChSU1JDX0NPTkYgfCBPUl9BTEwpICYgfihPUl9BVVRIQ0ZHIHwgT1JfTElNSVQpOwotICAgIHBhcm1zLmNvbmZpZ19maWxlID0gYXBfcGNmZ19vcGVuX2N1c3RvbShwLCAiLWMvLUMgZGlyZWN0aXZlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcnJfcGFybXMsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycl9lbHRzX2dldHN0ciwgYXJyX2VsdHNfY2xvc2UpOwotCi0gICAgZXJybXNnID0gYXBfc3JtX2NvbW1hbmRfbG9vcCgmcGFybXMsIHMtPmxvb2t1cF9kZWZhdWx0cyk7Ci0KLSAgICBpZiAoZXJybXNnKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICJTeW50YXggZXJyb3IgaW4gLUMvLWMgZGlyZWN0aXZlOlxuJXMiLCBlcnJtc2cpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGFwX2NmZ19jbG9zZWZpbGUocGFybXMuY29uZmlnX2ZpbGUpOwotfQotCi12b2lkIGFwX3Byb2Nlc3NfcmVzb3VyY2VfY29uZmlnKHNlcnZlcl9yZWMgKnMsIGNvbnN0IGNoYXIgKmZuYW1lLCBhcF9jb250ZXh0X3QgKnAsIGFwX2NvbnRleHRfdCAqcHRlbXApCi17Ci0gICAgY29uc3QgY2hhciAqZXJybXNnOwotICAgIGNtZF9wYXJtcyBwYXJtczsKLSAgICBhcF9maW5mb190IGZpbmZvOwotCi0gICAgZm5hbWUgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShwLCBmbmFtZSk7Ci0KLSAgICBpZiAoIShzdHJjbXAoZm5hbWUsIGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHAsIFJFU09VUkNFX0NPTkZJR19GSUxFKSkpIHx8Ci0JIShzdHJjbXAoZm5hbWUsIGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHAsIEFDQ0VTU19DT05GSUdfRklMRSkpKSkgewotCWlmIChhcF9zdGF0KCZmaW5mbywgZm5hbWUsIHApICE9IEFQUl9TVUNDRVNTKSAgIAotCSAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogZG9uJ3QgcmVxdWlyZSBjb25mL2h0dHBkLmNvbmYgaWYgd2UgaGF2ZSBhIC1DIG9yIC1jIHN3aXRjaCAqLwotICAgIGlmKChhcF9zZXJ2ZXJfcHJlX3JlYWRfY29uZmlnLT5uZWx0cyB8fCBhcF9zZXJ2ZXJfcG9zdF9yZWFkX2NvbmZpZy0+bmVsdHMpICYmCi0gICAgICAgIShzdHJjbXAoZm5hbWUsIGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHAsIFNFUlZFUl9DT05GSUdfRklMRSkpKSkgewotCWlmIChhcF9zdGF0KCZmaW5mbywgZm5hbWUsIHApICE9IEFQUl9TVUNDRVNTKSAgICAgCi0JICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBHQ0MncyBpbml0aWFsaXphdGlvbiBleHRlbnNpb25zIGFyZSBzb29vbyBuaWNlIGhlcmUuLi4gKi8KLQotICAgIHBhcm1zID0gZGVmYXVsdF9wYXJtczsKLSAgICBwYXJtcy5wb29sID0gcDsKLSAgICBwYXJtcy50ZW1wX3Bvb2wgPSBwdGVtcDsKLSAgICBwYXJtcy5zZXJ2ZXIgPSBzOwotICAgIHBhcm1zLm92ZXJyaWRlID0gKFJTUkNfQ09ORiB8IE9SX0FMTCkgJiB+KE9SX0FVVEhDRkcgfCBPUl9MSU1JVCk7Ci0KLSAgICBpZiAoYXBfcGNmZ19vcGVuZmlsZSgmcGFybXMuY29uZmlnX2ZpbGUsIHAsIGZuYW1lKSAhPSBBUFJfU1VDQ0VTUykgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICIlczogY291bGQgbm90IG9wZW4gZG9jdW1lbnQgY29uZmlnIGZpbGUgJXMiLAotCQkgICAgIGFwX3NlcnZlcl9hcmd2MCwgZm5hbWUpOwotCWV4aXQoMSk7Ci0gICAgfQotCi0gICAgZXJybXNnID0gYXBfc3JtX2NvbW1hbmRfbG9vcCgmcGFybXMsIHMtPmxvb2t1cF9kZWZhdWx0cyk7Ci0KLSAgICBpZiAoZXJybXNnKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgIlN5bnRheCBlcnJvciBvbiBsaW5lICVkIG9mICVzOiIsCi0JCSAgICAgcGFybXMuY29uZmlnX2ZpbGUtPmxpbmVfbnVtYmVyLCBwYXJtcy5jb25maWdfZmlsZS0+bmFtZSk7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICIlcyIsIGVycm1zZyk7Ci0JZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBhcF9jZmdfY2xvc2VmaWxlKHBhcm1zLmNvbmZpZ19maWxlKTsKLX0KLQotCi1pbnQgYXBfcGFyc2VfaHRhY2Nlc3Modm9pZCAqKnJlc3VsdCwgcmVxdWVzdF9yZWMgKnIsIGludCBvdmVycmlkZSwKLQkJICAgY29uc3QgY2hhciAqZCwgY29uc3QgY2hhciAqYWNjZXNzX25hbWUpCi17Ci0gICAgY29uZmlnZmlsZV90ICpmID0gTlVMTDsKLSAgICBjbWRfcGFybXMgcGFybXM7Ci0gICAgY29uc3QgY2hhciAqZXJybXNnOwotICAgIGNoYXIgKmZpbGVuYW1lID0gTlVMTDsKLSAgICBjb25zdCBzdHJ1Y3QgaHRhY2Nlc3NfcmVzdWx0ICpjYWNoZTsKLSAgICBzdHJ1Y3QgaHRhY2Nlc3NfcmVzdWx0ICpuZXc7Ci0gICAgdm9pZCAqZGMgPSBOVUxMOwotICAgIGFwX3N0YXR1c190IHN0YXR1czsKLQotLyogZmlyc3RseSwgc2VhcmNoIGNhY2hlICovCi0gICAgZm9yIChjYWNoZSA9IHItPmh0YWNjZXNzOyBjYWNoZSAhPSBOVUxMOyBjYWNoZSA9IGNhY2hlLT5uZXh0KQotCWlmIChjYWNoZS0+b3ZlcnJpZGUgPT0gb3ZlcnJpZGUgJiYgc3RyY21wKGNhY2hlLT5kaXIsIGQpID09IDApIHsKLQkgICAgaWYgKGNhY2hlLT5odGFjY2VzcyAhPSBOVUxMKQotCQkqcmVzdWx0ID0gY2FjaGUtPmh0YWNjZXNzOwotCSAgICByZXR1cm4gT0s7Ci0JfQotCi0gICAgcGFybXMgPSBkZWZhdWx0X3Bhcm1zOwotICAgIHBhcm1zLm92ZXJyaWRlID0gb3ZlcnJpZGU7Ci0gICAgcGFybXMucG9vbCA9IHItPnBvb2w7Ci0gICAgcGFybXMudGVtcF9wb29sID0gci0+cG9vbDsKLSAgICBwYXJtcy5zZXJ2ZXIgPSByLT5zZXJ2ZXI7Ci0gICAgcGFybXMucGF0aCA9IGFwX3BzdHJkdXAoci0+cG9vbCwgZCk7Ci0KLSAgICAvKiBsb29wIHRocm91Z2ggdGhlIGFjY2VzcyBuYW1lcyBhbmQgZmluZCB0aGUgZmlyc3Qgb25lICovCi0KLSAgICB3aGlsZSAoYWNjZXNzX25hbWVbMF0pIHsKLSAgICAgICAgZmlsZW5hbWUgPSBhcF9tYWtlX2Z1bGxfcGF0aChyLT5wb29sLCBkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwX2dldHdvcmRfY29uZihyLT5wb29sLCAmYWNjZXNzX25hbWUpKTsKLSAgICAgICAgc3RhdHVzID0gYXBfcGNmZ19vcGVuZmlsZSgmZiwgci0+cG9vbCwgZmlsZW5hbWUpOwotCi0gICAgICAgIGlmIChzdGF0dXMgPT0gQVBSX1NVQ0NFU1MpIHsKLQotICAgICAgICAgICAgZGMgPSBhcF9jcmVhdGVfcGVyX2Rpcl9jb25maWcoci0+cG9vbCk7Ci0KLSAgICAgICAgICAgIHBhcm1zLmNvbmZpZ19maWxlID0gZjsKLQotICAgICAgICAgICAgZXJybXNnID0gYXBfc3JtX2NvbW1hbmRfbG9vcCgmcGFybXMsIGRjKTsKLQotICAgICAgICAgICAgYXBfY2ZnX2Nsb3NlZmlsZShmKTsKLQotICAgICAgICAgICAgaWYgKGVycm1zZykgewotICAgICAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlR8QVBMT0dfTk9FUlJOTywgMCwgciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJXMiLCBmaWxlbmFtZSwgZXJybXNnKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqcmVzdWx0ID0gZGM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdGF0dXMgIT0gQVBSX0VOT0VOVCAmJiBzdGF0dXMgIT0gQVBSX0VOT1RESVIpIHsKLSAgICAgICAgICAgIGFwX2xvZ19yZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQ1JJVCwgZXJybm8sIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBwY2ZnX29wZW5maWxlOiB1bmFibGUgdG8gY2hlY2sgaHRhY2Nlc3MgZmlsZSwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5zdXJlIGl0IGlzIHJlYWRhYmxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpOwotICAgICAgICAgICAgYXBfdGFibGVfc2V0bihyLT5ub3RlcywgImVycm9yLW5vdGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZlciB1bmFibGUgdG8gcmVhZCBodGFjY2VzcyBmaWxlLCBkZW55aW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImFjY2VzcyB0byBiZSBzYWZlIik7Ci0gICAgICAgICAgICByZXR1cm4gSFRUUF9GT1JCSURERU47Ci0gICAgICAgIH0KLSAgICB9Ci0KLS8qIGNhY2hlIGl0ICovCi0gICAgbmV3ID0gYXBfcGFsbG9jKHItPnBvb2wsIHNpemVvZihzdHJ1Y3QgaHRhY2Nlc3NfcmVzdWx0KSk7Ci0gICAgbmV3LT5kaXIgPSBwYXJtcy5wYXRoOwotICAgIG5ldy0+b3ZlcnJpZGUgPSBvdmVycmlkZTsKLSAgICBuZXctPmh0YWNjZXNzID0gZGM7Ci0vKiBhZGQgdG8gaGVhZCBvZiBsaXN0ICovCi0gICAgbmV3LT5uZXh0ID0gci0+aHRhY2Nlc3M7Ci0gICAgci0+aHRhY2Nlc3MgPSBuZXc7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLQotQ09SRV9FWFBPUlQoY29uc3QgY2hhciAqKSBhcF9pbml0X3ZpcnR1YWxfaG9zdChhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKmhvc3RuYW1lLAotCQkJICAgICAgc2VydmVyX3JlYyAqbWFpbl9zZXJ2ZXIsIHNlcnZlcl9yZWMgKipwcykKLXsKLSAgICBzZXJ2ZXJfcmVjICpzID0gKHNlcnZlcl9yZWMgKikgYXBfcGNhbGxvYyhwLCBzaXplb2Yoc2VydmVyX3JlYykpOwotCi0jaWZkZWYgUkxJTUlUX05PRklMRQotICAgIHN0cnVjdCBybGltaXQgbGltaXRzOwotCi0gICAgZ2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUsICZsaW1pdHMpOwotICAgIGlmIChsaW1pdHMucmxpbV9jdXIgPCBsaW1pdHMucmxpbV9tYXgpIHsKLQlsaW1pdHMucmxpbV9jdXIgKz0gMjsKLQlpZiAoc2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUsICZsaW1pdHMpIDwgMCkgewotCSAgICBwZXJyb3IoInNldHJsaW1pdChSTElNSVRfTk9GSUxFKSIpOwotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgZXhjZWVkIGhhcmQgbGltaXQgZm9yIG9wZW4gZmlsZXMiKTsKLQl9Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvKiBUT0RPOiB0aGlzIGNyYXAgYmVsb25ncyBpbiBodHRwX2NvcmUgKi8KLSAgICBzLT5wcm9jZXNzID0gbWFpbl9zZXJ2ZXItPnByb2Nlc3M7Ci0gICAgcy0+c2VydmVyX2FkbWluID0gTlVMTDsKLSAgICBzLT5zZXJ2ZXJfaG9zdG5hbWUgPSBOVUxMOwotICAgIHMtPmVycm9yX2ZuYW1lID0gTlVMTDsKLSAgICBzLT5zcm1fY29uZm5hbWUgPSBOVUxMOwotICAgIHMtPmFjY2Vzc19jb25mbmFtZSA9IE5VTEw7Ci0gICAgcy0+dGltZW91dCA9IDA7Ci0gICAgcy0+a2VlcF9hbGl2ZV90aW1lb3V0ID0gMDsKLSAgICBzLT5rZWVwX2FsaXZlID0gLTE7Ci0gICAgcy0+a2VlcF9hbGl2ZV9tYXggPSAtMTsKLSAgICBzLT5lcnJvcl9sb2cgPSBtYWluX3NlcnZlci0+ZXJyb3JfbG9nOwotICAgIHMtPmxvZ2xldmVsID0gbWFpbl9zZXJ2ZXItPmxvZ2xldmVsOwotICAgIC8qIHVzZWZ1bCBkZWZhdWx0LCBvdGhlcndpc2Ugd2UgZ2V0IGEgcG9ydCBvZiAwIG9uIHJlZGlyZWN0cyAqLwotICAgIHMtPnBvcnQgPSBtYWluX3NlcnZlci0+cG9ydDsKLSAgICBzLT5uZXh0ID0gTlVMTDsKLQotICAgIHMtPmlzX3ZpcnR1YWwgPSAxOwotICAgIHMtPm5hbWVzID0gYXBfbWFrZV9hcnJheShwLCA0LCBzaXplb2YoY2hhciAqKikpOwotICAgIHMtPndpbGRfbmFtZXMgPSBhcF9tYWtlX2FycmF5KHAsIDQsIHNpemVvZihjaGFyICoqKSk7Ci0KLSAgICBzLT5tb2R1bGVfY29uZmlnID0gY3JlYXRlX2VtcHR5X2NvbmZpZyhwKTsKLSAgICBzLT5sb29rdXBfZGVmYXVsdHMgPSBhcF9jcmVhdGVfcGVyX2Rpcl9jb25maWcocCk7Ci0KLSNpZiAwCi0gICAgcy0+c2VydmVyX3VpZCA9IGFwX3VzZXJfaWQ7Ci0gICAgcy0+c2VydmVyX2dpZCA9IGFwX2dyb3VwX2lkOwotI2VuZGlmCi0KLSAgICBzLT5saW1pdF9yZXFfbGluZSA9IG1haW5fc2VydmVyLT5saW1pdF9yZXFfbGluZTsKLSAgICBzLT5saW1pdF9yZXFfZmllbGRzaXplID0gbWFpbl9zZXJ2ZXItPmxpbWl0X3JlcV9maWVsZHNpemU7Ci0gICAgcy0+bGltaXRfcmVxX2ZpZWxkcyA9IG1haW5fc2VydmVyLT5saW1pdF9yZXFfZmllbGRzOwotCi0gICAgKnBzID0gczsKLQotICAgIHJldHVybiBhcF9wYXJzZV92aG9zdF9hZGRycyhwLCBob3N0bmFtZSwgcyk7Ci19Ci0KLQotc3RhdGljIHZvaWQgZml4dXBfdmlydHVhbF9ob3N0cyhhcF9jb250ZXh0X3QgKnAsIHNlcnZlcl9yZWMgKm1haW5fc2VydmVyKQotewotICAgIHNlcnZlcl9yZWMgKnZpcnQ7Ci0KLSAgICBmb3IgKHZpcnQgPSBtYWluX3NlcnZlci0+bmV4dDsgdmlydDsgdmlydCA9IHZpcnQtPm5leHQpIHsKLQltZXJnZV9zZXJ2ZXJfY29uZmlncyhwLCBtYWluX3NlcnZlci0+bW9kdWxlX2NvbmZpZywKLQkJCSAgICAgdmlydC0+bW9kdWxlX2NvbmZpZyk7Ci0KLQl2aXJ0LT5sb29rdXBfZGVmYXVsdHMgPQotCSAgICBhcF9tZXJnZV9wZXJfZGlyX2NvbmZpZ3MocCwgbWFpbl9zZXJ2ZXItPmxvb2t1cF9kZWZhdWx0cywKLQkJCQkgIHZpcnQtPmxvb2t1cF9kZWZhdWx0cyk7Ci0KLQlpZiAodmlydC0+c2VydmVyX2FkbWluID09IE5VTEwpCi0JICAgIHZpcnQtPnNlcnZlcl9hZG1pbiA9IG1haW5fc2VydmVyLT5zZXJ2ZXJfYWRtaW47Ci0KLQlpZiAodmlydC0+c3JtX2NvbmZuYW1lID09IE5VTEwpCi0JICAgIHZpcnQtPnNybV9jb25mbmFtZSA9IG1haW5fc2VydmVyLT5zcm1fY29uZm5hbWU7Ci0KLQlpZiAodmlydC0+YWNjZXNzX2NvbmZuYW1lID09IE5VTEwpCi0JICAgIHZpcnQtPmFjY2Vzc19jb25mbmFtZSA9IG1haW5fc2VydmVyLT5hY2Nlc3NfY29uZm5hbWU7Ci0KLQlpZiAodmlydC0+dGltZW91dCA9PSAwKQotCSAgICB2aXJ0LT50aW1lb3V0ID0gbWFpbl9zZXJ2ZXItPnRpbWVvdXQ7Ci0KLQlpZiAodmlydC0+a2VlcF9hbGl2ZV90aW1lb3V0ID09IDApCi0JICAgIHZpcnQtPmtlZXBfYWxpdmVfdGltZW91dCA9IG1haW5fc2VydmVyLT5rZWVwX2FsaXZlX3RpbWVvdXQ7Ci0KLQlpZiAodmlydC0+a2VlcF9hbGl2ZSA9PSAtMSkKLQkgICAgdmlydC0+a2VlcF9hbGl2ZSA9IG1haW5fc2VydmVyLT5rZWVwX2FsaXZlOwotCi0JaWYgKHZpcnQtPmtlZXBfYWxpdmVfbWF4ID09IC0xKQotCSAgICB2aXJ0LT5rZWVwX2FsaXZlX21heCA9IG1haW5fc2VydmVyLT5rZWVwX2FsaXZlX21heDsKLQotCS8qIFhYWDogdGhpcyBpcyByZWFsbHkgc29tZXRoaW5nIHRoYXQgc2hvdWxkIGJlIGRlYWx0IHdpdGggYnkgYQotCSAqIHBvc3QtY29uZmlnIGFwaSBwaGFzZSAqLwotCWFwX2NvcmVfcmVvcmRlcl9kaXJlY3RvcmllcyhwLCB2aXJ0KTsKLSAgICB9Ci0gICAgYXBfY29yZV9yZW9yZGVyX2RpcmVjdG9yaWVzKHAsIG1haW5fc2VydmVyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogR2V0dGluZyAqZXZlcnl0aGluZyogY29uZmlndXJlZC4uLiAKLSAqLwotCi1zdGF0aWMgdm9pZCBpbml0X2NvbmZpZ19nbG9iYWxzKGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICAvKiBHbG9iYWwgdmlydHVhbCBob3N0IGhhc2ggYnVja2V0IHBvaW50ZXJzLiAgSW5pdCB0byBudWxsLiAqLwotICAgIGFwX2luaXRfdmhvc3RfY29uZmlnKHApOwotfQotCi1zdGF0aWMgc2VydmVyX3JlYyAqaW5pdF9zZXJ2ZXJfY29uZmlnKHByb2Nlc3NfcmVjICpwcm9jZXNzLCBhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgc2VydmVyX3JlYyAqcyA9IChzZXJ2ZXJfcmVjICopIGFwX3BjYWxsb2MocCwgc2l6ZW9mKHNlcnZlcl9yZWMpKTsKLQotICAgIGFwX29wZW5fc3RkZXJyKCZzLT5lcnJvcl9sb2csIHApOwotICAgIHMtPnByb2Nlc3MgPSBwcm9jZXNzOwotICAgIHMtPnBvcnQgPSAwOwotICAgIHMtPnNlcnZlcl9hZG1pbiA9IERFRkFVTFRfQURNSU47Ci0gICAgcy0+c2VydmVyX2hvc3RuYW1lID0gTlVMTDsKLSAgICBzLT5lcnJvcl9mbmFtZSA9IERFRkFVTFRfRVJST1JMT0c7Ci0gICAgcy0+bG9nbGV2ZWwgPSBERUZBVUxUX0xPR0xFVkVMOwotICAgIHMtPnNybV9jb25mbmFtZSA9IFJFU09VUkNFX0NPTkZJR19GSUxFOwotICAgIHMtPmFjY2Vzc19jb25mbmFtZSA9IEFDQ0VTU19DT05GSUdfRklMRTsKLSAgICBzLT5saW1pdF9yZXFfbGluZSA9IERFRkFVTFRfTElNSVRfUkVRVUVTVF9MSU5FOwotICAgIHMtPmxpbWl0X3JlcV9maWVsZHNpemUgPSBERUZBVUxUX0xJTUlUX1JFUVVFU1RfRklFTERTSVpFOwotICAgIHMtPmxpbWl0X3JlcV9maWVsZHMgPSBERUZBVUxUX0xJTUlUX1JFUVVFU1RfRklFTERTOwotICAgIHMtPnRpbWVvdXQgPSBERUZBVUxUX1RJTUVPVVQ7ICAgICAKLSAgICBzLT5rZWVwX2FsaXZlX3RpbWVvdXQgPSBERUZBVUxUX0tFRVBBTElWRV9USU1FT1VUOwotICAgIHMtPmtlZXBfYWxpdmVfbWF4ID0gREVGQVVMVF9LRUVQQUxJVkU7Ci0gICAgcy0+a2VlcF9hbGl2ZSA9IDE7Ci0gICAgcy0+bmV4dCA9IE5VTEw7Ci0gICAgcy0+YWRkcnMgPSBhcF9wY2FsbG9jKHAsIHNpemVvZihzZXJ2ZXJfYWRkcl9yZWMpKTsKLSAgICAvKiBOT1QgdmlydHVhbCBob3N0OyBkb24ndCBtYXRjaCBhbnkgcmVhbCBuZXR3b3JrIGludGVyZmFjZSAqLwotICAgIHMtPmFkZHJzLT5ob3N0X2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7Ci0gICAgcy0+YWRkcnMtPmhvc3RfcG9ydCA9IDA7CS8qIG1hdGNoZXMgYW55IHBvcnQgKi8KLSAgICBzLT5hZGRycy0+dmlydGhvc3QgPSAiIjsJLyogbXVzdCBiZSBub24tTlVMTCAqLwotICAgIHMtPm5hbWVzID0gcy0+d2lsZF9uYW1lcyA9IE5VTEw7Ci0KLSAgICBzLT5tb2R1bGVfY29uZmlnID0gY3JlYXRlX3NlcnZlcl9jb25maWcocCwgcyk7Ci0gICAgcy0+bG9va3VwX2RlZmF1bHRzID0gY3JlYXRlX2RlZmF1bHRfcGVyX2Rpcl9jb25maWcocCk7Ci0KLSAgICByZXR1cm4gczsKLX0KLQotCi1zZXJ2ZXJfcmVjICphcF9yZWFkX2NvbmZpZyhwcm9jZXNzX3JlYyAqcHJvY2VzcywgYXBfY29udGV4dF90ICpwdGVtcCwgY29uc3QgY2hhciAqY29uZm5hbWUpCi17Ci0gICAgYXBfY29udGV4dF90ICpwID0gcHJvY2Vzcy0+cGNvbmY7Ci0gICAgc2VydmVyX3JlYyAqcyA9IGluaXRfc2VydmVyX2NvbmZpZyhwcm9jZXNzLCBwKTsKLQotICAgIGluaXRfY29uZmlnX2dsb2JhbHMocCk7Ci0KLSAgICAvKiBBbGwgc2VydmVyLXdpZGUgY29uZmlnIGZpbGVzIG5vdyBoYXZlIHRoZSBTQU1FIHN5bnRheC4uLiAqLwotCi0gICAgcHJvY2Vzc19jb21tYW5kX2NvbmZpZyhzLCBhcF9zZXJ2ZXJfcHJlX3JlYWRfY29uZmlnLCBwLCBwdGVtcCk7Ci0KLSAgICBhcF9wcm9jZXNzX3Jlc291cmNlX2NvbmZpZyhzLCBjb25mbmFtZSwgcCwgcHRlbXApOwotICAgIGFwX3Byb2Nlc3NfcmVzb3VyY2VfY29uZmlnKHMsIHMtPnNybV9jb25mbmFtZSwgcCwgcHRlbXApOwotICAgIGFwX3Byb2Nlc3NfcmVzb3VyY2VfY29uZmlnKHMsIHMtPmFjY2Vzc19jb25mbmFtZSwgcCwgcHRlbXApOwotCi0gICAgcHJvY2Vzc19jb21tYW5kX2NvbmZpZyhzLCBhcF9zZXJ2ZXJfcG9zdF9yZWFkX2NvbmZpZywgcCwgcHRlbXApOwotCi0gICAgZml4dXBfdmlydHVhbF9ob3N0cyhwLCBzKTsKLSAgICBhcF9maW5pX3Zob3N0X2NvbmZpZyhwLCBzKTsKLQotICAgIHJldHVybiBzOwotfQotCi12b2lkIGFwX3NpbmdsZV9tb2R1bGVfY29uZmlndXJlKGFwX2NvbnRleHRfdCAqcCwgc2VydmVyX3JlYyAqcywgbW9kdWxlICptKQotewotICAgIGlmIChtLT5jcmVhdGVfc2VydmVyX2NvbmZpZykKLSAgICAgICAgYXBfc2V0X21vZHVsZV9jb25maWcocy0+bW9kdWxlX2NvbmZpZywgbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCptLT5jcmVhdGVfc2VydmVyX2NvbmZpZykocCwgcykpOwotICAgIGlmIChtLT5jcmVhdGVfZGlyX2NvbmZpZykKLSAgICAgICAgYXBfc2V0X21vZHVsZV9jb25maWcocy0+bG9va3VwX2RlZmF1bHRzLCBtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKm0tPmNyZWF0ZV9kaXJfY29uZmlnKShwLCBOVUxMKSk7Ci19Ci0KLXZvaWQgYXBfcG9zdF9jb25maWdfaG9vayhhcF9jb250ZXh0X3QgKnBjb25mLCBhcF9jb250ZXh0X3QgKnBsb2csIGFwX2NvbnRleHRfdCAqcHRlbXAsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgYXBfcnVuX3Bvc3RfY29uZmlnKHBjb25mLHBsb2cscHRlbXAscyk7IAotICAgIGluaXRfaGFuZGxlcnMocGNvbmYpOwotfQotCi12b2lkIGFwX2NoaWxkX2luaXRfaG9vayhhcF9jb250ZXh0X3QgKnBjaGlsZCwgc2VydmVyX3JlYyAqcykKLXsKLSAgICAvKiBUT0RPOiB1aCB0aGlzIHNlZW1zIHVnbHksIGlzIHRoZXJlIGEgYmV0dGVyIHdheT8gKi8KLSAgICAvKmFwX2NoaWxkX2luaXRfYWxsb2MoKTsgICAgUFVUIFRISVMgQkFDSyBJTiBYWFhYWCAqLwotCi0gICAgYXBfcnVuX2NoaWxkX2luaXQocGNoaWxkLHMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcyBhcmUgcmVzdHJpY3RlZCBpbiB0ZXJtcyBvZiB3aGVyZSB0aGV5IG1heQotICogYXBwZWFyIGluIHRoZSBtYWluIGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kL29yIC5odGFjY2VzcyBmaWxlcyBhY2NvcmRpbmcKLSAqIHRvIHRoZSBiaXRtYXNrIHJlcV9vdmVycmlkZSBpbiB0aGUgY29tbWFuZF9yZWMgc3RydWN0dXJlLgotICogSWYgYW55IG9mIHRoZSBvdmVycmlkZXMgc2V0IGluIHJlcV9vdmVycmlkZSBhcmUgYWxzbyBhbGxvd2VkIGluIHRoZQotICogY29udGV4dCBpbiB3aGljaCB0aGUgY29tbWFuZCBpcyByZWFkLCB0aGVuIHRoZSBjb21tYW5kIGlzIGFsbG93ZWQuCi0gKiBUaGUgY29udGV4dCBpcyBkZXRlcm1pbmVkIGFzIGZvbGxvd3M6Ci0gKgotICogICAgaW5zaWRlICouY29uZiAtLT4gb3ZlcnJpZGUgPSAoUlNSQ19DT05GfE9SX0FMTCkmfihPUl9BVVRIQ0ZHfE9SX0xJTUlUKTsKLSAqICAgIHdpdGhpbiA8RGlyZWN0b3J5PiBvciA8TG9jYXRpb24+IC0tPiBvdmVycmlkZSA9IE9SX0FMTHxBQ0NFU1NfQ09ORjsKLSAqICAgIHdpdGhpbiAuaHRhY2Nlc3MgLS0+IG92ZXJyaWRlID0gQWxsb3dPdmVycmlkZSBmb3IgY3VycmVudCBkaXJlY3Rvcnk7Ci0gKgotICogdGhlIHJlc3VsdCBpcywgd2VsbCwgYSByYXRoZXIgY29uZnVzaW5nIHNldCBvZiBwb3NzaWJpbGl0aWVzIGZvciB3aGVuCi0gKiBhIHBhcnRpY3VsYXIgZGlyZWN0aXZlIGlzIGFsbG93ZWQgdG8gYmUgdXNlZC4gIFRoaXMgcHJvY2VkdXJlIHByaW50cwotICogaW4gRW5nbGlzaCB3aGVyZSB0aGUgZ2l2ZW4gKHBjKSBkaXJlY3RpdmUgY2FuIGJlIHVzZWQuCi0gKi8KLXN0YXRpYyB2b2lkIHNob3dfb3ZlcnJpZGVzKGNvbnN0IGNvbW1hbmRfcmVjICpwYywgbW9kdWxlICpwbSkKLXsKLSAgICBpbnQgbiA9IDA7Ci0KLSAgICBwcmludGYoIlx0QWxsb3dlZCBpbiAqLmNvbmYgIik7Ci0gICAgaWYgKChwYy0+cmVxX292ZXJyaWRlICYgKE9SX09QVElPTlMgfCBPUl9GSUxFSU5GTyB8IE9SX0lOREVYRVMpKSB8fAotCSgocGMtPnJlcV9vdmVycmlkZSAmIFJTUkNfQ09ORikgJiYKLQkgKChwYy0+cmVxX292ZXJyaWRlICYgKEFDQ0VTU19DT05GIHwgT1JfQVVUSENGRyB8IE9SX0xJTUlUKSkpKSkKLQlwcmludGYoImFueXdoZXJlIik7Ci0gICAgZWxzZSBpZiAocGMtPnJlcV9vdmVycmlkZSAmIFJTUkNfQ09ORikKLQlwcmludGYoIm9ubHkgb3V0c2lkZSA8RGlyZWN0b3J5PiwgPEZpbGVzPiBvciA8TG9jYXRpb24+Iik7Ci0gICAgZWxzZQotCXByaW50Zigib25seSBpbnNpZGUgPERpcmVjdG9yeT4sIDxGaWxlcz4gb3IgPExvY2F0aW9uPiIpOwotCi0gICAgLyogV2FybiBpZiB0aGUgZGlyZWN0aXZlIGlzIGFsbG93ZWQgaW5zaWRlIDxEaXJlY3Rvcnk+IG9yIC5odGFjY2VzcwotICAgICAqIGJ1dCBtb2R1bGUgZG9lc24ndCBzdXBwb3J0IHBlci1kaXIgY29uZmlndXJhdGlvbiAqLwotCi0gICAgaWYgKChwYy0+cmVxX292ZXJyaWRlICYgKE9SX0FMTCB8IEFDQ0VTU19DT05GKSkgJiYgIXBtLT5jcmVhdGVfZGlyX2NvbmZpZykKLQlwcmludGYoIiBbbm8gcGVyLWRpciBjb25maWddIik7Ci0KLSAgICBpZiAocGMtPnJlcV9vdmVycmlkZSAmIE9SX0FMTCkgewotCXByaW50ZigiIGFuZCBpbiAuaHRhY2Nlc3Ncblx0d2hlbiBBbGxvd092ZXJyaWRlIik7Ci0KLQlpZiAoKHBjLT5yZXFfb3ZlcnJpZGUgJiBPUl9BTEwpID09IE9SX0FMTCkKLQkgICAgcHJpbnRmKCIgaXNuJ3QgTm9uZSIpOwotCWVsc2UgewotCSAgICBwcmludGYoIiBpbmNsdWRlcyAiKTsKLQotCSAgICBpZiAocGMtPnJlcV9vdmVycmlkZSAmIE9SX0FVVEhDRkcpIHsKLQkJaWYgKG4rKykKLQkJICAgIHByaW50ZigiIG9yICIpOwotCQlwcmludGYoIkF1dGhDb25maWciKTsKLQkgICAgfQotCSAgICBpZiAocGMtPnJlcV9vdmVycmlkZSAmIE9SX0xJTUlUKSB7Ci0JCWlmIChuKyspCi0JCSAgICBwcmludGYoIiBvciAiKTsKLQkJcHJpbnRmKCJMaW1pdCIpOwotCSAgICB9Ci0JICAgIGlmIChwYy0+cmVxX292ZXJyaWRlICYgT1JfT1BUSU9OUykgewotCQlpZiAobisrKQotCQkgICAgcHJpbnRmKCIgb3IgIik7Ci0JCXByaW50ZigiT3B0aW9ucyIpOwotCSAgICB9Ci0JICAgIGlmIChwYy0+cmVxX292ZXJyaWRlICYgT1JfRklMRUlORk8pIHsKLQkJaWYgKG4rKykKLQkJICAgIHByaW50ZigiIG9yICIpOwotCQlwcmludGYoIkZpbGVJbmZvIik7Ci0JICAgIH0KLQkgICAgaWYgKHBjLT5yZXFfb3ZlcnJpZGUgJiBPUl9JTkRFWEVTKSB7Ci0JCWlmIChuKyspCi0JCSAgICBwcmludGYoIiBvciAiKTsKLQkJcHJpbnRmKCJJbmRleGVzIik7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIHByaW50ZigiXG4iKTsKLX0KLQotLyogU2hvdyB0aGUgcHJlbG9hZGVkIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcywgdGhlIGhlbHAgc3RyaW5nIGV4cGxhaW5pbmcKLSAqIHRoZSBkaXJlY3RpdmUgYXJndW1lbnRzLCBpbiB3aGF0IG1vZHVsZSB0aGV5IGFyZSBoYW5kbGVkLCBhbmQgaW4KLSAqIHdoYXQgcGFydHMgb2YgdGhlIGNvbmZpZ3VyYXRpb24gdGhleSBhcmUgYWxsb3dlZC4gIFVzZWQgZm9yIGh0dHBkIC1oLgotICovCi12b2lkIGFwX3Nob3dfZGlyZWN0aXZlcygpCi17Ci0gICAgY29uc3QgY29tbWFuZF9yZWMgKnBjOwotICAgIGludCBuOwotCi0gICAgZm9yIChuID0gMDsgYXBfbG9hZGVkX21vZHVsZXNbbl07ICsrbikKLQlmb3IgKHBjID0gYXBfbG9hZGVkX21vZHVsZXNbbl0tPmNtZHM7IHBjICYmIHBjLT5uYW1lOyArK3BjKSB7Ci0JICAgIHByaW50ZigiJXMgKCVzKVxuIiwgcGMtPm5hbWUsIGFwX2xvYWRlZF9tb2R1bGVzW25dLT5uYW1lKTsKLQkgICAgaWYgKHBjLT5lcnJtc2cpCi0JCXByaW50ZigiXHQlc1xuIiwgcGMtPmVycm1zZyk7Ci0JICAgIHNob3dfb3ZlcnJpZGVzKHBjLCBhcF9sb2FkZWRfbW9kdWxlc1tuXSk7Ci0JfQotfQotCi0vKiBTaG93IHRoZSBwcmVsb2FkZWQgbW9kdWxlIG5hbWVzLiAgVXNlZCBmb3IgaHR0cGQgLWwuICovCi12b2lkIGFwX3Nob3dfbW9kdWxlcygpCi17Ci0gICAgaW50IG47Ci0KLSAgICBwcmludGYoIkNvbXBpbGVkIGluIG1vZHVsZXM6XG4iKTsKLSAgICBmb3IgKG4gPSAwOyBhcF9sb2FkZWRfbW9kdWxlc1tuXTsgKytuKQotCXByaW50ZigiICAlc1xuIiwgYXBfbG9hZGVkX21vZHVsZXNbbl0tPm5hbWUpOwotfQotCmRpZmYgLS1naXQgYS9zZXJ2ZXIvY29uZmlnLm00IGIvc2VydmVyL2NvbmZpZy5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMxNDZjZi4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvY29uZmlnLm00CisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotZG5sICMjIENoZWNrIGZvciBsaWJyYXJpZXMKLQotQUNfREVGVU4oQVBBQ0hFX0RFRklORV9IQVZFX0NSWVBULCBbCi1dKQotQUNfQ0hFQ0tfTElCKG5zbCwgZ2V0aG9zdG5hbWUsIFsKLSBBQ19BRERfTElCUkFSWShuc2wpIF0sIFtdKQotCi1BQ19DSEVDS19MSUIoc29ja2V0LCBzb2NrZXQsIFsKLSBBQ19BRERfTElCUkFSWShzb2NrZXQpIF0sIFtdKQotCi1BQ19DSEVDS19MSUIobnNsLCBnZXRob3N0YnlhZGRyLCBbCi0gQUNfQUREX0xJQlJBUlkobnNsKSBdLCBbXSkKLQotQUNfQ0hFQ0tfTElCKGNyeXB0LCBjcnlwdCwgWwotIEFDX0FERF9MSUJSQVJZKGNyeXB0KSAKLSBhcGFjaGVfaGF2ZV9jcnlwdD0xCi1dLCBbCi0gQUNfQ0hFQ0tfTElCKGMsIGNyeXB0LCBbCi0gIGFwYWNoZV9oYXZlX2NyeXB0PTFdLCBbXSkKLV0pCi1pZiB0ZXN0ICIkYXBhY2hlX2hhdmVfY3J5cHQiID0gIjEiIDsgdGhlbgotICAgIEFDX0RFRklORShIQVZFX0NSWVBULCxbRGVmaW5lIGlmIHRoaXMgcGxhdGZvcm0gaGFzIGNyeXB0KCldKQotZmkKLQotZG5sICMjIENoZWNrIGZvciBoZWFkZXIgZmlsZXMKLQotQUNfSEVBREVSX1NUREMKLUFDX0NIRUNLX0hFQURFUlMoCi1ic3RyaW5nLmggXAotY3J5cHQuaCBcCi11bmlzdGQuaCBcCi1zeXMvcmVzb3VyY2UuaCBcCi1zeXMvc2VsZWN0LmggXAotc3lzL3Byb2Nlc3Nvci5oIFwKLSkKLQotZG5sICMjIENoZWNrIGZvciB0eXBlZGVmcywgc3RydWN0dXJlcywgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcy4KLQotQUNfVFlQRV9STElNX1QKLUFDX0NBQ0hFX0NIRUNLKFtmb3IgdG1fZ210b2ZmIGluIHN0cnVjdCB0bV0sIGFjX2N2X3N0cnVjdF90bV9nbXRvZmYsCi1bQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDwkYWNfY3Zfc3RydWN0X3RtPl0sIFtzdHJ1Y3QgdG0gdG07IHRtLnRtX2dtdG9mZjtdLAotICBhY19jdl9zdHJ1Y3RfdG1fZ210b2ZmPXllcywgYWNfY3Zfc3RydWN0X3RtX2dtdG9mZj1ubyldKQotCi1pZiB0ZXN0ICIkYWNfY3Zfc3RydWN0X3RtX2dtdG9mZiIgPSAieWVzIjsgdGhlbgotICAgIEFDX0RFRklORShIQVZFX0dNVE9GRiwsCi0gICAgICAgIFtEZWZpbmUgaWYgc3RydWN0IHRtIGhhcyBhIHRtX2dtdG9mZiBtZW1iZXJdKQotZmkKLQotZG5sICMjIENoZWNrIGZvciBsaWJyYXJ5IGZ1bmN0aW9ucwotCi1BQ19DSEVDS19GVU5DUygKLWRpZmZ0aW1lIFwKLXN5c2xvZyBcCi0pCmRpZmYgLS1naXQgYS9zZXJ2ZXIvY29ubmVjdGlvbi5jIGIvc2VydmVyL2Nvbm5lY3Rpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E5NGQxNC4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvY29ubmVjdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIAotICogYXJlIG1ldDogCi0gKiAKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAgCi0gKiAKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIAotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSAKLSAqICAgIGRpc3RyaWJ1dGlvbi4gCi0gKiAKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyAKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAgCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIiAKLSAqIAotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0byAKLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCAKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLiAKLSAqIAotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIgCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuIAotICogCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nIAotICogICAgYWNrbm93bGVkZ21lbnQ6IAotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cCAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iIAotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkgCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIAotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IgCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgCi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gKiAKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55IAotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkIAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIAotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLiAKLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4gCi0gKiAKLSAqLyAKLSAKLSNkZWZpbmUgQ09SRV9QUklWQVRFCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2Nvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJodHRwX3JlcXVlc3QuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiYXBfbXBtLmgiCi0jaW5jbHVkZSAibXBtX3N0YXR1cy5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF92aG9zdC5oIgotCi1IT09LX1NUUlVDVCgKLQkgICAgSE9PS19MSU5LKHByZV9jb25uZWN0aW9uKQotCSAgICBIT09LX0xJTksocHJvY2Vzc19jb25uZWN0aW9uKQotKQotCi1JTVBMRU1FTlRfSE9PS19WT0lEKHByZV9jb25uZWN0aW9uLChjb25uX3JlYyAqYyksKGMpKQotSU1QTEVNRU5UX0hPT0tfUlVOX0ZJUlNUKGludCxwcm9jZXNzX2Nvbm5lY3Rpb24sKGNvbm5fcmVjICpjKSwoYyksREVDTElORUQpCi0KLS8qIFRPRE86IHJlaW1wbGVtZW50IHRoZSBsaW5nZXJpbmcgY2xvc2Ugc3R1ZmYgKi8KLSNkZWZpbmUgTk9fTElOR0NMT1NFCi0KLS8qCi0gKiBNb3JlIG1hY2hpbmUtZGVwZW5kZW50IG5ldHdvcmtpbmcgZ29vby4uLiBvbiBzb21lIHN5c3RlbXMsCi0gKiB5b3UndmUgZ290IHRvIGJlICpyZWFsbHkqIHN1cmUgdGhhdCBhbGwgdGhlIHBhY2tldHMgYXJlIGFja25vd2xlZGdlZAotICogYmVmb3JlIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24sIHNpbmNlIHRoZSBjbGllbnQgd2lsbCBub3QgYmUgYWJsZQotICogdG8gc2VlIHRoZSBsYXN0IHJlc3BvbnNlIGlmIHRoZWlyIFRDUCBidWZmZXIgaXMgZmx1c2hlZCBieSBhIFJTVAotICogcGFja2V0IGZyb20gdXMsIHdoaWNoIGlzIHdoYXQgdGhlIHNlcnZlcidzIFRDUCBzdGFjayB3aWxsIHNlbmQKLSAqIGlmIGl0IHJlY2VpdmVzIGFueSByZXF1ZXN0IGRhdGEgYWZ0ZXIgY2xvc2luZyB0aGUgY29ubmVjdGlvbi4KLSAqCi0gKiBJbiBhbiBpZGVhbCB3b3JsZCwgdGhpcyBmdW5jdGlvbiB3b3VsZCBiZSBhY2NvbXBsaXNoZWQgYnkgc2ltcGx5Ci0gKiBzZXR0aW5nIHRoZSBzb2NrZXQgb3B0aW9uIFNPX0xJTkdFUiBhbmQgaGFuZGxpbmcgaXQgd2l0aGluIHRoZQotICogc2VydmVyJ3MgVENQIHN0YWNrIHdoaWxlIHRoZSBwcm9jZXNzIGNvbnRpbnVlcyBvbiB0byB0aGUgbmV4dCByZXF1ZXN0LgotICogVW5mb3J0dW5hdGVseSwgaXQgc2VlbXMgdGhhdCBtb3N0IChpZiBub3QgYWxsKSBvcGVyYXRpbmcgc3lzdGVtcwotICogYmxvY2sgdGhlIHNlcnZlciBwcm9jZXNzIG9uIGNsb3NlKCkgd2hlbiBTT19MSU5HRVIgaXMgdXNlZC4KLSAqIEZvciB0aG9zZSB0aGF0IGRvbid0LCBzZWUgVVNFX1NPX0xJTkdFUiBiZWxvdy4gIEZvciB0aGUgcmVzdCwKLSAqIHdlIGhhdmUgY3JlYXRlZCBhIGhvbWUtYnJldyBsaW5nZXJpbmdfY2xvc2UuCi0gKgotICogTWFueSBvcGVyYXRpbmcgc3lzdGVtcyB0ZW5kIHRvIGJsb2NrLCBwdWtlLCBvciBvdGhlcndpc2UgbWlzaGFuZGxlCi0gKiBjYWxscyB0byBzaHV0ZG93biBvbmx5IGhhbGYgb2YgdGhlIGNvbm5lY3Rpb24uICBZb3Ugc2hvdWxkIGRlZmluZQotICogTk9fTElOR0NMT1NFIGluIGFwX2NvbmZpZy5oIGlmIHN1Y2ggaXMgdGhlIGNhc2UgZm9yIHlvdXIgc3lzdGVtLgotICovCi0jaWZuZGVmIE1BWF9TRUNTX1RPX0xJTkdFUgotI2RlZmluZSBNQVhfU0VDU19UT19MSU5HRVIgMzAKLSNlbmRpZgotCi0jaWZkZWYgVVNFX1NPX0xJTkdFUgotI2RlZmluZSBOT19MSU5HQ0xPU0UJCS8qIFRoZSB0d28gbGluZ2VyaW5nIG9wdGlvbnMgYXJlIGV4Y2x1c2l2ZSAqLwotCi1zdGF0aWMgdm9pZCBzb2NrX2VuYWJsZV9saW5nZXIoaW50IHMpIAotewotICAgIHN0cnVjdCBsaW5nZXIgbGk7ICAgICAgICAgICAgICAgICAKLQotICAgIGxpLmxfb25vZmYgPSAxOwotICAgIGxpLmxfbGluZ2VyID0gTUFYX1NFQ1NfVE9fTElOR0VSOwotCi0gICAgaWYgKHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fTElOR0VSLCAKLQkJICAgKGNoYXIgKikgJmxpLCBzaXplb2Yoc3RydWN0IGxpbmdlcikpIDwgMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBzZXJ2ZXJfY29uZiwKLQkgICAgICAgICAgICAic2V0c29ja29wdDogKFNPX0xJTkdFUikiKTsKLQkvKiBub3QgYSBmYXRhbCBlcnJvciAqLwotICAgIH0KLX0KLQotI2Vsc2UKLSNkZWZpbmUgc29ja19lbmFibGVfbGluZ2VyKHMpCS8qIE5PT1AgKi8KLSNlbmRpZiAvKiBVU0VfU09fTElOR0VSICovCi0KLSNpZm5kZWYgTk9fTElOR0NMT1NFCi0KLS8qIFNpbmNlIG1hbnkgY2xpZW50cyB3aWxsIGFib3J0IGEgY29ubmVjdGlvbiBpbnN0ZWFkIG9mIGNsb3NpbmcgaXQsCi0gKiBhdHRlbXB0aW5nIHRvIGxvZyBhbiBlcnJvciBtZXNzYWdlIGZyb20gdGhpcyByb3V0aW5lIHdpbGwgb25seQotICogY29uZnVzZSB0aGUgd2VibWFzdGVyLiAgVGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGFueSBwb3J0YWJsZSB3YXkgdG8KLSAqIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBkcm9wcGVkIGNvbm5lY3Rpb24gYW5kIHNvbWV0aGluZyB0aGF0IG1pZ2h0IGJlCi0gKiB3b3J0aCBsb2dnaW5nLgotICovCi1zdGF0aWMgdm9pZCBsaW5nZXJpbmdfY2xvc2UocmVxdWVzdF9yZWMgKnIpICAgICAKLXsKLSAgLypUT0RPIHJlbW92ZSB0aGUgaGFyZHdpcmVkIDUxMi4gVGhpcyBpcyBhbiBJTyBCdWZmZXIgU2l6ZSAqLwotICAgIGNoYXIgZHVtbXlidWZbNTEyXTsgICAgCi0gICAgc3RydWN0IHBvbGxmZCBwZDsKLSAgICBpbnQgbHNkOwotICAgIGludCBtYXhfd2FpdDsKLQotICAgIC8qIFByZXZlbnQgYSBzbG93LWRyaXAgY2xpZW50IGZyb20gaG9sZGluZyB1cyBoZXJlIGluZGVmaW5pdGVseSAqLwotCi0gICAgbWF4X3dhaXQgPSAzMDsKLSAgICBhcF9ic2V0b3B0KHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQk9fVElNRU9VVCwgJm1heF93YWl0KTsKLQotICAgIC8qIFNlbmQgYW55IGxlZnRvdmVyIGRhdGEgdG8gdGhlIGNsaWVudCwgYnV0IG5ldmVyIHRyeSB0byBhZ2FpbiAqLwotCi0gICAgaWYgKGFwX2JmbHVzaChyLT5jb25uZWN0aW9uLT5jbGllbnQpICE9IEFQUl9TVUNDRVNTKSB7Ci0JYXBfYmNsb3NlKHItPmNvbm5lY3Rpb24tPmNsaWVudCk7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBhcF9ic2V0ZmxhZyhyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJfRU9VVCwgMSk7Ci0KLSAgICAvKiBDbG9zZSBvdXIgaGFsZiBvZiB0aGUgY29ubmVjdGlvbiAtLS0gc2VuZCB0aGUgY2xpZW50IGEgRklOICovCi0KLSAgICBsc2QgPSByLT5jb25uZWN0aW9uLT5jbGllbnQtPmZkOwotCi0gICAgaWYgKChzaHV0ZG93bihsc2QsIDEpICE9IDApICAKLSAgICAgICAgfHwgYXBfaXNfYWJvcnRlZChyLT5jb25uZWN0aW9uKSkgewotCWFwX2JjbG9zZShyLT5jb25uZWN0aW9uLT5jbGllbnQpOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBTZXQgdXAgdG8gd2FpdCBmb3IgcmVhZGFibGUgZGF0YSBvbiBzb2NrZXQuLi4gKi8KLSAgICBwZC5mZCA9IGxzZDsKLSAgICBwZC5ldmVudHMgPSBQT0xMSU47Ci0KLSAgICAvKiBXYWl0IGZvciByZWFkYWJsZSBkYXRhIG9yIGVycm9yIGNvbmRpdGlvbiBvbiBzb2NrZXQ7Ci0gICAgICogc2x1cnAgdXAgYW55IGRhdGEgdGhhdCBhcnJpdmVzLi4uICBXZSBleGl0IHdoZW4gd2UgZ28gZm9yIGFuCi0gICAgICogaW50ZXJ2YWwgb2YgdHYgbGVuZ3RoIHdpdGhvdXQgZ2V0dGluZyBhbnkgbW9yZSBkYXRhLCBnZXQgYW4gZXJyb3IKLSAgICAgKiBmcm9tIHBvbGwoKSwgZ2V0IGFuIGVycm9yIG9yIEVPRiBvbiBhIHJlYWQsIG9yIHRoZSB0aW1lciBleHBpcmVzLgotICAgICAqLwotICAgIC8qIFdlIHVzZSBhIDIgc2Vjb25kIHRpbWVvdXQgYmVjYXVzZSBjdXJyZW50IChGZWIgOTcpIGJyb3dzZXJzCi0gICAgICogZmFpbCB0byBjbG9zZSBhIGNvbm5lY3Rpb24gYWZ0ZXIgdGhlIHNlcnZlciBjbG9zZXMgaXQuICBUaHVzLAotICAgICAqIHRvIGF2b2lkIGtlZXBpbmcgdGhlIGNoaWxkIGJ1c3ksIHdlIGFyZSBvbmx5IGxpbmdlcmluZyBsb25nIGVub3VnaAotICAgICAqIGZvciBhIGNsaWVudCB0aGF0IGlzIGFjdGl2ZWx5IHNlbmRpbmcgZGF0YSBvbiBhIGNvbm5lY3Rpb24uCi0gICAgICogVGhpcyBzaG91bGQgYmUgc3VmZmljaWVudCB1bmxlc3MgdGhlIGNvbm5lY3Rpb24gaXMgbWFzc2l2ZWx5Ci0gICAgICogbG9zaW5nIHBhY2tldHMsIGluIHdoaWNoIGNhc2Ugd2UgbWlnaHQgaGF2ZSBtaXNzZWQgdGhlIFJTVCBhbnl3YXkuCi0gICAgICogVGhlc2UgcGFyYW1ldGVycyBhcmUgcmVzZXQgb24gZWFjaCBwYXNzLCBzaW5jZSB0aGV5IG1pZ2h0IGJlCi0gICAgICogY2hhbmdlZCBieSBwb2xsLgotICAgICAqLwotICAgIGRvIHsKLSAgICAgICAgcGQucmV2ZW50cyA9IDA7Ci0gICAgfSB3aGlsZSAoKHBvbGwoJnBkLCAxLCAyKSA9PSAxKSAgIAotICAgICAgICAgICAgICYmIHJlYWQobHNkLCBkdW1teWJ1Ziwgc2l6ZW9mKGR1bW15YnVmKSkpOwotICAgICAgLyogJiYgKHRpbWUoKSA9IGVwb2NoKSA8IG1heF93YWl0KTsgKi8gICAgCi0KLSAgICAvKiBTaG91bGQgbm93IGhhdmUgc2VlbiBmaW5hbCBhY2suICBTYWZlIHRvIGZpbmFsbHkga2lsbCBzb2NrZXQgKi8KLSAgICBhcF9iY2xvc2Uoci0+Y29ubmVjdGlvbi0+Y2xpZW50KTsKLX0KLSNlbmRpZiAvKiBuZGVmIE5PX0xJTkdDTE9TRSAqLwotCi1DT1JFX0VYUE9SVCh2b2lkKSBhcF9wcm9jZXNzX2Nvbm5lY3Rpb24oY29ubl9yZWMgKmMpCi17Ci0gICAgYXBfdXBkYXRlX3Zob3N0X2dpdmVuX2lwKGMpOwotCi0gICAgYXBfcnVuX3ByZV9jb25uZWN0aW9uKGMpOwotCi0gICAgYXBfcnVuX3Byb2Nlc3NfY29ubmVjdGlvbihjKTsKLQotICAgIC8qCi0gICAgICogQ2xvc2UgdGhlIGNvbm5lY3Rpb24sIGJlaW5nIGNhcmVmdWwgdG8gc2VuZCBvdXQgd2hhdGV2ZXIgaXMgc3RpbGwKLSAgICAgKiBpbiBvdXIgYnVmZmVycy4gIElmIHBvc3NpYmxlLCB0cnkgdG8gYXZvaWQgYSBoYXJkIGNsb3NlIHVudGlsIHRoZQotICAgICAqIGNsaWVudCBoYXMgQUNLZWQgb3VyIEZJTiBhbmQvb3IgaGFzIHN0b3BwZWQgc2VuZGluZyB1cyBkYXRhLgotICAgICAqLwotCi0jaWZkZWYgTk9fTElOR0NMT1NFCi0gICAgYXBfYmNsb3NlKGMtPmNsaWVudCk7CS8qIGp1c3QgY2xvc2UgaXQgKi8KLSNlbHNlCi0gICAgaWYgKHIgJiYgci0+Y29ubmVjdGlvbgotCSYmICFyLT5jb25uZWN0aW9uLT5hYm9ydGVkCi0JJiYgci0+Y29ubmVjdGlvbi0+Y2xpZW50Ci0JJiYgKHItPmNvbm5lY3Rpb24tPmNsaWVudC0+ZmQgPj0gMCkpIHsKLQotCWxpbmdlcmluZ19jbG9zZShyKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JYXBfYnNldGZsYWcoYy0+Y2xpZW50LCBCX0VPVVQsIDEpOwotCWFwX2JjbG9zZShjLT5jbGllbnQpOwotICAgIH0KLSNlbmRpZgotfQotCi1pbnQgYXBfcHJvY2Vzc19odHRwX2Nvbm5lY3Rpb24oY29ubl9yZWMgKmMpCi0gICAgewotICAgIHJlcXVlc3RfcmVjICpyOwotCi0gICAgLyoKLSAgICAgKiBSZWFkIGFuZCBwcm9jZXNzIGVhY2ggcmVxdWVzdCBmb3VuZCBvbiBvdXIgY29ubmVjdGlvbgotICAgICAqIHVudGlsIG5vIHJlcXVlc3RzIGFyZSBsZWZ0IG9yIHdlIGRlY2lkZSB0byBjbG9zZS4KLSAgICAgKi8KLQotICAgIGFwX3VwZGF0ZV9jb25uZWN0aW9uX3N0YXR1cyhjLT5pZCwgIlN0YXR1cyIsICJSZWFkaW5nIik7Ci0gICAgd2hpbGUgKChyID0gYXBfcmVhZF9yZXF1ZXN0KGMpKSAhPSBOVUxMKSB7Ci0KLQkvKiBwcm9jZXNzIHRoZSByZXF1ZXN0IGlmIGl0IHdhcyByZWFkIHdpdGhvdXQgZXJyb3IgKi8KLQotICAgICAgICBhcF91cGRhdGVfY29ubmVjdGlvbl9zdGF0dXMoYy0+aWQsICJTdGF0dXMiLCAiV3JpdGluZyIpOwotCWlmIChyLT5zdGF0dXMgPT0gSFRUUF9PSykKLQkgICAgYXBfcHJvY2Vzc19yZXF1ZXN0KHIpOwotCi0JaWYgKCFjLT5rZWVwYWxpdmUgfHwgYy0+YWJvcnRlZCkKLQkgICAgYnJlYWs7Ci0KLSAgICAgICAgYXBfdXBkYXRlX2Nvbm5lY3Rpb25fc3RhdHVzKGMtPmlkLCAiU3RhdHVzIiwgIktlZXBhbGl2ZSIpOwotCWFwX2Rlc3Ryb3lfcG9vbChyLT5wb29sKTsKLQotCWlmIChhcF9ncmFjZWZ1bF9zdG9wX3NpZ25hbGxlZCgpKSB7Ci0JICAgIC8qIFhYWDogaGV5IHdhaXQsIHRoaXMgc2hvdWxkIGRvIGEgbGluZ2VyaW5nX2Nsb3NlISAqLwotCSAgICBhcF9iY2xvc2UoYy0+Y2xpZW50KTsKLQkgICAgcmV0dXJuIE9LOwotCX0KLSAgICB9Ci0KLSAgICBhcF9yZXNldF9jb25uZWN0aW9uX3N0YXR1cyhjLT5pZCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vKiBDbGVhcmx5IHNvbWUgb2YgdGhpcyBzdHVmZiBkb2Vzbid0IGJlbG9uZyBpbiBhIGdlbmVyYWxpc2VkIGNvbm5lY3Rpb24KLSAgIHN0cnVjdHVyZSwgYnV0IGZvciBub3cuLi4KLSovCi0KLWNvbm5fcmVjICphcF9uZXdfY29ubmVjdGlvbihhcF9jb250ZXh0X3QgKnAsIHNlcnZlcl9yZWMgKnNlcnZlciwgQlVGRiAqaW5vdXQsCi0JCQkgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpyZW1hZGRyLAotCQkJICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqc2FkZHIsIGxvbmcgaWQpCi17Ci0gICAgY29ubl9yZWMgKmNvbm4gPSAoY29ubl9yZWMgKikgYXBfcGNhbGxvYyhwLCBzaXplb2YoY29ubl9yZWMpKTsKLQotICAgIC8qIEdvdCBhIGNvbm5lY3Rpb24gc3RydWN0dXJlLCBzbyBpbml0aWFsaXplIHdoYXQgZmllbGRzIHdlIGNhbgotICAgICAqICh0aGUgcmVzdCBhcmUgemVyb2VkIG91dCBieSBwY2FsbG9jKS4KLSAgICAgKi8KLQotICAgIGNvbm4tPmNvbm5fY29uZmlnPWFwX2NyZWF0ZV9jb25uX2NvbmZpZyhwKTsKLQotICAgIGNvbm4tPnBvb2wgPSBwOwotICAgIGNvbm4tPmxvY2FsX2FkZHIgPSAqc2FkZHI7Ci0gICAgY29ubi0+bG9jYWxfaXAgPSBhcF9wc3RyZHVwKGNvbm4tPnBvb2wsCi0JCQkJaW5ldF9udG9hKGNvbm4tPmxvY2FsX2FkZHIuc2luX2FkZHIpKTsKLSAgICBjb25uLT5iYXNlX3NlcnZlciA9IHNlcnZlcjsKLSAgICBjb25uLT5jbGllbnQgPSBpbm91dDsKLQotICAgIGNvbm4tPnJlbW90ZV9hZGRyID0gKnJlbWFkZHI7Ci0gICAgY29ubi0+cmVtb3RlX2lwID0gYXBfcHN0cmR1cChjb25uLT5wb29sLAotCQkJICAgICAgaW5ldF9udG9hKGNvbm4tPnJlbW90ZV9hZGRyLnNpbl9hZGRyKSk7Ci0gICAgCi0gICAgY29ubi0+aWQgPSBpZDsKLQotICAgIHJldHVybiBjb25uOwotfQotCi0KLQotY29ubl9yZWMgKmFwX25ld19hcHJfY29ubmVjdGlvbihhcF9jb250ZXh0X3QgKnAsIHNlcnZlcl9yZWMgKnNlcnZlciwgQlVGRiAqaW5vdXQsCi0JCQkgICAgY29uc3QgYXBfc29ja2V0X3QgKmNvbm5fc29ja2V0LCBsb25nIGlkKQotewotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2FfbG9jYWwsICpzYV9yZW1vdGU7Ci0KLSAgICBhcF9nZXRfbG9jYWxfbmFtZSgmc2FfbG9jYWwsIGNvbm5fc29ja2V0KTsKLSAgICBhcF9nZXRfcmVtb3RlX25hbWUoJnNhX3JlbW90ZSwgY29ubl9zb2NrZXQpOwotICAgIHJldHVybiBhcF9uZXdfY29ubmVjdGlvbihwLCBzZXJ2ZXIsIGlub3V0LCBzYV9yZW1vdGUsIHNhX2xvY2FsLCBpZCk7Ci19CmRpZmYgLS1naXQgYS9zZXJ2ZXIvZ2VuX3Rlc3RfY2hhci5jIGIvc2VydmVyL2dlbl90ZXN0X2NoYXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI3ZjM4Zi4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvZ2VuX3Rlc3RfY2hhci5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyogd2UgbmVlZCBzb21lIG9mIHRoZSBwb3J0YWJpbGl0eSBkZWZpbml0aW9ucy4uLiBmb3Igc3RyY2hyICovCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cGQuaCIKLQotLyogQSBidW5jaCBvZiBmdW5jdGlvbnMgaW4gdXRpbC5jIHNjYW4gc3RyaW5ncyBsb29raW5nIGZvciBjZXJ0YWluIGNoYXJhY3RlcnMuCi0gKiBUbyBtYWtlIHRoYXQgbW9yZSBlZmZpY2llbnQgd2UgZW5jb2RlIGEgbG9va3VwIHRhYmxlLgotICovCi0jZGVmaW5lIFRfRVNDQVBFX1NIRUxMX0NNRAkoMHgwMSkKLSNkZWZpbmUgVF9FU0NBUEVfUEFUSF9TRUdNRU5UCSgweDAyKQotI2RlZmluZSBUX09TX0VTQ0FQRV9QQVRICSgweDA0KQotI2RlZmluZSBUX0hUVFBfVE9LRU5fU1RPUAkoMHgwOCkKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICB1bnNpZ25lZCBjOwotICAgIHVuc2lnbmVkIGNoYXIgZmxhZ3M7Ci0KLSAgICBwcmludGYoCi0iLyogdGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IGdlbl90ZXN0X2NoYXIsIGRvIG5vdCBlZGl0ICovXG4iCi0iI2RlZmluZSBUX0VTQ0FQRV9TSEVMTF9DTUQJKCV1KVxuIgotIiNkZWZpbmUgVF9FU0NBUEVfUEFUSF9TRUdNRU5UCSgldSlcbiIKLSIjZGVmaW5lIFRfT1NfRVNDQVBFX1BBVEgJKCV1KVxuIgotIiNkZWZpbmUgVF9IVFRQX1RPS0VOX1NUT1AJKCV1KVxuIgotIlxuIgotInN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRlc3RfY2hhcl90YWJsZVsyNTZdID0ge1xuIgotIiAgICAwLCIsCi0JVF9FU0NBUEVfU0hFTExfQ01ELAotCVRfRVNDQVBFX1BBVEhfU0VHTUVOVCwKLQlUX09TX0VTQ0FQRV9QQVRILAotCVRfSFRUUF9UT0tFTl9TVE9QKTsKLQotICAgIC8qIHdlIGV4cGxpY2l0bHkgZGVhbHQgd2l0aCBOVUwgYWJvdmUKLSAgICAgKiBpbiBjYXNlIHNvbWUgc3RyY2hyKCkgZG8gYm9nb3NpdHkgd2l0aCBpdCAqLwotCi0gICAgZm9yIChjID0gMTsgYyA8IDI1NjsgKytjKSB7Ci0JZmxhZ3MgPSAwOwotCWlmIChjICUgMjAgPT0gMCkKLQkgICAgcHJpbnRmKCJcbiAgICAiKTsKLQotCS8qIGVzY2FwZV9zaGVsbF9jbWQgKi8KLQlpZiAoc3RyY2hyKCImO2AnXCJ8Kj9+PD5eKClbXXt9JFxcXG4iLCBjKSkgewotCSAgICBmbGFncyB8PSBUX0VTQ0FQRV9TSEVMTF9DTUQ7Ci0JfQotCi0JaWYgKCFhcF9pc2FsbnVtKGMpICYmICFzdHJjaHIoIiQtXy4rISonKCksOkAmPX4iLCBjKSkgewotCSAgICBmbGFncyB8PSBUX0VTQ0FQRV9QQVRIX1NFR01FTlQ7Ci0JfQotCi0JaWYgKCFhcF9pc2FsbnVtKGMpICYmICFzdHJjaHIoIiQtXy4rISonKCksOkAmPS9+IiwgYykpIHsKLQkgICAgZmxhZ3MgfD0gVF9PU19FU0NBUEVfUEFUSDsKLQl9Ci0KLQkvKiB0aGVzZSBhcmUgdGhlICJ0c3BlY2lhbHMiIGZyb20gUkZDMjA2OCAqLwotCWlmIChhcF9pc2NudHJsKGMpIHx8IHN0cmNocigiIFx0KCk8PkAsOzpcXC9bXT89e30iLCBjKSkgewotCSAgICBmbGFncyB8PSBUX0hUVFBfVE9LRU5fU1RPUDsKLQl9Ci0JcHJpbnRmKCIldSVjIiwgZmxhZ3MsIChjIDwgMjU1KSA/ICcsJyA6ICcgJyk7Ci0KLSAgICB9Ci0gICAgcHJpbnRmKCJcbn07XG4iKTsKLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc2VydmVyL2dlbl90ZXN0X2NoYXIuZHNwIGIvc2VydmVyL2dlbl90ZXN0X2NoYXIuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzBhMTk1Li4wMDAwMDAwCi0tLSBhL3NlcnZlci9nZW5fdGVzdF9jaGFyLmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9Imdlbl90ZXN0X2NoYXIiIC0gUGFja2FnZSBPd25lcj08ND4KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDUuMDAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzCi0KLUNGRz1nZW5fdGVzdF9jaGFyIC0gV2luMzIgRGVidWcKLSFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiZ2VuX3Rlc3RfY2hhci5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgImdlbl90ZXN0X2NoYXIubWFrIiBDRkc9Imdlbl90ZXN0X2NoYXIgLSBXaW4zMiBEZWJ1ZyIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJnZW5fdGVzdF9jaGFyIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFICJnZW5fdGVzdF9jaGFyIC0gV2luMzIgRGVidWciIChiYXNlZCBvblwKLSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJnZW5fdGVzdF9jaGFyIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImdlbl90ZXN0IgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiZ2VuX3Rlc3QiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgT3V0cHV0X0RpciAiIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgImdlbl90ZXN0X2NoYXJfUiIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jCi0jIEFERCBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvSSAiLi5caW5jbHVkZSIgL0kgIi4uXGxpYlxhcHJcaW5jbHVkZSIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiTkRFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLSMgQmVnaW4gU3BlY2lhbCBCdWlsZCBUb29sCi1TT1VSQ0U9JChJbnB1dFBhdGgpCi1Qb3N0QnVpbGRfRGVzYz1DcmVhdGUgdGVzdF9jaGFyLmgKLVBvc3RCdWlsZF9DbWRzPS5cZ2VuX3Rlc3RfY2hhciA+IHRlc3RfY2hhci5oCi0jIEVuZCBTcGVjaWFsIEJ1aWxkIFRvb2wKLQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImdlbl90ZXN0X2NoYXIgLSBXaW4zMiBEZWJ1ZyIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImdlbl90ZXMwIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiZ2VuX3RlczAiCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCi0jIFBST1AgVXNlX01GQyAwCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCi0jIFBST1AgT3V0cHV0X0RpciAiIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgImdlbl90ZXN0X2NoYXJfRCIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uXGluY2x1ZGUiIC9JICIuLlxsaWJcYXByXGluY2x1ZGUiIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJfREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL3BkYnR5cGU6c2VwdAotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0Ci0jIEJlZ2luIFNwZWNpYWwgQnVpbGQgVG9vbAotU09VUkNFPSQoSW5wdXRQYXRoKQotUG9zdEJ1aWxkX0Rlc2M9Q3JlYXRlIHRlc3RfY2hhci5oCi1Qb3N0QnVpbGRfQ21kcz0uXGdlbl90ZXN0X2NoYXIgPiB0ZXN0X2NoYXIuaAotIyBFbmQgU3BlY2lhbCBCdWlsZCBUb29sCi0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJnZW5fdGVzdF9jaGFyIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAiZ2VuX3Rlc3RfY2hhciAtIFdpbjMyIERlYnVnIgotIyBCZWdpbiBHcm91cCAiU291cmNlIEZpbGVzIgotCi0jIFBST1AgRGVmYXVsdF9GaWx0ZXIgIiIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS5cZ2VuX3Rlc3RfY2hhci5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgR3JvdXAKLSMgRW5kIFRhcmdldAotIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvc2VydmVyL2dlbl91cmlfZGVsaW1zLmMgYi9zZXJ2ZXIvZ2VuX3VyaV9kZWxpbXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcxZTk2YS4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvZ2VuX3VyaV9kZWxpbXMuYworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSNpbmNsdWRlIDxzdGRpby5oPgotCi0vKiBnZW5lcmF0ZSBhIGFwX3RhYmxlX3Qgb2YgMjU2IHZhbHVlcywgd2hlcmUgY2VydGFpbiBjaGFyYWN0ZXJzIGFyZQotICogbWFya2VkICJpbnRlcmVzdGluZyIuLi4gZm9yIHRoZSB1cmkgcGFyc2luZyBwcm9jZXNzLgotICovCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gICAgaW50IGk7Ci0gICAgY2hhciAqdmFsdWU7Ci0KLSAgICBwcmludGYoIi8qIHRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSAiCi0JICAgICJnZW5fdXJpX2RlbGltcywgZG8gbm90IGVkaXQgKi9cbiIpOwotICAgIHByaW50Zigic3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdXJpX2RlbGltc1syNTZdID0geyIpOwotICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgewotCWlmIChpICUgMjAgPT0gMCkKLQkgICAgcHJpbnRmKCJcbiAgICAiKTsKLQlzd2l0Y2ggKGkpIHsKLQljYXNlICc6JzogCXZhbHVlID0gIlRfQ09MT04iOwlicmVhazsKLQljYXNlICcvJzogCXZhbHVlID0gIlRfU0xBU0giOwlicmVhazsKLQljYXNlICc/JzogCXZhbHVlID0gIlRfUVVFU1RJT04iOwlicmVhazsKLQljYXNlICcjJzogCXZhbHVlID0gIlRfSEFTSCI7CWJyZWFrOwotCWNhc2UgJ1wwJzogCXZhbHVlID0gIlRfTlVMIjsJYnJlYWs7Ci0JZGVmYXVsdDoJdmFsdWUgPSAiMCI7CQlicmVhazsKLQl9Ci0JcHJpbnRmKCIlcyVjIiwgdmFsdWUsIChpIDwgMjU1KSA/ICcsJyA6ICcgJyk7Ci0gICAgfQotICAgIHByaW50ZigiXG59O1xuIik7Ci0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZlci9nZW5fdXJpX2RlbGltcy5kc3AgYi9zZXJ2ZXIvZ2VuX3VyaV9kZWxpbXMuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjZkZDgzLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9nZW5fdXJpX2RlbGltcy5kc3AKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBQcm9qZWN0IEZpbGUgLSBOYW1lPSJnZW5fdXJpX2RlbGltcyIgLSBQYWNrYWdlIE93bmVyPTw0PgotIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNS4wMAotIyAqKiBETyBOT1QgRURJVCAqKgotCi0jIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIiAweDAxMDMKLQotQ0ZHPWdlbl91cmlfZGVsaW1zIC0gV2luMzIgRGVidWcKLSFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKLSFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiZ2VuX3VyaV9kZWxpbXMubWFrIi4KLSFNRVNTQUdFIAotIU1FU1NBR0UgWW91IGNhbiBzcGVjaWZ5IGEgY29uZmlndXJhdGlvbiB3aGVuIHJ1bm5pbmcgTk1BS0UKLSFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJnZW5fdXJpX2RlbGltcy5tYWsiIENGRz0iZ2VuX3VyaV9kZWxpbXMgLSBXaW4zMiBEZWJ1ZyIKLSFNRVNTQUdFIAotIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6Ci0hTUVTU0FHRSAKLSFNRVNTQUdFICJnZW5fdXJpX2RlbGltcyAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvblwKLSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAiZ2VuX3VyaV9kZWxpbXMgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFIAotCi0jIEJlZ2luIFByb2plY3QKLSMgUFJPUCBTY2NfUHJvak5hbWUgIiIKLSMgUFJPUCBTY2NfTG9jYWxQYXRoICIiCi1DUFA9Y2wuZXhlCi1SU0M9cmMuZXhlCi0KLSFJRiAgIiQoQ0ZHKSIgPT0gImdlbl91cmlfZGVsaW1zIC0gV2luMzIgUmVsZWFzZSIKLQotIyBQUk9QIEJBU0UgVXNlX01GQyAwCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgotIyBQUk9QIFVzZV9NRkMgMAotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIE91dHB1dF9EaXIgIiIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJnZW5fdXJpX2RlbGltc19SIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MKLSMgQUREIEJBU0UgUlNDIC9sIDB4ODA5IC9kICJOREVCVUciCi0jIEFERCBSU0MgL2wgMHg4MDkgL2QgIk5ERUJVRyIKLUJTQzMyPWJzY21ha2UuZXhlCi0jIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KLSMgQUREIEJTQzMyIC9ub2xvZ28KLUxJTkszMj1saW5rLmV4ZQotIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgotIyBBREQgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0jIEJlZ2luIFNwZWNpYWwgQnVpbGQgVG9vbAotU09VUkNFPSQoSW5wdXRQYXRoKQotUG9zdEJ1aWxkX0Rlc2M9Q3JlYXRlIHVyaV9kZWxpbXMuaAotUG9zdEJ1aWxkX0NtZHM9LlxnZW5fdXJpX2RlbGltcyA+IHVyaV9kZWxpbXMuaAotIyBFbmQgU3BlY2lhbCBCdWlsZCBUb29sCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJnZW5fdXJpX2RlbGltcyAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICIiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiZ2VuX3VyaV9kZWxpbXNfRCIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBSU0MgL2wgMHg4MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDgwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0Ci0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLSMgQmVnaW4gU3BlY2lhbCBCdWlsZCBUb29sCi1TT1VSQ0U9JChJbnB1dFBhdGgpCi1Qb3N0QnVpbGRfRGVzYz1DcmVhdGUgdXJpX2RlbGltcy5oCi1Qb3N0QnVpbGRfQ21kcz0uXGdlbl91cmlfZGVsaW1zID4gdXJpX2RlbGltcy5oCi0jIEVuZCBTcGVjaWFsIEJ1aWxkIFRvb2wKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgImdlbl91cmlfZGVsaW1zIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAiZ2VuX3VyaV9kZWxpbXMgLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKLQotIyBQUk9QIERlZmF1bHRfRmlsdGVyICIiCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGdlbl91cmlfZGVsaW1zLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBHcm91cAotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9zZXJ2ZXIvbGlzdGVuLmMgYi9zZXJ2ZXIvbGlzdGVuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OGRkYmUuLjAwMDAwMDAKLS0tIGEvc2VydmVyL2xpc3Rlbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImFwcl9uZXR3b3JrX2lvLmgiCi0KLSNkZWZpbmUgQ09SRV9QUklWQVRFCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgotI2luY2x1ZGUgImFwX2xpc3Rlbi5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLWFwX2xpc3Rlbl9yZWMgKmFwX2xpc3RlbmVyczsKLXN0YXRpYyBhcF9saXN0ZW5fcmVjICpvbGRfbGlzdGVuZXJzOwotc3RhdGljIGludCBhcF9saXN0ZW5iYWNrbG9nOwotc3RhdGljIGludCBzZW5kX2J1ZmZlcl9zaXplOwotCi0vKiBUT0RPOiBtYWtlX3NvY2sgaXMganVzdCBiZWdnaW5nIGFuZCBzY3JlYW1pbmcgZm9yIEFQUiBhYnN0cmFjdGlvbiAqLwotc3RhdGljIGFwX3N0YXR1c190IG1ha2Vfc29jayhhcF9jb250ZXh0X3QgKnAsIGFwX2xpc3Rlbl9yZWMgKnNlcnZlcikKLXsKLSAgICBhcF9zb2NrZXRfdCAqcyA9IHNlcnZlci0+c2Q7Ci0gICAgaW50IG9uZSA9IDE7Ci0gICAgY2hhciBhZGRyWzUxMl07Ci0gICAgYXBfc3RhdHVzX3Qgc3RhdDsKLQotICAgIGFwX2NweXN0cm4oYWRkciwgIltAbWFpbi9saXN0ZW4uYzptYWtlX3NvY2soKTogaW5ldF9udG9hKHNlcnZlci0+c2luX2FkZHIpXSIsIHNpemVvZiBhZGRyKTsKLQotICAgIHN0YXQgPSBhcF9zZXRzb2NrZXRvcHQocywgQVBSX1NPX1JFVVNFQUREUiwgb25lKTsKLSAgICBpZiAoc3RhdCAhPSBBUFJfU1VDQ0VTUyAmJiBzdGF0ICE9IEFQUl9FTk9USU1QTCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19DUklULCBzdGF0LCBOVUxMLAotCQkgICAgIm1ha2Vfc29jazogZm9yICVzLCBzZXRzb2Nrb3B0OiAoU09fUkVVU0VBRERSKSIsIGFkZHIpOwotCWFwX2Nsb3NlX3NvY2tldChzKTsKLQlyZXR1cm4gc3RhdDsKLSAgICB9Ci0gICAgCi0gICAgc3RhdCA9IGFwX3NldHNvY2tldG9wdChzLCBBUFJfU09fS0VFUEFMSVZFLCBvbmUpOwotICAgIGlmIChzdGF0ICE9IEFQUl9TVUNDRVNTICYmIHN0YXQgIT0gQVBSX0VOT1RJTVBMKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0NSSVQsIHN0YXQsIE5VTEwsCi0JCSAgICAibWFrZV9zb2NrOiBmb3IgJXMsIHNldHNvY2tvcHQ6IChTT19LRUVQQUxJVkUpIiwgYWRkcik7Ci0JYXBfY2xvc2Vfc29ja2V0KHMpOwotCXJldHVybiBzdGF0OwotICAgIH0KLQotICAgIC8qCi0gICAgICogVG8gc2VuZCBkYXRhIG92ZXIgaGlnaCBiYW5kd2lkdGgtZGVsYXkgY29ubmVjdGlvbnMgYXQgZnVsbAotICAgICAqIHNwZWVkIHdlIG11c3QgZm9yY2UgdGhlIFRDUCB3aW5kb3cgdG8gb3BlbiB3aWRlIGVub3VnaCB0byBrZWVwIHRoZQotICAgICAqIHBpcGUgZnVsbC4gIFRoZSBkZWZhdWx0IHdpbmRvdyBzaXplIG9uIG1hbnkgc3lzdGVtcwotICAgICAqIGlzIG9ubHkgNGtCLiAgQ3Jvc3MtY291bnRyeSBXQU4gY29ubmVjdGlvbnMgb2YgMTAwbXMKLSAgICAgKiBhdCAxTWIvcyBhcmUgbm90IGltcG9zc2libGUgZm9yIHdlbGwgY29ubmVjdGVkIHNpdGVzLgotICAgICAqIElmIHdlIGFzc3VtZSAxMDBtcyBjcm9zcy1jb3VudHJ5IGxhdGVuY3ksCi0gICAgICogYSA0a0IgYnVmZmVyIGxpbWl0cyB0aHJvdWdocHV0IHRvIDQwa0Ivcy4KLSAgICAgKgotICAgICAqIFRvIGF2b2lkIHRoaXMgcHJvYmxlbSBJJ3ZlIGFkZGVkIHRoZSBTZW5kQnVmZmVyU2l6ZSBkaXJlY3RpdmUKLSAgICAgKiB0byBhbGxvdyB0aGUgd2ViIG1hc3RlciB0byBjb25maWd1cmUgc2VuZCBidWZmZXIgc2l6ZS4KLSAgICAgKgotICAgICAqIFRoZSB0cmFkZS1vZmYgb2YgbGFyZ2VyIGJ1ZmZlcnMgaXMgdGhhdCBtb3JlIGtlcm5lbCBtZW1vcnkKLSAgICAgKiBpcyBjb25zdW1lZC4gIFlNTVYsIGtub3cgeW91ciBjdXN0b21lcnMgYW5kIHlvdXIgbmV0d29yayEKLSAgICAgKgotICAgICAqIC1Kb2huIEhlaWRlbWFubiA8am9obmhAaXNpLmVkdT4gMjUtT2N0LTk2Ci0gICAgICoKLSAgICAgKiBJZiBubyBzaXplIGlzIHNwZWNpZmllZCwgdXNlIHRoZSBrZXJuZWwgZGVmYXVsdC4KLSAgICAgKi8KLSAgICBpZiAoc2VuZF9idWZmZXJfc2l6ZSkgewotCXN0YXQgPSBhcF9zZXRzb2NrZXRvcHQocywgQVBSX1NPX1NOREJVRiwgIHNlbmRfYnVmZmVyX3NpemUpOwotICAgICAgICBpZiAoc3RhdCAhPSBBUFJfU1VDQ0VTUyAmJiBzdGF0ICE9IEFQUl9FTk9USU1QTCkgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIHN0YXQsIE5VTEwsCi0JCQkibWFrZV9zb2NrOiBmYWlsZWQgdG8gc2V0IFNlbmRCdWZmZXJTaXplIGZvciAlcywgIgotCQkJInVzaW5nIGRlZmF1bHQiLCBhZGRyKTsKLQkgICAgLyogbm90IGEgZmF0YWwgZXJyb3IgKi8KLQl9Ci0gICAgfQotCi0gICAgaWYgKChzdGF0ID0gYXBfYmluZChzKSkgIT0gQVBSX1NVQ0NFU1MpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQ1JJVCwgc3RhdCwgTlVMTCwKLQkgICAgIm1ha2Vfc29jazogY291bGQgbm90IGJpbmQgdG8gJXMiLCBhZGRyKTsKLQlhcF9jbG9zZV9zb2NrZXQocyk7Ci0JcmV0dXJuIHN0YXQ7Ci0gICAgfQotCi0gICAgaWYgKChzdGF0ID0gYXBfbGlzdGVuKHMsIGFwX2xpc3RlbmJhY2tsb2cpKSAhPSBBUFJfU1VDQ0VTUykgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHN0YXQsIE5VTEwsCi0JICAgICJtYWtlX3NvY2s6IHVuYWJsZSB0byBsaXN0ZW4gZm9yIGNvbm5lY3Rpb25zIG9uICVzIiwgYWRkcik7Ci0JYXBfY2xvc2Vfc29ja2V0KHMpOwotCXJldHVybiBzdGF0OwotICAgIH0KLQotICAgIHNlcnZlci0+c2QgPSBzOwotICAgIHNlcnZlci0+YWN0aXZlID0gMTsKLSAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIGFwX3N0YXR1c190IGNsb3NlX2xpc3RlbmVyc19vbl9leGVjKHZvaWQgKnYpCi17Ci0gICAgYXBfbGlzdGVuX3JlYyAqbHI7Ci0KLSAgICBmb3IgKGxyID0gYXBfbGlzdGVuZXJzOyBscjsgbHIgPSBsci0+bmV4dCkgewotCWFwX2Nsb3NlX3NvY2tldChsci0+c2QpOwotCWxyLT5hY3RpdmUgPSAwOwotICAgIH0KLSAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci19Ci0KLQotc3RhdGljIHZvaWQgYWxsb2NfbGlzdGVuZXIocHJvY2Vzc19yZWMgKnByb2Nlc3MsIGNoYXIgKmFkZHIsIHVuc2lnbmVkIGludCBwb3J0KQotewotICAgIGFwX2xpc3Rlbl9yZWMgKip3YWxrOwotICAgIGFwX2xpc3Rlbl9yZWMgKm5ldzsKLSAgICBhcF9zdGF0dXNfdCBzdGF0dXM7Ci0gICAgY2hhciAqb2xkYWRkcjsKLSAgICB1bnNpZ25lZCBpbnQgb2xkcG9ydDsKLQotICAgIC8qIHNlZSBpZiB3ZSd2ZSBnb3QgYW4gb2xkIGxpc3RlbmVyIGZvciB0aGlzIGFkZHJlc3M6cG9ydCAqLwotICAgIGZvciAod2FsayA9ICZvbGRfbGlzdGVuZXJzOyAqd2Fsazsgd2FsayA9ICYoKndhbGspLT5uZXh0KSB7Ci0gICAgICAgIGFwX2dldF9sb2NhbF9wb3J0KCZvbGRwb3J0LCAoKndhbGspLT5zZCk7Ci0JYXBfZ2V0X2xvY2FsX2lwYWRkcigmb2xkYWRkciwoKndhbGspLT5zZCk7Ci0JaWYgKCFzdHJjbXAob2xkYWRkciwgYWRkcikgJiYgcG9ydCA9PSBvbGRwb3J0KSB7Ci0JICAgIC8qIHJlLXVzZSBleGlzdGluZyByZWNvcmQgKi8KLQkgICAgbmV3ID0gKndhbGs7Ci0JICAgICp3YWxrID0gbmV3LT5uZXh0OwotCSAgICBuZXctPm5leHQgPSBhcF9saXN0ZW5lcnM7Ci0JICAgIGFwX2xpc3RlbmVycyA9IG5ldzsKLQkgICAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgICAvKiB0aGlzIGhhcyB0byBzdXJ2aXZlIHJlc3RhcnRzICovCi0gICAgbmV3ID0gYXBfcGFsbG9jKHByb2Nlc3MtPnBvb2wsIHNpemVvZihhcF9saXN0ZW5fcmVjKSk7Ci0gICAgbmV3LT5hY3RpdmUgPSAwOwotICAgIGlmICgoc3RhdHVzID0gYXBfY3JlYXRlX3RjcF9zb2NrZXQoJm5ldy0+c2QsIHByb2Nlc3MtPnBvb2wpKSAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQ1JJVCwgc3RhdHVzLCBOVUxMLAotICAgICAgICAgICAgICAgICAibWFrZV9zb2NrOiBmYWlsZWQgdG8gZ2V0IGEgc29ja2V0IGZvciAlcyIsIGFkZHIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGFwX3NldF9sb2NhbF9wb3J0KG5ldy0+c2QsIHBvcnQpOwotICAgIGFwX3NldF9sb2NhbF9pcGFkZHIobmV3LT5zZCwgYWRkcik7Ci0gICAgbmV3LT5uZXh0ID0gYXBfbGlzdGVuZXJzOwotICAgIGFwX2xpc3RlbmVycyA9IG5ldzsKLX0KLQotCi1pbnQgYXBfbGlzdGVuX29wZW4ocHJvY2Vzc19yZWMgKnByb2Nlc3MsIHVuc2lnbmVkIHBvcnQpCi17Ci0gICAgYXBfY29udGV4dF90ICpwY29uZiA9IHByb2Nlc3MtPnBjb25mOwotICAgIGFwX2xpc3Rlbl9yZWMgKmxyOwotICAgIGFwX2xpc3Rlbl9yZWMgKm5leHQ7Ci0gICAgaW50IG51bV9vcGVuOwotCi0gICAgLyogYWxsb2NhdGUgYSBkZWZhdWx0IGxpc3RlbmVyIGlmIG5lY2Vzc2FyeSAqLwotICAgIGlmIChhcF9saXN0ZW5lcnMgPT0gTlVMTCkgewotCWFsbG9jX2xpc3RlbmVyKHByb2Nlc3MsIEFQUl9BTllBRERSLCBwb3J0ID8gcG9ydCA6IERFRkFVTFRfSFRUUF9QT1JUKTsKLSAgICB9Ci0KLSAgICBudW1fb3BlbiA9IDA7Ci0gICAgZm9yIChsciA9IGFwX2xpc3RlbmVyczsgbHI7IGxyID0gbHItPm5leHQpIHsKLQlpZiAobHItPmFjdGl2ZSkgewotCSAgICArK251bV9vcGVuOwotCX0KLQllbHNlIHsKLQkgICAgaWYgKG1ha2Vfc29jayhwY29uZiwgbHIpID09IEFQUl9TVUNDRVNTKSB7Ci0JCSsrbnVtX29wZW47Ci0JCWxyLT5hY3RpdmUgPSAxOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIC8qIGNsb3NlIHRoZSBvbGQgbGlzdGVuZXJzICovCi0gICAgZm9yIChsciA9IG9sZF9saXN0ZW5lcnM7IGxyOyBsciA9IG5leHQpIHsKLQlhcF9jbG9zZV9zb2NrZXQobHItPnNkKTsKLQlsci0+YWN0aXZlID0gMDsKLQluZXh0ID0gbHItPm5leHQ7Ci0vKglmcmVlKGxyKTsqLwotICAgIH0KLSAgICBvbGRfbGlzdGVuZXJzID0gTlVMTDsKLQotICAgIGFwX3JlZ2lzdGVyX2NsZWFudXAocGNvbmYsIE5VTEwsIGFwX251bGxfY2xlYW51cCwgY2xvc2VfbGlzdGVuZXJzX29uX2V4ZWMpOwotCi0gICAgcmV0dXJuIG51bV9vcGVuID8gMCA6IC0xOwotfQotCi0KLXZvaWQgYXBfbGlzdGVuX3ByZV9jb25maWcodm9pZCkKLXsKLSAgICBvbGRfbGlzdGVuZXJzID0gYXBfbGlzdGVuZXJzOwotICAgIGFwX2xpc3RlbmVycyA9IE5VTEw7Ci0gICAgYXBfbGlzdGVuYmFja2xvZyA9IERFRkFVTFRfTElTVEVOQkFDS0xPRzsKLX0KLQotCi1jb25zdCBjaGFyICphcF9zZXRfbGlzdGVuZXIoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICppcHMpCi17Ci0gICAgY2hhciAqcG9ydHM7Ci0gICAgdW5zaWduZWQgc2hvcnQgcG9ydDsKLQotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHBvcnRzID0gc3RyY2hyKGlwcywgJzonKTsKLSAgICBpZiAocG9ydHMgIT0gTlVMTCkgewotCWlmIChwb3J0cyA9PSBpcHMpIHsKLQkgICAgcmV0dXJuICJNaXNzaW5nIElQIGFkZHJlc3MiOwotCX0KLQllbHNlIGlmIChwb3J0c1sxXSA9PSAnXDAnKSB7Ci0JICAgIHJldHVybiAiQWRkcmVzcyBtdXN0IGVuZCBpbiA6PHBvcnQtbnVtYmVyPiI7Ci0JfQotCSoocG9ydHMrKykgPSAnXDAnOwotICAgIH0KLSAgICBlbHNlIHsKLQlwb3J0cyA9IGlwczsKLSAgICB9Ci0KLSAgICBwb3J0ID0gYXRvaShwb3J0cyk7Ci0gICAgaWYgKCFwb3J0KSB7Ci0JcmV0dXJuICJQb3J0IG11c3QgYmUgbnVtZXJpYyI7Ci0gICAgfQotCi0gICAgaWYgKHBvcnRzID09IGlwcykgeyAvKiBubyBhZGRyZXNzICovCi0gICAgICAgIGFsbG9jX2xpc3RlbmVyKGNtZC0+c2VydmVyLT5wcm9jZXNzLCBBUFJfQU5ZQUREUiwgcG9ydCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBpcHNbKHBvcnRzIC0gaXBzKSAtIDFdID0gJ1wwJzsKLQlhbGxvY19saXN0ZW5lcihjbWQtPnNlcnZlci0+cHJvY2VzcywgaXBzLCBwb3J0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotY29uc3QgY2hhciAqYXBfc2V0X2xpc3RlbmJhY2tsb2coY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGludCBiOwotCi0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgYiA9IGF0b2koYXJnKTsKLSAgICBpZiAoYiA8IDEpIHsKLSAgICAgICAgcmV0dXJuICJMaXN0ZW5CYWNrbG9nIG11c3QgYmUgPiAwIjsKLSAgICB9Ci0gICAgYXBfbGlzdGVuYmFja2xvZyA9IGI7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IGNoYXIgKmFwX3NldF9zZW5kX2J1ZmZlcl9zaXplKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGludCBzID0gYXRvaShhcmcpOwotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChzIDwgNTEyICYmIHMgIT0gMCkgewotICAgICAgICByZXR1cm4gIlNlbmRCdWZmZXJTaXplIG11c3QgYmUgPj0gNTEyIGJ5dGVzLCBvciAwIGZvciBzeXN0ZW0gZGVmYXVsdC4iOwotICAgIH0KLSAgICBzZW5kX2J1ZmZlcl9zaXplID0gczsKLSAgICByZXR1cm4gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZlci9sb2cuYyBiL3NlcnZlci9sb2cuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE1YTNkOS4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbG9nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MzIgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogaHR0cF9sb2cuYzogRGVhbGluZyB3aXRoIHRoZSBsb2dzIGFuZCBlcnJvcnMKLSAqIAotICogUm9iIE1jQ29vbAotICogCi0gKi8KLQotCi0jZGVmaW5lIENPUkVfUFJJVkFURQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImFwcl9saWIuaCIKLSNpbmNsdWRlICJhcHJfcG9ydGFibGUuaCIKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX21haW4uaCIKLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi10eXBlZGVmIHN0cnVjdCB7Ci0JY2hhcgkqdF9uYW1lOwotCWludAl0X3ZhbDsKLX0gVFJBTlM7Ci0KLSNpZmRlZiBIQVZFX1NZU0xPRwotCi1zdGF0aWMgY29uc3QgVFJBTlMgZmFjaWxpdGllc1tdID0gewotICAgIHsiYXV0aCIsCUxPR19BVVRIfSwKLSNpZmRlZiBMT0dfQVVUSFBSSVYKLSAgICB7ImF1dGhwcml2IixMT0dfQVVUSFBSSVZ9LAotI2VuZGlmCi0jaWZkZWYgTE9HX0NST04KLSAgICB7ImNyb24iLCAJTE9HX0NST059LAotI2VuZGlmCi0jaWZkZWYgTE9HX0RBRU1PTgotICAgIHsiZGFlbW9uIiwJTE9HX0RBRU1PTn0sCi0jZW5kaWYKLSNpZmRlZiBMT0dfRlRQCi0gICAgeyJmdHAiLAlMT0dfRlRQfSwKLSNlbmRpZgotI2lmZGVmIExPR19LRVJOCi0gICAgeyJrZXJuIiwJTE9HX0tFUk59LAotI2VuZGlmCi0jaWZkZWYgTE9HX0xQUgotICAgIHsibHByIiwJTE9HX0xQUn0sCi0jZW5kaWYKLSNpZmRlZiBMT0dfTUFJTAotICAgIHsibWFpbCIsCUxPR19NQUlMfSwKLSNlbmRpZgotI2lmZGVmIExPR19ORVdTCi0gICAgeyJuZXdzIiwJTE9HX05FV1N9LAotI2VuZGlmCi0jaWZkZWYgTE9HX1NZU0xPRwotICAgIHsic3lzbG9nIiwJTE9HX1NZU0xPR30sCi0jZW5kaWYKLSNpZmRlZiBMT0dfVVNFUgotICAgIHsidXNlciIsCUxPR19VU0VSfSwKLSNlbmRpZgotI2lmZGVmIExPR19VVUNQCi0gICAgeyJ1dWNwIiwJTE9HX1VVQ1B9LAotI2VuZGlmCi0jaWZkZWYgTE9HX0xPQ0FMMAotICAgIHsibG9jYWwwIiwJTE9HX0xPQ0FMMH0sCi0jZW5kaWYKLSNpZmRlZiBMT0dfTE9DQUwxCi0gICAgeyJsb2NhbDEiLAlMT0dfTE9DQUwxfSwKLSNlbmRpZgotI2lmZGVmIExPR19MT0NBTDIKLSAgICB7ImxvY2FsMiIsCUxPR19MT0NBTDJ9LAotI2VuZGlmCi0jaWZkZWYgTE9HX0xPQ0FMMwotICAgIHsibG9jYWwzIiwJTE9HX0xPQ0FMM30sCi0jZW5kaWYKLSNpZmRlZiBMT0dfTE9DQUw0Ci0gICAgeyJsb2NhbDQiLAlMT0dfTE9DQUw0fSwKLSNlbmRpZgotI2lmZGVmIExPR19MT0NBTDUKLSAgICB7ImxvY2FsNSIsCUxPR19MT0NBTDV9LAotI2VuZGlmCi0jaWZkZWYgTE9HX0xPQ0FMNgotICAgIHsibG9jYWw2IiwJTE9HX0xPQ0FMNn0sCi0jZW5kaWYKLSNpZmRlZiBMT0dfTE9DQUw3Ci0gICAgeyJsb2NhbDciLAlMT0dfTE9DQUw3fSwKLSNlbmRpZgotICAgIHtOVUxMLAkJLTF9LAotfTsKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgVFJBTlMgcHJpb3JpdGllc1tdID0gewotICAgIHsiZW1lcmciLAlBUExPR19FTUVSR30sCi0gICAgeyJhbGVydCIsCUFQTE9HX0FMRVJUfSwKLSAgICB7ImNyaXQiLAlBUExPR19DUklUfSwKLSAgICB7ImVycm9yIiwJQVBMT0dfRVJSfSwKLSAgICB7Indhcm4iLAlBUExPR19XQVJOSU5HfSwKLSAgICB7Im5vdGljZSIsCUFQTE9HX05PVElDRX0sCi0gICAgeyJpbmZvIiwJQVBMT0dfSU5GT30sCi0gICAgeyJkZWJ1ZyIsCUFQTE9HX0RFQlVHfSwKLSAgICB7TlVMTCwJLTF9LAotfTsKLQotc3RhdGljIGludCBsb2dfY2hpbGQoYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyICpwcm9nbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIGFwX2ZpbGVfdCAqKmZwaW4pCi17Ci0gICAgLyogQ2hpbGQgcHJvY2VzcyBjb2RlIGZvciAnRXJyb3JMb2cgInwuLi4iJzsKLSAgICAgKiBtYXkgd2FudCBhIGNvbW1vbiBmcmFtZXdvcmsgZm9yIHRoaXMsIHNpbmNlIEkgZXhwZWN0IGl0IHdpbGwKLSAgICAgKiBiZSBjb21tb24gZm9yIG90aGVyIGZvby1sb2dnZXJzIHRvIHdhbnQgdGhpcyBzb3J0IG9mIHRoaW5nLi4uCi0gICAgICovCi0gICAgaW50IHJjID0gLTE7Ci0gICAgYXBfcHJvY2F0dHJfdCAqcHJvY2F0dHI7Ci0gICAgYXBfcHJvY190ICpwcm9jbmV3OwotCi0gICAgYXBfYmxvY2tfYWxhcm1zKCk7Ci0gICAgYXBfY2xlYW51cF9mb3JfZXhlYygpOwotCi0jaWZkZWYgU0lHSFVQCi0gICAgLyogTm8gY29uY2VwdCBvZiBhIGNoaWxkIHByb2Nlc3Mgb24gV2luMzIgKi8KLSAgICBzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKLSNlbmRpZiAvKiBuZGVmIFNJR0hVUCAqLwotCi0gICAgaWYgKChhcF9jcmVhdGVwcm9jYXR0cl9pbml0KCZwcm9jYXR0ciwgcCkgICAgICAgICAgIT0gQVBSX1NVQ0NFU1MpIHx8Ci0gICAgICAgIChhcF9zZXRwcm9jYXR0cl9pbyhwcm9jYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQUl9OT19QSVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBSX0ZVTExfQkxPQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBUFJfTk9fUElQRSkgIT0gQVBSX1NVQ0NFU1MpIHx8Ci0gICAgICAgIChhcF9zZXRwcm9jYXR0cl9kaXIocHJvY2F0dHIsIHByb2duYW1lKSAgICAgICAgIT0gQVBSX1NVQ0NFU1MpKSB7Ci0gICAgICAgIC8qIFNvbWV0aGluZyBiYWQgaGFwcGVuZWQsIGdpdmUgdXAgYW5kIGdvIGF3YXkuICovCi0gICAgICAgIHJjID0gLTE7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByYyA9IGFwX2NyZWF0ZV9wcm9jZXNzKCZwcm9jbmV3LCBwcm9nbmFtZSwgTlVMTCwgTlVMTCwgcHJvY2F0dHIsIHApOwotICAgIAotICAgICAgICBpZiAocmMgPT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIGFwX25vdGVfc3VicHJvY2VzcyhwLCBwcm9jbmV3LCBraWxsX2FmdGVyX3RpbWVvdXQpOwotICAgICAgICAgICAgYXBfZ2V0X2NoaWxkaW4oZnBpbiwgcHJvY25ldyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBhcF91bmJsb2NrX2FsYXJtcygpOwotCi0gICAgcmV0dXJuKHJjKTsKLX0KLQotc3RhdGljIHZvaWQgb3Blbl9lcnJvcl9sb2coc2VydmVyX3JlYyAqcywgYXBfY29udGV4dF90ICpwKQotewotICAgIGNvbnN0IGNoYXIgKmZuYW1lOwotICAgIGludCByYzsKLQotICAgIGlmICgqcy0+ZXJyb3JfZm5hbWUgPT0gJ3wnKSB7Ci0JYXBfZmlsZV90ICpkdW1teSA9IE5VTEw7Ci0KLSAgICAgICAgLyogVGhpcyBzdGFydHMgYSBuZXcgcHJvY2Vzcy4uLiAqLwotICAgICAgICByYyA9IGxvZ19jaGlsZCAocCwgcy0+ZXJyb3JfZm5hbWUrMSwgJmR1bW15KTsKLSAgICAgICAgaWYgKHJjICE9IEFQUl9TVUNDRVNTKSB7Ci0JICAgIHBlcnJvcigiYXBfc3Bhd25fY2hpbGQiKTsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgZm9yayBjaGlsZCBmb3IgRXJyb3JMb2cgcHJvY2VzcyIpOwotCSAgICAgICAgICAgICAgICAgZXhpdCgxKTsKLQl9Ci0KLSAgICAgICAgcy0+ZXJyb3JfbG9nID0gZHVtbXk7Ci0gICAgfQotCi0jaWZkZWYgSEFWRV9TWVNMT0cKLSAgICBlbHNlIGlmICghc3RybmNhc2VjbXAocy0+ZXJyb3JfZm5hbWUsICJzeXNsb2ciLCA2KSkgewotCWlmICgoZm5hbWUgPSBzdHJjaHIocy0+ZXJyb3JfZm5hbWUsICc6JykpKSB7Ci0JICAgIGNvbnN0IFRSQU5TICpmYWM7Ci0KLQkgICAgZm5hbWUrKzsKLQkgICAgZm9yIChmYWMgPSBmYWNpbGl0aWVzOyBmYWMtPnRfbmFtZTsgZmFjKyspIHsKLQkJaWYgKCFzdHJjYXNlY21wKGZuYW1lLCBmYWMtPnRfbmFtZSkpIHsKLQkJICAgIG9wZW5sb2coYXBfc2VydmVyX2FyZ3YwLCBMT0dfTkRFTEFZfExPR19DT05TfExPR19QSUQsCi0JCQkgICAgZmFjLT50X3ZhbCk7Ci0JCSAgICBzLT5lcnJvcl9sb2cgPSBOVUxMOwotCQkgICAgcmV0dXJuOwotCQl9Ci0JICAgIH0KLQl9Ci0JZWxzZQotCSAgICBvcGVubG9nKGFwX3NlcnZlcl9hcmd2MCwgTE9HX05ERUxBWXxMT0dfQ09OU3xMT0dfUElELCBMT0dfTE9DQUw3KTsKLQotCXMtPmVycm9yX2xvZyA9IE5VTEw7Ci0gICAgfQotI2VuZGlmCi0gICAgZWxzZSB7Ci0JZm5hbWUgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShwLCBzLT5lcnJvcl9mbmFtZSk7Ci0JLyogIENoYW5nZSB0byBBUCBmdW5jcy4gKi8KLSAgICAgICAgaWYgKGFwX29wZW4oJnMtPmVycm9yX2xvZywgZm5hbWUsIEFQUl9BUFBFTkQgfCAKLSAgICAgICAgICAgICAgICAgICAgQVBSX1JFQUQgfCBBUFJfV1JJVEUgfCBBUFJfQ1JFQVRFLCBBUFJfT1NfREVGQVVMVCwgcCkgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHBlcnJvcigiZm9wZW4iKTsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBjb3VsZCBub3Qgb3BlbiBlcnJvciBsb2cgZmlsZSAlcy4iLAotCQkgICAgICAgICBhcF9zZXJ2ZXJfYXJndjAsIGZuYW1lKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0JfQotICAgIH0KLX0KLQotdm9pZCBhcF9vcGVuX2xvZ3Moc2VydmVyX3JlYyAqc19tYWluLCBhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgc2VydmVyX3JlYyAqdmlydCwgKnE7Ci0gICAgaW50IHJlcGxhY2Vfc3RkZXJyOwotICAgIGFwX2ZpbGVfdCAqZXJyZmlsZSA9IE5VTEw7Ci0KLSAgICBvcGVuX2Vycm9yX2xvZyhzX21haW4sIHApOwotCi0gICAgcmVwbGFjZV9zdGRlcnIgPSAxOwotICAgIGlmIChzX21haW4tPmVycm9yX2xvZykgewotCS8qIHJlcGxhY2Ugc3RkZXJyIHdpdGggdGhpcyBuZXcgbG9nICovCi0JZmZsdXNoKHN0ZGVycik7Ci0gICAgICAgIGFwX29wZW5fc3RkZXJyKCZlcnJmaWxlLCBwKTsgICAgICAgIAotCWlmIChhcF9kdXBmaWxlKCZlcnJmaWxlLCBzX21haW4tPmVycm9yX2xvZykgIT0gQVBSX1NVQ0NFU1MpIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0NSSVQsIGVycm5vLCBzX21haW4sCi0JCSJ1bmFibGUgdG8gcmVwbGFjZSBzdGRlcnIgd2l0aCBlcnJvcl9sb2ciKTsKLQl9IGVsc2UgewotCSAgICByZXBsYWNlX3N0ZGVyciA9IDA7Ci0JfQotICAgIH0KLSAgICAvKiBub3RlIHRoYXQgc3RkZXJyIG1heSBzdGlsbCBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggc29tZXRoaW5nCi0gICAgICogYmVjYXVzZSBpdCBwb2ludHMgdG8gdGhlIG9sZCBlcnJvciBsb2csIG9yIGJhY2sgdG8gdGhlIHR0eQotICAgICAqIG9mIHRoZSBzdWJtaXR0ZXIuCi0gICAgICovCi0gICAgaWYgKHJlcGxhY2Vfc3RkZXJyICYmIGZyZW9wZW4oIi9kZXYvbnVsbCIsICJ3Iiwgc3RkZXJyKSA9PSBOVUxMKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0NSSVQsIGVycm5vLCBzX21haW4sCi0JICAgICJ1bmFibGUgdG8gcmVwbGFjZSBzdGRlcnIgd2l0aCAvZGV2L251bGwiKTsKLSAgICB9Ci0KLSAgICBmb3IgKHZpcnQgPSBzX21haW4tPm5leHQ7IHZpcnQ7IHZpcnQgPSB2aXJ0LT5uZXh0KSB7Ci0JaWYgKHZpcnQtPmVycm9yX2ZuYW1lKSB7Ci0JICAgIGZvciAocT1zX21haW47IHEgIT0gdmlydDsgcSA9IHEtPm5leHQpCi0JCWlmIChxLT5lcnJvcl9mbmFtZSAhPSBOVUxMICYmCi0JCSAgICBzdHJjbXAocS0+ZXJyb3JfZm5hbWUsIHZpcnQtPmVycm9yX2ZuYW1lKSA9PSAwKQotCQkgICAgYnJlYWs7Ci0JICAgIGlmIChxID09IHZpcnQpCi0JCW9wZW5fZXJyb3JfbG9nKHZpcnQsIHApOwotCSAgICBlbHNlIAotCQl2aXJ0LT5lcnJvcl9sb2cgPSBxLT5lcnJvcl9sb2c7Ci0JfQotCWVsc2UKLQkgICAgdmlydC0+ZXJyb3JfbG9nID0gc19tYWluLT5lcnJvcl9sb2c7Ci0gICAgfQotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX2Vycm9yX2xvZzJzdGRlcnIoc2VydmVyX3JlYyAqcykgewotICAgIGFwX2ZpbGVfdCAqZXJyZmlsZSA9IE5VTEw7Ci0KLSAgICBhcF9vcGVuX3N0ZGVycigmZXJyZmlsZSwgcy0+cHJvY2Vzcy0+cG9vbCk7ICAgICAgICAKLSAgICBpZiAoICAgcy0+ZXJyb3JfbG9nICE9IE5VTEwpIHsKLSAgICAgICAgYXBfZHVwZmlsZSgmKHMtPmVycm9yX2xvZyksIGVycmZpbGUpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgbG9nX2Vycm9yX2NvcmUoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGludCBsZXZlbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9zdGF0dXNfdCBzdGF0dXMsIGNvbnN0IHNlcnZlcl9yZWMgKnMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdF9yZWMgKnIsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQotewotICAgIGNoYXIgZXJyc3RyW01BWF9TVFJJTkdfTEVOICsgMV07ICAgIC8qICsgMSB0byBoYXZlIHJvb20gZm9yICdcbicgKi8KLSAgICBzaXplX3QgbGVuOwotICAgIGFwX2ZpbGVfdCAqbG9nZiA9IE5VTEw7Ci0KLSAgICBpZiAocyA9PSBOVUxMKSB7Ci0JLyoKLQkgKiBJZiB3ZSBhcmUgZG9pbmcgc3RkZXJyIGxvZ2dpbmcgKHN0YXJ0dXApLCBkb24ndCBsb2cgbWVzc2FnZXMgdGhhdCBhcmUKLQkgKiBhYm92ZSB0aGUgZGVmYXVsdCBzZXJ2ZXIgbG9nIGxldmVsIHVubGVzcyBpdCBpcyBhIHN0YXJ0dXAvc2h1dGRvd24KLQkgKiBub3RpY2UKLQkgKi8KLQlpZiAoKChsZXZlbCAmIEFQTE9HX0xFVkVMTUFTSykgIT0gQVBMT0dfTk9USUNFKSAmJgotCSAgICAoKGxldmVsICYgQVBMT0dfTEVWRUxNQVNLKSA+IERFRkFVTFRfTE9HTEVWRUwpKQotCSAgICByZXR1cm47Ci0JYXBfb3Blbl9zdGRlcnIoJmxvZ2YsIE5VTEwpOwotICAgIH0KLSAgICBlbHNlIGlmIChzLT5lcnJvcl9sb2cpIHsKLQkvKgotCSAqIElmIHdlIGFyZSBkb2luZyBub3JtYWwgbG9nZ2luZywgZG9uJ3QgbG9nIG1lc3NhZ2VzIHRoYXQgYXJlCi0JICogYWJvdmUgdGhlIHNlcnZlciBsb2cgbGV2ZWwgdW5sZXNzIGl0IGlzIGEgc3RhcnR1cC9zaHV0ZG93biBub3RpY2UKLQkgKi8KLQlpZiAoKChsZXZlbCAmIEFQTE9HX0xFVkVMTUFTSykgIT0gQVBMT0dfTk9USUNFKSAmJiAKLQkgICAgKChsZXZlbCAmIEFQTE9HX0xFVkVMTUFTSykgPiBzLT5sb2dsZXZlbCkpCi0JICAgIHJldHVybjsKLQlsb2dmID0gcy0+ZXJyb3JfbG9nOwotICAgIH0KLSNpZmRlZiBUUEYKLSAgICBlbHNlIGlmICh0cGZfY2hpbGQpIHsKLSAgICAvKgotICAgICAqIElmIHdlIGFyZSBkb2luZyBub3JtYWwgbG9nZ2luZywgZG9uJ3QgbG9nIG1lc3NhZ2VzIHRoYXQgYXJlCi0gICAgICogYWJvdmUgdGhlIHNlcnZlciBsb2cgbGV2ZWwgdW5sZXNzIGl0IGlzIGEgc3RhcnR1cC9zaHV0ZG93biBub3RpY2UKLSAgICAgKi8KLSAgICBpZiAoKChsZXZlbCAmIEFQTE9HX0xFVkVMTUFTSykgIT0gQVBMT0dfTk9USUNFKSAmJgotICAgICAgICAoKGxldmVsICYgQVBMT0dfTEVWRUxNQVNLKSA+IHMtPmxvZ2xldmVsKSkKLSAgICAgICAgcmV0dXJuOwotICAgIGxvZ2YgPSBzdGRlcnI7Ci0gICAgfQotI2VuZGlmIC8qIFRQRiAqLwotICAgIGVsc2UgewotCS8qCi0JICogSWYgd2UgYXJlIGRvaW5nIHN5c2xvZyBsb2dnaW5nLCBkb24ndCBsb2cgbWVzc2FnZXMgdGhhdCBhcmUKLQkgKiBhYm92ZSB0aGUgc2VydmVyIGxvZyBsZXZlbCAoaW5jbHVkaW5nIGEgc3RhcnR1cC9zaHV0ZG93biBub3RpY2UpCi0JICovCi0JaWYgKChsZXZlbCAmIEFQTE9HX0xFVkVMTUFTSykgPiBzLT5sb2dsZXZlbCkKLQkgICAgcmV0dXJuOwotCWxvZ2YgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChsb2dmICYmICgobGV2ZWwgJiBBUExPR19TVEFSVFVQKSAhPSBBUExPR19TVEFSVFVQKSkgewotCWVycnN0clswXSA9ICdbJzsKLQlhcF9jdGltZShlcnJzdHIgKyAxLCBhcF9ub3coKSk7Ci0JZXJyc3RyWzEgKyBBUF9DVElNRV9MRU4gLSAxXSA9ICddJzsKLQllcnJzdHJbMSArIEFQX0NUSU1FX0xFTiAgICBdID0gJyAnOwotCWxlbiA9IDEgKyBBUF9DVElNRV9MRU4gKyAxOwotICAgIH0gZWxzZSB7Ci0JbGVuID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoKGxldmVsICYgQVBMT0dfU1RBUlRVUCkgIT0gQVBMT0dfU1RBUlRVUCkgewotICAgICAgICBsZW4gKz0gYXBfc25wcmludGYoZXJyc3RyICsgbGVuLCBNQVhfU1RSSU5HX0xFTiAtIGxlbiwKLQkgICAgICAgICJbJXNdICIsIHByaW9yaXRpZXNbbGV2ZWwgJiBBUExPR19MRVZFTE1BU0tdLnRfbmFtZSk7Ci0gICAgfQotI2lmbmRlZiBUUEYKLSAgICBpZiAoZmlsZSAmJiAobGV2ZWwgJiBBUExPR19MRVZFTE1BU0spID09IEFQTE9HX0RFQlVHKSB7Ci0jaWZkZWYgX09TRF9QT1NJWAotCWNoYXIgdG1wWzI1Nl07Ci0JY2hhciAqZSA9IHN0cnJjaHIoZmlsZSwgJy8nKTsKLQotCS8qIEluIE9TRC9QT1NJWCwgdGhlIGNvbXBpbGVyIHJldHVybnMgZm9yIF9fRklMRV9fCi0JICogYSBzdHJpbmcgbGlrZTogX19GSUxFX189IipQT1NJWCgvdXNyL2luY2x1ZGUvc3RkaW8uaCkiCi0JICogKGl0IGV2ZW4gcmV0dXJucyBhbiBhYnNvbHV0ZSBwYXRoIGZvciBzb3VyY2VzIGluCi0JICogdGhlIGN1cnJlbnQgZGlyZWN0b3J5KS4gSGVyZSB3ZSB0cnkgdG8gc3RyaXAgdGhpcwotCSAqIGRvd24gdG8gdGhlIGJhc2VuYW1lLgotCSAqLwotCWlmIChlICE9IE5VTEwgJiYgZVsxXSAhPSAnXDAnKSB7Ci0JICAgIGFwX3NucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICIlcyIsICZlWzFdKTsKLQkgICAgZSA9ICZ0bXBbc3RybGVuKHRtcCktMV07Ci0JICAgIGlmICgqZSA9PSAnKScpCi0JCSplID0gJ1wwJzsKLQkgICAgZmlsZSA9IHRtcDsKLQl9Ci0jZW5kaWYgLypfT1NEX1BPU0lYKi8KLQlsZW4gKz0gYXBfc25wcmludGYoZXJyc3RyICsgbGVuLCBNQVhfU1RSSU5HX0xFTiAtIGxlbiwKLQkJIiVzKCVkKTogIiwgZmlsZSwgbGluZSk7Ci0gICAgfQotI2VuZGlmIC8qIFRQRiAqLwotICAgIGlmIChyICYmIHItPmNvbm5lY3Rpb24pIHsKLQkvKiBYWFg6IFRPRE86IGFkZCBhIG1ldGhvZCBvZiBzZWxlY3Rpbmcgd2hldGhlciBsb2dnZWQgY2xpZW50Ci0JICogYWRkcmVzc2VzIGFyZSBpbiBkb3R0ZWQgcXVhZCBvciByZXNvbHZlZCBmb3JtLi4uIGRvdHRlZAotCSAqIHF1YWQgaXMgdGhlIG1vc3Qgc2VjdXJlLCB3aGljaCBpcyB3aHkgSSdtIGltcGxlbWVudGluZyBpdAotCSAqIGZpcnN0LiAtZGpnCi0JICovCi0JbGVuICs9IGFwX3NucHJpbnRmKGVycnN0ciArIGxlbiwgTUFYX1NUUklOR19MRU4gLSBsZW4sCi0JCSJbY2xpZW50ICVzXSAiLCByLT5jb25uZWN0aW9uLT5yZW1vdGVfaXApOwotICAgIH0KLSAgICAvKiBYWFggLSBuZWVkIGFuIEFQUml6ZWQgc3RyZXJyb3IoKSAqLwotICAgIGlmICghKGxldmVsICYgQVBMT0dfTk9FUlJOTykKLQkmJiAoc3RhdHVzICE9IDApKSB7Ci0JbGVuICs9IGFwX3NucHJpbnRmKGVycnN0ciArIGxlbiwgTUFYX1NUUklOR19MRU4gLSBsZW4sCi0JCSIoJWQpJXM6ICIsIHN0YXR1cywgc3RyZXJyb3Ioc3RhdHVzKSk7Ci0gICAgfQotCi0gICAgbGVuICs9IGFwX3ZzbnByaW50ZihlcnJzdHIgKyBsZW4sIE1BWF9TVFJJTkdfTEVOIC0gbGVuLCBmbXQsIGFyZ3MpOwotCi0gICAgLyogTlVMTCBpZiB3ZSBhcmUgbG9nZ2luZyB0byBzeXNsb2cgKi8KLSAgICBpZiAobG9nZikgewotICAgICAgICAvKiBXZSBrbm93IHRoYXQgd2UgaGF2ZSBvbmUgbW9yZSBjaGFyYWN0ZXIgb2Ygc3BhY2UgYXZhaWxhYmxlIGJlY2F1c2UKLSAgICAgICAgICogdGhlIGFycmF5IGlzIHNpemVkIHRoYXQgd2F5ICovCi0gICAgICAgIC8qIGFwX2Fzc2VydChsZW4gPCBNQVhfU1RSSU5HX0xFTikgKi8KLSAgICAgICAgZXJyc3RyW2xlbisrXSA9ICdcbic7Ci0gICAgICAgIGVycnN0cltsZW5dID0gJ1wwJzsKLQlhcF9wdXRzKGVycnN0ciwgbG9nZik7Ci0JYXBfZmx1c2gobG9nZik7Ci0gICAgfQotI2lmZGVmIEhBVkVfU1lTTE9HCi0gICAgZWxzZSB7Ci0Jc3lzbG9nKGxldmVsICYgQVBMT0dfTEVWRUxNQVNLLCAiJXMiLCBlcnJzdHIpOwotICAgIH0KLSNlbmRpZgotfQotICAgIAotQVBJX0VYUE9SVCh2b2lkKSBhcF9sb2dfZXJyb3IoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGludCBsZXZlbCwKLQkJCSAgICAgIGFwX3N0YXR1c190IHN0YXR1cywgY29uc3Qgc2VydmVyX3JlYyAqcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgICB2YV9saXN0IGFyZ3M7Ci0KLSAgICB2YV9zdGFydChhcmdzLCBmbXQpOwotICAgIGxvZ19lcnJvcl9jb3JlKGZpbGUsIGxpbmUsIGxldmVsLCBzdGF0dXMsIHMsIE5VTEwsIGZtdCwgYXJncyk7Ci0gICAgdmFfZW5kKGFyZ3MpOwotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX2xvZ19yZXJyb3IoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGludCBsZXZlbCwKLQkJCSAgICAgICBhcF9zdGF0dXNfdCBzdGF0dXMsIGNvbnN0IHJlcXVlc3RfcmVjICpyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLSAgICB2YV9saXN0IGFyZ3M7Ci0KLSAgICB2YV9zdGFydChhcmdzLCBmbXQpOwotICAgIGxvZ19lcnJvcl9jb3JlKGZpbGUsIGxpbmUsIGxldmVsLCBzdGF0dXMsIHItPnNlcnZlciwgciwgZm10LCBhcmdzKTsKLSAgICAvKgotICAgICAqIElGIHRoZSBlcnJvciBsZXZlbCBpcyAnd2FybmluZycgb3IgbW9yZSBzZXZlcmUsCi0gICAgICogQU5EIHRoZXJlIGlzbid0IGFscmVhZHkgZXJyb3IgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXF1ZXN0LAotICAgICAqIFRIRU4gbWFrZSB0aGUgbWVzc2FnZSB0ZXh0IGF2YWlsYWJsZSB0byBFcnJvckRvY3VtZW50IGFuZAotICAgICAqIG90aGVyIGVycm9yIHByb2Nlc3NvcnMuICBUaGlzIGNhbiBiZSBkaXNhYmxlZCBieSBzdHVmZmluZwotICAgICAqIHNvbWV0aGluZywgZXZlbiBhbiBlbXB0eSBzdHJpbmcsIGludG8gdGhlICJlcnJvci1ub3RlcyIgY2VsbAotICAgICAqIGJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZS4KLSAgICAgKi8KLSAgICB2YV9lbmQoYXJncyk7Ci0gICAgdmFfc3RhcnQoYXJncyxmbXQpOyAKLSAgICBpZiAoKChsZXZlbCAmIEFQTE9HX0xFVkVMTUFTSykgPD0gQVBMT0dfV0FSTklORykKLQkmJiAoYXBfdGFibGVfZ2V0KHItPm5vdGVzLCAiZXJyb3Itbm90ZXMiKSA9PSBOVUxMKSkgewotCWFwX3RhYmxlX3NldG4oci0+bm90ZXMsICJlcnJvci1ub3RlcyIsCi0JCSAgICAgIGFwX3B2c3ByaW50ZihyLT5wb29sLCBmbXQsIGFyZ3MpKTsKLSAgICB9Ci0gICAgdmFfZW5kKGFyZ3MpOwotfQotCi12b2lkIGFwX2xvZ19waWQoYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyICpmbmFtZSkKLXsKLSAgICBhcF9maWxlX3QgKnBpZF9maWxlID0gTlVMTDsKLSAgICBhcF9maW5mb190IGZpbmZvOwotICAgIHN0YXRpYyBwaWRfdCBzYXZlZF9waWQgPSAtMTsKLSAgICBwaWRfdCBteXBpZDsKLQotICAgIGlmICghZm5hbWUpIAotCXJldHVybjsKLQotICAgIGZuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocCwgZm5hbWUpOwotICAgIG15cGlkID0gZ2V0cGlkKCk7Ci0gICAgaWYgKG15cGlkICE9IHNhdmVkX3BpZCAmJiBhcF9zdGF0KCZmaW5mbywgZm5hbWUsIHApID09IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAvKiBXSU5DSCBhbmQgSFVQIGNhbGwgdGhpcyBvbiBlYWNoIHJlc3RhcnQuCi0gICAgICAgKiBPbmx5IHdhcm4gb24gZmlyc3QgdGltZSB0aHJvdWdoIGZvciB0aGlzIHBpZC4KLSAgICAgICAqCi0gICAgICAgKiBYWFg6IENvdWxkIGp1c3Qgd3JpdGUgZmlyc3QgdGltZSB0aHJvdWdoIHRvbywgYWx0aG91Z2gKLSAgICAgICAqICAgICAgdGhhdCBtYXkgc2NyZXcgdXAgc2NyaXB0cyB3cml0dGVuIHRvIGRvIHNvbWV0aGluZwotICAgICAgICogICAgICBiYXNlZCBvbiB0aGUgbGFzdCBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgcGlkIGZpbGUuCi0gICAgICAgKi8KLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfV0FSTklORywgMCwgTlVMTCwKLQkJICAgICBhcF9wc3ByaW50ZihwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBpZCBmaWxlICVzIG92ZXJ3cml0dGVuIC0tIFVuY2xlYW4gc2h1dGRvd24gb2YgcHJldmlvdXMgQXBhY2hlIHJ1bj8iLAotICAgICAgICAgICAgICAgICAgICAgZm5hbWUpCi0JCQkgICAgICAgKTsKLSAgICB9Ci0KLSAgICBpZihhcF9vcGVuKCZwaWRfZmlsZSwgZm5hbWUsIEFQUl9XUklURSB8IEFQUl9DUkVBVEUsIEFQUl9PU19ERUZBVUxULCBwKSAhPSBBUFJfU1VDQ0VTUykgewotCXBlcnJvcigiZm9wZW4iKTsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICIlczogY291bGQgbm90IGxvZyBwaWQgdG8gZmlsZSAlcyIsCi0JCSAgICAgYXBfc2VydmVyX2FyZ3YwLCBmbmFtZSk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIGFwX2ZwcmludGYocGlkX2ZpbGUsICIlbGRcbiIsIChsb25nKW15cGlkKTsKLSAgICBhcF9jbG9zZShwaWRfZmlsZSk7Ci0gICAgc2F2ZWRfcGlkID0gbXlwaWQ7Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfbG9nX2Vycm9yX29sZChjb25zdCBjaGFyICplcnIsIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHMsICIlcyIsIGVycik7Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfbG9nX3VuaXhlcnIoY29uc3QgY2hhciAqcm91dGluZSwgY29uc3QgY2hhciAqZmlsZSwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKm1zZywgc2VydmVyX3JlYyAqcykKLXsKLSAgICBhcF9sb2dfZXJyb3IoZmlsZSwgMCwgQVBMT0dfRVJSLCBlcnJubywgcywgIiVzIiwgbXNnKTsKLX0KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9sb2dfcHJpbnRmKGNvbnN0IHNlcnZlcl9yZWMgKnMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotICAgIHZhX2xpc3QgYXJnczsKLSAgICAKLSAgICB2YV9zdGFydChhcmdzLCBmbXQpOwotICAgIGxvZ19lcnJvcl9jb3JlKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHMsIE5VTEwsIGZtdCwgYXJncyk7Ci0gICAgdmFfZW5kKGFyZ3MpOwotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX2xvZ19yZWFzb24oY29uc3QgY2hhciAqcmVhc29uLCBjb25zdCBjaGFyICpmaWxlLCByZXF1ZXN0X3JlYyAqcikgCi17Ci0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHItPnNlcnZlciwKLQkJImFjY2VzcyB0byAlcyBmYWlsZWQgZm9yICVzLCByZWFzb246ICVzIiwKLQkJZmlsZSwKLQkJYXBfZ2V0X3JlbW90ZV9ob3N0KHItPmNvbm5lY3Rpb24sIHItPnBlcl9kaXJfY29uZmlnLCBSRU1PVEVfTkFNRSksCi0JCXJlYXNvbik7Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfbG9nX2Fzc2VydChjb25zdCBjaGFyICpzekV4cCwgY29uc3QgY2hhciAqc3pGaWxlLCBpbnQgbkxpbmUpCi17Ci0gICAgY2hhciB0aW1lX3N0cltBUF9DVElNRV9MRU5dOwotCi0gICAgYXBfY3RpbWUodGltZV9zdHIsIGFwX25vdygpKTsKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsCi0gICAgICAgICAgICAgICAgICJbJXNdIGZpbGUgJXMsIGxpbmUgJWQsIGFzc2VydGlvbiBcIiVzXCIgZmFpbGVkIiwKLQkgICAgICAgICB0aW1lX3N0ciwgc3pGaWxlLCBuTGluZSwgc3pFeHApOwotI2lmbmRlZiBXSU4zMgotICAgIC8qIHVuaXggYXNzZXJ0IGRvZXMgYW4gYWJvcnQgbGVhZGluZyB0byBhIGNvcmUgZHVtcCAqLwotICAgIGFib3J0KCk7Ci0jZWxzZQotICAgIGV4aXQoMSk7Ci0jZW5kaWYKLX0KLQotLyogcGlwZWQgbG9nIHN1cHBvcnQgKi8KLQotI2lmZGVmIEhBVkVfUkVMSUFCTEVfUElQRURfTE9HUwotLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwotc3RhdGljIHZvaWQgcGlwZWRfbG9nX21haW50ZW5hbmNlKGludCByZWFzb24sIHZvaWQgKmRhdGEsIGFwX3dhaXRfdCBzdGF0dXMpOwotCi1zdGF0aWMgaW50IHBpcGVkX2xvZ19zcGF3bihwaXBlZF9sb2cgKnBsKQotewotICAgIGludCByYzsKLSAgICBhcF9wcm9jYXR0cl90ICpwcm9jYXR0cjsKLSAgICBhcF9vc19wcm9jX3QgcGlkOwotICAgIGFwX3Byb2NfdCAqcHJvY25ldzsKLQotICAgIC8qIHBqciAtIGNhbGxzIHRvIGJsb2NrIGFuZCB1bmJsb2NrIGFsYXJtcyB3ZXJlbid0IGhlcmUgYmVmb3JlLCB3YXMgdGhpcyAqLwotICAgIC8qICAgICAgIGFuIG92ZXJzaWdodCBvciBpbnRlbnRpb25hbD8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFwX2Jsb2NrX2FsYXJtcygpOyAgICovCi0KLSAgICBhcF9jbGVhbnVwX2Zvcl9leGVjKCk7Ci0jaWZkZWYgU0lHSFVQCi0gICAgc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7Ci0jZW5kaWYKLSAgICBpZiAoKGFwX2NyZWF0ZXByb2NhdHRyX2luaXQoJnByb2NhdHRyLCBwbC0+cCkgICAgICAgICAhPSBBUFJfU1VDQ0VTUykgfHwKLSAgICAgICAgKGFwX3NldHByb2NhdHRyX2Rpcihwcm9jYXR0ciwgcGwtPnByb2dyYW0pICAgICAgICAhPSBBUFJfU1VDQ0VTUykgfHwKLSAgICAgICAgKGFwX3NldF9jaGlsZGluKHByb2NhdHRyLCBhcF9waXBlZF9sb2dfcmVhZF9mZChwbCksIGFwX3BpcGVkX2xvZ193cml0ZV9mZChwbCkpICE9IEFQUl9TVUNDRVNTKSkgewotICAgICAgICAvKiBTb21ldGhpbmcgYmFkIGhhcHBlbmVkLCBnaXZlIHVwIGFuZCBnbyBhd2F5LiAqLwotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwKLQkgICAgInBpcGVkX2xvZ19zcGF3bjogdW5hYmxlIHRvIGV4ZWMgJyVzJzogJXMiLAotCSAgICBwbC0+cHJvZ3JhbSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICAgIHJjID0gLTE7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByYyA9IGFwX2NyZWF0ZV9wcm9jZXNzKCZwcm9jbmV3LCBwbC0+cHJvZ3JhbSwgTlVMTCwgTlVMTCwgcHJvY2F0dHIsIHBsLT5wKTsKLSAgICAKLSAgICAgICAgaWYgKHJjID09IEFQUl9TVUNDRVNTKSB7ICAgICAgICAgICAgLyogcGpyIC0gVGhpcyBubyBsb25nZXIgaGFwcGVucyBpbnNpZGUgdGhlIGNoaWxkLCAqLwotICAgICAgICAgICAgUkFJU0VfU0lHU1RPUChQSVBFRF9MT0dfU1BBV04pOyAvKiAgIEkgYW0gYXNzdW1pbmcgdGhhdCBpZiBhcF9jcmVhdGVfcHJvY2VzcyB3YXMgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgc3VjY2Vzc2Z1bCB0aGF0IHRoZSBjaGlsZCBpcyBydW5uaW5nLiAgICAgICAgKi8KLSAgICAgICAgICAgIHBsLT5waWQgPSBwcm9jbmV3OwotICAgICAgICAgICAgYXBfZ2V0X29zX3Byb2MoJnBpZCwgcHJvY25ldyk7Ci0gICAgICAgICAgICBhcF9yZWdpc3Rlcl9vdGhlcl9jaGlsZChwaWQsIHBpcGVkX2xvZ19tYWludGVuYW5jZSwgcGwsIGFwX3BpcGVkX2xvZ193cml0ZV9mZChwbCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotLyogIGFwX3VuYmxvY2tfYWxhcm1zKCk7ICovCi0gICAgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHZvaWQgcGlwZWRfbG9nX21haW50ZW5hbmNlKGludCByZWFzb24sIHZvaWQgKmRhdGEsIGFwX3dhaXRfdCBzdGF0dXMpCi17Ci0gICAgcGlwZWRfbG9nICpwbCA9IGRhdGE7Ci0KLSAgICBzd2l0Y2ggKHJlYXNvbikgewotICAgIGNhc2UgT0NfUkVBU09OX0RFQVRIOgotICAgIGNhc2UgT0NfUkVBU09OX0xPU1Q6Ci0JcGwtPnBpZCA9IE5VTEw7Ci0JYXBfdW5yZWdpc3Rlcl9vdGhlcl9jaGlsZChwbCk7Ci0JaWYgKHBsLT5wcm9ncmFtID09IE5VTEwpIHsKLQkgICAgLyogZHVyaW5nIGEgcmVzdGFydCAqLwotCSAgICBicmVhazsKLQl9Ci0JaWYgKHBpcGVkX2xvZ19zcGF3bihwbCkgIT0gQVBSX1NVQ0NFU1MpIHsKLQkgICAgLyogd2hhdCBjYW4gd2UgZG8/ICBUaGlzIGNvdWxkIGJlIHRoZSBlcnJvciBsb2cgd2UncmUgaGF2aW5nCi0JICAgICAqIHByb2JsZW1zIG9wZW5pbmcgdXAuLi4gKi8KLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLAotCQkicGlwZWRfbG9nX21haW50ZW5hbmNlOiB1bmFibGUgdG8gcmVzcGF3biAnJXMnOiAlcyIsCi0JCXBsLT5wcm9ncmFtLCBzdHJlcnJvcihlcnJubykpOwotCX0KLQlicmVhazsKLSAgICAKLSAgICBjYXNlIE9DX1JFQVNPTl9VTldSSVRBQkxFOgotCWlmIChwbC0+cGlkICE9IE5VTEwpIHsKLQkgICAgYXBfa2lsbChwbC0+cGlkLCBTSUdURVJNKTsKLQl9Ci0JYnJlYWs7Ci0gICAgCi0gICAgY2FzZSBPQ19SRUFTT05fUkVTVEFSVDoKLQlwbC0+cHJvZ3JhbSA9IE5VTEw7Ci0JaWYgKHBsLT5waWQgIT0gTlVMTCkgewotCSAgICBhcF9raWxsKHBsLT5waWQsIFNJR1RFUk0pOwotCX0KLQlicmVhazsKLQotICAgIGNhc2UgT0NfUkVBU09OX1VOUkVHSVNURVI6Ci0JYnJlYWs7Ci0gICAgfQotfQotCi0KLXN0YXRpYyBhcF9zdGF0dXNfdCBwaXBlZF9sb2dfY2xlYW51cCh2b2lkICpkYXRhKQotewotICAgIHBpcGVkX2xvZyAqcGwgPSBkYXRhOwotCi0gICAgaWYgKHBsLT5waWQgIT0gTlVMTCkgewotCWFwX2tpbGwocGwtPnBpZCwgU0lHVEVSTSk7Ci0gICAgfQotICAgIGFwX3VucmVnaXN0ZXJfb3RoZXJfY2hpbGQocGwpOwotICAgIGFwX2Nsb3NlKGFwX3BpcGVkX2xvZ19yZWFkX2ZkKHBsKSk7Ci0gICAgYXBfY2xvc2UoYXBfcGlwZWRfbG9nX3dyaXRlX2ZkKHBsKSk7Ci0gICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotfQotCi0KLXN0YXRpYyBhcF9zdGF0dXNfdCBwaXBlZF9sb2dfY2xlYW51cF9mb3JfZXhlYyh2b2lkICpkYXRhKQotewotICAgIHBpcGVkX2xvZyAqcGwgPSBkYXRhOwotCi0gICAgYXBfY2xvc2UoYXBfcGlwZWRfbG9nX3JlYWRfZmQocGwpKTsKLSAgICBhcF9jbG9zZShhcF9waXBlZF9sb2dfd3JpdGVfZmQocGwpKTsKLSAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci19Ci0KLUFQSV9FWFBPUlQocGlwZWRfbG9nICopIGFwX29wZW5fcGlwZWRfbG9nKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqcHJvZ3JhbSkKLXsKLSAgICBwaXBlZF9sb2cgKnBsOwotCi0gICAgcGwgPSBhcF9wYWxsb2MocCwgc2l6ZW9mICgqcGwpKTsKLSAgICBwbC0+cCA9IHA7Ci0gICAgcGwtPnByb2dyYW0gPSBhcF9wc3RyZHVwKHAsIHByb2dyYW0pOwotICAgIHBsLT5waWQgPSBOVUxMOwotICAgIGlmIChhcF9jcmVhdGVfcGlwZSgmYXBfcGlwZWRfbG9nX3JlYWRfZmQocGwpLCAmYXBfcGlwZWRfbG9nX3dyaXRlX2ZkKHBsKSwgcCkgIT0gQVBSX1NVQ0NFU1MpIHsKLQlpbnQgc2F2ZV9lcnJubyA9IGVycm5vOwotCWVycm5vID0gc2F2ZV9lcnJubzsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgYXBfcmVnaXN0ZXJfY2xlYW51cChwLCBwbCwgcGlwZWRfbG9nX2NsZWFudXAsIHBpcGVkX2xvZ19jbGVhbnVwX2Zvcl9leGVjKTsKLSAgICBpZiAocGlwZWRfbG9nX3NwYXduKHBsKSA9PSAtMSkgewotCWludCBzYXZlX2Vycm5vID0gZXJybm87Ci0JYXBfa2lsbF9jbGVhbnVwKHAsIHBsLCBwaXBlZF9sb2dfY2xlYW51cCk7Ci0JYXBfY2xvc2UoYXBfcGlwZWRfbG9nX3JlYWRfZmQocGwpKTsKLQlhcF9jbG9zZShhcF9waXBlZF9sb2dfd3JpdGVfZmQocGwpKTsKLQllcnJubyA9IHNhdmVfZXJybm87Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBwbDsKLX0KLQotI2Vsc2UKLQotc3RhdGljIGFwX3N0YXR1c190IHBpcGVkX2xvZ19jbGVhbnVwKHZvaWQgKmRhdGEpCi17Ci0gICAgcGlwZWRfbG9nICpwbCA9IGRhdGE7Ci0KLSAgICBhcF9jbG9zZShhcF9waXBlZF9sb2dfd3JpdGVfZmQocGwpKTsKLSAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci19Ci0KLUFQSV9FWFBPUlQocGlwZWRfbG9nICopIGFwX29wZW5fcGlwZWRfbG9nKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqcHJvZ3JhbSkKLXsKLSAgICBwaXBlZF9sb2cgKnBsOwotICAgIGFwX2ZpbGVfdCAqZHVtbXkgPSBOVUxMOwotICAgIGludCByYzsKLQotICAgIHJjID0gbG9nX2NoaWxkKHAsIHByb2dyYW0sICZkdW1teSk7Ci0gICAgaWYgKHJjICE9IEFQUl9TVUNDRVNTKSB7Ci0JcGVycm9yKCJhcF9zcGF3bl9jaGlsZCIpOwotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgZm9yayBjaGlsZCBmb3IgcGlwZWQgbG9nIHByb2Nlc3MiKTsKLQlleGl0ICgxKTsKLSAgICB9Ci0KLSAgICBwbCA9IGFwX3BhbGxvYyhwLCBzaXplb2YgKCpwbCkpOwotICAgIHBsLT5wID0gcDsKLSAgICBhcF9waXBlZF9sb2dfcmVhZF9mZChwbCkgPSBOVUxMOwotICAgIGFwX3BpcGVkX2xvZ193cml0ZV9mZChwbCkgPSBkdW1teTsKLSAgICBhcF9yZWdpc3Rlcl9jbGVhbnVwKHAsIHBsLCBwaXBlZF9sb2dfY2xlYW51cCwgcGlwZWRfbG9nX2NsZWFudXApOwotCi0gICAgcmV0dXJuIHBsOwotfQotCi0jZW5kaWYKLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9jbG9zZV9waXBlZF9sb2cocGlwZWRfbG9nICpwbCkKLXsKLSAgICBhcF9ydW5fY2xlYW51cChwbC0+cCwgcGwsIHBpcGVkX2xvZ19jbGVhbnVwKTsKLX0KLQpkaWZmIC0tZ2l0IGEvc2VydmVyL21haW4uYyBiL3NlcnZlci9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMzExMDIuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDQyNyArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyAKLSAqIGFyZSBtZXQ6IAotICogCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gIAotICogCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCAKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAKLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgCi0gKiAgICBkaXN0cmlidXRpb24uIAotICogCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogCi0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwIAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIgCi0gKiAKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8gCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgCi0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4gCi0gKiAKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiIAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLiAKLSAqIAotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZyAKLSAqICAgIGFja25vd2xlZGdtZW50OiAKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAgCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIiAKLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZIAotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SIAotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCAKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCAKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyAKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIAotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCAKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAotICogCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueSAKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZCAKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciAKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4gCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIAotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uIAotICogCi0gKi8gCi0KLSNkZWZpbmUgQ09SRV9QUklWQVRFCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cGQuaCIgCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiIAotI2luY2x1ZGUgImh0dHBfbG9nLmgiIAotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAidXRpbF91cmkuaCIgCi0jaW5jbHVkZSAiYXByX2dldG9wdC5oIgotI2luY2x1ZGUgImFwX21wbS5oIgotCi1jb25zdCBjaGFyICphcF9zZXJ2ZXJfYXJndjA7Ci0KLWNvbnN0IGNoYXIgKmFwX3NlcnZlcl9yb290OwotCi1hcF9hcnJheV9oZWFkZXJfdCAqYXBfc2VydmVyX3ByZV9yZWFkX2NvbmZpZzsKLWFwX2FycmF5X2hlYWRlcl90ICphcF9zZXJ2ZXJfcG9zdF9yZWFkX2NvbmZpZzsKLWFwX2FycmF5X2hlYWRlcl90ICphcF9zZXJ2ZXJfY29uZmlnX2RlZmluZXM7Ci0KLS8qIFhYWCAtIFdlIHNob3VsZCBiZSBhYmxlIHRvIGdyYWIgdGhlIHBlci1NUE0gc2V0dGluZ3MgaGVyZSB0b28gKi8KLXN0YXRpYyB2b2lkIHNob3dfY29tcGlsZV9zZXR0aW5ncyh2b2lkKQotewotICAgIHByaW50ZigiU2VydmVyIHZlcnNpb246ICVzXG4iLCBhcF9nZXRfc2VydmVyX3ZlcnNpb24oKSk7Ci0gICAgcHJpbnRmKCJTZXJ2ZXIgYnVpbHQ6ICAgJXNcbiIsIGFwX2dldF9zZXJ2ZXJfYnVpbHQoKSk7Ci0gICAgcHJpbnRmKCJTZXJ2ZXIncyBNb2R1bGUgTWFnaWMgTnVtYmVyOiAldToldVxuIiwKLQkgICBNT0RVTEVfTUFHSUNfTlVNQkVSX01BSk9SLCBNT0RVTEVfTUFHSUNfTlVNQkVSX01JTk9SKTsKLSAgICBwcmludGYoIlNlcnZlciBjb21waWxlZCB3aXRoLi4uLlxuIik7Ci0jaWZkZWYgQklHX1NFQ1VSSVRZX0hPTEUKLSAgICBwcmludGYoIiAtRCBCSUdfU0VDVVJJVFlfSE9MRVxuIik7Ci0jZW5kaWYKLSNpZmRlZiBTRUNVUklUWV9IT0xFX1BBU1NfQVVUSE9SSVpBVElPTgotICAgIHByaW50ZigiIC1EIFNFQ1VSSVRZX0hPTEVfUEFTU19BVVRIT1JJWkFUSU9OXG4iKTsKLSNlbmRpZgotI2lmZGVmIEhBVkVfTU1BUAotICAgIHByaW50ZigiIC1EIEhBVkVfTU1BUFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NITUdFVAotICAgIHByaW50ZigiIC1EIEhBVkVfU0hNR0VUXG4iKTsKLSNlbmRpZgotI2lmZGVmIFVTRV9NTUFQX1NDT1JFQk9BUkQKLSAgICBwcmludGYoIiAtRCBVU0VfTU1BUF9TQ09SRUJPQVJEXG4iKTsKLSNlbmRpZgotI2lmZGVmIFVTRV9TSE1HRVRfU0NPUkVCT0FSRAotICAgIHByaW50ZigiIC1EIFVTRV9TSE1HRVRfU0NPUkVCT0FSRFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBVU0VfT1MyX1NDT1JFQk9BUkQKLSAgICBwcmludGYoIiAtRCBVU0VfT1MyX1NDT1JFQk9BUkRcbiIpOwotI2VuZGlmCi0jaWZkZWYgVVNFX1BPU0lYX1NDT1JFQk9BUkQKLSAgICBwcmludGYoIiAtRCBVU0VfUE9TSVhfU0NPUkVCT0FSRFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBVU0VfTU1BUF9GSUxFUwotICAgIHByaW50ZigiIC1EIFVTRV9NTUFQX0ZJTEVTXG4iKTsKLSNpZmRlZiBNTUFQX1NFR01FTlRfU0laRQotCXByaW50ZigiIC1EIE1NQVBfU0VHTUVOVF9TSVpFPSVsZFxuIiwobG9uZylNTUFQX1NFR01FTlRfU0laRSk7Ci0jZW5kaWYKLSNlbmRpZiAvKlVTRV9NTUFQX0ZJTEVTKi8KLSNpZmRlZiBOT19XUklURVYKLSAgICBwcmludGYoIiAtRCBOT19XUklURVZcbiIpOwotI2VuZGlmCi0jaWZkZWYgTk9fTElOR0NMT1NFCi0gICAgcHJpbnRmKCIgLUQgTk9fTElOR0NMT1NFXG4iKTsKLSNlbmRpZgotI2lmZGVmIFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVAotICAgIHByaW50ZigiIC1EIFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQKLSAgICBwcmludGYoIiAtRCBVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFRcbiIpOwotI2VuZGlmCi0jaWZkZWYgVVNFX1VTTE9DS19TRVJJQUxJWkVEX0FDQ0VQVAotICAgIHByaW50ZigiIC1EIFVTRV9VU0xPQ0tfU0VSSUFMSVpFRF9BQ0NFUFRcbiIpOwotI2VuZGlmCi0jaWZkZWYgVVNFX1NZU1ZTRU1fU0VSSUFMSVpFRF9BQ0NFUFQKLSAgICBwcmludGYoIiAtRCBVU0VfU1lTVlNFTV9TRVJJQUxJWkVEX0FDQ0VQVFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBVU0VfUFRIUkVBRF9TRVJJQUxJWkVEX0FDQ0VQVAotICAgIHByaW50ZigiIC1EIFVTRV9QVEhSRUFEX1NFUklBTElaRURfQUNDRVBUXG4iKTsKLSNlbmRpZgotI2lmZGVmIFNJTkdMRV9MSVNURU5fVU5TRVJJQUxJWkVEX0FDQ0VQVAotICAgIHByaW50ZigiIC1EIFNJTkdMRV9MSVNURU5fVU5TRVJJQUxJWkVEX0FDQ0VQVFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBIQVNfT1RIRVJfQ0hJTEQKLSAgICBwcmludGYoIiAtRCBIQVNfT1RIRVJfQ0hJTERcbiIpOwotI2VuZGlmCi0jaWZkZWYgSEFWRV9SRUxJQUJMRV9QSVBFRF9MT0dTCi0gICAgcHJpbnRmKCIgLUQgSEFWRV9SRUxJQUJMRV9QSVBFRF9MT0dTXG4iKTsKLSNlbmRpZgotI2lmZGVmIEJVRkZFUkVEX0xPR1MKLSAgICBwcmludGYoIiAtRCBCVUZGRVJFRF9MT0dTXG4iKTsKLSNpZmRlZiBQSVBFX0JVRgotCXByaW50ZigiIC1EIFBJUEVfQlVGPSVsZFxuIiwobG9uZylQSVBFX0JVRik7Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIE1VTFRJVEhSRUFECi0gICAgcHJpbnRmKCIgLUQgTVVMVElUSFJFQURcbiIpOwotI2VuZGlmCi0jaWZkZWYgQ0hBUlNFVF9FQkNESUMKLSAgICBwcmludGYoIiAtRCBDSEFSU0VUX0VCQ0RJQ1xuIik7Ci0jZW5kaWYKLSNpZmRlZiBORUVEX0hBU0hCQU5HX0VNVUwKLSAgICBwcmludGYoIiAtRCBORUVEX0hBU0hCQU5HX0VNVUxcbiIpOwotI2VuZGlmCi0jaWZkZWYgU0hBUkVEX0NPUkUKLSAgICBwcmludGYoIiAtRCBTSEFSRURfQ09SRVxuIik7Ci0jZW5kaWYKLQotLyogVGhpcyBsaXN0IGRpc3BsYXlzIHRoZSBjb21waWxlZCBpbiBkZWZhdWx0IHBhdGhzOiAqLwotI2lmZGVmIEhUVFBEX1JPT1QKLSAgICBwcmludGYoIiAtRCBIVFRQRF9ST09UPVwiIiBIVFRQRF9ST09UICJcIlxuIik7Ci0jZW5kaWYKLSNpZmRlZiBTVUVYRUNfQklOCi0gICAgcHJpbnRmKCIgLUQgU1VFWEVDX0JJTj1cIiIgU1VFWEVDX0JJTiAiXCJcbiIpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChTSEFSRURfQ09SRSkgJiYgZGVmaW5lZChTSEFSRURfQ09SRV9ESVIpCi0gICAgcHJpbnRmKCIgLUQgU0hBUkVEX0NPUkVfRElSPVwiIiBTSEFSRURfQ09SRV9ESVIgIlwiXG4iKTsKLSNlbmRpZgotI2lmZGVmIERFRkFVTFRfUElETE9HCi0gICAgcHJpbnRmKCIgLUQgREVGQVVMVF9QSURMT0c9XCIiIERFRkFVTFRfUElETE9HICJcIlxuIik7Ci0jZW5kaWYKLSNpZmRlZiBERUZBVUxUX1NDT1JFQk9BUkQKLSAgICBwcmludGYoIiAtRCBERUZBVUxUX1NDT1JFQk9BUkQ9XCIiIERFRkFVTFRfU0NPUkVCT0FSRCAiXCJcbiIpOwotI2VuZGlmCi0jaWZkZWYgREVGQVVMVF9MT0NLRklMRQotICAgIHByaW50ZigiIC1EIERFRkFVTFRfTE9DS0ZJTEU9XCIiIERFRkFVTFRfTE9DS0ZJTEUgIlwiXG4iKTsKLSNlbmRpZgotI2lmZGVmIERFRkFVTFRfWEZFUkxPRwotICAgIHByaW50ZigiIC1EIERFRkFVTFRfWEZFUkxPRz1cIiIgREVGQVVMVF9YRkVSTE9HICJcIlxuIik7Ci0jZW5kaWYKLSNpZmRlZiBERUZBVUxUX0VSUk9STE9HCi0gICAgcHJpbnRmKCIgLUQgREVGQVVMVF9FUlJPUkxPRz1cIiIgREVGQVVMVF9FUlJPUkxPRyAiXCJcbiIpOwotI2VuZGlmCi0jaWZkZWYgVFlQRVNfQ09ORklHX0ZJTEUKLSAgICBwcmludGYoIiAtRCBUWVBFU19DT05GSUdfRklMRT1cIiIgVFlQRVNfQ09ORklHX0ZJTEUgIlwiXG4iKTsKLSNlbmRpZgotI2lmZGVmIFNFUlZFUl9DT05GSUdfRklMRQotICAgIHByaW50ZigiIC1EIFNFUlZFUl9DT05GSUdfRklMRT1cIiIgU0VSVkVSX0NPTkZJR19GSUxFICJcIlxuIik7Ci0jZW5kaWYKLSNpZmRlZiBBQ0NFU1NfQ09ORklHX0ZJTEUKLSAgICBwcmludGYoIiAtRCBBQ0NFU1NfQ09ORklHX0ZJTEU9XCIiIEFDQ0VTU19DT05GSUdfRklMRSAiXCJcbiIpOwotI2VuZGlmCi0jaWZkZWYgUkVTT1VSQ0VfQ09ORklHX0ZJTEUKLSAgICBwcmludGYoIiAtRCBSRVNPVVJDRV9DT05GSUdfRklMRT1cIiIgUkVTT1VSQ0VfQ09ORklHX0ZJTEUgIlwiXG4iKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBkZXN0cm95X2FuZF9leGl0X3Byb2Nlc3MocHJvY2Vzc19yZWMgKnByb2Nlc3MsIGludCBwcm9jZXNzX2V4aXRfdmFsdWUpCi17Ci0gICAgYXBfZGVzdHJveV9wb29sKHByb2Nlc3MtPnBvb2wpOyAvKiBhbmQgZGVzdHJveSBhbGwgZGVzY2VuZGVudCBwb29scyAqLwotICAgIGV4aXQocHJvY2Vzc19leGl0X3ZhbHVlKTsKLX0KLQotc3RhdGljIHByb2Nlc3NfcmVjICpjcmVhdGVfcHJvY2VzcyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCi17Ci0gICAgcHJvY2Vzc19yZWMgKnByb2Nlc3M7Ci0gICAgCi0gICAgewotCWFwX2NvbnRleHRfdCAqY250eDsKLQotCWFwX2NyZWF0ZV9jb250ZXh0KCZjbnR4LCBOVUxMKTsKLQlwcm9jZXNzID0gYXBfcGFsbG9jKGNudHgsIHNpemVvZihwcm9jZXNzX3JlYykpOwotCXByb2Nlc3MtPnBvb2wgPSBjbnR4OwotICAgIH0KLSAgICBhcF9jcmVhdGVfY29udGV4dCgmcHJvY2Vzcy0+cGNvbmYsIHByb2Nlc3MtPnBvb2wpOwotICAgIHByb2Nlc3MtPmFyZ2MgPSBhcmdjOwotICAgIHByb2Nlc3MtPmFyZ3YgPSBhcmd2OwotICAgIHByb2Nlc3MtPnNob3J0X25hbWUgPSBhcF9maWxlbmFtZV9vZl9wYXRobmFtZShhcmd2WzBdKTsKLSAgICByZXR1cm4gcHJvY2VzczsKLX0KLQotc3RhdGljIHZvaWQgdXNhZ2UocHJvY2Vzc19yZWMgKnByb2Nlc3MpCi17Ci0gICAgY29uc3QgY2hhciAqYmluID0gcHJvY2Vzcy0+YXJndlswXTsKLSAgICBjaGFyIHBhZFtNQVhfU1RSSU5HX0xFTl07Ci0gICAgdW5zaWduZWQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzdHJsZW4oYmluKTsgaSsrKQotCXBhZFtpXSA9ICcgJzsKLSAgICBwYWRbaV0gPSAnXDAnOwotI2lmZGVmIFNIQVJFRF9DT1JFCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLE5VTEwgLCAiVXNhZ2U6ICVzIFstUiBkaXJlY3RvcnldIFstRCBuYW1lXSBbLWQgZGlyZWN0b3J5XSBbLWYgZmlsZV0iLCBiaW4pOwotI2Vsc2UKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsICJVc2FnZTogJXMgWy1EIG5hbWVdIFstZCBkaXJlY3RvcnldIFstZiBmaWxlXSIsIGJpbik7Ci0jZW5kaWYKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsICIgICAgICAgJXMgWy1DIFwiZGlyZWN0aXZlXCJdIFstYyBcImRpcmVjdGl2ZVwiXSIsIHBhZCk7Ci0jaWZkZWYgV0lOMzIKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsICIgICAgICAgJXMgWy1rIHJlc3RhcnR8c2h1dGRvd258c3RhcnRdIiwgcGFkKTsKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsICIgICAgICAgJXMgWy1uIHNlcnZpY2VfbmFtZV0iLCBwYWQpOwotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgIiAgICAgICAlcyBbLWldIFstdV0iLCBwYWQpOwotI2VuZGlmCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAiICAgICAgICVzIFstdl0gWy1WXSBbLWhdIFstbF0gWy1MXSBbLVNdIFstdF0gWy1UXSIsIHBhZCk7Ci0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAiT3B0aW9uczoiKTsKLSNpZmRlZiBTSEFSRURfQ09SRQotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgIiAgLVIgZGlyZWN0b3J5ICAgICA6IHNwZWNpZnkgYW4gYWx0ZXJuYXRlIGxvY2F0aW9uIGZvciBzaGFyZWQgb2JqZWN0IGZpbGVzIik7Ci0jZW5kaWYKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsICIgIC1EIG5hbWUgICAgICAgICAgOiBkZWZpbmUgYSBuYW1lIGZvciB1c2UgaW4gPElmRGVmaW5lIG5hbWU+IGRpcmVjdGl2ZXMiKTsKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsICIgIC1kIGRpcmVjdG9yeSAgICAgOiBzcGVjaWZ5IGFuIGFsdGVybmF0ZSBpbml0aWFsIFNlcnZlclJvb3QiKTsKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsICIgIC1mIGZpbGUgICAgICAgICAgOiBzcGVjaWZ5IGFuIGFsdGVybmF0ZSBTZXJ2ZXJDb25maWdGaWxlIik7Ci0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAiICAtQyBcImRpcmVjdGl2ZVwiICAgOiBwcm9jZXNzIGRpcmVjdGl2ZSBiZWZvcmUgcmVhZGluZyBjb25maWcgZmlsZXMiKTsKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsICIgIC1jIFwiZGlyZWN0aXZlXCIgICA6IHByb2Nlc3MgZGlyZWN0aXZlIGFmdGVyICByZWFkaW5nIGNvbmZpZyBmaWxlcyIpOwotI2lmZGVmIFdJTjMyCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAiICAtbiBuYW1lICAgICAgICAgIDogc2V0IHNlcnZpY2UgbmFtZSBhbmQgdXNlIGl0cyBTZXJ2ZXJDb25maWdGaWxlIik7Ci0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAiICAtayBzaHV0ZG93biAgICAgIDogdGVsbCBydW5uaW5nIEFwYWNoZSB0byBzaHV0ZG93biIpOwotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgIiAgLWsgcmVzdGFydCAgICAgICA6IHRlbGwgcnVubmluZyBBcGFjaGUgdG8gZG8gYSBncmFjZWZ1bCByZXN0YXJ0Iik7Ci0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAiICAtayBzdGFydCAgICAgICAgIDogdGVsbCBBcGFjaGUgdG8gc3RhcnQiKTsKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsICIgIC1pICAgICAgICAgICAgICAgOiBpbnN0YWxsIGFuIEFwYWNoZSBzZXJ2aWNlIik7Ci0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAiICAtdSAgICAgICAgICAgICAgIDogdW5pbnN0YWxsIGFuIEFwYWNoZSBzZXJ2aWNlIik7Ci0jZW5kaWYKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsICIgIC12ICAgICAgICAgICAgICAgOiBzaG93IHZlcnNpb24gbnVtYmVyIik7Ci0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAiICAtViAgICAgICAgICAgICAgIDogc2hvdyBjb21waWxlIHNldHRpbmdzIik7Ci0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAiICAtaCAgICAgICAgICAgICAgIDogbGlzdCBhdmFpbGFibGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgKHRoaXMgcGFnZSkiKTsKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsICIgIC1sICAgICAgICAgICAgICAgOiBsaXN0IGNvbXBpbGVkIGluIG1vZHVsZXMiKTsKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsICIgIC1MICAgICAgICAgICAgICAgOiBsaXN0IGF2YWlsYWJsZSBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMiKTsKLSAgICAvKiBUT0RPQzogLVMgaGFzIGJlZW4gcmVwbGFjZWQgYnkgJy10IC1EIERVTVBfVkhPU1RTJyAqLwotICAgIC8qIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgIiAgLVMgICAgICAgICAgICAgICA6IHNob3cgcGFyc2VkIHNldHRpbmdzIChjdXJyZW50bHkgb25seSB2aG9zdCBzZXR0aW5ncykiKTsgKi8KLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsICIgIC10ICAgICAgICAgICAgICAgOiBydW4gc3ludGF4IGNoZWNrIGZvciBjb25maWcgZmlsZXMgKHdpdGggZG9jcm9vdCBjaGVjaykiKTsKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsICIgIC1UICAgICAgICAgICAgICAgOiBydW4gc3ludGF4IGNoZWNrIGZvciBjb25maWcgZmlsZXMgKHdpdGhvdXQgZG9jcm9vdCBjaGVjaykiKTsKLSAgICAvKiBUT0RPQzogLVggZ29lcyBhd2F5LCBleHBlY3QgTVBNcyB0byB1c2UgLUQgb3B0aW9ucyAqLwotICAgIGRlc3Ryb3lfYW5kX2V4aXRfcHJvY2Vzcyhwcm9jZXNzLCAxKTsKLX0KLQotCi0KLQotCi1hcF9jb250ZXh0X3QgKmdfcEhvb2tQb29sOwotCi0jaWZkZWYgV0lOMzIKLUFQSV9FWFBPUlRfTk9OU1REKGludCkgYXBhY2hlX21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLSNlbHNlCi1BUElfRVhQT1JUX05PTlNURChpbnQpICAgICAgICBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi0jZW5kaWYKLXsKLSAgICBpbnQgYzsKLSAgICBpbnQgY29uZmlndGVzdG9ubHkgPSAwOwotICAgIGNvbnN0IGNoYXIgKmNvbmZuYW1lID0gU0VSVkVSX0NPTkZJR19GSUxFOwotICAgIGNvbnN0IGNoYXIgKmRlZl9zZXJ2ZXJfcm9vdCA9IEhUVFBEX1JPT1Q7Ci0gICAgcHJvY2Vzc19yZWMgKnByb2Nlc3MgPSBjcmVhdGVfcHJvY2VzcyhhcmdjLCAoY29uc3QgY2hhciAqKilhcmd2KTsKLSAgICBzZXJ2ZXJfcmVjICpzZXJ2ZXJfY29uZjsKLSAgICBhcF9jb250ZXh0X3QgKnBnbG9iYWwgPSBwcm9jZXNzLT5wb29sOwotICAgIGFwX2NvbnRleHRfdCAqcGNvbmYgPSBwcm9jZXNzLT5wY29uZjsKLSAgICBhcF9jb250ZXh0X3QgKnBsb2c7IC8qIFBvb2wgb2YgbG9nIHN0cmVhbXMsIHJlc2V0IF9hZnRlcl8gZWFjaCByZWFkIG9mIGNvbmYgKi8KLSAgICBhcF9jb250ZXh0X3QgKnB0ZW1wOyAvKiBQb29sIGZvciB0ZW1wb3JhcnkgY29uZmlnIHN0dWZmLCByZXNldCBvZnRlbiAqLwotICAgIGFwX2NvbnRleHRfdCAqcGNvbW1hbmRzOyAvKiBQb29sIGZvciAtQyBhbmQgLWMgc3dpdGNoZXMgKi8KLQotI2lmZGVmIFdJTjMyCi0gICAgY2hhciAqc2lnbmFsID0gTlVMTDsKLSNlbmRpZgotCi0gICAgYXBfc2VydmVyX2FyZ3YwID0gcHJvY2Vzcy0+c2hvcnRfbmFtZTsKLSAgICAKLSAgICBhcF91dGlsX3VyaV9pbml0KCk7Ci0KLSAgICBnX3BIb29rUG9vbD1wZ2xvYmFsOwotCi0gICAgYXBfc2V0dXBfcHJlbGlua2VkX21vZHVsZXMocHJvY2Vzcyk7Ci0KLSAgICBhcF9jcmVhdGVfY29udGV4dCgmcGNvbW1hbmRzLCBwZ2xvYmFsKTsKLSAgICBhcF9zZXJ2ZXJfcHJlX3JlYWRfY29uZmlnICA9IGFwX21ha2VfYXJyYXkocGNvbW1hbmRzLCAxLCBzaXplb2YoY2hhciAqKSk7Ci0gICAgYXBfc2VydmVyX3Bvc3RfcmVhZF9jb25maWcgPSBhcF9tYWtlX2FycmF5KHBjb21tYW5kcywgMSwgc2l6ZW9mKGNoYXIgKikpOwotICAgIGFwX3NlcnZlcl9jb25maWdfZGVmaW5lcyAgID0gYXBfbWFrZV9hcnJheShwY29tbWFuZHMsIDEsIHNpemVvZihjaGFyICopKTsKLQotICAgIHdoaWxlIChhcF9nZXRvcHQocGNvbW1hbmRzLCBhcmdjLCBhcmd2LCAiQzpjOmQ6ZjprOnZWbEx0aCIsICZjKSA9PSBBUFJfU1VDQ0VTUykgewotICAgICAgICBjaGFyICoqbmV3OwotICAgICAgICBzd2l0Y2ggKGMpIHsKLSAJY2FzZSAnYyc6Ci0JICAgIG5ldyA9IChjaGFyICoqKWFwX3B1c2hfYXJyYXkoYXBfc2VydmVyX3Bvc3RfcmVhZF9jb25maWcpOwotCSAgICAqbmV3ID0gYXBfcHN0cmR1cChwY29tbWFuZHMsIGFwX29wdGFyZyk7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ0MnOgotCSAgICBuZXcgPSAoY2hhciAqKilhcF9wdXNoX2FycmF5KGFwX3NlcnZlcl9wcmVfcmVhZF9jb25maWcpOwotCSAgICAqbmV3ID0gYXBfcHN0cmR1cChwY29tbWFuZHMsIGFwX29wdGFyZyk7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ2QnOgotCSAgICBkZWZfc2VydmVyX3Jvb3QgPSBhcF9vcHRhcmc7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ2YnOgotCSAgICBjb25mbmFtZSA9IGFwX29wdGFyZzsKLQkgICAgYnJlYWs7Ci0jaWZkZWYgV0lOMzIKLSAgICAgICAgY2FzZSAnayc6Ci0JICAgIHNpZ25hbCA9IGFwX29wdGFyZzsKLSAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0JY2FzZSAndic6Ci0JICAgIHByaW50ZigiU2VydmVyIHZlcnNpb246ICVzXG4iLCBhcF9nZXRfc2VydmVyX3ZlcnNpb24oKSk7Ci0JICAgIHByaW50ZigiU2VydmVyIGJ1aWx0OiAgICVzXG4iLCBhcF9nZXRfc2VydmVyX2J1aWx0KCkpOwotCSAgICBkZXN0cm95X2FuZF9leGl0X3Byb2Nlc3MocHJvY2VzcywgMCk7Ci0JY2FzZSAnVic6Ci0JICAgIHNob3dfY29tcGlsZV9zZXR0aW5ncygpOwotCSAgICBkZXN0cm95X2FuZF9leGl0X3Byb2Nlc3MocHJvY2VzcywgMCk7Ci0JY2FzZSAnbCc6Ci0JICAgIGFwX3Nob3dfbW9kdWxlcygpOwotCSAgICBkZXN0cm95X2FuZF9leGl0X3Byb2Nlc3MocHJvY2VzcywgMCk7Ci0JY2FzZSAnTCc6Ci0JICAgIGFwX3Nob3dfZGlyZWN0aXZlcygpOwotCSAgICBkZXN0cm95X2FuZF9leGl0X3Byb2Nlc3MocHJvY2VzcywgMCk7Ci0JY2FzZSAndCc6Ci0JICAgIGNvbmZpZ3Rlc3Rvbmx5ID0gMTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnaCc6Ci0JICAgIHVzYWdlKHByb2Nlc3MpOwotCWNhc2UgJz8nOgotCSAgICB1c2FnZShwcm9jZXNzKTsKLQl9Ci0gICAgfQotCi0gICAgYXBfY3JlYXRlX2NvbnRleHQoJnBsb2csIHBnbG9iYWwpOwotICAgIGFwX2NyZWF0ZV9jb250ZXh0KCZwdGVtcCwgcGNvbmYpOwotCi0gICAgLyogTm90ZSB0aGF0IHdlIHByZWZsaWdodCB0aGUgY29uZmlnIGZpbGUgb25jZQotICAgICAgIGJlZm9yZSByZWFkaW5nIGl0IF9hZ2Fpbl8gaW4gdGhlIG1haW4gbG9vcC4KLSAgICAgICBUaGlzIGFsbG93cyB0aGluZ3MsIGxvZyBmaWxlcyBjb25maWd1cmF0aW9uIAotICAgICAgIGZvciBleGFtcGxlLCB0byBzZXR0bGUgZG93bi4gKi8KLQotICAgIGFwX3NlcnZlcl9yb290ID0gZGVmX3NlcnZlcl9yb290OwotICAgIGFwX3J1bl9wcmVfY29uZmlnKHBjb25mLCBwbG9nLCBwdGVtcCk7Ci0gICAgc2VydmVyX2NvbmYgPSBhcF9yZWFkX2NvbmZpZyhwcm9jZXNzLCBwdGVtcCwgY29uZm5hbWUpOwotICAgIGlmIChjb25maWd0ZXN0b25seSkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgIlN5bnRheCBPS1xuIik7Ci0JZGVzdHJveV9hbmRfZXhpdF9wcm9jZXNzKHByb2Nlc3MsIDApOwotICAgIH0KLSNpZmRlZiBXSU4zMgotICAgIGlmIChzaWduYWwpIHsKLSAgICAgICAgYXBfc2lnbmFsX3BhcmVudChwY29uZiwgc2lnbmFsLCBhcF9zZXJ2ZXJfcm9vdCk7Ci0gICAgICAgIGRlc3Ryb3lfYW5kX2V4aXRfcHJvY2Vzcyhwcm9jZXNzLCAwKTsKLSAgICB9Ci0jZW5kaWYKLSAgICBhcF9jbGVhcl9wb29sKHBsb2cpOwotICAgIGFwX3J1bl9vcGVuX2xvZ3MocGNvbmYsIHBsb2csIHB0ZW1wLCBzZXJ2ZXJfY29uZik7Ci0gICAgYXBfcG9zdF9jb25maWdfaG9vayhwY29uZiwgcGxvZywgcHRlbXAsIHNlcnZlcl9jb25mKTsKLSAgICBhcF9kZXN0cm95X3Bvb2wocHRlbXApOwotCi0gICAgZm9yICg7OykgewotCWFwX2NsZWFyX3Bvb2wocGNvbmYpOwotCWFwX2NyZWF0ZV9jb250ZXh0KCZwdGVtcCwgcGNvbmYpOwotCWFwX3NlcnZlcl9yb290ID0gZGVmX3NlcnZlcl9yb290OwotCWFwX3J1bl9wcmVfY29uZmlnKHBjb25mLCBwbG9nLCBwdGVtcCk7Ci0Jc2VydmVyX2NvbmYgPSBhcF9yZWFkX2NvbmZpZyhwcm9jZXNzLCBwdGVtcCwgY29uZm5hbWUpOwotCWFwX2NsZWFyX3Bvb2wocGxvZyk7Ci0JYXBfcnVuX29wZW5fbG9ncyhwY29uZiwgcGxvZywgcHRlbXAsIHNlcnZlcl9jb25mKTsKLQlhcF9wb3N0X2NvbmZpZ19ob29rKHBjb25mLCBwbG9nLCBwdGVtcCwgc2VydmVyX2NvbmYpOwotCWFwX2Rlc3Ryb3lfcG9vbChwdGVtcCk7Ci0KLQlpZiAoYXBfbXBtX3J1bihwY29uZiwgcGxvZywgc2VydmVyX2NvbmYpKSBicmVhazsKLSAgICB9Ci0gICAgZGVzdHJveV9hbmRfZXhpdF9wcm9jZXNzKHByb2Nlc3MsIDApOwotICAgIHJldHVybiAwOyAvKiBTdXByZXNzIGNvbXBpbGVyIHdhcm5pbmcuICovCi19Ci0KLS8qIGZvcmNlIEV4cGF0IHRvIGJlIGxpbmtlZCBpbnRvIHRoZSBzZXJ2ZXIgZXhlY3V0YWJsZSAqLwotI2lmIGRlZmluZWQoVVNFX0VYUEFUKSAmJiAhZGVmaW5lZChTSEFSRURfQ09SRV9CT09UU1RSQVApCi0jaW5jbHVkZSAieG1scGFyc2UuaCIKLWNvbnN0IFhNTF9MQ2hhciAqc3Vja19pbl9leHBhdCh2b2lkKTsKLWNvbnN0IFhNTF9MQ2hhciAqc3Vja19pbl9leHBhdCh2b2lkKQotewotICAgIHJldHVybiBYTUxfRXJyb3JTdHJpbmcoWE1MX0VSUk9SX05PTkUpOwotfQotI2VuZGlmIC8qIFVTRV9FWFBBVCAqLwotCi0jaWZuZGVmIFNIQVJFRF9DT1JFX0JPT1RTVFJBUAotLyoKLSAqIEZvcmNlIGFwX3ZhbGlkYXRlX3Bhc3N3b3JkKCkgaW50byB0aGUgaW1hZ2Ugc28gdGhhdCBtb2R1bGVzIGxpa2UKLSAqIG1vZF9hdXRoIGNhbiB1c2UgaXQgZXZlbiBpZiB0aGV5J3JlIGR5bmFtaWNhbGx5IGxvYWRlZC4KLSAqLwotdm9pZCBzdWNrX2luX2FwX3ZhbGlkYXRlX3Bhc3N3b3JkKHZvaWQpOwotdm9pZCBzdWNrX2luX2FwX3ZhbGlkYXRlX3Bhc3N3b3JkKHZvaWQpCi17Ci0gICAgYXBfdmFsaWRhdGVfcGFzc3dvcmQoImEiLCAiYiIpOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vLmN2c2lnbm9yZSBiL3NlcnZlci9tcG0vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjN2E3Yy4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYWtlZmlsZQpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9NUE0uTkFNSU5HIGIvc2VydmVyL21wbS9NUE0uTkFNSU5HCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTI4ODFiLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vTVBNLk5BTUlORworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLUZvciByaWdodCBub3csIHRoZSBuYW1pbmcgb2YgdGhlIE1QTSBtZXRob2RzIGZvbGxvd3MKLXRoZSBmb2xsb3dpbmcgZXhhbXBsZSBmb3IgdGhlICdwcmVmb3JrJyBtZXRob2QuCi0KLSAgMS4gVGhlIGRpcmVjdG9yeSBuYW1lIHVuZGVyIG1vZHVsZXMvbXBtIGlzIHRoZSBhY3R1YWwKLSAgICAgbmFtZS4KLQotICAgICAgIGVnOiBtb2R1bGVzL21wbS9wcmVmb3JrCi0KLSAgMi4gVGhlIGludGVybmFsIG1vZHVsZSBuYW1lIG11c3QgYmUgdGhhdCBuYW1lLCBwcmVwZW5kZWQgd2l0aAotICAgICBtcG1fIGFuZCBzdWZmaXhlZCB3aXRoIF9tb2R1bGUKLQotICAgICAgIGVnOiBtcG1fcHJlZm9ya19tb2R1bGUKLQotICAzLiBUaGUgTWFrZWZpbGUudG1wbCBtdXN0IGNyZWF0ZSBsaWI8bmFtZT4uYQotCi0gICAgICAgZWc6IGxpYnByZWZvcmsuYQotCi1OdW1iZXJzIDEgYW5kIDMgZm9sbG93IHRoZSBub3JtYWwgcnVsZXMgKGZvciBleGFtcGxlLCBtb2R1bGVzL3N0YW5kYXJkCi1jcmVhdGVzIGxpYnN0YW5kYXJkLmEsIGV0Yy4uLikuCi0KLVRoZSBNUE1fTUVUSE9EIFJ1bGUgd2lsbCB1c2UgdGhlIGFjdHVhbCBuYW1lIChlZzogcHJlZm9yaykgdG8KLXBpY2sgdGhlIGNvcnJlY3QgbWV0aG9kIG1vZHVsZSB0byBidWlsZC4KLQotVGhlIGZvbGxvd2luZyBNUE1zIGN1cnJlbnRseSBleGlzdDoKLQotICBwcmVmb3JrIC4uLi4uLi4gTXVsdGkgIFByb2Nlc3MgTW9kZWwgd2l0aCBQcmVmb3JraW5nIChBcGFjaGUgMS4zKQotICBkZXh0ZXIgLi4uLi4uLi4gTXVsdGkgIFByb2Nlc3MgTW9kZWwgd2l0aCBUaHJlYWRpbmcgdmlhIFB0aHJlYWRzCi0gICAgICAgICAgICAgICAgICBDb25zdGFudCBudW1iZXIgb2YgcHJvY2Vzc2VzLCB2YXJpYWJsZSBudW1iZXIgb2YgdGhyZWFkcwotICBtcG10X3B0aHJlYWQgLi4gTXVsdGkgIFByb2Nlc3MgTW9kZWwgd2l0aCBUaHJlYWRpbmcgdmlhIFB0aHJlYWRzCi0gICAgICAgICAgICAgICAgICBWYXJpYWJsZSBudW1iZXIgb2YgcHJvY2Vzc2VzLCBjb25zdGFudCBudW1iZXIgb2YKLSAgICAgICAgICAgICAgICAgIHRocmVhZHMvY2hpbGQgKD0gQXBhY2hlL3B0aHJlYWQpCi0gIHNwbXRfb3MyIC4uLi4uLiBTaW5nbGUgUHJvY2VzcyBNb2RlbCB3aXRoIFRocmVhZGluZyBvbiBPUy8yCi0gIHdpbm50IC4uLi4uLi4uLiBTaW5nbGUgUHJvY2VzcyBNb2RlbCB3aXRoIFRocmVhZGluZyBvbiBXaW5kb3dzIE5UCi0KZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vTWFrZWZpbGUuaW4gYi9zZXJ2ZXIvbXBtL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjY3OGU4Li4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQotREVQVEggICAgID0gLi4vLi4KLXRvcHNyY2RpciA9IEB0b3BzcmNkaXJACi1zcmNkaXIgICAgPSBAc3JjZGlyQAotVlBBVEggICAgID0gQHNyY2RpckAKLQotU1VCRElSUyA9ICQoTVBNX05BTUUpCi0KLWluY2x1ZGUgJCh0b3BzcmNkaXIpL2J1aWxkL3J1bGVzLm1rCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL2NvbmZpZy5tNCBiL3NlcnZlci9tcG0vY29uZmlnLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjA2Mjc5Li4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vY29uZmlnLm00CisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotQUNfTVNHX0NIRUNLSU5HKHdoaWNoIE1QTSB0byB1c2UpCi1BQ19BUkdfV0lUSChtcG0sCi1bICAtLXdpdGgtbXBtPU1QTSAgICAgICAgICBDaG9vc2UgdGhlIHByb2Nlc3MgbW9kZWwgZm9yIEFwYWNoZSB0byB1c2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1QTT17ZGV4dGVyLG1wbXRfYmVvcyxtcG10X3B0aHJlYWQscHJlZm9ya31dLFsKLSAgQVBBQ0hFX01QTT0kd2l0aHZhbAotXSxbCi0gIEFQQUNIRV9NUE09bXBtdF9wdGhyZWFkCi1dKQotQUNfTVNHX1JFU1VMVCgkQVBBQ0hFX01QTSkKLQotYXBhY2hlX2N2X21wbT0kQVBBQ0hFX01QTQotCQotaWYgdGVzdCAiJGFwYWNoZV9jdl9tcG0iID0gIm1wbXRfcHRocmVhZCIgLW8gIiRhcGFjaGVfY3ZfbXBtIiA9ICJkZXh0ZXIiOyB0aGVuCi0gIFBUSFJFQURTX0NIRUNLCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIHdoaWNoIHRocmVhZGluZyBsaWJyYXJ5IHRvIHVzZV0pCi0gIEFDX01TR19SRVNVTFQoJHRocmVhZHNfcmVzdWx0KQotCi0gIGlmIHRlc3QgIiRhcGFjaGVfdGhyZWFkc193b3JraW5nIiA9ICJubyI7IHRoZW4KLSAgICBBQ19NU0dfUkVTVUxUKFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgTVBNIHJlcXVpcmVzIHB0aHJlYWRzIHdoaWNoIHlvdXIgc3lzdGVtIHNlZW1zIHRvIGxhY2spCi0gICAgQUNfTVNHX0NIRUNLSU5HKGNoZWNraW5nIGZvciByZXBsYWNlbWVudCkKLSAgICBBQ19NU0dfUkVTVUxUKHByZWZvcmsgc2VsZWN0ZWQpCi0gICAgYXBhY2hlX2N2X21wbT1wcmVmb3JrCi0gIGZpCi1maQotCi1BUEFDSEVfQ0hFQ0tfU0hNX1JXCi0KLUFQQUNIRV9GQVNUX09VVFBVVChtb2R1bGVzL21wbS9NYWtlZmlsZSkKLU1QTV9OQU1FPSRhcGFjaGVfY3ZfbXBtCi1NUE1fRElSPW1vZHVsZXMvbXBtLyRNUE1fTkFNRQotTVBNX0xJQj0kTVBNX0RJUi9saWIke01QTV9OQU1FfS5sYQotCi1BUEFDSEVfU1VCU1QoTVBNX05BTUUpCi1NT0RMSVNUPSIkTU9ETElTVCBtcG1fJHtNUE1fTkFNRX0iCi0KLWRubCBBbGwgdGhlIHVuaXggTVBNcyB1c2Ugc2hhcmVkIG1lbW9yeTsgc2F2ZSBhIGxpdHRsZSBkdXBsaWNhdGlvbgotQUNfREVGVU4oQVBBQ0hFX01QTV9DSEVDS19TSE1FTSwgWwotICAgIEFDX0NIRUNLX0ZVTkNTKHNobWdldCkKLSAgICBBQ19GVU5DX01NQVAKLSAgICAKLSAgICBBQ19NU0dfQ0hFQ0tJTkcod2hpY2ggc2hhcmVkIG1lbW9yeSBtZWNoYW5pc20gdG8gdXNlKQotICAgIGlmIHRlc3QgIiRhY19jdl9mdW5jX3NobWdldCIgPSAieWVzIiA7IHRoZW4KLSAgICAgICAgQUNfREVGSU5FKFVTRV9TSE1HRVRfU0NPUkVCT0FSRCwsCi0gICAgICAgICAgICBbRGVmaW5lIGlmIE1QTXMgc2hvdWxkIHVzZSBzaG1nZXQgdG8gaW1wbGVtZW50IHRoZWlyIHNoYXJlZCBtZW1vcnldKQotICAgICAgICBBQ19NU0dfUkVTVUxUKHNobWdldCkKLSAgICBlbGlmIHRlc3QgIiRhY19jdl9mdW5jX21tYXAiID0gInllcyIgOyB0aGVuCi0gICAgICAgIEFDX0RFRklORShVU0VfTU1BUF9TQ09SRUJPQVJELCwKLSAgICAgICAgICAgIFtEZWZpbmUgaWYgTVBNcyBzaG91bGQgdXNlIG1tYXAgdG8gaW1wbGVtZW50IHRoZWlyIHNoYXJlZCBtZW1vcnldKQotICAgICAgICBBQ19NU0dfUkVTVUxUKG1tYXApCi0gICAgZWxzZQotICAgICAgICBBQ19NU0dfRVJST1IoTm8ga25vd24gc2hhcmVkIG1lbW9yeSBzeXN0ZW0pCi0gICAgZmkKLV0pCi0KLWRubCBDaGVjayBmb3IgcHRocmVhZHMgYW5kIGF0dGVtcHQgdG8gc3VwcG9ydCBpdAotQUNfREVGVU4oQVBBQ0hFX01QTV9QVEhSRUFELCBbCi0KLWRubCBYWFggLSBXZSBzaG91bGQgYmUgY2hlY2tpbmcgZm9yIHRoZSBwcm9wZXIgZmxhZ3MgdG8gdXNlIG9uIGEgcGFydGljdWxhciAKLWRubCBwbGF0Zm9ybS4gVGhpcyB3aWxsIGNvdmVyIGEgY291cGxlIG9mIHRoZW0sIGFueXdheQotCi0gICAgQUNfQ0hFQ0tfSEVBREVSKHB0aHJlYWQuaCwgWyBdLFsKLSAgICAgICAgQUNfTVNHX0VSUk9SKFRoaXMgTVBNIHJlcXVpcmVzIHB0aHJlYWRzLiBUcnkgLS13aXRoLW1wbT1wcmVmb3JrLikKLSAgICBdKQotICAgIEFDX0NIRUNLX0ZVTkMocHRocmVhZF9jcmVhdGUsIFsgXSxbCi0gICAgICAgIEFDX01TR19FUlJPUihDYW4ndCBjb21waWxlIHB0aHJlYWQgY29kZS4pCi0gICAgXSkKLQotICAgIGRubCBVc2VyIHRocmVhZHMgbGlicmFyaWVzIG5lZWQgcHRocmVhZC5oIGluY2x1ZGVkIGV2ZXJ5d2hlcmUKLSAgICBBQ19ERUZJTkUoUFRIUkVBRF9FVkVSWVdIRVJFLCwKLSAgICAgICAgW0RlZmluZSBpZiBhbGwgY29kZSBzaG91bGQgaGF2ZSAjaW5jbHVkZSA8cHRocmVhZC5oPl0pCi1dKQpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9kZXh0ZXIvLmN2c2lnbm9yZSBiL3NlcnZlci9tcG0vZGV4dGVyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MWY2NmYuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9kZXh0ZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotKi5sbwotKi5sYQotTWFrZWZpbGUKZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vZGV4dGVyL01ha2VmaWxlLmluIGIvc2VydmVyL21wbS9kZXh0ZXIvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3M2MzMGQuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9kZXh0ZXIvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0KLURFUFRIICAgICA9IC4uLy4uLy4uCi10b3BzcmNkaXIgPSBAdG9wc3JjZGlyQAotc3JjZGlyICAgID0gQHNyY2RpckAKLVZQQVRIICAgICA9IEBzcmNkaXJACi0KLUxUTElCUkFSWV9OQU1FICAgID0gbGliZGV4dGVyLmxhCi1MVExJQlJBUllfU09VUkNFUyA9IGRleHRlci5jIHNjb3JlYm9hcmQuYwotCi1pbmNsdWRlICQodG9wc3JjZGlyKS9idWlsZC9sdGxpYi5tawpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9kZXh0ZXIvTWFrZWZpbGUubGliZGlyIGIvc2VydmVyL21wbS9kZXh0ZXIvTWFrZWZpbGUubGliZGlyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjUyNTQwLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vZGV4dGVyL01ha2VmaWxlLmxpYmRpcgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVGhpcyBpcyBhIHBsYWNlLWhvbGRlciB3aGljaCBpbmRpY2F0ZXMgdG8gQ29uZmlndXJlIHRoYXQgaXQgc2hvdWxkbid0Ci1wcm92aWRlIHRoZSBkZWZhdWx0IHRhcmdldHMgd2hlbiBidWlsZGluZyB0aGUgTWFrZWZpbGUgaW4gdGhpcyBkaXJlY3RvcnkuCi1JbnN0ZWFkIGl0J2xsIGp1c3QgcHJlcGVuZCBhbGwgdGhlIGltcG9ydGFudCB2YXJpYWJsZSBkZWZpbml0aW9ucywgYW5kCi1jb3B5IHRoZSBNYWtlZmlsZS50bXBsIG9udG8gdGhlIGVuZC4KZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vZGV4dGVyL2NvbmZpZy5tNCBiL3NlcnZlci9tcG0vZGV4dGVyL2NvbmZpZy5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM1MDkzOC4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL2RleHRlci9jb25maWcubTQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1kbmwgIyMgWFhYIC0gTmVlZCBhIG1vcmUgdGhvcm91Z2ggY2hlY2sgb2YgdGhlIHByb3BlciBmbGFncyB0byB1c2UKLQotaWYgdGVzdCAiJE1QTV9OQU1FIiA9ICJkZXh0ZXIiIDsgdGhlbgotICAgIGFjX2N2X2VuYWJsZV90aHJlYWRzPSJ5ZXMiCi0gICAgQUNfQ0FDSEVfU0FWRQotCi0gICAgQVBBQ0hFX0ZBU1RfT1VUUFVUKG1vZHVsZXMvbXBtLyRNUE1fTkFNRS9NYWtlZmlsZSkKLSAgICBBUEFDSEVfTVBNX1BUSFJFQUQKLSAgICBBUEFDSEVfTVBNX0NIRUNLX1NITUVNCi1maQpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9kZXh0ZXIvZGV4dGVyLmMgYi9zZXJ2ZXIvbXBtL2RleHRlci9kZXh0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE0ZWQ2Mi4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL2RleHRlci9kZXh0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MTkgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCi0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgCi0gKiBhcmUgbWV0OiAKLSAqIAotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgCi0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuICAKLSAqIAotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgCi0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIAotICogICAgZGlzdHJpYnV0aW9uLiAKLSAqIAotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIAotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6IAotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cCAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iIAotICogCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvIAotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCi0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuIAotICogCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiAKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4gCi0gKiAKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcgCi0gKiAgICBhY2tub3dsZWRnbWVudDogCi0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwIAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIgCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWSAKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUiAKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCi0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSAKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCAKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKLSAqIAotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkgCi0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQgCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uIAotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlciAKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LiAKLSAqIAotICovIAotIAotI2RlZmluZSBDT1JFX1BSSVZBVEUgCi0gCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiYXByX3BvcnRhYmxlLmgiCi0jaW5jbHVkZSAiaHR0cGQuaCIgCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiIAotI2luY2x1ZGUgImh0dHBfbG9nLmgiIAotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCS8qIGZvciByZWFkX2NvbmZpZyAqLyAKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIJCS8qIGZvciBnZXRfcmVtb3RlX2hvc3QgKi8gCi0jaW5jbHVkZSAiaHR0cF9jb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAiYXBfbXBtLmgiCi0jaW5jbHVkZSAidW5peGQuaCIKLSNpbmNsdWRlICJpb2xfc29ja2V0LmgiCi0jaW5jbHVkZSAiYXBfbGlzdGVuLmgiCi0jaW5jbHVkZSAibXBtX2RlZmF1bHQuaCIKLSNpbmNsdWRlICJkZXh0ZXIuaCIKLSNpbmNsdWRlICJzY29yZWJvYXJkLmgiCi0KLSNpbmNsdWRlIDxwb2xsLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4gCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0vKgotICogQWN0dWFsIGRlZmluaXRpb25zIG9mIGNvbmZpZyBnbG9iYWxzCi0gKi8KLQotc3RhdGljIGludCB0aHJlYWRzX3RvX3N0YXJ0ID0gMDsgICAgICAgICAvKiBXb3JrZXIgdGhyZWFkcyBwZXIgY2hpbGQgKi8KLXN0YXRpYyBpbnQgbWluX3NwYXJlX3RocmVhZHMgPSAwOwotc3RhdGljIGludCBtYXhfc3BhcmVfdGhyZWFkcyA9IDA7Ci1zdGF0aWMgaW50IG1heF90aHJlYWRzID0gMDsKLXN0YXRpYyBpbnQgbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCA9IDA7Ci1zdGF0aWMgY2hhciAqYXBfcGlkX2ZuYW1lPU5VTEw7Ci1zdGF0aWMgaW50IG51bV9kYWVtb25zPTA7Ci1zdGF0aWMgaW50IHdvcmtlcnNfbWF5X2V4aXQgPSAwOwotc3RhdGljIGludCByZXF1ZXN0c190aGlzX2NoaWxkOwotc3RhdGljIGludCBudW1fbGlzdGVuZmRzID0gMDsKLXN0YXRpYyBzdHJ1Y3QgcG9sbGZkICpsaXN0ZW5mZHM7Ci0KLS8qIFRhYmxlIG9mIGNoaWxkIHN0YXR1cyAqLwotI2RlZmluZSBTRVJWRVJfREVBRCAwCi0jZGVmaW5lIFNFUlZFUl9EWUlORyAxCi0jZGVmaW5lIFNFUlZFUl9BTElWRSAyCi0KLXN0YXRpYyBzdHJ1Y3QgewotICAgIHBpZF90IHBpZDsKLSAgICB1bnNpZ25lZCBjaGFyIHN0YXR1czsKLX0gY2hpbGRfdGFibGVbSEFSRF9TRVJWRVJfTElNSVRdOwotCi0vKgotICogVGhlIG1heCBjaGlsZCBzbG90IGV2ZXIgYXNzaWduZWQsIHByZXNlcnZlZCBhY3Jvc3MgcmVzdGFydHMuICBOZWNlc3NhcnkKLSAqIHRvIGRlYWwgd2l0aCBOdW1TZXJ2ZXJzIGNoYW5nZXMgYWNyb3NzIFNJR1dJTkNIIHJlc3RhcnRzLiAgV2UgdXNlIHRoaXMKLSAqIHZhbHVlIHRvIG9wdGltaXplIHJvdXRpbmVzIHRoYXQgaGF2ZSB0byBzY2FuIHRoZSBlbnRpcmUgY2hpbGQgdGFibGUuCi0gKgotICogWFhYIC0gSXQgbWlnaHQgbm90IGJlIHdvcnRoIGtlZXBpbmcgdGhpcyBjb2RlIGluLiBUaGVyZSBhcmVuJ3QgdmVyeQotICogbWFueSBjaGlsZCBwcm9jZXNzZXMgaW4gdGhpcyBNUE0uCi0gKi8KLWludCBtYXhfZGFlbW9uc19saW1pdCA9IC0xOwotCi1zdGF0aWMgY2hhciBhcF9jb3JlZHVtcF9kaXJbTUFYX1NUUklOR19MRU5dOwotCi1zdGF0aWMgaW50IHBpcGVfb2ZfZGVhdGhbMl07Ci1zdGF0aWMgcHRocmVhZF9tdXRleF90IHBpcGVfb2ZfZGVhdGhfbXV0ZXg7Ci0KLS8qICpOb24qLXNoYXJlZCBodHRwX21haW4gZ2xvYmFscy4uLiAqLwotCi1zdGF0aWMgc2VydmVyX3JlYyAqc2VydmVyX2NvbmY7Ci0KLS8qIG9uZV9wcm9jZXNzIC0tLSBkZWJ1Z2dpbmcgbW9kZSB2YXJpYWJsZTsgY2FuIGJlIHNldCBmcm9tIHRoZSBjb21tYW5kIGxpbmUKLSAqIHdpdGggdGhlIC1YIGZsYWcuICBJZiBzZXQsIHRoaXMgZ2V0cyB5b3UgdGhlIGNoaWxkX21haW4gbG9vcCBydW5uaW5nCi0gKiBpbiB0aGUgcHJvY2VzcyB3aGljaCBvcmlnaW5hbGx5IHN0YXJ0ZWQgdXAgKG5vIGRldGFjaCwgbm8gbWFrZV9jaGlsZCksCi0gKiB3aGljaCBpcyBhIHByZXR0eSBuaWNlIGRlYnVnZ2luZyBlbnZpcm9ubWVudC4gIChZb3UnbGwgZ2V0IGEgU0lHSFVQCi0gKiBlYXJseSBpbiBzdGFuZGFsb25lX21haW47IGp1c3QgY29udGludWUgdGhyb3VnaC4gIFRoaXMgaXMgdGhlIHNlcnZlcgotICogdHJ5aW5nIHRvIGtpbGwgb2ZmIGFueSBjaGlsZCBwcm9jZXNzZXMgd2hpY2ggaXQgbWlnaHQgaGF2ZSBseWluZwotICogYXJvdW5kIC0tLSBBcGFjaGUgZG9lc24ndCBrZWVwIHRyYWNrIG9mIHRoZWlyIHBpZHMsIGl0IGp1c3Qgc2VuZHMKLSAqIFNJR0hVUCB0byB0aGUgcHJvY2VzcyBncm91cCwgaWdub3JpbmcgaXQgaW4gdGhlIHJvb3QgcHJvY2Vzcy4KLSAqIENvbnRpbnVlIHRocm91Z2ggYW5kIHlvdSdsbCBiZSBmaW5lLikuCi0gKi8KLQotc3RhdGljIGludCBvbmVfcHJvY2VzcyA9IDA7Ci0KLSNpZmRlZiBERUJVR19TSUdTVE9QCi1pbnQgcmFpc2Vfc2lnc3RvcF9mbGFnczsKLSNlbmRpZgotCi0jaWZkZWYgSEFTX09USEVSX0NISUxECi0vKiB1c2VkIHRvIG1haW50YWluIGxpc3Qgb2YgY2hpbGRyZW4gd2hpY2ggYXJlbid0IHBhcnQgb2YgdGhlIGNoaWxkIHRhYmxlICovCi10eXBlZGVmIHN0cnVjdCBvdGhlcl9jaGlsZF9yZWMgb3RoZXJfY2hpbGRfcmVjOwotc3RydWN0IG90aGVyX2NoaWxkX3JlYyB7Ci0gICAgb3RoZXJfY2hpbGRfcmVjICpuZXh0OwotICAgIGludCBwaWQ7Ci0gICAgdm9pZCAoKm1haW50ZW5hbmNlKSAoaW50LCB2b2lkICosIGFwX3dhaXRfdCk7Ci0gICAgdm9pZCAqZGF0YTsKLSAgICBpbnQgd3JpdGVfZmQ7Ci19Owotc3RhdGljIG90aGVyX2NoaWxkX3JlYyAqb3RoZXJfY2hpbGRyZW47Ci0jZW5kaWYKLQotc3RhdGljIGFwX2NvbnRleHRfdCAqcGNvbmY7CQkvKiBQb29sIGZvciBjb25maWcgc3R1ZmYgKi8KLXN0YXRpYyBhcF9jb250ZXh0X3QgKnBjaGlsZDsJCS8qIFBvb2wgZm9yIGh0dHBkIGNoaWxkIHN0dWZmICovCi1zdGF0aWMgYXBfY29udGV4dF90ICp0aHJlYWRfcG9vbF9wYXJlbnQ7IC8qIFBhcmVudCBvZiBwZXItdGhyZWFkIHBvb2xzICovCi1zdGF0aWMgcHRocmVhZF9tdXRleF90IHRocmVhZF9wb29sX3BhcmVudF9tdXRleDsKLQotc3RhdGljIGludCBjaGlsZF9udW07Ci1zdGF0aWMgaW50IG15X3BpZDsgLyogTGludXggZ2V0cGlkKCkgZG9lc24ndCB3b3JrIGV4Y2VwdCBpbiBtYWluIHRocmVhZC4gVXNlCi0gICAgICAgICAgICAgICAgICAgICAgdGhpcyBpbnN0ZWFkICovCi0vKiBLZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgY3VycmVudGx5IGFjdGl2ZSAqLwotc3RhdGljIGludCB3b3JrZXJfdGhyZWFkX2NvdW50Owotc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCB3b3JrZXJfdGhyZWFkX2NvdW50X211dGV4Owotc3RhdGljIGludCB3b3JrZXJfdGhyZWFkX2ZyZWVfaWRzW0hBUkRfVEhSRUFEX0xJTUlUXTsKLXN0YXRpYyBwdGhyZWFkX2F0dHJfdCB3b3JrZXJfdGhyZWFkX2F0dHI7Ci0KLS8qIEtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBpZGxlIHdvcmtlciB0aHJlYWRzICovCi1zdGF0aWMgaW50IGlkbGVfdGhyZWFkX2NvdW50Owotc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBpZGxlX3RocmVhZF9jb3VudF9tdXRleDsKLQotLyogTG9ja3MgZm9yIGFjY2VwdCBzZXJpYWxpemF0aW9uICovCi0jaWZkZWYgTk9fU0VSSUFMSVpFRF9BQ0NFUFQKLSNkZWZpbmUgU0FGRV9BQ0NFUFQoc3RtdCkgQVBSX1NVQ0NFU1MKLSNlbHNlCi0jZGVmaW5lIFNBRkVfQUNDRVBUKHN0bXQpIChzdG10KQotc3RhdGljIGFwX2xvY2tfdCAqcHJvY2Vzc19hY2NlcHRfbXV0ZXg7Ci0jZW5kaWYgLyogTk9fU0VSSUFMSVpFRF9BQ0NFUFQgKi8KLXN0YXRpYyBjaGFyICpsb2NrX2ZuYW1lOwotc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCB0aHJlYWRfYWNjZXB0X211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKLQotLyogR2xvYmFsLCBhbGFzLCBzbyBodHRwX2NvcmUgY2FuIHRhbGsgdG8gdXMgKi8KLWVudW0gc2VydmVyX3Rva2VuX3R5cGUgYXBfc2VydmVyX3Rva2VucyA9IFNydlRrX0ZVTEw7Ci0KLUFQSV9FWFBPUlQoY29uc3Qgc2VydmVyX3JlYyAqKSBhcF9nZXRfc2VydmVyX2NvbmYodm9pZCkKLXsKLSAgICByZXR1cm4gKHNlcnZlcl9jb25mKTsKLX0KLQotLyogYSBjbGVhbiBleGl0IGZyb20gYSBjaGlsZCB3aXRoIHByb3BlciBjbGVhbnVwICovCi1zdGF0aWMgdm9pZCBjbGVhbl9jaGlsZF9leGl0KGludCBjb2RlKQotewotICAgIGlmIChwY2hpbGQpIHsKLQlhcF9kZXN0cm95X3Bvb2wocGNoaWxkKTsKLSAgICB9Ci0gICAgZXhpdChjb2RlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBkZWFsaW5nIHdpdGggb3RoZXIgY2hpbGRyZW4KLSAqLwotCi0jaWZkZWYgSEFTX09USEVSX0NISUxECi1BUElfRVhQT1JUKHZvaWQpIGFwX3JlZ2lzdGVyX290aGVyX2NoaWxkKGludCBwaWQsCi0JCSAgICAgICB2b2lkICgqbWFpbnRlbmFuY2UpIChpbnQgcmVhc29uLCB2b2lkICosIGFwX3dhaXRfdCBzdGF0dXMpLAotCQkJICB2b2lkICpkYXRhLCBpbnQgd3JpdGVfZmQpCi17Ci0gICAgb3RoZXJfY2hpbGRfcmVjICpvY3I7Ci0KLSAgICBvY3IgPSBhcF9wYWxsb2MocGNvbmYsIHNpemVvZigqb2NyKSk7Ci0gICAgb2NyLT5waWQgPSBwaWQ7Ci0gICAgb2NyLT5tYWludGVuYW5jZSA9IG1haW50ZW5hbmNlOwotICAgIG9jci0+ZGF0YSA9IGRhdGE7Ci0gICAgb2NyLT53cml0ZV9mZCA9IHdyaXRlX2ZkOwotICAgIG9jci0+bmV4dCA9IG90aGVyX2NoaWxkcmVuOwotICAgIG90aGVyX2NoaWxkcmVuID0gb2NyOwotfQotCi0vKiBub3RlIHRoYXQgc2luY2UgdGhpcyBjYW4gYmUgY2FsbGVkIGJ5IGEgbWFpbnRlbmFuY2UgZnVuY3Rpb24gd2hpbGUgd2UncmUKLSAqIHNjYW5uaW5nIHRoZSBvdGhlcl9jaGlsZHJlbiBsaXN0LCBhbGwgc2Nhbm5lcnMgc2hvdWxkIHByb3RlY3QgdGhlbXNlbGYKLSAqIGJ5IGxvYWRpbmcgb2NyLT5uZXh0IGJlZm9yZSBjYWxsaW5nIGFueSBtYWludGVuYW5jZSBmdW5jdGlvbi4KLSAqLwotQVBJX0VYUE9SVCh2b2lkKSBhcF91bnJlZ2lzdGVyX290aGVyX2NoaWxkKHZvaWQgKmRhdGEpCi17Ci0gICAgb3RoZXJfY2hpbGRfcmVjICoqcG9jciwgKm5vY3I7Ci0KLSAgICBmb3IgKHBvY3IgPSAmb3RoZXJfY2hpbGRyZW47ICpwb2NyOyBwb2NyID0gJigqcG9jciktPm5leHQpIHsKLQlpZiAoKCpwb2NyKS0+ZGF0YSA9PSBkYXRhKSB7Ci0JICAgIG5vY3IgPSAoKnBvY3IpLT5uZXh0OwotCSAgICAoKigqcG9jciktPm1haW50ZW5hbmNlKSAoT0NfUkVBU09OX1VOUkVHSVNURVIsICgqcG9jciktPmRhdGEsIC0xKTsKLQkgICAgKnBvY3IgPSBub2NyOwotCSAgICAvKiBYWFg6IHVtLCB3ZWxsIHdlJ3ZlIGp1c3Qgd2FzdGVkIHNvbWUgc3BhY2UgaW4gcGNvbmYgPyAqLwotCSAgICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotLyogdGVzdCB0byBlbnN1cmUgdGhhdCB0aGUgd3JpdGVfZmRzIGFyZSBhbGwgc3RpbGwgd3JpdGFibGUsIG90aGVyd2lzZQotICogaW52b2tlIHRoZSBtYWludGVuYW5jZSBmdW5jdGlvbnMgYXMgYXBwcm9wcmlhdGUgKi8KLXN0YXRpYyB2b2lkIHByb2JlX3dyaXRhYmxlX2Zkcyh2b2lkKQotewotICAgIHJldHVybjsKLSNpZiAwCi0gICAgZmRfc2V0IHdyaXRhYmxlX2ZkczsKLSAgICBpbnQgZmRfbWF4OwotICAgIG90aGVyX2NoaWxkX3JlYyAqb2NyLCAqbm9jcjsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICBpbnQgcmM7Ci0KLSAgICBpZiAob3RoZXJfY2hpbGRyZW4gPT0gTlVMTCkKLQlyZXR1cm47Ci0KLSAgICBmZF9tYXggPSAwOwotICAgIEZEX1pFUk8oJndyaXRhYmxlX2Zkcyk7Ci0gICAgZG8gewotCWZvciAob2NyID0gb3RoZXJfY2hpbGRyZW47IG9jcjsgb2NyID0gb2NyLT5uZXh0KSB7Ci0JICAgIGlmIChvY3ItPndyaXRlX2ZkID09IC0xKQotCQljb250aW51ZTsKLQkgICAgRkRfU0VUKG9jci0+d3JpdGVfZmQsICZ3cml0YWJsZV9mZHMpOwotCSAgICBpZiAob2NyLT53cml0ZV9mZCA+IGZkX21heCkgewotCQlmZF9tYXggPSBvY3ItPndyaXRlX2ZkOwotCSAgICB9Ci0JfQotCWlmIChmZF9tYXggPT0gMCkKLQkgICAgcmV0dXJuOwotCi0JdHYudHZfc2VjID0gMDsKLQl0di50dl91c2VjID0gMDsKLQlyYyA9IGFwX3NlbGVjdChmZF9tYXggKyAxLCBOVUxMLCAmd3JpdGFibGVfZmRzLCBOVUxMLCAmdHYpOwotICAgIH0gd2hpbGUgKHJjID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgIGlmIChyYyA9PSAtMSkgewotCS8qIFhYWDogdWhoIHRoaXMgY291bGQgYmUgcmVhbGx5IGJhZCwgd2UgY291bGQgaGF2ZSBhIGJhZCBmaWxlCi0JICogZGVzY3JpcHRvciBkdWUgdG8gYSBidWcgaW4gb25lIG9mIHRoZSBtYWludGVuYW5jZSByb3V0aW5lcyAqLwotCWFwX2xvZ191bml4ZXJyKCJwcm9iZV93cml0YWJsZV9mZHMiLCAic2VsZWN0IiwKLQkJICAgICJjb3VsZCBub3QgcHJvYmUgd3JpdGFibGUgZmRzIiwgc2VydmVyX2NvbmYpOwotCXJldHVybjsKLSAgICB9Ci0gICAgaWYgKHJjID09IDApCi0JcmV0dXJuOwotCi0gICAgZm9yIChvY3IgPSBvdGhlcl9jaGlsZHJlbjsgb2NyOyBvY3IgPSBub2NyKSB7Ci0Jbm9jciA9IG9jci0+bmV4dDsKLQlpZiAob2NyLT53cml0ZV9mZCA9PSAtMSkKLQkgICAgY29udGludWU7Ci0JaWYgKEZEX0lTU0VUKG9jci0+d3JpdGVfZmQsICZ3cml0YWJsZV9mZHMpKQotCSAgICBjb250aW51ZTsKLQkoKm9jci0+bWFpbnRlbmFuY2UpIChPQ19SRUFTT05fVU5XUklUQUJMRSwgb2NyLT5kYXRhLCAtMSk7Ci0gICAgfQotI2VuZGlmCi19Ci0KLS8qIHBvc3NpYmx5IHJlYXAgYW4gb3RoZXJfY2hpbGQsIHJldHVybiAwIGlmIHllcywgLTEgaWYgbm90ICovCi1zdGF0aWMgaW50IHJlYXBfb3RoZXJfY2hpbGQoaW50IHBpZCwgYXBfd2FpdF90IHN0YXR1cykKLXsKLSAgICBvdGhlcl9jaGlsZF9yZWMgKm9jciwgKm5vY3I7Ci0KLSAgICBmb3IgKG9jciA9IG90aGVyX2NoaWxkcmVuOyBvY3I7IG9jciA9IG5vY3IpIHsKLQlub2NyID0gb2NyLT5uZXh0OwotCWlmIChvY3ItPnBpZCAhPSBwaWQpCi0JICAgIGNvbnRpbnVlOwotCW9jci0+cGlkID0gLTE7Ci0JKCpvY3ItPm1haW50ZW5hbmNlKSAoT0NfUkVBU09OX0RFQVRILCBvY3ItPmRhdGEsIHN0YXR1cyk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCByZWNsYWltX2NoaWxkX3Byb2Nlc3NlcyhpbnQgdGVybWluYXRlKQotewotICAgIGludCBpLCBzdGF0dXM7Ci0gICAgbG9uZyBpbnQgd2FpdHRpbWUgPSAxMDI0ICogMTY7CS8qIGluIHVzZWNzICovCi0gICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gICAgaW50IHdhaXRyZXQsIHRyaWVzOwotICAgIGludCBub3RfZGVhZF95ZXQ7Ci0jaWZkZWYgSEFTX09USEVSX0NISUxECi0gICAgb3RoZXJfY2hpbGRfcmVjICpvY3IsICpub2NyOwotI2VuZGlmCi0KLSAgICBmb3IgKHRyaWVzID0gdGVybWluYXRlID8gNCA6IDE7IHRyaWVzIDw9IDk7ICsrdHJpZXMpIHsKLQkvKiBkb24ndCB3YW50IHRvIGhvbGQgdXAgcHJvZ3Jlc3MgYW55IG1vcmUgdGhhbiAKLQkgKiBuZWNlc3NhcnksIGJ1dCB3ZSBuZWVkIHRvIGFsbG93IGNoaWxkcmVuIGEgZmV3IG1vbWVudHMgdG8gZXhpdC4KLQkgKiBTZXQgZGVsYXkgd2l0aCBhbiBleHBvbmVudGlhbCBiYWNrb2ZmLgotCSAqLwotCXR2LnR2X3NlYyA9IHdhaXR0aW1lIC8gMTAwMDAwMDsKLQl0di50dl91c2VjID0gd2FpdHRpbWUgJSAxMDAwMDAwOwotCXdhaXR0aW1lID0gd2FpdHRpbWUgKiA0OwotCWFwX3NlbGVjdCgwLCBOVUxMLCBOVUxMLCBOVUxMLCAmdHYpOwotCi0JLyogbm93IHNlZSB3aG8gaXMgZG9uZSAqLwotCW5vdF9kZWFkX3lldCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IG1heF9kYWVtb25zX2xpbWl0OyArK2kpIHsKLQkgICAgaW50IHBpZDsKLQotCSAgICBpZiAoY2hpbGRfdGFibGVbaV0uc3RhdHVzID09IFNFUlZFUl9ERUFEKQotCQljb250aW51ZTsKLQotICAgICAgICAgICAgcGlkID0gY2hpbGRfdGFibGVbaV0ucGlkOwotCi0JICAgIHdhaXRyZXQgPSB3YWl0cGlkKHBpZCwgJnN0YXR1cywgV05PSEFORyk7Ci0JICAgIGlmICh3YWl0cmV0ID09IHBpZCB8fCB3YWl0cmV0ID09IC0xKSB7Ci0JCWNoaWxkX3RhYmxlW2ldLnN0YXR1cyA9IFNFUlZFUl9ERUFEOwotCQljb250aW51ZTsKLQkgICAgfQotCSAgICArK25vdF9kZWFkX3lldDsKLQkgICAgc3dpdGNoICh0cmllcykgewotCSAgICBjYXNlIDE6ICAgICAvKiAgMTZtcyAqLwotCSAgICBjYXNlIDI6ICAgICAvKiAgODJtcyAqLwotCQlicmVhazsKLQkgICAgY2FzZSAzOiAgICAgLyogMzQ0bXMgKi8KLQkgICAgY2FzZSA0OiAgICAgLyogIDE2bXMgKi8KLQkgICAgY2FzZSA1OiAgICAgLyogIDgybXMgKi8KLQkgICAgY2FzZSA2OiAgICAgLyogMzQ0bXMgKi8KLQkgICAgY2FzZSA3OiAgICAgLyogMS40c2VjICovCi0JCS8qIG9rLCBub3cgaXQncyBiZWluZyBhbm5veWluZyAqLwotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLCBlcnJubywKLQkJCSAgICBzZXJ2ZXJfY29uZiwKLQkJICAgImNoaWxkIHByb2Nlc3MgJWQgc3RpbGwgZGlkIG5vdCBleGl0LCBzZW5kaW5nIGEgU0lHVEVSTSIsCi0JCQkgICAgcGlkKTsKLQkJa2lsbChwaWQsIFNJR1RFUk0pOwotCQlicmVhazsKLQkgICAgY2FzZSA4OiAgICAgLyogIDYgc2VjICovCi0JCS8qIGRpZSBjaGlsZCBzY3VtICovCi0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgZXJybm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9jb25mLAotCQkgICAiY2hpbGQgcHJvY2VzcyAlZCBzdGlsbCBkaWQgbm90IGV4aXQsIHNlbmRpbmcgYSBTSUdLSUxMIiwKLQkJCSAgICBwaWQpOwotCQlraWxsKHBpZCwgU0lHS0lMTCk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDk6ICAgICAvKiAxNCBzZWMgKi8KLQkJLyogZ2F2ZSBpdCBvdXIgYmVzdCBzaG90LCBidXQgYWxhcy4uLiAgSWYgdGhpcyByZWFsbHkgCi0JCSAqIGlzIGEgY2hpbGQgd2UgYXJlIHRyeWluZyB0byBraWxsIGFuZCBpdCByZWFsbHkgaGFzbid0Ci0JCSAqIGV4aXRlZCwgd2Ugd2lsbCBsaWtlbHkgZmFpbCB0byBiaW5kIHRvIHRoZSBwb3J0Ci0JCSAqIGFmdGVyIHRoZSByZXN0YXJ0LgotCQkgKi8KLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCBlcnJubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2NvbmYsCi0JCQkgICAgImNvdWxkIG5vdCBtYWtlIGNoaWxkIHByb2Nlc3MgJWQgZXhpdCwgIgotCQkJICAgICJhdHRlbXB0aW5nIHRvIGNvbnRpbnVlIGFueXdheSIsIHBpZCk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotI2lmZGVmIEhBU19PVEhFUl9DSElMRAotCWZvciAob2NyID0gb3RoZXJfY2hpbGRyZW47IG9jcjsgb2NyID0gbm9jcikgewotCSAgICBub2NyID0gb2NyLT5uZXh0OwotCSAgICBpZiAob2NyLT5waWQgPT0gLTEpCi0JCWNvbnRpbnVlOwotCi0JICAgIHdhaXRyZXQgPSB3YWl0cGlkKG9jci0+cGlkLCAmc3RhdHVzLCBXTk9IQU5HKTsKLQkgICAgaWYgKHdhaXRyZXQgPT0gb2NyLT5waWQpIHsKLQkJb2NyLT5waWQgPSAtMTsKLQkJKCpvY3ItPm1haW50ZW5hbmNlKSAoT0NfUkVBU09OX0RFQVRILCBvY3ItPmRhdGEsIHN0YXR1cyk7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAod2FpdHJldCA9PSAwKSB7Ci0JCSgqb2NyLT5tYWludGVuYW5jZSkgKE9DX1JFQVNPTl9SRVNUQVJULCBvY3ItPmRhdGEsIC0xKTsKLQkJKytub3RfZGVhZF95ZXQ7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAod2FpdHJldCA9PSAtMSkgewotCQkvKiB1aCB3aGF0IHRoZSBoZWNrPyB0aGV5IGRpZG4ndCBjYWxsIHVucmVnaXN0ZXI/ICovCi0JCW9jci0+cGlkID0gLTE7Ci0JCSgqb2NyLT5tYWludGVuYW5jZSkgKE9DX1JFQVNPTl9MT1NULCBvY3ItPmRhdGEsIC0xKTsKLQkgICAgfQotCX0KLSNlbmRpZgotCWlmICghbm90X2RlYWRfeWV0KSB7Ci0JICAgIC8qIG5vdGhpbmcgbGVmdCB0byB3YWl0IGZvciAqLwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotfQotCi0vKiBGaW5hbGx5LCB0aGlzIHJvdXRpbmUgaXMgdXNlZCBieSB0aGUgY2FyZXRha2VyIHByb2Nlc3MgdG8gd2FpdCBmb3IKLSAqIGEgd2hpbGUuLi4KLSAqLwotCi0vKiBudW1iZXIgb2YgY2FsbHMgdG8gd2FpdF9vcl90aW1lb3V0IGJldHdlZW4gd3JpdGFibGUgcHJvYmVzICovCi0jaWZuZGVmIElOVEVSVkFMX09GX1dSSVRBQkxFX1BST0JFUwotI2RlZmluZSBJTlRFUlZBTF9PRl9XUklUQUJMRV9QUk9CRVMgMTAKLSNlbmRpZgotc3RhdGljIGludCB3YWl0X29yX3RpbWVvdXRfY291bnRlcjsKLQotc3RhdGljIGludCB3YWl0X29yX3RpbWVvdXQoYXBfd2FpdF90ICpzdGF0dXMpCi17Ci0gICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gICAgaW50IHJldDsKLQotICAgICsrd2FpdF9vcl90aW1lb3V0X2NvdW50ZXI7Ci0gICAgaWYgKHdhaXRfb3JfdGltZW91dF9jb3VudGVyID09IElOVEVSVkFMX09GX1dSSVRBQkxFX1BST0JFUykgewotCXdhaXRfb3JfdGltZW91dF9jb3VudGVyID0gMDsKLSNpZmRlZiBIQVNfT1RIRVJfQ0hJTEQKLQlwcm9iZV93cml0YWJsZV9mZHMoKTsKLSNlbmRpZgotICAgIH0KLSAgICByZXQgPSB3YWl0cGlkKC0xLCBzdGF0dXMsIFdOT0hBTkcpOwotICAgIGlmIChyZXQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpIHsKLQlyZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChyZXQgPiAwKSB7Ci0JcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgdHYudHZfc2VjID0gU0NPUkVCT0FSRF9NQUlOVEVOQU5DRV9JTlRFUlZBTCAvIDEwMDAwMDA7Ci0gICAgdHYudHZfdXNlYyA9IFNDT1JFQk9BUkRfTUFJTlRFTkFOQ0VfSU5URVJWQUwgJSAxMDAwMDAwOwotICAgIGFwX3NlbGVjdCgwLCBOVUxMLCBOVUxMLCBOVUxMLCAmdHYpOwotICAgIHJldHVybiAtMTsKLX0KLQotLyogaGFuZGxlIGFsbCB2YXJpZXRpZXMgb2YgY29yZSBkdW1waW5nIHNpZ25hbHMgKi8KLXN0YXRpYyB2b2lkIHNpZ19jb3JlZHVtcChpbnQgc2lnKQotewotICAgIGNoZGlyKGFwX2NvcmVkdW1wX2Rpcik7Ci0gICAgc2lnbmFsKHNpZywgU0lHX0RGTCk7Ci0gICAga2lsbChnZXRwaWQoKSwgc2lnKTsKLSAgICAvKiBBdCB0aGlzIHBvaW50IHdlJ3ZlIGdvdCBzaWcgYmxvY2tlZCwgYmVjYXVzZSB3ZSdyZSBzdGlsbCBpbnNpZGUKLSAgICAgKiB0aGUgc2lnbmFsIGhhbmRsZXIuICBXaGVuIHdlIGxlYXZlIHRoZSBzaWduYWwgaGFuZGxlciBpdCB3aWxsCi0gICAgICogYmUgdW5ibG9ja2VkLCBhbmQgd2UnbGwgdGFrZSB0aGUgc2lnbmFsLi4uIGFuZCBjb3JlZHVtcCBvciB3aGF0ZXZlcgotICAgICAqIGlzIGFwcHJvcHJpYXRlIGZvciB0aGlzIHBhcnRpY3VsYXIgVW5peC4gIEluIGFkZGl0aW9uIHRoZSBwYXJlbnQKLSAgICAgKiB3aWxsIHNlZSB0aGUgcmVhbCBzaWduYWwgd2UgcmVjZWl2ZWQgLS0gd2hlcmVhcyBpZiB3ZSBjYWxsZWQKLSAgICAgKiBhYm9ydCgpIGhlcmUsIHRoZSBwYXJlbnQgd291bGQgb25seSBzZWUgU0lHQUJSVC4KLSAgICAgKi8KLX0KLQotc3RhdGljIHZvaWQganVzdF9kaWUoaW50IHNpZykKLXsKLSAgICBjbGVhbl9jaGlsZF9leGl0KDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbm5lY3Rpb24gc3RydWN0dXJlcyBhbmQgYWNjb3VudGluZy4uLgotICovCi0KLS8qIHZvbGF0aWxlIGp1c3QgaW4gY2FzZSAqLwotc3RhdGljIGludCB2b2xhdGlsZSBzaHV0ZG93bl9wZW5kaW5nOwotc3RhdGljIGludCB2b2xhdGlsZSByZXN0YXJ0X3BlbmRpbmc7Ci1zdGF0aWMgaW50IHZvbGF0aWxlIGlzX2dyYWNlZnVsOwotCi0vKgotICogYXBfc3RhcnRfc2h1dGRvd24oKSBhbmQgYXBfc3RhcnRfcmVzdGFydCgpLCBiZWxvdywgYXJlIGEgZmlyc3Qgc3RhYiBhdAotICogZnVuY3Rpb25zIHRvIGluaXRpYXRlIHNodXRkb3duIG9yIHJlc3RhcnQgd2l0aG91dCByZWx5aW5nIG9uIHNpZ25hbHMuIAotICogUHJldmlvdXNseSB0aGlzIHdhcyBpbml0aWF0ZWQgaW4gc2lnX3Rlcm0oKSBhbmQgcmVzdGFydCgpIHNpZ25hbCBoYW5kbGVycywgCi0gKiBidXQgd2Ugd2FudCB0byBiZSBhYmxlIHRvIHN0YXJ0IGEgc2h1dGRvd24vcmVzdGFydCBmcm9tIG90aGVyIHNvdXJjZXMgLS0KLSAqIGUuZy4gb24gV2luMzIsIGZyb20gdGhlIHNlcnZpY2UgbWFuYWdlci4gTm93IHRoZSBzZXJ2aWNlIG1hbmFnZXIgY2FuCi0gKiBjYWxsIGFwX3N0YXJ0X3NodXRkb3duKCkgb3IgYXBfc3RhcnRfcmVzdGFydCgpIGFzIGFwcHJvcGlhdGUuICBOb3RlIHRoYXQKLSAqIHRoZXNlIGZ1bmN0aW9ucyBjYW4gYWxzbyBiZSBjYWxsZWQgYnkgdGhlIGNoaWxkIHByb2Nlc3Nlcywgc2luY2UgZ2xvYmFsCi0gKiB2YXJpYWJsZXMgYXJlIG5vIGxvbmdlciB1c2VkIHRvIHBhc3Mgb24gdGhlIHJlcXVpcmVkIGFjdGlvbiB0byB0aGUgcGFyZW50LgotICoKLSAqIFRoZXNlIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBwYXJlbnQgcHJvY2VzcyBpdHNlbGYsIHNpbmNlIHRoZQotICogcGFyZW50IHByb2Nlc3Mgd2lsbCB1c2UgdGhlIHNodXRkb3duX3BlbmRpbmcgYW5kIHJlc3RhcnRfcGVuZGluZyB2YXJpYWJsZXMKLSAqIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNodXRkb3duIG9yIHJlc3RhcnQuIFRoZSBjaGlsZCBwcm9jZXNzIHNob3VsZAotICogY2FsbCBzaWduYWxfcGFyZW50KCkgZGlyZWN0bHkgdG8gdGVsbCB0aGUgcGFyZW50IHRvIGRpZSAtLSB0aGlzIHdpbGwKLSAqIGNhdXNlIG5laXRoZXIgb2YgdGhvc2UgdmFyaWFibGUgdG8gYmUgc2V0LCB3aGljaCB0aGUgcGFyZW50IHdpbGwKLSAqIGFzc3VtZSBtZWFucyBzb21ldGhpbmcgc2VyaW91cyBpcyB3cm9uZyAod2hpY2ggaXQgd2lsbCBiZSwgZm9yIHRoZQotICogY2hpbGQgdG8gZm9yY2UgYW4gZXhpdCkgYW5kIHNvIGRvIGFuIGV4aXQgYW55d2F5LgotICovCi0KLXZvaWQgYXBfc3RhcnRfc2h1dGRvd24odm9pZCkKLXsKLSAgICBpZiAoc2h1dGRvd25fcGVuZGluZyA9PSAxKSB7Ci0JLyogVW0sIGlzIHRoaXMgX3Byb2JhYmx5XyBub3QgYW4gZXJyb3IsIGlmIHRoZSB1c2VyIGhhcwotCSAqIHRyaWVkIHRvIGRvIGEgc2h1dGRvd24gdHdpY2UgcXVpY2tseSwgc28gd2Ugd29uJ3QKLQkgKiB3b3JyeSBhYm91dCByZXBvcnRpbmcgaXQuCi0JICovCi0JcmV0dXJuOwotICAgIH0KLSAgICBzaHV0ZG93bl9wZW5kaW5nID0gMTsKLX0KLQotLyogZG8gYSBncmFjZWZ1bCByZXN0YXJ0IGlmIGdyYWNlZnVsID09IDEgKi8KLXZvaWQgYXBfc3RhcnRfcmVzdGFydChpbnQgZ3JhY2VmdWwpCi17Ci0KLSAgICBpZiAocmVzdGFydF9wZW5kaW5nID09IDEpIHsKLQkvKiBQcm9iYWJseSBub3QgYW4gZXJyb3IgLSBkb24ndCBib3RoZXIgcmVwb3J0aW5nIGl0ICovCi0JcmV0dXJuOwotICAgIH0KLSAgICByZXN0YXJ0X3BlbmRpbmcgPSAxOwotICAgIGlzX2dyYWNlZnVsID0gZ3JhY2VmdWw7Ci19Ci0KLXN0YXRpYyB2b2lkIHNpZ190ZXJtKGludCBzaWcpCi17Ci0gICAgYXBfc3RhcnRfc2h1dGRvd24oKTsKLX0KLQotc3RhdGljIHZvaWQgcmVzdGFydChpbnQgc2lnKQotewotI2lmbmRlZiBXSU4zMgotICAgIGFwX3N0YXJ0X3Jlc3RhcnQoc2lnID09IFNJR1dJTkNIKTsKLSNlbHNlCi0gICAgYXBfc3RhcnRfcmVzdGFydCgxKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBzZXRfc2lnbmFscyh2b2lkKQotewotI2lmbmRlZiBOT19VU0VfU0lHQUNUSU9OCi0gICAgc3RydWN0IHNpZ2FjdGlvbiBzYTsKLQotICAgIHNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsKLSAgICBzYS5zYV9mbGFncyA9IDA7Ci0KLSAgICBpZiAoIW9uZV9wcm9jZXNzKSB7Ci0Jc2Euc2FfaGFuZGxlciA9IHNpZ19jb3JlZHVtcDsKLSNpZiBkZWZpbmVkKFNBX09ORVNIT1QpCi0Jc2Euc2FfZmxhZ3MgPSBTQV9PTkVTSE9UOwotI2VsaWYgZGVmaW5lZChTQV9SRVNFVEhBTkQpCi0Jc2Euc2FfZmxhZ3MgPSBTQV9SRVNFVEhBTkQ7Ci0jZW5kaWYKLQlpZiAoc2lnYWN0aW9uKFNJR1NFR1YsICZzYSwgTlVMTCkgPCAwKQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR1NFR1YpIik7Ci0jaWZkZWYgU0lHQlVTCi0JaWYgKHNpZ2FjdGlvbihTSUdCVVMsICZzYSwgTlVMTCkgPCAwKQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR0JVUykiKTsKLSNlbmRpZgotI2lmZGVmIFNJR0FCT1JUCi0JaWYgKHNpZ2FjdGlvbihTSUdBQk9SVCwgJnNhLCBOVUxMKSA8IDApCi0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHQUJPUlQpIik7Ci0jZW5kaWYKLSNpZmRlZiBTSUdBQlJUCi0JaWYgKHNpZ2FjdGlvbihTSUdBQlJULCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdBQlJUKSIpOwotI2VuZGlmCi0jaWZkZWYgU0lHSUxMCi0JaWYgKHNpZ2FjdGlvbihTSUdJTEwsICZzYSwgTlVMTCkgPCAwKQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR0lMTCkiKTsKLSNlbmRpZgotCXNhLnNhX2ZsYWdzID0gMDsKLSAgICB9Ci0gICAgc2Euc2FfaGFuZGxlciA9IHNpZ190ZXJtOwotICAgIGlmIChzaWdhY3Rpb24oU0lHVEVSTSwgJnNhLCBOVUxMKSA8IDApCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdURVJNKSIpOwotI2lmZGVmIFNJR0lOVAotICAgIGlmIChzaWdhY3Rpb24oU0lHSU5ULCAmc2EsIE5VTEwpIDwgMCkKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdJTlQpIik7Ci0jZW5kaWYKLSNpZmRlZiBTSUdYQ1BVCi0gICAgc2Euc2FfaGFuZGxlciA9IFNJR19ERkw7Ci0gICAgaWYgKHNpZ2FjdGlvbihTSUdYQ1BVLCAmc2EsIE5VTEwpIDwgMCkKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR1hDUFUpIik7Ci0jZW5kaWYKLSNpZmRlZiBTSUdYRlNaCi0gICAgc2Euc2FfaGFuZGxlciA9IFNJR19ERkw7Ci0gICAgaWYgKHNpZ2FjdGlvbihTSUdYRlNaLCAmc2EsIE5VTEwpIDwgMCkKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR1hGU1opIik7Ci0jZW5kaWYKLSNpZmRlZiBTSUdQSVBFCi0gICAgc2Euc2FfaGFuZGxlciA9IFNJR19JR047Ci0gICAgaWYgKHNpZ2FjdGlvbihTSUdQSVBFLCAmc2EsIE5VTEwpIDwgMCkKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR1BJUEUpIik7Ci0jZW5kaWYKLQotICAgIC8qIHdlIHdhbnQgdG8gaWdub3JlIEhVUHMgYW5kIFdJTkNIIHdoaWxlIHdlJ3JlIGJ1c3kgcHJvY2Vzc2luZyBvbmUgKi8KLSAgICBzaWdhZGRzZXQoJnNhLnNhX21hc2ssIFNJR0hVUCk7Ci0gICAgc2lnYWRkc2V0KCZzYS5zYV9tYXNrLCBTSUdXSU5DSCk7Ci0gICAgc2Euc2FfaGFuZGxlciA9IHJlc3RhcnQ7Ci0gICAgaWYgKHNpZ2FjdGlvbihTSUdIVVAsICZzYSwgTlVMTCkgPCAwKQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHSFVQKSIpOwotICAgIGlmIChzaWdhY3Rpb24oU0lHV0lOQ0gsICZzYSwgTlVMTCkgPCAwKQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHV0lOQ0gpIik7Ci0jZWxzZQotICAgIGlmICghb25lX3Byb2Nlc3MpIHsKLQlzaWduYWwoU0lHU0VHViwgc2lnX2NvcmVkdW1wKTsKLSNpZmRlZiBTSUdCVVMKLQlzaWduYWwoU0lHQlVTLCBzaWdfY29yZWR1bXApOwotI2VuZGlmIC8qIFNJR0JVUyAqLwotI2lmZGVmIFNJR0FCT1JUCi0Jc2lnbmFsKFNJR0FCT1JULCBzaWdfY29yZWR1bXApOwotI2VuZGlmIC8qIFNJR0FCT1JUICovCi0jaWZkZWYgU0lHQUJSVAotCXNpZ25hbChTSUdBQlJULCBzaWdfY29yZWR1bXApOwotI2VuZGlmIC8qIFNJR0FCUlQgKi8KLSNpZmRlZiBTSUdJTEwKLQlzaWduYWwoU0lHSUxMLCBzaWdfY29yZWR1bXApOwotI2VuZGlmIC8qIFNJR0lMTCAqLwotI2lmZGVmIFNJR1hDUFUKLQlzaWduYWwoU0lHWENQVSwgU0lHX0RGTCk7Ci0jZW5kaWYgLyogU0lHWENQVSAqLwotI2lmZGVmIFNJR1hGU1oKLQlzaWduYWwoU0lHWEZTWiwgU0lHX0RGTCk7Ci0jZW5kaWYgLyogU0lHWEZTWiAqLwotICAgIH0KLQotICAgIHNpZ25hbChTSUdURVJNLCBzaWdfdGVybSk7Ci0jaWZkZWYgU0lHSFVQCi0gICAgc2lnbmFsKFNJR0hVUCwgcmVzdGFydCk7Ci0jZW5kaWYgLyogU0lHSFVQICovCi0jaWZkZWYgU0lHV0lOQ0gKLSAgICBzaWduYWwoU0lHV0lOQ0gsIHJlc3RhcnQpOwotI2VuZGlmIC8qIFNJR1dJTkNIICovCi0jaWZkZWYgU0lHUElQRQotICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKLSNlbmRpZiAvKiBTSUdQSVBFICovCi0KLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBwcm9jZXNzX2NoaWxkX3N0YXR1cyhpbnQgcGlkLCBhcF93YWl0X3Qgc3RhdHVzKQotewotICAgIC8qIENoaWxkIGRpZWQuLi4gaWYgaXQgZGllZCBkdWUgdG8gYSBmYXRhbCBlcnJvciwKLQkqIHdlIHNob3VsZCBzaW1wbHkgYmFpbCBvdXQuCi0JKi8KLSAgICBpZiAoKFdJRkVYSVRFRChzdGF0dXMpKSAmJgotCVdFWElUU1RBVFVTKHN0YXR1cykgPT0gQVBFWElUX0NISUxERkFUQUwpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlR8QVBMT0dfTk9FUlJOTywgZXJybm8sIHNlcnZlcl9jb25mLAotCQkJIkNoaWxkICVkIHJldHVybmVkIGEgRmF0YWwgZXJyb3IuLi4gXG4iCi0JCQkiQXBhY2hlIGlzIGV4aXRpbmchIiwKLQkJCXBpZCk7Ci0JZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotICAgIGlmIChXSUZTSUdOQUxFRChzdGF0dXMpKSB7Ci0Jc3dpdGNoIChXVEVSTVNJRyhzdGF0dXMpKSB7Ci0JY2FzZSBTSUdURVJNOgotCWNhc2UgU0lHSFVQOgotCWNhc2UgU0lHVVNSMToKLQljYXNlIFNJR0tJTEw6Ci0JICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0jaWZkZWYgU1lTX1NJR0xJU1QKLSNpZmRlZiBXQ09SRURVTVAKLQkgICAgaWYgKFdDT1JFRFVNUChzdGF0dXMpKSB7Ci0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwgZXJybm8sCi0JCQkgICAgIHNlcnZlcl9jb25mLAotCQkJICAgICAiY2hpbGQgcGlkICVkIGV4aXQgc2lnbmFsICVzICglZCksICIKLQkJCSAgICAgInBvc3NpYmxlIGNvcmVkdW1wIGluICVzIiwKLQkJCSAgICAgcGlkLCAoV1RFUk1TSUcoc3RhdHVzKSA+PSBOdW1TSUcpID8gIiIgOiAKLQkJCSAgICAgU1lTX1NJR0xJU1RbV1RFUk1TSUcoc3RhdHVzKV0sIFdURVJNU0lHKHN0YXR1cyksCi0JCQkgICAgIGFwX2NvcmVkdW1wX2Rpcik7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0jZW5kaWYKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCBlcnJubywKLQkJCSAgICAgc2VydmVyX2NvbmYsCi0JCQkgICAgICJjaGlsZCBwaWQgJWQgZXhpdCBzaWduYWwgJXMgKCVkKSIsIHBpZCwKLQkJCSAgICAgU1lTX1NJR0xJU1RbV1RFUk1TSUcoc3RhdHVzKV0sIFdURVJNU0lHKHN0YXR1cykpOwotI2lmZGVmIFdDT1JFRFVNUAotCSAgICB9Ci0jZW5kaWYKLSNlbHNlCi0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwgZXJybm8sCi0JCQkgc2VydmVyX2NvbmYsCi0JCQkgImNoaWxkIHBpZCAlZCBleGl0IHNpZ25hbCAlZCIsCi0JCQkgcGlkLCBXVEVSTVNJRyhzdGF0dXMpKTsKLSNlbmRpZgotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgc2V0dXBfbGlzdGVuZXJzKHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgYXBfbGlzdGVuX3JlYyAqbHI7Ci0gICAgaW50IG51bV9saXN0ZW5lcnMgPSAwOwotCi0gICAgaWYgKGFwX2xpc3Rlbl9vcGVuKHMtPnByb2Nlc3MsIHMtPnBvcnQpKSB7Ci0gICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGZvciAobHIgPSBhcF9saXN0ZW5lcnM7IGxyOyBsciA9IGxyLT5uZXh0KSB7Ci0gICAgICAgIG51bV9saXN0ZW5lcnMrKzsKLSAgICB9Ci0gICAgcmV0dXJuIG51bV9saXN0ZW5lcnM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSGVyZSBmb2xsb3dzIGEgbG9uZyBidW5jaCBvZiBnZW5lcmljIHNlcnZlciBib29ra2VlcGluZyBzdHVmZi4uLgotICovCi0KLSNpZiBkZWZpbmVkKFRDUF9OT0RFTEFZKSAmJiAhZGVmaW5lZChNUEUpICYmICFkZWZpbmVkKFRQRikKLXN0YXRpYyB2b2lkIHNvY2tfZGlzYWJsZV9uYWdsZShpbnQgcykKLXsKLSAgICAvKiBUaGUgTmFnbGUgYWxnb3JpdGhtIHNheXMgdGhhdCB3ZSBzaG91bGQgZGVsYXkgc2VuZGluZyBwYXJ0aWFsCi0gICAgICogcGFja2V0cyBpbiBob3BlcyBvZiBnZXR0aW5nIG1vcmUgZGF0YS4gIFdlIGRvbid0IHdhbnQgdG8gZG8KLSAgICAgKiB0aGlzOyB3ZSBhcmUgbm90IHRlbG5ldC4gIFRoZXJlIGFyZSBiYWQgaW50ZXJhY3Rpb25zIGJldHdlZW4KLSAgICAgKiBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGFuZCBOYWdsZSdzIGFsZ29yaXRobSB0aGF0IGhhdmUgdmVyeSBzZXZlcmUKLSAgICAgKiBwZXJmb3JtYW5jZSBwZW5hbHRpZXMuICAoRmFpbGluZyB0byBkaXNhYmxlIE5hZ2xlIGlzIG5vdCBtdWNoIG9mIGEKLSAgICAgKiBwcm9ibGVtIHdpdGggc2ltcGxlIEhUVFAuKQotICAgICAqCi0gICAgICogSW4gc3BpdGUgb2YgdGhlc2UgcHJvYmxlbXMsIGZhaWx1cmUgaGVyZSBpcyBub3QgYSBzaG9vdGluZyBvZmZlbnNlLgotICAgICAqLwotICAgIGludCBqdXN0X3NheV9ubyA9IDE7Ci0KLSAgICBpZiAoc2V0c29ja29wdChzLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIChjaGFyICopICZqdXN0X3NheV9ubywKLQkJICAgc2l6ZW9mKGludCkpIDwgMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgc2VydmVyX2NvbmYsCi0JCSAgICAic2V0c29ja29wdDogKFRDUF9OT0RFTEFZKSIpOwotICAgIH0KLX0KLQotI2Vsc2UKLSNkZWZpbmUgc29ja19kaXNhYmxlX25hZ2xlKHMpCS8qIE5PT1AgKi8KLSNlbmRpZgotCi1pbnQgYXBfZ3JhY2VmdWxfc3RvcF9zaWduYWxsZWQodm9pZCkKLXsKLSAgICAvKiBYWFggLSBEb2VzIHRoaXMgcmVhbGx5IHdvcms/IC0gTWFub2ogKi8KLSAgICByZXR1cm4gaXNfZ3JhY2VmdWw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ2hpbGQgcHJvY2VzcyBtYWluIGxvb3AuCi0gKi8KLQotc3RhdGljIHZvaWQgcHJvY2Vzc19zb2NrZXQoYXBfY29udGV4dF90ICpwLCBhcF9zb2NrZXRfdCAqc29jaywgbG9uZyBjb25uX2lkKQotewotICAgIEJVRkYgKmNvbm5faW87Ci0gICAgY29ubl9yZWMgKmN1cnJlbnRfY29ubjsKLSAgICBhcF9pb2wgKmlvbDsKLSAgICBpbnQgY3NkOwotICAgIGFwX3N0YXR1c190IHJ2OwotCi0gICAgaWYgKChydiA9IGFwX2dldF9vc19zb2NrKCZjc2QsIHNvY2spKSAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBydiwgTlVMTCwgImFwX2dldF9vc19zb2NrIik7Ci0gICAgfQotICAgIHNvY2tfZGlzYWJsZV9uYWdsZShjc2QpOwotCi0gICAgaW9sID0gdW5peF9hdHRhY2hfc29ja2V0KHNvY2spOwotICAgIGlmIChpb2wgPT0gTlVMTCkgewotICAgICAgICBpZiAoZXJybm8gPT0gRUJBREYpIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX1dBUk5JTkcsIGVycm5vLCBOVUxMLAotICAgICAgICAgICAgICAgICJmaWxlZGVzY3JpcHRvciAoJXUpIGxhcmdlciB0aGFuIEZEX1NFVFNJWkUgKCV1KSAiCi0gICAgICAgICAgICAgICAgImZvdW5kLCB5b3UgcHJvYmFibHkgbmVlZCB0byByZWJ1aWxkIEFwYWNoZSB3aXRoIGEgIgotICAgICAgICAgICAgICAgICJsYXJnZXIgRkRfU0VUU0laRSIsIGNzZCwgRkRfU0VUU0laRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIE5VTEwsCi0gICAgICAgICAgICAgICAgImVycm9yIGF0dGFjaGluZyB0byBzb2NrZXQiKTsKLSAgICAgICAgfQotICAgICAgICBhcF9jbG9zZV9zb2NrZXQoc29jayk7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIGNvbm5faW8gPSBhcF9iY3JlYXRlKHAsIEJfUkRXUik7Ci0gICAgYXBfYnB1c2hfaW9sKGNvbm5faW8sIGlvbCk7Ci0KLSAgICBjdXJyZW50X2Nvbm4gPSBhcF9uZXdfYXByX2Nvbm5lY3Rpb24ocCwgc2VydmVyX2NvbmYsIGNvbm5faW8sIHNvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5faWQpOwotCi0gICAgYXBfcHJvY2Vzc19jb25uZWN0aW9uKGN1cnJlbnRfY29ubik7Ci19Ci0KLXN0YXRpYyB2b2lkICp3b3JrZXJfdGhyZWFkKHZvaWQgKik7Ci0KLS8qIFN0YXJ0cyBhIHRocmVhZCBhcyBsb25nIGFzIHdlJ3JlIGJlbG93IG1heF90aHJlYWRzICovCi1zdGF0aWMgaW50IHN0YXJ0X3RocmVhZCh2b2lkKQotewotICAgIHB0aHJlYWRfdCB0aHJlYWQ7Ci0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJndvcmtlcl90aHJlYWRfY291bnRfbXV0ZXgpOwotICAgIGlmICh3b3JrZXJfdGhyZWFkX2NvdW50IDwgbWF4X3RocmVhZHMpIHsKLSAgICAgICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWQsICZ3b3JrZXJfdGhyZWFkX2F0dHIsIHdvcmtlcl90aHJlYWQsCi0JICAmd29ya2VyX3RocmVhZF9mcmVlX2lkc1t3b3JrZXJfdGhyZWFkX2NvdW50XSkpIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgZXJybm8sIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICJwdGhyZWFkX2NyZWF0ZTogdW5hYmxlIHRvIGNyZWF0ZSB3b3JrZXIgdGhyZWFkIik7Ci0gICAgICAgICAgICAvKiBJbiBjYXNlIHN5c3RlbSByZXNvdXJjZXMgYXJlIG1heHhlZCBvdXQsIHdlIGRvbid0IHdhbnQKLSAgICAgICAgICAgICAgIEFwYWNoZSBydW5uaW5nIGF3YXkgd2l0aCB0aGUgQ1BVIHRyeWluZyB0byBmb3JrIG92ZXIgYW5kCi0gICAgICAgICAgICAgICBvdmVyIGFuZCBvdmVyIGFnYWluIGlmIHdlIGV4aXQuICovCi0gICAgICAgICAgICBzbGVlcCgxMCk7Ci0gICAgICAgICAgICB3b3JrZXJzX21heV9leGl0ID0gMTsKLSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ3b3JrZXJfdGhyZWFkX2NvdW50X211dGV4KTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0JZWxzZSB7Ci0JICAgIHdvcmtlcl90aHJlYWRfY291bnQrKzsKLQl9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBzdGF0aWMgaW50IHJlcG9ydGVkID0gMDsKLSAgICAgICAgCi0gICAgICAgIGlmICghcmVwb3J0ZWQpIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgZXJybm8sIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgcmVhY2hlZCBNYXhUaHJlYWRzUGVyQ2hpbGQgc2V0dGluZywgY29uc2lkZXIgcmFpc2luZyB0aGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiBNYXhUaHJlYWRzUGVyQ2hpbGQgb3IgTnVtU2VydmVycyBzZXR0aW5ncyIpOwotICAgICAgICAgICAgcmVwb3J0ZWQgPSAxOwotICAgICAgICB9Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ3b3JrZXJfdGhyZWFkX2NvdW50X211dGV4KTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ3b3JrZXJfdGhyZWFkX2NvdW50X211dGV4KTsKLSAgICByZXR1cm4gMTsKLQotfQotLyogU2V0cyB3b3JrZXJzX21heV9leGl0IGlmIHdlIHJlY2VpdmVkIGEgY2hhcmFjdGVyIG9uIHRoZSBwaXBlX29mX2RlYXRoICovCi1zdGF0aWMgdm9pZCBjaGVja19waXBlX29mX2RlYXRoKHZvaWQpCi17Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZwaXBlX29mX2RlYXRoX211dGV4KTsKLSAgICBpZiAoIXdvcmtlcnNfbWF5X2V4aXQpIHsKLSAgICAgICAgaW50IHJldDsKLSAgICAgICAgY2hhciBwaXBlX3JlYWRfY2hhcjsKLQotICAgICAgICByZXQgPSByZWFkKGxpc3RlbmZkc1swXS5mZCwgJnBpcGVfcmVhZF9jaGFyLCAxKTsKLSAgICAgICAgaWYgKHJldCA9PSAtMSAmJiBlcnJubyA9PSBFQUdBSU4pIHsKLSAgICAgICAgICAgIC8qIEl0IGxvc3QgdGhlIGxvdHRlcnkuIEl0IG11c3QgY29udGludWUgdG8gc3VmZmVyCi0gICAgICAgICAgICAgKiB0aHJvdWdoIGEgbGlmZSBvZiBzZXJ2aXR1ZGUuICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiBJdCB3b24gdGhlIGxvdHRlcnkgKG9yIHNvbWV0aGluZyBlbHNlIGlzIHZlcnkKLSAgICAgICAgICAgICAqIHdyb25nKS4gRW1icmFjZSBkZWF0aCB3aXRoIG9wZW4gYXJtcy4gKi8KLSAgICAgICAgICAgIHdvcmtlcnNfbWF5X2V4aXQgPSAxOwotICAgICAgICB9Ci0gICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwaXBlX29mX2RlYXRoX211dGV4KTsKLX0KLQotLyogaWRsZV90aHJlYWRfY291bnQgc2hvdWxkIGJlIGluY3JlbWVudGVkIGJlZm9yZSBzdGFydGluZyBhIHdvcmtlcl90aHJlYWQgKi8KLQotc3RhdGljIHZvaWQgKndvcmtlcl90aHJlYWQodm9pZCAqYXJnKQotewotICAgIGFwX3NvY2tldF90ICpjc2QgPSBOVUxMOwotICAgIGFwX2NvbnRleHRfdCAqdHBvb2w7CQkvKiBQb29sIGZvciB0aGlzIHRocmVhZCAgICAgICAgICAgKi8KLSAgICBhcF9jb250ZXh0X3QgKnB0cmFuczsJCS8qIFBvb2wgZm9yIHBlci10cmFuc2FjdGlvbiBzdHVmZiAqLwotICAgIGFwX3NvY2tldF90ICpzZCA9IE5VTEw7Ci0gICAgaW50IHNydjsKLSAgICBpbnQgY3Vycl9wb2xsZmQsIGxhc3RfcG9sbGZkID0gMDsKLSAgICBpbnQgdGhyZWFkX2p1c3Rfc3RhcnRlZCA9IDE7Ci0gICAgaW50IHRocmVhZF9udW0gPSAqKChpbnQgKikgYXJnKTsKLSAgICBsb25nIGNvbm5faWQgPSBjaGlsZF9udW0gKiBIQVJEX1RIUkVBRF9MSU1JVCArIHRocmVhZF9udW07Ci0gICAgYXBfc3RhdHVzX3QgcnY7Ci0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJnRocmVhZF9wb29sX3BhcmVudF9tdXRleCk7Ci0gICAgYXBfY3JlYXRlX2NvbnRleHQoJnRwb29sLCB0aHJlYWRfcG9vbF9wYXJlbnQpOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0aHJlYWRfcG9vbF9wYXJlbnRfbXV0ZXgpOwotICAgIGFwX2NyZWF0ZV9jb250ZXh0KCZwdHJhbnMsIHRwb29sKTsKLQotICAgIHdoaWxlICghd29ya2Vyc19tYXlfZXhpdCkgewotICAgICAgICB3b3JrZXJzX21heV9leGl0IHw9IChtYXhfcmVxdWVzdHNfcGVyX2NoaWxkICE9IDApICYmIChyZXF1ZXN0c190aGlzX2NoaWxkIDw9IDApOwotICAgICAgICBpZiAod29ya2Vyc19tYXlfZXhpdCkgYnJlYWs7Ci0gICAgICAgIGlmICghdGhyZWFkX2p1c3Rfc3RhcnRlZCkgewotICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZpZGxlX3RocmVhZF9jb3VudF9tdXRleCk7Ci0gICAgICAgICAgICBpZiAoaWRsZV90aHJlYWRfY291bnQgPCBtYXhfc3BhcmVfdGhyZWFkcykgewotICAgICAgICAgICAgICAgIGlkbGVfdGhyZWFkX2NvdW50Kys7Ci0gICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmlkbGVfdGhyZWFkX2NvdW50X211dGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZpZGxlX3RocmVhZF9jb3VudF9tdXRleCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0aHJlYWRfanVzdF9zdGFydGVkID0gMDsKLSAgICAgICAgfQotICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJnRocmVhZF9hY2NlcHRfbXV0ZXgpOwotICAgICAgICBpZiAod29ya2Vyc19tYXlfZXhpdCkgewotICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnRocmVhZF9hY2NlcHRfbXV0ZXgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChydiA9IFNBRkVfQUNDRVBUKGFwX2xvY2socHJvY2Vzc19hY2NlcHRfbXV0ZXgpKSkKLSAgICAgICAgICAgICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkcsIHJ2LCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiYXBfbG9jayBmYWlsZWQuIEF0dGVtcHRpbmcgdG8gc2h1dGRvd24gIgotICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzIGdyYWNlZnVsbHkuIik7Ci0gICAgICAgICAgICB3b3JrZXJzX21heV9leGl0ID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICghd29ya2Vyc19tYXlfZXhpdCkgewotICAgICAgICAgICAgc3J2ID0gcG9sbChsaXN0ZW5mZHMsIG51bV9saXN0ZW5mZHMgKyAxLCAtMSk7Ci0KLSAgICAgICAgICAgIGlmIChzcnYgPCAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIHBvbGwoKSB3aWxsIG9ubHkgcmV0dXJuIGVycm9ycyBpbiBjYXRhc3Ryb3BoaWMKLSAgICAgICAgICAgICAgICAgKiBjaXJjdW1zdGFuY2VzLiBMZXQncyB0cnkgZXhpdGluZyBncmFjZWZ1bGx5LCBmb3Igbm93LiAqLwotICAgICAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGVycm5vLCAoY29uc3Qgc2VydmVyX3JlYyAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9nZXRfc2VydmVyX2NvbmYoKSwgInBvbGw6IChsaXN0ZW4pIik7Ci0gICAgICAgICAgICAgICAgd29ya2Vyc19tYXlfZXhpdCA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAod29ya2Vyc19tYXlfZXhpdCkgYnJlYWs7Ci0KLSAgICAgICAgICAgIGlmIChsaXN0ZW5mZHNbMF0ucmV2ZW50cyAmIFBPTExJTikgewotICAgICAgICAgICAgICAgIC8qIEEgcHJvY2VzcyBnb3QgYSBzaWduYWwgb24gdGhlIHNodXRkb3duIHBpcGUuIENoZWNrIGlmIHdlJ3JlCi0gICAgICAgICAgICAgICAgICogdGhlIGx1Y2t5IHByb2Nlc3MgdG8gZGllLiAqLwotICAgICAgICAgICAgICAgIGNoZWNrX3BpcGVfb2ZfZGVhdGgoKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG51bV9saXN0ZW5mZHMgPT0gMSkgewotICAgICAgICAgICAgICAgIHNkID0gYXBfbGlzdGVuZXJzLT5zZDsKLSAgICAgICAgICAgICAgICBnb3RvIGdvdF9mZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8qIGZpbmQgYSBsaXN0ZW5lciAqLwotICAgICAgICAgICAgICAgIGN1cnJfcG9sbGZkID0gbGFzdF9wb2xsZmQ7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBjdXJyX3BvbGxmZCsrOwotICAgICAgICAgICAgICAgICAgICBpZiAoY3Vycl9wb2xsZmQgPiBudW1fbGlzdGVuZmRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyX3BvbGxmZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogWFhYOiBTaG91bGQgd2UgY2hlY2sgZm9yIFBPTExFUlI/ICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5mZHNbY3Vycl9wb2xsZmRdLnJldmVudHMgJiBQT0xMSU4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfcG9sbGZkID0gY3Vycl9wb2xsZmQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9wdXRfb3Nfc29jaygmc2QsICZsaXN0ZW5mZHNbY3Vycl9wb2xsZmRdLmZkLCBwdHJhbnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBnb3RfZmQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IHdoaWxlIChjdXJyX3BvbGxmZCAhPSBsYXN0X3BvbGxmZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICBnb3RfZmQ6Ci0gICAgICAgIGlmICghd29ya2Vyc19tYXlfZXhpdCkgewotICAgICAgICAgICAgaWYgKChydiA9IGFwX2FjY2VwdCgmY3NkLCBzZCwgcHRyYW5zKSkgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBydiwgTlVMTCwgImFwX2FjY2VwdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChydiA9IFNBRkVfQUNDRVBUKGFwX3VubG9jayhwcm9jZXNzX2FjY2VwdF9tdXRleCkpKQotICAgICAgICAgICAgICAgICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCBydiwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcF91bmxvY2sgZmFpbGVkLiBBdHRlbXB0aW5nIHRvIHNodXRkb3duICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3MgZ3JhY2VmdWxseS4iKTsKLSAgICAgICAgICAgICAgICB3b3JrZXJzX21heV9leGl0ID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0aHJlYWRfYWNjZXB0X211dGV4KTsKLQkgICAgcHRocmVhZF9tdXRleF9sb2NrKCZpZGxlX3RocmVhZF9jb3VudF9tdXRleCk7Ci0gICAgICAgICAgICBpZiAoaWRsZV90aHJlYWRfY291bnQgPiBtaW5fc3BhcmVfdGhyZWFkcykgewotICAgICAgICAgICAgICAgIGlkbGVfdGhyZWFkX2NvdW50LS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0X3RocmVhZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlkbGVfdGhyZWFkX2NvdW50LS07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmlkbGVfdGhyZWFkX2NvdW50X211dGV4KTsKLSAgICAgICAgICAgIHByb2Nlc3Nfc29ja2V0KHB0cmFucywgY3NkLCBjb25uX2lkKTsKLSAgICAgICAgICAgIHJlcXVlc3RzX3RoaXNfY2hpbGQtLTsKLQl9IGVsc2UgewotICAgICAgICAgICAgaWYgKChydiA9IFNBRkVfQUNDRVBUKGFwX3VubG9jayhwcm9jZXNzX2FjY2VwdF9tdXRleCkpKQotICAgICAgICAgICAgICAgICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCBydiwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcF91bmxvY2sgZmFpbGVkLiBBdHRlbXB0aW5nIHRvIHNodXRkb3duICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3MgZ3JhY2VmdWxseS4iKTsKLSAgICAgICAgICAgICAgICB3b3JrZXJzX21heV9leGl0ID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0aHJlYWRfYWNjZXB0X211dGV4KTsKLQkgICAgcHRocmVhZF9tdXRleF9sb2NrKCZpZGxlX3RocmVhZF9jb3VudF9tdXRleCk7Ci0gICAgICAgICAgICBpZGxlX3RocmVhZF9jb3VudC0tOwotICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmlkbGVfdGhyZWFkX2NvdW50X211dGV4KTsKLQkgICAgYnJlYWs7Ci0JfQotICAgICAgICBhcF9jbGVhcl9wb29sKHB0cmFucyk7Ci0gICAgfQotCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZ0aHJlYWRfcG9vbF9wYXJlbnRfbXV0ZXgpOwotICAgIGFwX2Rlc3Ryb3lfY29udGV4dCh0cG9vbCk7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJnRocmVhZF9wb29sX3BhcmVudF9tdXRleCk7Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZ3b3JrZXJfdGhyZWFkX2NvdW50X211dGV4KTsKLSAgICB3b3JrZXJfdGhyZWFkX2NvdW50LS07Ci0gICAgd29ya2VyX3RocmVhZF9mcmVlX2lkc1t3b3JrZXJfdGhyZWFkX2NvdW50XSA9IHRocmVhZF9udW07Ci0gICAgaWYgKHdvcmtlcl90aHJlYWRfY291bnQgPT0gMCkgewotICAgICAgICAvKiBBbGwgdGhlIHRocmVhZHMgaGF2ZSBleGl0ZWQsIG5vdyBmaW5pc2ggdGhlIHNodXRkb3duIHByb2Nlc3MKLSAgICAgICAgICogYnkgc2lnbmFsbGluZyB0aGUgc2lnd2FpdCB0aHJlYWQgKi8KLSAgICAgICAga2lsbChteV9waWQsIFNJR1RFUk0pOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmd29ya2VyX3RocmVhZF9jb3VudF9tdXRleCk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgY2hpbGRfbWFpbihpbnQgY2hpbGRfbnVtX2FyZykKLXsKLSAgICBzaWdzZXRfdCBzaWdfbWFzazsKLSAgICBpbnQgc2lnbmFsX3JlY2VpdmVkOwotICAgIGludCBpOwotICAgIGFwX2xpc3Rlbl9yZWMgKmxyOwotICAgIGFwX3N0YXR1c190IHJ2OwotCi0gICAgbXlfcGlkID0gZ2V0cGlkKCk7Ci0gICAgY2hpbGRfbnVtID0gY2hpbGRfbnVtX2FyZzsKLSAgICBhcF9jcmVhdGVfY29udGV4dCgmcGNoaWxkLCBwY29uZik7Ci0KLSAgICAvKnN0dWZmIHRvIGRvIGJlZm9yZSB3ZSBzd2l0Y2ggaWQncywgc28gd2UgaGF2ZSBwZXJtaXNzaW9ucy4qLwotCi0gICAgcnYgPSBTQUZFX0FDQ0VQVChhcF9jaGlsZF9pbml0X2xvY2soJnByb2Nlc3NfYWNjZXB0X211dGV4LCBsb2NrX2ZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaGlsZCkpOwotICAgIGlmIChydiAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkcsIHJ2LCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBpbml0aWFsaXplIGNyb3NzLXByb2Nlc3MgbG9jayBpbiBjaGlsZCIpOwotICAgICAgICBjbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci0KLSAgICBpZiAodW5peGRfc2V0dXBfY2hpbGQoKSkgewotCWNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotICAgIH0KLQotICAgIGFwX2NoaWxkX2luaXRfaG9vayhwY2hpbGQsIHNlcnZlcl9jb25mKTsKLQotICAgIC8qZG9uZSB3aXRoIGluaXQgY3JpdGljYWwgc2VjdGlvbiAqLwotCi0gICAgLyogQWxsIHRocmVhZHMgc2hvdWxkIG1hc2sgc2lnbmFscyBvdXQsIGFjY29yaW5nIHRvIHNpZ3dhaXQoMikgbWFuIHBhZ2UgKi8KLSAgICBzaWdmaWxsc2V0KCZzaWdfbWFzayk7Ci0KLSAgICBpZiAocHRocmVhZF9zaWdtYXNrKFNJR19TRVRNQVNLLCAmc2lnX21hc2ssIE5VTEwpICE9IDApIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJULCBlcnJubywgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAicHRocmVhZF9zaWdtYXNrIik7Ci0gICAgfQotCi0gICAgcmVxdWVzdHNfdGhpc19jaGlsZCA9IG1heF9yZXF1ZXN0c19wZXJfY2hpbGQ7Ci0gICAgCi0gICAgLyogU2V0IHVwIHRoZSBwb2xsZmQgYXJyYXkgKi8KLSAgICBsaXN0ZW5mZHMgPSBhcF9wYWxsb2MocGNoaWxkLCBzaXplb2Yoc3RydWN0IHBvbGxmZCkgKiAobnVtX2xpc3RlbmZkcyArIDEpKTsKLSAgICBsaXN0ZW5mZHNbMF0uZmQgPSBwaXBlX29mX2RlYXRoWzBdOwotICAgIGxpc3RlbmZkc1swXS5ldmVudHMgPSBQT0xMSU47Ci0gICAgbGlzdGVuZmRzWzBdLnJldmVudHMgPSAwOwotICAgIGZvciAobHIgPSBhcF9saXN0ZW5lcnMsIGkgPSAxOyBpIDw9IG51bV9saXN0ZW5mZHM7IGxyID0gbHItPm5leHQsICsraSkgewotICAgICAgICBhcF9nZXRfb3Nfc29jaygmbGlzdGVuZmRzW2ldLmZkLCBsci0+c2QpOwotICAgICAgICBsaXN0ZW5mZHNbaV0uZXZlbnRzID0gUE9MTElOOyAvKiBzaG91bGQgd2UgYWRkIFBPTExQUkkgPyovCi0gICAgICAgIGxpc3RlbmZkc1tpXS5yZXZlbnRzID0gMDsKLSAgICB9Ci0KLSAgICAvKiBTZXR1cCB3b3JrZXIgdGhyZWFkcyAqLwotCi0gICAgaWYgKHRocmVhZHNfdG9fc3RhcnQgPiBtYXhfdGhyZWFkcykgewotICAgICAgICB0aHJlYWRzX3RvX3N0YXJ0ID0gbWF4X3RocmVhZHM7Ci0gICAgfQotICAgIGlkbGVfdGhyZWFkX2NvdW50ID0gdGhyZWFkc190b19zdGFydDsKLSAgICB3b3JrZXJfdGhyZWFkX2NvdW50ID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbWF4X3RocmVhZHM7IGkrKykgewotICAgICAgICB3b3JrZXJfdGhyZWFkX2ZyZWVfaWRzW2ldID0gaTsKLSAgICB9Ci0gICAgYXBfY3JlYXRlX2NvbnRleHQoJnRocmVhZF9wb29sX3BhcmVudCwgcGNoaWxkKTsKLSAgICBwdGhyZWFkX211dGV4X2luaXQoJnRocmVhZF9wb29sX3BhcmVudF9tdXRleCwgTlVMTCk7Ci0gICAgcHRocmVhZF9tdXRleF9pbml0KCZpZGxlX3RocmVhZF9jb3VudF9tdXRleCwgTlVMTCk7Ci0gICAgcHRocmVhZF9tdXRleF9pbml0KCZ3b3JrZXJfdGhyZWFkX2NvdW50X211dGV4LCBOVUxMKTsKLSAgICBwdGhyZWFkX211dGV4X2luaXQoJnBpcGVfb2ZfZGVhdGhfbXV0ZXgsIE5VTEwpOwotICAgIHB0aHJlYWRfYXR0cl9pbml0KCZ3b3JrZXJfdGhyZWFkX2F0dHIpOwotICAgIHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmd29ya2VyX3RocmVhZF9hdHRyLCBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCk7Ci0KLSAgICAvKiBXZSBhcmUgY3JlYXRpbmcgd29ya2VyIHRocmVhZHMgcmlnaHQgbm93ICovCi0gICAgZm9yIChpPTA7IGkgPCB0aHJlYWRzX3RvX3N0YXJ0OyBpKyspIHsKLSAgICAgICAgLyogc3RhcnRfdGhyZWFkIHNob3VsZG4ndCBmYWlsIGhlcmUgKi8KLSAgICAgICAgaWYgKCFzdGFydF90aHJlYWQoKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBUaGlzIHRocmVhZCB3aWxsIGJlIHRoZSBvbmUgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIHNpZ25hbHMgKi8KLSAgICBzaWdlbXB0eXNldCgmc2lnX21hc2spOwotICAgIHNpZ2FkZHNldCgmc2lnX21hc2ssIFNJR1RFUk0pOwotICAgIHNpZ2FkZHNldCgmc2lnX21hc2ssIFNJR0lOVCk7Ci0gICAgc2lnd2FpdCgmc2lnX21hc2ssICZzaWduYWxfcmVjZWl2ZWQpOwotICAgIHN3aXRjaCAoc2lnbmFsX3JlY2VpdmVkKSB7Ci0gICAgICAgIGNhc2UgU0lHVEVSTToKLSAgICAgICAgY2FzZSBTSUdJTlQ6Ci0gICAgICAgICAgICBqdXN0X2RpZShzaWduYWxfcmVjZWl2ZWQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlQsIGVycm5vLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICJyZWNlaXZlZCBpbXBvc3NpYmxlIHNpZ25hbDogJWQiLCBzaWduYWxfcmVjZWl2ZWQpOwotICAgICAgICAgICAganVzdF9kaWUoU0lHVEVSTSk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IG1ha2VfY2hpbGQoc2VydmVyX3JlYyAqcywgaW50IHNsb3QsIHRpbWVfdCBub3cpCi17Ci0gICAgaW50IHBpZDsKLQotICAgIGlmIChzbG90ICsgMSA+IG1heF9kYWVtb25zX2xpbWl0KSB7Ci0gICAgICAgIG1heF9kYWVtb25zX2xpbWl0ID0gc2xvdCArIDE7Ci0gICAgfQotCi0gICAgaWYgKG9uZV9wcm9jZXNzKSB7Ci0Jc2V0X3NpZ25hbHMoKTsKLSAgICAgICAgY2hpbGRfdGFibGVbc2xvdF0ucGlkID0gZ2V0cGlkKCk7Ci0gICAgICAgIGNoaWxkX3RhYmxlW3Nsb3RdLnN0YXR1cyA9IFNFUlZFUl9BTElWRTsKLQljaGlsZF9tYWluKHNsb3QpOwotICAgIH0KLQotICAgIGlmICgocGlkID0gZm9yaygpKSA9PSAtMSkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgcywKLSAgICAgICAgICAgICAgICAgICAgICJmb3JrOiBVbmFibGUgdG8gZm9yayBuZXcgcHJvY2VzcyIpOwotCS8qIEluIGNhc2Ugc3lzdGVtIHJlc291cmNlcyBhcmUgbWF4eGVkIG91dCwgd2UgZG9uJ3Qgd2FudAotCSAgIEFwYWNoZSBydW5uaW5nIGF3YXkgd2l0aCB0aGUgQ1BVIHRyeWluZyB0byBmb3JrIG92ZXIgYW5kCi0JICAgb3ZlciBhbmQgb3ZlciBhZ2Fpbi4gKi8KLQlzbGVlcCgxMCk7Ci0KLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKCFwaWQpIHsKLSNpZmRlZiBBSVhfQklORF9QUk9DRVNTT1IKLSAgICAgIC8qIEJ5IGRlZmF1bHQsIEFJWCBiaW5kcyB0byBhIHNpbmdsZSBwcm9jZXNzb3IuICBUaGlzIGJpdCB1bmJpbmRzCi0JIGNoaWxkcmVuIHdoaWNoIHdpbGwgdGhlbiBiaW5kIHRvIGFub3RoZXIgQ1BVLgotICAgICAgKi8KLSNpbmNsdWRlIDxzeXMvcHJvY2Vzc29yLmg+Ci0gICAgICAgIGludCBzdGF0dXMgPSBiaW5kcHJvY2Vzc29yKEJJTkRQUk9DRVNTLCAoaW50KWdldHBpZCgpLAotCQkJICAgICAgIFBST0NFU1NPUl9DTEFTU19BTlkpOwotCWlmIChzdGF0dXMgIT0gT0spCi0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX1dBUk5JTkcsIGVycm5vLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfY29uZiwgInByb2Nlc3NvciB1bmJpbmQgZmFpbGVkICVkIiwgc3RhdHVzKTsKLSNlbmRpZgotCi0gICAgICAgIFJBSVNFX1NJR1NUT1AoTUFLRV9DSElMRCk7Ci0KLQkvKiBYWFggLSBGb3IgYW4gdW50aHJlYWRlZCBzZXJ2ZXIsIGEgc2lnbmFsIGhhbmRsZXIgd2lsbCBiZSBuZWNlc3NhcnkKLSAgICAgICAgc2lnbmFsKFNJR1RFUk0sIGp1c3RfZGllKTsKLQkqLwotICAgICAgICBjaGlsZF9tYWluKHNsb3QpOwotCi0JcmV0dXJuIDA7Ci0gICAgfQotICAgIC8qIGVsc2UgKi8KLSAgICBjaGlsZF90YWJsZVtzbG90XS5waWQgPSBwaWQ7Ci0gICAgY2hpbGRfdGFibGVbc2xvdF0uc3RhdHVzID0gU0VSVkVSX0FMSVZFOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIHN0YXJ0IHVwIGEgYnVuY2ggb2YgY2hpbGRyZW4gKi8KLXN0YXRpYyBpbnQgc3RhcnR1cF9jaGlsZHJlbihpbnQgbnVtYmVyX3RvX3N0YXJ0KQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgbnVtYmVyX3RvX3N0YXJ0ICYmIGkgPCBudW1fZGFlbW9uczsgKytpKSB7Ci0JaWYgKGNoaWxkX3RhYmxlW2ldLnN0YXR1cyAhPSBTRVJWRVJfREVBRCkgewotCSAgICBjb250aW51ZTsKLQl9Ci0JaWYgKG1ha2VfY2hpbGQoc2VydmVyX2NvbmYsIGksIDApIDwgMCkgewotCSAgICBicmVhazsKLQl9Ci0JLS1udW1iZXJfdG9fc3RhcnQ7Ci0gICAgfQotICAgIHJldHVybiBudW1iZXJfdG9fc3RhcnQ7Ci19Ci0KLQotLyoKLSAqIHNwYXduX3JhdGUgaXMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IHdpbGwgYmUgc3Bhd25lZCBvbiB0aGUKLSAqIG5leHQgbWFpbnRlbmFuY2UgY3ljbGUgaWYgdGhlcmUgYXJlbid0IGVub3VnaCBzZXJ2ZXJzLiAgSXQgaXMKLSAqIGRvdWJsZWQgdXAgdG8gTUFYX1NQQVdOX1JBVEUsIGFuZCByZXNldCBvbmx5IHdoZW4gYSBjeWNsZSBnb2VzIGJ5Ci0gKiB3aXRob3V0IHRoZSBuZWVkIHRvIHNwYXduLgotICovCi1zdGF0aWMgaW50IHNwYXduX3JhdGUgPSAxOwotI2lmbmRlZiBNQVhfU1BBV05fUkFURQotI2RlZmluZSBNQVhfU1BBV05fUkFURQkoMzIpCi0jZW5kaWYKLXN0YXRpYyBpbnQgaG9sZF9vZmZfb25fZXhwb25lbnRpYWxfc3Bhd25pbmc7Ci0KLXN0YXRpYyB2b2lkIHBlcmZvcm1fY2hpbGRfbWFpbnRlbmFuY2Uodm9pZCkKLXsKLSAgICBpbnQgaTsKLSAgICB0aW1lX3Qgbm93ID0gMDsKLSAgICBpbnQgZnJlZV9sZW5ndGg7Ci0gICAgaW50IGZyZWVfc2xvdHNbTUFYX1NQQVdOX1JBVEVdOwotICAgIGludCBsYXN0X25vbl9kZWFkID0gLTE7Ci0KLSAgICAvKiBpbml0aWFsaXplIHRoZSBmcmVlX2xpc3QgKi8KLSAgICBmcmVlX2xlbmd0aCA9IDA7Ci0gICAgCi0gICAgZm9yIChpID0gMDsgaSA8IG51bV9kYWVtb25zOyArK2kpIHsKLSAgICAgICAgaWYgKGNoaWxkX3RhYmxlW2ldLnN0YXR1cyA9PSBTRVJWRVJfREVBRCkgewotICAgICAgICAgICAgaWYgKGZyZWVfbGVuZ3RoIDwgc3Bhd25fcmF0ZSkgewotICAgICAgICAgICAgICAgIGZyZWVfc2xvdHNbZnJlZV9sZW5ndGhdID0gaTsKLSAgICAgICAgICAgICAgICArK2ZyZWVfbGVuZ3RoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgbGFzdF9ub25fZGVhZCA9IGk7Ci0gICAgICAgIH0KLQotCWlmIChpID49IG1heF9kYWVtb25zX2xpbWl0ICYmIGZyZWVfbGVuZ3RoID49IHNwYXduX3JhdGUpIHsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSAgICBtYXhfZGFlbW9uc19saW1pdCA9IGxhc3Rfbm9uX2RlYWQgKyAxOwotCi0gICAgaWYgKGZyZWVfbGVuZ3RoID4gMCkgewotCWZvciAoaSA9IDA7IGkgPCBmcmVlX2xlbmd0aDsgKytpKSB7Ci0JICAgIG1ha2VfY2hpbGQoc2VydmVyX2NvbmYsIGZyZWVfc2xvdHNbaV0sIG5vdyk7Ci0JfQotCS8qIHRoZSBuZXh0IHRpbWUgYXJvdW5kIHdlIHdhbnQgdG8gc3Bhd24gdHdpY2UgYXMgbWFueSBpZiB0aGlzCi0JICogd2Fzbid0IGdvb2QgZW5vdWdoLCBidXQgbm90IGlmIHdlJ3ZlIGp1c3QgZG9uZSBhIGdyYWNlZnVsCi0JICovCi0JaWYgKGhvbGRfb2ZmX29uX2V4cG9uZW50aWFsX3NwYXduaW5nKSB7Ci0JICAgIC0taG9sZF9vZmZfb25fZXhwb25lbnRpYWxfc3Bhd25pbmc7Ci0JfQotCWVsc2UgaWYgKHNwYXduX3JhdGUgPCBNQVhfU1BBV05fUkFURSkgewotCSAgICBzcGF3bl9yYXRlICo9IDI7Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc3Bhd25fcmF0ZSA9IDE7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBzZXJ2ZXJfbWFpbl9sb29wKGludCByZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQpCi17Ci0gICAgaW50IGNoaWxkX3Nsb3Q7Ci0gICAgYXBfd2FpdF90IHN0YXR1czsKLSAgICBpbnQgcGlkOwotICAgIGludCBpOwotCi0gICAgd2hpbGUgKCFyZXN0YXJ0X3BlbmRpbmcgJiYgIXNodXRkb3duX3BlbmRpbmcpIHsKLSAgICAgICAgcGlkID0gd2FpdF9vcl90aW1lb3V0KCZzdGF0dXMpOwotICAgICAgICAKLSAgICAgICAgaWYgKHBpZCA+PSAwKSB7Ci0gICAgICAgICAgICBwcm9jZXNzX2NoaWxkX3N0YXR1cyhwaWQsIHN0YXR1cyk7Ci0gICAgICAgICAgICAvKiBub24tZmF0YWwgZGVhdGguLi4gbm90ZSB0aGF0IGl0J3MgZ29uZSBpbiB0aGUgY2hpbGQgdGFibGUgYW5kCi0gICAgICAgICAgICAgKiBjbGVhbiBvdXQgdGhlIHN0YXR1cyB0YWJsZS4gKi8KLSAgICAgICAgICAgIGNoaWxkX3Nsb3QgPSAtMTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXhfZGFlbW9uc19saW1pdDsgKytpKSB7Ci0gICAgICAgIAlpZiAoY2hpbGRfdGFibGVbaV0ucGlkID09IHBpZCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgajsKLQotICAgICAgICAgICAgICAgICAgICBjaGlsZF9zbG90ID0gaTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IEhBUkRfVEhSRUFEX0xJTUlUOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX2RleHRlcl9mb3JjZV9yZXNldF9jb25uZWN0aW9uX3N0YXR1cyhpICogSEFSRF9USFJFQURfTElNSVQgKyBqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2hpbGRfc2xvdCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGRfdGFibGVbY2hpbGRfc2xvdF0uc3RhdHVzID0gU0VSVkVSX0RFQUQ7Ci0gICAgICAgICAgICAgICAgCi0JCWlmIChyZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQKLQkJICAgICYmIGNoaWxkX3Nsb3QgPCBudW1fZGFlbW9ucykgewotCQkgICAgLyogd2UncmUgc3RpbGwgZG9pbmcgYSAxLWZvci0xIHJlcGxhY2VtZW50IG9mIGRlYWQKLSAgICAgICAgICAgICAgICAgICAgICogY2hpbGRyZW4gd2l0aCBuZXcgY2hpbGRyZW4KLSAgICAgICAgICAgICAgICAgICAgICovCi0JCSAgICBtYWtlX2NoaWxkKHNlcnZlcl9jb25mLCBjaGlsZF9zbG90LCB0aW1lKE5VTEwpKTsKLQkJICAgIC0tcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0OwotCQl9Ci0jaWZkZWYgSEFTX09USEVSX0NISUxECi0JICAgIH0KLQkgICAgZWxzZSBpZiAocmVhcF9vdGhlcl9jaGlsZChwaWQsIHN0YXR1cykgPT0gMCkgewotCQkvKiBoYW5kbGVkICovCi0jZW5kaWYKLQkgICAgfQotCSAgICBlbHNlIGlmIChpc19ncmFjZWZ1bCkgewotCQkvKiBHcmVhdCwgd2UndmUgcHJvYmFibHkganVzdCBsb3N0IGEgc2xvdCBpbiB0aGUKLQkJICogY2hpbGQgdGFibGUuICBTb21laG93IHdlIGRvbid0IGtub3cgYWJvdXQgdGhpcwotCQkgKiBjaGlsZC4KLQkJICovCi0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX1dBUk5JTkcsIGVycm5vLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2NvbmYsCi0JCQkgICAgImxvbmcgbG9zdCBjaGlsZCBjYW1lIGhvbWUhIChwaWQgJWQpIiwgcGlkKTsKLQkgICAgfQotCSAgICAvKiBEb24ndCBwZXJmb3JtIGlkbGUgbWFpbnRlbmFuY2Ugd2hlbiBhIGNoaWxkIGRpZXMsCi0gICAgICAgICAgICAgKiBvbmx5IGRvIGl0IHdoZW4gdGhlcmUncyBhIHRpbWVvdXQuICBSZW1lbWJlciBvbmx5IGEKLSAgICAgICAgICAgICAqIGZpbml0ZSBudW1iZXIgb2YgY2hpbGRyZW4gY2FuIGRpZSwgYW5kIGl0J3MgcHJldHR5Ci0gICAgICAgICAgICAgKiBwYXRob2xvZ2ljYWwgZm9yIGEgbG90IHRvIGRpZSBzdWRkZW5seS4KLSAgICAgICAgICAgICAqLwotCSAgICBjb250aW51ZTsKLQl9Ci0JZWxzZSBpZiAocmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0KSB7Ci0JICAgIC8qIHdlIGhpdCBhIDEgc2Vjb25kIHRpbWVvdXQgaW4gd2hpY2ggbm9uZSBvZiB0aGUgcHJldmlvdXMKLQkgICAgICogZ2VuZXJhdGlvbiBvZiBjaGlsZHJlbiBuZWVkZWQgdG8gYmUgcmVhcGVkLi4uIHNvIGFzc3VtZQotCSAgICAgKiB0aGV5J3JlIGFsbCBkb25lLCBhbmQgcGljayB1cCB0aGUgc2xhY2sgaWYgYW55IGlzIGxlZnQuCi0JICAgICAqLwotCSAgICByZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQgPSBcCi0JICAgIAlzdGFydHVwX2NoaWxkcmVuKHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydCk7Ci0JICAgIC8qIEluIGFueSBldmVudCB3ZSByZWFsbHkgc2hvdWxkbid0IGRvIHRoZSBjb2RlIGJlbG93IGJlY2F1c2UKLQkgICAgICogZmV3IG9mIHRoZSBzZXJ2ZXJzIHdlIGp1c3Qgc3RhcnRlZCBhcmUgaW4gdGhlIElETEUgc3RhdGUKLQkgICAgICogeWV0LCBzbyB3ZSdkIG1pc3Rha2VubHkgY3JlYXRlIGFuIGV4dHJhIHNlcnZlci4KLQkgICAgICovCi0JICAgIGNvbnRpbnVlOwotCX0KLQotCXBlcmZvcm1fY2hpbGRfbWFpbnRlbmFuY2UoKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBhcF9zdGF0dXNfdCBjbGVhbnVwX2ZkKHZvaWQgKmZkcHRyKQotewotICAgIGlmIChjbG9zZSgqKChpbnQgKikgZmRwdHIpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIEFQUl9FQkFERjsKLSAgICB9Ci0gICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotfQotCi1pbnQgYXBfbXBtX3J1bihhcF9jb250ZXh0X3QgKl9wY29uZiwgYXBfY29udGV4dF90ICpwbG9nLCBzZXJ2ZXJfcmVjICpzKQotewotICAgIGludCByZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQ7Ci0gICAgaW50IGk7Ci0gICAgYXBfc3RhdHVzX3QgcnY7Ci0KLSAgICBwY29uZiA9IF9wY29uZjsKLSAgICBzZXJ2ZXJfY29uZiA9IHM7Ci0gICAgaWYgKHBpcGUocGlwZV9vZl9kZWF0aCkgPT0gLTEpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sCi0gICAgICAgICAgICAgICAgICAgICAoY29uc3Qgc2VydmVyX3JlYyopIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgInBpcGU6IChwaXBlX29mX2RlYXRoKSIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICBhcF9yZWdpc3Rlcl9jbGVhbnVwKHBjb25mLCAmcGlwZV9vZl9kZWF0aFswXSwgY2xlYW51cF9mZCwgY2xlYW51cF9mZCk7Ci0gICAgYXBfcmVnaXN0ZXJfY2xlYW51cChwY29uZiwgJnBpcGVfb2ZfZGVhdGhbMV0sIGNsZWFudXBfZmQsIGNsZWFudXBfZmQpOwotICAgIGlmIChmY250bChwaXBlX29mX2RlYXRoWzBdLCBGX1NFVEZELCBPX05PTkJMT0NLKSA9PSAtMSkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywKLSAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzZXJ2ZXJfcmVjKikgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAiZmNudGw6IE9fTk9OQkxPQ0tpbmcgKHBpcGVfb2ZfZGVhdGgpIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIHNlcnZlcl9jb25mID0gczsKLSAgICBpZiAoKG51bV9saXN0ZW5mZHMgPSBzZXR1cF9saXN0ZW5lcnMoc2VydmVyX2NvbmYpKSA8IDEpIHsKLSAgICAgICAgLyogWFhYOiBoZXksIHdoYXQncyB0aGUgcmlnaHQgd2F5IGZvciB0aGUgbXBtIHRvIGluZGljYXRlIGEgZmF0YWwgZXJyb3I/ICovCi0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0FMRVJULCBlcnJubywgcywKLSAgICAgICAgICAgICJubyBsaXN0ZW5pbmcgc29ja2V0cyBhdmFpbGFibGUsIHNodXR0aW5nIGRvd24iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGFwX2xvZ19waWQocGNvbmYsIGFwX3BpZF9mbmFtZSk7Ci0KLSAgICAvKiBJbml0aWFsaXplIGNyb3NzLXByb2Nlc3MgYWNjZXB0IGxvY2sgKi8KLSAgICBsb2NrX2ZuYW1lID0gYXBfcHNwcmludGYoX3Bjb25mLCAiJXMuJWx1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUoX3Bjb25mLCBsb2NrX2ZuYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfcGlkKTsKLSAgICBydiA9IFNBRkVfQUNDRVBUKGFwX2NyZWF0ZV9sb2NrKCZwcm9jZXNzX2FjY2VwdF9tdXRleCwgQVBSX01VVEVYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBSX0NST1NTX1BST0NFU1MsIGxvY2tfZm5hbWUsIF9wY29uZikpOwotICAgIGlmIChydiAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkcsIHJ2LCBzLAotICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGNyZWF0ZSBjcm9zcy1wcm9jZXNzIGxvY2siKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgaWYgKCFpc19ncmFjZWZ1bCkgewotICAgICAgICByZWluaXRfc2NvcmVib2FyZChwY29uZik7Ci0gICAgfQotICAgIC8qIEluaXRpYWxpemUgdGhlIGNoaWxkIHRhYmxlICovCi0gICAgaWYgKCFpc19ncmFjZWZ1bCkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgSEFSRF9TRVJWRVJfTElNSVQ7IGkrKykgewotICAgICAgICAgICAgY2hpbGRfdGFibGVbaV0uc3RhdHVzID0gU0VSVkVSX0RFQUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzZXRfc2lnbmFscygpOwotCi0gICAgLyogSWYgd2UncmUgZG9pbmcgYSBncmFjZWZ1bF9yZXN0YXJ0IHRoZW4gd2UncmUgZ29pbmcgdG8gc2VlIGEgbG90Ci0gICAgICogb2YgY2hpbGRyZW4gZXhpdGluZyBpbW1lZGlhdGVseSB3aGVuIHdlIGdldCBpbnRvIHRoZSBtYWluIGxvb3AKLSAgICAgKiBiZWxvdyAoYmVjYXVzZSB3ZSBqdXN0IHNlbnQgdGhlbSBTSUdXSU5DSCkuICBUaGlzIGhhcHBlbnMgcHJldHR5Ci0gICAgICogcmFwaWRseS4uLiBhbmQgZm9yIGVhY2ggb25lIHRoYXQgZXhpdHMgd2UnbGwgc3RhcnQgYSBuZXcgb25lIHVudGlsCi0gICAgICogd2UgcmVhY2ggYXQgbGVhc3QgZGFlbW9uc19taW5fZnJlZS4gIEJ1dCB3ZSBtYXkgYmUgcGVybWl0dGVkIHRvCi0gICAgICogc3RhcnQgbW9yZSB0aGFuIHRoYXQsIHNvIHdlJ2xsIGp1c3Qga2VlcCB0cmFjayBvZiBob3cgbWFueSB3ZSdyZQotICAgICAqIHN1cHBvc2VkIHRvIHN0YXJ0IHVwIHdpdGhvdXQgdGhlIDEgc2Vjb25kIHBlbmFsdHkgYmV0d2VlbiBlYWNoIGZvcmsuCi0gICAgICovCi0gICAgcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0ID0gbnVtX2RhZW1vbnM7Ci0gICAgaWYgKCFpc19ncmFjZWZ1bCkgewotCXJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydCA9IFwKLQkgICAgc3RhcnR1cF9jaGlsZHJlbihyZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQpOwotICAgIH0KLSAgICBlbHNlIHsKLQkvKiBnaXZlIHRoZSBzeXN0ZW0gc29tZSB0aW1lIHRvIHJlY292ZXIgYmVmb3JlIGtpY2tpbmcgaW50bwotCSAgICAqIGV4cG9uZW50aWFsIG1vZGUgKi8KLQlob2xkX29mZl9vbl9leHBvbmVudGlhbF9zcGF3bmluZyA9IDEwOwotICAgIH0KLQotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwgZXJybm8sIHNlcnZlcl9jb25mLAotCQkiJXMgY29uZmlndXJlZCAtLSByZXN1bWluZyBub3JtYWwgb3BlcmF0aW9ucyIsCi0JCWFwX2dldF9zZXJ2ZXJfdmVyc2lvbigpKTsKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19JTkZPLCBlcnJubywgc2VydmVyX2NvbmYsCi0JCSJTZXJ2ZXIgYnVpbHQ6ICVzIiwgYXBfZ2V0X3NlcnZlcl9idWlsdCgpKTsKLSAgICByZXN0YXJ0X3BlbmRpbmcgPSBzaHV0ZG93bl9wZW5kaW5nID0gMDsKLQotICAgIHNlcnZlcl9tYWluX2xvb3AocmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0KTsKLQotICAgIGlmIChzaHV0ZG93bl9wZW5kaW5nKSB7Ci0gICAgICAgIC8qIFRpbWUgdG8gZ3JhY2VmdWxseSBzaHV0IGRvd246Ci0gICAgICAgICAqIEtpbGwgY2hpbGQgcHJvY2Vzc2VzLCB0ZWxsIHRoZW0gdG8gY2FsbCBjaGlsZF9leGl0LCBldGMuLi4KLSAgICAgICAgICovCi0gICAgICAgIGlmICh1bml4ZF9raWxscGcoZ2V0cGdycCgpLCBTSUdURVJNKSA8IDApIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgImtpbGxwZyBTSUdURVJNIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmVjbGFpbV9jaGlsZF9wcm9jZXNzZXMoMSk7CQkvKiBTdGFydCB3aXRoIFNJR1RFUk0gKi8KLSAgICAKLSAgICAgICAgLyogY2xlYW51cCBwaWQgZmlsZSBvbiBub3JtYWwgc2h1dGRvd24gKi8KLSAgICAgICAgewotICAgICAgICAgICAgY29uc3QgY2hhciAqcGlkZmlsZSA9IE5VTEw7Ci0gICAgICAgICAgICBwaWRmaWxlID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUgKHBjb25mLCBhcF9waWRfZm5hbWUpOwotICAgICAgICAgICAgaWYgKCBwaWRmaWxlICE9IE5VTEwgJiYgdW5saW5rKHBpZGZpbGUpID09IDApCi0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgZXJybm8sCi0gICAgICAgICAgICAJCSBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgIAkJICJyZW1vdmVkIFBJRCBmaWxlICVzIChwaWQ9JWxkKSIsCi0gICAgICAgICAgICAJCSBwaWRmaWxlLCAobG9uZylnZXRwaWQoKSk7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCBlcnJubywKLSAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9jb25mLCAiY2F1Z2h0IFNJR1RFUk0sIHNodXR0aW5nIGRvd24iKTsKLSAgICAKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiB3ZSd2ZSBiZWVuIHRvbGQgdG8gcmVzdGFydCAqLwotICAgIHNpZ25hbChTSUdIVVAsIFNJR19JR04pOwotCi0gICAgaWYgKG9uZV9wcm9jZXNzKSB7Ci0JLyogbm90IHdvcnRoIHRoaW5raW5nIGFib3V0ICovCi0JcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgaWYgKGlzX2dyYWNlZnVsKSB7Ci0gICAgICAgIGNoYXIgY2hhcl9vZl9kZWF0aCA9ICchJzsKLQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwgZXJybm8sIHNlcnZlcl9jb25mLAotCQkgICAgIlNJR1dJTkNIIHJlY2VpdmVkLiAgRG9pbmcgZ3JhY2VmdWwgcmVzdGFydCIpOwotCi0JLyogVGhpcyBpcyBtb3N0bHkgZm9yIGRlYnVnZ2luZy4uLiBzbyB0aGF0IHdlIGtub3cgd2hhdCBpcyBzdGlsbAotICAgICAgICAgKiBncmFjZWZ1bGx5IGRlYWxpbmcgd2l0aCBleGlzdGluZyByZXF1ZXN0LgotICAgICAgICAgKi8KLQkKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2RhZW1vbnM7ICsraSkgewotCSAgICBpZiAoY2hpbGRfdGFibGVbaV0uc3RhdHVzICE9IFNFUlZFUl9ERUFEKSB7Ci0JICAgICAgICBjaGlsZF90YWJsZVtpXS5zdGF0dXMgPSBTRVJWRVJfRFlJTkc7Ci0JICAgIH0gCi0JfQotCS8qIGdpdmUgdGhlIGNoaWxkcmVuIHRoZSBzaWduYWwgdG8gZGllICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZGFlbW9uczspIHsKLSAgICAgICAgICAgIGlmICh3cml0ZShwaXBlX29mX2RlYXRoWzFdLCAmY2hhcl9vZl9kZWF0aCwgMSkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSBwaXBlX29mX2RlYXRoIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAvKiBLaWxsICdlbSBhbGwuICBTaW5jZSB0aGUgY2hpbGQgYWN0cyB0aGUgc2FtZSBvbiB0aGUgcGFyZW50cyBTSUdURVJNIAotICAgICAgICogYW5kIGEgU0lHSFVQLCB3ZSBtYXkgYXMgd2VsbCB1c2UgdGhlIHNhbWUgc2lnbmFsLCBiZWNhdXNlIHNvbWUgdXNlcgotICAgICAgICogcHRocmVhZHMgYXJlIHN0ZWFsaW5nIHNpZ25hbHMgZnJvbSB1cyBsZWZ0IGFuZCByaWdodC4KLSAgICAgICAqLwotCWlmICh1bml4ZF9raWxscGcoZ2V0cGdycCgpLCBTSUdURVJNKSA8IDApIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAia2lsbHBnIFNJR1RFUk0iKTsKLQl9Ci0gICAgICAgIHJlY2xhaW1fY2hpbGRfcHJvY2Vzc2VzKDEpOwkJLyogU3RhcnQgd2l0aCBTSUdURVJNICovCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCBlcnJubywKLSAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9jb25mLCAiU0lHSFVQIHJlY2VpdmVkLiAgQXR0ZW1wdGluZyB0byByZXN0YXJ0Iik7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBkZXh0ZXJfcHJlX2NvbmZpZyhhcF9jb250ZXh0X3QgKnAsIGFwX2NvbnRleHRfdCAqcGxvZywgYXBfY29udGV4dF90ICpwdGVtcCkKLXsKLSAgICBzdGF0aWMgaW50IHJlc3RhcnRfbnVtID0gMDsKLQotICAgIG9uZV9wcm9jZXNzID0gISFnZXRlbnYoIk9ORV9QUk9DRVNTIik7Ci0KLSAgICAvKiBzaWdoLCB3YW50IHRoaXMgb25seSB0aGUgc2Vjb25kIHRpbWUgYXJvdW5kICovCi0gICAgaWYgKHJlc3RhcnRfbnVtKysgPT0gMSkgewotCWlzX2dyYWNlZnVsID0gMDsKLQotCWlmICghb25lX3Byb2Nlc3MpIHsKLQkgICAgdW5peGRfZGV0YWNoKCk7Ci0JfQotCi0JbXlfcGlkID0gZ2V0cGlkKCk7Ci0gICAgfQotCi0gICAgdW5peGRfcHJlX2NvbmZpZygpOwotICAgIGFwX2xpc3Rlbl9wcmVfY29uZmlnKCk7Ci0gICAgbnVtX2RhZW1vbnMgPSBERUZBVUxUX05VTV9EQUVNT047Ci0gICAgdGhyZWFkc190b19zdGFydCA9IERFRkFVTFRfU1RBUlRfVEhSRUFEOwotICAgIG1pbl9zcGFyZV90aHJlYWRzID0gREVGQVVMVF9NSU5fU1BBUkVfVEhSRUFEOwotICAgIG1heF9zcGFyZV90aHJlYWRzID0gREVGQVVMVF9NQVhfU1BBUkVfVEhSRUFEOwotICAgIG1heF90aHJlYWRzID0gSEFSRF9USFJFQURfTElNSVQ7Ci0gICAgYXBfcGlkX2ZuYW1lID0gREVGQVVMVF9QSURMT0c7Ci0gICAgbG9ja19mbmFtZSA9IERFRkFVTFRfTE9DS0ZJTEU7Ci0gICAgbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCA9IERFRkFVTFRfTUFYX1JFUVVFU1RTX1BFUl9DSElMRDsKLSAgICBhcF9kZXh0ZXJfc2V0X21haW50YWluX2Nvbm5lY3Rpb25fc3RhdHVzKDEpOwotCi0gICAgYXBfY3B5c3RybihhcF9jb3JlZHVtcF9kaXIsIGFwX3NlcnZlcl9yb290LCBzaXplb2YoYXBfY29yZWR1bXBfZGlyKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRleHRlcl9ob29rcyh2b2lkKQotewotICAgIGFwX2hvb2tfcHJlX2NvbmZpZyhkZXh0ZXJfcHJlX2NvbmZpZywgTlVMTCwgTlVMTCwgSE9PS19NSURETEUpOwotICAgIElOSVRfU0lHTElTVCgpCi0gICAgb25lX3Byb2Nlc3MgPSAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3BpZGZpbGUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChjbWQtPnNlcnZlci0+aXNfdmlydHVhbCkgewotCXJldHVybiAiUGlkRmlsZSBkaXJlY3RpdmUgbm90IGFsbG93ZWQgaW4gPFZpcnR1YWxIb3N0PiI7Ci0gICAgfQotICAgIGFwX3BpZF9mbmFtZSA9IGFyZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9sb2NrZmlsZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbG9ja19mbmFtZSA9IGFyZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbnVtX2RhZW1vbnMgKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBudW1fZGFlbW9ucyA9IGF0b2koYXJnKTsKLSAgICBpZiAobnVtX2RhZW1vbnMgPiBIQVJEX1NFUlZFUl9MSU1JVCkgewotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICJXQVJOSU5HOiBOdW1TZXJ2ZXJzIG9mICVkIGV4Y2VlZHMgY29tcGlsZSB0aW1lIGxpbWl0ICIKLSAgICAgICAgICAgICAgICAgICAgIm9mICVkIHNlcnZlcnMsIiwgbnVtX2RhZW1vbnMsIEhBUkRfU0VSVkVSX0xJTUlUKTsKLSAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAiIGxvd2VyaW5nIE51bVNlcnZlcnMgdG8gJWQuICBUbyBpbmNyZWFzZSwgcGxlYXNlICIKLSAgICAgICAgICAgICAgICAgICAgInNlZSB0aGUiLCBIQVJEX1NFUlZFUl9MSU1JVCk7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgIiBIQVJEX1NFUlZFUl9MSU1JVCBkZWZpbmUgaW4gc3JjL2luY2x1ZGUvaHR0cGQuaC4iKTsKLSAgICAgICBudW1fZGFlbW9ucyA9IEhBUkRfU0VSVkVSX0xJTUlUOwotICAgIH0gCi0gICAgZWxzZSBpZiAobnVtX2RhZW1vbnMgPCAxKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICJXQVJOSU5HOiBSZXF1aXJlIE51bVNlcnZlcnMgPiAwLCBzZXR0aW5nIHRvIDEiKTsKLQludW1fZGFlbW9ucyA9IDE7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3RocmVhZHNfdG9fc3RhcnQgKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICB0aHJlYWRzX3RvX3N0YXJ0ID0gYXRvaShhcmcpOwotICAgIGlmICh0aHJlYWRzX3RvX3N0YXJ0ID4gSEFSRF9USFJFQURfTElNSVQpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICJXQVJOSU5HOiBTdGFydFRocmVhZHMgb2YgJWQgZXhjZWVkcyBjb21waWxlIHRpbWUiCi0gICAgICAgICAgICAgICAgICAgICAibGltaXQgb2YgJWQgdGhyZWFkcywiLCB0aHJlYWRzX3RvX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgSEFSRF9USFJFQURfTElNSVQpOwotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgImxvd2VyaW5nIFN0YXJ0VGhyZWFkcyB0byAlZC4gVG8gaW5jcmVhc2UsIHBsZWFzZSIKLSAgICAgICAgICAgICAgICAgICAgICJzZWUgdGhlIiwgSEFSRF9USFJFQURfTElNSVQpOwotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIkhBUkRfVEhSRUFEX0xJTUlUIGRlZmluZSBpbiBzcmMvaW5jbHVkZS9odHRwZC5oLiIpOwotICAgIH0KLSAgICBlbHNlIGlmICh0aHJlYWRzX3RvX3N0YXJ0IDwgMSkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiV0FSTklORzogUmVxdWlyZSBTdGFydFRocmVhZHMgPiAwLCBzZXR0aW5nIHRvIDEiKTsKLQl0aHJlYWRzX3RvX3N0YXJ0ID0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbWluX3NwYXJlX3RocmVhZHMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbWluX3NwYXJlX3RocmVhZHMgPSBhdG9pKGFyZyk7Ci0gICAgaWYgKG1pbl9zcGFyZV90aHJlYWRzIDw9IDApIHsKLSAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAiV0FSTklORzogZGV0ZWN0ZWQgTWluU3BhcmVUaHJlYWRzIHNldCB0byBub24tcG9zaXRpdmUuIik7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgIlJlc2V0dGluZyB0byAxIHRvIGF2b2lkIGFsbW9zdCBjZXJ0YWluIEFwYWNoZSBmYWlsdXJlLiIpOwotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICJQbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbi4iKTsKLSAgICAgICBtaW5fc3BhcmVfdGhyZWFkcyA9IDE7Ci0gICAgfQotICAgICAgIAotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X21heF9zcGFyZV90aHJlYWRzKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1heF9zcGFyZV90aHJlYWRzID0gYXRvaShhcmcpOwotICAgIGlmIChtYXhfc3BhcmVfdGhyZWFkcyA+PSBIQVJEX1RIUkVBRF9MSU1JVCkgewotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICJXQVJOSU5HOiBkZXRlY3RlZCBNaW5TcGFyZVRocmVhZHMgc2V0IGhpZ2hlciB0aGFuIik7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgIkhBUkRfVEhSRUFEX0xJTUlULiBSZXNldHRpbmcgdG8gJWQiLCBIQVJEX1RIUkVBRF9MSU1JVCk7Ci0gICAgICAgbWF4X3NwYXJlX3RocmVhZHMgPSBIQVJEX1RIUkVBRF9MSU1JVDsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbWF4X3RocmVhZHMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbWF4X3RocmVhZHMgPSBhdG9pKGFyZyk7Ci0gICAgaWYgKG1heF90aHJlYWRzID4gSEFSRF9USFJFQURfTElNSVQpIHsKLSAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAiV0FSTklORzogZGV0ZWN0ZWQgTWF4VGhyZWFkc1BlckNoaWxkIHNldCBoaWdoZXIgdGhhbiIpOwotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICJIQVJEX1RIUkVBRF9MSU1JVC4gUmVzZXR0aW5nIHRvICVkIiwgSEFSRF9USFJFQURfTElNSVQpOwotICAgICAgIG1heF90aHJlYWRzID0gSEFSRF9USFJFQURfTElNSVQ7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X21heF9yZXF1ZXN0cyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCA9IGF0b2koYXJnKTsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X21haW50YWluX2Nvbm5lY3Rpb25fc3RhdHVzKGNtZF9wYXJtcyAqY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlX2Rpcl9jb25maWcgKmQsIGludCBhcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX2RleHRlcl9zZXRfbWFpbnRhaW5fY29ubmVjdGlvbl9zdGF0dXMoYXJnICE9IDApOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2NvcmVkdW1wZGlyIChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgCi17Ci0gICAgc3RydWN0IHN0YXQgZmluZm87Ci0gICAgY29uc3QgY2hhciAqZm5hbWU7Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZm5hbWUgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShjbWQtPnBvb2wsIGFyZyk7Ci0gICAgaWYgKChzdGF0KGZuYW1lLCAmZmluZm8pID09IC0xKSB8fCAhU19JU0RJUihmaW5mby5zdF9tb2RlKSkgewotCXJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIkNvcmVEdW1wRGlyZWN0b3J5ICIsIGZuYW1lLCAKLQkJCSAgIiBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSBkaXJlY3RvcnkiLCBOVUxMKTsKLSAgICB9Ci0gICAgYXBfY3B5c3RybihhcF9jb3JlZHVtcF9kaXIsIGZuYW1lLCBzaXplb2YoYXBfY29yZWR1bXBfZGlyKSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBkZXh0ZXJfY21kc1tdID0gewotVU5JWF9EQUVNT05fQ09NTUFORFMKLUxJU1RFTl9DT01NQU5EUwoteyAiUGlkRmlsZSIsIHNldF9waWRmaWxlLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAgICJBIGZpbGUgZm9yIGxvZ2dpbmcgdGhlIHNlcnZlciBwcm9jZXNzIElEIn0sCi17ICJMb2NrRmlsZSIsIHNldF9sb2NrZmlsZSwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAiVGhlIGxvY2tmaWxlIHVzZWQgd2hlbiBBcGFjaGUgbmVlZHMgdG8gbG9jayB0aGUgYWNjZXB0KCkgY2FsbCJ9LAoteyAiTnVtU2VydmVycyIsIHNldF9udW1fZGFlbW9ucywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIk51bWJlciBvZiBjaGlsZHJlbiBhbGl2ZSBhdCB0aGUgc2FtZSB0aW1lIiB9LAoteyAiU3RhcnRUaHJlYWRzIiwgc2V0X3RocmVhZHNfdG9fc3RhcnQsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJOdW1iZXIgb2YgdGhyZWFkcyBlYWNoIGNoaWxkIGNyZWF0ZXMiIH0sCi17ICJNaW5TcGFyZVRocmVhZHMiLCBzZXRfbWluX3NwYXJlX3RocmVhZHMsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJNaW5pbXVtIG51bWJlciBvZiBpZGxlIHRocmVhZHMgcGVyIGNoaWxkLCB0byBoYW5kbGUgcmVxdWVzdCBzcGlrZXMiIH0sCi17ICJNYXhTcGFyZVRocmVhZHMiLCBzZXRfbWF4X3NwYXJlX3RocmVhZHMsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJNYXhpbXVtIG51bWJlciBvZiBpZGxlIHRocmVhZHMgcGVyIGNoaWxkIiB9LAoteyAiTWF4VGhyZWFkc1BlckNoaWxkIiwgc2V0X21heF90aHJlYWRzLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiTWF4aW11bSBudW1iZXIgb2YgdGhyZWFkcyBwZXIgY2hpbGQiIH0sCi17ICJNYXhSZXF1ZXN0c1BlckNoaWxkIiwgc2V0X21heF9yZXF1ZXN0cywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIk1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIGEgcGFydGljdWxhciBjaGlsZCBzZXJ2ZXMgYmVmb3JlIGR5aW5nLiIgfSwKLXsgIkNvbm5lY3Rpb25TdGF0dXMiLCBzZXRfbWFpbnRhaW5fY29ubmVjdGlvbl9zdGF0dXMsIE5VTEwsIFJTUkNfQ09ORiwgRkxBRywKLSAgIldoZXRoZXIgb3Igbm90IHRvIG1haW50YWluIHN0YXR1cyBpbmZvcm1hdGlvbiBvbiBjdXJyZW50IGNvbm5lY3Rpb25zIn0sCi17ICJDb3JlRHVtcERpcmVjdG9yeSIsIHNldF9jb3JlZHVtcGRpciwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIlRoZSBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0b3J5IEFwYWNoZSBjaGFuZ2VzIHRvIGJlZm9yZSBkdW1waW5nIGNvcmUiIH0sCi17IE5VTEwgfQotfTsKLQotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUIG1wbV9kZXh0ZXJfbW9kdWxlID0gewotICAgIFNUQU5EQVJEMjBfTU9EVUxFX1NUVUZGLAotICAgIE5VTEwsCQkJLyogY3JlYXRlIHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZSAqLwotICAgIE5VTEwsCQkJLyogbWVyZ2UgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIE5VTEwsCQkJLyogY3JlYXRlIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZSAqLwotICAgIE5VTEwsCQkJLyogbWVyZ2UgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIGRleHRlcl9jbWRzLAkJLyogY29tbWFuZCBhcF90YWJsZV90ICovCi0gICAgTlVMTCwJCQkvKiBoYW5kbGVycyAqLwotICAgIGRleHRlcl9ob29rcyAJCS8qIHJlZ2lzdGVyX2hvb2tzICovCi19OwotCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL2RleHRlci9tcG1fZGVmYXVsdC5oIGIvc2VydmVyL21wbS9kZXh0ZXIvbXBtX2RlZmF1bHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQyMmM3ZC4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL2RleHRlci9tcG1fZGVmYXVsdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIAotICogYXJlIG1ldDogCi0gKiAKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAgCi0gKiAKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIAotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSAKLSAqICAgIGRpc3RyaWJ1dGlvbi4gCi0gKiAKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyAKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAgCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIiAKLSAqIAotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0byAKLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCAKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLiAKLSAqIAotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIgCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuIAotICogCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nIAotICogICAgYWNrbm93bGVkZ21lbnQ6IAotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cCAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iIAotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkgCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIAotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IgCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgCi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gKiAKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55IAotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkIAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIAotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLiAKLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4gCi0gKiAKLSAqLyAKLQotI2lmbmRlZiBBUEFDSEVfTVBNX0RFRkFVTFRfSAotI2RlZmluZSBBUEFDSEVfTVBNX0RFRkFVTFRfSAotCi0vKiBOdW1iZXIgb2YgdGhyZWFkcyB0byBzcGF3biBvZmYgYnkgZGVmYXVsdCAtLS0gYWxzbywgaWYgZmV3ZXIgdGhhbgotICogdGhpcyBmcmVlIHdoZW4gdGhlIGNhcmV0YWtlciBjaGVja3MsIGl0IHdpbGwgc3Bhd24gbW9yZS4KLSAqLwotI2lmbmRlZiBERUZBVUxUX1NUQVJUX1RIUkVBRAotI2RlZmluZSBERUZBVUxUX1NUQVJUX1RIUkVBRCA1Ci0jZW5kaWYKLQotLyogTWF4aW11bSBudW1iZXIgb2YgKmZyZWUqIHNlcnZlciB0aHJlYWRzIC0tLSBtb3JlIHRoYW4gdGhpcywgYW5kCi0gKiB0aGV5IHdpbGwgZGllIG9mZi4KLSAqLwotCi0jaWZuZGVmIERFRkFVTFRfTUFYX1NQQVJFX1RIUkVBRAotI2RlZmluZSBERUZBVUxUX01BWF9TUEFSRV9USFJFQUQgMTAKLSNlbmRpZgotCi0vKiBNaW5pbXVtIC0tLSBmZXdlciB0aGFuIHRoaXMsIGFuZCBtb3JlIHdpbGwgYmUgY3JlYXRlZCAqLwotCi0jaWZuZGVmIERFRkFVTFRfTUlOX1NQQVJFX1RIUkVBRAotI2RlZmluZSBERUZBVUxUX01JTl9TUEFSRV9USFJFQUQgNQotI2VuZGlmCi0KLS8qIExpbWl0IG9uIHRoZSB0aHJlYWRzIHBlciBwcm9jZXNzLiAgQ2xpZW50cyB3aWxsIGJlIGxvY2tlZCBvdXQgaWYgbW9yZSB0aGFuCi0gKiB0aGlzICAqIEhBUkRfU0VSVkVSX0xJTUlUIGFyZSBuZWVkZWQuCi0gKgotICogV2Uga2VlcCB0aGlzIGZvciBvbmUgcmVhc29uIGl0IGtlZXBzIHRoZSBzaXplIG9mIHRoZSBzY29yZWJvYXJkIGZpbGUgc21hbGwKLSAqIGVub3VnaCB0aGF0IHdlIGNhbiByZWFkIHRoZSB3aG9sZSB0aGluZyB3aXRob3V0IHdvcnJ5aW5nIHRvbyBtdWNoIGFib3V0Ci0gKiB0aGUgb3ZlcmhlYWQuCi0gKi8KLSNpZm5kZWYgSEFSRF9USFJFQURfTElNSVQKLSNkZWZpbmUgSEFSRF9USFJFQURfTElNSVQgNjQgCi0jZW5kaWYKLQotLyogTnVtYmVyIG9mIHNlcnZlcnMgdG8gc3Bhd24gb2ZmIGJ5IGRlZmF1bHQKLSAqLwotI2lmbmRlZiBERUZBVUxUX05VTV9EQUVNT04KLSNkZWZpbmUgREVGQVVMVF9OVU1fREFFTU9OIDIKLSNlbmRpZgotCi0vKiBMaW1pdCBvbiB0aGUgdG90YWwgLS0tIGNsaWVudHMgd2lsbCBiZSBsb2NrZWQgb3V0IGlmIG1vcmUgc2VydmVycyB0aGFuCi0gKiB0aGlzIGFyZSBuZWVkZWQuICBJdCBpcyBpbnRlbmRlZCBzb2xlbHkgdG8ga2VlcCB0aGUgc2VydmVyIGZyb20gY3Jhc2hpbmcKLSAqIHdoZW4gdGhpbmdzIGdldCBvdXQgb2YgaGFuZC4KLSAqCi0gKiBXZSBrZWVwIGEgaGFyZCBtYXhpbXVtIG51bWJlciBvZiBzZXJ2ZXJzLCBmb3IgdHdvIHJlYXNvbnMgLS0tIGZpcnN0IG9mZiwKLSAqIGluIGNhc2Ugc29tZXRoaW5nIGdvZXMgc2VyaW91c2x5IHdyb25nLCB3ZSB3YW50IHRvIHN0b3AgdGhlIGZvcmsgYm9tYgotICogc2hvcnQgb2YgYWN0dWFsbHkgY3Jhc2hpbmcgdGhlIG1hY2hpbmUgd2UncmUgcnVubmluZyBvbiBieSBmaWxsaW5nIHNvbWUKLSAqIGtlcm5lbCB0YWJsZS4gIFNlY29uZGx5LCBpdCBrZWVwcyB0aGUgc2l6ZSBvZiB0aGUgc2NvcmVib2FyZCBmaWxlIHNtYWxsCi0gKiBlbm91Z2ggdGhhdCB3ZSBjYW4gcmVhZCB0aGUgd2hvbGUgdGhpbmcgd2l0aG91dCB3b3JyeWluZyB0b28gbXVjaCBhYm91dAotICogdGhlIG92ZXJoZWFkLgotICovCi0jaWZuZGVmIEhBUkRfU0VSVkVSX0xJTUlUCi0jZGVmaW5lIEhBUkRfU0VSVkVSX0xJTUlUIDggCi0jZW5kaWYKLQotLyogRmlsZSB1c2VkIGZvciBhY2NlcHQgbG9ja2luZywgd2hlbiB3ZSB1c2UgYSBmaWxlICovCi0jaWZuZGVmIERFRkFVTFRfTE9DS0ZJTEUKLSNkZWZpbmUgREVGQVVMVF9MT0NLRklMRSAibG9ncy9hY2NlcHQubG9jayIKLSNlbmRpZgotCi0vKiBXaGVyZSB0aGUgbWFpbi9wYXJlbnQgcHJvY2VzcydzIHBpZCBpcyBsb2dnZWQgKi8KLSNpZm5kZWYgREVGQVVMVF9QSURMT0cKLSNkZWZpbmUgREVGQVVMVF9QSURMT0cgImxvZ3MvaHR0cGQucGlkIgotI2VuZGlmCi0KLS8qCi0gKiBJbnRlcnZhbCwgaW4gbWljcm9zZWNvbmRzLCBiZXR3ZWVuIHNjb3JlYm9hcmQgbWFpbnRlbmFuY2UuCi0gKi8KLSNpZm5kZWYgU0NPUkVCT0FSRF9NQUlOVEVOQU5DRV9JTlRFUlZBTAotI2RlZmluZSBTQ09SRUJPQVJEX01BSU5URU5BTkNFX0lOVEVSVkFMIDEwMDAwMDAKLSNlbmRpZgotCi0vKiBOdW1iZXIgb2YgcmVxdWVzdHMgdG8gdHJ5IHRvIGhhbmRsZSBpbiBhIHNpbmdsZSBwcm9jZXNzLiAgSWYgPD0gMCwKLSAqIHRoZSBjaGlsZHJlbiBkb24ndCBkaWUgb2ZmLgotICovCi0jaWZuZGVmIERFRkFVTFRfTUFYX1JFUVVFU1RTX1BFUl9DSElMRAotI2RlZmluZSBERUZBVUxUX01BWF9SRVFVRVNUU19QRVJfQ0hJTEQgMTAwMDAKLSNlbmRpZgotCi0jZW5kaWYgLyogQVBfTVBNX0RFRkFVTFRfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9kZXh0ZXIvc2NvcmVib2FyZC5jIGIvc2VydmVyL21wbS9kZXh0ZXIvc2NvcmVib2FyZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODBlMDM4Li4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vZGV4dGVyL3Njb3JlYm9hcmQuYworKysgL2Rldi9udWxsCkBAIC0xLDU5NSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyAKLSAqIGFyZSBtZXQ6IAotICogCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gIAotICogCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCAKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAKLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgCi0gKiAgICBkaXN0cmlidXRpb24uIAotICogCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogCi0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwIAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIgCi0gKiAKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8gCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgCi0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4gCi0gKiAKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiIAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLiAKLSAqIAotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZyAKLSAqICAgIGFja25vd2xlZGdtZW50OiAKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAgCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIiAKLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZIAotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SIAotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCAKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCAKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyAKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIAotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCAKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAotICogCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueSAKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZCAKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciAKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4gCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIAotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uIAotICogCi0gKi8gCi0KLSNpbmNsdWRlICJhcF9jb25maWcuaCIgCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgImh0dHBfY29yZS5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAidW5peGQuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZfZ2xvYmFscy5oIgotI2luY2x1ZGUgIm1wbV9zdGF0dXMuaCIKLSNpbmNsdWRlICJzY29yZWJvYXJkLmgiCi0jaW5jbHVkZSAiZGV4dGVyLmgiIC8qIGZvciBtYXhfZGFlbW9uc19saW1pdCAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmZGVmIFVTRV9TSE1HRVRfU0NPUkVCT0FSRAotI2luY2x1ZGUgPHN5cy9pcGMuaD4KLSNpbmNsdWRlIDxzeXMvc2htLmg+Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9PUzJfU0NPUkVCT0FSRAotICAgIC8qIEFkZCBNTUFQIHN0eWxlIGZ1bmN0aW9uYWxpdHkgdG8gT1MvMiAqLwotI2RlZmluZSBJTkNMX0RPU01FTU1HUgotI2RlZmluZSBJTkNMX0RPU0VYQ0VQVElPTlMKLSNkZWZpbmUgSU5DTF9ET1NTRU1BUEhPUkVTCi0jaW5jbHVkZSA8b3MyLmg+Ci0jaW5jbHVkZSA8dW1hbGxvYy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZW5kaWYKLQotc3RhdGljIHNjb3JlYm9hcmQgKmFwX3Njb3JlYm9hcmRfaW1hZ2UgPSBOVUxMOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBEZWFsaW5nIHdpdGggdGhlIHNjb3JlYm9hcmQuLi4gYSBsb3Qgb2YgdGhlc2UgdmFyaWFibGVzIGFyZSBnbG9iYWwKLSAqIG9ubHkgdG8gYXZvaWQgZ2V0dGluZyBjbG9iYmVyZWQgYnkgdGhlIGxvbmdqbXAoKSB0aGF0IGhhcHBlbnMgd2hlbgotICogYSBoYXJkIHRpbWVvdXQgZXhwaXJlcy4uLgotICoKLSAqIFdlIGJlZ2luIHdpdGggcm91dGluZXMgd2hpY2ggZGVhbCB3aXRoIHRoZSBmaWxlIGl0c2VsZi4uLiAKLSAqLwotCi0jaWYgZGVmaW5lZChVU0VfT1MyX1NDT1JFQk9BUkQpCi0KLS8qIFRoZSBuZXh0IHR3byByb3V0aW5lcyBhcmUgdXNlZCB0byBhY2Nlc3Mgc2hhcmVkIG1lbW9yeSB1bmRlciBPUy8yLiAgKi8KLS8qIFRoaXMgcmVxdWlyZXMgRU1YIHYwOWMgdG8gYmUgaW5zdGFsbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLWNhZGRyX3QgY3JlYXRlX3NoYXJlZF9oZWFwKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBzaXplKQotewotICAgIFVMT05HIHJjOwotICAgIHZvaWQgKm1lbTsKLSAgICBIZWFwX3QgaDsKLQotICAgIHJjID0gRG9zQWxsb2NTaGFyZWRNZW0oJm1lbSwgbmFtZSwgc2l6ZSwKLQkJCSAgIFBBR19DT01NSVQgfCBQQUdfUkVBRCB8IFBBR19XUklURSk7Ci0gICAgaWYgKHJjICE9IDApCi0JcmV0dXJuIE5VTEw7Ci0gICAgaCA9IF91Y3JlYXRlKG1lbSwgc2l6ZSwgIV9CTE9DS19DTEVBTiwgX0hFQVBfUkVHVUxBUiB8IF9IRUFQX1NIQVJFRCwKLQkJIE5VTEwsIE5VTEwpOwotICAgIGlmIChoID09IE5VTEwpCi0JRG9zRnJlZU1lbShtZW0pOwotICAgIHJldHVybiAoY2FkZHJfdCkgaDsKLX0KLQotY2FkZHJfdCBnZXRfc2hhcmVkX2hlYXAoY29uc3QgY2hhciAqTmFtZSkKLXsKLQotICAgIFBWT0lEIEJhc2VBZGRyZXNzOwkJLyogUG9pbnRlciB0byB0aGUgYmFzZSBhZGRyZXNzIG9mCi0JCQkJICAgdGhlIHNoYXJlZCBtZW1vcnkgb2JqZWN0ICovCi0gICAgVUxPTkcgQXR0cmlidXRlRmxhZ3M7CS8qIEZsYWdzIGRlc2NyaWJpbmcgY2hhcmFjdGVyaXN0aWNzCi0JCQkJICAgb2YgdGhlIHNoYXJlZCBtZW1vcnkgb2JqZWN0ICovCi0gICAgQVBJUkVUIHJjOwkJCS8qIFJldHVybiBjb2RlICovCi0KLSAgICAvKiBSZXF1ZXN0IHJlYWQgYW5kIHdyaXRlIGFjY2VzcyB0byAqLwotICAgIC8qICAgdGhlIHNoYXJlZCBtZW1vcnkgb2JqZWN0ICAgICAgICovCi0gICAgQXR0cmlidXRlRmxhZ3MgPSBQQUdfV1JJVEUgfCBQQUdfUkVBRDsKLQotICAgIHJjID0gRG9zR2V0TmFtZWRTaGFyZWRNZW0oJkJhc2VBZGRyZXNzLCBOYW1lLCBBdHRyaWJ1dGVGbGFncyk7Ci0KLSAgICBpZiAocmMgIT0gMCkgewotCXByaW50ZigiRG9zR2V0TmFtZWRTaGFyZWRNZW0gZXJyb3I6IHJldHVybiBjb2RlID0gJWxkIiwgcmMpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiBCYXNlQWRkcmVzczsKLX0KLQotc3RhdGljIHZvaWQgc2V0dXBfc2hhcmVkX21lbShhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgY2FkZHJfdCBtOwotCi0gICAgaW50IHJjOwotCi0gICAgbSA9IChjYWRkcl90KSBjcmVhdGVfc2hhcmVkX2hlYXAoIlxcU0hBUkVNRU1cXFNDT1JFQk9BUkQiLCBTQ09SRUJPQVJEX1NJWkUpOwotICAgIGlmIChtID09IDApIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIiVzOiBDb3VsZCBub3QgY3JlYXRlIE9TLzIgU2hhcmVkIG1lbW9yeSBwb29sLiIsCi0JCSAgICAgYXBfc2VydmVyX2FyZ3YwKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0KLSAgICByYyA9IF91b3BlbigoSGVhcF90KSBtKTsKLSAgICBpZiAocmMgIT0gMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwKLQkJIiVzOiBDb3VsZCBub3QgdW9wZW4oKSBuZXdseSBjcmVhdGVkIE9TLzIgU2hhcmVkIG1lbW9yeSBwb29sLiIsCi0JCWFwX3NlcnZlcl9hcmd2MCk7Ci0gICAgfQotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UgPSAoc2NvcmVib2FyZCAqKSBtOwotfQotCi1BUElfRVhQT1JUKHZvaWQpIHJlb3Blbl9zY29yZWJvYXJkKGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICBjYWRkcl90IG07Ci0gICAgaW50IHJjOwotCi0gICAgbSA9IChjYWRkcl90KSBnZXRfc2hhcmVkX2hlYXAoIlxcU0hBUkVNRU1cXFNDT1JFQk9BUkQiKTsKLSAgICBpZiAobSA9PSAwKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICIlczogQ291bGQgbm90IGZpbmQgZXhpc3RpbmcgT1MvMiBTaGFyZWQgbWVtb3J5IHBvb2wuIiwKLQkJYXBfc2VydmVyX2FyZ3YwKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0KLSAgICByYyA9IF91b3BlbigoSGVhcF90KSBtKTsKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlID0gKHNjb3JlYm9hcmQgKikgbTsKLX0KLQotI2VsaWYgZGVmaW5lZChVU0VfUE9TSVhfU0NPUkVCT0FSRCkKLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotLyogCi0gKiBQT1NJWCAxMDAzLjQgc3R5bGUKLSAqCi0gKiBOb3RlIDE6IAotICogQXMgb2YgdmVyc2lvbiA0LjIzQSwgc2hhcmVkIG1lbW9yeSBpbiBRTlggbXVzdCByZXNpZGUgdW5kZXIgL2Rldi9zaG1lbSwKLSAqIHdoZXJlIG5vIHN1YmRpcmVjdG9yaWVzIGFsbG93ZWQuCi0gKgotICogUE9TSVggc2htX29wZW4oKSBhbmQgc2htX3VubGluaygpIHdpbGwgdGFrZSBjYXJlIGFib3V0IHRoaXMgaXNzdWUsCi0gKiBidXQgdG8gYXZvaWQgY29uZnVzaW9uLCBJIHN1Z2dlc3QgdG8gcmVkZWZpbmUgc2NvcmVib2FyZCBmaWxlIG5hbWUKLSAqIGluIGh0dHBkLmNvbmYgdG8gY3V0ICJsb2dzLyIgZnJvbSBpdC4gV2l0aCBkZWZhdWx0IHNldHVwIGFjdHVhbCBuYW1lCi0gKiB3aWxsIGJlICIvZGV2L3NobWVtL2xvZ3MuYXBhY2hlX3N0YXR1cyIuIAotICogCi0gKiBJZiBzb21ldGhpbmcgd2VudCB3cm9uZyBhbmQgQXBhY2hlIGRpZCBub3QgdW5saW5rZWQgdGhpcyBvYmplY3QgdXBvbgotICogZXhpdCwgeW91IGNhbiByZW1vdmUgaXQgbWFudWFsbHksIHVzaW5nICJybSAtZiIgY29tbWFuZC4KLSAqIAotICogTm90ZSAyOgotICogPHN5cy9tbWFuLmg+IGluIFFOWCBkZWZpbmVzIE1BUF9BTk9OLCBidXQgY3VycmVudCBpbXBsZW1lbnRhdGlvbiAKLSAqIGRvZXMgTk9UIHN1cHBvcnQgQlNEIHN0eWxlIGFub255bW91cyBtYXBwaW5nLiBTbywgdGhlIG9yZGVyIG9mIAotICogY29uZGl0aW9uYWwgY29tcGlsYXRpb24gaXMgaW1wb3J0YW50OiAKLSAqIHRoaXMgI2lmZGVmIHNlY3Rpb24gbXVzdCBiZSBBQk9WRSB0aGUgbmV4dCBvbmUgKEJTRCBzdHlsZSkuCi0gKgotICogSSB0ZXN0ZWQgdGhpcyBzdHVmZiBhbmQgaXQgd29ya3MgZmluZSBmb3IgbWUsIGJ1dCBpZiBpdCBwcm92aWRlcyAKLSAqIHRyb3VibGUgZm9yIHlvdSwganVzdCBjb21tZW50IG91dCBVU0VfTU1BUF9TQ09SRUJPQVJEIGluIFFOWCBzZWN0aW9uCi0gKiBvZiBhcF9jb25maWcuaAotICoKLSAqIEp1bmUgNSwgMTk5NywgCi0gKiBJZ29yIE4uIEtvdmFsZW5rbyAtLSBpbmZvaEBtYWlsLndwbHVzLm5ldAotICovCi0KLXN0YXRpYyB2b2lkIGNsZWFudXBfc2hhcmVkX21lbSh2b2lkICpkKQotewotICAgIHNobV91bmxpbmsoYXBfc2NvcmVib2FyZF9mbmFtZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldHVwX3NoYXJlZF9tZW0oYXBfY29udGV4dF90ICpwKQotewotICAgIGNoYXIgYnVmWzUxMl07Ci0gICAgY2FkZHJfdCBtOwotICAgIGludCBmZDsKLQotICAgIGZkID0gc2htX29wZW4oYXBfc2NvcmVib2FyZF9mbmFtZSwgT19SRFdSIHwgT19DUkVBVCwgU19JUlVTUiB8IFNfSVdVU1IpOwotICAgIGlmIChmZCA9PSAtMSkgewotCWFwX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlczogY291bGQgbm90IG9wZW4oY3JlYXRlKSBzY29yZWJvYXJkIiwKLQkJICAgIGFwX3NlcnZlcl9hcmd2MCk7Ci0JcGVycm9yKGJ1Zik7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIGlmIChsdHJ1bmMoZmQsIChvZmZfdCkgU0NPUkVCT0FSRF9TSVpFLCBTRUVLX1NFVCkgPT0gLTEpIHsKLQlhcF9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXM6IGNvdWxkIG5vdCBsdHJ1bmMgc2NvcmVib2FyZCIsCi0JCSAgICBhcF9zZXJ2ZXJfYXJndjApOwotCXBlcnJvcihidWYpOwotCXNobV91bmxpbmsoYXBfc2NvcmVib2FyZF9mbmFtZSk7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIGlmICgobSA9IChjYWRkcl90KSBtbWFwKChjYWRkcl90KSAwLAotCQkJICAgIChzaXplX3QpIFNDT1JFQk9BUkRfU0laRSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkJCSAgICBNQVBfU0hBUkVELCBmZCwgKG9mZl90KSAwKSkgPT0gKGNhZGRyX3QpIC0gMSkgewotCWFwX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlczogY2Fubm90IG1tYXAgc2NvcmVib2FyZCIsCi0JCSAgICBhcF9zZXJ2ZXJfYXJndjApOwotCXBlcnJvcihidWYpOwotCXNobV91bmxpbmsoYXBfc2NvcmVib2FyZF9mbmFtZSk7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIGNsb3NlKGZkKTsKLSAgICBhcF9yZWdpc3Rlcl9jbGVhbnVwKHAsIE5VTEwsIGNsZWFudXBfc2hhcmVkX21lbSwgYXBfbnVsbF9jbGVhbnVwKTsKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlID0gKHNjb3JlYm9hcmQgKikgbTsKLX0KLQotQVBJX0VYUE9SVCh2b2lkKSByZW9wZW5fc2NvcmVib2FyZChhcF9jb250ZXh0X3QgKnApCi17Ci19Ci0KLSNlbGlmIGRlZmluZWQoVVNFX01NQVBfU0NPUkVCT0FSRCkKLQotc3RhdGljIHZvaWQgc2V0dXBfc2hhcmVkX21lbShhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgY2FkZHJfdCBtOwotCi0jaWYgZGVmaW5lZChNQVBfQU5PTikKLS8qIEJTRCBzdHlsZSAqLwotI2lmZGVmIENPTlZFWE9TMTEKLSAgICAvKgotICAgICAqIDktQXVnLTk3IC0gSmVmZiBWZW50ZXJzICh2ZW50ZXJzQGNvbnZleC5ocC5jb20pCi0gICAgICogQ29udmV4T1MgbWFwcyBhZGRyZXNzIHNwYWNlIGFzIGZvbGxvd3M6Ci0gICAgICogICAweDAwMDAwMDAwIC0gMHg3ZmZmZmZmZiA6IEtlcm5lbAotICAgICAqICAgMHg4MDAwMDAwMCAtIDB4ZmZmZmZmZmYgOiBVc2VyCi0gICAgICogU3RhcnQgbW1hcHBlZCBhcmVhIDFHQiBhYm92ZSBzdGFydCBvZiB0ZXh0LgotICAgICAqCi0gICAgICogQWxzbywgdGhlIGxlbmd0aCByZXF1aXJlcyBhIHBvaW50ZXIgYXMgdGhlIGFjdHVhbCBsZW5ndGggaXMKLSAgICAgKiByZXR1cm5lZCAocm91bmRlZCB1cCB0byBhIHBhZ2UgYm91bmRhcnkpLgotICAgICAqLwotICAgIHsKLQl1bnNpZ25lZCBsZW4gPSBTQ09SRUJPQVJEX1NJWkU7Ci0KLQltID0gbW1hcCgoY2FkZHJfdCkgMHhDMDAwMDAwMCwgJmxlbiwKLQkJIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9BTk9OIHwgTUFQX1NIQVJFRCwgTk9GRCwgMCk7Ci0gICAgfQotI2VsaWYgZGVmaW5lZChNQVBfVE1QRklMRSkKLSAgICB7Ci0JY2hhciBtZmlsZVtdID0gIi90bXAvYXBhY2hlX3NobWVtX1hYWFgiOwotCWludCBmZCA9IG1rc3RlbXAobWZpbGUpOwotCWlmIChmZCA9PSAtMSkgewotCSAgICBwZXJyb3IoIm9wZW4iKTsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IENvdWxkIG5vdCBvcGVuICVzIiwgYXBfc2VydmVyX2FyZ3YwLCBtZmlsZSk7Ci0JICAgIGV4aXQoQVBFWElUX0lOSVQpOwotCX0KLQltID0gbW1hcCgoY2FkZHJfdCkgMCwgU0NPUkVCT0FSRF9TSVpFLAotCQlQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmZCwgMCk7Ci0JaWYgKG0gPT0gKGNhZGRyX3QpIC0gMSkgewotCSAgICBwZXJyb3IoIm1tYXAiKTsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IENvdWxkIG5vdCBtbWFwICVzIiwgYXBfc2VydmVyX2FyZ3YwLCBtZmlsZSk7Ci0JICAgIGV4aXQoQVBFWElUX0lOSVQpOwotCX0KLQljbG9zZShmZCk7Ci0JdW5saW5rKG1maWxlKTsKLSAgICB9Ci0jZWxzZQotICAgIG0gPSBtbWFwKChjYWRkcl90KSAwLCBTQ09SRUJPQVJEX1NJWkUsCi0JICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfQU5PTiB8IE1BUF9TSEFSRUQsIC0xLCAwKTsKLSNlbmRpZgotICAgIGlmIChtID09IChjYWRkcl90KSAtIDEpIHsKLQlwZXJyb3IoIm1tYXAiKTsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIiVzOiBDb3VsZCBub3QgbW1hcCBtZW1vcnkiLCBhcF9zZXJ2ZXJfYXJndjApOwotCWV4aXQoQVBFWElUX0lOSVQpOwotICAgIH0KLSNlbHNlCi0vKiBTdW4gc3R5bGUgKi8KLSAgICBpbnQgZmQ7Ci0KLSAgICBmZCA9IG9wZW4oIi9kZXYvemVybyIsIE9fUkRXUik7Ci0gICAgaWYgKGZkID09IC0xKSB7Ci0JcGVycm9yKCJvcGVuIik7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICIlczogQ291bGQgbm90IG9wZW4gL2Rldi96ZXJvIiwgYXBfc2VydmVyX2FyZ3YwKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0gICAgbSA9IG1tYXAoKGNhZGRyX3QpIDAsIFNDT1JFQk9BUkRfU0laRSwKLQkgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkLCAwKTsKLSAgICBpZiAobSA9PSAoY2FkZHJfdCkgLSAxKSB7Ci0JcGVycm9yKCJtbWFwIik7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICIlczogQ291bGQgbm90IG1tYXAgL2Rldi96ZXJvIiwgYXBfc2VydmVyX2FyZ3YwKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0gICAgY2xvc2UoZmQpOwotI2VuZGlmCi0gICAgYXBfc2NvcmVib2FyZF9pbWFnZSA9IChzY29yZWJvYXJkICopIG07Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgcmVvcGVuX3Njb3JlYm9hcmQoYXBfY29udGV4dF90ICpwKQotewotfQotCi0jZWxpZiBkZWZpbmVkKFVTRV9TSE1HRVRfU0NPUkVCT0FSRCkKLXN0YXRpYyBrZXlfdCBzaG1rZXkgPSBJUENfUFJJVkFURTsKLXN0YXRpYyBpbnQgc2htaWQgPSAtMTsKLQotc3RhdGljIHZvaWQgc2V0dXBfc2hhcmVkX21lbShhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgc3RydWN0IHNobWlkX2RzIHNobWJ1ZjsKLSAgICBjb25zdCBzZXJ2ZXJfcmVjICogc2VydmVyX2NvbmYgPSBhcF9nZXRfc2VydmVyX2NvbmYoKTsKLSNpZmRlZiBNT1ZFQlJFQUsKLSAgICBjaGFyICpvYnJrOwotI2VuZGlmCi0KLSAgICBpZiAoKHNobWlkID0gc2htZ2V0KHNobWtleSwgU0NPUkVCT0FSRF9TSVpFLCBJUENfQ1JFQVQgfCBTSE1fUiB8IFNITV9XKSkgPT0gLTEpIHsKLSNpZmRlZiBMSU5VWAotCWlmIChlcnJubyA9PSBFTk9TWVMpIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRU1FUkcsIGVycm5vLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9jb25mLAotCQkJICJZb3VyIGtlcm5lbCB3YXMgYnVpbHQgd2l0aG91dCBDT05GSUdfU1lTVklQQ1xuIgotCQkJICIlczogUGxlYXNlIGNvbnN1bHQgdGhlIEFwYWNoZSBGQVEgZm9yIGRldGFpbHMiLAotCQkJIGFwX3NlcnZlcl9hcmd2MCk7Ci0JfQotI2VuZGlmCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCBlcnJubywgc2VydmVyX2NvbmYsCi0JCSAgICAiY291bGQgbm90IGNhbGwgc2htZ2V0Iik7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgZXJybm8sIHNlcnZlcl9jb25mLAotCQkiY3JlYXRlZCBzaGFyZWQgbWVtb3J5IHNlZ21lbnQgIyVkIiwgc2htaWQpOwotCi0jaWZkZWYgTU9WRUJSRUFLCi0gICAgLyoKLSAgICAgKiBTb21lIFN5c1Ygc3lzdGVtcyBwbGFjZSB0aGUgc2hhcmVkIHNlZ21lbnQgV0FZIHRvbyBjbG9zZQotICAgICAqIHRvIHRoZSBkeW5hbWljIG1lbW9yeSBicmVhayBwb2ludCAoc2JyaygwKSkuIFRoaXMgc2V2ZXJlbHkKLSAgICAgKiBsaW1pdHMgdGhlIHVzZSBvZiBtYWxsb2Mvc2JyayBpbiB0aGUgcHJvZ3JhbSBzaW5jZSBzYnJrIHdpbGwKLSAgICAgKiByZWZ1c2UgdG8gbW92ZSBwYXN0IHRoYXQgcG9pbnQuCi0gICAgICoKLSAgICAgKiBUbyBnZXQgYXJvdW5kIHRoaXMsIHdlIG1vdmUgdGhlIGJyZWFrIHBvaW50ICJ3YXkgdXAgdGhlcmUiLAotICAgICAqIGF0dGFjaCB0aGUgc2VnbWVudCBhbmQgdGhlbiBtb3ZlIGJyZWFrIGJhY2sgZG93bi4gVWdseQotICAgICAqLwotICAgIGlmICgob2JyayA9IHNicmsoTU9WRUJSRUFLKSkgPT0gKGNoYXIgKikgLTEpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgc2VydmVyX2NvbmYsCi0JICAgICJzYnJrKCkgY291bGQgbm90IG1vdmUgYnJlYWsiKTsKLSAgICB9Ci0jZW5kaWYKLQotI2RlZmluZSBCQURTSE1BVAkoKHNjb3JlYm9hcmQgKikoLTEpKQotICAgIGlmICgoYXBfc2NvcmVib2FyZF9pbWFnZSA9IChzY29yZWJvYXJkICopIHNobWF0KHNobWlkLCAwLCAwKSkgPT0gQkFEU0hNQVQpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJzaG1hdCBlcnJvciIpOwotCS8qCi0JICogV2UgZXhpdCBiZWxvdywgYWZ0ZXIgd2UgdHJ5IHRvIHJlbW92ZSB0aGUgc2VnbWVudAotCSAqLwotICAgIH0KLSAgICBlbHNlIHsJCQkvKiBvbmx5IHdvcnJ5IGFib3V0IHBlcm1pc3Npb25zIGlmIHdlIGF0dGFjaGVkIHRoZSBzZWdtZW50ICovCi0JaWYgKHNobWN0bChzaG1pZCwgSVBDX1NUQVQsICZzaG1idWYpICE9IDApIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHNlcnZlcl9jb25mLAotCQkic2htY3RsKCkgY291bGQgbm90IHN0YXQgc2VnbWVudCAjJWQiLCBzaG1pZCk7Ci0JfQotCWVsc2UgewotCSAgICBzaG1idWYuc2htX3Blcm0udWlkID0gdW5peGRfY29uZmlnLnVzZXJfaWQ7Ci0JICAgIHNobWJ1Zi5zaG1fcGVybS5naWQgPSB1bml4ZF9jb25maWcuZ3JvdXBfaWQ7Ci0JICAgIGlmIChzaG1jdGwoc2htaWQsIElQQ19TRVQsICZzaG1idWYpICE9IDApIHsKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHNlcnZlcl9jb25mLAotCQkgICAgInNobWN0bCgpIGNvdWxkIG5vdCBzZXQgc2VnbWVudCAjJWQiLCBzaG1pZCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIC8qCi0gICAgICogV2UgbXVzdCBhdm9pZCBsZWF2aW5nIHNlZ21lbnRzIGluIHRoZSBrZXJuZWwncwotICAgICAqIChzbWFsbCkgdGFibGVzLgotICAgICAqLwotICAgIGlmIChzaG1jdGwoc2htaWQsIElQQ19STUlELCBOVUxMKSAhPSAwKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwKLQkJInNobWN0bDogSVBDX1JNSUQ6IGNvdWxkIG5vdCByZW1vdmUgc2hhcmVkIG1lbW9yeSBzZWdtZW50ICMlZCIsCi0JCXNobWlkKTsKLSAgICB9Ci0gICAgaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UgPT0gQkFEU0hNQVQpCS8qIG5vdyBiYWlsb3V0ICovCi0JZXhpdChBUEVYSVRfSU5JVCk7Ci0KLSNpZmRlZiBNT1ZFQlJFQUsKLSAgICBpZiAob2JyayA9PSAoY2hhciAqKSAtMSkKLQlyZXR1cm47CQkJLyogbm90aGluZyBlbHNlIHRvIGRvICovCi0gICAgaWYgKHNicmsoLShNT1ZFQlJFQUspKSA9PSAoY2hhciAqKSAtMSkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGVycm5vLCBzZXJ2ZXJfY29uZiwKLQkgICAgInNicmsoKSBjb3VsZCBub3QgbW92ZSBicmVhayBiYWNrIik7Ci0gICAgfQotI2VuZGlmCi19Ci0KLUFQSV9FWFBPUlQodm9pZCkgcmVvcGVuX3Njb3JlYm9hcmQoYXBfY29udGV4dF90ICpwKQotewotfQotCi0jZW5kaWYKLQotLyogQ2FsbGVkIGJ5IHBhcmVudCBwcm9jZXNzICovCi12b2lkIHJlaW5pdF9zY29yZWJvYXJkKGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICBpZiAoYXBfc2NvcmVib2FyZF9pbWFnZSA9PSBOVUxMKSB7Ci0Jc2V0dXBfc2hhcmVkX21lbShwKTsKLSAgICB9Ci0gICAgbWVtc2V0KGFwX3Njb3JlYm9hcmRfaW1hZ2UsIDAsIFNDT1JFQk9BUkRfU0laRSk7Ci19Ci0KLS8qKioqCi0gKiBBYm92ZSBjb2RlIGlzIHNobWVtIGNvZGUuIEJlbG93IGNvZGUgaXMgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgc2htZW0KLSAqKioqLwotCi1zdGF0aWMgaW50IG1haW50YWluX2Nvbm5lY3Rpb25fc3RhdHVzID0gMTsKLQotdm9pZCBhcF9kZXh0ZXJfc2V0X21haW50YWluX2Nvbm5lY3Rpb25fc3RhdHVzKGludCBmbGFnKSB7Ci0gICAgbWFpbnRhaW5fY29ubmVjdGlvbl9zdGF0dXMgPSBmbGFnOwotICAgIHJldHVybjsKLX0KLQotLyogVXNlZnVsIHRvIGVyYXNlIHRoZSBzdGF0dXMgb2YgY2hpbGRyZW4gdGhhdCBtaWdodCBiZSBmcm9tIHByZXZpb3VzCi0gKiBnZW5lcmF0aW9ucyAqLwotdm9pZCBhcF9kZXh0ZXJfZm9yY2VfcmVzZXRfY29ubmVjdGlvbl9zdGF0dXMobG9uZyBjb25uX2lkKQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IFNUQVRVU0VTX1BFUl9DT05ORUNUSU9OOyBpKyspIHsKLSAgICAgICAgYXBfc2NvcmVib2FyZF9pbWFnZS0+dGFibGVbY29ubl9pZF1baV0ua2V5WzBdID0gJ1wwJzsKLSAgICB9Ci19Ci0KLXZvaWQgYXBfcmVzZXRfY29ubmVjdGlvbl9zdGF0dXMobG9uZyBjb25uX2lkKQotewotICAgIGlmIChtYWludGFpbl9jb25uZWN0aW9uX3N0YXR1cykgewotICAgICAgICBhcF9kZXh0ZXJfZm9yY2VfcmVzZXRfY29ubmVjdGlvbl9zdGF0dXMoY29ubl9pZCk7Ci0gICAgfQotfQotCi0vKiBEb24ndCBtZXNzIHdpdGggdGhlIHN0cmluZyB5b3UgZ2V0IGJhY2sgZnJvbSB0aGlzIGZ1bmN0aW9uICovCi1jb25zdCBjaGFyICphcF9nZXRfY29ubmVjdGlvbl9zdGF0dXMobG9uZyBjb25uX2lkLCBjb25zdCBjaGFyICprZXkpCi17Ci0gICAgaW50IGkgPSAwOwotICAgIHN0YXR1c190YWJsZV9lbnRyeSAqc3M7Ci0KLSAgICBpZiAoIW1haW50YWluX2Nvbm5lY3Rpb25fc3RhdHVzKSByZXR1cm4gIiI7Ci0gICAgd2hpbGUgKGkgPCBTVEFUVVNFU19QRVJfQ09OTkVDVElPTikgewotICAgICAgICBzcyA9ICYoYXBfc2NvcmVib2FyZF9pbWFnZS0+dGFibGVbY29ubl9pZF1baV0pOwotICAgICAgICBpZiAoc3MtPmtleVswXSA9PSAnXDAnKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoMCA9PSBzdHJjbXAoc3MtPmtleSwga2V5KSkgewotICAgICAgICAgICAgcmV0dXJuIHNzLT52YWx1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi1hcF9hcnJheV9oZWFkZXJfdCAqYXBfZ2V0X2Nvbm5lY3Rpb25zKGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICBpbnQgaTsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqY29ubmVjdGlvbl9saXN0OwotICAgIGxvbmcgKmFycmF5X3Nsb3Q7Ci0KLSAgICBjb25uZWN0aW9uX2xpc3QgPSBhcF9tYWtlX2FycmF5KHAsIDAsIHNpemVvZihsb25nKSk7Ci0gICAgLyogV2UgYXNzdW1lIHRoYXQgdGhlcmUgaXMgYSBjb25uZWN0aW9uIGlmZiBpdCBoYXMgYW4gZW50cnkgaW4gdGhlIHN0YXR1cwotICAgICAqIHRhYmxlLiBDb25uZWN0aW9ucyB3aXRob3V0IGFueSBzdGF0dXMgc291bmQgcHJvYmxlbWF0aWMgdG8gbWUsIHNvIHRoaXMKLSAgICAgKiBpcyBwcm9iYWJseSBmb3IgdGhlIGJlc3QuIC0gbWFub2ogKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgbWF4X2RhZW1vbnNfbGltaXQqSEFSRF9USFJFQURfTElNSVQ7IGkrKykgewotCWlmIChhcF9zY29yZWJvYXJkX2ltYWdlLT50YWJsZVtpXVswXS5rZXlbMF0gIT0gJ1wwJykgewotICAgICAgICAgICAgYXJyYXlfc2xvdCA9IGFwX3B1c2hfYXJyYXkoY29ubmVjdGlvbl9saXN0KTsKLSAgICAgICAgICAgICphcnJheV9zbG90ID0gaTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gY29ubmVjdGlvbl9saXN0OwotfQotCi1hcF9hcnJheV9oZWFkZXJfdCAqYXBfZ2V0X2Nvbm5lY3Rpb25fa2V5cyhhcF9jb250ZXh0X3QgKnAsIGxvbmcgY29ubl9pZCkKLXsKLSAgICBpbnQgaSA9IDA7Ci0gICAgc3RhdHVzX3RhYmxlX2VudHJ5ICpzczsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqa2V5X2xpc3Q7Ci0gICAgY2hhciAqKmFycmF5X3Nsb3Q7Ci0KLSAgICBrZXlfbGlzdCA9IGFwX21ha2VfYXJyYXkocCwgMCwgS0VZX0xFTkdUSCAqIHNpemVvZihjaGFyKSk7Ci0gICAgd2hpbGUgKGkgPCBTVEFUVVNFU19QRVJfQ09OTkVDVElPTikgewotICAgICAgICBzcyA9ICYoYXBfc2NvcmVib2FyZF9pbWFnZS0+dGFibGVbY29ubl9pZF1baV0pOwotICAgICAgICBpZiAoc3MtPmtleVswXSA9PSAnXDAnKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBhcnJheV9zbG90ID0gYXBfcHVzaF9hcnJheShrZXlfbGlzdCk7Ci0gICAgICAgICphcnJheV9zbG90ID0gYXBfcHN0cmR1cChwLCBzcy0+a2V5KTsKLSAgICAgICAgaSsrOwotICAgIH0KLSAgICByZXR1cm4ga2V5X2xpc3Q7Ci19Ci0KLS8qIE5vdGU6IG5vIGVmZm9ydCBpcyBtYWRlIGhlcmUgdG8gcHJldmVudCBtdWx0aXBsZSB0aHJlYWRzIGZyb20gbWVzc2luZyB3aXRoCi0gKiBhIHNpbmdsZSBjb25uZWN0aW9uIGF0IHRoZSBzYW1lIHRpbWUuIGFwX3VwZGF0ZV9jb25uZWN0aW9uX3N0YXR1cyBzaG91bGQKLSAqIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSB0aHJlYWQgdGhhdCBvd25zIHRoZSBjb25uZWN0aW9uICovCi0KLXZvaWQgYXBfdXBkYXRlX2Nvbm5lY3Rpb25fc3RhdHVzKGxvbmcgY29ubl9pZCwgY29uc3QgY2hhciAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUpCi17Ci0gICAgaW50IGkgPSAwOwotICAgIHN0YXR1c190YWJsZV9lbnRyeSAqc3M7Ci0KLSAgICBpZiAoIW1haW50YWluX2Nvbm5lY3Rpb25fc3RhdHVzKSByZXR1cm47Ci0gICAgd2hpbGUgKGkgPCBTVEFUVVNFU19QRVJfQ09OTkVDVElPTikgewotICAgICAgICBzcyA9ICYoYXBfc2NvcmVib2FyZF9pbWFnZS0+dGFibGVbY29ubl9pZF1baV0pOwotICAgICAgICBpZiAoc3MtPmtleVswXSA9PSAnXDAnKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoMCA9PSBzdHJjbXAoc3MtPmtleSwga2V5KSkgewotICAgICAgICAgICAgYXBfY3B5c3Rybihzcy0+dmFsdWUsIHZhbHVlLCBWQUxVRV9MRU5HVEgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0JaSsrOwotICAgIH0KLSAgICAvKiBOb3QgZm91bmQuIEFkZCBhbiBlbnRyeSBmb3IgdGhpcyB2YWx1ZSAqLwotICAgIGlmIChpID49IFNUQVRVU0VTX1BFUl9DT05ORUNUSU9OKSB7Ci0gICAgICAgIC8qIE5vIHJvb20uIE9oIHdlbGwsIG5vdCBtdWNoIGFueW9uZSBjYW4gZG8gYWJvdXQgaXQuICovCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYXBfY3B5c3Rybihzcy0+a2V5LCBrZXksIEtFWV9MRU5HVEgpOwotICAgIGFwX2NweXN0cm4oc3MtPnZhbHVlLCB2YWx1ZSwgVkFMVUVfTEVOR1RIKTsKLSAgICByZXR1cm47Ci19Ci0KLWFwX2FycmF5X2hlYWRlcl90ICphcF9nZXRfc3RhdHVzX3RhYmxlKGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICBpbnQgaSwgajsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqc2VydmVyX3N0YXR1czsKLSAgICBhcF9zdGF0dXNfdGFibGVfcm93X3QgKmFycmF5X3Nsb3Q7Ci0gICAgc3RhdHVzX3RhYmxlX2VudHJ5ICpzczsKLQotICAgIHNlcnZlcl9zdGF0dXMgPSBhcF9tYWtlX2FycmF5KHAsIDAsIHNpemVvZihhcF9zdGF0dXNfdGFibGVfcm93X3QpKTsKLQotICAgIC8qIEdvIGFoZWFkIGFuZCByZXR1cm4gd2hhdCdzIGluIHRoZSBjb25uZWN0aW9uIHN0YXR1cyB0YWJsZSBldmVuIGlmIHdlCi0gICAgICogYXJlbid0IG1haW50YWluaW5nIGl0LiBXZSBjYW4gYXQgbGVhc3QgbG9vayBhdCB3aGF0IGNoaWxkcmVuIGZyb20KLSAgICAgKiBwcmV2aW91cyBnZW5lcmF0aW9ucyBhcmUgdXAgdG8uICovCi0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbWF4X2RhZW1vbnNfbGltaXQqSEFSRF9USFJFQURfTElNSVQ7IGkrKykgewotCWlmIChhcF9zY29yZWJvYXJkX2ltYWdlLT50YWJsZVtpXVswXS5rZXlbMF0gPT0gJ1wwJykKLQkgICAgY29udGludWU7Ci0gICAgICAgIGFycmF5X3Nsb3QgPSBhcF9wdXNoX2FycmF5KHNlcnZlcl9zdGF0dXMpOwotICAgICAgICBhcnJheV9zbG90LT5kYXRhID0gYXBfbWFrZV90YWJsZShwLCAwKTsKLSAgICAgICAgYXJyYXlfc2xvdC0+Y29ubl9pZCA9IGk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKGogPSAwOyBqIDwgU1RBVFVTRVNfUEVSX0NPTk5FQ1RJT047IGorKykgewotCSAgICBzcyA9ICYoYXBfc2NvcmVib2FyZF9pbWFnZS0+dGFibGVbaV1bal0pOwotICAgICAgICAgICAgaWYgKHNzLT5rZXlbMF0gIT0gJ1wwJykgewotICAgICAgICAgICAgICAgIGFwX3RhYmxlX2FkZChhcnJheV9zbG90LT5kYXRhLCBzcy0+a2V5LCBzcy0+dmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNlcnZlcl9zdGF0dXM7Ci19CmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL2RleHRlci9zY29yZWJvYXJkLmggYi9zZXJ2ZXIvbXBtL2RleHRlci9zY29yZWJvYXJkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZGQyNTkuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9kZXh0ZXIvc2NvcmVib2FyZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIAotICogYXJlIG1ldDogCi0gKiAKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAgCi0gKiAKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIAotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSAKLSAqICAgIGRpc3RyaWJ1dGlvbi4gCi0gKiAKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyAKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAgCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIiAKLSAqIAotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0byAKLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCAKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLiAKLSAqIAotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIgCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuIAotICogCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nIAotICogICAgYWNrbm93bGVkZ21lbnQ6IAotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cCAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iIAotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkgCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIAotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IgCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgCi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gKiAKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55IAotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkIAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIAotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLiAKLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4gCi0gKiAKLSAqLyAKLQotI2lmbmRlZiBBUEFDSEVfU0NPUkVCT0FSRF9ICi0jZGVmaW5lIEFQQUNIRV9TQ09SRUJPQVJEX0gKLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZmRlZiBUUEYKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHN5cy90aW1lcy5oPgotI2VuZGlmIC8qIFRQRiAqLwotCi0jaW5jbHVkZSAibXBtX2RlZmF1bHQuaCIJLyogRm9yIEhBUkRfLipfTElNSVQgKi8KLQotLyogVGhlIGdlbmVyaWMgc2hhcmVkIG1lbW9yeSBjaHVuayBjb2RlICovCi12b2lkIHJlaW5pdF9zY29yZWJvYXJkKGFwX2NvbnRleHRfdCAqcCk7Ci0jaWYgZGVmaW5lZChVU0VfT1MyX1NDT1JFQk9BUkQpCi1jYWRkcl90IGNyZWF0ZV9zaGFyZWRfaGVhcChjb25zdCBjaGFyICpuYW1lLCBzaXplX3Qgc2l6ZSk7Ci1jYWRkcl90IGdldF9zaGFyZWRfaGVhcChjb25zdCBjaGFyICpOYW1lKTsKLSNlbmRpZgotCi1BUElfRVhQT1JUKHZvaWQpIHJlb3Blbl9zY29yZWJvYXJkKGFwX2NvbnRleHRfdCAqcCk7Ci0KLS8qIFRoZSBzdHVmZiBmb3IgRGV4dGVyJ3Mgc3RhdHVzIHRhYmxlICovCi0KLSNpbmNsdWRlICJtcG1fc3RhdHVzLmgiCi0KLXZvaWQgYXBfZGV4dGVyX3NldF9tYWludGFpbl9jb25uZWN0aW9uX3N0YXR1cyhpbnQgZmxhZyk7Ci12b2lkIGFwX2RleHRlcl9mb3JjZV9yZXNldF9jb25uZWN0aW9uX3N0YXR1cyhsb25nIGNvbm5faWQpOwotI2RlZmluZSBLRVlfTEVOR1RIIDE2Ci0jZGVmaW5lIFZBTFVFX0xFTkdUSCA2NAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNoYXIga2V5W0tFWV9MRU5HVEhdOwotICAgIGNoYXIgdmFsdWVbVkFMVUVfTEVOR1RIXTsKLX0gc3RhdHVzX3RhYmxlX2VudHJ5OwotCi0jZGVmaW5lIFNUQVRVU0VTX1BFUl9DT05ORUNUSU9OIDEwCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBzdGF0dXNfdGFibGVfZW50cnkKLSAgICAgICAgdGFibGVbSEFSRF9TRVJWRVJfTElNSVQqSEFSRF9USFJFQURfTElNSVRdW1NUQVRVU0VTX1BFUl9DT05ORUNUSU9OXTsKLX0gc2NvcmVib2FyZDsKLQotI2RlZmluZSBTQ09SRUJPQVJEX1NJWkUJCXNpemVvZihzY29yZWJvYXJkKQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYJLyogIUFQQUNIRV9TQ09SRUJPQVJEX0ggKi8KZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vbXBtdF9iZW9zL01ha2VmaWxlLmxpYmRpciBiL3NlcnZlci9tcG0vbXBtdF9iZW9zL01ha2VmaWxlLmxpYmRpcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1MjU0MC4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL21wbXRfYmVvcy9NYWtlZmlsZS5saWJkaXIKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVRoaXMgaXMgYSBwbGFjZS1ob2xkZXIgd2hpY2ggaW5kaWNhdGVzIHRvIENvbmZpZ3VyZSB0aGF0IGl0IHNob3VsZG4ndAotcHJvdmlkZSB0aGUgZGVmYXVsdCB0YXJnZXRzIHdoZW4gYnVpbGRpbmcgdGhlIE1ha2VmaWxlIGluIHRoaXMgZGlyZWN0b3J5LgotSW5zdGVhZCBpdCdsbCBqdXN0IHByZXBlbmQgYWxsIHRoZSBpbXBvcnRhbnQgdmFyaWFibGUgZGVmaW5pdGlvbnMsIGFuZAotY29weSB0aGUgTWFrZWZpbGUudG1wbCBvbnRvIHRoZSBlbmQuCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL21wbXRfYmVvcy9tcG1fZGVmYXVsdC5oIGIvc2VydmVyL21wbS9tcG10X2Jlb3MvbXBtX2RlZmF1bHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJhNGIyNC4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL21wbXRfYmVvcy9tcG1fZGVmYXVsdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIAotICogYXJlIG1ldDogCi0gKiAKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAgCi0gKiAKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIAotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSAKLSAqICAgIGRpc3RyaWJ1dGlvbi4gCi0gKiAKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyAKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAgCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIiAKLSAqIAotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0byAKLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCAKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLiAKLSAqIAotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIgCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuIAotICogCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nIAotICogICAgYWNrbm93bGVkZ21lbnQ6IAotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cCAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iIAotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkgCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIAotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IgCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgCi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gKiAKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55IAotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkIAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIAotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLiAKLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4gCi0gKiAKLSAqLyAKLQotI2lmbmRlZiBBUEFDSEVfTVBNX0RFRkFVTFRfSAotI2RlZmluZSBBUEFDSEVfTVBNX0RFRkFVTFRfSAotCi0vKiBOdW1iZXIgb2Ygc2VydmVycyB0byBzcGF3biBvZmYgYnkgZGVmYXVsdCAtLS0gYWxzbywgaWYgZmV3ZXIgdGhhbgotICogdGhpcyBmcmVlIHdoZW4gdGhlIGNhcmV0YWtlciBjaGVja3MsIGl0IHdpbGwgc3Bhd24gbW9yZS4KLSAqLwotI2lmbmRlZiBERUZBVUxUX1NUQVJUX0RBRU1PTgotI2RlZmluZSBERUZBVUxUX1NUQVJUX0RBRU1PTiA1Ci0jZW5kaWYKLQotLyogTWF4aW11bSBudW1iZXIgb2YgKmZyZWUqIHNlcnZlciBwcm9jZXNzZXMgLS0tIG1vcmUgdGhhbiB0aGlzLCBhbmQKLSAqIHRoZXkgd2lsbCBkaWUgb2ZmLgotICovCi0KLSNpZm5kZWYgREVGQVVMVF9NQVhfRlJFRV9EQUVNT04KLSNkZWZpbmUgREVGQVVMVF9NQVhfRlJFRV9EQUVNT04gMTAKLSNlbmRpZgotCi0vKiBNaW5pbXVtIC0tLSBmZXdlciB0aGFuIHRoaXMsIGFuZCBtb3JlIHdpbGwgYmUgY3JlYXRlZCAqLwotCi0jaWZuZGVmIERFRkFVTFRfTUlOX0ZSRUVfREFFTU9OCi0jZGVmaW5lIERFRkFVTFRfTUlOX0ZSRUVfREFFTU9OIDUKLSNlbmRpZgotCi0vKiBMaW1pdCBvbiB0aGUgdG90YWwgLS0tIGNsaWVudHMgd2lsbCBiZSBsb2NrZWQgb3V0IGlmIG1vcmUgc2VydmVycyB0aGFuCi0gKiB0aGlzIGFyZSBuZWVkZWQuICBJdCBpcyBpbnRlbmRlZCBzb2xlbHkgdG8ga2VlcCB0aGUgc2VydmVyIGZyb20gY3Jhc2hpbmcKLSAqIHdoZW4gdGhpbmdzIGdldCBvdXQgb2YgaGFuZC4KLSAqCi0gKiBXZSBrZWVwIGEgaGFyZCBtYXhpbXVtIG51bWJlciBvZiBzZXJ2ZXJzLCBmb3IgdHdvIHJlYXNvbnMgLS0tIGZpcnN0IG9mZiwKLSAqIGluIGNhc2Ugc29tZXRoaW5nIGdvZXMgc2VyaW91c2x5IHdyb25nLCB3ZSB3YW50IHRvIHN0b3AgdGhlIGZvcmsgYm9tYgotICogc2hvcnQgb2YgYWN0dWFsbHkgY3Jhc2hpbmcgdGhlIG1hY2hpbmUgd2UncmUgcnVubmluZyBvbiBieSBmaWxsaW5nIHNvbWUKLSAqIGtlcm5lbCB0YWJsZS4gIFNlY29uZGx5LCBpdCBrZWVwcyB0aGUgc2l6ZSBvZiB0aGUgc2NvcmVib2FyZCBmaWxlIHNtYWxsCi0gKiBlbm91Z2ggdGhhdCB3ZSBjYW4gcmVhZCB0aGUgd2hvbGUgdGhpbmcgd2l0aG91dCB3b3JyeWluZyB0b28gbXVjaCBhYm91dAotICogdGhlIG92ZXJoZWFkLgotICovCi0jaWZkZWYgTk9fVEhSRUFEUwotI2RlZmluZSBIQVJEX1NFUlZFUl9MSU1JVCAyNTYKLSNlbmRpZgotI2lmbmRlZiBIQVJEX1NFUlZFUl9MSU1JVAotI2RlZmluZSBIQVJEX1NFUlZFUl9MSU1JVCA4IAotI2VuZGlmCi0KLS8qIExpbWl0IG9uIHRoZSB0aHJlYWRzIHBlciBwcm9jZXNzLiAgQ2xpZW50cyB3aWxsIGJlIGxvY2tlZCBvdXQgaWYgbW9yZSB0aGFuCi0gKiB0aGlzICAqIEhBUkRfU0VSVkVSX0xJTUlUIGFyZSBuZWVkZWQuCi0gKgotICogV2Uga2VlcCB0aGlzIGZvciBvbmUgcmVhc29uIGl0IGtlZXBzIHRoZSBzaXplIG9mIHRoZSBzY29yZWJvYXJkIGZpbGUgc21hbGwKLSAqIGVub3VnaCB0aGF0IHdlIGNhbiByZWFkIHRoZSB3aG9sZSB0aGluZyB3aXRob3V0IHdvcnJ5aW5nIHRvbyBtdWNoIGFib3V0Ci0gKiB0aGUgb3ZlcmhlYWQuCi0gKi8KLSNpZmRlZiBOT19USFJFQURTCi0jZGVmaW5lIEhBUkRfVEhSRUFEX0xJTUlUIDEKLSNlbmRpZgotI2lmbmRlZiBIQVJEX1RIUkVBRF9MSU1JVAotI2RlZmluZSBIQVJEX1RIUkVBRF9MSU1JVCA2NCAKLSNlbmRpZgotCi0jaWZkZWYgTk9fVEhSRUFEUwotI2RlZmluZSBERUZBVUxUX1RIUkVBRFNfUEVSX0NISUxEIDEKLSNlbmRpZgotI2lmbmRlZiBERUZBVUxUX1RIUkVBRFNfUEVSX0NISUxECi0jZGVmaW5lIERFRkFVTFRfVEhSRUFEU19QRVJfQ0hJTEQgMTAKLSNlbmRpZgotCi0vKiBXaGVyZSB0aGUgbWFpbi9wYXJlbnQgcHJvY2VzcydzIHBpZCBpcyBsb2dnZWQgKi8KLSNpZm5kZWYgREVGQVVMVF9QSURMT0cKLSNkZWZpbmUgREVGQVVMVF9QSURMT0cgImxvZ3MvaHR0cGQucGlkIgotI2VuZGlmCi0KLS8qCi0gKiBJbnRlcnZhbCwgaW4gbWljcm9zZWNvbmRzLCBiZXR3ZWVuIHNjb3JlYm9hcmQgbWFpbnRlbmFuY2UuCi0gKi8KLSNpZm5kZWYgU0NPUkVCT0FSRF9NQUlOVEVOQU5DRV9JTlRFUlZBTAotI2RlZmluZSBTQ09SRUJPQVJEX01BSU5URU5BTkNFX0lOVEVSVkFMIDEwMDAwMDAKLSNlbmRpZgotCi0vKiBOdW1iZXIgb2YgcmVxdWVzdHMgdG8gdHJ5IHRvIGhhbmRsZSBpbiBhIHNpbmdsZSBwcm9jZXNzLiAgSWYgPD0gMCwKLSAqIHRoZSBjaGlsZHJlbiBkb24ndCBkaWUgb2ZmLgotICovCi0jaWZuZGVmIERFRkFVTFRfTUFYX1JFUVVFU1RTX1BFUl9DSElMRAotI2RlZmluZSBERUZBVUxUX01BWF9SRVFVRVNUU19QRVJfQ0hJTEQgMTAwMDAKLSNlbmRpZgotCi0jZW5kaWYgLyogQVBfTVBNX0RFRkFVTFRfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9tcG10X2Jlb3MvbXBtdF9iZW9zLmMgYi9zZXJ2ZXIvbXBtL21wbXRfYmVvcy9tcG10X2Jlb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThmMGRhZS4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL21wbXRfYmVvcy9tcG10X2Jlb3MuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MzEgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCi0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgCi0gKiBhcmUgbWV0OiAKLSAqIAotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgCi0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuICAKLSAqIAotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgCi0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIAotICogICAgZGlzdHJpYnV0aW9uLiAKLSAqIAotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIAotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6IAotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cCAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iIAotICogCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvIAotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCi0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuIAotICogCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiAKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4gCi0gKiAKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcgCi0gKiAgICBhY2tub3dsZWRnbWVudDogCi0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwIAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIgCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWSAKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUiAKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCi0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSAKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCAKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKLSAqIAotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkgCi0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQgCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uIAotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlciAKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LiAKLSAqIAotICovIAotCi0vKiBUaGlzIG1vZHVsZSBpcyBlZmZlY3Rpdmx5IG1wbXRfcHRocmVhZCBtdWNoIG1vZGlmaWVkIHRvCi0gKiBhbGxvdyBpdCB3b3JrIG9uIEJlT1MuICBJdCdzIHN0YWJsZSBhbmQgd29ya3MgT0suCi0gKi8KLSAKLSNkZWZpbmUgQ09SRV9QUklWQVRFIAotIAotI2luY2x1ZGUgImFwcl9wb3J0YWJsZS5oIgotI2luY2x1ZGUgImh0dHBkLmgiIAotI2luY2x1ZGUgImh0dHBfbWFpbi5oIiAKLSNpbmNsdWRlICJodHRwX2xvZy5oIiAKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgkvKiBmb3IgcmVhZF9jb25maWcgKi8gCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCQkvKiBmb3IgZ2V0X3JlbW90ZV9ob3N0ICovIAotI2luY2x1ZGUgImh0dHBfY29ubmVjdGlvbi5oIgotI2luY2x1ZGUgImFwX21wbS5oIgotI2luY2x1ZGUgImJlb3NkLmgiCi0jaW5jbHVkZSAiaW9sX3NvY2tldC5oIgotI2luY2x1ZGUgImFwX2xpc3Rlbi5oIgotI2luY2x1ZGUgInNjb3JlYm9hcmQuaCIgCi0jaW5jbHVkZSAiYWNjZXB0bG9jay5oIgotI2luY2x1ZGUgIm11dGV4LmgiCi0jaW5jbHVkZSAicG9sbC5oIgotCi0vKgotICogQWN0dWFsIGRlZmluaXRpb25zIG9mIGNvbmZpZyBnbG9iYWxzCi0gKi8KLQotaW50IGFwX3RocmVhZHNfcGVyX2NoaWxkPTA7ICAgICAgICAgLyogV29ya2VyIHRocmVhZHMgcGVyIGNoaWxkICovCi1pbnQgYXBfbWF4X3JlcXVlc3RzX3Blcl9jaGlsZD0wOwotc3RhdGljIGNoYXIgKmFwX3BpZF9mbmFtZT1OVUxMOwotc3RhdGljIGNoYXIgKmFwX3Njb3JlYm9hcmRfZm5hbWU9TlVMTDsKLXN0YXRpYyBpbnQgYXBfZGFlbW9uc190b19zdGFydD0wOwotc3RhdGljIGludCBtaW5fc3BhcmVfdGhyZWFkcz0wOwotc3RhdGljIGludCBtYXhfc3BhcmVfdGhyZWFkcz0wOwotc3RhdGljIGludCBhcF9kYWVtb25zX2xpbWl0PTA7Ci1zdGF0aWMgdGltZV90IGFwX3Jlc3RhcnRfdGltZT0wOwotQVBJX1ZBUl9FWFBPUlQgaW50IGFwX2V4dGVuZGVkX3N0YXR1cyA9IDA7Ci1zdGF0aWMgaW50IHdvcmtlcnNfbWF5X2V4aXQgPSAwOwotc3RhdGljIGludCByZXF1ZXN0c190aGlzX2NoaWxkOwotc3RhdGljIGludCBudW1fbGlzdGVuZmRzID0gMDsKLXN0YXRpYyBzdHJ1Y3QgcG9sbGZkICpsaXN0ZW5mZHM7Ci0KLS8qIFRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBwYXNzIHVuaXF1ZSBpbml0aWFsaXphdGlvbiBpbmZvIHRvIGVhY2ggdGhyZWFkICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50IHBpZDsKLSAgICB0aHJlYWRfaWQgdGlkOwotICAgIGludCBzZDsKLSAgICBhcF9jb250ZXh0X3QgKnRwb29sOyAvKiAicHRocmVhZCIgd291bGQgYmUgY29uZnVzaW5nICovCi19IHByb2NfaW5mbzsKLQotI2RlZmluZSBTRVJWRVJfREVBRCAwCi0jZGVmaW5lIFNFUlZFUl9EWUlORyAxCi0jZGVmaW5lIFNFUlZFUl9BTElWRSAyCi0KLXN0YXRpYyBzdHJ1Y3QgewotICAgIHBpZF90IHBpZDsKLSAgICB1bnNpZ25lZCBjaGFyIHN0YXR1czsKLX0gY2hpbGRfdGFibGVbSEFSRF9TRVJWRVJfTElNSVRdOwotCi0jaWYgMAotI2RlZmluZSBTQUZFX0FDQ0VQVChzdG10KSBkbyB7aWYgKGFwX2xpc3RlbmVycy0+bmV4dCAhPSBOVUxMKSB7c3RtdDt9fSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIFNBRkVfQUNDRVBUKHN0bXQpIGRvIHtzdG10O30gd2hpbGUgKDApCi0jZW5kaWYKLQotLyoKLSAqIFRoZSBtYXggY2hpbGQgc2xvdCBldmVyIGFzc2lnbmVkLCBwcmVzZXJ2ZWQgYWNyb3NzIHJlc3RhcnRzLiAgTmVjZXNzYXJ5Ci0gKiB0byBkZWFsIHdpdGggTWF4Q2xpZW50cyBjaGFuZ2VzIGFjcm9zcyBTSUdXSU5DSCByZXN0YXJ0cy4gIFdlIHVzZSB0aGlzCi0gKiB2YWx1ZSB0byBvcHRpbWl6ZSByb3V0aW5lcyB0aGF0IGhhdmUgdG8gc2NhbiB0aGUgZW50aXJlIHNjb3JlYm9hcmQuCi0gKi8KLWludCBtYXhfZGFlbW9uc19saW1pdCA9IC0xOwotc3RhdGljIGNoYXIgYXBfY29yZWR1bXBfZGlyW01BWF9TVFJJTkdfTEVOXTsKLXBvcnRfaWQgcG9ydF9vZl9kZWF0aDsKLQotLyogKk5vbiotc2hhcmVkIGh0dHBfbWFpbiBnbG9iYWxzLi4uICovCi0KLXN0YXRpYyBzZXJ2ZXJfcmVjICpzZXJ2ZXJfY29uZjsKLQotLyogb25lX3Byb2Nlc3MgLS0tIGRlYnVnZ2luZyBtb2RlIHZhcmlhYmxlOyBjYW4gYmUgc2V0IGZyb20gdGhlIGNvbW1hbmQgbGluZQotICogd2l0aCB0aGUgLVggZmxhZy4gIElmIHNldCwgdGhpcyBnZXRzIHlvdSB0aGUgY2hpbGRfbWFpbiBsb29wIHJ1bm5pbmcKLSAqIGluIHRoZSBwcm9jZXNzIHdoaWNoIG9yaWdpbmFsbHkgc3RhcnRlZCB1cCAobm8gZGV0YWNoLCBubyBtYWtlX2NoaWxkKSwKLSAqIHdoaWNoIGlzIGEgcHJldHR5IG5pY2UgZGVidWdnaW5nIGVudmlyb25tZW50LiAgKFlvdSdsbCBnZXQgYSBTSUdIVVAKLSAqIGVhcmx5IGluIHN0YW5kYWxvbmVfbWFpbjsganVzdCBjb250aW51ZSB0aHJvdWdoLiAgVGhpcyBpcyB0aGUgc2VydmVyCi0gKiB0cnlpbmcgdG8ga2lsbCBvZmYgYW55IGNoaWxkIHByb2Nlc3NlcyB3aGljaCBpdCBtaWdodCBoYXZlIGx5aW5nCi0gKiBhcm91bmQgLS0tIEFwYWNoZSBkb2Vzbid0IGtlZXAgdHJhY2sgb2YgdGhlaXIgcGlkcywgaXQganVzdCBzZW5kcwotICogU0lHSFVQIHRvIHRoZSBwcm9jZXNzIGdyb3VwLCBpZ25vcmluZyBpdCBpbiB0aGUgcm9vdCBwcm9jZXNzLgotICogQ29udGludWUgdGhyb3VnaCBhbmQgeW91J2xsIGJlIGZpbmUuKS4KLSAqLwotCi1zdGF0aWMgaW50IG9uZV9wcm9jZXNzID0gMDsKLQotI2lmZGVmIERFQlVHX1NJR1NUT1AKLWludCByYWlzZV9zaWdzdG9wX2ZsYWdzOwotI2VuZGlmCi0KLSNpZmRlZiBIQVNfT1RIRVJfQ0hJTEQKLS8qIHVzZWQgdG8gbWFpbnRhaW4gbGlzdCBvZiBjaGlsZHJlbiB3aGljaCBhcmVuJ3QgcGFydCBvZiB0aGUgc2NvcmVib2FyZCAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3RoZXJfY2hpbGRfcmVjIG90aGVyX2NoaWxkX3JlYzsKLXN0cnVjdCBvdGhlcl9jaGlsZF9yZWMgewotICAgIG90aGVyX2NoaWxkX3JlYyAqbmV4dDsKLSAgICBpbnQgcGlkOwotICAgIHZvaWQgKCptYWludGVuYW5jZSkgKGludCwgdm9pZCAqLCBhcF93YWl0X3QpOwotICAgIHZvaWQgKmRhdGE7Ci0gICAgaW50IHdyaXRlX2ZkOwotfTsKLXN0YXRpYyBvdGhlcl9jaGlsZF9yZWMgKm90aGVyX2NoaWxkcmVuOwotI2VuZGlmCi0KLXN0YXRpYyBhcF9jb250ZXh0X3QgKnBjb25mOwkJLyogUG9vbCBmb3IgY29uZmlnIHN0dWZmICovCi1zdGF0aWMgYXBfY29udGV4dF90ICpwY2hpbGQ7CQkvKiBQb29sIGZvciBodHRwZCBjaGlsZCBzdHVmZiAqLwotCi1zdGF0aWMgaW50IG15X3BpZDsgLyogTGludXggZ2V0cGlkKCkgZG9lc24ndCB3b3JrIGV4Y2VwdCBpbiBtYWluIHRocmVhZC4gVXNlCi0gICAgICAgICAgICAgICAgICAgICAgdGhpcyBpbnN0ZWFkICovCi0vKiBLZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgY3VycmVudGx5IGFjdGl2ZSAqLwotc3RhdGljIGludCB3b3JrZXJfdGhyZWFkX2NvdW50Owotc3RhdGljIGJlX211dGV4X3Qgd29ya2VyX3RocmVhZF9jb3VudF9tdXRleDsKLQotLyogR2xvYmFsLCBhbGFzLCBzbyBodHRwX2NvcmUgY2FuIHRhbGsgdG8gdXMgKi8KLWVudW0gc2VydmVyX3Rva2VuX3R5cGUgYXBfc2VydmVyX3Rva2VucyA9IFNydlRrX0ZVTEw7Ci0KLUFQSV9FWFBPUlQoY29uc3Qgc2VydmVyX3JlYyAqKSBhcF9nZXRfc2VydmVyX2NvbmYodm9pZCkKLXsKLSAgICByZXR1cm4gKHNlcnZlcl9jb25mKTsKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX2dldF9tYXhfZGFlbW9ucyh2b2lkKQotewotICAgIHJldHVybiBtYXhfZGFlbW9uc19saW1pdDsKLX0KLQotLyogYSBjbGVhbiBleGl0IGZyb20gYSBjaGlsZCB3aXRoIHByb3BlciBjbGVhbnVwIAotICAgc3RhdGljIHZvaWQgY2xlYW5fY2hpbGRfZXhpdChpbnQgY29kZSkgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSk7ICovCi12b2lkIGNsZWFuX2NoaWxkX2V4aXQoaW50IGNvZGUpCi17Ci0gICAgaWYgKHBjaGlsZCkgewotCWFwX2Rlc3Ryb3lfcG9vbChwY2hpbGQpOwotICAgIH0KLSAgICBleGl0KGNvZGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGRlYWxpbmcgd2l0aCBvdGhlciBjaGlsZHJlbgotICovCi0KLSNpZmRlZiBIQVNfT1RIRVJfQ0hJTEQKLUFQSV9FWFBPUlQodm9pZCkgYXBfcmVnaXN0ZXJfb3RoZXJfY2hpbGQoaW50IHBpZCwKLQkJICAgICAgIHZvaWQgKCptYWludGVuYW5jZSkgKGludCByZWFzb24sIHZvaWQgKiwgYXBfd2FpdF90IHN0YXR1cyksCi0JCQkgIHZvaWQgKmRhdGEsIGludCB3cml0ZV9mZCkKLXsKLSAgICBvdGhlcl9jaGlsZF9yZWMgKm9jcjsKLQotICAgIG9jciA9IGFwX3BhbGxvYyhwY29uZiwgc2l6ZW9mKCpvY3IpKTsKLSAgICBvY3ItPnBpZCA9IHBpZDsKLSAgICBvY3ItPm1haW50ZW5hbmNlID0gbWFpbnRlbmFuY2U7Ci0gICAgb2NyLT5kYXRhID0gZGF0YTsKLSAgICBvY3ItPndyaXRlX2ZkID0gd3JpdGVfZmQ7Ci0gICAgb2NyLT5uZXh0ID0gb3RoZXJfY2hpbGRyZW47Ci0gICAgb3RoZXJfY2hpbGRyZW4gPSBvY3I7Ci19Ci0KLS8qIG5vdGUgdGhhdCBzaW5jZSB0aGlzIGNhbiBiZSBjYWxsZWQgYnkgYSBtYWludGVuYW5jZSBmdW5jdGlvbiB3aGlsZSB3ZSdyZQotICogc2Nhbm5pbmcgdGhlIG90aGVyX2NoaWxkcmVuIGxpc3QsIGFsbCBzY2FubmVycyBzaG91bGQgcHJvdGVjdCB0aGVtc2VsZgotICogYnkgbG9hZGluZyBvY3ItPm5leHQgYmVmb3JlIGNhbGxpbmcgYW55IG1haW50ZW5hbmNlIGZ1bmN0aW9uLgotICovCi1BUElfRVhQT1JUKHZvaWQpIGFwX3VucmVnaXN0ZXJfb3RoZXJfY2hpbGQodm9pZCAqZGF0YSkKLXsKLSAgICBvdGhlcl9jaGlsZF9yZWMgKipwb2NyLCAqbm9jcjsKLQotICAgIGZvciAocG9jciA9ICZvdGhlcl9jaGlsZHJlbjsgKnBvY3I7IHBvY3IgPSAmKCpwb2NyKS0+bmV4dCkgewotCWlmICgoKnBvY3IpLT5kYXRhID09IGRhdGEpIHsKLQkgICAgbm9jciA9ICgqcG9jciktPm5leHQ7Ci0JICAgICgqKCpwb2NyKS0+bWFpbnRlbmFuY2UpIChPQ19SRUFTT05fVU5SRUdJU1RFUiwgKCpwb2NyKS0+ZGF0YSwgLTEpOwotCSAgICAqcG9jciA9IG5vY3I7Ci0JICAgIC8qIFhYWDogdW0sIHdlbGwgd2UndmUganVzdCB3YXN0ZWQgc29tZSBzcGFjZSBpbiBwY29uZiA/ICovCi0JICAgIHJldHVybjsKLQl9Ci0gICAgfQotfQotCi0vKiB0ZXN0IHRvIGVuc3VyZSB0aGF0IHRoZSB3cml0ZV9mZHMgYXJlIGFsbCBzdGlsbCB3cml0YWJsZSwgb3RoZXJ3aXNlCi0gKiBpbnZva2UgdGhlIG1haW50ZW5hbmNlIGZ1bmN0aW9ucyBhcyBhcHByb3ByaWF0ZSAqLwotc3RhdGljIHZvaWQgcHJvYmVfd3JpdGFibGVfZmRzKHZvaWQpCi17Ci0gICAgcmV0dXJuOwotI2lmIDAKLSAgICBmZF9zZXQgd3JpdGFibGVfZmRzOwotICAgIGludCBmZF9tYXg7Ci0gICAgb3RoZXJfY2hpbGRfcmVjICpvY3IsICpub2NyOwotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIGludCByYzsKLQotICAgIGlmIChvdGhlcl9jaGlsZHJlbiA9PSBOVUxMKQotCXJldHVybjsKLQotICAgIGZkX21heCA9IDA7Ci0gICAgRkRfWkVSTygmd3JpdGFibGVfZmRzKTsKLSAgICBkbyB7Ci0JZm9yIChvY3IgPSBvdGhlcl9jaGlsZHJlbjsgb2NyOyBvY3IgPSBvY3ItPm5leHQpIHsKLQkgICAgaWYgKG9jci0+d3JpdGVfZmQgPT0gLTEpCi0JCWNvbnRpbnVlOwotCSAgICBGRF9TRVQob2NyLT53cml0ZV9mZCwgJndyaXRhYmxlX2Zkcyk7Ci0JICAgIGlmIChvY3ItPndyaXRlX2ZkID4gZmRfbWF4KSB7Ci0JCWZkX21heCA9IG9jci0+d3JpdGVfZmQ7Ci0JICAgIH0KLQl9Ci0JaWYgKGZkX21heCA9PSAwKQotCSAgICByZXR1cm47Ci0KLQl0di50dl9zZWMgPSAwOwotCXR2LnR2X3VzZWMgPSAwOwotCXJjID0gYXBfc2VsZWN0KGZkX21heCArIDEsIE5VTEwsICZ3cml0YWJsZV9mZHMsIE5VTEwsICZ0dik7Ci0gICAgfSB3aGlsZSAocmMgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgaWYgKHJjID09IC0xKSB7Ci0JLyogWFhYOiB1aGggdGhpcyBjb3VsZCBiZSByZWFsbHkgYmFkLCB3ZSBjb3VsZCBoYXZlIGEgYmFkIGZpbGUKLQkgKiBkZXNjcmlwdG9yIGR1ZSB0byBhIGJ1ZyBpbiBvbmUgb2YgdGhlIG1haW50ZW5hbmNlIHJvdXRpbmVzICovCi0JYXBfbG9nX3VuaXhlcnIoInByb2JlX3dyaXRhYmxlX2ZkcyIsICJzZWxlY3QiLAotCQkgICAgImNvdWxkIG5vdCBwcm9iZSB3cml0YWJsZSBmZHMiLCBzZXJ2ZXJfY29uZik7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBpZiAocmMgPT0gMCkKLQlyZXR1cm47Ci0KLSAgICBmb3IgKG9jciA9IG90aGVyX2NoaWxkcmVuOyBvY3I7IG9jciA9IG5vY3IpIHsKLQlub2NyID0gb2NyLT5uZXh0OwotCWlmIChvY3ItPndyaXRlX2ZkID09IC0xKQotCSAgICBjb250aW51ZTsKLQlpZiAoRkRfSVNTRVQob2NyLT53cml0ZV9mZCwgJndyaXRhYmxlX2ZkcykpCi0JICAgIGNvbnRpbnVlOwotCSgqb2NyLT5tYWludGVuYW5jZSkgKE9DX1JFQVNPTl9VTldSSVRBQkxFLCBvY3ItPmRhdGEsIC0xKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotLyogcG9zc2libHkgcmVhcCBhbiBvdGhlcl9jaGlsZCwgcmV0dXJuIDAgaWYgeWVzLCAtMSBpZiBub3QgKi8KLXN0YXRpYyBpbnQgcmVhcF9vdGhlcl9jaGlsZChpbnQgcGlkLCBhcF93YWl0X3Qgc3RhdHVzKQotewotICAgIG90aGVyX2NoaWxkX3JlYyAqb2NyLCAqbm9jcjsKLQotICAgIGZvciAob2NyID0gb3RoZXJfY2hpbGRyZW47IG9jcjsgb2NyID0gbm9jcikgewotCW5vY3IgPSBvY3ItPm5leHQ7Ci0JaWYgKG9jci0+cGlkICE9IHBpZCkKLQkgICAgY29udGludWU7Ci0Jb2NyLT5waWQgPSAtMTsKLQkoKm9jci0+bWFpbnRlbmFuY2UpIChPQ19SRUFTT05fREVBVEgsIG9jci0+ZGF0YSwgc3RhdHVzKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIHJlY2xhaW1fY2hpbGRfcHJvY2Vzc2VzKGludCB0ZXJtaW5hdGUpCi17Ci0gICAgaW50IGksIHN0YXR1czsKLSAgICBsb25nIGludCB3YWl0dGltZSA9IDEwMjQgKiAxNjsJLyogaW4gdXNlY3MgKi8KLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICBpbnQgd2FpdHJldCwgdHJpZXM7Ci0gICAgaW50IG5vdF9kZWFkX3lldDsKLSNpZmRlZiBIQVNfT1RIRVJfQ0hJTEQKLSAgICBvdGhlcl9jaGlsZF9yZWMgKm9jciwgKm5vY3I7Ci0jZW5kaWYKLQotICAgIGZvciAodHJpZXMgPSB0ZXJtaW5hdGUgPyA0IDogMTsgdHJpZXMgPD0gOTsgKyt0cmllcykgewotCS8qIGRvbid0IHdhbnQgdG8gaG9sZCB1cCBwcm9ncmVzcyBhbnkgbW9yZSB0aGFuIAotCSAqIG5lY2Vzc2FyeSwgYnV0IHdlIG5lZWQgdG8gYWxsb3cgY2hpbGRyZW4gYSBmZXcgbW9tZW50cyB0byBleGl0LgotCSAqIFNldCBkZWxheSB3aXRoIGFuIGV4cG9uZW50aWFsIGJhY2tvZmYuCi0JICovCi0JdHYudHZfc2VjID0gd2FpdHRpbWUgLyAxMDAwMDAwOwotCXR2LnR2X3VzZWMgPSB3YWl0dGltZSAlIDEwMDAwMDA7Ci0Jd2FpdHRpbWUgPSB3YWl0dGltZSAqIDQ7Ci0JYXBfc2VsZWN0KDAsIE5VTEwsIE5VTEwsIE5VTEwsICZ0dik7Ci0KLQkvKiBub3cgc2VlIHdobyBpcyBkb25lICovCi0Jbm90X2RlYWRfeWV0ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgbWF4X2RhZW1vbnNfbGltaXQ7ICsraSkgewotICAgICAgICBpbnQgcGlkOwotICAgICAgICBpZiAoY2hpbGRfdGFibGVbaV0uc3RhdHVzID09IFNFUlZFUl9ERUFEKQotICAgICAgICAgICAgY29udGludWU7Ci0KLQkgICAgcGlkID0gY2hpbGRfdGFibGVbaV0ucGlkOwotCi0JICAgIHdhaXRyZXQgPSB3YWl0cGlkKHBpZCwgJnN0YXR1cywgV05PSEFORyk7Ci0JICAgIGlmICh3YWl0cmV0ID09IHBpZCB8fCB3YWl0cmV0ID09IC0xKSB7Ci0JCSAgICBjaGlsZF90YWJsZVtpXS5zdGF0dXMgPSBTRVJWRVJfREVBRDsKLQkJICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICAgICsrbm90X2RlYWRfeWV0OwotCSAgICBzd2l0Y2ggKHRyaWVzKSB7Ci0JICAgIGNhc2UgMTogICAgIC8qICAxNm1zICovCi0JICAgIGNhc2UgMjogICAgIC8qICA4Mm1zICovCi0JCWJyZWFrOwotCSAgICBjYXNlIDM6ICAgICAvKiAzNDRtcyAqLwotCSAgICBjYXNlIDQ6ICAgICAvKiAgMTZtcyAqLwotCSAgICBjYXNlIDU6ICAgICAvKiAgODJtcyAqLwotCSAgICBjYXNlIDY6ICAgICAvKiAzNDRtcyAqLwotCSAgICBjYXNlIDc6ICAgICAvKiAxLjRzZWMgKi8KLQkJLyogb2ssIG5vdyBpdCdzIGJlaW5nIGFubm95aW5nICovCi0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX1dBUk5JTkcsCi0JCQkgICAgZXJybm8sIHNlcnZlcl9jb25mLAotCQkgICAiY2hpbGQgcHJvY2VzcyAlZCBzdGlsbCBkaWQgbm90IGV4aXQsIHNlbmRpbmcgYSBTSUdURVJNIiwKLQkJCSAgICBwaWQpOwotCQlraWxsKHBpZCwgU0lHVEVSTSk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDg6ICAgICAvKiAgNiBzZWMgKi8KLQkJLyogZGllIGNoaWxkIHNjdW0gKi8KLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCBlcnJubywgc2VydmVyX2NvbmYsCi0JCSAgICJjaGlsZCBwcm9jZXNzICVkIHN0aWxsIGRpZCBub3QgZXhpdCwgc2VuZGluZyBhIFNJR0tJTEwiLAotCQkJICAgIHBpZCk7Ci0JCWtpbGwocGlkLCBTSUdLSUxMKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgOTogICAgIC8qIDE0IHNlYyAqLwotCQkvKiBnYXZlIGl0IG91ciBiZXN0IHNob3QsIGJ1dCBhbGFzLi4uICBJZiB0aGlzIHJlYWxseSAKLQkJICogaXMgYSBjaGlsZCB3ZSBhcmUgdHJ5aW5nIHRvIGtpbGwgYW5kIGl0IHJlYWxseSBoYXNuJ3QKLQkJICogZXhpdGVkLCB3ZSB3aWxsIGxpa2VseSBmYWlsIHRvIGJpbmQgdG8gdGhlIHBvcnQKLQkJICogYWZ0ZXIgdGhlIHJlc3RhcnQuCi0JCSAqLwotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIGVycm5vLCBzZXJ2ZXJfY29uZiwKLQkJCSAgICAiY291bGQgbm90IG1ha2UgY2hpbGQgcHJvY2VzcyAlZCBleGl0LCAiCi0JCQkgICAgImF0dGVtcHRpbmcgdG8gY29udGludWUgYW55d2F5IiwgcGlkKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0jaWZkZWYgSEFTX09USEVSX0NISUxECi0JZm9yIChvY3IgPSBvdGhlcl9jaGlsZHJlbjsgb2NyOyBvY3IgPSBub2NyKSB7Ci0JICAgIG5vY3IgPSBvY3ItPm5leHQ7Ci0JICAgIGlmIChvY3ItPnBpZCA9PSAtMSkKLQkJY29udGludWU7Ci0KLQkgICAgd2FpdHJldCA9IHdhaXRwaWQob2NyLT5waWQsICZzdGF0dXMsIFdOT0hBTkcpOwotCSAgICBpZiAod2FpdHJldCA9PSBvY3ItPnBpZCkgewotCQlvY3ItPnBpZCA9IC0xOwotCQkoKm9jci0+bWFpbnRlbmFuY2UpIChPQ19SRUFTT05fREVBVEgsIG9jci0+ZGF0YSwgc3RhdHVzKTsKLQkgICAgfQotCSAgICBlbHNlIGlmICh3YWl0cmV0ID09IDApIHsKLQkJKCpvY3ItPm1haW50ZW5hbmNlKSAoT0NfUkVBU09OX1JFU1RBUlQsIG9jci0+ZGF0YSwgLTEpOwotCQkrK25vdF9kZWFkX3lldDsKLQkgICAgfQotCSAgICBlbHNlIGlmICh3YWl0cmV0ID09IC0xKSB7Ci0JCS8qIHVoIHdoYXQgdGhlIGhlY2s/IHRoZXkgZGlkbid0IGNhbGwgdW5yZWdpc3Rlcj8gKi8KLQkJb2NyLT5waWQgPSAtMTsKLQkJKCpvY3ItPm1haW50ZW5hbmNlKSAoT0NfUkVBU09OX0xPU1QsIG9jci0+ZGF0YSwgLTEpOwotCSAgICB9Ci0JfQotI2VuZGlmCi0JaWYgKCFub3RfZGVhZF95ZXQpIHsKLQkgICAgLyogbm90aGluZyBsZWZ0IHRvIHdhaXQgZm9yICovCi0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLS8qIEZpbmFsbHksIHRoaXMgcm91dGluZSBpcyB1c2VkIGJ5IHRoZSBjYXJldGFrZXIgcHJvY2VzcyB0byB3YWl0IGZvcgotICogYSB3aGlsZS4uLgotICovCi0KLS8qIG51bWJlciBvZiBjYWxscyB0byB3YWl0X29yX3RpbWVvdXQgYmV0d2VlbiB3cml0YWJsZSBwcm9iZXMgKi8KLSNpZm5kZWYgSU5URVJWQUxfT0ZfV1JJVEFCTEVfUFJPQkVTCi0jZGVmaW5lIElOVEVSVkFMX09GX1dSSVRBQkxFX1BST0JFUyAxMAotI2VuZGlmCi1zdGF0aWMgaW50IHdhaXRfb3JfdGltZW91dF9jb3VudGVyOwotCi1zdGF0aWMgaW50IHdhaXRfb3JfdGltZW91dChhcF93YWl0X3QgKnN0YXR1cykKLXsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICBpbnQgcmV0OwotCi0gICAgKyt3YWl0X29yX3RpbWVvdXRfY291bnRlcjsKLSAgICBpZiAod2FpdF9vcl90aW1lb3V0X2NvdW50ZXIgPT0gSU5URVJWQUxfT0ZfV1JJVEFCTEVfUFJPQkVTKSB7Ci0Jd2FpdF9vcl90aW1lb3V0X2NvdW50ZXIgPSAwOwotI2lmZGVmIEhBU19PVEhFUl9DSElMRAotCXByb2JlX3dyaXRhYmxlX2ZkcygpOwotI2VuZGlmCi0gICAgfQotICAgIHJldCA9IHdhaXRwaWQoLTEsIHN0YXR1cywgV05PSEFORyk7Ci0gICAgaWYgKHJldCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikgewotCXJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKHJldCA+IDApIHsKLQlyZXR1cm4gcmV0OwotICAgIH0KLSAgICB0di50dl9zZWMgPSBTQ09SRUJPQVJEX01BSU5URU5BTkNFX0lOVEVSVkFMIC8gMTAwMDAwMDsKLSAgICB0di50dl91c2VjID0gU0NPUkVCT0FSRF9NQUlOVEVOQU5DRV9JTlRFUlZBTCAlIDEwMDAwMDA7Ci0gICAgYXBfc2VsZWN0KDAsIE5VTEwsIE5VTEwsIE5VTEwsICZ0dik7Ci0gICAgcmV0dXJuIC0xOwotfQotCi0vKiBoYW5kbGUgYWxsIHZhcmlldGllcyBvZiBjb3JlIGR1bXBpbmcgc2lnbmFscyAqLwotc3RhdGljIHZvaWQgc2lnX2NvcmVkdW1wKGludCBzaWcpCi17Ci0gICAgY2hkaXIoYXBfY29yZWR1bXBfZGlyKTsKLSAgICBzaWduYWwoc2lnLCBTSUdfREZMKTsKLSAgICBraWxsKG15X3BpZCwgc2lnKTsKLSAgICAvKiBBdCB0aGlzIHBvaW50IHdlJ3ZlIGdvdCBzaWcgYmxvY2tlZCwgYmVjYXVzZSB3ZSdyZSBzdGlsbCBpbnNpZGUKLSAgICAgKiB0aGUgc2lnbmFsIGhhbmRsZXIuICBXaGVuIHdlIGxlYXZlIHRoZSBzaWduYWwgaGFuZGxlciBpdCB3aWxsCi0gICAgICogYmUgdW5ibG9ja2VkLCBhbmQgd2UnbGwgdGFrZSB0aGUgc2lnbmFsLi4uIGFuZCBjb3JlZHVtcCBvciB3aGF0ZXZlcgotICAgICAqIGlzIGFwcHJvcHJpYXRlIGZvciB0aGlzIHBhcnRpY3VsYXIgVW5peC4gIEluIGFkZGl0aW9uIHRoZSBwYXJlbnQKLSAgICAgKiB3aWxsIHNlZSB0aGUgcmVhbCBzaWduYWwgd2UgcmVjZWl2ZWQgLS0gd2hlcmVhcyBpZiB3ZSBjYWxsZWQKLSAgICAgKiBhYm9ydCgpIGhlcmUsIHRoZSBwYXJlbnQgd291bGQgb25seSBzZWUgU0lHQUJSVC4KLSAgICAgKi8KLX0KLQotc3RhdGljIHZvaWQganVzdF9kaWUoaW50IHNpZykKLXsKLSAgICBjbGVhbl9jaGlsZF9leGl0KDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbm5lY3Rpb24gc3RydWN0dXJlcyBhbmQgYWNjb3VudGluZy4uLgotICovCi0KLS8qIHZvbGF0aWxlIGp1c3QgaW4gY2FzZSAqLwotc3RhdGljIGludCB2b2xhdGlsZSBzaHV0ZG93bl9wZW5kaW5nOwotc3RhdGljIGludCB2b2xhdGlsZSByZXN0YXJ0X3BlbmRpbmc7Ci1zdGF0aWMgaW50IHZvbGF0aWxlIGlzX2dyYWNlZnVsOwotCi0vKgotICogYXBfc3RhcnRfc2h1dGRvd24oKSBhbmQgYXBfc3RhcnRfcmVzdGFydCgpLCBiZWxvdywgYXJlIGEgZmlyc3Qgc3RhYiBhdAotICogZnVuY3Rpb25zIHRvIGluaXRpYXRlIHNodXRkb3duIG9yIHJlc3RhcnQgd2l0aG91dCByZWx5aW5nIG9uIHNpZ25hbHMuIAotICogUHJldmlvdXNseSB0aGlzIHdhcyBpbml0aWF0ZWQgaW4gc2lnX3Rlcm0oKSBhbmQgcmVzdGFydCgpIHNpZ25hbCBoYW5kbGVycywgCi0gKiBidXQgd2Ugd2FudCB0byBiZSBhYmxlIHRvIHN0YXJ0IGEgc2h1dGRvd24vcmVzdGFydCBmcm9tIG90aGVyIHNvdXJjZXMgLS0KLSAqIGUuZy4gb24gV2luMzIsIGZyb20gdGhlIHNlcnZpY2UgbWFuYWdlci4gTm93IHRoZSBzZXJ2aWNlIG1hbmFnZXIgY2FuCi0gKiBjYWxsIGFwX3N0YXJ0X3NodXRkb3duKCkgb3IgYXBfc3RhcnRfcmVzdGFydCgpIGFzIGFwcHJvcGlhdGUuICBOb3RlIHRoYXQKLSAqIHRoZXNlIGZ1bmN0aW9ucyBjYW4gYWxzbyBiZSBjYWxsZWQgYnkgdGhlIGNoaWxkIHByb2Nlc3Nlcywgc2luY2UgZ2xvYmFsCi0gKiB2YXJpYWJsZXMgYXJlIG5vIGxvbmdlciB1c2VkIHRvIHBhc3Mgb24gdGhlIHJlcXVpcmVkIGFjdGlvbiB0byB0aGUgcGFyZW50LgotICoKLSAqIFRoZXNlIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBwYXJlbnQgcHJvY2VzcyBpdHNlbGYsIHNpbmNlIHRoZQotICogcGFyZW50IHByb2Nlc3Mgd2lsbCB1c2UgdGhlIHNodXRkb3duX3BlbmRpbmcgYW5kIHJlc3RhcnRfcGVuZGluZyB2YXJpYWJsZXMKLSAqIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHNodXRkb3duIG9yIHJlc3RhcnQuIFRoZSBjaGlsZCBwcm9jZXNzIHNob3VsZAotICogY2FsbCBzaWduYWxfcGFyZW50KCkgZGlyZWN0bHkgdG8gdGVsbCB0aGUgcGFyZW50IHRvIGRpZSAtLSB0aGlzIHdpbGwKLSAqIGNhdXNlIG5laXRoZXIgb2YgdGhvc2UgdmFyaWFibGUgdG8gYmUgc2V0LCB3aGljaCB0aGUgcGFyZW50IHdpbGwKLSAqIGFzc3VtZSBtZWFucyBzb21ldGhpbmcgc2VyaW91cyBpcyB3cm9uZyAod2hpY2ggaXQgd2lsbCBiZSwgZm9yIHRoZQotICogY2hpbGQgdG8gZm9yY2UgYW4gZXhpdCkgYW5kIHNvIGRvIGFuIGV4aXQgYW55d2F5LgotICovCi0KLXZvaWQgYXBfc3RhcnRfc2h1dGRvd24odm9pZCkKLXsKLSAgICBpZiAoc2h1dGRvd25fcGVuZGluZyA9PSAxKSB7Ci0JLyogVW0sIGlzIHRoaXMgX3Byb2JhYmx5XyBub3QgYW4gZXJyb3IsIGlmIHRoZSB1c2VyIGhhcwotCSAqIHRyaWVkIHRvIGRvIGEgc2h1dGRvd24gdHdpY2UgcXVpY2tseSwgc28gd2Ugd29uJ3QKLQkgKiB3b3JyeSBhYm91dCByZXBvcnRpbmcgaXQuCi0JICovCi0JcmV0dXJuOwotICAgIH0KLSAgICBzaHV0ZG93bl9wZW5kaW5nID0gMTsKLX0KLQotLyogZG8gYSBncmFjZWZ1bCByZXN0YXJ0IGlmIGdyYWNlZnVsID09IDEgKi8KLXZvaWQgYXBfc3RhcnRfcmVzdGFydChpbnQgZ3JhY2VmdWwpCi17Ci0KLSAgICBpZiAocmVzdGFydF9wZW5kaW5nID09IDEpIHsKLQkvKiBQcm9iYWJseSBub3QgYW4gZXJyb3IgLSBkb24ndCBib3RoZXIgcmVwb3J0aW5nIGl0ICovCi0JcmV0dXJuOwotICAgIH0KLSAgICByZXN0YXJ0X3BlbmRpbmcgPSAxOwotICAgIGlzX2dyYWNlZnVsID0gZ3JhY2VmdWw7Ci19Ci0KLXN0YXRpYyB2b2lkIHNpZ190ZXJtKGludCBzaWcpCi17Ci0gICAgYXBfc3RhcnRfc2h1dGRvd24oKTsKLX0KLQotc3RhdGljIHZvaWQgcmVzdGFydChpbnQgc2lnKQotewotICAgIGFwX3N0YXJ0X3Jlc3RhcnQoc2lnID09IFNJR1dJTkNIKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0X3NpZ25hbHModm9pZCkKLXsKLSAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhOwotCi0gICAgc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOwotICAgIHNhLnNhX2ZsYWdzID0gMDsKLQotICAgIGlmICghb25lX3Byb2Nlc3MpIHsKLQlzYS5zYV9oYW5kbGVyID0gc2lnX2NvcmVkdW1wOwotCi0JaWYgKHNpZ2FjdGlvbihTSUdTRUdWLCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdTRUdWKSIpOwotCWlmIChzaWdhY3Rpb24oU0lHQlVTLCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdCVVMpIik7Ci0JaWYgKHNpZ2FjdGlvbihTSUdBQlJULCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdBQlJUKSIpOwotCWlmIChzaWdhY3Rpb24oU0lHSUxMLCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdJTEwpIik7Ci0Jc2Euc2FfZmxhZ3MgPSAwOwotICAgIH0KLSAgICBzYS5zYV9oYW5kbGVyID0gc2lnX3Rlcm07Ci0gICAgaWYgKHNpZ2FjdGlvbihTSUdURVJNLCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdURVJNKSIpOwotICAgIGlmIChzaWdhY3Rpb24oU0lHSU5ULCAmc2EsIE5VTEwpIDwgMCkKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdJTlQpIik7Ci0gICAgCi0gICAgc2Euc2FfaGFuZGxlciA9IFNJR19JR047Ci0gICAgaWYgKHNpZ2FjdGlvbihTSUdQSVBFLCAmc2EsIE5VTEwpIDwgMCkKLSAgICAJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdQSVBFKSIpOwotCi0gICAgLyogd2Ugd2FudCB0byBpZ25vcmUgSFVQcyBhbmQgV0lOQ0ggd2hpbGUgd2UncmUgYnVzeSBwcm9jZXNzaW5nIG9uZSAqLwotICAgIHNpZ2FkZHNldCgmc2Euc2FfbWFzaywgU0lHSFVQKTsKLSAgICBzaWdhZGRzZXQoJnNhLnNhX21hc2ssIFNJR1dJTkNIKTsKLSAgICBzYS5zYV9oYW5kbGVyID0gcmVzdGFydDsKLSAgICBpZiAoc2lnYWN0aW9uKFNJR0hVUCwgJnNhLCBOVUxMKSA8IDApCi0gICAgCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHSFVQKSIpOwotICAgIGlmIChzaWdhY3Rpb24oU0lHV0lOQ0gsICZzYSwgTlVMTCkgPCAwKQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR1dJTkNIKSIpOwotfQotCi1zdGF0aWMgdm9pZCBwcm9jZXNzX2NoaWxkX3N0YXR1cyhpbnQgcGlkLCBhcF93YWl0X3Qgc3RhdHVzKQotewotICAgIC8qIENoaWxkIGRpZWQuLi4gaWYgaXQgZGllZCBkdWUgdG8gYSBmYXRhbCBlcnJvciwKLQkqIHdlIHNob3VsZCBzaW1wbHkgYmFpbCBvdXQuCi0JKi8KLSAgICBpZiAoKFdJRkVYSVRFRChzdGF0dXMpKSAmJgotCVdFWElUU1RBVFVTKHN0YXR1cykgPT0gQVBFWElUX0NISUxERkFUQUwpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlR8QVBMT0dfTk9FUlJOTywgZXJybm8sIHNlcnZlcl9jb25mLAotCQkJIkNoaWxkICVkIHJldHVybmVkIGEgRmF0YWwgZXJyb3IuLi4gXG4iCi0JCQkiQXBhY2hlIGlzIGV4aXRpbmchIiwKLQkJCXBpZCk7Ci0JZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotICAgIGlmIChXSUZTSUdOQUxFRChzdGF0dXMpKSB7Ci0Jc3dpdGNoIChXVEVSTVNJRyhzdGF0dXMpKSB7Ci0JY2FzZSBTSUdURVJNOgotCWNhc2UgU0lHSFVQOgotCWNhc2UgU0lHVVNSMToKLQljYXNlIFNJR0tJTEw6Ci0JICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0jaWZkZWYgU1lTX1NJR0xJU1QKLSNpZmRlZiBXQ09SRURVTVAKLQkgICAgaWYgKFdDT1JFRFVNUChzdGF0dXMpKSB7Ci0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwKLQkJCSAgICAgZXJybm8sIHNlcnZlcl9jb25mLAotCQkJICAgICAiY2hpbGQgcGlkICVkIGV4aXQgc2lnbmFsICVzICglZCksICIKLQkJCSAgICAgInBvc3NpYmxlIGNvcmVkdW1wIGluICVzIiwKLQkJCSAgICAgcGlkLCAoV1RFUk1TSUcoc3RhdHVzKSA+PSBOdW1TSUcpID8gIiIgOiAKLQkJCSAgICAgU1lTX1NJR0xJU1RbV1RFUk1TSUcoc3RhdHVzKV0sIFdURVJNU0lHKHN0YXR1cyksCi0JCQkgICAgIGFwX2NvcmVkdW1wX2Rpcik7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0jZW5kaWYKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLAotCQkJICAgICBlcnJubywgc2VydmVyX2NvbmYsCi0JCQkgICAgICJjaGlsZCBwaWQgJWQgZXhpdCBzaWduYWwgJXMgKCVkKSIsIHBpZCwKLQkJCSAgICAgU1lTX1NJR0xJU1RbV1RFUk1TSUcoc3RhdHVzKV0sIFdURVJNU0lHKHN0YXR1cykpOwotI2lmZGVmIFdDT1JFRFVNUAotCSAgICB9Ci0jZW5kaWYKLSNlbHNlCi0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwKLQkJCSBlcnJubywgc2VydmVyX2NvbmYsCi0JCQkgImNoaWxkIHBpZCAlZCBleGl0IHNpZ25hbCAlZCIsCi0JCQkgcGlkLCBXVEVSTVNJRyhzdGF0dXMpKTsKLSNlbmRpZgotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgc2V0dXBfbGlzdGVuZXJzKHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgYXBfbGlzdGVuX3JlYyAqbHI7Ci0gICAgaW50IG51bV9saXN0ZW5lcnMgPSAwOwotICAgIGlmIChhcF9saXN0ZW5fb3BlbihzLT5wcm9jZXNzLCBzLT5wb3J0KSkgewotICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBmb3IgKGxyID0gYXBfbGlzdGVuZXJzOyBscjsgbHIgPSBsci0+bmV4dCkgewotICAgICAgICBudW1fbGlzdGVuZXJzKys7Ci0gICAgfQotICAgIHJldHVybiBudW1fbGlzdGVuZXJzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEhlcmUgZm9sbG93cyBhIGxvbmcgYnVuY2ggb2YgZ2VuZXJpYyBzZXJ2ZXIgYm9va2tlZXBpbmcgc3R1ZmYuLi4KLSAqLwotCi0jZGVmaW5lIHNvY2tfZGlzYWJsZV9uYWdsZShzKQkvKiBOT09QICovCi0KLWludCBhcF9ncmFjZWZ1bF9zdG9wX3NpZ25hbGxlZCh2b2lkKQotewotICAgIC8qIFhYWCAtIERvZXMgdGhpcyByZWFsbHkgd29yaz8gLSBNYW5vaiAqLwotICAgIHJldHVybiBpc19ncmFjZWZ1bDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDaGlsZCBwcm9jZXNzIG1haW4gbG9vcC4KLSAqLwotCi1zdGF0aWMgdm9pZCBwcm9jZXNzX3NvY2tldChhcF9jb250ZXh0X3QgKnAsIGFwX3NvY2tldF90ICpzb2NrLCBpbnQgbXlfY2hpbGRfbnVtLCBpbnQgbXlfdGhyZWFkX251bSkKLXsKLSAgICBCVUZGICpjb25uX2lvOwotICAgIGNvbm5fcmVjICpjdXJyZW50X2Nvbm47Ci0gICAgYXBfaW9sICppb2w7Ci0gICAgbG9uZyBjb25uX2lkID0gbXlfY2hpbGRfbnVtICogSEFSRF9USFJFQURfTElNSVQgKyBteV90aHJlYWRfbnVtOwotICAgIGludCBjc2Q7Ci0KLSAgICBpb2wgPSBiZW9zX2F0dGFjaF9zb2NrZXQoc29jayk7Ci0gICAgaWYgKGlvbCA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChlcnJubyA9PSBFQkFERikgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfV0FSTklORywgZXJybm8sIE5VTEwsCi0gICAgICAgICAgICAgICAgImZpbGVkZXNjcmlwdG9yICgldSkgbGFyZ2VyIHRoYW4gRkRfU0VUU0laRSAoJXUpICIKLSAgICAgICAgICAgICAgICAiZm91bmQsIHlvdSBwcm9iYWJseSBuZWVkIHRvIHJlYnVpbGQgQXBhY2hlIHdpdGggYSAiCi0gICAgICAgICAgICAgICAgImxhcmdlciBGRF9TRVRTSVpFIiwgY3NkLCBGRF9TRVRTSVpFKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgTlVMTCwKLSAgICAgICAgICAgICAgICAiZXJyb3IgYXR0YWNoaW5nIHRvIHNvY2tldCIpOwotICAgICAgICB9Ci0gICAgICAgIGFwX2Nsb3NlX3NvY2tldChzb2NrKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgY29ubl9pbyA9IGFwX2JjcmVhdGUocCwgQl9SRFdSKTsKLSAgICBhcF9icHVzaF9pb2woY29ubl9pbywgaW9sKTsKLQotICAgIGN1cnJlbnRfY29ubiA9IGFwX25ld19hcHJfY29ubmVjdGlvbihwLCBzZXJ2ZXJfY29uZiwgY29ubl9pbywgc29jaywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5faWQpOwotCi0gICAgYXBfcHJvY2Vzc19jb25uZWN0aW9uKGN1cnJlbnRfY29ubik7Ci19Ci0KLXN0YXRpYyBpbnQzMiB3b3JrZXJfdGhyZWFkKHZvaWQgKiBkdW1teSkKLXsKLSAgICBwcm9jX2luZm8gKiB0aSA9IGR1bW15OwotICAgIGludCBwcm9jZXNzX3Nsb3QgPSB0aS0+cGlkOwotICAgIGludCB0aHJlYWRfc2xvdCA9IHRpLT50aWQ7Ci0gICAgYXBfY29udGV4dF90ICp0cG9vbCA9IHRpLT50cG9vbDsKLSAgICBzdHJ1Y3Qgc29ja2FkZHIgc2FfY2xpZW50OwotICAgIGFwX3NvY2tldF90ICpjc2QgPSBOVUxMOwotICAgIGFwX2NvbnRleHRfdCAqcHRyYW5zOwkJLyogUG9vbCBmb3IgcGVyLXRyYW5zYWN0aW9uIHN0dWZmICovCi0gICAgYXBfc29ja2V0X3QgKnNkID0gTlVMTDsKLSAgICBpbnQgc3J2OwotICAgIGludCBjdXJyX3BvbGxmZCwgbGFzdF9wb2xsZmQgPSAwOwotICAgIGludCB0aGVzb2NrOwotICAgIHNpZ3NldF90IHNpZ19tYXNrOwotICAgIAotICAgIGZyZWUodGkpOwotCi0gICAgLyogYmxvY2sgdGhlIHNpZ25hbHMgZm9yIHRoaXMgdGhyZWFkICovCi0gICAgc2lnZmlsbHNldCgmc2lnX21hc2spOwotICAgIHNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNpZ19tYXNrLCBOVUxMKTsKLQotICAgIGFwX2NyZWF0ZV9jb250ZXh0KCZwdHJhbnMsIHRwb29sKTsKLQotICAgIGJlX211dGV4X2xvY2soJndvcmtlcl90aHJlYWRfY291bnRfbXV0ZXgpOwotICAgIHdvcmtlcl90aHJlYWRfY291bnQrKzsKLSAgICBiZV9tdXRleF91bmxvY2soJndvcmtlcl90aHJlYWRfY291bnRfbXV0ZXgpOwotCi0gICAgLyogVE9ETzogU3dpdGNoIHRvIGEgc3lzdGVtIHdoZXJlIHRocmVhZHMgcmV1c2UgdGhlIHJlc3VsdHMgZnJvbSBlYXJsaWVyCi0gICAgICAgcG9sbCBjYWxscyAtIG1hbm9qICovCi0gICAgd2hpbGUgKCF3b3JrZXJzX21heV9leGl0KSB7Ci0gICAgICAgIHdvcmtlcnNfbWF5X2V4aXQgfD0gKGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQgIT0gMCkgJiYgKHJlcXVlc3RzX3RoaXNfY2hpbGQgPD0gMCk7Ci0gICAgICAgIGlmICh3b3JrZXJzX21heV9leGl0KSBicmVhazsKLQotICAgICAgICBTQUZFX0FDQ0VQVChpbnRyYV9tdXRleF9vbigwKSk7Ci0gICAgICAgIGlmICh3b3JrZXJzX21heV9leGl0KSB7Ci0gICAgICAgICAgICBTQUZFX0FDQ0VQVChpbnRyYV9tdXRleF9vZmYoMCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgU0FGRV9BQ0NFUFQoYWNjZXB0X211dGV4X29uKDApKTsKLSAgICAgICAgd2hpbGUgKCF3b3JrZXJzX21heV9leGl0KSB7Ci0gICAgICAgICAgICBzcnYgPSBwb2xsKGxpc3RlbmZkcywgbnVtX2xpc3RlbmZkcyArIDEsIC0xKTsKLSAgICAgICAgICAgIGlmIChzcnYgPCAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIHBvbGwoKSB3aWxsIG9ubHkgcmV0dXJuIGVycm9ycyBpbiBjYXRhc3Ryb3BoaWMKLSAgICAgICAgICAgICAgICAgKiBjaXJjdW1zdGFuY2VzLiBMZXQncyB0cnkgZXhpdGluZyBncmFjZWZ1bGx5LCBmb3Igbm93LiAqLwotICAgICAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsZXJybm8sICAoY29uc3Qgc2VydmVyX3JlYyAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9nZXRfc2VydmVyX2NvbmYoKSwgInBvbGw6IChsaXN0ZW4pIik7Ci0gICAgICAgICAgICAgICAgd29ya2Vyc19tYXlfZXhpdCA9IDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh3b3JrZXJzX21heV9leGl0KSBicmVhazsKLQotICAgICAgICAgICAgaWYgKG51bV9saXN0ZW5mZHMgPT0gMSkgewotICAgICAgICAgICAgICAgIHNkID0gYXBfbGlzdGVuZXJzLT5zZDsKLSAgICAgICAgICAgICAgICBnb3RvIGdvdF9mZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8qIGZpbmQgYSBsaXN0ZW5lciAqLwotICAgICAgICAgICAgICAgIGN1cnJfcG9sbGZkID0gbGFzdF9wb2xsZmQ7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBjdXJyX3BvbGxmZCsrOwotICAgICAgICAgICAgICAgICAgICBpZiAoY3Vycl9wb2xsZmQgPiBudW1fbGlzdGVuZmRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyX3BvbGxmZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogWFhYOiBTaG91bGQgd2UgY2hlY2sgZm9yIFBPTExFUlI/ICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5mZHNbY3Vycl9wb2xsZmRdLnJldmVudHMgJiBQT0xMSU4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfcG9sbGZkID0gY3Vycl9wb2xsZmQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcF9wdXRfb3Nfc29jaygmc2QsICZsaXN0ZW5mZHNbY3Vycl9wb2xsZmRdLmZkLCB0cG9vbCk7IAotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBnb3RfZmQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IHdoaWxlIChjdXJyX3BvbGxmZCAhPSBsYXN0X3BvbGxmZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICBnb3RfZmQ6Ci0gICAgICAgIGlmICghd29ya2Vyc19tYXlfZXhpdCkgewotICAgICAgICAgICAgYXBfYWNjZXB0KCZjc2QsIHNkLCBwdHJhbnMpOwotICAgICAgICAgICAgU0FGRV9BQ0NFUFQoYWNjZXB0X211dGV4X29mZigwKSk7Ci0gICAgICAgICAgICBTQUZFX0FDQ0VQVChpbnRyYV9tdXRleF9vZmYoMCkpOwotICAgICAgICAgICAgcHJvY2Vzc19zb2NrZXQocHRyYW5zLCBjc2QsIHByb2Nlc3Nfc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX3Nsb3QpOwotICAgICAgICAgICAgcmVxdWVzdHNfdGhpc19jaGlsZC0tOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgU0FGRV9BQ0NFUFQoYWNjZXB0X211dGV4X29mZigwKSk7Ci0gICAgICAgICAgICBTQUZFX0FDQ0VQVChpbnRyYV9tdXRleF9vZmYoMCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYXBfY2xlYXJfcG9vbChwdHJhbnMpOwotICAgIH0KLQotICAgIGFwX2Rlc3Ryb3lfcG9vbCh0cG9vbCk7Ci0gICAgYmVfbXV0ZXhfbG9jaygmd29ya2VyX3RocmVhZF9jb3VudF9tdXRleCk7Ci0gICAgd29ya2VyX3RocmVhZF9jb3VudC0tOwotICAgIGlmICh3b3JrZXJfdGhyZWFkX2NvdW50ID09IDApIHsKLSAgICAgICAgLyogQWxsIHRoZSB0aHJlYWRzIGhhdmUgZXhpdGVkLCBub3cgZmluaXNoIHRoZSBzaHV0ZG93biBwcm9jZXNzCi0gICAgICAgICAqIGJ5IHNpZ25hbGxpbmcgdGhlIHNpZ3dhaXQgdGhyZWFkICovCi0gICAgICAgIGtpbGwobXlfcGlkLCBTSUdURVJNKTsKLSAgICB9Ci0gICAgYmVfbXV0ZXhfdW5sb2NrKCZ3b3JrZXJfdGhyZWFkX2NvdW50X211dGV4KTsKLQotICAgIHJldHVybiAoMCk7Ci19Ci0KLQotc3RhdGljIGludDMyIGNoaWxkX21haW4odm9pZCAqIGRhdGEpCi17Ci0gICAgaW50IGNoaWxkX251bV9hcmcgPSAoaW50KSBkYXRhOwotICAgIHNpZ3NldF90IHNpZ19tYXNrOwotICAgIHRocmVhZF9pZCB0aHJlYWQ7Ci0gICAgaW50IGk7Ci0gICAgaW50IG15X2NoaWxkX251bSA9IGNoaWxkX251bV9hcmc7Ci0gICAgcHJvY19pbmZvICpteV9pbmZvID0gTlVMTDsKLSAgICBhcF9saXN0ZW5fcmVjICpscjsKLSAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhOwotICAgIGludDMyIG1zZzsKLSAgICBjaGFyIGJ1ZjsKLSAgICAKLSAgICBteV9waWQgPSBnZXRwaWQoKTsKLSAgICBhcF9jcmVhdGVfY29udGV4dCgmcGNoaWxkLCBwY29uZik7Ci0KLSAgICAvKnN0dWZmIHRvIGRvIGJlZm9yZSB3ZSBzd2l0Y2ggaWQncywgc28gd2UgaGF2ZSBwZXJtaXNzaW9ucy4qLwotICAgIFNBRkVfQUNDRVBUKGludHJhX211dGV4X2luaXQocGNoaWxkLCAxKSk7Ci0gICAgU0FGRV9BQ0NFUFQoYWNjZXB0X211dGV4X2NoaWxkX2luaXQocGNoaWxkKSk7Ci0KLSAgICBpZiAoYmVvc2Rfc2V0dXBfY2hpbGQoKSkgewotCWNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotICAgIH0KLQotICAgIGFwX2NoaWxkX2luaXRfaG9vayhwY2hpbGQsIHNlcnZlcl9jb25mKTsKLQotICAgIC8qZG9uZSB3aXRoIGluaXQgY3JpdGljYWwgc2VjdGlvbiAqLwotCi0gICAgLyogQWxsIHRocmVhZHMgc2hvdWxkIG1hc2sgc2lnbmFscyBvdXQsIGFjY29yaW5nIHRvIHNpZ3dhaXQoMikgbWFuIHBhZ2UgKi8KLSAgICBzaWdmaWxsc2V0KCZzaWdfbWFzayk7Ci0gICAgc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc2lnX21hc2ssIE5VTEwpOwotICAgIAotICAgIHJlcXVlc3RzX3RoaXNfY2hpbGQgPSBhcF9tYXhfcmVxdWVzdHNfcGVyX2NoaWxkOwotICAgIAotICAgIC8qIFNldCB1cCB0aGUgcG9sbGZkIGFycmF5ICovCi0gICAgbGlzdGVuZmRzID0gYXBfcGFsbG9jKHBjaGlsZCwgc2l6ZW9mKHN0cnVjdCBwb2xsZmQpICogKG51bV9saXN0ZW5mZHMpKTsKLSAgICBmb3IgKGxyID0gYXBfbGlzdGVuZXJzLCBpID0gMDsgaSA8IG51bV9saXN0ZW5mZHM7IGxyID0gbHItPm5leHQsICsraSkgewotICAgICAgICBhcF9nZXRfb3Nfc29jaygmbGlzdGVuZmRzW2ldLmZkICwgbHItPnNkKTsKLSAgICAgICAgbGlzdGVuZmRzW2ldLmV2ZW50cyA9IFBPTExJTjsgLyogc2hvdWxkIHdlIGFkZCBQT0xMUFJJID8qLwotICAgICAgICBsaXN0ZW5mZHNbaV0ucmV2ZW50cyA9IDA7Ci0gICAgfQotCi0gICAgLyogU2V0dXAgd29ya2VyIHRocmVhZHMgKi8KLQotICAgIHdvcmtlcl90aHJlYWRfY291bnQgPSAwOwotICAgIGJlX211dGV4X2luaXQoJndvcmtlcl90aHJlYWRfY291bnRfbXV0ZXgsIE5VTEwpOwotCi0gICAgZm9yIChpPTA7IGkgPCBhcF90aHJlYWRzX3Blcl9jaGlsZDsgaSsrKSB7Ci0KLQlteV9pbmZvID0gKHByb2NfaW5mbyAqKW1hbGxvYyhzaXplb2YocHJvY19pbmZvKSk7Ci0gICAgICAgIGlmIChteV9pbmZvID09IE5VTEwpIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgZXJybm8sIHNlcnZlcl9jb25mLAotCQkgICAgICAgICAibWFsbG9jOiBvdXQgb2YgbWVtb3J5Iik7Ci0gICAgICAgICAgICBjbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICAgICAgfQotCW15X2luZm8tPnBpZCA9IG15X2NoaWxkX251bTsKLSAgICAgICAgbXlfaW5mby0+dGlkID0gaTsKLQlteV9pbmZvLT5zZCA9IDA7Ci0JYXBfY3JlYXRlX2NvbnRleHQoJm15X2luZm8tPnRwb29sLCBwY2hpbGQpOwotCQotCS8qIFdlIGFyZSBjcmVhdGluZyB0aHJlYWRzIHJpZ2h0IG5vdyAqLwotCi0JaWYgKCh0aHJlYWQgPSBzcGF3bl90aHJlYWQod29ya2VyX3RocmVhZCwgImh0dHBkX3dvcmtlcl90aHJlYWQiLAotCSAgICAgIEJfTk9STUFMX1BSSU9SSVRZLCBteV9pbmZvKSkgPCBCX05PX0VSUk9SKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19BTEVSVCwgZXJybm8sIHNlcnZlcl9jb25mLAotCQkJICJzcGF3bl90aHJlYWQ6IHVuYWJsZSB0byBjcmVhdGUgd29ya2VyIHRocmVhZCIpOwotICAgICAgICAgICAgLyogSW4gY2FzZSBzeXN0ZW0gcmVzb3VyY2VzIGFyZSBtYXh4ZWQgb3V0LCB3ZSBkb24ndCB3YW50Ci0gICAgICAgICAgICAgICBBcGFjaGUgcnVubmluZyBhd2F5IHdpdGggdGhlIENQVSB0cnlpbmcgdG8gZm9yayBvdmVyIGFuZAotICAgICAgICAgICAgICAgb3ZlciBhbmQgb3ZlciBhZ2FpbiBpZiB3ZSBleGl0LiAqLwotICAgICAgICBzbGVlcCgxMCk7Ci0JICAgIGNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotCX0KLQlyZXN1bWVfdGhyZWFkKHRocmVhZCk7Ci0KLQkvKiBXZSBsZXQgZWFjaCB0aHJlYWQgdXBkYXRlIGl0J3Mgb3duIHNjb3JlYm9hcmQgZW50cnkuICBUaGlzIGlzIGRvbmUKLQkgKiBiZWNhdXNlIGl0IGxldCdzIHVzIGRlYWwgd2l0aCB0aWQgYmV0dGVyLgotCSAqLwotICAgIH0KLQotICAgIHNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsKLSAgICBzYS5zYV9mbGFncyA9IDA7Ci0gICAgc2Euc2FfaGFuZGxlciA9IGp1c3RfZGllOwotICAgIHNpZ2FjdGlvbihTSUdURVJNLCAmc2EsIE5VTEwpOwotICAgIHNpZ2FjdGlvbihTSUdJTlQsICZzYSwgTlVMTCk7Ci0gICAgLyogdGhpcyBibG9ja3MgdW50aWwgaXQgZ2V0cyBhIG1lc3NhZ2UuLi4gKi8KLSAgICByZWFkX3BvcnQocG9ydF9vZl9kZWF0aCwgJm1zZywgJmJ1ZiwgMSk7Ci0KLSAgICByZXR1cm4gKDApOwotfQotCi1zdGF0aWMgaW50IG1ha2VfY2hpbGQoc2VydmVyX3JlYyAqcywgaW50IHNsb3QsIHRpbWVfdCBub3cpCi17Ci0gICAgdGhyZWFkX2lkIHRpZDsKLSAgICAKLSAgICBpZiAoc2xvdCArIDEgPiBtYXhfZGFlbW9uc19saW1pdCkgewotCW1heF9kYWVtb25zX2xpbWl0ID0gc2xvdCArIDE7Ci0gICAgfQotCi0gICAgaWYgKG9uZV9wcm9jZXNzKSB7Ci0gICAgCXNldF9zaWduYWxzKCk7Ci0gICAgICAgIGNoaWxkX3RhYmxlW3Nsb3RdLnBpZCA9IGdldHBpZCgpOwotICAgICAgICBjaGlsZF90YWJsZVtzbG90XS5zdGF0dXMgPSBTRVJWRVJfQUxJVkU7Ci0JICAgIC8vY2hpbGRfbWFpbihzbG90KTsKLSAgICB9Ci0KLSAgICB0aWQgPSBzcGF3bl90aHJlYWQoY2hpbGRfbWFpbiwgImh0dHBkX2NoaWxkIiwgQl9OT1JNQUxfUFJJT1JJVFksCi0gICAgICAgICh2b2lkKilzbG90KTsKLSAgICBpZiAodGlkIDwgQl9OT19FUlJPUikgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgcywgCi0gICAgICAgICAgICAic3Bhd25fdGhyZWFkOiBVbmFibGUgdG8gZm9yayBuZXcgcHJvY2VzcyIpOwotCS8qIEluIGNhc2Ugc3lzdGVtIHJlc291cmNlcyBhcmUgbWF4eGVkIG91dCwgd2UgZG9uJ3Qgd2FudAotCSAgIEFwYWNoZSBydW5uaW5nIGF3YXkgd2l0aCB0aGUgQ1BVIHRyeWluZyB0byBmb3JrIG92ZXIgYW5kCi0JICAgb3ZlciBhbmQgb3ZlciBhZ2Fpbi4gKi8KLSAgICAJc2xlZXAoMTApOwotCi0gICAgCXJldHVybiAtMTsKLSAgICB9Ci0gICAgcmVzdW1lX3RocmVhZCh0aWQpOwotICAgIAotICAgIGNoaWxkX3RhYmxlW3Nsb3RdLnBpZCA9IGdldHBpZCgpOwotICAgIGNoaWxkX3RhYmxlW3Nsb3RdLnN0YXR1cyA9IFNFUlZFUl9BTElWRTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyogc3RhcnQgdXAgYSBidW5jaCBvZiBjaGlsZHJlbiAqLwotc3RhdGljIHZvaWQgc3RhcnR1cF9jaGlsZHJlbihpbnQgbnVtYmVyX3RvX3N0YXJ0KQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgbnVtYmVyX3RvX3N0YXJ0ICYmIGkgPCBhcF9kYWVtb25zX2xpbWl0OyArK2kpIHsKLQlpZiAoY2hpbGRfdGFibGVbaV0uc3RhdHVzICAhPSBTRVJWRVJfREVBRCkgewotCSAgICBjb250aW51ZTsKLQl9Ci0JaWYgKG1ha2VfY2hpbGQoc2VydmVyX2NvbmYsIGksIDApIDwgMCkgewotCSAgICBicmVhazsKLQl9Ci0JLS1udW1iZXJfdG9fc3RhcnQ7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBzcGF3bl9yYXRlIGlzIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCB3aWxsIGJlIHNwYXduZWQgb24gdGhlCi0gKiBuZXh0IG1haW50ZW5hbmNlIGN5Y2xlIGlmIHRoZXJlIGFyZW4ndCBlbm91Z2ggaWRsZSBzZXJ2ZXJzLiAgSXQgaXMKLSAqIGRvdWJsZWQgdXAgdG8gTUFYX1NQQVdOX1JBVEUsIGFuZCByZXNldCBvbmx5IHdoZW4gYSBjeWNsZSBnb2VzIGJ5Ci0gKiB3aXRob3V0IHRoZSBuZWVkIHRvIHNwYXduLgotICovCi1zdGF0aWMgaW50IHNwYXduX3JhdGUgPSAxOwotI2lmbmRlZiBNQVhfU1BBV05fUkFURQotI2RlZmluZSBNQVhfU1BBV05fUkFURQkoMzIpCi0jZW5kaWYKLXN0YXRpYyBpbnQgaG9sZF9vZmZfb25fZXhwb25lbnRpYWxfc3Bhd25pbmc7Ci0KLXN0YXRpYyB2b2lkIHBlcmZvcm1faWRsZV9zZXJ2ZXJfbWFpbnRlbmFuY2Uodm9pZCkKLXsKLSAgICBpbnQgaSwgajsKLSAgICBpbnQgaWRsZV90aHJlYWRfY291bnQ7Ci0gICAgdGltZV90IG5vdyA9IDA7Ci0gICAgaW50IGZyZWVfbGVuZ3RoOwotICAgIGludCBmcmVlX3Nsb3RzW01BWF9TUEFXTl9SQVRFXTsKLSAgICBpbnQgbGFzdF9ub25fZGVhZDsKLSAgICBpbnQgdG90YWxfbm9uX2RlYWQ7Ci0KLSAgICAvKiBpbml0aWFsaXplIHRoZSBmcmVlX2xpc3QgKi8KLSAgICBmcmVlX2xlbmd0aCA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgYXBfZGFlbW9uc19saW1pdDsgKytpKSB7Ci0gICAgICAgIGlmIChjaGlsZF90YWJsZVtpXS5zdGF0dXMgPT0gU0VSVkVSX0RFQUQpIHsKLSAgICAgICAgICAgIGlmIChmcmVlX2xlbmd0aCA8IHNwYXduX3JhdGUpIHsKLSAgICAgICAgICAgICAgICBmcmVlX3Nsb3RzW2ZyZWVfbGVuZ3RoXSA9IGk7Ci0gICAgICAgICAgICAgICAgKytmcmVlX2xlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGxhc3Rfbm9uX2RlYWQgPSBpOwotICAgICAgICB9Ci0KLSAgICAJaWYgKGkgPj0gbWF4X2RhZW1vbnNfbGltaXQgJiYgZnJlZV9sZW5ndGggPj0gc3Bhd25fcmF0ZSkgewotCSAgICAgICAgIGJyZWFrOwotCSAgICB9Ci0gICAgfQotICAgIG1heF9kYWVtb25zX2xpbWl0ID0gbGFzdF9ub25fZGVhZCArIDE7Ci0KLSAgICBpZiAoZnJlZV9sZW5ndGggPiAwKSB7Ci0gICAgCWZvciAoaSA9IDA7IGkgPCBmcmVlX2xlbmd0aDsgKytpKSB7Ci0JICAgICAgICBtYWtlX2NoaWxkKHNlcnZlcl9jb25mLCBmcmVlX3Nsb3RzW2ldLCBub3cpOwotCSAgICB9Ci0JICAgIC8qIHRoZSBuZXh0IHRpbWUgYXJvdW5kIHdlIHdhbnQgdG8gc3Bhd24gdHdpY2UgYXMgbWFueSBpZiB0aGlzCi0JICAgICAqIHdhc24ndCBnb29kIGVub3VnaCwgYnV0IG5vdCBpZiB3ZSd2ZSBqdXN0IGRvbmUgYSBncmFjZWZ1bAotCSAgICAgKi8KLQkgICAgaWYgKGhvbGRfb2ZmX29uX2V4cG9uZW50aWFsX3NwYXduaW5nKSB7Ci0JICAgICAgICAtLWhvbGRfb2ZmX29uX2V4cG9uZW50aWFsX3NwYXduaW5nOwotCSAgICB9IGVsc2UgaWYgKHNwYXduX3JhdGUgPCBNQVhfU1BBV05fUkFURSkgewotCSAgICAgICAgc3Bhd25fcmF0ZSAqPSAyOwotCSAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3Bhd25fcmF0ZSA9IDE7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBzZXJ2ZXJfbWFpbl9sb29wKGludCByZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQpCi17Ci0gICAgaW50IGNoaWxkX3Nsb3Q7Ci0gICAgYXBfd2FpdF90IHN0YXR1czsKLSAgICBpbnQgcGlkOwotICAgIGludCBpOwotCi0gICAgd2hpbGUgKCFyZXN0YXJ0X3BlbmRpbmcgJiYgIXNodXRkb3duX3BlbmRpbmcpIHsKLSAgICAgICAgcGlkID0gd2FpdF9vcl90aW1lb3V0KCZzdGF0dXMpOwotICAgICAgICAKLSAgICAgICAgaWYgKHBpZCA+PSAwKSB7Ci0gICAgICAgICAgICBwcm9jZXNzX2NoaWxkX3N0YXR1cyhwaWQsIHN0YXR1cyk7Ci0gICAgICAgICAgICAvKiBub24tZmF0YWwgZGVhdGguLi4gbm90ZSB0aGF0IGl0J3MgZ29uZSBpbiB0aGUgc2NvcmVib2FyZC4gKi8KLSAgICAgICAgICAgIGNoaWxkX3Nsb3QgPSAtMTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXhfZGFlbW9uc19saW1pdDsgKytpKSB7Ci0gICAgICAgIAlpZiAoY2hpbGRfdGFibGVbaV0ucGlkID09IHBpZCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgajsKLQotICAgICAgICAgICAgICAgICAgICBjaGlsZF9zbG90ID0gaTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IEhBUkRfVEhSRUFEX0xJTUlUOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwX21wbXRfYmVvc19mb3JjZV9yZXNldF9jb25uZWN0aW9uX3N0YXR1cyhpICogSEFSRF9USFJFQURfTElNSVQgKyBqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2hpbGRfc2xvdCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgY2hpbGRfdGFibGVbY2hpbGRfc2xvdF0uc3RhdHVzID0gU0VSVkVSX0RFQUQ7Ci0gICAgICAgICAgICAgICAgCi0JCWlmIChyZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQKLQkJICAgICYmIGNoaWxkX3Nsb3QgPCBhcF9kYWVtb25zX2xpbWl0KSB7Ci0JCSAgICAvKiB3ZSdyZSBzdGlsbCBkb2luZyBhIDEtZm9yLTEgcmVwbGFjZW1lbnQgb2YgZGVhZAotICAgICAgICAgICAgICAgICAgICAgKiBjaGlsZHJlbiB3aXRoIG5ldyBjaGlsZHJlbgotICAgICAgICAgICAgICAgICAgICAgKi8KLQkJICAgIG1ha2VfY2hpbGQoc2VydmVyX2NvbmYsIGNoaWxkX3Nsb3QsIHRpbWUoTlVMTCkpOwotCQkgICAgLS1yZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQ7Ci0JCX0KLSNpZmRlZiBIQVNfT1RIRVJfQ0hJTEQKLQkgICAgfQotCSAgICBlbHNlIGlmIChyZWFwX290aGVyX2NoaWxkKHBpZCwgc3RhdHVzKSA9PSAwKSB7Ci0JCS8qIGhhbmRsZWQgKi8KLSNlbmRpZgotCSAgICB9Ci0JICAgIGVsc2UgaWYgKGlzX2dyYWNlZnVsKSB7Ci0JCS8qIEdyZWF0LCB3ZSd2ZSBwcm9iYWJseSBqdXN0IGxvc3QgYSBzbG90IGluIHRoZQotCQkgICAgKiBzY29yZWJvYXJkLiAgU29tZWhvdyB3ZSBkb24ndCBrbm93IGFib3V0IHRoaXMKLQkJICAgICogY2hpbGQuCi0JCSAgICAqLwotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLCBlcnJubywgc2VydmVyX2NvbmYsCi0JCQkgICAgImxvbmcgbG9zdCBjaGlsZCBjYW1lIGhvbWUhIChwaWQgJWQpIiwgcGlkKTsKLQkgICAgfQotCSAgICAvKiBEb24ndCBwZXJmb3JtIGlkbGUgbWFpbnRlbmFuY2Ugd2hlbiBhIGNoaWxkIGRpZXMsCi0gICAgICAgICAgICAgKiBvbmx5IGRvIGl0IHdoZW4gdGhlcmUncyBhIHRpbWVvdXQuICBSZW1lbWJlciBvbmx5IGEKLSAgICAgICAgICAgICAqIGZpbml0ZSBudW1iZXIgb2YgY2hpbGRyZW4gY2FuIGRpZSwgYW5kIGl0J3MgcHJldHR5Ci0gICAgICAgICAgICAgKiBwYXRob2xvZ2ljYWwgZm9yIGEgbG90IHRvIGRpZSBzdWRkZW5seS4KLSAgICAgICAgICAgICAqLwotCSAgICBjb250aW51ZTsKLQl9Ci0JZWxzZSBpZiAocmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0KSB7Ci0JICAgIC8qIHdlIGhpdCBhIDEgc2Vjb25kIHRpbWVvdXQgaW4gd2hpY2ggbm9uZSBvZiB0aGUgcHJldmlvdXMKLQkgICAgICogZ2VuZXJhdGlvbiBvZiBjaGlsZHJlbiBuZWVkZWQgdG8gYmUgcmVhcGVkLi4uIHNvIGFzc3VtZQotCSAgICAgKiB0aGV5J3JlIGFsbCBkb25lLCBhbmQgcGljayB1cCB0aGUgc2xhY2sgaWYgYW55IGlzIGxlZnQuCi0JICAgICAqLwotCSAgICBzdGFydHVwX2NoaWxkcmVuKHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydCk7Ci0JICAgIHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydCA9IDA7Ci0JICAgIC8qIEluIGFueSBldmVudCB3ZSByZWFsbHkgc2hvdWxkbid0IGRvIHRoZSBjb2RlIGJlbG93IGJlY2F1c2UKLQkgICAgICogZmV3IG9mIHRoZSBzZXJ2ZXJzIHdlIGp1c3Qgc3RhcnRlZCBhcmUgaW4gdGhlIElETEUgc3RhdGUKLQkgICAgICogeWV0LCBzbyB3ZSdkIG1pc3Rha2VubHkgY3JlYXRlIGFuIGV4dHJhIHNlcnZlci4KLQkgICAgICovCi0JICAgIGNvbnRpbnVlOwotCX0KLQotCXBlcmZvcm1faWRsZV9zZXJ2ZXJfbWFpbnRlbmFuY2UoKTsKLSAgICB9Ci19Ci0KLWludCBhcF9tcG1fcnVuKGFwX2NvbnRleHRfdCAqX3Bjb25mLCBhcF9jb250ZXh0X3QgKnBsb2csIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgaW50IHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydDsKLQotICAgIHBjb25mID0gX3Bjb25mOwotICAgIHNlcnZlcl9jb25mID0gczsKLSAgICBwb3J0X29mX2RlYXRoID0gY3JlYXRlX3BvcnQoMSwgImh0dHBkX3BvcnRfb2ZfZGVhdGgiKTsKLQotICAgIGlmICgobnVtX2xpc3RlbmZkcyA9IHNldHVwX2xpc3RlbmVycyhzZXJ2ZXJfY29uZikpIDwgMSkgewotICAgICAgICAvKiBYWFg6IGhleSwgd2hhdCdzIHRoZSByaWdodCB3YXkgZm9yIHRoZSBtcG0gdG8gaW5kaWNhdGUgYSBmYXRhbCBlcnJvcj8gKi8KLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfQUxFUlQsIGVycm5vLCBzLAotICAgICAgICAgICAgIm5vIGxpc3RlbmluZyBzb2NrZXRzIGF2YWlsYWJsZSwgc2h1dHRpbmcgZG93biIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgYXBfbG9nX3BpZChwY29uZiwgYXBfcGlkX2ZuYW1lKTsKLSAgICBTQUZFX0FDQ0VQVChhY2NlcHRfbXV0ZXhfaW5pdChwY29uZiwgMSkpOwotICAgIGlmICghaXNfZ3JhY2VmdWwpIHsKLQlyZWluaXRfc2NvcmVib2FyZChwY29uZik7Ci0gICAgfQotCi0gICAgc2V0X3NpZ25hbHMoKTsKLSAgICAvKiBEb24ndCB0aHJhc2guLi4gKi8KLSAgICBpZiAobWF4X3NwYXJlX3RocmVhZHMgPCBtaW5fc3BhcmVfdGhyZWFkcyArIGFwX3RocmVhZHNfcGVyX2NoaWxkKQotCW1heF9zcGFyZV90aHJlYWRzID0gbWluX3NwYXJlX3RocmVhZHMgKyBhcF90aHJlYWRzX3Blcl9jaGlsZDsKLQotICAgIC8qIElmIHdlJ3JlIGRvaW5nIGEgZ3JhY2VmdWxfcmVzdGFydCB0aGVuIHdlJ3JlIGdvaW5nIHRvIHNlZSBhIGxvdAotICAgICAqIG9mIGNoaWxkcmVuIGV4aXRpbmcgaW1tZWRpYXRlbHkgd2hlbiB3ZSBnZXQgaW50byB0aGUgbWFpbiBsb29wCi0gICAgICogYmVsb3cgKGJlY2F1c2Ugd2UganVzdCBzZW50IHRoZW0gU0lHV0lOQ0gpLiAgVGhpcyBoYXBwZW5zIHByZXR0eQotICAgICAqIHJhcGlkbHkuLi4gYW5kIGZvciBlYWNoIG9uZSB0aGF0IGV4aXRzIHdlJ2xsIHN0YXJ0IGEgbmV3IG9uZSB1bnRpbAotICAgICAqIHdlIHJlYWNoIGF0IGxlYXN0IGRhZW1vbnNfbWluX2ZyZWUuICBCdXQgd2UgbWF5IGJlIHBlcm1pdHRlZCB0bwotICAgICAqIHN0YXJ0IG1vcmUgdGhhbiB0aGF0LCBzbyB3ZSdsbCBqdXN0IGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgd2UncmUKLSAgICAgKiBzdXBwb3NlZCB0byBzdGFydCB1cCB3aXRob3V0IHRoZSAxIHNlY29uZCBwZW5hbHR5IGJldHdlZW4gZWFjaCBmb3JrLgotICAgICAqLwotICAgIHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydCA9IGFwX2RhZW1vbnNfdG9fc3RhcnQ7Ci0gICAgaWYgKHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydCA+IGFwX2RhZW1vbnNfbGltaXQpIHsKLQlyZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQgPSBhcF9kYWVtb25zX2xpbWl0OwotICAgIH0KLSAgICBpZiAoIWlzX2dyYWNlZnVsKSB7Ci0Jc3RhcnR1cF9jaGlsZHJlbihyZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQpOwotCXJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydCA9IDA7Ci0gICAgfQotICAgIGVsc2UgewotCS8qIGdpdmUgdGhlIHN5c3RlbSBzb21lIHRpbWUgdG8gcmVjb3ZlciBiZWZvcmUga2lja2luZyBpbnRvCi0JICAgICogZXhwb25lbnRpYWwgbW9kZSAqLwotCWhvbGRfb2ZmX29uX2V4cG9uZW50aWFsX3NwYXduaW5nID0gMTA7Ci0gICAgfQotCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCBlcnJubywgc2VydmVyX2NvbmYsCi0JCSIlcyBjb25maWd1cmVkIC0tIHJlc3VtaW5nIG5vcm1hbCBvcGVyYXRpb25zIiwKLQkJYXBfZ2V0X3NlcnZlcl92ZXJzaW9uKCkpOwotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0lORk8sIGVycm5vLCBzZXJ2ZXJfY29uZiwKLQkJIlNlcnZlciBidWlsdDogJXMiLCBhcF9nZXRfc2VydmVyX2J1aWx0KCkpOwotICAgIHJlc3RhcnRfcGVuZGluZyA9IHNodXRkb3duX3BlbmRpbmcgPSAwOwotCi0gICAgc2VydmVyX21haW5fbG9vcChyZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQpOwotCi0gICAgaWYgKHNodXRkb3duX3BlbmRpbmcpIHsKLSAgICAgICAgLyogVGltZSB0byBncmFjZWZ1bGx5IHNodXQgZG93bjoKLSAgICAgICAgICogS2lsbCBjaGlsZCBwcm9jZXNzZXMsIHRlbGwgdGhlbSB0byBjYWxsIGNoaWxkX2V4aXQsIGV0Yy4uLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGJlb3NkX2tpbGxwZyhnZXRwZ3JwKCksIFNJR1RFUk0pIDwgMCkgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAia2lsbHBnIFNJR1RFUk0iKTsKLSAgICAgICAgfQotICAgICAgICByZWNsYWltX2NoaWxkX3Byb2Nlc3NlcygxKTsJCS8qIFN0YXJ0IHdpdGggU0lHVEVSTSAqLwotICAgIAotICAgICAgICAvKiBjbGVhbnVwIHBpZCBmaWxlIG9uIG5vcm1hbCBzaHV0ZG93biAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpwaWRmaWxlID0gTlVMTDsKLSAgICAgICAgICAgIHBpZGZpbGUgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZSAocGNvbmYsIGFwX3BpZF9mbmFtZSk7Ci0gICAgICAgICAgICBpZiAoIHBpZGZpbGUgIT0gTlVMTCAmJiB1bmxpbmsocGlkZmlsZSkgPT0gMCkKLSAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19JTkZPLAotICAgICAgICAgICAgCQkgZXJybm8sIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgCQkgInJlbW92ZWQgUElEIGZpbGUgJXMgKHBpZD0lbGQpIiwKLSAgICAgICAgICAgIAkJIHBpZGZpbGUsIChsb25nKWdldHBpZCgpKTsKLSAgICAgICAgfQotICAgIAotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19OT1RJQ0UsIGVycm5vLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICJjYXVnaHQgU0lHVEVSTSwgc2h1dHRpbmcgZG93biIpOwotICAgIAotCXJldHVybiAxOwotICAgIH0KLQotICAgIC8qIHdlJ3ZlIGJlZW4gdG9sZCB0byByZXN0YXJ0ICovCi0gICAgc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7Ci0KLSAgICBpZiAob25lX3Byb2Nlc3MpIHsKLQkvKiBub3Qgd29ydGggdGhpbmtpbmcgYWJvdXQgKi8KLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBpZiAoaXNfZ3JhY2VmdWwpIHsKLQlpbnQgaSwgajsKLSAgICAgICAgY2hhciBjaGFyX29mX2RlYXRoID0gJyEnOwotCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCBlcnJubywgc2VydmVyX2NvbmYsCi0JCSAgICAiU0lHV0lOQ0ggcmVjZWl2ZWQuICBEb2luZyBncmFjZWZ1bCByZXN0YXJ0Iik7Ci0KLQkvKiBnaXZlIHRoZSBjaGlsZHJlbiB0aGUgc2lnbmFsIHRvIGRpZSAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXBfZGFlbW9uc19saW1pdDspIHsKLSAgICAgICAgICAgIGlmKGNoaWxkX3RhYmxlW2ldLnN0YXR1cyAhPSBTRVJWRVJfREVBRCkgewotICAgICAgICAgICAgICAgIGlmICh3cml0ZV9wb3J0KHBvcnRfb2ZfZGVhdGgsIDk5LCAmY2hhcl9vZl9kZWF0aCwgMSkgIT0gQl9PSykgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAid3JpdGUgcG9ydF9vZl9kZWF0aCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotCi0gICAgfQotICAgIGVsc2UgewotICAgICAgLyogS2lsbCAnZW0gYWxsLiAgU2luY2UgdGhlIGNoaWxkIGFjdHMgdGhlIHNhbWUgb24gdGhlIHBhcmVudHMgU0lHVEVSTSAKLSAgICAgICAqIGFuZCBhIFNJR0hVUCwgd2UgbWF5IGFzIHdlbGwgdXNlIHRoZSBzYW1lIHNpZ25hbCwgYmVjYXVzZSBzb21lIHVzZXIKLSAgICAgICAqIHB0aHJlYWRzIGFyZSBzdGVhbGluZyBzaWduYWxzIGZyb20gdXMgbGVmdCBhbmQgcmlnaHQuCi0gICAgICAgKi8KLQlpZiAoYmVvc2Rfa2lsbHBnKGdldHBncnAoKSwgU0lHVEVSTSkgPCAwKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgc2VydmVyX2NvbmYsCi0JICAgICAgICJraWxscGcgU0lHVEVSTSIpOwotCX0KLSAgICAgICAgcmVjbGFpbV9jaGlsZF9wcm9jZXNzZXMoMSk7CQkvKiBTdGFydCB3aXRoIFNJR1RFUk0gKi8KLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19OT1RJQ0UsIGVycm5vLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJTSUdIVVAgcmVjZWl2ZWQuICBBdHRlbXB0aW5nIHRvIHJlc3RhcnQiKTsKLSAgICB9Ci0gICAgaWYgKCFpc19ncmFjZWZ1bCkgewotICAgICAgICBhcF9yZXN0YXJ0X3RpbWUgPSB0aW1lKE5VTEwpOyAKLSAgICB9Ci0gICAgZGVsZXRlX3BvcnQocG9ydF9vZl9kZWF0aCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG1wbXRfYmVvc19wcmVfY29uZmlnKGFwX2NvbnRleHRfdCAqcGNvbmYsIGFwX2NvbnRleHRfdCAqcGxvZywgYXBfY29udGV4dF90ICpwdGVtcCkKLXsKLSAgICBzdGF0aWMgaW50IHJlc3RhcnRfbnVtID0gMDsKLQotICAgIG9uZV9wcm9jZXNzID0gISFnZXRlbnYoIk9ORV9QUk9DRVNTIik7Ci0KLSAgICAvKiBzaWdoLCB3YW50IHRoaXMgb25seSB0aGUgc2Vjb25kIHRpbWUgYXJvdW5kICovCi0gICAgaWYgKHJlc3RhcnRfbnVtKysgPT0gMSkgewotCWlzX2dyYWNlZnVsID0gMDsKLQotCWlmICghb25lX3Byb2Nlc3MpIHsKLQkgICAgYmVvc2RfZGV0YWNoKCk7Ci0JfQotCi0JbXlfcGlkID0gZ2V0cGlkKCk7Ci0gICAgfQotCi0gICAgYmVvc2RfcHJlX2NvbmZpZygpOwotICAgIGFwX2xpc3Rlbl9wcmVfY29uZmlnKCk7Ci0gICAgYXBfZGFlbW9uc190b19zdGFydCA9IERFRkFVTFRfU1RBUlRfREFFTU9OOwotICAgIG1pbl9zcGFyZV90aHJlYWRzID0gREVGQVVMVF9NSU5fRlJFRV9EQUVNT04gKiBERUZBVUxUX1RIUkVBRFNfUEVSX0NISUxEOwotICAgIG1heF9zcGFyZV90aHJlYWRzID0gREVGQVVMVF9NQVhfRlJFRV9EQUVNT04gKiBERUZBVUxUX1RIUkVBRFNfUEVSX0NISUxEOwotICAgIGFwX2RhZW1vbnNfbGltaXQgPSBIQVJEX1NFUlZFUl9MSU1JVDsKLSAgICBhcF90aHJlYWRzX3Blcl9jaGlsZCA9IERFRkFVTFRfVEhSRUFEU19QRVJfQ0hJTEQ7Ci0gICAgYXBfcGlkX2ZuYW1lID0gREVGQVVMVF9QSURMT0c7Ci0gICAgYXBfc2NvcmVib2FyZF9mbmFtZSA9IERFRkFVTFRfU0NPUkVCT0FSRDsKLSAgICBhcF9tYXhfcmVxdWVzdHNfcGVyX2NoaWxkID0gREVGQVVMVF9NQVhfUkVRVUVTVFNfUEVSX0NISUxEOwotICAgIGFwX21wbXRfYmVvc19zZXRfbWFpbnRhaW5fY29ubmVjdGlvbl9zdGF0dXMoMSk7Ci0KLSAgICBhcF9jcHlzdHJuKGFwX2NvcmVkdW1wX2RpciwgYXBfc2VydmVyX3Jvb3QsIHNpemVvZihhcF9jb3JlZHVtcF9kaXIpKTsKLX0KLQotc3RhdGljIHZvaWQgbXBtdF9iZW9zX2hvb2tzKHZvaWQpCi17Ci0gICAgYXBfaG9va19wcmVfY29uZmlnKG1wbXRfYmVvc19wcmVfY29uZmlnLE5VTEwsTlVMTCxIT09LX01JRERMRSk7Ci0gICAgSU5JVF9TSUdMSVNUKCkKLSAgICBvbmVfcHJvY2VzcyA9IDA7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9waWRmaWxlKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoY21kLT5zZXJ2ZXItPmlzX3ZpcnR1YWwpIHsKLQlyZXR1cm4gIlBpZEZpbGUgZGlyZWN0aXZlIG5vdCBhbGxvd2VkIGluIDxWaXJ0dWFsSG9zdD4iOwotICAgIH0KLSAgICBhcF9waWRfZm5hbWUgPSBhcmc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfc2NvcmVib2FyZChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgYXBfc2NvcmVib2FyZF9mbmFtZSA9IGFyZzsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9kYWVtb25zX3RvX3N0YXJ0KGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcF9kYWVtb25zX3RvX3N0YXJ0ID0gYXRvaShhcmcpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X21pbl9zcGFyZV90aHJlYWRzKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1pbl9zcGFyZV90aHJlYWRzID0gYXRvaShhcmcpOwotICAgIGlmIChtaW5fc3BhcmVfdGhyZWFkcyA8PSAwKSB7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgIldBUk5JTkc6IGRldGVjdGVkIE1pblNwYXJlVGhyZWFkcyBzZXQgdG8gbm9uLXBvc2l0aXZlLiIpOwotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgIlJlc2V0dGluZyB0byAxIHRvIGF2b2lkIGFsbW9zdCBjZXJ0YWluIEFwYWNoZSBmYWlsdXJlLiIpOwotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICJQbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbi4iKTsKLSAgICAgICBtaW5fc3BhcmVfdGhyZWFkcyA9IDE7Ci0gICAgfQotICAgICAgIAotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X21heF9zcGFyZV90aHJlYWRzKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIG1heF9zcGFyZV90aHJlYWRzID0gYXRvaShhcmcpOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3NlcnZlcl9saW1pdCAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX2RhZW1vbnNfbGltaXQgPSBhdG9pKGFyZyk7Ci0gICAgaWYgKGFwX2RhZW1vbnNfbGltaXQgPiBIQVJEX1NFUlZFUl9MSU1JVCkgewotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICJXQVJOSU5HOiBNYXhDbGllbnRzIG9mICVkIGV4Y2VlZHMgY29tcGlsZSB0aW1lIGxpbWl0ICIKLSAgICAgICAgICAgICAgICAgICAgIm9mICVkIHNlcnZlcnMsIiwgYXBfZGFlbW9uc19saW1pdCwgSEFSRF9TRVJWRVJfTElNSVQpOwotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICIgbG93ZXJpbmcgTWF4Q2xpZW50cyB0byAlZC4gIFRvIGluY3JlYXNlLCBwbGVhc2UgIgotICAgICAgICAgICAgICAgICAgICAic2VlIHRoZSIsIEhBUkRfU0VSVkVSX0xJTUlUKTsKLSAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAiIEhBUkRfU0VSVkVSX0xJTUlUIGRlZmluZSBpbiBzcmMvaW5jbHVkZS9odHRwZC5oLiIpOwotICAgICAgIGFwX2RhZW1vbnNfbGltaXQgPSBIQVJEX1NFUlZFUl9MSU1JVDsKLSAgICB9IAotICAgIGVsc2UgaWYgKGFwX2RhZW1vbnNfbGltaXQgPCAxKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICJXQVJOSU5HOiBSZXF1aXJlIE1heENsaWVudHMgPiAwLCBzZXR0aW5nIHRvIDEiKTsKLQlhcF9kYWVtb25zX2xpbWl0ID0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfdGhyZWFkc19wZXJfY2hpbGQgKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcF90aHJlYWRzX3Blcl9jaGlsZCA9IGF0b2koYXJnKTsKLSAgICBpZiAoYXBfdGhyZWFkc19wZXJfY2hpbGQgPiBIQVJEX1RIUkVBRF9MSU1JVCkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIldBUk5JTkc6IFRocmVhZHNQZXJDaGlsZCBvZiAlZCBleGNlZWRzIGNvbXBpbGUgdGltZSIKLSAgICAgICAgICAgICAgICAgICAgICJsaW1pdCBvZiAlZCB0aHJlYWRzLFxuIiwgYXBfdGhyZWFkc19wZXJfY2hpbGQsCi0gICAgICAgICAgICAgICAgICAgICBIQVJEX1RIUkVBRF9MSU1JVCk7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiIGxvd2VyaW5nIFRocmVhZHNQZXJDaGlsZCB0byAlZC4gVG8gaW5jcmVhc2UsIHBsZWFzZSIKLSAgICAgICAgICAgICAgICAgICAgICJzZWUgdGhlIiwgSEFSRF9USFJFQURfTElNSVQpOwotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIiBIQVJEX1RIUkVBRF9MSU1JVCBkZWZpbmUgaW4gc3JjL2luY2x1ZGUvaHR0cGQuaC4iKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYXBfdGhyZWFkc19wZXJfY2hpbGQgPCAxKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICJXQVJOSU5HOiBSZXF1aXJlIFRocmVhZHNQZXJDaGlsZCA+IDAsIHNldHRpbmcgdG8gMSIpOwotCWFwX3RocmVhZHNfcGVyX2NoaWxkID0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbWF4X3JlcXVlc3RzKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcF9tYXhfcmVxdWVzdHNfcGVyX2NoaWxkID0gYXRvaShhcmcpOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbWFpbnRhaW5fY29ubmVjdGlvbl9zdGF0dXMoY21kX3Bhcm1zICpjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVfZGlyX2NvbmZpZyAqZCwgaW50IGFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgYXBfbXBtdF9iZW9zX3NldF9tYWludGFpbl9jb25uZWN0aW9uX3N0YXR1cyhhcmcgIT0gMCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfY29yZWR1bXBkaXIgKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsKLSAgICBjb25zdCBjaGFyICpmbmFtZTsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBmbmFtZSA9IGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKGNtZC0+cG9vbCwgYXJnKTsKLSAgICBpZiAoKHN0YXQoZm5hbWUsICZmaW5mbykgPT0gLTEpIHx8ICFTX0lTRElSKGZpbmZvLnN0X21vZGUpKSB7Ci0JcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiQ29yZUR1bXBEaXJlY3RvcnkgIiwgZm5hbWUsIAotCQkJICAiIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIGRpcmVjdG9yeSIsIE5VTEwpOwotICAgIH0KLSAgICBhcF9jcHlzdHJuKGFwX2NvcmVkdW1wX2RpciwgZm5hbWUsIHNpemVvZihhcF9jb3JlZHVtcF9kaXIpKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIG1wbXRfYmVvc19jbWRzW10gPSB7Ci1VTklYX0RBRU1PTl9DT01NQU5EUwotTElTVEVOX0NPTU1BTkRTCi17ICJQaWRGaWxlIiwgc2V0X3BpZGZpbGUsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICAgIkEgZmlsZSBmb3IgbG9nZ2luZyB0aGUgc2VydmVyIHByb2Nlc3MgSUQifSwKLXsgIlNjb3JlQm9hcmRGaWxlIiwgc2V0X3Njb3JlYm9hcmQsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICAgIkEgZmlsZSBmb3IgQXBhY2hlIHRvIG1haW50YWluIHJ1bnRpbWUgcHJvY2VzcyBtYW5hZ2VtZW50IGluZm9ybWF0aW9uIn0sCi17ICJTdGFydFNlcnZlcnMiLCBzZXRfZGFlbW9uc190b19zdGFydCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIk51bWJlciBvZiBjaGlsZCBwcm9jZXNzZXMgbGF1bmNoZWQgYXQgc2VydmVyIHN0YXJ0dXAiIH0sCi17ICJNaW5TcGFyZVRocmVhZHMiLCBzZXRfbWluX3NwYXJlX3RocmVhZHMsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJNaW5pbXVtIG51bWJlciBvZiBpZGxlIGNoaWxkcmVuLCB0byBoYW5kbGUgcmVxdWVzdCBzcGlrZXMiIH0sCi17ICJNYXhTcGFyZVRocmVhZHMiLCBzZXRfbWF4X3NwYXJlX3RocmVhZHMsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJNYXhpbXVtIG51bWJlciBvZiBpZGxlIGNoaWxkcmVuIiB9LAoteyAiTWF4Q2xpZW50cyIsIHNldF9zZXJ2ZXJfbGltaXQsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJNYXhpbXVtIG51bWJlciBvZiBjaGlsZHJlbiBhbGl2ZSBhdCB0aGUgc2FtZSB0aW1lIiB9LAoteyAiVGhyZWFkc1BlckNoaWxkIiwgc2V0X3RocmVhZHNfcGVyX2NoaWxkLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiTnVtYmVyIG9mIHRocmVhZHMgZWFjaCBjaGlsZCBjcmVhdGVzIiB9LAoteyAiTWF4UmVxdWVzdHNQZXJDaGlsZCIsIHNldF9tYXhfcmVxdWVzdHMsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJNYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyBhIHBhcnRpY3VsYXIgY2hpbGQgc2VydmVzIGJlZm9yZSBkeWluZy4iIH0sCi17ICJDb25uZWN0aW9uU3RhdHVzIiwgc2V0X21haW50YWluX2Nvbm5lY3Rpb25fc3RhdHVzLCBOVUxMLCBSU1JDX0NPTkYsIEZMQUcsCi0gICJXaGV0aGVyIG9yIG5vdCB0byBtYWludGFpbiBzdGF0dXMgaW5mb3JtYXRpb24gb24gY3VycmVudCBjb25uZWN0aW9ucyJ9LAoteyAiQ29yZUR1bXBEaXJlY3RvcnkiLCBzZXRfY29yZWR1bXBkaXIsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJUaGUgbG9jYXRpb24gb2YgdGhlIGRpcmVjdG9yeSBBcGFjaGUgY2hhbmdlcyB0byBiZWZvcmUgZHVtcGluZyBjb3JlIiB9LAoteyBOVUxMIH0KLX07Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBtcG1fbXBtdF9iZW9zX21vZHVsZSA9IHsKLSAgICBTVEFOREFSRDIwX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLAkJCS8qIGNyZWF0ZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgICBOVUxMLAkJCS8qIG1lcmdlIHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgICBOVUxMLAkJCS8qIGNyZWF0ZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgICBOVUxMLAkJCS8qIG1lcmdlIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgICBtcG10X2Jlb3NfY21kcywJCS8qIGNvbW1hbmQgYXBfdGFibGVfdCAqLwotICAgIE5VTEwsCQkJLyogaGFuZGxlcnMgKi8KLSAgICBtcG10X2Jlb3NfaG9va3MJCS8qIHJlZ2lzdGVyX2hvb2tzICovCi19OwotCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL21wbXRfYmVvcy9tcG10X2Jlb3MuaCBiL3NlcnZlci9tcG0vbXBtdF9iZW9zL21wbXRfYmVvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjI2MGMxLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vbXBtdF9iZW9zL21wbXRfYmVvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCi0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgCi0gKiBhcmUgbWV0OiAKLSAqIAotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgCi0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuICAKLSAqIAotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgCi0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIAotICogICAgZGlzdHJpYnV0aW9uLiAKLSAqIAotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIAotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6IAotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cCAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iIAotICogCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvIAotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCi0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuIAotICogCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiAKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4gCi0gKiAKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcgCi0gKiAgICBhY2tub3dsZWRnbWVudDogCi0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwIAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIgCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWSAKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUiAKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCi0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSAKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCAKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKLSAqIAotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkgCi0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQgCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uIAotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlciAKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LiAKLSAqIAotICovIAotCi0jaWZuZGVmIEFQQUNIRV9NUE1fTVBNVF9CRU9TX0gKLSNkZWZpbmUgQVBBQ0hFX01QTV9NUE1UX0JFT1NfSAotCi1leHRlcm4gaW50IGFwX3RocmVhZHNfcGVyX2NoaWxkOwotZXh0ZXJuIGludCBhcF9tYXhfcmVxdWVzdHNfcGVyX2NoaWxkOwotZXh0ZXJuIGludCBhcF9waXBlX29mX2RlYXRoWzJdOwotZXh0ZXJuIGludCBhcF9leHRlbmRlZF9zdGF0dXM7Ci1leHRlcm4gdm9pZCBjbGVhbl9jaGlsZF9leGl0KGludCk7Ci1leHRlcm4gaW50IG1heF9kYWVtb25zX2xpbWl0OwotCi0jZW5kaWYgLyogQVBBQ0hFX01QTV9NUE1UX0JFT1NfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9tcG10X2Jlb3MvcG9sbC5jIGIvc2VydmVyL21wbS9tcG10X2Jlb3MvcG9sbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGM0NzFlLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vbXBtdF9iZW9zL3BvbGwuYworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk5IFJhbGYgUy4gRW5nZWxzY2hhbGwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgUkFMRiBTLiBFTkdFTFNDSEFMTCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgUkFMRiBTLiBFTkdFTFNDSEFMTCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAicG9sbC5oIgotCi0vKiAKLSAqIEVtdWxhdGUgU3lzViBwb2xsKDIpIHdpdGggQlNEIHNlbGVjdCgyKQotICogV3JpdHRlbiBpbiBKdW5lIDE5OTkgYnkgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGVuZ2Vsc2NoYWxsLmNvbT4KLSAqLwotCi1pbnQgcG9sbChzdHJ1Y3QgcG9sbGZkICpwZmQsIHVuc2lnbmVkIGludCBuZmQsIGludCB0aW1lb3V0KQotewotICAgIGZkX3NldCByZmRzLCB3ZmRzLCBlZmRzOwotICAgIHN0cnVjdCB0aW1ldmFsIHR2LCAqcHR2OwotICAgIGludCBtYXhmZCwgcmMsIGksIG9rOwotICAgIGNoYXIgZGF0YVs2NF07Ci0KLSAgICAvKiBwb2xsKDIpIHNlbWFudGljcyAqLwotICAgIGlmIChwZmQgPT0gTlVMTCkgewotICAgICAgICBlcnJubyA9IEVGQVVMVDsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIGNvbnZlcnQgdGltZW91dCBudW1iZXIgaW50byBhIHRpbWV2YWwgc3RydWN0dXJlICovCi0gICAgcHR2ID0gJnR2OwotICAgIGlmICh0aW1lb3V0ID09IDApIHsKLSAgICAgICAgLyogcmV0dXJuIGltbWVkaWF0ZWx5ICovCi0gICAgICAgIHB0di0+dHZfc2VjICA9IDA7Ci0gICAgICAgIHB0di0+dHZfdXNlYyA9IDA7Ci0gICAgfQotICAgIGVsc2UgaWYgKHRpbWVvdXQgPT0gSU5GVElNKSB7Ci0gICAgICAgIC8qIHdhaXQgZm9yZXZlciAqLwotICAgICAgICBwdHYgPSBOVUxMOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogcmV0dXJuIGFmdGVyIHRpbWVvdXQgKi8KLSAgICAgICAgcHR2LT50dl9zZWMgID0gdGltZW91dCAvIDEwMDA7Ci0gICAgICAgIHB0di0+dHZfdXNlYyA9ICh0aW1lb3V0ICUgMTAwMCkgKiAxMDAwOwotICAgIH0KLQotICAgIC8qIGNsZWFuIGlsbGVnYWwgZmQgc2V0IGFuZCAocmUpZW50ZXIgdGhlIHJlcGVhdCBsb29wICovCi0KLSAgICAvKiBjcmVhdGUgZmQgc2V0cyBhbmQgZGV0ZXJtaW5lIG1heCBmZCAqLwotICAgIG1heGZkID0gMDsKLSAgICBGRF9aRVJPKCZyZmRzKTsKLSAgICBGRF9aRVJPKCZ3ZmRzKTsKLSAgICBGRF9aRVJPKCZlZmRzKTsKLSAgICBmb3IoaSA9IDA7IGkgPCBuZmQ7IGkrKykgewotICAgICAgICBpZiAocGZkW2ldLmZkIDwgMCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBmZFtpXS5ldmVudHMgJiBQT0xMSU4pCi0gICAgICAgICAgICBGRF9TRVQocGZkW2ldLmZkLCAmcmZkcyk7Ci0gICAgICAgIGlmIChwZmRbaV0uZXZlbnRzICYgUE9MTE9VVCkKLSAgICAgICAgICAgIEZEX1NFVChwZmRbaV0uZmQsICZ3ZmRzKTsKLSAgICAgICAgaWYgKHBmZFtpXS5ldmVudHMgJiBQT0xMUFJJKQotICAgICAgICAgICAgRkRfU0VUKHBmZFtpXS5mZCwgJmVmZHMpOwotICAgICAgICBpZiAocGZkW2ldLmZkID49IG1heGZkICYmIChwZmRbaV0uZXZlbnRzICYgKFBPTExJTnxQT0xMT1VUfFBPTExQUkkpKSkKLSAgICAgICAgICAgIG1heGZkID0gcGZkW2ldLmZkOwotICAgIH0KLQotICAgIC8qIGV4YW1pbmUgZmQgc2V0cyAqLwotICAgIHJjID0gc2VsZWN0KG1heGZkKzEsICZyZmRzLCAmd2ZkcywgJmVmZHMsIHB0dik7Ci0KLSAgICAvKiBlc3RhYmxpc2ggcmVzdWx0cyAqLwotICAgIGlmIChyYyA+IDApIHsKLSAgICAgICAgcmMgPSAwOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmZkOyBpKyspIHsKLSAgICAgICAgICAgIG9rID0gMDsKLSAgICAgICAgICAgIHBmZFtpXS5yZXZlbnRzID0gMDsKLSAgICAgICAgICAgIGlmIChwZmRbaV0uZmQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgLyogc3VwcG9ydCBmb3IgUE9MTE5WQUwgKi8KLSAgICAgICAgICAgICAgICBwZmRbaV0ucmV2ZW50cyB8PSBQT0xMTlZBTDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChGRF9JU1NFVChwZmRbaV0uZmQsICZyZmRzKSkgewotICAgICAgICAgICAgICAgIHBmZFtpXS5yZXZlbnRzIHw9IFBPTExJTjsKLSAgICAgICAgICAgICAgICBvaysrOwotICAgICAgICAgICAgICAgIC8qIHN1cHBvcnQgZm9yIFBPTExIVVAgKi8KLSAgICAgICAgICAgICAgICBpZiAocmVjdihwZmRbaV0uZmQsIGRhdGEsIDAsIDApID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggICBlcnJubyA9PSBFU0hVVERPV04gICAgfHwgZXJybm8gPT0gRUNPTk5SRVNFVAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgZXJybm8gPT0gRUNPTk5BQk9SVEVEIHx8IGVycm5vID09IEVORVRSRVNFVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGZkW2ldLnJldmVudHMgJj0gfihQT0xMSU4pOwotICAgICAgICAgICAgICAgICAgICAgICAgcGZkW2ldLnJldmVudHMgfD0gUE9MTEhVUDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9rLS07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoRkRfSVNTRVQocGZkW2ldLmZkLCAmd2ZkcykpIHsKLSAgICAgICAgICAgICAgICBwZmRbaV0ucmV2ZW50cyB8PSBQT0xMT1VUOwotICAgICAgICAgICAgICAgIG9rKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoRkRfSVNTRVQocGZkW2ldLmZkLCAmZWZkcykpIHsKLSAgICAgICAgICAgICAgICBwZmRbaV0ucmV2ZW50cyB8PSBQT0xMUFJJOwotICAgICAgICAgICAgICAgIG9rKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob2spCi0gICAgICAgICAgICAgICAgcmMrKzsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmM7Ci19Ci0KZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vbXBtdF9iZW9zL3BvbGwuaCBiL3NlcnZlci9tcG0vbXBtdF9iZW9zL3BvbGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdjODgyZS4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL21wbXRfYmVvcy9wb2xsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk5IFJhbGYgUy4gRW5nZWxzY2hhbGwuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgUkFMRiBTLiBFTkdFTFNDSEFMTCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgUkFMRiBTLiBFTkdFTFNDSEFMTCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0KLSNpZm5kZWYgX1BPTExfSF8KLSNkZWZpbmUgX1BPTExfSF8KLQotI2RlZmluZSBMSUJQT0xMX1ZFUlNJT04gMTk5OTA4MTIKLQotI2lmbmRlZiBQT0xMSU4KLSNkZWZpbmUgUE9MTElOICAgICAgMHgwMDAxICAgICAgLyogYW55IHJlYWRhYmxlIGRhdGEgYXZhaWxhYmxlICovCi0jZW5kaWYKLSNpZm5kZWYgUE9MTFBSSQotI2RlZmluZSBQT0xMUFJJICAgICAweDAwMDIgICAgICAvKiBPT0IvVXJnZW50IHJlYWRhYmxlIGRhdGEgKi8KLSNlbmRpZgotI2lmbmRlZiBQT0xMT1VUCi0jZGVmaW5lIFBPTExPVVQgICAgIDB4MDAwNCAgICAgIC8qIGZpbGUgZGVzY3JpcHRvciBpcyB3cml0ZWFibGUgKi8KLSNlbmRpZgotCi0jaWZuZGVmIFBPTExFUlIKLSNkZWZpbmUgUE9MTEVSUiAgICAgMHgwMDA4ICAgICAgLyogc29tZSBwb2xsIGVycm9yIG9jY3VycmVkICovCi0jZW5kaWYKLSNpZm5kZWYgUE9MTEhVUAotI2RlZmluZSBQT0xMSFVQICAgICAweDAwMTAgICAgICAvKiBmaWxlIGRlc2NyaXB0b3Igd2FzICJodW5nIHVwIiAqLwotI2VuZGlmCi0jaWZuZGVmIFBPTExOVkFMCi0jZGVmaW5lIFBPTExOVkFMICAgIDB4MDAyMCAgICAgIC8qIHJlcXVlc3RlZCBldmVudHMgImludmFsaWQiICovCi0jZW5kaWYKLQotI2lmbmRlZiBQT0xMUkROT1JNCi0jZGVmaW5lIFBPTExSRE5PUk0gIFBPTExJTgotI2VuZGlmCi0jaWZuZGVmIFBPTExSREJBTkQKLSNkZWZpbmUgUE9MTFJEQkFORCAgUE9MTElOCi0jZW5kaWYKLSNpZm5kZWYgUE9MTFdSTk9STQotI2RlZmluZSBQT0xMV1JOT1JNICBQT0xMT1VUCi0jZW5kaWYKLSNpZm5kZWYgUE9MTFdSQkFORAotI2RlZmluZSBQT0xMV1JCQU5EICBQT0xMT1VUCi0jZW5kaWYKLQotI2lmbmRlZiBJTkZUSU0KLSNkZWZpbmUgSU5GVElNICAgICAgKC0xKQotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotc3RydWN0IHBvbGxmZCB7Ci0gICAgaW50IGZkOyAgICAgICAgICAgICAgICAgICAgIC8qIHdoaWNoIGZpbGUgZGVzY3JpcHRvciB0byBwb2xsICovCi0gICAgc2hvcnQgZXZlbnRzOyAgICAgICAgICAgICAgIC8qIGV2ZW50cyB3ZSBhcmUgaW50ZXJlc3RlZCBpbiAqLwotICAgIHNob3J0IHJldmVudHM7ICAgICAgICAgICAgICAvKiBldmVudHMgZm91bmQgb24gcmV0dXJuICovCi19OwotCi1pbnQgcG9sbChzdHJ1Y3QgcG9sbGZkICosIHVuc2lnbmVkIGludCwgaW50KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9QT0xMX0hfICovCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL21wbXRfYmVvcy9zY29yZWJvYXJkLmMgYi9zZXJ2ZXIvbXBtL21wbXRfYmVvcy9zY29yZWJvYXJkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZGZjZGQuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9tcG10X2Jlb3Mvc2NvcmVib2FyZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJtcG1fc3RhdHVzLmgiCi0jaW5jbHVkZSAiYmVvc2QuaCIKLSNpbmNsdWRlICJodHRwX2NvbmZfZ2xvYmFscy5oIgotI2luY2x1ZGUgIm1wbXRfYmVvcy5oIgotI2luY2x1ZGUgInNjb3JlYm9hcmQuaCIKLQotc2NvcmVib2FyZCAqYXBfc2NvcmVib2FyZF9pbWFnZSA9IE5VTEw7Ci1leHRlcm4gYXBfY29udGV4dF90ICogcGNvbmY7Ci1zdGF0aWMgaW50IG1haW50YWluX2Nvbm5lY3Rpb25fc3RhdHVzID0gMTsKLQotdm9pZCByZWluaXRfc2NvcmVib2FyZChhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgYXBfYXNzZXJ0KCFhcF9zY29yZWJvYXJkX2ltYWdlKTsKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlID0gKHNjb3JlYm9hcmQgKikgbWFsbG9jKFNDT1JFQk9BUkRfU0laRSk7Ci0gICAgaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UgPT0gTlVMTCkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIk91Y2ghIE91dCBvZiBtZW1vcnkgcmVpbml0aW5nIHNjb3JlYm9hcmQhIik7Ci0gICAgfQotICAgIG1lbXNldChhcF9zY29yZWJvYXJkX2ltYWdlLCAwLCBTQ09SRUJPQVJEX1NJWkUpOwotfQotCi12b2lkIGNsZWFudXBfc2NvcmVib2FyZCh2b2lkKQotewotICAgIGFwX2Fzc2VydChhcF9zY29yZWJvYXJkX2ltYWdlKTsKLSAgICBmcmVlKGFwX3Njb3JlYm9hcmRfaW1hZ2UpOwotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UgPSBOVUxMOwotfQotCi1BUElfRVhQT1JUKGludCkgYXBfZXhpc3RzX3Njb3JlYm9hcmRfaW1hZ2Uodm9pZCkKLXsKLSAgICByZXR1cm4gKGFwX3Njb3JlYm9hcmRfaW1hZ2UgPyAxIDogMCk7Ci19Ci0KLQotdm9pZCBhcF91cGRhdGVfY29ubmVjdGlvbl9zdGF0dXMobG9uZyBjb25uX2lkLCBjb25zdCBjaGFyICprZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSkKLXsKLSAgICBpbnQgaSA9IDA7Ci0gICAgc3RhdHVzX3RhYmxlX2VudHJ5ICpzczsKLQotICAgIGlmICghbWFpbnRhaW5fY29ubmVjdGlvbl9zdGF0dXMpIHJldHVybjsKLSAgICB3aGlsZSAoaSA8IFNUQVRVU0VTX1BFUl9DT05ORUNUSU9OKSB7Ci0gICAgICAgIHNzID0gJihhcF9zY29yZWJvYXJkX2ltYWdlLT50YWJsZVtjb25uX2lkXVtpXSk7Ci0gICAgICAgIGlmIChzcy0+a2V5WzBdID09ICdcMCcpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICgwID09IHN0cmNtcChzcy0+a2V5LCBrZXkpKSB7Ci0gICAgICAgICAgICBhcF9jcHlzdHJuKHNzLT52YWx1ZSwgdmFsdWUsIFZBTFVFX0xFTkdUSCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQlpKys7Ci0gICAgfQotICAgIGlmIChpID49IFNUQVRVU0VTX1BFUl9DT05ORUNUSU9OKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYXBfY3B5c3Rybihzcy0+a2V5LCBrZXksIEtFWV9MRU5HVEgpOwotICAgIGFwX2NweXN0cm4oc3MtPnZhbHVlLCB2YWx1ZSwgVkFMVUVfTEVOR1RIKTsKLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgYXBfcmVzZXRfY29ubmVjdGlvbl9zdGF0dXMobG9uZyBjb25uX2lkKQotewotICAgIGlmIChtYWludGFpbl9jb25uZWN0aW9uX3N0YXR1cykgewotICAgICAgICBhcF9tcG10X2Jlb3NfZm9yY2VfcmVzZXRfY29ubmVjdGlvbl9zdGF0dXMoY29ubl9pZCk7Ci0gICAgfQotfQotCi12b2lkIGFwX21wbXRfYmVvc19zZXRfbWFpbnRhaW5fY29ubmVjdGlvbl9zdGF0dXMoaW50IGZsYWcpIHsKLSAgICBtYWludGFpbl9jb25uZWN0aW9uX3N0YXR1cyA9IGZsYWc7Ci0gICAgcmV0dXJuOwotfQotCi12b2lkIGFwX21wbXRfYmVvc19mb3JjZV9yZXNldF9jb25uZWN0aW9uX3N0YXR1cyhsb25nIGNvbm5faWQpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgU1RBVFVTRVNfUEVSX0NPTk5FQ1RJT047IGkrKykgewotICAgICAgICBhcF9zY29yZWJvYXJkX2ltYWdlLT50YWJsZVtjb25uX2lkXVtpXS5rZXlbMF0gPSAnXDAnOwotICAgIH0KLX0KLQotY29uc3QgY2hhciAqYXBfZ2V0X2Nvbm5lY3Rpb25fc3RhdHVzKGxvbmcgY29ubl9pZCwgY29uc3QgY2hhciAqa2V5KQotewotICAgIGludCBpID0gMDsKLSAgICBzdGF0dXNfdGFibGVfZW50cnkgKnNzOwotCi0gICAgaWYgKCFtYWludGFpbl9jb25uZWN0aW9uX3N0YXR1cykgcmV0dXJuICIiOwotICAgIHdoaWxlIChpIDwgU1RBVFVTRVNfUEVSX0NPTk5FQ1RJT04pIHsKLSAgICAgICAgc3MgPSAmKGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnRhYmxlW2Nvbm5faWRdW2ldKTsKLSAgICAgICAgaWYgKHNzLT5rZXlbMF0gPT0gJ1wwJykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKDAgPT0gc3RyY21wKHNzLT5rZXksIGtleSkpIHsKLSAgICAgICAgICAgIHJldHVybiBzcy0+dmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotYXBfYXJyYXlfaGVhZGVyX3QgKmFwX2dldF9jb25uZWN0aW9ucyhhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgaW50IGk7Ci0gICAgYXBfYXJyYXlfaGVhZGVyX3QgKmNvbm5lY3Rpb25fbGlzdDsKLSAgICBsb25nICphcnJheV9zbG90OwotCi0gICAgY29ubmVjdGlvbl9saXN0ID0gYXBfbWFrZV9hcnJheShwLCAwLCBzaXplb2YobG9uZykpOwotICAgIGZvciAoaSA9IDA7IGkgPCBtYXhfZGFlbW9uc19saW1pdCpIQVJEX1RIUkVBRF9MSU1JVDsgaSsrKSB7Ci0JaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnRhYmxlW2ldWzBdLmtleVswXSAhPSAnXDAnKSB7Ci0gICAgICAgICAgICBhcnJheV9zbG90ID0gYXBfcHVzaF9hcnJheShjb25uZWN0aW9uX2xpc3QpOwotICAgICAgICAgICAgKmFycmF5X3Nsb3QgPSBpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjb25uZWN0aW9uX2xpc3Q7Ci19Ci0KLWFwX2FycmF5X2hlYWRlcl90ICphcF9nZXRfY29ubmVjdGlvbl9rZXlzKGFwX2NvbnRleHRfdCAqcCwgbG9uZyBjb25uX2lkKQotewotICAgIGludCBpID0gMDsKLSAgICBzdGF0dXNfdGFibGVfZW50cnkgKnNzOwotICAgIGFwX2FycmF5X2hlYWRlcl90ICprZXlfbGlzdDsKLSAgICBjaGFyICoqYXJyYXlfc2xvdDsKLQotICAgIGtleV9saXN0ID0gYXBfbWFrZV9hcnJheShwLCAwLCBLRVlfTEVOR1RIICogc2l6ZW9mKGNoYXIpKTsKLSAgICB3aGlsZSAoaSA8IFNUQVRVU0VTX1BFUl9DT05ORUNUSU9OKSB7Ci0gICAgICAgIHNzID0gJihhcF9zY29yZWJvYXJkX2ltYWdlLT50YWJsZVtjb25uX2lkXVtpXSk7Ci0gICAgICAgIGlmIChzcy0+a2V5WzBdID09ICdcMCcpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGFycmF5X3Nsb3QgPSBhcF9wdXNoX2FycmF5KGtleV9saXN0KTsKLSAgICAgICAgKmFycmF5X3Nsb3QgPSBhcF9wc3RyZHVwKHAsIHNzLT5rZXkpOwotICAgICAgICBpKys7Ci0gICAgfQotICAgIHJldHVybiBrZXlfbGlzdDsKLX0KLQotYXBfYXJyYXlfaGVhZGVyX3QgKmFwX2dldF9zdGF0dXNfdGFibGUoYXBfY29udGV4dF90ICpwKQotewotICAgIGludCBpLCBqOwotICAgIGFwX2FycmF5X2hlYWRlcl90ICpzZXJ2ZXJfc3RhdHVzOwotICAgIGFwX3N0YXR1c190YWJsZV9yb3dfdCAqYXJyYXlfc2xvdDsKLSAgICBzdGF0dXNfdGFibGVfZW50cnkgKnNzOwotCi0gICAgc2VydmVyX3N0YXR1cyA9IGFwX21ha2VfYXJyYXkocCwgMCwgc2l6ZW9mKGFwX3N0YXR1c190YWJsZV9yb3dfdCkpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG1heF9kYWVtb25zX2xpbWl0KkhBUkRfVEhSRUFEX0xJTUlUOyBpKyspIHsKLQlpZiAoYXBfc2NvcmVib2FyZF9pbWFnZS0+dGFibGVbaV1bMF0ua2V5WzBdID09ICdcMCcpCi0JICAgIGNvbnRpbnVlOwotICAgICAgICBhcnJheV9zbG90ID0gYXBfcHVzaF9hcnJheShzZXJ2ZXJfc3RhdHVzKTsKLSAgICAgICAgYXJyYXlfc2xvdC0+ZGF0YSA9IGFwX21ha2VfdGFibGUocCwgMCk7Ci0gICAgICAgIGFycmF5X3Nsb3QtPmNvbm5faWQgPSBpOwotICAgICAgICAKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IFNUQVRVU0VTX1BFUl9DT05ORUNUSU9OOyBqKyspIHsKLQkgICAgc3MgPSAmKGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnRhYmxlW2ldW2pdKTsKLSAgICAgICAgICAgIGlmIChzcy0+a2V5WzBdICE9ICdcMCcpIHsKLSAgICAgICAgICAgICAgICBhcF90YWJsZV9hZGQoYXJyYXlfc2xvdC0+ZGF0YSwgc3MtPmtleSwgc3MtPnZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzZXJ2ZXJfc3RhdHVzOwotfQpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9tcG10X2Jlb3Mvc2NvcmVib2FyZC5oIGIvc2VydmVyL21wbS9tcG10X2Jlb3Mvc2NvcmVib2FyZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGFhYjVhLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vbXBtdF9iZW9zL3Njb3JlYm9hcmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLSNpZm5kZWYgTVBNVF9CRU9TX1NDT1JFQk9BUkRfSAotI2RlZmluZSBNUE1UX0JFT1NfU0NPUkVCT0FSRF9ICi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotI2luY2x1ZGUgPHN5cy90aW1lcy5oPgotI2luY2x1ZGUgIm1wbV9kZWZhdWx0LmgiCS8qIEZvciBIQVJEXy4qX0xJTUlUICovCi0KLUFQSV9FWFBPUlQoaW50KSBhcF9leGlzdHNfc2NvcmVib2FyZF9pbWFnZSh2b2lkKTsKLXZvaWQgcmVpbml0X3Njb2FyZWJvYXJkKGFwX2NvbnRleHRfdCAqcCk7Ci12b2lkIGNsZWFudXBfc2NvcmVib2FyZCh2b2lkKTsKLXZvaWQgYXBfbXBtdF9iZW9zX3NldF9tYWludGFpbl9jb25uZWN0aW9uX3N0YXR1cyhpbnQgZmxhZyk7Ci12b2lkIGFwX21wbXRfYmVvc19mb3JjZV9yZXNldF9jb25uZWN0aW9uX3N0YXR1cyhsb25nIGNvbm5faWQpOwotdm9pZCByZWluaXRfc2NvcmVib2FyZChhcF9jb250ZXh0X3QgKnApOwotdm9pZCB1cGRhdGVfc2NvcmVib2FyZF9nbG9iYWwodm9pZCk7Ci1BUElfRVhQT1JUKGludCkgZmluZF9jaGlsZF9ieV9waWQoaW50IHBpZCk7Ci1pbnQgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhpbnQgY2hpbGRfbnVtLCBpbnQgdGhyZWFkX251bSwgaW50IHN0YXR1cywgcmVxdWVzdF9yZWMgKnIpOwotdm9pZCBhcF90aW1lX3Byb2Nlc3NfcmVxdWVzdChpbnQgY2hpbGRfbnVtLCBpbnQgdGhyZWFkX251bSwgaW50IHN0YXR1cyk7Ci0KLS8qIEFkZCBzdXBwb3J0IGZvciBjb25uZWN0aW9uIHRhYmxlIGZ1bmN0aW9ucyAqLwotCi0jZGVmaW5lIEtFWV9MRU5HVEggMTYKLSNkZWZpbmUgVkFMVUVfTEVOR1RIIDY0Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjaGFyIGtleVtLRVlfTEVOR1RIXTsKLSAgICBjaGFyIHZhbHVlW1ZBTFVFX0xFTkdUSF07Ci19IHN0YXR1c190YWJsZV9lbnRyeTsKLQotI2RlZmluZSBTVEFUVVNFU19QRVJfQ09OTkVDVElPTiAxMAotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgc3RhdHVzX3RhYmxlX2VudHJ5Ci0gICAgICAgIHRhYmxlW0hBUkRfU0VSVkVSX0xJTUlUKkhBUkRfVEhSRUFEX0xJTUlUXVtTVEFUVVNFU19QRVJfQ09OTkVDVElPTl07Ci19IHNjb3JlYm9hcmQ7Ci0KLSNkZWZpbmUgU0NPUkVCT0FSRF9TSVpFCQlzaXplb2Yoc2NvcmVib2FyZCkKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCS8qICFNUE1UX0JFT1NfU0NPUkVCT0FSRF9IICovCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL21wbXRfcHRocmVhZC8uY3ZzaWdub3JlIGIvc2VydmVyL21wbS9tcG10X3B0aHJlYWQvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkZjI1Ny4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL21wbXRfcHRocmVhZC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0uZGVwcwotLmxpYnMKLSoubG8KLSoubGEKLU1ha2VmaWxlCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL21wbXRfcHRocmVhZC9NYWtlZmlsZS5pbiBiL3NlcnZlci9tcG0vbXBtdF9wdGhyZWFkL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmU2ZDUzLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vbXBtdF9wdGhyZWFkL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCi1ERVBUSCAgICAgPSAuLi8uLi8uLgotdG9wc3JjZGlyID0gQHRvcHNyY2RpckAKLXNyY2RpciAgICA9IEBzcmNkaXJACi1WUEFUSCAgICAgPSBAc3JjZGlyQAotCi1MVExJQlJBUllfTkFNRSAgICA9IGxpYm1wbXRfcHRocmVhZC5sYQotTFRMSUJSQVJZX1NPVVJDRVMgPSBtcG10X3B0aHJlYWQuYyBzY29yZWJvYXJkLmMKLQotaW5jbHVkZSAkKHRvcHNyY2RpcikvYnVpbGQvbHRsaWIubWsKZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vbXBtdF9wdGhyZWFkL01ha2VmaWxlLmxpYmRpciBiL3NlcnZlci9tcG0vbXBtdF9wdGhyZWFkL01ha2VmaWxlLmxpYmRpcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1MjU0MC4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL21wbXRfcHRocmVhZC9NYWtlZmlsZS5saWJkaXIKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVRoaXMgaXMgYSBwbGFjZS1ob2xkZXIgd2hpY2ggaW5kaWNhdGVzIHRvIENvbmZpZ3VyZSB0aGF0IGl0IHNob3VsZG4ndAotcHJvdmlkZSB0aGUgZGVmYXVsdCB0YXJnZXRzIHdoZW4gYnVpbGRpbmcgdGhlIE1ha2VmaWxlIGluIHRoaXMgZGlyZWN0b3J5LgotSW5zdGVhZCBpdCdsbCBqdXN0IHByZXBlbmQgYWxsIHRoZSBpbXBvcnRhbnQgdmFyaWFibGUgZGVmaW5pdGlvbnMsIGFuZAotY29weSB0aGUgTWFrZWZpbGUudG1wbCBvbnRvIHRoZSBlbmQuCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL21wbXRfcHRocmVhZC9jb25maWcubTQgYi9zZXJ2ZXIvbXBtL21wbXRfcHRocmVhZC9jb25maWcubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NWQyNTcuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9tcG10X3B0aHJlYWQvY29uZmlnLm00CisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotZG5sICMjIFhYWCAtIE5lZWQgYSBtb3JlIHRob3JvdWdoIGNoZWNrIG9mIHRoZSBwcm9wZXIgZmxhZ3MgdG8gdXNlCi0KLWlmIHRlc3QgIiRNUE1fTkFNRSIgPSAibXBtdF9wdGhyZWFkIiA7IHRoZW4KLSAgICBhY19jdl9lbmFibGVfdGhyZWFkcz0ieWVzIgotICAgIEFDX0NBQ0hFX1NBVkUKLQotICAgIEFQQUNIRV9GQVNUX09VVFBVVChtb2R1bGVzL21wbS8kTVBNX05BTUUvTWFrZWZpbGUpCi0KLSAgICBBUEFDSEVfTVBNX1BUSFJFQUQKLSAgICBBUEFDSEVfTVBNX0NIRUNLX1NITUVNCi0KLWRubCBPYnNvbGV0ZSBzY29yZWJvYXJkIGNvZGUgdXNlcyB0aGlzLgotICAgIEFDX0NIRUNLX0hFQURFUlMoc3lzL3RpbWVzLmgpCi0gICAgQUNfQ0hFQ0tfRlVOQ1ModGltZXMpCi1maQpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9tcG10X3B0aHJlYWQvbXBtX2RlZmF1bHQuaCBiL3NlcnZlci9tcG0vbXBtdF9wdGhyZWFkL21wbV9kZWZhdWx0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NWVmZDUuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9tcG10X3B0aHJlYWQvbXBtX2RlZmF1bHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyAKLSAqIGFyZSBtZXQ6IAotICogCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gIAotICogCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCAKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAKLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgCi0gKiAgICBkaXN0cmlidXRpb24uIAotICogCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogCi0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwIAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIgCi0gKiAKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8gCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgCi0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4gCi0gKiAKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiIAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLiAKLSAqIAotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZyAKLSAqICAgIGFja25vd2xlZGdtZW50OiAKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAgCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIiAKLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZIAotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SIAotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCAKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCAKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyAKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIAotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCAKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAotICogCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueSAKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZCAKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciAKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4gCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIAotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uIAotICogCi0gKi8gCi0KLSNpZm5kZWYgQVBBQ0hFX01QTV9ERUZBVUxUX0gKLSNkZWZpbmUgQVBBQ0hFX01QTV9ERUZBVUxUX0gKLQotLyogTnVtYmVyIG9mIHNlcnZlcnMgdG8gc3Bhd24gb2ZmIGJ5IGRlZmF1bHQgLS0tIGFsc28sIGlmIGZld2VyIHRoYW4KLSAqIHRoaXMgZnJlZSB3aGVuIHRoZSBjYXJldGFrZXIgY2hlY2tzLCBpdCB3aWxsIHNwYXduIG1vcmUuCi0gKi8KLSNpZm5kZWYgREVGQVVMVF9TVEFSVF9EQUVNT04KLSNkZWZpbmUgREVGQVVMVF9TVEFSVF9EQUVNT04gNQotI2VuZGlmCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mICpmcmVlKiBzZXJ2ZXIgcHJvY2Vzc2VzIC0tLSBtb3JlIHRoYW4gdGhpcywgYW5kCi0gKiB0aGV5IHdpbGwgZGllIG9mZi4KLSAqLwotCi0jaWZuZGVmIERFRkFVTFRfTUFYX0ZSRUVfREFFTU9OCi0jZGVmaW5lIERFRkFVTFRfTUFYX0ZSRUVfREFFTU9OIDEwCi0jZW5kaWYKLQotLyogTWluaW11bSAtLS0gZmV3ZXIgdGhhbiB0aGlzLCBhbmQgbW9yZSB3aWxsIGJlIGNyZWF0ZWQgKi8KLQotI2lmbmRlZiBERUZBVUxUX01JTl9GUkVFX0RBRU1PTgotI2RlZmluZSBERUZBVUxUX01JTl9GUkVFX0RBRU1PTiA1Ci0jZW5kaWYKLQotLyogTGltaXQgb24gdGhlIHRvdGFsIC0tLSBjbGllbnRzIHdpbGwgYmUgbG9ja2VkIG91dCBpZiBtb3JlIHNlcnZlcnMgdGhhbgotICogdGhpcyBhcmUgbmVlZGVkLiAgSXQgaXMgaW50ZW5kZWQgc29sZWx5IHRvIGtlZXAgdGhlIHNlcnZlciBmcm9tIGNyYXNoaW5nCi0gKiB3aGVuIHRoaW5ncyBnZXQgb3V0IG9mIGhhbmQuCi0gKgotICogV2Uga2VlcCBhIGhhcmQgbWF4aW11bSBudW1iZXIgb2Ygc2VydmVycywgZm9yIHR3byByZWFzb25zIC0tLSBmaXJzdCBvZmYsCi0gKiBpbiBjYXNlIHNvbWV0aGluZyBnb2VzIHNlcmlvdXNseSB3cm9uZywgd2Ugd2FudCB0byBzdG9wIHRoZSBmb3JrIGJvbWIKLSAqIHNob3J0IG9mIGFjdHVhbGx5IGNyYXNoaW5nIHRoZSBtYWNoaW5lIHdlJ3JlIHJ1bm5pbmcgb24gYnkgZmlsbGluZyBzb21lCi0gKiBrZXJuZWwgdGFibGUuICBTZWNvbmRseSwgaXQga2VlcHMgdGhlIHNpemUgb2YgdGhlIHNjb3JlYm9hcmQgZmlsZSBzbWFsbAotICogZW5vdWdoIHRoYXQgd2UgY2FuIHJlYWQgdGhlIHdob2xlIHRoaW5nIHdpdGhvdXQgd29ycnlpbmcgdG9vIG11Y2ggYWJvdXQKLSAqIHRoZSBvdmVyaGVhZC4KLSAqLwotI2lmZGVmIE5PX1RIUkVBRFMKLSNkZWZpbmUgSEFSRF9TRVJWRVJfTElNSVQgMjU2Ci0jZW5kaWYKLSNpZm5kZWYgSEFSRF9TRVJWRVJfTElNSVQKLSNkZWZpbmUgSEFSRF9TRVJWRVJfTElNSVQgOCAKLSNlbmRpZgotCi0vKiBMaW1pdCBvbiB0aGUgdGhyZWFkcyBwZXIgcHJvY2Vzcy4gIENsaWVudHMgd2lsbCBiZSBsb2NrZWQgb3V0IGlmIG1vcmUgdGhhbgotICogdGhpcyAgKiBIQVJEX1NFUlZFUl9MSU1JVCBhcmUgbmVlZGVkLgotICoKLSAqIFdlIGtlZXAgdGhpcyBmb3Igb25lIHJlYXNvbiBpdCBrZWVwcyB0aGUgc2l6ZSBvZiB0aGUgc2NvcmVib2FyZCBmaWxlIHNtYWxsCi0gKiBlbm91Z2ggdGhhdCB3ZSBjYW4gcmVhZCB0aGUgd2hvbGUgdGhpbmcgd2l0aG91dCB3b3JyeWluZyB0b28gbXVjaCBhYm91dAotICogdGhlIG92ZXJoZWFkLgotICovCi0jaWZkZWYgTk9fVEhSRUFEUwotI2RlZmluZSBIQVJEX1RIUkVBRF9MSU1JVCAxCi0jZW5kaWYKLSNpZm5kZWYgSEFSRF9USFJFQURfTElNSVQKLSNkZWZpbmUgSEFSRF9USFJFQURfTElNSVQgNjQgCi0jZW5kaWYKLQotI2lmZGVmIE5PX1RIUkVBRFMKLSNkZWZpbmUgREVGQVVMVF9USFJFQURTX1BFUl9DSElMRCAxCi0jZW5kaWYKLSNpZm5kZWYgREVGQVVMVF9USFJFQURTX1BFUl9DSElMRAotI2RlZmluZSBERUZBVUxUX1RIUkVBRFNfUEVSX0NISUxEIDUwCi0jZW5kaWYKLQotLyogRmlsZSB1c2VkIGZvciBhY2NlcHQgbG9ja2luZywgd2hlbiB3ZSB1c2UgYSBmaWxlICovCi0jaWZuZGVmIERFRkFVTFRfTE9DS0ZJTEUKLSNkZWZpbmUgREVGQVVMVF9MT0NLRklMRSAibG9ncy9hY2NlcHQubG9jayIKLSNlbmRpZgotCi0vKiBTY29yZWJvYXJkIGZpbGUsIGlmIHRoZXJlIGlzIG9uZSAqLwotI2lmbmRlZiBERUZBVUxUX1NDT1JFQk9BUkQKLSNkZWZpbmUgREVGQVVMVF9TQ09SRUJPQVJEICJsb2dzL2FwYWNoZV9ydW50aW1lX3N0YXR1cyIKLSNlbmRpZgotCi0vKiBXaGVyZSB0aGUgbWFpbi9wYXJlbnQgcHJvY2VzcydzIHBpZCBpcyBsb2dnZWQgKi8KLSNpZm5kZWYgREVGQVVMVF9QSURMT0cKLSNkZWZpbmUgREVGQVVMVF9QSURMT0cgImxvZ3MvaHR0cGQucGlkIgotI2VuZGlmCi0KLS8qCi0gKiBJbnRlcnZhbCwgaW4gbWljcm9zZWNvbmRzLCBiZXR3ZWVuIHNjb3JlYm9hcmQgbWFpbnRlbmFuY2UuCi0gKi8KLSNpZm5kZWYgU0NPUkVCT0FSRF9NQUlOVEVOQU5DRV9JTlRFUlZBTAotI2RlZmluZSBTQ09SRUJPQVJEX01BSU5URU5BTkNFX0lOVEVSVkFMIDEwMDAwMDAKLSNlbmRpZgotCi0vKiBOdW1iZXIgb2YgcmVxdWVzdHMgdG8gdHJ5IHRvIGhhbmRsZSBpbiBhIHNpbmdsZSBwcm9jZXNzLiAgSWYgPD0gMCwKLSAqIHRoZSBjaGlsZHJlbiBkb24ndCBkaWUgb2ZmLgotICovCi0jaWZuZGVmIERFRkFVTFRfTUFYX1JFUVVFU1RTX1BFUl9DSElMRAotI2RlZmluZSBERUZBVUxUX01BWF9SRVFVRVNUU19QRVJfQ0hJTEQgMTAwMDAKLSNlbmRpZgotCi0jZW5kaWYgLyogQVBfTVBNX0RFRkFVTFRfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9tcG10X3B0aHJlYWQvbXBtdF9wdGhyZWFkLmMgYi9zZXJ2ZXIvbXBtL21wbXRfcHRocmVhZC9tcG10X3B0aHJlYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIyOTEzNC4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL21wbXRfcHRocmVhZC9tcG10X3B0aHJlYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MzMgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCi0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgCi0gKiBhcmUgbWV0OiAKLSAqIAotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgCi0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuICAKLSAqIAotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgCi0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIAotICogICAgZGlzdHJpYnV0aW9uLiAKLSAqIAotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIAotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6IAotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cCAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iIAotICogCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvIAotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCi0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuIAotICogCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiAKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4gCi0gKiAKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcgCi0gKiAgICBhY2tub3dsZWRnbWVudDogCi0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwIAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIgCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWSAKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUiAKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCi0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSAKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCAKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKLSAqIAotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkgCi0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQgCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uIAotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlciAKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LiAKLSAqIAotICovIAotIAotI2RlZmluZSBDT1JFX1BSSVZBVEUgCi0gCi0jaW5jbHVkZSAiYXByX3BvcnRhYmxlLmgiCi0jaW5jbHVkZSAiYXByX3RocmVhZF9wcm9jLmgiCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cGQuaCIgCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiIAotI2luY2x1ZGUgImh0dHBfbG9nLmgiIAotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCS8qIGZvciByZWFkX2NvbmZpZyAqLyAKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIJCS8qIGZvciBnZXRfcmVtb3RlX2hvc3QgKi8gCi0jaW5jbHVkZSAiaHR0cF9jb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAiYXBfbXBtLmgiCi0jaW5jbHVkZSAidW5peGQuaCIKLSNpbmNsdWRlICJpb2xfc29ja2V0LmgiCi0jaW5jbHVkZSAiYXBfbGlzdGVuLmgiCi0jaW5jbHVkZSAic2NvcmVib2FyZC5oIiAKLQotI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+IAotI2luY2x1ZGUgPHN5cy93YWl0Lmg+IAotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotLyoKLSAqIEFjdHVhbCBkZWZpbml0aW9ucyBvZiBjb25maWcgZ2xvYmFscwotICovCi0KLWludCBhcF90aHJlYWRzX3Blcl9jaGlsZD0wOyAgICAgICAgIC8qIFdvcmtlciB0aHJlYWRzIHBlciBjaGlsZCAqLwotaW50IGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQ9MDsKLXN0YXRpYyBjaGFyICphcF9waWRfZm5hbWU9TlVMTDsKLXN0YXRpYyBjaGFyICphcF9zY29yZWJvYXJkX2ZuYW1lPU5VTEw7Ci1zdGF0aWMgaW50IGFwX2RhZW1vbnNfdG9fc3RhcnQ9MDsKLXN0YXRpYyBpbnQgbWluX3NwYXJlX3RocmVhZHM9MDsKLXN0YXRpYyBpbnQgbWF4X3NwYXJlX3RocmVhZHM9MDsKLXN0YXRpYyBpbnQgYXBfZGFlbW9uc19saW1pdD0wOwotc3RhdGljIHRpbWVfdCBhcF9yZXN0YXJ0X3RpbWU9MDsKLUFQSV9WQVJfRVhQT1JUIGludCBhcF9leHRlbmRlZF9zdGF0dXMgPSAwOwotc3RhdGljIGludCB3b3JrZXJzX21heV9leGl0ID0gMDsKLXN0YXRpYyBpbnQgcmVxdWVzdHNfdGhpc19jaGlsZDsKLXN0YXRpYyBpbnQgbnVtX2xpc3RlbnNvY2tzID0gMDsKLXN0YXRpYyBhcF9zb2NrZXRfdCAqKmxpc3RlbnNvY2tzOwotCi0vKiBUaGUgc3RydWN0dXJlIHVzZWQgdG8gcGFzcyB1bmlxdWUgaW5pdGlhbGl6YXRpb24gaW5mbyB0byBlYWNoIHRocmVhZCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCBwaWQ7Ci0gICAgaW50IHRpZDsKLSAgICBpbnQgc2Q7Ci0gICAgYXBfY29udGV4dF90ICp0cG9vbDsgLyogInB0aHJlYWQiIHdvdWxkIGJlIGNvbmZ1c2luZyAqLwotfSBwcm9jX2luZm87Ci0KLS8qCi0gKiBUaGUgbWF4IGNoaWxkIHNsb3QgZXZlciBhc3NpZ25lZCwgcHJlc2VydmVkIGFjcm9zcyByZXN0YXJ0cy4gIE5lY2Vzc2FyeQotICogdG8gZGVhbCB3aXRoIE1heENsaWVudHMgY2hhbmdlcyBhY3Jvc3MgU0lHV0lOQ0ggcmVzdGFydHMuICBXZSB1c2UgdGhpcwotICogdmFsdWUgdG8gb3B0aW1pemUgcm91dGluZXMgdGhhdCBoYXZlIHRvIHNjYW4gdGhlIGVudGlyZSBzY29yZWJvYXJkLgotICovCi1zdGF0aWMgaW50IG1heF9kYWVtb25zX2xpbWl0ID0gLTE7Ci0KLXN0YXRpYyBjaGFyIGFwX2NvcmVkdW1wX2RpcltNQVhfU1RSSU5HX0xFTl07Ci0KLXN0YXRpYyBpbnQgcGlwZV9vZl9kZWF0aFsyXTsKLXN0YXRpYyBwdGhyZWFkX211dGV4X3QgcGlwZV9vZl9kZWF0aF9tdXRleDsKLQotLyogKk5vbiotc2hhcmVkIGh0dHBfbWFpbiBnbG9iYWxzLi4uICovCi0KLXN0YXRpYyBzZXJ2ZXJfcmVjICpzZXJ2ZXJfY29uZjsKLQotLyogb25lX3Byb2Nlc3MgLS0tIGRlYnVnZ2luZyBtb2RlIHZhcmlhYmxlOyBjYW4gYmUgc2V0IGZyb20gdGhlIGNvbW1hbmQgbGluZQotICogd2l0aCB0aGUgLVggZmxhZy4gIElmIHNldCwgdGhpcyBnZXRzIHlvdSB0aGUgY2hpbGRfbWFpbiBsb29wIHJ1bm5pbmcKLSAqIGluIHRoZSBwcm9jZXNzIHdoaWNoIG9yaWdpbmFsbHkgc3RhcnRlZCB1cCAobm8gZGV0YWNoLCBubyBtYWtlX2NoaWxkKSwKLSAqIHdoaWNoIGlzIGEgcHJldHR5IG5pY2UgZGVidWdnaW5nIGVudmlyb25tZW50LiAgKFlvdSdsbCBnZXQgYSBTSUdIVVAKLSAqIGVhcmx5IGluIHN0YW5kYWxvbmVfbWFpbjsganVzdCBjb250aW51ZSB0aHJvdWdoLiAgVGhpcyBpcyB0aGUgc2VydmVyCi0gKiB0cnlpbmcgdG8ga2lsbCBvZmYgYW55IGNoaWxkIHByb2Nlc3NlcyB3aGljaCBpdCBtaWdodCBoYXZlIGx5aW5nCi0gKiBhcm91bmQgLS0tIEFwYWNoZSBkb2Vzbid0IGtlZXAgdHJhY2sgb2YgdGhlaXIgcGlkcywgaXQganVzdCBzZW5kcwotICogU0lHSFVQIHRvIHRoZSBwcm9jZXNzIGdyb3VwLCBpZ25vcmluZyBpdCBpbiB0aGUgcm9vdCBwcm9jZXNzLgotICogQ29udGludWUgdGhyb3VnaCBhbmQgeW91J2xsIGJlIGZpbmUuKS4KLSAqLwotCi1zdGF0aWMgaW50IG9uZV9wcm9jZXNzID0gMDsKLQotI2lmZGVmIERFQlVHX1NJR1NUT1AKLWludCByYWlzZV9zaWdzdG9wX2ZsYWdzOwotI2VuZGlmCi0KLSNpZmRlZiBIQVNfT1RIRVJfQ0hJTEQKLS8qIHVzZWQgdG8gbWFpbnRhaW4gbGlzdCBvZiBjaGlsZHJlbiB3aGljaCBhcmVuJ3QgcGFydCBvZiB0aGUgc2NvcmVib2FyZCAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3RoZXJfY2hpbGRfcmVjIG90aGVyX2NoaWxkX3JlYzsKLXN0cnVjdCBvdGhlcl9jaGlsZF9yZWMgewotICAgIG90aGVyX2NoaWxkX3JlYyAqbmV4dDsKLSAgICBpbnQgcGlkOwotICAgIHZvaWQgKCptYWludGVuYW5jZSkgKGludCwgdm9pZCAqLCBhcF93YWl0X3QpOwotICAgIHZvaWQgKmRhdGE7Ci0gICAgaW50IHdyaXRlX2ZkOwotfTsKLXN0YXRpYyBvdGhlcl9jaGlsZF9yZWMgKm90aGVyX2NoaWxkcmVuOwotI2VuZGlmCi0KLXN0YXRpYyBhcF9jb250ZXh0X3QgKnBjb25mOwkJLyogUG9vbCBmb3IgY29uZmlnIHN0dWZmICovCi1zdGF0aWMgYXBfY29udGV4dF90ICpwY2hpbGQ7CQkvKiBQb29sIGZvciBodHRwZCBjaGlsZCBzdHVmZiAqLwotCi1zdGF0aWMgaW50IG15X3BpZDsgLyogTGludXggZ2V0cGlkKCkgZG9lc24ndCB3b3JrIGV4Y2VwdCBpbiBtYWluIHRocmVhZC4gVXNlCi0gICAgICAgICAgICAgICAgICAgICAgdGhpcyBpbnN0ZWFkICovCi0vKiBLZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgY3VycmVudGx5IGFjdGl2ZSAqLwotc3RhdGljIGludCB3b3JrZXJfdGhyZWFkX2NvdW50Owotc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCB3b3JrZXJfdGhyZWFkX2NvdW50X211dGV4OwotCi0vKiBMb2NrcyBmb3IgYWNjZXB0IHNlcmlhbGl6YXRpb24gKi8KLXN0YXRpYyBwdGhyZWFkX211dGV4X3QgdGhyZWFkX2FjY2VwdF9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7Ci1zdGF0aWMgYXBfbG9ja190ICpwcm9jZXNzX2FjY2VwdF9tdXRleDsKLXN0YXRpYyBjaGFyICpsb2NrX2ZuYW1lOwotCi0jaWZkZWYgTk9fU0VSSUFMSVpFRF9BQ0NFUFQKLSNkZWZpbmUgU0FGRV9BQ0NFUFQoc3RtdCkgQVBSX1NVQ0NFU1MKLSNlbHNlCi0jZGVmaW5lIFNBRkVfQUNDRVBUKHN0bXQpIChzdG10KQotI2VuZGlmCi0KLQotLyogR2xvYmFsLCBhbGFzLCBzbyBodHRwX2NvcmUgY2FuIHRhbGsgdG8gdXMgKi8KLWVudW0gc2VydmVyX3Rva2VuX3R5cGUgYXBfc2VydmVyX3Rva2VucyA9IFNydlRrX0ZVTEw7Ci0KLUFQSV9FWFBPUlQoY29uc3Qgc2VydmVyX3JlYyAqKSBhcF9nZXRfc2VydmVyX2NvbmYodm9pZCkKLXsKLSAgICByZXR1cm4gKHNlcnZlcl9jb25mKTsKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX2dldF9tYXhfZGFlbW9ucyh2b2lkKQotewotICAgIHJldHVybiBtYXhfZGFlbW9uc19saW1pdDsKLX0KLQotLyogYSBjbGVhbiBleGl0IGZyb20gYSBjaGlsZCB3aXRoIHByb3BlciBjbGVhbnVwICovIAotc3RhdGljIHZvaWQgY2xlYW5fY2hpbGRfZXhpdChpbnQgY29kZSkgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSk7Ci12b2lkIGNsZWFuX2NoaWxkX2V4aXQoaW50IGNvZGUpCi17Ci0gICAgaWYgKHBjaGlsZCkgewotCWFwX2Rlc3Ryb3lfcG9vbChwY2hpbGQpOwotICAgIH0KLSAgICBleGl0KGNvZGUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGRlYWxpbmcgd2l0aCBvdGhlciBjaGlsZHJlbgotICovCi0KLSNpZmRlZiBIQVNfT1RIRVJfQ0hJTEQKLUFQSV9FWFBPUlQodm9pZCkgYXBfcmVnaXN0ZXJfb3RoZXJfY2hpbGQoaW50IHBpZCwKLQkJICAgICAgIHZvaWQgKCptYWludGVuYW5jZSkgKGludCByZWFzb24sIHZvaWQgKiwgYXBfd2FpdF90IHN0YXR1cyksCi0JCQkgIHZvaWQgKmRhdGEsIGludCB3cml0ZV9mZCkKLXsKLSAgICBvdGhlcl9jaGlsZF9yZWMgKm9jcjsKLQotICAgIG9jciA9IGFwX3BhbGxvYyhwY29uZiwgc2l6ZW9mKCpvY3IpKTsKLSAgICBvY3ItPnBpZCA9IHBpZDsKLSAgICBvY3ItPm1haW50ZW5hbmNlID0gbWFpbnRlbmFuY2U7Ci0gICAgb2NyLT5kYXRhID0gZGF0YTsKLSAgICBvY3ItPndyaXRlX2ZkID0gd3JpdGVfZmQ7Ci0gICAgb2NyLT5uZXh0ID0gb3RoZXJfY2hpbGRyZW47Ci0gICAgb3RoZXJfY2hpbGRyZW4gPSBvY3I7Ci19Ci0KLS8qIG5vdGUgdGhhdCBzaW5jZSB0aGlzIGNhbiBiZSBjYWxsZWQgYnkgYSBtYWludGVuYW5jZSBmdW5jdGlvbiB3aGlsZSB3ZSdyZQotICogc2Nhbm5pbmcgdGhlIG90aGVyX2NoaWxkcmVuIGxpc3QsIGFsbCBzY2FubmVycyBzaG91bGQgcHJvdGVjdCB0aGVtc2VsZgotICogYnkgbG9hZGluZyBvY3ItPm5leHQgYmVmb3JlIGNhbGxpbmcgYW55IG1haW50ZW5hbmNlIGZ1bmN0aW9uLgotICovCi1BUElfRVhQT1JUKHZvaWQpIGFwX3VucmVnaXN0ZXJfb3RoZXJfY2hpbGQodm9pZCAqZGF0YSkKLXsKLSAgICBvdGhlcl9jaGlsZF9yZWMgKipwb2NyLCAqbm9jcjsKLQotICAgIGZvciAocG9jciA9ICZvdGhlcl9jaGlsZHJlbjsgKnBvY3I7IHBvY3IgPSAmKCpwb2NyKS0+bmV4dCkgewotCWlmICgoKnBvY3IpLT5kYXRhID09IGRhdGEpIHsKLQkgICAgbm9jciA9ICgqcG9jciktPm5leHQ7Ci0JICAgICgqKCpwb2NyKS0+bWFpbnRlbmFuY2UpIChPQ19SRUFTT05fVU5SRUdJU1RFUiwgKCpwb2NyKS0+ZGF0YSwgLTEpOwotCSAgICAqcG9jciA9IG5vY3I7Ci0JICAgIC8qIFhYWDogdW0sIHdlbGwgd2UndmUganVzdCB3YXN0ZWQgc29tZSBzcGFjZSBpbiBwY29uZiA/ICovCi0JICAgIHJldHVybjsKLQl9Ci0gICAgfQotfQotCi0vKiB0ZXN0IHRvIGVuc3VyZSB0aGF0IHRoZSB3cml0ZV9mZHMgYXJlIGFsbCBzdGlsbCB3cml0YWJsZSwgb3RoZXJ3aXNlCi0gKiBpbnZva2UgdGhlIG1haW50ZW5hbmNlIGZ1bmN0aW9ucyBhcyBhcHByb3ByaWF0ZSAqLwotc3RhdGljIHZvaWQgcHJvYmVfd3JpdGFibGVfZmRzKHZvaWQpCi17Ci0gICAgcmV0dXJuOwotI2lmIDAKLSAgICBmZF9zZXQgd3JpdGFibGVfZmRzOwotICAgIGludCBmZF9tYXg7Ci0gICAgb3RoZXJfY2hpbGRfcmVjICpvY3IsICpub2NyOwotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIGludCByYzsKLQotICAgIGlmIChvdGhlcl9jaGlsZHJlbiA9PSBOVUxMKQotCXJldHVybjsKLQotICAgIGZkX21heCA9IDA7Ci0gICAgRkRfWkVSTygmd3JpdGFibGVfZmRzKTsKLSAgICBkbyB7Ci0JZm9yIChvY3IgPSBvdGhlcl9jaGlsZHJlbjsgb2NyOyBvY3IgPSBvY3ItPm5leHQpIHsKLQkgICAgaWYgKG9jci0+d3JpdGVfZmQgPT0gLTEpCi0JCWNvbnRpbnVlOwotCSAgICBGRF9TRVQob2NyLT53cml0ZV9mZCwgJndyaXRhYmxlX2Zkcyk7Ci0JICAgIGlmIChvY3ItPndyaXRlX2ZkID4gZmRfbWF4KSB7Ci0JCWZkX21heCA9IG9jci0+d3JpdGVfZmQ7Ci0JICAgIH0KLQl9Ci0JaWYgKGZkX21heCA9PSAwKQotCSAgICByZXR1cm47Ci0KLQl0di50dl9zZWMgPSAwOwotCXR2LnR2X3VzZWMgPSAwOwotCXJjID0gYXBfc2VsZWN0KGZkX21heCArIDEsIE5VTEwsICZ3cml0YWJsZV9mZHMsIE5VTEwsICZ0dik7Ci0gICAgfSB3aGlsZSAocmMgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgaWYgKHJjID09IC0xKSB7Ci0JLyogWFhYOiB1aGggdGhpcyBjb3VsZCBiZSByZWFsbHkgYmFkLCB3ZSBjb3VsZCBoYXZlIGEgYmFkIGZpbGUKLQkgKiBkZXNjcmlwdG9yIGR1ZSB0byBhIGJ1ZyBpbiBvbmUgb2YgdGhlIG1haW50ZW5hbmNlIHJvdXRpbmVzICovCi0JYXBfbG9nX3VuaXhlcnIoInByb2JlX3dyaXRhYmxlX2ZkcyIsICJzZWxlY3QiLAotCQkgICAgImNvdWxkIG5vdCBwcm9iZSB3cml0YWJsZSBmZHMiLCBzZXJ2ZXJfY29uZik7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBpZiAocmMgPT0gMCkKLQlyZXR1cm47Ci0KLSAgICBmb3IgKG9jciA9IG90aGVyX2NoaWxkcmVuOyBvY3I7IG9jciA9IG5vY3IpIHsKLQlub2NyID0gb2NyLT5uZXh0OwotCWlmIChvY3ItPndyaXRlX2ZkID09IC0xKQotCSAgICBjb250aW51ZTsKLQlpZiAoRkRfSVNTRVQob2NyLT53cml0ZV9mZCwgJndyaXRhYmxlX2ZkcykpCi0JICAgIGNvbnRpbnVlOwotCSgqb2NyLT5tYWludGVuYW5jZSkgKE9DX1JFQVNPTl9VTldSSVRBQkxFLCBvY3ItPmRhdGEsIC0xKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotLyogcG9zc2libHkgcmVhcCBhbiBvdGhlcl9jaGlsZCwgcmV0dXJuIDAgaWYgeWVzLCAtMSBpZiBub3QgKi8KLXN0YXRpYyBpbnQgcmVhcF9vdGhlcl9jaGlsZChpbnQgcGlkLCBhcF93YWl0X3Qgc3RhdHVzKQotewotICAgIG90aGVyX2NoaWxkX3JlYyAqb2NyLCAqbm9jcjsKLQotICAgIGZvciAob2NyID0gb3RoZXJfY2hpbGRyZW47IG9jcjsgb2NyID0gbm9jcikgewotCW5vY3IgPSBvY3ItPm5leHQ7Ci0JaWYgKG9jci0+cGlkICE9IHBpZCkKLQkgICAgY29udGludWU7Ci0Jb2NyLT5waWQgPSAtMTsKLQkoKm9jci0+bWFpbnRlbmFuY2UpIChPQ19SRUFTT05fREVBVEgsIG9jci0+ZGF0YSwgc3RhdHVzKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIHJlY2xhaW1fY2hpbGRfcHJvY2Vzc2VzKGludCB0ZXJtaW5hdGUpCi17Ci0gICAgaW50IGksIHN0YXR1czsKLSAgICBsb25nIGludCB3YWl0dGltZSA9IDEwMjQgKiAxNjsJLyogaW4gdXNlY3MgKi8KLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICBpbnQgd2FpdHJldCwgdHJpZXM7Ci0gICAgaW50IG5vdF9kZWFkX3lldDsKLSNpZmRlZiBIQVNfT1RIRVJfQ0hJTEQKLSAgICBvdGhlcl9jaGlsZF9yZWMgKm9jciwgKm5vY3I7Ci0jZW5kaWYKLQotICAgIGFwX3N5bmNfc2NvcmVib2FyZF9pbWFnZSgpOwotCi0gICAgZm9yICh0cmllcyA9IHRlcm1pbmF0ZSA/IDQgOiAxOyB0cmllcyA8PSA5OyArK3RyaWVzKSB7Ci0JLyogZG9uJ3Qgd2FudCB0byBob2xkIHVwIHByb2dyZXNzIGFueSBtb3JlIHRoYW4gCi0JICogbmVjZXNzYXJ5LCBidXQgd2UgbmVlZCB0byBhbGxvdyBjaGlsZHJlbiBhIGZldyBtb21lbnRzIHRvIGV4aXQuCi0JICogU2V0IGRlbGF5IHdpdGggYW4gZXhwb25lbnRpYWwgYmFja29mZi4KLQkgKi8KLQl0di50dl9zZWMgPSB3YWl0dGltZSAvIDEwMDAwMDA7Ci0JdHYudHZfdXNlYyA9IHdhaXR0aW1lICUgMTAwMDAwMDsKLQl3YWl0dGltZSA9IHdhaXR0aW1lICogNDsKLQlhcF9zZWxlY3QoMCwgTlVMTCwgTlVMTCwgTlVMTCwgJnR2KTsKLQotCS8qIG5vdyBzZWUgd2hvIGlzIGRvbmUgKi8KLQlub3RfZGVhZF95ZXQgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBtYXhfZGFlbW9uc19saW1pdDsgKytpKSB7Ci0JICAgIGludCBwaWQgPSBhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnRbaV0ucGlkOwotCi0JICAgIGlmIChwaWQgPT0gbXlfcGlkIHx8IHBpZCA9PSAwKQotCQljb250aW51ZTsKLQotCSAgICB3YWl0cmV0ID0gd2FpdHBpZChwaWQsICZzdGF0dXMsIFdOT0hBTkcpOwotCSAgICBpZiAod2FpdHJldCA9PSBwaWQgfHwgd2FpdHJldCA9PSAtMSkgewotCQlhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnRbaV0ucGlkID0gMDsKLQkJY29udGludWU7Ci0JICAgIH0KLQkgICAgKytub3RfZGVhZF95ZXQ7Ci0JICAgIHN3aXRjaCAodHJpZXMpIHsKLQkgICAgY2FzZSAxOiAgICAgLyogIDE2bXMgKi8KLQkgICAgY2FzZSAyOiAgICAgLyogIDgybXMgKi8KLQkJYnJlYWs7Ci0JICAgIGNhc2UgMzogICAgIC8qIDM0NG1zICovCi0JICAgIGNhc2UgNDogICAgIC8qICAxNm1zICovCi0JICAgIGNhc2UgNTogICAgIC8qICA4Mm1zICovCi0JICAgIGNhc2UgNjogICAgIC8qIDM0NG1zICovCi0JICAgIGNhc2UgNzogICAgIC8qIDEuNHNlYyAqLwotCQkvKiBvaywgbm93IGl0J3MgYmVpbmcgYW5ub3lpbmcgKi8KLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfV0FSTklORywKLQkJCSAgICAwLCBzZXJ2ZXJfY29uZiwKLQkJICAgImNoaWxkIHByb2Nlc3MgJWQgc3RpbGwgZGlkIG5vdCBleGl0LCBzZW5kaW5nIGEgU0lHVEVSTSIsCi0JCQkgICAgcGlkKTsKLQkJa2lsbChwaWQsIFNJR1RFUk0pOwotCQlicmVhazsKLQkgICAgY2FzZSA4OiAgICAgLyogIDYgc2VjICovCi0JCS8qIGRpZSBjaGlsZCBzY3VtICovCi0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgc2VydmVyX2NvbmYsCi0JCSAgICJjaGlsZCBwcm9jZXNzICVkIHN0aWxsIGRpZCBub3QgZXhpdCwgc2VuZGluZyBhIFNJR0tJTEwiLAotCQkJICAgIHBpZCk7Ci0JCWtpbGwocGlkLCBTSUdLSUxMKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgOTogICAgIC8qIDE0IHNlYyAqLwotCQkvKiBnYXZlIGl0IG91ciBiZXN0IHNob3QsIGJ1dCBhbGFzLi4uICBJZiB0aGlzIHJlYWxseSAKLQkJICogaXMgYSBjaGlsZCB3ZSBhcmUgdHJ5aW5nIHRvIGtpbGwgYW5kIGl0IHJlYWxseSBoYXNuJ3QKLQkJICogZXhpdGVkLCB3ZSB3aWxsIGxpa2VseSBmYWlsIHRvIGJpbmQgdG8gdGhlIHBvcnQKLQkJICogYWZ0ZXIgdGhlIHJlc3RhcnQuCi0JCSAqLwotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHNlcnZlcl9jb25mLAotCQkJICAgICJjb3VsZCBub3QgbWFrZSBjaGlsZCBwcm9jZXNzICVkIGV4aXQsICIKLQkJCSAgICAiYXR0ZW1wdGluZyB0byBjb250aW51ZSBhbnl3YXkiLCBwaWQpOwotCQlicmVhazsKLQkgICAgfQotCX0KLSNpZmRlZiBIQVNfT1RIRVJfQ0hJTEQKLQlmb3IgKG9jciA9IG90aGVyX2NoaWxkcmVuOyBvY3I7IG9jciA9IG5vY3IpIHsKLQkgICAgbm9jciA9IG9jci0+bmV4dDsKLQkgICAgaWYgKG9jci0+cGlkID09IC0xKQotCQljb250aW51ZTsKLQotCSAgICB3YWl0cmV0ID0gd2FpdHBpZChvY3ItPnBpZCwgJnN0YXR1cywgV05PSEFORyk7Ci0JICAgIGlmICh3YWl0cmV0ID09IG9jci0+cGlkKSB7Ci0JCW9jci0+cGlkID0gLTE7Ci0JCSgqb2NyLT5tYWludGVuYW5jZSkgKE9DX1JFQVNPTl9ERUFUSCwgb2NyLT5kYXRhLCBzdGF0dXMpOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHdhaXRyZXQgPT0gMCkgewotCQkoKm9jci0+bWFpbnRlbmFuY2UpIChPQ19SRUFTT05fUkVTVEFSVCwgb2NyLT5kYXRhLCAtMSk7Ci0JCSsrbm90X2RlYWRfeWV0OwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHdhaXRyZXQgPT0gLTEpIHsKLQkJLyogdWggd2hhdCB0aGUgaGVjaz8gdGhleSBkaWRuJ3QgY2FsbCB1bnJlZ2lzdGVyPyAqLwotCQlvY3ItPnBpZCA9IC0xOwotCQkoKm9jci0+bWFpbnRlbmFuY2UpIChPQ19SRUFTT05fTE9TVCwgb2NyLT5kYXRhLCAtMSk7Ci0JICAgIH0KLQl9Ci0jZW5kaWYKLQlpZiAoIW5vdF9kZWFkX3lldCkgewotCSAgICAvKiBub3RoaW5nIGxlZnQgdG8gd2FpdCBmb3IgKi8KLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotLyogRmluYWxseSwgdGhpcyByb3V0aW5lIGlzIHVzZWQgYnkgdGhlIGNhcmV0YWtlciBwcm9jZXNzIHRvIHdhaXQgZm9yCi0gKiBhIHdoaWxlLi4uCi0gKi8KLQotLyogbnVtYmVyIG9mIGNhbGxzIHRvIHdhaXRfb3JfdGltZW91dCBiZXR3ZWVuIHdyaXRhYmxlIHByb2JlcyAqLwotI2lmbmRlZiBJTlRFUlZBTF9PRl9XUklUQUJMRV9QUk9CRVMKLSNkZWZpbmUgSU5URVJWQUxfT0ZfV1JJVEFCTEVfUFJPQkVTIDEwCi0jZW5kaWYKLXN0YXRpYyBpbnQgd2FpdF9vcl90aW1lb3V0X2NvdW50ZXI7Ci0KLXN0YXRpYyBpbnQgd2FpdF9vcl90aW1lb3V0KGFwX3dhaXRfdCAqc3RhdHVzKQotewotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIGludCByZXQ7Ci0KLSAgICArK3dhaXRfb3JfdGltZW91dF9jb3VudGVyOwotICAgIGlmICh3YWl0X29yX3RpbWVvdXRfY291bnRlciA9PSBJTlRFUlZBTF9PRl9XUklUQUJMRV9QUk9CRVMpIHsKLQl3YWl0X29yX3RpbWVvdXRfY291bnRlciA9IDA7Ci0jaWZkZWYgSEFTX09USEVSX0NISUxECi0JcHJvYmVfd3JpdGFibGVfZmRzKCk7Ci0jZW5kaWYKLSAgICB9Ci0gICAgcmV0ID0gd2FpdHBpZCgtMSwgc3RhdHVzLCBXTk9IQU5HKTsKLSAgICBpZiAocmV0ID09IC0xICYmIGVycm5vID09IEVJTlRSKSB7Ci0JcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAocmV0ID4gMCkgewotCXJldHVybiByZXQ7Ci0gICAgfQotICAgIHR2LnR2X3NlYyA9IFNDT1JFQk9BUkRfTUFJTlRFTkFOQ0VfSU5URVJWQUwgLyAxMDAwMDAwOwotICAgIHR2LnR2X3VzZWMgPSBTQ09SRUJPQVJEX01BSU5URU5BTkNFX0lOVEVSVkFMICUgMTAwMDAwMDsKLSAgICBhcF9zZWxlY3QoMCwgTlVMTCwgTlVMTCwgTlVMTCwgJnR2KTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLS8qIGhhbmRsZSBhbGwgdmFyaWV0aWVzIG9mIGNvcmUgZHVtcGluZyBzaWduYWxzICovCi1zdGF0aWMgdm9pZCBzaWdfY29yZWR1bXAoaW50IHNpZykKLXsKLSAgICBjaGRpcihhcF9jb3JlZHVtcF9kaXIpOwotICAgIHNpZ25hbChzaWcsIFNJR19ERkwpOwotICAgIGtpbGwobXlfcGlkLCBzaWcpOwotICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UndmUgZ290IHNpZyBibG9ja2VkLCBiZWNhdXNlIHdlJ3JlIHN0aWxsIGluc2lkZQotICAgICAqIHRoZSBzaWduYWwgaGFuZGxlci4gIFdoZW4gd2UgbGVhdmUgdGhlIHNpZ25hbCBoYW5kbGVyIGl0IHdpbGwKLSAgICAgKiBiZSB1bmJsb2NrZWQsIGFuZCB3ZSdsbCB0YWtlIHRoZSBzaWduYWwuLi4gYW5kIGNvcmVkdW1wIG9yIHdoYXRldmVyCi0gICAgICogaXMgYXBwcm9wcmlhdGUgZm9yIHRoaXMgcGFydGljdWxhciBVbml4LiAgSW4gYWRkaXRpb24gdGhlIHBhcmVudAotICAgICAqIHdpbGwgc2VlIHRoZSByZWFsIHNpZ25hbCB3ZSByZWNlaXZlZCAtLSB3aGVyZWFzIGlmIHdlIGNhbGxlZAotICAgICAqIGFib3J0KCkgaGVyZSwgdGhlIHBhcmVudCB3b3VsZCBvbmx5IHNlZSBTSUdBQlJULgotICAgICAqLwotfQotCi1zdGF0aWMgdm9pZCBqdXN0X2RpZShpbnQgc2lnKQotewotICAgIGNsZWFuX2NoaWxkX2V4aXQoMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29ubmVjdGlvbiBzdHJ1Y3R1cmVzIGFuZCBhY2NvdW50aW5nLi4uCi0gKi8KLQotLyogdm9sYXRpbGUganVzdCBpbiBjYXNlICovCi1zdGF0aWMgaW50IHZvbGF0aWxlIHNodXRkb3duX3BlbmRpbmc7Ci1zdGF0aWMgaW50IHZvbGF0aWxlIHJlc3RhcnRfcGVuZGluZzsKLXN0YXRpYyBpbnQgdm9sYXRpbGUgaXNfZ3JhY2VmdWw7Ci1hcF9nZW5lcmF0aW9uX3Qgdm9sYXRpbGUgYXBfbXlfZ2VuZXJhdGlvbjsKLQotLyoKLSAqIGFwX3N0YXJ0X3NodXRkb3duKCkgYW5kIGFwX3N0YXJ0X3Jlc3RhcnQoKSwgYmVsb3csIGFyZSBhIGZpcnN0IHN0YWIgYXQKLSAqIGZ1bmN0aW9ucyB0byBpbml0aWF0ZSBzaHV0ZG93biBvciByZXN0YXJ0IHdpdGhvdXQgcmVseWluZyBvbiBzaWduYWxzLiAKLSAqIFByZXZpb3VzbHkgdGhpcyB3YXMgaW5pdGlhdGVkIGluIHNpZ190ZXJtKCkgYW5kIHJlc3RhcnQoKSBzaWduYWwgaGFuZGxlcnMsIAotICogYnV0IHdlIHdhbnQgdG8gYmUgYWJsZSB0byBzdGFydCBhIHNodXRkb3duL3Jlc3RhcnQgZnJvbSBvdGhlciBzb3VyY2VzIC0tCi0gKiBlLmcuIG9uIFdpbjMyLCBmcm9tIHRoZSBzZXJ2aWNlIG1hbmFnZXIuIE5vdyB0aGUgc2VydmljZSBtYW5hZ2VyIGNhbgotICogY2FsbCBhcF9zdGFydF9zaHV0ZG93bigpIG9yIGFwX3N0YXJ0X3Jlc3RhcnQoKSBhcyBhcHByb3BpYXRlLiAgTm90ZSB0aGF0Ci0gKiB0aGVzZSBmdW5jdGlvbnMgY2FuIGFsc28gYmUgY2FsbGVkIGJ5IHRoZSBjaGlsZCBwcm9jZXNzZXMsIHNpbmNlIGdsb2JhbAotICogdmFyaWFibGVzIGFyZSBubyBsb25nZXIgdXNlZCB0byBwYXNzIG9uIHRoZSByZXF1aXJlZCBhY3Rpb24gdG8gdGhlIHBhcmVudC4KLSAqCi0gKiBUaGVzZSBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB0aGUgcGFyZW50IHByb2Nlc3MgaXRzZWxmLCBzaW5jZSB0aGUKLSAqIHBhcmVudCBwcm9jZXNzIHdpbGwgdXNlIHRoZSBzaHV0ZG93bl9wZW5kaW5nIGFuZCByZXN0YXJ0X3BlbmRpbmcgdmFyaWFibGVzCi0gKiB0byBkZXRlcm1pbmUgd2hldGhlciB0byBzaHV0ZG93biBvciByZXN0YXJ0LiBUaGUgY2hpbGQgcHJvY2VzcyBzaG91bGQKLSAqIGNhbGwgc2lnbmFsX3BhcmVudCgpIGRpcmVjdGx5IHRvIHRlbGwgdGhlIHBhcmVudCB0byBkaWUgLS0gdGhpcyB3aWxsCi0gKiBjYXVzZSBuZWl0aGVyIG9mIHRob3NlIHZhcmlhYmxlIHRvIGJlIHNldCwgd2hpY2ggdGhlIHBhcmVudCB3aWxsCi0gKiBhc3N1bWUgbWVhbnMgc29tZXRoaW5nIHNlcmlvdXMgaXMgd3JvbmcgKHdoaWNoIGl0IHdpbGwgYmUsIGZvciB0aGUKLSAqIGNoaWxkIHRvIGZvcmNlIGFuIGV4aXQpIGFuZCBzbyBkbyBhbiBleGl0IGFueXdheS4KLSAqLwotCi12b2lkIGFwX3N0YXJ0X3NodXRkb3duKHZvaWQpCi17Ci0gICAgaWYgKHNodXRkb3duX3BlbmRpbmcgPT0gMSkgewotCS8qIFVtLCBpcyB0aGlzIF9wcm9iYWJseV8gbm90IGFuIGVycm9yLCBpZiB0aGUgdXNlciBoYXMKLQkgKiB0cmllZCB0byBkbyBhIHNodXRkb3duIHR3aWNlIHF1aWNrbHksIHNvIHdlIHdvbid0Ci0JICogd29ycnkgYWJvdXQgcmVwb3J0aW5nIGl0LgotCSAqLwotCXJldHVybjsKLSAgICB9Ci0gICAgc2h1dGRvd25fcGVuZGluZyA9IDE7Ci19Ci0KLS8qIGRvIGEgZ3JhY2VmdWwgcmVzdGFydCBpZiBncmFjZWZ1bCA9PSAxICovCi12b2lkIGFwX3N0YXJ0X3Jlc3RhcnQoaW50IGdyYWNlZnVsKQotewotCi0gICAgaWYgKHJlc3RhcnRfcGVuZGluZyA9PSAxKSB7Ci0JLyogUHJvYmFibHkgbm90IGFuIGVycm9yIC0gZG9uJ3QgYm90aGVyIHJlcG9ydGluZyBpdCAqLwotCXJldHVybjsKLSAgICB9Ci0gICAgcmVzdGFydF9wZW5kaW5nID0gMTsKLSAgICBpc19ncmFjZWZ1bCA9IGdyYWNlZnVsOwotfQotCi1zdGF0aWMgdm9pZCBzaWdfdGVybShpbnQgc2lnKQotewotICAgIGFwX3N0YXJ0X3NodXRkb3duKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlc3RhcnQoaW50IHNpZykKLXsKLSNpZm5kZWYgV0lOMzIKLSAgICBhcF9zdGFydF9yZXN0YXJ0KHNpZyA9PSBTSUdXSU5DSCk7Ci0jZWxzZQotICAgIGFwX3N0YXJ0X3Jlc3RhcnQoMSk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgc2V0X3NpZ25hbHModm9pZCkKLXsKLSNpZm5kZWYgTk9fVVNFX1NJR0FDVElPTgotICAgIHN0cnVjdCBzaWdhY3Rpb24gc2E7Ci0KLSAgICBzaWdlbXB0eXNldCgmc2Euc2FfbWFzayk7Ci0gICAgc2Euc2FfZmxhZ3MgPSAwOwotCi0gICAgaWYgKCFvbmVfcHJvY2VzcykgewotCXNhLnNhX2hhbmRsZXIgPSBzaWdfY29yZWR1bXA7Ci0jaWYgZGVmaW5lZChTQV9PTkVTSE9UKQotCXNhLnNhX2ZsYWdzID0gU0FfT05FU0hPVDsKLSNlbGlmIGRlZmluZWQoU0FfUkVTRVRIQU5EKQotCXNhLnNhX2ZsYWdzID0gU0FfUkVTRVRIQU5EOwotI2VuZGlmCi0JaWYgKHNpZ2FjdGlvbihTSUdTRUdWLCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdTRUdWKSIpOwotI2lmZGVmIFNJR0JVUwotCWlmIChzaWdhY3Rpb24oU0lHQlVTLCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdCVVMpIik7Ci0jZW5kaWYKLSNpZmRlZiBTSUdBQk9SVAotCWlmIChzaWdhY3Rpb24oU0lHQUJPUlQsICZzYSwgTlVMTCkgPCAwKQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR0FCT1JUKSIpOwotI2VuZGlmCi0jaWZkZWYgU0lHQUJSVAotCWlmIChzaWdhY3Rpb24oU0lHQUJSVCwgJnNhLCBOVUxMKSA8IDApCi0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHQUJSVCkiKTsKLSNlbmRpZgotI2lmZGVmIFNJR0lMTAotCWlmIChzaWdhY3Rpb24oU0lHSUxMLCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdJTEwpIik7Ci0jZW5kaWYKLQlzYS5zYV9mbGFncyA9IDA7Ci0gICAgfQotICAgIHNhLnNhX2hhbmRsZXIgPSBzaWdfdGVybTsKLSAgICBpZiAoc2lnYWN0aW9uKFNJR1RFUk0sICZzYSwgTlVMTCkgPCAwKQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHVEVSTSkiKTsKLSNpZmRlZiBTSUdJTlQKLSAgICBpZiAoc2lnYWN0aW9uKFNJR0lOVCwgJnNhLCBOVUxMKSA8IDApCi0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHSU5UKSIpOwotI2VuZGlmCi0jaWZkZWYgU0lHWENQVQotICAgIHNhLnNhX2hhbmRsZXIgPSBTSUdfREZMOwotICAgIGlmIChzaWdhY3Rpb24oU0lHWENQVSwgJnNhLCBOVUxMKSA8IDApCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdYQ1BVKSIpOwotI2VuZGlmCi0jaWZkZWYgU0lHWEZTWgotICAgIHNhLnNhX2hhbmRsZXIgPSBTSUdfREZMOwotICAgIGlmIChzaWdhY3Rpb24oU0lHWEZTWiwgJnNhLCBOVUxMKSA8IDApCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdYRlNaKSIpOwotI2VuZGlmCi0jaWZkZWYgU0lHUElQRQotICAgIHNhLnNhX2hhbmRsZXIgPSBTSUdfSUdOOwotICAgIGlmIChzaWdhY3Rpb24oU0lHUElQRSwgJnNhLCBOVUxMKSA8IDApCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdQSVBFKSIpOwotI2VuZGlmCi0KLSAgICAvKiB3ZSB3YW50IHRvIGlnbm9yZSBIVVBzIGFuZCBXSU5DSCB3aGlsZSB3ZSdyZSBidXN5IHByb2Nlc3Npbmcgb25lICovCi0gICAgc2lnYWRkc2V0KCZzYS5zYV9tYXNrLCBTSUdIVVApOwotICAgIHNpZ2FkZHNldCgmc2Euc2FfbWFzaywgU0lHV0lOQ0gpOwotICAgIHNhLnNhX2hhbmRsZXIgPSByZXN0YXJ0OwotICAgIGlmIChzaWdhY3Rpb24oU0lHSFVQLCAmc2EsIE5VTEwpIDwgMCkKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR0hVUCkiKTsKLSAgICBpZiAoc2lnYWN0aW9uKFNJR1dJTkNILCAmc2EsIE5VTEwpIDwgMCkKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR1dJTkNIKSIpOwotI2Vsc2UKLSAgICBpZiAoIW9uZV9wcm9jZXNzKSB7Ci0Jc2lnbmFsKFNJR1NFR1YsIHNpZ19jb3JlZHVtcCk7Ci0jaWZkZWYgU0lHQlVTCi0Jc2lnbmFsKFNJR0JVUywgc2lnX2NvcmVkdW1wKTsKLSNlbmRpZiAvKiBTSUdCVVMgKi8KLSNpZmRlZiBTSUdBQk9SVAotCXNpZ25hbChTSUdBQk9SVCwgc2lnX2NvcmVkdW1wKTsKLSNlbmRpZiAvKiBTSUdBQk9SVCAqLwotI2lmZGVmIFNJR0FCUlQKLQlzaWduYWwoU0lHQUJSVCwgc2lnX2NvcmVkdW1wKTsKLSNlbmRpZiAvKiBTSUdBQlJUICovCi0jaWZkZWYgU0lHSUxMCi0Jc2lnbmFsKFNJR0lMTCwgc2lnX2NvcmVkdW1wKTsKLSNlbmRpZiAvKiBTSUdJTEwgKi8KLSNpZmRlZiBTSUdYQ1BVCi0Jc2lnbmFsKFNJR1hDUFUsIFNJR19ERkwpOwotI2VuZGlmIC8qIFNJR1hDUFUgKi8KLSNpZmRlZiBTSUdYRlNaCi0Jc2lnbmFsKFNJR1hGU1osIFNJR19ERkwpOwotI2VuZGlmIC8qIFNJR1hGU1ogKi8KLSAgICB9Ci0KLSAgICBzaWduYWwoU0lHVEVSTSwgc2lnX3Rlcm0pOwotI2lmZGVmIFNJR0hVUAotICAgIHNpZ25hbChTSUdIVVAsIHJlc3RhcnQpOwotI2VuZGlmIC8qIFNJR0hVUCAqLwotI2lmZGVmIFNJR1dJTkNICi0gICAgc2lnbmFsKFNJR1dJTkNILCByZXN0YXJ0KTsKLSNlbmRpZiAvKiBTSUdXSU5DSCAqLwotI2lmZGVmIFNJR1BJUEUKLSAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7Ci0jZW5kaWYgLyogU0lHUElQRSAqLwotCi0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgcHJvY2Vzc19jaGlsZF9zdGF0dXMoaW50IHBpZCwgYXBfd2FpdF90IHN0YXR1cykKLXsKLSAgICAvKiBDaGlsZCBkaWVkLi4uIGlmIGl0IGRpZWQgZHVlIHRvIGEgZmF0YWwgZXJyb3IsCi0JKiB3ZSBzaG91bGQgc2ltcGx5IGJhaWwgb3V0LgotCSovCi0gICAgaWYgKChXSUZFWElURUQoc3RhdHVzKSkgJiYKLQlXRVhJVFNUQVRVUyhzdGF0dXMpID09IEFQRVhJVF9DSElMREZBVEFMKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJUfEFQTE9HX05PRVJSTk8sIDAsIHNlcnZlcl9jb25mLAotCQkJIkNoaWxkICVkIHJldHVybmVkIGEgRmF0YWwgZXJyb3IuLi4gXG4iCi0JCQkiQXBhY2hlIGlzIGV4aXRpbmchIiwKLQkJCXBpZCk7Ci0JZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotICAgIGlmIChXSUZTSUdOQUxFRChzdGF0dXMpKSB7Ci0Jc3dpdGNoIChXVEVSTVNJRyhzdGF0dXMpKSB7Ci0JY2FzZSBTSUdURVJNOgotCWNhc2UgU0lHSFVQOgotCWNhc2UgU0lHVVNSMToKLQljYXNlIFNJR0tJTEw6Ci0JICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0jaWZkZWYgU1lTX1NJR0xJU1QKLSNpZmRlZiBXQ09SRURVTVAKLQkgICAgaWYgKFdDT1JFRFVNUChzdGF0dXMpKSB7Ci0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwKLQkJCSAgICAgMCwgc2VydmVyX2NvbmYsCi0JCQkgICAgICJjaGlsZCBwaWQgJWQgZXhpdCBzaWduYWwgJXMgKCVkKSwgIgotCQkJICAgICAicG9zc2libGUgY29yZWR1bXAgaW4gJXMiLAotCQkJICAgICBwaWQsIChXVEVSTVNJRyhzdGF0dXMpID49IE51bVNJRykgPyAiIiA6IAotCQkJICAgICBTWVNfU0lHTElTVFtXVEVSTVNJRyhzdGF0dXMpXSwgV1RFUk1TSUcoc3RhdHVzKSwKLQkJCSAgICAgYXBfY29yZWR1bXBfZGlyKTsKLQkgICAgfQotCSAgICBlbHNlIHsKLSNlbmRpZgotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19OT1RJQ0UsCi0JCQkgICAgIDAsIHNlcnZlcl9jb25mLAotCQkJICAgICAiY2hpbGQgcGlkICVkIGV4aXQgc2lnbmFsICVzICglZCkiLCBwaWQsCi0JCQkgICAgIFNZU19TSUdMSVNUW1dURVJNU0lHKHN0YXR1cyldLCBXVEVSTVNJRyhzdGF0dXMpKTsKLSNpZmRlZiBXQ09SRURVTVAKLQkgICAgfQotI2VuZGlmCi0jZWxzZQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19OT1RJQ0UsCi0JCQkgc2VydmVyX2NvbmYsCi0JCQkgImNoaWxkIHBpZCAlZCBleGl0IHNpZ25hbCAlZCIsCi0JCQkgcGlkLCBXVEVSTVNJRyhzdGF0dXMpKTsKLSNlbmRpZgotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgc2V0dXBfbGlzdGVuZXJzKHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgYXBfbGlzdGVuX3JlYyAqbHI7Ci0gICAgaW50IG51bV9saXN0ZW5lcnMgPSAwOwotICAgIGlmIChhcF9saXN0ZW5fb3BlbihzLT5wcm9jZXNzLCBzLT5wb3J0KSkgewotICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBmb3IgKGxyID0gYXBfbGlzdGVuZXJzOyBscjsgbHIgPSBsci0+bmV4dCkgewotICAgICAgICBudW1fbGlzdGVuZXJzKys7Ci0gICAgfQotICAgIHJldHVybiBudW1fbGlzdGVuZXJzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEhlcmUgZm9sbG93cyBhIGxvbmcgYnVuY2ggb2YgZ2VuZXJpYyBzZXJ2ZXIgYm9va2tlZXBpbmcgc3R1ZmYuLi4KLSAqLwotCi0jaWYgZGVmaW5lZChUQ1BfTk9ERUxBWSkgJiYgIWRlZmluZWQoTVBFKSAmJiAhZGVmaW5lZChUUEYpCi1zdGF0aWMgdm9pZCBzb2NrX2Rpc2FibGVfbmFnbGUoaW50IHMpIAotewotICAgIC8qIFRoZSBOYWdsZSBhbGdvcml0aG0gc2F5cyB0aGF0IHdlIHNob3VsZCBkZWxheSBzZW5kaW5nIHBhcnRpYWwKLSAgICAgKiBwYWNrZXRzIGluIGhvcGVzIG9mIGdldHRpbmcgbW9yZSBkYXRhLiAgV2UgZG9uJ3Qgd2FudCB0byBkbwotICAgICAqIHRoaXM7IHdlIGFyZSBub3QgdGVsbmV0LiAgVGhlcmUgYXJlIGJhZCBpbnRlcmFjdGlvbnMgYmV0d2VlbgotICAgICAqIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgYW5kIE5hZ2xlJ3MgYWxnb3JpdGhtIHRoYXQgaGF2ZSB2ZXJ5IHNldmVyZQotICAgICAqIHBlcmZvcm1hbmNlIHBlbmFsdGllcy4gIChGYWlsaW5nIHRvIGRpc2FibGUgTmFnbGUgaXMgbm90IG11Y2ggb2YgYQotICAgICAqIHByb2JsZW0gd2l0aCBzaW1wbGUgSFRUUC4pCi0gICAgICoKLSAgICAgKiBJbiBzcGl0ZSBvZiB0aGVzZSBwcm9ibGVtcywgZmFpbHVyZSBoZXJlIGlzIG5vdCBhIHNob290aW5nIG9mZmVuc2UuCi0gICAgICovCi0gICAgaW50IGp1c3Rfc2F5X25vID0gMTsKLQotICAgIGlmIChzZXRzb2Nrb3B0KHMsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgKGNoYXIgKikgJmp1c3Rfc2F5X25vLAotCQkgICBzaXplb2YoaW50KSkgPCAwKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJzZXRzb2Nrb3B0OiAoVENQX05PREVMQVkpIik7Ci0gICAgfQotfQotCi0jZWxzZQotI2RlZmluZSBzb2NrX2Rpc2FibGVfbmFnbGUocykJLyogTk9PUCAqLwotI2VuZGlmCi0KLWludCBhcF9ncmFjZWZ1bF9zdG9wX3NpZ25hbGxlZCh2b2lkKQotewotICAgIC8qIFhYWCAtIERvZXMgdGhpcyByZWFsbHkgd29yaz8gLSBNYW5vaiAqLwotICAgIHJldHVybiBpc19ncmFjZWZ1bDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDaGlsZCBwcm9jZXNzIG1haW4gbG9vcC4KLSAqLwotCi1zdGF0aWMgdm9pZCBwcm9jZXNzX3NvY2tldChhcF9jb250ZXh0X3QgKnAsIGFwX3NvY2tldF90ICpzb2NrLCBpbnQgbXlfY2hpbGRfbnVtLCBpbnQgbXlfdGhyZWFkX251bSkKLXsKLSAgICBCVUZGICpjb25uX2lvOwotICAgIGNvbm5fcmVjICpjdXJyZW50X2Nvbm47Ci0gICAgYXBfaW9sICppb2w7Ci0gICAgbG9uZyBjb25uX2lkID0gbXlfY2hpbGRfbnVtICogSEFSRF9USFJFQURfTElNSVQgKyBteV90aHJlYWRfbnVtOwotICAgIGludCBjc2Q7Ci0KLSAgICAodm9pZCkgYXBfZ2V0X29zX3NvY2soJmNzZCwgc29jayk7Ci0KLSAgICBzb2NrX2Rpc2FibGVfbmFnbGUoY3NkKTsKLQotICAgIGlvbCA9IHVuaXhfYXR0YWNoX3NvY2tldChzb2NrKTsKLSAgICBpZiAoaW9sID09IE5VTEwpIHsKLSAgICAgICAgaWYgKGVycm5vID09IEVCQURGKSB7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLCAwLCBOVUxMLAotICAgICAgICAgICAgICAgICJmaWxlZGVzY3JpcHRvciAoJXUpIGxhcmdlciB0aGFuIEZEX1NFVFNJWkUgKCV1KSAiCi0gICAgICAgICAgICAgICAgImZvdW5kLCB5b3UgcHJvYmFibHkgbmVlZCB0byByZWJ1aWxkIEFwYWNoZSB3aXRoIGEgIgotICAgICAgICAgICAgICAgICJsYXJnZXIgRkRfU0VUU0laRSIsIGNzZCwgRkRfU0VUU0laRSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIE5VTEwsCi0gICAgICAgICAgICAgICAgImVycm9yIGF0dGFjaGluZyB0byBzb2NrZXQiKTsKLSAgICAgICAgfQotICAgICAgICBhcF9jbG9zZV9zb2NrZXQoc29jayk7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgICh2b2lkKSBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKG15X2NoaWxkX251bSwgbXlfdGhyZWFkX251bSwgIAotCQkJCSAgU0VSVkVSX0JVU1lfUkVBRCwgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotICAgIGNvbm5faW8gPSBhcF9iY3JlYXRlKHAsIEJfUkRXUik7Ci0gICAgYXBfYnB1c2hfaW9sKGNvbm5faW8sIGlvbCk7Ci0KLSAgICBjdXJyZW50X2Nvbm4gPSBhcF9uZXdfYXByX2Nvbm5lY3Rpb24ocCwgc2VydmVyX2NvbmYsIGNvbm5faW8sIHNvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5faWQpOwotCi0gICAgYXBfcHJvY2Vzc19jb25uZWN0aW9uKGN1cnJlbnRfY29ubik7Ci19Ci0vKiBTZXRzIHdvcmtlcnNfbWF5X2V4aXQgaWYgd2UgcmVjZWl2ZWQgYSBjaGFyYWN0ZXIgb24gdGhlIHBpcGVfb2ZfZGVhdGggKi8KLXN0YXRpYyB2b2lkIGNoZWNrX3BpcGVfb2ZfZGVhdGgodm9pZCkKLXsKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJnBpcGVfb2ZfZGVhdGhfbXV0ZXgpOwotICAgIGlmICghd29ya2Vyc19tYXlfZXhpdCkgewotICAgICAgICBhcF9zdGF0dXNfdCByZXQ7Ci0gICAgICAgIGNoYXIgcGlwZV9yZWFkX2NoYXI7Ci0JaW50IG49MTsKLQotICAgICAgICByZXQgPSBhcF9yZWN2KGxpc3RlbnNvY2tzWzBdLCAmcGlwZV9yZWFkX2NoYXIsICZuKTsKLSAgICAgICAgaWYgKHJldCA9PSBBUFJfRUFHQUlOKSB7Ci0gICAgICAgICAgICAvKiBJdCBsb3N0IHRoZSBsb3R0ZXJ5LiBJdCBtdXN0IGNvbnRpbnVlIHRvIHN1ZmZlcgotICAgICAgICAgICAgICogdGhyb3VnaCBhIGxpZmUgb2Ygc2Vydml0dWRlLiAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLyogSXQgd29uIHRoZSBsb3R0ZXJ5IChvciBzb21ldGhpbmcgZWxzZSBpcyB2ZXJ5Ci0gICAgICAgICAgICAgKiB3cm9uZykuIEVtYnJhY2UgZGVhdGggd2l0aCBvcGVuIGFybXMuICovCi0gICAgICAgICAgICB3b3JrZXJzX21heV9leGl0ID0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcGlwZV9vZl9kZWF0aF9tdXRleCk7Ci19Ci0KLXN0YXRpYyB2b2lkICogd29ya2VyX3RocmVhZCh2b2lkICogZHVtbXkpCi17Ci0gICAgcHJvY19pbmZvICogdGkgPSBkdW1teTsKLSAgICBpbnQgcHJvY2Vzc19zbG90ID0gdGktPnBpZDsKLSAgICBpbnQgdGhyZWFkX3Nsb3QgPSB0aS0+dGlkOwotICAgIGFwX2NvbnRleHRfdCAqdHBvb2wgPSB0aS0+dHBvb2w7Ci0gICAgYXBfc29ja2V0X3QgKmNzZCA9IE5VTEw7Ci0gICAgYXBfY29udGV4dF90ICpwdHJhbnM7CQkvKiBQb29sIGZvciBwZXItdHJhbnNhY3Rpb24gc3R1ZmYgKi8KLSAgICBhcF9zb2NrZXRfdCAqc2QgPSBOVUxMOwotICAgIGludCBuOwotICAgIGludCBjdXJyX3BvbGxmZCwgbGFzdF9wb2xsZmQgPSAwOwotICAgIGFwX3BvbGxmZF90ICpwb2xsc2V0OwotICAgIGFwX3N0YXR1c190IHJ2OwotCi0gICAgZnJlZSh0aSk7Ci0KLSAgICBhcF9jcmVhdGVfY29udGV4dCgmcHRyYW5zLCB0cG9vbCk7Ci0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJndvcmtlcl90aHJlYWRfY291bnRfbXV0ZXgpOwotICAgIHdvcmtlcl90aHJlYWRfY291bnQrKzsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmd29ya2VyX3RocmVhZF9jb3VudF9tdXRleCk7Ci0KLSAgICBhcF9zZXR1cF9wb2xsKCZwb2xsc2V0LCBudW1fbGlzdGVuc29ja3MrMSwgdHBvb2wpOwotICAgIGZvcihuPTAgOyBuIDw9IG51bV9saXN0ZW5zb2NrcyA7ICsrbikKLQlhcF9hZGRfcG9sbF9zb2NrZXQocG9sbHNldCwgbGlzdGVuc29ja3Nbbl0sIEFQUl9QT0xMSU4pOwotCi0gICAgLyogVE9ETzogU3dpdGNoIHRvIGEgc3lzdGVtIHdoZXJlIHRocmVhZHMgcmV1c2UgdGhlIHJlc3VsdHMgZnJvbSBlYXJsaWVyCi0gICAgICAgcG9sbCBjYWxscyAtIG1hbm9qICovCi0gICAgd2hpbGUgKCF3b3JrZXJzX21heV9leGl0KSB7Ci0gICAgICAgIHdvcmtlcnNfbWF5X2V4aXQgfD0gKGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQgIT0gMCkgJiYgKHJlcXVlc3RzX3RoaXNfY2hpbGQgPD0gMCk7Ci0gICAgICAgIGlmICh3b3JrZXJzX21heV9leGl0KSBicmVhazsKLQotICAgICAgICAodm9pZCkgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhwcm9jZXNzX3Nsb3QsIHRocmVhZF9zbG90LCBTRVJWRVJfUkVBRFksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVxdWVzdF9yZWMgKikgTlVMTCk7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmdGhyZWFkX2FjY2VwdF9tdXRleCk7Ci0gICAgICAgIGlmICh3b3JrZXJzX21heV9leGl0KSB7Ci0gICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmdGhyZWFkX2FjY2VwdF9tdXRleCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoKHJ2ID0gU0FGRV9BQ0NFUFQoYXBfbG9jayhwcm9jZXNzX2FjY2VwdF9tdXRleCkpKQotICAgICAgICAgICAgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FTUVSRywgcnYsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICJhcF9sb2NrIGZhaWxlZC4gQXR0ZW1wdGluZyB0byBzaHV0ZG93biAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3MgZ3JhY2VmdWxseS4iKTsKLSAgICAgICAgICAgIHdvcmtlcnNfbWF5X2V4aXQgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKCF3b3JrZXJzX21heV9leGl0KSB7Ci0JICAgIGFwX3N0YXR1c190IHJldDsKLQkgICAgYXBfaW50MTZfdCBldmVudDsKLQotICAgICAgICAgICAgcmV0ID0gYXBfcG9sbChwb2xsc2V0LCAmbiwgLTEpOwotICAgICAgICAgICAgaWYgKHJldCAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gQVBSX0VJTlRSKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIHBvbGwoKSB3aWxsIG9ubHkgcmV0dXJuIGVycm9ycyBpbiBjYXRhc3Ryb3BoaWMKLSAgICAgICAgICAgICAgICAgKiBjaXJjdW1zdGFuY2VzLiBMZXQncyB0cnkgZXhpdGluZyBncmFjZWZ1bGx5LCBmb3Igbm93LiAqLwotICAgICAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGVycm5vLCAoY29uc3Qgc2VydmVyX3JlYyAqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcF9nZXRfc2VydmVyX2NvbmYoKSwgInBvbGw6IChsaXN0ZW4pIik7Ci0gICAgICAgICAgICAgICAgd29ya2Vyc19tYXlfZXhpdCA9IDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh3b3JrZXJzX21heV9leGl0KSBicmVhazsKLQotCSAgICBhcF9nZXRfcmV2ZW50cygmZXZlbnQsIGxpc3RlbnNvY2tzWzBdLCBwb2xsc2V0KTsKLSAgICAgICAgICAgIGlmIChldmVudCAmIEFQUl9QT0xMSU4pIHsKLSAgICAgICAgICAgICAgICAvKiBBIHByb2Nlc3MgZ290IGEgc2lnbmFsIG9uIHRoZSBzaHV0ZG93biBwaXBlLiBDaGVjayBpZiB3ZSdyZQotICAgICAgICAgICAgICAgICAqIHRoZSBsdWNreSBwcm9jZXNzIHRvIGRpZS4gKi8KLSAgICAgICAgICAgICAgICBjaGVja19waXBlX29mX2RlYXRoKCk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChudW1fbGlzdGVuc29ja3MgPT0gMSkgewotICAgICAgICAgICAgICAgIHNkID0gYXBfbGlzdGVuZXJzLT5zZDsKLSAgICAgICAgICAgICAgICBnb3RvIGdvdF9mZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8qIGZpbmQgYSBsaXN0ZW5lciAqLwotICAgICAgICAgICAgICAgIGN1cnJfcG9sbGZkID0gbGFzdF9wb2xsZmQ7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBjdXJyX3BvbGxmZCsrOwotICAgICAgICAgICAgICAgICAgICBpZiAoY3Vycl9wb2xsZmQgPiBudW1fbGlzdGVuc29ja3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJfcG9sbGZkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvKiBYWFg6IFNob3VsZCB3ZSBjaGVjayBmb3IgUE9MTEVSUj8gKi8KLQkJICAgIGFwX2dldF9yZXZlbnRzKCZldmVudCwgbGlzdGVuc29ja3NbY3Vycl9wb2xsZmRdLCBwb2xsc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50ICYgQVBSX1BPTExJTikgewotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9wb2xsZmQgPSBjdXJyX3BvbGxmZDsKLQkJCXNkPWxpc3RlbnNvY2tzW2N1cnJfcG9sbGZkXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZ290X2ZkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoY3Vycl9wb2xsZmQgIT0gbGFzdF9wb2xsZmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgZ290X2ZkOgotICAgICAgICBpZiAoIXdvcmtlcnNfbWF5X2V4aXQpIHsKLSAgICAgICAgICAgIGFwX2FjY2VwdCgmY3NkLCBzZCwgcHRyYW5zKTsKLSAgICAgICAgICAgIGlmICgocnYgPSBTQUZFX0FDQ0VQVChhcF91bmxvY2socHJvY2Vzc19hY2NlcHRfbXV0ZXgpKSkKLSAgICAgICAgICAgICAgICAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FTUVSRywgcnYsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXBfdW5sb2NrIGZhaWxlZC4gQXR0ZW1wdGluZyB0byBzaHV0ZG93biAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzIGdyYWNlZnVsbHkuIik7Ci0gICAgICAgICAgICAgICAgd29ya2Vyc19tYXlfZXhpdCA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmdGhyZWFkX2FjY2VwdF9tdXRleCk7Ci0gICAgICAgICAgICBwcm9jZXNzX3NvY2tldChwdHJhbnMsIGNzZCwgcHJvY2Vzc19zbG90LCB0aHJlYWRfc2xvdCk7Ci0gICAgICAgICAgICByZXF1ZXN0c190aGlzX2NoaWxkLS07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAoKHJ2ID0gU0FGRV9BQ0NFUFQoYXBfdW5sb2NrKHByb2Nlc3NfYWNjZXB0X211dGV4KSkpCi0gICAgICAgICAgICAgICAgIT0gQVBSX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkcsIHJ2LCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwX3VubG9jayBmYWlsZWQuIEF0dGVtcHRpbmcgdG8gc2h1dGRvd24gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvY2VzcyBncmFjZWZ1bGx5LiIpOwotICAgICAgICAgICAgICAgIHdvcmtlcnNfbWF5X2V4aXQgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnRocmVhZF9hY2NlcHRfbXV0ZXgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYXBfY2xlYXJfcG9vbChwdHJhbnMpOwotICAgIH0KLQotICAgIGFwX2Rlc3Ryb3lfcG9vbCh0cG9vbCk7Ci0gICAgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhwcm9jZXNzX3Nsb3QsIHRocmVhZF9zbG90LCBTRVJWRVJfREVBRCwKLSAgICAgICAgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmd29ya2VyX3RocmVhZF9jb3VudF9tdXRleCk7Ci0gICAgd29ya2VyX3RocmVhZF9jb3VudC0tOwotICAgIGlmICh3b3JrZXJfdGhyZWFkX2NvdW50ID09IDApIHsKLSAgICAgICAgLyogQWxsIHRoZSB0aHJlYWRzIGhhdmUgZXhpdGVkLCBub3cgZmluaXNoIHRoZSBzaHV0ZG93biBwcm9jZXNzCi0gICAgICAgICAqIGJ5IHNpZ25hbGxpbmcgdGhlIHNpZ3dhaXQgdGhyZWFkICovCi0gICAgICAgIGtpbGwobXlfcGlkLCBTSUdURVJNKTsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJndvcmtlcl90aHJlYWRfY291bnRfbXV0ZXgpOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljIHZvaWQgY2hpbGRfbWFpbihpbnQgY2hpbGRfbnVtX2FyZykKLXsKLSAgICBzaWdzZXRfdCBzaWdfbWFzazsKLSAgICBpbnQgc2lnbmFsX3JlY2VpdmVkOwotICAgIHB0aHJlYWRfdCB0aHJlYWQ7Ci0gICAgcHRocmVhZF9hdHRyX3QgdGhyZWFkX2F0dHI7Ci0gICAgaW50IGk7Ci0gICAgaW50IG15X2NoaWxkX251bSA9IGNoaWxkX251bV9hcmc7Ci0gICAgcHJvY19pbmZvICpteV9pbmZvID0gTlVMTDsKLSAgICBhcF9saXN0ZW5fcmVjICpscjsKLSAgICBhcF9zdGF0dXNfdCBydjsKLQotCi0gICAgbXlfcGlkID0gZ2V0cGlkKCk7Ci0gICAgYXBfY3JlYXRlX2NvbnRleHQoJnBjaGlsZCwgcGNvbmYpOwotCi0gICAgLypzdHVmZiB0byBkbyBiZWZvcmUgd2Ugc3dpdGNoIGlkJ3MsIHNvIHdlIGhhdmUgcGVybWlzc2lvbnMuKi8KLSAgICByZW9wZW5fc2NvcmVib2FyZChwY2hpbGQpOwotCi0gICAgcnYgPSBTQUZFX0FDQ0VQVChhcF9jaGlsZF9pbml0X2xvY2soJnByb2Nlc3NfYWNjZXB0X211dGV4LCBsb2NrX2ZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgcGNoaWxkKSk7Ci0gICAgaWYgKHJ2ICE9IEFQUl9TVUNDRVNTKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FTUVSRywgcnYsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGluaXRpYWxpemUgY3Jvc3MtcHJvY2VzcyBsb2NrIGluIGNoaWxkIik7Ci0gICAgICAgIGNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotICAgIH0KLQotICAgIGlmICh1bml4ZF9zZXR1cF9jaGlsZCgpKSB7Ci0JY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotCi0gICAgYXBfY2hpbGRfaW5pdF9ob29rKHBjaGlsZCwgc2VydmVyX2NvbmYpOwotCi0gICAgLypkb25lIHdpdGggaW5pdCBjcml0aWNhbCBzZWN0aW9uICovCi0KLSAgICAvKiBBbGwgdGhyZWFkcyBzaG91bGQgbWFzayBzaWduYWxzIG91dCwgYWNjb3JpbmcgdG8gc2lnd2FpdCgyKSBtYW4gcGFnZSAqLwotICAgIHNpZ2ZpbGxzZXQoJnNpZ19tYXNrKTsKLQotICAgIGlmIChwdGhyZWFkX3NpZ21hc2soU0lHX1NFVE1BU0ssICZzaWdfbWFzaywgTlVMTCkgIT0gMCkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlQsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInB0aHJlYWRfc2lnbWFzayIpOwotICAgIH0KLQotICAgIHJlcXVlc3RzX3RoaXNfY2hpbGQgPSBhcF9tYXhfcmVxdWVzdHNfcGVyX2NoaWxkOwotICAgIAotICAgIC8qIFNldCB1cCB0aGUgcG9sbGZkIGFycmF5ICovCi0gICAgbGlzdGVuc29ja3MgPSBhcF9wYWxsb2MocGNoaWxkLAotCQkJICAgIHNpemVvZigqbGlzdGVuc29ja3MpICogKG51bV9saXN0ZW5zb2NrcyArIDEpKTsKLSAgICBhcF9jcmVhdGVfdGNwX3NvY2tldCgmbGlzdGVuc29ja3NbMF0sIHBjaGlsZCk7Ci0gICAgYXBfcHV0X29zX3NvY2soJmxpc3RlbnNvY2tzWzBdLCAmcGlwZV9vZl9kZWF0aFswXSwgcGNoaWxkKTsKLSAgICBmb3IgKGxyID0gYXBfbGlzdGVuZXJzLCBpID0gMTsgaSA8PSBudW1fbGlzdGVuc29ja3M7IGxyID0gbHItPm5leHQsICsraSkKLQlsaXN0ZW5zb2Nrc1tpXT1sci0+c2Q7Ci0KLSAgICAvKiBTZXR1cCB3b3JrZXIgdGhyZWFkcyAqLwotCi0gICAgd29ya2VyX3RocmVhZF9jb3VudCA9IDA7Ci0gICAgcHRocmVhZF9tdXRleF9pbml0KCZ3b3JrZXJfdGhyZWFkX2NvdW50X211dGV4LCBOVUxMKTsKLSAgICBwdGhyZWFkX211dGV4X2luaXQoJnBpcGVfb2ZfZGVhdGhfbXV0ZXgsIE5VTEwpOwotICAgIHB0aHJlYWRfYXR0cl9pbml0KCZ0aHJlYWRfYXR0cik7Ci0gICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZ0aHJlYWRfYXR0ciwgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpOwotICAgIGZvciAoaT0wOyBpIDwgYXBfdGhyZWFkc19wZXJfY2hpbGQ7IGkrKykgewotCi0JbXlfaW5mbyA9IChwcm9jX2luZm8gKiltYWxsb2Moc2l6ZW9mKHByb2NfaW5mbykpOwotICAgICAgICBpZiAobXlfaW5mbyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlQsIGVycm5vLCBzZXJ2ZXJfY29uZiwKLQkJICAgICAgICAgIm1hbGxvYzogb3V0IG9mIG1lbW9yeSIpOwotICAgICAgICAgICAgY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgICAgIH0KLQlteV9pbmZvLT5waWQgPSBteV9jaGlsZF9udW07Ci0gICAgICAgIG15X2luZm8tPnRpZCA9IGk7Ci0JbXlfaW5mby0+c2QgPSAwOwotCWFwX2NyZWF0ZV9jb250ZXh0KCZteV9pbmZvLT50cG9vbCwgcGNoaWxkKTsKLQkKLQkvKiBXZSBhcmUgY3JlYXRpbmcgdGhyZWFkcyByaWdodCBub3cgKi8KLQkodm9pZCkgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhteV9jaGlsZF9udW0sIGksIFNFUlZFUl9TVEFSVElORywgCi0JCQkJICAgICAgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotI2lmbmRlZiBOT19USFJFQURTCi0JaWYgKHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWQsICZ0aHJlYWRfYXR0ciwgd29ya2VyX3RocmVhZCwgbXlfaW5mbykpIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJULCBlcnJubywgc2VydmVyX2NvbmYsCi0JCQkgInB0aHJlYWRfY3JlYXRlOiB1bmFibGUgdG8gY3JlYXRlIHdvcmtlciB0aHJlYWQiKTsKLSAgICAgICAgICAgIC8qIEluIGNhc2Ugc3lzdGVtIHJlc291cmNlcyBhcmUgbWF4eGVkIG91dCwgd2UgZG9uJ3Qgd2FudAotICAgICAgICAgICAgICAgQXBhY2hlIHJ1bm5pbmcgYXdheSB3aXRoIHRoZSBDUFUgdHJ5aW5nIHRvIGZvcmsgb3ZlciBhbmQKLSAgICAgICAgICAgICAgIG92ZXIgYW5kIG92ZXIgYWdhaW4gaWYgd2UgZXhpdC4gKi8KLSAgICAgICAgICAgIHNsZWVwKDEwKTsKLQkgICAgY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0JfQotI2Vsc2UKLQl3b3JrZXJfdGhyZWFkKG15X2luZm8pOwotCS8qIFRoZSBTSUdURVJNIHNob3VsZG4ndCBsZXQgdXMgcmVhY2ggdGhpcyBwb2ludCwgYnV0IGp1c3QgaW4gY2FzZS4uLiAqLwotCWNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX09LKTsKLSNlbmRpZgotCi0JLyogV2UgbGV0IGVhY2ggdGhyZWFkIHVwZGF0ZSBpdCdzIG93biBzY29yZWJvYXJkIGVudHJ5LiAgVGhpcyBpcyBkb25lCi0JICogYmVjYXVzZSBpdCBsZXQncyB1cyBkZWFsIHdpdGggdGlkIGJldHRlci4KLQkgKi8KLSAgICB9Ci0KLSAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmdGhyZWFkX2F0dHIpOwotCi0gICAgLyogVGhpcyB0aHJlYWQgd2lsbCBiZSB0aGUgb25lIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyBzaWduYWxzICovCi0gICAgc2lnZW1wdHlzZXQoJnNpZ19tYXNrKTsKLSAgICBzaWdhZGRzZXQoJnNpZ19tYXNrLCBTSUdURVJNKTsKLSAgICBzaWdhZGRzZXQoJnNpZ19tYXNrLCBTSUdJTlQpOwotICAgIHNpZ3dhaXQoJnNpZ19tYXNrLCAmc2lnbmFsX3JlY2VpdmVkKTsKLSAgICBzd2l0Y2ggKHNpZ25hbF9yZWNlaXZlZCkgewotICAgICAgICBjYXNlIFNJR1RFUk06Ci0gICAgICAgIGNhc2UgU0lHSU5UOgotICAgICAgICAgICAganVzdF9kaWUoc2lnbmFsX3JlY2VpdmVkKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJULCBlcnJubywgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAicmVjZWl2ZWQgaW1wb3NzaWJsZSBzaWduYWw6ICVkIiwgc2lnbmFsX3JlY2VpdmVkKTsKLSAgICAgICAgICAgIGp1c3RfZGllKFNJR1RFUk0pOwotICAgIH0KLX0KLQotc3RhdGljIGludCBtYWtlX2NoaWxkKHNlcnZlcl9yZWMgKnMsIGludCBzbG90LCB0aW1lX3Qgbm93KSAKLXsKLSAgICBpbnQgcGlkOwotCi0gICAgaWYgKHNsb3QgKyAxID4gbWF4X2RhZW1vbnNfbGltaXQpIHsKLQltYXhfZGFlbW9uc19saW1pdCA9IHNsb3QgKyAxOwotICAgIH0KLQotICAgIGlmIChvbmVfcHJvY2VzcykgewotCXNldF9zaWduYWxzKCk7Ci0gICAgICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtzbG90XS5waWQgPSBnZXRwaWQoKTsKLQljaGlsZF9tYWluKHNsb3QpOwotICAgIH0KLQotICAgIC8qIFRhZyB0aGlzIHNsb3QgYXMgb2NjdXBpZWQgc28gdGhhdCBwZXJmb3JtX2lkbGVfc2VydmVyX21haW50ZW5hbmNlCi0gICAgICogZG9lc24ndCB0cnkgdG8gc3RlYWwgaXQgKi8KLSAgICAodm9pZCkgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhzbG90LCAwLCBTRVJWRVJfU1RBUlRJTkcsIChyZXF1ZXN0X3JlYyAqKSBOVUxMKTsKLQotICAgIGlmICgocGlkID0gZm9yaygpKSA9PSAtMSkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgcywgImZvcms6IFVuYWJsZSB0byBmb3JrIG5ldyBwcm9jZXNzIik7Ci0KLSAgICAgICAgLyogZm9yayBkaWRuJ3Qgc3VjY2VlZC4gRml4IHRoZSBzY29yZWJvYXJkIG9yIGVsc2UKLSAgICAgICAgICogaXQgd2lsbCBzYXkgU0VSVkVSX1NUQVJUSU5HIGZvcmV2ZXIgYW5kIGV2ZXIKLSAgICAgICAgICovCi0gICAgICAgICh2b2lkKSBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKHNsb3QsIDAsIFNFUlZFUl9ERUFELCAocmVxdWVzdF9yZWMgKikgTlVMTCk7Ci0KLQkvKiBJbiBjYXNlIHN5c3RlbSByZXNvdXJjZXMgYXJlIG1heHhlZCBvdXQsIHdlIGRvbid0IHdhbnQKLQkgICBBcGFjaGUgcnVubmluZyBhd2F5IHdpdGggdGhlIENQVSB0cnlpbmcgdG8gZm9yayBvdmVyIGFuZAotCSAgIG92ZXIgYW5kIG92ZXIgYWdhaW4uICovCi0Jc2xlZXAoMTApOwotCi0JcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGlmICghcGlkKSB7Ci0jaWZkZWYgQUlYX0JJTkRfUFJPQ0VTU09SCi0gICAgICAvKiBCeSBkZWZhdWx0LCBBSVggYmluZHMgdG8gYSBzaW5nbGUgcHJvY2Vzc29yLiAgVGhpcyBiaXQgdW5iaW5kcwotCSBjaGlsZHJlbiB3aGljaCB3aWxsIHRoZW4gYmluZCB0byBhbm90aGVyIENQVS4KLSAgICAgICovCi0jaW5jbHVkZSA8c3lzL3Byb2Nlc3Nvci5oPgotICAgICAgICBpbnQgc3RhdHVzID0gYmluZHByb2Nlc3NvcihCSU5EUFJPQ0VTUywgKGludClnZXRwaWQoKSwKLQkJCSAgICAgICBQUk9DRVNTT1JfQ0xBU1NfQU5ZKTsKLQlpZiAoc3RhdHVzICE9IE9LKQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLCBzZXJ2ZXJfY29uZiwKLQkJCSAicHJvY2Vzc29yIHVuYmluZCBmYWlsZWQgJWQiLCBzdGF0dXMpOwotI2VuZGlmCi0KLSAgICAgICAgUkFJU0VfU0lHU1RPUChNQUtFX0NISUxEKTsKLQotICAgICAgICBzaWduYWwoU0lHVEVSTSwganVzdF9kaWUpOwotICAgICAgICBjaGlsZF9tYWluKHNsb3QpOwotCi0JcmV0dXJuIDA7Ci0gICAgfQotICAgIC8qIGVsc2UgKi8KLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnRbc2xvdF0ucGlkID0gcGlkOwotICAgIHJldHVybiAwOwotfQotCi0vKiBzdGFydCB1cCBhIGJ1bmNoIG9mIGNoaWxkcmVuICovCi1zdGF0aWMgdm9pZCBzdGFydHVwX2NoaWxkcmVuKGludCBudW1iZXJfdG9fc3RhcnQpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBudW1iZXJfdG9fc3RhcnQgJiYgaSA8IGFwX2RhZW1vbnNfbGltaXQ7ICsraSkgewotCWlmIChhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnRbaV0ucGlkICE9IDApIHsKLQkgICAgY29udGludWU7Ci0JfQotCWlmIChtYWtlX2NoaWxkKHNlcnZlcl9jb25mLCBpLCAwKSA8IDApIHsKLQkgICAgYnJlYWs7Ci0JfQotCS0tbnVtYmVyX3RvX3N0YXJ0OwotICAgIH0KLX0KLQotCi0vKgotICogaWRsZV9zcGF3bl9yYXRlIGlzIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCB3aWxsIGJlIHNwYXduZWQgb24gdGhlCi0gKiBuZXh0IG1haW50ZW5hbmNlIGN5Y2xlIGlmIHRoZXJlIGFyZW4ndCBlbm91Z2ggaWRsZSBzZXJ2ZXJzLiAgSXQgaXMKLSAqIGRvdWJsZWQgdXAgdG8gTUFYX1NQQVdOX1JBVEUsIGFuZCByZXNldCBvbmx5IHdoZW4gYSBjeWNsZSBnb2VzIGJ5Ci0gKiB3aXRob3V0IHRoZSBuZWVkIHRvIHNwYXduLgotICovCi1zdGF0aWMgaW50IGlkbGVfc3Bhd25fcmF0ZSA9IDE7Ci0jaWZuZGVmIE1BWF9TUEFXTl9SQVRFCi0jZGVmaW5lIE1BWF9TUEFXTl9SQVRFCSgzMikKLSNlbmRpZgotc3RhdGljIGludCBob2xkX29mZl9vbl9leHBvbmVudGlhbF9zcGF3bmluZzsKLQotc3RhdGljIHZvaWQgcGVyZm9ybV9pZGxlX3NlcnZlcl9tYWludGVuYW5jZSh2b2lkKQotewotICAgIGludCBpLCBqOwotICAgIGludCBpZGxlX3RocmVhZF9jb3VudDsKLSAgICB0aHJlYWRfc2NvcmUgKnNzOwotICAgIHRpbWVfdCBub3cgPSAwOwotICAgIGludCBmcmVlX2xlbmd0aDsKLSAgICBpbnQgZnJlZV9zbG90c1tNQVhfU1BBV05fUkFURV07Ci0gICAgaW50IGxhc3Rfbm9uX2RlYWQ7Ci0gICAgaW50IHRvdGFsX25vbl9kZWFkOwotCi0gICAgLyogaW5pdGlhbGl6ZSB0aGUgZnJlZV9saXN0ICovCi0gICAgZnJlZV9sZW5ndGggPSAwOwotCi0gICAgaWRsZV90aHJlYWRfY291bnQgPSAwOwotICAgIGxhc3Rfbm9uX2RlYWQgPSAtMTsKLSAgICB0b3RhbF9ub25fZGVhZCA9IDA7Ci0KLSAgICBhcF9zeW5jX3Njb3JlYm9hcmRfaW1hZ2UoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgYXBfZGFlbW9uc19saW1pdDsgKytpKSB7Ci0JLyogSW5pdGlhbGl6YXRpb24gdG8gc2F0aXNmeSB0aGUgY29tcGlsZXIuIEl0IGRvZXNuJ3Qga25vdwotCSAqIHRoYXQgYXBfdGhyZWFkc19wZXJfY2hpbGQgaXMgYWx3YXlzID4gMCAqLwotCWludCBzdGF0dXMgPSBTRVJWRVJfREVBRDsKLQlpbnQgYW55X2R5aW5nX3RocmVhZHMgPSAwOwotCWludCBhbGxfZGVhZF90aHJlYWRzID0gMTsKLQlpbnQgaWRsZV90aHJlYWRfYWRkaXRpb24gPSAwOwotCi0JaWYgKGkgPj0gbWF4X2RhZW1vbnNfbGltaXQgJiYgZnJlZV9sZW5ndGggPT0gaWRsZV9zcGF3bl9yYXRlKQotCSAgICBicmVhazsKLQlmb3IgKGogPSAwOyBqIDwgYXBfdGhyZWFkc19wZXJfY2hpbGQ7IGorKykgewotICAgICAgICAgICAgc3MgPSAmYXBfc2NvcmVib2FyZF9pbWFnZS0+c2VydmVyc1tpXVtqXTsKLQkgICAgc3RhdHVzID0gc3MtPnN0YXR1czsKLQotCSAgICBhbnlfZHlpbmdfdGhyZWFkcyA9IGFueV9keWluZ190aHJlYWRzIHx8IChzdGF0dXMgPT0gU0VSVkVSX0RFQUQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoc3RhdHVzID09IFNFUlZFUl9HUkFDRUZVTCk7Ci0JICAgIGFsbF9kZWFkX3RocmVhZHMgPSBhbGxfZGVhZF90aHJlYWRzICYmIChzdGF0dXMgPT0gU0VSVkVSX0RFQUQpOwotCi0JICAgIC8qIFdlIGNvbnNpZGVyIGEgc3RhcnRpbmcgc2VydmVyIGFzIGlkbGUgYmVjYXVzZSB3ZSBzdGFydGVkIGl0Ci0JICAgICAqIGF0IGxlYXN0IGEgY3ljbGUgYWdvLCBhbmQgaWYgaXQgc3RpbGwgaGFzbid0IGZpbmlzaGVkIHN0YXJ0aW5nCi0JICAgICAqIHRoZW4gd2UncmUganVzdCBnb2luZyB0byBzd2FtcCB0aGluZ3Mgd29yc2UgYnkgZm9ya2luZyBtb3JlLgotCSAgICAgKiBTbyB3ZSBob3BlZnVsbHkgd29uJ3QgbmVlZCB0byBmb3JrIG1vcmUgaWYgd2UgY291bnQgaXQuCi0JICAgICAqIFRoaXMgZGVwZW5kcyBvbiB0aGUgb3JkZXJpbmcgb2YgU0VSVkVSX1JFQURZIGFuZCBTRVJWRVJfU1RBUlRJTkcuCi0JICAgICAqLwotCSAgICBpZiAoc3RhdHVzIDw9IFNFUlZFUl9SRUFEWSkgewotCSAgICAgICAgKytpZGxlX3RocmVhZF9hZGRpdGlvbjsKLQkgICAgfQotCX0KLQlpZiAoYWxsX2RlYWRfdGhyZWFkcyAmJiBmcmVlX2xlbmd0aCA8IGlkbGVfc3Bhd25fcmF0ZSkgewotCSAgICBmcmVlX3Nsb3RzW2ZyZWVfbGVuZ3RoXSA9IGk7Ci0JICAgICsrZnJlZV9sZW5ndGg7Ci0JfQotCWlmICghYWxsX2RlYWRfdGhyZWFkcykgewotICAgICAgICAgICAgbGFzdF9ub25fZGVhZCA9IGk7Ci0JfQotICAgICAgICBpZiAoIWFueV9keWluZ190aHJlYWRzKSB7Ci0gICAgICAgICAgICArK3RvdGFsX25vbl9kZWFkOwotCSAgICBpZGxlX3RocmVhZF9jb3VudCArPSBpZGxlX3RocmVhZF9hZGRpdGlvbjsKLSAgICAgICAgfQotICAgIH0KLSAgICBtYXhfZGFlbW9uc19saW1pdCA9IGxhc3Rfbm9uX2RlYWQgKyAxOwotCi0gICAgaWYgKGlkbGVfdGhyZWFkX2NvdW50ID4gbWF4X3NwYXJlX3RocmVhZHMpIHsKLSAgICAgICAgLyogS2lsbCBvZmYgb25lIGNoaWxkICovCi0gICAgICAgIGNoYXIgY2hhcl9vZl9kZWF0aCA9ICchJzsKLSAgICAgICAgaWYgKHdyaXRlKHBpcGVfb2ZfZGVhdGhbMV0sICZjaGFyX29mX2RlYXRoLCAxKSA9PSAtMSkgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgIndyaXRlIHBpcGVfb2ZfZGVhdGgiKTsKLSAgICAgICAgfQotICAgICAgICBpZGxlX3NwYXduX3JhdGUgPSAxOwotICAgIH0KLSAgICBlbHNlIGlmIChpZGxlX3RocmVhZF9jb3VudCA8IG1pbl9zcGFyZV90aHJlYWRzKSB7Ci0gICAgICAgIC8qIHRlcm1pbmF0ZSB0aGUgZnJlZSBsaXN0ICovCi0gICAgICAgIGlmIChmcmVlX2xlbmd0aCA9PSAwKSB7Ci0JICAgIC8qIG9ubHkgcmVwb3J0IHRoaXMgY29uZGl0aW9uIG9uY2UgKi8KLQkgICAgc3RhdGljIGludCByZXBvcnRlZCA9IDA7Ci0JICAgIAotCSAgICBpZiAoIXJlcG9ydGVkKSB7Ci0JICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHNlcnZlcl9jb25mLAotCQkJICAgICAic2VydmVyIHJlYWNoZWQgTWF4Q2xpZW50cyBzZXR0aW5nLCBjb25zaWRlciIKLQkJCSAgICAgIiByYWlzaW5nIHRoZSBNYXhDbGllbnRzIHNldHRpbmciKTsKLQkJcmVwb3J0ZWQgPSAxOwotCSAgICB9Ci0JICAgIGlkbGVfc3Bhd25fcmF0ZSA9IDE7Ci0JfQotCWVsc2UgewotCSAgICAKLQkgICAgaWYgKGlkbGVfc3Bhd25fcmF0ZSA+PSA4KSB7Ci0JICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19JTkZPLCAwLCBzZXJ2ZXJfY29uZiwKLQkJCSAgICAgInNlcnZlciBzZWVtcyBidXN5LCAoeW91IG1heSBuZWVkICIKLQkJCSAgICAgInRvIGluY3JlYXNlIFN0YXJ0U2VydmVycywgVGhyZWFkc1BlckNoaWxkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yIE1pbi9NYXhTcGFyZXRUaHJlYWRzKSwgIgotCQkJICAgICAic3Bhd25pbmcgJWQgY2hpbGRyZW4sIHRoZXJlIGFyZSBhcm91bmQgJWQgaWRsZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRzLCBhbmQgJWQgdG90YWwgY2hpbGRyZW4iLCBpZGxlX3NwYXduX3JhdGUsCi0JCQkgICAgIGlkbGVfdGhyZWFkX2NvdW50LCB0b3RhbF9ub25fZGVhZCk7Ci0JICAgIH0KLQkgICAgZm9yIChpID0gMDsgaSA8IGZyZWVfbGVuZ3RoOyArK2kpIHsKLQkgICAgICAgIG1ha2VfY2hpbGQoc2VydmVyX2NvbmYsIGZyZWVfc2xvdHNbaV0sIG5vdyk7Ci0JICAgIH0KLQkgICAgLyogdGhlIG5leHQgdGltZSBhcm91bmQgd2Ugd2FudCB0byBzcGF3biB0d2ljZSBhcyBtYW55IGlmIHRoaXMKLQkgICAgICogd2Fzbid0IGdvb2QgZW5vdWdoLCBidXQgbm90IGlmIHdlJ3ZlIGp1c3QgZG9uZSBhIGdyYWNlZnVsCi0JICAgICAqLwotCSAgICBpZiAoaG9sZF9vZmZfb25fZXhwb25lbnRpYWxfc3Bhd25pbmcpIHsKLQkgICAgICAgIC0taG9sZF9vZmZfb25fZXhwb25lbnRpYWxfc3Bhd25pbmc7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoaWRsZV9zcGF3bl9yYXRlIDwgTUFYX1NQQVdOX1JBVEUpIHsKLQkgICAgICAgIGlkbGVfc3Bhd25fcmF0ZSAqPSAyOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGlkbGVfc3Bhd25fcmF0ZSA9IDE7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBzZXJ2ZXJfbWFpbl9sb29wKGludCByZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQpCi17Ci0gICAgaW50IGNoaWxkX3Nsb3Q7Ci0gICAgYXBfd2FpdF90IHN0YXR1czsKLSAgICBpbnQgcGlkOwotICAgIGludCBpOwotCi0gICAgd2hpbGUgKCFyZXN0YXJ0X3BlbmRpbmcgJiYgIXNodXRkb3duX3BlbmRpbmcpIHsKLSAgICAgICAgcGlkID0gd2FpdF9vcl90aW1lb3V0KCZzdGF0dXMpOwotICAgICAgICAKLSAgICAgICAgaWYgKHBpZCA+PSAwKSB7Ci0gICAgICAgICAgICBwcm9jZXNzX2NoaWxkX3N0YXR1cyhwaWQsIHN0YXR1cyk7Ci0gICAgICAgICAgICAvKiBub24tZmF0YWwgZGVhdGguLi4gbm90ZSB0aGF0IGl0J3MgZ29uZSBpbiB0aGUgc2NvcmVib2FyZC4gKi8KLSAgICAgICAgICAgIGNoaWxkX3Nsb3QgPSBmaW5kX2NoaWxkX2J5X3BpZChwaWQpOwotICAgICAgICAgICAgaWYgKGNoaWxkX3Nsb3QgPj0gMCkgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcF90aHJlYWRzX3Blcl9jaGlsZDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKGNoaWxkX3Nsb3QsIGksIFNFUlZFUl9ERUFELCAocmVxdWVzdF9yZWMgKikgTlVMTCk7Ci0gICAgICAgICAgICAgICAgCi0JCWlmIChyZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQKLQkJICAgICYmIGNoaWxkX3Nsb3QgPCBhcF9kYWVtb25zX2xpbWl0KSB7Ci0JCSAgICAvKiB3ZSdyZSBzdGlsbCBkb2luZyBhIDEtZm9yLTEgcmVwbGFjZW1lbnQgb2YgZGVhZAotICAgICAgICAgICAgICAgICAgICAgKiBjaGlsZHJlbiB3aXRoIG5ldyBjaGlsZHJlbgotICAgICAgICAgICAgICAgICAgICAgKi8KLQkJICAgIG1ha2VfY2hpbGQoc2VydmVyX2NvbmYsIGNoaWxkX3Nsb3QsIHRpbWUoTlVMTCkpOwotCQkgICAgLS1yZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQ7Ci0JCX0KLSNpZmRlZiBIQVNfT1RIRVJfQ0hJTEQKLQkgICAgfQotCSAgICBlbHNlIGlmIChyZWFwX290aGVyX2NoaWxkKHBpZCwgc3RhdHVzKSA9PSAwKSB7Ci0JCS8qIGhhbmRsZWQgKi8KLSNlbmRpZgotCSAgICB9Ci0JICAgIGVsc2UgaWYgKGlzX2dyYWNlZnVsKSB7Ci0JCS8qIEdyZWF0LCB3ZSd2ZSBwcm9iYWJseSBqdXN0IGxvc3QgYSBzbG90IGluIHRoZQotCQkgICAgKiBzY29yZWJvYXJkLiAgU29tZWhvdyB3ZSBkb24ndCBrbm93IGFib3V0IHRoaXMKLQkJICAgICogY2hpbGQuCi0JCSAgICAqLwotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLCAwLCBzZXJ2ZXJfY29uZiwKLQkJCSAgICAibG9uZyBsb3N0IGNoaWxkIGNhbWUgaG9tZSEgKHBpZCAlZCkiLCBwaWQpOwotCSAgICB9Ci0JICAgIC8qIERvbid0IHBlcmZvcm0gaWRsZSBtYWludGVuYW5jZSB3aGVuIGEgY2hpbGQgZGllcywKLSAgICAgICAgICAgICAqIG9ubHkgZG8gaXQgd2hlbiB0aGVyZSdzIGEgdGltZW91dC4gIFJlbWVtYmVyIG9ubHkgYQotICAgICAgICAgICAgICogZmluaXRlIG51bWJlciBvZiBjaGlsZHJlbiBjYW4gZGllLCBhbmQgaXQncyBwcmV0dHkKLSAgICAgICAgICAgICAqIHBhdGhvbG9naWNhbCBmb3IgYSBsb3QgdG8gZGllIHN1ZGRlbmx5LgotICAgICAgICAgICAgICovCi0JICAgIGNvbnRpbnVlOwotCX0KLQllbHNlIGlmIChyZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQpIHsKLQkgICAgLyogd2UgaGl0IGEgMSBzZWNvbmQgdGltZW91dCBpbiB3aGljaCBub25lIG9mIHRoZSBwcmV2aW91cwotCSAgICAgKiBnZW5lcmF0aW9uIG9mIGNoaWxkcmVuIG5lZWRlZCB0byBiZSByZWFwZWQuLi4gc28gYXNzdW1lCi0JICAgICAqIHRoZXkncmUgYWxsIGRvbmUsIGFuZCBwaWNrIHVwIHRoZSBzbGFjayBpZiBhbnkgaXMgbGVmdC4KLQkgICAgICovCi0JICAgIHN0YXJ0dXBfY2hpbGRyZW4ocmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0KTsKLQkgICAgcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0ID0gMDsKLQkgICAgLyogSW4gYW55IGV2ZW50IHdlIHJlYWxseSBzaG91bGRuJ3QgZG8gdGhlIGNvZGUgYmVsb3cgYmVjYXVzZQotCSAgICAgKiBmZXcgb2YgdGhlIHNlcnZlcnMgd2UganVzdCBzdGFydGVkIGFyZSBpbiB0aGUgSURMRSBzdGF0ZQotCSAgICAgKiB5ZXQsIHNvIHdlJ2QgbWlzdGFrZW5seSBjcmVhdGUgYW4gZXh0cmEgc2VydmVyLgotCSAgICAgKi8KLQkgICAgY29udGludWU7Ci0JfQotCi0JcGVyZm9ybV9pZGxlX3NlcnZlcl9tYWludGVuYW5jZSgpOwotICAgIH0KLX0KLQotaW50IGFwX21wbV9ydW4oYXBfY29udGV4dF90ICpfcGNvbmYsIGFwX2NvbnRleHRfdCAqcGxvZywgc2VydmVyX3JlYyAqcykKLXsKLSAgICBpbnQgcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0OwotICAgIGFwX3N0YXR1c190IHJ2OwotCi0gICAgcGNvbmYgPSBfcGNvbmY7Ci0gICAgc2VydmVyX2NvbmYgPSBzOwotICAgIGlmIChwaXBlKHBpcGVfb2ZfZGVhdGgpID09IC0xKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGVycm5vLAotICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHNlcnZlcl9yZWMqKSBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJwaXBlOiAocGlwZV9vZl9kZWF0aCkiKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0vKiAgWFhYWFhYICBSZW1vdmVkIGJlY2F1c2UgdGhlc2UgZnVuY3Rpb25zIGRvbid0IGV4aXN0IGFueW1vcmUuICBXaGVuCi0gICAgVGhlc2UgcGlwZXMgYXJlIGNoYW5nZWQgdG8gYXByX3R5cGVzLCB0aGVzZSBmdW5jdGlvbnMgd29uJ3QgYmUgbmVlZGVkCi0gICAgYW55d2F5LgotICAgIGFwX25vdGVfY2xlYW51cHNfZm9yX2ZkKHBjb25mLCBwaXBlX29mX2RlYXRoWzBdKTsKLSAgICBhcF9ub3RlX2NsZWFudXBzX2Zvcl9mZChwY29uZiwgcGlwZV9vZl9kZWF0aFsxXSk7Ci0qLwotCi0gICAgaWYgKGZjbnRsKHBpcGVfb2ZfZGVhdGhbMF0sIEZfU0VURkQsIE9fTk9OQkxPQ0spID09IC0xKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGVycm5vLAotICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHNlcnZlcl9yZWMqKSBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJmY250bDogT19OT05CTE9DS2luZyAocGlwZV9vZl9kZWF0aCkiKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgc2VydmVyX2NvbmYgPSBzOwotICAgIGlmICgobnVtX2xpc3RlbnNvY2tzID0gc2V0dXBfbGlzdGVuZXJzKHNlcnZlcl9jb25mKSkgPCAxKSB7Ci0gICAgICAgIC8qIFhYWDogaGV5LCB3aGF0J3MgdGhlIHJpZ2h0IHdheSBmb3IgdGhlIG1wbSB0byBpbmRpY2F0ZSBhIGZhdGFsIGVycm9yPyAqLwotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19BTEVSVCwgMCwgcywKLSAgICAgICAgICAgICJubyBsaXN0ZW5pbmcgc29ja2V0cyBhdmFpbGFibGUsIHNodXR0aW5nIGRvd24iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGFwX2xvZ19waWQocGNvbmYsIGFwX3BpZF9mbmFtZSk7Ci0KLSAgICAvKiBJbml0aWFsaXplIGNyb3NzLXByb2Nlc3MgYWNjZXB0IGxvY2sgKi8KLSAgICBsb2NrX2ZuYW1lID0gYXBfcHNwcmludGYoX3Bjb25mLCAiJXMuJWx1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUoX3Bjb25mLCBsb2NrX2ZuYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfcGlkKTsKLSAgICBydiA9IGFwX2NyZWF0ZV9sb2NrKCZwcm9jZXNzX2FjY2VwdF9tdXRleCwgQVBSX01VVEVYLCBBUFJfQ1JPU1NfUFJPQ0VTUywKLSAgICAgICAgICAgICAgICAgICBsb2NrX2ZuYW1lLCBfcGNvbmYpOwotICAgIGlmIChydiAhPSBBUFJfU1VDQ0VTUykgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkcsIHJ2LCBzLAotICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGNyZWF0ZSBjcm9zcy1wcm9jZXNzIGxvY2siKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0KLSAgICBpZiAoIWlzX2dyYWNlZnVsKSB7Ci0JcmVpbml0X3Njb3JlYm9hcmQocGNvbmYpOwotICAgIH0KLQotICAgIHNldF9zaWduYWxzKCk7Ci0gICAgLyogRG9uJ3QgdGhyYXNoLi4uICovCi0gICAgaWYgKG1heF9zcGFyZV90aHJlYWRzIDwgbWluX3NwYXJlX3RocmVhZHMgKyBhcF90aHJlYWRzX3Blcl9jaGlsZCkKLQltYXhfc3BhcmVfdGhyZWFkcyA9IG1pbl9zcGFyZV90aHJlYWRzICsgYXBfdGhyZWFkc19wZXJfY2hpbGQ7Ci0KLSAgICAvKiBJZiB3ZSdyZSBkb2luZyBhIGdyYWNlZnVsX3Jlc3RhcnQgdGhlbiB3ZSdyZSBnb2luZyB0byBzZWUgYSBsb3QKLSAgICAgKiBvZiBjaGlsZHJlbiBleGl0aW5nIGltbWVkaWF0ZWx5IHdoZW4gd2UgZ2V0IGludG8gdGhlIG1haW4gbG9vcAotICAgICAqIGJlbG93IChiZWNhdXNlIHdlIGp1c3Qgc2VudCB0aGVtIFNJR1dJTkNIKS4gIFRoaXMgaGFwcGVucyBwcmV0dHkKLSAgICAgKiByYXBpZGx5Li4uIGFuZCBmb3IgZWFjaCBvbmUgdGhhdCBleGl0cyB3ZSdsbCBzdGFydCBhIG5ldyBvbmUgdW50aWwKLSAgICAgKiB3ZSByZWFjaCBhdCBsZWFzdCBkYWVtb25zX21pbl9mcmVlLiAgQnV0IHdlIG1heSBiZSBwZXJtaXR0ZWQgdG8KLSAgICAgKiBzdGFydCBtb3JlIHRoYW4gdGhhdCwgc28gd2UnbGwganVzdCBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IHdlJ3JlCi0gICAgICogc3VwcG9zZWQgdG8gc3RhcnQgdXAgd2l0aG91dCB0aGUgMSBzZWNvbmQgcGVuYWx0eSBiZXR3ZWVuIGVhY2ggZm9yay4KLSAgICAgKi8KLSAgICByZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQgPSBhcF9kYWVtb25zX3RvX3N0YXJ0OwotICAgIGlmIChyZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQgPiBhcF9kYWVtb25zX2xpbWl0KSB7Ci0JcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0ID0gYXBfZGFlbW9uc19saW1pdDsKLSAgICB9Ci0gICAgaWYgKCFpc19ncmFjZWZ1bCkgewotCXN0YXJ0dXBfY2hpbGRyZW4ocmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0KTsKLQlyZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQgPSAwOwotICAgIH0KLSAgICBlbHNlIHsKLQkvKiBnaXZlIHRoZSBzeXN0ZW0gc29tZSB0aW1lIHRvIHJlY292ZXIgYmVmb3JlIGtpY2tpbmcgaW50bwotCSAgICAqIGV4cG9uZW50aWFsIG1vZGUgKi8KLQlob2xkX29mZl9vbl9leHBvbmVudGlhbF9zcGF3bmluZyA9IDEwOwotICAgIH0KLQotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwgMCwgc2VydmVyX2NvbmYsCi0JCSIlcyBjb25maWd1cmVkIC0tIHJlc3VtaW5nIG5vcm1hbCBvcGVyYXRpb25zIiwKLQkJYXBfZ2V0X3NlcnZlcl92ZXJzaW9uKCkpOwotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0lORk8sIDAsIHNlcnZlcl9jb25mLAotCQkiU2VydmVyIGJ1aWx0OiAlcyIsIGFwX2dldF9zZXJ2ZXJfYnVpbHQoKSk7Ci0gICAgcmVzdGFydF9wZW5kaW5nID0gc2h1dGRvd25fcGVuZGluZyA9IDA7Ci0KLSAgICBzZXJ2ZXJfbWFpbl9sb29wKHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydCk7Ci0KLSAgICBpZiAoc2h1dGRvd25fcGVuZGluZykgewotICAgICAgICAvKiBUaW1lIHRvIGdyYWNlZnVsbHkgc2h1dCBkb3duOgotICAgICAgICAgKiBLaWxsIGNoaWxkIHByb2Nlc3NlcywgdGVsbCB0aGVtIHRvIGNhbGwgY2hpbGRfZXhpdCwgZXRjLi4uCi0gICAgICAgICAqLwotICAgICAgICBpZiAodW5peGRfa2lsbHBnKGdldHBncnAoKSwgU0lHVEVSTSkgPCAwKSB7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLCAia2lsbHBnIFNJR1RFUk0iKTsKLSAgICAgICAgfQotICAgICAgICByZWNsYWltX2NoaWxkX3Byb2Nlc3NlcygxKTsJCS8qIFN0YXJ0IHdpdGggU0lHVEVSTSAqLwotICAgIAotICAgICAgICAvKiBjbGVhbnVwIHBpZCBmaWxlIG9uIG5vcm1hbCBzaHV0ZG93biAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpwaWRmaWxlID0gTlVMTDsKLSAgICAgICAgICAgIHBpZGZpbGUgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZSAocGNvbmYsIGFwX3BpZF9mbmFtZSk7Ci0gICAgICAgICAgICBpZiAoIHBpZGZpbGUgIT0gTlVMTCAmJiB1bmxpbmsocGlkZmlsZSkgPT0gMCkKLSAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19JTkZPLCAwLAotICAgICAgICAgICAgCQkgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAJCSAicmVtb3ZlZCBQSUQgZmlsZSAlcyAocGlkPSVsZCkiLAotICAgICAgICAgICAgCQkgcGlkZmlsZSwgKGxvbmcpZ2V0cGlkKCkpOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwgMCwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAiY2F1Z2h0IFNJR1RFUk0sIHNodXR0aW5nIGRvd24iKTsKLSAgICAKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiB3ZSd2ZSBiZWVuIHRvbGQgdG8gcmVzdGFydCAqLwotICAgIHNpZ25hbChTSUdIVVAsIFNJR19JR04pOwotCi0gICAgaWYgKG9uZV9wcm9jZXNzKSB7Ci0JLyogbm90IHdvcnRoIHRoaW5raW5nIGFib3V0ICovCi0JcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLyogYWR2YW5jZSB0byB0aGUgbmV4dCBnZW5lcmF0aW9uICovCi0gICAgLyogWFhYOiB3ZSByZWFsbHkgbmVlZCB0byBtYWtlIHN1cmUgdGhpcyBuZXcgZ2VuZXJhdGlvbiBudW1iZXIgaXNuJ3QgaW4KLSAgICAgKiB1c2UgYnkgYW55IG9mIHRoZSBjaGlsZHJlbi4KLSAgICAgKi8KLSAgICArK2FwX215X2dlbmVyYXRpb247Ci0gICAgYXBfc2NvcmVib2FyZF9pbWFnZS0+Z2xvYmFsLnJ1bm5pbmdfZ2VuZXJhdGlvbiA9IGFwX215X2dlbmVyYXRpb247Ci0gICAgdXBkYXRlX3Njb3JlYm9hcmRfZ2xvYmFsKCk7Ci0KLSAgICBpZiAoaXNfZ3JhY2VmdWwpIHsKLQlpbnQgaSwgajsKLSAgICAgICAgY2hhciBjaGFyX29mX2RlYXRoID0gJyEnOwotCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCAwLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJTSUdXSU5DSCByZWNlaXZlZC4gIERvaW5nIGdyYWNlZnVsIHJlc3RhcnQiKTsKLQotCS8qIGdpdmUgdGhlIGNoaWxkcmVuIHRoZSBzaWduYWwgdG8gZGllICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcF9kYWVtb25zX2xpbWl0OykgewotICAgICAgICAgICAgaWYgKHdyaXRlKHBpcGVfb2ZfZGVhdGhbMV0sICZjaGFyX29mX2RlYXRoLCAxKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikgY29udGludWU7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgIndyaXRlIHBpcGVfb2ZfZGVhdGgiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotCi0JLyogVGhpcyBpcyBtb3N0bHkgZm9yIGRlYnVnZ2luZy4uLiBzbyB0aGF0IHdlIGtub3cgd2hhdCBpcyBzdGlsbAotICAgICAgICAgKiBncmFjZWZ1bGx5IGRlYWxpbmcgd2l0aCBleGlzdGluZyByZXF1ZXN0LgotICAgICAgICAgKi8KLQkKLQlmb3IgKGkgPSAwOyBpIDwgYXBfZGFlbW9uc19saW1pdDsgKytpKSB7Ci0gIAkgICAgZm9yIChqID0gMDsgaiA8IGFwX3RocmVhZHNfcGVyX2NoaWxkOyBqKyspIHsgCi0JICAgICAgICBpZiAoYXBfc2NvcmVib2FyZF9pbWFnZS0+c2VydmVyc1tpXVtqXS5zdGF0dXMgIT0gU0VSVkVSX0RFQUQpIHsKLQkJICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbaV1bal0uc3RhdHVzID0gU0VSVkVSX0dSQUNFRlVMOwotCQl9Ci0JICAgIH0gCi0JfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIC8qIEtpbGwgJ2VtIGFsbC4gIFNpbmNlIHRoZSBjaGlsZCBhY3RzIHRoZSBzYW1lIG9uIHRoZSBwYXJlbnRzIFNJR1RFUk0gCi0gICAgICAgKiBhbmQgYSBTSUdIVVAsIHdlIG1heSBhcyB3ZWxsIHVzZSB0aGUgc2FtZSBzaWduYWwsIGJlY2F1c2Ugc29tZSB1c2VyCi0gICAgICAgKiBwdGhyZWFkcyBhcmUgc3RlYWxpbmcgc2lnbmFscyBmcm9tIHVzIGxlZnQgYW5kIHJpZ2h0LgotICAgICAgICovCi0JaWYgKHVuaXhkX2tpbGxwZyhnZXRwZ3JwKCksIFNJR1RFUk0pIDwgMCkgewotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLCAia2lsbHBnIFNJR1RFUk0iKTsKLQl9Ci0gICAgICAgIHJlY2xhaW1fY2hpbGRfcHJvY2Vzc2VzKDEpOwkJLyogU3RhcnQgd2l0aCBTSUdURVJNICovCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCAwLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJTSUdIVVAgcmVjZWl2ZWQuICBBdHRlbXB0aW5nIHRvIHJlc3RhcnQiKTsKLSAgICB9Ci0gICAgaWYgKCFpc19ncmFjZWZ1bCkgewotICAgICAgICBhcF9yZXN0YXJ0X3RpbWUgPSB0aW1lKE5VTEwpOyAKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG1wbXRfcHRocmVhZF9wcmVfY29uZmlnKGFwX2NvbnRleHRfdCAqcGNvbmYsIGFwX2NvbnRleHRfdCAqcGxvZywgYXBfY29udGV4dF90ICpwdGVtcCkKLXsKLSAgICBzdGF0aWMgaW50IHJlc3RhcnRfbnVtID0gMDsKLQotICAgIG9uZV9wcm9jZXNzID0gISFnZXRlbnYoIk9ORV9QUk9DRVNTIik7Ci0KLSAgICAvKiBzaWdoLCB3YW50IHRoaXMgb25seSB0aGUgc2Vjb25kIHRpbWUgYXJvdW5kICovCi0gICAgaWYgKHJlc3RhcnRfbnVtKysgPT0gMSkgewotCWlzX2dyYWNlZnVsID0gMDsKLQotCWlmICghb25lX3Byb2Nlc3MpIHsKLQkgICAgdW5peGRfZGV0YWNoKCk7Ci0JfQotCW15X3BpZCA9IGdldHBpZCgpOwotICAgIH0KLQotICAgIHVuaXhkX3ByZV9jb25maWcoKTsKLSAgICBhcF9saXN0ZW5fcHJlX2NvbmZpZygpOwotICAgIGFwX2RhZW1vbnNfdG9fc3RhcnQgPSBERUZBVUxUX1NUQVJUX0RBRU1PTjsKLSAgICBtaW5fc3BhcmVfdGhyZWFkcyA9IERFRkFVTFRfTUlOX0ZSRUVfREFFTU9OICogREVGQVVMVF9USFJFQURTX1BFUl9DSElMRDsKLSAgICBtYXhfc3BhcmVfdGhyZWFkcyA9IERFRkFVTFRfTUFYX0ZSRUVfREFFTU9OICogREVGQVVMVF9USFJFQURTX1BFUl9DSElMRDsKLSAgICBhcF9kYWVtb25zX2xpbWl0ID0gSEFSRF9TRVJWRVJfTElNSVQ7Ci0gICAgYXBfdGhyZWFkc19wZXJfY2hpbGQgPSBERUZBVUxUX1RIUkVBRFNfUEVSX0NISUxEOwotICAgIGFwX3BpZF9mbmFtZSA9IERFRkFVTFRfUElETE9HOwotICAgIGFwX3Njb3JlYm9hcmRfZm5hbWUgPSBERUZBVUxUX1NDT1JFQk9BUkQ7Ci0gICAgbG9ja19mbmFtZSA9IERFRkFVTFRfTE9DS0ZJTEU7Ci0gICAgYXBfbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCA9IERFRkFVTFRfTUFYX1JFUVVFU1RTX1BFUl9DSElMRDsKLSAgICBhcF9leHRlbmRlZF9zdGF0dXMgPSAwOwotCi0gICAgYXBfY3B5c3RybihhcF9jb3JlZHVtcF9kaXIsIGFwX3NlcnZlcl9yb290LCBzaXplb2YoYXBfY29yZWR1bXBfZGlyKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1wbXRfcHRocmVhZF9ob29rcyh2b2lkKQotewotICAgIGFwX2hvb2tfcHJlX2NvbmZpZyhtcG10X3B0aHJlYWRfcHJlX2NvbmZpZyxOVUxMLE5VTEwsSE9PS19NSURETEUpOwotICAgIElOSVRfU0lHTElTVCgpCi0gICAgb25lX3Byb2Nlc3MgPSAwOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfcGlkZmlsZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKGNtZC0+c2VydmVyLT5pc192aXJ0dWFsKSB7Ci0JcmV0dXJuICJQaWRGaWxlIGRpcmVjdGl2ZSBub3QgYWxsb3dlZCBpbiA8VmlydHVhbEhvc3Q+IjsKLSAgICB9Ci0gICAgYXBfcGlkX2ZuYW1lID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3Njb3JlYm9hcmQoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX3Njb3JlYm9hcmRfZm5hbWUgPSBhcmc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbG9ja2ZpbGUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGxvY2tfZm5hbWUgPSBhcmc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfZGFlbW9uc190b19zdGFydChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgYXBfZGFlbW9uc190b19zdGFydCA9IGF0b2koYXJnKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9taW5fc3BhcmVfdGhyZWFkcyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtaW5fc3BhcmVfdGhyZWFkcyA9IGF0b2koYXJnKTsKLSAgICBpZiAobWluX3NwYXJlX3RocmVhZHMgPD0gMCkgewotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICJXQVJOSU5HOiBkZXRlY3RlZCBNaW5TcGFyZVRocmVhZHMgc2V0IHRvIG5vbi1wb3NpdGl2ZS4iKTsKLSAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAiUmVzZXR0aW5nIHRvIDEgdG8gYXZvaWQgYWxtb3N0IGNlcnRhaW4gQXBhY2hlIGZhaWx1cmUuIik7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uLiIpOwotICAgICAgIG1pbl9zcGFyZV90aHJlYWRzID0gMTsKLSAgICB9Ci0gICAgICAgCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbWF4X3NwYXJlX3RocmVhZHMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgbWF4X3NwYXJlX3RocmVhZHMgPSBhdG9pKGFyZyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfc2VydmVyX2xpbWl0IChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgYXBfZGFlbW9uc19saW1pdCA9IGF0b2koYXJnKTsKLSAgICBpZiAoYXBfZGFlbW9uc19saW1pdCA+IEhBUkRfU0VSVkVSX0xJTUlUKSB7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgIldBUk5JTkc6IE1heENsaWVudHMgb2YgJWQgZXhjZWVkcyBjb21waWxlIHRpbWUgbGltaXQgIgotICAgICAgICAgICAgICAgICAgICAib2YgJWQgc2VydmVycywiLCBhcF9kYWVtb25zX2xpbWl0LCBIQVJEX1NFUlZFUl9MSU1JVCk7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgIiBsb3dlcmluZyBNYXhDbGllbnRzIHRvICVkLiAgVG8gaW5jcmVhc2UsIHBsZWFzZSAiCi0gICAgICAgICAgICAgICAgICAgICJzZWUgdGhlIiwgSEFSRF9TRVJWRVJfTElNSVQpOwotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICIgSEFSRF9TRVJWRVJfTElNSVQgZGVmaW5lIGluIHNyYy9pbmNsdWRlL2h0dHBkLmguIik7Ci0gICAgICAgYXBfZGFlbW9uc19saW1pdCA9IEhBUkRfU0VSVkVSX0xJTUlUOwotICAgIH0gCi0gICAgZWxzZSBpZiAoYXBfZGFlbW9uc19saW1pdCA8IDEpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsICJXQVJOSU5HOiBSZXF1aXJlIE1heENsaWVudHMgPiAwLCBzZXR0aW5nIHRvIDFcbiIpOwotCWFwX2RhZW1vbnNfbGltaXQgPSAxOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF90aHJlYWRzX3Blcl9jaGlsZCAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX3RocmVhZHNfcGVyX2NoaWxkID0gYXRvaShhcmcpOwotICAgIGlmIChhcF90aHJlYWRzX3Blcl9jaGlsZCA+IEhBUkRfVEhSRUFEX0xJTUlUKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiV0FSTklORzogVGhyZWFkc1BlckNoaWxkIG9mICVkIGV4Y2VlZHMgY29tcGlsZSB0aW1lIgotICAgICAgICAgICAgICAgICAgICAgImxpbWl0IG9mICVkIHRocmVhZHMsIiwgYXBfdGhyZWFkc19wZXJfY2hpbGQsCi0gICAgICAgICAgICAgICAgICAgICBIQVJEX1RIUkVBRF9MSU1JVCk7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiIGxvd2VyaW5nIFRocmVhZHNQZXJDaGlsZCB0byAlZC4gVG8gaW5jcmVhc2UsIHBsZWFzZSIKLSAgICAgICAgICAgICAgICAgICAgICJzZWUgdGhlIiwgSEFSRF9USFJFQURfTElNSVQpOwotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIiBIQVJEX1RIUkVBRF9MSU1JVCBkZWZpbmUgaW4gc3JjL2luY2x1ZGUvaHR0cGQuaC4iKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYXBfdGhyZWFkc19wZXJfY2hpbGQgPCAxKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICJXQVJOSU5HOiBSZXF1aXJlIFRocmVhZHNQZXJDaGlsZCA+IDAsIHNldHRpbmcgdG8gMSIpOwotCWFwX3RocmVhZHNfcGVyX2NoaWxkID0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbWF4X3JlcXVlc3RzKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBhcF9tYXhfcmVxdWVzdHNfcGVyX2NoaWxkID0gYXRvaShhcmcpOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfY29yZWR1bXBkaXIgKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsKLSAgICBjb25zdCBjaGFyICpmbmFtZTsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBmbmFtZSA9IGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKGNtZC0+cG9vbCwgYXJnKTsKLSAgICBpZiAoKHN0YXQoZm5hbWUsICZmaW5mbykgPT0gLTEpIHx8ICFTX0lTRElSKGZpbmZvLnN0X21vZGUpKSB7Ci0JcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiQ29yZUR1bXBEaXJlY3RvcnkgIiwgZm5hbWUsIAotCQkJICAiIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIGRpcmVjdG9yeSIsIE5VTEwpOwotICAgIH0KLSAgICBhcF9jcHlzdHJuKGFwX2NvcmVkdW1wX2RpciwgZm5hbWUsIHNpemVvZihhcF9jb3JlZHVtcF9kaXIpKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNvbW1hbmRfcmVjIG1wbXRfcHRocmVhZF9jbWRzW10gPSB7Ci1VTklYX0RBRU1PTl9DT01NQU5EUwotTElTVEVOX0NPTU1BTkRTCi17ICJQaWRGaWxlIiwgc2V0X3BpZGZpbGUsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICAgIkEgZmlsZSBmb3IgbG9nZ2luZyB0aGUgc2VydmVyIHByb2Nlc3MgSUQifSwKLXsgIlNjb3JlQm9hcmRGaWxlIiwgc2V0X3Njb3JlYm9hcmQsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICAgIkEgZmlsZSBmb3IgQXBhY2hlIHRvIG1haW50YWluIHJ1bnRpbWUgcHJvY2VzcyBtYW5hZ2VtZW50IGluZm9ybWF0aW9uIn0sCi17ICJMb2NrRmlsZSIsIHNldF9sb2NrZmlsZSwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAiVGhlIGxvY2tmaWxlIHVzZWQgd2hlbiBBcGFjaGUgbmVlZHMgdG8gbG9jayB0aGUgYWNjZXB0KCkgY2FsbCJ9LAoteyAiU3RhcnRTZXJ2ZXJzIiwgc2V0X2RhZW1vbnNfdG9fc3RhcnQsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJOdW1iZXIgb2YgY2hpbGQgcHJvY2Vzc2VzIGxhdW5jaGVkIGF0IHNlcnZlciBzdGFydHVwIiB9LAoteyAiTWluU3BhcmVUaHJlYWRzIiwgc2V0X21pbl9zcGFyZV90aHJlYWRzLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiTWluaW11bSBudW1iZXIgb2YgaWRsZSBjaGlsZHJlbiwgdG8gaGFuZGxlIHJlcXVlc3Qgc3Bpa2VzIiB9LAoteyAiTWF4U3BhcmVUaHJlYWRzIiwgc2V0X21heF9zcGFyZV90aHJlYWRzLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiTWF4aW11bSBudW1iZXIgb2YgaWRsZSBjaGlsZHJlbiIgfSwKLXsgIk1heENsaWVudHMiLCBzZXRfc2VydmVyX2xpbWl0LCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiTWF4aW11bSBudW1iZXIgb2YgY2hpbGRyZW4gYWxpdmUgYXQgdGhlIHNhbWUgdGltZSIgfSwKLXsgIlRocmVhZHNQZXJDaGlsZCIsIHNldF90aHJlYWRzX3Blcl9jaGlsZCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIk51bWJlciBvZiB0aHJlYWRzIGVhY2ggY2hpbGQgY3JlYXRlcyIgfSwKLXsgIk1heFJlcXVlc3RzUGVyQ2hpbGQiLCBzZXRfbWF4X3JlcXVlc3RzLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiTWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgYSBwYXJ0aWN1bGFyIGNoaWxkIHNlcnZlcyBiZWZvcmUgZHlpbmcuIiB9LAoteyAiQ29yZUR1bXBEaXJlY3RvcnkiLCBzZXRfY29yZWR1bXBkaXIsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJUaGUgbG9jYXRpb24gb2YgdGhlIGRpcmVjdG9yeSBBcGFjaGUgY2hhbmdlcyB0byBiZWZvcmUgZHVtcGluZyBjb3JlIiB9LAoteyBOVUxMIH0KLX07Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBtcG1fbXBtdF9wdGhyZWFkX21vZHVsZSA9IHsKLSAgICBTVEFOREFSRDIwX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLAkJCS8qIGNyZWF0ZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgICBOVUxMLAkJCS8qIG1lcmdlIHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgICBOVUxMLAkJCS8qIGNyZWF0ZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgICBOVUxMLAkJCS8qIG1lcmdlIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgICBtcG10X3B0aHJlYWRfY21kcywJCS8qIGNvbW1hbmQgYXBfdGFibGVfdCAqLwotICAgIE5VTEwsCQkJLyogaGFuZGxlcnMgKi8KLSAgICBtcG10X3B0aHJlYWRfaG9va3MJCS8qIHJlZ2lzdGVyX2hvb2tzICovCi19OwotCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL21wbXRfcHRocmVhZC9zY29yZWJvYXJkLmMgYi9zZXJ2ZXIvbXBtL21wbXRfcHRocmVhZC9zY29yZWJvYXJkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYTMxYTguLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9tcG10X3B0aHJlYWQvc2NvcmVib2FyZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjg1ICswLDAgQEAKLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJ1bml4ZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZl9nbG9iYWxzLmgiCi0jaW5jbHVkZSAibXBtX3N0YXR1cy5oIgotI2luY2x1ZGUgIm1wbXRfcHRocmVhZC5oIgotI2luY2x1ZGUgInNjb3JlYm9hcmQuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBVU0VfU0hNR0VUX1NDT1JFQk9BUkQKLSNpbmNsdWRlIDxzeXMvaXBjLmg+Ci0jaW5jbHVkZSA8c3lzL3NobS5oPgotI2VuZGlmCi0KLSNpZmRlZiBVU0VfT1MyX1NDT1JFQk9BUkQKLSAgICAvKiBBZGQgTU1BUCBzdHlsZSBmdW5jdGlvbmFsaXR5IHRvIE9TLzIgKi8KLSNkZWZpbmUgSU5DTF9ET1NNRU1NR1IKLSNkZWZpbmUgSU5DTF9ET1NFWENFUFRJT05TCi0jZGVmaW5lIElOQ0xfRE9TU0VNQVBIT1JFUwotI2luY2x1ZGUgPG9zMi5oPgotI2luY2x1ZGUgPHVtYWxsb2MuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotY2FkZHJfdCBjcmVhdGVfc2hhcmVkX2hlYXAoY29uc3QgY2hhciAqLCBzaXplX3QpOwotY2FkZHJfdCBnZXRfc2hhcmVkX2hlYXAoY29uc3QgY2hhciAqKTsKLSNlbmRpZgotCi1zY29yZWJvYXJkICphcF9zY29yZWJvYXJkX2ltYWdlID0gTlVMTDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRGVhbGluZyB3aXRoIHRoZSBzY29yZWJvYXJkLi4uIGEgbG90IG9mIHRoZXNlIHZhcmlhYmxlcyBhcmUgZ2xvYmFsCi0gKiBvbmx5IHRvIGF2b2lkIGdldHRpbmcgY2xvYmJlcmVkIGJ5IHRoZSBsb25nam1wKCkgdGhhdCBoYXBwZW5zIHdoZW4KLSAqIGEgaGFyZCB0aW1lb3V0IGV4cGlyZXMuLi4KLSAqCi0gKiBXZSBiZWdpbiB3aXRoIHJvdXRpbmVzIHdoaWNoIGRlYWwgd2l0aCB0aGUgZmlsZSBpdHNlbGYuLi4gCi0gKi8KLQotI2lmZGVmIE1VTFRJVEhSRUFECi0vKgotICogSW4gdGhlIG11bHRpdGhyZWFkZWQgbW9kZSwgaGF2ZSBtdWx0aXBsZSB0aHJlYWRzIC0gbm90IG11bHRpcGxlCi0gKiBwcm9jZXNzZXMgdGhhdCBuZWVkIHRvIHRhbGsgdG8gZWFjaCBvdGhlci4gSnVzdCB1c2UgYSBzaW1wbGUKLSAqIG1hbGxvYy4gQnV0IGxldCB0aGUgcm91dGluZXMgdGhhdCBmb2xsb3csIHRoaW5rIHRoYXQgeW91IGhhdmUKLSAqIHNoYXJlZCBtZW1vcnkgKHNvIHRoZXkgdXNlIG1lbWNweSBldGMuKQotICovCi0KLXZvaWQgcmVpbml0X3Njb3JlYm9hcmQoYXBfY29udGV4dF90ICpwKQotewotICAgIGFwX2Fzc2VydCghYXBfc2NvcmVib2FyZF9pbWFnZSk7Ci0gICAgYXBfc2NvcmVib2FyZF9pbWFnZSA9IChzY29yZWJvYXJkICopIG1hbGxvYyhTQ09SRUJPQVJEX1NJWkUpOwotICAgIGlmIChhcF9zY29yZWJvYXJkX2ltYWdlID09IE5VTEwpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICJPdWNoISBPdXQgb2YgbWVtb3J5IHJlaW5pdGluZyBzY29yZWJvYXJkISIpOwotICAgIH0KLSAgICBtZW1zZXQoYXBfc2NvcmVib2FyZF9pbWFnZSwgMCwgU0NPUkVCT0FSRF9TSVpFKTsKLX0KLQotdm9pZCBjbGVhbnVwX3Njb3JlYm9hcmQodm9pZCkKLXsKLSAgICBhcF9hc3NlcnQoYXBfc2NvcmVib2FyZF9pbWFnZSk7Ci0gICAgZnJlZShhcF9zY29yZWJvYXJkX2ltYWdlKTsKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlID0gTlVMTDsKLX0KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9zeW5jX3Njb3JlYm9hcmRfaW1hZ2Uodm9pZCkKLXsKLX0KLQotCi0jZWxzZSAvKiBNVUxUSVRIUkVBRCAqLwotI2lmIGRlZmluZWQoVVNFX09TMl9TQ09SRUJPQVJEKQotCi0vKiBUaGUgbmV4dCB0d28gcm91dGluZXMgYXJlIHVzZWQgdG8gYWNjZXNzIHNoYXJlZCBtZW1vcnkgdW5kZXIgT1MvMi4gICovCi0vKiBUaGlzIHJlcXVpcmVzIEVNWCB2MDljIHRvIGJlIGluc3RhbGxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi1jYWRkcl90IGNyZWF0ZV9zaGFyZWRfaGVhcChjb25zdCBjaGFyICpuYW1lLCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBVTE9ORyByYzsKLSAgICB2b2lkICptZW07Ci0gICAgSGVhcF90IGg7Ci0KLSAgICByYyA9IERvc0FsbG9jU2hhcmVkTWVtKCZtZW0sIG5hbWUsIHNpemUsCi0JCQkgICBQQUdfQ09NTUlUIHwgUEFHX1JFQUQgfCBQQUdfV1JJVEUpOwotICAgIGlmIChyYyAhPSAwKQotCXJldHVybiBOVUxMOwotICAgIGggPSBfdWNyZWF0ZShtZW0sIHNpemUsICFfQkxPQ0tfQ0xFQU4sIF9IRUFQX1JFR1VMQVIgfCBfSEVBUF9TSEFSRUQsCi0JCSBOVUxMLCBOVUxMKTsKLSAgICBpZiAoaCA9PSBOVUxMKQotCURvc0ZyZWVNZW0obWVtKTsKLSAgICByZXR1cm4gKGNhZGRyX3QpIGg7Ci19Ci0KLWNhZGRyX3QgZ2V0X3NoYXJlZF9oZWFwKGNvbnN0IGNoYXIgKk5hbWUpCi17Ci0KLSAgICBQVk9JRCBCYXNlQWRkcmVzczsJCS8qIFBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZgotCQkJCSAgIHRoZSBzaGFyZWQgbWVtb3J5IG9iamVjdCAqLwotICAgIFVMT05HIEF0dHJpYnV0ZUZsYWdzOwkvKiBGbGFncyBkZXNjcmliaW5nIGNoYXJhY3RlcmlzdGljcwotCQkJCSAgIG9mIHRoZSBzaGFyZWQgbWVtb3J5IG9iamVjdCAqLwotICAgIEFQSVJFVCByYzsJCQkvKiBSZXR1cm4gY29kZSAqLwotCi0gICAgLyogUmVxdWVzdCByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgdG8gKi8KLSAgICAvKiAgIHRoZSBzaGFyZWQgbWVtb3J5IG9iamVjdCAgICAgICAqLwotICAgIEF0dHJpYnV0ZUZsYWdzID0gUEFHX1dSSVRFIHwgUEFHX1JFQUQ7Ci0KLSAgICByYyA9IERvc0dldE5hbWVkU2hhcmVkTWVtKCZCYXNlQWRkcmVzcywgTmFtZSwgQXR0cmlidXRlRmxhZ3MpOwotCi0gICAgaWYgKHJjICE9IDApIHsKLQlwcmludGYoIkRvc0dldE5hbWVkU2hhcmVkTWVtIGVycm9yOiByZXR1cm4gY29kZSA9ICVsZCIsIHJjKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gQmFzZUFkZHJlc3M7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldHVwX3NoYXJlZF9tZW0oYXBfY29udGV4dF90ICpwKQotewotICAgIGNhZGRyX3QgbTsKLQotICAgIGludCByYzsKLQotICAgIG0gPSAoY2FkZHJfdCkgY3JlYXRlX3NoYXJlZF9oZWFwKCJcXFNIQVJFTUVNXFxTQ09SRUJPQVJEIiwgU0NPUkVCT0FSRF9TSVpFKTsKLSAgICBpZiAobSA9PSAwKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICIlczogQ291bGQgbm90IGNyZWF0ZSBPUy8yIFNoYXJlZCBtZW1vcnkgcG9vbC4iLAotCQkgICAgIGFwX3NlcnZlcl9hcmd2MCk7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotCi0gICAgcmMgPSBfdW9wZW4oKEhlYXBfdCkgbSk7Ci0gICAgaWYgKHJjICE9IDApIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsCi0JCSIlczogQ291bGQgbm90IHVvcGVuKCkgbmV3bHkgY3JlYXRlZCBPUy8yIFNoYXJlZCBtZW1vcnkgcG9vbC4iLAotCQlhcF9zZXJ2ZXJfYXJndjApOwotICAgIH0KLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlID0gKHNjb3JlYm9hcmQgKikgbTsKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwucnVubmluZ19nZW5lcmF0aW9uID0gMDsKLX0KLQotQVBJX0VYUE9SVCh2b2lkKSByZW9wZW5fc2NvcmVib2FyZChhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgY2FkZHJfdCBtOwotICAgIGludCByYzsKLQotICAgIG0gPSAoY2FkZHJfdCkgZ2V0X3NoYXJlZF9oZWFwKCJcXFNIQVJFTUVNXFxTQ09SRUJPQVJEIik7Ci0gICAgaWYgKG0gPT0gMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiJXM6IENvdWxkIG5vdCBmaW5kIGV4aXN0aW5nIE9TLzIgU2hhcmVkIG1lbW9yeSBwb29sLiIsCi0JCSAgICAgYXBfc2VydmVyX2FyZ3YwKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0KLSAgICByYyA9IF91b3BlbigoSGVhcF90KSBtKTsKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlID0gKHNjb3JlYm9hcmQgKikgbTsKLX0KLQotI2VsaWYgZGVmaW5lZChVU0VfUE9TSVhfU0NPUkVCT0FSRCkKLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotLyogCi0gKiBQT1NJWCAxMDAzLjQgc3R5bGUKLSAqCi0gKiBOb3RlIDE6IAotICogQXMgb2YgdmVyc2lvbiA0LjIzQSwgc2hhcmVkIG1lbW9yeSBpbiBRTlggbXVzdCByZXNpZGUgdW5kZXIgL2Rldi9zaG1lbSwKLSAqIHdoZXJlIG5vIHN1YmRpcmVjdG9yaWVzIGFsbG93ZWQuCi0gKgotICogUE9TSVggc2htX29wZW4oKSBhbmQgc2htX3VubGluaygpIHdpbGwgdGFrZSBjYXJlIGFib3V0IHRoaXMgaXNzdWUsCi0gKiBidXQgdG8gYXZvaWQgY29uZnVzaW9uLCBJIHN1Z2dlc3QgdG8gcmVkZWZpbmUgc2NvcmVib2FyZCBmaWxlIG5hbWUKLSAqIGluIGh0dHBkLmNvbmYgdG8gY3V0ICJsb2dzLyIgZnJvbSBpdC4gV2l0aCBkZWZhdWx0IHNldHVwIGFjdHVhbCBuYW1lCi0gKiB3aWxsIGJlICIvZGV2L3NobWVtL2xvZ3MuYXBhY2hlX3N0YXR1cyIuIAotICogCi0gKiBJZiBzb21ldGhpbmcgd2VudCB3cm9uZyBhbmQgQXBhY2hlIGRpZCBub3QgdW5saW5rZWQgdGhpcyBvYmplY3QgdXBvbgotICogZXhpdCwgeW91IGNhbiByZW1vdmUgaXQgbWFudWFsbHksIHVzaW5nICJybSAtZiIgY29tbWFuZC4KLSAqIAotICogTm90ZSAyOgotICogPHN5cy9tbWFuLmg+IGluIFFOWCBkZWZpbmVzIE1BUF9BTk9OLCBidXQgY3VycmVudCBpbXBsZW1lbnRhdGlvbiAKLSAqIGRvZXMgTk9UIHN1cHBvcnQgQlNEIHN0eWxlIGFub255bW91cyBtYXBwaW5nLiBTbywgdGhlIG9yZGVyIG9mIAotICogY29uZGl0aW9uYWwgY29tcGlsYXRpb24gaXMgaW1wb3J0YW50OiAKLSAqIHRoaXMgI2lmZGVmIHNlY3Rpb24gbXVzdCBiZSBBQk9WRSB0aGUgbmV4dCBvbmUgKEJTRCBzdHlsZSkuCi0gKgotICogSSB0ZXN0ZWQgdGhpcyBzdHVmZiBhbmQgaXQgd29ya3MgZmluZSBmb3IgbWUsIGJ1dCBpZiBpdCBwcm92aWRlcyAKLSAqIHRyb3VibGUgZm9yIHlvdSwganVzdCBjb21tZW50IG91dCBVU0VfTU1BUF9TQ09SRUJPQVJEIGluIFFOWCBzZWN0aW9uCi0gKiBvZiBhcF9jb25maWcuaAotICoKLSAqIEp1bmUgNSwgMTk5NywgCi0gKiBJZ29yIE4uIEtvdmFsZW5rbyAtLSBpbmZvaEBtYWlsLndwbHVzLm5ldAotICovCi0KLXN0YXRpYyB2b2lkIGNsZWFudXBfc2hhcmVkX21lbSh2b2lkICpkKQotewotICAgIHNobV91bmxpbmsoYXBfc2NvcmVib2FyZF9mbmFtZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldHVwX3NoYXJlZF9tZW0oYXBfY29udGV4dF90ICpwKQotewotICAgIGNoYXIgYnVmWzUxMl07Ci0gICAgY2FkZHJfdCBtOwotICAgIGludCBmZDsKLQotICAgIGZkID0gc2htX29wZW4oYXBfc2NvcmVib2FyZF9mbmFtZSwgT19SRFdSIHwgT19DUkVBVCwgU19JUlVTUiB8IFNfSVdVU1IpOwotICAgIGlmIChmZCA9PSAtMSkgewotCWFwX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlczogY291bGQgbm90IG9wZW4oY3JlYXRlKSBzY29yZWJvYXJkIiwKLQkJICAgIGFwX3NlcnZlcl9hcmd2MCk7Ci0JcGVycm9yKGJ1Zik7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIGlmIChsdHJ1bmMoZmQsIChvZmZfdCkgU0NPUkVCT0FSRF9TSVpFLCBTRUVLX1NFVCkgPT0gLTEpIHsKLQlhcF9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXM6IGNvdWxkIG5vdCBsdHJ1bmMgc2NvcmVib2FyZCIsCi0JCSAgICBhcF9zZXJ2ZXJfYXJndjApOwotCXBlcnJvcihidWYpOwotCXNobV91bmxpbmsoYXBfc2NvcmVib2FyZF9mbmFtZSk7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIGlmICgobSA9IChjYWRkcl90KSBtbWFwKChjYWRkcl90KSAwLAotCQkJICAgIChzaXplX3QpIFNDT1JFQk9BUkRfU0laRSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkJCSAgICBNQVBfU0hBUkVELCBmZCwgKG9mZl90KSAwKSkgPT0gKGNhZGRyX3QpIC0gMSkgewotCWFwX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlczogY2Fubm90IG1tYXAgc2NvcmVib2FyZCIsCi0JCSAgICBhcF9zZXJ2ZXJfYXJndjApOwotCXBlcnJvcihidWYpOwotCXNobV91bmxpbmsoYXBfc2NvcmVib2FyZF9mbmFtZSk7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIGNsb3NlKGZkKTsKLSAgICBhcF9yZWdpc3Rlcl9jbGVhbnVwKHAsIE5VTEwsIGNsZWFudXBfc2hhcmVkX21lbSwgYXBfbnVsbF9jbGVhbnVwKTsKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlID0gKHNjb3JlYm9hcmQgKikgbTsKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwucnVubmluZ19nZW5lcmF0aW9uID0gMDsKLX0KLQotQVBJX0VYUE9SVCh2b2lkKSByZW9wZW5fc2NvcmVib2FyZChhcF9jb250ZXh0X3QgKnApCi17Ci19Ci0KLSNlbGlmIGRlZmluZWQoVVNFX01NQVBfU0NPUkVCT0FSRCkKLQotc3RhdGljIHZvaWQgc2V0dXBfc2hhcmVkX21lbShhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgY2FkZHJfdCBtOwotCi0jaWYgZGVmaW5lZChNQVBfQU5PTikKLS8qIEJTRCBzdHlsZSAqLwotI2lmZGVmIENPTlZFWE9TMTEKLSAgICAvKgotICAgICAqIDktQXVnLTk3IC0gSmVmZiBWZW50ZXJzICh2ZW50ZXJzQGNvbnZleC5ocC5jb20pCi0gICAgICogQ29udmV4T1MgbWFwcyBhZGRyZXNzIHNwYWNlIGFzIGZvbGxvd3M6Ci0gICAgICogICAweDAwMDAwMDAwIC0gMHg3ZmZmZmZmZiA6IEtlcm5lbAotICAgICAqICAgMHg4MDAwMDAwMCAtIDB4ZmZmZmZmZmYgOiBVc2VyCi0gICAgICogU3RhcnQgbW1hcHBlZCBhcmVhIDFHQiBhYm92ZSBzdGFydCBvZiB0ZXh0LgotICAgICAqCi0gICAgICogQWxzbywgdGhlIGxlbmd0aCByZXF1aXJlcyBhIHBvaW50ZXIgYXMgdGhlIGFjdHVhbCBsZW5ndGggaXMKLSAgICAgKiByZXR1cm5lZCAocm91bmRlZCB1cCB0byBhIHBhZ2UgYm91bmRhcnkpLgotICAgICAqLwotICAgIHsKLQl1bnNpZ25lZCBsZW4gPSBTQ09SRUJPQVJEX1NJWkU7Ci0KLQltID0gbW1hcCgoY2FkZHJfdCkgMHhDMDAwMDAwMCwgJmxlbiwKLQkJIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9BTk9OIHwgTUFQX1NIQVJFRCwgTk9GRCwgMCk7Ci0gICAgfQotI2VsaWYgZGVmaW5lZChNQVBfVE1QRklMRSkKLSAgICB7Ci0JY2hhciBtZmlsZVtdID0gIi90bXAvYXBhY2hlX3NobWVtX1hYWFgiOwotCWludCBmZCA9IG1rc3RlbXAobWZpbGUpOwotCWlmIChmZCA9PSAtMSkgewotCSAgICBwZXJyb3IoIm9wZW4iKTsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IENvdWxkIG5vdCBvcGVuICVzIiwgYXBfc2VydmVyX2FyZ3YwLCBtZmlsZSk7Ci0JICAgIGV4aXQoQVBFWElUX0lOSVQpOwotCX0KLQltID0gbW1hcCgoY2FkZHJfdCkgMCwgU0NPUkVCT0FSRF9TSVpFLAotCQlQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmZCwgMCk7Ci0JaWYgKG0gPT0gKGNhZGRyX3QpIC0gMSkgewotCSAgICBwZXJyb3IoIm1tYXAiKTsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IENvdWxkIG5vdCBtbWFwICVzIiwgYXBfc2VydmVyX2FyZ3YwLCBtZmlsZSk7Ci0JICAgIGV4aXQoQVBFWElUX0lOSVQpOwotCX0KLQljbG9zZShmZCk7Ci0JdW5saW5rKG1maWxlKTsKLSAgICB9Ci0jZWxzZQotICAgIG0gPSBtbWFwKChjYWRkcl90KSAwLCBTQ09SRUJPQVJEX1NJWkUsCi0JICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfQU5PTiB8IE1BUF9TSEFSRUQsIC0xLCAwKTsKLSNlbmRpZgotICAgIGlmIChtID09IChjYWRkcl90KSAtIDEpIHsKLQlwZXJyb3IoIm1tYXAiKTsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIiVzOiBDb3VsZCBub3QgbW1hcCBtZW1vcnkiLCBhcF9zZXJ2ZXJfYXJndjApOwotCWV4aXQoQVBFWElUX0lOSVQpOwotICAgIH0KLSNlbHNlCi0vKiBTdW4gc3R5bGUgKi8KLSAgICBpbnQgZmQ7Ci0KLSAgICBmZCA9IG9wZW4oIi9kZXYvemVybyIsIE9fUkRXUik7Ci0gICAgaWYgKGZkID09IC0xKSB7Ci0JcGVycm9yKCJvcGVuIik7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICIlczogQ291bGQgbm90IG9wZW4gL2Rldi96ZXJvIiwgYXBfc2VydmVyX2FyZ3YwKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0gICAgbSA9IG1tYXAoKGNhZGRyX3QpIDAsIFNDT1JFQk9BUkRfU0laRSwKLQkgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkLCAwKTsKLSAgICBpZiAobSA9PSAoY2FkZHJfdCkgLSAxKSB7Ci0JcGVycm9yKCJtbWFwIik7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICIlczogQ291bGQgbm90IG1tYXAgL2Rldi96ZXJvIiwgYXBfc2VydmVyX2FyZ3YwKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0gICAgY2xvc2UoZmQpOwotI2VuZGlmCi0gICAgYXBfc2NvcmVib2FyZF9pbWFnZSA9IChzY29yZWJvYXJkICopIG07Ci0gICAgYXBfc2NvcmVib2FyZF9pbWFnZS0+Z2xvYmFsLnJ1bm5pbmdfZ2VuZXJhdGlvbiA9IDA7Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgcmVvcGVuX3Njb3JlYm9hcmQoYXBfY29udGV4dF90ICpwKQotewotfQotCi0jZWxpZiBkZWZpbmVkKFVTRV9TSE1HRVRfU0NPUkVCT0FSRCkKLXN0YXRpYyBrZXlfdCBzaG1rZXkgPSBJUENfUFJJVkFURTsKLXN0YXRpYyBpbnQgc2htaWQgPSAtMTsKLQotc3RhdGljIHZvaWQgc2V0dXBfc2hhcmVkX21lbShhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgc3RydWN0IHNobWlkX2RzIHNobWJ1ZjsKLSAgICBjb25zdCBzZXJ2ZXJfcmVjICogc2VydmVyX2NvbmYgPSBhcF9nZXRfc2VydmVyX2NvbmYoKTsKLSNpZmRlZiBNT1ZFQlJFQUsKLSAgICBjaGFyICpvYnJrOwotI2VuZGlmCi0KLSAgICBpZiAoKHNobWlkID0gc2htZ2V0KHNobWtleSwgU0NPUkVCT0FSRF9TSVpFLCBJUENfQ1JFQVQgfCBTSE1fUiB8IFNITV9XKSkgPT0gLTEpIHsKLSNpZmRlZiBMSU5VWAotCWlmIChlcnJubyA9PSBFTk9TWVMpIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRU1FUkcsIDAsIHNlcnZlcl9jb25mLAotCQkJICJZb3VyIGtlcm5lbCB3YXMgYnVpbHQgd2l0aG91dCBDT05GSUdfU1lTVklQQ1xuIgotCQkJICIlczogUGxlYXNlIGNvbnN1bHQgdGhlIEFwYWNoZSBGQVEgZm9yIGRldGFpbHMiLAotCQkJIGFwX3NlcnZlcl9hcmd2MCk7Ci0JfQotI2VuZGlmCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCBlcnJubywgc2VydmVyX2NvbmYsCi0JCSAgICAiY291bGQgbm90IGNhbGwgc2htZ2V0Iik7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgMCwgc2VydmVyX2NvbmYsCi0JCSJjcmVhdGVkIHNoYXJlZCBtZW1vcnkgc2VnbWVudCAjJWQiLCBzaG1pZCk7Ci0KLSNpZmRlZiBNT1ZFQlJFQUsKLSAgICAvKgotICAgICAqIFNvbWUgU3lzViBzeXN0ZW1zIHBsYWNlIHRoZSBzaGFyZWQgc2VnbWVudCBXQVkgdG9vIGNsb3NlCi0gICAgICogdG8gdGhlIGR5bmFtaWMgbWVtb3J5IGJyZWFrIHBvaW50IChzYnJrKDApKS4gVGhpcyBzZXZlcmVseQotICAgICAqIGxpbWl0cyB0aGUgdXNlIG9mIG1hbGxvYy9zYnJrIGluIHRoZSBwcm9ncmFtIHNpbmNlIHNicmsgd2lsbAotICAgICAqIHJlZnVzZSB0byBtb3ZlIHBhc3QgdGhhdCBwb2ludC4KLSAgICAgKgotICAgICAqIFRvIGdldCBhcm91bmQgdGhpcywgd2UgbW92ZSB0aGUgYnJlYWsgcG9pbnQgIndheSB1cCB0aGVyZSIsCi0gICAgICogYXR0YWNoIHRoZSBzZWdtZW50IGFuZCB0aGVuIG1vdmUgYnJlYWsgYmFjayBkb3duLiBVZ2x5Ci0gICAgICovCi0gICAgaWYgKChvYnJrID0gc2JyayhNT1ZFQlJFQUspKSA9PSAoY2hhciAqKSAtMSkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHNlcnZlcl9jb25mLAotCSAgICAic2JyaygpIGNvdWxkIG5vdCBtb3ZlIGJyZWFrIik7Ci0gICAgfQotI2VuZGlmCi0KLSNkZWZpbmUgQkFEU0hNQVQJKChzY29yZWJvYXJkICopKC0xKSkKLSAgICBpZiAoKGFwX3Njb3JlYm9hcmRfaW1hZ2UgPSAoc2NvcmVib2FyZCAqKSBzaG1hdChzaG1pZCwgMCwgMCkpID09IEJBRFNITUFUKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCBlcnJubywgc2VydmVyX2NvbmYsICJzaG1hdCBlcnJvciIpOwotCS8qCi0JICogV2UgZXhpdCBiZWxvdywgYWZ0ZXIgd2UgdHJ5IHRvIHJlbW92ZSB0aGUgc2VnbWVudAotCSAqLwotICAgIH0KLSAgICBlbHNlIHsJCQkvKiBvbmx5IHdvcnJ5IGFib3V0IHBlcm1pc3Npb25zIGlmIHdlIGF0dGFjaGVkIHRoZSBzZWdtZW50ICovCi0JaWYgKHNobWN0bChzaG1pZCwgSVBDX1NUQVQsICZzaG1idWYpICE9IDApIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHNlcnZlcl9jb25mLAotCQkic2htY3RsKCkgY291bGQgbm90IHN0YXQgc2VnbWVudCAjJWQiLCBzaG1pZCk7Ci0JfQotCWVsc2UgewotCSAgICBzaG1idWYuc2htX3Blcm0udWlkID0gdW5peGRfY29uZmlnLnVzZXJfaWQ7Ci0JICAgIHNobWJ1Zi5zaG1fcGVybS5naWQgPSB1bml4ZF9jb25maWcuZ3JvdXBfaWQ7Ci0JICAgIGlmIChzaG1jdGwoc2htaWQsIElQQ19TRVQsICZzaG1idWYpICE9IDApIHsKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHNlcnZlcl9jb25mLAotCQkgICAgInNobWN0bCgpIGNvdWxkIG5vdCBzZXQgc2VnbWVudCAjJWQiLCBzaG1pZCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIC8qCi0gICAgICogV2UgbXVzdCBhdm9pZCBsZWF2aW5nIHNlZ21lbnRzIGluIHRoZSBrZXJuZWwncwotICAgICAqIChzbWFsbCkgdGFibGVzLgotICAgICAqLwotICAgIGlmIChzaG1jdGwoc2htaWQsIElQQ19STUlELCBOVUxMKSAhPSAwKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwKLQkJInNobWN0bDogSVBDX1JNSUQ6IGNvdWxkIG5vdCByZW1vdmUgc2hhcmVkIG1lbW9yeSBzZWdtZW50ICMlZCIsCi0JCXNobWlkKTsKLSAgICB9Ci0gICAgaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UgPT0gQkFEU0hNQVQpCS8qIG5vdyBiYWlsb3V0ICovCi0JZXhpdChBUEVYSVRfSU5JVCk7Ci0KLSNpZmRlZiBNT1ZFQlJFQUsKLSAgICBpZiAob2JyayA9PSAoY2hhciAqKSAtMSkKLQlyZXR1cm47CQkJLyogbm90aGluZyBlbHNlIHRvIGRvICovCi0gICAgaWYgKHNicmsoLShNT1ZFQlJFQUspKSA9PSAoY2hhciAqKSAtMSkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHNlcnZlcl9jb25mLAotCSAgICAic2JyaygpIGNvdWxkIG5vdCBtb3ZlIGJyZWFrIGJhY2siKTsKLSAgICB9Ci0jZW5kaWYKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwucnVubmluZ19nZW5lcmF0aW9uID0gMDsKLX0KLQotQVBJX0VYUE9SVCh2b2lkKSByZW9wZW5fc2NvcmVib2FyZChhcF9jb250ZXh0X3QgKnApCi17Ci19Ci0KLSNlbHNlCi0jZGVmaW5lIFNDT1JFQk9BUkRfRklMRQotc3RhdGljIHNjb3JlYm9hcmQgX3Njb3JlYm9hcmRfaW1hZ2U7Ci1zdGF0aWMgYXBfZmlsZV90ICpzY29yZWJvYXJkX2ZpbGUgPSBOVUxMOwotCi0vKiBYWFg6IHRoaW5ncyBhcmUgc2VyaW91c2x5IHNjcmV3ZWQgaWYgd2UgZXZlciBoYXZlIHRvIGRvIGEgcGFydGlhbAotICogcmVhZCBvciB3cml0ZSAuLi4gd2UgY291bGQgZ2V0IGEgY29ycnVwdGVkIHNjb3JlYm9hcmQKLSAqLwotc3RhdGljIGludCBmb3JjZV93cml0ZShpbnQgZmQsIHZvaWQgKmJ1ZmZlciwgaW50IGJ1ZnN6KQotewotICAgIGludCBydiwgb3JpZ19zeiA9IGJ1ZnN6OwotCi0gICAgZG8gewotCXJ2ID0gd3JpdGUoZmQsIGJ1ZmZlciwgYnVmc3opOwotCWlmIChydiA+IDApIHsKLQkgICAgYnVmZmVyID0gKGNoYXIgKikgYnVmZmVyICsgcnY7Ci0JICAgIGJ1ZnN6IC09IHJ2OwotCX0KLSAgICB9IHdoaWxlICgocnYgPiAwICYmIGJ1ZnN6ID4gMCkgfHwgKHJ2ID09IC0xICYmIGVycm5vID09IEVJTlRSKSk7Ci0KLSAgICByZXR1cm4gcnYgPCAwID8gcnYgOiBvcmlnX3N6IC0gYnVmc3o7Ci19Ci0KLXN0YXRpYyBpbnQgZm9yY2VfcmVhZChpbnQgZmQsIHZvaWQgKmJ1ZmZlciwgaW50IGJ1ZnN6KQotewotICAgIGludCBydiwgb3JpZ19zeiA9IGJ1ZnN6OwotCi0gICAgZG8gewotCXJ2ID0gcmVhZChmZCwgYnVmZmVyLCBidWZzeik7Ci0JaWYgKHJ2ID4gMCkgewotCSAgICBidWZmZXIgPSAoY2hhciAqKSBidWZmZXIgKyBydjsKLQkgICAgYnVmc3ogLT0gcnY7Ci0JfQotICAgIH0gd2hpbGUgKChydiA+IDAgJiYgYnVmc3ogPiAwKSB8fCAocnYgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpKTsKLQotICAgIHJldHVybiBydiA8IDAgPyBydiA6IG9yaWdfc3ogLSBidWZzejsKLX0KLQotc3RhdGljIHZvaWQgY2xlYW51cF9zY29yZWJvYXJkX2ZpbGUodm9pZCAqZm9vKQotewotICAgIHVubGluayhhcF9zY29yZWJvYXJkX2ZuYW1lKTsKLX0KLQotQVBJX0VYUE9SVCh2b2lkKSByZW9wZW5fc2NvcmVib2FyZChhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgaWYgKHNjb3JlYm9hcmRfZmQgIT0gLTEpCi0JYXBfY2xvc2Uoc2NvcmVib2FyZF9maWxlKTsKLQotICAgIGFwX29wZW4ocCwgYXBfc2NvcmVib2FyZF9mbmFtZSwgQVBSX0NSRUFURSB8IEFQUl9CSU5BUlkgfCBBUFJfUkVBRCB8IEFQUl9XUklURSwKLSAgICAgICAgICAgIEFQUl9VUkVBRCB8IEFQUl9VV1JJVEUgfCBBUFJfR1JFQUQgfCBBUFJfR1dSSVRFIHwgQVBSX1dSRUFEIHwgQVBSX1dXUklURSwKLSAgICAgICAgICAgICZzY29yZWJvYXJkX2ZpbGUpOwotICAgIGFwX2dldF9vc19maWxlKCZzY29yZWJvYXJkX2ZkLCBzY29yZWJvYXJkX2ZpbGUpOwotICAgIGlmIChzY29yZWJvYXJkX2ZkID09IC0xKSB7Ci0JcGVycm9yKGFwX3Njb3JlYm9hcmRfZm5hbWUpOwotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IG9wZW4gc2NvcmVib2FyZCBmaWxlOiIpOwotCWNsZWFuX2NoaWxkX2V4aXQoMSk7Ci0gICAgfQotfQotI2VuZGlmCi0KLS8qIENhbGxlZCBieSBwYXJlbnQgcHJvY2VzcyAqLwotdm9pZCByZWluaXRfc2NvcmVib2FyZChhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgaW50IHJ1bm5pbmdfZ2VuID0gMDsKLSAgICBpZiAoYXBfc2NvcmVib2FyZF9pbWFnZSkKLQlydW5uaW5nX2dlbiA9IGFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbC5ydW5uaW5nX2dlbmVyYXRpb247Ci0KLSNpZm5kZWYgU0NPUkVCT0FSRF9GSUxFCi0gICAgaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UgPT0gTlVMTCkgewotCXNldHVwX3NoYXJlZF9tZW0ocCk7Ci0gICAgfQotICAgIG1lbXNldChhcF9zY29yZWJvYXJkX2ltYWdlLCAwLCBTQ09SRUJPQVJEX1NJWkUpOwotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbC5ydW5uaW5nX2dlbmVyYXRpb24gPSBydW5uaW5nX2dlbjsKLSNlbHNlCi0gICAgYXBfc2NvcmVib2FyZF9pbWFnZSA9ICZfc2NvcmVib2FyZF9pbWFnZTsKLSAgICBhcF9zY29yZWJvYXJkX2ZuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocCwgYXBfc2NvcmVib2FyZF9mbmFtZSk7Ci0KLSAgICBhcF9vcGVuKHAsIGFwX3Njb3JlYm9hcmRfZm5hbWUsIEFQUl9DUkVBVEUgfCBBUFJfQklOQVJZIHwgQVBSX1JFQUQgfCBBUFJfV1JJVEUsCi0gICAgICAgICAgICBBUFJfVVJFQUQgfCBBUFJfVVdSSVRFIHwgQVBSX0dSRUFEIHwgQVBSX1dSRUFELCAmc2NvcmVib2FyZF9maWxlKTsKLSAgICBhcF9nZXRfb3NfZmlsZSgmc2NvcmVib2FyZF9mZCwgc2NvcmVib2FyZF9maWxlKTsKLSAgICBpZiAoc2NvcmVib2FyZF9mZCA9PSAtMSkgewotCXBlcnJvcihhcF9zY29yZWJvYXJkX2ZuYW1lKTsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBvcGVuIHNjb3JlYm9hcmQgZmlsZToiKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0gICAgYXBfcmVnaXN0ZXJfY2xlYW51cChwLCBOVUxMLCBjbGVhbnVwX3Njb3JlYm9hcmRfZmlsZSwgYXBfbnVsbF9jbGVhbnVwKTsKLQotICAgIG1lbXNldCgoY2hhciAqKSBhcF9zY29yZWJvYXJkX2ltYWdlLCAwLCBzaXplb2YoKmFwX3Njb3JlYm9hcmRfaW1hZ2UpKTsKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwucnVubmluZ19nZW5lcmF0aW9uID0gcnVubmluZ19nZW47Ci0gICAgZm9yY2Vfd3JpdGUoc2NvcmVib2FyZF9mZCwgYXBfc2NvcmVib2FyZF9pbWFnZSwgc2l6ZW9mKCphcF9zY29yZWJvYXJkX2ltYWdlKSk7Ci0jZW5kaWYKLX0KLQotLyogUm91dGluZXMgY2FsbGVkIHRvIGRlYWwgd2l0aCB0aGUgc2NvcmVib2FyZCBpbWFnZQotICogLS0tIG5vdGUgdGhhdCB3ZSBkbyAqbm90KiBuZWVkIHdyaXRlIGxvY2tzLCBzaW5jZSB1cGRhdGVfY2hpbGRfc3RhdHVzCi0gKiBvbmx5IHVwZGF0ZXMgYSAqc2luZ2xlKiByZWNvcmQgaW4gcGxhY2UsIGFuZCBvbmx5IG9uZSBwcm9jZXNzIHdyaXRlcyB0bwotICogYSBnaXZlbiBzY29yZWJvYXJkIHNsb3QgYXQgYSB0aW1lIChlaXRoZXIgdGhlIGNoaWxkIHByb2Nlc3Mgb3duaW5nIHRoYXQKLSAqIHNsb3QsIG9yIHRoZSBwYXJlbnQsIG5vdGluZyB0aGF0IHRoZSBjaGlsZCBoYXMgZGllZCkuCi0gKgotICogQXMgYSBmaW5hbCBub3RlIC0tLSBzZXR0aW5nIHRoZSBzY29yZSBlbnRyeSB0byBnZXRwaWQoKSBpcyBhbHdheXMgc2FmZSwKLSAqIHNpbmNlIHdoZW4gdGhlIHBhcmVudCBpcyB3cml0aW5nIGFuIGVudHJ5LCBpdCdzIG9ubHkgbm90aW5nIFNFUlZFUl9ERUFECi0gKiBhbnl3YXkuCi0gKi8KLQotYXBfaW5saW5lIHZvaWQgYXBfc3luY19zY29yZWJvYXJkX2ltYWdlKHZvaWQpCi17Ci0jaWZkZWYgU0NPUkVCT0FSRF9GSUxFCi0gICAgbHNlZWsoc2NvcmVib2FyZF9mZCwgMEwsIDApOwotICAgIGZvcmNlX3JlYWQoc2NvcmVib2FyZF9mZCwgYXBfc2NvcmVib2FyZF9pbWFnZSwgc2l6ZW9mKCphcF9zY29yZWJvYXJkX2ltYWdlKSk7Ci0jZW5kaWYKLX0KLQotI2VuZGlmIC8qIE1VTFRJVEhSRUFEICovCi0KLUFQSV9FWFBPUlQoaW50KSBhcF9leGlzdHNfc2NvcmVib2FyZF9pbWFnZSh2b2lkKQotewotICAgIHJldHVybiAoYXBfc2NvcmVib2FyZF9pbWFnZSA/IDEgOiAwKTsKLX0KLQotc3RhdGljIGFwX2lubGluZSB2b2lkIHB1dF9zY29yZWJvYXJkX2luZm8oaW50IGNoaWxkX251bSwgaW50IHRocmVhZF9udW0sIAotCQkJCSAgICAgICB0aHJlYWRfc2NvcmUgKm5ld19zY29yZV9yZWMpCi17Ci0gICAgLyogWFhYIC0gbmVlZHMgdG8gYmUgZml4ZWQgdG8gYWNjb3VudCBmb3IgdGhyZWFkcyAqLwotI2lmZGVmIFNDT1JFQk9BUkRfRklMRQotICAgIGxzZWVrKHNjb3JlYm9hcmRfZmQsIChsb25nKSBjaGlsZF9udW0gKiBzaXplb2YodGhyZWFkX3Njb3JlKSwgMCk7Ci0gICAgZm9yY2Vfd3JpdGUoc2NvcmVib2FyZF9mZCwgbmV3X3Njb3JlX3JlYywgc2l6ZW9mKHRocmVhZF9zY29yZSkpOwotI2VuZGlmCi19Ci0KLXZvaWQgdXBkYXRlX3Njb3JlYm9hcmRfZ2xvYmFsKHZvaWQpCi17Ci0jaWZkZWYgU0NPUkVCT0FSRF9GSUxFCi0gICAgbHNlZWsoc2NvcmVib2FyZF9mZCwKLQkgIChjaGFyICopICZhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwgLShjaGFyICopIGFwX3Njb3JlYm9hcmRfaW1hZ2UsIDApOwotICAgIGZvcmNlX3dyaXRlKHNjb3JlYm9hcmRfZmQsICZhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwsCi0JCXNpemVvZiBhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwpOwotI2VuZGlmCi19Ci0KLXZvaWQgaW5jcmVtZW50X2NvdW50cyhpbnQgY2hpbGRfbnVtLCBpbnQgdGhyZWFkX251bSwgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgbG9uZyBpbnQgYnMgPSAwOwotICAgIHRocmVhZF9zY29yZSAqc3M7Ci0KLSAgICBzcyA9ICZhcF9zY29yZWJvYXJkX2ltYWdlLT5zZXJ2ZXJzW2NoaWxkX251bV1bdGhyZWFkX251bV07Ci0KLSAgICBpZiAoci0+c2VudF9ib2R5Y3QpCi0JYXBfYmdldG9wdChyLT5jb25uZWN0aW9uLT5jbGllbnQsIEJPX0JZVEVDVCwgJmJzKTsKLQotI2lmZGVmIEhBVkVfVElNRVMKLSAgICB0aW1lcygmc3MtPnRpbWVzKTsKLSNlbmRpZgotICAgIHNzLT5hY2Nlc3NfY291bnQrKzsKLSAgICBzcy0+bXlfYWNjZXNzX2NvdW50Kys7Ci0gICAgc3MtPmNvbm5fY291bnQrKzsKLSAgICBzcy0+Ynl0ZXNfc2VydmVkICs9ICh1bnNpZ25lZCBsb25nKSBiczsKLSAgICBzcy0+bXlfYnl0ZXNfc2VydmVkICs9ICh1bnNpZ25lZCBsb25nKSBiczsKLSAgICBzcy0+Y29ubl9ieXRlcyArPSAodW5zaWduZWQgbG9uZykgYnM7Ci0KLSAgICBwdXRfc2NvcmVib2FyZF9pbmZvKGNoaWxkX251bSwgdGhyZWFkX251bSwgc3MpOwotCi19Ci0KLUFQSV9FWFBPUlQoaW50KSBmaW5kX2NoaWxkX2J5X3BpZChpbnQgcGlkKQotewotICAgIGludCBpOwotICAgIGludCBtYXhfZGFlbW9uc19saW1pdCA9IGFwX2dldF9tYXhfZGFlbW9ucygpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG1heF9kYWVtb25zX2xpbWl0OyArK2kpCi0JaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtpXS5waWQgPT0gcGlkKQotCSAgICByZXR1cm4gaTsKLQotICAgIHJldHVybiAtMTsKLX0KLQotaW50IGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMoaW50IGNoaWxkX251bSwgaW50IHRocmVhZF9udW0sIGludCBzdGF0dXMsIHJlcXVlc3RfcmVjICpyKQotewotICAgIGludCBvbGRfc3RhdHVzOwotICAgIHRocmVhZF9zY29yZSAqc3M7Ci0gICAgcGFyZW50X3Njb3JlICpwczsKLQotICAgIGlmIChjaGlsZF9udW0gPCAwKQotCXJldHVybiAtMTsKLQotICAgIHNzID0gJmFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbY2hpbGRfbnVtXVt0aHJlYWRfbnVtXTsKLSAgICBvbGRfc3RhdHVzID0gc3MtPnN0YXR1czsKLSAgICBzcy0+c3RhdHVzID0gc3RhdHVzOwotCi0gICAgcHMgPSAmYXBfc2NvcmVib2FyZF9pbWFnZS0+cGFyZW50W2NoaWxkX251bV07Ci0gICAgCi0gICAgaWYgKChzdGF0dXMgPT0gU0VSVkVSX1JFQURZICB8fCBzdGF0dXMgPT0gU0VSVkVSX0FDQ0VQVElORykKLQkmJiBvbGRfc3RhdHVzID09IFNFUlZFUl9TVEFSVElORykgewotICAgICAgICBzcy0+dGlkID0gcHRocmVhZF9zZWxmKCk7Ci0JcHMtPndvcmtlcl90aHJlYWRzID0gYXBfdGhyZWFkc19wZXJfY2hpbGQ7Ci0gICAgfQotCi0gICAgaWYgKGFwX2V4dGVuZGVkX3N0YXR1cykgewotCWlmIChzdGF0dXMgPT0gU0VSVkVSX1JFQURZIHx8IHN0YXR1cyA9PSBTRVJWRVJfREVBRCkgewotCSAgICAvKgotCSAgICAgKiBSZXNldCBpbmRpdmlkdWFsIGNvdW50ZXJzCi0JICAgICAqLwotCSAgICBpZiAoc3RhdHVzID09IFNFUlZFUl9ERUFEKSB7Ci0JCXNzLT5teV9hY2Nlc3NfY291bnQgPSAwTDsKLQkJc3MtPm15X2J5dGVzX3NlcnZlZCA9IDBMOwotCSAgICB9Ci0JICAgIHNzLT5jb25uX2NvdW50ID0gKHVuc2lnbmVkIHNob3J0KSAwOwotCSAgICBzcy0+Y29ubl9ieXRlcyA9ICh1bnNpZ25lZCBsb25nKSAwOwotCX0KLQlpZiAocikgewotCSAgICBjb25uX3JlYyAqYyA9IHItPmNvbm5lY3Rpb247Ci0JICAgIGFwX2NweXN0cm4oc3MtPmNsaWVudCwgYXBfZ2V0X3JlbW90ZV9ob3N0KGMsIHItPnBlcl9kaXJfY29uZmlnLAotCQkJCSAgUkVNT1RFX05PTE9PS1VQKSwgc2l6ZW9mKHNzLT5jbGllbnQpKTsKLQkgICAgaWYgKHItPnRoZV9yZXF1ZXN0ID09IE5VTEwpIHsKLQkJICAgIGFwX2NweXN0cm4oc3MtPnJlcXVlc3QsICJOVUxMIiwgc2l6ZW9mKHNzLT5yZXF1ZXN0KSk7Ci0JICAgIH0gZWxzZSBpZiAoci0+cGFyc2VkX3VyaS5wYXNzd29yZCA9PSBOVUxMKSB7Ci0JCSAgICBhcF9jcHlzdHJuKHNzLT5yZXF1ZXN0LCByLT50aGVfcmVxdWVzdCwgc2l6ZW9mKHNzLT5yZXF1ZXN0KSk7Ci0JICAgIH0gZWxzZSB7Ci0JCS8qIERvbid0IHJldmVhbCB0aGUgcGFzc3dvcmQgaW4gdGhlIHNlcnZlci1zdGF0dXMgdmlldyAqLwotCQkgICAgYXBfY3B5c3Rybihzcy0+cmVxdWVzdCwgYXBfcHN0cmNhdChyLT5wb29sLCByLT5tZXRob2QsICIgIiwKLQkJCQkJICAgICAgIGFwX3VucGFyc2VfdXJpX2NvbXBvbmVudHMoci0+cG9vbCwgJnItPnBhcnNlZF91cmksIFVOUF9PTUlUUEFTU1dPUkQpLAotCQkJCQkgICAgICAgci0+YXNzYmFja3dhcmRzID8gTlVMTCA6ICIgIiwgci0+cHJvdG9jb2wsIE5VTEwpLAotCQkJCSAgICAgICBzaXplb2Yoc3MtPnJlcXVlc3QpKTsKLQkgICAgfQotCSAgICBzcy0+dmhvc3RyZWMgPSAgci0+c2VydmVyOwotCX0KLSAgICB9Ci0gICAgCi0gICAgcHV0X3Njb3JlYm9hcmRfaW5mbyhjaGlsZF9udW0sIHRocmVhZF9udW0sIHNzKTsKLSAgICByZXR1cm4gb2xkX3N0YXR1czsKLX0KLQotdm9pZCBhcF90aW1lX3Byb2Nlc3NfcmVxdWVzdChpbnQgY2hpbGRfbnVtLCBpbnQgdGhyZWFkX251bSwgaW50IHN0YXR1cykKLXsKLSAgICB0aHJlYWRfc2NvcmUgKnNzOwotCi0gICAgaWYgKGNoaWxkX251bSA8IDApCi0JcmV0dXJuOwotCi0gICAgc3MgPSAmYXBfc2NvcmVib2FyZF9pbWFnZS0+c2VydmVyc1tjaGlsZF9udW1dW3RocmVhZF9udW1dOwotCi0gICAgaWYgKHN0YXR1cyA9PSBTVEFSVF9QUkVRVUVTVCkgewotICAgICAgLypzcy0+c3RhcnRfdGltZSA9IEdldEN1cnJlbnRUaW1lKCk7IHJldHVybiB0aW1lIGluIHVTIHNpbmNlIHRoZSAKLQllcG9jaC4gU29tZSBwbGF0Zm9ybXMgZG8gbm90IHN1cHBvcnQgZ2V0dGltZW9mZGF5LiBDcmVhdGUgYSByb3V0aW5lIAotCXRvIGdldCB0aGUgY3VycmVudCB0aW1lIGlzIHNvbWUgdXNlZnVsIHVuaXRzLiAqLwotICAgICAgICBpZiAoZ2V0dGltZW9mZGF5KCZzcy0+c3RhcnRfdGltZSwgKHN0cnVjdCB0aW1lem9uZSAqKSAwKSA8IDApIHsKLSAgICAgICAgICAgIHNzLT5zdGFydF90aW1lLnR2X3NlYyA9IHNzLT5zdGFydF90aW1lLnR2X3VzZWMgPSAwTDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChzdGF0dXMgPT0gU1RPUF9QUkVRVUVTVCkgewotICAgICAgLypzcy0+c3RvcF90aW1lID0gR2V0Q3VycmVudFRpbWUoKTsgCi0JcmV0dXJuIHRpbWUgaW4gdVMgc2luY2UgdGhlIGVwb2NoICovCi0gICAgICAgIAotICAgICAgICBpZiAoZ2V0dGltZW9mZGF5KCZzcy0+c3RvcF90aW1lLCAoc3RydWN0IHRpbWV6b25lICopIDApIDwgMCkgewotICAgICAgICAgICAgc3MtPnN0YXJ0X3RpbWUudHZfc2VjID0gc3MtPnN0YXJ0X3RpbWUudHZfdXNlYyA9IDBMOwotICAgICAgICB9Ci0gICAgfQotICAgIHB1dF9zY29yZWJvYXJkX2luZm8oY2hpbGRfbnVtLCB0aHJlYWRfbnVtLCBzcyk7Ci19Ci0KLS8qIFN0dWIgZnVuY3Rpb25zIHVudGlsIHRoaXMgTVBNIHN1cHBvcnRzIHRoZSBjb25uZWN0aW9uIHN0YXR1cyBBUEkgKi8KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF91cGRhdGVfY29ubmVjdGlvbl9zdGF0dXMobG9uZyBjb25uX2lkLCBjb25zdCBjaGFyICprZXksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKQotewotICAgIC8qIE5PUCAqLwotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX3Jlc2V0X2Nvbm5lY3Rpb25fc3RhdHVzKGxvbmcgY29ubl9pZCkKLXsKLSAgICAvKiBOT1AgKi8KLX0KLQpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9tcG10X3B0aHJlYWQvc2NvcmVib2FyZC5oIGIvc2VydmVyL21wbS9tcG10X3B0aHJlYWQvc2NvcmVib2FyZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTM2N2YzLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vbXBtdF9wdGhyZWFkL3Njb3JlYm9hcmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLSNpZm5kZWYgQVBBQ0hFX1NDT1JFQk9BUkRfSAotI2RlZmluZSBBUEFDSEVfU0NPUkVCT0FSRF9ICi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TWVNfVElNRVNfSAotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWVzLmg+Ci0jZWxpZiBkZWZpbmVkKFRQRikKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIm1wbV9kZWZhdWx0LmgiCS8qIEZvciBIQVJEXy4qX0xJTUlUICovCi0KLS8qIFRoZSBvcHRpbWl6ZWQgdGltZW91dCBjb2RlIG9ubHkgd29ya3MgaWYgd2UncmUgbm90IHVzaW5nIGEgc2NvcmVib2FyZCBmaWxlCi0gKi8KLSNpZiAoZGVmaW5lZCAoVVNFX01NQVBfU0NPUkVCT0FSRCkgfHwgZGVmaW5lZCAoVVNFX1NITUdFVF9TQ09SRUJPQVJEKSkKLSNkZWZpbmUgT1BUSU1JWkVfVElNRU9VVFMKLSNlbmRpZgotCi0vKiBTY29yZWJvYXJkIGluZm8gb24gYSBwcm9jZXNzIGlzLCBmb3Igbm93LCBrZXB0IHZlcnkgYnJpZWYgLS0tIAotICoganVzdCBzdGF0dXMgdmFsdWUgYW5kIHBpZCAodGhlIGxhdHRlciBzbyB0aGF0IHRoZSBjYXJldGFrZXIgcHJvY2VzcwotICogY2FuIHByb3Blcmx5IHVwZGF0ZSB0aGUgc2NvcmVib2FyZCB3aGVuIGEgcHJvY2VzcyBkaWVzKS4gIFdlIG1heSB3YW50Ci0gKiB0byBldmVudHVhbGx5IGFkZCBhIHNlcGFyYXRlIHNldCBvZiBsb25nX3Njb3JlIHN0cnVjdHVyZXMgd2hpY2ggd291bGQKLSAqIGdpdmUsIGZvciBlYWNoIHByb2Nlc3MsIHRoZSBudW1iZXIgb2YgcmVxdWVzdHMgc2VydmljZWQsIGFuZCBpbmZvIG9uCi0gKiB0aGUgY3VycmVudCwgb3IgbW9zdCByZWNlbnQsIHJlcXVlc3QuCi0gKgotICogU3RhdHVzIHZhbHVlczoKLSAqLwotCi0jZGVmaW5lIFNFUlZFUl9ERUFEIDAKLSNkZWZpbmUgU0VSVkVSX1NUQVJUSU5HIDEJLyogU2VydmVyIFN0YXJ0aW5nIHVwICovCi0jZGVmaW5lIFNFUlZFUl9SRUFEWSAyCQkvKiBXYWl0aW5nIGZvciBjb25uZWN0aW9uIChvciBhY2NlcHQoKSBsb2NrKSAqLwotI2RlZmluZSBTRVJWRVJfQlVTWV9SRUFEIDMJLyogUmVhZGluZyBhIGNsaWVudCByZXF1ZXN0ICovCi0jZGVmaW5lIFNFUlZFUl9CVVNZX1dSSVRFIDQJLyogUHJvY2Vzc2luZyBhIGNsaWVudCByZXF1ZXN0ICovCi0jZGVmaW5lIFNFUlZFUl9CVVNZX0tFRVBBTElWRSA1CS8qIFdhaXRpbmcgZm9yIG1vcmUgcmVxdWVzdHMgdmlhIGtlZXBhbGl2ZSAqLwotI2RlZmluZSBTRVJWRVJfQlVTWV9MT0cgNgkvKiBMb2dnaW5nIHRoZSByZXF1ZXN0ICovCi0jZGVmaW5lIFNFUlZFUl9CVVNZX0ROUyA3CS8qIExvb2tpbmcgdXAgYSBob3N0bmFtZSAqLwotI2RlZmluZSBTRVJWRVJfR1JBQ0VGVUwgOAkvKiBzZXJ2ZXIgaXMgZ3JhY2VmdWxseSBmaW5pc2hpbmcgcmVxdWVzdCAqLwotI2RlZmluZSBTRVJWRVJfQUNDRVBUSU5HIDkJLyogdGhyZWFkIGlzIGFjY2VwdGluZyBjb25uZWN0aW9ucyAqLwotI2RlZmluZSBTRVJWRVJfUVVFVUVJTkcJMTAgICAgICAvKiB0aHJlYWQgaXMgcHV0dGluZyBjb25uZWN0aW9uIG9uIHRoZSBxdWV1ZSAqLwotI2RlZmluZSBTRVJWRVJfTlVNX1NUQVRVUyAxMQkvKiBudW1iZXIgb2Ygc3RhdHVzIHNldHRpbmdzICovCi0KLS8qIEEgInZpcnR1YWwgdGltZSIgaXMgc2ltcGx5IGEgY291bnRlciB0aGF0IGluZGljYXRlcyB0aGF0IGEgY2hpbGQgaXMKLSAqIG1ha2luZyBwcm9ncmVzcy4gIFRoZSBwYXJlbnQgY2hlY2tzIHVwIG9uIGVhY2ggY2hpbGQsIGFuZCB3aGVuIHRoZXkgaGF2ZQotICogbWFkZSBwcm9ncmVzcyBpdCByZXNldHMgdGhlIGxhc3RfcnRpbWUgZWxlbWVudC4gIEJ1dCB3aGVuIHRoZSBjaGlsZCBoYXNuJ3QKLSAqIG1hZGUgcHJvZ3Jlc3MgaW4gYSB0aW1lIHRoYXQncyByb3VnaGx5IHRpbWVvdXRfbGVuIHNlY29uZHMgbG9uZywgaXQgaXMKLSAqIHNlbnQgYSBTSUdBTFJNLgotICoKLSAqIHZ0aW1lIGlzIGFuIG9wdGltaXphdGlvbiB0aGF0IGlzIHVzZWQgb25seSB3aGVuIHRoZSBzY29yZWJvYXJkIGlzIGluCi0gKiBzaGFyZWQgbWVtb3J5IChpdCdzIG5vdCBlYXN5L2ZlYXNpYmxlIHRvIGRvIGl0IGluIGEgc2NvcmVib2FyZCBmaWxlKS4KLSAqIFRoZSBlc3NlbnRpYWwgb2JzZXJ2YXRpb24gaXMgdGhhdCB0aW1lb3V0cyByYXJlbHkgb2NjdXIsIHRoZSB2YXN0IG1ham9yaXR5Ci0gKiBvZiBoaXRzIGZpbmlzaCBiZWZvcmUgYW55IHRpbWVvdXQgaGFwcGVucy4gIFNvIGl0IHJlYWxseSBzdWNrcyB0byBoYXZlIHRvCi0gKiBhc2sgdGhlIG9wZXJhdGluZyBzeXN0ZW0gdG8gc2V0IHVwIGFuZCBkZXN0cm95IGFsYXJtcyBtYW55IHRpbWVzIGR1cmluZwotICogYSByZXF1ZXN0LgotICovCi10eXBlZGVmIHVuc2lnbmVkIHZ0aW1lX3Q7Ci0KLS8qIFR5cGUgdXNlZCBmb3IgZ2VuZXJhdGlvbiBpbmRpY2llcy4gIFN0YXJ0dXAgYW5kIGV2ZXJ5IHJlc3RhcnQgY2F1c2UgYQotICogbmV3IGdlbmVyYXRpb24gb2YgY2hpbGRyZW4gdG8gYmUgc3Bhd25lZC4gIENoaWxkcmVuIHdpdGhpbiB0aGUgc2FtZQotICogZ2VuZXJhdGlvbiBzaGFyZSB0aGUgc2FtZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIC0tIHBvaW50ZXJzIHRvIHN0dWZmCi0gKiBjcmVhdGVkIGF0IGNvbmZpZyB0aW1lIGluIHRoZSBwYXJlbnQgYXJlIHZhbGlkIGFjcm9zcyBjaGlsZHJlbi4gIEZvcgotICogZXhhbXBsZSwgdGhlIHZob3N0cmVjIHBvaW50ZXIgaW4gdGhlIHNjb3JlYm9hcmQgYmVsb3cgaXMgdmFsaWQgaW4gYWxsCi0gKiBjaGlsZHJlbiBvZiB0aGUgc2FtZSBnZW5lcmF0aW9uLgotICoKLSAqIFRoZSBzYWZlIHdheSB0byBhY2Nlc3MgdGhlIHZob3N0IHBvaW50ZXIgaXMgbGlrZSB0aGlzOgotICoKLSAqIHNob3J0X3Njb3JlICpzcyA9IHBvaW50ZXIgdG8gd2hpY2h2ZXIgc2xvdCBpcyBpbnRlcmVzdGluZzsKLSAqIHBhcmVudF9zY29yZSAqcHMgPSBwb2ludGVyIHRvIHdoaWNodmVyIHNsb3QgaXMgaW50ZXJlc3Rpbmc7Ci0gKiBzZXJ2ZXJfcmVjICp2aCA9IHNzLT52aG9zdHJlYzsKLSAqCi0gKiBpZiAocHMtPmdlbmVyYXRpb24gIT0gYXBfbXlfZ2VuZXJhdGlvbikgewotICogICAgIHZoID0gTlVMTDsKLSAqIH0KLSAqCi0gKiB0aGVuIGlmIHZoIGlzIG5vdCBOVUxMIGl0J3MgdmFsaWQgaW4gdGhpcyBjaGlsZC4KLSAqCi0gKiBUaGlzIGF2b2lkcyB2YXJpb3VzIHJhY2UgY29uZGl0aW9ucyBhcm91bmQgcmVzdGFydHMuCi0gKi8KLXR5cGVkZWYgaW50IGFwX2dlbmVyYXRpb25fdDsKLQotLyogc3R1ZmYgd2hpY2ggaXMgdGhyZWFkIHNwZWNpZmljICovCi10eXBlZGVmIHN0cnVjdCB7Ci0jaWZkZWYgT1BUSU1JWkVfVElNRU9VVFMKLSAgICB2dGltZV90IGN1cl92dGltZTsJCS8qIHRoZSBjaGlsZCdzIGN1cnJlbnQgdnRpbWUgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB0aW1lb3V0X2xlbjsJLyogbGVuZ3RoIG9mIHRoZSB0aW1lb3V0ICovCi0jZW5kaWYKLSAgICBwdGhyZWFkX3QgdGlkOwotICAgIHVuc2lnbmVkIGNoYXIgc3RhdHVzOwotICAgIHVuc2lnbmVkIGxvbmcgYWNjZXNzX2NvdW50OwotICAgIHVuc2lnbmVkIGxvbmcgYnl0ZXNfc2VydmVkOwotICAgIHVuc2lnbmVkIGxvbmcgbXlfYWNjZXNzX2NvdW50OwotICAgIHVuc2lnbmVkIGxvbmcgbXlfYnl0ZXNfc2VydmVkOwotICAgIHVuc2lnbmVkIGxvbmcgY29ubl9ieXRlczsKLSAgICB1bnNpZ25lZCBzaG9ydCBjb25uX2NvdW50OwotI2lmbmRlZiBIQVZFX0dFVFRJTUVPRkRBWQotICAgIGNsb2NrX3Qgc3RhcnRfdGltZTsKLSAgICBjbG9ja190IHN0b3BfdGltZTsKLSNlbHNlCi0gICAgc3RydWN0IHRpbWV2YWwgc3RhcnRfdGltZTsKLSAgICBzdHJ1Y3QgdGltZXZhbCBzdG9wX3RpbWU7Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1RJTUVTCi0gICAgc3RydWN0IHRtcyB0aW1lczsKLSNlbmRpZgotI2lmbmRlZiBPUFRJTUlaRV9USU1FT1VUUwotICAgIHRpbWVfdCBsYXN0X3VzZWQ7Ci0jZW5kaWYKLSAgICBjaGFyIGNsaWVudFszMl07CQkvKiBLZWVwICdlbSBzbWFsbC4uLiAqLwotICAgIGNoYXIgcmVxdWVzdFs2NF07CQkvKiBXZSBqdXN0IHdhbnQgYW4gaWRlYS4uLiAqLwotICAgIHNlcnZlcl9yZWMgKnZob3N0cmVjOwkvKiBXaGF0IHZpcnR1YWwgaG9zdCBpcyBiZWluZyBhY2Nlc3NlZD8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0VFIEFCT1ZFIEZPUiBTQUZFIFVTQUdFISAqLwotfSB0aHJlYWRfc2NvcmU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBhcF9nZW5lcmF0aW9uX3QgcnVubmluZ19nZW5lcmF0aW9uOwkvKiB0aGUgZ2VuZXJhdGlvbiBvZiBjaGlsZHJlbiB3aGljaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNob3VsZCBzdGlsbCBiZSBzZXJ2aW5nIHJlcXVlc3RzLiAqLwotfSBnbG9iYWxfc2NvcmU7Ci0KLS8qIHN0dWZmIHdoaWNoIHRoZSBwYXJlbnQgZ2VuZXJhbGx5IHdyaXRlcyBhbmQgdGhlIGNoaWxkcmVuIHJhcmVseSByZWFkICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgcGlkX3QgcGlkOwotICAgIGFwX2dlbmVyYXRpb25fdCBnZW5lcmF0aW9uOwkvKiBnZW5lcmF0aW9uIG9mIHRoaXMgY2hpbGQgKi8KLSAgICBpbnQgd29ya2VyX3RocmVhZHM7Ci0jaWZkZWYgT1BUSU1JWkVfVElNRU9VVFMKLSAgICB0aW1lX3QgbGFzdF9ydGltZTsJCS8qIHRpbWUoMCkgb2YgdGhlIGxhc3QgY2hhbmdlICovCi0gICAgdnRpbWVfdCBsYXN0X3Z0aW1lOwkJLyogdGhlIGxhc3QgdnRpbWUgdGhlIHBhcmVudCBoYXMgc2VlbiAqLwotI2VuZGlmCi19IHBhcmVudF9zY29yZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHRocmVhZF9zY29yZSBzZXJ2ZXJzW0hBUkRfU0VSVkVSX0xJTUlUXVtIQVJEX1RIUkVBRF9MSU1JVF07Ci0gICAgcGFyZW50X3Njb3JlIHBhcmVudFtIQVJEX1NFUlZFUl9MSU1JVF07Ci0gICAgZ2xvYmFsX3Njb3JlIGdsb2JhbDsKLX0gc2NvcmVib2FyZDsKLQotI2RlZmluZSBTQ09SRUJPQVJEX1NJWkUJCXNpemVvZihzY29yZWJvYXJkKQotI2lmZGVmIFRQRgotI2RlZmluZSBTQ09SRUJPQVJEX05BTUUJCSJTQ09SRUJSRCIKLSNkZWZpbmUgU0NPUkVCT0FSRF9GUkFNRVMJCVNDT1JFQk9BUkRfU0laRS80MDk1ICsgMQotI2VuZGlmCi0KLUFQSV9FWFBPUlQoaW50KSBhcF9leGlzdHNfc2NvcmVib2FyZF9pbWFnZSh2b2lkKTsKLXZvaWQgcmVpbml0X3Njb2FyZWJvYXJkKGFwX2NvbnRleHRfdCAqcCk7Ci12b2lkIGNsZWFudXBfc2NvcmVib2FyZCh2b2lkKTsKLUFQSV9FWFBPUlQodm9pZCkgYXBfc3luY19zY29yZWJvYXJkX2ltYWdlKHZvaWQpOwotCi0jaWYgZGVmaW5lZChVU0VfT1MyX1NDT1JFQk9BUkQpCi1jYWRkcl90IGNyZWF0ZV9zaGFyZWRfaGVhcChjb25zdCBjaGFyICpuYW1lLCBzaXplX3Qgc2l6ZSk7Ci1jYWRkcl90IGdldF9zaGFyZWRfaGVhcChjb25zdCBjaGFyICpOYW1lKTsKLSNlbGlmIGRlZmluZWQoVVNFX1BPU0lYX1NDT1JFQk9BUkQpCi1zdGF0aWMgdm9pZCBjbGVhbnVwX3NoYXJlZF9tZW0odm9pZCAqZCk7Ci0jZWxzZQotdm9pZCByZWluaXRfc2NvcmVib2FyZChhcF9jb250ZXh0X3QgKnApOwotI2VuZGlmCi0KLUFQSV9FWFBPUlQodm9pZCkgcmVvcGVuX3Njb3JlYm9hcmQoYXBfY29udGV4dF90ICpwKTsKLQotYXBfaW5saW5lIHZvaWQgYXBfc3luY19zY29yZWJvYXJkX2ltYWdlKHZvaWQpOwotdm9pZCBpbmNyZW1lbnRfY291bnRzKGludCBjaGlsZF9udW0sIGludCB0aHJlYWRfbnVtLCByZXF1ZXN0X3JlYyAqcik7Ci12b2lkIHVwZGF0ZV9zY29yZWJvYXJkX2dsb2JhbCh2b2lkKTsKLUFQSV9FWFBPUlQoaW50KSBmaW5kX2NoaWxkX2J5X3BpZChpbnQgcGlkKTsKLWludCBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKGludCBjaGlsZF9udW0sIGludCB0aHJlYWRfbnVtLCBpbnQgc3RhdHVzLCByZXF1ZXN0X3JlYyAqcik7Ci12b2lkIGFwX3RpbWVfcHJvY2Vzc19yZXF1ZXN0KGludCBjaGlsZF9udW0sIGludCB0aHJlYWRfbnVtLCBpbnQgc3RhdHVzKTsKLQotCi0KLUFQSV9WQVJfRVhQT1JUIGV4dGVybiBzY29yZWJvYXJkICphcF9zY29yZWJvYXJkX2ltYWdlOwotCi1BUElfVkFSX0VYUE9SVCBleHRlcm4gYXBfZ2VuZXJhdGlvbl90IHZvbGF0aWxlIGFwX215X2dlbmVyYXRpb247Ci0KLS8qIGZvciB0aW1lX3Byb2Nlc3NfcmVxdWVzdCgpIGluIGh0dHBfbWFpbi5jICovCi0jZGVmaW5lIFNUQVJUX1BSRVFVRVNUIDEKLSNkZWZpbmUgU1RPUF9QUkVRVUVTVCAgMgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYJLyogIUFQQUNIRV9TQ09SRUJPQVJEX0ggKi8KZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vcHJlZm9yay8uY3ZzaWdub3JlIGIvc2VydmVyL21wbS9wcmVmb3JrLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MWY2NmYuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9wcmVmb3JrLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSoubG8KLSoubGEKLU1ha2VmaWxlCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL3ByZWZvcmsvTWFrZWZpbGUuaW4gYi9zZXJ2ZXIvbXBtL3ByZWZvcmsvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMDg2MDcuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9wcmVmb3JrL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCi1ERVBUSCAgICAgPSAuLi8uLi8uLgotdG9wc3JjZGlyID0gQHRvcHNyY2RpckAKLXNyY2RpciAgICA9IEBzcmNkaXJACi1WUEFUSCAgICAgPSBAc3JjZGlyQAotCi1MVExJQlJBUllfTkFNRSAgICA9IGxpYnByZWZvcmsubGEKLUxUTElCUkFSWV9TT1VSQ0VTID0gcHJlZm9yay5jCi0KLWluY2x1ZGUgJCh0b3BzcmNkaXIpL2J1aWxkL2x0bGliLm1rCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL3ByZWZvcmsvTWFrZWZpbGUubGliZGlyIGIvc2VydmVyL21wbS9wcmVmb3JrL01ha2VmaWxlLmxpYmRpcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1MjU0MC4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL3ByZWZvcmsvTWFrZWZpbGUubGliZGlyCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1UaGlzIGlzIGEgcGxhY2UtaG9sZGVyIHdoaWNoIGluZGljYXRlcyB0byBDb25maWd1cmUgdGhhdCBpdCBzaG91bGRuJ3QKLXByb3ZpZGUgdGhlIGRlZmF1bHQgdGFyZ2V0cyB3aGVuIGJ1aWxkaW5nIHRoZSBNYWtlZmlsZSBpbiB0aGlzIGRpcmVjdG9yeS4KLUluc3RlYWQgaXQnbGwganVzdCBwcmVwZW5kIGFsbCB0aGUgaW1wb3J0YW50IHZhcmlhYmxlIGRlZmluaXRpb25zLCBhbmQKLWNvcHkgdGhlIE1ha2VmaWxlLnRtcGwgb250byB0aGUgZW5kLgpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9wcmVmb3JrL2NvbmZpZy5tNCBiL3NlcnZlci9tcG0vcHJlZm9yay9jb25maWcubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYmY0ZmEuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9wcmVmb3JrL2NvbmZpZy5tNAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLWlmIHRlc3QgIiRNUE1fTkFNRSIgPSAicHJlZm9yayIgOyB0aGVuCi1kbmwgVHVybiBvZmYgYWxsIHRocmVhZGluZyBmdW5jdGlvbnMgaW4gQVBSCi0gICAgYWNfY3ZfZW5hYmxlX3RocmVhZHM9Im5vIgotICAgIEFDX0NBQ0hFX1NBVkUKLQotICAgIEFQQUNIRV9GQVNUX09VVFBVVChtb2R1bGVzL21wbS8kTVBNX05BTUUvTWFrZWZpbGUpCi0KLSAgICBBUEFDSEVfTVBNX0NIRUNLX1NITUVNCi0KLWRubCBPYnNvbGV0ZSBzY29yZWJvYXJkIGNvZGUgdXNlcyB0aGlzLgotICAgIEFDX0NIRUNLX0hFQURFUlMoc3lzL3RpbWVzLmgpCi0gICAgQUNfQ0hFQ0tfRlVOQ1ModGltZXMpCi1maQpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9wcmVmb3JrL21wbV9kZWZhdWx0LmggYi9zZXJ2ZXIvbXBtL3ByZWZvcmsvbXBtX2RlZmF1bHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMxYjUxNi4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL3ByZWZvcmsvbXBtX2RlZmF1bHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyAKLSAqIGFyZSBtZXQ6IAotICogCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gIAotICogCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCAKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiAKLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgCi0gKiAgICBkaXN0cmlidXRpb24uIAotICogCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDogCi0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwIAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIgCi0gKiAKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8gCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgCi0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4gCi0gKiAKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiIAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLiAKLSAqIAotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZyAKLSAqICAgIGFja25vd2xlZGdtZW50OiAKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAgCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIiAKLSAqIAotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZIAotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSAKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SIAotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCAKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCAKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyAKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIAotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCAKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAotICogCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueSAKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZCAKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvciAKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4gCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIAotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uIAotICogCi0gKi8gCi0KLSNpZm5kZWYgQVBBQ0hFX01QTV9ERUZBVUxUX0gKLSNkZWZpbmUgQVBBQ0hFX01QTV9ERUZBVUxUX0gKLQotLyogTnVtYmVyIG9mIHNlcnZlcnMgdG8gc3Bhd24gb2ZmIGJ5IGRlZmF1bHQgLS0tIGFsc28sIGlmIGZld2VyIHRoYW4KLSAqIHRoaXMgZnJlZSB3aGVuIHRoZSBjYXJldGFrZXIgY2hlY2tzLCBpdCB3aWxsIHNwYXduIG1vcmUuCi0gKi8KLSNpZm5kZWYgREVGQVVMVF9TVEFSVF9EQUVNT04KLSNkZWZpbmUgREVGQVVMVF9TVEFSVF9EQUVNT04gNQotI2VuZGlmCi0KLS8qIE1heGltdW0gbnVtYmVyIG9mICpmcmVlKiBzZXJ2ZXIgcHJvY2Vzc2VzIC0tLSBtb3JlIHRoYW4gdGhpcywgYW5kCi0gKiB0aGV5IHdpbGwgZGllIG9mZi4KLSAqLwotCi0jaWZuZGVmIERFRkFVTFRfTUFYX0ZSRUVfREFFTU9OCi0jZGVmaW5lIERFRkFVTFRfTUFYX0ZSRUVfREFFTU9OIDEwCi0jZW5kaWYKLQotLyogTWluaW11bSAtLS0gZmV3ZXIgdGhhbiB0aGlzLCBhbmQgbW9yZSB3aWxsIGJlIGNyZWF0ZWQgKi8KLQotI2lmbmRlZiBERUZBVUxUX01JTl9GUkVFX0RBRU1PTgotI2RlZmluZSBERUZBVUxUX01JTl9GUkVFX0RBRU1PTiA1Ci0jZW5kaWYKLQotLyogTGltaXQgb24gdGhlIHRvdGFsIC0tLSBjbGllbnRzIHdpbGwgYmUgbG9ja2VkIG91dCBpZiBtb3JlIHNlcnZlcnMgdGhhbgotICogdGhpcyBhcmUgbmVlZGVkLiAgSXQgaXMgaW50ZW5kZWQgc29sZWx5IHRvIGtlZXAgdGhlIHNlcnZlciBmcm9tIGNyYXNoaW5nCi0gKiB3aGVuIHRoaW5ncyBnZXQgb3V0IG9mIGhhbmQuCi0gKgotICogV2Uga2VlcCBhIGhhcmQgbWF4aW11bSBudW1iZXIgb2Ygc2VydmVycywgZm9yIHR3byByZWFzb25zIC0tLSBmaXJzdCBvZmYsCi0gKiBpbiBjYXNlIHNvbWV0aGluZyBnb2VzIHNlcmlvdXNseSB3cm9uZywgd2Ugd2FudCB0byBzdG9wIHRoZSBmb3JrIGJvbWIKLSAqIHNob3J0IG9mIGFjdHVhbGx5IGNyYXNoaW5nIHRoZSBtYWNoaW5lIHdlJ3JlIHJ1bm5pbmcgb24gYnkgZmlsbGluZyBzb21lCi0gKiBrZXJuZWwgdGFibGUuICBTZWNvbmRseSwgaXQga2VlcHMgdGhlIHNpemUgb2YgdGhlIHNjb3JlYm9hcmQgZmlsZSBzbWFsbAotICogZW5vdWdoIHRoYXQgd2UgY2FuIHJlYWQgdGhlIHdob2xlIHRoaW5nIHdpdGhvdXQgd29ycnlpbmcgdG9vIG11Y2ggYWJvdXQKLSAqIHRoZSBvdmVyaGVhZC4KLSAqLwotI2lmbmRlZiBIQVJEX1NFUlZFUl9MSU1JVAotI2RlZmluZSBIQVJEX1NFUlZFUl9MSU1JVCAyNTYKLSNlbmRpZgotCi0vKiBGaWxlIHVzZWQgZm9yIGFjY2VwdCBsb2NraW5nLCB3aGVuIHdlIHVzZSBhIGZpbGUgKi8KLSNpZm5kZWYgREVGQVVMVF9MT0NLRklMRQotI2RlZmluZSBERUZBVUxUX0xPQ0tGSUxFICJsb2dzL2FjY2VwdC5sb2NrIgotI2VuZGlmCi0KLS8qIFNjb3JlYm9hcmQgZmlsZSwgaWYgdGhlcmUgaXMgb25lICovCi0jaWZuZGVmIERFRkFVTFRfU0NPUkVCT0FSRAotI2RlZmluZSBERUZBVUxUX1NDT1JFQk9BUkQgImxvZ3MvYXBhY2hlX3J1bnRpbWVfc3RhdHVzIgotI2VuZGlmCi0KLS8qIFdoZXJlIHRoZSBtYWluL3BhcmVudCBwcm9jZXNzJ3MgcGlkIGlzIGxvZ2dlZCAqLwotI2lmbmRlZiBERUZBVUxUX1BJRExPRwotI2RlZmluZSBERUZBVUxUX1BJRExPRyAibG9ncy9odHRwZC5waWQiCi0jZW5kaWYKLQotLyoKLSAqIEludGVydmFsLCBpbiBtaWNyb3NlY29uZHMsIGJldHdlZW4gc2NvcmVib2FyZCBtYWludGVuYW5jZS4KLSAqLwotI2lmbmRlZiBTQ09SRUJPQVJEX01BSU5URU5BTkNFX0lOVEVSVkFMCi0jZGVmaW5lIFNDT1JFQk9BUkRfTUFJTlRFTkFOQ0VfSU5URVJWQUwgMTAwMDAwMAotI2VuZGlmCi0KLS8qIE51bWJlciBvZiByZXF1ZXN0cyB0byB0cnkgdG8gaGFuZGxlIGluIGEgc2luZ2xlIHByb2Nlc3MuICBJZiA8PSAwLAotICogdGhlIGNoaWxkcmVuIGRvbid0IGRpZSBvZmYuCi0gKi8KLSNpZm5kZWYgREVGQVVMVF9NQVhfUkVRVUVTVFNfUEVSX0NISUxECi0jZGVmaW5lIERFRkFVTFRfTUFYX1JFUVVFU1RTX1BFUl9DSElMRCAxMDAwMAotI2VuZGlmCi0KLSNlbmRpZiAvKiBBUF9NUE1fREVGQVVMVF9IICovCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL3ByZWZvcmsvcHJlZm9yay5jIGIvc2VydmVyL21wbS9wcmVmb3JrL3ByZWZvcmsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhMGZlMi4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL3ByZWZvcmsvcHJlZm9yay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzAyNSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBodHRwZC5jOiBzaW1wbGUgaHR0cCBkYWVtb24gZm9yIGFuc3dlcmluZyBXV1cgZmlsZSByZXF1ZXN0cwotICoKLSAqIAotICogMDMtMjEtOTMgIFJvYiBNY0Nvb2wgd3JvdGUgb3JpZ2luYWwgY29kZSAodXAgdG8gTkNTQSBIVFRQZCAxLjMpCi0gKiAKLSAqIDAzLTA2LTk1ICBibG9uZwotICogIGNoYW5nZWQgc2VydmVyIG51bWJlciBmb3IgY2hpbGQtYWxvbmUgcHJvY2Vzc2VzIHRvIDAgYW5kIGNoYW5nZWQgbmFtZQotICogICBvZiBwcm9jZXNzZXMKLSAqCi0gKiAwMy0xMC05NSAgYmxvbmcKLSAqICAgICAgQWRkZWQgbnVtZXJvdXMgc3BlZWQgaGFja3MgcHJvcG9zZWQgYnkgUm9iZXJ0IFMuIFRoYXUgKHJzdEBhaS5taXQuZWR1KSAKLSAqICAgICAgaW5jbHVkaW5nIHNldCBncm91cCBiZWZvcmUgZm9yaywgYW5kIGNhbGwgZ2V0dGltZSBiZWZvcmUgdG8gZm9yawotICogICAgICB0byBzZXQgdXAgbGlicmFyaWVzLgotICoKLSAqIDA0LTE0LTk1ICByc3QgLyByaAotICogICAgICBCcmFuZG9uJ3MgY29kZSBzbmFyZmVkIGZyb20gTkNTQSAxLjQsIGJ1dCB0aW5rZXJlZCB0byB3b3JrIHdpdGggdGhlCi0gKiAgICAgIEFwYWNoZSBzZXJ2ZXIsIGFuZCBhbHNvIHRvIGhhdmUgY2hpbGQgcHJvY2Vzc2VzIGRvIGFjY2VwdCgpIGRpcmVjdGx5LgotICoKLSAqIEFwcmlsLUp1bHkgJzk1IHJzdAotICogICAgICBFeHRlbnNpdmUgcmV3b3JrIGZvciBBcGFjaGUuCi0gKi8KLQotLyogVE9ETzogdGhpcyBpcyBhIGNvYmJsZWQgdG9nZXRoZXIgcHJlZm9yayBNUE0gZXhhbXBsZS4uLiBpdCBzaG91bGQgbW9zdGx5Ci0gKiBUT0RPOiBiZWhhdmUgbGlrZSBhcGFjaGUtMS4zLi4uIGhlcmUncyBhIHNob3J0IGxpc3Qgb2YgdGhpbmdzIEkgdGhpbmsKLSAqIFRPRE86IG5lZWQgY2xlYW5pbmcgdXAgc3RpbGw6Ci0gKiBUT0RPOiAtIHVzZSByYWxmJ3MgbW0gc3R1ZmYgZm9yIHRoZSBzaGFyZWQgbWVtIGFuZCBtdXRleGVzCi0gKiBUT0RPOiAtIGNsZWFuIHVwIHNjb3JlYm9hcmQgc3R1ZmYgd2hlbiB3ZSBmaWd1cmUgb3V0IGhvdyB0byBkbyBpdCBpbiAyLjAKLSAqLwotCi0jZGVmaW5lIENPUkVfUFJJVkFURQotCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiYXByX3BvcnRhYmxlLmgiCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJtcG1fZGVmYXVsdC5oIgotI2luY2x1ZGUgIm1wbV9zdGF0dXMuaCIKLSNpbmNsdWRlICJodHRwX21haW4uaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCQkvKiBmb3IgZ2V0X3JlbW90ZV9ob3N0ICovCi0jaW5jbHVkZSAiaHR0cF9jb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAic2NvcmVib2FyZC5oIgotI2luY2x1ZGUgImFwX21wbS5oIgotI2luY2x1ZGUgInVuaXhkLmgiCi0jaW5jbHVkZSAiaW9sX3NvY2tldC5oIgotI2luY2x1ZGUgImFwX2xpc3Rlbi5oIgotI2luY2x1ZGUgImFwX21tbi5oIgotI2luY2x1ZGUgPHN5cy90aW1lcy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaWZkZWYgVVNFX1NITUdFVF9TQ09SRUJPQVJECi0jaW5jbHVkZSA8c3lzL2lwYy5oPgotI2luY2x1ZGUgPHN5cy9zaG0uaD4KLSNlbmRpZgotCi0KLQotI2lmZGVmIEhBVkVfQlNUUklOR19ICi0jaW5jbHVkZSA8YnN0cmluZy5oPgkJLyogZm9yIElSSVgsIEZEX1NFVCBjYWxscyBiemVybygpICovCi0jZW5kaWYKLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotLyogY29uZmlnIGdsb2JhbHMgKi8KLQotc3RhdGljIGludCBhcF9tYXhfcmVxdWVzdHNfcGVyX2NoaWxkPTA7Ci1zdGF0aWMgY2hhciAqYXBfcGlkX2ZuYW1lPU5VTEw7Ci1zdGF0aWMgY2hhciAqYXBfc2NvcmVib2FyZF9mbmFtZT1OVUxMOwotc3RhdGljIGNoYXIgKmFwX2xvY2tfZm5hbWU7Ci1zdGF0aWMgaW50IGFwX2RhZW1vbnNfdG9fc3RhcnQ9MDsKLXN0YXRpYyBpbnQgYXBfZGFlbW9uc19taW5fZnJlZT0wOwotc3RhdGljIGludCBhcF9kYWVtb25zX21heF9mcmVlPTA7Ci1zdGF0aWMgaW50IGFwX2RhZW1vbnNfbGltaXQ9MDsKLXN0YXRpYyB0aW1lX3QgYXBfcmVzdGFydF90aW1lPTA7Ci1zdGF0aWMgaW50IGFwX2V4dGVuZGVkX3N0YXR1cyA9IDA7Ci0KLS8qCi0gKiBUaGUgbWF4IGNoaWxkIHNsb3QgZXZlciBhc3NpZ25lZCwgcHJlc2VydmVkIGFjcm9zcyByZXN0YXJ0cy4gIE5lY2Vzc2FyeQotICogdG8gZGVhbCB3aXRoIE1heENsaWVudHMgY2hhbmdlcyBhY3Jvc3MgU0lHVVNSMSByZXN0YXJ0cy4gIFdlIHVzZSB0aGlzCi0gKiB2YWx1ZSB0byBvcHRpbWl6ZSByb3V0aW5lcyB0aGF0IGhhdmUgdG8gc2NhbiB0aGUgZW50aXJlIHNjb3JlYm9hcmQuCi0gKi8KLXN0YXRpYyBpbnQgbWF4X2RhZW1vbnNfbGltaXQgPSAtMTsKLQotc3RhdGljIGNoYXIgYXBfY29yZWR1bXBfZGlyW01BWF9TVFJJTkdfTEVOXTsKLQotLyogKk5vbiotc2hhcmVkIGh0dHBfbWFpbiBnbG9iYWxzLi4uICovCi0KLXN0YXRpYyBzZXJ2ZXJfcmVjICpzZXJ2ZXJfY29uZjsKLXN0YXRpYyBhcF9zb2NrZXRfdCAqc2Q7Ci1zdGF0aWMgZmRfc2V0IGxpc3RlbmZkczsKLXN0YXRpYyBpbnQgbGlzdGVubWF4ZmQ7Ci0KLS8qIG9uZV9wcm9jZXNzIC0tLSBkZWJ1Z2dpbmcgbW9kZSB2YXJpYWJsZTsgY2FuIGJlIHNldCBmcm9tIHRoZSBjb21tYW5kIGxpbmUKLSAqIHdpdGggdGhlIC1YIGZsYWcuICBJZiBzZXQsIHRoaXMgZ2V0cyB5b3UgdGhlIGNoaWxkX21haW4gbG9vcCBydW5uaW5nCi0gKiBpbiB0aGUgcHJvY2VzcyB3aGljaCBvcmlnaW5hbGx5IHN0YXJ0ZWQgdXAgKG5vIGRldGFjaCwgbm8gbWFrZV9jaGlsZCksCi0gKiB3aGljaCBpcyBhIHByZXR0eSBuaWNlIGRlYnVnZ2luZyBlbnZpcm9ubWVudC4gIChZb3UnbGwgZ2V0IGEgU0lHSFVQCi0gKiBlYXJseSBpbiBzdGFuZGFsb25lX21haW47IGp1c3QgY29udGludWUgdGhyb3VnaC4gIFRoaXMgaXMgdGhlIHNlcnZlcgotICogdHJ5aW5nIHRvIGtpbGwgb2ZmIGFueSBjaGlsZCBwcm9jZXNzZXMgd2hpY2ggaXQgbWlnaHQgaGF2ZSBseWluZwotICogYXJvdW5kIC0tLSBBcGFjaGUgZG9lc24ndCBrZWVwIHRyYWNrIG9mIHRoZWlyIHBpZHMsIGl0IGp1c3Qgc2VuZHMKLSAqIFNJR0hVUCB0byB0aGUgcHJvY2VzcyBncm91cCwgaWdub3JpbmcgaXQgaW4gdGhlIHJvb3QgcHJvY2Vzcy4KLSAqIENvbnRpbnVlIHRocm91Z2ggYW5kIHlvdSdsbCBiZSBmaW5lLikuCi0gKi8KLQotc3RhdGljIGludCBvbmVfcHJvY2VzcyA9IDA7Ci0KLSNpZmRlZiBIQVNfT1RIRVJfQ0hJTEQKLS8qIHVzZWQgdG8gbWFpbnRhaW4gbGlzdCBvZiBjaGlsZHJlbiB3aGljaCBhcmVuJ3QgcGFydCBvZiB0aGUgc2NvcmVib2FyZCAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3RoZXJfY2hpbGRfcmVjIG90aGVyX2NoaWxkX3JlYzsKLXN0cnVjdCBvdGhlcl9jaGlsZF9yZWMgewotICAgIG90aGVyX2NoaWxkX3JlYyAqbmV4dDsKLSAgICBpbnQgcGlkOwotICAgIHZvaWQgKCptYWludGVuYW5jZSkgKGludCwgdm9pZCAqLCBhcF93YWl0X3QpOwotICAgIHZvaWQgKmRhdGE7Ci0gICAgaW50IHdyaXRlX2ZkOwotfTsKLXN0YXRpYyBvdGhlcl9jaGlsZF9yZWMgKm90aGVyX2NoaWxkcmVuOwotI2VuZGlmCi0KLXN0YXRpYyBhcF9jb250ZXh0X3QgKnBjb25mOwkJLyogUG9vbCBmb3IgY29uZmlnIHN0dWZmICovCi1zdGF0aWMgYXBfY29udGV4dF90ICpwY2hpbGQ7CQkvKiBQb29sIGZvciBodHRwZCBjaGlsZCBzdHVmZiAqLwotCi1zdGF0aWMgaW50IG15X3BpZDsJLyogaXQgc2VlbXMgc2lsbHkgdG8gY2FsbCBnZXRwaWQgYWxsIHRoZSB0aW1lICovCi0jaWZuZGVmIE1VTFRJVEhSRUFECi1zdGF0aWMgaW50IG15X2NoaWxkX251bTsKLSNlbmRpZgotCi0jaWZkZWYgVFBGCi1pbnQgdHBmX2NoaWxkID0gMDsKLWNoYXIgdHBmX3NlcnZlcl9uYW1lW0lORVREX1NFUlZOQU1FX0xFTkdUSCsxXTsKLSNlbmRpZiAvKiBUUEYgKi8KLQotc3RhdGljIHNjb3JlYm9hcmQgKmFwX3Njb3JlYm9hcmRfaW1hZ2UgPSBOVUxMOwotCi0jaWZkZWYgR1BST0YKLS8qIAotICogY2hhbmdlIGRpcmVjdG9yeSBmb3IgZ3Byb2YgdG8gcGxvcCB0aGUgZ21vbi5vdXQgZmlsZQotICogY29uZmlndXJlIGluIGh0dHBkLmNvbmY6Ci0gKiBHcHJvZkRpciBsb2dzLyAgIC0+ICRTZXJ2ZXJSb290L2xvZ3MvZ21vbi5vdXQKLSAqIEdwcm9mRGlyIGxvZ3MvJSAgLT4gJFNlcnZlclJvb3QvbG9ncy9ncHJvZi4kcGlkL2dtb24ub3V0Ci0gKi8KLXN0YXRpYyB2b2lkIGNoZGlyX2Zvcl9ncHJvZih2b2lkKQotewotICAgIGNvcmVfc2VydmVyX2NvbmZpZyAqc2NvbmYgPSAKLQlhcF9nZXRfbW9kdWxlX2NvbmZpZyhzZXJ2ZXJfY29uZi0+bW9kdWxlX2NvbmZpZywgJmNvcmVfbW9kdWxlKTsgICAgCi0gICAgY2hhciAqZGlyID0gc2NvbmYtPmdwcm9mX2RpcjsKLQotICAgIGlmKGRpcikgewotCWNoYXIgYnVmWzUxMl07Ci0JaW50IGxlbiA9IHN0cmxlbihzY29uZi0+Z3Byb2ZfZGlyKSAtIDE7Ci0JaWYoKihkaXIgKyBsZW4pID09ICclJykgewotCSAgICBkaXJbbGVuXSA9ICdcMCc7Ci0JICAgIGFwX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlc2dwcm9mLiVkIiwgZGlyLCAoaW50KWdldHBpZCgpKTsKLQl9IAotCWRpciA9IGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHBjb25mLCBidWZbMF0gPyBidWYgOiBkaXIpOwotCWlmKG1rZGlyKGRpciwgMDc1NSkgPCAwICYmIGVycm5vICE9IEVFWElTVCkgewotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgc2VydmVyX2NvbmYsCi0JCQkgImdwcm9mOiBlcnJvciBjcmVhdGluZyBkaXJlY3RvcnkgJXMiLCBkaXIpOwotCX0KLSAgICB9Ci0gICAgZWxzZSB7Ci0JZGlyID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocGNvbmYsICJsb2dzIik7Ci0gICAgfQotCi0gICAgY2hkaXIoZGlyKTsKLX0KLSNlbHNlCi0jZGVmaW5lIGNoZGlyX2Zvcl9ncHJvZigpCi0jZW5kaWYKLQotLyogWFhYIC0gSSBkb24ndCBrbm93IGlmIFRQRiB3aWxsIGV2ZXIgdXNlIHRoaXMgbW9kdWxlIG9yIG5vdCwgc28gbGVhdmUKLSAqIHRoZSBhcF9jaGVja19zaWduYWxzIGNhbGxzIGluIGJ1dCBkaXNhYmxlIHRoZW0gLSBtYW5vaiAqLwotI2RlZmluZSBhcF9jaGVja19zaWduYWxzKCkgCi0KLS8qIGEgY2xlYW4gZXhpdCBmcm9tIGEgY2hpbGQgd2l0aCBwcm9wZXIgY2xlYW51cCAqLwotc3RhdGljIHZvaWQgY2xlYW5fY2hpbGRfZXhpdChpbnQgY29kZSkgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSk7Ci1zdGF0aWMgdm9pZCBjbGVhbl9jaGlsZF9leGl0KGludCBjb2RlKQotewotICAgIGlmIChwY2hpbGQpIHsKLQlhcF9kZXN0cm95X3Bvb2wocGNoaWxkKTsKLSAgICB9Ci0gICAgY2hkaXJfZm9yX2dwcm9mKCk7Ci0gICAgZXhpdChjb2RlKTsKLX0KLQotI2lmIGRlZmluZWQoVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUKSB8fCBkZWZpbmVkKFVTRV9GTE9DS19TRVJJQUxJWkVEX0FDQ0VQVCkKLXN0YXRpYyB2b2lkIGV4cGFuZF9sb2NrX2ZuYW1lKGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICAvKiBYWFhYIHBvc3NpYmx5IGJvZ3VzIGNhc3QgKi8KLSAgICBhcF9sb2NrX2ZuYW1lID0gYXBfcHNwcmludGYocCwgIiVzLiVsdSIsCi0JYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUocCwgYXBfbG9ja19mbmFtZSksICh1bnNpZ25lZCBsb25nKWdldHBpZCgpKTsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoVVNFX1VTTE9DS19TRVJJQUxJWkVEX0FDQ0VQVCkKLQotI2luY2x1ZGUgPHVsb2Nrcy5oPgotCi1zdGF0aWMgdWxvY2tfdCB1c2xvY2sgPSBOVUxMOwotCi0jZGVmaW5lIGFjY2VwdF9tdXRleF9jaGlsZF9pbml0KHgpCi0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9pbml0KGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICBwdHJkaWZmX3Qgb2xkOwotICAgIHVzcHRyX3QgKnVzOwotCi0KLSAgICAvKiBkZWZhdWx0IGlzIDgsIGFsbG9jYXRlIGVub3VnaCBmb3IgYWxsIHRoZSBjaGlsZHJlbiBwbHVzIHRoZSBwYXJlbnQgKi8KLSAgICBpZiAoKG9sZCA9IHVzY29uZmlnKENPTkZfSU5JVFVTRVJTLCBIQVJEX1NFUlZFUl9MSU1JVCArIDEpKSA9PSAtMSkgewotCXBlcnJvcigidXNjb25maWcoQ09ORl9JTklUVVNFUlMpIik7Ci0JZXhpdCgtMSk7Ci0gICAgfQotCi0gICAgaWYgKChvbGQgPSB1c2NvbmZpZyhDT05GX0xPQ0tUWVBFLCBVU19OT0RFQlVHKSkgPT0gLTEpIHsKLQlwZXJyb3IoInVzY29uZmlnKENPTkZfTE9DS1RZUEUpIik7Ci0JZXhpdCgtMSk7Ci0gICAgfQotICAgIGlmICgob2xkID0gdXNjb25maWcoQ09ORl9BUkVOQVRZUEUsIFVTX1NIQVJFRE9OTFkpKSA9PSAtMSkgewotCXBlcnJvcigidXNjb25maWcoQ09ORl9BUkVOQVRZUEUpIik7Ci0JZXhpdCgtMSk7Ci0gICAgfQotICAgIGlmICgodXMgPSB1c2luaXQoIi9kZXYvemVybyIpKSA9PSBOVUxMKSB7Ci0JcGVycm9yKCJ1c2luaXQiKTsKLQlleGl0KC0xKTsKLSAgICB9Ci0KLSAgICBpZiAoKHVzbG9jayA9IHVzbmV3bG9jayh1cykpID09IE5VTEwpIHsKLQlwZXJyb3IoInVzbmV3bG9jayIpOwotCWV4aXQoLTEpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X29uKHZvaWQpCi17Ci0gICAgc3dpdGNoICh1c3NldGxvY2sodXNsb2NrKSkgewotICAgIGNhc2UgMToKLQkvKiBnb3QgbG9jayAqLwotCWJyZWFrOwotICAgIGNhc2UgMDoKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgImRpZG4ndCBnZXQgbG9jayIpOwotCWNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotICAgIGNhc2UgLTE6Ci0JcGVycm9yKCJ1c3NldGxvY2siKTsKLQljbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9vZmYodm9pZCkKLXsKLSAgICBpZiAodXN1bnNldGxvY2sodXNsb2NrKSA9PSAtMSkgewotCXBlcnJvcigidXN1bnNldGxvY2siKTsKLQljbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci19Ci0KLSNlbGlmIGRlZmluZWQgKFVTRV9QVEhSRUFEX1NFUklBTElaRURfQUNDRVBUKQotCi0vKiBUaGlzIGNvZGUgcHJvYmFibHkgb25seSB3b3JrcyBvbiBTb2xhcmlzIC4uLiBidXQgaXQgd29ya3MgcmVhbGx5IGZhc3QKLSAqIG9uIFNvbGFyaXMuICBOb3RlIHRoYXQgcHRocmVhZCBtdXRleGVzIGFyZSAqTk9UKiByZWxlYXNlZCB3aGVuIGEgdGFzawotICogZGllcyAuLi4gdGhlIHRhc2sgaGFzIHRvIGZyZWUgaXQgaXRzZWxmLiAgU28gd2UgYmxvY2sgc2lnbmFscyBhbmQKLSAqIHRyeSB0byBiZSBuaWNlIGFib3V0IHJlbGVhc2luZyB0aGUgbXV0ZXguCi0gKi8KLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCAqYWNjZXB0X211dGV4ID0gKHZvaWQgKikoY2FkZHJfdCkgLTE7Ci1zdGF0aWMgaW50IGhhdmVfYWNjZXB0X211dGV4Owotc3RhdGljIHNpZ3NldF90IGFjY2VwdF9ibG9ja19tYXNrOwotc3RhdGljIHNpZ3NldF90IGFjY2VwdF9wcmV2aW91c19tYXNrOwotCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfY2hpbGRfY2xlYW51cCh2b2lkICpmb28pCi17Ci0gICAgaWYgKGFjY2VwdF9tdXRleCAhPSAodm9pZCAqKShjYWRkcl90KS0xCi0JJiYgaGF2ZV9hY2NlcHRfbXV0ZXgpIHsKLQlwdGhyZWFkX211dGV4X3VubG9jayhhY2NlcHRfbXV0ZXgpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X2NoaWxkX2luaXQoYXBfY29udGV4dF90ICpwKQotewotICAgIGFwX3JlZ2lzdGVyX2NsZWFudXAocCwgTlVMTCwgYWNjZXB0X211dGV4X2NoaWxkX2NsZWFudXAsIGFwX251bGxfY2xlYW51cCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9jbGVhbnVwKHZvaWQgKmZvbykKLXsKLSAgICBpZiAoYWNjZXB0X211dGV4ICE9ICh2b2lkICopKGNhZGRyX3QpLTEKLQkmJiBtdW5tYXAoKGNhZGRyX3QpIGFjY2VwdF9tdXRleCwgc2l6ZW9mKCphY2NlcHRfbXV0ZXgpKSkgewotCXBlcnJvcigibXVubWFwIik7Ci0gICAgfQotICAgIGFjY2VwdF9tdXRleCA9ICh2b2lkICopKGNhZGRyX3QpLTE7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9pbml0KGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICBwdGhyZWFkX211dGV4YXR0cl90IG1hdHRyOwotICAgIGludCBmZDsKLQotICAgIGZkID0gb3BlbigiL2Rldi96ZXJvIiwgT19SRFdSKTsKLSAgICBpZiAoZmQgPT0gLTEpIHsKLQlwZXJyb3IoIm9wZW4oL2Rldi96ZXJvKSIpOwotCWV4aXQoQVBFWElUX0lOSVQpOwotICAgIH0KLSAgICBhY2NlcHRfbXV0ZXggPSAocHRocmVhZF9tdXRleF90ICopIG1tYXAoKGNhZGRyX3QpIDAsIHNpemVvZigqYWNjZXB0X211dGV4KSwKLQkJCQkgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQsIDApOwotICAgIGlmIChhY2NlcHRfbXV0ZXggPT0gKHZvaWQgKikgKGNhZGRyX3QpIC0gMSkgewotCXBlcnJvcigibW1hcCIpOwotCWV4aXQoQVBFWElUX0lOSVQpOwotICAgIH0KLSAgICBjbG9zZShmZCk7Ci0gICAgaWYgKChlcnJubyA9IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJm1hdHRyKSkpIHsKLQlwZXJyb3IoInB0aHJlYWRfbXV0ZXhhdHRyX2luaXQiKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0gICAgaWYgKChlcnJubyA9IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHBzaGFyZWQoJm1hdHRyLAotCQkJCQkJUFRIUkVBRF9QUk9DRVNTX1NIQVJFRCkpKSB7Ci0JcGVycm9yKCJwdGhyZWFkX211dGV4YXR0cl9zZXRwc2hhcmVkIik7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIGlmICgoZXJybm8gPSBwdGhyZWFkX211dGV4X2luaXQoYWNjZXB0X211dGV4LCAmbWF0dHIpKSkgewotCXBlcnJvcigicHRocmVhZF9tdXRleF9pbml0Iik7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIHNpZ2ZpbGxzZXQoJmFjY2VwdF9ibG9ja19tYXNrKTsKLSAgICBzaWdkZWxzZXQoJmFjY2VwdF9ibG9ja19tYXNrLCBTSUdIVVApOwotICAgIHNpZ2RlbHNldCgmYWNjZXB0X2Jsb2NrX21hc2ssIFNJR1RFUk0pOwotICAgIHNpZ2RlbHNldCgmYWNjZXB0X2Jsb2NrX21hc2ssIFNJR1VTUjEpOwotICAgIGFwX3JlZ2lzdGVyX2NsZWFudXAocCwgTlVMTCwgYWNjZXB0X211dGV4X2NsZWFudXAsIGFwX251bGxfY2xlYW51cCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9vbih2b2lkKQotewotICAgIGludCBlcnI7Ci0KLSAgICBpZiAoc2lncHJvY21hc2soU0lHX0JMT0NLLCAmYWNjZXB0X2Jsb2NrX21hc2ssICZhY2NlcHRfcHJldmlvdXNfbWFzaykpIHsKLQlwZXJyb3IoInNpZ3Byb2NtYXNrKFNJR19CTE9DSykiKTsKLQljbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci0gICAgaWYgKChlcnIgPSBwdGhyZWFkX211dGV4X2xvY2soYWNjZXB0X211dGV4KSkpIHsKLQllcnJubyA9IGVycjsKLQlwZXJyb3IoInB0aHJlYWRfbXV0ZXhfbG9jayIpOwotCWNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotICAgIH0KLSAgICBoYXZlX2FjY2VwdF9tdXRleCA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9vZmYodm9pZCkKLXsKLSAgICBpbnQgZXJyOwotCi0gICAgaWYgKChlcnIgPSBwdGhyZWFkX211dGV4X3VubG9jayhhY2NlcHRfbXV0ZXgpKSkgewotCWVycm5vID0gZXJyOwotCXBlcnJvcigicHRocmVhZF9tdXRleF91bmxvY2siKTsKLQljbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci0gICAgLyogVGhlcmUgaXMgYSBzbGlnaHQgcmFjZSBjb25kaXRpb24gcmlnaHQgaGVyZS4uLiBpZiB3ZSB3ZXJlIHRvIGRpZSByaWdodAotICAgICAqIG5vdywgd2UnZCBkbyBhbm90aGVyIHB0aHJlYWRfbXV0ZXhfdW5sb2NrLiAgTm93LCBkb2luZyB0aGF0IHdvdWxkIGxldAotICAgICAqIGFub3RoZXIgcHJvY2VzcyBpbnRvIHRoZSBtdXRleC4gIHB0aHJlYWQgbXV0ZXhlcyBhcmUgZGVzaWduZWQgdG8gYmUKLSAgICAgKiBmYXN0LCBhcyBzdWNoIHRoZXkgZG9uJ3QgaGF2ZSBwcm90ZWN0aW9uIGZvciB0aGluZ3MgbGlrZSB0ZXN0aW5nIGlmIHRoZQotICAgICAqIHRocmVhZCBvd25pbmcgYSBtdXRleCBpcyBhY3R1YWxseSB1bmxvY2tpbmcgaXQgKG9yIGV2ZW4gYW55IHdheSBvZgotICAgICAqIHRlc3Rpbmcgd2hvIG93bnMgdGhlIG11dGV4KS4KLSAgICAgKgotICAgICAqIElmIHdlIHdlcmUgdG8gdW5zZXQgaGF2ZV9hY2NlcHRfbXV0ZXggcHJpb3IgdG8gcmVsZWFzaW5nIHRoZSBtdXRleAotICAgICAqIHRoZW4gdGhlIHJhY2UgY291bGQgcmVzdWx0IGluIHRoZSBzZXJ2ZXIgdW5hYmxlIHRvIHNlcnZlIGhpdHMuICBEb2luZwotICAgICAqIGl0IHRoaXMgd2F5IG1lYW5zIHRoYXQgdGhlIHNlcnZlciBjYW4gY29udGludWUsIGJ1dCBhbiBhZGRpdGlvbmFsCi0gICAgICogY2hpbGQgbWlnaHQgYmUgaW4gdGhlIGNyaXRpY2FsIHNlY3Rpb24gLi4uIGF0IGxlYXN0IGl0J3Mgc3RpbGwgc2VydmluZwotICAgICAqIGhpdHMuCi0gICAgICovCi0gICAgaGF2ZV9hY2NlcHRfbXV0ZXggPSAwOwotICAgIGlmIChzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmFjY2VwdF9wcmV2aW91c19tYXNrLCBOVUxMKSkgewotCXBlcnJvcigic2lncHJvY21hc2soU0lHX1NFVE1BU0spIik7Ci0JY2xlYW5fY2hpbGRfZXhpdCgxKTsKLSAgICB9Ci19Ci0KLSNlbGlmIGRlZmluZWQgKFVTRV9TWVNWU0VNX1NFUklBTElaRURfQUNDRVBUKQotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL2lwYy5oPgotI2luY2x1ZGUgPHN5cy9zZW0uaD4KLQotI2lmZGVmIE5FRURfVU5JT05fU0VNVU4KLS8qIGl0IG1ha2VzIG5vIHNlbnNlLCBidXQgdGhpcyBpc24ndCBkZWZpbmVkIG9uIHNvbGFyaXMgKi8KLXVuaW9uIHNlbXVuIHsKLSAgICBsb25nIHZhbDsKLSAgICBzdHJ1Y3Qgc2VtaWRfZHMgKmJ1ZjsKLSAgICB1c2hvcnQgKmFycmF5OwotfTsKLQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgc2VtX2lkID0gLTE7Ci1zdGF0aWMgc3RydWN0IHNlbWJ1ZiBvcF9vbjsKLXN0YXRpYyBzdHJ1Y3Qgc2VtYnVmIG9wX29mZjsKLQotLyogV2UgZ2V0IGEgcmFuZG9tIHNlbWFwaG9yZSAuLi4gdGhlIGxhbWUgc3lzdiBzZW1hcGhvcmUgaW50ZXJmYWNlCi0gKiBtZWFucyB3ZSBoYXZlIHRvIGJlIHN1cmUgdG8gY2xlYW4gdGhpcyB1cCBvciBlbHNlIHdlJ2xsIGxlYWsKLSAqIHNlbWFwaG9yZXMuCi0gKi8KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9jbGVhbnVwKHZvaWQgKmZvbykKLXsKLSAgICB1bmlvbiBzZW11biBpY2s7Ci0KLSAgICBpZiAoc2VtX2lkIDwgMCkKLQlyZXR1cm47Ci0gICAgLyogdGhpcyBpcyBpZ25vcmVkIGFueWhvdyAqLwotICAgIGljay52YWwgPSAwOwotICAgIHNlbWN0bChzZW1faWQsIDAsIElQQ19STUlELCBpY2spOwotfQotCi0jZGVmaW5lIGFjY2VwdF9tdXRleF9jaGlsZF9pbml0KHgpCi0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9pbml0KGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICB1bmlvbiBzZW11biBpY2s7Ci0gICAgc3RydWN0IHNlbWlkX2RzIGJ1ZjsKLQotICAgIC8qIGFjcXVpcmUgdGhlIHNlbWFwaG9yZSAqLwotICAgIHNlbV9pZCA9IHNlbWdldChJUENfUFJJVkFURSwgMSwgSVBDX0NSRUFUIHwgMDYwMCk7Ci0gICAgaWYgKHNlbV9pZCA8IDApIHsKLQlwZXJyb3IoInNlbWdldCIpOwotCWV4aXQoQVBFWElUX0lOSVQpOwotICAgIH0KLSAgICBpY2sudmFsID0gMTsKLSAgICBpZiAoc2VtY3RsKHNlbV9pZCwgMCwgU0VUVkFMLCBpY2spIDwgMCkgewotCXBlcnJvcigic2VtY3RsKFNFVFZBTCkiKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0gICAgaWYgKCFnZXR1aWQoKSkgewotCS8qIHJlc3RyaWN0IGl0IHRvIHVzZSBvbmx5IGJ5IHRoZSBhcHByb3ByaWF0ZSB1c2VyX2lkIC4uLiBub3QgdGhhdCB0aGlzCi0JICogc3RvcHMgQ0dJcyBmcm9tIGFjcXVpcmluZyBpdCBhbmQgZGlua2luZyBhcm91bmQgd2l0aCBpdC4KLQkgKi8KLQlidWYuc2VtX3Blcm0udWlkID0gdW5peGRfY29uZmlnLnVzZXJfaWQ7Ci0JYnVmLnNlbV9wZXJtLmdpZCA9IHVuaXhkX2NvbmZpZy5ncm91cF9pZDsKLQlidWYuc2VtX3Blcm0ubW9kZSA9IDA2MDA7Ci0JaWNrLmJ1ZiA9ICZidWY7Ci0JaWYgKHNlbWN0bChzZW1faWQsIDAsIElQQ19TRVQsIGljaykgPCAwKSB7Ci0JICAgIHBlcnJvcigic2VtY3RsKElQQ19TRVQpIik7Ci0JICAgIGV4aXQoQVBFWElUX0lOSVQpOwotCX0KLSAgICB9Ci0gICAgYXBfcmVnaXN0ZXJfY2xlYW51cChwLCBOVUxMLCBhY2NlcHRfbXV0ZXhfY2xlYW51cCwgYXBfbnVsbF9jbGVhbnVwKTsKLQotICAgIC8qIHByZWluaXRpYWxpemUgdGhlc2UgKi8KLSAgICBvcF9vbi5zZW1fbnVtID0gMDsKLSAgICBvcF9vbi5zZW1fb3AgPSAtMTsKLSAgICBvcF9vbi5zZW1fZmxnID0gU0VNX1VORE87Ci0gICAgb3Bfb2ZmLnNlbV9udW0gPSAwOwotICAgIG9wX29mZi5zZW1fb3AgPSAxOwotICAgIG9wX29mZi5zZW1fZmxnID0gU0VNX1VORE87Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9vbih2b2lkKQotewotICAgIHdoaWxlIChzZW1vcChzZW1faWQsICZvcF9vbiwgMSkgPCAwKSB7Ci0JaWYgKGVycm5vICE9IEVJTlRSKSB7Ci0JICAgIHBlcnJvcigiYWNjZXB0X211dGV4X29uIik7Ci0JICAgIGNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9vZmYodm9pZCkKLXsKLSAgICB3aGlsZSAoc2Vtb3Aoc2VtX2lkLCAmb3Bfb2ZmLCAxKSA8IDApIHsKLQlpZiAoZXJybm8gIT0gRUlOVFIpIHsKLQkgICAgcGVycm9yKCJhY2NlcHRfbXV0ZXhfb2ZmIik7Ci0JICAgIGNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotCX0KLSAgICB9Ci19Ci0KLSNlbGlmIGRlZmluZWQoVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUKQotc3RhdGljIHN0cnVjdCBmbG9jayBsb2NrX2l0Owotc3RhdGljIHN0cnVjdCBmbG9jayB1bmxvY2tfaXQ7Ci0KLXN0YXRpYyBpbnQgbG9ja19mZCA9IC0xOwotCi0jZGVmaW5lIGFjY2VwdF9tdXRleF9jaGlsZF9pbml0KHgpCi0KLS8qCi0gKiBJbml0aWFsaXplIG11dGV4IGxvY2suCi0gKiBNdXN0IGJlIHNhZmUgdG8gY2FsbCB0aGlzIG9uIGEgcmVzdGFydC4KLSAqLwotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X2luaXQoYXBfY29udGV4dF90ICpwKQotewotICAgIGFwX2ZpbGVfdCAqdGVtcGZpbGUgPSBOVUxMOwotICAgIGxvY2tfaXQubF93aGVuY2UgPSBTRUVLX1NFVDsJLyogZnJvbSBjdXJyZW50IHBvaW50ICovCi0gICAgbG9ja19pdC5sX3N0YXJ0ID0gMDsJCS8qIC0iLSAqLwotICAgIGxvY2tfaXQubF9sZW4gPSAwOwkJCS8qIHVudGlsIGVuZCBvZiBmaWxlICovCi0gICAgbG9ja19pdC5sX3R5cGUgPSBGX1dSTENLOwkJLyogc2V0IGV4Y2x1c2l2ZS93cml0ZSBsb2NrICovCi0gICAgbG9ja19pdC5sX3BpZCA9IDA7CQkJLyogcGlkIG5vdCBhY3R1YWxseSBpbnRlcmVzdGluZyAqLwotICAgIHVubG9ja19pdC5sX3doZW5jZSA9IFNFRUtfU0VUOwkvKiBmcm9tIGN1cnJlbnQgcG9pbnQgKi8KLSAgICB1bmxvY2tfaXQubF9zdGFydCA9IDA7CQkvKiAtIi0gKi8KLSAgICB1bmxvY2tfaXQubF9sZW4gPSAwOwkJLyogdW50aWwgZW5kIG9mIGZpbGUgKi8KLSAgICB1bmxvY2tfaXQubF90eXBlID0gRl9VTkxDSzsJCS8qIHNldCBleGNsdXNpdmUvd3JpdGUgbG9jayAqLwotICAgIHVubG9ja19pdC5sX3BpZCA9IDA7CQkvKiBwaWQgbm90IGFjdHVhbGx5IGludGVyZXN0aW5nICovCi0KLSAgICBleHBhbmRfbG9ja19mbmFtZShwKTsKLSAgICBhcF9vcGVuKCZ0ZW1wZmlsZSwgYXBfbG9ja19mbmFtZSwgQVBSX0NSRUFURSB8IEFQUl9XUklURSB8IEFQUl9FWENMLAotICAgICAgICAgICAgQVBSX1VSRUFEIHwgQVBSX1VXUklURSB8IEFQUl9HUkVBRCB8IEFQUl9XUkVBRCwgcCk7Ci0gICAgYXBfZ2V0X29zX2ZpbGUoJmxvY2tfZmQsIHRlbXBmaWxlKTsKLSAgICBpZiAobG9ja19mZCA9PSAtMSkgewotCXBlcnJvcigib3BlbiIpOwotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IG9wZW4gbG9jayBmaWxlOiAlcyIsIGFwX2xvY2tfZm5hbWUpOwotCWV4aXQoQVBFWElUX0lOSVQpOwotICAgIH0KLSAgICB1bmxpbmsoYXBfbG9ja19mbmFtZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9vbih2b2lkKQotewotICAgIGludCByZXQ7Ci0KLSAgICB3aGlsZSAoKHJldCA9IGZjbnRsKGxvY2tfZmQsIEZfU0VUTEtXLCAmbG9ja19pdCkpIDwgMCAmJiBlcnJubyA9PSBFSU5UUikgewotCS8qIG5vcCAqLwotICAgIH0KLQotICAgIGlmIChyZXQgPCAwKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCBlcnJubywgc2VydmVyX2NvbmYsCi0JCSAgICAiZmNudGw6IEZfU0VUTEtXOiBFcnJvciBnZXR0aW5nIGFjY2VwdCBsb2NrLCBleGl0aW5nISAgIgotCQkgICAgIlBlcmhhcHMgeW91IG5lZWQgdG8gdXNlIHRoZSBMb2NrRmlsZSBkaXJlY3RpdmUgdG8gcGxhY2UgIgotCQkgICAgInlvdXIgbG9jayBmaWxlIG9uIGEgbG9jYWwgZGlzayEiKTsKLQljbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9vZmYodm9pZCkKLXsKLSAgICBpbnQgcmV0OwotCi0gICAgd2hpbGUgKChyZXQgPSBmY250bChsb2NrX2ZkLCBGX1NFVExLVywgJnVubG9ja19pdCkpIDwgMCAmJiBlcnJubyA9PSBFSU5UUikgewotCS8qIG5vcCAqLwotICAgIH0KLSAgICBpZiAocmV0IDwgMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FTUVSRywgZXJybm8sIHNlcnZlcl9jb25mLAotCQkgICAgImZjbnRsOiBGX1NFVExLVzogRXJyb3IgZnJlZWluZyBhY2NlcHQgbG9jaywgZXhpdGluZyEgICIKLQkJICAgICJQZXJoYXBzIHlvdSBuZWVkIHRvIHVzZSB0aGUgTG9ja0ZpbGUgZGlyZWN0aXZlIHRvIHBsYWNlICIKLQkJICAgICJ5b3VyIGxvY2sgZmlsZSBvbiBhIGxvY2FsIGRpc2shIik7Ci0JY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotfQotCi0jZWxpZiBkZWZpbmVkKFVTRV9GTE9DS19TRVJJQUxJWkVEX0FDQ0VQVCkKLQotc3RhdGljIGludCBsb2NrX2ZkID0gLTE7Ci0KLXN0YXRpYyBhcF9zdGF0dXNfdCBhY2NlcHRfbXV0ZXhfY2xlYW51cCh2b2lkICpmb28pCi17Ci0gICAgdW5saW5rKGFwX2xvY2tfZm5hbWUpOwotCi0gICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotfQotCi0vKgotICogSW5pdGlhbGl6ZSBtdXRleCBsb2NrLgotICogRG9uZSBieSBlYWNoIGNoaWxkIGF0IGl0J3MgYmlydGgKLSAqLwotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X2NoaWxkX2luaXQoYXBfY29udGV4dF90ICpwKQotewotICAgIGFwX2ZpbGVfdCAqdGVtcGZpbGUgPSBOVUxMOwotICAgIGFwX3N0YXR1c190IHJldDsKLQotICAgIHJldD1hcF9vcGVuKCZ0ZW1wZmlsZSwgYXBfbG9ja19mbmFtZSwgQVBSX1dSSVRFLCBBUFJfVVJFQUR8QVBSX1VXUklURSwgcCk7Ci0gICAgaWYgKHJldCAhPSBBUFJfU1VDQ0VTUykgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FTUVSRywgcmV0LCBzZXJ2ZXJfY29uZiwKLQkJICAgICJDaGlsZCBjYW5ub3Qgb3BlbiBsb2NrIGZpbGU6ICVzIiwgYXBfbG9ja19mbmFtZSk7Ci0JY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERJTklUKTsKLSAgICB9Ci0gICAgYXBfZ2V0X29zX2ZpbGUoJmxvY2tfZmQsIHRlbXBmaWxlKTsKLX0KLQotLyoKLSAqIEluaXRpYWxpemUgbXV0ZXggbG9jay4KLSAqIE11c3QgYmUgc2FmZSB0byBjYWxsIHRoaXMgb24gYSByZXN0YXJ0LgotICovCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfaW5pdChhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgYXBfZmlsZV90ICp0ZW1wZmlsZSA9IE5VTEw7Ci0gICAgYXBfc3RhdHVzX3QgcmV0OwotCi0gICAgZXhwYW5kX2xvY2tfZm5hbWUocCk7Ci0gICAgdW5saW5rKGFwX2xvY2tfZm5hbWUpOwotICAgIHJldD1hcF9vcGVuKCZ0ZW1wZmlsZSwgYXBfbG9ja19mbmFtZSwgQVBSX0NSRUFURXxBUFJfV1JJVEV8QVBSX0VYQ0wsCi0JICAgIEFQUl9VUkVBRHxBUFJfVVdSSVRFLCBwKTsKLSAgICBpZiAocmV0ICE9IEFQUl9TVUNDRVNTKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCByZXQsIHNlcnZlcl9jb25mLAotCQkgICAgIlBhcmVudCBjYW5ub3Qgb3BlbiBsb2NrIGZpbGU6ICVzIiwgYXBfbG9ja19mbmFtZSk7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIGFwX2dldF9vc19maWxlKCZsb2NrX2ZkLCB0ZW1wZmlsZSk7Ci0gICAgYXBfcmVnaXN0ZXJfY2xlYW51cChwLCBOVUxMLCBhY2NlcHRfbXV0ZXhfY2xlYW51cCwgYXBfbnVsbF9jbGVhbnVwKTsKLX0KLQotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X29uKHZvaWQpCi17Ci0gICAgaW50IHJldDsKLQotICAgIHdoaWxlICgocmV0ID0gZmxvY2sobG9ja19mZCwgTE9DS19FWCkpIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKLQljb250aW51ZTsKLQotICAgIGlmIChyZXQgPCAwKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCBlcnJubywgc2VydmVyX2NvbmYsCi0JCSAgICAiZmxvY2s6IExPQ0tfRVg6IEVycm9yIGdldHRpbmcgYWNjZXB0IGxvY2suIEV4aXRpbmchIik7Ci0JY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfb2ZmKHZvaWQpCi17Ci0gICAgaWYgKGZsb2NrKGxvY2tfZmQsIExPQ0tfVU4pIDwgMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FTUVSRywgZXJybm8sIHNlcnZlcl9jb25mLAotCQkgICAgImZsb2NrOiBMT0NLX1VOOiBFcnJvciBmcmVlaW5nIGFjY2VwdCBsb2NrLiBFeGl0aW5nISIpOwotCWNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxERkFUQUwpOwotICAgIH0KLX0KLQotI2VsaWYgZGVmaW5lZChVU0VfT1MyU0VNX1NFUklBTElaRURfQUNDRVBUKQotCi1zdGF0aWMgSE1UWCBsb2NrX3NlbSA9IC0xOwotCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfY2xlYW51cCh2b2lkICpmb28pCi17Ci0gICAgRG9zUmVsZWFzZU11dGV4U2VtKGxvY2tfc2VtKTsKLSAgICBEb3NDbG9zZU11dGV4U2VtKGxvY2tfc2VtKTsKLX0KLQotLyoKLSAqIEluaXRpYWxpemUgbXV0ZXggbG9jay4KLSAqIERvbmUgYnkgZWFjaCBjaGlsZCBhdCBpdCdzIGJpcnRoCi0gKi8KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9jaGlsZF9pbml0KGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICBpbnQgcmMgPSBEb3NPcGVuTXV0ZXhTZW0oTlVMTCwgJmxvY2tfc2VtKTsKLQotICAgIGlmIChyYyAhPSAwKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRU1FUkcsIHNlcnZlcl9jb25mLAotCQkgICAgIkNoaWxkIGNhbm5vdCBvcGVuIGxvY2sgc2VtYXBob3JlLCByYz0lZCIsIHJjKTsKLQljbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMRElOSVQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGFwX3JlZ2lzdGVyX2NsZWFudXAocCwgTlVMTCwgYWNjZXB0X211dGV4X2NsZWFudXAsIGFwX251bGxfY2xlYW51cCk7Ci0gICAgfQotfQotCi0vKgotICogSW5pdGlhbGl6ZSBtdXRleCBsb2NrLgotICogTXVzdCBiZSBzYWZlIHRvIGNhbGwgdGhpcyBvbiBhIHJlc3RhcnQuCi0gKi8KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9pbml0KGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICBpbnQgcmMgPSBEb3NDcmVhdGVNdXRleFNlbShOVUxMLCAmbG9ja19zZW0sIERDX1NFTV9TSEFSRUQsIEZBTFNFKTsKLQotICAgIGlmIChyYyAhPSAwKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRU1FUkcsIHNlcnZlcl9jb25mLAotCQkgICAgIlBhcmVudCBjYW5ub3QgY3JlYXRlIGxvY2sgc2VtYXBob3JlLCByYz0lZCIsIHJjKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0KLSAgICBhcF9yZWdpc3Rlcl9jbGVhbnVwKHAsIE5VTEwsIGFjY2VwdF9tdXRleF9jbGVhbnVwLCBhcF9udWxsX2NsZWFudXApOwotfQotCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfb24odm9pZCkKLXsKLSAgICBpbnQgcmMgPSBEb3NSZXF1ZXN0TXV0ZXhTZW0obG9ja19zZW0sIFNFTV9JTkRFRklOSVRFX1dBSVQpOwotCi0gICAgaWYgKHJjICE9IDApIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FTUVSRywgc2VydmVyX2NvbmYsCi0JCSAgICAiT1MyU0VNOiBFcnJvciAlZCBnZXR0aW5nIGFjY2VwdCBsb2NrLiBFeGl0aW5nISIsIHJjKTsKLQljbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9vZmYodm9pZCkKLXsKLSAgICBpbnQgcmMgPSBEb3NSZWxlYXNlTXV0ZXhTZW0obG9ja19zZW0pOwotICAgIAotICAgIGlmIChyYyAhPSAwKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRU1FUkcsIHNlcnZlcl9jb25mLAotCQkgICAgIk9TMlNFTTogRXJyb3IgJWQgZnJlZWluZyBhY2NlcHQgbG9jay4gRXhpdGluZyEiLCByYyk7Ci0JY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotfQotCi0jZWxpZiBkZWZpbmVkKFVTRV9UUEZfQ09SRV9TRVJJQUxJWkVEX0FDQ0VQVCkKLQotc3RhdGljIGludCB0cGZfY29yZV9oZWxkOwotCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfY2xlYW51cCh2b2lkICpmb28pCi17Ci0gICAgaWYodHBmX2NvcmVfaGVsZCkKLSAgICAgICAgY29ydWMoUkVTT1VSQ0VfS0VZKTsKLX0KLQotI2RlZmluZSBhY2NlcHRfbXV0ZXhfaW5pdCh4KQotCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfY2hpbGRfaW5pdChhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgYXBfcmVnaXN0ZXJfY2xlYW51cChwLCBOVUxMLCBhY2NlcHRfbXV0ZXhfY2xlYW51cCwgYXBfbnVsbF9jbGVhbnVwKTsKLSAgICB0cGZfY29yZV9oZWxkID0gMDsKLX0KLQotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X29uKHZvaWQpCi17Ci0gICAgY29yaGMoUkVTT1VSQ0VfS0VZKTsKLSAgICB0cGZfY29yZV9oZWxkID0gMTsKLSAgICBhcF9jaGVja19zaWduYWxzKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9vZmYodm9pZCkKLXsKLSAgICBjb3J1YyhSRVNPVVJDRV9LRVkpOwotICAgIHRwZl9jb3JlX2hlbGQgPSAwOwotICAgIGFwX2NoZWNrX3NpZ25hbHMoKTsKLX0KLQotI2Vsc2UKLS8qIERlZmF1bHQgLS0tIG5vIHNlcmlhbGl6YXRpb24uICBPdGhlciBtZXRob2RzICpjb3VsZCogZ28gaGVyZSwKLSAqIGFzICNlbGlmcy4uLgotICovCi0jaWYgIWRlZmluZWQoTVVMVElUSFJFQUQpCi0vKiBNdWx0aXRocmVhZGVkIHN5c3RlbXMgZG9uJ3QgY29tcGxldGUgYmV0d2VlbiBwcm9jZXNzZXMgZm9yCi0gKiB0aGUgc29ja2V0cy4gKi8KLSNkZWZpbmUgTk9fU0VSSUFMSVpFRF9BQ0NFUFQKLSNkZWZpbmUgYWNjZXB0X211dGV4X2NoaWxkX2luaXQoeCkKLSNkZWZpbmUgYWNjZXB0X211dGV4X2luaXQoeCkKLSNkZWZpbmUgYWNjZXB0X211dGV4X29uKCkKLSNkZWZpbmUgYWNjZXB0X211dGV4X29mZigpCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBPbiBzb21lIGFyY2hpdGVjdHVyZXMgaXQncyBzYWZlIHRvIGRvIHVuc2VyaWFsaXplZCBhY2NlcHQoKXMgaW4gdGhlIHNpbmdsZQotICogTGlzdGVuIGNhc2UuICBCdXQgaXQncyBuZXZlciBzYWZlIHRvIGRvIGl0IGluIHRoZSBjYXNlIHdoZXJlIHRoZXJlJ3MKLSAqIG11bHRpcGxlIExpc3RlbiBzdGF0ZW1lbnRzLiAgRGVmaW5lIFNJTkdMRV9MSVNURU5fVU5TRVJJQUxJWkVEX0FDQ0VQVAotICogd2hlbiBpdCdzIHNhZmUgaW4gdGhlIHNpbmdsZSBMaXN0ZW4gY2FzZS4KLSAqLwotI2lmZGVmIFNJTkdMRV9MSVNURU5fVU5TRVJJQUxJWkVEX0FDQ0VQVAotI2RlZmluZSBTQUZFX0FDQ0VQVChzdG10KSBkbyB7aWYgKGFwX2xpc3RlbmVycy0+bmV4dCkge3N0bXQ7fX0gd2hpbGUoMCkKLSNlbHNlCi0jZGVmaW5lIFNBRkVfQUNDRVBUKHN0bXQpIGRvIHtzdG10O30gd2hpbGUoMCkKLSNlbmRpZgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogZGVhbGluZyB3aXRoIG90aGVyIGNoaWxkcmVuCi0gKi8KLQotI2lmZGVmIEhBU19PVEhFUl9DSElMRAotQVBJX0VYUE9SVCh2b2lkKSBhcF9yZWdpc3Rlcl9vdGhlcl9jaGlsZChpbnQgcGlkLAotCQkgICAgICAgdm9pZCAoKm1haW50ZW5hbmNlKSAoaW50IHJlYXNvbiwgdm9pZCAqLCBhcF93YWl0X3Qgc3RhdHVzKSwKLQkJCSAgdm9pZCAqZGF0YSwgaW50IHdyaXRlX2ZkKQotewotICAgIG90aGVyX2NoaWxkX3JlYyAqb2NyOwotCi0gICAgb2NyID0gYXBfcGFsbG9jKHBjb25mLCBzaXplb2YoKm9jcikpOwotICAgIG9jci0+cGlkID0gcGlkOwotICAgIG9jci0+bWFpbnRlbmFuY2UgPSBtYWludGVuYW5jZTsKLSAgICBvY3ItPmRhdGEgPSBkYXRhOwotICAgIG9jci0+d3JpdGVfZmQgPSB3cml0ZV9mZDsKLSAgICBvY3ItPm5leHQgPSBvdGhlcl9jaGlsZHJlbjsKLSAgICBvdGhlcl9jaGlsZHJlbiA9IG9jcjsKLX0KLQotLyogbm90ZSB0aGF0IHNpbmNlIHRoaXMgY2FuIGJlIGNhbGxlZCBieSBhIG1haW50ZW5hbmNlIGZ1bmN0aW9uIHdoaWxlIHdlJ3JlCi0gKiBzY2FubmluZyB0aGUgb3RoZXJfY2hpbGRyZW4gbGlzdCwgYWxsIHNjYW5uZXJzIHNob3VsZCBwcm90ZWN0IHRoZW1zZWxmCi0gKiBieSBsb2FkaW5nIG9jci0+bmV4dCBiZWZvcmUgY2FsbGluZyBhbnkgbWFpbnRlbmFuY2UgZnVuY3Rpb24uCi0gKi8KLUFQSV9FWFBPUlQodm9pZCkgYXBfdW5yZWdpc3Rlcl9vdGhlcl9jaGlsZCh2b2lkICpkYXRhKQotewotICAgIG90aGVyX2NoaWxkX3JlYyAqKnBvY3IsICpub2NyOwotCi0gICAgZm9yIChwb2NyID0gJm90aGVyX2NoaWxkcmVuOyAqcG9jcjsgcG9jciA9ICYoKnBvY3IpLT5uZXh0KSB7Ci0JaWYgKCgqcG9jciktPmRhdGEgPT0gZGF0YSkgewotCSAgICBub2NyID0gKCpwb2NyKS0+bmV4dDsKLQkgICAgKCooKnBvY3IpLT5tYWludGVuYW5jZSkgKE9DX1JFQVNPTl9VTlJFR0lTVEVSLCAoKnBvY3IpLT5kYXRhLCAtMSk7Ci0JICAgICpwb2NyID0gbm9jcjsKLQkgICAgLyogWFhYOiB1bSwgd2VsbCB3ZSd2ZSBqdXN0IHdhc3RlZCBzb21lIHNwYWNlIGluIHBjb25mID8gKi8KLQkgICAgcmV0dXJuOwotCX0KLSAgICB9Ci19Ci0KLS8qIHRlc3QgdG8gZW5zdXJlIHRoYXQgdGhlIHdyaXRlX2ZkcyBhcmUgYWxsIHN0aWxsIHdyaXRhYmxlLCBvdGhlcndpc2UKLSAqIGludm9rZSB0aGUgbWFpbnRlbmFuY2UgZnVuY3Rpb25zIGFzIGFwcHJvcHJpYXRlICovCi1zdGF0aWMgdm9pZCBwcm9iZV93cml0YWJsZV9mZHModm9pZCkKLXsKLSAgICBmZF9zZXQgd3JpdGFibGVfZmRzOwotICAgIGludCBmZF9tYXg7Ci0gICAgb3RoZXJfY2hpbGRfcmVjICpvY3IsICpub2NyOwotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIGludCByYzsKLQotICAgIGlmIChvdGhlcl9jaGlsZHJlbiA9PSBOVUxMKQotCXJldHVybjsKLQotICAgIGZkX21heCA9IDA7Ci0gICAgRkRfWkVSTygmd3JpdGFibGVfZmRzKTsKLSAgICBkbyB7Ci0JZm9yIChvY3IgPSBvdGhlcl9jaGlsZHJlbjsgb2NyOyBvY3IgPSBvY3ItPm5leHQpIHsKLQkgICAgaWYgKG9jci0+d3JpdGVfZmQgPT0gLTEpCi0JCWNvbnRpbnVlOwotCSAgICBGRF9TRVQob2NyLT53cml0ZV9mZCwgJndyaXRhYmxlX2Zkcyk7Ci0JICAgIGlmIChvY3ItPndyaXRlX2ZkID4gZmRfbWF4KSB7Ci0JCWZkX21heCA9IG9jci0+d3JpdGVfZmQ7Ci0JICAgIH0KLQl9Ci0JaWYgKGZkX21heCA9PSAwKQotCSAgICByZXR1cm47Ci0KLQl0di50dl9zZWMgPSAwOwotCXR2LnR2X3VzZWMgPSAwOwotCXJjID0gYXBfc2VsZWN0KGZkX21heCArIDEsIE5VTEwsICZ3cml0YWJsZV9mZHMsIE5VTEwsICZ0dik7Ci0gICAgfSB3aGlsZSAocmMgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgaWYgKHJjID09IC0xKSB7Ci0JLyogWFhYOiB1aGggdGhpcyBjb3VsZCBiZSByZWFsbHkgYmFkLCB3ZSBjb3VsZCBoYXZlIGEgYmFkIGZpbGUKLQkgKiBkZXNjcmlwdG9yIGR1ZSB0byBhIGJ1ZyBpbiBvbmUgb2YgdGhlIG1haW50ZW5hbmNlIHJvdXRpbmVzICovCi0JYXBfbG9nX3VuaXhlcnIoInByb2JlX3dyaXRhYmxlX2ZkcyIsICJzZWxlY3QiLAotCQkgICAgImNvdWxkIG5vdCBwcm9iZSB3cml0YWJsZSBmZHMiLCBzZXJ2ZXJfY29uZik7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBpZiAocmMgPT0gMCkKLQlyZXR1cm47Ci0KLSAgICBmb3IgKG9jciA9IG90aGVyX2NoaWxkcmVuOyBvY3I7IG9jciA9IG5vY3IpIHsKLQlub2NyID0gb2NyLT5uZXh0OwotCWlmIChvY3ItPndyaXRlX2ZkID09IC0xKQotCSAgICBjb250aW51ZTsKLQlpZiAoRkRfSVNTRVQob2NyLT53cml0ZV9mZCwgJndyaXRhYmxlX2ZkcykpCi0JICAgIGNvbnRpbnVlOwotCSgqb2NyLT5tYWludGVuYW5jZSkgKE9DX1JFQVNPTl9VTldSSVRBQkxFLCBvY3ItPmRhdGEsIC0xKTsKLSAgICB9Ci19Ci0KLS8qIHBvc3NpYmx5IHJlYXAgYW4gb3RoZXJfY2hpbGQsIHJldHVybiAwIGlmIHllcywgLTEgaWYgbm90ICovCi1zdGF0aWMgaW50IHJlYXBfb3RoZXJfY2hpbGQoaW50IHBpZCwgYXBfd2FpdF90IHN0YXR1cykKLXsKLSAgICBvdGhlcl9jaGlsZF9yZWMgKm9jciwgKm5vY3I7Ci0KLSAgICBmb3IgKG9jciA9IG90aGVyX2NoaWxkcmVuOyBvY3I7IG9jciA9IG5vY3IpIHsKLQlub2NyID0gb2NyLT5uZXh0OwotCWlmIChvY3ItPnBpZCAhPSBwaWQpCi0JICAgIGNvbnRpbnVlOwotCW9jci0+cGlkID0gLTE7Ci0JKCpvY3ItPm1haW50ZW5hbmNlKSAoT0NfUkVBU09OX0RFQVRILCBvY3ItPmRhdGEsIHN0YXR1cyk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBEZWFsaW5nIHdpdGggdGhlIHNjb3JlYm9hcmQuLi4gYSBsb3Qgb2YgdGhlc2UgdmFyaWFibGVzIGFyZSBnbG9iYWwKLSAqIG9ubHkgdG8gYXZvaWQgZ2V0dGluZyBjbG9iYmVyZWQgYnkgdGhlIGxvbmdqbXAoKSB0aGF0IGhhcHBlbnMgd2hlbgotICogYSBoYXJkIHRpbWVvdXQgZXhwaXJlcy4uLgotICoKLSAqIFdlIGJlZ2luIHdpdGggcm91dGluZXMgd2hpY2ggZGVhbCB3aXRoIHRoZSBmaWxlIGl0c2VsZi4uLiAKLSAqLwotCi0jaWYgZGVmaW5lZChVU0VfT1MyX1NDT1JFQk9BUkQpCi0KLS8qIFRoZSBuZXh0IHR3byByb3V0aW5lcyBhcmUgdXNlZCB0byBhY2Nlc3Mgc2hhcmVkIG1lbW9yeSB1bmRlciBPUy8yLiAgKi8KLS8qIFRoaXMgcmVxdWlyZXMgRU1YIHYwOWMgdG8gYmUgaW5zdGFsbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLWNhZGRyX3QgY3JlYXRlX3NoYXJlZF9oZWFwKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBzaXplKQotewotICAgIFVMT05HIHJjOwotICAgIHZvaWQgKm1lbTsKLSAgICBIZWFwX3QgaDsKLQotICAgIHJjID0gRG9zQWxsb2NTaGFyZWRNZW0oJm1lbSwgbmFtZSwgc2l6ZSwKLQkJCSAgIFBBR19DT01NSVQgfCBQQUdfUkVBRCB8IFBBR19XUklURSk7Ci0gICAgaWYgKHJjICE9IDApCi0JcmV0dXJuIE5VTEw7Ci0gICAgaCA9IF91Y3JlYXRlKG1lbSwgc2l6ZSwgIV9CTE9DS19DTEVBTiwgX0hFQVBfUkVHVUxBUiB8IF9IRUFQX1NIQVJFRCwKLQkJIE5VTEwsIE5VTEwpOwotICAgIGlmIChoID09IE5VTEwpCi0JRG9zRnJlZU1lbShtZW0pOwotICAgIHJldHVybiAoY2FkZHJfdCkgaDsKLX0KLQotY2FkZHJfdCBnZXRfc2hhcmVkX2hlYXAoY29uc3QgY2hhciAqTmFtZSkKLXsKLQotICAgIFBWT0lEIEJhc2VBZGRyZXNzOwkJLyogUG9pbnRlciB0byB0aGUgYmFzZSBhZGRyZXNzIG9mCi0JCQkJICAgdGhlIHNoYXJlZCBtZW1vcnkgb2JqZWN0ICovCi0gICAgVUxPTkcgQXR0cmlidXRlRmxhZ3M7CS8qIEZsYWdzIGRlc2NyaWJpbmcgY2hhcmFjdGVyaXN0aWNzCi0JCQkJICAgb2YgdGhlIHNoYXJlZCBtZW1vcnkgb2JqZWN0ICovCi0gICAgQVBJUkVUIHJjOwkJCS8qIFJldHVybiBjb2RlICovCi0KLSAgICAvKiBSZXF1ZXN0IHJlYWQgYW5kIHdyaXRlIGFjY2VzcyB0byAqLwotICAgIC8qICAgdGhlIHNoYXJlZCBtZW1vcnkgb2JqZWN0ICAgICAgICovCi0gICAgQXR0cmlidXRlRmxhZ3MgPSBQQUdfV1JJVEUgfCBQQUdfUkVBRDsKLQotICAgIHJjID0gRG9zR2V0TmFtZWRTaGFyZWRNZW0oJkJhc2VBZGRyZXNzLCBOYW1lLCBBdHRyaWJ1dGVGbGFncyk7Ci0KLSAgICBpZiAocmMgIT0gMCkgewotCXByaW50ZigiRG9zR2V0TmFtZWRTaGFyZWRNZW0gZXJyb3I6IHJldHVybiBjb2RlID0gJWxkIiwgcmMpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiBCYXNlQWRkcmVzczsKLX0KLQotc3RhdGljIHZvaWQgc2V0dXBfc2hhcmVkX21lbShhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgY2FkZHJfdCBtOwotCi0gICAgaW50IHJjOwotCi0gICAgbSA9IChjYWRkcl90KSBjcmVhdGVfc2hhcmVkX2hlYXAoIlxcU0hBUkVNRU1cXFNDT1JFQk9BUkQiLCBTQ09SRUJPQVJEX1NJWkUpOwotICAgIGlmIChtID09IDApIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIiVzOiBDb3VsZCBub3QgY3JlYXRlIE9TLzIgU2hhcmVkIG1lbW9yeSBwb29sLiIsCi0JCSAgICAgYXBfc2VydmVyX2FyZ3YwKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0KLSAgICByYyA9IF91b3BlbigoSGVhcF90KSBtKTsKLSAgICBpZiAocmMgIT0gMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwKLQkJIiVzOiBDb3VsZCBub3QgdW9wZW4oKSBuZXdseSBjcmVhdGVkIE9TLzIgU2hhcmVkIG1lbW9yeSBwb29sLiIsCi0JCWFwX3NlcnZlcl9hcmd2MCk7Ci0gICAgfQotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UgPSAoc2NvcmVib2FyZCAqKSBtOwotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbC5ydW5uaW5nX2dlbmVyYXRpb24gPSAwOwotfQotCi1zdGF0aWMgdm9pZCByZW9wZW5fc2NvcmVib2FyZChhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgY2FkZHJfdCBtOwotICAgIGludCByYzsKLQotICAgIG0gPSAoY2FkZHJfdCkgZ2V0X3NoYXJlZF9oZWFwKCJcXFNIQVJFTUVNXFxTQ09SRUJPQVJEIik7Ci0gICAgaWYgKG0gPT0gMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiJXM6IENvdWxkIG5vdCBmaW5kIGV4aXN0aW5nIE9TLzIgU2hhcmVkIG1lbW9yeSBwb29sLiIsCi0JCSAgICAgYXBfc2VydmVyX2FyZ3YwKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0KLSAgICByYyA9IF91b3BlbigoSGVhcF90KSBtKTsKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlID0gKHNjb3JlYm9hcmQgKikgbTsKLX0KLQotI2VsaWYgZGVmaW5lZChVU0VfUE9TSVhfU0NPUkVCT0FSRCkKLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotLyogCi0gKiBQT1NJWCAxMDAzLjQgc3R5bGUKLSAqCi0gKiBOb3RlIDE6IAotICogQXMgb2YgdmVyc2lvbiA0LjIzQSwgc2hhcmVkIG1lbW9yeSBpbiBRTlggbXVzdCByZXNpZGUgdW5kZXIgL2Rldi9zaG1lbSwKLSAqIHdoZXJlIG5vIHN1YmRpcmVjdG9yaWVzIGFsbG93ZWQuCi0gKgotICogUE9TSVggc2htX29wZW4oKSBhbmQgc2htX3VubGluaygpIHdpbGwgdGFrZSBjYXJlIGFib3V0IHRoaXMgaXNzdWUsCi0gKiBidXQgdG8gYXZvaWQgY29uZnVzaW9uLCBJIHN1Z2dlc3QgdG8gcmVkZWZpbmUgc2NvcmVib2FyZCBmaWxlIG5hbWUKLSAqIGluIGh0dHBkLmNvbmYgdG8gY3V0ICJsb2dzLyIgZnJvbSBpdC4gV2l0aCBkZWZhdWx0IHNldHVwIGFjdHVhbCBuYW1lCi0gKiB3aWxsIGJlICIvZGV2L3NobWVtL2xvZ3MuYXBhY2hlX3N0YXR1cyIuIAotICogCi0gKiBJZiBzb21ldGhpbmcgd2VudCB3cm9uZyBhbmQgQXBhY2hlIGRpZCBub3QgdW5saW5rZWQgdGhpcyBvYmplY3QgdXBvbgotICogZXhpdCwgeW91IGNhbiByZW1vdmUgaXQgbWFudWFsbHksIHVzaW5nICJybSAtZiIgY29tbWFuZC4KLSAqIAotICogTm90ZSAyOgotICogPHN5cy9tbWFuLmg+IGluIFFOWCBkZWZpbmVzIE1BUF9BTk9OLCBidXQgY3VycmVudCBpbXBsZW1lbnRhdGlvbiAKLSAqIGRvZXMgTk9UIHN1cHBvcnQgQlNEIHN0eWxlIGFub255bW91cyBtYXBwaW5nLiBTbywgdGhlIG9yZGVyIG9mIAotICogY29uZGl0aW9uYWwgY29tcGlsYXRpb24gaXMgaW1wb3J0YW50OiAKLSAqIHRoaXMgI2lmZGVmIHNlY3Rpb24gbXVzdCBiZSBBQk9WRSB0aGUgbmV4dCBvbmUgKEJTRCBzdHlsZSkuCi0gKgotICogSSB0ZXN0ZWQgdGhpcyBzdHVmZiBhbmQgaXQgd29ya3MgZmluZSBmb3IgbWUsIGJ1dCBpZiBpdCBwcm92aWRlcyAKLSAqIHRyb3VibGUgZm9SIFlPVSwgSlVzdCBjb21tZW50IG91dCBVU0VfTU1BUF9TQ09SRUJPQVJEIGluIFFOWCBzZWN0aW9uCi0gKiBvZiBhcF9jb25maWcuaAotICoKLSAqIEp1bmUgNSwgMTk5NywgCi0gKiBJZ29yIE4uIEtvdmFsZW5rbyAtLSBpbmZvaEBtYWlsLndwbHVzLm5ldAotICovCi0KLXN0YXRpYyB2b2lkIGNsZWFudXBfc2hhcmVkX21lbSh2b2lkICpkKQotewotICAgIHNobV91bmxpbmsoYXBfc2NvcmVib2FyZF9mbmFtZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldHVwX3NoYXJlZF9tZW0oYXBfY29udGV4dF90ICpwKQotewotICAgIGNoYXIgYnVmWzUxMl07Ci0gICAgY2FkZHJfdCBtOwotICAgIGludCBmZDsKLQotICAgIGZkID0gc2htX29wZW4oYXBfc2NvcmVib2FyZF9mbmFtZSwgT19SRFdSIHwgT19DUkVBVCwgU19JUlVTUiB8IFNfSVdVU1IpOwotICAgIGlmIChmZCA9PSAtMSkgewotCWFwX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlczogY291bGQgbm90IG9wZW4oY3JlYXRlKSBzY29yZWJvYXJkIiwKLQkJICAgIGFwX3NlcnZlcl9hcmd2MCk7Ci0JcGVycm9yKGJ1Zik7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIGlmIChsdHJ1bmMoZmQsIChvZmZfdCkgU0NPUkVCT0FSRF9TSVpFLCBTRUVLX1NFVCkgPT0gLTEpIHsKLQlhcF9zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXM6IGNvdWxkIG5vdCBsdHJ1bmMgc2NvcmVib2FyZCIsCi0JCSAgICBhcF9zZXJ2ZXJfYXJndjApOwotCXBlcnJvcihidWYpOwotCXNobV91bmxpbmsoYXBfc2NvcmVib2FyZF9mbmFtZSk7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIGlmICgobSA9IChjYWRkcl90KSBtbWFwKChjYWRkcl90KSAwLAotCQkJICAgIChzaXplX3QpIFNDT1JFQk9BUkRfU0laRSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkJCSAgICBNQVBfU0hBUkVELCBmZCwgKG9mZl90KSAwKSkgPT0gKGNhZGRyX3QpIC0gMSkgewotCWFwX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlczogY2Fubm90IG1tYXAgc2NvcmVib2FyZCIsCi0JCSAgICBhcF9zZXJ2ZXJfYXJndjApOwotCXBlcnJvcihidWYpOwotCXNobV91bmxpbmsoYXBfc2NvcmVib2FyZF9mbmFtZSk7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIGNsb3NlKGZkKTsKLSAgICBhcF9yZWdpc3Rlcl9jbGVhbnVwKHAsIE5VTEwsIGNsZWFudXBfc2hhcmVkX21lbSwgYXBfbnVsbF9jbGVhbnVwKTsKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlID0gKHNjb3JlYm9hcmQgKikgbTsKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwucnVubmluZ19nZW5lcmF0aW9uID0gMDsKLX0KLQotc3RhdGljIHZvaWQgcmVvcGVuX3Njb3JlYm9hcmQoYXBfY29udGV4dF90ICpwKQotewotfQotCi0jZWxpZiBkZWZpbmVkKFVTRV9NTUFQX1NDT1JFQk9BUkQpCi0KLXN0YXRpYyB2b2lkIHNldHVwX3NoYXJlZF9tZW0oYXBfY29udGV4dF90ICpwKQotewotICAgIGNhZGRyX3QgbTsKLQotI2lmIGRlZmluZWQoTUFQX0FOT04pCi0vKiBCU0Qgc3R5bGUgKi8KLSNpZmRlZiBDT05WRVhPUzExCi0gICAgLyoKLSAgICAgKiA5LUF1Zy05NyAtIEplZmYgVmVudGVycyAodmVudGVyc0Bjb252ZXguaHAuY29tKQotICAgICAqIENvbnZleE9TIG1hcHMgYWRkcmVzcyBzcGFjZSBhcyBmb2xsb3dzOgotICAgICAqICAgMHgwMDAwMDAwMCAtIDB4N2ZmZmZmZmYgOiBLZXJuZWwKLSAgICAgKiAgIDB4ODAwMDAwMDAgLSAweGZmZmZmZmZmIDogVXNlcgotICAgICAqIFN0YXJ0IG1tYXBwZWQgYXJlYSAxR0IgYWJvdmUgc3RhcnQgb2YgdGV4dC4KLSAgICAgKgotICAgICAqIEFsc28sIHRoZSBsZW5ndGggcmVxdWlyZXMgYSBwb2ludGVyIGFzIHRoZSBhY3R1YWwgbGVuZ3RoIGlzCi0gICAgICogcmV0dXJuZWQgKHJvdW5kZWQgdXAgdG8gYSBwYWdlIGJvdW5kYXJ5KS4KLSAgICAgKi8KLSAgICB7Ci0JdW5zaWduZWQgbGVuID0gU0NPUkVCT0FSRF9TSVpFOwotCi0JbSA9IG1tYXAoKGNhZGRyX3QpIDB4QzAwMDAwMDAsICZsZW4sCi0JCSBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfQU5PTiB8IE1BUF9TSEFSRUQsIE5PRkQsIDApOwotICAgIH0KLSNlbGlmIGRlZmluZWQoTUFQX1RNUEZJTEUpCi0gICAgewotCWNoYXIgbWZpbGVbXSA9ICIvdG1wL2FwYWNoZV9zaG1lbV9YWFhYIjsKLQlpbnQgZmQgPSBta3N0ZW1wKG1maWxlKTsKLQlpZiAoZmQgPT0gLTEpIHsKLQkgICAgcGVycm9yKCJvcGVuIik7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBDb3VsZCBub3Qgb3BlbiAlcyIsIGFwX3NlcnZlcl9hcmd2MCwgbWZpbGUpOwotCSAgICBleGl0KEFQRVhJVF9JTklUKTsKLQl9Ci0JbSA9IG1tYXAoKGNhZGRyX3QpIDAsIFNDT1JFQk9BUkRfU0laRSwKLQkJUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQsIDApOwotCWlmIChtID09IChjYWRkcl90KSAtIDEpIHsKLQkgICAgcGVycm9yKCJtbWFwIik7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBDb3VsZCBub3QgbW1hcCAlcyIsIGFwX3NlcnZlcl9hcmd2MCwgbWZpbGUpOwotCSAgICBleGl0KEFQRVhJVF9JTklUKTsKLQl9Ci0JY2xvc2UoZmQpOwotCXVubGluayhtZmlsZSk7Ci0gICAgfQotI2Vsc2UKLSAgICBtID0gbW1hcCgoY2FkZHJfdCkgMCwgU0NPUkVCT0FSRF9TSVpFLAotCSAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX0FOT04gfCBNQVBfU0hBUkVELCAtMSwgMCk7Ci0jZW5kaWYKLSAgICBpZiAobSA9PSAoY2FkZHJfdCkgLSAxKSB7Ci0JcGVycm9yKCJtbWFwIik7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICIlczogQ291bGQgbm90IG1tYXAgbWVtb3J5IiwgYXBfc2VydmVyX2FyZ3YwKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0jZWxzZQotLyogU3VuIHN0eWxlICovCi0gICAgaW50IGZkOwotCi0gICAgZmQgPSBvcGVuKCIvZGV2L3plcm8iLCBPX1JEV1IpOwotICAgIGlmIChmZCA9PSAtMSkgewotCXBlcnJvcigib3BlbiIpOwotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiJXM6IENvdWxkIG5vdCBvcGVuIC9kZXYvemVybyIsIGFwX3NlcnZlcl9hcmd2MCk7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIG0gPSBtbWFwKChjYWRkcl90KSAwLCBTQ09SRUJPQVJEX1NJWkUsCi0JICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmZCwgMCk7Ci0gICAgaWYgKG0gPT0gKGNhZGRyX3QpIC0gMSkgewotCXBlcnJvcigibW1hcCIpOwotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiJXM6IENvdWxkIG5vdCBtbWFwIC9kZXYvemVybyIsIGFwX3NlcnZlcl9hcmd2MCk7Ci0JZXhpdChBUEVYSVRfSU5JVCk7Ci0gICAgfQotICAgIGNsb3NlKGZkKTsKLSNlbmRpZgotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UgPSAoc2NvcmVib2FyZCAqKSBtOwotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbC5ydW5uaW5nX2dlbmVyYXRpb24gPSAwOwotfQotCi1zdGF0aWMgdm9pZCByZW9wZW5fc2NvcmVib2FyZChhcF9jb250ZXh0X3QgKnApCi17Ci19Ci0KLSNlbGlmIGRlZmluZWQoVVNFX1NITUdFVF9TQ09SRUJPQVJEKQotc3RhdGljIGtleV90IHNobWtleSA9IElQQ19QUklWQVRFOwotc3RhdGljIGludCBzaG1pZCA9IC0xOwotCi1zdGF0aWMgdm9pZCBzZXR1cF9zaGFyZWRfbWVtKGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICBzdHJ1Y3Qgc2htaWRfZHMgc2htYnVmOwotI2lmZGVmIE1PVkVCUkVBSwotICAgIGNoYXIgKm9icms7Ci0jZW5kaWYKLQotICAgIGlmICgoc2htaWQgPSBzaG1nZXQoc2hta2V5LCBTQ09SRUJPQVJEX1NJWkUsIElQQ19DUkVBVCB8IFNITV9SIHwgU0hNX1cpKSA9PSAtMSkgewotI2lmZGVmIExJTlVYCi0JaWYgKGVycm5vID09IEVOT1NZUykgewotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FTUVSRywgMCwgc2VydmVyX2NvbmYsCi0JCQkgIllvdXIga2VybmVsIHdhcyBidWlsdCB3aXRob3V0IENPTkZJR19TWVNWSVBDXG4iCi0JCQkgIiVzOiBQbGVhc2UgY29uc3VsdCB0aGUgQXBhY2hlIEZBUSBmb3IgZGV0YWlscyIsCi0JCQkgYXBfc2VydmVyX2FyZ3YwKTsKLQl9Ci0jZW5kaWYKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJjb3VsZCBub3QgY2FsbCBzaG1nZXQiKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0KLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19JTkZPLCAwLCBzZXJ2ZXJfY29uZiwKLQkJImNyZWF0ZWQgc2hhcmVkIG1lbW9yeSBzZWdtZW50ICMlZCIsIHNobWlkKTsKLQotI2lmZGVmIE1PVkVCUkVBSwotICAgIC8qCi0gICAgICogU29tZSBTeXNWIHN5c3RlbXMgcGxhY2UgdGhlIHNoYXJlZCBzZWdtZW50IFdBWSB0b28gY2xvc2UKLSAgICAgKiB0byB0aGUgZHluYW1pYyBtZW1vcnkgYnJlYWsgcG9pbnQgKHNicmsoMCkpLiBUaGlzIHNldmVyZWx5Ci0gICAgICogbGltaXRzIHRoZSB1c2Ugb2YgbWFsbG9jL3NicmsgaW4gdGhlIHByb2dyYW0gc2luY2Ugc2JyayB3aWxsCi0gICAgICogcmVmdXNlIHRvIG1vdmUgcGFzdCB0aGF0IHBvaW50LgotICAgICAqCi0gICAgICogVG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSBtb3ZlIHRoZSBicmVhayBwb2ludCAid2F5IHVwIHRoZXJlIiwKLSAgICAgKiBhdHRhY2ggdGhlIHNlZ21lbnQgYW5kIHRoZW4gbW92ZSBicmVhayBiYWNrIGRvd24uIFVnbHkKLSAgICAgKi8KLSAgICBpZiAoKG9icmsgPSBzYnJrKE1PVkVCUkVBSykpID09IChjaGFyICopIC0xKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgc2VydmVyX2NvbmYsCi0JICAgICJzYnJrKCkgY291bGQgbm90IG1vdmUgYnJlYWsiKTsKLSAgICB9Ci0jZW5kaWYKLQotI2RlZmluZSBCQURTSE1BVAkoKHNjb3JlYm9hcmQgKikoLTEpKQotICAgIGlmICgoYXBfc2NvcmVib2FyZF9pbWFnZSA9IChzY29yZWJvYXJkICopIHNobWF0KHNobWlkLCAwLCAwKSkgPT0gQkFEU0hNQVQpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNobWF0IGVycm9yIik7Ci0JLyoKLQkgKiBXZSBleGl0IGJlbG93LCBhZnRlciB3ZSB0cnkgdG8gcmVtb3ZlIHRoZSBzZWdtZW50Ci0JICovCi0gICAgfQotICAgIGVsc2UgewkJCS8qIG9ubHkgd29ycnkgYWJvdXQgcGVybWlzc2lvbnMgaWYgd2UgYXR0YWNoZWQgdGhlIHNlZ21lbnQgKi8KLQlpZiAoc2htY3RsKHNobWlkLCBJUENfU1RBVCwgJnNobWJ1ZikgIT0gMCkgewotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgc2VydmVyX2NvbmYsCi0JCSJzaG1jdGwoKSBjb3VsZCBub3Qgc3RhdCBzZWdtZW50ICMlZCIsIHNobWlkKTsKLQl9Ci0JZWxzZSB7Ci0JICAgIHNobWJ1Zi5zaG1fcGVybS51aWQgPSB1bml4ZF9jb25maWcudXNlcl9pZDsKLQkgICAgc2htYnVmLnNobV9wZXJtLmdpZCA9IHVuaXhkX2NvbmZpZy5ncm91cF9pZDsKLQkgICAgaWYgKHNobWN0bChzaG1pZCwgSVBDX1NFVCwgJnNobWJ1ZikgIT0gMCkgewotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgc2VydmVyX2NvbmYsCi0JCSAgICAic2htY3RsKCkgY291bGQgbm90IHNldCBzZWdtZW50ICMlZCIsIHNobWlkKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gICAgLyoKLSAgICAgKiBXZSBtdXN0IGF2b2lkIGxlYXZpbmcgc2VnbWVudHMgaW4gdGhlIGtlcm5lbCdzCi0gICAgICogKHNtYWxsKSB0YWJsZXMuCi0gICAgICovCi0gICAgaWYgKHNobWN0bChzaG1pZCwgSVBDX1JNSUQsIE5VTEwpICE9IDApIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLAotCQkic2htY3RsOiBJUENfUk1JRDogY291bGQgbm90IHJlbW92ZSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQgIyVkIiwKLQkJc2htaWQpOwotICAgIH0KLSAgICBpZiAoYXBfc2NvcmVib2FyZF9pbWFnZSA9PSBCQURTSE1BVCkJLyogbm93IGJhaWxvdXQgKi8KLQlleGl0KEFQRVhJVF9JTklUKTsKLQotI2lmZGVmIE1PVkVCUkVBSwotICAgIGlmIChvYnJrID09IChjaGFyICopIC0xKQotCXJldHVybjsJCQkvKiBub3RoaW5nIGVsc2UgdG8gZG8gKi8KLSAgICBpZiAoc2JyaygtKE1PVkVCUkVBSykpID09IChjaGFyICopIC0xKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgc2VydmVyX2NvbmYsCi0JICAgICJzYnJrKCkgY291bGQgbm90IG1vdmUgYnJlYWsgYmFjayIpOwotICAgIH0KLSNlbmRpZgotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbC5ydW5uaW5nX2dlbmVyYXRpb24gPSAwOwotfQotCi1zdGF0aWMgdm9pZCByZW9wZW5fc2NvcmVib2FyZChhcF9jb250ZXh0X3QgKnApCi17Ci19Ci0KLSNlbGlmIGRlZmluZWQoVVNFX1RQRl9TQ09SRUJPQVJEKQotCi1zdGF0aWMgdm9pZCBjbGVhbnVwX3Njb3JlYm9hcmRfaGVhcCgpCi17Ci0gICAgaW50IHJ2OwotICAgIHJ2ID0gcnN5c2MoYXBfc2NvcmVib2FyZF9pbWFnZSwgU0NPUkVCT0FSRF9GUkFNRVMsIFNDT1JFQk9BUkRfTkFNRSk7Ci0gICAgaWYocnYgPT0gUlNZU0NfRVJST1IpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAicnN5c2MoKSBjb3VsZCBub3QgcmVsZWFzZSBzY29yZWJvYXJkIHN5c3RlbSBoZWFwIik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBzZXR1cF9zaGFyZWRfbWVtKGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICBjaW5mYyhDSU5GQ19XUklURSwgQ0lORkNfQ01NQ1RLMik7Ci0gICAgYXBfc2NvcmVib2FyZF9pbWFnZSA9IChzY29yZWJvYXJkICopIGdzeXNjKFNDT1JFQk9BUkRfRlJBTUVTLCBTQ09SRUJPQVJEX05BTUUpOwotCi0gICAgaWYgKCFhcF9zY29yZWJvYXJkX2ltYWdlKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiaHR0cGQ6IENvdWxkIG5vdCBjcmVhdGUgc2NvcmVib2FyZCBzeXN0ZW0gaGVhcCBzdG9yYWdlLiIpOwotICAgICAgICBleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0KLSAgICBhcF9yZWdpc3Rlcl9jbGVhbnVwKHAsIE5VTEwsIGNsZWFudXBfc2NvcmVib2FyZF9oZWFwLCBhcF9udWxsX2NsZWFudXApOwotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbC5ydW5uaW5nX2dlbmVyYXRpb24gPSAwOwotfQotCi1zdGF0aWMgdm9pZCByZW9wZW5fc2NvcmVib2FyZChhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgY2luZmMoQ0lORkNfV1JJVEUsIENJTkZDX0NNTUNUSzIpOwotfQotCi0jZWxzZQotI2RlZmluZSBTQ09SRUJPQVJEX0ZJTEUKLXN0YXRpYyBzY29yZWJvYXJkIF9zY29yZWJvYXJkX2ltYWdlOwotc3RhdGljIGludCBzY29yZWJvYXJkX2ZkID0gLTE7Ci0KLS8qIFhYWDogdGhpbmdzIGFyZSBzZXJpb3VzbHkgc2NyZXdlZCBpZiB3ZSBldmVyIGhhdmUgdG8gZG8gYSBwYXJ0aWFsCi0gKiByZWFkIG9yIHdyaXRlIC4uLiB3ZSBjb3VsZCBnZXQgYSBjb3JydXB0ZWQgc2NvcmVib2FyZAotICovCi1zdGF0aWMgaW50IGZvcmNlX3dyaXRlKGludCBmZCwgdm9pZCAqYnVmZmVyLCBpbnQgYnVmc3opCi17Ci0gICAgaW50IHJ2LCBvcmlnX3N6ID0gYnVmc3o7Ci0KLSAgICBkbyB7Ci0JcnYgPSB3cml0ZShmZCwgYnVmZmVyLCBidWZzeik7Ci0JaWYgKHJ2ID4gMCkgewotCSAgICBidWZmZXIgPSAoY2hhciAqKSBidWZmZXIgKyBydjsKLQkgICAgYnVmc3ogLT0gcnY7Ci0JfQotICAgIH0gd2hpbGUgKChydiA+IDAgJiYgYnVmc3ogPiAwKSB8fCAocnYgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpKTsKLQotICAgIHJldHVybiBydiA8IDAgPyBydiA6IG9yaWdfc3ogLSBidWZzejsKLX0KLQotc3RhdGljIGludCBmb3JjZV9yZWFkKGludCBmZCwgdm9pZCAqYnVmZmVyLCBpbnQgYnVmc3opCi17Ci0gICAgaW50IHJ2LCBvcmlnX3N6ID0gYnVmc3o7Ci0KLSAgICBkbyB7Ci0JcnYgPSByZWFkKGZkLCBidWZmZXIsIGJ1ZnN6KTsKLQlpZiAocnYgPiAwKSB7Ci0JICAgIGJ1ZmZlciA9IChjaGFyICopIGJ1ZmZlciArIHJ2OwotCSAgICBidWZzeiAtPSBydjsKLQl9Ci0gICAgfSB3aGlsZSAoKHJ2ID4gMCAmJiBidWZzeiA+IDApIHx8IChydiA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikpOwotCi0gICAgcmV0dXJuIHJ2IDwgMCA/IHJ2IDogb3JpZ19zeiAtIGJ1ZnN6OwotfQotCi1zdGF0aWMgdm9pZCBjbGVhbnVwX3Njb3JlYm9hcmRfZmlsZSh2b2lkICpmb28pCi17Ci0gICAgdW5saW5rKGFwX3Njb3JlYm9hcmRfZm5hbWUpOwotfQotCi12b2lkIHJlb3Blbl9zY29yZWJvYXJkKGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICBpZiAoc2NvcmVib2FyZF9mZCAhPSAtMSkKLQlhcF9wY2xvc2VmKHAsIHNjb3JlYm9hcmRfZmQpOwotCi0jaWZkZWYgVFBGCi0gICAgYXBfc2NvcmVib2FyZF9mbmFtZSA9IGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKHAsIGFwX3Njb3JlYm9hcmRfZm5hbWUpOwotI2VuZGlmIC8qIFRQRiAqLwotICAgIHNjb3JlYm9hcmRfZmQgPSBhcF9wb3BlbmYocCwgYXBfc2NvcmVib2FyZF9mbmFtZSwgT19DUkVBVCB8IE9fQklOQVJZIHwgT19SRFdSLCAwNjY2KTsKLSAgICBpZiAoc2NvcmVib2FyZF9mZCA9PSAtMSkgewotCXBlcnJvcihhcF9zY29yZWJvYXJkX2ZuYW1lKTsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBvcGVuIHNjb3JlYm9hcmQgZmlsZToiKTsKLQljbGVhbl9jaGlsZF9leGl0KDEpOwotICAgIH0KLX0KLSNlbmRpZgotCi0vKiBDYWxsZWQgYnkgcGFyZW50IHByb2Nlc3MgKi8KLXN0YXRpYyB2b2lkIHJlaW5pdF9zY29yZWJvYXJkKGFwX2NvbnRleHRfdCAqcCkKLXsKLSAgICBpbnQgcnVubmluZ19nZW4gPSAwOwotICAgIGlmIChhcF9zY29yZWJvYXJkX2ltYWdlKQotCXJ1bm5pbmdfZ2VuID0gYXBfc2NvcmVib2FyZF9pbWFnZS0+Z2xvYmFsLnJ1bm5pbmdfZ2VuZXJhdGlvbjsKLQotI2lmbmRlZiBTQ09SRUJPQVJEX0ZJTEUKLSAgICBpZiAoYXBfc2NvcmVib2FyZF9pbWFnZSA9PSBOVUxMKSB7Ci0Jc2V0dXBfc2hhcmVkX21lbShwKTsKLSAgICB9Ci0gICAgbWVtc2V0KGFwX3Njb3JlYm9hcmRfaW1hZ2UsIDAsIFNDT1JFQk9BUkRfU0laRSk7Ci0gICAgYXBfc2NvcmVib2FyZF9pbWFnZS0+Z2xvYmFsLnJ1bm5pbmdfZ2VuZXJhdGlvbiA9IHJ1bm5pbmdfZ2VuOwotI2Vsc2UKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlID0gJl9zY29yZWJvYXJkX2ltYWdlOwotICAgIGFwX3Njb3JlYm9hcmRfZm5hbWUgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShwLCBhcF9zY29yZWJvYXJkX2ZuYW1lKTsKLQotICAgIHNjb3JlYm9hcmRfZmQgPSBhcF9wb3BlbmYocCwgYXBfc2NvcmVib2FyZF9mbmFtZSwgT19DUkVBVCB8IE9fQklOQVJZIHwgT19SRFdSLCAwNjQ0KTsKLSAgICBpZiAoc2NvcmVib2FyZF9mZCA9PSAtMSkgewotCXBlcnJvcihhcF9zY29yZWJvYXJkX2ZuYW1lKTsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBvcGVuIHNjb3JlYm9hcmQgZmlsZToiKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0gICAgYXBfcmVnaXN0ZXJfY2xlYW51cChwLCBOVUxMLCBjbGVhbnVwX3Njb3JlYm9hcmRfZmlsZSwgYXBfbnVsbF9jbGVhbnVwKTsKLQotICAgIG1lbXNldCgoY2hhciAqKSBhcF9zY29yZWJvYXJkX2ltYWdlLCAwLCBzaXplb2YoKmFwX3Njb3JlYm9hcmRfaW1hZ2UpKTsKLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwucnVubmluZ19nZW5lcmF0aW9uID0gcnVubmluZ19nZW47Ci0gICAgZm9yY2Vfd3JpdGUoc2NvcmVib2FyZF9mZCwgYXBfc2NvcmVib2FyZF9pbWFnZSwgc2l6ZW9mKCphcF9zY29yZWJvYXJkX2ltYWdlKSk7Ci0jZW5kaWYKLX0KLQotLyogUm91dGluZXMgY2FsbGVkIHRvIGRlYWwgd2l0aCB0aGUgc2NvcmVib2FyZCBpbWFnZQotICogLS0tIG5vdGUgdGhhdCB3ZSBkbyAqbm90KiBuZWVkIHdyaXRlIGxvY2tzLCBzaW5jZSB1cGRhdGVfY2hpbGRfc3RhdHVzCi0gKiBvbmx5IHVwZGF0ZXMgYSAqc2luZ2xlKiByZWNvcmQgaW4gcGxhY2UsIGFuZCBvbmx5IG9uZSBwcm9jZXNzIHdyaXRlcyB0bwotICogYSBnaXZlbiBzY29yZWJvYXJkIHNsb3QgYXQgYSB0aW1lIChlaXRoZXIgdGhlIGNoaWxkIHByb2Nlc3Mgb3duaW5nIHRoYXQKLSAqIHNsb3QsIG9yIHRoZSBwYXJlbnQsIG5vdGluZyB0aGF0IHRoZSBjaGlsZCBoYXMgZGllZCkuCi0gKgotICogQXMgYSBmaW5hbCBub3RlIC0tLSBzZXR0aW5nIHRoZSBzY29yZSBlbnRyeSB0byBnZXRwaWQoKSBpcyBhbHdheXMgc2FmZSwKLSAqIHNpbmNlIHdoZW4gdGhlIHBhcmVudCBpcyB3cml0aW5nIGFuIGVudHJ5LCBpdCdzIG9ubHkgbm90aW5nIFNFUlZFUl9ERUFECi0gKiBhbnl3YXkuCi0gKi8KLQotYXBfaW5saW5lIHZvaWQgYXBfc3luY19zY29yZWJvYXJkX2ltYWdlKHZvaWQpCi17Ci0jaWZkZWYgU0NPUkVCT0FSRF9GSUxFCi0gICAgbHNlZWsoc2NvcmVib2FyZF9mZCwgMEwsIDApOwotICAgIGZvcmNlX3JlYWQoc2NvcmVib2FyZF9mZCwgYXBfc2NvcmVib2FyZF9pbWFnZSwgc2l6ZW9mKCphcF9zY29yZWJvYXJkX2ltYWdlKSk7Ci0jZW5kaWYKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX2V4aXN0c19zY29yZWJvYXJkX2ltYWdlKHZvaWQpCi17Ci0gICAgcmV0dXJuIChhcF9zY29yZWJvYXJkX2ltYWdlID8gMSA6IDApOwotfQotCi1zdGF0aWMgYXBfaW5saW5lIHZvaWQgcHV0X3Njb3JlYm9hcmRfaW5mbyhpbnQgY2hpbGRfbnVtLAotCQkJCSAgICAgICBzaG9ydF9zY29yZSAqbmV3X3Njb3JlX3JlYykKLXsKLSNpZmRlZiBTQ09SRUJPQVJEX0ZJTEUKLSAgICBsc2VlayhzY29yZWJvYXJkX2ZkLCAobG9uZykgY2hpbGRfbnVtICogc2l6ZW9mKHNob3J0X3Njb3JlKSwgMCk7Ci0gICAgZm9yY2Vfd3JpdGUoc2NvcmVib2FyZF9mZCwgbmV3X3Njb3JlX3JlYywgc2l6ZW9mKHNob3J0X3Njb3JlKSk7Ci0jZW5kaWYKLX0KLQotaW50IGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMoaW50IGNoaWxkX251bSwgaW50IHN0YXR1cywgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaW50IG9sZF9zdGF0dXM7Ci0gICAgc2hvcnRfc2NvcmUgKnNzOwotCi0gICAgaWYgKGNoaWxkX251bSA8IDApCi0JcmV0dXJuIC0xOwotCi0gICAgYXBfY2hlY2tfc2lnbmFscygpOwotCi0gICAgYXBfc3luY19zY29yZWJvYXJkX2ltYWdlKCk7Ci0gICAgc3MgPSAmYXBfc2NvcmVib2FyZF9pbWFnZS0+c2VydmVyc1tjaGlsZF9udW1dOwotICAgIG9sZF9zdGF0dXMgPSBzcy0+c3RhdHVzOwotICAgIHNzLT5zdGF0dXMgPSBzdGF0dXM7Ci0KLSAgICBpZiAoYXBfZXh0ZW5kZWRfc3RhdHVzKSB7Ci0JaWYgKHN0YXR1cyA9PSBTRVJWRVJfUkVBRFkgfHwgc3RhdHVzID09IFNFUlZFUl9ERUFEKSB7Ci0JICAgIC8qCi0JICAgICAqIFJlc2V0IGluZGl2aWR1YWwgY291bnRlcnMKLQkgICAgICovCi0JICAgIGlmIChzdGF0dXMgPT0gU0VSVkVSX0RFQUQpIHsKLQkJc3MtPm15X2FjY2Vzc19jb3VudCA9IDBMOwotCQlzcy0+bXlfYnl0ZXNfc2VydmVkID0gMEw7Ci0JICAgIH0KLQkgICAgc3MtPmNvbm5fY291bnQgPSAodW5zaWduZWQgc2hvcnQpIDA7Ci0JICAgIHNzLT5jb25uX2J5dGVzID0gKHVuc2lnbmVkIGxvbmcpIDA7Ci0JfQotCWlmIChyKSB7Ci0JICAgIGNvbm5fcmVjICpjID0gci0+Y29ubmVjdGlvbjsKLQkgICAgYXBfY3B5c3Rybihzcy0+Y2xpZW50LCBhcF9nZXRfcmVtb3RlX2hvc3QoYywgci0+cGVyX2Rpcl9jb25maWcsCi0JCQkJICBSRU1PVEVfTk9MT09LVVApLCBzaXplb2Yoc3MtPmNsaWVudCkpOwotCSAgICBpZiAoci0+dGhlX3JlcXVlc3QgPT0gTlVMTCkgewotCQkgICAgYXBfY3B5c3Rybihzcy0+cmVxdWVzdCwgIk5VTEwiLCBzaXplb2Yoc3MtPnJlcXVlc3QpKTsKLQkgICAgfSBlbHNlIGlmIChyLT5wYXJzZWRfdXJpLnBhc3N3b3JkID09IE5VTEwpIHsKLQkJICAgIGFwX2NweXN0cm4oc3MtPnJlcXVlc3QsIHItPnRoZV9yZXF1ZXN0LCBzaXplb2Yoc3MtPnJlcXVlc3QpKTsKLQkgICAgfSBlbHNlIHsKLQkJLyogRG9uJ3QgcmV2ZWFsIHRoZSBwYXNzd29yZCBpbiB0aGUgc2VydmVyLXN0YXR1cyB2aWV3ICovCi0JCSAgICBhcF9jcHlzdHJuKHNzLT5yZXF1ZXN0LCBhcF9wc3RyY2F0KHItPnBvb2wsIHItPm1ldGhvZCwgIiAiLAotCQkJCQkgICAgICAgYXBfdW5wYXJzZV91cmlfY29tcG9uZW50cyhyLT5wb29sLCAmci0+cGFyc2VkX3VyaSwgVU5QX09NSVRQQVNTV09SRCksCi0JCQkJCSAgICAgICByLT5hc3NiYWNrd2FyZHMgPyBOVUxMIDogIiAiLCByLT5wcm90b2NvbCwgTlVMTCksCi0JCQkJICAgICAgIHNpemVvZihzcy0+cmVxdWVzdCkpOwotCSAgICB9Ci0JICAgIHNzLT52aG9zdHJlYyA9ICByLT5zZXJ2ZXI7Ci0JfQotICAgIH0KLSAgICBpZiAoc3RhdHVzID09IFNFUlZFUl9TVEFSVElORyAmJiByID09IE5VTEwpIHsKLQkvKiBjbGVhbiB1cCB0aGUgc2xvdCdzIHZob3N0cmVjIHBvaW50ZXIgKG1heWJlIHJlLXVzZWQpCi0JICogYW5kIG1hcmsgdGhlIHNsb3QgYXMgYmVsb25naW5nIHRvIGEgbmV3IGdlbmVyYXRpb24uCi0JICovCi0Jc3MtPnZob3N0cmVjID0gTlVMTDsKLQlhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnRbY2hpbGRfbnVtXS5nZW5lcmF0aW9uID0gYXBfbXlfZ2VuZXJhdGlvbjsKLSNpZmRlZiBTQ09SRUJPQVJEX0ZJTEUKLQlsc2VlayhzY29yZWJvYXJkX2ZkLCBYdE9mZnNldE9mKHNjb3JlYm9hcmQsIHBhcmVudFtjaGlsZF9udW1dKSwgMCk7Ci0JZm9yY2Vfd3JpdGUoc2NvcmVib2FyZF9mZCwgJmFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtjaGlsZF9udW1dLAotCSAgICBzaXplb2YocGFyZW50X3Njb3JlKSk7Ci0jZW5kaWYKLSAgICB9Ci0gICAgcHV0X3Njb3JlYm9hcmRfaW5mbyhjaGlsZF9udW0sIHNzKTsKLQotICAgIHJldHVybiBvbGRfc3RhdHVzOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfc2NvcmVib2FyZF9nbG9iYWwodm9pZCkKLXsKLSNpZmRlZiBTQ09SRUJPQVJEX0ZJTEUKLSAgICBsc2VlayhzY29yZWJvYXJkX2ZkLAotCSAgKGNoYXIgKikgJmFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbCAtKGNoYXIgKikgYXBfc2NvcmVib2FyZF9pbWFnZSwgMCk7Ci0gICAgZm9yY2Vfd3JpdGUoc2NvcmVib2FyZF9mZCwgJmFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbCwKLQkJc2l6ZW9mIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbCk7Ci0jZW5kaWYKLX0KLQotdm9pZCBhcF90aW1lX3Byb2Nlc3NfcmVxdWVzdChpbnQgY2hpbGRfbnVtLCBpbnQgc3RhdHVzKQotewotICAgIHNob3J0X3Njb3JlICpzczsKLSNpZiAhZGVmaW5lZChIQVZFX0dFVFRJTUVPRkRBWSkgJiYgZGVmaW5lZChIQVZFX1RJTUVTKQotICAgIHN0cnVjdCB0bXMgdG1zX2JsazsKLSNlbmRpZgotCi0gICAgaWYgKGNoaWxkX251bSA8IDApCi0JcmV0dXJuOwotCi0gICAgYXBfc3luY19zY29yZWJvYXJkX2ltYWdlKCk7Ci0gICAgc3MgPSAmYXBfc2NvcmVib2FyZF9pbWFnZS0+c2VydmVyc1tjaGlsZF9udW1dOwotCi0gICAgaWYgKHN0YXR1cyA9PSBTVEFSVF9QUkVRVUVTVCkgewotI2lmICFkZWZpbmVkKEhBVkVfR0VUVElNRU9GREFZKQotI2lmZGVmIEhBVkVfVElNRVMKLQlpZiAoKHNzLT5zdGFydF90aW1lID0gdGltZXMoJnRtc19ibGspKSA9PSAtMSkKLSNlbmRpZiAvKiBIQVZFX1RJTUVTICovCi0JICAgIHNzLT5zdGFydF90aW1lID0gKGNsb2NrX3QpIDA7Ci0jZWxzZQotCWlmIChnZXR0aW1lb2ZkYXkoJnNzLT5zdGFydF90aW1lLCAoc3RydWN0IHRpbWV6b25lICopIDApIDwgMCkKLQkgICAgc3MtPnN0YXJ0X3RpbWUudHZfc2VjID0KLQkJc3MtPnN0YXJ0X3RpbWUudHZfdXNlYyA9IDBMOwotI2VuZGlmCi0gICAgfQotICAgIGVsc2UgaWYgKHN0YXR1cyA9PSBTVE9QX1BSRVFVRVNUKSB7Ci0jaWYgIWRlZmluZWQoSEFWRV9HRVRUSU1FT0ZEQVkpCi0jaWZkZWYgSEFWRV9USU1FUwotCWlmICgoc3MtPnN0b3BfdGltZSA9IHRpbWVzKCZ0bXNfYmxrKSkgPT0gLTEpCi0jZW5kaWYKLQkgICAgc3MtPnN0b3BfdGltZSA9IHNzLT5zdGFydF90aW1lID0gKGNsb2NrX3QpIDA7Ci0jZWxzZQotCWlmIChnZXR0aW1lb2ZkYXkoJnNzLT5zdG9wX3RpbWUsIChzdHJ1Y3QgdGltZXpvbmUgKikgMCkgPCAwKQotCSAgICBzcy0+c3RvcF90aW1lLnR2X3NlYyA9Ci0JCXNzLT5zdG9wX3RpbWUudHZfdXNlYyA9Ci0JCXNzLT5zdGFydF90aW1lLnR2X3NlYyA9Ci0JCXNzLT5zdGFydF90aW1lLnR2X3VzZWMgPSAwTDsKLSNlbmRpZgotCi0gICAgfQotCi0gICAgcHV0X3Njb3JlYm9hcmRfaW5mbyhjaGlsZF9udW0sIHNzKTsKLX0KLQotLyoKLXN0YXRpYyB2b2lkIGluY3JlbWVudF9jb3VudHMoaW50IGNoaWxkX251bSwgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgbG9uZyBpbnQgYnMgPSAwOwotICAgIHNob3J0X3Njb3JlICpzczsKLQotICAgIGFwX3N5bmNfc2NvcmVib2FyZF9pbWFnZSgpOwotICAgIHNzID0gJmFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbY2hpbGRfbnVtXTsKLQotICAgIGlmIChyLT5zZW50X2JvZHljdCkKLQlhcF9iZ2V0b3B0KHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQk9fQllURUNULCAmYnMpOwotCi0jaWZkZWYgSEFWRV9USU1FUwotICAgIHRpbWVzKCZzcy0+dGltZXMpOwotI2VuZGlmCi0gICAgc3MtPmFjY2Vzc19jb3VudCsrOwotICAgIHNzLT5teV9hY2Nlc3NfY291bnQrKzsKLSAgICBzcy0+Y29ubl9jb3VudCsrOwotICAgIHNzLT5ieXRlc19zZXJ2ZWQgKz0gKHVuc2lnbmVkIGxvbmcpIGJzOwotICAgIHNzLT5teV9ieXRlc19zZXJ2ZWQgKz0gKHVuc2lnbmVkIGxvbmcpIGJzOwotICAgIHNzLT5jb25uX2J5dGVzICs9ICh1bnNpZ25lZCBsb25nKSBiczsKLQotICAgIHB1dF9zY29yZWJvYXJkX2luZm8oY2hpbGRfbnVtLCBzcyk7Ci19Ci0qLwotCi1zdGF0aWMgaW50IGZpbmRfY2hpbGRfYnlfcGlkKGludCBwaWQpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbWF4X2RhZW1vbnNfbGltaXQ7ICsraSkKLQlpZiAoYXBfc2NvcmVib2FyZF9pbWFnZS0+cGFyZW50W2ldLnBpZCA9PSBwaWQpCi0JICAgIHJldHVybiBpOwotCi0gICAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgdm9pZCByZWNsYWltX2NoaWxkX3Byb2Nlc3NlcyhpbnQgdGVybWluYXRlKQotewotI2lmbmRlZiBNVUxUSVRIUkVBRAotICAgIGludCBpLCBzdGF0dXM7Ci0gICAgbG9uZyBpbnQgd2FpdHRpbWUgPSAxMDI0ICogMTY7CS8qIGluIHVzZWNzICovCi0gICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gICAgaW50IHdhaXRyZXQsIHRyaWVzOwotICAgIGludCBub3RfZGVhZF95ZXQ7Ci0jaWZkZWYgSEFTX09USEVSX0NISUxECi0gICAgb3RoZXJfY2hpbGRfcmVjICpvY3IsICpub2NyOwotI2VuZGlmCi0KLSAgICBhcF9zeW5jX3Njb3JlYm9hcmRfaW1hZ2UoKTsKLQotICAgIGZvciAodHJpZXMgPSB0ZXJtaW5hdGUgPyA0IDogMTsgdHJpZXMgPD0gOTsgKyt0cmllcykgewotCS8qIGRvbid0IHdhbnQgdG8gaG9sZCB1cCBwcm9ncmVzcyBhbnkgbW9yZSB0aGFuIAotCSAqIG5lY2Vzc2FyeSwgYnV0IHdlIG5lZWQgdG8gYWxsb3cgY2hpbGRyZW4gYSBmZXcgbW9tZW50cyB0byBleGl0LgotCSAqIFNldCBkZWxheSB3aXRoIGFuIGV4cG9uZW50aWFsIGJhY2tvZmYuCi0JICovCi0JdHYudHZfc2VjID0gd2FpdHRpbWUgLyAxMDAwMDAwOwotCXR2LnR2X3VzZWMgPSB3YWl0dGltZSAlIDEwMDAwMDA7Ci0Jd2FpdHRpbWUgPSB3YWl0dGltZSAqIDQ7Ci0JYXBfc2VsZWN0KDAsIE5VTEwsIE5VTEwsIE5VTEwsICZ0dik7Ci0KLQkvKiBub3cgc2VlIHdobyBpcyBkb25lICovCi0Jbm90X2RlYWRfeWV0ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgbWF4X2RhZW1vbnNfbGltaXQ7ICsraSkgewotCSAgICBpbnQgcGlkID0gYXBfc2NvcmVib2FyZF9pbWFnZS0+cGFyZW50W2ldLnBpZDsKLQotCSAgICBpZiAocGlkID09IG15X3BpZCB8fCBwaWQgPT0gMCkKLQkJY29udGludWU7Ci0KLQkgICAgd2FpdHJldCA9IHdhaXRwaWQocGlkLCAmc3RhdHVzLCBXTk9IQU5HKTsKLQkgICAgaWYgKHdhaXRyZXQgPT0gcGlkIHx8IHdhaXRyZXQgPT0gLTEpIHsKLQkJYXBfc2NvcmVib2FyZF9pbWFnZS0+cGFyZW50W2ldLnBpZCA9IDA7Ci0JCWNvbnRpbnVlOwotCSAgICB9Ci0JICAgICsrbm90X2RlYWRfeWV0OwotCSAgICBzd2l0Y2ggKHRyaWVzKSB7Ci0JICAgIGNhc2UgMTogICAgIC8qICAxNm1zICovCi0JICAgIGNhc2UgMjogICAgIC8qICA4Mm1zICovCi0JCWJyZWFrOwotCSAgICBjYXNlIDM6ICAgICAvKiAzNDRtcyAqLwotCQkvKiBwZXJoYXBzIGl0IG1pc3NlZCB0aGUgU0lHSFVQLCBsZXRzIHRyeSBhZ2FpbiAqLwotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLAotCQkJICAgIDAsIHNlcnZlcl9jb25mLAotCQkgICAgImNoaWxkIHByb2Nlc3MgJWQgZGlkIG5vdCBleGl0LCBzZW5kaW5nIGFub3RoZXIgU0lHSFVQIiwKLQkJCSAgICBwaWQpOwotCQlraWxsKHBpZCwgU0lHSFVQKTsKLQkJd2FpdHRpbWUgPSAxMDI0ICogMTY7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDQ6ICAgICAvKiAgMTZtcyAqLwotCSAgICBjYXNlIDU6ICAgICAvKiAgODJtcyAqLwotCSAgICBjYXNlIDY6ICAgICAvKiAzNDRtcyAqLwotCQlicmVhazsKLQkgICAgY2FzZSA3OiAgICAgLyogMS40c2VjICovCi0JCS8qIG9rLCBub3cgaXQncyBiZWluZyBhbm5veWluZyAqLwotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLAotCQkJICAgIDAsIHNlcnZlcl9jb25mLAotCQkgICAiY2hpbGQgcHJvY2VzcyAlZCBzdGlsbCBkaWQgbm90IGV4aXQsIHNlbmRpbmcgYSBTSUdURVJNIiwKLQkJCSAgICBwaWQpOwotCQlraWxsKHBpZCwgU0lHVEVSTSk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIDg6ICAgICAvKiAgNiBzZWMgKi8KLQkJLyogZGllIGNoaWxkIHNjdW0gKi8KLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCBzZXJ2ZXJfY29uZiwKLQkJICAgImNoaWxkIHByb2Nlc3MgJWQgc3RpbGwgZGlkIG5vdCBleGl0LCBzZW5kaW5nIGEgU0lHS0lMTCIsCi0JCQkgICAgcGlkKTsKLQkJa2lsbChwaWQsIFNJR0tJTEwpOwotCQlicmVhazsKLQkgICAgY2FzZSA5OiAgICAgLyogMTQgc2VjICovCi0JCS8qIGdhdmUgaXQgb3VyIGJlc3Qgc2hvdCwgYnV0IGFsYXMuLi4gIElmIHRoaXMgcmVhbGx5IAotCQkgKiBpcyBhIGNoaWxkIHdlIGFyZSB0cnlpbmcgdG8ga2lsbCBhbmQgaXQgcmVhbGx5IGhhc24ndAotCQkgKiBleGl0ZWQsIHdlIHdpbGwgbGlrZWx5IGZhaWwgdG8gYmluZCB0byB0aGUgcG9ydAotCQkgKiBhZnRlciB0aGUgcmVzdGFydC4KLQkJICovCi0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgc2VydmVyX2NvbmYsCi0JCQkgICAgImNvdWxkIG5vdCBtYWtlIGNoaWxkIHByb2Nlc3MgJWQgZXhpdCwgIgotCQkJICAgICJhdHRlbXB0aW5nIHRvIGNvbnRpbnVlIGFueXdheSIsIHBpZCk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotI2lmZGVmIEhBU19PVEhFUl9DSElMRAotCWZvciAob2NyID0gb3RoZXJfY2hpbGRyZW47IG9jcjsgb2NyID0gbm9jcikgewotCSAgICBub2NyID0gb2NyLT5uZXh0OwotCSAgICBpZiAob2NyLT5waWQgPT0gLTEpCi0JCWNvbnRpbnVlOwotCi0JICAgIHdhaXRyZXQgPSB3YWl0cGlkKG9jci0+cGlkLCAmc3RhdHVzLCBXTk9IQU5HKTsKLQkgICAgaWYgKHdhaXRyZXQgPT0gb2NyLT5waWQpIHsKLQkJb2NyLT5waWQgPSAtMTsKLQkJKCpvY3ItPm1haW50ZW5hbmNlKSAoT0NfUkVBU09OX0RFQVRILCBvY3ItPmRhdGEsIHN0YXR1cyk7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAod2FpdHJldCA9PSAwKSB7Ci0JCSgqb2NyLT5tYWludGVuYW5jZSkgKE9DX1JFQVNPTl9SRVNUQVJULCBvY3ItPmRhdGEsIC0xKTsKLQkJKytub3RfZGVhZF95ZXQ7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAod2FpdHJldCA9PSAtMSkgewotCQkvKiB1aCB3aGF0IHRoZSBoZWNrPyB0aGV5IGRpZG4ndCBjYWxsIHVucmVnaXN0ZXI/ICovCi0JCW9jci0+cGlkID0gLTE7Ci0JCSgqb2NyLT5tYWludGVuYW5jZSkgKE9DX1JFQVNPTl9MT1NULCBvY3ItPmRhdGEsIC0xKTsKLQkgICAgfQotCX0KLSNlbmRpZgotCWlmICghbm90X2RlYWRfeWV0KSB7Ci0JICAgIC8qIG5vdGhpbmcgbGVmdCB0byB3YWl0IGZvciAqLwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmIC8qIG5kZWYgTVVMVElUSFJFQUQgKi8KLX0KLQotCi0jaWYgZGVmaW5lZChORUVEX1dBSVRQSUQpCi0vKgotICAgU3lzdGVtcyB3aXRob3V0IGEgcmVhbCB3YWl0cGlkIHNvbWV0aW1lcyBsb3NlIGEgY2hpbGQncyBleGl0IHdoaWxlIHdhaXRpbmcKLSAgIGZvciBhbm90aGVyLiAgU2VhcmNoIHRocm91Z2ggdGhlIHNjb3JlYm9hcmQgZm9yIG1pc3NpbmcgY2hpbGRyZW4uCi0gKi8KLWludCByZWFwX2NoaWxkcmVuKGFwX3dhaXRfdCAqc3RhdHVzKQotewotICAgIGludCBuLCBwaWQ7Ci0KLSAgICBmb3IgKG4gPSAwOyBuIDwgbWF4X2RhZW1vbnNfbGltaXQ7ICsrbikgewotICAgICAgICBhcF9zeW5jX3Njb3JlYm9hcmRfaW1hZ2UoKTsKLQlpZiAoYXBfc2NvcmVib2FyZF9pbWFnZS0+c2VydmVyc1tuXS5zdGF0dXMgIT0gU0VSVkVSX0RFQUQgJiYKLQkJa2lsbCgocGlkID0gYXBfc2NvcmVib2FyZF9pbWFnZS0+cGFyZW50W25dLnBpZCksIDApID09IC0xKSB7Ci0JICAgIGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMobiwgU0VSVkVSX0RFQUQsIE5VTEwpOwotCSAgICAvKiBqdXN0IG1hcmsgaXQgYXMgaGF2aW5nIGEgc3VjY2Vzc2Z1bCBleGl0IHN0YXR1cyAqLwotCSAgICBiemVybygoY2hhciAqKSBzdGF0dXMsIHNpemVvZihhcF93YWl0X3QpKTsKLQkgICAgcmV0dXJuKHBpZCk7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCi0vKiBGaW5hbGx5LCB0aGlzIHJvdXRpbmUgaXMgdXNlZCBieSB0aGUgY2FyZXRha2VyIHByb2Nlc3MgdG8gd2FpdCBmb3IKLSAqIGEgd2hpbGUuLi4KLSAqLwotCi0vKiBudW1iZXIgb2YgY2FsbHMgdG8gd2FpdF9vcl90aW1lb3V0IGJldHdlZW4gd3JpdGFibGUgcHJvYmVzICovCi0jaWZuZGVmIElOVEVSVkFMX09GX1dSSVRBQkxFX1BST0JFUwotI2RlZmluZSBJTlRFUlZBTF9PRl9XUklUQUJMRV9QUk9CRVMgMTAKLSNlbmRpZgotc3RhdGljIGludCB3YWl0X29yX3RpbWVvdXRfY291bnRlcjsKLQotc3RhdGljIGludCB3YWl0X29yX3RpbWVvdXQoYXBfd2FpdF90ICpzdGF0dXMpCi17Ci0gICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gICAgaW50IHJldDsKLQotICAgICsrd2FpdF9vcl90aW1lb3V0X2NvdW50ZXI7Ci0gICAgaWYgKHdhaXRfb3JfdGltZW91dF9jb3VudGVyID09IElOVEVSVkFMX09GX1dSSVRBQkxFX1BST0JFUykgewotCXdhaXRfb3JfdGltZW91dF9jb3VudGVyID0gMDsKLSNpZmRlZiBIQVNfT1RIRVJfQ0hJTEQKLQlwcm9iZV93cml0YWJsZV9mZHMoKTsKLSNlbmRpZgotICAgIH0KLSAgICByZXQgPSB3YWl0cGlkKC0xLCBzdGF0dXMsIFdOT0hBTkcpOwotICAgIGlmIChyZXQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpIHsKLQlyZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChyZXQgPiAwKSB7Ci0JcmV0dXJuIHJldDsKLSAgICB9Ci0jaWZkZWYgTkVFRF9XQUlUUElECi0gICAgaWYgKChyZXQgPSByZWFwX2NoaWxkcmVuKHN0YXR1cykpID4gMCkgewotCXJldHVybiByZXQ7Ci0gICAgfQotI2VuZGlmCi0gICAgdHYudHZfc2VjID0gU0NPUkVCT0FSRF9NQUlOVEVOQU5DRV9JTlRFUlZBTCAvIDEwMDAwMDA7Ci0gICAgdHYudHZfdXNlYyA9IFNDT1JFQk9BUkRfTUFJTlRFTkFOQ0VfSU5URVJWQUwgJSAxMDAwMDAwOwotICAgIGFwX3NlbGVjdCgwLCBOVUxMLCBOVUxMLCBOVUxMLCAmdHYpOwotICAgIHJldHVybiAtMTsKLX0KLQotLyogaGFuZGxlIGFsbCB2YXJpZXRpZXMgb2YgY29yZSBkdW1waW5nIHNpZ25hbHMgKi8KLXN0YXRpYyB2b2lkIHNpZ19jb3JlZHVtcChpbnQgc2lnKQotewotICAgIGNoZGlyKGFwX2NvcmVkdW1wX2Rpcik7Ci0gICAgc2lnbmFsKHNpZywgU0lHX0RGTCk7Ci0gICAga2lsbChnZXRwaWQoKSwgc2lnKTsKLSAgICAvKiBBdCB0aGlzIHBvaW50IHdlJ3ZlIGdvdCBzaWcgYmxvY2tlZCwgYmVjYXVzZSB3ZSdyZSBzdGlsbCBpbnNpZGUKLSAgICAgKiB0aGUgc2lnbmFsIGhhbmRsZXIuICBXaGVuIHdlIGxlYXZlIHRoZSBzaWduYWwgaGFuZGxlciBpdCB3aWxsCi0gICAgICogYmUgdW5ibG9ja2VkLCBhbmQgd2UnbGwgdGFrZSB0aGUgc2lnbmFsLi4uIGFuZCBjb3JlZHVtcCBvciB3aGF0ZXZlcgotICAgICAqIGlzIGFwcHJvcHJpYXRlIGZvciB0aGlzIHBhcnRpY3VsYXIgVW5peC4gIEluIGFkZGl0aW9uIHRoZSBwYXJlbnQKLSAgICAgKiB3aWxsIHNlZSB0aGUgcmVhbCBzaWduYWwgd2UgcmVjZWl2ZWQgLS0gd2hlcmVhcyBpZiB3ZSBjYWxsZWQKLSAgICAgKiBhYm9ydCgpIGhlcmUsIHRoZSBwYXJlbnQgd291bGQgb25seSBzZWUgU0lHQUJSVC4KLSAgICAgKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb25uZWN0aW9uIHN0cnVjdHVyZXMgYW5kIGFjY291bnRpbmcuLi4KLSAqLwotCi1zdGF0aWMgdm9pZCBqdXN0X2RpZShpbnQgc2lnKQotewotICAgIGNsZWFuX2NoaWxkX2V4aXQoMCk7Ci19Ci0KLXN0YXRpYyBpbnQgdm9sYXRpbGUgZGVmZXJyZWRfZGllOwotc3RhdGljIGludCB2b2xhdGlsZSB1c3IxX2p1c3RfZGllOwotCi1zdGF0aWMgdm9pZCB1c3IxX2hhbmRsZXIoaW50IHNpZykKLXsKLSAgICBpZiAodXNyMV9qdXN0X2RpZSkgewotCWp1c3RfZGllKHNpZyk7Ci0gICAgfQotICAgIGRlZmVycmVkX2RpZSA9IDE7Ci19Ci0KLS8qIHZvbGF0aWxlIGp1c3QgaW4gY2FzZSAqLwotc3RhdGljIGludCB2b2xhdGlsZSBzaHV0ZG93bl9wZW5kaW5nOwotc3RhdGljIGludCB2b2xhdGlsZSByZXN0YXJ0X3BlbmRpbmc7Ci1zdGF0aWMgaW50IHZvbGF0aWxlIGlzX2dyYWNlZnVsOwotYXBfZ2VuZXJhdGlvbl90IHZvbGF0aWxlIGFwX215X2dlbmVyYXRpb249MDsKLQotc3RhdGljIHZvaWQgc2lnX3Rlcm0oaW50IHNpZykKLXsKLSAgICBpZiAoc2h1dGRvd25fcGVuZGluZyA9PSAxKSB7Ci0JLyogVW0sIGlzIHRoaXMgX3Byb2JhYmx5XyBub3QgYW4gZXJyb3IsIGlmIHRoZSB1c2VyIGhhcwotCSAqIHRyaWVkIHRvIGRvIGEgc2h1dGRvd24gdHdpY2UgcXVpY2tseSwgc28gd2Ugd29uJ3QKLQkgKiB3b3JyeSBhYm91dCByZXBvcnRpbmcgaXQuCi0JICovCi0JcmV0dXJuOwotICAgIH0KLSAgICBzaHV0ZG93bl9wZW5kaW5nID0gMTsKLX0KLQotc3RhdGljIHZvaWQgcmVzdGFydChpbnQgc2lnKQotewotICAgIGlmIChyZXN0YXJ0X3BlbmRpbmcgPT0gMSkgewotCS8qIFByb2JhYmx5IG5vdCBhbiBlcnJvciAtIGRvbid0IGJvdGhlciByZXBvcnRpbmcgaXQgKi8KLQlyZXR1cm47Ci0gICAgfQotICAgIHJlc3RhcnRfcGVuZGluZyA9IDE7Ci0gICAgaXNfZ3JhY2VmdWwgPSBzaWcgPT0gU0lHVVNSMTsKLX0KLQotc3RhdGljIHZvaWQgc2V0X3NpZ25hbHModm9pZCkKLXsKLSNpZm5kZWYgTk9fVVNFX1NJR0FDVElPTgotICAgIHN0cnVjdCBzaWdhY3Rpb24gc2E7Ci0KLSAgICBzaWdlbXB0eXNldCgmc2Euc2FfbWFzayk7Ci0gICAgc2Euc2FfZmxhZ3MgPSAwOwotCi0gICAgaWYgKCFvbmVfcHJvY2VzcykgewotCXNhLnNhX2hhbmRsZXIgPSBzaWdfY29yZWR1bXA7Ci0jaWYgZGVmaW5lZChTQV9PTkVTSE9UKQotCXNhLnNhX2ZsYWdzID0gU0FfT05FU0hPVDsKLSNlbGlmIGRlZmluZWQoU0FfUkVTRVRIQU5EKQotCXNhLnNhX2ZsYWdzID0gU0FfUkVTRVRIQU5EOwotI2VuZGlmCi0JaWYgKHNpZ2FjdGlvbihTSUdTRUdWLCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdTRUdWKSIpOwotI2lmZGVmIFNJR0JVUwotCWlmIChzaWdhY3Rpb24oU0lHQlVTLCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdCVVMpIik7Ci0jZW5kaWYKLSNpZmRlZiBTSUdBQk9SVAotCWlmIChzaWdhY3Rpb24oU0lHQUJPUlQsICZzYSwgTlVMTCkgPCAwKQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR0FCT1JUKSIpOwotI2VuZGlmCi0jaWZkZWYgU0lHQUJSVAotCWlmIChzaWdhY3Rpb24oU0lHQUJSVCwgJnNhLCBOVUxMKSA8IDApCi0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHQUJSVCkiKTsKLSNlbmRpZgotI2lmZGVmIFNJR0lMTAotCWlmIChzaWdhY3Rpb24oU0lHSUxMLCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdJTEwpIik7Ci0jZW5kaWYKLQlzYS5zYV9mbGFncyA9IDA7Ci0gICAgfQotICAgIHNhLnNhX2hhbmRsZXIgPSBzaWdfdGVybTsKLSAgICBpZiAoc2lnYWN0aW9uKFNJR1RFUk0sICZzYSwgTlVMTCkgPCAwKQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHVEVSTSkiKTsKLSNpZmRlZiBTSUdJTlQKLSAgICBpZiAoc2lnYWN0aW9uKFNJR0lOVCwgJnNhLCBOVUxMKSA8IDApCi0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHSU5UKSIpOwotI2VuZGlmCi0jaWZkZWYgU0lHWENQVQotICAgIHNhLnNhX2hhbmRsZXIgPSBTSUdfREZMOwotICAgIGlmIChzaWdhY3Rpb24oU0lHWENQVSwgJnNhLCBOVUxMKSA8IDApCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdYQ1BVKSIpOwotI2VuZGlmCi0jaWZkZWYgU0lHWEZTWgotICAgIHNhLnNhX2hhbmRsZXIgPSBTSUdfREZMOwotICAgIGlmIChzaWdhY3Rpb24oU0lHWEZTWiwgJnNhLCBOVUxMKSA8IDApCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdYRlNaKSIpOwotI2VuZGlmCi0jaWZkZWYgU0lHUElQRQotICAgIHNhLnNhX2hhbmRsZXIgPSBTSUdfSUdOOwotICAgIGlmIChzaWdhY3Rpb24oU0lHUElQRSwgJnNhLCBOVUxMKSA8IDApCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdQSVBFKSIpOwotI2VuZGlmCi0KLSAgICAvKiB3ZSB3YW50IHRvIGlnbm9yZSBIVVBzIGFuZCBVU1IxIHdoaWxlIHdlJ3JlIGJ1c3kgcHJvY2Vzc2luZyBvbmUgKi8KLSAgICBzaWdhZGRzZXQoJnNhLnNhX21hc2ssIFNJR0hVUCk7Ci0gICAgc2lnYWRkc2V0KCZzYS5zYV9tYXNrLCBTSUdVU1IxKTsKLSAgICBzYS5zYV9oYW5kbGVyID0gcmVzdGFydDsKLSAgICBpZiAoc2lnYWN0aW9uKFNJR0hVUCwgJnNhLCBOVUxMKSA8IDApCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdIVVApIik7Ci0gICAgaWYgKHNpZ2FjdGlvbihTSUdVU1IxLCAmc2EsIE5VTEwpIDwgMCkKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR1VTUjEpIik7Ci0jZWxzZQotICAgIGlmICghb25lX3Byb2Nlc3MpIHsKLQlzaWduYWwoU0lHU0VHViwgc2lnX2NvcmVkdW1wKTsKLSNpZmRlZiBTSUdCVVMKLQlzaWduYWwoU0lHQlVTLCBzaWdfY29yZWR1bXApOwotI2VuZGlmIC8qIFNJR0JVUyAqLwotI2lmZGVmIFNJR0FCT1JUCi0Jc2lnbmFsKFNJR0FCT1JULCBzaWdfY29yZWR1bXApOwotI2VuZGlmIC8qIFNJR0FCT1JUICovCi0jaWZkZWYgU0lHQUJSVAotCXNpZ25hbChTSUdBQlJULCBzaWdfY29yZWR1bXApOwotI2VuZGlmIC8qIFNJR0FCUlQgKi8KLSNpZmRlZiBTSUdJTEwKLQlzaWduYWwoU0lHSUxMLCBzaWdfY29yZWR1bXApOwotI2VuZGlmIC8qIFNJR0lMTCAqLwotI2lmZGVmIFNJR1hDUFUKLQlzaWduYWwoU0lHWENQVSwgU0lHX0RGTCk7Ci0jZW5kaWYgLyogU0lHWENQVSAqLwotI2lmZGVmIFNJR1hGU1oKLQlzaWduYWwoU0lHWEZTWiwgU0lHX0RGTCk7Ci0jZW5kaWYgLyogU0lHWEZTWiAqLwotICAgIH0KLQotICAgIHNpZ25hbChTSUdURVJNLCBzaWdfdGVybSk7Ci0jaWZkZWYgU0lHSFVQCi0gICAgc2lnbmFsKFNJR0hVUCwgcmVzdGFydCk7Ci0jZW5kaWYgLyogU0lHSFVQICovCi0jaWZkZWYgU0lHVVNSMQotICAgIHNpZ25hbChTSUdVU1IxLCByZXN0YXJ0KTsKLSNlbmRpZiAvKiBTSUdVU1IxICovCi0jaWZkZWYgU0lHUElQRQotICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKLSNlbmRpZiAvKiBTSUdQSVBFICovCi0KLSNlbmRpZgotfQotCi0jaWYgZGVmaW5lZChUQ1BfTk9ERUxBWSkgJiYgIWRlZmluZWQoTVBFKSAmJiAhZGVmaW5lZChUUEYpCi1zdGF0aWMgdm9pZCBzb2NrX2Rpc2FibGVfbmFnbGUoaW50IHMpCi17Ci0gICAgLyogVGhlIE5hZ2xlIGFsZ29yaXRobSBzYXlzIHRoYXQgd2Ugc2hvdWxkIGRlbGF5IHNlbmRpbmcgcGFydGlhbAotICAgICAqIHBhY2tldHMgaW4gaG9wZXMgb2YgZ2V0dGluZyBtb3JlIGRhdGEuICBXZSBkb24ndCB3YW50IHRvIGRvCi0gICAgICogdGhpczsgd2UgYXJlIG5vdCB0ZWxuZXQuICBUaGVyZSBhcmUgYmFkIGludGVyYWN0aW9ucyBiZXR3ZWVuCi0gICAgICogcGVyc2lzdGVudCBjb25uZWN0aW9ucyBhbmQgTmFnbGUncyBhbGdvcml0aG0gdGhhdCBoYXZlIHZlcnkgc2V2ZXJlCi0gICAgICogcGVyZm9ybWFuY2UgcGVuYWx0aWVzLiAgKEZhaWxpbmcgdG8gZGlzYWJsZSBOYWdsZSBpcyBub3QgbXVjaCBvZiBhCi0gICAgICogcHJvYmxlbSB3aXRoIHNpbXBsZSBIVFRQLikKLSAgICAgKgotICAgICAqIEluIHNwaXRlIG9mIHRoZXNlIHByb2JsZW1zLCBmYWlsdXJlIGhlcmUgaXMgbm90IGEgc2hvb3Rpbmcgb2ZmZW5zZS4KLSAgICAgKi8KLSAgICBpbnQganVzdF9zYXlfbm8gPSAxOwotCi0gICAgaWYgKHNldHNvY2tvcHQocywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAoY2hhciAqKSAmanVzdF9zYXlfbm8sCi0JCSAgIHNpemVvZihpbnQpKSA8IDApIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLAotCQkgICAgInNldHNvY2tvcHQ6IChUQ1BfTk9ERUxBWSkiKTsKLSAgICB9Ci19Ci0KLSNlbHNlCi0jZGVmaW5lIHNvY2tfZGlzYWJsZV9uYWdsZShzKQkvKiBOT09QICovCi0jZW5kaWYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENoaWxkIHByb2Nlc3MgbWFpbiBsb29wLgotICogVGhlIGZvbGxvd2luZyB2YXJzIGFyZSBzdGF0aWMgdG8gYXZvaWQgZ2V0dGluZyBjbG9iYmVyZWQgYnkgbG9uZ2ptcCgpOwotICogdGhleSBhcmUgcmVhbGx5IHByaXZhdGUgdG8gY2hpbGRfbWFpbi4KLSAqLwotCi1zdGF0aWMgaW50IHNydjsKLXN0YXRpYyBhcF9zb2NrZXRfdCAqY3NkOwotc3RhdGljIGludCByZXF1ZXN0c190aGlzX2NoaWxkOwotc3RhdGljIGZkX3NldCBtYWluX2ZkczsKLQotaW50IGFwX2dyYWNlZnVsX3N0b3Bfc2lnbmFsbGVkKHZvaWQpCi17Ci0gICAgYXBfc3luY19zY29yZWJvYXJkX2ltYWdlKCk7Ci0gICAgaWYgKGRlZmVycmVkX2RpZSB8fAotCWFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbC5ydW5uaW5nX2dlbmVyYXRpb24gIT0gYXBfbXlfZ2VuZXJhdGlvbikgewotCXJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgY2hpbGRfbWFpbihpbnQgY2hpbGRfbnVtX2FyZykKLXsKLS8qIFhYWCByZXBsYWNlIGludCB3aXRoIE5FVF9TSVpFX1QsIHRoaXMgaXMgZGVmaW5lZCBpbiBhcF9jb25maWcuaCB3aGljaAotICAgaGFzIG1hY3JvcyB3ZSBjYW4ndCBtYWtlIHZpc2libGUgdG8gdGhpcyBmaWxlLCBidXQgaXQgaXMgdGhlIG9yaWdpbmFsIAotICAgdHlwZSBmb3IgY2xlbi4KLSovCi0gICAgaW50IGNsZW47Ci0gICAgc3RydWN0IHNvY2thZGRyIHNhX3NlcnZlcjsKLSAgICBzdHJ1Y3Qgc29ja2FkZHIgc2FfY2xpZW50OwotICAgIGFwX2xpc3Rlbl9yZWMgKmxyOwotICAgIGFwX2xpc3Rlbl9yZWMgKmxhc3RfbHI7Ci0gICAgYXBfbGlzdGVuX3JlYyAqZmlyc3RfbHI7Ci0gICAgYXBfY29udGV4dF90ICpwdHJhbnM7Ci0gICAgY29ubl9yZWMgKmN1cnJlbnRfY29ubjsKLSAgICBhcF9pb2wgKmlvbDsKLSAgICBhcF9zdGF0dXNfdCBzdGF0OwotICAgIGludCBzb2NrZGVzOwotCi0gICAgbXlfcGlkID0gZ2V0cGlkKCk7Ci0gICAgY3NkID0gTlVMTDsKLSAgICBteV9jaGlsZF9udW0gPSBjaGlsZF9udW1fYXJnOwotICAgIHJlcXVlc3RzX3RoaXNfY2hpbGQgPSAwOwotICAgIGxhc3RfbHIgPSBOVUxMOwotCi0gICAgLyogR2V0IGEgc3ViIGNvbnRleHQgZm9yIGdsb2JhbCBhbGxvY2F0aW9ucyBpbiB0aGlzIGNoaWxkLCBzbyB0aGF0Ci0gICAgICogd2UgY2FuIGhhdmUgY2xlYW51cHMgb2NjdXIgd2hlbiB0aGUgY2hpbGQgZXhpdHMuCi0gICAgICovCi0gICAgYXBfY3JlYXRlX2NvbnRleHQoJnBjaGlsZCwgcGNvbmYpOwotCi0gICAgYXBfY3JlYXRlX2NvbnRleHQoJnB0cmFucywgcGNoaWxkKTsKLQotICAgIC8qIG5lZWRzIHRvIGJlIGRvbmUgYmVmb3JlIHdlIHN3aXRjaCBVSURzIHNvIHdlIGhhdmUgcGVybWlzc2lvbnMgKi8KLSAgICByZW9wZW5fc2NvcmVib2FyZChwY2hpbGQpOwotICAgIFNBRkVfQUNDRVBUKGFjY2VwdF9tdXRleF9jaGlsZF9pbml0KHBjaGlsZCkpOwotCi0gICAgaWYgKHVuaXhkX3NldHVwX2NoaWxkKCkpIHsKLQljbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci0KLSAgICBhcF9jaGlsZF9pbml0X2hvb2socGNoaWxkLCBzZXJ2ZXJfY29uZik7Ci0KLSAgICAodm9pZCkgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhteV9jaGlsZF9udW0sIFNFUlZFUl9SRUFEWSwgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotCi0gICAgc2lnbmFsKFNJR0hVUCwganVzdF9kaWUpOwotICAgIHNpZ25hbChTSUdURVJNLCBqdXN0X2RpZSk7Ci0KLSNpZmRlZiBPUzIKLS8qIFN0b3AgQ3RybC1DL0N0cmwtQnJlYWsgc2lnbmFscyBnb2luZyB0byBjaGlsZCBwcm9jZXNzZXMgKi8KLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgdWxUaW1lczsKLSAgICAgICAgRG9zU2V0U2lnbmFsRXhjZXB0aW9uRm9jdXMoMCwgJnVsVGltZXMpOwotICAgIH0KLSNlbmRpZgotCi0gICAgd2hpbGUgKCFhcF9ncmFjZWZ1bF9zdG9wX3NpZ25hbGxlZCgpKSB7Ci0JQlVGRiAqY29ubl9pbzsKLQotCS8qIFByZXBhcmUgdG8gcmVjZWl2ZSBhIFNJR1VTUjEgZHVlIHRvIGdyYWNlZnVsIHJlc3RhcnQgc28gdGhhdAotCSAqIHdlIGNhbiBleGl0IGNsZWFubHkuCi0JICovCi0JdXNyMV9qdXN0X2RpZSA9IDE7Ci0Jc2lnbmFsKFNJR1VTUjEsIHVzcjFfaGFuZGxlcik7Ci0KLQkvKgotCSAqIChSZSlpbml0aWFsaXplIHRoaXMgY2hpbGQgdG8gYSBwcmUtY29ubmVjdGlvbiBzdGF0ZS4KLQkgKi8KLQotCWN1cnJlbnRfY29ubiA9IE5VTEw7Ci0KLQlhcF9jbGVhcl9wb29sKHB0cmFucyk7Ci0KLQlpZiAoKGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQgPiAwCi0JICAgICAmJiByZXF1ZXN0c190aGlzX2NoaWxkKysgPj0gYXBfbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCkpIHsKLQkgICAgY2xlYW5fY2hpbGRfZXhpdCgwKTsKLQl9Ci0KLQkodm9pZCkgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhteV9jaGlsZF9udW0sIFNFUlZFUl9SRUFEWSwgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotCi0JLyoKLQkgKiBXYWl0IGZvciBhbiBhY2NlcHRhYmxlIGNvbm5lY3Rpb24gdG8gYXJyaXZlLgotCSAqLwotCi0JLyogTG9jayBhcm91bmQgImFjY2VwdCIsIGlmIG5lY2Vzc2FyeSAqLwotCVNBRkVfQUNDRVBUKGFjY2VwdF9tdXRleF9vbigpKTsKLQotCWZvciAoOzspIHsKLQkgICAgaWYgKGFwX2xpc3RlbmVycy0+bmV4dCkgewotCQkvKiBtb3JlIHRoYW4gb25lIHNvY2tldCAqLwotCQltZW1jcHkoJm1haW5fZmRzLCAmbGlzdGVuZmRzLCBzaXplb2YoZmRfc2V0KSk7Ci0JCXNydiA9IGFwX3NlbGVjdChsaXN0ZW5tYXhmZCArIDEsICZtYWluX2ZkcywgTlVMTCwgTlVMTCwgTlVMTCk7Ci0KLQkJaWYgKHNydiA8IDAgJiYgZXJybm8gIT0gRUlOVFIpIHsKLQkJICAgIC8qIFNpbmdsZSBVbml4IGRvY3VtZW50cyBzZWxlY3QgYXMgcmV0dXJuaW5nIGVycm5vcwotCQkgICAgICogRUJBREYsIEVJTlRSLCBhbmQgRUlOVkFMLi4uIGFuZCBpbiBub25lIG9mIHRob3NlCi0JCSAgICAgKiBjYXNlcyBkb2VzIGl0IG1ha2Ugc2Vuc2UgdG8gY29udGludWUuICBJbiBmYWN0Ci0JCSAgICAgKiBvbiBMaW51eCAyLjAueCB3ZSBzZWVtIHRvIGVuZCB1cCB3aXRoIEVGQVVMVAotCQkgICAgICogb2NjYXNpb25hbGx5LCBhbmQgd2UnZCBsb29wIGZvcmV2ZXIgZHVlIHRvIGl0LgotCQkgICAgICovCi0JCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgc2VydmVyX2NvbmYsICJzZWxlY3Q6IChsaXN0ZW4pIik7Ci0JCSAgICBjbGVhbl9jaGlsZF9leGl0KDEpOwotCQl9Ci0KLQkJaWYgKHNydiA8PSAwKQotCQkgICAgY29udGludWU7Ci0KLQkJLyogd2UgcmVtZW1iZXIgdGhlIGxhc3RfbHIgd2Ugc2VhcmNoZWQgbGFzdCB0aW1lIGFyb3VuZCBzbyB0aGF0Ci0JCSAgIHdlIGRvbid0IGVuZCB1cCBzdGFydmluZyBhbnkgcGFydGljdWxhciBsaXN0ZW5pbmcgc29ja2V0ICovCi0JCWlmIChsYXN0X2xyID09IE5VTEwpIHsKLQkJICAgIGxyID0gYXBfbGlzdGVuZXJzOwotCQl9Ci0JCWVsc2UgewotCQkgICAgbHIgPSBsYXN0X2xyLT5uZXh0OwotCQkgICAgaWYgKCFscikKLQkJCWxyID0gYXBfbGlzdGVuZXJzOwotCQl9Ci0JCWZpcnN0X2xyPWxyOwotCQlkbyB7Ci0gICAgICAgICAgICAgICAgICAgIGFwX2dldF9vc19zb2NrKCZzb2NrZGVzLCBsci0+c2QpOwotCQkgICAgaWYgKEZEX0lTU0VUKHNvY2tkZXMsICZtYWluX2ZkcykpCi0JCQlnb3RvIGdvdF9saXN0ZW5lcjsKLQkJICAgIGxyID0gbHItPm5leHQ7Ci0JCSAgICBpZiAoIWxyKQotCQkJbHIgPSBhcF9saXN0ZW5lcnM7Ci0JCX0KLQkJd2hpbGUgKGxyICE9IGZpcnN0X2xyKTsKLQkJLyogRklYTUU6IGlmIHdlIGdldCBoZXJlLCBzb21ldGhpbmcgYmFkIGhhcyBoYXBwZW5lZCwgYW5kIHdlJ3JlCi0JCSAgIHByb2JhYmx5IGdvbm5hIHNwaW4gZm9yZXZlci4KLQkJKi8KLQkJY29udGludWU7Ci0JZ290X2xpc3RlbmVyOgotCQlsYXN0X2xyID0gbHI7Ci0JCXNkID0gbHItPnNkOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQkvKiBvbmx5IG9uZSBzb2NrZXQsIGp1c3QgcHJldGVuZCB3ZSBkaWQgdGhlIG90aGVyIHN0dWZmICovCi0JCXNkID0gYXBfbGlzdGVuZXJzLT5zZDsKLQkgICAgfQotCi0JICAgIC8qIGlmIHdlIGFjY2VwdCgpIHNvbWV0aGluZyB3ZSBkb24ndCB3YW50IHRvIGRpZSwgc28gd2UgaGF2ZSB0bwotCSAgICAgKiBkZWZlciB0aGUgZXhpdAotCSAgICAgKi8KLQkgICAgdXNyMV9qdXN0X2RpZSA9IDA7Ci0JICAgIGZvciAoOzspIHsKLQkJaWYgKGRlZmVycmVkX2RpZSkgewotCQkgICAgLyogd2UgZGlkbid0IGdldCBhIHNvY2tldCwgYW5kIHdlIHdlcmUgdG9sZCB0byBkaWUgKi8KLQkJICAgIGNsZWFuX2NoaWxkX2V4aXQoMCk7Ci0JCX0KLQkJY2xlbiA9IHNpemVvZihzYV9jbGllbnQpOwotCQlzdGF0ID0gYXBfYWNjZXB0KCZjc2QsIHNkLCBwdHJhbnMpOwotCQlpZiAoc3RhdCA9PSBBUFJfU1VDQ0VTUyB8fCBzdGF0ICE9IEFQUl9FSU5UUikKLQkJICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgICAgaWYgKHN0YXQgPT0gQVBSX1NVQ0NFU1MpCi0JCWJyZWFrOwkJLyogV2UgaGF2ZSBhIHNvY2tldCByZWFkeSBmb3IgcmVhZGluZyAqLwotCSAgICBlbHNlIHsKLQotLyogVE9ETzogdGhpcyBhY2NlcHQgcmVzdWx0IGhhbmRsaW5nIHN0dWZmIHNob3VsZCBiZSBhYnN0cmFjdGVkLi4uCi0gKiBpdCdzIGFscmVhZHkgb3V0IG9mIGRhdGUgYmV0d2VlbiB0aGUgdmFyaW91cyB1bml4IG1wbXMKLSAqLwotCQkvKiBPdXIgb2xkIGJlaGF2aW91ciBoZXJlIHdhcyB0byBjb250aW51ZSBhZnRlciBhY2NlcHQoKQotCQkgKiBlcnJvcnMuICBCdXQgdGhpcyBsZWFkcyB1cyBpbnRvIGxvdHMgb2YgdHJvdWJsZXMKLQkJICogYmVjYXVzZSBtb3N0IG9mIHRoZSBlcnJvcnMgYXJlIHF1aXRlIGZhdGFsLiAgRm9yCi0JCSAqIGV4YW1wbGUsIEVNRklMRSBjYW4gYmUgY2F1c2VkIGJ5IHNsb3cgZGVzY3JpcHRvcgotCQkgKiBsZWFrcyAoc2F5IGluIGEgM3JkIHBhcnR5IG1vZHVsZSwgb3IgbGliYykuICBJdCdzCi0JCSAqIGZvb2xpc2ggZm9yIHVzIHRvIGNvbnRpbnVlIGFmdGVyIGFuIEVNRklMRS4gIFdlIGFsc28KLQkJICogc2VlbSB0byB0aWNrbGUga2VybmVsIGJ1Z3Mgb24gc29tZSBwbGF0Zm9ybXMgd2hpY2gKLQkJICogbGVhZCB0byBuZXZlci1lbmRpbmcgbG9vcHMgaGVyZS4gIFNvIGl0IHNlZW1zIGJlc3QKLQkJICogdG8ganVzdCBleGl0IGluIG1vc3QgY2FzZXMuCi0JCSAqLwotICAgICAgICAgICAgICAgIHN3aXRjaCAoZXJybm8pIHsKLSNpZmRlZiBFUFJPVE8KLQkJICAgIC8qIEVQUk9UTyBvbiBjZXJ0YWluIG9sZGVyIGtlcm5lbHMgcmVhbGx5IG1lYW5zCi0JCSAgICAgKiBFQ09OTkFCT1JURUQsIHNvIHdlIG5lZWQgdG8gaWdub3JlIGl0IGZvciB0aGVtLgotCQkgICAgICogU2VlIGRpc2N1c3Npb24gaW4gbmV3LWh0dHBkIGFyY2hpdmVzIG5oLjk3MDEKLQkJICAgICAqIHNlYXJjaCBmb3IgRVBST1RPLgotCQkgICAgICoKLQkJICAgICAqIEFsc28gc2VlIG5oLjk2MDMsIHNlYXJjaCBmb3IgRVBST1RPOgotCQkgICAgICogVGhlcmUgaXMgcG90ZW50aWFsbHkgYSBidWcgaW4gU29sYXJpcyAyLnggeDw2LAotCQkgICAgICogYW5kIG90aGVyIGJveGVzIHRoYXQgaW1wbGVtZW50IHRjcCBzb2NrZXRzIGluCi0JCSAgICAgKiB1c2VybGFuZCAoaS5lLiBvbiB0b3Agb2YgU1RSRUFNUykuICBPbiB0aGVzZQotCQkgICAgICogc3lzdGVtcywgRVBST1RPIGNhbiBhY3R1YWxseSByZXN1bHQgaW4gYSBmYXRhbAotCQkgICAgICogbG9vcC4gIFNlZSBQUiM5ODEgZm9yIGV4YW1wbGUuICBJdCdzIGhhcmQgdG8KLQkJICAgICAqIGhhbmRsZSBib3RoIHVzZXMgb2YgRVBST1RPLgotCQkgICAgICovCi0gICAgICAgICAgICAgICAgY2FzZSBFUFJPVE86Ci0jZW5kaWYKLSNpZmRlZiBFQ09OTkFCT1JURUQKLSAgICAgICAgICAgICAgICBjYXNlIEVDT05OQUJPUlRFRDoKLSNlbmRpZgotCQkgICAgLyogTGludXggZ2VuZXJhdGVzIHRoZSByZXN0IG9mIHRoZXNlLCBvdGhlciB0Y3AKLQkJICAgICAqIHN0YWNrcyAoaS5lLiBic2QpIHRlbmQgdG8gaGlkZSB0aGVtIGJlaGluZAotCQkgICAgICogZ2V0c29ja29wdCgpIGludGVyZmFjZXMuICBUaGV5IG9jY3VyIHdoZW4KLQkJICAgICAqIHRoZSBuZXQgZ29lcyBzb3VyIG9yIHRoZSBjbGllbnQgZGlzY29ubmVjdHMKLQkJICAgICAqIGFmdGVyIHRoZSB0aHJlZS13YXkgaGFuZHNoYWtlIGhhcyBiZWVuIGRvbmUKLQkJICAgICAqIGluIHRoZSBrZXJuZWwgYnV0IGJlZm9yZSB1c2VybGFuZCBoYXMgcGlja2VkCi0JCSAgICAgKiB1cCB0aGUgc29ja2V0LgotCQkgICAgICovCi0jaWZkZWYgRUNPTk5SRVNFVAotICAgICAgICAgICAgICAgIGNhc2UgRUNPTk5SRVNFVDoKLSNlbmRpZgotI2lmZGVmIEVUSU1FRE9VVAotICAgICAgICAgICAgICAgIGNhc2UgRVRJTUVET1VUOgotI2VuZGlmCi0jaWZkZWYgRUhPU1RVTlJFQUNICi0JCWNhc2UgRUhPU1RVTlJFQUNIOgotI2VuZGlmCi0jaWZkZWYgRU5FVFVOUkVBQ0gKLQkJY2FzZSBFTkVUVU5SRUFDSDoKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSNpZmRlZiBFTkVURE9XTgotCQljYXNlIEVORVRET1dOOgotCQkgICAgIC8qCi0JCSAgICAgICogV2hlbiB0aGUgbmV0d29yayBsYXllciBoYXMgYmVlbiBzaHV0IGRvd24sIHRoZXJlCi0JCSAgICAgICogaXMgbm90IG11Y2ggdXNlIGluIHNpbXBseSBleGl0aW5nOiB0aGUgcGFyZW50Ci0JCSAgICAgICogd291bGQgc2ltcGx5IHJlLWNyZWF0ZSB1cyAoYW5kIHdlJ2QgZmFpbCBhZ2FpbikuCi0JCSAgICAgICogVXNlIHRoZSBDSElMREZBVEFMIGNvZGUgdG8gdGVhciB0aGUgc2VydmVyIGRvd24uCi0JCSAgICAgICogQEBAIE1hcnRpbidzIGlkZWEgZm9yIHBvc3NpYmxlIGltcHJvdmVtZW50OgotCQkgICAgICAqIEEgZGlmZmVyZW50IGFwcHJvYWNoIHdvdWxkIGJlIHRvIGRlZmluZQotCQkgICAgICAqIGEgbmV3IEFQRVhJVF9ORVRET1dOIGV4aXQgY29kZSwgdGhlIHJlY2VwdGlvbgotCQkgICAgICAqIG9mIHdoaWNoIHdvdWxkIG1ha2UgdGhlIHBhcmVudCBzaHV0ZG93biBhbGwKLQkJICAgICAgKiBjaGlsZHJlbiwgdGhlbiBpZGxlLWxvb3AgdW50aWwgaXQgZGV0ZWN0ZWQgdGhhdAotCQkgICAgICAqIHRoZSBuZXR3b3JrIGlzIHVwIGFnYWluLCBhbmQgcmVzdGFydCB0aGUgY2hpbGRyZW4uCi0JCSAgICAgICogQmVuIEh5ZGUgbm90ZWQgdGhhdCB0ZW1wb3JhcnkgRU5FVERPV04gc2l0dWF0aW9ucwotCQkgICAgICAqIG9jY3VyIGluIG1vYmlsZSBJUC4KLQkJICAgICAgKi8KLQkJICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FTUVSRywgZXJybm8sIHNlcnZlcl9jb25mLAotCQkJImFjY2VwdDogZ2l2aW5nIHVwLiIpOwotCQkgICAgY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0jZW5kaWYgLypFTkVURE9XTiovCi0KLSNpZmRlZiBUUEYKLQkJY2FzZSBFSU5BQ1Q6Ci0JCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwKLQkJCSJvZmZsb2FkIGRldmljZSBpbmFjdGl2ZSIpOwotCQkgICAgY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0JCSAgICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgc2VydmVyX2NvbmYsCi0JCQkic2VsZWN0L2FjY2VwdCBlcnJvciAoJXUpIiwgZXJybm8pOwotCQkgICAgY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0jZWxzZQotCQlkZWZhdWx0OgotCQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHNlcnZlcl9jb25mLAotCQkJCSJhY2NlcHQ6IChjbGllbnQgc29ja2V0KSIpOwotCQkgICAgY2xlYW5fY2hpbGRfZXhpdCgxKTsKLSNlbmRpZgotCQl9Ci0JICAgIH0KLQotCSAgICBpZiAoYXBfZ3JhY2VmdWxfc3RvcF9zaWduYWxsZWQoKSkgewotCQljbGVhbl9jaGlsZF9leGl0KDApOwotCSAgICB9Ci0JICAgIHVzcjFfanVzdF9kaWUgPSAxOwotCX0KLQotCVNBRkVfQUNDRVBUKGFjY2VwdF9tdXRleF9vZmYoKSk7CS8qIHVubG9jayBhZnRlciAiYWNjZXB0IiAqLwotCi0jaWZkZWYgVFBGCi0JaWYgKGNzZCA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgLyogMCBpcyBpbnZhbGlkIHNvY2tldCBmb3IgVFBGICovCi0JICAgIGNvbnRpbnVlOwotI2VuZGlmCi0KLQkvKiBXZSd2ZSBnb3QgYSBzb2NrZXQsIGxldCdzIGF0IGxlYXN0IHByb2Nlc3Mgb25lIHJlcXVlc3Qgb2ZmIHRoZQotCSAqIHNvY2tldCBiZWZvcmUgd2UgYWNjZXB0IGEgZ3JhY2VmdWwgcmVzdGFydCByZXF1ZXN0LiAgV2Ugc2V0Ci0JICogdGhlIHNpZ25hbCB0byBpZ25vcmUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGRpc3R1cmIgYW55Ci0JICogdGhpcmQgcGFydHkgY29kZS4KLQkgKi8KLQlzaWduYWwoU0lHVVNSMSwgU0lHX0lHTik7Ci0KLQkvKgotCSAqIFdlIG5vdyBoYXZlIGEgY29ubmVjdGlvbiwgc28gc2V0IGl0IHVwIHdpdGggdGhlIGFwcHJvcHJpYXRlCi0JICogc29ja2V0IG9wdGlvbnMsIGZpbGUgZGVzY3JpcHRvcnMsIGFuZCByZWFkL3dyaXRlIGJ1ZmZlcnMuCi0JICovCi0KLSAgICAgICAgYXBfZ2V0X29zX3NvY2soJnNvY2tkZXMsIGNzZCk7Ci0KLQljbGVuID0gc2l6ZW9mKHNhX3NlcnZlcik7Ci0JaWYgKGdldHNvY2tuYW1lKHNvY2tkZXMsICZzYV9zZXJ2ZXIsICZjbGVuKSA8IDApIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHNlcnZlcl9jb25mLCAiZ2V0c29ja25hbWUiKTsKLQkgICAgYXBfY2xvc2Vfc29ja2V0KGNzZCk7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotCXNvY2tfZGlzYWJsZV9uYWdsZShzb2NrZGVzKTsKLQotCWlvbCA9IHVuaXhfYXR0YWNoX3NvY2tldChjc2QpOwotCWlmIChpb2wgPT0gTlVMTCkgewotCSAgICBpZiAoZXJybm8gPT0gRUJBREYpIHsKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfV0FSTklORywgMCwgTlVMTCwKLQkJICAgICJmaWxlZGVzY3JpcHRvciAoJXUpIGxhcmdlciB0aGFuIEZEX1NFVFNJWkUgKCV1KSAiCi0JCSAgICAiZm91bmQsIHlvdSBwcm9iYWJseSBuZWVkIHRvIHJlYnVpbGQgQXBhY2hlIHdpdGggYSAiCi0JCSAgICAibGFyZ2VyIEZEX1NFVFNJWkUiLCBzb2NrZGVzLCBGRF9TRVRTSVpFKTsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBOVUxMLAotCQkgICAgImVycm9yIGF0dGFjaGluZyB0byBzb2NrZXQiKTsKLQkgICAgfQotCSAgICBhcF9jbG9zZV9zb2NrZXQoY3NkKTsKLQkgICAgY29udGludWU7Ci0JfQotCi0JKHZvaWQpIGFwX3VwZGF0ZV9jaGlsZF9zdGF0dXMobXlfY2hpbGRfbnVtLCBTRVJWRVJfQlVTWV9SRUFELAotCQkJCSAgIChyZXF1ZXN0X3JlYyAqKSBOVUxMKTsKLQotCWNvbm5faW8gPSBhcF9iY3JlYXRlKHB0cmFucywgQl9SRFdSKTsKLQotCWFwX2JwdXNoX2lvbChjb25uX2lvLCBpb2wpOwotCi0JY3VycmVudF9jb25uID0gYXBfbmV3X2Fwcl9jb25uZWN0aW9uKHB0cmFucywgc2VydmVyX2NvbmYsIGNvbm5faW8sIGNzZCwKLQkJCQkJIG15X2NoaWxkX251bSk7Ci0KLQlhcF9wcm9jZXNzX2Nvbm5lY3Rpb24oY3VycmVudF9jb25uKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIGludCBtYWtlX2NoaWxkKHNlcnZlcl9yZWMgKnMsIGludCBzbG90LCB0aW1lX3Qgbm93KQotewotICAgIGludCBwaWQ7Ci0KLSAgICBpZiAoc2xvdCArIDEgPiBtYXhfZGFlbW9uc19saW1pdCkgewotCW1heF9kYWVtb25zX2xpbWl0ID0gc2xvdCArIDE7Ci0gICAgfQotCi0gICAgaWYgKG9uZV9wcm9jZXNzKSB7Ci0Jc2lnbmFsKFNJR0hVUCwganVzdF9kaWUpOwotCXNpZ25hbChTSUdJTlQsIGp1c3RfZGllKTsKLSNpZmRlZiBTSUdRVUlUCi0Jc2lnbmFsKFNJR1FVSVQsIFNJR19ERkwpOwotI2VuZGlmCi0Jc2lnbmFsKFNJR1RFUk0sIGp1c3RfZGllKTsKLQljaGlsZF9tYWluKHNsb3QpOwotICAgIH0KLQotICAgICh2b2lkKSBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKHNsb3QsIFNFUlZFUl9TVEFSVElORywgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotCi0KLSNpZmRlZiBfT1NEX1BPU0lYCi0gICAgLyogQlMyMDAwIHJlcXVpcmVzIGEgInNwZWNpYWwiIHZlcnNpb24gb2YgZm9yaygpIGJlZm9yZSBhIHNldHVpZCgpIGNhbGwgKi8KLSAgICBpZiAoKHBpZCA9IG9zX2ZvcmsodW5peGRfY29uZmlnLnVzZXJfbmFtZSkpID09IC0xKSB7Ci0jZWxpZiBkZWZpbmVkKFRQRikKLSAgICBpZiAoKHBpZCA9IG9zX2Zvcmsocywgc2xvdCkpID09IC0xKSB7Ci0jZWxzZQotICAgIGlmICgocGlkID0gZm9yaygpKSA9PSAtMSkgewotI2VuZGlmCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgZXJybm8sIHMsICJmb3JrOiBVbmFibGUgdG8gZm9yayBuZXcgcHJvY2VzcyIpOwotCi0JLyogZm9yayBkaWRuJ3Qgc3VjY2VlZC4gRml4IHRoZSBzY29yZWJvYXJkIG9yIGVsc2UKLQkgKiBpdCB3aWxsIHNheSBTRVJWRVJfU1RBUlRJTkcgZm9yZXZlciBhbmQgZXZlcgotCSAqLwotCSh2b2lkKSBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKHNsb3QsIFNFUlZFUl9ERUFELCAocmVxdWVzdF9yZWMgKikgTlVMTCk7Ci0KLQkvKiBJbiBjYXNlIHN5c3RlbSByZXNvdXJjZXMgYXJlIG1heHhlZCBvdXQsIHdlIGRvbid0IHdhbnQKLQkgICBBcGFjaGUgcnVubmluZyBhd2F5IHdpdGggdGhlIENQVSB0cnlpbmcgdG8gZm9yayBvdmVyIGFuZAotCSAgIG92ZXIgYW5kIG92ZXIgYWdhaW4uICovCi0Jc2xlZXAoMTApOwotCi0JcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGlmICghcGlkKSB7Ci0jaWZkZWYgQUlYX0JJTkRfUFJPQ0VTU09SCi0vKiBieSBkZWZhdWx0IEFJWCBiaW5kcyB0byBhIHNpbmdsZSBwcm9jZXNzb3IKLSAqIHRoaXMgYml0IHVuYmluZHMgY2hpbGRyZW4gd2hpY2ggd2lsbCB0aGVuIGJpbmQgdG8gYW5vdGhlciBjcHUKLSAqLwotI2luY2x1ZGUgPHN5cy9wcm9jZXNzb3IuaD4KLQlpbnQgc3RhdHVzID0gYmluZHByb2Nlc3NvcihCSU5EUFJPQ0VTUywgKGludClnZXRwaWQoKSwgCi0JCQkJICAgUFJPQ0VTU09SX0NMQVNTX0FOWSk7Ci0JaWYgKHN0YXR1cyAhPSBPSykgewotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLCBzZXJ2ZXJfY29uZiwKLQkJCSJwcm9jZXNzb3IgdW5iaW5kIGZhaWxlZCAlZCIsIHN0YXR1cyk7Ci0JfQotI2VuZGlmCi0JUkFJU0VfU0lHU1RPUChNQUtFX0NISUxEKTsKLQkvKiBEaXNhYmxlIHRoZSByZXN0YXJ0IHNpZ25hbCBoYW5kbGVycyBhbmQgZW5hYmxlIHRoZSBqdXN0X2RpZSBzdHVmZi4KLQkgKiBOb3RlIHRoYXQgc2luY2UgcmVzdGFydCgpIGp1c3Qgbm90ZXMgdGhhdCBhIHJlc3RhcnQgaGFzIGJlZW4KLQkgKiByZXF1ZXN0ZWQgdGhlcmUncyBubyByYWNlIGNvbmRpdGlvbiBoZXJlLgotCSAqLwotCXNpZ25hbChTSUdIVVAsIGp1c3RfZGllKTsKLQlzaWduYWwoU0lHVVNSMSwganVzdF9kaWUpOwotCXNpZ25hbChTSUdURVJNLCBqdXN0X2RpZSk7Ci0JY2hpbGRfbWFpbihzbG90KTsKLSAgICB9Ci0KLSAgICBhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnRbc2xvdF0ucGlkID0gcGlkOwotI2lmZGVmIFNDT1JFQk9BUkRfRklMRQotICAgIGxzZWVrKHNjb3JlYm9hcmRfZmQsIFh0T2Zmc2V0T2Yoc2NvcmVib2FyZCwgcGFyZW50W3Nsb3RdKSwgMCk7Ci0gICAgZm9yY2Vfd3JpdGUoc2NvcmVib2FyZF9mZCwgJmFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtzbG90XSwKLQkJc2l6ZW9mKHBhcmVudF9zY29yZSkpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0vKiBzdGFydCB1cCBhIGJ1bmNoIG9mIGNoaWxkcmVuICovCi1zdGF0aWMgdm9pZCBzdGFydHVwX2NoaWxkcmVuKGludCBudW1iZXJfdG9fc3RhcnQpCi17Ci0gICAgaW50IGk7Ci0gICAgdGltZV90IG5vdyA9IHRpbWUoMCk7Ci0KLSAgICBmb3IgKGkgPSAwOyBudW1iZXJfdG9fc3RhcnQgJiYgaSA8IGFwX2RhZW1vbnNfbGltaXQ7ICsraSkgewotCWlmIChhcF9zY29yZWJvYXJkX2ltYWdlLT5zZXJ2ZXJzW2ldLnN0YXR1cyAhPSBTRVJWRVJfREVBRCkgewotCSAgICBjb250aW51ZTsKLQl9Ci0JaWYgKG1ha2VfY2hpbGQoc2VydmVyX2NvbmYsIGksIG5vdykgPCAwKSB7Ci0JICAgIGJyZWFrOwotCX0KLQktLW51bWJlcl90b19zdGFydDsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIGlkbGVfc3Bhd25fcmF0ZSBpcyB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoYXQgd2lsbCBiZSBzcGF3bmVkIG9uIHRoZQotICogbmV4dCBtYWludGVuYW5jZSBjeWNsZSBpZiB0aGVyZSBhcmVuJ3QgZW5vdWdoIGlkbGUgc2VydmVycy4gIEl0IGlzCi0gKiBkb3VibGVkIHVwIHRvIE1BWF9TUEFXTl9SQVRFLCBhbmQgcmVzZXQgb25seSB3aGVuIGEgY3ljbGUgZ29lcyBieQotICogd2l0aG91dCB0aGUgbmVlZCB0byBzcGF3bi4KLSAqLwotc3RhdGljIGludCBpZGxlX3NwYXduX3JhdGUgPSAxOwotI2lmbmRlZiBNQVhfU1BBV05fUkFURQotI2RlZmluZSBNQVhfU1BBV05fUkFURQkoMzIpCi0jZW5kaWYKLXN0YXRpYyBpbnQgaG9sZF9vZmZfb25fZXhwb25lbnRpYWxfc3Bhd25pbmc7Ci0KLXN0YXRpYyB2b2lkIHBlcmZvcm1faWRsZV9zZXJ2ZXJfbWFpbnRlbmFuY2Uodm9pZCkKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgdG9fa2lsbDsKLSAgICBpbnQgaWRsZV9jb3VudDsKLSAgICBzaG9ydF9zY29yZSAqc3M7Ci0gICAgdGltZV90IG5vdyA9IHRpbWUoMCk7Ci0gICAgaW50IGZyZWVfbGVuZ3RoOwotICAgIGludCBmcmVlX3Nsb3RzW01BWF9TUEFXTl9SQVRFXTsKLSAgICBpbnQgbGFzdF9ub25fZGVhZDsKLSAgICBpbnQgdG90YWxfbm9uX2RlYWQ7Ci0KLSAgICAvKiBpbml0aWFsaXplIHRoZSBmcmVlX2xpc3QgKi8KLSAgICBmcmVlX2xlbmd0aCA9IDA7Ci0KLSAgICB0b19raWxsID0gLTE7Ci0gICAgaWRsZV9jb3VudCA9IDA7Ci0gICAgbGFzdF9ub25fZGVhZCA9IC0xOwotICAgIHRvdGFsX25vbl9kZWFkID0gMDsKLQotICAgIGFwX3N5bmNfc2NvcmVib2FyZF9pbWFnZSgpOwotICAgIGZvciAoaSA9IDA7IGkgPCBhcF9kYWVtb25zX2xpbWl0OyArK2kpIHsKLQlpbnQgc3RhdHVzOwotCi0JaWYgKGkgPj0gbWF4X2RhZW1vbnNfbGltaXQgJiYgZnJlZV9sZW5ndGggPT0gaWRsZV9zcGF3bl9yYXRlKQotCSAgICBicmVhazsKLQlzcyA9ICZhcF9zY29yZWJvYXJkX2ltYWdlLT5zZXJ2ZXJzW2ldOwotCXN0YXR1cyA9IHNzLT5zdGF0dXM7Ci0JaWYgKHN0YXR1cyA9PSBTRVJWRVJfREVBRCkgewotCSAgICAvKiB0cnkgdG8ga2VlcCBjaGlsZHJlbiBudW1iZXJzIGFzIGxvdyBhcyBwb3NzaWJsZSAqLwotCSAgICBpZiAoZnJlZV9sZW5ndGggPCBpZGxlX3NwYXduX3JhdGUpIHsKLQkJZnJlZV9zbG90c1tmcmVlX2xlbmd0aF0gPSBpOwotCQkrK2ZyZWVfbGVuZ3RoOwotCSAgICB9Ci0JfQotCWVsc2UgewotCSAgICAvKiBXZSBjb25zaWRlciBhIHN0YXJ0aW5nIHNlcnZlciBhcyBpZGxlIGJlY2F1c2Ugd2Ugc3RhcnRlZCBpdAotCSAgICAgKiBhdCBsZWFzdCBhIGN5Y2xlIGFnbywgYW5kIGlmIGl0IHN0aWxsIGhhc24ndCBmaW5pc2hlZCBzdGFydGluZwotCSAgICAgKiB0aGVuIHdlJ3JlIGp1c3QgZ29pbmcgdG8gc3dhbXAgdGhpbmdzIHdvcnNlIGJ5IGZvcmtpbmcgbW9yZS4KLQkgICAgICogU28gd2UgaG9wZWZ1bGx5IHdvbid0IG5lZWQgdG8gZm9yayBtb3JlIGlmIHdlIGNvdW50IGl0LgotCSAgICAgKiBUaGlzIGRlcGVuZHMgb24gdGhlIG9yZGVyaW5nIG9mIFNFUlZFUl9SRUFEWSBhbmQgU0VSVkVSX1NUQVJUSU5HLgotCSAgICAgKi8KLQkgICAgaWYgKHN0YXR1cyA8PSBTRVJWRVJfUkVBRFkpIHsKLQkJKysgaWRsZV9jb3VudDsKLQkJLyogYWx3YXlzIGtpbGwgdGhlIGhpZ2hlc3QgbnVtYmVyZWQgY2hpbGQgaWYgd2UgaGF2ZSB0by4uLgotCQkgKiBubyByZWFsbHkgd2VsbCB0aG91Z2h0IG91dCByZWFzb24gLi4uIG90aGVyIHRoYW4gb2JzZXJ2aW5nCi0JCSAqIHRoZSBzZXJ2ZXIgYmVoYXZpb3VyIHVuZGVyIGxpbnV4IHdoZXJlIGxvd2VyIG51bWJlcmVkIGNoaWxkcmVuCi0JCSAqIHRlbmQgdG8gc2VydmljZSBtb3JlIGhpdHMgKGFuZCBoZW5jZSBhcmUgbW9yZSBsaWtlbHkgdG8gaGF2ZQotCQkgKiB0aGVpciBkYXRhIGluIGNwdSBjYWNoZXMpLgotCQkgKi8KLQkJdG9fa2lsbCA9IGk7Ci0JICAgIH0KLQotCSAgICArK3RvdGFsX25vbl9kZWFkOwotCSAgICBsYXN0X25vbl9kZWFkID0gaTsKLQl9Ci0gICAgfQotICAgIG1heF9kYWVtb25zX2xpbWl0ID0gbGFzdF9ub25fZGVhZCArIDE7Ci0gICAgaWYgKGlkbGVfY291bnQgPiBhcF9kYWVtb25zX21heF9mcmVlKSB7Ci0JLyoga2lsbCBvZmYgb25lIGNoaWxkLi4uIHdlIHVzZSBTSUdVU1IxIGJlY2F1c2UgdGhhdCdsbCBjYXVzZSBpdCB0bwotCSAqIHNodXQgZG93biBncmFjZWZ1bGx5LCBpbiBjYXNlIGl0IGhhcHBlbmVkIHRvIHBpY2sgdXAgYSByZXF1ZXN0Ci0JICogd2hpbGUgd2Ugd2VyZSBjb3VudGluZwotCSAqLwotCWtpbGwoYXBfc2NvcmVib2FyZF9pbWFnZS0+cGFyZW50W3RvX2tpbGxdLnBpZCwgU0lHVVNSMSk7Ci0JaWRsZV9zcGF3bl9yYXRlID0gMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaWRsZV9jb3VudCA8IGFwX2RhZW1vbnNfbWluX2ZyZWUpIHsKLQkvKiB0ZXJtaW5hdGUgdGhlIGZyZWUgbGlzdCAqLwotCWlmIChmcmVlX2xlbmd0aCA9PSAwKSB7Ci0JICAgIC8qIG9ubHkgcmVwb3J0IHRoaXMgY29uZGl0aW9uIG9uY2UgKi8KLQkgICAgc3RhdGljIGludCByZXBvcnRlZCA9IDA7Ci0KLQkgICAgaWYgKCFyZXBvcnRlZCkgewotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIHNlcnZlcl9jb25mLAotCQkJICAgICJzZXJ2ZXIgcmVhY2hlZCBNYXhDbGllbnRzIHNldHRpbmcsIGNvbnNpZGVyIgotCQkJICAgICIgcmFpc2luZyB0aGUgTWF4Q2xpZW50cyBzZXR0aW5nIik7Ci0JCXJlcG9ydGVkID0gMTsKLQkgICAgfQotCSAgICBpZGxlX3NwYXduX3JhdGUgPSAxOwotCX0KLQllbHNlIHsKLQkgICAgaWYgKGlkbGVfc3Bhd25fcmF0ZSA+PSA4KSB7Ci0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0lORk8sIDAsIHNlcnZlcl9jb25mLAotCQkgICAgInNlcnZlciBzZWVtcyBidXN5LCAoeW91IG1heSBuZWVkICIKLQkJICAgICJ0byBpbmNyZWFzZSBTdGFydFNlcnZlcnMsIG9yIE1pbi9NYXhTcGFyZVNlcnZlcnMpLCAiCi0JCSAgICAic3Bhd25pbmcgJWQgY2hpbGRyZW4sIHRoZXJlIGFyZSAlZCBpZGxlLCBhbmQgIgotCQkgICAgIiVkIHRvdGFsIGNoaWxkcmVuIiwgaWRsZV9zcGF3bl9yYXRlLAotCQkgICAgaWRsZV9jb3VudCwgdG90YWxfbm9uX2RlYWQpOwotCSAgICB9Ci0JICAgIGZvciAoaSA9IDA7IGkgPCBmcmVlX2xlbmd0aDsgKytpKSB7Ci0jaWZkZWYgVFBGCi0gICAgICAgIGlmKG1ha2VfY2hpbGQoc2VydmVyX2NvbmYsIGZyZWVfc2xvdHNbaV0sIG5vdykgPT0gLTEpIHsKLSAgICAgICAgICAgIGlmKGZyZWVfbGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgICAgICBzaHV0ZG93bl9wZW5kaW5nID0gMTsKLSAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRU1FUkcsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICJObyBhY3RpdmUgY2hpbGQgcHJvY2Vzc2VzOiBzaHV0dGluZyBkb3duIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSNlbHNlCi0JCW1ha2VfY2hpbGQoc2VydmVyX2NvbmYsIGZyZWVfc2xvdHNbaV0sIG5vdyk7Ci0jZW5kaWYgLyogVFBGICovCi0JICAgIH0KLQkgICAgLyogdGhlIG5leHQgdGltZSBhcm91bmQgd2Ugd2FudCB0byBzcGF3biB0d2ljZSBhcyBtYW55IGlmIHRoaXMKLQkgICAgICogd2Fzbid0IGdvb2QgZW5vdWdoLCBidXQgbm90IGlmIHdlJ3ZlIGp1c3QgZG9uZSBhIGdyYWNlZnVsCi0JICAgICAqLwotCSAgICBpZiAoaG9sZF9vZmZfb25fZXhwb25lbnRpYWxfc3Bhd25pbmcpIHsKLQkJLS1ob2xkX29mZl9vbl9leHBvbmVudGlhbF9zcGF3bmluZzsKLQkgICAgfQotCSAgICBlbHNlIGlmIChpZGxlX3NwYXduX3JhdGUgPCBNQVhfU1BBV05fUkFURSkgewotCQlpZGxlX3NwYXduX3JhdGUgKj0gMjsKLQkgICAgfQotCX0KLSAgICB9Ci0gICAgZWxzZSB7Ci0JaWRsZV9zcGF3bl9yYXRlID0gMTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQgcHJvY2Vzc19jaGlsZF9zdGF0dXMoaW50IHBpZCwgYXBfd2FpdF90IHN0YXR1cykKLXsKLSAgICAvKiBDaGlsZCBkaWVkLi4uIGlmIGl0IGRpZWQgZHVlIHRvIGEgZmF0YWwgZXJyb3IsCi0JKiB3ZSBzaG91bGQgc2ltcGx5IGJhaWwgb3V0LgotCSovCi0gICAgaWYgKChXSUZFWElURUQoc3RhdHVzKSkgJiYKLQlXRVhJVFNUQVRVUyhzdGF0dXMpID09IEFQRVhJVF9DSElMREZBVEFMKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJUfEFQTE9HX05PRVJSTk8sIDAsIHNlcnZlcl9jb25mLAotCQkJIkNoaWxkICVkIHJldHVybmVkIGEgRmF0YWwgZXJyb3IuLi4gXG4iCi0JCQkiQXBhY2hlIGlzIGV4aXRpbmchIiwKLQkJCXBpZCk7Ci0JZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotICAgIGlmIChXSUZTSUdOQUxFRChzdGF0dXMpKSB7Ci0Jc3dpdGNoIChXVEVSTVNJRyhzdGF0dXMpKSB7Ci0JY2FzZSBTSUdURVJNOgotCWNhc2UgU0lHSFVQOgotCWNhc2UgU0lHVVNSMToKLQljYXNlIFNJR0tJTEw6Ci0JICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0jaWZkZWYgU1lTX1NJR0xJU1QKLSNpZmRlZiBXQ09SRURVTVAKLQkgICAgaWYgKFdDT1JFRFVNUChzdGF0dXMpKSB7Ci0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwKLQkJCSAgICAgMCwgc2VydmVyX2NvbmYsCi0JCQkgICAgICJjaGlsZCBwaWQgJWQgZXhpdCBzaWduYWwgJXMgKCVkKSwgIgotCQkJICAgICAicG9zc2libGUgY29yZWR1bXAgaW4gJXMiLAotCQkJICAgICBwaWQsIChXVEVSTVNJRyhzdGF0dXMpID49IE51bVNJRykgPyAiIiA6IAotCQkJICAgICBTWVNfU0lHTElTVFtXVEVSTVNJRyhzdGF0dXMpXSwgV1RFUk1TSUcoc3RhdHVzKSwKLQkJCSAgICAgYXBfY29yZWR1bXBfZGlyKTsKLQkgICAgfQotCSAgICBlbHNlIHsKLSNlbmRpZgotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19OT1RJQ0UsCi0JCQkgICAgIDAsIHNlcnZlcl9jb25mLAotCQkJICAgICAiY2hpbGQgcGlkICVkIGV4aXQgc2lnbmFsICVzICglZCkiLCBwaWQsCi0JCQkgICAgIFNZU19TSUdMSVNUW1dURVJNU0lHKHN0YXR1cyldLCBXVEVSTVNJRyhzdGF0dXMpKTsKLSNpZmRlZiBXQ09SRURVTVAKLQkgICAgfQotI2VuZGlmCi0jZWxzZQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19OT1RJQ0UsCi0JCQkgc2VydmVyX2NvbmYsCi0JCQkgImNoaWxkIHBpZCAlZCBleGl0IHNpZ25hbCAlZCIsCi0JCQkgcGlkLCBXVEVSTVNJRyhzdGF0dXMpKTsKLSNlbmRpZgotCX0KLSAgICB9Ci19Ci0KLQotc3RhdGljIGludCBzZXR1cF9saXN0ZW5lcnMoc2VydmVyX3JlYyAqcykKLXsKLSAgICBhcF9saXN0ZW5fcmVjICpscjsKLSAgICBpbnQgc29ja2RlczsKLQotICAgIGlmIChhcF9saXN0ZW5fb3BlbihzLT5wcm9jZXNzLCBzLT5wb3J0KSkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0FMRVJULCAwLCBzLAotCQkgICAgIm5vIGxpc3RlbmluZyBzb2NrZXRzIGF2YWlsYWJsZSwgc2h1dHRpbmcgZG93biIpOwotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBsaXN0ZW5tYXhmZCA9IC0xOwotICAgIEZEX1pFUk8oJmxpc3RlbmZkcyk7Ci0gICAgZm9yIChsciA9IGFwX2xpc3RlbmVyczsgbHI7IGxyID0gbHItPm5leHQpIHsKLSAgICAgICAgYXBfZ2V0X29zX3NvY2soJnNvY2tkZXMsIGxyLT5zZCk7Ci0JRkRfU0VUKHNvY2tkZXMsICZsaXN0ZW5mZHMpOwotCWlmIChzb2NrZGVzID4gbGlzdGVubWF4ZmQpIHsKLQkgICAgbGlzdGVubWF4ZmQgPSBzb2NrZGVzOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBFeGVjdXRpdmUgcm91dGluZXMuCi0gKi8KLQotaW50IGFwX21wbV9ydW4oYXBfY29udGV4dF90ICpfcGNvbmYsIGFwX2NvbnRleHRfdCAqcGxvZywgc2VydmVyX3JlYyAqcykKLXsKLSAgICBpbnQgcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0OwotCi0gICAgcGNvbmYgPSBfcGNvbmY7Ci0KLSAgICBzZXJ2ZXJfY29uZiA9IHM7Ci0gCi0gICAgYXBfbG9nX3BpZChwY29uZiwgYXBfcGlkX2ZuYW1lKTsKLQotICAgIGlmIChzZXR1cF9saXN0ZW5lcnMocykpIHsKLQkvKiBYWFg6IGhleSwgd2hhdCdzIHRoZSByaWdodCB3YXkgZm9yIHRoZSBtcG0gdG8gaW5kaWNhdGUgYSBmYXRhbCBlcnJvcj8gKi8KLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBTQUZFX0FDQ0VQVChhY2NlcHRfbXV0ZXhfaW5pdChwY29uZikpOwotICAgIGlmICghaXNfZ3JhY2VmdWwpIHsKLQlyZWluaXRfc2NvcmVib2FyZChwY29uZik7Ci0gICAgfQotI2lmZGVmIFNDT1JFQk9BUkRfRklMRQotICAgIGVsc2UgewotCWFwX3Njb3JlYm9hcmRfZm5hbWUgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShwY29uZiwgYXBfc2NvcmVib2FyZF9mbmFtZSk7Ci0JYXBfbm90ZV9jbGVhbnVwc19mb3JfZmQocGNvbmYsIHNjb3JlYm9hcmRfZmQpOwotICAgIH0KLSNlbmRpZgotCi0gICAgc2V0X3NpZ25hbHMoKTsKLQotICAgIGlmIChhcF9kYWVtb25zX21heF9mcmVlIDwgYXBfZGFlbW9uc19taW5fZnJlZSArIDEpCS8qIERvbid0IHRocmFzaC4uLiAqLwotCWFwX2RhZW1vbnNfbWF4X2ZyZWUgPSBhcF9kYWVtb25zX21pbl9mcmVlICsgMTsKLQotICAgIC8qIElmIHdlJ3JlIGRvaW5nIGEgZ3JhY2VmdWxfcmVzdGFydCB0aGVuIHdlJ3JlIGdvaW5nIHRvIHNlZSBhIGxvdAotCSogb2YgY2hpbGRyZW4gZXhpdGluZyBpbW1lZGlhdGVseSB3aGVuIHdlIGdldCBpbnRvIHRoZSBtYWluIGxvb3AKLQkqIGJlbG93IChiZWNhdXNlIHdlIGp1c3Qgc2VudCB0aGVtIFNJR1VTUjEpLiAgVGhpcyBoYXBwZW5zIHByZXR0eQotCSogcmFwaWRseS4uLiBhbmQgZm9yIGVhY2ggb25lIHRoYXQgZXhpdHMgd2UnbGwgc3RhcnQgYSBuZXcgb25lIHVudGlsCi0JKiB3ZSByZWFjaCBhdCBsZWFzdCBkYWVtb25zX21pbl9mcmVlLiAgQnV0IHdlIG1heSBiZSBwZXJtaXR0ZWQgdG8KLQkqIHN0YXJ0IG1vcmUgdGhhbiB0aGF0LCBzbyB3ZSdsbCBqdXN0IGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgd2UncmUKLQkqIHN1cHBvc2VkIHRvIHN0YXJ0IHVwIHdpdGhvdXQgdGhlIDEgc2Vjb25kIHBlbmFsdHkgYmV0d2VlbiBlYWNoIGZvcmsuCi0JKi8KLSAgICByZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQgPSBhcF9kYWVtb25zX3RvX3N0YXJ0OwotICAgIGlmIChyZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQgPiBhcF9kYWVtb25zX2xpbWl0KSB7Ci0JcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0ID0gYXBfZGFlbW9uc19saW1pdDsKLSAgICB9Ci0gICAgaWYgKCFpc19ncmFjZWZ1bCkgewotCXN0YXJ0dXBfY2hpbGRyZW4ocmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0KTsKLQlyZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQgPSAwOwotICAgIH0KLSAgICBlbHNlIHsKLQkvKiBnaXZlIHRoZSBzeXN0ZW0gc29tZSB0aW1lIHRvIHJlY292ZXIgYmVmb3JlIGtpY2tpbmcgaW50bwotCSAgICAqIGV4cG9uZW50aWFsIG1vZGUgKi8KLQlob2xkX29mZl9vbl9leHBvbmVudGlhbF9zcGF3bmluZyA9IDEwOwotICAgIH0KLQotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwgMCwgc2VydmVyX2NvbmYsCi0JCSIlcyBjb25maWd1cmVkIC0tIHJlc3VtaW5nIG5vcm1hbCBvcGVyYXRpb25zIiwKLQkJYXBfZ2V0X3NlcnZlcl92ZXJzaW9uKCkpOwotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0lORk8sIDAsIHNlcnZlcl9jb25mLAotCQkiU2VydmVyIGJ1aWx0OiAlcyIsIGFwX2dldF9zZXJ2ZXJfYnVpbHQoKSk7Ci0gICAgcmVzdGFydF9wZW5kaW5nID0gc2h1dGRvd25fcGVuZGluZyA9IDA7Ci0KLSAgICB3aGlsZSAoIXJlc3RhcnRfcGVuZGluZyAmJiAhc2h1dGRvd25fcGVuZGluZykgewotCWludCBjaGlsZF9zbG90OwotCWFwX3dhaXRfdCBzdGF0dXM7Ci0JaW50IHBpZCA9IHdhaXRfb3JfdGltZW91dCgmc3RhdHVzKTsKLQotCS8qIFhYWDogaWYgaXQgdGFrZXMgbG9uZ2VyIHRoYW4gMSBzZWNvbmQgZm9yIGFsbCBvdXIgY2hpbGRyZW4KLQkgKiB0byBzdGFydCB1cCBhbmQgZ2V0IGludG8gSURMRSBzdGF0ZSB0aGVuIHdlIG1heSBzcGF3biBhbgotCSAqIGV4dHJhIGNoaWxkCi0JICovCi0JaWYgKHBpZCA+PSAwKSB7Ci0JICAgIHByb2Nlc3NfY2hpbGRfc3RhdHVzKHBpZCwgc3RhdHVzKTsKLQkgICAgLyogbm9uLWZhdGFsIGRlYXRoLi4uIG5vdGUgdGhhdCBpdCdzIGdvbmUgaW4gdGhlIHNjb3JlYm9hcmQuICovCi0JICAgIGFwX3N5bmNfc2NvcmVib2FyZF9pbWFnZSgpOwotCSAgICBjaGlsZF9zbG90ID0gZmluZF9jaGlsZF9ieV9waWQocGlkKTsKLQkgICAgaWYgKGNoaWxkX3Nsb3QgPj0gMCkgewotCQkodm9pZCkgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhjaGlsZF9zbG90LCBTRVJWRVJfREVBRCwKLQkJCQkJICAgIChyZXF1ZXN0X3JlYyAqKSBOVUxMKTsKLQkJaWYgKHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydAotCQkgICAgJiYgY2hpbGRfc2xvdCA8IGFwX2RhZW1vbnNfbGltaXQpIHsKLQkJICAgIC8qIHdlJ3JlIHN0aWxsIGRvaW5nIGEgMS1mb3ItMSByZXBsYWNlbWVudCBvZiBkZWFkCi0JCQkqIGNoaWxkcmVuIHdpdGggbmV3IGNoaWxkcmVuCi0JCQkqLwotCQkgICAgbWFrZV9jaGlsZChzZXJ2ZXJfY29uZiwgY2hpbGRfc2xvdCwgdGltZSgwKSk7Ci0JCSAgICAtLXJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydDsKLQkJfQotI2lmZGVmIEhBU19PVEhFUl9DSElMRAotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHJlYXBfb3RoZXJfY2hpbGQocGlkLCBzdGF0dXMpID09IDApIHsKLQkJLyogaGFuZGxlZCAqLwotI2VuZGlmCi0JICAgIH0KLQkgICAgZWxzZSBpZiAoaXNfZ3JhY2VmdWwpIHsKLQkJLyogR3JlYXQsIHdlJ3ZlIHByb2JhYmx5IGp1c3QgbG9zdCBhIHNsb3QgaW4gdGhlCi0JCSAgICAqIHNjb3JlYm9hcmQuICBTb21laG93IHdlIGRvbid0IGtub3cgYWJvdXQgdGhpcwotCQkgICAgKiBjaGlsZC4KLQkJICAgICovCi0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX1dBUk5JTkcsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHNlcnZlcl9jb25mLAotCQkJICAgICJsb25nIGxvc3QgY2hpbGQgY2FtZSBob21lISAocGlkICVkKSIsIHBpZCk7Ci0JICAgIH0KLQkgICAgLyogRG9uJ3QgcGVyZm9ybSBpZGxlIG1haW50ZW5hbmNlIHdoZW4gYSBjaGlsZCBkaWVzLAotCQkqIG9ubHkgZG8gaXQgd2hlbiB0aGVyZSdzIGEgdGltZW91dC4gIFJlbWVtYmVyIG9ubHkgYQotCQkqIGZpbml0ZSBudW1iZXIgb2YgY2hpbGRyZW4gY2FuIGRpZSwgYW5kIGl0J3MgcHJldHR5Ci0JCSogcGF0aG9sb2dpY2FsIGZvciBhIGxvdCB0byBkaWUgc3VkZGVubHkuCi0JCSovCi0JICAgIGNvbnRpbnVlOwotCX0KLQllbHNlIGlmIChyZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQpIHsKLQkgICAgLyogd2UgaGl0IGEgMSBzZWNvbmQgdGltZW91dCBpbiB3aGljaCBub25lIG9mIHRoZSBwcmV2aW91cwotCQkqIGdlbmVyYXRpb24gb2YgY2hpbGRyZW4gbmVlZGVkIHRvIGJlIHJlYXBlZC4uLiBzbyBhc3N1bWUKLQkJKiB0aGV5J3JlIGFsbCBkb25lLCBhbmQgcGljayB1cCB0aGUgc2xhY2sgaWYgYW55IGlzIGxlZnQuCi0JCSovCi0JICAgIHN0YXJ0dXBfY2hpbGRyZW4ocmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0KTsKLQkgICAgcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0ID0gMDsKLQkgICAgLyogSW4gYW55IGV2ZW50IHdlIHJlYWxseSBzaG91bGRuJ3QgZG8gdGhlIGNvZGUgYmVsb3cgYmVjYXVzZQotCQkqIGZldyBvZiB0aGUgc2VydmVycyB3ZSBqdXN0IHN0YXJ0ZWQgYXJlIGluIHRoZSBJRExFIHN0YXRlCi0JCSogeWV0LCBzbyB3ZSdkIG1pc3Rha2VubHkgY3JlYXRlIGFuIGV4dHJhIHNlcnZlci4KLQkJKi8KLQkgICAgY29udGludWU7Ci0JfQotCi0JcGVyZm9ybV9pZGxlX3NlcnZlcl9tYWludGVuYW5jZSgpOwotI2lmZGVmIFRQRgotICAgIHNodXRkb3duX3BlbmRpbmcgPSBvc19jaGVja19zZXJ2ZXIodHBmX3NlcnZlcl9uYW1lKTsKLSAgICBhcF9jaGVja19zaWduYWxzKCk7Ci0gICAgc2xlZXAoMSk7Ci0jZW5kaWYgLypUUEYgKi8KLSAgICB9Ci0KLSAgICBpZiAoc2h1dGRvd25fcGVuZGluZykgewotCS8qIFRpbWUgdG8gZ3JhY2VmdWxseSBzaHV0IGRvd246Ci0JICogS2lsbCBjaGlsZCBwcm9jZXNzZXMsIHRlbGwgdGhlbSB0byBjYWxsIGNoaWxkX2V4aXQsIGV0Yy4uLgotCSAqLwotCWlmICh1bml4ZF9raWxscGcoZ2V0cGdycCgpLCBTSUdURVJNKSA8IDApIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgImtpbGxwZyBTSUdURVJNIik7Ci0JfQotCXJlY2xhaW1fY2hpbGRfcHJvY2Vzc2VzKDEpOwkJLyogU3RhcnQgd2l0aCBTSUdURVJNICovCi0KLQkvKiBjbGVhbnVwIHBpZCBmaWxlIG9uIG5vcm1hbCBzaHV0ZG93biAqLwotCXsKLQkgICAgY29uc3QgY2hhciAqcGlkZmlsZSA9IE5VTEw7Ci0JICAgIHBpZGZpbGUgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZSAocGNvbmYsIGFwX3BpZF9mbmFtZSk7Ci0JICAgIGlmICggcGlkZmlsZSAhPSBOVUxMICYmIHVubGluayhwaWRmaWxlKSA9PSAwKQotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19JTkZPLAotCQkJCTAsIHNlcnZlcl9jb25mLAotCQkJCSJyZW1vdmVkIFBJRCBmaWxlICVzIChwaWQ9JWxkKSIsCi0JCQkJcGlkZmlsZSwgKGxvbmcpZ2V0cGlkKCkpOwotCX0KLQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwgMCwgc2VydmVyX2NvbmYsCi0JCSAgICAiY2F1Z2h0IFNJR1RFUk0sIHNodXR0aW5nIGRvd24iKTsKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiB3ZSd2ZSBiZWVuIHRvbGQgdG8gcmVzdGFydCAqLwotICAgIHNpZ25hbChTSUdIVVAsIFNJR19JR04pOwotICAgIHNpZ25hbChTSUdVU1IxLCBTSUdfSUdOKTsKLQotICAgIGlmIChvbmVfcHJvY2VzcykgewotCS8qIG5vdCB3b3J0aCB0aGlua2luZyBhYm91dCAqLwotCXJldHVybiAxOwotICAgIH0KLQotICAgIC8qIGFkdmFuY2UgdG8gdGhlIG5leHQgZ2VuZXJhdGlvbiAqLwotICAgIC8qIFhYWDogd2UgcmVhbGx5IG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgbmV3IGdlbmVyYXRpb24gbnVtYmVyIGlzbid0IGluCi0gICAgICogdXNlIGJ5IGFueSBvZiB0aGUgY2hpbGRyZW4uCi0gICAgICovCi0gICAgKythcF9teV9nZW5lcmF0aW9uOwotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbC5ydW5uaW5nX2dlbmVyYXRpb24gPSBhcF9teV9nZW5lcmF0aW9uOwotICAgIHVwZGF0ZV9zY29yZWJvYXJkX2dsb2JhbCgpOwotCi0gICAgaWYgKGlzX2dyYWNlZnVsKSB7Ci0jaWZuZGVmIFNDT1JFQk9BUkRfRklMRQotCWludCBpOwotI2VuZGlmCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCAwLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJTSUdVU1IxIHJlY2VpdmVkLiAgRG9pbmcgZ3JhY2VmdWwgcmVzdGFydCIpOwotCi0JLyoga2lsbCBvZmYgdGhlIGlkbGUgb25lcyAqLwotCWlmICh1bml4ZF9raWxscGcoZ2V0cGdycCgpLCBTSUdVU1IxKSA8IDApIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgImtpbGxwZyBTSUdVU1IxIik7Ci0JfQotI2lmbmRlZiBTQ09SRUJPQVJEX0ZJTEUKLQkvKiBUaGlzIGlzIG1vc3RseSBmb3IgZGVidWdnaW5nLi4uIHNvIHRoYXQgd2Uga25vdyB3aGF0IGlzIHN0aWxsCi0JICAgICogZ3JhY2VmdWxseSBkZWFsaW5nIHdpdGggZXhpc3RpbmcgcmVxdWVzdC4gIEJ1dCB3ZSBjYW4ndCByZWFsbHkKLQkgICAgKiBkbyBpdCBpZiB3ZSdyZSBpbiBhIFNDT1JFQk9BUkRfRklMRSBiZWNhdXNlIGl0J2xsIGNhdXNlCi0JICAgICogY29ycnVwdGlvbiB0b28gZWFzaWx5LgotCSAgICAqLwotCWFwX3N5bmNfc2NvcmVib2FyZF9pbWFnZSgpOwotCWZvciAoaSA9IDA7IGkgPCBhcF9kYWVtb25zX2xpbWl0OyArK2kpIHsKLQkgICAgaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbaV0uc3RhdHVzICE9IFNFUlZFUl9ERUFEKSB7Ci0JCWFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbaV0uc3RhdHVzID0gU0VSVkVSX0dSQUNFRlVMOwotCSAgICB9Ci0JfQotI2VuZGlmCi0gICAgfQotICAgIGVsc2UgewotCS8qIEtpbGwgJ2VtIG9mZiAqLwotCWlmICh1bml4ZF9raWxscGcoZ2V0cGdycCgpLCBTSUdIVVApIDwgMCkgewotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLCAia2lsbHBnIFNJR0hVUCIpOwotCX0KLQlyZWNsYWltX2NoaWxkX3Byb2Nlc3NlcygwKTsJCS8qIE5vdCB3aGVuIGp1c3Qgc3RhcnRpbmcgdXAgKi8KLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19OT1RJQ0UsIDAsIHNlcnZlcl9jb25mLAotCQkgICAgIlNJR0hVUCByZWNlaXZlZC4gIEF0dGVtcHRpbmcgdG8gcmVzdGFydCIpOwotICAgIH0KLQotICAgIGlmICghaXNfZ3JhY2VmdWwpIHsKLQlhcF9yZXN0YXJ0X3RpbWUgPSB0aW1lKE5VTEwpOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBwcmVmb3JrX3ByZV9jb25maWcoYXBfY29udGV4dF90ICpwLCBhcF9jb250ZXh0X3QgKnBsb2csIGFwX2NvbnRleHRfdCAqcHRlbXApCi17Ci0gICAgc3RhdGljIGludCByZXN0YXJ0X251bSA9IDA7Ci0KLSAgICBvbmVfcHJvY2VzcyA9ICEhZ2V0ZW52KCJPTkVfUFJPQ0VTUyIpOwotCi0gICAgLyogc2lnaCwgd2FudCB0aGlzIG9ubHkgdGhlIHNlY29uZCB0aW1lIGFyb3VuZCAqLwotICAgIGlmIChyZXN0YXJ0X251bSsrID09IDEpIHsKLQlpc19ncmFjZWZ1bCA9IDA7Ci0KLQlpZiAoIW9uZV9wcm9jZXNzKSB7Ci0JICAgIHVuaXhkX2RldGFjaCgpOwotCX0KLQotCW15X3BpZCA9IGdldHBpZCgpOwotICAgIH0KLQotICAgIHVuaXhkX3ByZV9jb25maWcoKTsKLSAgICBhcF9saXN0ZW5fcHJlX2NvbmZpZygpOwotICAgIGFwX2RhZW1vbnNfdG9fc3RhcnQgPSBERUZBVUxUX1NUQVJUX0RBRU1PTjsKLSAgICBhcF9kYWVtb25zX21pbl9mcmVlID0gREVGQVVMVF9NSU5fRlJFRV9EQUVNT047Ci0gICAgYXBfZGFlbW9uc19tYXhfZnJlZSA9IERFRkFVTFRfTUFYX0ZSRUVfREFFTU9OOwotICAgIGFwX2RhZW1vbnNfbGltaXQgPSBIQVJEX1NFUlZFUl9MSU1JVDsKLSAgICBhcF9waWRfZm5hbWUgPSBERUZBVUxUX1BJRExPRzsKLSAgICBhcF9zY29yZWJvYXJkX2ZuYW1lID0gREVGQVVMVF9TQ09SRUJPQVJEOwotICAgIGFwX2xvY2tfZm5hbWUgPSBERUZBVUxUX0xPQ0tGSUxFOwotICAgIGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQgPSBERUZBVUxUX01BWF9SRVFVRVNUU19QRVJfQ0hJTEQ7Ci0gICAgYXBfZXh0ZW5kZWRfc3RhdHVzID0gMDsKLQotICAgIGFwX2NweXN0cm4oYXBfY29yZWR1bXBfZGlyLCBhcF9zZXJ2ZXJfcm9vdCwgc2l6ZW9mKGFwX2NvcmVkdW1wX2RpcikpOwotfQotCi1zdGF0aWMgdm9pZCBwcmVmb3JrX2hvb2tzKHZvaWQpCi17Ci0gICAgYXBfaG9va19wcmVfY29uZmlnKHByZWZvcmtfcHJlX2NvbmZpZyxOVUxMLE5VTEwsSE9PS19NSURETEUpOwotICAgIElOSVRfU0lHTElTVCgpOwotI2lmZGVmIEFVWDMKLSAgICAodm9pZCkgc2V0NDJzaWcoKTsKLSNlbmRpZgotICAgIC8qIFRPRE86IHNldCBvbmVfcHJvY2VzcyBwcm9wZXJseSAqLyBvbmVfcHJvY2VzcyA9IDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfcGlkZmlsZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKGNtZC0+c2VydmVyLT5pc192aXJ0dWFsKSB7Ci0JcmV0dXJuICJQaWRGaWxlIGRpcmVjdGl2ZSBub3QgYWxsb3dlZCBpbiA8VmlydHVhbEhvc3Q+IjsKLSAgICB9Ci0gICAgYXBfcGlkX2ZuYW1lID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3Njb3JlYm9hcmQoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX3Njb3JlYm9hcmRfZm5hbWUgPSBhcmc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbG9ja2ZpbGUoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX2xvY2tfZm5hbWUgPSBhcmc7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfZGFlbW9uc190b19zdGFydChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgYXBfZGFlbW9uc190b19zdGFydCA9IGF0b2koYXJnKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9taW5fZnJlZV9zZXJ2ZXJzKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX2RhZW1vbnNfbWluX2ZyZWUgPSBhdG9pKGFyZyk7Ci0gICAgaWYgKGFwX2RhZW1vbnNfbWluX2ZyZWUgPD0gMCkgewotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICJXQVJOSU5HOiBkZXRlY3RlZCBNaW5TcGFyZVNlcnZlcnMgc2V0IHRvIG5vbi1wb3NpdGl2ZS4iKTsKLSAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAiUmVzZXR0aW5nIHRvIDEgdG8gYXZvaWQgYWxtb3N0IGNlcnRhaW4gQXBhY2hlIGZhaWx1cmUuIik7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uLiIpOwotICAgICAgIGFwX2RhZW1vbnNfbWluX2ZyZWUgPSAxOwotICAgIH0KLSAgICAgICAKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9tYXhfZnJlZV9zZXJ2ZXJzKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX2RhZW1vbnNfbWF4X2ZyZWUgPSBhdG9pKGFyZyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfc2VydmVyX2xpbWl0IChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgYXBfZGFlbW9uc19saW1pdCA9IGF0b2koYXJnKTsKLSAgICBpZiAoYXBfZGFlbW9uc19saW1pdCA+IEhBUkRfU0VSVkVSX0xJTUlUKSB7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgIldBUk5JTkc6IE1heENsaWVudHMgb2YgJWQgZXhjZWVkcyBjb21waWxlIHRpbWUgbGltaXQgIgotICAgICAgICAgICAgICAgICAgICAib2YgJWQgc2VydmVycywiLCBhcF9kYWVtb25zX2xpbWl0LCBIQVJEX1NFUlZFUl9MSU1JVCk7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgIiBsb3dlcmluZyBNYXhDbGllbnRzIHRvICVkLiAgVG8gaW5jcmVhc2UsIHBsZWFzZSAiCi0gICAgICAgICAgICAgICAgICAgICJzZWUgdGhlIiwgSEFSRF9TRVJWRVJfTElNSVQpOwotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgIiBIQVJEX1NFUlZFUl9MSU1JVCBkZWZpbmUgaW4gc3JjL2luY2x1ZGUvaHR0cGQuaC4iKTsKLSAgICAgICBhcF9kYWVtb25zX2xpbWl0ID0gSEFSRF9TRVJWRVJfTElNSVQ7Ci0gICAgfSAKLSAgICBlbHNlIGlmIChhcF9kYWVtb25zX2xpbWl0IDwgMSkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiV0FSTklORzogUmVxdWlyZSBNYXhDbGllbnRzID4gMCwgc2V0dGluZyB0byAxIik7Ci0JYXBfZGFlbW9uc19saW1pdCA9IDE7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X21heF9yZXF1ZXN0cyhjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgYXBfbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCA9IGF0b2koYXJnKTsKLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2NvcmVkdW1wZGlyIChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgCi17Ci0gICAgc3RydWN0IHN0YXQgZmluZm87Ci0gICAgY29uc3QgY2hhciAqZm5hbWU7Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZm5hbWUgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZShjbWQtPnBvb2wsIGFyZyk7Ci0gICAgaWYgKChzdGF0KGZuYW1lLCAmZmluZm8pID09IC0xKSB8fCAhU19JU0RJUihmaW5mby5zdF9tb2RlKSkgewotCXJldHVybiBhcF9wc3RyY2F0KGNtZC0+cG9vbCwgIkNvcmVEdW1wRGlyZWN0b3J5ICIsIGZuYW1lLCAKLQkJCSAgIiBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSBkaXJlY3RvcnkiLCBOVUxMKTsKLSAgICB9Ci0gICAgYXBfY3B5c3RybihhcF9jb3JlZHVtcF9kaXIsIGZuYW1lLCBzaXplb2YoYXBfY29yZWR1bXBfZGlyKSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFN0dWIgZnVuY3Rpb25zIHVudGlsIHRoaXMgTVBNIHN1cHBvcnRzIHRoZSBjb25uZWN0aW9uIHN0YXR1cyBBUEkgKi8KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF91cGRhdGVfY29ubmVjdGlvbl9zdGF0dXMobG9uZyBjb25uX2lkLCBjb25zdCBjaGFyICprZXksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKQotewotICAgIC8qIE5PUCAqLwotfQotCi1hcF9hcnJheV9oZWFkZXJfdCAqYXBfZ2V0X3N0YXR1c190YWJsZShhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgLyogTk9QICovCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfcmVzZXRfY29ubmVjdGlvbl9zdGF0dXMobG9uZyBjb25uX2lkKQotewotICAgIC8qIE5PUCAqLwotfQotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgcHJlZm9ya19jbWRzW10gPSB7Ci1VTklYX0RBRU1PTl9DT01NQU5EUwotTElTVEVOX0NPTU1BTkRTCi17ICJQaWRGaWxlIiwgc2V0X3BpZGZpbGUsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICAgIkEgZmlsZSBmb3IgbG9nZ2luZyB0aGUgc2VydmVyIHByb2Nlc3MgSUQifSwKLXsgIlNjb3JlQm9hcmRGaWxlIiwgc2V0X3Njb3JlYm9hcmQsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICAgIkEgZmlsZSBmb3IgQXBhY2hlIHRvIG1haW50YWluIHJ1bnRpbWUgcHJvY2VzcyBtYW5hZ2VtZW50IGluZm9ybWF0aW9uIn0sCi17ICJMb2NrRmlsZSIsIHNldF9sb2NrZmlsZSwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAiVGhlIGxvY2tmaWxlIHVzZWQgd2hlbiBBcGFjaGUgbmVlZHMgdG8gbG9jayB0aGUgYWNjZXB0KCkgY2FsbCJ9LAoteyAiU3RhcnRTZXJ2ZXJzIiwgc2V0X2RhZW1vbnNfdG9fc3RhcnQsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJOdW1iZXIgb2YgY2hpbGQgcHJvY2Vzc2VzIGxhdW5jaGVkIGF0IHNlcnZlciBzdGFydHVwIiB9LAoteyAiTWluU3BhcmVTZXJ2ZXJzIiwgc2V0X21pbl9mcmVlX3NlcnZlcnMsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJNaW5pbXVtIG51bWJlciBvZiBpZGxlIGNoaWxkcmVuLCB0byBoYW5kbGUgcmVxdWVzdCBzcGlrZXMiIH0sCi17ICJNYXhTcGFyZVNlcnZlcnMiLCBzZXRfbWF4X2ZyZWVfc2VydmVycywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIk1heGltdW0gbnVtYmVyIG9mIGlkbGUgY2hpbGRyZW4iIH0sCi17ICJNYXhDbGllbnRzIiwgc2V0X3NlcnZlcl9saW1pdCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIk1heGltdW0gbnVtYmVyIG9mIGNoaWxkcmVuIGFsaXZlIGF0IHRoZSBzYW1lIHRpbWUiIH0sCi17ICJNYXhSZXF1ZXN0c1BlckNoaWxkIiwgc2V0X21heF9yZXF1ZXN0cywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIk1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIGEgcGFydGljdWxhciBjaGlsZCBzZXJ2ZXMgYmVmb3JlIGR5aW5nLiIgfSwKLXsgIkNvcmVEdW1wRGlyZWN0b3J5Iiwgc2V0X2NvcmVkdW1wZGlyLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiVGhlIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RvcnkgQXBhY2hlIGNoYW5nZXMgdG8gYmVmb3JlIGR1bXBpbmcgY29yZSIgfSwKLXsgTlVMTCB9Ci19OwotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgbXBtX3ByZWZvcmtfbW9kdWxlID0gewotICAgIFNUQU5EQVJEMjBfTU9EVUxFX1NUVUZGLAotICAgIE5VTEwsCQkJLyogY3JlYXRlIHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZSAqLwotICAgIE5VTEwsCQkJLyogbWVyZ2UgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIE5VTEwsCQkJLyogY3JlYXRlIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZSAqLwotICAgIE5VTEwsCQkJLyogbWVyZ2UgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIHByZWZvcmtfY21kcywJCS8qIGNvbW1hbmQgYXBfdGFibGVfdCAqLwotICAgIE5VTEwsCQkJLyogaGFuZGxlcnMgKi8KLSAgICBwcmVmb3JrX2hvb2tzLAkJLyogcmVnaXN0ZXIgaG9va3MgKi8KLX07CmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL3ByZWZvcmsvc2NvcmVib2FyZC5oIGIvc2VydmVyL21wbS9wcmVmb3JrL3Njb3JlYm9hcmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmMmJiNi4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL3ByZWZvcmsvc2NvcmVib2FyZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotI2lmbmRlZiBBUEFDSEVfU0NPUkVCT0FSRF9ICi0jZGVmaW5lIEFQQUNIRV9TQ09SRUJPQVJEX0gKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWZuZGVmIFdJTjMyCi0jaWZkZWYgVFBGCi0jaW5jbHVkZSA8dGltZS5oPgotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvdGltZXMuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2VuZGlmIC8qIFRQRiAqLwotI2VuZGlmCi0KLQotLyogVGhlIG9wdGltaXplZCB0aW1lb3V0IGNvZGUgb25seSB3b3JrcyBpZiB3ZSdyZSBub3QgdXNpbmcgYSBzY29yZWJvYXJkIGZpbGUKLSAqLwotI2lmIChkZWZpbmVkIChVU0VfTU1BUF9TQ09SRUJPQVJEKSB8fCBkZWZpbmVkIChVU0VfU0hNR0VUX1NDT1JFQk9BUkQpKQotI2RlZmluZSBPUFRJTUlaRV9USU1FT1VUUwotI2VuZGlmCi0KLS8qIFNjb3JlYm9hcmQgaW5mbyBvbiBhIHByb2Nlc3MgaXMsIGZvciBub3csIGtlcHQgdmVyeSBicmllZiAtLS0gCi0gKiBqdXN0IHN0YXR1cyB2YWx1ZSBhbmQgcGlkICh0aGUgbGF0dGVyIHNvIHRoYXQgdGhlIGNhcmV0YWtlciBwcm9jZXNzCi0gKiBjYW4gcHJvcGVybHkgdXBkYXRlIHRoZSBzY29yZWJvYXJkIHdoZW4gYSBwcm9jZXNzIGRpZXMpLiAgV2UgbWF5IHdhbnQKLSAqIHRvIGV2ZW50dWFsbHkgYWRkIGEgc2VwYXJhdGUgc2V0IG9mIGxvbmdfc2NvcmUgc3RydWN0dXJlcyB3aGljaCB3b3VsZAotICogZ2l2ZSwgZm9yIGVhY2ggcHJvY2VzcywgdGhlIG51bWJlciBvZiByZXF1ZXN0cyBzZXJ2aWNlZCwgYW5kIGluZm8gb24KLSAqIHRoZSBjdXJyZW50LCBvciBtb3N0IHJlY2VudCwgcmVxdWVzdC4KLSAqCi0gKiBTdGF0dXMgdmFsdWVzOgotICovCi0KLSNkZWZpbmUgU0VSVkVSX0RFQUQgMAotI2RlZmluZSBTRVJWRVJfU1RBUlRJTkcgMQkvKiBTZXJ2ZXIgU3RhcnRpbmcgdXAgKi8KLSNkZWZpbmUgU0VSVkVSX1JFQURZIDIJCS8qIFdhaXRpbmcgZm9yIGNvbm5lY3Rpb24gKG9yIGFjY2VwdCgpIGxvY2spICovCi0jZGVmaW5lIFNFUlZFUl9CVVNZX1JFQUQgMwkvKiBSZWFkaW5nIGEgY2xpZW50IHJlcXVlc3QgKi8KLSNkZWZpbmUgU0VSVkVSX0JVU1lfV1JJVEUgNAkvKiBQcm9jZXNzaW5nIGEgY2xpZW50IHJlcXVlc3QgKi8KLSNkZWZpbmUgU0VSVkVSX0JVU1lfS0VFUEFMSVZFIDUJLyogV2FpdGluZyBmb3IgbW9yZSByZXF1ZXN0cyB2aWEga2VlcGFsaXZlICovCi0jZGVmaW5lIFNFUlZFUl9CVVNZX0xPRyA2CS8qIExvZ2dpbmcgdGhlIHJlcXVlc3QgKi8KLSNkZWZpbmUgU0VSVkVSX0JVU1lfRE5TIDcJLyogTG9va2luZyB1cCBhIGhvc3RuYW1lICovCi0jZGVmaW5lIFNFUlZFUl9HUkFDRUZVTCA4CS8qIHNlcnZlciBpcyBncmFjZWZ1bGx5IGZpbmlzaGluZyByZXF1ZXN0ICovCi0jZGVmaW5lIFNFUlZFUl9OVU1fU1RBVFVTIDkJLyogbnVtYmVyIG9mIHN0YXR1cyBzZXR0aW5ncyAqLwotCi0vKiBBICJ2aXJ0dWFsIHRpbWUiIGlzIHNpbXBseSBhIGNvdW50ZXIgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhIGNoaWxkIGlzCi0gKiBtYWtpbmcgcHJvZ3Jlc3MuICBUaGUgcGFyZW50IGNoZWNrcyB1cCBvbiBlYWNoIGNoaWxkLCBhbmQgd2hlbiB0aGV5IGhhdmUKLSAqIG1hZGUgcHJvZ3Jlc3MgaXQgcmVzZXRzIHRoZSBsYXN0X3J0aW1lIGVsZW1lbnQuICBCdXQgd2hlbiB0aGUgY2hpbGQgaGFzbid0Ci0gKiBtYWRlIHByb2dyZXNzIGluIGEgdGltZSB0aGF0J3Mgcm91Z2hseSB0aW1lb3V0X2xlbiBzZWNvbmRzIGxvbmcsIGl0IGlzCi0gKiBzZW50IGEgU0lHQUxSTS4KLSAqCi0gKiB2dGltZSBpcyBhbiBvcHRpbWl6YXRpb24gdGhhdCBpcyB1c2VkIG9ubHkgd2hlbiB0aGUgc2NvcmVib2FyZCBpcyBpbgotICogc2hhcmVkIG1lbW9yeSAoaXQncyBub3QgZWFzeS9mZWFzaWJsZSB0byBkbyBpdCBpbiBhIHNjb3JlYm9hcmQgZmlsZSkuCi0gKiBUaGUgZXNzZW50aWFsIG9ic2VydmF0aW9uIGlzIHRoYXQgdGltZW91dHMgcmFyZWx5IG9jY3VyLCB0aGUgdmFzdCBtYWpvcml0eQotICogb2YgaGl0cyBmaW5pc2ggYmVmb3JlIGFueSB0aW1lb3V0IGhhcHBlbnMuICBTbyBpdCByZWFsbHkgc3Vja3MgdG8gaGF2ZSB0bwotICogYXNrIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRvIHNldCB1cCBhbmQgZGVzdHJveSBhbGFybXMgbWFueSB0aW1lcyBkdXJpbmcKLSAqIGEgcmVxdWVzdC4KLSAqLwotdHlwZWRlZiB1bnNpZ25lZCB2dGltZV90OwotCi0vKiBUeXBlIHVzZWQgZm9yIGdlbmVyYXRpb24gaW5kaWNpZXMuICBTdGFydHVwIGFuZCBldmVyeSByZXN0YXJ0IGNhdXNlIGEKLSAqIG5ldyBnZW5lcmF0aW9uIG9mIGNoaWxkcmVuIHRvIGJlIHNwYXduZWQuICBDaGlsZHJlbiB3aXRoaW4gdGhlIHNhbWUKLSAqIGdlbmVyYXRpb24gc2hhcmUgdGhlIHNhbWUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiAtLSBwb2ludGVycyB0byBzdHVmZgotICogY3JlYXRlZCBhdCBjb25maWcgdGltZSBpbiB0aGUgcGFyZW50IGFyZSB2YWxpZCBhY3Jvc3MgY2hpbGRyZW4uICBGb3IKLSAqIGV4YW1wbGUsIHRoZSB2aG9zdHJlYyBwb2ludGVyIGluIHRoZSBzY29yZWJvYXJkIGJlbG93IGlzIHZhbGlkIGluIGFsbAotICogY2hpbGRyZW4gb2YgdGhlIHNhbWUgZ2VuZXJhdGlvbi4KLSAqCi0gKiBUaGUgc2FmZSB3YXkgdG8gYWNjZXNzIHRoZSB2aG9zdCBwb2ludGVyIGlzIGxpa2UgdGhpczoKLSAqCi0gKiBzaG9ydF9zY29yZSAqc3MgPSBwb2ludGVyIHRvIHdoaWNodmVyIHNsb3QgaXMgaW50ZXJlc3Rpbmc7Ci0gKiBwYXJlbnRfc2NvcmUgKnBzID0gcG9pbnRlciB0byB3aGljaHZlciBzbG90IGlzIGludGVyZXN0aW5nOwotICogc2VydmVyX3JlYyAqdmggPSBzcy0+dmhvc3RyZWM7Ci0gKgotICogaWYgKHBzLT5nZW5lcmF0aW9uICE9IGFwX215X2dlbmVyYXRpb24pIHsKLSAqICAgICB2aCA9IE5VTEw7Ci0gKiB9Ci0gKgotICogdGhlbiBpZiB2aCBpcyBub3QgTlVMTCBpdCdzIHZhbGlkIGluIHRoaXMgY2hpbGQuCi0gKgotICogVGhpcyBhdm9pZHMgdmFyaW91cyByYWNlIGNvbmRpdGlvbnMgYXJvdW5kIHJlc3RhcnRzLgotICovCi10eXBlZGVmIGludCBhcF9nZW5lcmF0aW9uX3Q7Ci0KLS8qIHN0dWZmIHdoaWNoIHRoZSBjaGlsZHJlbiBnZW5lcmFsbHkgd3JpdGUsIGFuZCB0aGUgcGFyZW50IG1haW5seSByZWFkcyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotI2lmZGVmIE9QVElNSVpFX1RJTUVPVVRTCi0gICAgdnRpbWVfdCBjdXJfdnRpbWU7CQkvKiB0aGUgY2hpbGQncyBjdXJyZW50IHZ0aW1lICovCi0gICAgdW5zaWduZWQgc2hvcnQgdGltZW91dF9sZW47CS8qIGxlbmd0aCBvZiB0aGUgdGltZW91dCAqLwotI2VuZGlmCi0gICAgdW5zaWduZWQgY2hhciBzdGF0dXM7Ci0gICAgdW5zaWduZWQgbG9uZyBhY2Nlc3NfY291bnQ7Ci0gICAgdW5zaWduZWQgbG9uZyBieXRlc19zZXJ2ZWQ7Ci0gICAgdW5zaWduZWQgbG9uZyBteV9hY2Nlc3NfY291bnQ7Ci0gICAgdW5zaWduZWQgbG9uZyBteV9ieXRlc19zZXJ2ZWQ7Ci0gICAgdW5zaWduZWQgbG9uZyBjb25uX2J5dGVzOwotICAgIHVuc2lnbmVkIHNob3J0IGNvbm5fY291bnQ7Ci0jaWYgIWRlZmluZWQoSEFWRV9HRVRUSU1FT0ZEQVkpCi0gICAgY2xvY2tfdCBzdGFydF90aW1lOwotICAgIGNsb2NrX3Qgc3RvcF90aW1lOwotI2Vsc2UKLSAgICBzdHJ1Y3QgdGltZXZhbCBzdGFydF90aW1lOwotICAgIHN0cnVjdCB0aW1ldmFsIHN0b3BfdGltZTsKLSNlbmRpZgotI2lmZGVmIEhBVkVfVElNRVMKLSAgICBzdHJ1Y3QgdG1zIHRpbWVzOwotI2VuZGlmCi0jaWZuZGVmIE9QVElNSVpFX1RJTUVPVVRTCi0gICAgdGltZV90IGxhc3RfdXNlZDsKLSNlbmRpZgotICAgIGNoYXIgY2xpZW50WzMyXTsJCS8qIEtlZXAgJ2VtIHNtYWxsLi4uICovCi0gICAgY2hhciByZXF1ZXN0WzY0XTsJCS8qIFdlIGp1c3Qgd2FudCBhbiBpZGVhLi4uICovCi0gICAgc2VydmVyX3JlYyAqdmhvc3RyZWM7CS8qIFdoYXQgdmlydHVhbCBob3N0IGlzIGJlaW5nIGFjY2Vzc2VkPyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTRUUgQUJPVkUgRk9SIFNBRkUgVVNBR0UhICovCi19IHNob3J0X3Njb3JlOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgYXBfZ2VuZXJhdGlvbl90IHJ1bm5pbmdfZ2VuZXJhdGlvbjsJLyogdGhlIGdlbmVyYXRpb24gb2YgY2hpbGRyZW4gd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaG91bGQgc3RpbGwgYmUgc2VydmluZyByZXF1ZXN0cy4gKi8KLX0gZ2xvYmFsX3Njb3JlOwotCi0vKiBzdHVmZiB3aGljaCB0aGUgcGFyZW50IGdlbmVyYWxseSB3cml0ZXMgYW5kIHRoZSBjaGlsZHJlbiByYXJlbHkgcmVhZCAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHBpZF90IHBpZDsKLSNpZmRlZiBPUFRJTUlaRV9USU1FT1VUUwotICAgIHRpbWVfdCBsYXN0X3J0aW1lOwkJLyogdGltZSgwKSBvZiB0aGUgbGFzdCBjaGFuZ2UgKi8KLSAgICB2dGltZV90IGxhc3RfdnRpbWU7CQkvKiB0aGUgbGFzdCB2dGltZSB0aGUgcGFyZW50IGhhcyBzZWVuICovCi0jZW5kaWYKLSAgICBhcF9nZW5lcmF0aW9uX3QgZ2VuZXJhdGlvbjsJLyogZ2VuZXJhdGlvbiBvZiB0aGlzIGNoaWxkICovCi19IHBhcmVudF9zY29yZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHNob3J0X3Njb3JlIHNlcnZlcnNbSEFSRF9TRVJWRVJfTElNSVRdOwotICAgIHBhcmVudF9zY29yZSBwYXJlbnRbSEFSRF9TRVJWRVJfTElNSVRdOwotICAgIGdsb2JhbF9zY29yZSBnbG9iYWw7Ci19IHNjb3JlYm9hcmQ7Ci0KLSNkZWZpbmUgU0NPUkVCT0FSRF9TSVpFCQlzaXplb2Yoc2NvcmVib2FyZCkKLSNpZmRlZiBUUEYKLSNkZWZpbmUgU0NPUkVCT0FSRF9OQU1FCQkiU0NPUkVCUkQiCi0jZGVmaW5lIFNDT1JFQk9BUkRfRlJBTUVTCQlTQ09SRUJPQVJEX1NJWkUvNDA5NSArIDEKLSNlbmRpZgotCi1BUElfRVhQT1JUKHZvaWQpIGFwX3N5bmNfc2NvcmVib2FyZF9pbWFnZSh2b2lkKTsKLUFQSV9FWFBPUlQoaW50KSBhcF9leGlzdHNfc2NvcmVib2FyZF9pbWFnZSh2b2lkKTsKLQotQVBJX1ZBUl9FWFBPUlQgZXh0ZXJuIHNjb3JlYm9hcmQgKmFwX3Njb3JlYm9hcmRfaW1hZ2U7Ci0KLUFQSV9WQVJfRVhQT1JUIGV4dGVybiBhcF9nZW5lcmF0aW9uX3Qgdm9sYXRpbGUgYXBfbXlfZ2VuZXJhdGlvbjsKLQotLyogZm9yIHRpbWVfcHJvY2Vzc19yZXF1ZXN0KCkgaW4gaHR0cF9tYWluLmMgKi8KLSNkZWZpbmUgU1RBUlRfUFJFUVVFU1QgMQotI2RlZmluZSBTVE9QX1BSRVFVRVNUICAyCi0KLWludCBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKGludCBjaGlsZF9udW0sIGludCBzdGF0dXMsIHJlcXVlc3RfcmVjICpyKTsKLXZvaWQgYXBfdGltZV9wcm9jZXNzX3JlcXVlc3QoaW50IGNoaWxkX251bSwgaW50IHN0YXR1cyk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgkvKiAhQVBBQ0hFX1NDT1JFQk9BUkRfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS9zcG10X29zMi8uY3ZzaWdub3JlIGIvc2VydmVyL21wbS9zcG10X29zMi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2M3YTdjLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vc3BtdF9vczIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1ha2VmaWxlCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL3NwbXRfb3MyL01ha2VmaWxlLmluIGIvc2VydmVyL21wbS9zcG10X29zMi9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgxYTkxYi4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL3NwbXRfb3MyL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCi1ERVBUSCAgICAgPSAuLi8uLi8uLgotdG9wc3JjZGlyID0gQHRvcHNyY2RpckAKLXNyY2RpciAgICA9IEBzcmNkaXJACi1WUEFUSCAgICAgPSBAc3JjZGlyQAotCi1MVExJQlJBUllfTkFNRSAgICA9IGxpYnNwbXRfb3MyLmxhCi1MVExJQlJBUllfU09VUkNFUyA9IHNwbXRfb3MyLmMKLQotaW5jbHVkZSAkKHRvcHNyY2RpcikvYnVpbGQvbHRsaWIubWsKZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vc3BtdF9vczIvTWFrZWZpbGUubGliZGlyIGIvc2VydmVyL21wbS9zcG10X29zMi9NYWtlZmlsZS5saWJkaXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNTI1NDAuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9zcG10X29zMi9NYWtlZmlsZS5saWJkaXIKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVRoaXMgaXMgYSBwbGFjZS1ob2xkZXIgd2hpY2ggaW5kaWNhdGVzIHRvIENvbmZpZ3VyZSB0aGF0IGl0IHNob3VsZG4ndAotcHJvdmlkZSB0aGUgZGVmYXVsdCB0YXJnZXRzIHdoZW4gYnVpbGRpbmcgdGhlIE1ha2VmaWxlIGluIHRoaXMgZGlyZWN0b3J5LgotSW5zdGVhZCBpdCdsbCBqdXN0IHByZXBlbmQgYWxsIHRoZSBpbXBvcnRhbnQgdmFyaWFibGUgZGVmaW5pdGlvbnMsIGFuZAotY29weSB0aGUgTWFrZWZpbGUudG1wbCBvbnRvIHRoZSBlbmQuCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL3NwbXRfb3MyL2NvbmZpZy5tNCBiL3NlcnZlci9tcG0vc3BtdF9vczIvY29uZmlnLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2IxYjE2Li4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vc3BtdF9vczIvY29uZmlnLm00CisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1pZiB0ZXN0ICIkTVBNX05BTUUiID0gInNwbXRfb3MyIiA7IHRoZW4KLSAgICBBQ19DQUNIRV9TQVZFCi0gICAgQVBBQ0hFX0ZBU1RfT1VUUFVUKG1vZHVsZXMvbXBtLyRNUE1fTkFNRS9NYWtlZmlsZSkKLSAgICBDRkxBR1M9IiRDRkxBR1MgLVptdCIKLSAgICBMREZMQUdTPSIkTERGTEFHUyAtWm10IgotZmkKZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vc3BtdF9vczIvbXBtX2RlZmF1bHQuaCBiL3NlcnZlci9tcG0vc3BtdF9vczIvbXBtX2RlZmF1bHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhkNTI3ZS4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvbXBtL3NwbXRfb3MyL21wbV9kZWZhdWx0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCi0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgCi0gKiBhcmUgbWV0OiAKLSAqIAotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgCi0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuICAKLSAqIAotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgCi0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIAotICogICAgZGlzdHJpYnV0aW9uLiAKLSAqIAotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIAotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6IAotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cCAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iIAotICogCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvIAotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCi0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuIAotICogCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiAKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4gCi0gKiAKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcgCi0gKiAgICBhY2tub3dsZWRnbWVudDogCi0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwIAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIgCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWSAKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUiAKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCi0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSAKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCAKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKLSAqIAotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkgCi0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQgCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uIAotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlciAKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LiAKLSAqIAotICovIAotCi0jaWZuZGVmIEFQQUNIRV9NUE1fREVGQVVMVF9ICi0jZGVmaW5lIEFQQUNIRV9NUE1fREVGQVVMVF9ICi0KLS8qIE51bWJlciBvZiBzZXJ2ZXJzIHRvIHNwYXduIG9mZiBieSBkZWZhdWx0IC0tLSBhbHNvLCBpZiBmZXdlciB0aGFuCi0gKiB0aGlzIGZyZWUgd2hlbiB0aGUgY2FyZXRha2VyIGNoZWNrcywgaXQgd2lsbCBzcGF3biBtb3JlLgotICovCi0jaWZuZGVmIERFRkFVTFRfU1RBUlRfREFFTU9OCi0jZGVmaW5lIERFRkFVTFRfU1RBUlRfREFFTU9OIDUKLSNlbmRpZgotCi0vKiBNYXhpbXVtIG51bWJlciBvZiAqZnJlZSogc2VydmVyIHByb2Nlc3NlcyAtLS0gbW9yZSB0aGFuIHRoaXMsIGFuZAotICogdGhleSB3aWxsIGRpZSBvZmYuCi0gKi8KLQotI2lmbmRlZiBERUZBVUxUX01BWF9GUkVFX0RBRU1PTgotI2RlZmluZSBERUZBVUxUX01BWF9GUkVFX0RBRU1PTiAxMAotI2VuZGlmCi0KLS8qIE1pbmltdW0gLS0tIGZld2VyIHRoYW4gdGhpcywgYW5kIG1vcmUgd2lsbCBiZSBjcmVhdGVkICovCi0KLSNpZm5kZWYgREVGQVVMVF9NSU5fRlJFRV9EQUVNT04KLSNkZWZpbmUgREVGQVVMVF9NSU5fRlJFRV9EQUVNT04gNQotI2VuZGlmCi0KLS8qIExpbWl0IG9uIHRoZSB0b3RhbCAtLS0gY2xpZW50cyB3aWxsIGJlIGxvY2tlZCBvdXQgaWYgbW9yZSBzZXJ2ZXJzIHRoYW4KLSAqIHRoaXMgYXJlIG5lZWRlZC4gIEl0IGlzIGludGVuZGVkIHNvbGVseSB0byBrZWVwIHRoZSBzZXJ2ZXIgZnJvbSBjcmFzaGluZwotICogd2hlbiB0aGluZ3MgZ2V0IG91dCBvZiBoYW5kLgotICoKLSAqIFdlIGtlZXAgYSBoYXJkIG1heGltdW0gbnVtYmVyIG9mIHNlcnZlcnMsIGZvciB0d28gcmVhc29ucyAtLS0gZmlyc3Qgb2ZmLAotICogaW4gY2FzZSBzb21ldGhpbmcgZ29lcyBzZXJpb3VzbHkgd3JvbmcsIHdlIHdhbnQgdG8gc3RvcCB0aGUgZm9yayBib21iCi0gKiBzaG9ydCBvZiBhY3R1YWxseSBjcmFzaGluZyB0aGUgbWFjaGluZSB3ZSdyZSBydW5uaW5nIG9uIGJ5IGZpbGxpbmcgc29tZQotICoga2VybmVsIHRhYmxlLiAgU2Vjb25kbHksIGl0IGtlZXBzIHRoZSBzaXplIG9mIHRoZSBzY29yZWJvYXJkIGZpbGUgc21hbGwKLSAqIGVub3VnaCB0aGF0IHdlIGNhbiByZWFkIHRoZSB3aG9sZSB0aGluZyB3aXRob3V0IHdvcnJ5aW5nIHRvbyBtdWNoIGFib3V0Ci0gKiB0aGUgb3ZlcmhlYWQuCi0gKi8KLSNpZm5kZWYgSEFSRF9TRVJWRVJfTElNSVQKLSNkZWZpbmUgSEFSRF9TRVJWRVJfTElNSVQgMjU2Ci0jZW5kaWYKLQotLyogV2hlcmUgdGhlIG1haW4vcGFyZW50IHByb2Nlc3MncyBwaWQgaXMgbG9nZ2VkICovCi0jaWZuZGVmIERFRkFVTFRfUElETE9HCi0jZGVmaW5lIERFRkFVTFRfUElETE9HICJsb2dzL2h0dHBkLnBpZCIKLSNlbmRpZgotCi0vKgotICogSW50ZXJ2YWwsIGluIG1pY3Jvc2Vjb25kcywgYmV0d2VlbiBzY29yZWJvYXJkIG1haW50ZW5hbmNlLgotICovCi0jaWZuZGVmIFNDT1JFQk9BUkRfTUFJTlRFTkFOQ0VfSU5URVJWQUwKLSNkZWZpbmUgU0NPUkVCT0FSRF9NQUlOVEVOQU5DRV9JTlRFUlZBTCAxMDAwMDAwCi0jZW5kaWYKLQotLyogTnVtYmVyIG9mIHJlcXVlc3RzIHRvIHRyeSB0byBoYW5kbGUgaW4gYSBzaW5nbGUgcHJvY2Vzcy4gIElmIDw9IDAsCi0gKiB0aGUgY2hpbGRyZW4gZG9uJ3QgZGllIG9mZi4KLSAqLwotI2lmbmRlZiBERUZBVUxUX01BWF9SRVFVRVNUU19QRVJfQ0hJTEQKLSNkZWZpbmUgREVGQVVMVF9NQVhfUkVRVUVTVFNfUEVSX0NISUxEIDEwMDAwCi0jZW5kaWYKLQotI2VuZGlmIC8qIEFQX01QTV9ERUZBVUxUX0ggKi8KZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vc3BtdF9vczIvc2NvcmVib2FyZC5oIGIvc2VydmVyL21wbS9zcG10X29zMi9zY29yZWJvYXJkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNjkzZTIuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9zcG10X29zMi9zY29yZWJvYXJkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0jaWZuZGVmIEFQQUNIRV9TQ09SRUJPQVJEX0gKLSNkZWZpbmUgQVBBQ0hFX1NDT1JFQk9BUkRfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NZU19USU1FU19ICi0jaW5jbHVkZSA8c3lzL3RpbWVzLmg+Ci0jZW5kaWYKLQotLyogVGhlIG9wdGltaXplZCB0aW1lb3V0IGNvZGUgb25seSB3b3JrcyBpZiB3ZSdyZSBub3QgdXNpbmcgYSBzY29yZWJvYXJkIGZpbGUKLSAqLwotI2lmIChkZWZpbmVkIChVU0VfTU1BUF9TQ09SRUJPQVJEKSB8fCBkZWZpbmVkIChVU0VfU0hNR0VUX1NDT1JFQk9BUkQpKQotI2RlZmluZSBPUFRJTUlaRV9USU1FT1VUUwotI2VuZGlmCi0KLS8qIFNjb3JlYm9hcmQgaW5mbyBvbiBhIHRocmVhZCBpcywgZm9yIG5vdywga2VwdCB2ZXJ5IGJyaWVmIC0tLSAKLSAqIGp1c3Qgc3RhdHVzIHZhbHVlIGFuZCBwaWQgKHRoZSBsYXR0ZXIgc28gdGhhdCB0aGUgY2FyZXRha2VyIHRocmVhZAotICogY2FuIHByb3Blcmx5IHVwZGF0ZSB0aGUgc2NvcmVib2FyZCB3aGVuIGEgdGhyZWFkIGRpZXMpLiAgV2UgbWF5IHdhbnQKLSAqIHRvIGV2ZW50dWFsbHkgYWRkIGEgc2VwYXJhdGUgc2V0IG9mIGxvbmdfc2NvcmUgc3RydWN0dXJlcyB3aGljaCB3b3VsZAotICogZ2l2ZSwgZm9yIGVhY2ggdGhyZWFkLCB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzIHNlcnZpY2VkLCBhbmQgaW5mbyBvbgotICogdGhlIGN1cnJlbnQsIG9yIG1vc3QgcmVjZW50LCByZXF1ZXN0LgotICoKLSAqIFN0YXR1cyB2YWx1ZXM6Ci0gKi8KLQotI2RlZmluZSBTRVJWRVJfREVBRCAwCi0jZGVmaW5lIFNFUlZFUl9TVEFSVElORyAxCS8qIFNlcnZlciBTdGFydGluZyB1cCAqLwotI2RlZmluZSBTRVJWRVJfUkVBRFkgMgkJLyogV2FpdGluZyBmb3IgY29ubmVjdGlvbiAob3IgYWNjZXB0KCkgbG9jaykgKi8KLSNkZWZpbmUgU0VSVkVSX0JVU1lfUkVBRCAzCS8qIFJlYWRpbmcgYSBjbGllbnQgcmVxdWVzdCAqLwotI2RlZmluZSBTRVJWRVJfQlVTWV9XUklURSA0CS8qIFByb2Nlc3NpbmcgYSBjbGllbnQgcmVxdWVzdCAqLwotI2RlZmluZSBTRVJWRVJfQlVTWV9LRUVQQUxJVkUgNQkvKiBXYWl0aW5nIGZvciBtb3JlIHJlcXVlc3RzIHZpYSBrZWVwYWxpdmUgKi8KLSNkZWZpbmUgU0VSVkVSX0JVU1lfTE9HIDYJLyogTG9nZ2luZyB0aGUgcmVxdWVzdCAqLwotI2RlZmluZSBTRVJWRVJfQlVTWV9ETlMgNwkvKiBMb29raW5nIHVwIGEgaG9zdG5hbWUgKi8KLSNkZWZpbmUgU0VSVkVSX0dSQUNFRlVMIDgJLyogc2VydmVyIGlzIGdyYWNlZnVsbHkgZmluaXNoaW5nIHJlcXVlc3QgKi8KLSNkZWZpbmUgU0VSVkVSX05VTV9TVEFUVVMgOQkvKiBudW1iZXIgb2Ygc3RhdHVzIHNldHRpbmdzICovCi0KLS8qIEEgInZpcnR1YWwgdGltZSIgaXMgc2ltcGx5IGEgY291bnRlciB0aGF0IGluZGljYXRlcyB0aGF0IGEgY2hpbGQgaXMKLSAqIG1ha2luZyBwcm9ncmVzcy4gIFRoZSBwYXJlbnQgY2hlY2tzIHVwIG9uIGVhY2ggY2hpbGQsIGFuZCB3aGVuIHRoZXkgaGF2ZQotICogbWFkZSBwcm9ncmVzcyBpdCByZXNldHMgdGhlIGxhc3RfcnRpbWUgZWxlbWVudC4gIEJ1dCB3aGVuIHRoZSBjaGlsZCBoYXNuJ3QKLSAqIG1hZGUgcHJvZ3Jlc3MgaW4gYSB0aW1lIHRoYXQncyByb3VnaGx5IHRpbWVvdXRfbGVuIHNlY29uZHMgbG9uZywgaXQgaXMKLSAqIHNlbnQgYSBTSUdBTFJNLgotICoKLSAqIHZ0aW1lIGlzIGFuIG9wdGltaXphdGlvbiB0aGF0IGlzIHVzZWQgb25seSB3aGVuIHRoZSBzY29yZWJvYXJkIGlzIGluCi0gKiBzaGFyZWQgbWVtb3J5IChpdCdzIG5vdCBlYXN5L2ZlYXNpYmxlIHRvIGRvIGl0IGluIGEgc2NvcmVib2FyZCBmaWxlKS4KLSAqIFRoZSBlc3NlbnRpYWwgb2JzZXJ2YXRpb24gaXMgdGhhdCB0aW1lb3V0cyByYXJlbHkgb2NjdXIsIHRoZSB2YXN0IG1ham9yaXR5Ci0gKiBvZiBoaXRzIGZpbmlzaCBiZWZvcmUgYW55IHRpbWVvdXQgaGFwcGVucy4gIFNvIGl0IHJlYWxseSBzdWNrcyB0byBoYXZlIHRvCi0gKiBhc2sgdGhlIG9wZXJhdGluZyBzeXN0ZW0gdG8gc2V0IHVwIGFuZCBkZXN0cm95IGFsYXJtcyBtYW55IHRpbWVzIGR1cmluZwotICogYSByZXF1ZXN0LgotICovCi10eXBlZGVmIHVuc2lnbmVkIHZ0aW1lX3Q7Ci0KLS8qIFR5cGUgdXNlZCBmb3IgZ2VuZXJhdGlvbiBpbmRpY2llcy4gIFN0YXJ0dXAgYW5kIGV2ZXJ5IHJlc3RhcnQgY2F1c2UgYQotICogbmV3IGdlbmVyYXRpb24gb2YgY2hpbGRyZW4gdG8gYmUgc3Bhd25lZC4gIENoaWxkcmVuIHdpdGhpbiB0aGUgc2FtZQotICogZ2VuZXJhdGlvbiBzaGFyZSB0aGUgc2FtZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIC0tIHBvaW50ZXJzIHRvIHN0dWZmCi0gKiBjcmVhdGVkIGF0IGNvbmZpZyB0aW1lIGluIHRoZSBwYXJlbnQgYXJlIHZhbGlkIGFjcm9zcyBjaGlsZHJlbi4gIEZvcgotICogZXhhbXBsZSwgdGhlIHZob3N0cmVjIHBvaW50ZXIgaW4gdGhlIHNjb3JlYm9hcmQgYmVsb3cgaXMgdmFsaWQgaW4gYWxsCi0gKiBjaGlsZHJlbiBvZiB0aGUgc2FtZSBnZW5lcmF0aW9uLgotICoKLSAqIFRoZSBzYWZlIHdheSB0byBhY2Nlc3MgdGhlIHZob3N0IHBvaW50ZXIgaXMgbGlrZSB0aGlzOgotICoKLSAqIHNob3J0X3Njb3JlICpzcyA9IHBvaW50ZXIgdG8gd2hpY2h2ZXIgc2xvdCBpcyBpbnRlcmVzdGluZzsKLSAqIHBhcmVudF9zY29yZSAqcHMgPSBwb2ludGVyIHRvIHdoaWNodmVyIHNsb3QgaXMgaW50ZXJlc3Rpbmc7Ci0gKiBzZXJ2ZXJfcmVjICp2aCA9IHNzLT52aG9zdHJlYzsKLSAqCi0gKiBpZiAocHMtPmdlbmVyYXRpb24gIT0gYXBfbXlfZ2VuZXJhdGlvbikgewotICogICAgIHZoID0gTlVMTDsKLSAqIH0KLSAqCi0gKiB0aGVuIGlmIHZoIGlzIG5vdCBOVUxMIGl0J3MgdmFsaWQgaW4gdGhpcyBjaGlsZC4KLSAqCi0gKiBUaGlzIGF2b2lkcyB2YXJpb3VzIHJhY2UgY29uZGl0aW9ucyBhcm91bmQgcmVzdGFydHMuCi0gKi8KLXR5cGVkZWYgaW50IGFwX2dlbmVyYXRpb25fdDsKLQotLyogc3R1ZmYgd2hpY2ggdGhlIGNoaWxkcmVuIGdlbmVyYWxseSB3cml0ZSwgYW5kIHRoZSBwYXJlbnQgbWFpbmx5IHJlYWRzICovCi10eXBlZGVmIHN0cnVjdCB7Ci0jaWZkZWYgT1BUSU1JWkVfVElNRU9VVFMKLSAgICB2dGltZV90IGN1cl92dGltZTsJCS8qIHRoZSBjaGlsZCdzIGN1cnJlbnQgdnRpbWUgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB0aW1lb3V0X2xlbjsJLyogbGVuZ3RoIG9mIHRoZSB0aW1lb3V0ICovCi0jZW5kaWYKLSAgICB1bnNpZ25lZCBjaGFyIHN0YXR1czsKLSAgICB1bnNpZ25lZCBsb25nIGFjY2Vzc19jb3VudDsKLSAgICB1bnNpZ25lZCBsb25nIGJ5dGVzX3NlcnZlZDsKLSAgICB1bnNpZ25lZCBsb25nIG15X2FjY2Vzc19jb3VudDsKLSAgICB1bnNpZ25lZCBsb25nIG15X2J5dGVzX3NlcnZlZDsKLSAgICB1bnNpZ25lZCBsb25nIGNvbm5fYnl0ZXM7Ci0gICAgdW5zaWduZWQgc2hvcnQgY29ubl9jb3VudDsKLSNpZiAhZGVmaW5lZChIQVZFX0dFVFRJTUVPRkRBWSkKLSAgICBjbG9ja190IHN0YXJ0X3RpbWU7Ci0gICAgY2xvY2tfdCBzdG9wX3RpbWU7Ci0jZWxzZQotICAgIHN0cnVjdCB0aW1ldmFsIHN0YXJ0X3RpbWU7Ci0gICAgc3RydWN0IHRpbWV2YWwgc3RvcF90aW1lOwotI2VuZGlmCi0jaWZkZWYgSEFWRV9USU1FUwotICAgIHN0cnVjdCB0bXMgdGltZXM7Ci0jZW5kaWYKLSNpZm5kZWYgT1BUSU1JWkVfVElNRU9VVFMKLSAgICB0aW1lX3QgbGFzdF91c2VkOwotI2VuZGlmCi0gICAgY2hhciBjbGllbnRbMzJdOwkJLyogS2VlcCAnZW0gc21hbGwuLi4gKi8KLSAgICBjaGFyIHJlcXVlc3RbNjRdOwkJLyogV2UganVzdCB3YW50IGFuIGlkZWEuLi4gKi8KLSAgICBzZXJ2ZXJfcmVjICp2aG9zdHJlYzsJLyogV2hhdCB2aXJ0dWFsIGhvc3QgaXMgYmVpbmcgYWNjZXNzZWQ/ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNFRSBBQk9WRSBGT1IgU0FGRSBVU0FHRSEgKi8KLSAgICBpbnQgdGhyZWFkX3JldHZhbDsKLX0gc2hvcnRfc2NvcmU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBhcF9nZW5lcmF0aW9uX3QgcnVubmluZ19nZW5lcmF0aW9uOwkvKiB0aGUgZ2VuZXJhdGlvbiBvZiBjaGlsZHJlbiB3aGljaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNob3VsZCBzdGlsbCBiZSBzZXJ2aW5nIHJlcXVlc3RzLiAqLwotfSBnbG9iYWxfc2NvcmU7Ci0KLS8qIHN0dWZmIHdoaWNoIHRoZSBwYXJlbnQgZ2VuZXJhbGx5IHdyaXRlcyBhbmQgdGhlIGNoaWxkcmVuIHJhcmVseSByZWFkICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgcGlkX3QgdGlkOwotI2lmZGVmIE9QVElNSVpFX1RJTUVPVVRTCi0gICAgdGltZV90IGxhc3RfcnRpbWU7CQkvKiB0aW1lKDApIG9mIHRoZSBsYXN0IGNoYW5nZSAqLwotICAgIHZ0aW1lX3QgbGFzdF92dGltZTsJCS8qIHRoZSBsYXN0IHZ0aW1lIHRoZSBwYXJlbnQgaGFzIHNlZW4gKi8KLSNlbmRpZgotICAgIGFwX2dlbmVyYXRpb25fdCBnZW5lcmF0aW9uOwkvKiBnZW5lcmF0aW9uIG9mIHRoaXMgY2hpbGQgKi8KLSAgICBpbnQgZGVmZXJyZWRfZGllOwotfSBwYXJlbnRfc2NvcmU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBzaG9ydF9zY29yZSBzZXJ2ZXJzW0hBUkRfU0VSVkVSX0xJTUlUXTsKLSAgICBwYXJlbnRfc2NvcmUgcGFyZW50W0hBUkRfU0VSVkVSX0xJTUlUXTsKLSAgICBnbG9iYWxfc2NvcmUgZ2xvYmFsOwotfSBzY29yZWJvYXJkOwotCi0jZGVmaW5lIFNDT1JFQk9BUkRfU0laRQkJc2l6ZW9mKHNjb3JlYm9hcmQpCi0jaWZkZWYgVFBGCi0jZGVmaW5lIFNDT1JFQk9BUkRfTkFNRQkJIlNDT1JFQlJEIgotI2RlZmluZSBTQ09SRUJPQVJEX0ZSQU1FUwkJU0NPUkVCT0FSRF9TSVpFLzQwOTUgKyAxCi0jZW5kaWYKLQotQVBJX0VYUE9SVChpbnQpIGFwX2V4aXN0c19zY29yZWJvYXJkX2ltYWdlKHZvaWQpOwotCi1BUElfVkFSX0VYUE9SVCBleHRlcm4gc2NvcmVib2FyZCAqYXBfc2NvcmVib2FyZF9pbWFnZTsKLQotCi0vKiBmb3IgdGltZV9wcm9jZXNzX3JlcXVlc3QoKSBpbiBodHRwX21haW4uYyAqLwotI2RlZmluZSBTVEFSVF9QUkVRVUVTVCAxCi0jZGVmaW5lIFNUT1BfUFJFUVVFU1QgIDIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCS8qICFBUEFDSEVfU0NPUkVCT0FSRF9IICovCmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL3NwbXRfb3MyL3NwbXRfb3MyLmMgYi9zZXJ2ZXIvbXBtL3NwbXRfb3MyL3NwbXRfb3MyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MGI5NmUuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS9zcG10X29zMi9zcG10X29zMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc5NSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLQotCi0jZGVmaW5lIENPUkVfUFJJVkFURQotI2RlZmluZSBJTkNMX0RPUwotI2RlZmluZSBJTkNMX0RPU0VSUk9SUwotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlICJtcG1fZGVmYXVsdC5oIgotI2luY2x1ZGUgImh0dHBfbWFpbi5oIgotI2luY2x1ZGUgImh0dHBfbG9nLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIJCS8qIGZvciBnZXRfcmVtb3RlX2hvc3QgKi8KLSNpbmNsdWRlICJodHRwX2Nvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJzY29yZWJvYXJkLmgiCi0jaW5jbHVkZSAiYXBfbXBtLmgiCi0jaW5jbHVkZSAiYXBfbGlzdGVuLmgiCi0jaW5jbHVkZSAiaW9sX3NvY2tldC5oIgotI2luY2x1ZGUgImFwcl9wb3J0YWJsZS5oIgotCi0jaW5jbHVkZSA8b3MyLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgotCi0vKiBjb25maWcgZ2xvYmFscyAqLwotCi1zdGF0aWMgaW50IGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQ9MDsKLXN0YXRpYyBjaGFyICphcF9waWRfZm5hbWU9TlVMTDsKLXN0YXRpYyBpbnQgYXBfZGFlbW9uc190b19zdGFydD0wOwotc3RhdGljIGludCBhcF9kYWVtb25zX21pbl9mcmVlPTA7Ci1zdGF0aWMgaW50IGFwX2RhZW1vbnNfbWF4X2ZyZWU9MDsKLXN0YXRpYyBpbnQgYXBfZGFlbW9uc19saW1pdD0wOwotc3RhdGljIHRpbWVfdCBhcF9yZXN0YXJ0X3RpbWU9MDsKLXN0YXRpYyBpbnQgYXBfZXh0ZW5kZWRfc3RhdHVzID0gMDsKLQotLyoKLSAqIFRoZSBtYXggY2hpbGQgc2xvdCBldmVyIGFzc2lnbmVkLCBwcmVzZXJ2ZWQgYWNyb3NzIHJlc3RhcnRzLiAgTmVjZXNzYXJ5Ci0gKiB0byBkZWFsIHdpdGggTWF4Q2xpZW50cyBjaGFuZ2VzIGFjcm9zcyBTSUdVU1IxIHJlc3RhcnRzLiAgV2UgdXNlIHRoaXMKLSAqIHZhbHVlIHRvIG9wdGltaXplIHJvdXRpbmVzIHRoYXQgaGF2ZSB0byBzY2FuIHRoZSBlbnRpcmUgc2NvcmVib2FyZC4KLSAqLwotc3RhdGljIGludCBtYXhfZGFlbW9uc19saW1pdCA9IC0xOwotCi1zdGF0aWMgY2hhciBhcF9jb3JlZHVtcF9kaXJbTUFYX1NUUklOR19MRU5dOwotCi0vKiAqTm9uKi1zaGFyZWQgaHR0cF9tYWluIGdsb2JhbHMuLi4gKi8KLQotc3RhdGljIHNlcnZlcl9yZWMgKnNlcnZlcl9jb25mOwotCi0vKiBvbmVfcHJvY2VzcyAtLS0gZGVidWdnaW5nIG1vZGUgdmFyaWFibGU7IGNhbiBiZSBzZXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lCi0gKiB3aXRoIHRoZSAtWCBmbGFnLiAgSWYgc2V0LCB0aGlzIGdldHMgeW91IHRoZSBjaGlsZF9tYWluIGxvb3AgcnVubmluZwotICogaW4gdGhlIHByb2Nlc3Mgd2hpY2ggb3JpZ2luYWxseSBzdGFydGVkIHVwIChubyBkZXRhY2gsIG5vIG1ha2VfY2hpbGQpLAotICogd2hpY2ggaXMgYSBwcmV0dHkgbmljZSBkZWJ1Z2dpbmcgZW52aXJvbm1lbnQuICAoWW91J2xsIGdldCBhIFNJR0hVUAotICogZWFybHkgaW4gc3RhbmRhbG9uZV9tYWluOyBqdXN0IGNvbnRpbnVlIHRocm91Z2guICBUaGlzIGlzIHRoZSBzZXJ2ZXIKLSAqIHRyeWluZyB0byBraWxsIG9mZiBhbnkgY2hpbGQgcHJvY2Vzc2VzIHdoaWNoIGl0IG1pZ2h0IGhhdmUgbHlpbmcKLSAqIGFyb3VuZCAtLS0gQXBhY2hlIGRvZXNuJ3Qga2VlcCB0cmFjayBvZiB0aGVpciBwaWRzLCBpdCBqdXN0IHNlbmRzCi0gKiBTSUdIVVAgdG8gdGhlIHByb2Nlc3MgZ3JvdXAsIGlnbm9yaW5nIGl0IGluIHRoZSByb290IHByb2Nlc3MuCi0gKiBDb250aW51ZSB0aHJvdWdoIGFuZCB5b3UnbGwgYmUgZmluZS4pLgotICovCi0KLXN0YXRpYyBpbnQgb25lX3Byb2Nlc3MgPSAwOwotCi0jaWZkZWYgSEFTX09USEVSX0NISUxECi0vKiB1c2VkIHRvIG1haW50YWluIGxpc3Qgb2YgY2hpbGRyZW4gd2hpY2ggYXJlbid0IHBhcnQgb2YgdGhlIHNjb3JlYm9hcmQgKi8KLXR5cGVkZWYgc3RydWN0IG90aGVyX2NoaWxkX3JlYyBvdGhlcl9jaGlsZF9yZWM7Ci1zdHJ1Y3Qgb3RoZXJfY2hpbGRfcmVjIHsKLSAgICBvdGhlcl9jaGlsZF9yZWMgKm5leHQ7Ci0gICAgaW50IHBpZDsKLSAgICB2b2lkICgqbWFpbnRlbmFuY2UpIChpbnQsIHZvaWQgKiwgYXBfd2FpdF90KTsKLSAgICB2b2lkICpkYXRhOwotICAgIGludCB3cml0ZV9mZDsKLX07Ci1zdGF0aWMgb3RoZXJfY2hpbGRfcmVjICpvdGhlcl9jaGlsZHJlbjsKLSNlbmRpZgotCi1zdGF0aWMgYXBfY29udGV4dF90ICpwY29uZjsJCS8qIFBvb2wgZm9yIGNvbmZpZyBzdHVmZiAqLwotc3RhdGljIHNjb3JlYm9hcmQgKmFwX3Njb3JlYm9hcmRfaW1hZ2UgPSBOVUxMOwotCi1zdHJ1Y3QgdGhyZWFkX2dsb2JhbHMgewotICAgIGludCBjaGlsZF9udW07Ci0gICAgYXBfY29udGV4dF90ICpwY2hpbGQ7CQkvKiBQb29sIGZvciBodHRwZCBjaGlsZCBzdHVmZiAqLwotICAgIGludCB1c3IxX2p1c3RfZGllOwotfTsKLQotc3RhdGljIHN0cnVjdCB0aHJlYWRfZ2xvYmFscyAqKnBwdGhyZWFkX2dsb2JhbHMgPSBOVUxMOwotCi0jZGVmaW5lIFRIUkVBRF9HTE9CQUwoZ3ZhcikgKCgqcHB0aHJlYWRfZ2xvYmFscyktPmd2YXIpCi0KLQotdm9pZCByZWluaXRfc2NvcmVib2FyZChhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UgPT0gTlVMTCkgewotICAgICAgICBhcF9zY29yZWJvYXJkX2ltYWdlID0gKHNjb3JlYm9hcmQgKikgbWFsbG9jKFNDT1JFQk9BUkRfU0laRSk7Ci0KLSAgICAgICAgaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UgPT0gTlVMTCkgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAiT3VjaCEgT3V0IG9mIG1lbW9yeSByZWluaXRpbmcgc2NvcmVib2FyZCEiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1lbXNldChhcF9zY29yZWJvYXJkX2ltYWdlLCAwLCBTQ09SRUJPQVJEX1NJWkUpOwotfQotCi12b2lkIGNsZWFudXBfc2NvcmVib2FyZCh2b2lkKQotewotICAgIGFwX2Fzc2VydChhcF9zY29yZWJvYXJkX2ltYWdlKTsKLSAgICBmcmVlKGFwX3Njb3JlYm9hcmRfaW1hZ2UpOwotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UgPSBOVUxMOwotfQotCi0KLS8qIGEgY2xlYW4gZXhpdCBmcm9tIGEgY2hpbGQgd2l0aCBwcm9wZXIgY2xlYW51cCAqLwotc3RhdGljIHZvaWQgY2xlYW5fY2hpbGRfZXhpdChpbnQgY29kZSkKLXsKLSAgICBpZiAoVEhSRUFEX0dMT0JBTChwY2hpbGQpKSB7Ci0gICAgICAgIGFwX2Rlc3Ryb3lfcG9vbChUSFJFQURfR0xPQkFMKHBjaGlsZCkpOwotICAgIH0KLQotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbVEhSRUFEX0dMT0JBTChjaGlsZF9udW0pXS50aHJlYWRfcmV0dmFsID0gY29kZTsKLSAgICBfZW5kdGhyZWFkKCk7Ci19Ci0KLQotCi1zdGF0aWMgSE1UWCBsb2NrX3NlbSA9IC0xOwotCi1zdGF0aWMgYXBfc3RhdHVzX3QgYWNjZXB0X211dGV4X2NsZWFudXAodm9pZCAqZm9vKQotewotICAgIERvc1JlbGVhc2VNdXRleFNlbShsb2NrX3NlbSk7Ci0gICAgRG9zQ2xvc2VNdXRleFNlbShsb2NrX3NlbSk7Ci0gICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotfQotCi0vKgotICogSW5pdGlhbGl6ZSBtdXRleCBsb2NrLgotICogRG9uZSBieSBlYWNoIGNoaWxkIGF0IGl0J3MgYmlydGgKLSAqLwotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X2NoaWxkX2luaXQoYXBfY29udGV4dF90ICpwKQotewotICAgIGludCByYyA9IERvc09wZW5NdXRleFNlbShOVUxMLCAmbG9ja19zZW0pOwotCi0gICAgaWYgKHJjICE9IDApIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FTUVSRywgMCwgc2VydmVyX2NvbmYsCi0JCSAgICAiQ2hpbGQgY2Fubm90IG9wZW4gbG9jayBzZW1hcGhvcmUsIHJjPSVkIiwgcmMpOwotCWNsZWFuX2NoaWxkX2V4aXQoQVBFWElUX0NISUxESU5JVCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXBfcmVnaXN0ZXJfY2xlYW51cChwLCBOVUxMLCBhY2NlcHRfbXV0ZXhfY2xlYW51cCwgYXBfbnVsbF9jbGVhbnVwKTsKLSAgICB9Ci19Ci0KLS8qCi0gKiBJbml0aWFsaXplIG11dGV4IGxvY2suCi0gKiBNdXN0IGJlIHNhZmUgdG8gY2FsbCB0aGlzIG9uIGEgcmVzdGFydC4KLSAqLwotc3RhdGljIHZvaWQgYWNjZXB0X211dGV4X2luaXQoYXBfY29udGV4dF90ICpwKQotewotICAgIGludCByYyA9IERvc0NyZWF0ZU11dGV4U2VtKE5VTEwsICZsb2NrX3NlbSwgRENfU0VNX1NIQVJFRCwgRkFMU0UpOwotICAgIAotICAgIGlmIChyYyAhPSAwKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRU1FUkcsIDAsIHNlcnZlcl9jb25mLAotCQkgICAgIlBhcmVudCBjYW5ub3QgY3JlYXRlIGxvY2sgc2VtYXBob3JlLCByYz0lZCIsIHJjKTsKLQlleGl0KEFQRVhJVF9JTklUKTsKLSAgICB9Ci0KLSAgICBhcF9yZWdpc3Rlcl9jbGVhbnVwKHAsIE5VTEwsIGFjY2VwdF9tdXRleF9jbGVhbnVwLCBhcF9udWxsX2NsZWFudXApOwotfQotCi1zdGF0aWMgdm9pZCBhY2NlcHRfbXV0ZXhfb24odm9pZCkKLXsKLSAgICBpbnQgcmMgPSBEb3NSZXF1ZXN0TXV0ZXhTZW0obG9ja19zZW0sIFNFTV9JTkRFRklOSVRFX1dBSVQpOwotCi0gICAgaWYgKHJjICE9IDApIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FTUVSRywgMCwgc2VydmVyX2NvbmYsCi0JCSAgICAiT1MyU0VNOiBFcnJvciAlZCBnZXR0aW5nIGFjY2VwdCBsb2NrLiBFeGl0aW5nISIsIHJjKTsKLQljbGVhbl9jaGlsZF9leGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGFjY2VwdF9tdXRleF9vZmYodm9pZCkKLXsKLSAgICBpbnQgcmMgPSBEb3NSZWxlYXNlTXV0ZXhTZW0obG9ja19zZW0pOwotICAgIAotICAgIGlmIChyYyAhPSAwKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRU1FUkcsIDAsIHNlcnZlcl9jb25mLAotCQkgICAgIk9TMlNFTTogRXJyb3IgJWQgZnJlZWluZyBhY2NlcHQgbG9jay4gRXhpdGluZyEiLCByYyk7Ci0JY2xlYW5fY2hpbGRfZXhpdChBUEVYSVRfQ0hJTERGQVRBTCk7Ci0gICAgfQotfQotCi0KLQotLyogT24gc29tZSBhcmNoaXRlY3R1cmVzIGl0J3Mgc2FmZSB0byBkbyB1bnNlcmlhbGl6ZWQgYWNjZXB0KClzIGluIHRoZSBzaW5nbGUKLSAqIExpc3RlbiBjYXNlLiAgQnV0IGl0J3MgbmV2ZXIgc2FmZSB0byBkbyBpdCBpbiB0aGUgY2FzZSB3aGVyZSB0aGVyZSdzCi0gKiBtdWx0aXBsZSBMaXN0ZW4gc3RhdGVtZW50cy4gIERlZmluZSBTSU5HTEVfTElTVEVOX1VOU0VSSUFMSVpFRF9BQ0NFUFQKLSAqIHdoZW4gaXQncyBzYWZlIGluIHRoZSBzaW5nbGUgTGlzdGVuIGNhc2UuCi0gKi8KLSNpZmRlZiBTSU5HTEVfTElTVEVOX1VOU0VSSUFMSVpFRF9BQ0NFUFQKLSNkZWZpbmUgU0FGRV9BQ0NFUFQoc3RtdCkgZG8ge2lmIChhcF9saXN0ZW5lcnMtPm5leHQpIHtzdG10O319IHdoaWxlKDApCi0jZWxzZQotI2RlZmluZSBTQUZFX0FDQ0VQVChzdG10KSBkbyB7c3RtdDt9IHdoaWxlKDApCi0jZW5kaWYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGRlYWxpbmcgd2l0aCBvdGhlciBjaGlsZHJlbgotICovCi0KLSNpZmRlZiBIQVNfT1RIRVJfQ0hJTEQKLUFQSV9FWFBPUlQodm9pZCkgYXBfcmVnaXN0ZXJfb3RoZXJfY2hpbGQoaW50IHBpZCwKLQkJICAgICAgIHZvaWQgKCptYWludGVuYW5jZSkgKGludCByZWFzb24sIHZvaWQgKiwgYXBfd2FpdF90IHN0YXR1cyksCi0JCQkgIHZvaWQgKmRhdGEsIGludCB3cml0ZV9mZCkKLXsKLSAgICBvdGhlcl9jaGlsZF9yZWMgKm9jcjsKLQotICAgIG9jciA9IGFwX3BhbGxvYyhwY29uZiwgc2l6ZW9mKCpvY3IpKTsKLSAgICBvY3ItPnBpZCA9IHBpZDsKLSAgICBvY3ItPm1haW50ZW5hbmNlID0gbWFpbnRlbmFuY2U7Ci0gICAgb2NyLT5kYXRhID0gZGF0YTsKLSAgICBvY3ItPndyaXRlX2ZkID0gd3JpdGVfZmQ7Ci0gICAgb2NyLT5uZXh0ID0gb3RoZXJfY2hpbGRyZW47Ci0gICAgb3RoZXJfY2hpbGRyZW4gPSBvY3I7Ci19Ci0KLS8qIG5vdGUgdGhhdCBzaW5jZSB0aGlzIGNhbiBiZSBjYWxsZWQgYnkgYSBtYWludGVuYW5jZSBmdW5jdGlvbiB3aGlsZSB3ZSdyZQotICogc2Nhbm5pbmcgdGhlIG90aGVyX2NoaWxkcmVuIGxpc3QsIGFsbCBzY2FubmVycyBzaG91bGQgcHJvdGVjdCB0aGVtc2VsZgotICogYnkgbG9hZGluZyBvY3ItPm5leHQgYmVmb3JlIGNhbGxpbmcgYW55IG1haW50ZW5hbmNlIGZ1bmN0aW9uLgotICovCi1BUElfRVhQT1JUKHZvaWQpIGFwX3VucmVnaXN0ZXJfb3RoZXJfY2hpbGQodm9pZCAqZGF0YSkKLXsKLSAgICBvdGhlcl9jaGlsZF9yZWMgKipwb2NyLCAqbm9jcjsKLQotICAgIGZvciAocG9jciA9ICZvdGhlcl9jaGlsZHJlbjsgKnBvY3I7IHBvY3IgPSAmKCpwb2NyKS0+bmV4dCkgewotCWlmICgoKnBvY3IpLT5kYXRhID09IGRhdGEpIHsKLQkgICAgbm9jciA9ICgqcG9jciktPm5leHQ7Ci0JICAgICgqKCpwb2NyKS0+bWFpbnRlbmFuY2UpIChPQ19SRUFTT05fVU5SRUdJU1RFUiwgKCpwb2NyKS0+ZGF0YSwgLTEpOwotCSAgICAqcG9jciA9IG5vY3I7Ci0JICAgIC8qIFhYWDogdW0sIHdlbGwgd2UndmUganVzdCB3YXN0ZWQgc29tZSBzcGFjZSBpbiBwY29uZiA/ICovCi0JICAgIHJldHVybjsKLQl9Ci0gICAgfQotfQotCi0vKiB0ZXN0IHRvIGVuc3VyZSB0aGF0IHRoZSB3cml0ZV9mZHMgYXJlIGFsbCBzdGlsbCB3cml0YWJsZSwgb3RoZXJ3aXNlCi0gKiBpbnZva2UgdGhlIG1haW50ZW5hbmNlIGZ1bmN0aW9ucyBhcyBhcHByb3ByaWF0ZSAqLwotc3RhdGljIHZvaWQgcHJvYmVfd3JpdGFibGVfZmRzKHZvaWQpCi17Ci0gICAgZmRfc2V0IHdyaXRhYmxlX2ZkczsKLSAgICBpbnQgZmRfbWF4OwotICAgIG90aGVyX2NoaWxkX3JlYyAqb2NyLCAqbm9jcjsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSAgICBpbnQgcmM7Ci0KLSAgICBpZiAob3RoZXJfY2hpbGRyZW4gPT0gTlVMTCkKLQlyZXR1cm47Ci0KLSAgICBmZF9tYXggPSAwOwotICAgIEZEX1pFUk8oJndyaXRhYmxlX2Zkcyk7Ci0gICAgZG8gewotCWZvciAob2NyID0gb3RoZXJfY2hpbGRyZW47IG9jcjsgb2NyID0gb2NyLT5uZXh0KSB7Ci0JICAgIGlmIChvY3ItPndyaXRlX2ZkID09IC0xKQotCQljb250aW51ZTsKLQkgICAgRkRfU0VUKG9jci0+d3JpdGVfZmQsICZ3cml0YWJsZV9mZHMpOwotCSAgICBpZiAob2NyLT53cml0ZV9mZCA+IGZkX21heCkgewotCQlmZF9tYXggPSBvY3ItPndyaXRlX2ZkOwotCSAgICB9Ci0JfQotCWlmIChmZF9tYXggPT0gMCkKLQkgICAgcmV0dXJuOwotCi0JdHYudHZfc2VjID0gMDsKLQl0di50dl91c2VjID0gMDsKLQlyYyA9IGFwX3NlbGVjdChmZF9tYXggKyAxLCBOVUxMLCAmd3JpdGFibGVfZmRzLCBOVUxMLCAmdHYpOwotICAgIH0gd2hpbGUgKHJjID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgIGlmIChyYyA9PSAtMSkgewotCS8qIFhYWDogdWhoIHRoaXMgY291bGQgYmUgcmVhbGx5IGJhZCwgd2UgY291bGQgaGF2ZSBhIGJhZCBmaWxlCi0JICogZGVzY3JpcHRvciBkdWUgdG8gYSBidWcgaW4gb25lIG9mIHRoZSBtYWludGVuYW5jZSByb3V0aW5lcyAqLwotCWFwX2xvZ191bml4ZXJyKCJwcm9iZV93cml0YWJsZV9mZHMiLCAic2VsZWN0IiwKLQkJICAgICJjb3VsZCBub3QgcHJvYmUgd3JpdGFibGUgZmRzIiwgc2VydmVyX2NvbmYpOwotCXJldHVybjsKLSAgICB9Ci0gICAgaWYgKHJjID09IDApCi0JcmV0dXJuOwotCi0gICAgZm9yIChvY3IgPSBvdGhlcl9jaGlsZHJlbjsgb2NyOyBvY3IgPSBub2NyKSB7Ci0Jbm9jciA9IG9jci0+bmV4dDsKLQlpZiAob2NyLT53cml0ZV9mZCA9PSAtMSkKLQkgICAgY29udGludWU7Ci0JaWYgKEZEX0lTU0VUKG9jci0+d3JpdGVfZmQsICZ3cml0YWJsZV9mZHMpKQotCSAgICBjb250aW51ZTsKLQkoKm9jci0+bWFpbnRlbmFuY2UpIChPQ19SRUFTT05fVU5XUklUQUJMRSwgb2NyLT5kYXRhLCAtMSk7Ci0gICAgfQotfQotCi0vKiBwb3NzaWJseSByZWFwIGFuIG90aGVyX2NoaWxkLCByZXR1cm4gMCBpZiB5ZXMsIC0xIGlmIG5vdCAqLwotc3RhdGljIGludCByZWFwX290aGVyX2NoaWxkKGludCBwaWQsIGFwX3dhaXRfdCBzdGF0dXMpCi17Ci0gICAgb3RoZXJfY2hpbGRfcmVjICpvY3IsICpub2NyOwotCi0gICAgZm9yIChvY3IgPSBvdGhlcl9jaGlsZHJlbjsgb2NyOyBvY3IgPSBub2NyKSB7Ci0Jbm9jciA9IG9jci0+bmV4dDsKLQlpZiAob2NyLT5waWQgIT0gcGlkKQotCSAgICBjb250aW51ZTsKLQlvY3ItPnBpZCA9IC0xOwotCSgqb2NyLT5tYWludGVuYW5jZSkgKE9DX1JFQVNPTl9ERUFUSCwgb2NyLT5kYXRhLCBzdGF0dXMpOwotCXJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci0jZW5kaWYKLQotQVBJX0VYUE9SVChpbnQpIGFwX2V4aXN0c19zY29yZWJvYXJkX2ltYWdlKHZvaWQpCi17Ci0gICAgcmV0dXJuIChhcF9zY29yZWJvYXJkX2ltYWdlID8gMSA6IDApOwotfQotCi1pbnQgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhpbnQgY2hpbGRfbnVtLCBpbnQgc3RhdHVzLCByZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBpbnQgb2xkX3N0YXR1czsKLSAgICBzaG9ydF9zY29yZSAqc3M7Ci0KLSAgICBpZiAoY2hpbGRfbnVtIDwgMCkKLQlyZXR1cm4gLTE7Ci0KLSAgICBzcyA9ICZhcF9zY29yZWJvYXJkX2ltYWdlLT5zZXJ2ZXJzW2NoaWxkX251bV07Ci0gICAgb2xkX3N0YXR1cyA9IHNzLT5zdGF0dXM7Ci0gICAgc3MtPnN0YXR1cyA9IHN0YXR1czsKLQotICAgIGlmIChhcF9leHRlbmRlZF9zdGF0dXMpIHsKLQlpZiAoc3RhdHVzID09IFNFUlZFUl9SRUFEWSB8fCBzdGF0dXMgPT0gU0VSVkVSX0RFQUQpIHsKLQkgICAgLyoKLQkgICAgICogUmVzZXQgaW5kaXZpZHVhbCBjb3VudGVycwotCSAgICAgKi8KLQkgICAgaWYgKHN0YXR1cyA9PSBTRVJWRVJfREVBRCkgewotCQlzcy0+bXlfYWNjZXNzX2NvdW50ID0gMEw7Ci0JCXNzLT5teV9ieXRlc19zZXJ2ZWQgPSAwTDsKLQkgICAgfQotCSAgICBzcy0+Y29ubl9jb3VudCA9ICh1bnNpZ25lZCBzaG9ydCkgMDsKLQkgICAgc3MtPmNvbm5fYnl0ZXMgPSAodW5zaWduZWQgbG9uZykgMDsKLQl9Ci0JaWYgKHIpIHsKLQkgICAgY29ubl9yZWMgKmMgPSByLT5jb25uZWN0aW9uOwotCSAgICBhcF9jcHlzdHJuKHNzLT5jbGllbnQsIGFwX2dldF9yZW1vdGVfaG9zdChjLCByLT5wZXJfZGlyX2NvbmZpZywKLQkJCQkgIFJFTU9URV9OT0xPT0tVUCksIHNpemVvZihzcy0+Y2xpZW50KSk7Ci0JICAgIGlmIChyLT50aGVfcmVxdWVzdCA9PSBOVUxMKSB7Ci0JCSAgICBhcF9jcHlzdHJuKHNzLT5yZXF1ZXN0LCAiTlVMTCIsIHNpemVvZihzcy0+cmVxdWVzdCkpOwotCSAgICB9IGVsc2UgaWYgKHItPnBhcnNlZF91cmkucGFzc3dvcmQgPT0gTlVMTCkgewotCQkgICAgYXBfY3B5c3Rybihzcy0+cmVxdWVzdCwgci0+dGhlX3JlcXVlc3QsIHNpemVvZihzcy0+cmVxdWVzdCkpOwotCSAgICB9IGVsc2UgewotCQkvKiBEb24ndCByZXZlYWwgdGhlIHBhc3N3b3JkIGluIHRoZSBzZXJ2ZXItc3RhdHVzIHZpZXcgKi8KLQkJICAgIGFwX2NweXN0cm4oc3MtPnJlcXVlc3QsIGFwX3BzdHJjYXQoci0+cG9vbCwgci0+bWV0aG9kLCAiICIsCi0JCQkJCSAgICAgICBhcF91bnBhcnNlX3VyaV9jb21wb25lbnRzKHItPnBvb2wsICZyLT5wYXJzZWRfdXJpLCBVTlBfT01JVFBBU1NXT1JEKSwKLQkJCQkJICAgICAgIHItPmFzc2JhY2t3YXJkcyA/IE5VTEwgOiAiICIsIHItPnByb3RvY29sLCBOVUxMKSwKLQkJCQkgICAgICAgc2l6ZW9mKHNzLT5yZXF1ZXN0KSk7Ci0JICAgIH0KLQkgICAgc3MtPnZob3N0cmVjID0gIHItPnNlcnZlcjsKLQl9Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyA9PSBTRVJWRVJfU1RBUlRJTkcgJiYgciA9PSBOVUxMKSB7Ci0JLyogY2xlYW4gdXAgdGhlIHNsb3QncyB2aG9zdHJlYyBwb2ludGVyIChtYXliZSByZS11c2VkKQotCSAqIGFuZCBtYXJrIHRoZSBzbG90IGFzIGJlbG9uZ2luZyB0byBhIG5ldyBnZW5lcmF0aW9uLgotCSAqLwotCXNzLT52aG9zdHJlYyA9IE5VTEw7Ci0JYXBfc2NvcmVib2FyZF9pbWFnZS0+cGFyZW50W2NoaWxkX251bV0uZ2VuZXJhdGlvbiA9IGFwX3Njb3JlYm9hcmRfaW1hZ2UtPmdsb2JhbC5ydW5uaW5nX2dlbmVyYXRpb247Ci0gICAgfQotCi0gICAgcmV0dXJuIG9sZF9zdGF0dXM7Ci19Ci0KLXZvaWQgYXBfdGltZV9wcm9jZXNzX3JlcXVlc3QoaW50IGNoaWxkX251bSwgaW50IHN0YXR1cykKLXsKLSAgICBzaG9ydF9zY29yZSAqc3M7Ci0jaWYgIWRlZmluZWQoSEFWRV9HRVRUSU1FT0ZEQVkpICYmIGRlZmluZWQoSEFWRV9USU1FUykKLSAgICBzdHJ1Y3QgdG1zIHRtc19ibGs7Ci0jZW5kaWYKLQotICAgIGlmIChjaGlsZF9udW0gPCAwKQotCXJldHVybjsKLQotICAgIHNzID0gJmFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbY2hpbGRfbnVtXTsKLQotICAgIGlmIChzdGF0dXMgPT0gU1RBUlRfUFJFUVVFU1QpIHsKLSNpZiAhZGVmaW5lZChIQVZFX0dFVFRJTUVPRkRBWSkKLSNpZmRlZiBIQVZFX1RJTUVTCi0JaWYgKChzcy0+c3RhcnRfdGltZSA9IHRpbWVzKCZ0bXNfYmxrKSkgPT0gLTEpCi0jZW5kaWYgLyogSEFWRV9USU1FUyAqLwotCSAgICBzcy0+c3RhcnRfdGltZSA9IChjbG9ja190KSAwOwotI2Vsc2UKLQlpZiAoZ2V0dGltZW9mZGF5KCZzcy0+c3RhcnRfdGltZSwgKHN0cnVjdCB0aW1lem9uZSAqKSAwKSA8IDApCi0JICAgIHNzLT5zdGFydF90aW1lLnR2X3NlYyA9Ci0JCXNzLT5zdGFydF90aW1lLnR2X3VzZWMgPSAwTDsKLSNlbmRpZgotICAgIH0KLSAgICBlbHNlIGlmIChzdGF0dXMgPT0gU1RPUF9QUkVRVUVTVCkgewotI2lmICFkZWZpbmVkKEhBVkVfR0VUVElNRU9GREFZKQotI2lmZGVmIEhBVkVfVElNRVMKLQlpZiAoKHNzLT5zdG9wX3RpbWUgPSB0aW1lcygmdG1zX2JsaykpID09IC0xKQotI2VuZGlmCi0JICAgIHNzLT5zdG9wX3RpbWUgPSBzcy0+c3RhcnRfdGltZSA9IChjbG9ja190KSAwOwotI2Vsc2UKLQlpZiAoZ2V0dGltZW9mZGF5KCZzcy0+c3RvcF90aW1lLCAoc3RydWN0IHRpbWV6b25lICopIDApIDwgMCkKLQkgICAgc3MtPnN0b3BfdGltZS50dl9zZWMgPQotCQlzcy0+c3RvcF90aW1lLnR2X3VzZWMgPQotCQlzcy0+c3RhcnRfdGltZS50dl9zZWMgPQotCQlzcy0+c3RhcnRfdGltZS50dl91c2VjID0gMEw7Ci0jZW5kaWYKLQotICAgIH0KLX0KLQotLyogVE9ETzogY2FsbCBtZSBzb21lIHRpbWUgKi8KLXN0YXRpYyB2b2lkIGluY3JlbWVudF9jb3VudHMoaW50IGNoaWxkX251bSwgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgbG9uZyBpbnQgYnMgPSAwOwotICAgIHNob3J0X3Njb3JlICpzczsKLQotICAgIHNzID0gJmFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbY2hpbGRfbnVtXTsKLQotICAgIGlmIChyLT5zZW50X2JvZHljdCkKLQlhcF9iZ2V0b3B0KHItPmNvbm5lY3Rpb24tPmNsaWVudCwgQk9fQllURUNULCAmYnMpOwotCi0jaWZkZWYgSEFWRV9USU1FUwotICAgIHRpbWVzKCZzcy0+dGltZXMpOwotI2VuZGlmCi0gICAgc3MtPmFjY2Vzc19jb3VudCsrOwotICAgIHNzLT5teV9hY2Nlc3NfY291bnQrKzsKLSAgICBzcy0+Y29ubl9jb3VudCsrOwotICAgIHNzLT5ieXRlc19zZXJ2ZWQgKz0gKHVuc2lnbmVkIGxvbmcpIGJzOwotICAgIHNzLT5teV9ieXRlc19zZXJ2ZWQgKz0gKHVuc2lnbmVkIGxvbmcpIGJzOwotICAgIHNzLT5jb25uX2J5dGVzICs9ICh1bnNpZ25lZCBsb25nKSBiczsKLX0KLQotc3RhdGljIGludCBmaW5kX2NoaWxkX2J5X3RpZChpbnQgdGlkKQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG1heF9kYWVtb25zX2xpbWl0OyArK2kpCi0JaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtpXS50aWQgPT0gdGlkKQotCSAgICByZXR1cm4gaTsKLQotICAgIHJldHVybiAtMTsKLX0KLQotLyogRmluYWxseSwgdGhpcyByb3V0aW5lIGlzIHVzZWQgYnkgdGhlIGNhcmV0YWtlciB0aHJlYWQgdG8gd2FpdCBmb3IKLSAqIGEgd2hpbGUuLi4KLSAqLwotCi0vKiBudW1iZXIgb2YgY2FsbHMgdG8gd2FpdF9vcl90aW1lb3V0IGJldHdlZW4gd3JpdGFibGUgcHJvYmVzICovCi0jaWZuZGVmIElOVEVSVkFMX09GX1dSSVRBQkxFX1BST0JFUwotI2RlZmluZSBJTlRFUlZBTF9PRl9XUklUQUJMRV9QUk9CRVMgMTAKLSNlbmRpZgotc3RhdGljIGludCB3YWl0X29yX3RpbWVvdXRfY291bnRlcjsKLQotc3RhdGljIGludCB3YWl0X29yX3RpbWVvdXQoYXBfd2FpdF90ICpzdGF0dXMpCi17Ci0gICAgaW50IHJldDsKLSAgICBVTE9ORyB0aWQ7Ci0KLSAgICArK3dhaXRfb3JfdGltZW91dF9jb3VudGVyOwotICAgIGlmICh3YWl0X29yX3RpbWVvdXRfY291bnRlciA9PSBJTlRFUlZBTF9PRl9XUklUQUJMRV9QUk9CRVMpIHsKLQl3YWl0X29yX3RpbWVvdXRfY291bnRlciA9IDA7Ci0jaWZkZWYgSEFTX09USEVSX0NISUxECi0JcHJvYmVfd3JpdGFibGVfZmRzKCk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICB0aWQgPSAwOwotICAgIHJldCA9IERvc1dhaXRUaHJlYWQoJnRpZCwgRENXV19OT1dBSVQpOwotCi0gICAgaWYgKHJldCA9PSAwKSB7Ci0gICAgICAgIGludCBjaGlsZF9udW0gPSBmaW5kX2NoaWxkX2J5X3RpZCh0aWQpOwotICAgICAgICBhcF9hc3NlcnQoIGNoaWxkX251bSA+IDAgKTsKLSAgICAgICAgKnN0YXR1cyA9IGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbY2hpbGRfbnVtXS50aHJlYWRfcmV0dmFsOwotCXJldHVybiB0aWQ7Ci0gICAgfQotICAgIAotICAgIERvc1NsZWVwKFNDT1JFQk9BUkRfTUFJTlRFTkFOQ0VfSU5URVJWQUwgLyAxMDAwKTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLQotI2lmIGRlZmluZWQoTlNJRykKLSNkZWZpbmUgTnVtU0lHIE5TSUcKLSNlbGlmIGRlZmluZWQoX05TSUcpCi0jZGVmaW5lIE51bVNJRyBfTlNJRwotI2VsaWYgZGVmaW5lZChfX05TSUcpCi0jZGVmaW5lIE51bVNJRyBfX05TSUcKLSNlbHNlCi0jZGVmaW5lIE51bVNJRyAzMiAgIC8qIGZvciAxOTk4J3MgdW5peGVzLCB0aGlzIGlzIHN0aWxsIGEgZ29vZCBhc3N1bXB0aW9uICovCi0jZW5kaWYKLQotI2lmZGVmIFNZU19TSUdMSVNUIC8qIHBsYXRmb3JtIGhhcyBzeXNfc2lnbGlzdFtdICovCi0jZGVmaW5lIElOSVRfU0lHTElTVCgpICAvKm5vdGhpbmcqLwotI2Vsc2UgLyogcGxhdGZvcm0gaGFzIG5vIHN5c19zaWdsaXN0W10sIGRlZmluZSBvdXIgb3duICovCi0jZGVmaW5lIFNZU19TSUdMSVNUIGFwX3N5c19zaWdsaXN0Ci0jZGVmaW5lIElOSVRfU0lHTElTVCgpIHNpZ2xpc3RfaW5pdCgpOwotCi1jb25zdCBjaGFyICphcF9zeXNfc2lnbGlzdFtOdW1TSUddOwotCi1zdGF0aWMgdm9pZCBzaWdsaXN0X2luaXQodm9pZCkKLXsKLSAgICBpbnQgc2lnOwotCi0gICAgYXBfc3lzX3NpZ2xpc3RbMF0gPSAiU2lnbmFsIDAiOwotI2lmZGVmIFNJR0hVUAotICAgIGFwX3N5c19zaWdsaXN0W1NJR0hVUF0gPSAiSGFuZ3VwIjsKLSNlbmRpZgotI2lmZGVmIFNJR0lOVAotICAgIGFwX3N5c19zaWdsaXN0W1NJR0lOVF0gPSAiSW50ZXJydXB0IjsKLSNlbmRpZgotI2lmZGVmIFNJR1FVSVQKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdRVUlUXSA9ICJRdWl0IjsKLSNlbmRpZgotI2lmZGVmIFNJR0lMTAotICAgIGFwX3N5c19zaWdsaXN0W1NJR0lMTF0gPSAiSWxsZWdhbCBpbnN0cnVjdGlvbiI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdUUkFQCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHVFJBUF0gPSAiVHJhY2UvQlBUIHRyYXAiOwotI2VuZGlmCi0jaWZkZWYgU0lHSU9UCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHSU9UXSA9ICJJT1QgaW5zdHJ1Y3Rpb24iOwotI2VuZGlmCi0jaWZkZWYgU0lHQUJSVAotICAgIGFwX3N5c19zaWdsaXN0W1NJR0FCUlRdID0gIkFib3J0IjsKLSNlbmRpZgotI2lmZGVmIFNJR0VNVAotICAgIGFwX3N5c19zaWdsaXN0W1NJR0VNVF0gPSAiRW11bGF0b3IgdHJhcCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdGUEUKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdGUEVdID0gIkFyaXRobWV0aWMgZXhjZXB0aW9uIjsKLSNlbmRpZgotI2lmZGVmIFNJR0tJTEwKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdLSUxMXSA9ICJLaWxsZWQiOwotI2VuZGlmCi0jaWZkZWYgU0lHQlVTCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHQlVTXSA9ICJCdXMgZXJyb3IiOwotI2VuZGlmCi0jaWZkZWYgU0lHU0VHVgotICAgIGFwX3N5c19zaWdsaXN0W1NJR1NFR1ZdID0gIlNlZ21lbnRhdGlvbiBmYXVsdCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdTWVMKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdTWVNdID0gIkJhZCBzeXN0ZW0gY2FsbCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdQSVBFCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHUElQRV0gPSAiQnJva2VuIHBpcGUiOwotI2VuZGlmCi0jaWZkZWYgU0lHQUxSTQotICAgIGFwX3N5c19zaWdsaXN0W1NJR0FMUk1dID0gIkFsYXJtIGNsb2NrIjsKLSNlbmRpZgotI2lmZGVmIFNJR1RFUk0KLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdURVJNXSA9ICJUZXJtaW5hdGVkIjsKLSNlbmRpZgotI2lmZGVmIFNJR1VTUjEKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdVU1IxXSA9ICJVc2VyIGRlZmluZWQgc2lnbmFsIDEiOwotI2VuZGlmCi0jaWZkZWYgU0lHVVNSMgotICAgIGFwX3N5c19zaWdsaXN0W1NJR1VTUjJdID0gIlVzZXIgZGVmaW5lZCBzaWduYWwgMiI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdDTEQKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdDTERdID0gIkNoaWxkIHN0YXR1cyBjaGFuZ2UiOwotI2VuZGlmCi0jaWZkZWYgU0lHQ0hMRAotICAgIGFwX3N5c19zaWdsaXN0W1NJR0NITERdID0gIkNoaWxkIHN0YXR1cyBjaGFuZ2UiOwotI2VuZGlmCi0jaWZkZWYgU0lHUFdSCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHUFdSXSA9ICJQb3dlci1mYWlsIHJlc3RhcnQiOwotI2VuZGlmCi0jaWZkZWYgU0lHV0lOQ0gKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdXSU5DSF0gPSAiV2luZG93IGNoYW5nZWQiOwotI2VuZGlmCi0jaWZkZWYgU0lHVVJHCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHVVJHXSA9ICJ1cmdlbnQgc29ja2V0IGNvbmRpdGlvbiI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdQT0xMCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHUE9MTF0gPSAiUG9sbGFibGUgZXZlbnQgb2NjdXJyZWQiOwotI2VuZGlmCi0jaWZkZWYgU0lHSU8KLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdJT10gPSAic29ja2V0IEkvTyBwb3NzaWJsZSI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdTVE9QCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHU1RPUF0gPSAiU3RvcHBlZCAoc2lnbmFsKSI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdUU1RQCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHVFNUUF0gPSAiU3RvcHBlZCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdDT05UCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHQ09OVF0gPSAiQ29udGludWVkIjsKLSNlbmRpZgotI2lmZGVmIFNJR1RUSU4KLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdUVElOXSA9ICJTdG9wcGVkICh0dHkgaW5wdXQpIjsKLSNlbmRpZgotI2lmZGVmIFNJR1RUT1UKLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdUVE9VXSA9ICJTdG9wcGVkICh0dHkgb3V0cHV0KSI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdWVEFMUk0KLSAgICBhcF9zeXNfc2lnbGlzdFtTSUdWVEFMUk1dID0gInZpcnR1YWwgdGltZXIgZXhwaXJlZCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdQUk9GCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHUFJPRl0gPSAicHJvZmlsaW5nIHRpbWVyIGV4cGlyZWQiOwotI2VuZGlmCi0jaWZkZWYgU0lHWENQVQotICAgIGFwX3N5c19zaWdsaXN0W1NJR1hDUFVdID0gImV4Y2VlZGVkIGNwdSBsaW1pdCI7Ci0jZW5kaWYKLSNpZmRlZiBTSUdYRlNaCi0gICAgYXBfc3lzX3NpZ2xpc3RbU0lHWEZTWl0gPSAiZXhjZWVkZWQgZmlsZSBzaXplIGxpbWl0IjsKLSNlbmRpZgotICAgIGZvciAoc2lnPTA7IHNpZyA8IHNpemVvZihhcF9zeXNfc2lnbGlzdCkvc2l6ZW9mKGFwX3N5c19zaWdsaXN0WzBdKTsgKytzaWcpCi0gICAgICAgIGlmIChhcF9zeXNfc2lnbGlzdFtzaWddID09IE5VTEwpCi0gICAgICAgICAgICBhcF9zeXNfc2lnbGlzdFtzaWddID0gIiI7Ci19Ci0jZW5kaWYgLyogcGxhdGZvcm0gaGFzIHN5c19zaWdsaXN0W10gKi8KLQotCi0vKiBoYW5kbGUgYWxsIHZhcmlldGllcyBvZiBjb3JlIGR1bXBpbmcgc2lnbmFscyAqLwotc3RhdGljIHZvaWQgc2lnX2NvcmVkdW1wKGludCBzaWcpCi17Ci0gICAgY2hkaXIoYXBfY29yZWR1bXBfZGlyKTsKLSAgICBzaWduYWwoc2lnLCBTSUdfREZMKTsKLSAgICBraWxsKGdldHBpZCgpLCBzaWcpOwotICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UndmUgZ290IHNpZyBibG9ja2VkLCBiZWNhdXNlIHdlJ3JlIHN0aWxsIGluc2lkZQotICAgICAqIHRoZSBzaWduYWwgaGFuZGxlci4gIFdoZW4gd2UgbGVhdmUgdGhlIHNpZ25hbCBoYW5kbGVyIGl0IHdpbGwKLSAgICAgKiBiZSB1bmJsb2NrZWQsIGFuZCB3ZSdsbCB0YWtlIHRoZSBzaWduYWwuLi4gYW5kIGNvcmVkdW1wIG9yIHdoYXRldmVyCi0gICAgICogaXMgYXBwcm9wcmlhdGUgZm9yIHRoaXMgcGFydGljdWxhciBVbml4LiAgSW4gYWRkaXRpb24gdGhlIHBhcmVudAotICAgICAqIHdpbGwgc2VlIHRoZSByZWFsIHNpZ25hbCB3ZSByZWNlaXZlZCAtLSB3aGVyZWFzIGlmIHdlIGNhbGxlZAotICAgICAqIGFib3J0KCkgaGVyZSwgdGhlIHBhcmVudCB3b3VsZCBvbmx5IHNlZSBTSUdBQlJULgotICAgICAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbm5lY3Rpb24gc3RydWN0dXJlcyBhbmQgYWNjb3VudGluZy4uLgotICovCi0KLXN0YXRpYyB2b2lkIGp1c3RfZGllKGludCBzaWcpCi17Ci0gICAgY2xlYW5fY2hpbGRfZXhpdCgwKTsKLX0KLQotCi1zdGF0aWMgdm9pZCB1c3IxX2hhbmRsZXIoaW50IHNpZykKLXsKLSAgICBpZiAoVEhSRUFEX0dMT0JBTCh1c3IxX2p1c3RfZGllKSkgewotCWp1c3RfZGllKHNpZyk7Ci0gICAgfQotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtUSFJFQURfR0xPQkFMKGNoaWxkX251bSldLmRlZmVycmVkX2RpZSA9IDE7Ci19Ci0KLS8qIHZvbGF0aWxlIGp1c3QgaW4gY2FzZSAqLwotc3RhdGljIGludCB2b2xhdGlsZSBzaHV0ZG93bl9wZW5kaW5nOwotc3RhdGljIGludCB2b2xhdGlsZSByZXN0YXJ0X3BlbmRpbmc7Ci1zdGF0aWMgaW50IHZvbGF0aWxlIGlzX2dyYWNlZnVsOwotCi1zdGF0aWMgdm9pZCBzaWdfdGVybShpbnQgc2lnKQotewotICAgIGlmIChzaHV0ZG93bl9wZW5kaW5nID09IDEpIHsKLQkvKiBVbSwgaXMgdGhpcyBfcHJvYmFibHlfIG5vdCBhbiBlcnJvciwgaWYgdGhlIHVzZXIgaGFzCi0JICogdHJpZWQgdG8gZG8gYSBzaHV0ZG93biB0d2ljZSBxdWlja2x5LCBzbyB3ZSB3b24ndAotCSAqIHdvcnJ5IGFib3V0IHJlcG9ydGluZyBpdC4KLQkgKi8KLQlyZXR1cm47Ci0gICAgfQotICAgIHNodXRkb3duX3BlbmRpbmcgPSAxOwotfQotCi1zdGF0aWMgdm9pZCByZXN0YXJ0KGludCBzaWcpCi17Ci0gICAgaWYgKHJlc3RhcnRfcGVuZGluZyA9PSAxKSB7Ci0JLyogUHJvYmFibHkgbm90IGFuIGVycm9yIC0gZG9uJ3QgYm90aGVyIHJlcG9ydGluZyBpdCAqLwotCXJldHVybjsKLSAgICB9Ci0gICAgcmVzdGFydF9wZW5kaW5nID0gMTsKLSAgICBpc19ncmFjZWZ1bCA9IHNpZyA9PSBTSUdVU1IxOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfc2lnbmFscyh2b2lkKQotewotI2lmbmRlZiBOT19VU0VfU0lHQUNUSU9OCi0gICAgc3RydWN0IHNpZ2FjdGlvbiBzYTsKLQotICAgIHNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsKLSAgICBzYS5zYV9mbGFncyA9IDA7Ci0KLSAgICBpZiAoIW9uZV9wcm9jZXNzKSB7Ci0Jc2Euc2FfaGFuZGxlciA9IHNpZ19jb3JlZHVtcDsKLSNpZiBkZWZpbmVkKFNBX09ORVNIT1QpCi0Jc2Euc2FfZmxhZ3MgPSBTQV9PTkVTSE9UOwotI2VsaWYgZGVmaW5lZChTQV9SRVNFVEhBTkQpCi0Jc2Euc2FfZmxhZ3MgPSBTQV9SRVNFVEhBTkQ7Ci0jZW5kaWYKLQlpZiAoc2lnYWN0aW9uKFNJR1NFR1YsICZzYSwgTlVMTCkgPCAwKQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR1NFR1YpIik7Ci0jaWZkZWYgU0lHQlVTCi0JaWYgKHNpZ2FjdGlvbihTSUdCVVMsICZzYSwgTlVMTCkgPCAwKQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR0JVUykiKTsKLSNlbmRpZgotI2lmZGVmIFNJR0FCT1JUCi0JaWYgKHNpZ2FjdGlvbihTSUdBQk9SVCwgJnNhLCBOVUxMKSA8IDApCi0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHQUJPUlQpIik7Ci0jZW5kaWYKLSNpZmRlZiBTSUdBQlJUCi0JaWYgKHNpZ2FjdGlvbihTSUdBQlJULCAmc2EsIE5VTEwpIDwgMCkKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdBQlJUKSIpOwotI2VuZGlmCi0jaWZkZWYgU0lHSUxMCi0JaWYgKHNpZ2FjdGlvbihTSUdJTEwsICZzYSwgTlVMTCkgPCAwKQotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR0lMTCkiKTsKLSNlbmRpZgotCXNhLnNhX2ZsYWdzID0gMDsKLSAgICB9Ci0gICAgc2Euc2FfaGFuZGxlciA9IHNpZ190ZXJtOwotICAgIGlmIChzaWdhY3Rpb24oU0lHVEVSTSwgJnNhLCBOVUxMKSA8IDApCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdURVJNKSIpOwotI2lmZGVmIFNJR0lOVAotICAgIGlmIChzaWdhY3Rpb24oU0lHSU5ULCAmc2EsIE5VTEwpIDwgMCkKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIGVycm5vLCBzZXJ2ZXJfY29uZiwgInNpZ2FjdGlvbihTSUdJTlQpIik7Ci0jZW5kaWYKLSNpZmRlZiBTSUdYQ1BVCi0gICAgc2Euc2FfaGFuZGxlciA9IFNJR19ERkw7Ci0gICAgaWYgKHNpZ2FjdGlvbihTSUdYQ1BVLCAmc2EsIE5VTEwpIDwgMCkKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR1hDUFUpIik7Ci0jZW5kaWYKLSNpZmRlZiBTSUdYRlNaCi0gICAgc2Euc2FfaGFuZGxlciA9IFNJR19ERkw7Ci0gICAgaWYgKHNpZ2FjdGlvbihTSUdYRlNaLCAmc2EsIE5VTEwpIDwgMCkKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR1hGU1opIik7Ci0jZW5kaWYKLSNpZmRlZiBTSUdQSVBFCi0gICAgc2Euc2FfaGFuZGxlciA9IFNJR19JR047Ci0gICAgaWYgKHNpZ2FjdGlvbihTSUdQSVBFLCAmc2EsIE5VTEwpIDwgMCkKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR1BJUEUpIik7Ci0jZW5kaWYKLQotICAgIC8qIHdlIHdhbnQgdG8gaWdub3JlIEhVUHMgYW5kIFVTUjEgd2hpbGUgd2UncmUgYnVzeSBwcm9jZXNzaW5nIG9uZSAqLwotICAgIHNpZ2FkZHNldCgmc2Euc2FfbWFzaywgU0lHSFVQKTsKLSAgICBzaWdhZGRzZXQoJnNhLnNhX21hc2ssIFNJR1VTUjEpOwotICAgIHNhLnNhX2hhbmRsZXIgPSByZXN0YXJ0OwotICAgIGlmIChzaWdhY3Rpb24oU0lHSFVQLCAmc2EsIE5VTEwpIDwgMCkKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgZXJybm8sIHNlcnZlcl9jb25mLCAic2lnYWN0aW9uKFNJR0hVUCkiKTsKLSAgICBpZiAoc2lnYWN0aW9uKFNJR1VTUjEsICZzYSwgTlVMTCkgPCAwKQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBlcnJubywgc2VydmVyX2NvbmYsICJzaWdhY3Rpb24oU0lHVVNSMSkiKTsKLSNlbHNlCi0gICAgaWYgKCFvbmVfcHJvY2VzcykgewotCXNpZ25hbChTSUdTRUdWLCBzaWdfY29yZWR1bXApOwotI2lmZGVmIFNJR0JVUwotCXNpZ25hbChTSUdCVVMsIHNpZ19jb3JlZHVtcCk7Ci0jZW5kaWYgLyogU0lHQlVTICovCi0jaWZkZWYgU0lHQUJPUlQKLQlzaWduYWwoU0lHQUJPUlQsIHNpZ19jb3JlZHVtcCk7Ci0jZW5kaWYgLyogU0lHQUJPUlQgKi8KLSNpZmRlZiBTSUdBQlJUCi0Jc2lnbmFsKFNJR0FCUlQsIHNpZ19jb3JlZHVtcCk7Ci0jZW5kaWYgLyogU0lHQUJSVCAqLwotI2lmZGVmIFNJR0lMTAotCXNpZ25hbChTSUdJTEwsIHNpZ19jb3JlZHVtcCk7Ci0jZW5kaWYgLyogU0lHSUxMICovCi0jaWZkZWYgU0lHWENQVQotCXNpZ25hbChTSUdYQ1BVLCBTSUdfREZMKTsKLSNlbmRpZiAvKiBTSUdYQ1BVICovCi0jaWZkZWYgU0lHWEZTWgotCXNpZ25hbChTSUdYRlNaLCBTSUdfREZMKTsKLSNlbmRpZiAvKiBTSUdYRlNaICovCi0gICAgfQotCi0gICAgc2lnbmFsKFNJR1RFUk0sIHNpZ190ZXJtKTsKLSNpZmRlZiBTSUdIVVAKLSAgICBzaWduYWwoU0lHSFVQLCByZXN0YXJ0KTsKLSNlbmRpZiAvKiBTSUdIVVAgKi8KLSNpZmRlZiBTSUdVU1IxCi0gICAgc2lnbmFsKFNJR1VTUjEsIHJlc3RhcnQpOwotI2VuZGlmIC8qIFNJR1VTUjEgKi8KLSNpZmRlZiBTSUdQSVBFCi0gICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwotI2VuZGlmIC8qIFNJR1BJUEUgKi8KLQotI2VuZGlmCi19Ci0KLSNpZiBkZWZpbmVkKFRDUF9OT0RFTEFZKSAmJiAhZGVmaW5lZChNUEUpICYmICFkZWZpbmVkKFRQRikKLXN0YXRpYyB2b2lkIHNvY2tfZGlzYWJsZV9uYWdsZShhcF9zb2NrZXRfdCAqcykKLXsKLSAgICAvKiBUaGUgTmFnbGUgYWxnb3JpdGhtIHNheXMgdGhhdCB3ZSBzaG91bGQgZGVsYXkgc2VuZGluZyBwYXJ0aWFsCi0gICAgICogcGFja2V0cyBpbiBob3BlcyBvZiBnZXR0aW5nIG1vcmUgZGF0YS4gIFdlIGRvbid0IHdhbnQgdG8gZG8KLSAgICAgKiB0aGlzOyB3ZSBhcmUgbm90IHRlbG5ldC4gIFRoZXJlIGFyZSBiYWQgaW50ZXJhY3Rpb25zIGJldHdlZW4KLSAgICAgKiBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGFuZCBOYWdsZSdzIGFsZ29yaXRobSB0aGF0IGhhdmUgdmVyeSBzZXZlcmUKLSAgICAgKiBwZXJmb3JtYW5jZSBwZW5hbHRpZXMuICAoRmFpbGluZyB0byBkaXNhYmxlIE5hZ2xlIGlzIG5vdCBtdWNoIG9mIGEKLSAgICAgKiBwcm9ibGVtIHdpdGggc2ltcGxlIEhUVFAuKQotICAgICAqCi0gICAgICogSW4gc3BpdGUgb2YgdGhlc2UgcHJvYmxlbXMsIGZhaWx1cmUgaGVyZSBpcyBub3QgYSBzaG9vdGluZyBvZmZlbnNlLgotICAgICAqLwotICAgIGludCBqdXN0X3NheV9ubyA9IDE7Ci0gICAgYXBfc3RhdHVzX3Qgc3RhdHVzOwotCi0gICAgc3RhdHVzID0gYXBfc2V0c29ja29wdChzLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIChjaGFyICopICZqdXN0X3NheV9ubywgc2l6ZW9mKGludCkpOwotICAgIGlmIChzdGF0dXMgIT0gQVBSX1NVQ0NFU1MpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfV0FSTklORywgc3RhdHVzLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJzZXRzb2Nrb3B0OiAoVENQX05PREVMQVkpIik7Ci0gICAgfQotfQotCi0jZWxzZQotI2RlZmluZSBzb2NrX2Rpc2FibGVfbmFnbGUocykJLyogTk9PUCAqLwotI2VuZGlmCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDaGlsZCBwcm9jZXNzIG1haW4gbG9vcC4KLSAqLwotCi1BUElfRVhQT1JUKHZvaWQpIGFwX2NoaWxkX3Rlcm1pbmF0ZShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICByLT5jb25uZWN0aW9uLT5rZWVwYWxpdmUgPSAwOwotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtUSFJFQURfR0xPQkFMKGNoaWxkX251bSldLmRlZmVycmVkX2RpZSA9IDE7Ci19Ci0KLWludCBhcF9ncmFjZWZ1bF9zdG9wX3NpZ25hbGxlZCh2b2lkKQotewotICAgIGlmIChhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnRbVEhSRUFEX0dMT0JBTChjaGlsZF9udW0pXS5kZWZlcnJlZF9kaWUgfHwKLQlhcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwucnVubmluZ19nZW5lcmF0aW9uICE9IGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtUSFJFQURfR0xPQkFMKGNoaWxkX251bSldLmdlbmVyYXRpb24pIHsKLQlyZXR1cm4gMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotCi1zdGF0aWMgaW50IHNldHVwX2xpc3RlbmVycyhhcF9jb250ZXh0X3QgKnBjaGlsZCwgYXBfcG9sbGZkX3QgKipsaXN0ZW5fcG9sbCkKLXsKLSAgICBhcF9saXN0ZW5fcmVjICpscjsKLSAgICBpbnQgbnVtZmRzID0gMDsKLQotICAgIGZvciAobHIgPSBhcF9saXN0ZW5lcnM7IGxyOyBsciA9IGxyLT5uZXh0KSB7Ci0gICAgICAgIG51bWZkcysrOwotICAgIH0KLQotICAgIGFwX3NldHVwX3BvbGwobGlzdGVuX3BvbGwsIG51bWZkcywgcGNoaWxkKTsKLQotICAgIGZvciAobHIgPSBhcF9saXN0ZW5lcnM7IGxyOyBsciA9IGxyLT5uZXh0KSB7Ci0JYXBfYWRkX3BvbGxfc29ja2V0KCpsaXN0ZW5fcG9sbCwgbHItPnNkLCBBUFJfUE9MTElOKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotCi1zdGF0aWMgdm9pZCBjaGlsZF9tYWluKHZvaWQgKmNoaWxkX251bV9hcmcpCi17Ci0gICAgYXBfbGlzdGVuX3JlYyAqbHIgPSBOVUxMOwotICAgIGFwX2xpc3Rlbl9yZWMgKmZpcnN0X2xyID0gTlVMTDsKLSAgICBhcF9jb250ZXh0X3QgKnB0cmFuczsKLSAgICBjb25uX3JlYyAqY3VycmVudF9jb25uOwotICAgIGFwX2lvbCAqaW9sOwotICAgIGFwX2NvbnRleHRfdCAqcGNoaWxkOwotICAgIHBhcmVudF9zY29yZSAqc2NfcGFyZW50X3JlYzsKLSAgICBpbnQgcmVxdWVzdHNfdGhpc19jaGlsZCA9IDA7Ci0gICAgYXBfcG9sbGZkX3QgKmxpc3Rlbl9wb2xsOwotICAgIGFwX3NvY2tldF90ICpjc2QgPSBOVUxMOwotICAgIGludCBuc2RzLCBydjsKLQotICAgIC8qIERpc2FibGUgdGhlIHJlc3RhcnQgc2lnbmFsIGhhbmRsZXJzIGFuZCBlbmFibGUgdGhlIGp1c3RfZGllIHN0dWZmLgotICAgICAqIE5vdGUgdGhhdCBzaW5jZSByZXN0YXJ0KCkganVzdCBub3RlcyB0aGF0IGEgcmVzdGFydCBoYXMgYmVlbgotICAgICAqIHJlcXVlc3RlZCB0aGVyZSdzIG5vIHJhY2UgY29uZGl0aW9uIGhlcmUuCi0gICAgICovCi0KLSAgICBzZXRfc2lnbmFscygpOyAvKiBzaWduYWxzIGFyZW4ndCBpbmhlcnJpdGVkIGJ5IGNoaWxkIHRocmVhZHMgKi8KLSAgICBzaWduYWwoU0lHSFVQLCBqdXN0X2RpZSk7Ci0gICAgc2lnbmFsKFNJR1VTUjEsIGp1c3RfZGllKTsKLSAgICBzaWduYWwoU0lHVEVSTSwganVzdF9kaWUpOwotCi0gICAgLyogR2V0IGEgc3ViIHBvb2wgZm9yIGdsb2JhbCBhbGxvY2F0aW9ucyBpbiB0aGlzIGNoaWxkLCBzbyB0aGF0Ci0gICAgICogd2UgY2FuIGhhdmUgY2xlYW51cHMgb2NjdXIgd2hlbiB0aGUgY2hpbGQgZXhpdHMuCi0gICAgICovCi0gICAgYXBfY3JlYXRlX2NvbnRleHQoJnBjaGlsZCwgcGNvbmYpOwotICAgICpwcHRocmVhZF9nbG9iYWxzID0gKHN0cnVjdCB0aHJlYWRfZ2xvYmFscyAqKWFwX3BhbGxvYyhwY2hpbGQsIHNpemVvZihzdHJ1Y3QgdGhyZWFkX2dsb2JhbHMpKTsKLSAgICBUSFJFQURfR0xPQkFMKGNoaWxkX251bSkgPSAoaW50KWNoaWxkX251bV9hcmc7Ci0gICAgc2NfcGFyZW50X3JlYyA9IGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudCArIFRIUkVBRF9HTE9CQUwoY2hpbGRfbnVtKTsKLSAgICBUSFJFQURfR0xPQkFMKHBjaGlsZCkgPSBwY2hpbGQ7Ci0gICAgYXBfY3JlYXRlX2NvbnRleHQoJnB0cmFucywgcGNoaWxkKTsKLQotICAgIGlmIChzZXR1cF9saXN0ZW5lcnMocGNoaWxkLCAmbGlzdGVuX3BvbGwpKSB7Ci0JY2xlYW5fY2hpbGRfZXhpdCgxKTsKLSAgICB9Ci0KLSAgICAvKiBuZWVkcyB0byBiZSBkb25lIGJlZm9yZSB3ZSBzd2l0Y2ggVUlEcyBzbyB3ZSBoYXZlIHBlcm1pc3Npb25zICovCi0gICAgU0FGRV9BQ0NFUFQoYWNjZXB0X211dGV4X2NoaWxkX2luaXQocGNoaWxkKSk7Ci0KLSAgICBhcF9jaGlsZF9pbml0X2hvb2socGNoaWxkLCBzZXJ2ZXJfY29uZik7Ci0KLSAgICAodm9pZCkgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhUSFJFQURfR0xPQkFMKGNoaWxkX251bSksIFNFUlZFUl9SRUFEWSwgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotICAgIAotCi0gICAgc2lnbmFsKFNJR0hVUCwganVzdF9kaWUpOwotICAgIHNpZ25hbChTSUdURVJNLCBqdXN0X2RpZSk7Ci0KLSAgICB3aGlsZSAoIWFwX2dyYWNlZnVsX3N0b3Bfc2lnbmFsbGVkKCkpIHsKLSAgICAgICAgQlVGRiAqY29ubl9pbzsKLSAgICAgICAgaW50IHNydjsKLSAgICAgICAgYXBfc29ja2V0X3QgKnNkOwotCi0JLyogUHJlcGFyZSB0byByZWNlaXZlIGEgU0lHVVNSMSBkdWUgdG8gZ3JhY2VmdWwgcmVzdGFydCBzbyB0aGF0Ci0JICogd2UgY2FuIGV4aXQgY2xlYW5seS4KLQkgKi8KLQlUSFJFQURfR0xPQkFMKHVzcjFfanVzdF9kaWUpID0gMTsKLQlzaWduYWwoU0lHVVNSMSwgdXNyMV9oYW5kbGVyKTsKLQotCS8qCi0JICogKFJlKWluaXRpYWxpemUgdGhpcyBjaGlsZCB0byBhIHByZS1jb25uZWN0aW9uIHN0YXRlLgotCSAqLwotCi0JY3VycmVudF9jb25uID0gTlVMTDsKLQotCWFwX2NsZWFyX3Bvb2wocHRyYW5zKTsKLQotCWlmICgoYXBfbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCA+IDAKLQkgICAgICYmIHJlcXVlc3RzX3RoaXNfY2hpbGQrKyA+PSBhcF9tYXhfcmVxdWVzdHNfcGVyX2NoaWxkKSkgewotCSAgICBjbGVhbl9jaGlsZF9leGl0KDApOwotCX0KLQotCSh2b2lkKSBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKFRIUkVBRF9HTE9CQUwoY2hpbGRfbnVtKSwgU0VSVkVSX1JFQURZLCAocmVxdWVzdF9yZWMgKikgTlVMTCk7Ci0KLQkvKgotCSAqIFdhaXQgZm9yIGFuIGFjY2VwdGFibGUgY29ubmVjdGlvbiB0byBhcnJpdmUuCi0JICovCi0KLQkvKiBMb2NrIGFyb3VuZCAiYWNjZXB0IiwgaWYgbmVjZXNzYXJ5ICovCi0JU0FGRV9BQ0NFUFQoYWNjZXB0X211dGV4X29uKCkpOwotCi0JZm9yICg7OykgewotCSAgICBpZiAoYXBfbGlzdGVuZXJzLT5uZXh0KSB7Ci0JCS8qIG1vcmUgdGhhbiBvbmUgc29ja2V0ICovCi0JCXNydiA9IGFwX3BvbGwobGlzdGVuX3BvbGwsICZuc2RzLCAtMSk7Ci0KLQkJaWYgKHNydiA8IDAgJiYgZXJybm8gIT0gRUlOVFIpIHsKLQkJICAgIC8qIFNpbmdsZSBVbml4IGRvY3VtZW50cyBzZWxlY3QgYXMgcmV0dXJuaW5nIGVycm5vcwotCQkgICAgICogRUJBREYsIEVJTlRSLCBhbmQgRUlOVkFMLi4uIGFuZCBpbiBub25lIG9mIHRob3NlCi0JCSAgICAgKiBjYXNlcyBkb2VzIGl0IG1ha2Ugc2Vuc2UgdG8gY29udGludWUuICBJbiBmYWN0Ci0JCSAgICAgKiBvbiBMaW51eCAyLjAueCB3ZSBzZWVtIHRvIGVuZCB1cCB3aXRoIEVGQVVMVAotCQkgICAgICogb2NjYXNpb25hbGx5LCBhbmQgd2UnZCBsb29wIGZvcmV2ZXIgZHVlIHRvIGl0LgotCQkgICAgICovCi0JCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBlcnJubywgc2VydmVyX2NvbmYsICJzZWxlY3Q6IChsaXN0ZW4pIik7Ci0JCSAgICBjbGVhbl9jaGlsZF9leGl0KDEpOwotCQl9Ci0KLQkJaWYgKHNydiA8PSAwKQotCQkgICAgY29udGludWU7Ci0KLQkJLyogd2UgcmVtZW1iZXIgdGhlIGxhc3RfbHIgd2Ugc2VhcmNoZWQgbGFzdCB0aW1lIGFyb3VuZCBzbyB0aGF0Ci0JCSAgIHdlIGRvbid0IGVuZCB1cCBzdGFydmluZyBhbnkgcGFydGljdWxhciBsaXN0ZW5pbmcgc29ja2V0ICovCi0JCWlmIChmaXJzdF9sciA9PSBOVUxMKSB7Ci0JCSAgICBmaXJzdF9sciA9IGFwX2xpc3RlbmVyczsKLQkJfQotCQkKLSAgICAgICAgICAgICAgICBsciA9IGZpcnN0X2xyOwotCQkKLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgIGFwX2ludDE2X3QgZXZlbnQ7Ci0KLQkJICAgIGlmICghbHIpIHsKLQkJCWxyID0gYXBfbGlzdGVuZXJzOwotCQkgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGFwX2dldF9yZXZlbnRzKCZldmVudCwgbHItPnNkLCBsaXN0ZW5fcG9sbCk7Ci0KLQkJICAgIGlmIChldmVudCA9PSBBUFJfUE9MTElOKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9sciA9IGxyLT5uZXh0OwotCQkgICAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgICAgbHIgPSBsci0+bmV4dDsKLQkJfSB3aGlsZSAobHIgIT0gZmlyc3RfbHIpOwotCQkKLQkJaWYgKGxyID09IGZpcnN0X2xyKSB7Ci0JCSAgICBjb250aW51ZTsKLQkJfQotCQlzZCA9IGxyLT5zZDsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJLyogb25seSBvbmUgc29ja2V0LCBqdXN0IHByZXRlbmQgd2UgZGlkIHRoZSBvdGhlciBzdHVmZiAqLwotCQlzZCA9IGFwX2xpc3RlbmVycy0+c2Q7Ci0JICAgIH0KLQotCSAgICAvKiBpZiB3ZSBhY2NlcHQoKSBzb21ldGhpbmcgd2UgZG9uJ3Qgd2FudCB0byBkaWUsIHNvIHdlIGhhdmUgdG8KLQkgICAgICogZGVmZXIgdGhlIGV4aXQKLQkgICAgICovCi0JICAgIFRIUkVBRF9HTE9CQUwodXNyMV9qdXN0X2RpZSkgPSAwOwotCSAgICBmb3IgKDs7KSB7Ci0JCWlmIChhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnRbVEhSRUFEX0dMT0JBTChjaGlsZF9udW0pXS5kZWZlcnJlZF9kaWUpIHsKLQkJICAgIC8qIHdlIGRpZG4ndCBnZXQgYSBzb2NrZXQsIGFuZCB3ZSB3ZXJlIHRvbGQgdG8gZGllICovCi0JCSAgICBjbGVhbl9jaGlsZF9leGl0KDApOwotCQl9Ci0JCXJ2ID0gYXBfYWNjZXB0KCZjc2QsIHNkLCBwdHJhbnMpOwotCQlpZiAocnYgIT0gQVBSX0VJTlRSKQotCQkgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgICBpZiAocnYgPT0gQVBSX1NVQ0NFU1MpCi0JCWJyZWFrOwkJLyogV2UgaGF2ZSBhIHNvY2tldCByZWFkeSBmb3IgcmVhZGluZyAqLwotCSAgICBlbHNlIHsKLQotCQkvKiBPdXIgb2xkIGJlaGF2aW91ciBoZXJlIHdhcyB0byBjb250aW51ZSBhZnRlciBhY2NlcHQoKQotCQkgKiBlcnJvcnMuICBCdXQgdGhpcyBsZWFkcyB1cyBpbnRvIGxvdHMgb2YgdHJvdWJsZXMKLQkJICogYmVjYXVzZSBtb3N0IG9mIHRoZSBlcnJvcnMgYXJlIHF1aXRlIGZhdGFsLiAgRm9yCi0JCSAqIGV4YW1wbGUsIEVNRklMRSBjYW4gYmUgY2F1c2VkIGJ5IHNsb3cgZGVzY3JpcHRvcgotCQkgKiBsZWFrcyAoc2F5IGluIGEgM3JkIHBhcnR5IG1vZHVsZSwgb3IgbGliYykuICBJdCdzCi0JCSAqIGZvb2xpc2ggZm9yIHVzIHRvIGNvbnRpbnVlIGFmdGVyIGFuIEVNRklMRS4gIFdlIGFsc28KLQkJICogc2VlbSB0byB0aWNrbGUga2VybmVsIGJ1Z3Mgb24gc29tZSBwbGF0Zm9ybXMgd2hpY2gKLQkJICogbGVhZCB0byBuZXZlci1lbmRpbmcgbG9vcHMgaGVyZS4gIFNvIGl0IHNlZW1zIGJlc3QKLQkJICogdG8ganVzdCBleGl0IGluIG1vc3QgY2FzZXMuCi0JCSAqLwotICAgICAgICAgICAgICAgIHN3aXRjaCAocnYpIHsKLSNpZmRlZiBFUFJPVE8KLQkJICAgIC8qIEVQUk9UTyBvbiBjZXJ0YWluIG9sZGVyIGtlcm5lbHMgcmVhbGx5IG1lYW5zCi0JCSAgICAgKiBFQ09OTkFCT1JURUQsIHNvIHdlIG5lZWQgdG8gaWdub3JlIGl0IGZvciB0aGVtLgotCQkgICAgICogU2VlIGRpc2N1c3Npb24gaW4gbmV3LWh0dHBkIGFyY2hpdmVzIG5oLjk3MDEKLQkJICAgICAqIHNlYXJjaCBmb3IgRVBST1RPLgotCQkgICAgICoKLQkJICAgICAqIEFsc28gc2VlIG5oLjk2MDMsIHNlYXJjaCBmb3IgRVBST1RPOgotCQkgICAgICogVGhlcmUgaXMgcG90ZW50aWFsbHkgYSBidWcgaW4gU29sYXJpcyAyLnggeDw2LAotCQkgICAgICogYW5kIG90aGVyIGJveGVzIHRoYXQgaW1wbGVtZW50IHRjcCBzb2NrZXRzIGluCi0JCSAgICAgKiB1c2VybGFuZCAoaS5lLiBvbiB0b3Agb2YgU1RSRUFNUykuICBPbiB0aGVzZQotCQkgICAgICogc3lzdGVtcywgRVBST1RPIGNhbiBhY3R1YWxseSByZXN1bHQgaW4gYSBmYXRhbAotCQkgICAgICogbG9vcC4gIFNlZSBQUiM5ODEgZm9yIGV4YW1wbGUuICBJdCdzIGhhcmQgdG8KLQkJICAgICAqIGhhbmRsZSBib3RoIHVzZXMgb2YgRVBST1RPLgotCQkgICAgICovCi0gICAgICAgICAgICAgICAgY2FzZSBFUFJPVE86Ci0jZW5kaWYKLSNpZmRlZiBFQ09OTkFCT1JURUQKLSAgICAgICAgICAgICAgICBjYXNlIEVDT05OQUJPUlRFRDoKLSNlbmRpZgotCQkgICAgLyogTGludXggZ2VuZXJhdGVzIHRoZSByZXN0IG9mIHRoZXNlLCBvdGhlciB0Y3AKLQkJICAgICAqIHN0YWNrcyAoaS5lLiBic2QpIHRlbmQgdG8gaGlkZSB0aGVtIGJlaGluZAotCQkgICAgICogZ2V0c29ja29wdCgpIGludGVyZmFjZXMuICBUaGV5IG9jY3VyIHdoZW4KLQkJICAgICAqIHRoZSBuZXQgZ29lcyBzb3VyIG9yIHRoZSBjbGllbnQgZGlzY29ubmVjdHMKLQkJICAgICAqIGFmdGVyIHRoZSB0aHJlZS13YXkgaGFuZHNoYWtlIGhhcyBiZWVuIGRvbmUKLQkJICAgICAqIGluIHRoZSBrZXJuZWwgYnV0IGJlZm9yZSB1c2VybGFuZCBoYXMgcGlja2VkCi0JCSAgICAgKiB1cCB0aGUgc29ja2V0LgotCQkgICAgICovCi0jaWZkZWYgRUNPTk5SRVNFVAotICAgICAgICAgICAgICAgIGNhc2UgRUNPTk5SRVNFVDoKLSNlbmRpZgotI2lmZGVmIEVUSU1FRE9VVAotICAgICAgICAgICAgICAgIGNhc2UgRVRJTUVET1VUOgotI2VuZGlmCi0jaWZkZWYgRUhPU1RVTlJFQUNICi0JCWNhc2UgRUhPU1RVTlJFQUNIOgotI2VuZGlmCi0jaWZkZWYgRU5FVFVOUkVBQ0gKLQkJY2FzZSBFTkVUVU5SRUFDSDoKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHJ2LCBzZXJ2ZXJfY29uZiwKLQkJCQkiYWNjZXB0OiAoY2xpZW50IHNvY2tldCkiKTsKLQkJICAgIGNsZWFuX2NoaWxkX2V4aXQoMSk7Ci0JCX0KLQkgICAgfQotCi0JICAgIGlmIChhcF9ncmFjZWZ1bF9zdG9wX3NpZ25hbGxlZCgpKSB7Ci0JCWNsZWFuX2NoaWxkX2V4aXQoMCk7Ci0JICAgIH0KLQkgICAgVEhSRUFEX0dMT0JBTCh1c3IxX2p1c3RfZGllKSA9IDE7Ci0JfQotCi0JU0FGRV9BQ0NFUFQoYWNjZXB0X211dGV4X29mZigpKTsJLyogdW5sb2NrIGFmdGVyICJhY2NlcHQiICovCi0KLQkvKiBXZSd2ZSBnb3QgYSBzb2NrZXQsIGxldCdzIGF0IGxlYXN0IHByb2Nlc3Mgb25lIHJlcXVlc3Qgb2ZmIHRoZQotCSAqIHNvY2tldCBiZWZvcmUgd2UgYWNjZXB0IGEgZ3JhY2VmdWwgcmVzdGFydCByZXF1ZXN0LiAgV2Ugc2V0Ci0JICogdGhlIHNpZ25hbCB0byBpZ25vcmUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGRpc3R1cmIgYW55Ci0JICogdGhpcmQgcGFydHkgY29kZS4KLQkgKi8KLQlzaWduYWwoU0lHVVNSMSwgU0lHX0lHTik7Ci0KLQkvKgotCSAqIFdlIG5vdyBoYXZlIGEgY29ubmVjdGlvbiwgc28gc2V0IGl0IHVwIHdpdGggdGhlIGFwcHJvcHJpYXRlCi0JICogc29ja2V0IG9wdGlvbnMsIGZpbGUgZGVzY3JpcHRvcnMsIGFuZCByZWFkL3dyaXRlIGJ1ZmZlcnMuCi0JICovCi0KLQlzb2NrX2Rpc2FibGVfbmFnbGUoY3NkKTsKLQotICAgICAgICBpb2wgPSBvczJfYXR0YWNoX3NvY2tldChjc2QpOwotCi0JaWYgKGlvbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkd8QVBMT0dfTk9FUlJOTywgMCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIGF0dGFjaGluZyB0byBzb2NrZXQiKTsKLQkgICAgYXBfY2xvc2Vfc29ja2V0KGNzZCk7Ci0JICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLQkodm9pZCkgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhUSFJFQURfR0xPQkFMKGNoaWxkX251bSksIFNFUlZFUl9CVVNZX1JFQUQsCi0JCQkJICAgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotCi0JY29ubl9pbyA9IGFwX2JjcmVhdGUocHRyYW5zLCBCX1JEV1IpOwotICAgICAgICBhcF9icHVzaF9pb2woY29ubl9pbywgaW9sKTsKLQotCWN1cnJlbnRfY29ubiA9IGFwX25ld19hcHJfY29ubmVjdGlvbihwdHJhbnMsIHNlcnZlcl9jb25mLCBjb25uX2lvLCBjc2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJFQURfR0xPQkFMKGNoaWxkX251bSkpOwotCi0JYXBfcHJvY2Vzc19jb25uZWN0aW9uKGN1cnJlbnRfY29ubik7Ci0gICAgfQotCi0gICAgY2xlYW5fY2hpbGRfZXhpdCgwKTsKLX0KLQotCi1zdGF0aWMgaW50IG1ha2VfY2hpbGQoc2VydmVyX3JlYyAqcywgaW50IHNsb3QsIHRpbWVfdCBub3cpCi17Ci0gICAgVElEIHRpZDsKLQotICAgIGlmIChzbG90ICsgMSA+IG1heF9kYWVtb25zX2xpbWl0KSB7Ci0JbWF4X2RhZW1vbnNfbGltaXQgPSBzbG90ICsgMTsKLSAgICB9Ci0KLSAgICBpZiAob25lX3Byb2Nlc3MpIHsKLSAgICAgICAgc3RydWN0IHRocmVhZF9nbG9iYWxzICpwYXJlbnRfZ2xvYmFscyA9ICpwcHRocmVhZF9nbG9iYWxzOwotCXNpZ25hbChTSUdIVVAsIGp1c3RfZGllKTsKLQlzaWduYWwoU0lHSU5ULCBqdXN0X2RpZSk7Ci0jaWZkZWYgU0lHUVVJVAotCXNpZ25hbChTSUdRVUlULCBTSUdfREZMKTsKLSNlbmRpZgotCXNpZ25hbChTSUdURVJNLCBqdXN0X2RpZSk7Ci0gICAgICAgIGNoaWxkX21haW4oKHZvaWQgKilzbG90KTsKLSAgICAgICAgKnBwdGhyZWFkX2dsb2JhbHMgPSBwYXJlbnRfZ2xvYmFsczsKLSAgICB9Ci0KLSAgICBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKHNsb3QsIFNFUlZFUl9TVEFSVElORywgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotCi0gICAgaWYgKCh0aWQgPSBfYmVnaW50aHJlYWQoY2hpbGRfbWFpbiwgTlVMTCwgIDI1NioxMDI0LCAodm9pZCAqKXNsb3QpKSA9PSAtMSkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlJ8QVBMT0dfTk9FUlJOTywgMCwgcywgIl9iZWdpbnRocmVhZDogVW5hYmxlIHRvIGNyZWF0ZSBuZXcgdGhyZWFkIik7Ci0KLQkvKiBfYmVnaW50aHJlYWQgZGlkbid0IHN1Y2NlZWQuIEZpeCB0aGUgc2NvcmVib2FyZCBvciBlbHNlCi0JICogaXQgd2lsbCBzYXkgU0VSVkVSX1NUQVJUSU5HIGZvcmV2ZXIgYW5kIGV2ZXIKLQkgKi8KLQkodm9pZCkgYXBfdXBkYXRlX2NoaWxkX3N0YXR1cyhzbG90LCBTRVJWRVJfREVBRCwgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotCi0JLyogSW4gY2FzZSBzeXN0ZW0gcmVzb3VyY2VzIGFyZSBtYXh4ZWQgb3V0LCB3ZSBkb24ndCB3YW50Ci0JICAgQXBhY2hlIHJ1bm5pbmcgYXdheSB3aXRoIHRoZSBDUFUgdHJ5aW5nIHRvIF9iZWdpbnRocmVhZCBvdmVyIGFuZAotCSAgIG92ZXIgYW5kIG92ZXIgYWdhaW4uICovCi0Jc2xlZXAoMTApOwotCi0JcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtzbG90XS50aWQgPSB0aWQ7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotLyogc3RhcnQgdXAgYSBidW5jaCBvZiBjaGlsZHJlbiAqLwotc3RhdGljIHZvaWQgc3RhcnR1cF9jaGlsZHJlbihpbnQgbnVtYmVyX3RvX3N0YXJ0KQotewotICAgIGludCBpOwotICAgIHRpbWVfdCBub3cgPSB0aW1lKDApOwotCi0gICAgZm9yIChpID0gMDsgbnVtYmVyX3RvX3N0YXJ0ICYmIGkgPCBhcF9kYWVtb25zX2xpbWl0OyArK2kpIHsKLQlpZiAoYXBfc2NvcmVib2FyZF9pbWFnZS0+c2VydmVyc1tpXS5zdGF0dXMgIT0gU0VSVkVSX0RFQUQpIHsKLQkgICAgY29udGludWU7Ci0JfQotCWlmIChtYWtlX2NoaWxkKHNlcnZlcl9jb25mLCBpLCBub3cpIDwgMCkgewotCSAgICBicmVhazsKLQl9Ci0JLS1udW1iZXJfdG9fc3RhcnQ7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBpZGxlX3NwYXduX3JhdGUgaXMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IHdpbGwgYmUgc3Bhd25lZCBvbiB0aGUKLSAqIG5leHQgbWFpbnRlbmFuY2UgY3ljbGUgaWYgdGhlcmUgYXJlbid0IGVub3VnaCBpZGxlIHNlcnZlcnMuICBJdCBpcwotICogZG91YmxlZCB1cCB0byBNQVhfU1BBV05fUkFURSwgYW5kIHJlc2V0IG9ubHkgd2hlbiBhIGN5Y2xlIGdvZXMgYnkKLSAqIHdpdGhvdXQgdGhlIG5lZWQgdG8gc3Bhd24uCi0gKi8KLXN0YXRpYyBpbnQgaWRsZV9zcGF3bl9yYXRlID0gMTsKLSNpZm5kZWYgTUFYX1NQQVdOX1JBVEUKLSNkZWZpbmUgTUFYX1NQQVdOX1JBVEUJKDMyKQotI2VuZGlmCi1zdGF0aWMgaW50IGhvbGRfb2ZmX29uX2V4cG9uZW50aWFsX3NwYXduaW5nOwotCi1zdGF0aWMgdm9pZCBwZXJmb3JtX2lkbGVfc2VydmVyX21haW50ZW5hbmNlKHZvaWQpCi17Ci0gICAgaW50IGk7Ci0gICAgaW50IHRvX2tpbGw7Ci0gICAgaW50IGlkbGVfY291bnQ7Ci0gICAgc2hvcnRfc2NvcmUgKnNzOwotICAgIHRpbWVfdCBub3cgPSB0aW1lKDApOwotICAgIGludCBmcmVlX2xlbmd0aDsKLSAgICBpbnQgZnJlZV9zbG90c1tNQVhfU1BBV05fUkFURV07Ci0gICAgaW50IGxhc3Rfbm9uX2RlYWQ7Ci0gICAgaW50IHRvdGFsX25vbl9kZWFkOwotCi0gICAgLyogaW5pdGlhbGl6ZSB0aGUgZnJlZV9saXN0ICovCi0gICAgZnJlZV9sZW5ndGggPSAwOwotCi0gICAgdG9fa2lsbCA9IC0xOwotICAgIGlkbGVfY291bnQgPSAwOwotICAgIGxhc3Rfbm9uX2RlYWQgPSAtMTsKLSAgICB0b3RhbF9ub25fZGVhZCA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgYXBfZGFlbW9uc19saW1pdDsgKytpKSB7Ci0JaW50IHN0YXR1czsKLQotCWlmIChpID49IG1heF9kYWVtb25zX2xpbWl0ICYmIGZyZWVfbGVuZ3RoID09IGlkbGVfc3Bhd25fcmF0ZSkKLQkgICAgYnJlYWs7Ci0Jc3MgPSAmYXBfc2NvcmVib2FyZF9pbWFnZS0+c2VydmVyc1tpXTsKLQlzdGF0dXMgPSBzcy0+c3RhdHVzOwotCWlmIChzdGF0dXMgPT0gU0VSVkVSX0RFQUQpIHsKLQkgICAgLyogdHJ5IHRvIGtlZXAgY2hpbGRyZW4gbnVtYmVycyBhcyBsb3cgYXMgcG9zc2libGUgKi8KLQkgICAgaWYgKGZyZWVfbGVuZ3RoIDwgaWRsZV9zcGF3bl9yYXRlKSB7Ci0JCWZyZWVfc2xvdHNbZnJlZV9sZW5ndGhdID0gaTsKLQkJKytmcmVlX2xlbmd0aDsKLQkgICAgfQotCX0KLQllbHNlIHsKLQkgICAgLyogV2UgY29uc2lkZXIgYSBzdGFydGluZyBzZXJ2ZXIgYXMgaWRsZSBiZWNhdXNlIHdlIHN0YXJ0ZWQgaXQKLQkgICAgICogYXQgbGVhc3QgYSBjeWNsZSBhZ28sIGFuZCBpZiBpdCBzdGlsbCBoYXNuJ3QgZmluaXNoZWQgc3RhcnRpbmcKLQkgICAgICogdGhlbiB3ZSdyZSBqdXN0IGdvaW5nIHRvIHN3YW1wIHRoaW5ncyB3b3JzZSBieSBmb3JraW5nIG1vcmUuCi0JICAgICAqIFNvIHdlIGhvcGVmdWxseSB3b24ndCBuZWVkIHRvIGZvcmsgbW9yZSBpZiB3ZSBjb3VudCBpdC4KLQkgICAgICogVGhpcyBkZXBlbmRzIG9uIHRoZSBvcmRlcmluZyBvZiBTRVJWRVJfUkVBRFkgYW5kIFNFUlZFUl9TVEFSVElORy4KLQkgICAgICovCi0JICAgIGlmIChzdGF0dXMgPD0gU0VSVkVSX1JFQURZKSB7Ci0JCSsrIGlkbGVfY291bnQ7Ci0JCS8qIGFsd2F5cyBraWxsIHRoZSBoaWdoZXN0IG51bWJlcmVkIGNoaWxkIGlmIHdlIGhhdmUgdG8uLi4KLQkJICogbm8gcmVhbGx5IHdlbGwgdGhvdWdodCBvdXQgcmVhc29uIC4uLiBvdGhlciB0aGFuIG9ic2VydmluZwotCQkgKiB0aGUgc2VydmVyIGJlaGF2aW91ciB1bmRlciBsaW51eCB3aGVyZSBsb3dlciBudW1iZXJlZCBjaGlsZHJlbgotCQkgKiB0ZW5kIHRvIHNlcnZpY2UgbW9yZSBoaXRzIChhbmQgaGVuY2UgYXJlIG1vcmUgbGlrZWx5IHRvIGhhdmUKLQkJICogdGhlaXIgZGF0YSBpbiBjcHUgY2FjaGVzKS4KLQkJICovCi0JCXRvX2tpbGwgPSBpOwotCSAgICB9Ci0KLQkgICAgKyt0b3RhbF9ub25fZGVhZDsKLQkgICAgbGFzdF9ub25fZGVhZCA9IGk7Ci0JfQotICAgIH0KLSAgICBtYXhfZGFlbW9uc19saW1pdCA9IGxhc3Rfbm9uX2RlYWQgKyAxOwotICAgIGlmIChpZGxlX2NvdW50ID4gYXBfZGFlbW9uc19tYXhfZnJlZSkgewotCS8qIGtpbGwgb2ZmIG9uZSBjaGlsZC4uLiB3ZSB1c2UgU0lHVVNSMSBiZWNhdXNlIHRoYXQnbGwgY2F1c2UgaXQgdG8KLQkgKiBzaHV0IGRvd24gZ3JhY2VmdWxseSwgaW4gY2FzZSBpdCBoYXBwZW5lZCB0byBwaWNrIHVwIGEgcmVxdWVzdAotCSAqIHdoaWxlIHdlIHdlcmUgY291bnRpbmcKLQkgKi8KLQlhcF9zY29yZWJvYXJkX2ltYWdlLT5wYXJlbnRbdG9fa2lsbF0uZGVmZXJyZWRfZGllID0gMTsKLQlpZGxlX3NwYXduX3JhdGUgPSAxOwotICAgIH0KLSAgICBlbHNlIGlmIChpZGxlX2NvdW50IDwgYXBfZGFlbW9uc19taW5fZnJlZSkgewotCS8qIHRlcm1pbmF0ZSB0aGUgZnJlZSBsaXN0ICovCi0JaWYgKGZyZWVfbGVuZ3RoID09IDApIHsKLQkgICAgLyogb25seSByZXBvcnQgdGhpcyBjb25kaXRpb24gb25jZSAqLwotCSAgICBzdGF0aWMgaW50IHJlcG9ydGVkID0gMDsKLQotCSAgICBpZiAoIXJlcG9ydGVkKSB7Ci0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgc2VydmVyX2NvbmYsCi0JCQkgICAgInNlcnZlciByZWFjaGVkIE1heENsaWVudHMgc2V0dGluZywgY29uc2lkZXIiCi0JCQkgICAgIiByYWlzaW5nIHRoZSBNYXhDbGllbnRzIHNldHRpbmciKTsKLQkJcmVwb3J0ZWQgPSAxOwotCSAgICB9Ci0JICAgIGlkbGVfc3Bhd25fcmF0ZSA9IDE7Ci0JfQotCWVsc2UgewotCSAgICBpZiAoaWRsZV9zcGF3bl9yYXRlID49IDgpIHsKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgMCwgc2VydmVyX2NvbmYsCi0JCSAgICAic2VydmVyIHNlZW1zIGJ1c3ksICh5b3UgbWF5IG5lZWQgIgotCQkgICAgInRvIGluY3JlYXNlIFN0YXJ0U2VydmVycywgb3IgTWluL01heFNwYXJlU2VydmVycyksICIKLQkJICAgICJzcGF3bmluZyAlZCBjaGlsZHJlbiwgdGhlcmUgYXJlICVkIGlkbGUsIGFuZCAiCi0JCSAgICAiJWQgdG90YWwgY2hpbGRyZW4iLCBpZGxlX3NwYXduX3JhdGUsCi0JCSAgICBpZGxlX2NvdW50LCB0b3RhbF9ub25fZGVhZCk7Ci0JICAgIH0KLQkgICAgZm9yIChpID0gMDsgaSA8IGZyZWVfbGVuZ3RoOyArK2kpIHsKLQkJbWFrZV9jaGlsZChzZXJ2ZXJfY29uZiwgZnJlZV9zbG90c1tpXSwgbm93KTsKLQkgICAgfQotCSAgICAvKiB0aGUgbmV4dCB0aW1lIGFyb3VuZCB3ZSB3YW50IHRvIHNwYXduIHR3aWNlIGFzIG1hbnkgaWYgdGhpcwotCSAgICAgKiB3YXNuJ3QgZ29vZCBlbm91Z2gsIGJ1dCBub3QgaWYgd2UndmUganVzdCBkb25lIGEgZ3JhY2VmdWwKLQkgICAgICovCi0JICAgIGlmIChob2xkX29mZl9vbl9leHBvbmVudGlhbF9zcGF3bmluZykgewotCQktLWhvbGRfb2ZmX29uX2V4cG9uZW50aWFsX3NwYXduaW5nOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKGlkbGVfc3Bhd25fcmF0ZSA8IE1BWF9TUEFXTl9SQVRFKSB7Ci0JCWlkbGVfc3Bhd25fcmF0ZSAqPSAyOwotCSAgICB9Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLQlpZGxlX3NwYXduX3JhdGUgPSAxOwotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZCBwcm9jZXNzX2NoaWxkX3N0YXR1cyhpbnQgdGlkLCBhcF93YWl0X3Qgc3RhdHVzKQotewotICAgIC8qIENoaWxkIGRpZWQuLi4gaWYgaXQgZGllZCBkdWUgdG8gYSBmYXRhbCBlcnJvciwKLQkqIHdlIHNob3VsZCBzaW1wbHkgYmFpbCBvdXQuCi0JKi8KLSAgICBpZiAoKFdJRkVYSVRFRChzdGF0dXMpKSAmJgotCVdFWElUU1RBVFVTKHN0YXR1cykgPT0gQVBFWElUX0NISUxERkFUQUwpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQUxFUlR8QVBMT0dfTk9FUlJOTywgMCwgc2VydmVyX2NvbmYsCi0JCQkiQ2hpbGQgJWQgcmV0dXJuZWQgYSBGYXRhbCBlcnJvci4uLiBcbiIKLQkJCSJBcGFjaGUgaXMgZXhpdGluZyEiLAotCQkJdGlkKTsKLQlleGl0KEFQRVhJVF9DSElMREZBVEFMKTsKLSAgICB9Ci0gICAgaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpIHsKLQlzd2l0Y2ggKFdURVJNU0lHKHN0YXR1cykpIHsKLQljYXNlIFNJR1RFUk06Ci0JY2FzZSBTSUdIVVA6Ci0JY2FzZSBTSUdVU1IxOgotCWNhc2UgU0lHS0lMTDoKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLSNpZmRlZiBTWVNfU0lHTElTVAotI2lmZGVmIFdDT1JFRFVNUAotCSAgICBpZiAoV0NPUkVEVU1QKHN0YXR1cykpIHsKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCAwLAotCQkJICAgICBzZXJ2ZXJfY29uZiwKLQkJCSAgICAgImNoaWxkIHRpZCAlZCBleGl0IHNpZ25hbCAlcyAoJWQpLCAiCi0JCQkgICAgICJwb3NzaWJsZSBjb3JlZHVtcCBpbiAlcyIsCi0JCQkgICAgIHRpZCwgKFdURVJNU0lHKHN0YXR1cykgPj0gTnVtU0lHKSA/ICIiIDoKLQkJCSAgICAgU1lTX1NJR0xJU1RbV1RFUk1TSUcoc3RhdHVzKV0sIFdURVJNU0lHKHN0YXR1cyksCi0JCQkgICAgIGFwX2NvcmVkdW1wX2Rpcik7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0jZW5kaWYKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCAwLAotCQkJICAgICBzZXJ2ZXJfY29uZiwKLQkJCSAgICAgImNoaWxkIHRpZCAlZCBleGl0IHNpZ25hbCAlcyAoJWQpIiwgdGlkLAotCQkJICAgICBTWVNfU0lHTElTVFtXVEVSTVNJRyhzdGF0dXMpXSwgV1RFUk1TSUcoc3RhdHVzKSk7Ci0jaWZkZWYgV0NPUkVEVU1QCi0JICAgIH0KLSNlbmRpZgotI2Vsc2UKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCAwLAotCQkJIHNlcnZlcl9jb25mLAotCQkJICJjaGlsZCB0aWQgJWQgZXhpdCBzaWduYWwgJWQiLAotCQkJIHRpZCwgV1RFUk1TSUcoc3RhdHVzKSk7Ci0jZW5kaWYKLQl9Ci0gICAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRXhlY3V0aXZlIHJvdXRpbmVzLgotICovCi0KLWludCBhcF9tcG1fcnVuKGFwX2NvbnRleHRfdCAqX3Bjb25mLCBhcF9jb250ZXh0X3QgKnBsb2csIHNlcnZlcl9yZWMgKnMpCi17Ci0gICAgaW50IHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydDsKLSAgICBpbnQgaTsKLSAgICBhcF9zdGF0dXNfdCBzdGF0dXM7Ci0KLSAgICBwY29uZiA9IF9wY29uZjsKLSAgICBzZXJ2ZXJfY29uZiA9IHM7Ci0gICAgYXBfbG9nX3BpZChwY29uZiwgYXBfcGlkX2ZuYW1lKTsKLQotICAgIGlmICgoc3RhdHVzID0gYXBfbGlzdGVuX29wZW4ocy0+cHJvY2Vzcywgcy0+cG9ydCkpICE9IEFQUl9TVUNDRVNTKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfQUxFUlQsIHN0YXR1cywgcywKLQkJICAgICJubyBsaXN0ZW5pbmcgc29ja2V0cyBhdmFpbGFibGUsIHNodXR0aW5nIGRvd24iKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgU0FGRV9BQ0NFUFQoYWNjZXB0X211dGV4X2luaXQocGNvbmYpKTsKLQotICAgIGlmICghaXNfZ3JhY2VmdWwpIHsKLQlyZWluaXRfc2NvcmVib2FyZChwY29uZik7Ci0gICAgfQotCi0gICAgc2V0X3NpZ25hbHMoKTsKLQotICAgIGlmIChwcHRocmVhZF9nbG9iYWxzID09IE5VTEwpIHsKLSAgICAgICAgaWYgKERvc0FsbG9jVGhyZWFkTG9jYWxNZW1vcnkoMSwgKFBVTE9ORyAqKSZwcHRocmVhZF9nbG9iYWxzKSkgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0FMRVJUfEFQTE9HX05PRVJSTk8sIDAsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBhbGxvY2F0aW5nIHRocmVhZCBsb2NhbCBzdG9yYWdlIgotICAgICAgICAgICAgICAgICAgICAgICAgICJBcGFjaGUgaXMgZXhpdGluZyEiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAqcHB0aHJlYWRfZ2xvYmFscyA9IChzdHJ1Y3QgdGhyZWFkX2dsb2JhbHMgKilhcF9wYWxsb2MocGNvbmYsIHNpemVvZihzdHJ1Y3QgdGhyZWFkX2dsb2JhbHMpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChhcF9kYWVtb25zX21heF9mcmVlIDwgYXBfZGFlbW9uc19taW5fZnJlZSArIDEpCS8qIERvbid0IHRocmFzaC4uLiAqLwotCWFwX2RhZW1vbnNfbWF4X2ZyZWUgPSBhcF9kYWVtb25zX21pbl9mcmVlICsgMTsKLQotICAgIC8qIElmIHdlJ3JlIGRvaW5nIGEgZ3JhY2VmdWxfcmVzdGFydCB0aGVuIHdlJ3JlIGdvaW5nIHRvIHNlZSBhIGxvdAotCSogb2YgY2hpbGRyZW4gZXhpdGluZyBpbW1lZGlhdGVseSB3aGVuIHdlIGdldCBpbnRvIHRoZSBtYWluIGxvb3AKLQkqIGJlbG93IChiZWNhdXNlIHdlIGp1c3Qgc2VudCB0aGVtIFNJR1VTUjEpLiAgVGhpcyBoYXBwZW5zIHByZXR0eQotCSogcmFwaWRseS4uLiBhbmQgZm9yIGVhY2ggb25lIHRoYXQgZXhpdHMgd2UnbGwgc3RhcnQgYSBuZXcgb25lIHVudGlsCi0JKiB3ZSByZWFjaCBhdCBsZWFzdCBkYWVtb25zX21pbl9mcmVlLiAgQnV0IHdlIG1heSBiZSBwZXJtaXR0ZWQgdG8KLQkqIHN0YXJ0IG1vcmUgdGhhbiB0aGF0LCBzbyB3ZSdsbCBqdXN0IGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgd2UncmUKLQkqIHN1cHBvc2VkIHRvIHN0YXJ0IHVwIHdpdGhvdXQgdGhlIDEgc2Vjb25kIHBlbmFsdHkgYmV0d2VlbiBlYWNoIGZvcmsuCi0JKi8KLSAgICByZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQgPSBhcF9kYWVtb25zX3RvX3N0YXJ0OwotICAgIGlmIChyZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQgPiBhcF9kYWVtb25zX2xpbWl0KSB7Ci0JcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0ID0gYXBfZGFlbW9uc19saW1pdDsKLSAgICB9Ci0gICAgaWYgKCFpc19ncmFjZWZ1bCkgewotCXN0YXJ0dXBfY2hpbGRyZW4ocmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0KTsKLQlyZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQgPSAwOwotICAgIH0KLSAgICBlbHNlIHsKLQkvKiBnaXZlIHRoZSBzeXN0ZW0gc29tZSB0aW1lIHRvIHJlY292ZXIgYmVmb3JlIGtpY2tpbmcgaW50bwotCSAgICAqIGV4cG9uZW50aWFsIG1vZGUgKi8KLQlob2xkX29mZl9vbl9leHBvbmVudGlhbF9zcGF3bmluZyA9IDEwOwotICAgIH0KLQotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwgMCwgc2VydmVyX2NvbmYsCi0JCSIlcyBjb25maWd1cmVkIC0tIHJlc3VtaW5nIG5vcm1hbCBvcGVyYXRpb25zIiwKLQkJYXBfZ2V0X3NlcnZlcl92ZXJzaW9uKCkpOwotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0lORk8sIDAsIHNlcnZlcl9jb25mLAotCQkiU2VydmVyIGJ1aWx0OiAlcyIsIGFwX2dldF9zZXJ2ZXJfYnVpbHQoKSk7Ci0gICAgcmVzdGFydF9wZW5kaW5nID0gc2h1dGRvd25fcGVuZGluZyA9IDA7Ci0KLSAgICB3aGlsZSAoIXJlc3RhcnRfcGVuZGluZyAmJiAhc2h1dGRvd25fcGVuZGluZykgewotCWludCBjaGlsZF9zbG90OwotCWFwX3dhaXRfdCBzdGF0dXM7Ci0JaW50IHRpZCA9IHdhaXRfb3JfdGltZW91dCgmc3RhdHVzKTsKLQotCS8qIFhYWDogaWYgaXQgdGFrZXMgbG9uZ2VyIHRoYW4gMSBzZWNvbmQgZm9yIGFsbCBvdXIgY2hpbGRyZW4KLQkgKiB0byBzdGFydCB1cCBhbmQgZ2V0IGludG8gSURMRSBzdGF0ZSB0aGVuIHdlIG1heSBzcGF3biBhbgotCSAqIGV4dHJhIGNoaWxkCi0JICovCi0JaWYgKHRpZCA+PSAwKSB7Ci0JICAgIHByb2Nlc3NfY2hpbGRfc3RhdHVzKHRpZCwgc3RhdHVzKTsKLQkgICAgLyogbm9uLWZhdGFsIGRlYXRoLi4uIG5vdGUgdGhhdCBpdCdzIGdvbmUgaW4gdGhlIHNjb3JlYm9hcmQuICovCi0JICAgIGNoaWxkX3Nsb3QgPSBmaW5kX2NoaWxkX2J5X3RpZCh0aWQpOwotCSAgICBpZiAoY2hpbGRfc2xvdCA+PSAwKSB7Ci0JCSh2b2lkKSBhcF91cGRhdGVfY2hpbGRfc3RhdHVzKGNoaWxkX3Nsb3QsIFNFUlZFUl9ERUFELAotCQkJCQkgICAgKHJlcXVlc3RfcmVjICopIE5VTEwpOwotCQlpZiAocmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0Ci0JCSAgICAmJiBjaGlsZF9zbG90IDwgYXBfZGFlbW9uc19saW1pdCkgewotCQkgICAgLyogd2UncmUgc3RpbGwgZG9pbmcgYSAxLWZvci0xIHJlcGxhY2VtZW50IG9mIGRlYWQKLQkJCSogY2hpbGRyZW4gd2l0aCBuZXcgY2hpbGRyZW4KLQkJCSovCi0JCSAgICBtYWtlX2NoaWxkKHNlcnZlcl9jb25mLCBjaGlsZF9zbG90LCB0aW1lKDApKTsKLQkJICAgIC0tcmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0OwotCQl9Ci0jaWZkZWYgSEFTX09USEVSX0NISUxECi0vKiBUT0RPOiB0aGlzIHdvbid0IHdvcmssIHdlIHdhaXRlZCBvbiBhIHRocmVhZCBub3QgYSBwcm9jZXNzCi0JICAgIH0KLQkgICAgZWxzZSBpZiAocmVhcF9vdGhlcl9jaGlsZChwaWQsIHN0YXR1cykgPT0gMCkgewotKi8KLSNlbmRpZgotCSAgICB9Ci0JICAgIGVsc2UgaWYgKGlzX2dyYWNlZnVsKSB7Ci0JCS8qIEdyZWF0LCB3ZSd2ZSBwcm9iYWJseSBqdXN0IGxvc3QgYSBzbG90IGluIHRoZQotCQkgICAgKiBzY29yZWJvYXJkLiAgU29tZWhvdyB3ZSBkb24ndCBrbm93IGFib3V0IHRoaXMKLQkJICAgICogY2hpbGQuCi0JCSAgICAqLwotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLCAwLCBzZXJ2ZXJfY29uZiwKLQkJCSAgICAibG9uZyBsb3N0IGNoaWxkIGNhbWUgaG9tZSEgKHRpZCAlZCkiLCB0aWQpOwotCSAgICB9Ci0JICAgIC8qIERvbid0IHBlcmZvcm0gaWRsZSBtYWludGVuYW5jZSB3aGVuIGEgY2hpbGQgZGllcywKLQkJKiBvbmx5IGRvIGl0IHdoZW4gdGhlcmUncyBhIHRpbWVvdXQuICBSZW1lbWJlciBvbmx5IGEKLQkJKiBmaW5pdGUgbnVtYmVyIG9mIGNoaWxkcmVuIGNhbiBkaWUsIGFuZCBpdCdzIHByZXR0eQotCQkqIHBhdGhvbG9naWNhbCBmb3IgYSBsb3QgdG8gZGllIHN1ZGRlbmx5LgotCQkqLwotCSAgICBjb250aW51ZTsKLQl9Ci0JZWxzZSBpZiAocmVtYWluaW5nX2NoaWxkcmVuX3RvX3N0YXJ0KSB7Ci0JICAgIC8qIHdlIGhpdCBhIDEgc2Vjb25kIHRpbWVvdXQgaW4gd2hpY2ggbm9uZSBvZiB0aGUgcHJldmlvdXMKLQkJKiBnZW5lcmF0aW9uIG9mIGNoaWxkcmVuIG5lZWRlZCB0byBiZSByZWFwZWQuLi4gc28gYXNzdW1lCi0JCSogdGhleSdyZSBhbGwgZG9uZSwgYW5kIHBpY2sgdXAgdGhlIHNsYWNrIGlmIGFueSBpcyBsZWZ0LgotCQkqLwotCSAgICBzdGFydHVwX2NoaWxkcmVuKHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydCk7Ci0JICAgIHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydCA9IDA7Ci0JICAgIC8qIEluIGFueSBldmVudCB3ZSByZWFsbHkgc2hvdWxkbid0IGRvIHRoZSBjb2RlIGJlbG93IGJlY2F1c2UKLQkJKiBmZXcgb2YgdGhlIHNlcnZlcnMgd2UganVzdCBzdGFydGVkIGFyZSBpbiB0aGUgSURMRSBzdGF0ZQotCQkqIHlldCwgc28gd2UnZCBtaXN0YWtlbmx5IGNyZWF0ZSBhbiBleHRyYSBzZXJ2ZXIuCi0JCSovCi0JICAgIGNvbnRpbnVlOwotCX0KLQotCXBlcmZvcm1faWRsZV9zZXJ2ZXJfbWFpbnRlbmFuY2UoKTsKLSAgICB9Ci0KLSAgICBpZiAoc2h1dGRvd25fcGVuZGluZykgewotCS8qIFRpbWUgdG8gZ3JhY2VmdWxseSBzaHV0IGRvd24gKi8KLSAgICAgICAgY29uc3QgY2hhciAqcGlkZmlsZSA9IE5VTEw7Ci0gICAgICAgIGludCBzbG90OwotICAgICAgICBUSUQgdGlkOwotICAgICAgICBVTE9ORyByYzsKLQotICAgICAgICAvKiBLaWxsIG9mZiBydW5uaW5nIHRocmVhZHMgKi8KLSAgICAgICAgZm9yIChzbG90PTA7IHNsb3Q8bWF4X2RhZW1vbnNfbGltaXQ7IHNsb3QrKykgewotICAgICAgICAgICAgaWYgKGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnNlcnZlcnNbc2xvdF0uc3RhdHVzICE9IFNFUlZFUl9ERUFEKSB7Ci0gICAgICAgICAgICAgICAgdGlkID0gYXBfc2NvcmVib2FyZF9pbWFnZS0+cGFyZW50W3Nsb3RdLnRpZDsKLSAgICAgICAgICAgICAgICByYyA9IERvc0tpbGxUaHJlYWQodGlkKTsKLQotICAgICAgICAgICAgICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJjID0gRG9zV2FpdFRocmVhZCgmdGlkLCBEQ1dXX1dBSVQpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChyYykgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfV0FSTklORywgMCwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yICVsdSB3YWl0aW5nIGZvciB0aHJlYWQgdG8gdGVybWluYXRlIiwgcmMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfV0FSTklORywgMCwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IgJWx1IGtpbGxpbmcgdGhyZWFkIiwgcmMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIGNsZWFudXAgcGlkIGZpbGUgb24gbm9ybWFsIHNodXRkb3duICovCi0gICAgICAgIHBpZGZpbGUgPSBhcF9zZXJ2ZXJfcm9vdF9yZWxhdGl2ZSAocGNvbmYsIGFwX3BpZF9mbmFtZSk7Ci0gICAgICAgIGlmICggcGlkZmlsZSAhPSBOVUxMICYmIHVubGluayhwaWRmaWxlKSA9PSAwKQotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3ZlZCBQSUQgZmlsZSAlcyAocGlkPSVsZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZGZpbGUsIChsb25nKWdldHBpZCgpKTsKLQotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX05PVElDRSwgMCwgc2VydmVyX2NvbmYsCi0JCSAgICAiY2F1Z2h0IFNJR1RFUk0sIHNodXR0aW5nIGRvd24iKTsKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiB3ZSd2ZSBiZWVuIHRvbGQgdG8gcmVzdGFydCAqLwotICAgIHNpZ25hbChTSUdIVVAsIFNJR19JR04pOwotICAgIHNpZ25hbChTSUdVU1IxLCBTSUdfSUdOKTsKLQotICAgIGlmIChvbmVfcHJvY2VzcykgewotCS8qIG5vdCB3b3J0aCB0aGlua2luZyBhYm91dCAqLwotCXJldHVybiAxOwotICAgIH0KLQotICAgIC8qIGFkdmFuY2UgdG8gdGhlIG5leHQgZ2VuZXJhdGlvbiAqLwotICAgIC8qIFhYWDogd2UgcmVhbGx5IG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgbmV3IGdlbmVyYXRpb24gbnVtYmVyIGlzbid0IGluCi0gICAgICogdXNlIGJ5IGFueSBvZiB0aGUgY2hpbGRyZW4uCi0gICAgICovCi0gICAgKythcF9zY29yZWJvYXJkX2ltYWdlLT5nbG9iYWwucnVubmluZ19nZW5lcmF0aW9uOwotCi0gICAgaWYgKGlzX2dyYWNlZnVsKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCAwLCBzZXJ2ZXJfY29uZiwKLQkJICAgICJTSUdVU1IxIHJlY2VpdmVkLiAgRG9pbmcgZ3JhY2VmdWwgcmVzdGFydCIpOwotCi0gICAgICAgIC8qIGtpbGwgb2ZmIHRoZSBpZGxlIG9uZXMgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGFwX2RhZW1vbnNfbGltaXQ7ICsraSkgewotICAgICAgICAgICAgYXBfc2NvcmVib2FyZF9pbWFnZS0+cGFyZW50W2ldLmRlZmVycmVkX2RpZSA9IDE7Ci0gICAgICAgIH0KLQotCS8qIFRoaXMgaXMgbW9zdGx5IGZvciBkZWJ1Z2dpbmcuLi4gc28gdGhhdCB3ZSBrbm93IHdoYXQgaXMgc3RpbGwKLQkgICAgKiBncmFjZWZ1bGx5IGRlYWxpbmcgd2l0aCBleGlzdGluZyByZXF1ZXN0LiAgQnV0IHdlIGNhbid0IHJlYWxseQotCSAgICAqIGRvIGl0IGlmIHdlJ3JlIGluIGEgU0NPUkVCT0FSRF9GSUxFIGJlY2F1c2UgaXQnbGwgY2F1c2UKLQkgICAgKiBjb3JydXB0aW9uIHRvbyBlYXNpbHkuCi0JICAgICovCi0JZm9yIChpID0gMDsgaSA8IGFwX2RhZW1vbnNfbGltaXQ7ICsraSkgewotCSAgICBpZiAoYXBfc2NvcmVib2FyZF9pbWFnZS0+c2VydmVyc1tpXS5zdGF0dXMgIT0gU0VSVkVSX0RFQUQpIHsKLQkJYXBfc2NvcmVib2FyZF9pbWFnZS0+c2VydmVyc1tpXS5zdGF0dXMgPSBTRVJWRVJfR1JBQ0VGVUw7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIGVsc2UgewotCS8qIEtpbGwgJ2VtIG9mZiAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXBfZGFlbW9uc19saW1pdDsgKytpKSB7Ci0gICAgICAgICAgICBEb3NLaWxsVGhyZWFkKGFwX3Njb3JlYm9hcmRfaW1hZ2UtPnBhcmVudFtpXS50aWQpOwotICAgICAgICB9Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfTk9USUNFLCAwLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJTSUdIVVAgcmVjZWl2ZWQuICBBdHRlbXB0aW5nIHRvIHJlc3RhcnQiKTsKLSAgICB9Ci0KLSAgICBpZiAoIWlzX2dyYWNlZnVsKSB7Ci0JYXBfcmVzdGFydF90aW1lID0gdGltZShOVUxMKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc3BtdF9vczJfcHJlX2NvbmZpZyhhcF9jb250ZXh0X3QgKnBjb25mLCBhcF9jb250ZXh0X3QgKnBsb2csIGFwX2NvbnRleHRfdCAqcHRlbXApCi17Ci0gICAgb25lX3Byb2Nlc3MgPSAhIWdldGVudigiT05FX1BST0NFU1MiKTsKLQotICAgIGlzX2dyYWNlZnVsID0gMDsKLSAgICBhcF9saXN0ZW5fcHJlX2NvbmZpZygpOwotICAgIGFwX2RhZW1vbnNfdG9fc3RhcnQgPSBERUZBVUxUX1NUQVJUX0RBRU1PTjsKLSAgICBhcF9kYWVtb25zX21pbl9mcmVlID0gREVGQVVMVF9NSU5fRlJFRV9EQUVNT047Ci0gICAgYXBfZGFlbW9uc19tYXhfZnJlZSA9IERFRkFVTFRfTUFYX0ZSRUVfREFFTU9OOwotICAgIGFwX2RhZW1vbnNfbGltaXQgPSBIQVJEX1NFUlZFUl9MSU1JVDsKLSAgICBhcF9waWRfZm5hbWUgPSBERUZBVUxUX1BJRExPRzsKLSAgICBhcF9tYXhfcmVxdWVzdHNfcGVyX2NoaWxkID0gREVGQVVMVF9NQVhfUkVRVUVTVFNfUEVSX0NISUxEOwotICAgIGFwX2V4dGVuZGVkX3N0YXR1cyA9IDA7Ci0KLSAgICBhcF9jcHlzdHJuKGFwX2NvcmVkdW1wX2RpciwgYXBfc2VydmVyX3Jvb3QsIHNpemVvZihhcF9jb3JlZHVtcF9kaXIpKTsKLX0KLQotc3RhdGljIHZvaWQgc3BtdF9vczJfaG9va3Modm9pZCkKLXsKLSAgICBhcF9ob29rX3ByZV9jb25maWcoc3BtdF9vczJfcHJlX2NvbmZpZyxOVUxMLE5VTEwsSE9PS19NSURETEUpOwotICAgIElOSVRfU0lHTElTVCgpOwotICAgIC8qIFRPRE86IHNldCBvbmVfcHJvY2VzcyBwcm9wZXJseSAqLyBvbmVfcHJvY2VzcyA9IDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfcGlkZmlsZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKGNtZC0+c2VydmVyLT5pc192aXJ0dWFsKSB7Ci0JcmV0dXJuICJQaWRGaWxlIGRpcmVjdGl2ZSBub3QgYWxsb3dlZCBpbiA8VmlydHVhbEhvc3Q+IjsKLSAgICB9Ci0gICAgYXBfcGlkX2ZuYW1lID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X2RhZW1vbnNfdG9fc3RhcnQoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgYXBfZGFlbW9uc190b19zdGFydCA9IGF0b2koYXJnKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9taW5fZnJlZV9zZXJ2ZXJzKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX2RhZW1vbnNfbWluX2ZyZWUgPSBhdG9pKGFyZyk7Ci0gICAgaWYgKGFwX2RhZW1vbnNfbWluX2ZyZWUgPD0gMCkgewotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICJXQVJOSU5HOiBkZXRlY3RlZCBNaW5TcGFyZVNlcnZlcnMgc2V0IHRvIG5vbi1wb3NpdGl2ZS4iKTsKLSAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAiUmVzZXR0aW5nIHRvIDEgdG8gYXZvaWQgYWxtb3N0IGNlcnRhaW4gQXBhY2hlIGZhaWx1cmUuIik7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uLiIpOwotICAgICAgIGFwX2RhZW1vbnNfbWluX2ZyZWUgPSAxOwotICAgIH0KLSAgICAgICAKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9tYXhfZnJlZV9zZXJ2ZXJzKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX2RhZW1vbnNfbWF4X2ZyZWUgPSBhdG9pKGFyZyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfc2VydmVyX2xpbWl0IChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgYXBfZGFlbW9uc19saW1pdCA9IGF0b2koYXJnKTsKLSAgICBpZiAoYXBfZGFlbW9uc19saW1pdCA+IEhBUkRfU0VSVkVSX0xJTUlUKSB7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgIldBUk5JTkc6IE1heENsaWVudHMgb2YgJWQgZXhjZWVkcyBjb21waWxlIHRpbWUgbGltaXQgIgotICAgICAgICAgICAgICAgICAgICAib2YgJWQgc2VydmVycywiLCBhcF9kYWVtb25zX2xpbWl0LCBIQVJEX1NFUlZFUl9MSU1JVCk7Ci0gICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgIiBsb3dlcmluZyBNYXhDbGllbnRzIHRvICVkLiAgVG8gaW5jcmVhc2UsIHBsZWFzZSAiCi0gICAgICAgICAgICAgICAgICAgICJzZWUgdGhlIiwgSEFSRF9TRVJWRVJfTElNSVQpOwotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICIgSEFSRF9TRVJWRVJfTElNSVQgZGVmaW5lIGluIHNyYy9pbmNsdWRlL2h0dHBkLmguIik7Ci0gICAgICAgYXBfZGFlbW9uc19saW1pdCA9IEhBUkRfU0VSVkVSX0xJTUlUOwotICAgIH0gCi0gICAgZWxzZSBpZiAoYXBfZGFlbW9uc19saW1pdCA8IDEpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIldBUk5JTkc6IFJlcXVpcmUgTWF4Q2xpZW50cyA+IDAsIHNldHRpbmcgdG8gMSIpOwotCWFwX2RhZW1vbnNfbGltaXQgPSAxOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9tYXhfcmVxdWVzdHMoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQgPSBhdG9pKGFyZyk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNldF9jb3JlZHVtcGRpciAoY21kX3Bhcm1zICpjbWQsIHZvaWQgKmR1bW15LCBjaGFyICphcmcpIAotewotICAgIHN0cnVjdCBzdGF0IGZpbmZvOwotICAgIGNvbnN0IGNoYXIgKmZuYW1lOwotICAgIGNvbnN0IGNoYXIgKmVyciA9IGFwX2NoZWNrX2NtZF9jb250ZXh0KGNtZCwgR0xPQkFMX09OTFkpOwotICAgIGlmIChlcnIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGZuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUoY21kLT5wb29sLCBhcmcpOwotICAgIGlmICgoc3RhdChmbmFtZSwgJmZpbmZvKSA9PSAtMSkgfHwgIVNfSVNESVIoZmluZm8uc3RfbW9kZSkpIHsKLQlyZXR1cm4gYXBfcHN0cmNhdChjbWQtPnBvb2wsICJDb3JlRHVtcERpcmVjdG9yeSAiLCBmbmFtZSwgCi0JCQkgICIgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgZGlyZWN0b3J5IiwgTlVMTCk7Ci0gICAgfQotICAgIGFwX2NweXN0cm4oYXBfY29yZWR1bXBfZGlyLCBmbmFtZSwgc2l6ZW9mKGFwX2NvcmVkdW1wX2RpcikpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKiBTdHViIGZ1bmN0aW9ucyB1bnRpbCB0aGlzIE1QTSBzdXBwb3J0cyB0aGUgY29ubmVjdGlvbiBzdGF0dXMgQVBJICovCi0KLUFQSV9FWFBPUlQodm9pZCkgYXBfdXBkYXRlX2Nvbm5lY3Rpb25fc3RhdHVzKGxvbmcgY29ubl9pZCwgY29uc3QgY2hhciAqa2V5LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSkKLXsKLSAgICAvKiBOT1AgKi8KLX0KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9yZXNldF9jb25uZWN0aW9uX3N0YXR1cyhsb25nIGNvbm5faWQpCi17Ci0gICAgLyogTk9QICovCi19Ci0KLXN0YXRpYyBjb25zdCBjb21tYW5kX3JlYyBzcG10X29zMl9jbWRzW10gPSB7Ci1MSVNURU5fQ09NTUFORFMKLXsgIlBpZEZpbGUiLCBzZXRfcGlkZmlsZSwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgICAiQSBmaWxlIGZvciBsb2dnaW5nIHRoZSBzZXJ2ZXIgcHJvY2VzcyBJRCJ9LAoteyAiU3RhcnRTZXJ2ZXJzIiwgc2V0X2RhZW1vbnNfdG9fc3RhcnQsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJOdW1iZXIgb2YgY2hpbGQgcHJvY2Vzc2VzIGxhdW5jaGVkIGF0IHNlcnZlciBzdGFydHVwIiB9LAoteyAiTWluU3BhcmVTZXJ2ZXJzIiwgc2V0X21pbl9mcmVlX3NlcnZlcnMsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJNaW5pbXVtIG51bWJlciBvZiBpZGxlIGNoaWxkcmVuLCB0byBoYW5kbGUgcmVxdWVzdCBzcGlrZXMiIH0sCi17ICJNYXhTcGFyZVNlcnZlcnMiLCBzZXRfbWF4X2ZyZWVfc2VydmVycywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIk1heGltdW0gbnVtYmVyIG9mIGlkbGUgY2hpbGRyZW4iIH0sCi17ICJNYXhDbGllbnRzIiwgc2V0X3NlcnZlcl9saW1pdCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIk1heGltdW0gbnVtYmVyIG9mIGNoaWxkcmVuIGFsaXZlIGF0IHRoZSBzYW1lIHRpbWUiIH0sCi17ICJNYXhSZXF1ZXN0c1BlckNoaWxkIiwgc2V0X21heF9yZXF1ZXN0cywgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIk1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIGEgcGFydGljdWxhciBjaGlsZCBzZXJ2ZXMgYmVmb3JlIGR5aW5nLiIgfSwKLXsgIkNvcmVEdW1wRGlyZWN0b3J5Iiwgc2V0X2NvcmVkdW1wZGlyLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiVGhlIGxvY2F0aW9uIG9mIHRoZSBkaXJlY3RvcnkgQXBhY2hlIGNoYW5nZXMgdG8gYmVmb3JlIGR1bXBpbmcgY29yZSIgfSwKLXsgTlVMTCB9Ci19OwotCi1tb2R1bGUgTU9EVUxFX1ZBUl9FWFBPUlQgbXBtX3NwbXRfb3MyX21vZHVsZSA9IHsKLSAgICBTVEFOREFSRDIwX01PRFVMRV9TVFVGRiwKLSAgICBOVUxMLAkJCS8qIGNyZWF0ZSBwZXItZGlyZWN0b3J5IGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgICBOVUxMLAkJCS8qIG1lcmdlIHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgICBOVUxMLAkJCS8qIGNyZWF0ZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLSAgICBOVUxMLAkJCS8qIG1lcmdlIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgICBzcG10X29zMl9jbWRzLAkJLyogY29tbWFuZCBhcF90YWJsZV90ICovCi0gICAgTlVMTCwJCQkvKiBoYW5kbGVycyAqLwotICAgIHNwbXRfb3MyX2hvb2tzLAkJLyogcmVnaXN0ZXJfaG9va3MgKi8KLX07CmRpZmYgLS1naXQgYS9zZXJ2ZXIvbXBtL3dpbm50L21wbV9kZWZhdWx0LmggYi9zZXJ2ZXIvbXBtL3dpbm50L21wbV9kZWZhdWx0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYjFjZWIuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS93aW5udC9tcG1fZGVmYXVsdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIAotICogYXJlIG1ldDogCi0gKiAKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAgCi0gKiAKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIAotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSAKLSAqICAgIGRpc3RyaWJ1dGlvbi4gCi0gKiAKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyAKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAgCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIiAKLSAqIAotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0byAKLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCAKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLiAKLSAqIAotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIgCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuIAotICogCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nIAotICogICAgYWNrbm93bGVkZ21lbnQ6IAotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cCAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iIAotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkgCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIAotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IgCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgCi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gKiAKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55IAotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkIAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIAotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLiAKLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4gCi0gKiAKLSAqLyAKLQotI2lmbmRlZiBBUEFDSEVfTVBNX0RFRkFVTFRfSAotI2RlZmluZSBBUEFDSEVfTVBNX0RFRkFVTFRfSAotCi0vKiBOdW1iZXIgb2YgdGhyZWFkcyB0byBzcGF3biBvZmYgYnkgZGVmYXVsdCAtLS0gYWxzbywgaWYgZmV3ZXIgdGhhbgotICogdGhpcyBmcmVlIHdoZW4gdGhlIGNhcmV0YWtlciBjaGVja3MsIGl0IHdpbGwgc3Bhd24gbW9yZS4KLSAqLwotI2lmbmRlZiBERUZBVUxUX1NUQVJUX1RIUkVBRAotI2RlZmluZSBERUZBVUxUX1NUQVJUX1RIUkVBRCA1Ci0jZW5kaWYKLQotLyogTWF4aW11bSBudW1iZXIgb2YgKmZyZWUqIHNlcnZlciB0aHJlYWRzIC0tLSBtb3JlIHRoYW4gdGhpcywgYW5kCi0gKiB0aGV5IHdpbGwgZGllIG9mZi4KLSNpZm5kZWYgREVGQVVMVF9NQVhfU1BBUkVfVEhSRUFECi0jZGVmaW5lIERFRkFVTFRfTUFYX1NQQVJFX1RIUkVBRCAxMAotI2VuZGlmCi0qLwotCi0vKiBNaW5pbXVtIC0tLSBmZXdlciB0aGFuIHRoaXMsIGFuZCBtb3JlIHdpbGwgYmUgY3JlYXRlZCAqLwotLyoKLSNpZm5kZWYgREVGQVVMVF9NSU5fU1BBUkVfVEhSRUFECi0jZGVmaW5lIERFRkFVTFRfTUlOX1NQQVJFX1RIUkVBRCA1Ci0jZW5kaWYKLSovCi0KLS8qIExpbWl0IG9uIHRoZSB0aHJlYWRzIHBlciBwcm9jZXNzLiAgQ2xpZW50cyB3aWxsIGJlIGxvY2tlZCBvdXQgaWYgbW9yZSB0aGFuCi0gKiB0aGlzICAqIEhBUkRfU0VSVkVSX0xJTUlUIGFyZSBuZWVkZWQuCi0gKgotICogV2Uga2VlcCB0aGlzIGZvciBvbmUgcmVhc29uIGl0IGtlZXBzIHRoZSBzaXplIG9mIHRoZSBzY29yZWJvYXJkIGZpbGUgc21hbGwKLSAqIGVub3VnaCB0aGF0IHdlIGNhbiByZWFkIHRoZSB3aG9sZSB0aGluZyB3aXRob3V0IHdvcnJ5aW5nIHRvbyBtdWNoIGFib3V0Ci0gKiB0aGUgb3ZlcmhlYWQuCi0gKi8KLSNpZm5kZWYgSEFSRF9USFJFQURfTElNSVQKLSNkZWZpbmUgSEFSRF9USFJFQURfTElNSVQgNjQgCi0jZW5kaWYKLQotLyogTnVtYmVyIG9mIHNlcnZlcnMgdG8gc3Bhd24gb2ZmIGJ5IGRlZmF1bHQKLSAqLwotI2lmbmRlZiBERUZBVUxUX05VTV9EQUVNT04KLSNkZWZpbmUgREVGQVVMVF9OVU1fREFFTU9OIDEKLSNlbmRpZgotCi0vKiBMaW1pdCBvbiB0aGUgdG90YWwgLS0tIGNsaWVudHMgd2lsbCBiZSBsb2NrZWQgb3V0IGlmIG1vcmUgc2VydmVycyB0aGFuCi0gKiB0aGlzIGFyZSBuZWVkZWQuICBJdCBpcyBpbnRlbmRlZCBzb2xlbHkgdG8ga2VlcCB0aGUgc2VydmVyIGZyb20gY3Jhc2hpbmcKLSAqIHdoZW4gdGhpbmdzIGdldCBvdXQgb2YgaGFuZC4KLSAqCi0gKiBXZSBrZWVwIGEgaGFyZCBtYXhpbXVtIG51bWJlciBvZiBzZXJ2ZXJzLCBmb3IgdHdvIHJlYXNvbnMgLS0tIGZpcnN0IG9mZiwKLSAqIGluIGNhc2Ugc29tZXRoaW5nIGdvZXMgc2VyaW91c2x5IHdyb25nLCB3ZSB3YW50IHRvIHN0b3AgdGhlIGZvcmsgYm9tYgotICogc2hvcnQgb2YgYWN0dWFsbHkgY3Jhc2hpbmcgdGhlIG1hY2hpbmUgd2UncmUgcnVubmluZyBvbiBieSBmaWxsaW5nIHNvbWUKLSAqIGtlcm5lbCB0YWJsZS4gIFNlY29uZGx5LCBpdCBrZWVwcyB0aGUgc2l6ZSBvZiB0aGUgc2NvcmVib2FyZCBmaWxlIHNtYWxsCi0gKiBlbm91Z2ggdGhhdCB3ZSBjYW4gcmVhZCB0aGUgd2hvbGUgdGhpbmcgd2l0aG91dCB3b3JyeWluZyB0b28gbXVjaCBhYm91dAotICogdGhlIG92ZXJoZWFkLgotICovCi0jaWZuZGVmIEhBUkRfU0VSVkVSX0xJTUlUCi0jZGVmaW5lIEhBUkRfU0VSVkVSX0xJTUlUIDggCi0jZW5kaWYKLQotLyogV2hlcmUgdGhlIG1haW4vcGFyZW50IHByb2Nlc3MncyBwaWQgaXMgbG9nZ2VkICovCi0jaWZuZGVmIERFRkFVTFRfUElETE9HCi0jZGVmaW5lIERFRkFVTFRfUElETE9HICJsb2dzL2h0dHBkLnBpZCIKLSNlbmRpZgotCi0vKgotICogSW50ZXJ2YWwsIGluIG1pY3Jvc2Vjb25kcywgYmV0d2VlbiBzY29yZWJvYXJkIG1haW50ZW5hbmNlLgotICovCi0jaWZuZGVmIFNDT1JFQk9BUkRfTUFJTlRFTkFOQ0VfSU5URVJWQUwKLSNkZWZpbmUgU0NPUkVCT0FSRF9NQUlOVEVOQU5DRV9JTlRFUlZBTCAxMDAwMDAwCi0jZW5kaWYKLQotLyogTnVtYmVyIG9mIHJlcXVlc3RzIHRvIHRyeSB0byBoYW5kbGUgaW4gYSBzaW5nbGUgcHJvY2Vzcy4gIElmIDw9IDAsCi0gKiB0aGUgY2hpbGRyZW4gZG9uJ3QgZGllIG9mZi4KLSAqLwotI2lmbmRlZiBERUZBVUxUX01BWF9SRVFVRVNUU19QRVJfQ0hJTEQKLSNkZWZpbmUgREVGQVVMVF9NQVhfUkVRVUVTVFNfUEVSX0NISUxEIDEwMDAwCi0jZW5kaWYKLQotI2VuZGlmIC8qIEFQX01QTV9ERUZBVUxUX0ggKi8KZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vd2lubnQvbXBtX3dpbm50LmMgYi9zZXJ2ZXIvbXBtL3dpbm50L21wbV93aW5udC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWJkOWVkLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vd2lubnQvbXBtX3dpbm50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUyICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIAotICogYXJlIG1ldDogCi0gKiAKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAgCi0gKiAKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIAotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSAKLSAqICAgIGRpc3RyaWJ1dGlvbi4gCi0gKiAKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyAKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAgCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIiAKLSAqIAotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0byAKLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCAKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLiAKLSAqIAotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIgCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuIAotICogCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nIAotICogICAgYWNrbm93bGVkZ21lbnQ6IAotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cCAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iIAotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkgCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIAotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IgCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgCi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gKiAKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55IAotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkIAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIAotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLiAKLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4gCi0gKiAKLSAqLyAKLSAKLSNkZWZpbmUgQ09SRV9QUklWQVRFIAotI2luY2x1ZGUgImFwcl9wb3J0YWJsZS5oIgotI2luY2x1ZGUgImh0dHBkLmgiIAotI2luY2x1ZGUgImh0dHBfbWFpbi5oIiAKLSNpbmNsdWRlICJodHRwX2xvZy5oIiAKLSNpbmNsdWRlICJodHRwX2NvbmZpZy5oIgkvKiBmb3IgcmVhZF9jb25maWcgKi8gCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCQkvKiBmb3IgZ2V0X3JlbW90ZV9ob3N0ICovIAotI2luY2x1ZGUgImh0dHBfY29ubmVjdGlvbi5oIgotI2luY2x1ZGUgImFwX21wbS5oIgotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImFwX2xpc3Rlbi5oIgotI2luY2x1ZGUgIm1wbV9kZWZhdWx0LmgiCi0jaW5jbHVkZSAic2VydmljZS5oIgotI2luY2x1ZGUgImlvbF9zb2NrZXQuaCIKLSNpbmNsdWRlICJ3aW5udC5oIgotCi0KLS8qCi0gKiBEZWZpbml0aW9ucyBvZiBXSU5OVCBNUE0gc3BlY2lmaWMgY29uZmlnIGdsb2JhbHMKLSAqLwotCi1zdGF0aWMgY2hhciAqYXBfcGlkX2ZuYW1lID0gTlVMTDsKLXN0YXRpYyBpbnQgYXBfdGhyZWFkc19wZXJfY2hpbGQgPSAwOwotc3RhdGljIGludCB3b3JrZXJzX21heV9leGl0ID0gMDsKLXN0YXRpYyBpbnQgbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCA9IDA7Ci0KLXN0YXRpYyBzdHJ1Y3QgZmRfc2V0IGxpc3RlbmZkczsKLXN0YXRpYyBpbnQgbnVtX2xpc3RlbmZkcyA9IDA7Ci1zdGF0aWMgU09DS0VUIGxpc3Rlbm1heGZkID0gSU5WQUxJRF9TT0NLRVQ7Ci0KLXN0YXRpYyBhcF9jb250ZXh0X3QgKnBjb25mOwkJLyogUG9vbCBmb3IgY29uZmlnIHN0dWZmICovCi0KLXN0YXRpYyBjaGFyIGFwX2NvcmVkdW1wX2RpcltNQVhfU1RSSU5HX0xFTl07Ci0KLXN0YXRpYyBzZXJ2ZXJfcmVjICpzZXJ2ZXJfY29uZjsKLXN0YXRpYyBIQU5ETEUgQWNjZXB0RXhDb21wUG9ydCA9IE5VTEw7Ci0KLXN0YXRpYyBpbnQgb25lX3Byb2Nlc3MgPSAwOwotCi1zdGF0aWMgT1NWRVJTSU9OSU5GTyBvc3ZlcjsgLyogVkVSX1BMQVRGT1JNX1dJTjMyX05UICovCi0KLWludCBhcF9tYXhfcmVxdWVzdHNfcGVyX2NoaWxkPTA7Ci1pbnQgYXBfZGFlbW9uc190b19zdGFydD0wOwotCi1ldmVudCAqZXhpdF9ldmVudDsKLWFwX2xvY2tfdCAqc3RhcnRfbXV0ZXg7Ci1pbnQgbXlfcGlkOwotaW50IHBhcmVudF9waWQ7Ci0KLXN0YXRpYyBhcF9zdGF0dXNfdCBzb2NrZXRfY2xlYW51cCh2b2lkICpzb2NrKQotewotICAgIHN0cnVjdCBzb2NrZXRfdCAqdGhlc29ja2V0ID0gc29jazsKLSAgICBTT0NLRVQgc2Q7Ci0gICAgaWYgKGFwX2dldF9vc19zb2NrKCZzZCwgdGhlc29ja2V0KSA9PSBBUFJfU1VDQ0VTUykgewotICAgICAgICBjbG9zZXNvY2tldChzZCk7Ci0gICAgfQotICAgIHJldHVybiBBUFJfU1VDQ0VTUzsKLX0KLQotLyogQSBidW5jaCBvciByb3V0aW5lcyBmcm9tIG9zL3dpbjMyL211bHRpdGhyZWFkLmMgdGhhdCBuZWVkIHRvIGJlIG1lcmdlZCBpbnRvIEFQUgotICogb3IgdGhyb3duIG91dCBlbnRpcmVseS4uLgotICovCi0KLXN0YXRpYyBpbnQKLW1hcF9ydihpbnQgcnYpCi17Ci0gICAgc3dpdGNoKHJ2KQotICAgIHsKLSAgICBjYXNlIFdBSVRfT0JKRUNUXzA6Ci0gICAgY2FzZSBXQUlUX0FCQU5ET05FRDoKLSAgICAgICAgcmV0dXJuKE1VTFRJX09LKTsKLSAgICBjYXNlIFdBSVRfVElNRU9VVDoKLSAgICAgICAgcmV0dXJuKE1VTFRJX1RJTUVPVVQpOwotICAgIGNhc2UgV0FJVF9GQUlMRUQ6Ci0gICAgICAgIHJldHVybihNVUxUSV9FUlIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGFwX2Fzc2VydCgwKTsKLSAgICB9Ci0KLSAgICBhcF9hc3NlcnQoMCk7Ci0gICAgcmV0dXJuKDApOwotfQotCi10eXBlZGVmIHZvaWQgc2VtYXBob3JlOwotdHlwZWRlZiB2b2lkIGV2ZW50OwotCi1zdGF0aWMgc2VtYXBob3JlICoKLWNyZWF0ZV9zZW1hcGhvcmUoaW50IGluaXRpYWwpCi17Ci0gICAgcmV0dXJuKENyZWF0ZVNlbWFwaG9yZShOVUxMLCBpbml0aWFsLCAxMDAwMDAwLCBOVUxMKSk7Ci19Ci0KLXN0YXRpYyBpbnQgYWNxdWlyZV9zZW1hcGhvcmUoc2VtYXBob3JlICpzZW1hcGhvcmVfaWQpCi17Ci0gICAgaW50IHJ2OwotICAgIAotICAgIHJ2ID0gV2FpdEZvclNpbmdsZU9iamVjdChzZW1hcGhvcmVfaWQsIElORklOSVRFKTsKLSAgICAKLSAgICByZXR1cm4obWFwX3J2KHJ2KSk7Ci19Ci0KLXN0YXRpYyBpbnQgcmVsZWFzZV9zZW1hcGhvcmUoc2VtYXBob3JlICpzZW1hcGhvcmVfaWQpCi17Ci0gICAgcmV0dXJuKFJlbGVhc2VTZW1hcGhvcmUoc2VtYXBob3JlX2lkLCAxLCBOVUxMKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlc3Ryb3lfc2VtYXBob3JlKHNlbWFwaG9yZSAqc2VtYXBob3JlX2lkKQotewotICAgIENsb3NlSGFuZGxlKHNlbWFwaG9yZV9pZCk7Ci19Ci0KLQotc3RhdGljIGV2ZW50ICoKLWNyZWF0ZV9ldmVudChpbnQgbWFudWFsLCBpbnQgaW5pdGlhbCwgY2hhciAqbmFtZSkKLXsKLSAgICByZXR1cm4oQ3JlYXRlRXZlbnQoTlVMTCwgbWFudWFsLCBpbml0aWFsLCBuYW1lKSk7Ci19Ci0KLXN0YXRpYyBldmVudCAqCi1vcGVuX2V2ZW50KGNoYXIgKm5hbWUpCi17Ci0gICAgcmV0dXJuKE9wZW5FdmVudChFVkVOVF9BTExfQUNDRVNTLCBGQUxTRSwgbmFtZSkpOwotfQotCi0KLXN0YXRpYyBpbnQgYWNxdWlyZV9ldmVudChldmVudCAqZXZlbnRfaWQpCi17Ci0gICAgaW50IHJ2OwotICAgIAotICAgIHJ2ID0gV2FpdEZvclNpbmdsZU9iamVjdChldmVudF9pZCwgSU5GSU5JVEUpOwotICAgIAotICAgIHJldHVybihtYXBfcnYocnYpKTsKLX0KLQotc3RhdGljIGludCBzZXRfZXZlbnQoZXZlbnQgKmV2ZW50X2lkKQotewotICAgIHJldHVybihTZXRFdmVudChldmVudF9pZCkpOwotfQotCi1zdGF0aWMgaW50IHJlc2V0X2V2ZW50KGV2ZW50ICpldmVudF9pZCkKLXsKLSAgICByZXR1cm4oUmVzZXRFdmVudChldmVudF9pZCkpOwotfQotCi0KLXN0YXRpYyB2b2lkIGRlc3Ryb3lfZXZlbnQoZXZlbnQgKmV2ZW50X2lkKQotewotICAgIENsb3NlSGFuZGxlKGV2ZW50X2lkKTsKLX0KLQotLyogVG8gc2hhcmUgdGhlIHNlbWFwaG9yZXMgd2l0aCBvdGhlciBwcm9jZXNzZXMsIHdlIG5lZWQgYSBOVUxMIEFDTAotICogQ29kZSBmcm9tIE1TIEtCIFExMDYzODcKLSAqLwotc3RhdGljIFBTRUNVUklUWV9BVFRSSUJVVEVTIEdldE51bGxBQ0woKQotewotICAgIFBTRUNVUklUWV9ERVNDUklQVE9SIHBTRDsKLSAgICBQU0VDVVJJVFlfQVRUUklCVVRFUyBzYTsKLQotICAgIHNhICA9IChQU0VDVVJJVFlfQVRUUklCVVRFUykgTG9jYWxBbGxvYyhMUFRSLCBzaXplb2YoU0VDVVJJVFlfQVRUUklCVVRFUykpOwotICAgIHBTRCA9IChQU0VDVVJJVFlfREVTQ1JJUFRPUikgTG9jYWxBbGxvYyhMUFRSLAotCQkJCQkgICAgU0VDVVJJVFlfREVTQ1JJUFRPUl9NSU5fTEVOR1RIKTsKLSAgICBpZiAocFNEID09IE5VTEwgfHwgc2EgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKCFJbml0aWFsaXplU2VjdXJpdHlEZXNjcmlwdG9yKHBTRCwgU0VDVVJJVFlfREVTQ1JJUFRPUl9SRVZJU0lPTikKLQl8fCBHZXRMYXN0RXJyb3IoKSkgewotICAgICAgICBMb2NhbEZyZWUoIHBTRCApOwotICAgICAgICBMb2NhbEZyZWUoIHNhICk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoIVNldFNlY3VyaXR5RGVzY3JpcHRvckRhY2wocFNELCBUUlVFLCAoUEFDTCkgTlVMTCwgRkFMU0UpCi0JfHwgR2V0TGFzdEVycm9yKCkpIHsKLSAgICAgICAgTG9jYWxGcmVlKCBwU0QgKTsKLSAgICAgICAgTG9jYWxGcmVlKCBzYSApOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgc2EtPm5MZW5ndGggPSBzaXplb2Yoc2EpOwotICAgIHNhLT5scFNlY3VyaXR5RGVzY3JpcHRvciA9IHBTRDsKLSAgICBzYS0+YkluaGVyaXRIYW5kbGUgPSBUUlVFOwotICAgIHJldHVybiBzYTsKLX0KLQotc3RhdGljIHZvaWQgQ2xlYW5OdWxsQUNMKCB2b2lkICpzYSApIHsKLSAgICBpZiggc2EgKSB7Ci0gICAgICAgIExvY2FsRnJlZSggKChQU0VDVVJJVFlfQVRUUklCVVRFUylzYSktPmxwU2VjdXJpdHlEZXNjcmlwdG9yKTsKLSAgICAgICAgTG9jYWxGcmVlKCBzYSApOwotICAgIH0KLX0KLQotLyoKLSAqIFRoZSBXaW4zMiBjYWxsIFdhaXRGb3JNdWx0aXBsZU9iamVjdHMgd2lsbCBvbmx5IGFsbG93IHlvdSB0byB3YWl0IGZvciAKLSAqIGEgbWF4aW11bSBvZiBNQVhJTVVNX1dBSVRfT0JKRUNUUyAoY3VycmVudCA2NCkuICBTaW5jZSB0aGUgdGhyZWFkaW5nIAotICogbW9kZWwgaW4gdGhlIG11bHRpdGhyZWFkZWQgdmVyc2lvbiBvZiBhcGFjaGUgd2FudHMgdG8gdXNlIHRoaXMgY2FsbCwgCi0gKiB3ZSBhcmUgcmVzdHJpY3RlZCB0byBhIG1heGltdW0gb2YgNjQgdGhyZWFkcy4gIFRoaXMgaXMgYSBzaW1wbGlzdGljIAotICogcm91dGluZSB0aGF0IHdpbGwgaW5jcmVhc2UgdGhpcyBzaXplLgotICovCi1zdGF0aWMgRFdPUkQgd2FpdF9mb3JfbWFueV9vYmplY3RzKERXT1JEIG5Db3VudCwgQ09OU1QgSEFORExFICpscEhhbmRsZXMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1NlY29uZHMpCi17Ci0gICAgdGltZV90IHRTdG9wVGltZTsKLSAgICBEV09SRCBkd1JldCA9IFdBSVRfVElNRU9VVDsKLSAgICBEV09SRCBkd0luZGV4PTA7Ci0gICAgQk9PTCBiRmlyc3QgPSBUUlVFOwotICAKLSAgICB0U3RvcFRpbWUgPSB0aW1lKE5VTEwpICsgZHdTZWNvbmRzOwotICAKLSAgICBkbyB7Ci0gICAgICAgIGlmICghYkZpcnN0KQotICAgICAgICAgICAgU2xlZXAoMTAwMCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJGaXJzdCA9IEZBTFNFOwotICAgICAgICAgIAotICAgICAgICBmb3IgKGR3SW5kZXggPSAwOyBkd0luZGV4ICogTUFYSU1VTV9XQUlUX09CSkVDVFMgPCBuQ291bnQ7IGR3SW5kZXgrKykgewotICAgICAgICAgICAgZHdSZXQgPSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKCAKLSAgICAgICAgICAgICAgICBtaW4oTUFYSU1VTV9XQUlUX09CSkVDVFMsIG5Db3VudCAtIChkd0luZGV4ICogTUFYSU1VTV9XQUlUX09CSkVDVFMpKSwKLSAgICAgICAgICAgICAgICBscEhhbmRsZXMgKyAoZHdJbmRleCAqIE1BWElNVU1fV0FJVF9PQkpFQ1RTKSwgCi0gICAgICAgICAgICAgICAgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZHdSZXQgIT0gV0FJVF9USU1FT1VUKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSB3aGlsZSgodGltZShOVUxMKSA8IHRTdG9wVGltZSkgJiYgKGR3UmV0ID09IFdBSVRfVElNRU9VVCkpOwotICAgIAotICAgIHJldHVybiBkd1JldDsKLX0KLQotLyoKLSAqIFNpZ25hbGxpbmcgQXBhY2hlIG9uIE5ULgotICoKLSAqIFVuZGVyIFVuaXgsIEFwYWNoZSBjYW4gYmUgdG9sZCB0byBzaHV0ZG93biBvciByZXN0YXJ0IGJ5IHNlbmRpbmcgdmFyaW91cwotICogc2lnbmFscyAoSFVQLCBVU1IsIFRFUk0pLiBPbiBOVCB3ZSBkb24ndCBoYXZlIGVhc3kgYWNjZXNzIHRvIHNpZ25hbHMsIHNvCi0gKiB3ZSB1c2UgImV2ZW50cyIgaW5zdGVhZC4gVGhlIHBhcmVudCBhcGFjaGUgcHJvY2VzcyBnb2VzIGludG8gYSBsb29wCi0gKiB3aGVyZSBpdCB3YWl0cyBmb3JldmVyIGZvciBhIHNldCBvZiBldmVudHMuIFR3byBvZiB0aG9zZSBldmVudHMgYXJlCi0gKiBjYWxsZWQKLSAqCi0gKiAgICBhcFBJRF9zaHV0ZG93bgotICogICAgYXBQSURfcmVzdGFydAotICoKLSAqICh3aGVyZSBQSUQgaXMgdGhlIFBJRCBvZiB0aGUgYXBhY2hlIHBhcmVudCBwcm9jZXNzKS4gV2hlbiBvbmUgb2YgdGhlc2UKLSAqIGlzIHNpZ25hbGxlZCwgdGhlIEFwYWNoZSBwYXJlbnQgcGVyZm9ybXMgdGhlIGFwcHJvcHJpYXRlIGFjdGlvbi4gVGhlIGV2ZW50cwotICogY2FuIGJlY29tZSBzaWduYWxsZWQgdGhyb3VnaCBpbnRlcm5hbCBBcGFjaGUgbWV0aG9kcyAoZS5nLiBpZiB0aGUgY2hpbGQKLSAqIGZpbmRzIGEgZmF0YWwgZXJyb3IgYW5kIG5lZWRzIHRvIGtpbGwgaXRzIHBhcmVudCksIHZpYSB0aGUgc2VydmljZQotICogY29udHJvbCBtYW5hZ2VyICh0aGUgY29udHJvbCB0aHJlYWQgd2lsbCBzaWduYWwgdGhlIHNodXRkb3duIGV2ZW50IHdoZW4KLSAqIHJlcXVlc3RlZCB0byBzdG9wIHRoZSBBcGFjaGUgc2VydmljZSksIGZyb20gdGhlIC1rIEFwYWNoZSBjb21tYW5kIGxpbmUsCi0gKiBvciBmcm9tIGFueSBleHRlcm5hbCBwcm9ncmFtIHdoaWNoIGZpbmRzIHRoZSBBcGFjaGUgUElEIGZyb20gdGhlCi0gKiBodHRwZC5waWQgZmlsZS4KLSAqCi0gKiBUaGUgc2lnbmFsX3BhcmVudCgpIGZ1bmN0aW9uLCBiZWxvdywgaXMgdXNlZCB0byBzaWduYWwgb25lIG9mIHRoZXNlIGV2ZW50cy4KLSAqIEl0IGNhbiBiZSBjYWxsZWQgYnkgYW55IGNoaWxkIG9yIHBhcmVudCBwcm9jZXNzLCBzaW5jZSBpdCBkb2VzIG5vdAotICogcmVseSBvbiBnbG9iYWwgdmFyaWFibGVzLgotICoKLSAqIE9uIGVudHJ5LCB0eXBlIGdpdmVzIHRoZSBldmVudCB0byBzaWduYWwuIDAgbWVhbnMgc2h1dGRvd24sIDEgbWVhbnMgCi0gKiBncmFjZWZ1bCByZXN0YXJ0LgotICovCi1zdGF0aWMgdm9pZCBzaWduYWxfcGFyZW50KGludCB0eXBlKQotewotICAgIEhBTkRMRSBlOwotICAgIGNoYXIgKnNpZ25hbF9uYW1lOwotICAgIGV4dGVybiBjaGFyIHNpZ25hbF9zaHV0ZG93bl9uYW1lW107Ci0gICAgZXh0ZXJuIGNoYXIgc2lnbmFsX3Jlc3RhcnRfbmFtZVtdOwotCi0gICAgLyogYWZ0ZXIgdXBkYXRpbmcgdGhlIHNodXRkb3duX3BlbmRpbmcgb3IgcmVzdGFydCBmbGFncywgd2UgbmVlZAotICAgICAqIHRvIHdha2UgdXAgdGhlIHBhcmVudCBwcm9jZXNzIHNvIGl0IGNhbiBzZWUgdGhlIGNoYW5nZXMuIFRoZQotICAgICAqIHBhcmVudCB3aWxsIG5vcm1hbGx5IGJlIHdhaXRpbmcgZm9yIGVpdGhlciBhIGNoaWxkIHByb2Nlc3MKLSAgICAgKiB0byBkaWUsIG9yIGZvciBhIHNpZ25hbCBvbiB0aGUgInNwYWNoZS1zaWduYWwiIGV2ZW50LiBTbyBzZXQgdGhlCi0gICAgICogImFwYWNoZS1zaWduYWwiIGV2ZW50IGhlcmUuCi0gICAgICovCi0gICAgaWYgKG9uZV9wcm9jZXNzKSB7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIHN3aXRjaCh0eXBlKSB7Ci0gICAgY2FzZSAwOiBzaWduYWxfbmFtZSA9IHNpZ25hbF9zaHV0ZG93bl9uYW1lOyBicmVhazsKLSAgICBjYXNlIDE6IHNpZ25hbF9uYW1lID0gc2lnbmFsX3Jlc3RhcnRfbmFtZTsgYnJlYWs7Ci0gICAgZGVmYXVsdDogcmV0dXJuOwotICAgIH0KLSAgICBlID0gT3BlbkV2ZW50KEVWRU5UX0FMTF9BQ0NFU1MsIEZBTFNFLCBzaWduYWxfbmFtZSk7Ci0gICAgaWYgKCFlKSB7Ci0JLyogVW0sIHByb2JsZW0sIGNhbid0IHNpZ25hbCB0aGUgcGFyZW50LCB3aGljaCBtZWFucyB3ZSBjYW4ndAotCSAqIHNpZ25hbCBvdXJzZWx2ZXMgdG8gZGllLiBJZ25vcmUgZm9yIG5vdy4uLgotCSAqLwotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FTUVSRywgR2V0TGFzdEVycm9yKCksIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgIk9wZW5FdmVudCBvbiAlcyBldmVudCIsIHNpZ25hbF9uYW1lKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIGlmIChTZXRFdmVudChlKSA9PSAwKSB7Ci0JLyogU2FtZSBwcm9ibGVtIGFzIGFib3ZlICovCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCBHZXRMYXN0RXJyb3IoKSwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAiU2V0RXZlbnQgb24gJXMgZXZlbnQiLCBzaWduYWxfbmFtZSk7Ci0JQ2xvc2VIYW5kbGUoZSk7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBDbG9zZUhhbmRsZShlKTsKLX0KLXN0YXRpYyBpbnQgdm9sYXRpbGUgaXNfZ3JhY2VmdWwgPSAwOwotQVBJX0VYUE9SVChpbnQpIGFwX2dyYWNlZnVsX3N0b3Bfc2lnbmFsbGVkKHZvaWQpCi17Ci0gICAgcmV0dXJuIGlzX2dyYWNlZnVsOwotfQotdm9pZCBhcF9zdGFydF9zaHV0ZG93bih2b2lkKQotewotICAgIHNpZ25hbF9wYXJlbnQoMCk7Ci19Ci0KLXZvaWQgYXBfc2lnbmFsX3BhcmVudChhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIqIHNpZ25hbCwgCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2VydmVyX3Jvb3QpIAotewotICAgIEhBTkRMRSBldmVudDsKLSAgICBjaGFyIHByZWZpeFsyMF07Ci0gICAgY2hhciAqRXZlbnROYW1lOwotICAgIEZJTEUgKmZwOwotICAgIGludCBucmVhZDsKLSAgICBjaGFyICpmbmFtZTsKLSAgICBpbnQgZW5kOwotCi0gICAgcHJpbnRmKCJzaWduYWwgPSAlc1xuIiwgc2lnbmFsKTsKLQotICAgIGZuYW1lID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUgKHAsIGFwX3BpZF9mbmFtZSk7Ci0KLSAgICBmcCA9IGZvcGVuKGZuYW1lLCAiciIpOwotICAgIGlmICghZnApIHsKLQlwcmludGYoIkNhbm5vdCByZWFkIGFwYWNoZSBQSUQgZmlsZSAlcy4gRXJyb3IgPSAlZFxuIiwgZm5hbWUsIGVycm5vKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwcmVmaXhbMF0gPSAnYSc7Ci0gICAgcHJlZml4WzFdID0gJ3AnOwotCi0gICAgbnJlYWQgPSBmcmVhZChwcmVmaXgrMiwgMSwgc2l6ZW9mKHByZWZpeCktMywgZnApOwotICAgIGlmIChucmVhZCA9PSAwKSB7Ci0JZmNsb3NlKGZwKTsKLQlwcmludGYoIlBJRCBmaWxlICVzIHdhcyBlbXB0eVxuIiwgZm5hbWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZjbG9zZShmcCk7Ci0KLSAgICAvKiBUZXJtaW5hdGUgdGhlIHByZWZpeCBzdHJpbmcgKi8KLSAgICBlbmQgPSAyICsgbnJlYWQgLSAxOwotICAgIHdoaWxlIChlbmQgPiAwICYmIChwcmVmaXhbZW5kXSA9PSAnXHInIHx8IHByZWZpeFtlbmRdID09ICdcbicpKQotCWVuZC0tOwotICAgIHByZWZpeFtlbmQgKyAxXSA9ICdcMCc7Ci0KLSAgICAvKiBCdWlsZCB0aGUgZXZlbnQgbmFtZS4gU2hvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nLi4uCi0gICAgICogYXBQSURfc2h1dGRvd24KLSAgICAgKiBhcFBJRF9yZXN0YXJ0Ci0gICAgICovCi0gICAgRXZlbnROYW1lID0gYXBfcHN0cmNhdChwLHByZWZpeCwiXyIsc2lnbmFsLE5VTEwpOwotICAgIHByaW50ZigiZXZlbnQgbmFtZSA9ICVzXG4iLCBFdmVudE5hbWUpOwotICAgIGV2ZW50ID0gT3BlbkV2ZW50KEVWRU5UX0FMTF9BQ0NFU1MsIEZBTFNFLCBFdmVudE5hbWUpOwotICAgIHByaW50ZigiZXZlbnQgaGFuZGxlID0gJWRcbiIsIGV2ZW50KTsKLSAgICBpZiAoZXZlbnQgPT0gTlVMTCkgewotCXByaW50ZigiVW5hYmxlIHRvIG9wZW4gZXZlbnQgJXMuXG4iLCBFdmVudE5hbWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIFNldEV2ZW50KGV2ZW50KTsKLSAgICBSZXNldEV2ZW50KGV2ZW50KTsKLSAgICBDbG9zZUhhbmRsZShldmVudCk7Ci0gICAgcmV0dXJuOwotfQotLyoKLSAqIEluaXRpYWxpc2UgdGhlIHNpZ25hbCBuYW1lcywgaW4gdGhlIGdsb2JhbCB2YXJpYWJsZXMgc2lnbmFsX25hbWVfcHJlZml4LCAKLSAqIHNpZ25hbF9yZXN0YXJ0X25hbWUgYW5kIHNpZ25hbF9zaHV0ZG93bl9uYW1lLgotICovCi0KLSNkZWZpbmUgTUFYX1NJR05BTF9OQU1FIDMwICAvKiBMb25nIGVub3VnaCBmb3IgYXBQSURfc2h1dGRvd24sIHdoZXJlIFBJRCBpcyBhbiBpbnQgKi8KLWNoYXIgc2lnbmFsX25hbWVfcHJlZml4W01BWF9TSUdOQUxfTkFNRV07Ci1jaGFyIHNpZ25hbF9yZXN0YXJ0X25hbWVbTUFYX1NJR05BTF9OQU1FXTsgCi1jaGFyIHNpZ25hbF9zaHV0ZG93bl9uYW1lW01BWF9TSUdOQUxfTkFNRV07Ci1zdGF0aWMgdm9pZCBzZXR1cF9zaWduYWxfbmFtZXMoY2hhciAqcHJlZml4KQotewotICAgIGFwX3NucHJpbnRmKHNpZ25hbF9uYW1lX3ByZWZpeCwgc2l6ZW9mKHNpZ25hbF9uYW1lX3ByZWZpeCksIHByZWZpeCk7ICAgIAotICAgIGFwX3NucHJpbnRmKHNpZ25hbF9zaHV0ZG93bl9uYW1lLCBzaXplb2Yoc2lnbmFsX3NodXRkb3duX25hbWUpLCAKLQkiJXNfc2h1dGRvd24iLCBzaWduYWxfbmFtZV9wcmVmaXgpOyAgICAKLSAgICBhcF9zbnByaW50ZihzaWduYWxfcmVzdGFydF9uYW1lLCBzaXplb2Yoc2lnbmFsX3Jlc3RhcnRfbmFtZSksIAotCSIlc19yZXN0YXJ0Iiwgc2lnbmFsX25hbWVfcHJlZml4KTsgICAgCi19Ci0KLS8qCi0gKiBSb3V0aW5lcyB0aGF0IGRlYWwgd2l0aCBzb2NrZXRzLCBzb21lIGFyZSBXSU4zMiBzcGVjaWZpYy4uLgotICovCi1zdGF0aWMgaW50IHNfaUluaXRDb3VudCA9IDA7Ci1zdGF0aWMgaW50IEFNQ1NvY2tldEluaXRpYWxpemUodm9pZCkKLXsKLSAgICBpbnQgaVZlcnNpb25SZXF1ZXN0ZWQ7Ci0gICAgV1NBREFUQSB3c2FEYXRhOwotICAgIGludCBlcnI7Ci0KLSAgICBpZiAoc19pSW5pdENvdW50ID4gMCkgewotCXNfaUluaXRDb3VudCsrOwotCXJldHVybiAoMCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNfaUluaXRDb3VudCA8IDApCi0JcmV0dXJuIChzX2lJbml0Q291bnQpOwotCi0gICAgLyogc19pSW5pdENvdW50ID09IDAuIERvIHRoZSBpbml0YWlsaXphdGlvbiAqLwotICAgIGlWZXJzaW9uUmVxdWVzdGVkID0gTUFLRVdPUkQoMiwgMCk7Ci0gICAgZXJyID0gV1NBU3RhcnR1cCgoV09SRCkgaVZlcnNpb25SZXF1ZXN0ZWQsICZ3c2FEYXRhKTsKLSAgICBpZiAoZXJyKSB7Ci0Jc19pSW5pdENvdW50ID0gLTE7Ci0JcmV0dXJuIChzX2lJbml0Q291bnQpOwotICAgIH0KLSAgICBpZiAoTE9CWVRFKHdzYURhdGEud1ZlcnNpb24pICE9IDEgfHwKLQlISUJZVEUod3NhRGF0YS53VmVyc2lvbikgIT0gMSkgewotCXNfaUluaXRDb3VudCA9IC0yOwotCVdTQUNsZWFudXAoKTsKLQlyZXR1cm4gKHNfaUluaXRDb3VudCk7Ci0gICAgfQotCi0gICAgc19pSW5pdENvdW50Kys7Ci0gICAgcmV0dXJuIChzX2lJbml0Q291bnQpOwotCi19Ci1zdGF0aWMgdm9pZCBBTUNTb2NrZXRDbGVhbnVwKHZvaWQpCi17Ci0gICAgaWYgKC0tc19pSW5pdENvdW50ID09IDApCi0JV1NBQ2xlYW51cCgpOwotICAgIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgc29ja19kaXNhYmxlX25hZ2xlKGludCBzKSAKLXsKLSAgICAvKiBUaGUgTmFnbGUgYWxnb3JpdGhtIHNheXMgdGhhdCB3ZSBzaG91bGQgZGVsYXkgc2VuZGluZyBwYXJ0aWFsCi0gICAgICogcGFja2V0cyBpbiBob3BlcyBvZiBnZXR0aW5nIG1vcmUgZGF0YS4gIFdlIGRvbid0IHdhbnQgdG8gZG8KLSAgICAgKiB0aGlzOyB3ZSBhcmUgbm90IHRlbG5ldC4gIFRoZXJlIGFyZSBiYWQgaW50ZXJhY3Rpb25zIGJldHdlZW4KLSAgICAgKiBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGFuZCBOYWdsZSdzIGFsZ29yaXRobSB0aGF0IGhhdmUgdmVyeSBzZXZlcmUKLSAgICAgKiBwZXJmb3JtYW5jZSBwZW5hbHRpZXMuICAoRmFpbGluZyB0byBkaXNhYmxlIE5hZ2xlIGlzIG5vdCBtdWNoIG9mIGEKLSAgICAgKiBwcm9ibGVtIHdpdGggc2ltcGxlIEhUVFAuKQotICAgICAqCi0gICAgICogSW4gc3BpdGUgb2YgdGhlc2UgcHJvYmxlbXMsIGZhaWx1cmUgaGVyZSBpcyBub3QgYSBzaG9vdGluZyBvZmZlbnNlLgotICAgICAqLwotICAgIGludCBqdXN0X3NheV9ubyA9IDE7Ci0KLSAgICBpZiAoc2V0c29ja29wdChzLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIChjaGFyICopICZqdXN0X3NheV9ubywKLQkJICAgc2l6ZW9mKGludCkpIDwgMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBBUFJfU1VDQ0VTUywgc2VydmVyX2NvbmYsCi0JCSAgICAic2V0c29ja29wdDogKFRDUF9OT0RFTEFZKSIpOwotICAgIH0KLX0KLQotLyoKLSAqIFJvdXRpbmVzIHRvIGRlYWwgd2l0aCBtYW5hZ2luZyB0aGUgbGlzdCBvZiBsaXN0ZW5pbmcgc29ja2V0cy4KLSAqLwotc3RhdGljIGFwX2xpc3Rlbl9yZWMgKmhlYWRfbGlzdGVuZXI7Ci1zdGF0aWMgYXBfaW5saW5lIGFwX2xpc3Rlbl9yZWMgKmZpbmRfcmVhZHlfbGlzdGVuZXIoZmRfc2V0ICogbWFpbl9mZHMpCi17Ci0gICAgYXBfbGlzdGVuX3JlYyAqbHI7Ci0gICAgU09DS0VUIG5zZDsKLQotICAgIGZvciAobHIgPSBoZWFkX2xpc3RlbmVyOyBsciA7IGxyID0gbHItPm5leHQpIHsKLSAgICAgICAgYXBfZ2V0X29zX3NvY2soJm5zZCwgbHItPnNkKTsKLQlpZiAoRkRfSVNTRVQobnNkLCBtYWluX2ZkcykpIHsKLQkgICAgaGVhZF9saXN0ZW5lciA9IGxyLT5uZXh0OwotICAgICAgICAgICAgaWYgKGhlYWRfbGlzdGVuZXIgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBoZWFkX2xpc3RlbmVyID0gYXBfbGlzdGVuZXJzOwotCi0JICAgIHJldHVybiAobHIpOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci1zdGF0aWMgaW50IHNldHVwX2xpc3RlbmVycyhzZXJ2ZXJfcmVjICpzKQotewotICAgIGFwX2xpc3Rlbl9yZWMgKmxyOwotICAgIGludCBudW1fbGlzdGVuZXJzID0gMDsKLSAgICBTT0NLRVQgbnNkOwotCi0gICAgLyogU2V0dXAgdGhlIGxpc3RlbmVycyAqLwotICAgIEZEX1pFUk8oJmxpc3RlbmZkcyk7Ci0KLSAgICBpZiAoYXBfbGlzdGVuX29wZW4ocy0+cHJvY2Vzcywgcy0+cG9ydCkpIHsKLSAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZm9yIChsciA9IGFwX2xpc3RlbmVyczsgbHI7IGxyID0gbHItPm5leHQpIHsKLSAgICAgICAgbnVtX2xpc3RlbmVycysrOwotICAgICAgICBpZiAobHItPnNkICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGFwX2dldF9vc19zb2NrKCZuc2QsIGxyLT5zZCk7Ci0gICAgICAgICAgICBGRF9TRVQobnNkLCAmbGlzdGVuZmRzKTsKLSAgICAgICAgICAgIGlmIChsaXN0ZW5tYXhmZCA9PSBJTlZBTElEX1NPQ0tFVCB8fCBuc2QgPiBsaXN0ZW5tYXhmZCkgewotICAgICAgICAgICAgICAgIGxpc3Rlbm1heGZkID0gbnNkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGxyLT5jb3VudCA9IDA7Ci0gICAgfQotCi0gICAgaGVhZF9saXN0ZW5lciA9IGFwX2xpc3RlbmVyczsKLQotICAgIHJldHVybiBudW1fbGlzdGVuZXJzOwotfQotCi1zdGF0aWMgaW50IHNldHVwX2luaGVyaXRlZF9saXN0ZW5lcnMoc2VydmVyX3JlYyAqcykKLXsKLSAgICBXU0FQUk9UT0NPTF9JTkZPIFdTQVByb3RvY29sSW5mbzsKLSAgICBIQU5ETEUgcGlwZTsKLSAgICBhcF9saXN0ZW5fcmVjICpscjsKLSAgICBEV09SRCBCeXRlc1JlYWQ7Ci0gICAgaW50IG51bV9saXN0ZW5lcnMgPSAwOwotICAgIFNPQ0tFVCBuc2Q7Ci0KLSAgICAvKiBTZXR1cCB0aGUgbGlzdGVuZXJzICovCi0gICAgRkRfWkVSTygmbGlzdGVuZmRzKTsKLQotICAgIC8qIFNldCB1cCBhIGRlZmF1bHQgbGlzdGVuZXIgaWYgbmVjZXNzYXJ5ICovCi0KLSAgICBpZiAoYXBfbGlzdGVuZXJzID09IE5VTEwpIHsKLSAgICAgICAgYXBfbGlzdGVuX3JlYyAqbHI7Ci0gICAgICAgIGxyID0gYXBfcGFsbG9jKHMtPnByb2Nlc3MtPnBvb2wsIHNpemVvZihhcF9saXN0ZW5fcmVjKSk7Ci0gICAgICAgIGlmICghbHIpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgbHItPnNkID0gTlVMTDsKLSAgICAgICAgbHItPm5leHQgPSBhcF9saXN0ZW5lcnM7Ci0gICAgICAgIGFwX2xpc3RlbmVycyA9IGxyOwotICAgIH0KLQotICAgIC8qIE9wZW4gdGhlIHBpcGUgdG8gdGhlIHBhcmVudCBwcm9jZXNzIHRvIHJlY2VpdmUgdGhlIGluaGVyaXRlZCBzb2NrZXQKLSAgICAgKiBkYXRhLiBUaGUgc29ja2V0cyBoYXZlIGJlZW4gc2V0IHRvIGxpc3RlbmluZyBpbiB0aGUgcGFyZW50IHByb2Nlc3MuCi0gICAgICovCi0gICAgcGlwZSA9IEdldFN0ZEhhbmRsZShTVERfSU5QVVRfSEFORExFKTsKLSAgICBmb3IgKGxyID0gYXBfbGlzdGVuZXJzOyBscjsgbHIgPSBsci0+bmV4dCkgewotICAgICAgICBpZiAoIVJlYWRGaWxlKHBpcGUsICZXU0FQcm90b2NvbEluZm8sIHNpemVvZihXU0FQUk9UT0NPTF9JTkZPKSwgCi0gICAgICAgICAgICAgICAgICAgICAgJkJ5dGVzUmVhZCwgKExQT1ZFUkxBUFBFRCkgTlVMTCkpIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19DUklULCBHZXRMYXN0RXJyb3IoKSwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgInNldHVwX2luaGVyaXRlZF9saXN0ZW5lcnM6IFVuYWJsZSB0byByZWFkIHNvY2tldCBkYXRhIGZyb20gcGFyZW50Iik7Ci0gICAgICAgICAgICBzaWduYWxfcGFyZW50KDApOwkvKiB0ZWxsIHBhcmVudCB0byBkaWUgKi8KLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgQVBSX1NVQ0NFU1MsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgIkNoaWxkICVkOiBzZXR1cF9pbmhlcml0ZWRfbGlzdGVuZXIoKSByZWFkID0gJWQgYnl0ZXMgb2YgV1NBUHJvdG9jb2xJbmZvLiIsIG15X3BpZCk7Ci0gICAgICAgIG5zZCA9IFdTQVNvY2tldChGUk9NX1BST1RPQ09MX0lORk8sIEZST01fUFJPVE9DT0xfSU5GTywgRlJPTV9QUk9UT0NPTF9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgJldTQVByb3RvY29sSW5mbywgMCwgMCk7Ci0gICAgICAgIGlmIChuc2QgPT0gSU5WQUxJRF9TT0NLRVQpIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19DUklULCBXU0FHZXRMYXN0RXJyb3IoKSwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIkNoaWxkICVkOiBzZXR1cF9pbmhlcml0ZWRfbGlzdGVuZXJzKCksIFdTQVNvY2tldCBmYWlsZWQgdG8gb3BlbiB0aGUgaW5oZXJpdGVkIHNvY2tldC4iLCBteV9waWQpOwotICAgICAgICAgICAgc2lnbmFsX3BhcmVudCgwKTsJLyogdGVsbCBwYXJlbnQgdG8gZGllICovCi0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuc2QgPj0gMCkgewotICAgICAgICAgICAgRkRfU0VUKG5zZCwgJmxpc3RlbmZkcyk7Ci0gICAgICAgICAgICBpZiAobGlzdGVubWF4ZmQgPT0gSU5WQUxJRF9TT0NLRVQgfHwgbnNkID4gbGlzdGVubWF4ZmQpIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5tYXhmZCA9IG5zZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotLy8gICAgICAgIGFwX3JlZ2lzdGVyX2NsZWFudXAocCwgKHZvaWQgKilsci0+c2QsIHNvY2tldF9jbGVhbnVwLCBhcF9udWxsX2NsZWFudXApOwotICAgICAgICBhcF9wdXRfb3Nfc29jaygmbHItPnNkLCAmbnNkLCBwY29uZik7Ci0gICAgICAgIGxyLT5jb3VudCA9IDA7Ci0gICAgfQotICAgIC8qIE5vdywgcmVhZCB0aGUgQWNjZXB0RXhDb21wUG9ydCBmcm9tIHRoZSBwYXJlbnQgKi8KLSAgICBSZWFkRmlsZShwaXBlLCAmQWNjZXB0RXhDb21wUG9ydCwgc2l6ZW9mKEFjY2VwdEV4Q29tcFBvcnQpLCAmQnl0ZXNSZWFkLCAoTFBPVkVSTEFQUEVEKSBOVUxMKTsKLSAgICBDbG9zZUhhbmRsZShwaXBlKTsKLQotICAgIGZvciAobHIgPSBhcF9saXN0ZW5lcnM7IGxyOyBsciA9IGxyLT5uZXh0KSB7Ci0gICAgICAgIG51bV9saXN0ZW5lcnMrKzsKLSAgICB9Ci0KLSAgICBoZWFkX2xpc3RlbmVyID0gYXBfbGlzdGVuZXJzOwotICAgIHJldHVybiBudW1fbGlzdGVuZXJzOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNdWx0aXRocmVhZGVkIGltcGxlbWVudGF0aW9uCi0gKgotICogVGhpcyBjb2RlIGlzIGZhaXJseSBzcGVjaWZpYyB0byBXaW4zMi4KLSAqCi0gKiBUaGUgbW9kZWwgdXNlZCB0byBoYW5kbGUgcmVxdWVzdHMgaXMgYSBzZXQgb2YgdGhyZWFkcy4gT25lICJtYWluIgotICogdGhyZWFkIGxpc3RlbnMgZm9yIG5ldyByZXF1ZXN0cy4gV2hlbiBzb21ldGhpbmcgYmVjb21lcwotICogYXZhaWxhYmxlLCBpdCBkb2VzIGEgc2VsZWN0IGFuZCBwbGFjZXMgdGhlIG5ld2x5IGF2YWlsYWJsZSBzb2NrZXQKLSAqIG9udG8gYSBsaXN0IG9mICJqb2JzIiAoYWRkX2pvYigpKS4gVGhlbiBhbnkgb25lIG9mIGEgZml4ZWQgbnVtYmVyCi0gKiBvZiAid29ya2VyIiB0aHJlYWRzIHRha2VzIHRoZSB0b3Agam9iIG9mZiB0aGUgam9iIGxpc3Qgd2l0aAotICogcmVtb3ZlX2pvYigpIGFuZCBoYW5kbGVzIHRoYXQgY29ubmVjdGlvbiB0byBjb21wbGV0aW9uLiBBZnRlcgotICogdGhlIGNvbm5lY3Rpb24gaGFzIGZpbmlzaGVkIHRoZSB0aHJlYWQgaXMgZnJlZSB0byB0YWtlIGFub3RoZXIKLSAqIGpvYiBmcm9tIHRoZSBqb2IgbGlzdC4KLSAqCi0gKiBJbiB0aGUgY29kZSwgdGhlICJtYWluIiB0aHJlYWQgaXMgcnVubmluZyB3aXRoaW4gdGhlIGNoaWxkX21haW4oKQotICogZnVuY3Rpb24uIFRoZSBmaXJzdCB0aGluZyB0aGlzIGZ1bmN0aW9uIGRvZXMgaXMgY3JlYXRlIHRoZQotICogd29ya2VyIHRocmVhZHMsIHdoaWNoIG9wZXJhdGUgaW4gdGhlIGNoaWxkX3N1Yl9tYWluKCkgZnVuY3Rpb24uIFRoZQotICogbWFpbiB0aHJlYWQgdGhlbiBnb2VzIGludG8gYSBsb29wIHdpdGhpbiBjaGlsZF9tYWluKCkgd2hlcmUgdGhleQotICogZG8gYSBzZWxlY3QoKSBvbiB0aGUgbGlzdGVuaW5nIHNvY2tldHMuIFRoZSBzZWxlY3QgdGltZXMgb3V0IG9uY2UKLSAqIHBlciBzZWNvbmQgc28gdGhhdCB0aGUgdGhyZWFkIGNhbiBjaGVjayBmb3IgYW4gImV4aXQiIHNpZ25hbAotICogZnJvbSB0aGUgcGFyZW50IHByb2Nlc3MgKHNlZSBiZWxvdykuIElmIHRoaXMgc2lnbmFsIGlzIHNldCwgdGhlIAotICogdGhyZWFkIGNhbiBleGl0LCBidXQgb25seSBhZnRlciBpdCBoYXMgYWNjZXB0ZWQgYWxsIGluY29taW5nCi0gKiBjb25uZWN0aW9ucyBhbHJlYWR5IGluIHRoZSBsaXN0ZW4gcXVldWUgKHNpbmNlIFdpbjMyIGFwcGVhcnMKLSAqIHRvIHRocm91Z2ggYXdheSBsaXN0ZW5lZCBidXQgdW5hY2NlcHRlZCBjb25uZWN0aW9ucyB3aGVuIGEgCi0gKiBwcm9jZXNzIGRpZXMpLgotICoKLSAqIEJlY2F1c2UgdGhlIG1haW4gYW5kIHdvcmtlciB0aHJlYWRzIGV4aXN0IHdpdGhpbiBhIHNpbmdsZSBwcm9jZXNzCi0gKiB0aGV5IGFyZSB2dWxuZXJhYmxlIHRvIGNyYXNoZXMgb3IgbWVtb3J5IGxlYWtzIChjcmFzaGVzIGNhbiBhbHNvCi0gKiBiZSBjYXVzZWQgd2l0aGluIG1vZHVsZXMsIG9mIGNvdXJzZSkuIFRoZXJlIGFsc28gbmVlZHMgdG8gYmUgYSAKLSAqIG1lY2hhbmlzbSB0byBwZXJmb3JtIHJlc3RhcnRzIGFuZCBzaHV0ZG93bnMuIFRoaXMgaXMgZG9uZSBieQotICogY3JlYXRpbmcgdGhlIG1haW4gJiB3b3JrZXIgdGhyZWFkcyB3aXRoaW4gYSBzdWJwcm9jZXNzLiBBCi0gKiBtYWluIHByb2Nlc3MgKHRoZSAicGFyZW50IHByb2Nlc3MiKSBjcmVhdGVzIG9uZSAob3IgbW9yZSkgCi0gKiBwcm9jZXNzZXMgdG8gZG8gdGhlIHdvcmssIHRoZW4gdGhlIHBhcmVudCBzaXRzIGFyb3VuZCB3YWl0aW5nCi0gKiBmb3IgdGhlIHdvcmtpbmcgcHJvY2VzcyB0byBkaWUsIGluIHdoaWNoIGNhc2UgaXQgc3RhcnRzIGEgbmV3Ci0gKiBvbmUuIFRoZSBwYXJlbnQgcHJvY2VzcyBhbHNvIGhhbmRsZXMgcmVzdGFydHMgKGJ5IGNyZWF0aW5nCi0gKiBhIG5ldyB3b3JraW5nIHByb2Nlc3MgdGhlbiBzaWduYWxsaW5nIHRoZSBwcmV2aW91cyB3b3JraW5nIHByb2Nlc3MgCi0gKiBleGl0ICkgYW5kIHNodXRkb3ducyAoYnkgc2lnbmFsbGluZyB0aGUgd29ya2luZyBwcm9jZXNzIHRvIGV4aXQpLgotICogVGhlIHBhcmVudCBwcm9jZXNzIG9wZXJhdGVzIHdpdGhpbiB0aGUgbWFzdGVyX21haW4oKSBmdW5jdGlvbi4gVGhpcwotICogcHJvY2VzcyBhbHNvIGhhbmRsZXMgcmVxdWVzdHMgZnJvbSB0aGUgc2VydmljZSBtYW5hZ2VyIChOVCBvbmx5KS4KLSAqCi0gKiBTaWduYWxsaW5nIGJldHdlZW4gdGhlIHBhcmVudCBhbmQgd29ya2luZyBwcm9jZXNzIHVzZXMgYSBXaW4zMgotICogZXZlbnQuIEVhY2ggY2hpbGQgaGFzIGEgdW5pcXVlIG5hbWUgZm9yIHRoZSBldmVudCwgd2hpY2ggaXMKLSAqIHBhc3NlZCB0byBpdCB3aXRoIHRoZSAtWiBhcmd1bWVudCB3aGVuIHRoZSBjaGlsZCBpcyBzcGF3bmVkLiBUaGUKLSAqIHBhcmVudCBzZXRzIChzaWduYWxzKSB0aGlzIGV2ZW50IHRvIHRlbGwgdGhlIGNoaWxkIHRvIGRpZS4KLSAqIEF0IHByZXNlbnQgYWxsIGNoaWxkcmVuIGRvIGEgZ3JhY2VmdWwgZGllIC0gdGhleSBmaW5pc2ggYWxsCi0gKiBjdXJyZW50IGpvYnMgX2FuZF8gZW1wdHkgdGhlIGxpc3RlbiBxdWV1ZSBiZWZvcmUgdGhleSBleGl0LgotICogQSBub24tZ3JhY2VmdWwgZGllIHdvdWxkIG5lZWQgYSBzZWNvbmQgZXZlbnQuIFRoZSAtWiBhcmd1bWVudCBpbgotICogdGhlIGNoaWxkIGlzIGFsc28gdXNlZCB0byBjcmVhdGUgdGhlIHNodXRkb3duIGFuZCByZXN0YXJ0IGV2ZW50cywKLSAqIHNpbmNlIHRoZSBwcmVmaXggKGFwUElEKSBjb250YWlucyB0aGUgcGFyZW50IHByb2Nlc3MgUElELgotICoKLSAqIFRoZSBjb2RlIGJlbG93IHN0YXJ0cyB3aXRoIGZ1bmN0aW9ucyBhdCB0aGUgbG93ZXN0IGxldmVsIC0KLSAqIHdvcmtlciB0aHJlYWRzLCBhbmQgd29ya3MgdXAgdG8gdGhlIHRvcCBsZXZlbCAtIHRoZSBtYWluKCkKLSAqIGZ1bmN0aW9uIG9mIHRoZSBwYXJlbnQgcHJvY2Vzcy4KLSAqCi0gKiBUaGUgc2NvcmVib2FyZCAoaW4gcHJvY2VzcyBtZW1vcnkpIGNvbnRhaW5zIGRldGFpbHMgb2YgdGhlIHdvcmtlcgotICogdGhyZWFkcyAod2l0aGluIHRoZSBhY3RpdmUgd29ya2luZyBwcm9jZXNzKS4gVGhlcmUgaXMgbm8gc2hhcmVkCi0gKiAic2NvcmVib2FyZCIgYmV0d2VlbiBwcm9jZXNzZXMsIHNpbmNlIG9ubHkgb25lIGlzIGV2ZXIgYWN0aXZlCi0gKiBhdCBvbmNlIChvciBhdCBtb3N0LCB0d28sIHdoZW4gb25lIGhhcyBiZWVuIHRvbGQgdG8gc2h1dGRvd24gYnV0Ci0gKiBpcyBwcm9jZXNzZXMgb3V0c3RhbmRpbmcgcmVxdWVzdHMsIGFuZCBhIG5ldyBvbmUgaGFzIGJlZW4gc3RhcnRlZCkuCi0gKiBUaGlzIGlzIGNvbnRyb2xsZWQgYnkgYSAic3RhcnRfbXV0ZXgiIHdoaWNoIGVuc3VyZXMgb25seSBvbmUgd29ya2luZwotICogcHJvY2VzcyBpcyBhY3RpdmUgYXQgb25jZS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qCi0gKiBEZWZpbml0aW9uIG9mIGpvYnMsIHNoYXJlZCBieSBtYWluIGFuZCB3b3JrZXIgdGhyZWFkcy4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBqb2JsaXN0X3MgewotICAgIHN0cnVjdCBqb2JsaXN0X3MgKm5leHQ7Ci0gICAgaW50IHNvY2s7Ci19IGpvYmxpc3Q7Ci0KLS8qCi0gKiBHbG9iYWxzIGNvbW1vbiB0byBtYWluIGFuZCB3b3JrZXIgdGhyZWFkcy4gVGhpcyBzdHJ1Y3R1cmUgaXMgbm90Ci0gKiB1c2VkIGJ5IHRoZSBwYXJlbnQgcHJvY2Vzcy4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBnbG9iYWxzX3MgewotICAgIHNlbWFwaG9yZSAqam9ic2VtYXBob3JlOwotICAgIGpvYmxpc3QgKmpvYmhlYWQ7Ci0gICAgam9ibGlzdCAqam9idGFpbDsKLSAgICBhcF9sb2NrX3QgKmpvYm11dGV4OwotICAgIGludCBqb2Jjb3VudDsKLX0gZ2xvYmFsczsKLQotZ2xvYmFscyBhbGxvd2VkX2dsb2JhbHMgPQote05VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDB9OwotI2RlZmluZSBNQVhfU0VMRUNUX0VSUk9SUyAxMDAKLSNkZWZpbmUgUEFEREVEX0FERFJfU0laRSBzaXplb2YoU09DS0FERFJfSU4pKzE2Ci0KLS8qIFdpbmRvd3MgOXggc3BlY2lmaWMgY29kZS4uLgotICogQWNjZXB0IHByb2Nlc3NpbmcgZm9yIG9uIFdpbmRvd3MgOTUvOTggdXNlcyBhIHByb2R1Y2VyL2NvbnN1bWVyIHF1ZXVlIAotICogbW9kZWwuIEEgc2luZ2xlIHRocmVhZCBhY2NlcHRzIGNvbm5lY3Rpb25zIGFuZCBxdWV1ZXMgdGhlIGFjY2VwdGVkIHNvY2tldCAKLSAqIHRvIHRoZSBhY2NlcHQgcXVldWUgZm9yIGNvbnN1bXB0aW9uIGJ5IGEgcG9vbCBvZiB3b3JrZXIgdGhyZWFkcy4KLSAqCi0gKiB3aW45eF9nZXRfY29ubmVjdGlvbigpCi0gKiAgICBDYWxscyByZW1vdmVfam9iKCkgdG8gcHVsbCBhIGpvYiBmcm9tIHRoZSBhY2NlcHQgcXVldWUuIEFsbCB0aGUgd29ya2VyIAotICogICAgdGhyZWFkcyBibG9jayBvbiByZW1vdmVfam9iLgotICogYWNjZXB0X2FuZF9xdWV1ZV9jb25uZWN0aW9ucygpCi0gKiAgICBUaGUgYWNjZXB0IHRocmVhZHMgcnVucyB0aGlzIGZ1bmN0aW9uLCB3aGljaCBhY2NlcHRzIGNvbm5lY3Rpb25zIG9mZiAKLSAqICAgIHRoZSBuZXR3b3JrIGFuZCBjYWxscyBhZGRfam9iKCkgdG8gcXVldWUgam9icyB0byB0aGUgYWNjZXB0X3F1ZXVlLgotICogYWRkX2pvYigpL3JlbW92ZV9qb2IoKQotICogICAgQWRkIG9yIHJlbW92ZSBhbiBhY2NlcHRlZCBzb2NrZXQgZnJvbSB0aGUgbGlzdCBvZiBzb2NrZXRzIAotICogICAgY29ubmVjdGVkIHRvIGNsaWVudHMuIGFsbG93ZWRfZ2xvYmFscy5qb2JtdXRleCBwcm90ZWN0cwotICogICAgYWdhaW5zdCBtdWx0aXBsZSBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgbGlua2VkIGxpc3Qgb2Ygam9icy4KLSAqLwotc3RhdGljIHZvaWQgYWRkX2pvYihpbnQgc29jaykKLXsKLSAgICBqb2JsaXN0ICpuZXdfam9iOwotCi0gICAgbmV3X2pvYiA9IChqb2JsaXN0ICopIG1hbGxvYyhzaXplb2Yoam9ibGlzdCkpOwotICAgIGlmIChuZXdfam9iID09IE5VTEwpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgIk91Y2ghICBPdXQgb2YgbWVtb3J5IGluIGFkZF9qb2IoKSEiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBuZXdfam9iLT5uZXh0ID0gTlVMTDsKLSAgICBuZXdfam9iLT5zb2NrID0gc29jazsKLQotICAgIGFwX2xvY2soYWxsb3dlZF9nbG9iYWxzLmpvYm11dGV4KTsKLQotICAgIGlmIChhbGxvd2VkX2dsb2JhbHMuam9idGFpbCAhPSBOVUxMKQotCWFsbG93ZWRfZ2xvYmFscy5qb2J0YWlsLT5uZXh0ID0gbmV3X2pvYjsKLSAgICBhbGxvd2VkX2dsb2JhbHMuam9idGFpbCA9IG5ld19qb2I7Ci0gICAgaWYgKCFhbGxvd2VkX2dsb2JhbHMuam9iaGVhZCkKLQlhbGxvd2VkX2dsb2JhbHMuam9iaGVhZCA9IG5ld19qb2I7Ci0gICAgYWxsb3dlZF9nbG9iYWxzLmpvYmNvdW50Kys7Ci0gICAgcmVsZWFzZV9zZW1hcGhvcmUoYWxsb3dlZF9nbG9iYWxzLmpvYnNlbWFwaG9yZSk7Ci0KLSAgICBhcF91bmxvY2soYWxsb3dlZF9nbG9iYWxzLmpvYm11dGV4KTsKLX0KLQotc3RhdGljIGludCByZW1vdmVfam9iKHZvaWQpCi17Ci0gICAgam9ibGlzdCAqam9iOwotICAgIGludCBzb2NrOwotCi0gICAgYWNxdWlyZV9zZW1hcGhvcmUoYWxsb3dlZF9nbG9iYWxzLmpvYnNlbWFwaG9yZSk7Ci0gICAgYXBfbG9jayhhbGxvd2VkX2dsb2JhbHMuam9ibXV0ZXgpOwotCi0gICAgaWYgKHdvcmtlcnNfbWF5X2V4aXQgJiYgIWFsbG93ZWRfZ2xvYmFscy5qb2JoZWFkKSB7Ci0gICAgICAgIGFwX3VubG9jayhhbGxvd2VkX2dsb2JhbHMuam9ibXV0ZXgpOwotCXJldHVybiAoLTEpOwotICAgIH0KLSAgICBqb2IgPSBhbGxvd2VkX2dsb2JhbHMuam9iaGVhZDsKLSAgICBhcF9hc3NlcnQoam9iKTsKLSAgICBhbGxvd2VkX2dsb2JhbHMuam9iaGVhZCA9IGpvYi0+bmV4dDsKLSAgICBpZiAoYWxsb3dlZF9nbG9iYWxzLmpvYmhlYWQgPT0gTlVMTCkKLQlhbGxvd2VkX2dsb2JhbHMuam9idGFpbCA9IE5VTEw7Ci0gICAgYXBfdW5sb2NrKGFsbG93ZWRfZ2xvYmFscy5qb2JtdXRleCk7Ci0gICAgc29jayA9IGpvYi0+c29jazsKLSAgICBmcmVlKGpvYik7Ci0KLSAgICByZXR1cm4gKHNvY2spOwotfQotCi1zdGF0aWMgdm9pZCBhY2NlcHRfYW5kX3F1ZXVlX2Nvbm5lY3Rpb25zKHZvaWQgKiBkdW1teSkKLXsKLSAgICBpbnQgcmVxdWVzdHNfdGhpc19jaGlsZCA9IDA7Ci0gICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gICAgZmRfc2V0IG1haW5fZmRzOwotICAgIGludCB3YWl0X3RpbWUgPSAxOwotICAgIGludCBjc2Q7Ci0gICAgaW50IG5zZCA9IElOVkFMSURfU09DS0VUOwotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzYV9jbGllbnQ7Ci0gICAgaW50IGNvdW50X3NlbGVjdF9lcnJvcnMgPSAwOwotICAgIGludCByYzsKLSAgICBpbnQgY2xlbjsKLQotICAgIHdoaWxlICghd29ya2Vyc19tYXlfZXhpdCkgewotICAgICAgICBpZiAoYXBfbWF4X3JlcXVlc3RzX3Blcl9jaGlsZCAmJiAocmVxdWVzdHNfdGhpc19jaGlsZCA+IGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQpKSB7Ci0gICAgICAgICAgICBicmVhazsKLQl9Ci0KLQl0di50dl9zZWMgPSB3YWl0X3RpbWU7Ci0JdHYudHZfdXNlYyA9IDA7Ci0JbWVtY3B5KCZtYWluX2ZkcywgJmxpc3RlbmZkcywgc2l6ZW9mKGZkX3NldCkpOwotCi0vLwlyYyA9IGFwX3NlbGVjdChsaXN0ZW5tYXhmZCArIDEsICZtYWluX2ZkcywgTlVMTCwgTlVMTCwgJnR2KTsKLQlyYyA9IHNlbGVjdChsaXN0ZW5tYXhmZCArIDEsICZtYWluX2ZkcywgTlVMTCwgTlVMTCwgJnR2KTsKLQotICAgICAgICBpZiAocmMgPT0gMCB8fCAocmMgPT0gU09DS0VUX0VSUk9SICYmIGhfZXJybm8gPT0gV1NBRUlOVFIpKSB7Ci0gICAgICAgICAgICBjb3VudF9zZWxlY3RfZXJyb3JzID0gMDsgICAgLyogcmVzZXQgY291bnQgb2YgZXJyb3JzICovICAgICAgICAgICAgCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChyYyA9PSBTT0NLRVRfRVJST1IpIHsKLSAgICAgICAgICAgIC8qIEEgInJlYWwiIGVycm9yIG9jY3VycmVkLCBsb2cgaXQgYW5kIGluY3JlbWVudCB0aGUgY291bnQgb2YKLSAgICAgICAgICAgICAqIHNlbGVjdCBlcnJvcnMuIFRoaXMgY291bnQgaXMgdXNlZCB0byBlbnN1cmUgd2UgZG9uJ3QgZ28gaW50bwotICAgICAgICAgICAgICogYSBidXN5IGxvb3Agb2YgY29udGludW91cyBlcnJvcnMuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19JTkZPLCBoX2Vycm5vLCBzZXJ2ZXJfY29uZiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBmYWlsZWQgd2l0aCBlcnJubyAlZCIsIGhfZXJybm8pOwotICAgICAgICAgICAgY291bnRfc2VsZWN0X2Vycm9ycysrOwotICAgICAgICAgICAgaWYgKGNvdW50X3NlbGVjdF9lcnJvcnMgPiBNQVhfU0VMRUNUX0VSUk9SUykgewotICAgICAgICAgICAgICAgIHdvcmtlcnNfbWF5X2V4aXQgPSAxOwotICAgICAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIGhfZXJybm8sIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVG9vIG1hbnkgZXJyb3JzIGluIHNlbGVjdCBsb29wLiBDaGlsZCBwcm9jZXNzIGV4aXRpbmcuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0JfSBlbHNlIHsKLQkgICAgYXBfbGlzdGVuX3JlYyAqbHI7Ci0KLQkgICAgbHIgPSBmaW5kX3JlYWR5X2xpc3RlbmVyKCZtYWluX2Zkcyk7Ci0JICAgIGlmIChsciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgLyogZmV0Y2ggdGhlIG5hdGl2ZSBzb2NrZXQgZGVzY3JpcHRvciAqLwotICAgICAgICAgICAgICAgIGFwX2dldF9vc19zb2NrKCZuc2QsIGxyLT5zZCk7Ci0JICAgIH0KLQl9Ci0KLQlkbyB7Ci0gICAgICAgICAgICBjbGVuID0gc2l6ZW9mKHNhX2NsaWVudCk7Ci0gICAgICAgICAgICBjc2QgPSBhY2NlcHQobnNkLCAoc3RydWN0IHNvY2thZGRyICopICZzYV9jbGllbnQsICZjbGVuKTsKLSAgICAgICAgICAgIGlmIChjc2QgPT0gSU5WQUxJRF9TT0NLRVQpIHsKLSAgICAgICAgICAgICAgICBjc2QgPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoY3NkIDwgMCAmJiBoX2Vycm5vID09IFdTQUVJTlRSKTsKLQotCWlmIChjc2QgPCAwKSB7Ci0gICAgICAgICAgICBpZiAoaF9lcnJubyAhPSBXU0FFQ09OTkFCT1JURUQpIHsKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgaF9lcnJubywgc2VydmVyX2NvbmYsCi0JCQkgICAgImFjY2VwdDogKGNsaWVudCBzb2NrZXQpIik7Ci0gICAgICAgICAgICB9Ci0JfQotCWVsc2UgewotCSAgICBhZGRfam9iKGNzZCk7Ci0JICAgIHJlcXVlc3RzX3RoaXNfY2hpbGQrKzsKLQl9Ci0gICAgfQotICAgIFNldEV2ZW50KGV4aXRfZXZlbnQpOwotfQotc3RhdGljIFBDT01QX0NPTlRFWFQgd2luOXhfZ2V0X2Nvbm5lY3Rpb24oUENPTVBfQ09OVEVYVCBjb250ZXh0KQotewotICAgIGludCBsZW47Ci0KLSAgICBpZiAoY29udGV4dCA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIGFsbG9jYXRlIHRoZSBjb21wbGV0aW9uIGNvbnRleHQgYW5kIHRoZSB0cmFuc2FjdGlvbiBwb29sICovCi0gICAgICAgIGNvbnRleHQgPSBhcF9wY2FsbG9jKHBjb25mLCBzaXplb2YoQ09NUF9DT05URVhUKSk7Ci0gICAgICAgIGlmICghY29udGV4dCkgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfRVJSLCBHZXRMYXN0RXJyb3IoKSwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIndpbjl4X2dldF9jb25uZWN0aW9uOiBhcF9wY2FsbG9jKCkgZmFpbGVkLiBQcm9jZXNzIHdpbGwgZXhpdC4iKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGFwX2NyZWF0ZV9jb250ZXh0KCZjb250ZXh0LT5wdHJhbnMsIHBjb25mKTsKLSAgICB9Ci0gICAgCi0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBhcF9jbGVhcl9wb29sKGNvbnRleHQtPnB0cmFucyk7ICAgICAgICAKLSAgICAgICAgY29udGV4dC0+YWNjZXB0X3NvY2tldCA9IHJlbW92ZV9qb2IoKTsKLSAgICAgICAgaWYgKGNvbnRleHQtPmFjY2VwdF9zb2NrZXQgPT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0JLy9hcF9ub3RlX2NsZWFudXBzX2Zvcl9zb2NrZXQocHRyYW5zLCBjc2QpOwotICAgICAgICBsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyKTsKLSAgICAgICAgY29udGV4dC0+c2Ffc2VydmVyID0gYXBfcGFsbG9jKGNvbnRleHQtPnB0cmFucywgbGVuKTsKLSAgICAgICAgaWYgKGdldHNvY2tuYW1lKGNvbnRleHQtPmFjY2VwdF9zb2NrZXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+c2Ffc2VydmVyLCAmbGVuKT09IFNPQ0tFVF9FUlJPUikgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1dBUk5JTkcsIFdTQUdldExhc3RFcnJvcigpLCBzZXJ2ZXJfY29uZiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgImdldHNvY2tuYW1lIGZhaWxlZCIpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcik7Ci0gICAgICAgIGNvbnRleHQtPnNhX2NsaWVudCA9IGFwX3BhbGxvYyhjb250ZXh0LT5wdHJhbnMsIGxlbik7Ci0gICAgICAgIGlmICgoZ2V0cGVlcm5hbWUoY29udGV4dC0+YWNjZXB0X3NvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5zYV9jbGllbnQsICZsZW4pKSA9PSBTT0NLRVRfRVJST1IpIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19XQVJOSU5HLCBoX2Vycm5vLCBzZXJ2ZXJfY29uZiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgImdldHBlZXJuYW1lIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLCBXU0FHZXRMYXN0RXJyb3IoKSk7Ci0gICAgICAgICAgICBtZW1zZXQoJmNvbnRleHQtPnNhX2NsaWVudCwgJ1wwJywgc2l6ZW9mKGNvbnRleHQtPnNhX2NsaWVudCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29udGV4dC0+Y29ubl9pbyA9IGFwX2JjcmVhdGUoY29udGV4dC0+cHRyYW5zLCBCX1JEV1IpOwotCi0gICAgICAgIC8qIGRvIHdlIE5FRURfRFVQUEVEX0NTRCA/PyAqLwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgfQotfQotCi0vKiAKLSAqIFdpbmRvd3MgMjAwMC9OVCBzcGVjaWZpYyBjb2RlLi4uCi0gKiBjcmVhdGVfYWNjZXB0ZXhfY29udGV4dCgpCi0gKiByZXNldF9hY2NlcHRleF9jb250ZXh0KCkKLSAqIGRyYWluX2FjY2VwdGV4X2NvbXBscG9ydCgpCi0gKiB3aW5udF9nZXRfY29ubmVjdGlvbigpCi0gKgotICogVE9ETzogSW5zZXJ0IGEgZGlzY3Vzc2lvbiBvZiAnY29tcGxldGlvbiBjb250ZXh0cycgYW5kIHdoYXQgdGhlc2UgZnVuY3Rpb24gZG8gaGVyZS4uLgotICovCi1zdGF0aWMgdm9pZCBkcmFpbl9hY2NlcHRleF9jb21wbHBvcnQoSEFORExFIGhDb21wbFBvcnQsIEJPT0xFQU4gYkNsZWFuVXApIAotewotICAgIExQT1ZFUkxBUFBFRCBwb2w7Ci0gICAgUENPTVBfQ09OVEVYVCBjb250ZXh0OwotICAgIGludCByYzsKLSAgICBEV09SRCBCeXRlc1JlYWQ7Ci0gICAgRFdPUkQgQ29tcEtleTsKLSAgICBpbnQgbGFzdEVycm9yOwotCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgY29udGV4dCA9IE5VTEw7Ci0gICAgICAgIHJjID0gR2V0UXVldWVkQ29tcGxldGlvblN0YXR1cyhoQ29tcGxQb3J0LCAmQnl0ZXNSZWFkLCAmQ29tcEtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb2wsIDEwMDApOwotICAgICAgICBpZiAoIXJjKSB7Ci0gICAgICAgICAgICBsYXN0RXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKLSAgICAgICAgICAgIGlmIChsYXN0RXJyb3IgPT0gRVJST1JfT1BFUkFUSU9OX0FCT1JURUQpIHsKLSAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSyxBUExPR19JTkZPLGxhc3RFcnJvciwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGlsZDogJWQgLSBEcmFpbmluZyBhIHBhY2tldCBvZmYgdGhlIGNvbXBsZXRpb24gcG9ydC4iLCBteV9waWQpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfSU5GTyxBUFJfU1VDQ0VTUywgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAiQ2hpbGQ6ICVkIC0gTnVraW5nIGFuIGFjdGl2ZSBjb25uZWN0aW9uLiBjb250ZXh0ID0gJXgiLCBteV9waWQsIGNvbnRleHQpOwotICAgICAgICBjb250ZXh0ID0gKFBDT01QX0NPTlRFWFQpIHBvbDsKLSAgICAgICAgaWYgKGNvbnRleHQgJiYgYkNsZWFuVXApIHsKLSAgICAgICAgICAgIC8qIEl0IGlzIG9ubHkgdmFsaWQgdG8gY2xlYW4tdXAgaW4gdGhlIHByb2Nlc3MgdGhhdCBpbml0aWF0ZWQgdGhlIEkvTyAqLwotICAgICAgICAgICAgY2xvc2Vzb2NrZXQoY29udGV4dC0+YWNjZXB0X3NvY2tldCk7Ci0gICAgICAgICAgICBDbG9zZUhhbmRsZShjb250ZXh0LT5PdmVybGFwcGVkLmhFdmVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1zdGF0aWMgaW50IGNyZWF0ZV9hY2NlcHRleF9jb250ZXh0KGFwX2NvbnRleHRfdCAqX3Bjb25mLCBhcF9saXN0ZW5fcmVjICpscikgCi17Ci0gICAgUENPTVBfQ09OVEVYVCBjb250ZXh0OwotICAgIERXT1JEIEJ5dGVzUmVhZDsKLSAgICBTT0NLRVQgbnNkOwotICAgIGludCBsYXN0ZXJyb3I7Ci0gICAgCi0gICAgLyogYWxsb2NhdGUgdGhlIGNvbXBsZXRpb24gY29udGV4dCAqLwotICAgIGNvbnRleHQgPSBhcF9wY2FsbG9jKF9wY29uZiwgc2l6ZW9mKENPTVBfQ09OVEVYVCkpOwotICAgIGlmICghY29udGV4dCkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSyxBUExPR19FUlIsIEdldExhc3RFcnJvcigpLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJjcmVhdGVfYWNjZXB0ZXhfY29udGV4dDogYXBfcGNhbGxvYygpIGZhaWxlZC4gUHJvY2VzcyB3aWxsIGV4aXQuIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBpbml0aWFsaXplIHRoZSBjb21wbGV0aW9uIGNvbnRleHQgKi8KLSAgICBjb250ZXh0LT5sciA9IGxyOwotICAgIGNvbnRleHQtPk92ZXJsYXBwZWQuaEV2ZW50ID0gQ3JlYXRlRXZlbnQoTlVMTCwgVFJVRSwgRkFMU0UsIE5VTEwpOyAKLSAgICBpZiAoY29udGV4dC0+T3ZlcmxhcHBlZC5oRXZlbnQgPT0gTlVMTCkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSyxBUExPR19FUlIsIEdldExhc3RFcnJvcigpLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJjcmVhdGVfYWNjZXB0ZXhfY29udGV4dDogQ3JlYXRlRXZlbnQoKSBmYWlsZWQuIFByb2Nlc3Mgd2lsbCBleGl0LiIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGNvbnRleHQtPmFjY2VwdF9zb2NrZXQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKLSAgICBpZiAoY29udGV4dC0+YWNjZXB0X3NvY2tldCA9PSBJTlZBTElEX1NPQ0tFVCkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSyxBUExPR19FUlIsIFdTQUdldExhc3RFcnJvcigpLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJjcmVhdGVfYWNjZXB0ZXhfY29udGV4dDogc29ja2V0KCkgZmFpbGVkLiBQcm9jZXNzIHdpbGwgZXhpdC4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBhcF9jcmVhdGVfY29udGV4dCgmY29udGV4dC0+cHRyYW5zLCBfcGNvbmYpOwotICAgIGNvbnRleHQtPmNvbm5faW8gPSBhcF9iY3JlYXRlKGNvbnRleHQtPnB0cmFucywgQl9SRFdSKTsKLSAgICBjb250ZXh0LT5yZWN2X2J1ZiA9IGNvbnRleHQtPmNvbm5faW8tPmluYmFzZTsKLSAgICBjb250ZXh0LT5yZWN2X2J1Zl9zaXplID0gY29udGV4dC0+Y29ubl9pby0+YnVmc2l6IC0gMipQQURERURfQUREUl9TSVpFOwotICAgIGFwX2dldF9vc19zb2NrKCZuc2QsIGNvbnRleHQtPmxyLT5zZCk7Ci0KLSAgICAvKiBBY2NlcHRFeCBvbiB0aGUgY29tcGxldGlvbiBjb250ZXh0LiBUaGUgY29tcGxldGlvbiBjb250ZXh0IHdpbGwgYmUgc2lnbmFsZWQKLSAgICAgKiB3aGVuIGEgY29ubmVjdGlvbiBpcyBhY2NlcHRlZC4gKi8KLSAgICBpZiAoIUFjY2VwdEV4KG5zZCwgY29udGV4dC0+YWNjZXB0X3NvY2tldCwKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQtPnJlY3ZfYnVmLCBjb250ZXh0LT5yZWN2X2J1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgUEFEREVEX0FERFJfU0laRSwgUEFEREVEX0FERFJfU0laRSwKLSAgICAgICAgICAgICAgICAgICZCeXRlc1JlYWQsCi0gICAgICAgICAgICAgICAgICAoTFBPVkVSTEFQUEVEKSBjb250ZXh0KSkgewotICAgICAgICBsYXN0ZXJyb3IgPSBXU0FHZXRMYXN0RXJyb3IoKTsKLSAgICAgICAgaWYgKGxhc3RlcnJvciAhPSBFUlJPUl9JT19QRU5ESU5HKSB7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSyxBUExPR19FUlIsIFdTQUdldExhc3RFcnJvcigpLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiY3JlYXRlX2FjY2VwdGV4X2NvbnRleHQ6IEFjY2VwdEV4IGZhaWxlZC4gUHJvY2VzcyB3aWxsIGV4aXQuIik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbHItPmNvdW50Kys7Ci0KLSAgICByZXR1cm4gMDsKLX0KLXN0YXRpYyBhcF9pbmxpbmUgaW50IHJlc2V0X2FjY2VwdGV4X2NvbnRleHQoUENPTVBfQ09OVEVYVCBjb250ZXh0KSAKLXsKLSAgICBEV09SRCBCeXRlc1JlYWQ7Ci0gICAgU09DS0VUIG5zZDsKLSAgICBpbnQgbGFzdGVycm9yOwotCi0gICAgY29udGV4dC0+bHItPmNvdW50Kys7Ci0KLSAgICBpZiAoY29udGV4dC0+YWNjZXB0X3NvY2tldCA9PSAtMSkKLSAgICAgICAgY29udGV4dC0+YWNjZXB0X3NvY2tldCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOwotCi0gICAgaWYgKGNvbnRleHQtPmFjY2VwdF9zb2NrZXQgPT0gSU5WQUxJRF9TT0NLRVQpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfRVJSLCBXU0FHZXRMYXN0RXJyb3IoKSwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAicmVzZXRfYWNjZXB0ZXhfY29udGV4dDogc29ja2V0KCkgZmFpbGVkLiBQcm9jZXNzIHdpbGwgZXhpdC4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGFwX2NsZWFyX3Bvb2woY29udGV4dC0+cHRyYW5zKTsKLSAgICBjb250ZXh0LT5zb2NrID0gTlVMTDsKLSAgICBjb250ZXh0LT5jb25uX2lvID0gYXBfYmNyZWF0ZShjb250ZXh0LT5wdHJhbnMsIEJfUkRXUik7Ci0gICAgY29udGV4dC0+cmVjdl9idWYgPSBjb250ZXh0LT5jb25uX2lvLT5pbmJhc2U7Ci0gICAgY29udGV4dC0+cmVjdl9idWZfc2l6ZSA9IGNvbnRleHQtPmNvbm5faW8tPmJ1ZnNpeiAtIDIqUEFEREVEX0FERFJfU0laRTsKLSAgICBhcF9nZXRfb3Nfc29jaygmbnNkLCBjb250ZXh0LT5sci0+c2QpOwotCi0gICAgaWYgKCFBY2NlcHRFeChuc2QsIGNvbnRleHQtPmFjY2VwdF9zb2NrZXQsIAotICAgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjdl9idWYsIGNvbnRleHQtPnJlY3ZfYnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICBQQURERURfQUREUl9TSVpFLCBQQURERURfQUREUl9TSVpFLAotICAgICAgICAgICAgICAgICAgJkJ5dGVzUmVhZCwgKExQT1ZFUkxBUFBFRCkgY29udGV4dCkpIHsKLSAgICAgICAgbGFzdGVycm9yID0gV1NBR2V0TGFzdEVycm9yKCk7Ci0gICAgICAgIGlmIChsYXN0ZXJyb3IgIT0gRVJST1JfSU9fUEVORElORykgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfRVJSLCBXU0FHZXRMYXN0RXJyb3IoKSwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgInJlc2V0X2FjY2VwdGV4X2NvbnRleHQ6IEFjY2VwdEV4IGZhaWxlZC4gTGVhdmluZyB0aGUgcHJvY2VzcyBydW5uaW5nLiIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci1zdGF0aWMgUENPTVBfQ09OVEVYVCB3aW5udF9nZXRfY29ubmVjdGlvbihQQ09NUF9DT05URVhUIGNvbnRleHQpCi17Ci0gICAgaW50IHJlcXVlc3RzX3RoaXNfY2hpbGQgPSAwOwotICAgIGludCByYzsKLSAgICBMUE9WRVJMQVBQRUQgcG9sOwotICAgIERXT1JEIENvbXBLZXk7Ci0gICAgRFdPUkQgQnl0ZXNSZWFkOwotICAgIGludCBsYXN0RXJyb3I7Ci0KLSAgICBpZiAoY29udGV4dCAhPSBOVUxMKSB7Ci0gICAgICAgIC8qIElmIGNoaWxkIHNodXRkb3duIGhhcyBiZWVuIHNpZ25hbGVkLCBjbGVhbi11cCB0aGUgY29tcGxldGlvbiBjb250ZXh0ICovCi0gICAgICAgIGlmICh3b3JrZXJzX21heV9leGl0KSB7Ci0gICAgICAgICAgICBDbG9zZUhhbmRsZShjb250ZXh0LT5PdmVybGFwcGVkLmhFdmVudCk7Ci0gICAgICAgICAgICAvKiBkZXN0cm95IHBvb2wgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNvbnRleHQtPmFjY2VwdF9zb2NrZXQgPSAtMTsgLyogRG9uJ3QgcmV1c2UgdGhlIGFjY2VwdF9zb2NrZXQgKi8KLSAgICAgICAgICAgIGlmIChyZXNldF9hY2NlcHRleF9jb250ZXh0KGNvbnRleHQpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQtPmFjY2VwdF9zb2NrZXQgIT0gLTEpCi0gICAgICAgICAgICAgICAgICAgIGNsb3Nlc29ja2V0KGNvbnRleHQtPmFjY2VwdF9zb2NrZXQpOwotICAgICAgICAgICAgICAgIENsb3NlSGFuZGxlKGNvbnRleHQtPk92ZXJsYXBwZWQuaEV2ZW50KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIHJjID0gR2V0UXVldWVkQ29tcGxldGlvblN0YXR1cyhBY2NlcHRFeENvbXBQb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJ5dGVzUmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb21wS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORklOSVRFKTsKLSAgICAgICAgaWYgKCFyYykgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfRVJSLCBsYXN0RXJyb3IsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICJDaGlsZDogJWQgLSBHZXRRdWV1ZWRDb21wbGV0aW9uU3RhdHVzKCkgZmFpbGVkIiwgbXlfcGlkKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjb250ZXh0ID0gKFBDT01QX0NPTlRFWFQpIHBvbDsKLSAgICBpZiAoQ29tcEtleSA9PSA5OTkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgLyogRWFjaCBsaXN0ZW5lciBuZWVkcyBhdCBsZWFzdCAxIGNvbnRleHQgYXZhaWxhYmxlIHRvIHJlY2VpdmUgY29ubmVjdGlvbnMgb24uCi0gICAgICogQ3JlYXRlIGFkZGl0aW9uYWwgbGlzdGVuZXIgY29udGV4dHMgaWYgbmVlZGVkLiAKLSAgICAgKi8KLSAgICBhcF9sb2NrKGFsbG93ZWRfZ2xvYmFscy5qb2JtdXRleCk7Ci0gICAgY29udGV4dC0+bHItPmNvdW50LS07Ci0gICAgaWYgKChjb250ZXh0LT5sci0+Y291bnQgPCAyKSAmJiAhd29ya2Vyc19tYXlfZXhpdCkgewotICAgICAgICBpZiAoY3JlYXRlX2FjY2VwdGV4X2NvbnRleHQocGNvbmYsIGNvbnRleHQtPmxyKSA9PSAtMSkgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfRVJSLCBHZXRMYXN0RXJyb3IoKSwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBjcmVhdGUgYW4gQWNjZXB0RXggY29tcGxldGlvbiBjb250ZXh0IC0tIHByb2Nlc3Mgd2lsbCBleGl0Iik7Ci0gICAgICAgICAgICBzaWduYWxfcGFyZW50KDApOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYXBfdW5sb2NrKGFsbG93ZWRfZ2xvYmFscy5qb2JtdXRleCk7Ci0KLSAgICAvKiBSZWNlaXZlZCBhIGNvbm5lY3Rpb24gKi8KLSAgICBjb250ZXh0LT5jb25uX2lvLT5pbmNudCA9IEJ5dGVzUmVhZDsKLSAgICBHZXRBY2NlcHRFeFNvY2thZGRycyhjb250ZXh0LT5yZWN2X2J1ZiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+cmVjdl9idWZfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQQURERURfQUREUl9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgIFBBRERFRF9BRERSX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHQtPnNhX3NlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dC0+c2Ffc2VydmVyX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dC0+c2FfY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0LT5zYV9jbGllbnRfbGVuKTsKLQotICAgIHJldHVybiBjb250ZXh0OwotCi19Ci0vKgotICogd29ya2VyX21haW4oKSAtIHRoaXMgaXMgdGhlIG1haW4gbG9vcCBmb3IgdGhlIHdvcmtlciB0aHJlYWRzCi0gKgotICogV2luZG93cyA5NS85OAotICogRWFjaCB0aHJlYWQgcnVucyB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gVGhleSB3YWl0IHdpdGhpbiByZW1vdmVfam9iKCkKLSAqIGZvciBhIGpvYiB0byBiZWNvbWUgYXZhaWxhYmxlLCB0aGVuIGhhbmRsZSBhbGwgdGhlIHJlcXVlc3RzIG9uIHRoYXQKLSAqIGNvbm5lY3Rpb24gdW50aWwgaXQgaXMgY2xvc2VkLCB0aGVuIHJldHVybiB0byByZW1vdmVfam9iKCkuCi0gKgotICogVGhlIHdvcmtlciB0aHJlYWQgd2lsbCBleGl0IHdoZW4gaXQgcmVtb3ZlcyBhIGpvYiB3aGljaCBjb250YWlucwotICogc29ja2V0IG51bWJlciAtMS4gVGhpcyBwcm92aWRlcyBhIGdyYWNlZnVsIHRocmVhZCBleGl0LCBzaW5jZQotICogaXQgd2lsbCBuZXZlciBleGl0IGR1cmluZyBhIGNvbm5lY3Rpb24uCi0gKgotICogVGhpcyBjb2RlIGluIHRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGVxdWl2YWxlbnQgdG8gdGhlIGNoaWxkX21haW4oKQotICogZnJvbSB0aGUgbXVsdGktcHJvY2VzcyAoVW5peCkgZW52aXJvbm1lbnQsIGV4Y2VwdCB0aGF0IHdlCi0gKgotICogIC0gZG8gbm90IGNhbGwgY2hpbGRfaW5pdF9tb2R1bGVzIChjaGlsZCBpbml0IEFQSSBwaGFzZSkKLSAqICAtIGJsb2NrIGluIHJlbW92ZV9qb2IsIGFuZCB3aGVuIHVuYmxvY2tlZCB3ZSBoYXZlIGFuIGFscmVhZHkKLSAqICAgIGFjY2VwdGVkIHNvY2tldCwgaW5zdGVhZCBvZiBibG9ja2luZyBvbiBhIG11dGV4IG9yIHNlbGVjdCgpLgotICovCi0KLXN0YXRpYyB2b2lkIHdvcmtlcl9tYWluKGludCBjaGlsZF9udW0pCi17Ci0gICAgc3RhdGljIEJPT0xFQU4gYkxpc3RlbmVyc1N0YXJ0ZWQgPSBGQUxTRTsKLSAgICBQQ09NUF9DT05URVhUIGNvbnRleHQgPSBOVUxMOwotCi0gICAgaWYgKG9zdmVyLmR3UGxhdGZvcm1JZCAhPSBWRVJfUExBVEZPUk1fV0lOMzJfV0lORE9XUykgewotICAgICAgICAvKiBXaW5kb3dzIE5ULzIwMDA6IENyZWF0ZSBBY2NlcHRFeCBjb21wbGV0aW9uIGNvbnRleHRzIGZvciBlYWNoIG9mIHRoZQotICAgICAgICAgKiBsaXN0ZW5lcnMKLSAgICAgICAgICovCi0gICAgICAgIGFwX2xvY2soYWxsb3dlZF9nbG9iYWxzLmpvYm11dGV4KTsKLSAgICAgICAgaWYgKCFiTGlzdGVuZXJzU3RhcnRlZCkgewotICAgICAgICAgICAgYXBfbGlzdGVuX3JlYyAqbHI7Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGJMaXN0ZW5lcnNTdGFydGVkID0gVFJVRTsKLSAgICAgICAgICAgIGZvciAobHIgPSBhcF9saXN0ZW5lcnM7IGxyICE9IE5VTEw7IGxyID0gbHItPm5leHQpIHsKLSAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPDI7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAobHItPmNvdW50IDwgMikKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVfYWNjZXB0ZXhfY29udGV4dChwY29uZiwgbHIpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfRVJSLCBHZXRMYXN0RXJyb3IoKSwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gY3JlYXRlIGFuIEFjY2VwdEV4IGNvbXBsZXRpb24gY29udGV4dCAtLSBwcm9jZXNzIHdpbGwgZXhpdCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbF9wYXJlbnQoMCk7CS8qIHRlbGwgcGFyZW50IHRvIGRpZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhcF91bmxvY2soYWxsb3dlZF9nbG9iYWxzLmpvYm11dGV4KTsKLSAgICB9Ci0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICBjb25uX3JlYyAqY3VycmVudF9jb25uOwotICAgICAgICBhcF9pb2wgKmlvbDsKLQotICAgICAgICAvKiBHcmFiIGEgY29ubmVjdGlvbiBvZmYgdGhlIG5ldHdvcmsgKi8KLSAgICAgICAgaWYgKG9zdmVyLmR3UGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfV0lORE9XUykgewotICAgICAgICAgICAgY29udGV4dCA9IHdpbjl4X2dldF9jb25uZWN0aW9uKGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgY29udGV4dCA9IHdpbm50X2dldF9jb25uZWN0aW9uKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFjb250ZXh0KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHNvY2tfZGlzYWJsZV9uYWdsZShjb250ZXh0LT5hY2NlcHRfc29ja2V0KTsKLSAgICAgICAgYXBfcHV0X29zX3NvY2soJmNvbnRleHQtPnNvY2ssICZjb250ZXh0LT5hY2NlcHRfc29ja2V0LCBjb250ZXh0LT5wdHJhbnMpOwotICAgICAgICBhcF9yZWdpc3Rlcl9jbGVhbnVwKGNvbnRleHQtPnB0cmFucywgY29udGV4dC0+c29jaywgc29ja2V0X2NsZWFudXAsIGFwX251bGxfY2xlYW51cCk7Ci0gICAgICAgIGlvbCA9IHdpbjMyX2F0dGFjaF9zb2NrZXQoY29udGV4dC0+cHRyYW5zLCBjb250ZXh0LT5zb2NrKTsKLSAgICAgICAgaWYgKGlvbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBBUFJfRU5PTUVNLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAid29ya2VyX21haW46IGF0dGFjaF9zb2NrZXQoKSBmYWlsZWQuIENvbnRpbnVpbmcuLi4iKTsKLSAgICAgICAgICAgIGNsb3Nlc29ja2V0KGNvbnRleHQtPmFjY2VwdF9zb2NrZXQpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgYXBfYnB1c2hfaW9sKGNvbnRleHQtPmNvbm5faW8sIGlvbCk7Ci0gICAgICAgIGN1cnJlbnRfY29ubiA9IGFwX25ld19jb25uZWN0aW9uKGNvbnRleHQtPnB0cmFucywgc2VydmVyX2NvbmYsIGNvbnRleHQtPmNvbm5faW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgY29udGV4dC0+c2FfY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyX2luICopIGNvbnRleHQtPnNhX3NlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfbnVtKTsKLQotICAgICAgICBhcF9wcm9jZXNzX2Nvbm5lY3Rpb24oY3VycmVudF9jb25uKTsKLSAgICB9Ci0jaWYgMAotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19JTkZPLCBBUFJfU1VDQ0VTUywgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICJjaGlsZF9tYWluOiBTZXR0aW5nIGV4aXRfZXZlbnQiKTsKLSAgICBTZXRFdmVudChleGl0X2V2ZW50KTsKLSNlbmRpZgotICAgIC8qIFRPRE86IEFkZCBjb2RlIHRvIGNsZWFuLXVwIGNvbXBsZXRpb24gY29udGV4dHMgaGVyZSAqLwotfQotCi1zdGF0aWMgdm9pZCBjbGVhbnVwX3RocmVhZCh0aHJlYWQgKipoYW5kbGVzLCBpbnQgKnRocmVhZF9jbnQsIGludCB0aHJlYWRfdG9fY2xlYW4pCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmcmVlX3RocmVhZChoYW5kbGVzW3RocmVhZF90b19jbGVhbl0pOwotICAgIGZvciAoaSA9IHRocmVhZF90b19jbGVhbjsgaSA8ICgoKnRocmVhZF9jbnQpIC0gMSk7IGkrKykKLQloYW5kbGVzW2ldID0gaGFuZGxlc1tpICsgMV07Ci0gICAgKCp0aHJlYWRfY250KS0tOwotfQotCi0KLQotLyoKLSAqIGNoaWxkX21haW4oKSBpcyBtYWluIGxvb3AgZm9yIHRoZSBjaGlsZCBwcm9jZXNzLiBUaGUgbG9vcCBpbgotICogdGhpcyBmdW5jdGlvbiBiZWNvbWVzIHRoZSBjb250cm9sbGluZyB0aHJlYWQgZm9yIHRoZSBhY3R1YWxseSB3b3JraW5nCi0gKiB0aHJlYWRzICh3aGljaCBydW4gaW4gYSBsb29wIGluIGNoaWxkX3N1Yl9tYWluKCkpLgotICogR2xvYmFscyBVc2VkOgotICogIGV4aXRfZXZlbnQsIHN0YXJ0X211dGV4LCBhcF90aHJlYWRzX3Blcl9jaGlsZCwgc2VydmVyX2NvbmYsCi0gKiAgaF9lcnJubyBkZWZpbmVkIHRvIFdTQUdldExhc3RFcnJvciBpbiB3aW5zb2NrMi5oLAotICovCi1zdGF0aWMgdm9pZCBjaGlsZF9tYWluKCkKLXsKLSAgICBpbnQgbnRocmVhZHMgPSBhcF90aHJlYWRzX3Blcl9jaGlsZDsKLQotICAgIHRocmVhZCAqKmNoaWxkX2hhbmRsZXM7Ci0gICAgaW50IHJ2OwotICAgIGFwX3N0YXR1c190IHN0YXR1czsKLSAgICB0aW1lX3QgZW5kX3RpbWU7Ci0gICAgaW50IGk7Ci0gICAgYXBfY29udGV4dF90ICpwY2hpbGQ7Ci0KLSAgICBhcF9jcmVhdGVfY29udGV4dCgmcGNoaWxkLCBwY29uZik7Ci0KLS8vICAgIGFwX3Jlc3RhcnRfdGltZSA9IHRpbWUoTlVMTCk7Ci0gICAgLyoKLSAgICAgKiBXYWl0IHVudGlsIHdlIGhhdmUgcGVybWlzc2lvbiB0byBzdGFydCBhY2NlcHRpbmcgY29ubmVjdGlvbnMuCi0gICAgICogc3RhcnRfbXV0ZXggaXMgdXNlZCB0byBlbnN1cmUgdGhhdCBvbmx5IG9uZSBjaGlsZCBldmVyCi0gICAgICogZ29lcyBpbnRvIHRoZSBsaXN0ZW4vYWNjZXB0IGxvb3AgYXQgb25jZS4KLSAgICAgKi8KLSAgICBzdGF0dXMgPSBhcF9sb2NrKHN0YXJ0X211dGV4KTsKLSAgICBpZiAoc3RhdHVzICE9IEFQUl9TVUNDRVNTKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfRVJSLCBzdGF0dXMsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgIkNoaWxkICVkOiBGYWlsZWQgdG8gYWNxdWlyZSB0aGUgc3RhcnRfbXV0ZXguIFByb2Nlc3Mgd2lsbCBleGl0LiIsIG15X3BpZCk7Ci0gICAgICAgIHNpZ25hbF9wYXJlbnQoMCk7CS8qIHRlbGwgcGFyZW50IHRvIGRpZSAqLwotCWFwX2Rlc3Ryb3lfY29udGV4dChwY2hpbGQpOwotCWV4aXQoMCk7Ci0gICAgfQotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLEFQTE9HX0lORk8sIEFQUl9TVUNDRVNTLCBzZXJ2ZXJfY29uZiwgIkNoaWxkICVkOiBBY3F1aXJlZCB0aGUgc3RhcnQgbXV0ZXgiLCBteV9waWQpOwotCi0gICAgLyogU2V0dXAgdGhlIGxpc3RlbmluZyBzb2NrZXRzICovCi0gICAgaWYgKG9uZV9wcm9jZXNzKSB7Ci0gICAgICAgIHNldHVwX2xpc3RlbmVycyhzZXJ2ZXJfY29uZik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2V0dXBfaW5oZXJpdGVkX2xpc3RlbmVycyhzZXJ2ZXJfY29uZik7Ci0gICAgfQotICAgIGlmIChsaXN0ZW5tYXhmZCA9PSBJTlZBTElEX1NPQ0tFVCkgewotICAgICAgICAvKiBObyBzb2NrZXRzIHdlcmUgbWFkZSwgYmV0dGVyIGxvZyBzb21ldGhpbmcgYW5kIGV4aXQgKi8KLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0NSSVQsIGhfZXJybm8sIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAiTm8gc29ja2V0cyB3ZXJlIGNyZWF0ZWQgZm9yIGxpc3RlbmluZyIpOwotICAgICAgICBzaWduYWxfcGFyZW50KDApOwkvKiB0ZWxsIHBhcmVudCB0byBkaWUgKi8KLSAgICAgICAgYXBfZGVzdHJveV9jb250ZXh0KHBjaGlsZCk7Ci0gICAgICAgIGV4aXQoMCk7Ci0gICAgfQotCi0gICAgYWxsb3dlZF9nbG9iYWxzLmpvYnNlbWFwaG9yZSA9IGNyZWF0ZV9zZW1hcGhvcmUoMCk7Ci0gICAgYXBfY3JlYXRlX2xvY2soJmFsbG93ZWRfZ2xvYmFscy5qb2JtdXRleCwgQVBSX01VVEVYLCBBUFJfSU5UUkFQUk9DRVNTLCBOVUxMLCBwY2hpbGQpOwotCi0gICAgLyogQ3JlYXRlIHRoZSB3b3JrZXIgdGhyZWFkIHBvb2wgKi8KLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSyxBUExPR19JTkZPLCBBUFJfU1VDQ0VTUywgc2VydmVyX2NvbmYsICJDaGlsZCAlZDogQ3JlYXRpbmcgJWQgd29ya2VyIHRocmVhZHMiLG15X3BpZCwgbnRocmVhZHMpOwotICAgIGNoaWxkX2hhbmRsZXMgPSAodGhyZWFkICopIGFsbG9jYShudGhyZWFkcyAqIHNpemVvZihpbnQpKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgewotICAgICAgICBjaGlsZF9oYW5kbGVzW2ldID0gY3JlYXRlX3RocmVhZCgodm9pZCAoKikodm9pZCAqKSkgd29ya2VyX21haW4sICh2b2lkICopIGkpOwotICAgIH0KLQotICAgIGlmIChvc3Zlci5kd1BsYXRmb3JtSWQgPT0gVkVSX1BMQVRGT1JNX1dJTjMyX1dJTkRPV1MpIHsKLSAgICAgICAgLyogV2luOTUvOTg6IENyZWF0ZSB0aGUgYWNjZXB0IHRocmVhZCAqLwotICAgICAgICBjcmVhdGVfdGhyZWFkKCh2b2lkICgqKSh2b2lkICopKSBhY2NlcHRfYW5kX3F1ZXVlX2Nvbm5lY3Rpb25zLCAodm9pZCAqKSBOVUxMKTsKLSAgICB9Ci0KLSAgICAvKiBXYWl0IGZvciB0aGUgZXhpdCBldmVudCB0byBiZSBzaWduYWxlZCBieSB0aGUgcGFyZW50IHByb2Nlc3MgKi8KLSAgICBydiA9IFdhaXRGb3JTaW5nbGVPYmplY3QoZXhpdF9ldmVudCwgSU5GSU5JVEUpOwotCi0gICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfSU5GTywgQVBSX1NVQ0NFU1MsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAiQ2hpbGQgJWQ6IEV4aXQgZXZlbnQgc2lnbmFsZWQuIENoaWxkIHByb2Nlc3MgaXMgZW5kaW5nLiIsIG15X3BpZCk7Ci0gICAgd29ya2Vyc19tYXlfZXhpdCA9IDE7ICAgICAgCi0KLSAgICAvKiBTaHV0ZG93biB0aGUgd29ya2VyIHRocmVhZHMgKi8KLSAgICBpZiAob3N2ZXIuZHdQbGF0Zm9ybUlkID09IFZFUl9QTEFURk9STV9XSU4zMl9XSU5ET1dTKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudGhyZWFkczsgaSsrKSB7Ci0gICAgICAgICAgICBhZGRfam9iKC0xKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsgLyogV2luZG93cyBOVC8yMDAwICovCi0gICAgICAgIC8qIEhhY2sgYWxlcnQuLi4gR2l2ZSB0aGUgc2VydmVyIGEgY291cGxlIG9mIHNlY29uZHMgdG8gcmVjZWl2ZSAKLSAgICAgICAgICogY29ubmVjdGlvbnMgYW5kIGRyYWluIEFjY2VwdEV4IGNvbXBsZXRpb24gY29udGV4dHMuIFdlIHdpbGwKLSAgICAgICAgICogcHJvYmFibHkgZHJvcCBhIGZldyBjb25uZWN0aW9ucyBhY3Jvc3MgYSBncmFjZWZ1bCByZXN0YXJ0LCBidXQKLSAgICAgICAgICogaG9wZWZ1bGx5IG5vdCBtYW55LiBUaGlzIG5lZWRzIHdvcmsuLi4qLwotICAgICAgICBTbGVlcCgyMDAwKTsKLQotICAgICAgICAvKiBUZWxsIHRoZSB3b3JrZXIgdGhyZWFkcyB0byBleGl0LiBBbnkgY29ubmVjdGlvbnMgYWNjZXB0ZWQgb24gCi0gICAgICAgICAqIHRoZSBjb21wbGV0aW9uIHBvcnQgZnJvbSBub3cgd2lsbCBiZSBkcm9wcGVkICovCi0gICAgICAgIGZvciAoaT0wOyBpIDwgbnRocmVhZHM7IGkrKykgewotICAgICAgICAgICAgaWYgKCFQb3N0UXVldWVkQ29tcGxldGlvblN0YXR1cyhBY2NlcHRFeENvbXBQb3J0LCAwLCA5OTksIE5VTEwpKSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfSU5GTywgQVBSX1NVQ0NFU1MsIHNlcnZlcl9jb25mLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvc3RRdWV1ZWRDb21wbGV0aW9uU3RhdHVzIGZhaWxlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogV2FpdCBmb3IgdGhlIHdvcmtlciB0aHJlYWRzIHRvIGRpZSAqLwotICAgIGVuZF90aW1lID0gdGltZShOVUxMKSArIDE4MDsKLSAgICB3aGlsZSAobnRocmVhZHMpIHsKLSAgICAgICAgcnYgPSB3YWl0X2Zvcl9tYW55X29iamVjdHMobnRocmVhZHMsIGNoaWxkX2hhbmRsZXMsIGVuZF90aW1lIC0gdGltZShOVUxMKSk7Ci0JaWYgKHJ2ICE9IFdBSVRfVElNRU9VVCkgewotCSAgICBydiA9IHJ2IC0gV0FJVF9PQkpFQ1RfMDsKLQkgICAgYXBfYXNzZXJ0KChydiA+PSAwKSAmJiAocnYgPCBudGhyZWFkcykpOwotCSAgICBjbGVhbnVwX3RocmVhZChjaGlsZF9oYW5kbGVzLCAmbnRocmVhZHMsIHJ2KTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7IGkrKykgewotCWtpbGxfdGhyZWFkKGNoaWxkX2hhbmRsZXNbaV0pOwotCWZyZWVfdGhyZWFkKGNoaWxkX2hhbmRsZXNbaV0pOwotICAgIH0KLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSyxBUExPR19JTkZPLCBBUFJfU1VDQ0VTUywgc2VydmVyX2NvbmYsIAotICAgICAgICAgICAgICAgICAiQ2hpbGQgJWQ6IEFsbCB3b3JrZXIgdGhyZWFkcyBoYXZlIGVuZGVkLiIsIG15X3BpZCk7Ci0KLSAgICBpZiAob3N2ZXIuZHdQbGF0Zm9ybUlkICE9IFZFUl9QTEFURk9STV9XSU4zMl9XSU5ET1dTKSB7ICAgIAotICAgICAgICAvKiBBbGwgdGhlIHdvcmtlciB0aHJlYWRzIHNob3VsZCBoYXZlIGV4aXRlZCBieSBub3csIHdoaWNoIHdpbGwKLSAgICAgICAgICogY2F1c2UgYW55IG91dHN0YW5kaW5nIEkvTyBvbiB0aGUgY29tcGxldGlvbiBwb3J0IHRvIGJlIGFib3J0ZWQuCi0gICAgICAgICAqIERyYWluIHRoZSBjb21wbGV0aW9uIHBvcnQgb2YgdGhpcyBhYm9ydGVkIEkvTy8KLSAgICAgICAgICovCi0gICAgICAgIGRyYWluX2FjY2VwdGV4X2NvbXBscG9ydChBY2NlcHRFeENvbXBQb3J0LCBUUlVFKTsKLSAgICB9Ci0KLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSyxBUExPR19JTkZPLCBBUFJfU1VDQ0VTUywgc2VydmVyX2NvbmYsIAotICAgICAgICAgICAgICAgICAiQ2hpbGQgJWQ6IFJlbGVhc2luZyB0aGUgc3RhcnQgbXV0ZXgiLCBteV9waWQpOwotICAgIGFwX3VubG9jayhzdGFydF9tdXRleCk7Ci0KLSAgICAvKiBTdGlsbCBuZWVkIHRvIHJlZ2lzdGVyIGNsZWFudXBzIGZvciB0aGUgc29ja2V0cyAqLwotICAgIENsb3NlSGFuZGxlKEFjY2VwdEV4Q29tcFBvcnQpOwotICAgIGRlc3Ryb3lfc2VtYXBob3JlKGFsbG93ZWRfZ2xvYmFscy5qb2JzZW1hcGhvcmUpOwotICAgIGFwX2Rlc3Ryb3lfbG9jayhhbGxvd2VkX2dsb2JhbHMuam9ibXV0ZXgpOwotCi0gICAgYXBfZGVzdHJveV9jb250ZXh0KHBjaGlsZCk7Ci19Ci0KLS8qCi0gKiBTcGF3biBhIGNoaWxkIEFwYWNoZSBwcm9jZXNzLiBUaGUgY2hpbGQgcHJvY2VzcyBoYXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZnJvbQotICogYXJnYyBhbmQgYXJndltdLCBwbHVzIGEgLVogYXJndW1lbnQgZ2l2aW5nIHRoZSBuYW1lIG9mIGFuIGV2ZW50LiBUaGUgY2hpbGQgc2hvdWxkCi0gKiBvcGVuIGFuZCBwb2xsIG9yIHdhaXQgb24gdGhpcyBldmVudC4gV2hlbiBpdCBpcyBzaWduYWxsZWQsIHRoZSBjaGlsZCBzaG91bGQgZGllLgotICogcHJlZml4IGlzIGEgcHJlZml4IHN0cmluZyBmb3IgdGhlIGV2ZW50IG5hbWUuCi0gKiAKLSAqIFRoZSBjaGlsZF9udW0gYXJndW1lbnQgb24gZW50cnkgY29udGFpbnMgYSBzZXJpYWwgbnVtYmVyIGZvciB0aGlzIGNoaWxkICh1c2VkIHRvIGNyZWF0ZQotICogYSB1bmlxdWUgZXZlbnQgbmFtZSkuIE9uIGV4aXQsIHRoaXMgbnVtYmVyIHdpbGwgaGF2ZSBiZWVuIGluY3JlbWVudGVkIGJ5IG9uZSwgcmVhZHkKLSAqIGZvciB0aGUgbmV4dCBjYWxsLiAKLSAqCi0gKiBPbiBleGl0LCB0aGUgdmFsdWUgcG9pbnRlZCB0byBiZSAqZXYgd2lsbCBjb250YWluIHRoZSBldmVudCBjcmVhdGVkCi0gKiB0byBzaWduYWwgdGhlIG5ldyBjaGlsZCBwcm9jZXNzLgotICoKLSAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGhhbmRsZSB0byB0aGUgY2hpbGQgcHJvY2VzcyBpZiBzdWNjZXNzZnVsLCBlbHNlIC0xLiBJZiAtMSBpcwotICogcmV0dXJuZWQgdGhlIGVycm9yIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gbG9nZ2VkIGJ5IGFwX2xvZ19lcnJvcigpLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBtYXN0ZXJfbWFpbiAtIHRoaXMgaXMgdGhlIHBhcmVudCAobWFpbikgcHJvY2Vzcy4gV2UgY3JlYXRlIGEKLSAqIGNoaWxkIHByb2Nlc3MgdG8gZG8gdGhlIHdvcmssIHRoZW4gc2l0IGFyb3VuZCB3YWl0aW5nIGZvciBlaXRoZXIKLSAqIHRoZSBjaGlsZCB0byBleGl0LCBvciBhIHJlc3RhcnQgb3IgZXhpdCBzaWduYWwuIElmIHRoZSBjaGlsZCBkaWVzLAotICogd2UganVzdCByZXNwYXduIGEgbmV3IG9uZS4gSWYgd2UgaGF2ZSBhIHNodXRkb3duIG9yIGdyYWNlZnVsIHJlc3RhcnQsCi0gKiB0ZWxsIHRoZSBjaGlsZCB0byBkaWUgd2hlbiBpdCBpcyByZWFkeS4gSWYgaXQgaXMgYSBub24tZ3JhY2VmdWwKLSAqIHJlc3RhcnQsIGZvcmNlIHRoZSBjaGlsZCB0byBkaWUgaW1tZWRpYXRlbHkuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBNQVhfUFJPQ0VTU0VTIDUwIC8qIG11c3QgYmUgPCBNQVhfV0FJVF9PQkpFQ1RTLTEgKi8KLQotc3RhdGljIHZvaWQgY2xlYW51cF9wcm9jZXNzKEhBTkRMRSAqaGFuZGxlcywgSEFORExFICpldmVudHMsIGludCBwb3NpdGlvbiwgaW50ICpwcm9jZXNzZXMpCi17Ci0gICAgaW50IGk7Ci0gICAgaW50IGhhbmRsZSA9IDA7Ci0KLSAgICBDbG9zZUhhbmRsZShoYW5kbGVzW3Bvc2l0aW9uXSk7Ci0gICAgQ2xvc2VIYW5kbGUoZXZlbnRzW3Bvc2l0aW9uXSk7Ci0KLSAgICBoYW5kbGUgPSAoaW50KWhhbmRsZXNbcG9zaXRpb25dOwotCi0gICAgZm9yIChpID0gcG9zaXRpb247IGkgPCAoKnByb2Nlc3NlcyktMTsgaSsrKSB7Ci0JaGFuZGxlc1tpXSA9IGhhbmRsZXNbaSArIDFdOwotCWV2ZW50c1tpXSA9IGV2ZW50c1tpICsgMV07Ci0gICAgfQotICAgICgqcHJvY2Vzc2VzKS0tOwotfQotCi1zdGF0aWMgaW50IGNyZWF0ZV9wcm9jZXNzKGFwX2NvbnRleHRfdCAqcCwgSEFORExFICpoYW5kbGVzLCBIQU5ETEUgKmV2ZW50cywgaW50ICpwcm9jZXNzZXMpCi17Ci0KLSAgICBpbnQgcnY7Ci0gICAgY2hhciBidWZbMTAyNF07Ci0gICAgY2hhciAqcENvbW1hbmQ7Ci0gICAgaW50IGk7Ci0gICAgU1RBUlRVUElORk8gc2k7ICAgICAgICAgICAvKiBGaWxsZWQgaW4gcHJpb3IgdG8gY2FsbCB0byBDcmVhdGVQcm9jZXNzICovCi0gICAgUFJPQ0VTU19JTkZPUk1BVElPTiBwaTsgICAvKiBmaWxsZWQgaW4gb24gY2FsbCB0byBDcmVhdGVQcm9jZXMgKi8KLQotICAgIGFwX2xpc3Rlbl9yZWMgKmxyOwotICAgIERXT1JEIEJ5dGVzV3JpdHRlbjsKLSAgICBIQU5ETEUgaFBpcGVSZWFkID0gTlVMTDsKLSAgICBIQU5ETEUgaFBpcGVXcml0ZSA9IE5VTEw7Ci0gICAgU0VDVVJJVFlfQVRUUklCVVRFUyBzYSA9IHswfTsgIAotCi0gICAgc2Eubkxlbmd0aCA9IHNpemVvZihzYSk7Ci0gICAgc2EuYkluaGVyaXRIYW5kbGUgPSBUUlVFOwotICAgIHNhLmxwU2VjdXJpdHlEZXNjcmlwdG9yID0gTlVMTDsKLQotICAgIC8qIENyZWF0ZSB0aGUgSU9Db21wbGV0aW9uUG9ydCAqLwotICAgIGlmIChBY2NlcHRFeENvbXBQb3J0ID09IE5VTEwpIHsKLSAgICAgICAgQWNjZXB0RXhDb21wUG9ydCA9IENyZWF0ZUlvQ29tcGxldGlvblBvcnQoSU5WQUxJRF9IQU5ETEVfVkFMVUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAvKiBDT05DVVJSRU5UIEFDVElWRSBUSFJFQURTICovCi0gICAgICAgIGlmIChBY2NlcHRFeENvbXBQb3J0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLEFQTE9HX0VSUiwgR2V0TGFzdEVycm9yKCksIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gY3JlYXRlIHRoZSBBY2NlcHRFeENvbXBsZXRpb25Qb3J0IC0tIHByb2Nlc3Mgd2lsbCBleGl0Iik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBCdWlsZCB0aGUgY29tbWFuZCBsaW5lLiBTaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgotICAgICAqIEM6L2FwYWNoZS9iaW4vYXBhY2hlLmV4ZSAtZiBhcF9zZXJ2ZXJfY29uZm5hbWUgCi0gICAgICogRmlyc3QsIGdldCB0aGUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZS4uLgotICAgICAqLwotICAgIHJ2ID0gR2V0TW9kdWxlRmlsZU5hbWUoTlVMTCwgYnVmLCBzaXplb2YoYnVmKSk7Ci0gICAgaWYgKHJ2ID09IHNpemVvZihidWYpKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19DUklULCBFUlJPUl9CQURfUEFUSE5BTUUsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgIlBhcmVudDogUGF0aCB0byBBcGFjaGUgcHJvY2VzcyB0b28gbG9uZyIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChydiA9PSAwKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19DUklULCBHZXRMYXN0RXJyb3IoKSwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAiUGFyZW50OiBHZXRNb2R1bGVGaWxlTmFtZSgpIHJldHVybmVkIE5VTEwgZm9yIGN1cnJlbnQgcHJvY2Vzcy4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIEJ1aWxkIHRoZSBjb21tYW5kIGxpbmUgKi8KLSAgICBwQ29tbWFuZCA9IGFwX3BzcHJpbnRmKHAsICJcIiVzXCIiLCBidWYpOyAgCi0gICAgZm9yIChpID0gMTsgaSA8IHNlcnZlcl9jb25mLT5wcm9jZXNzLT5hcmdjOyBpKyspIHsKLSAgICAgICAgcENvbW1hbmQgPSBhcF9wc3RyY2F0KHAsIHBDb21tYW5kLCAiIFwiIiwgc2VydmVyX2NvbmYtPnByb2Nlc3MtPmFyZ3ZbaV0sICJcIiIsIE5VTEwpOwotICAgIH0KLQotICAgIC8qIENyZWF0ZSBhIHBpcGUgdG8gc2VuZCBzb2NrZXQgaW5mbyB0byB0aGUgY2hpbGQgKi8KLSAgICBpZiAoIUNyZWF0ZVBpcGUoJmhQaXBlUmVhZCwgJmhQaXBlV3JpdGUsICZzYSwgMCkpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0NSSVQsIEdldExhc3RFcnJvcigpLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICJQYXJlbnQ6IFVuYWJsZSB0byBjcmVhdGUgcGlwZSB0byBjaGlsZCBwcm9jZXNzLlxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBTZXRFbnZpcm9ubWVudFZhcmlhYmxlKCJBUF9QQVJFTlRfUElEIixhcF9wc3ByaW50ZihwLCIlZCIscGFyZW50X3BpZCkpOwotCi0gICAgLyogR2l2ZSB0aGUgcmVhZCBlbmQgb2YgdGhlIHBpcGUgKGhQaXBlUmVhZCkgdG8gdGhlIGNoaWxkIGFzIHN0ZGluLiBUaGUgCi0gICAgICogcGFyZW50IHdpbGwgd3JpdGUgdGhlIHNvY2tldCBkYXRhIHRvIHRoZSBjaGlsZCBvbiB0aGlzIHBpcGUuCi0gICAgICovCi0gICAgbWVtc2V0KCZzaSwgMCwgc2l6ZW9mKHNpKSk7Ci0gICAgbWVtc2V0KCZwaSwgMCwgc2l6ZW9mKHBpKSk7Ci0gICAgc2kuY2IgPSBzaXplb2Yoc2kpOwotICAgIHNpLmR3RmxhZ3MgICAgID0gU1RBUlRGX1VTRVNIT1dXSU5ET1cgfCBTVEFSVEZfVVNFU1RESEFORExFUzsKLSAgICBzaS53U2hvd1dpbmRvdyA9IFNXX0hJREU7Ci0gICAgc2kuaFN0ZElucHV0ICAgPSBoUGlwZVJlYWQ7Ci0KLSAgICBpZiAoIUNyZWF0ZVByb2Nlc3MoTlVMTCwgcENvbW1hbmQsIE5VTEwsIE5VTEwsIAotICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCAgICAgICAgICAgICAgIC8qIEluaGVyaXQgaGFuZGxlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEVfU1VTUEVOREVELCAgIC8qIENyZWF0aW9uIGZsYWdzICovCi0gICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgLyogRW52aXJvbm1lbnQgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgJnNpLCAmcGkpKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19DUklULCBHZXRMYXN0RXJyb3IoKSwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAiUGFyZW50OiBOb3QgYWJsZSB0byBjcmVhdGUgdGhlIGNoaWxkIHByb2Nlc3MuIik7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFdlIG11c3QgY2xvc2UgdGhlIGhhbmRsZXMgdG8gdGhlIG5ldyBwcm9jZXNzIGFuZCBpdHMgbWFpbiB0aHJlYWQKLSAgICAgICAgICogdG8gcHJldmVudCBoYW5kbGUgYW5kIG1lbW9yeSBsZWFrcy4KLSAgICAgICAgICovIAotICAgICAgICBDbG9zZUhhbmRsZShwaS5oUHJvY2Vzcyk7Ci0gICAgICAgIENsb3NlSGFuZGxlKHBpLmhUaHJlYWQpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBIQU5ETEUga2lsbF9ldmVudDsKLSAgICAgICAgTFBXU0FQUk9UT0NPTF9JTkZPICBscFdTQVByb3RvY29sSW5mbzsKLSAgICAgICAgSEFORExFIGhEdXBlZENvbXBQb3J0OwotCi0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19JTkZPLCBBUFJfU1VDQ0VTUywgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAiUGFyZW50OiBDcmVhdGVkIGNoaWxkIHByb2Nlc3MgJWQiLCBwaS5kd1Byb2Nlc3NJZCk7Ci0KLSAgICAgICAgU2V0RW52aXJvbm1lbnRWYXJpYWJsZSgiQVBfUEFSRU5UX1BJRCIsTlVMTCk7Ci0KLSAgICAgICAgLyogQ3JlYXRlIHRoZSBleGl0X2V2ZW50LCBhcENjaGlsZF9waWQgKi8KLSAgICAgICAgc2Eubkxlbmd0aCA9IHNpemVvZihzYSk7Ci0gICAgICAgIHNhLmJJbmhlcml0SGFuZGxlID0gVFJVRTsKLSAgICAgICAgc2EubHBTZWN1cml0eURlc2NyaXB0b3IgPSBOVUxMOyAgICAgICAgCi0gICAgICAgIGtpbGxfZXZlbnQgPSBDcmVhdGVFdmVudCgmc2EsIFRSVUUsIEZBTFNFLCBhcF9wc3ByaW50ZihwY29uZiwiYXBDJWQiLCBwaS5kd1Byb2Nlc3NJZCkpOwotICAgICAgICBpZiAoIWtpbGxfZXZlbnQpIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19DUklULCBHZXRMYXN0RXJyb3IoKSwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIlBhcmVudDogQ291bGQgbm90IGNyZWF0ZSBleGl0IGV2ZW50IGZvciBjaGlsZCBwcm9jZXNzIik7Ci0gICAgICAgICAgICBDbG9zZUhhbmRsZShwaS5oUHJvY2Vzcyk7Ci0gICAgICAgICAgICBDbG9zZUhhbmRsZShwaS5oVGhyZWFkKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyogQXNzdW1lIHRoZSBjaGlsZCBwcm9jZXNzIGxpdmVzLiBVcGRhdGUgdGhlIHByb2Nlc3MgYW5kIGV2ZW50IHRhYmxlcyAqLwotICAgICAgICBoYW5kbGVzWypwcm9jZXNzZXNdID0gcGkuaFByb2Nlc3M7Ci0gICAgICAgIGV2ZW50c1sqcHJvY2Vzc2VzXSA9IGtpbGxfZXZlbnQ7Ci0gICAgICAgICgqcHJvY2Vzc2VzKSsrOwotCi0gICAgICAgIC8qIFdlIG5ldmVyIHN0b3JlIHRoZSB0aHJlYWQncyBoYW5kbGUsIHNvIGNsb3NlIGl0IG5vdy4gKi8KLSAgICAgICAgUmVzdW1lVGhyZWFkKHBpLmhUaHJlYWQpOwotICAgICAgICBDbG9zZUhhbmRsZShwaS5oVGhyZWFkKTsKLQotICAgICAgICAvKiBSdW4gdGhlIGNoYWluIG9mIG9wZW4gc29ja2V0cy4gRm9yIGVhY2ggc29ja2V0LCBkdXBsaWNhdGUgaXQgCi0gICAgICAgICAqIGZvciB0aGUgdGFyZ2V0IHByb2Nlc3MgdGhlbiBzZW5kIHRoZSBXU0FQUk9UT0NPTF9JTkZPIAotICAgICAgICAgKiAocmV0dXJuZWQgYnkgZHVwIHNvY2tldCkgdG8gdGhlIGNoaWxkICovCi0gICAgICAgIGZvciAobHIgPSBhcF9saXN0ZW5lcnM7IGxyOyBsciA9IGxyLT5uZXh0KSB7Ci0gICAgICAgICAgICBpbnQgbnNkOwotICAgICAgICAgICAgbHBXU0FQcm90b2NvbEluZm8gPSBhcF9wY2FsbG9jKHAsIHNpemVvZihXU0FQUk9UT0NPTF9JTkZPKSk7Ci0gICAgICAgICAgICBhcF9nZXRfb3Nfc29jaygmbnNkLGxyLT5zZCk7Ci0gICAgICAgICAgICAvKiBBc3NvY2lhdGUgdGhlIHNvY2tldCB3aXRoIHRoZSBJT2NvbXBsZXRpb24gcG9ydCAqLwotICAgICAgICAgICAgQ3JlYXRlSW9Db21wbGV0aW9uUG9ydCgoSEFORExFKSBuc2QsIEFjY2VwdEV4Q29tcFBvcnQsIDAsIDApOwotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk8gfCBBUExPR19JTkZPLCBBUFJfU1VDQ0VTUywgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIlBhcmVudDogRHVwbGljYXRpbmcgc29ja2V0ICVkIGFuZCBzZW5kaW5nIGl0IHRvIGNoaWxkIHByb2Nlc3MgJWQiLCBuc2QsIHBpLmR3UHJvY2Vzc0lkKTsKLSAgICAgICAgICAgIGlmIChXU0FEdXBsaWNhdGVTb2NrZXQobnNkLCBwaS5kd1Byb2Nlc3NJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBXU0FQcm90b2NvbEluZm8pID09IFNPQ0tFVF9FUlJPUikgewotICAgICAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19DUklULCBoX2Vycm5vLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhcmVudDogV1NBRHVwbGljYXRlU29ja2V0IGZhaWxlZCBmb3Igc29ja2V0ICVkLiIsIGxyLT5zZCApOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFXcml0ZUZpbGUoaFBpcGVXcml0ZSwgbHBXU0FQcm90b2NvbEluZm8sIChEV09SRCkgc2l6ZW9mKFdTQVBST1RPQ09MX0lORk8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJkJ5dGVzV3JpdHRlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUE9WRVJMQVBQRUQpIE5VTEwpKSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0NSSVQsIEdldExhc3RFcnJvcigpLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhcmVudDogVW5hYmxlIHRvIHdyaXRlIGR1cGxpY2F0ZWQgc29ja2V0ICVkIHRvIHRoZSBjaGlsZC4iLCBsci0+c2QgKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19JTkZPLCBBUFJfU1VDQ0VTUywgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIlBhcmVudDogQnl0ZXNXcml0dGVuID0gJWQgV1NBUHJvdG9jb2xJbmZvID0gJXgyMCIsIEJ5dGVzV3JpdHRlbiwgKmxwV1NBUHJvdG9jb2xJbmZvKTsKLSAgICAgICAgfQotICAgICAgICAvKiBOb3csIHNlbmQgdGhlIEFjY2VwdEV4IGNvbXBsZXRpb24gcG9ydCB0byB0aGUgY2hpbGQgKi8KLSAgICAgICAgRHVwbGljYXRlSGFuZGxlKEdldEN1cnJlbnRQcm9jZXNzKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXB0RXhDb21wUG9ydCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBwaS5oUHJvY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICZoRHVwZWRDb21wUG9ydCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgLy8gaGFuZGxlIGNhbiBiZSBpbmhlcml0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIERVUExJQ0FURV9TQU1FX0FDQ0VTUyk7Ci0gICAgICAgIFdyaXRlRmlsZShoUGlwZVdyaXRlLCAmaER1cGVkQ29tcFBvcnQsIChEV09SRCkgc2l6ZW9mKGhEdXBlZENvbXBQb3J0KSwgJkJ5dGVzV3JpdHRlbiwgKExQT1ZFUkxBUFBFRCkgTlVMTCk7Ci0gICAgICAgIENsb3NlSGFuZGxlKGhEdXBlZENvbXBQb3J0KTsKLSAgICB9Ci0KLSAgICBDbG9zZUhhbmRsZShoUGlwZVJlYWQpOwotICAgIENsb3NlSGFuZGxlKGhQaXBlV3JpdGUpOyAgICAgICAgCi0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtYXN0ZXJfbWFpbihzZXJ2ZXJfcmVjICpzLCBIQU5ETEUgc2h1dGRvd25fZXZlbnQsIEhBTkRMRSByZXN0YXJ0X2V2ZW50KQotewotICAgIGludCByZW1haW5pbmdfY2hpbGRyZW5fdG9fc3RhcnQgPSBhcF9kYWVtb25zX3RvX3N0YXJ0OwotICAgIGludCBpOwotICAgIGludCBydiwgY2xkOwotICAgIGludCBjaGlsZF9udW0gPSAwOwotICAgIGludCByZXN0YXJ0X3BlbmRpbmcgPSAwOwotICAgIGludCBzaHV0ZG93bl9wZW5kaW5nID0gMDsKLSAgICBpbnQgY3VycmVudF9saXZlX3Byb2Nlc3NlcyA9IDA7IC8qIG51bWJlciBvZiBjaGlsZCBwcm9jZXNzIHdlIGtub3cgYWJvdXQgKi8KLQotICAgIEhBTkRMRSBwcm9jZXNzX2hhbmRsZXNbTUFYX1BST0NFU1NFU107Ci0gICAgSEFORExFIHByb2Nlc3Nfa2lsbF9ldmVudHNbTUFYX1BST0NFU1NFU107Ci0KLSAgICBzZXR1cF9saXN0ZW5lcnMocyk7Ci0KLSAgICAvKiBDcmVhdGUgY2hpbGQgcHJvY2VzcyAKLSAgICAgKiBTaG91bGQgb25seSBiZSBvbmUgaW4gdGhpcyB2ZXJzaW9uIG9mIEFwYWNoZSBmb3IgV0lOMzIgCi0gICAgICovCi0gICAgc2VydmljZV9zZXRfc3RhdHVzKFNFUlZJQ0VfU1RBUlRfUEVORElORyk7Ci0gICAgd2hpbGUgKHJlbWFpbmluZ19jaGlsZHJlbl90b19zdGFydC0tKSB7Ci0gICAgICAgIGlmIChjcmVhdGVfcHJvY2VzcyhwY29uZiwgcHJvY2Vzc19oYW5kbGVzLCBwcm9jZXNzX2tpbGxfZXZlbnRzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdXJyZW50X2xpdmVfcHJvY2Vzc2VzKSA8IDApIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19DUklULCBHZXRMYXN0RXJyb3IoKSwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIm1hc3Rlcl9tYWluOiBjcmVhdGUgY2hpbGQgcHJvY2VzcyBmYWlsZWQuIEV4aXRpbmcuIik7Ci0gICAgICAgICAgICBzaHV0ZG93bl9wZW5kaW5nID0gMTsKLSAgICAgICAgICAgIGdvdG8gZGllX25vdzsKLSAgICAgICAgfQotICAgIH0KLSAgICBzZXJ2aWNlX3NldF9zdGF0dXMoU0VSVklDRV9SVU5OSU5HKTsKLQotICAgIHJlc3RhcnRfcGVuZGluZyA9IHNodXRkb3duX3BlbmRpbmcgPSAwOwotICAgIAotICAgIC8qIFdhaXQgZm9yIHNodXRkb3duIG9yIHJlc3RhcnQgZXZlbnRzIG9yIGZvciBjaGlsZCBkZWF0aCAqLwotICAgIHByb2Nlc3NfaGFuZGxlc1tjdXJyZW50X2xpdmVfcHJvY2Vzc2VzXSA9IHNodXRkb3duX2V2ZW50OwotICAgIHByb2Nlc3NfaGFuZGxlc1tjdXJyZW50X2xpdmVfcHJvY2Vzc2VzKzFdID0gcmVzdGFydF9ldmVudDsKLSAgICBwcmludGYoInByb2Nlc3Mvc2h1dGRvd24vcmVzdGFydCAlZCAlZCAlZFxuIiwgcHJvY2Vzc19oYW5kbGVzWzBdLCBwcm9jZXNzX2hhbmRsZXNbMV0sIHByb2Nlc3NfaGFuZGxlc1syXSk7Ci0gICAgcnYgPSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKGN1cnJlbnRfbGl2ZV9wcm9jZXNzZXMrMiwgKEhBTkRMRSAqKXByb2Nlc3NfaGFuZGxlcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBJTkZJTklURSk7Ci0gICAgY2xkID0gcnYgLSBXQUlUX09CSkVDVF8wOwotICAgIGlmIChydiA9PSBXQUlUX0ZBSUxFRCkgewotICAgICAgICAvKiBTb21ldGhpbmcgc2VyaW91cyBpcyB3cm9uZyAqLwotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSyxBUExPR19DUklULCBHZXRMYXN0RXJyb3IoKSwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAibWFzdGVyX21haW46IFdhaXRGb3JNdWx0aXBlT2JqZWN0cyBXQUlUX0ZBSUxFRCAtLSBkb2luZyBzZXJ2ZXIgc2h1dGRvd24iKTsKLSAgICAgICAgc2h1dGRvd25fcGVuZGluZyA9IDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKHJ2ID09IFdBSVRfVElNRU9VVCkgewotICAgICAgICAvKiBIZXksIHRoaXMgY2Fubm90IGhhcHBlbiAqLwotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBHZXRMYXN0RXJyb3IoKSwgcywKLSAgICAgICAgICAgICAgICAgICAgICJtYXN0ZXJfbWFpbjogV2FpdEZvck11bHRpcGVPYmplY3RzIHdpdGggSU5GSU5JVEUgd2FpdCBleGl0ZWQgd2l0aCBXQUlUX1RJTUVPVVQiKTsKLSAgICAgICAgc2h1dGRvd25fcGVuZGluZyA9IDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNsZCA9PSBjdXJyZW50X2xpdmVfcHJvY2Vzc2VzKSB7Ci0gICAgICAgIC8qIHNodXRkb3duX2V2ZW50IHNpZ25hbGxlZCAqLwotICAgICAgICBzaHV0ZG93bl9wZW5kaW5nID0gMTsKLSAgICAgICAgcHJpbnRmKCJzaHV0ZG93biBldmVudCBzaWduYWxlZFxuIik7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0lORk8sIEFQUl9TVUNDRVNTLCBzLCAKLSAgICAgICAgICAgICAgICAgICAgICJtYXN0ZXJfbWFpbjogU2h1dGRvd24gZXZlbnQgc2lnbmFsZWQgLS0gZG9pbmcgc2VydmVyIHNodXRkb3duLiIpOwotICAgICAgICBpZiAoUmVzZXRFdmVudChzaHV0ZG93bl9ldmVudCkgPT0gMCkgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgR2V0TGFzdEVycm9yKCksIHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIlJlc2V0RXZlbnQoc2h1dGRvd25fZXZlbnQpIik7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICBlbHNlIGlmIChjbGQgPT0gY3VycmVudF9saXZlX3Byb2Nlc3NlcysxKSB7Ci0gICAgICAgIC8qIHJlc3RhcnRfZXZlbnQgc2lnbmFsbGVkICovCi0gICAgICAgIGludCBjaGlsZHJlbl90b19raWxsID0gY3VycmVudF9saXZlX3Byb2Nlc3NlczsKLSAgICAgICAgcmVzdGFydF9wZW5kaW5nID0gMTsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTywgQVBSX1NVQ0NFU1MsIHMsIAotICAgICAgICAgICAgICAgICAgICAgIm1hc3Rlcl9tYWluOiBSZXN0YXJ0IGV2ZW50IHNpZ25hbGVkLiBEb2luZyBhIGdyYWNlZnVsIHJlc3RhcnQuIik7Ci0gICAgICAgIGlmIChSZXNldEV2ZW50KHJlc3RhcnRfZXZlbnQpID09IDApIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIEdldExhc3RFcnJvcigpLCBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICJtYXN0ZXJfbWFpbjogUmVzZXRFdmVudChyZXN0YXJ0X2V2ZW50KSBmYWlsZWQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgLyogU2lnbmFsIGVhY2ggY2hpbGQgcHJvY2VzcyB0byBkaWUgCi0gICAgICAgICAqIFdlIGFyZSBtYWtpbmcgYSBiaWcgYXNzdW1wdGlvbiBoZXJlIHRoYXQgdGhlIGNoaWxkIHByb2Nlc3MsIG9uY2Ugc2lnbmFsZWQsCi0gICAgICAgICAqIHdpbGwgUkVBTExZIGdvIGF3YXkuIFNpbmNlIHRoaXMgaXMgYSByZXN0YXJ0LCB3ZSBkbyBub3Qgd2FudCB0byBob2xkIHRoZSAKLSAgICAgICAgICogbmV3IGNoaWxkIHByb2Nlc3MgdXAgd2FpdGluZyBmb3IgdGhlIG9sZCBjaGlsZCB0byBkaWUuIFJlbW92ZSB0aGUgb2xkIAotICAgICAgICAgKiBjaGlsZCBvdXQgb2YgdGhlIHByb2Nlc3NfaGFuZGxlcyBhcF90YWJsZV90IGFuZCBob3BlIGZvciB0aGUgYmVzdC4uLgotICAgICAgICAgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGNoaWxkcmVuX3RvX2tpbGw7IGkrKykgewotICAgICAgICAgICAgcHJpbnRmKCJTZXRFdmVudCBoYW5kbGUgPSAlZFxuIiwgcHJvY2Vzc19raWxsX2V2ZW50c1tpXSk7Ci0gICAgICAgICAgICBpZiAoU2V0RXZlbnQocHJvY2Vzc19raWxsX2V2ZW50c1tpXSkgPT0gMCkKLSAgICAgICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBHZXRMYXN0RXJyb3IoKSwgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hc3Rlcl9tYWluOiBTZXRFdmVudCBmb3IgY2hpbGQgcHJvY2VzcyBpbiBzbG90ICMlZCBmYWlsZWQiLCBpKTsKLSAgICAgICAgICAgIGNsZWFudXBfcHJvY2Vzcyhwcm9jZXNzX2hhbmRsZXMsIHByb2Nlc3Nfa2lsbF9ldmVudHMsIGksICZjdXJyZW50X2xpdmVfcHJvY2Vzc2VzKTsKLSAgICAgICAgfQotICAgIH0gCi0gICAgZWxzZSB7Ci0gICAgICAgIC8qIEEgY2hpbGQgcHJvY2VzcyBtdXN0IGhhdmUgZXhpdGVkIGJlY2F1c2Ugb2YgYSBmYXRhbCBlcnJvciBjb25kaXRpb24gKHNlZyBmYXVsdCwgZXRjLikuIAotICAgICAgICAgKiBSZW1vdmUgdGhlIGRlYWQgcHJvY2VzcyAKLSAgICAgICAgICogZnJvbSB0aGUgcHJvY2Vzc19oYW5kbGVzIGFuZCBwcm9jZXNzX2tpbGxfZXZlbnRzIGFwX3RhYmxlX3QgYW5kIGNyZWF0ZSBhIG5ldwotICAgICAgICAgKiBjaGlsZCBwcm9jZXNzLgotICAgICAgICAgKiBUT0RPOiBDb25zaWRlciByZXN0YXJ0aW5nIHRoZSBjaGlsZCBpbW1lZGlhdGVseSB3aXRob3V0IGxvb3BpbmcgdGhyb3VnaCBodHRwX21haW4KLSAgICAgICAgICogYW5kIHdpdGhvdXQgcmVyZWFkaW5nIHRoZSBjb25maWd1cmF0aW9uLiBXaWxsIG5lZWQgdGhpcyBpZiB3ZSBldmVyIHN1cHBvcnQgbXVsdGlwbGUgCi0gICAgICAgICAqIGNoaWxkcmVuLiBPbmUgb3B0aW9uLCBjcmVhdGUgYSBwYXJlbnQgdGhyZWFkIHdoaWNoIHdhaXRzIG9uIGNoaWxkIGRlYXRoIGFuZCByZXN0YXJ0cyBpdC4KLSAgICAgICAgICovCi0gICAgICAgIHJlc3RhcnRfcGVuZGluZyA9IDE7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0lORk8sIEFQUl9TVUNDRVNTLCBzZXJ2ZXJfY29uZiwgCi0gICAgICAgICAgICAgICAgICAgICAibWFzdGVyX21haW46IENoaWxkIHByb2Nlc3MgZmFpbGVkLiBSZXN0YXJ0aW5nIHRoZSBjaGlsZCBwcm9jZXNzLiIpOwotICAgICAgICBhcF9hc3NlcnQoY2xkIDwgY3VycmVudF9saXZlX3Byb2Nlc3Nlcyk7Ci0gICAgICAgIGNsZWFudXBfcHJvY2Vzcyhwcm9jZXNzX2hhbmRsZXMsIHByb2Nlc3Nfa2lsbF9ldmVudHMsIGNsZCwgJmN1cnJlbnRfbGl2ZV9wcm9jZXNzZXMpOwotICAgICAgICAvKiBBUEQyKCJtYWluX3Byb2Nlc3M6IGNoaWxkIGluIHNsb3QgJWQgZGllZCIsIHJ2KTsgKi8KLSAgICAgICAgLyogcmVzdGFydF9jaGlsZChwcm9jZXNzX2hhbmNsZXMsIHByb2Nlc3Nfa2lsbF9ldmVudHMsIGNsZCwgJmN1cnJlbnRfbGl2ZV9wcm9jZXNzZXMpOyAqLwotCi0gICAgICAgIC8qIERyYWluIHRoZSBBY2NlcHRFeCBjb21wbGV0aW9uIHBvcnQgb2YgYW55IG91dHN0YW5kaW5nIEkvTyBwZW5kaW5nIGZvciB0aGUgZGVhZCAKLSAgICAgICAgICogcHJvY2Vzcy4gKi8KLSAgICAgICAgZHJhaW5fYWNjZXB0ZXhfY29tcGxwb3J0KEFjY2VwdEV4Q29tcFBvcnQsIEZBTFNFKTsKLSAgICB9Ci0KLWRpZV9ub3c6Ci0gICAgaWYgKHNodXRkb3duX3BlbmRpbmcpIHsKLSAgICAgICAgaW50IHRtc3RhcnQgPSB0aW1lKE5VTEwpOwotICAgICAgICAvKiBTaWduYWwgZWFjaCBjaGlsZCBwcm9jZXNzZXMgdG8gZGllICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdXJyZW50X2xpdmVfcHJvY2Vzc2VzOyBpKyspIHsKLSAgICAgICAgICAgIHByaW50ZigiU2V0RXZlbnQgaGFuZGxlID0gJWRcbiIsIHByb2Nlc3Nfa2lsbF9ldmVudHNbaV0pOwotICAgICAgICAgICAgaWYgKFNldEV2ZW50KHByb2Nlc3Nfa2lsbF9ldmVudHNbaV0pID09IDApCi0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfRVJSLCBHZXRMYXN0RXJyb3IoKSwgc2VydmVyX2NvbmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXN0ZXJfbWFpbjogU2V0RXZlbnQgZm9yIGNoaWxkIHByb2Nlc3MgaW4gc2xvdCAjJWQgZmFpbGVkIiwgaSk7Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAoY3VycmVudF9saXZlX3Byb2Nlc3NlcyAmJiAoKHRtc3RhcnQrNjApID4gdGltZShOVUxMKSkpIHsKLSAgICAgICAgICAgIHJ2ID0gV2FpdEZvck11bHRpcGxlT2JqZWN0cyhjdXJyZW50X2xpdmVfcHJvY2Vzc2VzLCAoSEFORExFICopcHJvY2Vzc19oYW5kbGVzLCBGQUxTRSwgMjAwMCk7Ci0gICAgICAgICAgICBpZiAocnYgPT0gV0FJVF9USU1FT1VUKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgYXBfYXNzZXJ0KHJ2ICE9IFdBSVRfRkFJTEVEKTsKLSAgICAgICAgICAgIGNsZCA9IHJ2IC0gV0FJVF9PQkpFQ1RfMDsKLSAgICAgICAgICAgIGFwX2Fzc2VydChydiA8IGN1cnJlbnRfbGl2ZV9wcm9jZXNzZXMpOwotICAgICAgICAgICAgY2xlYW51cF9wcm9jZXNzKHByb2Nlc3NfaGFuZGxlcywgcHJvY2Vzc19raWxsX2V2ZW50cywgY2xkLCAmY3VycmVudF9saXZlX3Byb2Nlc3Nlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGN1cnJlbnRfbGl2ZV9wcm9jZXNzZXM7IGkrKykgewotICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfRVJSfEFQTE9HX05PRVJSTk8sIEFQUl9TVUNDRVNTLCBzZXJ2ZXJfY29uZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yY2luZyB0ZXJtaW5hdGlvbiBvZiBjaGlsZCAjJWQgKGhhbmRsZSAlZCkiLCBpLCBwcm9jZXNzX2hhbmRsZXNbaV0pOwotICAgICAgICAgICAgVGVybWluYXRlUHJvY2VzcygoSEFORExFKSBwcm9jZXNzX2hhbmRsZXNbaV0sIDEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoMCk7IC8qIFRlbGwgdGhlIGNhbGxlciB3ZSBhcmUgc2h1dHRpbmcgZG93biAqLwotICAgIH0KLQotICAgIHJldHVybiAoMSk7IC8qIFRlbGwgdGhlIGNhbGxlciB3ZSB3YW50IGEgcmVzdGFydCAqLwotfQotCi0vKiAKLSAqIHdpbm50X3ByZV9jb25maWcoKSBob29rCi0gKi8KLXN0YXRpYyB2b2lkIHdpbm50X3ByZV9jb25maWcoYXBfY29udGV4dF90ICpwY29uZiwgYXBfY29udGV4dF90ICpwbG9nLCBhcF9jb250ZXh0X3QgKnB0ZW1wKSAKLXsKLSAgICBjaGFyICpwaWQ7Ci0KLSAgICBvbmVfcHJvY2VzcyA9ICEhZ2V0ZW52KCJPTkVfUFJPQ0VTUyIpOwotCi0gICAgb3N2ZXIuZHdPU1ZlcnNpb25JbmZvU2l6ZSA9IHNpemVvZihPU1ZFUlNJT05JTkZPKTsKLSAgICBHZXRWZXJzaW9uRXgoJm9zdmVyKTsKLQotICAgIC8qIEFQX1BBUkVOVF9QSUQgaXMgb25seSB2YWxpZCBpbiB0aGUgY2hpbGQgKi8KLSAgICBwaWQgPSBnZXRlbnYoIkFQX1BBUkVOVF9QSUQiKTsKLSAgICBpZiAocGlkKSB7Ci0gICAgICAgIC8qIFRoaXMgaXMgdGhlIGNoaWxkICovCi0gICAgICAgIHBhcmVudF9waWQgPSBhdG9pKHBpZCk7Ci0gICAgICAgIG15X3BpZCA9IGdldHBpZCgpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogVGhpcyBpcyB0aGUgcGFyZW50ICovCi0gICAgICAgIHBhcmVudF9waWQgPSBteV9waWQgPSBnZXRwaWQoKTsKLQotICAgIH0KLQotICAgIGFwX2xpc3Rlbl9wcmVfY29uZmlnKCk7Ci0gICAgYXBfZGFlbW9uc190b19zdGFydCA9IERFRkFVTFRfTlVNX0RBRU1PTjsKLSAgICBhcF90aHJlYWRzX3Blcl9jaGlsZCA9IERFRkFVTFRfU1RBUlRfVEhSRUFEOwotICAgIGFwX3BpZF9mbmFtZSA9IERFRkFVTFRfUElETE9HOwotICAgIG1heF9yZXF1ZXN0c19wZXJfY2hpbGQgPSBERUZBVUxUX01BWF9SRVFVRVNUU19QRVJfQ0hJTEQ7Ci0KLSAgICBhcF9jcHlzdHJuKGFwX2NvcmVkdW1wX2RpciwgYXBfc2VydmVyX3Jvb3QsIHNpemVvZihhcF9jb3JlZHVtcF9kaXIpKTsKLQotfQotCi1zdGF0aWMgdm9pZCB3aW5udF9wb3N0X2NvbmZpZyhhcF9jb250ZXh0X3QgKnBjb25mLCBhcF9jb250ZXh0X3QgKnBsb2csIGFwX2NvbnRleHRfdCAqcHRlbXAsIHNlcnZlcl9yZWMqIHNlcnZlcl9jb25mKQotewotICAgIHNlcnZlcl9jb25mID0gc2VydmVyX2NvbmY7Ci19Ci0KLUFQSV9FWFBPUlQoaW50KSBhcF9tcG1fcnVuKGFwX2NvbnRleHRfdCAqX3Bjb25mLCBhcF9jb250ZXh0X3QgKnBsb2csIHNlcnZlcl9yZWMgKnMgKQotewotCi0gICAgY2hhciogZXhpdF9ldmVudF9uYW1lOwotICAgIHN0YXRpYyBpbnQgcmVzdGFydCA9IDA7ICAgICAgICAgICAgIC8qIERlZmF1bHQgaXMgdG8gbm90IHJlc3RhcnQgKi8KLS8vICAgIHRpbWVfdCB0bXN0YXJ0OwotICAgIHN0YXRpYyBIQU5ETEUgc2h1dGRvd25fZXZlbnQ7CS8qIHVzZWQgdG8gc2lnbmFsIHNodXRkb3duIHRvIHBhcmVudCAqLwotICAgIHN0YXRpYyBIQU5ETEUgcmVzdGFydF9ldmVudDsJLyogdXNlZCB0byBzaWduYWwgYSByZXN0YXJ0IHRvIHBhcmVudCAqLwotCi0gICAgcGNvbmYgPSBfcGNvbmY7Ci0gICAgc2VydmVyX2NvbmYgPSBzOwotCi0gICAgaWYgKChwYXJlbnRfcGlkICE9IG15X3BpZCkgfHwgb25lX3Byb2Nlc3MpIHsKLSAgICAgICAgLyogQ2hpbGQgcHJvY2VzcyAqLwotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfSU5GTywgQVBSX1NVQ0NFU1MsIHNlcnZlcl9jb25mLAotICAgICAgICAgICAgICAgICAgICAgIkNoaWxkICVkOiBDaGlsZCBwcm9jZXNzIGlzIHJ1bm5pbmciLCBteV9waWQpOyAgICAgICAgCi0gICAgICAgIEFNQ1NvY2tldEluaXRpYWxpemUoKTsKLSAgICAgICAgZXhpdF9ldmVudF9uYW1lID0gYXBfcHNwcmludGYocGNvbmYsICJhcEMlZCIsIG15X3BpZCk7Ci0gICAgICAgIHNldHVwX3NpZ25hbF9uYW1lcyhhcF9wc3ByaW50ZihwY29uZiwiYXAlZCIsIHBhcmVudF9waWQpKTsKLSAgICAgICAgaWYgKG9uZV9wcm9jZXNzKSB7Ci0gICAgICAgICAgICBhcF9jcmVhdGVfbG9jaygmc3RhcnRfbXV0ZXgsQVBSX01VVEVYLCBBUFJfQ1JPU1NfUFJPQ0VTUyxzaWduYWxfbmFtZV9wcmVmaXgscGNvbmYpOwotICAgICAgICAgICAgZXhpdF9ldmVudCA9IENyZWF0ZUV2ZW50KE5VTEwsIFRSVUUsIEZBTFNFLCBleGl0X2V2ZW50X25hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYXBfY2hpbGRfaW5pdF9sb2NrKCZzdGFydF9tdXRleCwgc2lnbmFsX25hbWVfcHJlZml4LCBwY29uZik7Ci0gICAgICAgICAgICBleGl0X2V2ZW50ID0gb3Blbl9ldmVudChleGl0X2V2ZW50X25hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGFwX2Fzc2VydChzdGFydF9tdXRleCk7Ci0gICAgICAgIGFwX2Fzc2VydChleGl0X2V2ZW50KTsKLQotICAgICAgICBjaGlsZF9tYWluKCk7Ci0KLSAgICAgICAgZGVzdHJveV9ldmVudChleGl0X2V2ZW50KTsKLSAgICAgICAgQU1DU29ja2V0Q2xlYW51cCgpOwotICAgICAgICByZXN0YXJ0ID0gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIFBhcmVudCBwcm9jZXNzICovCi0gICAgICAgIFBTRUNVUklUWV9BVFRSSUJVVEVTIHNhID0gR2V0TnVsbEFDTCgpOyAgLyogcmV0dXJucyBOVUxMIGlmIGludmFsaWQgKFdpbjk1PykgKi8KLQotICAgICAgICBhcF9jbGVhcl9wb29sKHBsb2cpOwotICAgICAgICBhcF9vcGVuX2xvZ3Moc2VydmVyX2NvbmYsIHBsb2cpOwotICAgICAgICBzZXR1cF9zaWduYWxfbmFtZXMoYXBfcHNwcmludGYocGNvbmYsImFwJWQiLCBwYXJlbnRfcGlkKSk7Ci0gICAgICAgIGlmICghcmVzdGFydCkgewotICAgICAgICAgICAgYXBfbG9nX3BpZChwY29uZiwgYXBfcGlkX2ZuYW1lKTsKLQotICAgICAgICAgICAgc2VydmljZV9zZXRfc3RhdHVzKFNFUlZJQ0VfU1RBUlRfUEVORElORyk7Ci0gICAgICAgICAgICBBTUNTb2NrZXRJbml0aWFsaXplKCk7Ci0vLyAgICAgICAgICAgIHNldHVwX3NpZ25hbF9uYW1lcyhhcF9wc3ByaW50ZihwY29uZiwiYXAlZCIsIHBhcmVudF9waWQpKTsKLSAgICAgICAgCi0gICAgICAgICAgICAvKiBDcmVhdGUgc2h1dGRvd24gZXZlbnQsIGFwUElEX3NodXRkb3duLCB3aGVyZSBQSUQgaXMgdGhlIHBhcmVudCAKLSAgICAgICAgICAgICAqIEFwYWNoZSBwcm9jZXNzIElELiBTaHV0ZG93biBpcyBzaWduYWxlZCBieSAnYXBhY2hlIC1rIHNodXRkb3duJy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgc2h1dGRvd25fZXZlbnQgPSBDcmVhdGVFdmVudChzYSwgRkFMU0UsIEZBTFNFLCBzaWduYWxfc2h1dGRvd25fbmFtZSk7Ci0gICAgICAgICAgICBpZiAoIXNodXRkb3duX2V2ZW50KSB7Ci0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VNRVJHLCBHZXRMYXN0RXJyb3IoKSwgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hc3Rlcl9tYWluOiBDYW5ub3QgY3JlYXRlIHNodXRkb3duIGV2ZW50ICVzIiwgc2lnbmFsX3NodXRkb3duX25hbWUpOwotICAgICAgICAgICAgICAgIENsZWFuTnVsbEFDTCgodm9pZCAqKXNhKTsKLSAgICAgICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBDcmVhdGUgcmVzdGFydCBldmVudCwgYXBQSURfcmVzdGFydCwgd2hlcmUgUElEIGlzIHRoZSBwYXJlbnQgCi0gICAgICAgICAgICAgKiBBcGFjaGUgcHJvY2VzcyBJRC4gUmVzdGFydCBpcyBzaWduYWxlZCBieSAnYXBhY2hlIC1rIHJlc3RhcnQnLgotICAgICAgICAgICAgICovCi0vLyAgICAgICAgICAgIHJlc3RhcnRfZXZlbnQgPSBDcmVhdGVFdmVudChzYSwgVFJVRSwgRkFMU0UsIHNpZ25hbF9yZXN0YXJ0X25hbWUpOwotICAgICAgICAgICAgcmVzdGFydF9ldmVudCA9IENyZWF0ZUV2ZW50KHNhLCBGQUxTRSwgRkFMU0UsIHNpZ25hbF9yZXN0YXJ0X25hbWUpOwotICAgICAgICAgICAgaWYgKCFyZXN0YXJ0X2V2ZW50KSB7Ci0gICAgICAgICAgICAgICAgQ2xvc2VIYW5kbGUoc2h1dGRvd25fZXZlbnQpOwotICAgICAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FTUVSRywgR2V0TGFzdEVycm9yKCksIHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcF9ydW5fbXBtOiBDYW5ub3QgY3JlYXRlIHJlc3RhcnQgZXZlbnQgJXMiLCBzaWduYWxfcmVzdGFydF9uYW1lKTsKLSAgICAgICAgICAgICAgICBDbGVhbk51bGxBQ0woKHZvaWQgKilzYSk7Ci0gICAgICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENsZWFuTnVsbEFDTCgodm9pZCAqKXNhKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogQ3JlYXRlIHRoZSBzdGFydCBtdXRleCwgYXBQSUQsIHdoZXJlIFBJRCBpcyB0aGUgcGFyZW50IEFwYWNoZSBwcm9jZXNzIElELgotICAgICAgICAgICAgICogVGhzIHN0YXJ0IG11dGV4IGlzIHVzZWQgZHVyaW5nIGEgcmVzdGFydCB0byBwcmV2ZW50IG1vcmUgdGhhbiBvbmUgCi0gICAgICAgICAgICAgKiBjaGlsZCBwcm9jZXNzIGZyb20gZW50ZXJpbmcgdGhlIGFjY2VwdCBsb29wIGF0IG9uY2UuCi0gICAgICAgICAgICAgKi8KLS8vICAgICAgICAgICAgYXBfY3JlYXRlX2xvY2soJnN0YXJ0X211dGV4LEFQUl9NVVRFWCwgQVBSX0NST1NTX1BST0NFU1Msc2lnbmFsX25hbWVfcHJlZml4LHBjb25mKTsKLSAgICAgICAgICAgIGFwX2NyZWF0ZV9sb2NrKCZzdGFydF9tdXRleCxBUFJfTVVURVgsIEFQUl9DUk9TU19QUk9DRVNTLHNpZ25hbF9uYW1lX3ByZWZpeCxzLT5wcm9jZXNzLT5wb29sKTsKLSAgICAgICAgICAgIC8qIFRPRE86IEFkZCBzb21lIGNvZGUgdG8gZGV0ZWN0IGZhaWx1cmUgKi8KLSAgICAgICAgfQotCi0gICAgICAgIC8qIEdvIHRvIHdvcmsuLi4gKi8KLSAgICAgICAgcmVzdGFydCA9IG1hc3Rlcl9tYWluKHNlcnZlcl9jb25mLCBzaHV0ZG93bl9ldmVudCwgcmVzdGFydF9ldmVudCk7Ci0KLSAgICAgICAgaWYgKCFyZXN0YXJ0KSB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpwaWRmaWxlID0gTlVMTDsKLSAgICAgICAgICAgIC8qIFNodXR0aW5nIGRvd24uIENsZWFuIHVwLi4uICovCi0gICAgICAgICAgICBwaWRmaWxlID0gYXBfc2VydmVyX3Jvb3RfcmVsYXRpdmUgKHBjb25mLCBhcF9waWRfZm5hbWUpOwotICAgICAgICAgICAgaWYgKCBwaWRmaWxlICE9IE5VTEwgJiYgdW5saW5rKHBpZGZpbGUpID09IDApCi0gICAgICAgICAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfSU5GTyxBUFJfU1VDQ0VTUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2NvbmYsICJyZW1vdmVkIFBJRCBmaWxlICVzIChwaWQ9JWxkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZGZpbGUsIChsb25nKWdldHBpZCgpKTsKLSAgICAgICAgICAgIGFwX2Rlc3Ryb3lfbG9jayhzdGFydF9tdXRleCk7Ci0KLSAgICAgICAgICAgIENsb3NlSGFuZGxlKHJlc3RhcnRfZXZlbnQpOwotICAgICAgICAgICAgQ2xvc2VIYW5kbGUoc2h1dGRvd25fZXZlbnQpOwotICAgICAgICAgICAgQU1DU29ja2V0Q2xlYW51cCgpOwotCi0gICAgICAgICAgICBzZXJ2aWNlX3NldF9zdGF0dXMoU0VSVklDRV9TVE9QUEVEKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gIXJlc3RhcnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHdpbm50X2hvb2tzKHZvaWQpCi17Ci0vLyAgICBJTklUX1NJR0xJU1QoKQotICAgIG9uZV9wcm9jZXNzID0gMDsKLSAgICAvKiBDb25maWd1cmF0aW9uIGhvb2tzIGltcGxlbWVudGVkIGJ5IGh0dHBfY29uZmlnLmMgLi4uICovCi0gICAgYXBfaG9va19wcmVfY29uZmlnKHdpbm50X3ByZV9jb25maWcsIE5VTEwsIE5VTEwsIEhPT0tfTUlERExFKTsKLX0KLQotLyogCi0gKiBDb21tYW5kIHByb2Nlc3NvcnMgCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfcGlkZmlsZShjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKGNtZC0+c2VydmVyLT5pc192aXJ0dWFsKSB7Ci0JcmV0dXJuICJQaWRGaWxlIGRpcmVjdGl2ZSBub3QgYWxsb3dlZCBpbiA8VmlydHVhbEhvc3Q+IjsKLSAgICB9Ci0gICAgYXBfcGlkX2ZuYW1lID0gYXJnOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqc2V0X3RocmVhZHNfcGVyX2NoaWxkIChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykgCi17Ci0gICAgY29uc3QgY2hhciAqZXJyID0gYXBfY2hlY2tfY21kX2NvbnRleHQoY21kLCBHTE9CQUxfT05MWSk7Ci0gICAgaWYgKGVyciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgYXBfdGhyZWFkc19wZXJfY2hpbGQgPSBhdG9pKGFyZyk7Ci0gICAgaWYgKGFwX3RocmVhZHNfcGVyX2NoaWxkID4gSEFSRF9USFJFQURfTElNSVQpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICJXQVJOSU5HOiBUaHJlYWRzUGVyQ2hpbGQgb2YgJWQgZXhjZWVkcyBjb21waWxlIHRpbWUiCi0gICAgICAgICAgICAgICAgICAgICAiIGxpbWl0IG9mICVkIHRocmVhZHMsIiwgYXBfdGhyZWFkc19wZXJfY2hpbGQsIAotICAgICAgICAgICAgICAgICAgICAgSEFSRF9USFJFQURfTElNSVQpOwotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAiIGxvd2VyaW5nIFRocmVhZHNQZXJDaGlsZCB0byAlZC4gVG8gaW5jcmVhc2UsIHBsZWFzZSIKLSAgICAgICAgICAgICAgICAgICAgICIgc2VlIHRoZSAgSEFSRF9USFJFQURfTElNSVQgZGVmaW5lIGluIHNyYy9pbmNsdWRlL2h0dHBkLmguIiwgCi0gICAgICAgICAgICAgICAgICAgICBIQVJEX1RIUkVBRF9MSU1JVCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGFwX3RocmVhZHNfcGVyX2NoaWxkIDwgMSkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiV0FSTklORzogUmVxdWlyZSBUaHJlYWRzUGVyQ2hpbGQgPiAwLCBzZXR0aW5nIHRvIDEiKTsKLQlhcF90aHJlYWRzX3Blcl9jaGlsZCA9IDE7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfbWF4X3JlcXVlc3RzKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtYXhfcmVxdWVzdHNfcGVyX2NoaWxkID0gYXRvaShhcmcpOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzZXRfY29yZWR1bXBkaXIgKGNtZF9wYXJtcyAqY21kLCB2b2lkICpkdW1teSwgY2hhciAqYXJnKSAKLXsKLSAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsKLSAgICBjb25zdCBjaGFyICpmbmFtZTsKLSAgICBjb25zdCBjaGFyICplcnIgPSBhcF9jaGVja19jbWRfY29udGV4dChjbWQsIEdMT0JBTF9PTkxZKTsKLSAgICBpZiAoZXJyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBmbmFtZSA9IGFwX3NlcnZlcl9yb290X3JlbGF0aXZlKGNtZC0+cG9vbCwgYXJnKTsKLSAgICBpZiAoKHN0YXQoZm5hbWUsICZmaW5mbykgPT0gLTEpIHx8ICFTX0lTRElSKGZpbmZvLnN0X21vZGUpKSB7Ci0JcmV0dXJuIGFwX3BzdHJjYXQoY21kLT5wb29sLCAiQ29yZUR1bXBEaXJlY3RvcnkgIiwgZm5hbWUsIAotCQkJICAiIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIGRpcmVjdG9yeSIsIE5VTEwpOwotICAgIH0KLSAgICBhcF9jcHlzdHJuKGFwX2NvcmVkdW1wX2RpciwgZm5hbWUsIHNpemVvZihhcF9jb3JlZHVtcF9kaXIpKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogU3R1YiBmdW5jdGlvbnMgdW50aWwgdGhpcyBNUE0gc3VwcG9ydHMgdGhlIGNvbm5lY3Rpb24gc3RhdHVzIEFQSSAqLwotCi1BUElfRVhQT1JUKHZvaWQpIGFwX3VwZGF0ZV9jb25uZWN0aW9uX3N0YXR1cyhsb25nIGNvbm5faWQsIGNvbnN0IGNoYXIgKmtleSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUpCi17Ci0gICAgLyogTk9QICovCi19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfcmVzZXRfY29ubmVjdGlvbl9zdGF0dXMobG9uZyBjb25uX2lkKQotewotICAgIC8qIE5PUCAqLwotfQotCi1zdGF0aWMgY29uc3QgY29tbWFuZF9yZWMgd2lubnRfY21kc1tdID0gewotTElTVEVOX0NPTU1BTkRTCi17ICJQaWRGaWxlIiwgc2V0X3BpZGZpbGUsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICAgIkEgZmlsZSBmb3IgbG9nZ2luZyB0aGUgc2VydmVyIHByb2Nlc3MgSUQifSwKLXsgIlRocmVhZHNQZXJDaGlsZCIsIHNldF90aHJlYWRzX3Blcl9jaGlsZCwgTlVMTCwgUlNSQ19DT05GLCBUQUtFMSwKLSAgIk51bWJlciBvZiB0aHJlYWRzIGVhY2ggY2hpbGQgY3JlYXRlcyIgfSwKLXsgIk1heFJlcXVlc3RzUGVyQ2hpbGQiLCBzZXRfbWF4X3JlcXVlc3RzLCBOVUxMLCBSU1JDX0NPTkYsIFRBS0UxLAotICAiTWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgYSBwYXJ0aWN1bGFyIGNoaWxkIHNlcnZlcyBiZWZvcmUgZHlpbmcuIiB9LAoteyAiQ29yZUR1bXBEaXJlY3RvcnkiLCBzZXRfY29yZWR1bXBkaXIsIE5VTEwsIFJTUkNfQ09ORiwgVEFLRTEsCi0gICJUaGUgbG9jYXRpb24gb2YgdGhlIGRpcmVjdG9yeSBBcGFjaGUgY2hhbmdlcyB0byBiZWZvcmUgZHVtcGluZyBjb3JlIiB9LAoteyBOVUxMIH0KLX07Ci0KLW1vZHVsZSBNT0RVTEVfVkFSX0VYUE9SVCBtcG1fd2lubnRfbW9kdWxlID0gewotICAgIFNUQU5EQVJEMjBfTU9EVUxFX1NUVUZGLAotICAgIE5VTEwsCQkJLyogY3JlYXRlIHBlci1kaXJlY3RvcnkgY29uZmlnIHN0cnVjdHVyZSAqLwotICAgIE5VTEwsCQkJLyogbWVyZ2UgcGVyLWRpcmVjdG9yeSBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIE5VTEwsCQkJLyogY3JlYXRlIHBlci1zZXJ2ZXIgY29uZmlnIHN0cnVjdHVyZSAqLwotICAgIE5VTEwsCQkJLyogbWVyZ2UgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIHdpbm50X2NtZHMsCQkgICAgICAgIC8qIGNvbW1hbmQgYXBfdGFibGVfdCAqLwotICAgIE5VTEwsCQkJLyogaGFuZGxlcnMgKi8KLSAgICB3aW5udF9ob29rcyAJCS8qIHJlZ2lzdGVyX2hvb2tzICovCi19OwpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS93aW5udC9tcG1fd2lubnQuaCBiL3NlcnZlci9tcG0vd2lubnQvbXBtX3dpbm50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZDlkMTQuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS93aW5udC9tcG1fd2lubnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIAotICogYXJlIG1ldDogCi0gKiAKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAgCi0gKiAKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIAotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSAKLSAqICAgIGRpc3RyaWJ1dGlvbi4gCi0gKiAKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyAKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAgCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIiAKLSAqIAotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0byAKLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCAKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLiAKLSAqIAotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIgCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4gCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuIAotICogCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nIAotICogICAgYWNrbm93bGVkZ21lbnQ6IAotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cCAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iIAotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkgCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIAotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIAotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IgCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSAKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgCi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gKiAKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55IAotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkIAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yIAotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLiAKLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4gCi0gKiAKLSAqLyAKLQotI2lmbmRlZiBBUEFDSEVfTVBNX1dJTk5UX0gKLSNkZWZpbmUgQVBBQ0hFX01QTV9XSU5OVF9ICi0KLWV4dGVybiBpbnQgYXBfdGhyZWFkc19wZXJfY2hpbGQ7Ci1leHRlcm4gaW50IGFwX21heF9yZXF1ZXN0c19wZXJfY2hpbGQ7Ci1leHRlcm4gaW50IGFwX2V4dGVuZGVkX3N0YXR1czsKLWV4dGVybiB2b2lkIGNsZWFuX2NoaWxkX2V4aXQoaW50KTsKLQotCi10eXBlZGVmIHN0cnVjdCBDb21wQ29udGV4dCB7Ci0gICAgT1ZFUkxBUFBFRCBPdmVybGFwcGVkOwotICAgIFNPQ0tFVCBhY2NlcHRfc29ja2V0OwotICAgIGFwX3NvY2tldF90ICpzb2NrOwotICAgIGFwX2xpc3Rlbl9yZWMgKmxyOwotICAgIEJVRkYgKmNvbm5faW87Ci0gICAgY2hhciAqcmVjdl9idWY7Ci0gICAgaW50ICByZWN2X2J1Zl9zaXplOwotICAgIGFwX2NvbnRleHRfdCAqcHRyYW5zOwotICAgIHN0cnVjdCBzb2NrYWRkciAqc2Ffc2VydmVyOwotICAgIGludCBzYV9zZXJ2ZXJfbGVuOwotICAgIHN0cnVjdCBzb2NrYWRkciAqc2FfY2xpZW50OwotICAgIGludCBzYV9jbGllbnRfbGVuOwotfSBDT01QX0NPTlRFWFQsICpQQ09NUF9DT05URVhUOwotI2VuZGlmIC8qIEFQQUNIRV9NUE1fV0lOTlRfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmVyL21wbS93aW5udC9yZWdpc3RyeS5jIGIvc2VydmVyL21wbS93aW5udC9yZWdpc3RyeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDlmOTY0Li4wMDAwMDAwCi0tLSBhL3NlcnZlci9tcG0vd2lubnQvcmVnaXN0cnkuYworKysgL2Rldi9udWxsCkBAIC0xLDU1NCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBGdW5jdGlvbnMgdG8gaGFuZGxlIGludGVyYWN0aW5nIHdpdGggdGhlIFdpbjMyIHJlZ2lzdHJ5Ci0gKi8KLQotLyoKLSAqIEFwYWNoZSByZWdpc3RyeSBrZXkgc3RydWN0dXJlCi0gKgotICogQXBhY2hlJ3MgcmVnaXN0cnkgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHRoZSBIS0VZX0xPQ0FMX01BQ0hJTkUKLSAqIGtleSwgdW5kZXIKLSAqCi0gKiAgSEtMTVxTT0ZUV0FSRVxBcGFjaGUgR3JvdXBcQXBhY2hlXHZlcnNpb24KLSAqCi0gKiBUaGVzZSBrZXlzIGFyZSBkZWZpbmVkIGluIHRoaXMgZmlsZS4gVGhlIGRlZmluaXRpb24gb2YgdGhlICJ2ZXJzaW9uIiBwYXJ0Ci0gKiB3aWxsIG5lZWQgdXBkYXRpbmcgZWFjaCB0aW1lIEFwYWNoZSBtb3ZlcyBmcm9tIGJldGEgdG8gbm9uLWJldGEgb3IgZnJvbSBhCi0gKiByZWxlYXNlIHRvIGEgZGV2ZWxvcG1lbnQgb3IgYmV0YSB2ZXJzaW9uLgotICovCi0KLS8qIFRvIGFsbG93IGZvciBtdWx0aXBsZSBzZXJ2aWNlcywgc3RvcmUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSdzIGZ1bGwgcGF0aAotICogdW5kZXIgZWFjaCBzZXJ2aWNlIGVudHJ5OgotICoKLSAqIEhLTE1cU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XFNlcnZpY2VzXFtzZXJ2aWNlIG5hbWVdXFBhcmFtZXRlcnNcQ29uZlBhdGgKLSAqCi0gKiBUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBhdGggKGZvciBjb25zb2xlIGFwYWNoZSkgaXMgc3RpbGwgc3RvcmVkOgotICogCi0gKiBIS0xNXFNvZnR3YXJlXFtWZW5kb3JdXFtTb2Z0d2FyZV1cW1ZlcnNpb25dXFNlcnZlclJvb3QKLSAqLwotI2luY2x1ZGUgIm9zLmgiCi0vLyNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0vLyNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotCi0vKiBEZWZpbmUgd2hlcmUgdGhlIEFwYWNoZSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgcmVnaXN0cnkuIEluIGdlbmVyYWwKLSAqIFZFUlNJT04gd2lsbCBiZSB0aGUgc2FtZSBhY3Jvc3MgYWxsIGJldGEgcmVsZWFzZXMgZm9yIGEgcGFydGljdWxhcgotICogbWFqb3IgcmVsZWFzZSwgYnV0IHdpbGwgY2hhbmdlIHdoZW4gdGhlIGZpbmFsIHJlbGVhc2UgaXMgbWFkZS4KLSAqLwotCi0jZGVmaW5lIFZFTkRPUiAgICJBcGFjaGUgR3JvdXAiCi0jZGVmaW5lIFNPRlRXQVJFICJBcGFjaGUiCi0jZGVmaW5lIFZFUlNJT04gICIyLjAiCi0KLSNkZWZpbmUgUkVHS0VZICJTT0ZUV0FSRVxcIiBWRU5ET1IgIlxcIiBTT0ZUV0FSRSAiXFwiIFZFUlNJT04KLQotI2RlZmluZSBTRVJWSUNFS0VZUFJFICAiU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcU2VydmljZXNcXCIKLSNkZWZpbmUgU0VSVklDRUtFWVBPU1QgIlxcUGFyYW1ldGVycyIKLQotLyoKLSAqIFRoZSBXaW5kb3dzIEFQSSByZWdpc3RyeSBrZXkgZnVuY3Rpb25zIGRvbid0IHNldCB0aGUgbGFzdCBlcnJvcgotICogdmFsdWUgKHRoZSB3aW5kb3dzIGVxdWl2YWxlbnQgb2YgZXJybm8pLiBTbyB3ZSBuZWVkIHRvIHNldCBpdAotICogd2l0aCBTZXRMYXN0RXJyb3IoKSBiZWZvcmUgY2FsbGluZyB0aGUgYXBsb2dfZXJyb3IoKSBmdW5jdGlvbi4KLSAqIEJlY2F1c2UgdGhpcyBpcyBjb21tb24sIGxldCdzIGhhdmUgYSBtYWNyby4KLSAqLwotI2RlZmluZSBkb19lcnJvcihydixmbXQsYXJnKSBkbyB7IFwKLSAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIHJ2LCBOVUxMLCBmbXQsIGFyZyk7IFwKLSAgICB9IHdoaWxlICgwKTsKLQotLyoKLSAqIEdldCB0aGUgZGF0YSBmb3IgcmVnaXN0cnkga2V5IHZhbHVlLiBUaGlzIGlzIGEgZ2VuZXJpYyBmdW5jdGlvbiB0aGF0Ci0gKiBjYW4gZWl0aGVyIGdldCBhIHZhbHVlIGludG8gYSBjYWxsZXItc3VwcGxpZWQgYnVmZmVyLCBvciBpdCBjYW4KLSAqIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgdmFsdWUgZnJvbSB0aGUgcGFzcyBpbiBwb29sLiBJdCB3aWxsIG5vcm1hbGx5Ci0gKiBiZSB1c2VkIGJ5IG90aGVyIGZ1bmN0aW9ucyB3aXRoaW4gdGhpcyBmaWxlIHRvIGdldCBzcGVjaWZpYyBrZXkgdmFsdWVzCi0gKiAoZS5nLiByZWdpc3RyeV9nZXRfc2VydmVyX3Jvb3QoKSkuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG51bWJlciBvZgotICogZGlmZmVyZW50IGVycm9yIHN0YXR1c2VzLCBhbGxvd2luZyB0aGUgY2FsbGVyIHRvIGRpZmZlcmVudGlhdGUKLSAqIGJldHdlZW4gYSBrZXkgb3IgdmFsdWUgbm90IGV4aXN0aW5nIGFuZCBvdGhlciBraW5kcyBvZiBlcnJvcnMuIERlcGVuZGluZwotICogb24gdGhlIHR5cGUgb2YgZGF0YSBiZWluZyBvYnRhaW5lZCB0aGUgY2FsbGVyIGNhbiB0aGVuIGVpdGhlciBpZ25vcmUKLSAqIHRoZSBrZXktbm90LWV4aXN0aW5nIGVycm9yLCBvciB0cmVhdCBpdCBhcyBhIHJlYWwgZXJyb3IuCi0gKgotICogSWYgcHBWYWx1ZSBpcyBOVUxMLCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHZhbHVlIGFuZCByZXR1cm4gaXQgaW4KLSAqICpwVmFsdWUuIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgdmFsdWUuCi0gKiBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGFwX2NvbnRleHRfdCB0byB1c2UgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSB2YWx1ZS4KLSAqCi0gKiBJZiBwVmFsdWUgaXMgbm90IE5VTEwsIGFzc3VtZSBpdCBpcyBhIGJ1ZmZlciBvZiBuU2l6ZVZhbHVlIGJ5dGVzLAotICogYW5kIHdyaXRlIHRoZSB2YWx1ZSBpbnRvIHRoZSBidWZmZXIuIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlcgotICogb2YgYnl0ZXMgaW4gdGhlIHZhbHVlIChzbyBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbgotICogdGhlIHN1cHBsaWVkIG5TaXplVmFsdWUsIHRoZSBjYWxsZXIga25vd3MgdGhhdCAqcFZhbHVlIGlzIHRydW5jYXRlZCkuCi0gKiBUaGUgYXBfY29udGV4dF90IGFyZ3VtZW50IGlzIGlnbm9yZWQuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBzdWNjZXNzZnVsbHkgcmV0cmVpdmVkCi0gKiBrZXkgaWYgZXZlcnl0aGluZyB3b3JrZWQsIG9yOgotICoKLSAqICAtMSB0aGUga2V5IGRvZXMgbm90IGV4aXN0cwotICogIC0yIGlmIG91dCBvZiBtZW1vcnkgZHVyaW5nIHRoZSBmdW5jdGlvbgotICogIC0zIGlmIHRoZSBidWZmZXIgc3BlY2lmaWVkIGJ5ICpwVmFsdWUvblNpemVWYWx1ZSB3YXMgbm90IGxhcmdlIGVub3VnaCAKLSAqICAgICBmb3IgdGhlIHZhbHVlLgotICogIC00IGlmIGFuIGVycm9yIG9jY3VycmVkCi0gKgotICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBuZWdhdGl2ZSBhIG1lc3NhZ2Ugd2lsbCBiZSBsb2dnZWQgdG8gdGhlIGVycm9yCi0gKiBsb2cgKGFwbG9nX2Vycm9yKSBmdW5jdGlvbi4gSWYgdGhlIHJldHVybiB2YWx1ZSBpcyAtMiwgLTMgb3IgLTQgdGhlIG1lc3NhZ2UKLSAqIHdpbGwgYmUgbG9nZ2VkIGF0IHByaW9yaXR5ICJlcnJvciIsIHdoaWxlIGlmIHRoZSByZXR1cm4gdmFsdWUgaXMgLTEgdGhlCi0gKiBtZXNzYWdlIHdpbGwgYmUgbG9nZ2VkIGF0IHByaW9yaXR5ICJ3YXJuaW5nIi4KLSAqLwotCi1zdGF0aWMgaW50IGFwX3JlZ2lzdHJ5X2dldF9rZXlfaW50KGFwX2NvbnRleHRfdCAqcCwgY2hhciAqa2V5LCBjaGFyICpuYW1lLCBjaGFyICpwQnVmZmVyLCBpbnQgblNpemVCdWZmZXIsIGNoYXIgKipwcFZhbHVlKQotewotICAgIGxvbmcgcnY7Ci0gICAgSEtFWSBoS2V5OwotICAgIGNoYXIgKnBWYWx1ZTsKLSAgICBpbnQgblNpemU7Ci0gICAgaW50IHJldHZhbDsKLQotICAgIHJ2ID0gUmVnT3BlbktleUV4KEhLRVlfTE9DQUxfTUFDSElORSwKLSAgICAgICAgICAgICAgICAgICAgICBrZXksCi0JCSAgICAgIDAsCi0JCSAgICAgIEtFWV9SRUFELAotCQkgICAgICAmaEtleSk7Ci0KLSAgICBpZiAocnYgPT0gRVJST1JfRklMRV9OT1RfRk9VTkQpIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfV0FSTklOR3xBUExPR19OT0VSUk5PLHJ2LE5VTEwsCi0gICAgICAgICJSZWdpc3RyeSBkb2VzIG5vdCBjb250YWluIGtleSAlcyIsa2V5KTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAocnYgIT0gRVJST1JfU1VDQ0VTUykgewotICAgICAgICBkb19lcnJvcihydiwgIlJlZ09wZW5LZXlFeCBIS0xNXFwlcyIsa2V5KTsKLSAgICAgICAgcmV0dXJuIC00OwotICAgIH0KLQotICAgIGlmIChwQnVmZmVyID09IE5VTEwpIHsKLQkvKiBGaW5kIHRoZSBzaXplIHJlcXVpcmVkIGZvciB0aGUgZGF0YSBieSBwYXNzaW5nIE5VTEwgYXMgdGhlIGJ1ZmZlcgotCSAqIHBvaW50ZXIuIE9uIHJldHVybiBuU2l6ZSB3aWxsIGNvbnRhaW4gdGhlIHNpemUgcmVxdWlyZWQgZm9yIHRoZQotCSAqIGJ1ZmZlciBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIEVSUk9SX1NVQ0NFU1MuCi0JICovCi0JcnYgPSBSZWdRdWVyeVZhbHVlRXgoaEtleSwgCi0JCQkgICAgIG5hbWUsCQkvKiBrZXkgbmFtZSAqLwotCQkJICAgICBOVUxMLAkJLyogcmVzZXJ2ZWQgKi8KLQkJCSAgICAgTlVMTCwJCS8qIHR5cGUgKi8KLQkJCSAgICAgTlVMTCwJCS8qIGZvciB2YWx1ZSAqLwotCQkJICAgICAmblNpemUpOwkJLyogZm9yIHNpemUgb2YgInZhbHVlIiAqLwotCi0JaWYgKHJ2ICE9IEVSUk9SX1NVQ0NFU1MpIHsKLQkgICAgZG9fZXJyb3IocnYsICJSZWdRdWVyeVZhbHVlRXgoa2V5ICVzKSIsIGtleSk7Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0KLQlwVmFsdWUgPSBhcF9wYWxsb2MocCwgblNpemUpOwotCSpwcFZhbHVlID0gcFZhbHVlOwotCWlmICghcFZhbHVlKSB7Ci0JICAgIC8qIEVlaywgb3V0IG9mIG1lbW9yeSwgcHJvYmFibHkgbm90IHdvcnRoIHRyeWluZyB0byBjYXJyeSBvbiwKLQkgICAgICogYnV0IGxldCdzIGdpdmUgaXQgYSBnbwotCSAgICAgKi8KLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfRVJSfEFQTE9HX05PRVJSTk8sQVBSX0VOT01FTSxOVUxMLAotCQkiRXJyb3IgZ2V0dGluZyByZWdpc3RyeSBrZXk6IG91dCBvZiBtZW1vcnkiKTsKLQkgICAgcmV0dXJuIC0yOwotCX0KLSAgICB9Ci0gICAgZWxzZSB7Ci0JLyogR2V0IHRoZSB2YWx1ZSBpbnRvIHRoZSBleGlzdGluZyBidWZmZXIgb2YgbGVuZ3RoIG5TaXplQnVmZmVyICovCi0JcFZhbHVlID0gcEJ1ZmZlcjsKLQluU2l6ZSA9IG5TaXplQnVmZmVyOwotICAgIH0KLQotICAgIHJ2ID0gUmVnUXVlcnlWYWx1ZUV4KGhLZXksIAotCQkJIG5hbWUsCQkvKiBrZXkgbmFtZSAqLwotCQkJIE5VTEwsCQkvKiByZXNlcnZlZCAqLwotCQkJIE5VTEwsCQkvKiB0eXBlICovCi0JCQkgcFZhbHVlLAkJLyogZm9yIHZhbHVlICovCi0JCQkgJm5TaXplKTsJCS8qIGZvciBzaXplIG9mICJ2YWx1ZSIgKi8KLQotICAgIHJldHZhbCA9IDA7CSAgICAvKiBSZXR1cm4gdmFsdWUgKi8KLQotICAgIGlmIChydiA9PSBFUlJPUl9GSUxFX05PVF9GT1VORCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLEFQTE9HX1dBUk5JTkd8QVBMT0dfTk9FUlJOTyxydixOVUxMLAotICAgICAgICAiUmVnaXN0cnkgZG9lcyBub3QgY29udGFpbiB2YWx1ZSAlc1xcJXMiLCBrZXksIG5hbWUpOwotCXJldHZhbCA9IC0xOwotICAgIH0KLSAgICBlbHNlIGlmIChydiA9PSBFUlJPUl9NT1JFX0RBVEEpIHsKLQkvKiBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB3ZSBnb3QgcGFzc2VkIGEgcHJlLWV4aXN0aW5nIGJ1ZmZlcgotCSAqIChwQnVmZmVyLCBuU2l6ZUJ1ZmZlcikuIEJ1dCBJIHN1cHBvc2UgaXQgY291bGQgYWxzbyBoYXBwZW4gaWYgd2UKLQkgKiBhbGxvY2F0ZSBhIGJ1ZmZlciBpZiBhbm90aGVyIHByb2Nlc3MgY2hhbmdlZCB0aGUgbGVuZ3RoIG9mIHRoZQotCSAqIHZhbHVlIHNpbmNlIHdlIGZvdW5kIG91dCBpdHMgbGVuZ3RoIGFib3ZlLiBVbW0uCi0JICovCi0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfRVJSfEFQTE9HX05PRVJSTk8scnYsTlVMTCwKLQkgICAgIkVycm9yIGdldHRpbmcgcmVnaXN0cnkgdmFsdWUgJXM6IGJ1ZmZlciBub3QgYmlnIGVub3VnaCIsIGtleSk7Ci0JcmV0dmFsID0gLTM7Ci0gICAgfQotICAgIGVsc2UgaWYgKHJ2ICE9IEVSUk9SX1NVQ0NFU1MpIHsKLQlkb19lcnJvcihydiwgIlJlZ1F1ZXJ5VmFsdWVFeChrZXkgJXMpIiwga2V5KTsKLQlyZXR2YWwgPSAtNDsKLSAgICB9Ci0KLSAgICBydiA9IFJlZ0Nsb3NlS2V5KGhLZXkpOwotICAgIGlmIChydiAhPSBFUlJPUl9TVUNDRVNTKSB7Ci0gICAgICAgIGRvX2Vycm9yKHJ2LCAiUmVnQ2xvc2VLZXkgSEtMTVxcJXMiLCBrZXkpOwotICAgICAgICBpZiAocmV0dmFsID09IDApIHsKLSAgICAgICAgICAgIC8qIEtlZXAgZXJyb3Igc3RhdHVzIGZyb20gUmVnUXVlcnlWYWx1ZUV4LCBpZiBhbnkgKi8KLSAgICAgICAgICAgIHJldHZhbCA9IC00OyAgCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dmFsIDwgMCA/IHJldHZhbCA6IG5TaXplOwotfQotCi0vKgotICogR2V0IHRoZSBzZXJ2ZXIgcm9vdCBmcm9tIHRoZSByZWdpc3RyeSBpbnRvICdkaXInIHdoaWNoIGlzCi0gKiBzaXplIGJ5dGVzIGxvbmcuIFJldHVybnMgMCBpZiB0aGUgc2VydmVyIHJvb3Qgd2FzIGZvdW5kCi0gKiBvciBpZiB0aGUgc2VydmVycm9vdCBrZXkgZG9lcyBub3QgZXhpc3QgKGluIHdoaWNoIGNhc2UKLSAqIGRpciB3aWxsIGNvbnRhaW4gYW4gZW1wdHkgc3RyaW5nKSwgb3IgLTEgaWYgdGhlcmUgd2FzCi0gKiBhbiBlcnJvciBnZXR0aW5nIHRoZSBrZXkuCi0gKi8KLSNpZiAwCi1pbnQgYXBfcmVnaXN0cnlfZ2V0X3NlcnZlcl9yb290KGFwX2NvbnRleHRfdCAqcCwgY2hhciAqZGlyLCBpbnQgc2l6ZSkKLXsKLSAgICBpbnQgcnY7Ci0KLSAgICBydiA9IGFwX3JlZ2lzdHJ5X2dldF9rZXlfaW50KHAsIFJFR0tFWSwgIlNlcnZlclJvb3QiLCBkaXIsIHNpemUsIE5VTEwpOwotICAgIGlmIChydiA8IDApIHsKLQlkaXJbMF0gPSAnXDAnOwotICAgIH0KLQotICAgIHJldHVybiAocnYgPCAtMSkgPyAtMSA6IDA7Ci19Ci0jZWxzZQotaW50IGFwX3JlZ2lzdHJ5X2dldF9zZXJ2ZXJfcm9vdChhcF9jb250ZXh0X3QgKnAsIGNoYXIgKipidWYpCi17Ci0gICAgaW50IHJ2OwotCi0gICAgcnYgPSBhcF9yZWdpc3RyeV9nZXRfa2V5X2ludChwLCBSRUdLRVksICJTZXJ2ZXJSb290IiwgTlVMTCwgMCwgYnVmKTsKLSAgICBpZiAocnYgPCAwKSB7Ci0gICAgICAgICpidWYgPSBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiAocnYgPCAtMSkgPyAtMSA6IDA7Ci19Ci0jZW5kaWYKLWNoYXIgKmFwX2dldF9zZXJ2aWNlX2tleShjaGFyICpzZXJ2aWNlX25hbWUpCi17Ci0gICAgY2hhciAqa2V5ID0gbWFsbG9jKHN0cmxlbihTRVJWSUNFS0VZUFJFKSArCi0gICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihzZXJ2aWNlX25hbWUpICsKLSAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKFNFUlZJQ0VLRVlQT1NUKSArIDEpOwotCi0gICAgc3ByaW50ZihrZXksIiVzJXMlcyIsIFNFUlZJQ0VLRVlQUkUsIHNlcnZpY2VfbmFtZSwgU0VSVklDRUtFWVBPU1QpOwotCi0gICAgcmV0dXJuKGtleSk7Ci19Ci0jaWYgMAotaW50IGFwX3JlZ2lzdHJ5X2dldF9zZXJ2aWNlX2NvbmYoYXBfY29udGV4dF90ICpwLCBjaGFyICpkaXIsIGludCBzaXplLCBjaGFyICpzZXJ2aWNlX25hbWUpCi17Ci0gICAgaW50IHJ2OwotICAgIGNoYXIgKmtleSA9IGFwX2dldF9zZXJ2aWNlX2tleShzZXJ2aWNlX25hbWUpOwotCi0gICAgcnYgPSBhcF9yZWdpc3RyeV9nZXRfa2V5X2ludChwLCBrZXksICJDb25mUGF0aCIsIGRpciwgc2l6ZSwgTlVMTCk7Ci0gICAgaWYgKHJ2IDwgMCkgewotICAgIGRpclswXSA9ICdcMCc7Ci0gICAgfQotCi0gICAgZnJlZShrZXkpOwotICAgIHJldHVybiAocnYgPCAtMSkgPyAtMSA6IDA7Ci19Ci0jZWxzZQotaW50IGFwX3JlZ2lzdHJ5X2dldF9zZXJ2aWNlX2NvbmYoYXBfY29udGV4dF90ICpwLCBjaGFyICoqYnVmLCBjaGFyICpzZXJ2aWNlX25hbWUpCi17Ci0gICAgaW50IHJ2OwotICAgIGNoYXIgKmtleSA9IGFwX2dldF9zZXJ2aWNlX2tleShzZXJ2aWNlX25hbWUpOwotCi0gICAgcnYgPSBhcF9yZWdpc3RyeV9nZXRfa2V5X2ludChwLCBrZXksICJDb25mUGF0aCIsIE5VTEwsIDAsIGJ1Zik7Ci0gICAgaWYgKHJ2IDwgMCkgewotICAgICAgICAqYnVmID0gTlVMTDsKLSAgICB9Ci0KLSAgICBmcmVlKGtleSk7Ci0gICAgcmV0dXJuIChydiA8IC0xKSA/IC0xIDogMDsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVGhlIHJlc3Qgb2YgdGhpcyBmaWxlIGRlYWxzIHdpdGggc3RvcmluZyBrZXlzIG9yIHZhbHVlcyBpbiB0aGUgcmVnaXN0cnkKLSAqLwotCi1jaGFyICphcF9yZWdpc3RyeV9wYXJzZV9rZXkoaW50IGluZGV4LCBjaGFyICprZXkpCi17Ci0gICAgY2hhciAqaGVhZCA9IGtleSwgKnNrZXk7Ci0gICAgaW50IGk7Ci0gICAgCi0gICAgaWYoIWtleSkKLSAgICAgICAgcmV0dXJuKE5VTEwpOwotCi0gICAgZm9yKGkgPSAwOyBpIDw9IGluZGV4OyBpKyspCi0gICAgewotICAgICAgICBpZihrZXkgJiYga2V5WzBdID09ICdcXCcpCi0gICAgICAgICAgICBrZXkrKzsKLSAgICAgICAgaWYgKCFrZXkpCi0gICAgICAgICAgICByZXR1cm4oTlVMTCk7Ci0gICAgICAgIGhlYWQgPSBrZXk7Ci0gICAgICAgIGtleSA9IHN0cmNocihoZWFkLCAnXFwnKTsKLSAgICB9Ci0KLSAgICBpZigha2V5KQotICAgICAgICByZXR1cm4oc3RyZHVwKGhlYWQpKTsKLSAgICAqa2V5ID0gJ1wwJzsKLSAgICBza2V5ID0gc3RyZHVwKGhlYWQpOwotICAgICprZXkgPSAnXFwnOwotICAgIHJldHVybihza2V5KTsKLX0KLQotLyoKLSAqIGFwX3JlZ2lzdHJ5X2NyZWF0ZV9hcGFjaGVfa2V5KCkgY3JlYXRlcyB0aGUgQXBhY2hlIHJlZ2lzdHJ5IGtleQotICogKEhMS01cU09GVFdBUkVcQXBhY2hlIEdyb3VwXEFwYWNoZVx2ZXJzaW9uLCBhcyBkZWZpbmVkIGF0IHRoZSBzdGFydAotICogb2YgdGhpcyBmaWxlKSwgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gSXQgd2lsbCBiZSBjYWxsZWQgYnkKLSAqIGFwX3JlZ2lzdHJ5X3N0b3JlX2tleV9pbnQoKSBpZiBpdCBjYW5ub3Qgb3BlbiB0aGlzIGtleS4gVGhpcyAKLSAqIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBieSBhcF9yZWdpc3RyeV9zdG9yZV9rZXlfaW50KCkgaWYKLSAqIHRoZSBBcGFjaGUga2V5IGRvZXMgbm90IGV4aXN0IHdoZW4gaXQgY29tZXMgdG8gc3RvcmUgYSBkYXRhIGl0ZW0uCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLTEgb24gZXJyb3IuIElmIC0xIGlzIHJldHVybmVkLCB0aGUgZXJyb3Igd2lsbAotICogYWxyZWFkeSBoYXZlIGJlZW4gbG9nZ2VkLgotICovCi0KLXN0YXRpYyBpbnQgYXBfcmVnaXN0cnlfY3JlYXRlX2tleShjaGFyICpsb25na2V5KQotewotICAgIGludCBpbmRleDsKLSAgICBIS0VZIGhLZXk7Ci0gICAgSEtFWSBoS2V5TmV4dDsKLSAgICBpbnQgcmV0dmFsOwotICAgIGludCBydjsKLSAgICBjaGFyICprZXk7Ci0KLSAgICBoS2V5ID0gSEtFWV9MT0NBTF9NQUNISU5FOwotICAgIGluZGV4ID0gMDsKLSAgICByZXR2YWwgPSAwOwotCi0gICAgLyogV2FsayB0aGUgdHJlZSwgY3JlYXRpbmcgYXQgZWFjaCBzdGFnZSBpZiBuZWNlc3NhcnkgKi8KLSAgICB3aGlsZSAoa2V5PWFwX3JlZ2lzdHJ5X3BhcnNlX2tleShpbmRleCxsb25na2V5KSkgewotCWludCByZXN1bHQ7Ci0KLQlydiA9IFJlZ0NyZWF0ZUtleUV4KGhLZXksCi0JCQkgICAga2V5LCAgICAgICAgIC8qIHN1YmtleSAqLwotCQkJICAgIDAsCSAgICAgICAgIC8qIHJlc2VydmVkICovCi0JCQkgICAgTlVMTCwgICAgICAgIC8qIGNsYXNzICovCi0JCQkgICAgUkVHX09QVElPTl9OT05fVk9MQVRJTEUsCi0JCQkgICAgS0VZX1dSSVRFLAotCQkJICAgIE5VTEwsCi0JCQkgICAgJmhLZXlOZXh0LAotCQkJICAgICZyZXN1bHQpOwotCWlmIChydiAhPSBFUlJPUl9TVUNDRVNTKSB7Ci0JICAgIGRvX2Vycm9yKHJ2LCAiUmVnQ3JlYXRlS2V5RXgoJXMpIiwgbG9uZ2tleSk7Ci0JICAgIHJldHZhbCA9IC00OwotCX0KLQotCS8qIENsb3NlIHRoZSBvbGQga2V5ICovCi0JcnYgPSBSZWdDbG9zZUtleShoS2V5KTsKLQlpZiAocnYgIT0gRVJST1JfU1VDQ0VTUykgewotCSAgICBkb19lcnJvcihydiwgIlJlZ0Nsb3NlS2V5IiwgTlVMTCk7Ci0JICAgIGlmIChyZXR2YWwgPT0gMCkgewotCQkvKiBLZWVwIGVycm9yIHN0YXR1cyBmcm9tIFJlZ0NyZWF0ZUtleUV4LCBpZiBhbnkgKi8KLQkJcmV0dmFsID0gLTQ7ICAKLQkgICAgfQotCX0KLQotCWlmIChyZXR2YWwpIHsKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgZnJlZShrZXkpOwotCWhLZXkgPSBoS2V5TmV4dDsKLQlpbmRleCsrOwotICAgIH0KLQotICAgIGlmICgha2V5KSB7Ci0JLyogQ2xvc2UgdGhlIGZpbmFsIGtleSB3ZSBvcGVuZWQsIGlmIHdlIHdhbGtlZCB0aGUgZW50aXJlCi0JICogdHJlZQotCSAqLwotCXJ2ID0gUmVnQ2xvc2VLZXkoaEtleSk7Ci0JaWYgKHJ2ICE9IEVSUk9SX1NVQ0NFU1MpIHsKLQkgICAgZG9fZXJyb3IocnYsICJSZWdDbG9zZUtleSIsIE5VTEwpOwotCSAgICBpZiAocmV0dmFsID09IDApIHsKLQkJLyogS2VlcCBlcnJvciBzdGF0dXMgZnJvbSBSZWdDcmVhdGVLZXlFeCwgaWYgYW55ICovCi0JCXJldHZhbCA9IC00OyAgCi0JICAgIH0KLQl9Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgZnJlZShrZXkpOwotCi0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoKLSAqIGFwX3JlZ2lzdHJ5X3N0b3JlX2tleV9pbnQoKSBzdG9yZXMgYSB2YWx1ZSBuYW1lIGFuZCB2YWx1ZSB1bmRlciB0aGUKLSAqIEFwYWNoZSByZWdpc3RyeSBrZXkuIElmIHRoZSBBcGFjaGUga2V5IGRvZXMgbm90IGV4aXN0IGl0IGlzIGNyZWF0ZWQKLSAqIGZpcnN0LiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBmcm9tIGEgd3JhcHBlciBmdW5jdGlvbgotICogaW4gdGhpcyBmaWxlIHRvIHNldCBwYXJ0aWN1bGFyIGRhdGEgdmFsdWVzLCBzdWNoIGFzIAotICogYXBfcmVnaXN0cnlfc2V0X3NlcnZlcl9yb290KCkgYmVsb3cuCi0gKgotICogUmV0dXJucyAwIGlmIHRoZSB2YWx1ZSBuYW1lIGFuZCBkYXRhIHdhcyBzdG9yZWQgc3VjY2Vzc2Z1bGx5LCBvcgotICogcmV0dXJucyAtMSBpZiB0aGUgQXBhY2hlIGtleSBkb2VzIG5vdCBleGlzdCAoc2luY2Ugd2UgdHJ5IHRvIGNyZWF0ZSAKLSAqIHRoaXMga2V5LCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4pLCBvciAtNCBpZiBhbnkgb3RoZXIgZXJyb3Igb2NjdXJyZWQKLSAqICh0aGVzZSB2YWx1ZXMgYXJlIGNvbnNpc3RlbnQgd2l0aCBhcF9yZWdpc3RyeV9nZXRfa2V5X2ludCgpKS4KLSAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgbmVnYXRpdmUgdGhlbiB0aGUgZXJyb3Igd2lsbCBhbHJlYWR5IGhhdmUgYmVlbgotICogbG9nZ2VkIHZpYSBhcGxvZ19lcnJvcigpLgotICovCi0KLXN0YXRpYyBpbnQgYXBfcmVnaXN0cnlfc3RvcmVfa2V5X2ludChjaGFyICprZXksIGNoYXIgKm5hbWUsIERXT1JEIHR5cGUsIHZvaWQgKnZhbHVlLCBpbnQgdmFsdWVfc2l6ZSkKLXsKLSAgICBsb25nIHJ2OwotICAgIEhLRVkgaEtleTsKLSAgICBpbnQgcmV0dmFsOwotCi0gICAgcnYgPSBSZWdPcGVuS2V5RXgoSEtFWV9MT0NBTF9NQUNISU5FLAotCQkgICAgICBrZXksCi0JCSAgICAgIDAsCi0JIAkgICAgICBLRVlfV1JJVEUsCi0JCSAgICAgICZoS2V5KTsKLQotICAgIGlmIChydiA9PSBFUlJPUl9GSUxFX05PVF9GT1VORCkgewotCS8qIEtleSBjb3VsZCBub3QgYmUgb3BlbmVkIC0tIHRyeSB0byBjcmVhdGUgaXQgCi0JICovCi0gICAgICAgIGlmIChhcF9yZWdpc3RyeV9jcmVhdGVfa2V5KGtleSkgPCAwKSB7Ci0JICAgIC8qIENyZWF0aW9uIGZhaWxlZCAoZXJyb3IgYWxyZWFkeSByZXBvcnRlZCkgKi8KLQkgICAgcmV0dXJuIC00OwotCX0KLQkKLQkvKiBOb3cgaXQgaGFzIGJlZW4gY3JlYXRlZCB3ZSBzaG91bGQgYmUgYWJsZSB0byBvcGVuIGl0Ci0JICovCi0JcnYgPSBSZWdPcGVuS2V5RXgoSEtFWV9MT0NBTF9NQUNISU5FLAotCQkgIGtleSwKLQkJICAwLAotCSAJICBLRVlfV1JJVEUsCi0JCSAgJmhLZXkpOwotCi0JaWYgKHJ2ID09IEVSUk9SX0ZJTEVfTk9UX0ZPVU5EKSB7Ci0gICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSyxBUExPR19XQVJOSU5HfEFQTE9HX05PRVJSTk8scnYsTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnaXN0cnkgZG9lcyBub3QgY29udGFpbiBrZXkgJXMgYWZ0ZXIgY3JlYXRpb24iLGtleSk7Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotCi0gICAgaWYgKHJ2ICE9IEVSUk9SX1NVQ0NFU1MpIHsKLSAgICAgICAgZG9fZXJyb3IocnYsICJSZWdPcGVuS2V5RXggSEtMTVxcJXMiLCBrZXkpOwotICAgICAgICByZXR1cm4gLTQ7Ci0gICAgfQotCi0gICAgLyogTm93IHNldCB0aGUgdmFsdWUgYW5kIGRhdGEgKi8KLSAgICBydiA9IFJlZ1NldFZhbHVlRXgoaEtleSwgCi0gICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCS8qIHZhbHVlIGtleSBuYW1lICovCi0JCSAgICAgICAwLAkvKiByZXNlcnZlZCAqLwotCQkgICAgICAgdHlwZSwJLyogdHlwZSAqLwotCQkgICAgICAgdmFsdWUsCS8qIHZhbHVlIGRhdGEgKi8KLQkJICAgICAgIChEV09SRCl2YWx1ZV9zaXplKTsgLyogZm9yIHNpemUgb2YgInZhbHVlIiAqLwotCi0gICAgcmV0dmFsID0gMDsJICAgIC8qIFJldHVybiB2YWx1ZSAqLwotCi0gICAgaWYgKHJ2ICE9IEVSUk9SX1NVQ0NFU1MpIHsKLQlkb19lcnJvcihydiwgIlJlZ1F1ZXJ5VmFsdWVFeChrZXkgJXMpIiwga2V5KTsKLQlyZXR2YWwgPSAtNDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssQVBMT0dfSU5GT3xBUExPR19OT0VSUk5PLHJ2LE5VTEwsCi0JICAgICJSZWdpc3RyeSBzdG9yZWQgSEtMTVxcIiBSRUdLRVkgIlxcJXMgdmFsdWUgJXMiLCBrZXksIAotCSAgICB0eXBlID09IFJFR19TWiA/IHZhbHVlIDogIihub3QgZGlzcGxheWFibGUpIik7Ci0gICAgfQotCi0gICAgLyogTWFrZSBzdXJlIHdlIGNsb3NlIHRoZSBrZXkgZXZlbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igc3RvcmluZwotICAgICAqIHRoZSBkYXRhCi0gICAgICovCi0gICAgcnYgPSBSZWdDbG9zZUtleShoS2V5KTsKLSAgICBpZiAocnYgIT0gRVJST1JfU1VDQ0VTUykgewotICAgICAgICBkb19lcnJvcihydiwgIlJlZ0Nsb3NlS2V5IEhLTE1cXCVzIiwga2V5KTsKLSAgICAgICAgaWYgKHJldHZhbCA9PSAwKSB7Ci0gICAgICAgICAgICAvKiBLZWVwIGVycm9yIHN0YXR1cyBmcm9tIFJlZ1F1ZXJ5VmFsdWVFeCwgaWYgYW55ICovCi0gICAgICAgICAgICByZXR2YWwgPSAtNDsgIAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyoKLSAqIFNldHMgdGhlIHNlcnZpY2UgY29uZnBhdGggdmFsdWUgd2l0aGluIHRoZSByZWdpc3RyeS4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MKLSAqIG9yIC0xIG9uIGVycm9yLiBJZiAtMSBpcyByZXR1cm4gdGhlIGVycm9yIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4KLSAqIGxvZ2dlZCB2aWEgYXBsb2dfZXJyb3IoKS4KLSAqLwotCi1pbnQgYXBfcmVnaXN0cnlfc2V0X3NlcnZpY2VfY29uZihjaGFyICpjb25mLCBjaGFyICpzZXJ2aWNlX25hbWUpCi17Ci0gICAgaW50IHJ2OwotICAgIGNoYXIgKmtleSA9IGFwX2dldF9zZXJ2aWNlX2tleShzZXJ2aWNlX25hbWUpOwotICAgIAotICAgIHJ2ID0gYXBfcmVnaXN0cnlfc3RvcmVfa2V5X2ludChrZXksICJDb25mUGF0aCIsIFJFR19TWiwgY29uZiwgc3RybGVuKGNvbmYpKzEpOwotICAgIGZyZWUoa2V5KTsKLQotICAgIHJldHVybiBydiA8IDAgPyAtMTogMDsKLX0KLQotLyoKLSAqIFNldHMgdGhlIHNlcnZlcnJvb3QgdmFsdWUgd2l0aGluIHRoZSByZWdpc3RyeS4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MKLSAqIG9yIC0xIG9uIGVycm9yLiBJZiAtMSBpcyByZXR1cm4gdGhlIGVycm9yIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4KLSAqIGxvZ2dlZCB2aWEgYXBsb2dfZXJyb3IoKS4KLSAqLwotCi1pbnQgYXBfcmVnaXN0cnlfc2V0X3NlcnZlcl9yb290KGNoYXIgKmRpcikKLXsKLSAgICBpbnQgcnY7Ci0KLSAgICBydiA9IGFwX3JlZ2lzdHJ5X3N0b3JlX2tleV9pbnQoUkVHS0VZLCAiU2VydmVyUm9vdCIsIFJFR19TWiwgZGlyLCBzdHJsZW4oZGlyKSsxKTsKLQotICAgIHJldHVybiBydiA8IDAgPyAtMSA6IDA7Ci19Ci0KZGlmZiAtLWdpdCBhL3NlcnZlci9tcG0vd2lubnQvc2VydmljZS5jIGIvc2VydmVyL21wbS93aW5udC9zZXJ2aWNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNDhkYjEuLjAwMDAwMDAKLS0tIGEvc2VydmVyL21wbS93aW5udC9zZXJ2aWNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODUgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCi0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgCi0gKiBhcmUgbWV0OiAKLSAqIAotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgCi0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuICAKLSAqIAotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgCi0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIAotICogICAgZGlzdHJpYnV0aW9uLiAKLSAqIAotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIAotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6IAotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cCAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iIAotICogCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvIAotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCi0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuIAotICogCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiAKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiAKLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4gCi0gKiAKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcgCi0gKiAgICBhY2tub3dsZWRnbWVudDogCi0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwIAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIgCi0gKiAKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWSAKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUiAKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCi0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSAKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIAotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCAKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKLSAqIAotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkgCi0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQgCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IgCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uIAotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlciAKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LiAKLSAqIAotICovIAotCi0jaWZkZWYgV0lOMzIKLQotI2luY2x1ZGUgIm9zLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZGlyZWN0Lmg+Ci0KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZl9nbG9iYWxzLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX21haW4uaCIKLSNpbmNsdWRlICJzZXJ2aWNlLmgiCi0jaW5jbHVkZSAicmVnaXN0cnkuaCIKLQotc3RhdGljIHN0cnVjdAotewotICAgIGludCAoKm1haW5fZm4pKGludCwgY2hhciAqKik7Ci0gICAgZXZlbnQgKnN0b3BfZXZlbnQ7Ci0gICAgaW50IGNvbm5lY3RlZDsKLSAgICBTRVJWSUNFX1NUQVRVU19IQU5ETEUgaFNlcnZpY2VTdGF0dXM7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBpbnQgZXhpdF9zdGF0dXM7Ci0gICAgU0VSVklDRV9TVEFUVVMgc3NTdGF0dXM7Ci0gICAgRklMRSAqbG9nRmlsZTsKLX0gZ2xvYmRhdDsKLQotc3RhdGljIHZvaWQgV0lOQVBJIHNlcnZpY2VfbWFpbl9mbihEV09SRCwgTFBUU1RSICopOwotc3RhdGljIHZvaWQgV0lOQVBJIHNlcnZpY2VfY3RybChEV09SRCBjdHJsQ29kZSk7Ci1zdGF0aWMgaW50IFJlcG9ydFN0YXR1c1RvU0NNZ3IoaW50IGN1cnJlbnRTdGF0ZSwgaW50IGV4aXRDb2RlLCBpbnQgd2FpdEhpbnQpOwotc3RhdGljIGludCBhcF9zdGFydF9zZXJ2aWNlKFNDX0hBTkRMRSk7Ci1zdGF0aWMgaW50IGFwX3N0b3Bfc2VydmljZShTQ19IQU5ETEUpOwotCi1pbnQgc2VydmljZV9tYWluKGludCAoKm1haW5fZm4pKGludCwgY2hhciAqKiksIGludCBhcmdjLCBjaGFyICoqYXJndiApCi17Ci0gICAgU0VSVklDRV9UQUJMRV9FTlRSWSBkaXNwYXRjaFRhYmxlW10gPQotICAgIHsKLSAgICAgICAgeyAiIiwgc2VydmljZV9tYWluX2ZuIH0sCi0gICAgICAgIHsgTlVMTCwgTlVMTCB9Ci0gICAgfTsKLQotICAgIGdsb2JkYXQubWFpbl9mbiA9IG1haW5fZm47Ci0gICAgZ2xvYmRhdC5zdG9wX2V2ZW50ID0gQ3JlYXRlRXZlbnQoTlVMTCwgMCwgMCwgImFwYWNoZS1zaWduYWwiKTsKLSAgICBnbG9iZGF0LmNvbm5lY3RlZCA9IDE7Ci0KLSAgICBpZighU3RhcnRTZXJ2aWNlQ3RybERpc3BhdGNoZXIoZGlzcGF0Y2hUYWJsZSkpCi0gICAgewotICAgICAgICAvKiBUaGlzIGlzIGEgZ2VudWluZSBmYWlsdXJlIG9mIHRoZSBTQ00uICovCi0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIEdldExhc3RFcnJvcigpLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHN0YXJ0aW5nIHNlcnZpY2UgY29udHJvbCBkaXNwYXRjaGVyIik7Ci0gICAgICAgIHJldHVybihnbG9iZGF0LmV4aXRfc3RhdHVzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuKGdsb2JkYXQuZXhpdF9zdGF0dXMpOwotICAgIH0KLX0KLQotdm9pZCBzZXJ2aWNlX2NkKCkKLXsKLSAgICAvKiBjaGFuZ2UgdG8gdGhlIGRyaXZlIHdpdGggdGhlIGV4ZWN1dGFibGUgKi8KLSAgICBjaGFyIGJ1ZlszMDBdOwotICAgIEdldE1vZHVsZUZpbGVOYW1lKE5VTEwsIGJ1ZiwgMzAwKTsKLSAgICBidWZbMl0gPSAwOwotICAgIGNoZGlyKGJ1Zik7Ci19Ci0KLXZvaWQgX19zdGRjYWxsIHNlcnZpY2VfbWFpbl9mbihEV09SRCBhcmdjLCBMUFRTVFIgKmFyZ3YpCi17Ci0gICAgYXBfc2VydmVyX2FyZ3YwID0gZ2xvYmRhdC5uYW1lID0gYXJndlswXTsKLQotICAgIGlmKCEoZ2xvYmRhdC5oU2VydmljZVN0YXR1cyA9IFJlZ2lzdGVyU2VydmljZUN0cmxIYW5kbGVyKCBnbG9iZGF0Lm5hbWUsIHNlcnZpY2VfY3RybCkpKQotICAgIHsKLSAgICAgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0VSUiwgR2V0TGFzdEVycm9yKCksIE5VTEwsCi0gICAgICAgICJGYWlsdXJlIHJlZ2lzdGVyaW5nIHNlcnZpY2UgaGFuZGxlciIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgUmVwb3J0U3RhdHVzVG9TQ01ncigKLSAgICAgICAgU0VSVklDRV9TVEFSVF9QRU5ESU5HLCAvLyBzZXJ2aWNlIHN0YXRlCi0gICAgICAgIE5PX0VSUk9SLCAgICAgICAgICAgICAgLy8gZXhpdCBjb2RlCi0gICAgICAgIDMwMDApOyAgICAgICAgICAgICAgICAgLy8gd2FpdCBoaW50Ci0KLSAgICBzZXJ2aWNlX2NkKCk7Ci0vLyAgICBpZiggc2VydmljZV9pbml0KCkgKSAKLSAgICAgICAgLyogQXJndW1lbnRzIGFyZSBvayBleGNlcHQgZm9yIFwhICovCi0gICAgICAgIGdsb2JkYXQuZXhpdF9zdGF0dXMgPSAoKmdsb2JkYXQubWFpbl9mbikoIGFyZ2MsIGFyZ3YgKTsKLSAgICAKLSAgICBSZXBvcnRTdGF0dXNUb1NDTWdyKFNFUlZJQ0VfU1RPUFBFRCwgTk9fRVJST1IsIDApOwotCi0gICAgcmV0dXJuOwotfQotCi12b2lkIHNlcnZpY2Vfc2V0X3N0YXR1cyhpbnQgc3RhdHVzKQotewotICAgIFJlcG9ydFN0YXR1c1RvU0NNZ3Ioc3RhdHVzLCBOT19FUlJPUiwgMzAwMCk7Ci19Ci0KLQotCi0vLwotLy8gIEZVTkNUSU9OOiBzZXJ2aWNlX2N0cmwKLS8vCi0vLyAgUFVSUE9TRTogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIFNDTSB3aGVuZXZlcgotLy8gICAgICAgICAgIENvbnRyb2xTZXJ2aWNlKCkgaXMgY2FsbGVkIG9uIHRoaXMgc2VydmljZS4KLS8vCi0vLyAgUEFSQU1FVEVSUzoKLS8vICAgIGR3Q3RybENvZGUgLSB0eXBlIG9mIGNvbnRyb2wgcmVxdWVzdGVkCi0vLwotLy8gIFJFVFVSTiBWQUxVRToKLS8vICAgIG5vbmUKLS8vCi0vLyAgQ09NTUVOVFM6Ci0vLwotVk9JRCBXSU5BUEkgc2VydmljZV9jdHJsKERXT1JEIGR3Q3RybENvZGUpCi17Ci0gICAgaW50IHN0YXRlOwotCi0KLSAgICBzdGF0ZSA9IGdsb2JkYXQuc3NTdGF0dXMuZHdDdXJyZW50U3RhdGU7Ci0gICAgc3dpdGNoKGR3Q3RybENvZGUpCi0gICAgewotICAgICAgICAvLyBTdG9wIHRoZSBzZXJ2aWNlLgotICAgICAgICAvLwotICAgICAgICBjYXNlIFNFUlZJQ0VfQ09OVFJPTF9TVE9QOgotICAgICAgICAgICAgc3RhdGUgPSBTRVJWSUNFX1NUT1BfUEVORElORzsKLQkgICAgYXBfc3RhcnRfc2h1dGRvd24oKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIFVwZGF0ZSB0aGUgc2VydmljZSBzdGF0dXMuCi0gICAgICAgIC8vCi0gICAgICAgIGNhc2UgU0VSVklDRV9DT05UUk9MX0lOVEVSUk9HQVRFOgotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLy8gaW52YWxpZCBjb250cm9sIGNvZGUKLSAgICAgICAgLy8KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgfQotCi0gICAgUmVwb3J0U3RhdHVzVG9TQ01ncihzdGF0ZSwgTk9fRVJST1IsIDApOwotfQotCi0KLWludCBSZXBvcnRTdGF0dXNUb1NDTWdyKGludCBjdXJyZW50U3RhdGUsIGludCBleGl0Q29kZSwgaW50IHdhaXRIaW50KQotewotICAgIHN0YXRpYyBpbnQgZmlyc3RUaW1lID0gMTsKLSAgICBzdGF0aWMgaW50IGNoZWNrUG9pbnQgPSAxOwotICAgIGludCBydjsKLSAgICAKLSAgICBpZihmaXJzdFRpbWUpCi0gICAgewotICAgICAgICBmaXJzdFRpbWUgPSAwOwotICAgICAgICBnbG9iZGF0LnNzU3RhdHVzLmR3U2VydmljZVR5cGUgPSBTRVJWSUNFX1dJTjMyX09XTl9QUk9DRVNTOwotICAgICAgICBnbG9iZGF0LnNzU3RhdHVzLmR3U2VydmljZVNwZWNpZmljRXhpdENvZGUgPSAwOwotICAgICAgICBnbG9iZGF0LnNzU3RhdHVzLmR3Q2hlY2tQb2ludCA9IDE7Ci0gICAgfQotCi0gICAgaWYoZ2xvYmRhdC5jb25uZWN0ZWQpCi0gICAgewotICAgICAgICBpZiAoY3VycmVudFN0YXRlID09IFNFUlZJQ0VfU1RBUlRfUEVORElORykKLSAgICAgICAgICAgIGdsb2JkYXQuc3NTdGF0dXMuZHdDb250cm9sc0FjY2VwdGVkID0gMDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZ2xvYmRhdC5zc1N0YXR1cy5kd0NvbnRyb2xzQWNjZXB0ZWQgPSBTRVJWSUNFX0FDQ0VQVF9TVE9QOwotCi0gICAgICAgIGdsb2JkYXQuc3NTdGF0dXMuZHdDdXJyZW50U3RhdGUgPSBjdXJyZW50U3RhdGU7Ci0gICAgICAgIGdsb2JkYXQuc3NTdGF0dXMuZHdXaW4zMkV4aXRDb2RlID0gZXhpdENvZGU7Ci0gICAgICAgIGlmKHdhaXRIaW50KQotICAgICAgICAgICAgZ2xvYmRhdC5zc1N0YXR1cy5kd1dhaXRIaW50ID0gd2FpdEhpbnQ7Ci0KLSAgICAgICAgaWYgKCAoIGN1cnJlbnRTdGF0ZSA9PSBTRVJWSUNFX1JVTk5JTkcgKSB8fAotICAgICAgICAgICAgICggY3VycmVudFN0YXRlID09IFNFUlZJQ0VfU1RPUFBFRCApICkKLSAgICAgICAgewotICAgICAgICAgICAgZ2xvYmRhdC5zc1N0YXR1cy5kd1dhaXRIaW50ID0gMDsKLSAgICAgICAgICAgIGdsb2JkYXQuc3NTdGF0dXMuZHdDaGVja1BvaW50ID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBnbG9iZGF0LnNzU3RhdHVzLmR3Q2hlY2tQb2ludCA9ICsrY2hlY2tQb2ludDsKLQotICAgICAgICBydiA9IFNldFNlcnZpY2VTdGF0dXMoZ2xvYmRhdC5oU2VydmljZVN0YXR1cywgJmdsb2JkYXQuc3NTdGF0dXMpOwotCi0gICAgfQotICAgIHJldHVybigxKTsKLX0KLQotdm9pZCBJbnN0YWxsU2VydmljZShjaGFyICpzZXJ2aWNlX25hbWUsIGNoYXIgKmNvbmYpCi17Ci0gICAgU0NfSEFORExFICAgc2NoU2VydmljZTsKLSAgICBTQ19IQU5ETEUgICBzY2hTQ01hbmFnZXI7Ci0KLSAgICBUQ0hBUiBzelBhdGhbNTEyXTsKLSAgICBUQ0hBUiBzelF1b3RlZFBhdGhbNTEyXTsKLQotICAgIHByaW50ZigiSW5zdGFsbGluZyB0aGUgJXMgc2VydmljZSB0byB1c2UgJXNcbiIsIHNlcnZpY2VfbmFtZSwgY29uZik7Ci0KLSAgICBpZiAoR2V0TW9kdWxlRmlsZU5hbWUoIE5VTEwsIHN6UGF0aCwgNTEyICkgPT0gMCkKLSAgICB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIEdldExhc3RFcnJvcigpLCBOVUxMLAotICAgICAgICAiR2V0TW9kdWxlRmlsZU5hbWUgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhcF9zbnByaW50ZihzelF1b3RlZFBhdGgsIDUxMiwgIlwiJXNcIiIsIHN6UGF0aCk7Ci0KLSAgICBzY2hTQ01hbmFnZXIgPSBPcGVuU0NNYW5hZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLy8gbWFjaGluZSAoTlVMTCA9PSBsb2NhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgIC8vIGRhdGFiYXNlIChOVUxMID09IGRlZmF1bHQpCi0gICAgICAgICAgICAgICAgICAgICAgICBTQ19NQU5BR0VSX0FMTF9BQ0NFU1MgICAvLyBhY2Nlc3MgcmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICBpZiAoIXNjaFNDTWFuYWdlcikgewotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIEdldExhc3RFcnJvcigpLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAiT3BlblNDTWFuYWdlciBmYWlsZWQiKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHNjaFNlcnZpY2UgPSBDcmVhdGVTZXJ2aWNlKAotICAgICAgICAgICAgc2NoU0NNYW5hZ2VyLCAgICAgICAgICAgICAgIC8vIFNDTWFuYWdlciBkYXRhYmFzZQotICAgICAgICAgICAgc2VydmljZV9uYW1lLCAgICAgICAgICAgICAgIC8vIG5hbWUgb2Ygc2VydmljZQotICAgICAgICAgICAgc2VydmljZV9uYW1lLCAgICAgICAgICAgICAgIC8vIG5hbWUgdG8gZGlzcGxheQotICAgICAgICAgICAgU0VSVklDRV9BTExfQUNDRVNTLCAgICAgICAgIC8vIGRlc2lyZWQgYWNjZXNzCi0gICAgICAgICAgICBTRVJWSUNFX1dJTjMyX09XTl9QUk9DRVNTLCAgLy8gc2VydmljZSB0eXBlCi0gICAgICAgICAgICBTRVJWSUNFX0FVVE9fU1RBUlQsICAgICAgIC8vIHN0YXJ0IHR5cGUKLSAgICAgICAgICAgIFNFUlZJQ0VfRVJST1JfTk9STUFMLCAgICAgICAvLyBlcnJvciBjb250cm9sIHR5cGUKLSAgICAgICAgICAgIHN6UXVvdGVkUGF0aCwgICAgICAgICAgICAgICAvLyBzZXJ2aWNlJ3MgYmluYXJ5Ci0gICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gbG9hZCBvcmRlcmluZyBncm91cAotICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHRhZyBpZGVudGlmaWVyCi0gICAgICAgICAgICBOVUxMLCAgICAgICAvLyBkZXBlbmRlbmNpZXMKLSAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2NhbFN5c3RlbSBhY2NvdW50Ci0gICAgICAgICAgICBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gcGFzc3dvcmQKLQotICAgICAgICBpZiAoc2NoU2VydmljZSkgewotICAgICAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjaFNlcnZpY2UpOwotCi0gICAgICAgICAgICAvKiBOb3cgc3RvcmUgdGhlIHNlcnZlcl9yb290IGluIHRoZSByZWdpc3RyeSAqLwotICAgICAgICAgICAgaWYoIWFwX3JlZ2lzdHJ5X3NldF9zZXJ2aWNlX2NvbmYoY29uZiwgc2VydmljZV9uYW1lKSkKLSAgICAgICAgICAgICAgICBwcmludGYoIlRoZSAlcyBzZXJ2aWNlIGhhcyBiZWVuIGluc3RhbGxlZCBzdWNjZXNzZnVsbHkuXG4iLCBzZXJ2aWNlX25hbWUgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIEdldExhc3RFcnJvcigpLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAiQ3JlYXRlU2VydmljZSBmYWlsZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIENsb3NlU2VydmljZUhhbmRsZShzY2hTQ01hbmFnZXIpOwotICAgIH0KLX0KLQotCi12b2lkIFJlbW92ZVNlcnZpY2UoY2hhciAqc2VydmljZV9uYW1lKQotewotICAgIFNDX0hBTkRMRSAgIHNjaFNlcnZpY2U7Ci0gICAgU0NfSEFORExFICAgc2NoU0NNYW5hZ2VyOwotCi0gICAgcHJpbnRmKCJSZW1vdmluZyB0aGUgJXMgc2VydmljZVxuIiwgc2VydmljZV9uYW1lKTsKLQotICAgIHNjaFNDTWFuYWdlciA9IE9wZW5TQ01hbmFnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAvLyBtYWNoaW5lIChOVUxMID09IGxvY2FsKQotICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLy8gZGF0YWJhc2UgKE5VTEwgPT0gZGVmYXVsdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIFNDX01BTkFHRVJfQUxMX0FDQ0VTUyAgIC8vIGFjY2VzcyByZXF1aXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICBpZiAoIXNjaFNDTWFuYWdlcikgewotICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIEdldExhc3RFcnJvcigpLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAiT3BlblNDTWFuYWdlciBmYWlsZWQiKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHNjaFNlcnZpY2UgPSBPcGVuU2VydmljZShzY2hTQ01hbmFnZXIsIHNlcnZpY2VfbmFtZSwgU0VSVklDRV9BTExfQUNDRVNTKTsKLQotICAgICAgICBpZiAoc2NoU2VydmljZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAvKiBDb3VsZCBub3Qgb3BlbiB0aGUgc2VydmljZSAqLwotICAgICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBHZXRMYXN0RXJyb3IoKSwgTlVMTCwKLQkJCSJPcGVuU2VydmljZSBmYWlsZWQiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIHRyeSB0byBzdG9wIHRoZSBzZXJ2aWNlICovCi0gICAgICAgICAgICBhcF9zdG9wX3NlcnZpY2Uoc2NoU2VydmljZSk7Ci0KLSAgICAgICAgICAgIC8vIG5vdyByZW1vdmUgdGhlIHNlcnZpY2UKLSAgICAgICAgICAgIGlmIChEZWxldGVTZXJ2aWNlKHNjaFNlcnZpY2UpID09IDApCi0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIEdldExhc3RFcnJvcigpLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVsZXRlU2VydmljZSBmYWlsZWQiKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwcmludGYoIlRoZSAlcyBzZXJ2aWNlIGhhcyBiZWVuIHJlbW92ZWQgc3VjY2Vzc2Z1bGx5LlxuIiwgc2VydmljZV9uYW1lICk7Ci0gICAgICAgICAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NoU2VydmljZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogU0NNIHJlbW92ZXMgcmVnaXN0cnkgcGFyYW1ldGVycyAgKi8KLSAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjaFNDTWFuYWdlcik7Ci0gICAgfQotCi19Ci0KLS8qIEEgaGFjayB0byBkZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBhcyBhIHNlcnZpY2Ugd2l0aG91dCB3YWl0aW5nIGZvcgotICogdGhlIFNDTSB0byBmYWlsOyBpZiBBbGxvY0NvbnNvbGUgc3VjY2VlZHMsIHdlJ3JlIGEgc2VydmljZS4KLSAqLwotCi1CT09MIGlzUHJvY2Vzc1NlcnZpY2UoKSB7Ci0gICAgaWYoICFBbGxvY0NvbnNvbGUoKSApIAotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgRnJlZUNvbnNvbGUoKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLyogRGV0ZXJtaW5lIGlzIHNlcnZpY2VfbmFtZSBpcyBhIHZhbGlkIHNlcnZpY2UKLSAqLwotCi1CT09MIGlzVmFsaWRTZXJ2aWNlKGNoYXIgKnNlcnZpY2VfbmFtZSkgewotICAgIFNDX0hBTkRMRSBzY2hTQ00sIHNjaFNWQzsKLSAgICBpbnQgRXJyOwotCi0gICAgaWYgKCEoc2NoU0NNID0gT3BlblNDTWFuYWdlcihOVUxMLCBOVUxMLCBTQ19NQU5BR0VSX0FMTF9BQ0NFU1MpKSkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBHZXRMYXN0RXJyb3IoKSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICJPcGVuU0NNYW5hZ2VyIGZhaWxlZCIpOwotICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAoKHNjaFNWQyA9IE9wZW5TZXJ2aWNlKHNjaFNDTSwgc2VydmljZV9uYW1lLCBTRVJWSUNFX0FMTF9BQ0NFU1MpKSkgewotICAgICAgICBDbG9zZVNlcnZpY2VIYW5kbGUoc2NoU1ZDKTsKLSAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjaFNDTSk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIEVyciA9IEdldExhc3RFcnJvcigpOwotICAgIGlmIChFcnIgIT0gRVJST1JfU0VSVklDRV9ET0VTX05PVF9FWElTVCAmJiBFcnIgIT0gRVJST1JfSU5WQUxJRF9OQU1FKQotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBFcnIsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAiT3BlblNlcnZpY2UgZmFpbGVkIik7Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLWludCBzZW5kX3NpZ25hbF90b19zZXJ2aWNlKGNoYXIgKnNlcnZpY2VfbmFtZSwgY2hhciAqc2lnKSB7Ci0gICAgU0NfSEFORExFICAgc2NoU2VydmljZTsKLSAgICBTQ19IQU5ETEUgICBzY2hTQ01hbmFnZXI7Ci0gICAgaW50IHN1Y2Nlc3MgPSBGQUxTRTsKLQotICAgIGVudW0gICAgICAgICAgICAgICAgICAgICAgICB7IHN0YXJ0LCAgICAgIHJlc3RhcnQsICAgICAgc3RvcCwgdW5rbm93biB9IGFjdGlvbjsKLSAgICBzdGF0aWMgY2hhciAqcGFyYW1bXSA9ICAgICAgeyAic3RhcnQiLCAgICAicmVzdGFydCIsICAgICJzaHV0ZG93biIgfTsKLSAgICBzdGF0aWMgY2hhciAqcGFydGljaXBsZVtdID0geyAic3RhcnRpbmciLCAicmVzdGFydGluZyIsICJzdG9wcGluZyIgfTsKLSAgICBzdGF0aWMgY2hhciAqcGFzdFtdICAgICAgID0geyAic3RhcnRlZCIsICAicmVzdGFydGVkIiwgICJzdG9wcGVkIiAgfTsKLQotICAgIGZvciAoYWN0aW9uID0gc3RhcnQ7IGFjdGlvbiA8IHVua25vd247IGFjdGlvbisrKQotICAgICAgICBpZiAoIXN0cmNhc2VjbXAoc2lnLCBwYXJhbVthY3Rpb25dKSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgaWYgKGFjdGlvbiA9PSB1bmtub3duKSB7Ci0gICAgICAgIHByaW50Zigic2lnbmFsIG11c3QgYmUgc3RhcnQsIHJlc3RhcnQsIG9yIHNodXRkb3duXG4iKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHNjaFNDTWFuYWdlciA9IE9wZW5TQ01hbmFnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAvLyBtYWNoaW5lIChOVUxMID09IGxvY2FsKQotICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLy8gZGF0YWJhc2UgKE5VTEwgPT0gZGVmYXVsdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIFNDX01BTkFHRVJfQUxMX0FDQ0VTUyAgIC8vIGFjY2VzcyByZXF1aXJlZAotICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICBpZiAoIXNjaFNDTWFuYWdlcikgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSLCBHZXRMYXN0RXJyb3IoKSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICJPcGVuU0NNYW5hZ2VyIGZhaWxlZCIpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc2NoU2VydmljZSA9IE9wZW5TZXJ2aWNlKHNjaFNDTWFuYWdlciwgc2VydmljZV9uYW1lLCBTRVJWSUNFX0FMTF9BQ0NFU1MpOwotCi0gICAgICAgIGlmIChzY2hTZXJ2aWNlID09IE5VTEwpIHsKLSAgICAgICAgICAgIC8qIENvdWxkIG5vdCBvcGVuIHRoZSBzZXJ2aWNlICovCi0gICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIEdldExhc3RFcnJvcigpLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgIk9wZW5TZXJ2aWNlIGZhaWxlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKCFRdWVyeVNlcnZpY2VTdGF0dXMoc2NoU2VydmljZSwgJmdsb2JkYXQuc3NTdGF0dXMpKQotICAgICAgICAgICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIsIEdldExhc3RFcnJvcigpLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUXVlcnlTZXJ2aWNlIGZhaWxlZCIpOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdsb2JkYXQuc3NTdGF0dXMuZHdDdXJyZW50U3RhdGUgPT0gU0VSVklDRV9TVE9QUEVEICYmIGFjdGlvbiA9PSBzdG9wKQotICAgICAgICAgICAgICAgICAgICBwcmludGYoIlRoZSAlcyBzZXJ2aWNlIGlzIG5vdCBzdGFydGVkLlxuIiwgc2VydmljZV9uYW1lKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChnbG9iZGF0LnNzU3RhdHVzLmR3Q3VycmVudFN0YXRlID09IFNFUlZJQ0VfUlVOTklORyAmJiBhY3Rpb24gPT0gc3RhcnQpCi0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiVGhlICVzIHNlcnZpY2UgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkLlxuIiwgc2VydmljZV9uYW1lKTsKLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJUaGUgJXMgc2VydmljZSBpcyAlcy5cbiIsIHNlcnZpY2VfbmFtZSwgcGFydGljaXBsZVthY3Rpb25dKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IHN0b3AgfHwgYWN0aW9uID09IHJlc3RhcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gYXBfc3RvcF9zZXJ2aWNlKHNjaFNlcnZpY2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IHN0YXJ0IHx8IGFjdGlvbiA9PSByZXN0YXJ0KQotICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGFwX3N0YXJ0X3NlcnZpY2Uoc2NoU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCBzdWNjZXNzICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiVGhlICVzIHNlcnZpY2UgaGFzICVzLlxuIiwgc2VydmljZV9uYW1lLCBwYXN0W2FjdGlvbl0pOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkZhaWxlZCB0byAlcyB0aGUgJXMgc2VydmljZS5cbiIsIHNpZywgc2VydmljZV9uYW1lICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjaFNlcnZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIFNDTSByZW1vdmVzIHJlZ2lzdHJ5IHBhcmFtZXRlcnMgKi8KLSAgICAgICAgQ2xvc2VTZXJ2aWNlSGFuZGxlKHNjaFNDTWFuYWdlcik7Ci0gICAgfQotICAgIHJldHVybiBzdWNjZXNzOwotfQotCi1pbnQgYXBfc3RvcF9zZXJ2aWNlKFNDX0hBTkRMRSBzY2hTZXJ2aWNlKQotewotICAgIGlmIChDb250cm9sU2VydmljZShzY2hTZXJ2aWNlLCBTRVJWSUNFX0NPTlRST0xfU1RPUCwgJmdsb2JkYXQuc3NTdGF0dXMpKSB7Ci0gICAgICAgIFNsZWVwKDEwMDApOwotICAgICAgICB3aGlsZSAoUXVlcnlTZXJ2aWNlU3RhdHVzKHNjaFNlcnZpY2UsICZnbG9iZGF0LnNzU3RhdHVzKSkgewotICAgICAgICAgICAgaWYgKGdsb2JkYXQuc3NTdGF0dXMuZHdDdXJyZW50U3RhdGUgPT0gU0VSVklDRV9TVE9QX1BFTkRJTkcpCi0gICAgICAgICAgICAgICAgU2xlZXAoMTAwMCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKFF1ZXJ5U2VydmljZVN0YXR1cyhzY2hTZXJ2aWNlLCAmZ2xvYmRhdC5zc1N0YXR1cykpCi0gICAgICAgIGlmIChnbG9iZGF0LnNzU3RhdHVzLmR3Q3VycmVudFN0YXRlID09IFNFUlZJQ0VfU1RPUFBFRCkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgIHJldHVybiBGQUxTRTsKLX0KLQotaW50IGFwX3N0YXJ0X3NlcnZpY2UoU0NfSEFORExFIHNjaFNlcnZpY2UpIHsKLSAgICBpZiAoU3RhcnRTZXJ2aWNlKHNjaFNlcnZpY2UsIDAsIE5VTEwpKSB7Ci0gICAgICAgIFNsZWVwKDEwMDApOwotICAgICAgICB3aGlsZShRdWVyeVNlcnZpY2VTdGF0dXMoc2NoU2VydmljZSwgJmdsb2JkYXQuc3NTdGF0dXMpKSB7Ci0gICAgICAgICAgICBpZihnbG9iZGF0LnNzU3RhdHVzLmR3Q3VycmVudFN0YXRlID09IFNFUlZJQ0VfU1RBUlRfUEVORElORykKLSAgICAgICAgICAgICAgICBTbGVlcCgxMDAwKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoUXVlcnlTZXJ2aWNlU3RhdHVzKHNjaFNlcnZpY2UsICZnbG9iZGF0LnNzU3RhdHVzKSkKLSAgICAgICAgaWYgKGdsb2JkYXQuc3NTdGF0dXMuZHdDdXJyZW50U3RhdGUgPT0gU0VSVklDRV9SVU5OSU5HKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotICAgICAgICAgICAKLSNlbmRpZiAvKiBXSU4zMiAqLwotCmRpZmYgLS1naXQgYS9zZXJ2ZXIvcmZjMTQxMy5jIGIvc2VydmVyL3JmYzE0MTMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBjZWIxOS4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvcmZjMTQxMy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyogVE9ETyAtIHB1dCB0aW1lb3V0cyBiYWNrIGluICovCi0vKgotICogcmZjMTQxMygpIHNwZWFrcyBhIGNvbW1vbiBzdWJzZXQgb2YgdGhlIFJGQyAxNDEzLCBBVVRILCBUQVAgYW5kIElERU5UCi0gKiBwcm90b2NvbHMuIFRoZSBjb2RlIHF1ZXJpZXMgYW4gUkZDIDE0MTMgZXRjLiBjb21wYXRpYmxlIGRhZW1vbiBvbiBhIHJlbW90ZQotICogaG9zdCB0byBsb29rIHVwIHRoZSBvd25lciBvZiBhIGNvbm5lY3Rpb24uIFRoZSBpbmZvcm1hdGlvbiBzaG91bGQgbm90IGJlCi0gKiB1c2VkIGZvciBhdXRoZW50aWNhdGlvbiBwdXJwb3Nlcy4gVGhpcyByb3V0aW5lIGludGVyY2VwdHMgYWxhcm0gc2lnbmFscy4KLSAqIAotICogRGlhZ25vc3RpY3MgYXJlIHJlcG9ydGVkIHRocm91Z2ggc3lzbG9nKDMpLgotICogCi0gKiBBdXRob3I6IFdpZXRzZSBWZW5lbWEsIEVpbmRob3ZlbiBVbml2ZXJzaXR5IG9mIFRlY2hub2xvZ3ksCi0gKiBUaGUgTmV0aGVybGFuZHMuCi0gKi8KLQotLyogU29tZSBzbWFsbCBhZGRpdGlvbnMgZm9yIEFwYWNoZSAtLS0gZGl0Y2ggdGhlICJzY2NzaWQiIHZhciBpZgotICogY29tcGlsaW5nIHdpdGggZ2NjIChpdCAqaGFzKiBjaGFuZ2VkKSwgaW5jbHVkZSBhcF9jb25maWcuaCBmb3IgdGhlCi0gKiBwcm90b3R5cGVzIGl0IGRlZmluZXMgb24gYXQgbGVhc3Qgb25lIHN5c3RlbSAoU3VubE9Tcykgd2hpY2ggaGFzCi0gKiB0aGVtIG1pc3NpbmcgZnJvbSB0aGUgc3RhbmRhcmQgaGVhZGVyIGZpbGVzLCBhbmQgb25lIG1pbm9yIGNoYW5nZQotICogYmVsb3cgKGV4dHJhIHBhcmVucyBhcm91bmQgYXNzaWduICJpZiAoZm9vID0gYmFyKSAuLi4iIHRvIHNodXQgdXAKLSAqIGdjYyAtV2FsbCkuCi0gKi8KLQotLyogUmV3cml0dGVuIGJ5IERhdmlkIFJvYmluc29uICovCi0KLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwZC5oIgkJLyogZm9yIHNlcnZlcl9yZWMsIGNvbm5fcmVjLCBldGMuICovCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIJCS8qIGZvciBhcGxvZ19lcnJvciAqLwotI2luY2x1ZGUgInJmYzE0MTMuaCIKLSNpbmNsdWRlICJodHRwX21haW4uaCIJCS8qIHNldF9jYWxsYmFja19hbmRfYWxhcm0gKi8KLSNpbmNsdWRlICJhcHJfbmV0d29ya19pby5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKiBMb2NhbCBzdHVmZi4gKi8KLS8qIFNlbWktd2VsbC1rbm93biBwb3J0ICovCi0jZGVmaW5lCVJGQzE0MTNfUE9SVAkxMTMKLS8qIG1heGltdW0gYWxsb3dlZCBsZW5ndGggb2YgdXNlcmlkICovCi0jZGVmaW5lIFJGQzE0MTNfVVNFUkxFTiA1MTIKLS8qIHJvdWdoIGxpbWl0IG9uIHRoZSBhbW91bnQgb2YgZGF0YSB3ZSBhY2NlcHQuICovCi0jZGVmaW5lIFJGQzE0MTNfTUFYREFUQSAxMDAwCi0KLSNpZm5kZWYgUkZDMTQxM19USU1FT1VUCi0jZGVmaW5lIFJGQzE0MTNfVElNRU9VVAkzMAotI2VuZGlmCi0jZGVmaW5lCUFOWV9QT1JUCTAJLyogQW55IG9sZCBwb3J0IHdpbGwgZG8gKi8KLSNkZWZpbmUgRlJPTV9VTktOT1dOICAidW5rbm93biIKLQotaW50IGFwX3JmYzE0MTNfdGltZW91dCA9IFJGQzE0MTNfVElNRU9VVDsJLyogR2xvYmFsIHNvIGl0IGNhbiBiZSBjaGFuZ2VkICovCi0KLS8qIGJpbmRfY29ubmVjdCAtIGJpbmQgYm90aCBlbmRzIG9mIGEgc29ja2V0ICovCi0vKiBBbWJhcmlzaCBmaXggdGhpcy4gVmVyeSBicm9rZW4gKi8KLXN0YXRpYyBpbnQgZ2V0X3JmYzE0MTMoYXBfc29ja2V0X3QgKnNvY2ssIGNvbnN0IGNoYXIgKmxvY2FsX2lwLAotCQkgICAgICAgY29uc3QgY2hhciAqcm10X2lwLCAKLQkJICAgICAgIGNoYXIgdXNlcltSRkMxNDEzX1VTRVJMRU4rMV0sIHNlcnZlcl9yZWMgKnNydikKLXsKLSAgICB1bnNpZ25lZCBpbnQgcm10X3BvcnQsIG91cl9wb3J0OwotICAgIHVuc2lnbmVkIGludCBzYXZfcm10X3BvcnQsIHNhdl9vdXJfcG9ydDsKLSAgICBhcF9zdGF0dXNfdCBzdGF0dXM7Ci0gICAgaW50IGk7Ci0gICAgY2hhciAqY3A7Ci0gICAgY2hhciBidWZmZXJbUkZDMTQxM19NQVhEQVRBICsgMV07Ci0gICAgaW50IGJ1ZmxlbjsKLQotICAgIC8qCi0gICAgICogQmluZCB0aGUgbG9jYWwgYW5kIHJlbW90ZSBlbmRzIG9mIHRoZSBxdWVyeSBzb2NrZXQgdG8gdGhlIHNhbWUKLSAgICAgKiBJUCBhZGRyZXNzZXMgYXMgdGhlIGNvbm5lY3Rpb24gdW5kZXIgaW52ZXN0aWdhdGlvbi4gV2UgZ28KLSAgICAgKiB0aHJvdWdoIGFsbCB0aGlzIHRyb3VibGUgYmVjYXVzZSB0aGUgbG9jYWwgb3IgcmVtb3RlIHN5c3RlbQotICAgICAqIG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBuZXR3b3JrIGFkZHJlc3MuIFRoZSBSRkMxNDEzIGV0Yy4KLSAgICAgKiBjbGllbnQgc2VuZHMgb25seSBwb3J0IG51bWJlcnM7IHRoZSBzZXJ2ZXIgdGFrZXMgdGhlIElQCi0gICAgICogYWRkcmVzc2VzIGZyb20gdGhlIHF1ZXJ5IHNvY2tldC4KLSAgICAgKi8KLQotICAgIGFwX3NldF9sb2NhbF9wb3J0KHNvY2ssIEFOWV9QT1JUKTsKLSAgICBhcF9zZXRfbG9jYWxfaXBhZGRyKHNvY2ssIGxvY2FsX2lwKTsKLQotICAgIGlmICgoc3RhdHVzID0gYXBfYmluZChzb2NrKSkgIT0gQVBSX1NVQ0NFU1MpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfQ1JJVCwgc3RhdHVzLCBzcnYsCi0JCSAgICAiYmluZDogcmZjMTQxMzogRXJyb3IgYmluZGluZyB0byBsb2NhbCBwb3J0Iik7Ci0JcmV0dXJuIC0xOwotICAgIH0KLSAgICBhcF9nZXRfbG9jYWxfcG9ydCgmc2F2X291cl9wb3J0LCBzb2NrKTsKLQotLyoKLSAqIGVycm9ycyBmcm9tIGNvbm5lY3QgdXN1YWxseSBpbXBseSB0aGUgcmVtb3RlIG1hY2hpbmUgZG9lc24ndCBzdXBwb3J0Ci0gKiB0aGUgc2VydmljZQotICovCi0gICAgYXBfc2V0X3JlbW90ZV9wb3J0KHNvY2ssIFJGQzE0MTNfUE9SVCk7Ci0gICAgYXBfc2V0X3JlbW90ZV9pcGFkZHIoc29jaywgcm10X2lwKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKGFwX2Nvbm5lY3Qoc29jaywgTlVMTCkgIT0gQVBSX1NVQ0NFU1MpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBhcF9nZXRfcmVtb3RlX3BvcnQoJnNhdl9ybXRfcG9ydCwgc29jayk7Ci0KLS8qIHNlbmQgdGhlIGRhdGEgKi8KLSAgICBidWZsZW4gPSBhcF9zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJXUsJXVcclxuIiwgc2F2X3JtdF9wb3J0LAotCQlzYXZfb3VyX3BvcnQpOwotCi0gICAgLyogc2VuZCBxdWVyeSB0byBzZXJ2ZXIuIEhhbmRsZSBzaG9ydCB3cml0ZS4gKi8KLSNpZmRlZiBDSEFSU0VUX0VCQ0RJQwotICAgIGViY2RpYzJhc2NpaSgmYnVmZmVyLCAmYnVmZmVyLCBidWZsZW4pOwotI2VuZGlmCi0gICAgaSA9IDA7Ci0gICAgd2hpbGUoaSA8IHN0cmxlbihidWZmZXIpKSB7Ci0gICAgICAgIGFwX3NzaXplX3QgaiA9IHN0cmxlbihidWZmZXIgKyBpKTsKLSAgICAgICAgYXBfc3RhdHVzX3Qgc3RhdHVzOwotCXN0YXR1cyAgPSBhcF9zZW5kKHNvY2ssIGJ1ZmZlcitpLCAmaik7Ci0JaWYgKHN0YXR1cyAhPSBBUFJfU1VDQ0VTUyAmJiBzdGF0dXMgIT0gQVBSX0VJTlRSKSB7Ci0JICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19DUklULCBzdGF0dXMsIHNydiwKLQkJICAgICAgICAgIndyaXRlOiByZmMxNDEzOiBlcnJvciBzZW5kaW5nIHJlcXVlc3QiKTsKLQkgICAgcmV0dXJuIC0xOwotCX0KLQllbHNlIGlmIChqID4gMCkgewotCSAgICBpKz1qOyAKLQl9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZWFkIHJlc3BvbnNlIGZyb20gc2VydmVyLiAtIHRoZSByZXNwb25zZSBzaG91bGQgYmUgbmV3bGluZSAKLSAgICAgKiB0ZXJtaW5hdGVkIGFjY29yZGluZyB0byByZmMgLSBtYWtlIHN1cmUgaXQgZG9lc24ndCBzdG9tcCBpdCdzCi0gICAgICogd2F5IG91dCBvZiB0aGUgYnVmZmVyLgotICAgICAqLwotCi0gICAgaSA9IDA7Ci0gICAgbWVtc2V0KGJ1ZmZlciwgJ1wwJywgc2l6ZW9mKGJ1ZmZlcikpOwotICAgIC8qCi0gICAgICogTm90ZSB0aGF0IHRoZSBzdHJjaHIgZnVuY3Rpb24gYmVsb3cgY2hlY2tzIGZvciAxMCBpbnN0ZWFkIG9mICdcbicKLSAgICAgKiB0aGlzIGFsbG93cyBpdCB0byB3b3JrIG9uIGJvdGggQVNDSUkgYW5kIEVCQ0RJQyBtYWNoaW5lcy4KLSAgICAgKi8KLSAgICB3aGlsZSgoY3AgPSBzdHJjaHIoYnVmZmVyLCAnXDAxMicpKSA9PSBOVUxMICYmIGkgPCBzaXplb2YoYnVmZmVyKSAtIDEpIHsKLSAgICAgICAgYXBfc3NpemVfdCBqID0gc2l6ZW9mKGJ1ZmZlcikgLSAxIC0gaTsKLSAgICAgICAgYXBfc3RhdHVzX3Qgc3RhdHVzOwotCXN0YXR1cyA9IGFwX3JlY3Yoc29jaywgYnVmZmVyK2ksICZqKTsKLQlpZiAoc3RhdHVzICE9IEFQUl9TVUNDRVNTICYmIHN0YXR1cyAhPSBBUFJfRUlOVFIpIHsKLQkgICAgYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0NSSVQsIHN0YXR1cywgc3J2LAotCQkJInJlYWQ6IHJmYzE0MTM6IGVycm9yIHJlYWRpbmcgcmVzcG9uc2UiKTsKLQkgICAgcmV0dXJuIC0xOwotCX0KLQllbHNlIGlmIChqID4gMCkgewotCSAgICBpKz1qOyAKLQl9Ci0gICAgfQotCi0vKiBSRkMxNDEzX1VTRVJMRU4gPSA1MTIgKi8KLSNpZmRlZiBDSEFSU0VUX0VCQ0RJQwotICAgIGFzY2lpMmViY2RpYygmYnVmZmVyLCAmYnVmZmVyLCAoc2l6ZV90KWkpOwotI2VuZGlmCi0gICAgaWYgKHNzY2FuZihidWZmZXIsICIldSAsICV1IDogVVNFUklEIDolKlteOl06JTUxMnMiLCAmcm10X3BvcnQsICZvdXJfcG9ydCwKLQkgICAgICAgdXNlcikgIT0gMyB8fCBzYXZfcm10X3BvcnQgIT0gcm10X3BvcnQKLQl8fCBzYXZfb3VyX3BvcnQgIT0gb3VyX3BvcnQpCi0JcmV0dXJuIC0xOwotCi0gICAgLyoKLSAgICAgKiBTdHJpcCB0cmFpbGluZyBjYXJyaWFnZSByZXR1cm4uIEl0IGlzIHBhcnQgb2YgdGhlCi0gICAgICogcHJvdG9jb2wsIG5vdCBwYXJ0IG9mIHRoZSBkYXRhLgotICAgICAqLwotCi0gICAgaWYgKChjcCA9IHN0cmNocih1c2VyLCAnXHInKSkpCi0JKmNwID0gJ1wwJzsKLQotICAgIHJldHVybiAwOwotfQotCi0vKiByZmMxNDEzIC0gcmV0dXJuIHJlbW90ZSB1c2VyIG5hbWUsIGdpdmVuIHNvY2tldCBzdHJ1Y3R1cmVzICovCi1jaGFyICphcF9yZmMxNDEzKGNvbm5fcmVjICpjb25uLCBzZXJ2ZXJfcmVjICpzcnYpCi17Ci0gICAgYXBfc3RhdHVzX3Qgc3RhdHVzOwotICAgIHN0YXRpYyBjaGFyIHVzZXJbUkZDMTQxM19VU0VSTEVOICsgMV07CS8qIFhYWCAqLwotICAgIHN0YXRpYyBjaGFyICpyZXN1bHQ7Ci0gICAgc3RhdGljIGFwX3NvY2tldF90ICpzb2NrOwotCi0gICAgcmVzdWx0ID0gRlJPTV9VTktOT1dOOwotCi0gICAgaWYgKChzdGF0dXMgPSBhcF9jcmVhdGVfdGNwX3NvY2tldCgmc29jaywgY29ubi0+cG9vbCkpICE9IEFQUl9TVUNDRVNTKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0NSSVQsIHN0YXR1cywgc3J2LAotCQkgICAgInNvY2tldDogcmZjMTQxMzogZXJyb3IgY3JlYXRpbmcgc29ja2V0Iik7Ci0JY29ubi0+cmVtb3RlX2xvZ25hbWUgPSByZXN1bHQ7Ci0gICAgfQotCi0gICAgaWYgKGdldF9yZmMxNDEzKHNvY2ssIGNvbm4tPmxvY2FsX2lwLCBjb25uLT5yZW1vdGVfaXAsIHVzZXIsIHNydikgPj0gMCkKLSAgICAgICAgcmVzdWx0ID0gdXNlcjsKLSAgICBhcF9jbG9zZV9zb2NrZXQoc29jayk7Ci0gICAgY29ubi0+cmVtb3RlX2xvZ25hbWUgPSByZXN1bHQ7Ci0KLSAgICByZXR1cm4gY29ubi0+cmVtb3RlX2xvZ25hbWU7Ci19CmRpZmYgLS1naXQgYS9zZXJ2ZXIvdXRpbC5jIGIvc2VydmVyL3V0aWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk0NThlNS4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvdXRpbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAzMSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiB1dGlsLmM6IHN0cmluZyB1dGlsaXR5IHRoaW5ncwotICogCi0gKiAzLzIxLzkzIFJvYiBNY0Nvb2wKLSAqIDE5OTUtOTYgTWFueSBjaGFuZ2VzIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqIAotICovCi0KLS8qIERlYnVnZ2luZyBhaWQ6Ci0gKiAjZGVmaW5lIERFQlVHICAgICAgICAgICAgdG8gdHJhY2UgYWxsIGNmZ19vcGVuKigpL2NmZ19jbG9zZWZpbGUoKSBjYWxscwotICogI2RlZmluZSBERUJVR19DRkdfTElORVMgIHRvIHRyYWNlIGV2ZXJ5IGxpbmUgcmVhZCBmcm9tIHRoZSBjb25maWcgZmlsZXMKLSAqLwotCi0jZGVmaW5lIENPUkVfUFJJVkFURQotCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJodHRwX21haW4uaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfcHJvdG9jb2wuaCIKLSNpZiBkZWZpbmVkKFNVTk9TNCkKLS8qIHN0ZGlvLmggaGFzIGJlZW4gcmVhZCBpbiBhcF9jb25maWcuaCBhbHJlYWR5LiBBZGQgbWlzc2luZyBwcm90b3R5cGVzIGhlcmU6ICovCi1leHRlcm4gaW50IGZnZXRjKEZJTEUgKik7Ci1leHRlcm4gY2hhciAqZmdldHMoY2hhciAqcywgaW50LCBGSUxFKik7Ci1leHRlcm4gaW50IGZjbG9zZShGSUxFICopOwotI2VuZGlmCi0KLS8qIEEgYnVuY2ggb2YgZnVuY3Rpb25zIGluIHV0aWwuYyBzY2FuIHN0cmluZ3MgbG9va2luZyBmb3IgY2VydGFpbiBjaGFyYWN0ZXJzLgotICogVG8gbWFrZSB0aGF0IG1vcmUgZWZmaWNpZW50IHdlIGVuY29kZSBhIGxvb2t1cCB0YWJsZS4gIFRoZSB0ZXN0X2NoYXJfdGFibGUKLSAqIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGdlbl90ZXN0X2NoYXIuYy4KLSAqLwotI2luY2x1ZGUgInRlc3RfY2hhci5oIgotCi0vKiB3ZSBhc3N1bWUgdGhlIGZvbGtzIHVzaW5nIHRoaXMgZW5zdXJlIDAgPD0gYyA8IDI1Ni4uLiB3aGljaCBtZWFucwotICogeW91IG5lZWQgYSBjYXN0IHRvICh1bnNpZ25lZCBjaGFyKSBmaXJzdCwgeW91IGNhbid0IGp1c3QgcGx1ZyBhCi0gKiBjaGFyIGluIGhlcmUgYW5kIGdldCBpdCB0byB3b3JrLCBiZWNhdXNlIGlmIGNoYXIgaXMgc2lnbmVkIHRoZW4gaXQKLSAqIHdpbGwgZmlyc3QgYmUgc2lnbiBleHRlbmRlZC4KLSAqLwotI2RlZmluZSBURVNUX0NIQVIoYywgZikJKHRlc3RfY2hhcl90YWJsZVsodW5zaWduZWQpKGMpXSAmIChmKSkKLQotLyoKLSAqIEV4YW1pbmUgYSBmaWVsZCB2YWx1ZSAoc3VjaCBhcyBhIG1lZGlhLS9jb250ZW50LXR5cGUpIHN0cmluZyBhbmQgcmV0dXJuCi0gKiBpdCBzYW5zIGFueSBwYXJhbWV0ZXJzOyBlLmcuLCBzdHJpcCBvZmYgYW55ICc7Y2hhcnNldD1mb28nIGFuZCB0aGUgbGlrZS4KLSAqLwotQVBJX0VYUE9SVChjaGFyICopIGFwX2ZpZWxkX25vcGFyYW0oYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyICppbnR5cGUpCi17Ci0gICAgY29uc3QgY2hhciAqc2VtaTsKLQotICAgIHNlbWkgPSBzdHJjaHIoaW50eXBlLCAnOycpOwotICAgIGlmIChzZW1pID09IE5VTEwpIHsKLQlyZXR1cm4gYXBfcHN0cmR1cChwLCBpbnR5cGUpOwotICAgIH0gCi0gICAgZWxzZSB7Ci0Jd2hpbGUgKChzZW1pID4gaW50eXBlKSAmJiBhcF9pc3NwYWNlKHNlbWlbLTFdKSkgewotCSAgICBzZW1pLS07Ci0JfQotCXJldHVybiBhcF9wc3RybmR1cChwLCBpbnR5cGUsIHNlbWkgLSBpbnR5cGUpOwotICAgIH0KLX0KLQotQVBJX0VYUE9SVChjaGFyICopIGFwX2h0X3RpbWUoYXBfY29udGV4dF90ICpwLCBhcF90aW1lX3QgdCwgY29uc3QgY2hhciAqZm10LCBpbnQgZ210KQotewotICAgIGFwX2ludDMyX3QgcmV0Y29kZTsKLSAgICBjaGFyIHRzW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyIHRmW01BWF9TVFJJTkdfTEVOXTsKLSAgICBhcF9leHBsb2RlZF90aW1lX3QgeHQ7Ci0KLSAgICBpZiAoZ210KSB7Ci0JY29uc3QgY2hhciAqZjsKLQljaGFyICpzdHJwOwotCi0gICAgICAgIGFwX2V4cGxvZGVfZ210KCZ4dCwgdCk7Ci0JLyogQ29udmVydCAlWiB0byAiR01UIiBhbmQgJXogdG8gIiswMDAwIjsKLQkgKiBvbiBob3N0cyB0aGF0IGRvIG5vdCBoYXZlIGEgdGltZSB6b25lIHN0cmluZyBpbiBzdHJ1Y3QgdG0sCi0JICogc3RyZnRpbWUgbXVzdCBhc3N1bWUgaXRzIGFyZ3VtZW50IGlzIGxvY2FsIHRpbWUuCi0JICovCi0JZm9yKHN0cnAgPSB0ZiwgZiA9IGZtdDsgc3RycCA8IHRmICsgc2l6ZW9mKHRmKSAtIDYgJiYgKCpzdHJwID0gKmYpCi0JICAgIDsgZisrLCBzdHJwKyspIHsKLQkgICAgaWYgKCpmICE9ICclJykgY29udGludWU7Ci0JICAgIHN3aXRjaCAoZlsxXSkgewotCSAgICBjYXNlICclJzoKLQkJKisrc3RycCA9ICorK2Y7Ci0JCWJyZWFrOwotCSAgICBjYXNlICdaJzoKLQkJKnN0cnArKyA9ICdHJzsKLQkJKnN0cnArKyA9ICdNJzsKLQkJKnN0cnAgPSAnVCc7Ci0JCWYrKzsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgJ3onOiAvKiBjb21tb24gZXh0ZW5zaW9uICovCi0JCSpzdHJwKysgPSAnKyc7Ci0JCSpzdHJwKysgPSAnMCc7Ci0JCSpzdHJwKysgPSAnMCc7Ci0JCSpzdHJwKysgPSAnMCc7Ci0JCSpzdHJwID0gJzAnOwotCQlmKys7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotCSpzdHJwID0gJ1wwJzsKLQlmbXQgPSB0ZjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGFwX2V4cGxvZGVfbG9jYWx0aW1lKCZ4dCwgdCk7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgcmV0dXJuIGNvZGU/ICovCi0gICAgYXBfc3RyZnRpbWUodHMsICZyZXRjb2RlLCBNQVhfU1RSSU5HX0xFTiwgZm10LCAmeHQpOwotICAgIHRzW01BWF9TVFJJTkdfTEVOIC0gMV0gPSAnXDAnOwotICAgIHJldHVybiBhcF9wc3RyZHVwKHAsIHRzKTsKLX0KLQotLyogUm95IG93ZXMgUm9iIGJlZXIuICovCi0vKiBSb2Igb3dlcyBSb3kgZGlubmVyLiAqLwotCi0vKiBUaGVzZSBsZWdhY3kgY29tbWVudHMgd291bGQgbWFrZSBhIGxvdCBtb3JlIHNlbnNlIGlmIFJveSBoYWRuJ3QKLSAqIHJlcGxhY2VkIHRoZSBvbGQgbGF0ZXJfdGhhbigpIHJvdXRpbmUgd2l0aCB1dGlsX2RhdGUuYy4KLSAqCi0gKiBXZWxsLCBva2F5LCB0aGV5IHN0aWxsIHdvdWxkbid0IG1ha2UgYW55IHNlbnNlLgotICovCi0KLS8qIE1hdGNoID0gMCwgTm9NYXRjaCA9IDEsIEFib3J0ID0gLTEKLSAqIEJhc2VkIGxvb3NlbHkgb24gc2VjdGlvbnMgb2Ygd2lsZG1hdC5jIGJ5IFJpY2ggU2FsegotICogSG1tbS4uLiBzaG91bGRuJ3QgdGhpcyByZWFsbHkgZ28gY29tcG9uZW50IGJ5IGNvbXBvbmVudD8KLSAqLwotQVBJX0VYUE9SVChpbnQpIGFwX3N0cmNtcF9tYXRjaChjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmV4cCkKLXsKLSAgICBpbnQgeCwgeTsKLQotICAgIGZvciAoeCA9IDAsIHkgPSAwOyBleHBbeV07ICsreSwgKyt4KSB7Ci0JaWYgKCghc3RyW3hdKSAmJiAoZXhwW3ldICE9ICcqJykpCi0JICAgIHJldHVybiAtMTsKLQlpZiAoZXhwW3ldID09ICcqJykgewotCSAgICB3aGlsZSAoZXhwWysreV0gPT0gJyonKTsKLQkgICAgaWYgKCFleHBbeV0pCi0JCXJldHVybiAwOwotCSAgICB3aGlsZSAoc3RyW3hdKSB7Ci0JCWludCByZXQ7Ci0JCWlmICgocmV0ID0gYXBfc3RyY21wX21hdGNoKCZzdHJbeCsrXSwgJmV4cFt5XSkpICE9IDEpCi0JCSAgICByZXR1cm4gcmV0OwotCSAgICB9Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0JZWxzZSBpZiAoKGV4cFt5XSAhPSAnPycpICYmIChzdHJbeF0gIT0gZXhwW3ldKSkKLQkgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiAoc3RyW3hdICE9ICdcMCcpOwotfQotCi1BUElfRVhQT1JUKGludCkgYXBfc3RyY2FzZWNtcF9tYXRjaChjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmV4cCkKLXsKLSAgICBpbnQgeCwgeTsKLQotICAgIGZvciAoeCA9IDAsIHkgPSAwOyBleHBbeV07ICsreSwgKyt4KSB7Ci0JaWYgKCghc3RyW3hdKSAmJiAoZXhwW3ldICE9ICcqJykpCi0JICAgIHJldHVybiAtMTsKLQlpZiAoZXhwW3ldID09ICcqJykgewotCSAgICB3aGlsZSAoZXhwWysreV0gPT0gJyonKTsKLQkgICAgaWYgKCFleHBbeV0pCi0JCXJldHVybiAwOwotCSAgICB3aGlsZSAoc3RyW3hdKSB7Ci0JCWludCByZXQ7Ci0JCWlmICgocmV0ID0gYXBfc3RyY2FzZWNtcF9tYXRjaCgmc3RyW3grK10sICZleHBbeV0pKSAhPSAxKQotCQkgICAgcmV0dXJuIHJldDsKLQkgICAgfQotCSAgICByZXR1cm4gLTE7Ci0JfQotCWVsc2UgaWYgKChleHBbeV0gIT0gJz8nKSAmJiAoYXBfdG9sb3dlcihzdHJbeF0pICE9IGFwX3RvbG93ZXIoZXhwW3ldKSkpCi0JICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gKHN0clt4XSAhPSAnXDAnKTsKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX2lzX21hdGNoZXhwKGNvbnN0IGNoYXIgKnN0cikKLXsKLSAgICByZWdpc3RlciBpbnQgeDsKLQotICAgIGZvciAoeCA9IDA7IHN0clt4XTsgeCsrKQotCWlmICgoc3RyW3hdID09ICcqJykgfHwgKHN0clt4XSA9PSAnPycpKQotCSAgICByZXR1cm4gMTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIEhlcmUncyBhIHBvb2wtYmFzZWQgaW50ZXJmYWNlIHRvIFBPU0lYIHJlZ2V4J3MgcmVnY29tcCgpLgotICogTm90ZSB0aGF0IHdlIHJldHVybiByZWdleF90IGluc3RlYWQgb2YgYmVpbmcgcGFzc2VkIG9uZS4KLSAqIFRoZSByZWFzb24gaXMgdGhhdCBpZiB5b3UgdXNlIGFuIGFscmVhZHktdXNlZCByZWdleF90IHN0cnVjdHVyZSwKLSAqIHRoZSBtZW1vcnkgdGhhdCB5b3UndmUgYWxyZWFkeSBhbGxvY2F0ZWQgZ2V0cyBmb3Jnb3R0ZW4sIGFuZAotICogcmVnZnJlZSgpIGRvZXNuJ3QgY2xlYXIgaXQuIFNvIHdlIGRvbid0IGFsbG93IGl0LgotICovCi0KLXN0YXRpYyBhcF9zdGF0dXNfdCByZWdleF9jbGVhbnVwKHZvaWQgKnByZWcpCi17Ci0gICAgcmVnZnJlZSgocmVnZXhfdCAqKSBwcmVnKTsKLSAgICByZXR1cm4gQVBSX1NVQ0NFU1M7Ci19Ci0KLUFQSV9FWFBPUlQocmVnZXhfdCAqKSBhcF9wcmVnY29tcChhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKnBhdHRlcm4sCi0JCQkJICAgaW50IGNmbGFncykKLXsKLSAgICByZWdleF90ICpwcmVnID0gYXBfcGFsbG9jKHAsIHNpemVvZihyZWdleF90KSk7Ci0KLSAgICBpZiAocmVnY29tcChwcmVnLCBwYXR0ZXJuLCBjZmxhZ3MpKSB7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgYXBfcmVnaXN0ZXJfY2xlYW51cChwLCAodm9pZCAqKSBwcmVnLCByZWdleF9jbGVhbnVwLCByZWdleF9jbGVhbnVwKTsKLQotICAgIHJldHVybiBwcmVnOwotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX3ByZWdmcmVlKGFwX2NvbnRleHRfdCAqcCwgcmVnZXhfdCAqIHJlZykKLXsKLSAgICBhcF9ibG9ja19hbGFybXMoKTsKLSAgICByZWdmcmVlKHJlZyk7Ci0gICAgYXBfa2lsbF9jbGVhbnVwKHAsICh2b2lkICopIHJlZywgcmVnZXhfY2xlYW51cCk7Ci0gICAgYXBfdW5ibG9ja19hbGFybXMoKTsKLX0KLQotLyogCi0gKiBBcGFjaGUgc3R1YiBmdW5jdGlvbiBmb3IgdGhlIHJlZ2V4IGxpYnJhcmllcyByZWdleGVjKCkgdG8gbWFrZSBzdXJlIHRoZQotICogd2hvbGUgcmVnZXgoMykgQVBJIGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBBcGFjaGUgKGV4cG9ydGVkKSBuYW1lc3BhY2UuCi0gKiBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciB0aGUgRFNPIHNpdHVhdGlvbnMgb2YgbW9kdWxlcy4KLSAqIERPIE5PVCBNQUtFIEEgTUFDUk8gT1VUIE9GIFRISVMgRlVOQ1RJT04hCi0gKi8KLUFQSV9FWFBPUlQoaW50KSBhcF9yZWdleGVjKGNvbnN0IHJlZ2V4X3QgKnByZWcsIGNvbnN0IGNoYXIgKnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBubWF0Y2gsIHJlZ21hdGNoX3QgcG1hdGNoW10sIGludCBlZmxhZ3MpCi17Ci0gICAgcmV0dXJuIHJlZ2V4ZWMocHJlZywgc3RyaW5nLCBubWF0Y2gsIHBtYXRjaCwgZWZsYWdzKTsKLX0KLQotQVBJX0VYUE9SVChzaXplX3QpIGFwX3JlZ2Vycm9yKGludCBlcnJjb2RlLCBjb25zdCByZWdleF90ICpwcmVnLCBjaGFyICplcnJidWYsIHNpemVfdCBlcnJidWZfc2l6ZSkKLXsKLSAgICByZXR1cm4gcmVnZXJyb3IoZXJyY29kZSwgcHJlZywgZXJyYnVmLCBlcnJidWZfc2l6ZSk7Ci19Ci0KLQotLyogVGhpcyBmdW5jdGlvbiBzdWJzdGl0dXRlcyBmb3IgJDAtJDksIGZpbGxpbmcgaW4gcmVndWxhciBleHByZXNzaW9uCi0gKiBzdWJtYXRjaGVzLiBQYXNzIGl0IHRoZSBzYW1lIG5tYXRjaCBhbmQgcG1hdGNoIGFyZ3VtZW50cyB0aGF0IHlvdQotICogcGFzc2VkIGFwX3JlZ2V4ZWMoKS4gcG1hdGNoIHNob3VsZCBub3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIG51bWJlcgotICogb2Ygc3ViZXhwcmVzc2lvbnMgLSBpLmUuIG9uZSBtb3JlIHRoYW4gdGhlIHJlX25zdWIgbWVtYmVyIG9mIHJlZ2V4X3QuCi0gKgotICogaW5wdXQgc2hvdWxkIGJlIHRoZSBzdHJpbmcgd2l0aCB0aGUgJC1leHByZXNzaW9ucywgc291cmNlIHNob3VsZCBiZSB0aGUKLSAqIHN0cmluZyB0aGF0IHdhcyBtYXRjaGVkIGFnYWluc3QuCi0gKgotICogSXQgcmV0dXJucyB0aGUgc3Vic3RpdHV0ZWQgc3RyaW5nLCBvciBOVUxMIG9uIGVycm9yLgotICoKLSAqIFBhcnRzIG9mIHRoaXMgY29kZSBhcmUgYmFzZWQgb24gSGVucnkgU3BlbmNlcidzIHJlZ3N1YigpLCBmcm9tIGhpcwotICogQVQmVCBWOCByZWdleHAgcGFja2FnZS4KLSAqLwotCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfcHJlZ3N1YihhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKmlucHV0LCBjb25zdCBjaGFyICpzb3VyY2UsCi0JCQkgICBzaXplX3Qgbm1hdGNoLCByZWdtYXRjaF90IHBtYXRjaFtdKQotewotICAgIGNvbnN0IGNoYXIgKnNyYyA9IGlucHV0OwotICAgIGNoYXIgKmRlc3QsICpkc3Q7Ci0gICAgY2hhciBjOwotICAgIHNpemVfdCBubzsKLSAgICBpbnQgbGVuOwotCi0gICAgaWYgKCFzb3VyY2UpCi0JcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCFubWF0Y2gpCi0JcmV0dXJuIGFwX3BzdHJkdXAocCwgc3JjKTsKLQotICAgIC8qIEZpcnN0IHBhc3MsIGZpbmQgdGhlIHNpemUgKi8KLQotICAgIGxlbiA9IDA7Ci0KLSAgICB3aGlsZSAoKGMgPSAqc3JjKyspICE9ICdcMCcpIHsKLQlpZiAoYyA9PSAnJicpCi0JICAgIG5vID0gMDsKLQllbHNlIGlmIChjID09ICckJyAmJiBhcF9pc2RpZ2l0KCpzcmMpKQotCSAgICBubyA9ICpzcmMrKyAtICcwJzsKLQllbHNlCi0JICAgIG5vID0gMTA7Ci0KLQlpZiAobm8gPiA5KSB7CQkvKiBPcmRpbmFyeSBjaGFyYWN0ZXIuICovCi0JICAgIGlmIChjID09ICdcXCcgJiYgKCpzcmMgPT0gJyQnIHx8ICpzcmMgPT0gJyYnKSkKLQkJYyA9ICpzcmMrKzsKLQkgICAgbGVuKys7Ci0JfQotCWVsc2UgaWYgKG5vIDwgbm1hdGNoICYmIHBtYXRjaFtub10ucm1fc28gPCBwbWF0Y2hbbm9dLnJtX2VvKSB7Ci0JICAgIGxlbiArPSBwbWF0Y2hbbm9dLnJtX2VvIC0gcG1hdGNoW25vXS5ybV9zbzsKLQl9Ci0KLSAgICB9Ci0KLSAgICBkZXN0ID0gZHN0ID0gYXBfcGNhbGxvYyhwLCBsZW4gKyAxKTsKLQotICAgIC8qIE5vdyBhY3R1YWxseSBmaWxsIGluIHRoZSBzdHJpbmcgKi8KLQotICAgIHNyYyA9IGlucHV0OwotCi0gICAgd2hpbGUgKChjID0gKnNyYysrKSAhPSAnXDAnKSB7Ci0JaWYgKGMgPT0gJyYnKQotCSAgICBubyA9IDA7Ci0JZWxzZSBpZiAoYyA9PSAnJCcgJiYgYXBfaXNkaWdpdCgqc3JjKSkKLQkgICAgbm8gPSAqc3JjKysgLSAnMCc7Ci0JZWxzZQotCSAgICBubyA9IDEwOwotCi0JaWYgKG5vID4gOSkgewkJLyogT3JkaW5hcnkgY2hhcmFjdGVyLiAqLwotCSAgICBpZiAoYyA9PSAnXFwnICYmICgqc3JjID09ICckJyB8fCAqc3JjID09ICcmJykpCi0JCWMgPSAqc3JjKys7Ci0JICAgICpkc3QrKyA9IGM7Ci0JfQotCWVsc2UgaWYgKG5vIDwgbm1hdGNoICYmIHBtYXRjaFtub10ucm1fc28gPCBwbWF0Y2hbbm9dLnJtX2VvKSB7Ci0JICAgIGxlbiA9IHBtYXRjaFtub10ucm1fZW8gLSBwbWF0Y2hbbm9dLnJtX3NvOwotCSAgICBtZW1jcHkoZHN0LCBzb3VyY2UgKyBwbWF0Y2hbbm9dLnJtX3NvLCBsZW4pOwotCSAgICBkc3QgKz0gbGVuOwotCX0KLQotICAgIH0KLSAgICAqZHN0ID0gJ1wwJzsKLQotICAgIHJldHVybiBkZXN0OwotfQotCi0vKgotICogUGFyc2UgLi4gc28gd2UgZG9uJ3QgY29tcHJvbWlzZSBzZWN1cml0eQotICovCi1BUElfRVhQT1JUKHZvaWQpIGFwX2dldHBhcmVudHMoY2hhciAqbmFtZSkKLXsKLSAgICBpbnQgbCwgdzsKLQotICAgIC8qIEZvdXIgcGFzZXNlcywgYXMgcGVyIFJGQyAxODA4ICovCi0gICAgLyogYSkgcmVtb3ZlIC4vIHBhdGggc2VnbWVudHMgKi8KLQotICAgIGZvciAobCA9IDAsIHcgPSAwOyBuYW1lW2xdICE9ICdcMCc7KSB7Ci0JaWYgKG5hbWVbbF0gPT0gJy4nICYmIG5hbWVbbCArIDFdID09ICcvJyAmJiAobCA9PSAwIHx8IG5hbWVbbCAtIDFdID09ICcvJykpCi0JICAgIGwgKz0gMjsKLQllbHNlCi0JICAgIG5hbWVbdysrXSA9IG5hbWVbbCsrXTsKLSAgICB9Ci0KLSAgICAvKiBiKSByZW1vdmUgdHJhaWxpbmcgLiBwYXRoLCBzZWdtZW50ICovCi0gICAgaWYgKHcgPT0gMSAmJiBuYW1lWzBdID09ICcuJykKLQl3LS07Ci0gICAgZWxzZSBpZiAodyA+IDEgJiYgbmFtZVt3IC0gMV0gPT0gJy4nICYmIG5hbWVbdyAtIDJdID09ICcvJykKLQl3LS07Ci0gICAgbmFtZVt3XSA9ICdcMCc7Ci0KLSAgICAvKiBjKSByZW1vdmUgYWxsIHh4Ly4uLyBzZWdtZW50cy4gKGluY2x1ZGluZyBsZWFkaW5nIC4uLyBhbmQgLy4uLykgKi8KLSAgICBsID0gMDsKLQotICAgIHdoaWxlIChuYW1lW2xdICE9ICdcMCcpIHsKLQlpZiAobmFtZVtsXSA9PSAnLicgJiYgbmFtZVtsICsgMV0gPT0gJy4nICYmIG5hbWVbbCArIDJdID09ICcvJyAmJgotCSAgICAobCA9PSAwIHx8IG5hbWVbbCAtIDFdID09ICcvJykpIHsKLQkgICAgcmVnaXN0ZXIgaW50IG0gPSBsICsgMywgbjsKLQotCSAgICBsID0gbCAtIDI7Ci0JICAgIGlmIChsID49IDApIHsKLQkJd2hpbGUgKGwgPj0gMCAmJiBuYW1lW2xdICE9ICcvJykKLQkJICAgIGwtLTsKLQkJbCsrOwotCSAgICB9Ci0JICAgIGVsc2UKLQkJbCA9IDA7Ci0JICAgIG4gPSBsOwotCSAgICB3aGlsZSAoKG5hbWVbbl0gPSBuYW1lW21dKSkKLQkJKCsrbiwgKyttKTsKLQl9Ci0JZWxzZQotCSAgICArK2w7Ci0gICAgfQotCi0gICAgLyogZCkgcmVtb3ZlIHRyYWlsaW5nIHh4Ly4uIHNlZ21lbnQuICovCi0gICAgaWYgKGwgPT0gMiAmJiBuYW1lWzBdID09ICcuJyAmJiBuYW1lWzFdID09ICcuJykKLQluYW1lWzBdID0gJ1wwJzsKLSAgICBlbHNlIGlmIChsID4gMiAmJiBuYW1lW2wgLSAxXSA9PSAnLicgJiYgbmFtZVtsIC0gMl0gPT0gJy4nICYmIG5hbWVbbCAtIDNdID09ICcvJykgewotCWwgPSBsIC0gNDsKLQlpZiAobCA+PSAwKSB7Ci0JICAgIHdoaWxlIChsID49IDAgJiYgbmFtZVtsXSAhPSAnLycpCi0JCWwtLTsKLQkgICAgbCsrOwotCX0KLQllbHNlCi0JICAgIGwgPSAwOwotCW5hbWVbbF0gPSAnXDAnOwotICAgIH0KLX0KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9ubzJzbGFzaChjaGFyICpuYW1lKQotewotICAgIGNoYXIgKmQsICpzOwotCi0gICAgcyA9IGQgPSBuYW1lOwotCi0jaWZkZWYgV0lOMzIKLSAgICAvKiBDaGVjayBmb3IgVU5DIG5hbWVzLiAgTGVhdmUgbGVhZGluZyB0d28gc2xhc2hlcy4gKi8KLSAgICBpZiAoc1swXSA9PSAnLycgJiYgc1sxXSA9PSAnLycpCi0gICAgICAgICpkKysgPSAqcysrOwotI2VuZGlmCi0KLSAgICB3aGlsZSAoKnMpIHsKLQlpZiAoKCpkKysgPSAqcykgPT0gJy8nKSB7Ci0JICAgIGRvIHsKLQkJKytzOwotCSAgICB9IHdoaWxlICgqcyA9PSAnLycpOwotCX0KLQllbHNlIHsKLQkgICAgKytzOwotCX0KLSAgICB9Ci0gICAgKmQgPSAnXDAnOwotfQotCi0KLS8qCi0gKiBjb3B5IGF0IG1vc3QgbiBsZWFkaW5nIGRpcmVjdG9yaWVzIG9mIHMgaW50byBkCi0gKiBkIHNob3VsZCBiZSBhdCBsZWFzdCBhcyBsYXJnZSBhcyBzIHBsdXMgMSBleHRyYSBieXRlCi0gKiBhc3N1bWVzIG4gPiAwCi0gKiB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBldmVyIHVzZWZ1bCBwb2ludGVyIHRvIHRoZSB0cmFpbGluZyBcMCBvZiBkCi0gKgotICogZXhhbXBsZXM6Ci0gKiAgICAvYS9iLCAxICA9PT4gLwotICogICAgL2EvYiwgMiAgPT0+IC9hLwotICogICAgL2EvYiwgMyAgPT0+IC9hL2IvCi0gKiAgICAvYS9iLCA0ICA9PT4gL2EvYi8KLSAqLwotQVBJX0VYUE9SVChjaGFyICopIGFwX21ha2VfZGlyc3RyX3ByZWZpeChjaGFyICpkLCBjb25zdCBjaGFyICpzLCBpbnQgbikKLXsKLSAgICBmb3IgKDs7KSB7Ci0JaWYgKCpzID09ICdcMCcgfHwgKCpzID09ICcvJyAmJiAoLS1uKSA9PSAwKSkgewotCSAgICAqZCA9ICcvJzsKLQkgICAgYnJlYWs7Ci0JfQotCSpkKysgPSAqcysrOwotICAgIH0KLSAgICAqKytkID0gMDsKLSAgICByZXR1cm4gKGQpOwotfQotCi0KLS8qCi0gKiByZXR1cm4gdGhlIHBhcmVudCBkaXJlY3RvcnkgbmFtZSBpbmNsdWRpbmcgdHJhaWxpbmcgLyBvZiB0aGUgZmlsZSBzCi0gKi8KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9tYWtlX2RpcnN0cl9wYXJlbnQoYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyICpzKQotewotICAgIGNoYXIgKmxhc3Rfc2xhc2ggPSBzdHJyY2hyKHMsICcvJyk7Ci0gICAgY2hhciAqZDsKLSAgICBpbnQgbDsKLQotICAgIGlmIChsYXN0X3NsYXNoID09IE5VTEwpIHsKLQkvKiBYWFg6IHdlbGwgdGhpcyBpcyByZWFsbHkgYnJva2VuIGlmIHRoaXMgaGFwcGVucyAqLwotCXJldHVybiAoYXBfcHN0cmR1cChwLCAiLyIpKTsKLSAgICB9Ci0gICAgbCA9IChsYXN0X3NsYXNoIC0gcykgKyAxOwotICAgIGQgPSBhcF9wYWxsb2MocCwgbCArIDEpOwotICAgIG1lbWNweShkLCBzLCBsKTsKLSAgICBkW2xdID0gMDsKLSAgICByZXR1cm4gKGQpOwotfQotCi0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQuICBVc2Ugb25lIG9mIHRoZSBwcmVjZWVkaW5nIHR3byBmdW5jdGlvbnMKLSAqIHdoaWNoIGFyZSBmYXN0ZXIuCi0gKi8KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9tYWtlX2RpcnN0cihhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKnMsIGludCBuKQotewotICAgIHJlZ2lzdGVyIGludCB4LCBmOwotICAgIGNoYXIgKnJlczsKLQotICAgIGZvciAoeCA9IDAsIGYgPSAwOyBzW3hdOyB4KyspIHsKLQlpZiAoc1t4XSA9PSAnLycpCi0JICAgIGlmICgoKytmKSA9PSBuKSB7Ci0JCXJlcyA9IGFwX3BhbGxvYyhwLCB4ICsgMik7Ci0JCW1lbWNweShyZXMsIHMsIHgpOwotCQlyZXNbeF0gPSAnLyc7Ci0JCXJlc1t4ICsgMV0gPSAnXDAnOwotCQlyZXR1cm4gcmVzOwotCSAgICB9Ci0gICAgfQotCi0gICAgaWYgKHNbc3RybGVuKHMpIC0gMV0gPT0gJy8nKQotCXJldHVybiBhcF9wc3RyZHVwKHAsIHMpOwotICAgIGVsc2UKLQlyZXR1cm4gYXBfcHN0cmNhdChwLCBzLCAiLyIsIE5VTEwpOwotfQotCi1BUElfRVhQT1JUKGludCkgYXBfY291bnRfZGlycyhjb25zdCBjaGFyICpwYXRoKQotewotICAgIHJlZ2lzdGVyIGludCB4LCBuOwotCi0gICAgZm9yICh4ID0gMCwgbiA9IDA7IHBhdGhbeF07IHgrKykKLQlpZiAocGF0aFt4XSA9PSAnLycpCi0JICAgIG4rKzsKLSAgICByZXR1cm4gbjsKLX0KLQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX2NoZGlyX2ZpbGUoY29uc3QgY2hhciAqZmlsZSkKLXsKLSAgICBjb25zdCBjaGFyICp4OwotICAgIGNoYXIgYnVmW0hVR0VfU1RSSU5HX0xFTl07Ci0KLSAgICB4ID0gc3RycmNocihmaWxlLCAnLycpOwotICAgIGlmICh4ID09IE5VTEwpIHsKLQljaGRpcihmaWxlKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoeCAtIGZpbGUgPCBzaXplb2YoYnVmKSAtIDEpIHsKLQltZW1jcHkoYnVmLCBmaWxlLCB4IC0gZmlsZSk7Ci0JYnVmW3ggLSBmaWxlXSA9ICdcMCc7Ci0JY2hkaXIoYnVmKTsKLSAgICB9Ci0gICAgLyogWFhYOiB3ZWxsLCB0aGlzIGlzIGEgc2lsbHkgZnVuY3Rpb24sIG5vIG1ldGhvZCBvZiByZXBvcnRpbmcgYW4KLSAgICAgKiBlcnJvci4uLiBhaCB3ZWxsLiAqLwotfQotCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfZ2V0d29yZF9uYyhhcF9jb250ZXh0X3QgKmF0cmFucywgY2hhciAqKmxpbmUsIGNoYXIgc3RvcCkKLXsKLSAgICByZXR1cm4gYXBfZ2V0d29yZChhdHJhbnMsIChjb25zdCBjaGFyICoqKSBsaW5lLCBzdG9wKTsKLX0KLQotQVBJX0VYUE9SVChjaGFyICopIGFwX2dldHdvcmQoYXBfY29udGV4dF90ICphdHJhbnMsIGNvbnN0IGNoYXIgKipsaW5lLCBjaGFyIHN0b3ApCi17Ci0gICAgY2hhciAqcG9zID0gc3RyY2hyKCpsaW5lLCBzdG9wKTsKLSAgICBjaGFyICpyZXM7Ci0KLSAgICBpZiAoIXBvcykgewotCXJlcyA9IGFwX3BzdHJkdXAoYXRyYW5zLCAqbGluZSk7Ci0JKmxpbmUgKz0gc3RybGVuKCpsaW5lKTsKLQlyZXR1cm4gcmVzOwotICAgIH0KLQotICAgIHJlcyA9IGFwX3BzdHJuZHVwKGF0cmFucywgKmxpbmUsIHBvcyAtICpsaW5lKTsKLQotICAgIHdoaWxlICgqcG9zID09IHN0b3ApIHsKLQkrK3BvczsKLSAgICB9Ci0KLSAgICAqbGluZSA9IHBvczsKLQotICAgIHJldHVybiByZXM7Ci19Ci0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9nZXR3b3JkX3doaXRlX25jKGFwX2NvbnRleHRfdCAqYXRyYW5zLCBjaGFyICoqbGluZSkKLXsKLSAgICByZXR1cm4gYXBfZ2V0d29yZF93aGl0ZShhdHJhbnMsIChjb25zdCBjaGFyICoqKSBsaW5lKTsKLX0KLQotQVBJX0VYUE9SVChjaGFyICopIGFwX2dldHdvcmRfd2hpdGUoYXBfY29udGV4dF90ICphdHJhbnMsIGNvbnN0IGNoYXIgKipsaW5lKQotewotICAgIGludCBwb3MgPSAtMSwgeDsKLSAgICBjaGFyICpyZXM7Ci0KLSAgICBmb3IgKHggPSAwOyAoKmxpbmUpW3hdOyB4KyspIHsKLQlpZiAoYXBfaXNzcGFjZSgoKmxpbmUpW3hdKSkgewotCSAgICBwb3MgPSB4OwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gICAgaWYgKHBvcyA9PSAtMSkgewotCXJlcyA9IGFwX3BzdHJkdXAoYXRyYW5zLCAqbGluZSk7Ci0JKmxpbmUgKz0gc3RybGVuKCpsaW5lKTsKLQlyZXR1cm4gcmVzOwotICAgIH0KLQotICAgIHJlcyA9IGFwX3BhbGxvYyhhdHJhbnMsIHBvcyArIDEpOwotICAgIGFwX2NweXN0cm4ocmVzLCAqbGluZSwgcG9zICsgMSk7Ci0KLSAgICB3aGlsZSAoYXBfaXNzcGFjZSgoKmxpbmUpW3Bvc10pKQotCSsrcG9zOwotCi0gICAgKmxpbmUgKz0gcG9zOwotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotQVBJX0VYUE9SVChjaGFyICopIGFwX2dldHdvcmRfbnVsbHNfbmMoYXBfY29udGV4dF90ICphdHJhbnMsIGNoYXIgKipsaW5lLCBjaGFyIHN0b3ApCi17Ci0gICAgcmV0dXJuIGFwX2dldHdvcmRfbnVsbHMoYXRyYW5zLCAoY29uc3QgY2hhciAqKikgbGluZSwgc3RvcCk7Ci19Ci0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9nZXR3b3JkX251bGxzKGFwX2NvbnRleHRfdCAqYXRyYW5zLCBjb25zdCBjaGFyICoqbGluZSwgY2hhciBzdG9wKQotewotICAgIGNoYXIgKnBvcyA9IHN0cmNocigqbGluZSwgc3RvcCk7Ci0gICAgY2hhciAqcmVzOwotCi0gICAgaWYgKCFwb3MpIHsKLQlyZXMgPSBhcF9wc3RyZHVwKGF0cmFucywgKmxpbmUpOwotCSpsaW5lICs9IHN0cmxlbigqbGluZSk7Ci0JcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICByZXMgPSBhcF9wc3RybmR1cChhdHJhbnMsICpsaW5lLCBwb3MgLSAqbGluZSk7Ci0KLSAgICArK3BvczsKLQotICAgICpsaW5lID0gcG9zOwotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotLyogR2V0IGEgd29yZCwgKG5ldykgY29uZmlnLWZpbGUgc3R5bGUgLS0tIHF1b3RlZCBzdHJpbmdzIGFuZCBiYWNrc2xhc2hlcwotICogYWxsIGhvbm9yZWQKLSAqLwotCi1zdGF0aWMgY2hhciAqc3Vic3RyaW5nX2NvbmYoYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyICpzdGFydCwgaW50IGxlbiwgY2hhciBxdW90ZSkKLXsKLSAgICBjaGFyICpyZXN1bHQgPSBhcF9wYWxsb2MocCwgbGVuICsgMik7Ci0gICAgY2hhciAqcmVzcCA9IHJlc3VsdDsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgewotCWlmIChzdGFydFtpXSA9PSAnXFwnICYmIChzdGFydFtpICsgMV0gPT0gJ1xcJwotCQkJCSB8fCAocXVvdGUgJiYgc3RhcnRbaSArIDFdID09IHF1b3RlKSkpCi0JICAgICpyZXNwKysgPSBzdGFydFsrK2ldOwotCWVsc2UKLQkgICAgKnJlc3ArKyA9IHN0YXJ0W2ldOwotICAgIH0KLQotICAgICpyZXNwKysgPSAnXDAnOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9nZXR3b3JkX2NvbmZfbmMoYXBfY29udGV4dF90ICpwLCBjaGFyICoqbGluZSkKLXsKLSAgICByZXR1cm4gYXBfZ2V0d29yZF9jb25mKHAsIChjb25zdCBjaGFyICoqKSBsaW5lKTsKLX0KLQotQVBJX0VYUE9SVChjaGFyICopIGFwX2dldHdvcmRfY29uZihhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKipsaW5lKQotewotICAgIGNvbnN0IGNoYXIgKnN0ciA9ICpsaW5lLCAqc3RyZW5kOwotICAgIGNoYXIgKnJlczsKLSAgICBjaGFyIHF1b3RlOwotCi0gICAgd2hpbGUgKCpzdHIgJiYgYXBfaXNzcGFjZSgqc3RyKSkKLQkrK3N0cjsKLQotICAgIGlmICghKnN0cikgewotCSpsaW5lID0gc3RyOwotCXJldHVybiAiIjsKLSAgICB9Ci0KLSAgICBpZiAoKHF1b3RlID0gKnN0cikgPT0gJyInIHx8IHF1b3RlID09ICdcJycpIHsKLQlzdHJlbmQgPSBzdHIgKyAxOwotCXdoaWxlICgqc3RyZW5kICYmICpzdHJlbmQgIT0gcXVvdGUpIHsKLQkgICAgaWYgKCpzdHJlbmQgPT0gJ1xcJyAmJiBzdHJlbmRbMV0gJiYgc3RyZW5kWzFdID09IHF1b3RlKQotCQlzdHJlbmQgKz0gMjsKLQkgICAgZWxzZQotCQkrK3N0cmVuZDsKLQl9Ci0JcmVzID0gc3Vic3RyaW5nX2NvbmYocCwgc3RyICsgMSwgc3RyZW5kIC0gc3RyIC0gMSwgcXVvdGUpOwotCi0JaWYgKCpzdHJlbmQgPT0gcXVvdGUpCi0JICAgICsrc3RyZW5kOwotICAgIH0KLSAgICBlbHNlIHsKLQlzdHJlbmQgPSBzdHI7Ci0Jd2hpbGUgKCpzdHJlbmQgJiYgIWFwX2lzc3BhY2UoKnN0cmVuZCkpCi0JICAgICsrc3RyZW5kOwotCi0JcmVzID0gc3Vic3RyaW5nX2NvbmYocCwgc3RyLCBzdHJlbmQgLSBzdHIsIDApOwotICAgIH0KLQotICAgIHdoaWxlICgqc3RyZW5kICYmIGFwX2lzc3BhY2UoKnN0cmVuZCkpCi0JKytzdHJlbmQ7Ci0gICAgKmxpbmUgPSBzdHJlbmQ7Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX2NmZ19jbG9zZWZpbGUoY29uZmlnZmlsZV90ICpjZnApCi17Ci0jaWZkZWYgREVCVUcKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfREVCVUd8QVBMT0dfTk9FUlJOTywgTlVMTCwgCi0gICAgICAgICJEb25lIHdpdGggY29uZmlnIGZpbGUgJXMiLCBjZnAtPm5hbWUpOwotI2VuZGlmCi0gICAgcmV0dXJuIChjZnAtPmNsb3NlID09IE5VTEwpID8gMCA6IGNmcC0+Y2xvc2UoY2ZwLT5wYXJhbSk7Ci19Ci0KLXN0YXRpYyBhcF9zdGF0dXNfdCBjZmdfY2xvc2Uodm9pZCAqcGFyYW0pCi17Ci0gICAgYXBfZmlsZV90ICpjZnAgPSAoYXBfZmlsZV90ICopIHBhcmFtOwotICAgIHJldHVybiAoYXBfY2xvc2UoY2ZwKSk7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnX2dldGNoKHZvaWQgKnBhcmFtKQotewotICAgIGNoYXIgY2g7Ci0gICAgYXBfZmlsZV90ICpjZnAgPSAoYXBfZmlsZV90ICopIHBhcmFtOwotICAgIGlmIChhcF9nZXRjKCZjaCwgY2ZwKSA9PSBBUFJfU1VDQ0VTUykKLSAgICAgICAgcmV0dXJuIGNoOwotICAgIHJldHVybiAoaW50KUVPRjsKLX0KLQotc3RhdGljIHZvaWQgKmNmZ19nZXRzdHIodm9pZCAqYnVmLCBzaXplX3QgYnVmc2l6LCB2b2lkICpwYXJhbSkKLXsKLSAgICBhcF9maWxlX3QgKmNmcCA9IChhcF9maWxlX3QgKikgcGFyYW07Ci0gICAgaWYgKGFwX2ZnZXRzKGJ1ZiwgYnVmc2l6LCBjZnApID09IEFQUl9TVUNDRVNTKQotICAgICAgICByZXR1cm4gYnVmOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vKiBPcGVuIGEgY29uZmlnZmlsZV90IGFzIEZJTEUsIHJldHVybiBvcGVuIGNvbmZpZ2ZpbGVfdCBzdHJ1Y3QgcG9pbnRlciAqLwotQVBJX0VYUE9SVChhcF9zdGF0dXNfdCkgYXBfcGNmZ19vcGVuZmlsZShjb25maWdmaWxlX3QgKipyZXRfY2ZnLCBhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgY29uZmlnZmlsZV90ICpuZXdfY2ZnOwotICAgIGFwX2ZpbGVfdCAqZmlsZSA9IE5VTEw7Ci0gICAgYXBfZmluZm9fdCBmaW5mbzsKLSAgICBhcF9zdGF0dXNfdCBzdGF0OwotCi0gICAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwKLSAgICAgICAgICAgICAgICJJbnRlcm5hbCBlcnJvcjogcGNmZ19vcGVuZmlsZSgpIGNhbGxlZCB3aXRoIE5VTEwgZmlsZW5hbWUiKTsKLSAgICAgICAgcmV0dXJuIEFQUl9FQkFERjsKLSAgICB9Ci0KLSAgICBpZiAoIWFwX29zX2lzX2ZpbGVuYW1lX3ZhbGlkKG5hbWUpKSB7Ci0gICAgICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19FUlIgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAiQWNjZXNzIHRvIGNvbmZpZyBmaWxlICVzIGRlbmllZDogbm90IGEgdmFsaWQgZmlsZW5hbWUiLAotICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICAgICAgcmV0dXJuIEFQUl9FQUNDRVM7Ci0gICAgfQotCi0gICAgc3RhdCA9IGFwX29wZW4oJmZpbGUsIG5hbWUsIEFQUl9SRUFEIHwgQVBSX0JVRkZFUkVELCBBUFJfT1NfREVGQVVMVCwgcCk7Ci0jaWZkZWYgREVCVUcKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfREVCVUcgfCBBUExPR19OT0VSUk5PLCBOVUxMLAotICAgICAgICAgICAgICAgICJPcGVuaW5nIGNvbmZpZyBmaWxlICVzICglcykiLAotICAgICAgICAgICAgICAgIG5hbWUsIChzdGF0ICE9IEFQUl9TVUNDRVNTKSA/IHN0cmVycm9yKGVycm5vKSA6ICJzdWNjZXNzZnVsIik7Ci0jZW5kaWYKLSAgICBpZiAoc3RhdCAhPSBBUFJfU1VDQ0VTUykKLSAgICAgICAgcmV0dXJuIHN0YXQ7Ci0KLSAgICBzdGF0ID0gYXBfZ2V0ZmlsZWluZm8oJmZpbmZvLCBmaWxlKTsKLSAgICBpZiAoc3RhdCAhPSBBUFJfU1VDQ0VTUykKLSAgICAgICAgcmV0dXJuIHN0YXQ7Ci0KLSAgICBpZiAoZmluZm8uZmlsZXR5cGUgIT0gQVBSX1JFRyAmJgotI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoT1MyKQotICAgICAgICAhKHN0cmNhc2VjbXAobmFtZSwgIm51bCIpID09IDAgfHwKLSAgICAgICAgICAoc3RybGVuKG5hbWUpID49IDQgJiYKLSAgICAgICAgICAgc3RyY2FzZWNtcChuYW1lICsgc3RybGVuKG5hbWUpIC0gNCwgIi9udWwiKSA9PSAwKSkpIHsKLSNlbHNlCi0gICAgICAgIHN0cmNtcChuYW1lLCAiL2Rldi9udWxsIikgIT0gMCkgewotI2VuZGlmIC8qIFdJTjMyIHx8IE9TMiAqLwotICAgICAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfRVJSIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgIkFjY2VzcyB0byBmaWxlICVzIGRlbmllZCBieSBzZXJ2ZXI6IG5vdCBhIHJlZ3VsYXIgZmlsZSIsCi0gICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICAgICAgICBhcF9jbG9zZShmaWxlKTsKLSAgICAgICAgcmV0dXJuIEFQUl9FQkFERjsKLSAgICB9Ci0KLSAgICBuZXdfY2ZnID0gYXBfcGFsbG9jKHAsIHNpemVvZigqbmV3X2NmZykpOwotICAgIG5ld19jZmctPnBhcmFtID0gZmlsZTsKLSAgICBuZXdfY2ZnLT5uYW1lID0gYXBfcHN0cmR1cChwLCBuYW1lKTsKLSAgICBuZXdfY2ZnLT5nZXRjaCA9IChpbnQgKCopKHZvaWQgKikpIGNmZ19nZXRjaDsKLSAgICBuZXdfY2ZnLT5nZXRzdHIgPSAodm9pZCAqKCopKHZvaWQgKiwgc2l6ZV90LCB2b2lkICopKSBjZmdfZ2V0c3RyOwotICAgIG5ld19jZmctPmNsb3NlID0gKGludCAoKikodm9pZCAqKSkgY2ZnX2Nsb3NlOwotICAgIG5ld19jZmctPmxpbmVfbnVtYmVyID0gMDsKLSAgICAqcmV0X2NmZyA9IG5ld19jZmc7Ci0gICAgcmV0dXJuIEFQUl9TVUNDRVNTOwotfQotCi0KLS8qIEFsbG9jYXRlIGEgY29uZmlnZmlsZV90IGhhbmRsZSB3aXRoIHVzZXIgZGVmaW5lZCBmdW5jdGlvbnMgYW5kIHBhcmFtcyAqLwotQVBJX0VYUE9SVChjb25maWdmaWxlX3QgKikgYXBfcGNmZ19vcGVuX2N1c3RvbShhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKmRlc2NyLAotICAgIHZvaWQgKnBhcmFtLAotICAgIGludCgqZ2V0Y2gpKHZvaWQgKnBhcmFtKSwKLSAgICB2b2lkICooKmdldHN0cikgKHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1ZnNpeiwgdm9pZCAqcGFyYW0pLAotICAgIGludCgqY2xvc2VfZnVuYykodm9pZCAqcGFyYW0pKQotewotICAgIGNvbmZpZ2ZpbGVfdCAqbmV3X2NmZyA9IGFwX3BhbGxvYyhwLCBzaXplb2YoKm5ld19jZmcpKTsKLSNpZmRlZiBERUJVRwotICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19ERUJVRyB8IEFQTE9HX05PRVJSTk8sIE5VTEwsICJPcGVuaW5nIGNvbmZpZyBoYW5kbGVyICVzIiwgZGVzY3IpOwotI2VuZGlmCi0gICAgbmV3X2NmZy0+cGFyYW0gPSBwYXJhbTsKLSAgICBuZXdfY2ZnLT5uYW1lID0gZGVzY3I7Ci0gICAgbmV3X2NmZy0+Z2V0Y2ggPSBnZXRjaDsKLSAgICBuZXdfY2ZnLT5nZXRzdHIgPSBnZXRzdHI7Ci0gICAgbmV3X2NmZy0+Y2xvc2UgPSBjbG9zZV9mdW5jOwotICAgIG5ld19jZmctPmxpbmVfbnVtYmVyID0gMDsKLSAgICByZXR1cm4gbmV3X2NmZzsKLX0KLQotCi0vKiBSZWFkIG9uZSBjaGFyYWN0ZXIgZnJvbSBhIGNvbmZpZ2ZpbGVfdCAqLwotQVBJX0VYUE9SVChpbnQpIGFwX2NmZ19nZXRjKGNvbmZpZ2ZpbGVfdCAqY2ZwKQotewotICAgIHJlZ2lzdGVyIGludCBjaCA9IGNmcC0+Z2V0Y2goY2ZwLT5wYXJhbSk7Ci0gICAgaWYgKGNoID09IExGKSAKLQkrK2NmcC0+bGluZV9udW1iZXI7Ci0gICAgcmV0dXJuIGNoOwotfQotCi0KLS8qIFJlYWQgb25lIGxpbmUgZnJvbSBvcGVuIGNvbmZpZ2ZpbGVfdCwgc3RyaXAgTEYsIGluY3JlYXNlIGxpbmUgbnVtYmVyICovCi0vKiBJZiBjdXN0b20gaGFuZGxlciBkb2VzIG5vdCBkZWZpbmUgYSBnZXRzdHIoKSBmdW5jdGlvbiwgcmVhZCBjaGFyIGJ5IGNoYXIgKi8KLUFQSV9FWFBPUlQoaW50KSBhcF9jZmdfZ2V0bGluZShjaGFyICpidWYsIHNpemVfdCBidWZzaXplLCBjb25maWdmaWxlX3QgKmNmcCkKLXsKLSAgICAvKiBJZiBhICJnZXQgc3RyaW5nIiBmdW5jdGlvbiBpcyBkZWZpbmVkLCB1c2UgaXQgKi8KLSAgICBpZiAoY2ZwLT5nZXRzdHIgIT0gTlVMTCkgewotCWNoYXIgKnNyYywgKmRzdDsKLQljaGFyICpjcDsKLQljaGFyICpjYnVmID0gYnVmOwotCXNpemVfdCBjYnVmc2l6ZSA9IGJ1ZnNpemU7Ci0KLQl3aGlsZSAoMSkgewotCSAgICArK2NmcC0+bGluZV9udW1iZXI7Ci0JICAgIGlmIChjZnAtPmdldHN0cihjYnVmLCBjYnVmc2l6ZSwgY2ZwLT5wYXJhbSkgPT0gTlVMTCkKLQkJcmV0dXJuIDE7Ci0KLQkgICAgLyoKLQkgICAgICogIGNoZWNrIGZvciBsaW5lIGNvbnRpbnVhdGlvbiwKLQkgICAgICogIGkuZS4gbWF0Y2ggW15cXF1cXFtccl1cbiBvbmx5Ci0JICAgICAqLwotCSAgICBjcCA9IGNidWY7Ci0JICAgIHdoaWxlIChjcCA8IGNidWYrY2J1ZnNpemUgJiYgKmNwICE9ICdcMCcpCi0JCWNwKys7Ci0JICAgIGlmIChjcCA+IGNidWYgJiYgY3BbLTFdID09IExGKSB7Ci0JCWNwLS07Ci0JCWlmIChjcCA+IGNidWYgJiYgY3BbLTFdID09IENSKQotCQkgICAgY3AtLTsKLQkJaWYgKGNwID4gY2J1ZiAmJiBjcFstMV0gPT0gJ1xcJykgewotCQkgICAgY3AtLTsKLQkJICAgIGlmICghKGNwID4gY2J1ZiAmJiBjcFstMV0gPT0gJ1xcJykpIHsKLQkJCS8qCi0JCQkgKiBsaW5lIGNvbnRpbnVhdGlvbiByZXF1ZXN0ZWQgLQotCQkJICogdGhlbiByZW1vdmUgYmFja3NsYXNoIGFuZCBjb250aW51ZQotCQkJICovCi0JCQljYnVmc2l6ZSAtPSAoY3AtY2J1Zik7Ci0JCQljYnVmID0gY3A7Ci0JCQljb250aW51ZTsKLQkJICAgIH0KLQkJICAgIGVsc2UgewotCQkJLyogCi0JCQkgKiBubyByZWFsIGNvbnRpbnVhdGlvbiBiZWNhdXNlIGVzY2FwZWQgLQotCQkJICogdGhlbiBqdXN0IHJlbW92ZSBlc2NhcGUgY2hhcmFjdGVyCi0JCQkgKi8KLQkJCWZvciAoIDsgY3AgPCBjYnVmK2NidWZzaXplICYmICpjcCAhPSAnXDAnOyBjcCsrKQotCQkJICAgIGNwWzBdID0gY3BbMV07Ci0JCSAgICB9ICAgCi0JCX0KLQkgICAgfQotCSAgICBicmVhazsKLQl9Ci0KLQkvKgotCSAqIExlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlIHNwYWNlIGlzIGVsaW1pbmF0ZWQgY29tcGxldGVseQotCSAqLwotCXNyYyA9IGJ1ZjsKLQl3aGlsZSAoYXBfaXNzcGFjZSgqc3JjKSkKLQkgICAgKytzcmM7Ci0JLyogYmxhc3QgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLwotCWRzdCA9ICZzcmNbc3RybGVuKHNyYyldOwotCXdoaWxlICgtLWRzdCA+PSBzcmMgJiYgYXBfaXNzcGFjZSgqZHN0KSkKLQkgICAgKmRzdCA9ICdcMCc7Ci0gICAgICAgIC8qIFphcCBsZWFkaW5nIHdoaXRlc3BhY2UgYnkgc2hpZnRpbmcgKi8KLSAgICAgICAgaWYgKHNyYyAhPSBidWYpCi0JICAgIGZvciAoZHN0ID0gYnVmOyAoKmRzdCsrID0gKnNyYysrKSAhPSAnXDAnOyApCi0JICAgICAgICA7Ci0KLSNpZmRlZiBERUJVR19DRkdfTElORVMKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfREVCVUd8QVBMT0dfTk9FUlJOTywgTlVMTCwgIlJlYWQgY29uZmlnOiAlcyIsIGJ1Zik7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLSAgICB9IGVsc2UgewotCS8qIE5vICJnZXQgc3RyaW5nIiBmdW5jdGlvbiBkZWZpbmVkOyByZWFkIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIgKi8KLQlyZWdpc3RlciBpbnQgYzsKLQlyZWdpc3RlciBzaXplX3QgaSA9IDA7Ci0KLQlidWZbMF0gPSAnXDAnOwotCS8qIHNraXAgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0JZG8gewotCSAgICBjID0gY2ZwLT5nZXRjaChjZnAtPnBhcmFtKTsKLQl9IHdoaWxlIChjID09ICdcdCcgfHwgYyA9PSAnICcpOwotCi0JaWYgKGMgPT0gRU9GKQotCSAgICByZXR1cm4gMTsKLQkKLQlpZihidWZzaXplIDwgMikgewotCSAgICAvKiB0b28gc21hbGwsIGFzc3VtZSBjYWxsZXIgaXMgY3JhenkgKi8KLQkgICAgcmV0dXJuIDE7Ci0JfQotCi0Jd2hpbGUgKDEpIHsKLQkgICAgaWYgKChjID09ICdcdCcpIHx8IChjID09ICcgJykpIHsKLQkJYnVmW2krK10gPSAnICc7Ci0JCXdoaWxlICgoYyA9PSAnXHQnKSB8fCAoYyA9PSAnICcpKQotCQkgICAgYyA9IGNmcC0+Z2V0Y2goY2ZwLT5wYXJhbSk7Ci0JICAgIH0KLQkgICAgaWYgKGMgPT0gQ1IpIHsKLQkJLyogc2lsZW50bHkgaWdub3JlIENSIChfYXNzdW1lXyB0aGF0IGEgTEYgZm9sbG93cykgKi8KLQkJYyA9IGNmcC0+Z2V0Y2goY2ZwLT5wYXJhbSk7Ci0JICAgIH0KLQkgICAgaWYgKGMgPT0gTEYpIHsKLQkJLyogaW5jcmVhc2UgbGluZSBudW1iZXIgYW5kIHJldHVybiBvbiBMRiAqLwotCQkrK2NmcC0+bGluZV9udW1iZXI7Ci0JICAgIH0KLQkgICAgaWYgKGMgPT0gRU9GIHx8IGMgPT0gMHg0IHx8IGMgPT0gTEYgfHwgaSA+PSAoYnVmc2l6ZSAtIDIpKSB7Ci0JCS8qIAotCQkgKiAgY2hlY2sgZm9yIGxpbmUgY29udGludWF0aW9uCi0JCSAqLwotCQlpZiAoaSA+IDAgJiYgYnVmW2ktMV0gPT0gJ1xcJykgewotCQkgICAgaS0tOwotCQkgICAgaWYgKCEoaSA+IDAgJiYgYnVmW2ktMV0gPT0gJ1xcJykpIHsKLQkJCS8qIGxpbmUgaXMgY29udGludWVkICovCi0JCQljID0gY2ZwLT5nZXRjaChjZnAtPnBhcmFtKTsKLQkJCWNvbnRpbnVlOwotCQkgICAgfQotCQkgICAgLyogZWxzZSBub3RoaW5nIG5lZWRzIGJlIGRvbmUgYmVjYXVzZQotCQkgICAgICogdGhlbiB0aGUgYmFja3NsYXNoIGlzIGVzY2FwZWQgYW5kCi0JCSAgICAgKiB3ZSBqdXN0IHN0cmlwIHRvIGEgc2luZ2xlIG9uZQotCQkgICAgICovCi0JCX0KLQkJLyogYmxhc3QgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLwotCQl3aGlsZSAoaSA+IDAgJiYgYXBfaXNzcGFjZShidWZbaSAtIDFdKSkKLQkJICAgIC0taTsKLQkJYnVmW2ldID0gJ1wwJzsKLSNpZmRlZiBERUJVR19DRkdfTElORVMKLQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX0RFQlVHfEFQTE9HX05PRVJSTk8sIE5VTEwsICJSZWFkIGNvbmZpZzogJXMiLCBidWYpOwotI2VuZGlmCi0JCXJldHVybiAwOwotCSAgICB9Ci0JICAgIGJ1ZltpXSA9IGM7Ci0JICAgICsraTsKLQkgICAgYyA9IGNmcC0+Z2V0Y2goY2ZwLT5wYXJhbSk7Ci0JfQotICAgIH0KLX0KLQotLyogU2l6ZSBhbiBIVFRQIGhlYWRlciBmaWVsZCBsaXN0IGl0ZW0sIGFzIHNlcGFyYXRlZCBieSBhIGNvbW1hLgotICogVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbm9uLWVtcHR5IGxpc3QgaXRlbQotICogd2l0aGluIHRoZSBvcmlnaW5hbCBzdHJpbmcgKG9yIE5VTEwgaWYgdGhlcmUgaXMgbm9uZSkgYW5kIHRoZSBhZGRyZXNzCi0gKiBvZiBmaWVsZCBpcyBzaGlmdGVkIHRvIHRoZSBuZXh0IG5vbi1jb21tYSwgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLgotICogbGVuIGlzIHRoZSBsZW5ndGggb2YgdGhlIGl0ZW0gZXhjbHVkaW5nIGFueSBiZWdpbm5pbmcgd2hpdGVzcGFjZS4KLSAqLwotQVBJX0VYUE9SVChjb25zdCBjaGFyICopIGFwX3NpemVfbGlzdF9pdGVtKGNvbnN0IGNoYXIgKipmaWVsZCwgaW50ICpsZW4pCi17Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqcHRyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikqZmllbGQ7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqdG9rZW47Ci0gICAgaW50IGluX3FwYWlyLCBpbl9xc3RyLCBpbl9jb207Ci0KLSAgICAvKiBGaW5kIGZpcnN0IG5vbi1jb21tYSwgbm9uLXdoaXRlc3BhY2UgYnl0ZSAqLwotCi0gICAgd2hpbGUgKCpwdHIgPT0gJywnIHx8IGFwX2lzc3BhY2UoKnB0cikpCi0gICAgICAgICsrcHRyOwotCi0gICAgdG9rZW4gPSBwdHI7Ci0KLSAgICAvKiBGaW5kIHRoZSBlbmQgb2YgdGhpcyBpdGVtLCBza2lwcGluZyBvdmVyIGRlYWQgYml0cyAqLwotCi0gICAgZm9yIChpbl9xcGFpciA9IGluX3FzdHIgPSBpbl9jb20gPSAwOwotICAgICAgICAgKnB0ciAmJiAoaW5fcXBhaXIgfHwgaW5fcXN0ciB8fCBpbl9jb20gfHwgKnB0ciAhPSAnLCcpOwotICAgICAgICAgKytwdHIpIHsKLQotICAgICAgICBpZiAoaW5fcXBhaXIpIHsKLSAgICAgICAgICAgIGluX3FwYWlyID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHN3aXRjaCAoKnB0cikgewotICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzogaW5fcXBhaXIgPSAxOyAgICAgIC8qIHF1b3RlZC1wYWlyICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJyInIDogaWYgKCFpbl9jb20pICAgICAgIC8qIHF1b3RlZCBzdHJpbmcgZGVsaW0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9xc3RyID0gIWluX3FzdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICcoJyA6IGlmICghaW5fcXN0cikgICAgICAvKiBjb21tZW50IChtYXkgbmVzdCkgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpbl9jb207Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICcpJyA6IGlmIChpbl9jb20pICAgICAgICAvKiBlbmQgY29tbWVudCAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1pbl9jb207Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0ICA6IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCgqbGVuID0gKHB0ciAtIHRva2VuKSkgPT0gMCkgewotICAgICAgICAqZmllbGQgPSAoY29uc3QgY2hhciAqKXB0cjsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgLyogQWR2YW5jZSBmaWVsZCBwb2ludGVyIHRvIHRoZSBuZXh0IG5vbi1jb21tYSwgbm9uLXdoaXRlIGJ5dGUgKi8KLQotICAgIHdoaWxlICgqcHRyID09ICcsJyB8fCBhcF9pc3NwYWNlKCpwdHIpKQotCSsrcHRyOwotCi0gICAgKmZpZWxkID0gKGNvbnN0IGNoYXIgKilwdHI7Ci0gICAgcmV0dXJuIChjb25zdCBjaGFyICopdG9rZW47Ci19Ci0KLS8qIFJldHJpZXZlIGFuIEhUVFAgaGVhZGVyIGZpZWxkIGxpc3QgaXRlbSwgYXMgc2VwYXJhdGVkIGJ5IGEgY29tbWEsCi0gKiB3aGlsZSBzdHJpcHBpbmcgaW5zaWduaWZpY2FudCB3aGl0ZXNwYWNlIGFuZCBsb3dlcmNhc2luZyBhbnl0aGluZyBub3QgaW4KLSAqIGEgcXVvdGVkIHN0cmluZyBvciBjb21tZW50LiAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIG5ldyBzdHJpbmcgY29udGFpbmluZwotICogdGhlIGNvbnZlcnRlZCBsaXN0IGl0ZW0gKG9yIE5VTEwgaWYgbm9uZSkgYW5kIHRoZSBhZGRyZXNzIHBvaW50ZWQgdG8gYnkKLSAqIGZpZWxkIGlzIHNoaWZ0ZWQgdG8gdGhlIG5leHQgbm9uLWNvbW1hLCBub24td2hpdGVzcGFjZS4KLSAqLwotQVBJX0VYUE9SVChjaGFyICopIGFwX2dldF9saXN0X2l0ZW0oYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyICoqZmllbGQpCi17Ci0gICAgY29uc3QgY2hhciAqdG9rX3N0YXJ0OwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0cjsKLSAgICB1bnNpZ25lZCBjaGFyICpwb3M7Ci0gICAgY2hhciAqdG9rZW47Ci0gICAgaW50IGFkZHNwYWNlID0gMCwgaW5fcXBhaXIgPSAwLCBpbl9xc3RyID0gMCwgaW5fY29tID0gMCwgdG9rX2xlbiA9IDA7Ci0KLSAgICAvKiBGaW5kIHRoZSBiZWdpbm5pbmcgYW5kIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBsaXN0IGl0ZW0gc28gdGhhdAotICAgICAqIHdlIGNhbiBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIG5ldyBzdHJpbmcgYW5kIHJlc2V0IHRoZSBmaWVsZC4KLSAgICAgKi8KLSAgICBpZiAoKHRva19zdGFydCA9IGFwX3NpemVfbGlzdF9pdGVtKGZpZWxkLCAmdG9rX2xlbikpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHRva2VuID0gYXBfcGFsbG9jKHAsIHRva19sZW4gKyAxKTsKLQotICAgIC8qIFNjYW4gdGhlIHRva2VuIGFnYWluLCBidXQgdGhpcyB0aW1lIGNvcHkgb25seSB0aGUgZ29vZCBieXRlcy4KLSAgICAgKiBXZSBza2lwIGV4dHJhIHdoaXRlc3BhY2UgYW5kIGFueSB3aGl0ZXNwYWNlIGFyb3VuZCBhICc9JywgJy8nLAotICAgICAqIG9yICc7JyBhbmQgbG93ZXJjYXNlIG5vcm1hbCBjaGFyYWN0ZXJzIG5vdCB3aXRoaW4gYSBjb21tZW50LAotICAgICAqIHF1b3RlZC1zdHJpbmcgb3IgcXVvdGVkLXBhaXIuCi0gICAgICovCi0gICAgZm9yIChwdHIgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXRva19zdGFydCwgcG9zID0gKHVuc2lnbmVkIGNoYXIgKil0b2tlbjsKLSAgICAgICAgICpwdHIgJiYgKGluX3FwYWlyIHx8IGluX3FzdHIgfHwgaW5fY29tIHx8ICpwdHIgIT0gJywnKTsKLSAgICAgICAgICsrcHRyKSB7Ci0KLSAgICAgICAgaWYgKGluX3FwYWlyKSB7Ci0gICAgICAgICAgICBpbl9xcGFpciA9IDA7Ci0gICAgICAgICAgICAqcG9zKysgPSAqcHRyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgc3dpdGNoICgqcHRyKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnXFwnOiBpbl9xcGFpciA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkc3BhY2UgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcG9zKysgPSAnICc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqcG9zKysgPSAqcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkc3BhY2UgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnIicgOiBpZiAoIWluX2NvbSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9xc3RyID0gIWluX3FzdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkc3BhY2UgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcG9zKysgPSAnICc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqcG9zKysgPSAqcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkc3BhY2UgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnKCcgOiBpZiAoIWluX3FzdHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpbl9jb207Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkc3BhY2UgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcG9zKysgPSAnICc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAqcG9zKysgPSAqcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkc3BhY2UgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnKScgOiBpZiAoaW5fY29tKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0taW5fY29tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBvcysrID0gKnB0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHNwYWNlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJyAnIDoKLSAgICAgICAgICAgICAgICBjYXNlICdcdCc6IGlmIChhZGRzcGFjZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbl9jb20gfHwgaW5fcXN0cikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcG9zKysgPSAqcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHNwYWNlID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJz0nIDoKLSAgICAgICAgICAgICAgICBjYXNlICcvJyA6Ci0gICAgICAgICAgICAgICAgY2FzZSAnOycgOiBpZiAoIShpbl9jb20gfHwgaW5fcXN0cikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkc3BhY2UgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb3MrKyA9ICpwdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0ICA6IGlmIChhZGRzcGFjZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb3MrKyA9ICcgJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb3MrKyA9IChpbl9jb20gfHwgaW5fcXN0cikgPyAqcHRyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXBfdG9sb3dlcigqcHRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHNwYWNlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgICpwb3MgPSAnXDAnOwotCi0gICAgcmV0dXJuIHRva2VuOwotfQotCi0vKiBGaW5kIGFuIGl0ZW0gaW4gY2Fub25pY2FsIGZvcm0gKGxvd2VyY2FzZSwgbm8gZXh0cmEgc3BhY2VzKSB3aXRoaW4KLSAqIGFuIEhUVFAgZmllbGQgdmFsdWUgbGlzdC4gIFJldHVybnMgMSBpZiBmb3VuZCwgMCBpZiBub3QgZm91bmQuCi0gKiBUaGlzIHdvdWxkIGJlIG11Y2ggbW9yZSBlZmZpY2llbnQgaWYgd2Ugc3RvcmVkIGhlYWRlciBmaWVsZHMgYXMKLSAqIGFuIGFycmF5IG9mIGxpc3QgaXRlbXMgYXMgdGhleSBhcmUgcmVjZWl2ZWQgaW5zdGVhZCBvZiBhIHBsYWluIHN0cmluZy4KLSAqLwotQVBJX0VYUE9SVChpbnQpIGFwX2ZpbmRfbGlzdF9pdGVtKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqbGluZSwgY29uc3QgY2hhciAqdG9rKQotewotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBvczsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwdHIgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWxpbmU7Ci0gICAgaW50IGdvb2QgPSAwLCBhZGRzcGFjZSA9IDAsIGluX3FwYWlyID0gMCwgaW5fcXN0ciA9IDAsIGluX2NvbSA9IDA7Ci0KLSAgICBpZiAoIWxpbmUgfHwgIXRvaykKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBkbyB7ICAvKiBsb29wIGZvciBlYWNoIGl0ZW0gaW4gbGluZSdzIGxpc3QgKi8KLQotICAgICAgICAvKiBGaW5kIGZpcnN0IG5vbi1jb21tYSwgbm9uLXdoaXRlc3BhY2UgYnl0ZSAqLwotCi0gICAgICAgIHdoaWxlICgqcHRyID09ICcsJyB8fCBhcF9pc3NwYWNlKCpwdHIpKQotICAgICAgICAgICAgKytwdHI7Ci0KLSAgICAgICAgaWYgKCpwdHIpCi0gICAgICAgICAgICBnb29kID0gMTsgIC8qIHVudGlsIHByb3ZlbiBvdGhlcndpc2UgZm9yIHRoaXMgaXRlbSAqLwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBicmVhazsgICAgIC8qIG5vIGl0ZW1zIGxlZnQgYW5kIG5vdGhpbmcgZ29vZCBmb3VuZCAqLwotCi0gICAgICAgIC8qIFdlIHNraXAgZXh0cmEgd2hpdGVzcGFjZSBhbmQgYW55IHdoaXRlc3BhY2UgYXJvdW5kIGEgJz0nLCAnLycsCi0gICAgICAgICAqIG9yICc7JyBhbmQgbG93ZXJjYXNlIG5vcm1hbCBjaGFyYWN0ZXJzIG5vdCB3aXRoaW4gYSBjb21tZW50LAotICAgICAgICAgKiBxdW90ZWQtc3RyaW5nIG9yIHF1b3RlZC1wYWlyLgotICAgICAgICAgKi8KLSAgICAgICAgZm9yIChwb3MgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXRvazsKLSAgICAgICAgICAgICAqcHRyICYmIChpbl9xcGFpciB8fCBpbl9xc3RyIHx8IGluX2NvbSB8fCAqcHRyICE9ICcsJyk7Ci0gICAgICAgICAgICAgKytwdHIpIHsKLQotICAgICAgICAgICAgaWYgKGluX3FwYWlyKSB7Ci0gICAgICAgICAgICAgICAgaW5fcXBhaXIgPSAwOwotICAgICAgICAgICAgICAgIGlmIChnb29kKQotICAgICAgICAgICAgICAgICAgICBnb29kID0gKCpwb3MrKyA9PSAqcHRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoKnB0cikgewotICAgICAgICAgICAgICAgICAgICBjYXNlICdcXCc6IGluX3FwYWlyID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkc3BhY2UgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZCA9IGdvb2QgJiYgKCpwb3MrKyA9PSAnICcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2QgPSBnb29kICYmICgqcG9zKysgPT0gKnB0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkc3BhY2UgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICciJyA6IGlmICghaW5fY29tKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9xc3RyID0gIWluX3FzdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHNwYWNlID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2QgPSBnb29kICYmICgqcG9zKysgPT0gJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29kID0gZ29vZCAmJiAoKnBvcysrID09ICpwdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHNwYWNlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnKCcgOiBpZiAoIWluX3FzdHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraW5fY29tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRzcGFjZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29kID0gZ29vZCAmJiAoKnBvcysrID09ICcgJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZCA9IGdvb2QgJiYgKCpwb3MrKyA9PSAqcHRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRzcGFjZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJyknIDogaWYgKGluX2NvbSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1pbl9jb207Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZCA9IGdvb2QgJiYgKCpwb3MrKyA9PSAqcHRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRzcGFjZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJyAnIDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnXHQnOiBpZiAoYWRkc3BhY2UgfHwgIWdvb2QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbl9jb20gfHwgaW5fcXN0cikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZCA9ICgqcG9zKysgPT0gKnB0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRzcGFjZSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJz0nIDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnLycgOgotICAgICAgICAgICAgICAgICAgICBjYXNlICc7JyA6IGlmICghKGluX2NvbSB8fCBpbl9xc3RyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkc3BhY2UgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29kID0gZ29vZCAmJiAoKnBvcysrID09ICpwdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ICA6IGlmICghZ29vZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHNwYWNlID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2QgPSAoKnBvcysrID09ICcgJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluX2NvbSB8fCBpbl9xc3RyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29kID0gZ29vZCAmJiAoKnBvcysrID09ICpwdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZCA9IGdvb2QgJiYgKCpwb3MrKyA9PSBhcF90b2xvd2VyKCpwdHIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRzcGFjZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChnb29kICYmICpwb3MpCi0gICAgICAgICAgICBnb29kID0gMDsgICAgICAgICAgLyogbm90IGdvb2QgaWYgb25seSBhIHByZWZpeCB3YXMgbWF0Y2hlZCAqLwotCi0gICAgfSB3aGlsZSAoKnB0ciAmJiAhZ29vZCk7Ci0KLSAgICByZXR1cm4gZ29vZDsKLX0KLQotCi0vKiBSZXRyaWV2ZSBhIHRva2VuLCBzcGFjaW5nIG92ZXIgaXQgYW5kIHJldHVybmluZyBhIHBvaW50ZXIgdG8KLSAqIHRoZSBmaXJzdCBub24td2hpdGUgYnl0ZSBhZnRlcndhcmRzLiAgTm90ZSB0aGF0IHRoZXNlIHRva2VucwotICogYXJlIGRlbGltaXRlZCBieSBzZW1pcyBhbmQgY29tbWFzOyBhbmQgY2FuIGFsc28gYmUgZGVsaW1pdGVkCi0gKiBieSB3aGl0ZXNwYWNlIGF0IHRoZSBjYWxsZXIncyBvcHRpb24uCi0gKi8KLQotQVBJX0VYUE9SVChjaGFyICopIGFwX2dldF90b2tlbihhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKiphY2NlcHRfbGluZSwgaW50IGFjY2VwdF93aGl0ZSkKLXsKLSAgICBjb25zdCBjaGFyICpwdHIgPSAqYWNjZXB0X2xpbmU7Ci0gICAgY29uc3QgY2hhciAqdG9rX3N0YXJ0OwotICAgIGNoYXIgKnRva2VuOwotICAgIGludCB0b2tfbGVuOwotCi0gICAgLyogRmluZCBmaXJzdCBub24td2hpdGUgYnl0ZSAqLwotCi0gICAgd2hpbGUgKCpwdHIgJiYgYXBfaXNzcGFjZSgqcHRyKSkKLQkrK3B0cjsKLQotICAgIHRva19zdGFydCA9IHB0cjsKLQotICAgIC8qIGZpbmQgdG9rZW4gZW5kLCBza2lwcGluZyBvdmVyIHF1b3RlZCBzdHJpbmdzLgotICAgICAqIChjb21tZW50cyBhcmUgYWxyZWFkeSBnb25lKS4KLSAgICAgKi8KLQotICAgIHdoaWxlICgqcHRyICYmIChhY2NlcHRfd2hpdGUgfHwgIWFwX2lzc3BhY2UoKnB0cikpCi0JICAgJiYgKnB0ciAhPSAnOycgJiYgKnB0ciAhPSAnLCcpIHsKLQlpZiAoKnB0cisrID09ICciJykKLQkgICAgd2hpbGUgKCpwdHIpCi0JCWlmICgqcHRyKysgPT0gJyInKQotCQkgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgdG9rX2xlbiA9IHB0ciAtIHRva19zdGFydDsKLSAgICB0b2tlbiA9IGFwX3BzdHJuZHVwKHAsIHRva19zdGFydCwgdG9rX2xlbik7Ci0KLSAgICAvKiBBZHZhbmNlIGFjY2VwdF9saW5lIHBvaW50ZXIgdG8gdGhlIG5leHQgbm9uLXdoaXRlIGJ5dGUgKi8KLQotICAgIHdoaWxlICgqcHRyICYmIGFwX2lzc3BhY2UoKnB0cikpCi0JKytwdHI7Ci0KLSAgICAqYWNjZXB0X2xpbmUgPSBwdHI7Ci0gICAgcmV0dXJuIHRva2VuOwotfQotCi0KLS8qIGZpbmQgaHR0cCB0b2tlbnMsIHNlZSB0aGUgZGVmaW5pdGlvbiBvZiB0b2tlbiBmcm9tIFJGQzIwNjggKi8KLUFQSV9FWFBPUlQoaW50KSBhcF9maW5kX3Rva2VuKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqbGluZSwgY29uc3QgY2hhciAqdG9rKQotewotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0YXJ0X3Rva2VuOwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7Ci0KLSAgICBpZiAoIWxpbmUpCi0JcmV0dXJuIDA7Ci0KLSAgICBzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilsaW5lOwotICAgIGZvciAoOzspIHsKLQkvKiBmaW5kIHN0YXJ0IG9mIHRva2VuLCBza2lwIGFsbCBzdG9wIGNoYXJhY3RlcnMsIG5vdGUgTlVMCi0JICogaXNuJ3QgYSB0b2tlbiBzdG9wLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHRlc3QgZm9yIGl0Ci0JICovCi0Jd2hpbGUgKFRFU1RfQ0hBUigqcywgVF9IVFRQX1RPS0VOX1NUT1ApKSB7Ci0JICAgICsrczsKLQl9Ci0JaWYgKCEqcykgewotCSAgICByZXR1cm4gMDsKLQl9Ci0Jc3RhcnRfdG9rZW4gPSBzOwotCS8qIGZpbmQgZW5kIG9mIHRoZSB0b2tlbiAqLwotCXdoaWxlICgqcyAmJiAhVEVTVF9DSEFSKCpzLCBUX0hUVFBfVE9LRU5fU1RPUCkpIHsKLQkgICAgKytzOwotCX0KLQlpZiAoIXN0cm5jYXNlY21wKChjb25zdCBjaGFyICopc3RhcnRfdG9rZW4sIChjb25zdCBjaGFyICopdG9rLCBzIC0gc3RhcnRfdG9rZW4pKSB7Ci0JICAgIHJldHVybiAxOwotCX0KLQlpZiAoISpzKSB7Ci0JICAgIHJldHVybiAwOwotCX0KLSAgICB9Ci19Ci0KLQotQVBJX0VYUE9SVChpbnQpIGFwX2ZpbmRfbGFzdF90b2tlbihhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKmxpbmUsIGNvbnN0IGNoYXIgKnRvaykKLXsKLSAgICBpbnQgbGxlbiwgdGxlbiwgbGlkeDsKLQotICAgIGlmICghbGluZSkKLQlyZXR1cm4gMDsKLQotICAgIGxsZW4gPSBzdHJsZW4obGluZSk7Ci0gICAgdGxlbiA9IHN0cmxlbih0b2spOwotICAgIGxpZHggPSBsbGVuIC0gdGxlbjsKLQotICAgIGlmICgobGlkeCA8IDApIHx8Ci0JKChsaWR4ID4gMCkgJiYgIShhcF9pc3NwYWNlKGxpbmVbbGlkeCAtIDFdKSB8fCBsaW5lW2xpZHggLSAxXSA9PSAnLCcpKSkKLQlyZXR1cm4gMDsKLQotICAgIHJldHVybiAoc3RybmNhc2VjbXAoJmxpbmVbbGlkeF0sIHRvaywgdGxlbikgPT0gMCk7Ci19Ci0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9lc2NhcGVfc2hlbGxfY21kKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqc3RyKQotewotICAgIGNoYXIgKmNtZDsKLSAgICB1bnNpZ25lZCBjaGFyICpkOwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7Ci0KLSAgICBjbWQgPSBhcF9wYWxsb2MocCwgMiAqIHN0cmxlbihzdHIpICsgMSk7CS8qIEJlIHNhZmUgKi8KLSAgICBkID0gKHVuc2lnbmVkIGNoYXIgKiljbWQ7Ci0gICAgcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopc3RyOwotICAgIGZvciAoOyAqczsgKytzKSB7Ci0KLSNpZiBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChXSU4zMikKLQkvKiBEb24ndCBhbGxvdyAnJicgaW4gcGFyYW1ldGVycyB1bmRlciBPUy8yLiAqLwotCS8qIFRoaXMgY2FuIGJlIHVzZWQgdG8gc2VuZCBjb21tYW5kcyB0byB0aGUgc2hlbGwuICovCi0JaWYgKCpzID09ICcmJykgewotCSAgICAqZCsrID0gJyAnOwotCSAgICBjb250aW51ZTsKLQl9Ci0jZW5kaWYKLQotCWlmIChURVNUX0NIQVIoKnMsIFRfRVNDQVBFX1NIRUxMX0NNRCkpIHsKLQkgICAgKmQrKyA9ICdcXCc7Ci0JfQotCSpkKysgPSAqczsKLSAgICB9Ci0gICAgKmQgPSAnXDAnOwotCi0gICAgcmV0dXJuIGNtZDsKLX0KLQotc3RhdGljIGNoYXIgeDJjKGNvbnN0IGNoYXIgKndoYXQpCi17Ci0gICAgcmVnaXN0ZXIgY2hhciBkaWdpdDsKLQotI2lmbmRlZiBDSEFSU0VUX0VCQ0RJQwotICAgIGRpZ2l0ID0gKCh3aGF0WzBdID49ICdBJykgPyAoKHdoYXRbMF0gJiAweGRmKSAtICdBJykgKyAxMCA6ICh3aGF0WzBdIC0gJzAnKSk7Ci0gICAgZGlnaXQgKj0gMTY7Ci0gICAgZGlnaXQgKz0gKHdoYXRbMV0gPj0gJ0EnID8gKCh3aGF0WzFdICYgMHhkZikgLSAnQScpICsgMTAgOiAod2hhdFsxXSAtICcwJykpOwotI2Vsc2UgLypDSEFSU0VUX0VCQ0RJQyovCi0gICAgY2hhciB4c3RyWzVdOwotICAgIHhzdHJbMF09JzAnOwotICAgIHhzdHJbMV09J3gnOwotICAgIHhzdHJbMl09d2hhdFswXTsKLSAgICB4c3RyWzNdPXdoYXRbMV07Ci0gICAgeHN0cls0XT0nXDAnOwotICAgIGRpZ2l0ID0gb3NfdG9lYmNkaWNbMHhGRiAmIHN0cnRvbCh4c3RyLCBOVUxMLCAxNildOwotI2VuZGlmIC8qQ0hBUlNFVF9FQkNESUMqLwotICAgIHJldHVybiAoZGlnaXQpOwotfQotCi0vKgotICogVW5lc2NhcGVzIGEgVVJMLgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGVycm9yCi0gKiBGYWlsdXJlIGlzIGR1ZSB0bwotICogICBiYWQgJSBlc2NhcGUgICAgICAgcmV0dXJucyBCQURfUkVRVUVTVAotICoKLSAqICAgZGVjb2RpbmcgJTAwIC0+IFwwCi0gKiAgIGRlY29kaW5nICUyZiAtPiAvICAgKGEgc3BlY2lhbCBjaGFyYWN0ZXIpCi0gKiAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIE5PVF9GT1VORAotICovCi1BUElfRVhQT1JUKGludCkgYXBfdW5lc2NhcGVfdXJsKGNoYXIgKnVybCkKLXsKLSAgICByZWdpc3RlciBpbnQgYmFkZXNjLCBiYWRwYXRoOwotICAgIGNoYXIgKngsICp5OwotCi0gICAgYmFkZXNjID0gMDsKLSAgICBiYWRwYXRoID0gMDsKLSAgICAvKiBJbml0aWFsIHNjYW4gZm9yIGZpcnN0ICclJy4gRG9uJ3QgYm90aGVyIHdyaXRpbmcgdmFsdWVzIGJlZm9yZQotICAgICAqIHNlZWluZyBhICclJyAqLwotICAgIHkgPSBzdHJjaHIodXJsLCAnJScpOwotICAgIGlmICh5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICBmb3IgKHggPSB5OyAqeTsgKyt4LCArK3kpIHsKLQlpZiAoKnkgIT0gJyUnKQotCSAgICAqeCA9ICp5OwotCWVsc2UgewotCSAgICBpZiAoIWFwX2lzeGRpZ2l0KCooeSArIDEpKSB8fCAhYXBfaXN4ZGlnaXQoKih5ICsgMikpKSB7Ci0JCWJhZGVzYyA9IDE7Ci0JCSp4ID0gJyUnOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQkqeCA9IHgyYyh5ICsgMSk7Ci0JCXkgKz0gMjsKLQkJaWYgKCp4ID09ICcvJyB8fCAqeCA9PSAnXDAnKQotCQkgICAgYmFkcGF0aCA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgICp4ID0gJ1wwJzsKLSAgICBpZiAoYmFkZXNjKQotCXJldHVybiBCQURfUkVRVUVTVDsKLSAgICBlbHNlIGlmIChiYWRwYXRoKQotCXJldHVybiBOT1RfRk9VTkQ7Ci0gICAgZWxzZQotCXJldHVybiBPSzsKLX0KLQotQVBJX0VYUE9SVChjaGFyICopIGFwX2NvbnN0cnVjdF9zZXJ2ZXIoYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyICpob3N0bmFtZSwKLQkJCQkgICAgdW5zaWduZWQgcG9ydCwgY29uc3QgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgaWYgKGFwX2lzX2RlZmF1bHRfcG9ydChwb3J0LCByKSkKLQlyZXR1cm4gYXBfcHN0cmR1cChwLCBob3N0bmFtZSk7Ci0gICAgZWxzZSB7Ci0JcmV0dXJuIGFwX3BzcHJpbnRmKHAsICIlczoldSIsIGhvc3RuYW1lLCBwb3J0KTsKLSAgICB9Ci19Ci0KLS8qIGMyeCB0YWtlcyBhbiB1bnNpZ25lZCwgYW5kIGV4cGVjdHMgdGhlIGNhbGxlciBoYXMgZ3VhcmFudGVlZCB0aGF0Ci0gKiAwIDw9IHdoYXQgPCAyNTYuLi4gd2hpY2ggdXN1YWxseSBtZWFucyB0aGF0IHlvdSBoYXZlIHRvIGNhc3QgdG8KLSAqIHVuc2lnbmVkIGNoYXIgZmlyc3QsIGJlY2F1c2UgKHVuc2lnbmVkKShjaGFyKSh4KSBmaXN0IGdvZXMgdGhyb3VnaAotICogc2lnbmVkIGV4dGVuc2lvbiB0byBhbiBpbnQgYmVmb3JlIHRoZSB1bnNpZ25lZCBjYXN0LgotICoKLSAqIFRoZSByZWFzb24gZm9yIHRoaXMgYXNzdW1wdGlvbiBpcyB0byBhc3Npc3QgZ2NjIGNvZGUgZ2VuZXJhdGlvbiAtLQotICogdGhlIHVuc2lnbmVkIGNoYXIgLT4gdW5zaWduZWQgZXh0ZW5zaW9uIGlzIGFscmVhZHkgZG9uZSBlYXJsaWVyIGluCi0gKiBib3RoIHVzZXMgb2YgdGhpcyBjb2RlLCBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gd2FzdGUgdGltZSBkb2luZyBpdAotICogYWdhaW4uCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyIGMyeF90YWJsZVtdID0gIjAxMjM0NTY3ODlhYmNkZWYiOwotCi1zdGF0aWMgYXBfaW5saW5lIHVuc2lnbmVkIGNoYXIgKmMyeCh1bnNpZ25lZCB3aGF0LCB1bnNpZ25lZCBjaGFyICp3aGVyZSkKLXsKLSAgICAqd2hlcmUrKyA9ICclJzsKLSAgICAqd2hlcmUrKyA9IGMyeF90YWJsZVt3aGF0ID4+IDRdOwotICAgICp3aGVyZSsrID0gYzJ4X3RhYmxlW3doYXQgJiAweGZdOwotICAgIHJldHVybiB3aGVyZTsKLX0KLQotLyoKLSAqIGVzY2FwZV9wYXRoX3NlZ21lbnQoKSBlc2NhcGVzIGEgcGF0aCBzZWdtZW50LCBhcyBkZWZpbmVkIGluIFJGQyAxODA4LiBUaGlzCi0gKiByb3V0aW5lIGlzIChzaG91bGQgYmUpIE9TIGluZGVwZW5kZW50LgotICoKLSAqIG9zX2VzY2FwZV9wYXRoKCkgY29udmVydHMgYW4gT1MgcGF0aCB0byBhIFVSTCwgaW4gYW4gT1MgZGVwZW5kZW50IHdheS4gSW4gYWxsCi0gKiBjYXNlcyBpZiBhICc6JyBvY2N1cnMgYmVmb3JlIHRoZSBmaXJzdCAnLycgaW4gdGhlIFVSTCwgdGhlIFVSTCBzaG91bGQgYmUKLSAqIHByZWZpeGVkIHdpdGggIi4vIiAob3IgdGhlICc6JyBlc2NhcGVkKS4gSW4gdGhlIGNhc2Ugb2YgVW5peCwgdGhpcyBtZWFucwotICogbGVhdmluZyAnLycgYWxvbmUsIGJ1dCBvdGhlcndpc2UgZG9pbmcgd2hhdCBlc2NhcGVfcGF0aF9zZWdtZW50KCkgZG9lcy4gRm9yCi0gKiBlZmZpY2llbmN5IHJlYXNvbnMsIHdlIGRvbid0IHVzZSBlc2NhcGVfcGF0aF9zZWdtZW50KCksIHdoaWNoIGlzIHByb3ZpZGVkIGZvcgotICogcmVmZXJlbmNlLiBBZ2FpbiwgUkZDIDE4MDggaXMgd2hlcmUgdGhpcyBzdHVmZiBpcyBkZWZpbmVkLgotICoKLSAqIElmIHBhcnRpYWwgaXMgc2V0LCBvc19lc2NhcGVfcGF0aCgpIGFzc3VtZXMgdGhhdCB0aGUgcGF0aCB3aWxsIGJlIGFwcGVuZGVkIHRvCi0gKiBzb21ldGhpbmcgd2l0aCBhICcvJyBpbiBpdCAoYW5kIHRodXMgZG9lcyBub3QgcHJlZml4ICIuLyIpLgotICovCi0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9lc2NhcGVfcGF0aF9zZWdtZW50KGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqc2VnbWVudCkKLXsKLSAgICBjaGFyICpjb3B5ID0gYXBfcGFsbG9jKHAsIDMgKiBzdHJsZW4oc2VnbWVudCkgKyAxKTsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzZWdtZW50OwotICAgIHVuc2lnbmVkIGNoYXIgKmQgPSAodW5zaWduZWQgY2hhciAqKWNvcHk7Ci0gICAgdW5zaWduZWQgYzsKLQotICAgIHdoaWxlICgoYyA9ICpzKSkgewotCWlmIChURVNUX0NIQVIoYywgVF9FU0NBUEVfUEFUSF9TRUdNRU5UKSkgewotCSAgICBkID0gYzJ4KGMsIGQpOwotCX0KLQllbHNlIHsKLQkgICAgKmQrKyA9IGM7Ci0JfQotCSsrczsKLSAgICB9Ci0gICAgKmQgPSAnXDAnOwotICAgIHJldHVybiBjb3B5OwotfQotCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfb3NfZXNjYXBlX3BhdGgoYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyICpwYXRoLCBpbnQgcGFydGlhbCkKLXsKLSAgICBjaGFyICpjb3B5ID0gYXBfcGFsbG9jKHAsIDMgKiBzdHJsZW4ocGF0aCkgKyAzKTsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwYXRoOwotICAgIHVuc2lnbmVkIGNoYXIgKmQgPSAodW5zaWduZWQgY2hhciAqKWNvcHk7Ci0gICAgdW5zaWduZWQgYzsKLQotICAgIGlmICghcGFydGlhbCkgewotCWNoYXIgKmNvbG9uID0gc3RyY2hyKHBhdGgsICc6Jyk7Ci0JY2hhciAqc2xhc2ggPSBzdHJjaHIocGF0aCwgJy8nKTsKLQotCWlmIChjb2xvbiAmJiAoIXNsYXNoIHx8IGNvbG9uIDwgc2xhc2gpKSB7Ci0JICAgICpkKysgPSAnLic7Ci0JICAgICpkKysgPSAnLyc7Ci0JfQotICAgIH0KLSAgICB3aGlsZSAoKGMgPSAqcykpIHsKLQlpZiAoVEVTVF9DSEFSKGMsIFRfT1NfRVNDQVBFX1BBVEgpKSB7Ci0JICAgIGQgPSBjMngoYywgZCk7Ci0JfQotCWVsc2UgewotCSAgICAqZCsrID0gYzsKLQl9Ci0JKytzOwotICAgIH0KLSAgICAqZCA9ICdcMCc7Ci0gICAgcmV0dXJuIGNvcHk7Ci19Ci0KLS8qIGFwX2VzY2FwZV91cmkgaXMgbm93IGEgbWFjcm8gZm9yIG9zX2VzY2FwZV9wYXRoICovCi0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9lc2NhcGVfaHRtbChhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKnMpCi17Ci0gICAgaW50IGksIGo7Ci0gICAgY2hhciAqeDsKLQotICAgIC8qIGZpcnN0LCBjb3VudCB0aGUgbnVtYmVyIG9mIGV4dHJhIGNoYXJhY3RlcnMgKi8KLSAgICBmb3IgKGkgPSAwLCBqID0gMDsgc1tpXSAhPSAnXDAnOyBpKyspCi0JaWYgKHNbaV0gPT0gJzwnIHx8IHNbaV0gPT0gJz4nKQotCSAgICBqICs9IDM7Ci0JZWxzZSBpZiAoc1tpXSA9PSAnJicpCi0JICAgIGogKz0gNDsKLQotICAgIGlmIChqID09IDApCi0JcmV0dXJuIGFwX3BzdHJuZHVwKHAsIHMsIGkpOwotCi0gICAgeCA9IGFwX3BhbGxvYyhwLCBpICsgaiArIDEpOwotICAgIGZvciAoaSA9IDAsIGogPSAwOyBzW2ldICE9ICdcMCc7IGkrKywgaisrKQotCWlmIChzW2ldID09ICc8JykgewotCSAgICBtZW1jcHkoJnhbal0sICImbHQ7IiwgNCk7Ci0JICAgIGogKz0gMzsKLQl9Ci0JZWxzZSBpZiAoc1tpXSA9PSAnPicpIHsKLQkgICAgbWVtY3B5KCZ4W2pdLCAiJmd0OyIsIDQpOwotCSAgICBqICs9IDM7Ci0JfQotCWVsc2UgaWYgKHNbaV0gPT0gJyYnKSB7Ci0JICAgIG1lbWNweSgmeFtqXSwgIiZhbXA7IiwgNSk7Ci0JICAgIGogKz0gNDsKLQl9Ci0JZWxzZQotCSAgICB4W2pdID0gc1tpXTsKLQotICAgIHhbal0gPSAnXDAnOwotICAgIHJldHVybiB4OwotfQotCi1BUElfRVhQT1JUKGludCkgYXBfaXNfZGlyZWN0b3J5KGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgc3RydWN0IHN0YXQgZmluZm87Ci0KLSAgICBpZiAoc3RhdChwYXRoLCAmZmluZm8pID09IC0xKQotCXJldHVybiAwOwkJLyogaW4gZXJyb3IgY29uZGl0aW9uLCBqdXN0IHJldHVybiBubyAqLwotCi0gICAgcmV0dXJuIChTX0lTRElSKGZpbmZvLnN0X21vZGUpKTsKLX0KLQotQVBJX0VYUE9SVChjaGFyICopIGFwX21ha2VfZnVsbF9wYXRoKGFwX2NvbnRleHRfdCAqYSwgY29uc3QgY2hhciAqc3JjMSwKLQkJCQkgIGNvbnN0IGNoYXIgKnNyYzIpCi17Ci0gICAgcmVnaXN0ZXIgaW50IHg7Ci0KLSAgICB4ID0gc3RybGVuKHNyYzEpOwotICAgIGlmICh4ID09IDApCi0JcmV0dXJuIGFwX3BzdHJjYXQoYSwgIi8iLCBzcmMyLCBOVUxMKTsKLQotICAgIGlmIChzcmMxW3ggLSAxXSAhPSAnLycpCi0JcmV0dXJuIGFwX3BzdHJjYXQoYSwgc3JjMSwgIi8iLCBzcmMyLCBOVUxMKTsKLSAgICBlbHNlCi0JcmV0dXJuIGFwX3BzdHJjYXQoYSwgc3JjMSwgc3JjMiwgTlVMTCk7Ci19Ci0KLS8qCi0gKiBDaGVjayBmb3IgYW4gYWJzb2x1dGVVUkkgc3ludGF4IChzZWUgc2VjdGlvbiAzLjIgaW4gUkZDMjA2OCkuCi0gKi8KLUFQSV9FWFBPUlQoaW50KSBhcF9pc191cmwoY29uc3QgY2hhciAqdSkKLXsKLSAgICByZWdpc3RlciBpbnQgeDsKLQotICAgIGZvciAoeCA9IDA7IHVbeF0gIT0gJzonOyB4KyspIHsKLQlpZiAoKCF1W3hdKSB8fAotCSAgICAoKCFhcF9pc2FscGhhKHVbeF0pKSAmJiAoIWFwX2lzZGlnaXQodVt4XSkpICYmCi0JICAgICAodVt4XSAhPSAnKycpICYmICh1W3hdICE9ICctJykgJiYgKHVbeF0gIT0gJy4nKSkpIHsKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiAoeCA/IDEgOiAwKTsJCS8qIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgJzonLCBpdCdzIGJyb2tlbiwgdG9vICovCi19Ci0KLSNpZm5kZWYgSEFWRV9TVFJEVVAKLWNoYXIgKnN0cmR1cChjb25zdCBjaGFyICpzdHIpCi17Ci0gICAgY2hhciAqc2R1cDsKLQotICAgIGlmICghKHNkdXAgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKHN0cikgKyAxKSkpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsICJPdWNoISAgT3V0IG9mIG1lbW9yeSBpbiBvdXIgc3RyZHVwKCkhIik7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHNkdXAgPSBzdHJjcHkoc2R1cCwgc3RyKTsKLQotICAgIHJldHVybiBzZHVwOwotfQotI2VuZGlmCi0KLS8qIFRoZSBmb2xsb3dpbmcgdHdvIHJvdXRpbmVzIHdlcmUgZG9uYXRlZCBmb3IgU1ZSNCBieSBBbmRyZWFzIFZvZ2VsICovCi0jaWZuZGVmIEhBVkVfU1RSQ0FTRUNNUAotaW50IHN0cmNhc2VjbXAoY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYikKLXsKLSAgICBjb25zdCBjaGFyICpwID0gYTsKLSAgICBjb25zdCBjaGFyICpxID0gYjsKLSAgICBmb3IgKHAgPSBhLCBxID0gYjsgKnAgJiYgKnE7IHArKywgcSsrKSB7Ci0JaW50IGRpZmYgPSBhcF90b2xvd2VyKCpwKSAtIGFwX3RvbG93ZXIoKnEpOwotCWlmIChkaWZmKQotCSAgICByZXR1cm4gZGlmZjsKLSAgICB9Ci0gICAgaWYgKCpwKQotCXJldHVybiAxOwkJLyogcCB3YXMgbG9uZ2VyIHRoYW4gcSAqLwotICAgIGlmICgqcSkKLQlyZXR1cm4gLTE7CQkvKiBwIHdhcyBzaG9ydGVyIHRoYW4gcSAqLwotICAgIHJldHVybiAwOwkJCS8qIEV4YWN0IG1hdGNoICovCi19Ci0KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfU1RSTkNBU0VDTVAKLWludCBzdHJuY2FzZWNtcChjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiLCBpbnQgbikKLXsKLSAgICBjb25zdCBjaGFyICpwID0gYTsKLSAgICBjb25zdCBjaGFyICpxID0gYjsKLQotICAgIGZvciAocCA9IGEsIHEgPSBiOyAvKk5PVEhJTkcgKi8gOyBwKyssIHErKykgewotCWludCBkaWZmOwotCWlmIChwID09IGEgKyBuKQotCSAgICByZXR1cm4gMDsJCS8qICAgTWF0Y2ggdXAgdG8gbiBjaGFyYWN0ZXJzICovCi0JaWYgKCEoKnAgJiYgKnEpKQotCSAgICByZXR1cm4gKnAgLSAqcTsKLQlkaWZmID0gYXBfdG9sb3dlcigqcCkgLSBhcF90b2xvd2VyKCpxKTsKLQlpZiAoZGlmZikKLQkgICAgcmV0dXJuIGRpZmY7Ci0gICAgfQotICAgIC8qTk9UUkVBQ0hFRCAqLwotfQotI2VuZGlmCi0KLS8qIFRoZSBmb2xsb3dpbmcgcm91dGluZSB3YXMgZG9uYXRlZCBmb3IgVVRTMjEgYnkgZHdkQGJlbGwtbGFicy5jb20gKi8KLSNpZm5kZWYgSEFWRV9TVFJTVFIKLWNoYXIgKnN0cnN0cihjaGFyICpzMSwgY2hhciAqczIpCi17Ci0gICAgY2hhciAqcDEsICpwMjsKLSAgICBpZiAoKnMyID09ICdcMCcpIHsKLQkvKiBhbiBlbXB0eSBzMiAqLwotICAgICAgICByZXR1cm4oczEpOwotICAgIH0KLSAgICB3aGlsZSgoczEgPSBzdHJjaHIoczEsICpzMikpICE9IE5VTEwpIHsKLQkvKiBmb3VuZCBmaXJzdCBjaGFyYWN0ZXIgb2YgczIsIHNlZSBpZiB0aGUgcmVzdCBtYXRjaGVzICovCi0gICAgICAgIHAxID0gczE7Ci0gICAgICAgIHAyID0gczI7Ci0gICAgICAgIHdoaWxlICgqKytwMSA9PSAqKytwMikgewotICAgICAgICAgICAgaWYgKCpwMSA9PSAnXDAnKSB7Ci0gICAgICAgICAgICAgICAgLyogYm90aCBzdHJpbmdzIGVuZGVkIHRvZ2V0aGVyICovCi0gICAgICAgICAgICAgICAgcmV0dXJuKHMxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKnAyID09ICdcMCcpIHsKLSAgICAgICAgICAgIC8qIHNlY29uZCBzdHJpbmcgZW5kZWQsIGEgbWF0Y2ggKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0JLyogZGlkbid0IGZpbmQgYSBtYXRjaCBoZXJlLCB0cnkgc3RhcnRpbmcgYXQgbmV4dCBjaGFyYWN0ZXIgaW4gczEgKi8KLSAgICAgICAgczErKzsKLSAgICB9Ci0gICAgcmV0dXJuKHMxKTsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfSU5JVEdST1VQUwotaW50IGluaXRncm91cHMoY29uc3QgY2hhciAqbmFtZSwgZ2lkX3QgYmFzZWdpZCkKLXsKLSNpZiBkZWZpbmVkKFFOWCkgfHwgZGVmaW5lZChNUEUpIHx8IGRlZmluZWQoQkVPUykgfHwgZGVmaW5lZChfT1NEX1BPU0lYKSB8fCBkZWZpbmVkKFRQRikgfHwgZGVmaW5lZChfX1RBTkRFTSkgfHwgZGVmaW5lZChPUzIpCi0vKiBRTlgsIE1QRSBhbmQgQmVPUyBkbyBub3QgYXBwZWFyIHRvIHN1cHBvcnQgc3VwcGxlbWVudGFyeSBncm91cHMuICovCi0gICAgcmV0dXJuIDA7Ci0jZWxzZSAvKiBuZGVmIFFOWCAqLwotICAgIGdpZF90IGdyb3Vwc1tOR1JPVVBTX01BWF07Ci0gICAgc3RydWN0IGdyb3VwICpnOwotICAgIGludCBpbmRleCA9IDA7Ci0KLSAgICBzZXRncmVudCgpOwotCi0gICAgZ3JvdXBzW2luZGV4KytdID0gYmFzZWdpZDsKLQotICAgIHdoaWxlIChpbmRleCA8IE5HUk9VUFNfTUFYICYmICgoZyA9IGdldGdyZW50KCkpICE9IE5VTEwpKQotCWlmIChnLT5ncl9naWQgIT0gYmFzZWdpZCkgewotCSAgICBjaGFyICoqbmFtZXM7Ci0KLQkgICAgZm9yIChuYW1lcyA9IGctPmdyX21lbTsgKm5hbWVzICE9IE5VTEw7ICsrbmFtZXMpCi0JCWlmICghc3RyY21wKCpuYW1lcywgbmFtZSkpCi0JCSAgICBncm91cHNbaW5kZXgrK10gPSBnLT5ncl9naWQ7Ci0JfQotCi0gICAgZW5kZ3JlbnQoKTsKLQotICAgIHJldHVybiBzZXRncm91cHMoaW5kZXgsIGdyb3Vwcyk7Ci0jZW5kaWYgLyogZGVmIFFOWCAqLwotfQotI2VuZGlmIC8qIGRlZiBORUVEX0lOSVRHUk9VUFMgKi8KLQotI2lmbmRlZiBIQVZFX1dBSVRQSUQKLS8qIEZyb20gaWtsdWZ0QGFtZGFobC5jb20KLSAqIHRoaXMgaXMgbm90IGlkZWFsIGJ1dCBpdCB3b3JrcyBmb3IgU1ZSMyB2YXJpYW50cwotICogTW9kaWZpZWQgYnkgZHdkQGJlbGwtbGFicy5jb20gdG8gY2FsbCB3YWl0MyBpbnN0ZWFkIG9mIHdhaXQgYmVjYXVzZQotICogICBhcGFjaGUgc3RhcnRlZCB0byB1c2UgdGhlIFdOT0hBTkcgb3B0aW9uLgotICovCi1pbnQgd2FpdHBpZChwaWRfdCBwaWQsIGludCAqc3RhdHVzcCwgaW50IG9wdGlvbnMpCi17Ci0gICAgaW50IHRtcF9waWQ7Ci0gICAgaWYgKGtpbGwocGlkLCAwKSA9PSAtMSkgewotCWVycm5vID0gRUNISUxEOwotCXJldHVybiAtMTsKLSAgICB9Ci0gICAgd2hpbGUgKCgodG1wX3BpZCA9IHdhaXQzKHN0YXR1c3AsIG9wdGlvbnMsIDApKSAhPSBwaWQpICYmCi0JCSh0bXBfcGlkICE9IC0xKSAmJiAodG1wX3BpZCAhPSAwKSAmJiAocGlkICE9IC0xKSkKLQk7Ci0gICAgcmV0dXJuIHRtcF9waWQ7Ci19Ci0jZW5kaWYKLQotQVBJX0VYUE9SVChpbnQpIGFwX2luZChjb25zdCBjaGFyICpzLCBjaGFyIGMpCi17Ci0gICAgcmVnaXN0ZXIgaW50IHg7Ci0KLSAgICBmb3IgKHggPSAwOyBzW3hdOyB4KyspCi0JaWYgKHNbeF0gPT0gYykKLQkgICAgcmV0dXJuIHg7Ci0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLUFQSV9FWFBPUlQoaW50KSBhcF9yaW5kKGNvbnN0IGNoYXIgKnMsIGNoYXIgYykKLXsKLSAgICByZWdpc3RlciBpbnQgeDsKLQotICAgIGZvciAoeCA9IHN0cmxlbihzKSAtIDE7IHggIT0gLTE7IHgtLSkKLQlpZiAoc1t4XSA9PSBjKQotCSAgICByZXR1cm4geDsKLQotICAgIHJldHVybiAtMTsKLX0KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9zdHJfdG9sb3dlcihjaGFyICpzdHIpCi17Ci0gICAgd2hpbGUgKCpzdHIpIHsKLQkqc3RyID0gYXBfdG9sb3dlcigqc3RyKTsKLQkrK3N0cjsKLSAgICB9Ci19Ci0KLUFQSV9FWFBPUlQodWlkX3QpIGFwX3VuYW1lMmlkKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0jaWZkZWYgV0lOMzIKLSAgICByZXR1cm4gKDEpOwotI2Vsc2UKLSAgICBzdHJ1Y3QgcGFzc3dkICplbnQ7Ci0KLSAgICBpZiAobmFtZVswXSA9PSAnIycpCi0JcmV0dXJuIChhdG9pKCZuYW1lWzFdKSk7Ci0KLSAgICBpZiAoIShlbnQgPSBnZXRwd25hbShuYW1lKSkpIHsKLQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfU1RBUlRVUCB8IEFQTE9HX05PRVJSTk8sIDAsIE5VTEwsICIlczogYmFkIHVzZXIgbmFtZSAlcyIsIGFwX3NlcnZlcl9hcmd2MCwgbmFtZSk7Ci0JZXhpdCgxKTsKLSAgICB9Ci0gICAgcmV0dXJuIChlbnQtPnB3X3VpZCk7Ci0jZW5kaWYKLX0KLQotQVBJX0VYUE9SVChnaWRfdCkgYXBfZ25hbWUyaWQoY29uc3QgY2hhciAqbmFtZSkKLXsKLSNpZmRlZiBXSU4zMgotICAgIHJldHVybiAoMSk7Ci0jZWxzZQotICAgIHN0cnVjdCBncm91cCAqZW50OwotCi0gICAgaWYgKG5hbWVbMF0gPT0gJyMnKQotCXJldHVybiAoYXRvaSgmbmFtZVsxXSkpOwotCi0gICAgaWYgKCEoZW50ID0gZ2V0Z3JuYW0obmFtZSkpKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAiJXM6IGJhZCBncm91cCBuYW1lICVzIiwgYXBfc2VydmVyX2FyZ3YwLCBuYW1lKTsKLQlleGl0KDEpOwotICAgIH0KLSAgICByZXR1cm4gKGVudC0+Z3JfZ2lkKTsKLSNlbmRpZgotfQotCi0KLS8qCi0gKiBQYXJzZXMgYSBob3N0IG9mIHRoZSBmb3JtIDxhZGRyZXNzPls6cG9ydF0KLSAqIDpwb3J0IGlzIHBlcm1pdHRlZCBpZiAncG9ydCcgaXMgbm90IE5VTEwKLSAqLwotdW5zaWduZWQgbG9uZyBhcF9nZXRfdmlydGhvc3RfYWRkcihjaGFyICp3LCB1bnNpZ25lZCBzaG9ydCAqcG9ydHMpCi17Ci0gICAgc3RydWN0IGhvc3RlbnQgKmhlcDsKLSAgICB1bnNpZ25lZCBsb25nIG15X2FkZHI7Ci0gICAgY2hhciAqcDsKLQotICAgIHAgPSBzdHJjaHIodywgJzonKTsKLSAgICBpZiAocG9ydHMgIT0gTlVMTCkgewotCSpwb3J0cyA9IDA7Ci0JaWYgKHAgIT0gTlVMTCAmJiBzdHJjbXAocCArIDEsICIqIikgIT0gMCkKLQkgICAgKnBvcnRzID0gYXRvaShwICsgMSk7Ci0gICAgfQotCi0gICAgaWYgKHAgIT0gTlVMTCkKLQkqcCA9ICdcMCc7Ci0gICAgaWYgKHN0cmNtcCh3LCAiKiIpID09IDApIHsKLQlpZiAocCAhPSBOVUxMKQotCSAgICAqcCA9ICc6JzsKLQlyZXR1cm4gaHRvbmwoSU5BRERSX0FOWSk7Ci0gICAgfQotCi0gICAgbXlfYWRkciA9IGFwX2luZXRfYWRkcigoY2hhciAqKXcpOwotICAgIGlmIChteV9hZGRyICE9IElOQUREUl9OT05FKSB7Ci0JaWYgKHAgIT0gTlVMTCkKLQkgICAgKnAgPSAnOic7Ci0JcmV0dXJuIG15X2FkZHI7Ci0gICAgfQotCi0gICAgaGVwID0gZ2V0aG9zdGJ5bmFtZSh3KTsKLQotICAgIGlmICgoIWhlcCkgfHwgKGhlcC0+aF9hZGRydHlwZSAhPSBBRl9JTkVUIHx8ICFoZXAtPmhfYWRkcl9saXN0WzBdKSkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgIkNhbm5vdCByZXNvbHZlIGhvc3QgbmFtZSAlcyAtLS0gZXhpdGluZyEiLCB3KTsKLQlleGl0KDEpOwotICAgIH0KLQotICAgIGlmIChoZXAtPmhfYWRkcl9saXN0WzFdKSB7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAiSG9zdCAlcyBoYXMgbXVsdGlwbGUgYWRkcmVzc2VzIC0tLSIsIHcpOwotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgInlvdSBtdXN0IGNob29zZSBvbmUgZXhwbGljaXRseSBmb3IgdXNlIGFzIik7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAiYSB2aXJ0dWFsIGhvc3QuICBFeGl0aW5nISEhIik7Ci0JZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBpZiAocCAhPSBOVUxMKQotCSpwID0gJzonOwotCi0gICAgcmV0dXJuICgoc3RydWN0IGluX2FkZHIgKikgKGhlcC0+aF9hZGRyKSktPnNfYWRkcjsKLX0KLQotCi1zdGF0aWMgY2hhciAqZmluZF9mcWRuKGFwX2NvbnRleHRfdCAqYSwgc3RydWN0IGhvc3RlbnQgKnApCi17Ci0gICAgaW50IHg7Ci0KLSAgICBpZiAoIXN0cmNocihwLT5oX25hbWUsICcuJykpIHsKLQlmb3IgKHggPSAwOyBwLT5oX2FsaWFzZXNbeF07ICsreCkgewotCSAgICBpZiAoc3RyY2hyKHAtPmhfYWxpYXNlc1t4XSwgJy4nKSAmJgotCQkoIXN0cm5jYXNlY21wKHAtPmhfYWxpYXNlc1t4XSwgcC0+aF9uYW1lLCBzdHJsZW4ocC0+aF9uYW1lKSkpKQotCQlyZXR1cm4gYXBfcHN0cmR1cChhLCBwLT5oX2FsaWFzZXNbeF0pOwotCX0KLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIGFwX3BzdHJkdXAoYSwgKHZvaWQgKikgcC0+aF9uYW1lKTsKLX0KLQotY2hhciAqYXBfZ2V0X2xvY2FsX2hvc3QoYXBfY29udGV4dF90ICphKQotewotI2lmbmRlZiBNQVhIT1NUTkFNRUxFTgotI2RlZmluZSBNQVhIT1NUTkFNRUxFTiAyNTYKLSNlbmRpZgotICAgIGNoYXIgc3RyW01BWEhPU1ROQU1FTEVOICsgMV07Ci0gICAgY2hhciAqc2VydmVyX2hvc3RuYW1lOwotICAgIHN0cnVjdCBob3N0ZW50ICpwOwotCi0jaWZkZWYgQkVPUwotICAgIGlmIChnZXRob3N0bmFtZShzdHIsIHNpemVvZihzdHIpIC0gMSkgPT0gMCkKLSNlbHNlCi0gICAgaWYgKGdldGhvc3RuYW1lKHN0ciwgc2l6ZW9mKHN0cikgLSAxKSAhPSAwKQotI2VuZGlmCi0gICAgewotCXBlcnJvcigiVW5hYmxlIHRvIGdldGhvc3RuYW1lIik7Ci0JZXhpdCgxKTsKLSAgICB9Ci0gICAgc3RyW01BWEhPU1ROQU1FTEVOXSA9ICdcMCc7Ci0gICAgaWYgKCghKHAgPSBnZXRob3N0YnluYW1lKHN0cikpKSB8fCAoIShzZXJ2ZXJfaG9zdG5hbWUgPSBmaW5kX2ZxZG4oYSwgcCkpKSkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19TVEFSVFVQIHwgQVBMT0dfTk9FUlJOTywgMCwgTlVMTCwgCi0gICAgICAgICAgICAgICAgICAgICAiJXM6IGNhbm5vdCBkZXRlcm1pbmUgbG9jYWwgaG9zdCBuYW1lLiIsCi0JCWFwX3NlcnZlcl9hcmd2MCk7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX1NUQVJUVVAgfCBBUExPR19OT0VSUk5PLCAwLCBOVUxMLCAKLSAgICAgICAgICAgICAgICAgICAgICJVc2UgdGhlIFNlcnZlck5hbWUgZGlyZWN0aXZlIHRvIHNldCBpdCBtYW51YWxseS4iKTsKLQlleGl0KDEpOwotICAgIH0KLQotICAgIHJldHVybiBzZXJ2ZXJfaG9zdG5hbWU7Ci19Ci0KLS8qIHNpbXBsZSAncG9vbCcgYWxsb2MoKWluZyBnbHVlIHRvIGFwX2Jhc2U2NC5jCi0gKi8KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9wYmFzZTY0ZGVjb2RlKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqYnVmY29kZWQpCi17Ci0gICAgY2hhciAqZGVjb2RlZDsKLSAgICBpbnQgbDsKLQotICAgIGRlY29kZWQgPSAoY2hhciAqKSBhcF9wYWxsb2MocCwgMSArIGFwX2Jhc2U2NGRlY29kZV9sZW4oYnVmY29kZWQpKTsKLSAgICBsID0gYXBfYmFzZTY0ZGVjb2RlKGRlY29kZWQsIGJ1ZmNvZGVkKTsKLSAgICBkZWNvZGVkW2xdID0gJ1wwJzsgLyogbWFrZSBiaW5hcnkgc2VxdWVuY2UgaW50byBzdHJpbmcgKi8KLQotICAgIHJldHVybiBkZWNvZGVkOwotfQotCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfcGJhc2U2NGVuY29kZShhcF9jb250ZXh0X3QgKnAsIGNoYXIgKnN0cmluZykgCi17IAotICAgIGNoYXIgKmVuY29kZWQ7Ci0gICAgaW50IGwgPSBzdHJsZW4oc3RyaW5nKTsKLQotICAgIGVuY29kZWQgPSAoY2hhciAqKSBhcF9wYWxsb2MocCwgMSArIGFwX2Jhc2U2NGVuY29kZV9sZW4obCkpOwotICAgIGwgPSBhcF9iYXNlNjRlbmNvZGUoZW5jb2RlZCwgc3RyaW5nLCBsKTsKLSAgICBlbmNvZGVkW2xdID0gJ1wwJzsgLyogbWFrZSBiaW5hcnkgc2VxdWVuY2UgaW50byBzdHJpbmcgKi8KLQotICAgIHJldHVybiBlbmNvZGVkOwotfQotCi0vKiBkZXByZWNhdGVkIG5hbWVzIGZvciB0aGUgYWJvdmUgdHdvIGZ1bmN0aW9ucywgaGVyZSBmb3IgY29tcGF0aWJpbGl0eQotICovCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfdXVkZWNvZGUoYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyICpidWZjb2RlZCkKLXsKLSAgICByZXR1cm4gYXBfcGJhc2U2NGRlY29kZShwLCBidWZjb2RlZCk7Ci19Ci0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF91dWVuY29kZShhcF9jb250ZXh0X3QgKnAsIGNoYXIgKnN0cmluZykgCi17IAotICAgIHJldHVybiBhcF9wYmFzZTY0ZW5jb2RlKHAsIHN0cmluZyk7Ci19Ci0KLSNpZm5kZWYgSEFWRV9TVFJFUlJPUgotY2hhciAqCi0gICAgIHN0cmVycm9yKGludCBlcnIpCi17Ci0KLSAgICBjaGFyICpwOwotICAgIGV4dGVybiBjaGFyICpjb25zdCBzeXNfZXJybGlzdFtdOwotCi0gICAgcCA9IHN5c19lcnJsaXN0W2Vycl07Ci0gICAgcmV0dXJuIChwKTsKLX0KLSNlbmRpZgotCi0vKiB3ZSB3YW50IHRvIGRvd25jYXNlIHRoZSB0eXBlL3N1YnR5cGUgZm9yIGNvbXBhcmlzb24gcHVycG9zZXMKLSAqIGJ1dCBub3RoaW5nIGVsc2UgYmVjYXVzZSA7cGFyYW1ldGVyPWZvbyB2YWx1ZXMgYXJlIGNhc2Ugc2Vuc2l0aXZlLgotICogWFhYOiBpbiB0cnV0aCB3ZSB3YW50IHRvIGRvd25jYXNlIHBhcmFtZXRlciBuYW1lcy4uLiBidXQgcmVhbGx5LAotICogYXBhY2hlIGhhcyBuZXZlciBoYW5kbGVkIHBhcmFtZXRlcnMgYW5kIHN1Y2ggY29ycmVjdGx5LiAgWW91Ci0gKiBhbHNvIG5lZWQgdG8gY29tcHJlc3Mgc3BhY2VzIGFuZCBzdWNoIHRvIGJlIGFibGUgdG8gY29tcGFyZQotICogcHJvcGVybHkuIC1kamcKLSAqLwotQVBJX0VYUE9SVCh2b2lkKSBhcF9jb250ZW50X3R5cGVfdG9sb3dlcihjaGFyICpzdHIpCi17Ci0gICAgY2hhciAqc2VtaTsKLQotICAgIHNlbWkgPSBzdHJjaHIoc3RyLCAnOycpOwotICAgIGlmIChzZW1pKSB7Ci0JKnNlbWkgPSAnXDAnOwotICAgIH0KLSAgICB3aGlsZSAoKnN0cikgewotCSpzdHIgPSBhcF90b2xvd2VyKCpzdHIpOwotCSsrc3RyOwotICAgIH0KLSAgICBpZiAoc2VtaSkgewotCSpzZW1pID0gJzsnOwotICAgIH0KLX0KLQotLyoKLSAqIEdpdmVuIGEgc3RyaW5nLCByZXBsYWNlIGFueSBiYXJlICIgd2l0aCBcIiAuCi0gKi8KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9lc2NhcGVfcXVvdGVzIChhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKmluc3RyaW5nKQotewotICAgIGludCBuZXdsZW4gPSAwOwotICAgIGNvbnN0IGNoYXIgKmluY2hyID0gaW5zdHJpbmc7Ci0gICAgY2hhciAqb3V0Y2hyLCAqb3V0c3RyaW5nOwotCi0gICAgLyoKLSAgICAgKiBMb29rIHRocm91Z2ggdGhlIGlucHV0IHN0cmluZywgam9nZ2luZyB0aGUgbGVuZ3RoIG9mIHRoZSBvdXRwdXQKLSAgICAgKiBzdHJpbmcgdXAgYnkgYW4gZXh0cmEgYnl0ZSBlYWNoIHRpbWUgd2UgZmluZCBhbiB1bmVzY2FwZWQgIi4KLSAgICAgKi8KLSAgICB3aGlsZSAoKmluY2hyICE9ICdcMCcpIHsKLQluZXdsZW4rKzsKLSAgICAgICAgaWYgKCppbmNociA9PSAnIicpIHsKLQkgICAgbmV3bGVuKys7Ci0JfQotCS8qCi0JICogSWYgd2UgZmluZCBhIHNsb3NoLCBhbmQgaXQncyBub3QgdGhlIGxhc3QgYnl0ZSBpbiB0aGUgc3RyaW5nLAotCSAqIGl0J3MgZXNjYXBpbmcgc29tZXRoaW5nIC0gYWR2YW5jZSBwYXN0IGJvdGggYnl0ZXMuCi0JICovCi0JaWYgKCgqaW5jaHIgPT0gJ1xcJykgJiYgKGluY2hyWzFdICE9ICdcMCcpKSB7Ci0JICAgIGluY2hyKys7Ci0JICAgIG5ld2xlbisrOwotCX0KLQlpbmNocisrOwotICAgIH0KLSAgICBvdXRzdHJpbmcgPSBhcF9wYWxsb2MocCwgbmV3bGVuICsgMSk7Ci0gICAgaW5jaHIgPSBpbnN0cmluZzsKLSAgICBvdXRjaHIgPSBvdXRzdHJpbmc7Ci0gICAgLyoKLSAgICAgKiBOb3cgY29weSB0aGUgaW5wdXQgc3RyaW5nIHRvIHRoZSBvdXRwdXQgc3RyaW5nLCBpbnNlcnRpbmcgYSBzbG9zaAotICAgICAqIGluIGZyb250IG9mIGV2ZXJ5ICIgdGhhdCBkb2Vzbid0IGFscmVhZHkgaGF2ZSBvbmUuCi0gICAgICovCi0gICAgd2hpbGUgKCppbmNociAhPSAnXDAnKSB7Ci0JaWYgKCgqaW5jaHIgPT0gJ1xcJykgJiYgKGluY2hyWzFdICE9ICdcMCcpKSB7Ci0JICAgICpvdXRjaHIrKyA9ICppbmNocisrOwotCSAgICAqb3V0Y2hyKysgPSAqaW5jaHIrKzsKLQl9Ci0JaWYgKCppbmNociA9PSAnIicpIHsKLQkgICAgKm91dGNocisrID0gJ1xcJzsKLQl9Ci0JaWYgKCppbmNociAhPSAnXDAnKSB7Ci0JICAgICpvdXRjaHIrKyA9ICppbmNocisrOwotCX0KLSAgICB9Ci0gICAgKm91dGNociA9ICdcMCc7Ci0gICAgcmV0dXJuIG91dHN0cmluZzsKLX0KZGlmZiAtLWdpdCBhL3NlcnZlci91dGlsX2RhdGUuYyBiL3NlcnZlci91dGlsX2RhdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg4MDllOS4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvdXRpbF9kYXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogdXRpbF9kYXRlLmM6IGRhdGUgcGFyc2luZyB1dGlsaXR5IHJvdXRpbmVzCi0gKiAgICAgVGhlc2Ugcm91dGluZXMgYXJlIChob3BlZnVsbHkpIHBsYXRmb3JtIGluZGVwZW5kZW50LgotICogCi0gKiAyNyBPY3QgMTk5NiAgUm95IEZpZWxkaW5nCi0gKiAgICAgRXh0cmFjdGVkICh3aXRoIG1hbnkgbW9kaWZpY2F0aW9ucykgZnJvbSBtb2RfcHJveHkuYyBhbmQKLSAqICAgICB0ZXN0ZWQgd2l0aCBvdmVyIDUwLDAwMCByYW5kb21seSBjaG9zZW4gdmFsaWQgZGF0ZSBzdHJpbmdzCi0gKiAgICAgYW5kIHNldmVyYWwgaHVuZHJlZCB2YXJpYXRpb25zIG9mIGludmFsaWQgZGF0ZSBzdHJpbmdzLgotICogCi0gKi8KLQotI2RlZmluZSBDT1JFX1BSSVZBVEUKLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgInV0aWxfZGF0ZS5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLS8qCi0gKiBDb21wYXJlIGEgc3RyaW5nIHRvIGEgbWFzawotICogTWFzayBjaGFyYWN0ZXJzIChhcmJpdHJhcnkgbWF4aW11bSBpcyAyNTYgY2hhcmFjdGVycywganVzdCBpbiBjYXNlKToKLSAqICAgQCAtIHVwcGVyY2FzZSBsZXR0ZXIKLSAqICAgJCAtIGxvd2VyY2FzZSBsZXR0ZXIKLSAqICAgJiAtIGhleCBkaWdpdAotICogICAjIC0gZGlnaXQKLSAqICAgfiAtIGRpZ2l0IG9yIHNwYWNlCi0gKiAgICogLSBzd2FsbG93IHJlbWFpbmluZyBjaGFyYWN0ZXJzIAotICogIDx4PiAtIGV4YWN0IG1hdGNoIGZvciBhbnkgb3RoZXIgY2hhcmFjdGVyCi0gKi8KLUFQSV9FWFBPUlQoaW50KSBhcF9jaGVja21hc2soY29uc3QgY2hhciAqZGF0YSwgY29uc3QgY2hhciAqbWFzaykKLXsKLSAgICBpbnQgaTsKLSAgICBjaGFyIGQ7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLQlkID0gZGF0YVtpXTsKLQlzd2l0Y2ggKG1hc2tbaV0pIHsKLQljYXNlICdcMCc6Ci0JICAgIHJldHVybiAoZCA9PSAnXDAnKTsKLQotCWNhc2UgJyonOgotCSAgICByZXR1cm4gMTsKLQotCWNhc2UgJ0AnOgotCSAgICBpZiAoIWFwX2lzdXBwZXIoZCkpCi0JCXJldHVybiAwOwotCSAgICBicmVhazsKLQljYXNlICckJzoKLQkgICAgaWYgKCFhcF9pc2xvd2VyKGQpKQotCQlyZXR1cm4gMDsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnIyc6Ci0JICAgIGlmICghYXBfaXNkaWdpdChkKSkKLQkJcmV0dXJuIDA7Ci0JICAgIGJyZWFrOwotCWNhc2UgJyYnOgotCSAgICBpZiAoIWFwX2lzeGRpZ2l0KGQpKQotCQlyZXR1cm4gMDsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnfic6Ci0JICAgIGlmICgoZCAhPSAnICcpICYmICFhcF9pc2RpZ2l0KGQpKQotCQlyZXR1cm4gMDsKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgaWYgKG1hc2tbaV0gIT0gZCkKLQkJcmV0dXJuIDA7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIDA7CQkJLyogV2Ugb25seSBnZXQgaGVyZSBpZiBtYXNrIGlzIGNvcnJ1cHRlZCAoZXhjZWVkcyAyNTYpICovCi19Ci0KLQotLyoKLSAqIFBhcnNlcyBhbiBIVFRQIGRhdGUgaW4gb25lIG9mIHRocmVlIHN0YW5kYXJkIGZvcm1zOgotICoKLSAqICAgICBTdW4sIDA2IE5vdiAxOTk0IDA4OjQ5OjM3IEdNVCAgOyBSRkMgODIyLCB1cGRhdGVkIGJ5IFJGQyAxMTIzCi0gKiAgICAgU3VuZGF5LCAwNi1Ob3YtOTQgMDg6NDk6MzcgR01UIDsgUkZDIDg1MCwgb2Jzb2xldGVkIGJ5IFJGQyAxMDM2Ci0gKiAgICAgU3VuIE5vdiAgNiAwODo0OTozNyAxOTk0ICAgICAgIDsgQU5TSSBDJ3MgYXNjdGltZSgpIGZvcm1hdAotICoKLSAqIGFuZCByZXR1cm5zIHRoZSB0aW1lX3QgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgMSBKYW4gMTk3MCBHTVQsIG9yCi0gKiAwIGlmIHRoaXMgd291bGQgYmUgb3V0IG9mIHJhbmdlIG9yIGlmIHRoZSBkYXRlIGlzIGludmFsaWQuCi0gKgotICogVGhlIHJlc3RyaWN0ZWQgSFRUUCBzeW50YXggaXMKLSAqIAotICogICAgIEhUVFAtZGF0ZSAgICA9IHJmYzExMjMtZGF0ZSB8IHJmYzg1MC1kYXRlIHwgYXNjdGltZS1kYXRlCi0gKgotICogICAgIHJmYzExMjMtZGF0ZSA9IHdrZGF5ICIsIiBTUCBkYXRlMSBTUCB0aW1lIFNQICJHTVQiCi0gKiAgICAgcmZjODUwLWRhdGUgID0gd2Vla2RheSAiLCIgU1AgZGF0ZTIgU1AgdGltZSBTUCAiR01UIgotICogICAgIGFzY3RpbWUtZGF0ZSA9IHdrZGF5IFNQIGRhdGUzIFNQIHRpbWUgU1AgNERJR0lUCi0gKgotICogICAgIGRhdGUxICAgICAgICA9IDJESUdJVCBTUCBtb250aCBTUCA0RElHSVQKLSAqICAgICAgICAgICAgICAgICAgICA7IGRheSBtb250aCB5ZWFyIChlLmcuLCAwMiBKdW4gMTk4MikKLSAqICAgICBkYXRlMiAgICAgICAgPSAyRElHSVQgIi0iIG1vbnRoICItIiAyRElHSVQKLSAqICAgICAgICAgICAgICAgICAgICA7IGRheS1tb250aC15ZWFyIChlLmcuLCAwMi1KdW4tODIpCi0gKiAgICAgZGF0ZTMgICAgICAgID0gbW9udGggU1AgKCAyRElHSVQgfCAoIFNQIDFESUdJVCApKQotICogICAgICAgICAgICAgICAgICAgIDsgbW9udGggZGF5IChlLmcuLCBKdW4gIDIpCi0gKgotICogICAgIHRpbWUgICAgICAgICA9IDJESUdJVCAiOiIgMkRJR0lUICI6IiAyRElHSVQKLSAqICAgICAgICAgICAgICAgICAgICA7IDAwOjAwOjAwIC0gMjM6NTk6NTkKLSAqCi0gKiAgICAgd2tkYXkgICAgICAgID0gIk1vbiIgfCAiVHVlIiB8ICJXZWQiCi0gKiAgICAgICAgICAgICAgICAgIHwgIlRodSIgfCAiRnJpIiB8ICJTYXQiIHwgIlN1biIKLSAqCi0gKiAgICAgd2Vla2RheSAgICAgID0gIk1vbmRheSIgfCAiVHVlc2RheSIgfCAiV2VkbmVzZGF5IgotICogICAgICAgICAgICAgICAgICB8ICJUaHVyc2RheSIgfCAiRnJpZGF5IiB8ICJTYXR1cmRheSIgfCAiU3VuZGF5IgotICoKLSAqICAgICBtb250aCAgICAgICAgPSAiSmFuIiB8ICJGZWIiIHwgIk1hciIgfCAiQXByIgotICogICAgICAgICAgICAgICAgICB8ICJNYXkiIHwgIkp1biIgfCAiSnVsIiB8ICJBdWciCi0gKiAgICAgICAgICAgICAgICAgIHwgIlNlcCIgfCAiT2N0IiB8ICJOb3YiIHwgIkRlYyIKLSAqCi0gKiBIb3dldmVyLCBmb3IgdGhlIHNha2Ugb2Ygcm9idXN0bmVzcyAoYW5kIE5ldHNjYXBlbmVzcyksIHdlIGlnbm9yZSB0aGUKLSAqIHdlZWtkYXkgYW5kIGFueXRoaW5nIGFmdGVyIHRoZSB0aW1lIGZpZWxkIChpbmNsdWRpbmcgdGhlIHRpbWV6b25lKS4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgaXMgaW50ZW5kZWQgdG8gYmUgdmVyeSBmYXN0OyAxMHggZmFzdGVyIHRoYW4gdXNpbmcgc3NjYW5mLgotICoKLSAqIE9yaWdpbmFsbHkgZnJvbSBBbmRyZXcgRGF2aWVsIDxhbmRyZXdAdmFuY291dmVyLXdlYnBhZ2VzLmNvbT4sIDI5IEp1bCA5NgotICogYnV0IG1hbnkgY2hhbmdlcyBzaW5jZSB0aGVuLgotICoKLSAqLwotQVBJX0VYUE9SVChhcF90aW1lX3QpIGFwX3BhcnNlSFRUUGRhdGUoY29uc3QgY2hhciAqZGF0ZSkKLXsKLSAgICBhcF9leHBsb2RlZF90aW1lX3QgZHM7Ci0gICAgYXBfdGltZV90IHJlc3VsdDsKLSAgICBpbnQgbWludCwgbW9uOwotICAgIGNvbnN0IGNoYXIgKm1vbnN0ciwgKnRpbXN0cjsKLSAgICBzdGF0aWMgY29uc3QgaW50IG1vbnRoc1sxMl0gPQotICAgIHsKLQkoJ0onIDw8IDE2KSB8ICgnYScgPDwgOCkgfCAnbicsICgnRicgPDwgMTYpIHwgKCdlJyA8PCA4KSB8ICdiJywKLQkoJ00nIDw8IDE2KSB8ICgnYScgPDwgOCkgfCAncicsICgnQScgPDwgMTYpIHwgKCdwJyA8PCA4KSB8ICdyJywKLQkoJ00nIDw8IDE2KSB8ICgnYScgPDwgOCkgfCAneScsICgnSicgPDwgMTYpIHwgKCd1JyA8PCA4KSB8ICduJywKLQkoJ0onIDw8IDE2KSB8ICgndScgPDwgOCkgfCAnbCcsICgnQScgPDwgMTYpIHwgKCd1JyA8PCA4KSB8ICdnJywKLQkoJ1MnIDw8IDE2KSB8ICgnZScgPDwgOCkgfCAncCcsICgnTycgPDwgMTYpIHwgKCdjJyA8PCA4KSB8ICd0JywKLQkoJ04nIDw8IDE2KSB8ICgnbycgPDwgOCkgfCAndicsICgnRCcgPDwgMTYpIHwgKCdlJyA8PCA4KSB8ICdjJ307Ci0KLSAgICBpZiAoIWRhdGUpCi0JcmV0dXJuIEJBRF9EQVRFOwotCi0gICAgd2hpbGUgKCpkYXRlICYmIGFwX2lzc3BhY2UoKmRhdGUpKQkvKiBGaW5kIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGNoYXIgKi8KLQkrK2RhdGU7Ci0KLSAgICBpZiAoKmRhdGUgPT0gJ1wwJykKLQlyZXR1cm4gQkFEX0RBVEU7Ci0KLSAgICBpZiAoKGRhdGUgPSBzdHJjaHIoZGF0ZSwgJyAnKSkgPT0gTlVMTCkJLyogRmluZCBzcGFjZSBhZnRlciB3ZWVrZGF5ICovCi0JcmV0dXJuIEJBRF9EQVRFOwotCi0gICAgKytkYXRlOwkJCS8qIE5vdyBwb2ludGluZyB0byBmaXJzdCBjaGFyIGFmdGVyIHNwYWNlLCB3aGljaCBzaG91bGQgYmUgKi8KLSAgICAvKiBzdGFydCBvZiB0aGUgYWN0dWFsIGRhdGUgaW5mb3JtYXRpb24gZm9yIGFsbCAzIGZvcm1hdHMuICovCi0KLSAgICBpZiAoYXBfY2hlY2ttYXNrKGRhdGUsICIjIyBAJCQgIyMjIyAjIzojIzojIyAqIikpIHsJLyogUkZDIDExMjMgZm9ybWF0ICovCi0JZHMudG1feWVhciA9ICgoZGF0ZVs3XSAtICcwJykgKiAxMCArIChkYXRlWzhdIC0gJzAnKSAtIDE5KSAqIDEwMDsKLQlpZiAoZHMudG1feWVhciA8IDApCi0JICAgIHJldHVybiBCQURfREFURTsKLQotCWRzLnRtX3llYXIgKz0gKChkYXRlWzldIC0gJzAnKSAqIDEwKSArIChkYXRlWzEwXSAtICcwJyk7Ci0KLQlkcy50bV9tZGF5ID0gKChkYXRlWzBdIC0gJzAnKSAqIDEwKSArIChkYXRlWzFdIC0gJzAnKTsKLQotCW1vbnN0ciA9IGRhdGUgKyAzOwotCXRpbXN0ciA9IGRhdGUgKyAxMjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYXBfY2hlY2ttYXNrKGRhdGUsICIjIy1AJCQtIyMgIyM6IyM6IyMgKiIpKSB7CQkvKiBSRkMgODUwIGZvcm1hdCAgKi8KLQlkcy50bV95ZWFyID0gKChkYXRlWzddIC0gJzAnKSAqIDEwKSArIChkYXRlWzhdIC0gJzAnKTsKLQlpZiAoZHMudG1feWVhciA8IDcwKQotCSAgICBkcy50bV95ZWFyICs9IDEwMDsKLQotCWRzLnRtX21kYXkgPSAoKGRhdGVbMF0gLSAnMCcpICogMTApICsgKGRhdGVbMV0gLSAnMCcpOwotCi0JbW9uc3RyID0gZGF0ZSArIDM7Ci0JdGltc3RyID0gZGF0ZSArIDEwOwotICAgIH0KLSAgICBlbHNlIGlmIChhcF9jaGVja21hc2soZGF0ZSwgIkAkJCB+IyAjIzojIzojIyAjIyMjKiIpKSB7CS8qIGFzY3RpbWUgZm9ybWF0ICAqLwotCWRzLnRtX3llYXIgPSAoKGRhdGVbMTZdIC0gJzAnKSAqIDEwICsgKGRhdGVbMTddIC0gJzAnKSAtIDE5KSAqIDEwMDsKLQlpZiAoZHMudG1feWVhciA8IDApCi0JICAgIHJldHVybiBCQURfREFURTsKLQotCWRzLnRtX3llYXIgKz0gKChkYXRlWzE4XSAtICcwJykgKiAxMCkgKyAoZGF0ZVsxOV0gLSAnMCcpOwotCi0JaWYgKGRhdGVbNF0gPT0gJyAnKQotCSAgICBkcy50bV9tZGF5ID0gMDsKLQllbHNlCi0JICAgIGRzLnRtX21kYXkgPSAoZGF0ZVs0XSAtICcwJykgKiAxMDsKLQotCWRzLnRtX21kYXkgKz0gKGRhdGVbNV0gLSAnMCcpOwotCi0JbW9uc3RyID0gZGF0ZTsKLQl0aW1zdHIgPSBkYXRlICsgNzsKLSAgICB9Ci0gICAgZWxzZQotCXJldHVybiBCQURfREFURTsKLQotICAgIGlmIChkcy50bV9tZGF5IDw9IDAgfHwgZHMudG1fbWRheSA+IDMxKQotCXJldHVybiBCQURfREFURTsKLQotICAgIGRzLnRtX2hvdXIgPSAoKHRpbXN0clswXSAtICcwJykgKiAxMCkgKyAodGltc3RyWzFdIC0gJzAnKTsKLSAgICBkcy50bV9taW4gPSAoKHRpbXN0clszXSAtICcwJykgKiAxMCkgKyAodGltc3RyWzRdIC0gJzAnKTsKLSAgICBkcy50bV9zZWMgPSAoKHRpbXN0cls2XSAtICcwJykgKiAxMCkgKyAodGltc3RyWzddIC0gJzAnKTsKLQotICAgIGlmICgoZHMudG1faG91ciA+IDIzKSB8fCAoZHMudG1fbWluID4gNTkpIHx8IChkcy50bV9zZWMgPiA2MSkpCi0JcmV0dXJuIEJBRF9EQVRFOwotCi0gICAgbWludCA9IChtb25zdHJbMF0gPDwgMTYpIHwgKG1vbnN0clsxXSA8PCA4KSB8IG1vbnN0clsyXTsKLSAgICBmb3IgKG1vbiA9IDA7IG1vbiA8IDEyOyBtb24rKykKLQlpZiAobWludCA9PSBtb250aHNbbW9uXSkKLQkgICAgYnJlYWs7Ci0gICAgaWYgKG1vbiA9PSAxMikKLQlyZXR1cm4gQkFEX0RBVEU7Ci0KLSAgICBpZiAoKGRzLnRtX21kYXkgPT0gMzEpICYmIChtb24gPT0gMyB8fCBtb24gPT0gNSB8fCBtb24gPT0gOCB8fCBtb24gPT0gMTApKQotCXJldHVybiBCQURfREFURTsKLQotICAgIC8qIEZlYnJ1YXJ5IGdldHMgc3BlY2lhbCBjaGVjayBmb3IgbGVhcHllYXIgKi8KLQotICAgIGlmICgobW9uID09IDEpICYmCi0JKChkcy50bV9tZGF5ID4gMjkpCi0JIHx8ICgoZHMudG1fbWRheSA9PSAyOSkKLQkgICAgICYmICgoZHMudG1feWVhciAmIDMpCi0JCSB8fCAoKChkcy50bV95ZWFyICUgMTAwKSA9PSAwKQotCQkgICAgICYmICgoKGRzLnRtX3llYXIgJSA0MDApICE9IDEwMCkpKSkpKSkKLQlyZXR1cm4gQkFEX0RBVEU7Ci0KLSAgICBkcy50bV9tb24gPSBtb247Ci0KLSAgICBpZiAoYXBfaW1wbG9kZV90aW1lKCZyZXN1bHQsICZkcykgIT0gQVBSX1NVQ0NFU1MpIHsKLQlyZXR1cm4gQkFEX0RBVEU7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9zZXJ2ZXIvdXRpbF9tZDUuYyBiL3NlcnZlci91dGlsX21kNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjcxYzE1Li4wMDAwMDAwCi0tLSBhL3NlcnZlci91dGlsX21kNS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTkNTQSBIVFRQZCBTZXJ2ZXIKLSAqIFNvZnR3YXJlIERldmVsb3BtZW50IEdyb3VwCi0gKiBOYXRpb25hbCBDZW50ZXIgZm9yIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucwotICogVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBhdCBVcmJhbmEtQ2hhbXBhaWduCi0gKiA2MDUgRS4gU3ByaW5nZmllbGQsIENoYW1wYWlnbiwgSUwgNjE4MjAKLSAqIGh0dHBkQG5jc2EudWl1Yy5lZHUKLSAqCi0gKiBDb3B5cmlnaHQgIChDKSAgMTk5NSwgQm9hcmQgb2YgVHJ1c3RlZXMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogbWQ1LmM6IE5DU0EgSFRUUGQgY29kZSB3aGljaCB1c2VzIHRoZSBtZDVjLmMgUlNBIENvZGUKLSAqCi0gKiAgT3JpZ2luYWwgQ29kZSBDb3B5cmlnaHQgKEMpIDE5OTQsIEplZmYgSG9zdGV0bGVyLCBTcHlnbGFzcywgSW5jLgotICogIFBvcnRpb25zIG9mIENvbnRlbnQtTUQ1IGNvZGUgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0IGJ5IENhcm5lZ2llIE1lbGxvbgotICogICAgIFVuaXZlcnNpdHkgKHNlZSBDb3B5cmlnaHQgYmVsb3cpLgotICogIFBvcnRpb25zIG9mIENvbnRlbnQtTUQ1IGNvZGUgQ29weXJpZ2h0IChDKSAxOTkxIEJlbGwgQ29tbXVuaWNhdGlvbnMgCi0gKiAgICAgUmVzZWFyY2gsIEluYy4gKEJlbGxjb3JlKSAoc2VlIENvcHlyaWdodCBiZWxvdykuCi0gKiAgUG9ydGlvbnMgZXh0cmFjdGVkIGZyb20gbXBhY2ssIEpvaG4gRy4gTXllcnMgLSBqZ20rQGNtdS5lZHUKLSAqICBDb250ZW50LU1ENSBDb2RlIGNvbnRyaWJ1dGVkIGJ5IE1hcnRpbiBIYW1pbHRvbiAobWFydGluQG5ldC5sdXQuYWMudWspCi0gKgotICovCi0KLQotCi0vKiBtZDUuYyAtLU1vZHVsZSBJbnRlcmZhY2UgdG8gTUQ1LiAqLwotLyogSmVmZiBIb3N0ZXRsZXIsIFNweWdsYXNzLCBJbmMuLCAxOTk0LiAqLwotCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiYXByX3BvcnRhYmxlLmgiCi0jaW5jbHVkZSAiaHR0cGQuaCIKLSNpbmNsdWRlICJ1dGlsX21kNS5oIgotCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfbWQ1X2JpbmFyeShhcF9jb250ZXh0X3QgKnAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkKLXsKLSAgICBjb25zdCBjaGFyICpoZXggPSAiMDEyMzQ1Njc4OWFiY2RlZiI7Ci0gICAgQVBfTUQ1X0NUWCBteV9tZDU7Ci0gICAgdW5zaWduZWQgY2hhciBoYXNoWzE2XTsKLSAgICBjaGFyICpyLCByZXN1bHRbMzNdOwotICAgIGludCBpOwotCi0gICAgLyoKLSAgICAgKiBUYWtlIHRoZSBNRDUgaGFzaCBvZiB0aGUgc3RyaW5nIGFyZ3VtZW50LgotICAgICAqLwotCi0gICAgYXBfTUQ1SW5pdCgmbXlfbWQ1KTsKLSAgICBhcF9NRDVVcGRhdGUoJm15X21kNSwgYnVmLCAodW5zaWduZWQgaW50KWxlbmd0aCk7Ci0gICAgYXBfTUQ1RmluYWwoaGFzaCwgJm15X21kNSk7Ci0KLSAgICBmb3IgKGkgPSAwLCByID0gcmVzdWx0OyBpIDwgMTY7IGkrKykgewotCSpyKysgPSBoZXhbaGFzaFtpXSA+PiA0XTsKLQkqcisrID0gaGV4W2hhc2hbaV0gJiAweEZdOwotICAgIH0KLSAgICAqciA9ICdcMCc7Ci0KLSAgICByZXR1cm4gYXBfcHN0cmR1cChwLCByZXN1bHQpOwotfQotCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfbWQ1KGFwX2NvbnRleHRfdCAqcCwgY29uc3QgdW5zaWduZWQgY2hhciAqc3RyaW5nKQotewotICAgIHJldHVybiBhcF9tZDVfYmluYXJ5KHAsIHN0cmluZywgKGludCkgc3RybGVuKChjaGFyICopc3RyaW5nKSk7Ci19Ci0KLS8qIHRoZXNlIHBvcnRpb25zIGV4dHJhY3RlZCBmcm9tIG1wYWNrLCBKb2huIEcuIE15ZXJzIC0gamdtK0BjbXUuZWR1ICovCi0KLS8qIChDKSBDb3B5cmlnaHQgMTk5MywxOTk0IGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5Ci0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUKLSAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dAotICogZmVlLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzCi0gKiBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotICogYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgQ2FybmVnaWUKLSAqIE1lbGxvbiBVbml2ZXJzaXR5IG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eQotICogcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCi0gKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eSBtYWtlcyBubwotICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkCi0gKiB3YXJyYW50eS4KLSAqCi0gKiBDQVJORUdJRSBNRUxMT04gVU5JVkVSU0lUWSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KLSAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQotICogQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIENBUk5FR0lFIE1FTExPTiBVTklWRVJTSVRZIEJFIExJQUJMRQotICogRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTgotICogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLgotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTEgQmVsbCBDb21tdW5pY2F0aW9ucyBSZXNlYXJjaCwgSW5jLiAoQmVsbGNvcmUpCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBtYXRlcmlhbAotICogZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQKLSAqIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLSAqIGFwcGVhciBpbiBhbGwgY29waWVzLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBCZWxsY29yZSBub3QgYmUKLSAqIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhpcwotICogbWF0ZXJpYWwgd2l0aG91dCB0aGUgc3BlY2lmaWMsIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbgotICogb2YgYW4gYXV0aG9yaXplZCByZXByZXNlbnRhdGl2ZSBvZiBCZWxsY29yZS4gIEJFTExDT1JFCi0gKiBNQUtFUyBOTyBSRVBSRVNFTlRBVElPTlMgQUJPVVQgVEhFIEFDQ1VSQUNZIE9SIFNVSVRBQklMSVRZCi0gKiBPRiBUSElTIE1BVEVSSUFMIEZPUiBBTlkgUFVSUE9TRS4gIElUIElTIFBST1ZJREVEICJBUyBJUyIsCi0gKiBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUy4gIAotICovCi0KLXN0YXRpYyBjaGFyIGJhc2lzXzY0W10gPQotIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwotCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfbWQ1Y29udGV4dFRvNjQoYXBfY29udGV4dF90ICphLCBBUF9NRDVfQ1RYICogY29udGV4dCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyIGRpZ2VzdFsxOF07Ci0gICAgY2hhciAqZW5jb2RlZERpZ2VzdDsKLSAgICBpbnQgaTsKLSAgICBjaGFyICpwOwotCi0gICAgZW5jb2RlZERpZ2VzdCA9IChjaGFyICopIGFwX3BjYWxsb2MoYSwgMjUgKiBzaXplb2YoY2hhcikpOwotCi0gICAgYXBfTUQ1RmluYWwoZGlnZXN0LCBjb250ZXh0KTsKLSAgICBkaWdlc3Rbc2l6ZW9mKGRpZ2VzdCkgLSAxXSA9IGRpZ2VzdFtzaXplb2YoZGlnZXN0KSAtIDJdID0gMDsKLQotICAgIHAgPSBlbmNvZGVkRGlnZXN0OwotICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoZGlnZXN0KTsgaSArPSAzKSB7Ci0JKnArKyA9IGJhc2lzXzY0W2RpZ2VzdFtpXSA+PiAyXTsKLQkqcCsrID0gYmFzaXNfNjRbKChkaWdlc3RbaV0gJiAweDMpIDw8IDQpIHwgKChpbnQpIChkaWdlc3RbaSArIDFdICYgMHhGMCkgPj4gNCldOwotCSpwKysgPSBiYXNpc182NFsoKGRpZ2VzdFtpICsgMV0gJiAweEYpIDw8IDIpIHwgKChpbnQpIChkaWdlc3RbaSArIDJdICYgMHhDMCkgPj4gNildOwotCSpwKysgPSBiYXNpc182NFtkaWdlc3RbaSArIDJdICYgMHgzRl07Ci0gICAgfQotICAgICpwLS0gPSAnXDAnOwotICAgICpwLS0gPSAnPSc7Ci0gICAgKnAtLSA9ICc9JzsKLSAgICByZXR1cm4gZW5jb2RlZERpZ2VzdDsKLX0KLQotI2lmZGVmIENIQVJTRVRfRUJDRElDCi0KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF9tZDVkaWdlc3QoYXBfY29udGV4dF90ICpwLCBhcF9maWxlX3QgKmluZmlsZSwgaW50IGNvbnZlcnQpCi17Ci0gICAgQVBfTUQ1X0NUWCBjb250ZXh0OwotICAgIHVuc2lnbmVkIGNoYXIgYnVmWzEwMDBdOwotICAgIGxvbmcgbGVuZ3RoID0gMDsKLSAgICBpbnQgbmJ5dGVzOwotCi0gICAgYXBfTUQ1SW5pdCgmY29udGV4dCk7Ci0gICAgbmJ5dGVzID0gc2l6ZW9mKGJ1Zik7Ci0gICAgd2hpbGUgKGFwX3JlYWQoaW5maWxlLCBidWYsICZuYnl0ZXMpID09IEFQUl9TVUNDRVNTKSB7Ci0JbGVuZ3RoICs9IG5ieXRlczsKLSAgICAgICAgaWYgKCFjb252ZXJ0KSB7Ci0gICAgICAgICAgICBhc2NpaTJlYmNkaWMoYnVmLCBidWYsIG5ieXRlcyk7Ci0gICAgICAgIH0KLQlhcF9NRDVVcGRhdGUoJmNvbnRleHQsIGJ1ZiwgbmJ5dGVzKTsKLSAgICB9Ci0gICAgYXBfc2VlayhpbmZpbGUsIDBMLCBBUFJfU0VUKTsKLSAgICByZXR1cm4gYXBfbWQ1Y29udGV4dFRvNjQocCwgJmNvbnRleHQpOwotfQotCi0jZWxzZQotCi1BUElfRVhQT1JUKGNoYXIgKikgYXBfbWQ1ZGlnZXN0KGFwX2NvbnRleHRfdCAqcCwgYXBfZmlsZV90ICppbmZpbGUpCi17Ci0gICAgQVBfTUQ1X0NUWCBjb250ZXh0OwotICAgIHVuc2lnbmVkIGNoYXIgYnVmWzEwMDBdOwotICAgIGxvbmcgbGVuZ3RoID0gMDsKLSAgICBhcF9zc2l6ZV90IG5ieXRlczsKLQotICAgIGFwX01ENUluaXQoJmNvbnRleHQpOwotICAgIG5ieXRlcyA9IHNpemVvZihidWYpOwotICAgIHdoaWxlIChhcF9yZWFkKGluZmlsZSwgYnVmLCAmbmJ5dGVzKSA9PSBBUFJfU1VDQ0VTUykgewotCWxlbmd0aCArPSBuYnl0ZXM7Ci0JYXBfTUQ1VXBkYXRlKCZjb250ZXh0LCBidWYsIG5ieXRlcyk7Ci0gICAgfQotICAgIGFwX3NlZWsoaW5maWxlLCAwTCwgQVBSX1NFVCk7Ci0gICAgcmV0dXJuIGFwX21kNWNvbnRleHRUbzY0KHAsICZjb250ZXh0KTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2ZXIvdXRpbF9zY3JpcHQuYyBiL3NlcnZlci91dGlsX3NjcmlwdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWMxZmMxLi4wMDAwMDAwCi0tLSBhL3NlcnZlci91dGlsX3NjcmlwdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjg1ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotI2RlZmluZSBDT1JFX1BSSVZBVEUKLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImh0dHBfY29uZmlnLmgiCi0jaW5jbHVkZSAiaHR0cF9tYWluLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJodHRwX2NvcmUuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiaHR0cF9yZXF1ZXN0LmgiCS8qIGZvciBzdWJfcmVxX2xvb2t1cF91cmkoKSAqLwotI2luY2x1ZGUgInV0aWxfc2NyaXB0LmgiCi0jaW5jbHVkZSAidXRpbF9kYXRlLmgiCQkvKiBGb3IgcGFyc2VIVFRQZGF0ZSgpICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpZmRlZiBPUzIKLSNkZWZpbmUgSU5DTF9ET1MKLSNpbmNsdWRlIDxvczIuaD4KLSNlbmRpZgotCi0vKgotICogVmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucyB3aGljaCBhcmUgY29tbW9uIHRvIGEgd2hvbGUgbG90IG9mCi0gKiBzY3JpcHQtdHlwZSBleHRlbnNpb25zIG1lY2hhbmlzbXMsIGFuZCBtaWdodCBhcyB3ZWxsIGJlIGdhdGhlcmVkCi0gKiBpbiBvbmUgcGxhY2UgKGlmIG9ubHkgdG8gYXZvaWQgY3JlYXRpbmcgaW50ZXItbW9kdWxlIGRlcGVuZGFuY2llcwotICogd2hlcmUgdGhlcmUgZG9uJ3QgaGF2ZSB0byBiZSkuCi0gKi8KLQotI2RlZmluZSBNQUxGT1JNRURfTUVTU0FHRSAibWFsZm9ybWVkIGhlYWRlciBmcm9tIHNjcmlwdC4gQmFkIGhlYWRlcj0iCi0jZGVmaW5lIE1BTEZPUk1FRF9IRUFERVJfTEVOR1RIX1RPX1NIT1cgMzAKLQotI2lmIGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTjMyKQotLyogSWYgYSByZXF1ZXN0IGluY2x1ZGVzIHF1ZXJ5IGluZm8gaW4gdGhlIFVSTCAoc3R1ZmYgYWZ0ZXIgIj8iKSwgYW5kCi0gKiB0aGUgcXVlcnkgaW5mbyBkb2VzIG5vdCBjb250YWluICI9IiAoaW5kaWNhdGl2ZSBvZiBhIEZPUk0gc3VibWlzc2lvbiksCi0gKiB0aGVuIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gY3JlYXRlIHRoZSBhcmd1bWVudCBsaXN0IHRvIGJlIHBhc3NlZAotICogdG8gdGhlIENHSSBzY3JpcHQuICBXaGVuIHN1ZXhlYyBpcyBlbmFibGVkLCB0aGUgc3VleGVjIHBhdGgsIHVzZXIsIGFuZAotICogZ3JvdXAgYXJlIHRoZSBmaXJzdCB0aHJlZSBhcmd1bWVudHMgdG8gYmUgcGFzc2VkOyBpZiBub3QsIGFsbCB0aHJlZQotICogbXVzdCBiZSBOVUxMLiAgVGhlIHF1ZXJ5IGluZm8gaXMgc3BsaXQgaW50byBzZXBhcmF0ZSBhcmd1bWVudHMsIHdoZXJlCi0gKiAiKyIgaXMgdGhlIHNlcGFyYXRvciBiZXR3ZWVuIGtleXdvcmQgYXJndW1lbnRzLgotICoKLSAqIFhYWFg6IG5vdGUgdGhhdCB0aGUgV0lOMzIgY29kZSB1c2VzIG9uZSBvZiB0aGUgc3VleGVjIHN0cmluZ3MgCi0gKiB0byBwYXNzIGFuIGludGVycHJldGVyIG5hbWUuICBSZW1lbWJlciB0aGlzIGlmIGNoYW5naW5nIHRoZSB3YXkgdGhleQotICogYXJlIGhhbmRsZWQgaW4gY3JlYXRlX2FyZ3YuCi0gKgotICovCi1zdGF0aWMgY2hhciAqKmNyZWF0ZV9hcmd2KGFwX2NvbnRleHRfdCAqcCwgY2hhciAqcGF0aCwgY2hhciAqdXNlciwgY2hhciAqZ3JvdXAsCi0JCQkgIGNoYXIgKmF2MCwgY29uc3QgY2hhciAqYXJncykKLXsKLSAgICBpbnQgeCwgbnVtd29yZHM7Ci0gICAgY2hhciAqKmF2OwotICAgIGNoYXIgKnc7Ci0gICAgaW50IGlkeCA9IDA7Ci0KLSAgICAvKiBjb3VudCB0aGUgbnVtYmVyIG9mIGtleXdvcmRzICovCi0KLSAgICBmb3IgKHggPSAwLCBudW13b3JkcyA9IDE7IGFyZ3NbeF07IHgrKykgewotICAgICAgICBpZiAoYXJnc1t4XSA9PSAnKycpIHsKLQkgICAgKytudW13b3JkczsKLQl9Ci0gICAgfQotCi0gICAgaWYgKG51bXdvcmRzID4gQVBBQ0hFX0FSR19NQVggLSA1KSB7Ci0JbnVtd29yZHMgPSBBUEFDSEVfQVJHX01BWCAtIDU7CS8qIFRydW5jYXRlIGFyZ3MgdG8gcHJldmVudCBvdmVycnVuICovCi0gICAgfQotICAgIGF2ID0gKGNoYXIgKiopIGFwX3BhbGxvYyhwLCAobnVtd29yZHMgKyA1KSAqIHNpemVvZihjaGFyICopKTsKLQotICAgIGlmIChwYXRoKSB7Ci0JYXZbaWR4KytdID0gcGF0aDsKLSAgICB9Ci0gICAgaWYgKHVzZXIpIHsKLQlhdltpZHgrK10gPSB1c2VyOwotICAgIH0KLSAgICBpZiAoZ3JvdXApIHsKLQlhdltpZHgrK10gPSBncm91cDsKLSAgICB9Ci0KLSAgICBhdltpZHgrK10gPSBhdjA7Ci0KLSAgICBmb3IgKHggPSAxOyB4IDw9IG51bXdvcmRzOyB4KyspIHsKLQl3ID0gYXBfZ2V0d29yZF9udWxscyhwLCAmYXJncywgJysnKTsKLQlhcF91bmVzY2FwZV91cmwodyk7Ci0JYXZbaWR4KytdID0gYXBfZXNjYXBlX3NoZWxsX2NtZChwLCB3KTsKLSAgICB9Ci0gICAgYXZbaWR4XSA9IE5VTEw7Ci0gICAgcmV0dXJuIGF2OwotfQotI2VuZGlmIC8qIGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKFdJTjMyKSAqLwotCi1zdGF0aWMgY2hhciAqaHR0cDJlbnYoYXBfY29udGV4dF90ICphLCBjaGFyICp3KQotewotICAgIGNoYXIgKnJlcyA9IGFwX3BzdHJjYXQoYSwgIkhUVFBfIiwgdywgTlVMTCk7Ci0gICAgY2hhciAqY3AgPSByZXM7Ci0KLSAgICB3aGlsZSAoKisrY3ApIHsKLQlpZiAoIWFwX2lzYWxudW0oKmNwKSAmJiAqY3AgIT0gJ18nKSB7Ci0JICAgICpjcCA9ICdfJzsKLQl9Ci0JZWxzZSB7Ci0JICAgICpjcCA9IGFwX3RvdXBwZXIoKmNwKTsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotQVBJX0VYUE9SVChjaGFyICoqKSBhcF9jcmVhdGVfZW52aXJvbm1lbnQoYXBfY29udGV4dF90ICpwLCBhcF90YWJsZV90ICp0KQotewotICAgIGFwX2FycmF5X2hlYWRlcl90ICplbnZfYXJyID0gYXBfdGFibGVfZWx0cyh0KTsKLSAgICBhcF90YWJsZV9lbnRyeV90ICplbHRzID0gKGFwX3RhYmxlX2VudHJ5X3QgKikgZW52X2Fyci0+ZWx0czsKLSAgICBjaGFyICoqZW52ID0gKGNoYXIgKiopIGFwX3BhbGxvYyhwLCAoZW52X2Fyci0+bmVsdHMgKyAyKSAqIHNpemVvZihjaGFyICopKTsKLSAgICBpbnQgaSwgajsKLSAgICBjaGFyICp0ejsKLSAgICBjaGFyICp3aGFjazsKLQotICAgIGogPSAwOwotICAgIGlmICghYXBfdGFibGVfZ2V0KHQsICJUWiIpKSB7Ci0JdHogPSBnZXRlbnYoIlRaIik7Ci0JaWYgKHR6ICE9IE5VTEwpIHsKLQkgICAgZW52W2orK10gPSBhcF9wc3RyY2F0KHAsICJUWj0iLCB0eiwgTlVMTCk7Ci0JfQotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZW52X2Fyci0+bmVsdHM7ICsraSkgewotICAgICAgICBpZiAoIWVsdHNbaV0ua2V5KSB7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQllbnZbal0gPSBhcF9wc3RyY2F0KHAsIGVsdHNbaV0ua2V5LCAiPSIsIGVsdHNbaV0udmFsLCBOVUxMKTsKLQl3aGFjayA9IGVudltqXTsKLQlpZiAoYXBfaXNkaWdpdCgqd2hhY2spKSB7Ci0JICAgICp3aGFjaysrID0gJ18nOwotCX0KLQl3aGlsZSAoKndoYWNrICE9ICc9JykgewotCSAgICBpZiAoIWFwX2lzYWxudW0oKndoYWNrKSAmJiAqd2hhY2sgIT0gJ18nKSB7Ci0JCSp3aGFjayA9ICdfJzsKLQkgICAgfQotCSAgICArK3doYWNrOwotCX0KLQkrK2o7Ci0gICAgfQotCi0gICAgZW52W2pdID0gTlVMTDsKLSAgICByZXR1cm4gZW52OwotfQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX2FkZF9jb21tb25fdmFycyhyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBhcF90YWJsZV90ICplOwotICAgIHNlcnZlcl9yZWMgKnMgPSByLT5zZXJ2ZXI7Ci0gICAgY29ubl9yZWMgKmMgPSByLT5jb25uZWN0aW9uOwotICAgIGNvbnN0IGNoYXIgKnJlbV9sb2duYW1lOwotICAgIGNoYXIgKmVudl9wYXRoOwotI2lmZGVmIFdJTjMyCi0gICAgY2hhciAqZW52X3RlbXA7Ci0jZW5kaWYKLSAgICBjb25zdCBjaGFyICpob3N0OwotICAgIGFwX2FycmF5X2hlYWRlcl90ICpoZHJzX2FyciA9IGFwX3RhYmxlX2VsdHMoci0+aGVhZGVyc19pbik7Ci0gICAgYXBfdGFibGVfZW50cnlfdCAqaGRycyA9IChhcF90YWJsZV9lbnRyeV90ICopIGhkcnNfYXJyLT5lbHRzOwotICAgIGludCBpOwotCi0gICAgLyogdXNlIGEgdGVtcG9yYXJ5IGFwX3RhYmxlX3Qgd2hpY2ggd2UnbGwgb3ZlcmxhcCBvbnRvCi0gICAgICogci0+c3VicHJvY2Vzc19lbnYgbGF0ZXIKLSAgICAgKi8KLSAgICBlID0gYXBfbWFrZV90YWJsZShyLT5wb29sLCAyNSArIGhkcnNfYXJyLT5uZWx0cyk7Ci0KLSAgICAvKiBGaXJzdCwgYWRkIGVudmlyb25tZW50IHZhcnMgZnJvbSBoZWFkZXJzLi4uIHRoaXMgaXMgYXMgcGVyCi0gICAgICogQ0dJIHNwZWNzLCB0aG91Z2ggb3RoZXIgc29ydHMgb2Ygc2NyaXB0aW5nIGludGVyZmFjZXMgc2VlCi0gICAgICogdGhlIHNhbWUgdmFycy4uLgotICAgICAqLwotCi0gICAgZm9yIChpID0gMDsgaSA8IGhkcnNfYXJyLT5uZWx0czsgKytpKSB7Ci0gICAgICAgIGlmICghaGRyc1tpXS5rZXkpIHsKLQkgICAgY29udGludWU7Ci0JfQotCi0JLyogQSBmZXcgaGVhZGVycyBhcmUgc3BlY2lhbCBjYXNlZCAtLS0gQXV0aG9yaXphdGlvbiB0byBwcmV2ZW50Ci0JICogcm9ndWUgc2NyaXB0cyBmcm9tIGNhcHR1cmluZyBwYXNzd29yZHM7IGNvbnRlbnQtdHlwZSBhbmQgLWxlbmd0aAotCSAqIGZvciBubyBwYXJ0aWN1bGFyIHJlYXNvbi4KLQkgKi8KLQotCWlmICghc3RyY2FzZWNtcChoZHJzW2ldLmtleSwgIkNvbnRlbnQtdHlwZSIpKSB7Ci0JICAgIGFwX3RhYmxlX2FkZG4oZSwgIkNPTlRFTlRfVFlQRSIsIGhkcnNbaV0udmFsKTsKLQl9Ci0JZWxzZSBpZiAoIXN0cmNhc2VjbXAoaGRyc1tpXS5rZXksICJDb250ZW50LWxlbmd0aCIpKSB7Ci0JICAgIGFwX3RhYmxlX2FkZG4oZSwgIkNPTlRFTlRfTEVOR1RIIiwgaGRyc1tpXS52YWwpOwotCX0KLQkvKgotCSAqIFlvdSByZWFsbHkgZG9uJ3Qgd2FudCB0byBkaXNhYmxlIHRoaXMgY2hlY2ssIHNpbmNlIGl0IGxlYXZlcyB5b3UKLQkgKiB3aWRlIG9wZW4gdG8gQ0dJcyBzdGVhbGluZyBwYXNzd29yZHMgYW5kIHBlb3BsZSB2aWV3aW5nIHRoZW0KLQkgKiBpbiB0aGUgZW52aXJvbm1lbnQgd2l0aCAicHMgLWUiLiAgQnV0LCBpZiB5b3UgbXVzdC4uLgotCSAqLwotI2lmbmRlZiBTRUNVUklUWV9IT0xFX1BBU1NfQVVUSE9SSVpBVElPTgotCWVsc2UgaWYgKCFzdHJjYXNlY21wKGhkcnNbaV0ua2V5LCAiQXV0aG9yaXphdGlvbiIpIAotCQkgfHwgIXN0cmNhc2VjbXAoaGRyc1tpXS5rZXksICJQcm94eS1BdXRob3JpemF0aW9uIikpIHsKLQkgICAgY29udGludWU7Ci0JfQotI2VuZGlmCi0JZWxzZSB7Ci0JICAgIGFwX3RhYmxlX2FkZG4oZSwgaHR0cDJlbnYoci0+cG9vbCwgaGRyc1tpXS5rZXkpLCBoZHJzW2ldLnZhbCk7Ci0JfQotICAgIH0KLQotICAgIGlmICghKGVudl9wYXRoID0gZ2V0ZW52KCJQQVRIIikpKSB7Ci0JZW52X3BhdGggPSBERUZBVUxUX1BBVEg7Ci0gICAgfQotCi0jaWZkZWYgV0lOMzIKLSAgICBpZiAoZW52X3RlbXAgPSBnZXRlbnYoIlN5c3RlbVJvb3QiKSkgewotICAgICAgICBhcF90YWJsZV9hZGRuKGUsICJTeXN0ZW1Sb290IiwgZW52X3RlbXApOyAgICAgICAgIAotICAgIH0KLSAgICBpZiAoZW52X3RlbXAgPSBnZXRlbnYoIkNPTVNQRUMiKSkgewotICAgICAgICBhcF90YWJsZV9hZGRuKGUsICJDT01TUEVDIiwgZW52X3RlbXApOyAgICAgICAgICAgIAotICAgIH0KLSAgICBpZiAoZW52X3RlbXAgPSBnZXRlbnYoIldJTkRJUiIpKSB7Ci0gICAgICAgIGFwX3RhYmxlX2FkZG4oZSwgIldJTkRJUiIsIGVudl90ZW1wKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGFwX3RhYmxlX2FkZG4oZSwgIlBBVEgiLCBlbnZfcGF0aCk7Ci0gICAgYXBfdGFibGVfYWRkbihlLCAiU0VSVkVSX1NJR05BVFVSRSIsIGFwX3BzaWduYXR1cmUoIiIsIHIpKTsKLSAgICBhcF90YWJsZV9hZGRuKGUsICJTRVJWRVJfU09GVFdBUkUiLCBhcF9nZXRfc2VydmVyX3ZlcnNpb24oKSk7Ci0gICAgYXBfdGFibGVfYWRkbihlLCAiU0VSVkVSX05BTUUiLCBhcF9nZXRfc2VydmVyX25hbWUocikpOwotICAgIGFwX3RhYmxlX2FkZG4oZSwgIlNFUlZFUl9BRERSIiwgci0+Y29ubmVjdGlvbi0+bG9jYWxfaXApOwkvKiBBcGFjaGUgKi8KLSAgICBhcF90YWJsZV9hZGRuKGUsICJTRVJWRVJfUE9SVCIsCi0JCSAgYXBfcHNwcmludGYoci0+cG9vbCwgIiV1IiwgYXBfZ2V0X3NlcnZlcl9wb3J0KHIpKSk7Ci0gICAgaG9zdCA9IGFwX2dldF9yZW1vdGVfaG9zdChjLCByLT5wZXJfZGlyX2NvbmZpZywgUkVNT1RFX0hPU1QpOwotICAgIGlmIChob3N0KSB7Ci0JYXBfdGFibGVfYWRkbihlLCAiUkVNT1RFX0hPU1QiLCBob3N0KTsKLSAgICB9Ci0gICAgYXBfdGFibGVfYWRkbihlLCAiUkVNT1RFX0FERFIiLCBjLT5yZW1vdGVfaXApOwotICAgIGFwX3RhYmxlX2FkZG4oZSwgIkRPQ1VNRU5UX1JPT1QiLCBhcF9kb2N1bWVudF9yb290KHIpKTsJLyogQXBhY2hlICovCi0gICAgYXBfdGFibGVfYWRkbihlLCAiU0VSVkVSX0FETUlOIiwgcy0+c2VydmVyX2FkbWluKTsJLyogQXBhY2hlICovCi0gICAgYXBfdGFibGVfYWRkbihlLCAiU0NSSVBUX0ZJTEVOQU1FIiwgci0+ZmlsZW5hbWUpOwkvKiBBcGFjaGUgKi8KLQotICAgIGFwX3RhYmxlX2FkZG4oZSwgIlJFTU9URV9QT1JUIiwKLQkJICBhcF9wc3ByaW50ZihyLT5wb29sLCAiJWQiLCBudG9ocyhjLT5yZW1vdGVfYWRkci5zaW5fcG9ydCkpKTsKLQotICAgIGlmIChyLT51c2VyKSB7Ci0JYXBfdGFibGVfYWRkbihlLCAiUkVNT1RFX1VTRVIiLCByLT51c2VyKTsKLSAgICB9Ci0gICAgaWYgKHItPmFwX2F1dGhfdHlwZSkgewotCWFwX3RhYmxlX2FkZG4oZSwgIkFVVEhfVFlQRSIsIHItPmFwX2F1dGhfdHlwZSk7Ci0gICAgfQotICAgIHJlbV9sb2duYW1lID0gYXBfZ2V0X3JlbW90ZV9sb2duYW1lKHIpOwotICAgIGlmIChyZW1fbG9nbmFtZSkgewotCWFwX3RhYmxlX2FkZG4oZSwgIlJFTU9URV9JREVOVCIsIGFwX3BzdHJkdXAoci0+cG9vbCwgcmVtX2xvZ25hbWUpKTsKLSAgICB9Ci0KLSAgICAvKiBBcGFjaGUgY3VzdG9tIGVycm9yIHJlc3BvbnNlcy4gSWYgd2UgaGF2ZSByZWRpcmVjdGVkIHNldCB0d28gbmV3IHZhcnMgKi8KLQotICAgIGlmIChyLT5wcmV2KSB7Ci0gICAgICAgIGlmIChyLT5wcmV2LT5hcmdzKSB7Ci0JICAgIGFwX3RhYmxlX2FkZG4oZSwgIlJFRElSRUNUX1FVRVJZX1NUUklORyIsIHItPnByZXYtPmFyZ3MpOwotCX0KLQlpZiAoci0+cHJldi0+dXJpKSB7Ci0JICAgIGFwX3RhYmxlX2FkZG4oZSwgIlJFRElSRUNUX1VSTCIsIHItPnByZXYtPnVyaSk7Ci0JfQotICAgIH0KLQotICAgIGFwX292ZXJsYXBfdGFibGVzKHItPnN1YnByb2Nlc3NfZW52LCBlLCBBUF9PVkVSTEFQX1RBQkxFU19TRVQpOwotfQotCi0vKiBUaGlzICJjdXRlIiBsaXR0bGUgZnVuY3Rpb24gY29tZXMgYWJvdXQgYmVjYXVzZSB0aGUgcGF0aCBpbmZvIG9uCi0gKiBmaWxlbmFtZXMgYW5kIFVSTHMgYXJlbid0IGFsd2F5cyB0aGUgc2FtZS4gU28gd2UgdGFrZSB0aGUgdHdvLAotICogYW5kIGZpbmQgYXMgbXVjaCBvZiB0aGUgdHdvIHRoYXQgbWF0Y2ggYXMgcG9zc2libGUuCi0gKi8KLQotQVBJX0VYUE9SVChpbnQpIGFwX2ZpbmRfcGF0aF9pbmZvKGNvbnN0IGNoYXIgKnVyaSwgY29uc3QgY2hhciAqcGF0aF9pbmZvKQotewotICAgIGludCBsdSA9IHN0cmxlbih1cmkpOwotICAgIGludCBscCA9IHN0cmxlbihwYXRoX2luZm8pOwotCi0gICAgd2hpbGUgKGx1LS0gJiYgbHAtLSAmJiB1cmlbbHVdID09IHBhdGhfaW5mb1tscF0pOwotCi0gICAgaWYgKGx1ID09IC0xKSB7Ci0JbHUgPSAwOwotICAgIH0KLQotICAgIHdoaWxlICh1cmlbbHVdICE9ICdcMCcgJiYgdXJpW2x1XSAhPSAnLycpIHsKLSAgICAgICAgbHUrKzsKLSAgICB9Ci0gICAgcmV0dXJuIGx1OwotfQotCi0vKiBPYnRhaW4gdGhlIFJlcXVlc3QtVVJJIGZyb20gdGhlIG9yaWdpbmFsIHJlcXVlc3QtbGluZSwgcmV0dXJuaW5nCi0gKiBhIG5ldyBzdHJpbmcgZnJvbSB0aGUgcmVxdWVzdCBwb29sIGNvbnRhaW5pbmcgdGhlIFVSSSBvciAiIi4KLSAqLwotc3RhdGljIGNoYXIgKm9yaWdpbmFsX3VyaShyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBjaGFyICpmaXJzdCwgKmxhc3Q7Ci0KLSAgICBpZiAoci0+dGhlX3JlcXVlc3QgPT0gTlVMTCkgewotCXJldHVybiAoY2hhciAqKSBhcF9wY2FsbG9jKHItPnBvb2wsIDEpOwotICAgIH0KLQotICAgIGZpcnN0ID0gci0+dGhlX3JlcXVlc3Q7CS8qIHVzZSB0aGUgcmVxdWVzdC1saW5lICovCi0KLSAgICB3aGlsZSAoKmZpcnN0ICYmICFhcF9pc3NwYWNlKCpmaXJzdCkpIHsKLQkrK2ZpcnN0OwkJLyogc2tpcCBvdmVyIHRoZSBtZXRob2QgKi8KLSAgICB9Ci0gICAgd2hpbGUgKGFwX2lzc3BhY2UoKmZpcnN0KSkgewotCSsrZmlyc3Q7CQkvKiAgIGFuZCB0aGUgc3BhY2UocykgICAqLwotICAgIH0KLQotICAgIGxhc3QgPSBmaXJzdDsKLSAgICB3aGlsZSAoKmxhc3QgJiYgIWFwX2lzc3BhY2UoKmxhc3QpKSB7Ci0JKytsYXN0OwkJCS8qIGVuZCBhdCBuZXh0IHdoaXRlc3BhY2UgKi8KLSAgICB9Ci0KLSAgICByZXR1cm4gYXBfcHN0cm5kdXAoci0+cG9vbCwgZmlyc3QsIGxhc3QgLSBmaXJzdCk7Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfYWRkX2NnaV92YXJzKHJlcXVlc3RfcmVjICpyKQotewotICAgIGFwX3RhYmxlX3QgKmUgPSByLT5zdWJwcm9jZXNzX2VudjsKLQotICAgIGFwX3RhYmxlX3NldG4oZSwgIkdBVEVXQVlfSU5URVJGQUNFIiwgIkNHSS8xLjEiKTsKLSAgICBhcF90YWJsZV9zZXRuKGUsICJTRVJWRVJfUFJPVE9DT0wiLCByLT5wcm90b2NvbCk7Ci0gICAgYXBfdGFibGVfc2V0bihlLCAiUkVRVUVTVF9NRVRIT0QiLCByLT5tZXRob2QpOwotICAgIGFwX3RhYmxlX3NldG4oZSwgIlFVRVJZX1NUUklORyIsIHItPmFyZ3MgPyByLT5hcmdzIDogIiIpOwotICAgIGFwX3RhYmxlX3NldG4oZSwgIlJFUVVFU1RfVVJJIiwgb3JpZ2luYWxfdXJpKHIpKTsKLQotICAgIC8qIE5vdGUgdGhhdCB0aGUgY29kZSBiZWxvdyBzcGVjaWFsLWNhc2VzIHNjcmlwdHMgcnVuIGZyb20gaW5jbHVkZXMsCi0gICAgICogYmVjYXVzZSBpdCAia25vd3MiIHRoYXQgdGhlIHN1Yl9yZXF1ZXN0IGhhcyBiZWVuIGhhY2tlZCB0byBoYXZlIHRoZQotICAgICAqIGFyZ3MgYW5kIHBhdGhfaW5mbyBvZiB0aGUgb3JpZ2luYWwgcmVxdWVzdCwgYW5kIG5vdCBhbnkgdGhhdCBtYXkgaGF2ZQotICAgICAqIGNvbWUgd2l0aCB0aGUgc2NyaXB0IFVSSSBpbiB0aGUgaW5jbHVkZSBjb21tYW5kLiAgVWdoLgotICAgICAqLwotCi0gICAgaWYgKCFzdHJjbXAoci0+cHJvdG9jb2wsICJJTkNMVURFRCIpKSB7Ci0JYXBfdGFibGVfc2V0bihlLCAiU0NSSVBUX05BTUUiLCByLT51cmkpOwotCWlmIChyLT5wYXRoX2luZm8gJiYgKnItPnBhdGhfaW5mbykgewotCSAgICBhcF90YWJsZV9zZXRuKGUsICJQQVRIX0lORk8iLCByLT5wYXRoX2luZm8pOwotCX0KLSAgICB9Ci0gICAgZWxzZSBpZiAoIXItPnBhdGhfaW5mbyB8fCAhKnItPnBhdGhfaW5mbykgewotCWFwX3RhYmxlX3NldG4oZSwgIlNDUklQVF9OQU1FIiwgci0+dXJpKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JaW50IHBhdGhfaW5mb19zdGFydCA9IGFwX2ZpbmRfcGF0aF9pbmZvKHItPnVyaSwgci0+cGF0aF9pbmZvKTsKLQotCWFwX3RhYmxlX3NldG4oZSwgIlNDUklQVF9OQU1FIiwKLQkJICAgICAgYXBfcHN0cm5kdXAoci0+cG9vbCwgci0+dXJpLCBwYXRoX2luZm9fc3RhcnQpKTsKLQotCWFwX3RhYmxlX3NldG4oZSwgIlBBVEhfSU5GTyIsIHItPnBhdGhfaW5mbyk7Ci0gICAgfQotCi0gICAgaWYgKHItPnBhdGhfaW5mbyAmJiByLT5wYXRoX2luZm9bMF0pIHsKLQkvKgotCSAqIFRvIGdldCBQQVRIX1RSQU5TTEFURUQsIHRyZWF0IFBBVEhfSU5GTyBhcyBhIFVSSSBwYXRoLgotCSAqIE5lZWQgdG8gcmUtZXNjYXBlIGl0IGZvciB0aGlzLCBzaW5jZSB0aGUgZW50aXJlIFVSSSB3YXMKLQkgKiB1bi1lc2NhcGVkIGJlZm9yZSB3ZSBkZXRlcm1pbmVkIHdoZXJlIHRoZSBQQVRIX0lORk8gYmVnYW4uCi0JICovCi0JcmVxdWVzdF9yZWMgKnBhX3JlcTsKLQotCXBhX3JlcSA9IGFwX3N1Yl9yZXFfbG9va3VwX3VyaShhcF9lc2NhcGVfdXJpKHItPnBvb2wsIHItPnBhdGhfaW5mbyksIHIpOwotCi0JaWYgKHBhX3JlcS0+ZmlsZW5hbWUpIHsKLSNpZmRlZiBXSU4zMgotCSAgICBjaGFyIGJ1ZmZlcltIVUdFX1NUUklOR19MRU5dOwotI2VuZGlmCi0JICAgIGNoYXIgKnB0ID0gYXBfcHN0cmNhdChyLT5wb29sLCBwYV9yZXEtPmZpbGVuYW1lLCBwYV9yZXEtPnBhdGhfaW5mbywKLQkJCQkgIE5VTEwpOwotI2lmZGVmIFdJTjMyCi0JICAgIC8qIFdlIG5lZWQgdG8gbWFrZSB0aGlzIGEgcmVhbCBXaW5kb3dzIHBhdGggbmFtZSAqLwotCSAgICBHZXRGdWxsUGF0aE5hbWUocHQsIEhVR0VfU1RSSU5HX0xFTiwgYnVmZmVyLCBOVUxMKTsKLQkgICAgYXBfdGFibGVfc2V0bihlLCAiUEFUSF9UUkFOU0xBVEVEIiwgYXBfcHN0cmR1cChyLT5wb29sLCBidWZmZXIpKTsKLSNlbHNlCi0JICAgIGFwX3RhYmxlX3NldG4oZSwgIlBBVEhfVFJBTlNMQVRFRCIsIHB0KTsKLSNlbmRpZgotCX0KLQlhcF9kZXN0cm95X3N1Yl9yZXEocGFfcmVxKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIGludCBzZXRfY29va2llX2Rvb19kb28odm9pZCAqdiwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWwpCi17Ci0gICAgYXBfdGFibGVfYWRkbih2LCBrZXksIHZhbCk7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLUFQSV9FWFBPUlQoaW50KSBhcF9zY2FuX3NjcmlwdF9oZWFkZXJfZXJyX2NvcmUocmVxdWVzdF9yZWMgKnIsIGNoYXIgKmJ1ZmZlciwKLQkJCQkgICAgICAgaW50ICgqZ2V0c2Z1bmMpIChjaGFyICosIGludCwgdm9pZCAqKSwKLQkJCQkgICAgICAgdm9pZCAqZ2V0c2Z1bmNfZGF0YSkKLXsKLSAgICBjaGFyIHhbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgKncsICpsOwotICAgIGludCBwOwotICAgIGludCBjZ2lfc3RhdHVzID0gSFRUUF9PSzsKLSAgICBhcF90YWJsZV90ICptZXJnZTsKLSAgICBhcF90YWJsZV90ICpjb29raWVfdGFibGU7Ci0KLSAgICBpZiAoYnVmZmVyKSB7Ci0JKmJ1ZmZlciA9ICdcMCc7Ci0gICAgfQotICAgIHcgPSBidWZmZXIgPyBidWZmZXIgOiB4OwotCi0gICAgLyogdGVtcG9yYXJ5IHBsYWNlIHRvIGhvbGQgaGVhZGVycyB0byBtZXJnZSBpbiBsYXRlciAqLwotICAgIG1lcmdlID0gYXBfbWFrZV90YWJsZShyLT5wb29sLCAxMCk7Ci0KLSAgICAvKiBUaGUgSFRUUCBzcGVjaWZpY2F0aW9uIHNheXMgdGhhdCBpdCBpcyBsZWdhbCB0byBtZXJnZSBkdXBsaWNhdGUKLSAgICAgKiBoZWFkZXJzIGludG8gb25lLiAgU29tZSBicm93c2VycyB0aGF0IHN1cHBvcnQgQ29va2llcyBkb24ndCBsaWtlCi0gICAgICogbWVyZ2VkIGhlYWRlcnMgYW5kIHByZWZlciB0aGF0IGVhY2ggU2V0LUNvb2tpZSBoZWFkZXIgaXMgc2VudAotICAgICAqIHNlcGFyYXRlbHkuICBMZXRzIGh1bW91ciB0aG9zZSBicm93c2VycyBieSBub3QgbWVyZ2luZy4KLSAgICAgKiBPaCB3aGF0IGEgcGFpbiBpdCBpcy4KLSAgICAgKi8KLSAgICBjb29raWVfdGFibGUgPSBhcF9tYWtlX3RhYmxlKHItPnBvb2wsIDIpOwotICAgIGFwX3RhYmxlX2RvKHNldF9jb29raWVfZG9vX2RvbywgY29va2llX3RhYmxlLCByLT5lcnJfaGVhZGVyc19vdXQsICJTZXQtQ29va2llIiwgTlVMTCk7Ci0KLSAgICB3aGlsZSAoMSkgewotCi0JaWYgKCgqZ2V0c2Z1bmMpICh3LCBNQVhfU1RSSU5HX0xFTiAtIDEsIGdldHNmdW5jX2RhdGEpID09IDApIHsKLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLQkJCSAgIlByZW1hdHVyZSBlbmQgb2Ygc2NyaXB0IGhlYWRlcnM6ICVzIiwgci0+ZmlsZW5hbWUpOwotCSAgICByZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0JfQotCi0JLyogRGVsZXRlIHRlcm1pbmFsIChDUj8pTEYgKi8KLQotCXAgPSBzdHJsZW4odyk7Ci0JaWYgKHAgPiAwICYmIHdbcCAtIDFdID09ICdcbicpIHsKLQkgICAgaWYgKHAgPiAxICYmIHdbcCAtIDJdID09ICdcMDE1JykgewotCQl3W3AgLSAyXSA9ICdcMCc7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCXdbcCAtIDFdID0gJ1wwJzsKLQkgICAgfQotCX0KLQotCS8qCi0JICogSWYgd2UndmUgZmluaXNoZWQgcmVhZGluZyB0aGUgaGVhZGVycywgY2hlY2sgdG8gbWFrZSBzdXJlIGFueQotCSAqIEhUVFAvMS4xIGNvbmRpdGlvbnMgYXJlIG1ldC4gIElmIHNvLCB3ZSdyZSBkb25lOyBub3JtYWwgcHJvY2Vzc2luZwotCSAqIHdpbGwgaGFuZGxlIHRoZSBzY3JpcHQncyBvdXRwdXQuICBJZiBub3QsIGp1c3QgcmV0dXJuIHRoZSBlcnJvci4KLQkgKiBUaGUgYXBwcm9wcmlhdGUgdGhpbmcgdG8gZG8gd291bGQgYmUgdG8gc2VuZCB0aGUgc2NyaXB0IHByb2Nlc3MgYQotCSAqIFNJR1BJUEUgdG8gbGV0IGl0IGtub3cgd2UncmUgaWdub3JpbmcgaXQsIGNsb3NlIHRoZSBjaGFubmVsIHRvIHRoZQotCSAqIHNjcmlwdCBwcm9jZXNzLCBhbmQgKnRoZW4qIHJldHVybiB0aGUgZmFpbGVkLXRvLW1lZXQtY29uZGl0aW9uCi0JICogZXJyb3IuICBPdGhlcndpc2Ugd2UnZCBiZSB3YWl0aW5nIGZvciB0aGUgc2NyaXB0IHRvIGZpbmlzaAotCSAqIGJsaXRoZXJpbmcgYmVmb3JlIHRlbGxpbmcgdGhlIGNsaWVudCB0aGUgb3V0cHV0IHdhcyBubyBnb29kLgotCSAqIEhvd2V2ZXIsIHdlIGRvbid0IGhhdmUgdGhlIGluZm9ybWF0aW9uIHRvIGRvIHRoYXQsIHNvIHdlIGhhdmUgdG8KLQkgKiBsZWF2ZSBpdCB0byBhbiB1cHBlciBsYXllci4KLQkgKi8KLQlpZiAod1swXSA9PSAnXDAnKSB7Ci0JICAgIGludCBjb25kX3N0YXR1cyA9IE9LOwotCi0JICAgIGlmICgoY2dpX3N0YXR1cyA9PSBIVFRQX09LKSAmJiAoci0+bWV0aG9kX251bWJlciA9PSBNX0dFVCkpIHsKLQkJY29uZF9zdGF0dXMgPSBhcF9tZWV0c19jb25kaXRpb25zKHIpOwotCSAgICB9Ci0JICAgIGFwX292ZXJsYXBfdGFibGVzKHItPmVycl9oZWFkZXJzX291dCwgbWVyZ2UsCi0JCUFQX09WRVJMQVBfVEFCTEVTX01FUkdFKTsKLQkgICAgaWYgKCFhcF9pc19lbXB0eV90YWJsZShjb29raWVfdGFibGUpKSB7Ci0JCS8qIHRoZSBjb29raWVzIGhhdmUgYWxyZWFkeSBiZWVuIGNvcGllZCB0byB0aGUgY29va2llX3RhYmxlICovCi0JCWFwX3RhYmxlX3Vuc2V0KHItPmVycl9oZWFkZXJzX291dCwgIlNldC1Db29raWUiKTsKLQkJci0+ZXJyX2hlYWRlcnNfb3V0ID0gYXBfb3ZlcmxheV90YWJsZXMoci0+cG9vbCwKLQkJICAgIHItPmVycl9oZWFkZXJzX291dCwgY29va2llX3RhYmxlKTsKLQkgICAgfQotCSAgICByZXR1cm4gY29uZF9zdGF0dXM7Ci0JfQotCi0JLyogaWYgd2Ugc2VlIGEgYm9ndXMgaGVhZGVyIGRvbid0IGlnbm9yZSBpdC4gU2hvdXQgYW5kIHNjcmVhbSAqLwotCi0jaWZkZWYgQ0hBUlNFVF9FQkNESUMKLQkgICAgLyogQ2hhbmNlcyBhcmUgdGhhdCB3ZSByZWNlaXZlZCBhbiBBU0NJSSBoZWFkZXIgdGV4dCBpbnN0ZWFkIG9mCi0JICAgICAqIHRoZSBleHBlY3RlZCBFQkNESUMgaGVhZGVyIGxpbmVzLiBUcnkgdG8gYXV0by1kZXRlY3Q6Ci0JICAgICAqLwotCWlmICghKGwgPSBzdHJjaHIodywgJzonKSkpIHsKLQkgICAgaW50IG1heWJlQVNDSUkgPSAwLCBtYXliZUVCQ0RJQyA9IDA7Ci0JICAgIGNoYXIgKmNwOwotCi0JICAgIGZvciAoY3AgPSB3OyAqY3AgIT0gJ1wwJzsgKytjcCkgewotCQlpZiAoaXNwcmludCgqY3ApICYmICFpc3ByaW50KG9zX3RvZWJjZGljWypjcF0pKQotCQkgICAgKyttYXliZUVCQ0RJQzsKLQkJaWYgKCFpc3ByaW50KCpjcCkgJiYgaXNwcmludChvc190b2ViY2RpY1sqY3BdKSkKLQkJICAgICsrbWF5YmVBU0NJSTsKLQkJfQotCSAgICBpZiAobWF5YmVBU0NJSSA+IG1heWJlRUJDRElDKSB7Ci0JCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgci0+c2VydmVyLAotCQkJICJDR0kgSW50ZXJmYWNlIEVycm9yOiBTY3JpcHQgaGVhZGVycyBhcHBhcmVudGx5IEFTQ0lJOiAoQ0dJID0gJXMpIiwgci0+ZmlsZW5hbWUpOwotCQlhc2NpaTJlYmNkaWModywgdywgY3AgLSB3KTsKLQkgICAgfQotCX0KLSNlbmRpZgotCWlmICghKGwgPSBzdHJjaHIodywgJzonKSkpIHsKLQkgICAgY2hhciBtYWxmb3JtZWRbKHNpemVvZiBNQUxGT1JNRURfTUVTU0FHRSkgKyAxCi0JCQkgICArIE1BTEZPUk1FRF9IRUFERVJfTEVOR1RIX1RPX1NIT1ddOwotCi0JICAgIHN0cmNweShtYWxmb3JtZWQsIE1BTEZPUk1FRF9NRVNTQUdFKTsKLQkgICAgc3RybmNhdChtYWxmb3JtZWQsIHcsIE1BTEZPUk1FRF9IRUFERVJfTEVOR1RIX1RPX1NIT1cpOwotCi0JICAgIGlmICghYnVmZmVyKSB7Ci0JCS8qIFNvYWsgdXAgYWxsIHRoZSBzY3JpcHQgb3V0cHV0IC0gbWF5IHNhdmUgYW4gb3V0cmlnaHQga2lsbCAqLwotCSAgICAgICAgd2hpbGUgKCgqZ2V0c2Z1bmMpICh3LCBNQVhfU1RSSU5HX0xFTiAtIDEsIGdldHNmdW5jX2RhdGEpKSB7Ci0JCSAgICBjb250aW51ZTsKLQkJfQotCSAgICB9Ci0KLQkgICAgYXBfbG9nX3JlcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgciwKLQkJCSAgIiVzOiAlcyIsIG1hbGZvcm1lZCwgci0+ZmlsZW5hbWUpOwotCSAgICByZXR1cm4gSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1I7Ci0JfQotCi0JKmwrKyA9ICdcMCc7Ci0Jd2hpbGUgKCpsICYmIGFwX2lzc3BhY2UoKmwpKSB7Ci0JICAgICsrbDsKLQl9Ci0KLQlpZiAoIXN0cmNhc2VjbXAodywgIkNvbnRlbnQtdHlwZSIpKSB7Ci0JICAgIGNoYXIgKnRtcDsKLQotCSAgICAvKiBOdWtlIHRyYWlsaW5nIHdoaXRlc3BhY2UgKi8KLQotCSAgICBjaGFyICplbmRwID0gbCArIHN0cmxlbihsKSAtIDE7Ci0JICAgIHdoaWxlIChlbmRwID4gbCAmJiBhcF9pc3NwYWNlKCplbmRwKSkgewotCQkqZW5kcC0tID0gJ1wwJzsKLQkgICAgfQotCi0JICAgIHRtcCA9IGFwX3BzdHJkdXAoci0+cG9vbCwgbCk7Ci0JICAgIGFwX2NvbnRlbnRfdHlwZV90b2xvd2VyKHRtcCk7Ci0JICAgIHItPmNvbnRlbnRfdHlwZSA9IHRtcDsKLQl9Ci0JLyoKLQkgKiBJZiB0aGUgc2NyaXB0IHJldHVybmVkIGEgc3BlY2lmaWMgc3RhdHVzLCB0aGF0J3Mgd2hhdAotCSAqIHdlJ2xsIHVzZSAtIG90aGVyd2lzZSB3ZSBhc3N1bWUgMjAwIE9LLgotCSAqLwotCWVsc2UgaWYgKCFzdHJjYXNlY21wKHcsICJTdGF0dXMiKSkgewotCSAgICByLT5zdGF0dXMgPSBjZ2lfc3RhdHVzID0gYXRvaShsKTsKLQkgICAgci0+c3RhdHVzX2xpbmUgPSBhcF9wc3RyZHVwKHItPnBvb2wsIGwpOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiTG9jYXRpb24iKSkgewotCSAgICBhcF90YWJsZV9zZXQoci0+aGVhZGVyc19vdXQsIHcsIGwpOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiQ29udGVudC1MZW5ndGgiKSkgewotCSAgICBhcF90YWJsZV9zZXQoci0+aGVhZGVyc19vdXQsIHcsIGwpOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiVHJhbnNmZXItRW5jb2RpbmciKSkgewotCSAgICBhcF90YWJsZV9zZXQoci0+aGVhZGVyc19vdXQsIHcsIGwpOwotCX0KLQkvKgotCSAqIElmIHRoZSBzY3JpcHQgZ2F2ZSB1cyBhIExhc3QtTW9kaWZpZWQgaGVhZGVyLCB3ZSBjYW4ndCBqdXN0Ci0JICogcGFzcyBpdCBvbiBibGluZGx5IGJlY2F1c2Ugb2YgcmVzdHJpY3Rpb25zIG9uIGZ1dHVyZSB2YWx1ZXMuCi0JICovCi0JZWxzZSBpZiAoIXN0cmNhc2VjbXAodywgIkxhc3QtTW9kaWZpZWQiKSkgewotCSAgICBhcF91cGRhdGVfbXRpbWUociwgYXBfcGFyc2VIVFRQZGF0ZShsKSk7Ci0JICAgIGFwX3NldF9sYXN0X21vZGlmaWVkKHIpOwotCX0KLQllbHNlIGlmICghc3RyY2FzZWNtcCh3LCAiU2V0LUNvb2tpZSIpKSB7Ci0JICAgIGFwX3RhYmxlX2FkZChjb29raWVfdGFibGUsIHcsIGwpOwotCX0KLQllbHNlIHsKLQkgICAgYXBfdGFibGVfYWRkKG1lcmdlLCB3LCBsKTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IGdldHNmdW5jX0ZJTEUoY2hhciAqYnVmLCBpbnQgbGVuLCB2b2lkICpmKQotewotICAgIHJldHVybiBhcF9mZ2V0cyhidWYsIGxlbiwgKGFwX2ZpbGVfdCAqKSBmKSA9PSBBUFJfU1VDQ0VTUzsKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX3NjYW5fc2NyaXB0X2hlYWRlcl9lcnIocmVxdWVzdF9yZWMgKnIsIGFwX2ZpbGVfdCAqZiwKLQkJCQkJICBjaGFyICpidWZmZXIpCi17Ci0gICAgcmV0dXJuIGFwX3NjYW5fc2NyaXB0X2hlYWRlcl9lcnJfY29yZShyLCBidWZmZXIsIGdldHNmdW5jX0ZJTEUsIGYpOwotfQotCi1zdGF0aWMgaW50IGdldHNmdW5jX0JVRkYoY2hhciAqdywgaW50IGxlbiwgdm9pZCAqZmIpCi17Ci0gICAgcmV0dXJuIGFwX2JnZXRzKHcsIGxlbiwgKEJVRkYgKikgZmIpID4gMDsKLX0KLQotQVBJX0VYUE9SVChpbnQpIGFwX3NjYW5fc2NyaXB0X2hlYWRlcl9lcnJfYnVmZihyZXF1ZXN0X3JlYyAqciwgQlVGRiAqZmIsCi0JCQkJCSAgICAgICBjaGFyICpidWZmZXIpCi17Ci0gICAgcmV0dXJuIGFwX3NjYW5fc2NyaXB0X2hlYWRlcl9lcnJfY29yZShyLCBidWZmZXIsIGdldHNmdW5jX0JVRkYsIGZiKTsKLX0KLQotCi1BUElfRVhQT1JUKHZvaWQpIGFwX3NlbmRfc2l6ZShhcF9zc2l6ZV90IHNpemUsIHJlcXVlc3RfcmVjICpyKQotewotICAgIC8qIFhYWDogdGhpcyAtMSB0aGluZyBpcyBhIGdyb3NzIGhhY2sgKi8KLSAgICBpZiAoc2l6ZSA9PSAoYXBfc3NpemVfdCktMSkgewotCWFwX3JwdXRzKCIgICAgLSIsIHIpOwotICAgIH0KLSAgICBlbHNlIGlmICghc2l6ZSkgewotCWFwX3JwdXRzKCIgICAwayIsIHIpOwotICAgIH0KLSAgICBlbHNlIGlmIChzaXplIDwgMTAyNCkgewotCWFwX3JwdXRzKCIgICAxayIsIHIpOwotICAgIH0KLSAgICBlbHNlIGlmIChzaXplIDwgMTA0ODU3NikgewotCWFwX3JwcmludGYociwgIiU0IiBBUFJfU1NJWkVfVF9GTVQgImsiLCAoc2l6ZSArIDUxMikgLyAxMDI0KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoc2l6ZSA8IDEwMzgwOTAyNCkgewotCWFwX3JwcmludGYociwgIiU0LjFmTSIsIHNpemUgLyAxMDQ4NTc2LjApOwotICAgIH0KLSAgICBlbHNlIHsKLQlhcF9ycHJpbnRmKHIsICIlNCIgQVBSX1NTSVpFX1RfRk1UICJNIiwgKHNpemUgKyA1MjQyODgpIC8gMTA0ODU3Nik7Ci0gICAgfQotfQotCi0jaWYgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lOMzIpCi1zdGF0aWMgY2hhciAqKmNyZWF0ZV9hcmd2X2NtZChhcF9jb250ZXh0X3QgKnAsIGNoYXIgKmF2MCwgY29uc3QgY2hhciAqYXJncywgY2hhciAqcGF0aCkKLXsKLSAgICByZWdpc3RlciBpbnQgeCwgbjsKLSAgICBjaGFyICoqYXY7Ci0gICAgY2hhciAqdzsKLQotICAgIGZvciAoeCA9IDAsIG4gPSAyOyBhcmdzW3hdOyB4KyspIHsKLSAgICAgICAgaWYgKGFyZ3NbeF0gPT0gJysnKSB7Ci0JICAgICsrbjsKLQl9Ci0gICAgfQotCi0gICAgLyogQWRkIGV4dHJhIHN0cmluZ3MgdG8gYXJyYXkuICovCi0gICAgbiA9IG4gKyAyOwotCi0gICAgYXYgPSAoY2hhciAqKikgYXBfcGFsbG9jKHAsIChuICsgMSkgKiBzaXplb2YoY2hhciAqKSk7Ci0gICAgYXZbMF0gPSBhdjA7Ci0KLSAgICAvKiBOb3cgaW5zZXJ0IHRoZSBleHRyYSBzdHJpbmdzIHdlIG1hZGUgcm9vbSBmb3IgYWJvdmUuICovCi0gICAgYXZbMV0gPSBzdHJkdXAoIi9DIik7Ci0gICAgYXZbMl0gPSBzdHJkdXAocGF0aCk7Ci0KLSAgICBmb3IgKHggPSAoMSArIDIpOyB4IDwgbjsgeCsrKSB7Ci0JdyA9IGFwX2dldHdvcmQocCwgJmFyZ3MsICcrJyk7Ci0JYXBfdW5lc2NhcGVfdXJsKHcpOwotCWF2W3hdID0gYXBfZXNjYXBlX3NoZWxsX2NtZChwLCB3KTsKLSAgICB9Ci0gICAgYXZbbl0gPSBOVUxMOwotICAgIHJldHVybiBhdjsKLX0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9zZXJ2ZXIvdXRpbF91cmkuYyBiL3NlcnZlci91dGlsX3VyaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTUxMDI5Li4wMDAwMDAwCi0tLSBhL3NlcnZlci91dGlsX3VyaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAwICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiB1dGlsX3VyaS5jOiBVUkkgcmVsYXRlZCB1dGlsaXR5IHRoaW5ncwotICogCi0gKi8KLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9sb2cuaCIKLSNpbmNsdWRlICJ1dGlsX3VyaS5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKiBTb21lIFdXVyBzY2hlbWVzIGFuZCB0aGVpciBkZWZhdWx0IHBvcnRzOyB0aGlzIGlzIGJhc2ljYWxseSAvZXRjL3NlcnZpY2VzICovCi0vKiBUaGlzIHdpbGwgYmVjb21lIGdsb2JhbCB3aGVuIHRoZSBwcm90b2NvbCBhYnN0cmFjdGlvbiBjb21lcyAqLwotLyogQXMgdGhlIHNjaGVtZXMgYXJlIHNlYXJjaGVkIGJ5IGEgbGluZWFyIHNlYXJjaCwgKi8KLS8qIHRoZXkgYXJlIHNvcnRlZCBieSB0aGVpciBleHBlY3RlZCBmcmVxdWVuY3kgKi8KLXN0YXRpYyBzY2hlbWVzX3Qgc2NoZW1lc1tdID0KLXsKLSAgICB7Imh0dHAiLCAgIERFRkFVTFRfSFRUUF9QT1JUfSwKLSAgICB7ImZ0cCIsICAgIERFRkFVTFRfRlRQX1BPUlR9LAotICAgIHsiaHR0cHMiLCAgREVGQVVMVF9IVFRQU19QT1JUfSwKLSAgICB7ImdvcGhlciIsIERFRkFVTFRfR09QSEVSX1BPUlR9LAotICAgIHsid2FpcyIsICAgREVGQVVMVF9XQUlTX1BPUlR9LAotICAgIHsibm50cCIsICAgREVGQVVMVF9OTlRQX1BPUlR9LAotICAgIHsic25ld3MiLCAgREVGQVVMVF9TTkVXU19QT1JUfSwKLSAgICB7InByb3NwZXJvIiwgREVGQVVMVF9QUk9TUEVST19QT1JUfSwKLSAgICB7IE5VTEwsIDB4RkZGRiB9CQkJLyogdW5rbm93biBwb3J0ICovCi19OwotCi0KLUFQSV9FWFBPUlQodW5zaWduZWQgc2hvcnQpIGFwX2RlZmF1bHRfcG9ydF9mb3Jfc2NoZW1lKGNvbnN0IGNoYXIgKnNjaGVtZV9zdHIpCi17Ci0gICAgc2NoZW1lc190ICpzY2hlbWU7Ci0KLSAgICBmb3IgKHNjaGVtZSA9IHNjaGVtZXM7IHNjaGVtZS0+bmFtZSAhPSBOVUxMOyArK3NjaGVtZSkKLQlpZiAoc3RyY2FzZWNtcChzY2hlbWVfc3RyLCBzY2hlbWUtPm5hbWUpID09IDApCi0JICAgIHJldHVybiBzY2hlbWUtPmRlZmF1bHRfcG9ydDsKLQotICAgIHJldHVybiAwOwotfQotCi1BUElfRVhQT1JUKHVuc2lnbmVkIHNob3J0KSBhcF9kZWZhdWx0X3BvcnRfZm9yX3JlcXVlc3QoY29uc3QgcmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgcmV0dXJuIChyLT5wYXJzZWRfdXJpLnNjaGVtZSkKLQk/IGFwX2RlZmF1bHRfcG9ydF9mb3Jfc2NoZW1lKHItPnBhcnNlZF91cmkuc2NoZW1lKQotCTogMDsKLX0KLQotLyogQ3JlYXRlIGEgY29weSBvZiBhICJzdHJ1Y3QgaG9zdGVudCIgcmVjb3JkOyBpdCB3YXMgcHJlc3VtYWJseSByZXR1cm5lZAotICogZnJvbSBhIGNhbGwgdG8gZ2V0aG9zdGJ5bmFtZSgpIGFuZCBsaXZlcyBpbiBzdGF0aWMgc3RvcmFnZS4KLSAqIEJ5IGNyZWF0aW5nIGEgY29weSB3ZSBjYW4gdHVjayBpdCBhd2F5IGZvciBsYXRlciB1c2UuCi0gKi8KLUFQSV9FWFBPUlQoc3RydWN0IGhvc3RlbnQgKikgYXBfcGR1cGhvc3RlbnQoYXBfY29udGV4dF90ICpwLCBjb25zdCBzdHJ1Y3QgaG9zdGVudCAqaHApCi17Ci0gICAgc3RydWN0IGhvc3RlbnQgKm5ld2VudDsKLSAgICBjaGFyCSAgKipwdHJzOwotICAgIGNoYXIJICAqKmFsaWFzZXM7Ci0gICAgc3RydWN0IGluX2FkZHIgKmFkZHJzOwotICAgIGludAkJICAgaSA9IDAsIGogPSAwOwotCi0gICAgaWYgKGhwID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBDb3VudCBudW1iZXIgb2YgYWxpYXMgZW50cmllcyAqLwotICAgIGlmIChocC0+aF9hbGlhc2VzICE9IE5VTEwpCi0JZm9yICg7IGhwLT5oX2FsaWFzZXNbal0gIT0gTlVMTDsgKytqKQotCSAgICBjb250aW51ZTsKLQotICAgIC8qIENvdW50IG51bWJlciBvZiBpbl9hZGRyIGVudHJpZXMgKi8KLSAgICBpZiAoaHAtPmhfYWRkcl9saXN0ICE9IE5VTEwpCi0JZm9yICg7IGhwLT5oX2FkZHJfbGlzdFtpXSAhPSBOVUxMOyArK2kpCi0JICAgIGNvbnRpbnVlOwotCi0gICAgLyogQWxsb2NhdGUgaG9zdGVudCBzdHJ1Y3R1cmUsIGFsaWFzIHB0cnMsIGFkZHIgcHRycywgYWRkcnMgKi8KLSAgICBuZXdlbnQgPSAoc3RydWN0IGhvc3RlbnQgKikgYXBfcGFsbG9jKHAsIHNpemVvZigqaHApKTsKLSAgICBhbGlhc2VzID0gKGNoYXIgKiopIGFwX3BhbGxvYyhwLCAoaisxKSAqIHNpemVvZihjaGFyKikpOwotICAgIHB0cnMgPSAoY2hhciAqKikgYXBfcGFsbG9jKHAsIChpKzEpICogc2l6ZW9mKGNoYXIqKSk7Ci0gICAgYWRkcnMgID0gKHN0cnVjdCBpbl9hZGRyICopIGFwX3BhbGxvYyhwLCAoaSsxKSAqIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOwotCi0gICAgKm5ld2VudCA9ICpocDsKLSAgICBuZXdlbnQtPmhfbmFtZSA9IGFwX3BzdHJkdXAocCwgaHAtPmhfbmFtZSk7Ci0gICAgbmV3ZW50LT5oX2FsaWFzZXMgPSBhbGlhc2VzOwotICAgIG5ld2VudC0+aF9hZGRyX2xpc3QgPSAoY2hhcioqKSBwdHJzOwotCi0gICAgLyogQ29weSBBbGlhcyBOYW1lczogKi8KLSAgICBmb3IgKGogPSAwOyBocC0+aF9hbGlhc2VzW2pdICE9IE5VTEw7ICsraikgewotICAgICAgIGFsaWFzZXNbal0gPSBhcF9wc3RyZHVwKHAsIGhwLT5oX2FsaWFzZXNbal0pOwotICAgIH0KLSAgICBhbGlhc2VzW2pdID0gTlVMTDsKLQotICAgIC8qIENvcHkgYWRkcmVzcyBlbnRyaWVzICovCi0gICAgZm9yIChpID0gMDsgaHAtPmhfYWRkcl9saXN0W2ldICE9IE5VTEw7ICsraSkgewotCXB0cnNbaV0gPSAoY2hhciopICZhZGRyc1tpXTsKLQlhZGRyc1tpXSA9ICooc3RydWN0IGluX2FkZHIgKikgaHAtPmhfYWRkcl9saXN0W2ldOwotICAgIH0KLSAgICBwdHJzW2ldID0gTlVMTDsKLQotICAgIHJldHVybiBuZXdlbnQ7Ci19Ci0KLQotLyogcGdldGhvc3RieW5hbWUoKTogcmVzb2x2ZSBob3N0bmFtZSwgaWYgc3VjY2Vzc2Z1bCByZXR1cm4gYW4gQUxMT0NBVEVECi0gKiBDT1BZIE9GIHRoZSBob3N0ZW50IHN0cnVjdHVyZSwgaW50ZW5kZWQgdG8gYmUgc3RvcmVkIGFuZCB1c2VkIGxhdGVyLgotICogKGdldGhvc3RieW5hbWUoKSB1c2VzIHN0YXRpYyBzdG9yYWdlIHRoYXQgd291bGQgYmUgb3ZlcndyaXR0ZW4gb24gZWFjaCBjYWxsKQotICovCi1BUElfRVhQT1JUKHN0cnVjdCBob3N0ZW50ICopIGFwX3BnZXRob3N0YnluYW1lKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqaG9zdG5hbWUpCi17Ci0gICAgc3RydWN0IGhvc3RlbnQgKmhwID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZSk7Ci0gICAgcmV0dXJuIChocCA9PSBOVUxMKSA/IE5VTEwgOiBhcF9wZHVwaG9zdGVudChwLCBocCk7Ci19Ci0KLQotLyogVW5wYXJzZSBhIHVyaV9jb21wb25lbnRzIHN0cnVjdHVyZSB0byBhbiBVUkkgc3RyaW5nLgotICogT3B0aW9uYWxseSBzdXBwcmVzcyB0aGUgcGFzc3dvcmQgZm9yIHNlY3VyaXR5IHJlYXNvbnMuCi0gKi8KLUFQSV9FWFBPUlQoY2hhciAqKSBhcF91bnBhcnNlX3VyaV9jb21wb25lbnRzKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgdXJpX2NvbXBvbmVudHMgKnVwdHIsIHVuc2lnbmVkIGZsYWdzKQotewotICAgIGNoYXIgKnJldCA9ICIiOwotCi0gICAgLyogSWYgc3VwcHJlc3NpbmcgdGhlIHNpdGUgcGFydCwgb21pdCBib3RoIHVzZXIgbmFtZSAmIHNjaGVtZTovL2hvc3RuYW1lICovCi0gICAgaWYgKCEoZmxhZ3MgJiBVTlBfT01JVFNJVEVQQVJUKSkgewotCi0JLyogQ29uc3RydWN0IGEgInVzZXI6cGFzc3dvcmRAIiBzdHJpbmcsIGhvbm9yaW5nIHRoZSBwYXNzZWQgVU5QXyBmbGFnczogKi8KLQlpZiAodXB0ci0+dXNlcnx8dXB0ci0+cGFzc3dvcmQpCi0JICAgIHJldCA9IGFwX3BzdHJjYXQgKHAsCi0JCQkodXB0ci0+dXNlciAgICAgJiYgIShmbGFncyAmIFVOUF9PTUlUVVNFUikpID8gdXB0ci0+dXNlciA6ICIiLAotCQkJKHVwdHItPnBhc3N3b3JkICYmICEoZmxhZ3MgJiBVTlBfT01JVFBBU1NXT1JEKSkgPyAiOiIgOiAiIiwKLQkJCSh1cHRyLT5wYXNzd29yZCAmJiAhKGZsYWdzICYgVU5QX09NSVRQQVNTV09SRCkpCi0JCQkgICA/ICgoZmxhZ3MgJiBVTlBfUkVWRUFMUEFTU1dPUkQpID8gdXB0ci0+cGFzc3dvcmQgOiAiWFhYWFhYWFgiKQotCQkJICAgOiAiIiwKLQkJCSJAIiwgTlVMTCk7Ci0KLQkvKiBDb25zdHJ1Y3Qgc2NoZW1lOi8vc2l0ZSBzdHJpbmcgKi8KLQlpZiAodXB0ci0+aG9zdG5hbWUpIHsKLQkgICAgaW50IGlzX2RlZmF1bHRfcG9ydDsKLQotCSAgICBpc19kZWZhdWx0X3BvcnQgPQotCQkodXB0ci0+cG9ydF9zdHIgPT0gTlVMTCB8fAotCQkgdXB0ci0+cG9ydCA9PSAwIHx8Ci0JCSB1cHRyLT5wb3J0ID09IGFwX2RlZmF1bHRfcG9ydF9mb3Jfc2NoZW1lKHVwdHItPnNjaGVtZSkpOwotCi0JICAgIHJldCA9IGFwX3BzdHJjYXQgKHAsCi0JCQl1cHRyLT5zY2hlbWUsICI6Ly8iLCByZXQsIAotCQkJdXB0ci0+aG9zdG5hbWUgPyB1cHRyLT5ob3N0bmFtZSA6ICIiLAotCQkJaXNfZGVmYXVsdF9wb3J0ID8gIiIgOiAiOiIsCi0JCQlpc19kZWZhdWx0X3BvcnQgPyAiIiA6IHVwdHItPnBvcnRfc3RyLAotCQkJTlVMTCk7Ci0JfQotICAgIH0KLQotICAgIC8qIFNob3VsZCB3ZSBzdXBwcmVzcyBhbGwgcGF0aCBpbmZvPyAqLwotICAgIGlmICghKGZsYWdzICYgVU5QX09NSVRQQVRISU5GTykpIHsKLQkvKiBBcHBlbmQgcGF0aCwgcXVlcnkgYW5kIGZyYWdtZW50IHN0cmluZ3M6ICovCi0JcmV0ID0gYXBfcHN0cmNhdCAocCwKLQkJcmV0LAotCQl1cHRyLT5wYXRoID8gdXB0ci0+cGF0aCA6ICIiLAotCQkodXB0ci0+cXVlcnkgICAgJiYgIShmbGFncyAmIFVOUF9PTUlUUVVFUlkpKSA/ICI/IiA6ICIiLAotCQkodXB0ci0+cXVlcnkgICAgJiYgIShmbGFncyAmIFVOUF9PTUlUUVVFUlkpKSA/IHVwdHItPnF1ZXJ5IDogIiIsCi0JCSh1cHRyLT5mcmFnbWVudCAmJiAhKGZsYWdzICYgVU5QX09NSVRRVUVSWSkpID8gIiMiIDogTlVMTCwKLQkJKHVwdHItPmZyYWdtZW50ICYmICEoZmxhZ3MgJiBVTlBfT01JVFFVRVJZKSkgPyB1cHRyLT5mcmFnbWVudCA6IE5VTEwsCi0JCU5VTEwpOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi0vKiBUaGUgcmVnZXggdmVyc2lvbiBvZiBwYXJzZV91cmlfY29tcG9uZW50cyBoYXMgdGhlIGFkdmFudGFnZSB0aGF0IGl0IGlzCi0gKiByZWxhdGl2ZWx5IGVhc3kgdG8gdW5kZXJzdGFuZCBhbmQgZXh0ZW5kLiAgQnV0IGl0IGhhcyB0aGUgZGlzYWR2YW50YWdlCi0gKiB0aGF0IHRoZSByZWdleGVzIGFyZSBjb21wbGV4IGVub3VnaCB0aGF0IHJlZ2V4IGxpYnJhcmllcyByZWFsbHkKLSAqIGRvbid0IGRvIGEgZ3JlYXQgam9iIHdpdGggdGhlbSBwZXJmb3JtYW5jZXdpc2UuCi0gKgotICogVGhlIGRlZmF1bHQgaXMgYSBoYW5kIGNvZGVkIHNjYW5uZXIgdGhhdCBpcyB0d28gb3JkZXJzIG9mIG1hZ25pdHVkZQotICogZmFzdGVyLgotICovCi0jaWZkZWYgVVRJTF9VUklfUkVHRVgKLQotc3RhdGljIHJlZ2V4X3QgcmVfdXJpOwotc3RhdGljIHJlZ2V4X3QgcmVfaG9zdHBhcnQ7Ci0KLXZvaWQgYXBfdXRpbF91cmlfaW5pdCh2b2lkKQotewotICAgIGludCByZXQ7Ci0gICAgY29uc3QgY2hhciAqcmVfc3RyOwotCi0gICAgLyogVGhpcyBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHJlZ2V4IHRoYXQgYXBwZWFyZWQgaW4KLSAgICAgKiBkcmFmdC1maWVsZGluZy11cmktc3ludGF4LTAxLiAgSXQgZG9lc250IGFsbG93IHRoZSB1cmkgdG8gY29udGFpbiBhCi0gICAgICogc2NoZW1lIGJ1dCBubyBob3N0aW5mbyBvciB2aWNlIHZlcnNhLiAKLSAgICAgKgotICAgICAqIGRyYWZ0LWZpZWxkaW5nLXVyaS1zeW50YXgtMDEudHh0LCBzZWN0aW9uIDQuNCB0ZWxscyB1czoKLSAgICAgKgotICAgICAqCSAgICBBbHRob3VnaCB0aGUgQk5GIGRlZmluZXMgd2hhdCBpcyBhbGxvd2VkIGluIGVhY2ggY29tcG9uZW50LCBpdCBpcwotICAgICAqCSAgICBhbWJpZ3VvdXMgaW4gdGVybXMgb2YgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gYSBzaXRlIGNvbXBvbmVudCBhbmQKLSAgICAgKgkgICAgYSBwYXRoIGNvbXBvbmVudCB0aGF0IGJlZ2lucyB3aXRoIHR3byBzbGFzaCBjaGFyYWN0ZXJzLgotICAgICAqICAKLSAgICAgKiBSRkMyMDY4IGRpc2FtYmlndWF0ZXMgdGhpcyBmb3IgdGhlIFJlcXVlc3QtVVJJLCB3aGljaCBtYXkgb25seSBldmVyIGJlCi0gICAgICogdGhlICJhYnNfcGF0aCIgcG9ydGlvbiBvZiB0aGUgVVJJLiAgU28gYSByZXF1ZXN0ICJHRVQgLy9mb28vYmFyCi0gICAgICogSFRUUC8xLjEiIGlzIHJlYWxseSByZWZlcnJpbmcgdG8gdGhlIHBhdGggLy9mb28vYmFyLCBub3QgdGhlIGhvc3QgZm9vLAotICAgICAqIHBhdGggL2Jhci4gIE5vd2hlcmUgaW4gUkZDMjA2OCBpcyBpdCBwb3NzaWJsZSB0byBoYXZlIGEgc2NoZW1lIGJ1dCBubwotICAgICAqIGhvc3RpbmZvIG9yIGEgaG9zdGluZm8gYnV0IG5vIHNjaGVtZS4gIChVbmxlc3MgeW91J3JlIHByb3h5aW5nIGEKLSAgICAgKiBwcm90b2NvbCBvdGhlciB0aGFuIEhUVFAsIGJ1dCB0aGlzIHBhcnNpbmcgZW5naW5lIHByb2JhYmx5IHdvbid0IHdvcmsKLSAgICAgKiBmb3Igb3RoZXIgcHJvdG9jb2xzLikKLSAgICAgKgotICAgICAqICAgICAgICAgMTIgICAgICAgICAgICAzICAgICAgICAgIDQgICAgICAgNSAgIDYgICAgICAgIDcgOCAqLwotICAgIHJlX3N0ciA9ICJeKChbXjovPyNdKyk6Ly8oW14vPyNdKikpPyhbXj8jXSopKFxcPyhbXiNdKikpPygjKC4qKSk/JCI7Ci0gICAgLyogICAgICAgICAgXnNjaGVtZS0tXiAgIF5zaXRlLS0tXiAgXnBhdGgtLV4gICBecXVlcnleICAgIF5mcmFnICovCi0gICAgaWYgKChyZXQgPSByZWdjb21wKCZyZV91cmksIHJlX3N0ciwgUkVHX0VYVEVOREVEKSkgIT0gMCkgewotCWNoYXIgbGluZVsxMDI0XTsKLQotCS8qIE1ha2UgYSByZWFkYWJsZSBlcnJvciBtZXNzYWdlICovCi0JcmV0ID0gcmVnZXJyb3IocmV0LCAmcmVfdXJpLCBsaW5lLCBzaXplb2YgbGluZSk7Ci0JYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCBOVUxMLAotCQkiSW50ZXJuYWwgZXJyb3I6IHJlZ2NvbXAoXCIlc1wiKSByZXR1cm5lZCBub24temVybyAoJXMpIC0gIgotCQkicG9zc2libHkgZHVlIHRvIGJyb2tlbiByZWdleCBsaWIhICIKLQkJIkRpZCB5b3UgZGVmaW5lIFdBTlRIU1JFR0VYPXllcz8iLAotCQlyZV9zdHIsIGxpbmUpOwotCi0JZXhpdCgxKTsKLSAgICB9Ci0KLSAgICAvKiBUaGlzIGlzIGEgc3ViLVJFIHdoaWNoIHdpbGwgYnJlYWsgZG93biB0aGUgaG9zdGluZm8gcGFydCwKLSAgICAgKiBpLmUuLCB1c2VyLCBwYXNzd29yZCwgaG9zdG5hbWUgYW5kIHBvcnQuCi0gICAgICogJCAgICAgICAgICAxMiAgICAgIDMgNCAgICAgICAgNSAgICAgICA2IDcgICAgKi8KLSAgICByZV9zdHIgICAgPSAiXigoW146XSopKDooLiopKT9AKT8oW15AOl0qKSg6KFswLTldKikpPyQiOwotICAgIC8qICAgICAgICAgICAgIF5edXNlcl4gOnB3ICAgICAgICBeaG9zdF4gXjpbcG9ydF1eICovCi0gICAgaWYgKChyZXQgPSByZWdjb21wKCZyZV9ob3N0cGFydCwgcmVfc3RyLCBSRUdfRVhURU5ERUQpKSAhPSAwKSB7Ci0JY2hhciBsaW5lWzEwMjRdOwotCi0JLyogTWFrZSBhIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2UgKi8KLQlyZXQgPSByZWdlcnJvcihyZXQsICZyZV9ob3N0cGFydCwgbGluZSwgc2l6ZW9mIGxpbmUpOwotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgTlVMTCwKLQkJIkludGVybmFsIGVycm9yOiByZWdjb21wKFwiJXNcIikgcmV0dXJuZWQgbm9uLXplcm8gKCVzKSAtICIKLQkJInBvc3NpYmx5IGR1ZSB0byBicm9rZW4gcmVnZXggbGliISAiCi0JCSJEaWQgeW91IGRlZmluZSBXQU5USFNSRUdFWD15ZXM/IiwKLQkJcmVfc3RyLCBsaW5lKTsKLQotCWV4aXQoMSk7Ci0gICAgfQotfQotCi0KLS8qIHBhcnNlX3VyaV9jb21wb25lbnRzKCk6Ci0gKiBQYXJzZSBhIGdpdmVuIFVSSSwgZmlsbCBpbiBhbGwgc3VwcGxpZWQgZmllbGRzIG9mIGEgdXJpX2NvbXBvbmVudHMKLSAqIHN0cnVjdHVyZS4gVGhpcyBlbGltaW5hdGVzIHRoZSBuZWNlc3NpdHkgb2YgZXh0cmFjdGluZyBob3N0LCBwb3J0LAotICogcGF0aCwgcXVlcnkgaW5mbyByZXBlYXRlZGx5IGluIHRoZSBtb2R1bGVzLgotICogU2lkZSBlZmZlY3RzOgotICogIC0gZmlsbHMgaW4gZmllbGRzIG9mIHVyaV9jb21wb25lbnRzICp1cHRyCi0gKiAgLSBub25lIG9uIGFueSBvZiB0aGUgci0+KiBmaWVsZHMKLSAqLwotQVBJX0VYUE9SVChpbnQpIGFwX3BhcnNlX3VyaV9jb21wb25lbnRzKGFwX2NvbnRleHRfdCAqcCwgY29uc3QgY2hhciAqdXJpLCB1cmlfY29tcG9uZW50cyAqdXB0cikKLXsKLSAgICBpbnQgcmV0OwotICAgIHJlZ21hdGNoX3QgbWF0Y2hbMTBdOwkvKiBUaGlzIG11c3QgaGF2ZSBhdCBsZWFzdCBhcyBtdWNoIGVsZW1lbnRzCi0JCQkJKiBhcyB0aGVyZSBhcmUgYnJhY2VzIGluIHRoZSByZV9zdHJpbmdzICovCi0KLSAgICBhcF9hc3NlcnQgKHVwdHIgIT0gTlVMTCk7Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUuIHBhcnNlX3VyaSgpIGFuZCBwYXJzZV91cmlfY29tcG9uZW50cygpCi0gICAgICogY2FuIGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBwZXIgcmVxdWVzdC4KLSAgICAgKi8KLSAgICBtZW1zZXQgKHVwdHIsICdcMCcsIHNpemVvZigqdXB0cikpOwotICAgIHVwdHItPmlzX2luaXRpYWxpemVkID0gMTsKLQotICAgIHJldCA9IGFwX3JlZ2V4ZWMoJnJlX3VyaSwgdXJpLCByZV91cmkucmVfbnN1YiArIDEsIG1hdGNoLCAwKTsKLQotICAgIGlmIChyZXQgIT0gMCkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgImFwX3JlZ2V4ZWMoKSBjb3VsZCBub3QgcGFyc2UgdXJpIChcIiVzXCIpIiwKLQkJICAgIHVyaSk7Ci0KLQlyZXR1cm4gSFRUUF9CQURfUkVRVUVTVDsKLSAgICB9Ci0KLSAgICBpZiAobWF0Y2hbMl0ucm1fc28gIT0gbWF0Y2hbMl0ucm1fZW8pCi0JdXB0ci0+c2NoZW1lID0gYXBfcHN0cm5kdXAgKHAsIHVyaSttYXRjaFsyXS5ybV9zbywgbWF0Y2hbMl0ucm1fZW8gLSBtYXRjaFsyXS5ybV9zbyk7Ci0KLSAgICAvKiBlbXB0eSBob3N0aW5mbyBpcyB2YWxpZCwgdGhhdCdzIHdoeSB3ZSB0ZXN0ICQxIGJ1dCB1c2UgJDMgKi8KLSAgICBpZiAobWF0Y2hbMV0ucm1fc28gIT0gbWF0Y2hbMV0ucm1fZW8pCi0JdXB0ci0+aG9zdGluZm8gPSBhcF9wc3RybmR1cCAocCwgdXJpK21hdGNoWzNdLnJtX3NvLCBtYXRjaFszXS5ybV9lbyAtIG1hdGNoWzNdLnJtX3NvKTsKLQotICAgIGlmIChtYXRjaFs0XS5ybV9zbyAhPSBtYXRjaFs0XS5ybV9lbykKLQl1cHRyLT5wYXRoID0gYXBfcHN0cm5kdXAgKHAsIHVyaSttYXRjaFs0XS5ybV9zbywgbWF0Y2hbNF0ucm1fZW8gLSBtYXRjaFs0XS5ybV9zbyk7Ci0KLSAgICAvKiBlbXB0eSBxdWVyeSBzdHJpbmcgaXMgdmFsaWQsIHRoYXQncyB3aHkgd2UgdGVzdCAkNSBidXQgdXNlICQ2ICovCi0gICAgaWYgKG1hdGNoWzVdLnJtX3NvICE9IG1hdGNoWzVdLnJtX2VvKQotCXVwdHItPnF1ZXJ5ID0gYXBfcHN0cm5kdXAgKHAsIHVyaSttYXRjaFs2XS5ybV9zbywgbWF0Y2hbNl0ucm1fZW8gLSBtYXRjaFs2XS5ybV9zbyk7Ci0KLSAgICAvKiBlbXB0eSBmcmFnbWVudCBpcyB2YWxpZCwgdGVzdCAkNyB1c2UgJDggKi8KLSAgICBpZiAobWF0Y2hbN10ucm1fc28gIT0gbWF0Y2hbN10ucm1fZW8pCi0JdXB0ci0+ZnJhZ21lbnQgPSBhcF9wc3RybmR1cCAocCwgdXJpK21hdGNoWzhdLnJtX3NvLCBtYXRjaFs4XS5ybV9lbyAtIG1hdGNoWzhdLnJtX3NvKTsKLQotICAgIGlmICh1cHRyLT5ob3N0aW5mbykgewotCS8qIFBhcnNlIHRoZSBob3N0aW5mbyBwYXJ0IHRvIGV4dHJhY3QgdXNlciwgcGFzc3dvcmQsIGhvc3QsIGFuZCBwb3J0ICovCi0JcmV0ID0gYXBfcmVnZXhlYygmcmVfaG9zdHBhcnQsIHVwdHItPmhvc3RpbmZvLCByZV9ob3N0cGFydC5yZV9uc3ViICsgMSwgbWF0Y2gsIDApOwotCWlmIChyZXQgIT0gMCkgewotCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICJhcF9yZWdleGVjKCkgY291bGQgbm90IHBhcnNlIChcIiVzXCIpIGFzIGhvc3QgcGFydCIsCi0JCSAgICB1cHRyLT5ob3N0aW5mbyk7Ci0KLQkgICAgcmV0dXJuIEhUVFBfQkFEX1JFUVVFU1Q7Ci0JfQotCi0JLyogJCAgICAgIDEyICAgICAgMyA0ICAgICAgICA1ICAgICAgIDYgNyAgICAgICAgICAgICovCi0JLyogICAgICAiXigoW146XSopKDooLiopKT9AKT8oW15AOl0qKSg6KFswLTldKikpPyQiICovCi0JLyogICAgICAgICBeXnVzZXJeIDpwdyAgICAgICAgXmhvc3ReIF46W3BvcnRdXiAgICAgICovCi0KLQkvKiBlbXB0eSB1c2VyIGlzIHZhbGlkLCB0aGF0J3Mgd2h5IHdlIHRlc3QgJDEgYnV0IHVzZSAkMiAqLwotCWlmIChtYXRjaFsxXS5ybV9zbyAhPSBtYXRjaFsxXS5ybV9lbykKLQkgICAgdXB0ci0+dXNlciA9IGFwX3BzdHJuZHVwIChwLCB1cHRyLT5ob3N0aW5mbyttYXRjaFsyXS5ybV9zbywgbWF0Y2hbMl0ucm1fZW8gLSBtYXRjaFsyXS5ybV9zbyk7Ci0KLQkvKiBlbXB0eSBwYXNzd29yZCBpcyB2YWxpZCwgdGVzdCAkMyBidXQgdXNlICQ0ICovCi0JaWYgKG1hdGNoWzNdLnJtX3NvICE9IG1hdGNoWzNdLnJtX2VvKQotCSAgICB1cHRyLT5wYXNzd29yZCA9IGFwX3BzdHJuZHVwIChwLCB1cHRyLT5ob3N0aW5mbyttYXRjaFs0XS5ybV9zbywgbWF0Y2hbNF0ucm1fZW8gLSBtYXRjaFs0XS5ybV9zbyk7Ci0KLQkvKiBlbXB0eSBob3N0bmFtZSBpcyB2YWxpZCwgYW5kIGltcGxpZWQgYnkgdGhlIGV4aXN0ZW5jZSBvZiBob3N0aW5mbyAqLwotCXVwdHItPmhvc3RuYW1lID0gYXBfcHN0cm5kdXAgKHAsIHVwdHItPmhvc3RpbmZvK21hdGNoWzVdLnJtX3NvLCBtYXRjaFs1XS5ybV9lbyAtIG1hdGNoWzVdLnJtX3NvKTsKLQotCWlmIChtYXRjaFs2XS5ybV9zbyAhPSBtYXRjaFs2XS5ybV9lbykgewotCSAgICAvKiBOb3RlIHRoYXQgdGhlIHBvcnQgc3RyaW5nIGNhbiBiZSBlbXB0eS4KLQkgICAgICogSWYgaXQgaXMsIHdlIHVzZSB0aGUgZGVmYXVsdCBwb3J0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2NoZW1lCi0JICAgICAqLwotCSAgICB1cHRyLT5wb3J0X3N0ciA9IGFwX3BzdHJuZHVwIChwLCB1cHRyLT5ob3N0aW5mbyttYXRjaFs3XS5ybV9zbywgbWF0Y2hbN10ucm1fZW8gLSBtYXRjaFs3XS5ybV9zbyk7Ci0JICAgIGlmICh1cHRyLT5wb3J0X3N0clswXSAhPSAnXDAnKSB7Ci0JCWNoYXIgKmVuZHN0cjsKLQkJaW50IHBvcnQ7Ci0KLQkJcG9ydCA9IHN0cnRvbCh1cHRyLT5wb3J0X3N0ciwgJmVuZHN0ciwgMTApOwotCQl1cHRyLT5wb3J0ID0gcG9ydDsKLQkJaWYgKCplbmRzdHIgIT0gJ1wwJykgewotCQkgICAgLyogSW52YWxpZCBjaGFyYWN0ZXJzIGFmdGVyICc6JyBmb3VuZCAqLwotCQkgICAgcmV0dXJuIEhUVFBfQkFEX1JFUVVFU1Q7Ci0JCX0KLQkgICAgfQotCSAgICBlbHNlIHsKLQkJdXB0ci0+cG9ydCA9IHVwdHItPnNjaGVtZSA/IGFwX2RlZmF1bHRfcG9ydF9mb3Jfc2NoZW1lKHVwdHItPnNjaGVtZSkgOiBERUZBVUxUX0hUVFBfUE9SVDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICBpZiAocmV0ID09IDApCi0JcmV0ID0gSFRUUF9PSzsKLSAgICByZXR1cm4gcmV0OwotfQotI2Vsc2UKLQotLyogSGVyZSBpcyB0aGUgaGFuZC1vcHRpbWl6ZWQgcGFyc2VfdXJpX2NvbXBvbmVudHMoKS4gIFRoZXJlIGFyZSBzb21lIHdpbGQKLSAqIHRyaWNrcyB3ZSBjb3VsZCBwdWxsIGluIGFzc2VtYmx5IGxhbmd1YWdlIHRoYXQgd2UgZG9uJ3QgcHVsbCBoZXJlLi4uIGxpa2Ugd2UKLSAqIGNhbiBkbyB3b3JkLWF0LXRpbWUgc2NhbnMgZm9yIGRlbGltaXRlciBjaGFyYWN0ZXJzIHVzaW5nIHRoZSBzYW1lIHRlY2huaXF1ZQotICogdGhhdCBmYXN0IG1lbWNocigpcyB1c2UuICBCdXQgdGhhdCB3b3VsZCBiZSB3YXkgbm9uLXBvcnRhYmxlLiAtZGpnCi0gKi8KLQotLyogV2UgaGF2ZSBhIGFwX3RhYmxlX3QgdGhhdCB3ZSBjYW4gaW5kZXggYnkgY2hhcmFjdGVyIGFuZCBpdCB0ZWxscyB1cyBpZiB0aGUKLSAqIGNoYXJhY3RlciBpcyBvbmUgb2YgdGhlIGludGVyZXN0aW5nIGRlbGltaXRlcnMuICBOb3RlIHRoYXQgd2UgZXZlbiBnZXQKLSAqIGNvbXBhcmVzIGZvciBOVUwgZm9yIGZyZWUgLS0gaXQncyBqdXN0IGFub3RoZXIgZGVsaW1pdGVyLgotICovCi0KLSNkZWZpbmUgVF9DT0xPTgkJMHgwMQkvKiAnOicgKi8KLSNkZWZpbmUgVF9TTEFTSAkJMHgwMgkvKiAnLycgKi8KLSNkZWZpbmUgVF9RVUVTVElPTgkweDA0CS8qICc/JyAqLwotI2RlZmluZSBUX0hBU0gJCTB4MDgJLyogJyMnICovCi0jZGVmaW5lIFRfTlVMCQkweDgwCS8qICdcMCcgKi8KLQotLyogdGhlIHVyaV9kZWxpbXMuaCBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQgYnkgZ2VuX3VyaV9kZWxpbXMuYyAqLwotI2luY2x1ZGUgInVyaV9kZWxpbXMuaCIKLQotLyogaXQgd29ya3MgbGlrZSB0aGlzOgotICAgIGlmICh1cmlfZGVsaW1zW2NoXSAmIE5PVEVORF9mb29iYXIpIHsKLQl0aGVuIHdlJ3JlIG5vdCBhdCBhIGRlbGltaXRlciBmb3IgZm9vYmFyCi0gICAgfQotKi8KLQotLyogTm90ZSB0aGF0IHdlIG9wdGltaXplIHRoZSBzY2hlbWUgc2Nhbm5pbmcgaGVyZSwgd2UgY2hlYXQgYW5kIGxldCB0aGUKLSAqIGNvbXBpbGVyIGtub3cgdGhhdCBpdCBkb2Vzbid0IGhhdmUgdG8gZG8gdGhlICYgbWFza2luZy4KLSAqLwotI2RlZmluZSBOT1RFTkRfU0NIRU1FCSgweGZmKQotI2RlZmluZSBOT1RFTkRfSE9TVElORk8JKFRfU0xBU0ggfCBUX1FVRVNUSU9OIHwgVF9IQVNIIHwgVF9OVUwpCi0jZGVmaW5lIE5PVEVORF9QQVRICShUX1FVRVNUSU9OIHwgVF9IQVNIIHwgVF9OVUwpCi0KLXZvaWQgYXBfdXRpbF91cmlfaW5pdCh2b2lkKQotewotICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KLX0KLQotLyogcGFyc2VfdXJpX2NvbXBvbmVudHMoKToKLSAqIFBhcnNlIGEgZ2l2ZW4gVVJJLCBmaWxsIGluIGFsbCBzdXBwbGllZCBmaWVsZHMgb2YgYSB1cmlfY29tcG9uZW50cwotICogc3RydWN0dXJlLiBUaGlzIGVsaW1pbmF0ZXMgdGhlIG5lY2Vzc2l0eSBvZiBleHRyYWN0aW5nIGhvc3QsIHBvcnQsCi0gKiBwYXRoLCBxdWVyeSBpbmZvIHJlcGVhdGVkbHkgaW4gdGhlIG1vZHVsZXMuCi0gKiBTaWRlIGVmZmVjdHM6Ci0gKiAgLSBmaWxscyBpbiBmaWVsZHMgb2YgdXJpX2NvbXBvbmVudHMgKnVwdHIKLSAqICAtIG5vbmUgb24gYW55IG9mIHRoZSByLT4qIGZpZWxkcwotICovCi1BUElfRVhQT1JUKGludCkgYXBfcGFyc2VfdXJpX2NvbXBvbmVudHMoYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyICp1cmksIHVyaV9jb21wb25lbnRzICp1cHRyKQotewotICAgIGNvbnN0IGNoYXIgKnM7Ci0gICAgY29uc3QgY2hhciAqczE7Ci0gICAgY29uc3QgY2hhciAqaG9zdGluZm87Ci0gICAgY2hhciAqZW5kc3RyOwotICAgIGludCBwb3J0OwotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgc3RydWN0dXJlLiBwYXJzZV91cmkoKSBhbmQgcGFyc2VfdXJpX2NvbXBvbmVudHMoKQotICAgICAqIGNhbiBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgcGVyIHJlcXVlc3QuCi0gICAgICovCi0gICAgbWVtc2V0ICh1cHRyLCAnXDAnLCBzaXplb2YoKnVwdHIpKTsKLSAgICB1cHRyLT5pc19pbml0aWFsaXplZCA9IDE7Ci0KLSAgICAvKiBXZSBhc3N1bWUgdGhlIHByb2Nlc3NvciBoYXMgYSBicmFuY2ggcHJlZGljdG9yIGxpa2UgbW9zdCAtLQotICAgICAqIGl0IGFzc3VtZXMgZm9yd2FyZCBicmFuY2hlcyBhcmUgdW50YWtlbiBhbmQgYmFja3dhcmRzIGFyZSB0YWtlbi4gIFRoYXQncwotICAgICAqIHRoZSByZWFzb24gZm9yIHRoZSBnb3Rvcy4gIC1kamcKLSAgICAgKi8KLSAgICBpZiAodXJpWzBdID09ICcvJykgewotZGVhbF93aXRoX3BhdGg6Ci0JLyogd2UgZXhwZWN0IHVyaSB0byBwb2ludCB0byBmaXJzdCBjaGFyYWN0ZXIgb2YgcGF0aCAuLi4gcmVtZW1iZXIKLQkgKiB0aGF0IHRoZSBwYXRoIGNvdWxkIGJlIGVtcHR5IC0tIGh0dHA6Ly9mb29iYXI/cXVlcnkgZm9yIGV4YW1wbGUKLQkgKi8KLQlzID0gdXJpOwotCXdoaWxlICgodXJpX2RlbGltc1sqKHVuc2lnbmVkIGNoYXIgKilzXSAmIE5PVEVORF9QQVRIKSA9PSAwKSB7Ci0JICAgICsrczsKLQl9Ci0JaWYgKHMgIT0gdXJpKSB7Ci0JICAgIHVwdHItPnBhdGggPSBhcF9wc3RybmR1cChwLCB1cmksIHMgLSB1cmkpOwotCX0KLQlpZiAoKnMgPT0gMCkgewotCSAgICByZXR1cm4gSFRUUF9PSzsKLQl9Ci0JaWYgKCpzID09ICc/JykgewotCSAgICArK3M7Ci0JICAgIHMxID0gc3RyY2hyKHMsICcjJyk7Ci0JICAgIGlmIChzMSkgewotCQl1cHRyLT5mcmFnbWVudCA9IGFwX3BzdHJkdXAocCwgczEgKyAxKTsKLQkJdXB0ci0+cXVlcnkgPSBhcF9wc3RybmR1cChwLCBzLCBzMSAtIHMpOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQl1cHRyLT5xdWVyeSA9IGFwX3BzdHJkdXAocCwgcyk7Ci0JICAgIH0KLQkgICAgcmV0dXJuIEhUVFBfT0s7Ci0JfQotCS8qIG90aGVyd2lzZSBpdCdzIGEgZnJhZ21lbnQgKi8KLQl1cHRyLT5mcmFnbWVudCA9IGFwX3BzdHJkdXAocCwgcyArIDEpOwotCXJldHVybiBIVFRQX09LOwotICAgIH0KLQotICAgIC8qIGZpbmQgdGhlIHNjaGVtZTogKi8KLSAgICBzID0gdXJpOwotICAgIHdoaWxlICgodXJpX2RlbGltc1sqKHVuc2lnbmVkIGNoYXIgKilzXSAmIE5PVEVORF9TQ0hFTUUpID09IDApIHsKLQkrK3M7Ci0gICAgfQotICAgIC8qIHNjaGVtZSBtdXN0IGJlIG5vbi1lbXB0eSBhbmQgZm9sbG93ZWQgYnkgOi8vICovCi0gICAgaWYgKHMgPT0gdXJpIHx8IHNbMF0gIT0gJzonIHx8IHNbMV0gIT0gJy8nIHx8IHNbMl0gIT0gJy8nKSB7Ci0JZ290byBkZWFsX3dpdGhfcGF0aDsJLyogYmFja3dhcmRzIHByZWRpY3RlZCB0YWtlbiEgKi8KLSAgICB9Ci0KLSAgICB1cHRyLT5zY2hlbWUgPSBhcF9wc3RybmR1cChwLCB1cmksIHMgLSB1cmkpOwotICAgIHMgKz0gMzsKLSAgICBob3N0aW5mbyA9IHM7Ci0gICAgd2hpbGUgKCh1cmlfZGVsaW1zWyoodW5zaWduZWQgY2hhciAqKXNdICYgTk9URU5EX0hPU1RJTkZPKSA9PSAwKSB7Ci0JKytzOwotICAgIH0KLSAgICB1cmkgPSBzOwkvKiB3aGF0ZXZlciBmb2xsb3dzIGhvc3RpbmZvIGlzIHN0YXJ0IG9mIHVyaSAqLwotICAgIHVwdHItPmhvc3RpbmZvID0gYXBfcHN0cm5kdXAocCwgaG9zdGluZm8sIHVyaSAtIGhvc3RpbmZvKTsKLQotICAgIC8qIElmIHRoZXJlJ3MgYSB1c2VybmFtZTpwYXNzd29yZEBob3N0OnBvcnQsIHRoZSBAIHdlIHdhbnQgaXMgdGhlIGxhc3QgQC4uLgotICAgICAqIHRvbyBiYWQgdGhlcmUncyBubyBtZW1yY2hyKCkuLi4gRm9yIHRoZSBDIHB1cmlzdHMsIG5vdGUgdGhhdCBob3N0aW5mbwotICAgICAqIGlzIGRlZmluYXRlbHkgbm90IHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIG9yaWdpbmFsIHVyaSBzbyB0aGVyZWZvcmUKLSAgICAgKiAmaG9zdGluZm9bLTFdIDwgJmhvc3RpbmZvWzBdIC4uLiBhbmQgdGhpcyBsb29wIGlzIHZhbGlkIEMuCi0gICAgICovCi0gICAgZG8gewotCS0tczsKLSAgICB9IHdoaWxlIChzID49IGhvc3RpbmZvICYmICpzICE9ICdAJyk7Ci0gICAgaWYgKHMgPCBob3N0aW5mbykgewotCS8qIGFnYWluIHdlIHdhbnQgdGhlIGNvbW1vbiBjYXNlIHRvIGJlIGZhbGwgdGhyb3VnaCAqLwotZGVhbF93aXRoX2hvc3Q6Ci0JLyogV2UgZXhwZWN0IGhvc3RpbmZvIHRvIHBvaW50IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YKLQkgKiB0aGUgaG9zdG5hbWUuICBJZiB0aGVyZSdzIGEgcG9ydCBpdCBpcyB0aGUgZmlyc3QgY29sb24uCi0JICovCi0JcyA9IG1lbWNocihob3N0aW5mbywgJzonLCB1cmkgLSBob3N0aW5mbyk7Ci0JaWYgKHMgPT0gTlVMTCkgewotCSAgICAvKiB3ZSBleHBlY3QgdGhlIGNvbW1vbiBjYXNlIHRvIGhhdmUgbm8gcG9ydCAqLwotCSAgICB1cHRyLT5ob3N0bmFtZSA9IGFwX3BzdHJuZHVwKHAsIGhvc3RpbmZvLCB1cmkgLSBob3N0aW5mbyk7Ci0JICAgIGdvdG8gZGVhbF93aXRoX3BhdGg7Ci0JfQotCXVwdHItPmhvc3RuYW1lID0gYXBfcHN0cm5kdXAocCwgaG9zdGluZm8sIHMgLSBob3N0aW5mbyk7Ci0JKytzOwotCXVwdHItPnBvcnRfc3RyID0gYXBfcHN0cm5kdXAocCwgcywgdXJpIC0gcyk7Ci0JaWYgKHVyaSAhPSBzKSB7Ci0JICAgIHBvcnQgPSBzdHJ0b2wodXB0ci0+cG9ydF9zdHIsICZlbmRzdHIsIDEwKTsKLQkgICAgdXB0ci0+cG9ydCA9IHBvcnQ7Ci0JICAgIGlmICgqZW5kc3RyID09ICdcMCcpIHsKLQkJZ290byBkZWFsX3dpdGhfcGF0aDsKLQkgICAgfQotCSAgICAvKiBJbnZhbGlkIGNoYXJhY3RlcnMgYWZ0ZXIgJzonIGZvdW5kICovCi0JICAgIHJldHVybiBIVFRQX0JBRF9SRVFVRVNUOwotCX0KLQl1cHRyLT5wb3J0ID0gYXBfZGVmYXVsdF9wb3J0X2Zvcl9zY2hlbWUodXB0ci0+c2NoZW1lKTsKLQlnb3RvIGRlYWxfd2l0aF9wYXRoOwotICAgIH0KLQotICAgIC8qIGZpcnN0IGNvbG9uIGRlbGltaXRzIHVzZXJuYW1lOnBhc3N3b3JkICovCi0gICAgczEgPSBtZW1jaHIoaG9zdGluZm8sICc6JywgcyAtIGhvc3RpbmZvKTsKLSAgICBpZiAoczEpIHsKLQl1cHRyLT51c2VyID0gYXBfcHN0cm5kdXAocCwgaG9zdGluZm8sIHMxIC0gaG9zdGluZm8pOwotCSsrczE7Ci0JdXB0ci0+cGFzc3dvcmQgPSBhcF9wc3RybmR1cChwLCBzMSwgcyAtIHMxKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JdXB0ci0+dXNlciA9IGFwX3BzdHJuZHVwKHAsIGhvc3RpbmZvLCBzIC0gaG9zdGluZm8pOwotICAgIH0KLSAgICBob3N0aW5mbyA9IHMgKyAxOwotICAgIGdvdG8gZGVhbF93aXRoX2hvc3Q7Ci19Ci0KLS8qIFNwZWNpYWwgY2FzZSBmb3IgQ09OTkVDVCBwYXJzaW5nOiBpdCBjb21lcyB3aXRoIHRoZSBob3N0aW5mbyBwYXJ0IG9ubHkgKi8KLS8qIFNlZSB0aGUgSU5URVJORVQtRFJBRlQgZG9jdW1lbnQgIlR1bm5lbGluZyBTU0wgVGhyb3VnaCBhIFdXVyBQcm94eSIKLSAqIGN1cnJlbnRseSBhdCBodHRwOi8vd3d3Lm1jb20uY29tL25ld3NyZWYvc3RkL3R1bm5lbGluZ19zc2wuaHRtbAotICogZm9yIHRoZSBmb3JtYXQgb2YgdGhlICJDT05ORUNUIGhvc3Q6cG9ydCBIVFRQLzEuMCIgcmVxdWVzdAotICovCi1BUElfRVhQT1JUKGludCkgYXBfcGFyc2VfaG9zdGluZm9fY29tcG9uZW50cyhhcF9jb250ZXh0X3QgKnAsIGNvbnN0IGNoYXIgKmhvc3RpbmZvLCB1cmlfY29tcG9uZW50cyAqdXB0cikKLXsKLSAgICBjb25zdCBjaGFyICpzOwotICAgIGNoYXIgKmVuZHN0cjsKLQotICAgIC8qIEluaXRpYWxpemUgdGhlIHN0cnVjdHVyZS4gcGFyc2VfdXJpKCkgYW5kIHBhcnNlX3VyaV9jb21wb25lbnRzKCkKLSAgICAgKiBjYW4gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIHBlciByZXF1ZXN0LgotICAgICAqLwotICAgIG1lbXNldCAodXB0ciwgJ1wwJywgc2l6ZW9mKCp1cHRyKSk7Ci0gICAgdXB0ci0+aXNfaW5pdGlhbGl6ZWQgPSAxOwotICAgIHVwdHItPmhvc3RpbmZvID0gYXBfcHN0cmR1cChwLCBob3N0aW5mbyk7Ci0KLSAgICAvKiBXZSBleHBlY3QgaG9zdGluZm8gdG8gcG9pbnQgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZgotICAgICAqIHRoZSBob3N0bmFtZS4gIFRoZXJlIG11c3QgYmUgYSBwb3J0LCBzZXBhcmF0ZWQgYnkgYSBjb2xvbgotICAgICAqLwotICAgIHMgPSBzdHJjaHIoaG9zdGluZm8sICc6Jyk7Ci0gICAgaWYgKHMgPT0gTlVMTCkgewotCXJldHVybiBIVFRQX0JBRF9SRVFVRVNUOwotICAgIH0KLSAgICB1cHRyLT5ob3N0bmFtZSA9IGFwX3BzdHJuZHVwKHAsIGhvc3RpbmZvLCBzIC0gaG9zdGluZm8pOwotICAgICsrczsKLSAgICB1cHRyLT5wb3J0X3N0ciA9IGFwX3BzdHJkdXAocCwgcyk7Ci0gICAgaWYgKCpzICE9ICdcMCcpIHsKLQl1cHRyLT5wb3J0ID0gc3RydG9sKHVwdHItPnBvcnRfc3RyLCAmZW5kc3RyLCAxMCk7Ci0JaWYgKCplbmRzdHIgPT0gJ1wwJykgewotCSAgICByZXR1cm4gSFRUUF9PSzsKLQl9Ci0JLyogSW52YWxpZCBjaGFyYWN0ZXJzIGFmdGVyICc6JyBmb3VuZCAqLwotICAgIH0KLSAgICByZXR1cm4gSFRUUF9CQURfUkVRVUVTVDsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmVyL3Zob3N0LmMgYi9zZXJ2ZXIvdmhvc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I4NTc0Yi4uMDAwMDAwMAotLS0gYS9zZXJ2ZXIvdmhvc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDk1MSArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIDQuIFRoZSBuYW1lcyAiQXBhY2hlIFNlcnZlciIgYW5kICJBcGFjaGUgR3JvdXAiIG11c3Qgbm90IGJlIHVzZWQgdG8KLSAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0gKiAgICBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0gKgotICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotICogICAgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0gKiAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSAqIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotICogU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gKgotICovCi0KLS8qCi0gKiBodHRwX3Zob3N0LmM6IGZ1bmN0aW9ucyBwZXJ0YWluaW5nIHRvIHZpcnR1YWwgaG9zdCBhZGRyZXNzZXMKLSAqCShjb25maWd1cmF0aW9uIGFuZCBydW4tdGltZSkKLSAqLwotCi0jZGVmaW5lIENPUkVfUFJJVkFURQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX2xvZy5oIgotI2luY2x1ZGUgImh0dHBfdmhvc3QuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiaHR0cF9jb3JlLmgiCi0KLS8qCi0gKiBBZnRlciBhbGwgdGhlIGRlZmluaXRpb25zIHRoZXJlJ3MgYW4gZXhwbGFuYXRpb24gb2YgaG93IGl0J3MgYWxsIHB1dAotICogdG9nZXRoZXIuCi0gKi8KLQotLyogbWV0YS1saXN0IG9mIG5hbWUtdmhvc3RzLiAgRWFjaCBzZXJ2ZXJfcmVjIGNhbiBiZSBpbiBwb3NzaWJseSBtdWx0aXBsZQotICogbGlzdHMgb2YgbmFtZS12aG9zdHMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IG5hbWVfY2hhaW4gbmFtZV9jaGFpbjsKLXN0cnVjdCBuYW1lX2NoYWluIHsKLSAgICBuYW1lX2NoYWluICpuZXh0OwotICAgIHNlcnZlcl9hZGRyX3JlYyAqc2FyOwkvKiB0aGUgcmVjb3JkIGNhdXNpbmcgaXQgdG8gYmUgaW4KLQkJCQkgKiB0aGlzIGNoYWluIChuZWVkZWQgZm9yIHBvcnQgY29tcGFyaXNvbnMpICovCi0gICAgc2VydmVyX3JlYyAqc2VydmVyOwkJLyogdGhlIHNlcnZlciB0byB1c2Ugb24gYSBtYXRjaCAqLwotfTsKLQotLyogbWV0YS1saXN0IG9mIGlwIGFkZHJlc3Nlcy4gIEVhY2ggc2VydmVyX3JlYyBjYW4gYmUgaW4gcG9zc2libHkgbXVsdGlwbGUKLSAqIGhhc2ggY2hhaW5zIHNpbmNlIGl0IGNhbiBoYXZlIG11bHRpcGxlIGlwcy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgaXBhZGRyX2NoYWluIGlwYWRkcl9jaGFpbjsKLXN0cnVjdCBpcGFkZHJfY2hhaW4gewotICAgIGlwYWRkcl9jaGFpbiAqbmV4dDsKLSAgICBzZXJ2ZXJfYWRkcl9yZWMgKnNhcjsJLyogdGhlIHJlY29yZCBjYXVzaW5nIGl0IHRvIGJlIGluCi0JCQkJICogdGhpcyBjaGFpbiAobmVlZCBmb3IgYm90aCBpcCBhZGRyIGFuZCBwb3J0Ci0JCQkJICogY29tcGFyaXNvbnMpICovCi0gICAgc2VydmVyX3JlYyAqc2VydmVyOwkJLyogdGhlIHNlcnZlciB0byB1c2UgaWYgdGhpcyBtYXRjaGVzICovCi0gICAgbmFtZV9jaGFpbiAqbmFtZXM7CQkvKiBpZiBub24tTlVMTCB0aGVuIGEgbGlzdCBvZiBuYW1lLXZob3N0cwotICAgIAkJCQkgKiBzaGFyaW5nIHRoaXMgYWRkcmVzcyAqLwotfTsKLQotLyogVGhpcyBkZWZpbmVzIHRoZSBzaXplIG9mIHRoZSBoYXNoIGFwX3RhYmxlX3QgdXNlZCBmb3IgaGFzaGluZyBpcCBhZGRyZXNzZXMKLSAqIG9mIHZpcnR1YWwgaG9zdHMuICBJdCBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvLgotICovCi0jaWZuZGVmIElQSEFTSF9UQUJMRV9TSVpFCi0jZGVmaW5lIElQSEFTSF9UQUJMRV9TSVpFIDI1NgotI2VuZGlmCi0KLS8qIEEgKG4pIGJ1Y2tldCBoYXNoIHRhYmxlLCBlYWNoIGVudHJ5IGhhcyBhIHBvaW50ZXIgdG8gYSBzZXJ2ZXIgcmVjIGFuZAotICogYSBwb2ludGVyIHRvIHRoZSBvdGhlciBlbnRyaWVzIGluIHRoYXQgYnVja2V0LiAgRWFjaCBpbmRpdmlkdWFsIGFkZHJlc3MsCi0gKiBldmVuIGZvciB2aXJ0dWFsaG9zdHMgd2l0aCBtdWx0aXBsZSBhZGRyZXNzZXMsIGhhcyBhbiBlbnRyeSBpbiB0aGlzIGhhc2gKLSAqIHRhYmxlLiAgVGhlcmUgYXJlIGV4dHJhIGJ1Y2tldHMgZm9yIF9kZWZhdWx0XywgYW5kIG5hbWUtdmhvc3QgZW50cmllcy4KLSAqCi0gKiBOb3RlIHRoYXQgYWZ0ZXIgY29uZmlnIHRpbWUgdGhpcyBpcyBjb25zdGFudCwgc28gaXQgaXMgdGhyZWFkLXNhZmUuCi0gKi8KLXN0YXRpYyBpcGFkZHJfY2hhaW4gKmlwaGFzaF90YWJsZVtJUEhBU0hfVEFCTEVfU0laRV07Ci0KLS8qIGR1bXAgb3V0IHN0YXRpc3RpY3MgYWJvdXQgdGhlIGhhc2ggZnVuY3Rpb24gKi8KLS8qICNkZWZpbmUgSVBIQVNIX1NUQVRJU1RJQ1MgKi8KLQotLyogbGlzdCBvZiB0aGUgX2RlZmF1bHRfIHNlcnZlcnMgKi8KLXN0YXRpYyBpcGFkZHJfY2hhaW4gKmRlZmF1bHRfbGlzdDsKLQotLyogbGlzdCBvZiB0aGUgTmFtZVZpcnR1YWxIb3N0IGFkZHJlc3NlcyAqLwotc3RhdGljIHNlcnZlcl9hZGRyX3JlYyAqbmFtZV92aG9zdF9saXN0Owotc3RhdGljIHNlcnZlcl9hZGRyX3JlYyAqKm5hbWVfdmhvc3RfbGlzdF90YWlsOwotCi0vKgotICogSG93IGl0J3MgdXNlZDoKLSAqCi0gKiBUaGUgaXAgYWRkcmVzcyBkZXRlcm1pbmVzIHdoaWNoIGNoYWluIGluIGlwaGFzaF90YWJsZSBpcyBpbnRlcmVzdGluZywgdGhlbgotICogYSBjb21wYXJpc29uIGlzIGRvbmUgZG93biB0aGF0IGNoYWluIHRvIGZpbmQgdGhlIGZpcnN0IGlwYWRkcl9jaGFpbiB3aG9zZQotICogc2FyIG1hdGNoZXMgdGhlIGFkZHJlc3M6cG9ydCBwYWlyLgotICoKLSAqIElmIHRoYXQgaXBhZGRyX2NoYWluIGhhcyBuYW1lcyA9PSBOVUxMIHRoZW4geW91J3JlIGRvbmUsIGl0J3MgYW4gaXAtdmhvc3QuCi0gKgotICogT3RoZXJ3aXNlIGl0J3MgYSBuYW1lLXZob3N0IGxpc3QsIGFuZCB0aGUgZGVmYXVsdCBpcyB0aGUgc2VydmVyIGluIHRoZQotICogaXBhZGRyX2NoYWluIHJlY29yZC4gIFdlIHR1Y2sgYXdheSB0aGUgaXBhZGRyX2NoYWluIHJlY29yZCBpbiB0aGUKLSAqIGNvbm5fcmVjIGZpZWxkIHZob3N0X2xvb2t1cF9kYXRhLiAgTGF0ZXIgb24gYWZ0ZXIgdGhlIGhlYWRlcnMgd2UgZ2V0IGEKLSAqIHNlY29uZCBjaGFuY2UsIGFuZCB3ZSB1c2UgdGhlIG5hbWVfY2hhaW4gdG8gZmlndXJlIG91dCB3aGF0IG5hbWUtdmhvc3QKLSAqIG1hdGNoZXMgdGhlIGhlYWRlcnMuCi0gKgotICogSWYgdGhlcmUgd2FzIG5vIGlwIGFkZHJlc3MgbWF0Y2ggaW4gdGhlIGlwaGFzaF90YWJsZSB0aGVuIGRvIGEgbG9va3VwCi0gKiBpbiB0aGUgZGVmYXVsdF9saXN0LgotICoKLSAqIEhvdyBpdCdzIHB1dCB0b2dldGhlciAuLi4gd2VsbCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gZmlndXJlIHRoYXQgb3V0Ci0gKiBmcm9tIGhvdyBpdCdzIHVzZWQuICBPciBzb21ldGhpbmcgbGlrZSB0aGF0LgotICovCi0KLQotLyogY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbmZpZyAqLwotdm9pZCBhcF9pbml0X3Zob3N0X2NvbmZpZyhhcF9jb250ZXh0X3QgKnApCi17Ci0gICAgbWVtc2V0KGlwaGFzaF90YWJsZSwgMCwgc2l6ZW9mKGlwaGFzaF90YWJsZSkpOwotICAgIGRlZmF1bHRfbGlzdCA9IE5VTEw7Ci0gICAgbmFtZV92aG9zdF9saXN0ID0gTlVMTDsKLSAgICBuYW1lX3Zob3N0X2xpc3RfdGFpbCA9ICZuYW1lX3Zob3N0X2xpc3Q7Ci19Ci0KLQotLyoKLSAqIFBhcnNlcyBhIGhvc3Qgb2YgdGhlIGZvcm0gPGFkZHJlc3M+Wzpwb3J0XQotICogcGFkZHIgaXMgdXNlZCB0byBjcmVhdGUgYSBsaXN0IGluIHRoZSBvcmRlciBvZiBpbnB1dAotICogKipwYWRkciBpcyB0aGUgLT5uZXh0IHBvaW50ZXIgb2YgdGhlIGxhc3QgZW50cnkgKG9yIHMtPmFkZHJzKQotICogKnBhZGRyIGlzIHRoZSB2YXJpYWJsZSB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgKipwYWRkciBiZXR3ZWVuIGNhbGxzCi0gKiBwb3J0IGlzIHRoZSBkZWZhdWx0IHBvcnQgdG8gYXNzdW1lCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpnZXRfYWRkcmVzc2VzKGFwX2NvbnRleHRfdCAqcCwgY2hhciAqdywgc2VydmVyX2FkZHJfcmVjICoqKnBhZGRyLAotCQkJICAgIHVuc2lnbmVkIHBvcnQpCi17Ci0gICAgc3RydWN0IGhvc3RlbnQgKmhlcDsKLSAgICB1bnNpZ25lZCBsb25nIG15X2FkZHI7Ci0gICAgc2VydmVyX2FkZHJfcmVjICpzYXI7Ci0gICAgY2hhciAqdDsKLSAgICBpbnQgaSwgaXNfYW5faXBfYWRkcjsKLQotICAgIGlmICgqdyA9PSAwKQotCXJldHVybiBOVUxMOwotCi0gICAgdCA9IHN0cmNocih3LCAnOicpOwotICAgIGlmICh0KSB7Ci0JaWYgKHN0cmNtcCh0ICsgMSwgIioiKSA9PSAwKSB7Ci0JICAgIHBvcnQgPSAwOwotCX0KLQllbHNlIGlmICgoaSA9IGF0b2kodCArIDEpKSkgewotCSAgICBwb3J0ID0gaTsKLQl9Ci0JZWxzZSB7Ci0JICAgIHJldHVybiAiOnBvcnQgbXVzdCBiZSBudW1lcmljIjsKLQl9Ci0JKnQgPSAwOwotICAgIH0KLQotICAgIGlzX2FuX2lwX2FkZHIgPSAwOwotICAgIGlmIChzdHJjbXAodywgIioiKSA9PSAwKSB7Ci0JbXlfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOwotCWlzX2FuX2lwX2FkZHIgPSAxOwotICAgIH0KLSAgICBlbHNlIGlmIChzdHJjYXNlY21wKHcsICJfZGVmYXVsdF8iKSA9PSAwCi0JICAgICB8fCBzdHJjbXAodywgIjI1NS4yNTUuMjU1LjI1NSIpID09IDApIHsKLQlteV9hZGRyID0gREVGQVVMVF9WSE9TVF9BRERSOwotCWlzX2FuX2lwX2FkZHIgPSAxOwotICAgIH0KLSAgICBlbHNlIGlmICgobXlfYWRkciA9IGFwX2luZXRfYWRkcih3KSkgIT0gSU5BRERSX05PTkUpIHsKLQlpc19hbl9pcF9hZGRyID0gMTsKLSAgICB9Ci0gICAgaWYgKGlzX2FuX2lwX2FkZHIpIHsKLQlzYXIgPSBhcF9wY2FsbG9jKHAsIHNpemVvZihzZXJ2ZXJfYWRkcl9yZWMpKTsKLQkqKnBhZGRyID0gc2FyOwotCSpwYWRkciA9ICZzYXItPm5leHQ7Ci0Jc2FyLT5ob3N0X2FkZHIuc19hZGRyID0gbXlfYWRkcjsKLQlzYXItPmhvc3RfcG9ydCA9IHBvcnQ7Ci0Jc2FyLT52aXJ0aG9zdCA9IGFwX3BzdHJkdXAocCwgdyk7Ci0JaWYgKHQgIT0gTlVMTCkKLQkgICAgKnQgPSAnOic7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaGVwID0gZ2V0aG9zdGJ5bmFtZSh3KTsKLQotICAgIGlmICgoIWhlcCkgfHwgKGhlcC0+aF9hZGRydHlwZSAhPSBBRl9JTkVUIHx8ICFoZXAtPmhfYWRkcl9saXN0WzBdKSkgewotCWFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX0VSUiwgMCwgTlVMTCwKLQkgICAgIkNhbm5vdCByZXNvbHZlIGhvc3QgbmFtZSAlcyAtLS0gaWdub3JpbmchIiwgdyk7Ci0JaWYgKHQgIT0gTlVMTCkKLQkgICAgKnQgPSAnOic7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaGVwLT5oX2FkZHJfbGlzdFtpXTsgKytpKSB7Ci0Jc2FyID0gYXBfcGNhbGxvYyhwLCBzaXplb2Yoc2VydmVyX2FkZHJfcmVjKSk7Ci0JKipwYWRkciA9IHNhcjsKLQkqcGFkZHIgPSAmc2FyLT5uZXh0OwotCXNhci0+aG9zdF9hZGRyID0gKihzdHJ1Y3QgaW5fYWRkciAqKSBoZXAtPmhfYWRkcl9saXN0W2ldOwotCXNhci0+aG9zdF9wb3J0ID0gcG9ydDsKLQlzYXItPnZpcnRob3N0ID0gYXBfcHN0cmR1cChwLCB3KTsKLSAgICB9Ci0KLSAgICBpZiAodCAhPSBOVUxMKQotCSp0ID0gJzonOwotICAgIHJldHVybiBOVUxMOwotfQotCi0KLS8qIHBhcnNlIHRoZSA8VmlydHVhbEhvc3Q+IGFkZHJlc3NlcyAqLwotY29uc3QgY2hhciAqYXBfcGFyc2Vfdmhvc3RfYWRkcnMoYXBfY29udGV4dF90ICpwLCBjb25zdCBjaGFyICpob3N0bmFtZSwgc2VydmVyX3JlYyAqcykKLXsKLSAgICBzZXJ2ZXJfYWRkcl9yZWMgKiphZGRyczsKLSAgICBjb25zdCBjaGFyICplcnI7Ci0KLSAgICAvKiBzdGFydCB0aGUgbGlzdCBvZiBhZGRyZXNlcyAqLwotICAgIGFkZHJzID0gJnMtPmFkZHJzOwotICAgIHdoaWxlIChob3N0bmFtZVswXSkgewotCWVyciA9IGdldF9hZGRyZXNzZXMocCwgYXBfZ2V0d29yZF9jb25mKHAsICZob3N0bmFtZSksICZhZGRycywgcy0+cG9ydCk7Ci0JaWYgKGVycikgewotCSAgICAqYWRkcnMgPSBOVUxMOwotCSAgICByZXR1cm4gZXJyOwotCX0KLSAgICB9Ci0gICAgLyogdGVybWluYXRlIHRoZSBsaXN0ICovCi0gICAgKmFkZHJzID0gTlVMTDsKLSAgICBpZiAocy0+YWRkcnMpIHsKLQlpZiAocy0+YWRkcnMtPmhvc3RfcG9ydCkgewotCSAgICAvKiBvdmVycmlkZSB0aGUgZGVmYXVsdCBwb3J0IHdoaWNoIGlzIGluaGVyaXRlZCBmcm9tIG1haW5fc2VydmVyICovCi0JICAgIHMtPnBvcnQgPSBzLT5hZGRycy0+aG9zdF9wb3J0OwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotY29uc3QgY2hhciAqYXBfc2V0X25hbWVfdmlydHVhbF9ob3N0IChjbWRfcGFybXMgKmNtZCwgdm9pZCAqZHVtbXksIGNoYXIgKmFyZykKLXsKLSAgICAvKiB1c2Ugd2hhdGV2ZXIgcG9ydCB0aGUgbWFpbiBzZXJ2ZXIgaGFzIGF0IHRoaXMgcG9pbnQgKi8KLSAgICByZXR1cm4gZ2V0X2FkZHJlc3NlcyhjbWQtPnBvb2wsIGFyZywgJm5hbWVfdmhvc3RfbGlzdF90YWlsLAotCQkJICAgIGNtZC0+c2VydmVyLT5wb3J0KTsKLX0KLQotCi0vKiBoYXNoIGFwX3RhYmxlX3Qgc3RhdGlzdGljcywga2VlcCB0aGlzIGluIGhlcmUgZm9yIHRoZSBiZXRhIHBlcmlvZCBzbwotICogd2UgY2FuIGZpbmQgb3V0IGlmIHRoZSBoYXNoIGZ1bmN0aW9uIGlzIG9rCi0gKi8KLSNpZmRlZiBJUEhBU0hfU1RBVElTVElDUwotc3RhdGljIGludCBpcGhhc2hfY29tcGFyZShjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQotewotICAgIHJldHVybiAoKihjb25zdCBpbnQgKikgYiAtICooY29uc3QgaW50ICopIGEpOwotfQotCi0KLXN0YXRpYyB2b2lkIGR1bXBfaXBoYXNoX3N0YXRpc3RpY3Moc2VydmVyX3JlYyAqbWFpbl9zKQotewotICAgIHVuc2lnbmVkIGNvdW50W0lQSEFTSF9UQUJMRV9TSVpFXTsKLSAgICBpbnQgaTsKLSAgICBpcGFkZHJfY2hhaW4gKnNyYzsKLSAgICB1bnNpZ25lZCB0b3RhbDsKLSAgICBjaGFyIGJ1ZltIVUdFX1NUUklOR19MRU5dOwotICAgIGNoYXIgKnA7Ci0KLSAgICB0b3RhbCA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IElQSEFTSF9UQUJMRV9TSVpFOyArK2kpIHsKLQljb3VudFtpXSA9IDA7Ci0JZm9yIChzcmMgPSBpcGhhc2hfdGFibGVbaV07IHNyYzsgc3JjID0gc3JjLT5uZXh0KSB7Ci0JICAgICsrY291bnRbaV07Ci0JICAgIGlmIChpIDwgSVBIQVNIX1RBQkxFX1NJWkUpIHsKLQkJLyogZG9uJ3QgY291bnQgdGhlIHNsb3AgYnVja2V0cyBpbiB0aGUgdG90YWwgKi8KLQkJKyt0b3RhbDsKLQkgICAgfQotCX0KLSAgICB9Ci0gICAgcXNvcnQoY291bnQsIElQSEFTSF9UQUJMRV9TSVpFLCBzaXplb2YoY291bnRbMF0pLCBpcGhhc2hfY29tcGFyZSk7Ci0gICAgcCA9IGJ1ZiArIGFwX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCSAgICAiaXBoYXNoOiB0b3RhbCBoYXNoZWQgPSAldSwgYXZnIGNoYWluID0gJXUsICIKLQkJICAgICJjaGFpbiBsZW5ndGhzIChjb3VudCB4IGxlbik6IiwKLQkJICAgIHRvdGFsLCB0b3RhbCAvIElQSEFTSF9UQUJMRV9TSVpFKTsKLSAgICB0b3RhbCA9IDE7Ci0gICAgZm9yIChpID0gMTsgaSA8IElQSEFTSF9UQUJMRV9TSVpFOyArK2kpIHsKLQlpZiAoY291bnRbaSAtIDFdICE9IGNvdW50W2ldKSB7Ci0JICAgIHAgKz0gYXBfc25wcmludGYocCwgc2l6ZW9mKGJ1ZikgLSAocCAtIGJ1ZiksICIgJXV4JXUiLAotCQkJICAgICB0b3RhbCwgY291bnRbaSAtIDFdKTsKLQkgICAgdG90YWwgPSAxOwotCX0KLQllbHNlIHsKLQkgICAgKyt0b3RhbDsKLQl9Ci0gICAgfQotICAgIHAgKz0gYXBfc25wcmludGYocCwgc2l6ZW9mKGJ1ZikgLSAocCAtIGJ1ZiksICIgJXV4JXUiLAotCQkgICAgIHRvdGFsLCBjb3VudFtJUEhBU0hfVEFCTEVfU0laRSAtIDFdKTsKLSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19ERUJVRywgbWFpbl9zLCBidWYpOwotfQotI2VuZGlmCi0KLQotLyogVGhpcyBoYXNoaW5nIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGdldCBnb29kIGRpc3RyaWJ1dGlvbiBpbiB0aGUgY2FzZXMKLSAqIHdoZXJlIHRoZSBzZXJ2ZXIgaXMgaGFuZGxpbmcgZW50aXJlICJuZXR3b3JrcyIgb2Ygc2VydmVycy4gIGkuZS4gYQotICogd2hhY2sgb2YgLzI0cy4gIFRoaXMgaXMgcHJvYmFibHkgdGhlIG1vc3QgY29tbW9uIGNvbmZpZ3VyYXRpb24gZm9yCi0gKiBJU1BzIHdpdGggbGFyZ2UgdmlydHVhbCBzZXJ2ZXJzLgotICoKLSAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgc3ltbWV0cmljIChpLmUuIGNvbGxhcHNlcyBhbGwgNCBvY3RldHMKLSAqIGludG8gb25lKSwgc28gbWFjaGluZSBieXRlIG9yZGVyIChiaWcvbGl0dGxlIGVuZGlhbm5lc3MpIGRvZXMgbm90IG1hdHRlci4KLSAqCi0gKiBIYXNoIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IERhdmlkIEhhbmtpbnMuCi0gKi8KLXN0YXRpYyBhcF9pbmxpbmUgdW5zaWduZWQgaGFzaF9pbmFkZHIodW5zaWduZWQga2V5KQotewotICAgIGtleSBePSAoa2V5ID4+IDE2KTsKLSAgICByZXR1cm4gKChrZXkgPj4gOCkgXiBrZXkpICUgSVBIQVNIX1RBQkxFX1NJWkU7Ci19Ci0KLQotCi1zdGF0aWMgaXBhZGRyX2NoYWluICpuZXdfaXBhZGRyX2NoYWluKGFwX2NvbnRleHRfdCAqcCwKLQkJCQkgICAgc2VydmVyX3JlYyAqcywgc2VydmVyX2FkZHJfcmVjICpzYXIpCi17Ci0gICAgaXBhZGRyX2NoYWluICpuZXc7Ci0KLSAgICBuZXcgPSBhcF9wYWxsb2MocCwgc2l6ZW9mKCpuZXcpKTsKLSAgICBuZXctPm5hbWVzID0gTlVMTDsKLSAgICBuZXctPnNlcnZlciA9IHM7Ci0gICAgbmV3LT5zYXIgPSBzYXI7Ci0gICAgbmV3LT5uZXh0ID0gTlVMTDsKLSAgICByZXR1cm4gbmV3OwotfQotCi0KLXN0YXRpYyBuYW1lX2NoYWluICpuZXdfbmFtZV9jaGFpbihhcF9jb250ZXh0X3QgKnAsIHNlcnZlcl9yZWMgKnMsIHNlcnZlcl9hZGRyX3JlYyAqc2FyKQotewotICAgIG5hbWVfY2hhaW4gKm5ldzsKLQotICAgIG5ldyA9IGFwX3BhbGxvYyhwLCBzaXplb2YoKm5ldykpOwotICAgIG5ldy0+c2VydmVyID0gczsKLSAgICBuZXctPnNhciA9IHNhcjsKLSAgICBuZXctPm5leHQgPSBOVUxMOwotICAgIHJldHVybiBuZXc7Ci19Ci0KLQotc3RhdGljIGFwX2lubGluZSBpcGFkZHJfY2hhaW4gKmZpbmRfaXBhZGRyKHN0cnVjdCBpbl9hZGRyICpzZXJ2ZXJfaXAsCi0gICAgdW5zaWduZWQgcG9ydCkKLXsKLSAgICB1bnNpZ25lZCBidWNrZXQ7Ci0gICAgaXBhZGRyX2NoYWluICp0cmF2OwotICAgIHVuc2lnbmVkIGFkZHI7Ci0KLSAgICAvKiBzY2FuIHRoZSBoYXNoIGFwX3RhYmxlX3QgZm9yIGFuIGV4YWN0IG1hdGNoIGZpcnN0ICovCi0gICAgYWRkciA9IHNlcnZlcl9pcC0+c19hZGRyOwotICAgIGJ1Y2tldCA9IGhhc2hfaW5hZGRyKGFkZHIpOwotICAgIGZvciAodHJhdiA9IGlwaGFzaF90YWJsZVtidWNrZXRdOyB0cmF2OyB0cmF2ID0gdHJhdi0+bmV4dCkgewotCXNlcnZlcl9hZGRyX3JlYyAqc2FyID0gdHJhdi0+c2FyOwotCWlmICgoc2FyLT5ob3N0X2FkZHIuc19hZGRyID09IGFkZHIpCi0JICAgICYmIChzYXItPmhvc3RfcG9ydCA9PSAwIHx8IHNhci0+aG9zdF9wb3J0ID09IHBvcnQKLQkJfHwgcG9ydCA9PSAwKSkgewotCSAgICByZXR1cm4gdHJhdjsKLQl9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi0KLXN0YXRpYyBpcGFkZHJfY2hhaW4gKmZpbmRfZGVmYXVsdF9zZXJ2ZXIodW5zaWduZWQgcG9ydCkKLXsKLSAgICBzZXJ2ZXJfYWRkcl9yZWMgKnNhcjsKLSAgICBpcGFkZHJfY2hhaW4gKnRyYXY7Ci0KLSAgICBmb3IgKHRyYXYgPSBkZWZhdWx0X2xpc3Q7IHRyYXY7IHRyYXYgPSB0cmF2LT5uZXh0KSB7Ci0gICAgICAgIHNhciA9IHRyYXYtPnNhcjsKLSAgICAgICAgaWYgKHNhci0+aG9zdF9wb3J0ID09IDAgfHwgc2FyLT5ob3N0X3BvcnQgPT0gcG9ydCkgewotICAgICAgICAgICAgLyogbWF0Y2ghICovCi0JICAgIHJldHVybiB0cmF2OwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBkdW1wX3Zob3N0X2NvbmZpZyhhcF9maWxlX3QgKmYpCi17Ci0gICAgaW50IGk7Ci0gICAgaXBhZGRyX2NoYWluICppYzsKLSAgICBuYW1lX2NoYWluICpuYzsKLSAgICBjaGFyIGJ1ZltNQVhfU1RSSU5HX0xFTl07Ci0KLSAgICBhcF9mcHJpbnRmKGYsICJWaXJ0dWFsSG9zdCBjb25maWd1cmF0aW9uOlxuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IElQSEFTSF9UQUJMRV9TSVpFOyArK2kpIHsKLQlmb3IgKGljID0gaXBoYXNoX3RhYmxlW2ldOyBpYzsgaWMgPSBpYy0+bmV4dCkgewotCSAgICBpZiAoaWMtPnNhci0+aG9zdF9wb3J0ID09IDApIHsKLQkJYXBfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVwQToqIiwgJmljLT5zYXItPmhvc3RfYWRkcik7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCWFwX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcEE6JXUiLCAmaWMtPnNhci0+aG9zdF9hZGRyLAotCQkgICAgaWMtPnNhci0+aG9zdF9wb3J0KTsKLQkgICAgfQotCSAgICBpZiAoaWMtPm5hbWVzID09IE5VTEwpIHsKLQkJYXBfZnByaW50ZihmLCAiJS0yMnMgJXMgKCVzOiV1KVxuIiwgYnVmLAotCQkgICAgaWMtPnNlcnZlci0+c2VydmVyX2hvc3RuYW1lLCBpYy0+c2VydmVyLT5kZWZuX25hbWUsCi0JCSAgICBpYy0+c2VydmVyLT5kZWZuX2xpbmVfbnVtYmVyKTsKLQkJY29udGludWU7Ci0JICAgIH0KLQkgICAgYXBfZnByaW50ZihmLCAiJS0yMnMgaXMgYSBOYW1lVmlydHVhbEhvc3RcbiIKLQkgICAgICAgICAgICAgICAiJTIycyBkZWZhdWx0IHNlcnZlciAlcyAoJXM6JXUpXG4iLAotCQkgICAgICAgYnVmLCAiIiwgaWMtPnNlcnZlci0+c2VydmVyX2hvc3RuYW1lLAotCQkgICAgICAgaWMtPnNlcnZlci0+ZGVmbl9uYW1lLCBpYy0+c2VydmVyLT5kZWZuX2xpbmVfbnVtYmVyKTsKLQkgICAgZm9yIChuYyA9IGljLT5uYW1lczsgbmM7IG5jID0gbmMtPm5leHQpIHsKLQkJaWYgKG5jLT5zYXItPmhvc3RfcG9ydCkgewotCQkgICAgYXBfZnByaW50ZihmLCAiJTIycyBwb3J0ICV1ICIsICIiLCBuYy0+c2FyLT5ob3N0X3BvcnQpOwotCQl9Ci0JCWVsc2UgewotCQkgICAgYXBfZnByaW50ZihmLCAiJTIycyBwb3J0ICogIiwgIiIpOwotCQl9Ci0JCWFwX2ZwcmludGYoZiwgIm5hbWV2aG9zdCAlcyAoJXM6JXUpXG4iLAotCQkJbmMtPnNlcnZlci0+c2VydmVyX2hvc3RuYW1lLAotCQkJbmMtPnNlcnZlci0+ZGVmbl9uYW1lLAotCQkJbmMtPnNlcnZlci0+ZGVmbl9saW5lX251bWJlcik7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIGlmIChkZWZhdWx0X2xpc3QpIHsKLQlhcF9mcHJpbnRmKGYsICJfZGVmYXVsdF8gc2VydmVyczpcbiIpOwotCWZvciAoaWMgPSBkZWZhdWx0X2xpc3Q7IGljOyBpYyA9IGljLT5uZXh0KSB7Ci0JICAgIGlmIChpYy0+c2FyLT5ob3N0X3BvcnQgPT0gMCkgewotCQlhcF9mcHJpbnRmKGYsICJwb3J0ICogIik7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCWFwX2ZwcmludGYoZiwgInBvcnQgJXUgIiwgaWMtPnNhci0+aG9zdF9wb3J0KTsKLQkgICAgfQotCSAgICBhcF9mcHJpbnRmKGYsICJzZXJ2ZXIgJXMgKCVzOiV1KVxuIiwKLQkJaWMtPnNlcnZlci0+c2VydmVyX2hvc3RuYW1lLCBpYy0+c2VydmVyLT5kZWZuX25hbWUsCi0JCWljLT5zZXJ2ZXItPmRlZm5fbGluZV9udW1iZXIpOwotCX0KLSAgICB9Ci19Ci0KLS8qIGNvbXBpbGUgdGhlIHRhYmxlcyBhbmQgc3VjaCB3ZSBuZWVkIHRvIGRvIHRoZSBydW4tdGltZSB2aG9zdCBsb29rdXBzICovCi12b2lkIGFwX2Zpbmlfdmhvc3RfY29uZmlnKGFwX2NvbnRleHRfdCAqcCwgc2VydmVyX3JlYyAqbWFpbl9zKQotewotICAgIHNlcnZlcl9hZGRyX3JlYyAqc2FyOwotICAgIGludCBoYXNfZGVmYXVsdF92aG9zdF9hZGRyOwotICAgIHNlcnZlcl9yZWMgKnM7Ci0gICAgaW50IGk7Ci0gICAgaXBhZGRyX2NoYWluICoqaXBoYXNoX3RhYmxlX3RhaWxbSVBIQVNIX1RBQkxFX1NJWkVdOwotCi0gICAgLyogdGVybWluYXRlIHRoZSBuYW1lX3Zob3N0IGxpc3QgKi8KLSAgICAqbmFtZV92aG9zdF9saXN0X3RhaWwgPSBOVUxMOwotCi0gICAgLyogTWFpbiBob3N0IGZpcnN0ICovCi0gICAgcyA9IG1haW5fczsKLQotICAgIGlmICghcy0+c2VydmVyX2hvc3RuYW1lKSB7Ci0Jcy0+c2VydmVyX2hvc3RuYW1lID0gYXBfZ2V0X2xvY2FsX2hvc3QocCk7Ci0gICAgfQotCi0gICAgLyogaW5pdGlhbGl6ZSB0aGUgdGFpbHMgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgSVBIQVNIX1RBQkxFX1NJWkU7ICsraSkgewotCWlwaGFzaF90YWJsZV90YWlsW2ldID0gJmlwaGFzaF90YWJsZVtpXTsKLSAgICB9Ci0KLSAgICAvKiBUaGUgZmlyc3QgdGhpbmdzIHRvIGdvIGludG8gdGhlIGhhc2ggYXBfdGFibGVfdCBhcmUgdGhlIE5hbWVWaXJ0dWFsSG9zdHMKLSAgICAgKiBTaW5jZSBuYW1lX3Zob3N0X2xpc3QgaXMgaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCB0aGUgZGlyZWN0aXZlcwotICAgICAqIG9jY3VyZWQgaW4gdGhlIGNvbmZpZyBmaWxlLCB3ZSdsbCBjb3B5IGl0IGluIHRoYXQgb3JkZXIuCi0gICAgICovCi0gICAgZm9yIChzYXIgPSBuYW1lX3Zob3N0X2xpc3Q7IHNhcjsgc2FyID0gc2FyLT5uZXh0KSB7Ci0JdW5zaWduZWQgYnVja2V0ID0gaGFzaF9pbmFkZHIoc2FyLT5ob3N0X2FkZHIuc19hZGRyKTsKLQlpcGFkZHJfY2hhaW4gKm5ldyA9IG5ld19pcGFkZHJfY2hhaW4ocCwgTlVMTCwgc2FyKTsKLQotCSppcGhhc2hfdGFibGVfdGFpbFtidWNrZXRdID0gbmV3OwotCWlwaGFzaF90YWJsZV90YWlsW2J1Y2tldF0gPSAmbmV3LT5uZXh0OwotCi0JLyogTm90aWNlIHRoYXQgd2hhdCB3ZSd2ZSBkb25lIGlzIGluc2VydCBhbiBpcGFkZHJfY2hhaW4gd2l0aAotCSAqIGJvdGggc2VydmVyIGFuZCBuYW1lcyBOVUxMLiAgUmVtZW1iZXIgdGhhdC4KLQkgKi8KLSAgICB9Ci0KLSAgICAvKiBUaGUgbmV4dCB0aGluZ3MgdG8gZ28gaW50byB0aGUgaGFzaCBhcF90YWJsZV90IGFyZSB0aGUgdmlydHVhbCBob3N0cwotICAgICAqIHRoZW1zZWx2ZXMuICBUaGV5J3JlIGxpc3RlZCBvZmYgb2YgbWFpbl9zLT5uZXh0IGluIHRoZSByZXZlcnNlCi0gICAgICogb3JkZXIgdGhleSBvY2N1cmVkIGluIHRoZSBjb25maWcgZmlsZSwgc28gd2UgaW5zZXJ0IHRoZW0gYXQKLSAgICAgKiB0aGUgaXBoYXNoX3RhYmxlX3RhaWwgYnV0IGRvbid0IGFkdmFuY2UgdGhlIHRhaWwuCi0gICAgICovCi0KLSAgICBmb3IgKHMgPSBtYWluX3MtPm5leHQ7IHM7IHMgPSBzLT5uZXh0KSB7Ci0JaGFzX2RlZmF1bHRfdmhvc3RfYWRkciA9IDA7Ci0JZm9yIChzYXIgPSBzLT5hZGRyczsgc2FyOyBzYXIgPSBzYXItPm5leHQpIHsKLQkgICAgaXBhZGRyX2NoYWluICppYzsKLQotCSAgICBpZiAoc2FyLT5ob3N0X2FkZHIuc19hZGRyID09IERFRkFVTFRfVkhPU1RfQUREUgotCQl8fCBzYXItPmhvc3RfYWRkci5zX2FkZHIgPT0gSU5BRERSX0FOWSkgewotCQkvKiBhZGQgaXQgdG8gZGVmYXVsdCBidWNrZXQgZm9yIGVhY2ggYXBwcm9wcmlhdGUgc2FyCi0JCSAqIHNpbmNlIHdlIG5lZWQgdG8gZG8gYSBwb3J0IHRlc3QKLQkJICovCi0JCWlwYWRkcl9jaGFpbiAqb3RoZXI7Ci0KLQkJb3RoZXIgPSBmaW5kX2RlZmF1bHRfc2VydmVyKHNhci0+aG9zdF9wb3J0KTsKLQkJaWYgKG90aGVyICYmIG90aGVyLT5zYXItPmhvc3RfcG9ydCAhPSAwKSB7Ci0JCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLCAwLCBtYWluX3MsCi0JCQkgICAgIl9kZWZhdWx0XyBWaXJ0dWFsSG9zdCBvdmVybGFwIG9uIHBvcnQgJXUsIgotCQkJICAgICIgdGhlIGZpcnN0IGhhcyBwcmVjZWRlbmNlIiwgc2FyLT5ob3N0X3BvcnQpOwotCQl9Ci0JCWhhc19kZWZhdWx0X3Zob3N0X2FkZHIgPSAxOwotCQlpYyA9IG5ld19pcGFkZHJfY2hhaW4ocCwgcywgc2FyKTsKLQkJaWMtPm5leHQgPSBkZWZhdWx0X2xpc3Q7Ci0JCWRlZmF1bHRfbGlzdCA9IGljOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQkvKiBzZWUgaWYgaXQgbWF0Y2hlcyBzb21ldGhpbmcgd2UndmUgYWxyZWFkeSBnb3QgKi8KLQkJaWMgPSBmaW5kX2lwYWRkcigmc2FyLT5ob3N0X2FkZHIsIHNhci0+aG9zdF9wb3J0KTsKLQotCQkvKiB0aGUgZmlyc3QgdGltZSB3ZSBlbmNvdW50ZXIgYSBOYW1lVmlydHVhbEhvc3QgYWRkcmVzcwotCQkgKiBpYy0+c2VydmVyIHdpbGwgYmUgTlVMTCwgb24gc3Vic2VxdWVudCBlbmNvdW50ZXJzCi0JCSAqIGljLT5uYW1lcyB3aWxsIGJlIG5vbi1OVUxMLgotCQkgKi8KLQkJaWYgKGljICYmIChpYy0+bmFtZXMgfHwgaWMtPnNlcnZlciA9PSBOVUxMKSkgewotCQkgICAgbmFtZV9jaGFpbiAqbmMgPSBuZXdfbmFtZV9jaGFpbihwLCBzLCBzYXIpOwotCQkgICAgbmMtPm5leHQgPSBpYy0+bmFtZXM7Ci0JCSAgICBpYy0+bmFtZXMgPSBuYzsKLQkJICAgIGljLT5zZXJ2ZXIgPSBzOwotCQkgICAgaWYgKHNhci0+aG9zdF9wb3J0ICE9IGljLT5zYXItPmhvc3RfcG9ydCkgewotCQkJLyogb25lIG9mIHRoZSB0d28gaXMgYSAqIHBvcnQsIHRoZSBvdGhlciBpc24ndCAqLwotCQkJYXBfbG9nX2Vycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCBtYWluX3MsCi0JCQkJIlZpcnR1YWxIb3N0ICVzOiV1IC0tIG1peGluZyAqICIKLQkJCQkicG9ydHMgYW5kIG5vbi0qIHBvcnRzIHdpdGggIgotCQkJCSJhIE5hbWVWaXJ0dWFsSG9zdCBhZGRyZXNzIGlzIG5vdCBzdXBwb3J0ZWQsIgotCQkJCSIgcHJvY2VlZGluZyB3aXRoIHVuZGVmaW5lZCByZXN1bHRzIiwKLQkJCQlzYXItPnZpcnRob3N0LCBzYXItPmhvc3RfcG9ydCk7Ci0JCSAgICB9Ci0JCX0KLQkJZWxzZSBpZiAoaWMpIHsKLQkJICAgIGFwX2xvZ19lcnJvcihBUExPR19NQVJLLCBBUExPR19OT0VSUk5PfEFQTE9HX1dBUk5JTkcsIDAsIG1haW5fcywKLQkJCSAgICAiVmlydHVhbEhvc3QgJXM6JXUgb3ZlcmxhcHMgd2l0aCAiCi0JCQkgICAgIlZpcnR1YWxIb3N0ICVzOiV1LCB0aGUgZmlyc3QgaGFzIHByZWNlZGVuY2UsICIKLQkJCSAgICAicGVyaGFwcyB5b3UgbmVlZCBhIE5hbWVWaXJ0dWFsSG9zdCBkaXJlY3RpdmUiLAotCQkJICAgIHNhci0+dmlydGhvc3QsIHNhci0+aG9zdF9wb3J0LAotCQkJICAgIGljLT5zYXItPnZpcnRob3N0LCBpYy0+c2FyLT5ob3N0X3BvcnQpOwotCQkgICAgaWMtPnNhciA9IHNhcjsKLQkJICAgIGljLT5zZXJ2ZXIgPSBzOwotCQl9Ci0JCWVsc2UgewotCQkgICAgdW5zaWduZWQgYnVja2V0ID0gaGFzaF9pbmFkZHIoc2FyLT5ob3N0X2FkZHIuc19hZGRyKTsKLQotCQkgICAgaWMgPSBuZXdfaXBhZGRyX2NoYWluKHAsIHMsIHNhcik7Ci0JCSAgICBpYy0+bmV4dCA9ICppcGhhc2hfdGFibGVfdGFpbFtidWNrZXRdOwotCQkgICAgKmlwaGFzaF90YWJsZV90YWlsW2J1Y2tldF0gPSBpYzsKLQkJfQotCSAgICB9Ci0JfQotCi0JLyogT2sgbm93IHdlIHdhbnQgdG8gc2V0IHVwIGEgc2VydmVyX2hvc3RuYW1lIGlmIHRoZSB1c2VyIHdhcwotCSAqIHNpbGx5IGVub3VnaCB0byBmb3JnZXQgb25lLgotCSAqIFhYWDogVGhpcyBpcyBzaWxseSB3ZSBzaG91bGQganVzdCBjcmFzaCBhbmQgYnVybi4KLQkgKi8KLQlpZiAoIXMtPnNlcnZlcl9ob3N0bmFtZSkgewotCSAgICBpZiAoaGFzX2RlZmF1bHRfdmhvc3RfYWRkcikgewotCQlzLT5zZXJ2ZXJfaG9zdG5hbWUgPSBtYWluX3MtPnNlcnZlcl9ob3N0bmFtZTsKLQkgICAgfQotCSAgICBlbHNlIGlmICghcy0+YWRkcnMpIHsKLQkJLyogd2hhdCBlbHNlIGNhbiB3ZSBkbz8gIGF0IHRoaXMgcG9pbnQgdGhpcyB2aG9zdCBoYXMKLQkJICAgIG5vIGNvbmZpZ3VyZWQgbmFtZSwgcHJvYmFibHkgYmVjYXVzZSB0aGV5IHVzZWQKLQkJICAgIEROUyBpbiB0aGUgVmlydHVhbEhvc3Qgc3RhdGVtZW50LiAgSXQncyBkaXNhYmxlZAotCQkgICAgYW55aG93IGJ5IHRoZSBob3N0IG1hdGNoaW5nIGNvZGUuICAtZGpnICovCi0JCXMtPnNlcnZlcl9ob3N0bmFtZSA9Ci0JCSAgICBhcF9wc3RyZHVwKHAsICJib2d1c19ob3N0X3dpdGhvdXRfZm9yd2FyZF9kbnMiKTsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJc3RydWN0IGhvc3RlbnQgKmg7Ci0KLQkJaWYgKChoID0gZ2V0aG9zdGJ5YWRkcigoY2hhciAqKSAmKHMtPmFkZHJzLT5ob3N0X2FkZHIpLAotCQkJCQlzaXplb2Yoc3RydWN0IGluX2FkZHIpLCBBRl9JTkVUKSkpIHsKLQkJICAgIHMtPnNlcnZlcl9ob3N0bmFtZSA9IGFwX3BzdHJkdXAocCwgKGNoYXIgKikgaC0+aF9uYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJICAgIC8qIGFnYWluLCB3aGF0IGNhbiB3ZSBkbz8gIFRoZXkgZGlkbid0IHNwZWNpZnkgYQotCQkgICAgICAgU2VydmVyTmFtZSwgYW5kIHRoZWlyIEROUyBpc24ndCB3b3JraW5nLiAtZGpnICovCi0JCSAgICBhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19FUlIsIDAsIG1haW5fcywKLQkJCSAgICAiRmFpbGVkIHRvIHJlc29sdmUgc2VydmVyIG5hbWUgIgotCQkJICAgICJmb3IgJXMgKGNoZWNrIEROUykgLS0gb3Igc3BlY2lmeSBhbiBleHBsaWNpdCAiCi0JCQkgICAgIlNlcnZlck5hbWUiLAotCQkJICAgIGluZXRfbnRvYShzLT5hZGRycy0+aG9zdF9hZGRyKSk7Ci0JCSAgICBzLT5zZXJ2ZXJfaG9zdG5hbWUgPQotCQkJYXBfcHN0cmR1cChwLCAiYm9ndXNfaG9zdF93aXRob3V0X3JldmVyc2VfZG5zIik7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICAvKiBub3cgZ28gdGhyb3VnaCBhbmQgZGVsZXRlIGFueSBOYW1lVmlydHVhbEhvc3RzIHRoYXQgZGlkbid0IGhhdmUgYW55Ci0gICAgICogaG9zdHMgYXNzb2NpYXRlZCB3aXRoIHRoZW0uICBMYW1lcnMuCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IElQSEFTSF9UQUJMRV9TSVpFOyArK2kpIHsKLQlpcGFkZHJfY2hhaW4gKipwaWMgPSAmaXBoYXNoX3RhYmxlW2ldOwotCi0Jd2hpbGUgKCpwaWMpIHsKLQkgICAgaXBhZGRyX2NoYWluICppYyA9ICpwaWM7Ci0KLQkgICAgaWYgKGljLT5zZXJ2ZXIgPT0gTlVMTCkgewotCQlhcF9sb2dfZXJyb3IoQVBMT0dfTUFSSywgQVBMT0dfTk9FUlJOT3xBUExPR19XQVJOSU5HLCAwLCBtYWluX3MsCi0JCQkiTmFtZVZpcnR1YWxIb3N0ICVzOiV1IGhhcyBubyBWaXJ0dWFsSG9zdHMiLAotCQkJaWMtPnNhci0+dmlydGhvc3QsIGljLT5zYXItPmhvc3RfcG9ydCk7Ci0JCSpwaWMgPSBpYy0+bmV4dDsKLQkgICAgfQotCSAgICBlbHNlIGlmIChpYy0+bmFtZXMgPT0gTlVMTCkgewotCQkvKiBpZiBzZXJ2ZXIgIT0gTlVMTCBhbmQgbmFtZXMgPT0gTlVMTCB0aGVuIHdlJ3JlIGRvbmUKLQkJICogbG9va2luZyBhdCBOYW1lVmlydHVhbEhvc3RzCi0JCSAqLwotCQlicmVhazsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJcGljID0gJmljLT5uZXh0OwotCSAgICB9Ci0JfQotICAgIH0KLQotI2lmZGVmIElQSEFTSF9TVEFUSVNUSUNTCi0gICAgZHVtcF9pcGhhc2hfc3RhdGlzdGljcyhtYWluX3MpOwotI2VuZGlmCi0gICAgaWYgKGdldGVudigiRFVNUF9WSE9TVFMiKSkgewotICAgICAgICBhcF9maWxlX3QgKnRoZWZpbGUgPSBOVUxMOwotICAgICAgICBhcF9vcGVuX3N0ZGVycigmdGhlZmlsZSwgcCk7Ci0JZHVtcF92aG9zdF9jb25maWcodGhlZmlsZSk7Ci0gICAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcnVuLXRpbWUgdmhvc3QgbWF0Y2hpbmcgZnVuY3Rpb25zCi0gKi8KLQotLyogTG93ZXJjYXNlIGFuZCByZW1vdmUgYW55IHRyYWlsaW5nIGRvdCBhbmQvb3IgOnBvcnQgZnJvbSB0aGUgaG9zdG5hbWUsCi0gKiBhbmQgY2hlY2sgdGhhdCBpdCBpcyBzYW5lLgotICovCi1zdGF0aWMgdm9pZCBmaXhfaG9zdG5hbWUocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgY2hhciAqaG9zdCA9IGFwX3BhbGxvYyhyLT5wb29sLCBzdHJsZW4oci0+aG9zdG5hbWUpICsgMSk7Ci0gICAgY29uc3QgY2hhciAqc3JjOwotICAgIGNoYXIgKmRzdDsKLQotICAgIC8qIGNoZWNrIGFuZCBjb3B5IHRoZSBob3N0IHBhcnQgKi8KLSAgICBzcmMgPSByLT5ob3N0bmFtZTsKLSAgICBkc3QgPSBob3N0OwotICAgIHdoaWxlICgqc3JjKSB7Ci0JaWYgKCFhcF9pc2FsbnVtKCpzcmMpICYmICpzcmMgIT0gJy4nICYmICpzcmMgIT0gJy0nKSB7Ci0JICAgIGlmICgqc3JjID09ICc6JykKLQkJYnJlYWs7Ci0JICAgIGVsc2UKLQkJZ290byBiYWQ7Ci0JfSBlbHNlIHsKLQkgICAgKmRzdCsrID0gKnNyYysrOwotCX0KLSAgICB9Ci0gICAgLyogY2hlY2sgdGhlIHBvcnQgcGFydCAqLwotICAgIGlmICgqc3JjKysgPT0gJzonKSB7Ci0Jd2hpbGUgKCpzcmMpIHsKLQkgICAgaWYgKCFhcF9pc2RpZ2l0KCpzcmMrKykpIHsKLQkJZ290byBiYWQ7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIC8qIHN0cmlwIHRyYWlsaW5nIGd1YmJpbnMgKi8KLSAgICBpZiAoZHN0ID4gaG9zdCAmJiBkc3RbLTFdID09ICcuJykgewotCWRzdFstMV0gPSAnXDAnOwotICAgIH0gZWxzZSB7Ci0JZHN0WzBdID0gJ1wwJzsKLSAgICB9Ci0KLSAgICByLT5ob3N0bmFtZSA9IGhvc3Q7Ci0gICAgcmV0dXJuOwotCi1iYWQ6Ci0gICAgci0+c3RhdHVzID0gSFRUUF9CQURfUkVRVUVTVDsKLSAgICBhcF9sb2dfcmVycm9yKEFQTE9HX01BUkssIEFQTE9HX05PRVJSTk98QVBMT0dfRVJSLCAwLCByLAotCQkgICJDbGllbnQgc2VudCBtYWxmb3JtZWQgSG9zdCBoZWFkZXIiKTsKLSAgICByZXR1cm47Ci19Ci0KLQotLyogcmV0dXJuIDEgaWYgaG9zdCBtYXRjaGVzIFNlcnZlck5hbWUgb3IgU2VydmVyQWxpYXNlcyAqLwotc3RhdGljIGludCBtYXRjaGVzX2FsaWFzZXMoc2VydmVyX3JlYyAqcywgY29uc3QgY2hhciAqaG9zdCkKLXsKLSAgICBpbnQgaTsKLSAgICBhcF9hcnJheV9oZWFkZXJfdCAqbmFtZXM7Ci0KLSAgICAvKiBtYXRjaCBTZXJ2ZXJOYW1lICovCi0gICAgaWYgKCFzdHJjYXNlY21wKGhvc3QsIHMtPnNlcnZlcl9ob3N0bmFtZSkpIHsKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiBzZWFyY2ggYWxsIHRoZSBhbGlhc2VzIGZyb20gU2VydmVyQWxpYXMgZGlyZWN0aXZlICovCi0gICAgbmFtZXMgPSBzLT5uYW1lczsKLSAgICBpZiAobmFtZXMpIHsKLQljaGFyICoqbmFtZSA9IChjaGFyICoqKSBuYW1lcy0+ZWx0czsKLQlmb3IgKGkgPSAwOyBpIDwgbmFtZXMtPm5lbHRzOyArK2kpIHsKLQkgICAgaWYoIW5hbWVbaV0pIGNvbnRpbnVlOwotCSAgICBpZiAoIXN0cmNhc2VjbXAoaG9zdCwgbmFtZVtpXSkpCi0JCXJldHVybiAxOwotCX0KLSAgICB9Ci0gICAgbmFtZXMgPSBzLT53aWxkX25hbWVzOwotICAgIGlmIChuYW1lcykgewotCWNoYXIgKipuYW1lID0gKGNoYXIgKiopIG5hbWVzLT5lbHRzOwotCWZvciAoaSA9IDA7IGkgPCBuYW1lcy0+bmVsdHM7ICsraSkgewotCSAgICBpZighbmFtZVtpXSkgY29udGludWU7Ci0JICAgIGlmICghYXBfc3RyY2FzZWNtcF9tYXRjaChob3N0LCBuYW1lW2ldKSkKLQkJcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0vKiBTdXBwb3NlIGEgcmVxdWVzdCBjYW1lIGluIG9uIHRoZSBzYW1lIHNvY2tldCBhcyB0aGlzIHIsIGFuZCBpbmNsdWRlZAotICogYSBoZWFkZXIgIkhvc3Q6IGhvc3Q6cG9ydCIsIHdvdWxkIGl0IG1hcCB0byByLT5zZXJ2ZXI/ICBJdCdzIG1vcmUKLSAqIHRoYW4ganVzdCB0aGF0IHRob3VnaC4gIFdoZW4gd2UgZG8gdGhlIG5vcm1hbCBtYXRjaGVzIGZvciBlYWNoIHJlcXVlc3QKLSAqIHdlIGRvbid0IGV2ZW4gYm90aGVyIGNvbnNpZGVyaW5nIEhvc3Q6IGV0YyBvbiBub24tbmFtZXZpcnR1YWxob3N0cywKLSAqIHdlIGp1c3QgY2FsbCBpdCBhIG1hdGNoLiAgQnV0IGhlcmUgd2UgcmVxdWlyZSB0aGUgaG9zdDpwb3J0IHRvIG1hdGNoCi0gKiB0aGUgU2VydmVyTmFtZSBhbmQvb3IgU2VydmVyQWxpYXNlcy4KLSAqLwotQVBJX0VYUE9SVChpbnQpIGFwX21hdGNoZXNfcmVxdWVzdF92aG9zdChyZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqaG9zdCwKLSAgICB1bnNpZ25lZCBwb3J0KQotewotICAgIHNlcnZlcl9yZWMgKnM7Ci0gICAgc2VydmVyX2FkZHJfcmVjICpzYXI7Ci0KLSAgICBzID0gci0+c2VydmVyOwotCi0gICAgLyogc2VhcmNoIGFsbCB0aGUgPFZpcnR1YWxIb3N0PiB2YWx1ZXMgKi8KLSAgICAvKiBYWFg6IElmIHRoaXMgaXMgYSBOYW1lVmlydHVhbEhvc3QgdGhlbiB3ZSBtYXkgbm90IGJlIGRvaW5nIHRoZSBSaWdodCBUaGluZwotICAgICAqIGNvbnNpZGVyOiAKLSAgICAgKgotICAgICAqICAgICBOYW1lVmlydHVhbEhvc3QgMTAuMS4xLjEKLSAgICAgKiAgICAgPFZpcnR1YWxIb3N0IDEwLjEuMS4xPgotICAgICAqICAgICBTZXJ2ZXJOYW1lIHYxCi0gICAgICogICAgIDwvVmlydHVhbEhvc3Q+Ci0gICAgICogICAgIDxWaXJ0dWFsSG9zdCAxMC4xLjEuMT4KLSAgICAgKiAgICAgU2VydmVyTmFtZSB2MgotICAgICAqICAgICA8L1ZpcnR1YWxIb3N0PgotICAgICAqCi0gICAgICogU3VwcG9zZSByLT5zZXJ2ZXIgaXMgdjIsIGFuZCB3ZSdyZSBhc2tlZCB0byBtYXRjaCAiMTAuMS4xLjEiLiAgV2UnbGwgc2F5Ci0gICAgICogInl1cCBpdCdzIHYyIiwgd2hlbiByZWFsbHkgaXQgaXNuJ3QuLi4gaWYgYSByZXF1ZXN0IGNhbWUgaW4gZm9yIDEwLjEuMS4xCi0gICAgICogaXQgd291bGQgcmVhbGx5IGdvIHRvIHYxLgotICAgICAqLwotICAgIGZvciAoc2FyID0gcy0+YWRkcnM7IHNhcjsgc2FyID0gc2FyLT5uZXh0KSB7Ci0JaWYgKChzYXItPmhvc3RfcG9ydCA9PSAwIHx8IHBvcnQgPT0gc2FyLT5ob3N0X3BvcnQpCi0JICAgICYmICFzdHJjYXNlY21wKGhvc3QsIHNhci0+dmlydGhvc3QpKSB7Ci0JICAgIHJldHVybiAxOwotCX0KLSAgICB9Ci0KLSAgICAvKiB0aGUgUG9ydCBoYXMgdG8gbWF0Y2ggbm93LCBiZWNhdXNlIHRoZSByZXN0IGRvbid0IGhhdmUgcG9ydHMgYXNzb2NpYXRlZAotICAgICAqIHdpdGggdGhlbS4gKi8KLSAgICBpZiAocG9ydCAhPSBzLT5wb3J0KSB7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1hdGNoZXNfYWxpYXNlcyhzLCBob3N0KTsKLX0KLQotCi1zdGF0aWMgdm9pZCBjaGVja19ob3N0YWxpYXMocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgLyoKLSAgICAgKiBFdmVuIGlmIHRoZSByZXF1ZXN0IGhhcyBhIEhvc3Q6IGhlYWRlciBjb250YWluaW5nIGEgcG9ydCB3ZSBpZ25vcmUKLSAgICAgKiB0aGF0IHBvcnQuICBXZSBhbHdheXMgdXNlIHRoZSBwaHlzaWNhbCBwb3J0IG9mIHRoZSBzb2NrZXQuICBUaGVyZQotICAgICAqIGFyZSBhIGZldyByZWFzb25zIGZvciB0aGlzOgotICAgICAqCi0gICAgICogLSB0aGUgZGVmYXVsdCBvZiA4MCBvciA0NDMgZm9yIFNTTCBpcyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgd2F5Ci0gICAgICogLSB0aGVyZSBpcyBsZXNzIG9mIGEgcG9zc2liaWxpdHkgb2YgYSBzZWN1cml0eSBwcm9ibGVtCi0gICAgICogLSBpdCBzaW1wbGlmaWVzIHRoZSBkYXRhIHN0cnVjdHVyZQotICAgICAqIC0gdGhlIGNsaWVudCBtYXkgaGF2ZSBubyBpZGVhIHRoYXQgYSBwcm94eSBzb21ld2hlcmUgYWxvbmcgdGhlIHdheQotICAgICAqICAgdHJhbnNsYXRlZCB0aGUgcmVxdWVzdCB0byBhbm90aGVyIGlwOnBvcnQKLSAgICAgKiAtIGV4Y2VwdCBmb3IgdGhlIGFkZHJlc3NlcyBmcm9tIHRoZSBWaXJ0dWFsSG9zdCBsaW5lLCBub25lIG9mIHRoZSBvdGhlcgotICAgICAqICAgbmFtZXMgd2UnbGwgbWF0Y2ggaGF2ZSBwb3J0cyBhc3NvY2lhdGVkIHdpdGggdGhlbQotICAgICAqLwotICAgIGNvbnN0IGNoYXIgKmhvc3QgPSByLT5ob3N0bmFtZTsKLSAgICB1bnNpZ25lZCBwb3J0ID0gbnRvaHMoci0+Y29ubmVjdGlvbi0+bG9jYWxfYWRkci5zaW5fcG9ydCk7Ci0gICAgc2VydmVyX3JlYyAqczsKLSAgICBzZXJ2ZXJfcmVjICpsYXN0X3M7Ci0gICAgbmFtZV9jaGFpbiAqc3JjOwotCi0gICAgbGFzdF9zID0gTlVMTDsKLQotICAgIC8qIFJlY2FsbCB0aGF0IHRoZSBuYW1lX2NoYWluIGlzIGEgbGlzdCBvZiBzZXJ2ZXJfYWRkcl9yZWNzLCBzb21lIG9mCi0gICAgICogd2hvc2UgcG9ydHMgbWF5IG5vdCBtYXRjaC4gIEFsc28gZWFjaCBzZXJ2ZXIgbWF5IGFwcGVhciBtb3JlIHRoYW4KLSAgICAgKiBvbmNlIGluIHRoZSBjaGFpbiAtLSBzcGVjaWZpY2FsbHksIGl0IHdpbGwgYXBwZWFyIG9uY2UgZm9yIGVhY2gKLSAgICAgKiBhZGRyZXNzIGZyb20gaXRzIFZpcnR1YWxIb3N0IGxpbmUgd2hpY2ggbWF0Y2hlZC4gIFdlIG9ubHkgd2FudCB0bwotICAgICAqIGRvIHRoZSBmdWxsIFNlcnZlck5hbWUvU2VydmVyQWxpYXMgY29tcGFyaXNvbnMgb25jZSBmb3IgZWFjaAotICAgICAqIHNlcnZlciwgZm9ydHVuYXRlbHkgd2Uga25vdyB0aGF0IGFsbCB0aGUgVmlydHVhbEhvc3QgYWRkcmVzc2VzIGZvcgotICAgICAqIGEgc2luZ2xlIHNlcnZlciBhcmUgYWRqYWNlbnQgdG8gZWFjaCBvdGhlci4KLSAgICAgKi8KLQotICAgIGZvciAoc3JjID0gci0+Y29ubmVjdGlvbi0+dmhvc3RfbG9va3VwX2RhdGE7IHNyYzsgc3JjID0gc3JjLT5uZXh0KSB7Ci0gICAgICAgIHNlcnZlcl9hZGRyX3JlYyAqc2FyOwotCi0JLyogV2Ugb25seSBjb25zaWRlciBhZGRyZXNzZXMgb24gdGhlIG5hbWVfY2hhaW4gd2hpY2ggaGF2ZSBhIG1hdGNoaW5nCi0JICogcG9ydAotCSAqLwotCXNhciA9IHNyYy0+c2FyOwotCWlmIChzYXItPmhvc3RfcG9ydCAhPSAwICYmIHBvcnQgIT0gc2FyLT5ob3N0X3BvcnQpIHsKLQkgICAgY29udGludWU7Ci0JfQotCi0gICAgICAgIHMgPSBzcmMtPnNlcnZlcjsKLQotCS8qIGRvZXMgaXQgbWF0Y2ggdGhlIHZpcnRob3N0IGZyb20gdGhlIHNhcj8gKi8KLQlpZiAoIXN0cmNhc2VjbXAoaG9zdCwgc2FyLT52aXJ0aG9zdCkpIHsKLQkgICAgZ290byBmb3VuZDsKLQl9Ci0KLQlpZiAocyA9PSBsYXN0X3MpIHsKLQkgICAgLyogd2UndmUgYWxyZWFkeSBkb25lIFNlcnZlck5hbWUgYW5kIFNlcnZlckFsaWFzIGNoZWNrcyBmb3IgdGhpcwotCSAgICAgKiB2aG9zdAotCSAgICAgKi8KLQkgICAgY29udGludWU7Ci0JfQotCWxhc3RfcyA9IHM7Ci0KLQlpZiAobWF0Y2hlc19hbGlhc2VzKHMsIGhvc3QpKSB7Ci0JICAgIGdvdG8gZm91bmQ7Ci0JfQotICAgIH0KLSAgICByZXR1cm47Ci0KLWZvdW5kOgotICAgIC8qIHMgaXMgdGhlIGZpcnN0IG1hdGNoaW5nIHNlcnZlciwgd2UncmUgZG9uZSAqLwotICAgIHItPnNlcnZlciA9IHM7Ci19Ci0KLQotc3RhdGljIHZvaWQgY2hlY2tfc2VydmVycGF0aChyZXF1ZXN0X3JlYyAqcikKLXsKLSAgICBzZXJ2ZXJfcmVjICpzOwotICAgIHNlcnZlcl9yZWMgKmxhc3RfczsKLSAgICBuYW1lX2NoYWluICpzcmM7Ci0gICAgLyogdXNlIEFQIGZ1bmMgaGVyZS4gKi8KLSAgICB1bnNpZ25lZCBwb3J0ID0gbnRvaHMoci0+Y29ubmVjdGlvbi0+bG9jYWxfYWRkci5zaW5fcG9ydCk7Ci0KLSAgICAvKgotICAgICAqIFRoaXMgaXMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgU2VydmVyUGF0aCBjb2RlIGluIGh0dHBfY29yZSwgc28gd2UKLSAgICAgKiBnZXQgdGhlIHJpZ2h0IGhvc3QgYXR0YWNoZWQgdG8gYSBub24tIEhvc3Qtc2VuZGluZyByZXF1ZXN0LgotICAgICAqCi0gICAgICogU2VlIHRoZSBjb21tZW50IGluIGNoZWNrX2hvc3RhbGlhcyBhYm91dCBob3cgZWFjaCB2aG9zdCBjYW4gYmUKLSAgICAgKiBsaXN0ZWQgbXVsdGlwbGUgdGltZXMuCi0gICAgICovCi0KLSAgICBsYXN0X3MgPSBOVUxMOwotICAgIGZvciAoc3JjID0gci0+Y29ubmVjdGlvbi0+dmhvc3RfbG9va3VwX2RhdGE7IHNyYzsgc3JjID0gc3JjLT5uZXh0KSB7Ci0JLyogV2Ugb25seSBjb25zaWRlciBhZGRyZXNzZXMgb24gdGhlIG5hbWVfY2hhaW4gd2hpY2ggaGF2ZSBhIG1hdGNoaW5nCi0JICogcG9ydAotCSAqLwotCWlmIChzcmMtPnNhci0+aG9zdF9wb3J0ICE9IDAgJiYgcG9ydCAhPSBzcmMtPnNhci0+aG9zdF9wb3J0KSB7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotICAgICAgICBzID0gc3JjLT5zZXJ2ZXI7Ci0JaWYgKHMgPT0gbGFzdF9zKSB7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlsYXN0X3MgPSBzOwotCi0gICAgICAgIGlmIChzLT5wYXRoICYmICFzdHJuY21wKHItPnVyaSwgcy0+cGF0aCwgcy0+cGF0aGxlbikgJiYKLSAgICAgICAgICAgIChzLT5wYXRoW3MtPnBhdGhsZW4gLSAxXSA9PSAnLycgfHwKLSAgICAgICAgICAgICByLT51cmlbcy0+cGF0aGxlbl0gPT0gJy8nIHx8Ci0gICAgICAgICAgICAgci0+dXJpW3MtPnBhdGhsZW5dID09ICdcMCcpKSB7Ci0gICAgICAgICAgICByLT5zZXJ2ZXIgPSBzOwotCSAgICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotCi12b2lkIGFwX3VwZGF0ZV92aG9zdF9mcm9tX2hlYWRlcnMocmVxdWVzdF9yZWMgKnIpCi17Ci0gICAgLyogbXVzdCBzZXQgdGhpcyBmb3IgSFRUUC8xLjEgc3VwcG9ydCAqLwotICAgIGlmIChyLT5ob3N0bmFtZSB8fCAoci0+aG9zdG5hbWUgPSBhcF90YWJsZV9nZXQoci0+aGVhZGVyc19pbiwgIkhvc3QiKSkpIHsKLQlmaXhfaG9zdG5hbWUocik7Ci0JaWYgKHItPnN0YXR1cyAhPSBIVFRQX09LKQotCSAgICByZXR1cm47Ci0gICAgfQotICAgIC8qIGNoZWNrIGlmIHdlIHR1Y2tlZCBhd2F5IGEgbmFtZV9jaGFpbiAqLwotICAgIGlmIChyLT5jb25uZWN0aW9uLT52aG9zdF9sb29rdXBfZGF0YSkgewotICAgICAgICBpZiAoci0+aG9zdG5hbWUpCi0gICAgICAgICAgICBjaGVja19ob3N0YWxpYXMocik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNoZWNrX3NlcnZlcnBhdGgocik7Ci0gICAgfQotfQotCi0KLS8qIENhbGxlZCBmb3IgYSBuZXcgY29ubmVjdGlvbiB3aGljaCBoYXMgYSBrbm93biBsb2NhbF9hZGRyLiAgTm90ZSB0aGF0IHRoZQotICogbmV3IGNvbm5lY3Rpb24gaXMgYXNzdW1lZCB0byBoYXZlIGNvbm4tPnNlcnZlciA9PSBtYWluIHNlcnZlci4KLSAqLwotdm9pZCBhcF91cGRhdGVfdmhvc3RfZ2l2ZW5faXAoY29ubl9yZWMgKmNvbm4pCi17Ci0gICAgaXBhZGRyX2NoYWluICp0cmF2OwotICAgIHVuc2lnbmVkIHBvcnQgPSBudG9ocyhjb25uLT5sb2NhbF9hZGRyLnNpbl9wb3J0KTsKLQotICAgIC8qIHNjYW4gdGhlIGhhc2ggYXBfdGFibGVfdCBmb3IgYW4gZXhhY3QgbWF0Y2ggZmlyc3QgKi8KLSAgICB0cmF2ID0gZmluZF9pcGFkZHIoJmNvbm4tPmxvY2FsX2FkZHIuc2luX2FkZHIsIHBvcnQpOwotICAgIGlmICh0cmF2KSB7Ci0JLyogc2F2ZSB0aGUgbmFtZV9jaGFpbiBmb3IgbGF0ZXIgaW4gY2FzZSB0aGlzIGlzIGEgbmFtZS12aG9zdCAqLwotCWNvbm4tPnZob3N0X2xvb2t1cF9kYXRhID0gdHJhdi0+bmFtZXM7Ci0JY29ubi0+YmFzZV9zZXJ2ZXIgPSB0cmF2LT5zZXJ2ZXI7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIC8qIFRoZXJlJ3MgY2VydGFpbmx5IG5vIG5hbWUtdmhvc3RzIHdpdGggdGhpcyBhZGRyZXNzLCB0aGV5IHdvdWxkIGhhdmUKLSAgICAgKiBiZWVuIG1hdGNoZWQgYWJvdmUuCi0gICAgICovCi0gICAgY29ubi0+dmhvc3RfbG9va3VwX2RhdGEgPSBOVUxMOwotCi0gICAgLyogbWF5YmUgdGhlcmUncyBhIGRlZmF1bHQgc2VydmVyIG1hdGNoaW5nIHRoaXMgcG9ydCAqLwotICAgIHRyYXYgPSBmaW5kX2RlZmF1bHRfc2VydmVyKHBvcnQpOwotICAgIGlmICh0cmF2KSB7Ci0JY29ubi0+YmFzZV9zZXJ2ZXIgPSB0cmF2LT5zZXJ2ZXI7Ci0gICAgfQotCi0gICAgLyogb3RoZXJ3aXNlIHdlJ3JlIHN0dWNrIHdpdGgganVzdCB0aGUgbWFpbiBzZXJ2ZXIgKi8KLX0KZGlmZiAtLWdpdCBhL3NyY2xpYi8uY3ZzaWdub3JlIGIvc3JjbGliLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwOGU3MjMuLjAwMDAwMDAKLS0tIGEvc3JjbGliLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1ha2VmaWxlCi1wdGgKZGlmZiAtLWdpdCBhL3NyY2xpYi9NYWtlZmlsZS5pbiBiL3NyY2xpYi9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ3MjVmMi4uMDAwMDAwMAotLS0gYS9zcmNsaWIvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQotREVQVEggICAgID0gLi4KLXRvcHNyY2RpciA9IEB0b3BzcmNkaXJACi1zcmNkaXIgICAgPSBAc3JjZGlyQAotVlBBVEggICAgID0gQHNyY2RpckAKLQotU1VCRElSUyA9IGFwcgotCi1pbmNsdWRlICQodG9wc3JjZGlyKS9idWlsZC9ydWxlcy5tawpkaWZmIC0tZ2l0IGEvc3JjbGliL2V4cGF0LWxpdGUvLmN2c2lnbm9yZSBiL3NyY2xpYi9leHBhdC1saXRlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYzdhN2MuLjAwMDAwMDAKLS0tIGEvc3JjbGliL2V4cGF0LWxpdGUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1ha2VmaWxlCmRpZmYgLS1naXQgYS9zcmNsaWIvZXhwYXQtbGl0ZS9DSEFOR0VTIGIvc3JjbGliL2V4cGF0LWxpdGUvQ0hBTkdFUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyNDA2OC4uMDAwMDAwMAotLS0gYS9zcmNsaWIvZXhwYXQtbGl0ZS9DSEFOR0VTCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPT09IFBVUlBPU0UgPT09Ci0KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGNoYW5nZXMgbWFkZSBieSB0aGUgQXBhY2hlIEdyb3VwIHRvIEphbWVzCi1DbGFyaydzIEV4cGF0IHBhcnNlci4gVGhlIG9yaWdpbmFsIEV4cGF0IGRpc3RyaWJ1dGlvbiBjYW4gYmUgZm91bmQgYXQKLWh0dHA6Ly93d3cuamNsYXJrLmNvbS94bWwvZXhwYXQuaHRtbC4KLQotCi09PT0gU1VCU0VUIElORk9STUFUSU9OID09PQotCi1BcGFjaGUgZG9lcyBub3QgY2hvb3NlIChvciBuZWVkKSB0byB1c2UgdGhlIGVudGlyZSBFeHBhdCBwYXJzZXIKLWRpc3RyaWJ1dGlvbi4gVGhlIHN1YnNldCB0aGF0IEFwYWNoZSB3aWxsIHVzZSB3aWxsIGJlIHJlZmVycmVkIHRvIGFzCi0iZXhwYXQtbGl0ZSIuIEluIHBhcnRpY3VsYXIsIHRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBmaWxlcyBmcm9tCi10aGUgZm9sbG93aW5nIEV4cGF0IGRpc3RyaWJ1dGlvbiBzdWJkaXJlY3RvcmllczoKLQotICBleHBhdC94bWx0b2svKgotICBleHBhdC94bWxwYXJzZS8qCi0KLVdlIGFsc28gcmV0YWluIGV4cGF0L2V4cGF0Lmh0bWwgZm9yIGF0dHJpYnV0aW9uIHRvIEphbWVzIENsYXJrIGFuZAotbGljZW5zaW5nIGluZm9ybWF0aW9uLgotCi1JbiBhZGRpdGlvbiwgd2UgcmVtb3ZlIGV4cGF0L3htbHRvay9kbGxtYWluLmMgZnJvbSBvdXIgdmVyc2lvbiBzaW5jZQotd2Ugc3RhdGljYWxseSBsaW5rIGV4cGF0LWxpdGUgaW50byB0aGUgZXhlY3V0YWJsZSAocmF0aGVyIHRoYW4KLWJ1aWxkaW5nIGEgRExMIG9uIHRoZSBXaW4zMiBwbGF0Zm9ybSkuIFRoZSAqLmRzcCBmaWxlcyBhcmUgYWxzbwotcmVtb3ZlZCwgc2luY2Ugd2UgcGxhY2UgdGhvc2UgZWxzZXdoZXJlIGluIHRoZSBBcGFjaGUgc291cmNlCi1kaXN0cmlidXRpb24gYW5kIHRoZXkgd2lsbCBoYXZlIGEgdmVyeSBkaWZmZXJlbnQgc3RydWN0dXJlLgotCi1NYWtlZmlsZS50bXBsIGhhcyBiZWVuIGNyZWF0ZWQgZnJvbSBzY3JhdGNoIHRvIHByb3ZpZGUgYnVpbGQKLWluc3RydWN0aW9ucyB0byB0aGUgQXBhY2hlIGJ1aWxkIHN5c3RlbS4KLQotVGhpcyBmaWxlIChDSEFOR0VTKSBoYXMgYmVlbiBhZGRlZCB0byBkb2N1bWVudCBjaGFuZ2VzIGZyb20gdGhlCi1vcmlnaW5hbCBFeHBhdCBkaXN0cmlidXRpb24uCi0KLQotPT09IENIQU5HRVMgVE8gT1JJR0lOQUwgPT09Ci0KLVRoZXJlIGhhdmUgYmVlbiBubyBjaGFuZ2VzIG1hZGUgdG8gYW55IEV4cGF0IGZpbGUgYXQgdGhpcyBwb2ludCBpbgotdGltZSAoTWF5IDMxLCAxOTk5KS4KLQotVGhlIGZpbGVzLCBpbiB0aGVpciBvcmlnaW5hbCBzdGF0ZSBmcm9tIHRoZSBFeHBhdCBkaXN0cmlidXRpb24sIGhhdmUKLWJlZW4gdGFnZ2VkIHdpdGhpbiBDVlMgd2l0aCB0aGUgIkVYUEFUXzFfMSIgdGFnLiBUaGF0IHRhZyBtYXkgYmUgdXNlZAotYXMgYSByZWZlcmVuY2UgZm9yIGNoYW5nZXMgbWFkZSBieSB0aGUgQXBhY2hlIEdyb3VwLgpkaWZmIC0tZ2l0IGEvc3JjbGliL2V4cGF0LWxpdGUvTWFrZWZpbGUuaW4gYi9zcmNsaWIvZXhwYXQtbGl0ZS9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlY2JhMi4uMDAwMDAwMAotLS0gYS9zcmNsaWIvZXhwYXQtbGl0ZS9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMKLSMgZGVmYXVsdCBkZWZpbml0aW9uIG9mIHRoZXNlIHR3by4gZHVubm8gaG93IHRvIGdldCBpdCBwcmVwZW5kZWQgd2hlbiB0aGUKLSMgTWFrZWZpbGUgaXMgYnVpbHQsIHNvIHdlIGRvIGl0IG1hbnVhbGx5Ci0jCi1DRkxBR1M9JChPUFRJTSkgJChDRkxBR1MxKSAkKEVYVFJBX0NGTEFHUykKLUlOQ0xVREVTPSQoSU5DTFVERVMxKSAkKElOQ0xVREVTMCkgJChFWFRSQV9JTkNMVURFUykKLQotIyBJZiB5b3Uga25vdyB3aGF0IHlvdXIgc3lzdGVtJ3MgYnl0ZSBvcmRlciBpcywgZGVmaW5lIEJZVEVfT1JERVI6Ci0jIHVzZSAtREJZVEVfT1JERVI9MTIgZm9yIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlcjsKLSMgdXNlIC1EQllURV9PUkRFUj0yMSBmb3IgYmlnLWVuZGlhbiAobmV0d29yaykgYnl0ZSBvcmRlci4KLSNDRkxBR1M9LU8yCi0KLU9CSlM9eG1sdG9rLm8geG1scm9sZS5vIHhtbHBhcnNlLm8gaGFzaHRhYmxlLm8KLQotYWxsIGxpYjogbGliZXhwYXQuYQotCi1saWJleHBhdC5hOiAkKE9CSlMpCi0Jcm0gLWYgbGliZXhwYXQuYQotCWFyIGNyIGxpYmV4cGF0LmEgJChPQkpTKQotCSQoUkFOTElCKSBsaWJleHBhdC5hCi0KLWNsZWFuOgotCXJtIC1mICQoT0JKUykgbGliZXhwYXQuYQotCi1kaXN0Y2xlYW46IGNsZWFuCi0JLXJtIC1mIE1ha2VmaWxlCi0KLS5TVUZGSVhFUzogLm8KLQotLmMubzoKLQkkKENDKSAtYyAkKElOQ0xVREVTKSAkKENGTEFHUykgJDwKLQotZGVwZW5kOgpkaWZmIC0tZ2l0IGEvc3JjbGliL2V4cGF0LWxpdGUvYXNjaWl0YWIuaCBiL3NyY2xpYi9leHBhdC1saXRlL2FzY2lpdGFiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOGEyZGQuLjAwMDAwMDAKLS0tIGEvc3JjbGliL2V4cGF0LWxpdGUvYXNjaWl0YWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi1UaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlCi1WZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluCi1jb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCi0KLVNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIKLWJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi1MaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1UaGUgT3JpZ2luYWwgQ29kZSBpcyBleHBhdC4KLQotVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIEphbWVzIENsYXJrLgotUG9ydGlvbnMgY3JlYXRlZCBieSBKYW1lcyBDbGFyayBhcmUgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5Ci1KYW1lcyBDbGFyay4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotQ29udHJpYnV0b3Iocyk6Ci0KLUFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zCi1vZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKHRoZSAiR1BMIiksIGluIHdoaWNoIGNhc2UgdGhlCi1wcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aG9zZSBhYm92ZS4gIElmIHlvdQotd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgotdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQKLXJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlCi1HUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlCi15b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCi0qLwotCi0vKiAweDAwICovIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwKLS8qIDB4MDQgKi8gQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLAotLyogMHgwOCAqLyBCVF9OT05YTUwsIEJUX1MsIEJUX0xGLCBCVF9OT05YTUwsCi0vKiAweDBDICovIEJUX05PTlhNTCwgQlRfQ1IsIEJUX05PTlhNTCwgQlRfTk9OWE1MLAotLyogMHgxMCAqLyBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsCi0vKiAweDE0ICovIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwKLS8qIDB4MTggKi8gQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLAotLyogMHgxQyAqLyBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsCi0vKiAweDIwICovIEJUX1MsIEJUX0VYQ0wsIEJUX1FVT1QsIEJUX05VTSwKLS8qIDB4MjQgKi8gQlRfT1RIRVIsIEJUX1BFUkNOVCwgQlRfQU1QLCBCVF9BUE9TLAotLyogMHgyOCAqLyBCVF9MUEFSLCBCVF9SUEFSLCBCVF9BU1QsIEJUX1BMVVMsCi0vKiAweDJDICovIEJUX0NPTU1BLCBCVF9NSU5VUywgQlRfTkFNRSwgQlRfU09MLAotLyogMHgzMCAqLyBCVF9ESUdJVCwgQlRfRElHSVQsIEJUX0RJR0lULCBCVF9ESUdJVCwKLS8qIDB4MzQgKi8gQlRfRElHSVQsIEJUX0RJR0lULCBCVF9ESUdJVCwgQlRfRElHSVQsCi0vKiAweDM4ICovIEJUX0RJR0lULCBCVF9ESUdJVCwgQlRfQ09MT04sIEJUX1NFTUksCi0vKiAweDNDICovIEJUX0xULCBCVF9FUVVBTFMsIEJUX0dULCBCVF9RVUVTVCwKLS8qIDB4NDAgKi8gQlRfT1RIRVIsIEJUX0hFWCwgQlRfSEVYLCBCVF9IRVgsCi0vKiAweDQ0ICovIEJUX0hFWCwgQlRfSEVYLCBCVF9IRVgsIEJUX05NU1RSVCwKLS8qIDB4NDggKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAotLyogMHg0QyAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCi0vKiAweDUwICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKLS8qIDB4NTQgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAotLyogMHg1OCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9MU1FCLAotLyogMHg1QyAqLyBCVF9PVEhFUiwgQlRfUlNRQiwgQlRfT1RIRVIsIEJUX05NU1RSVCwKLS8qIDB4NjAgKi8gQlRfT1RIRVIsIEJUX0hFWCwgQlRfSEVYLCBCVF9IRVgsCi0vKiAweDY0ICovIEJUX0hFWCwgQlRfSEVYLCBCVF9IRVgsIEJUX05NU1RSVCwKLS8qIDB4NjggKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAotLyogMHg2QyAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCi0vKiAweDcwICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKLS8qIDB4NzQgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAotLyogMHg3OCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9PVEhFUiwKLS8qIDB4N0MgKi8gQlRfVkVSQkFSLCBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLApkaWZmIC0tZ2l0IGEvc3JjbGliL2V4cGF0LWxpdGUvZXhwYXQuaHRtbCBiL3NyY2xpYi9leHBhdC1saXRlL2V4cGF0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MDZjYTguLjAwMDAwMDAKLS0tIGEvc3JjbGliL2V4cGF0LWxpdGUvZXhwYXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL2xvb3NlLmR0ZCI+Ci0KLTxIVE1MPgotCi08VElUTEU+ZXhwYXQ8L1RJVExFPgotCi08Qk9EWT4KLQotPEgxPmV4cGF0IC0gWE1MIFBhcnNlciBUb29sa2l0PC9IMT4KLQotPEgzPlZlcnNpb24gMS4xPC9IMz4KLQotPFA+Q29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IEphbWVzIENsYXJrLiAgRXhwYXQgaXMgc3ViamVjdCB0byB0aGUgPEEKLUhSRUY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTlBML05QTC0xXzFGaW5hbC5odG1sIj5Nb3ppbGxhIFB1YmxpYwotTGljZW5zZSBWZXJzaW9uIDEuMTwvQT4uICBBbHRlcm5hdGl2ZWx5IHlvdSBtYXkgdXNlIGV4cGF0IHVuZGVyIHRoZSA8QQotaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sIj5HTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2U8L0E+IGluc3RlYWQuICBQbGVhc2UgY29udGFjdCBtZSBpZiB5b3Ugd2lzaCB0byBuZWdvdGlhdGUgYW4KLWFsdGVybmF0aXZlIGxpY2Vuc2UuPC9QPgotCi08UD5FeHBhdCBpcyBhbiA8QQotSFJFRj0iaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMteG1sLTE5OTgwMjEwIj5YTUwgMS4wPC9BPiBwYXJzZXIKLXdyaXR0ZW4gaW4gQy4gSXQgYWltcyB0byBiZSBmdWxseSBjb25mb3JtaW5nLiAgSXQgaXMgY3VycmVudGx5IG5vdCBhCi12YWxpZGF0aW5nIFhNTCBwcm9jZXNzb3IuICBUaGUgY3VycmVudCBwcm9kdWN0aW9uIHZlcnNpb24gb2YgZXhwYXQgY2FuCi1iZSBkb3dubG9hZGVkIGZyb20gPEEgaHJlZiA9ICJmdHA6Ly9mdHAuamNsYXJrLmNvbS9wdWIveG1sL2V4cGF0LnppcCIKLT5mdHA6Ly9mdHAuamNsYXJrLmNvbS9wdWIveG1sL2V4cGF0LnppcDwvQT4uPC9QPgotCi08UD5UaGUgZGlyZWN0b3J5IDxTQU1QPnhtbHRvazwvU0FNUD4gY29udGFpbnMgYSBsb3ctbGV2ZWwgbGlicmFyeSBmb3IKLXRva2VuaXppbmcgWE1MLiAgVGhlIGludGVyZmFjZSBpcyBkb2N1bWVudGVkIGluCi08U0FNUD54bWx0b2sveG1sdG9rLmg8L1NBTVA+LjwvUD4KLQotPFA+VGhlIGRpcmVjdG9yeSA8U0FNUD54bWxwYXJzZTwvU0FNUD4gY29udGFpbnMgYW4gWE1MIHBhcnNlciBsaWJyYXJ5Ci13aGljaCBpcyBidWlsdCBvbiB0b3Agb2YgdGhlIDxTQU1QPnhtbHRvazwvU0FNUD4gbGlicmFyeS4gIFRoZQotaW50ZXJmYWNlIGlzIGRvY3VtZW50ZWQgaW4gPFNBTVA+eG1scGFyc2UveG1scGFyc2UuaDwvU0FNUD4uICBUaGUKLWRpcmVjdG9yeSA8U0FNUD5zYW1wbGU8L1NBTVA+IGNvbnRhaW5zIGEgc2ltcGxlIGV4YW1wbGUgcHJvZ3JhbSB1c2luZwotdGhpcyBpbnRlcmZhY2U7IDxTQU1QPnNhbXBsZS9idWlsZC5iYXQ8L1NBTVA+IGlzIGEgYmF0Y2ggZmlsZSB0byBidWlsZAotdGhlIGV4YW1wbGUgdXNpbmcgVmlzdWFsIEMrKy48L1A+Ci0KLTxQPlRoZSBkaXJlY3RvcnkgPFNBTVA+eG1sd2Y8L1NBTVA+IGNvbnRhaW5zIHRoZSA8U0FNUD54bWx3ZjwvU0FNUD4KLWFwcGxpY2F0aW9uLCB3aGljaCB1c2VzIHRoZSA8U0FNUD54bWxwYXJzZTwvU0FNUD4gbGlicmFyeS4gVGhlCi1hcmd1bWVudHMgdG8gPFNBTVA+eG1sd2Y8L1NBTVA+IGFyZSBvbmUgb3IgbW9yZSBmaWxlcyB3aGljaCBhcmUgZWFjaAotdG8gYmUgY2hlY2tlZCBmb3Igd2VsbC1mb3JtZWRuZXNzLiBBbiBvcHRpb24gPFNBTVA+LWQKLTxWQVI+ZGlyPC9WQVI+PC9TQU1QPiBjYW4gYmUgc3BlY2lmaWVkOyBmb3IgZWFjaCB3ZWxsLWZvcm1lZCBpbnB1dAotZmlsZSB0aGUgY29ycmVzcG9uZGluZyA8QQotaHJlZj0iaHR0cDovL3d3dy5qY2xhcmsuY29tL3htbC9jYW5vbnhtbC5odG1sIj5jYW5vbmljYWwgWE1MPC9BPiB3aWxsCi1iZSB3cml0dGVuIHRvIDxTQU1QPmRpci88VkFSPmY8L1ZBUj48L1NBTVA+LCB3aGVyZQotPFNBTVA+PFZBUj5mPC9WQVI+PC9TQU1QPiBpcyB0aGUgZmlsZW5hbWUgKHdpdGhvdXQgYW55IHBhdGgpIG9mIHRoZQotaW5wdXQgZmlsZS4gIEEgPENPREU+LXg8L0NPREU+IG9wdGlvbiB3aWxsIGNhdXNlIHJlZmVyZW5jZXMgdG8KLWV4dGVybmFsIGdlbmVyYWwgZW50aXRpZXMgdG8gYmUgcHJvY2Vzc2VkLiAgQSA8Q09ERT4tczwvQ09ERT4gb3B0aW9uCi13aWxsIG1ha2UgZG9jdW1lbnRzIHRoYXQgYXJlIG5vdCBzdGFuZGFsb25lIGNhdXNlIGFuIGVycm9yIChhIGRvY3VtZW50Ci1pcyBjb25zaWRlcmVkIHN0YW5kYWxvbmUgaWYgZWl0aGVyIGl0IGlzIGludHJpbnNpY2FsbHkgc3RhbmRhbG9uZQotYmVjYXVzZSBpdCBoYXMgbm8gZXh0ZXJuYWwgc3Vic2V0IGFuZCBubyByZWZlcmVuY2VzIHRvIHBhcmFtZXRlcgotZW50aXRpZXMgaW4gdGhlIGludGVybmFsIHN1YnNldCBvciBpdCBpcyBkZWNsYXJlZCBhcyBzdGFuZGFsb25lIGluIHRoZQotWE1MIGRlY2xhcmF0aW9uKS48L1A+Ci0KLTxQPlRoZSA8U0FNUD5iaW48L1NBTVA+IGRpcmVjdG9yeSBjb250YWlucyBXaW4zMiBleGVjdXRhYmxlcy4gIFRoZQotPFNBTVA+bGliPC9TQU1QPiBkaXJlY3RvcnkgY29udGFpbnMgV2luMzIgaW1wb3J0IGxpYnJhcmllcy48L1A+Ci0KLTxQPkFuc3dlcnMgdG8gc29tZSBmcmVxdWVudGx5IGFza2VkIHF1ZXN0aW9ucyBhYm91dCBleHBhdCBjYW4gYmUgZm91bmQKLWluIHRoZSA8QSBIUkVGPSJodHRwOi8vd3d3LmpjbGFyay5jb20veG1sL2V4cGF0ZmFxLmh0bWwiPmV4cGF0Ci1GQVE8L0E+LjwvUD4KLQotPFA+PC9QPgotCi08QUREUkVTUz4KLQotPEEgSFJFRj0ibWFpbHRvOmpqY0BqY2xhcmsuY29tIj5KYW1lcyBDbGFyazwvQT4KLQotPC9BRERSRVNTPgotCi08L0JPRFk+Ci0KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3NyY2xpYi9leHBhdC1saXRlL2hhc2h0YWJsZS5jIGIvc3JjbGliL2V4cGF0LWxpdGUvaGFzaHRhYmxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MGEwNjEuLjAwMDAwMDAKLS0tIGEvc3JjbGliL2V4cGF0LWxpdGUvaGFzaHRhYmxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLVRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UKLVZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4KLWNzb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCi0KLVNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIKLWJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi1MaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1UaGUgT3JpZ2luYWwgQ29kZSBpcyBleHBhdC4KLQotVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIEphbWVzIENsYXJrLgotUG9ydGlvbnMgY3JlYXRlZCBieSBKYW1lcyBDbGFyayBhcmUgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5Ci1KYW1lcyBDbGFyay4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotQ29udHJpYnV0b3Iocyk6Ci0KLUFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zCi1vZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKHRoZSAiR1BMIiksIGluIHdoaWNoIGNhc2UgdGhlCi1wcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aG9zZSBhYm92ZS4gIElmIHlvdQotd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgotdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQKLXJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlCi1HUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlCi15b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCi0qLwotCi0jaW5jbHVkZSAieG1sZGVmLmgiCi0KLSNpZmRlZiBYTUxfVU5JQ09ERV9XQ0hBUl9UCi0jaWZuZGVmIFhNTF9VTklDT0RFCi0jZGVmaW5lIFhNTF9VTklDT0RFCi0jZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSAiaGFzaHRhYmxlLmgiCi0KLSNkZWZpbmUgSU5JVF9TSVpFIDY0Ci0KLXN0YXRpYwotaW50IGtleWVxKEtFWSBzMSwgS0VZIHMyKQotewotICBmb3IgKDsgKnMxID09ICpzMjsgczErKywgczIrKykKLSAgICBpZiAoKnMxID09IDApCi0gICAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYwotdW5zaWduZWQgbG9uZyBoYXNoKEtFWSBzKQotewotICB1bnNpZ25lZCBsb25nIGggPSAwOwotICB3aGlsZSAoKnMpCi0gICAgaCA9IChoIDw8IDUpICsgaCArICh1bnNpZ25lZCBjaGFyKSpzKys7Ci0gIHJldHVybiBoOwotfQotCi1OQU1FRCAqbG9va3VwKEhBU0hfVEFCTEUgKnRhYmxlLCBLRVkgbmFtZSwgc2l6ZV90IGNyZWF0ZVNpemUpCi17Ci0gIHNpemVfdCBpOwotICBpZiAodGFibGUtPnNpemUgPT0gMCkgewotICAgIGlmICghY3JlYXRlU2l6ZSkKLSAgICAgIHJldHVybiAwOwotICAgIHRhYmxlLT52ID0gY2FsbG9jKElOSVRfU0laRSwgc2l6ZW9mKE5BTUVEICopKTsKLSAgICBpZiAoIXRhYmxlLT52KQotICAgICAgcmV0dXJuIDA7Ci0gICAgdGFibGUtPnNpemUgPSBJTklUX1NJWkU7Ci0gICAgdGFibGUtPnVzZWRMaW0gPSBJTklUX1NJWkUgLyAyOwotICAgIGkgPSBoYXNoKG5hbWUpICYgKHRhYmxlLT5zaXplIC0gMSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgdW5zaWduZWQgbG9uZyBoID0gaGFzaChuYW1lKTsKLSAgICBmb3IgKGkgPSBoICYgKHRhYmxlLT5zaXplIC0gMSk7Ci0gICAgICAgICB0YWJsZS0+dltpXTsKLSAgICAgICAgIGkgPT0gMCA/IGkgPSB0YWJsZS0+c2l6ZSAtIDEgOiAtLWkpIHsKLSAgICAgIGlmIChrZXllcShuYW1lLCB0YWJsZS0+dltpXS0+bmFtZSkpCi0JcmV0dXJuIHRhYmxlLT52W2ldOwotICAgIH0KLSAgICBpZiAoIWNyZWF0ZVNpemUpCi0gICAgICByZXR1cm4gMDsKLSAgICBpZiAodGFibGUtPnVzZWQgPT0gdGFibGUtPnVzZWRMaW0pIHsKLSAgICAgIC8qIGNoZWNrIGZvciBvdmVyZmxvdyAqLwotICAgICAgc2l6ZV90IG5ld1NpemUgPSB0YWJsZS0+c2l6ZSAqIDI7Ci0gICAgICBOQU1FRCAqKm5ld1YgPSBjYWxsb2MobmV3U2l6ZSwgc2l6ZW9mKE5BTUVEICopKTsKLSAgICAgIGlmICghbmV3VikKLQlyZXR1cm4gMDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCB0YWJsZS0+c2l6ZTsgaSsrKQotCWlmICh0YWJsZS0+dltpXSkgewotCSAgc2l6ZV90IGo7Ci0JICBmb3IgKGogPSBoYXNoKHRhYmxlLT52W2ldLT5uYW1lKSAmIChuZXdTaXplIC0gMSk7Ci0JICAgICAgIG5ld1Zbal07Ci0JICAgICAgIGogPT0gMCA/IGogPSBuZXdTaXplIC0gMSA6IC0taikKLQkgICAgOwotCSAgbmV3VltqXSA9IHRhYmxlLT52W2ldOwotCX0KLSAgICAgIGZyZWUodGFibGUtPnYpOwotICAgICAgdGFibGUtPnYgPSBuZXdWOwotICAgICAgdGFibGUtPnNpemUgPSBuZXdTaXplOwotICAgICAgdGFibGUtPnVzZWRMaW0gPSBuZXdTaXplLzI7Ci0gICAgICBmb3IgKGkgPSBoICYgKHRhYmxlLT5zaXplIC0gMSk7Ci0JICAgdGFibGUtPnZbaV07Ci0JICAgaSA9PSAwID8gaSA9IHRhYmxlLT5zaXplIC0gMSA6IC0taSkKLQk7Ci0gICAgfQotICB9Ci0gIHRhYmxlLT52W2ldID0gY2FsbG9jKDEsIGNyZWF0ZVNpemUpOwotICBpZiAoIXRhYmxlLT52W2ldKQotICAgIHJldHVybiAwOwotICB0YWJsZS0+dltpXS0+bmFtZSA9IG5hbWU7Ci0gICh0YWJsZS0+dXNlZCkrKzsKLSAgcmV0dXJuIHRhYmxlLT52W2ldOwotfQotCi12b2lkIGhhc2hUYWJsZURlc3Ryb3koSEFTSF9UQUJMRSAqdGFibGUpCi17Ci0gIHNpemVfdCBpOwotICBmb3IgKGkgPSAwOyBpIDwgdGFibGUtPnNpemU7IGkrKykgewotICAgIE5BTUVEICpwID0gdGFibGUtPnZbaV07Ci0gICAgaWYgKHApCi0gICAgICBmcmVlKHApOwotICB9Ci0gIGZyZWUodGFibGUtPnYpOwotfQotCi12b2lkIGhhc2hUYWJsZUluaXQoSEFTSF9UQUJMRSAqcCkKLXsKLSAgcC0+c2l6ZSA9IDA7Ci0gIHAtPnVzZWRMaW0gPSAwOwotICBwLT51c2VkID0gMDsKLSAgcC0+diA9IDA7Ci19Ci0KLXZvaWQgaGFzaFRhYmxlSXRlckluaXQoSEFTSF9UQUJMRV9JVEVSICppdGVyLCBjb25zdCBIQVNIX1RBQkxFICp0YWJsZSkKLXsKLSAgaXRlci0+cCA9IHRhYmxlLT52OwotICBpdGVyLT5lbmQgPSBpdGVyLT5wICsgdGFibGUtPnNpemU7Ci19Ci0KLU5BTUVEICpoYXNoVGFibGVJdGVyTmV4dChIQVNIX1RBQkxFX0lURVIgKml0ZXIpCi17Ci0gIHdoaWxlIChpdGVyLT5wICE9IGl0ZXItPmVuZCkgewotICAgIE5BTUVEICp0ZW0gPSAqKGl0ZXItPnApKys7Ci0gICAgaWYgKHRlbSkKLSAgICAgIHJldHVybiB0ZW07Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL3NyY2xpYi9leHBhdC1saXRlL2hhc2h0YWJsZS5oIGIvc3JjbGliL2V4cGF0LWxpdGUvaGFzaHRhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmOGFiOGEuLjAwMDAwMDAKLS0tIGEvc3JjbGliL2V4cGF0LWxpdGUvaGFzaHRhYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZQotVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbgotY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLWh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwotCi1Tb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiCi1iYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLQotVGhlIE9yaWdpbmFsIENvZGUgaXMgZXhwYXQuCi0KLVRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBKYW1lcyBDbGFyay4KLVBvcnRpb25zIGNyZWF0ZWQgYnkgSmFtZXMgQ2xhcmsgYXJlIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OQotSmFtZXMgQ2xhcmsuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLUNvbnRyaWJ1dG9yKHMpOgotCi1BbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcwotb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICh0aGUgIkdQTCIpLCBpbiB3aGljaCBjYXNlIHRoZQotcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhvc2UgYWJvdmUuICBJZiB5b3UKLXdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seSB1bmRlciB0aGUgdGVybXMgb2YKLXRoZSBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKLXRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kCi1yZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZQotR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZQoteW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgR1BMLgotKi8KLQotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLSNpZmRlZiBYTUxfVU5JQ09ERQotCi0jaWZkZWYgWE1MX1VOSUNPREVfV0NIQVJfVAotdHlwZWRlZiBjb25zdCB3Y2hhcl90ICpLRVk7Ci0jZWxzZSAvKiBub3QgWE1MX1VOSUNPREVfV0NIQVJfVCAqLwotdHlwZWRlZiBjb25zdCB1bnNpZ25lZCBzaG9ydCAqS0VZOwotI2VuZGlmIC8qIG5vdCBYTUxfVU5JQ09ERV9XQ0hBUl9UICovCi0KLSNlbHNlIC8qIG5vdCBYTUxfVU5JQ09ERSAqLwotCi10eXBlZGVmIGNvbnN0IGNoYXIgKktFWTsKLQotI2VuZGlmIC8qIG5vdCBYTUxfVU5JQ09ERSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEtFWSBuYW1lOwotfSBOQU1FRDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBOQU1FRCAqKnY7Ci0gIHNpemVfdCBzaXplOwotICBzaXplX3QgdXNlZDsKLSAgc2l6ZV90IHVzZWRMaW07Ci19IEhBU0hfVEFCTEU7Ci0KLU5BTUVEICpsb29rdXAoSEFTSF9UQUJMRSAqdGFibGUsIEtFWSBuYW1lLCBzaXplX3QgY3JlYXRlU2l6ZSk7Ci12b2lkIGhhc2hUYWJsZUluaXQoSEFTSF9UQUJMRSAqKTsKLXZvaWQgaGFzaFRhYmxlRGVzdHJveShIQVNIX1RBQkxFICopOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIE5BTUVEICoqcDsKLSAgTkFNRUQgKiplbmQ7Ci19IEhBU0hfVEFCTEVfSVRFUjsKLQotdm9pZCBoYXNoVGFibGVJdGVySW5pdChIQVNIX1RBQkxFX0lURVIgKiwgY29uc3QgSEFTSF9UQUJMRSAqKTsKLU5BTUVEICpoYXNoVGFibGVJdGVyTmV4dChIQVNIX1RBQkxFX0lURVIgKik7CmRpZmYgLS1naXQgYS9zcmNsaWIvZXhwYXQtbGl0ZS9pYXNjaWl0YWIuaCBiL3NyY2xpYi9leHBhdC1saXRlL2lhc2NpaXRhYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzNkNmJiLi4wMDAwMDAwCi0tLSBhL3NyY2xpYi9leHBhdC1saXRlL2lhc2NpaXRhYi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLVRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UKLVZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4KLWNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KLQotU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIgotYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLUxpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLVRoZSBPcmlnaW5hbCBDb2RlIGlzIGV4cGF0LgotCi1UaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgSmFtZXMgQ2xhcmsuCi1Qb3J0aW9ucyBjcmVhdGVkIGJ5IEphbWVzIENsYXJrIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkKLUphbWVzIENsYXJrLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1Db250cmlidXRvcihzKToKLQotQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMKLW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAodGhlICJHUEwiKSwgaW4gd2hpY2ggY2FzZSB0aGUKLXByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRob3NlIGFib3ZlLiAgSWYgeW91Ci13aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCi10aGUgTVBMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZAotcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUKLUdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UKLXlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4KLSovCi0KLS8qIExpa2UgYXNjaWl0YWIuaCwgZXhjZXB0IHRoYXQgMHhEIGhhcyBjb2RlIEJUX1MgcmF0aGVyIHRoYW4gQlRfQ1IgKi8KLS8qIDB4MDAgKi8gQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLAotLyogMHgwNCAqLyBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsCi0vKiAweDA4ICovIEJUX05PTlhNTCwgQlRfUywgQlRfTEYsIEJUX05PTlhNTCwKLS8qIDB4MEMgKi8gQlRfTk9OWE1MLCBCVF9TLCBCVF9OT05YTUwsIEJUX05PTlhNTCwKLS8qIDB4MTAgKi8gQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLAotLyogMHgxNCAqLyBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsCi0vKiAweDE4ICovIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwKLS8qIDB4MUMgKi8gQlRfTk9OWE1MLCBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLAotLyogMHgyMCAqLyBCVF9TLCBCVF9FWENMLCBCVF9RVU9ULCBCVF9OVU0sCi0vKiAweDI0ICovIEJUX09USEVSLCBCVF9QRVJDTlQsIEJUX0FNUCwgQlRfQVBPUywKLS8qIDB4MjggKi8gQlRfTFBBUiwgQlRfUlBBUiwgQlRfQVNULCBCVF9QTFVTLAotLyogMHgyQyAqLyBCVF9DT01NQSwgQlRfTUlOVVMsIEJUX05BTUUsIEJUX1NPTCwKLS8qIDB4MzAgKi8gQlRfRElHSVQsIEJUX0RJR0lULCBCVF9ESUdJVCwgQlRfRElHSVQsCi0vKiAweDM0ICovIEJUX0RJR0lULCBCVF9ESUdJVCwgQlRfRElHSVQsIEJUX0RJR0lULAotLyogMHgzOCAqLyBCVF9ESUdJVCwgQlRfRElHSVQsIEJUX0NPTE9OLCBCVF9TRU1JLAotLyogMHgzQyAqLyBCVF9MVCwgQlRfRVFVQUxTLCBCVF9HVCwgQlRfUVVFU1QsCi0vKiAweDQwICovIEJUX09USEVSLCBCVF9IRVgsIEJUX0hFWCwgQlRfSEVYLAotLyogMHg0NCAqLyBCVF9IRVgsIEJUX0hFWCwgQlRfSEVYLCBCVF9OTVNUUlQsCi0vKiAweDQ4ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKLS8qIDB4NEMgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAotLyogMHg1MCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCi0vKiAweDU0ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKLS8qIDB4NTggKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTFNRQiwKLS8qIDB4NUMgKi8gQlRfT1RIRVIsIEJUX1JTUUIsIEJUX09USEVSLCBCVF9OTVNUUlQsCi0vKiAweDYwICovIEJUX09USEVSLCBCVF9IRVgsIEJUX0hFWCwgQlRfSEVYLAotLyogMHg2NCAqLyBCVF9IRVgsIEJUX0hFWCwgQlRfSEVYLCBCVF9OTVNUUlQsCi0vKiAweDY4ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKLS8qIDB4NkMgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAotLyogMHg3MCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCi0vKiAweDc0ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKLS8qIDB4NzggKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfT1RIRVIsCi0vKiAweDdDICovIEJUX1ZFUkJBUiwgQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwKZGlmZiAtLWdpdCBhL3NyY2xpYi9leHBhdC1saXRlL2xhdGluMXRhYi5oIGIvc3JjbGliL2V4cGF0LWxpdGUvbGF0aW4xdGFiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NjA5YWEuLjAwMDAwMDAKLS0tIGEvc3JjbGliL2V4cGF0LWxpdGUvbGF0aW4xdGFiLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZQotVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbgotY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLWh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwotCi1Tb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiCi1iYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLQotVGhlIE9yaWdpbmFsIENvZGUgaXMgZXhwYXQuCi0KLVRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBKYW1lcyBDbGFyay4KLVBvcnRpb25zIGNyZWF0ZWQgYnkgSmFtZXMgQ2xhcmsgYXJlIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OQotSmFtZXMgQ2xhcmsuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLUNvbnRyaWJ1dG9yKHMpOgotCi1BbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcwotb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICh0aGUgIkdQTCIpLCBpbiB3aGljaCBjYXNlIHRoZQotcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhvc2UgYWJvdmUuICBJZiB5b3UKLXdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seSB1bmRlciB0aGUgdGVybXMgb2YKLXRoZSBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKLXRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kCi1yZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZQotR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZQoteW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgR1BMLgotKi8KLQotLyogMHg4MCAqLyBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwKLS8qIDB4ODQgKi8gQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsCi0vKiAweDg4ICovIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLAotLyogMHg4QyAqLyBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwKLS8qIDB4OTAgKi8gQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsCi0vKiAweDk0ICovIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLAotLyogMHg5OCAqLyBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwKLS8qIDB4OUMgKi8gQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsCi0vKiAweEEwICovIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLAotLyogMHhBNCAqLyBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwKLS8qIDB4QTggKi8gQlRfT1RIRVIsIEJUX09USEVSLCBCVF9OTVNUUlQsIEJUX09USEVSLAotLyogMHhBQyAqLyBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwKLS8qIDB4QjAgKi8gQlRfT1RIRVIsIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsCi0vKiAweEI0ICovIEJUX09USEVSLCBCVF9OTVNUUlQsIEJUX09USEVSLCBCVF9OQU1FLAotLyogMHhCOCAqLyBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX05NU1RSVCwgQlRfT1RIRVIsCi0vKiAweEJDICovIEJUX09USEVSLCBCVF9PVEhFUiwgQlRfT1RIRVIsIEJUX09USEVSLAotLyogMHhDMCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCi0vKiAweEM0ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKLS8qIDB4QzggKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAotLyogMHhDQyAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCi0vKiAweEQwICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKLS8qIDB4RDQgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfT1RIRVIsCi0vKiAweEQ4ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKLS8qIDB4REMgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAotLyogMHhFMCAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCi0vKiAweEU0ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKLS8qIDB4RTggKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULAotLyogMHhFQyAqLyBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsCi0vKiAweEYwICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKLS8qIDB4RjQgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfT1RIRVIsCi0vKiAweEY4ICovIEJUX05NU1RSVCwgQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwKLS8qIDB4RkMgKi8gQlRfTk1TVFJULCBCVF9OTVNUUlQsIEJUX05NU1RSVCwgQlRfTk1TVFJULApkaWZmIC0tZ2l0IGEvc3JjbGliL2V4cGF0LWxpdGUvbmFtZXRhYi5oIGIvc3JjbGliL2V4cGF0LWxpdGUvbmFtZXRhYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDVlNjJjLi4wMDAwMDAwCi0tLSBhL3NyY2xpYi9leHBhdC1saXRlL25hbWV0YWIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi1zdGF0aWMgY29uc3QgdW5zaWduZWQgbmFtaW5nQml0bWFwW10gPSB7Ci0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsCi0weEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLAotMHgwMDAwMDAwMCwgMHgwNDAwMDAwMCwgMHg4N0ZGRkZGRSwgMHgwN0ZGRkZGRSwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4RkY3RkZGRkYsIDB4RkY3RkZGRkYsCi0weEZGRkZGRkZGLCAweDdGRjNGRkZGLCAweEZGRkZGREZFLCAweDdGRkZGRkZGLAotMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHhGRkZGRTAwRiwgMHhGQzMxRkZGRiwKLTB4MDBGRkZGRkYsIDB4MDAwMDAwMDAsIDB4RkZGRjAwMDAsIDB4RkZGRkZGRkYsCi0weEZGRkZGRkZGLCAweEY4MDAwMUZGLCAweDAwMDAwMDAzLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4RkZGRkQ3NDAsIDB4RkZGRkZGRkIsIDB4NTQ3RjdGRkYsIDB4MDAwRkZGRkQsCi0weEZGRkZERkZFLCAweEZGRkZGRkZGLCAweERGRkVGRkZGLCAweEZGRkZGRkZGLAotMHhGRkZGMDAwMywgMHhGRkZGRkZGRiwgMHhGRkZGMTk5RiwgMHgwMzNGQ0ZGRiwKLTB4MDAwMDAwMDAsIDB4RkZGRTAwMDAsIDB4MDI3RkZGRkYsIDB4RkZGRkZGRkUsCi0weDAwMDAwMDdGLCAweDAwMDAwMDAwLCAweEZGRkYwMDAwLCAweDAwMDcwN0ZGLAotMHgwMDAwMDAwMCwgMHgwN0ZGRkZGRSwgMHgwMDAwMDdGRSwgMHhGRkZFMDAwMCwKLTB4RkZGRkZGRkYsIDB4N0NGRkZGRkYsIDB4MDAyRjdGRkYsIDB4MDAwMDAwNjAsCi0weEZGRkZGRkUwLCAweDIzRkZGRkZGLCAweEZGMDAwMDAwLCAweDAwMDAwMDAzLAotMHhGRkY5OUZFMCwgMHgwM0M1RkRGRiwgMHhCMDAwMDAwMCwgMHgwMDAzMDAwMywKLTB4RkZGOTg3RTAsIDB4MDM2REZERkYsIDB4NUUwMDAwMDAsIDB4MDAxQzAwMDAsCi0weEZGRkJBRkUwLCAweDIzRURGREZGLCAweDAwMDAwMDAwLCAweDAwMDAwMDAxLAotMHhGRkY5OUZFMCwgMHgyM0NERkRGRiwgMHhCMDAwMDAwMCwgMHgwMDAwMDAwMywKLTB4RDYzREM3RTAsIDB4MDNCRkM3MTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weEZGRkRERkUwLCAweDAzRUZGREZGLCAweDAwMDAwMDAwLCAweDAwMDAwMDAzLAotMHhGRkZEREZFMCwgMHgwM0VGRkRGRiwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMywKLTB4RkZGRERGRTAsIDB4MDNGRkZERkYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDMsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHhGRkZGRkZGRSwgMHgwMDBEN0ZGRiwgMHgwMDAwMDAzRiwgMHgwMDAwMDAwMCwKLTB4RkVGMDI1OTYsIDB4MjAwRDZDQUUsIDB4MDAwMDAwMUYsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweEZGRkZGRUZGLCAweDAwMDAwM0ZGLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweEZGRkZGRkZGLCAweEZGRkYwMDNGLCAweDAwN0ZGRkZGLAotMHgwMDA3REFFRCwgMHg1MDAwMDAwMCwgMHg4MjMxNTAwMSwgMHgwMDJDNjJBQiwKLTB4NDAwMDAwMDAsIDB4RjU4MEM5MDAsIDB4MDAwMDAwMDcsIDB4MDIwMTA4MDAsCi0weEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLAotMHgwRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHgwM0ZGRkZGRiwKLTB4M0YzRkZGRkYsIDB4RkZGRkZGRkYsIDB4QUFGRjNGM0YsIDB4M0ZGRkZGRkYsCi0weEZGRkZGRkZGLCAweDVGREZGRkZGLCAweDBGQ0YxRkRDLCAweDFGREMxRkZGLAotMHgwMDAwMDAwMCwgMHgwMDAwNEM0MCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDcsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDgwLCAweDAwMDAwM0ZFLCAweEZGRkZGRkZFLCAweEZGRkZGRkZGLAotMHgwMDFGRkZGRiwgMHhGRkZGRkZGRSwgMHhGRkZGRkZGRiwgMHgwN0ZGRkZGRiwKLTB4RkZGRkZGRTAsIDB4MDAwMDFGRkYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwKLTB4RkZGRkZGRkYsIDB4MDAwMDAwM0YsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLAotMHhGRkZGRkZGRiwgMHgwMDAwMDAwRiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDdGRjYwMDAsIDB4ODdGRkZGRkUsIDB4MDdGRkZGRkUsCi0weDAwMDAwMDAwLCAweDAwODAwMDAwLCAweEZGN0ZGRkZGLCAweEZGN0ZGRkZGLAotMHgwMEZGRkZGRiwgMHgwMDAwMDAwMCwgMHhGRkZGMDAwMCwgMHhGRkZGRkZGRiwKLTB4RkZGRkZGRkYsIDB4RjgwMDAxRkYsIDB4MDAwMzAwMDMsIDB4MDAwMDAwMDAsCi0weEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweDAwMDAwMDNGLCAweDAwMDAwMDAzLAotMHhGRkZGRDdDMCwgMHhGRkZGRkZGQiwgMHg1NDdGN0ZGRiwgMHgwMDBGRkZGRCwKLTB4RkZGRkRGRkUsIDB4RkZGRkZGRkYsIDB4REZGRUZGRkYsIDB4RkZGRkZGRkYsCi0weEZGRkYwMDdCLCAweEZGRkZGRkZGLCAweEZGRkYxOTlGLCAweDAzM0ZDRkZGLAotMHgwMDAwMDAwMCwgMHhGRkZFMDAwMCwgMHgwMjdGRkZGRiwgMHhGRkZGRkZGRSwKLTB4RkZGRTAwN0YsIDB4QkJGRkZGRkIsIDB4RkZGRjAwMTYsIDB4MDAwNzA3RkYsCi0weDAwMDAwMDAwLCAweDA3RkZGRkZFLCAweDAwMDdGRkZGLCAweEZGRkYwM0ZGLAotMHhGRkZGRkZGRiwgMHg3Q0ZGRkZGRiwgMHhGRkVGN0ZGRiwgMHgwM0ZGM0RGRiwKLTB4RkZGRkZGRUUsIDB4RjNGRkZGRkYsIDB4RkYxRTNGRkYsIDB4MDAwMEZGQ0YsCi0weEZGRjk5RkVFLCAweEQzQzVGREZGLCAweEIwODAzOTlGLCAweDAwMDNGRkNGLAotMHhGRkY5ODdFNCwgMHhEMzZERkRGRiwgMHg1RTAwMzk4NywgMHgwMDFGRkZDMCwKLTB4RkZGQkFGRUUsIDB4RjNFREZERkYsIDB4MDAwMDNCQkYsIDB4MDAwMEZGQzEsCi0weEZGRjk5RkVFLCAweEYzQ0RGREZGLCAweEIwQzAzOThGLCAweDAwMDBGRkMzLAotMHhENjNEQzdFQywgMHhDM0JGQzcxOCwgMHgwMDgwM0RDNywgMHgwMDAwRkY4MCwKLTB4RkZGRERGRUUsIDB4QzNFRkZERkYsIDB4MDA2MDNEREYsIDB4MDAwMEZGQzMsCi0weEZGRkRERkVDLCAweEMzRUZGREZGLCAweDQwNjAzRERGLCAweDAwMDBGRkMzLAotMHhGRkZEREZFQywgMHhDM0ZGRkRGRiwgMHgwMDgwM0RDRiwgMHgwMDAwRkZDMywKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weEZGRkZGRkZFLCAweDA3RkY3RkZGLCAweDAzRkY3RkZGLCAweDAwMDAwMDAwLAotMHhGRUYwMjU5NiwgMHgzQkZGNkNBRSwgMHgwM0ZGM0Y1RiwgMHgwMDAwMDAwMCwKLTB4MDMwMDAwMDAsIDB4QzJBMDAzRkYsIDB4RkZGRkZFRkYsIDB4RkZGRTAzRkYsCi0weEZFQkYwRkRGLCAweDAyRkUzRkZGLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MUZGRjAwMDAsIDB4MDAwMDAwMDIsCi0weDAwMDAwMEEwLCAweDAwM0VGRkZFLCAweEZGRkZGRkZFLCAweEZGRkZGRkZGLAotMHg2NjFGRkZGRiwgMHhGRkZGRkZGRSwgMHhGRkZGRkZGRiwgMHg3N0ZGRkZGRiwKLX07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBubXN0cnRQYWdlc1tdID0gewotMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwMCwKLTB4MDAsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYsCi0weDEwLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMiwgMHgxMywKLTB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgxNSwgMHgxNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwKLTB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCi0weDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAotMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKLTB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCi0weDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAotMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKLTB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCi0weDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAotMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKLTB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MTcsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKLTB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCi0weDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAotMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKLTB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCi0weDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDE4LAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi19Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbmFtZVBhZ2VzW10gPSB7Ci0weDE5LCAweDAzLCAweDFBLCAweDFCLCAweDFDLCAweDFELCAweDFFLCAweDAwLAotMHgwMCwgMHgxRiwgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwKLTB4MTAsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEyLCAweDEzLAotMHgyNiwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDI3LCAweDE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLAotMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKLTB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCi0weDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAotMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKLTB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCi0weDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAotMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKLTB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCi0weDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAotMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgxNywKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAotMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKLTB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCi0weDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAotMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKLTB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MTgsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0weDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLX07CmRpZmYgLS1naXQgYS9zcmNsaWIvZXhwYXQtbGl0ZS91dGY4dGFiLmggYi9zcmNsaWIvZXhwYXQtbGl0ZS91dGY4dGFiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOGZlNjIuLjAwMDAwMDAKLS0tIGEvc3JjbGliL2V4cGF0LWxpdGUvdXRmOHRhYi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLVRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UKLVZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4KLWNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KLQotU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIgotYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLUxpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLVRoZSBPcmlnaW5hbCBDb2RlIGlzIGV4cGF0LgotCi1UaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgSmFtZXMgQ2xhcmsuCi1Qb3J0aW9ucyBjcmVhdGVkIGJ5IEphbWVzIENsYXJrIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkKLUphbWVzIENsYXJrLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1Db250cmlidXRvcihzKToKLQotQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMKLW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAodGhlICJHUEwiKSwgaW4gd2hpY2ggY2FzZSB0aGUKLXByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRob3NlIGFib3ZlLiAgSWYgeW91Ci13aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCi10aGUgTVBMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZAotcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUKLUdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UKLXlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4KLSovCi0KLQotLyogMHg4MCAqLyBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwKLS8qIDB4ODQgKi8gQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsCi0vKiAweDg4ICovIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLAotLyogMHg4QyAqLyBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwKLS8qIDB4OTAgKi8gQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsCi0vKiAweDk0ICovIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLAotLyogMHg5OCAqLyBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwKLS8qIDB4OUMgKi8gQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsCi0vKiAweEEwICovIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLAotLyogMHhBNCAqLyBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwKLS8qIDB4QTggKi8gQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsCi0vKiAweEFDICovIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLAotLyogMHhCMCAqLyBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwKLS8qIDB4QjQgKi8gQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsCi0vKiAweEI4ICovIEJUX1RSQUlMLCBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLAotLyogMHhCQyAqLyBCVF9UUkFJTCwgQlRfVFJBSUwsIEJUX1RSQUlMLCBCVF9UUkFJTCwKLS8qIDB4QzAgKi8gQlRfTEVBRDIsIEJUX0xFQUQyLCBCVF9MRUFEMiwgQlRfTEVBRDIsCi0vKiAweEM0ICovIEJUX0xFQUQyLCBCVF9MRUFEMiwgQlRfTEVBRDIsIEJUX0xFQUQyLAotLyogMHhDOCAqLyBCVF9MRUFEMiwgQlRfTEVBRDIsIEJUX0xFQUQyLCBCVF9MRUFEMiwKLS8qIDB4Q0MgKi8gQlRfTEVBRDIsIEJUX0xFQUQyLCBCVF9MRUFEMiwgQlRfTEVBRDIsCi0vKiAweEQwICovIEJUX0xFQUQyLCBCVF9MRUFEMiwgQlRfTEVBRDIsIEJUX0xFQUQyLAotLyogMHhENCAqLyBCVF9MRUFEMiwgQlRfTEVBRDIsIEJUX0xFQUQyLCBCVF9MRUFEMiwKLS8qIDB4RDggKi8gQlRfTEVBRDIsIEJUX0xFQUQyLCBCVF9MRUFEMiwgQlRfTEVBRDIsCi0vKiAweERDICovIEJUX0xFQUQyLCBCVF9MRUFEMiwgQlRfTEVBRDIsIEJUX0xFQUQyLAotLyogMHhFMCAqLyBCVF9MRUFEMywgQlRfTEVBRDMsIEJUX0xFQUQzLCBCVF9MRUFEMywKLS8qIDB4RTQgKi8gQlRfTEVBRDMsIEJUX0xFQUQzLCBCVF9MRUFEMywgQlRfTEVBRDMsCi0vKiAweEU4ICovIEJUX0xFQUQzLCBCVF9MRUFEMywgQlRfTEVBRDMsIEJUX0xFQUQzLAotLyogMHhFQyAqLyBCVF9MRUFEMywgQlRfTEVBRDMsIEJUX0xFQUQzLCBCVF9MRUFEMywKLS8qIDB4RjAgKi8gQlRfTEVBRDQsIEJUX0xFQUQ0LCBCVF9MRUFENCwgQlRfTEVBRDQsCi0vKiAweEY0ICovIEJUX0xFQUQ0LCBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLAotLyogMHhGOCAqLyBCVF9OT05YTUwsIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9OT05YTUwsCi0vKiAweEZDICovIEJUX05PTlhNTCwgQlRfTk9OWE1MLCBCVF9NQUxGT1JNLCBCVF9NQUxGT1JNLApkaWZmIC0tZ2l0IGEvc3JjbGliL2V4cGF0LWxpdGUveG1sZGVmLmggYi9zcmNsaWIvZXhwYXQtbGl0ZS94bWxkZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljZTllZC4uMDAwMDAwMAotLS0gYS9zcmNsaWIvZXhwYXQtbGl0ZS94bWxkZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi1UaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlCi1WZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluCi1jb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCi0KLVNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIKLWJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi1MaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1UaGUgT3JpZ2luYWwgQ29kZSBpcyBleHBhdC4KLQotVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIEphbWVzIENsYXJrLgotUG9ydGlvbnMgY3JlYXRlZCBieSBKYW1lcyBDbGFyayBhcmUgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5Ci1KYW1lcyBDbGFyay4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotQ29udHJpYnV0b3Iocyk6Ci0KLUFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zCi1vZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKHRoZSAiR1BMIiksIGluIHdoaWNoIGNhc2UgdGhlCi1wcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aG9zZSBhYm92ZS4gIElmIHlvdQotd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgotdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQKLXJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlCi1HUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlCi15b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCi0qLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpZmRlZiBYTUxfV0lOTElCCi0KLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgotI2RlZmluZSBTVFJJQ1QKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNkZWZpbmUgbWFsbG9jKHgpIEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCAoeCkpCi0jZGVmaW5lIGNhbGxvYyh4LCB5KSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgKHgpKih5KSkKLSNkZWZpbmUgZnJlZSh4KSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCAoeCkpCi0jZGVmaW5lIHJlYWxsb2MoeCwgeSkgSGVhcFJlQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgeCwgeSkKLSNkZWZpbmUgYWJvcnQoKSAvKiBhcyBub3RoaW5nICovCi0KLSNlbHNlIC8qIG5vdCBYTUxfV0lOTElCICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2VuZGlmIC8qIG5vdCBYTUxfV0lOTElCICovCi0KLS8qIFRoaXMgZmlsZSBjYW4gYmUgdXNlZCBmb3IgYW55IGRlZmluaXRpb25zIG5lZWRlZCBpbgotcGFydGljdWxhciBlbnZpcm9ubWVudHMuICovCi0KLSNpZmRlZiBNT1pJTExBCi0KLSNpbmNsdWRlICJuc3ByLmgiCi0jZGVmaW5lIG1hbGxvYyh4KSBQUl9NYWxsb2MoeCkKLSNkZWZpbmUgcmVhbGxvYyh4LCB5KSBQUl9SZWFsbG9jKCh4KSwgKHkpKQotI2RlZmluZSBjYWxsb2MoeCwgeSkgUFJfQ2FsbG9jKCh4KSwoeSkpCi0jZGVmaW5lIGZyZWUoeCkgUFJfRnJlZSh4KQotI2RlZmluZSBpbnQgaW50MzIKLQotI2VuZGlmIC8qIE1PWklMTEEgKi8KZGlmZiAtLWdpdCBhL3NyY2xpYi9leHBhdC1saXRlL3htbHBhcnNlLmMgYi9zcmNsaWIvZXhwYXQtbGl0ZS94bWxwYXJzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjlkMDljLi4wMDAwMDAwCi0tLSBhL3NyY2xpYi9leHBhdC1saXRlL3htbHBhcnNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjU2ICswLDAgQEAKLS8qCi1UaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlCi1WZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluCi1jb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCi0KLVNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIKLWJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi1MaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1UaGUgT3JpZ2luYWwgQ29kZSBpcyBleHBhdC4KLQotVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIEphbWVzIENsYXJrLgotUG9ydGlvbnMgY3JlYXRlZCBieSBKYW1lcyBDbGFyayBhcmUgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5Ci1KYW1lcyBDbGFyay4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotQ29udHJpYnV0b3Iocyk6Ci0KLUFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zCi1vZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKHRoZSAiR1BMIiksIGluIHdoaWNoIGNhc2UgdGhlCi1wcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aG9zZSBhYm92ZS4gIElmIHlvdQotd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgotdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQKLXJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlCi1HUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlCi15b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCi0qLwotCi0jaW5jbHVkZSAieG1sZGVmLmgiCi0jaW5jbHVkZSAieG1scGFyc2UuaCIKLQotI2lmZGVmIFhNTF9VTklDT0RFCi0jZGVmaW5lIFhNTF9FTkNPREVfTUFYIFhNTF9VVEYxNl9FTkNPREVfTUFYCi0jZGVmaW5lIFhtbENvbnZlcnQgWG1sVXRmMTZDb252ZXJ0Ci0jZGVmaW5lIFhtbEdldEludGVybmFsRW5jb2RpbmcgWG1sR2V0VXRmMTZJbnRlcm5hbEVuY29kaW5nCi0jZGVmaW5lIFhtbEdldEludGVybmFsRW5jb2RpbmdOUyBYbWxHZXRVdGYxNkludGVybmFsRW5jb2RpbmdOUwotI2RlZmluZSBYbWxFbmNvZGUgWG1sVXRmMTZFbmNvZGUKLSNkZWZpbmUgTVVTVF9DT05WRVJUKGVuYywgcykgKCEoZW5jKS0+aXNVdGYxNiB8fCAoKCh1bnNpZ25lZCBsb25nKXMpICYgMSkpCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IElDSEFSOwotI2Vsc2UKLSNkZWZpbmUgWE1MX0VOQ09ERV9NQVggWE1MX1VURjhfRU5DT0RFX01BWAotI2RlZmluZSBYbWxDb252ZXJ0IFhtbFV0ZjhDb252ZXJ0Ci0jZGVmaW5lIFhtbEdldEludGVybmFsRW5jb2RpbmcgWG1sR2V0VXRmOEludGVybmFsRW5jb2RpbmcKLSNkZWZpbmUgWG1sR2V0SW50ZXJuYWxFbmNvZGluZ05TIFhtbEdldFV0ZjhJbnRlcm5hbEVuY29kaW5nTlMKLSNkZWZpbmUgWG1sRW5jb2RlIFhtbFV0ZjhFbmNvZGUKLSNkZWZpbmUgTVVTVF9DT05WRVJUKGVuYywgcykgKCEoZW5jKS0+aXNVdGY4KQotdHlwZWRlZiBjaGFyIElDSEFSOwotI2VuZGlmCi0KLQotI2lmbmRlZiBYTUxfTlMKLQotI2RlZmluZSBYbWxJbml0RW5jb2RpbmdOUyBYbWxJbml0RW5jb2RpbmcKLSNkZWZpbmUgWG1sSW5pdFVua25vd25FbmNvZGluZ05TIFhtbEluaXRVbmtub3duRW5jb2RpbmcKLSN1bmRlZiBYbWxHZXRJbnRlcm5hbEVuY29kaW5nTlMKLSNkZWZpbmUgWG1sR2V0SW50ZXJuYWxFbmNvZGluZ05TIFhtbEdldEludGVybmFsRW5jb2RpbmcKLSNkZWZpbmUgWG1sUGFyc2VYbWxEZWNsTlMgWG1sUGFyc2VYbWxEZWNsCi0KLSNlbmRpZgotCi0KLSNpZmRlZiBYTUxfVU5JQ09ERV9XQ0hBUl9UCi0jZGVmaW5lIFhNTF9UKHgpIEwgIyMgeAotI2Vsc2UKLSNkZWZpbmUgWE1MX1QoeCkgeAotI2VuZGlmCi0KLS8qIFJvdW5kIHVwIG4gdG8gYmUgYSBtdWx0aXBsZSBvZiBzeiwgd2hlcmUgc3ogaXMgYSBwb3dlciBvZiAyLiAqLwotI2RlZmluZSBST1VORF9VUChuLCBzeikgKCgobikgKyAoKHN6KSAtIDEpKSAmIH4oKHN6KSAtIDEpKQotCi0jaW5jbHVkZSAieG1sdG9rLmgiCi0jaW5jbHVkZSAieG1scm9sZS5oIgotI2luY2x1ZGUgImhhc2h0YWJsZS5oIgotCi0jZGVmaW5lIElOSVRfVEFHX0JVRl9TSVpFIDMyICAvKiBtdXN0IGJlIGEgbXVsdGlwbGUgb2Ygc2l6ZW9mKFhNTF9DaGFyKSAqLwotI2RlZmluZSBJTklUX0RBVEFfQlVGX1NJWkUgMTAyNAotI2RlZmluZSBJTklUX0FUVFNfU0laRSAxNgotI2RlZmluZSBJTklUX0JMT0NLX1NJWkUgMTAyNAotI2RlZmluZSBJTklUX0JVRkZFUl9TSVpFIDEwMjQKLQotI2RlZmluZSBFWFBBTkRfU1BBUkUgMjQKLQotdHlwZWRlZiBzdHJ1Y3QgYmluZGluZyB7Ci0gIHN0cnVjdCBwcmVmaXggKnByZWZpeDsKLSAgc3RydWN0IGJpbmRpbmcgKm5leHRUYWdCaW5kaW5nOwotICBzdHJ1Y3QgYmluZGluZyAqcHJldlByZWZpeEJpbmRpbmc7Ci0gIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfaWQgKmF0dElkOwotICBYTUxfQ2hhciAqdXJpOwotICBpbnQgdXJpTGVuOwotICBpbnQgdXJpQWxsb2M7Ci19IEJJTkRJTkc7Ci0KLXR5cGVkZWYgc3RydWN0IHByZWZpeCB7Ci0gIGNvbnN0IFhNTF9DaGFyICpuYW1lOwotICBCSU5ESU5HICpiaW5kaW5nOwotfSBQUkVGSVg7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY29uc3QgWE1MX0NoYXIgKnN0cjsKLSAgY29uc3QgWE1MX0NoYXIgKmxvY2FsUGFydDsKLSAgaW50IHVyaUxlbjsKLX0gVEFHX05BTUU7Ci0KLXR5cGVkZWYgc3RydWN0IHRhZyB7Ci0gIHN0cnVjdCB0YWcgKnBhcmVudDsKLSAgY29uc3QgY2hhciAqcmF3TmFtZTsKLSAgaW50IHJhd05hbWVMZW5ndGg7Ci0gIFRBR19OQU1FIG5hbWU7Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciAqYnVmRW5kOwotICBCSU5ESU5HICpiaW5kaW5nczsKLX0gVEFHOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNvbnN0IFhNTF9DaGFyICpuYW1lOwotICBjb25zdCBYTUxfQ2hhciAqdGV4dFB0cjsKLSAgaW50IHRleHRMZW47Ci0gIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZDsKLSAgY29uc3QgWE1MX0NoYXIgKmJhc2U7Ci0gIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZDsKLSAgY29uc3QgWE1MX0NoYXIgKm5vdGF0aW9uOwotICBjaGFyIG9wZW47Ci19IEVOVElUWTsKLQotdHlwZWRlZiBzdHJ1Y3QgYmxvY2sgewotICBzdHJ1Y3QgYmxvY2sgKm5leHQ7Ci0gIGludCBzaXplOwotICBYTUxfQ2hhciBzWzFdOwotfSBCTE9DSzsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBCTE9DSyAqYmxvY2tzOwotICBCTE9DSyAqZnJlZUJsb2NrczsKLSAgY29uc3QgWE1MX0NoYXIgKmVuZDsKLSAgWE1MX0NoYXIgKnB0cjsKLSAgWE1MX0NoYXIgKnN0YXJ0OwotfSBTVFJJTkdfUE9PTDsKLQotLyogVGhlIFhNTF9DaGFyIGJlZm9yZSB0aGUgbmFtZSBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyCi1hbiBhdHRyaWJ1dGUgaGFzIGJlZW4gc3BlY2lmaWVkLiAqLwotdHlwZWRlZiBzdHJ1Y3QgYXR0cmlidXRlX2lkIHsKLSAgWE1MX0NoYXIgKm5hbWU7Ci0gIFBSRUZJWCAqcHJlZml4OwotICBjaGFyIG1heWJlVG9rZW5pemVkOwotICBjaGFyIHhtbG5zOwotfSBBVFRSSUJVVEVfSUQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY29uc3QgQVRUUklCVVRFX0lEICppZDsKLSAgY2hhciBpc0NkYXRhOwotICBjb25zdCBYTUxfQ2hhciAqdmFsdWU7Ci19IERFRkFVTFRfQVRUUklCVVRFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNvbnN0IFhNTF9DaGFyICpuYW1lOwotICBQUkVGSVggKnByZWZpeDsKLSAgaW50IG5EZWZhdWx0QXR0czsKLSAgaW50IGFsbG9jRGVmYXVsdEF0dHM7Ci0gIERFRkFVTFRfQVRUUklCVVRFICpkZWZhdWx0QXR0czsKLX0gRUxFTUVOVF9UWVBFOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEhBU0hfVEFCTEUgZ2VuZXJhbEVudGl0aWVzOwotICBIQVNIX1RBQkxFIGVsZW1lbnRUeXBlczsKLSAgSEFTSF9UQUJMRSBhdHRyaWJ1dGVJZHM7Ci0gIEhBU0hfVEFCTEUgcHJlZml4ZXM7Ci0gIFNUUklOR19QT09MIHBvb2w7Ci0gIGludCBjb21wbGV0ZTsKLSAgaW50IHN0YW5kYWxvbmU7Ci0gIGNvbnN0IFhNTF9DaGFyICpiYXNlOwotICBQUkVGSVggZGVmYXVsdFByZWZpeDsKLX0gRFREOwotCi10eXBlZGVmIHN0cnVjdCBvcGVuX2ludGVybmFsX2VudGl0eSB7Ci0gIGNvbnN0IGNoYXIgKmludGVybmFsRXZlbnRQdHI7Ci0gIGNvbnN0IGNoYXIgKmludGVybmFsRXZlbnRFbmRQdHI7Ci0gIHN0cnVjdCBvcGVuX2ludGVybmFsX2VudGl0eSAqbmV4dDsKLSAgRU5USVRZICplbnRpdHk7Ci19IE9QRU5fSU5URVJOQUxfRU5USVRZOwotCi10eXBlZGVmIGVudW0gWE1MX0Vycm9yIFByb2Nlc3NvcihYTUxfUGFyc2VyIHBhcnNlciwKLQkJCQkgY29uc3QgY2hhciAqc3RhcnQsCi0JCQkJIGNvbnN0IGNoYXIgKmVuZCwKLQkJCQkgY29uc3QgY2hhciAqKmVuZFB0cik7Ci0KLXN0YXRpYyBQcm9jZXNzb3IgcHJvbG9nUHJvY2Vzc29yOwotc3RhdGljIFByb2Nlc3NvciBwcm9sb2dJbml0UHJvY2Vzc29yOwotc3RhdGljIFByb2Nlc3NvciBjb250ZW50UHJvY2Vzc29yOwotc3RhdGljIFByb2Nlc3NvciBjZGF0YVNlY3Rpb25Qcm9jZXNzb3I7Ci1zdGF0aWMgUHJvY2Vzc29yIGVwaWxvZ1Byb2Nlc3NvcjsKLSNpZiAwCi1zdGF0aWMgUHJvY2Vzc29yIGVycm9yUHJvY2Vzc29yOwotI2VuZGlmCi1zdGF0aWMgUHJvY2Vzc29yIGV4dGVybmFsRW50aXR5SW5pdFByb2Nlc3NvcjsKLXN0YXRpYyBQcm9jZXNzb3IgZXh0ZXJuYWxFbnRpdHlJbml0UHJvY2Vzc29yMjsKLXN0YXRpYyBQcm9jZXNzb3IgZXh0ZXJuYWxFbnRpdHlJbml0UHJvY2Vzc29yMzsKLXN0YXRpYyBQcm9jZXNzb3IgZXh0ZXJuYWxFbnRpdHlDb250ZW50UHJvY2Vzc29yOwotCi1zdGF0aWMgZW51bSBYTUxfRXJyb3IKLWhhbmRsZVVua25vd25FbmNvZGluZyhYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nTmFtZSk7Ci1zdGF0aWMgZW51bSBYTUxfRXJyb3IKLXByb2Nlc3NYbWxEZWNsKFhNTF9QYXJzZXIgcGFyc2VyLCBpbnQgaXNHZW5lcmFsVGV4dEVudGl0eSwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotc3RhdGljIGVudW0gWE1MX0Vycm9yCi1pbml0aWFsaXplRW5jb2RpbmcoWE1MX1BhcnNlciBwYXJzZXIpOwotc3RhdGljIGVudW0gWE1MX0Vycm9yCi1kb0NvbnRlbnQoWE1MX1BhcnNlciBwYXJzZXIsIGludCBzdGFydFRhZ0xldmVsLCBjb25zdCBFTkNPRElORyAqZW5jLAotCSAgY29uc3QgY2hhciAqc3RhcnQsIGNvbnN0IGNoYXIgKmVuZCwgY29uc3QgY2hhciAqKmVuZFB0cik7Ci1zdGF0aWMgZW51bSBYTUxfRXJyb3IKLWRvQ2RhdGFTZWN0aW9uKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBFTkNPRElORyAqLCBjb25zdCBjaGFyICoqc3RhcnRQdHIsIGNvbnN0IGNoYXIgKmVuZCwgY29uc3QgY2hhciAqKm5leHRQdHIpOwotc3RhdGljIGVudW0gWE1MX0Vycm9yIHN0b3JlQXR0cyhYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqcywKLQkJCQlUQUdfTkFNRSAqdGFnTmFtZVB0ciwgQklORElORyAqKmJpbmRpbmdzUHRyKTsKLXN0YXRpYwotaW50IGFkZEJpbmRpbmcoWE1MX1BhcnNlciBwYXJzZXIsIFBSRUZJWCAqcHJlZml4LCBjb25zdCBBVFRSSUJVVEVfSUQgKmF0dElkLCBjb25zdCBYTUxfQ2hhciAqdXJpLCBCSU5ESU5HICoqYmluZGluZ3NQdHIpOwotc3RhdGljIGludAotZGVmaW5lQXR0cmlidXRlKEVMRU1FTlRfVFlQRSAqdHlwZSwgQVRUUklCVVRFX0lEICosIGludCBpc0NkYXRhLCBjb25zdCBYTUxfQ2hhciAqZGZsdFZhbHVlKTsKLXN0YXRpYyBlbnVtIFhNTF9FcnJvcgotc3RvcmVBdHRyaWJ1dGVWYWx1ZShYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKiwgaW50IGlzQ2RhdGEsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAotCQkgICAgU1RSSU5HX1BPT0wgKik7Ci1zdGF0aWMgZW51bSBYTUxfRXJyb3IKLWFwcGVuZEF0dHJpYnV0ZVZhbHVlKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBFTkNPRElORyAqLCBpbnQgaXNDZGF0YSwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCi0JCSAgICBTVFJJTkdfUE9PTCAqKTsKLXN0YXRpYyBBVFRSSUJVVEVfSUQgKgotZ2V0QXR0cmlidXRlSWQoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnN0YXJ0LCBjb25zdCBjaGFyICplbmQpOwotc3RhdGljIGludCBzZXRFbGVtZW50VHlwZVByZWZpeChYTUxfUGFyc2VyIHBhcnNlciwgRUxFTUVOVF9UWVBFICopOwotc3RhdGljIGVudW0gWE1MX0Vycm9yCi1zdG9yZUVudGl0eVZhbHVlKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBjaGFyICpzdGFydCwgY29uc3QgY2hhciAqZW5kKTsKLXN0YXRpYyBpbnQKLXJlcG9ydFByb2Nlc3NpbmdJbnN0cnVjdGlvbihYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqc3RhcnQsIGNvbnN0IGNoYXIgKmVuZCk7Ci1zdGF0aWMgaW50Ci1yZXBvcnRDb21tZW50KFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpzdGFydCwgY29uc3QgY2hhciAqZW5kKTsKLXN0YXRpYyB2b2lkCi1yZXBvcnREZWZhdWx0KFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpzdGFydCwgY29uc3QgY2hhciAqZW5kKTsKLQotc3RhdGljIGNvbnN0IFhNTF9DaGFyICpnZXRDb250ZXh0KFhNTF9QYXJzZXIgcGFyc2VyKTsKLXN0YXRpYyBpbnQgc2V0Q29udGV4dChYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgWE1MX0NoYXIgKmNvbnRleHQpOwotc3RhdGljIHZvaWQgbm9ybWFsaXplUHVibGljSWQoWE1MX0NoYXIgKnMpOwotc3RhdGljIGludCBkdGRJbml0KERURCAqKTsKLXN0YXRpYyB2b2lkIGR0ZERlc3Ryb3koRFREICopOwotc3RhdGljIGludCBkdGRDb3B5KERURCAqbmV3RHRkLCBjb25zdCBEVEQgKm9sZER0ZCk7Ci1zdGF0aWMgdm9pZCBwb29sSW5pdChTVFJJTkdfUE9PTCAqKTsKLXN0YXRpYyB2b2lkIHBvb2xDbGVhcihTVFJJTkdfUE9PTCAqKTsKLXN0YXRpYyB2b2lkIHBvb2xEZXN0cm95KFNUUklOR19QT09MICopOwotc3RhdGljIFhNTF9DaGFyICpwb29sQXBwZW5kKFNUUklOR19QT09MICpwb29sLCBjb25zdCBFTkNPRElORyAqZW5jLAotCQkJICAgIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kKTsKLXN0YXRpYyBYTUxfQ2hhciAqcG9vbFN0b3JlU3RyaW5nKFNUUklOR19QT09MICpwb29sLCBjb25zdCBFTkNPRElORyAqZW5jLAotCQkJCSAgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQpOwotc3RhdGljIGludCBwb29sR3JvdyhTVFJJTkdfUE9PTCAqcG9vbCk7Ci1zdGF0aWMgY29uc3QgWE1MX0NoYXIgKnBvb2xDb3B5U3RyaW5nKFNUUklOR19QT09MICpwb29sLCBjb25zdCBYTUxfQ2hhciAqcyk7Ci1zdGF0aWMgY29uc3QgWE1MX0NoYXIgKnBvb2xDb3B5U3RyaW5nTihTVFJJTkdfUE9PTCAqcG9vbCwgY29uc3QgWE1MX0NoYXIgKnMsIGludCBuKTsKLQotI2RlZmluZSBwb29sU3RhcnQocG9vbCkgKChwb29sKS0+c3RhcnQpCi0jZGVmaW5lIHBvb2xFbmQocG9vbCkgKChwb29sKS0+cHRyKQotI2RlZmluZSBwb29sTGVuZ3RoKHBvb2wpICgocG9vbCktPnB0ciAtIChwb29sKS0+c3RhcnQpCi0jZGVmaW5lIHBvb2xDaG9wKHBvb2wpICgodm9pZCktLShwb29sLT5wdHIpKQotI2RlZmluZSBwb29sTGFzdENoYXIocG9vbCkgKCgocG9vbCktPnB0cilbLTFdKQotI2RlZmluZSBwb29sRGlzY2FyZChwb29sKSAoKHBvb2wpLT5wdHIgPSAocG9vbCktPnN0YXJ0KQotI2RlZmluZSBwb29sRmluaXNoKHBvb2wpICgocG9vbCktPnN0YXJ0ID0gKHBvb2wpLT5wdHIpCi0jZGVmaW5lIHBvb2xBcHBlbmRDaGFyKHBvb2wsIGMpIFwKLSAgKCgocG9vbCktPnB0ciA9PSAocG9vbCktPmVuZCAmJiAhcG9vbEdyb3cocG9vbCkpIFwKLSAgID8gMCBcCi0gICA6ICgoKigocG9vbCktPnB0cikrKyA9IGMpLCAxKSkKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBUaGUgZmlyc3QgbWVtYmVyIG11c3QgYmUgdXNlckRhdGEgc28gdGhhdCB0aGUgWE1MX0dldFVzZXJEYXRhIG1hY3JvIHdvcmtzLiAqLwotICB2b2lkICptX3VzZXJEYXRhOwotICB2b2lkICptX2hhbmRsZXJBcmc7Ci0gIGNoYXIgKm1fYnVmZmVyOwotICAvKiBmaXJzdCBjaGFyYWN0ZXIgdG8gYmUgcGFyc2VkICovCi0gIGNvbnN0IGNoYXIgKm1fYnVmZmVyUHRyOwotICAvKiBwYXN0IGxhc3QgY2hhcmFjdGVyIHRvIGJlIHBhcnNlZCAqLwotICBjaGFyICptX2J1ZmZlckVuZDsKLSAgLyogYWxsb2NhdGVkIGVuZCBvZiBidWZmZXIgKi8KLSAgY29uc3QgY2hhciAqbV9idWZmZXJMaW07Ci0gIGxvbmcgbV9wYXJzZUVuZEJ5dGVJbmRleDsKLSAgY29uc3QgY2hhciAqbV9wYXJzZUVuZFB0cjsKLSAgWE1MX0NoYXIgKm1fZGF0YUJ1ZjsKLSAgWE1MX0NoYXIgKm1fZGF0YUJ1ZkVuZDsKLSAgWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIgbV9zdGFydEVsZW1lbnRIYW5kbGVyOwotICBYTUxfRW5kRWxlbWVudEhhbmRsZXIgbV9lbmRFbGVtZW50SGFuZGxlcjsKLSAgWE1MX0NoYXJhY3RlckRhdGFIYW5kbGVyIG1fY2hhcmFjdGVyRGF0YUhhbmRsZXI7Ci0gIFhNTF9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyIG1fcHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcjsKLSAgWE1MX0NvbW1lbnRIYW5kbGVyIG1fY29tbWVudEhhbmRsZXI7Ci0gIFhNTF9TdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgbV9zdGFydENkYXRhU2VjdGlvbkhhbmRsZXI7Ci0gIFhNTF9FbmRDZGF0YVNlY3Rpb25IYW5kbGVyIG1fZW5kQ2RhdGFTZWN0aW9uSGFuZGxlcjsKLSAgWE1MX0RlZmF1bHRIYW5kbGVyIG1fZGVmYXVsdEhhbmRsZXI7Ci0gIFhNTF9VbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyIG1fdW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcjsKLSAgWE1MX05vdGF0aW9uRGVjbEhhbmRsZXIgbV9ub3RhdGlvbkRlY2xIYW5kbGVyOwotICBYTUxfU3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciBtX3N0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXI7Ci0gIFhNTF9FbmROYW1lc3BhY2VEZWNsSGFuZGxlciBtX2VuZE5hbWVzcGFjZURlY2xIYW5kbGVyOwotICBYTUxfTm90U3RhbmRhbG9uZUhhbmRsZXIgbV9ub3RTdGFuZGFsb25lSGFuZGxlcjsKLSAgWE1MX0V4dGVybmFsRW50aXR5UmVmSGFuZGxlciBtX2V4dGVybmFsRW50aXR5UmVmSGFuZGxlcjsKLSAgdm9pZCAqbV9leHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmc7Ci0gIFhNTF9Vbmtub3duRW5jb2RpbmdIYW5kbGVyIG1fdW5rbm93bkVuY29kaW5nSGFuZGxlcjsKLSAgY29uc3QgRU5DT0RJTkcgKm1fZW5jb2Rpbmc7Ci0gIElOSVRfRU5DT0RJTkcgbV9pbml0RW5jb2Rpbmc7Ci0gIGNvbnN0IFhNTF9DaGFyICptX3Byb3RvY29sRW5jb2RpbmdOYW1lOwotICBpbnQgbV9uczsKLSAgdm9pZCAqbV91bmtub3duRW5jb2RpbmdNZW07Ci0gIHZvaWQgKm1fdW5rbm93bkVuY29kaW5nRGF0YTsKLSAgdm9pZCAqbV91bmtub3duRW5jb2RpbmdIYW5kbGVyRGF0YTsKLSAgdm9pZCAoKm1fdW5rbm93bkVuY29kaW5nUmVsZWFzZSkodm9pZCAqKTsKLSAgUFJPTE9HX1NUQVRFIG1fcHJvbG9nU3RhdGU7Ci0gIFByb2Nlc3NvciAqbV9wcm9jZXNzb3I7Ci0gIGVudW0gWE1MX0Vycm9yIG1fZXJyb3JDb2RlOwotICBjb25zdCBjaGFyICptX2V2ZW50UHRyOwotICBjb25zdCBjaGFyICptX2V2ZW50RW5kUHRyOwotICBjb25zdCBjaGFyICptX3Bvc2l0aW9uUHRyOwotICBPUEVOX0lOVEVSTkFMX0VOVElUWSAqbV9vcGVuSW50ZXJuYWxFbnRpdGllczsKLSAgaW50IG1fZGVmYXVsdEV4cGFuZEludGVybmFsRW50aXRpZXM7Ci0gIGludCBtX3RhZ0xldmVsOwotICBFTlRJVFkgKm1fZGVjbEVudGl0eTsKLSAgY29uc3QgWE1MX0NoYXIgKm1fZGVjbE5vdGF0aW9uTmFtZTsKLSAgY29uc3QgWE1MX0NoYXIgKm1fZGVjbE5vdGF0aW9uUHVibGljSWQ7Ci0gIEVMRU1FTlRfVFlQRSAqbV9kZWNsRWxlbWVudFR5cGU7Ci0gIEFUVFJJQlVURV9JRCAqbV9kZWNsQXR0cmlidXRlSWQ7Ci0gIGNoYXIgbV9kZWNsQXR0cmlidXRlSXNDZGF0YTsKLSAgRFREIG1fZHRkOwotICBUQUcgKm1fdGFnU3RhY2s7Ci0gIFRBRyAqbV9mcmVlVGFnTGlzdDsKLSAgQklORElORyAqbV9pbmhlcml0ZWRCaW5kaW5nczsKLSAgQklORElORyAqbV9mcmVlQmluZGluZ0xpc3Q7Ci0gIGludCBtX2F0dHNTaXplOwotICBpbnQgbV9uU3BlY2lmaWVkQXR0czsKLSAgQVRUUklCVVRFICptX2F0dHM7Ci0gIFBPU0lUSU9OIG1fcG9zaXRpb247Ci0gIFNUUklOR19QT09MIG1fdGVtcFBvb2w7Ci0gIFNUUklOR19QT09MIG1fdGVtcDJQb29sOwotICBjaGFyICptX2dyb3VwQ29ubmVjdG9yOwotICB1bnNpZ25lZCBtX2dyb3VwU2l6ZTsKLSAgaW50IG1faGFkRXh0ZXJuYWxEb2N0eXBlOwotICBYTUxfQ2hhciBtX25hbWVzcGFjZVNlcGFyYXRvcjsKLX0gUGFyc2VyOwotCi0jZGVmaW5lIHVzZXJEYXRhICgoKFBhcnNlciAqKXBhcnNlciktPm1fdXNlckRhdGEpCi0jZGVmaW5lIGhhbmRsZXJBcmcgKCgoUGFyc2VyICopcGFyc2VyKS0+bV9oYW5kbGVyQXJnKQotI2RlZmluZSBzdGFydEVsZW1lbnRIYW5kbGVyICgoKFBhcnNlciAqKXBhcnNlciktPm1fc3RhcnRFbGVtZW50SGFuZGxlcikKLSNkZWZpbmUgZW5kRWxlbWVudEhhbmRsZXIgKCgoUGFyc2VyICopcGFyc2VyKS0+bV9lbmRFbGVtZW50SGFuZGxlcikKLSNkZWZpbmUgY2hhcmFjdGVyRGF0YUhhbmRsZXIgKCgoUGFyc2VyICopcGFyc2VyKS0+bV9jaGFyYWN0ZXJEYXRhSGFuZGxlcikKLSNkZWZpbmUgcHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciAoKChQYXJzZXIgKilwYXJzZXIpLT5tX3Byb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIpCi0jZGVmaW5lIGNvbW1lbnRIYW5kbGVyICgoKFBhcnNlciAqKXBhcnNlciktPm1fY29tbWVudEhhbmRsZXIpCi0jZGVmaW5lIHN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciAoKChQYXJzZXIgKilwYXJzZXIpLT5tX3N0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcikKLSNkZWZpbmUgZW5kQ2RhdGFTZWN0aW9uSGFuZGxlciAoKChQYXJzZXIgKilwYXJzZXIpLT5tX2VuZENkYXRhU2VjdGlvbkhhbmRsZXIpCi0jZGVmaW5lIGRlZmF1bHRIYW5kbGVyICgoKFBhcnNlciAqKXBhcnNlciktPm1fZGVmYXVsdEhhbmRsZXIpCi0jZGVmaW5lIHVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIgKCgoUGFyc2VyICopcGFyc2VyKS0+bV91bnBhcnNlZEVudGl0eURlY2xIYW5kbGVyKQotI2RlZmluZSBub3RhdGlvbkRlY2xIYW5kbGVyICgoKFBhcnNlciAqKXBhcnNlciktPm1fbm90YXRpb25EZWNsSGFuZGxlcikKLSNkZWZpbmUgc3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciAoKChQYXJzZXIgKilwYXJzZXIpLT5tX3N0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIpCi0jZGVmaW5lIGVuZE5hbWVzcGFjZURlY2xIYW5kbGVyICgoKFBhcnNlciAqKXBhcnNlciktPm1fZW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIpCi0jZGVmaW5lIG5vdFN0YW5kYWxvbmVIYW5kbGVyICgoKFBhcnNlciAqKXBhcnNlciktPm1fbm90U3RhbmRhbG9uZUhhbmRsZXIpCi0jZGVmaW5lIGV4dGVybmFsRW50aXR5UmVmSGFuZGxlciAoKChQYXJzZXIgKilwYXJzZXIpLT5tX2V4dGVybmFsRW50aXR5UmVmSGFuZGxlcikKLSNkZWZpbmUgZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnICgoKFBhcnNlciAqKXBhcnNlciktPm1fZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnKQotI2RlZmluZSB1bmtub3duRW5jb2RpbmdIYW5kbGVyICgoKFBhcnNlciAqKXBhcnNlciktPm1fdW5rbm93bkVuY29kaW5nSGFuZGxlcikKLSNkZWZpbmUgZW5jb2RpbmcgKCgoUGFyc2VyICopcGFyc2VyKS0+bV9lbmNvZGluZykKLSNkZWZpbmUgaW5pdEVuY29kaW5nICgoKFBhcnNlciAqKXBhcnNlciktPm1faW5pdEVuY29kaW5nKQotI2RlZmluZSB1bmtub3duRW5jb2RpbmdNZW0gKCgoUGFyc2VyICopcGFyc2VyKS0+bV91bmtub3duRW5jb2RpbmdNZW0pCi0jZGVmaW5lIHVua25vd25FbmNvZGluZ0RhdGEgKCgoUGFyc2VyICopcGFyc2VyKS0+bV91bmtub3duRW5jb2RpbmdEYXRhKQotI2RlZmluZSB1bmtub3duRW5jb2RpbmdIYW5kbGVyRGF0YSBcCi0gICgoKFBhcnNlciAqKXBhcnNlciktPm1fdW5rbm93bkVuY29kaW5nSGFuZGxlckRhdGEpCi0jZGVmaW5lIHVua25vd25FbmNvZGluZ1JlbGVhc2UgKCgoUGFyc2VyICopcGFyc2VyKS0+bV91bmtub3duRW5jb2RpbmdSZWxlYXNlKQotI2RlZmluZSBwcm90b2NvbEVuY29kaW5nTmFtZSAoKChQYXJzZXIgKilwYXJzZXIpLT5tX3Byb3RvY29sRW5jb2RpbmdOYW1lKQotI2RlZmluZSBucyAoKChQYXJzZXIgKilwYXJzZXIpLT5tX25zKQotI2RlZmluZSBwcm9sb2dTdGF0ZSAoKChQYXJzZXIgKilwYXJzZXIpLT5tX3Byb2xvZ1N0YXRlKQotI2RlZmluZSBwcm9jZXNzb3IgKCgoUGFyc2VyICopcGFyc2VyKS0+bV9wcm9jZXNzb3IpCi0jZGVmaW5lIGVycm9yQ29kZSAoKChQYXJzZXIgKilwYXJzZXIpLT5tX2Vycm9yQ29kZSkKLSNkZWZpbmUgZXZlbnRQdHIgKCgoUGFyc2VyICopcGFyc2VyKS0+bV9ldmVudFB0cikKLSNkZWZpbmUgZXZlbnRFbmRQdHIgKCgoUGFyc2VyICopcGFyc2VyKS0+bV9ldmVudEVuZFB0cikKLSNkZWZpbmUgcG9zaXRpb25QdHIgKCgoUGFyc2VyICopcGFyc2VyKS0+bV9wb3NpdGlvblB0cikKLSNkZWZpbmUgcG9zaXRpb24gKCgoUGFyc2VyICopcGFyc2VyKS0+bV9wb3NpdGlvbikKLSNkZWZpbmUgb3BlbkludGVybmFsRW50aXRpZXMgKCgoUGFyc2VyICopcGFyc2VyKS0+bV9vcGVuSW50ZXJuYWxFbnRpdGllcykKLSNkZWZpbmUgZGVmYXVsdEV4cGFuZEludGVybmFsRW50aXRpZXMgKCgoUGFyc2VyICopcGFyc2VyKS0+bV9kZWZhdWx0RXhwYW5kSW50ZXJuYWxFbnRpdGllcykKLSNkZWZpbmUgdGFnTGV2ZWwgKCgoUGFyc2VyICopcGFyc2VyKS0+bV90YWdMZXZlbCkKLSNkZWZpbmUgYnVmZmVyICgoKFBhcnNlciAqKXBhcnNlciktPm1fYnVmZmVyKQotI2RlZmluZSBidWZmZXJQdHIgKCgoUGFyc2VyICopcGFyc2VyKS0+bV9idWZmZXJQdHIpCi0jZGVmaW5lIGJ1ZmZlckVuZCAoKChQYXJzZXIgKilwYXJzZXIpLT5tX2J1ZmZlckVuZCkKLSNkZWZpbmUgcGFyc2VFbmRCeXRlSW5kZXggKCgoUGFyc2VyICopcGFyc2VyKS0+bV9wYXJzZUVuZEJ5dGVJbmRleCkKLSNkZWZpbmUgcGFyc2VFbmRQdHIgKCgoUGFyc2VyICopcGFyc2VyKS0+bV9wYXJzZUVuZFB0cikKLSNkZWZpbmUgYnVmZmVyTGltICgoKFBhcnNlciAqKXBhcnNlciktPm1fYnVmZmVyTGltKQotI2RlZmluZSBkYXRhQnVmICgoKFBhcnNlciAqKXBhcnNlciktPm1fZGF0YUJ1ZikKLSNkZWZpbmUgZGF0YUJ1ZkVuZCAoKChQYXJzZXIgKilwYXJzZXIpLT5tX2RhdGFCdWZFbmQpCi0jZGVmaW5lIGR0ZCAoKChQYXJzZXIgKilwYXJzZXIpLT5tX2R0ZCkKLSNkZWZpbmUgZGVjbEVudGl0eSAoKChQYXJzZXIgKilwYXJzZXIpLT5tX2RlY2xFbnRpdHkpCi0jZGVmaW5lIGRlY2xOb3RhdGlvbk5hbWUgKCgoUGFyc2VyICopcGFyc2VyKS0+bV9kZWNsTm90YXRpb25OYW1lKQotI2RlZmluZSBkZWNsTm90YXRpb25QdWJsaWNJZCAoKChQYXJzZXIgKilwYXJzZXIpLT5tX2RlY2xOb3RhdGlvblB1YmxpY0lkKQotI2RlZmluZSBkZWNsRWxlbWVudFR5cGUgKCgoUGFyc2VyICopcGFyc2VyKS0+bV9kZWNsRWxlbWVudFR5cGUpCi0jZGVmaW5lIGRlY2xBdHRyaWJ1dGVJZCAoKChQYXJzZXIgKilwYXJzZXIpLT5tX2RlY2xBdHRyaWJ1dGVJZCkKLSNkZWZpbmUgZGVjbEF0dHJpYnV0ZUlzQ2RhdGEgKCgoUGFyc2VyICopcGFyc2VyKS0+bV9kZWNsQXR0cmlidXRlSXNDZGF0YSkKLSNkZWZpbmUgZnJlZVRhZ0xpc3QgKCgoUGFyc2VyICopcGFyc2VyKS0+bV9mcmVlVGFnTGlzdCkKLSNkZWZpbmUgZnJlZUJpbmRpbmdMaXN0ICgoKFBhcnNlciAqKXBhcnNlciktPm1fZnJlZUJpbmRpbmdMaXN0KQotI2RlZmluZSBpbmhlcml0ZWRCaW5kaW5ncyAoKChQYXJzZXIgKilwYXJzZXIpLT5tX2luaGVyaXRlZEJpbmRpbmdzKQotI2RlZmluZSB0YWdTdGFjayAoKChQYXJzZXIgKilwYXJzZXIpLT5tX3RhZ1N0YWNrKQotI2RlZmluZSBhdHRzICgoKFBhcnNlciAqKXBhcnNlciktPm1fYXR0cykKLSNkZWZpbmUgYXR0c1NpemUgKCgoUGFyc2VyICopcGFyc2VyKS0+bV9hdHRzU2l6ZSkKLSNkZWZpbmUgblNwZWNpZmllZEF0dHMgKCgoUGFyc2VyICopcGFyc2VyKS0+bV9uU3BlY2lmaWVkQXR0cykKLSNkZWZpbmUgdGVtcFBvb2wgKCgoUGFyc2VyICopcGFyc2VyKS0+bV90ZW1wUG9vbCkKLSNkZWZpbmUgdGVtcDJQb29sICgoKFBhcnNlciAqKXBhcnNlciktPm1fdGVtcDJQb29sKQotI2RlZmluZSBncm91cENvbm5lY3RvciAoKChQYXJzZXIgKilwYXJzZXIpLT5tX2dyb3VwQ29ubmVjdG9yKQotI2RlZmluZSBncm91cFNpemUgKCgoUGFyc2VyICopcGFyc2VyKS0+bV9ncm91cFNpemUpCi0jZGVmaW5lIGhhZEV4dGVybmFsRG9jdHlwZSAoKChQYXJzZXIgKilwYXJzZXIpLT5tX2hhZEV4dGVybmFsRG9jdHlwZSkKLSNkZWZpbmUgbmFtZXNwYWNlU2VwYXJhdG9yICgoKFBhcnNlciAqKXBhcnNlciktPm1fbmFtZXNwYWNlU2VwYXJhdG9yKQotCi0jaWZkZWYgX01TQ19WRVIKLSNpZmRlZiBfREVCVUcKLVBhcnNlciAqYXNQYXJzZXIoWE1MX1BhcnNlciBwYXJzZXIpCi17Ci0gIHJldHVybiBwYXJzZXI7Ci19Ci0jZW5kaWYKLSNlbmRpZgotCi1YTUxfUGFyc2VyIFhNTF9QYXJzZXJDcmVhdGUoY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nTmFtZSkKLXsKLSAgWE1MX1BhcnNlciBwYXJzZXIgPSBtYWxsb2Moc2l6ZW9mKFBhcnNlcikpOwotICBpZiAoIXBhcnNlcikKLSAgICByZXR1cm4gcGFyc2VyOwotICBwcm9jZXNzb3IgPSBwcm9sb2dJbml0UHJvY2Vzc29yOwotICBYbWxQcm9sb2dTdGF0ZUluaXQoJnByb2xvZ1N0YXRlKTsKLSAgdXNlckRhdGEgPSAwOwotICBoYW5kbGVyQXJnID0gMDsKLSAgc3RhcnRFbGVtZW50SGFuZGxlciA9IDA7Ci0gIGVuZEVsZW1lbnRIYW5kbGVyID0gMDsKLSAgY2hhcmFjdGVyRGF0YUhhbmRsZXIgPSAwOwotICBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyID0gMDsKLSAgY29tbWVudEhhbmRsZXIgPSAwOwotICBzdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgPSAwOwotICBlbmRDZGF0YVNlY3Rpb25IYW5kbGVyID0gMDsKLSAgZGVmYXVsdEhhbmRsZXIgPSAwOwotICB1bnBhcnNlZEVudGl0eURlY2xIYW5kbGVyID0gMDsKLSAgbm90YXRpb25EZWNsSGFuZGxlciA9IDA7Ci0gIHN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgPSAwOwotICBlbmROYW1lc3BhY2VEZWNsSGFuZGxlciA9IDA7Ci0gIG5vdFN0YW5kYWxvbmVIYW5kbGVyID0gMDsKLSAgZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyID0gMDsKLSAgZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnID0gcGFyc2VyOwotICB1bmtub3duRW5jb2RpbmdIYW5kbGVyID0gMDsKLSAgYnVmZmVyID0gMDsKLSAgYnVmZmVyUHRyID0gMDsKLSAgYnVmZmVyRW5kID0gMDsKLSAgcGFyc2VFbmRCeXRlSW5kZXggPSAwOwotICBwYXJzZUVuZFB0ciA9IDA7Ci0gIGJ1ZmZlckxpbSA9IDA7Ci0gIGRlY2xFbGVtZW50VHlwZSA9IDA7Ci0gIGRlY2xBdHRyaWJ1dGVJZCA9IDA7Ci0gIGRlY2xFbnRpdHkgPSAwOwotICBkZWNsTm90YXRpb25OYW1lID0gMDsKLSAgZGVjbE5vdGF0aW9uUHVibGljSWQgPSAwOwotICBtZW1zZXQoJnBvc2l0aW9uLCAwLCBzaXplb2YoUE9TSVRJT04pKTsKLSAgZXJyb3JDb2RlID0gWE1MX0VSUk9SX05PTkU7Ci0gIGV2ZW50UHRyID0gMDsKLSAgZXZlbnRFbmRQdHIgPSAwOwotICBwb3NpdGlvblB0ciA9IDA7Ci0gIG9wZW5JbnRlcm5hbEVudGl0aWVzID0gMDsKLSAgdGFnTGV2ZWwgPSAwOwotICB0YWdTdGFjayA9IDA7Ci0gIGZyZWVUYWdMaXN0ID0gMDsKLSAgZnJlZUJpbmRpbmdMaXN0ID0gMDsKLSAgaW5oZXJpdGVkQmluZGluZ3MgPSAwOwotICBhdHRzU2l6ZSA9IElOSVRfQVRUU19TSVpFOwotICBhdHRzID0gbWFsbG9jKGF0dHNTaXplICogc2l6ZW9mKEFUVFJJQlVURSkpOwotICBuU3BlY2lmaWVkQXR0cyA9IDA7Ci0gIGRhdGFCdWYgPSBtYWxsb2MoSU5JVF9EQVRBX0JVRl9TSVpFICogc2l6ZW9mKFhNTF9DaGFyKSk7Ci0gIGdyb3VwU2l6ZSA9IDA7Ci0gIGdyb3VwQ29ubmVjdG9yID0gMDsKLSAgaGFkRXh0ZXJuYWxEb2N0eXBlID0gMDsKLSAgdW5rbm93bkVuY29kaW5nTWVtID0gMDsKLSAgdW5rbm93bkVuY29kaW5nUmVsZWFzZSA9IDA7Ci0gIHVua25vd25FbmNvZGluZ0RhdGEgPSAwOwotICB1bmtub3duRW5jb2RpbmdIYW5kbGVyRGF0YSA9IDA7Ci0gIG5hbWVzcGFjZVNlcGFyYXRvciA9ICchJzsKLSAgbnMgPSAwOwotICBwb29sSW5pdCgmdGVtcFBvb2wpOwotICBwb29sSW5pdCgmdGVtcDJQb29sKTsKLSAgcHJvdG9jb2xFbmNvZGluZ05hbWUgPSBlbmNvZGluZ05hbWUgPyBwb29sQ29weVN0cmluZygmdGVtcFBvb2wsIGVuY29kaW5nTmFtZSkgOiAwOwotICBpZiAoIWR0ZEluaXQoJmR0ZCkgfHwgIWF0dHMgfHwgIWRhdGFCdWYKLSAgICAgIHx8IChlbmNvZGluZ05hbWUgJiYgIXByb3RvY29sRW5jb2RpbmdOYW1lKSkgewotICAgIFhNTF9QYXJzZXJGcmVlKHBhcnNlcik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgZGF0YUJ1ZkVuZCA9IGRhdGFCdWYgKyBJTklUX0RBVEFfQlVGX1NJWkU7Ci0gIFhtbEluaXRFbmNvZGluZygmaW5pdEVuY29kaW5nLCAmZW5jb2RpbmcsIDApOwotICByZXR1cm4gcGFyc2VyOwotfQotCi1YTUxfUGFyc2VyIFhNTF9QYXJzZXJDcmVhdGVOUyhjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmdOYW1lLCBYTUxfQ2hhciBuc1NlcCkKLXsKLSAgc3RhdGljCi0gIGNvbnN0IFhNTF9DaGFyIGltcGxpY2l0Q29udGV4dFtdID0gewotICAgIFhNTF9UKCd4JyksIFhNTF9UKCdtJyksIFhNTF9UKCdsJyksIFhNTF9UKCc9JyksCi0gICAgWE1MX1QoJ2gnKSwgWE1MX1QoJ3QnKSwgWE1MX1QoJ3QnKSwgWE1MX1QoJ3AnKSwgWE1MX1QoJzonKSwKLSAgICBYTUxfVCgnLycpLCBYTUxfVCgnLycpLCBYTUxfVCgndycpLCBYTUxfVCgndycpLCBYTUxfVCgndycpLAotICAgIFhNTF9UKCcuJyksIFhNTF9UKCd3JyksIFhNTF9UKCczJyksCi0gICAgWE1MX1QoJy4nKSwgWE1MX1QoJ28nKSwgWE1MX1QoJ3InKSwgWE1MX1QoJ2cnKSwKLSAgICBYTUxfVCgnLycpLCBYTUxfVCgnWCcpLCBYTUxfVCgnTScpLCBYTUxfVCgnTCcpLAotICAgIFhNTF9UKCcvJyksIFhNTF9UKCcxJyksIFhNTF9UKCc5JyksIFhNTF9UKCc5JyksIFhNTF9UKCc4JyksCi0gICAgWE1MX1QoJy8nKSwgWE1MX1QoJ24nKSwgWE1MX1QoJ2EnKSwgWE1MX1QoJ20nKSwgWE1MX1QoJ2UnKSwKLSAgICBYTUxfVCgncycpLCBYTUxfVCgncCcpLCBYTUxfVCgnYScpLCBYTUxfVCgnYycpLCBYTUxfVCgnZScpLAotICAgIFhNTF9UKCdcMCcpCi0gIH07Ci0KLSAgWE1MX1BhcnNlciBwYXJzZXIgPSBYTUxfUGFyc2VyQ3JlYXRlKGVuY29kaW5nTmFtZSk7Ci0gIGlmIChwYXJzZXIpIHsKLSAgICBYbWxJbml0RW5jb2RpbmdOUygmaW5pdEVuY29kaW5nLCAmZW5jb2RpbmcsIDApOwotICAgIG5zID0gMTsKLSAgICBuYW1lc3BhY2VTZXBhcmF0b3IgPSBuc1NlcDsKLSAgfQotICBpZiAoIXNldENvbnRleHQocGFyc2VyLCBpbXBsaWNpdENvbnRleHQpKSB7Ci0gICAgWE1MX1BhcnNlckZyZWUocGFyc2VyKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gcGFyc2VyOwotfQotCi1pbnQgWE1MX1NldEVuY29kaW5nKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmdOYW1lKQotewotICBpZiAoIWVuY29kaW5nTmFtZSkKLSAgICBwcm90b2NvbEVuY29kaW5nTmFtZSA9IDA7Ci0gIGVsc2UgewotICAgIHByb3RvY29sRW5jb2RpbmdOYW1lID0gcG9vbENvcHlTdHJpbmcoJnRlbXBQb29sLCBlbmNvZGluZ05hbWUpOwotICAgIGlmICghcHJvdG9jb2xFbmNvZGluZ05hbWUpCi0gICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotWE1MX1BhcnNlciBYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUoWE1MX1BhcnNlciBvbGRQYXJzZXIsCi0JCQkJCSAgY29uc3QgWE1MX0NoYXIgKmNvbnRleHQsCi0JCQkJCSAgY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nTmFtZSkKLXsKLSAgWE1MX1BhcnNlciBwYXJzZXIgPSBvbGRQYXJzZXI7Ci0gIERURCAqb2xkRHRkID0gJmR0ZDsKLSAgWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIgb2xkU3RhcnRFbGVtZW50SGFuZGxlciA9IHN0YXJ0RWxlbWVudEhhbmRsZXI7Ci0gIFhNTF9FbmRFbGVtZW50SGFuZGxlciBvbGRFbmRFbGVtZW50SGFuZGxlciA9IGVuZEVsZW1lbnRIYW5kbGVyOwotICBYTUxfQ2hhcmFjdGVyRGF0YUhhbmRsZXIgb2xkQ2hhcmFjdGVyRGF0YUhhbmRsZXIgPSBjaGFyYWN0ZXJEYXRhSGFuZGxlcjsKLSAgWE1MX1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgb2xkUHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciA9IHByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXI7Ci0gIFhNTF9Db21tZW50SGFuZGxlciBvbGRDb21tZW50SGFuZGxlciA9IGNvbW1lbnRIYW5kbGVyOwotICBYTUxfU3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyIG9sZFN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciA9IHN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcjsKLSAgWE1MX0VuZENkYXRhU2VjdGlvbkhhbmRsZXIgb2xkRW5kQ2RhdGFTZWN0aW9uSGFuZGxlciA9IGVuZENkYXRhU2VjdGlvbkhhbmRsZXI7Ci0gIFhNTF9EZWZhdWx0SGFuZGxlciBvbGREZWZhdWx0SGFuZGxlciA9IGRlZmF1bHRIYW5kbGVyOwotICBYTUxfU3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciBvbGRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyID0gc3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlcjsKLSAgWE1MX0VuZE5hbWVzcGFjZURlY2xIYW5kbGVyIG9sZEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyID0gZW5kTmFtZXNwYWNlRGVjbEhhbmRsZXI7Ci0gIFhNTF9Ob3RTdGFuZGFsb25lSGFuZGxlciBvbGROb3RTdGFuZGFsb25lSGFuZGxlciA9IG5vdFN0YW5kYWxvbmVIYW5kbGVyOwotICBYTUxfRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIG9sZEV4dGVybmFsRW50aXR5UmVmSGFuZGxlciA9IGV4dGVybmFsRW50aXR5UmVmSGFuZGxlcjsKLSAgWE1MX1Vua25vd25FbmNvZGluZ0hhbmRsZXIgb2xkVW5rbm93bkVuY29kaW5nSGFuZGxlciA9IHVua25vd25FbmNvZGluZ0hhbmRsZXI7Ci0gIHZvaWQgKm9sZFVzZXJEYXRhID0gdXNlckRhdGE7Ci0gIHZvaWQgKm9sZEhhbmRsZXJBcmcgPSBoYW5kbGVyQXJnOwotICBpbnQgb2xkRGVmYXVsdEV4cGFuZEludGVybmFsRW50aXRpZXMgPSBkZWZhdWx0RXhwYW5kSW50ZXJuYWxFbnRpdGllczsKLSAgdm9pZCAqb2xkRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnID0gZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnOwotIAotICBwYXJzZXIgPSAobnMKLSAgICAgICAgICAgID8gWE1MX1BhcnNlckNyZWF0ZU5TKGVuY29kaW5nTmFtZSwgbmFtZXNwYWNlU2VwYXJhdG9yKQotCSAgICA6IFhNTF9QYXJzZXJDcmVhdGUoZW5jb2RpbmdOYW1lKSk7Ci0gIGlmICghcGFyc2VyKQotICAgIHJldHVybiAwOwotICBzdGFydEVsZW1lbnRIYW5kbGVyID0gb2xkU3RhcnRFbGVtZW50SGFuZGxlcjsKLSAgZW5kRWxlbWVudEhhbmRsZXIgPSBvbGRFbmRFbGVtZW50SGFuZGxlcjsKLSAgY2hhcmFjdGVyRGF0YUhhbmRsZXIgPSBvbGRDaGFyYWN0ZXJEYXRhSGFuZGxlcjsKLSAgcHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciA9IG9sZFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXI7Ci0gIGNvbW1lbnRIYW5kbGVyID0gb2xkQ29tbWVudEhhbmRsZXI7Ci0gIHN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciA9IG9sZFN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcjsKLSAgZW5kQ2RhdGFTZWN0aW9uSGFuZGxlciA9IG9sZEVuZENkYXRhU2VjdGlvbkhhbmRsZXI7Ci0gIGRlZmF1bHRIYW5kbGVyID0gb2xkRGVmYXVsdEhhbmRsZXI7Ci0gIHN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgPSBvbGRTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyOwotICBlbmROYW1lc3BhY2VEZWNsSGFuZGxlciA9IG9sZEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyOwotICBub3RTdGFuZGFsb25lSGFuZGxlciA9IG9sZE5vdFN0YW5kYWxvbmVIYW5kbGVyOwotICBleHRlcm5hbEVudGl0eVJlZkhhbmRsZXIgPSBvbGRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXI7Ci0gIHVua25vd25FbmNvZGluZ0hhbmRsZXIgPSBvbGRVbmtub3duRW5jb2RpbmdIYW5kbGVyOwotICB1c2VyRGF0YSA9IG9sZFVzZXJEYXRhOwotICBpZiAob2xkVXNlckRhdGEgPT0gb2xkSGFuZGxlckFyZykKLSAgICBoYW5kbGVyQXJnID0gdXNlckRhdGE7Ci0gIGVsc2UKLSAgICBoYW5kbGVyQXJnID0gcGFyc2VyOwotICBpZiAob2xkRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnICE9IG9sZFBhcnNlcikKLSAgICBleHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcgPSBvbGRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmc7Ci0gIGRlZmF1bHRFeHBhbmRJbnRlcm5hbEVudGl0aWVzID0gb2xkRGVmYXVsdEV4cGFuZEludGVybmFsRW50aXRpZXM7Ci0gIGlmICghZHRkQ29weSgmZHRkLCBvbGREdGQpIHx8ICFzZXRDb250ZXh0KHBhcnNlciwgY29udGV4dCkpIHsKLSAgICBYTUxfUGFyc2VyRnJlZShwYXJzZXIpOwotICAgIHJldHVybiAwOwotICB9Ci0gIHByb2Nlc3NvciA9IGV4dGVybmFsRW50aXR5SW5pdFByb2Nlc3NvcjsKLSAgcmV0dXJuIHBhcnNlcjsKLX0KLQotc3RhdGljCi12b2lkIGRlc3Ryb3lCaW5kaW5ncyhCSU5ESU5HICpiaW5kaW5ncykKLXsKLSAgZm9yICg7OykgewotICAgIEJJTkRJTkcgKmIgPSBiaW5kaW5nczsKLSAgICBpZiAoIWIpCi0gICAgICBicmVhazsKLSAgICBiaW5kaW5ncyA9IGItPm5leHRUYWdCaW5kaW5nOwotICAgIGZyZWUoYi0+dXJpKTsKLSAgICBmcmVlKGIpOwotICB9Ci19Ci0KLXZvaWQgWE1MX1BhcnNlckZyZWUoWE1MX1BhcnNlciBwYXJzZXIpCi17Ci0gIGZvciAoOzspIHsKLSAgICBUQUcgKnA7Ci0gICAgaWYgKHRhZ1N0YWNrID09IDApIHsKLSAgICAgIGlmIChmcmVlVGFnTGlzdCA9PSAwKQotCWJyZWFrOwotICAgICAgdGFnU3RhY2sgPSBmcmVlVGFnTGlzdDsKLSAgICAgIGZyZWVUYWdMaXN0ID0gMDsKLSAgICB9Ci0gICAgcCA9IHRhZ1N0YWNrOwotICAgIHRhZ1N0YWNrID0gdGFnU3RhY2stPnBhcmVudDsKLSAgICBmcmVlKHAtPmJ1Zik7Ci0gICAgZGVzdHJveUJpbmRpbmdzKHAtPmJpbmRpbmdzKTsKLSAgICBmcmVlKHApOwotICB9Ci0gIGRlc3Ryb3lCaW5kaW5ncyhmcmVlQmluZGluZ0xpc3QpOwotICBkZXN0cm95QmluZGluZ3MoaW5oZXJpdGVkQmluZGluZ3MpOwotICBwb29sRGVzdHJveSgmdGVtcFBvb2wpOwotICBwb29sRGVzdHJveSgmdGVtcDJQb29sKTsKLSAgZHRkRGVzdHJveSgmZHRkKTsKLSAgZnJlZSgodm9pZCAqKWF0dHMpOwotICBmcmVlKGdyb3VwQ29ubmVjdG9yKTsKLSAgZnJlZShidWZmZXIpOwotICBmcmVlKGRhdGFCdWYpOwotICBmcmVlKHVua25vd25FbmNvZGluZ01lbSk7Ci0gIGlmICh1bmtub3duRW5jb2RpbmdSZWxlYXNlKQotICAgIHVua25vd25FbmNvZGluZ1JlbGVhc2UodW5rbm93bkVuY29kaW5nRGF0YSk7Ci0gIGZyZWUocGFyc2VyKTsKLX0KLQotdm9pZCBYTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnKFhNTF9QYXJzZXIgcGFyc2VyKQotewotICBoYW5kbGVyQXJnID0gcGFyc2VyOwotfQotCi12b2lkIFhNTF9TZXRVc2VyRGF0YShYTUxfUGFyc2VyIHBhcnNlciwgdm9pZCAqcCkKLXsKLSAgaWYgKGhhbmRsZXJBcmcgPT0gdXNlckRhdGEpCi0gICAgaGFuZGxlckFyZyA9IHVzZXJEYXRhID0gcDsKLSAgZWxzZQotICAgIHVzZXJEYXRhID0gcDsKLX0KLQotaW50IFhNTF9TZXRCYXNlKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBYTUxfQ2hhciAqcCkKLXsKLSAgaWYgKHApIHsKLSAgICBwID0gcG9vbENvcHlTdHJpbmcoJmR0ZC5wb29sLCBwKTsKLSAgICBpZiAoIXApCi0gICAgICByZXR1cm4gMDsKLSAgICBkdGQuYmFzZSA9IHA7Ci0gIH0KLSAgZWxzZQotICAgIGR0ZC5iYXNlID0gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLWNvbnN0IFhNTF9DaGFyICpYTUxfR2V0QmFzZShYTUxfUGFyc2VyIHBhcnNlcikKLXsKLSAgcmV0dXJuIGR0ZC5iYXNlOwotfQotCi1pbnQgWE1MX0dldFNwZWNpZmllZEF0dHJpYnV0ZUNvdW50KFhNTF9QYXJzZXIgcGFyc2VyKQotewotICByZXR1cm4gblNwZWNpZmllZEF0dHM7Ci19Ci0KLXZvaWQgWE1MX1NldEVsZW1lbnRIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAotCQkJICAgWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIgc3RhcnQsCi0JCQkgICBYTUxfRW5kRWxlbWVudEhhbmRsZXIgZW5kKQotewotICBzdGFydEVsZW1lbnRIYW5kbGVyID0gc3RhcnQ7Ci0gIGVuZEVsZW1lbnRIYW5kbGVyID0gZW5kOwotfQotCi12b2lkIFhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKLQkJCQkgWE1MX0NoYXJhY3RlckRhdGFIYW5kbGVyIGhhbmRsZXIpCi17Ci0gIGNoYXJhY3RlckRhdGFIYW5kbGVyID0gaGFuZGxlcjsKLX0KLQotdm9pZCBYTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKLQkJCQkJIFhNTF9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyIGhhbmRsZXIpCi17Ci0gIHByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgPSBoYW5kbGVyOwotfQotCi12b2lkIFhNTF9TZXRDb21tZW50SGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKLQkJCSAgIFhNTF9Db21tZW50SGFuZGxlciBoYW5kbGVyKQotewotICBjb21tZW50SGFuZGxlciA9IGhhbmRsZXI7Ci19Ci0KLXZvaWQgWE1MX1NldENkYXRhU2VjdGlvbkhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCi0JCQkJWE1MX1N0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciBzdGFydCwKLQkJCSAgICAgICAgWE1MX0VuZENkYXRhU2VjdGlvbkhhbmRsZXIgZW5kKQotewotICBzdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgPSBzdGFydDsKLSAgZW5kQ2RhdGFTZWN0aW9uSGFuZGxlciA9IGVuZDsKLX0KLQotdm9pZCBYTUxfU2V0RGVmYXVsdEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCi0JCQkgICBYTUxfRGVmYXVsdEhhbmRsZXIgaGFuZGxlcikKLXsKLSAgZGVmYXVsdEhhbmRsZXIgPSBoYW5kbGVyOwotICBkZWZhdWx0RXhwYW5kSW50ZXJuYWxFbnRpdGllcyA9IDA7Ci19Ci0KLXZvaWQgWE1MX1NldERlZmF1bHRIYW5kbGVyRXhwYW5kKFhNTF9QYXJzZXIgcGFyc2VyLAotCQkJCSBYTUxfRGVmYXVsdEhhbmRsZXIgaGFuZGxlcikKLXsKLSAgZGVmYXVsdEhhbmRsZXIgPSBoYW5kbGVyOwotICBkZWZhdWx0RXhwYW5kSW50ZXJuYWxFbnRpdGllcyA9IDE7Ci19Ci0KLXZvaWQgWE1MX1NldFVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCi0JCQkJICAgICAgWE1MX1VucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIgaGFuZGxlcikKLXsKLSAgdW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlciA9IGhhbmRsZXI7Ci19Ci0KLXZvaWQgWE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCi0JCQkJWE1MX05vdGF0aW9uRGVjbEhhbmRsZXIgaGFuZGxlcikKLXsKLSAgbm90YXRpb25EZWNsSGFuZGxlciA9IGhhbmRsZXI7Ci19Ci0KLXZvaWQgWE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAotCQkJCSBYTUxfU3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciBzdGFydCwKLQkJCQkgWE1MX0VuZE5hbWVzcGFjZURlY2xIYW5kbGVyIGVuZCkKLXsKLSAgc3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciA9IHN0YXJ0OwotICBlbmROYW1lc3BhY2VEZWNsSGFuZGxlciA9IGVuZDsKLX0KLQotdm9pZCBYTUxfU2V0Tm90U3RhbmRhbG9uZUhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCi0JCQkJIFhNTF9Ob3RTdGFuZGFsb25lSGFuZGxlciBoYW5kbGVyKQotewotICBub3RTdGFuZGFsb25lSGFuZGxlciA9IGhhbmRsZXI7Ci19Ci0KLXZvaWQgWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKLQkJCQkgICAgIFhNTF9FeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIgaGFuZGxlcikKLXsKLSAgZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyID0gaGFuZGxlcjsKLX0KLQotdm9pZCBYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnKFhNTF9QYXJzZXIgcGFyc2VyLCB2b2lkICphcmcpCi17Ci0gIGlmIChhcmcpCi0gICAgZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnID0gYXJnOwotICBlbHNlCi0gICAgZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnID0gcGFyc2VyOwotfQotCi12b2lkIFhNTF9TZXRVbmtub3duRW5jb2RpbmdIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAotCQkJCSAgIFhNTF9Vbmtub3duRW5jb2RpbmdIYW5kbGVyIGhhbmRsZXIsCi0JCQkJICAgdm9pZCAqZGF0YSkKLXsKLSAgdW5rbm93bkVuY29kaW5nSGFuZGxlciA9IGhhbmRsZXI7Ci0gIHVua25vd25FbmNvZGluZ0hhbmRsZXJEYXRhID0gZGF0YTsKLX0KLQotaW50IFhNTF9QYXJzZShYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgY2hhciAqcywgaW50IGxlbiwgaW50IGlzRmluYWwpCi17Ci0gIGlmIChsZW4gPT0gMCkgewotICAgIGlmICghaXNGaW5hbCkKLSAgICAgIHJldHVybiAxOwotICAgIHBvc2l0aW9uUHRyID0gYnVmZmVyUHRyOwotICAgIGVycm9yQ29kZSA9IHByb2Nlc3NvcihwYXJzZXIsIGJ1ZmZlclB0ciwgcGFyc2VFbmRQdHIgPSBidWZmZXJFbmQsIDApOwotICAgIGlmIChlcnJvckNvZGUgPT0gWE1MX0VSUk9SX05PTkUpCi0gICAgICByZXR1cm4gMTsKLSAgICBldmVudEVuZFB0ciA9IGV2ZW50UHRyOwotICAgIHJldHVybiAwOwotICB9Ci0gIGVsc2UgaWYgKGJ1ZmZlclB0ciA9PSBidWZmZXJFbmQpIHsKLSAgICBjb25zdCBjaGFyICplbmQ7Ci0gICAgaW50IG5MZWZ0T3ZlcjsKLSAgICBwYXJzZUVuZEJ5dGVJbmRleCArPSBsZW47Ci0gICAgcG9zaXRpb25QdHIgPSBzOwotICAgIGlmIChpc0ZpbmFsKSB7Ci0gICAgICBlcnJvckNvZGUgPSBwcm9jZXNzb3IocGFyc2VyLCBzLCBwYXJzZUVuZFB0ciA9IHMgKyBsZW4sIDApOwotICAgICAgaWYgKGVycm9yQ29kZSA9PSBYTUxfRVJST1JfTk9ORSkKLQlyZXR1cm4gMTsKLSAgICAgIGV2ZW50RW5kUHRyID0gZXZlbnRQdHI7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZXJyb3JDb2RlID0gcHJvY2Vzc29yKHBhcnNlciwgcywgcGFyc2VFbmRQdHIgPSBzICsgbGVuLCAmZW5kKTsKLSAgICBpZiAoZXJyb3JDb2RlICE9IFhNTF9FUlJPUl9OT05FKSB7Ci0gICAgICBldmVudEVuZFB0ciA9IGV2ZW50UHRyOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIFhtbFVwZGF0ZVBvc2l0aW9uKGVuY29kaW5nLCBwb3NpdGlvblB0ciwgZW5kLCAmcG9zaXRpb24pOwotICAgIG5MZWZ0T3ZlciA9IHMgKyBsZW4gLSBlbmQ7Ci0gICAgaWYgKG5MZWZ0T3ZlcikgewotICAgICAgaWYgKGJ1ZmZlciA9PSAwIHx8IG5MZWZ0T3ZlciA+IGJ1ZmZlckxpbSAtIGJ1ZmZlcikgewotCS8qIEZJWE1FIGF2b2lkIGludGVnZXIgb3ZlcmZsb3cgKi8KLQlidWZmZXIgPSBidWZmZXIgPT0gMCA/IG1hbGxvYyhsZW4gKiAyKSA6IHJlYWxsb2MoYnVmZmVyLCBsZW4gKiAyKTsKLQlpZiAoIWJ1ZmZlcikgewotCSAgZXJyb3JDb2RlID0gWE1MX0VSUk9SX05PX01FTU9SWTsKLQkgIGV2ZW50UHRyID0gZXZlbnRFbmRQdHIgPSAwOwotCSAgcmV0dXJuIDA7Ci0JfQotCWJ1ZmZlckxpbSA9IGJ1ZmZlciArIGxlbiAqIDI7Ci0gICAgICB9Ci0gICAgICBtZW1jcHkoYnVmZmVyLCBlbmQsIG5MZWZ0T3Zlcik7Ci0gICAgICBidWZmZXJQdHIgPSBidWZmZXI7Ci0gICAgICBidWZmZXJFbmQgPSBidWZmZXIgKyBuTGVmdE92ZXI7Ci0gICAgfQotICAgIHJldHVybiAxOwotICB9Ci0gIGVsc2UgewotICAgIG1lbWNweShYTUxfR2V0QnVmZmVyKHBhcnNlciwgbGVuKSwgcywgbGVuKTsKLSAgICByZXR1cm4gWE1MX1BhcnNlQnVmZmVyKHBhcnNlciwgbGVuLCBpc0ZpbmFsKTsKLSAgfQotfQotCi1pbnQgWE1MX1BhcnNlQnVmZmVyKFhNTF9QYXJzZXIgcGFyc2VyLCBpbnQgbGVuLCBpbnQgaXNGaW5hbCkKLXsKLSAgY29uc3QgY2hhciAqc3RhcnQgPSBidWZmZXJQdHI7Ci0gIHBvc2l0aW9uUHRyID0gc3RhcnQ7Ci0gIGJ1ZmZlckVuZCArPSBsZW47Ci0gIHBhcnNlRW5kQnl0ZUluZGV4ICs9IGxlbjsKLSAgZXJyb3JDb2RlID0gcHJvY2Vzc29yKHBhcnNlciwgc3RhcnQsIHBhcnNlRW5kUHRyID0gYnVmZmVyRW5kLAotCQkJaXNGaW5hbCA/IChjb25zdCBjaGFyICoqKTAgOiAmYnVmZmVyUHRyKTsKLSAgaWYgKGVycm9yQ29kZSA9PSBYTUxfRVJST1JfTk9ORSkgewotICAgIGlmICghaXNGaW5hbCkKLSAgICAgIFhtbFVwZGF0ZVBvc2l0aW9uKGVuY29kaW5nLCBwb3NpdGlvblB0ciwgYnVmZmVyUHRyLCAmcG9zaXRpb24pOwotICAgIHJldHVybiAxOwotICB9Ci0gIGVsc2UgewotICAgIGV2ZW50RW5kUHRyID0gZXZlbnRQdHI7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotdm9pZCAqWE1MX0dldEJ1ZmZlcihYTUxfUGFyc2VyIHBhcnNlciwgaW50IGxlbikKLXsKLSAgaWYgKGxlbiA+IGJ1ZmZlckxpbSAtIGJ1ZmZlckVuZCkgewotICAgIC8qIEZJWE1FIGF2b2lkIGludGVnZXIgb3ZlcmZsb3cgKi8KLSAgICBpbnQgbmVlZGVkU2l6ZSA9IGxlbiArIChidWZmZXJFbmQgLSBidWZmZXJQdHIpOwotICAgIGlmIChuZWVkZWRTaXplICA8PSBidWZmZXJMaW0gLSBidWZmZXIpIHsKLSAgICAgIG1lbW1vdmUoYnVmZmVyLCBidWZmZXJQdHIsIGJ1ZmZlckVuZCAtIGJ1ZmZlclB0cik7Ci0gICAgICBidWZmZXJFbmQgPSBidWZmZXIgKyAoYnVmZmVyRW5kIC0gYnVmZmVyUHRyKTsKLSAgICAgIGJ1ZmZlclB0ciA9IGJ1ZmZlcjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBjaGFyICpuZXdCdWY7Ci0gICAgICBpbnQgYnVmZmVyU2l6ZSA9IGJ1ZmZlckxpbSAtIGJ1ZmZlclB0cjsKLSAgICAgIGlmIChidWZmZXJTaXplID09IDApCi0JYnVmZmVyU2l6ZSA9IElOSVRfQlVGRkVSX1NJWkU7Ci0gICAgICBkbyB7Ci0JYnVmZmVyU2l6ZSAqPSAyOwotICAgICAgfSB3aGlsZSAoYnVmZmVyU2l6ZSA8IG5lZWRlZFNpemUpOwotICAgICAgbmV3QnVmID0gbWFsbG9jKGJ1ZmZlclNpemUpOwotICAgICAgaWYgKG5ld0J1ZiA9PSAwKSB7Ci0JZXJyb3JDb2RlID0gWE1MX0VSUk9SX05PX01FTU9SWTsKLQlyZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIGJ1ZmZlckxpbSA9IG5ld0J1ZiArIGJ1ZmZlclNpemU7Ci0gICAgICBpZiAoYnVmZmVyUHRyKSB7Ci0JbWVtY3B5KG5ld0J1ZiwgYnVmZmVyUHRyLCBidWZmZXJFbmQgLSBidWZmZXJQdHIpOwotCWZyZWUoYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJ1ZmZlckVuZCA9IG5ld0J1ZiArIChidWZmZXJFbmQgLSBidWZmZXJQdHIpOwotICAgICAgYnVmZmVyUHRyID0gYnVmZmVyID0gbmV3QnVmOwotICAgIH0KLSAgfQotICByZXR1cm4gYnVmZmVyRW5kOwotfQotCi1lbnVtIFhNTF9FcnJvciBYTUxfR2V0RXJyb3JDb2RlKFhNTF9QYXJzZXIgcGFyc2VyKQotewotICByZXR1cm4gZXJyb3JDb2RlOwotfQotCi1sb25nIFhNTF9HZXRDdXJyZW50Qnl0ZUluZGV4KFhNTF9QYXJzZXIgcGFyc2VyKQotewotICBpZiAoZXZlbnRQdHIpCi0gICAgcmV0dXJuIHBhcnNlRW5kQnl0ZUluZGV4IC0gKHBhcnNlRW5kUHRyIC0gZXZlbnRQdHIpOwotICByZXR1cm4gLTE7Ci19Ci0KLWludCBYTUxfR2V0Q3VycmVudEJ5dGVDb3VudChYTUxfUGFyc2VyIHBhcnNlcikKLXsKLSAgaWYgKGV2ZW50RW5kUHRyICYmIGV2ZW50UHRyKQotICAgIHJldHVybiBldmVudEVuZFB0ciAtIGV2ZW50UHRyOwotICByZXR1cm4gMDsKLX0KLQotaW50IFhNTF9HZXRDdXJyZW50TGluZU51bWJlcihYTUxfUGFyc2VyIHBhcnNlcikKLXsKLSAgaWYgKGV2ZW50UHRyKSB7Ci0gICAgWG1sVXBkYXRlUG9zaXRpb24oZW5jb2RpbmcsIHBvc2l0aW9uUHRyLCBldmVudFB0ciwgJnBvc2l0aW9uKTsKLSAgICBwb3NpdGlvblB0ciA9IGV2ZW50UHRyOwotICB9Ci0gIHJldHVybiBwb3NpdGlvbi5saW5lTnVtYmVyICsgMTsKLX0KLQotaW50IFhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyKFhNTF9QYXJzZXIgcGFyc2VyKQotewotICBpZiAoZXZlbnRQdHIpIHsKLSAgICBYbWxVcGRhdGVQb3NpdGlvbihlbmNvZGluZywgcG9zaXRpb25QdHIsIGV2ZW50UHRyLCAmcG9zaXRpb24pOwotICAgIHBvc2l0aW9uUHRyID0gZXZlbnRQdHI7Ci0gIH0KLSAgcmV0dXJuIHBvc2l0aW9uLmNvbHVtbk51bWJlcjsKLX0KLQotdm9pZCBYTUxfRGVmYXVsdEN1cnJlbnQoWE1MX1BhcnNlciBwYXJzZXIpCi17Ci0gIGlmIChkZWZhdWx0SGFuZGxlcikgewotICAgIGlmIChvcGVuSW50ZXJuYWxFbnRpdGllcykKLSAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLAotCSAgICAgICAgICAgIG5zID8gWG1sR2V0SW50ZXJuYWxFbmNvZGluZ05TKCkgOiBYbWxHZXRJbnRlcm5hbEVuY29kaW5nKCksCi0JCSAgICBvcGVuSW50ZXJuYWxFbnRpdGllcy0+aW50ZXJuYWxFdmVudFB0ciwKLQkJICAgIG9wZW5JbnRlcm5hbEVudGl0aWVzLT5pbnRlcm5hbEV2ZW50RW5kUHRyKTsKLSAgICBlbHNlCi0gICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jb2RpbmcsIGV2ZW50UHRyLCBldmVudEVuZFB0cik7Ci0gIH0KLX0KLQotY29uc3QgWE1MX0xDaGFyICpYTUxfRXJyb3JTdHJpbmcoaW50IGNvZGUpCi17Ci0gIHN0YXRpYyBjb25zdCBYTUxfTENoYXIgKm1lc3NhZ2VbXSA9IHsKLSAgICAwLAotICAgIFhNTF9UKCJvdXQgb2YgbWVtb3J5IiksCi0gICAgWE1MX1QoInN5bnRheCBlcnJvciIpLAotICAgIFhNTF9UKCJubyBlbGVtZW50IGZvdW5kIiksCi0gICAgWE1MX1QoIm5vdCB3ZWxsLWZvcm1lZCIpLAotICAgIFhNTF9UKCJ1bmNsb3NlZCB0b2tlbiIpLAotICAgIFhNTF9UKCJ1bmNsb3NlZCB0b2tlbiIpLAotICAgIFhNTF9UKCJtaXNtYXRjaGVkIHRhZyIpLAotICAgIFhNTF9UKCJkdXBsaWNhdGUgYXR0cmlidXRlIiksCi0gICAgWE1MX1QoImp1bmsgYWZ0ZXIgZG9jdW1lbnQgZWxlbWVudCIpLAotICAgIFhNTF9UKCJpbGxlZ2FsIHBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlIiksCi0gICAgWE1MX1QoInVuZGVmaW5lZCBlbnRpdHkiKSwKLSAgICBYTUxfVCgicmVjdXJzaXZlIGVudGl0eSByZWZlcmVuY2UiKSwKLSAgICBYTUxfVCgiYXN5bmNocm9ub3VzIGVudGl0eSIpLAotICAgIFhNTF9UKCJyZWZlcmVuY2UgdG8gaW52YWxpZCBjaGFyYWN0ZXIgbnVtYmVyIiksCi0gICAgWE1MX1QoInJlZmVyZW5jZSB0byBiaW5hcnkgZW50aXR5IiksCi0gICAgWE1MX1QoInJlZmVyZW5jZSB0byBleHRlcm5hbCBlbnRpdHkgaW4gYXR0cmlidXRlIiksCi0gICAgWE1MX1QoInhtbCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5vdCBhdCBzdGFydCBvZiBleHRlcm5hbCBlbnRpdHkiKSwKLSAgICBYTUxfVCgidW5rbm93biBlbmNvZGluZyIpLAotICAgIFhNTF9UKCJlbmNvZGluZyBzcGVjaWZpZWQgaW4gWE1MIGRlY2xhcmF0aW9uIGlzIGluY29ycmVjdCIpLAotICAgIFhNTF9UKCJ1bmNsb3NlZCBDREFUQSBzZWN0aW9uIiksCi0gICAgWE1MX1QoImVycm9yIGluIHByb2Nlc3NpbmcgZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZSIpLAotICAgIFhNTF9UKCJkb2N1bWVudCBpcyBub3Qgc3RhbmRhbG9uZSIpCi0gIH07Ci0gIGlmIChjb2RlID4gMCAmJiBjb2RlIDwgc2l6ZW9mKG1lc3NhZ2UpL3NpemVvZihtZXNzYWdlWzBdKSkKLSAgICByZXR1cm4gbWVzc2FnZVtjb2RlXTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYwotZW51bSBYTUxfRXJyb3IgY29udGVudFByb2Nlc3NvcihYTUxfUGFyc2VyIHBhcnNlciwKLQkJCQljb25zdCBjaGFyICpzdGFydCwKLQkJCQljb25zdCBjaGFyICplbmQsCi0JCQkJY29uc3QgY2hhciAqKmVuZFB0cikKLXsKLSAgcmV0dXJuIGRvQ29udGVudChwYXJzZXIsIDAsIGVuY29kaW5nLCBzdGFydCwgZW5kLCBlbmRQdHIpOwotfQotCi1zdGF0aWMKLWVudW0gWE1MX0Vycm9yIGV4dGVybmFsRW50aXR5SW5pdFByb2Nlc3NvcihYTUxfUGFyc2VyIHBhcnNlciwKLQkJCQkJICAgY29uc3QgY2hhciAqc3RhcnQsCi0JCQkJCSAgIGNvbnN0IGNoYXIgKmVuZCwKLQkJCQkJICAgY29uc3QgY2hhciAqKmVuZFB0cikKLXsKLSAgZW51bSBYTUxfRXJyb3IgcmVzdWx0ID0gaW5pdGlhbGl6ZUVuY29kaW5nKHBhcnNlcik7Ci0gIGlmIChyZXN1bHQgIT0gWE1MX0VSUk9SX05PTkUpCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgcHJvY2Vzc29yID0gZXh0ZXJuYWxFbnRpdHlJbml0UHJvY2Vzc29yMjsKLSAgcmV0dXJuIGV4dGVybmFsRW50aXR5SW5pdFByb2Nlc3NvcjIocGFyc2VyLCBzdGFydCwgZW5kLCBlbmRQdHIpOwotfQotCi1zdGF0aWMKLWVudW0gWE1MX0Vycm9yIGV4dGVybmFsRW50aXR5SW5pdFByb2Nlc3NvcjIoWE1MX1BhcnNlciBwYXJzZXIsCi0JCQkJCSAgICBjb25zdCBjaGFyICpzdGFydCwKLQkJCQkJICAgIGNvbnN0IGNoYXIgKmVuZCwKLQkJCQkJICAgIGNvbnN0IGNoYXIgKiplbmRQdHIpCi17Ci0gIGNvbnN0IGNoYXIgKm5leHQ7Ci0gIGludCB0b2sgPSBYbWxDb250ZW50VG9rKGVuY29kaW5nLCBzdGFydCwgZW5kLCAmbmV4dCk7Ci0gIHN3aXRjaCAodG9rKSB7Ci0gIGNhc2UgWE1MX1RPS19CT006Ci0gICAgc3RhcnQgPSBuZXh0OwotICAgIGJyZWFrOwotICBjYXNlIFhNTF9UT0tfUEFSVElBTDoKLSAgICBpZiAoZW5kUHRyKSB7Ci0gICAgICAqZW5kUHRyID0gc3RhcnQ7Ci0gICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7Ci0gICAgfQotICAgIGV2ZW50UHRyID0gc3RhcnQ7Ci0gICAgcmV0dXJuIFhNTF9FUlJPUl9VTkNMT1NFRF9UT0tFTjsKLSAgY2FzZSBYTUxfVE9LX1BBUlRJQUxfQ0hBUjoKLSAgICBpZiAoZW5kUHRyKSB7Ci0gICAgICAqZW5kUHRyID0gc3RhcnQ7Ci0gICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7Ci0gICAgfQotICAgIGV2ZW50UHRyID0gc3RhcnQ7Ci0gICAgcmV0dXJuIFhNTF9FUlJPUl9QQVJUSUFMX0NIQVI7Ci0gIH0KLSAgcHJvY2Vzc29yID0gZXh0ZXJuYWxFbnRpdHlJbml0UHJvY2Vzc29yMzsKLSAgcmV0dXJuIGV4dGVybmFsRW50aXR5SW5pdFByb2Nlc3NvcjMocGFyc2VyLCBzdGFydCwgZW5kLCBlbmRQdHIpOwotfQotCi1zdGF0aWMKLWVudW0gWE1MX0Vycm9yIGV4dGVybmFsRW50aXR5SW5pdFByb2Nlc3NvcjMoWE1MX1BhcnNlciBwYXJzZXIsCi0JCQkJCSAgICBjb25zdCBjaGFyICpzdGFydCwKLQkJCQkJICAgIGNvbnN0IGNoYXIgKmVuZCwKLQkJCQkJICAgIGNvbnN0IGNoYXIgKiplbmRQdHIpCi17Ci0gIGNvbnN0IGNoYXIgKm5leHQ7Ci0gIGludCB0b2sgPSBYbWxDb250ZW50VG9rKGVuY29kaW5nLCBzdGFydCwgZW5kLCAmbmV4dCk7Ci0gIHN3aXRjaCAodG9rKSB7Ci0gIGNhc2UgWE1MX1RPS19YTUxfREVDTDoKLSAgICB7Ci0gICAgICBlbnVtIFhNTF9FcnJvciByZXN1bHQgPSBwcm9jZXNzWG1sRGVjbChwYXJzZXIsIDEsIHN0YXJ0LCBuZXh0KTsKLSAgICAgIGlmIChyZXN1bHQgIT0gWE1MX0VSUk9SX05PTkUpCi0JcmV0dXJuIHJlc3VsdDsKLSAgICAgIHN0YXJ0ID0gbmV4dDsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgWE1MX1RPS19QQVJUSUFMOgotICAgIGlmIChlbmRQdHIpIHsKLSAgICAgICplbmRQdHIgPSBzdGFydDsKLSAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKLSAgICB9Ci0gICAgZXZlbnRQdHIgPSBzdGFydDsKLSAgICByZXR1cm4gWE1MX0VSUk9SX1VOQ0xPU0VEX1RPS0VOOwotICBjYXNlIFhNTF9UT0tfUEFSVElBTF9DSEFSOgotICAgIGlmIChlbmRQdHIpIHsKLSAgICAgICplbmRQdHIgPSBzdGFydDsKLSAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKLSAgICB9Ci0gICAgZXZlbnRQdHIgPSBzdGFydDsKLSAgICByZXR1cm4gWE1MX0VSUk9SX1BBUlRJQUxfQ0hBUjsKLSAgfQotICBwcm9jZXNzb3IgPSBleHRlcm5hbEVudGl0eUNvbnRlbnRQcm9jZXNzb3I7Ci0gIHRhZ0xldmVsID0gMTsKLSAgcmV0dXJuIGRvQ29udGVudChwYXJzZXIsIDEsIGVuY29kaW5nLCBzdGFydCwgZW5kLCBlbmRQdHIpOwotfQotCi1zdGF0aWMKLWVudW0gWE1MX0Vycm9yIGV4dGVybmFsRW50aXR5Q29udGVudFByb2Nlc3NvcihYTUxfUGFyc2VyIHBhcnNlciwKLQkJCQkJICAgICAgY29uc3QgY2hhciAqc3RhcnQsCi0JCQkJCSAgICAgIGNvbnN0IGNoYXIgKmVuZCwKLQkJCQkJICAgICAgY29uc3QgY2hhciAqKmVuZFB0cikKLXsKLSAgcmV0dXJuIGRvQ29udGVudChwYXJzZXIsIDEsIGVuY29kaW5nLCBzdGFydCwgZW5kLCBlbmRQdHIpOwotfQotCi1zdGF0aWMgZW51bSBYTUxfRXJyb3IKLWRvQ29udGVudChYTUxfUGFyc2VyIHBhcnNlciwKLQkgIGludCBzdGFydFRhZ0xldmVsLAotCSAgY29uc3QgRU5DT0RJTkcgKmVuYywKLQkgIGNvbnN0IGNoYXIgKnMsCi0JICBjb25zdCBjaGFyICplbmQsCi0JICBjb25zdCBjaGFyICoqbmV4dFB0cikKLXsKLSAgY29uc3QgRU5DT0RJTkcgKmludGVybmFsRW5jID0gbnMgPyBYbWxHZXRJbnRlcm5hbEVuY29kaW5nTlMoKSA6IFhtbEdldEludGVybmFsRW5jb2RpbmcoKTsKLSAgY29uc3QgY2hhciAqKmV2ZW50UFA7Ci0gIGNvbnN0IGNoYXIgKipldmVudEVuZFBQOwotICBpZiAoZW5jID09IGVuY29kaW5nKSB7Ci0gICAgZXZlbnRQUCA9ICZldmVudFB0cjsKLSAgICBldmVudEVuZFBQID0gJmV2ZW50RW5kUHRyOwotICB9Ci0gIGVsc2UgewotICAgIGV2ZW50UFAgPSAmKG9wZW5JbnRlcm5hbEVudGl0aWVzLT5pbnRlcm5hbEV2ZW50UHRyKTsKLSAgICBldmVudEVuZFBQID0gJihvcGVuSW50ZXJuYWxFbnRpdGllcy0+aW50ZXJuYWxFdmVudEVuZFB0cik7Ci0gIH0KLSAgKmV2ZW50UFAgPSBzOwotICBmb3IgKDs7KSB7Ci0gICAgY29uc3QgY2hhciAqbmV4dCA9IHM7IC8qIFhtbENvbnRlbnRUb2sgZG9lc24ndCBhbHdheXMgc2V0IHRoZSBsYXN0IGFyZyAqLwotICAgIGludCB0b2sgPSBYbWxDb250ZW50VG9rKGVuYywgcywgZW5kLCAmbmV4dCk7Ci0gICAgKmV2ZW50RW5kUFAgPSBuZXh0OwotICAgIHN3aXRjaCAodG9rKSB7Ci0gICAgY2FzZSBYTUxfVE9LX1RSQUlMSU5HX0NSOgotICAgICAgaWYgKG5leHRQdHIpIHsKLQkqbmV4dFB0ciA9IHM7Ci0JcmV0dXJuIFhNTF9FUlJPUl9OT05FOwotICAgICAgfQotICAgICAgKmV2ZW50RW5kUFAgPSBlbmQ7Ci0gICAgICBpZiAoY2hhcmFjdGVyRGF0YUhhbmRsZXIpIHsKLQlYTUxfQ2hhciBjID0gMHhBOwotCWNoYXJhY3RlckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsICZjLCAxKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGRlZmF1bHRIYW5kbGVyKQotCXJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIGVuZCk7Ci0gICAgICBpZiAoc3RhcnRUYWdMZXZlbCA9PSAwKQotCXJldHVybiBYTUxfRVJST1JfTk9fRUxFTUVOVFM7Ci0gICAgICBpZiAodGFnTGV2ZWwgIT0gc3RhcnRUYWdMZXZlbCkKLQlyZXR1cm4gWE1MX0VSUk9SX0FTWU5DX0VOVElUWTsKLSAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKLSAgICBjYXNlIFhNTF9UT0tfTk9ORToKLSAgICAgIGlmIChuZXh0UHRyKSB7Ci0JKm5leHRQdHIgPSBzOwotCXJldHVybiBYTUxfRVJST1JfTk9ORTsKLSAgICAgIH0KLSAgICAgIGlmIChzdGFydFRhZ0xldmVsID4gMCkgewotCWlmICh0YWdMZXZlbCAhPSBzdGFydFRhZ0xldmVsKQotCSAgcmV0dXJuIFhNTF9FUlJPUl9BU1lOQ19FTlRJVFk7Ci0JcmV0dXJuIFhNTF9FUlJPUl9OT05FOwotICAgICAgfQotICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19FTEVNRU5UUzsKLSAgICBjYXNlIFhNTF9UT0tfSU5WQUxJRDoKLSAgICAgICpldmVudFBQID0gbmV4dDsKLSAgICAgIHJldHVybiBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTjsKLSAgICBjYXNlIFhNTF9UT0tfUEFSVElBTDoKLSAgICAgIGlmIChuZXh0UHRyKSB7Ci0JKm5leHRQdHIgPSBzOwotCXJldHVybiBYTUxfRVJST1JfTk9ORTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBYTUxfRVJST1JfVU5DTE9TRURfVE9LRU47Ci0gICAgY2FzZSBYTUxfVE9LX1BBUlRJQUxfQ0hBUjoKLSAgICAgIGlmIChuZXh0UHRyKSB7Ci0JKm5leHRQdHIgPSBzOwotCXJldHVybiBYTUxfRVJST1JfTk9ORTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBYTUxfRVJST1JfUEFSVElBTF9DSEFSOwotICAgIGNhc2UgWE1MX1RPS19FTlRJVFlfUkVGOgotICAgICAgewotCWNvbnN0IFhNTF9DaGFyICpuYW1lOwotCUVOVElUWSAqZW50aXR5OwotCVhNTF9DaGFyIGNoID0gWG1sUHJlZGVmaW5lZEVudGl0eU5hbWUoZW5jLAotCQkJCQkgICAgICBzICsgZW5jLT5taW5CeXRlc1BlckNoYXIsCi0JCQkJCSAgICAgIG5leHQgLSBlbmMtPm1pbkJ5dGVzUGVyQ2hhcik7Ci0JaWYgKGNoKSB7Ci0JICBpZiAoY2hhcmFjdGVyRGF0YUhhbmRsZXIpCi0JICAgIGNoYXJhY3RlckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsICZjaCwgMSk7Ci0JICBlbHNlIGlmIChkZWZhdWx0SGFuZGxlcikKLQkgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcywgbmV4dCk7Ci0JICBicmVhazsKLQl9Ci0JbmFtZSA9IHBvb2xTdG9yZVN0cmluZygmZHRkLnBvb2wsIGVuYywKLQkJCQlzICsgZW5jLT5taW5CeXRlc1BlckNoYXIsCi0JCQkJbmV4dCAtIGVuYy0+bWluQnl0ZXNQZXJDaGFyKTsKLQlpZiAoIW5hbWUpCi0JICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKLQllbnRpdHkgPSAoRU5USVRZICopbG9va3VwKCZkdGQuZ2VuZXJhbEVudGl0aWVzLCBuYW1lLCAwKTsKLQlwb29sRGlzY2FyZCgmZHRkLnBvb2wpOwotCWlmICghZW50aXR5KSB7Ci0JICBpZiAoZHRkLmNvbXBsZXRlIHx8IGR0ZC5zdGFuZGFsb25lKQotCSAgICByZXR1cm4gWE1MX0VSUk9SX1VOREVGSU5FRF9FTlRJVFk7Ci0JICBpZiAoZGVmYXVsdEhhbmRsZXIpCi0JICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIG5leHQpOwotCSAgYnJlYWs7Ci0JfQotCWlmIChlbnRpdHktPm9wZW4pCi0JICByZXR1cm4gWE1MX0VSUk9SX1JFQ1VSU0lWRV9FTlRJVFlfUkVGOwotCWlmIChlbnRpdHktPm5vdGF0aW9uKQotCSAgcmV0dXJuIFhNTF9FUlJPUl9CSU5BUllfRU5USVRZX1JFRjsKLQlpZiAoZW50aXR5KSB7Ci0JICBpZiAoZW50aXR5LT50ZXh0UHRyKSB7Ci0JICAgIGVudW0gWE1MX0Vycm9yIHJlc3VsdDsKLQkgICAgT1BFTl9JTlRFUk5BTF9FTlRJVFkgb3BlbkVudGl0eTsKLQkgICAgaWYgKGRlZmF1bHRIYW5kbGVyICYmICFkZWZhdWx0RXhwYW5kSW50ZXJuYWxFbnRpdGllcykgewotCSAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIG5leHQpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAgIGVudGl0eS0+b3BlbiA9IDE7Ci0JICAgIG9wZW5FbnRpdHkubmV4dCA9IG9wZW5JbnRlcm5hbEVudGl0aWVzOwotCSAgICBvcGVuSW50ZXJuYWxFbnRpdGllcyA9ICZvcGVuRW50aXR5OwotCSAgICBvcGVuRW50aXR5LmVudGl0eSA9IGVudGl0eTsKLQkgICAgb3BlbkVudGl0eS5pbnRlcm5hbEV2ZW50UHRyID0gMDsKLQkgICAgb3BlbkVudGl0eS5pbnRlcm5hbEV2ZW50RW5kUHRyID0gMDsKLQkgICAgcmVzdWx0ID0gZG9Db250ZW50KHBhcnNlciwKLQkJCSAgICAgICB0YWdMZXZlbCwKLQkJCSAgICAgICBpbnRlcm5hbEVuYywKLQkJCSAgICAgICAoY2hhciAqKWVudGl0eS0+dGV4dFB0ciwKLQkJCSAgICAgICAoY2hhciAqKShlbnRpdHktPnRleHRQdHIgKyBlbnRpdHktPnRleHRMZW4pLAotCQkJICAgICAgIDApOwotCSAgICBlbnRpdHktPm9wZW4gPSAwOwotCSAgICBvcGVuSW50ZXJuYWxFbnRpdGllcyA9IG9wZW5FbnRpdHkubmV4dDsKLQkgICAgaWYgKHJlc3VsdCkKLQkgICAgICByZXR1cm4gcmVzdWx0OwotCSAgfQotCSAgZWxzZSBpZiAoZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKSB7Ci0JICAgIGNvbnN0IFhNTF9DaGFyICpjb250ZXh0OwotCSAgICBlbnRpdHktPm9wZW4gPSAxOwotCSAgICBjb250ZXh0ID0gZ2V0Q29udGV4dChwYXJzZXIpOwotCSAgICBlbnRpdHktPm9wZW4gPSAwOwotCSAgICBpZiAoIWNvbnRleHQpCi0JICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0JICAgIGlmICghZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKGV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZywKLQkJCQkgICAgICAgICAgY29udGV4dCwKLQkJCQkJICBkdGQuYmFzZSwKLQkJCQkJICBlbnRpdHktPnN5c3RlbUlkLAotCQkJCQkgIGVudGl0eS0+cHVibGljSWQpKQotCSAgICAgIHJldHVybiBYTUxfRVJST1JfRVhURVJOQUxfRU5USVRZX0hBTkRMSU5HOwotCSAgICBwb29sRGlzY2FyZCgmdGVtcFBvb2wpOwotCSAgfQotCSAgZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCi0JICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIG5leHQpOwotCX0KLQlicmVhazsKLSAgICAgIH0KLSAgICBjYXNlIFhNTF9UT0tfU1RBUlRfVEFHX1dJVEhfQVRUUzoKLSAgICAgIGlmICghc3RhcnRFbGVtZW50SGFuZGxlcikgewotCWVudW0gWE1MX0Vycm9yIHJlc3VsdCA9IHN0b3JlQXR0cyhwYXJzZXIsIGVuYywgcywgMCwgMCk7Ci0JaWYgKHJlc3VsdCkKLQkgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICBjYXNlIFhNTF9UT0tfU1RBUlRfVEFHX05PX0FUVFM6Ci0gICAgICB7Ci0JVEFHICp0YWc7Ci0JaWYgKGZyZWVUYWdMaXN0KSB7Ci0JICB0YWcgPSBmcmVlVGFnTGlzdDsKLQkgIGZyZWVUYWdMaXN0ID0gZnJlZVRhZ0xpc3QtPnBhcmVudDsKLQl9Ci0JZWxzZSB7Ci0JICB0YWcgPSBtYWxsb2Moc2l6ZW9mKFRBRykpOwotCSAgaWYgKCF0YWcpCi0JICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOwotCSAgdGFnLT5idWYgPSBtYWxsb2MoSU5JVF9UQUdfQlVGX1NJWkUpOwotCSAgaWYgKCF0YWctPmJ1ZikKLQkgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0JICB0YWctPmJ1ZkVuZCA9IHRhZy0+YnVmICsgSU5JVF9UQUdfQlVGX1NJWkU7Ci0JfQotCXRhZy0+YmluZGluZ3MgPSAwOwotCXRhZy0+cGFyZW50ID0gdGFnU3RhY2s7Ci0JdGFnU3RhY2sgPSB0YWc7Ci0JdGFnLT5uYW1lLmxvY2FsUGFydCA9IDA7Ci0JdGFnLT5yYXdOYW1lID0gcyArIGVuYy0+bWluQnl0ZXNQZXJDaGFyOwotCXRhZy0+cmF3TmFtZUxlbmd0aCA9IFhtbE5hbWVMZW5ndGgoZW5jLCB0YWctPnJhd05hbWUpOwotCWlmIChuZXh0UHRyKSB7Ci0JICAvKiBOZWVkIHRvIGd1YXJhbnRlZSB0aGF0OgotCSAgICAgdGFnLT5idWYgKyBST1VORF9VUCh0YWctPnJhd05hbWVMZW5ndGgsIHNpemVvZihYTUxfQ2hhcikpIDw9IHRhZy0+YnVmRW5kIC0gc2l6ZW9mKFhNTF9DaGFyKSAqLwotCSAgaWYgKHRhZy0+cmF3TmFtZUxlbmd0aCArIChpbnQpKHNpemVvZihYTUxfQ2hhcikgLSAxKSArIChpbnQpc2l6ZW9mKFhNTF9DaGFyKSA+IHRhZy0+YnVmRW5kIC0gdGFnLT5idWYpIHsKLQkgICAgaW50IGJ1ZlNpemUgPSB0YWctPnJhd05hbWVMZW5ndGggKiA0OwotCSAgICBidWZTaXplID0gUk9VTkRfVVAoYnVmU2l6ZSwgc2l6ZW9mKFhNTF9DaGFyKSk7Ci0JICAgIHRhZy0+YnVmID0gcmVhbGxvYyh0YWctPmJ1ZiwgYnVmU2l6ZSk7Ci0JICAgIGlmICghdGFnLT5idWYpCi0JICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0JICAgIHRhZy0+YnVmRW5kID0gdGFnLT5idWYgKyBidWZTaXplOwotCSAgfQotCSAgbWVtY3B5KHRhZy0+YnVmLCB0YWctPnJhd05hbWUsIHRhZy0+cmF3TmFtZUxlbmd0aCk7Ci0JICB0YWctPnJhd05hbWUgPSB0YWctPmJ1ZjsKLQl9Ci0JKyt0YWdMZXZlbDsKLQlpZiAoc3RhcnRFbGVtZW50SGFuZGxlcikgewotCSAgZW51bSBYTUxfRXJyb3IgcmVzdWx0OwotCSAgWE1MX0NoYXIgKnRvUHRyOwotCSAgZm9yICg7OykgewotCSAgICBjb25zdCBjaGFyICpyYXdOYW1lRW5kID0gdGFnLT5yYXdOYW1lICsgdGFnLT5yYXdOYW1lTGVuZ3RoOwotCSAgICBjb25zdCBjaGFyICpmcm9tUHRyID0gdGFnLT5yYXdOYW1lOwotCSAgICBpbnQgYnVmU2l6ZTsKLQkgICAgaWYgKG5leHRQdHIpCi0JICAgICAgdG9QdHIgPSAoWE1MX0NoYXIgKikodGFnLT5idWYgKyBST1VORF9VUCh0YWctPnJhd05hbWVMZW5ndGgsIHNpemVvZihYTUxfQ2hhcikpKTsKLQkgICAgZWxzZQotCSAgICAgIHRvUHRyID0gKFhNTF9DaGFyICopdGFnLT5idWY7Ci0JICAgIHRhZy0+bmFtZS5zdHIgPSB0b1B0cjsKLQkgICAgWG1sQ29udmVydChlbmMsCi0JCSAgICAgICAmZnJvbVB0ciwgcmF3TmFtZUVuZCwKLQkJICAgICAgIChJQ0hBUiAqKikmdG9QdHIsIChJQ0hBUiAqKXRhZy0+YnVmRW5kIC0gMSk7Ci0JICAgIGlmIChmcm9tUHRyID09IHJhd05hbWVFbmQpCi0JICAgICAgYnJlYWs7Ci0JICAgIGJ1ZlNpemUgPSAodGFnLT5idWZFbmQgLSB0YWctPmJ1ZikgPDwgMTsKLQkgICAgdGFnLT5idWYgPSByZWFsbG9jKHRhZy0+YnVmLCBidWZTaXplKTsKLQkgICAgaWYgKCF0YWctPmJ1ZikKLQkgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKLQkgICAgdGFnLT5idWZFbmQgPSB0YWctPmJ1ZiArIGJ1ZlNpemU7Ci0JICAgIGlmIChuZXh0UHRyKQotCSAgICAgIHRhZy0+cmF3TmFtZSA9IHRhZy0+YnVmOwotCSAgfQotCSAgKnRvUHRyID0gWE1MX1QoJ1wwJyk7Ci0JICByZXN1bHQgPSBzdG9yZUF0dHMocGFyc2VyLCBlbmMsIHMsICYodGFnLT5uYW1lKSwgJih0YWctPmJpbmRpbmdzKSk7Ci0JICBpZiAocmVzdWx0KQotCSAgICByZXR1cm4gcmVzdWx0OwotCSAgc3RhcnRFbGVtZW50SGFuZGxlcihoYW5kbGVyQXJnLCB0YWctPm5hbWUuc3RyLCAoY29uc3QgWE1MX0NoYXIgKiopYXR0cyk7Ci0JICBwb29sQ2xlYXIoJnRlbXBQb29sKTsKLQl9Ci0JZWxzZSB7Ci0JICB0YWctPm5hbWUuc3RyID0gMDsKLQkgIGlmIChkZWZhdWx0SGFuZGxlcikKLQkgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcywgbmV4dCk7Ci0JfQotCWJyZWFrOwotICAgICAgfQotICAgIGNhc2UgWE1MX1RPS19FTVBUWV9FTEVNRU5UX1dJVEhfQVRUUzoKLSAgICAgIGlmICghc3RhcnRFbGVtZW50SGFuZGxlcikgewotCWVudW0gWE1MX0Vycm9yIHJlc3VsdCA9IHN0b3JlQXR0cyhwYXJzZXIsIGVuYywgcywgMCwgMCk7Ci0JaWYgKHJlc3VsdCkKLQkgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICBjYXNlIFhNTF9UT0tfRU1QVFlfRUxFTUVOVF9OT19BVFRTOgotICAgICAgaWYgKHN0YXJ0RWxlbWVudEhhbmRsZXIgfHwgZW5kRWxlbWVudEhhbmRsZXIpIHsKLQljb25zdCBjaGFyICpyYXdOYW1lID0gcyArIGVuYy0+bWluQnl0ZXNQZXJDaGFyOwotCWVudW0gWE1MX0Vycm9yIHJlc3VsdDsKLQlCSU5ESU5HICpiaW5kaW5ncyA9IDA7Ci0JVEFHX05BTUUgbmFtZTsKLQluYW1lLnN0ciA9IHBvb2xTdG9yZVN0cmluZygmdGVtcFBvb2wsIGVuYywgcmF3TmFtZSwKLQkJCQkgICByYXdOYW1lICsgWG1sTmFtZUxlbmd0aChlbmMsIHJhd05hbWUpKTsKLQlpZiAoIW5hbWUuc3RyKQotCSAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0JcG9vbEZpbmlzaCgmdGVtcFBvb2wpOwotCXJlc3VsdCA9IHN0b3JlQXR0cyhwYXJzZXIsIGVuYywgcywgJm5hbWUsICZiaW5kaW5ncyk7Ci0JaWYgKHJlc3VsdCkKLQkgIHJldHVybiByZXN1bHQ7Ci0JcG9vbEZpbmlzaCgmdGVtcFBvb2wpOwotCWlmIChzdGFydEVsZW1lbnRIYW5kbGVyKQotCSAgc3RhcnRFbGVtZW50SGFuZGxlcihoYW5kbGVyQXJnLCBuYW1lLnN0ciwgKGNvbnN0IFhNTF9DaGFyICoqKWF0dHMpOwotCWlmIChlbmRFbGVtZW50SGFuZGxlcikgewotCSAgaWYgKHN0YXJ0RWxlbWVudEhhbmRsZXIpCi0JICAgICpldmVudFBQID0gKmV2ZW50RW5kUFA7Ci0JICBlbmRFbGVtZW50SGFuZGxlcihoYW5kbGVyQXJnLCBuYW1lLnN0cik7Ci0JfQotCXBvb2xDbGVhcigmdGVtcFBvb2wpOwotCXdoaWxlIChiaW5kaW5ncykgewotCSAgQklORElORyAqYiA9IGJpbmRpbmdzOwotCSAgaWYgKGVuZE5hbWVzcGFjZURlY2xIYW5kbGVyKQotCSAgICBlbmROYW1lc3BhY2VEZWNsSGFuZGxlcihoYW5kbGVyQXJnLCBiLT5wcmVmaXgtPm5hbWUpOwotCSAgYmluZGluZ3MgPSBiaW5kaW5ncy0+bmV4dFRhZ0JpbmRpbmc7Ci0JICBiLT5uZXh0VGFnQmluZGluZyA9IGZyZWVCaW5kaW5nTGlzdDsKLQkgIGZyZWVCaW5kaW5nTGlzdCA9IGI7Ci0JICBiLT5wcmVmaXgtPmJpbmRpbmcgPSBiLT5wcmV2UHJlZml4QmluZGluZzsKLQl9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChkZWZhdWx0SGFuZGxlcikKLQlyZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKLSAgICAgIGlmICh0YWdMZXZlbCA9PSAwKQotCXJldHVybiBlcGlsb2dQcm9jZXNzb3IocGFyc2VyLCBuZXh0LCBlbmQsIG5leHRQdHIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYTUxfVE9LX0VORF9UQUc6Ci0gICAgICBpZiAodGFnTGV2ZWwgPT0gc3RhcnRUYWdMZXZlbCkKLSAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9BU1lOQ19FTlRJVFk7Ci0gICAgICBlbHNlIHsKLQlpbnQgbGVuOwotCWNvbnN0IGNoYXIgKnJhd05hbWU7Ci0JVEFHICp0YWcgPSB0YWdTdGFjazsKLQl0YWdTdGFjayA9IHRhZy0+cGFyZW50OwotCXRhZy0+cGFyZW50ID0gZnJlZVRhZ0xpc3Q7Ci0JZnJlZVRhZ0xpc3QgPSB0YWc7Ci0JcmF3TmFtZSA9IHMgKyBlbmMtPm1pbkJ5dGVzUGVyQ2hhcioyOwotCWxlbiA9IFhtbE5hbWVMZW5ndGgoZW5jLCByYXdOYW1lKTsKLQlpZiAobGVuICE9IHRhZy0+cmF3TmFtZUxlbmd0aAotCSAgICB8fCBtZW1jbXAodGFnLT5yYXdOYW1lLCByYXdOYW1lLCBsZW4pICE9IDApIHsKLQkgICpldmVudFBQID0gcmF3TmFtZTsKLQkgIHJldHVybiBYTUxfRVJST1JfVEFHX01JU01BVENIOwotCX0KLQktLXRhZ0xldmVsOwotCWlmIChlbmRFbGVtZW50SGFuZGxlciAmJiB0YWctPm5hbWUuc3RyKSB7Ci0JICBpZiAodGFnLT5uYW1lLmxvY2FsUGFydCkgewotCSAgICBYTUxfQ2hhciAqdG8gPSAoWE1MX0NoYXIgKil0YWctPm5hbWUuc3RyICsgdGFnLT5uYW1lLnVyaUxlbjsKLQkgICAgY29uc3QgWE1MX0NoYXIgKmZyb20gPSB0YWctPm5hbWUubG9jYWxQYXJ0OwotCSAgICB3aGlsZSAoKCp0bysrID0gKmZyb20rKykgIT0gMCkKLQkgICAgICA7Ci0JICB9Ci0JICBlbmRFbGVtZW50SGFuZGxlcihoYW5kbGVyQXJnLCB0YWctPm5hbWUuc3RyKTsKLQl9Ci0JZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCi0JICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKLQl3aGlsZSAodGFnLT5iaW5kaW5ncykgewotCSAgQklORElORyAqYiA9IHRhZy0+YmluZGluZ3M7Ci0JICBpZiAoZW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIpCi0JICAgIGVuZE5hbWVzcGFjZURlY2xIYW5kbGVyKGhhbmRsZXJBcmcsIGItPnByZWZpeC0+bmFtZSk7Ci0JICB0YWctPmJpbmRpbmdzID0gdGFnLT5iaW5kaW5ncy0+bmV4dFRhZ0JpbmRpbmc7Ci0JICBiLT5uZXh0VGFnQmluZGluZyA9IGZyZWVCaW5kaW5nTGlzdDsKLQkgIGZyZWVCaW5kaW5nTGlzdCA9IGI7Ci0JICBiLT5wcmVmaXgtPmJpbmRpbmcgPSBiLT5wcmV2UHJlZml4QmluZGluZzsKLQl9Ci0JaWYgKHRhZ0xldmVsID09IDApCi0JICByZXR1cm4gZXBpbG9nUHJvY2Vzc29yKHBhcnNlciwgbmV4dCwgZW5kLCBuZXh0UHRyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWE1MX1RPS19DSEFSX1JFRjoKLSAgICAgIHsKLQlpbnQgbiA9IFhtbENoYXJSZWZOdW1iZXIoZW5jLCBzKTsKLQlpZiAobiA8IDApCi0JICByZXR1cm4gWE1MX0VSUk9SX0JBRF9DSEFSX1JFRjsKLQlpZiAoY2hhcmFjdGVyRGF0YUhhbmRsZXIpIHsKLQkgIFhNTF9DaGFyIGJ1ZltYTUxfRU5DT0RFX01BWF07Ci0JICBjaGFyYWN0ZXJEYXRhSGFuZGxlcihoYW5kbGVyQXJnLCBidWYsIFhtbEVuY29kZShuLCAoSUNIQVIgKilidWYpKTsKLQl9Ci0JZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCi0JICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWE1MX1RPS19YTUxfREVDTDoKLSAgICAgIHJldHVybiBYTUxfRVJST1JfTUlTUExBQ0VEX1hNTF9QSTsKLSAgICBjYXNlIFhNTF9UT0tfREFUQV9ORVdMSU5FOgotICAgICAgaWYgKGNoYXJhY3RlckRhdGFIYW5kbGVyKSB7Ci0JWE1MX0NoYXIgYyA9IDB4QTsKLQljaGFyYWN0ZXJEYXRhSGFuZGxlcihoYW5kbGVyQXJnLCAmYywgMSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChkZWZhdWx0SGFuZGxlcikKLQlyZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWE1MX1RPS19DREFUQV9TRUNUX09QRU46Ci0gICAgICB7Ci0JZW51bSBYTUxfRXJyb3IgcmVzdWx0OwotCWlmIChzdGFydENkYXRhU2VjdGlvbkhhbmRsZXIpCi0gIAkgIHN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcihoYW5kbGVyQXJnKTsKLSNpZiAwCi0JLyogU3VwcG9zZSB5b3UgZG9pbmcgYSB0cmFuc2Zvcm1hdGlvbiBvbiBhIGRvY3VtZW50IHRoYXQgaW52b2x2ZXMKLQkgICBjaGFuZ2luZyBvbmx5IHRoZSBjaGFyYWN0ZXIgZGF0YS4gIFlvdSBzZXQgdXAgYSBkZWZhdWx0SGFuZGxlcgotCSAgIGFuZCBhIGNoYXJhY3RlckRhdGFIYW5kbGVyLiAgVGhlIGRlZmF1bHRIYW5kbGVyIHNpbXBseSBjb3BpZXMKLQkgICBjaGFyYWN0ZXJzIHRocm91Z2guICBUaGUgY2hhcmFjdGVyRGF0YUhhbmRsZXIgZG9lcyB0aGUgdHJhbnNmb3JtYXRpb24KLQkgICBhbmQgd3JpdGVzIHRoZSBjaGFyYWN0ZXJzIG91dCBlc2NhcGluZyB0aGVtIGFzIG5lY2Vzc2FyeS4gIFRoaXMgY2FzZQotCSAgIHdpbGwgZmFpbCB0byB3b3JrIGlmIHdlIGxlYXZlIG91dCB0aGUgZm9sbG93aW5nIHR3byBsaW5lcyAoYmVjYXVzZSAmCi0JICAgYW5kIDwgaW5zaWRlIENEQVRBIHNlY3Rpb25zIHdpbGwgYmUgaW5jb3JyZWN0bHkgZXNjYXBlZCkuCi0KLQkgICBIb3dldmVyLCBub3cgd2UgaGF2ZSBhIHN0YXJ0L2VuZENkYXRhU2VjdGlvbkhhbmRsZXIsIHNvIGl0IHNlZW1zCi0JICAgZWFzaWVyIHRvIGxldCB0aGUgdXNlciBkZWFsIHdpdGggdGhpcy4gKi8KLQotCWVsc2UgaWYgKGNoYXJhY3RlckRhdGFIYW5kbGVyKQotICAJICBjaGFyYWN0ZXJEYXRhSGFuZGxlcihoYW5kbGVyQXJnLCBkYXRhQnVmLCAwKTsKLSNlbmRpZgotCWVsc2UgaWYgKGRlZmF1bHRIYW5kbGVyKQotCSAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcywgbmV4dCk7Ci0JcmVzdWx0ID0gZG9DZGF0YVNlY3Rpb24ocGFyc2VyLCBlbmMsICZuZXh0LCBlbmQsIG5leHRQdHIpOwotCWlmICghbmV4dCkgewotCSAgcHJvY2Vzc29yID0gY2RhdGFTZWN0aW9uUHJvY2Vzc29yOwotCSAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhNTF9UT0tfVFJBSUxJTkdfUlNRQjoKLSAgICAgIGlmIChuZXh0UHRyKSB7Ci0JKm5leHRQdHIgPSBzOwotCXJldHVybiBYTUxfRVJST1JfTk9ORTsKLSAgICAgIH0KLSAgICAgIGlmIChjaGFyYWN0ZXJEYXRhSGFuZGxlcikgewotCWlmIChNVVNUX0NPTlZFUlQoZW5jLCBzKSkgewotCSAgSUNIQVIgKmRhdGFQdHIgPSAoSUNIQVIgKilkYXRhQnVmOwotCSAgWG1sQ29udmVydChlbmMsICZzLCBlbmQsICZkYXRhUHRyLCAoSUNIQVIgKilkYXRhQnVmRW5kKTsKLQkgIGNoYXJhY3RlckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsIGRhdGFCdWYsIGRhdGFQdHIgLSAoSUNIQVIgKilkYXRhQnVmKTsKLQl9Ci0JZWxzZQotCSAgY2hhcmFjdGVyRGF0YUhhbmRsZXIoaGFuZGxlckFyZywKLQkJICAJICAgICAgIChYTUxfQ2hhciAqKXMsCi0JCQkgICAgICAgKFhNTF9DaGFyICopZW5kIC0gKFhNTF9DaGFyICopcyk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChkZWZhdWx0SGFuZGxlcikKLQlyZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBlbmQpOwotICAgICAgaWYgKHN0YXJ0VGFnTGV2ZWwgPT0gMCkgewotICAgICAgICAqZXZlbnRQUCA9IGVuZDsKLQlyZXR1cm4gWE1MX0VSUk9SX05PX0VMRU1FTlRTOwotICAgICAgfQotICAgICAgaWYgKHRhZ0xldmVsICE9IHN0YXJ0VGFnTGV2ZWwpIHsKLQkqZXZlbnRQUCA9IGVuZDsKLQlyZXR1cm4gWE1MX0VSUk9SX0FTWU5DX0VOVElUWTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKLSAgICBjYXNlIFhNTF9UT0tfREFUQV9DSEFSUzoKLSAgICAgIGlmIChjaGFyYWN0ZXJEYXRhSGFuZGxlcikgewotCWlmIChNVVNUX0NPTlZFUlQoZW5jLCBzKSkgewotCSAgZm9yICg7OykgewotCSAgICBJQ0hBUiAqZGF0YVB0ciA9IChJQ0hBUiAqKWRhdGFCdWY7Ci0JICAgIFhtbENvbnZlcnQoZW5jLCAmcywgbmV4dCwgJmRhdGFQdHIsIChJQ0hBUiAqKWRhdGFCdWZFbmQpOwotCSAgICAqZXZlbnRFbmRQUCA9IHM7Ci0JICAgIGNoYXJhY3RlckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsIGRhdGFCdWYsIGRhdGFQdHIgLSAoSUNIQVIgKilkYXRhQnVmKTsKLQkgICAgaWYgKHMgPT0gbmV4dCkKLQkgICAgICBicmVhazsKLQkgICAgKmV2ZW50UFAgPSBzOwotCSAgfQotCX0KLQllbHNlCi0JICBjaGFyYWN0ZXJEYXRhSGFuZGxlcihoYW5kbGVyQXJnLAotCQkJICAgICAgIChYTUxfQ2hhciAqKXMsCi0JCQkgICAgICAgKFhNTF9DaGFyICopbmV4dCAtIChYTUxfQ2hhciAqKXMpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCi0JcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcywgbmV4dCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhNTF9UT0tfUEk6Ci0gICAgICBpZiAoIXJlcG9ydFByb2Nlc3NpbmdJbnN0cnVjdGlvbihwYXJzZXIsIGVuYywgcywgbmV4dCkpCi0JcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhNTF9UT0tfQ09NTUVOVDoKLSAgICAgIGlmICghcmVwb3J0Q29tbWVudChwYXJzZXIsIGVuYywgcywgbmV4dCkpCi0JcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKGRlZmF1bHRIYW5kbGVyKQotCXJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIG5leHQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgICpldmVudFBQID0gcyA9IG5leHQ7Ci0gIH0KLSAgLyogbm90IHJlYWNoZWQgKi8KLX0KLQotLyogSWYgdGFnTmFtZVB0ciBpcyBub24tbnVsbCwgYnVpbGQgYSByZWFsIGxpc3Qgb2YgYXR0cmlidXRlcywKLW90aGVyd2lzZSBqdXN0IGNoZWNrIHRoZSBhdHRyaWJ1dGVzIGZvciB3ZWxsLWZvcm1lZG5lc3MuICovCi0KLXN0YXRpYyBlbnVtIFhNTF9FcnJvciBzdG9yZUF0dHMoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IEVOQ09ESU5HICplbmMsCi0JCQkJY29uc3QgY2hhciAqcywgVEFHX05BTUUgKnRhZ05hbWVQdHIsCi0JCQkJQklORElORyAqKmJpbmRpbmdzUHRyKQotewotICBFTEVNRU5UX1RZUEUgKmVsZW1lbnRUeXBlID0gMDsKLSAgaW50IG5EZWZhdWx0QXR0cyA9IDA7Ci0gIGNvbnN0IFhNTF9DaGFyICoqYXBwQXR0czsKLSAgaW50IGF0dEluZGV4ID0gMDsKLSAgaW50IGk7Ci0gIGludCBuOwotICBpbnQgblByZWZpeGVzID0gMDsKLSAgQklORElORyAqYmluZGluZzsKLSAgY29uc3QgWE1MX0NoYXIgKmxvY2FsUGFydDsKLQotICBpZiAodGFnTmFtZVB0cikgewotICAgIGVsZW1lbnRUeXBlID0gKEVMRU1FTlRfVFlQRSAqKWxvb2t1cCgmZHRkLmVsZW1lbnRUeXBlcywgdGFnTmFtZVB0ci0+c3RyLCAwKTsKLSAgICBpZiAoIWVsZW1lbnRUeXBlKSB7Ci0gICAgICB0YWdOYW1lUHRyLT5zdHIgPSBwb29sQ29weVN0cmluZygmZHRkLnBvb2wsIHRhZ05hbWVQdHItPnN0cik7Ci0gICAgICBpZiAoIXRhZ05hbWVQdHItPnN0cikKLQlyZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKLSAgICAgIGVsZW1lbnRUeXBlID0gKEVMRU1FTlRfVFlQRSAqKWxvb2t1cCgmZHRkLmVsZW1lbnRUeXBlcywgdGFnTmFtZVB0ci0+c3RyLCBzaXplb2YoRUxFTUVOVF9UWVBFKSk7Ci0gICAgICBpZiAoIWVsZW1lbnRUeXBlKQotICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKLSAgICAgIGlmIChucyAmJiAhc2V0RWxlbWVudFR5cGVQcmVmaXgocGFyc2VyLCBlbGVtZW50VHlwZSkpCi0gICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOwotICAgIH0KLSAgICBuRGVmYXVsdEF0dHMgPSBlbGVtZW50VHlwZS0+bkRlZmF1bHRBdHRzOwotICB9Ci0gIG4gPSBYbWxHZXRBdHRyaWJ1dGVzKGVuYywgcywgYXR0c1NpemUsIGF0dHMpOwotICBpZiAobiArIG5EZWZhdWx0QXR0cyA+IGF0dHNTaXplKSB7Ci0gICAgaW50IG9sZEF0dHNTaXplID0gYXR0c1NpemU7Ci0gICAgYXR0c1NpemUgPSBuICsgbkRlZmF1bHRBdHRzICsgSU5JVF9BVFRTX1NJWkU7Ci0gICAgYXR0cyA9IHJlYWxsb2MoKHZvaWQgKilhdHRzLCBhdHRzU2l6ZSAqIHNpemVvZihBVFRSSUJVVEUpKTsKLSAgICBpZiAoIWF0dHMpCi0gICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKLSAgICBpZiAobiA+IG9sZEF0dHNTaXplKQotICAgICAgWG1sR2V0QXR0cmlidXRlcyhlbmMsIHMsIG4sIGF0dHMpOwotICB9Ci0gIGFwcEF0dHMgPSAoY29uc3QgWE1MX0NoYXIgKiopYXR0czsKLSAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotICAgIEFUVFJJQlVURV9JRCAqYXR0SWQgPSBnZXRBdHRyaWJ1dGVJZChwYXJzZXIsIGVuYywgYXR0c1tpXS5uYW1lLAotCQkJCQkgYXR0c1tpXS5uYW1lCi0JCQkJCSArIFhtbE5hbWVMZW5ndGgoZW5jLCBhdHRzW2ldLm5hbWUpKTsKLSAgICBpZiAoIWF0dElkKQotICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0gICAgaWYgKChhdHRJZC0+bmFtZSlbLTFdKSB7Ci0gICAgICBpZiAoZW5jID09IGVuY29kaW5nKQotCWV2ZW50UHRyID0gYXR0c1tpXS5uYW1lOwotICAgICAgcmV0dXJuIFhNTF9FUlJPUl9EVVBMSUNBVEVfQVRUUklCVVRFOwotICAgIH0KLSAgICAoYXR0SWQtPm5hbWUpWy0xXSA9IDE7Ci0gICAgYXBwQXR0c1thdHRJbmRleCsrXSA9IGF0dElkLT5uYW1lOwotICAgIGlmICghYXR0c1tpXS5ub3JtYWxpemVkKSB7Ci0gICAgICBlbnVtIFhNTF9FcnJvciByZXN1bHQ7Ci0gICAgICBpbnQgaXNDZGF0YSA9IDE7Ci0KLSAgICAgIGlmIChhdHRJZC0+bWF5YmVUb2tlbml6ZWQpIHsKLQlpbnQgajsKLQlmb3IgKGogPSAwOyBqIDwgbkRlZmF1bHRBdHRzOyBqKyspIHsKLQkgIGlmIChhdHRJZCA9PSBlbGVtZW50VHlwZS0+ZGVmYXVsdEF0dHNbal0uaWQpIHsKLQkgICAgaXNDZGF0YSA9IGVsZW1lbnRUeXBlLT5kZWZhdWx0QXR0c1tqXS5pc0NkYXRhOwotCSAgICBicmVhazsKLQkgIH0KLQl9Ci0gICAgICB9Ci0KLSAgICAgIHJlc3VsdCA9IHN0b3JlQXR0cmlidXRlVmFsdWUocGFyc2VyLCBlbmMsIGlzQ2RhdGEsCi0JCQkJICAgYXR0c1tpXS52YWx1ZVB0ciwgYXR0c1tpXS52YWx1ZUVuZCwKLQkJCSAgICAgICAgICAgJnRlbXBQb29sKTsKLSAgICAgIGlmIChyZXN1bHQpCi0JcmV0dXJuIHJlc3VsdDsKLSAgICAgIGlmICh0YWdOYW1lUHRyKSB7Ci0JYXBwQXR0c1thdHRJbmRleF0gPSBwb29sU3RhcnQoJnRlbXBQb29sKTsKLQlwb29sRmluaXNoKCZ0ZW1wUG9vbCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0JcG9vbERpc2NhcmQoJnRlbXBQb29sKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAodGFnTmFtZVB0cikgewotICAgICAgYXBwQXR0c1thdHRJbmRleF0gPSBwb29sU3RvcmVTdHJpbmcoJnRlbXBQb29sLCBlbmMsIGF0dHNbaV0udmFsdWVQdHIsIGF0dHNbaV0udmFsdWVFbmQpOwotICAgICAgaWYgKGFwcEF0dHNbYXR0SW5kZXhdID09IDApCi0JcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0gICAgICBwb29sRmluaXNoKCZ0ZW1wUG9vbCk7Ci0gICAgfQotICAgIGlmIChhdHRJZC0+cHJlZml4ICYmIHRhZ05hbWVQdHIpIHsKLSAgICAgIGlmIChhdHRJZC0+eG1sbnMpIHsKLSAgICAgICAgaWYgKCFhZGRCaW5kaW5nKHBhcnNlciwgYXR0SWQtPnByZWZpeCwgYXR0SWQsIGFwcEF0dHNbYXR0SW5kZXhdLCBiaW5kaW5nc1B0cikpCi0gICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0gICAgICAgIC0tYXR0SW5kZXg7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgYXR0SW5kZXgrKzsKLSAgICAgICAgblByZWZpeGVzKys7Ci0gICAgICAgIChhdHRJZC0+bmFtZSlbLTFdID0gMjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgYXR0SW5kZXgrKzsKLSAgfQotICBuU3BlY2lmaWVkQXR0cyA9IGF0dEluZGV4OwotICBpZiAodGFnTmFtZVB0cikgewotICAgIGludCBqOwotICAgIGZvciAoaiA9IDA7IGogPCBuRGVmYXVsdEF0dHM7IGorKykgewotICAgICAgY29uc3QgREVGQVVMVF9BVFRSSUJVVEUgKmRhID0gZWxlbWVudFR5cGUtPmRlZmF1bHRBdHRzICsgajsKLSAgICAgIGlmICghKGRhLT5pZC0+bmFtZSlbLTFdICYmIGRhLT52YWx1ZSkgewotICAgICAgICBpZiAoZGEtPmlkLT5wcmVmaXgpIHsKLSAgICAgICAgICBpZiAoZGEtPmlkLT54bWxucykgewotCSAgICBpZiAoIWFkZEJpbmRpbmcocGFyc2VyLCBkYS0+aWQtPnByZWZpeCwgZGEtPmlkLCBkYS0+dmFsdWUsIGJpbmRpbmdzUHRyKSkKLQkgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKLQkgIH0KLSAgICAgICAgICBlbHNlIHsKLQkgICAgKGRhLT5pZC0+bmFtZSlbLTFdID0gMjsKLQkgICAgblByZWZpeGVzKys7Ci0gIAkgICAgYXBwQXR0c1thdHRJbmRleCsrXSA9IGRhLT5pZC0+bmFtZTsKLQkgICAgYXBwQXR0c1thdHRJbmRleCsrXSA9IGRhLT52YWx1ZTsKLQkgIH0KLQl9Ci0JZWxzZSB7Ci0JICAoZGEtPmlkLT5uYW1lKVstMV0gPSAxOwotCSAgYXBwQXR0c1thdHRJbmRleCsrXSA9IGRhLT5pZC0+bmFtZTsKLQkgIGFwcEF0dHNbYXR0SW5kZXgrK10gPSBkYS0+dmFsdWU7Ci0JfQotICAgICAgfQotICAgIH0KLSAgICBhcHBBdHRzW2F0dEluZGV4XSA9IDA7Ci0gIH0KLSAgaSA9IDA7Ci0gIGlmIChuUHJlZml4ZXMpIHsKLSAgICBmb3IgKDsgaSA8IGF0dEluZGV4OyBpICs9IDIpIHsKLSAgICAgIGlmIChhcHBBdHRzW2ldWy0xXSA9PSAyKSB7Ci0gICAgICAgIEFUVFJJQlVURV9JRCAqaWQ7Ci0gICAgICAgICgoWE1MX0NoYXIgKikoYXBwQXR0c1tpXSkpWy0xXSA9IDA7Ci0JaWQgPSAoQVRUUklCVVRFX0lEICopbG9va3VwKCZkdGQuYXR0cmlidXRlSWRzLCBhcHBBdHRzW2ldLCAwKTsKLQlpZiAoaWQtPnByZWZpeC0+YmluZGluZykgewotCSAgaW50IGo7Ci0JICBjb25zdCBCSU5ESU5HICpiID0gaWQtPnByZWZpeC0+YmluZGluZzsKLQkgIGNvbnN0IFhNTF9DaGFyICpzcyA9IGFwcEF0dHNbaV07Ci0JICBmb3IgKGogPSAwOyBqIDwgYi0+dXJpTGVuOyBqKyspIHsKLQkgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsIGItPnVyaVtqXSkpCi0JICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0JICB9Ci0JICB3aGlsZSAoKnNzKysgIT0gJzonKQotCSAgICA7Ci0JICBkbyB7Ci0JICAgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCAqc3MpKQotCSAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOwotCSAgfSB3aGlsZSAoKnNzKyspOwotCSAgYXBwQXR0c1tpXSA9IHBvb2xTdGFydCgmdGVtcFBvb2wpOwotCSAgcG9vbEZpbmlzaCgmdGVtcFBvb2wpOwotCX0KLQlpZiAoIS0tblByZWZpeGVzKQotCSAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0JKChYTUxfQ2hhciAqKShhcHBBdHRzW2ldKSlbLTFdID0gMDsKLSAgICB9Ci0gIH0KLSAgZm9yICg7IGkgPCBhdHRJbmRleDsgaSArPSAyKQotICAgICgoWE1MX0NoYXIgKikoYXBwQXR0c1tpXSkpWy0xXSA9IDA7Ci0gIGlmICghdGFnTmFtZVB0cikKLSAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7Ci0gIGZvciAoYmluZGluZyA9ICpiaW5kaW5nc1B0cjsgYmluZGluZzsgYmluZGluZyA9IGJpbmRpbmctPm5leHRUYWdCaW5kaW5nKQotICAgIGJpbmRpbmctPmF0dElkLT5uYW1lWy0xXSA9IDA7Ci0gIGlmIChlbGVtZW50VHlwZS0+cHJlZml4KSB7Ci0gICAgYmluZGluZyA9IGVsZW1lbnRUeXBlLT5wcmVmaXgtPmJpbmRpbmc7Ci0gICAgaWYgKCFiaW5kaW5nKQotICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOwotICAgIGxvY2FsUGFydCA9IHRhZ05hbWVQdHItPnN0cjsKLSAgICB3aGlsZSAoKmxvY2FsUGFydCsrICE9IFhNTF9UKCc6JykpCi0gICAgICA7Ci0gIH0KLSAgZWxzZSBpZiAoZHRkLmRlZmF1bHRQcmVmaXguYmluZGluZykgewotICAgIGJpbmRpbmcgPSBkdGQuZGVmYXVsdFByZWZpeC5iaW5kaW5nOwotICAgIGxvY2FsUGFydCA9IHRhZ05hbWVQdHItPnN0cjsKLSAgfQotICBlbHNlCi0gICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOwotICB0YWdOYW1lUHRyLT5sb2NhbFBhcnQgPSBsb2NhbFBhcnQ7Ci0gIHRhZ05hbWVQdHItPnVyaUxlbiA9IGJpbmRpbmctPnVyaUxlbjsKLSAgaSA9IGJpbmRpbmctPnVyaUxlbjsKLSAgZG8gewotICAgIGlmIChpID09IGJpbmRpbmctPnVyaUFsbG9jKSB7Ci0gICAgICBiaW5kaW5nLT51cmkgPSByZWFsbG9jKGJpbmRpbmctPnVyaSwgYmluZGluZy0+dXJpQWxsb2MgKj0gMik7Ci0gICAgICBpZiAoIWJpbmRpbmctPnVyaSkKLQlyZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKLSAgICB9Ci0gICAgYmluZGluZy0+dXJpW2krK10gPSAqbG9jYWxQYXJ0OwotICB9IHdoaWxlICgqbG9jYWxQYXJ0KyspOwotICB0YWdOYW1lUHRyLT5zdHIgPSBiaW5kaW5nLT51cmk7Ci0gIHJldHVybiBYTUxfRVJST1JfTk9ORTsKLX0KLQotc3RhdGljCi1pbnQgYWRkQmluZGluZyhYTUxfUGFyc2VyIHBhcnNlciwgUFJFRklYICpwcmVmaXgsIGNvbnN0IEFUVFJJQlVURV9JRCAqYXR0SWQsIGNvbnN0IFhNTF9DaGFyICp1cmksIEJJTkRJTkcgKipiaW5kaW5nc1B0cikKLXsKLSAgQklORElORyAqYjsKLSAgaW50IGxlbjsKLSAgZm9yIChsZW4gPSAwOyB1cmlbbGVuXTsgbGVuKyspCi0gICAgOwotICBpZiAobmFtZXNwYWNlU2VwYXJhdG9yKQotICAgIGxlbisrOwotICBpZiAoZnJlZUJpbmRpbmdMaXN0KSB7Ci0gICAgYiA9IGZyZWVCaW5kaW5nTGlzdDsKLSAgICBpZiAobGVuID4gYi0+dXJpQWxsb2MpIHsKLSAgICAgIGItPnVyaSA9IHJlYWxsb2MoYi0+dXJpLCBsZW4gKyBFWFBBTkRfU1BBUkUpOwotICAgICAgaWYgKCFiLT51cmkpCi0JcmV0dXJuIDA7Ci0gICAgICBiLT51cmlBbGxvYyA9IGxlbiArIEVYUEFORF9TUEFSRTsKLSAgICB9Ci0gICAgZnJlZUJpbmRpbmdMaXN0ID0gYi0+bmV4dFRhZ0JpbmRpbmc7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgYiA9IG1hbGxvYyhzaXplb2YoQklORElORykpOwotICAgIGlmICghYikKLSAgICAgIHJldHVybiAwOwotICAgIGItPnVyaSA9IG1hbGxvYyhzaXplb2YoWE1MX0NoYXIpICogbGVuICsgRVhQQU5EX1NQQVJFKTsKLSAgICBpZiAoIWItPnVyaSkgewotICAgICAgZnJlZShiKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBiLT51cmlBbGxvYyA9IGxlbjsKLSAgfQotICBiLT51cmlMZW4gPSBsZW47Ci0gIG1lbWNweShiLT51cmksIHVyaSwgbGVuICogc2l6ZW9mKFhNTF9DaGFyKSk7Ci0gIGlmIChuYW1lc3BhY2VTZXBhcmF0b3IpCi0gICAgYi0+dXJpW2xlbiAtIDFdID0gbmFtZXNwYWNlU2VwYXJhdG9yOwotICBiLT5wcmVmaXggPSBwcmVmaXg7Ci0gIGItPmF0dElkID0gYXR0SWQ7Ci0gIGItPnByZXZQcmVmaXhCaW5kaW5nID0gcHJlZml4LT5iaW5kaW5nOwotICBpZiAoKnVyaSA9PSBYTUxfVCgnXDAnKSAmJiBwcmVmaXggPT0gJmR0ZC5kZWZhdWx0UHJlZml4KQotICAgIHByZWZpeC0+YmluZGluZyA9IDA7Ci0gIGVsc2UKLSAgICBwcmVmaXgtPmJpbmRpbmcgPSBiOwotICBiLT5uZXh0VGFnQmluZGluZyA9ICpiaW5kaW5nc1B0cjsKLSAgKmJpbmRpbmdzUHRyID0gYjsKLSAgaWYgKHN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIpCi0gICAgc3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlcihoYW5kbGVyQXJnLCBwcmVmaXgtPm5hbWUsCi0JCQkgICAgICBwcmVmaXgtPmJpbmRpbmcgPyB1cmkgOiAwKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFRoZSBpZGVhIGhlcmUgaXMgdG8gYXZvaWQgdXNpbmcgc3RhY2sgZm9yIGVhY2ggQ0RBVEEgc2VjdGlvbiB3aGVuCi10aGUgd2hvbGUgZmlsZSBpcyBwYXJzZWQgd2l0aCBvbmUgY2FsbC4gKi8KLQotc3RhdGljCi1lbnVtIFhNTF9FcnJvciBjZGF0YVNlY3Rpb25Qcm9jZXNzb3IoWE1MX1BhcnNlciBwYXJzZXIsCi0JCQkJICAgICBjb25zdCBjaGFyICpzdGFydCwKLQkJCSAgICAJICAgICBjb25zdCBjaGFyICplbmQsCi0JCQkJICAgICBjb25zdCBjaGFyICoqZW5kUHRyKQotewotICBlbnVtIFhNTF9FcnJvciByZXN1bHQgPSBkb0NkYXRhU2VjdGlvbihwYXJzZXIsIGVuY29kaW5nLCAmc3RhcnQsIGVuZCwgZW5kUHRyKTsKLSAgaWYgKHN0YXJ0KSB7Ci0gICAgcHJvY2Vzc29yID0gY29udGVudFByb2Nlc3NvcjsKLSAgICByZXR1cm4gY29udGVudFByb2Nlc3NvcihwYXJzZXIsIHN0YXJ0LCBlbmQsIGVuZFB0cik7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogc3RhcnRQdHIgZ2V0cyBzZXQgdG8gbm9uLW51bGwgaXMgdGhlIHNlY3Rpb24gaXMgY2xvc2VkLCBhbmQgdG8gbnVsbCBpZgotdGhlIHNlY3Rpb24gaXMgbm90IHlldCBjbG9zZWQuICovCi0KLXN0YXRpYwotZW51bSBYTUxfRXJyb3IgZG9DZGF0YVNlY3Rpb24oWE1MX1BhcnNlciBwYXJzZXIsCi0JCQkgICAgICBjb25zdCBFTkNPRElORyAqZW5jLAotCQkJICAgICAgY29uc3QgY2hhciAqKnN0YXJ0UHRyLAotCQkJICAgICAgY29uc3QgY2hhciAqZW5kLAotCQkJICAgICAgY29uc3QgY2hhciAqKm5leHRQdHIpCi17Ci0gIGNvbnN0IGNoYXIgKnMgPSAqc3RhcnRQdHI7Ci0gIGNvbnN0IGNoYXIgKipldmVudFBQOwotICBjb25zdCBjaGFyICoqZXZlbnRFbmRQUDsKLSAgaWYgKGVuYyA9PSBlbmNvZGluZykgewotICAgIGV2ZW50UFAgPSAmZXZlbnRQdHI7Ci0gICAgKmV2ZW50UFAgPSBzOwotICAgIGV2ZW50RW5kUFAgPSAmZXZlbnRFbmRQdHI7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgZXZlbnRQUCA9ICYob3BlbkludGVybmFsRW50aXRpZXMtPmludGVybmFsRXZlbnRQdHIpOwotICAgIGV2ZW50RW5kUFAgPSAmKG9wZW5JbnRlcm5hbEVudGl0aWVzLT5pbnRlcm5hbEV2ZW50RW5kUHRyKTsKLSAgfQotICAqZXZlbnRQUCA9IHM7Ci0gICpzdGFydFB0ciA9IDA7Ci0gIGZvciAoOzspIHsKLSAgICBjb25zdCBjaGFyICpuZXh0OwotICAgIGludCB0b2sgPSBYbWxDZGF0YVNlY3Rpb25Ub2soZW5jLCBzLCBlbmQsICZuZXh0KTsKLSAgICAqZXZlbnRFbmRQUCA9IG5leHQ7Ci0gICAgc3dpdGNoICh0b2spIHsKLSAgICBjYXNlIFhNTF9UT0tfQ0RBVEFfU0VDVF9DTE9TRToKLSAgICAgIGlmIChlbmRDZGF0YVNlY3Rpb25IYW5kbGVyKQotCWVuZENkYXRhU2VjdGlvbkhhbmRsZXIoaGFuZGxlckFyZyk7Ci0jaWYgMAotICAgICAgLyogc2VlIGNvbW1lbnQgdW5kZXIgWE1MX1RPS19DREFUQV9TRUNUX09QRU4gKi8KLSAgICAgIGVsc2UgaWYgKGNoYXJhY3RlckRhdGFIYW5kbGVyKQotCWNoYXJhY3RlckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsIGRhdGFCdWYsIDApOwotI2VuZGlmCi0gICAgICBlbHNlIGlmIChkZWZhdWx0SGFuZGxlcikKLQlyZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKLSAgICAgICpzdGFydFB0ciA9IG5leHQ7Ci0gICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7Ci0gICAgY2FzZSBYTUxfVE9LX0RBVEFfTkVXTElORToKLSAgICAgIGlmIChjaGFyYWN0ZXJEYXRhSGFuZGxlcikgewotCVhNTF9DaGFyIGMgPSAweEE7Ci0JY2hhcmFjdGVyRGF0YUhhbmRsZXIoaGFuZGxlckFyZywgJmMsIDEpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCi0JcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcywgbmV4dCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhNTF9UT0tfREFUQV9DSEFSUzoKLSAgICAgIGlmIChjaGFyYWN0ZXJEYXRhSGFuZGxlcikgewotCWlmIChNVVNUX0NPTlZFUlQoZW5jLCBzKSkgewotCSAgZm9yICg7OykgewotICAJICAgIElDSEFSICpkYXRhUHRyID0gKElDSEFSICopZGF0YUJ1ZjsKLQkgICAgWG1sQ29udmVydChlbmMsICZzLCBuZXh0LCAmZGF0YVB0ciwgKElDSEFSICopZGF0YUJ1ZkVuZCk7Ci0JICAgICpldmVudEVuZFBQID0gbmV4dDsKLQkgICAgY2hhcmFjdGVyRGF0YUhhbmRsZXIoaGFuZGxlckFyZywgZGF0YUJ1ZiwgZGF0YVB0ciAtIChJQ0hBUiAqKWRhdGFCdWYpOwotCSAgICBpZiAocyA9PSBuZXh0KQotCSAgICAgIGJyZWFrOwotCSAgICAqZXZlbnRQUCA9IHM7Ci0JICB9Ci0JfQotCWVsc2UKLQkgIGNoYXJhY3RlckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsCi0JCSAgCSAgICAgICAoWE1MX0NoYXIgKilzLAotCQkJICAgICAgIChYTUxfQ2hhciAqKW5leHQgLSAoWE1MX0NoYXIgKilzKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGRlZmF1bHRIYW5kbGVyKQotCXJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIG5leHQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYTUxfVE9LX0lOVkFMSUQ6Ci0gICAgICAqZXZlbnRQUCA9IG5leHQ7Ci0gICAgICByZXR1cm4gWE1MX0VSUk9SX0lOVkFMSURfVE9LRU47Ci0gICAgY2FzZSBYTUxfVE9LX1BBUlRJQUxfQ0hBUjoKLSAgICAgIGlmIChuZXh0UHRyKSB7Ci0JKm5leHRQdHIgPSBzOwotCXJldHVybiBYTUxfRVJST1JfTk9ORTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBYTUxfRVJST1JfUEFSVElBTF9DSEFSOwotICAgIGNhc2UgWE1MX1RPS19QQVJUSUFMOgotICAgIGNhc2UgWE1MX1RPS19OT05FOgotICAgICAgaWYgKG5leHRQdHIpIHsKLQkqbmV4dFB0ciA9IHM7Ci0JcmV0dXJuIFhNTF9FUlJPUl9OT05FOwotICAgICAgfQotICAgICAgcmV0dXJuIFhNTF9FUlJPUl9VTkNMT1NFRF9DREFUQV9TRUNUSU9OOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCgpOwotICAgIH0KLSAgICAqZXZlbnRQUCA9IHMgPSBuZXh0OwotICB9Ci0gIC8qIG5vdCByZWFjaGVkICovCi19Ci0KLXN0YXRpYyBlbnVtIFhNTF9FcnJvcgotaW5pdGlhbGl6ZUVuY29kaW5nKFhNTF9QYXJzZXIgcGFyc2VyKQotewotICBjb25zdCBjaGFyICpzOwotI2lmZGVmIFhNTF9VTklDT0RFCi0gIGNoYXIgZW5jb2RpbmdCdWZbMTI4XTsKLSAgaWYgKCFwcm90b2NvbEVuY29kaW5nTmFtZSkKLSAgICBzID0gMDsKLSAgZWxzZSB7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgcHJvdG9jb2xFbmNvZGluZ05hbWVbaV07IGkrKykgewotICAgICAgaWYgKGkgPT0gc2l6ZW9mKGVuY29kaW5nQnVmKSAtIDEKLQkgIHx8IHByb3RvY29sRW5jb2RpbmdOYW1lW2ldID49IDB4ODAKLQkgIHx8IHByb3RvY29sRW5jb2RpbmdOYW1lW2ldIDwgMCkgewotCWVuY29kaW5nQnVmWzBdID0gJ1wwJzsKLQlicmVhazsKLSAgICAgIH0KLSAgICAgIGVuY29kaW5nQnVmW2ldID0gKGNoYXIpcHJvdG9jb2xFbmNvZGluZ05hbWVbaV07Ci0gICAgfQotICAgIGVuY29kaW5nQnVmW2ldID0gJ1wwJzsKLSAgICBzID0gZW5jb2RpbmdCdWY7Ci0gIH0KLSNlbHNlCi0gIHMgPSBwcm90b2NvbEVuY29kaW5nTmFtZTsKLSNlbmRpZgotICBpZiAoKG5zID8gWG1sSW5pdEVuY29kaW5nTlMgOiBYbWxJbml0RW5jb2RpbmcpKCZpbml0RW5jb2RpbmcsICZlbmNvZGluZywgcykpCi0gICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOwotICByZXR1cm4gaGFuZGxlVW5rbm93bkVuY29kaW5nKHBhcnNlciwgcHJvdG9jb2xFbmNvZGluZ05hbWUpOwotfQotCi1zdGF0aWMgZW51bSBYTUxfRXJyb3IKLXByb2Nlc3NYbWxEZWNsKFhNTF9QYXJzZXIgcGFyc2VyLCBpbnQgaXNHZW5lcmFsVGV4dEVudGl0eSwKLQkgICAgICAgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqbmV4dCkKLXsKLSAgY29uc3QgY2hhciAqZW5jb2RpbmdOYW1lID0gMDsKLSAgY29uc3QgRU5DT0RJTkcgKm5ld0VuY29kaW5nID0gMDsKLSAgY29uc3QgY2hhciAqdmVyc2lvbjsKLSAgaW50IHN0YW5kYWxvbmUgPSAtMTsKLSAgaWYgKCEobnMKLSAgICAgICAgPyBYbWxQYXJzZVhtbERlY2xOUwotCTogWG1sUGFyc2VYbWxEZWNsKShpc0dlbmVyYWxUZXh0RW50aXR5LAotCQkgICAgICAgICAgIGVuY29kaW5nLAotCQkgICAgICAgICAgIHMsCi0JCSAgICAgICAgICAgbmV4dCwKLQkJICAgICAgICAgICAmZXZlbnRQdHIsCi0JCSAgICAgICAgICAgJnZlcnNpb24sCi0JCSAgICAgICAgICAgJmVuY29kaW5nTmFtZSwKLQkJICAgICAgICAgICAmbmV3RW5jb2RpbmcsCi0JCSAgICAgICAgICAgJnN0YW5kYWxvbmUpKQotICAgIHJldHVybiBYTUxfRVJST1JfU1lOVEFYOwotICBpZiAoIWlzR2VuZXJhbFRleHRFbnRpdHkgJiYgc3RhbmRhbG9uZSA9PSAxKQotICAgIGR0ZC5zdGFuZGFsb25lID0gMTsKLSAgaWYgKGRlZmF1bHRIYW5kbGVyKQotICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmNvZGluZywgcywgbmV4dCk7Ci0gIGlmICghcHJvdG9jb2xFbmNvZGluZ05hbWUpIHsKLSAgICBpZiAobmV3RW5jb2RpbmcpIHsKLSAgICAgIGlmIChuZXdFbmNvZGluZy0+bWluQnl0ZXNQZXJDaGFyICE9IGVuY29kaW5nLT5taW5CeXRlc1BlckNoYXIpIHsKLQlldmVudFB0ciA9IGVuY29kaW5nTmFtZTsKLQlyZXR1cm4gWE1MX0VSUk9SX0lOQ09SUkVDVF9FTkNPRElORzsKLSAgICAgIH0KLSAgICAgIGVuY29kaW5nID0gbmV3RW5jb2Rpbmc7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVuY29kaW5nTmFtZSkgewotICAgICAgZW51bSBYTUxfRXJyb3IgcmVzdWx0OwotICAgICAgY29uc3QgWE1MX0NoYXIgKnNzID0gcG9vbFN0b3JlU3RyaW5nKCZ0ZW1wUG9vbCwKLQkJCQkJICBlbmNvZGluZywKLQkJCQkJICBlbmNvZGluZ05hbWUsCi0JCQkJCSAgZW5jb2RpbmdOYW1lCi0JCQkJCSAgKyBYbWxOYW1lTGVuZ3RoKGVuY29kaW5nLCBlbmNvZGluZ05hbWUpKTsKLSAgICAgIGlmICghc3MpCi0JcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0gICAgICByZXN1bHQgPSBoYW5kbGVVbmtub3duRW5jb2RpbmcocGFyc2VyLCBzcyk7Ci0gICAgICBwb29sRGlzY2FyZCgmdGVtcFBvb2wpOwotICAgICAgaWYgKHJlc3VsdCA9PSBYTUxfRVJST1JfVU5LTk9XTl9FTkNPRElORykKLQlldmVudFB0ciA9IGVuY29kaW5nTmFtZTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICB9Ci0gIHJldHVybiBYTUxfRVJST1JfTk9ORTsKLX0KLQotc3RhdGljIGVudW0gWE1MX0Vycm9yCi1oYW5kbGVVbmtub3duRW5jb2RpbmcoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICplbmNvZGluZ05hbWUpCi17Ci0gIGlmICh1bmtub3duRW5jb2RpbmdIYW5kbGVyKSB7Ci0gICAgWE1MX0VuY29kaW5nIGluZm87Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotICAgICAgaW5mby5tYXBbaV0gPSAtMTsKLSAgICBpbmZvLmNvbnZlcnQgPSAwOwotICAgIGluZm8uZGF0YSA9IDA7Ci0gICAgaW5mby5yZWxlYXNlID0gMDsKLSAgICBpZiAodW5rbm93bkVuY29kaW5nSGFuZGxlcih1bmtub3duRW5jb2RpbmdIYW5kbGVyRGF0YSwgZW5jb2RpbmdOYW1lLCAmaW5mbykpIHsKLSAgICAgIEVOQ09ESU5HICplbmM7Ci0gICAgICB1bmtub3duRW5jb2RpbmdNZW0gPSBtYWxsb2MoWG1sU2l6ZU9mVW5rbm93bkVuY29kaW5nKCkpOwotICAgICAgaWYgKCF1bmtub3duRW5jb2RpbmdNZW0pIHsKLQlpZiAoaW5mby5yZWxlYXNlKQotCSAgaW5mby5yZWxlYXNlKGluZm8uZGF0YSk7Ci0JcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0gICAgICB9Ci0gICAgICBlbmMgPSAobnMKLQkgICAgID8gWG1sSW5pdFVua25vd25FbmNvZGluZ05TCi0JICAgICA6IFhtbEluaXRVbmtub3duRW5jb2RpbmcpKHVua25vd25FbmNvZGluZ01lbSwKLQkJCQkgICAgICAgaW5mby5tYXAsCi0JCQkJICAgICAgIGluZm8uY29udmVydCwKLQkJCQkgICAgICAgaW5mby5kYXRhKTsKLSAgICAgIGlmIChlbmMpIHsKLQl1bmtub3duRW5jb2RpbmdEYXRhID0gaW5mby5kYXRhOwotCXVua25vd25FbmNvZGluZ1JlbGVhc2UgPSBpbmZvLnJlbGVhc2U7Ci0JZW5jb2RpbmcgPSBlbmM7Ci0JcmV0dXJuIFhNTF9FUlJPUl9OT05FOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoaW5mby5yZWxlYXNlKQotICAgICAgaW5mby5yZWxlYXNlKGluZm8uZGF0YSk7Ci0gIH0KLSAgcmV0dXJuIFhNTF9FUlJPUl9VTktOT1dOX0VOQ09ESU5HOwotfQotCi1zdGF0aWMgZW51bSBYTUxfRXJyb3IKLXByb2xvZ0luaXRQcm9jZXNzb3IoWE1MX1BhcnNlciBwYXJzZXIsCi0JCSAgICBjb25zdCBjaGFyICpzLAotCQkgICAgY29uc3QgY2hhciAqZW5kLAotCQkgICAgY29uc3QgY2hhciAqKm5leHRQdHIpCi17Ci0gIGVudW0gWE1MX0Vycm9yIHJlc3VsdCA9IGluaXRpYWxpemVFbmNvZGluZyhwYXJzZXIpOwotICBpZiAocmVzdWx0ICE9IFhNTF9FUlJPUl9OT05FKQotICAgIHJldHVybiByZXN1bHQ7Ci0gIHByb2Nlc3NvciA9IHByb2xvZ1Byb2Nlc3NvcjsKLSAgcmV0dXJuIHByb2xvZ1Byb2Nlc3NvcihwYXJzZXIsIHMsIGVuZCwgbmV4dFB0cik7Ci19Ci0KLXN0YXRpYyBlbnVtIFhNTF9FcnJvcgotcHJvbG9nUHJvY2Vzc29yKFhNTF9QYXJzZXIgcGFyc2VyLAotCQljb25zdCBjaGFyICpzLAotCQljb25zdCBjaGFyICplbmQsCi0JCWNvbnN0IGNoYXIgKipuZXh0UHRyKQotewotICBmb3IgKDs7KSB7Ci0gICAgY29uc3QgY2hhciAqbmV4dDsKLSAgICBpbnQgdG9rID0gWG1sUHJvbG9nVG9rKGVuY29kaW5nLCBzLCBlbmQsICZuZXh0KTsKLSAgICBpZiAodG9rIDw9IDApIHsKLSAgICAgIGlmIChuZXh0UHRyICE9IDAgJiYgdG9rICE9IFhNTF9UT0tfSU5WQUxJRCkgewotCSpuZXh0UHRyID0gczsKLQlyZXR1cm4gWE1MX0VSUk9SX05PTkU7Ci0gICAgICB9Ci0gICAgICBzd2l0Y2ggKHRvaykgewotICAgICAgY2FzZSBYTUxfVE9LX0lOVkFMSUQ6Ci0JZXZlbnRQdHIgPSBuZXh0OwotCXJldHVybiBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTjsKLSAgICAgIGNhc2UgWE1MX1RPS19OT05FOgotCXJldHVybiBYTUxfRVJST1JfTk9fRUxFTUVOVFM7Ci0gICAgICBjYXNlIFhNTF9UT0tfUEFSVElBTDoKLQlyZXR1cm4gWE1MX0VSUk9SX1VOQ0xPU0VEX1RPS0VOOwotICAgICAgY2FzZSBYTUxfVE9LX1BBUlRJQUxfQ0hBUjoKLQlyZXR1cm4gWE1MX0VSUk9SX1BBUlRJQUxfQ0hBUjsKLSAgICAgIGNhc2UgWE1MX1RPS19UUkFJTElOR19DUjoKLQlldmVudFB0ciA9IHMgKyBlbmNvZGluZy0+bWluQnl0ZXNQZXJDaGFyOwotCXJldHVybiBYTUxfRVJST1JfTk9fRUxFTUVOVFM7Ci0gICAgICBkZWZhdWx0OgotCWFib3J0KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHN3aXRjaCAoWG1sVG9rZW5Sb2xlKCZwcm9sb2dTdGF0ZSwgdG9rLCBzLCBuZXh0LCBlbmNvZGluZykpIHsKLSAgICBjYXNlIFhNTF9ST0xFX1hNTF9ERUNMOgotICAgICAgewotCWVudW0gWE1MX0Vycm9yIHJlc3VsdCA9IHByb2Nlc3NYbWxEZWNsKHBhcnNlciwgMCwgcywgbmV4dCk7Ci0JaWYgKHJlc3VsdCAhPSBYTUxfRVJST1JfTk9ORSkKLQkgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhNTF9ST0xFX0RPQ1RZUEVfU1lTVEVNX0lEOgotICAgICAgaWYgKCFkdGQuc3RhbmRhbG9uZQotCSAgJiYgbm90U3RhbmRhbG9uZUhhbmRsZXIKLQkgICYmICFub3RTdGFuZGFsb25lSGFuZGxlcihoYW5kbGVyQXJnKSkKLQlyZXR1cm4gWE1MX0VSUk9SX05PVF9TVEFOREFMT05FOwotICAgICAgaGFkRXh0ZXJuYWxEb2N0eXBlID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWE1MX1JPTEVfRE9DVFlQRV9QVUJMSUNfSUQ6Ci0gICAgY2FzZSBYTUxfUk9MRV9FTlRJVFlfUFVCTElDX0lEOgotICAgICAgaWYgKCFYbWxJc1B1YmxpY0lkKGVuY29kaW5nLCBzLCBuZXh0LCAmZXZlbnRQdHIpKQotCXJldHVybiBYTUxfRVJST1JfU1lOVEFYOwotICAgICAgaWYgKGRlY2xFbnRpdHkpIHsKLQlYTUxfQ2hhciAqdGVtID0gcG9vbFN0b3JlU3RyaW5nKCZkdGQucG9vbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAotCQkJCQlzICsgZW5jb2RpbmctPm1pbkJ5dGVzUGVyQ2hhciwKLQkgIAkJCQluZXh0IC0gZW5jb2RpbmctPm1pbkJ5dGVzUGVyQ2hhcik7Ci0JaWYgKCF0ZW0pCi0JICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKLQlub3JtYWxpemVQdWJsaWNJZCh0ZW0pOwotCWRlY2xFbnRpdHktPnB1YmxpY0lkID0gdGVtOwotCXBvb2xGaW5pc2goJmR0ZC5wb29sKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWE1MX1JPTEVfSU5TVEFOQ0VfU1RBUlQ6Ci0gICAgICBwcm9jZXNzb3IgPSBjb250ZW50UHJvY2Vzc29yOwotICAgICAgaWYgKGhhZEV4dGVybmFsRG9jdHlwZSkKLQlkdGQuY29tcGxldGUgPSAwOwotICAgICAgcmV0dXJuIGNvbnRlbnRQcm9jZXNzb3IocGFyc2VyLCBzLCBlbmQsIG5leHRQdHIpOwotICAgIGNhc2UgWE1MX1JPTEVfQVRUTElTVF9FTEVNRU5UX05BTUU6Ci0gICAgICB7Ci0JY29uc3QgWE1MX0NoYXIgKm5hbWUgPSBwb29sU3RvcmVTdHJpbmcoJmR0ZC5wb29sLCBlbmNvZGluZywgcywgbmV4dCk7Ci0JaWYgKCFuYW1lKQotCSAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0JZGVjbEVsZW1lbnRUeXBlID0gKEVMRU1FTlRfVFlQRSAqKWxvb2t1cCgmZHRkLmVsZW1lbnRUeXBlcywgbmFtZSwgc2l6ZW9mKEVMRU1FTlRfVFlQRSkpOwotCWlmICghZGVjbEVsZW1lbnRUeXBlKQotCSAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0JaWYgKGRlY2xFbGVtZW50VHlwZS0+bmFtZSAhPSBuYW1lKQotCSAgcG9vbERpc2NhcmQoJmR0ZC5wb29sKTsKLQllbHNlIHsKLQkgIHBvb2xGaW5pc2goJmR0ZC5wb29sKTsKLQkgIGlmICghc2V0RWxlbWVudFR5cGVQcmVmaXgocGFyc2VyLCBkZWNsRWxlbWVudFR5cGUpKQotICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0JfQotCWJyZWFrOwotICAgICAgfQotICAgIGNhc2UgWE1MX1JPTEVfQVRUUklCVVRFX05BTUU6Ci0gICAgICBkZWNsQXR0cmlidXRlSWQgPSBnZXRBdHRyaWJ1dGVJZChwYXJzZXIsIGVuY29kaW5nLCBzLCBuZXh0KTsKLSAgICAgIGlmICghZGVjbEF0dHJpYnV0ZUlkKQotCXJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOwotICAgICAgZGVjbEF0dHJpYnV0ZUlzQ2RhdGEgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYTUxfUk9MRV9BVFRSSUJVVEVfVFlQRV9DREFUQToKLSAgICAgIGRlY2xBdHRyaWJ1dGVJc0NkYXRhID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWE1MX1JPTEVfSU1QTElFRF9BVFRSSUJVVEVfVkFMVUU6Ci0gICAgY2FzZSBYTUxfUk9MRV9SRVFVSVJFRF9BVFRSSUJVVEVfVkFMVUU6Ci0gICAgICBpZiAoZHRkLmNvbXBsZXRlCi0JICAmJiAhZGVmaW5lQXR0cmlidXRlKGRlY2xFbGVtZW50VHlwZSwgZGVjbEF0dHJpYnV0ZUlkLCBkZWNsQXR0cmlidXRlSXNDZGF0YSwgMCkpCi0JcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhNTF9ST0xFX0RFRkFVTFRfQVRUUklCVVRFX1ZBTFVFOgotICAgIGNhc2UgWE1MX1JPTEVfRklYRURfQVRUUklCVVRFX1ZBTFVFOgotICAgICAgewotCWNvbnN0IFhNTF9DaGFyICphdHRWYWw7Ci0JZW51bSBYTUxfRXJyb3IgcmVzdWx0Ci0JICA9IHN0b3JlQXR0cmlidXRlVmFsdWUocGFyc2VyLCBlbmNvZGluZywgZGVjbEF0dHJpYnV0ZUlzQ2RhdGEsCi0JCQkJcyArIGVuY29kaW5nLT5taW5CeXRlc1BlckNoYXIsCi0JCQkgICAgICAgIG5leHQgLSBlbmNvZGluZy0+bWluQnl0ZXNQZXJDaGFyLAotCQkJICAgICAgICAmZHRkLnBvb2wpOwotCWlmIChyZXN1bHQpCi0JICByZXR1cm4gcmVzdWx0OwotCWF0dFZhbCA9IHBvb2xTdGFydCgmZHRkLnBvb2wpOwotCXBvb2xGaW5pc2goJmR0ZC5wb29sKTsKLQlpZiAoZHRkLmNvbXBsZXRlCi0JICAgICYmICFkZWZpbmVBdHRyaWJ1dGUoZGVjbEVsZW1lbnRUeXBlLCBkZWNsQXR0cmlidXRlSWQsIGRlY2xBdHRyaWJ1dGVJc0NkYXRhLCBhdHRWYWwpKQotCSAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSBYTUxfUk9MRV9FTlRJVFlfVkFMVUU6Ci0gICAgICB7Ci0JZW51bSBYTUxfRXJyb3IgcmVzdWx0ID0gc3RvcmVFbnRpdHlWYWx1ZShwYXJzZXIsIHMsIG5leHQpOwotCWlmIChyZXN1bHQgIT0gWE1MX0VSUk9SX05PTkUpCi0JICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYTUxfUk9MRV9FTlRJVFlfU1lTVEVNX0lEOgotICAgICAgaWYgKGRlY2xFbnRpdHkpIHsKLQlkZWNsRW50aXR5LT5zeXN0ZW1JZCA9IHBvb2xTdG9yZVN0cmluZygmZHRkLnBvb2wsIGVuY29kaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgKyBlbmNvZGluZy0+bWluQnl0ZXNQZXJDaGFyLAotCSAgCQkJCSAgICAgICBuZXh0IC0gZW5jb2RpbmctPm1pbkJ5dGVzUGVyQ2hhcik7Ci0JaWYgKCFkZWNsRW50aXR5LT5zeXN0ZW1JZCkKLQkgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOwotCWRlY2xFbnRpdHktPmJhc2UgPSBkdGQuYmFzZTsKLQlwb29sRmluaXNoKCZkdGQucG9vbCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhNTF9ST0xFX0VOVElUWV9OT1RBVElPTl9OQU1FOgotICAgICAgaWYgKGRlY2xFbnRpdHkpIHsKLQlkZWNsRW50aXR5LT5ub3RhdGlvbiA9IHBvb2xTdG9yZVN0cmluZygmZHRkLnBvb2wsIGVuY29kaW5nLCBzLCBuZXh0KTsKLQlpZiAoIWRlY2xFbnRpdHktPm5vdGF0aW9uKQotCSAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0JcG9vbEZpbmlzaCgmZHRkLnBvb2wpOwotCWlmICh1bnBhcnNlZEVudGl0eURlY2xIYW5kbGVyKSB7Ci0JICBldmVudFB0ciA9IGV2ZW50RW5kUHRyID0gczsKLQkgIHVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIoaGFuZGxlckFyZywKLQkJCQkgICAgZGVjbEVudGl0eS0+bmFtZSwKLQkJCQkgICAgZGVjbEVudGl0eS0+YmFzZSwKLQkJCQkgICAgZGVjbEVudGl0eS0+c3lzdGVtSWQsCi0JCQkJICAgIGRlY2xFbnRpdHktPnB1YmxpY0lkLAotCQkJCSAgICBkZWNsRW50aXR5LT5ub3RhdGlvbik7Ci0JfQotCi0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhNTF9ST0xFX0dFTkVSQUxfRU5USVRZX05BTUU6Ci0gICAgICB7Ci0JY29uc3QgWE1MX0NoYXIgKm5hbWU7Ci0JaWYgKFhtbFByZWRlZmluZWRFbnRpdHlOYW1lKGVuY29kaW5nLCBzLCBuZXh0KSkgewotCSAgZGVjbEVudGl0eSA9IDA7Ci0JICBicmVhazsKLQl9Ci0JbmFtZSA9IHBvb2xTdG9yZVN0cmluZygmZHRkLnBvb2wsIGVuY29kaW5nLCBzLCBuZXh0KTsKLQlpZiAoIW5hbWUpCi0JICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKLQlpZiAoZHRkLmNvbXBsZXRlKSB7Ci0JICBkZWNsRW50aXR5ID0gKEVOVElUWSAqKWxvb2t1cCgmZHRkLmdlbmVyYWxFbnRpdGllcywgbmFtZSwgc2l6ZW9mKEVOVElUWSkpOwotCSAgaWYgKCFkZWNsRW50aXR5KQotCSAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKLQkgIGlmIChkZWNsRW50aXR5LT5uYW1lICE9IG5hbWUpIHsKLQkgICAgcG9vbERpc2NhcmQoJmR0ZC5wb29sKTsKLQkgICAgZGVjbEVudGl0eSA9IDA7Ci0JICB9Ci0JICBlbHNlCi0JICAgIHBvb2xGaW5pc2goJmR0ZC5wb29sKTsKLQl9Ci0JZWxzZSB7Ci0JICBwb29sRGlzY2FyZCgmZHRkLnBvb2wpOwotCSAgZGVjbEVudGl0eSA9IDA7Ci0JfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYTUxfUk9MRV9QQVJBTV9FTlRJVFlfTkFNRToKLSAgICAgIGRlY2xFbnRpdHkgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYTUxfUk9MRV9OT1RBVElPTl9OQU1FOgotICAgICAgZGVjbE5vdGF0aW9uUHVibGljSWQgPSAwOwotICAgICAgZGVjbE5vdGF0aW9uTmFtZSA9IDA7Ci0gICAgICBpZiAobm90YXRpb25EZWNsSGFuZGxlcikgewotCWRlY2xOb3RhdGlvbk5hbWUgPSBwb29sU3RvcmVTdHJpbmcoJnRlbXBQb29sLCBlbmNvZGluZywgcywgbmV4dCk7Ci0JaWYgKCFkZWNsTm90YXRpb25OYW1lKQotCSAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0JcG9vbEZpbmlzaCgmdGVtcFBvb2wpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYTUxfUk9MRV9OT1RBVElPTl9QVUJMSUNfSUQ6Ci0gICAgICBpZiAoIVhtbElzUHVibGljSWQoZW5jb2RpbmcsIHMsIG5leHQsICZldmVudFB0cikpCi0JcmV0dXJuIFhNTF9FUlJPUl9TWU5UQVg7Ci0gICAgICBpZiAoZGVjbE5vdGF0aW9uTmFtZSkgewotCVhNTF9DaGFyICp0ZW0gPSBwb29sU3RvcmVTdHJpbmcoJnRlbXBQb29sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCi0JCQkJCXMgKyBlbmNvZGluZy0+bWluQnl0ZXNQZXJDaGFyLAotCSAgCQkJCW5leHQgLSBlbmNvZGluZy0+bWluQnl0ZXNQZXJDaGFyKTsKLQlpZiAoIXRlbSkKLQkgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOwotCW5vcm1hbGl6ZVB1YmxpY0lkKHRlbSk7Ci0JZGVjbE5vdGF0aW9uUHVibGljSWQgPSB0ZW07Ci0JcG9vbEZpbmlzaCgmdGVtcFBvb2wpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYTUxfUk9MRV9OT1RBVElPTl9TWVNURU1fSUQ6Ci0gICAgICBpZiAoZGVjbE5vdGF0aW9uTmFtZSAmJiBub3RhdGlvbkRlY2xIYW5kbGVyKSB7Ci0JY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkCi0JICA9IHBvb2xTdG9yZVN0cmluZygmdGVtcFBvb2wsIGVuY29kaW5nLAotCQkJICAgIHMgKyBlbmNvZGluZy0+bWluQnl0ZXNQZXJDaGFyLAotCSAgCQkgICAgbmV4dCAtIGVuY29kaW5nLT5taW5CeXRlc1BlckNoYXIpOwotCWlmICghc3lzdGVtSWQpCi0JICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKLQlldmVudFB0ciA9IGV2ZW50RW5kUHRyID0gczsKLQlub3RhdGlvbkRlY2xIYW5kbGVyKGhhbmRsZXJBcmcsCi0JCQkgICAgZGVjbE5vdGF0aW9uTmFtZSwKLQkJCSAgICBkdGQuYmFzZSwKLQkJCSAgICBzeXN0ZW1JZCwKLQkJCSAgICBkZWNsTm90YXRpb25QdWJsaWNJZCk7Ci0gICAgICB9Ci0gICAgICBwb29sQ2xlYXIoJnRlbXBQb29sKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWE1MX1JPTEVfTk9UQVRJT05fTk9fU1lTVEVNX0lEOgotICAgICAgaWYgKGRlY2xOb3RhdGlvblB1YmxpY0lkICYmIG5vdGF0aW9uRGVjbEhhbmRsZXIpIHsKLQlldmVudFB0ciA9IGV2ZW50RW5kUHRyID0gczsKLQlub3RhdGlvbkRlY2xIYW5kbGVyKGhhbmRsZXJBcmcsCi0JCQkgICAgZGVjbE5vdGF0aW9uTmFtZSwKLQkJCSAgICBkdGQuYmFzZSwKLQkJCSAgICAwLAotCQkJICAgIGRlY2xOb3RhdGlvblB1YmxpY0lkKTsKLSAgICAgIH0KLSAgICAgIHBvb2xDbGVhcigmdGVtcFBvb2wpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYTUxfUk9MRV9FUlJPUjoKLSAgICAgIGV2ZW50UHRyID0gczsKLSAgICAgIHN3aXRjaCAodG9rKSB7Ci0gICAgICBjYXNlIFhNTF9UT0tfUEFSQU1fRU5USVRZX1JFRjoKLQlyZXR1cm4gWE1MX0VSUk9SX1BBUkFNX0VOVElUWV9SRUY7Ci0gICAgICBjYXNlIFhNTF9UT0tfWE1MX0RFQ0w6Ci0JcmV0dXJuIFhNTF9FUlJPUl9NSVNQTEFDRURfWE1MX1BJOwotICAgICAgZGVmYXVsdDoKLQlyZXR1cm4gWE1MX0VSUk9SX1NZTlRBWDsKLSAgICAgIH0KLSAgICBjYXNlIFhNTF9ST0xFX0dST1VQX09QRU46Ci0gICAgICBpZiAocHJvbG9nU3RhdGUubGV2ZWwgPj0gZ3JvdXBTaXplKSB7Ci0JaWYgKGdyb3VwU2l6ZSkKLQkgIGdyb3VwQ29ubmVjdG9yID0gcmVhbGxvYyhncm91cENvbm5lY3RvciwgZ3JvdXBTaXplICo9IDIpOwotCWVsc2UKLQkgIGdyb3VwQ29ubmVjdG9yID0gbWFsbG9jKGdyb3VwU2l6ZSA9IDMyKTsKLQlpZiAoIWdyb3VwQ29ubmVjdG9yKQotCSAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0gICAgICB9Ci0gICAgICBncm91cENvbm5lY3Rvcltwcm9sb2dTdGF0ZS5sZXZlbF0gPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYTUxfUk9MRV9HUk9VUF9TRVFVRU5DRToKLSAgICAgIGlmIChncm91cENvbm5lY3Rvcltwcm9sb2dTdGF0ZS5sZXZlbF0gPT0gJ3wnKSB7Ci0JZXZlbnRQdHIgPSBzOwotCXJldHVybiBYTUxfRVJST1JfU1lOVEFYOwotICAgICAgfQotICAgICAgZ3JvdXBDb25uZWN0b3JbcHJvbG9nU3RhdGUubGV2ZWxdID0gJywnOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYTUxfUk9MRV9HUk9VUF9DSE9JQ0U6Ci0gICAgICBpZiAoZ3JvdXBDb25uZWN0b3JbcHJvbG9nU3RhdGUubGV2ZWxdID09ICcsJykgewotCWV2ZW50UHRyID0gczsKLQlyZXR1cm4gWE1MX0VSUk9SX1NZTlRBWDsKLSAgICAgIH0KLSAgICAgIGdyb3VwQ29ubmVjdG9yW3Byb2xvZ1N0YXRlLmxldmVsXSA9ICd8JzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWE1MX1JPTEVfUEFSQU1fRU5USVRZX1JFRjoKLSAgICAgIGlmICghZHRkLnN0YW5kYWxvbmUKLQkgICYmIG5vdFN0YW5kYWxvbmVIYW5kbGVyCi0JICAmJiAhbm90U3RhbmRhbG9uZUhhbmRsZXIoaGFuZGxlckFyZykpCi0JcmV0dXJuIFhNTF9FUlJPUl9OT1RfU1RBTkRBTE9ORTsKLSAgICAgIGR0ZC5jb21wbGV0ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhNTF9ST0xFX05PTkU6Ci0gICAgICBzd2l0Y2ggKHRvaykgewotICAgICAgY2FzZSBYTUxfVE9LX1BJOgotCWV2ZW50UHRyID0gczsKLQlldmVudEVuZFB0ciA9IG5leHQ7Ci0JaWYgKCFyZXBvcnRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24ocGFyc2VyLCBlbmNvZGluZywgcywgbmV4dCkpCi0JICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKLQlicmVhazsKLSAgICAgIGNhc2UgWE1MX1RPS19DT01NRU5UOgotCWV2ZW50UHRyID0gczsKLQlldmVudEVuZFB0ciA9IG5leHQ7Ci0JaWYgKCFyZXBvcnRDb21tZW50KHBhcnNlciwgZW5jb2RpbmcsIHMsIG5leHQpKQotCSAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGRlZmF1bHRIYW5kbGVyKSB7Ci0gICAgICBzd2l0Y2ggKHRvaykgewotICAgICAgY2FzZSBYTUxfVE9LX1BJOgotICAgICAgY2FzZSBYTUxfVE9LX0NPTU1FTlQ6Ci0gICAgICBjYXNlIFhNTF9UT0tfQk9NOgotICAgICAgY2FzZSBYTUxfVE9LX1hNTF9ERUNMOgotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlldmVudFB0ciA9IHM7Ci0JZXZlbnRFbmRQdHIgPSBuZXh0OwotCXJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmNvZGluZywgcywgbmV4dCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHMgPSBuZXh0OwotICB9Ci0gIC8qIG5vdCByZWFjaGVkICovCi19Ci0KLXN0YXRpYwotZW51bSBYTUxfRXJyb3IgZXBpbG9nUHJvY2Vzc29yKFhNTF9QYXJzZXIgcGFyc2VyLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKnMsCi0JCQkgICAgICAgY29uc3QgY2hhciAqZW5kLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKipuZXh0UHRyKQotewotICBwcm9jZXNzb3IgPSBlcGlsb2dQcm9jZXNzb3I7Ci0gIGV2ZW50UHRyID0gczsKLSAgZm9yICg7OykgewotICAgIGNvbnN0IGNoYXIgKm5leHQ7Ci0gICAgaW50IHRvayA9IFhtbFByb2xvZ1RvayhlbmNvZGluZywgcywgZW5kLCAmbmV4dCk7Ci0gICAgZXZlbnRFbmRQdHIgPSBuZXh0OwotICAgIHN3aXRjaCAodG9rKSB7Ci0gICAgY2FzZSBYTUxfVE9LX1RSQUlMSU5HX0NSOgotICAgICAgaWYgKGRlZmF1bHRIYW5kbGVyKSB7Ci0JZXZlbnRFbmRQdHIgPSBlbmQ7Ci0JcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuY29kaW5nLCBzLCBlbmQpOwotICAgICAgfQotICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSBYTUxfVE9LX05PTkU6Ci0gICAgICBpZiAobmV4dFB0cikKLQkqbmV4dFB0ciA9IGVuZDsKLSAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKLSAgICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6Ci0gICAgICBpZiAoZGVmYXVsdEhhbmRsZXIpCi0JcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuY29kaW5nLCBzLCBuZXh0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWE1MX1RPS19QSToKLSAgICAgIGlmICghcmVwb3J0UHJvY2Vzc2luZ0luc3RydWN0aW9uKHBhcnNlciwgZW5jb2RpbmcsIHMsIG5leHQpKQotCXJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYTUxfVE9LX0NPTU1FTlQ6Ci0gICAgICBpZiAoIXJlcG9ydENvbW1lbnQocGFyc2VyLCBlbmNvZGluZywgcywgbmV4dCkpCi0JcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhNTF9UT0tfSU5WQUxJRDoKLSAgICAgIGV2ZW50UHRyID0gbmV4dDsKLSAgICAgIHJldHVybiBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTjsKLSAgICBjYXNlIFhNTF9UT0tfUEFSVElBTDoKLSAgICAgIGlmIChuZXh0UHRyKSB7Ci0JKm5leHRQdHIgPSBzOwotCXJldHVybiBYTUxfRVJST1JfTk9ORTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBYTUxfRVJST1JfVU5DTE9TRURfVE9LRU47Ci0gICAgY2FzZSBYTUxfVE9LX1BBUlRJQUxfQ0hBUjoKLSAgICAgIGlmIChuZXh0UHRyKSB7Ci0JKm5leHRQdHIgPSBzOwotCXJldHVybiBYTUxfRVJST1JfTk9ORTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBYTUxfRVJST1JfUEFSVElBTF9DSEFSOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gWE1MX0VSUk9SX0pVTktfQUZURVJfRE9DX0VMRU1FTlQ7Ci0gICAgfQotICAgIGV2ZW50UHRyID0gcyA9IG5leHQ7Ci0gIH0KLX0KLQotI2lmIDAKLXN0YXRpYwotZW51bSBYTUxfRXJyb3IgZXJyb3JQcm9jZXNzb3IoWE1MX1BhcnNlciBwYXJzZXIsCi0JCQkgICAgICBjb25zdCBjaGFyICpzLAotCQkJICAgICAgY29uc3QgY2hhciAqZW5kLAotCQkJICAgICAgY29uc3QgY2hhciAqKm5leHRQdHIpCi17Ci0gIHJldHVybiBlcnJvckNvZGU7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGVudW0gWE1MX0Vycm9yCi1zdG9yZUF0dHJpYnV0ZVZhbHVlKFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBFTkNPRElORyAqZW5jLCBpbnQgaXNDZGF0YSwKLQkJICAgIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kLAotCQkgICAgU1RSSU5HX1BPT0wgKnBvb2wpCi17Ci0gIGVudW0gWE1MX0Vycm9yIHJlc3VsdCA9IGFwcGVuZEF0dHJpYnV0ZVZhbHVlKHBhcnNlciwgZW5jLCBpc0NkYXRhLCBwdHIsIGVuZCwgcG9vbCk7Ci0gIGlmIChyZXN1bHQpCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgaWYgKCFpc0NkYXRhICYmIHBvb2xMZW5ndGgocG9vbCkgJiYgcG9vbExhc3RDaGFyKHBvb2wpID09IDB4MjApCi0gICAgcG9vbENob3AocG9vbCk7Ci0gIGlmICghcG9vbEFwcGVuZENoYXIocG9vbCwgWE1MX1QoJ1wwJykpKQotICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOwotICByZXR1cm4gWE1MX0VSUk9SX05PTkU7Ci19Ci0KLXN0YXRpYyBlbnVtIFhNTF9FcnJvcgotYXBwZW5kQXR0cmlidXRlVmFsdWUoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IEVOQ09ESU5HICplbmMsIGludCBpc0NkYXRhLAotCQkgICAgIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kLAotCQkgICAgIFNUUklOR19QT09MICpwb29sKQotewotICBjb25zdCBFTkNPRElORyAqaW50ZXJuYWxFbmMgPSBucyA/IFhtbEdldEludGVybmFsRW5jb2RpbmdOUygpIDogWG1sR2V0SW50ZXJuYWxFbmNvZGluZygpOwotICBmb3IgKDs7KSB7Ci0gICAgY29uc3QgY2hhciAqbmV4dDsKLSAgICBpbnQgdG9rID0gWG1sQXR0cmlidXRlVmFsdWVUb2soZW5jLCBwdHIsIGVuZCwgJm5leHQpOwotICAgIHN3aXRjaCAodG9rKSB7Ci0gICAgY2FzZSBYTUxfVE9LX05PTkU6Ci0gICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7Ci0gICAgY2FzZSBYTUxfVE9LX0lOVkFMSUQ6Ci0gICAgICBpZiAoZW5jID09IGVuY29kaW5nKQotCWV2ZW50UHRyID0gbmV4dDsKLSAgICAgIHJldHVybiBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTjsKLSAgICBjYXNlIFhNTF9UT0tfUEFSVElBTDoKLSAgICAgIGlmIChlbmMgPT0gZW5jb2RpbmcpCi0JZXZlbnRQdHIgPSBwdHI7Ci0gICAgICByZXR1cm4gWE1MX0VSUk9SX0lOVkFMSURfVE9LRU47Ci0gICAgY2FzZSBYTUxfVE9LX0NIQVJfUkVGOgotICAgICAgewotCVhNTF9DaGFyIGJ1ZltYTUxfRU5DT0RFX01BWF07Ci0JaW50IGk7Ci0JaW50IG4gPSBYbWxDaGFyUmVmTnVtYmVyKGVuYywgcHRyKTsKLQlpZiAobiA8IDApIHsKLQkgIGlmIChlbmMgPT0gZW5jb2RpbmcpCi0JICAgIGV2ZW50UHRyID0gcHRyOwotICAgICAgCSAgcmV0dXJuIFhNTF9FUlJPUl9CQURfQ0hBUl9SRUY7Ci0JfQotCWlmICghaXNDZGF0YQotCSAgICAmJiBuID09IDB4MjAgLyogc3BhY2UgKi8KLQkgICAgJiYgKHBvb2xMZW5ndGgocG9vbCkgPT0gMCB8fCBwb29sTGFzdENoYXIocG9vbCkgPT0gMHgyMCkpCi0JICBicmVhazsKLQluID0gWG1sRW5jb2RlKG4sIChJQ0hBUiAqKWJ1Zik7Ci0JaWYgKCFuKSB7Ci0JICBpZiAoZW5jID09IGVuY29kaW5nKQotCSAgICBldmVudFB0ciA9IHB0cjsKLQkgIHJldHVybiBYTUxfRVJST1JfQkFEX0NIQVJfUkVGOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JICBpZiAoIXBvb2xBcHBlbmRDaGFyKHBvb2wsIGJ1ZltpXSkpCi0JICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOwotCX0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWE1MX1RPS19EQVRBX0NIQVJTOgotICAgICAgaWYgKCFwb29sQXBwZW5kKHBvb2wsIGVuYywgcHRyLCBuZXh0KSkKLQlyZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKLSAgICAgIGJyZWFrOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYTUxfVE9LX1RSQUlMSU5HX0NSOgotICAgICAgbmV4dCA9IHB0ciArIGVuYy0+bWluQnl0ZXNQZXJDaGFyOwotICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSBYTUxfVE9LX0FUVFJJQlVURV9WQUxVRV9TOgotICAgIGNhc2UgWE1MX1RPS19EQVRBX05FV0xJTkU6Ci0gICAgICBpZiAoIWlzQ2RhdGEgJiYgKHBvb2xMZW5ndGgocG9vbCkgPT0gMCB8fCBwb29sTGFzdENoYXIocG9vbCkgPT0gMHgyMCkpCi0JYnJlYWs7Ci0gICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKHBvb2wsIDB4MjApKQotCXJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYTUxfVE9LX0VOVElUWV9SRUY6Ci0gICAgICB7Ci0JY29uc3QgWE1MX0NoYXIgKm5hbWU7Ci0JRU5USVRZICplbnRpdHk7Ci0JWE1MX0NoYXIgY2ggPSBYbWxQcmVkZWZpbmVkRW50aXR5TmFtZShlbmMsCi0JCQkJCSAgICAgIHB0ciArIGVuYy0+bWluQnl0ZXNQZXJDaGFyLAotCQkJCQkgICAgICBuZXh0IC0gZW5jLT5taW5CeXRlc1BlckNoYXIpOwotCWlmIChjaCkgewotCSAgaWYgKCFwb29sQXBwZW5kQ2hhcihwb29sLCBjaCkpCi0gIAkgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0JICBicmVhazsKLQl9Ci0JbmFtZSA9IHBvb2xTdG9yZVN0cmluZygmdGVtcDJQb29sLCBlbmMsCi0JCQkgICAgICAgcHRyICsgZW5jLT5taW5CeXRlc1BlckNoYXIsCi0JCQkgICAgICAgbmV4dCAtIGVuYy0+bWluQnl0ZXNQZXJDaGFyKTsKLQlpZiAoIW5hbWUpCi0JICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKLQllbnRpdHkgPSAoRU5USVRZICopbG9va3VwKCZkdGQuZ2VuZXJhbEVudGl0aWVzLCBuYW1lLCAwKTsKLQlwb29sRGlzY2FyZCgmdGVtcDJQb29sKTsKLQlpZiAoIWVudGl0eSkgewotCSAgaWYgKGR0ZC5jb21wbGV0ZSkgewotCSAgICBpZiAoZW5jID09IGVuY29kaW5nKQotCSAgICAgIGV2ZW50UHRyID0gcHRyOwotCSAgICByZXR1cm4gWE1MX0VSUk9SX1VOREVGSU5FRF9FTlRJVFk7Ci0JICB9Ci0JfQotCWVsc2UgaWYgKGVudGl0eS0+b3BlbikgewotCSAgaWYgKGVuYyA9PSBlbmNvZGluZykKLQkgICAgZXZlbnRQdHIgPSBwdHI7Ci0JICByZXR1cm4gWE1MX0VSUk9SX1JFQ1VSU0lWRV9FTlRJVFlfUkVGOwotCX0KLQllbHNlIGlmIChlbnRpdHktPm5vdGF0aW9uKSB7Ci0JICBpZiAoZW5jID09IGVuY29kaW5nKQotCSAgICBldmVudFB0ciA9IHB0cjsKLQkgIHJldHVybiBYTUxfRVJST1JfQklOQVJZX0VOVElUWV9SRUY7Ci0JfQotCWVsc2UgaWYgKCFlbnRpdHktPnRleHRQdHIpIHsKLQkgIGlmIChlbmMgPT0gZW5jb2RpbmcpCi0JICAgIGV2ZW50UHRyID0gcHRyOwotICAJICByZXR1cm4gWE1MX0VSUk9SX0FUVFJJQlVURV9FWFRFUk5BTF9FTlRJVFlfUkVGOwotCX0KLQllbHNlIHsKLQkgIGVudW0gWE1MX0Vycm9yIHJlc3VsdDsKLQkgIGNvbnN0IFhNTF9DaGFyICp0ZXh0RW5kID0gZW50aXR5LT50ZXh0UHRyICsgZW50aXR5LT50ZXh0TGVuOwotCSAgZW50aXR5LT5vcGVuID0gMTsKLQkgIHJlc3VsdCA9IGFwcGVuZEF0dHJpYnV0ZVZhbHVlKHBhcnNlciwgaW50ZXJuYWxFbmMsIGlzQ2RhdGEsIChjaGFyICopZW50aXR5LT50ZXh0UHRyLCAoY2hhciAqKXRleHRFbmQsIHBvb2wpOwotCSAgZW50aXR5LT5vcGVuID0gMDsKLQkgIGlmIChyZXN1bHQpCi0JICAgIHJldHVybiByZXN1bHQ7Ci0JfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0KCk7Ci0gICAgfQotICAgIHB0ciA9IG5leHQ7Ci0gIH0KLSAgLyogbm90IHJlYWNoZWQgKi8KLX0KLQotc3RhdGljCi1lbnVtIFhNTF9FcnJvciBzdG9yZUVudGl0eVZhbHVlKFhNTF9QYXJzZXIgcGFyc2VyLAotCQkJCWNvbnN0IGNoYXIgKmVudGl0eVRleHRQdHIsCi0JCQkJY29uc3QgY2hhciAqZW50aXR5VGV4dEVuZCkKLXsKLSNpZiAwCi0gIGNvbnN0IEVOQ09ESU5HICppbnRlcm5hbEVuYyA9IG5zID8gWG1sR2V0SW50ZXJuYWxFbmNvZGluZ05TKCkgOiBYbWxHZXRJbnRlcm5hbEVuY29kaW5nKCk7Ci0jZW5kaWYKLSAgU1RSSU5HX1BPT0wgKnBvb2wgPSAmKGR0ZC5wb29sKTsKLSAgZW50aXR5VGV4dFB0ciArPSBlbmNvZGluZy0+bWluQnl0ZXNQZXJDaGFyOwotICBlbnRpdHlUZXh0RW5kIC09IGVuY29kaW5nLT5taW5CeXRlc1BlckNoYXI7Ci0gIGZvciAoOzspIHsKLSAgICBjb25zdCBjaGFyICpuZXh0OwotICAgIGludCB0b2sgPSBYbWxFbnRpdHlWYWx1ZVRvayhlbmNvZGluZywgZW50aXR5VGV4dFB0ciwgZW50aXR5VGV4dEVuZCwgJm5leHQpOwotICAgIHN3aXRjaCAodG9rKSB7Ci0gICAgY2FzZSBYTUxfVE9LX1BBUkFNX0VOVElUWV9SRUY6Ci0gICAgICBldmVudFB0ciA9IGVudGl0eVRleHRQdHI7Ci0gICAgICByZXR1cm4gWE1MX0VSUk9SX1NZTlRBWDsKLSAgICBjYXNlIFhNTF9UT0tfTk9ORToKLSAgICAgIGlmIChkZWNsRW50aXR5KSB7Ci0JZGVjbEVudGl0eS0+dGV4dFB0ciA9IHBvb2wtPnN0YXJ0OwotCWRlY2xFbnRpdHktPnRleHRMZW4gPSBwb29sLT5wdHIgLSBwb29sLT5zdGFydDsKLQlwb29sRmluaXNoKHBvb2wpOwotICAgICAgfQotICAgICAgZWxzZQotCXBvb2xEaXNjYXJkKHBvb2wpOwotICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOwotICAgIGNhc2UgWE1MX1RPS19FTlRJVFlfUkVGOgotICAgIGNhc2UgWE1MX1RPS19EQVRBX0NIQVJTOgotICAgICAgaWYgKCFwb29sQXBwZW5kKHBvb2wsIGVuY29kaW5nLCBlbnRpdHlUZXh0UHRyLCBuZXh0KSkKLQlyZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWE1MX1RPS19UUkFJTElOR19DUjoKLSAgICAgIG5leHQgPSBlbnRpdHlUZXh0UHRyICsgZW5jb2RpbmctPm1pbkJ5dGVzUGVyQ2hhcjsKLSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotICAgIGNhc2UgWE1MX1RPS19EQVRBX05FV0xJTkU6Ci0gICAgICBpZiAocG9vbC0+ZW5kID09IHBvb2wtPnB0ciAmJiAhcG9vbEdyb3cocG9vbCkpCi0JcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0gICAgICAqKHBvb2wtPnB0cikrKyA9IDB4QTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWE1MX1RPS19DSEFSX1JFRjoKLSAgICAgIHsKLQlYTUxfQ2hhciBidWZbWE1MX0VOQ09ERV9NQVhdOwotCWludCBpOwotCWludCBuID0gWG1sQ2hhclJlZk51bWJlcihlbmNvZGluZywgZW50aXR5VGV4dFB0cik7Ci0JaWYgKG4gPCAwKSB7Ci0JICBldmVudFB0ciA9IGVudGl0eVRleHRQdHI7Ci0JICByZXR1cm4gWE1MX0VSUk9SX0JBRF9DSEFSX1JFRjsKLQl9Ci0JbiA9IFhtbEVuY29kZShuLCAoSUNIQVIgKilidWYpOwotCWlmICghbikgewotCSAgZXZlbnRQdHIgPSBlbnRpdHlUZXh0UHRyOwotCSAgcmV0dXJuIFhNTF9FUlJPUl9CQURfQ0hBUl9SRUY7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkgIGlmIChwb29sLT5lbmQgPT0gcG9vbC0+cHRyICYmICFwb29sR3Jvdyhwb29sKSkKLQkgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7Ci0JICAqKHBvb2wtPnB0cikrKyA9IGJ1ZltpXTsKLQl9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhNTF9UT0tfUEFSVElBTDoKLSAgICAgIGV2ZW50UHRyID0gZW50aXR5VGV4dFB0cjsKLSAgICAgIHJldHVybiBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTjsKLSAgICBjYXNlIFhNTF9UT0tfSU5WQUxJRDoKLSAgICAgIGV2ZW50UHRyID0gbmV4dDsKLSAgICAgIHJldHVybiBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTjsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQoKTsKLSAgICB9Ci0gICAgZW50aXR5VGV4dFB0ciA9IG5leHQ7Ci0gIH0KLSAgLyogbm90IHJlYWNoZWQgKi8KLX0KLQotc3RhdGljIHZvaWQKLW5vcm1hbGl6ZUxpbmVzKFhNTF9DaGFyICpzKQotewotICBYTUxfQ2hhciAqcDsKLSAgZm9yICg7OyBzKyspIHsKLSAgICBpZiAoKnMgPT0gWE1MX1QoJ1wwJykpCi0gICAgICByZXR1cm47Ci0gICAgaWYgKCpzID09IDB4RCkKLSAgICAgIGJyZWFrOwotICB9Ci0gIHAgPSBzOwotICBkbyB7Ci0gICAgaWYgKCpzID09IDB4RCkgewotICAgICAgKnArKyA9IDB4QTsKLSAgICAgIGlmICgqKytzID09IDB4QSkKLSAgICAgICAgcysrOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAqcCsrID0gKnMrKzsKLSAgfSB3aGlsZSAoKnMpOwotICAqcCA9IFhNTF9UKCdcMCcpOwotfQotCi1zdGF0aWMgaW50Ci1yZXBvcnRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnN0YXJ0LCBjb25zdCBjaGFyICplbmQpCi17Ci0gIGNvbnN0IFhNTF9DaGFyICp0YXJnZXQ7Ci0gIFhNTF9DaGFyICpkYXRhOwotICBjb25zdCBjaGFyICp0ZW07Ci0gIGlmICghcHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcikgewotICAgIGlmIChkZWZhdWx0SGFuZGxlcikKLSAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHN0YXJ0LCBlbmQpOwotICAgIHJldHVybiAxOwotICB9Ci0gIHN0YXJ0ICs9IGVuYy0+bWluQnl0ZXNQZXJDaGFyICogMjsKLSAgdGVtID0gc3RhcnQgKyBYbWxOYW1lTGVuZ3RoKGVuYywgc3RhcnQpOwotICB0YXJnZXQgPSBwb29sU3RvcmVTdHJpbmcoJnRlbXBQb29sLCBlbmMsIHN0YXJ0LCB0ZW0pOwotICBpZiAoIXRhcmdldCkKLSAgICByZXR1cm4gMDsKLSAgcG9vbEZpbmlzaCgmdGVtcFBvb2wpOwotICBkYXRhID0gcG9vbFN0b3JlU3RyaW5nKCZ0ZW1wUG9vbCwgZW5jLAotCQkJWG1sU2tpcFMoZW5jLCB0ZW0pLAotCQkJZW5kIC0gZW5jLT5taW5CeXRlc1BlckNoYXIqMik7Ci0gIGlmICghZGF0YSkKLSAgICByZXR1cm4gMDsKLSAgbm9ybWFsaXplTGluZXMoZGF0YSk7Ci0gIHByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIoaGFuZGxlckFyZywgdGFyZ2V0LCBkYXRhKTsKLSAgcG9vbENsZWFyKCZ0ZW1wUG9vbCk7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1yZXBvcnRDb21tZW50KFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpzdGFydCwgY29uc3QgY2hhciAqZW5kKQotewotICBYTUxfQ2hhciAqZGF0YTsKLSAgaWYgKCFjb21tZW50SGFuZGxlcikgewotICAgIGlmIChkZWZhdWx0SGFuZGxlcikKLSAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHN0YXJ0LCBlbmQpOwotICAgIHJldHVybiAxOwotICB9Ci0gIGRhdGEgPSBwb29sU3RvcmVTdHJpbmcoJnRlbXBQb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgIGVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArIGVuYy0+bWluQnl0ZXNQZXJDaGFyICogNCwgCi0JCQkgZW5kIC0gZW5jLT5taW5CeXRlc1BlckNoYXIgKiAzKTsKLSAgaWYgKCFkYXRhKQotICAgIHJldHVybiAwOwotICBub3JtYWxpemVMaW5lcyhkYXRhKTsKLSAgY29tbWVudEhhbmRsZXIoaGFuZGxlckFyZywgZGF0YSk7Ci0gIHBvb2xDbGVhcigmdGVtcFBvb2wpOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLXJlcG9ydERlZmF1bHQoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmVuZCkKLXsKLSAgaWYgKE1VU1RfQ09OVkVSVChlbmMsIHMpKSB7Ci0gICAgY29uc3QgY2hhciAqKmV2ZW50UFA7Ci0gICAgY29uc3QgY2hhciAqKmV2ZW50RW5kUFA7Ci0gICAgaWYgKGVuYyA9PSBlbmNvZGluZykgewotICAgICAgZXZlbnRQUCA9ICZldmVudFB0cjsKLSAgICAgIGV2ZW50RW5kUFAgPSAmZXZlbnRFbmRQdHI7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgZXZlbnRQUCA9ICYob3BlbkludGVybmFsRW50aXRpZXMtPmludGVybmFsRXZlbnRQdHIpOwotICAgICAgZXZlbnRFbmRQUCA9ICYob3BlbkludGVybmFsRW50aXRpZXMtPmludGVybmFsRXZlbnRFbmRQdHIpOwotICAgIH0KLSAgICBkbyB7Ci0gICAgICBJQ0hBUiAqZGF0YVB0ciA9IChJQ0hBUiAqKWRhdGFCdWY7Ci0gICAgICBYbWxDb252ZXJ0KGVuYywgJnMsIGVuZCwgJmRhdGFQdHIsIChJQ0hBUiAqKWRhdGFCdWZFbmQpOwotICAgICAgKmV2ZW50RW5kUFAgPSBzOwotICAgICAgZGVmYXVsdEhhbmRsZXIoaGFuZGxlckFyZywgZGF0YUJ1ZiwgZGF0YVB0ciAtIChJQ0hBUiAqKWRhdGFCdWYpOwotICAgICAgKmV2ZW50UFAgPSBzOwotICAgIH0gd2hpbGUgKHMgIT0gZW5kKTsKLSAgfQotICBlbHNlCi0gICAgZGVmYXVsdEhhbmRsZXIoaGFuZGxlckFyZywgKFhNTF9DaGFyICopcywgKFhNTF9DaGFyICopZW5kIC0gKFhNTF9DaGFyICopcyk7Ci19Ci0KLQotc3RhdGljIGludAotZGVmaW5lQXR0cmlidXRlKEVMRU1FTlRfVFlQRSAqdHlwZSwgQVRUUklCVVRFX0lEICphdHRJZCwgaW50IGlzQ2RhdGEsIGNvbnN0IFhNTF9DaGFyICp2YWx1ZSkKLXsKLSAgREVGQVVMVF9BVFRSSUJVVEUgKmF0dDsKLSAgaWYgKHR5cGUtPm5EZWZhdWx0QXR0cyA9PSB0eXBlLT5hbGxvY0RlZmF1bHRBdHRzKSB7Ci0gICAgaWYgKHR5cGUtPmFsbG9jRGVmYXVsdEF0dHMgPT0gMCkgewotICAgICAgdHlwZS0+YWxsb2NEZWZhdWx0QXR0cyA9IDg7Ci0gICAgICB0eXBlLT5kZWZhdWx0QXR0cyA9IG1hbGxvYyh0eXBlLT5hbGxvY0RlZmF1bHRBdHRzKnNpemVvZihERUZBVUxUX0FUVFJJQlVURSkpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHR5cGUtPmFsbG9jRGVmYXVsdEF0dHMgKj0gMjsKLSAgICAgIHR5cGUtPmRlZmF1bHRBdHRzID0gcmVhbGxvYyh0eXBlLT5kZWZhdWx0QXR0cywKLQkJCQkgIHR5cGUtPmFsbG9jRGVmYXVsdEF0dHMqc2l6ZW9mKERFRkFVTFRfQVRUUklCVVRFKSk7Ci0gICAgfQotICAgIGlmICghdHlwZS0+ZGVmYXVsdEF0dHMpCi0gICAgICByZXR1cm4gMDsKLSAgfQotICBhdHQgPSB0eXBlLT5kZWZhdWx0QXR0cyArIHR5cGUtPm5EZWZhdWx0QXR0czsKLSAgYXR0LT5pZCA9IGF0dElkOwotICBhdHQtPnZhbHVlID0gdmFsdWU7Ci0gIGF0dC0+aXNDZGF0YSA9IGlzQ2RhdGE7Ci0gIGlmICghaXNDZGF0YSkKLSAgICBhdHRJZC0+bWF5YmVUb2tlbml6ZWQgPSAxOwotICB0eXBlLT5uRGVmYXVsdEF0dHMgKz0gMTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0RWxlbWVudFR5cGVQcmVmaXgoWE1MX1BhcnNlciBwYXJzZXIsIEVMRU1FTlRfVFlQRSAqZWxlbWVudFR5cGUpCi17Ci0gIGNvbnN0IFhNTF9DaGFyICpuYW1lOwotICBmb3IgKG5hbWUgPSBlbGVtZW50VHlwZS0+bmFtZTsgKm5hbWU7IG5hbWUrKykgewotICAgIGlmICgqbmFtZSA9PSBYTUxfVCgnOicpKSB7Ci0gICAgICBQUkVGSVggKnByZWZpeDsKLSAgICAgIGNvbnN0IFhNTF9DaGFyICpzOwotICAgICAgZm9yIChzID0gZWxlbWVudFR5cGUtPm5hbWU7IHMgIT0gbmFtZTsgcysrKSB7Ci0JaWYgKCFwb29sQXBwZW5kQ2hhcigmZHRkLnBvb2wsICpzKSkKLQkgIHJldHVybiAwOwotICAgICAgfQotICAgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmZHRkLnBvb2wsIFhNTF9UKCdcMCcpKSkKLQlyZXR1cm4gMDsKLSAgICAgIHByZWZpeCA9IChQUkVGSVggKilsb29rdXAoJmR0ZC5wcmVmaXhlcywgcG9vbFN0YXJ0KCZkdGQucG9vbCksIHNpemVvZihQUkVGSVgpKTsKLSAgICAgIGlmICghcHJlZml4KQotCXJldHVybiAwOwotICAgICAgaWYgKHByZWZpeC0+bmFtZSA9PSBwb29sU3RhcnQoJmR0ZC5wb29sKSkKLQlwb29sRmluaXNoKCZkdGQucG9vbCk7Ci0gICAgICBlbHNlCi0JcG9vbERpc2NhcmQoJmR0ZC5wb29sKTsKLSAgICAgIGVsZW1lbnRUeXBlLT5wcmVmaXggPSBwcmVmaXg7Ci0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBBVFRSSUJVVEVfSUQgKgotZ2V0QXR0cmlidXRlSWQoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnN0YXJ0LCBjb25zdCBjaGFyICplbmQpCi17Ci0gIEFUVFJJQlVURV9JRCAqaWQ7Ci0gIGNvbnN0IFhNTF9DaGFyICpuYW1lOwotICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZkdGQucG9vbCwgWE1MX1QoJ1wwJykpKQotICAgIHJldHVybiAwOwotICBuYW1lID0gcG9vbFN0b3JlU3RyaW5nKCZkdGQucG9vbCwgZW5jLCBzdGFydCwgZW5kKTsKLSAgaWYgKCFuYW1lKQotICAgIHJldHVybiAwOwotICArK25hbWU7Ci0gIGlkID0gKEFUVFJJQlVURV9JRCAqKWxvb2t1cCgmZHRkLmF0dHJpYnV0ZUlkcywgbmFtZSwgc2l6ZW9mKEFUVFJJQlVURV9JRCkpOwotICBpZiAoIWlkKQotICAgIHJldHVybiAwOwotICBpZiAoaWQtPm5hbWUgIT0gbmFtZSkKLSAgICBwb29sRGlzY2FyZCgmZHRkLnBvb2wpOwotICBlbHNlIHsKLSAgICBwb29sRmluaXNoKCZkdGQucG9vbCk7Ci0gICAgaWYgKCFucykKLSAgICAgIDsKLSAgICBlbHNlIGlmIChuYW1lWzBdID09ICd4JwotCSYmIG5hbWVbMV0gPT0gJ20nCi0JJiYgbmFtZVsyXSA9PSAnbCcKLQkmJiBuYW1lWzNdID09ICduJwotCSYmIG5hbWVbNF0gPT0gJ3MnCi0JJiYgKG5hbWVbNV0gPT0gWE1MX1QoJ1wwJykgfHwgbmFtZVs1XSA9PSBYTUxfVCgnOicpKSkgewotICAgICAgaWYgKG5hbWVbNV0gPT0gJ1wwJykKLQlpZC0+cHJlZml4ID0gJmR0ZC5kZWZhdWx0UHJlZml4OwotICAgICAgZWxzZQotCWlkLT5wcmVmaXggPSAoUFJFRklYICopbG9va3VwKCZkdGQucHJlZml4ZXMsIG5hbWUgKyA2LCBzaXplb2YoUFJFRklYKSk7Ci0gICAgICBpZC0+eG1sbnMgPSAxOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGludCBpOwotICAgICAgZm9yIChpID0gMDsgbmFtZVtpXTsgaSsrKSB7Ci0JaWYgKG5hbWVbaV0gPT0gWE1MX1QoJzonKSkgewotCSAgaW50IGo7Ci0JICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7Ci0JICAgIGlmICghcG9vbEFwcGVuZENoYXIoJmR0ZC5wb29sLCBuYW1lW2pdKSkKLQkgICAgICByZXR1cm4gMDsKLQkgIH0KLQkgIGlmICghcG9vbEFwcGVuZENoYXIoJmR0ZC5wb29sLCBYTUxfVCgnXDAnKSkpCi0JICAgIHJldHVybiAwOwotCSAgaWQtPnByZWZpeCA9IChQUkVGSVggKilsb29rdXAoJmR0ZC5wcmVmaXhlcywgcG9vbFN0YXJ0KCZkdGQucG9vbCksIHNpemVvZihQUkVGSVgpKTsKLQkgIGlmIChpZC0+cHJlZml4LT5uYW1lID09IHBvb2xTdGFydCgmZHRkLnBvb2wpKQotCSAgICBwb29sRmluaXNoKCZkdGQucG9vbCk7Ci0JICBlbHNlCi0JICAgIHBvb2xEaXNjYXJkKCZkdGQucG9vbCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBpZDsKLX0KLQotI2RlZmluZSBDT05URVhUX1NFUCBYTUxfVCgnXGYnKQotCi1zdGF0aWMKLWNvbnN0IFhNTF9DaGFyICpnZXRDb250ZXh0KFhNTF9QYXJzZXIgcGFyc2VyKQotewotICBIQVNIX1RBQkxFX0lURVIgaXRlcjsKLSAgaW50IG5lZWRTZXAgPSAwOwotCi0gIGlmIChkdGQuZGVmYXVsdFByZWZpeC5iaW5kaW5nKSB7Ci0gICAgaW50IGk7Ci0gICAgaW50IGxlbjsKLSAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgWE1MX1QoJz0nKSkpCi0gICAgICByZXR1cm4gMDsKLSAgICBsZW4gPSBkdGQuZGVmYXVsdFByZWZpeC5iaW5kaW5nLT51cmlMZW47Ci0gICAgaWYgKG5hbWVzcGFjZVNlcGFyYXRvciAhPSBYTUxfVCgnXDAnKSkKLSAgICAgIGxlbi0tOwotICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICAgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCBkdGQuZGVmYXVsdFByZWZpeC5iaW5kaW5nLT51cmlbaV0pKQotICAJcmV0dXJuIDA7Ci0gICAgbmVlZFNlcCA9IDE7Ci0gIH0KLQotICBoYXNoVGFibGVJdGVySW5pdCgmaXRlciwgJihkdGQucHJlZml4ZXMpKTsKLSAgZm9yICg7OykgewotICAgIGludCBpOwotICAgIGludCBsZW47Ci0gICAgY29uc3QgWE1MX0NoYXIgKnM7Ci0gICAgUFJFRklYICpwcmVmaXggPSAoUFJFRklYICopaGFzaFRhYmxlSXRlck5leHQoJml0ZXIpOwotICAgIGlmICghcHJlZml4KQotICAgICAgYnJlYWs7Ci0gICAgaWYgKCFwcmVmaXgtPmJpbmRpbmcpCi0gICAgICBjb250aW51ZTsKLSAgICBpZiAobmVlZFNlcCAmJiAhcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCBDT05URVhUX1NFUCkpCi0gICAgICByZXR1cm4gMDsKLSAgICBmb3IgKHMgPSBwcmVmaXgtPm5hbWU7ICpzOyBzKyspCi0gICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgKnMpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgWE1MX1QoJz0nKSkpCi0gICAgICByZXR1cm4gMDsKLSAgICBsZW4gPSBwcmVmaXgtPmJpbmRpbmctPnVyaUxlbjsKLSAgICBpZiAobmFtZXNwYWNlU2VwYXJhdG9yICE9IFhNTF9UKCdcMCcpKQotICAgICAgbGVuLS07Ci0gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotICAgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsIHByZWZpeC0+YmluZGluZy0+dXJpW2ldKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgbmVlZFNlcCA9IDE7Ci0gIH0KLQotCi0gIGhhc2hUYWJsZUl0ZXJJbml0KCZpdGVyLCAmKGR0ZC5nZW5lcmFsRW50aXRpZXMpKTsKLSAgZm9yICg7OykgewotICAgIGNvbnN0IFhNTF9DaGFyICpzOwotICAgIEVOVElUWSAqZSA9IChFTlRJVFkgKiloYXNoVGFibGVJdGVyTmV4dCgmaXRlcik7Ci0gICAgaWYgKCFlKQotICAgICAgYnJlYWs7Ci0gICAgaWYgKCFlLT5vcGVuKQotICAgICAgY29udGludWU7Ci0gICAgaWYgKG5lZWRTZXAgJiYgIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgQ09OVEVYVF9TRVApKQotICAgICAgcmV0dXJuIDA7Ci0gICAgZm9yIChzID0gZS0+bmFtZTsgKnM7IHMrKykKLSAgICAgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCAqcykpCi0gICAgICAgIHJldHVybiAwOwotICAgIG5lZWRTZXAgPSAxOwotICB9Ci0KLSAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsIFhNTF9UKCdcMCcpKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIHRlbXBQb29sLnN0YXJ0OwotfQotCi1zdGF0aWMKLWludCBzZXRDb250ZXh0KFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBYTUxfQ2hhciAqY29udGV4dCkKLXsKLSAgY29uc3QgWE1MX0NoYXIgKnMgPSBjb250ZXh0OwotCi0gIHdoaWxlICgqY29udGV4dCAhPSBYTUxfVCgnXDAnKSkgewotICAgIGlmICgqcyA9PSBDT05URVhUX1NFUCB8fCAqcyA9PSBYTUxfVCgnXDAnKSkgewotICAgICAgRU5USVRZICplOwotICAgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsIFhNTF9UKCdcMCcpKSkKLQlyZXR1cm4gMDsKLSAgICAgIGUgPSAoRU5USVRZICopbG9va3VwKCZkdGQuZ2VuZXJhbEVudGl0aWVzLCBwb29sU3RhcnQoJnRlbXBQb29sKSwgMCk7Ci0gICAgICBpZiAoZSkKLQllLT5vcGVuID0gMTsKLSAgICAgIGlmICgqcyAhPSBYTUxfVCgnXDAnKSkKLQlzKys7Ci0gICAgICBjb250ZXh0ID0gczsKLSAgICAgIHBvb2xEaXNjYXJkKCZ0ZW1wUG9vbCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCpzID09ICc9JykgewotICAgICAgUFJFRklYICpwcmVmaXg7Ci0gICAgICBpZiAocG9vbExlbmd0aCgmdGVtcFBvb2wpID09IDApCi0JcHJlZml4ID0gJmR0ZC5kZWZhdWx0UHJlZml4OwotICAgICAgZWxzZSB7Ci0JaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsIFhNTF9UKCdcMCcpKSkKLQkgIHJldHVybiAwOwotCXByZWZpeCA9IChQUkVGSVggKilsb29rdXAoJmR0ZC5wcmVmaXhlcywgcG9vbFN0YXJ0KCZ0ZW1wUG9vbCksIHNpemVvZihQUkVGSVgpKTsKLQlpZiAoIXByZWZpeCkKLQkgIHJldHVybiAwOwotICAgICAgICBpZiAocHJlZml4LT5uYW1lID09IHBvb2xTdGFydCgmdGVtcFBvb2wpKQotICAgICAgICAgIHBvb2xGaW5pc2goJnRlbXBQb29sKTsKLSAgICAgICAgZWxzZQotCSAgcG9vbERpc2NhcmQoJnRlbXBQb29sKTsKLSAgICAgIH0KLSAgICAgIGZvciAoY29udGV4dCA9IHMgKyAxOyAqY29udGV4dCAhPSBDT05URVhUX1NFUCAmJiAqY29udGV4dCAhPSBYTUxfVCgnXDAnKTsgY29udGV4dCsrKQotICAgICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgKmNvbnRleHQpKQotICAgICAgICAgIHJldHVybiAwOwotICAgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsIFhNTF9UKCdcMCcpKSkKLQlyZXR1cm4gMDsKLSAgICAgIGlmICghYWRkQmluZGluZyhwYXJzZXIsIHByZWZpeCwgMCwgcG9vbFN0YXJ0KCZ0ZW1wUG9vbCksICZpbmhlcml0ZWRCaW5kaW5ncykpCi0JcmV0dXJuIDA7Ci0gICAgICBwb29sRGlzY2FyZCgmdGVtcFBvb2wpOwotICAgICAgaWYgKCpjb250ZXh0ICE9IFhNTF9UKCdcMCcpKQotCSsrY29udGV4dDsKLSAgICAgIHMgPSBjb250ZXh0OwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCAqcykpCi0JcmV0dXJuIDA7Ci0gICAgICBzKys7Ci0gICAgfQotICB9Ci0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYwotdm9pZCBub3JtYWxpemVQdWJsaWNJZChYTUxfQ2hhciAqcHVibGljSWQpCi17Ci0gIFhNTF9DaGFyICpwID0gcHVibGljSWQ7Ci0gIFhNTF9DaGFyICpzOwotICBmb3IgKHMgPSBwdWJsaWNJZDsgKnM7IHMrKykgewotICAgIHN3aXRjaCAoKnMpIHsKLSAgICBjYXNlIDB4MjA6Ci0gICAgY2FzZSAweEQ6Ci0gICAgY2FzZSAweEE6Ci0gICAgICBpZiAocCAhPSBwdWJsaWNJZCAmJiBwWy0xXSAhPSAweDIwKQotCSpwKysgPSAweDIwOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICpwKysgPSAqczsKLSAgICB9Ci0gIH0KLSAgaWYgKHAgIT0gcHVibGljSWQgJiYgcFstMV0gPT0gMHgyMCkKLSAgICAtLXA7Ci0gICpwID0gWE1MX1QoJ1wwJyk7Ci19Ci0KLXN0YXRpYyBpbnQgZHRkSW5pdChEVEQgKnApCi17Ci0gIHBvb2xJbml0KCYocC0+cG9vbCkpOwotICBoYXNoVGFibGVJbml0KCYocC0+Z2VuZXJhbEVudGl0aWVzKSk7Ci0gIGhhc2hUYWJsZUluaXQoJihwLT5lbGVtZW50VHlwZXMpKTsKLSAgaGFzaFRhYmxlSW5pdCgmKHAtPmF0dHJpYnV0ZUlkcykpOwotICBoYXNoVGFibGVJbml0KCYocC0+cHJlZml4ZXMpKTsKLSAgcC0+Y29tcGxldGUgPSAxOwotICBwLT5zdGFuZGFsb25lID0gMDsKLSAgcC0+YmFzZSA9IDA7Ci0gIHAtPmRlZmF1bHRQcmVmaXgubmFtZSA9IDA7Ci0gIHAtPmRlZmF1bHRQcmVmaXguYmluZGluZyA9IDA7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBkdGREZXN0cm95KERURCAqcCkKLXsKLSAgSEFTSF9UQUJMRV9JVEVSIGl0ZXI7Ci0gIGhhc2hUYWJsZUl0ZXJJbml0KCZpdGVyLCAmKHAtPmVsZW1lbnRUeXBlcykpOwotICBmb3IgKDs7KSB7Ci0gICAgRUxFTUVOVF9UWVBFICplID0gKEVMRU1FTlRfVFlQRSAqKWhhc2hUYWJsZUl0ZXJOZXh0KCZpdGVyKTsKLSAgICBpZiAoIWUpCi0gICAgICBicmVhazsKLSAgICBpZiAoZS0+YWxsb2NEZWZhdWx0QXR0cyAhPSAwKQotICAgICAgZnJlZShlLT5kZWZhdWx0QXR0cyk7Ci0gIH0KLSAgaGFzaFRhYmxlRGVzdHJveSgmKHAtPmdlbmVyYWxFbnRpdGllcykpOwotICBoYXNoVGFibGVEZXN0cm95KCYocC0+ZWxlbWVudFR5cGVzKSk7Ci0gIGhhc2hUYWJsZURlc3Ryb3koJihwLT5hdHRyaWJ1dGVJZHMpKTsKLSAgaGFzaFRhYmxlRGVzdHJveSgmKHAtPnByZWZpeGVzKSk7Ci0gIHBvb2xEZXN0cm95KCYocC0+cG9vbCkpOwotfQotCi0vKiBEbyBhIGRlZXAgY29weSBvZiB0aGUgRFRELiAgUmV0dXJuIDAgZm9yIG91dCBvZiBtZW1vcnk7IG5vbi16ZXJvIG90aGVyd2lzZS4KLVRoZSBuZXcgRFREIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuICovCi0KLXN0YXRpYyBpbnQgZHRkQ29weShEVEQgKm5ld0R0ZCwgY29uc3QgRFREICpvbGREdGQpCi17Ci0gIEhBU0hfVEFCTEVfSVRFUiBpdGVyOwotCi0gIGlmIChvbGREdGQtPmJhc2UpIHsKLSAgICBjb25zdCBYTUxfQ2hhciAqdGVtID0gcG9vbENvcHlTdHJpbmcoJihuZXdEdGQtPnBvb2wpLCBvbGREdGQtPmJhc2UpOwotICAgIGlmICghdGVtKQotICAgICAgcmV0dXJuIDA7Ci0gICAgbmV3RHRkLT5iYXNlID0gdGVtOwotICB9Ci0KLSAgLyogQ29weSB0aGUgcHJlZml4IHRhYmxlLiAqLwotCi0gIGhhc2hUYWJsZUl0ZXJJbml0KCZpdGVyLCAmKG9sZER0ZC0+cHJlZml4ZXMpKTsKLSAgZm9yICg7OykgewotICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lOwotICAgIGNvbnN0IFBSRUZJWCAqb2xkUCA9IChQUkVGSVggKiloYXNoVGFibGVJdGVyTmV4dCgmaXRlcik7Ci0gICAgaWYgKCFvbGRQKQotICAgICAgYnJlYWs7Ci0gICAgbmFtZSA9IHBvb2xDb3B5U3RyaW5nKCYobmV3RHRkLT5wb29sKSwgb2xkUC0+bmFtZSk7Ci0gICAgaWYgKCFuYW1lKQotICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKCFsb29rdXAoJihuZXdEdGQtPnByZWZpeGVzKSwgbmFtZSwgc2l6ZW9mKFBSRUZJWCkpKQotICAgICAgcmV0dXJuIDA7Ci0gIH0KLQotICBoYXNoVGFibGVJdGVySW5pdCgmaXRlciwgJihvbGREdGQtPmF0dHJpYnV0ZUlkcykpOwotCi0gIC8qIENvcHkgdGhlIGF0dHJpYnV0ZSBpZCB0YWJsZS4gKi8KLQotICBmb3IgKDs7KSB7Ci0gICAgQVRUUklCVVRFX0lEICpuZXdBOwotICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lOwotICAgIGNvbnN0IEFUVFJJQlVURV9JRCAqb2xkQSA9IChBVFRSSUJVVEVfSUQgKiloYXNoVGFibGVJdGVyTmV4dCgmaXRlcik7Ci0KLSAgICBpZiAoIW9sZEEpCi0gICAgICBicmVhazsKLSAgICAvKiBSZW1lbWJlciB0byBhbGxvY2F0ZSB0aGUgc2NyYXRjaCBieXRlIGJlZm9yZSB0aGUgbmFtZS4gKi8KLSAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCYobmV3RHRkLT5wb29sKSwgWE1MX1QoJ1wwJykpKQotICAgICAgcmV0dXJuIDA7Ci0gICAgbmFtZSA9IHBvb2xDb3B5U3RyaW5nKCYobmV3RHRkLT5wb29sKSwgb2xkQS0+bmFtZSk7Ci0gICAgaWYgKCFuYW1lKQotICAgICAgcmV0dXJuIDA7Ci0gICAgKytuYW1lOwotICAgIG5ld0EgPSAoQVRUUklCVVRFX0lEICopbG9va3VwKCYobmV3RHRkLT5hdHRyaWJ1dGVJZHMpLCBuYW1lLCBzaXplb2YoQVRUUklCVVRFX0lEKSk7Ci0gICAgaWYgKCFuZXdBKQotICAgICAgcmV0dXJuIDA7Ci0gICAgbmV3QS0+bWF5YmVUb2tlbml6ZWQgPSBvbGRBLT5tYXliZVRva2VuaXplZDsKLSAgICBpZiAob2xkQS0+cHJlZml4KSB7Ci0gICAgICBuZXdBLT54bWxucyA9IG9sZEEtPnhtbG5zOwotICAgICAgaWYgKG9sZEEtPnByZWZpeCA9PSAmb2xkRHRkLT5kZWZhdWx0UHJlZml4KQotCW5ld0EtPnByZWZpeCA9ICZuZXdEdGQtPmRlZmF1bHRQcmVmaXg7Ci0gICAgICBlbHNlCi0JbmV3QS0+cHJlZml4ID0gKFBSRUZJWCAqKWxvb2t1cCgmKG5ld0R0ZC0+cHJlZml4ZXMpLCBvbGRBLT5wcmVmaXgtPm5hbWUsIDApOwotICAgIH0KLSAgfQotCi0gIC8qIENvcHkgdGhlIGVsZW1lbnQgdHlwZSB0YWJsZS4gKi8KLQotICBoYXNoVGFibGVJdGVySW5pdCgmaXRlciwgJihvbGREdGQtPmVsZW1lbnRUeXBlcykpOwotCi0gIGZvciAoOzspIHsKLSAgICBpbnQgaTsKLSAgICBFTEVNRU5UX1RZUEUgKm5ld0U7Ci0gICAgY29uc3QgWE1MX0NoYXIgKm5hbWU7Ci0gICAgY29uc3QgRUxFTUVOVF9UWVBFICpvbGRFID0gKEVMRU1FTlRfVFlQRSAqKWhhc2hUYWJsZUl0ZXJOZXh0KCZpdGVyKTsKLSAgICBpZiAoIW9sZEUpCi0gICAgICBicmVhazsKLSAgICBuYW1lID0gcG9vbENvcHlTdHJpbmcoJihuZXdEdGQtPnBvb2wpLCBvbGRFLT5uYW1lKTsKLSAgICBpZiAoIW5hbWUpCi0gICAgICByZXR1cm4gMDsKLSAgICBuZXdFID0gKEVMRU1FTlRfVFlQRSAqKWxvb2t1cCgmKG5ld0R0ZC0+ZWxlbWVudFR5cGVzKSwgbmFtZSwgc2l6ZW9mKEVMRU1FTlRfVFlQRSkpOwotICAgIGlmICghbmV3RSkKLSAgICAgIHJldHVybiAwOwotICAgIGlmIChvbGRFLT5uRGVmYXVsdEF0dHMpIHsKLSAgICAgIG5ld0UtPmRlZmF1bHRBdHRzID0gKERFRkFVTFRfQVRUUklCVVRFICopbWFsbG9jKG9sZEUtPm5EZWZhdWx0QXR0cyAqIHNpemVvZihERUZBVUxUX0FUVFJJQlVURSkpOwotICAgICAgaWYgKCFuZXdFLT5kZWZhdWx0QXR0cykKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgbmV3RS0+YWxsb2NEZWZhdWx0QXR0cyA9IG5ld0UtPm5EZWZhdWx0QXR0cyA9IG9sZEUtPm5EZWZhdWx0QXR0czsKLSAgICBpZiAob2xkRS0+cHJlZml4KQotICAgICAgbmV3RS0+cHJlZml4ID0gKFBSRUZJWCAqKWxvb2t1cCgmKG5ld0R0ZC0+cHJlZml4ZXMpLCBvbGRFLT5wcmVmaXgtPm5hbWUsIDApOwotICAgIGZvciAoaSA9IDA7IGkgPCBuZXdFLT5uRGVmYXVsdEF0dHM7IGkrKykgewotICAgICAgbmV3RS0+ZGVmYXVsdEF0dHNbaV0uaWQgPSAoQVRUUklCVVRFX0lEICopbG9va3VwKCYobmV3RHRkLT5hdHRyaWJ1dGVJZHMpLCBvbGRFLT5kZWZhdWx0QXR0c1tpXS5pZC0+bmFtZSwgMCk7Ci0gICAgICBuZXdFLT5kZWZhdWx0QXR0c1tpXS5pc0NkYXRhID0gb2xkRS0+ZGVmYXVsdEF0dHNbaV0uaXNDZGF0YTsKLSAgICAgIGlmIChvbGRFLT5kZWZhdWx0QXR0c1tpXS52YWx1ZSkgewotCW5ld0UtPmRlZmF1bHRBdHRzW2ldLnZhbHVlID0gcG9vbENvcHlTdHJpbmcoJihuZXdEdGQtPnBvb2wpLCBvbGRFLT5kZWZhdWx0QXR0c1tpXS52YWx1ZSk7Ci0JaWYgKCFuZXdFLT5kZWZhdWx0QXR0c1tpXS52YWx1ZSkKLSAgCSAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0JbmV3RS0+ZGVmYXVsdEF0dHNbaV0udmFsdWUgPSAwOwotICAgIH0KLSAgfQotCi0gIC8qIENvcHkgdGhlIGVudGl0eSB0YWJsZS4gKi8KLQotICBoYXNoVGFibGVJdGVySW5pdCgmaXRlciwgJihvbGREdGQtPmdlbmVyYWxFbnRpdGllcykpOwotCi0gIGZvciAoOzspIHsKLSAgICBFTlRJVFkgKm5ld0U7Ci0gICAgY29uc3QgWE1MX0NoYXIgKm5hbWU7Ci0gICAgY29uc3QgRU5USVRZICpvbGRFID0gKEVOVElUWSAqKWhhc2hUYWJsZUl0ZXJOZXh0KCZpdGVyKTsKLSAgICBpZiAoIW9sZEUpCi0gICAgICBicmVhazsKLSAgICBuYW1lID0gcG9vbENvcHlTdHJpbmcoJihuZXdEdGQtPnBvb2wpLCBvbGRFLT5uYW1lKTsKLSAgICBpZiAoIW5hbWUpCi0gICAgICByZXR1cm4gMDsKLSAgICBuZXdFID0gKEVOVElUWSAqKWxvb2t1cCgmKG5ld0R0ZC0+Z2VuZXJhbEVudGl0aWVzKSwgbmFtZSwgc2l6ZW9mKEVOVElUWSkpOwotICAgIGlmICghbmV3RSkKLSAgICAgIHJldHVybiAwOwotICAgIGlmIChvbGRFLT5zeXN0ZW1JZCkgewotICAgICAgY29uc3QgWE1MX0NoYXIgKnRlbSA9IHBvb2xDb3B5U3RyaW5nKCYobmV3RHRkLT5wb29sKSwgb2xkRS0+c3lzdGVtSWQpOwotICAgICAgaWYgKCF0ZW0pCi0JcmV0dXJuIDA7Ci0gICAgICBuZXdFLT5zeXN0ZW1JZCA9IHRlbTsKLSAgICAgIGlmIChvbGRFLT5iYXNlKSB7Ci0JaWYgKG9sZEUtPmJhc2UgPT0gb2xkRHRkLT5iYXNlKQotCSAgbmV3RS0+YmFzZSA9IG5ld0R0ZC0+YmFzZTsKLQl0ZW0gPSBwb29sQ29weVN0cmluZygmKG5ld0R0ZC0+cG9vbCksIG9sZEUtPmJhc2UpOwotCWlmICghdGVtKQotCSAgcmV0dXJuIDA7Ci0JbmV3RS0+YmFzZSA9IHRlbTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBjb25zdCBYTUxfQ2hhciAqdGVtID0gcG9vbENvcHlTdHJpbmdOKCYobmV3RHRkLT5wb29sKSwgb2xkRS0+dGV4dFB0ciwgb2xkRS0+dGV4dExlbik7Ci0gICAgICBpZiAoIXRlbSkKLQlyZXR1cm4gMDsKLSAgICAgIG5ld0UtPnRleHRQdHIgPSB0ZW07Ci0gICAgICBuZXdFLT50ZXh0TGVuID0gb2xkRS0+dGV4dExlbjsKLSAgICB9Ci0gICAgaWYgKG9sZEUtPm5vdGF0aW9uKSB7Ci0gICAgICBjb25zdCBYTUxfQ2hhciAqdGVtID0gcG9vbENvcHlTdHJpbmcoJihuZXdEdGQtPnBvb2wpLCBvbGRFLT5ub3RhdGlvbik7Ci0gICAgICBpZiAoIXRlbSkKLQlyZXR1cm4gMDsKLSAgICAgIG5ld0UtPm5vdGF0aW9uID0gdGVtOwotICAgIH0KLSAgfQotCi0gIG5ld0R0ZC0+Y29tcGxldGUgPSBvbGREdGQtPmNvbXBsZXRlOwotICBuZXdEdGQtPnN0YW5kYWxvbmUgPSBvbGREdGQtPnN0YW5kYWxvbmU7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMKLXZvaWQgcG9vbEluaXQoU1RSSU5HX1BPT0wgKnBvb2wpCi17Ci0gIHBvb2wtPmJsb2NrcyA9IDA7Ci0gIHBvb2wtPmZyZWVCbG9ja3MgPSAwOwotICBwb29sLT5zdGFydCA9IDA7Ci0gIHBvb2wtPnB0ciA9IDA7Ci0gIHBvb2wtPmVuZCA9IDA7Ci19Ci0KLXN0YXRpYwotdm9pZCBwb29sQ2xlYXIoU1RSSU5HX1BPT0wgKnBvb2wpCi17Ci0gIGlmICghcG9vbC0+ZnJlZUJsb2NrcykKLSAgICBwb29sLT5mcmVlQmxvY2tzID0gcG9vbC0+YmxvY2tzOwotICBlbHNlIHsKLSAgICBCTE9DSyAqcCA9IHBvb2wtPmJsb2NrczsKLSAgICB3aGlsZSAocCkgewotICAgICAgQkxPQ0sgKnRlbSA9IHAtPm5leHQ7Ci0gICAgICBwLT5uZXh0ID0gcG9vbC0+ZnJlZUJsb2NrczsKLSAgICAgIHBvb2wtPmZyZWVCbG9ja3MgPSBwOwotICAgICAgcCA9IHRlbTsKLSAgICB9Ci0gIH0KLSAgcG9vbC0+YmxvY2tzID0gMDsKLSAgcG9vbC0+c3RhcnQgPSAwOwotICBwb29sLT5wdHIgPSAwOwotICBwb29sLT5lbmQgPSAwOwotfQotCi1zdGF0aWMKLXZvaWQgcG9vbERlc3Ryb3koU1RSSU5HX1BPT0wgKnBvb2wpCi17Ci0gIEJMT0NLICpwID0gcG9vbC0+YmxvY2tzOwotICB3aGlsZSAocCkgewotICAgIEJMT0NLICp0ZW0gPSBwLT5uZXh0OwotICAgIGZyZWUocCk7Ci0gICAgcCA9IHRlbTsKLSAgfQotICBwb29sLT5ibG9ja3MgPSAwOwotICBwID0gcG9vbC0+ZnJlZUJsb2NrczsKLSAgd2hpbGUgKHApIHsKLSAgICBCTE9DSyAqdGVtID0gcC0+bmV4dDsKLSAgICBmcmVlKHApOwotICAgIHAgPSB0ZW07Ci0gIH0KLSAgcG9vbC0+ZnJlZUJsb2NrcyA9IDA7Ci0gIHBvb2wtPnB0ciA9IDA7Ci0gIHBvb2wtPnN0YXJ0ID0gMDsKLSAgcG9vbC0+ZW5kID0gMDsKLX0KLQotc3RhdGljCi1YTUxfQ2hhciAqcG9vbEFwcGVuZChTVFJJTkdfUE9PTCAqcG9vbCwgY29uc3QgRU5DT0RJTkcgKmVuYywKLQkJICAgICBjb25zdCBjaGFyICpwdHIsIGNvbnN0IGNoYXIgKmVuZCkKLXsKLSAgaWYgKCFwb29sLT5wdHIgJiYgIXBvb2xHcm93KHBvb2wpKQotICAgIHJldHVybiAwOwotICBmb3IgKDs7KSB7Ci0gICAgWG1sQ29udmVydChlbmMsICZwdHIsIGVuZCwgKElDSEFSICoqKSYocG9vbC0+cHRyKSwgKElDSEFSICopcG9vbC0+ZW5kKTsKLSAgICBpZiAocHRyID09IGVuZCkKLSAgICAgIGJyZWFrOwotICAgIGlmICghcG9vbEdyb3cocG9vbCkpCi0gICAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gcG9vbC0+c3RhcnQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBYTUxfQ2hhciAqcG9vbENvcHlTdHJpbmcoU1RSSU5HX1BPT0wgKnBvb2wsIGNvbnN0IFhNTF9DaGFyICpzKQotewotICBkbyB7Ci0gICAgaWYgKCFwb29sQXBwZW5kQ2hhcihwb29sLCAqcykpCi0gICAgICByZXR1cm4gMDsKLSAgfSB3aGlsZSAoKnMrKyk7Ci0gIHMgPSBwb29sLT5zdGFydDsKLSAgcG9vbEZpbmlzaChwb29sKTsKLSAgcmV0dXJuIHM7Ci19Ci0KLXN0YXRpYyBjb25zdCBYTUxfQ2hhciAqcG9vbENvcHlTdHJpbmdOKFNUUklOR19QT09MICpwb29sLCBjb25zdCBYTUxfQ2hhciAqcywgaW50IG4pCi17Ci0gIGlmICghcG9vbC0+cHRyICYmICFwb29sR3Jvdyhwb29sKSkKLSAgICByZXR1cm4gMDsKLSAgZm9yICg7IG4gPiAwOyAtLW4sIHMrKykgewotICAgIGlmICghcG9vbEFwcGVuZENoYXIocG9vbCwgKnMpKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgfQotICBzID0gcG9vbC0+c3RhcnQ7Ci0gIHBvb2xGaW5pc2gocG9vbCk7Ci0gIHJldHVybiBzOwotfQotCi1zdGF0aWMKLVhNTF9DaGFyICpwb29sU3RvcmVTdHJpbmcoU1RSSU5HX1BPT0wgKnBvb2wsIGNvbnN0IEVOQ09ESU5HICplbmMsCi0JCQkgIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kKQotewotICBpZiAoIXBvb2xBcHBlbmQocG9vbCwgZW5jLCBwdHIsIGVuZCkpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChwb29sLT5wdHIgPT0gcG9vbC0+ZW5kICYmICFwb29sR3Jvdyhwb29sKSkKLSAgICByZXR1cm4gMDsKLSAgKihwb29sLT5wdHIpKysgPSAwOwotICByZXR1cm4gcG9vbC0+c3RhcnQ7Ci19Ci0KLXN0YXRpYwotaW50IHBvb2xHcm93KFNUUklOR19QT09MICpwb29sKQotewotICBpZiAocG9vbC0+ZnJlZUJsb2NrcykgewotICAgIGlmIChwb29sLT5zdGFydCA9PSAwKSB7Ci0gICAgICBwb29sLT5ibG9ja3MgPSBwb29sLT5mcmVlQmxvY2tzOwotICAgICAgcG9vbC0+ZnJlZUJsb2NrcyA9IHBvb2wtPmZyZWVCbG9ja3MtPm5leHQ7Ci0gICAgICBwb29sLT5ibG9ja3MtPm5leHQgPSAwOwotICAgICAgcG9vbC0+c3RhcnQgPSBwb29sLT5ibG9ja3MtPnM7Ci0gICAgICBwb29sLT5lbmQgPSBwb29sLT5zdGFydCArIHBvb2wtPmJsb2Nrcy0+c2l6ZTsKLSAgICAgIHBvb2wtPnB0ciA9IHBvb2wtPnN0YXJ0OwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmIChwb29sLT5lbmQgLSBwb29sLT5zdGFydCA8IHBvb2wtPmZyZWVCbG9ja3MtPnNpemUpIHsKLSAgICAgIEJMT0NLICp0ZW0gPSBwb29sLT5mcmVlQmxvY2tzLT5uZXh0OwotICAgICAgcG9vbC0+ZnJlZUJsb2Nrcy0+bmV4dCA9IHBvb2wtPmJsb2NrczsKLSAgICAgIHBvb2wtPmJsb2NrcyA9IHBvb2wtPmZyZWVCbG9ja3M7Ci0gICAgICBwb29sLT5mcmVlQmxvY2tzID0gdGVtOwotICAgICAgbWVtY3B5KHBvb2wtPmJsb2Nrcy0+cywgcG9vbC0+c3RhcnQsIChwb29sLT5lbmQgLSBwb29sLT5zdGFydCkgKiBzaXplb2YoWE1MX0NoYXIpKTsKLSAgICAgIHBvb2wtPnB0ciA9IHBvb2wtPmJsb2Nrcy0+cyArIChwb29sLT5wdHIgLSBwb29sLT5zdGFydCk7Ci0gICAgICBwb29sLT5zdGFydCA9IHBvb2wtPmJsb2Nrcy0+czsKLSAgICAgIHBvb2wtPmVuZCA9IHBvb2wtPnN0YXJ0ICsgcG9vbC0+YmxvY2tzLT5zaXplOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICB9Ci0gIGlmIChwb29sLT5ibG9ja3MgJiYgcG9vbC0+c3RhcnQgPT0gcG9vbC0+YmxvY2tzLT5zKSB7Ci0gICAgaW50IGJsb2NrU2l6ZSA9IChwb29sLT5lbmQgLSBwb29sLT5zdGFydCkqMjsKLSAgICBwb29sLT5ibG9ja3MgPSByZWFsbG9jKHBvb2wtPmJsb2Nrcywgb2Zmc2V0b2YoQkxPQ0ssIHMpICsgYmxvY2tTaXplICogc2l6ZW9mKFhNTF9DaGFyKSk7Ci0gICAgaWYgKCFwb29sLT5ibG9ja3MpCi0gICAgICByZXR1cm4gMDsKLSAgICBwb29sLT5ibG9ja3MtPnNpemUgPSBibG9ja1NpemU7Ci0gICAgcG9vbC0+cHRyID0gcG9vbC0+YmxvY2tzLT5zICsgKHBvb2wtPnB0ciAtIHBvb2wtPnN0YXJ0KTsKLSAgICBwb29sLT5zdGFydCA9IHBvb2wtPmJsb2Nrcy0+czsKLSAgICBwb29sLT5lbmQgPSBwb29sLT5zdGFydCArIGJsb2NrU2l6ZTsKLSAgfQotICBlbHNlIHsKLSAgICBCTE9DSyAqdGVtOwotICAgIGludCBibG9ja1NpemUgPSBwb29sLT5lbmQgLSBwb29sLT5zdGFydDsKLSAgICBpZiAoYmxvY2tTaXplIDwgSU5JVF9CTE9DS19TSVpFKQotICAgICAgYmxvY2tTaXplID0gSU5JVF9CTE9DS19TSVpFOwotICAgIGVsc2UKLSAgICAgIGJsb2NrU2l6ZSAqPSAyOwotICAgIHRlbSA9IG1hbGxvYyhvZmZzZXRvZihCTE9DSywgcykgKyBibG9ja1NpemUgKiBzaXplb2YoWE1MX0NoYXIpKTsKLSAgICBpZiAoIXRlbSkKLSAgICAgIHJldHVybiAwOwotICAgIHRlbS0+c2l6ZSA9IGJsb2NrU2l6ZTsKLSAgICB0ZW0tPm5leHQgPSBwb29sLT5ibG9ja3M7Ci0gICAgcG9vbC0+YmxvY2tzID0gdGVtOwotICAgIG1lbWNweSh0ZW0tPnMsIHBvb2wtPnN0YXJ0LCAocG9vbC0+cHRyIC0gcG9vbC0+c3RhcnQpICogc2l6ZW9mKFhNTF9DaGFyKSk7Ci0gICAgcG9vbC0+cHRyID0gdGVtLT5zICsgKHBvb2wtPnB0ciAtIHBvb2wtPnN0YXJ0KTsKLSAgICBwb29sLT5zdGFydCA9IHRlbS0+czsKLSAgICBwb29sLT5lbmQgPSB0ZW0tPnMgKyBibG9ja1NpemU7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9zcmNsaWIvZXhwYXQtbGl0ZS94bWxwYXJzZS5oIGIvc3JjbGliL2V4cGF0LWxpdGUveG1scGFyc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkZmE3NS4uMDAwMDAwMAotLS0gYS9zcmNsaWIvZXhwYXQtbGl0ZS94bWxwYXJzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDgyICswLDAgQEAKLS8qCi1UaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlCi1WZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluCi1jb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCi0KLVNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIKLWJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi1MaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1UaGUgT3JpZ2luYWwgQ29kZSBpcyBleHBhdC4KLQotVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIEphbWVzIENsYXJrLgotUG9ydGlvbnMgY3JlYXRlZCBieSBKYW1lcyBDbGFyayBhcmUgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5Ci1KYW1lcyBDbGFyay4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotQ29udHJpYnV0b3Iocyk6Ci0KLUFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zCi1vZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKHRoZSAiR1BMIiksIGluIHdoaWNoIGNhc2UgdGhlCi1wcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aG9zZSBhYm92ZS4gIElmIHlvdQotd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgotdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQKLXJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlCi1HUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlCi15b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCi0qLwotCi0jaWZuZGVmIFhtbFBhcnNlX0lOQ0xVREVECi0jZGVmaW5lIFhtbFBhcnNlX0lOQ0xVREVEIDEKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWZuZGVmIFhNTFBBUlNFQVBJCi0jZGVmaW5lIFhNTFBBUlNFQVBJIC8qIGFzIG5vdGhpbmcgKi8KLSNlbmRpZgotCi10eXBlZGVmIHZvaWQgKlhNTF9QYXJzZXI7Ci0KLSNpZmRlZiBYTUxfVU5JQ09ERV9XQ0hBUl9UCi0KLS8qIFhNTF9VTklDT0RFX1dDSEFSX1Qgd2lsbCB3b3JrIG9ubHkgaWYgc2l6ZW9mKHdjaGFyX3QpID09IDIgYW5kIHdjaGFyX3QKLXVzZXMgVW5pY29kZS4gKi8KLS8qIEluZm9ybWF0aW9uIGlzIFVURi0xNiBlbmNvZGVkIGFzIHdjaGFyX3RzICovCi0KLSNpZm5kZWYgWE1MX1VOSUNPREUKLSNkZWZpbmUgWE1MX1VOSUNPREUKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci10eXBlZGVmIHdjaGFyX3QgWE1MX0NoYXI7Ci10eXBlZGVmIHdjaGFyX3QgWE1MX0xDaGFyOwotCi0jZWxzZSAvKiBub3QgWE1MX1VOSUNPREVfV0NIQVJfVCAqLwotCi0jaWZkZWYgWE1MX1VOSUNPREUKLQotLyogSW5mb3JtYXRpb24gaXMgVVRGLTE2IGVuY29kZWQgYXMgdW5zaWduZWQgc2hvcnRzICovCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IFhNTF9DaGFyOwotdHlwZWRlZiBjaGFyIFhNTF9MQ2hhcjsKLQotI2Vsc2UgLyogbm90IFhNTF9VTklDT0RFICovCi0KLS8qIEluZm9ybWF0aW9uIGlzIFVURi04IGVuY29kZWQuICovCi10eXBlZGVmIGNoYXIgWE1MX0NoYXI7Ci10eXBlZGVmIGNoYXIgWE1MX0xDaGFyOwotCi0jZW5kaWYgLyogbm90IFhNTF9VTklDT0RFICovCi0KLSNlbmRpZiAvKiBub3QgWE1MX1VOSUNPREVfV0NIQVJfVCAqLwotCi0KLS8qIENvbnN0cnVjdHMgYSBuZXcgcGFyc2VyOyBlbmNvZGluZyBpcyB0aGUgZW5jb2Rpbmcgc3BlY2lmaWVkIGJ5IHRoZSBleHRlcm5hbAotcHJvdG9jb2wgb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lIHNwZWNpZmllZC4gKi8KLQotWE1MX1BhcnNlciBYTUxQQVJTRUFQSQotWE1MX1BhcnNlckNyZWF0ZShjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcpOwotCi0vKiBDb25zdHJ1Y3RzIGEgbmV3IHBhcnNlciBhbmQgbmFtZXNwYWNlIHByb2Nlc3Nvci4gIEVsZW1lbnQgdHlwZSBuYW1lcwotYW5kIGF0dHJpYnV0ZSBuYW1lcyB0aGF0IGJlbG9uZyB0byBhIG5hbWVzcGFjZSB3aWxsIGJlIGV4cGFuZGVkOwotdW5wcmVmaXhlZCBhdHRyaWJ1dGUgbmFtZXMgYXJlIG5ldmVyIGV4cGFuZGVkOyB1bnByZWZpeGVkIGVsZW1lbnQgdHlwZQotbmFtZXMgYXJlIGV4cGFuZGVkIG9ubHkgaWYgdGhlcmUgaXMgYSBkZWZhdWx0IG5hbWVzcGFjZS4gVGhlIGV4cGFuZGVkCi1uYW1lIGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBuYW1lc3BhY2UgVVJJLCB0aGUgbmFtZXNwYWNlIHNlcGFyYXRvciBjaGFyYWN0ZXIsCi1hbmQgdGhlIGxvY2FsIHBhcnQgb2YgdGhlIG5hbWUuICBJZiB0aGUgbmFtZXNwYWNlIHNlcGFyYXRvciBpcyAnXDAnIHRoZW4KLXRoZSBuYW1lc3BhY2UgVVJJIGFuZCB0aGUgbG9jYWwgcGFydCB3aWxsIGJlIGNvbmNhdGVuYXRlZCB3aXRob3V0IGFueQotc2VwYXJhdG9yLiAgV2hlbiBhIG5hbWVzcGFjZSBpcyBub3QgZGVjbGFyZWQsIHRoZSBuYW1lIGFuZCBwcmVmaXggd2lsbCBiZQotcGFzc2VkIHRocm91Z2ggd2l0aG91dCBleHBhbnNpb24uICovCi0KLVhNTF9QYXJzZXIgWE1MUEFSU0VBUEkKLVhNTF9QYXJzZXJDcmVhdGVOUyhjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcsIFhNTF9DaGFyIG5hbWVzcGFjZVNlcGFyYXRvcik7Ci0KLQotLyogYXR0cyBpcyBhcnJheSBvZiBuYW1lL3ZhbHVlIHBhaXJzLCB0ZXJtaW5hdGVkIGJ5IDA7Ci0gICBuYW1lcyBhbmQgdmFsdWVzIGFyZSAwIHRlcm1pbmF0ZWQuICovCi0KLXR5cGVkZWYgdm9pZCAoKlhNTF9TdGFydEVsZW1lbnRIYW5kbGVyKSh2b2lkICp1c2VyRGF0YSwKLQkJCQkJY29uc3QgWE1MX0NoYXIgKm5hbWUsCi0JCQkJCWNvbnN0IFhNTF9DaGFyICoqYXR0cyk7Ci0KLXR5cGVkZWYgdm9pZCAoKlhNTF9FbmRFbGVtZW50SGFuZGxlcikodm9pZCAqdXNlckRhdGEsCi0JCQkJICAgICAgY29uc3QgWE1MX0NoYXIgKm5hbWUpOwotCi0vKiBzIGlzIG5vdCAwIHRlcm1pbmF0ZWQuICovCi10eXBlZGVmIHZvaWQgKCpYTUxfQ2hhcmFjdGVyRGF0YUhhbmRsZXIpKHZvaWQgKnVzZXJEYXRhLAotCQkJCQkgY29uc3QgWE1MX0NoYXIgKnMsCi0JCQkJCSBpbnQgbGVuKTsKLQotLyogdGFyZ2V0IGFuZCBkYXRhIGFyZSAwIHRlcm1pbmF0ZWQgKi8KLXR5cGVkZWYgdm9pZCAoKlhNTF9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyKSh2b2lkICp1c2VyRGF0YSwKLQkJCQkJCSBjb25zdCBYTUxfQ2hhciAqdGFyZ2V0LAotCQkJCQkJIGNvbnN0IFhNTF9DaGFyICpkYXRhKTsKLQotLyogZGF0YSBpcyAwIHRlcm1pbmF0ZWQgKi8KLXR5cGVkZWYgdm9pZCAoKlhNTF9Db21tZW50SGFuZGxlcikodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpkYXRhKTsKLQotdHlwZWRlZiB2b2lkICgqWE1MX1N0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcikodm9pZCAqdXNlckRhdGEpOwotdHlwZWRlZiB2b2lkICgqWE1MX0VuZENkYXRhU2VjdGlvbkhhbmRsZXIpKHZvaWQgKnVzZXJEYXRhKTsKLQotLyogVGhpcyBpcyBjYWxsZWQgZm9yIGFueSBjaGFyYWN0ZXJzIGluIHRoZSBYTUwgZG9jdW1lbnQgZm9yCi13aGljaCB0aGVyZSBpcyBubyBhcHBsaWNhYmxlIGhhbmRsZXIuICBUaGlzIGluY2x1ZGVzIGJvdGgKLWNoYXJhY3RlcnMgdGhhdCBhcmUgcGFydCBvZiBtYXJrdXAgd2hpY2ggaXMgb2YgYSBraW5kIHRoYXQgaXMKLW5vdCByZXBvcnRlZCAoY29tbWVudHMsIG1hcmt1cCBkZWNsYXJhdGlvbnMpLCBvciBjaGFyYWN0ZXJzCi10aGF0IGFyZSBwYXJ0IG9mIGEgY29uc3RydWN0IHdoaWNoIGNvdWxkIGJlIHJlcG9ydGVkIGJ1dAotZm9yIHdoaWNoIG5vIGhhbmRsZXIgaGFzIGJlZW4gc3VwcGxpZWQuIFRoZSBjaGFyYWN0ZXJzIGFyZSBwYXNzZWQKLWV4YWN0bHkgYXMgdGhleSB3ZXJlIGluIHRoZSBYTUwgZG9jdW1lbnQgZXhjZXB0IHRoYXQKLXRoZXkgd2lsbCBiZSBlbmNvZGVkIGluIFVURi04LiAgTGluZSBib3VuZGFyaWVzIGFyZSBub3Qgbm9ybWFsaXplZC4KLU5vdGUgdGhhdCBhIGJ5dGUgb3JkZXIgbWFyayBjaGFyYWN0ZXIgaXMgbm90IHBhc3NlZCB0byB0aGUgZGVmYXVsdCBoYW5kbGVyLgotVGhlcmUgYXJlIG5vIGd1YXJhbnRlZXMgYWJvdXQgaG93IGNoYXJhY3RlcnMgYXJlIGRpdmlkZWQgYmV0d2VlbiBjYWxscwotdG8gdGhlIGRlZmF1bHQgaGFuZGxlcjogZm9yIGV4YW1wbGUsIGEgY29tbWVudCBtaWdodCBiZSBzcGxpdCBiZXR3ZWVuCi1tdWx0aXBsZSBjYWxscy4gKi8KLQotdHlwZWRlZiB2b2lkICgqWE1MX0RlZmF1bHRIYW5kbGVyKSh2b2lkICp1c2VyRGF0YSwKLQkJCQkgICBjb25zdCBYTUxfQ2hhciAqcywKLQkJCQkgICBpbnQgbGVuKTsKLQotLyogVGhpcyBpcyBjYWxsZWQgZm9yIGEgZGVjbGFyYXRpb24gb2YgYW4gdW5wYXJzZWQgKE5EQVRBKQotZW50aXR5LiAgVGhlIGJhc2UgYXJndW1lbnQgaXMgd2hhdGV2ZXIgd2FzIHNldCBieSBYTUxfU2V0QmFzZS4KLVRoZSBlbnRpdHlOYW1lLCBzeXN0ZW1JZCBhbmQgbm90YXRpb25OYW1lIGFyZ3VtZW50cyB3aWxsIG5ldmVyIGJlIG51bGwuCi1UaGUgb3RoZXIgYXJndW1lbnRzIG1heSBiZS4gKi8KLQotdHlwZWRlZiB2b2lkICgqWE1MX1VucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIpKHZvaWQgKnVzZXJEYXRhLAotCQkJCQkgICAgICBjb25zdCBYTUxfQ2hhciAqZW50aXR5TmFtZSwKLQkJCQkJICAgICAgY29uc3QgWE1MX0NoYXIgKmJhc2UsCi0JCQkJCSAgICAgIGNvbnN0IFhNTF9DaGFyICpzeXN0ZW1JZCwKLQkJCQkJICAgICAgY29uc3QgWE1MX0NoYXIgKnB1YmxpY0lkLAotCQkJCQkgICAgICBjb25zdCBYTUxfQ2hhciAqbm90YXRpb25OYW1lKTsKLQotLyogVGhpcyBpcyBjYWxsZWQgZm9yIGEgZGVjbGFyYXRpb24gb2Ygbm90YXRpb24uCi1UaGUgYmFzZSBhcmd1bWVudCBpcyB3aGF0ZXZlciB3YXMgc2V0IGJ5IFhNTF9TZXRCYXNlLgotVGhlIG5vdGF0aW9uTmFtZSB3aWxsIG5ldmVyIGJlIG51bGwuICBUaGUgb3RoZXIgYXJndW1lbnRzIGNhbiBiZS4gKi8KLQotdHlwZWRlZiB2b2lkICgqWE1MX05vdGF0aW9uRGVjbEhhbmRsZXIpKHZvaWQgKnVzZXJEYXRhLAotCQkJCQljb25zdCBYTUxfQ2hhciAqbm90YXRpb25OYW1lLAotCQkJCQljb25zdCBYTUxfQ2hhciAqYmFzZSwKLQkJCQkJY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAotCQkJCQljb25zdCBYTUxfQ2hhciAqcHVibGljSWQpOwotCi0vKiBXaGVuIG5hbWVzcGFjZSBwcm9jZXNzaW5nIGlzIGVuYWJsZWQsIHRoZXNlIGFyZSBjYWxsZWQgb25jZSBmb3IKLWVhY2ggbmFtZXNwYWNlIGRlY2xhcmF0aW9uLiBUaGUgY2FsbCB0byB0aGUgc3RhcnQgYW5kIGVuZCBlbGVtZW50Ci1oYW5kbGVycyBvY2N1ciBiZXR3ZWVuIHRoZSBjYWxscyB0byB0aGUgc3RhcnQgYW5kIGVuZCBuYW1lc3BhY2UKLWRlY2xhcmF0aW9uIGhhbmRsZXJzLiBGb3IgYW4geG1sbnMgYXR0cmlidXRlLCBwcmVmaXggd2lsbCBiZSBudWxsLgotRm9yIGFuIHhtbG5zPSIiIGF0dHJpYnV0ZSwgdXJpIHdpbGwgYmUgbnVsbC4gKi8KLQotdHlwZWRlZiB2b2lkICgqWE1MX1N0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIpKHZvaWQgKnVzZXJEYXRhLAotCQkJCQkgICAgICBjb25zdCBYTUxfQ2hhciAqcHJlZml4LAotCQkJCQkgICAgICBjb25zdCBYTUxfQ2hhciAqdXJpKTsKLQotdHlwZWRlZiB2b2lkICgqWE1MX0VuZE5hbWVzcGFjZURlY2xIYW5kbGVyKSh2b2lkICp1c2VyRGF0YSwKLQkJCQkJICAgIGNvbnN0IFhNTF9DaGFyICpwcmVmaXgpOwotCi0vKiBUaGlzIGlzIGNhbGxlZCBpZiB0aGUgZG9jdW1lbnQgaXMgbm90IHN0YW5kYWxvbmUgKGl0IGhhcyBhbgotZXh0ZXJuYWwgc3Vic2V0IG9yIGEgcmVmZXJlbmNlIHRvIGEgcGFyYW1ldGVyIGVudGl0eSwgYnV0IGRvZXMgbm90Ci1oYXZlIHN0YW5kYWxvbmU9InllcyIpLiBJZiB0aGlzIGhhbmRsZXIgcmV0dXJucyAwLCB0aGVuIHByb2Nlc3NpbmcKLXdpbGwgbm90IGNvbnRpbnVlLCBhbmQgdGhlIHBhcnNlciB3aWxsIHJldHVybiBhCi1YTUxfRVJST1JfTk9UX1NUQU5EQUxPTkUgZXJyb3IuICovCi0KLXR5cGVkZWYgaW50ICgqWE1MX05vdFN0YW5kYWxvbmVIYW5kbGVyKSh2b2lkICp1c2VyRGF0YSk7Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGZvciBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBwYXJzZWQgZ2VuZXJhbCBlbnRpdHkuCi1UaGUgcmVmZXJlbmNlZCBlbnRpdHkgaXMgbm90IGF1dG9tYXRpY2FsbHkgcGFyc2VkLgotVGhlIGFwcGxpY2F0aW9uIGNhbiBwYXJzZSBpdCBpbW1lZGlhdGVseSBvciBsYXRlciB1c2luZwotWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlLgotVGhlIHBhcnNlciBhcmd1bWVudCBpcyB0aGUgcGFyc2VyIHBhcnNpbmcgdGhlIGVudGl0eSBjb250YWluaW5nIHRoZSByZWZlcmVuY2U7Ci1pdCBjYW4gYmUgcGFzc2VkIGFzIHRoZSBwYXJzZXIgYXJndW1lbnQgdG8gWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlLgotVGhlIHN5c3RlbUlkIGFyZ3VtZW50IGlzIHRoZSBzeXN0ZW0gaWRlbnRpZmllciBhcyBzcGVjaWZpZWQgaW4gdGhlIGVudGl0eSBkZWNsYXJhdGlvbjsKLWl0IHdpbGwgbm90IGJlIG51bGwuCi1UaGUgYmFzZSBhcmd1bWVudCBpcyB0aGUgc3lzdGVtIGlkZW50aWZpZXIgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgYmFzZSBmb3IKLXJlc29sdmluZyBzeXN0ZW1JZCBpZiBzeXN0ZW1JZCB3YXMgcmVsYXRpdmU7IHRoaXMgaXMgc2V0IGJ5IFhNTF9TZXRCYXNlOwotaXQgbWF5IGJlIG51bGwuCi1UaGUgcHVibGljSWQgYXJndW1lbnQgaXMgdGhlIHB1YmxpYyBpZGVudGlmaWVyIGFzIHNwZWNpZmllZCBpbiB0aGUgZW50aXR5IGRlY2xhcmF0aW9uLAotb3IgbnVsbCBpZiBub25lIHdhcyBzcGVjaWZpZWQ7IHRoZSB3aGl0ZXNwYWNlIGluIHRoZSBwdWJsaWMgaWRlbnRpZmllcgotd2lsbCBoYXZlIGJlZW4gbm9ybWFsaXplZCBhcyByZXF1aXJlZCBieSB0aGUgWE1MIHNwZWMuCi1UaGUgY29udGV4dCBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIHBhcnNpbmcgY29udGV4dCBpbiB0aGUgZm9ybWF0Ci1leHBlY3RlZCBieSB0aGUgY29udGV4dCBhcmd1bWVudCB0bwotWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlOyBjb250ZXh0IGlzIHZhbGlkIG9ubHkgdW50aWwgdGhlIGhhbmRsZXIKLXJldHVybnMsIHNvIGlmIHRoZSByZWZlcmVuY2VkIGVudGl0eSBpcyB0byBiZSBwYXJzZWQgbGF0ZXIsIGl0IG11c3QgYmUgY29waWVkLgotVGhlIGhhbmRsZXIgc2hvdWxkIHJldHVybiAwIGlmIHByb2Nlc3Npbmcgc2hvdWxkIG5vdCBjb250aW51ZSBiZWNhdXNlIG9mCi1hIGZhdGFsIGVycm9yIGluIHRoZSBoYW5kbGluZyBvZiB0aGUgZXh0ZXJuYWwgZW50aXR5LgotSW4gdGhpcyBjYXNlIHRoZSBjYWxsaW5nIHBhcnNlciB3aWxsIHJldHVybiBhbiBYTUxfRVJST1JfRVhURVJOQUxfRU5USVRZX0hBTkRMSU5HCi1lcnJvci4KLU5vdGUgdGhhdCB1bmxpa2Ugb3RoZXIgaGFuZGxlcnMgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBwYXJzZXIsIG5vdCB1c2VyRGF0YS4gKi8KLQotdHlwZWRlZiBpbnQgKCpYTUxfRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKShYTUxfUGFyc2VyIHBhcnNlciwKLQkJCQkJICAgIGNvbnN0IFhNTF9DaGFyICpjb250ZXh0LAotCQkJCQkgICAgY29uc3QgWE1MX0NoYXIgKmJhc2UsCi0JCQkJCSAgICBjb25zdCBYTUxfQ2hhciAqc3lzdGVtSWQsCi0JCQkJCSAgICBjb25zdCBYTUxfQ2hhciAqcHVibGljSWQpOwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyBmaWxsZWQgaW4gYnkgdGhlIFhNTF9Vbmtub3duRW5jb2RpbmdIYW5kbGVyCi10byBwcm92aWRlIGluZm9ybWF0aW9uIHRvIHRoZSBwYXJzZXIgYWJvdXQgZW5jb2RpbmdzIHRoYXQgYXJlIHVua25vd24KLXRvIHRoZSBwYXJzZXIuCi1UaGUgbWFwW2JdIG1lbWJlciBnaXZlcyBpbmZvcm1hdGlvbiBhYm91dCBieXRlIHNlcXVlbmNlcwotd2hvc2UgZmlyc3QgYnl0ZSBpcyBiLgotSWYgbWFwW2JdIGlzIGMgd2hlcmUgYyBpcyA+PSAwLCB0aGVuIGIgYnkgaXRzZWxmIGVuY29kZXMgdGhlIFVuaWNvZGUgc2NhbGFyIHZhbHVlIGMuCi1JZiBtYXBbYl0gaXMgLTEsIHRoZW4gdGhlIGJ5dGUgc2VxdWVuY2UgaXMgbWFsZm9ybWVkLgotSWYgbWFwW2JdIGlzIC1uLCB3aGVyZSBuID49IDIsIHRoZW4gYiBpcyB0aGUgZmlyc3QgYnl0ZSBvZiBhbiBuLWJ5dGUKLXNlcXVlbmNlIHRoYXQgZW5jb2RlcyBhIHNpbmdsZSBVbmljb2RlIHNjYWxhciB2YWx1ZS4KLVRoZSBkYXRhIG1lbWJlciB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGNvbnZlcnQgZnVuY3Rpb24uCi1UaGUgY29udmVydCBmdW5jdGlvbiBpcyB1c2VkIHRvIGNvbnZlcnQgbXVsdGlieXRlIHNlcXVlbmNlczsKLXMgd2lsbCBwb2ludCB0byBhIG4tYnl0ZSBzZXF1ZW5jZSB3aGVyZSBtYXBbKHVuc2lnbmVkIGNoYXIpKnNdID09IC1uLgotVGhlIGNvbnZlcnQgZnVuY3Rpb24gbXVzdCByZXR1cm4gdGhlIFVuaWNvZGUgc2NhbGFyIHZhbHVlCi1yZXByZXNlbnRlZCBieSB0aGlzIGJ5dGUgc2VxdWVuY2Ugb3IgLTEgaWYgdGhlIGJ5dGUgc2VxdWVuY2UgaXMgbWFsZm9ybWVkLgotVGhlIGNvbnZlcnQgZnVuY3Rpb24gbWF5IGJlIG51bGwgaWYgdGhlIGVuY29kaW5nIGlzIGEgc2luZ2xlLWJ5dGUgZW5jb2RpbmcsCi10aGF0IGlzIGlmIG1hcFtiXSA+PSAtMSBmb3IgYWxsIGJ5dGVzIGIuCi1XaGVuIHRoZSBwYXJzZXIgaXMgZmluaXNoZWQgd2l0aCB0aGUgZW5jb2RpbmcsIHRoZW4gaWYgcmVsZWFzZSBpcyBub3QgbnVsbCwKLWl0IHdpbGwgY2FsbCByZWxlYXNlIHBhc3NpbmcgaXQgdGhlIGRhdGEgbWVtYmVyOwotb25jZSByZWxlYXNlIGhhcyBiZWVuIGNhbGxlZCwgdGhlIGNvbnZlcnQgZnVuY3Rpb24gd2lsbCBub3QgYmUgY2FsbGVkIGFnYWluLgotCi1FeHBhdCBwbGFjZXMgY2VydGFpbiByZXN0cmljdGlvbnMgb24gdGhlIGVuY29kaW5ncyB0aGF0IGFyZSBzdXBwb3J0ZWQKLXVzaW5nIHRoaXMgbWVjaGFuaXNtLgotCi0xLiBFdmVyeSBBU0NJSSBjaGFyYWN0ZXIgdGhhdCBjYW4gYXBwZWFyIGluIGEgd2VsbC1mb3JtZWQgWE1MIGRvY3VtZW50LAotb3RoZXIgdGhhbiB0aGUgY2hhcmFjdGVycwotCi0gICRAXF5ge31+Ci0KLW11c3QgYmUgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgYnl0ZSwgYW5kIHRoYXQgYnl0ZSBtdXN0IGJlIHRoZQotc2FtZSBieXRlIHRoYXQgcmVwcmVzZW50cyB0aGF0IGNoYXJhY3RlciBpbiBBU0NJSS4KLQotMi4gTm8gY2hhcmFjdGVyIG1heSByZXF1aXJlIG1vcmUgdGhhbiA0IGJ5dGVzIHRvIGVuY29kZS4KLQotMy4gQWxsIGNoYXJhY3RlcnMgZW5jb2RlZCBtdXN0IGhhdmUgVW5pY29kZSBzY2FsYXIgdmFsdWVzIDw9IDB4RkZGRiwKLShpZSBjaGFyYWN0ZXJzIHRoYXQgd291bGQgYmUgZW5jb2RlZCBieSBzdXJyb2dhdGVzIGluIFVURi0xNgotYXJlICBub3QgYWxsb3dlZCkuICBOb3RlIHRoYXQgdGhpcyByZXN0cmljdGlvbiBkb2Vzbid0IGFwcGx5IHRvCi10aGUgYnVpbHQgYXBfY29udGV4dF90IG4gc3VwcG9ydCBmb3IgVVRGLTggYW5kIFVURi0xNi4KLQotNC4gTm8gVW5pY29kZSBjaGFyYWN0ZXIgbWF5IGJlIGVuY29kZWQgYnkgbW9yZSB0aGFuIG9uZSBkaXN0aW5jdCBzZXF1ZW5jZQotb2YgYnl0ZXMuICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IG1hcFsyNTZdOwotICB2b2lkICpkYXRhOwotICBpbnQgKCpjb252ZXJ0KSh2b2lkICpkYXRhLCBjb25zdCBjaGFyICpzKTsKLSAgdm9pZCAoKnJlbGVhc2UpKHZvaWQgKmRhdGEpOwotfSBYTUxfRW5jb2Rpbmc7Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGZvciBhbiBlbmNvZGluZyB0aGF0IGlzIHVua25vd24gdG8gdGhlIHBhcnNlci4KLVRoZSBlbmNvZGluZ0hhbmRsZXJEYXRhIGFyZ3VtZW50IGlzIHRoYXQgd2hpY2ggd2FzIHBhc3NlZCBhcyB0aGUKLXNlY29uZCBhcmd1bWVudCB0byBYTUxfU2V0VW5rbm93bkVuY29kaW5nSGFuZGxlci4KLVRoZSBuYW1lIGFyZ3VtZW50IGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBlbmNvZGluZyBhcyBzcGVjaWZpZWQgaW4KLXRoZSBlbmNvZGluZyBkZWNsYXJhdGlvbi4KLUlmIHRoZSBjYWxsYmFjayBjYW4gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZW5jb2RpbmcsCi1pdCBtdXN0IGZpbGwgaW4gdGhlIFhNTF9FbmNvZGluZyBzdHJ1Y3R1cmUsIGFuZCByZXR1cm4gMS4KLU90aGVyd2lzZSBpdCBtdXN0IHJldHVybiAwLgotSWYgaW5mbyBkb2VzIG5vdCBkZXNjcmliZSBhIHN1aXRhYmxlIGVuY29kaW5nLAotdGhlbiB0aGUgcGFyc2VyIHdpbGwgcmV0dXJuIGFuIFhNTF9VTktOT1dOX0VOQ09ESU5HIGVycm9yLiAqLwotCi10eXBlZGVmIGludCAoKlhNTF9Vbmtub3duRW5jb2RpbmdIYW5kbGVyKSh2b2lkICplbmNvZGluZ0hhbmRsZXJEYXRhLAotCQkJCQkgIGNvbnN0IFhNTF9DaGFyICpuYW1lLAotCQkJCQkgIFhNTF9FbmNvZGluZyAqaW5mbyk7Ci0KLXZvaWQgWE1MUEFSU0VBUEkKLVhNTF9TZXRFbGVtZW50SGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKLQkJICAgICAgWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIgc3RhcnQsCi0JCSAgICAgIFhNTF9FbmRFbGVtZW50SGFuZGxlciBlbmQpOwotCi12b2lkIFhNTFBBUlNFQVBJCi1YTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCi0JCQkgICAgWE1MX0NoYXJhY3RlckRhdGFIYW5kbGVyIGhhbmRsZXIpOwotCi12b2lkIFhNTFBBUlNFQVBJCi1YTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKLQkJCQkgICAgWE1MX1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgaGFuZGxlcik7Ci12b2lkIFhNTFBBUlNFQVBJCi1YTUxfU2V0Q29tbWVudEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgWE1MX0NvbW1lbnRIYW5kbGVyIGhhbmRsZXIpOwotCi12b2lkIFhNTFBBUlNFQVBJCi1YTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKLQkJCSAgIFhNTF9TdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgc3RhcnQsCi0JCQkgICBYTUxfRW5kQ2RhdGFTZWN0aW9uSGFuZGxlciBlbmQpOwotCi0vKiBUaGlzIHNldHMgdGhlIGRlZmF1bHQgaGFuZGxlciBhbmQgYWxzbyBpbmhpYml0cyBleHBhbnNpb24gb2YgaW50ZXJuYWwgZW50aXRpZXMuCi1UaGUgZW50aXR5IHJlZmVyZW5jZSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgZGVmYXVsdCBoYW5kbGVyLiAqLwotCi12b2lkIFhNTFBBUlNFQVBJCi1YTUxfU2V0RGVmYXVsdEhhbmRsZXIoWE1MX1BhcnNlciBwYXJzZXIsCi0JCSAgICAgIFhNTF9EZWZhdWx0SGFuZGxlciBoYW5kbGVyKTsKLQotLyogVGhpcyBzZXRzIHRoZSBkZWZhdWx0IGhhbmRsZXIgYnV0IGRvZXMgbm90IGluaGliaXQgZXhwYW5zaW9uIG9mIGludGVybmFsIGVudGl0aWVzLgotVGhlIGVudGl0eSByZWZlcmVuY2Ugd2lsbCBub3QgYmUgcGFzc2VkIHRvIHRoZSBkZWZhdWx0IGhhbmRsZXIuICovCi0KLXZvaWQgWE1MUEFSU0VBUEkKLVhNTF9TZXREZWZhdWx0SGFuZGxlckV4cGFuZChYTUxfUGFyc2VyIHBhcnNlciwKLQkJICAgICAgICAgICAgWE1MX0RlZmF1bHRIYW5kbGVyIGhhbmRsZXIpOwotCi12b2lkIFhNTFBBUlNFQVBJCi1YTUxfU2V0VW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKLQkJCQkgWE1MX1VucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIgaGFuZGxlcik7Ci0KLXZvaWQgWE1MUEFSU0VBUEkKLVhNTF9TZXROb3RhdGlvbkRlY2xIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAotCQkJICAgWE1MX05vdGF0aW9uRGVjbEhhbmRsZXIgaGFuZGxlcik7Ci0KLXZvaWQgWE1MUEFSU0VBUEkKLVhNTF9TZXROYW1lc3BhY2VEZWNsSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKLQkJCSAgICBYTUxfU3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciBzdGFydCwKLQkJCSAgICBYTUxfRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgZW5kKTsKLQotdm9pZCBYTUxQQVJTRUFQSQotWE1MX1NldE5vdFN0YW5kYWxvbmVIYW5kbGVyKFhNTF9QYXJzZXIgcGFyc2VyLAotCQkJICAgIFhNTF9Ob3RTdGFuZGFsb25lSGFuZGxlciBoYW5kbGVyKTsKLQotdm9pZCBYTUxQQVJTRUFQSQotWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKLQkJCQlYTUxfRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIGhhbmRsZXIpOwotCi0vKiBJZiBhIG5vbi1udWxsIHZhbHVlIGZvciBhcmcgaXMgc3BlY2lmaWVkIGhlcmUsIHRoZW4gaXQgd2lsbCBiZSBwYXNzZWQKLWFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgZXh0ZXJuYWwgZW50aXR5IHJlZiBoYW5kbGVyIGluc3RlYWQKLW9mIHRoZSBwYXJzZXIgb2JqZWN0LiAqLwotdm9pZCBYTUxQQVJTRUFQSQotWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZyhYTUxfUGFyc2VyLCB2b2lkICphcmcpOwotCi12b2lkIFhNTFBBUlNFQVBJCi1YTUxfU2V0VW5rbm93bkVuY29kaW5nSGFuZGxlcihYTUxfUGFyc2VyIHBhcnNlciwKLQkJCSAgICAgIFhNTF9Vbmtub3duRW5jb2RpbmdIYW5kbGVyIGhhbmRsZXIsCi0JCQkgICAgICB2b2lkICplbmNvZGluZ0hhbmRsZXJEYXRhKTsKLQotLyogVGhpcyBjYW4gYmUgY2FsbGVkIHdpdGhpbiBhIGhhbmRsZXIgZm9yIGEgc3RhcnQgZWxlbWVudCwgZW5kIGVsZW1lbnQsCi1wcm9jZXNzaW5nIGluc3RydWN0aW9uIG9yIGNoYXJhY3RlciBkYXRhLiAgSXQgY2F1c2VzIHRoZSBjb3JyZXNwb25kaW5nCi1tYXJrdXAgdG8gYmUgcGFzc2VkIHRvIHRoZSBkZWZhdWx0IGhhbmRsZXIuICovCi12b2lkIFhNTFBBUlNFQVBJIFhNTF9EZWZhdWx0Q3VycmVudChYTUxfUGFyc2VyIHBhcnNlcik7Ci0KLS8qIFRoaXMgdmFsdWUgaXMgcGFzc2VkIGFzIHRoZSB1c2VyRGF0YSBhcmd1bWVudCB0byBjYWxsYmFja3MuICovCi12b2lkIFhNTFBBUlNFQVBJCi1YTUxfU2V0VXNlckRhdGEoWE1MX1BhcnNlciBwYXJzZXIsIHZvaWQgKnVzZXJEYXRhKTsKLQotLyogUmV0dXJucyB0aGUgbGFzdCB2YWx1ZSBzZXQgYnkgWE1MX1NldFVzZXJEYXRhIG9yIG51bGwuICovCi0jZGVmaW5lIFhNTF9HZXRVc2VyRGF0YShwYXJzZXIpICgqKHZvaWQgKiopKHBhcnNlcikpCi0KLS8qIFRoaXMgaXMgZXF1aXZhbGVudCB0byBzdXBwbHlpbmcgYW4gZW5jb2RpbmcgYXJndW1lbnQKLXRvIFhNTF9DcmVhdGVQYXJzZXIuIEl0IG11c3Qgbm90IGJlIGNhbGxlZCBhZnRlciBYTUxfUGFyc2UKLW9yIFhNTF9QYXJzZUJ1ZmZlci4gKi8KLQotaW50IFhNTFBBUlNFQVBJCi1YTUxfU2V0RW5jb2RpbmcoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IFhNTF9DaGFyICplbmNvZGluZyk7Ci0KLS8qIElmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGVuIHRoZSBwYXJzZXIgd2lsbCBiZSBwYXNzZWQKLWFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBjYWxsYmFja3MgaW5zdGVhZCBvZiB1c2VyRGF0YS4KLVRoZSB1c2VyRGF0YSB3aWxsIHN0aWxsIGJlIGFjY2Vzc2libGUgdXNpbmcgWE1MX0dldFVzZXJEYXRhLiAqLwotCi12b2lkIFhNTFBBUlNFQVBJCi1YTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnKFhNTF9QYXJzZXIgcGFyc2VyKTsKLQotLyogU2V0cyB0aGUgYmFzZSB0byBiZSB1c2VkIGZvciByZXNvbHZpbmcgcmVsYXRpdmUgVVJJcyBpbiBzeXN0ZW0gaWRlbnRpZmllcnMgaW4KLWRlY2xhcmF0aW9ucy4gIFJlc29sdmluZyByZWxhdGl2ZSBpZGVudGlmaWVycyBpcyBsZWZ0IHRvIHRoZSBhcHBsaWNhdGlvbjoKLXRoaXMgdmFsdWUgd2lsbCBiZSBwYXNzZWQgdGhyb3VnaCBhcyB0aGUgYmFzZSBhcmd1bWVudCB0byB0aGUKLVhNTF9FeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIsIFhNTF9Ob3RhdGlvbkRlY2xIYW5kbGVyCi1hbmQgWE1MX1VucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIuIFRoZSBiYXNlIGFyZ3VtZW50IHdpbGwgYmUgY29waWVkLgotUmV0dXJucyB6ZXJvIGlmIG91dCBvZiBtZW1vcnksIG5vbi16ZXJvIG90aGVyd2lzZS4gKi8KLQotaW50IFhNTFBBUlNFQVBJCi1YTUxfU2V0QmFzZShYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgWE1MX0NoYXIgKmJhc2UpOwotCi1jb25zdCBYTUxfQ2hhciBYTUxQQVJTRUFQSSAqCi1YTUxfR2V0QmFzZShYTUxfUGFyc2VyIHBhcnNlcik7Ci0KLS8qIFJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgYXR0cmlidXRlcyBwYXNzZWQgaW4gbGFzdCBjYWxsIHRvIHRoZQotWE1MX1N0YXJ0RWxlbWVudEhhbmRsZXIgdGhhdCB3ZXJlIHNwZWNpZmllZCBpbiB0aGUgc3RhcnQtdGFnIHJhdGhlcgotdGhhbiBkZWZhdWx0ZWQuICovCi0KLWludCBYTUxQQVJTRUFQSSBYTUxfR2V0U3BlY2lmaWVkQXR0cmlidXRlQ291bnQoWE1MX1BhcnNlciBwYXJzZXIpOwotCi0vKiBQYXJzZXMgc29tZSBpbnB1dC4gUmV0dXJucyAwIGlmIGEgZmF0YWwgZXJyb3IgaXMgZGV0ZWN0ZWQuCi1UaGUgbGFzdCBjYWxsIHRvIFhNTF9QYXJzZSBtdXN0IGhhdmUgaXNGaW5hbCB0cnVlOwotbGVuIG1heSBiZSB6ZXJvIGZvciB0aGlzIGNhbGwgKG9yIGFueSBvdGhlcikuICovCi1pbnQgWE1MUEFSU0VBUEkKLVhNTF9QYXJzZShYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgY2hhciAqcywgaW50IGxlbiwgaW50IGlzRmluYWwpOwotCi12b2lkIFhNTFBBUlNFQVBJICoKLVhNTF9HZXRCdWZmZXIoWE1MX1BhcnNlciBwYXJzZXIsIGludCBsZW4pOwotCi1pbnQgWE1MUEFSU0VBUEkKLVhNTF9QYXJzZUJ1ZmZlcihYTUxfUGFyc2VyIHBhcnNlciwgaW50IGxlbiwgaW50IGlzRmluYWwpOwotCi0vKiBDcmVhdGVzIGFuIFhNTF9QYXJzZXIgb2JqZWN0IHRoYXQgY2FuIHBhcnNlIGFuIGV4dGVybmFsIGdlbmVyYWwgZW50aXR5OwotY29udGV4dCBpcyBhICdcMCctdGVybWluYXRlZCBzdHJpbmcgc3BlY2lmeWluZyB0aGUgcGFyc2UgY29udGV4dDsKLWVuY29kaW5nIGlzIGEgJ1wwJy10ZXJtaW5hdGVkIHN0cmluZyBnaXZpbmcgdGhlIG5hbWUgb2YgdGhlIGV4dGVybmFsbHkgc3BlY2lmaWVkIGVuY29kaW5nLAotb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBleHRlcm5hbGx5IHNwZWNpZmllZCBlbmNvZGluZy4KLVRoZSBjb250ZXh0IHN0cmluZyBjb25zaXN0cyBvZiBhIHNlcXVlbmNlIG9mIHRva2VucyBzZXBhcmF0ZWQgYnkgZm9ybWZlZWRzIChcZik7Ci1hIHRva2VuIGNvbnNpc3Rpbmcgb2YgYSBuYW1lIHNwZWNpZmllcyB0aGF0IHRoZSBnZW5lcmFsIGVudGl0eSBvZiB0aGUgbmFtZQotaXMgb3BlbjsgYSB0b2tlbiBvZiB0aGUgZm9ybSBwcmVmaXg9dXJpIHNwZWNpZmllcyB0aGUgbmFtZXNwYWNlIGZvciBhIHBhcnRpY3VsYXIKLXByZWZpeDsgYSB0b2tlbiBvZiB0aGUgZm9ybSA9dXJpIHNwZWNpZmllcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UuCi1UaGlzIGNhbiBiZSBjYWxsZWQgYXQgYW55IHBvaW50IGFmdGVyIHRoZSBmaXJzdCBjYWxsIHRvIGFuIEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcgotc28gbG9uZ2VyIGFzIHRoZSBwYXJzZXIgaGFzIG5vdCB5ZXQgYmVlbiBmcmVlZC4KLVRoZSBuZXcgcGFyc2VyIGlzIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQgYW5kIG1heSBzYWZlbHkgYmUgdXNlZCBpbiBhIHNlcGFyYXRlIHRocmVhZC4KLVRoZSBoYW5kbGVycyBhbmQgdXNlckRhdGEgYXJlIGluaXRpYWxpemVkIGZyb20gdGhlIHBhcnNlciBhcmd1bWVudC4KLVJldHVybnMgMCBpZiBvdXQgb2YgbWVtb3J5LiAgT3RoZXJ3aXNlIHJldHVybnMgYSBuZXcgWE1MX1BhcnNlciBvYmplY3QuICovCi1YTUxfUGFyc2VyIFhNTFBBUlNFQVBJCi1YTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUoWE1MX1BhcnNlciBwYXJzZXIsCi0JCQkgICAgICAgY29uc3QgWE1MX0NoYXIgKmNvbnRleHQsCi0JCQkgICAgICAgY29uc3QgWE1MX0NoYXIgKmVuY29kaW5nKTsKLQotZW51bSBYTUxfRXJyb3IgewotICBYTUxfRVJST1JfTk9ORSwKLSAgWE1MX0VSUk9SX05PX01FTU9SWSwKLSAgWE1MX0VSUk9SX1NZTlRBWCwKLSAgWE1MX0VSUk9SX05PX0VMRU1FTlRTLAotICBYTUxfRVJST1JfSU5WQUxJRF9UT0tFTiwKLSAgWE1MX0VSUk9SX1VOQ0xPU0VEX1RPS0VOLAotICBYTUxfRVJST1JfUEFSVElBTF9DSEFSLAotICBYTUxfRVJST1JfVEFHX01JU01BVENILAotICBYTUxfRVJST1JfRFVQTElDQVRFX0FUVFJJQlVURSwKLSAgWE1MX0VSUk9SX0pVTktfQUZURVJfRE9DX0VMRU1FTlQsCi0gIFhNTF9FUlJPUl9QQVJBTV9FTlRJVFlfUkVGLAotICBYTUxfRVJST1JfVU5ERUZJTkVEX0VOVElUWSwKLSAgWE1MX0VSUk9SX1JFQ1VSU0lWRV9FTlRJVFlfUkVGLAotICBYTUxfRVJST1JfQVNZTkNfRU5USVRZLAotICBYTUxfRVJST1JfQkFEX0NIQVJfUkVGLAotICBYTUxfRVJST1JfQklOQVJZX0VOVElUWV9SRUYsCi0gIFhNTF9FUlJPUl9BVFRSSUJVVEVfRVhURVJOQUxfRU5USVRZX1JFRiwKLSAgWE1MX0VSUk9SX01JU1BMQUNFRF9YTUxfUEksCi0gIFhNTF9FUlJPUl9VTktOT1dOX0VOQ09ESU5HLAotICBYTUxfRVJST1JfSU5DT1JSRUNUX0VOQ09ESU5HLAotICBYTUxfRVJST1JfVU5DTE9TRURfQ0RBVEFfU0VDVElPTiwKLSAgWE1MX0VSUk9SX0VYVEVSTkFMX0VOVElUWV9IQU5ETElORywKLSAgWE1MX0VSUk9SX05PVF9TVEFOREFMT05FCi19OwotCi0vKiBJZiBYTUxfUGFyc2Ugb3IgWE1MX1BhcnNlQnVmZmVyIGhhdmUgcmV0dXJuZWQgMCwgdGhlbiBYTUxfR2V0RXJyb3JDb2RlCi1yZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvci4gKi8KLQotZW51bSBYTUxfRXJyb3IgWE1MUEFSU0VBUEkgWE1MX0dldEVycm9yQ29kZShYTUxfUGFyc2VyIHBhcnNlcik7Ci0KLS8qIFRoZXNlIGZ1bmN0aW9ucyByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgcGFyc2UgbG9jYXRpb24uCi1UaGV5IG1heSBiZSBjYWxsZWQgd2hlbiBYTUxfUGFyc2Ugb3IgWE1MX1BhcnNlQnVmZmVyIHJldHVybiAwOwotaW4gdGhpcyBjYXNlIHRoZSBsb2NhdGlvbiBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIGNoYXJhY3RlciBhdCB3aGljaAotdGhlIGVycm9yIHdhcyBkZXRlY3RlZC4KLVRoZXkgbWF5IGFsc28gYmUgY2FsbGVkIGZyb20gYW55IG90aGVyIGNhbGxiYWNrIGNhbGxlZCB0byByZXBvcnQKLXNvbWUgcGFyc2UgZXZlbnQ7IGluIHRoaXMgdGhlIGxvY2F0aW9uIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlyc3QKLW9mIHRoZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgZ2VuZXJhdGVkIHRoZSBldmVudC4gKi8KLQotaW50IFhNTFBBUlNFQVBJIFhNTF9HZXRDdXJyZW50TGluZU51bWJlcihYTUxfUGFyc2VyIHBhcnNlcik7Ci1pbnQgWE1MUEFSU0VBUEkgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIoWE1MX1BhcnNlciBwYXJzZXIpOwotbG9uZyBYTUxQQVJTRUFQSSBYTUxfR2V0Q3VycmVudEJ5dGVJbmRleChYTUxfUGFyc2VyIHBhcnNlcik7Ci0KLS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBjdXJyZW50IGV2ZW50LgotUmV0dXJucyAwIGlmIHRoZSBldmVudCBpcyBpbiBhbiBpbnRlcm5hbCBlbnRpdHkuICovCi0KLWludCBYTUxQQVJTRUFQSSBYTUxfR2V0Q3VycmVudEJ5dGVDb3VudChYTUxfUGFyc2VyIHBhcnNlcik7Ci0KLS8qIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzIHZlcnNpb25zLiAqLwotI2RlZmluZSBYTUxfR2V0RXJyb3JMaW5lTnVtYmVyIFhNTF9HZXRDdXJyZW50TGluZU51bWJlcgotI2RlZmluZSBYTUxfR2V0RXJyb3JDb2x1bW5OdW1iZXIgWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIKLSNkZWZpbmUgWE1MX0dldEVycm9yQnl0ZUluZGV4IFhNTF9HZXRDdXJyZW50Qnl0ZUluZGV4Ci0KLS8qIEZyZWVzIG1lbW9yeSB1c2VkIGJ5IHRoZSBwYXJzZXIuICovCi12b2lkIFhNTFBBUlNFQVBJCi1YTUxfUGFyc2VyRnJlZShYTUxfUGFyc2VyIHBhcnNlcik7Ci0KLS8qIFJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IuICovCi1jb25zdCBYTUxfTENoYXIgWE1MUEFSU0VBUEkgKlhNTF9FcnJvclN0cmluZyhpbnQgY29kZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBub3QgWG1sUGFyc2VfSU5DTFVERUQgKi8KZGlmZiAtLWdpdCBhL3NyY2xpYi9leHBhdC1saXRlL3htbHJvbGUuYyBiL3NyY2xpYi9leHBhdC1saXRlL3htbHJvbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE4ZTM1ZS4uMDAwMDAwMAotLS0gYS9zcmNsaWIvZXhwYXQtbGl0ZS94bWxyb2xlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEzICswLDAgQEAKLS8qCi1UaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlCi1WZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluCi1jb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCi0KLVNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIKLWJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi1MaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1UaGUgT3JpZ2luYWwgQ29kZSBpcyBleHBhdC4KLQotVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIEphbWVzIENsYXJrLgotUG9ydGlvbnMgY3JlYXRlZCBieSBKYW1lcyBDbGFyayBhcmUgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5Ci1KYW1lcyBDbGFyay4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotQ29udHJpYnV0b3Iocyk6Ci0KLUFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zCi1vZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKHRoZSAiR1BMIiksIGluIHdoaWNoIGNhc2UgdGhlCi1wcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aG9zZSBhYm92ZS4gIElmIHlvdQotd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgotdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQKLXJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlCi1HUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlCi15b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCi0qLwotCi0jaW5jbHVkZSAieG1sZGVmLmgiCi0jaW5jbHVkZSAieG1scm9sZS5oIgotCi0vKiBEb2Vzbid0IGNoZWNrOgotCi0gdGhhdCAsfCBhcmUgbm90IG1peGVkIGluIGEgbW9kZWwgZ3JvdXAKLSBjb250ZW50IG9mIGxpdGVyYWxzCi0KLSovCi0KLSNpZm5kZWYgTUlOX0JZVEVTX1BFUl9DSEFSCi0jZGVmaW5lIE1JTl9CWVRFU19QRVJfQ0hBUihlbmMpICgoZW5jKS0+bWluQnl0ZXNQZXJDaGFyKQotI2VuZGlmCi0KLXR5cGVkZWYgaW50IFBST0xPR19IQU5ETEVSKHN0cnVjdCBwcm9sb2dfc3RhdGUgKnN0YXRlLAotCQkJICAgaW50IHRvaywKLQkJCSAgIGNvbnN0IGNoYXIgKnB0ciwKLQkJCSAgIGNvbnN0IGNoYXIgKmVuZCwKLQkJCSAgIGNvbnN0IEVOQ09ESU5HICplbmMpOwotCi1zdGF0aWMgUFJPTE9HX0hBTkRMRVIKLSAgcHJvbG9nMCwgcHJvbG9nMSwgcHJvbG9nMiwKLSAgZG9jdHlwZTAsIGRvY3R5cGUxLCBkb2N0eXBlMiwgZG9jdHlwZTMsIGRvY3R5cGU0LCBkb2N0eXBlNSwKLSAgaW50ZXJuYWxTdWJzZXQsCi0gIGVudGl0eTAsIGVudGl0eTEsIGVudGl0eTIsIGVudGl0eTMsIGVudGl0eTQsIGVudGl0eTUsIGVudGl0eTYsCi0gIGVudGl0eTcsIGVudGl0eTgsIGVudGl0eTksCi0gIG5vdGF0aW9uMCwgbm90YXRpb24xLCBub3RhdGlvbjIsIG5vdGF0aW9uMywgbm90YXRpb240LAotICBhdHRsaXN0MCwgYXR0bGlzdDEsIGF0dGxpc3QyLCBhdHRsaXN0MywgYXR0bGlzdDQsIGF0dGxpc3Q1LCBhdHRsaXN0NiwKLSAgYXR0bGlzdDcsIGF0dGxpc3Q4LCBhdHRsaXN0OSwKLSAgZWxlbWVudDAsIGVsZW1lbnQxLCBlbGVtZW50MiwgZWxlbWVudDMsIGVsZW1lbnQ0LCBlbGVtZW50NSwgZWxlbWVudDYsCi0gIGVsZW1lbnQ3LAotICBkZWNsQ2xvc2UsCi0gIGVycm9yOwotCi1zdGF0aWMKLWludCBzeW50YXhFcnJvcihQUk9MT0dfU1RBVEUgKik7Ci0KLXN0YXRpYwotaW50IHByb2xvZzAoUFJPTE9HX1NUQVRFICpzdGF0ZSwKLQkgICAgaW50IHRvaywKLQkgICAgY29uc3QgY2hhciAqcHRyLAotCSAgICBjb25zdCBjaGFyICplbmQsCi0JICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCi17Ci0gIHN3aXRjaCAodG9rKSB7Ci0gIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKLSAgICBzdGF0ZS0+aGFuZGxlciA9IHByb2xvZzE7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIGNhc2UgWE1MX1RPS19YTUxfREVDTDoKLSAgICBzdGF0ZS0+aGFuZGxlciA9IHByb2xvZzE7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX1hNTF9ERUNMOwotICBjYXNlIFhNTF9UT0tfUEk6Ci0gICAgc3RhdGUtPmhhbmRsZXIgPSBwcm9sb2cxOwotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfQ09NTUVOVDoKLSAgICBzdGF0ZS0+aGFuZGxlciA9IHByb2xvZzE7Ci0gIGNhc2UgWE1MX1RPS19CT006Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIGNhc2UgWE1MX1RPS19ERUNMX09QRU46Ci0gICAgaWYgKCFYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywKLQkJCSAgICAgcHRyICsgMiAqIE1JTl9CWVRFU19QRVJfQ0hBUihlbmMpLAotCQkJICAgICAiRE9DVFlQRSIpKQotICAgICAgYnJlYWs7Ci0gICAgc3RhdGUtPmhhbmRsZXIgPSBkb2N0eXBlMDsKLSAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKLSAgY2FzZSBYTUxfVE9LX0lOU1RBTkNFX1NUQVJUOgotICAgIHN0YXRlLT5oYW5kbGVyID0gZXJyb3I7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX0lOU1RBTkNFX1NUQVJUOwotICB9Ci0gIHJldHVybiBzeW50YXhFcnJvcihzdGF0ZSk7Ci19Ci0KLXN0YXRpYwotaW50IHByb2xvZzEoUFJPTE9HX1NUQVRFICpzdGF0ZSwKLQkgICAgaW50IHRvaywKLQkgICAgY29uc3QgY2hhciAqcHRyLAotCSAgICBjb25zdCBjaGFyICplbmQsCi0JICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCi17Ci0gIHN3aXRjaCAodG9rKSB7Ci0gIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKLSAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKLSAgY2FzZSBYTUxfVE9LX1BJOgotICBjYXNlIFhNTF9UT0tfQ09NTUVOVDoKLSAgY2FzZSBYTUxfVE9LX0JPTToKLSAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKLSAgY2FzZSBYTUxfVE9LX0RFQ0xfT1BFTjoKLSAgICBpZiAoIVhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLAotCQkJICAgICBwdHIgKyAyICogTUlOX0JZVEVTX1BFUl9DSEFSKGVuYyksCi0JCQkgICAgICJET0NUWVBFIikpCi0gICAgICBicmVhazsKLSAgICBzdGF0ZS0+aGFuZGxlciA9IGRvY3R5cGUwOwotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfSU5TVEFOQ0VfU1RBUlQ6Ci0gICAgc3RhdGUtPmhhbmRsZXIgPSBlcnJvcjsKLSAgICByZXR1cm4gWE1MX1JPTEVfSU5TVEFOQ0VfU1RBUlQ7Ci0gIH0KLSAgcmV0dXJuIHN5bnRheEVycm9yKHN0YXRlKTsKLX0KLQotc3RhdGljCi1pbnQgcHJvbG9nMihQUk9MT0dfU1RBVEUgKnN0YXRlLAotCSAgICBpbnQgdG9rLAotCSAgICBjb25zdCBjaGFyICpwdHIsCi0JICAgIGNvbnN0IGNoYXIgKmVuZCwKLQkgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKLXsKLSAgc3dpdGNoICh0b2spIHsKLSAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfUEk6Ci0gIGNhc2UgWE1MX1RPS19DT01NRU5UOgotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfSU5TVEFOQ0VfU1RBUlQ6Ci0gICAgc3RhdGUtPmhhbmRsZXIgPSBlcnJvcjsKLSAgICByZXR1cm4gWE1MX1JPTEVfSU5TVEFOQ0VfU1RBUlQ7Ci0gIH0KLSAgcmV0dXJuIHN5bnRheEVycm9yKHN0YXRlKTsKLX0KLQotc3RhdGljCi1pbnQgZG9jdHlwZTAoUFJPTE9HX1NUQVRFICpzdGF0ZSwKLQkgICAgIGludCB0b2ssCi0JICAgICBjb25zdCBjaGFyICpwdHIsCi0JICAgICBjb25zdCBjaGFyICplbmQsCi0JICAgICBjb25zdCBFTkNPRElORyAqZW5jKQotewotICBzd2l0Y2ggKHRvaykgewotICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIGNhc2UgWE1MX1RPS19OQU1FOgotICBjYXNlIFhNTF9UT0tfUFJFRklYRURfTkFNRToKLSAgICBzdGF0ZS0+aGFuZGxlciA9IGRvY3R5cGUxOwotICAgIHJldHVybiBYTUxfUk9MRV9ET0NUWVBFX05BTUU7Ci0gIH0KLSAgcmV0dXJuIHN5bnRheEVycm9yKHN0YXRlKTsKLX0KLQotc3RhdGljCi1pbnQgZG9jdHlwZTEoUFJPTE9HX1NUQVRFICpzdGF0ZSwKLQkgICAgIGludCB0b2ssCi0JICAgICBjb25zdCBjaGFyICpwdHIsCi0JICAgICBjb25zdCBjaGFyICplbmQsCi0JICAgICBjb25zdCBFTkNPRElORyAqZW5jKQotewotICBzd2l0Y2ggKHRvaykgewotICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIGNhc2UgWE1MX1RPS19PUEVOX0JSQUNLRVQ6Ci0gICAgc3RhdGUtPmhhbmRsZXIgPSBpbnRlcm5hbFN1YnNldDsKLSAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKLSAgY2FzZSBYTUxfVE9LX0RFQ0xfQ0xPU0U6Ci0gICAgc3RhdGUtPmhhbmRsZXIgPSBwcm9sb2cyOwotICAgIHJldHVybiBYTUxfUk9MRV9ET0NUWVBFX0NMT1NFOwotICBjYXNlIFhNTF9UT0tfTkFNRToKLSAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsIHB0ciwgIlNZU1RFTSIpKSB7Ci0gICAgICBzdGF0ZS0+aGFuZGxlciA9IGRvY3R5cGUzOwotICAgICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gICAgfQotICAgIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywgcHRyLCAiUFVCTElDIikpIHsKLSAgICAgIHN0YXRlLT5oYW5kbGVyID0gZG9jdHlwZTI7Ci0gICAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIHN5bnRheEVycm9yKHN0YXRlKTsKLX0KLQotc3RhdGljCi1pbnQgZG9jdHlwZTIoUFJPTE9HX1NUQVRFICpzdGF0ZSwKLQkgICAgIGludCB0b2ssCi0JICAgICBjb25zdCBjaGFyICpwdHIsCi0JICAgICBjb25zdCBjaGFyICplbmQsCi0JICAgICBjb25zdCBFTkNPRElORyAqZW5jKQotewotICBzd2l0Y2ggKHRvaykgewotICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIGNhc2UgWE1MX1RPS19MSVRFUkFMOgotICAgIHN0YXRlLT5oYW5kbGVyID0gZG9jdHlwZTM7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX0RPQ1RZUEVfUFVCTElDX0lEOwotICB9Ci0gIHJldHVybiBzeW50YXhFcnJvcihzdGF0ZSk7Ci19Ci0KLXN0YXRpYwotaW50IGRvY3R5cGUzKFBST0xPR19TVEFURSAqc3RhdGUsCi0JICAgICBpbnQgdG9rLAotCSAgICAgY29uc3QgY2hhciAqcHRyLAotCSAgICAgY29uc3QgY2hhciAqZW5kLAotCSAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKLXsKLSAgc3dpdGNoICh0b2spIHsKLSAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfTElURVJBTDoKLSAgICBzdGF0ZS0+aGFuZGxlciA9IGRvY3R5cGU0OwotICAgIHJldHVybiBYTUxfUk9MRV9ET0NUWVBFX1NZU1RFTV9JRDsKLSAgfQotICByZXR1cm4gc3ludGF4RXJyb3Ioc3RhdGUpOwotfQotCi1zdGF0aWMKLWludCBkb2N0eXBlNChQUk9MT0dfU1RBVEUgKnN0YXRlLAotCSAgICAgaW50IHRvaywKLQkgICAgIGNvbnN0IGNoYXIgKnB0ciwKLQkgICAgIGNvbnN0IGNoYXIgKmVuZCwKLQkgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCi17Ci0gIHN3aXRjaCAodG9rKSB7Ci0gIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKLSAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKLSAgY2FzZSBYTUxfVE9LX09QRU5fQlJBQ0tFVDoKLSAgICBzdGF0ZS0+aGFuZGxlciA9IGludGVybmFsU3Vic2V0OwotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfREVDTF9DTE9TRToKLSAgICBzdGF0ZS0+aGFuZGxlciA9IHByb2xvZzI7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX0RPQ1RZUEVfQ0xPU0U7Ci0gIH0KLSAgcmV0dXJuIHN5bnRheEVycm9yKHN0YXRlKTsKLX0KLQotc3RhdGljCi1pbnQgZG9jdHlwZTUoUFJPTE9HX1NUQVRFICpzdGF0ZSwKLQkgICAgIGludCB0b2ssCi0JICAgICBjb25zdCBjaGFyICpwdHIsCi0JICAgICBjb25zdCBjaGFyICplbmQsCi0JICAgICBjb25zdCBFTkNPRElORyAqZW5jKQotewotICBzd2l0Y2ggKHRvaykgewotICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIGNhc2UgWE1MX1RPS19ERUNMX0NMT1NFOgotICAgIHN0YXRlLT5oYW5kbGVyID0gcHJvbG9nMjsKLSAgICByZXR1cm4gWE1MX1JPTEVfRE9DVFlQRV9DTE9TRTsKLSAgfQotICByZXR1cm4gc3ludGF4RXJyb3Ioc3RhdGUpOwotfQotCi1zdGF0aWMKLWludCBpbnRlcm5hbFN1YnNldChQUk9MT0dfU1RBVEUgKnN0YXRlLAotCQkgICBpbnQgdG9rLAotCQkgICBjb25zdCBjaGFyICpwdHIsCi0JCSAgIGNvbnN0IGNoYXIgKmVuZCwKLQkJICAgY29uc3QgRU5DT0RJTkcgKmVuYykKLXsKLSAgc3dpdGNoICh0b2spIHsKLSAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfREVDTF9PUEVOOgotICAgIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywKLQkJCSAgICBwdHIgKyAyICogTUlOX0JZVEVTX1BFUl9DSEFSKGVuYyksCi0JCQkgICAgIkVOVElUWSIpKSB7Ci0gICAgICBzdGF0ZS0+aGFuZGxlciA9IGVudGl0eTA7Ci0gICAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKLSAgICB9Ci0gICAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLAotCQkJICAgIHB0ciArIDIgKiBNSU5fQllURVNfUEVSX0NIQVIoZW5jKSwKLQkJCSAgICAiQVRUTElTVCIpKSB7Ci0gICAgICBzdGF0ZS0+aGFuZGxlciA9IGF0dGxpc3QwOwotICAgICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gICAgfQotICAgIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywKLQkJCSAgICBwdHIgKyAyICogTUlOX0JZVEVTX1BFUl9DSEFSKGVuYyksCi0JCQkgICAgIkVMRU1FTlQiKSkgewotICAgICAgc3RhdGUtPmhhbmRsZXIgPSBlbGVtZW50MDsKLSAgICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICAgIH0KLSAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsCi0JCQkgICAgcHRyICsgMiAqIE1JTl9CWVRFU19QRVJfQ0hBUihlbmMpLAotCQkJICAgICJOT1RBVElPTiIpKSB7Ci0gICAgICBzdGF0ZS0+aGFuZGxlciA9IG5vdGF0aW9uMDsKLSAgICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBYTUxfVE9LX1BJOgotICBjYXNlIFhNTF9UT0tfQ09NTUVOVDoKLSAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKLSAgY2FzZSBYTUxfVE9LX1BBUkFNX0VOVElUWV9SRUY6Ci0gICAgcmV0dXJuIFhNTF9ST0xFX1BBUkFNX0VOVElUWV9SRUY7Ci0gIGNhc2UgWE1MX1RPS19DTE9TRV9CUkFDS0VUOgotICAgIHN0YXRlLT5oYW5kbGVyID0gZG9jdHlwZTU7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIH0KLSAgcmV0dXJuIHN5bnRheEVycm9yKHN0YXRlKTsKLX0KLQotc3RhdGljCi1pbnQgZW50aXR5MChQUk9MT0dfU1RBVEUgKnN0YXRlLAotCSAgICBpbnQgdG9rLAotCSAgICBjb25zdCBjaGFyICpwdHIsCi0JICAgIGNvbnN0IGNoYXIgKmVuZCwKLQkgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKLXsKLSAgc3dpdGNoICh0b2spIHsKLSAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfUEVSQ0VOVDoKLSAgICBzdGF0ZS0+aGFuZGxlciA9IGVudGl0eTE7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIGNhc2UgWE1MX1RPS19OQU1FOgotICAgIHN0YXRlLT5oYW5kbGVyID0gZW50aXR5MjsKLSAgICByZXR1cm4gWE1MX1JPTEVfR0VORVJBTF9FTlRJVFlfTkFNRTsKLSAgfQotICByZXR1cm4gc3ludGF4RXJyb3Ioc3RhdGUpOwotfQotCi1zdGF0aWMKLWludCBlbnRpdHkxKFBST0xPR19TVEFURSAqc3RhdGUsCi0JICAgIGludCB0b2ssCi0JICAgIGNvbnN0IGNoYXIgKnB0ciwKLQkgICAgY29uc3QgY2hhciAqZW5kLAotCSAgICBjb25zdCBFTkNPRElORyAqZW5jKQotewotICBzd2l0Y2ggKHRvaykgewotICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIGNhc2UgWE1MX1RPS19OQU1FOgotICAgIHN0YXRlLT5oYW5kbGVyID0gZW50aXR5NzsKLSAgICByZXR1cm4gWE1MX1JPTEVfUEFSQU1fRU5USVRZX05BTUU7Ci0gIH0KLSAgcmV0dXJuIHN5bnRheEVycm9yKHN0YXRlKTsKLX0KLQotc3RhdGljCi1pbnQgZW50aXR5MihQUk9MT0dfU1RBVEUgKnN0YXRlLAotCSAgICBpbnQgdG9rLAotCSAgICBjb25zdCBjaGFyICpwdHIsCi0JICAgIGNvbnN0IGNoYXIgKmVuZCwKLQkgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKLXsKLSAgc3dpdGNoICh0b2spIHsKLSAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfTkFNRToKLSAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsIHB0ciwgIlNZU1RFTSIpKSB7Ci0gICAgICBzdGF0ZS0+aGFuZGxlciA9IGVudGl0eTQ7Ci0gICAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKLSAgICB9Ci0gICAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLCBwdHIsICJQVUJMSUMiKSkgewotICAgICAgc3RhdGUtPmhhbmRsZXIgPSBlbnRpdHkzOwotICAgICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIFhNTF9UT0tfTElURVJBTDoKLSAgICBzdGF0ZS0+aGFuZGxlciA9IGRlY2xDbG9zZTsKLSAgICByZXR1cm4gWE1MX1JPTEVfRU5USVRZX1ZBTFVFOwotICB9Ci0gIHJldHVybiBzeW50YXhFcnJvcihzdGF0ZSk7Ci19Ci0KLXN0YXRpYwotaW50IGVudGl0eTMoUFJPTE9HX1NUQVRFICpzdGF0ZSwKLQkgICAgaW50IHRvaywKLQkgICAgY29uc3QgY2hhciAqcHRyLAotCSAgICBjb25zdCBjaGFyICplbmQsCi0JICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCi17Ci0gIHN3aXRjaCAodG9rKSB7Ci0gIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKLSAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKLSAgY2FzZSBYTUxfVE9LX0xJVEVSQUw6Ci0gICAgc3RhdGUtPmhhbmRsZXIgPSBlbnRpdHk0OwotICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfUFVCTElDX0lEOwotICB9Ci0gIHJldHVybiBzeW50YXhFcnJvcihzdGF0ZSk7Ci19Ci0KLQotc3RhdGljCi1pbnQgZW50aXR5NChQUk9MT0dfU1RBVEUgKnN0YXRlLAotCSAgICBpbnQgdG9rLAotCSAgICBjb25zdCBjaGFyICpwdHIsCi0JICAgIGNvbnN0IGNoYXIgKmVuZCwKLQkgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKLXsKLSAgc3dpdGNoICh0b2spIHsKLSAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfTElURVJBTDoKLSAgICBzdGF0ZS0+aGFuZGxlciA9IGVudGl0eTU7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9TWVNURU1fSUQ7Ci0gIH0KLSAgcmV0dXJuIHN5bnRheEVycm9yKHN0YXRlKTsKLX0KLQotc3RhdGljCi1pbnQgZW50aXR5NShQUk9MT0dfU1RBVEUgKnN0YXRlLAotCSAgICBpbnQgdG9rLAotCSAgICBjb25zdCBjaGFyICpwdHIsCi0JICAgIGNvbnN0IGNoYXIgKmVuZCwKLQkgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKLXsKLSAgc3dpdGNoICh0b2spIHsKLSAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfREVDTF9DTE9TRToKLSAgICBzdGF0ZS0+aGFuZGxlciA9IGludGVybmFsU3Vic2V0OwotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfTkFNRToKLSAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsIHB0ciwgIk5EQVRBIikpIHsKLSAgICAgIHN0YXRlLT5oYW5kbGVyID0gZW50aXR5NjsKLSAgICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotICByZXR1cm4gc3ludGF4RXJyb3Ioc3RhdGUpOwotfQotCi1zdGF0aWMKLWludCBlbnRpdHk2KFBST0xPR19TVEFURSAqc3RhdGUsCi0JICAgIGludCB0b2ssCi0JICAgIGNvbnN0IGNoYXIgKnB0ciwKLQkgICAgY29uc3QgY2hhciAqZW5kLAotCSAgICBjb25zdCBFTkNPRElORyAqZW5jKQotewotICBzd2l0Y2ggKHRvaykgewotICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIGNhc2UgWE1MX1RPS19OQU1FOgotICAgIHN0YXRlLT5oYW5kbGVyID0gZGVjbENsb3NlOwotICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfTk9UQVRJT05fTkFNRTsKLSAgfQotICByZXR1cm4gc3ludGF4RXJyb3Ioc3RhdGUpOwotfQotCi1zdGF0aWMKLWludCBlbnRpdHk3KFBST0xPR19TVEFURSAqc3RhdGUsCi0JICAgIGludCB0b2ssCi0JICAgIGNvbnN0IGNoYXIgKnB0ciwKLQkgICAgY29uc3QgY2hhciAqZW5kLAotCSAgICBjb25zdCBFTkNPRElORyAqZW5jKQotewotICBzd2l0Y2ggKHRvaykgewotICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIGNhc2UgWE1MX1RPS19OQU1FOgotICAgIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywgcHRyLCAiU1lTVEVNIikpIHsKLSAgICAgIHN0YXRlLT5oYW5kbGVyID0gZW50aXR5OTsKLSAgICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICAgIH0KLSAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsIHB0ciwgIlBVQkxJQyIpKSB7Ci0gICAgICBzdGF0ZS0+aGFuZGxlciA9IGVudGl0eTg7Ci0gICAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgWE1MX1RPS19MSVRFUkFMOgotICAgIHN0YXRlLT5oYW5kbGVyID0gZGVjbENsb3NlOwotICAgIHJldHVybiBYTUxfUk9MRV9FTlRJVFlfVkFMVUU7Ci0gIH0KLSAgcmV0dXJuIHN5bnRheEVycm9yKHN0YXRlKTsKLX0KLQotc3RhdGljCi1pbnQgZW50aXR5OChQUk9MT0dfU1RBVEUgKnN0YXRlLAotCSAgICBpbnQgdG9rLAotCSAgICBjb25zdCBjaGFyICpwdHIsCi0JICAgIGNvbnN0IGNoYXIgKmVuZCwKLQkgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKLXsKLSAgc3dpdGNoICh0b2spIHsKLSAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfTElURVJBTDoKLSAgICBzdGF0ZS0+aGFuZGxlciA9IGVudGl0eTk7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX0VOVElUWV9QVUJMSUNfSUQ7Ci0gIH0KLSAgcmV0dXJuIHN5bnRheEVycm9yKHN0YXRlKTsKLX0KLQotc3RhdGljCi1pbnQgZW50aXR5OShQUk9MT0dfU1RBVEUgKnN0YXRlLAotCSAgICBpbnQgdG9rLAotCSAgICBjb25zdCBjaGFyICpwdHIsCi0JICAgIGNvbnN0IGNoYXIgKmVuZCwKLQkgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKLXsKLSAgc3dpdGNoICh0b2spIHsKLSAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfTElURVJBTDoKLSAgICBzdGF0ZS0+aGFuZGxlciA9IGRlY2xDbG9zZTsKLSAgICByZXR1cm4gWE1MX1JPTEVfRU5USVRZX1NZU1RFTV9JRDsKLSAgfQotICByZXR1cm4gc3ludGF4RXJyb3Ioc3RhdGUpOwotfQotCi1zdGF0aWMKLWludCBub3RhdGlvbjAoUFJPTE9HX1NUQVRFICpzdGF0ZSwKLQkgICAgICBpbnQgdG9rLAotCSAgICAgIGNvbnN0IGNoYXIgKnB0ciwKLQkgICAgICBjb25zdCBjaGFyICplbmQsCi0JICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKLXsKLSAgc3dpdGNoICh0b2spIHsKLSAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfTkFNRToKLSAgICBzdGF0ZS0+aGFuZGxlciA9IG5vdGF0aW9uMTsKLSAgICByZXR1cm4gWE1MX1JPTEVfTk9UQVRJT05fTkFNRTsKLSAgfQotICByZXR1cm4gc3ludGF4RXJyb3Ioc3RhdGUpOwotfQotCi1zdGF0aWMKLWludCBub3RhdGlvbjEoUFJPTE9HX1NUQVRFICpzdGF0ZSwKLQkgICAgICBpbnQgdG9rLAotCSAgICAgIGNvbnN0IGNoYXIgKnB0ciwKLQkgICAgICBjb25zdCBjaGFyICplbmQsCi0JICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKLXsKLSAgc3dpdGNoICh0b2spIHsKLSAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfTkFNRToKLSAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsIHB0ciwgIlNZU1RFTSIpKSB7Ci0gICAgICBzdGF0ZS0+aGFuZGxlciA9IG5vdGF0aW9uMzsKLSAgICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICAgIH0KLSAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsIHB0ciwgIlBVQkxJQyIpKSB7Ci0gICAgICBzdGF0ZS0+aGFuZGxlciA9IG5vdGF0aW9uMjsKLSAgICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotICByZXR1cm4gc3ludGF4RXJyb3Ioc3RhdGUpOwotfQotCi1zdGF0aWMKLWludCBub3RhdGlvbjIoUFJPTE9HX1NUQVRFICpzdGF0ZSwKLQkgICAgICBpbnQgdG9rLAotCSAgICAgIGNvbnN0IGNoYXIgKnB0ciwKLQkgICAgICBjb25zdCBjaGFyICplbmQsCi0JICAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKLXsKLSAgc3dpdGNoICh0b2spIHsKLSAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfTElURVJBTDoKLSAgICBzdGF0ZS0+aGFuZGxlciA9IG5vdGF0aW9uNDsKLSAgICByZXR1cm4gWE1MX1JPTEVfTk9UQVRJT05fUFVCTElDX0lEOwotICB9Ci0gIHJldHVybiBzeW50YXhFcnJvcihzdGF0ZSk7Ci19Ci0KLXN0YXRpYwotaW50IG5vdGF0aW9uMyhQUk9MT0dfU1RBVEUgKnN0YXRlLAotCSAgICAgIGludCB0b2ssCi0JICAgICAgY29uc3QgY2hhciAqcHRyLAotCSAgICAgIGNvbnN0IGNoYXIgKmVuZCwKLQkgICAgICBjb25zdCBFTkNPRElORyAqZW5jKQotewotICBzd2l0Y2ggKHRvaykgewotICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIGNhc2UgWE1MX1RPS19MSVRFUkFMOgotICAgIHN0YXRlLT5oYW5kbGVyID0gZGVjbENsb3NlOwotICAgIHJldHVybiBYTUxfUk9MRV9OT1RBVElPTl9TWVNURU1fSUQ7Ci0gIH0KLSAgcmV0dXJuIHN5bnRheEVycm9yKHN0YXRlKTsKLX0KLQotc3RhdGljCi1pbnQgbm90YXRpb240KFBST0xPR19TVEFURSAqc3RhdGUsCi0JICAgICAgaW50IHRvaywKLQkgICAgICBjb25zdCBjaGFyICpwdHIsCi0JICAgICAgY29uc3QgY2hhciAqZW5kLAotCSAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCi17Ci0gIHN3aXRjaCAodG9rKSB7Ci0gIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKLSAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKLSAgY2FzZSBYTUxfVE9LX0xJVEVSQUw6Ci0gICAgc3RhdGUtPmhhbmRsZXIgPSBkZWNsQ2xvc2U7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PVEFUSU9OX1NZU1RFTV9JRDsKLSAgY2FzZSBYTUxfVE9LX0RFQ0xfQ0xPU0U6Ci0gICAgc3RhdGUtPmhhbmRsZXIgPSBpbnRlcm5hbFN1YnNldDsKLSAgICByZXR1cm4gWE1MX1JPTEVfTk9UQVRJT05fTk9fU1lTVEVNX0lEOwotICB9Ci0gIHJldHVybiBzeW50YXhFcnJvcihzdGF0ZSk7Ci19Ci0KLXN0YXRpYwotaW50IGF0dGxpc3QwKFBST0xPR19TVEFURSAqc3RhdGUsCi0JICAgICBpbnQgdG9rLAotCSAgICAgY29uc3QgY2hhciAqcHRyLAotCSAgICAgY29uc3QgY2hhciAqZW5kLAotCSAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKLXsKLSAgc3dpdGNoICh0b2spIHsKLSAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfTkFNRToKLSAgY2FzZSBYTUxfVE9LX1BSRUZJWEVEX05BTUU6Ci0gICAgc3RhdGUtPmhhbmRsZXIgPSBhdHRsaXN0MTsKLSAgICByZXR1cm4gWE1MX1JPTEVfQVRUTElTVF9FTEVNRU5UX05BTUU7Ci0gIH0KLSAgcmV0dXJuIHN5bnRheEVycm9yKHN0YXRlKTsKLX0KLQotc3RhdGljCi1pbnQgYXR0bGlzdDEoUFJPTE9HX1NUQVRFICpzdGF0ZSwKLQkgICAgIGludCB0b2ssCi0JICAgICBjb25zdCBjaGFyICpwdHIsCi0JICAgICBjb25zdCBjaGFyICplbmQsCi0JICAgICBjb25zdCBFTkNPRElORyAqZW5jKQotewotICBzd2l0Y2ggKHRvaykgewotICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIGNhc2UgWE1MX1RPS19ERUNMX0NMT1NFOgotICAgIHN0YXRlLT5oYW5kbGVyID0gaW50ZXJuYWxTdWJzZXQ7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIGNhc2UgWE1MX1RPS19OQU1FOgotICBjYXNlIFhNTF9UT0tfUFJFRklYRURfTkFNRToKLSAgICBzdGF0ZS0+aGFuZGxlciA9IGF0dGxpc3QyOwotICAgIHJldHVybiBYTUxfUk9MRV9BVFRSSUJVVEVfTkFNRTsKLSAgfQotICByZXR1cm4gc3ludGF4RXJyb3Ioc3RhdGUpOwotfQotCi1zdGF0aWMKLWludCBhdHRsaXN0MihQUk9MT0dfU1RBVEUgKnN0YXRlLAotCSAgICAgaW50IHRvaywKLQkgICAgIGNvbnN0IGNoYXIgKnB0ciwKLQkgICAgIGNvbnN0IGNoYXIgKmVuZCwKLQkgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCi17Ci0gIHN3aXRjaCAodG9rKSB7Ci0gIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKLSAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKLSAgY2FzZSBYTUxfVE9LX05BTUU6Ci0gICAgewotICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVzW10gPSB7Ci0JIkNEQVRBIiwKLSAgICAgICAgIklEIiwKLSAgICAgICAgIklEUkVGIiwKLSAgICAgICAgIklEUkVGUyIsCi0gICAgICAgICJFTlRJVFkiLAotICAgICAgICAiRU5USVRJRVMiLAotICAgICAgICAiTk1UT0tFTiIsCi0gICAgICAgICJOTVRPS0VOUyIsCi0gICAgICB9OwotICAgICAgaW50IGk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkoc2l6ZW9mKHR5cGVzKS9zaXplb2YodHlwZXNbMF0pKTsgaSsrKQotCWlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywgcHRyLCB0eXBlc1tpXSkpIHsKLQkgIHN0YXRlLT5oYW5kbGVyID0gYXR0bGlzdDg7Ci0JICByZXR1cm4gWE1MX1JPTEVfQVRUUklCVVRFX1RZUEVfQ0RBVEEgKyBpOwotCX0KLSAgICB9Ci0gICAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLCBwdHIsICJOT1RBVElPTiIpKSB7Ci0gICAgICBzdGF0ZS0+aGFuZGxlciA9IGF0dGxpc3Q1OwotICAgICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIFhNTF9UT0tfT1BFTl9QQVJFTjoKLSAgICBzdGF0ZS0+aGFuZGxlciA9IGF0dGxpc3QzOwotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICB9Ci0gIHJldHVybiBzeW50YXhFcnJvcihzdGF0ZSk7Ci19Ci0KLXN0YXRpYwotaW50IGF0dGxpc3QzKFBST0xPR19TVEFURSAqc3RhdGUsCi0JICAgICBpbnQgdG9rLAotCSAgICAgY29uc3QgY2hhciAqcHRyLAotCSAgICAgY29uc3QgY2hhciAqZW5kLAotCSAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKLXsKLSAgc3dpdGNoICh0b2spIHsKLSAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfTk1UT0tFTjoKLSAgY2FzZSBYTUxfVE9LX05BTUU6Ci0gIGNhc2UgWE1MX1RPS19QUkVGSVhFRF9OQU1FOgotICAgIHN0YXRlLT5oYW5kbGVyID0gYXR0bGlzdDQ7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX0FUVFJJQlVURV9FTlVNX1ZBTFVFOwotICB9Ci0gIHJldHVybiBzeW50YXhFcnJvcihzdGF0ZSk7Ci19Ci0KLXN0YXRpYwotaW50IGF0dGxpc3Q0KFBST0xPR19TVEFURSAqc3RhdGUsCi0JICAgICBpbnQgdG9rLAotCSAgICAgY29uc3QgY2hhciAqcHRyLAotCSAgICAgY29uc3QgY2hhciAqZW5kLAotCSAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKLXsKLSAgc3dpdGNoICh0b2spIHsKLSAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfQ0xPU0VfUEFSRU46Ci0gICAgc3RhdGUtPmhhbmRsZXIgPSBhdHRsaXN0ODsKLSAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKLSAgY2FzZSBYTUxfVE9LX09SOgotICAgIHN0YXRlLT5oYW5kbGVyID0gYXR0bGlzdDM7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIH0KLSAgcmV0dXJuIHN5bnRheEVycm9yKHN0YXRlKTsKLX0KLQotc3RhdGljCi1pbnQgYXR0bGlzdDUoUFJPTE9HX1NUQVRFICpzdGF0ZSwKLQkgICAgIGludCB0b2ssCi0JICAgICBjb25zdCBjaGFyICpwdHIsCi0JICAgICBjb25zdCBjaGFyICplbmQsCi0JICAgICBjb25zdCBFTkNPRElORyAqZW5jKQotewotICBzd2l0Y2ggKHRvaykgewotICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIGNhc2UgWE1MX1RPS19PUEVOX1BBUkVOOgotICAgIHN0YXRlLT5oYW5kbGVyID0gYXR0bGlzdDY7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIH0KLSAgcmV0dXJuIHN5bnRheEVycm9yKHN0YXRlKTsKLX0KLQotCi1zdGF0aWMKLWludCBhdHRsaXN0NihQUk9MT0dfU1RBVEUgKnN0YXRlLAotCSAgICAgaW50IHRvaywKLQkgICAgIGNvbnN0IGNoYXIgKnB0ciwKLQkgICAgIGNvbnN0IGNoYXIgKmVuZCwKLQkgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCi17Ci0gIHN3aXRjaCAodG9rKSB7Ci0gIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKLSAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKLSAgY2FzZSBYTUxfVE9LX05BTUU6Ci0gICAgc3RhdGUtPmhhbmRsZXIgPSBhdHRsaXN0NzsKLSAgICByZXR1cm4gWE1MX1JPTEVfQVRUUklCVVRFX05PVEFUSU9OX1ZBTFVFOwotICB9Ci0gIHJldHVybiBzeW50YXhFcnJvcihzdGF0ZSk7Ci19Ci0KLXN0YXRpYwotaW50IGF0dGxpc3Q3KFBST0xPR19TVEFURSAqc3RhdGUsCi0JICAgICBpbnQgdG9rLAotCSAgICAgY29uc3QgY2hhciAqcHRyLAotCSAgICAgY29uc3QgY2hhciAqZW5kLAotCSAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKLXsKLSAgc3dpdGNoICh0b2spIHsKLSAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfQ0xPU0VfUEFSRU46Ci0gICAgc3RhdGUtPmhhbmRsZXIgPSBhdHRsaXN0ODsKLSAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKLSAgY2FzZSBYTUxfVE9LX09SOgotICAgIHN0YXRlLT5oYW5kbGVyID0gYXR0bGlzdDY7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIH0KLSAgcmV0dXJuIHN5bnRheEVycm9yKHN0YXRlKTsKLX0KLQotLyogZGVmYXVsdCB2YWx1ZSAqLwotc3RhdGljCi1pbnQgYXR0bGlzdDgoUFJPTE9HX1NUQVRFICpzdGF0ZSwKLQkgICAgIGludCB0b2ssCi0JICAgICBjb25zdCBjaGFyICpwdHIsCi0JICAgICBjb25zdCBjaGFyICplbmQsCi0JICAgICBjb25zdCBFTkNPRElORyAqZW5jKQotewotICBzd2l0Y2ggKHRvaykgewotICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIGNhc2UgWE1MX1RPS19QT1VORF9OQU1FOgotICAgIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywKLQkJCSAgICBwdHIgKyBNSU5fQllURVNfUEVSX0NIQVIoZW5jKSwKLQkJCSAgICAiSU1QTElFRCIpKSB7Ci0gICAgICBzdGF0ZS0+aGFuZGxlciA9IGF0dGxpc3QxOwotICAgICAgcmV0dXJuIFhNTF9ST0xFX0lNUExJRURfQVRUUklCVVRFX1ZBTFVFOwotICAgIH0KLSAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsCi0JCQkgICAgcHRyICsgTUlOX0JZVEVTX1BFUl9DSEFSKGVuYyksCi0JCQkgICAgIlJFUVVJUkVEIikpIHsKLSAgICAgIHN0YXRlLT5oYW5kbGVyID0gYXR0bGlzdDE7Ci0gICAgICByZXR1cm4gWE1MX1JPTEVfUkVRVUlSRURfQVRUUklCVVRFX1ZBTFVFOwotICAgIH0KLSAgICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsCi0JCQkgICAgcHRyICsgTUlOX0JZVEVTX1BFUl9DSEFSKGVuYyksCi0JCQkgICAgIkZJWEVEIikpIHsKLSAgICAgIHN0YXRlLT5oYW5kbGVyID0gYXR0bGlzdDk7Ci0gICAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgWE1MX1RPS19MSVRFUkFMOgotICAgIHN0YXRlLT5oYW5kbGVyID0gYXR0bGlzdDE7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX0RFRkFVTFRfQVRUUklCVVRFX1ZBTFVFOwotICB9Ci0gIHJldHVybiBzeW50YXhFcnJvcihzdGF0ZSk7Ci19Ci0KLXN0YXRpYwotaW50IGF0dGxpc3Q5KFBST0xPR19TVEFURSAqc3RhdGUsCi0JICAgICBpbnQgdG9rLAotCSAgICAgY29uc3QgY2hhciAqcHRyLAotCSAgICAgY29uc3QgY2hhciAqZW5kLAotCSAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKLXsKLSAgc3dpdGNoICh0b2spIHsKLSAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfTElURVJBTDoKLSAgICBzdGF0ZS0+aGFuZGxlciA9IGF0dGxpc3QxOwotICAgIHJldHVybiBYTUxfUk9MRV9GSVhFRF9BVFRSSUJVVEVfVkFMVUU7Ci0gIH0KLSAgcmV0dXJuIHN5bnRheEVycm9yKHN0YXRlKTsKLX0KLQotc3RhdGljCi1pbnQgZWxlbWVudDAoUFJPTE9HX1NUQVRFICpzdGF0ZSwKLQkgICAgIGludCB0b2ssCi0JICAgICBjb25zdCBjaGFyICpwdHIsCi0JICAgICBjb25zdCBjaGFyICplbmQsCi0JICAgICBjb25zdCBFTkNPRElORyAqZW5jKQotewotICBzd2l0Y2ggKHRvaykgewotICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIGNhc2UgWE1MX1RPS19OQU1FOgotICBjYXNlIFhNTF9UT0tfUFJFRklYRURfTkFNRToKLSAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQxOwotICAgIHJldHVybiBYTUxfUk9MRV9FTEVNRU5UX05BTUU7Ci0gIH0KLSAgcmV0dXJuIHN5bnRheEVycm9yKHN0YXRlKTsKLX0KLQotc3RhdGljCi1pbnQgZWxlbWVudDEoUFJPTE9HX1NUQVRFICpzdGF0ZSwKLQkgICAgIGludCB0b2ssCi0JICAgICBjb25zdCBjaGFyICpwdHIsCi0JICAgICBjb25zdCBjaGFyICplbmQsCi0JICAgICBjb25zdCBFTkNPRElORyAqZW5jKQotewotICBzd2l0Y2ggKHRvaykgewotICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIGNhc2UgWE1MX1RPS19OQU1FOgotICAgIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywgcHRyLCAiRU1QVFkiKSkgewotICAgICAgc3RhdGUtPmhhbmRsZXIgPSBkZWNsQ2xvc2U7Ci0gICAgICByZXR1cm4gWE1MX1JPTEVfQ09OVEVOVF9FTVBUWTsKLSAgICB9Ci0gICAgaWYgKFhtbE5hbWVNYXRjaGVzQXNjaWkoZW5jLCBwdHIsICJBTlkiKSkgewotICAgICAgc3RhdGUtPmhhbmRsZXIgPSBkZWNsQ2xvc2U7Ci0gICAgICByZXR1cm4gWE1MX1JPTEVfQ09OVEVOVF9BTlk7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIFhNTF9UT0tfT1BFTl9QQVJFTjoKLSAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQyOwotICAgIHN0YXRlLT5sZXZlbCA9IDE7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX0dST1VQX09QRU47Ci0gIH0KLSAgcmV0dXJuIHN5bnRheEVycm9yKHN0YXRlKTsKLX0KLQotc3RhdGljCi1pbnQgZWxlbWVudDIoUFJPTE9HX1NUQVRFICpzdGF0ZSwKLQkgICAgIGludCB0b2ssCi0JICAgICBjb25zdCBjaGFyICpwdHIsCi0JICAgICBjb25zdCBjaGFyICplbmQsCi0JICAgICBjb25zdCBFTkNPRElORyAqZW5jKQotewotICBzd2l0Y2ggKHRvaykgewotICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIGNhc2UgWE1MX1RPS19QT1VORF9OQU1FOgotICAgIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywKLQkJCSAgICBwdHIgKyBNSU5fQllURVNfUEVSX0NIQVIoZW5jKSwKLQkJCSAgICAiUENEQVRBIikpIHsKLSAgICAgIHN0YXRlLT5oYW5kbGVyID0gZWxlbWVudDM7Ci0gICAgICByZXR1cm4gWE1MX1JPTEVfQ09OVEVOVF9QQ0RBVEE7Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIFhNTF9UT0tfT1BFTl9QQVJFTjoKLSAgICBzdGF0ZS0+bGV2ZWwgPSAyOwotICAgIHN0YXRlLT5oYW5kbGVyID0gZWxlbWVudDY7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX0dST1VQX09QRU47Ci0gIGNhc2UgWE1MX1RPS19OQU1FOgotICBjYXNlIFhNTF9UT0tfUFJFRklYRURfTkFNRToKLSAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQ3OwotICAgIHJldHVybiBYTUxfUk9MRV9DT05URU5UX0VMRU1FTlQ7Ci0gIGNhc2UgWE1MX1RPS19OQU1FX1FVRVNUSU9OOgotICAgIHN0YXRlLT5oYW5kbGVyID0gZWxlbWVudDc7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX0NPTlRFTlRfRUxFTUVOVF9PUFQ7Ci0gIGNhc2UgWE1MX1RPS19OQU1FX0FTVEVSSVNLOgotICAgIHN0YXRlLT5oYW5kbGVyID0gZWxlbWVudDc7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX0NPTlRFTlRfRUxFTUVOVF9SRVA7Ci0gIGNhc2UgWE1MX1RPS19OQU1FX1BMVVM6Ci0gICAgc3RhdGUtPmhhbmRsZXIgPSBlbGVtZW50NzsKLSAgICByZXR1cm4gWE1MX1JPTEVfQ09OVEVOVF9FTEVNRU5UX1BMVVM7Ci0gIH0KLSAgcmV0dXJuIHN5bnRheEVycm9yKHN0YXRlKTsKLX0KLQotc3RhdGljCi1pbnQgZWxlbWVudDMoUFJPTE9HX1NUQVRFICpzdGF0ZSwKLQkgICAgIGludCB0b2ssCi0JICAgICBjb25zdCBjaGFyICpwdHIsCi0JICAgICBjb25zdCBjaGFyICplbmQsCi0JICAgICBjb25zdCBFTkNPRElORyAqZW5jKQotewotICBzd2l0Y2ggKHRvaykgewotICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIGNhc2UgWE1MX1RPS19DTE9TRV9QQVJFTjoKLSAgY2FzZSBYTUxfVE9LX0NMT1NFX1BBUkVOX0FTVEVSSVNLOgotICAgIHN0YXRlLT5oYW5kbGVyID0gZGVjbENsb3NlOwotICAgIHJldHVybiBYTUxfUk9MRV9HUk9VUF9DTE9TRV9SRVA7Ci0gIGNhc2UgWE1MX1RPS19PUjoKLSAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQ0OwotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICB9Ci0gIHJldHVybiBzeW50YXhFcnJvcihzdGF0ZSk7Ci19Ci0KLXN0YXRpYwotaW50IGVsZW1lbnQ0KFBST0xPR19TVEFURSAqc3RhdGUsCi0JICAgICBpbnQgdG9rLAotCSAgICAgY29uc3QgY2hhciAqcHRyLAotCSAgICAgY29uc3QgY2hhciAqZW5kLAotCSAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKLXsKLSAgc3dpdGNoICh0b2spIHsKLSAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfTkFNRToKLSAgY2FzZSBYTUxfVE9LX1BSRUZJWEVEX05BTUU6Ci0gICAgc3RhdGUtPmhhbmRsZXIgPSBlbGVtZW50NTsKLSAgICByZXR1cm4gWE1MX1JPTEVfQ09OVEVOVF9FTEVNRU5UOwotICB9Ci0gIHJldHVybiBzeW50YXhFcnJvcihzdGF0ZSk7Ci19Ci0KLXN0YXRpYwotaW50IGVsZW1lbnQ1KFBST0xPR19TVEFURSAqc3RhdGUsCi0JICAgICBpbnQgdG9rLAotCSAgICAgY29uc3QgY2hhciAqcHRyLAotCSAgICAgY29uc3QgY2hhciAqZW5kLAotCSAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKLXsKLSAgc3dpdGNoICh0b2spIHsKLSAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfQ0xPU0VfUEFSRU5fQVNURVJJU0s6Ci0gICAgc3RhdGUtPmhhbmRsZXIgPSBkZWNsQ2xvc2U7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX0dST1VQX0NMT1NFX1JFUDsKLSAgY2FzZSBYTUxfVE9LX09SOgotICAgIHN0YXRlLT5oYW5kbGVyID0gZWxlbWVudDQ7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIH0KLSAgcmV0dXJuIHN5bnRheEVycm9yKHN0YXRlKTsKLX0KLQotc3RhdGljCi1pbnQgZWxlbWVudDYoUFJPTE9HX1NUQVRFICpzdGF0ZSwKLQkgICAgIGludCB0b2ssCi0JICAgICBjb25zdCBjaGFyICpwdHIsCi0JICAgICBjb25zdCBjaGFyICplbmQsCi0JICAgICBjb25zdCBFTkNPRElORyAqZW5jKQotewotICBzd2l0Y2ggKHRvaykgewotICBjYXNlIFhNTF9UT0tfUFJPTE9HX1M6Ci0gICAgcmV0dXJuIFhNTF9ST0xFX05PTkU7Ci0gIGNhc2UgWE1MX1RPS19PUEVOX1BBUkVOOgotICAgIHN0YXRlLT5sZXZlbCArPSAxOwotICAgIHJldHVybiBYTUxfUk9MRV9HUk9VUF9PUEVOOwotICBjYXNlIFhNTF9UT0tfTkFNRToKLSAgY2FzZSBYTUxfVE9LX1BSRUZJWEVEX05BTUU6Ci0gICAgc3RhdGUtPmhhbmRsZXIgPSBlbGVtZW50NzsKLSAgICByZXR1cm4gWE1MX1JPTEVfQ09OVEVOVF9FTEVNRU5UOwotICBjYXNlIFhNTF9UT0tfTkFNRV9RVUVTVElPTjoKLSAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQ3OwotICAgIHJldHVybiBYTUxfUk9MRV9DT05URU5UX0VMRU1FTlRfT1BUOwotICBjYXNlIFhNTF9UT0tfTkFNRV9BU1RFUklTSzoKLSAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQ3OwotICAgIHJldHVybiBYTUxfUk9MRV9DT05URU5UX0VMRU1FTlRfUkVQOwotICBjYXNlIFhNTF9UT0tfTkFNRV9QTFVTOgotICAgIHN0YXRlLT5oYW5kbGVyID0gZWxlbWVudDc7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX0NPTlRFTlRfRUxFTUVOVF9QTFVTOwotICB9Ci0gIHJldHVybiBzeW50YXhFcnJvcihzdGF0ZSk7Ci19Ci0KLXN0YXRpYwotaW50IGVsZW1lbnQ3KFBST0xPR19TVEFURSAqc3RhdGUsCi0JICAgICBpbnQgdG9rLAotCSAgICAgY29uc3QgY2hhciAqcHRyLAotCSAgICAgY29uc3QgY2hhciAqZW5kLAotCSAgICAgY29uc3QgRU5DT0RJTkcgKmVuYykKLXsKLSAgc3dpdGNoICh0b2spIHsKLSAgY2FzZSBYTUxfVE9LX1BST0xPR19TOgotICAgIHJldHVybiBYTUxfUk9MRV9OT05FOwotICBjYXNlIFhNTF9UT0tfQ0xPU0VfUEFSRU46Ci0gICAgc3RhdGUtPmxldmVsIC09IDE7Ci0gICAgaWYgKHN0YXRlLT5sZXZlbCA9PSAwKQotICAgICAgc3RhdGUtPmhhbmRsZXIgPSBkZWNsQ2xvc2U7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX0dST1VQX0NMT1NFOwotICBjYXNlIFhNTF9UT0tfQ0xPU0VfUEFSRU5fQVNURVJJU0s6Ci0gICAgc3RhdGUtPmxldmVsIC09IDE7Ci0gICAgaWYgKHN0YXRlLT5sZXZlbCA9PSAwKQotICAgICAgc3RhdGUtPmhhbmRsZXIgPSBkZWNsQ2xvc2U7Ci0gICAgcmV0dXJuIFhNTF9ST0xFX0dST1VQX0NMT1NFX1JFUDsKLSAgY2FzZSBYTUxfVE9LX0NMT1NFX1BBUkVOX1FVRVNUSU9OOgotICAgIHN0YXRlLT5sZXZlbCAtPSAxOwotICAgIGlmIChzdGF0ZS0+bGV2ZWwgPT0gMCkKLSAgICAgIHN0YXRlLT5oYW5kbGVyID0gZGVjbENsb3NlOwotICAgIHJldHVybiBYTUxfUk9MRV9HUk9VUF9DTE9TRV9PUFQ7Ci0gIGNhc2UgWE1MX1RPS19DTE9TRV9QQVJFTl9QTFVTOgotICAgIHN0YXRlLT5sZXZlbCAtPSAxOwotICAgIGlmIChzdGF0ZS0+bGV2ZWwgPT0gMCkKLSAgICAgIHN0YXRlLT5oYW5kbGVyID0gZGVjbENsb3NlOwotICAgIHJldHVybiBYTUxfUk9MRV9HUk9VUF9DTE9TRV9QTFVTOwotICBjYXNlIFhNTF9UT0tfQ09NTUE6Ci0gICAgc3RhdGUtPmhhbmRsZXIgPSBlbGVtZW50NjsKLSAgICByZXR1cm4gWE1MX1JPTEVfR1JPVVBfU0VRVUVOQ0U7Ci0gIGNhc2UgWE1MX1RPS19PUjoKLSAgICBzdGF0ZS0+aGFuZGxlciA9IGVsZW1lbnQ2OwotICAgIHJldHVybiBYTUxfUk9MRV9HUk9VUF9DSE9JQ0U7Ci0gIH0KLSAgcmV0dXJuIHN5bnRheEVycm9yKHN0YXRlKTsKLX0KLQotc3RhdGljCi1pbnQgZGVjbENsb3NlKFBST0xPR19TVEFURSAqc3RhdGUsCi0JICAgICAgaW50IHRvaywKLQkgICAgICBjb25zdCBjaGFyICpwdHIsCi0JICAgICAgY29uc3QgY2hhciAqZW5kLAotCSAgICAgIGNvbnN0IEVOQ09ESU5HICplbmMpCi17Ci0gIHN3aXRjaCAodG9rKSB7Ci0gIGNhc2UgWE1MX1RPS19QUk9MT0dfUzoKLSAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKLSAgY2FzZSBYTUxfVE9LX0RFQ0xfQ0xPU0U6Ci0gICAgc3RhdGUtPmhhbmRsZXIgPSBpbnRlcm5hbFN1YnNldDsKLSAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKLSAgfQotICByZXR1cm4gc3ludGF4RXJyb3Ioc3RhdGUpOwotfQotCi0jaWYgMAotCi1zdGF0aWMKLWludCBpZ25vcmUoUFJPTE9HX1NUQVRFICpzdGF0ZSwKLQkgICBpbnQgdG9rLAotCSAgIGNvbnN0IGNoYXIgKnB0ciwKLQkgICBjb25zdCBjaGFyICplbmQsCi0JICAgY29uc3QgRU5DT0RJTkcgKmVuYykKLXsKLSAgc3dpdGNoICh0b2spIHsKLSAgY2FzZSBYTUxfVE9LX0RFQ0xfQ0xPU0U6Ci0gICAgc3RhdGUtPmhhbmRsZXIgPSBpbnRlcm5hbFN1YnNldDsKLSAgICByZXR1cm4gMDsKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gWE1MX1JPTEVfTk9ORTsKLSAgfQotICByZXR1cm4gc3ludGF4RXJyb3Ioc3RhdGUpOwotfQotI2VuZGlmCi0KLXN0YXRpYwotaW50IGVycm9yKFBST0xPR19TVEFURSAqc3RhdGUsCi0JICAgaW50IHRvaywKLQkgICBjb25zdCBjaGFyICpwdHIsCi0JICAgY29uc3QgY2hhciAqZW5kLAotCSAgIGNvbnN0IEVOQ09ESU5HICplbmMpCi17Ci0gIHJldHVybiBYTUxfUk9MRV9OT05FOwotfQotCi1zdGF0aWMKLWludCBzeW50YXhFcnJvcihQUk9MT0dfU1RBVEUgKnN0YXRlKQotewotICBzdGF0ZS0+aGFuZGxlciA9IGVycm9yOwotICByZXR1cm4gWE1MX1JPTEVfRVJST1I7Ci19Ci0KLXZvaWQgWG1sUHJvbG9nU3RhdGVJbml0KFBST0xPR19TVEFURSAqc3RhdGUpCi17Ci0gIHN0YXRlLT5oYW5kbGVyID0gcHJvbG9nMDsKLX0KZGlmZiAtLWdpdCBhL3NyY2xpYi9leHBhdC1saXRlL3htbHJvbGUuaCBiL3NyY2xpYi9leHBhdC1saXRlL3htbHJvbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc3YzQwYi4uMDAwMDAwMAotLS0gYS9zcmNsaWIvZXhwYXQtbGl0ZS94bWxyb2xlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLVRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UKLVZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4KLWNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KLQotU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIgotYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLUxpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLVRoZSBPcmlnaW5hbCBDb2RlIGlzIGV4cGF0LgotCi1UaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgSmFtZXMgQ2xhcmsuCi1Qb3J0aW9ucyBjcmVhdGVkIGJ5IEphbWVzIENsYXJrIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkKLUphbWVzIENsYXJrLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1Db250cmlidXRvcihzKToKLQotQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMKLW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAodGhlICJHUEwiKSwgaW4gd2hpY2ggY2FzZSB0aGUKLXByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRob3NlIGFib3ZlLiAgSWYgeW91Ci13aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCi10aGUgTVBMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZAotcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUKLUdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UKLXlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4KLSovCi0KLSNpZm5kZWYgWG1sUm9sZV9JTkNMVURFRAotI2RlZmluZSBYbWxSb2xlX0lOQ0xVREVEIDEKLQotI2luY2x1ZGUgInhtbHRvay5oIgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLWVudW0gewotICBYTUxfUk9MRV9FUlJPUiA9IC0xLAotICBYTUxfUk9MRV9OT05FID0gMCwKLSAgWE1MX1JPTEVfWE1MX0RFQ0wsCi0gIFhNTF9ST0xFX0lOU1RBTkNFX1NUQVJULAotICBYTUxfUk9MRV9ET0NUWVBFX05BTUUsCi0gIFhNTF9ST0xFX0RPQ1RZUEVfU1lTVEVNX0lELAotICBYTUxfUk9MRV9ET0NUWVBFX1BVQkxJQ19JRCwKLSAgWE1MX1JPTEVfRE9DVFlQRV9DTE9TRSwKLSAgWE1MX1JPTEVfR0VORVJBTF9FTlRJVFlfTkFNRSwKLSAgWE1MX1JPTEVfUEFSQU1fRU5USVRZX05BTUUsCi0gIFhNTF9ST0xFX0VOVElUWV9WQUxVRSwKLSAgWE1MX1JPTEVfRU5USVRZX1NZU1RFTV9JRCwKLSAgWE1MX1JPTEVfRU5USVRZX1BVQkxJQ19JRCwKLSAgWE1MX1JPTEVfRU5USVRZX05PVEFUSU9OX05BTUUsCi0gIFhNTF9ST0xFX05PVEFUSU9OX05BTUUsCi0gIFhNTF9ST0xFX05PVEFUSU9OX1NZU1RFTV9JRCwKLSAgWE1MX1JPTEVfTk9UQVRJT05fTk9fU1lTVEVNX0lELAotICBYTUxfUk9MRV9OT1RBVElPTl9QVUJMSUNfSUQsCi0gIFhNTF9ST0xFX0FUVFJJQlVURV9OQU1FLAotICBYTUxfUk9MRV9BVFRSSUJVVEVfVFlQRV9DREFUQSwKLSAgWE1MX1JPTEVfQVRUUklCVVRFX1RZUEVfSUQsCi0gIFhNTF9ST0xFX0FUVFJJQlVURV9UWVBFX0lEUkVGLAotICBYTUxfUk9MRV9BVFRSSUJVVEVfVFlQRV9JRFJFRlMsCi0gIFhNTF9ST0xFX0FUVFJJQlVURV9UWVBFX0VOVElUWSwKLSAgWE1MX1JPTEVfQVRUUklCVVRFX1RZUEVfRU5USVRJRVMsCi0gIFhNTF9ST0xFX0FUVFJJQlVURV9UWVBFX05NVE9LRU4sCi0gIFhNTF9ST0xFX0FUVFJJQlVURV9UWVBFX05NVE9LRU5TLAotICBYTUxfUk9MRV9BVFRSSUJVVEVfRU5VTV9WQUxVRSwKLSAgWE1MX1JPTEVfQVRUUklCVVRFX05PVEFUSU9OX1ZBTFVFLAotICBYTUxfUk9MRV9BVFRMSVNUX0VMRU1FTlRfTkFNRSwKLSAgWE1MX1JPTEVfSU1QTElFRF9BVFRSSUJVVEVfVkFMVUUsCi0gIFhNTF9ST0xFX1JFUVVJUkVEX0FUVFJJQlVURV9WQUxVRSwKLSAgWE1MX1JPTEVfREVGQVVMVF9BVFRSSUJVVEVfVkFMVUUsCi0gIFhNTF9ST0xFX0ZJWEVEX0FUVFJJQlVURV9WQUxVRSwKLSAgWE1MX1JPTEVfRUxFTUVOVF9OQU1FLAotICBYTUxfUk9MRV9DT05URU5UX0FOWSwKLSAgWE1MX1JPTEVfQ09OVEVOVF9FTVBUWSwKLSAgWE1MX1JPTEVfQ09OVEVOVF9QQ0RBVEEsCi0gIFhNTF9ST0xFX0dST1VQX09QRU4sCi0gIFhNTF9ST0xFX0dST1VQX0NMT1NFLAotICBYTUxfUk9MRV9HUk9VUF9DTE9TRV9SRVAsCi0gIFhNTF9ST0xFX0dST1VQX0NMT1NFX09QVCwKLSAgWE1MX1JPTEVfR1JPVVBfQ0xPU0VfUExVUywKLSAgWE1MX1JPTEVfR1JPVVBfQ0hPSUNFLAotICBYTUxfUk9MRV9HUk9VUF9TRVFVRU5DRSwKLSAgWE1MX1JPTEVfQ09OVEVOVF9FTEVNRU5ULAotICBYTUxfUk9MRV9DT05URU5UX0VMRU1FTlRfUkVQLAotICBYTUxfUk9MRV9DT05URU5UX0VMRU1FTlRfT1BULAotICBYTUxfUk9MRV9DT05URU5UX0VMRU1FTlRfUExVUywKLSAgWE1MX1JPTEVfUEFSQU1fRU5USVRZX1JFRgotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgcHJvbG9nX3N0YXRlIHsKLSAgaW50ICgqaGFuZGxlcikoc3RydWN0IHByb2xvZ19zdGF0ZSAqc3RhdGUsCi0JICAgICAgICAgaW50IHRvaywKLQkJIGNvbnN0IGNoYXIgKnB0ciwKLQkJIGNvbnN0IGNoYXIgKmVuZCwKLQkJIGNvbnN0IEVOQ09ESU5HICplbmMpOwotICB1bnNpZ25lZCBsZXZlbDsKLX0gUFJPTE9HX1NUQVRFOwotCi12b2lkIFhNTFRPS0FQSSBYbWxQcm9sb2dTdGF0ZUluaXQoUFJPTE9HX1NUQVRFICopOwotCi0jZGVmaW5lIFhtbFRva2VuUm9sZShzdGF0ZSwgdG9rLCBwdHIsIGVuZCwgZW5jKSBcCi0gKCgoc3RhdGUpLT5oYW5kbGVyKShzdGF0ZSwgdG9rLCBwdHIsIGVuZCwgZW5jKSkKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIG5vdCBYbWxSb2xlX0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9zcmNsaWIvZXhwYXQtbGl0ZS94bWx0b2suYyBiL3NyY2xpYi9leHBhdC1saXRlL3htbHRvay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODQ3ZDAxLi4wMDAwMDAwCi0tLSBhL3NyY2xpYi9leHBhdC1saXRlL3htbHRvay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUyNyArMCwwIEBACi0vKgotVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZQotVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbgotY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLWh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwotCi1Tb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiCi1iYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLQotVGhlIE9yaWdpbmFsIENvZGUgaXMgZXhwYXQuCi0KLVRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBKYW1lcyBDbGFyay4KLVBvcnRpb25zIGNyZWF0ZWQgYnkgSmFtZXMgQ2xhcmsgYXJlIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OQotSmFtZXMgQ2xhcmsuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLUNvbnRyaWJ1dG9yKHMpOgotCi1BbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcwotb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICh0aGUgIkdQTCIpLCBpbiB3aGljaCBjYXNlIHRoZQotcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhvc2UgYWJvdmUuICBJZiB5b3UKLXdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seSB1bmRlciB0aGUgdGVybXMgb2YKLXRoZSBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKLXRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kCi1yZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZQotR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZQoteW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgR1BMLgotKi8KLQotI2luY2x1ZGUgInhtbGRlZi5oIgotI2luY2x1ZGUgInhtbHRvay5oIgotI2luY2x1ZGUgIm5hbWV0YWIuaCIKLQotI2RlZmluZSBWVEFCTEUxIFwKLSAgeyBQUkVGSVgocHJvbG9nVG9rKSwgUFJFRklYKGNvbnRlbnRUb2spLCBQUkVGSVgoY2RhdGFTZWN0aW9uVG9rKSB9LCBcCi0gIHsgUFJFRklYKGF0dHJpYnV0ZVZhbHVlVG9rKSwgUFJFRklYKGVudGl0eVZhbHVlVG9rKSB9LCBcCi0gIFBSRUZJWChzYW1lTmFtZSksIFwKLSAgUFJFRklYKG5hbWVNYXRjaGVzQXNjaWkpLCBcCi0gIFBSRUZJWChuYW1lTGVuZ3RoKSwgXAotICBQUkVGSVgoc2tpcFMpLCBcCi0gIFBSRUZJWChnZXRBdHRzKSwgXAotICBQUkVGSVgoY2hhclJlZk51bWJlciksIFwKLSAgUFJFRklYKHByZWRlZmluZWRFbnRpdHlOYW1lKSwgXAotICBQUkVGSVgodXBkYXRlUG9zaXRpb24pLCBcCi0gIFBSRUZJWChpc1B1YmxpY0lkKQotCi0jZGVmaW5lIFZUQUJMRSBWVEFCTEUxLCBQUkVGSVgodG9VdGY4KSwgUFJFRklYKHRvVXRmMTYpCi0KLSNkZWZpbmUgVUNTMl9HRVRfTkFNSU5HKHBhZ2VzLCBoaSwgbG8pIFwKLSAgIChuYW1pbmdCaXRtYXBbKHBhZ2VzW2hpXSA8PCAzKSArICgobG8pID4+IDUpXSAmICgxIDw8ICgobG8pICYgMHgxRikpKQotCi0vKiBBIDIgYnl0ZSBVVEYtOCByZXByZXNlbnRhdGlvbiBzcGxpdHMgdGhlIGNoYXJhY3RlcnMgMTEgYml0cwotYmV0d2VlbiB0aGUgYm90dG9tIDUgYW5kIDYgYml0cyBvZiB0aGUgYnl0ZXMuCi1XZSBuZWVkIDggYml0cyB0byBpbmRleCBpbnRvIHBhZ2VzLCAzIGJpdHMgdG8gYWRkIHRvIHRoYXQgaW5kZXggYW5kCi01IGJpdHMgdG8gZ2VuZXJhdGUgdGhlIG1hc2suICovCi0jZGVmaW5lIFVURjhfR0VUX05BTUlORzIocGFnZXMsIGJ5dGUpIFwKLSAgICAobmFtaW5nQml0bWFwWygocGFnZXMpWygoKGJ5dGUpWzBdKSA+PiAyKSAmIDddIDw8IDMpIFwKLSAgICAgICAgICAgICAgICAgICAgICArICgoKChieXRlKVswXSkgJiAzKSA8PCAxKSBcCi0gICAgICAgICAgICAgICAgICAgICAgKyAoKCgoYnl0ZSlbMV0pID4+IDUpICYgMSldIFwKLSAgICAgICAgICYgKDEgPDwgKCgoYnl0ZSlbMV0pICYgMHgxRikpKQotCi0vKiBBIDMgYnl0ZSBVVEYtOCByZXByZXNlbnRhdGlvbiBzcGxpdHMgdGhlIGNoYXJhY3RlcnMgMTYgYml0cwotYmV0d2VlbiB0aGUgYm90dG9tIDQsIDYgYW5kIDYgYml0cyBvZiB0aGUgYnl0ZXMuCi1XZSBuZWVkIDggYml0cyB0byBpbmRleCBpbnRvIHBhZ2VzLCAzIGJpdHMgdG8gYWRkIHRvIHRoYXQgaW5kZXggYW5kCi01IGJpdHMgdG8gZ2VuZXJhdGUgdGhlIG1hc2suICovCi0jZGVmaW5lIFVURjhfR0VUX05BTUlORzMocGFnZXMsIGJ5dGUpIFwKLSAgKG5hbWluZ0JpdG1hcFsoKHBhZ2VzKVsoKCgoYnl0ZSlbMF0pICYgMHhGKSA8PCA0KSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCgoKGJ5dGUpWzFdKSA+PiAyKSAmIDB4RildIFwKLQkJICAgICAgIDw8IDMpIFwKLSAgICAgICAgICAgICAgICAgICAgICArICgoKChieXRlKVsxXSkgJiAzKSA8PCAxKSBcCi0gICAgICAgICAgICAgICAgICAgICAgKyAoKCgoYnl0ZSlbMl0pID4+IDUpICYgMSldIFwKLSAgICAgICAgICYgKDEgPDwgKCgoYnl0ZSlbMl0pICYgMHgxRikpKQotCi0jZGVmaW5lIFVURjhfR0VUX05BTUlORyhwYWdlcywgcCwgbikgXAotICAoKG4pID09IDIgXAotICA/IFVURjhfR0VUX05BTUlORzIocGFnZXMsIChjb25zdCB1bnNpZ25lZCBjaGFyICopKHApKSBcCi0gIDogKChuKSA9PSAzIFwKLSAgICAgPyBVVEY4X0dFVF9OQU1JTkczKHBhZ2VzLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKShwKSkgXAotICAgICA6IDApKQotCi0jZGVmaW5lIFVURjhfSU5WQUxJRDMocCkgXAotICAoKCpwKSA9PSAweEVEIFwKLSAgPyAoKChwKVsxXSAmIDB4MjApICE9IDApIFwKLSAgOiAoKCpwKSA9PSAweEVGIFwKLSAgICAgPyAoKHApWzFdID09IDB4QkYgJiYgKChwKVsyXSA9PSAweEJGIHx8IChwKVsyXSA9PSAweEJFKSkgXAotICAgICA6IDApKQotCi0jZGVmaW5lIFVURjhfSU5WQUxJRDQocCkgKCgqcCkgPT0gMHhGNCAmJiAoKHApWzFdICYgMHgzMCkgIT0gMCkKLQotc3RhdGljCi1pbnQgaXNOZXZlcihjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwKQotewotICByZXR1cm4gMDsKLX0KLQotc3RhdGljCi1pbnQgdXRmOF9pc05hbWUyKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnApCi17Ci0gIHJldHVybiBVVEY4X0dFVF9OQU1JTkcyKG5hbWVQYWdlcywgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwKTsKLX0KLQotc3RhdGljCi1pbnQgdXRmOF9pc05hbWUzKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnApCi17Ci0gIHJldHVybiBVVEY4X0dFVF9OQU1JTkczKG5hbWVQYWdlcywgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwKTsKLX0KLQotI2RlZmluZSB1dGY4X2lzTmFtZTQgaXNOZXZlcgotCi1zdGF0aWMKLWludCB1dGY4X2lzTm1zdHJ0Mihjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwKQotewotICByZXR1cm4gVVRGOF9HRVRfTkFNSU5HMihubXN0cnRQYWdlcywgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwKTsKLX0KLQotc3RhdGljCi1pbnQgdXRmOF9pc05tc3RydDMoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKLXsKLSAgcmV0dXJuIFVURjhfR0VUX05BTUlORzMobm1zdHJ0UGFnZXMsIChjb25zdCB1bnNpZ25lZCBjaGFyICopcCk7Ci19Ci0KLSNkZWZpbmUgdXRmOF9pc05tc3RydDQgaXNOZXZlcgotCi0jZGVmaW5lIHV0ZjhfaXNJbnZhbGlkMiBpc05ldmVyCi0KLXN0YXRpYwotaW50IHV0ZjhfaXNJbnZhbGlkMyhjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwKQotewotICByZXR1cm4gVVRGOF9JTlZBTElEMygoY29uc3QgdW5zaWduZWQgY2hhciAqKXApOwotfQotCi1zdGF0aWMKLWludCB1dGY4X2lzSW52YWxpZDQoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKLXsKLSAgcmV0dXJuIFVURjhfSU5WQUxJRDQoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwKTsKLX0KLQotc3RydWN0IG5vcm1hbF9lbmNvZGluZyB7Ci0gIEVOQ09ESU5HIGVuYzsKLSAgdW5zaWduZWQgY2hhciB0eXBlWzI1Nl07Ci0jaWZkZWYgWE1MX01JTl9TSVpFCi0gIGludCAoKmJ5dGVUeXBlKShjb25zdCBFTkNPRElORyAqLCBjb25zdCBjaGFyICopOwotICBpbnQgKCppc05hbWVNaW4pKGNvbnN0IEVOQ09ESU5HICosIGNvbnN0IGNoYXIgKik7Ci0gIGludCAoKmlzTm1zdHJ0TWluKShjb25zdCBFTkNPRElORyAqLCBjb25zdCBjaGFyICopOwotICBpbnQgKCpieXRlVG9Bc2NpaSkoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKLSAgaW50ICgqY2hhck1hdGNoZXMpKGNvbnN0IEVOQ09ESU5HICosIGNvbnN0IGNoYXIgKiwgaW50KTsKLSNlbmRpZiAvKiBYTUxfTUlOX1NJWkUgKi8KLSAgaW50ICgqaXNOYW1lMikoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKLSAgaW50ICgqaXNOYW1lMykoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKLSAgaW50ICgqaXNOYW1lNCkoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKLSAgaW50ICgqaXNObXN0cnQyKShjb25zdCBFTkNPRElORyAqLCBjb25zdCBjaGFyICopOwotICBpbnQgKCppc05tc3RydDMpKGNvbnN0IEVOQ09ESU5HICosIGNvbnN0IGNoYXIgKik7Ci0gIGludCAoKmlzTm1zdHJ0NCkoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKLSAgaW50ICgqaXNJbnZhbGlkMikoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKLSAgaW50ICgqaXNJbnZhbGlkMykoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKLSAgaW50ICgqaXNJbnZhbGlkNCkoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKLX07Ci0KLSNpZmRlZiBYTUxfTUlOX1NJWkUKLQotI2RlZmluZSBTVEFOREFSRF9WVEFCTEUoRSkgXAotIEUgIyMgYnl0ZVR5cGUsIFwKLSBFICMjIGlzTmFtZU1pbiwgXAotIEUgIyMgaXNObXN0cnRNaW4sIFwKLSBFICMjIGJ5dGVUb0FzY2lpLCBcCi0gRSAjIyBjaGFyTWF0Y2hlcywKLQotI2Vsc2UKLQotI2RlZmluZSBTVEFOREFSRF9WVEFCTEUoRSkgLyogYXMgbm90aGluZyAqLwotCi0jZW5kaWYKLQotI2RlZmluZSBOT1JNQUxfVlRBQkxFKEUpIFwKLSBFICMjIGlzTmFtZTIsIFwKLSBFICMjIGlzTmFtZTMsIFwKLSBFICMjIGlzTmFtZTQsIFwKLSBFICMjIGlzTm1zdHJ0MiwgXAotIEUgIyMgaXNObXN0cnQzLCBcCi0gRSAjIyBpc05tc3RydDQsIFwKLSBFICMjIGlzSW52YWxpZDIsIFwKLSBFICMjIGlzSW52YWxpZDMsIFwKLSBFICMjIGlzSW52YWxpZDQKLQotc3RhdGljIGludCBjaGVja0NoYXJSZWZOdW1iZXIoaW50KTsKLQotI2luY2x1ZGUgInhtbHRva19pbXBsLmgiCi0KLSNpZmRlZiBYTUxfTUlOX1NJWkUKLSNkZWZpbmUgc2JfaXNOYW1lTWluIGlzTmV2ZXIKLSNkZWZpbmUgc2JfaXNObXN0cnRNaW4gaXNOZXZlcgotI2VuZGlmCi0KLSNpZmRlZiBYTUxfTUlOX1NJWkUKLSNkZWZpbmUgTUlOQlBDKGVuYykgKChlbmMpLT5taW5CeXRlc1BlckNoYXIpCi0jZWxzZQotLyogbWluaW11bSBieXRlcyBwZXIgY2hhcmFjdGVyICovCi0jZGVmaW5lIE1JTkJQQyhlbmMpIDEKLSNlbmRpZgotCi0jZGVmaW5lIFNCX0JZVEVfVFlQRShlbmMsIHApIFwKLSAgKCgoc3RydWN0IG5vcm1hbF9lbmNvZGluZyAqKShlbmMpKS0+dHlwZVsodW5zaWduZWQgY2hhcikqKHApXSkKLQotI2lmZGVmIFhNTF9NSU5fU0laRQotc3RhdGljCi1pbnQgc2JfYnl0ZVR5cGUoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKLXsKLSAgcmV0dXJuIFNCX0JZVEVfVFlQRShlbmMsIHApOwotfQotI2RlZmluZSBCWVRFX1RZUEUoZW5jLCBwKSBcCi0gKCgoY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyAqKShlbmMpKS0+Ynl0ZVR5cGUoZW5jLCBwKSkKLSNlbHNlCi0jZGVmaW5lIEJZVEVfVFlQRShlbmMsIHApIFNCX0JZVEVfVFlQRShlbmMsIHApCi0jZW5kaWYKLQotI2lmZGVmIFhNTF9NSU5fU0laRQotI2RlZmluZSBCWVRFX1RPX0FTQ0lJKGVuYywgcCkgXAotICgoKGNvbnN0IHN0cnVjdCBub3JtYWxfZW5jb2RpbmcgKikoZW5jKSktPmJ5dGVUb0FzY2lpKGVuYywgcCkpCi1zdGF0aWMKLWludCBzYl9ieXRlVG9Bc2NpaShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwKQotewotICByZXR1cm4gKnA7Ci19Ci0jZWxzZQotI2RlZmluZSBCWVRFX1RPX0FTQ0lJKGVuYywgcCkgKCpwKQotI2VuZGlmCi0KLSNkZWZpbmUgSVNfTkFNRV9DSEFSKGVuYywgcCwgbikgXAotICgoKGNvbnN0IHN0cnVjdCBub3JtYWxfZW5jb2RpbmcgKikoZW5jKSktPmlzTmFtZSAjIyBuKGVuYywgcCkpCi0jZGVmaW5lIElTX05NU1RSVF9DSEFSKGVuYywgcCwgbikgXAotICgoKGNvbnN0IHN0cnVjdCBub3JtYWxfZW5jb2RpbmcgKikoZW5jKSktPmlzTm1zdHJ0ICMjIG4oZW5jLCBwKSkKLSNkZWZpbmUgSVNfSU5WQUxJRF9DSEFSKGVuYywgcCwgbikgXAotICgoKGNvbnN0IHN0cnVjdCBub3JtYWxfZW5jb2RpbmcgKikoZW5jKSktPmlzSW52YWxpZCAjIyBuKGVuYywgcCkpCi0KLSNpZmRlZiBYTUxfTUlOX1NJWkUKLSNkZWZpbmUgSVNfTkFNRV9DSEFSX01JTkJQQyhlbmMsIHApIFwKLSAoKChjb25zdCBzdHJ1Y3Qgbm9ybWFsX2VuY29kaW5nICopKGVuYykpLT5pc05hbWVNaW4oZW5jLCBwKSkKLSNkZWZpbmUgSVNfTk1TVFJUX0NIQVJfTUlOQlBDKGVuYywgcCkgXAotICgoKGNvbnN0IHN0cnVjdCBub3JtYWxfZW5jb2RpbmcgKikoZW5jKSktPmlzTm1zdHJ0TWluKGVuYywgcCkpCi0jZWxzZQotI2RlZmluZSBJU19OQU1FX0NIQVJfTUlOQlBDKGVuYywgcCkgKDApCi0jZGVmaW5lIElTX05NU1RSVF9DSEFSX01JTkJQQyhlbmMsIHApICgwKQotI2VuZGlmCi0KLSNpZmRlZiBYTUxfTUlOX1NJWkUKLSNkZWZpbmUgQ0hBUl9NQVRDSEVTKGVuYywgcCwgYykgXAotICgoKGNvbnN0IHN0cnVjdCBub3JtYWxfZW5jb2RpbmcgKikoZW5jKSktPmNoYXJNYXRjaGVzKGVuYywgcCwgYykpCi1zdGF0aWMKLWludCBzYl9jaGFyTWF0Y2hlcyhjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwLCBpbnQgYykKLXsKLSAgcmV0dXJuICpwID09IGM7Ci19Ci0jZWxzZQotLyogYyBpcyBhbiBBU0NJSSBjaGFyYWN0ZXIgKi8KLSNkZWZpbmUgQ0hBUl9NQVRDSEVTKGVuYywgcCwgYykgKCoocCkgPT0gYykKLSNlbmRpZgotCi0jZGVmaW5lIFBSRUZJWChpZGVudCkgbm9ybWFsXyAjIyBpZGVudAotI2luY2x1ZGUgInhtbHRva19pbXBsLmMiCi0KLSN1bmRlZiBNSU5CUEMKLSN1bmRlZiBCWVRFX1RZUEUKLSN1bmRlZiBCWVRFX1RPX0FTQ0lJCi0jdW5kZWYgQ0hBUl9NQVRDSEVTCi0jdW5kZWYgSVNfTkFNRV9DSEFSCi0jdW5kZWYgSVNfTkFNRV9DSEFSX01JTkJQQwotI3VuZGVmIElTX05NU1RSVF9DSEFSCi0jdW5kZWYgSVNfTk1TVFJUX0NIQVJfTUlOQlBDCi0jdW5kZWYgSVNfSU5WQUxJRF9DSEFSCi0KLWVudW0geyAgLyogVVRGOF9jdmFsTiBpcyB2YWx1ZSBvZiBtYXNrZWQgZmlyc3QgYnl0ZSBvZiBOIGJ5dGUgc2VxdWVuY2UgKi8KLSAgVVRGOF9jdmFsMSA9IDB4MDAsCi0gIFVURjhfY3ZhbDIgPSAweGMwLAotICBVVEY4X2N2YWwzID0gMHhlMCwKLSAgVVRGOF9jdmFsNCA9IDB4ZjAKLX07Ci0KLXN0YXRpYwotdm9pZCB1dGY4X3RvVXRmOChjb25zdCBFTkNPRElORyAqZW5jLAotCQkgY29uc3QgY2hhciAqKmZyb21QLCBjb25zdCBjaGFyICpmcm9tTGltLAotCQkgY2hhciAqKnRvUCwgY29uc3QgY2hhciAqdG9MaW0pCi17Ci0gIGNoYXIgKnRvOwotICBjb25zdCBjaGFyICpmcm9tOwotICBpZiAoZnJvbUxpbSAtICpmcm9tUCA+IHRvTGltIC0gKnRvUCkgewotICAgIC8qIEF2b2lkIGNvcHlpbmcgcGFydGlhbCBjaGFyYWN0ZXJzLiAqLwotICAgIGZvciAoZnJvbUxpbSA9ICpmcm9tUCArICh0b0xpbSAtICp0b1ApOyBmcm9tTGltID4gKmZyb21QOyBmcm9tTGltLS0pCi0gICAgICBpZiAoKCh1bnNpZ25lZCBjaGFyKWZyb21MaW1bLTFdICYgMHhjMCkgIT0gMHg4MCkKLQlicmVhazsKLSAgfQotICBmb3IgKHRvID0gKnRvUCwgZnJvbSA9ICpmcm9tUDsgZnJvbSAhPSBmcm9tTGltOyBmcm9tKyssIHRvKyspCi0gICAgKnRvID0gKmZyb207Ci0gICpmcm9tUCA9IGZyb207Ci0gICp0b1AgPSB0bzsKLX0KLQotc3RhdGljCi12b2lkIHV0ZjhfdG9VdGYxNihjb25zdCBFTkNPRElORyAqZW5jLAotCQkgIGNvbnN0IGNoYXIgKipmcm9tUCwgY29uc3QgY2hhciAqZnJvbUxpbSwKLQkJICB1bnNpZ25lZCBzaG9ydCAqKnRvUCwgY29uc3QgdW5zaWduZWQgc2hvcnQgKnRvTGltKQotewotICB1bnNpZ25lZCBzaG9ydCAqdG8gPSAqdG9QOwotICBjb25zdCBjaGFyICpmcm9tID0gKmZyb21QOwotICB3aGlsZSAoZnJvbSAhPSBmcm9tTGltICYmIHRvICE9IHRvTGltKSB7Ci0gICAgc3dpdGNoICgoKHN0cnVjdCBub3JtYWxfZW5jb2RpbmcgKillbmMpLT50eXBlWyh1bnNpZ25lZCBjaGFyKSpmcm9tXSkgewotICAgIGNhc2UgQlRfTEVBRDI6Ci0gICAgICAqdG8rKyA9ICgoZnJvbVswXSAmIDB4MWYpIDw8IDYpIHwgKGZyb21bMV0gJiAweDNmKTsKLSAgICAgIGZyb20gKz0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRfTEVBRDM6Ci0gICAgICAqdG8rKyA9ICgoZnJvbVswXSAmIDB4ZikgPDwgMTIpIHwgKChmcm9tWzFdICYgMHgzZikgPDwgNikgfCAoZnJvbVsyXSAmIDB4M2YpOwotICAgICAgZnJvbSArPSAzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVF9MRUFENDoKLSAgICAgIHsKLQl1bnNpZ25lZCBsb25nIG47Ci0JaWYgKHRvICsgMSA9PSB0b0xpbSkKLQkgIGJyZWFrOwotCW4gPSAoKGZyb21bMF0gJiAweDcpIDw8IDE4KSB8ICgoZnJvbVsxXSAmIDB4M2YpIDw8IDEyKSB8ICgoZnJvbVsyXSAmIDB4M2YpIDw8IDYpIHwgKGZyb21bM10gJiAweDNmKTsKLQluIC09IDB4MTAwMDA7Ci0JdG9bMF0gPSAodW5zaWduZWQgc2hvcnQpKChuID4+IDEwKSB8IDB4RDgwMCk7Ci0JdG9bMV0gPSAodW5zaWduZWQgc2hvcnQpKChuICYgMHgzRkYpIHwgMHhEQzAwKTsKLQl0byArPSAyOwotCWZyb20gKz0gNDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAqdG8rKyA9ICpmcm9tKys7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgKmZyb21QID0gZnJvbTsKLSAgKnRvUCA9IHRvOwotfQotCi0jaWZkZWYgWE1MX05TCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyB1dGY4X2VuY29kaW5nX25zID0gewotICB7IFZUQUJMRTEsIHV0ZjhfdG9VdGY4LCB1dGY4X3RvVXRmMTYsIDEsIDEsIDAgfSwKLSAgewotI2luY2x1ZGUgImFzY2lpdGFiLmgiCi0jaW5jbHVkZSAidXRmOHRhYi5oIgotICB9LAotICBTVEFOREFSRF9WVEFCTEUoc2JfKSBOT1JNQUxfVlRBQkxFKHV0ZjhfKQotfTsKLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyB1dGY4X2VuY29kaW5nID0gewotICB7IFZUQUJMRTEsIHV0ZjhfdG9VdGY4LCB1dGY4X3RvVXRmMTYsIDEsIDEsIDAgfSwKLSAgewotI2RlZmluZSBCVF9DT0xPTiBCVF9OTVNUUlQKLSNpbmNsdWRlICJhc2NpaXRhYi5oIgotI3VuZGVmIEJUX0NPTE9OCi0jaW5jbHVkZSAidXRmOHRhYi5oIgotICB9LAotICBTVEFOREFSRF9WVEFCTEUoc2JfKSBOT1JNQUxfVlRBQkxFKHV0ZjhfKQotfTsKLQotI2lmZGVmIFhNTF9OUwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyBpbnRlcm5hbF91dGY4X2VuY29kaW5nX25zID0gewotICB7IFZUQUJMRTEsIHV0ZjhfdG9VdGY4LCB1dGY4X3RvVXRmMTYsIDEsIDEsIDAgfSwKLSAgewotI2luY2x1ZGUgImlhc2NpaXRhYi5oIgotI2luY2x1ZGUgInV0Zjh0YWIuaCIKLSAgfSwKLSAgU1RBTkRBUkRfVlRBQkxFKHNiXykgTk9STUFMX1ZUQUJMRSh1dGY4XykKLX07Ci0KLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyBpbnRlcm5hbF91dGY4X2VuY29kaW5nID0gewotICB7IFZUQUJMRTEsIHV0ZjhfdG9VdGY4LCB1dGY4X3RvVXRmMTYsIDEsIDEsIDAgfSwKLSAgewotI2RlZmluZSBCVF9DT0xPTiBCVF9OTVNUUlQKLSNpbmNsdWRlICJpYXNjaWl0YWIuaCIKLSN1bmRlZiBCVF9DT0xPTgotI2luY2x1ZGUgInV0Zjh0YWIuaCIKLSAgfSwKLSAgU1RBTkRBUkRfVlRBQkxFKHNiXykgTk9STUFMX1ZUQUJMRSh1dGY4XykKLX07Ci0KLXN0YXRpYwotdm9pZCBsYXRpbjFfdG9VdGY4KGNvbnN0IEVOQ09ESU5HICplbmMsCi0JCSAgIGNvbnN0IGNoYXIgKipmcm9tUCwgY29uc3QgY2hhciAqZnJvbUxpbSwKLQkJICAgY2hhciAqKnRvUCwgY29uc3QgY2hhciAqdG9MaW0pCi17Ci0gIGZvciAoOzspIHsKLSAgICB1bnNpZ25lZCBjaGFyIGM7Ci0gICAgaWYgKCpmcm9tUCA9PSBmcm9tTGltKQotICAgICAgYnJlYWs7Ci0gICAgYyA9ICh1bnNpZ25lZCBjaGFyKSoqZnJvbVA7Ci0gICAgaWYgKGMgJiAweDgwKSB7Ci0gICAgICBpZiAodG9MaW0gLSAqdG9QIDwgMikKLQlicmVhazsKLSAgICAgICooKnRvUCkrKyA9ICgoYyA+PiA2KSB8IFVURjhfY3ZhbDIpOwotICAgICAgKigqdG9QKSsrID0gKChjICYgMHgzZikgfCAweDgwKTsKLSAgICAgICgqZnJvbVApKys7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgaWYgKCp0b1AgPT0gdG9MaW0pCi0JYnJlYWs7Ci0gICAgICAqKCp0b1ApKysgPSAqKCpmcm9tUCkrKzsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljCi12b2lkIGxhdGluMV90b1V0ZjE2KGNvbnN0IEVOQ09ESU5HICplbmMsCi0JCSAgICBjb25zdCBjaGFyICoqZnJvbVAsIGNvbnN0IGNoYXIgKmZyb21MaW0sCi0JCSAgICB1bnNpZ25lZCBzaG9ydCAqKnRvUCwgY29uc3QgdW5zaWduZWQgc2hvcnQgKnRvTGltKQotewotICB3aGlsZSAoKmZyb21QICE9IGZyb21MaW0gJiYgKnRvUCAhPSB0b0xpbSkKLSAgICAqKCp0b1ApKysgPSAodW5zaWduZWQgY2hhcikqKCpmcm9tUCkrKzsKLX0KLQotI2lmZGVmIFhNTF9OUwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyBsYXRpbjFfZW5jb2RpbmdfbnMgPSB7Ci0gIHsgVlRBQkxFMSwgbGF0aW4xX3RvVXRmOCwgbGF0aW4xX3RvVXRmMTYsIDEsIDAsIDAgfSwKLSAgewotI2luY2x1ZGUgImFzY2lpdGFiLmgiCi0jaW5jbHVkZSAibGF0aW4xdGFiLmgiCi0gIH0sCi0gIFNUQU5EQVJEX1ZUQUJMRShzYl8pCi19OwotCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBub3JtYWxfZW5jb2RpbmcgbGF0aW4xX2VuY29kaW5nID0gewotICB7IFZUQUJMRTEsIGxhdGluMV90b1V0ZjgsIGxhdGluMV90b1V0ZjE2LCAxLCAwLCAwIH0sCi0gIHsKLSNkZWZpbmUgQlRfQ09MT04gQlRfTk1TVFJUCi0jaW5jbHVkZSAiYXNjaWl0YWIuaCIKLSN1bmRlZiBCVF9DT0xPTgotI2luY2x1ZGUgImxhdGluMXRhYi5oIgotICB9LAotICBTVEFOREFSRF9WVEFCTEUoc2JfKQotfTsKLQotc3RhdGljCi12b2lkIGFzY2lpX3RvVXRmOChjb25zdCBFTkNPRElORyAqZW5jLAotCQkgIGNvbnN0IGNoYXIgKipmcm9tUCwgY29uc3QgY2hhciAqZnJvbUxpbSwKLQkJICBjaGFyICoqdG9QLCBjb25zdCBjaGFyICp0b0xpbSkKLXsKLSAgd2hpbGUgKCpmcm9tUCAhPSBmcm9tTGltICYmICp0b1AgIT0gdG9MaW0pCi0gICAgKigqdG9QKSsrID0gKigqZnJvbVApKys7Ci19Ci0KLSNpZmRlZiBYTUxfTlMKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBub3JtYWxfZW5jb2RpbmcgYXNjaWlfZW5jb2RpbmdfbnMgPSB7Ci0gIHsgVlRBQkxFMSwgYXNjaWlfdG9VdGY4LCBsYXRpbjFfdG9VdGYxNiwgMSwgMSwgMCB9LAotICB7Ci0jaW5jbHVkZSAiYXNjaWl0YWIuaCIKLS8qIEJUX05PTlhNTCA9PSAwICovCi0gIH0sCi0gIFNUQU5EQVJEX1ZUQUJMRShzYl8pCi19OwotCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBub3JtYWxfZW5jb2RpbmcgYXNjaWlfZW5jb2RpbmcgPSB7Ci0gIHsgVlRBQkxFMSwgYXNjaWlfdG9VdGY4LCBsYXRpbjFfdG9VdGYxNiwgMSwgMSwgMCB9LAotICB7Ci0jZGVmaW5lIEJUX0NPTE9OIEJUX05NU1RSVAotI2luY2x1ZGUgImFzY2lpdGFiLmgiCi0jdW5kZWYgQlRfQ09MT04KLS8qIEJUX05PTlhNTCA9PSAwICovCi0gIH0sCi0gIFNUQU5EQVJEX1ZUQUJMRShzYl8pCi19OwotCi1zdGF0aWMgaW50IHVuaWNvZGVfYnl0ZV90eXBlKGNoYXIgaGksIGNoYXIgbG8pCi17Ci0gIHN3aXRjaCAoKHVuc2lnbmVkIGNoYXIpaGkpIHsKLSAgY2FzZSAweEQ4OiBjYXNlIDB4RDk6IGNhc2UgMHhEQTogY2FzZSAweERCOgotICAgIHJldHVybiBCVF9MRUFENDsKLSAgY2FzZSAweERDOiBjYXNlIDB4REQ6IGNhc2UgMHhERTogY2FzZSAweERGOgotICAgIHJldHVybiBCVF9UUkFJTDsKLSAgY2FzZSAweEZGOgotICAgIHN3aXRjaCAoKHVuc2lnbmVkIGNoYXIpbG8pIHsKLSAgICBjYXNlIDB4RkY6Ci0gICAgY2FzZSAweEZFOgotICAgICAgcmV0dXJuIEJUX05PTlhNTDsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIEJUX05PTkFTQ0lJOwotfQotCi0jZGVmaW5lIERFRklORV9VVEYxNl9UT19VVEY4KEUpIFwKLXN0YXRpYyBcCi12b2lkIEUgIyMgdG9VdGY4KGNvbnN0IEVOQ09ESU5HICplbmMsIFwKLQkJIGNvbnN0IGNoYXIgKipmcm9tUCwgY29uc3QgY2hhciAqZnJvbUxpbSwgXAotCQkgY2hhciAqKnRvUCwgY29uc3QgY2hhciAqdG9MaW0pIFwKLXsgXAotICBjb25zdCBjaGFyICpmcm9tOyBcCi0gIGZvciAoZnJvbSA9ICpmcm9tUDsgZnJvbSAhPSBmcm9tTGltOyBmcm9tICs9IDIpIHsgXAotICAgIGludCBwbGFuZTsgXAotICAgIHVuc2lnbmVkIGNoYXIgbG8yOyBcCi0gICAgdW5zaWduZWQgY2hhciBsbyA9IEdFVF9MTyhmcm9tKTsgXAotICAgIHVuc2lnbmVkIGNoYXIgaGkgPSBHRVRfSEkoZnJvbSk7IFwKLSAgICBzd2l0Y2ggKGhpKSB7IFwKLSAgICBjYXNlIDA6IFwKLSAgICAgIGlmIChsbyA8IDB4ODApIHsgXAotICAgICAgICBpZiAoKnRvUCA9PSB0b0xpbSkgeyBcCi0gICAgICAgICAgKmZyb21QID0gZnJvbTsgXAotCSAgcmV0dXJuOyBcCi0gICAgICAgIH0gXAotICAgICAgICAqKCp0b1ApKysgPSBsbzsgXAotICAgICAgICBicmVhazsgXAotICAgICAgfSBcCi0gICAgICAvKiBmYWxsIHRocm91Z2ggKi8gXAotICAgIGNhc2UgMHgxOiBjYXNlIDB4MjogY2FzZSAweDM6IFwKLSAgICBjYXNlIDB4NDogY2FzZSAweDU6IGNhc2UgMHg2OiBjYXNlIDB4NzogXAotICAgICAgaWYgKHRvTGltIC0gICp0b1AgPCAyKSB7IFwKLSAgICAgICAgKmZyb21QID0gZnJvbTsgXAotCXJldHVybjsgXAotICAgICAgfSBcCi0gICAgICAqKCp0b1ApKysgPSAoKGxvID4+IDYpIHwgKGhpIDw8IDIpIHwgIFVURjhfY3ZhbDIpOyBcCi0gICAgICAqKCp0b1ApKysgPSAoKGxvICYgMHgzZikgfCAweDgwKTsgXAotICAgICAgYnJlYWs7IFwKLSAgICBkZWZhdWx0OiBcCi0gICAgICBpZiAodG9MaW0gLSAgKnRvUCA8IDMpICB7IFwKLSAgICAgICAgKmZyb21QID0gZnJvbTsgXAotCXJldHVybjsgXAotICAgICAgfSBcCi0gICAgICAvKiAxNiBiaXRzIGRpdmlkZWQgNCwgNiwgNiBhbW9uZ3N0IDMgYnl0ZXMgKi8gXAotICAgICAgKigqdG9QKSsrID0gKChoaSA+PiA0KSB8IFVURjhfY3ZhbDMpOyBcCi0gICAgICAqKCp0b1ApKysgPSAoKChoaSAmIDB4ZikgPDwgMikgfCAobG8gPj4gNikgfCAweDgwKTsgXAotICAgICAgKigqdG9QKSsrID0gKChsbyAmIDB4M2YpIHwgMHg4MCk7IFwKLSAgICAgIGJyZWFrOyBcCi0gICAgY2FzZSAweEQ4OiBjYXNlIDB4RDk6IGNhc2UgMHhEQTogY2FzZSAweERCOiBcCi0gICAgICBpZiAodG9MaW0gLSAgKnRvUCA8IDQpIHsgXAotCSpmcm9tUCA9IGZyb207IFwKLQlyZXR1cm47IFwKLSAgICAgIH0gXAotICAgICAgcGxhbmUgPSAoKChoaSAmIDB4MykgPDwgMikgfCAoKGxvID4+IDYpICYgMHgzKSkgKyAxOyBcCi0gICAgICAqKCp0b1ApKysgPSAoKHBsYW5lID4+IDIpIHwgVVRGOF9jdmFsNCk7IFwKLSAgICAgICooKnRvUCkrKyA9ICgoKGxvID4+IDIpICYgMHhGKSB8ICgocGxhbmUgJiAweDMpIDw8IDQpIHwgMHg4MCk7IFwKLSAgICAgIGZyb20gKz0gMjsgXAotICAgICAgbG8yID0gR0VUX0xPKGZyb20pOyBcCi0gICAgICAqKCp0b1ApKysgPSAoKChsbyAmIDB4MykgPDwgNCkgXAotCSAgICAgICAgICAgfCAoKEdFVF9ISShmcm9tKSAmIDB4MykgPDwgMikgXAotCQkgICB8IChsbzIgPj4gNikgXAotCQkgICB8IDB4ODApOyBcCi0gICAgICAqKCp0b1ApKysgPSAoKGxvMiAmIDB4M2YpIHwgMHg4MCk7IFwKLSAgICAgIGJyZWFrOyBcCi0gICAgfSBcCi0gIH0gXAotICAqZnJvbVAgPSBmcm9tOyBcCi19Ci0KLSNkZWZpbmUgREVGSU5FX1VURjE2X1RPX1VURjE2KEUpIFwKLXN0YXRpYyBcCi12b2lkIEUgIyMgdG9VdGYxNihjb25zdCBFTkNPRElORyAqZW5jLCBcCi0JCSAgY29uc3QgY2hhciAqKmZyb21QLCBjb25zdCBjaGFyICpmcm9tTGltLCBcCi0JCSAgdW5zaWduZWQgc2hvcnQgKip0b1AsIGNvbnN0IHVuc2lnbmVkIHNob3J0ICp0b0xpbSkgXAoteyBcCi0gIC8qIEF2b2lkIGNvcHlpbmcgZmlyc3QgaGFsZiBvbmx5IG9mIHN1cnJvZ2F0ZSAqLyBcCi0gIGlmIChmcm9tTGltIC0gKmZyb21QID4gKCh0b0xpbSAtICp0b1ApIDw8IDEpIFwKLSAgICAgICYmIChHRVRfSEkoZnJvbUxpbSAtIDIpICYgMHhGOCkgPT0gMHhEOCkgXAotICAgIGZyb21MaW0gLT0gMjsgXAotICBmb3IgKDsgKmZyb21QICE9IGZyb21MaW0gJiYgKnRvUCAhPSB0b0xpbTsgKmZyb21QICs9IDIpIFwKLSAgICAqKCp0b1ApKysgPSAoR0VUX0hJKCpmcm9tUCkgPDwgOCkgfCBHRVRfTE8oKmZyb21QKTsgXAotfQotCi0jZGVmaW5lIFNFVDIocHRyLCBjaCkgXAotICAoKChwdHIpWzBdID0gKChjaCkgJiAweGZmKSksICgocHRyKVsxXSA9ICgoY2gpID4+IDgpKSkKLSNkZWZpbmUgR0VUX0xPKHB0cikgKCh1bnNpZ25lZCBjaGFyKShwdHIpWzBdKQotI2RlZmluZSBHRVRfSEkocHRyKSAoKHVuc2lnbmVkIGNoYXIpKHB0cilbMV0pCi0KLURFRklORV9VVEYxNl9UT19VVEY4KGxpdHRsZTJfKQotREVGSU5FX1VURjE2X1RPX1VURjE2KGxpdHRsZTJfKQotCi0jdW5kZWYgU0VUMgotI3VuZGVmIEdFVF9MTwotI3VuZGVmIEdFVF9ISQotCi0jZGVmaW5lIFNFVDIocHRyLCBjaCkgXAotICAoKChwdHIpWzBdID0gKChjaCkgPj4gOCkpLCAoKHB0cilbMV0gPSAoKGNoKSAmIDB4RkYpKSkKLSNkZWZpbmUgR0VUX0xPKHB0cikgKCh1bnNpZ25lZCBjaGFyKShwdHIpWzFdKQotI2RlZmluZSBHRVRfSEkocHRyKSAoKHVuc2lnbmVkIGNoYXIpKHB0cilbMF0pCi0KLURFRklORV9VVEYxNl9UT19VVEY4KGJpZzJfKQotREVGSU5FX1VURjE2X1RPX1VURjE2KGJpZzJfKQotCi0jdW5kZWYgU0VUMgotI3VuZGVmIEdFVF9MTwotI3VuZGVmIEdFVF9ISQotCi0jZGVmaW5lIExJVFRMRTJfQllURV9UWVBFKGVuYywgcCkgXAotICgocClbMV0gPT0gMCBcCi0gID8gKChzdHJ1Y3Qgbm9ybWFsX2VuY29kaW5nICopKGVuYykpLT50eXBlWyh1bnNpZ25lZCBjaGFyKSoocCldIFwKLSAgOiB1bmljb2RlX2J5dGVfdHlwZSgocClbMV0sIChwKVswXSkpCi0jZGVmaW5lIExJVFRMRTJfQllURV9UT19BU0NJSShlbmMsIHApICgocClbMV0gPT0gMCA/IChwKVswXSA6IC0xKQotI2RlZmluZSBMSVRUTEUyX0NIQVJfTUFUQ0hFUyhlbmMsIHAsIGMpICgocClbMV0gPT0gMCAmJiAocClbMF0gPT0gYykKLSNkZWZpbmUgTElUVExFMl9JU19OQU1FX0NIQVJfTUlOQlBDKGVuYywgcCkgXAotICBVQ1MyX0dFVF9OQU1JTkcobmFtZVBhZ2VzLCAodW5zaWduZWQgY2hhcilwWzFdLCAodW5zaWduZWQgY2hhcilwWzBdKQotI2RlZmluZSBMSVRUTEUyX0lTX05NU1RSVF9DSEFSX01JTkJQQyhlbmMsIHApIFwKLSAgVUNTMl9HRVRfTkFNSU5HKG5tc3RydFBhZ2VzLCAodW5zaWduZWQgY2hhcilwWzFdLCAodW5zaWduZWQgY2hhcilwWzBdKQotCi0jaWZkZWYgWE1MX01JTl9TSVpFCi0KLXN0YXRpYwotaW50IGxpdHRsZTJfYnl0ZVR5cGUoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKLXsKLSAgcmV0dXJuIExJVFRMRTJfQllURV9UWVBFKGVuYywgcCk7Ci19Ci0KLXN0YXRpYwotaW50IGxpdHRsZTJfYnl0ZVRvQXNjaWkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKLXsKLSAgcmV0dXJuIExJVFRMRTJfQllURV9UT19BU0NJSShlbmMsIHApOwotfQotCi1zdGF0aWMKLWludCBsaXR0bGUyX2NoYXJNYXRjaGVzKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnAsIGludCBjKQotewotICByZXR1cm4gTElUVExFMl9DSEFSX01BVENIRVMoZW5jLCBwLCBjKTsKLX0KLQotc3RhdGljCi1pbnQgbGl0dGxlMl9pc05hbWVNaW4oY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKLXsKLSAgcmV0dXJuIExJVFRMRTJfSVNfTkFNRV9DSEFSX01JTkJQQyhlbmMsIHApOwotfQotCi1zdGF0aWMKLWludCBsaXR0bGUyX2lzTm1zdHJ0TWluKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnApCi17Ci0gIHJldHVybiBMSVRUTEUyX0lTX05NU1RSVF9DSEFSX01JTkJQQyhlbmMsIHApOwotfQotCi0jdW5kZWYgVlRBQkxFCi0jZGVmaW5lIFZUQUJMRSBWVEFCTEUxLCBsaXR0bGUyX3RvVXRmOCwgbGl0dGxlMl90b1V0ZjE2Ci0KLSNlbHNlIC8qIG5vdCBYTUxfTUlOX1NJWkUgKi8KLQotI3VuZGVmIFBSRUZJWAotI2RlZmluZSBQUkVGSVgoaWRlbnQpIGxpdHRsZTJfICMjIGlkZW50Ci0jZGVmaW5lIE1JTkJQQyhlbmMpIDIKLS8qIENIQVJfTUFUQ0hFUyBpcyBndWFyYW50ZWVkIHRvIGhhdmUgTUlOQlBDIGJ5dGVzIGF2YWlsYWJsZS4gKi8KLSNkZWZpbmUgQllURV9UWVBFKGVuYywgcCkgTElUVExFMl9CWVRFX1RZUEUoZW5jLCBwKQotI2RlZmluZSBCWVRFX1RPX0FTQ0lJKGVuYywgcCkgTElUVExFMl9CWVRFX1RPX0FTQ0lJKGVuYywgcCkgCi0jZGVmaW5lIENIQVJfTUFUQ0hFUyhlbmMsIHAsIGMpIExJVFRMRTJfQ0hBUl9NQVRDSEVTKGVuYywgcCwgYykKLSNkZWZpbmUgSVNfTkFNRV9DSEFSKGVuYywgcCwgbikgMAotI2RlZmluZSBJU19OQU1FX0NIQVJfTUlOQlBDKGVuYywgcCkgTElUVExFMl9JU19OQU1FX0NIQVJfTUlOQlBDKGVuYywgcCkKLSNkZWZpbmUgSVNfTk1TVFJUX0NIQVIoZW5jLCBwLCBuKSAoMCkKLSNkZWZpbmUgSVNfTk1TVFJUX0NIQVJfTUlOQlBDKGVuYywgcCkgTElUVExFMl9JU19OTVNUUlRfQ0hBUl9NSU5CUEMoZW5jLCBwKQotCi0jaW5jbHVkZSAieG1sdG9rX2ltcGwuYyIKLQotI3VuZGVmIE1JTkJQQwotI3VuZGVmIEJZVEVfVFlQRQotI3VuZGVmIEJZVEVfVE9fQVNDSUkKLSN1bmRlZiBDSEFSX01BVENIRVMKLSN1bmRlZiBJU19OQU1FX0NIQVIKLSN1bmRlZiBJU19OQU1FX0NIQVJfTUlOQlBDCi0jdW5kZWYgSVNfTk1TVFJUX0NIQVIKLSN1bmRlZiBJU19OTVNUUlRfQ0hBUl9NSU5CUEMKLSN1bmRlZiBJU19JTlZBTElEX0NIQVIKLQotI2VuZGlmIC8qIG5vdCBYTUxfTUlOX1NJWkUgKi8KLQotI2lmZGVmIFhNTF9OUwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyBsaXR0bGUyX2VuY29kaW5nX25zID0geyAKLSAgeyBWVEFCTEUsIDIsIDAsCi0jaWYgWE1MX0JZVEVfT1JERVIgPT0gMTIKLSAgICAxCi0jZWxzZQotICAgIDAKLSNlbmRpZgotICB9LAotICB7Ci0jaW5jbHVkZSAiYXNjaWl0YWIuaCIKLSNpbmNsdWRlICJsYXRpbjF0YWIuaCIKLSAgfSwKLSAgU1RBTkRBUkRfVlRBQkxFKGxpdHRsZTJfKQotfTsKLQotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgbm9ybWFsX2VuY29kaW5nIGxpdHRsZTJfZW5jb2RpbmcgPSB7IAotICB7IFZUQUJMRSwgMiwgMCwKLSNpZiBYTUxfQllURV9PUkRFUiA9PSAxMgotICAgIDEKLSNlbHNlCi0gICAgMAotI2VuZGlmCi0gIH0sCi0gIHsKLSNkZWZpbmUgQlRfQ09MT04gQlRfTk1TVFJUCi0jaW5jbHVkZSAiYXNjaWl0YWIuaCIKLSN1bmRlZiBCVF9DT0xPTgotI2luY2x1ZGUgImxhdGluMXRhYi5oIgotICB9LAotICBTVEFOREFSRF9WVEFCTEUobGl0dGxlMl8pCi19OwotCi0jaWYgWE1MX0JZVEVfT1JERVIgIT0gMjEKLQotI2lmZGVmIFhNTF9OUwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyBpbnRlcm5hbF9saXR0bGUyX2VuY29kaW5nX25zID0geyAKLSAgeyBWVEFCTEUsIDIsIDAsIDEgfSwKLSAgewotI2luY2x1ZGUgImlhc2NpaXRhYi5oIgotI2luY2x1ZGUgImxhdGluMXRhYi5oIgotICB9LAotICBTVEFOREFSRF9WVEFCTEUobGl0dGxlMl8pCi19OwotCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBub3JtYWxfZW5jb2RpbmcgaW50ZXJuYWxfbGl0dGxlMl9lbmNvZGluZyA9IHsgCi0gIHsgVlRBQkxFLCAyLCAwLCAxIH0sCi0gIHsKLSNkZWZpbmUgQlRfQ09MT04gQlRfTk1TVFJUCi0jaW5jbHVkZSAiaWFzY2lpdGFiLmgiCi0jdW5kZWYgQlRfQ09MT04KLSNpbmNsdWRlICJsYXRpbjF0YWIuaCIKLSAgfSwKLSAgU1RBTkRBUkRfVlRBQkxFKGxpdHRsZTJfKQotfTsKLQotI2VuZGlmCi0KLQotI2RlZmluZSBCSUcyX0JZVEVfVFlQRShlbmMsIHApIFwKLSAoKHApWzBdID09IDAgXAotICA/ICgoc3RydWN0IG5vcm1hbF9lbmNvZGluZyAqKShlbmMpKS0+dHlwZVsodW5zaWduZWQgY2hhcikocClbMV1dIFwKLSAgOiB1bmljb2RlX2J5dGVfdHlwZSgocClbMF0sIChwKVsxXSkpCi0jZGVmaW5lIEJJRzJfQllURV9UT19BU0NJSShlbmMsIHApICgocClbMF0gPT0gMCA/IChwKVsxXSA6IC0xKQotI2RlZmluZSBCSUcyX0NIQVJfTUFUQ0hFUyhlbmMsIHAsIGMpICgocClbMF0gPT0gMCAmJiAocClbMV0gPT0gYykKLSNkZWZpbmUgQklHMl9JU19OQU1FX0NIQVJfTUlOQlBDKGVuYywgcCkgXAotICBVQ1MyX0dFVF9OQU1JTkcobmFtZVBhZ2VzLCAodW5zaWduZWQgY2hhcilwWzBdLCAodW5zaWduZWQgY2hhcilwWzFdKQotI2RlZmluZSBCSUcyX0lTX05NU1RSVF9DSEFSX01JTkJQQyhlbmMsIHApIFwKLSAgVUNTMl9HRVRfTkFNSU5HKG5tc3RydFBhZ2VzLCAodW5zaWduZWQgY2hhcilwWzBdLCAodW5zaWduZWQgY2hhcilwWzFdKQotCi0jaWZkZWYgWE1MX01JTl9TSVpFCi0KLXN0YXRpYwotaW50IGJpZzJfYnl0ZVR5cGUoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKLXsKLSAgcmV0dXJuIEJJRzJfQllURV9UWVBFKGVuYywgcCk7Ci19Ci0KLXN0YXRpYwotaW50IGJpZzJfYnl0ZVRvQXNjaWkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKLXsKLSAgcmV0dXJuIEJJRzJfQllURV9UT19BU0NJSShlbmMsIHApOwotfQotCi1zdGF0aWMKLWludCBiaWcyX2NoYXJNYXRjaGVzKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnAsIGludCBjKQotewotICByZXR1cm4gQklHMl9DSEFSX01BVENIRVMoZW5jLCBwLCBjKTsKLX0KLQotc3RhdGljCi1pbnQgYmlnMl9pc05hbWVNaW4oY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKLXsKLSAgcmV0dXJuIEJJRzJfSVNfTkFNRV9DSEFSX01JTkJQQyhlbmMsIHApOwotfQotCi1zdGF0aWMKLWludCBiaWcyX2lzTm1zdHJ0TWluKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnApCi17Ci0gIHJldHVybiBCSUcyX0lTX05NU1RSVF9DSEFSX01JTkJQQyhlbmMsIHApOwotfQotCi0jdW5kZWYgVlRBQkxFCi0jZGVmaW5lIFZUQUJMRSBWVEFCTEUxLCBiaWcyX3RvVXRmOCwgYmlnMl90b1V0ZjE2Ci0KLSNlbHNlIC8qIG5vdCBYTUxfTUlOX1NJWkUgKi8KLQotI3VuZGVmIFBSRUZJWAotI2RlZmluZSBQUkVGSVgoaWRlbnQpIGJpZzJfICMjIGlkZW50Ci0jZGVmaW5lIE1JTkJQQyhlbmMpIDIKLS8qIENIQVJfTUFUQ0hFUyBpcyBndWFyYW50ZWVkIHRvIGhhdmUgTUlOQlBDIGJ5dGVzIGF2YWlsYWJsZS4gKi8KLSNkZWZpbmUgQllURV9UWVBFKGVuYywgcCkgQklHMl9CWVRFX1RZUEUoZW5jLCBwKQotI2RlZmluZSBCWVRFX1RPX0FTQ0lJKGVuYywgcCkgQklHMl9CWVRFX1RPX0FTQ0lJKGVuYywgcCkgCi0jZGVmaW5lIENIQVJfTUFUQ0hFUyhlbmMsIHAsIGMpIEJJRzJfQ0hBUl9NQVRDSEVTKGVuYywgcCwgYykKLSNkZWZpbmUgSVNfTkFNRV9DSEFSKGVuYywgcCwgbikgMAotI2RlZmluZSBJU19OQU1FX0NIQVJfTUlOQlBDKGVuYywgcCkgQklHMl9JU19OQU1FX0NIQVJfTUlOQlBDKGVuYywgcCkKLSNkZWZpbmUgSVNfTk1TVFJUX0NIQVIoZW5jLCBwLCBuKSAoMCkKLSNkZWZpbmUgSVNfTk1TVFJUX0NIQVJfTUlOQlBDKGVuYywgcCkgQklHMl9JU19OTVNUUlRfQ0hBUl9NSU5CUEMoZW5jLCBwKQotCi0jaW5jbHVkZSAieG1sdG9rX2ltcGwuYyIKLQotI3VuZGVmIE1JTkJQQwotI3VuZGVmIEJZVEVfVFlQRQotI3VuZGVmIEJZVEVfVE9fQVNDSUkKLSN1bmRlZiBDSEFSX01BVENIRVMKLSN1bmRlZiBJU19OQU1FX0NIQVIKLSN1bmRlZiBJU19OQU1FX0NIQVJfTUlOQlBDCi0jdW5kZWYgSVNfTk1TVFJUX0NIQVIKLSN1bmRlZiBJU19OTVNUUlRfQ0hBUl9NSU5CUEMKLSN1bmRlZiBJU19JTlZBTElEX0NIQVIKLQotI2VuZGlmIC8qIG5vdCBYTUxfTUlOX1NJWkUgKi8KLQotI2lmZGVmIFhNTF9OUwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyBiaWcyX2VuY29kaW5nX25zID0gewotICB7IFZUQUJMRSwgMiwgMCwKLSNpZiBYTUxfQllURV9PUkRFUiA9PSAyMQotICAxCi0jZWxzZQotICAwCi0jZW5kaWYKLSAgfSwKLSAgewotI2luY2x1ZGUgImFzY2lpdGFiLmgiCi0jaW5jbHVkZSAibGF0aW4xdGFiLmgiCi0gIH0sCi0gIFNUQU5EQVJEX1ZUQUJMRShiaWcyXykKLX07Ci0KLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyBiaWcyX2VuY29kaW5nID0gewotICB7IFZUQUJMRSwgMiwgMCwKLSNpZiBYTUxfQllURV9PUkRFUiA9PSAyMQotICAxCi0jZWxzZQotICAwCi0jZW5kaWYKLSAgfSwKLSAgewotI2RlZmluZSBCVF9DT0xPTiBCVF9OTVNUUlQKLSNpbmNsdWRlICJhc2NpaXRhYi5oIgotI3VuZGVmIEJUX0NPTE9OCi0jaW5jbHVkZSAibGF0aW4xdGFiLmgiCi0gIH0sCi0gIFNUQU5EQVJEX1ZUQUJMRShiaWcyXykKLX07Ci0KLSNpZiBYTUxfQllURV9PUkRFUiAhPSAxMgotCi0jaWZkZWYgWE1MX05TCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgbm9ybWFsX2VuY29kaW5nIGludGVybmFsX2JpZzJfZW5jb2RpbmdfbnMgPSB7Ci0gIHsgVlRBQkxFLCAyLCAwLCAxIH0sCi0gIHsKLSNpbmNsdWRlICJpYXNjaWl0YWIuaCIKLSNpbmNsdWRlICJsYXRpbjF0YWIuaCIKLSAgfSwKLSAgU1RBTkRBUkRfVlRBQkxFKGJpZzJfKQotfTsKLQotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgbm9ybWFsX2VuY29kaW5nIGludGVybmFsX2JpZzJfZW5jb2RpbmcgPSB7Ci0gIHsgVlRBQkxFLCAyLCAwLCAxIH0sCi0gIHsKLSNkZWZpbmUgQlRfQ09MT04gQlRfTk1TVFJUCi0jaW5jbHVkZSAiaWFzY2lpdGFiLmgiCi0jdW5kZWYgQlRfQ09MT04KLSNpbmNsdWRlICJsYXRpbjF0YWIuaCIKLSAgfSwKLSAgU1RBTkRBUkRfVlRBQkxFKGJpZzJfKQotfTsKLQotI2VuZGlmCi0KLSN1bmRlZiBQUkVGSVgKLQotc3RhdGljCi1pbnQgc3RyZXFjaShjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCi17Ci0gIGZvciAoOzspIHsKLSAgICBjaGFyIGMxID0gKnMxKys7Ci0gICAgY2hhciBjMiA9ICpzMisrOwotICAgIGlmICgnYScgPD0gYzEgJiYgYzEgPD0gJ3onKQotICAgICAgYzEgKz0gJ0EnIC0gJ2EnOwotICAgIGlmICgnYScgPD0gYzIgJiYgYzIgPD0gJ3onKQotICAgICAgYzIgKz0gJ0EnIC0gJ2EnOwotICAgIGlmIChjMSAhPSBjMikKLSAgICAgIHJldHVybiAwOwotICAgIGlmICghYzEpCi0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljCi12b2lkIGluaXRVcGRhdGVQb3NpdGlvbihjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsCi0JCQljb25zdCBjaGFyICplbmQsIFBPU0lUSU9OICpwb3MpCi17Ci0gIG5vcm1hbF91cGRhdGVQb3NpdGlvbigmdXRmOF9lbmNvZGluZy5lbmMsIHB0ciwgZW5kLCBwb3MpOwotfQotCi1zdGF0aWMKLWludCB0b0FzY2lpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kKQotewotICBjaGFyIGJ1ZlsxXTsKLSAgY2hhciAqcCA9IGJ1ZjsKLSAgWG1sVXRmOENvbnZlcnQoZW5jLCAmcHRyLCBlbmQsICZwLCBwICsgMSk7Ci0gIGlmIChwID09IGJ1ZikKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UKLSAgICByZXR1cm4gYnVmWzBdOwotfQotCi1zdGF0aWMKLWludCBpc1NwYWNlKGludCBjKQotewotICBzd2l0Y2ggKGMpIHsKLSAgY2FzZSAweDIwOgotICBjYXNlIDB4RDoKLSAgY2FzZSAweEE6Ci0gIGNhc2UgMHg5OgkKLSAgICByZXR1cm4gMTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIDEgaWYgdGhlcmUncyBqdXN0IG9wdGlvbmFsIHdoaXRlIHNwYWNlCi1vciB0aGVyZSdzIGFuIFMgZm9sbG93ZWQgYnkgbmFtZT12YWwuICovCi1zdGF0aWMKLWludCBwYXJzZVBzZXVkb0F0dHJpYnV0ZShjb25zdCBFTkNPRElORyAqZW5jLAotCQkJIGNvbnN0IGNoYXIgKnB0ciwKLQkJCSBjb25zdCBjaGFyICplbmQsCi0JCQkgY29uc3QgY2hhciAqKm5hbWVQdHIsCi0JCQkgY29uc3QgY2hhciAqKnZhbFB0ciwKLQkJCSBjb25zdCBjaGFyICoqbmV4dFRva1B0cikKLXsKLSAgaW50IGM7Ci0gIGNoYXIgb3BlbjsKLSAgaWYgKHB0ciA9PSBlbmQpIHsKLSAgICAqbmFtZVB0ciA9IDA7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgaWYgKCFpc1NwYWNlKHRvQXNjaWkoZW5jLCBwdHIsIGVuZCkpKSB7Ci0gICAgKm5leHRUb2tQdHIgPSBwdHI7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgZG8gewotICAgIHB0ciArPSBlbmMtPm1pbkJ5dGVzUGVyQ2hhcjsKLSAgfSB3aGlsZSAoaXNTcGFjZSh0b0FzY2lpKGVuYywgcHRyLCBlbmQpKSk7Ci0gIGlmIChwdHIgPT0gZW5kKSB7Ci0gICAgKm5hbWVQdHIgPSAwOwotICAgIHJldHVybiAxOwotICB9Ci0gICpuYW1lUHRyID0gcHRyOwotICBmb3IgKDs7KSB7Ci0gICAgYyA9IHRvQXNjaWkoZW5jLCBwdHIsIGVuZCk7Ci0gICAgaWYgKGMgPT0gLTEpIHsKLSAgICAgICpuZXh0VG9rUHRyID0gcHRyOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChjID09ICc9JykKLSAgICAgIGJyZWFrOwotICAgIGlmIChpc1NwYWNlKGMpKSB7Ci0gICAgICBkbyB7Ci0JcHRyICs9IGVuYy0+bWluQnl0ZXNQZXJDaGFyOwotICAgICAgfSB3aGlsZSAoaXNTcGFjZShjID0gdG9Bc2NpaShlbmMsIHB0ciwgZW5kKSkpOwotICAgICAgaWYgKGMgIT0gJz0nKSB7Ci0JKm5leHRUb2tQdHIgPSBwdHI7Ci0JcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgcHRyICs9IGVuYy0+bWluQnl0ZXNQZXJDaGFyOwotICB9Ci0gIGlmIChwdHIgPT0gKm5hbWVQdHIpIHsKLSAgICAqbmV4dFRva1B0ciA9IHB0cjsKLSAgICByZXR1cm4gMDsKLSAgfQotICBwdHIgKz0gZW5jLT5taW5CeXRlc1BlckNoYXI7Ci0gIGMgPSB0b0FzY2lpKGVuYywgcHRyLCBlbmQpOwotICB3aGlsZSAoaXNTcGFjZShjKSkgewotICAgIHB0ciArPSBlbmMtPm1pbkJ5dGVzUGVyQ2hhcjsKLSAgICBjID0gdG9Bc2NpaShlbmMsIHB0ciwgZW5kKTsKLSAgfQotICBpZiAoYyAhPSAnIicgJiYgYyAhPSAnXCcnKSB7Ci0gICAgKm5leHRUb2tQdHIgPSBwdHI7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgb3BlbiA9IGM7Ci0gIHB0ciArPSBlbmMtPm1pbkJ5dGVzUGVyQ2hhcjsKLSAgKnZhbFB0ciA9IHB0cjsKLSAgZm9yICg7OyBwdHIgKz0gZW5jLT5taW5CeXRlc1BlckNoYXIpIHsKLSAgICBjID0gdG9Bc2NpaShlbmMsIHB0ciwgZW5kKTsKLSAgICBpZiAoYyA9PSBvcGVuKQotICAgICAgYnJlYWs7Ci0gICAgaWYgKCEoJ2EnIDw9IGMgJiYgYyA8PSAneicpCi0JJiYgISgnQScgPD0gYyAmJiBjIDw9ICdaJykKLQkmJiAhKCcwJyA8PSBjICYmIGMgPD0gJzknKQotCSYmIGMgIT0gJy4nCi0JJiYgYyAhPSAnLScKLQkmJiBjICE9ICdfJykgewotICAgICAgKm5leHRUb2tQdHIgPSBwdHI7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLSAgKm5leHRUb2tQdHIgPSBwdHIgKyBlbmMtPm1pbkJ5dGVzUGVyQ2hhcjsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYwotaW50IGRvUGFyc2VYbWxEZWNsKGNvbnN0IEVOQ09ESU5HICooKmVuY29kaW5nRmluZGVyKShjb25zdCBFTkNPRElORyAqLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLAotCQkJCQkJICAgICBjb25zdCBjaGFyICopLAotCQkgICBpbnQgaXNHZW5lcmFsVGV4dEVudGl0eSwKLQkJICAgY29uc3QgRU5DT0RJTkcgKmVuYywKLQkJICAgY29uc3QgY2hhciAqcHRyLAotCQkgICBjb25zdCBjaGFyICplbmQsCi0JCSAgIGNvbnN0IGNoYXIgKipiYWRQdHIsCi0JCSAgIGNvbnN0IGNoYXIgKip2ZXJzaW9uUHRyLAotCQkgICBjb25zdCBjaGFyICoqZW5jb2RpbmdOYW1lLAotCQkgICBjb25zdCBFTkNPRElORyAqKmVuY29kaW5nLAotCQkgICBpbnQgKnN0YW5kYWxvbmUpCi17Ci0gIGNvbnN0IGNoYXIgKnZhbCA9IDA7Ci0gIGNvbnN0IGNoYXIgKm5hbWUgPSAwOwotICBwdHIgKz0gNSAqIGVuYy0+bWluQnl0ZXNQZXJDaGFyOwotICBlbmQgLT0gMiAqIGVuYy0+bWluQnl0ZXNQZXJDaGFyOwotICBpZiAoIXBhcnNlUHNldWRvQXR0cmlidXRlKGVuYywgcHRyLCBlbmQsICZuYW1lLCAmdmFsLCAmcHRyKSB8fCAhbmFtZSkgewotICAgICpiYWRQdHIgPSBwdHI7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKCFYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywgbmFtZSwgInZlcnNpb24iKSkgewotICAgIGlmICghaXNHZW5lcmFsVGV4dEVudGl0eSkgewotICAgICAgKmJhZFB0ciA9IG5hbWU7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaWYgKHZlcnNpb25QdHIpCi0gICAgICAqdmVyc2lvblB0ciA9IHZhbDsKLSAgICBpZiAoIXBhcnNlUHNldWRvQXR0cmlidXRlKGVuYywgcHRyLCBlbmQsICZuYW1lLCAmdmFsLCAmcHRyKSkgewotICAgICAgKmJhZFB0ciA9IHB0cjsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoIW5hbWUpIHsKLSAgICAgIGlmIChpc0dlbmVyYWxUZXh0RW50aXR5KSB7Ci0JLyogYSBUZXh0RGVjbCBtdXN0IGhhdmUgYW4gRW5jb2RpbmdEZWNsICovCi0JKmJhZFB0ciA9IHB0cjsKLQlyZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotICBpZiAoWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsIG5hbWUsICJlbmNvZGluZyIpKSB7Ci0gICAgaW50IGMgPSB0b0FzY2lpKGVuYywgdmFsLCBlbmQpOwotICAgIGlmICghKCdhJyA8PSBjICYmIGMgPD0gJ3onKSAmJiAhKCdBJyA8PSBjICYmIGMgPD0gJ1onKSkgewotICAgICAgKmJhZFB0ciA9IHZhbDsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoZW5jb2RpbmdOYW1lKQotICAgICAgKmVuY29kaW5nTmFtZSA9IHZhbDsKLSAgICBpZiAoZW5jb2RpbmcpCi0gICAgICAqZW5jb2RpbmcgPSBlbmNvZGluZ0ZpbmRlcihlbmMsIHZhbCwgcHRyIC0gZW5jLT5taW5CeXRlc1BlckNoYXIpOwotICAgIGlmICghcGFyc2VQc2V1ZG9BdHRyaWJ1dGUoZW5jLCBwdHIsIGVuZCwgJm5hbWUsICZ2YWwsICZwdHIpKSB7Ci0gICAgICAqYmFkUHRyID0gcHRyOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmICghbmFtZSkKLSAgICAgIHJldHVybiAxOwotICB9Ci0gIGlmICghWG1sTmFtZU1hdGNoZXNBc2NpaShlbmMsIG5hbWUsICJzdGFuZGFsb25lIikgfHwgaXNHZW5lcmFsVGV4dEVudGl0eSkgewotICAgICpiYWRQdHIgPSBuYW1lOwotICAgIHJldHVybiAwOwotICB9Ci0gIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywgdmFsLCAieWVzIikpIHsKLSAgICBpZiAoc3RhbmRhbG9uZSkKLSAgICAgICpzdGFuZGFsb25lID0gMTsKLSAgfQotICBlbHNlIGlmIChYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywgdmFsLCAibm8iKSkgewotICAgIGlmIChzdGFuZGFsb25lKQotICAgICAgKnN0YW5kYWxvbmUgPSAwOwotICB9Ci0gIGVsc2UgewotICAgICpiYWRQdHIgPSB2YWw7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgd2hpbGUgKGlzU3BhY2UodG9Bc2NpaShlbmMsIHB0ciwgZW5kKSkpCi0gICAgcHRyICs9IGVuYy0+bWluQnl0ZXNQZXJDaGFyOwotICBpZiAocHRyICE9IGVuZCkgewotICAgICpiYWRQdHIgPSBwdHI7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYwotaW50IGNoZWNrQ2hhclJlZk51bWJlcihpbnQgcmVzdWx0KQotewotICBzd2l0Y2ggKHJlc3VsdCA+PiA4KSB7Ci0gIGNhc2UgMHhEODogY2FzZSAweEQ5OiBjYXNlIDB4REE6IGNhc2UgMHhEQjoKLSAgY2FzZSAweERDOiBjYXNlIDB4REQ6IGNhc2UgMHhERTogY2FzZSAweERGOgotICAgIHJldHVybiAtMTsKLSAgY2FzZSAwOgotICAgIGlmIChsYXRpbjFfZW5jb2RpbmcudHlwZVtyZXN1bHRdID09IEJUX05PTlhNTCkKLSAgICAgIHJldHVybiAtMTsKLSAgICBicmVhazsKLSAgY2FzZSAweEZGOgotICAgIGlmIChyZXN1bHQgPT0gMHhGRkZFIHx8IHJlc3VsdCA9PSAweEZGRkYpCi0gICAgICByZXR1cm4gLTE7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IFhtbFV0ZjhFbmNvZGUoaW50IGMsIGNoYXIgKmJ1ZikKLXsKLSAgZW51bSB7Ci0gICAgLyogbWluTiBpcyBtaW5pbXVtIGxlZ2FsIHJlc3VsdGluZyB2YWx1ZSBmb3IgTiBieXRlIHNlcXVlbmNlICovCi0gICAgbWluMiA9IDB4ODAsCi0gICAgbWluMyA9IDB4ODAwLAotICAgIG1pbjQgPSAweDEwMDAwCi0gIH07Ci0KLSAgaWYgKGMgPCAwKQotICAgIHJldHVybiAwOwotICBpZiAoYyA8IG1pbjIpIHsKLSAgICBidWZbMF0gPSAoYyB8IFVURjhfY3ZhbDEpOwotICAgIHJldHVybiAxOwotICB9Ci0gIGlmIChjIDwgbWluMykgewotICAgIGJ1ZlswXSA9ICgoYyA+PiA2KSB8IFVURjhfY3ZhbDIpOwotICAgIGJ1ZlsxXSA9ICgoYyAmIDB4M2YpIHwgMHg4MCk7Ci0gICAgcmV0dXJuIDI7Ci0gIH0KLSAgaWYgKGMgPCBtaW40KSB7Ci0gICAgYnVmWzBdID0gKChjID4+IDEyKSB8IFVURjhfY3ZhbDMpOwotICAgIGJ1ZlsxXSA9ICgoKGMgPj4gNikgJiAweDNmKSB8IDB4ODApOwotICAgIGJ1ZlsyXSA9ICgoYyAmIDB4M2YpIHwgMHg4MCk7Ci0gICAgcmV0dXJuIDM7Ci0gIH0KLSAgaWYgKGMgPCAweDExMDAwMCkgewotICAgIGJ1ZlswXSA9ICgoYyA+PiAxOCkgfCBVVEY4X2N2YWw0KTsKLSAgICBidWZbMV0gPSAoKChjID4+IDEyKSAmIDB4M2YpIHwgMHg4MCk7Ci0gICAgYnVmWzJdID0gKCgoYyA+PiA2KSAmIDB4M2YpIHwgMHg4MCk7Ci0gICAgYnVmWzNdID0gKChjICYgMHgzZikgfCAweDgwKTsKLSAgICByZXR1cm4gNDsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotaW50IFhtbFV0ZjE2RW5jb2RlKGludCBjaGFyTnVtLCB1bnNpZ25lZCBzaG9ydCAqYnVmKQotewotICBpZiAoY2hhck51bSA8IDApCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjaGFyTnVtIDwgMHgxMDAwMCkgewotICAgIGJ1ZlswXSA9IGNoYXJOdW07Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgaWYgKGNoYXJOdW0gPCAweDExMDAwMCkgewotICAgIGNoYXJOdW0gLT0gMHgxMDAwMDsKLSAgICBidWZbMF0gPSAoY2hhck51bSA+PiAxMCkgKyAweEQ4MDA7Ci0gICAgYnVmWzFdID0gKGNoYXJOdW0gJiAweDNGRikgKyAweERDMDA7Ci0gICAgcmV0dXJuIDI7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCB1bmtub3duX2VuY29kaW5nIHsKLSAgc3RydWN0IG5vcm1hbF9lbmNvZGluZyBub3JtYWw7Ci0gIGludCAoKmNvbnZlcnQpKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBjaGFyICpwKTsKLSAgdm9pZCAqdXNlckRhdGE7Ci0gIHVuc2lnbmVkIHNob3J0IHV0ZjE2WzI1Nl07Ci0gIGNoYXIgdXRmOFsyNTZdWzRdOwotfTsKLQotaW50IFhtbFNpemVPZlVua25vd25FbmNvZGluZyh2b2lkKQotewotICByZXR1cm4gc2l6ZW9mKHN0cnVjdCB1bmtub3duX2VuY29kaW5nKTsKLX0KLQotc3RhdGljCi1pbnQgdW5rbm93bl9pc05hbWUoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcCkKLXsKLSAgaW50IGMgPSAoKGNvbnN0IHN0cnVjdCB1bmtub3duX2VuY29kaW5nICopZW5jKQotCSAgLT5jb252ZXJ0KCgoY29uc3Qgc3RydWN0IHVua25vd25fZW5jb2RpbmcgKillbmMpLT51c2VyRGF0YSwgcCk7Ci0gIGlmIChjICYgfjB4RkZGRikKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIFVDUzJfR0VUX05BTUlORyhuYW1lUGFnZXMsIGMgPj4gOCwgYyAmIDB4RkYpOwotfQotCi1zdGF0aWMKLWludCB1bmtub3duX2lzTm1zdHJ0KGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnApCi17Ci0gIGludCBjID0gKChjb25zdCBzdHJ1Y3QgdW5rbm93bl9lbmNvZGluZyAqKWVuYykKLQkgIC0+Y29udmVydCgoKGNvbnN0IHN0cnVjdCB1bmtub3duX2VuY29kaW5nICopZW5jKS0+dXNlckRhdGEsIHApOwotICBpZiAoYyAmIH4weEZGRkYpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBVQ1MyX0dFVF9OQU1JTkcobm1zdHJ0UGFnZXMsIGMgPj4gOCwgYyAmIDB4RkYpOwotfQotCi1zdGF0aWMKLWludCB1bmtub3duX2lzSW52YWxpZChjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwKQotewotICBpbnQgYyA9ICgoY29uc3Qgc3RydWN0IHVua25vd25fZW5jb2RpbmcgKillbmMpCi0JICAgLT5jb252ZXJ0KCgoY29uc3Qgc3RydWN0IHVua25vd25fZW5jb2RpbmcgKillbmMpLT51c2VyRGF0YSwgcCk7Ci0gIHJldHVybiAoYyAmIH4weEZGRkYpIHx8IGNoZWNrQ2hhclJlZk51bWJlcihjKSA8IDA7Ci19Ci0KLXN0YXRpYwotdm9pZCB1bmtub3duX3RvVXRmOChjb25zdCBFTkNPRElORyAqZW5jLAotCQkgICAgY29uc3QgY2hhciAqKmZyb21QLCBjb25zdCBjaGFyICpmcm9tTGltLAotCQkgICAgY2hhciAqKnRvUCwgY29uc3QgY2hhciAqdG9MaW0pCi17Ci0gIGNoYXIgYnVmW1hNTF9VVEY4X0VOQ09ERV9NQVhdOwotICBmb3IgKDs7KSB7Ci0gICAgY29uc3QgY2hhciAqdXRmODsKLSAgICBpbnQgbjsKLSAgICBpZiAoKmZyb21QID09IGZyb21MaW0pCi0gICAgICBicmVhazsKLSAgICB1dGY4ID0gKChjb25zdCBzdHJ1Y3QgdW5rbm93bl9lbmNvZGluZyAqKWVuYyktPnV0ZjhbKHVuc2lnbmVkIGNoYXIpKipmcm9tUF07Ci0gICAgbiA9ICp1dGY4Kys7Ci0gICAgaWYgKG4gPT0gMCkgewotICAgICAgaW50IGMgPSAoKGNvbnN0IHN0cnVjdCB1bmtub3duX2VuY29kaW5nICopZW5jKQotCSAgICAgIC0+Y29udmVydCgoKGNvbnN0IHN0cnVjdCB1bmtub3duX2VuY29kaW5nICopZW5jKS0+dXNlckRhdGEsICpmcm9tUCk7Ci0gICAgICBuID0gWG1sVXRmOEVuY29kZShjLCBidWYpOwotICAgICAgaWYgKG4gPiB0b0xpbSAtICp0b1ApCi0JYnJlYWs7Ci0gICAgICB1dGY4ID0gYnVmOwotICAgICAgKmZyb21QICs9ICgoY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyAqKWVuYyktPnR5cGVbKHVuc2lnbmVkIGNoYXIpKipmcm9tUF0KLQkgICAgICAgICAtIChCVF9MRUFEMiAtIDIpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGlmIChuID4gdG9MaW0gLSAqdG9QKQotCWJyZWFrOwotICAgICAgKCpmcm9tUCkrKzsKLSAgICB9Ci0gICAgZG8gewotICAgICAgKigqdG9QKSsrID0gKnV0ZjgrKzsKLSAgICB9IHdoaWxlICgtLW4gIT0gMCk7Ci0gIH0KLX0KLQotc3RhdGljCi12b2lkIHVua25vd25fdG9VdGYxNihjb25zdCBFTkNPRElORyAqZW5jLAotCQkgICAgIGNvbnN0IGNoYXIgKipmcm9tUCwgY29uc3QgY2hhciAqZnJvbUxpbSwKLQkJICAgICB1bnNpZ25lZCBzaG9ydCAqKnRvUCwgY29uc3QgdW5zaWduZWQgc2hvcnQgKnRvTGltKQotewotICB3aGlsZSAoKmZyb21QICE9IGZyb21MaW0gJiYgKnRvUCAhPSB0b0xpbSkgewotICAgIHVuc2lnbmVkIHNob3J0IGMKLSAgICAgID0gKChjb25zdCBzdHJ1Y3QgdW5rbm93bl9lbmNvZGluZyAqKWVuYyktPnV0ZjE2Wyh1bnNpZ25lZCBjaGFyKSoqZnJvbVBdOwotICAgIGlmIChjID09IDApIHsKLSAgICAgIGMgPSAodW5zaWduZWQgc2hvcnQpKChjb25zdCBzdHJ1Y3QgdW5rbm93bl9lbmNvZGluZyAqKWVuYykKLQkgICAtPmNvbnZlcnQoKChjb25zdCBzdHJ1Y3QgdW5rbm93bl9lbmNvZGluZyAqKWVuYyktPnVzZXJEYXRhLCAqZnJvbVApOwotICAgICAgKmZyb21QICs9ICgoY29uc3Qgc3RydWN0IG5vcm1hbF9lbmNvZGluZyAqKWVuYyktPnR5cGVbKHVuc2lnbmVkIGNoYXIpKipmcm9tUF0KLQkgICAgICAgICAtIChCVF9MRUFEMiAtIDIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAoKmZyb21QKSsrOwotICAgICooKnRvUCkrKyA9IGM7Ci0gIH0KLX0KLQotRU5DT0RJTkcgKgotWG1sSW5pdFVua25vd25FbmNvZGluZyh2b2lkICptZW0sCi0JCSAgICAgICBpbnQgKnRhYmxlLAotCQkgICAgICAgaW50ICgqY29udmVydCkodm9pZCAqdXNlckRhdGEsIGNvbnN0IGNoYXIgKnApLAotCQkgICAgICAgdm9pZCAqdXNlckRhdGEpCi17Ci0gIGludCBpOwotICBzdHJ1Y3QgdW5rbm93bl9lbmNvZGluZyAqZSA9IG1lbTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3Qgbm9ybWFsX2VuY29kaW5nKTsgaSsrKQotICAgICgoY2hhciAqKW1lbSlbaV0gPSAoKGNoYXIgKikmbGF0aW4xX2VuY29kaW5nKVtpXTsKLSAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQotICAgIGlmIChsYXRpbjFfZW5jb2RpbmcudHlwZVtpXSAhPSBCVF9PVEhFUgotICAgICAgICAmJiBsYXRpbjFfZW5jb2RpbmcudHlwZVtpXSAhPSBCVF9OT05YTUwKLQkmJiB0YWJsZVtpXSAhPSBpKQotICAgICAgcmV0dXJuIDA7Ci0gIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotICAgIGludCBjID0gdGFibGVbaV07Ci0gICAgaWYgKGMgPT0gLTEpIHsKLSAgICAgIGUtPm5vcm1hbC50eXBlW2ldID0gQlRfTUFMRk9STTsKLSAgICAgIC8qIFRoaXMgc2hvdWxkbid0IHJlYWxseSBnZXQgdXNlZC4gKi8KLSAgICAgIGUtPnV0ZjE2W2ldID0gMHhGRkZGOwotICAgICAgZS0+dXRmOFtpXVswXSA9IDE7Ci0gICAgICBlLT51dGY4W2ldWzFdID0gMDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYyA8IDApIHsKLSAgICAgIGlmIChjIDwgLTQpCi0JcmV0dXJuIDA7Ci0gICAgICBlLT5ub3JtYWwudHlwZVtpXSA9IEJUX0xFQUQyIC0gKGMgKyAyKTsKLSAgICAgIGUtPnV0ZjhbaV1bMF0gPSAwOwotICAgICAgZS0+dXRmMTZbaV0gPSAwOwotICAgIH0KLSAgICBlbHNlIGlmIChjIDwgMHg4MCkgewotICAgICAgaWYgKGxhdGluMV9lbmNvZGluZy50eXBlW2NdICE9IEJUX09USEVSCi0JICAmJiBsYXRpbjFfZW5jb2RpbmcudHlwZVtjXSAhPSBCVF9OT05YTUwKLQkgICYmIGMgIT0gaSkKLQlyZXR1cm4gMDsKLSAgICAgIGUtPm5vcm1hbC50eXBlW2ldID0gbGF0aW4xX2VuY29kaW5nLnR5cGVbY107Ci0gICAgICBlLT51dGY4W2ldWzBdID0gMTsKLSAgICAgIGUtPnV0ZjhbaV1bMV0gPSAoY2hhciljOwotICAgICAgZS0+dXRmMTZbaV0gPSBjID09IDAgPyAweEZGRkYgOiBjOwotICAgIH0KLSAgICBlbHNlIGlmIChjaGVja0NoYXJSZWZOdW1iZXIoYykgPCAwKSB7Ci0gICAgICBlLT5ub3JtYWwudHlwZVtpXSA9IEJUX05PTlhNTDsKLSAgICAgIC8qIFRoaXMgc2hvdWxkbid0IHJlYWxseSBnZXQgdXNlZC4gKi8KLSAgICAgIGUtPnV0ZjE2W2ldID0gMHhGRkZGOwotICAgICAgZS0+dXRmOFtpXVswXSA9IDE7Ci0gICAgICBlLT51dGY4W2ldWzFdID0gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBpZiAoYyA+IDB4RkZGRikKLQlyZXR1cm4gMDsKLSAgICAgIGlmIChVQ1MyX0dFVF9OQU1JTkcobm1zdHJ0UGFnZXMsIGMgPj4gOCwgYyAmIDB4ZmYpKQotCWUtPm5vcm1hbC50eXBlW2ldID0gQlRfTk1TVFJUOwotICAgICAgZWxzZSBpZiAoVUNTMl9HRVRfTkFNSU5HKG5hbWVQYWdlcywgYyA+PiA4LCBjICYgMHhmZikpCi0JZS0+bm9ybWFsLnR5cGVbaV0gPSBCVF9OQU1FOwotICAgICAgZWxzZQotCWUtPm5vcm1hbC50eXBlW2ldID0gQlRfT1RIRVI7Ci0gICAgICBlLT51dGY4W2ldWzBdID0gKGNoYXIpWG1sVXRmOEVuY29kZShjLCBlLT51dGY4W2ldICsgMSk7Ci0gICAgICBlLT51dGYxNltpXSA9IGM7Ci0gICAgfQotICB9Ci0gIGUtPnVzZXJEYXRhID0gdXNlckRhdGE7Ci0gIGUtPmNvbnZlcnQgPSBjb252ZXJ0OwotICBpZiAoY29udmVydCkgewotICAgIGUtPm5vcm1hbC5pc05hbWUyID0gdW5rbm93bl9pc05hbWU7Ci0gICAgZS0+bm9ybWFsLmlzTmFtZTMgPSB1bmtub3duX2lzTmFtZTsKLSAgICBlLT5ub3JtYWwuaXNOYW1lNCA9IHVua25vd25faXNOYW1lOwotICAgIGUtPm5vcm1hbC5pc05tc3RydDIgPSB1bmtub3duX2lzTm1zdHJ0OwotICAgIGUtPm5vcm1hbC5pc05tc3RydDMgPSB1bmtub3duX2lzTm1zdHJ0OwotICAgIGUtPm5vcm1hbC5pc05tc3RydDQgPSB1bmtub3duX2lzTm1zdHJ0OwotICAgIGUtPm5vcm1hbC5pc0ludmFsaWQyID0gdW5rbm93bl9pc0ludmFsaWQ7Ci0gICAgZS0+bm9ybWFsLmlzSW52YWxpZDMgPSB1bmtub3duX2lzSW52YWxpZDsKLSAgICBlLT5ub3JtYWwuaXNJbnZhbGlkNCA9IHVua25vd25faXNJbnZhbGlkOwotICB9Ci0gIGUtPm5vcm1hbC5lbmMudXRmOENvbnZlcnQgPSB1bmtub3duX3RvVXRmODsKLSAgZS0+bm9ybWFsLmVuYy51dGYxNkNvbnZlcnQgPSB1bmtub3duX3RvVXRmMTY7Ci0gIHJldHVybiAmKGUtPm5vcm1hbC5lbmMpOwotfQotCi0vKiBJZiB0aGlzIGVudW1lcmF0aW9uIGlzIGNoYW5nZWQsIGdldEVuY29kaW5nSW5kZXggYW5kIGVuY29kaW5ncwotbXVzdCBhbHNvIGJlIGNoYW5nZWQuICovCi1lbnVtIHsKLSAgVU5LTk9XTl9FTkMgPSAtMSwKLSAgSVNPXzg4NTlfMV9FTkMgPSAwLAotICBVU19BU0NJSV9FTkMsCi0gIFVURl84X0VOQywKLSAgVVRGXzE2X0VOQywKLSAgVVRGXzE2QkVfRU5DLAotICBVVEZfMTZMRV9FTkMsCi0gIC8qIG11c3QgbWF0Y2ggZW5jb2RpbmdOYW1lcyB1cCB0byBoZXJlICovCi0gIE5PX0VOQwotfTsKLQotc3RhdGljCi1pbnQgZ2V0RW5jb2RpbmdJbmRleChjb25zdCBjaGFyICpuYW1lKQotewotICBzdGF0aWMgY29uc3QgY2hhciAqZW5jb2RpbmdOYW1lc1tdID0gewotICAgICJJU08tODg1OS0xIiwKLSAgICAiVVMtQVNDSUkiLAotICAgICJVVEYtOCIsCi0gICAgIlVURi0xNiIsCi0gICAgIlVURi0xNkJFIgotICAgICJVVEYtMTZMRSIsCi0gIH07Ci0gIGludCBpOwotICBpZiAobmFtZSA9PSAwKQotICAgIHJldHVybiBOT19FTkM7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoZW5jb2RpbmdOYW1lcykvc2l6ZW9mKGVuY29kaW5nTmFtZXNbMF0pOyBpKyspCi0gICAgaWYgKHN0cmVxY2kobmFtZSwgZW5jb2RpbmdOYW1lc1tpXSkpCi0gICAgICByZXR1cm4gaTsKLSAgcmV0dXJuIFVOS05PV05fRU5DOwotfQotCi0vKiBGb3IgYmluYXJ5IGNvbXBhdGliaWxpdHksIHdlIHN0b3JlIHRoZSBpbmRleCBvZiB0aGUgZW5jb2Rpbmcgc3BlY2lmaWVkCi1hdCBpbml0aWFsaXphdGlvbiBpbiB0aGUgaXNVdGYxNiBtZW1iZXIuICovCi0KLSNkZWZpbmUgSU5JVF9FTkNfSU5ERVgoZW5jKSAoKGVuYyktPmluaXRFbmMuaXNVdGYxNikKLQotLyogVGhpcyBpcyB3aGF0IGRldGVjdHMgdGhlIGVuY29kaW5nLgotZW5jb2RpbmdUYWJsZSBtYXBzIGZyb20gZW5jb2RpbmcgaW5kaWNlcyB0byBlbmNvZGluZ3M7Ci1JTklUX0VOQ19JTkRFWChlbmMpIGlzIHRoZSBpbmRleCBvZiB0aGUgZXh0ZXJuYWwgKHByb3RvY29sKSBzcGVjaWZpZWQgZW5jb2Rpbmc7Ci1zdGF0ZSBpcyBYTUxfQ09OVEVOVF9TVEFURSBpZiB3ZSdyZSBwYXJzaW5nIGFuIGV4dGVybmFsIHRleHQgZW50aXR5LAotYW5kIFhNTF9QUk9MT0dfU1RBVEUgb3RoZXJ3aXNlLgotKi8KLQotCi1zdGF0aWMKLWludCBpbml0U2Nhbihjb25zdCBFTkNPRElORyAqKmVuY29kaW5nVGFibGUsCi0JICAgICBjb25zdCBJTklUX0VOQ09ESU5HICplbmMsCi0JICAgICBpbnQgc3RhdGUsCi0JICAgICBjb25zdCBjaGFyICpwdHIsCi0JICAgICBjb25zdCBjaGFyICplbmQsCi0JICAgICBjb25zdCBjaGFyICoqbmV4dFRva1B0cikKLXsKLSAgY29uc3QgRU5DT0RJTkcgKiplbmNQdHI7Ci0KLSAgaWYgKHB0ciA9PSBlbmQpCi0gICAgcmV0dXJuIFhNTF9UT0tfTk9ORTsKLSAgZW5jUHRyID0gZW5jLT5lbmNQdHI7Ci0gIGlmIChwdHIgKyAxID09IGVuZCkgewotICAgIC8qIG9ubHkgYSBzaW5nbGUgYnl0ZSBhdmFpbGFibGUgZm9yIGF1dG8tZGV0ZWN0aW9uICovCi0gICAgLyogYSB3ZWxsLWZvcm1lZCBkb2N1bWVudCBlbnRpdHkgbXVzdCBoYXZlIG1vcmUgdGhhbiBvbmUgYnl0ZSAqLwotICAgIGlmIChzdGF0ZSAhPSBYTUxfQ09OVEVOVF9TVEFURSkKLSAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7Ci0gICAgLyogc28gd2UncmUgcGFyc2luZyBhbiBleHRlcm5hbCB0ZXh0IGVudGl0eS4uLiAqLwotICAgIC8qIGlmIFVURi0xNiB3YXMgZXh0ZXJuYWxseSBzcGVjaWZpZWQsIHRoZW4gd2UgbmVlZCBhdCBsZWFzdCAyIGJ5dGVzICovCi0gICAgc3dpdGNoIChJTklUX0VOQ19JTkRFWChlbmMpKSB7Ci0gICAgY2FzZSBVVEZfMTZfRU5DOgotICAgIGNhc2UgVVRGXzE2TEVfRU5DOgotICAgIGNhc2UgVVRGXzE2QkVfRU5DOgotICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKLSAgICB9Ci0gICAgc3dpdGNoICgodW5zaWduZWQgY2hhcikqcHRyKSB7Ci0gICAgY2FzZSAweEZFOgotICAgIGNhc2UgMHhGRjoKLSAgICBjYXNlIDB4RUY6IC8qIHBvc3NpYmx5IGZpcnN0IGJ5dGUgb2YgVVRGLTggQk9NICovCi0gICAgICBpZiAoSU5JVF9FTkNfSU5ERVgoZW5jKSA9PSBJU09fODg1OV8xX0VOQwotCSAgJiYgc3RhdGUgPT0gWE1MX0NPTlRFTlRfU1RBVEUpCi0JYnJlYWs7Ci0gICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICBjYXNlIDB4MDA6Ci0gICAgY2FzZSAweDNDOgotICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKLSAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgc3dpdGNoICgoKHVuc2lnbmVkIGNoYXIpcHRyWzBdIDw8IDgpIHwgKHVuc2lnbmVkIGNoYXIpcHRyWzFdKSB7Ci0gICAgY2FzZSAweEZFRkY6Ci0gICAgICBpZiAoSU5JVF9FTkNfSU5ERVgoZW5jKSA9PSBJU09fODg1OV8xX0VOQwotCSAgJiYgc3RhdGUgPT0gWE1MX0NPTlRFTlRfU1RBVEUpCi0JYnJlYWs7Ci0gICAgICAqbmV4dFRva1B0ciA9IHB0ciArIDI7Ci0gICAgICAqZW5jUHRyID0gZW5jb2RpbmdUYWJsZVtVVEZfMTZCRV9FTkNdOwotICAgICAgcmV0dXJuIFhNTF9UT0tfQk9NOwotICAgIC8qIDAwIDNDIGlzIGhhbmRsZWQgaW4gdGhlIGRlZmF1bHQgY2FzZSAqLwotICAgIGNhc2UgMHgzQzAwOgotICAgICAgaWYgKChJTklUX0VOQ19JTkRFWChlbmMpID09IFVURl8xNkJFX0VOQwotCSAgIHx8IElOSVRfRU5DX0lOREVYKGVuYykgPT0gVVRGXzE2X0VOQykKLQkgICYmIHN0YXRlID09IFhNTF9DT05URU5UX1NUQVRFKQotCWJyZWFrOwotICAgICAgKmVuY1B0ciA9IGVuY29kaW5nVGFibGVbVVRGXzE2TEVfRU5DXTsKLSAgICAgIHJldHVybiBYbWxUb2soKmVuY1B0ciwgc3RhdGUsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKTsKLSAgICBjYXNlIDB4RkZGRToKLSAgICAgIGlmIChJTklUX0VOQ19JTkRFWChlbmMpID09IElTT184ODU5XzFfRU5DCi0JICAmJiBzdGF0ZSA9PSBYTUxfQ09OVEVOVF9TVEFURSkKLQlicmVhazsKLSAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgMjsKLSAgICAgICplbmNQdHIgPSBlbmNvZGluZ1RhYmxlW1VURl8xNkxFX0VOQ107Ci0gICAgICByZXR1cm4gWE1MX1RPS19CT007Ci0gICAgY2FzZSAweEVGQkI6Ci0gICAgICAvKiBNYXliZSBhIFVURi04IEJPTSAoRUYgQkIgQkYpICovCi0gICAgICAvKiBJZiB0aGVyZSdzIGFuIGV4cGxpY2l0bHkgc3BlY2lmaWVkIChleHRlcm5hbCkgZW5jb2RpbmcKLSAgICAgICAgIG9mIElTTy04ODU5LTEgb3Igc29tZSBmbGF2b3VyIG9mIFVURi0xNgotICAgICAgICAgYW5kIHRoaXMgaXMgYW4gZXh0ZXJuYWwgdGV4dCBlbnRpdHksCi0JIGRvbid0IGxvb2sgZm9yIHRoZSBCT00sCi0gICAgICAgICBiZWNhdXNlIGl0IG1pZ2h0IGJlIGEgbGVnYWwgZGF0YS4gKi8KLSAgICAgIGlmIChzdGF0ZSA9PSBYTUxfQ09OVEVOVF9TVEFURSkgewotCWludCBlID0gSU5JVF9FTkNfSU5ERVgoZW5jKTsKLQlpZiAoZSA9PSBJU09fODg1OV8xX0VOQyB8fCBlID09IFVURl8xNkJFX0VOQyB8fCBlID09IFVURl8xNkxFX0VOQyB8fCBlID09IFVURl8xNl9FTkMpCi0JICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChwdHIgKyAyID09IGVuZCkKLQlyZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotICAgICAgaWYgKCh1bnNpZ25lZCBjaGFyKXB0clsyXSA9PSAweEJGKSB7Ci0JKmVuY1B0ciA9IGVuY29kaW5nVGFibGVbVVRGXzhfRU5DXTsKLQlyZXR1cm4gWE1MX1RPS19CT007Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKHB0clswXSA9PSAnXDAnKSB7Ci0JLyogMCBpc24ndCBhIGxlZ2FsIGRhdGEgY2hhcmFjdGVyLiBGdXJ0aGVybW9yZSBhIGRvY3VtZW50IGVudGl0eSBjYW4gb25seQotCSAgIHN0YXJ0IHdpdGggQVNDSUkgY2hhcmFjdGVycy4gIFNvIHRoZSBvbmx5IHdheSB0aGlzIGNhbiBmYWlsIHRvIGJlIGJpZy1lbmRpYW4KLQkgICBVVEYtMTYgaWYgaXQgaXQncyBhbiBleHRlcm5hbCBwYXJzZWQgZ2VuZXJhbCBlbnRpdHkgdGhhdCdzIGxhYmVsbGVkIGFzCi0JICAgVVRGLTE2TEUuICovCi0JaWYgKHN0YXRlID09IFhNTF9DT05URU5UX1NUQVRFICYmIElOSVRfRU5DX0lOREVYKGVuYykgPT0gVVRGXzE2TEVfRU5DKQotCSAgYnJlYWs7Ci0JKmVuY1B0ciA9IGVuY29kaW5nVGFibGVbVVRGXzE2QkVfRU5DXTsKLQlyZXR1cm4gWG1sVG9rKCplbmNQdHIsIHN0YXRlLCBwdHIsIGVuZCwgbmV4dFRva1B0cik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwdHJbMV0gPT0gJ1wwJykgewotCS8qIFdlIGNvdWxkIHJlY292ZXIgaGVyZSBpbiB0aGUgY2FzZToKLQkgICAgLSBwYXJzaW5nIGFuIGV4dGVybmFsIGVudGl0eQotCSAgICAtIHNlY29uZCBieXRlIGlzIDAKLQkgICAgLSBubyBleHRlcm5hbGx5IHNwZWNpZmllZCBlbmNvZGluZwotCSAgICAtIG5vIGVuY29kaW5nIGRlY2xhcmF0aW9uCi0JICAgYnkgYXNzdW1pbmcgVVRGLTE2TEUuICBCdXQgd2UgZG9uJ3QsIGJlY2F1c2UgdGhpcyB3b3VsZCBtZWFuIHdoZW4KLQkgICBwcmVzZW50ZWQganVzdCB3aXRoIGEgc2luZ2xlIGJ5dGUsIHdlIGNvdWxkbid0IHJlbGlhYmx5IGRldGVybWluZQotCSAgIHdoZXRoZXIgd2UgbmVlZGVkIGZ1cnRoZXIgYnl0ZXMuICovCi0JaWYgKHN0YXRlID09IFhNTF9DT05URU5UX1NUQVRFKQotCSAgYnJlYWs7Ci0JKmVuY1B0ciA9IGVuY29kaW5nVGFibGVbVVRGXzE2TEVfRU5DXTsKLQlyZXR1cm4gWG1sVG9rKCplbmNQdHIsIHN0YXRlLCBwdHIsIGVuZCwgbmV4dFRva1B0cik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgKmVuY1B0ciA9IGVuY29kaW5nVGFibGVbKGludClJTklUX0VOQ19JTkRFWChlbmMpXTsKLSAgcmV0dXJuIFhtbFRvaygqZW5jUHRyLCBzdGF0ZSwgcHRyLCBlbmQsIG5leHRUb2tQdHIpOwotfQotCi0KLSNkZWZpbmUgTlMoeCkgeAotI2RlZmluZSBucyh4KSB4Ci0jaW5jbHVkZSAieG1sdG9rX25zLmMiCi0jdW5kZWYgTlMKLSN1bmRlZiBucwotCi0jaWZkZWYgWE1MX05TCi0KLSNkZWZpbmUgTlMoeCkgeCAjIyBOUwotI2RlZmluZSBucyh4KSB4ICMjIF9ucwotCi0jaW5jbHVkZSAieG1sdG9rX25zLmMiCi0KLSN1bmRlZiBOUwotI3VuZGVmIG5zCi0KLUVOQ09ESU5HICoKLVhtbEluaXRVbmtub3duRW5jb2RpbmdOUyh2b2lkICptZW0sCi0JCSAgICAgICAgIGludCAqdGFibGUsCi0JCSAgICAgICAgIGludCAoKmNvbnZlcnQpKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBjaGFyICpwKSwKLQkJICAgICAgICAgdm9pZCAqdXNlckRhdGEpCi17Ci0gIEVOQ09ESU5HICplbmMgPSBYbWxJbml0VW5rbm93bkVuY29kaW5nKG1lbSwgdGFibGUsIGNvbnZlcnQsIHVzZXJEYXRhKTsKLSAgaWYgKGVuYykKLSAgICAoKHN0cnVjdCBub3JtYWxfZW5jb2RpbmcgKillbmMpLT50eXBlWyc6J10gPSBCVF9DT0xPTjsKLSAgcmV0dXJuIGVuYzsKLX0KLQotI2VuZGlmIC8qIFhNTF9OUyAqLwpkaWZmIC0tZ2l0IGEvc3JjbGliL2V4cGF0LWxpdGUveG1sdG9rLmggYi9zcmNsaWIvZXhwYXQtbGl0ZS94bWx0b2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQwZWQwOC4uMDAwMDAwMAotLS0gYS9zcmNsaWIvZXhwYXQtbGl0ZS94bWx0b2suaAorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKgotVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZQotVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbgotY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLWh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwotCi1Tb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiCi1iYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQotTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyByaWdodHMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLQotVGhlIE9yaWdpbmFsIENvZGUgaXMgZXhwYXQuCi0KLVRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBKYW1lcyBDbGFyay4KLVBvcnRpb25zIGNyZWF0ZWQgYnkgSmFtZXMgQ2xhcmsgYXJlIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OQotSmFtZXMgQ2xhcmsuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLUNvbnRyaWJ1dG9yKHMpOgotCi1BbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcwotb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICh0aGUgIkdQTCIpLCBpbiB3aGljaCBjYXNlIHRoZQotcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhvc2UgYWJvdmUuICBJZiB5b3UKLXdpc2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seSB1bmRlciB0aGUgdGVybXMgb2YKLXRoZSBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIKLXRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kCi1yZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZQotR1BMLiBJZiB5b3UgZG8gbm90IGRlbGV0ZSB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZQoteW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgR1BMLgotKi8KLQotI2lmbmRlZiBYbWxUb2tfSU5DTFVERUQKLSNkZWZpbmUgWG1sVG9rX0lOQ0xVREVEIDEKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWZuZGVmIFhNTFRPS0FQSQotI2RlZmluZSBYTUxUT0tBUEkgLyogYXMgbm90aGluZyAqLwotI2VuZGlmCi0KLS8qIFRoZSBmb2xsb3dpbmcgdG9rZW4gbWF5IGJlIHJldHVybmVkIGJ5IFhtbENvbnRlbnRUb2sgKi8KLSNkZWZpbmUgWE1MX1RPS19UUkFJTElOR19SU1FCIC01IC8qIF0gb3IgXV0gYXQgdGhlIGVuZCBvZiB0aGUgc2NhbjsgbWlnaHQgYmUgc3RhcnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlsbGVnYWwgXV0+IHNlcXVlbmNlICovCi0vKiBUaGUgZm9sbG93aW5nIHRva2VucyBtYXkgYmUgcmV0dXJuZWQgYnkgYm90aCBYbWxQcm9sb2dUb2sgYW5kIFhtbENvbnRlbnRUb2sgKi8KLSNkZWZpbmUgWE1MX1RPS19OT05FIC00ICAgIC8qIFRoZSBzdHJpbmcgdG8gYmUgc2Nhbm5lZCBpcyBlbXB0eSAqLwotI2RlZmluZSBYTUxfVE9LX1RSQUlMSU5HX0NSIC0zIC8qIEEgQ1IgYXQgdGhlIGVuZCBvZiB0aGUgc2NhbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWdodCBiZSBwYXJ0IG9mIENSTEYgc2VxdWVuY2UgKi8gCi0jZGVmaW5lIFhNTF9UT0tfUEFSVElBTF9DSEFSIC0yIC8qIG9ubHkgcGFydCBvZiBhIG11bHRpYnl0ZSBzZXF1ZW5jZSAqLwotI2RlZmluZSBYTUxfVE9LX1BBUlRJQUwgLTEgLyogb25seSBwYXJ0IG9mIGEgdG9rZW4gKi8KLSNkZWZpbmUgWE1MX1RPS19JTlZBTElEIDAKLQotLyogVGhlIGZvbGxvd2luZyB0b2tlbnMgYXJlIHJldHVybmVkIGJ5IFhtbENvbnRlbnRUb2s7IHNvbWUgYXJlIGFsc28KLSAgcmV0dXJuZWQgYnkgWG1sQXR0cmlidXRlVmFsdWVUb2ssIFhtbEVudGl0eVRvaywgWG1sQ2RhdGFTZWN0aW9uVG9rICovCi0KLSNkZWZpbmUgWE1MX1RPS19TVEFSVF9UQUdfV0lUSF9BVFRTIDEKLSNkZWZpbmUgWE1MX1RPS19TVEFSVF9UQUdfTk9fQVRUUyAyCi0jZGVmaW5lIFhNTF9UT0tfRU1QVFlfRUxFTUVOVF9XSVRIX0FUVFMgMyAvKiBlbXB0eSBlbGVtZW50IHRhZyA8ZS8+ICovCi0jZGVmaW5lIFhNTF9UT0tfRU1QVFlfRUxFTUVOVF9OT19BVFRTIDQKLSNkZWZpbmUgWE1MX1RPS19FTkRfVEFHIDUKLSNkZWZpbmUgWE1MX1RPS19EQVRBX0NIQVJTIDYKLSNkZWZpbmUgWE1MX1RPS19EQVRBX05FV0xJTkUgNwotI2RlZmluZSBYTUxfVE9LX0NEQVRBX1NFQ1RfT1BFTiA4Ci0jZGVmaW5lIFhNTF9UT0tfRU5USVRZX1JFRiA5Ci0jZGVmaW5lIFhNTF9UT0tfQ0hBUl9SRUYgMTAgICAgIC8qIG51bWVyaWMgY2hhcmFjdGVyIHJlZmVyZW5jZSAqLwotCi0vKiBUaGUgZm9sbG93aW5nIHRva2VucyBtYXkgYmUgcmV0dXJuZWQgYnkgYm90aCBYbWxQcm9sb2dUb2sgYW5kIFhtbENvbnRlbnRUb2sgKi8KLSNkZWZpbmUgWE1MX1RPS19QSSAxMSAgICAgIC8qIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgWE1MX1RPS19YTUxfREVDTCAxMiAvKiBYTUwgZGVjbCBvciB0ZXh0IGRlY2wgKi8KLSNkZWZpbmUgWE1MX1RPS19DT01NRU5UIDEzCi0jZGVmaW5lIFhNTF9UT0tfQk9NIDE0ICAgICAvKiBCeXRlIG9yZGVyIG1hcmsgKi8KLQotLyogVGhlIGZvbGxvd2luZyB0b2tlbnMgYXJlIHJldHVybmVkIG9ubHkgYnkgWG1sUHJvbG9nVG9rICovCi0jZGVmaW5lIFhNTF9UT0tfUFJPTE9HX1MgMTUKLSNkZWZpbmUgWE1MX1RPS19ERUNMX09QRU4gMTYgLyogPCFmb28gKi8KLSNkZWZpbmUgWE1MX1RPS19ERUNMX0NMT1NFIDE3IC8qID4gKi8KLSNkZWZpbmUgWE1MX1RPS19OQU1FIDE4Ci0jZGVmaW5lIFhNTF9UT0tfTk1UT0tFTiAxOQotI2RlZmluZSBYTUxfVE9LX1BPVU5EX05BTUUgMjAgLyogI25hbWUgKi8KLSNkZWZpbmUgWE1MX1RPS19PUiAyMSAvKiB8ICovCi0jZGVmaW5lIFhNTF9UT0tfUEVSQ0VOVCAyMgotI2RlZmluZSBYTUxfVE9LX09QRU5fUEFSRU4gMjMKLSNkZWZpbmUgWE1MX1RPS19DTE9TRV9QQVJFTiAyNAotI2RlZmluZSBYTUxfVE9LX09QRU5fQlJBQ0tFVCAyNQotI2RlZmluZSBYTUxfVE9LX0NMT1NFX0JSQUNLRVQgMjYKLSNkZWZpbmUgWE1MX1RPS19MSVRFUkFMIDI3Ci0jZGVmaW5lIFhNTF9UT0tfUEFSQU1fRU5USVRZX1JFRiAyOAotI2RlZmluZSBYTUxfVE9LX0lOU1RBTkNFX1NUQVJUIDI5Ci0KLS8qIFRoZSBmb2xsb3dpbmcgb2NjdXIgb25seSBpbiBlbGVtZW50IHR5cGUgZGVjbGFyYXRpb25zICovCi0jZGVmaW5lIFhNTF9UT0tfTkFNRV9RVUVTVElPTiAzMCAvKiBuYW1lPyAqLwotI2RlZmluZSBYTUxfVE9LX05BTUVfQVNURVJJU0sgMzEgLyogbmFtZSogKi8KLSNkZWZpbmUgWE1MX1RPS19OQU1FX1BMVVMgMzIgLyogbmFtZSsgKi8KLSNkZWZpbmUgWE1MX1RPS19DT05EX1NFQ1RfT1BFTiAzMyAvKiA8IVsgKi8KLSNkZWZpbmUgWE1MX1RPS19DT05EX1NFQ1RfQ0xPU0UgMzQgLyogXV0+ICovCi0jZGVmaW5lIFhNTF9UT0tfQ0xPU0VfUEFSRU5fUVVFU1RJT04gMzUgLyogKT8gKi8KLSNkZWZpbmUgWE1MX1RPS19DTE9TRV9QQVJFTl9BU1RFUklTSyAzNiAvKiApKiAqLwotI2RlZmluZSBYTUxfVE9LX0NMT1NFX1BBUkVOX1BMVVMgMzcgLyogKSsgKi8KLSNkZWZpbmUgWE1MX1RPS19DT01NQSAzOAotCi0vKiBUaGUgZm9sbG93aW5nIHRva2VuIGlzIHJldHVybmVkIG9ubHkgYnkgWG1sQXR0cmlidXRlVmFsdWVUb2sgKi8KLSNkZWZpbmUgWE1MX1RPS19BVFRSSUJVVEVfVkFMVUVfUyAzOQotCi0vKiBUaGUgZm9sbG93aW5nIHRva2VuIGlzIHJldHVybmVkIG9ubHkgYnkgWG1sQ2RhdGFTZWN0aW9uVG9rICovCi0jZGVmaW5lIFhNTF9UT0tfQ0RBVEFfU0VDVF9DTE9TRSA0MAotCi0vKiBXaXRoIG5hbWVzcGFjZSBwcm9jZXNzaW5nIHRoaXMgaXMgcmV0dXJuZWQgYnkgWG1sUHJvbG9nVG9rCi0gICBmb3IgYSBuYW1lIHdpdGggYSBjb2xvbi4gKi8KLSNkZWZpbmUgWE1MX1RPS19QUkVGSVhFRF9OQU1FIDQxCi0KLSNkZWZpbmUgWE1MX05fU1RBVEVTIDMKLSNkZWZpbmUgWE1MX1BST0xPR19TVEFURSAwCi0jZGVmaW5lIFhNTF9DT05URU5UX1NUQVRFIDEKLSNkZWZpbmUgWE1MX0NEQVRBX1NFQ1RJT05fU1RBVEUgMgotCi0jZGVmaW5lIFhNTF9OX0xJVEVSQUxfVFlQRVMgMgotI2RlZmluZSBYTUxfQVRUUklCVVRFX1ZBTFVFX0xJVEVSQUwgMAotI2RlZmluZSBYTUxfRU5USVRZX1ZBTFVFX0xJVEVSQUwgMQotCi0vKiBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHBhc3NlZCB0byBYbWxVdGY4RW5jb2RlIG11c3QgYmUgYXQgbGVhc3QgdGhpcy4gKi8KLSNkZWZpbmUgWE1MX1VURjhfRU5DT0RFX01BWCA0Ci0vKiBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHBhc3NlZCB0byBYbWxVdGYxNkVuY29kZSBtdXN0IGJlIGF0IGxlYXN0IHRoaXMuICovCi0jZGVmaW5lIFhNTF9VVEYxNl9FTkNPREVfTUFYIDIKLQotdHlwZWRlZiBzdHJ1Y3QgcG9zaXRpb24gewotICAvKiBmaXJzdCBsaW5lIGFuZCBmaXJzdCBjb2x1bW4gYXJlIDAgbm90IDEgKi8KLSAgdW5zaWduZWQgbG9uZyBsaW5lTnVtYmVyOwotICB1bnNpZ25lZCBsb25nIGNvbHVtbk51bWJlcjsKLX0gUE9TSVRJT047Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgY29uc3QgY2hhciAqdmFsdWVQdHI7Ci0gIGNvbnN0IGNoYXIgKnZhbHVlRW5kOwotICBjaGFyIG5vcm1hbGl6ZWQ7Ci19IEFUVFJJQlVURTsKLQotc3RydWN0IGVuY29kaW5nOwotdHlwZWRlZiBzdHJ1Y3QgZW5jb2RpbmcgRU5DT0RJTkc7Ci0KLXN0cnVjdCBlbmNvZGluZyB7Ci0gIGludCAoKnNjYW5uZXJzW1hNTF9OX1NUQVRFU10pKGNvbnN0IEVOQ09ESU5HICosCi0JCQkgICAgICAgIGNvbnN0IGNoYXIgKiwKLQkJCSAgICAgICAgY29uc3QgY2hhciAqLAotCQkJICAgICAgICBjb25zdCBjaGFyICoqKTsKLSAgaW50ICgqbGl0ZXJhbFNjYW5uZXJzW1hNTF9OX0xJVEVSQUxfVFlQRVNdKShjb25zdCBFTkNPRElORyAqLAotCQkJCQkgICAgICBjb25zdCBjaGFyICosCi0JCQkJCSAgICAgIGNvbnN0IGNoYXIgKiwKLQkJCQkJICAgICAgY29uc3QgY2hhciAqKik7Ci0gIGludCAoKnNhbWVOYW1lKShjb25zdCBFTkNPRElORyAqLAotCSAgICAgICAgICBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci0gIGludCAoKm5hbWVNYXRjaGVzQXNjaWkpKGNvbnN0IEVOQ09ESU5HICosCi0JCQkgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLSAgaW50ICgqbmFtZUxlbmd0aCkoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKLSAgY29uc3QgY2hhciAqKCpza2lwUykoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqKTsKLSAgaW50ICgqZ2V0QXR0cykoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLAotCSAgICAgICAgIGludCBhdHRzTWF4LCBBVFRSSUJVVEUgKmF0dHMpOwotICBpbnQgKCpjaGFyUmVmTnVtYmVyKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIpOwotICBpbnQgKCpwcmVkZWZpbmVkRW50aXR5TmFtZSkoY29uc3QgRU5DT0RJTkcgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotICB2b2lkICgqdXBkYXRlUG9zaXRpb24pKGNvbnN0IEVOQ09ESU5HICosCi0JCQkgY29uc3QgY2hhciAqcHRyLAotCQkJIGNvbnN0IGNoYXIgKmVuZCwKLQkJCSBQT1NJVElPTiAqKTsKLSAgaW50ICgqaXNQdWJsaWNJZCkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQsCi0JCSAgICBjb25zdCBjaGFyICoqYmFkUHRyKTsKLSAgdm9pZCAoKnV0ZjhDb252ZXJ0KShjb25zdCBFTkNPRElORyAqZW5jLAotCQkgICAgICBjb25zdCBjaGFyICoqZnJvbVAsCi0JCSAgICAgIGNvbnN0IGNoYXIgKmZyb21MaW0sCi0JCSAgICAgIGNoYXIgKip0b1AsCi0JCSAgICAgIGNvbnN0IGNoYXIgKnRvTGltKTsKLSAgdm9pZCAoKnV0ZjE2Q29udmVydCkoY29uc3QgRU5DT0RJTkcgKmVuYywKLQkJICAgICAgIGNvbnN0IGNoYXIgKipmcm9tUCwKLQkJICAgICAgIGNvbnN0IGNoYXIgKmZyb21MaW0sCi0JCSAgICAgICB1bnNpZ25lZCBzaG9ydCAqKnRvUCwKLQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICp0b0xpbSk7Ci0gIGludCBtaW5CeXRlc1BlckNoYXI7Ci0gIGNoYXIgaXNVdGY4OwotICBjaGFyIGlzVXRmMTY7Ci19OwotCi0vKgotU2NhbiB0aGUgc3RyaW5nIHN0YXJ0aW5nIGF0IHB0ciB1bnRpbCB0aGUgZW5kIG9mIHRoZSBuZXh0IGNvbXBsZXRlIHRva2VuLAotYnV0IGRvIG5vdCBzY2FuIHBhc3QgZXB0ci4gIFJldHVybiBhbiBpbnRlZ2VyIGdpdmluZyB0aGUgdHlwZSBvZiB0b2tlbi4KLQotUmV0dXJuIFhNTF9UT0tfTk9ORSB3aGVuIHB0ciA9PSBlcHRyOyBuZXh0VG9rUHRyIHdpbGwgbm90IGJlIHNldC4KLQotUmV0dXJuIFhNTF9UT0tfUEFSVElBTCB3aGVuIHRoZSBzdHJpbmcgZG9lcyBub3QgY29udGFpbiBhIGNvbXBsZXRlIHRva2VuOwotbmV4dFRva1B0ciB3aWxsIG5vdCBiZSBzZXQuCi0KLVJldHVybiBYTUxfVE9LX0lOVkFMSUQgd2hlbiB0aGUgc3RyaW5nIGRvZXMgbm90IHN0YXJ0IGEgdmFsaWQgdG9rZW47IG5leHRUb2tQdHIKLXdpbGwgYmUgc2V0IHRvIHBvaW50IHRvIHRoZSBjaGFyYWN0ZXIgd2hpY2ggbWFkZSB0aGUgdG9rZW4gaW52YWxpZC4KLQotT3RoZXJ3aXNlIHRoZSBzdHJpbmcgc3RhcnRzIHdpdGggYSB2YWxpZCB0b2tlbjsgbmV4dFRva1B0ciB3aWxsIGJlIHNldCB0byBwb2ludAotdG8gdGhlIGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlIGVuZCBvZiB0aGF0IHRva2VuLgotCi1FYWNoIGRhdGEgY2hhcmFjdGVyIGNvdW50cyBhcyBhIHNpbmdsZSB0b2tlbiwgYnV0IGFkamFjZW50IGRhdGEgY2hhcmFjdGVycwotbWF5IGJlIHJldHVybmVkIHRvZ2V0aGVyLiAgU2ltaWxhcmx5IGZvciBjaGFyYWN0ZXJzIGluIHRoZSBwcm9sb2cgb3V0c2lkZQotbGl0ZXJhbHMsIGNvbW1lbnRzIGFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucy4KLSovCi0KLQotI2RlZmluZSBYbWxUb2soZW5jLCBzdGF0ZSwgcHRyLCBlbmQsIG5leHRUb2tQdHIpIFwKLSAgKCgoZW5jKS0+c2Nhbm5lcnNbc3RhdGVdKShlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKSkKLQotI2RlZmluZSBYbWxQcm9sb2dUb2soZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikgXAotICAgWG1sVG9rKGVuYywgWE1MX1BST0xPR19TVEFURSwgcHRyLCBlbmQsIG5leHRUb2tQdHIpCi0KLSNkZWZpbmUgWG1sQ29udGVudFRvayhlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKSBcCi0gICBYbWxUb2soZW5jLCBYTUxfQ09OVEVOVF9TVEFURSwgcHRyLCBlbmQsIG5leHRUb2tQdHIpCi0KLSNkZWZpbmUgWG1sQ2RhdGFTZWN0aW9uVG9rKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpIFwKLSAgIFhtbFRvayhlbmMsIFhNTF9DREFUQV9TRUNUSU9OX1NUQVRFLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKLQotLyogVGhpcyBpcyB1c2VkIGZvciBwZXJmb3JtaW5nIGEgMm5kLWxldmVsIHRva2VuaXphdGlvbiBvbgotdGhlIGNvbnRlbnQgb2YgYSBsaXRlcmFsIHRoYXQgaGFzIGFscmVhZHkgYmVlbiByZXR1cm5lZCBieSBYbWxUb2suICovIAotCi0jZGVmaW5lIFhtbExpdGVyYWxUb2soZW5jLCBsaXRlcmFsVHlwZSwgcHRyLCBlbmQsIG5leHRUb2tQdHIpIFwKLSAgKCgoZW5jKS0+bGl0ZXJhbFNjYW5uZXJzW2xpdGVyYWxUeXBlXSkoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikpCi0KLSNkZWZpbmUgWG1sQXR0cmlidXRlVmFsdWVUb2soZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikgXAotICAgWG1sTGl0ZXJhbFRvayhlbmMsIFhNTF9BVFRSSUJVVEVfVkFMVUVfTElURVJBTCwgcHRyLCBlbmQsIG5leHRUb2tQdHIpCi0KLSNkZWZpbmUgWG1sRW50aXR5VmFsdWVUb2soZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikgXAotICAgWG1sTGl0ZXJhbFRvayhlbmMsIFhNTF9FTlRJVFlfVkFMVUVfTElURVJBTCwgcHRyLCBlbmQsIG5leHRUb2tQdHIpCi0KLSNkZWZpbmUgWG1sU2FtZU5hbWUoZW5jLCBwdHIxLCBwdHIyKSAoKChlbmMpLT5zYW1lTmFtZSkoZW5jLCBwdHIxLCBwdHIyKSkKLQotI2RlZmluZSBYbWxOYW1lTWF0Y2hlc0FzY2lpKGVuYywgcHRyMSwgcHRyMikgXAotICAoKChlbmMpLT5uYW1lTWF0Y2hlc0FzY2lpKShlbmMsIHB0cjEsIHB0cjIpKQotCi0jZGVmaW5lIFhtbE5hbWVMZW5ndGgoZW5jLCBwdHIpIFwKLSAgKCgoZW5jKS0+bmFtZUxlbmd0aCkoZW5jLCBwdHIpKQotCi0jZGVmaW5lIFhtbFNraXBTKGVuYywgcHRyKSBcCi0gICgoKGVuYyktPnNraXBTKShlbmMsIHB0cikpCi0KLSNkZWZpbmUgWG1sR2V0QXR0cmlidXRlcyhlbmMsIHB0ciwgYXR0c01heCwgYXR0cykgXAotICAoKChlbmMpLT5nZXRBdHRzKShlbmMsIHB0ciwgYXR0c01heCwgYXR0cykpCi0KLSNkZWZpbmUgWG1sQ2hhclJlZk51bWJlcihlbmMsIHB0cikgXAotICAoKChlbmMpLT5jaGFyUmVmTnVtYmVyKShlbmMsIHB0cikpCi0KLSNkZWZpbmUgWG1sUHJlZGVmaW5lZEVudGl0eU5hbWUoZW5jLCBwdHIsIGVuZCkgXAotICAoKChlbmMpLT5wcmVkZWZpbmVkRW50aXR5TmFtZSkoZW5jLCBwdHIsIGVuZCkpCi0KLSNkZWZpbmUgWG1sVXBkYXRlUG9zaXRpb24oZW5jLCBwdHIsIGVuZCwgcG9zKSBcCi0gICgoKGVuYyktPnVwZGF0ZVBvc2l0aW9uKShlbmMsIHB0ciwgZW5kLCBwb3MpKQotCi0jZGVmaW5lIFhtbElzUHVibGljSWQoZW5jLCBwdHIsIGVuZCwgYmFkUHRyKSBcCi0gICgoKGVuYyktPmlzUHVibGljSWQpKGVuYywgcHRyLCBlbmQsIGJhZFB0cikpCi0KLSNkZWZpbmUgWG1sVXRmOENvbnZlcnQoZW5jLCBmcm9tUCwgZnJvbUxpbSwgdG9QLCB0b0xpbSkgXAotICAoKChlbmMpLT51dGY4Q29udmVydCkoZW5jLCBmcm9tUCwgZnJvbUxpbSwgdG9QLCB0b0xpbSkpCi0KLSNkZWZpbmUgWG1sVXRmMTZDb252ZXJ0KGVuYywgZnJvbVAsIGZyb21MaW0sIHRvUCwgdG9MaW0pIFwKLSAgKCgoZW5jKS0+dXRmMTZDb252ZXJ0KShlbmMsIGZyb21QLCBmcm9tTGltLCB0b1AsIHRvTGltKSkKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBFTkNPRElORyBpbml0RW5jOwotICBjb25zdCBFTkNPRElORyAqKmVuY1B0cjsKLX0gSU5JVF9FTkNPRElORzsKLQotaW50IFhNTFRPS0FQSSBYbWxQYXJzZVhtbERlY2woaW50IGlzR2VuZXJhbFRleHRFbnRpdHksCi0JCQkgICAgICBjb25zdCBFTkNPRElORyAqZW5jLAotCQkJICAgICAgY29uc3QgY2hhciAqcHRyLAotCSAgCQkgICAgICBjb25zdCBjaGFyICplbmQsCi0JCQkgICAgICBjb25zdCBjaGFyICoqYmFkUHRyLAotCQkJICAgICAgY29uc3QgY2hhciAqKnZlcnNpb25QdHIsCi0JCQkgICAgICBjb25zdCBjaGFyICoqZW5jb2RpbmdOYW1lUHRyLAotCQkJICAgICAgY29uc3QgRU5DT0RJTkcgKipuYW1lZEVuY29kaW5nUHRyLAotCQkJICAgICAgaW50ICpzdGFuZGFsb25lUHRyKTsKLQotaW50IFhNTFRPS0FQSSBYbWxJbml0RW5jb2RpbmcoSU5JVF9FTkNPRElORyAqLCBjb25zdCBFTkNPRElORyAqKiwgY29uc3QgY2hhciAqbmFtZSk7Ci1jb25zdCBFTkNPRElORyBYTUxUT0tBUEkgKlhtbEdldFV0ZjhJbnRlcm5hbEVuY29kaW5nKHZvaWQpOwotY29uc3QgRU5DT0RJTkcgWE1MVE9LQVBJICpYbWxHZXRVdGYxNkludGVybmFsRW5jb2Rpbmcodm9pZCk7Ci1pbnQgWE1MVE9LQVBJIFhtbFV0ZjhFbmNvZGUoaW50IGNoYXJOdW1iZXIsIGNoYXIgKmJ1Zik7Ci1pbnQgWE1MVE9LQVBJIFhtbFV0ZjE2RW5jb2RlKGludCBjaGFyTnVtYmVyLCB1bnNpZ25lZCBzaG9ydCAqYnVmKTsKLQotaW50IFhNTFRPS0FQSSBYbWxTaXplT2ZVbmtub3duRW5jb2Rpbmcodm9pZCk7Ci1FTkNPRElORyBYTUxUT0tBUEkgKgotWG1sSW5pdFVua25vd25FbmNvZGluZyh2b2lkICptZW0sCi0JCSAgICAgICBpbnQgKnRhYmxlLAotCQkgICAgICAgaW50ICgqY29udikodm9pZCAqdXNlckRhdGEsIGNvbnN0IGNoYXIgKnApLAotCQkgICAgICAgdm9pZCAqdXNlckRhdGEpOwotCi1pbnQgWE1MVE9LQVBJIFhtbFBhcnNlWG1sRGVjbE5TKGludCBpc0dlbmVyYWxUZXh0RW50aXR5LAotCQkJICAgICAgICBjb25zdCBFTkNPRElORyAqZW5jLAotCQkJICAgICAgICBjb25zdCBjaGFyICpwdHIsCi0JICAJCSAgICAgICAgY29uc3QgY2hhciAqZW5kLAotCQkJICAgICAgICBjb25zdCBjaGFyICoqYmFkUHRyLAotCQkJICAgICAgICBjb25zdCBjaGFyICoqdmVyc2lvblB0ciwKLQkJCSAgICAgICAgY29uc3QgY2hhciAqKmVuY29kaW5nTmFtZVB0ciwKLQkJCSAgICAgICAgY29uc3QgRU5DT0RJTkcgKipuYW1lZEVuY29kaW5nUHRyLAotCQkJICAgICAgICBpbnQgKnN0YW5kYWxvbmVQdHIpOwotaW50IFhNTFRPS0FQSSBYbWxJbml0RW5jb2RpbmdOUyhJTklUX0VOQ09ESU5HICosIGNvbnN0IEVOQ09ESU5HICoqLCBjb25zdCBjaGFyICpuYW1lKTsKLWNvbnN0IEVOQ09ESU5HIFhNTFRPS0FQSSAqWG1sR2V0VXRmOEludGVybmFsRW5jb2RpbmdOUyh2b2lkKTsKLWNvbnN0IEVOQ09ESU5HIFhNTFRPS0FQSSAqWG1sR2V0VXRmMTZJbnRlcm5hbEVuY29kaW5nTlModm9pZCk7Ci1FTkNPRElORyBYTUxUT0tBUEkgKgotWG1sSW5pdFVua25vd25FbmNvZGluZ05TKHZvaWQgKm1lbSwKLQkJICAgICAgICAgaW50ICp0YWJsZSwKLQkJICAgICAgICAgaW50ICgqY29udikodm9pZCAqdXNlckRhdGEsIGNvbnN0IGNoYXIgKnApLAotCQkgICAgICAgICB2b2lkICp1c2VyRGF0YSk7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogbm90IFhtbFRva19JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvc3JjbGliL2V4cGF0LWxpdGUveG1sdG9rX2ltcGwuYyBiL3NyY2xpYi9leHBhdC1saXRlL3htbHRva19pbXBsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MjUzOWIuLjAwMDAwMDAKLS0tIGEvc3JjbGliL2V4cGF0LWxpdGUveG1sdG9rX2ltcGwuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NDYgKzAsMCBAQAotLyoKLVRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljIExpY2Vuc2UKLVZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4KLWNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KLQotU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIgotYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLUxpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLVRoZSBPcmlnaW5hbCBDb2RlIGlzIGV4cGF0LgotCi1UaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgSmFtZXMgQ2xhcmsuCi1Qb3J0aW9ucyBjcmVhdGVkIGJ5IEphbWVzIENsYXJrIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkKLUphbWVzIENsYXJrLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1Db250cmlidXRvcihzKToKLQotQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMKLW9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAodGhlICJHUEwiKSwgaW4gd2hpY2ggY2FzZSB0aGUKLXByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRob3NlIGFib3ZlLiAgSWYgeW91Ci13aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyCi10aGUgTVBMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZAotcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUKLUdQTC4gSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UKLXlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4KLSovCi0KLSNpZm5kZWYgSVNfSU5WQUxJRF9DSEFSCi0jZGVmaW5lIElTX0lOVkFMSURfQ0hBUihlbmMsIHB0ciwgbikgKDApCi0jZW5kaWYKLQotI2RlZmluZSBJTlZBTElEX0xFQURfQ0FTRShuLCBwdHIsIG5leHRUb2tQdHIpIFwKLSAgICBjYXNlIEJUX0xFQUQgIyMgbjogXAotICAgICAgaWYgKGVuZCAtIHB0ciA8IG4pIFwKLQlyZXR1cm4gWE1MX1RPS19QQVJUSUFMX0NIQVI7IFwKLSAgICAgIGlmIChJU19JTlZBTElEX0NIQVIoZW5jLCBwdHIsIG4pKSB7IFwKLSAgICAgICAgKihuZXh0VG9rUHRyKSA9IChwdHIpOyBcCi0gICAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7IFwKLSAgICAgIH0gXAotICAgICAgcHRyICs9IG47IFwKLSAgICAgIGJyZWFrOwotCi0jZGVmaW5lIElOVkFMSURfQ0FTRVMocHRyLCBuZXh0VG9rUHRyKSBcCi0gIElOVkFMSURfTEVBRF9DQVNFKDIsIHB0ciwgbmV4dFRva1B0cikgXAotICBJTlZBTElEX0xFQURfQ0FTRSgzLCBwdHIsIG5leHRUb2tQdHIpIFwKLSAgSU5WQUxJRF9MRUFEX0NBU0UoNCwgcHRyLCBuZXh0VG9rUHRyKSBcCi0gIGNhc2UgQlRfTk9OWE1MOiBcCi0gIGNhc2UgQlRfTUFMRk9STTogXAotICBjYXNlIEJUX1RSQUlMOiBcCi0gICAgKihuZXh0VG9rUHRyKSA9IChwdHIpOyBcCi0gICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKLQotI2RlZmluZSBDSEVDS19OQU1FX0NBU0UobiwgZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikgXAotICAgY2FzZSBCVF9MRUFEICMjIG46IFwKLSAgICAgaWYgKGVuZCAtIHB0ciA8IG4pIFwKLSAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMX0NIQVI7IFwKLSAgICAgaWYgKCFJU19OQU1FX0NIQVIoZW5jLCBwdHIsIG4pKSB7IFwKLSAgICAgICAqbmV4dFRva1B0ciA9IHB0cjsgXAotICAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7IFwKLSAgICAgfSBcCi0gICAgIHB0ciArPSBuOyBcCi0gICAgIGJyZWFrOwotCi0jZGVmaW5lIENIRUNLX05BTUVfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikgXAotICBjYXNlIEJUX05PTkFTQ0lJOiBcCi0gICAgaWYgKCFJU19OQU1FX0NIQVJfTUlOQlBDKGVuYywgcHRyKSkgeyBcCi0gICAgICAqbmV4dFRva1B0ciA9IHB0cjsgXAotICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsgXAotICAgIH0gXAotICBjYXNlIEJUX05NU1RSVDogXAotICBjYXNlIEJUX0hFWDogXAotICBjYXNlIEJUX0RJR0lUOiBcCi0gIGNhc2UgQlRfTkFNRTogXAotICBjYXNlIEJUX01JTlVTOiBcCi0gICAgcHRyICs9IE1JTkJQQyhlbmMpOyBcCi0gICAgYnJlYWs7IFwKLSAgQ0hFQ0tfTkFNRV9DQVNFKDIsIGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpIFwKLSAgQ0hFQ0tfTkFNRV9DQVNFKDMsIGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpIFwKLSAgQ0hFQ0tfTkFNRV9DQVNFKDQsIGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCi0KLSNkZWZpbmUgQ0hFQ0tfTk1TVFJUX0NBU0UobiwgZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikgXAotICAgY2FzZSBCVF9MRUFEICMjIG46IFwKLSAgICAgaWYgKGVuZCAtIHB0ciA8IG4pIFwKLSAgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMX0NIQVI7IFwKLSAgICAgaWYgKCFJU19OTVNUUlRfQ0hBUihlbmMsIHB0ciwgbikpIHsgXAotICAgICAgICpuZXh0VG9rUHRyID0gcHRyOyBcCi0gICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsgXAotICAgICB9IFwKLSAgICAgcHRyICs9IG47IFwKLSAgICAgYnJlYWs7Ci0KLSNkZWZpbmUgQ0hFQ0tfTk1TVFJUX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpIFwKLSAgY2FzZSBCVF9OT05BU0NJSTogXAotICAgIGlmICghSVNfTk1TVFJUX0NIQVJfTUlOQlBDKGVuYywgcHRyKSkgeyBcCi0gICAgICAqbmV4dFRva1B0ciA9IHB0cjsgXAotICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsgXAotICAgIH0gXAotICBjYXNlIEJUX05NU1RSVDogXAotICBjYXNlIEJUX0hFWDogXAotICAgIHB0ciArPSBNSU5CUEMoZW5jKTsgXAotICAgIGJyZWFrOyBcCi0gIENIRUNLX05NU1RSVF9DQVNFKDIsIGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpIFwKLSAgQ0hFQ0tfTk1TVFJUX0NBU0UoMywgZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikgXAotICBDSEVDS19OTVNUUlRfQ0FTRSg0LCBlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKQotCi0jaWZuZGVmIFBSRUZJWAotI2RlZmluZSBQUkVGSVgoaWRlbnQpIGlkZW50Ci0jZW5kaWYKLQotLyogcHRyIHBvaW50cyB0byBjaGFyYWN0ZXIgZm9sbG93aW5nICI8IS0iICovCi0KLXN0YXRpYwotaW50IFBSRUZJWChzY2FuQ29tbWVudCkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQsCi0JCQljb25zdCBjaGFyICoqbmV4dFRva1B0cikKLXsKLSAgaWYgKHB0ciAhPSBlbmQpIHsKLSAgICBpZiAoIUNIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgJy0nKSkgewotICAgICAgKm5leHRUb2tQdHIgPSBwdHI7Ci0gICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOwotICAgIH0KLSAgICBwdHIgKz0gTUlOQlBDKGVuYyk7Ci0gICAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKLSAgICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgewotICAgICAgSU5WQUxJRF9DQVNFUyhwdHIsIG5leHRUb2tQdHIpCi0gICAgICBjYXNlIEJUX01JTlVTOgotCWlmICgocHRyICs9IE1JTkJQQyhlbmMpKSA9PSBlbmQpCi0JICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotCWlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIsICctJykpIHsKLQkgIGlmICgocHRyICs9IE1JTkJQQyhlbmMpKSA9PSBlbmQpCi0JICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7Ci0JICBpZiAoIUNIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgJz4nKSkgewotCSAgICAqbmV4dFRva1B0ciA9IHB0cjsKLQkgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKLQkgIH0KLQkgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7Ci0JICByZXR1cm4gWE1MX1RPS19DT01NRU5UOwotCX0KLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JcHRyICs9IE1JTkJQQyhlbmMpOwotCWJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotfQotCi0vKiBwdHIgcG9pbnRzIHRvIGNoYXJhY3RlciBmb2xsb3dpbmcgIjwhIiAqLwotCi1zdGF0aWMKLWludCBQUkVGSVgoc2NhbkRlY2wpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kLAotCQkgICAgIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQotewotICBpZiAocHRyID09IGVuZCkKLSAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKLSAgY2FzZSBCVF9NSU5VUzoKLSAgICByZXR1cm4gUFJFRklYKHNjYW5Db21tZW50KShlbmMsIHB0ciArIE1JTkJQQyhlbmMpLCBlbmQsIG5leHRUb2tQdHIpOwotICBjYXNlIEJUX0xTUUI6Ci0gICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKLSAgICByZXR1cm4gWE1MX1RPS19DT05EX1NFQ1RfT1BFTjsKLSAgY2FzZSBCVF9OTVNUUlQ6Ci0gIGNhc2UgQlRfSEVYOgotICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICAqbmV4dFRva1B0ciA9IHB0cjsKLSAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOwotICB9Ci0gIHdoaWxlIChwdHIgIT0gZW5kKSB7Ci0gICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7Ci0gICAgY2FzZSBCVF9QRVJDTlQ6Ci0gICAgICBpZiAocHRyICsgTUlOQlBDKGVuYykgPT0gZW5kKQotCXJldHVybiBYTUxfVE9LX1BBUlRJQUw7Ci0gICAgICAvKiBkb24ndCBhbGxvdyA8IUVOVElUWSUgZm9vICJ3aGF0ZXZlciI+ICovCi0gICAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0ciArIE1JTkJQQyhlbmMpKSkgewotICAgICAgY2FzZSBCVF9TOiBjYXNlIEJUX0NSOiBjYXNlIEJUX0xGOiBjYXNlIEJUX1BFUkNOVDoKLQkqbmV4dFRva1B0ciA9IHB0cjsKLQlyZXR1cm4gWE1MX1RPS19JTlZBTElEOwotICAgICAgfQotICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSBCVF9TOiBjYXNlIEJUX0NSOiBjYXNlIEJUX0xGOgotICAgICAgKm5leHRUb2tQdHIgPSBwdHI7Ci0gICAgICByZXR1cm4gWE1MX1RPS19ERUNMX09QRU47Ci0gICAgY2FzZSBCVF9OTVNUUlQ6Ci0gICAgY2FzZSBCVF9IRVg6Ci0gICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgKm5leHRUb2tQdHIgPSBwdHI7Ci0gICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOwotICAgIH0KLSAgfQotICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotfQotCi1zdGF0aWMKLWludCBQUkVGSVgoY2hlY2tQaVRhcmdldCkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQsIGludCAqdG9rUHRyKQotewotICBpbnQgdXBwZXIgPSAwOwotICAqdG9rUHRyID0gWE1MX1RPS19QSTsKLSAgaWYgKGVuZCAtIHB0ciAhPSBNSU5CUEMoZW5jKSozKQotICAgIHJldHVybiAxOwotICBzd2l0Y2ggKEJZVEVfVE9fQVNDSUkoZW5jLCBwdHIpKSB7Ci0gIGNhc2UgJ3gnOgotICAgIGJyZWFrOwotICBjYXNlICdYJzoKLSAgICB1cHBlciA9IDE7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgcHRyICs9IE1JTkJQQyhlbmMpOwotICBzd2l0Y2ggKEJZVEVfVE9fQVNDSUkoZW5jLCBwdHIpKSB7Ci0gIGNhc2UgJ20nOgotICAgIGJyZWFrOwotICBjYXNlICdNJzoKLSAgICB1cHBlciA9IDE7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgcHRyICs9IE1JTkJQQyhlbmMpOwotICBzd2l0Y2ggKEJZVEVfVE9fQVNDSUkoZW5jLCBwdHIpKSB7Ci0gIGNhc2UgJ2wnOgotICAgIGJyZWFrOwotICBjYXNlICdMJzoKLSAgICB1cHBlciA9IDE7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgaWYgKHVwcGVyKQotICAgIHJldHVybiAwOwotICAqdG9rUHRyID0gWE1MX1RPS19YTUxfREVDTDsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIHB0ciBwb2ludHMgdG8gY2hhcmFjdGVyIGZvbGxvd2luZyAiPD8iICovCi0KLXN0YXRpYwotaW50IFBSRUZJWChzY2FuUGkpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kLAotCQkgICBjb25zdCBjaGFyICoqbmV4dFRva1B0cikKLXsKLSAgaW50IHRvazsKLSAgY29uc3QgY2hhciAqdGFyZ2V0ID0gcHRyOwotICBpZiAocHRyID09IGVuZCkKLSAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKLSAgQ0hFQ0tfTk1TVFJUX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCi0gIGRlZmF1bHQ6Ci0gICAgKm5leHRUb2tQdHIgPSBwdHI7Ci0gICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKLSAgfQotICB3aGlsZSAocHRyICE9IGVuZCkgewotICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgewotICAgIENIRUNLX05BTUVfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKLSAgICBjYXNlIEJUX1M6IGNhc2UgQlRfQ1I6IGNhc2UgQlRfTEY6Ci0gICAgICBpZiAoIVBSRUZJWChjaGVja1BpVGFyZ2V0KShlbmMsIHRhcmdldCwgcHRyLCAmdG9rKSkgewotCSpuZXh0VG9rUHRyID0gcHRyOwotCXJldHVybiBYTUxfVE9LX0lOVkFMSUQ7Ci0gICAgICB9Ci0gICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7Ci0gICAgICB3aGlsZSAocHRyICE9IGVuZCkgewotICAgICAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKLSAgICAgICAgSU5WQUxJRF9DQVNFUyhwdHIsIG5leHRUb2tQdHIpCi0JY2FzZSBCVF9RVUVTVDoKLQkgIHB0ciArPSBNSU5CUEMoZW5jKTsKLQkgIGlmIChwdHIgPT0gZW5kKQotCSAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotCSAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgJz4nKSkgewotCSAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOwotCSAgICByZXR1cm4gdG9rOwotCSAgfQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHB0ciArPSBNSU5CUEMoZW5jKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIH0KLSAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7Ci0gICAgY2FzZSBCVF9RVUVTVDoKLSAgICAgIGlmICghUFJFRklYKGNoZWNrUGlUYXJnZXQpKGVuYywgdGFyZ2V0LCBwdHIsICZ0b2spKSB7Ci0JKm5leHRUb2tQdHIgPSBwdHI7Ci0JcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKLSAgICAgIH0KLSAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKLSAgICAgIGlmIChwdHIgPT0gZW5kKQotCXJldHVybiBYTUxfVE9LX1BBUlRJQUw7Ci0gICAgICBpZiAoQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCAnPicpKSB7Ci0JKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKLQlyZXR1cm4gdG9rOwotICAgICAgfQotICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgZGVmYXVsdDoKLSAgICAgICpuZXh0VG9rUHRyID0gcHRyOwotICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKLX0KLQotCi1zdGF0aWMKLWludCBQUkVGSVgoc2NhbkNkYXRhU2VjdGlvbikoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQsCi0JCQkgICAgIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQotewotICBpbnQgaTsKLSAgLyogQ0RBVEFbICovCi0gIGlmIChlbmQgLSBwdHIgPCA2ICogTUlOQlBDKGVuYykpCi0gICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKLSAgZm9yIChpID0gMDsgaSA8IDY7IGkrKywgcHRyICs9IE1JTkJQQyhlbmMpKSB7Ci0gICAgaWYgKCFDSEFSX01BVENIRVMoZW5jLCBwdHIsICJDREFUQVsiW2ldKSkgewotICAgICAgKm5leHRUb2tQdHIgPSBwdHI7Ci0gICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOwotICAgIH0KLSAgfQotICAqbmV4dFRva1B0ciA9IHB0cjsKLSAgcmV0dXJuIFhNTF9UT0tfQ0RBVEFfU0VDVF9PUEVOOwotfQotCi1zdGF0aWMKLWludCBQUkVGSVgoY2RhdGFTZWN0aW9uVG9rKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsIGNvbnN0IGNoYXIgKmVuZCwKLQkJCSAgICBjb25zdCBjaGFyICoqbmV4dFRva1B0cikKLXsKLSAgaWYgKHB0ciA9PSBlbmQpCi0gICAgcmV0dXJuIFhNTF9UT0tfTk9ORTsKLSAgaWYgKE1JTkJQQyhlbmMpID4gMSkgewotICAgIHNpemVfdCBuID0gZW5kIC0gcHRyOwotICAgIGlmIChuICYgKE1JTkJQQyhlbmMpIC0gMSkpIHsKLSAgICAgIG4gJj0gfihNSU5CUEMoZW5jKSAtIDEpOwotICAgICAgaWYgKG4gPT0gMCkKLQlyZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotICAgICAgZW5kID0gcHRyICsgbjsKLSAgICB9Ci0gIH0KLSAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7Ci0gIGNhc2UgQlRfUlNRQjoKLSAgICBwdHIgKz0gTUlOQlBDKGVuYyk7Ci0gICAgaWYgKHB0ciA9PSBlbmQpCi0gICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotICAgIGlmICghQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCAnXScpKQotICAgICAgYnJlYWs7Ci0gICAgcHRyICs9IE1JTkJQQyhlbmMpOwotICAgIGlmIChwdHIgPT0gZW5kKQotICAgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKLSAgICBpZiAoIUNIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgJz4nKSkgewotICAgICAgcHRyIC09IE1JTkJQQyhlbmMpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7Ci0gICAgcmV0dXJuIFhNTF9UT0tfQ0RBVEFfU0VDVF9DTE9TRTsKLSAgY2FzZSBCVF9DUjoKLSAgICBwdHIgKz0gTUlOQlBDKGVuYyk7Ci0gICAgaWYgKHB0ciA9PSBlbmQpCi0gICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotICAgIGlmIChCWVRFX1RZUEUoZW5jLCBwdHIpID09IEJUX0xGKQotICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOwotICAgICpuZXh0VG9rUHRyID0gcHRyOwotICAgIHJldHVybiBYTUxfVE9LX0RBVEFfTkVXTElORTsKLSAgY2FzZSBCVF9MRjoKLSAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOwotICAgIHJldHVybiBYTUxfVE9LX0RBVEFfTkVXTElORTsKLSAgSU5WQUxJRF9DQVNFUyhwdHIsIG5leHRUb2tQdHIpCi0gIGRlZmF1bHQ6Ci0gICAgcHRyICs9IE1JTkJQQyhlbmMpOwotICAgIGJyZWFrOwotICB9Ci0gIHdoaWxlIChwdHIgIT0gZW5kKSB7Ci0gICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7Ci0jZGVmaW5lIExFQURfQ0FTRShuKSBcCi0gICAgY2FzZSBCVF9MRUFEICMjIG46IFwKLSAgICAgIGlmIChlbmQgLSBwdHIgPCBuIHx8IElTX0lOVkFMSURfQ0hBUihlbmMsIHB0ciwgbikpIHsgXAotCSpuZXh0VG9rUHRyID0gcHRyOyBcCi0JcmV0dXJuIFhNTF9UT0tfREFUQV9DSEFSUzsgXAotICAgICAgfSBcCi0gICAgICBwdHIgKz0gbjsgXAotICAgICAgYnJlYWs7Ci0gICAgTEVBRF9DQVNFKDIpIExFQURfQ0FTRSgzKSBMRUFEX0NBU0UoNCkKLSN1bmRlZiBMRUFEX0NBU0UKLSAgICBjYXNlIEJUX05PTlhNTDoKLSAgICBjYXNlIEJUX01BTEZPUk06Ci0gICAgY2FzZSBCVF9UUkFJTDoKLSAgICBjYXNlIEJUX0NSOgotICAgIGNhc2UgQlRfTEY6Ci0gICAgY2FzZSBCVF9SU1FCOgotICAgICAgKm5leHRUb2tQdHIgPSBwdHI7Ci0gICAgICByZXR1cm4gWE1MX1RPS19EQVRBX0NIQVJTOwotICAgIGRlZmF1bHQ6Ci0gICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgKm5leHRUb2tQdHIgPSBwdHI7Ci0gIHJldHVybiBYTUxfVE9LX0RBVEFfQ0hBUlM7Ci19Ci0KLS8qIHB0ciBwb2ludHMgdG8gY2hhcmFjdGVyIGZvbGxvd2luZyAiPC8iICovCi0KLXN0YXRpYwotaW50IFBSRUZJWChzY2FuRW5kVGFnKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsIGNvbnN0IGNoYXIgKmVuZCwKLQkJICAgICAgIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQotewotICBpZiAocHRyID09IGVuZCkKLSAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKLSAgQ0hFQ0tfTk1TVFJUX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCi0gIGRlZmF1bHQ6Ci0gICAgKm5leHRUb2tQdHIgPSBwdHI7Ci0gICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKLSAgfQotICB3aGlsZSAocHRyICE9IGVuZCkgewotICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgewotICAgIENIRUNLX05BTUVfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKLSAgICBjYXNlIEJUX1M6IGNhc2UgQlRfQ1I6IGNhc2UgQlRfTEY6Ci0gICAgICBmb3IgKHB0ciArPSBNSU5CUEMoZW5jKTsgcHRyICE9IGVuZDsgcHRyICs9IE1JTkJQQyhlbmMpKSB7Ci0Jc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7Ci0JY2FzZSBCVF9TOiBjYXNlIEJUX0NSOiBjYXNlIEJUX0xGOgotCSAgYnJlYWs7Ci0JY2FzZSBCVF9HVDoKLQkgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7Ci0gICAgICAgICAgcmV0dXJuIFhNTF9UT0tfRU5EX1RBRzsKLQlkZWZhdWx0OgotCSAgKm5leHRUb2tQdHIgPSBwdHI7Ci0JICByZXR1cm4gWE1MX1RPS19JTlZBTElEOwotCX0KLSAgICAgIH0KLSAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7Ci0jaWZkZWYgWE1MX05TCi0gICAgY2FzZSBCVF9DT0xPTjoKLSAgICAgIC8qIG5vIG5lZWQgdG8gY2hlY2sgcW5hbWUgc3ludGF4IGhlcmUsIHNpbmNlIGVuZC10YWcgbXVzdCBtYXRjaCBleGFjdGx5ICovCi0gICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGNhc2UgQlRfR1Q6Ci0gICAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOwotICAgICAgcmV0dXJuIFhNTF9UT0tfRU5EX1RBRzsKLSAgICBkZWZhdWx0OgotICAgICAgKm5leHRUb2tQdHIgPSBwdHI7Ci0gICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOwotICAgIH0KLSAgfQotICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotfQotCi0vKiBwdHIgcG9pbnRzIHRvIGNoYXJhY3RlciBmb2xsb3dpbmcgIiYjWCIgKi8KLQotc3RhdGljCi1pbnQgUFJFRklYKHNjYW5IZXhDaGFyUmVmKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsIGNvbnN0IGNoYXIgKmVuZCwKLQkJCSAgIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQotewotICBpZiAocHRyICE9IGVuZCkgewotICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgewotICAgIGNhc2UgQlRfRElHSVQ6Ci0gICAgY2FzZSBCVF9IRVg6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgKm5leHRUb2tQdHIgPSBwdHI7Ci0gICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOwotICAgIH0KLSAgICBmb3IgKHB0ciArPSBNSU5CUEMoZW5jKTsgcHRyICE9IGVuZDsgcHRyICs9IE1JTkJQQyhlbmMpKSB7Ci0gICAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKLSAgICAgIGNhc2UgQlRfRElHSVQ6Ci0gICAgICBjYXNlIEJUX0hFWDoKLQlicmVhazsKLSAgICAgIGNhc2UgQlRfU0VNSToKLQkqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOwotCXJldHVybiBYTUxfVE9LX0NIQVJfUkVGOwotICAgICAgZGVmYXVsdDoKLQkqbmV4dFRva1B0ciA9IHB0cjsKLQlyZXR1cm4gWE1MX1RPS19JTlZBTElEOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotfQotCi0vKiBwdHIgcG9pbnRzIHRvIGNoYXJhY3RlciBmb2xsb3dpbmcgIiYjIiAqLwotCi1zdGF0aWMKLWludCBQUkVGSVgoc2NhbkNoYXJSZWYpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kLAotCQkJY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCi17Ci0gIGlmIChwdHIgIT0gZW5kKSB7Ci0gICAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgJ3gnKSkKLSAgICAgIHJldHVybiBQUkVGSVgoc2NhbkhleENoYXJSZWYpKGVuYywgcHRyICsgTUlOQlBDKGVuYyksIGVuZCwgbmV4dFRva1B0cik7Ci0gICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7Ci0gICAgY2FzZSBCVF9ESUdJVDoKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAqbmV4dFRva1B0ciA9IHB0cjsKLSAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7Ci0gICAgfQotICAgIGZvciAocHRyICs9IE1JTkJQQyhlbmMpOyBwdHIgIT0gZW5kOyBwdHIgKz0gTUlOQlBDKGVuYykpIHsKLSAgICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgewotICAgICAgY2FzZSBCVF9ESUdJVDoKLQlicmVhazsKLSAgICAgIGNhc2UgQlRfU0VNSToKLQkqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOwotCXJldHVybiBYTUxfVE9LX0NIQVJfUkVGOwotICAgICAgZGVmYXVsdDoKLQkqbmV4dFRva1B0ciA9IHB0cjsKLQlyZXR1cm4gWE1MX1RPS19JTlZBTElEOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotfQotCi0vKiBwdHIgcG9pbnRzIHRvIGNoYXJhY3RlciBmb2xsb3dpbmcgIiYiICovCi0KLXN0YXRpYwotaW50IFBSRUZJWChzY2FuUmVmKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsIGNvbnN0IGNoYXIgKmVuZCwKLQkJICAgIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQotewotICBpZiAocHRyID09IGVuZCkKLSAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKLSAgQ0hFQ0tfTk1TVFJUX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCi0gIGNhc2UgQlRfTlVNOgotICAgIHJldHVybiBQUkVGSVgoc2NhbkNoYXJSZWYpKGVuYywgcHRyICsgTUlOQlBDKGVuYyksIGVuZCwgbmV4dFRva1B0cik7Ci0gIGRlZmF1bHQ6Ci0gICAgKm5leHRUb2tQdHIgPSBwdHI7Ci0gICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKLSAgfQotICB3aGlsZSAocHRyICE9IGVuZCkgewotICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgewotICAgIENIRUNLX05BTUVfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKLSAgICBjYXNlIEJUX1NFTUk6Ci0gICAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOwotICAgICAgcmV0dXJuIFhNTF9UT0tfRU5USVRZX1JFRjsKLSAgICBkZWZhdWx0OgotICAgICAgKm5leHRUb2tQdHIgPSBwdHI7Ci0gICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOwotICAgIH0KLSAgfQotICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotfQotCi0vKiBwdHIgcG9pbnRzIHRvIGNoYXJhY3RlciBmb2xsb3dpbmcgZmlyc3QgY2hhcmFjdGVyIG9mIGF0dHJpYnV0ZSBuYW1lICovCi0KLXN0YXRpYwotaW50IFBSRUZJWChzY2FuQXR0cykoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQsCi0JCSAgICAgY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCi17Ci0jaWZkZWYgWE1MX05TCi0gIGludCBoYWRDb2xvbiA9IDA7Ci0jZW5kaWYKLSAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKLSAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKLSAgICBDSEVDS19OQU1FX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCi0jaWZkZWYgWE1MX05TCi0gICAgY2FzZSBCVF9DT0xPTjoKLSAgICAgIGlmIChoYWRDb2xvbikgewotCSpuZXh0VG9rUHRyID0gcHRyOwotCXJldHVybiBYTUxfVE9LX0lOVkFMSUQ7Ci0gICAgICB9Ci0gICAgICBoYWRDb2xvbiA9IDE7Ci0gICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7Ci0gICAgICBpZiAocHRyID09IGVuZCkKLQlyZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotICAgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7Ci0gICAgICBDSEVDS19OTVNUUlRfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKLSAgICAgIGRlZmF1bHQ6Ci0JKm5leHRUb2tQdHIgPSBwdHI7Ci0JcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgY2FzZSBCVF9TOiBjYXNlIEJUX0NSOiBjYXNlIEJUX0xGOgotICAgICAgZm9yICg7OykgewotCWludCB0OwotCi0JcHRyICs9IE1JTkJQQyhlbmMpOwotCWlmIChwdHIgPT0gZW5kKQotCSAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKLQl0ID0gQllURV9UWVBFKGVuYywgcHRyKTsKLQlpZiAodCA9PSBCVF9FUVVBTFMpCi0JICBicmVhazsKLQlzd2l0Y2ggKHQpIHsKLQljYXNlIEJUX1M6Ci0JY2FzZSBCVF9MRjoKLQljYXNlIEJUX0NSOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICpuZXh0VG9rUHRyID0gcHRyOwotCSAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKLQl9Ci0gICAgICB9Ci0gICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSBCVF9FUVVBTFM6Ci0gICAgICB7Ci0JaW50IG9wZW47Ci0jaWZkZWYgWE1MX05TCi0JaGFkQ29sb24gPSAwOwotI2VuZGlmCi0JZm9yICg7OykgewotCSAgCi0JICBwdHIgKz0gTUlOQlBDKGVuYyk7Ci0JICBpZiAocHRyID09IGVuZCkKLQkgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKLQkgIG9wZW4gPSBCWVRFX1RZUEUoZW5jLCBwdHIpOwotCSAgaWYgKG9wZW4gPT0gQlRfUVVPVCB8fCBvcGVuID09IEJUX0FQT1MpCi0JICAgIGJyZWFrOwotCSAgc3dpdGNoIChvcGVuKSB7Ci0JICBjYXNlIEJUX1M6Ci0JICBjYXNlIEJUX0xGOgotCSAgY2FzZSBCVF9DUjoKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICAqbmV4dFRva1B0ciA9IHB0cjsKLQkgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKLQkgIH0KLQl9Ci0JcHRyICs9IE1JTkJQQyhlbmMpOwotCS8qIGluIGF0dHJpYnV0ZSB2YWx1ZSAqLwotCWZvciAoOzspIHsKLQkgIGludCB0OwotCSAgaWYgKHB0ciA9PSBlbmQpCi0JICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7Ci0JICB0ID0gQllURV9UWVBFKGVuYywgcHRyKTsKLQkgIGlmICh0ID09IG9wZW4pCi0JICAgIGJyZWFrOwotCSAgc3dpdGNoICh0KSB7Ci0JICBJTlZBTElEX0NBU0VTKHB0ciwgbmV4dFRva1B0cikKLQkgIGNhc2UgQlRfQU1QOgotCSAgICB7Ci0JICAgICAgaW50IHRvayA9IFBSRUZJWChzY2FuUmVmKShlbmMsIHB0ciArIE1JTkJQQyhlbmMpLCBlbmQsICZwdHIpOwotCSAgICAgIGlmICh0b2sgPD0gMCkgewotCQlpZiAodG9rID09IFhNTF9UT0tfSU5WQUxJRCkKLQkJICAqbmV4dFRva1B0ciA9IHB0cjsKLQkJcmV0dXJuIHRvazsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGNhc2UgQlRfTFQ6Ci0JICAgICpuZXh0VG9rUHRyID0gcHRyOwotCSAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOwotCSAgZGVmYXVsdDoKLQkgICAgcHRyICs9IE1JTkJQQyhlbmMpOwotCSAgICBicmVhazsKLQkgIH0KLQl9Ci0JcHRyICs9IE1JTkJQQyhlbmMpOwotCWlmIChwdHIgPT0gZW5kKQotCSAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKLQlzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKLQljYXNlIEJUX1M6Ci0JY2FzZSBCVF9DUjoKLQljYXNlIEJUX0xGOgotCSAgYnJlYWs7Ci0JY2FzZSBCVF9TT0w6Ci0JICBnb3RvIHNvbDsKLQljYXNlIEJUX0dUOgotCSAgZ290byBndDsKLQlkZWZhdWx0OgotCSAgKm5leHRUb2tQdHIgPSBwdHI7Ci0JICByZXR1cm4gWE1MX1RPS19JTlZBTElEOwotCX0KLQkvKiBwdHIgcG9pbnRzIHRvIGNsb3NpbmcgcXVvdGUgKi8KLQlmb3IgKDs7KSB7Ci0JICBwdHIgKz0gTUlOQlBDKGVuYyk7Ci0JICBpZiAocHRyID09IGVuZCkKLQkgICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKLQkgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgewotCSAgQ0hFQ0tfTk1TVFJUX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCi0JICBjYXNlIEJUX1M6IGNhc2UgQlRfQ1I6IGNhc2UgQlRfTEY6Ci0JICAgIGNvbnRpbnVlOwotCSAgY2FzZSBCVF9HVDoKLSAgICAgICAgICBndDoKLQkgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKLQkgICAgcmV0dXJuIFhNTF9UT0tfU1RBUlRfVEFHX1dJVEhfQVRUUzsKLQkgIGNhc2UgQlRfU09MOgotICAgICAgICAgIHNvbDoKLQkgICAgcHRyICs9IE1JTkJQQyhlbmMpOwotCSAgICBpZiAocHRyID09IGVuZCkKLQkgICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotCSAgICBpZiAoIUNIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgJz4nKSkgewotCSAgICAgICpuZXh0VG9rUHRyID0gcHRyOwotCSAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7Ci0JICAgIH0KLQkgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKLQkgICAgcmV0dXJuIFhNTF9UT0tfRU1QVFlfRUxFTUVOVF9XSVRIX0FUVFM7Ci0JICBkZWZhdWx0OgotCSAgICAqbmV4dFRva1B0ciA9IHB0cjsKLQkgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKLQkgIH0KLQkgIGJyZWFrOwotCX0KLQlicmVhazsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgKm5leHRUb2tQdHIgPSBwdHI7Ci0gICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOwotICAgIH0KLSAgfQotICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotfQotCi0vKiBwdHIgcG9pbnRzIHRvIGNoYXJhY3RlciBmb2xsb3dpbmcgIjwiICovCi0KLXN0YXRpYwotaW50IFBSRUZJWChzY2FuTHQpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kLAotCQkgICBjb25zdCBjaGFyICoqbmV4dFRva1B0cikKLXsKLSNpZmRlZiBYTUxfTlMKLSAgaW50IGhhZENvbG9uOwotI2VuZGlmCi0gIGlmIChwdHIgPT0gZW5kKQotICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7Ci0gIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgewotICBDSEVDS19OTVNUUlRfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKLSAgY2FzZSBCVF9FWENMOgotICAgIGlmICgocHRyICs9IE1JTkJQQyhlbmMpKSA9PSBlbmQpCi0gICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgewotICAgIGNhc2UgQlRfTUlOVVM6Ci0gICAgICByZXR1cm4gUFJFRklYKHNjYW5Db21tZW50KShlbmMsIHB0ciArIE1JTkJQQyhlbmMpLCBlbmQsIG5leHRUb2tQdHIpOwotICAgIGNhc2UgQlRfTFNRQjoKLSAgICAgIHJldHVybiBQUkVGSVgoc2NhbkNkYXRhU2VjdGlvbikoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgZW5kLCBuZXh0VG9rUHRyKTsKLSAgICB9Ci0gICAgKm5leHRUb2tQdHIgPSBwdHI7Ci0gICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKLSAgY2FzZSBCVF9RVUVTVDoKLSAgICByZXR1cm4gUFJFRklYKHNjYW5QaSkoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgZW5kLCBuZXh0VG9rUHRyKTsKLSAgY2FzZSBCVF9TT0w6Ci0gICAgcmV0dXJuIFBSRUZJWChzY2FuRW5kVGFnKShlbmMsIHB0ciArIE1JTkJQQyhlbmMpLCBlbmQsIG5leHRUb2tQdHIpOwotICBkZWZhdWx0OgotICAgICpuZXh0VG9rUHRyID0gcHRyOwotICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7Ci0gIH0KLSNpZmRlZiBYTUxfTlMKLSAgaGFkQ29sb24gPSAwOwotI2VuZGlmCi0gIC8qIHdlIGhhdmUgYSBzdGFydC10YWcgKi8KLSAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKLSAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKLSAgICBDSEVDS19OQU1FX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCi0jaWZkZWYgWE1MX05TCi0gICAgY2FzZSBCVF9DT0xPTjoKLSAgICAgIGlmIChoYWRDb2xvbikgewotCSpuZXh0VG9rUHRyID0gcHRyOwotCXJldHVybiBYTUxfVE9LX0lOVkFMSUQ7Ci0gICAgICB9Ci0gICAgICBoYWRDb2xvbiA9IDE7Ci0gICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7Ci0gICAgICBpZiAocHRyID09IGVuZCkKLQlyZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotICAgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7Ci0gICAgICBDSEVDS19OTVNUUlRfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICpuZXh0VG9rUHRyID0gcHRyOwotICAgICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBjYXNlIEJUX1M6IGNhc2UgQlRfQ1I6IGNhc2UgQlRfTEY6Ci0gICAgICB7Ci0gICAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKLQl3aGlsZSAocHRyICE9IGVuZCkgewotCSAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7Ci0JICBDSEVDS19OTVNUUlRfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKLQkgIGNhc2UgQlRfR1Q6Ci0JICAgIGdvdG8gZ3Q7Ci0JICBjYXNlIEJUX1NPTDoKLQkgICAgZ290byBzb2w7Ci0JICBjYXNlIEJUX1M6IGNhc2UgQlRfQ1I6IGNhc2UgQlRfTEY6Ci0JICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKLQkgICAgY29udGludWU7Ci0JICBkZWZhdWx0OgotCSAgICAqbmV4dFRva1B0ciA9IHB0cjsKLQkgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKLQkgIH0KLQkgIHJldHVybiBQUkVGSVgoc2NhbkF0dHMpKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpOwotCX0KLQlyZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotICAgICAgfQotICAgIGNhc2UgQlRfR1Q6Ci0gICAgZ3Q6Ci0gICAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOwotICAgICAgcmV0dXJuIFhNTF9UT0tfU1RBUlRfVEFHX05PX0FUVFM7Ci0gICAgY2FzZSBCVF9TT0w6Ci0gICAgc29sOgotICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOwotICAgICAgaWYgKHB0ciA9PSBlbmQpCi0JcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKLSAgICAgIGlmICghQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCAnPicpKSB7Ci0JKm5leHRUb2tQdHIgPSBwdHI7Ci0JcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKLSAgICAgIH0KLSAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7Ci0gICAgICByZXR1cm4gWE1MX1RPS19FTVBUWV9FTEVNRU5UX05PX0FUVFM7Ci0gICAgZGVmYXVsdDoKLSAgICAgICpuZXh0VG9rUHRyID0gcHRyOwotICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKLX0KLQotc3RhdGljCi1pbnQgUFJFRklYKGNvbnRlbnRUb2spKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kLAotCQkgICAgICAgY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCi17Ci0gIGlmIChwdHIgPT0gZW5kKQotICAgIHJldHVybiBYTUxfVE9LX05PTkU7Ci0gIGlmIChNSU5CUEMoZW5jKSA+IDEpIHsKLSAgICBzaXplX3QgbiA9IGVuZCAtIHB0cjsKLSAgICBpZiAobiAmIChNSU5CUEMoZW5jKSAtIDEpKSB7Ci0gICAgICBuICY9IH4oTUlOQlBDKGVuYykgLSAxKTsKLSAgICAgIGlmIChuID09IDApCi0JcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKLSAgICAgIGVuZCA9IHB0ciArIG47Ci0gICAgfQotICB9Ci0gIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgewotICBjYXNlIEJUX0xUOgotICAgIHJldHVybiBQUkVGSVgoc2Nhbkx0KShlbmMsIHB0ciArIE1JTkJQQyhlbmMpLCBlbmQsIG5leHRUb2tQdHIpOwotICBjYXNlIEJUX0FNUDoKLSAgICByZXR1cm4gUFJFRklYKHNjYW5SZWYpKGVuYywgcHRyICsgTUlOQlBDKGVuYyksIGVuZCwgbmV4dFRva1B0cik7Ci0gIGNhc2UgQlRfQ1I6Ci0gICAgcHRyICs9IE1JTkJQQyhlbmMpOwotICAgIGlmIChwdHIgPT0gZW5kKQotICAgICAgcmV0dXJuIFhNTF9UT0tfVFJBSUxJTkdfQ1I7Ci0gICAgaWYgKEJZVEVfVFlQRShlbmMsIHB0cikgPT0gQlRfTEYpCi0gICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7Ci0gICAgKm5leHRUb2tQdHIgPSBwdHI7Ci0gICAgcmV0dXJuIFhNTF9UT0tfREFUQV9ORVdMSU5FOwotICBjYXNlIEJUX0xGOgotICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7Ci0gICAgcmV0dXJuIFhNTF9UT0tfREFUQV9ORVdMSU5FOwotICBjYXNlIEJUX1JTUUI6Ci0gICAgcHRyICs9IE1JTkJQQyhlbmMpOwotICAgIGlmIChwdHIgPT0gZW5kKQotICAgICAgcmV0dXJuIFhNTF9UT0tfVFJBSUxJTkdfUlNRQjsKLSAgICBpZiAoIUNIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgJ10nKSkKLSAgICAgIGJyZWFrOwotICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKLSAgICBpZiAocHRyID09IGVuZCkKLSAgICAgIHJldHVybiBYTUxfVE9LX1RSQUlMSU5HX1JTUUI7Ci0gICAgaWYgKCFDSEFSX01BVENIRVMoZW5jLCBwdHIsICc+JykpIHsKLSAgICAgIHB0ciAtPSBNSU5CUEMoZW5jKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICAqbmV4dFRva1B0ciA9IHB0cjsKLSAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOwotICBJTlZBTElEX0NBU0VTKHB0ciwgbmV4dFRva1B0cikKLSAgZGVmYXVsdDoKLSAgICBwdHIgKz0gTUlOQlBDKGVuYyk7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKLSAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKLSNkZWZpbmUgTEVBRF9DQVNFKG4pIFwKLSAgICBjYXNlIEJUX0xFQUQgIyMgbjogXAotICAgICAgaWYgKGVuZCAtIHB0ciA8IG4gfHwgSVNfSU5WQUxJRF9DSEFSKGVuYywgcHRyLCBuKSkgeyBcCi0JKm5leHRUb2tQdHIgPSBwdHI7IFwKLQlyZXR1cm4gWE1MX1RPS19EQVRBX0NIQVJTOyBcCi0gICAgICB9IFwKLSAgICAgIHB0ciArPSBuOyBcCi0gICAgICBicmVhazsKLSAgICBMRUFEX0NBU0UoMikgTEVBRF9DQVNFKDMpIExFQURfQ0FTRSg0KQotI3VuZGVmIExFQURfQ0FTRQotICAgIGNhc2UgQlRfUlNRQjoKLSAgICAgIGlmIChwdHIgKyBNSU5CUEMoZW5jKSAhPSBlbmQpIHsKLQkgaWYgKCFDSEFSX01BVENIRVMoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgJ10nKSkgewotCSAgIHB0ciArPSBNSU5CUEMoZW5jKTsKLQkgICBicmVhazsKLQkgfQotCSBpZiAocHRyICsgMipNSU5CUEMoZW5jKSAhPSBlbmQpIHsKLQkgICBpZiAoIUNIQVJfTUFUQ0hFUyhlbmMsIHB0ciArIDIqTUlOQlBDKGVuYyksICc+JykpIHsKLQkgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKLQkgICAgIGJyZWFrOwotCSAgIH0KLQkgICAqbmV4dFRva1B0ciA9IHB0ciArIDIqTUlOQlBDKGVuYyk7Ci0JICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKLQkgfQotICAgICAgfQotICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSBCVF9BTVA6Ci0gICAgY2FzZSBCVF9MVDoKLSAgICBjYXNlIEJUX05PTlhNTDoKLSAgICBjYXNlIEJUX01BTEZPUk06Ci0gICAgY2FzZSBCVF9UUkFJTDoKLSAgICBjYXNlIEJUX0NSOgotICAgIGNhc2UgQlRfTEY6Ci0gICAgICAqbmV4dFRva1B0ciA9IHB0cjsKLSAgICAgIHJldHVybiBYTUxfVE9LX0RBVEFfQ0hBUlM7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICAqbmV4dFRva1B0ciA9IHB0cjsKLSAgcmV0dXJuIFhNTF9UT0tfREFUQV9DSEFSUzsKLX0KLQotLyogcHRyIHBvaW50cyB0byBjaGFyYWN0ZXIgZm9sbG93aW5nICIlIiAqLwotCi1zdGF0aWMKLWludCBQUkVGSVgoc2NhblBlcmNlbnQpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kLAotCQkJY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCi17Ci0gIGlmIChwdHIgPT0gZW5kKQotICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7Ci0gIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgewotICBDSEVDS19OTVNUUlRfQ0FTRVMoZW5jLCBwdHIsIGVuZCwgbmV4dFRva1B0cikKLSAgY2FzZSBCVF9TOiBjYXNlIEJUX0xGOiBjYXNlIEJUX0NSOiBjYXNlIEJUX1BFUkNOVDoKLSAgICAqbmV4dFRva1B0ciA9IHB0cjsKLSAgICByZXR1cm4gWE1MX1RPS19QRVJDRU5UOwotICBkZWZhdWx0OgotICAgICpuZXh0VG9rUHRyID0gcHRyOwotICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7Ci0gIH0KLSAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKLSAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKLSAgICBDSEVDS19OQU1FX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCi0gICAgY2FzZSBCVF9TRU1JOgotICAgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKLSAgICAgIHJldHVybiBYTUxfVE9LX1BBUkFNX0VOVElUWV9SRUY7Ci0gICAgZGVmYXVsdDoKLSAgICAgICpuZXh0VG9rUHRyID0gcHRyOwotICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKLX0KLQotc3RhdGljCi1pbnQgUFJFRklYKHNjYW5Qb3VuZE5hbWUpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kLAotCQkJICBjb25zdCBjaGFyICoqbmV4dFRva1B0cikKLXsKLSAgaWYgKHB0ciA9PSBlbmQpCi0gICAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKLSAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7Ci0gIENIRUNLX05NU1RSVF9DQVNFUyhlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKQotICBkZWZhdWx0OgotICAgICpuZXh0VG9rUHRyID0gcHRyOwotICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7Ci0gIH0KLSAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKLSAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKLSAgICBDSEVDS19OQU1FX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCi0gICAgY2FzZSBCVF9DUjogY2FzZSBCVF9MRjogY2FzZSBCVF9TOgotICAgIGNhc2UgQlRfUlBBUjogY2FzZSBCVF9HVDogY2FzZSBCVF9QRVJDTlQ6IGNhc2UgQlRfVkVSQkFSOgotICAgICAgKm5leHRUb2tQdHIgPSBwdHI7Ci0gICAgICByZXR1cm4gWE1MX1RPS19QT1VORF9OQU1FOwotICAgIGRlZmF1bHQ6Ci0gICAgICAqbmV4dFRva1B0ciA9IHB0cjsKLSAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7Ci0gICAgfQotICB9Ci0gIHJldHVybiBYTUxfVE9LX1BBUlRJQUw7Ci19Ci0KLXN0YXRpYwotaW50IFBSRUZJWChzY2FuTGl0KShpbnQgb3BlbiwgY29uc3QgRU5DT0RJTkcgKmVuYywKLQkJICAgIGNvbnN0IGNoYXIgKnB0ciwgY29uc3QgY2hhciAqZW5kLAotCQkgICAgY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCi17Ci0gIHdoaWxlIChwdHIgIT0gZW5kKSB7Ci0gICAgaW50IHQgPSBCWVRFX1RZUEUoZW5jLCBwdHIpOwotICAgIHN3aXRjaCAodCkgewotICAgIElOVkFMSURfQ0FTRVMocHRyLCBuZXh0VG9rUHRyKQotICAgIGNhc2UgQlRfUVVPVDoKLSAgICBjYXNlIEJUX0FQT1M6Ci0gICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7Ci0gICAgICBpZiAodCAhPSBvcGVuKQotCWJyZWFrOwotICAgICAgaWYgKHB0ciA9PSBlbmQpCi0JcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKLSAgICAgICpuZXh0VG9rUHRyID0gcHRyOwotICAgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7Ci0gICAgICBjYXNlIEJUX1M6IGNhc2UgQlRfQ1I6IGNhc2UgQlRfTEY6Ci0gICAgICBjYXNlIEJUX0dUOiBjYXNlIEJUX1BFUkNOVDogY2FzZSBCVF9MU1FCOgotCXJldHVybiBYTUxfVE9LX0xJVEVSQUw7Ci0gICAgICBkZWZhdWx0OgotCXJldHVybiBYTUxfVE9LX0lOVkFMSUQ7Ci0gICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotfQotCi1zdGF0aWMKLWludCBQUkVGSVgocHJvbG9nVG9rKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsIGNvbnN0IGNoYXIgKmVuZCwKLQkJICAgICAgY29uc3QgY2hhciAqKm5leHRUb2tQdHIpCi17Ci0gIGludCB0b2s7Ci0gIGlmIChwdHIgPT0gZW5kKQotICAgIHJldHVybiBYTUxfVE9LX05PTkU7Ci0gIGlmIChNSU5CUEMoZW5jKSA+IDEpIHsKLSAgICBzaXplX3QgbiA9IGVuZCAtIHB0cjsKLSAgICBpZiAobiAmIChNSU5CUEMoZW5jKSAtIDEpKSB7Ci0gICAgICBuICY9IH4oTUlOQlBDKGVuYykgLSAxKTsKLSAgICAgIGlmIChuID09IDApCi0JcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKLSAgICAgIGVuZCA9IHB0ciArIG47Ci0gICAgfQotICB9Ci0gIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgewotICBjYXNlIEJUX1FVT1Q6Ci0gICAgcmV0dXJuIFBSRUZJWChzY2FuTGl0KShCVF9RVU9ULCBlbmMsIHB0ciArIE1JTkJQQyhlbmMpLCBlbmQsIG5leHRUb2tQdHIpOwotICBjYXNlIEJUX0FQT1M6Ci0gICAgcmV0dXJuIFBSRUZJWChzY2FuTGl0KShCVF9BUE9TLCBlbmMsIHB0ciArIE1JTkJQQyhlbmMpLCBlbmQsIG5leHRUb2tQdHIpOwotICBjYXNlIEJUX0xUOgotICAgIHsKLSAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKLSAgICAgIGlmIChwdHIgPT0gZW5kKQotCXJldHVybiBYTUxfVE9LX1BBUlRJQUw7Ci0gICAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKLSAgICAgIGNhc2UgQlRfRVhDTDoKLQlyZXR1cm4gUFJFRklYKHNjYW5EZWNsKShlbmMsIHB0ciArIE1JTkJQQyhlbmMpLCBlbmQsIG5leHRUb2tQdHIpOwotICAgICAgY2FzZSBCVF9RVUVTVDoKLQlyZXR1cm4gUFJFRklYKHNjYW5QaSkoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgZW5kLCBuZXh0VG9rUHRyKTsKLSAgICAgIGNhc2UgQlRfTk1TVFJUOgotICAgICAgY2FzZSBCVF9IRVg6Ci0gICAgICBjYXNlIEJUX05PTkFTQ0lJOgotICAgICAgY2FzZSBCVF9MRUFEMjoKLSAgICAgIGNhc2UgQlRfTEVBRDM6Ci0gICAgICBjYXNlIEJUX0xFQUQ0OgotCSpuZXh0VG9rUHRyID0gcHRyIC0gTUlOQlBDKGVuYyk7Ci0JcmV0dXJuIFhNTF9UT0tfSU5TVEFOQ0VfU1RBUlQ7Ci0gICAgICB9Ci0gICAgICAqbmV4dFRva1B0ciA9IHB0cjsKLSAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7Ci0gICAgfQotICBjYXNlIEJUX0NSOgotICAgIGlmIChwdHIgKyBNSU5CUEMoZW5jKSA9PSBlbmQpCi0gICAgICByZXR1cm4gWE1MX1RPS19UUkFJTElOR19DUjsKLSAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgY2FzZSBCVF9TOiBjYXNlIEJUX0xGOgotICAgIGZvciAoOzspIHsKLSAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKLSAgICAgIGlmIChwdHIgPT0gZW5kKQotCWJyZWFrOwotICAgICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7Ci0gICAgICBjYXNlIEJUX1M6IGNhc2UgQlRfTEY6Ci0JYnJlYWs7Ci0gICAgICBjYXNlIEJUX0NSOgotCS8qIGRvbid0IHNwbGl0IENSL0xGIHBhaXIgKi8KLQlpZiAocHRyICsgTUlOQlBDKGVuYykgIT0gZW5kKQotCSAgYnJlYWs7Ci0JLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBkZWZhdWx0OgotCSpuZXh0VG9rUHRyID0gcHRyOwotCXJldHVybiBYTUxfVE9LX1BST0xPR19TOwotICAgICAgfQotICAgIH0KLSAgICAqbmV4dFRva1B0ciA9IHB0cjsKLSAgICByZXR1cm4gWE1MX1RPS19QUk9MT0dfUzsKLSAgY2FzZSBCVF9QRVJDTlQ6Ci0gICAgcmV0dXJuIFBSRUZJWChzY2FuUGVyY2VudCkoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgZW5kLCBuZXh0VG9rUHRyKTsKLSAgY2FzZSBCVF9DT01NQToKLSAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOwotICAgIHJldHVybiBYTUxfVE9LX0NPTU1BOwotICBjYXNlIEJUX0xTUUI6Ci0gICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKLSAgICByZXR1cm4gWE1MX1RPS19PUEVOX0JSQUNLRVQ7Ci0gIGNhc2UgQlRfUlNRQjoKLSAgICBwdHIgKz0gTUlOQlBDKGVuYyk7Ci0gICAgaWYgKHB0ciA9PSBlbmQpCi0gICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotICAgIGlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIsICddJykpIHsKLSAgICAgIGlmIChwdHIgKyBNSU5CUEMoZW5jKSA9PSBlbmQpCi0JcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKLSAgICAgIGlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgJz4nKSkgewotCSpuZXh0VG9rUHRyID0gcHRyICsgMipNSU5CUEMoZW5jKTsKLQlyZXR1cm4gWE1MX1RPS19DT05EX1NFQ1RfQ0xPU0U7Ci0gICAgICB9Ci0gICAgfQotICAgICpuZXh0VG9rUHRyID0gcHRyOwotICAgIHJldHVybiBYTUxfVE9LX0NMT1NFX0JSQUNLRVQ7Ci0gIGNhc2UgQlRfTFBBUjoKLSAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOwotICAgIHJldHVybiBYTUxfVE9LX09QRU5fUEFSRU47Ci0gIGNhc2UgQlRfUlBBUjoKLSAgICBwdHIgKz0gTUlOQlBDKGVuYyk7Ci0gICAgaWYgKHB0ciA9PSBlbmQpCi0gICAgICByZXR1cm4gWE1MX1RPS19QQVJUSUFMOwotICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgewotICAgIGNhc2UgQlRfQVNUOgotICAgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKLSAgICAgIHJldHVybiBYTUxfVE9LX0NMT1NFX1BBUkVOX0FTVEVSSVNLOwotICAgIGNhc2UgQlRfUVVFU1Q6Ci0gICAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOwotICAgICAgcmV0dXJuIFhNTF9UT0tfQ0xPU0VfUEFSRU5fUVVFU1RJT047Ci0gICAgY2FzZSBCVF9QTFVTOgotICAgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKLSAgICAgIHJldHVybiBYTUxfVE9LX0NMT1NFX1BBUkVOX1BMVVM7Ci0gICAgY2FzZSBCVF9DUjogY2FzZSBCVF9MRjogY2FzZSBCVF9TOgotICAgIGNhc2UgQlRfR1Q6IGNhc2UgQlRfQ09NTUE6IGNhc2UgQlRfVkVSQkFSOgotICAgIGNhc2UgQlRfUlBBUjoKLSAgICAgICpuZXh0VG9rUHRyID0gcHRyOwotICAgICAgcmV0dXJuIFhNTF9UT0tfQ0xPU0VfUEFSRU47Ci0gICAgfQotICAgICpuZXh0VG9rUHRyID0gcHRyOwotICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7Ci0gIGNhc2UgQlRfVkVSQkFSOgotICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7Ci0gICAgcmV0dXJuIFhNTF9UT0tfT1I7Ci0gIGNhc2UgQlRfR1Q6Ci0gICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKLSAgICByZXR1cm4gWE1MX1RPS19ERUNMX0NMT1NFOwotICBjYXNlIEJUX05VTToKLSAgICByZXR1cm4gUFJFRklYKHNjYW5Qb3VuZE5hbWUpKGVuYywgcHRyICsgTUlOQlBDKGVuYyksIGVuZCwgbmV4dFRva1B0cik7Ci0jZGVmaW5lIExFQURfQ0FTRShuKSBcCi0gIGNhc2UgQlRfTEVBRCAjIyBuOiBcCi0gICAgaWYgKGVuZCAtIHB0ciA8IG4pIFwKLSAgICAgIHJldHVybiBYTUxfVE9LX1BBUlRJQUxfQ0hBUjsgXAotICAgIGlmIChJU19OTVNUUlRfQ0hBUihlbmMsIHB0ciwgbikpIHsgXAotICAgICAgcHRyICs9IG47IFwKLSAgICAgIHRvayA9IFhNTF9UT0tfTkFNRTsgXAotICAgICAgYnJlYWs7IFwKLSAgICB9IFwKLSAgICBpZiAoSVNfTkFNRV9DSEFSKGVuYywgcHRyLCBuKSkgeyBcCi0gICAgICBwdHIgKz0gbjsgXAotICAgICAgdG9rID0gWE1MX1RPS19OTVRPS0VOOyBcCi0gICAgICBicmVhazsgXAotICAgIH0gXAotICAgICpuZXh0VG9rUHRyID0gcHRyOyBcCi0gICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKLSAgICBMRUFEX0NBU0UoMikgTEVBRF9DQVNFKDMpIExFQURfQ0FTRSg0KQotI3VuZGVmIExFQURfQ0FTRQotICBjYXNlIEJUX05NU1RSVDoKLSAgY2FzZSBCVF9IRVg6Ci0gICAgdG9rID0gWE1MX1RPS19OQU1FOwotICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKLSAgICBicmVhazsKLSAgY2FzZSBCVF9ESUdJVDoKLSAgY2FzZSBCVF9OQU1FOgotICBjYXNlIEJUX01JTlVTOgotI2lmZGVmIFhNTF9OUwotICBjYXNlIEJUX0NPTE9OOgotI2VuZGlmCi0gICAgdG9rID0gWE1MX1RPS19OTVRPS0VOOwotICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKLSAgICBicmVhazsKLSAgY2FzZSBCVF9OT05BU0NJSToKLSAgICBpZiAoSVNfTk1TVFJUX0NIQVJfTUlOQlBDKGVuYywgcHRyKSkgewotICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOwotICAgICAgdG9rID0gWE1MX1RPS19OQU1FOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChJU19OQU1FX0NIQVJfTUlOQlBDKGVuYywgcHRyKSkgewotICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOwotICAgICAgdG9rID0gWE1MX1RPS19OTVRPS0VOOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotICBkZWZhdWx0OgotICAgICpuZXh0VG9rUHRyID0gcHRyOwotICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQ7Ci0gIH0KLSAgd2hpbGUgKHB0ciAhPSBlbmQpIHsKLSAgICBzd2l0Y2ggKEJZVEVfVFlQRShlbmMsIHB0cikpIHsKLSAgICBDSEVDS19OQU1FX0NBU0VTKGVuYywgcHRyLCBlbmQsIG5leHRUb2tQdHIpCi0gICAgY2FzZSBCVF9HVDogY2FzZSBCVF9SUEFSOiBjYXNlIEJUX0NPTU1BOgotICAgIGNhc2UgQlRfVkVSQkFSOiBjYXNlIEJUX0xTUUI6IGNhc2UgQlRfUEVSQ05UOgotICAgIGNhc2UgQlRfUzogY2FzZSBCVF9DUjogY2FzZSBCVF9MRjoKLSAgICAgICpuZXh0VG9rUHRyID0gcHRyOwotICAgICAgcmV0dXJuIHRvazsKLSNpZmRlZiBYTUxfTlMKLSAgICBjYXNlIEJUX0NPTE9OOgotICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOwotICAgICAgc3dpdGNoICh0b2spIHsKLSAgICAgIGNhc2UgWE1MX1RPS19OQU1FOgotCWlmIChwdHIgPT0gZW5kKQotCSAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKLQl0b2sgPSBYTUxfVE9LX1BSRUZJWEVEX05BTUU7Ci0Jc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7Ci0JQ0hFQ0tfTkFNRV9DQVNFUyhlbmMsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKQotCWRlZmF1bHQ6Ci0JICB0b2sgPSBYTUxfVE9LX05NVE9LRU47Ci0JICBicmVhazsKLQl9Ci0JYnJlYWs7Ci0gICAgICBjYXNlIFhNTF9UT0tfUFJFRklYRURfTkFNRToKLQl0b2sgPSBYTUxfVE9LX05NVE9LRU47Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGNhc2UgQlRfUExVUzoKLSAgICAgIGlmICh0b2sgPT0gWE1MX1RPS19OTVRPS0VOKSAgewotCSpuZXh0VG9rUHRyID0gcHRyOwotCXJldHVybiBYTUxfVE9LX0lOVkFMSUQ7Ci0gICAgICB9Ci0gICAgICAqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOwotICAgICAgcmV0dXJuIFhNTF9UT0tfTkFNRV9QTFVTOwotICAgIGNhc2UgQlRfQVNUOgotICAgICAgaWYgKHRvayA9PSBYTUxfVE9LX05NVE9LRU4pICB7Ci0JKm5leHRUb2tQdHIgPSBwdHI7Ci0JcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKLSAgICAgIH0KLSAgICAgICpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7Ci0gICAgICByZXR1cm4gWE1MX1RPS19OQU1FX0FTVEVSSVNLOwotICAgIGNhc2UgQlRfUVVFU1Q6Ci0gICAgICBpZiAodG9rID09IFhNTF9UT0tfTk1UT0tFTikgIHsKLQkqbmV4dFRva1B0ciA9IHB0cjsKLQlyZXR1cm4gWE1MX1RPS19JTlZBTElEOwotICAgICAgfQotICAgICAgKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKLSAgICAgIHJldHVybiBYTUxfVE9LX05BTUVfUVVFU1RJT047Ci0gICAgZGVmYXVsdDoKLSAgICAgICpuZXh0VG9rUHRyID0gcHRyOwotICAgICAgcmV0dXJuIFhNTF9UT0tfSU5WQUxJRDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIFhNTF9UT0tfUEFSVElBTDsKLX0KLQotc3RhdGljCi1pbnQgUFJFRklYKGF0dHJpYnV0ZVZhbHVlVG9rKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsIGNvbnN0IGNoYXIgKmVuZCwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQotewotICBjb25zdCBjaGFyICpzdGFydDsKLSAgaWYgKHB0ciA9PSBlbmQpCi0gICAgcmV0dXJuIFhNTF9UT0tfTk9ORTsKLSAgc3RhcnQgPSBwdHI7Ci0gIHdoaWxlIChwdHIgIT0gZW5kKSB7Ci0gICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7Ci0jZGVmaW5lIExFQURfQ0FTRShuKSBcCi0gICAgY2FzZSBCVF9MRUFEICMjIG46IHB0ciArPSBuOyBicmVhazsKLSAgICBMRUFEX0NBU0UoMikgTEVBRF9DQVNFKDMpIExFQURfQ0FTRSg0KQotI3VuZGVmIExFQURfQ0FTRQotICAgIGNhc2UgQlRfQU1QOgotICAgICAgaWYgKHB0ciA9PSBzdGFydCkKLQlyZXR1cm4gUFJFRklYKHNjYW5SZWYpKGVuYywgcHRyICsgTUlOQlBDKGVuYyksIGVuZCwgbmV4dFRva1B0cik7Ci0gICAgICAqbmV4dFRva1B0ciA9IHB0cjsKLSAgICAgIHJldHVybiBYTUxfVE9LX0RBVEFfQ0hBUlM7Ci0gICAgY2FzZSBCVF9MVDoKLSAgICAgIC8qIHRoaXMgaXMgZm9yIGluc2lkZSBlbnRpdHkgcmVmZXJlbmNlcyAqLwotICAgICAgKm5leHRUb2tQdHIgPSBwdHI7Ci0gICAgICByZXR1cm4gWE1MX1RPS19JTlZBTElEOwotICAgIGNhc2UgQlRfTEY6Ci0gICAgICBpZiAocHRyID09IHN0YXJ0KSB7Ci0JKm5leHRUb2tQdHIgPSBwdHIgKyBNSU5CUEMoZW5jKTsKLQlyZXR1cm4gWE1MX1RPS19EQVRBX05FV0xJTkU7Ci0gICAgICB9Ci0gICAgICAqbmV4dFRva1B0ciA9IHB0cjsKLSAgICAgIHJldHVybiBYTUxfVE9LX0RBVEFfQ0hBUlM7Ci0gICAgY2FzZSBCVF9DUjoKLSAgICAgIGlmIChwdHIgPT0gc3RhcnQpIHsKLQlwdHIgKz0gTUlOQlBDKGVuYyk7Ci0JaWYgKHB0ciA9PSBlbmQpCi0JICByZXR1cm4gWE1MX1RPS19UUkFJTElOR19DUjsKLQlpZiAoQllURV9UWVBFKGVuYywgcHRyKSA9PSBCVF9MRikKLQkgIHB0ciArPSBNSU5CUEMoZW5jKTsKLQkqbmV4dFRva1B0ciA9IHB0cjsKLQlyZXR1cm4gWE1MX1RPS19EQVRBX05FV0xJTkU7Ci0gICAgICB9Ci0gICAgICAqbmV4dFRva1B0ciA9IHB0cjsKLSAgICAgIHJldHVybiBYTUxfVE9LX0RBVEFfQ0hBUlM7Ci0gICAgY2FzZSBCVF9TOgotICAgICAgaWYgKHB0ciA9PSBzdGFydCkgewotCSpuZXh0VG9rUHRyID0gcHRyICsgTUlOQlBDKGVuYyk7Ci0JcmV0dXJuIFhNTF9UT0tfQVRUUklCVVRFX1ZBTFVFX1M7Ci0gICAgICB9Ci0gICAgICAqbmV4dFRva1B0ciA9IHB0cjsKLSAgICAgIHJldHVybiBYTUxfVE9LX0RBVEFfQ0hBUlM7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICAqbmV4dFRva1B0ciA9IHB0cjsKLSAgcmV0dXJuIFhNTF9UT0tfREFUQV9DSEFSUzsKLX0KLQotc3RhdGljCi1pbnQgUFJFRklYKGVudGl0eVZhbHVlVG9rKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsIGNvbnN0IGNoYXIgKmVuZCwKLQkJCSAgIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQotewotICBjb25zdCBjaGFyICpzdGFydDsKLSAgaWYgKHB0ciA9PSBlbmQpCi0gICAgcmV0dXJuIFhNTF9UT0tfTk9ORTsKLSAgc3RhcnQgPSBwdHI7Ci0gIHdoaWxlIChwdHIgIT0gZW5kKSB7Ci0gICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7Ci0jZGVmaW5lIExFQURfQ0FTRShuKSBcCi0gICAgY2FzZSBCVF9MRUFEICMjIG46IHB0ciArPSBuOyBicmVhazsKLSAgICBMRUFEX0NBU0UoMikgTEVBRF9DQVNFKDMpIExFQURfQ0FTRSg0KQotI3VuZGVmIExFQURfQ0FTRQotICAgIGNhc2UgQlRfQU1QOgotICAgICAgaWYgKHB0ciA9PSBzdGFydCkKLQlyZXR1cm4gUFJFRklYKHNjYW5SZWYpKGVuYywgcHRyICsgTUlOQlBDKGVuYyksIGVuZCwgbmV4dFRva1B0cik7Ci0gICAgICAqbmV4dFRva1B0ciA9IHB0cjsKLSAgICAgIHJldHVybiBYTUxfVE9LX0RBVEFfQ0hBUlM7Ci0gICAgY2FzZSBCVF9QRVJDTlQ6Ci0gICAgICBpZiAocHRyID09IHN0YXJ0KQotCXJldHVybiBQUkVGSVgoc2NhblBlcmNlbnQpKGVuYywgcHRyICsgTUlOQlBDKGVuYyksIGVuZCwgbmV4dFRva1B0cik7Ci0gICAgICAqbmV4dFRva1B0ciA9IHB0cjsKLSAgICAgIHJldHVybiBYTUxfVE9LX0RBVEFfQ0hBUlM7Ci0gICAgY2FzZSBCVF9MRjoKLSAgICAgIGlmIChwdHIgPT0gc3RhcnQpIHsKLQkqbmV4dFRva1B0ciA9IHB0ciArIE1JTkJQQyhlbmMpOwotCXJldHVybiBYTUxfVE9LX0RBVEFfTkVXTElORTsKLSAgICAgIH0KLSAgICAgICpuZXh0VG9rUHRyID0gcHRyOwotICAgICAgcmV0dXJuIFhNTF9UT0tfREFUQV9DSEFSUzsKLSAgICBjYXNlIEJUX0NSOgotICAgICAgaWYgKHB0ciA9PSBzdGFydCkgewotCXB0ciArPSBNSU5CUEMoZW5jKTsKLQlpZiAocHRyID09IGVuZCkKLQkgIHJldHVybiBYTUxfVE9LX1RSQUlMSU5HX0NSOwotCWlmIChCWVRFX1RZUEUoZW5jLCBwdHIpID09IEJUX0xGKQotCSAgcHRyICs9IE1JTkJQQyhlbmMpOwotCSpuZXh0VG9rUHRyID0gcHRyOwotCXJldHVybiBYTUxfVE9LX0RBVEFfTkVXTElORTsKLSAgICAgIH0KLSAgICAgICpuZXh0VG9rUHRyID0gcHRyOwotICAgICAgcmV0dXJuIFhNTF9UT0tfREFUQV9DSEFSUzsKLSAgICBkZWZhdWx0OgotICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gICpuZXh0VG9rUHRyID0gcHRyOwotICByZXR1cm4gWE1MX1RPS19EQVRBX0NIQVJTOwotfQotCi1zdGF0aWMKLWludCBQUkVGSVgoaXNQdWJsaWNJZCkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQsCi0JCSAgICAgICBjb25zdCBjaGFyICoqYmFkUHRyKQotewotICBwdHIgKz0gTUlOQlBDKGVuYyk7Ci0gIGVuZCAtPSBNSU5CUEMoZW5jKTsKLSAgZm9yICg7IHB0ciAhPSBlbmQ7IHB0ciArPSBNSU5CUEMoZW5jKSkgewotICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgewotICAgIGNhc2UgQlRfRElHSVQ6Ci0gICAgY2FzZSBCVF9IRVg6Ci0gICAgY2FzZSBCVF9NSU5VUzoKLSAgICBjYXNlIEJUX0FQT1M6Ci0gICAgY2FzZSBCVF9MUEFSOgotICAgIGNhc2UgQlRfUlBBUjoKLSAgICBjYXNlIEJUX1BMVVM6Ci0gICAgY2FzZSBCVF9DT01NQToKLSAgICBjYXNlIEJUX1NPTDoKLSAgICBjYXNlIEJUX0VRVUFMUzoKLSAgICBjYXNlIEJUX1FVRVNUOgotICAgIGNhc2UgQlRfQ1I6Ci0gICAgY2FzZSBCVF9MRjoKLSAgICBjYXNlIEJUX1NFTUk6Ci0gICAgY2FzZSBCVF9FWENMOgotICAgIGNhc2UgQlRfQVNUOgotICAgIGNhc2UgQlRfUEVSQ05UOgotICAgIGNhc2UgQlRfTlVNOgotI2lmZGVmIFhNTF9OUwotICAgIGNhc2UgQlRfQ09MT046Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRfUzoKLSAgICAgIGlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIsICdcdCcpKSB7Ci0JKmJhZFB0ciA9IHB0cjsKLQlyZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlRfTkFNRToKLSAgICBjYXNlIEJUX05NU1RSVDoKLSAgICAgIGlmICghKEJZVEVfVE9fQVNDSUkoZW5jLCBwdHIpICYgfjB4N2YpKQotCWJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzd2l0Y2ggKEJZVEVfVE9fQVNDSUkoZW5jLCBwdHIpKSB7Ci0gICAgICBjYXNlIDB4MjQ6IC8qICQgKi8KLSAgICAgIGNhc2UgMHg0MDogLyogQCAqLwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQkqYmFkUHRyID0gcHRyOwotCXJldHVybiAwOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiAxOwotfQotCi0vKiBUaGlzIG11c3Qgb25seSBiZSBjYWxsZWQgZm9yIGEgd2VsbC1mb3JtZWQgc3RhcnQtdGFnIG9yIGVtcHR5IGVsZW1lbnQgdGFnLgotUmV0dXJucyB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMuICBQb2ludGVycyB0byB0aGUgZmlyc3QgYXR0c01heCBhdHRyaWJ1dGVzIAotYXJlIHN0b3JlZCBpbiBhdHRzLiAqLwotCi1zdGF0aWMKLWludCBQUkVGSVgoZ2V0QXR0cykoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLAotCQkgICAgaW50IGF0dHNNYXgsIEFUVFJJQlVURSAqYXR0cykKLXsKLSAgZW51bSB7IG90aGVyLCBpbk5hbWUsIGluVmFsdWUgfSBzdGF0ZSA9IGluTmFtZTsKLSAgaW50IG5BdHRzID0gMDsKLSAgaW50IG9wZW4gPSAwOwotCi0gIGZvciAocHRyICs9IE1JTkJQQyhlbmMpOzsgcHRyICs9IE1JTkJQQyhlbmMpKSB7Ci0gICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7Ci0jZGVmaW5lIFNUQVJUX05BTUUgXAotICAgICAgaWYgKHN0YXRlID09IG90aGVyKSB7IFwKLQlpZiAobkF0dHMgPCBhdHRzTWF4KSB7IFwKLQkgIGF0dHNbbkF0dHNdLm5hbWUgPSBwdHI7IFwKLQkgIGF0dHNbbkF0dHNdLm5vcm1hbGl6ZWQgPSAxOyBcCi0JfSBcCi0Jc3RhdGUgPSBpbk5hbWU7IFwKLSAgICAgIH0KLSNkZWZpbmUgTEVBRF9DQVNFKG4pIFwKLSAgICBjYXNlIEJUX0xFQUQgIyMgbjogU1RBUlRfTkFNRSBwdHIgKz0gKG4gLSBNSU5CUEMoZW5jKSk7IGJyZWFrOwotICAgIExFQURfQ0FTRSgyKSBMRUFEX0NBU0UoMykgTEVBRF9DQVNFKDQpCi0jdW5kZWYgTEVBRF9DQVNFCi0gICAgY2FzZSBCVF9OT05BU0NJSToKLSAgICBjYXNlIEJUX05NU1RSVDoKLSAgICBjYXNlIEJUX0hFWDoKLSAgICAgIFNUQVJUX05BTUUKLSAgICAgIGJyZWFrOwotI3VuZGVmIFNUQVJUX05BTUUKLSAgICBjYXNlIEJUX1FVT1Q6Ci0gICAgICBpZiAoc3RhdGUgIT0gaW5WYWx1ZSkgewotCWlmIChuQXR0cyA8IGF0dHNNYXgpCi0JICBhdHRzW25BdHRzXS52YWx1ZVB0ciA9IHB0ciArIE1JTkJQQyhlbmMpOwotICAgICAgICBzdGF0ZSA9IGluVmFsdWU7Ci0gICAgICAgIG9wZW4gPSBCVF9RVU9UOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob3BlbiA9PSBCVF9RVU9UKSB7Ci0gICAgICAgIHN0YXRlID0gb3RoZXI7Ci0JaWYgKG5BdHRzIDwgYXR0c01heCkKLQkgIGF0dHNbbkF0dHNdLnZhbHVlRW5kID0gcHRyOwotCW5BdHRzKys7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUX0FQT1M6Ci0gICAgICBpZiAoc3RhdGUgIT0gaW5WYWx1ZSkgewotCWlmIChuQXR0cyA8IGF0dHNNYXgpCi0JICBhdHRzW25BdHRzXS52YWx1ZVB0ciA9IHB0ciArIE1JTkJQQyhlbmMpOwotICAgICAgICBzdGF0ZSA9IGluVmFsdWU7Ci0gICAgICAgIG9wZW4gPSBCVF9BUE9TOwotICAgICAgfQotICAgICAgZWxzZSBpZiAob3BlbiA9PSBCVF9BUE9TKSB7Ci0gICAgICAgIHN0YXRlID0gb3RoZXI7Ci0JaWYgKG5BdHRzIDwgYXR0c01heCkKLQkgIGF0dHNbbkF0dHNdLnZhbHVlRW5kID0gcHRyOwotCW5BdHRzKys7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUX0FNUDoKLSAgICAgIGlmIChuQXR0cyA8IGF0dHNNYXgpCi0JYXR0c1tuQXR0c10ubm9ybWFsaXplZCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUX1M6Ci0gICAgICBpZiAoc3RhdGUgPT0gaW5OYW1lKQotICAgICAgICBzdGF0ZSA9IG90aGVyOwotICAgICAgZWxzZSBpZiAoc3RhdGUgPT0gaW5WYWx1ZQotCSAgICAgICAmJiBuQXR0cyA8IGF0dHNNYXgKLQkgICAgICAgJiYgYXR0c1tuQXR0c10ubm9ybWFsaXplZAotCSAgICAgICAmJiAocHRyID09IGF0dHNbbkF0dHNdLnZhbHVlUHRyCi0JCSAgIHx8IEJZVEVfVE9fQVNDSUkoZW5jLCBwdHIpICE9ICcgJwotCQkgICB8fCBCWVRFX1RPX0FTQ0lJKGVuYywgcHRyICsgTUlOQlBDKGVuYykpID09ICcgJwotCSAgICAgICAgICAgfHwgQllURV9UWVBFKGVuYywgcHRyICsgTUlOQlBDKGVuYykpID09IG9wZW4pKQotCWF0dHNbbkF0dHNdLm5vcm1hbGl6ZWQgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVF9DUjogY2FzZSBCVF9MRjoKLSAgICAgIC8qIFRoaXMgY2FzZSBlbnN1cmVzIHRoYXQgdGhlIGZpcnN0IGF0dHJpYnV0ZSBuYW1lIGlzIGNvdW50ZWQKLSAgICAgICAgIEFwYXJ0IGZyb20gdGhhdCB3ZSBjb3VsZCBqdXN0IGNoYW5nZSBzdGF0ZSBvbiB0aGUgcXVvdGUuICovCi0gICAgICBpZiAoc3RhdGUgPT0gaW5OYW1lKQotICAgICAgICBzdGF0ZSA9IG90aGVyOwotICAgICAgZWxzZSBpZiAoc3RhdGUgPT0gaW5WYWx1ZSAmJiBuQXR0cyA8IGF0dHNNYXgpCi0JYXR0c1tuQXR0c10ubm9ybWFsaXplZCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUX0dUOgotICAgIGNhc2UgQlRfU09MOgotICAgICAgaWYgKHN0YXRlICE9IGluVmFsdWUpCi0JcmV0dXJuIG5BdHRzOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICAvKiBub3QgcmVhY2hlZCAqLwotfQotCi1zdGF0aWMKLWludCBQUkVGSVgoY2hhclJlZk51bWJlcikoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyKQotewotICBpbnQgcmVzdWx0ID0gMDsKLSAgLyogc2tpcCAmIyAqLwotICBwdHIgKz0gMipNSU5CUEMoZW5jKTsKLSAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgJ3gnKSkgewotICAgIGZvciAocHRyICs9IE1JTkJQQyhlbmMpOyAhQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCAnOycpOyBwdHIgKz0gTUlOQlBDKGVuYykpIHsKLSAgICAgIGludCBjID0gQllURV9UT19BU0NJSShlbmMsIHB0cik7Ci0gICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKLSAgICAgIGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKLQlyZXN1bHQgPDw9IDQ7Ci0JcmVzdWx0IHw9IChjIC0gJzAnKTsKLQlicmVhazsKLSAgICAgIGNhc2UgJ0EnOiBjYXNlICdCJzogY2FzZSAnQyc6IGNhc2UgJ0QnOiBjYXNlICdFJzogY2FzZSAnRic6Ci0JcmVzdWx0IDw8PSA0OwotCXJlc3VsdCArPSAxMCArIChjIC0gJ0EnKTsKLQlicmVhazsKLSAgICAgIGNhc2UgJ2EnOiBjYXNlICdiJzogY2FzZSAnYyc6IGNhc2UgJ2QnOiBjYXNlICdlJzogY2FzZSAnZic6Ci0JcmVzdWx0IDw8PSA0OwotCXJlc3VsdCArPSAxMCArIChjIC0gJ2EnKTsKLQlicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChyZXN1bHQgPj0gMHgxMTAwMDApCi0JcmV0dXJuIC0xOwotICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICBmb3IgKDsgIUNIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgJzsnKTsgcHRyICs9IE1JTkJQQyhlbmMpKSB7Ci0gICAgICBpbnQgYyA9IEJZVEVfVE9fQVNDSUkoZW5jLCBwdHIpOwotICAgICAgcmVzdWx0ICo9IDEwOwotICAgICAgcmVzdWx0ICs9IChjIC0gJzAnKTsKLSAgICAgIGlmIChyZXN1bHQgPj0gMHgxMTAwMDApCi0JcmV0dXJuIC0xOwotICAgIH0KLSAgfQotICByZXR1cm4gY2hlY2tDaGFyUmVmTnVtYmVyKHJlc3VsdCk7Ci19Ci0KLXN0YXRpYwotaW50IFBSRUZJWChwcmVkZWZpbmVkRW50aXR5TmFtZSkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQpCi17Ci0gIHN3aXRjaCAoKGVuZCAtIHB0cikvTUlOQlBDKGVuYykpIHsKLSAgY2FzZSAyOgotICAgIGlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIgKyBNSU5CUEMoZW5jKSwgJ3QnKSkgewotICAgICAgc3dpdGNoIChCWVRFX1RPX0FTQ0lJKGVuYywgcHRyKSkgewotICAgICAgY2FzZSAnbCc6Ci0JcmV0dXJuICc8JzsKLSAgICAgIGNhc2UgJ2cnOgotCXJldHVybiAnPic7Ci0gICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotICBjYXNlIDM6Ci0gICAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgJ2EnKSkgewotICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOwotICAgICAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgJ20nKSkgewotCXB0ciArPSBNSU5CUEMoZW5jKTsKLQlpZiAoQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCAncCcpKQotCSAgcmV0dXJuICcmJzsKLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgNDoKLSAgICBzd2l0Y2ggKEJZVEVfVE9fQVNDSUkoZW5jLCBwdHIpKSB7Ci0gICAgY2FzZSAncSc6Ci0gICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7Ci0gICAgICBpZiAoQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCAndScpKSB7Ci0JcHRyICs9IE1JTkJQQyhlbmMpOwotCWlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIsICdvJykpIHsKLQkgIHB0ciArPSBNSU5CUEMoZW5jKTsKLSAgCSAgaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgJ3QnKSkKLQkgICAgcmV0dXJuICciJzsKLQl9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdhJzoKLSAgICAgIHB0ciArPSBNSU5CUEMoZW5jKTsKLSAgICAgIGlmIChDSEFSX01BVENIRVMoZW5jLCBwdHIsICdwJykpIHsKLQlwdHIgKz0gTUlOQlBDKGVuYyk7Ci0JaWYgKENIQVJfTUFUQ0hFUyhlbmMsIHB0ciwgJ28nKSkgewotCSAgcHRyICs9IE1JTkJQQyhlbmMpOwotICAJICBpZiAoQ0hBUl9NQVRDSEVTKGVuYywgcHRyLCAncycpKQotCSAgICByZXR1cm4gJ1wnJzsKLQl9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYwotaW50IFBSRUZJWChzYW1lTmFtZSkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyMSwgY29uc3QgY2hhciAqcHRyMikKLXsKLSAgZm9yICg7OykgewotICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyMSkpIHsKLSNkZWZpbmUgTEVBRF9DQVNFKG4pIFwKLSAgICBjYXNlIEJUX0xFQUQgIyMgbjogXAotICAgICAgaWYgKCpwdHIxKysgIT0gKnB0cjIrKykgXAotCXJldHVybiAwOwotICAgIExFQURfQ0FTRSg0KSBMRUFEX0NBU0UoMykgTEVBRF9DQVNFKDIpCi0jdW5kZWYgTEVBRF9DQVNFCi0gICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGlmICgqcHRyMSsrICE9ICpwdHIyKyspCi0JcmV0dXJuIDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJUX05PTkFTQ0lJOgotICAgIGNhc2UgQlRfTk1TVFJUOgotI2lmZGVmIFhNTF9OUwotICAgIGNhc2UgQlRfQ09MT046Ci0jZW5kaWYKLSAgICBjYXNlIEJUX0hFWDoKLSAgICBjYXNlIEJUX0RJR0lUOgotICAgIGNhc2UgQlRfTkFNRToKLSAgICBjYXNlIEJUX01JTlVTOgotICAgICAgaWYgKCpwdHIyKysgIT0gKnB0cjErKykKLQlyZXR1cm4gMDsKLSAgICAgIGlmIChNSU5CUEMoZW5jKSA+IDEpIHsKLQlpZiAoKnB0cjIrKyAhPSAqcHRyMSsrKQotCSAgcmV0dXJuIDA7Ci0JaWYgKE1JTkJQQyhlbmMpID4gMikgewotCSAgaWYgKCpwdHIyKysgIT0gKnB0cjErKykKLQkgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgaWYgKE1JTkJQQyhlbmMpID4gMykgewotCSAgICBpZiAoKnB0cjIrKyAhPSAqcHRyMSsrKQotICAgICAgCSAgICAgIHJldHVybiAwOwotCSAgfQotCX0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoTUlOQlBDKGVuYykgPT0gMSAmJiAqcHRyMSA9PSAqcHRyMikKLQlyZXR1cm4gMTsKLSAgICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyMikpIHsKLSAgICAgIGNhc2UgQlRfTEVBRDI6Ci0gICAgICBjYXNlIEJUX0xFQUQzOgotICAgICAgY2FzZSBCVF9MRUFENDoKLSAgICAgIGNhc2UgQlRfTk9OQVNDSUk6Ci0gICAgICBjYXNlIEJUX05NU1RSVDoKLSNpZmRlZiBYTUxfTlMKLSAgICAgIGNhc2UgQlRfQ09MT046Ci0jZW5kaWYKLSAgICAgIGNhc2UgQlRfSEVYOgotICAgICAgY2FzZSBCVF9ESUdJVDoKLSAgICAgIGNhc2UgQlRfTkFNRToKLSAgICAgIGNhc2UgQlRfTUlOVVM6Ci0JcmV0dXJuIDA7Ci0gICAgICBkZWZhdWx0OgotCXJldHVybiAxOwotICAgICAgfQotICAgIH0KLSAgfQotICAvKiBub3QgcmVhY2hlZCAqLwotfQotCi1zdGF0aWMKLWludCBQUkVGSVgobmFtZU1hdGNoZXNBc2NpaSkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyMSwgY29uc3QgY2hhciAqcHRyMikKLXsKLSAgZm9yICg7ICpwdHIyOyBwdHIxICs9IE1JTkJQQyhlbmMpLCBwdHIyKyspIHsKLSAgICBpZiAoIUNIQVJfTUFUQ0hFUyhlbmMsIHB0cjEsICpwdHIyKSkKLSAgICAgIHJldHVybiAwOwotICB9Ci0gIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyMSkpIHsKLSAgY2FzZSBCVF9MRUFEMjoKLSAgY2FzZSBCVF9MRUFEMzoKLSAgY2FzZSBCVF9MRUFENDoKLSAgY2FzZSBCVF9OT05BU0NJSToKLSAgY2FzZSBCVF9OTVNUUlQ6Ci0jaWZkZWYgWE1MX05TCi0gIGNhc2UgQlRfQ09MT046Ci0jZW5kaWYKLSAgY2FzZSBCVF9IRVg6Ci0gIGNhc2UgQlRfRElHSVQ6Ci0gIGNhc2UgQlRfTkFNRToKLSAgY2FzZSBCVF9NSU5VUzoKLSAgICByZXR1cm4gMDsKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gMTsKLSAgfQotfQotCi1zdGF0aWMKLWludCBQUkVGSVgobmFtZUxlbmd0aCkoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyKQotewotICBjb25zdCBjaGFyICpzdGFydCA9IHB0cjsKLSAgZm9yICg7OykgewotICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgewotI2RlZmluZSBMRUFEX0NBU0UobikgXAotICAgIGNhc2UgQlRfTEVBRCAjIyBuOiBwdHIgKz0gbjsgYnJlYWs7Ci0gICAgTEVBRF9DQVNFKDIpIExFQURfQ0FTRSgzKSBMRUFEX0NBU0UoNCkKLSN1bmRlZiBMRUFEX0NBU0UKLSAgICBjYXNlIEJUX05PTkFTQ0lJOgotICAgIGNhc2UgQlRfTk1TVFJUOgotI2lmZGVmIFhNTF9OUwotICAgIGNhc2UgQlRfQ09MT046Ci0jZW5kaWYKLSAgICBjYXNlIEJUX0hFWDoKLSAgICBjYXNlIEJUX0RJR0lUOgotICAgIGNhc2UgQlRfTkFNRToKLSAgICBjYXNlIEJUX01JTlVTOgotICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBwdHIgLSBzdGFydDsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljCi1jb25zdCBjaGFyICpQUkVGSVgoc2tpcFMpKGNvbnN0IEVOQ09ESU5HICplbmMsIGNvbnN0IGNoYXIgKnB0cikKLXsKLSAgZm9yICg7OykgewotICAgIHN3aXRjaCAoQllURV9UWVBFKGVuYywgcHRyKSkgewotICAgIGNhc2UgQlRfTEY6Ci0gICAgY2FzZSBCVF9DUjoKLSAgICBjYXNlIEJUX1M6Ci0gICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHB0cjsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljCi12b2lkIFBSRUZJWCh1cGRhdGVQb3NpdGlvbikoY29uc3QgRU5DT0RJTkcgKmVuYywKLQkJCSAgICBjb25zdCBjaGFyICpwdHIsCi0JCQkgICAgY29uc3QgY2hhciAqZW5kLAotCQkJICAgIFBPU0lUSU9OICpwb3MpCi17Ci0gIHdoaWxlIChwdHIgIT0gZW5kKSB7Ci0gICAgc3dpdGNoIChCWVRFX1RZUEUoZW5jLCBwdHIpKSB7Ci0jZGVmaW5lIExFQURfQ0FTRShuKSBcCi0gICAgY2FzZSBCVF9MRUFEICMjIG46IFwKLSAgICAgIHB0ciArPSBuOyBcCi0gICAgICBicmVhazsKLSAgICBMRUFEX0NBU0UoMikgTEVBRF9DQVNFKDMpIExFQURfQ0FTRSg0KQotI3VuZGVmIExFQURfQ0FTRQotICAgIGNhc2UgQlRfTEY6Ci0gICAgICBwb3MtPmNvbHVtbk51bWJlciA9ICh1bnNpZ25lZCktMTsKLSAgICAgIHBvcy0+bGluZU51bWJlcisrOwotICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCVF9DUjoKLSAgICAgIHBvcy0+bGluZU51bWJlcisrOwotICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOwotICAgICAgaWYgKHB0ciAhPSBlbmQgJiYgQllURV9UWVBFKGVuYywgcHRyKSA9PSBCVF9MRikKLQlwdHIgKz0gTUlOQlBDKGVuYyk7Ci0gICAgICBwb3MtPmNvbHVtbk51bWJlciA9ICh1bnNpZ25lZCktMTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgcG9zLT5jb2x1bW5OdW1iZXIrKzsKLSAgfQotfQotCi0jdW5kZWYgRE9fTEVBRF9DQVNFCi0jdW5kZWYgTVVMVElCWVRFX0NBU0VTCi0jdW5kZWYgSU5WQUxJRF9DQVNFUwotI3VuZGVmIENIRUNLX05BTUVfQ0FTRQotI3VuZGVmIENIRUNLX05BTUVfQ0FTRVMKLSN1bmRlZiBDSEVDS19OTVNUUlRfQ0FTRQotI3VuZGVmIENIRUNLX05NU1RSVF9DQVNFUwpkaWZmIC0tZ2l0IGEvc3JjbGliL2V4cGF0LWxpdGUveG1sdG9rX2ltcGwuaCBiL3NyY2xpYi9leHBhdC1saXRlL3htbHRva19pbXBsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MmIyMjUuLjAwMDAwMDAKLS0tIGEvc3JjbGliL2V4cGF0LWxpdGUveG1sdG9rX2ltcGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi1UaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlCi1WZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluCi1jb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCi0KLVNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIKLWJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi1MaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1UaGUgT3JpZ2luYWwgQ29kZSBpcyBleHBhdC4KLQotVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIEphbWVzIENsYXJrLgotUG9ydGlvbnMgY3JlYXRlZCBieSBKYW1lcyBDbGFyayBhcmUgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5Ci1KYW1lcyBDbGFyay4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotQ29udHJpYnV0b3Iocyk6Ci0KLUFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlIHRlcm1zCi1vZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKHRoZSAiR1BMIiksIGluIHdoaWNoIGNhc2UgdGhlCi1wcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aG9zZSBhYm92ZS4gIElmIHlvdQotd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgotdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQKLXJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlCi1HUEwuIElmIHlvdSBkbyBub3QgZGVsZXRlIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlCi15b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCi0qLwotCi1lbnVtIHsKLSAgQlRfTk9OWE1MLAotICBCVF9NQUxGT1JNLAotICBCVF9MVCwKLSAgQlRfQU1QLAotICBCVF9SU1FCLAotICBCVF9MRUFEMiwKLSAgQlRfTEVBRDMsCi0gIEJUX0xFQUQ0LAotICBCVF9UUkFJTCwKLSAgQlRfQ1IsCi0gIEJUX0xGLAotICBCVF9HVCwKLSAgQlRfUVVPVCwKLSAgQlRfQVBPUywKLSAgQlRfRVFVQUxTLAotICBCVF9RVUVTVCwKLSAgQlRfRVhDTCwKLSAgQlRfU09MLAotICBCVF9TRU1JLAotICBCVF9OVU0sCi0gIEJUX0xTUUIsCi0gIEJUX1MsCi0gIEJUX05NU1RSVCwKLSAgQlRfQ09MT04sCi0gIEJUX0hFWCwKLSAgQlRfRElHSVQsCi0gIEJUX05BTUUsCi0gIEJUX01JTlVTLAotICBCVF9PVEhFUiwgLyoga25vd24gbm90IHRvIGJlIGEgbmFtZSBvciBuYW1lIHN0YXJ0IGNoYXJhY3RlciAqLwotICBCVF9OT05BU0NJSSwgLyogbWlnaHQgYmUgYSBuYW1lIG9yIG5hbWUgc3RhcnQgY2hhcmFjdGVyICovCi0gIEJUX1BFUkNOVCwKLSAgQlRfTFBBUiwKLSAgQlRfUlBBUiwKLSAgQlRfQVNULAotICBCVF9QTFVTLAotICBCVF9DT01NQSwKLSAgQlRfVkVSQkFSCi19OwotCi0jaW5jbHVkZSA8c3RkZGVmLmg+CmRpZmYgLS1naXQgYS9zcmNsaWIvZXhwYXQtbGl0ZS94bWx0b2tfbnMuYyBiL3NyY2xpYi9leHBhdC1saXRlL3htbHRva19ucy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzJjNTc3Li4wMDAwMDAwCi0tLSBhL3NyY2xpYi9leHBhdC1saXRlL3htbHRva19ucy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotY29uc3QgRU5DT0RJTkcgKk5TKFhtbEdldFV0ZjhJbnRlcm5hbEVuY29kaW5nKSh2b2lkKQotewotICByZXR1cm4gJm5zKGludGVybmFsX3V0ZjhfZW5jb2RpbmcpLmVuYzsKLX0KLQotY29uc3QgRU5DT0RJTkcgKk5TKFhtbEdldFV0ZjE2SW50ZXJuYWxFbmNvZGluZykodm9pZCkKLXsKLSNpZiBYTUxfQllURV9PUkRFUiA9PSAxMgotICByZXR1cm4gJm5zKGludGVybmFsX2xpdHRsZTJfZW5jb2RpbmcpLmVuYzsKLSNlbGlmIFhNTF9CWVRFX09SREVSID09IDIxCi0gIHJldHVybiAmbnMoaW50ZXJuYWxfYmlnMl9lbmNvZGluZykuZW5jOwotI2Vsc2UKLSAgY29uc3Qgc2hvcnQgbiA9IDE7Ci0gIHJldHVybiAqKGNvbnN0IGNoYXIgKikmbiA/ICZucyhpbnRlcm5hbF9saXR0bGUyX2VuY29kaW5nKS5lbmMgOiAmbnMoaW50ZXJuYWxfYmlnMl9lbmNvZGluZykuZW5jOwotI2VuZGlmCi19Ci0KLXN0YXRpYwotY29uc3QgRU5DT0RJTkcgKk5TKGVuY29kaW5ncylbXSA9IHsKLSAgJm5zKGxhdGluMV9lbmNvZGluZykuZW5jLAotICAmbnMoYXNjaWlfZW5jb2RpbmcpLmVuYywKLSAgJm5zKHV0ZjhfZW5jb2RpbmcpLmVuYywKLSAgJm5zKGJpZzJfZW5jb2RpbmcpLmVuYywKLSAgJm5zKGJpZzJfZW5jb2RpbmcpLmVuYywKLSAgJm5zKGxpdHRsZTJfZW5jb2RpbmcpLmVuYywKLSAgJm5zKHV0ZjhfZW5jb2RpbmcpLmVuYyAvKiBOT19FTkMgKi8KLX07Ci0KLXN0YXRpYwotaW50IE5TKGluaXRTY2FuUHJvbG9nKShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsIGNvbnN0IGNoYXIgKmVuZCwKLQkJICAgICAgIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQotewotICByZXR1cm4gaW5pdFNjYW4oTlMoZW5jb2RpbmdzKSwgKGNvbnN0IElOSVRfRU5DT0RJTkcgKillbmMsIFhNTF9QUk9MT0dfU1RBVEUsIHB0ciwgZW5kLCBuZXh0VG9rUHRyKTsKLX0KLQotc3RhdGljCi1pbnQgTlMoaW5pdFNjYW5Db250ZW50KShjb25zdCBFTkNPRElORyAqZW5jLCBjb25zdCBjaGFyICpwdHIsIGNvbnN0IGNoYXIgKmVuZCwKLQkJICAgICAgIGNvbnN0IGNoYXIgKipuZXh0VG9rUHRyKQotewotICByZXR1cm4gaW5pdFNjYW4oTlMoZW5jb2RpbmdzKSwgKGNvbnN0IElOSVRfRU5DT0RJTkcgKillbmMsIFhNTF9DT05URU5UX1NUQVRFLCBwdHIsIGVuZCwgbmV4dFRva1B0cik7Ci19Ci0KLWludCBOUyhYbWxJbml0RW5jb2RpbmcpKElOSVRfRU5DT0RJTkcgKnAsIGNvbnN0IEVOQ09ESU5HICoqZW5jUHRyLCBjb25zdCBjaGFyICpuYW1lKQotewotICBpbnQgaSA9IGdldEVuY29kaW5nSW5kZXgobmFtZSk7Ci0gIGlmIChpID09IFVOS05PV05fRU5DKQotICAgIHJldHVybiAwOwotICBJTklUX0VOQ19JTkRFWChwKSA9IChjaGFyKWk7Ci0gIHAtPmluaXRFbmMuc2Nhbm5lcnNbWE1MX1BST0xPR19TVEFURV0gPSBOUyhpbml0U2NhblByb2xvZyk7Ci0gIHAtPmluaXRFbmMuc2Nhbm5lcnNbWE1MX0NPTlRFTlRfU1RBVEVdID0gTlMoaW5pdFNjYW5Db250ZW50KTsKLSAgcC0+aW5pdEVuYy51cGRhdGVQb3NpdGlvbiA9IGluaXRVcGRhdGVQb3NpdGlvbjsKLSAgcC0+ZW5jUHRyID0gZW5jUHRyOwotICAqZW5jUHRyID0gJihwLT5pbml0RW5jKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYwotY29uc3QgRU5DT0RJTkcgKk5TKGZpbmRFbmNvZGluZykoY29uc3QgRU5DT0RJTkcgKmVuYywgY29uc3QgY2hhciAqcHRyLCBjb25zdCBjaGFyICplbmQpCi17Ci0jZGVmaW5lIEVOQ09ESU5HX01BWCAxMjgKLSAgY2hhciBidWZbRU5DT0RJTkdfTUFYXTsKLSAgY2hhciAqcCA9IGJ1ZjsKLSAgaW50IGk7Ci0gIFhtbFV0ZjhDb252ZXJ0KGVuYywgJnB0ciwgZW5kLCAmcCwgcCArIEVOQ09ESU5HX01BWCAtIDEpOwotICBpZiAocHRyICE9IGVuZCkKLSAgICByZXR1cm4gMDsKLSAgKnAgPSAwOwotICBpZiAoc3RyZXFjaShidWYsICJVVEYtMTYiKSAmJiBlbmMtPm1pbkJ5dGVzUGVyQ2hhciA9PSAyKQotICAgIHJldHVybiBlbmM7Ci0gIGkgPSBnZXRFbmNvZGluZ0luZGV4KGJ1Zik7Ci0gIGlmIChpID09IFVOS05PV05fRU5DKQotICAgIHJldHVybiAwOwotICByZXR1cm4gTlMoZW5jb2RpbmdzKVtpXTsKLX0KLQotaW50IE5TKFhtbFBhcnNlWG1sRGVjbCkoaW50IGlzR2VuZXJhbFRleHRFbnRpdHksCi0JCQljb25zdCBFTkNPRElORyAqZW5jLAotCQkJY29uc3QgY2hhciAqcHRyLAotCQkJY29uc3QgY2hhciAqZW5kLAotCQkJY29uc3QgY2hhciAqKmJhZFB0ciwKLQkJCWNvbnN0IGNoYXIgKip2ZXJzaW9uUHRyLAotCQkJY29uc3QgY2hhciAqKmVuY29kaW5nTmFtZSwKLQkJCWNvbnN0IEVOQ09ESU5HICoqZW5jb2RpbmcsCi0JCQlpbnQgKnN0YW5kYWxvbmUpCi17Ci0gIHJldHVybiBkb1BhcnNlWG1sRGVjbChOUyhmaW5kRW5jb2RpbmcpLAotCQkJaXNHZW5lcmFsVGV4dEVudGl0eSwKLQkJCWVuYywKLQkJCXB0ciwKLQkJCWVuZCwKLQkJCWJhZFB0ciwKLQkJCXZlcnNpb25QdHIsCi0JCQllbmNvZGluZ05hbWUsCi0JCQllbmNvZGluZywKLQkJCXN0YW5kYWxvbmUpOwotfQpkaWZmIC0tZ2l0IGEvc3VwcG9ydC8uY3ZzaWdub3JlIGIvc3VwcG9ydC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTlmMTE0Li4wMDAwMDAwCi0tLSBhL3N1cHBvcnQvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLU1ha2VmaWxlCi1yb3RhdGVsb2dzCi1odHBhc3N3ZAotaHRkaWdlc3QKLXVuZXNjYXBlCi1pbmMyc2h0bWwKLWh0dHBkX21vbml0b3IKLXN1ZXhlYwotbG9ncmVzb2x2ZQotYWIKLWFweHMKZGlmZiAtLWdpdCBhL3N1cHBvcnQvLmluZGVudC5wcm8gYi9zdXBwb3J0Ly5pbmRlbnQucHJvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWZiZTlmLi4wMDAwMDAwCi0tLSBhL3N1cHBvcnQvLmluZGVudC5wcm8KKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0taTQgLW5wc2wgLWRpMCAtYnIgLW5jZSAtZDAgLWNsaTAgLW5wY3MgLW5mYzEKLS1UQlVGRgotLVRGSUxFCi0tVFRSQU5TCi0tVFVJTlQ0Ci0tVF90cmFucwotLVRhbGxvd19vcHRpb25zX3QKLS1UYXBhY2hlX3NmaW8KLS1UYXJyYXlfaGVhZGVyCi0tVGJvb2xfaW50Ci0tVGJ1Zl9hcmVhCi0tVGJ1ZmZfc3RydWN0Ci0tVGJ1ZmZ5Ci0tVGNtZF9ob3cKLS1UY21kX3Bhcm1zCi0tVGNvbW1hbmRfcmVjCi0tVGNvbW1hbmRfc3RydWN0Ci0tVGNvbm5fcmVjCi0tVGNvcmVfZGlyX2NvbmZpZwotLVRjb3JlX3NlcnZlcl9jb25maWcKLS1UZGlyX21ha2VyX2Z1bmMKLS1UZXZlbnQKLS1UZ2xvYmFsc19zCi0tVGhhbmRsZXJfZnVuYwotLVRoYW5kbGVyX3JlYwotLVRqb2JsaXN0X3MKLS1UbGlzdGVuX3JlYwotLVRtZXJnZXJfZnVuYwotLVRtb2RlX3QKLS1UbW9kdWxlCi0tVG1vZHVsZV9zdHJ1Y3QKLS1UbXV0ZXgKLS1Ubl9sb25nCi0tVG90aGVyX2NoaWxkX3JlYwotLVRvdmVycmlkZXNfdAotLVRwYXJlbnRfc2NvcmUKLS1UcGlkX3QKLS1UcGlwZWRfbG9nCi0tVHBvb2wKLS1UcmVxdWVzdF9yZWMKLS1UcmVxdWlyZV9saW5lCi0tVHJsaW1fdAotLVRzY29yZWJvYXJkCi0tVHNlbWFwaG9yZQotLVRzZXJ2ZXJfYWRkcl9yZWMKLS1Uc2VydmVyX3JlYwotLVRzZXJ2ZXJfcmVjX2NoYWluCi0tVHNob3J0X3Njb3JlCi0tVHRhYmxlCi0tVHRhYmxlX2VudHJ5Ci0tVHRocmVhZAotLVR1X3dpZGVfaW50Ci0tVHZ0aW1lX3QKLS1Ud2lkZV9pbnQKZGlmZiAtLWdpdCBhL3N1cHBvcnQvUkVBRE1FIGIvc3VwcG9ydC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZTljYWYuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi1TdXBwb3J0IGZpbGVzOgotCi1hYgotCUFCdXNlIHlvdXIgc2VydmVyIHdpdGggdGhpcyBiZW5jaG1hcmtlci4gUnVkaW1lbnRhcnkKLQljb21tYW5kIGxpbmUgdGVzdGluZyB0b29sLgotCi1hcGFjaGVjdGwKLQlBcGFjaGUgcnVuLXRpbWUgQ29udHJvbCBzY3JpcHQuIFRvIGZhY2lsaXRhdGUgdGhlCi0JYWRtaW5pc3RyYXRvciBhbmQvb3IgeW91ciByYy5kIHNjcmlwdHMgdG8gY29udHJvbCB0aGUgCi0JZnVuY3Rpb25pbmcgb2YgdGhlIEFwYWNoZSBodHRwZCBkYWVtb24uCi0KLWFweHMKLQlBUGFjaGUgZVh0ZW5TaW9uIHRvb2wuIEVhc2VzIGJ1aWxkaW5nIGFuZCBpbnN0YWxsaW5nCi0JRFNPIHN0eWxlIG1vZHVsZXMuCi0KLWRibW1hbmFnZQotCUNyZWF0ZSBhbmQgdXBkYXRlIHVzZXIgYXV0aGVudGljYXRpb24gZmlsZXMgaW4gdGhlIGZhc3RlcgotCURCTSBmb3JtYXQgdXNlZCBieSBtb2RfYXV0aF9kYi4KLQotaHRkaWdlc3QKLQlDcmVhdGUgYW5kIHVwZGF0ZSB1c2VyIGF1dGhlbnRpY2F0aW9uIGZpbGVzIHVzZWQgaW4KLQlESUdFU1QgYXV0aGVudGlmaWNhdGlvbi4gU2VlIG1vZF9hdXRoX2RpZ2VzdC4KLQotaHRwYXNzd2QgCi0JQ3JlYXRlIGFuZCB1cGRhdGUgdXNlciBhdXRoZW50aWNhdGlvbiBmaWxlcyB1c2VkIGluCi0JQkFTSUMgYXV0aGVudGlmaWNhdGlvbi4gSS5lLiB0aGUgaHRwYXNzd2QgZmlsZXMuCi0JU2VlIG1vZF9hdXRoLgotCi1odHRwZC44Ci0JR2VuZXJhbCBhcGFjaGUgbWFuIHBhZ2UuCi0KLWxvZ19zZXJ2ZXJfc3RhdHVzCi0JVGhpcyBzY3JpcHQgaXMgZGVzaWduZWQgdG8gYmUgcnVuIGF0IGEgZnJlcXVlbnQgaW50ZXJ2YWwgYnkgc29tZXRoaW5nCi0JbGlrZSBjcm9uLiAgSXQgY29ubmVjdHMgdG8gdGhlIHNlcnZlciBhbmQgZG93bmxvYWRzIHRoZSBzdGF0dXMKLQlpbmZvcm1hdGlvbi4gIEl0IHJlZm9ybWF0cyB0aGUgaW5mb3JtYXRpb24gdG8gYSBzaW5nbGUgbGluZSBhbmQgbG9ncwotCWl0IHRvIGEgZmlsZS4gCi0KLWxvZ3Jlc29sdmUKLQlyZXNvbHZlIGhvc3RuYW1lcyBmb3IgSVAtYWRyZXNzZXMgaW4gQXBhY2hlIGxvZ2ZpbGVzCi0KLXBoZl9hYnVzZV9sb2cuY2dpCi0JVGhpcyBzY3JpcHQgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IHBlb3BsZSB0cnlpbmcgdG8gYWJ1c2UgYW4gYW5jaWVudAotCWFuZCBsb25nIHBsdWdnZWQgc2VjdXJpdHkgaG9sZSB3aGljaCBleGlzdGVkIGluIGEgQ0dJIHNjcmlwdCBkaXN0cmlidXRlZAotCXdpdGggQXBhY2hlIDEuMC4zIGFuZCBlYXJsaWVyIHZlcnNpb25zLgotCi1yb3RhdGVsb2dzCi0Jcm90YXRlIEFwYWNoZSBsb2dzIHdpdGhvdXQgaGF2aW5nIHRvIGtpbGwgdGhlIHNlcnZlci4KLQotc3BsaXQtbG9nZmlsZQotCVRoaXMgc2NyaXB0IHdpbGwgdGFrZSBhIGNvbWJpbmVkIHZpcnR1YWwgaG9zdHMgYWNjZXNzCi0JbG9nIGZpbGUgYW5kIGJyZWFrIGl0cyBjb250ZW50cyBpbnRvIHNlcGFyYXRlIGZpbGVzLgotCi1zdWV4ZWMKLQlTd2l0Y2ggVXNlciBGb3IgRXhlYy4gVXNlZCBpbnRlcm5hbGx5IGJ5IGFwYWNoZSwgCi0gICAgICAgIHNlZSAgdGhlICBkb2N1bWVudCAgYEFwYWNoZSAgc3VFWEVDICBTdXBwb3J0JwotCXVuZGVyIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kb2NzL3N1ZXhlYy5odG1sIC4KLQotU0hBMQotCVRoaXMgZGlyZWN0b3J5IGluY2x1ZGVzIHNvbWUgdXRpbGl0aWVzIHRvIGFsbG93IEFwYWNoZSAxLjMuNiB0byAKLQlyZWNvZ25pemUgcGFzc3dvcmRzIGluIFNIQTEgZm9ybWF0LCBhcyB1c2VkIGJ5IE5ldHNjYXBlIHdlYiAKLQlzZXJ2ZXJzLiBJdCBpcyBub3QgaW5zdGFsbGVkIGJ5IGRlZmF1bHQuCi0KZGlmZiAtLWdpdCBhL3N1cHBvcnQvU0hBMS9SRUFETUUuc2hhMSBiL3N1cHBvcnQvU0hBMS9SRUFETUUuc2hhMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk5OGUxZi4uMDAwMDAwMAotLS0gYS9zdXBwb3J0L1NIQTEvUkVBRE1FLnNoYTEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1UaGlzIGRpcmVjdG9yeSBpbmNsdWRlcyBzb21lIHV0aWxpdGllcyB0byBhbGxvdyBBcGFjaGUgMS4zLjYgdG8gCi1yZWNvZ25pemUgcGFzc3dvcmRzIGluIFNIQTEgZm9ybWF0LCBhcyB1c2VkIGJ5IE5ldHNjYXBlIHdlYiBzZXJ2ZXJzLiAgCi0KLUZyb20gTmV0c2NhcGUncyBhZG1pbiBpbnRlcmZhY2UsIGV4cG9ydCB0aGUgcGFzc3dvcmQgZGF0YWJhc2UgdG8gYW4gCi1sZGlmIGZpbGUgYW5kIHRoZW4gdXNlIGNvbnZlcnQucGwgaW4gdGhpcyBkaXN0cmlidXRpb24gdG8gZ2VuZXJhdGUgCi1hcGFjaGUgc3R5bGUgcGFzc3dvcmQgZmlsZXMuICAKLQotTm90ZTogU0hBMSBzdXBwb3J0IGlzIHVzZWZ1bCBmb3IgbWlncmF0aW9uIHB1cnBvc2VzLCBidXQgaXMgbGVzcwotICAgICAgc2VjdXJlIHRoYW4gQXBhY2hlJ3MgcGFzc3dvcmQgZm9ybWF0LCBzaW5jZSBBcGFjaGUncyAoTUQ1KQotICAgICAgcGFzc3dvcmQgZm9ybWF0IHVzZXMgYSByYW5kb20gZWlnaHQgY2hhcmFjdGVyIHNhbHQgdG8gZ2VuZXJhdGUKLSAgICAgIG9uZSBvZiBtYW55IHBvc3NpYmxlIGhhc2hlcyBmb3IgdGhlIHNhbWUgcGFzc3dvcmQuICBOZXRzY2FwZQotICAgICAgdXNlcyBwbGFpbiBTSEExIHdpdGhvdXQgYSBzYWx0LCBzbyB0aGUgc2FtZSBwYXNzd29yZAotICAgICAgd2lsbCBhbHdheXMgZ2VuZXJhdGUgdGhlIHNhbWUgaGFzaCwgbWFraW5nIGl0IGVhc2llcgotICAgICAgdG8gYnJlYWsgc2luY2UgdGhlIHNlYXJjaCBzcGFjZSBpcyBzbWFsbGVyLgotCi1UaGlzIGNvZGUgd2FzIGNvbnRyaWJ1dGVkIGJ5IENsaW50b24gV29uZyA8Y2xpbnRkd0BuZXRjb20uY29tPi4KLQotUkVBRE1FLnNoYTEgCi0JdGhpcyBmaWxlCi0KLWNvbnZlcnQtc2hhMS5wbCAKLQl0YWtlcyBhbiBsZGlmIGR1bXAgZnJvbSBOZXRzY2FwZSdzIHdlYiBzZXJ2ZXIgb24KLSAgICAgICAgc3RhbmRhcmQgaW4sIG91dHB1dHMgYXBhY2hlIGh0cGFzc3dkIGZvcm1hdCBvbiBzdGFuZGFyZCBvdXQuCi0KLSAgICAgICAgVXNhZ2U6IGNvbnZlcnQucGwgPCBsZGlmID4gcGFzc3dvcmRzCi0KLWh0cGFzc3dkLXNoYTEucGwKLQlwZXJsIHNjcmlwdCB0byBnZW5lcmF0ZSBlbnRyaWVzIGluIGFwYWNoZSBodHBhc3N3ZCBmb3JtYXQuCi0KLSAgICAgICAJVXNhZ2U6IGh0cGFzc3dkLXNoYTEucGwgc29tZV91c2VyIHNvbWVfcGFzc3dvcmQKLQotbGRpZi1zaGExLmV4YW1wbGUKLQlzYW1wbGUgbGRpZiBkdW1wIHdpdGggb25lIHNoYTEgcGFzc3dvcmQgYW5kIG9uZSBjcnlwdCBwYXNzd29yZC4KLQpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9TSEExL2NvbnZlcnQtc2hhMS5wbCBiL3N1cHBvcnQvU0hBMS9jb252ZXJ0LXNoYTEucGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MjI4MDIuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9TSEExL2NvbnZlcnQtc2hhMS5wbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMhL3Vzci9iaW4vcGVybCAtdwotdXNlIHN0cmljdDsKLQotIyBUaGlzIGlzIHB1YmxpYyBkb21haW4gY29kZS4gIERvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggaXQuCi0jIEl0IHdhcyBvcmlnaW5hbGx5IGluY2x1ZGVkIGluIENsaW50b24gV29uZydzIEFwYWNoZSAxLjMuNiBTSEExL2xkaWYKLSMgcGF0Y2ggZGlzdHJpYnV0aW9uIGFzIHNhbXBsZSBjb2RlIGZvciBjb252ZXJ0aW5nIGFjY291bnRzIGZyb20KLSMgbGRpZiBmb3JtYXQgKGFzIHVzZWQgYnkgTmV0c2NhcGUgd2ViIHNlcnZlcnMpIHRvIEFwYWNoZSBwYXNzd29yZCBmb3JtYXQuCi0KLW15ICR1aWQ9Jyc7Ci1teSAkcGFzc3dkPScnOwotCi13aGlsZSAobXkgJGxpbmUgPSA8PikgewotICBjaG9tcCAkbGluZTsKLSAgaWYgKCAkbGluZSA9fiAvdWlkOlxzKiguKykvKSB7ICR1aWQgPSAkMSB9Ci0gIGlmICggJGxpbmUgPX4gL3VzZXJwYXNzd29yZDpccyooXHtcdytcfS4rKS8pIHsKLSAgICAkcGFzc3dkID0gJDE7Ci0gICAgJHBhc3N3ZCA9fiBzL15ce2NyeXB0XH0vL2k7ICAjIEFwYWNoZSBzdG9yZXMgY3J5cHQgd2l0aG91dCBhIG1hZ2ljIHN0cmluZwotICB9Ci0KLSAgaWYgKGxlbmd0aCgkbGluZSk9PTApIHsKLQotICAgIGlmIChsZW5ndGggJHVpZCBhbmQgbGVuZ3RoICRwYXNzd2QpIHsKLSAgICAgIHByaW50ICR1aWQsICc6JywgJHBhc3N3ZCwgIlxuIjsKLSAgICB9ICMgb3V0cHV0IGlmIHdlIGhhdmUgc29tZXRoaW5nIHRvIHByaW50Ci0KLSAgICAkdWlkID0gJyc7Ci0gICAgJHBhc3N3ZCA9ICcnOwotCi0gIH0gIyBpZiBuZXdsaW5lCi19ICMgd2hpbGUgc29tZXRoaW5nIHRvIHJlYWQKLQotIyBoYW5kbGUgbGFzdCBlbnRyeSBpZiB0aGVyZSBpc24ndCBhIG5ld2xpbmUgYmVmb3JlIEVPRgotICAgIGlmIChsZW5ndGggJHVpZCBhbmQgbGVuZ3RoICRwYXNzd2QpIHsKLSAgcHJpbnQgJHVpZCwgJzonLCAkcGFzc3dkLCAiXG4iOwotfQotCmRpZmYgLS1naXQgYS9zdXBwb3J0L1NIQTEvaHRwYXNzd2Qtc2hhMS5wbCBiL3N1cHBvcnQvU0hBMS9odHBhc3N3ZC1zaGExLnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDYyNGQxLi4wMDAwMDAwCi0tLSBhL3N1cHBvcnQvU0hBMS9odHBhc3N3ZC1zaGExLnBsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyEvdXNyL2Jpbi9wZXJsIC13Ci11c2Ugc3RyaWN0OwotIwotIyBVdGlsaXR5IHdoaWNoIHRha2VzIGEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkCi0jIG9uIHRoZSBjb21tYW5kIGxpbmUgYW5kIGdlbmVyYXRlcyBhIHVzZXJuYW1lCi0jIHNoYTEtZW5jcnl0cGVkIHBhc3N3b3JkIG9uIHRoZSBzdGRvdXQuCi0jIAotIyBUeXBpY2FsIHVzZWFnZToKLSMgCS4vaHRwYXNzd2Qtc2hhMS5wbCBkaXJreCBNeVNlY3JldCA+PiBzaGExLXBhc3N3ZAotIwotIyBUaGlzIGlzIHB1YmxpYyBkb21haW4gY29kZS4gIERvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggaXQuCi0jIEl0IHdhcyBvcmlnaW5hbGx5IGluY2x1ZGVkIGluIENsaW50b24gV29uZydzIEFwYWNoZSAxLjMuNiBTSEExL2xkaWYKLSMgcGF0Y2ggZGlzdHJpYnV0aW9uIGFzIHNhbXBsZSBjb2RlIGZvciBnZW5lcmF0aW5nIGVudHJpZXMgZm9yCi0jIEFwYWNoZSBwYXNzd29yZCBmaWxlcyB1c2luZyBTSEExLgotCi11c2UgTUlNRTo6QmFzZTY0OyAgIyBodHRwOi8vd3d3LmNwYW4ub3JnL21vZHVsZXMvYnktbW9kdWxlL01JTUUvCi11c2UgRGlnZXN0OjpTSEExOyAgIyBodHRwOi8vd3d3LmNwYW4ub3JnL21vZHVsZXMvYnktbW9kdWxlL01ENS8KLQotaWYgKCQjQVJHViE9MSkgeyBkaWUgIlVzYWdlICQwOiB1c2VyIHBhc3N3b3JkXG4iIH0KLQotcHJpbnQgJEFSR1ZbMF0sICc6e1NIQX0nLCBlbmNvZGVfYmFzZTY0KCBEaWdlc3Q6OlNIQTE6OnNoYTEoJEFSR1ZbMV0pICk7Ci0KZGlmZiAtLWdpdCBhL3N1cHBvcnQvU0hBMS9sZGlmLXNoYTEuZXhhbXBsZSBiL3N1cHBvcnQvU0hBMS9sZGlmLXNoYTEuZXhhbXBsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhmZTkxNy4uMDAwMDAwMAotLS0gYS9zdXBwb3J0L1NIQTEvbGRpZi1zaGExLmV4YW1wbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1kbjogY249c29tZXVzZXIKLWNuOiBzb21ldXNlcgotc246IHNvbWV1c2VyCi1vYmplY3RjbGFzczogdG9wCi1vYmplY3RjbGFzczogcGVyc29uCi1vYmplY3RjbGFzczogb3JnYW5pemF0aW9uYWxQZXJzb24KLW9iamVjdGNsYXNzOiBpbmV0T3JnUGVyc29uCi11aWQ6IHNvbWV1c2VyCi11c2VycGFzc3dvcmQ6IHtTSEF9R3ZGK2MzSWR2Z3hBQVJ1QzdVdXhwOXZqemlrPQotCi1kbjogY249YW5vdGhlcnVzZXIKLWNuOiBhbm90aGVydXNlcgotc246IGFub3RoZXJ1c2VyCi1vYmplY3RjbGFzczogdG9wCi1vYmplY3RjbGFzczogcGVyc29uCi1vYmplY3RjbGFzczogb3JnYW5pemF0aW9uYWxQZXJzb24KLW9iamVjdGNsYXNzOiBpbmV0T3JnUGVyc29uCi11aWQ6IGFub3RoZXJ1c2VyCi11c2VycGFzc3dvcmQ6IHtjcnlwdH1lRm5wLjRzejVYbkg2CmRpZmYgLS1naXQgYS9zdXBwb3J0L2FiLmMgYi9zdXBwb3J0L2FiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZmZmNmUuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9hYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEyOCArMCwwIEBACi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAgICoqIFRoaXMgcHJvZ3JhbSBpcyBiYXNlZCBvbiBaZXVzQmVuY2ggVjEuMCB3cml0dGVuIGJ5IEFkYW0gVHdpc3MKLSAgICoqIHdoaWNoIGlzIENvcHlyaWdodCAoYykgMTk5NiBieSBaZXVzIFRlY2hub2xvZ3kgTHRkLiBodHRwOi8vd3d3LnpldXN0ZWNoLm5ldC8KLSAgICoqCi0gICAqKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgYW5kIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FyYW50aWVzLAotICAgKiogaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCi0gICAqKiBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4gIEluIG5vIGV2ZW50IHNoYWxsCi0gICAqKiBaZXVzIFRlY2hub2xvZ3kgTHRkLiBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLAotICAgKiogZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZWQgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLAotICAgKiogcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsKLSAgICoqIG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQgYW5kIG9uIHRoZW9yeSBvZiBsaWFiaWxpdHkuICBXaGV0aGVyCi0gICAqKiBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpCi0gICAqKiBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZQotICAgKiogcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCi0gICAqKgotICovCi0KLS8qCi0gICAqKiBISVNUT1JZOgotICAgKiogICAgLSBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQWRhbSBUd2lzcyA8YWRhbUB6ZXVzLmNvLnVrPiwgTWFyY2ggMTk5NgotICAgKiogICAgICB3aXRoIGlucHV0IGZyb20gTWlrZSBCZWxzaGUgPG1iZWxzaGVAbmV0c2NhcGUuY29tPiBhbmQKLSAgICoqICAgICAgTWljaGFlbCBDYW1wYW5lbGxhIDxjYW1wYW5lbGxhQHN0ZXZtcy5lbmV0LmRlYy5jb20+Ci0gICAqKiAgICAtIEVuaGFuY2VkIGJ5IERlYW4gR2F1ZGV0IDxkZ2F1ZGV0QGFwYWNoZS5vcmc+LCBOb3ZlbWJlciAxOTk3Ci0gICAqKiAgICAtIENsZWFuZWQgdXAgYnkgUmFsZiBTLiBFbmdlbHNjaGFsbCA8cnNlQGFwYWNoZS5vcmc+LCBNYXJjaCAxOTk4Ci0gICAqKiAgICAtIFBPU1QgYW5kIHZlcmJvc2l0eSBieSBLdXJ0IFN1c3NtYW4gPGtsc0BtZXJsb3QuY29tPiwgQXVndXN0IDE5OTgKLSAgICoqICAgIC0gSFRNTCB0YWJsZSBvdXRwdXQgYWRkZWQgYnkgRGF2aWQgTi4gV2VsdG9uIDxkYXZpZHdAcHJvc2EuaXQ+LCBKYW51YXJ5IDE5OTkKLSAgICoqICAgIC0gQWRkZWQgQ29va2llLCBBcmJpdHJhcnkgaGVhZGVyIGFuZCBhdXRoIHN1cHBvcnQuIDxkaXJreEB3ZWJ3ZWF2aW5nLm9yZz4sIEFwcmlsIDE5OQotICAgKioKLSAqLwotCi0vKgotICogQlVHUzoKLSAqCi0gKiAtIHVzZXMgc3RyY3B5L2V0Yy4KLSAqIC0gaGFzIHZhcmlvdXMgb3RoZXIgcG9vciBidWZmZXIgYXR0YWNrcyByZWxhdGVkIHRvIHRoZSBsYXp5IHBhcnNpbmcgb2YKLSAqICAgcmVzcG9uc2UgaGVhZGVycyBmcm9tIHRoZSBzZXJ2ZXIKLSAqIC0gZG9lc24ndCBpbXBsZW1lbnQgbXVjaCBvZiBIVFRQLzEueCwgb25seSBhY2NlcHRzIGNlcnRhaW4gZm9ybXMgb2YKLSAqICAgcmVzcG9uc2VzCi0gKiAtIChwZXJmb3JtYW5jZSBwcm9ibGVtKSBoZWF2eSB1c2Ugb2Ygc3Ryc3RyIHNob3dzIHVwIHRvcCBpbiBwcm9maWxlCi0gKiAgIG9ubHkgYW4gaXNzdWUgZm9yIGxvb3BiYWNrIHVzYWdlCi0gKi8KLQotI2RlZmluZSBWRVJTSU9OICIxLjNjIgotCi0vKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogYWZmZWN0cyBpbmNsdWRlIGZpbGVzIG9uIFNvbGFyaXMgKi8KLSNkZWZpbmUgQlNEX0NPTVAKLQotLyogYWxsb3cgY29tcGlsYXRpb24gb3V0c2lkZSBhbiBBcGFjaGUgYnVpbGQgdHJlZSAqLwotI2lmZGVmIE5PX0FQQUNIRV9JTkNMVURFUwotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgYXBfc2VsZWN0ICAgICAgIHNlbGVjdAotI2Vsc2UJCQkJLyogKCEpTk9fQVBBQ0hFX0lOQ0xVREVTICovCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSAiYXAuaCIKLSNpZmRlZiBDSEFSU0VUX0VCQ0RJQwotI2luY2x1ZGUgImViY2RpYy5oIgotI2VuZGlmCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotCi0jaWZuZGVmIE5PX1dSSVRFVgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy91aW8uaD4KLSNlbmRpZgotCi0jZW5kaWYJCQkJLyogTk9fQVBBQ0hFX0lOQ0xVREVTICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIERFRklOSVRJT05TIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIG1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIG9uIGEgdGltZSBsaW1pdGVkIHRlc3QgKi8KLSNkZWZpbmUgTUFYX1JFUVVFU1RTIDUwMDAwCi0KLS8qIGdvb2Qgb2xkIHN0YXRlIGhvc3RuYW1lICovCi0jZGVmaW5lIFNUQVRFX1VOQ09OTkVDVEVEIDAKLSNkZWZpbmUgU1RBVEVfQ09OTkVDVElORyAgMQotI2RlZmluZSBTVEFURV9SRUFEICAgICAgICAyCi0KLSNkZWZpbmUgQ0JVRkZTSVpFICAgICAgIDUxMgotCi1zdHJ1Y3QgY29ubmVjdGlvbiB7Ci0gICAgaW50IGZkOwotICAgIGludCBzdGF0ZTsKLSAgICBpbnQgcmVhZDsJCQkvKiBhbW91bnQgb2YgYnl0ZXMgcmVhZCAqLwotICAgIGludCBicmVhZDsJCQkvKiBhbW91bnQgb2YgYm9keSByZWFkICovCi0gICAgaW50IGxlbmd0aDsJCQkvKiBDb250ZW50LUxlbmd0aCB2YWx1ZSB1c2VkIGZvciBrZWVwLWFsaXZlICovCi0gICAgY2hhciBjYnVmZltDQlVGRlNJWkVdOwkvKiBhIGJ1ZmZlciB0byBzdG9yZSBzZXJ2ZXIgcmVzcG9uc2UgaGVhZGVyICovCi0gICAgaW50IGNieDsJCQkvKiBvZmZzZXQgaW4gY2J1ZmZlciAqLwotICAgIGludCBrZWVwYWxpdmU7CQkvKiBub24temVybyBpZiBhIGtlZXAtYWxpdmUgcmVxdWVzdCAqLwotICAgIGludCBnb3RoZWFkZXI7CQkvKiBub24temVybyBpZiB3ZSBoYXZlIHRoZSBlbnRpcmUgaGVhZGVyIGluCi0JCQkJICogY2J1ZmYgKi8KLSAgICBzdHJ1Y3QgdGltZXZhbCBzdGFydCwgY29ubmVjdCwgZG9uZTsKLX07Ci0KLXN0cnVjdCBkYXRhIHsKLSAgICBpbnQgcmVhZDsJCQkvKiBudW1iZXIgb2YgYnl0ZXMgcmVhZCAqLwotICAgIGludCBjdGltZTsJCQkvKiB0aW1lIGluIG1zIHRvIGNvbm5lY3QgKi8KLSAgICBpbnQgdGltZTsJCQkvKiB0aW1lIGluIG1zIGZvciBjb25uZWN0aW9uICovCi19OwotCi0jZGVmaW5lIGFwX21pbihhLGIpICgoYSk8KGIpKT8oYSk6KGIpCi0jZGVmaW5lIGFwX21heChhLGIpICgoYSk+KGIpKT8oYSk6KGIpCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHTE9CQUxTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotaW50IHZlcmJvc2l0eSA9IDA7CQkvKiBubyB2ZXJib3NpdHkgYnkgZGVmYXVsdCAqLwotaW50IHBvc3RpbmcgPSAwOwkJLyogR0VUIGJ5IGRlZmF1bHQgKi8KLWludCByZXF1ZXN0cyA9IDE7CQkvKiBOdW1iZXIgb2YgcmVxdWVzdHMgdG8gbWFrZSAqLwotaW50IGNvbmN1cnJlbmN5ID0gMTsJCS8qIE51bWJlciBvZiBtdWx0aXBsZSByZXF1ZXN0cyB0byBtYWtlICovCi1pbnQgdGxpbWl0ID0gMDsJCQkvKiB0aW1lIGxpbWl0IGluIGNzICovCi1pbnQga2VlcGFsaXZlID0gMDsJCS8qIHRyeSBhbmQgZG8ga2VlcGFsaXZlIGNvbm5lY3Rpb25zICovCi1jaGFyIHNlcnZlcm5hbWVbMTAyNF07CQkvKiBuYW1lIHRoYXQgc2VydmVyIHJlcG9ydHMgKi8KLWNoYXIgaG9zdG5hbWVbMTAyNF07CQkvKiBob3N0IG5hbWUgKi8KLWNoYXIgcGF0aFsxMDI0XTsJCS8qIHBhdGggbmFtZSAqLwotY2hhciBwb3N0ZmlsZVsxMDI0XTsJCS8qIG5hbWUgb2YgZmlsZSBjb250YWluaW5nIHBvc3QgZGF0YSAqLwotY2hhciAqcG9zdGRhdGE7CQkJLyogKmJ1ZmZlciBjb250YWluaW5nIGRhdGEgZnJvbSBwb3N0ZmlsZSAqLwotaW50IHBvc3RsZW4gPSAwOwkJLyogbGVuZ3RoIG9mIGRhdGEgdG8gYmUgUE9TVGVkICovCi1jaGFyIGNvbnRlbnRfdHlwZVsxMDI0XTsJLyogY29udGVudCB0eXBlIHRvIHB1dCBpbiBQT1NUIGhlYWRlciAqLwotY2hhciBjb29raWVbMTAyNF0sCQkvKiBvcHRpb25hbCBjb29raWUgbGluZSAqLwotICAgICBhdXRoWzEwMjRdLAkJLyogb3B0aW9uYWwgKGJhc2ljL3V1ZW5jb2RlZCkKLQkJCQkgKiBhdXRoZW50aWZpY2F0aW9uICovCi0gICAgIGhkcnNbNDA5Nl07CQkvKiBvcHRpb25hbCBhcmJpdHJhcnkgaGVhZGVycyAqLwotaW50IHBvcnQgPSA4MDsJCQkvKiBwb3J0IG51bWJlciAqLwotCi1pbnQgdXNlX2h0bWwgPSAwOwkJLyogdXNlIGh0bWwgaW4gdGhlIHJlcG9ydCAqLwotY2hhciAqdGFibGVzdHJpbmc7Ci1jaGFyICp0cnN0cmluZzsKLWNoYXIgKnRkc3RyaW5nOwotCi1pbnQgZG9jbGVuID0gMDsJCQkvKiB0aGUgbGVuZ3RoIHRoZSBkb2N1bWVudCBzaG91bGQgYmUgKi8KLWludCB0b3RhbHJlYWQgPSAwOwkJLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgKi8KLWludCB0b3RhbGJyZWFkID0gMDsJCS8qIHRvdG9hbCBhbW91bnQgb2YgZW50aXR5IGJvZHkgcmVhZCAqLwotaW50IHRvdGFscG9zdGVkID0gMDsJCS8qIHRvdGFsIG51bWJlciBvZiBieXRlcyBwb3N0ZWQsIGluYy4gaGVhZGVycyAqLwotaW50IGRvbmUgPSAwOwkJCS8qIG51bWJlciBvZiByZXF1ZXN0cyB3ZSBoYXZlIGRvbmUgKi8KLWludCBkb25la2EgPSAwOwkJCS8qIG51bWJlciBvZiBrZWVwIGFsaXZlIGNvbm5lY3Rpb25zIGRvbmUgKi8KLWludCBnb29kID0gMCwgYmFkID0gMDsJCS8qIG51bWJlciBvZiBnb29kIGFuZCBiYWQgcmVxdWVzdHMgKi8KLQotLyogc3RvcmUgZXJyb3IgY2FzZXMgKi8KLWludCBlcnJfbGVuZ3RoID0gMCwgZXJyX2Nvbm4gPSAwLCBlcnJfZXhjZXB0ID0gMDsKLWludCBlcnJfcmVzcG9uc2UgPSAwOwotCi1zdHJ1Y3QgdGltZXZhbCBzdGFydCwgZW5kdGltZTsKLQotLyogZ2xvYmFsIHJlcXVlc3QgKGFuZCBpdHMgbGVuZ3RoKSAqLwotY2hhciByZXF1ZXN0WzUxMl07Ci1pbnQgcmVxbGVuOwotCi0vKiBvbmUgZ2xvYmFsIHRocm93LWF3YXkgYnVmZmVyIHRvIHJlYWQgc3R1ZmYgaW50byAqLwotY2hhciBidWZmZXJbODE5Ml07Ci0KLXN0cnVjdCBjb25uZWN0aW9uICpjb247CQkvKiBjb25uZWN0aW9uIGFycmF5ICovCi1zdHJ1Y3QgZGF0YSAqc3RhdHM7CQkvKiBkYXRlIGZvciBlYWNoIHJlcXVlc3QgKi8KLQotZmRfc2V0IHJlYWRiaXRzLCB3cml0ZWJpdHM7CS8qIGJpdHMgZm9yIHNlbGVjdCAqLwotc3RydWN0IHNvY2thZGRyX2luIHNlcnZlcjsJLyogc2VydmVyIGFkZHIgc3RydWN0dXJlICovCi0KLSNpZm5kZWYgQkVPUwotI2RlZmluZSBhYl9jbG9zZShzKSBjbG9zZShzKQotI2RlZmluZSBhYl9yZWFkKGEsYixjKSByZWFkKGEsYixjKQotI2RlZmluZSBhYl93cml0ZShhLGIsYykgd3JpdGUoYSxiLGMpCi0jZWxzZQotI2RlZmluZSBhYl9jbG9zZShzKSBjbG9zZXNvY2tldChzKQotI2RlZmluZSBhYl9yZWFkKGEsYixjKSByZWN2KGEsYixjLDApCi0jZGVmaW5lIGFiX3dyaXRlKGEsYixjKSBzZW5kKGEsYixjLDApCi0jZW5kaWYKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIHNpbXBsZSBsaXR0bGUgZnVuY3Rpb24gdG8gcGVycm9yIGFuZCBleGl0ICovCi0KLXN0YXRpYyB2b2lkIGVycihjaGFyICpzKQotewotICAgIGlmIChlcnJubykgewotCXBlcnJvcihzKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JcHJpbnRmKCIlcyIsIHMpOwotICAgIH0KLSAgICBleGl0KGVycm5vKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIHdyaXRlIG91dCByZXF1ZXN0IHRvIGEgY29ubmVjdGlvbiAtIGFzc3VtZXMgd2UgY2FuIHdyaXRlCi0gICAoc21hbGwpIHJlcXVlc3Qgb3V0IGluIG9uZSBnbyBpbnRvIG91ciBuZXcgc29ja2V0IGJ1ZmZlciAgKi8KLQotc3RhdGljIHZvaWQgd3JpdGVfcmVxdWVzdChzdHJ1Y3QgY29ubmVjdGlvbiAqIGMpCi17Ci0jaWZuZGVmIE5PX1dSSVRFVgotICAgIHN0cnVjdCBpb3ZlYyBvdXRbMl07IGludCBvdXRjbnQgPSAxOwotI2VuZGlmCi0gICAgZ2V0dGltZW9mZGF5KCZjLT5jb25uZWN0LCAwKTsKLSNpZm5kZWYgTk9fV1JJVEVWCi0gICAgb3V0WzBdLmlvdl9iYXNlID0gcmVxdWVzdDsKLSAgICBvdXRbMF0uaW92X2xlbiA9IHJlcWxlbjsKLQotICAgIGlmIChwb3N0aW5nPjApIHsKLQlvdXRbMV0uaW92X2Jhc2UgPSBwb3N0ZGF0YTsKLQlvdXRbMV0uaW92X2xlbiA9IHBvc3RsZW47Ci0Jb3V0Y250ID0gMjsKLQl0b3RhbHBvc3RlZCArPSAocmVxbGVuICsgcG9zdGxlbik7Ci0gICAgfQotICAgIHdyaXRldihjLT5mZCxvdXQsIG91dGNudCk7Ci0jZWxzZQotICAgIGFiX3dyaXRlKGMtPmZkLHJlcXVlc3QscmVxbGVuKTsKLSAgICBpZiAocG9zdGluZz4wKSB7Ci0gICAgICAgIGFiX3dyaXRlKGMtPmZkLHBvc3RkYXRhLHBvc3RsZW4pOwotICAgICAgICB0b3RhbHBvc3RlZCArPSAocmVxbGVuICsgcG9zdGxlbik7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBjLT5zdGF0ZSA9IFNUQVRFX1JFQUQ7Ci0gICAgRkRfU0VUKGMtPmZkLCAmcmVhZGJpdHMpOwotICAgIEZEX0NMUihjLT5mZCwgJndyaXRlYml0cyk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBtYWtlIGFuIGZkIG5vbiBibG9ja2luZyAqLwotCi1zdGF0aWMgdm9pZCBub25ibG9jayhpbnQgZmQpCi17Ci0gICAgaW50IGkgPSAxOwotI2lmZGVmIEJFT1MKLSAgICBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19OT05CTE9DSywgJmksIHNpemVvZihpKSk7Ci0jZWxzZQotICAgIGlvY3RsKGZkLCBGSU9OQklPLCAmaSk7Ci0jZW5kaWYKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIHJldHVybnMgdGhlIHRpbWUgaW4gbXMgYmV0d2VlbiB0d28gdGltZXZhbHMgKi8KLQotc3RhdGljIGludCB0aW1lZGlmKHN0cnVjdCB0aW1ldmFsIGEsIHN0cnVjdCB0aW1ldmFsIGIpCi17Ci0gICAgcmVnaXN0ZXIgaW50IHVzLCBzOwotCi0gICAgdXMgPSBhLnR2X3VzZWMgLSBiLnR2X3VzZWM7Ci0gICAgdXMgLz0gMTAwMDsKLSAgICBzID0gYS50dl9zZWMgLSBiLnR2X3NlYzsKLSAgICBzICo9IDEwMDA7Ci0gICAgcmV0dXJuIHMgKyB1czsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIGNhbGN1bGF0ZSBhbmQgb3V0cHV0IHJlc3VsdHMgKi8KLQotc3RhdGljIHZvaWQgb3V0cHV0X3Jlc3VsdHModm9pZCkKLXsKLSAgICBpbnQgdGltZXRha2VuOwotCi0gICAgZ2V0dGltZW9mZGF5KCZlbmR0aW1lLCAwKTsKLSAgICB0aW1ldGFrZW4gPSB0aW1lZGlmKGVuZHRpbWUsIHN0YXJ0KTsKLQotICAgIHByaW50ZigiXHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcciIpOwotICAgIHByaW50ZigiU2VydmVyIFNvZnR3YXJlOiAgICAgICAgJXNcbiIsIHNlcnZlcm5hbWUpOwotICAgIHByaW50ZigiU2VydmVyIEhvc3RuYW1lOiAgICAgICAgJXNcbiIsIGhvc3RuYW1lKTsKLSAgICBwcmludGYoIlNlcnZlciBQb3J0OiAgICAgICAgICAgICVkXG4iLCBwb3J0KTsKLSAgICBwcmludGYoIlxuIik7Ci0gICAgcHJpbnRmKCJEb2N1bWVudCBQYXRoOiAgICAgICAgICAlc1xuIiwgcGF0aCk7Ci0gICAgcHJpbnRmKCJEb2N1bWVudCBMZW5ndGg6ICAgICAgICAlZCBieXRlc1xuIiwgZG9jbGVuKTsKLSAgICBwcmludGYoIlxuIik7Ci0gICAgcHJpbnRmKCJDb25jdXJyZW5jeSBMZXZlbDogICAgICAlZFxuIiwgY29uY3VycmVuY3kpOwotICAgIHByaW50ZigiVGltZSB0YWtlbiBmb3IgdGVzdHM6ICAgJWQuJTAzZCBzZWNvbmRzXG4iLAotCSAgIHRpbWV0YWtlbiAvIDEwMDAsIHRpbWV0YWtlbiAlIDEwMDApOwotICAgIHByaW50ZigiQ29tcGxldGUgcmVxdWVzdHM6ICAgICAgJWRcbiIsIGRvbmUpOwotICAgIHByaW50ZigiRmFpbGVkIHJlcXVlc3RzOiAgICAgICAgJWRcbiIsIGJhZCk7Ci0gICAgaWYgKGJhZCkKLQlwcmludGYoIiAgIChDb25uZWN0OiAlZCwgTGVuZ3RoOiAlZCwgRXhjZXB0aW9uczogJWQpXG4iLAotCSAgICAgICBlcnJfY29ubiwgZXJyX2xlbmd0aCwgZXJyX2V4Y2VwdCk7Ci0gICAgaWYgKGVycl9yZXNwb25zZSkKLQlwcmludGYoIk5vbi0yeHggcmVzcG9uc2VzOiAgICAgICVkXG4iLCBlcnJfcmVzcG9uc2UpOwotICAgIGlmIChrZWVwYWxpdmUpCi0JcHJpbnRmKCJLZWVwLUFsaXZlIHJlcXVlc3RzOiAgICAlZFxuIiwgZG9uZWthKTsKLSAgICBwcmludGYoIlRvdGFsIHRyYW5zZmVycmVkOiAgICAgICVkIGJ5dGVzXG4iLCB0b3RhbHJlYWQpOwotICAgIGlmIChwb3N0aW5nPjApCi0JcHJpbnRmKCJUb3RhbCBQT1NUZWQ6ICAgICAgICAgICAlZFxuIiwgdG90YWxwb3N0ZWQpOwotICAgIHByaW50ZigiSFRNTCB0cmFuc2ZlcnJlZDogICAgICAgJWQgYnl0ZXNcbiIsIHRvdGFsYnJlYWQpOwotCi0gICAgLyogYXZvaWQgZGl2aWRlIGJ5IHplcm8gKi8KLSAgICBpZiAodGltZXRha2VuKSB7Ci0JcHJpbnRmKCJSZXF1ZXN0cyBwZXIgc2Vjb25kOiAgICAlLjJmXG4iLCAxMDAwICogKGZsb2F0KSAoZG9uZSkgLyB0aW1ldGFrZW4pOwotCXByaW50ZigiVHJhbnNmZXIgcmF0ZTogICAgICAgICAgJS4yZiBrYi9zIHJlY2VpdmVkXG4iLAotCSAgICAgICAoZmxvYXQpICh0b3RhbHJlYWQpIC8gdGltZXRha2VuKTsKLQlpZiAocG9zdGluZz4wKSB7Ci0JICAgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgJS4yZiBrYi9zIHNlbnRcbiIsCi0JCSAgIChmbG9hdCkgKHRvdGFscG9zdGVkKSAvIHRpbWV0YWtlbik7Ci0JICAgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgJS4yZiBrYi9zIHRvdGFsXG4iLAotCQkgICAoZmxvYXQpICh0b3RhbHJlYWQgKyB0b3RhbHBvc3RlZCkgLyB0aW1ldGFrZW4pOwotCX0KLSAgICB9Ci0KLSAgICB7Ci0JLyogd29yayBvdXQgY29ubmVjdGlvbiB0aW1lcyAqLwotCWludCBpOwotCWludCB0b3RhbGNvbiA9IDAsIHRvdGFsID0gMDsKLQlpbnQgbWluY29uID0gOTk5OTk5OSwgbWludG90ID0gOTk5OTk5OwotCWludCBtYXhjb24gPSAwLCBtYXh0b3QgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IHJlcXVlc3RzOyBpKyspIHsKLQkgICAgc3RydWN0IGRhdGEgcyA9IHN0YXRzW2ldOwotCSAgICBtaW5jb24gPSBhcF9taW4obWluY29uLCBzLmN0aW1lKTsKLQkgICAgbWludG90ID0gYXBfbWluKG1pbnRvdCwgcy50aW1lKTsKLQkgICAgbWF4Y29uID0gYXBfbWF4KG1heGNvbiwgcy5jdGltZSk7Ci0JICAgIG1heHRvdCA9IGFwX21heChtYXh0b3QsIHMudGltZSk7Ci0JICAgIHRvdGFsY29uICs9IHMuY3RpbWU7Ci0JICAgIHRvdGFsICs9IHMudGltZTsKLQl9Ci0JaWYgKHJlcXVlc3RzID4gMCkgeyAvKiBhdm9pZCBkaXZpc2lvbiBieSB6ZXJvIChpZiAwIHJlcXVlc3RzKSAqLwotCSAgICBwcmludGYoIlxuQ29ubm5lY3Rpb24gVGltZXMgKG1zKVxuIik7Ci0JICAgIHByaW50ZigiICAgICAgICAgICAgICBtaW4gICBhdmcgICBtYXhcbiIpOwotCSAgICBwcmludGYoIkNvbm5lY3Q6ICAgICU1ZCAlNWQgJTVkXG4iLCBtaW5jb24sIHRvdGFsY29uIC8gcmVxdWVzdHMsIG1heGNvbik7Ci0JICAgIHByaW50ZigiUHJvY2Vzc2luZzogJTVkICU1ZCAlNWRcbiIsCi0JCSAgIG1pbnRvdCAtIG1pbmNvbiwgKHRvdGFsIC8gcmVxdWVzdHMpIC0gKHRvdGFsY29uIC8gcmVxdWVzdHMpLAotCQkgICBtYXh0b3QgLSBtYXhjb24pOwotCSAgICBwcmludGYoIlRvdGFsOiAgICAgICU1ZCAlNWQgJTVkXG4iLCBtaW50b3QsIHRvdGFsIC8gcmVxdWVzdHMsIG1heHRvdCk7Ci0JfQotICAgIH0KLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIGNhbGN1bGF0ZSBhbmQgb3V0cHV0IHJlc3VsdHMgaW4gSFRNTCAgKi8KLQotc3RhdGljIHZvaWQgb3V0cHV0X2h0bWxfcmVzdWx0cyh2b2lkKQotewotICAgIGludCB0aW1ldGFrZW47Ci0KLSAgICBnZXR0aW1lb2ZkYXkoJmVuZHRpbWUsIDApOwotICAgIHRpbWV0YWtlbiA9IHRpbWVkaWYoZW5kdGltZSwgc3RhcnQpOwotCi0gICAgcHJpbnRmKCJcblxuPHRhYmxlICVzPlxuIiwgdGFibGVzdHJpbmcpOwotICAgIHByaW50ZigiPHRyICVzPjx0aCBjb2xzcGFuPTIgJXM+U2VydmVyIFNvZnR3YXJlOjwvdGg+IgotCSAgICI8dGQgY29sc3Bhbj0yICVzPiVzPC90ZD48L3RyPlxuIiwKLQkgICB0cnN0cmluZywgdGRzdHJpbmcsIHRkc3RyaW5nLCBzZXJ2ZXJuYW1lKTsKLSAgICBwcmludGYoIjx0ciAlcz48dGggY29sc3Bhbj0yICVzPlNlcnZlciBIb3N0bmFtZTo8L3RoPiIKLQkgICAiPHRkIGNvbHNwYW49MiAlcz4lczwvdGQ+PC90cj5cbiIsCi0JICAgdHJzdHJpbmcsIHRkc3RyaW5nLCB0ZHN0cmluZywgaG9zdG5hbWUpOwotICAgIHByaW50ZigiPHRyICVzPjx0aCBjb2xzcGFuPTIgJXM+U2VydmVyIFBvcnQ6PC90aD4iCi0JICAgIjx0ZCBjb2xzcGFuPTIgJXM+JWQ8L3RkPjwvdHI+XG4iLAotCSAgIHRyc3RyaW5nLCB0ZHN0cmluZywgdGRzdHJpbmcsIHBvcnQpOwotICAgIHByaW50ZigiPHRyICVzPjx0aCBjb2xzcGFuPTIgJXM+RG9jdW1lbnQgUGF0aDo8L3RoPiIKLQkgICAiPHRkIGNvbHNwYW49MiAlcz4lczwvdGQ+PC90cj5cbiIsCi0JICAgdHJzdHJpbmcsIHRkc3RyaW5nLCB0ZHN0cmluZywgcGF0aCk7Ci0gICAgcHJpbnRmKCI8dHIgJXM+PHRoIGNvbHNwYW49MiAlcz5Eb2N1bWVudCBMZW5ndGg6PC90aD4iCi0JICAgIjx0ZCBjb2xzcGFuPTIgJXM+JWQgYnl0ZXM8L3RkPjwvdHI+XG4iLAotCSAgIHRyc3RyaW5nLCB0ZHN0cmluZywgdGRzdHJpbmcsIGRvY2xlbik7Ci0gICAgcHJpbnRmKCI8dHIgJXM+PHRoIGNvbHNwYW49MiAlcz5Db25jdXJyZW5jeSBMZXZlbDo8L3RoPiIKLQkgICAiPHRkIGNvbHNwYW49MiAlcz4lZDwvdGQ+PC90cj5cbiIsCi0JICAgdHJzdHJpbmcsIHRkc3RyaW5nLCB0ZHN0cmluZywgY29uY3VycmVuY3kpOwotICAgIHByaW50ZigiPHRyICVzPjx0aCBjb2xzcGFuPTIgJXM+VGltZSB0YWtlbiBmb3IgdGVzdHM6PC90aD4iCi0JICAgIjx0ZCBjb2xzcGFuPTIgJXM+JWQuJTAzZCBzZWNvbmRzPC90ZD48L3RyPlxuIiwKLQkgICB0cnN0cmluZywgdGRzdHJpbmcsIHRkc3RyaW5nLCB0aW1ldGFrZW4gLyAxMDAwLCB0aW1ldGFrZW4gJSAxMDAwKTsKLSAgICBwcmludGYoIjx0ciAlcz48dGggY29sc3Bhbj0yICVzPkNvbXBsZXRlIHJlcXVlc3RzOjwvdGg+IgotCSAgICI8dGQgY29sc3Bhbj0yICVzPiVkPC90ZD48L3RyPlxuIiwKLQkgICB0cnN0cmluZywgdGRzdHJpbmcsIHRkc3RyaW5nLCBkb25lKTsKLSAgICBwcmludGYoIjx0ciAlcz48dGggY29sc3Bhbj0yICVzPkZhaWxlZCByZXF1ZXN0czo8L3RoPiIKLQkgICAiPHRkIGNvbHNwYW49MiAlcz4lZDwvdGQ+PC90cj5cbiIsCi0JICAgdHJzdHJpbmcsIHRkc3RyaW5nLCB0ZHN0cmluZywgYmFkKTsKLSAgICBpZiAoYmFkKQotCXByaW50ZigiPHRyICVzPjx0ZCBjb2xzcGFuPTQgJXMgPiAgIChDb25uZWN0OiAlZCwgTGVuZ3RoOiAlZCwgRXhjZXB0aW9uczogJWQpPC90ZD48L3RyPlxuIiwKLQkgICAgICAgdHJzdHJpbmcsIHRkc3RyaW5nLCBlcnJfY29ubiwgZXJyX2xlbmd0aCwgZXJyX2V4Y2VwdCk7Ci0gICAgaWYgKGVycl9yZXNwb25zZSkKLQlwcmludGYoIjx0ciAlcz48dGggY29sc3Bhbj0yICVzPk5vbi0yeHggcmVzcG9uc2VzOjwvdGg+IgotCSAgICAgICAiPHRkIGNvbHNwYW49MiAlcz4lZDwvdGQ+PC90cj5cbiIsCi0JICAgICAgIHRyc3RyaW5nLCB0ZHN0cmluZywgdGRzdHJpbmcsIGVycl9yZXNwb25zZSk7Ci0gICAgaWYgKGtlZXBhbGl2ZSkKLQlwcmludGYoIjx0ciAlcz48dGggY29sc3Bhbj0yICVzPktlZXAtQWxpdmUgcmVxdWVzdHM6PC90aD4iCi0JICAgICAgICI8dGQgY29sc3Bhbj0yICVzPiVkPC90ZD48L3RyPlxuIiwKLQkgICAgICAgdHJzdHJpbmcsIHRkc3RyaW5nLCB0ZHN0cmluZywgZG9uZWthKTsKLSAgICBwcmludGYoIjx0ciAlcz48dGggY29sc3Bhbj0yICVzPlRvdGFsIHRyYW5zZmVycmVkOjwvdGg+IgotCSAgICI8dGQgY29sc3Bhbj0yICVzPiVkIGJ5dGVzPC90ZD48L3RyPlxuIiwKLQkgICB0cnN0cmluZywgdGRzdHJpbmcsIHRkc3RyaW5nLCB0b3RhbHJlYWQpOwotICAgIGlmIChwb3N0aW5nPjApCi0JcHJpbnRmKCI8dHIgJXM+PHRoIGNvbHNwYW49MiAlcz5Ub3RhbCBQT1NUZWQ6PC90aD4iCi0JICAgICAgICI8dGQgY29sc3Bhbj0yICVzPiVkPC90ZD48L3RyPlxuIiwKLQkgICAgICAgdHJzdHJpbmcsIHRkc3RyaW5nLCB0ZHN0cmluZywgdG90YWxwb3N0ZWQpOwotICAgIHByaW50ZigiPHRyICVzPjx0aCBjb2xzcGFuPTIgJXM+SFRNTCB0cmFuc2ZlcnJlZDo8L3RoPiIKLQkgICAiPHRkIGNvbHNwYW49MiAlcz4lZCBieXRlczwvdGQ+PC90cj5cbiIsCi0JICAgdHJzdHJpbmcsIHRkc3RyaW5nLCB0ZHN0cmluZywgdG90YWxicmVhZCk7Ci0KLSAgICAvKiBhdm9pZCBkaXZpZGUgYnkgemVybyAqLwotICAgIGlmICh0aW1ldGFrZW4pIHsKLQlwcmludGYoIjx0ciAlcz48dGggY29sc3Bhbj0yICVzPlJlcXVlc3RzIHBlciBzZWNvbmQ6PC90aD4iCi0JICAgICAgICI8dGQgY29sc3Bhbj0yICVzPiUuMmY8L3RkPjwvdHI+XG4iLAotCSAgIHRyc3RyaW5nLCB0ZHN0cmluZywgdGRzdHJpbmcsIDEwMDAgKiAoZmxvYXQpIChkb25lKSAvIHRpbWV0YWtlbik7Ci0JcHJpbnRmKCI8dHIgJXM+PHRoIGNvbHNwYW49MiAlcz5UcmFuc2ZlciByYXRlOjwvdGg+IgotCSAgICAgICAiPHRkIGNvbHNwYW49MiAlcz4lLjJmIGtiL3MgcmVjZWl2ZWQ8L3RkPjwvdHI+XG4iLAotCSAgICAgdHJzdHJpbmcsIHRkc3RyaW5nLCB0ZHN0cmluZywgKGZsb2F0KSAodG90YWxyZWFkKSAvIHRpbWV0YWtlbik7Ci0JaWYgKHBvc3Rpbmc+MCkgewotCSAgICBwcmludGYoIjx0ciAlcz48dGQgY29sc3Bhbj0yICVzPiZuYnNwOzwvdGQ+IgotCQkgICAiPHRkIGNvbHNwYW49MiAlcz4lLjJmIGtiL3Mgc2VudDwvdGQ+PC90cj5cbiIsCi0JCSAgIHRyc3RyaW5nLCB0ZHN0cmluZywgdGRzdHJpbmcsCi0JCSAgIChmbG9hdCkgKHRvdGFscG9zdGVkKSAvIHRpbWV0YWtlbik7Ci0JICAgIHByaW50ZigiPHRyICVzPjx0ZCBjb2xzcGFuPTIgJXM+Jm5ic3A7PC90ZD4iCi0JCSAgICI8dGQgY29sc3Bhbj0yICVzPiUuMmYga2IvcyB0b3RhbDwvdGQ+PC90cj5cbiIsCi0JCSAgIHRyc3RyaW5nLCB0ZHN0cmluZywgdGRzdHJpbmcsCi0JCSAgIChmbG9hdCkgKHRvdGFscmVhZCArIHRvdGFscG9zdGVkKSAvIHRpbWV0YWtlbik7Ci0JfQotICAgIH0KLQotICAgIHsKLQkvKiB3b3JrIG91dCBjb25uZWN0aW9uIHRpbWVzICovCi0JaW50IGk7Ci0JaW50IHRvdGFsY29uID0gMCwgdG90YWwgPSAwOwotCWludCBtaW5jb24gPSA5OTk5OTk5LCBtaW50b3QgPSA5OTk5OTk7Ci0JaW50IG1heGNvbiA9IDAsIG1heHRvdCA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmVxdWVzdHM7IGkrKykgewotCSAgICBzdHJ1Y3QgZGF0YSBzID0gc3RhdHNbaV07Ci0JICAgIG1pbmNvbiA9IGFwX21pbihtaW5jb24sIHMuY3RpbWUpOwotCSAgICBtaW50b3QgPSBhcF9taW4obWludG90LCBzLnRpbWUpOwotCSAgICBtYXhjb24gPSBhcF9tYXgobWF4Y29uLCBzLmN0aW1lKTsKLQkgICAgbWF4dG90ID0gYXBfbWF4KG1heHRvdCwgcy50aW1lKTsKLQkgICAgdG90YWxjb24gKz0gcy5jdGltZTsKLQkgICAgdG90YWwgKz0gcy50aW1lOwotCX0KLQotCWlmIChyZXF1ZXN0cyA+IDApIHsgLyogYXZvaWQgZGl2aXNpb24gYnkgemVybyAoaWYgMCByZXF1ZXN0cykgKi8KLQkgICAgcHJpbnRmKCI8dHIgJXM+PHRoICVzIGNvbHNwYW49ND5Db25ubmVjdGlvbiBUaW1lcyAobXMpPC90aD48L3RyPlxuIiwKLQkJICAgdHJzdHJpbmcsIHRkc3RyaW5nKTsKLQkgICAgcHJpbnRmKCI8dHIgJXM+PHRoICVzPiZuYnNwOzwvdGg+IDx0aCAlcz5taW48L3RoPiAgIDx0aCAlcz5hdmc8L3RoPiAgIDx0aCAlcz5tYXg8L3RoPjwvdHI+XG4iLAotCQkgICB0cnN0cmluZywgdGRzdHJpbmcsIHRkc3RyaW5nLCB0ZHN0cmluZywgdGRzdHJpbmcpOwotCSAgICBwcmludGYoIjx0ciAlcz48dGggJXM+Q29ubmVjdDo8L3RoPiIKLQkJICAgIjx0ZCAlcz4lNWQ8L3RkPiIKLQkJICAgIjx0ZCAlcz4lNWQ8L3RkPiIKLQkJICAgIjx0ZCAlcz4lNWQ8L3RkPjwvdHI+XG4iLAotCQkgICB0cnN0cmluZywgdGRzdHJpbmcsIHRkc3RyaW5nLCBtaW5jb24sIHRkc3RyaW5nLCB0b3RhbGNvbiAvIHJlcXVlc3RzLCB0ZHN0cmluZywgbWF4Y29uKTsKLQkgICAgcHJpbnRmKCI8dHIgJXM+PHRoICVzPlByb2Nlc3Npbmc6PC90aD4iCi0JCSAgICI8dGQgJXM+JTVkPC90ZD4iCi0JCSAgICI8dGQgJXM+JTVkPC90ZD4iCi0JCSAgICI8dGQgJXM+JTVkPC90ZD48L3RyPlxuIiwKLQkJICAgdHJzdHJpbmcsIHRkc3RyaW5nLCB0ZHN0cmluZywgbWludG90IC0gbWluY29uLCB0ZHN0cmluZywKLQkJICAgKHRvdGFsIC8gcmVxdWVzdHMpIC0gKHRvdGFsY29uIC8gcmVxdWVzdHMpLCB0ZHN0cmluZywgbWF4dG90IC0gbWF4Y29uKTsKLQkgICAgcHJpbnRmKCI8dHIgJXM+PHRoICVzPlRvdGFsOjwvdGg+IgotCQkgICAiPHRkICVzPiU1ZDwvdGQ+IgotCQkgICAiPHRkICVzPiU1ZDwvdGQ+IgotCQkgICAiPHRkICVzPiU1ZDwvdGQ+PC90cj5cbiIsCi0JCSAgIHRyc3RyaW5nLCB0ZHN0cmluZywgdGRzdHJpbmcsIG1pbnRvdCwgdGRzdHJpbmcsIHRvdGFsIC8gcmVxdWVzdHMsIHRkc3RyaW5nLCBtYXh0b3QpOwotCX0KLQlwcmludGYoIjwvdGFibGU+XG4iKTsKLSAgICB9Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBzdGFydCBhc25jaHJvbm91cyBub24tYmxvY2tpbmcgY29ubmVjdGlvbiAqLwotCi1zdGF0aWMgdm9pZCBzdGFydF9jb25uZWN0KHN0cnVjdCBjb25uZWN0aW9uICogYykKLXsKLSAgICBjLT5yZWFkID0gMDsKLSAgICBjLT5icmVhZCA9IDA7Ci0gICAgYy0+a2VlcGFsaXZlID0gMDsKLSAgICBjLT5jYnggPSAwOwotICAgIGMtPmdvdGhlYWRlciA9IDA7Ci0KLSAgICBjLT5mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7Ci0gICAgaWYgKGMtPmZkIDwgMCkKLQllcnIoInNvY2tldCIpOwotCi0gICAgbm9uYmxvY2soYy0+ZmQpOwotICAgIGdldHRpbWVvZmRheSgmYy0+c3RhcnQsIDApOwotCi0gICAgaWYgKGNvbm5lY3QoYy0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJiBzZXJ2ZXIsIHNpemVvZihzZXJ2ZXIpKSA8IDApIHsKLQlpZiAoZXJybm8gPT0gRUlOUFJPR1JFU1MpIHsKLQkgICAgYy0+c3RhdGUgPSBTVEFURV9DT05ORUNUSU5HOwotCSAgICBGRF9TRVQoYy0+ZmQsICZ3cml0ZWJpdHMpOwotCSAgICByZXR1cm47Ci0JfQotCWVsc2UgewotCSAgICBhYl9jbG9zZShjLT5mZCk7Ci0JICAgIGVycl9jb25uKys7Ci0JICAgIGlmIChiYWQrKyA+IDEwKSB7Ci0JCWVycigiXG5UZXN0IGFib3J0ZWQgYWZ0ZXIgMTAgZmFpbHVyZXNcblxuIik7Ci0JICAgIH0KLQkgICAgc3RhcnRfY29ubmVjdChjKTsKLQl9Ci0gICAgfQotCi0gICAgLyogY29ubmVjdGVkIGZpcnN0IHRpbWUgKi8KLSAgICBjLT5zdGF0ZSA9IFNUQVRFX0NPTk5FQ1RJTkc7Ci0gICAgRkRfU0VUKGMtPmZkLCAmd3JpdGViaXRzKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIGNsb3NlIGRvd24gY29ubmVjdGlvbiBhbmQgc2F2ZSBzdGF0cyAqLwotCi1zdGF0aWMgdm9pZCBjbG9zZV9jb25uZWN0aW9uKHN0cnVjdCBjb25uZWN0aW9uICogYykKLXsKLSAgICBpZiAoYy0+cmVhZCA9PSAwICYmIGMtPmtlZXBhbGl2ZSkgewotCS8qIHNlcnZlciBoYXMgbGVnaXRpbWF0ZWx5IHNodXQgZG93biBhbiBpZGxlIGtlZXAgYWxpdmUgcmVxdWVzdCAqLwotCWdvb2QtLTsJCQkvKiBjb25uZWN0aW9uIG5ldmVyIGhhcHBlbmQgKi8KLSAgICB9Ci0gICAgZWxzZSB7Ci0JaWYgKGdvb2QgPT0gMSkgewotCSAgICAvKiBmaXJzdCB0aW1lIGhlcmUgKi8KLQkgICAgZG9jbGVuID0gYy0+YnJlYWQ7Ci0JfQotCWVsc2UgaWYgKGMtPmJyZWFkICE9IGRvY2xlbikgewotCSAgICBiYWQrKzsKLQkgICAgZXJyX2xlbmd0aCsrOwotCX0KLQotCS8qIHNhdmUgb3V0IHRpbWUgKi8KLQlpZiAoZG9uZSA8IHJlcXVlc3RzKSB7Ci0JICAgIHN0cnVjdCBkYXRhIHM7Ci0JICAgIGdldHRpbWVvZmRheSgmYy0+ZG9uZSwgMCk7Ci0JICAgIHMucmVhZCA9IGMtPnJlYWQ7Ci0JICAgIHMuY3RpbWUgPSB0aW1lZGlmKGMtPmNvbm5lY3QsIGMtPnN0YXJ0KTsKLQkgICAgcy50aW1lID0gdGltZWRpZihjLT5kb25lLCBjLT5zdGFydCk7Ci0JICAgIHN0YXRzW2RvbmUrK10gPSBzOwotCX0KLSAgICB9Ci0KLSAgICBhYl9jbG9zZShjLT5mZCk7Ci0gICAgRkRfQ0xSKGMtPmZkLCAmcmVhZGJpdHMpOwotICAgIEZEX0NMUihjLT5mZCwgJndyaXRlYml0cyk7Ci0KLSAgICAvKiBjb25uZWN0IGFnYWluICovCi0gICAgc3RhcnRfY29ubmVjdChjKTsKLSAgICByZXR1cm47Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiByZWFkIGRhdGEgZnJvbSBjb25uZWN0aW9uICovCi0KLXN0YXRpYyB2b2lkIHJlYWRfY29ubmVjdGlvbihzdHJ1Y3QgY29ubmVjdGlvbiAqIGMpCi17Ci0gICAgaW50IHI7Ci0gICAgY2hhciAqcGFydDsKLSAgICBjaGFyIHJlc3Bjb2RlWzRdOwkJLyogMyBkaWdpdHMgYW5kIG51bGwgKi8KLQotICAgIHIgPSBhYl9yZWFkKGMtPmZkLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKLQotICAgIGlmIChyID09IDAgfHwgKHIgPCAwICYmIGVycm5vICE9IEVBR0FJTikpIHsKLQlnb29kKys7Ci0JY2xvc2VfY29ubmVjdGlvbihjKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHIgPCAwICYmIGVycm5vID09IEVBR0FJTikKLQlyZXR1cm47Ci0KLSAgICBjLT5yZWFkICs9IHI7Ci0gICAgdG90YWxyZWFkICs9IHI7Ci0KLSAgICBpZiAoIWMtPmdvdGhlYWRlcikgewotCWNoYXIgKnM7Ci0JaW50IGwgPSA0OwotCWludCBzcGFjZSA9IENCVUZGU0laRSAtIGMtPmNieCAtIDE7CS8qIC0xIHRvIGFsbG93IGZvciAwCi0JCQkJCQkgKiB0ZXJtaW5hdG9yICovCi0JaW50IHRvY29weSA9IChzcGFjZSA8IHIpID8gc3BhY2UgOiByOwotI2lmbmRlZiBDSEFSU0VUX0VCQ0RJQwotCW1lbWNweShjLT5jYnVmZiArIGMtPmNieCwgYnVmZmVyLCB0b2NvcHkpOwotI2Vsc2UJCQkJLyogQ0hBUlNFVF9FQkNESUMgKi8KLQlhc2NpaTJlYmNkaWMoYy0+Y2J1ZmYgKyBjLT5jYngsIGJ1ZmZlciwgdG9jb3B5KTsKLSNlbmRpZgkJCQkvKiBDSEFSU0VUX0VCQ0RJQyAqLwotCWMtPmNieCArPSB0b2NvcHk7Ci0Jc3BhY2UgLT0gdG9jb3B5OwotCWMtPmNidWZmW2MtPmNieF0gPSAwOwkvKiB0ZXJtaW5hdGUgZm9yIGJlbmVmaXQgb2Ygc3Ryc3RyICovCi0JaWYgKHZlcmJvc2l0eSA+PSA0KSB7Ci0JICAgIHByaW50ZigiTE9HOiBoZWFkZXIgcmVjZWl2ZWQ6XG4lc1xuIiwgYy0+Y2J1ZmYpOwotCX0KLQlzID0gc3Ryc3RyKGMtPmNidWZmLCAiXHJcblxyXG4iKTsKLQkvKgotCSAqIHRoaXMgbmV4dCBsaW5lIGlzIHNvIHRoYXQgd2UgdGFsayB0byBOQ1NBIDEuNSB3aGljaCBibGF0YW50bHkKLQkgKiBicmVha3MgdGhlIGh0dHAgc3BlY2lmaWNhdGlvbgotCSAqLwotCWlmICghcykgewotCSAgICBzID0gc3Ryc3RyKGMtPmNidWZmLCAiXG5cbiIpOwotCSAgICBsID0gMjsKLQl9Ci0KLQlpZiAoIXMpIHsKLQkgICAgLyogcmVhZCByZXN0IG5leHQgdGltZSAqLwotCSAgICBpZiAoc3BhY2UpCi0JCXJldHVybjsKLQkgICAgZWxzZSB7Ci0JCS8qIGhlYWRlciBpcyBpbiBpbnZhbGlkIG9yIHRvbyBiaWcgLSBjbG9zZSBjb25uZWN0aW9uICovCi0JCWFiX2Nsb3NlKGMtPmZkKTsKLQkJaWYgKGJhZCsrID4gMTApIHsKLQkJICAgIGVycigiXG5UZXN0IGFib3J0ZWQgYWZ0ZXIgMTAgZmFpbHVyZXNcblxuIik7Ci0JCX0KLQkJRkRfQ0xSKGMtPmZkLCAmd3JpdGViaXRzKTsKLQkJc3RhcnRfY29ubmVjdChjKTsKLQkgICAgfQotCX0KLQllbHNlIHsKLQkgICAgLyogaGF2ZSBmdWxsIGhlYWRlciAqLwotCSAgICBpZiAoIWdvb2QpIHsKLQkJLyogdGhpcyBpcyBmaXJzdCB0aW1lLCBleHRyYWN0IHNvbWUgaW50ZXJlc3RpbmcgaW5mbyAqLwotCQljaGFyICpwLCAqcTsKLQkJcCA9IHN0cnN0cihjLT5jYnVmZiwgIlNlcnZlcjoiKTsKLQkJcSA9IHNlcnZlcm5hbWU7Ci0JCWlmIChwKSB7Ci0JCSAgICBwICs9IDg7Ci0JCSAgICB3aGlsZSAoKnAgPiAzMikKLQkJCSpxKysgPSAqcCsrOwotCQl9Ci0JCSpxID0gMDsKLQkgICAgfQotCi0JICAgIC8qCi0JICAgICAqIFhYWDogdGhpcyBwYXJzaW5nIGlzbid0IGV2ZW4gcmVtb3RlbHkgSFRUUCBjb21wbGlhbnQuLi4gYnV0IGluCi0JICAgICAqIHRoZSBpbnRlcmVzdCBvZiBzcGVlZCBpdCBkb2Vzbid0IHRvdGFsbHkgaGF2ZSB0byBiZSwgaXQganVzdAotCSAgICAgKiBuZWVkcyB0byBiZSBleHRlbmRlZCB0byBoYW5kbGUgd2hhdGV2ZXIgc2VydmVycyBmb2xrcyB3YW50IHRvCi0JICAgICAqIHRlc3QgYWdhaW5zdC4gLWRqZwotCSAgICAgKi8KLQotCSAgICAvKiBjaGVjayByZXNwb25zZSBjb2RlICovCi0JICAgIHBhcnQgPSBzdHJzdHIoYy0+Y2J1ZmYsICJIVFRQIik7CS8qIHJlYWxseSBIVFRQLzEueF8gKi8KLQkgICAgc3RybmNweShyZXNwY29kZSwgKHBhcnQgKyBzdHJsZW4oIkhUVFAvMS54XyIpKSwgMyk7Ci0JICAgIHJlc3Bjb2RlWzNdID0gJ1wwJzsKLQkgICAgaWYgKHJlc3Bjb2RlWzBdICE9ICcyJykgewotCQllcnJfcmVzcG9uc2UrKzsKLQkJaWYgKHZlcmJvc2l0eSA+PSAyKQotCQkgICAgcHJpbnRmKCJXQVJOSU5HOiBSZXNwb25zZSBjb2RlIG5vdCAyeHggKCVzKVxuIiwgcmVzcGNvZGUpOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHZlcmJvc2l0eSA+PSAzKSB7Ci0JCXByaW50ZigiTE9HOiBSZXNwb25zZSBjb2RlID0gJXNcbiIsIHJlc3Bjb2RlKTsKLQkgICAgfQotCi0JICAgIGMtPmdvdGhlYWRlciA9IDE7Ci0JICAgICpzID0gMDsJCS8qIHRlcm1pbmF0ZSBhdCBlbmQgb2YgaGVhZGVyICovCi0JICAgIGlmIChrZWVwYWxpdmUgJiYKLQkJKHN0cnN0cihjLT5jYnVmZiwgIktlZXAtQWxpdmUiKQotCQkgfHwgc3Ryc3RyKGMtPmNidWZmLCAia2VlcC1hbGl2ZSIpKSkgewkvKiBmb3IgYmVuZWZpdCBvZiBNU0lJUyAqLwotCQljaGFyICpjbDsKLQkJY2wgPSBzdHJzdHIoYy0+Y2J1ZmYsICJDb250ZW50LUxlbmd0aDoiKTsKLQkJLyogaGFuZGxlIE5DU0EsIHdoaWNoIHNlbmRzIENvbnRlbnQtbGVuZ3RoOiAqLwotCQlpZiAoIWNsKQotCQkgICAgY2wgPSBzdHJzdHIoYy0+Y2J1ZmYsICJDb250ZW50LWxlbmd0aDoiKTsKLQkJaWYgKGNsKSB7Ci0JCSAgICBjLT5rZWVwYWxpdmUgPSAxOwotCQkgICAgYy0+bGVuZ3RoID0gYXRvaShjbCArIDE2KTsKLQkJfQotCSAgICB9Ci0JICAgIGMtPmJyZWFkICs9IGMtPmNieCAtIChzICsgbCAtIGMtPmNidWZmKSArIHIgLSB0b2NvcHk7Ci0JICAgIHRvdGFsYnJlYWQgKz0gYy0+YnJlYWQ7Ci0JfQotICAgIH0KLSAgICBlbHNlIHsKLQkvKiBvdXRzaWRlIGhlYWRlciwgZXZlcnl0aGluZyB3ZSBoYXZlIHJlYWQgaXMgZW50aXR5IGJvZHkgKi8KLQljLT5icmVhZCArPSByOwotCXRvdGFsYnJlYWQgKz0gcjsKLSAgICB9Ci0KLSAgICAvKiBjYXRlciBmb3IgdGhlIGNhc2Ugd2hlcmUgd2UncmUgdXNpbmcga2VlcGFsaXZlcyBhbmQgZG9pbmcgSEVBRCByZXF1ZXN0cyAqLwotICAgIGlmIChjLT5rZWVwYWxpdmUgJiYgKChjLT5icmVhZCA+PSBjLT5sZW5ndGgpIHx8IChwb3N0aW5nIDwgMCkpKSB7Ci0JLyogZmluaXNoZWQgYSBrZWVwLWFsaXZlIGNvbm5lY3Rpb24gKi8KLQlnb29kKys7Ci0JZG9uZWthKys7Ci0JLyogc2F2ZSBvdXQgdGltZSAqLwotCWlmIChnb29kID09IDEpIHsKLQkgICAgLyogZmlyc3QgdGltZSBoZXJlICovCi0JICAgIGRvY2xlbiA9IGMtPmJyZWFkOwotCX0KLQllbHNlIGlmIChjLT5icmVhZCAhPSBkb2NsZW4pIHsKLQkgICAgYmFkKys7Ci0JICAgIGVycl9sZW5ndGgrKzsKLQl9Ci0JaWYgKGRvbmUgPCByZXF1ZXN0cykgewotCSAgICBzdHJ1Y3QgZGF0YSBzOwotCSAgICBnZXR0aW1lb2ZkYXkoJmMtPmRvbmUsIDApOwotCSAgICBzLnJlYWQgPSBjLT5yZWFkOwotCSAgICBzLmN0aW1lID0gdGltZWRpZihjLT5jb25uZWN0LCBjLT5zdGFydCk7Ci0JICAgIHMudGltZSA9IHRpbWVkaWYoYy0+ZG9uZSwgYy0+c3RhcnQpOwotCSAgICBzdGF0c1tkb25lKytdID0gczsKLQl9Ci0JYy0+a2VlcGFsaXZlID0gMDsKLQljLT5sZW5ndGggPSAwOwotCWMtPmdvdGhlYWRlciA9IDA7Ci0JYy0+Y2J4ID0gMDsKLQljLT5yZWFkID0gYy0+YnJlYWQgPSAwOwotCXdyaXRlX3JlcXVlc3QoYyk7Ci0JYy0+c3RhcnQgPSBjLT5jb25uZWN0OwkvKiB6ZXJvIGNvbm5lY3QgdGltZSB3aXRoIGtlZXAtYWxpdmUgKi8KLSAgICB9Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBydW4gdGhlIHRlc3RzICovCi0KLXN0YXRpYyB2b2lkIHRlc3Qodm9pZCkKLXsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0LCBub3c7Ci0gICAgZmRfc2V0IHNlbF9yZWFkLCBzZWxfZXhjZXB0LCBzZWxfd3JpdGU7Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoIXVzZV9odG1sKSB7Ci0JcHJpbnRmKCJCZW5jaG1hcmtpbmcgJXMgKGJlIHBhdGllbnQpLi4uIiwgaG9zdG5hbWUpOwotCWZmbHVzaChzdGRvdXQpOwotICAgIH0KLQotICAgIHsKLQkvKiBnZXQgc2VydmVyIGluZm9ybWF0aW9uICovCi0Jc3RydWN0IGhvc3RlbnQgKmhlOwotCWhlID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZSk7Ci0JaWYgKCFoZSkKLQkgICAgZXJyKCJiYWQgaG9zdG5hbWUiKTsKLQlzZXJ2ZXIuc2luX2ZhbWlseSA9IGhlLT5oX2FkZHJ0eXBlOwotCXNlcnZlci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwotCXNlcnZlci5zaW5fYWRkci5zX2FkZHIgPSAoKHVuc2lnbmVkIGxvbmcgKikgKGhlLT5oX2FkZHJfbGlzdFswXSkpWzBdOwotICAgIH0KLQotICAgIGNvbiA9IG1hbGxvYyhjb25jdXJyZW5jeSAqIHNpemVvZihzdHJ1Y3QgY29ubmVjdGlvbikpOwotICAgIG1lbXNldChjb24sIDAsIGNvbmN1cnJlbmN5ICogc2l6ZW9mKHN0cnVjdCBjb25uZWN0aW9uKSk7Ci0KLSAgICBzdGF0cyA9IG1hbGxvYyhyZXF1ZXN0cyAqIHNpemVvZihzdHJ1Y3QgZGF0YSkpOwotCi0gICAgRkRfWkVSTygmcmVhZGJpdHMpOwotICAgIEZEX1pFUk8oJndyaXRlYml0cyk7Ci0KLSAgICAvKiBzZXR1cCByZXF1ZXN0ICovCi0gICAgaWYgKHBvc3RpbmcgPD0gMCkgewotCXNwcmludGYocmVxdWVzdCwgIiVzICVzIEhUVFAvMS4wXHJcbiIKLQkJIlVzZXItQWdlbnQ6IEFwYWNoZUJlbmNoLyVzXHJcbiIKLQkJIiVzIiAiJXMiICIlcyIKLQkJIkhvc3Q6ICVzXHJcbiIKLQkJIkFjY2VwdDogKi8qXHJcbiIKLQkJIiVzIiAiXHJcbiIsCi0JCShwb3N0aW5nID09IDApID8gIkdFVCIgOiAiSEVBRCIsCi0JCXBhdGgsCi0JCVZFUlNJT04sCi0JCWtlZXBhbGl2ZSA/ICJDb25uZWN0aW9uOiBLZWVwLUFsaXZlXHJcbiIgOiAiIiwKLQkJY29va2llLCBhdXRoLCBob3N0bmFtZSwgaGRycyk7Ci0gICAgfQotICAgIGVsc2UgewotCXNwcmludGYocmVxdWVzdCwgIlBPU1QgJXMgSFRUUC8xLjBcclxuIgotCQkiVXNlci1BZ2VudDogQXBhY2hlQmVuY2gvJXNcclxuIgotCQkiJXMiICIlcyIgIiVzIgotCQkiSG9zdDogJXNcclxuIgotCQkiQWNjZXB0OiAqLypcclxuIgotCQkiQ29udGVudC1sZW5ndGg6ICVkXHJcbiIKLQkJIkNvbnRlbnQtdHlwZTogJXNcclxuIgotCQkiJXMiCi0JCSJcclxuIiwKLQkJcGF0aCwKLQkJVkVSU0lPTiwKLQkJa2VlcGFsaXZlID8gIkNvbm5lY3Rpb246IEtlZXAtQWxpdmVcclxuIiA6ICIiLAotCQljb29raWUsIGF1dGgsCi0JCWhvc3RuYW1lLCBwb3N0bGVuLAotCQkoY29udGVudF90eXBlWzBdKSA/IGNvbnRlbnRfdHlwZSA6ICJ0ZXh0L3BsYWluIiwgaGRycyk7Ci0gICAgfQotCi0gICAgaWYgKHZlcmJvc2l0eSA+PSAyKQotCXByaW50ZigiSU5GTzogUE9TVCBoZWFkZXIgPT0gXG4tLS1cbiVzXG4tLS1cbiIsIHJlcXVlc3QpOwotCi0gICAgcmVxbGVuID0gc3RybGVuKHJlcXVlc3QpOwotCi0jaWZkZWYgQ0hBUlNFVF9FQkNESUMKLSAgICBlYmNkaWMyYXNjaWkocmVxdWVzdCwgcmVxdWVzdCwgcmVxbGVuKTsKLSNlbmRpZgkJCQkvKiBDSEFSU0VUX0VCQ0RJQyAqLwotCi0gICAgLyogb2sgLSBsZXRzIHN0YXJ0ICovCi0gICAgZ2V0dGltZW9mZGF5KCZzdGFydCwgMCk7Ci0KLSAgICAvKiBpbml0aWFsaXNlIGxvdHMgb2YgcmVxdWVzdHMgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgY29uY3VycmVuY3k7IGkrKykKLQlzdGFydF9jb25uZWN0KCZjb25baV0pOwotCi0gICAgd2hpbGUgKGRvbmUgPCByZXF1ZXN0cykgewotCWludCBuOwotCS8qIHNldHVwIGJpdCBhcnJheXMgKi8KLQltZW1jcHkoJnNlbF9leGNlcHQsICZyZWFkYml0cywgc2l6ZW9mKHJlYWRiaXRzKSk7Ci0JbWVtY3B5KCZzZWxfcmVhZCwgJnJlYWRiaXRzLCBzaXplb2YocmVhZGJpdHMpKTsKLQltZW1jcHkoJnNlbF93cml0ZSwgJndyaXRlYml0cywgc2l6ZW9mKHJlYWRiaXRzKSk7Ci0KLQkvKiBjaGVjayBmb3IgdGltZSBsaW1pdCBleHBpcnkgKi8KLQlnZXR0aW1lb2ZkYXkoJm5vdywgMCk7Ci0JaWYgKHRsaW1pdCAmJiB0aW1lZGlmKG5vdywgc3RhcnQpID4gKHRsaW1pdCAqIDEwMDApKSB7Ci0JICAgIHJlcXVlc3RzID0gZG9uZTsJLyogc28gc3RhdHMgYXJlIGNvcnJlY3QgKi8KLQl9Ci0KLQkvKiBUaW1lb3V0IG9mIDMwIHNlY29uZHMuICovCi0JdGltZW91dC50dl9zZWMgPSAzMDsKLQl0aW1lb3V0LnR2X3VzZWMgPSAwOwotCW4gPSBhcF9zZWxlY3QoRkRfU0VUU0laRSwgJnNlbF9yZWFkLCAmc2VsX3dyaXRlLCAmc2VsX2V4Y2VwdCwgJnRpbWVvdXQpOwotCWlmICghbikgewotCSAgICBlcnIoIlxuU2VydmVyIHRpbWVkIG91dFxuXG4iKTsKLQl9Ci0JaWYgKG4gPCAxKQotCSAgICBlcnIoInNlbGVjdCIpOwotCi0JZm9yIChpID0gMDsgaSA8IGNvbmN1cnJlbmN5OyBpKyspIHsKLQkgICAgaW50IHMgPSBjb25baV0uZmQ7Ci0JICAgIGlmIChGRF9JU1NFVChzLCAmc2VsX2V4Y2VwdCkpIHsKLQkJYmFkKys7Ci0JCWVycl9leGNlcHQrKzsKLQkJc3RhcnRfY29ubmVjdCgmY29uW2ldKTsKLQkJY29udGludWU7Ci0JICAgIH0KLQkgICAgaWYgKEZEX0lTU0VUKHMsICZzZWxfcmVhZCkpCi0JCXJlYWRfY29ubmVjdGlvbigmY29uW2ldKTsKLQkgICAgaWYgKEZEX0lTU0VUKHMsICZzZWxfd3JpdGUpKQotCQl3cml0ZV9yZXF1ZXN0KCZjb25baV0pOwotCX0KLSAgICB9Ci0gICAgaWYgKHVzZV9odG1sKQotCW91dHB1dF9odG1sX3Jlc3VsdHMoKTsKLSAgICBlbHNlCi0Jb3V0cHV0X3Jlc3VsdHMoKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBkaXNwbGF5IGNvcHlyaWdodCBpbmZvcm1hdGlvbiAqLwotc3RhdGljIHZvaWQgY29weXJpZ2h0KHZvaWQpCi17Ci0gICAgaWYgKCF1c2VfaHRtbCkgewotCXByaW50ZigiVGhpcyBpcyBBcGFjaGVCZW5jaCwgVmVyc2lvbiAlc1xuIiwgVkVSU0lPTiAiIDwkUmV2aXNpb246IDEuNSAkPiBhcGFjaGUtMi4wIik7Ci0JcHJpbnRmKCJDb3B5cmlnaHQgKGMpIDE5OTYgQWRhbSBUd2lzcywgWmV1cyBUZWNobm9sb2d5IEx0ZCwgaHR0cDovL3d3dy56ZXVzdGVjaC5uZXQvXG4iKTsKLQlwcmludGYoIkNvcHlyaWdodCAoYykgMTk5OC0xOTk5IFRoZSBBcGFjaGUgR3JvdXAsIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9cbiIpOwotCXByaW50ZigiXG4iKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0JcHJpbnRmKCI8cD5cbiIpOwotCXByaW50ZigiIFRoaXMgaXMgQXBhY2hlQmVuY2gsIFZlcnNpb24gJXMgPGk+Jmx0OyVzJmd0OzwvaT4gYXBhY2hlLTIuMDxicj5cbiIsIFZFUlNJT04sICIkUmV2aXNpb246IDEuNSAkIik7Ci0JcHJpbnRmKCIgQ29weXJpZ2h0IChjKSAxOTk2IEFkYW0gVHdpc3MsIFpldXMgVGVjaG5vbG9neSBMdGQsIGh0dHA6Ly93d3cuemV1c3RlY2gubmV0Lzxicj5cbiIpOwotCXByaW50ZigiIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IFRoZSBBcGFjaGUgR3JvdXAsIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy88YnI+XG4iKTsKLQlwcmludGYoIjwvcD5cbjxwPlxuIik7Ci0gICAgfQotfQotCi0vKiBkaXNwbGF5IHVzYWdlIGluZm9ybWF0aW9uICovCi1zdGF0aWMgdm9pZCB1c2FnZShjaGFyICpwcm9nbmFtZSkKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbb3B0aW9uc10gW2h0dHA6Ly9daG9zdG5hbWVbOnBvcnRdL3BhdGhcbiIsIHByb2duYW1lKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIk9wdGlvbnMgYXJlOlxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICAgLW4gcmVxdWVzdHMgICAgIE51bWJlciBvZiByZXF1ZXN0cyB0byBwZXJmb3JtXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtYyBjb25jdXJyZW5jeSAgTnVtYmVyIG9mIG11bHRpcGxlIHJlcXVlc3RzIHRvIG1ha2VcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC10IHRpbWVsaW1pdCAgICBTZWNvbmRzIHRvIG1heC4gd2FpdCBmb3IgcmVzcG9uc2VzXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtcCBwb3N0ZmlsZSAgICAgRmlsZSBjb250YWluZyBkYXRhIHRvIFBPU1RcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1UIGNvbnRlbnQtdHlwZSBDb250ZW50LXR5cGUgaGVhZGVyIGZvciBQT1NUaW5nXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtdiB2ZXJib3NpdHkgICAgSG93IG11Y2ggdHJvdWJsZXNob290aW5nIGluZm8gdG8gcHJpbnRcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC13ICAgICAgICAgICAgICBQcmludCBvdXQgcmVzdWx0cyBpbiBIVE1MIHRhYmxlc1xuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICAgLWkgICAgICAgICAgICAgIFVzZSBIRUFEIGluc3RlYWQgb2YgR0VUXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAteCBhdHRyaWJ1dGVzICAgU3RyaW5nIHRvIGluc2VydCBhcyB0YWJsZSBhdHRyaWJ1dGVzXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAteSBhdHRyaWJ1dGVzICAgU3RyaW5nIHRvIGluc2VydCBhcyB0ciBhdHRyaWJ1dGVzXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAteiBhdHRyaWJ1dGVzICAgU3RyaW5nIHRvIGluc2VydCBhcyB0ZCBvciB0aCBhdHRyaWJ1dGVzXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtQyBhdHRyaWJ1dGUgICAgQWRkIGNvb2tpZSwgZWcuICdBcGFjaGU9MTIzNC4gKHJlcGVhdGFibGUpXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtSCBhdHRyaWJ1dGUgICAgQWRkIEFyYml0cmFyeSBoZWFkZXIgbGluZSwgZWcuICdBY2NlcHQtRW5jb2Rpbmc6IHpvcCdcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgICBJbnNlcnRlZCBhZnRlciBhbGwgbm9ybWFsIGhlYWRlciBsaW5lcy4gKHJlcGVhdGFibGUpXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtQSBhdHRyaWJ1dGUgICAgQWRkIEJhc2ljIFdXVyBBdXRoZW50aWNhdGlvbiwgdGhlIGF0dHJpYnV0ZXNcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgICBhcmUgYSBjb2xvbiBzZXBhcmF0ZWQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLlxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICAgLXAgYXR0cmlidXRlICAgIEFkZCBCYXNpYyBQcm94eSBBdXRoZW50aWNhdGlvbiwgdGhlIGF0dHJpYnV0ZXNcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgICBhcmUgYSBjb2xvbiBzZXBhcmF0ZWQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLlxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICAgLVYgICAgICAgICAgICAgIFByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBleGl0XG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtayAgICAgICAgICAgICAgVXNlIEhUVFAgS2VlcEFsaXZlIGZlYXR1cmVcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1oICAgICAgICAgICAgICBEaXNwbGF5IHVzYWdlIGluZm9ybWF0aW9uICh0aGlzIG1lc3NhZ2UpXG4iKTsKLSAgICBleGl0KEVJTlZBTCk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogc3BsaXQgVVJMIGludG8gcGFydHMgKi8KLQotc3RhdGljIGludCBwYXJzZV91cmwoY2hhciAqdXJsKQotewotICAgIGNoYXIgKmNwOwotICAgIGNoYXIgKmg7Ci0gICAgY2hhciAqcCA9IE5VTEw7Ci0KLSAgICBpZiAoc3RybGVuKHVybCkgPiA3ICYmIHN0cm5jbXAodXJsLCAiaHR0cDovLyIsIDcpID09IDApCi0JdXJsICs9IDc7Ci0gICAgaCA9IHVybDsKLSAgICBpZiAoKGNwID0gc3RyY2hyKHVybCwgJzonKSkgIT0gTlVMTCkgewotCSpjcCsrID0gJ1wwJzsKLQlwID0gY3A7Ci0JdXJsID0gY3A7Ci0gICAgfQotICAgIGlmICgoY3AgPSBzdHJjaHIodXJsLCAnLycpKSA9PSBOVUxMKQotCXJldHVybiAxOwotICAgIHN0cmNweShwYXRoLCBjcCk7Ci0gICAgKmNwID0gJ1wwJzsKLSAgICBzdHJjcHkoaG9zdG5hbWUsIGgpOwotICAgIGlmIChwICE9IE5VTEwpCi0JcG9ydCA9IGF0b2kocCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogcmVhZCBkYXRhIHRvIFBPU1QgZnJvbSBmaWxlLCBzYXZlIGNvbnRlbnRzIGFuZCBsZW5ndGggKi8KLQotc3RhdGljIGludCBvcGVuX3Bvc3RmaWxlKGNoYXIgKnBmaWxlKQotewotICAgIGludCBwb3N0ZmQsIHN0YXR1czsKLSAgICBzdHJ1Y3Qgc3RhdCBwb3N0ZmlsZXN0YXQ7Ci0KLSAgICBpZiAoKHBvc3RmZCA9IG9wZW4ocGZpbGUsIE9fUkRPTkxZKSkgPT0gLTEpIHsKLQlwcmludGYoIkludmFsaWQgcG9zdGZpbGUgbmFtZSAoJXMpXG4iLCBwZmlsZSk7Ci0JcmV0dXJuIGVycm5vOwotICAgIH0KLSAgICBpZiAoKHN0YXR1cyA9IGZzdGF0KHBvc3RmZCwgJnBvc3RmaWxlc3RhdCkpID09IC0xKSB7Ci0JcGVycm9yKCJDYW5cJ3Qgc3RhdCBwb3N0ZmlsZVxuIik7Ci0JcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgcG9zdGRhdGEgPSBtYWxsb2MocG9zdGZpbGVzdGF0LnN0X3NpemUpOwotICAgIGlmICghcG9zdGRhdGEpIHsKLQlwcmludGYoIkNhblwndCBhbGxvYyBwb3N0ZmlsZSBidWZmZXJcbiIpOwotCXJldHVybiBFTk9NRU07Ci0gICAgfQotICAgIGlmIChyZWFkKHBvc3RmZCwgcG9zdGRhdGEsIHBvc3RmaWxlc3RhdC5zdF9zaXplKSAhPSBwb3N0ZmlsZXN0YXQuc3Rfc2l6ZSkgewotCXByaW50ZigiZXJyb3IgcmVhZGluZyBwb3N0ZmlsZW4iKTsKLQlyZXR1cm4gRUlPOwotICAgIH0KLSAgICBwb3N0bGVuID0gcG9zdGZpbGVzdGF0LnN0X3NpemU7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotZXh0ZXJuIGNoYXIgKm9wdGFyZzsKLWV4dGVybiBpbnQgb3B0aW5kLCBvcHRlcnIsIG9wdG9wdDsKLQotLyogc29ydCBvdXQgY29tbWFuZC1saW5lIGFyZ3MgYW5kIGNhbGwgdGVzdCAqLwotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGludCBjLCByLGw7Ci0gICAgY2hhciB0bXBbMTAyNF07Ci0KLSAgICAvKiB0YWJsZSBkZWZhdWx0cyAgKi8KLSAgICB0YWJsZXN0cmluZyA9ICIiOwotICAgIHRyc3RyaW5nID0gIiI7Ci0gICAgdGRzdHJpbmcgPSAiYmdjb2xvcj13aGl0ZSI7Ci0gICAgY29va2llWzBdID0gJ1wwJzsKLSAgICBhdXRoWzBdID0gJ1wwJzsKLSAgICBoZHJzWzBdID0gJ1wwJzsKLSAgICBvcHRpbmQgPSAxOwotICAgIHdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAibjpjOnQ6VDpwOnY6a1Zod2l4Onk6ejpDOkg6UDpBOiIpKSA+IDApIHsKLQlzd2l0Y2ggKGMpIHsKLQljYXNlICduJzoKLQkgICAgcmVxdWVzdHMgPSBhdG9pKG9wdGFyZyk7Ci0JICAgIGlmICghcmVxdWVzdHMpIHsKLQkJZXJyKCJJbnZhbGlkIG51bWJlciBvZiByZXF1ZXN0c1xuIik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAnayc6Ci0JICAgIGtlZXBhbGl2ZSA9IDE7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ2MnOgotCSAgICBjb25jdXJyZW5jeSA9IGF0b2kob3B0YXJnKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnaSc6Ci0JICAgIGlmIChwb3N0aW5nPT0xKSAKLQkJZXJyKCJDYW5ub3QgbWl4IFBPU1QgYW5kIEhFQUQiKTsKLQotCSAgICBwb3N0aW5nID0gLTE7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ3AnOgotCSAgICBpZiAocG9zdGluZyE9MCkgCi0JCWVycigiQ2Fubm90IG1peCBQT1NUIGFuZCBIRUFEIik7Ci0KLQkgICAgaWYgKDAgPT0gKHIgPSBvcGVuX3Bvc3RmaWxlKG9wdGFyZykpKSB7Ci0JCXBvc3RpbmcgPSAxOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKHBvc3RkYXRhKSB7Ci0JCWV4aXQocik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICAgIHZlcmJvc2l0eSA9IGF0b2kob3B0YXJnKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JICAgIHRsaW1pdCA9IGF0b2kob3B0YXJnKTsKLQkgICAgcmVxdWVzdHMgPSBNQVhfUkVRVUVTVFM7CS8qIG5lZWQgdG8gc2l6ZSBkYXRhIGFycmF5IG9uCi0JCQkJCSAqIHNvbWV0aGluZyAqLwotCSAgICBicmVhazsKLQljYXNlICdUJzoKLQkgICAgc3RyY3B5KGNvbnRlbnRfdHlwZSwgb3B0YXJnKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnQyc6IAotCSAgICBzdHJuY2F0KGNvb2tpZSwgIkNvb2tpZTogIiwgc2l6ZW9mKGNvb2tpZSkpOwotCSAgICBzdHJuY2F0KGNvb2tpZSwgb3B0YXJnLCBzaXplb2YoY29va2llKSk7Ci0JICAgIHN0cm5jYXQoY29va2llLCAiXHJcbiIsIHNpemVvZihjb29raWUpKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnQSc6IAotCSAgICAvKiBhc3N1bWUgdXNlcm5hbWUgcGFzc3dkIGFscmVhZHkgdG8gYmUgaW4gY29sb24gc2VwYXJhdGVkIGZvcm0uIFJlYWR5Ci0JICAgICAqIHRvIGJlIHV1LWVuY29kZWQuCi0JICAgICAqLwotCSAgICB3aGlsZShpc3NwYWNlKCpvcHRhcmcpKQotCQlvcHRhcmcrKzsKLQkgICAgbD1hcF9iYXNlNjRlbmNvZGUodG1wLG9wdGFyZyxzdHJsZW4ob3B0YXJnKSk7Ci0JICAgIHRtcFtsXT0nXDAnOwotCi0JICAgIHN0cm5jYXQoYXV0aCwgIkF1dGhvcml6YXRpb246IGJhc2ljICIsIHNpemVvZihhdXRoKSk7Ci0JICAgIHN0cm5jYXQoYXV0aCwgdG1wLCBzaXplb2YoYXV0aCkpOwotCSAgICBzdHJuY2F0KGF1dGgsICJcclxuIiwgc2l6ZW9mKGF1dGgpKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnUCc6Ci0JICAgIC8qCi0JICAgICAqIGFzc3VtZSB1c2VybmFtZSBwYXNzd2QgYWxyZWFkeSB0byBiZSBpbiBjb2xvbiBzZXBhcmF0ZWQgZm9ybS4KLQkgICAgICovCi0JICAgIHdoaWxlKGlzc3BhY2UoKm9wdGFyZykpCi0JCW9wdGFyZysrOwotCSAgICBsPWFwX2Jhc2U2NGVuY29kZSh0bXAsb3B0YXJnLHN0cmxlbihvcHRhcmcpKTsKLQkgICAgdG1wW2xdPSdcMCc7Ci0KLQkgICAgc3RybmNhdChhdXRoLCAiUHJveHktQXV0aG9yaXphdGlvbjogYmFzaWMgIiwgc2l6ZW9mKGF1dGgpKTsKLQkgICAgc3RybmNhdChhdXRoLCB0bXAsIHNpemVvZihhdXRoKSk7Ci0JICAgIHN0cm5jYXQoYXV0aCwgIlxyXG4iLCBzaXplb2YoYXV0aCkpOwotCSAgICBicmVhazsKLQljYXNlICdIJzoKLQkgICAgc3RybmNhdChoZHJzLCBvcHRhcmcsIHNpemVvZihoZHJzKSk7Ci0JICAgIHN0cm5jYXQoaGRycywgIlxyXG4iLCBzaXplb2YoaGRycykpOwotCSAgICBicmVhazsKLQljYXNlICdWJzoKLQkgICAgY29weXJpZ2h0KCk7Ci0JICAgIGV4aXQoMCk7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ3cnOgotCSAgICB1c2VfaHRtbCA9IDE7Ci0JICAgIGJyZWFrOwotCSAgICAvKgotCSAgICAgKiBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyB0aHJlZSBhcmUgdXNlZCwgdHVybiBvbiBodG1sIG91dHB1dAotCSAgICAgKiBhdXRvbWF0aWNhbGx5Ci0JICAgICAqLwotCWNhc2UgJ3gnOgotCSAgICB1c2VfaHRtbCA9IDE7Ci0JICAgIHRhYmxlc3RyaW5nID0gb3B0YXJnOwotCSAgICBicmVhazsKLQljYXNlICd5JzoKLQkgICAgdXNlX2h0bWwgPSAxOwotCSAgICB0cnN0cmluZyA9IG9wdGFyZzsKLQkgICAgYnJlYWs7Ci0JY2FzZSAneic6Ci0JICAgIHVzZV9odG1sID0gMTsKLQkgICAgdGRzdHJpbmcgPSBvcHRhcmc7Ci0JICAgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgICB1c2FnZShhcmd2WzBdKTsKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgZnByaW50ZihzdGRlcnIsICIlczogaW52YWxpZCBvcHRpb24gYCVjJ1xuIiwgYXJndlswXSwgYyk7Ci0JICAgIHVzYWdlKGFyZ3ZbMF0pOwotCSAgICBicmVhazsKLQl9Ci0gICAgfQotICAgIGlmIChvcHRpbmQgIT0gYXJnYyAtIDEpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIiVzOiB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzXG4iLCBhcmd2WzBdKTsKLQl1c2FnZShhcmd2WzBdKTsKLSAgICB9Ci0KLSAgICBpZiAocGFyc2VfdXJsKGFyZ3Zbb3B0aW5kKytdKSkgewotCWZwcmludGYoc3RkZXJyLCAiJXM6IGludmFsaWQgVVJMXG4iLCBhcmd2WzBdKTsKLQl1c2FnZShhcmd2WzBdKTsKLSAgICB9Ci0KLSAgICBjb3B5cmlnaHQoKTsKLSAgICB0ZXN0KCk7Ci0KLSAgICBleGl0KDApOwotfQpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9hcHhzLmluIGIvc3VwcG9ydC9hcHhzLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmIyMGJmLi4wMDAwMDAwCi0tLSBhL3N1cHBvcnQvYXB4cy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDY1OCArMCwwIEBACi0jIS91c3IvbG9jYWwvYmluL3BlcmwKLSMjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIyBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMjCi0jIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIyMgYXJlIG1ldDoKLSMjCi0jIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSMjCi0jIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotIyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0jIyAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIyAgICBkaXN0cmlidXRpb24uCi0jIwotIyMgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0jIyAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSMjICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSMjICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0jIwotIyMgNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotIyMgICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSMjICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSMjICAgIGFwYWNoZUBhcGFjaGUub3JnLgotIyMKLSMjIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0jIyAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSMjICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSMjCi0jIyA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0jIyAgICBhY2tub3dsZWRnbWVudDoKLSMjICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSMjICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0jIwotIyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0jIyBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0jIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSMjIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0jIyBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSMjIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotIyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSMjIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSMjIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSMjIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSMjIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSMjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIwotIyMgVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSMjIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotIyMgb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0jIyBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0jIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0jIyBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSMjCi0KLSMjCi0jIyAgYXB4cyAtLSBBUGFjaGUgZVh0ZW5TaW9uIHRvb2wKLSMjICBXcml0dGVuIGJ5IFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBhcGFjaGUub3JnPgotIyMKLQotcmVxdWlyZSA1LjAwMzsKLXVzZSBzdHJpY3Q7Ci1wYWNrYWdlIGFweHM7Ci0KLSMjCi0jIyAgQ29uZmlndXJhdGlvbgotIyMKLQotbXkgJENGR19UQVJHRVQgICAgICAgID0gJ0BUQVJHRVRAJzsgICAgICAgICAgICAjIHN1YnN0aXR1dGVkIHZpYSBNYWtlZmlsZS50bXBsIAotbXkgJENGR19DQyAgICAgICAgICAgID0gJ0BDQ0AnOyAgICAgICAgICAgICAgICAjIHN1YnN0aXR1dGVkIHZpYSBNYWtlZmlsZS50bXBsCi1teSAkQ0ZHX0NGTEFHUyAgICAgICAgPSAnQENGTEFHU0AnOyAgICAgICAgICAgICMgc3Vic3RpdHV0ZWQgdmlhIE1ha2VmaWxlLnRtcGwKLW15ICRDRkdfQ0ZMQUdTX1NITElCICA9ICdAQ0ZMQUdTX1NITElCQCc7ICAgICAgIyBzdWJzdGl0dXRlZCB2aWEgTWFrZWZpbGUudG1wbAotbXkgJENGR19MRF9TSExJQiAgICAgID0gJ0BMRF9TSExJQkAnOyAgICAgICAgICAjIHN1YnN0aXR1dGVkIHZpYSBNYWtlZmlsZS50bXBsCi1teSAkQ0ZHX0xERkxBR1NfU0hMSUIgPSAnQExERkxBR1NfTU9EX1NITElCQCc7ICMgc3Vic3RpdHV0ZWQgdmlhIE1ha2VmaWxlLnRtcGwgCi1teSAkQ0ZHX0xJQlNfU0hMSUIgICAgPSAnQExJQlNfU0hMSUJAJzsgICAgICAgICMgc3Vic3RpdHV0ZWQgdmlhIE1ha2VmaWxlLnRtcGwgCi1teSAkQ0ZHX1BSRUZJWCAgICAgICAgPSAnQHByZWZpeEAnOyAgICAgICAgICAgICMgc3Vic3RpdHV0ZWQgdmlhIEFQQUNJIGluc3RhbGwKLW15ICRDRkdfU0JJTkRJUiAgICAgICA9ICdAc2JpbmRpckAnOyAgICAgICAgICAgIyBzdWJzdGl0dXRlZCB2aWEgQVBBQ0kgaW5zdGFsbAotbXkgJENGR19JTkNMVURFRElSICAgID0gJ0BpbmNsdWRlZGlyQCc7ICAgICAgICAjIHN1YnN0aXR1dGVkIHZpYSBBUEFDSSBpbnN0YWxsCi1teSAkQ0ZHX0xJQkVYRUNESVIgICAgPSAnQGxpYmV4ZWNkaXJAJzsgICAgICAgICMgc3Vic3RpdHV0ZWQgdmlhIEFQQUNJIGluc3RhbGwKLW15ICRDRkdfU1lTQ09ORkRJUiAgICA9ICdAc3lzY29uZmRpckAnOyAgICAgICAgIyBzdWJzdGl0dXRlZCB2aWEgQVBBQ0kgaW5zdGFsbAotCi0jIwotIyMgIENsZWFudXAgdGhlIGFib3ZlIHN0dWZmCi0jIwotJENGR19DRkxBR1MgPX4gc3xeXHMrfHw7Ci0kQ0ZHX0NGTEFHUyA9fiBzfFxzKyR8fDsKLSRDRkdfQ0ZMQUdTID1+IHN8XHMrYC4rYXBhY2lgfHw7Ci0KLSMjCi0jIyAgcGFyc2UgYXJndW1lbnQgbGluZQotIyMKLQotIyAgIGRlZmF1bHRzIGZvciBwYXJhbWV0ZXJzCi1teSAkb3B0X24gPSAnJzsKLW15ICRvcHRfZyA9ICcnOwotbXkgJG9wdF9jID0gMDsKLW15ICRvcHRfbyA9ICcnOwotbXkgQG9wdF9EID0gKCk7Ci1teSBAb3B0X0kgPSAoKTsKLW15IEBvcHRfTCA9ICgpOwotbXkgQG9wdF9sID0gKCk7Ci1teSBAb3B0X1cgPSAoKTsKLW15IEBvcHRfUyA9ICgpOwotbXkgJG9wdF9lID0gMDsKLW15ICRvcHRfaSA9IDA7Ci1teSAkb3B0X2EgPSAwOwotbXkgJG9wdF9BID0gMDsKLW15ICRvcHRfcSA9IDA7Ci0KLSMgICB0aGlzIHN1YnJvdXRpbmUgaXMgZGVyaXZlZCBmcm9tIFBlcmwncyBnZXRvcHRzLnBsIHdpdGggdGhlIGVuaGFuY2VtZW50IG9mCi0jICAgdGhlICIrIiBtZXRhY2hhcmF0ZXIgYXQgdGhlIGZvcm1hdCBzdHJpbmcgdG8gYWxsb3cgYSBsaXN0IHRvIGJlIGJ1aWxkIGJ5Ci0jICAgc3Vic2VxdWVudCBvY2N1cmFuY2Ugb2YgdGhlIHNhbWUgb3B0aW9uLgotc3ViIEdldG9wdHMgewotICAgIG15ICgkYXJndW1lbnRhdGl2ZSwgQEFSR1YpID0gQF87Ci0gICAgbXkgKEBhcmdzLCAkZmlyc3QsICRyZXN0LCAkcG9zKTsKLSAgICBteSAoJGVycnMpID0gMDsKLSAgICBsb2NhbCAoJF8pOwotICAgIGxvY2FsICgkWykgPSAwOwotCi0gICAgQGFyZ3MgPSBzcGxpdCggLyAqLywgJGFyZ3VtZW50YXRpdmUpOwotICAgIHdoaWxlKEBBUkdWICYmICgkXyA9ICRBUkdWWzBdKSA9fiAvXi0oLikoLiopLykgewotICAgICAgICAoJGZpcnN0LCAkcmVzdCkgPSAoJDEsJDIpOwotICAgICAgICBpZiAoJF8gPX4gbXxeLS0kfCkgewotICAgICAgICAgICAgc2hpZnQoQEFSR1YpOwotICAgICAgICAgICAgbGFzdDsKLSAgICAgICAgfQotICAgICAgICAkcG9zID0gaW5kZXgoJGFyZ3VtZW50YXRpdmUsJGZpcnN0KTsKLSAgICAgICAgaWYoJHBvcyA+PSAkWykgewotICAgICAgICAgICAgaWYoJGFyZ3NbJHBvcysxXSBlcSAnOicpIHsKLSAgICAgICAgICAgICAgICBzaGlmdChAQVJHVik7Ci0gICAgICAgICAgICAgICAgaWYoJHJlc3QgZXEgJycpIHsKLSAgICAgICAgICAgICAgICAgICAgdW5sZXNzIChAQVJHVikgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgU1RERVJSICJhcHhzOkVycm9yOiBJbmNvbXBsZXRlIG9wdGlvbjogJGZpcnN0IChuZWVkcyBhbiBhcmd1bWVudClcbiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICArKyRlcnJzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICRyZXN0ID0gc2hpZnQoQEFSR1YpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBldmFsICJcJG9wdF8kZmlyc3QgPSBcJHJlc3Q7IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2lmICgkYXJnc1skcG9zKzFdIGVxICcrJykgewotICAgICAgICAgICAgICAgIHNoaWZ0KEBBUkdWKTsKLSAgICAgICAgICAgICAgICBpZigkcmVzdCBlcSAnJykgewotICAgICAgICAgICAgICAgICAgICB1bmxlc3MgKEBBUkdWKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludCBTVERFUlIgImFweHM6RXJyb3I6IEluY29tcGxldGUgb3B0aW9uOiAkZmlyc3QgKG5lZWRzIGFuIGFyZ3VtZW50KVxuIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICsrJGVycnM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgJHJlc3QgPSBzaGlmdChAQVJHVik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGV2YWwgInB1c2goXEBvcHRfJGZpcnN0LCBcJHJlc3QpOyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBldmFsICJcJG9wdF8kZmlyc3QgPSAxIjsKLSAgICAgICAgICAgICAgICBpZigkcmVzdCBlcSAnJykgewotICAgICAgICAgICAgICAgICAgICBzaGlmdChAQVJHVik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAkQVJHVlswXSA9ICItJHJlc3QiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHByaW50IFNUREVSUiAiYXB4czpFcnJvcjogVW5rbm93biBvcHRpb246ICRmaXJzdFxuIjsKLSAgICAgICAgICAgICsrJGVycnM7Ci0gICAgICAgICAgICBpZigkcmVzdCBuZSAnJykgewotICAgICAgICAgICAgICAgICRBUkdWWzBdID0gIi0kcmVzdCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzaGlmdChAQVJHVik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICgkZXJycyA9PSAwLCBAQVJHVik7Ci19Ci0KLXN1YiB1c2FnZSB7Ci0gICAgcHJpbnQgU1RERVJSICJVc2FnZTogYXB4cyAtZyBbLVMgPHZhcj49PHZhbD5dIC1uIDxtb2RuYW1lPlxuIjsKLSAgICBwcmludCBTVERFUlIgIiAgICAgICBhcHhzIC1xIFstUyA8dmFyPj08dmFsPl0gPHF1ZXJ5PiAuLi5cbiI7Ci0gICAgcHJpbnQgU1RERVJSICIgICAgICAgYXB4cyAtYyBbLVMgPHZhcj49PHZhbD5dIFstbyA8ZHNvZmlsZT5dIFstRCA8bmFtZT5bPTx2YWx1ZT5dXVxuIjsKLSAgICBwcmludCBTVERFUlIgIiAgICAgICAgICAgICAgIFstSSA8aW5jZGlyPl0gWy1MIDxsaWJkaXI+XSBbLWwgPGxpYm5hbWU+XSBbLVdjLDxmbGFncz5dXG4iOwotICAgIHByaW50IFNUREVSUiAiICAgICAgICAgICAgICAgWy1XbCw8ZmxhZ3M+XSA8ZmlsZXM+IC4uLlxuIjsKLSAgICBwcmludCBTVERFUlIgIiAgICAgICBhcHhzIC1pIFstUyA8dmFyPj08dmFsPl0gWy1hXSBbLUFdIFstbiA8bW9kbmFtZT5dIDxkc29maWxlPiAuLi5cbiI7Ci0gICAgcHJpbnQgU1RERVJSICIgICAgICAgYXB4cyAtZSBbLVMgPHZhcj49PHZhbD5dIFstYV0gWy1BXSBbLW4gPG1vZG5hbWU+XSA8ZHNvZmlsZT4gLi4uXG4iOwotICAgIGV4aXQoMSk7Ci19Ci0KLSMgICBvcHRpb24gaGFuZGxpbmcKLW15ICRyYzsKLSgkcmMsIEBBUkdWKSA9ICZHZXRvcHRzKCJxbjpnY286SStEK0wrbCtXK1MrZWlhQSIsIEBBUkdWKTsKLSZ1c2FnZSBpZiAoJHJjID09IDApOwotJnVzYWdlIGlmICgkI0FSR1YgPT0gLTEgYW5kIG5vdCAkb3B0X2cpOwotJnVzYWdlIGlmIChub3QgJG9wdF9xIGFuZCBub3QgKCRvcHRfZyBhbmQgJG9wdF9uKSBhbmQgbm90ICRvcHRfaSBhbmQgbm90ICRvcHRfYyBhbmQgbm90ICRvcHRfZSk7Ci0KLSMgICBhcmd1bWVudCBoYW5kbGluZwotbXkgQGFyZ3MgPSBAQVJHVjsKLW15ICRuYW1lID0gJ3Vua25vd24nOwotJG5hbWUgPSAkb3B0X24gaWYgKCRvcHRfbiBuZSAnJyk7Ci0KLWlmIChAb3B0X1MpIHsKLSAgICBteSAoJG9wdF9TKTsKLSAgICBmb3JlYWNoICRvcHRfUyAoQG9wdF9TKSB7Ci0JaWYgKCRvcHRfUyA9fiBtL14oW149XSspPSguKikkLykgewotCSAgICBteSAoJHZhcikgPSAkMTsKLQkgICAgbXkgKCR2YWwpID0gJDI7Ci0JICAgIG15ICRvbGR2YWwgPSBldmFsICJcJENGR18kdmFyIjsKLQotCSAgICB1bmxlc3MgKCR2YXIgYW5kICRvbGR2YWwpIHsKLQkJcHJpbnQgU1RERVJSICJhcHhzOkVycm9yOiBubyBjb25maWcgdmFyaWFibGUgJHZhclxuIjsKLQkJJnVzYWdlOwotCSAgICB9Ci0KLQkgICAgZXZhbCAiXCRDRkdfJHt2YXJ9PVwiJHt2YWx9XCIiOwotCX0gZWxzZSB7Ci0JICAgIHByaW50IFNUREVSUiAiYXB4czpFcnJvcjogbWFsZm9ybWF0dGVkIC1TIG9wdGlvblxuIjsKLQkgICAgJnVzYWdlOwotCX0JCi0gICAgfQotfQotCi0jIwotIyMgIEluaXRpYWwgc2hhcmVkIG9iamVjdCBzdXBwb3J0IGNoZWNrCi0jIwotaWYgKG5vdCAteCAiJENGR19TQklORElSLyRDRkdfVEFSR0VUIikgewotCXByaW50IFNUREVSUiAiYXB4czpFcnJvcjogJENGR19TQklORElSLyRDRkdfVEFSR0VUIG5vdCBmb3VuZCBvciBub3QgZXhlY3V0YWJsZVxuIjsKLQlleGl0KDEpOwotfQotaWYgKG5vdCBncmVwKC9tb2Rfc28vLCBgJENGR19TQklORElSLyRDRkdfVEFSR0VUIC1sYCkpIHsKLSAgICBwcmludCBTVERFUlIgImFweHM6RXJyb3I6IFNvcnJ5LCBubyBzaGFyZWQgb2JqZWN0IHN1cHBvcnQgZm9yIEFwYWNoZVxuIjsKLSAgICBwcmludCBTVERFUlIgImFweHM6RXJyb3I6IGF2YWlsYWJsZSB1bmRlciB5b3VyIHBsYXRmb3JtLiBNYWtlIHN1cmVcbiI7Ci0gICAgcHJpbnQgU1RERVJSICJhcHhzOkVycm9yOiB0aGUgQXBhY2hlIG1vZHVsZSBtb2Rfc28gaXMgY29tcGlsZWQgaW50b1xuIjsKLSAgICBwcmludCBTVERFUlIgImFweHM6RXJyb3I6IHlvdXIgc2VydmVyIGJpbmFyeSBgJENGR19TQklORElSLyRDRkdfVEFSR0VUJy5cbiI7Ci0gICAgZXhpdCgxKTsKLX0KLQotIyMKLSMjICBPcGVyYXRpb24KLSMjCi0KLSMgICBoZWxwZXIgZnVuY3Rpb24gZm9yIGV4ZWN1dGluZyBhIGxpc3Qgb2YKLSMgICBzeXN0ZW0gY29tbWFuZCB3aXRoIHJldHVybiBjb2RlIGNoZWNrcwotc3ViIGV4ZWN1dGVfY21kcyB7Ci0gICAgbXkgKEBjbWRzKSA9IEBfOwotICAgIG15ICgkY21kLCAkcmMpOwotCi0gICAgZm9yZWFjaCAkY21kIChAY21kcykgewotICAgICAgICBwcmludCBTVERFUlIgIiRjbWRcbiI7Ci0gICAgICAgICRyYyA9IHN5c3RlbSgiJGNtZCIpOwotICAgICAgICBpZiAoJHJjICE9IDApIHsKLSAgICAgICAgICAgIHByaW50ZihTVERFUlIgImFweHM6QnJlYWs6IENvbW1hbmQgZmFpbGVkIHdpdGggcmM9JWRcbiIsICRyYyA8PCA4KTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWlmICgkb3B0X2cpIHsKLSAgICAjIwotICAgICMjICBTQU1QTEUgTU9EVUxFIFNPVVJDRSBHRU5FUkFUSU9OCi0gICAgIyMKLQotICAgIGlmICgtZCAkbmFtZSkgewotICAgICAgICBwcmludCBTVERFUlIgImFweHM6RXJyb3I6IERpcmVjdG9yeSBgJG5hbWUnIGFscmVhZHkgZXhpc3RzLiBSZW1vdmUgZmlyc3RcbiI7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgbXkgJGRhdGEgPSBqb2luKCcnLCA8REFUQT4pOwotICAgICRkYXRhID1+IHN8JU5BTUUlfCRuYW1lfHNnOwotICAgICRkYXRhID1+IHN8JVRBUkdFVCV8JENGR19UQVJHRVR8c2c7Ci0KLSAgICBteSAoJG1rZiwgJHNyYykgPSAoJGRhdGEgPX4gbXxeKC4rKS09Iz0tXG4oLispfHMpOwotCi0gICAgcHJpbnQgU1RERVJSICJDcmVhdGluZyBbRElSXSAgJG5hbWVcbiI7Ci0gICAgc3lzdGVtKCJta2RpciAkbmFtZSIpOwotICAgIHByaW50IFNUREVSUiAiQ3JlYXRpbmcgW0ZJTEVdICRuYW1lL01ha2VmaWxlXG4iOwotICAgIG9wZW4oRlAsICI+JHtuYW1lfS9NYWtlZmlsZSIpIHx8IGRpZTsKLSAgICBwcmludCBGUCAkbWtmOwotICAgIGNsb3NlKEZQKTsKLSAgICBwcmludCBTVERFUlIgIkNyZWF0aW5nIFtGSUxFXSAkbmFtZS9tb2RfJG5hbWUuY1xuIjsKLSAgICBvcGVuKEZQLCAiPiR7bmFtZX0vbW9kXyR7bmFtZX0uYyIpIHx8IGRpZTsKLSAgICBwcmludCBGUCAkc3JjOwotICAgIGNsb3NlKEZQKTsKLQotICAgIGV4aXQoMCk7Ci19Ci0KLQotaWYgKCRvcHRfcSkgewotICAgICMjCi0gICAgIyMgIFFVRVJZIElORk9STUFUSU9OIAotICAgICMjCi0KLSAgICBteSAkcmVzdWx0ID0gJyc7Ci0gICAgbXkgJGFyZzsKLSAgICBmb3JlYWNoICRhcmcgKEBhcmdzKSB7Ci0gICAgICAgIG15ICRvayA9IDA7Ci0gICAgICAgIG15ICRuYW1lOwotICAgICAgICBmb3JlYWNoICRuYW1lIChxdygKLSAgICAgICAgICAgIFRBUkdFVCBDQyBDRkxBR1MgQ0ZMQUdTX1NITElCIExEX1NITElCIExERkxBR1NfU0hMSUIgTElCU19TSExJQgotICAgICAgICAgICAgUFJFRklYIFNCSU5ESVIgSU5DTFVERURJUiBMSUJFWEVDRElSIFNZU0NPTkZESVIKLSAgICAgICAgKSkgewotICAgICAgICAgICAgaWYgKCRhcmcgZXEgJG5hbWUgb3IgJGFyZyBlcSBsYygkbmFtZSkpIHsKLSAgICAgICAgICAgICAgICBteSAkdmFsID0gZXZhbCAiXCRDRkdfJG5hbWUiOwotICAgICAgICAgICAgICAgICRyZXN1bHQgLj0gIiR7dmFsfTo6IjsKLSAgICAgICAgICAgICAgICAkb2sgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChub3QgJG9rKSB7Ci0gICAgICAgICAgICBwcmludGYoU1RERVJSICJhcHhzOkVycm9yOiBJbnZhbGlkIHF1ZXJ5IHN0cmluZyBgJXMnXG4iLCAkYXJnKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgJHJlc3VsdCA9fiBzfDo6JHx8OwotICAgICRyZXN1bHQgPX4gc3w6OnwgfDsKLSAgICBwcmludCAkcmVzdWx0OwotfQotCi1pZiAoJG9wdF9jKSB7Ci0gICAgIyMKLSAgICAjIyAgU0hBUkVEIE9CSkVDVCBDT01QSUxBVElPTgotICAgICMjCi0KLSAgICAjICAgc3BsaXQgZmlsZXMgaW50byBzb3VyY2VzIGFuZCBvYmplY3RzCi0gICAgbXkgQHNyY3MgPSAoKTsKLSAgICBteSBAb2JqcyA9ICgpOwotICAgIG15ICRmOwotICAgIGZvcmVhY2ggJGYgKEBhcmdzKSB7Ci0gICAgICAgIGlmICgkZiA9fiBtfFwuYyR8KSB7Ci0gICAgICAgICAgICBwdXNoKEBzcmNzLCAkZik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwdXNoKEBvYmpzLCAkZik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAjICAgZGV0ZXJtaW5lIG91dHB1dCBmaWxlCi0gICAgbXkgJGRzb19maWxlOwotICAgIGlmICgkb3B0X28gZXEgJycpIHsKLSAgICAgICAgaWYgKCQjc3JjcyA+IC0xKSB7Ci0gICAgICAgICAgICAkZHNvX2ZpbGUgPSAkc3Jjc1swXTsKLSAgICAgICAgICAgICRkc29fZmlsZSA9fiBzfFwuW14uXSskfC5zb3w7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzaWYgKCQjb2JqcyA+IC0xKSB7Ci0gICAgICAgICAgICAkZHNvX2ZpbGUgPSAkb2Jqc1swXTsKLSAgICAgICAgICAgICRkc29fZmlsZSA9fiBzfFwuW14uXSskfC5zb3w7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAkZHNvX2ZpbGUgPSAibW9kX3Vua25vd24uc28iOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAkZHNvX2ZpbGUgPSAkb3B0X287Ci0gICAgfQotCi0gICAgIyAgIGNyZWF0ZSBjb21waWxhdGlvbiBjb21tYW5kcwotICAgIG15IEBjbWRzID0gKCk7Ci0gICAgbXkgJG9wdCA9ICcnOwotICAgIG15ICgkb3B0X1djLCAkb3B0X0ksICRvcHRfRCk7Ci0gICAgZm9yZWFjaCAkb3B0X1djIChAb3B0X1cpIHsKLSAgICAgICAgJG9wdCAuPSAiJDEgIiBpZiAoJG9wdF9XYyA9fiBtfF5ccypjLCguKikkfCk7Ci0gICAgfQotICAgIGZvcmVhY2ggJG9wdF9JIChAb3B0X0kpIHsKLSAgICAgICAgJG9wdCAuPSAiLUkkb3B0X0kgIjsKLSAgICB9Ci0gICAgZm9yZWFjaCAkb3B0X0QgKEBvcHRfRCkgewotICAgICAgICAkb3B0IC49ICItRCRvcHRfRCAiOwotICAgIH0KLSAgICBteSAkY2ZsYWdzID0gIiRDRkdfQ0ZMQUdTICRDRkdfQ0ZMQUdTX1NITElCIjsKLSAgICBteSAkczsKLSAgICBmb3JlYWNoICRzIChAc3JjcykgewotICAgICAgICBteSAkbyA9ICRzOwotICAgICAgICAkbyA9fiBzfFwuYyR8Lm98OwotICAgICAgICBwdXNoKEBjbWRzLCAiJENGR19DQyAkY2ZsYWdzIC1JJENGR19JTkNMVURFRElSICRvcHQgLWMgJHMiKTsKLSAgICAgICAgdW5zaGlmdChAb2JqcywgJG8pOwotICAgIH0KLQotICAgICMgICBjcmVhdGUgbGluayBjb21tYW5kCi0gICAgbXkgJGNtZCA9ICIkQ0ZHX0xEX1NITElCICRDRkdfTERGTEFHU19TSExJQiAtbyAkZHNvX2ZpbGUiOwotICAgIG15ICRvOwotICAgIGZvcmVhY2ggJG8gKEBvYmpzKSB7Ci0gICAgICAgICRjbWQgLj0gIiAkbyI7Ci0gICAgfQotICAgICRvcHQgPSAnJzsKLSAgICBteSAoJG9wdF9XbCwgJG9wdF9MLCAkb3B0X2wpOwotICAgIGZvcmVhY2ggJG9wdF9XbCAoQG9wdF9XKSB7Ci0JCWlmKCRDRkdfTERfU0hMSUIgbmUgImdjYyIpIHsKLQkgICAgICAgICRvcHQgLj0gIiAkMSIgaWYgKCRvcHRfV2wgPX4gbXxeXHMqbCwoLiopJHwpOwotCQl9IGVsc2UgewotCSAgICAgICAgJG9wdCAuPSAiIC1XJG9wdF9XbCI7Ci0JCX0KLSAgICB9Ci0gICAgZm9yZWFjaCAkb3B0X0wgKEBvcHRfTCkgewotICAgICAgICAkb3B0IC49ICIgLUwkb3B0X0wiOwotICAgIH0KLSAgICBmb3JlYWNoICRvcHRfbCAoQG9wdF9sKSB7Ci0gICAgICAgICRvcHQgLj0gIiAtbCRvcHRfbCI7Ci0gICAgfQotICAgICRjbWQgLj0gJG9wdDsKLSAgICAkY21kIC49ICIgJENGR19MSUJTX1NITElCIjsKLSAgICBwdXNoKEBjbWRzLCAkY21kKTsKLQotICAgICMgICBleGVjdXRlIHRoZSBjb21tYW5kcwotICAgICZleGVjdXRlX2NtZHMoQGNtZHMpOwotCi0gICAgIyAgIGFsbG93IG9uZS1zdGVwIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24KLSAgICBpZiAoJG9wdF9pIG9yICRvcHRfZSkgewotICAgICAgICBAYXJncyA9ICggJGRzb19maWxlICk7Ci0gICAgfQotfQotCi1pZiAoJG9wdF9pIG9yICRvcHRfZSkgewotICAgICMjCi0gICAgIyMgIFNIQVJFRCBPQkpFQ1QgSU5TVEFMTEFUSU9OCi0gICAgIyMKLQotICAgICMgICBkZXRlcm1pbmUgaW5zdGFsbGF0aW9uIGNvbW1hbmRzCi0gICAgIyAgIGFuZCBjb3JyZXNwb25kaW5nIExvYWRNb2R1bGUvQWRkTW9kdWxlIGRpcmVjdGl2ZXMKLSAgICBteSBAbG1kID0gKCk7Ci0gICAgbXkgQGFtZCA9ICgpOwotICAgIG15IEBjbWRzID0gKCk7Ci0gICAgbXkgJGY7Ci0gICAgZm9yZWFjaCAkZiAoQGFyZ3MpIHsKLSAgICAgICAgaWYgKCRmICF+IG18XC5zbyR8KSB7Ci0gICAgICAgICAgICBwcmludCBTVERFUlIgImFweHM6RXJyb3I6IGZpbGUgJGYgaXMgbm90IGEgc2hhcmVkIG9iamVjdFxuIjsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgbXkgJHQgPSAkZjsKLSAgICAgICAgJHQgPX4gc3xeLisvKFteL10rKSR8JDF8OwotICAgICAgICBpZiAoJG9wdF9pKSB7Ci0JICAgIHB1c2goQGNtZHMsICJjcCAkZiAkQ0ZHX0xJQkVYRUNESVIvJHQiKTsKLQkgICAgcHVzaChAY21kcywgImNobW9kIDc1NSAkQ0ZHX0xJQkVYRUNESVIvJHQiKTsKLSAgICAgICAgfQotCi0gICAgICAgICMgICBkZXRlcm1pbmUgbW9kdWxlIHN5bWJvbG5hbWUgYW5kIGZpbGVuYW1lCi0gICAgICAgIG15ICRmaWxlbmFtZSA9ICcnOwotICAgICAgICBpZiAoJG5hbWUgZXEgJ3Vua25vd24nKSB7Ci0gICAgICAgICAgICAkbmFtZSA9ICcnOwotICAgICAgICAgICAgbXkgJGJhc2UgPSAkZjsKLSAgICAgICAgICAgICRiYXNlID1+IHN8XC5bXi5dKyR8fDsKLSAgICAgICAgICAgIGlmICgtZiAiJGJhc2UuYyIpIHsKLSAgICAgICAgICAgICAgICBvcGVuKEZQLCAiPCRiYXNlLmMiKTsKLSAgICAgICAgICAgICAgICBteSAkY29udGVudCA9IGpvaW4oJycsIDxGUD4pOwotICAgICAgICAgICAgICAgIGNsb3NlKEZQKTsKLSAgICAgICAgICAgICAgICBpZiAoJGNvbnRlbnQgPX4gbXwuKm1vZHVsZVxzKyg/Ok1PRFVMRV9WQVJfRVhQT1JUXHMrKT8oW2EtekEtWjAtOV9dKylfbW9kdWxlXHMqPVxzKi4qfHMpIHsKLSAgICAgICAgICAgICAgICAgICAgJG5hbWUgPSAiJDEiOwotICAgICAgICAgICAgICAgICAgICAkZmlsZW5hbWUgPSAiJGJhc2UuYyI7Ci0gICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSA9fiBzfF5bXi9dKy98fDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoJG5hbWUgZXEgJycpIHsKLSAgICAgICAgICAgICAgICBpZiAoJGJhc2UgPX4gbXwuKm1vZF8oW2EtekEtWjAtOV9dKylcLi4rfCkgewotICAgICAgICAgICAgICAgICAgICAkbmFtZSA9ICIkMSI7Ci0gICAgICAgICAgICAgICAgICAgICRmaWxlbmFtZSA9ICRiYXNlOwotICAgICAgICAgICAgICAgICAgICAkZmlsZW5hbWUgPX4gc3xeW14vXSsvfHw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCRuYW1lIGVxICcnKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnQgImFweHM6RXJyb3I6IFNvcnJ5LCBjYW5ub3QgZGV0ZXJtaW5lIGJvb3RzdHJhcCBzeW1ib2wgbmFtZVxuIjsKLSAgICAgICAgICAgICAgICBwcmludCAiYXB4czpFcnJvcjogUGxlYXNlIHNwZWNpZnkgb25lIHdpdGggb3B0aW9uIGAtbidcbiI7Ci0gICAgICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoJGZpbGVuYW1lIGVxICcnKSB7Ci0gICAgICAgICAgICAkZmlsZW5hbWUgPSAibW9kXyR7bmFtZX0uYyI7Ci0gICAgICAgIH0KLSAgICAgICAgbXkgJGRpciA9ICRDRkdfTElCRVhFQ0RJUjsKLSAgICAgICAgJGRpciA9fiBzfF4kQ0ZHX1BSRUZJWC8/fHw7Ci0gICAgICAgICRkaXIgPX4gc3woLikkfCQxL3w7Ci0gICAgICAgIHB1c2goQGxtZCwgc3ByaW50ZigiTG9hZE1vZHVsZSAlLTE4cyAlcyIsICIke25hbWV9X21vZHVsZSIsICIkZGlyJHQiKSk7Ci0gICAgICAgIHB1c2goQGFtZCwgc3ByaW50ZigiQWRkTW9kdWxlICVzIiwgJGZpbGVuYW1lKSk7Ci0gICAgfQotCi0gICAgIyAgIGV4ZWN1dGUgdGhlIGNvbW1hbmRzCi0gICAgJmV4ZWN1dGVfY21kcyhAY21kcyk7Ci0KLSAgICAjICAgYWN0aXZhdGUgbW9kdWxlIHZpYSBMb2FkTW9kdWxlL0FkZE1vZHVsZSBkaXJlY3RpdmUKLSAgICBpZiAoJG9wdF9hIG9yICRvcHRfQSkgewotICAgICAgICBpZiAobm90IC1mICIkQ0ZHX1NZU0NPTkZESVIvJENGR19UQVJHRVQuY29uZiIpIHsKLSAgICAgICAgICAgIHByaW50ICJhcHhzOkVycm9yOiBDb25maWcgZmlsZSAkQ0ZHX1NZU0NPTkZESVIvJENGR19UQVJHRVQuY29uZiBub3QgZm91bmRcbiI7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3BlbihGUCwgIjwkQ0ZHX1NZU0NPTkZESVIvJENGR19UQVJHRVQuY29uZiIpIHx8IGRpZTsKLSAgICAgICAgbXkgJGNvbnRlbnQgPSBqb2luKCcnLCA8RlA+KTsKLSAgICAgICAgY2xvc2UoRlApOwotCi0gICAgICAgIGlmICgkY29udGVudCAhfiBtfFxuIz9ccypMb2FkTW9kdWxlXHMrfCkgewotICAgICAgICAgICAgcHJpbnQgU1RERVJSICJhcHhzOkVycm9yOiBBY3RpdmF0aW9uIGZhaWxlZCBmb3IgY3VzdG9tICRDRkdfU1lTQ09ORkRJUi8kQ0ZHX1RBUkdFVC5jb25mIGZpbGUuXG4iOwotICAgICAgICAgICAgcHJpbnQgU1RERVJSICJhcHhzOkVycm9yOiBBdCBsZWFzdCBvbmUgYExvYWRNb2R1bGUnIGRpcmVjdGl2ZSBhbHJlYWR5IGhhcyB0byBleGlzdC5cbiI7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgbXkgJGxtZDsKLSAgICAgICAgbXkgJGMgPSAnJzsKLSAgICAgICAgJGMgPSAnIycgaWYgKCRvcHRfQSk7Ci0gICAgICAgIGZvcmVhY2ggJGxtZCAoQGxtZCkgewotICAgICAgICAgICAgbXkgJHdoYXQgPSAkb3B0X0EgPyAicHJlcGFyaW5nIiA6ICJhY3RpdmF0aW5nIjsKLSAgICAgICAgICAgIGlmICgkY29udGVudCAhfiBtfFxuIz9ccyokbG1kfCkgewotICAgICAgICAgICAgICAgICAkY29udGVudCA9fiBzfF4oLipcbiM/XHMqTG9hZE1vZHVsZVxzK1teXG5dK1xuKXwkMSRjJGxtZFxufHNnOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPX4gc3xeKC4qXG4pIz9ccyokbG1kW15cbl0qXG58JDEkYyRsbWRcbnxzZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICRsbWQgPX4gbXxMb2FkTW9kdWxlXHMrKC4rPylfbW9kdWxlLip8OwotICAgICAgICAgICAgcHJpbnQgU1RERVJSICJbJHdoYXQgbW9kdWxlIGAkMScgaW4gJENGR19TWVNDT05GRElSLyRDRkdfVEFSR0VULmNvbmZdXG4iOwotICAgICAgICB9Ci0gICAgICAgIG15ICRhbWQ7Ci0gICAgICAgIGZvcmVhY2ggJGFtZCAoQGFtZCkgewotICAgICAgICAgICAgaWYgKCRjb250ZW50ICF+IG18XG4jP1xzKiRhbWR8KSB7Ci0gICAgICAgICAgICAgICAgICRjb250ZW50ID1+IHN8XiguKlxuIz9ccypBZGRNb2R1bGVccytbXlxuXStcbil8JDEkYyRhbWRcbnxzZzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICRjb250ZW50ID1+IHN8XiguKlxuKSM/XHMqJGFtZFteXG5dKlxufCQxJGMkYW1kXG58c2c7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEBsbWQgb3IgQGFtZCkgewotICAgICAgICAgICAgaWYgKG9wZW4oRlAsICI+JENGR19TWVNDT05GRElSLyRDRkdfVEFSR0VULmNvbmYubmV3IikpIHsKLSAgICAgICAgICAgICAgICBwcmludCBGUCAkY29udGVudDsKLSAgICAgICAgICAgICAgICBjbG9zZShGUCk7Ci0gICAgICAgICAgICAgICAgc3lzdGVtKCJjcCAkQ0ZHX1NZU0NPTkZESVIvJENGR19UQVJHRVQuY29uZiAkQ0ZHX1NZU0NPTkZESVIvJENGR19UQVJHRVQuY29uZi5iYWsgJiYgIiAuCi0gICAgICAgICAgICAgICAgICAgICAgICJjcCAkQ0ZHX1NZU0NPTkZESVIvJENGR19UQVJHRVQuY29uZi5uZXcgJENGR19TWVNDT05GRElSLyRDRkdfVEFSR0VULmNvbmYgJiYgIiAuCi0gICAgICAgICAgICAgICAgICAgICAgICJybSAkQ0ZHX1NZU0NPTkZESVIvJENGR19UQVJHRVQuY29uZi5uZXciKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJpbnQgU1RERVJSICJ1bmFibGUgdG8gb3BlbiBjb25maWd1cmF0aW9uIGZpbGVcbiI7Ci0gICAgICAgICAgICB9Ci0JfQotICAgIH0KLX0KLQotIyNFT0YjIwotX19EQVRBX18KLSMjCi0jIyAgTWFrZWZpbGUgLS0gQnVpbGQgcHJvY2VkdXJlIGZvciBzYW1wbGUgJU5BTUUlIEFwYWNoZSBtb2R1bGUKLSMjICBBdXRvZ2VuZXJhdGVkIHZpYSBgYGFweHMgLW4gJU5BTUUlIC1nJycuCi0jIwotCi0jICAgdGhlIHVzZWQgdG9vbHMKLUFQWFM9YXB4cwotQVBBQ0hFQ1RMPWFwYWNoZWN0bAotCi0jICAgYWRkaXRpb25hbCBkZWZpbmVzLCBpbmNsdWRlcyBhbmQgbGlicmFyaWVzCi0jREVGPS1EbXlfZGVmaW5lPW15X3ZhbHVlCi0jSU5DPS1JbXkvaW5jbHVkZS9kaXIKLSNMSUI9LUxteS9saWIvZGlyIC1sbXlsaWIKLQotIyAgIHRoZSBkZWZhdWx0IHRhcmdldAotYWxsOiBtb2RfJU5BTUUlLnNvCi0KLSMgICBjb21waWxlIHRoZSBzaGFyZWQgb2JqZWN0IGZpbGUKLW1vZF8lTkFNRSUuc286IG1vZF8lTkFNRSUuYwotCSQoQVBYUykgLWMgJChERUYpICQoSU5DKSAkKExJQikgbW9kXyVOQU1FJS5jCi0KLSMgICBpbnN0YWxsIHRoZSBzaGFyZWQgb2JqZWN0IGZpbGUgaW50byBBcGFjaGUgCi1pbnN0YWxsOiBhbGwKLQkkKEFQWFMpIC1pIC1hIC1uICclTkFNRSUnIG1vZF8lTkFNRSUuc28KLQotIyAgIGNsZWFudXAKLWNsZWFuOgotCS1ybSAtZiBtb2RfJU5BTUUlLm8gbW9kXyVOQU1FJS5zbwotCi0jICAgc2ltcGxlIHRlc3QKLXRlc3Q6IHJlbG9hZAotCWx5bnggLW1pbWVfaGVhZGVyIGh0dHA6Ly9sb2NhbGhvc3QvJU5BTUUlCi0KLSMgICBpbnN0YWxsIGFuZCBhY3RpdmF0ZSBzaGFyZWQgb2JqZWN0IGJ5IHJlbG9hZGluZyBBcGFjaGUgdG8KLSMgICBmb3JjZSBhIHJlbG9hZCBvZiB0aGUgc2hhcmVkIG9iamVjdCBmaWxlCi1yZWxvYWQ6IGluc3RhbGwgcmVzdGFydAotCi0jICAgdGhlIGdlbmVyYWwgQXBhY2hlIHN0YXJ0L3Jlc3RhcnQvc3RvcAotIyAgIHByb2NlZHVyZXMKLXN0YXJ0OgotCSQoQVBBQ0hFQ1RMKSBzdGFydAotcmVzdGFydDoKLQkkKEFQQUNIRUNUTCkgcmVzdGFydAotc3RvcDoKLQkkKEFQQUNIRUNUTCkgc3RvcAotCi0tPSM9LQotLyogCi0qKiAgbW9kXyVOQU1FJS5jIC0tIEFwYWNoZSBzYW1wbGUgJU5BTUUlIG1vZHVsZQotKiogIFtBdXRvZ2VuZXJhdGVkIHZpYSBgYGFweHMgLW4gJU5BTUUlIC1nJyddCi0qKgotKiogIFRvIHBsYXkgd2l0aCB0aGlzIHNhbXBsZSBtb2R1bGUgZmlyc3QgY29tcGlsZSBpdCBpbnRvIGEKLSoqICBEU08gZmlsZSBhbmQgaW5zdGFsbCBpdCBpbnRvIEFwYWNoZSdzIGxpYmV4ZWMgZGlyZWN0b3J5IAotKiogIGJ5IHJ1bm5pbmc6Ci0qKgotKiogICAgJCBhcHhzIC1jIC1pIG1vZF8lTkFNRSUuYwotKioKLSoqICBUaGVuIGFjdGl2YXRlIGl0IGluIEFwYWNoZSdzICVUQVJHRVQlLmNvbmYgZmlsZSBmb3IgaW5zdGFuY2UKLSoqICBmb3IgdGhlIFVSTCAvJU5BTUUlIGluIGFzIGZvbGxvd3M6Ci0qKgotKiogICAgIyAgICVUQVJHRVQlLmNvbmYKLSoqICAgIExvYWRNb2R1bGUgJU5BTUUlX21vZHVsZSBsaWJleGVjL21vZF8lTkFNRSUuc28KLSoqICAgIDxMb2NhdGlvbiAvJU5BTUUlPgotKiogICAgU2V0SGFuZGxlciAlTkFNRSUKLSoqICAgIDwvTG9jYXRpb24+Ci0qKgotKiogIFRoZW4gYWZ0ZXIgcmVzdGFydGluZyBBcGFjaGUgdmlhCi0qKgotKiogICAgJCBhcGFjaGVjdGwgcmVzdGFydAotKioKLSoqICB5b3UgaW1tZWRpYXRlbHkgY2FuIHJlcXVlc3QgdGhlIFVSTCAvJU5BTUUgYW5kIHdhdGNoIGZvciB0aGUKLSoqICBvdXRwdXQgb2YgdGhpcyBtb2R1bGUuIFRoaXMgY2FuIGJlIGFjaGlldmVkIGZvciBpbnN0YW5jZSB2aWE6Ci0qKgotKiogICAgJCBseW54IC1taW1lX2hlYWRlciBodHRwOi8vbG9jYWxob3N0LyVOQU1FJSAKLSoqCi0qKiAgVGhlIG91dHB1dCBzaG91bGQgYmUgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nIG9uZToKLSoqCi0qKiAgICBIVFRQLzEuMSAyMDAgT0sKLSoqICAgIERhdGU6IFR1ZSwgMzEgTWFyIDE5OTggMTQ6NDI6MjIgR01UCi0qKiAgICBTZXJ2ZXI6IEFwYWNoZS8xLjMuNCAoVW5peCkKLSoqICAgIENvbm5lY3Rpb246IGNsb3NlCi0qKiAgICBDb250ZW50LVR5cGU6IHRleHQvaHRtbAotKiogIAotKiogICAgVGhlIHNhbXBsZSBwYWdlIGZyb20gbW9kXyVOQU1FJS5jCi0qLyAKLQotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiaHR0cF9jb25maWcuaCIKLSNpbmNsdWRlICJodHRwX3Byb3RvY29sLmgiCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0KLS8qIFRoZSBzYW1wbGUgY29udGVudCBoYW5kbGVyICovCi1zdGF0aWMgaW50ICVOQU1FJV9oYW5kbGVyKHJlcXVlc3RfcmVjICpyKQotewotICAgIHItPmNvbnRlbnRfdHlwZSA9ICJ0ZXh0L2h0bWwiOyAgICAgIAotICAgIGFwX3NlbmRfaHR0cF9oZWFkZXIocik7Ci0gICAgaWYgKCFyLT5oZWFkZXJfb25seSkKLSAgICAgICAgYXBfcnB1dHMoIlRoZSBzYW1wbGUgcGFnZSBmcm9tIG1vZF8lTkFNRSUuY1xuIiwgcik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vKiBEaXNwYXRjaCBsaXN0IG9mIGNvbnRlbnQgaGFuZGxlcnMgKi8KLXN0YXRpYyBjb25zdCBoYW5kbGVyX3JlYyAlTkFNRSVfaGFuZGxlcnNbXSA9IHsgCi0gICAgeyAiJU5BTUUlIiwgJU5BTUUlX2hhbmRsZXIgfSwgCi0gICAgeyBOVUxMLCBOVUxMIH0KLX07Ci0KLS8qIERpc3BhdGNoIGxpc3QgZm9yIEFQSSBob29rcyAqLwotbW9kdWxlIE1PRFVMRV9WQVJfRVhQT1JUICVOQU1FJV9tb2R1bGUgPSB7Ci0gICAgU1RBTkRBUkRfTU9EVUxFX1NUVUZGLCAKLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIG1vZHVsZSBpbml0aWFsaXplciAgICAgICAgICAgICAgICAgICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBjcmVhdGUgcGVyLWRpciAgICBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogbWVyZ2UgIHBlci1kaXIgICAgY29uZmlnIHN0cnVjdHVyZXMgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIGNyZWF0ZSBwZXItc2VydmVyIGNvbmZpZyBzdHJ1Y3R1cmVzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBtZXJnZSAgcGVyLXNlcnZlciBjb25maWcgc3RydWN0dXJlcyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogdGFibGUgb2YgY29uZmlnIGZpbGUgY29tbWFuZHMgICAgICAgKi8KLSAgICAlTkFNRSVfaGFuZGxlcnMsICAgICAgIC8qIFsjOF0gTUlNRS10eXBlZC1kaXNwYXRjaGVkIGhhbmRsZXJzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBbIzFdIFVSSSB0byBmaWxlbmFtZSB0cmFuc2xhdGlvbiAgICAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogWyM0XSB2YWxpZGF0ZSB1c2VyIGlkIGZyb20gcmVxdWVzdCAgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIFsjNV0gY2hlY2sgaWYgdGhlIHVzZXIgaXMgb2sgX2hlcmVfICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBbIzNdIGNoZWNrIGFjY2VzcyBieSBob3N0IGFkZHJlc3MgICAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogWyM2XSBkZXRlcm1pbmUgTUlNRSB0eXBlICAgICAgICAgICAgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIFsjN10gcHJlLXJ1biBmaXh1cHMgICAgICAgICAgICAgICAgICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBbIzldIGxvZyBhIHRyYW5zYWN0aW9uICAgICAgICAgICAgICAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogWyMyXSBoZWFkZXIgcGFyc2VyICAgICAgICAgICAgICAgICAgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIGNoaWxkX2luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBjaGlsZF9leGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIE5VTEwgICAgICAgICAgICAgICAgICAgLyogWyMwXSBwb3N0IHJlYWQtcmVxdWVzdCAgICAgICAgICAgICAgKi8KLX07Ci0KZGlmZiAtLWdpdCBhL3N1cHBvcnQvZGJtbWFuYWdlIGIvc3VwcG9ydC9kYm1tYW5hZ2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMWJkZDEuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9kYm1tYW5hZ2UKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotIyEvdXNyL2xvY2FsL2Jpbi9wZXJsCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSMgYXJlIG1ldDoKLSMKLSMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSMKLSMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0jICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgICAgZGlzdHJpYnV0aW9uLgotIwotIyAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSMgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0jICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSMgICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSMKLSMgNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotIyAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotIyAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0jICAgIGFwYWNoZUBhcGFjaGUub3JnLgotIwotIyA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotIyAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSMgICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotIwotIyA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0jICAgIGFja25vd2xlZGdtZW50OgotIyAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0jICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotIyBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0jIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotIyBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotIyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0jIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSMgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotIyBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSMgb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0jIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSMgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotIyBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLQotI2ZvciBtb3JlIGZ1bmN0aW9uYWxpdHkgc2VlIHRoZSBIVFRQRDo6VXNlckFkbWluIG1vZHVsZToKLSMgaHR0cDovL3d3dy5wZXJsLmNvbS9DUEFOL21vZHVsZXMvYnktbW9kdWxlL0hUVFBEL0hUVFBELVRvb2xzLXgueHgudGFyLmd6Ci0jCi0jIHVzYWdlOiBkYm1tYW5hZ2UgPERCTWZpbGU+IDxjb21tYW5kPiA8a2V5PiA8dmFsdWU+Ci0KLXBhY2thZ2UgZGJtbWFuYWdlOwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtbGRiICAgIC1sbmRibSAgICAtbGdkYm0KLUJFR0lOIHsgQEFueURCTV9GaWxlOjpJU0EgPSBxdyhEQl9GaWxlIE5EQk1fRmlsZSBHREJNX0ZpbGUpIH0KLXVzZSBzdHJpY3Q7Ci11c2UgRmNudGw7Ci11c2UgQW55REJNX0ZpbGUgKCk7Ci0KLW15KCRmaWxlLCRjb21tYW5kLCRrZXksJGNyeXB0ZWRfcHdkKSA9IEBBUkdWOwotCi11c2FnZSgpIHVubGVzcyAkZmlsZSBhbmQgJGNvbW1hbmQgYW5kIGRlZmluZWQgJnskZGJtYzo6eyRjb21tYW5kfX07Ci0KLSMgaWYgeW91ciBvc25hbWUgaXMgaW4gJG5ld3N0eWxlX3NhbHQsIHRoZW4gdXNlIG5ldyBzdHlsZSBzYWx0IChzdGFydHMgd2l0aCAnXycgYW5kIGNvbnRhaW5zCi0jIGZvdXIgYnl0ZXMgb2YgaXRlcmF0aW9uIGNvdW50IGFuZCBmb3VyIGJ5dGVzIG9mIHNhbHQpLiAgT3RoZXJ3aXNlLCBqdXN0IHVzZQotIyB0aGUgdHJhZGl0aW9uYWwgdHdvLWJ5dGUgc2FsdC4KLSMgc2VlIHRoZSBtYW4gcGFnZSBvbiB5b3VyIHN5c3RlbSB0byBkZWNpZGUgaWYgeW91IGhhdmUgYSBuZXdlciBjcnlwdCgpIGxpYi4KLSMgSSBiZWxpZXZlIHRoYXQgNC40QlNEIGRlcml2ZWQgc3lzdGVtcyBkbyAoYXQgbGVhc3QgQlNEL09TIDIuMCBkb2VzKS4KLSMgVGhlIG5ldyBzdHlsZSBjcnlwdCgpIGFsbG93cyB1cCB0byAyMCBjaGFyYWN0ZXJzIG9mIHRoZSBwYXNzd29yZCB0byBiZQotIyBzaWduaWZpY2FudCByYXRoZXIgdGhhbiBvbmx5IDguCi1teSAkbmV3c3R5bGVfc2FsdCA9IGpvaW4gJ3wnLCBxd3tic2Rvc307ICNvdGhlcnM/Ci0KLSMgcmVtb3ZlIGV4dGVuc2lvbiBpZiBhbnkKLW15ICRjaG9wID0gam9pbiAnfCcsIHF3e2RiLj8gcGFnIGRpcn07Ci0kZmlsZSA9fiBzL1wuKCRjaG9wKSQvLzsKLQotbXkgJGlzX3VwZGF0ZSA9ICRjb21tYW5kIGVxICJ1cGRhdGUiOwotbXkgJElzX1dpbjMyICA9ICReTyBlcSAiTVNXaW4zMiI7IAotbXkgJURCID0gKCk7Ci1teSBAcmFuZ2UgPSAoKTsKLW15KCRtb2RlLCAkZmxhZ3MpID0gJGNvbW1hbmQgPX4gCi0gICAgL14oPzp2aWV3fGNoZWNrKSQvID8gKDA2NDQsIE9fUkRPTkxZKSA6ICgwNjQ0LCBPX1JEV1J8T19DUkVBVCk7Ci0KLXRpZSAlREIsICJBbnlEQk1fRmlsZSIsICRmaWxlLCAkZmxhZ3MsICRtb2RlIHx8IGRpZSAiQ2FuJ3QgdGllICRmaWxlOiAkISI7Ci1kYm1jLT4kY29tbWFuZCgpOwotdW50aWUgJURCOwotCi1zdWIgdXNhZ2UgewotICAgIG15ICRjbWRzID0gam9pbiAifCIsIHNvcnQga2V5cyAlZGJtYzo6OwotICAgIGRpZSAidXNhZ2U6ICQwIGZpbGVuYW1lIFskY21kc10gW3VzZXJuYW1lXVxuIjsKLX0KLQotbXkgJHg7Ci1zdWIgZ2Vuc2VlZCB7Ci0gICAgbXkgJHBzZjsKLSAgICBmb3IgKHF3KC14bHd3YSAtbGUpKSB7IAotCWBwcyAkXyAyPi9kZXYvbnVsbGA7Ci0JJHBzZiA9ICRfLCBsYXN0IHVubGVzcyAkPzsKLSAgICB9Ci0gICAgc3JhbmQgKHRpbWUgXiAkJCBeIHVucGFjaygiJUwqIiwgYHBzICRwc2YgfCBnemlwIC1mYCkpOwotICAgIEByYW5nZSA9IChxdyguIC8pLCAnMCcuLic5JywnYScuLid6JywnQScuLidaJyk7Ci0gICAgJHggPSBpbnQgc2NhbGFyIEByYW5nZTsKLX0KLQotc3ViIHJhbmRjaGFyIHsgCi0gICAgam9pbiAnJywgbWFwICRyYW5nZVtyYW5kICR4XSwgMS4uc2hpZnR8fDE7Ci19Ci0KLXN1YiBzYWx0IHsKLSAgICBteSAkbmV3c3R5bGUgPSAkXk8gPX4gLyg/OiRuZXdzdHlsZV9zYWx0KS87Ci0gICAgZ2Vuc2VlZCgpIHVubGVzcyBAcmFuZ2U7IAotICAgIHJldHVybiAkbmV3c3R5bGUgPyAKLQlqb2luICcnLCAiXyIsIHJhbmRjaGFyLCAiYS4uIiwgcmFuZGNoYXIoNCkgOgotICAgICAgICByYW5kY2hhcigyKTsKLX0KLQotc3ViIGdldHBhc3MgewotICAgIG15ICRwcm9tcHQgPSBzaGlmdCB8fCAiRW50ZXIgcGFzc3dvcmQ6IjsKLQotICAgIHVubGVzcygkSXNfV2luMzIpIHsgCi0Jb3BlbiBTVERJTiwgIi9kZXYvdHR5IiBvciB3YXJuICJjb3VsZG4ndCBvcGVuIC9kZXYvdHR5ICQhXG4iOwotCXN5c3RlbSAic3R0eSAtZWNobzsiOwotICAgIH0KLQotICAgIG15KCRjLCRwd2QpOwotICAgIHByaW50IFNUREVSUiAkcHJvbXB0OwotICAgIHdoaWxlICgoJGMgPSBnZXRjKFNURElOKSkgbmUgJycgYW5kICRjIG5lICJcbiIgYW5kICRjIG5lICJcciIpIHsKLQkkcHdkIC49ICRjOwotICAgIH0KLQotICAgIHN5c3RlbSAic3R0eSBlY2hvIiB1bmxlc3MgJElzX1dpbjMyOwotICAgIHByaW50IFNUREVSUiAiXG4iOwotICAgIGRpZSAiQ2FuJ3QgdXNlIGVtcHR5IHBhc3N3b3JkIVxuIiB1bmxlc3MgbGVuZ3RoICRwd2Q7Ci0gICAgcmV0dXJuICRwd2Q7Ci19Ci0KLXN1YiBkYm1jOjp1cGRhdGUgewotICAgIGRpZSAiU29ycnksIHVzZXIgYCRrZXknIGRvZXNuJ3QgZXhpc3QhXG4iIHVubGVzcyAkREJ7JGtleX07Ci0gICAgZGJtYy0+YWRkdXNlcjsKLX0KLQotc3ViIGRibWM6OmFkZCB7Ci0gICAgZGllICJDYW4ndCB1c2UgZW1wdHkgcGFzc3dvcmQhXG4iIHVubGVzcyAkY3J5cHRlZF9wd2Q7Ci0gICAgdW5sZXNzKCRpc191cGRhdGUpIHsKLQlkaWUgIlNvcnJ5LCB1c2VyIGAka2V5JyBhbHJlYWR5IGV4aXN0cyFcbiIgaWYgJERCeyRrZXl9OwotICAgIH0KLSAgICAkREJ7JGtleX0gPSAkY3J5cHRlZF9wd2Q7Ci0gICAgbXkgJGFjdGlvbiA9ICRpc191cGRhdGUgPyAidXBkYXRlZCIgOiAiYWRkZWQiOwotICAgIHByaW50ICJVc2VyICRrZXkgJGFjdGlvbiB3aXRoIHBhc3N3b3JkIGVuY3J5cHRlZCB0byAkREJ7JGtleX1cbiI7Ci19Ci0KLXN1YiBkYm1jOjphZGR1c2VyIHsKLSAgICBteSAkdmFsdWUgPSBnZXRwYXNzICJOZXcgcGFzc3dvcmQ6IjsKLSAgICBkaWUgIlRoZXkgZG9uJ3QgbWF0Y2gsIHNvcnJ5LlxuIiB1bmxlc3MgZ2V0cGFzcygiUmUtdHlwZSBuZXcgcGFzc3dvcmQ6IikgZXEgJHZhbHVlOwotICAgICRjcnlwdGVkX3B3ZCA9IGNyeXB0ICR2YWx1ZSwgY2FsbGVyLT5zYWx0OwotICAgIGRibWMtPmFkZDsKLX0KLQotc3ViIGRibWM6OmRlbGV0ZSB7Ci0gICAgZGllICJTb3JyeSwgdXNlciBgJGtleScgZG9lc24ndCBleGlzdCFcbiIgdW5sZXNzICREQnska2V5fTsKLSAgICBkZWxldGUgJERCeyRrZXl9LCBwcmludCAiYCRrZXknIGRlbGV0ZWRcbiI7Ci19Ci0KLXN1YiBkYm1jOjp2aWV3IHsKLSAgICBwcmludCAka2V5ID8gIiRrZXk6JERCeyRrZXl9XG4iIDogbWFwIHsgIiRfOiREQnskX31cbiIgaWYgJERCeyRffSB9IGtleXMgJURCOwotfQotCi1zdWIgZGJtYzo6Y2hlY2sgewotICAgIGRpZSAiU29ycnksIHVzZXIgYCRrZXknIGRvZXNuJ3QgZXhpc3QhXG4iIHVubGVzcyAkREJ7JGtleX07Ci0gICAgcHJpbnQgY3J5cHQoZ2V0cGFzcygpLCAkREJ7JGtleX0pIGVxICREQnska2V5fSA/ICJwYXNzd29yZCBva1xuIiA6ICJwYXNzd29yZCBtaXNtYXRjaFxuIjsKLX0KLQotc3ViIGRibWM6OmltcG9ydCB7Ci0gICAgd2hpbGUoZGVmaW5lZCgkXyA9IDxTVERJTj4pIGFuZCBjaG9tcCkgewotCSgka2V5LCRjcnlwdGVkX3B3ZCkgPSBzcGxpdCAvOi8sICRfLCAyOwotCWRibWMtPmFkZDsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3N1cHBvcnQvaHRkaWdlc3QuYyBiL3N1cHBvcnQvaHRkaWdlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJkMGY0NC4uMDAwMDAwMAotLS0gYS9zdXBwb3J0L2h0ZGlnZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogTk9URSEgVGhpcyBwcm9ncmFtIGlzIG5vdCBzYWZlIGFzIGEgc2V0dWlkIGV4ZWN1dGFibGUhICBEbyBub3QgbWFrZSBpdAotICogc2V0dWlkIQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIGh0ZGlnZXN0LmM6IHNpbXBsZSBwcm9ncmFtIGZvciBtYW5pcHVsYXRpbmcgZGlnZXN0IHBhc3N3ZCBmaWxlIGZvciBBcGFjaGUKLSAqCi0gKiBieSBBbGV4ZWkgS29zdXQsIGJhc2VkIG9uIGh0cGFzc3dkLmMsIGJ5IFJvYiBNY0Nvb2wKLSAqLwotCi0jaW5jbHVkZSAiYXByX2xpYi5oIgotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgImFwLmgiCi0jaW5jbHVkZSAiYXBfbWQ1LmgiCi0jaWYgZGVmaW5lZChNUEUpIHx8IGRlZmluZWQoUU5YKSB8fCBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9fVEFOREVNKSB8fCBkZWZpbmVkKEJFT1MpCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHN5cy9zaWduYWwuaD4KLSNlbmRpZgotCi0jaWZkZWYgV0lOMzIKLSNpbmNsdWRlIDxjb25pby5oPgotI2RlZmluZSB1bmxpbmsgX3VubGluawotI2VuZGlmCi0KLSNpZmRlZiBDSEFSU0VUX0VCQ0RJQwotI2RlZmluZSBMRiAnXG4nCi0jZGVmaW5lIENSICdccicKLSNlbHNlCi0jZGVmaW5lIExGIDEwCi0jZGVmaW5lIENSIDEzCi0jZW5kaWYgLyogQ0hBUlNFVF9FQkNESUMgKi8KLQotI2RlZmluZSBNQVhfU1RSSU5HX0xFTiAyNTYKLQotY2hhciAqdG47Ci0KLXN0YXRpYyB2b2lkIGdldHdvcmQoY2hhciAqd29yZCwgY2hhciAqbGluZSwgY2hhciBzdG9wKQotewotICAgIGludCB4ID0gMCwgeTsKLQotICAgIGZvciAoeCA9IDA7ICgobGluZVt4XSkgJiYgKGxpbmVbeF0gIT0gc3RvcCkpOyB4KyspCi0Jd29yZFt4XSA9IGxpbmVbeF07Ci0KLSAgICB3b3JkW3hdID0gJ1wwJzsKLSAgICBpZiAobGluZVt4XSkKLQkrK3g7Ci0gICAgeSA9IDA7Ci0KLSAgICB3aGlsZSAoKGxpbmVbeSsrXSA9IGxpbmVbeCsrXSkpOwotfQotCi1zdGF0aWMgaW50IGdldGxpbmUoY2hhciAqcywgaW50IG4sIEZJTEUgKmYpCi17Ci0gICAgcmVnaXN0ZXIgaW50IGkgPSAwOwotCi0gICAgd2hpbGUgKDEpIHsKLQlzW2ldID0gKGNoYXIpIGZnZXRjKGYpOwotCi0JaWYgKHNbaV0gPT0gQ1IpCi0JICAgIHNbaV0gPSBmZ2V0YyhmKTsKLQotCWlmICgoc1tpXSA9PSAweDQpIHx8IChzW2ldID09IExGKSB8fCAoaSA9PSAobiAtIDEpKSkgewotCSAgICBzW2ldID0gJ1wwJzsKLQkgICAgcmV0dXJuIChmZW9mKGYpID8gMSA6IDApOwotCX0KLQkrK2k7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBwdXRsaW5lKEZJTEUgKmYsIGNoYXIgKmwpCi17Ci0gICAgaW50IHg7Ci0KLSAgICBmb3IgKHggPSAwOyBsW3hdOyB4KyspCi0JZnB1dGMobFt4XSwgZik7Ci0gICAgZnB1dGMoJ1xuJywgZik7Ci19Ci0KLQotc3RhdGljIHZvaWQgYWRkX3Bhc3N3b3JkKGNoYXIgKnVzZXIsIGNoYXIgKnJlYWxtLCBGSUxFICpmKQotewotICAgIGNoYXIgKnB3OwotICAgIEFQX01ENV9DVFggY29udGV4dDsKLSAgICB1bnNpZ25lZCBjaGFyIGRpZ2VzdFsxNl07Ci0gICAgY2hhciBzdHJpbmdbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgcHdpbltNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciBwd3ZbTUFYX1NUUklOR19MRU5dOwotICAgIHVuc2lnbmVkIGludCBpOwotICAgIHNpemVfdCBidWZzaXplOwotCi0gICAgYnVmc2l6ZSA9IHNpemVvZihwd2luKTsKLSAgICBpZiAoYXBfZ2V0cGFzcygiTmV3IHBhc3N3b3JkOiAiLCBwd2luLCAmYnVmc2l6ZSkgIT0gMCkgewotCWZwcmludGYoc3RkZXJyLCAicGFzc3dvcmQgdG9vIGxvbmciKTsKLQlleGl0KDUpOwotICAgIH0KLSAgICBidWZzaXplID0gc2l6ZW9mKHB3dik7Ci0gICAgYXBfZ2V0cGFzcygiUmUtdHlwZSBuZXcgcGFzc3dvcmQ6ICIsIHB3diwgJmJ1ZnNpemUpOwotICAgIGlmIChzdHJjbXAocHdpbiwgcHd2KSAhPSAwKSB7Ci0JZnByaW50ZihzdGRlcnIsICJUaGV5IGRvbid0IG1hdGNoLCBzb3JyeS5cbiIpOwotCWlmICh0bikgewotCSAgICB1bmxpbmsodG4pOwotCX0KLQlleGl0KDEpOwotICAgIH0KLSAgICBwdyA9IHB3aW47Ci0gICAgZnByaW50ZihmLCAiJXM6JXM6IiwgdXNlciwgcmVhbG0pOwotCi0gICAgLyogRG8gTUQ1IHN0dWZmICovCi0gICAgc3ByaW50ZihzdHJpbmcsICIlczolczolcyIsIHVzZXIsIHJlYWxtLCBwdyk7Ci0KLSAgICBhcF9NRDVJbml0KCZjb250ZXh0KTsKLSAgICBhcF9NRDVVcGRhdGUoJmNvbnRleHQsICh1bnNpZ25lZCBjaGFyICopIHN0cmluZywgc3RybGVuKHN0cmluZykpOwotICAgIGFwX01ENUZpbmFsKGRpZ2VzdCwgJmNvbnRleHQpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JZnByaW50ZihmLCAiJTAyeCIsIGRpZ2VzdFtpXSk7Ci0KLSAgICBmcHJpbnRmKGYsICJcbiIpOwotfQotCi1zdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQotewotICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGh0ZGlnZXN0IFstY10gcGFzc3dvcmRmaWxlIHJlYWxtIHVzZXJuYW1lXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIlRoZSAtYyBmbGFnIGNyZWF0ZXMgYSBuZXcgZmlsZS5cbiIpOwotICAgIGV4aXQoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGludGVycnVwdGVkKHZvaWQpCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICJJbnRlcnJ1cHRlZC5cbiIpOwotICAgIGlmICh0bikKLQl1bmxpbmsodG4pOwotICAgIGV4aXQoMSk7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gICAgRklMRSAqdGZwLCAqZjsKLSAgICBjaGFyIHVzZXJbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgcmVhbG1bTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgbGluZVtNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciBsW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyIHdbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgeFtNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciBjb21tYW5kW01BWF9TVFJJTkdfTEVOXTsKLSAgICBpbnQgZm91bmQ7Ci0KLSAgICB0biA9IE5VTEw7Ci0gICAgc2lnbmFsKFNJR0lOVCwgKHZvaWQgKCopKGludCkpIGludGVycnVwdGVkKTsKLSAgICBpZiAoYXJnYyA9PSA1KSB7Ci0JaWYgKHN0cmNtcChhcmd2WzFdLCAiLWMiKSkKLQkgICAgdXNhZ2UoKTsKLQlpZiAoISh0ZnAgPSBmb3Blbihhcmd2WzJdLCAidyIpKSkgewotCSAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIHBhc3N3ZCBmaWxlICVzIGZvciB3cml0aW5nLlxuIiwKLQkJICAgIGFyZ3ZbMl0pOwotCSAgICBwZXJyb3IoImZvcGVuIik7Ci0JICAgIGV4aXQoMSk7Ci0JfQotCXByaW50ZigiQWRkaW5nIHBhc3N3b3JkIGZvciAlcyBpbiByZWFsbSAlcy5cbiIsIGFyZ3ZbNF0sIGFyZ3ZbM10pOwotCWFkZF9wYXNzd29yZChhcmd2WzRdLCBhcmd2WzNdLCB0ZnApOwotCWZjbG9zZSh0ZnApOwotCWV4aXQoMCk7Ci0gICAgfQotICAgIGVsc2UgaWYgKGFyZ2MgIT0gNCkKLQl1c2FnZSgpOwotCi0gICAgdG4gPSB0bXBuYW0oTlVMTCk7Ci0gICAgaWYgKCEodGZwID0gZm9wZW4odG4sICJ3IikpKSB7Ci0JZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiB0ZW1wIGZpbGUuXG4iKTsKLQlleGl0KDEpOwotICAgIH0KLQotICAgIGlmICghKGYgPSBmb3Blbihhcmd2WzFdLCAiciIpKSkgewotCWZwcmludGYoc3RkZXJyLAotCQkiQ291bGQgbm90IG9wZW4gcGFzc3dkIGZpbGUgJXMgZm9yIHJlYWRpbmcuXG4iLCBhcmd2WzFdKTsKLQlmcHJpbnRmKHN0ZGVyciwgIlVzZSAtYyBvcHRpb24gdG8gY3JlYXRlIG5ldyBvbmUuXG4iKTsKLQlleGl0KDEpOwotICAgIH0KLSAgICBzdHJjcHkodXNlciwgYXJndlszXSk7Ci0gICAgc3RyY3B5KHJlYWxtLCBhcmd2WzJdKTsKLQotICAgIGZvdW5kID0gMDsKLSAgICB3aGlsZSAoIShnZXRsaW5lKGxpbmUsIE1BWF9TVFJJTkdfTEVOLCBmKSkpIHsKLQlpZiAoZm91bmQgfHwgKGxpbmVbMF0gPT0gJyMnKSB8fCAoIWxpbmVbMF0pKSB7Ci0JICAgIHB1dGxpbmUodGZwLCBsaW5lKTsKLQkgICAgY29udGludWU7Ci0JfQotCXN0cmNweShsLCBsaW5lKTsKLQlnZXR3b3JkKHcsIGwsICc6Jyk7Ci0JZ2V0d29yZCh4LCBsLCAnOicpOwotCWlmIChzdHJjbXAodXNlciwgdykgfHwgc3RyY21wKHJlYWxtLCB4KSkgewotCSAgICBwdXRsaW5lKHRmcCwgbGluZSk7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQllbHNlIHsKLQkgICAgcHJpbnRmKCJDaGFuZ2luZyBwYXNzd29yZCBmb3IgdXNlciAlcyBpbiByZWFsbSAlc1xuIiwgdXNlciwgcmVhbG0pOwotCSAgICBhZGRfcGFzc3dvcmQodXNlciwgcmVhbG0sIHRmcCk7Ci0JICAgIGZvdW5kID0gMTsKLQl9Ci0gICAgfQotICAgIGlmICghZm91bmQpIHsKLQlwcmludGYoIkFkZGluZyB1c2VyICVzIGluIHJlYWxtICVzXG4iLCB1c2VyLCByZWFsbSk7Ci0JYWRkX3Bhc3N3b3JkKHVzZXIsIHJlYWxtLCB0ZnApOwotICAgIH0KLSAgICBmY2xvc2UoZik7Ci0gICAgZmNsb3NlKHRmcCk7Ci0jaWYgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lOMzIpCi0gICAgc3ByaW50Zihjb21tYW5kLCAiY29weSBcIiVzXCIgXCIlc1wiIiwgdG4sIGFyZ3ZbMV0pOwotI2Vsc2UKLSAgICBzcHJpbnRmKGNvbW1hbmQsICJjcCAlcyAlcyIsIHRuLCBhcmd2WzFdKTsKLSNlbmRpZgotICAgIHN5c3RlbShjb21tYW5kKTsKLSAgICB1bmxpbmsodG4pOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9odGRpZ2VzdC5kc3AgYi9zdXBwb3J0L2h0ZGlnZXN0LmRzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAwZjg3ZS4uMDAwMDAwMAotLS0gYS9zdXBwb3J0L2h0ZGlnZXN0LmRzcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIFByb2plY3QgRmlsZSAtIE5hbWU9Imh0ZGlnZXN0IiAtIFBhY2thZ2UgT3duZXI9PDQ+Ci0jIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA1LjAwCi0jICoqIERPIE5PVCBFRElUICoqCi0KLSMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMwotCi1DRkc9aHRkaWdlc3QgLSBXaW4zMiBEZWJ1ZwotIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLAotIU1FU1NBR0UgdXNlIHRoZSBFeHBvcnQgTWFrZWZpbGUgY29tbWFuZCBhbmQgcnVuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIE5NQUtFIC9mICJodGRpZ2VzdC5tYWsiLgotIU1FU1NBR0UgCi0hTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQotIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgImh0ZGlnZXN0Lm1hayIgQ0ZHPSJodGRpZ2VzdCAtIFdpbjMyIERlYnVnIgotIU1FU1NBR0UgCi0hTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToKLSFNRVNTQUdFIAotIU1FU1NBR0UgImh0ZGlnZXN0IC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uXAotICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKLSFNRVNTQUdFICJodGRpZ2VzdCAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgCi0KLSMgQmVnaW4gUHJvamVjdAotIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgotIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKLUNQUD1jbC5leGUKLVJTQz1yYy5leGUKLQotIUlGICAiJChDRkcpIiA9PSAiaHRkaWdlc3QgLSBXaW4zMiBSZWxlYXNlIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiaHRkaWdlc3QiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJodGRpZ2VzdCIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICIiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9JICIuLlxpbmNsdWRlIiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfQ09OU09MRSIgL0QgIl9NQkNTIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2IC9vdXQ6InJlbGVhc2UvaHRkaWdlc3QuZXhlIgotIyBTVUJUUkFDVCBMSU5LMzIgL3BkYjpub25lCi0KLSFFTFNFSUYgICIkKENGRykiID09ICJodGRpZ2VzdCAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiaHRkaWdlczAiCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJodGRpZ2VzMCIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICIiCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiIgotIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKLSMgUFJPUCBUYXJnZXRfRGlyICIiCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aaSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1ppIC9PZCAvSSAiLi5caW5jbHVkZSIgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYwotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotQlNDMzI9YnNjbWFrZS5leGUKLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbwotIyBBREQgQlNDMzIgL25vbG9nbwotTElOSzMyPWxpbmsuZXhlCi0jIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0Ci0jIEFERCBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2RlYnVnIC9tYWNoaW5lOkkzODYgL291dDoiZGVidWcvaHRkaWdlc3QuZXhlIiAvcGRidHlwZTpzZXB0Ci0KLSFFTkRJRiAKLQotIyBCZWdpbiBUYXJnZXQKLQotIyBOYW1lICJodGRpZ2VzdCAtIFdpbjMyIFJlbGVhc2UiCi0jIE5hbWUgImh0ZGlnZXN0IC0gV2luMzIgRGVidWciCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlxhcFxhcF9jcHlzdHJuLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlxhcFxhcF9nZXRwYXNzLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlxhcFxhcF9tZDVjLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uXGh0ZGlnZXN0LmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEVuZCBUYXJnZXQKLSMgRW5kIFByb2plY3QKZGlmZiAtLWdpdCBhL3N1cHBvcnQvaHRwYXNzd2QuYyBiL3N1cHBvcnQvaHRwYXNzd2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk1NTIwZi4uMDAwMDAwMAotLS0gYS9zdXBwb3J0L2h0cGFzc3dkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTIgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBOT1RFISBUaGlzIHByb2dyYW0gaXMgbm90IHNhZmUgYXMgYSBzZXR1aWQgZXhlY3V0YWJsZSEgIERvIG5vdCBtYWtlIGl0Ci0gKiBzZXR1aWQhCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogaHRwYXNzd2QuYzogc2ltcGxlIHByb2dyYW0gZm9yIG1hbmlwdWxhdGluZyBwYXNzd29yZCBmaWxlIGZvcgotICogdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotICogCi0gKiBPcmlnaW5hbGx5IGJ5IFJvYiBNY0Nvb2wKLSAqCi0gKiBFeGl0IHZhbHVlczoKLSAqICAwOiBTdWNjZXNzCi0gKiAgMTogRmFpbHVyZTsgZmlsZSBhY2Nlc3MvcGVybWlzc2lvbiBwcm9ibGVtCi0gKiAgMjogRmFpbHVyZTsgY29tbWFuZCBsaW5lIHN5bnRheCBwcm9ibGVtICh1c2FnZSBtZXNzYWdlIGlzc3VlZCkKLSAqICAzOiBGYWlsdXJlOyBwYXNzd29yZCB2ZXJpZmljYXRpb24gZmFpbHVyZQotICogIDQ6IEZhaWx1cmU7IG9wZXJhdGlvbiBpbnRlcnJ1cHRlZCAoc3VjaCBhcyB3aXRoIENUUkwvQykKLSAqICA1OiBGYWlsdXJlOyBidWZmZXIgd291bGQgb3ZlcmZsb3cgKHVzZXJuYW1lLCBmaWxlbmFtZSwgb3IgY29tcHV0ZWQKLSAqICAgICByZWNvcmQgdG9vIGxvbmcpCi0gKiAgNjogRmFpbHVyZTsgdXNlcm5hbWUgY29udGFpbnMgaWxsZWdhbCBvciByZXNlcnZlZCBjaGFyYWN0ZXJzCi0gKi8KLQotI2luY2x1ZGUgImFwcl9saWIuaCIKLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgImFwLmgiCi0jaW5jbHVkZSAiYXBfbWQ1LmgiCi0jaW5jbHVkZSAiYXBfc2hhMS5oIgotCi0jaWZkZWYgV0lOMzIKLSNpbmNsdWRlIDxjb25pby5oPgotI2luY2x1ZGUgIi4uL29zL3dpbjMyL2dldG9wdC5oIgotI2RlZmluZSB1bmxpbmsgX3VubGluawotI2VuZGlmCi0KLSNpZm5kZWYgQ0hBUlNFVF9FQkNESUMKLSNkZWZpbmUgTEYgMTAKLSNkZWZpbmUgQ1IgMTMKLSNlbHNlIC8qQ0hBUlNFVF9FQkNESUMqLwotI2RlZmluZSBMRiAnXG4nCi0jZGVmaW5lIENSICdccicKLSNlbmRpZiAvKkNIQVJTRVRfRUJDRElDKi8KLQotI2RlZmluZSBNQVhfU1RSSU5HX0xFTiAyNTYKLSNkZWZpbmUgQUxHX1BMQUlOIDAKLSNkZWZpbmUgQUxHX0NSWVBUIDEKLSNkZWZpbmUgQUxHX0FQTUQ1IDIKLSNkZWZpbmUgQUxHX0FQU0hBIDMgCi0KLSNkZWZpbmUgRVJSX0ZJTEVQRVJNIDEKLSNkZWZpbmUgRVJSX1NZTlRBWCAyCi0jZGVmaW5lIEVSUl9QV01JU01BVENIIDMKLSNkZWZpbmUgRVJSX0lOVEVSUlVQVEVEIDQKLSNkZWZpbmUgRVJSX09WRVJGTE9XIDUKLSNkZWZpbmUgRVJSX0JBRFVTRVIgNgotCi0vKgotICogVGhpcyBuZWVkcyB0byBiZSBkZWNsYXJlZCBzdGF0aWNhbGx5IHNvIHRoZSBzaWduYWwgaGFuZGxlciBjYW4KLSAqIGFjY2VzcyBpdC4KLSAqLwotc3RhdGljIGNoYXIgKnRlbXBmaWxlbmFtZTsKLQotLyoKLSAqIEdldCBhIGxpbmUgb2YgaW5wdXQgZnJvbSB0aGUgdXNlciwgbm90IGluY2x1ZGluZyBhbnkgdGVybWluYXRpbmcKLSAqIG5ld2xpbmUuCi0gKi8KLXN0YXRpYyBpbnQgZ2V0bGluZShjaGFyICpzLCBpbnQgbiwgRklMRSAqZikKLXsKLSAgICByZWdpc3RlciBpbnQgaSA9IDA7Ci0KLSAgICB3aGlsZSAoMSkgewotCXNbaV0gPSAoY2hhcikgZmdldGMoZik7Ci0KLQlpZiAoc1tpXSA9PSBDUikgewotCSAgICBzW2ldID0gZmdldGMoZik7Ci0JfQotCi0JaWYgKChzW2ldID09IDB4NCkgfHwgKHNbaV0gPT0gTEYpIHx8IChpID09IChuIC0gMSkpKSB7Ci0JICAgIHNbaV0gPSAnXDAnOwotCSAgICByZXR1cm4gKGZlb2YoZikgPyAxIDogMCk7Ci0JfQotCSsraTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHB1dGxpbmUoRklMRSAqZiwgY2hhciAqbCkKLXsKLSAgICBpbnQgeDsKLQotICAgIGZvciAoeCA9IDA7IGxbeF07IHgrKykgewotCWZwdXRjKGxbeF0sIGYpOwotICAgIH0KLSAgICBmcHV0YygnXG4nLCBmKTsKLX0KLQotc3RhdGljIHZvaWQgdG82NChjaGFyICpzLCB1bnNpZ25lZCBsb25nIHYsIGludCBuKQotewotICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGl0b2E2NFtdID0gICAgICAgICAvKiAwIC4uLiA2MyA9PiBBU0NJSSAtIDY0ICovCi0JIi4vMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOwotCi0gICAgd2hpbGUgKC0tbiA+PSAwKSB7Ci0JKnMrKyA9IGl0b2E2NFt2JjB4M2ZdOwotCXYgPj49IDY7Ci0gICAgfQotfQotCi0vKgotICogTWFrZSBhIHBhc3N3b3JkIHJlY29yZCBmcm9tIHRoZSBnaXZlbiBpbmZvcm1hdGlvbi4gIEEgemVybyByZXR1cm4KLSAqIGluZGljYXRlcyBzdWNjZXNzOyBmYWlsdXJlIG1lYW5zIHRoYXQgdGhlIG91dHB1dCBidWZmZXIgY29udGFpbnMgYW4KLSAqIGVycm9yIG1lc3NhZ2UgaW5zdGVhZC4KLSAqLwotc3RhdGljIGludCBta3JlY29yZChjaGFyICp1c2VyLCBjaGFyICpyZWNvcmQsIHNpemVfdCBybGVuLCBjaGFyICpwYXNzd2QsCi0JCSAgICBpbnQgYWxnKQotewotICAgIGNoYXIgKnB3OwotICAgIGNoYXIgY3B3WzEyMF07Ci0gICAgY2hhciBwd2luW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyIHB3dltNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciBzYWx0WzldOwotICAgIHNpemVfdCBidWZzaXplOwotCi0gICAgaWYgKHBhc3N3ZCAhPSBOVUxMKSB7Ci0JcHcgPSBwYXNzd2Q7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBidWZzaXplID0gc2l6ZW9mKHB3aW4pOwotCWlmIChhcF9nZXRwYXNzKCJOZXcgcGFzc3dvcmQ6ICIsIHB3aW4sICZidWZzaXplKSAhPSAwKSB7Ci0JICAgIGFwX3NucHJpbnRmKHJlY29yZCwgKHJsZW4gLSAxKSwgInBhc3N3b3JkIHRvbyBsb25nICg+JWQpIiwKLQkJCXNpemVvZihwd2luKSAtIDEpOwotCSAgICByZXR1cm4gRVJSX09WRVJGTE9XOwotCX0KLSAgICAgICAgYnVmc2l6ZSA9IHNpemVvZihwd3YpOwotCWFwX2dldHBhc3MoIlJlLXR5cGUgbmV3IHBhc3N3b3JkOiAiLCBwd3YsICZidWZzaXplKTsKLQlpZiAoc3RyY21wKHB3aW4sIHB3dikgIT0gMCkgewotCSAgICBhcF9jcHlzdHJuKHJlY29yZCwgInBhc3N3b3JkIHZlcmlmaWNhdGlvbiBlcnJvciIsIChybGVuIC0gMSkpOwotCSAgICByZXR1cm4gRVJSX1BXTUlTTUFUQ0g7Ci0JfQotCXB3ID0gcHdpbjsKLSAgICAgICAgbWVtc2V0KHB3diwgJ1wwJywgc2l6ZW9mKHB3aW4pKTsKLSAgICB9Ci0gICAgc3dpdGNoIChhbGcpIHsKLQotICAgIGNhc2UgQUxHX0FQU0hBOgotCS8qIFhYWCBjcHcgPj0gMjggKyBzdHJsZW4oc2hhMSkgY2hhcnMgLSBmaXhlZCBsZW4gU0hBICovCi0gCWFwX3NoYTFfYmFzZTY0KHB3LHN0cmxlbihwdyksY3B3KTsKLQlicmVhazsKLQotICAgIGNhc2UgQUxHX0FQTUQ1OiAKLSAgICAgICAgKHZvaWQpIHNyYW5kKChpbnQpIHRpbWUoKHRpbWVfdCAqKSBOVUxMKSk7Ci0gICAgICAgIHRvNjQoJnNhbHRbMF0sIHJhbmQoKSwgOCk7Ci0gICAgICAgIHNhbHRbOF0gPSAnXDAnOwotCi0JYXBfTUQ1RW5jb2RlKChjb25zdCB1bnNpZ25lZCBjaGFyICopcHcsIChjb25zdCB1bnNpZ25lZCBjaGFyICopc2FsdCwKLQkJICAgICBjcHcsIHNpemVvZihjcHcpKTsKLQlicmVhazsKLQotICAgIGNhc2UgQUxHX1BMQUlOOgotCS8qIFhYWCB0aGlzIGxlbiBsaW1pdGF0aW9uIGlzIG5vdCBpbiBzeW5jIHdpdGggYW55IEhUVFBkIGxlbi4gKi8KLQlhcF9jcHlzdHJuKGNwdyxwdyxzaXplb2YoY3B3KSk7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIEFMR19DUllQVDoKLSAgICBkZWZhdWx0OgotICAgICAgICAodm9pZCkgc3JhbmQoKGludCkgdGltZSgodGltZV90ICopIE5VTEwpKTsKLSAgICAgICAgdG82NCgmc2FsdFswXSwgcmFuZCgpLCA4KTsKLSAgICAgICAgc2FsdFs4XSA9ICdcMCc7Ci0KLQlhcF9jcHlzdHJuKGNwdywgKGNoYXIgKiljcnlwdChwdywgc2FsdCksIHNpemVvZihjcHcpIC0gMSk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIG1lbXNldChwdywgJ1wwJywgc3RybGVuKHB3KSk7Ci0KLSAgICAvKgotICAgICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSB1c2VybmFtZSwKLSAgICAgKiBoYXNoLCBhbmQgZGVsaW1pdGVycy4KLSAgICAgKi8KLSAgICBpZiAoKHN0cmxlbih1c2VyKSArIDEgKyBzdHJsZW4oY3B3KSkgPiAocmxlbiAtIDEpKSB7Ci0JYXBfY3B5c3RybihyZWNvcmQsICJyZXN1bHRhbnQgcmVjb3JkIHRvbyBsb25nIiwgKHJsZW4gLSAxKSk7Ci0JcmV0dXJuIEVSUl9PVkVSRkxPVzsKLSAgICB9Ci0gICAgc3RyY3B5KHJlY29yZCwgdXNlcik7Ci0gICAgc3RyY2F0KHJlY29yZCwgIjoiKTsKLSAgICBzdHJjYXQocmVjb3JkLCBjcHcpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHVzYWdlKHZvaWQpCi17Ci0gICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTpcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiXHRodHBhc3N3ZCBbLWNtZHBzXSBwYXNzd29yZGZpbGUgdXNlcm5hbWVcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiXHRodHBhc3N3ZCAtYltjbWRwc10gcGFzc3dvcmRmaWxlIHVzZXJuYW1lIHBhc3N3b3JkXG5cbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiIC1jICBDcmVhdGUgYSBuZXcgZmlsZS5cbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiIC1tICBGb3JjZSBNRDUgZW5jcnlwdGlvbiBvZiB0aGUgcGFzc3dvcmQiCi0jaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChUUEYpCi0JIiAoZGVmYXVsdCkiCi0jZW5kaWYKLQkiLlxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgLWQgIEZvcmNlIENSWVBUIGVuY3J5cHRpb24gb2YgdGhlIHBhc3N3b3JkIgotI2lmICghKGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoVFBGKSkpCi0JICAgICIgKGRlZmF1bHQpIgotI2VuZGlmCi0JICAgICIuXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAtcCAgRG8gbm90IGVuY3J5cHQgdGhlIHBhc3N3b3JkIChwbGFpbnRleHQpLlxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgLXMgIEZvcmNlIFNIQSBlbmNyeXB0aW9uIG9mIHRoZSBwYXNzd29yZC5cbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiIC1iICBVc2UgdGhlIHBhc3N3b3JkIGZyb20gdGhlIGNvbW1hbmQgbGluZSByYXRoZXIgIgotCSAgICAidGhhbiBwcm9tcHRpbmcgZm9yIGl0LlxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsCi0JICAgICJPbiBXaW5kb3dzIGFuZCBUUEYgc3lzdGVtcyB0aGUgJy1tJyBmbGFnIGlzIHVzZWQgYnkgZGVmYXVsdC5cbiIpOwotICAgIGZwcmludGYoc3RkZXJyLAotCSAgICAiT24gYWxsIG90aGVyIHN5c3RlbXMsIHRoZSAnLXAnIGZsYWcgd2lsbCBwcm9iYWJseSBub3Qgd29yay5cbiIpOwotICAgIHJldHVybiBFUlJfU1lOVEFYOwotfQotCi1zdGF0aWMgdm9pZCBpbnRlcnJ1cHRlZCh2b2lkKQotewotICAgIGZwcmludGYoc3RkZXJyLCAiSW50ZXJydXB0ZWQuXG4iKTsKLSAgICBpZiAodGVtcGZpbGVuYW1lICE9IE5VTEwpIHsKLQl1bmxpbmsodGVtcGZpbGVuYW1lKTsKLSAgICB9Ci0gICAgZXhpdChFUlJfSU5URVJSVVBURUQpOwotfQotCi0vKgotICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBzcGVjaWZpZWQgZmlsZSBjYW4gYmUgb3BlbmVkIGZvciB0aGUgZ2l2ZW4KLSAqIGFjY2Vzcy4KLSAqLwotc3RhdGljIGludCBhY2Nlc3NpYmxlKGNoYXIgKmZuYW1lLCBjaGFyICptb2RlKQotewotICAgIEZJTEUgKnM7Ci0KLSAgICBzID0gZm9wZW4oZm5hbWUsIG1vZGUpOwotICAgIGlmIChzID09IE5VTEwpIHsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgZmNsb3NlKHMpOwotICAgIHJldHVybiAxOwotfQotCi0vKgotICogUmV0dXJuIHRydWUgaWYgYSBmaWxlIGlzIHJlYWRhYmxlLgotICovCi1zdGF0aWMgaW50IHJlYWRhYmxlKGNoYXIgKmZuYW1lKQotewotICAgIHJldHVybiBhY2Nlc3NpYmxlKGZuYW1lLCAiciIpOwotfQotCi0vKgotICogUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBmaWxlIGNhbiBiZSBvcGVuZWQgZm9yIHdyaXRlIGFjY2Vzcy4KLSAqLwotc3RhdGljIGludCB3cml0YWJsZShjaGFyICpmbmFtZSkKLXsKLSAgICByZXR1cm4gYWNjZXNzaWJsZShmbmFtZSwgImEiKTsKLX0KLQotLyoKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBuYW1lZCBmaWxlIGV4aXN0cywgcmVnYXJkbGVzcyBvZiBwZXJtaXNzaW9ucy4KLSAqLwotc3RhdGljIGludCBleGlzdHMoY2hhciAqZm5hbWUpCi17Ci0jaWZkZWYgV0lOMzIKLSAgICBzdHJ1Y3QgX3N0YXQgc2J1ZjsKLSNlbHNlCi0gICAgc3RydWN0IHN0YXQgc2J1ZjsKLSNlbmRpZgotICAgIGludCBjaGVjazsKLQotI2lmZGVmIFdJTjMyCi0gICAgY2hlY2sgPSBfc3RhdChmbmFtZSwgJnNidWYpOwotI2Vsc2UKLSAgICBjaGVjayA9IHN0YXQoZm5hbWUsICZzYnVmKTsKLSNlbmRpZgotICAgIHJldHVybiAoKGNoZWNrID09IC0xKSAmJiAoZXJybm8gPT0gRU5PRU5UKSkgPyAwIDogMTsKLX0KLQotLyoKLSAqIENvcHkgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiBvbmUgZmlsZSB0byB0aGUgY3VycmVudCBwb3NpdGlvbgotICogb2YgYW5vdGhlci4KLSAqLwotc3RhdGljIHZvaWQgY29weV9maWxlKEZJTEUgKnRhcmdldCwgRklMRSAqc291cmNlKQotewotICAgIHN0YXRpYyBjaGFyIGxpbmVbTUFYX1NUUklOR19MRU5dOwotCi0gICAgd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgc291cmNlKSAhPSBOVUxMKSB7Ci0JZnB1dHMobGluZSwgdGFyZ2V0KTsKLSAgICB9Ci19Ci0KLS8qCi0gKiBMZXQncyBkbyBpdC4gIFdlIGVuZCB1cCBkb2luZyBhIGxvdCBvZiBmaWxlIG9wZW5pbmcgYW5kIGNsb3NpbmcsCi0gKiBidXQgd2hhdCBkbyB3ZSBjYXJlPyAgVGhpcyBhcHBsaWNhdGlvbiBpc24ndCBydW4gY29uc3RhbnRseS4KLSAqLwotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICBGSUxFICpmdGVtcCA9IE5VTEw7Ci0gICAgRklMRSAqZnB3ID0gTlVMTDsKLSAgICBjaGFyIHVzZXJbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgcGFzc3dvcmRbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgcmVjb3JkW01BWF9TVFJJTkdfTEVOXTsKLSAgICBjaGFyIGxpbmVbTUFYX1NUUklOR19MRU5dOwotICAgIGNoYXIgcHdmaWxlbmFtZVtNQVhfU1RSSU5HX0xFTl07Ci0gICAgY2hhciAqYXJnOwotICAgIGludCBmb3VuZCA9IDA7Ci0gICAgaW50IGFsZyA9IEFMR19DUllQVDsKLSAgICBpbnQgbmV3ZmlsZSA9IDA7Ci0gICAgaW50IG5vbmludGVyYWN0aXZlID0gMDsKLSAgICBpbnQgaTsKLSAgICBpbnQgYXJnc19sZWZ0ID0gMjsKLQotICAgIHRlbXBmaWxlbmFtZSA9IE5VTEw7Ci0gICAgc2lnbmFsKFNJR0lOVCwgKHZvaWQgKCopKGludCkpIGludGVycnVwdGVkKTsKLQotICAgIC8qCi0gICAgICogUHJlbGltaW5hcnkgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZXkgcHJvdmlkZWQgYXQgbGVhc3QKLSAgICAgKiB0aHJlZSBhcmd1bWVudHMsIHdlJ2xsIGRvIGJldHRlciBhcmd1bWVudCBjaGVja2luZyBhcyAKLSAgICAgKiB3ZSBwYXJzZSB0aGUgY29tbWFuZCBsaW5lLgotICAgICAqLwotICAgIGlmIChhcmdjIDwgMykgewotCXJldHVybiB1c2FnZSgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogR28gdGhyb3VnaCB0aGUgYXJndW1lbnQgbGlzdCBhbmQgcGljayBvdXQgYW55IG9wdGlvbnMuICBUaGV5Ci0gICAgICogaGF2ZSB0byBwcmVjZWRlIGFueSBvdGhlciBhcmd1bWVudHMuCi0gICAgICovCi0gICAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgewotCWFyZyA9IGFyZ3ZbaV07Ci0JaWYgKCphcmcgIT0gJy0nKSB7Ci0JICAgIGJyZWFrOwotCX0KLQl3aGlsZSAoKisrYXJnICE9ICdcMCcpIHsKLQkgICAgaWYgKCphcmcgPT0gJ2MnKSB7Ci0JCW5ld2ZpbGUrKzsKLQkgICAgfQotCSAgICBlbHNlIGlmICgqYXJnID09ICdtJykgewotCQlhbGcgPSBBTEdfQVBNRDU7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoKmFyZyA9PSAncycpIHsKLQkJYWxnID0gQUxHX0FQU0hBOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKCphcmcgPT0gJ3AnKSB7Ci0JCWFsZyA9IEFMR19QTEFJTjsKLQkgICAgfQotCSAgICBlbHNlIGlmICgqYXJnID09ICdkJykgewotCQlhbGcgPSBBTEdfQ1JZUFQ7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoKmFyZyA9PSAnYicpIHsKLQkJbm9uaW50ZXJhY3RpdmUrKzsKLQkJYXJnc19sZWZ0Kys7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCXJldHVybiB1c2FnZSgpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAgIC8qCi0gICAgICogTWFrZSBzdXJlIHdlIHN0aWxsIGhhdmUgZXhhY3RseSB0aGUgcmlnaHQgbnVtYmVyIG9mIGFyZ3VtZW50cyBsZWZ0Ci0gICAgICogKHRoZSBmaWxlbmFtZSwgdGhlIHVzZXJuYW1lLCBhbmQgcG9zc2libHkgdGhlIHBhc3N3b3JkIGlmIC1iIHdhcwotICAgICAqIHNwZWNpZmllZCkuCi0gICAgICovCi0gICAgaWYgKChhcmdjIC0gaSkgIT0gYXJnc19sZWZ0KSB7Ci0JcmV0dXJuIHVzYWdlKCk7Ci0gICAgfQotICAgIGlmIChzdHJsZW4oYXJndltpXSkgPiAoc2l6ZW9mKHB3ZmlsZW5hbWUpIC0gMSkpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBmaWxlbmFtZSB0b28gbG9uZ1xuIiwgYXJndlswXSk7Ci0JcmV0dXJuIEVSUl9PVkVSRkxPVzsKLSAgICB9Ci0gICAgc3RyY3B5KHB3ZmlsZW5hbWUsIGFyZ3ZbaV0pOwotICAgIGlmIChzdHJsZW4oYXJndltpICsgMV0pID4gKHNpemVvZih1c2VyKSAtIDEpKSB7Ci0JZnByaW50ZihzdGRlcnIsICIlczogdXNlcm5hbWUgdG9vIGxvbmcgKD4lZClcbiIsIGFyZ3ZbMF0sCi0JCXNpemVvZih1c2VyKSAtIDEpOwotCXJldHVybiBFUlJfT1ZFUkZMT1c7Ci0gICAgfQotICAgIHN0cmNweSh1c2VyLCBhcmd2W2kgKyAxXSk7Ci0gICAgaWYgKChhcmcgPSBzdHJjaHIodXNlciwgJzonKSkgIT0gTlVMTCkgewotCWZwcmludGYoc3RkZXJyLCAiJXM6IHVzZXJuYW1lIGNvbnRhaW5zIGlsbGVnYWwgY2hhcmFjdGVyICclYydcbiIsCi0JCWFyZ3ZbMF0sICphcmcpOwotCXJldHVybiBFUlJfQkFEVVNFUjsKLSAgICB9Ci0gICAgaWYgKG5vbmludGVyYWN0aXZlKSB7Ci0JaWYgKHN0cmxlbihhcmd2W2kgKyAyXSkgPiAoc2l6ZW9mKHBhc3N3b3JkKSAtIDEpKSB7Ci0JICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHBhc3N3b3JkIHRvbyBsb25nICg+JWQpXG4iLCBhcmd2WzBdLAotCQkgICAgc2l6ZW9mKHBhc3N3b3JkKSAtIDEpOwotCSAgICByZXR1cm4gRVJSX09WRVJGTE9XOwotCX0KLQlzdHJjcHkocGFzc3dvcmQsIGFyZ3ZbaSArIDJdKTsKLSAgICB9Ci0KLSNpZmRlZiBXSU4zMgotICAgIGlmIChhbGcgPT0gQUxHX0NSWVBUKSB7Ci0JYWxnID0gQUxHX0FQTUQ1OwotCWZwcmludGYoc3RkZXJyLCAiQXV0b21hdGljYWxseSB1c2luZyBNRDUgZm9ybWF0IG9uIFdpbmRvd3MuXG4iKTsKLSAgICB9Ci0jZW5kaWYKLQotI2lmICghKGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoVFBGKSkpCi0gICAgaWYgKGFsZyA9PSBBTEdfUExBSU4pIHsKLQlmcHJpbnRmKHN0ZGVyciwiV2FybmluZzogc3RvcmluZyBwYXNzd29yZHMgYXMgcGxhaW4gdGV4dCBtaWdodCAiCi0JCSJqdXN0IG5vdCB3b3JrIG9uIHRoaXMgcGxhdGZvcm0uXG4iKTsKLSAgICB9Ci0jZW5kaWYKLSAgICAvKgotICAgICAqIFZlcmlmeSB0aGF0IHRoZSBmaWxlIGV4aXN0cyBpZiAtYyB3YXMgb21pdHRlZC4gIFdlIGdpdmUgYSBzcGVjaWFsCi0gICAgICogbWVzc2FnZSBpZiBpdCBkb2Vzbid0LgotICAgICAqLwotICAgIGlmICgoISBuZXdmaWxlKSAmJiAoISBleGlzdHMocHdmaWxlbmFtZSkpKSB7Ci0JZnByaW50ZihzdGRlcnIsICIlczogY2Fubm90IG1vZGlmeSBmaWxlICVzOyB1c2UgJy1jJyB0byBjcmVhdGUgaXRcbiIsCi0JCWFyZ3ZbMF0sIHB3ZmlsZW5hbWUpOwotCXBlcnJvcigiZm9wZW4iKTsKLQlleGl0KEVSUl9GSUxFUEVSTSk7Ci0gICAgfQotICAgIC8qCi0gICAgICogVmVyaWZ5IHRoYXQgd2UgY2FuIHJlYWQgdGhlIGV4aXN0aW5nIGZpbGUgaW4gdGhlIGNhc2Ugb2YgYW4gdXBkYXRlCi0gICAgICogdG8gaXQgKHJhdGhlciB0aGFuIGNyZWF0aW9uIG9mIGEgbmV3IG9uZSkuCi0gICAgICovCi0gICAgaWYgKCghIG5ld2ZpbGUpICYmICghIHJlYWRhYmxlKHB3ZmlsZW5hbWUpKSkgewotCWZwcmludGYoc3RkZXJyLCAiJXM6IGNhbm5vdCBvcGVuIGZpbGUgJXMgZm9yIHJlYWQgYWNjZXNzXG4iLAotCQlhcmd2WzBdLCBwd2ZpbGVuYW1lKTsKLQlwZXJyb3IoImZvcGVuIik7Ci0JZXhpdChFUlJfRklMRVBFUk0pOwotICAgIH0KLSAgICAvKgotICAgICAqIE5vdyBjaGVjayB0byBzZWUgaWYgd2UgY2FuIHByZXNlcnZlIGFuIGV4aXN0aW5nIGZpbGUgaW4gY2FzZQotICAgICAqIG9mIHBhc3N3b3JkIHZlcmlmaWNhdGlvbiBlcnJvcnMgb24gYSAtYyBvcGVyYXRpb24uCi0gICAgICovCi0gICAgaWYgKG5ld2ZpbGUgJiYgZXhpc3RzKHB3ZmlsZW5hbWUpICYmICghIHJlYWRhYmxlKHB3ZmlsZW5hbWUpKSkgewotCWZwcmludGYoc3RkZXJyLCAiJXM6IGNhbm5vdCBvcGVuIGZpbGUgJXMgZm9yIHJlYWQgYWNjZXNzXG4iCi0JCSIlczogZXhpc3RpbmcgYXV0aCBkYXRhIHdvdWxkIGJlIGxvc3Qgb24gcGFzc3dvcmQgbWlzbWF0Y2giLAotCQlhcmd2WzBdLCBwd2ZpbGVuYW1lLCBhcmd2WzBdKTsKLQlwZXJyb3IoImZvcGVuIik7Ci0JZXhpdChFUlJfRklMRVBFUk0pOwotICAgIH0KLSAgICAvKgotICAgICAqIE5vdyB2ZXJpZnkgdGhhdCB0aGUgZmlsZSBpcyB3cml0YWJsZSEKLSAgICAgKi8KLSAgICBpZiAoISB3cml0YWJsZShwd2ZpbGVuYW1lKSkgewotCWZwcmludGYoc3RkZXJyLCAiJXM6IGNhbm5vdCBvcGVuIGZpbGUgJXMgZm9yIHdyaXRlIGFjY2Vzc1xuIiwKLQkJYXJndlswXSwgcHdmaWxlbmFtZSk7Ci0JcGVycm9yKCJmb3BlbiIpOwotCWV4aXQoRVJSX0ZJTEVQRVJNKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEFsbCB0aGUgZmlsZSBhY2Nlc3MgY2hlY2tzIGhhdmUgYmVlbiBtYWRlLiAgVGltZSB0byBnbyB0byB3b3JrOwotICAgICAqIHRyeSB0byBjcmVhdGUgdGhlIHJlY29yZCBmb3IgdGhlIHVzZXJuYW1lIGluIHF1ZXN0aW9uLiAgSWYgdGhhdAotICAgICAqIGZhaWxzLCB0aGVyZSdzIG5vIG5lZWQgdG8gd2FzdGUgYW55IHRpbWUgb24gZmlsZSBtYW5pcHVsYXRpb25zLgotICAgICAqIEFueSBlcnJvciBtZXNzYWdlIHRleHQgaXMgcmV0dXJuZWQgaW4gdGhlIHJlY29yZCBidWZmZXIsIHNpbmNlCi0gICAgICogdGhlIG1rcmVjb3JkKCkgcm91dGluZSBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIGFyZ3ZbXS4KLSAgICAgKi8KLSAgICBpID0gbWtyZWNvcmQodXNlciwgcmVjb3JkLCBzaXplb2YocmVjb3JkKSAtIDEsCi0JCSBub25pbnRlcmFjdGl2ZSA/IHBhc3N3b3JkIDogTlVMTCwKLQkJIGFsZyk7Ci0gICAgaWYgKGkgIT0gMCkgewotCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzXG4iLCBhcmd2WzBdLCByZWNvcmQpOwotCWV4aXQoaSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBXZSBjYW4gYWNjZXNzIHRoZSBmaWxlcyB0aGUgcmlnaHQgd2F5LCBhbmQgd2UgaGF2ZSBhIHJlY29yZAotICAgICAqIHRvIGFkZCBvciB1cGRhdGUuICBMZXQncyBkbyBpdC4uCi0gICAgICovCi0gICAgdGVtcGZpbGVuYW1lID0gdG1wbmFtKE5VTEwpOwotICAgIGZ0ZW1wID0gZm9wZW4odGVtcGZpbGVuYW1lLCAidysiKTsKLSAgICBpZiAoZnRlbXAgPT0gTlVMTCkgewotCWZwcmludGYoc3RkZXJyLCAiJXM6IHVuYWJsZSB0byBjcmVhdGUgdGVtcG9yYXJ5IGZpbGVcbiIsIGFyZ3ZbMF0pOwotCXBlcnJvcigiZm9wZW4iKTsKLQlleGl0KEVSUl9GSUxFUEVSTSk7Ci0gICAgfQotICAgIC8qCi0gICAgICogSWYgd2UncmUgbm90IGNyZWF0aW5nIGEgbmV3IGZpbGUsIGNvcHkgcmVjb3JkcyBmcm9tIHRoZSBleGlzdGluZwotICAgICAqIG9uZSB0byB0aGUgdGVtcG9yYXJ5IGZpbGUgdW50aWwgd2UgZmluZCB0aGUgc3BlY2lmaWVkIHVzZXIuCi0gICAgICovCi0gICAgaWYgKCEgbmV3ZmlsZSkgewotCWNoYXIgc2NyYXRjaFtNQVhfU1RSSU5HX0xFTl07Ci0KLQlmcHcgPSBmb3Blbihwd2ZpbGVuYW1lLCAiciIpOwotCXdoaWxlICghIChnZXRsaW5lKGxpbmUsIHNpemVvZihsaW5lKSwgZnB3KSkpIHsKLQkgICAgY2hhciAqY29sb247Ci0KLQkgICAgaWYgKChsaW5lWzBdID09ICcjJykgfHwgKGxpbmVbMF0gPT0gJ1wwJykpIHsKLQkJcHV0bGluZShmdGVtcCwgbGluZSk7Ci0JCWNvbnRpbnVlOwotCSAgICB9Ci0JICAgIHN0cmNweShzY3JhdGNoLCBsaW5lKTsKLQkgICAgLyoKLQkgICAgICogU2VlIGlmIHRoaXMgaXMgb3VyIHVzZXIuCi0JICAgICAqLwotCSAgICBjb2xvbiA9IHN0cmNocihzY3JhdGNoLCAnOicpOwotCSAgICBpZiAoY29sb24gIT0gTlVMTCkgewotCQkqY29sb24gPSAnXDAnOwotCSAgICB9Ci0JICAgIGlmIChzdHJjbXAodXNlciwgc2NyYXRjaCkgIT0gMCkgewotCQlwdXRsaW5lKGZ0ZW1wLCBsaW5lKTsKLQkJY29udGludWU7Ci0JICAgIH0KLQkgICAgZm91bmQrKzsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSAgICBpZiAoZm91bmQpIHsKLQlmcHJpbnRmKHN0ZGVyciwgIlVwZGF0aW5nICIpOwotICAgIH0KLSAgICBlbHNlIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkFkZGluZyAiKTsKLSAgICB9Ci0gICAgZnByaW50ZihzdGRlcnIsICJwYXNzd29yZCBmb3IgdXNlciAlc1xuIiwgdXNlcik7Ci0gICAgLyoKLSAgICAgKiBOb3cgYWRkIHRoZSB1c2VyIHJlY29yZCB3ZSBjcmVhdGVkLgotICAgICAqLwotICAgIHB1dGxpbmUoZnRlbXAsIHJlY29yZCk7Ci0gICAgLyoKLSAgICAgKiBJZiB3ZSdyZSB1cGRhdGluZyBhbiBleGlzdGluZyBmaWxlLCB0aGVyZSBtYXkgYmUgYWRkaXRpb25hbAotICAgICAqIHJlY29yZHMgYmV5b25kIHRoZSBvbmUgd2UncmUgdXBkYXRpbmcsIHNvIGNvcHkgdGhlbS4KLSAgICAgKi8KLSAgICBpZiAoISBuZXdmaWxlKSB7Ci0JY29weV9maWxlKGZ0ZW1wLCBmcHcpOwotCWZjbG9zZShmcHcpOwotICAgIH0KLSAgICAvKgotICAgICAqIFRoZSB0ZW1wb3JhcnkgZmlsZSBub3cgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHRoYXQgc2hvdWxkIGJlCi0gICAgICogaW4gdGhlIGFjdHVhbCBwYXNzd29yZCBmaWxlLiAgQ2xvc2UgdGhlIG9wZW4gZmlsZXMsIHJlLW9wZW4gdGhlbQotICAgICAqIGluIHRoZSBhcHByb3ByaWF0ZSBtb2RlLCBhbmQgY29weSB0aGVtIGZpbGUgdG8gdGhlIHJlYWwgb25lLgotICAgICAqLwotICAgIGZjbG9zZShmdGVtcCk7Ci0gICAgZnB3ID0gZm9wZW4ocHdmaWxlbmFtZSwgIncrIik7Ci0gICAgZnRlbXAgPSBmb3Blbih0ZW1wZmlsZW5hbWUsICJyIik7Ci0gICAgY29weV9maWxlKGZwdywgZnRlbXApOwotICAgIGZjbG9zZShmcHcpOwotICAgIGZjbG9zZShmdGVtcCk7Ci0gICAgdW5saW5rKHRlbXBmaWxlbmFtZSk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zdXBwb3J0L2h0cGFzc3dkLmRzcCBiL3N1cHBvcnQvaHRwYXNzd2QuZHNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTQ5ZDdmLi4wMDAwMDAwCi0tLSBhL3N1cHBvcnQvaHRwYXNzd2QuZHNwCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iaHRwYXNzd2QiIC0gUGFja2FnZSBPd25lcj08ND4KLSMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDUuMDAKLSMgKiogRE8gTk9UIEVESVQgKioKLQotIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzCi0KLUNGRz1odHBhc3N3ZCAtIFdpbjMyIERlYnVnCi0hTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCi0hTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KLSFNRVNTQUdFIAotIU1FU1NBR0UgTk1BS0UgL2YgImh0cGFzc3dkLm1hayIuCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCi0hTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSBOTUFLRSAvZiAiaHRwYXNzd2QubWFrIiBDRkc9Imh0cGFzc3dkIC0gV2luMzIgRGVidWciCi0hTUVTU0FHRSAKLSFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgotIU1FU1NBR0UgCi0hTUVTU0FHRSAiaHRwYXNzd2QgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb25cCi0gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQotIU1FU1NBR0UgImh0cGFzc3dkIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCi0hTUVTU0FHRSAKLQotIyBCZWdpbiBQcm9qZWN0Ci0jIFBST1AgU2NjX1Byb2pOYW1lICIiCi0jIFBST1AgU2NjX0xvY2FsUGF0aCAiIgotQ1BQPWNsLmV4ZQotUlNDPXJjLmV4ZQotCi0hSUYgICIkKENGRykiID09ICJodHBhc3N3ZCAtIFdpbjMyIFJlbGVhc2UiCi0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMAotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKLSMgUFJPUCBPdXRwdXRfRGlyICJSZWxlYXNlIgotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCi0jIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMAotIyBQUk9QIFRhcmdldF9EaXIgIiIKLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYwotIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0kgIi4uXGluY2x1ZGUiIC9EICJOREVCVUciIC9EICJXSU4zMiIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9EICJXSU4zMl9MRUFOX0FORF9NRUFOIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9tYWNoaW5lOkkzODYKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgd3MyXzMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2Ci0KLSFFTFNFSUYgICIkKENGRykiID09ICJodHBhc3N3ZCAtIFdpbjMyIERlYnVnIgotCi0jIFBST1AgQkFTRSBVc2VfTUZDIDAKLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKLSMgUFJPUCBVc2VfTUZDIDAKLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKLSMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKLSMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCi0jIFBST1AgVGFyZ2V0X0RpciAiIgotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWmkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MKLSMgQUREIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aaSAvT2QgL0kgIi4uXGluY2x1ZGUiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9EICJXSU4zMl9MRUFOX0FORF9NRUFOIiAvWVggL0ZEIC9jCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgotIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCi1CU0MzMj1ic2NtYWtlLmV4ZQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCi0jIEFERCBCU0MzMiAvbm9sb2dvCi1MSU5LMzI9bGluay5leGUKLSMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKLSMgQUREIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgd3MyXzMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0Ci0jIFNVQlRSQUNUIExJTkszMiAvcGRiOm5vbmUKLQotIUVORElGIAotCi0jIEJlZ2luIFRhcmdldAotCi0jIE5hbWUgImh0cGFzc3dkIC0gV2luMzIgUmVsZWFzZSIKLSMgTmFtZSAiaHRwYXNzd2QgLSBXaW4zMiBEZWJ1ZyIKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXGFwXGFwX2NweXN0cm4uYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXGFwXGFwX2dldHBhc3MuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXGFwXGFwX21kNWMuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXGFwXGFwX3NucHJpbnRmLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlxhcFxhcF9zaGExLmMKLSMgRW5kIFNvdXJjZSBGaWxlCi0jIEJlZ2luIFNvdXJjZSBGaWxlCi0KLVNPVVJDRT0uLlxhcFxhcF9jaGVja3Bhc3MuYwotIyBFbmQgU291cmNlIEZpbGUKLSMgQmVnaW4gU291cmNlIEZpbGUKLQotU09VUkNFPS4uXGFwXGFwX2Jhc2U2NC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBCZWdpbiBTb3VyY2UgRmlsZQotCi1TT1VSQ0U9LlxodHBhc3N3ZC5jCi0jIEVuZCBTb3VyY2UgRmlsZQotIyBFbmQgVGFyZ2V0Ci0jIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9zdXBwb3J0L2h0dHBkLmV4cCBiL3N1cHBvcnQvaHR0cGQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjk3NmMyLi4wMDAwMDAwCi0tLSBhL3N1cHBvcnQvaHR0cGQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNDExICswLDAgQEAKLSMhIC4KLWFwX01ENUVuY29kZQotYXBfTUQ1RmluYWwKLWFwX01ENUluaXQKLWFwX01ENVVwZGF0ZQotYXBfU0hBMUZpbmFsCi1hcF9TSEExSW5pdAotYXBfU0hBMVVwZGF0ZV9iaW5hcnkKLWFwX1NIQTFVcGRhdGUKLWFwX2FjcXVpcmVfbXV0ZXgKLWFwX2FkZF9jZ2lfdmFycwotYXBfYWRkX2NvbW1vbl92YXJzCi1hcF9hZGRfbW9kdWxlCi1hcF9hZGRfbmFtZWRfbW9kdWxlCi1hcF9hZGRfcGVyX2Rpcl9jb25mCi1hcF9hZGRfcGVyX3VybF9jb25mCi1hcF9hZGRfdmVyc2lvbl9jb21wb25lbnQKLWFwX2FsbG93X29wdGlvbnMKLWFwX2FsbG93X292ZXJyaWRlcwotYXBfYXBwZW5kX2FycmF5cwotYXBfYXJyYXlfY2F0Ci1hcF9hcnJheV9wc3RyY2F0Ci1hcF9hdXRoX25hbWUKLWFwX2F1dGhfdHlwZQotYXBfYmFzZTY0ZW5jb2RlCi1hcF9iYXNlNjRlbmNvZGVfYmluYXJ5Ci1hcF9iYXNlNjRlbmNvZGVfbGVuCi1hcF9iYXNlNjRkZWNvZGUKLWFwX2Jhc2U2NGRlY29kZV9iaW5hcnkKLWFwX2Jhc2U2NGRlY29kZV9sZW4KLWFwX2Jhc2ljX2h0dHBfaGVhZGVyCi1hcF9iY2xvc2UKLWFwX2JjcmVhdGUKLWFwX2JmaWxidWYKLWFwX2JmaWxlbm8KLWFwX2JmbHNidWYKLWFwX2JmbHVzaAotYXBfYmdldG9wdAotYXBfYmdldHMKLWFwX2JoYWxmZHVwbGV4Ci1hcF9iaW5kX2FkZHJlc3MKLWFwX2Jsb2NrX2FsYXJtcwotYXBfYmxvb2tjCi1hcF9ibm9uYmxvY2sKLWFwX2JvbmVycm9yCi1hcF9icHJpbnRmCi1hcF9icHVzaGZkCi1hcF9icHV0cwotYXBfYnJlYWQKLWFwX2JzZXRmbGFnCi1hcF9ic2V0b3B0Ci1hcF9ic2tpcGxmCi1hcF9ic3Bhd25fY2hpbGQKLWFwX2J2cHV0cwotYXBfYndyaXRlCi1hcF9ieXRlc19pbl9mcmVlX2Jsb2NrcwotYXBfYnl0ZXNfaW5fcG9vbAotYXBfY2FsbF9leGVjCi1hcF9jYW5fZXhlYwotYXBfY2ZnX2Nsb3NlZmlsZQotYXBfY2ZnX2dldGMKLWFwX2NmZ19nZXRsaW5lCi1hcF9jaGRpcl9maWxlCi1hcF9jaGVja19hY2Nlc3MKLWFwX2NoZWNrX2F1dGgKLWFwX2NoZWNrX2NtZF9jb250ZXh0Ci1hcF9jaGVja191c2VyX2lkCi1hcF9jaGVja21hc2sKLWFwX2NoaWxkX2V4aXRfbW9kdWxlcwotYXBfY2hpbGRfaW5pdF9tb2R1bGVzCi1hcF9jaGlsZF90ZXJtaW5hdGUKLWFwX2NsZWFudXBfZm9yX2V4ZWMKLWFwX2NsZWFyX21vZHVsZV9saXN0Ci1hcF9jbGVhcl9wb29sCi1hcF9jbGVhcl90YWJsZQotYXBfY2xvc2VfcGlwZWRfbG9nCi1hcF9jb25zdHJ1Y3Rfc2VydmVyCi1hcF9jb25zdHJ1Y3RfdXJsCi1hcF9jb250ZW50X3R5cGVfdG9sb3dlcgotYXBfY29weV9hcnJheQotYXBfY29weV9hcnJheV9oZHIKLWFwX2NvcHlfdGFibGUKLWFwX2NvcmVfcmVvcmRlcl9kaXJlY3RvcmllcwotYXBfY29yZWR1bXBfZGlyCi1hcF9jb3VudF9kaXJzCi1hcF9jcHlzdHJuCi1hcF9jcmVhdGVfZW52aXJvbm1lbnQKLWFwX2NyZWF0ZV9tdXRleAotYXBfY3JlYXRlX3Blcl9kaXJfY29uZmlnCi1hcF9jcmVhdGVfcmVxdWVzdF9jb25maWcKLWFwX2RhZW1vbnNfbGltaXQKLWFwX2RhZW1vbnNfbWF4X2ZyZWUKLWFwX2RhZW1vbnNfbWluX2ZyZWUKLWFwX2RhZW1vbnNfdG9fc3RhcnQKLWFwX2RheV9zbmFtZXMKLWFwX2RlZmF1bHRfcG9ydF9mb3JfcmVxdWVzdAotYXBfZGVmYXVsdF9wb3J0X2Zvcl9zY2hlbWUKLWFwX2RlZmF1bHRfdHlwZQotYXBfZGVzdHJveV9wb29sCi1hcF9kZXN0cm95X3N1Yl9yZXEKLWFwX2RpZQotYXBfZGlzY2FyZF9yZXF1ZXN0X2JvZHkKLWFwX2RvY3VtZW50X3Jvb3QKLWFwX2VhY2hfYnl0ZXJhbmdlCi1hcF9lcnJvcl9sb2cyc3RkZXJyCi1hcF9lc2NhcGVfaHRtbAotYXBfZXNjYXBlX3BhdGhfc2VnbWVudAotYXBfZXNjYXBlX3F1b3RlcwotYXBfZXNjYXBlX3NoZWxsX2NtZAotYXBfZXhjZXNzX3JlcXVlc3RzX3Blcl9jaGlsZAotYXBfZXhpc3RzX2NvbmZpZ19kZWZpbmUKLWFwX2V4aXN0c19zY29yZWJvYXJkX2ltYWdlCi1hcF9leHRlbmRlZF9zdGF0dXMKLWFwX2ZpZWxkX25vcGFyYW0KLWFwX2ZpbmFsaXplX3JlcXVlc3RfcHJvdG9jb2wKLWFwX2ZpbmFsaXplX3N1Yl9yZXFfcHJvdG9jb2wKLWFwX2ZpbmRfY29tbWFuZAotYXBfZmluZF9jb21tYW5kX2luX21vZHVsZXMKLWFwX2ZpbmRfbGFzdF90b2tlbgotYXBfZmluZF9saW5rZWRfbW9kdWxlCi1hcF9maW5kX2xpc3RfaXRlbQotYXBfZmluZF9tb2R1bGVfbmFtZQotYXBfZmluZF9wYXRoX2luZm8KLWFwX2ZpbmRfdG9rZW4KLWFwX2ZpbmRfdHlwZXMKLWFwX2Zpbmlfdmhvc3RfY29uZmlnCi1hcF9mbm1hdGNoCi1hcF9mb3JjZV9saWJyYXJ5X2xvYWRpbmcKLWFwX2dldF9iYXNpY19hdXRoX3B3Ci1hcF9nZXRfY2xpZW50X2Jsb2NrCi1hcF9nZXRfZ210b2ZmCi1hcF9nZXRfbGlzdF9pdGVtCi1hcF9nZXRfbG9jYWxfaG9zdAotYXBfZ2V0X3JlbW90ZV9ob3N0Ci1hcF9nZXRfcmVtb3RlX2xvZ25hbWUKLWFwX2dldF9zZXJ2ZXJfYnVpbHQKLWFwX2dldF9zZXJ2ZXJfbmFtZQotYXBfZ2V0X3NlcnZlcl9wb3J0Ci1hcF9nZXRfc2VydmVyX3ZlcnNpb24KLWFwX2dldF90aW1lCi1hcF9nZXRfdG9rZW4KLWFwX2dldF92aXJ0aG9zdF9hZGRyCi1hcF9nZXRwYXJlbnRzCi1hcF9nZXR3b3JkCi1hcF9nZXR3b3JkX2NvbmYKLWFwX2dldHdvcmRfY29uZl9uYwotYXBfZ2V0d29yZF9uYwotYXBfZ2V0d29yZF9udWxscwotYXBfZ2V0d29yZF9udWxsc19uYwotYXBfZ2V0d29yZF93aGl0ZQotYXBfZ2V0d29yZF93aGl0ZV9uYwotYXBfZ21fdGltZXN0cl84MjIKLWFwX2duYW1lMmlkCi1hcF9ncm91cF9pZAotYXBfaGFuZGxlX2NvbW1hbmQKLWFwX2hlYWRlcl9wYXJzZQotYXBfaHRfdGltZQotYXBfaW5kCi1hcF9pbmRleF9vZl9yZXNwb25zZQotYXBfaW5pdF9hbGxvYwotYXBfaW5pdF9tb2R1bGVzCi1hcF9pbml0X3Zob3N0X2NvbmZpZwotYXBfaW5pdF92aXJ0dWFsX2hvc3QKLWFwX2ludGVybmFsX3JlZGlyZWN0Ci1hcF9pbnRlcm5hbF9yZWRpcmVjdF9oYW5kbGVyCi1hcF9pbnZva2VfaGFuZGxlcgotYXBfaXNfZGlyZWN0b3J5Ci1hcF9pc19mbm1hdGNoCi1hcF9pc19pbml0aWFsX3JlcQotYXBfaXNfbWF0Y2hleHAKLWFwX2lzX3VybAotYXBfa2VlcGFsaXZlX3RpbWVvdXQKLWFwX2tpbGxfY2xlYW51cAotYXBfa2lsbF9jbGVhbnVwc19mb3JfZmQKLWFwX2tpbGxfY2xlYW51cHNfZm9yX3NvY2tldAotYXBfbGltaXRfc2VjdGlvbgotYXBfbGlzdGVuYmFja2xvZwotYXBfbGlzdGVuZXJzCi1hcF9sb2NrX2ZuYW1lCi1hcF9sb2dfYXNzZXJ0Ci1hcF9sb2dfZXJyb3IKLWFwX2xvZ19lcnJvcl9vbGQKLWFwX2xvZ19waWQKLWFwX2xvZ19wcmludGYKLWFwX2xvZ19yZWFzb24KLWFwX2xvZ19yZXJyb3IKLWFwX2xvZ190cmFuc2FjdGlvbgotYXBfbG9nX3VuaXhlcnIKLWFwX21ha2VfYXJyYXkKLWFwX21ha2VfZGlyc3RyCi1hcF9tYWtlX2RpcnN0cl9wYXJlbnQKLWFwX21ha2VfZGlyc3RyX3ByZWZpeAotYXBfbWFrZV9ldGFnCi1hcF9tYWtlX2Z1bGxfcGF0aAotYXBfbWFrZV9zdWJfcG9vbAotYXBfbWFrZV90YWJsZQotYXBfbWF0Y2hlc19yZXF1ZXN0X3Zob3N0Ci1hcF9tYXhfcmVxdWVzdHNfcGVyX2NoaWxkCi1hcF9tZDUKLWFwX21kNWNvbnRleHRUbzY0Ci1hcF9tZDVkaWdlc3QKLWFwX21lZXRzX2NvbmRpdGlvbnMKLWFwX21lcmdlX3Blcl9kaXJfY29uZmlncwotYXBfbWV0aG9kX251bWJlcl9vZgotYXBfbW9udGhfc25hbWVzCi1hcF9teV9nZW5lcmF0aW9uCi1hcF9ubzJzbGFzaAotYXBfbm90ZV9hdXRoX2ZhaWx1cmUKLWFwX25vdGVfYmFzaWNfYXV0aF9mYWlsdXJlCi1hcF9ub3RlX2NsZWFudXBzX2Zvcl9mZAotYXBfbm90ZV9jbGVhbnVwc19mb3JfZmlsZQotYXBfbm90ZV9jbGVhbnVwc19mb3Jfc29ja2V0Ci1hcF9ub3RlX2RpZ2VzdF9hdXRoX2ZhaWx1cmUKLWFwX25vdGVfc3VicHJvY2VzcwotYXBfbnVsbF9jbGVhbnVwCi1hcF9vcGVuX2xvZ3MKLWFwX29wZW5fcGlwZWRfbG9nCi1hcF9vc19lc2NhcGVfcGF0aAotYXBfb3NfaXNfcGF0aF9hYnNvbHV0ZQotYXBfb3ZlcmxheV90YWJsZXMKLWFwX292ZXJsYXBfdGFibGVzCi1hcF9wYWxsb2MKLWFwX3BhcnNlSFRUUGRhdGUKLWFwX3BhcnNlX2hvc3RpbmZvX2NvbXBvbmVudHMKLWFwX3BhcnNlX2h0YWNjZXNzCi1hcF9wYXJzZV91cmkKLWFwX3BhcnNlX3VyaV9jb21wb25lbnRzCi1hcF9wYXJzZV92aG9zdF9hZGRycwotYXBfcGJhc2U2NGRlY29kZQotYXBfcGJhc2U2NGVuY29kZQotYXBfcGNhbGxvYwotYXBfcGNmZ19vcGVuX2N1c3RvbQotYXBfcGNmZ19vcGVuZmlsZQotYXBfcGNsb3NlZGlyCi1hcF9wY2xvc2VmCi1hcF9wY2xvc2Vzb2NrZXQKLWFwX3BkdXBob3N0ZW50Ci1hcF9wZmNsb3NlCi1hcF9wZmRvcGVuCi1hcF9wZm9wZW4KLWFwX3BnZXRob3N0YnluYW1lCi1hcF9waWRfZm5hbWUKLWFwX3BvcGVuZGlyCi1hcF9wb3BlbmYKLWFwX3ByZWdjb21wCi1hcF9wcmVnZnJlZQotYXBfcHJlZ3N1YgotYXBfcHJlbGlua2VkX21vZHVsZXMKLWFwX3ByZWxvYWRlZF9tb2R1bGVzCi1hcF9wcm9jZXNzX3JlcXVlc3QKLWFwX3Byb2Nlc3NfcmVzb3VyY2VfY29uZmlnCi1hcF9wc2lnbmF0dXJlCi1hcF9wc29ja2V0Ci1hcF9wc3ByaW50ZgotYXBfcHN0cmNhdAotYXBfcHN0cmR1cAotYXBfcHN0cm5kdXAKLWFwX3B1c2hfYXJyYXkKLWFwX3B2c3ByaW50ZgotYXBfcmF0aW9uYWxpemVfbXRpbWUKLWFwX3JlYWRfY29uZmlnCi1hcF9yZWFkX3JlcXVlc3QKLWFwX3JlZ2Vycm9yCi1hcF9yZWdleGVjCi1hcF9yZWdpc3Rlcl9jbGVhbnVwCi1hcF9yZWdpc3Rlcl9vdGhlcl9jaGlsZAotYXBfcmVsZWFzZV9tdXRleAotYXBfcmVtb3ZlX21vZHVsZQotYXBfcmVxdWlyZXMKLWFwX3Jlc3BvbnNlX2NvZGVfc3RyaW5nCi1hcF9yZXN0YXJ0X3RpbWUKLWFwX3JmYzE0MTMKLWFwX3JmYzE0MTNfdGltZW91dAotYXBfcmZsdXNoCi1hcF9yaW5kCi1hcF9ycHJpbnRmCi1hcF9ycHV0YwotYXBfcnB1dHMKLWFwX3J1bl9jbGVhbnVwCi1hcF9ydW5fZml4dXBzCi1hcF9ydW5fcG9zdF9yZWFkX3JlcXVlc3QKLWFwX3J1bl9zdWJfcmVxCi1hcF9ydnB1dHMKLWFwX3J3cml0ZQotYXBfc2F0aXNmaWVzCi1hcF9zY2FuX3NjcmlwdF9oZWFkZXJfZXJyCi1hcF9zY2FuX3NjcmlwdF9oZWFkZXJfZXJyX2J1ZmYKLWFwX3Njb3JlYm9hcmRfZm5hbWUKLWFwX3Njb3JlYm9hcmRfaW1hZ2UKLWFwX3NlbmRfZXJyb3JfcmVzcG9uc2UKLWFwX3NlbmRfZmIKLWFwX3NlbmRfZmJfbGVuZ3RoCi1hcF9zZW5kX2ZkCi1hcF9zZW5kX2ZkX2xlbmd0aAotYXBfc2VuZF9oZWFkZXJfZmllbGQKLWFwX3NlbmRfaHR0cF9oZWFkZXIKLWFwX3NlbmRfaHR0cF9vcHRpb25zCi1hcF9zZW5kX2h0dHBfdHJhY2UKLWFwX3NlbmRfbW1hcAotYXBfc2VuZF9zaXplCi1hcF9zZXJ2ZXJfYXJndjAKLWFwX3NlcnZlcl9jb25maWdfZGVmaW5lcwotYXBfc2VydmVyX2NvbmZuYW1lCi1hcF9zZXJ2ZXJfcG9zdF9yZWFkX2NvbmZpZwotYXBfc2VydmVyX3ByZV9yZWFkX2NvbmZpZwotYXBfc2VydmVyX3Jvb3QKLWFwX3NlcnZlcl9yb290X3JlbGF0aXZlCi1hcF9zZXRfYnl0ZXJhbmdlCi1hcF9zZXRfY2FsbGJhY2tfYW5kX2FsYXJtCi1hcF9zZXRfY29udGVudF9sZW5ndGgKLWFwX3NldF9ldGFnCi1hcF9zZXRfZmlsZV9zbG90Ci1hcF9zZXRfZmxhZ19zbG90Ci1hcF9zZXRfa2VlcGFsaXZlCi1hcF9zZXRfbGFzdF9tb2RpZmllZAotYXBfc2V0X25hbWVfdmlydHVhbF9ob3N0Ci1hcF9zZXRfc3RyaW5nX3Nsb3QKLWFwX3NldF9zdHJpbmdfc2xvdF9sb3dlcgotYXBfc2V0X3N1Yl9yZXFfcHJvdG9jb2wKLWFwX3NldHVwX2NsaWVudF9ibG9jawotYXBfc2V0dXBfcHJlbGlua2VkX21vZHVsZXMKLWFwX3NoYTFfYmFzZTY0Ci1hcF9zaG91bGRfY2xpZW50X2Jsb2NrCi1hcF9zaG93X2RpcmVjdGl2ZXMKLWFwX3Nob3dfbW9kdWxlcwotYXBfc2lnbmFsCi1hcF9zaW5nbGVfbW9kdWxlX2NvbmZpZ3VyZQotYXBfc2l6ZV9saXN0X2l0ZW0KLWFwX3NsYWNrCi1hcF9zbnByaW50ZgotYXBfc29mdF90aW1lb3V0Ci1hcF9zb21lX2F1dGhfcmVxdWlyZWQKLWFwX3NwYXduX2NoaWxkCi1hcF9zeW5jX3Njb3JlYm9hcmRfaW1hZ2UKLWFwX3NybV9jb21tYW5kX2xvb3AKLWFwX3N0YW5kYWxvbmUKLWFwX3N0YXJ0X3Jlc3RhcnQKLWFwX3N0YXJ0X3NodXRkb3duCi1hcF9zdHJfdG9sb3dlcgotYXBfc3RyY2FzZWNtcF9tYXRjaAotYXBfc3RyY21wX21hdGNoCi1hcF9zdWJfcmVxX2xvb2t1cF9maWxlCi1hcF9zdWJfcmVxX2xvb2t1cF91cmkKLWFwX3N1Yl9yZXFfbWV0aG9kX3VyaQotYXBfc3VleGVjX2VuYWJsZWQKLWFwX3RhYmxlX2FkZAotYXBfdGFibGVfYWRkbgotYXBfdGFibGVfZG8KLWFwX3RhYmxlX2dldAotYXBfdGFibGVfbWVyZ2UKLWFwX3RhYmxlX21lcmdlbgotYXBfdGFibGVfc2V0Ci1hcF90YWJsZV9zZXRuCi1hcF90YWJsZV91bnNldAotYXBfdGhyZWFkc19wZXJfY2hpbGQKLWFwX3RtMnNlYwotYXBfdHJhbnNsYXRlX25hbWUKLWFwX3VuYW1lMmlkCi1hcF91bmJsb2NrX2FsYXJtcwotYXBfdW5lc2NhcGVfdXJsCi1hcF91bnBhcnNlX3VyaV9jb21wb25lbnRzCi1hcF91bnJlZ2lzdGVyX290aGVyX2NoaWxkCi1hcF91cGRhdGVfY2hpbGRfc3RhdHVzCi1hcF91cGRhdGVfbXRpbWUKLWFwX3VwZGF0ZV92aG9zdF9mcm9tX2hlYWRlcnMKLWFwX3VwZGF0ZV92aG9zdF9naXZlbl9pcAotYXBfdXNlcl9pZAotYXBfdXNlcl9uYW1lCi1hcF91dGlsX2luaXQKLWFwX3V0aWxfdXJpX2luaXQKLWFwX3V1ZGVjb2RlCi1hcF92YWxpZGF0ZV9wYXNzd29yZAotYXBfdmJwcmludGYKLWFwX3Zmb3JtYXR0ZXIKLWFwX3ZzbnByaW50ZgotY29yZV9tb2R1bGUKLXRvcF9tb2R1bGUKLVhNTF9EZWZhdWx0Q3VycmVudAotWE1MX0Vycm9yU3RyaW5nCi1YTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUKLVhNTF9HZXRCYXNlCi1YTUxfR2V0QnVmZmVyCi1YTUxfR2V0Q3VycmVudEJ5dGVDb3VudAotWE1MX0dldEN1cnJlbnRCeXRlSW5kZXgKLVhNTF9HZXRDdXJyZW50Q29sdW1uTnVtYmVyCi1YTUxfR2V0Q3VycmVudExpbmVOdW1iZXIKLVhNTF9HZXRFcnJvckNvZGUKLVhNTF9HZXRTcGVjaWZpZWRBdHRyaWJ1dGVDb3VudAotWE1MX1BhcnNlCi1YTUxfUGFyc2VCdWZmZXIKLVhNTF9QYXJzZXJDcmVhdGUKLVhNTF9QYXJzZXJDcmVhdGVOUwotWE1MX1BhcnNlckZyZWUKLVhNTF9TZXRCYXNlCi1YTUxfU2V0Q2RhdGFTZWN0aW9uSGFuZGxlcgotWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyCi1YTUxfU2V0Q29tbWVudEhhbmRsZXIKLVhNTF9TZXREZWZhdWx0SGFuZGxlcgotWE1MX1NldERlZmF1bHRIYW5kbGVyRXhwYW5kCi1YTUxfU2V0RWxlbWVudEhhbmRsZXIKLVhNTF9TZXRFbmNvZGluZwotWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcgotWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlckFyZwotWE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyCi1YTUxfU2V0Tm90U3RhbmRhbG9uZUhhbmRsZXIKLVhNTF9TZXROb3RhdGlvbkRlY2xIYW5kbGVyCi1YTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcgotWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIKLVhNTF9TZXRVbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyCi1YTUxfU2V0VXNlckRhdGEKLVhNTF9Vc2VQYXJzZXJBc0hhbmRsZXJBcmcKZGlmZiAtLWdpdCBhL3N1cHBvcnQvbG9nX3NlcnZlcl9zdGF0dXMgYi9zdXBwb3J0L2xvZ19zZXJ2ZXJfc3RhdHVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWIyODkzLi4wMDAwMDAwCi0tLSBhL3N1cHBvcnQvbG9nX3NlcnZlcl9zdGF0dXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotIyEvdXNyL2xvY2FsL2Jpbi9wZXJsCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSMgYXJlIG1ldDoKLSMKLSMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSMKLSMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0jICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgICAgZGlzdHJpYnV0aW9uLgotIwotIyAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSMgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0jICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSMgICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSMKLSMgNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotIyAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotIyAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0Ci0jICAgIGFwYWNoZUBhcGFjaGUub3JnLgotIwotIyA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIgotIyAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSMgICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotIwotIyA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0jICAgIGFja25vd2xlZGdtZW50OgotIyAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQXBhY2hlIEdyb3VwCi0jICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFQQUNIRSBHUk9VUCBgYEFTIElTJycgQU5EIEFOWQotIyBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0jIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotIyBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBHUk9VUCBPUgotIyBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotIyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotIyBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0jIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSMgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIwotIyBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotIyBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBHcm91cCBhbmQgd2FzIG9yaWdpbmFsbHkgYmFzZWQKLSMgb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0jIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSMgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBHcm91cCBhbmQgdGhlIEFwYWNoZSBIVFRQIHNlcnZlcgotIyBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLQotCi0jIExvZyBTZXJ2ZXIgU3RhdHVzCi0jIE1hcmsgSiBDb3gsIFVLIFdlYiBMdGQgMTk5NiwgbWFya0B1a3dlYi5jb20KLSMKLSMgVGhpcyBzY3JpcHQgaXMgZGVzaWduZWQgdG8gYmUgcnVuIGF0IGEgZnJlcXVlbnQgaW50ZXJ2YWwgYnkgc29tZXRoaW5nCi0jIGxpa2UgY3Jvbi4gIEl0IGNvbm5lY3RzIHRvIHRoZSBzZXJ2ZXIgYW5kIGRvd25sb2FkcyB0aGUgc3RhdHVzCi0jIGluZm9ybWF0aW9uLiAgSXQgcmVmb3JtYXRzIHRoZSBpbmZvcm1hdGlvbiB0byBhIHNpbmdsZSBsaW5lIGFuZCBsb2dzCi0jIGl0IHRvIGEgZmlsZS4gIE1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5ICR3aGVyZWxvZyBpcyB3cml0YWJsZSBieSB0aGUKLSMgdXNlciB3aG8gcnVucyB0aGlzIHNjcmlwdC4KLSMKLXJlcXVpcmUgJ3N5cy9zb2NrZXQucGgnOwotCi0kd2hlcmVsb2cgPSAiL3Zhci9sb2cvZ3JhcGgvIjsgICMgTG9ncyB3aWxsIGJlIGxpa2UgIi92YXIvbG9nL2dyYXBoLzE5OTYwMzEyIgotJHNlcnZlciA9ICJsb2NhbGhvc3QiOyAgICAgICAgICAjIE5hbWUgb2Ygc2VydmVyLCBjb3VsZCBiZSAid3d3LmZvby5jb20iCi0kcG9ydCA9ICI4MCI7ICAgICAgICAgICAgICAgICAgICMgUG9ydCBvbiBzZXJ2ZXIKLSRyZXF1ZXN0ID0gIi9zdGF0dXMvP2F1dG8iOyAgICAgIyBSZXF1ZXN0IHRvIHNlbmQKLQotc3ViIHRjcF9jb25uZWN0Ci17Ci0JbG9jYWwoJGhvc3QsJHBvcnQpID1AXzsKLSAgICAgICAgJHNvY2thZGRyPSdTIG4gYTQgeDgnOwotICAgICAgICBjaG9wKCRob3N0bmFtZT1gaG9zdG5hbWVgKTsKLSAgICAgICAgJHBvcnQ9KGdldHNlcnZieW5hbWUoJHBvcnQsICd0Y3AnKSlbMl0gIHVubGVzcyAkcG9ydCA9fiAvXlxkKyQvOwotICAgICAgICAkbWU9cGFjaygkc29ja2FkZHIsJkFGX0lORVQsMCwoZ2V0aG9zdGJ5bmFtZSgkaG9zdG5hbWUpKVs0XSk7Ci0gICAgICAgICR0aGVtPXBhY2soJHNvY2thZGRyLCZBRl9JTkVULCRwb3J0LChnZXRob3N0YnluYW1lKCRob3N0KSlbNF0pOwotICAgICAgICBzb2NrZXQoUywmUEZfSU5FVCwmU09DS19TVFJFQU0sKGdldHByb3RvYnluYW1lKCd0Y3AnKSlbMl0pIHx8IAotCQlkaWUgInNvY2tldDogJCEiOwotICAgICAgICBiaW5kKFMsJG1lKSB8fCByZXR1cm4gImJpbmQ6ICQhIjsKLSAgICAgICAgY29ubmVjdChTLCR0aGVtKSB8fCByZXR1cm4gImNvbm5lY3Q6ICQhIjsKLSAgICAgICAgc2VsZWN0KFMpOyAKLQkkfCA9IDE7IAotCXNlbGVjdChzdGRvdXQpOwotCXJldHVybiAiIjsKLX0KLQotIyMjIE1haW4KLQotewotICAgICAgICAkeWVhcj1gZGF0ZSArJXlgOwotCWNob21wKCR5ZWFyKTsKLQkkeWVhciArPSAoJHllYXIgPCA3MCkgPyAyMDAwIDogMTkwMDsKLQkkZGF0ZSA9ICR5ZWFyIC4gYGRhdGUgKyVtJWQ6JUglTSVTYDsKLQljaG9tcCgkZGF0ZSk7Ci0JKCRkYXksJHRpbWUpPXNwbGl0KC86LywkZGF0ZSk7Ci0JJHJlcz0mdGNwX2Nvbm5lY3QoJHNlcnZlciwkcG9ydCk7Ci0Jb3BlbihPVVQsIj4+JHdoZXJlbG9nJGRheSIpOwotCWlmICgkcmVzKSB7Ci0JCXByaW50IE9VVCAiJHRpbWU6LTE6LTE6LTE6LTE6JHJlc1xuIjsKLQkJZXhpdCAxOwotCX0KLQlwcmludCBTICJHRVQgJHJlcXVlc3RcbiI7Ci0Jd2hpbGUgKDxTPikgewotCQkkcmVxdWVzdHM9JDEgaWYgKCBtfF5CdXN5U2VydmVyczpcIChcUyspfCk7Ci0JCSRpZGxlPSQxIGlmICggbXxeSWRsZVNlcnZlcnM6XCAoXFMrKXwpOwotCQkkbnVtYmVyPSQxIGlmICggbXxzc2VzOlwgKFxTKyl8KTsKLQkJJGNwdT0kMSBpZiAobXxeQ1BVTG9hZDpcIChcUyspfCk7Ci0JfQotCXByaW50IE9VVCAiJHRpbWU6JHJlcXVlc3RzOiRpZGxlOiRudW1iZXI6JGNwdVxuIjsKLX0KLQotCmRpZmYgLS1naXQgYS9zdXBwb3J0L2xvZ3Jlc29sdmUuYyBiL3N1cHBvcnQvbG9ncmVzb2x2ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTVmYTdkLi4wMDAwMDAwCi0tLSBhL3N1cHBvcnQvbG9ncmVzb2x2ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qCi0gKiBsb2dyZXNvbHZlIDEuMQotICoKLSAqIFRvbSBSYXRoYm9ybmUgLSB0b21yQHV1bmV0LmNhIC0gaHR0cDovL3d3dy51dW5ldC5jYS9+dG9tci8KLSAqIFVVTkVUIENhbmFkYSwgQXByaWwgMTYsIDE5OTUKLSAqCi0gKiBSZXdyaXR0ZW4gYnkgRGF2aWQgUm9iaW5zb24uIChkcnRyQGFzdC5jYW0uYWMudWspCi0gKgotICogVXNhZ2U6IGxvZ3Jlc29sdmUgWy1zIGZpbGVuYW1lXSBbLWNdIDwgYWNjZXNzX2xvZyA+IG5ld19sb2cKLSAqCi0gKiBBcmd1bWVudHM6Ci0gKiAgICAtcyBmaWxlbmFtZSAgICAgbmFtZSBvZiBhIGZpbGUgdG8gcmVjb3JkIHN0YXRpc3RpY3MKLSAqICAgIC1jICAgICAgICAgICAgICBjaGVjayB0aGUgRE5TIGZvciBhIG1hdGNoaW5nIEEgcmVjb3JkIGZvciB0aGUgaG9zdC4KLSAqCi0gKiBOb3RlczoKLSAqCi0gKiBUbyBnZW5lcmF0ZSBtZWFuaW5nZnVsIHN0YXRpc3RpY3MgZnJvbSBhbiBIVFRQRCBsb2cgZmlsZSwgaXQncyBnb29kCi0gKiB0byBoYXZlIHRoZSBkb21haW4gbmFtZSBvZiBlYWNoIG1hY2hpbmUgdGhhdCBhY2Nlc3NlZCB5b3VyIHNpdGUsIGJ1dAotICogZG9pbmcgdGhpcyBvbiB0aGUgZmx5IGNhbiBzbG93IEhUVFBEIGRvd24uCi0gKgotICogQ29tcGlsaW5nIE5DU0EgSFRUUEQgd2l0aCB0aGUgLURNSU5JTUFMX0ROUyBmbGFnIHR1cm5zIElQIy0+aG9zdG5hbWUKLSAqIHJlc29sdXRpb24gb2ZmLiBCZWZvcmUgcnVubmluZyB5b3VyIHN0YXRzIHByb2dyYW0sIGp1c3QgcnVuIHlvdXIgbG9nCi0gKiBmaWxlIHRocm91Z2ggdGhpcyBwcm9ncmFtIChsb2dyZXNvbHZlKSBhbmQgYWxsIG9mIHlvdXIgSVAgbnVtYmVycyB3aWxsCi0gKiBiZSByZXNvbHZlZCBpbnRvIGhvc3RuYW1lcyAod2hlcmUgcG9zc2libGUpLgotICoKLSAqIGxvZ3Jlc29sdmUgdGFrZXMgYW4gSFRUUEQgYWNjZXNzIGxvZyAoaW4gdGhlIENPTU1PTiBsb2cgZmlsZSBmb3JtYXQsCi0gKiBvciBhbnkgb3RoZXIgZm9ybWF0IHRoYXQgaGFzIHRoZSBJUCBudW1iZXIvZG9tYWluIG5hbWUgYXMgdGhlIGZpcnN0Ci0gKiBmaWVsZCBmb3IgdGhhdCBtYXR0ZXIpLCBhbmQgb3V0cHV0cyB0aGUgc2FtZSBmaWxlIHdpdGggYWxsIG9mIHRoZQotICogZG9tYWluIG5hbWVzIGxvb2tlZCB1cC4gV2hlcmUgbm8gZG9tYWluIG5hbWUgY2FuIGJlIGZvdW5kLCB0aGUgSVAKLSAqIG51bWJlciBpcyBsZWZ0IGluLgotICoKLSAqIFRvIG1pbmltaXplIGltcGFjdCBvbiB5b3VyIG5hbWVzZXJ2ZXIsIGxvZ3Jlc29sdmUgaGFzIGl0cyB2ZXJ5IG93bgotICogaW50ZXJuYWwgaGFzaC10YWJsZSBjYWNoZS4gVGhpcyBtZWFucyB0aGF0IGVhY2ggSVAgbnVtYmVyIHdpbGwgb25seQotICogYmUgbG9va2VkIHVwIHRoZSBmaXJzdCB0aW1lIGl0IGlzIGZvdW5kIGluIHRoZSBsb2cgZmlsZS4KLSAqCi0gKiBUaGUgLWMgb3B0aW9uIGNhdXNlcyBsb2dyZXNvbHZlIHRvIGFwcGx5IHRoZSBzYW1lIGNoZWNrIGFzIGh0dHBkCi0gKiBjb21waWxlZCB3aXRoIC1ETUFYSU1VTV9ETlM7IGFmdGVyIGZpbmRpbmcgdGhlIGhvc3RuYW1lIGZyb20gdGhlIElQCi0gKiBhZGRyZXNzLCBpdCBsb29rcyB1cCB0aGUgSVAgYWRkcmVzc2VzIGZvciB0aGUgaG9zdG5hbWUgYW5kIGNoZWNrcwotICogdGhhdCBvbmUgb2YgdGhlc2UgbWF0Y2hlcyB0aGUgb3JpZ2luYWwgYWRkcmVzcy4KLSAqLwotCi0jaW5jbHVkZSAiYXBfY29uZmlnLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaWYgIWRlZmluZWQoTVBFKSAmJiAhZGVmaW5lZChCRU9TKSAKLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBjZ2V0aG9zdChzdHJ1Y3QgaW5fYWRkciBpcG51bSwgY2hhciAqc3RyaW5nLCBpbnQgY2hlY2spOwotc3RhdGljIGludCBnZXRsaW5lKGNoYXIgKnMsIGludCBuKTsKLXN0YXRpYyB2b2lkIHN0YXRzKEZJTEUgKm91dHB1dCk7Ci0KLSNpZmRlZiBCRU9TCi0jZGVmaW5lIE5PX0FERFJFU1MgTk9fREFUQQotI2VuZGlmCi0KLQotLyogbWF4aW11bSBsaW5lIGxlbmd0aCAqLwotI2RlZmluZSBNQVhMSU5FIDEwMjQKLQotLyogbWF4aW11bSBsZW5ndGggb2YgYSBkb21haW4gbmFtZSAqLwotI2lmbmRlZiBNQVhETkFNRQotI2RlZmluZSBNQVhETkFNRSAyNTYKLSNlbmRpZgotCi0vKiBudW1iZXIgb2YgYnVja2V0cyBpbiBjYWNoZSBoYXNoIGFwX3RhYmxlX3QgKi8KLSNkZWZpbmUgQlVDS0VUUyAyNTYKLQotI2lmIGRlZmluZWQoTkVFRF9TVFJEVVApCi1jaGFyICpzdHJkdXAgKGNvbnN0IGNoYXIgKnN0cikKLXsKLSAgICBjaGFyICpkdXA7Ci0KLSAgICBpZiAoIShkdXAgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKHN0cikgKyAxKSkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgZHVwID0gc3RyY3B5KGR1cCwgc3RyKTsKLQotICAgIHJldHVybiBkdXA7Ci19Ci0jZW5kaWYKLQotLyoKLSAqIHN0cnVjdCBuc3JlYyAtIHJlY29yZCBvZiBuYW1lc2VydmljZSBmb3IgY2FjaGUgbGlua2VkIGxpc3QKLSAqIAotICogaXBudW0gLSBJUCBudW1iZXIgaG9zdG5hbWUgLSBob3N0bmFtZSBub25hbWUgLSBub256ZXJvIGlmIElQIG51bWJlciBoYXMgbm8KLSAqIGhvc3RuYW1lLCBpLmUuIGhvc3RuYW1lPUlQIG51bWJlcgotICovCi0KLXN0cnVjdCBuc3JlYyB7Ci0gICAgc3RydWN0IGluX2FkZHIgaXBudW07Ci0gICAgY2hhciAqaG9zdG5hbWU7Ci0gICAgaW50IG5vbmFtZTsKLSAgICBzdHJ1Y3QgbnNyZWMgKm5leHQ7Ci19ICAgICpuc2NhY2hlW0JVQ0tFVFNdOwotCi0vKgotICogc3RhdGlzdGljcyAtIG9idmlvdXMKLSAqLwotCi0jaWZuZGVmIGhfZXJybm8KLWV4dGVybiBpbnQgaF9lcnJubzsgLyogc29tZSBtYWNoaW5lcyBkb24ndCBoYXZlIHRoaXMgaW4gdGhlaXIgaGVhZGVycyAqLwotI2VuZGlmCi0KLS8qIGxhcmdlc3QgdmFsdWUgZm9yIGhfZXJybm8gKi8KLQotI2RlZmluZSBNQVhfRVJSIChOT19BRERSRVNTKQotI2RlZmluZSBVTktOT1dOX0VSUiAoTUFYX0VSUisxKQotI2RlZmluZSBOT19SRVZFUlNFICAoTUFYX0VSUisyKQotCi1zdGF0aWMgaW50IGNhY2hlaGl0cyA9IDA7Ci1zdGF0aWMgaW50IGNhY2hlc2l6ZSA9IDA7Ci1zdGF0aWMgaW50IGVudHJpZXMgPSAwOwotc3RhdGljIGludCByZXNvbHZlcyA9IDA7Ci1zdGF0aWMgaW50IHdpdGhuYW1lID0gMDsKLXN0YXRpYyBpbnQgZXJyb3JzW01BWF9FUlIgKyAzXTsKLQotLyoKLSAqIGNnZXRob3N0IC0gZ2V0cyBob3N0bmFtZSBieSBJUCBhZGRyZXNzLCBjYWNoaW5nLCBhbmQgYWRkaW5nIHVucmVzb2x2YWJsZQotICogSVAgbnVtYmVycyB3aXRoIHRoZWlyIElQIG51bWJlciBhcyBob3N0bmFtZSwgc2V0dGluZyBub25hbWUgZmxhZwotICovCi0KLXN0YXRpYyB2b2lkIGNnZXRob3N0IChzdHJ1Y3QgaW5fYWRkciBpcG51bSwgY2hhciAqc3RyaW5nLCBpbnQgY2hlY2spCi17Ci0gICAgc3RydWN0IG5zcmVjICoqY3VycmVudCwgKm5ldzsKLSAgICBzdHJ1Y3QgaG9zdGVudCAqaG9zdGRhdGE7Ci0gICAgY2hhciAqbmFtZTsKLQotICAgIGN1cnJlbnQgPSAmbnNjYWNoZVsoKGlwbnVtLnNfYWRkciArIChpcG51bS5zX2FkZHIgPj4gOCkgKwotCQkJIChpcG51bS5zX2FkZHIgPj4gMTYpICsgKGlwbnVtLnNfYWRkciA+PiAyNCkpICUgQlVDS0VUUyldOwotCi0gICAgd2hpbGUgKCpjdXJyZW50ICE9IE5VTEwgJiYgaXBudW0uc19hZGRyICE9ICgqY3VycmVudCktPmlwbnVtLnNfYWRkcikKLQljdXJyZW50ID0gJigqY3VycmVudCktPm5leHQ7Ci0KLSAgICBpZiAoKmN1cnJlbnQgPT0gTlVMTCkgewotCWNhY2hlc2l6ZSsrOwotCW5ldyA9IChzdHJ1Y3QgbnNyZWMgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgbnNyZWMpKTsKLQlpZiAobmV3ID09IE5VTEwpIHsKLQkgICAgcGVycm9yKCJtYWxsb2MiKTsKLQkgICAgZnByaW50ZihzdGRlcnIsICJJbnN1ZmZpY2llbnQgbWVtb3J5XG4iKTsKLQkgICAgZXhpdCgxKTsKLQl9Ci0JKmN1cnJlbnQgPSBuZXc7Ci0JbmV3LT5uZXh0ID0gTlVMTDsKLQotCW5ldy0+aXBudW0gPSBpcG51bTsKLQotCWhvc3RkYXRhID0gZ2V0aG9zdGJ5YWRkcigoY29uc3QgY2hhciAqKSAmaXBudW0sIHNpemVvZihzdHJ1Y3QgaW5fYWRkciksCi0JCQkJIEFGX0lORVQpOwotCWlmIChob3N0ZGF0YSA9PSBOVUxMKSB7Ci0JICAgIGlmIChoX2Vycm5vID4gTUFYX0VSUikKLQkJZXJyb3JzW1VOS05PV05fRVJSXSsrOwotCSAgICBlbHNlCi0JCWVycm9yc1toX2Vycm5vXSsrOwotCSAgICBuZXctPm5vbmFtZSA9IGhfZXJybm87Ci0JICAgIG5hbWUgPSBzdHJkdXAoaW5ldF9udG9hKGlwbnVtKSk7Ci0JfQotCWVsc2UgewotCSAgICBuZXctPm5vbmFtZSA9IDA7Ci0JICAgIG5hbWUgPSBzdHJkdXAoaG9zdGRhdGEtPmhfbmFtZSk7Ci0JICAgIGlmIChjaGVjaykgewotCQlpZiAobmFtZSA9PSBOVUxMKSB7Ci0JCSAgICBwZXJyb3IoInN0cmR1cCIpOwotCQkgICAgZnByaW50ZihzdGRlcnIsICJJbnN1ZmZpY2llbnQgbWVtb3J5XG4iKTsKLQkJICAgIGV4aXQoMSk7Ci0JCX0KLQkJaG9zdGRhdGEgPSBnZXRob3N0YnluYW1lKG5hbWUpOwotCQlpZiAoaG9zdGRhdGEgIT0gTlVMTCkgewotCQkgICAgY2hhciAqKmhwdHI7Ci0KLQkJICAgIGZvciAoaHB0ciA9IGhvc3RkYXRhLT5oX2FkZHJfbGlzdDsgKmhwdHIgIT0gTlVMTDsgaHB0cisrKQotCQkJaWYgKCgoc3RydWN0IGluX2FkZHIgKikgKCpocHRyKSktPnNfYWRkciA9PSBpcG51bS5zX2FkZHIpCi0JCQkgICAgYnJlYWs7Ci0JCSAgICBpZiAoKmhwdHIgPT0gTlVMTCkKLQkJCWhvc3RkYXRhID0gTlVMTDsKLQkJfQotCQlpZiAoaG9zdGRhdGEgPT0gTlVMTCkgewotCQkgICAgZnByaW50ZihzdGRlcnIsICJCYWQgaG9zdDogJXMgIT0gJXNcbiIsIG5hbWUsCi0JCQkgICAgaW5ldF9udG9hKGlwbnVtKSk7Ci0JCSAgICBuZXctPm5vbmFtZSA9IE5PX1JFVkVSU0U7Ci0JCSAgICBmcmVlKG5hbWUpOwotCQkgICAgbmFtZSA9IHN0cmR1cChpbmV0X250b2EoaXBudW0pKTsKLQkJICAgIGVycm9yc1tOT19SRVZFUlNFXSsrOwotCQl9Ci0JICAgIH0KLQl9Ci0JbmV3LT5ob3N0bmFtZSA9IG5hbWU7Ci0JaWYgKG5ldy0+aG9zdG5hbWUgPT0gTlVMTCkgewotCSAgICBwZXJyb3IoInN0cmR1cCIpOwotCSAgICBmcHJpbnRmKHN0ZGVyciwgIkluc3VmZmljaWVudCBtZW1vcnlcbiIpOwotCSAgICBleGl0KDEpOwotCX0KLSAgICB9Ci0gICAgZWxzZQotCWNhY2hlaGl0cysrOwotCi0gICAgLyogc2l6ZSBvZiBzdHJpbmcgPT0gTUFYRE5BTUUgKzEgKi8KLSAgICBzdHJuY3B5KHN0cmluZywgKCpjdXJyZW50KS0+aG9zdG5hbWUsIE1BWEROQU1FKTsKLSAgICBzdHJpbmdbTUFYRE5BTUVdID0gJ1wwJzsKLX0KLQotLyoKLSAqIHByaW50cyB2YXJpb3VzIHN0YXRpc3RpY3MgdG8gb3V0cHV0Ci0gKi8KLQotc3RhdGljIHZvaWQgc3RhdHMgKEZJTEUgKm91dHB1dCkKLXsKLSAgICBpbnQgaTsKLSAgICBjaGFyICppcHN0cmluZzsKLSAgICBzdHJ1Y3QgbnNyZWMgKmN1cnJlbnQ7Ci0gICAgY2hhciAqZXJyc3RyaW5nW01BWF9FUlIgKyAzXTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfRVJSICsgMzsgaSsrKQotCWVycnN0cmluZ1tpXSA9ICJVbmtub3duIGVycm9yIjsKLSAgICBlcnJzdHJpbmdbSE9TVF9OT1RfRk9VTkRdID0gIkhvc3Qgbm90IGZvdW5kIjsKLSAgICBlcnJzdHJpbmdbVFJZX0FHQUlOXSA9ICJUcnkgYWdhaW4iOwotICAgIGVycnN0cmluZ1tOT19SRUNPVkVSWV0gPSAiTm9uIHJlY292ZXJhYmxlIGVycm9yIjsKLSAgICBlcnJzdHJpbmdbTk9fREFUQV0gPSAiTm8gZGF0YSByZWNvcmQiOwotICAgIGVycnN0cmluZ1tOT19BRERSRVNTXSA9ICJObyBhZGRyZXNzIjsKLSAgICBlcnJzdHJpbmdbTk9fUkVWRVJTRV0gPSAiTm8gcmV2ZXJzZSBlbnRyeSI7Ci0KLSAgICBmcHJpbnRmKG91dHB1dCwgImxvZ3Jlc29sdmUgU3RhdGlzdGljczpcbiIpOwotCi0gICAgZnByaW50ZihvdXRwdXQsICJFbnRyaWVzOiAlZFxuIiwgZW50cmllcyk7Ci0gICAgZnByaW50ZihvdXRwdXQsICIgICAgV2l0aCBuYW1lICAgOiAlZFxuIiwgd2l0aG5hbWUpOwotICAgIGZwcmludGYob3V0cHV0LCAiICAgIFJlc29sdmVzICAgIDogJWRcbiIsIHJlc29sdmVzKTsKLSAgICBpZiAoZXJyb3JzW0hPU1RfTk9UX0ZPVU5EXSkKLQlmcHJpbnRmKG91dHB1dCwgIiAgICAtIE5vdCBmb3VuZCA6ICVkXG4iLCBlcnJvcnNbSE9TVF9OT1RfRk9VTkRdKTsKLSAgICBpZiAoZXJyb3JzW1RSWV9BR0FJTl0pCi0JZnByaW50ZihvdXRwdXQsICIgICAgLSBUcnkgYWdhaW4gOiAlZFxuIiwgZXJyb3JzW1RSWV9BR0FJTl0pOwotICAgIGlmIChlcnJvcnNbTk9fREFUQV0pCi0JZnByaW50ZihvdXRwdXQsICIgICAgLSBObyBkYXRhICAgOiAlZFxuIiwgZXJyb3JzW05PX0RBVEFdKTsKLSAgICBpZiAoZXJyb3JzW05PX0FERFJFU1NdKQotCWZwcmludGYob3V0cHV0LCAiICAgIC0gTm8gYWRkcmVzczogJWRcbiIsIGVycm9yc1tOT19BRERSRVNTXSk7Ci0gICAgaWYgKGVycm9yc1tOT19SRVZFUlNFXSkKLQlmcHJpbnRmKG91dHB1dCwgIiAgICAtIE5vIHJldmVyc2U6ICVkXG4iLCBlcnJvcnNbTk9fUkVWRVJTRV0pOwotICAgIGZwcmludGYob3V0cHV0LCAiQ2FjaGUgaGl0cyAgICAgIDogJWRcbiIsIGNhY2hlaGl0cyk7Ci0gICAgZnByaW50ZihvdXRwdXQsICJDYWNoZSBzaXplICAgICAgOiAlZFxuIiwgY2FjaGVzaXplKTsKLSAgICBmcHJpbnRmKG91dHB1dCwgIkNhY2hlIGJ1Y2tldHMgICA6ICAgICBJUCBudW1iZXIgKiBob3N0bmFtZVxuIik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgQlVDS0VUUzsgaSsrKQotCWZvciAoY3VycmVudCA9IG5zY2FjaGVbaV07IGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpIHsKLQkgICAgaXBzdHJpbmcgPSBpbmV0X250b2EoY3VycmVudC0+aXBudW0pOwotCSAgICBpZiAoY3VycmVudC0+bm9uYW1lID09IDApCi0JCWZwcmludGYob3V0cHV0LCAiICAlM2QgICUxNXMgLSAlc1xuIiwgaSwgaXBzdHJpbmcsCi0JCQljdXJyZW50LT5ob3N0bmFtZSk7Ci0JICAgIGVsc2UgewotCQlpZiAoY3VycmVudC0+bm9uYW1lID4gTUFYX0VSUiArIDIpCi0JCSAgICBmcHJpbnRmKG91dHB1dCwgIiAgJTNkICAlMTVzIDogVW5rbm93biBlcnJvclxuIiwgaSwKLQkJCSAgICBpcHN0cmluZyk7Ci0JCWVsc2UKLQkJICAgIGZwcmludGYob3V0cHV0LCAiICAlM2QgICUxNXMgOiAlc1xuIiwgaSwgaXBzdHJpbmcsCi0JCQkgICAgZXJyc3RyaW5nW2N1cnJlbnQtPm5vbmFtZV0pOwotCSAgICB9Ci0JfQotfQotCi0KLS8qCi0gKiBnZXRzIGEgbGluZSBmcm9tIHN0ZGluCi0gKi8KLQotc3RhdGljIGludCBnZXRsaW5lIChjaGFyICpzLCBpbnQgbikKLXsKLSAgICBjaGFyICpjcDsKLQotICAgIGlmICghZmdldHMocywgbiwgc3RkaW4pKQotCXJldHVybiAoMCk7Ci0gICAgY3AgPSBzdHJjaHIocywgJ1xuJyk7Ci0gICAgaWYgKGNwKQotCSpjcCA9ICdcMCc7Ci0gICAgcmV0dXJuICgxKTsKLX0KLQotaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gICAgc3RydWN0IGluX2FkZHIgaXBudW07Ci0gICAgY2hhciAqYmFyLCBob3N0c3RyaW5nW01BWEROQU1FICsgMV0sIGxpbmVbTUFYTElORV0sICpzdGF0ZmlsZTsKLSAgICBpbnQgaSwgY2hlY2s7Ci0KLSAgICBjaGVjayA9IDA7Ci0gICAgc3RhdGZpbGUgPSBOVUxMOwotICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKLQlpZiAoc3RyY21wKGFyZ3ZbaV0sICItYyIpID09IDApCi0JICAgIGNoZWNrID0gMTsKLQllbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi1zIikgPT0gMCkgewotCSAgICBpZiAoaSA9PSBhcmdjIC0gMSkgewotCQlmcHJpbnRmKHN0ZGVyciwgImxvZ3Jlc29sdmU6IG1pc3NpbmcgZmlsZW5hbWUgdG8gLXNcbiIpOwotCQlleGl0KDEpOwotCSAgICB9Ci0JICAgIGkrKzsKLQkgICAgc3RhdGZpbGUgPSBhcmd2W2ldOwotCX0KLQllbHNlIHsKLQkgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogbG9ncmVzb2x2ZSBbLXMgc3RhdGZpbGVdIFstY10gPCBpbnB1dCA+IG91dHB1dFxuIik7Ci0JICAgIGV4aXQoMCk7Ci0JfQotICAgIH0KLQotCi0gICAgZm9yIChpID0gMDsgaSA8IEJVQ0tFVFM7IGkrKykKLQluc2NhY2hlW2ldID0gTlVMTDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0VSUiArIDI7IGkrKykKLQllcnJvcnNbaV0gPSAwOwotCi0gICAgd2hpbGUgKGdldGxpbmUobGluZSwgTUFYTElORSkpIHsKLQlpZiAobGluZVswXSA9PSAnXDAnKQotCSAgICBjb250aW51ZTsKLQllbnRyaWVzKys7Ci0JaWYgKCFpc2RpZ2l0KGxpbmVbMF0pKSB7CS8qIHNob3J0IGN1dCAqLwotCSAgICBwdXRzKGxpbmUpOwotCSAgICB3aXRobmFtZSsrOwotCSAgICBjb250aW51ZTsKLQl9Ci0JYmFyID0gc3RyY2hyKGxpbmUsICcgJyk7Ci0JaWYgKGJhciAhPSBOVUxMKQotCSAgICAqYmFyID0gJ1wwJzsKLQlpcG51bS5zX2FkZHIgPSBpbmV0X2FkZHIobGluZSk7Ci0JaWYgKGlwbnVtLnNfYWRkciA9PSAweGZmZmZmZmZmdSkgewotCSAgICBpZiAoYmFyICE9IE5VTEwpCi0JCSpiYXIgPSAnICc7Ci0JICAgIHB1dHMobGluZSk7Ci0JICAgIHdpdGhuYW1lKys7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotCXJlc29sdmVzKys7Ci0KLQljZ2V0aG9zdChpcG51bSwgaG9zdHN0cmluZywgY2hlY2spOwotCWlmIChiYXIgIT0gTlVMTCkKLQkgICAgcHJpbnRmKCIlcyAlc1xuIiwgaG9zdHN0cmluZywgYmFyICsgMSk7Ci0JZWxzZQotCSAgICBwdXRzKGhvc3RzdHJpbmcpOwotICAgIH0KLQotICAgIGlmIChzdGF0ZmlsZSAhPSBOVUxMKSB7Ci0JRklMRSAqZnA7Ci0JZnAgPSBmb3BlbihzdGF0ZmlsZSwgInciKTsKLQlpZiAoZnAgPT0gTlVMTCkgewotCSAgICBmcHJpbnRmKHN0ZGVyciwgImxvZ3Jlc29sdmU6IGNvdWxkIG5vdCBvcGVuIHN0YXRpc3RpY3MgZmlsZSAnJXMnXG4iCi0JCSAgICAsc3RhdGZpbGUpOwotCSAgICBleGl0KDEpOwotCX0KLQlzdGF0cyhmcCk7Ci0JZmNsb3NlKGZwKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKDApOwotfQpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9sb2dyZXNvbHZlLnBsIGIvc3VwcG9ydC9sb2dyZXNvbHZlLnBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWFiOWViLi4wMDAwMDAwCi0tLSBhL3N1cHBvcnQvbG9ncmVzb2x2ZS5wbAorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0jIS91c3IvbG9jYWwvYmluL3BlcmwKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIyBhcmUgbWV0OgotIwotIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotIwotIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSMgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyAgICBkaXN0cmlidXRpb24uCi0jCi0jIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotIyAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSMgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotIyAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotIwotIyA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0jICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0jICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSMgICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0jCi0jIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0jICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotIyAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgR3JvdXAuCi0jCi0jIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSMgICAgYWNrbm93bGVkZ21lbnQ6Ci0jICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSMgICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0jIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0jIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0jIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0jIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotIyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotIyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0jIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotIyBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0jIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotIyBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSMgU3VwZXJjb21wdXRpbmcgQXBwbGljYXRpb25zLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzLCBVcmJhbmEtQ2hhbXBhaWduLgotIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0jIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotCi0jIGxvZ3Jlc29sdmUucGwKLSMKLSMgdiAxLjIgYnkgcm9iaCBAIGltZGIuY29tCi0jIAotIyB1c2FnZTogbG9ncmVzb2x2ZS5wbCA8aW5maWxlID5vdXRmaWxlCi0jCi0jIGlucHV0ID0gQXBhY2hlL05DU0EvLi4gbG9nZmlsZSB3aXRoIElQIG51bWJlcnMgYXQgc3RhcnQgb2YgbGluZXMKLSMgb3V0cHV0ID0gc2FtZSBsb2dmaWxlIHdpdGggSVAgYWRkcmVzc2VzIHJlc29sdmVkIHRvIGhvc3RuYW1lcyB3aGVyZQotIyAgbmFtZSBsb29rdXBzIHN1Y2NlZWRlZC4KLSMKLSMgdGhpcyBkaWZmZXJzIGZyb20gdGhlIEMgYmFzZWQgJ2xvZ3Jlc29sdmUnIGluIHRoYXQgdGhpcyBzY3JpcHQKLSMgc3Bhd25zIGEgbnVtYmVyICgkQ0hJTERSRU4pIG9mIHN1YnByb2Nlc3NlcyB0byByZXNvbHZlIGFkZHJlc3NlcwotIyBjb25jdXJyZW50bHkgYW5kIHNldHMgYSBzaG9ydCB0aW1lb3V0ICgkVElNRU9VVCkgZm9yIGVhY2ggbG9va3VwIGluCi0jIG9yZGVyIHRvIGtlZXAgdGhpbmdzIG1vdmluZyBxdWlja2x5LgotIwotIyB0aGUgcGFyZW50IHByb2Nlc3MgaGFuZGxlcyBjYWNoaW5nIG9mIElQLT5ob3N0bmFtZXMgdXNpbmcgYSBQZXJsIGhhc2gKLSMgaXQgYWxzbyBhdm9pZHMgc2VuZGluZyB0aGUgc2FtZSBJUCB0byBtdWx0aXBsZSBjaGlsZCBwcm9jZXNzZXMgdG8gYmUKLSMgcmVzb2x2ZWQgbXVsdGlwbGUgdGltZXMgY29uY3VycmVudGx5LgotIwotIyBEZXBlbmRpbmcgb24gdGhlIHNldHRpbmdzIG9mICRDSElMRFJFTiBhbmQgJFRJTUVPVVQgeW91IHNob3VsZCBzZWUKLSMgc2lnbmlmaWNhbnQgcmVkdWN0aW9ucyBpbiB0aGUgb3ZlcmFsbCB0aW1lIHRha2VuIHRvIHJlc29sdmUgeW91cgotIyBsb2dmaWxlcy4gV2l0aCAkQ0hJTERSRU49NDAgYW5kICRUSU1FT1VUPTUgSSd2ZSBzZWVuIDIwMCwwMDAgLSAzMDAsMDAwCi0jIGxvZ2ZpbGUgbGluZXMgcHJvY2Vzc2VkIHBlciBob3VyIGNvbXBhcmVkIHRvIH40NSwwMDAgcGVyIGhvdXIKLSMgd2l0aCAnbG9ncmVzb2x2ZScuCi0jCi0jIEkgaGF2ZW4ndCB5ZXQgc2VlbiBhbnkgbm90aWNhYmxlIHJlZHVjdGlvbiBpbiB0aGUgcGVyY2VudGFnZSBvZiBJUHMKLSMgdGhhdCBmYWlsIHRvIGdldCByZXNvbHZlZC4gWW91ciBtaWxlYWdlIHdpbGwgbm8gZG91YnQgdmFyeS4gNXMgaXMgbG9uZwotIyBlbm91Z2ggdG8gd2FpdCBJTU8uCi0jCi0jIEtub3duIHRvIHdvcmsgd2l0aCBGcmVlQlNEIDIuMgotIyBLbm93biB0byBoYXZlIHByb2JsZW1zIHdpdGggU29sYXJpcwotIwotIyA5ODA0MTcgLSB1c2UgJ3NvY2thZGRyX3VuJyBmb3IgYmluZC9jb25uZWN0IHRvIG1ha2UgdGhlIHNjcmlwdCB3b3JrCi0jICB3aXRoIGxpbnV4LiBGaXggZnJvbSBMdXVrIGRlIEJvZXIgPGx1dWtfZGVfYm9lckBwaS5uZXQ+Ci0KLXJlcXVpcmUgNS4wMDQ7Ci0KLSR8PTE7Ci0KLXVzZSBGaWxlSGFuZGxlOwotdXNlIFNvY2tldDsKLQotdXNlIHN0cmljdDsKLW5vIHN0cmljdCAncmVmcyc7Ci0KLXVzZSB2YXJzIHF3KCRQUk9UT0NPTCk7Ci0kUFJPVE9DT0wgPSAwOwotCi1teSAkQ0hJTERSRU4gPSA0MDsKLW15ICRUSU1FT1VUICA9IDU7Ci0KLW15ICRmaWxlbmFtZTsKLW15ICVoYXNoID0gKCk7Ci1teSAkcGFyZW50ID0gJCQ7Ci0KLW15IEBjaGlsZHJlbiA9ICgpOwotZm9yIChteSAkY2hpbGQgPSAxOyAkY2hpbGQgPD0kQ0hJTERSRU47ICRjaGlsZCsrKSB7Ci0JbXkgJGYgPSBmb3JrKCk7CQotCWlmICghJGYpIHsKLQkJJGZpbGVuYW1lID0gIi4vLnNvY2tldC4kcGFyZW50LiRjaGlsZCI7Ci0JCWlmICgtZSAkZmlsZW5hbWUpIHsgdW5saW5rKCRmaWxlbmFtZSkgfHwgd2FybiAiJGZpbGVuYW1lIC4uICQhXG4iO30KLQkJJmNoaWxkKCRjaGlsZCk7Ci0JCWV4aXQoMCk7Ci0JfQotCXB1c2goQGNoaWxkcmVuLCAkZik7Ci19Ci0KLSZwYXJlbnQ7Ci0mY2xlYW51cDsKLQotIyMgcmVtb3ZlIGFsbCB0ZW1wb3JhcnkgZmlsZXMgYmVmb3JlIHNodXR0aW5nIGRvd24KLXN1YiBjbGVhbnVwIHsKLQkgIyBkaWUga2lkZGllcywgZGllCi0Ja2lsbCgxNSwgQGNoaWxkcmVuKTsKLQlmb3IgKG15ICRjaGlsZCA9IDE7ICRjaGlsZCA8PSRDSElMRFJFTjsgJGNoaWxkKyspIHsKLQkJaWYgKC1lICIuLy5zb2NrZXQuJHBhcmVudC4kY2hpbGQiKSB7Ci0JCQl1bmxpbmsoIi4vLnNvY2tldC4kcGFyZW50LiRjaGlsZCIpCi0JCQkJfHwgd2FybiAiLnNvY2tldC4kcGFyZW50LiRjaGlsZCAkISI7Ci0JCX0KLQl9Ci19Ci0JCi1zdWIgcGFyZW50IHsKLQkjIFRyYXAgc29tZSBwb3NzaWJsZSBzaWduYWxzIHRvIHRyaWdnZXIgdGVtcCBmaWxlIGNsZWFudXAKLQkkU0lHeydLSUxMJ30gPSAkU0lHeydJTlQnfSA9ICRTSUd7J1BJUEUnfSA9IFwmY2xlYW51cDsKLQotCW15ICVDSElMRFNPQ0s7Ci0JbXkgJGZpbGVuYW1lOwotIAotCSAjIyBmb3JrIGNoaWxkIHByb2Nlc3Nlcy4gRWFjaCBjaGlsZCB3aWxsIGNyZWF0ZSBhIHNvY2tldCBjb25uZWN0aW9uCi0JICMjIHRvIHRoaXMgcGFyZW50IGFuZCB1c2UgYW4gdW5pcXVlIHRlbXAgZmlsZW5hbWUgdG8gZG8gc28uCi0JZm9yIChteSAkY2hpbGQgPSAxOyAkY2hpbGQgPD0kQ0hJTERSRU47ICRjaGlsZCsrKSB7Ci0JCSRDSElMRFNPQ0t7JGNoaWxkfT0gRmlsZUhhbmRsZS0+bmV3OwotCi0JCWlmICghc29ja2V0KCRDSElMRFNPQ0t7JGNoaWxkfSwgQUZfVU5JWCwgU09DS19TVFJFQU0sICRQUk9UT0NPTCkpIHsKLQkJCXdhcm4gInBhcmVudCBzb2NrZXQgdG8gY2hpbGQgZmFpbGVkICQhIjsKLQkJfQotCQkkZmlsZW5hbWUgPSAiLi8uc29ja2V0LiRwYXJlbnQuJGNoaWxkIjsKLQkJbXkgJHJlc3BvbnNlOwotCQlkbyB7Ci0JCQkkcmVzcG9uc2UgPSBjb25uZWN0KCRDSElMRFNPQ0t7JGNoaWxkfSwgc29ja2FkZHJfdW4oJGZpbGVuYW1lKSk7Ci0JCQlpZiAoJHJlc3BvbnNlICE9IDEpIHsKLQkJCQlzbGVlcCgxKTsKLQkJCX0gICAgICAgICAgICAgICAgICAgICAgIAotCQl9IHdoaWxlICgkcmVzcG9uc2UgIT0gMSk7Ci0JCSRDSElMRFNPQ0t7JGNoaWxkfS0+YXV0b2ZsdXNoOwotCX0KLQkjIyBBbGwgY2hpbGQgcHJvY2Vzc2VzIHNob3VsZCBub3cgYmUgcmVhZHkgb3IgYXQgd29yc3Qgd2FybWluZyB1cCAKLQotCW15IChAYnVmZmVyLCAkY2hpbGQsICRpcCwgJHJlc3QsICRob3N0bmFtZSwgJHJlc3BvbnNlKTsKLQkgIyMgcmVhZCB0aGUgbG9nZmlsZSBsaW5lcyBmcm9tIFNURElOCi0Jd2hpbGUoPFNURElOPikgewotCQlAYnVmZmVyID0gKCk7CSMgZW1wdHkgdGhlIGxvZ2ZpbGUgbGluZSBidWZmZXIgYXJyYXkuCi0JCSRjaGlsZCA9IDE7CQkjIGNoaWxkcmVuIGFyZSBudW1iZXJlZCAxLi5OLCBzdGFydCB3aXRoICMxCi0KLQkJIyB3aGlsZSB3ZSBoYXZlIGEgY2hpbGQgdG8gdGFsayB0byBhbmQgZGF0YSB0byBnaXZlIGl0Li4KLQkJZG8gewotCQkJcHVzaChAYnVmZmVyLCAkXyk7CQkJCQkjIGJ1ZmZlciB0aGUgbGluZQotCQkJKCRpcCwgJHJlc3QpID0gc3BsaXQoLyAvLCAkXywgMik7CSMgc2VwYXJhdGUgSVAgZm9ybSByZXN0Ci0KLQkJCXVubGVzcyAoJGhhc2h7JGlwfSkgewkJCQkjIHJlc29sdmUgaWYgdW5zZWVuIElQCi0JCQkJJENISUxEU09DS3skY2hpbGR9LT5wcmludCgiJGlwXG4iKTsgIyBwYXNzIElQIHRvIG5leHQgY2hpbGQKLQkJCQkkaGFzaHskaXB9ID0gJGlwOwkJCQkjIGRvbid0IGxvb2sgaXQgdXAgYWdhaW4uCi0JCQkJJGNoaWxkKys7Ci0JCQl9Ci0JCX0gd2hpbGUgKCgkY2hpbGQgPCAoJENISUxEUkVOLTEpKSBhbmQgKCRfID0gPFNURElOPikpOwotCi0JCSAjIyBub3cgcG9sbCBlYWNoIGNoaWxkIGZvciBhIHJlc3BvbnNlCi0JCXdoaWxlICgtLSRjaGlsZCA+IDApIHsgCi0JCQkkcmVzcG9uc2UgPSAkQ0hJTERTT0NLeyRjaGlsZH0tPmdldGxpbmU7Ci0JCQljaG9tcCgkcmVzcG9uc2UpOwotCQkJICMgY2hpbGQgc2VuZHMgdXMgYmFjayBib3RoIHRoZSBJUCBhbmQgSE9TVE5BTUUsIG5vIG5lZWQgZm9yIHVzCi0JCQkgIyB0byByZW1lbWJlciB3aGF0IGNoaWxkIHJlY2VpdmVkIGFueSBnaXZlbiBJUCwgYW5kIG5vIHdvcnJpZXMKLQkJCSAjIHdoYXQgb3JkZXIgd2UgdGFsayB0byB0aGUgY2hpbGRyZW4KLQkJCSgkaXAsICRob3N0bmFtZSkgPSBzcGxpdCgvXHwvLCAkcmVzcG9uc2UsIDIpOwotCQkJJGhhc2h7JGlwfSA9ICRob3N0bmFtZTsKLQkJfQotCi0JCSAjIHJlc29sdmUgYWxsIHRoZSBsb2dmaWxlcyBsaW5lcyBoZWxkIGluIHRoZSBsb2cgYnVmZmVyIGFycmF5Li4KLQkJZm9yIChteSAkbGluZSA9IDA7ICRsaW5lIDw9JCNidWZmZXI7ICRsaW5lKyspIHsKLQkJCSAjIGdldCBuZXh0IGJ1ZmZlcmVkIGxpbmUKLQkJCSgkaXAsICRyZXN0KSA9IHNwbGl0KC8gLywgJGJ1ZmZlclskbGluZV0sIDIpOwotCQkJICMgc2VwYXJhdGUgSVAgZnJvbSByZXN0IGFuZCByZXBsYWNlIHdpdGggY2FjaGVkIGhvc3RuYW1lCi0JCQlwcmludGYgU1RET1VUICgiJXMgJXMiLCAkaGFzaHskaXB9LCAkcmVzdCk7Ci0JCX0KLQl9Ci19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotc3ViIGNoaWxkIHsKLQkgIyBhcmcgPSBudW1lcmljIElEIC0gaG93IHRoZSBwYXJlbnQgcmVmZXJzIHRvIG1lCi0JbXkgJG1lID0gc2hpZnQ7Ci0KLQkgIyBhZGQgdHJhcCBmb3IgYWxhcm0gc2lnbmFscy4KLQkkU0lHeydBTFJNJ30gPSBzdWIgeyBkaWUgImFsYXJtZWQiOyB9OwotCi0JICMgY3JlYXRlIGEgc29ja2V0IHRvIGNvbW11bmljYXRlIHdpdGggcGFyZW50Ci0Jc29ja2V0KElOQk9VTkQsIEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAkUFJPVE9DT0wpCi0JCXx8IGRpZSAiRXJyb3Igd2l0aCBTb2NrZXQ6ICEkXG4iOwotCSRmaWxlbmFtZSA9ICIuLy5zb2NrZXQuJHBhcmVudC4kbWUiOwotCWJpbmQoSU5CT1VORCwgc29ja2FkZHJfdW4oJGZpbGVuYW1lKSkKLQkJfHwgZGllICJFcnJvciBCaW5kaW5nICRmaWxlbmFtZTogJCFcbiI7Ci0JbGlzdGVuKElOQk9VTkQsIDUpIHx8IGRpZSAiRXJyb3IgTGlzdGVuaW5nOiAkIVxuIjsKLQotCW15ICgkaXAsICRzZW5kX2JhY2spOwotCW15ICR0YWxrID0gRmlsZUhhbmRsZS0+bmV3OwotCi0JICMgYWNjZXB0IGEgY29ubmVjdGlvbiBmcm9tIHRoZSBwYXJlbnQgcHJvY2Vzcy4gV2Ugb25seSBldmVyIGhhdmUKLQkgIyBoYXZlIG9uZSBjb25uZWN0aW9uIHdoZXJlIHdlIGV4Y2hhbmdlIDEgbGluZSBvZiBpbmZvIHdpdGggdGhlCi0JICMgcGFyZW50Li4gMSBsaW5lIGluIChJUCBhZGRyZXNzKSwgMSBsaW5lIG91dCAoSVAgKyBob3N0bmFtZSkuCi0JYWNjZXB0KCR0YWxrLCBJTkJPVU5EKSB8fCBkaWUgIkVycm9yIEFjY2VwdGluZzogJCFcbiI7Ci0JICMgZGlzYWJsZSBJL08gYnVmZmVyaW5nIGp1c3QgaW4gY2FzZQotCSR0YWxrLT5hdXRvZmx1c2g7Ci0JICMgd2hpbGUgdGhlIHBhcmVudCBrZWVwcyBzZW5kaW5nIGRhdGEsIHdlIGtlZXAgcmVzcG9uZGluZy4uCi0Jd2hpbGUoKCRpcCA9ICR0YWxrLT5nZXRsaW5lKSkgewotCQljaG9tcCgkaXApOwotCQkgIyByZXNvbHZlIHRoZSBJUCBpZiB0aW1lIHBlcm1pdHMgYW5kIHNlbmQgYmFjayB3aGF0IHdlIGZvdW5kLi4KLQkJJHNlbmRfYmFjayA9IHNwcmludGYoIiVzfCVzIiwgJGlwLCAmbnNsb29rdXAoJGlwKSk7Ci0JCSR0YWxrLT5wcmludCgkc2VuZF9iYWNrLiJcbiIpOwotCX0KLX0KLQotIyBwZXJmb3JtIGEgdGltZSByZXN0cmljdGVkIGhvc3RuYW1lIGxvb2t1cC4KLXN1YiBuc2xvb2t1cCB7Ci0JICMgZ2V0IHRoZSBJUCBhcyBhbiBhcmcKLQlteSAkaXAgPSBzaGlmdDsKLQlteSAkaG9zdG5hbWUgPSB1bmRlZjsKLQotCSAjIGRvIHRoZSBob3N0bmFtZSBsb29rdXAgaW5zaWRlIGFuIGV2YWwuIFRoZSBldmFsIHdpbGwgdXNlIHRoZQotCSAjIGFscmVhZHkgY29uZmlndXJlZCBTSUduYWwgaGFuZGxlciBhbmQgZHJvcCBvdXQgb2YgdGhlIHt9IGJsb2NrCi0JICMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBhbGFybSBvY2N1cmVkIG9yIG5vdC4KLQlldmFsIHsKLQkJYWxhcm0oJFRJTUVPVVQpOwotCQkkaG9zdG5hbWUgPSBnZXRob3N0YnlhZGRyKGdldGhvc3RieW5hbWUoJGlwKSwgQUZfSU5FVCk7Ci0JCWFsYXJtKDApOwotCX07Ci0JaWYgKCRAID1+IC9hbGFybS8pIHsKLQkJICMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcGVyaGFwcy4uCi0JCSMgcHJpbnQgImFsYXJtaW5nLCBpc24ndCBpdD8gKCRpcCkiOwotCX0KLQotCSAjIHJldHVybiB0aGUgaG9zdG5hbWUgb3IgdGhlIElQIGFkZHJlc3MgaXRzZWxmIGlmIHRoZXJlIGlzIG5vIGhvc3RuYW1lCi0JJGhvc3RuYW1lIG5lICIiID8gJGhvc3RuYW1lIDogJGlwOwotfQotCi0KZGlmZiAtLWdpdCBhL3N1cHBvcnQvcGhmX2FidXNlX2xvZy5jZ2kgYi9zdXBwb3J0L3BoZl9hYnVzZV9sb2cuY2dpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UyNzQ5Li4wMDAwMDAwCi0tLSBhL3N1cHBvcnQvcGhmX2FidXNlX2xvZy5jZ2kKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIS91c3IvbG9jYWwvYmluL3BlcmwKLQotIyBUaGlzIHNjcmlwdCBjYW4gYmUgdXNlZCB0byBkZXRlY3QgcGVvcGxlIHRyeWluZyB0byBhYnVzZSB0aGUgc2VjdXJpdHkgaG9sZSB3aGljaAotIyBleGlzdGVkIGluIEEgQ0dJIHNjcmlwdCBkaXJlc3RyaWJ1dGVkIHdpdGggQXBhY2hlIDEuMC4zIGFuZCBlYXJsaWVyIHZlcnNpb25zLgotIyBZb3UgY2FuIHJlZGlyZWN0IHRoZW0gdG8gaGVyZSB1c2luZyB0aGUgIjxMb2NhdGlvbiAvY2dpLWJpbi9waGYqPiIgc3VnZ2VzdGlvbiBpbgotIyBodHRwZC5jb25mLiAgCi0jCi0jIFRoZSBmb3JtYXQgbG9nZ2VkIHRvIGlzICJbZGF0ZV0gcmVtb3RlX2FkZHIgcmVtb3RlX2hvc3QgW2RhdGVdIHJlZmVycmVyIHVzZXJfYWdlbnQiLgotCi0kTE9HID0gIi92YXIvbG9nL3BoZl9sb2ciOwotCi1yZXF1aXJlICJjdGltZS5wbCI7Ci0kd2hlbiA9ICZjdGltZSh0aW1lKTsKLSR3aGVuID1+IHMvXG4vL2dvOwotJEVOVntIVFRQX1VTRVJfQUdFTlR9IC49ICIgdmlhICRFTlZ7SFRUUF9WSUF9IiBpZigkRU5We0hUVFBfVklBfSk7Ci0KLW9wZW4oTE9HLCAiPj4kTE9HIikgfHwgZGllICJib28gaG9vLCBwaGZfbG9nICQhIjsKLXByaW50IExPRyAiWyR3aGVuXSAkRU5We1JFTU9URV9BRERSfSAkRU5We1JFTU9URV9IT1NUfSAkRU5WeyRIVFRQX1JFRkVSRVJ9ICRFTlZ7SFRUUF9VU0VSX0FHRU5UfVxuIjsKLWNsb3NlKExPRyk7Ci0KLXByaW50ICJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxyXG5cclxuPEJMSU5LPlNtaWxlLCB5b3UncmUgb24gQ2FuZGlkIENhbWVyYS48L0JMSU5LPlxuIjsKZGlmZiAtLWdpdCBhL3N1cHBvcnQvcm90YXRlbG9ncy5jIGIvc3VwcG9ydC9yb3RhdGVsb2dzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNmJkOTcuLjAwMDAwMDAKLS0tIGEvc3VwcG9ydC9yb3RhdGVsb2dzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogU2ltcGxlIHByb2dyYW0gdG8gcm90YXRlIEFwYWNoZSBsb2dzIHdpdGhvdXQgaGF2aW5nIHRvIGtpbGwgdGhlIHNlcnZlci4KLSAqCi0gKiBDb250cmlidXRlZCBieSBCZW4gTGF1cmllIDxiZW5AYWxncm91cC5jby51az4KLSAqCi0gKiAxMiBNYXIgMTk5NgotICovCi0KLQotI2RlZmluZSBCVUZTSVpFCQk2NTUzNgotI2RlZmluZSBNQVhfUEFUSAkxMDI0Ci0KLSNpbmNsdWRlICJhcF9jb25maWcuaCIKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotCi1pbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGNoYXIgYnVmW0JVRlNJWkVdLCBidWYyW01BWF9QQVRIXTsKLSAgICB0aW1lX3QgdExvZ0VuZCA9IDA7Ci0gICAgdGltZV90IHRSb3RhdGlvbjsKLSAgICBpbnQgbkxvZ0ZEID0gLTE7Ci0gICAgaW50IG5SZWFkOwotICAgIGNoYXIgKnN6TG9nUm9vdDsKLQotICAgIGlmIChhcmdjICE9IDMpIHsKLQlmcHJpbnRmKHN0ZGVyciwKLQkJIiVzIDxsb2dmaWxlPiA8cm90YXRpb24gdGltZSBpbiBzZWNvbmRzPlxuXG4iLAotCQlhcmd2WzBdKTsKLSNpZmRlZiBPUzIKLQlmcHJpbnRmKHN0ZGVyciwKLQkJIkFkZCB0aGlzOlxuXG5UcmFuc2ZlckxvZyBcInwlcy5leGUgL3NvbWUvd2hlcmUgODY0MDBcIlxuXG4iLAotCQlhcmd2WzBdKTsKLSNlbHNlCi0JZnByaW50ZihzdGRlcnIsCi0JCSJBZGQgdGhpczpcblxuVHJhbnNmZXJMb2cgXCJ8JXMgL3NvbWUvd2hlcmUgODY0MDBcIlxuXG4iLAotCQlhcmd2WzBdKTsKLSNlbmRpZgotCWZwcmludGYoc3RkZXJyLAotCQkidG8gaHR0cGQuY29uZi4gVGhlIGdlbmVyYXRlZCBuYW1lIHdpbGwgYmUgL3NvbWUvd2hlcmUubm5ubiAiCi0JCSJ3aGVyZSBubm5uIGlzIHRoZVxuc3lzdGVtIHRpbWUgYXQgd2hpY2ggdGhlIGxvZyBub21pbmFsbHkgIgotCQkic3RhcnRzIChOLkIuIHRoaXMgdGltZSB3aWxsIGFsd2F5cyBiZSBhXG5tdWx0aXBsZSBvZiB0aGUgIgotCQkicm90YXRpb24gdGltZSwgc28geW91IGNhbiBzeW5jaHJvbml6ZSBjcm9uIHNjcmlwdHMgd2l0aCBpdCkuXG4iCi0JCSJBdCB0aGUgZW5kIG9mIGVhY2ggcm90YXRpb24gdGltZSBhIG5ldyBsb2cgaXMgc3RhcnRlZC5cbiIpOwotCWV4aXQoMSk7Ci0gICAgfQotCi0gICAgc3pMb2dSb290ID0gYXJndlsxXTsKLSAgICB0Um90YXRpb24gPSBhdG9pKGFyZ3ZbMl0pOwotICAgIGlmICh0Um90YXRpb24gPD0gMCkgewotCWZwcmludGYoc3RkZXJyLCAiUm90YXRpb24gdGltZSBtdXN0IGJlID4gMFxuIik7Ci0JZXhpdCg2KTsKLSAgICB9Ci0KLSAgICBmb3IgKDs7KSB7Ci0JblJlYWQgPSByZWFkKDAsIGJ1Ziwgc2l6ZW9mIGJ1Zik7Ci0JaWYgKG5SZWFkID09IDApCi0JICAgIGV4aXQoMyk7Ci0JaWYgKG5SZWFkIDwgMCkKLQkgICAgaWYgKGVycm5vICE9IEVJTlRSKQotCQlleGl0KDQpOwotCWlmIChuTG9nRkQgPj0gMCAmJiAodGltZShOVUxMKSA+PSB0TG9nRW5kIHx8IG5SZWFkIDwgMCkpIHsKLQkgICAgY2xvc2UobkxvZ0ZEKTsKLQkgICAgbkxvZ0ZEID0gLTE7Ci0JfQotCWlmIChuTG9nRkQgPCAwKSB7Ci0JICAgIHRpbWVfdCB0TG9nU3RhcnQgPSAodGltZShOVUxMKSAvIHRSb3RhdGlvbikgKiB0Um90YXRpb247Ci0JICAgIHNwcmludGYoYnVmMiwgIiVzLiUwMTBkIiwgc3pMb2dSb290LCAoaW50KSB0TG9nU3RhcnQpOwotCSAgICB0TG9nRW5kID0gdExvZ1N0YXJ0ICsgdFJvdGF0aW9uOwotCSAgICBuTG9nRkQgPSBvcGVuKGJ1ZjIsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fQVBQRU5ELCAwNjY2KTsKLQkgICAgaWYgKG5Mb2dGRCA8IDApIHsKLQkJcGVycm9yKGJ1ZjIpOwotCQlleGl0KDIpOwotCSAgICB9Ci0JfQotCWlmICh3cml0ZShuTG9nRkQsIGJ1ZiwgblJlYWQpICE9IG5SZWFkKSB7Ci0JICAgIHBlcnJvcihidWYyKTsKLQkgICAgZXhpdCg1KTsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9zcGxpdC1sb2dmaWxlIGIvc3VwcG9ydC9zcGxpdC1sb2dmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2M0NjUyLi4wMDAwMDAwCi0tLSBhL3N1cHBvcnQvc3BsaXQtbG9nZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0jIS91c3IvbG9jYWwvYmluL3BlcmwKLSMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgVGhlIEFwYWNoZSBHcm91cC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSMgYXJlIG1ldDoKLSMKLSMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSMKLSMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0jICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgICAgZGlzdHJpYnV0aW9uLgotIwotIyAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSMgICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0jICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSMgICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSMKLSMgNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotIyAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotIyAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBGb3IgcGVybWlzc2lvbiBwbGVhc2UgY29udGFjdAotIyAgICBBcGFjaGVAQXBhY2hlLk9yZy4KLSMKLSMgNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSMgICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCi0jICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSMKLSMgNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZwotIyAgICBhY2tub3dsZWRnbWVudDoKLSMgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotIyAgICBmb3IgdXNlIGluIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIgcHJvamVjdCAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSMgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSMgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSMgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0jIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0jIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSMgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotIyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0jIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSMgaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0jIG9uIHB1YmxpYyBkb21haW4gc29mdHdhcmUgd3JpdHRlbiBhdCB0aGUgTmF0aW9uYWwgQ2VudGVyIGZvcgotIyBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0jIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSMgcHJvamVjdCwgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0jCi0KLSMKLSMgVGhpcyBzY3JpcHQgd2lsbCB0YWtlIGEgY29tYmluZWQgV2ViIHNlcnZlciBhY2Nlc3MKLSMgbG9nIGZpbGUgYW5kIGJyZWFrIGl0cyBjb250ZW50cyBpbnRvIHNlcGFyYXRlIGZpbGVzLgotIyBJdCBhc3N1bWVzIHRoYXQgdGhlIGZpcnN0IGZpZWxkIG9mIGVhY2ggbGluZSBpcyB0aGUKLSMgdmlydHVhbCBob3N0IGlkZW50aXR5IChwdXQgdGhlcmUgYnkgIiV2IiksIGFuZCB0aGF0Ci0jIHRoZSBsb2dmaWxlcyBzaG91bGQgYmUgbmFtZWQgdGhhdCsiLmxvZyIgaW4gdGhlIGN1cnJlbnQKLSMgZGlyZWN0b3J5LgotIwotIyBUaGUgY29tYmluZWQgbG9nIGZpbGUgaXMgcmVhZCBmcm9tIHN0ZGluLiBSZWNvcmRzIHJlYWQKLSMgd2lsbCBiZSBhcHBlbmRlZCB0byBhbnkgZXhpc3RpbmcgbG9nIGZpbGVzLgotIwotJWlzX29wZW4gPSAoKTsKLQotd2hpbGUgKCRsb2dfbGluZSA9IDxTVERJTj4pIHsKLSAgICAjCi0gICAgIyBHZXQgdGhlIGZpcnN0IHRva2VuIGZyb20gdGhlIGxvZyByZWNvcmQ7IGl0J3MgdGhlCi0gICAgIyBpZGVudGl0eSBvZiB0aGUgdmlydHVhbCBob3N0IHRvIHdoaWNoIHRoZSByZWNvcmQKLSAgICAjIGFwcGxpZXMuCi0gICAgIwotICAgICgkdmhvc3QpID0gc3BsaXQgKC9ccy8sICRsb2dfbGluZSk7Ci0gICAgIwotICAgICMgTm9ybWFsaXplIHRoZSB2aXJ0dWFsIGhvc3QgbmFtZSB0byBhbGwgbG93ZXJjYXNlLgotICAgICMgSWYgaXQncyBibGFuaywgdGhlIHJlcXVlc3Qgd2FzIGhhbmRsZWQgYnkgdGhlIGRlZmF1bHQKLSAgICAjIHNlcnZlciwgc28gc3VwcGx5IGEgZGVmYXVsdCBuYW1lLiAgVGhpcyBzaG91bGRuJ3QKLSAgICAjIGhhcHBlbiwgYnV0IGNhdXRpb24gcm9ja3MuCi0gICAgIwotICAgICR2aG9zdCA9IGxjICgkdmhvc3QpIG9yICJhY2Nlc3MiOwotICAgICMKLSAgICAjIElmIHRoZSBsb2cgZmlsZSBmb3IgdGhpcyB2aXJ0dWFsIGhvc3QgaXNuJ3Qgb3BlbmVkCi0gICAgIyB5ZXQsIGRvIGl0IG5vdy4KLSAgICAjCi0gICAgaWYgKCEgJGlzX29wZW57JHZob3N0fSkgewotICAgICAgICBvcGVuICR2aG9zdCwgIj4+JHt2aG9zdH0ubG9nIgotICAgICAgICAgICAgb3IgZGllICgiQ2FuJ3Qgb3BlbiAke3Zob3N0fS5sb2ciKTsKLSAgICAgICAgJGlzX29wZW57JHZob3N0fSA9IDE7Ci0gICAgfQotICAgICMKLSAgICAjIFN0cmlwIG9mZiB0aGUgZmlyc3QgdG9rZW4gKHdoaWNoIG1heSBiZSBudWxsIGluIHRoZQotICAgICMgY2FzZSBvZiB0aGUgZGVmYXVsdCBzZXJ2ZXIpLCBhbmQgd3JpdGUgdGhlIGVkaXRlZAotICAgICMgcmVjb3JkIHRvIHRoZSBjdXJyZW50IGxvZyBmaWxlLgotICAgICMKLSAgICAkbG9nX2xpbmUgPX4gcy9eXFMqXHMrLy87Ci0gICAgcHJpbnRmICR2aG9zdCAiJXMiLCAkbG9nX2xpbmU7Ci19Ci1leGl0IDA7CmRpZmYgLS1naXQgYS9zdXBwb3J0L3N1ZXhlYy5jIGIvc3VwcG9ydC9zdWV4ZWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNmM2ZjYy4uMDAwMDAwMAotLS0gYS9zdXBwb3J0L3N1ZXhlYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTY2ICswLDAgQEAKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5OSBUaGUgQXBhY2hlIEdyb3VwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogNC4gVGhlIG5hbWVzICJBcGFjaGUgU2VydmVyIiBhbmQgIkFwYWNoZSBHcm91cCIgbXVzdCBub3QgYmUgdXNlZCB0bwotICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKLSAqICAgIGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBHcm91cC4KLSAqCi0gKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCi0gKiAgICBhY2tub3dsZWRnbWVudDoKLSAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBBcGFjaGUgR3JvdXAKLSAqICAgIGZvciB1c2UgaW4gdGhlIEFwYWNoZSBIVFRQIHNlcnZlciBwcm9qZWN0IChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVBBQ0hFIEdST1VQIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIEdST1VQIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB3YXMgb3JpZ2luYWxseSBiYXNlZAotICogb24gcHVibGljIGRvbWFpbiBzb2Z0d2FyZSB3cml0dGVuIGF0IHRoZSBOYXRpb25hbCBDZW50ZXIgZm9yCi0gKiBTdXBlcmNvbXB1dGluZyBBcHBsaWNhdGlvbnMsIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMsIFVyYmFuYS1DaGFtcGFpZ24uCi0gKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIEdyb3VwIGFuZCB0aGUgQXBhY2hlIEhUVFAgc2VydmVyCi0gKiBwcm9qZWN0LCBwbGVhc2Ugc2VlIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKi8KLQotLyoKLSAqIHN1ZXhlYy5jIC0tICJXcmFwcGVyIiBzdXBwb3J0IHByb2dyYW0gZm9yIHN1RVhFQyBiZWhhdmlvdXIgZm9yIEFwYWNoZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE5PVEUhIDogRE8gTk9UIGVkaXQgdGhpcyBjb2RlISEhICBVbmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLAotICogICAgICAgICBlZGl0aW5nIHRoaXMgY29kZSBtaWdodCBvcGVuIHVwIHlvdXIgc3lzdGVtIGluIHVuZXhwZWN0ZWQgCi0gKiAgICAgICAgIHdheXMgdG8gd291bGQtYmUgY3JhY2tlcnMuICBFdmVyeSBwcmVjYXV0aW9uIGhhcyBiZWVuIHRha2VuIAotICogICAgICAgICB0byBtYWtlIHRoaXMgY29kZSBhcyBzYWZlIGFzIHBvc3NpYmxlOyBhbHRlciBpdCBhdCB5b3VyIG93bgotICogICAgICAgICByaXNrLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqCi0gKi8KLQotI2luY2x1ZGUgImFwX2NvbmZpZy5oIgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2luY2x1ZGUgInN1ZXhlYy5oIgotCi0vKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUaGVyZSBpcyBubyBpbml0Z3JvdXBzKCkgaW4gUU5YLCBzbyBJIGJlbGlldmUgdGhpcyBpcyBzYWZlIDotKQotICogVXNlIGNjIC1vc3VleGVjIC0zIC1PIC1tZiAtRFFOWCBzdWV4ZWMuYyB0byBjb21waWxlLgotICoKLSAqIE1heSAxNywgMTk5Ny4KLSAqIElnb3IgTi4gS292YWxlbmtvIC0tIGluZm9oQG1haWwud3BsdXMubmV0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaWYgZGVmaW5lZChORUVEX0lOSVRHUk9VUFMpCi1pbnQgaW5pdGdyb3Vwcyhjb25zdCBjaGFyICpuYW1lLCBnaWRfdCBiYXNlZ2lkKQotewotLyogUU5YIGFuZCBNUEUgZG8gbm90IGFwcGVhciB0byBzdXBwb3J0IHN1cHBsZW1lbnRhcnkgZ3JvdXBzLiAqLwotICAgIHJldHVybiAwOwotfQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFBBVEhfTUFYKQotI2RlZmluZSBBUF9NQVhQQVRIIFBBVEhfTUFYCi0jZWxpZiBkZWZpbmVkKE1BWFBBVEhMRU4pCi0jZGVmaW5lIEFQX01BWFBBVEggTUFYUEFUSExFTgotI2Vsc2UKLSNkZWZpbmUgQVBfTUFYUEFUSCA4MTkyCi0jZW5kaWYKLQotI2RlZmluZSBBUF9FTlZCVUYgMjU2Ci0KLWV4dGVybiBjaGFyICoqZW52aXJvbjsKLXN0YXRpYyBGSUxFICpsb2cgPSBOVUxMOwotCi1jaGFyICpzYWZlX2Vudl9sc3RbXSA9Ci17Ci0gICAgIkFVVEhfVFlQRSIsCi0gICAgIkNPTlRFTlRfTEVOR1RIIiwKLSAgICAiQ09OVEVOVF9UWVBFIiwKLSAgICAiREFURV9HTVQiLAotICAgICJEQVRFX0xPQ0FMIiwKLSAgICAiRE9DVU1FTlRfTkFNRSIsCi0gICAgIkRPQ1VNRU5UX1BBVEhfSU5GTyIsCi0gICAgIkRPQ1VNRU5UX1JPT1QiLAotICAgICJET0NVTUVOVF9VUkkiLAotICAgICJGSUxFUEFUSF9JTkZPIiwKLSAgICAiR0FURVdBWV9JTlRFUkZBQ0UiLAotICAgICJMQVNUX01PRElGSUVEIiwKLSAgICAiUEFUSF9JTkZPIiwKLSAgICAiUEFUSF9UUkFOU0xBVEVEIiwKLSAgICAiUVVFUllfU1RSSU5HIiwKLSAgICAiUVVFUllfU1RSSU5HX1VORVNDQVBFRCIsCi0gICAgIlJFTU9URV9BRERSIiwKLSAgICAiUkVNT1RFX0hPU1QiLAotICAgICJSRU1PVEVfSURFTlQiLAotICAgICJSRU1PVEVfUE9SVCIsCi0gICAgIlJFTU9URV9VU0VSIiwKLSAgICAiUkVESVJFQ1RfUVVFUllfU1RSSU5HIiwKLSAgICAiUkVESVJFQ1RfU1RBVFVTIiwKLSAgICAiUkVESVJFQ1RfVVJMIiwKLSAgICAiUkVRVUVTVF9NRVRIT0QiLAotICAgICJSRVFVRVNUX1VSSSIsCi0gICAgIlNDUklQVF9GSUxFTkFNRSIsCi0gICAgIlNDUklQVF9OQU1FIiwKLSAgICAiU0NSSVBUX1VSSSIsCi0gICAgIlNDUklQVF9VUkwiLAotICAgICJTRVJWRVJfQURNSU4iLAotICAgICJTRVJWRVJfTkFNRSIsCi0gICAgIlNFUlZFUl9BRERSIiwKLSAgICAiU0VSVkVSX1BPUlQiLAotICAgICJTRVJWRVJfUFJPVE9DT0wiLAotICAgICJTRVJWRVJfU09GVFdBUkUiLAotICAgICJVTklRVUVfSUQiLAotICAgICJVU0VSX05BTUUiLAotICAgICJUWiIsCi0gICAgTlVMTAotfTsKLQotCi1zdGF0aWMgdm9pZCBlcnJfb3V0cHV0KGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKLXsKLSNpZmRlZiBMT0dfRVhFQwotICAgIHRpbWVfdCB0aW1ldmFyOwotICAgIHN0cnVjdCB0bSAqbHQ7Ci0KLSAgICBpZiAoIWxvZykgewotCWlmICgobG9nID0gZm9wZW4oTE9HX0VYRUMsICJhIikpID09IE5VTEwpIHsKLQkgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gb3BlbiBsb2cgZmlsZVxuIik7Ci0JICAgIHBlcnJvcigiZm9wZW4iKTsKLQkgICAgZXhpdCgxKTsKLQl9Ci0gICAgfQotCi0gICAgdGltZSgmdGltZXZhcik7Ci0gICAgbHQgPSBsb2NhbHRpbWUoJnRpbWV2YXIpOwotCi0gICAgZnByaW50Zihsb2csICJbJWQtJS4yZC0lLjJkICUuMmQ6JS4yZDolLjJkXTogIiwKLQkgICAgbHQtPnRtX3llYXIgKyAxOTAwLCBsdC0+dG1fbW9uICsgMSwgbHQtPnRtX21kYXksCi0JICAgIGx0LT50bV9ob3VyLCBsdC0+dG1fbWluLCBsdC0+dG1fc2VjKTsKLQotICAgIHZmcHJpbnRmKGxvZywgZm10LCBhcCk7Ci0KLSAgICBmZmx1c2gobG9nKTsKLSNlbmRpZiAvKiBMT0dfRVhFQyAqLwotICAgIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgbG9nX2Vycihjb25zdCBjaGFyICpmbXQsLi4uKQotewotI2lmZGVmIExPR19FWEVDCi0gICAgdmFfbGlzdCBhcDsKLQotICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwotICAgIGVycl9vdXRwdXQoZm10LCBhcCk7Ci0gICAgdmFfZW5kKGFwKTsKLSNlbmRpZiAvKiBMT0dfRVhFQyAqLwotICAgIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgY2xlYW5fZW52KHZvaWQpCi17Ci0gICAgY2hhciBwYXRoYnVmWzUxMl07Ci0gICAgY2hhciAqKmNsZWFuZW52OwotICAgIGNoYXIgKiplcDsKLSAgICBpbnQgY2lkeCA9IDA7Ci0gICAgaW50IGlkeDsKLQotCi0gICAgaWYgKChjbGVhbmVudiA9IChjaGFyICoqKSBjYWxsb2MoQVBfRU5WQlVGLCBzaXplb2YoY2hhciAqKSkpID09IE5VTEwpIHsKLSAgICAgICAgbG9nX2VycigiZmFpbGVkIHRvIG1hbGxvYyBtZW1vcnkgZm9yIGVudmlyb25tZW50XG4iKTsKLQlleGl0KDEyMCk7Ci0gICAgfQotCi0gICAgc3ByaW50ZihwYXRoYnVmLCAiUEFUSD0lcyIsIFNBRkVfUEFUSCk7Ci0gICAgY2xlYW5lbnZbY2lkeF0gPSBzdHJkdXAocGF0aGJ1Zik7Ci0gICAgY2lkeCsrOwotCi0gICAgZm9yIChlcCA9IGVudmlyb247ICplcCAmJiBjaWR4IDwgQVBfRU5WQlVGLTE7IGVwKyspIHsKLQlpZiAoIXN0cm5jbXAoKmVwLCAiSFRUUF8iLCA1KSkgewotCSAgICBjbGVhbmVudltjaWR4XSA9ICplcDsKLQkgICAgY2lkeCsrOwotCX0KLQllbHNlIHsKLQkgICAgZm9yIChpZHggPSAwOyBzYWZlX2Vudl9sc3RbaWR4XTsgaWR4KyspIHsKLQkJaWYgKCFzdHJuY21wKCplcCwgc2FmZV9lbnZfbHN0W2lkeF0sCi0JCQkgICAgIHN0cmxlbihzYWZlX2Vudl9sc3RbaWR4XSkpKSB7Ci0JCSAgICBjbGVhbmVudltjaWR4XSA9ICplcDsKLQkJICAgIGNpZHgrKzsKLQkJICAgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgY2xlYW5lbnZbY2lkeF0gPSBOVUxMOwotCi0gICAgZW52aXJvbiA9IGNsZWFuZW52OwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICAgIGludCB1c2VyZGlyID0gMDsJCS8qIH51c2VyZGlyIGZsYWcgICAgICAgICAgICAgKi8KLSAgICB1aWRfdCB1aWQ7CQkJLyogdXNlciBpbmZvcm1hdGlvbiAgICAgICAgICAqLwotICAgIGdpZF90IGdpZDsJCQkvKiB0YXJnZXQgZ3JvdXAgcGxhY2Vob2xkZXIgICovCi0gICAgY2hhciAqdGFyZ2V0X3VuYW1lOwkJLyogdGFyZ2V0IHVzZXIgbmFtZSAgICAgICAgICAqLwotICAgIGNoYXIgKnRhcmdldF9nbmFtZTsJCS8qIHRhcmdldCBncm91cCBuYW1lICAgICAgICAgKi8KLSAgICBjaGFyICp0YXJnZXRfaG9tZWRpcjsJLyogdGFyZ2V0IGhvbWUgZGlyZWN0b3J5ICAgICAqLwotICAgIGNoYXIgKmFjdHVhbF91bmFtZTsJCS8qIGFjdHVhbCB1c2VyIG5hbWUgICAgICAgICAgKi8KLSAgICBjaGFyICphY3R1YWxfZ25hbWU7CQkvKiBhY3R1YWwgZ3JvdXAgbmFtZSAgICAgICAgICovCi0gICAgY2hhciAqcHJvZzsJCQkvKiBuYW1lIG9mIHRoaXMgcHJvZ3JhbSAgICAgICovCi0gICAgY2hhciAqY21kOwkJCS8qIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQgICAgKi8KLSAgICBjaGFyIGN3ZFtBUF9NQVhQQVRIXTsJLyogY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAqLwotICAgIGNoYXIgZHdkW0FQX01BWFBBVEhdOwkvKiBkb2Nyb290IHdvcmtpbmcgZGlyZWN0b3J5ICovCi0gICAgc3RydWN0IHBhc3N3ZCAqcHc7CQkvKiBwYXNzd29yZCBlbnRyeSBob2xkZXIgICAgICovCi0gICAgc3RydWN0IGdyb3VwICpncjsJCS8qIGdyb3VwIGVudHJ5IGhvbGRlciAgICAgICAgKi8KLSAgICBzdHJ1Y3Qgc3RhdCBkaXJfaW5mbzsJLyogZGlyZWN0b3J5IGluZm8gaG9sZGVyICAgICAqLwotICAgIHN0cnVjdCBzdGF0IHByZ19pbmZvOwkvKiBwcm9ncmFtIGluZm8gaG9sZGVyICAgICAgICovCi0KLSAgICAvKgotICAgICAqIElmIHRoZXJlIGFyZSBhIHByb3BlciBudW1iZXIgb2YgYXJndW1lbnRzLCBzZXQKLSAgICAgKiBhbGwgb2YgdGhlbSB0byB2YXJpYWJsZXMuICBPdGhlcndpc2UsIGVycm9yIG91dC4KLSAgICAgKi8KLSAgICBwcm9nID0gYXJndlswXTsKLSAgICBpZiAoYXJnYyA8IDQpIHsKLQlsb2dfZXJyKCJ0b28gZmV3IGFyZ3VtZW50c1xuIik7Ci0JZXhpdCgxMDEpOwotICAgIH0KLSAgICB0YXJnZXRfdW5hbWUgPSBhcmd2WzFdOwotICAgIHRhcmdldF9nbmFtZSA9IGFyZ3ZbMl07Ci0gICAgY21kID0gYXJndlszXTsKLQotICAgIC8qCi0gICAgICogQ2hlY2sgZXhpc3RlbmNlL3ZhbGlkaXR5IG9mIHRoZSBVSUQgb2YgdGhlIHVzZXIKLSAgICAgKiBydW5uaW5nIHRoaXMgcHJvZ3JhbS4gIEVycm9yIG91dCBpZiBpbnZhbGlkLgotICAgICAqLwotICAgIHVpZCA9IGdldHVpZCgpOwotICAgIGlmICgocHcgPSBnZXRwd3VpZCh1aWQpKSA9PSBOVUxMKSB7Ci0JbG9nX2VycigiaW52YWxpZCB1aWQ6ICglbGQpXG4iLCB1aWQpOwotCWV4aXQoMTAyKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgdXNlciBydW5uaW5nIHRoaXMgcHJvZ3JhbQotICAgICAqIGlzIHRoZSB1c2VyIGFsbG93ZWQgdG8gZG8gc28gYXMgZGVmaW5lZCBpbgotICAgICAqIHN1ZXhlYy5oLiAgSWYgbm90IHRoZSBhbGxvd2VkIHVzZXIsIGVycm9yIG91dC4KLSAgICAgKi8KLSNpZmRlZiBfT1NEX1BPU0lYCi0gICAgLyogVXNlciBuYW1lIGNvbXBhcmlzb25zIGFyZSBjYXNlIGluc2Vuc2l0aXZlIG9uIEJTMjAwMC9PU0QgKi8KLSAgICBpZiAoc3RyY2FzZWNtcChIVFRQRF9VU0VSLCBwdy0+cHdfbmFtZSkpIHsKLSAgICAgICAgbG9nX2VycigidXNlciBtaXNtYXRjaCAoJXMgaW5zdGVhZCBvZiAlcylcbiIsIHB3LT5wd19uYW1lLCBIVFRQRF9VU0VSKTsKLQlleGl0KDEwMyk7Ci0gICAgfQotI2Vsc2UgIC8qX09TRF9QT1NJWCovCi0gICAgaWYgKHN0cmNtcChIVFRQRF9VU0VSLCBwdy0+cHdfbmFtZSkpIHsKLSAgICAgICAgbG9nX2VycigidXNlciBtaXNtYXRjaCAoJXMgaW5zdGVhZCBvZiAlcylcbiIsIHB3LT5wd19uYW1lLCBIVFRQRF9VU0VSKTsKLQlleGl0KDEwMyk7Ci0gICAgfQotI2VuZGlmIC8qX09TRF9QT1NJWCovCi0KLSAgICAvKgotICAgICAqIENoZWNrIGZvciBhIGxlYWRpbmcgJy8nIChhYnNvbHV0ZSBwYXRoKSBpbiB0aGUgY29tbWFuZCB0byBiZSBleGVjdXRlZCwKLSAgICAgKiBvciBhdHRlbXB0cyB0byBiYWNrIHVwIG91dCBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnksCi0gICAgICogdG8gcHJvdGVjdCBhZ2FpbnN0IGF0dGFja3MuICBJZiBhbnkgYXJlCi0gICAgICogZm91bmQsIGVycm9yIG91dC4gIE5hdWdodHkgbmF1Z2h0eSBjcmFja2Vycy4KLSAgICAgKi8KLSAgICBpZiAoKGNtZFswXSA9PSAnLycpIHx8ICghc3RybmNtcChjbWQsICIuLi8iLCAzKSkKLQl8fCAoc3Ryc3RyKGNtZCwgIi8uLi8iKSAhPSBOVUxMKSkgewotICAgICAgICBsb2dfZXJyKCJpbnZhbGlkIGNvbW1hbmQgKCVzKVxuIiwgY21kKTsKLQlleGl0KDEwNCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhIH51c2VyZGlyIHJlcXVlc3QuICBJZgotICAgICAqIHNvLCBzZXQgdGhlIGZsYWcsIGFuZCByZW1vdmUgdGhlICd+JyBmcm9tIHRoZQotICAgICAqIHRhcmdldCB1c2VybmFtZS4KLSAgICAgKi8KLSAgICBpZiAoIXN0cm5jbXAoIn4iLCB0YXJnZXRfdW5hbWUsIDEpKSB7Ci0JdGFyZ2V0X3VuYW1lKys7Ci0JdXNlcmRpciA9IDE7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBFcnJvciBvdXQgaWYgdGhlIHRhcmdldCB1c2VybmFtZSBpcyBpbnZhbGlkLgotICAgICAqLwotICAgIGlmICgocHcgPSBnZXRwd25hbSh0YXJnZXRfdW5hbWUpKSA9PSBOVUxMKSB7Ci0JbG9nX2VycigiaW52YWxpZCB0YXJnZXQgdXNlciBuYW1lOiAoJXMpXG4iLCB0YXJnZXRfdW5hbWUpOwotCWV4aXQoMTA1KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEVycm9yIG91dCBpZiB0aGUgdGFyZ2V0IGdyb3VwIG5hbWUgaXMgaW52YWxpZC4KLSAgICAgKi8KLSAgICBpZiAoc3Ryc3BuKHRhcmdldF9nbmFtZSwgIjEyMzQ1Njc4OTAiKSAhPSBzdHJsZW4odGFyZ2V0X2duYW1lKSkgewotCWlmICgoZ3IgPSBnZXRncm5hbSh0YXJnZXRfZ25hbWUpKSA9PSBOVUxMKSB7Ci0JICAgIGxvZ19lcnIoImludmFsaWQgdGFyZ2V0IGdyb3VwIG5hbWU6ICglcylcbiIsIHRhcmdldF9nbmFtZSk7Ci0JICAgIGV4aXQoMTA2KTsKLQl9Ci0JZ2lkID0gZ3ItPmdyX2dpZDsKLQlhY3R1YWxfZ25hbWUgPSBzdHJkdXAoZ3ItPmdyX25hbWUpOwotICAgIH0KLSAgICBlbHNlIHsKLQlnaWQgPSBhdG9pKHRhcmdldF9nbmFtZSk7Ci0JYWN0dWFsX2duYW1lID0gc3RyZHVwKHRhcmdldF9nbmFtZSk7Ci0gICAgfQotCi0jaWZkZWYgX09TRF9QT1NJWAotICAgIC8qCi0gICAgICogSW5pdGlhbGl6ZSBCUzIwMDAgdXNlciBlbnZpcm9ubWVudAotICAgICAqLwotICAgIHsKLQlwaWRfdCBwaWQ7Ci0JaW50IHN0YXR1czsKLQotCXN3aXRjaCAocGlkID0gdWZvcmsodGFyZ2V0X3VuYW1lKSkKLQl7Ci0JY2FzZSAtMToJLyogRXJyb3IgKi8KLQkgICAgbG9nX2VycigiZmFpbGVkIHRvIHNldHVwIGJzMjAwMCBlbnZpcm9ubWVudCBmb3IgdXNlciAlczogJXNcbiIsCi0JCSAgICB0YXJnZXRfdW5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0JICAgIGV4aXQoMTUwKTsKLQljYXNlIDA6CS8qIENoaWxkICovCi0JICAgIGJyZWFrOwotCWRlZmF1bHQ6CS8qIEZhdGhlciAqLwotCSAgICB3aGlsZSAocGlkICE9IHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKSkKLQkJOwotCSAgICAvKiBAQEAgRklYTUU6IHNob3VsZCB3ZSBkZWFsIHdpdGggU1RPUCBzaWduYWxzIGFzIHdlbGw/ICovCi0JICAgIGlmIChXSUZTSUdOQUxFRChzdGF0dXMpKQotCQlraWxsIChnZXRwaWQoKSwgV1RFUk1TSUcoc3RhdHVzKSk7Ci0JICAgIGV4aXQoV0VYSVRTVEFUVVMoc3RhdHVzKSk7Ci0JfQotICAgIH0KLSNlbmRpZiAvKl9PU0RfUE9TSVgqLwotCi0gICAgLyoKLSAgICAgKiBTYXZlIHRoZXNlIGZvciBsYXRlciBzaW5jZSBpbml0Z3JvdXBzIHdpbGwgaG9zZSB0aGUgc3RydWN0Ci0gICAgICovCi0gICAgdWlkID0gcHctPnB3X3VpZDsKLSAgICBhY3R1YWxfdW5hbWUgPSBzdHJkdXAocHctPnB3X25hbWUpOwotICAgIHRhcmdldF9ob21lZGlyID0gc3RyZHVwKHB3LT5wd19kaXIpOwotCi0gICAgLyoKLSAgICAgKiBMb2cgdGhlIHRyYW5zYWN0aW9uIGhlcmUgdG8gYmUgc3VyZSB3ZSBoYXZlIGFuIG9wZW4gbG9nIAotICAgICAqIGJlZm9yZSB3ZSBzZXR1aWQoKS4KLSAgICAgKi8KLSAgICBsb2dfZXJyKCJ1aWQ6ICglcy8lcykgZ2lkOiAoJXMvJXMpIGNtZDogJXNcbiIsCi0JICAgIHRhcmdldF91bmFtZSwgYWN0dWFsX3VuYW1lLAotCSAgICB0YXJnZXRfZ25hbWUsIGFjdHVhbF9nbmFtZSwKLQkgICAgY21kKTsKLQotICAgIC8qCi0gICAgICogRXJyb3Igb3V0IGlmIGF0dGVtcHQgaXMgbWFkZSB0byBleGVjdXRlIGFzIHJvb3Qgb3IgYXMKLSAgICAgKiBhIFVJRCBsZXNzIHRoYW4gVUlEX01JTi4gIFRzayB0c2suCi0gICAgICovCi0gICAgaWYgKCh1aWQgPT0gMCkgfHwgKHVpZCA8IFVJRF9NSU4pKSB7Ci0JbG9nX2VycigiY2Fubm90IHJ1biBhcyBmb3JiaWRkZW4gdWlkICglZC8lcylcbiIsIHVpZCwgY21kKTsKLQlleGl0KDEwNyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBFcnJvciBvdXQgaWYgYXR0ZW1wdCBpcyBtYWRlIHRvIGV4ZWN1dGUgYXMgcm9vdCBncm91cAotICAgICAqIG9yIGFzIGEgR0lEIGxlc3MgdGhhbiBHSURfTUlOLiAgVHNrIHRzay4KLSAgICAgKi8KLSAgICBpZiAoKGdpZCA9PSAwKSB8fCAoZ2lkIDwgR0lEX01JTikpIHsKLQlsb2dfZXJyKCJjYW5ub3QgcnVuIGFzIGZvcmJpZGRlbiBnaWQgKCVkLyVzKVxuIiwgZ2lkLCBjbWQpOwotCWV4aXQoMTA4KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENoYW5nZSBVSUQvR0lEIGhlcmUgc28gdGhhdCB0aGUgZm9sbG93aW5nIHRlc3RzIHdvcmsgb3ZlciBORlMuCi0gICAgICoKLSAgICAgKiBJbml0aWFsaXplIHRoZSBncm91cCBhY2Nlc3MgbGlzdCBmb3IgdGhlIHRhcmdldCB1c2VyLAotICAgICAqIGFuZCBzZXRnaWQoKSB0byB0aGUgdGFyZ2V0IGdyb3VwLiBJZiB1bnN1Y2Nlc3NmdWwsIGVycm9yIG91dC4KLSAgICAgKi8KLSAgICBpZiAoKChzZXRnaWQoZ2lkKSkgIT0gMCkgfHwgKGluaXRncm91cHMoYWN0dWFsX3VuYW1lLCBnaWQpICE9IDApKSB7Ci0JbG9nX2VycigiZmFpbGVkIHRvIHNldGdpZCAoJWxkOiAlcylcbiIsIGdpZCwgY21kKTsKLQlleGl0KDEwOSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBzZXR1aWQoKSB0byB0aGUgdGFyZ2V0IHVzZXIuICBFcnJvciBvdXQgb24gZmFpbC4KLSAgICAgKi8KLSAgICBpZiAoKHNldHVpZCh1aWQpKSAhPSAwKSB7Ci0JbG9nX2VycigiZmFpbGVkIHRvIHNldHVpZCAoJWxkOiAlcylcbiIsIHVpZCwgY21kKTsKLQlleGl0KDExMCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBHZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIGFzIHdlbGwgYXMgdGhlIHByb3BlcgotICAgICAqIGRvY3VtZW50IHJvb3QgKGRlcGVuZGFudCB1cG9uIHdoZXRoZXIgb3Igbm90IGl0IGlzIGEKLSAgICAgKiB+dXNlcmRpciByZXF1ZXN0KS4gIEVycm9yIG91dCBpZiB3ZSBjYW5ub3QgZ2V0IGVpdGhlciBvbmUsCi0gICAgICogb3IgaWYgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaXMgbm90IGluIHRoZSBkb2Nyb290LgotICAgICAqIFVzZSBjaGRpcigpcyBhbmQgZ2V0Y3dkKClzIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggc3ltbGlua2VkCi0gICAgICogZGlyZWN0b3JpZXMuICBZdWNrLgotICAgICAqLwotICAgIGlmIChnZXRjd2QoY3dkLCBBUF9NQVhQQVRIKSA9PSBOVUxMKSB7Ci0JbG9nX2VycigiY2Fubm90IGdldCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5XG4iKTsKLQlleGl0KDExMSk7Ci0gICAgfQotCi0gICAgaWYgKHVzZXJkaXIpIHsKLQlpZiAoKChjaGRpcih0YXJnZXRfaG9tZWRpcikpICE9IDApIHx8Ci0JICAgICgoY2hkaXIoVVNFUkRJUl9TVUZGSVgpKSAhPSAwKSB8fAotCSAgICAoKGdldGN3ZChkd2QsIEFQX01BWFBBVEgpKSA9PSBOVUxMKSB8fAotCSAgICAoKGNoZGlyKGN3ZCkpICE9IDApKSB7Ci0JICAgIGxvZ19lcnIoImNhbm5vdCBnZXQgZG9jcm9vdCBpbmZvcm1hdGlvbiAoJXMpXG4iLCB0YXJnZXRfaG9tZWRpcik7Ci0JICAgIGV4aXQoMTEyKTsKLQl9Ci0gICAgfQotICAgIGVsc2UgewotCWlmICgoKGNoZGlyKERPQ19ST09UKSkgIT0gMCkgfHwKLQkgICAgKChnZXRjd2QoZHdkLCBBUF9NQVhQQVRIKSkgPT0gTlVMTCkgfHwKLQkgICAgKChjaGRpcihjd2QpKSAhPSAwKSkgewotCSAgICBsb2dfZXJyKCJjYW5ub3QgZ2V0IGRvY3Jvb3QgaW5mb3JtYXRpb24gKCVzKVxuIiwgRE9DX1JPT1QpOwotCSAgICBleGl0KDExMyk7Ci0JfQotICAgIH0KLQotICAgIGlmICgoc3RybmNtcChjd2QsIGR3ZCwgc3RybGVuKGR3ZCkpKSAhPSAwKSB7Ci0JbG9nX2VycigiY29tbWFuZCBub3QgaW4gZG9jcm9vdCAoJXMvJXMpXG4iLCBjd2QsIGNtZCk7Ci0JZXhpdCgxMTQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogU3RhdCB0aGUgY3dkIGFuZCB2ZXJpZnkgaXQgaXMgYSBkaXJlY3RvcnksIG9yIGVycm9yIG91dC4KLSAgICAgKi8KLSAgICBpZiAoKChsc3RhdChjd2QsICZkaXJfaW5mbykpICE9IDApIHx8ICEoU19JU0RJUihkaXJfaW5mby5zdF9tb2RlKSkpIHsKLQlsb2dfZXJyKCJjYW5ub3Qgc3RhdCBkaXJlY3Rvcnk6ICglcylcbiIsIGN3ZCk7Ci0JZXhpdCgxMTUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRXJyb3Igb3V0IGlmIGN3ZCBpcyB3cml0YWJsZSBieSBvdGhlcnMuCi0gICAgICovCi0gICAgaWYgKChkaXJfaW5mby5zdF9tb2RlICYgU19JV09USCkgfHwgKGRpcl9pbmZvLnN0X21vZGUgJiBTX0lXR1JQKSkgewotCWxvZ19lcnIoImRpcmVjdG9yeSBpcyB3cml0YWJsZSBieSBvdGhlcnM6ICglcylcbiIsIGN3ZCk7Ci0JZXhpdCgxMTYpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRXJyb3Igb3V0IGlmIHdlIGNhbm5vdCBzdGF0IHRoZSBwcm9ncmFtLgotICAgICAqLwotICAgIGlmICgoKGxzdGF0KGNtZCwgJnByZ19pbmZvKSkgIT0gMCkgfHwgKFNfSVNMTksocHJnX2luZm8uc3RfbW9kZSkpKSB7Ci0JbG9nX2VycigiY2Fubm90IHN0YXQgcHJvZ3JhbTogKCVzKVxuIiwgY21kKTsKLQlleGl0KDExNyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBFcnJvciBvdXQgaWYgdGhlIHByb2dyYW0gaXMgd3JpdGFibGUgYnkgb3RoZXJzLgotICAgICAqLwotICAgIGlmICgocHJnX2luZm8uc3RfbW9kZSAmIFNfSVdPVEgpIHx8IChwcmdfaW5mby5zdF9tb2RlICYgU19JV0dSUCkpIHsKLQlsb2dfZXJyKCJmaWxlIGlzIHdyaXRhYmxlIGJ5IG90aGVyczogKCVzLyVzKVxuIiwgY3dkLCBjbWQpOwotCWV4aXQoMTE4KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEVycm9yIG91dCBpZiB0aGUgZmlsZSBpcyBzZXR1aWQgb3Igc2V0Z2lkLgotICAgICAqLwotICAgIGlmICgocHJnX2luZm8uc3RfbW9kZSAmIFNfSVNVSUQpIHx8IChwcmdfaW5mby5zdF9tb2RlICYgU19JU0dJRCkpIHsKLQlsb2dfZXJyKCJmaWxlIGlzIGVpdGhlciBzZXR1aWQgb3Igc2V0Z2lkOiAoJXMvJXMpXG4iLCBjd2QsIGNtZCk7Ci0JZXhpdCgxMTkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRXJyb3Igb3V0IGlmIHRoZSB0YXJnZXQgbmFtZS9ncm91cCBpcyBkaWZmZXJlbnQgZnJvbQotICAgICAqIHRoZSBuYW1lL2dyb3VwIG9mIHRoZSBjd2Qgb3IgdGhlIHByb2dyYW0uCi0gICAgICovCi0gICAgaWYgKCh1aWQgIT0gZGlyX2luZm8uc3RfdWlkKSB8fAotCShnaWQgIT0gZGlyX2luZm8uc3RfZ2lkKSB8fAotCSh1aWQgIT0gcHJnX2luZm8uc3RfdWlkKSB8fAotCShnaWQgIT0gcHJnX2luZm8uc3RfZ2lkKSkgewotCWxvZ19lcnIoInRhcmdldCB1aWQvZ2lkICglbGQvJWxkKSBtaXNtYXRjaCAiCi0JCSJ3aXRoIGRpcmVjdG9yeSAoJWxkLyVsZCkgb3IgcHJvZ3JhbSAoJWxkLyVsZClcbiIsCi0JCXVpZCwgZ2lkLAotCQlkaXJfaW5mby5zdF91aWQsIGRpcl9pbmZvLnN0X2dpZCwKLQkJcHJnX2luZm8uc3RfdWlkLCBwcmdfaW5mby5zdF9naWQpOwotCWV4aXQoMTIwKTsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBFcnJvciBvdXQgaWYgdGhlIHByb2dyYW0gaXMgbm90IGV4ZWN1dGFibGUgZm9yIHRoZSB1c2VyLgotICAgICAqIE90aGVyd2lzZSwgc2hlIHdvbid0IGZpbmQgYW55IGVycm9yIGluIHRoZSBsb2dzIGV4Y2VwdCBmb3IKLSAgICAgKiAiW2Vycm9yXSBQcmVtYXR1cmUgZW5kIG9mIHNjcmlwdCBoZWFkZXJzOiAuLi4iCi0gICAgICovCi0gICAgaWYgKCEocHJnX2luZm8uc3RfbW9kZSAmIFNfSVhVU1IpKSB7Ci0JbG9nX2VycigiZmlsZSBoYXMgbm8gZXhlY3V0ZSBwZXJtaXNzaW9uOiAoJXMvJXMpXG4iLCBjd2QsIGNtZCk7Ci0JZXhpdCgxMjEpOwotICAgIH0KLQotICAgIGNsZWFuX2VudigpOwotCi0gICAgLyogCi0gICAgICogQmUgc3VyZSB0byBjbG9zZSB0aGUgbG9nIGZpbGUgc28gdGhlIENHSSBjYW4ndAotICAgICAqIG1lc3Mgd2l0aCBpdC4gIElmIHRoZSBleGVjIGZhaWxzLCBpdCB3aWxsIGJlIHJlb3BlbmVkIAotICAgICAqIGF1dG9tYXRpY2FsbHkgd2hlbiBsb2dfZXJyIGlzIGNhbGxlZC4gIE5vdGUgdGhhdCB0aGUgbG9nCi0gICAgICogbWlnaHQgbm90IGFjdHVhbGx5IGJlIG9wZW4gaWYgTE9HX0VYRUMgaXNuJ3QgZGVmaW5lZC4KLSAgICAgKiBIb3dldmVyLCB0aGUgImxvZyIgY2VsbCBpc24ndCBpZmRlZidkIHNvIGxldCdzIGJlIGRlZmVuc2l2ZQotICAgICAqIGFuZCBhc3N1bWUgc29tZW9uZSBtaWdodCBoYXZlIGRvbmUgc29tZXRoaW5nIHdpdGggaXQKLSAgICAgKiBvdXRzaWRlIGFuIGlmZGVmJ2QgTE9HX0VYRUMgYmxvY2suCi0gICAgICovCi0gICAgaWYgKGxvZyAhPSBOVUxMKSB7Ci0JZmNsb3NlKGxvZyk7Ci0JbG9nID0gTlVMTDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQsIHJlcGxhY2luZyBvdXIgaW1hZ2Ugd2l0aCBpdHMgb3duLgotICAgICAqLwotI2lmZGVmIE5FRURfSEFTSEJBTkdfRU1VTAotICAgIC8qIFdlIG5lZWQgdGhlICMhIGVtdWxhdGlvbiB3aGVuIHdlIHdhbnQgdG8gZXhlY3V0ZSBzY3JpcHRzICovCi0gICAgewotCWV4dGVybiBjaGFyICoqZW52aXJvbjsKLQotCWFwX2V4ZWN2ZShjbWQsICZhcmd2WzNdLCBlbnZpcm9uKTsKLSAgICB9Ci0jZWxzZSAvKk5FRURfSEFTSEJBTkdfRU1VTCovCi0gICAgZXhlY3YoY21kLCAmYXJndlszXSk7Ci0jZW5kaWYgLypORUVEX0hBU0hCQU5HX0VNVUwqLwotCi0gICAgLyoKLSAgICAgKiAoSSBjYW4ndCBoZWxwIG15c2VsZi4uLnNvcnJ5LikKLSAgICAgKgotICAgICAqIFVoIG9oLiAgU3RpbGwgaGVyZS4gIFdoZXJlJ3MgdGhlIGthYm9vbT8gIFRoZXJlIHdhcyBzdXBwb3NlZCB0byBiZSBhbgotICAgICAqIEVBUlRILXNoYXR0ZXJpbmcga2Fib29tIQotICAgICAqCi0gICAgICogT2ggd2VsbCwgbG9nIHRoZSBmYWlsdXJlIGFuZCBlcnJvciBvdXQuCi0gICAgICovCi0gICAgbG9nX2VycigiKCVkKSVzOiBleGVjIGZhaWxlZCAoJXMpXG4iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pLCBjbWQpOwotICAgIGV4aXQoMjU1KTsKLX0KZGlmZiAtLWdpdCBhL3N1cHBvcnQvc3VleGVjLmggYi9zdXBwb3J0L3N1ZXhlYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTJiYWRkLi4wMDAwMDAwCi0tLSBhL3N1cHBvcnQvc3VleGVjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IFRoZSBBcGFjaGUgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSBTZXJ2ZXIiIGFuZCAiQXBhY2hlIEdyb3VwIiBtdXN0IG5vdCBiZSB1c2VkIHRvCi0gKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAotICogICAgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIEdyb3VwLgotICoKLSAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKLSAqICAgIGFja25vd2xlZGdtZW50OgotICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEFwYWNoZSBHcm91cAotICogICAgZm9yIHVzZSBpbiB0aGUgQXBhY2hlIEhUVFAgc2VydmVyIHByb2plY3QgKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBUEFDSEUgR1JPVVAgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgR1JPVVAgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHdhcyBvcmlnaW5hbGx5IGJhc2VkCi0gKiBvbiBwdWJsaWMgZG9tYWluIHNvZnR3YXJlIHdyaXR0ZW4gYXQgdGhlIE5hdGlvbmFsIENlbnRlciBmb3IKLSAqIFN1cGVyY29tcHV0aW5nIEFwcGxpY2F0aW9ucywgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcywgVXJiYW5hLUNoYW1wYWlnbi4KLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgR3JvdXAgYW5kIHRoZSBBcGFjaGUgSFRUUCBzZXJ2ZXIKLSAqIHByb2plY3QsIHBsZWFzZSBzZWUgPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqLwotCi0vKgotICogc3VleGVjLmggLS0gdXNlci1kZWZpbmFibGUgdmFyaWFibGVzIGZvciB0aGUgc3VleGVjIHdyYXBwZXIgY29kZS4KLSAqICAgICAgICAgICAgIChTZWUgUkVBRE1FLmNvbmZpZ3VyZSBvbiBob3cgdG8gY3VzdG9taXplIHRoZXNlIHZhcmlhYmxlcy4pCi0gKi8KLQotCi0jaWZuZGVmIF9TVUVYRUNfSAotI2RlZmluZSBfU1VFWEVDX0gKLQotLyoKLSAqIEhUVFBEX1VTRVIgLS0gRGVmaW5lIGFzIHRoZSB1c2VybmFtZSB1bmRlciB3aGljaCBBcGFjaGUgbm9ybWFsbHkKLSAqICAgICAgICAgICAgICAgcnVucy4gIFRoaXMgaXMgdGhlIG9ubHkgdXNlciBhbGxvd2VkIHRvIGV4ZWN1dGUKLSAqICAgICAgICAgICAgICAgdGhpcyBwcm9ncmFtLgotICovCi0jaWZuZGVmIEhUVFBEX1VTRVIKLSNkZWZpbmUgSFRUUERfVVNFUiAid3d3IgotI2VuZGlmCi0KLS8qCi0gKiBVSURfTUlOIC0tIERlZmluZSB0aGlzIGFzIHRoZSBsb3dlc3QgVUlEIGFsbG93ZWQgdG8gYmUgYSB0YXJnZXQgdXNlcgotICogICAgICAgICAgICBmb3Igc3VFWEVDLiAgRm9yIG1vc3Qgc3lzdGVtcywgNTAwIG9yIDEwMCBpcyBjb21tb24uCi0gKi8KLSNpZm5kZWYgVUlEX01JTgotI2RlZmluZSBVSURfTUlOIDEwMAotI2VuZGlmCi0KLS8qCi0gKiBHSURfTUlOIC0tIERlZmluZSB0aGlzIGFzIHRoZSBsb3dlc3QgR0lEIGFsbG93ZWQgdG8gYmUgYSB0YXJnZXQgZ3JvdXAKLSAqICAgICAgICAgICAgZm9yIHN1RVhFQy4gIEZvciBtb3N0IHN5c3RlbXMsIDEwMCBpcyBjb21tb24uCi0gKi8KLSNpZm5kZWYgR0lEX01JTgotI2RlZmluZSBHSURfTUlOIDEwMAotI2VuZGlmCi0KLS8qCi0gKiBVU0VSRElSX1NVRkZJWCAtLSBEZWZpbmUgdG8gYmUgdGhlIHN1YmRpcmVjdG9yeSB1bmRlciB1c2VycycgCi0gKiAgICAgICAgICAgICAgICAgICBob21lIGRpcmVjdG9yaWVzIHdoZXJlIHN1RVhFQyBhY2Nlc3Mgc2hvdWxkCi0gKiAgICAgICAgICAgICAgICAgICBiZSBhbGxvd2VkLiAgQWxsIGV4ZWN1dGFibGVzIHVuZGVyIHRoaXMgZGlyZWN0b3J5Ci0gKiAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGV4ZWN1dGFibGUgYnkgc3VFWEVDIGFzIHRoZSB1c2VyIHNvIAotICogICAgICAgICAgICAgICAgICAgdGhleSBzaG91bGQgYmUgInNhZmUiIHByb2dyYW1zLiAgSWYgeW91IGFyZSAKLSAqICAgICAgICAgICAgICAgICAgIHVzaW5nIGEgInNpbXBsZSIgVXNlckRpciBkaXJlY3RpdmUgKGllLiBvbmUgCi0gKiAgICAgICAgICAgICAgICAgICB3aXRob3V0IGEgIioiIGluIGl0KSB0aGlzIHNob3VsZCBiZSBzZXQgdG8gCi0gKiAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSB2YWx1ZS4gIHN1RVhFQyB3aWxsIG5vdCB3b3JrIHByb3Blcmx5Ci0gKiAgICAgICAgICAgICAgICAgICBpbiBjYXNlcyB3aGVyZSB0aGUgVXNlckRpciBkaXJlY3RpdmUgcG9pbnRzIHRvIAotICogICAgICAgICAgICAgICAgICAgYSBsb2NhdGlvbiB0aGF0IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgdXNlcidzCi0gKiAgICAgICAgICAgICAgICAgICBob21lIGRpcmVjdG9yeSBhcyByZWZlcmVuY2VkIGluIHRoZSBwYXNzd2QgZmlsZS4KLSAqCi0gKiAgICAgICAgICAgICAgICAgICBJZiB5b3UgaGF2ZSBWaXJ0dWFsSG9zdHMgd2l0aCBhIGRpZmZlcmVudAotICogICAgICAgICAgICAgICAgICAgVXNlckRpciBmb3IgZWFjaCwgeW91IHdpbGwgbmVlZCB0byBkZWZpbmUgdGhlbSB0bwotICogICAgICAgICAgICAgICAgICAgYWxsIHJlc2lkZSBpbiBvbmUgcGFyZW50IGRpcmVjdG9yeTsgdGhlbiBuYW1lIHRoYXQKLSAqICAgICAgICAgICAgICAgICAgIHBhcmVudCBkaXJlY3RvcnkgaGVyZS4gIElGIFRISVMgSVMgTk9UIERFRklORUQKLSAqICAgICAgICAgICAgICAgICAgIFBST1BFUkxZLCB+VVNFUkRJUiBDR0kgUkVRVUVTVFMgV0lMTCBOT1QgV09SSyEKLSAqICAgICAgICAgICAgICAgICAgIFNlZSB0aGUgc3VFWEVDIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlsZWQKLSAqICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uLgotICovCi0jaWZuZGVmIFVTRVJESVJfU1VGRklYCi0jZGVmaW5lIFVTRVJESVJfU1VGRklYICJwdWJsaWNfaHRtbCIKLSNlbmRpZgotCi0vKgotICogTE9HX0VYRUMgLS0gRGVmaW5lIHRoaXMgYXMgYSBmaWxlbmFtZSBpZiB5b3Ugd2FudCBhbGwgc3VFWEVDCi0gKiAgICAgICAgICAgICB0cmFuc2FjdGlvbnMgYW5kIGVycm9ycyBsb2dnZWQgZm9yIGF1ZGl0aW5nIGFuZAotICogICAgICAgICAgICAgZGVidWdnaW5nIHB1cnBvc2VzLgotICovCi0jaWZuZGVmIExPR19FWEVDCi0jZGVmaW5lIExPR19FWEVDICIvdXNyL2xvY2FsL2FwYWNoZS9sb2dzL2NnaS5sb2ciCS8qIE5lZWQgbWU/ICovCi0jZW5kaWYKLQotLyoKLSAqIERPQ19ST09UIC0tIERlZmluZSBhcyB0aGUgRG9jdW1lbnRSb290IHNldCBmb3IgQXBhY2hlLiAgVGhpcwotICogICAgICAgICAgICAgd2lsbCBiZSB0aGUgb25seSBoaWVyYXJjaHkgKGFzaWRlIGZyb20gVXNlckRpcnMpCi0gKiAgICAgICAgICAgICB0aGF0IGNhbiBiZSB1c2VkIGZvciBzdUVYRUMgYmVoYXZpb3IuCi0gKi8KLSNpZm5kZWYgRE9DX1JPT1QKLSNkZWZpbmUgRE9DX1JPT1QgIi91c3IvbG9jYWwvYXBhY2hlL2h0ZG9jcyIKLSNlbmRpZgotCi0vKgotICogU0FGRV9QQVRIIC0tIERlZmluZSBhIHNhZmUgUEFUSCBlbnZpcm9ubWVudCB0byBwYXNzIHRvIENHSSBleGVjdXRhYmxlcy4KLSAqCi0gKi8KLSNpZm5kZWYgU0FGRV9QQVRICi0jZGVmaW5lIFNBRkVfUEFUSCAiL3Vzci9sb2NhbC9iaW46L3Vzci9iaW46L2JpbiIKLSNlbmRpZgotCi0jZW5kaWYgLyogX1NVRVhFQ19IICovCmRpZmYgLS1naXQgYS90ZXN0Ly5jdnNpZ25vcmUgYi90ZXN0Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMjQ0YTQuLjAwMDAwMDAKLS0tIGEvdGVzdC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotYS5vdXQKLXRpbWUtRkNOVEwKLXRpbWUtRkxPQ0sKLXRpbWUtU1lTVlNFTQotdGltZS1TWVNWU0VNMgotdGltZS1QVEhSRUFECi10aW1lLVVTTE9DSwotemIKLXRlc3Qtd3JpdGV2Ci10ZXN0X2RhdGUKLXRlc3Rfc2VsZWN0CmRpZmYgLS1naXQgYS90ZXN0Ly5pbmRlbnQucHJvIGIvdGVzdC8uaW5kZW50LnBybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlmYmU5Zi4uMDAwMDAwMAotLS0gYS90ZXN0Ly5pbmRlbnQucHJvCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLWk0IC1ucHNsIC1kaTAgLWJyIC1uY2UgLWQwIC1jbGkwIC1ucGNzIC1uZmMxCi0tVEJVRkYKLS1URklMRQotLVRUUkFOUwotLVRVSU5UNAotLVRfdHJhbnMKLS1UYWxsb3dfb3B0aW9uc190Ci0tVGFwYWNoZV9zZmlvCi0tVGFycmF5X2hlYWRlcgotLVRib29sX2ludAotLVRidWZfYXJlYQotLVRidWZmX3N0cnVjdAotLVRidWZmeQotLVRjbWRfaG93Ci0tVGNtZF9wYXJtcwotLVRjb21tYW5kX3JlYwotLVRjb21tYW5kX3N0cnVjdAotLVRjb25uX3JlYwotLVRjb3JlX2Rpcl9jb25maWcKLS1UY29yZV9zZXJ2ZXJfY29uZmlnCi0tVGRpcl9tYWtlcl9mdW5jCi0tVGV2ZW50Ci0tVGdsb2JhbHNfcwotLVRoYW5kbGVyX2Z1bmMKLS1UaGFuZGxlcl9yZWMKLS1Uam9ibGlzdF9zCi0tVGxpc3Rlbl9yZWMKLS1UbWVyZ2VyX2Z1bmMKLS1UbW9kZV90Ci0tVG1vZHVsZQotLVRtb2R1bGVfc3RydWN0Ci0tVG11dGV4Ci0tVG5fbG9uZwotLVRvdGhlcl9jaGlsZF9yZWMKLS1Ub3ZlcnJpZGVzX3QKLS1UcGFyZW50X3Njb3JlCi0tVHBpZF90Ci0tVHBpcGVkX2xvZwotLVRwb29sCi0tVHJlcXVlc3RfcmVjCi0tVHJlcXVpcmVfbGluZQotLVRybGltX3QKLS1Uc2NvcmVib2FyZAotLVRzZW1hcGhvcmUKLS1Uc2VydmVyX2FkZHJfcmVjCi0tVHNlcnZlcl9yZWMKLS1Uc2VydmVyX3JlY19jaGFpbgotLVRzaG9ydF9zY29yZQotLVR0YWJsZQotLVR0YWJsZV9lbnRyeQotLVR0aHJlYWQKLS1UdV93aWRlX2ludAotLVR2dGltZV90Ci0tVHdpZGVfaW50CmRpZmYgLS1naXQgYS90ZXN0L1JFQURNRSBiL3Rlc3QvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjhiZTUwLi4wMDAwMDAwCi0tLSBhL3Rlc3QvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyB1c2VmdWwgdGVzdCBjb2RlIGZvciB0ZXN0aW5nIHZhcmlvdXMgYml0cwotb2YgQXBhY2hlIGZ1bmN0aW9uYWxpdHkuICBUaGlzIHN0dWZmIGlzIGZvciB0aGUgZGV2ZWxvcGVycyBvbmx5LAotc28gd2UgbWlnaHQgcmVtb3ZlIGl0IG9uIHB1YmxpYyByZWxlYXNlcy4KZGlmZiAtLWdpdCBhL3Rlc3QvY2hlY2tfY2h1bmtlZCBiL3Rlc3QvY2hlY2tfY2h1bmtlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExMjE2Ny4uMDAwMDAwMAotLS0gYS90ZXN0L2NoZWNrX2NodW5rZWQKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jIS91c3IvYmluL3BlcmwgLXcKLQotIyBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgb24gdGhlIHJhdyBvdXRwdXQgb2YgYW4gSFRUUC8xLjEgY29ubmVjdGlvbgotIyB0byBjaGVjayB0aGF0IHRoZSBjaHVua3MgYXJlIGFsbCBjb3JyZWN0bHkgbGFpZCBvdXQuICBJdCdzIGVhc2llc3QKLSMgdG8gdXNlIGEgdG9vbCBsaWtlIG5ldGNhdCB0byBnZW5lcmF0ZSB0aGUgb3V0cHV0LiAgVGhpcyBzY3JpcHQKLSMgKmluc2lzdHMqIHRoYXQgXHIgZXhpc3QgaW4gdGhlIG91dHB1dC4KLSMKLSMgWW91IGNhbiBmaW5kIG5ldGNhdCBhdCBhdmlhbi5vcmc6L3NyYy9oYWNrcy9uYzExMC50Z3ouCi0KLXVzZSBzdHJpY3Q7Ci0KLW15ICRpc19jaHVua2VkID0gMDsKLQotIyBtdXN0IHRvc3MgaGVhZGVycwotd2hpbGUoPD4pIHsKLSAgICBpZiAoL15UcmFuc2Zlci1FbmNvZGluZzpccytjaHVua2VkL2kpIHsKLQkkaXNfY2h1bmtlZCA9IDE7Ci0gICAgfQotICAgIGxhc3QgaWYgKCRfIGVxICJcclxuIik7Ci19Ci0KLSRpc19jaHVua2VkIHx8IGRpZSAid2Fzbid0IGNodW5rZWRcbiI7Ci0KLWZvcig7OykgewotICAgICRfID0gPD4gfHwgZGllICJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIVxuIjsKLQotICAgIG0jXihbMC05YS1mXSspICpcciQjaSB8fCBkaWUgImJvZ3VzIGNodW5rbGVuOiAkXyI7Ci0KLSAgICBteSAkY2h1bmtsZW4gPSBoZXgoJDEpOwotCi0gICAgZXhpdCAwIGlmICgkY2h1bmtsZW4gPT0gMCk7Ci0KLSAgICBjaG9wOyBjaG9wOwotICAgIHByaW50ICIkXyAiOwotCi0gICAgbXkgJGRhdGEgPSAnJzsKLSAgICByZWFkKEFSR1YsICRkYXRhLCAkY2h1bmtsZW4pID09ICRjaHVua2xlbiB8fCBkaWUgInNob3J0IHJlYWQhXG4iOwotCi0gICAgJF8gPSA8PiB8fCBkaWUgInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUhXG4iOwotCi0gICAgJF8gZXEgIlxyXG4iIHx8IGRpZSAibWlzc2luZyBjaHVuayB0cmFpbGVyIVxuIjsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvY2xzLmMgYi90ZXN0L2Nscy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTExNGE3Li4wMDAwMDAwCi0tLSBhL3Rlc3QvY2xzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLS8qCi0gKiBDb21wYXJlIGEgc3RyaW5nIHRvIGEgbWFzawotICogTWFzayBjaGFyYWN0ZXJzOgotICogICBAIC0gdXBwZXJjYXNlIGxldHRlcgotICogICAjIC0gbG93ZXJjYXNlIGxldHRlcgotICogICAmIC0gaGV4IGRpZ2l0Ci0gKiAgICMgLSBkaWdpdAotICogICAqIC0gc3dhbGxvdyByZW1haW5pbmcgY2hhcmFjdGVycyAKLSAqICA8eD4gLSBleGFjdCBtYXRjaCBmb3IgYW55IG90aGVyIGNoYXJhY3RlcgotICovCi1zdGF0aWMgaW50IGNoZWNrbWFzayhjb25zdCBjaGFyICpkYXRhLCBjb25zdCBjaGFyICptYXNrKQotewotICAgIGludCBpLCBjaCwgZDsKLQotICAgIGZvciAoaSA9IDA7IG1hc2tbaV0gIT0gJ1wwJyAmJiBtYXNrW2ldICE9ICcqJzsgaSsrKSB7Ci0JY2ggPSBtYXNrW2ldOwotCWQgPSBkYXRhW2ldOwotCWlmIChjaCA9PSAnQCcpIHsKLQkgICAgaWYgKCFpc3VwcGVyKGQpKQotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSBpZiAoY2ggPT0gJyQnKSB7Ci0JICAgIGlmICghaXNsb3dlcihkKSkKLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgaWYgKGNoID09ICcjJykgewotCSAgICBpZiAoIWlzZGlnaXQoZCkpCi0JCXJldHVybiAwOwotCX0KLQllbHNlIGlmIChjaCA9PSAnJicpIHsKLQkgICAgaWYgKCFpc3hkaWdpdChkKSkKLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgaWYgKGNoICE9IGQpCi0JICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmIChtYXNrW2ldID09ICcqJykKLQlyZXR1cm4gMTsKLSAgICBlbHNlCi0JcmV0dXJuIChkYXRhW2ldID09ICdcMCcpOwotfQotCi0vKgotICogQ29udmVydHMgOCBoZXggZGlnaXRzIHRvIGEgdGltZSBpbnRlZ2VyCi0gKi8KLXN0YXRpYyBpbnQgaGV4MnNlYyhjb25zdCBjaGFyICp4KQotewotICAgIGludCBpLCBjaDsKLSAgICB1bnNpZ25lZCBpbnQgajsKLQotICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgODsgaSsrKSB7Ci0JY2ggPSB4W2ldOwotCWogPDw9IDQ7Ci0JaWYgKGlzZGlnaXQoY2gpKQotCSAgICBqIHw9IGNoIC0gJzAnOwotCWVsc2UgaWYgKGlzdXBwZXIoY2gpKQotCSAgICBqIHw9IGNoIC0gKCdBJyAtIDEwKTsKLQllbHNlCi0JICAgIGogfD0gY2ggLSAoJ2EnIC0gMTApOwotICAgIH0KLSAgICBpZiAoaiA9PSAweGZmZmZmZmZmKQotCXJldHVybiAtMTsJCS8qIHNvIHRoYXQgaXQgd29ya3Mgd2l0aCA4LWJ5dGUgaW50cyAqLwotICAgIGVsc2UKLQlyZXR1cm4gajsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGludCBpLCB2ZXI7Ci0gICAgRElSICpkOwotICAgIHN0cnVjdCBkaXJlbnQgKmU7Ci0gICAgY29uc3QgY2hhciAqczsKLSAgICBGSUxFICpmcDsKLSAgICBjaGFyIHBhdGhbRklMRU5BTUVfTUFYICsgMV07Ci0gICAgY2hhciBsaW5lWzEwMzVdOwotICAgIHRpbWVfdCBkYXRlLCBsbW9kLCBleHBpcmU7Ci0gICAgdW5zaWduZWQgaW50IGxlbjsKLSAgICBzdHJ1Y3QgdG0gdHM7Ci0gICAgY2hhciBzZGF0ZVszMF0sIHNsbW9kWzMwXSwgc2V4cGlyZVszMF07Ci0gICAgY29uc3QgY2hhciB0aW1lX2Zvcm1hdFtdID0gIiVlICViICVZICVSIjsKLQotICAgIGlmIChhcmdjICE9IDIpIHsKLQlwcmludGYoIlVzYWdlOiBjbHMgZGlyZWN0b3J5XG4iKTsKLQlleGl0KDApOwotICAgIH0KLQotICAgIGQgPSBvcGVuZGlyKGFyZ3ZbMV0pOwotICAgIGlmIChkID09IE5VTEwpIHsKLQlwZXJyb3IoIm9wZW5kaXIiKTsKLQlleGl0KDEpOwotICAgIH0KLQotICAgIGZvciAoOzspIHsKLQllID0gcmVhZGRpcihkKTsKLQlpZiAoZSA9PSBOVUxMKQotCSAgICBicmVhazsKLQlzID0gZS0+ZF9uYW1lOwotCWlmIChzWzBdID09ICcuJyB8fCBzWzBdID09ICcjJykKLQkgICAgY29udGludWU7Ci0Jc3ByaW50ZihwYXRoLCAiJXMvJXMiLCBhcmd2WzFdLCBzKTsKLQlmcCA9IGZvcGVuKHBhdGgsICJyIik7Ci0JaWYgKGZwID09IE5VTEwpIHsKLQkgICAgcGVycm9yKCJmb3BlbiIpOwotCSAgICBjb250aW51ZTsKLQl9Ci0JaWYgKGZnZXRzKGxpbmUsIDEwMzQsIGZwKSA9PSBOVUxMKSB7Ci0JICAgIHBlcnJvcigiZmdldHMiKTsKLQkgICAgZmNsb3NlKGZwKTsKLQkgICAgY29udGludWU7Ci0JfQotCWlmICghY2hlY2ttYXNrKGxpbmUsICImJiYmJiYmJiAmJiYmJiYmJiAmJiYmJiYmJiAmJiYmJiYmJiAmJiYmJiYmJlxuIikpIHsKLQkgICAgZnByaW50ZihzdGRlcnIsICJCYWQgY2FjaGUgZmlsZVxuIik7Ci0JICAgIGZjbG9zZShmcCk7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlkYXRlID0gaGV4MnNlYyhsaW5lKTsKLQlsbW9kID0gaGV4MnNlYyhsaW5lICsgOSk7Ci0JZXhwaXJlID0gaGV4MnNlYyhsaW5lICsgMTgpOwotCXZlciA9IGhleDJzZWMobGluZSArIDI3KTsKLQlsZW4gPSBoZXgyc2VjKGxpbmUgKyAzNSk7Ci0JaWYgKGZnZXRzKGxpbmUsIDEwMzQsIGZwKSA9PSBOVUxMKSB7Ci0JICAgIHBlcnJvcigiZmdldHMiKTsKLQkgICAgZmNsb3NlKGZwKTsKLQkgICAgY29udGludWU7Ci0JfQotCWZjbG9zZShmcCk7Ci0JaSA9IHN0cmxlbihsaW5lKTsKLQlpZiAoc3RybmNtcChsaW5lLCAiWC1VUkw6ICIsIDcpICE9IDAgfHwgbGluZVtpIC0gMV0gIT0gJ1xuJykgewotCSAgICBmcHJpbnRmKHN0ZGVyciwgIkJhZCBjYWNoZSBmaWxlXG4iKTsKLQkgICAgY29udGludWU7Ci0JfQotCWxpbmVbaSAtIDFdID0gJ1wwJzsKLQlpZiAoZGF0ZSAhPSAtMSkgewotCSAgICB0cyA9ICpnbXRpbWUoJmRhdGUpOwotCSAgICBzdHJmdGltZShzZGF0ZSwgMzAsIHRpbWVfZm9ybWF0LCAmdHMpOwotCX0KLQllbHNlCi0JICAgIHN0cmNweShzZGF0ZSwgIi0iKTsKLQotCWlmIChsbW9kICE9IC0xKSB7Ci0JICAgIHRzID0gKmdtdGltZSgmbG1vZCk7Ci0JICAgIHN0cmZ0aW1lKHNsbW9kLCAzMCwgdGltZV9mb3JtYXQsICZ0cyk7Ci0JfQotCWVsc2UKLQkgICAgc3RyY3B5KHNsbW9kLCAiLSIpOwotCi0JaWYgKGV4cGlyZSAhPSAtMSkgewotCSAgICB0cyA9ICpnbXRpbWUoJmV4cGlyZSk7Ci0JICAgIHN0cmZ0aW1lKHNleHBpcmUsIDMwLCB0aW1lX2Zvcm1hdCwgJnRzKTsKLQl9Ci0JZWxzZQotCSAgICBzdHJjcHkoc2V4cGlyZSwgIi0iKTsKLQotCXByaW50ZigiJXM6ICVkOyAlcyAgJXMgICVzXG4iLCBsaW5lICsgNywgdmVyLCBzZGF0ZSwgc2xtb2QsIHNleHBpcmUpOwotICAgIH0KLQotICAgIGNsb3NlZGlyKGQpOwotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC90Y3BkdW1wc2NpaS50eHQgYi90ZXN0L3RjcGR1bXBzY2lpLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMxMDYwZS4uMDAwMDAwMAotLS0gYS90ZXN0L3RjcGR1bXBzY2lpLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLQotRnJvbSBtYXJjc0B6bmVwLmNvbSBGcmkgQXByIDE3IDE1OjE2OjE2IDE5OTgKLURhdGU6IFNhdCwgMjIgTm92IDE5OTcgMjA6NDQ6MTAgLTA3MDAgKE1TVCkKLUZyb206IE1hcmMgU2xlbWtvIDxtYXJjc0B6bmVwLmNvbT4KLVRvOiBUTE9TQVAgPG5ldy1odHRwZEBhcGFjaGUub3JnPgotU3ViamVjdDogUmU6IEdldHRpbmcgZXRoZXJuZXQgcGFja2V0cyBjb250ZW50IHVuZGVyIEZyZWVCU0Q/ICAoZndkKQotUmVwbHktVG86IG5ldy1odHRwZEBhcGFjaGUub3JnCi0KLUFueW9uZSB0b28gbGF6eSB0byBoYWNrIHRjcGR1bXAgKGVnLiBteSB0Y3BkdW1wIGhhcyBhIC1YIG9wdGlvbiB0byBkaXNwbGF5Ci10aGUgZGF0YSBpbiBBU0NJSSkgY2FuIHVzZSBzb21ldGhpbmcgbGlrZSB0aGUgYmVsb3cgdG8gZ3JhYiBIVFRQIGhlYWRlcnMKLXdoZW4gZGVidWdnaW5nIGJyb2tlbiBjbGllbnRzLgotCi1Ob3RoaW5nIGNvbXBsaWNhdGVkLCBidXQgaGFuZHkuCi0KLS0tLS0tLS0tLS0gRm9yd2FyZGVkIG1lc3NhZ2UgLS0tLS0tLS0tLQotRGF0ZTogU2F0LCAyMiBOb3YgMTk5NyAxNDozNToyMyBQU1QKLUZyb206IEJpbGwgRmVubmVyIDxmZW5uZXJAcGFyYy54ZXJveC5jb20+Ci1UbzogTmF0ZSBXaWxsaWFtcyA8bmF0ZUBtdC5zcmkuY29tPgotQ2M6IGJtYWhAY2Euc2FuZGlhLmdvdiwgaGFja2Vyc0BGcmVlQlNELk9SRwotU3ViamVjdDogUmU6IEdldHRpbmcgZXRoZXJuZXQgcGFja2V0cyBjb250ZW50IHVuZGVyIEZyZWVCU0Q/IAotCi1JIHVzdWFsbHkganVzdCB1c2UgdGhpcyBwZXJsIHNjcmlwdCwgd2hpY2ggSSBjYWxsICJ0Y3BkdW1wc2NpaSIuCi1UaGVuIHJ1biAidGNwZHVtcHNjaWkgLXMgMTUwMCAteCBbb3RoZXIgdGNwZHVtcCBhcmdzXSIuCi0KLSAgQmlsbAotCi0jIS9pbXBvcnQvbWlzYy9iaW4vcGVybAotIwotIwotb3BlbihUQ1BEVU1QLCJ0Y3BkdW1wIC1sIEBBUkdWfCIpOwotd2hpbGUgKDxUQ1BEVU1QPikgewotCWlmICgvXlxzKyhcU1xTKSsvKSB7Ci0JCSRzYXYgPSAkXzsKLQkJJGFzYyA9ICIiOwotCQl3aGlsZSAocy9ccyooXFNcUylccyovLykgewotCQkJJGkgPSBoZXgoJDEpOwotCQkJaWYgKCRpIDwgMzIgfHwgJGkgPiAxMjYpIHsKLQkJCQkkYXNjIC49ICIuIjsKLQkJCX0gZWxzZSB7Ci0JCQkJJGFzYyAuPSBwYWNrKEMsaGV4KCQxKSk7Ci0JCQl9Ci0JCX0KLQkJJGZvbyA9ICIuIiB4IGxlbmd0aCgkYXNjKTsKLQkJJF8gPSAkc2F2OwotCQlzL1x0LyAgICAgICAgL2c7Ci0JCXMvXiRmb28vJGFzYy87Ci0JfQotCXByaW50OwotfQotCmRpZmYgLS1naXQgYS90ZXN0L3Rlc3Qtd3JpdGV2LmMgYi90ZXN0L3Rlc3Qtd3JpdGV2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MmM3MDEuLjAwMDAwMDAKLS0tIGEvdGVzdC90ZXN0LXdyaXRldi5jCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAgICB0ZXN0LXdyaXRldjogdXNlIHRoaXMgdG8gZmlndXJlIG91dCBpZiB5b3VyIHdyaXRldigpIGRvZXMgaW50ZWxsaWdlbnQKLSAgICB0aGluZ3Mgb24gdGhlIG5ldHdvcmsuICBTb21lIHdyaXRldigpcyB3aGVuIGdpdmVuIG11bHRpcGxlIGJ1ZmZlcnMKLSAgICB3aWxsIGJyZWFrIHRoZW0gdXAgaW50byBtdWx0aXBsZSBwYWNrZXRzLCB3aGljaCBpcyBhIHdhc3RlLgotCi0gICAgTGludXggcHJpb3IgdG8gMi4wLjMxIGhhcyB0aGlzIHByb2JsZW0uCi0KLSAgICBTb2xhcmlzIDIuNSwgMi41LjEgZG9lc24ndCBhcHBlYXIgdG8sIDIuNiBoYXNuJ3QgYmVlbiB0ZXN0ZWQuCi0KLSAgICBJUklYIDUuMyBkb2Vzbid0IGhhdmUgdGhpcyBwcm9ibGVtLgotCi0gICAgVG8gdXNlIHRoaXMgeW91IHdhbnQgdG8gc25vb3AgdGhlIHdpcmUgd2l0aCB0Y3BkdW1wLCBhbmQgdGhlbiBydW4KLSAgICAidGVzdC13cml0ZXYgYS5iLmMuZCBwb3J0IyIgLi4uIGFnYWluc3Qgc29tZSBUQ1Agc2VydmljZSBvbiBhbm90aGVyCi0gICAgYm94LiAgRm9yIGV4YW1wbGUgeW91IGNhbiBydW4gaXQgYWdhaW5zdCBwb3J0IDgwIG9uIGFub3RoZXIgc2VydmVyLgotICAgIFlvdSB3YW50IHRvIGxvb2sgdG8gc2VlIGhvdyBtYW55IGRhdGEgcGFja2V0cyBhcmUgc2VudCwgeW91J3JlIGhvcGluZwotICAgIG9ubHkgb25lIG9mIHNpemUgMzAwIGlzIHNlbnQuCi0qLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2luY2x1ZGUgPHN5cy91aW8uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaWZuZGVmIElOQUREUl9OT05FCi0jZGVmaW5lIElOQUREUl9OT05FICgtMXVsKQotI2VuZGlmCi0KLXZvaWQgbWFpbiggaW50IGFyZ2MsIGNoYXIgKiphcmd2ICkKLXsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2VydmVyX2FkZHI7Ci0gICAgaW50IHM7Ci0gICAgc3RydWN0IGlvdmVjIHZlY3RvclszXTsKLSAgICBjaGFyIGJ1ZlsxMDBdOwotICAgIGludCBpOwotICAgIGNvbnN0IGludCBqdXN0X3NheV9ubyA9IDE7Ci0KLSAgICBpZiggYXJnYyAhPSAzICkgewotdXNhZ2U6Ci0JZnByaW50Ziggc3RkZXJyLCAidXNhZ2U6IHRlc3Qtd3JpdGV2IGEuYi5jLmQgcG9ydCNcbiIgKTsKLQlleGl0KCAxICk7Ci0gICAgfQotICAgIHNlcnZlcl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotICAgIHNlcnZlcl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkciggYXJndlsxXSApOwotICAgIGlmKCBzZXJ2ZXJfYWRkci5zaW5fYWRkci5zX2FkZHIgPT0gSU5BRERSX05PTkUgKSB7Ci0JZnByaW50Ziggc3RkZXJyLCAiYm9ndXMgYWRkcmVzc1xuIiApOwotCWdvdG8gdXNhZ2U7Ci0gICAgfQotICAgIHNlcnZlcl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoIGF0b2koIGFyZ3ZbMl0gKSApOwotCi0gICAgcyA9IHNvY2tldCggQUZfSU5FVCwgU09DS19TVFJFQU0sIDAgKTsKLSAgICBpZiggcyA8IDAgKSB7Ci0JcGVycm9yKCJzb2NrZXQiKTsKLQlleGl0KDEpOwotICAgIH0KLSAgICBpZiggY29ubmVjdCggcywgKHN0cnVjdCBzb2NrYWRkciAqKSZzZXJ2ZXJfYWRkciwgc2l6ZW9mKCBzZXJ2ZXJfYWRkciApICkKLQkhPSAwICkgewotCXBlcnJvcigiY29ubmVjdCIpOwotCWV4aXQoMSk7Ci0gICAgfQotCi0gICAgaWYoIHNldHNvY2tvcHQocywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAoY2hhciopJmp1c3Rfc2F5X25vLAotCXNpemVvZihqdXN0X3NheV9ubykpICE9IDAgKSB7Ci0JcGVycm9yKCAiVENQX05PREVMQVkiICk7Ci0JZXhpdCgxKTsKLSAgICB9Ci0gICAgLyogbm93IGJ1aWxkIHVwIGEgdHdvIHBhcnQgd3JpdGV2IGFuZCB3cml0ZSBpdCBvdXQgKi8KLSAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZW9mKCBidWYgKTsgKytpICkgewotCWJ1ZltpXSA9ICd4JzsKLSAgICB9Ci0gICAgdmVjdG9yWzBdLmlvdl9iYXNlID0gYnVmOwotICAgIHZlY3RvclswXS5pb3ZfbGVuID0gc2l6ZW9mKGJ1Zik7Ci0gICAgdmVjdG9yWzFdLmlvdl9iYXNlID0gYnVmOwotICAgIHZlY3RvclsxXS5pb3ZfbGVuID0gc2l6ZW9mKGJ1Zik7Ci0gICAgdmVjdG9yWzJdLmlvdl9iYXNlID0gYnVmOwotICAgIHZlY3RvclsyXS5pb3ZfbGVuID0gc2l6ZW9mKGJ1Zik7Ci0KLSAgICBpID0gd3JpdGV2KCBzLCAmdmVjdG9yWzBdLCAzICk7Ci0gICAgZnByaW50Ziggc3Rkb3V0LCAiaT0lZCwgZXJybm89JWRcbiIsIGksIGVycm5vICk7Ci0gICAgZXhpdCgwKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdF9kYXRlLmMgYi90ZXN0L3Rlc3RfZGF0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmVhZjc5Li4wMDAwMDAwCi0tLSBhL3Rlc3QvdGVzdF9kYXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyogVGhpcyBwcm9ncmFtIHRlc3RzIHRoZSBwYXJzZUhUVFBkYXRlIHJvdXRpbmUgaW4gLi4vbWFpbi91dGlsX2RhdGUuYy4KLSAqCi0gKiBJdCBpcyBvbmx5IHNlbWlhdXRvbWF0ZWQgaW4gdGhhdCBJIHdvdWxkIHJ1biBpdCwgbW9kaWZ5IHRoZSBjb2RlIHRvCi0gKiB1c2UgYSBkaWZmZXJlbnQgYWxnb3JpdGhtIG9yIHNlZWQsIHJlY29tcGlsZSBhbmQgcnVuIGFnYWluLCBldGMuCi0gKiBPYnZpb3VzbHkgaXQgc2hvdWxkIHVzZSBhbiBhcmd1bWVudCBmb3IgdGhhdCwgYnV0IEkgbmV2ZXIgZ290IGFyb3VuZAotICogdG8gY2hhbmdpbmcgdGhlIGltcGxlbWVudGF0aW9uLgotICogCi0gKiAgICAgZ2NjIC1nIC1PMiAtSS4uL21haW4gLW8gdGVzdF9kYXRlIC4uL21haW4vdXRpbF9kYXRlLm8gdGVzdF9kYXRlLmMKLSAqICAgICB0ZXN0X2RhdGUgfCBlZ3JlcCAnXk5vICcKLSAqIAotICogUm95IEZpZWxkaW5nLCAxOTk2Ci0gKi8KLSNkZWZpbmUgQVBJX0VYUE9SVCh4KSB4Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgInV0aWxfZGF0ZS5oIgotCi1zdGF0aWMgY29uc3QgbG9uZyB5ZWFyMnNlY3NbXSA9IHsKLSAgICAgICAgICAgICAwTCwgICAgLyogMTk3MCAqLwotICAgICAgMzE1MzYwMDBMLCAgICAvKiAxOTcxICovCi0gICAgICA2MzA3MjAwMEwsICAgIC8qIDE5NzIgKi8KLSAgICAgIDk0Njk0NDAwTCwgICAgLyogMTk3MyAqLwotICAgICAxMjYyMzA0MDBMLCAgICAvKiAxOTc0ICovCi0gICAgIDE1Nzc2NjQwMEwsICAgIC8qIDE5NzUgKi8KLSAgICAgMTg5MzAyNDAwTCwgICAgLyogMTk3NiAqLwotICAgICAyMjA5MjQ4MDBMLCAgICAvKiAxOTc3ICovCi0gICAgIDI1MjQ2MDgwMEwsICAgIC8qIDE5NzggKi8KLSAgICAgMjgzOTk2ODAwTCwgICAgLyogMTk3OSAqLwotICAgICAzMTU1MzI4MDBMLCAgICAvKiAxOTgwICovCi0gICAgIDM0NzE1NTIwMEwsICAgIC8qIDE5ODEgKi8KLSAgICAgMzc4NjkxMjAwTCwgICAgLyogMTk4MiAqLwotICAgICA0MTAyMjcyMDBMLCAgICAvKiAxOTgzICovCi0gICAgIDQ0MTc2MzIwMEwsICAgIC8qIDE5ODQgKi8KLSAgICAgNDczMzg1NjAwTCwgICAgLyogMTk4NSAqLwotICAgICA1MDQ5MjE2MDBMLCAgICAvKiAxOTg2ICovCi0gICAgIDUzNjQ1NzYwMEwsICAgIC8qIDE5ODcgKi8KLSAgICAgNTY3OTkzNjAwTCwgICAgLyogMTk4OCAqLwotICAgICA1OTk2MTYwMDBMLCAgICAvKiAxOTg5ICovCi0gICAgIDYzMTE1MjAwMEwsICAgIC8qIDE5OTAgKi8KLSAgICAgNjYyNjg4MDAwTCwgICAgLyogMTk5MSAqLwotICAgICA2OTQyMjQwMDBMLCAgICAvKiAxOTkyICovCi0gICAgIDcyNTg0NjQwMEwsICAgIC8qIDE5OTMgKi8KLSAgICAgNzU3MzgyNDAwTCwgICAgLyogMTk5NCAqLwotICAgICA3ODg5MTg0MDBMLCAgICAvKiAxOTk1ICovCi0gICAgIDgyMDQ1NDQwMEwsICAgIC8qIDE5OTYgKi8KLSAgICAgODUyMDc2ODAwTCwgICAgLyogMTk5NyAqLwotICAgICA4ODM2MTI4MDBMLCAgICAvKiAxOTk4ICovCi0gICAgIDkxNTE0ODgwMEwsICAgIC8qIDE5OTkgKi8KLSAgICAgOTQ2Njg0ODAwTCwgICAgLyogMjAwMCAqLwotICAgICA5NzgzMDcyMDBMLCAgICAvKiAyMDAxICovCi0gICAgMTAwOTg0MzIwMEwsICAgIC8qIDIwMDIgKi8KLSAgICAxMDQxMzc5MjAwTCwgICAgLyogMjAwMyAqLwotICAgIDEwNzI5MTUyMDBMLCAgICAvKiAyMDA0ICovCi0gICAgMTEwNDUzNzYwMEwsICAgIC8qIDIwMDUgKi8KLSAgICAxMTM2MDczNjAwTCwgICAgLyogMjAwNiAqLwotICAgIDExNjc2MDk2MDBMLCAgICAvKiAyMDA3ICovCi0gICAgMTE5OTE0NTYwMEwsICAgIC8qIDIwMDggKi8KLSAgICAxMjMwNzY4MDAwTCwgICAgLyogMjAwOSAqLwotICAgIDEyNjIzMDQwMDBMLCAgICAvKiAyMDEwICovCi0gICAgMTI5Mzg0MDAwMEwsICAgIC8qIDIwMTEgKi8KLSAgICAxMzI1Mzc2MDAwTCwgICAgLyogMjAxMiAqLwotICAgIDEzNTY5OTg0MDBMLCAgICAvKiAyMDEzICovCi0gICAgMTM4ODUzNDQwMEwsICAgIC8qIDIwMTQgKi8KLSAgICAxNDIwMDcwNDAwTCwgICAgLyogMjAxNSAqLwotICAgIDE0NTE2MDY0MDBMLCAgICAvKiAyMDE2ICovCi0gICAgMTQ4MzIyODgwMEwsICAgIC8qIDIwMTcgKi8KLSAgICAxNTE0NzY0ODAwTCwgICAgLyogMjAxOCAqLwotICAgIDE1NDYzMDA4MDBMLCAgICAvKiAyMDE5ICovCi0gICAgMTU3NzgzNjgwMEwsICAgIC8qIDIwMjAgKi8KLSAgICAxNjA5NDU5MjAwTCwgICAgLyogMjAyMSAqLwotICAgIDE2NDA5OTUyMDBMLCAgICAvKiAyMDIyICovCi0gICAgMTY3MjUzMTIwMEwsICAgIC8qIDIwMjMgKi8KLSAgICAxNzA0MDY3MjAwTCwgICAgLyogMjAyNCAqLwotICAgIDE3MzU2ODk2MDBMLCAgICAvKiAyMDI1ICovCi0gICAgMTc2NzIyNTYwMEwsICAgIC8qIDIwMjYgKi8KLSAgICAxNzk4NzYxNjAwTCwgICAgLyogMjAyNyAqLwotICAgIDE4MzAyOTc2MDBMLCAgICAvKiAyMDI4ICovCi0gICAgMTg2MTkyMDAwMEwsICAgIC8qIDIwMjkgKi8KLSAgICAxODkzNDU2MDAwTCwgICAgLyogMjAzMCAqLwotICAgIDE5MjQ5OTIwMDBMLCAgICAvKiAyMDMxICovCi0gICAgMTk1NjUyODAwMEwsICAgIC8qIDIwMzIgKi8KLSAgICAxOTg4MTUwNDAwTCwgICAgLyogMjAzMyAqLwotICAgIDIwMTk2ODY0MDBMLCAgICAvKiAyMDM0ICovCi0gICAgMjA1MTIyMjQwMEwsICAgIC8qIDIwMzUgKi8KLSAgICAyMDgyNzU4NDAwTCwgICAgLyogMjAzNiAqLwotICAgIDIxMTQzODA4MDBMLCAgICAvKiAyMDM3ICovCi0gICAgMjE0NTkxNjgwMEwgICAgIC8qIDIwMzggKi8KLX07Ci0KLWNvbnN0IGNoYXIgbW9udGhfc25hbWVzWzEyXVs0XSA9IHsKLSAgICAiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIgotfTsKLQotdm9pZCBnbV90aW1lc3RyXzgyMihjaGFyICp0cywgdGltZV90IHNlYykKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZGF5c1s3XT0KLSAgICAgICB7IlN1biIsIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0In07Ci0gICAgc3RydWN0IHRtICp0bXM7Ci0gCi0gICAgdG1zID0gZ210aW1lKCZzZWMpOwotIAotICAgIHNwcmludGYodHMsICIlcywgJS4yZCAlcyAlZCAlLjJkOiUuMmQ6JS4yZCBHTVQiLCBkYXlzW3Rtcy0+dG1fd2RheV0sCi0gICAgICAgICAgICB0bXMtPnRtX21kYXksIG1vbnRoX3NuYW1lc1t0bXMtPnRtX21vbl0sIHRtcy0+dG1feWVhciArIDE5MDAsCi0gICAgICAgICAgICB0bXMtPnRtX2hvdXIsIHRtcy0+dG1fbWluLCB0bXMtPnRtX3NlYyk7Ci19Ci0KLXZvaWQgZ21fdGltZXN0cl84NTAoY2hhciAqdHMsIHRpbWVfdCBzZWMpCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGRheXNbN109Ci0geyJTdW5kYXkiLCJNb25kYXkiLCAiVHVlc2RheSIsICJXZWRuZXNkYXkiLCAiVGh1cnNkYXkiLCAiRnJpZGF5IiwgIlNhdHVyZGF5In07Ci0gICAgc3RydWN0IHRtICp0bXM7Ci0gICAgaW50IHllYXI7Ci0gCi0gICAgdG1zID0gZ210aW1lKCZzZWMpOwotCi0gICAgeWVhciA9IHRtcy0+dG1feWVhcjsKLSAgICBpZiAoeWVhciA+PSAxMDApIHllYXIgLT0gMTAwOwotIAotICAgIHNwcmludGYodHMsICIlcywgJS4yZC0lcy0lLjJkICUuMmQ6JS4yZDolLjJkIEdNVCIsIGRheXNbdG1zLT50bV93ZGF5XSwKLSAgICAgICAgICAgIHRtcy0+dG1fbWRheSwgbW9udGhfc25hbWVzW3Rtcy0+dG1fbW9uXSwgeWVhciwKLSAgICAgICAgICAgIHRtcy0+dG1faG91ciwgdG1zLT50bV9taW4sIHRtcy0+dG1fc2VjKTsKLX0KLQotdm9pZCBnbV90aW1lc3RyX2NjYyhjaGFyICp0cywgdGltZV90IHNlYykKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZGF5c1s3XT0KLSAgICAgICB7IlN1biIsIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0In07Ci0gICAgc3RydWN0IHRtICp0bXM7Ci0gCi0gICAgdG1zID0gZ210aW1lKCZzZWMpOwotIAotICAgIHNwcmludGYodHMsICIlcyAlcyAlMmQgJS4yZDolLjJkOiUuMmQgJWQiLCBkYXlzW3Rtcy0+dG1fd2RheV0sCi0gICAgICAgICAgICBtb250aF9zbmFtZXNbdG1zLT50bV9tb25dLCB0bXMtPnRtX21kYXksIAotICAgICAgICAgICAgdG1zLT50bV9ob3VyLCB0bXMtPnRtX21pbiwgdG1zLT50bV9zZWMsIHRtcy0+dG1feWVhciArIDE5MDApOwotfQotCi1pbnQgbWFpbiAodm9pZCkKLXsKLSAgICBpbnQgeWVhciwgaTsKLSAgICB0aW1lX3QgZ3Vlc3M7Ci0gICAgdGltZV90IG9mZnNldCA9IDA7Ci0gLyogdGltZV90IG9mZnNldCA9IDA7ICovCi0gLyogdGltZV90IG9mZnNldCA9ICgoMzEgKyAyOCkgKiAyNCAqIDM2MDApIC0gMTsgKi8KLSAgICB0aW1lX3Qgc2Vjc3RvZGF0ZSwgbmV3c2VjczsKLSAgICBjaGFyIGRhdGVzdHJbNTBdOwotCi0gICAgZm9yICh5ZWFyID0gMTk3MDsgeWVhciA8IDIwMzg7ICsreWVhcikgewotICAgICAgICBzZWNzdG9kYXRlID0gKHRpbWVfdCl5ZWFyMnNlY3NbeWVhciAtIDE5NzBdICsgb2Zmc2V0OwotICAgICAgICBnbV90aW1lc3RyXzgyMihkYXRlc3RyLCBzZWNzdG9kYXRlKTsKLSAgICAgICAgbmV3c2VjcyA9IHBhcnNlSFRUUGRhdGUoZGF0ZXN0cik7Ci0gICAgICAgIGlmIChzZWNzdG9kYXRlID09IG5ld3NlY3MpCi0gICAgICAgICAgICBwcmludGYoIlllcyAlNGQgJTExbGQgICVzXG4iLCB5ZWFyLCAobG9uZylzZWNzdG9kYXRlLCBkYXRlc3RyKTsKLSAgICAgICAgZWxzZSBpZiAobmV3c2VjcyA9PSBCQURfREFURSkKLSAgICAgICAgICAgIHByaW50ZigiTm8gICU0ZCAlMTFsZCAlMTFsZCAlc1xuIiwgeWVhciwgKGxvbmcpc2Vjc3RvZGF0ZSwgCi0gICAgICAgICAgICAgICAgICAgKGxvbmcpbmV3c2VjcywgZGF0ZXN0cik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHByaW50ZigiTm8qICU0ZCAlMTFsZCAlMTFsZCAlc1xuIiwgeWVhciwgKGxvbmcpc2Vjc3RvZGF0ZSwgCi0gICAgICAgICAgICAgICAgICAgKGxvbmcpbmV3c2VjcywgZGF0ZXN0cik7Ci0gICAgfQotICAgIAotICAgIHNyYW5kNDgoOTc4MjQ1TCk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDA7ICsraSkgewotICAgICAgICBndWVzcyA9ICh0aW1lX3QpbXJhbmQ0OCgpOwotICAgICAgICBpZiAoZ3Vlc3MgPCAwKSBndWVzcyAqPSAtMTsKLSAgICAgICAgc2Vjc3RvZGF0ZSA9IGd1ZXNzICsgb2Zmc2V0OwotICAgICAgICBnbV90aW1lc3RyXzgyMihkYXRlc3RyLCBzZWNzdG9kYXRlKTsKLSAgICAgICAgbmV3c2VjcyA9IHBhcnNlSFRUUGRhdGUoZGF0ZXN0cik7Ci0gICAgICAgIGlmIChzZWNzdG9kYXRlID09IG5ld3NlY3MpCi0gICAgICAgICAgICBwcmludGYoIlllcyAlMTFsZCAgJXNcbiIsIChsb25nKXNlY3N0b2RhdGUsIGRhdGVzdHIpOwotICAgICAgICBlbHNlIGlmIChuZXdzZWNzID09IEJBRF9EQVRFKQotICAgICAgICAgICAgcHJpbnRmKCJObyAgJTExbGQgJTExbGQgJXNcbiIsIChsb25nKXNlY3N0b2RhdGUsIAotICAgICAgICAgICAgICAgICAgIChsb25nKW5ld3NlY3MsIGRhdGVzdHIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwcmludGYoIk5vKiAlMTFsZCAlMTFsZCAlc1xuIiwgKGxvbmcpc2Vjc3RvZGF0ZSwgCi0gICAgICAgICAgICAgICAgICAgKGxvbmcpbmV3c2VjcywgZGF0ZXN0cik7Ci0gICAgfQotICAgIGV4aXQoMCk7Ci19CmRpZmYgLS1naXQgYS90ZXN0L3Rlc3RfZmluZC5jIGIvdGVzdC90ZXN0X2ZpbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQxNDFlOS4uMDAwMDAwMAotLS0gYS90ZXN0L3Rlc3RfZmluZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyogVGhpcyBwcm9ncmFtIHRlc3RzIHRoZSBhcF9maW5kX2xpc3RfaXRlbSByb3V0aW5lIGluIC4uL21haW4vdXRpbC5jLgotICoKLSAqIFRoZSBkZWZpbmVzIGluIHRoaXMgc2FtcGxlIGNvbXBpbGUgbGluZSBhcmUgc3BlY2lmaWMgdG8gUm95J3Mgc3lzdGVtLgotICogVGhleSBzaG91bGQgbWF0Y2ggd2hhdGV2ZXIgd2FzIHVzZWQgdG8gY29tcGlsZSBBcGFjaGUgZmlyc3QuCi0gKgotICAgICBnY2MgLWcgLU8yIC1JLi4vb3MvdW5peCAtSS4uL2luY2x1ZGUgLW8gdGVzdF9maW5kIFwKLSAgICAgICAgICAgIC1EU09MQVJJUzI9MjUwIC1XYWxsIC1EQUxMT0NfREVCVUcgLURQT09MX0RFQlVHIFwKLSAgICAgICAgICAgIC4uL21haW4vYWxsb2MubyAuLi9tYWluL2J1ZmYubyAuLi9tYWluL3V0aWwubyBcCi0gICAgICAgICAgICAuLi9hcC9saWJhcC5hIC1sc29ja2V0IC1sbnNsIHRlc3RfZmluZC5jCi0gKiAKLSAqIFJveSBGaWVsZGluZywgMTk5OQotICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlICJodHRwZC5oIgotI2luY2x1ZGUgImFwcl9nZW5lcmFsLmgiCi0KLS8qCi0gKiBEdW1teSBhIGJ1bmNoIG9mIHN0dWZmIGp1c3QgdG8gZ2V0IGEgY29tcGlsZQotICovCi11aWRfdCBhcF91c2VyX2lkOwotZ2lkX3QgYXBfZ3JvdXBfaWQ7Ci12b2lkICphcF9kdW1teV9tdXRleCA9ICZhcF9kdW1teV9tdXRleDsKLWNoYXIgKmFwX3NlcnZlcl9hcmd2MDsKLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9ibG9ja19hbGFybXModm9pZCkKLXsKLSAgICA7Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfdW5ibG9ja19hbGFybXModm9pZCkKLXsKLSAgICA7Ci19Ci0KLUFQSV9FWFBPUlQodm9pZCkgYXBfbG9nX2Vycm9yKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBpbnQgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgOwotfQotCi1pbnQgbWFpbiAodm9pZCkKLXsKLSAgICBhcF9jb250ZXh0X3QgKnA7Ci0gICAgY2hhciBsaW5lWzUxMl07Ci0gICAgY2hhciB0b2tbNTEyXTsKLQotICAgIHAgPSBhcF9pbml0X2FsbG9jKCk7Ci0KLSAgICBwcmludGYoIkVudGVyIGZpZWxkIHZhbHVlIHRvIGZpbmQgaXRlbXMgd2l0aGluOlxuIik7Ci0gICAgaWYgKCFnZXRzKGxpbmUpKQotICAgICAgICBleGl0KDApOwotCi0gICAgcHJpbnRmKCJFbnRlciBzZWFyY2ggaXRlbTpcbiIpOwotICAgIHdoaWxlIChnZXRzKHRvaykpIHsKLSAgICAgICAgcHJpbnRmKCIgIFslc10gPT0gJXNcbiIsIHRvaywgYXBfZmluZF9saXN0X2l0ZW0ocCwgbGluZSwgdG9rKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIlllcyIgOiAiTm8iKTsKLSAgICAgICAgcHJpbnRmKCJFbnRlciBzZWFyY2ggaXRlbTpcbiIpOwotICAgIH0KLSAgICAKLSAgICBleGl0KDApOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0X2xpbWl0cy5jIGIvdGVzdC90ZXN0X2xpbWl0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDc2Y2UyLi4wMDAwMDAwCi0tLSBhL3Rlc3QvdGVzdF9saW1pdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIHRlc3RfbGltaXRzLmMKLSAqCi0gKiBBIHNpbXBsZSBwcm9ncmFtIGZvciBzZW5kaW5nIGFidXNpdmUgcmVxdWVzdHMgdG8gYSBzZXJ2ZXIsIGJhc2VkCi0gKiBvbiB0aGUgc2lvdXguYyBleHBsb2l0IGNvZGUgdGhhdCB0aGlzIG5pbXJvZCBwb3N0ZWQgKHNlZSBiZWxvdykuCi0gKiBSb3kgYWRkZWQgb3B0aW9ucyBmb3IgdGVzdGluZyBsb25nIGhlYWRlciBmaWVsZHNpemUgKC10IGgpLCBsb25nCi0gKiByZXF1ZXN0LWxpbmVzICgtdCByKSwgYW5kIGEgbG9uZyByZXF1ZXN0IGJvZHkgKC10IGIpLgotICoKLSAqIEZyZWVCU0QgMi4yLngsIEZyZWVCU0QgMy4wLCBJUklYIDUuMywgSVJJWCA2LjI6Ci0gKiAgIGdjYyAtbyB0ZXN0X2xpbWl0cyB0ZXN0X2xpbWl0cy5jCi0gKiAKLSAqIFNvbGFyaXMgMi41LjE6Ci0gKiAgIGdjYyAtbyB0ZXN0X2xpbWl0cyB0ZXN0X2xpbWl0cy5jIC1sc29ja2V0IC1sbnNsCi0gKiAKLSAqCi0gKiBNZXNzYWdlLUlEOiA8ODYxenFzcHZ0dy5mc2ZAbmlvYmUuZXdveC5vcmc+Ci0gKiBEYXRlOiAJRnJpLCA3IEF1ZyAxOTk4IDE5OjA0OjI3ICswMjAwCi0gKiBTZW5kZXI6IEJ1Z3RyYXEgTGlzdCA8QlVHVFJBUUBuZXRzcGFjZS5vcmc+Ci0gKiBGcm9tOiBEYWctRXJsaW5nIENvaWRhbiA9P0lTTy04ODU5LTE/UT9TbT1GOHJncmF2Pz0gPGZpbnJvZEBFV09YLk9SRz4KLSAqIFN1YmplY3Q6ICAgICAgWUEgQXBhY2hlIERvUyBhdHRhY2sKLSAqIAotICogQ29weXJpZ2h0IChjKSAxOTk4IERhZy1FcmxpbmcgQ29kYW4gU21yZ3JhdgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqICAgIGluIHRoaXMgcG9zaXRpb24gYW5kIHVuY2hhbmdlZC4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3VnaCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICovCi0KLS8qCi0gKiBLdWRvcyB0byBNYXJrIEh1aXplciB3aG8gb3JpZ2luYWxseSBzdWdnZXN0ZWQgdGhpcyBvbiBmcmVlYnNkLWN1cnJlbnQKLSAqLwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3Vpby5oPgotCi0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2RlZmluZSBURVNUX0xPTkdfUkVRVUVTVF9MSU5FICAgICAgMQotI2RlZmluZSBURVNUX0xPTkdfUkVRVUVTVF9GSUVMRFMgICAgMgotI2RlZmluZSBURVNUX0xPTkdfUkVRVUVTVF9GSUVMRFNJWkUgMwotI2RlZmluZSBURVNUX0xPTkdfUkVRVUVTVF9CT0RZICAgICAgNAotCi12b2lkCi11c2FnZSh2b2lkKQotewotICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgInVzYWdlOiB0ZXN0X2xpbWl0cyBbLXQgKHJ8bnxofGIpXSBbLWEgYWRkcmVzc10gWy1wIHBvcnRdIFstbiBudW1dXG4iKTsKLSAgICBleGl0KDEpOwotfQotCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOwotICAgIHN0cnVjdCBob3N0ZW50ICpoZTsKLSAgICBGSUxFICpmOwotICAgIGludCBvLCBzZDsKLQotICAgIC8qIGRlZmF1bHQgcGFyYW1ldGVycyAqLwotICAgIGNoYXIgKmFkZHIgPSAibG9jYWxob3N0IjsKLSAgICBpbnQgcG9ydCA9IDgwOwotICAgIGludCBudW0gPSAxMDAwOwotICAgIGludCB0ZXN0dHlwZSA9IFRFU1RfTE9OR19SRVFVRVNUX0ZJRUxEUzsKLQotICAgIC8qIGdldCBvcHRpb25zICovCi0gICAgd2hpbGUgKChvID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJ0OmE6cDpuOiIpKSAhPSBFT0YpCi0gICAgICAgIHN3aXRjaCAobykgewotICAgICAgICBjYXNlICd0JzoKLSAgICAgICAgICAgIGlmICgqb3B0YXJnID09ICdyJykKLSAgICAgICAgICAgICAgICB0ZXN0dHlwZSA9IFRFU1RfTE9OR19SRVFVRVNUX0xJTkU7Ci0gICAgICAgICAgICBlbHNlIGlmICgqb3B0YXJnID09ICduJykKLSAgICAgICAgICAgICAgICB0ZXN0dHlwZSA9IFRFU1RfTE9OR19SRVFVRVNUX0ZJRUxEUzsKLSAgICAgICAgICAgIGVsc2UgaWYgKCpvcHRhcmcgPT0gJ2gnKQotICAgICAgICAgICAgICAgIHRlc3R0eXBlID0gVEVTVF9MT05HX1JFUVVFU1RfRklFTERTSVpFOwotICAgICAgICAgICAgZWxzZSBpZiAoKm9wdGFyZyA9PSAnYicpCi0gICAgICAgICAgICAgICAgdGVzdHR5cGUgPSBURVNUX0xPTkdfUkVRVUVTVF9CT0RZOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2EnOgotICAgICAgICAgICAgYWRkciA9IG9wdGFyZzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdwJzoKLSAgICAgICAgICAgIHBvcnQgPSBhdG9pKG9wdGFyZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnbic6Ci0gICAgICAgICAgICBudW0gPSBhdG9pKG9wdGFyZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgIH0KLQotICAgIGlmIChhcmdjICE9IG9wdGluZCkKLSAgICAgICAgdXNhZ2UoKTsKLQotICAgIC8qIGNvbm5lY3QgKi8KLSAgICBpZiAoKGhlID0gZ2V0aG9zdGJ5bmFtZShhZGRyKSkgPT0gTlVMTCkgewotICAgICAgICBwZXJyb3IoImdldGhvc3RieW5hbWUiKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgYnplcm8oJnNpbiwgc2l6ZW9mKHNpbikpOwotICAgIGJjb3B5KGhlLT5oX2FkZHIsIChjaGFyICopJnNpbi5zaW5fYWRkciwgaGUtPmhfbGVuZ3RoKTsKLSAgICBzaW4uc2luX2ZhbWlseSA9IGhlLT5oX2FkZHJ0eXBlOwotICAgIHNpbi5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwotCi0gICAgaWYgKChzZCA9IHNvY2tldChzaW4uc2luX2ZhbWlseSwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKSkgPT0gLTEpIHsKLSAgICAgICAgcGVycm9yKCJzb2NrZXQiKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBpZiAoY29ubmVjdChzZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzaW4sIHNpemVvZihzaW4pKSA9PSAtMSkgewotICAgICAgICBwZXJyb3IoImNvbm5lY3QiKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBpZiAoKGYgPSBmZG9wZW4oc2QsICJyKyIpKSA9PSBOVUxMKSB7Ci0gICAgICAgIHBlcnJvcigiZmRvcGVuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgLyogYXR0YWNrISAqLwotICAgIGZwcmludGYoc3RkZXJyLCAiVGVzdGluZyBsaWtlIGEgcGxhZ3VlIG9mIGxvY3VzdHMgb24gJXNcbiIsIGFkZHIpOwotCi0gICAgaWYgKHRlc3R0eXBlID09IFRFU1RfTE9OR19SRVFVRVNUX0xJTkUpIHsKLSAgICAgICAgZnByaW50ZihmLCAiR0VUICIpOwotICAgICAgICB3aGlsZSAobnVtLS0gJiYgIWZlcnJvcihmKSkgewotICAgICAgICAgICAgZnByaW50ZihmLCAiLzEyMzQ1Njc4OSIpOwotICAgICAgICAgICAgZmZsdXNoKGYpOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYoZiwgIiBIVFRQLzEuMFxyXG5cclxuIik7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBmcHJpbnRmKGYsICJHRVQgL2ZyZWQvZm9vIEhUVFAvMS4wXHJcbiIpOwotCi0gICAgICAgIGlmICh0ZXN0dHlwZSA9PSBURVNUX0xPTkdfUkVRVUVTVF9GSUVMRFNJWkUpIHsKLSAgICAgICAgICAgIHdoaWxlIChudW0tLSAmJiAhZmVycm9yKGYpKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihmLCAiVXNlci1BZ2VudDogc2lvdXgiKTsKLSAgICAgICAgICAgICAgICBmZmx1c2goZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcHJpbnRmKGYsICJcclxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGVzdHR5cGUgPT0gVEVTVF9MT05HX1JFUVVFU1RfRklFTERTKSB7Ci0gICAgICAgICAgICB3aGlsZSAobnVtLS0gJiYgIWZlcnJvcihmKSkKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJVc2VyLUFnZW50OiBzaW91eFxyXG4iKTsKLSAgICAgICAgICAgIGZwcmludGYoZiwgIlxyXG4iKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0ZXN0dHlwZSA9PSBURVNUX0xPTkdfUkVRVUVTVF9CT0RZKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKGYsICJVc2VyLUFnZW50OiBzaW91eFxyXG4iKTsKLSAgICAgICAgICAgIGZwcmludGYoZiwgIkNvbnRlbnQtTGVuZ3RoOiAzMzU1NDQzM1xyXG4iKTsKLSAgICAgICAgICAgIGZwcmludGYoZiwgIlxyXG4iKTsKLSAgICAgICAgICAgIHdoaWxlIChudW0tLSAmJiAhZmVycm9yKGYpKQotICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIlVzZXItQWdlbnQ6IHNpb3V4XHJcbiIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZnByaW50ZihmLCAiXHJcbiIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGZmbHVzaChmKTsKLQotICAgIHsKLSAgICAgICAgc3NpemVfdCBsZW47Ci0gICAgICAgIGNoYXIgYnVmZls1MTJdOwotCi0gICAgICAgIHdoaWxlICgobGVuID0gcmVhZChzZCwgYnVmZiwgNTEyKSkgPiAwKQotICAgICAgICAgICAgbGVuID0gd3JpdGUoMSwgYnVmZiwgbGVuKTsKLSAgICB9Ci0gICAgaWYgKGZlcnJvcihmKSkgewotICAgICAgICBwZXJyb3IoImZwcmludGYiKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBmY2xvc2UoZik7Ci0gICAgZXhpdCgwKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdF9wYXJzZXIuYyBiL3Rlc3QvdGVzdF9wYXJzZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlkNTNmZS4uMDAwMDAwMAotLS0gYS90ZXN0L3Rlc3RfcGFyc2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKiBUaGlzIHByb2dyYW0gdGVzdHMgdGhlIGFwX2dldF9saXN0X2l0ZW0gcm91dGluZSBpbiAuLi9tYWluL3V0aWwuYy4KLSAqCi0gKiBUaGUgZGVmaW5lcyBpbiB0aGlzIHNhbXBsZSBjb21waWxlIGxpbmUgYXJlIHNwZWNpZmljIHRvIFJveSdzIHN5c3RlbS4KLSAqIFRoZXkgc2hvdWxkIG1hdGNoIHdoYXRldmVyIHdhcyB1c2VkIHRvIGNvbXBpbGUgQXBhY2hlIGZpcnN0LgotICoKLSAgICAgZ2NjIC1nIC1PMiAtSS4uL29zL3VuaXggLUkuLi9pbmNsdWRlIC1vIHRlc3RfcGFyc2VyIFwKLSAgICAgICAgICAgIC1EU09MQVJJUzI9MjUwIC1XYWxsIC1EQUxMT0NfREVCVUcgLURQT09MX0RFQlVHIFwKLSAgICAgICAgICAgIC4uL21haW4vYWxsb2MubyAuLi9tYWluL2J1ZmYubyAuLi9tYWluL3V0aWwubyBcCi0gICAgICAgICAgICAuLi9hcC9saWJhcC5hIC1sc29ja2V0IC1sbnNsIHRlc3RfcGFyc2VyLmMKLSAqIAotICogUm95IEZpZWxkaW5nLCAxOTk5Ci0gKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgImh0dHBkLmgiCi0jaW5jbHVkZSAiYXByX2dlbmVyYWwuaCIKLQotLyoKLSAqIER1bW15IGEgYnVuY2ggb2Ygc3R1ZmYganVzdCB0byBnZXQgYSBjb21waWxlCi0gKi8KLXVpZF90IGFwX3VzZXJfaWQ7Ci1naWRfdCBhcF9ncm91cF9pZDsKLXZvaWQgKmFwX2R1bW15X211dGV4ID0gJmFwX2R1bW15X211dGV4OwotY2hhciAqYXBfc2VydmVyX2FyZ3YwOwotCi1BUElfRVhQT1JUKHZvaWQpIGFwX2Jsb2NrX2FsYXJtcyh2b2lkKQotewotICAgIDsKLX0KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF91bmJsb2NrX2FsYXJtcyh2b2lkKQotewotICAgIDsKLX0KLQotQVBJX0VYUE9SVCh2b2lkKSBhcF9sb2dfZXJyb3IoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGludCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0X3JlYyAqciwgY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgOwotfQotCi1pbnQgbWFpbiAodm9pZCkKLXsKLSAgICBhcF9jb250ZXh0X3QgKnA7Ci0gICAgY29uc3QgY2hhciAqZmllbGQ7Ci0gICAgY2hhciAqbmV3c3RyOwotICAgIGNoYXIgaW5zdHJbNTEyXTsKLQotICAgIHAgPSBhcF9pbml0X2FsbG9jKCk7Ci0KLSAgICB3aGlsZSAoZ2V0cyhpbnN0cikpIHsKLSAgICAgICAgcHJpbnRmKCIgIFslc10gPT1cbiIsIGluc3RyKTsKLSAgICAgICAgZmllbGQgPSBpbnN0cjsKLSAgICAgICAgd2hpbGUgKChuZXdzdHIgPSBhcF9nZXRfbGlzdF9pdGVtKHAsICZmaWVsZCkpICE9IE5VTEwpCi0gICAgICAgICAgICBwcmludGYoIiAgPCVzPiAuLlxuIiwgbmV3c3RyKTsKLSAgICB9Ci0gICAgCi0gICAgZXhpdCgwKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdF9zZWxlY3QuYyBiL3Rlc3QvdGVzdF9zZWxlY3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwYTZhNC4uMDAwMDAwMAotLS0gYS90ZXN0L3Rlc3Rfc2VsZWN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKiBUaGlzIGlzIGp1c3QgYSBxdWljayB0ZXN0IHByb2dyYW0gdG8gc2VlIGhvdyBsb25nIGEgd2FpdCBpcwotICogcHJvZHVjZWQgYnkgYSBzZWxlY3QgbG9vcCB3aXRoIGFuIGV4cG9uZW50aWFsIGJhY2tvZmYuCi0gKgotICogICBnY2MgLWcgLU8yIC1vIHRlc3Rfc2VsZWN0IHRlc3Rfc2VsZWN0LmMKLSAqICAgdGVzdF9zZWxlY3QKLSAqCi0gKiBSb3kgRmllbGRpbmcsIDE5OTYKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotCi1pbnQgbWFpbiAodm9pZCkKLXsKLSAgICBpbnQgc3J2OwotICAgIGxvbmcgd2FpdHRpbWUgPSA0MDk2OwotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotCi0gICAgcHJpbnRmKCJTdGFydFxuIik7Ci0gICAgd2hpbGUgKCh3YWl0dGltZSA+IDApICYmICh3YWl0dGltZSA8IDMwMDAwMDApKSB7Ci0gICAgICAgIHByaW50ZigiJWRcbiIsIHdhaXR0aW1lKTsKLSAgICAgICAgdHYudHZfc2VjICA9IHdhaXR0aW1lLzEwMDAwMDA7Ci0gICAgICAgIHR2LnR2X3VzZWMgPSB3YWl0dGltZSUxMDAwMDAwOwotICAgICAgICB3YWl0dGltZSA8PD0gMTsKLSAgICAgICAgc3J2ID0gc2VsZWN0KDAsIE5VTEwsIE5VTEwsIE5VTEwsICZ0dik7Ci0gICAgfQotICAgIHByaW50ZigiRW5kXG4iKTsKLSAgICBleGl0KDApOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC90aW1lLXNlbS5jIGIvdGVzdC90aW1lLXNlbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODAwODQ0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvdGltZS1zZW0uYworKysgL2Rldi9udWxsCkBAIC0xLDU3MiArMCwwIEBACi0vKgotdGltZS1zZW0uYyBoYXMgdGhlIGJhc2ljcyBvZiB0aGUgc2VtYXBob3JlcyB3ZSB1c2UgaW4gaHR0cF9tYWluLmMuICBJdCdzCi1pbnRlbmRlZCBmb3IgdGltaW5nIGRpZmZlcmVuY2VzIGJldHdlZW4gdmFyaW91cyBtZXRob2RzIG9uIGFuCi1hcmNoaXRlY3R1cmUuICBJbiBwcmFjdGljZSB3ZSd2ZSBmb3VuZCBtYW55IHRoaW5ncyBhZmZlY3Qgd2hpY2ggc2VtYXBob3JlCi10byBiZSB1c2VkOgotCi0gICAgLSBORlMgZmlsZXN5c3RlbXMgYWJzb2x1dGVseSBzdWNrIGZvciBmY250bCgpIGFuZCBmbG9jaygpCi0KLSAgICAtIHVzbG9jayBhYnNvbHV0ZWx5IHN1Y2tzIG9uIHNpbmdsZS1wcm9jZXNzb3IgSVJJWCBib3hlcywgYnV0Ci0JYWJzb2x1dGVseSByb2NrcyBvbiBtdWx0aS1wcm9jZXNzb3IgYm94ZXMuICBUaGUgY29udmVyc2UKLQlpcyB0cnVlIGZvciBmY250bC4gIHN5c3ZzZW0gc2VlbXMgYSBtb2RlcmF0ZSBiYWxhbmNlLgotCi0gICAgLSBVbmRlciBTb2xhcmlzIHlvdSBjYW4ndCBoYXZlIHRvbyBtYW55IHByb2Nlc3NlcyB1c2UgU0VNX1VORE8sIHRoZXJlCi0JbWlnaHQgYmUgYSB0dW5lYWJsZSBzb21ld2hlcmUgdGhhdCBpbmNyZWFzZXMgdGhlIGxpbWl0IGZyb20gMjkuCi0JV2UncmUgbm90IHN1cmUgd2hhdCB0aGUgdHVuYWJsZSBpcywgc28gdGhlcmUncyBhIGRlZmluZQotCU5PX1NFTV9VTkRPIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHNpbXVsYXRlIHVzIHRyYXBwaW5nL2Jsb2NraW5nCi0Jc2lnbmFscyB0byBiZSBhYmxlIHRvIHByb3Blcmx5IHJlbGVhc2UgdGhlIHNlbWFwaG9yZSBvbiBhIGNsZWFuCi0JY2hpbGQgZGVhdGguICBZb3UnbGwgYWxzbyBuZWVkIHRvIGRlZmluZSBORUVEX1VOSU9OX1NFTVVOCi0JdW5kZXIgc29sYXJpcy4KLQotWW91J2xsIG5lZWQgdG8gZGVmaW5lIFVTRV9TSE1HRVRfU0NPUkVCT0FSRCBpZiBhbm9ueW1vdXMgc2hhcmVkIG1tYXAoKQotZG9lc24ndCB3b3JrIG9uIHlvdXIgc3lzdGVtIChpLmUuIGxpbnV4KS4KLQotYXJndlsxXSBpcyB0aGUgI2NoaWxkcmVuLCBhcmd2WzJdIGlzIHRoZSAjaXRlcmF0aW9ucyBwZXIgY2hpbGQKLQotWW91IHNob3VsZCBydW4gZWFjaCBvdmVyIG1hbnkgZGlmZmVyZW50ICNjaGlsZHJlbiBpbnB1dHMsIGFuZCBjaG9vc2UKLSNpdGVyIHN1Y2ggdGhhdCB0aGUgcHJvZ3JhbSBydW5zIGZvciBhdCBsZWFzdCBhIHNlY29uZCBvciBzby4uLiBvciBldmVuCi1sb25nZXIgZGVwZW5kaW5nIG9uIHlvdXIgcGF0aWVuY2UuCi0KLWNvbXBpbGUgd2l0aDoKLQotZ2NjIC1vIHRpbWUtRkNOVEwgLVdhbGwgLU8gdGltZS1zZW0uYyAtRFVTRV9GQ05UTF9TRVJJQUxJWkVEX0FDQ0VQVAotZ2NjIC1vIHRpbWUtRkxPQ0sgLVdhbGwgLU8gdGltZS1zZW0uYyAtRFVTRV9GTE9DS19TRVJJQUxJWkVEX0FDQ0VQVAotZ2NjIC1vIHRpbWUtU1lTVlNFTSAtV2FsbCAtTyB0aW1lLXNlbS5jIC1EVVNFX1NZU1ZTRU1fU0VSSUFMSVpFRF9BQ0NFUFQKLWdjYyAtbyB0aW1lLVNZU1ZTRU0yIC1XYWxsIC1PIHRpbWUtc2VtLmMgLURVU0VfU1lTVlNFTV9TRVJJQUxJWkVEX0FDQ0VQVCAtRE5PX1NFTV9VTkRPCi1nY2MgLW8gdGltZS1QVEhSRUFEIC1XYWxsIC1PIHRpbWUtc2VtLmMgLURVU0VfUFRIUkVBRF9TRVJJQUxJWkVEX0FDQ0VQVCAtbHB0aHJlYWQKLWdjYyAtbyB0aW1lLVVTTE9DSyAtV2FsbCAtTyB0aW1lLXNlbS5jIC1EVVNFX1VTTE9DS19TRVJJQUxJWkVEX0FDQ0VQVAotCi1ub3QgYWxsIHZlcnNpb25zIHdvcmsgb24gYWxsIHN5c3RlbXMuCi0qLwotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2lmIGRlZmluZWQoVVNFX0ZDTlRMX1NFUklBTElaRURfQUNDRVBUKQotCi1zdGF0aWMgc3RydWN0IGZsb2NrIGxvY2tfaXQ7Ci1zdGF0aWMgc3RydWN0IGZsb2NrIHVubG9ja19pdDsKLQotc3RhdGljIGludCBmY250bF9mZD0tMTsKLQotI2RlZmluZSBhY2NlcHRfbXV0ZXhfY2hpbGRfaW5pdCgpCi0jZGVmaW5lIGFjY2VwdF9tdXRleF9jbGVhbnVwKCkKLQotLyoKLSAqIEluaXRpYWxpemUgbXV0ZXggbG9jay4KLSAqIE11c3QgYmUgc2FmZSB0byBjYWxsIHRoaXMgb24gYSByZXN0YXJ0LgotICovCi12b2lkCi1hY2NlcHRfbXV0ZXhfaW5pdCh2b2lkKQotewotCi0gICAgbG9ja19pdC5sX3doZW5jZSA9IFNFRUtfU0VUOyAgIC8qIGZyb20gY3VycmVudCBwb2ludCAqLwotICAgIGxvY2tfaXQubF9zdGFydCAgPSAwOyAgICAgICAgICAvKiAtIi0gKi8KLSAgICBsb2NrX2l0LmxfbGVuICAgID0gMDsgICAgICAgICAgLyogdW50aWwgZW5kIG9mIGZpbGUgKi8KLSAgICBsb2NrX2l0LmxfdHlwZSAgID0gRl9XUkxDSzsgICAgLyogc2V0IGV4Y2x1c2l2ZS93cml0ZSBsb2NrICovCi0gICAgbG9ja19pdC5sX3BpZCAgICA9IDA7ICAgICAgICAgIC8qIHBpZCBub3QgYWN0dWFsbHkgaW50ZXJlc3RpbmcgKi8KLSAgICB1bmxvY2tfaXQubF93aGVuY2UgPSBTRUVLX1NFVDsgLyogZnJvbSBjdXJyZW50IHBvaW50ICovCi0gICAgdW5sb2NrX2l0Lmxfc3RhcnQgID0gMDsgICAgICAgIC8qIC0iLSAqLwotICAgIHVubG9ja19pdC5sX2xlbiAgICA9IDA7ICAgICAgICAvKiB1bnRpbCBlbmQgb2YgZmlsZSAqLwotICAgIHVubG9ja19pdC5sX3R5cGUgICA9IEZfVU5MQ0s7ICAvKiBzZXQgZXhjbHVzaXZlL3dyaXRlIGxvY2sgKi8KLSAgICB1bmxvY2tfaXQubF9waWQgICAgPSAwOyAgICAgICAgLyogcGlkIG5vdCBhY3R1YWxseSBpbnRlcmVzdGluZyAqLwotCi0gICAgcHJpbnRmKCJvcGVuaW5nIHRlc3QtbG9jay10aGluZyBpbiBjdXJyZW50IGRpcmVjdG9yeVxuIik7Ci0gICAgZmNudGxfZmQgPSBvcGVuKCJ0ZXN0LWxvY2stdGhpbmciLCBPX0NSRUFUIHwgT19XUk9OTFkgfCBPX0VYQ0wsIDA2NDQpOwotICAgIGlmIChmY250bF9mZCA9PSAtMSkKLSAgICB7Ci0JcGVycm9yICgib3BlbiIpOwotCWZwcmludGYgKHN0ZGVyciwgIkNhbm5vdCBvcGVuIGxvY2sgZmlsZTogJXNcbiIsICJ0ZXN0LWxvY2stdGhpbmciKTsKLQlleGl0ICgxKTsKLSAgICB9Ci0gICAgdW5saW5rKCJ0ZXN0LWxvY2stdGhpbmciKTsKLX0KLQotdm9pZCBhY2NlcHRfbXV0ZXhfb24odm9pZCkKLXsKLSAgICBpbnQgcmV0OwotICAgIAotICAgIHdoaWxlICgocmV0ID0gZmNudGwoZmNudGxfZmQsIEZfU0VUTEtXLCAmbG9ja19pdCkpIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKLQljb250aW51ZTsKLQotICAgIGlmIChyZXQgPCAwKSB7Ci0JcGVycm9yICgiZmNudGwgbG9ja19pdCIpOwotCWV4aXQoMSk7Ci0gICAgfQotfQotCi12b2lkIGFjY2VwdF9tdXRleF9vZmYodm9pZCkKLXsKLSAgICBpZiAoZmNudGwgKGZjbnRsX2ZkLCBGX1NFVExLVywgJnVubG9ja19pdCkgPCAwKQotICAgIHsKLQlwZXJyb3IgKCJmY250bCB1bmxvY2tfaXQiKTsKLQlleGl0KDEpOwotICAgIH0KLX0KLQotI2VsaWYgZGVmaW5lZChVU0VfRkxPQ0tfU0VSSUFMSVpFRF9BQ0NFUFQpCi0KLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotCi1zdGF0aWMgaW50IGZsb2NrX2ZkPS0xOwotCi0jZGVmaW5lIEZOQU1FICJ0ZXN0LWxvY2stdGhpbmciCi0KLS8qCi0gKiBJbml0aWFsaXplIG11dGV4IGxvY2suCi0gKiBNdXN0IGJlIHNhZmUgdG8gY2FsbCB0aGlzIG9uIGEgcmVzdGFydC4KLSAqLwotdm9pZCBhY2NlcHRfbXV0ZXhfaW5pdCh2b2lkKQotewotCi0gICAgcHJpbnRmKCJvcGVuaW5nICIgRk5BTUUgIiBpbiBjdXJyZW50IGRpcmVjdG9yeVxuIik7Ci0gICAgZmxvY2tfZmQgPSBvcGVuKEZOQU1FLCBPX0NSRUFUIHwgT19XUk9OTFkgfCBPX0VYQ0wsIDA2NDQpOwotICAgIGlmIChmbG9ja19mZCA9PSAtMSkKLSAgICB7Ci0JcGVycm9yICgib3BlbiIpOwotCWZwcmludGYgKHN0ZGVyciwgIkNhbm5vdCBvcGVuIGxvY2sgZmlsZTogJXNcbiIsICJ0ZXN0LWxvY2stdGhpbmciKTsKLQlleGl0ICgxKTsKLSAgICB9Ci19Ci0KLXZvaWQgYWNjZXB0X211dGV4X2NoaWxkX2luaXQodm9pZCkKLXsKLSAgICBmbG9ja19mZCA9IG9wZW4oRk5BTUUsIE9fV1JPTkxZLCAwNjAwKTsKLSAgICBpZiAoZmxvY2tfZmQgPT0gLTEpIHsKLQlwZXJyb3IoIm9wZW4iKTsKLQlleGl0KDEpOwotICAgIH0KLX0KLQotdm9pZCBhY2NlcHRfbXV0ZXhfY2xlYW51cCh2b2lkKQotewotICAgIHVubGluayhGTkFNRSk7Ci19Ci0KLXZvaWQgYWNjZXB0X211dGV4X29uKHZvaWQpCi17Ci0gICAgaW50IHJldDsKLSAgICAKLSAgICB3aGlsZSAoKHJldCA9IGZsb2NrKGZsb2NrX2ZkLCBMT0NLX0VYKSkgPCAwICYmIGVycm5vID09IEVJTlRSKQotCWNvbnRpbnVlOwotCi0gICAgaWYgKHJldCA8IDApIHsKLQlwZXJyb3IgKCJmbG9jayhMT0NLX0VYKSIpOwotCWV4aXQoMSk7Ci0gICAgfQotfQotCi12b2lkIGFjY2VwdF9tdXRleF9vZmYodm9pZCkKLXsKLSAgICBpZiAoZmxvY2sgKGZsb2NrX2ZkLCBMT0NLX1VOKSA8IDApCi0gICAgewotCXBlcnJvciAoImZsb2NrKExPQ0tfVU4pIik7Ci0JZXhpdCgxKTsKLSAgICB9Ci19Ci0KLSNlbGlmIGRlZmluZWQgKFVTRV9TWVNWU0VNX1NFUklBTElaRURfQUNDRVBUKQotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL2lwYy5oPgotI2luY2x1ZGUgPHN5cy9zZW0uaD4KLQotc3RhdGljICAgaW50IHNlbV9pZCA9IC0xOwotI2lmZGVmIE5PX1NFTV9VTkRPCi1zdGF0aWMgc2lnc2V0X3QgYWNjZXB0X2Jsb2NrX21hc2s7Ci1zdGF0aWMgc2lnc2V0X3QgYWNjZXB0X3ByZXZpb3VzX21hc2s7Ci0jZW5kaWYKLQotI2RlZmluZSBhY2NlcHRfbXV0ZXhfY2hpbGRfaW5pdCgpCi0jZGVmaW5lIGFjY2VwdF9tdXRleF9jbGVhbnVwKCkKLQotdm9pZCBhY2NlcHRfbXV0ZXhfaW5pdCh2b2lkKQotewotI2lmZGVmIE5FRURfVU5JT05fU0VNVU4KLSAgICAvKiBiZWxpZXZlIGl0IG9yIG5vdCwgeW91IG5lZWQgdG8gZGVmaW5lIHRoaXMgdW5kZXIgc29sYXJpcyAqLwotICAgIHVuaW9uIHNlbXVuIHsKLQlpbnQgdmFsOwotCXN0cnVjdCBzZW1pZF9kcyAqYnVmOwotCXVzaG9ydCAqYXJyYXk7Ci0gICAgfTsKLSNlbmRpZgotCi0gICAgdW5pb24gc2VtdW4gaWNrOwotCi0gICAgc2VtX2lkID0gc2VtZ2V0KDk5OSwgMSwgSVBDX0NSRUFUIHwgMDY2Nik7Ci0gICAgaWYgKHNlbV9pZCA8IDApIHsKLSAgICAgICBwZXJyb3IgKCJzZW1nZXQiKTsKLSAgICAgICBleGl0ICgxKTsKLSAgICB9Ci0gICAgaWNrLnZhbCA9IDE7Ci0gICAgaWYgKHNlbWN0bChzZW1faWQsIDAsIFNFVFZBTCwgaWNrKSA8IDApIHsKLSAgICAgICBwZXJyb3IgKCJzZW1jdGwiKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0jaWZkZWYgTk9fU0VNX1VORE8KLSAgICBzaWdmaWxsc2V0KCZhY2NlcHRfYmxvY2tfbWFzayk7Ci0gICAgc2lnZGVsc2V0KCZhY2NlcHRfYmxvY2tfbWFzaywgU0lHSFVQKTsKLSAgICBzaWdkZWxzZXQoJmFjY2VwdF9ibG9ja19tYXNrLCBTSUdURVJNKTsKLSAgICBzaWdkZWxzZXQoJmFjY2VwdF9ibG9ja19tYXNrLCBTSUdVU1IxKTsKLSNlbmRpZgotfQotCi12b2lkIGFjY2VwdF9tdXRleF9vbigpCi17Ci0gICAgc3RydWN0IHNlbWJ1ZiBvcDsKLQotI2lmZGVmIE5PX1NFTV9VTkRPCi0gICAgaWYgKHNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJmFjY2VwdF9ibG9ja19tYXNrLCAmYWNjZXB0X3ByZXZpb3VzX21hc2spKSB7Ci0JcGVycm9yKCJzaWdwcm9jbWFzayhTSUdfQkxPQ0spIik7Ci0JZXhpdCAoMSk7Ci0gICAgfQotICAgIG9wLnNlbV9mbGcgPSAwOwotI2Vsc2UKLSAgICBvcC5zZW1fZmxnID0gU0VNX1VORE87Ci0jZW5kaWYKLSAgICBvcC5zZW1fbnVtID0gMDsKLSAgICBvcC5zZW1fb3AgID0gLTE7Ci0gICAgaWYgKHNlbW9wKHNlbV9pZCwgJm9wLCAxKSA8IDApIHsKLQlwZXJyb3IgKCJhY2NlcHRfbXV0ZXhfb24iKTsKLQlleGl0ICgxKTsKLSAgICB9Ci19Ci0KLXZvaWQgYWNjZXB0X211dGV4X29mZigpCi17Ci0gICAgc3RydWN0IHNlbWJ1ZiBvcDsKLQotICAgIG9wLnNlbV9udW0gPSAwOwotICAgIG9wLnNlbV9vcCAgPSAxOwotI2lmZGVmIE5PX1NFTV9VTkRPCi0gICAgb3Auc2VtX2ZsZyA9IDA7Ci0jZWxzZQotICAgIG9wLnNlbV9mbGcgPSBTRU1fVU5ETzsKLSNlbmRpZgotICAgIGlmIChzZW1vcChzZW1faWQsICZvcCwgMSkgPCAwKSB7Ci0JcGVycm9yICgiYWNjZXB0X211dGV4X29mZiIpOwotICAgICAgICBleGl0ICgxKTsKLSAgICB9Ci0jaWZkZWYgTk9fU0VNX1VORE8KLSAgICBpZiAoc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZhY2NlcHRfcHJldmlvdXNfbWFzaywgTlVMTCkpIHsKLQlwZXJyb3IoInNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLKSIpOwotCWV4aXQgKDEpOwotICAgIH0KLSNlbmRpZgotfQotCi0jZWxpZiBkZWZpbmVkIChVU0VfUFRIUkVBRF9TRVJJQUxJWkVEX0FDQ0VQVCkKLQotLyogbm90ZTogcHRocmVhZCBtdXRleGVzIGFyZW4ndCByZWxlYXNlZCBvbiBjaGlsZCBkZWF0aCwgaGVuY2UgdGhlCi0gKiBzaWduYWwgZ29vcCAuLi4gaW4gYSByZWFsIGltcGxlbWVudGF0aW9uIHdlJ2QgZG8gc3BlY2lhbCB0aGluZ3MKLSAqIGR1cmluZyBodXAsIHRlcm0sIHVzcjEuCi0gKi8KLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXg7Ci1zdGF0aWMgc2lnc2V0X3QgYWNjZXB0X2Jsb2NrX21hc2s7Ci1zdGF0aWMgc2lnc2V0X3QgYWNjZXB0X3ByZXZpb3VzX21hc2s7Ci0KLSNkZWZpbmUgYWNjZXB0X211dGV4X2NoaWxkX2luaXQoKQotI2RlZmluZSBhY2NlcHRfbXV0ZXhfY2xlYW51cCgpCi0KLXZvaWQgYWNjZXB0X211dGV4X2luaXQodm9pZCkKLXsKLSAgICBwdGhyZWFkX211dGV4YXR0cl90IG1hdHRyOwotICAgIGludCBmZDsKLQotICAgIGZkID0gb3BlbiAoIi9kZXYvemVybyIsIE9fUkRXUik7Ci0gICAgaWYgKGZkID09IC0xKSB7Ci0JcGVycm9yICgib3BlbigvZGV2L3plcm8pIik7Ci0JZXhpdCAoMSk7Ci0gICAgfQotICAgIG11dGV4ID0gKHB0aHJlYWRfbXV0ZXhfdCAqKW1tYXAgKChjYWRkcl90KTAsIHNpemVvZiAoKm11dGV4KSwKLQkJICAgIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBmZCwgMCk7Ci0gICAgaWYgKG11dGV4ID09ICh2b2lkICopKGNhZGRyX3QpLTEpIHsKLQlwZXJyb3IgKCJtbWFwIik7Ci0JZXhpdCAoMSk7Ci0gICAgfQotICAgIGNsb3NlIChmZCk7Ci0gICAgaWYgKHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJm1hdHRyKSkgewotCXBlcnJvciAoInB0aHJlYWRfbXV0ZXhhdHRyX2luaXQiKTsKLQlleGl0ICgxKTsKLSAgICB9Ci0gICAgaWYgKHB0aHJlYWRfbXV0ZXhhdHRyX3NldHBzaGFyZWQoJm1hdHRyLCBQVEhSRUFEX1BST0NFU1NfU0hBUkVEKSkgewotCXBlcnJvciAoInB0aHJlYWRfbXV0ZXhhdHRyX3NldHBzaGFyZWQiKTsKLQlleGl0ICgxKTsKLSAgICB9Ci0gICAgaWYgKHB0aHJlYWRfbXV0ZXhfaW5pdChtdXRleCwgJm1hdHRyKSkgewotCXBlcnJvciAoInB0aHJlYWRfbXV0ZXhfaW5pdCIpOwotCWV4aXQgKDEpOwotICAgIH0KLSAgICBzaWdmaWxsc2V0KCZhY2NlcHRfYmxvY2tfbWFzayk7Ci0gICAgc2lnZGVsc2V0KCZhY2NlcHRfYmxvY2tfbWFzaywgU0lHSFVQKTsKLSAgICBzaWdkZWxzZXQoJmFjY2VwdF9ibG9ja19tYXNrLCBTSUdURVJNKTsKLSAgICBzaWdkZWxzZXQoJmFjY2VwdF9ibG9ja19tYXNrLCBTSUdVU1IxKTsKLX0KLQotdm9pZCBhY2NlcHRfbXV0ZXhfb24oKQotewotICAgIGlmIChzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZhY2NlcHRfYmxvY2tfbWFzaywgJmFjY2VwdF9wcmV2aW91c19tYXNrKSkgewotCXBlcnJvcigic2lncHJvY21hc2soU0lHX0JMT0NLKSIpOwotCWV4aXQgKDEpOwotICAgIH0KLSAgICBpZiAocHRocmVhZF9tdXRleF9sb2NrIChtdXRleCkpIHsKLQlwZXJyb3IgKCJwdGhyZWFkX211dGV4X2xvY2siKTsKLQlleGl0ICgxKTsKLSAgICB9Ci19Ci0KLXZvaWQgYWNjZXB0X211dGV4X29mZigpCi17Ci0gICAgaWYgKHB0aHJlYWRfbXV0ZXhfdW5sb2NrIChtdXRleCkpIHsKLQlwZXJyb3IgKCJwdGhyZWFkX211dGV4X3VubG9jayIpOwotCWV4aXQgKDEpOwotICAgIH0KLSAgICBpZiAoc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZhY2NlcHRfcHJldmlvdXNfbWFzaywgTlVMTCkpIHsKLQlwZXJyb3IoInNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLKSIpOwotCWV4aXQgKDEpOwotICAgIH0KLX0KLQotI2VsaWYgZGVmaW5lZCAoVVNFX1VTTE9DS19TRVJJQUxJWkVEX0FDQ0VQVCkKLQotI2luY2x1ZGUgPHVsb2Nrcy5oPgotCi1zdGF0aWMgdXNwdHJfdCAqdXMgPSBOVUxMOwotc3RhdGljIHVsb2NrX3QgdXNsb2NrID0gTlVMTDsKLQotI2RlZmluZSBhY2NlcHRfbXV0ZXhfY2hpbGRfaW5pdCgpCi0jZGVmaW5lIGFjY2VwdF9tdXRleF9jbGVhbnVwKCkKLQotdm9pZCBhY2NlcHRfbXV0ZXhfaW5pdCh2b2lkKQotewotICAgIHB0cmRpZmZfdCBvbGQ7Ci0gICAgLyogZGVmYXVsdCBpcyA4ICovCi0jZGVmaW5lIENPTkZfSU5JVFVTRVJTX01BWCAxNQotICAgIGlmICgob2xkID0gdXNjb25maWcoQ09ORl9JTklUVVNFUlMsIENPTkZfSU5JVFVTRVJTX01BWCkpID09IC0xKSB7Ci0gICAgICAgIHBlcnJvcigidXNjb25maWciKTsKLSAgICAgICAgZXhpdCgtMSk7Ci0gICAgfQotICAgIGlmICgob2xkID0gdXNjb25maWcoQ09ORl9MT0NLVFlQRSwgVVNfTk9ERUJVRykpID09IC0xKSB7Ci0gICAgICAgIHBlcnJvcigidXNjb25maWciKTsKLSAgICAgICAgZXhpdCgtMSk7Ci0gICAgfQotICAgIGlmICgob2xkID0gdXNjb25maWcoQ09ORl9BUkVOQVRZUEUsIFVTX1NIQVJFRE9OTFkpKSA9PSAtMSkgewotICAgICAgICBwZXJyb3IoInVzY29uZmlnIik7Ci0gICAgICAgIGV4aXQoLTEpOwotICAgIH0KLSAgICBpZiAoKHVzID0gdXNpbml0KCIvZGV2L3plcm8iKSkgPT0gTlVMTCkgewotICAgICAgICBwZXJyb3IoInVzaW5pdCIpOwotICAgICAgICBleGl0KC0xKTsKLSAgICB9Ci0gICAgaWYgKCh1c2xvY2sgPSB1c25ld2xvY2sodXMpKSA9PSBOVUxMKSB7Ci0gICAgICAgIHBlcnJvcigidXNuZXdsb2NrIik7Ci0gICAgICAgIGV4aXQoLTEpOwotICAgIH0KLX0KLXZvaWQgYWNjZXB0X211dGV4X29uKCkKLXsKLSAgICBzd2l0Y2godXNzZXRsb2NrKHVzbG9jaykpIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgLyogZ290IGxvY2sgKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRpZG4ndCBnZXQgbG9ja1xuIik7Ci0gICAgICAgICAgICBleGl0KC0xKTsKLSAgICAgICAgY2FzZSAtMToKLSAgICAgICAgICAgIHBlcnJvcigidXNzZXRsb2NrIik7Ci0gICAgICAgICAgICBleGl0KC0xKTsKLSAgICB9Ci19Ci12b2lkIGFjY2VwdF9tdXRleF9vZmYoKQotewotICAgIGlmICh1c3Vuc2V0bG9jayh1c2xvY2spID09IC0xKSB7Ci0gICAgICAgIHBlcnJvcigidXN1bnNldGxvY2siKTsKLSAgICAgICAgZXhpdCgtMSk7Ci0gICAgfQotfQotI2VuZGlmCi0KLQotI2lmbmRlZiBVU0VfU0hNR0VUX1NDT1JFQk9BUkQKLXN0YXRpYyB2b2lkICpnZXRfc2hhcmVkX21lbShzaXplX3Qgc2l6ZSkKLXsKLSAgICB2b2lkICpyZXN1bHQ7Ci0KLSAgICAvKiBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5IGZvciB0aGUgc2hhcmVkX2NvdW50ZXIgKi8KLSAgICByZXN1bHQgPSAodW5zaWduZWQgbG9uZyAqKW1tYXAgKChjYWRkcl90KTAsIHNpemUsCi0JCSAgICBQUk9UX1JFQUR8UFJPVF9XUklURSwgTUFQX0FOT058TUFQX1NIQVJFRCwgLTEsIDApOwotICAgIGlmIChyZXN1bHQgPT0gKHZvaWQgKikoY2FkZHJfdCktMSkgewotCXBlcnJvciAoIm1tYXAiKTsKLQlleGl0ICgxKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLSNlbHNlCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL2lwYy5oPgotI2luY2x1ZGUgPHN5cy9zaG0uaD4KLQotc3RhdGljIHZvaWQgKmdldF9zaGFyZWRfbWVtKHNpemVfdCBzaXplKQotewotICAgIGtleV90IHNobWtleSA9IElQQ19QUklWQVRFOwotICAgIGludCBzaG1pZCA9IC0xOwotICAgIHZvaWQgKnJlc3VsdDsKLSNpZmRlZiBNT1ZFQlJFQUsKLSAgICBjaGFyICpvYnJrOwotI2VuZGlmCi0KLSAgICBpZiAoKHNobWlkID0gc2htZ2V0KHNobWtleSwgc2l6ZSwgSVBDX0NSRUFUIHwgU0hNX1IgfCBTSE1fVykpID09IC0xKSB7Ci0JcGVycm9yKCJzaG1nZXQiKTsKLQlleGl0KDEpOwotICAgIH0KLQotI2lmZGVmIE1PVkVCUkVBSwotICAgIC8qCi0gICAgICogU29tZSBTeXNWIHN5c3RlbXMgcGxhY2UgdGhlIHNoYXJlZCBzZWdtZW50IFdBWSB0b28gY2xvc2UKLSAgICAgKiB0byB0aGUgZHluYW1pYyBtZW1vcnkgYnJlYWsgcG9pbnQgKHNicmsoMCkpLiBUaGlzIHNldmVyZWx5Ci0gICAgICogbGltaXRzIHRoZSB1c2Ugb2YgbWFsbG9jL3NicmsgaW4gdGhlIHByb2dyYW0gc2luY2Ugc2JyayB3aWxsCi0gICAgICogcmVmdXNlIHRvIG1vdmUgcGFzdCB0aGF0IHBvaW50LgotICAgICAqCi0gICAgICogVG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSBtb3ZlIHRoZSBicmVhayBwb2ludCAid2F5IHVwIHRoZXJlIiwKLSAgICAgKiBhdHRhY2ggdGhlIHNlZ21lbnQgYW5kIHRoZW4gbW92ZSBicmVhayBiYWNrIGRvd24uIFVnbHkKLSAgICAgKi8KLSAgICBpZiAoKG9icmsgPSBzYnJrKE1PVkVCUkVBSykpID09IChjaGFyICopIC0xKSB7Ci0JcGVycm9yKCJzYnJrIik7Ci0gICAgfQotI2VuZGlmCi0KLSNkZWZpbmUgQkFEU0hNQVQJKCh2b2lkICopKC0xKSkKLSAgICBpZiAoKHJlc3VsdCA9IHNobWF0KHNobWlkLCAwLCAwKSkgPT0gQkFEU0hNQVQpIHsKLQlwZXJyb3IoInNobWF0Iik7Ci0gICAgfQotICAgIC8qCi0gICAgICogV2UgbXVzdCBhdm9pZCBsZWF2aW5nIHNlZ21lbnRzIGluIHRoZSBrZXJuZWwncwotICAgICAqIChzbWFsbCkgdGFibGVzLgotICAgICAqLwotICAgIGlmIChzaG1jdGwoc2htaWQsIElQQ19STUlELCBOVUxMKSAhPSAwKSB7Ci0JcGVycm9yKCJzaG1jdGwoSVBDX1JNSUQpIik7Ci0gICAgfQotICAgIGlmIChyZXN1bHQgPT0gQkFEU0hNQVQpCS8qIG5vdyBiYWlsb3V0ICovCi0JZXhpdCgxKTsKLQotI2lmZGVmIE1PVkVCUkVBSwotICAgIGlmIChvYnJrID09IChjaGFyICopIC0xKQotCXJldHVybjsJCQkvKiBub3RoaW5nIGVsc2UgdG8gZG8gKi8KLSAgICBpZiAoc2JyaygtKE1PVkVCUkVBSykpID09IChjaGFyICopIC0xKSB7Ci0JcGVycm9yKCJzYnJrIDIiKTsKLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gcmVzdWx0OwotfQotI2VuZGlmCi0KLSNpZmRlZiBfUE9TSVhfUFJJT1JJVFlfU0NIRURVTElORwotLyogZG9uJ3QgYXNrICovCi0jZGVmaW5lIF9QIF9fUAotI2luY2x1ZGUgPHNjaGVkLmg+Ci0jZGVmaW5lIFlJRUxECXNjaGVkX3lpZWxkKCkKLSNlbHNlCi0jZGVmaW5lIFlJRUxECWRvIHsgc3RydWN0IHRpbWV2YWwgemVybzsgemVyby50dl9zZWMgPSB6ZXJvLnR2X3VzZWMgPSAwOyBzZWxlY3QoMCwwLDAsMCwmemVybyk7IH0gd2hpbGUoMCkKLSNlbmRpZgotCi12b2lkIG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBpbnQgbnVtX2l0ZXI7Ci0gICAgaW50IG51bV9jaGlsZDsKLSAgICBpbnQgaTsKLSAgICBzdHJ1Y3QgdGltZXZhbCBmaXJzdDsKLSAgICBzdHJ1Y3QgdGltZXZhbCBsYXN0OwotICAgIGxvbmcgbXM7Ci0gICAgaW50IHBpZDsKLSAgICB1bnNpZ25lZCBsb25nICpzaGFyZWRfY291bnRlcjsKLQotICAgIGlmIChhcmdjICE9IDMpIHsKLQlmcHJpbnRmIChzdGRlcnIsICJVc2FnZTogdGltZS1zZW0gbnVtLWNoaWxkIG51bSBpdGVyXG4iKTsKLQlleGl0ICgxKTsKLSAgICB9Ci0KLSAgICBudW1fY2hpbGQgPSBhdG9pIChhcmd2WzFdKTsKLSAgICBudW1faXRlciA9IGF0b2kgKGFyZ3ZbMl0pOwotCi0gICAgLyogYWxsb2NhdGUgc2hhcmVkIG1lbW9yeSBmb3IgdGhlIHNoYXJlZF9jb3VudGVyICovCi0gICAgc2hhcmVkX2NvdW50ZXIgPSBnZXRfc2hhcmVkX21lbShzaXplb2YoKnNoYXJlZF9jb3VudGVyKSk7Ci0KLSAgICAvKiBpbml0aWFsaXplIGNvdW50ZXIgdG8gMCAqLwotICAgICpzaGFyZWRfY291bnRlciA9IDA7Ci0KLSAgICBhY2NlcHRfbXV0ZXhfaW5pdCAoKTsKLQotICAgIC8qIHBhcmVudCBncmFicyBtdXRleCB1bnRpbCBkb25lIHNwYXduaW5nIGNoaWxkcmVuICovCi0gICAgYWNjZXB0X211dGV4X29uICgpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bV9jaGlsZDsgKytpKSB7Ci0JcGlkID0gZm9yaygpOwotCWlmIChwaWQgPT0gMCkgewotCSAgICAvKiBjaGlsZCwgZG8gb3VyIHRoaW5nICovCi0JICAgIGFjY2VwdF9tdXRleF9jaGlsZF9pbml0KCk7Ci0JICAgIGZvciAoaSA9IDA7IGkgPCBudW1faXRlcjsgKytpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JCWFjY2VwdF9tdXRleF9vbiAoKTsKLQkJdG1wID0gKnNoYXJlZF9jb3VudGVyOwotCQlZSUVMRDsKLQkJKnNoYXJlZF9jb3VudGVyID0gdG1wICsgMTsKLQkJYWNjZXB0X211dGV4X29mZiAoKTsKLQkgICAgfQotCSAgICBleGl0ICgwKTsKLQl9IGVsc2UgaWYgKHBpZCA9PSAtMSkgewotCSAgICBwZXJyb3IgKCJmb3JrIik7Ci0JICAgIGV4aXQgKDEpOwotCX0KLSAgICB9Ci0KLSAgICAvKiBhIHF1aWNrIHRlc3QgdG8gc2VlIHRoYXQgbm90aGluZyBpcyBzY3Jld2VkIHVwICovCi0gICAgaWYgKCpzaGFyZWRfY291bnRlciAhPSAwKSB7Ci0JcHV0cyAoIldURiEgc2hhcmVkX2NvdW50ZXIgIT0gMCBiZWZvcmUgdGhlIGNoaWxkcmVuIGhhdmUgYmVlbiBzdGFydGVkISIpOwotCWV4aXQgKDEpOwotICAgIH0KLQotICAgIGdldHRpbWVvZmRheSAoJmZpcnN0LCBOVUxMKTsKLSAgICAvKiBsYXVuY2ggY2hpbGRyZW4gaW50byBhY3Rpb24gKi8KLSAgICBhY2NlcHRfbXV0ZXhfb2ZmICgpOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY2hpbGQ7ICsraSkgewotCWlmICh3YWl0KE5VTEwpID09IC0xKSB7Ci0JICAgIHBlcnJvciAoIndhaXQiKTsKLQl9Ci0gICAgfQotICAgIGdldHRpbWVvZmRheSAoJmxhc3QsIE5VTEwpOwotCi0gICAgaWYgKCpzaGFyZWRfY291bnRlciAhPSBudW1fY2hpbGQgKiBudW1faXRlcikgewotCXByaW50ZiAoIldURiEgc2hhcmVkX2NvdW50ZXIgIT0gbnVtX2NoaWxkICogbnVtX2l0ZXIhXG4iCi0JCSJzaGFyZWRfY291bnRlciA9ICVsdVxubnVtX2NoaWxkID0gJWRcbm51bV9pdGVyPSVkXG4iLAotCQkqc2hhcmVkX2NvdW50ZXIsCi0JCW51bV9jaGlsZCwgbnVtX2l0ZXIpOwotICAgIH0KLQotICAgIGxhc3QudHZfc2VjIC09IGZpcnN0LnR2X3NlYzsKLSAgICBtcyA9IGxhc3QudHZfdXNlYyAtIGZpcnN0LnR2X3VzZWM7Ci0gICAgaWYgKG1zIDwgMCkgewotCS0tbGFzdC50dl9zZWM7Ci0JbXMgKz0gMTAwMDAwMDsKLSAgICB9Ci0gICAgbGFzdC50dl91c2VjID0gbXM7Ci0gICAgcHJpbnRmICgiJThsdS4lMDZsdVxuIiwgbGFzdC50dl9zZWMsIGxhc3QudHZfdXNlYyk7Ci0KLSAgICBhY2NlcHRfbXV0ZXhfY2xlYW51cCgpOwotCi0gICAgZXhpdCgwKTsKLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdC96Yi5jIGIvdGVzdC96Yi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTY2NjZlLi4wMDAwMDAwCi0tLSBhL3Rlc3QvemIuYworKysgL2Rldi9udWxsCkBAIC0xLDU2NyArMCwwIEBACi0KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBaZXVzQmVuY2ggVjEuMDEKLQkJCSAgICA9PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9ncmFtIGlzIENvcHlyaWdodCAoQykgWmV1cyBUZWNobm9sb2d5IExpbWl0ZWQgMTk5Ni4KLQotVGhpcyBwcm9ncmFtIG1heSBiZSB1c2VkIGFuZCBjb3BpZWQgZnJlZWx5IHByb3ZpZGluZyB0aGlzIGNvcHlyaWdodCBub3RpY2UKLWlzIG5vdCByZW1vdmVkLgotCi1UaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcyIgYW5kIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FyYW50aWVzLCAKLWluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAotZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuICBJbiBubyBldmVudCBzaGFsbCAKLVpldXMgVGVjaG5vbG9neSBMdGQuIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIAotZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZWQgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCAKLXByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZCBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7Ci1vciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkIGFuZCBvbiB0aGVvcnkgb2YgbGlhYmlsaXR5LiAgV2hldGhlcgotaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHkgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSAKLWFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlCi1wb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KLQotICAgICBXcml0dGVuIGJ5IEFkYW0gVHdpc3MgKGFkYW1AemV1cy5jby51aykuICBNYXJjaCAxOTk2Ci0KLVRoYW5rcyB0byB0aGUgZm9sbG93aW5nIHBlb3BsZSBmb3IgdGhlaXIgaW5wdXQ6Ci0gIE1pa2UgQmVsc2hlIChtYmVsc2hlQG5ldHNjYXBlLmNvbSkgCi0gIE1pY2hhZWwgQ2FtcGFuZWxsYSAoY2FtcGFuZWxsYUBzdGV2bXMuZW5ldC5kZWMuY29tKQotCi0qLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBOb3RlcyBvbiBjb21waWxpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoaXMgc2hvdWxkIGNvbXBpbGUgdW5tb2RpZmllZCB1c2luZyBnY2Mgb24gSFAtVVgsIEZyZWVCU0QsIExpbnV4LAotSVJJWCwgU29sYXJpcywgQUlYIGFuZCBEaWdpdGFsIFVuaXggKE9TRikuICBPbiBTb2xhcmlzIDIueCB5b3Ugd2lsbAotbmVlZCB0byBjb21waWxlIHdpdGggIi1sbnNsIC1sc29ja2V0IiBvcHRpb25zLiAgSWYgeW91IGhhdmUgYW55Ci1kaWZmaWN1bHRpZXMgY29tcGlsaW5nIHRoZW4gbGV0IG1lIGtub3cuCi0KLU9uIFN1bk9TIDQueC54IHlvdSBtYXkgbmVlZCB0byBjb21waWxlIHdpdGggLURTVU5PUzQgdG8gYWRkIHRoZSBmb2xsb3dpbmcgCi10d28gbGluZXMgb2YgY29kZSB3aGljaCBhcHBlYXIgbm90IHRvIGV4aXN0IGluIG15IFN1bk9TIGhlYWRlcnMgKi8KLQotI2lmZGVmIFNVTk9TNAotZXh0ZXJuIGNoYXIgKm9wdGFyZzsgCi1leHRlcm4gaW50IG9wdGluZCwgb3B0ZXJyLCBvcHRvcHQ7ICAgCi0jZW5kaWYKLQotLyogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIGFmZmVjdHMgaW5jbHVkZSBmaWxlcyBvbiBTb2xhcmlzICovCi0jZGVmaW5lIEJTRF9DT01QCi0KLSNpbmNsdWRlIDxzeXMvdGltZS5oPiAKLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxuZXRkYi5oPiAKLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tIERFRklOSVRJT05TIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIG1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIG9uIGEgdGltZSBsaW1pdGVkIHRlc3QgKi8KLSNkZWZpbmUgTUFYX1JFUVVFU1RTIDUwMDAwIAotCi0vKiBnb29kIG9sZCBzdGF0ZSBtYWNoaW5lICovCi0jZGVmaW5lIFNUQVRFX1VOQ09OTkVDVEVEIDAKLSNkZWZpbmUgU1RBVEVfQ09OTkVDVElORyAgMQotI2RlZmluZSBTVEFURV9SRUFEICAgICAgICAyCi0KLSNkZWZpbmUgQ0JVRkZTSVpFICAgICAgIDUxMgotCi1zdHJ1Y3QgY29ubmVjdGlvbiAKLXsKLSAgaW50IGZkOwotICBpbnQgc3RhdGU7Ci0gIGludCByZWFkOyAgICAgICAvKiBhbW91bnQgb2YgYnl0ZXMgcmVhZCAqLwotICBpbnQgYnJlYWQ7ICAgICAgLyogYW1vdW50IG9mIGJvZHkgcmVhZCAqLwotICBpbnQgbGVuZ3RoOyAgICAgLyogQ29udGVudC1MZW5ndGggdmFsdWUgdXNlZCBmb3Iga2VlcC1hbGl2ZSAqLwotICBjaGFyIGNidWZmW0NCVUZGU0laRV07ICAvKiBhIGJ1ZmZlciB0byBzdG9yZSBzZXJ2ZXIgcmVzcG9uc2UgaGVhZGVyICovCi0gIGludCBjYng7ICAgICAgICAgICAgICAgIC8qIG9mZnNldCBpbiBjYnVmZmVyICovCi0gIGludCBrZWVwYWxpdmU7ICAgICAgICAgIC8qIG5vbi16ZXJvIGlmIGEga2VlcC1hbGl2ZSByZXF1ZXN0ICovCi0gIGludCBnb3RoZWFkZXI7ICAgICAgICAgIC8qIG5vbi16ZXJvIGlmIHdlIGhhdmUgdGhlIGVudGlyZSBoZWFkZXIgaW4gY2J1ZmYgKi8KLSAgc3RydWN0IHRpbWV2YWwgc3RhcnQsIGNvbm5lY3QsIGRvbmU7IAotfTsKLQotc3RydWN0IGRhdGEgCi17Ci0gIGludCByZWFkOyAgICAgIC8qIG51bWJlciBvZiBieXRlcyByZWFkICovCi0gIGludCBjdGltZTsgICAgIC8qIHRpbWUgaW4gbXMgdG8gY29ubmVjdCAqLwotICBpbnQgdGltZTsgICAgICAvKiB0aW1lIGluIG1zIGZvciBjb25uZWN0aW9uICovCi19OwotCi0jZGVmaW5lIG1pbihhLGIpICgoYSk8KGIpKT8oYSk6KGIpCi0jZGVmaW5lIG1heChhLGIpICgoYSk+KGIpKT8oYSk6KGIpCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHTE9CQUxTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotaW50IHJlcXVlc3RzID0gMTsgICAgICAvKiBOdW1iZXIgb2YgcmVxdWVzdHMgdG8gbWFrZSAqLwotaW50IGNvbmN1cnJlbmN5ID0gMTsgICAvKiBOdW1iZXIgb2YgbXVsdGlwbGUgcmVxdWVzdHMgdG8gbWFrZSAqLwotaW50IHRsaW1pdCA9IDA7ICAgICAgICAvKiB0aW1lIGxpbWl0IGluIGNzICovCi1pbnQga2VlcGFsaXZlID0gMDsgICAgIC8qIHRyeSBhbmQgZG8ga2VlcGFsaXZlIGNvbm5lY3Rpb25zICovCi1jaGFyICptYWNoaW5lOyAgICAgICAgIC8qIE1hY2hpbmUgbmFtZSAqLwotY2hhciAqZmlsZTsgICAgICAgICAgICAvKiBmaWxlIG5hbWUgdG8gdXNlICovCi1jaGFyIHNlcnZlcl9uYW1lWzgwXTsgIC8qIG5hbWUgdGhhdCBzZXJ2ZXIgcmVwb3J0cyAqLwotaW50IHBvcnQgPSA4MDsgICAgICAgICAvKiBwb3J0IHRvIHVzZSAqLwotCi1pbnQgZG9jbGVuID0gMDsgICAgICAgIC8qIHRoZSBsZW5ndGggdGhlIGRvY3VtZW50IHNob3VsZCBiZSAqLwotaW50IHRvdGFscmVhZCA9IDA7ICAgICAvKiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZCAqLwotaW50IHRvdGFsYnJlYWQgPSAwOyAgICAvKiB0b3RvYWwgYW1vdW50IG9mIGVudGl0eSBib2R5IHJlYWQgKi8KLWludCBkb25lPTA7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIHJlcXVlc3RzIHdlIGhhdmUgZG9uZSAqLwotaW50IGRvbmVrYT0wOyAgICAgICAgICAvKiBudW1iZXIgb2Yga2VlcCBhbGl2ZSBjb25uZWN0aW9ucyBkb25lICovCi1pbnQgZ29vZD0wLCBiYWQ9MDsgICAgIC8qIG51bWJlciBvZiBnb29kIGFuZCBiYWQgcmVxdWVzdHMgKi8KLQotLyogc3RvcmUgZXJyb3IgY2FzZXMgKi8KLWludCBlcnJfbGVuZ3RoID0gMCwgZXJyX2Nvbm4gPSAwLCBlcnJfZXhjZXB0ID0gMDsKLQotc3RydWN0IHRpbWV2YWwgc3RhcnQsIGVuZHRpbWU7Ci0KLS8qIGdsb2JhbCByZXF1ZXN0IChhbmQgaXRzIGxlbmd0aCkgKi8KLWNoYXIgcmVxdWVzdFs1MTJdOwotaW50IHJlcWxlbjsKLQotLyogb25lIGdsb2JhbCB0aHJvdy1hd2F5IGJ1ZmZlciB0byByZWFkIHN0dWZmIGludG8gKi8KLWNoYXIgYnVmZmVyWzQwOTZdOwotCi1zdHJ1Y3QgY29ubmVjdGlvbiAqY29uOyAgICAgIC8qIGNvbm5lY3Rpb24gYXJyYXkgKi8KLXN0cnVjdCBkYXRhICpzdGF0czsgICAgICAgICAgLyogZGF0ZSBmb3IgZWFjaCByZXF1ZXN0ICovCi0KLWZkX3NldCByZWFkYml0cywgd3JpdGViaXRzOyAgLyogYml0cyBmb3Igc2VsZWN0ICovCi1zdHJ1Y3Qgc29ja2FkZHJfaW4gc2VydmVyOyAgIC8qIHNlcnZlciBhZGRyIHN0cnVjdHVyZSAqLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogc2ltcGxlIGxpdHRsZSBmdW5jdGlvbiB0byBwZXJyb3IgYW5kIGV4aXQgKi8KLQotc3RhdGljIHZvaWQgZXJyKGNoYXIgKnMpIAotewotICBwZXJyb3Iocyk7Ci0gIGV4aXQoZXJybm8pOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogd3JpdGUgb3V0IHJlcXVlc3QgdG8gYSBjb25uZWN0aW9uIC0gYXNzdW1lcyB3ZSBjYW4gd3JpdGUgCi0gICAoc21hbGwpIHJlcXVlc3Qgb3V0IGluIG9uZSBnbyBpbnRvIG91ciBuZXcgc29ja2V0IGJ1ZmZlciAgKi8KLQotdm9pZCB3cml0ZV9yZXF1ZXN0KHN0cnVjdCBjb25uZWN0aW9uICpjKQotewotICBnZXR0aW1lb2ZkYXkoJmMtPmNvbm5lY3QsMCk7Ci0gIHdyaXRlKGMtPmZkLHJlcXVlc3QsIHJlcWxlbik7ICAKLSAgYy0+c3RhdGUgPSBTVEFURV9SRUFEOwotICBGRF9TRVQoYy0+ZmQsICZyZWFkYml0cyk7Ci0gIEZEX0NMUihjLT5mZCwgJndyaXRlYml0cyk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBtYWtlIGFuIGZkIG5vbiBibG9ja2luZyAqLwotCi12b2lkIG5vbmJsb2NrKGludCBmZCkgCi17Ci0gIGludCBpPTE7Ci0gIGlvY3RsKGZkLCBGSU9OQklPLCAmaSk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiByZXR1cm5zIHRoZSB0aW1lIGluIG1zIGJldHdlZW4gdHdvIHRpbWV2YWxzICovCi0KLWludCB0aW1lZGlmKHN0cnVjdCB0aW1ldmFsIGEsIHN0cnVjdCB0aW1ldmFsIGIpCi17Ci0gIHJlZ2lzdGVyIGludCB1cyxzOwotCi0gIHVzID0gYS50dl91c2VjIC0gYi50dl91c2VjOwotICB1cyAvPSAxMDAwOwotICBzID0gYS50dl9zZWMgLSBiLnR2X3NlYzsKLSAgcyAqPSAxMDAwOwotICByZXR1cm4gcyt1czsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIGNhbGN1bGF0ZSBhbmQgb3V0cHV0IHJlc3VsdHMgYW5kIGV4aXQgKi8KLQotdm9pZCBvdXRwdXRfcmVzdWx0cygpCi17Ci0gIGludCB0aW1ldGFrZW47Ci0gIAotICBnZXR0aW1lb2ZkYXkoJmVuZHRpbWUsMCk7Ci0gIHRpbWV0YWtlbiA9IHRpbWVkaWYoZW5kdGltZSwgc3RhcnQpOwotICAKLSAgcHJpbnRmKCJcbi0tLVxuIik7Ci0gIHByaW50ZigiU2VydmVyOiAgICAgICAgICAgICAgICAgJXNcbiIsIHNlcnZlcl9uYW1lKTsKLSAgcHJpbnRmKCJEb2N1bWVudCBMZW5ndGg6ICAgICAgICAlZFxuIiwgZG9jbGVuKTsgIAotICBwcmludGYoIkNvbmN1cmVuY3kgTGV2ZWw6ICAgICAgICVkXG4iLCBjb25jdXJyZW5jeSk7Ci0gIHByaW50ZigiVGltZSB0YWtlbiBmb3IgdGVzdHM6ICAgJWQuJTAzZCBzZWNvbmRzXG4iLCAKLQkgdGltZXRha2VuLzEwMDAsIHRpbWV0YWtlbiUxMDAwKTsKLSAgcHJpbnRmKCJDb21wbGV0ZSByZXF1ZXN0czogICAgICAlZFxuIiwgZG9uZSk7Ci0gIHByaW50ZigiRmFpbGVkIHJlcXVlc3RzOiAgICAgICAgJWRcbiIsIGJhZCk7Ci0gIGlmKGJhZCkgcHJpbnRmKCIgICAoQ29ubmVjdDogJWQsIExlbmd0aDogJWQsIEV4Y2VwdGlvbnM6ICVkKVxuIiwKLQkJIGVycl9jb25uLCBlcnJfbGVuZ3RoLCBlcnJfZXhjZXB0KTsKLSAgaWYoa2VlcGFsaXZlKSBwcmludGYoIktlZXAtQWxpdmUgcmVxdWVzdHM6ICAgICVkXG4iLCBkb25la2EpOwotICBwcmludGYoIkJ5dGVzIHRyYW5zZmVyZWQ6ICAgICAgICVkXG4iLCB0b3RhbHJlYWQpOwotICBwcmludGYoIkhUTUwgdHJhbnNmZXJlZDogICAgICAgICVkXG4iLCB0b3RhbGJyZWFkKTsKLSAgCi0gIC8qIGF2b2lkIGRpdmlkZSBieSB6ZXJvICovCi0gIGlmKHRpbWV0YWtlbikgewotICAgIHByaW50ZigiUmVxdWVzdHMgcGVyIHNlY29uZHM6ICAgJS4yZlxuIiwgMTAwMCooZmxvYXQpKGRvbmUpL3RpbWV0YWtlbik7Ci0gICAgcHJpbnRmKCJUcmFuc2ZlciByYXRlOiAgICAgICAgICAlLjJmIGtiL3NcbiIsIAotCSAgIChmbG9hdCkodG90YWxyZWFkKS90aW1ldGFrZW4pOwotICB9Ci0KLSAgewotICAgIC8qIHdvcmsgb3V0IGNvbm5lY3Rpb24gdGltZXMgKi8KLSAgICBpbnQgaTsKLSAgICBpbnQgdG90YWxjb249MCwgdG90YWw9MDsKLSAgICBpbnQgbWluY29uPTk5OTk5OTksIG1pbnRvdD05OTk5OTk7Ci0gICAgaW50IG1heGNvbj0wLCBtYXh0b3Q9MDsKLQotICAgIGZvcihpPTA7IGk8cmVxdWVzdHM7IGkrKykgewotICAgICAgc3RydWN0IGRhdGEgcyA9IHN0YXRzW2ldOwotICAgICAgbWluY29uID0gbWluKG1pbmNvbiwgcy5jdGltZSk7Ci0gICAgICBtaW50b3QgPSBtaW4obWludG90LCBzLnRpbWUpOwotICAgICAgbWF4Y29uID0gbWF4KG1heGNvbiwgcy5jdGltZSk7Ci0gICAgICBtYXh0b3QgPSBtYXgobWF4dG90LCBzLnRpbWUpOwotICAgICAgdG90YWxjb24gKz0gcy5jdGltZTsKLSAgICAgIHRvdGFsICs9IHMudGltZTsKLSAgICB9Ci0gICAgcHJpbnRmKCJcbkNvbm5uZWN0aW9uIFRpbWVzIChtcylcbiIpOwotICAgIHByaW50ZigiICAgICAgICAgICBtaW4gICBhdmcgICBtYXhcbiIpOwotICAgIHByaW50ZigiQ29ubmVjdDogJTVkICU1ZCAlNWRcbiIsbWluY29uLCB0b3RhbGNvbi9yZXF1ZXN0cywgbWF4Y29uICk7Ci0gICAgcHJpbnRmKCJUb3RhbDogICAlNWQgJTVkICU1ZFxuIiwgbWludG90LCB0b3RhbC9yZXF1ZXN0cywgbWF4dG90KTsKLSAgICBwcmludGYoIi0tLVxuXG4iKTsKLSAgfQotCi0gIGV4aXQoMCk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBzdGFydCBhc25jaHJvbm91cyBub24tYmxvY2tpbmcgY29ubmVjdGlvbiAqLwotCi12b2lkIHN0YXJ0X2Nvbm5lY3Qoc3RydWN0IGNvbm5lY3Rpb24gKmMpCi17Ci0gIGMtPnJlYWQgPSAwOwotICBjLT5icmVhZCA9IDA7Ci0gIGMtPmtlZXBhbGl2ZSA9IDA7Ci0gIGMtPmNieCA9IDA7IAotICBjLT5nb3RoZWFkZXIgPSAwOwotCi0gIGMtPmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKLSAgaWYoYy0+ZmQ8MCkgZXJyKCJzb2NrZXQiKTsKLQotICBub25ibG9jayhjLT5mZCk7Ci0gIGdldHRpbWVvZmRheSgmYy0+c3RhcnQsMCk7Ci0KLSAgaWYoY29ubmVjdChjLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2VydmVyLCBzaXplb2Yoc2VydmVyKSk8MCkgewotICAgIGlmKGVycm5vPT1FSU5QUk9HUkVTUykgewotICAgICAgYy0+c3RhdGUgPSBTVEFURV9DT05ORUNUSU5HOwotICAgICAgRkRfU0VUKGMtPmZkLCAmd3JpdGViaXRzKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBjbG9zZShjLT5mZCk7Ci0gICAgICBlcnJfY29ubisrOwotICAgICAgaWYoYmFkKys+MTApIHsKLQlwcmludGYoIlxuVGVzdCBhYm9ydGVkIGFmdGVyIDEwIGZhaWx1cmVzXG5cbiIpOwotCWV4aXQoMSk7Ci0gICAgICB9IAotICAgICAgc3RhcnRfY29ubmVjdChjKTsKLSAgICB9ICAgICAgCi0gIH0KLSAgCi0gIC8qIGNvbm5lY3RlZCBmaXJzdCB0aW1lICovCi0gIHdyaXRlX3JlcXVlc3QoYyk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBjbG9zZSBkb3duIGNvbm5lY3Rpb24gYW5kIHNhdmUgc3RhdHMgKi8KLQotdm9pZCBjbG9zZV9jb25uZWN0aW9uKHN0cnVjdCBjb25uZWN0aW9uICpjKQotewotICBpZihjLT5yZWFkID09IDAgJiYgYy0+a2VlcGFsaXZlKSB7Ci0gICAgLyogc2VydmVyIGhhcyBsZWdpdGlhbWF0ZWx5IHNodXQgZG93biBhbiBpZGxlIGtlZXAgYWxpdmUgcmVxdWVzdCAqLwotICAgIGdvb2QtLTsgIC8qIGNvbm5lY3Rpb24gbmV2ZXIgaGFwcGVuZCAqLwotICB9IAotICBlbHNlIHsKLSAgICBpZihnb29kPT0xKSB7Ci0gICAgICAvKiBmaXJzdCB0aW1lIGhlcmUgKi8KLSAgICAgIGRvY2xlbiA9IGMtPmJyZWFkOwotICAgIH0gZWxzZSBpZiAoYy0+YnJlYWQhPWRvY2xlbikgeyAKLSAgICAgIGJhZCsrOyAKLSAgICAgIGVycl9sZW5ndGgrKzsgCi0gICAgfQotICAgIAotICAgIC8qIHNhdmUgb3V0IHRpbWUgKi8KLSAgICBpZihkb25lIDwgcmVxdWVzdHMpIHsKLSAgICAgIHN0cnVjdCBkYXRhIHM7Ci0gICAgICBnZXR0aW1lb2ZkYXkoJmMtPmRvbmUsMCk7Ci0gICAgICBzLnJlYWQgPSBjLT5yZWFkOwotICAgICAgcy5jdGltZSA9IHRpbWVkaWYoYy0+Y29ubmVjdCwgYy0+c3RhcnQpOwotICAgICAgcy50aW1lID0gdGltZWRpZihjLT5kb25lLCBjLT5zdGFydCk7Ci0gICAgICBzdGF0c1tkb25lKytdID0gczsKLSAgICB9Ci0gIH0KLQotICBjbG9zZShjLT5mZCk7Ci0gIEZEX0NMUihjLT5mZCwgJnJlYWRiaXRzKTsKLSAgRkRfQ0xSKGMtPmZkLCAmd3JpdGViaXRzKTsKLQotICAvKiBjb25uZWN0IGFnYWluICovCi0gIHN0YXJ0X2Nvbm5lY3QoYyk7IAotICByZXR1cm47Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiByZWFkIGRhdGEgZnJvbSBjb25uZWN0aW9uICovCi0KLXZvaWQgcmVhZF9jb25uZWN0aW9uKHN0cnVjdCBjb25uZWN0aW9uICpjKQotewotICBpbnQgcjsKLSAgCi0gIHI9cmVhZChjLT5mZCxidWZmZXIsc2l6ZW9mKGJ1ZmZlcikpOwotICBpZihyPT0wIHx8IChyPDAgJiYgZXJybm8hPUVBR0FJTikpIHsKLSAgICBnb29kKys7Ci0gICAgY2xvc2VfY29ubmVjdGlvbihjKTsKLSAgICByZXR1cm47Ci0gIH0gCi0gIAotICBpZihyPDAgJiYgZXJybm89PUVBR0FJTikgcmV0dXJuOwotCi0gIGMtPnJlYWQgKz0gcjsKLSAgdG90YWxyZWFkICs9IHI7Ci0gIAotICBpZighYy0+Z290aGVhZGVyKSB7Ci0gICAgY2hhciAqczsKLSAgICBpbnQgbD00OwotICAgIGludCBzcGFjZSA9IENCVUZGU0laRSAtIGMtPmNieCAtIDE7IC8qIC0xIHRvIGFsbG93IGZvciAwIHRlcm1pbmF0b3IgKi8KLSAgICBpbnQgdG9jb3B5ID0gKHNwYWNlPHIpP3NwYWNlOnI7Ci0gICAgbWVtY3B5KGMtPmNidWZmK2MtPmNieCwgYnVmZmVyLCBzcGFjZSk7Ci0gICAgYy0+Y2J4ICs9IHRvY29weTsgc3BhY2UgLT0gdG9jb3B5OwotICAgIGMtPmNidWZmW2MtPmNieF0gPSAwOyAvKiB0ZXJtaW5hdGUgZm9yIGJlbmVmaXQgb2Ygc3Ryc3RyICovCi0gICAgcyA9IHN0cnN0cihjLT5jYnVmZiwgIlxyXG5cclxuIik7Ci0gICAgLyogdGhpcyBuZXh0IGxpbmUgaXMgc28gdGhhdCB3ZSB0YWxrIHRvIE5DU0EgMS41IHdoaWNoIGJsYXRhbnRseSBicmVha3MgCi0gICAgICAgdGhlIGh0dHAgc3BlY2lmYWN0aW9uICovCi0gICAgaWYoIXMpIHsgcyA9IHN0cnN0cihjLT5jYnVmZiwiXG5cbiIpOyBsPTI7IH0KLQotICAgIGlmKCFzKSB7Ci0gICAgICAgLyogcmVhZCByZXN0IG5leHQgdGltZSAqLwotICAgICAgaWYoc3BhY2UpIAotCXJldHVybjsKLSAgICAgIGVsc2UgewotCS8qIGhlYWRlciBpcyBpbiBpbnZhbGlkIG9yIHRvbyBiaWcgLSBjbG9zZSBjb25uZWN0aW9uICovCi0JY2xvc2UoYy0+ZmQpOwotCWlmKGJhZCsrPjEwKSB7Ci0JICBwcmludGYoIlxuVGVzdCBhYm9ydGVkIGFmdGVyIDEwIGZhaWx1cmVzXG5cbiIpOwotCSAgZXhpdCgxKTsKLQl9IAotCUZEX0NMUihjLT5mZCwgJndyaXRlYml0cyk7Ci0Jc3RhcnRfY29ubmVjdChjKTsKLSAgICAgIH0JCi0gICAgfQotICAgIGVsc2UgewotICAgICAgLyogaGF2ZSBmdWxsIGhlYWRlciAqLwotICAgICAgaWYoIWdvb2QpIHsKLQkvKiB0aGlzIGlzIGZpcnN0IHRpbWUsIGV4dHJhY3Qgc29tZSBpbnRlcmVzdGluZyBpbmZvICovCi0JY2hhciAqcCwgKnE7Ci0JcCA9IHN0cnN0cihjLT5jYnVmZiwgIlNlcnZlcjoiKTsKLQlxID0gc2VydmVyX25hbWU7Ci0JaWYocCkgeyBwKz04OyB3aGlsZSgqcD4zMikgKnErKyA9ICpwKys7IH0KLQkqcSA9IDA7Ci0gICAgICB9Ci0JCi0gICAgICBjLT5nb3RoZWFkZXIgPSAxOwotICAgICAgKnMgPSAwOyAvKiB0ZXJtaW5hdGUgYXQgZW5kIG9mIGhlYWRlciAqLwotICAgICAgaWYoa2VlcGFsaXZlICYmIAotCSAoc3Ryc3RyKGMtPmNidWZmLCAiS2VlcC1BbGl2ZSIpIAotCSAgfHwgc3Ryc3RyKGMtPmNidWZmLCAia2VlcC1hbGl2ZSIpKSkgIC8qIGZvciBiZW5lZml0IG9mIE1TSUlTICovCi0JewotCWNoYXIgKmNsOwotCWNsID0gc3Ryc3RyKGMtPmNidWZmLCAiQ29udGVudC1MZW5ndGg6Iik7Ci0JLyogZm9yIGNhY2t5IHNlcnZlcnMgbGlrZSBOQ1NBIHdoaWNoIGJyZWFrIHRoZSBzcGVjIGFuZCBzZW5kIGEgCi0JICAgbG93ZXIgY2FzZSAnbCcgKi8KLQlpZighY2wpIGNsID0gc3Ryc3RyKGMtPmNidWZmLCAiQ29udGVudC1sZW5ndGg6Iik7Ci0JaWYoY2wpIHsKLQkgIGMtPmtlZXBhbGl2ZT0xOwotCSAgYy0+bGVuZ3RoID0gYXRvaShjbCsxNik7Ci0JfQotICAgICAgfQotICAgICAgYy0+YnJlYWQgKz0gYy0+Y2J4IC0gKHMrbC1jLT5jYnVmZikgKyByLXRvY29weTsKLSAgICAgIHRvdGFsYnJlYWQgKz0gYy0+YnJlYWQ7Ci0gICAgfQotICB9ICAKLSAgZWxzZSB7Ci0gICAgLyogb3V0c2lkZSBoZWFkZXIsIGV2ZXJ5dGhpbmcgd2UgaGF2ZSByZWFkIGlzIGVudGl0eSBib2R5ICovCi0gICAgYy0+YnJlYWQgKz0gcjsKLSAgICB0b3RhbGJyZWFkICs9IHI7Ci0gIH0KLQotICBpZihjLT5rZWVwYWxpdmUgJiYgKGMtPmJyZWFkID49IGMtPmxlbmd0aCkpIHsKLSAgICAvKiBmaW5pc2hlZCBhIGtlZXAtYWxpdmUgY29ubmVjdGlvbiAqLwotICAgIGdvb2QrKzsgZG9uZWthKys7Ci0gICAgLyogc2F2ZSBvdXQgdGltZSAqLwotICAgIGlmKGdvb2Q9PTEpIHsKLSAgICAgIC8qIGZpcnN0IHRpbWUgaGVyZSAqLwotICAgICAgZG9jbGVuID0gYy0+YnJlYWQ7Ci0gICAgfSBlbHNlIGlmKGMtPmJyZWFkIT1kb2NsZW4pIHsgYmFkKys7IGVycl9sZW5ndGgrKzsgfQotICAgIGlmKGRvbmUgPCByZXF1ZXN0cykgewotICAgICAgc3RydWN0IGRhdGEgczsKLSAgICAgIGdldHRpbWVvZmRheSgmYy0+ZG9uZSwwKTsKLSAgICAgIHMucmVhZCA9IGMtPnJlYWQ7Ci0gICAgICBzLmN0aW1lID0gdGltZWRpZihjLT5jb25uZWN0LCBjLT5zdGFydCk7Ci0gICAgICBzLnRpbWUgPSB0aW1lZGlmKGMtPmRvbmUsIGMtPnN0YXJ0KTsKLSAgICAgIHN0YXRzW2RvbmUrK10gPSBzOwotICAgIH0KLSAgICBjLT5rZWVwYWxpdmUgPSAwOyBjLT5sZW5ndGggPSAwOyBjLT5nb3RoZWFkZXI9MDsgYy0+Y2J4ID0gMDsKLSAgICBjLT5yZWFkID0gYy0+YnJlYWQgPSAwOwotICAgIHdyaXRlX3JlcXVlc3QoYyk7Ci0gICAgYy0+c3RhcnQgPSBjLT5jb25uZWN0OyAvKiB6ZXJvIGNvbm5lY3QgdGltZSB3aXRoIGtlZXAtYWxpdmUgKi8KLSAgfQotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogcnVuIHRoZSB0ZXN0cyAqLwotCi1pbnQgdGVzdCgpIAotewotICBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0LCBub3c7Ci0gIGZkX3NldCBzZWxfcmVhZCwgc2VsX2V4Y2VwdCwgc2VsX3dyaXRlOwotICBpbnQgaTsKLSAgCi0gIHsKLSAgICAvKiBnZXQgc2VydmVyIGluZm9ybWF0aW9uICovCi0gICAgc3RydWN0IGhvc3RlbnQgKmhlOwotICAgIGhlID0gZ2V0aG9zdGJ5bmFtZShtYWNoaW5lKTsKLSAgICBpZiAoIWhlKSBlcnIoImdldGhvc3RieW5hbWUiKTsKLSAgICBzZXJ2ZXIuc2luX2ZhbWlseSAgICAgID0gaGUtPmhfYWRkcnR5cGU7Ci0gICAgc2VydmVyLnNpbl9wb3J0ICAgICAgICA9IGh0b25zKHBvcnQpOwotICAgIHNlcnZlci5zaW5fYWRkci5zX2FkZHIgPSAoKHVuc2lnbmVkIGxvbmcgKikoaGUtPmhfYWRkcl9saXN0WzBdKSlbMF07Ci0gIH0KLQotICBjb24gPSBtYWxsb2MoY29uY3VycmVuY3kqc2l6ZW9mKHN0cnVjdCBjb25uZWN0aW9uKSk7Ci0gIG1lbXNldChjb24sMCxjb25jdXJyZW5jeSpzaXplb2Yoc3RydWN0IGNvbm5lY3Rpb24pKTsKLSAgCi0gIHN0YXRzID0gbWFsbG9jKHJlcXVlc3RzICogc2l6ZW9mKHN0cnVjdCBkYXRhKSk7Ci0KLSAgRkRfWkVSTygmcmVhZGJpdHMpOwotICBGRF9aRVJPKCZ3cml0ZWJpdHMpOwotCi0gIC8qIHNldHVwIHJlcXVlc3QgKi8KLSAgc3ByaW50ZihyZXF1ZXN0LCJHRVQgJXMgSFRUUC8xLjBcclxuVXNlci1BZ2VudDogWmV1c0JlbmNoLzEuMFxyXG4iCi0JICAiJXNIb3N0OiAlc1xyXG5BY2NlcHQ6ICovKlxyXG5cclxuIiwgZmlsZSwgCi0JICBrZWVwYWxpdmU/IkNvbm5lY3Rpb246IEtlZXAtQWxpdmVcclxuIjoiIiwgbWFjaGluZSApOwotICAgIAotICByZXFsZW4gPSBzdHJsZW4ocmVxdWVzdCk7Ci0KLSAgLyogb2sgLSBsZXRzIHN0YXJ0ICovCi0gIGdldHRpbWVvZmRheSgmc3RhcnQsMCk7Ci0KLSAgLyogaW5pdGlhbGlzZSBsb3RzIG9mIHJlcXVlc3RzICovCi0gIGZvcihpPTA7IGk8Y29uY3VycmVuY3k7IGkrKykgc3RhcnRfY29ubmVjdCgmY29uW2ldKTsKLQotICB3aGlsZShkb25lPHJlcXVlc3RzKSB7Ci0gICAgaW50IG47Ci0gICAgLyogc2V0dXAgYml0IGFycmF5cyAqLwotICAgIG1lbWNweSgmc2VsX2V4Y2VwdCwgJnJlYWRiaXRzLCBzaXplb2YocmVhZGJpdHMpKTsKLSAgICBtZW1jcHkoJnNlbF9yZWFkLCAmcmVhZGJpdHMsIHNpemVvZihyZWFkYml0cykpOwotICAgIG1lbWNweSgmc2VsX3dyaXRlLCAmd3JpdGViaXRzLCBzaXplb2YocmVhZGJpdHMpKTsKLQotICAgIC8qIGNoZWNrIGZvciB0aW1lIGxpbWl0IGV4cGlyeSAqLwotICAgIGdldHRpbWVvZmRheSgmbm93LDApOwotICAgIGlmKHRsaW1pdCAmJiB0aW1lZGlmKG5vdyxzdGFydCkgPiAodGxpbWl0KjEwMDApKSB7Ci0gICAgICByZXF1ZXN0cz1kb25lOyAgIC8qIHNvIHN0YXRzIGFyZSBjb3JyZWN0ICovCi0gICAgICBvdXRwdXRfcmVzdWx0cygpOwotICAgIH0KLQotICAgIC8qIFRpbWVvdXQgb2YgMzAgc2Vjb25kcy4gKi8KLSAgICB0aW1lb3V0LnR2X3NlYz0zMDsgdGltZW91dC50dl91c2VjPTA7Ci0gICAgbj1zZWxlY3QoMjU2LCAmc2VsX3JlYWQsICZzZWxfd3JpdGUsICZzZWxfZXhjZXB0LCAmdGltZW91dCk7Ci0gICAgaWYoIW4pIHsKLSAgICAgIHByaW50ZigiXG5TZXJ2ZXIgdGltZWQgb3V0XG5cbiIpOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgaWYobjwxKSBlcnIoInNlbGVjdCIpOwotCi0gICAgZm9yKGk9MDsgaTxjb25jdXJyZW5jeTsgaSsrKSB7Ci0gICAgICBpbnQgcyA9IGNvbltpXS5mZDsKLSAgICAgIGlmKEZEX0lTU0VUKHMsICZzZWxfZXhjZXB0KSkgewotCWJhZCsrOyAKLQllcnJfZXhjZXB0Kys7Ci0Jc3RhcnRfY29ubmVjdCgmY29uW2ldKTsKLQljb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmKEZEX0lTU0VUKHMsICZzZWxfcmVhZCkpIHJlYWRfY29ubmVjdGlvbigmY29uW2ldKTsKLSAgICAgIGlmKEZEX0lTU0VUKHMsICZzZWxfd3JpdGUpKSB3cml0ZV9yZXF1ZXN0KCZjb25baV0pOwotICAgIH0KLSAgICBpZihkb25lPj1yZXF1ZXN0cykgb3V0cHV0X3Jlc3VsdHMoKTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0vKiBkaXNwbGF5IHVzYWdlIGluZm9ybWF0aW9uICovCi0KLXZvaWQgdXNhZ2UoY2hhciAqcHJvZ25hbWUpIHsKLSAgcHJpbnRmKCJcblpldXNCZW5jaCB2MS4wXG5cbiIpOwotICBwcmludGYoIlVzYWdlOiAlcyA8bWFjaGluZT4gPGZpbGU+IFsta10gWy1uIHJlcXVlc3RzIHwgLXQgdGltZWxpbWl0IChzZWMpXSIKLQkgIlxuXHRcdFstYyBjb25jdXJyZW5jeV0gWy1wIHBvcnRdIFxuIixwcm9nbmFtZSk7Ci0gIHByaW50ZigiRmlsZW5hbWUgc2hvdWxkIHN0YXJ0IHdpdGggYSAnLycgZS5nLiAvaW5kZXguaHRtbFxuXG4iKTsKLSAgZXhpdChFSU5WQUwpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIHNvcnQgb3V0IGNvbW1hbmQtbGluZSBhcmdzIGFuZCBjYWxsIHRlc3QgKi8KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7Ci0gIGludCBjOwotICBpZiAoYXJnYyA8IDMpIHVzYWdlKGFyZ3ZbMF0pOwotICAKLSAgbWFjaGluZSA9IGFyZ3ZbMV07IAotICBmaWxlID0gYXJndlsyXTsKLSAgb3B0aW5kID0gMzsKLSAgd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsYXJndiwicDpuOmM6ZDp0OmQ6ayIpKT4wKSB7Ci0gICAgc3dpdGNoKGMpIHsKLSAgICBjYXNlICdkJzoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ24nOiAKLSAgICAgIHJlcXVlc3RzID0gYXRvaShvcHRhcmcpOwotICAgICAgaWYoIXJlcXVlc3RzKSB7Ci0JcHJpbnRmKCJJbnZhbGlkIG51bWJlciBvZiByZXF1ZXN0c1xuIik7Ci0JZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2snOgotICAgICAga2VlcGFsaXZlPTE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdjJzoKLSAgICAgIGNvbmN1cnJlbmN5ID0gYXRvaShvcHRhcmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncCc6Ci0gICAgICBwb3J0ID0gYXRvaShvcHRhcmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAndCc6Ci0gICAgICB0bGltaXQgPSBhdG9pKG9wdGFyZyk7Ci0gICAgICByZXF1ZXN0cyA9IE1BWF9SRVFVRVNUUzsgIC8qIG5lZWQgdG8gc2l6ZSBkYXRhIGFycmF5IG9uIHNvbWV0aGluZyAqLwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHVzYWdlKGFyZ3ZbMF0pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9ICAgCi0gIHRlc3QoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotCi0KLQotCg==